commit 13523543ee6159000fa57ba80a674b95097efc53 Author: IQ.Lvbs CI [bot] Date: Tue Sep 1 20:15:16 2026 -0500 IQ.Pilot Prebuilt Release @ 67fd9c2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..195fb726b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,53 @@ +* text=auto eol=lf + +# to move existing files into LFS: +# git add --renormalize . +iqpilot/selfdrive/assets/icons/iq/rotate-ccw.svg -filter -diff -merge -text +iqpilot/selfdrive/assets/icons/iq/rotate-ccw.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons/iq/rotate-cw.svg -filter -diff -merge -text +iqpilot/selfdrive/assets/icons/iq/rotate-cw.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons/iq/square-parking.svg -filter -diff -merge -text +iqpilot/selfdrive/assets/icons/iq/square-parking.png -filter -diff -merge -text + +# Keep this icon in regular git (not LFS) for lightweight branding iteration. +iqpilot/selfdrive/assets/icons_mici/experimental_mode_mici.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/experimental_mode_tizi.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/iqdynamic_mode_mici.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/iqdynamic_mode_tizi.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/iqstandard_mode_mici.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/iqstandard_mode_tizi.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_center.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_cone.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/konn3kt_icon.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/buttons/toggle_dot_enabled.png -filter -diff -merge -text +iqpilot/selfdrive/assets -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/buttons/toggle_pill_enabled.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/offroad_alerts/green_wheel.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/setup/green_button.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/setup/green_button_pressed.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/setup/green_dm.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/setup/green_info.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_green_rounded_rectangle.png -filter -diff -merge -text +iqpilot/selfdrive/assets/images/spinner_comma.png -filter -diff -merge -text +iqpilot/selfdrive/assets/images/k3_spinner.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons/camera.png -filter -diff -merge -text +iqpilot/selfdrive/assets/fonts/Syncopate-Regular.ttf -filter -diff -merge -text +iqpilot/selfdrive/assets/fonts/Tektur-Variable.ttf -filter -diff -merge -text +iqpilot/tools/jotpluggler/assets/bootstrap-icons.ttf -filter -diff -merge -text + +# mici UI icons stored as plain PNG — gitlab LFS server lacks these objects +iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_pressed.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red_pressed.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/models.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/brightness.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/camera.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/keyboard/enter.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/keyboard/enter_disabled.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/sd_card.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/software.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/trips.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/settings/vehicle.png -filter -diff -merge -text +iqpilot/selfdrive/assets/icons_mici/speedometer.png -filter -diff -merge -text + +iqpilot/selfdrive/assets/icons/iq/*.png -filter -diff -merge -text +artifacts/runtime_wheels/*.whl -filter -diff -merge -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..64090c18d --- /dev/null +++ b/.gitignore @@ -0,0 +1,194 @@ +venv/ +.venv/ +!artifacts/runtime/ble/rootfs/usr/local/venv/ +!artifacts/runtime/ble/rootfs/usr/local/venv/** +# Runtime install dir for proprietary bundles — rewritten by ensure_private_installed +# on every service start. Tracking anything under it keeps the working tree +# perpetually dirty and sends the updater into an apply/restart loop that kills +# ble-transportd (and comma.service) every few minutes. +/.iqpilot/ +/.iqpilot-package-lock-sha256 +/gi +/k3_log.txt +/iqpilot/system/loggerd/encoder/v4l_decode +.ci_cache +.env +.clang-format +http-client.private.env.json +.DS_Store +.tags +.ipynb_checkpoints +.idea +.overlay_init +.overlay_consistent +.sconsign.dblite +a.out +.hypothesis +.cache/ + +/iqdbc +/msgq +/openpilot +/tinygrad + +/docs_site/ + +*.mp4 +*.dylib +*.DSYM +*.d +!artifacts/runtime/ble/rootfs/etc/udev/rules.d/ +!artifacts/runtime/ble/rootfs/etc/udev/rules.d/** +*.pyc +!artifacts/iqpilot_*_private/**/*.pyc +*.pyo +.*.swp +.*.swo +.*.un~ +*.tmp +*.o +*.o-* +*.os +*.os-* +*.so +!artifacts/iqpilot_*_private/**/*.so +!artifacts/runtime/ble/rootfs/usr/local/venv/**/*.so +artifacts/iqpilot_private/ +artifacts/iqpilot_*_private/python/iqpilot_private/**/*.cpython-*-darwin.so +artifacts/test-results/ +*.a +*.clb +*.class +*.pyxbldc +*.vcd +*.mo +*_pyx.cpp +*.stats +config.json +clcache +compile_commands.json +compare_runtime*.html + +iqpilot/selfdrive/pandad/pandad +iqpilot/cereal/services.h +iqpilot/cereal/gen +iqpilot/cereal/messaging/bridge +iqpilot/selfdrive/ui/translations/tmp +iqpilot/selfdrive/car/tests/cars_dump +iqpilot/system/camerad/camerad +iqpilot/system/camerad/test/ae_gray_test + +.coverage* +coverage.xml +htmlcov +pandaextra + +.mypy_cache/ +flycheck_* + +cppcheck_report.txt +comma*.sh + +iqpilot/selfdrive/modeld/models/*.pkl +!iqpilot/selfdrive/modeld/models/driving_vision_tinygrad.pkl +!iqpilot/selfdrive/modeld/models/driving_policy_tinygrad.pkl +!iqpilot/selfdrive/modeld/models/dmonitoring_model_tinygrad.pkl +!iqpilot/selfdrive/modeld/models/driving_vision_metadata.pkl +!iqpilot/selfdrive/modeld/models/driving_policy_metadata.pkl +!iqpilot/selfdrive/modeld/models/dmonitoring_model_metadata.pkl +iqpilot/modeld*/thneed/compile +iqpilot/modeld*/models/*.thneed +iqpilot/modeld*/models/*.pkl + +# openpilot log files +*.bz2 +*.zst + +build/ + +!**/.gitkeep + +poetry.toml +Pipfile + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +.claude/ +PLAN.md +TASK.md + +/.antigravitycli/ +/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/_iqcrypto.cpython-312-aarch64-linux-gnu.so +/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc_handshake.cpython-312-aarch64-linux-gnu.so +/artifacts/iqpilot_alc_bundle.json +/iqpilot/selfdrive/iqlocd/iqlocd +/iqpilot/selfdrive/iqlocd/models/generated/car.cpp +/iqpilot/selfdrive/iqlocd/models/generated/car.h +/iqpilot/tools/scripts/debug/ +/iqpilot/tools/scripts/plans/ +!scripts/iqpilot/iqos_usrlocal_larch64.tar.zst + +# pretty-build capture logs (model compile / mpc + dbc codegen stdout+stderr) +*_tinygrad.pkl.log +*_metadata.pkl.log +iqpilot/selfdrive/controls/lib/*_mpc_lib/gen.log +iqpilot/tools/cabana/dbc/*.json.log +iqpilot/selfdrive/iqlocd/models/generated/ +osmaps_build/ + +# --- local scratch/debug + large model artifacts (never commit) --- +/infinite_driver/ +/konn3kt_private/ +/.mull/ +/_pq*.py +/bus_topo.py +/cluster_bus.py +/real_cluster_bus.py +/dbg_big.py +/decode_*.py +/dtc_decoder.py +/eps_decode.py +/extract_nm_*.py +/ffff_map.py +/kmatrix_*.py +/mcd_*.py +/shot_*.py +/verify_crc.py +/CODEX_HANDOFF_*.md +/SUNNYPILOT_REMEDIATION_PLAN.md +/prompt.md +/iqos44_bluetooth_gamepad_spec.md +iqpilot/selfdrive/ui/tests/test_ui/nav_demo_report/ +**/__pycache__/ +*.pyc +*.mlpackage/ + + +# fetcher: closed-source precompiled component — ship only the obfuscated .so +/iqpilot/models_private_src/fetcher.py + +# build output: a signed .app is a 233-file sealed bundle, never track a subset +iqpilot/tools/iqmacd/macos/dist/IQ eMac.app/ +iqpilot/tools/iqmacd/macos/dist/.stage/ +iqpilot/tools/iqmacd/macos/dist/.DS_Store + +iqpilot/tools/iqmacd/macos/dist/ + +iqpilot/tools/scripts/iqemac/clips/README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..688ca902f --- /dev/null +++ b/LICENSE @@ -0,0 +1,107 @@ +IQ.Lvbs License v1.8.2 + +Copyright (c) 2026 IQ.Lvbs LLC, a part of Project Teal Lvbs Inc. All Rights Reserved. + +DEFINITIONS + +"Software" refers to IQ.Pilot, konn3kt, and all associated source code, +documentation, and assets owned by the Copyright Holder. + +"Open Components" refers to portions of the Software explicitly marked as +open source. + +"Proprietary Components" refers to all portions of the Software not made +available to the public in source form. + +"Copyright Holder" refers to IQ.Lvbs LLC, a part of Project Teal Lvbs Inc. + +GRANT OF LICENSE + +Subject to the terms of this license, you are granted a limited, +non-exclusive, revocable license to: + +1. View, study, and learn from the Open Components +2. Modify the Open Components for personal, internal, or open-source public use +3. Run the Software for personal, non-commercial purposes + +RESTRICTIONS + +You may NOT: + +1. Claim ownership of any part of the Software, excluding your own + modifications that do not incorporate Proprietary Components. + +2. Reverse engineer, decompile, disassemble, or in any way attempt to + circumvent the obfuscation of the Proprietary Components. + +3. Use the Software or any derivative for commercial purposes without + explicit written permission from the Copyright Holder. + +4. Remove or alter any copyright notices or this license. + +5. Sublicense, sell, or transfer rights to the Software. + +6. Use the Software and/or its source code to compete with or create a + substantially similar product. + +7. Use the Software in closed source software not licensed by IQ.Lvbs LLC. + +CONSEQUENCES OF VIOLATION + +In the event any Restriction is violated, any product created using inspiration from, or source code from, IQ.Pilot or Konn3kt shall be subject to a licensing fee determined solely by the Copyright Holder. Additionally, the violating party hereby grants IQ.Lvbs LLC an exclusive, irrevocable, worldwide, royalty-free license to use any and all assets from the infringing product on IQ.Lvbs webpages, advertising materials, and in any other manner IQ.Lvbs sees fit. + +OWNERSHIP + +All rights, title, and interest in the Software remain exclusively with the +Copyright Holder. Any modifications, improvements, or derivative works you +create based on the Software are owned by the Copyright Holder. By +contributing modifications, you irrevocably assign all rights to the +Copyright Holder. + +PROPRIETARY COMPONENTS + +The Proprietary Components are provided in binary or obfuscated form only. +Reverse engineering, decompilation, or disassembly of Proprietary Components +is strictly prohibited. Violation of this provision entitles IQ.Lvbs LLC to +pursue all available legal remedies to protect its intellectual property and +trade secrets. + +NO WARRANTY + +THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT +HOLDER DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT. + +LIMITATION OF LIABILITY + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR +OTHER LIABILITY ARISING FROM THE USE OF THE SOFTWARE. THE USER ACCEPTS FULL +RESPONSIBILITY FOR ANY AND ALL LIABILITIES WHEN USING IQ.LVBS SOFTWARE. + +TERMINATION + +This license terminates automatically if you violate any of its terms. Upon +termination, you must destroy all copies of the Software in your possession. + +The Copyright Holder reserves the right to revoke this license at any time +for any reason. + +GOVERNING LAW + +This license shall be governed by the laws of the State of Illinois, United +States of America. Any disputes arising under this license shall be subject +to the exclusive jurisdiction of the courts located in Henry County, Illinois. + +--- + +For commercial licensing inquiries, contact: support@iqlvbs.com + +IQ.Pilot is a fork of Stock OpenPilot maintained by Comma.ai, Inc. licensed under the following notice: +Copyright (c) 2018, Comma.ai, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 000000000..ef2a66a86 --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +# IQ.Pilot: + + + +## Join Our Public Beta at: https://discord.iqlvbs.com + +## Running IQ.Pilot +* A modern comma, or clone device to run this software (Comma 3, 3x, 4, Konik A1/M, Mr.One C3, C3 Lite) +* One of [the supported cars](https://gitlvb.teallvbs.xyz/IQ.Lvbs/IQ.Pilot/src/branch/release/artifacts/package_sources/iqdbc/docs/CARS.md). +* A [car harness](https://comma.ai/shop/products/car-harness) to connect to your car +#### Wondering if IQ.Pilot supports your car? IQ.Pilot supports every car [stock openpilot](https://gitlvb.teallvbs.xyz/IQ.Lvbs/IQ.Pilot/src/branch/release/artifacts/package_sources/iqdbc/docs/CARS.md) supports! +## Installation +#### Installing Via Installer URL: +#### Enter the following into your device custom URL box to install IQ.Pilot: +`installer.iqlvbs.com/release` +#### Having Trouble? If your device is currently running AGNOS 13.1 or older, you should install latest stock openpilot, then install IQ.Pilot, or try one of the alternative methods listed below! + + +## Alternative Methods of Installation: +#### Enabling SSH: +* In your device's settings, go into "Developer Settings" +* Enable the "Enable SSH" toggle if it is not already on. +* Next to "SSH Keys", click on "Add" and then enter your GitHub username. +* Run the command below (replace your_email@example.com with your GitHub account email, then paste the output [here](https://github.com/settings/keys) after clicking on "New SSH Key", then reboot your comma device. +#### SSH Key Command: `ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519 -N "" && cat ~/.ssh/id_ed25519.pub` +#### Note: If you have already setup SSH and can SSH into your device, skip this section. + +#### Installing Via SSH: +#### Once you are connected to your device via SSH, you can paste the following command below to install IQ.Pilot: +`cd .. && rm -rf openpilot && git clone https://git.konn3kt.com/IQ.Lvbs/IQ.Pilot openpilot -b release && cd openpilot && sudo reboot` +#### If you'd like to backup your previous installation as well, paste the following command below to install IQ.Pilot: +`cd .. && mv openpilot openpilot_backup_X && git clone https://git.konn3kt.com/IQ.Lvbs/IQ.Pilot -b release && cd openpilot && sudo reboot` +#### Alternatively, you can use your existing fork's built in tools to switch your branch as well: +`git remote add iqpilot https://git.konn3kt.com/IQ.Lvbs/IQ.Pilot && iq switch iqpilot release` + +--- + +## Releases + +| Branch | Status | Description | +|---|---|---------------------------------------------------------------------------------------------------------------------------------------------------| +| `beta` | Pre-release | Preview of the next release in progress. Expect bugs. Use it if you want early access, just know things can break. | +| `release` | **Stable 1.0c** | Current stable production release of IQ.Pilot. | +| `release-meb` | **Stable 1.0c** | Up to date with `release`, built specifically for VW MEB and MQBevo platform vehicles (ID.4, ID.3, ID.5, Golf MK8, Tiguan/Atlas 2024+, and more). | + +--- +#### Side Note: Beta's are releases of IQ.Pilot that are released publically for beta testing by the IQ.Pilot team, expect bugs, and unstable behavior, for stability please use release. + +## 📊 User Data +### IQ.Pilot uploads your data to Konn3kt, by IQ.Lvbs. +#### Konn3kt is the most secure, encrypted, feature rich management platform for your IQ.Pilot device. Konn3kt has dual end-to-end encryption, your data is encrypted in transit, and at rest, you, and only you have access to your device, and your data. + +#### IQ.Pilot allows users to disable uploading entirely if they wish. +#### Konn3kt encrypts your logs, and video data with dual end-to-end encryption, ensuring that your data is accessible to you, and only you, not even accessible to IQ.Lvbs. + +## Terms of Service / Privacy Policy / Licensing +#### IQ.Pilot is subject to the License found in this repository, [Terms of Service](https://konn3kt.com/tos), and, [Privacy Policy](https://konn3kt.com/privacy). + + +## Support IQ.Pilot? +Sorry, I have better things to do than ask my users for donations. - Teal + +- IQ.Lvbs, by Project Teal Lvbs diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..2dd09dbbb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,52 @@ +# Security Policy + +## Supported Versions + +| Component | Version | Supported | +| --------- | ------- | --------- | +| IQ.Pilot | latest | TRUE | +| konn3kt | latest | TRUE | + +## Scope + +This security policy covers the following components, but applies to all IQ.Lvbs software: + +- **IQ.Pilot** +- **konn3kt** + +## Reporting a Vulnerability + +If you discover a security vulnerability in IQ.Pilot or konn3kt, please report it responsibly, abuse is against the terms of service for IQ.Lvbs software. + +**Email:** security@iqlvbs.com + +Please include: + +- A description of the vulnerability and its impact, and potential impact +- Steps to reproduce the issue +- Affected component(s) +- Any relevant logs, screenshots, or proof of concept code that can assist with reproduction. + +## Response Timeline + +- **Acknowledgment:** Within 168 hours of receipt +- **Initial Assessment:** Within 1-14 days +- **Resolution Target:** Depends on severity; critical issues are prioritized immediately + +## Responsible Disclosure + +We ask that you: + +- Allow reasonable time for us to investigate and address the issue. +- Avoid accessing or modifying other users' data, this is against IQ.Lvbs policy, and illegal in many jurisdictions. +- Do not exploit vulnerabilities beyond what is necessary to demonstrate the issue. + +## Out of Scope + +- Issues in third-party dependencies unless the vulnerability is triggered by our specific usage + +## Recognition + +We appreciate and recognize security researchers who help keep IQ.Lvbs software safe. With your permission, we will credit you in our release notes when a reported vulnerability is fixed. + +- IQ.Lvbs, a part of Project Teal Lvbs Inc ÂŠī¸ diff --git a/artifacts/__init__.py b/artifacts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_alc_private/.source_sha b/artifacts/iqpilot_alc_private/.source_sha new file mode 100644 index 000000000..b3535496a --- /dev/null +++ b/artifacts/iqpilot_alc_private/.source_sha @@ -0,0 +1 @@ +076c1d057f97b067222d74180fbb63ba5467254a diff --git a/artifacts/iqpilot_alc_private/manifest.json b/artifacts/iqpilot_alc_private/manifest.json new file mode 100644 index 000000000..c1f1617d3 --- /dev/null +++ b/artifacts/iqpilot_alc_private/manifest.json @@ -0,0 +1,48 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570", + "size": 3 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/iqlvbs/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "268267fdfb6ae438f1b3c6f5f2c378a5b878e68357d5560f604f77d5c36a2cea", + "size": 402144 + }, + "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "b3d33e86493408e5a02f2df753e1b257f003e5028480b5b040aa5a07eeed98be", + "size": 69712 + }, + "runtime": { + "entries": { + "iqpilot_private.konn3kt.iqlvbs.alc": { + "path": "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.iqlvbs.vehicle_state": { + "path": "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so": "v0mM7HrM8Ssbm3E/TxIUefAh5aCkzbZIKDQk5yFN6kr4EgqmVyPMNkqu7kCsn4ah0fTzr7xCrhs/gXjGf+6yBQ==", + "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so": "5KQhJ61bt8tNmKuegPVMnMiqEHKcnjhqMtCDv2CphlSS54L/GmsOZjieHQEcgpOIDw7n/7qz2k6iFnwJ6clLCg==" + } +} diff --git a/artifacts/iqpilot_alc_private/manifest.json.sig b/artifacts/iqpilot_alc_private/manifest.json.sig new file mode 100644 index 000000000..d514c4fa7 --- /dev/null +++ b/artifacts/iqpilot_alc_private/manifest.json.sig @@ -0,0 +1 @@ +Xr+Nn9b/ZoT2/S94B/I16aHVQI5dZZE3hGvpS6elgasC7e4JZouZvln/ue3Lh5Hg/NTJCCEStRmpEtNfgcjbAA== diff --git a/artifacts/iqpilot_alc_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_alc_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/artifacts/iqpilot_alc_private/python/_iqclosure/_vendored.json @@ -0,0 +1 @@ +[] diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_alc_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/__init__.py b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/__init__.py b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..6ed51787e Binary files /dev/null and b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..bae7e9767 Binary files /dev/null and b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_commander_private/manifest.json b/artifacts/iqpilot_commander_private/manifest.json new file mode 100644 index 000000000..ed3f58d9b --- /dev/null +++ b/artifacts/iqpilot_commander_private/manifest.json @@ -0,0 +1,38 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570", + "size": 3 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/iqlvbs/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "9b48803b46906943d7cb10b7e4b4f38c880f06a5c281f254a89e2254965b025f", + "size": 68080 + }, + "runtime": { + "entries": { + "iqpilot_private.konn3kt.iqlvbs.iqlvbs_commander": { + "path": "python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so": "RwstZkEGexV6fia/R9BRk+6CQ9Q6SGJopSJf04UpMpaw5fRtoPjLOrDFOt9kU8GPmCmW40gaXhJK+rimnBYnBw==" + } +} diff --git a/artifacts/iqpilot_commander_private/manifest.json.sig b/artifacts/iqpilot_commander_private/manifest.json.sig new file mode 100644 index 000000000..1384a15a3 --- /dev/null +++ b/artifacts/iqpilot_commander_private/manifest.json.sig @@ -0,0 +1 @@ +TV78NXdEYQiabAzLIqS2lsZbp5bO0y4EPGwLRUMyKeEH2BStZiFfpNPvlqSn5HGI+RjmTq+p5rRUDMNofbZGBw== diff --git a/artifacts/iqpilot_commander_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_commander_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/artifacts/iqpilot_commander_private/python/_iqclosure/_vendored.json @@ -0,0 +1 @@ +[] diff --git a/artifacts/iqpilot_commander_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_commander_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/__init__.py b/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/__init__.py b/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..6d872d06d Binary files /dev/null and b/artifacts/iqpilot_commander_private/python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_emac_private/manifest.json b/artifacts/iqpilot_emac_private/manifest.json new file mode 100644 index 000000000..d547a738b --- /dev/null +++ b/artifacts/iqpilot_emac_private/manifest.json @@ -0,0 +1,577 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "5cae92c259782dd90e2523851ba0b5262fb4e7325f42578af7c55977e9c120b9", + "size": 3558 + }, + "python/_iqclosure/iqpilot/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/api/__init__.py": { + "mode": 420, + "sha256": "97d6e0d8cbd3e47797d734322b42d04efea4d95a2dae5a56f1baef3fd847aa0d", + "size": 939 + }, + "python/_iqclosure/iqpilot/common/api/base.py": { + "mode": 420, + "sha256": "be55c83869bad911ee0204e8779b4673653f7d29ae4f524c978a280bd84c7777", + "size": 3187 + }, + "python/_iqclosure/iqpilot/common/api/comma_connect.py": { + "mode": 420, + "sha256": "e7c2dd0b56fb8533c2cbc614e728a9ffc5ce7360524cfa62a02f5235bc23b9a8", + "size": 267 + }, + "python/_iqclosure/iqpilot/common/atlas_alerts.py": { + "mode": 420, + "sha256": "ef0d867f6213bb67ed6b7fd6ef4e694eb1705d9dc694163a80c8dd9572932954", + "size": 9448 + }, + "python/_iqclosure/iqpilot/common/basedir.py": { + "mode": 420, + "sha256": "58cfa5d6405903ee1acecc4544463bb8f47a66921b120c382143aa80d8539b28", + "size": 106 + }, + "python/_iqclosure/iqpilot/common/constants.py": { + "mode": 420, + "sha256": "fc439d59c24b95ed349b84f1a5862df3ea50e0891dbec4ea3cf5e1e0ccff6513", + "size": 434 + }, + "python/_iqclosure/iqpilot/common/file_chunker.py": { + "mode": 420, + "sha256": "0c6dfabdbf1aa737f4dc306b10d12e6dcc3a87720dbbfe23df2f40490453b06e", + "size": 1898 + }, + "python/_iqclosure/iqpilot/common/filter_simple.py": { + "mode": 420, + "sha256": "4b34753a3d3eea6d1578d88d21350045173a3809d38aed232875d1c5f34b4141", + "size": 1929 + }, + "python/_iqclosure/iqpilot/common/gpio.py": { + "mode": 420, + "sha256": "01ba8cb32a644a2df545e764ba19bf1c7a320a217f983f8bac73b45d3a6891cf", + "size": 2408 + }, + "python/_iqclosure/iqpilot/common/i2c.py": { + "mode": 420, + "sha256": "4af8f9da7504a548d15f18b91d71c1379cb7c05c84be031448764cc49920ce68", + "size": 2449 + }, + "python/_iqclosure/iqpilot/common/iq_perf.py": { + "mode": 420, + "sha256": "16b9a744fc1346d9660eab59c87c05a56015fea6bfc30317047e5f95aba2f7d2", + "size": 7218 + }, + "python/_iqclosure/iqpilot/common/issue_debug.py": { + "mode": 420, + "sha256": "73a10d846c735d4bcfda65f7828aa82192349b53920cb9d1b01cef8c211982fe", + "size": 1128 + }, + "python/_iqclosure/iqpilot/common/logging_extra.py": { + "mode": 420, + "sha256": "ce9b3b3d8498d76e1c4c0352a3e98e72759bb7f367ff8629c1329c46040595c3", + "size": 6628 + }, + "python/_iqclosure/iqpilot/common/realtime.py": { + "mode": 420, + "sha256": "f137ef62c1602a1f7c329731883dc518c62288bd25596891858d460ae3209ae2", + "size": 3966 + }, + "python/_iqclosure/iqpilot/common/spinner.py": { + "mode": 420, + "sha256": "33a2eb2aa3148492414035c5dc7150b3a69467905d7a3e58c8f65cfe70d3552c", + "size": 1371 + }, + "python/_iqclosure/iqpilot/common/steer_delay.py": { + "mode": 420, + "sha256": "933220f41a027fe73bfcf7af1d40a7b58d1a751dc9a4fe16ddccc66f2c58c549", + "size": 2541 + }, + "python/_iqclosure/iqpilot/common/swaglog.py": { + "mode": 420, + "sha256": "0a133b4ef49f80b8890f115e81273f3f3e21351ae79f92dc02abc033e6d24027", + "size": 5274 + }, + "python/_iqclosure/iqpilot/common/time_helpers.py": { + "mode": 420, + "sha256": "c14cda1f84149d5ffa63a2adec5ca24126f77c1412a78412e5e3e68a6fd12bcf", + "size": 474 + }, + "python/_iqclosure/iqpilot/common/utils.py": { + "mode": 420, + "sha256": "6475ad94bc89252398c41e9eabf7929ba5eb8fa23a08ad7545e7a67b400af9f3", + "size": 8090 + }, + "python/_iqclosure/iqpilot/konn3kt/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/konn3kt/cloud_client.py": { + "mode": 420, + "sha256": "4d58e62f8d628a8570881f2b87c82c801b46928fbb84f8dab8a81a9b55ba4e15", + "size": 493 + }, + "python/_iqclosure/iqpilot/konn3kt/registration.py": { + "mode": 420, + "sha256": "d8da8fa6373d54c3090b4466a975969317c9f5cd7c0ba20fd905e11ce9b95efd", + "size": 7948 + }, + "python/_iqclosure/iqpilot/selfdrive/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/controls/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/controls/lib/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/controls/lib/desire_helper.py": { + "mode": 420, + "sha256": "91008a050069861404b3f20977f5b8b6fdab4b3919e76e1ae95be49ce92f4ad8", + "size": 12298 + }, + "python/_iqclosure/iqpilot/selfdrive/controls/lib/drive_helpers.py": { + "mode": 420, + "sha256": "4246e7ac3a1c554e068a967472b2fe2793fb291d6468308badb25f5769fd1fb9", + "size": 3599 + }, + "python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lane_change.py": { + "mode": 420, + "sha256": "3e7557a578a971f45e704b4386f6ac386745c8d044f45dab4b9b6cdd492a7f42", + "size": 7875 + }, + "python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py": { + "mode": 420, + "sha256": "faa6f87b227c805e8890a91139e8d16d7874c4b99b330dda08080392ce3479ec", + "size": 4618 + }, + "python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lateral_edge_guard.py": { + "mode": 420, + "sha256": "6bb6bcb8e5323480bf1b992549279a7d4c17a1bd1bd260863cf7b61b887fa735", + "size": 10227 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/big_catalog.py": { + "mode": 420, + "sha256": "7ec5df43ce10b47ce925467e61100123e828b8e72bdab20bef4c8ac0ffd3cc7a", + "size": 369 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/camera.py": { + "mode": 420, + "sha256": "6d6b309a557a6f7a97e97dd0227d2ec66c215523f19c8e3fcf7256940115da5c", + "size": 2646 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py": { + "mode": 420, + "sha256": "056c744bbd9f1fe1053555d9b1fc1257d53093d69ddc94be3f05d840eb70781c", + "size": 3590 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/daemon.py": { + "mode": 420, + "sha256": "15002cb6c81cca8c7aec572568da1e202c55777bbd21fefaf8fda36fd0d39b6e", + "size": 30295 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/driving_action.py": { + "mode": 420, + "sha256": "863a9b18e82c7b2ab821541f498228ca7f5904ee38d5ac282c66dfaab7fdc492", + "size": 2381 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py": { + "mode": 420, + "sha256": "0b8f118dc45ad0c3809855800960b47c893ee121ea75d94e8569dcce46d58ce5", + "size": 7312 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py": { + "mode": 420, + "sha256": "eb3ebc7065a863d51d5bb4359d68f26fc2f1929e1d7e044377f15cf5bac7f77d", + "size": 367 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/emac_model_meta.py": { + "mode": 420, + "sha256": "e47406eabf9c96bdf393ddaba8936fbd01755b2728ebe9413b2ab24b94de5d48", + "size": 377 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/messaging.py": { + "mode": 420, + "sha256": "17d48331eeeaf746ee6982a9c65f28d740a15a4c34c37617115c104894d49c06", + "size": 11920 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/metadata.py": { + "mode": 420, + "sha256": "dd1559099407687ee2dc81e180e05b9954e712c39e1a82e39c1b00b70c43374a", + "size": 3016 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py": { + "mode": 420, + "sha256": "27aade5852507baf84ed460b9446d0de4df58a4a535b82c301113040b7ba472a", + "size": 7305 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_channel.py": { + "mode": 420, + "sha256": "2d706993df418501d93dc766ffe452131e565bfbc2e8412b527dc14915e92832", + "size": 1872 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_warp.py": { + "mode": 420, + "sha256": "075c89f8740945b84d0c554cccf4b0198d0738c85bde52e64bab69b01e482987", + "size": 3325 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py": { + "mode": 420, + "sha256": "5865243a95ca4557d2a960302124a9898545cc3a8387e88ef569308e3d0f7077", + "size": 119 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py": { + "mode": 420, + "sha256": "321e7223249dc7dba93effe8e834f225fb6067abf49da17fe9a6faeb71ba8e49", + "size": 2786 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py": { + "mode": 420, + "sha256": "23622cdec9eed5649a05422ba19eae956ba16a63850927af4a222c3d9030a1bb", + "size": 399 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py": { + "mode": 420, + "sha256": "e4f524c7595754fd9db86724a7bd9b67524c630275ac78599ab6838d1aa7d809", + "size": 11037 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/inference_state.py": { + "mode": 420, + "sha256": "bdfd1c1b538e2342b17d08aa6ebe0c041c2f721025bcd7334434d1139fe6063d", + "size": 268 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py": { + "mode": 420, + "sha256": "e0eb9d7bff1da89d52b09596f7e7109fc25c3b9b86a89674382a7dde9e0a4199", + "size": 8555 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py": { + "mode": 420, + "sha256": "b7c15991f4fe9c6b4d7fb6a2a37256c142ab40cdd53f52bd3c59accc3a3618b1", + "size": 10929 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py": { + "mode": 420, + "sha256": "25304fe7ae034d1bb8c9c86a2757704944539be6a0c69c322e75adc84f66e221", + "size": 7885 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py": { + "mode": 420, + "sha256": "b68fe2c7f0013fe6780e765882b4a1ac7074834ea6d370cbca90a51d2f614091", + "size": 1981 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py": { + "mode": 420, + "sha256": "10ae83948aba757a48a781fed90be1cce65e8853c8b67dcb7b4ec6928e312005", + "size": 14219 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py": { + "mode": 420, + "sha256": "58ffe0afb2cd9527d2a1d5bbebf0471af8c8210534e266ab80488a7f89bb06ba", + "size": 7684 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py": { + "mode": 420, + "sha256": "1fe374d5eebef362923a5d90f1218bcd6b916eb60584d4a55f840de2ef6c4cf3", + "size": 2145 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/parser.py": { + "mode": 420, + "sha256": "1dc47b2c167f1271c5c45d6ba0582cb906f4b59b0621b6a6d971da3f329d66e8", + "size": 9212 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/runtime/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py": { + "mode": 420, + "sha256": "316988acf63f98aca83c5662ffb2c6028ef1f8b94fd8d6fcc15e96d9ac0d8181", + "size": 779 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/temporal_state.py": { + "mode": 420, + "sha256": "06ab9349b786559037ce68d5882b54ffbe39f76737c4d19a213b251240023d4a", + "size": 5501 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py": { + "mode": 420, + "sha256": "d8fbc18f67ea1e330130ce0b228af298919c5304d299da07eb94d557c0827d25", + "size": 17739 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/compile_warp.py": { + "mode": 420, + "sha256": "2cc299b2cfda88ee2dbc52658f145fb7840e2dfc49a7371e22fe671beed0e57f", + "size": 5436 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/calibration_helpers.py": { + "mode": 420, + "sha256": "1501058881da2720b35915f0949c2bc311020386c2549d48111ab32a34386a6c", + "size": 982 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/calibrationd.py": { + "mode": 420, + "sha256": "6bceebb5a15895d2b6d20a28cbd14b9112f9422e0a0cf466314a7e8779da39dc", + "size": 15698 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/helpers.py": { + "mode": 420, + "sha256": "be47384b3437670192f8bfd3dc679d57f0678f9f4fe34759419b0f2eb01ab117", + "size": 6828 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/locationd.py": { + "mode": 420, + "sha256": "8a7d7c89ea11998e418a52355a3d719ef3bf4ddfd0af13da2234d08348c25fe7", + "size": 15169 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/models/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/models/constants.py": { + "mode": 420, + "sha256": "276b20ca6187466efe6273e66100d92f4f54bd2b393c77329fb196a512b707bf", + "size": 1952 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/models/pose_kf.py": { + "mode": 420, + "sha256": "98aabe0a0b1e94f0c34af459ead9488901f08722ada3a87d6a33c00241dee211", + "size": 2930 + }, + "python/_iqclosure/iqpilot/selfdrive/selfdrived/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/selfdrived/alertmanager.py": { + "mode": 420, + "sha256": "c601bac30951a750d3ebf3d30f06c597bacd148210b1c405d5d3eca79bb7c4e3", + "size": 2045 + }, + "python/_iqclosure/iqpilot/selfdrive/selfdrived/events.py": { + "mode": 420, + "sha256": "5e37693eeced1e3ba81f03234b7b0dad33b7564826d232d288998be5fae7efd6", + "size": 37038 + }, + "python/_iqclosure/iqpilot/selfdrive/state_estimation/__init__.py": { + "mode": 420, + "sha256": "85a0c22d638eb8f87b00ca2ea21aa4c0c76708fe3e2f3ccc1fa8f87f0c784450", + "size": 319 + }, + "python/_iqclosure/iqpilot/selfdrive/state_estimation/estimator.py": { + "mode": 420, + "sha256": "59ae4dd78c8f850a5acd28d2743abe1b9d19ebcaaf9c472f95b2766a73e056c6", + "size": 12577 + }, + "python/_iqclosure/iqpilot/selfdrive/ui/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/ui/feedback/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/ui/feedback/feedbackd.py": { + "mode": 420, + "sha256": "7c1e6cb2c3c2c6aae91210f6cbc5c372f33c28cc3edb292ef71439b83844615d", + "size": 2615 + }, + "python/_iqclosure/iqpilot/system/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/camerad/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/camerad/cameras/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/camerad/cameras/nv12_info.py": { + "mode": 420, + "sha256": "90b0b00df8a7baa638940c2e73cbe2e79059af0acd19812ca6d765793ce4fda0", + "size": 829 + }, + "python/_iqclosure/iqpilot/system/hardware/__init__.py": { + "mode": 420, + "sha256": "889391bffca493e74bfc108cae2976a53b644caca13ab600061fd29e9622c627", + "size": 695 + }, + "python/_iqclosure/iqpilot/system/hardware/base.py": { + "mode": 420, + "sha256": "a56293f7c23e503ff62d0d3ed39f1831b5544a65b37378165934361a5ddcd304", + "size": 4966 + }, + "python/_iqclosure/iqpilot/system/hardware/hw.py": { + "mode": 420, + "sha256": "c69185d8f6482c8b021f687b793246d2e2ede853e89a88748c64b85f60711b59", + "size": 3638 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/hardware.py": { + "mode": 420, + "sha256": "2520895597c375ae570bd04d5f189e874c89d642f3f07bdbeb20388cb6691433", + "size": 258 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py": { + "mode": 420, + "sha256": "98f46f8705259b00efae7274186b4e68201aad467a19de4f16d5f850d10ab0b5", + "size": 7585 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/hardware.py": { + "mode": 420, + "sha256": "f1ddffa9bdb5071a49fd65eb4b49958b60b1873e1ec70e6f3f2e2b2501abce2f", + "size": 25584 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py": { + "mode": 420, + "sha256": "d22858982705531732d5a20a45a73795496e5bbd9e23028c24609a7e58ac7aed", + "size": 890 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/lpa.py": { + "mode": 420, + "sha256": "2bffb84aef35892c4788e80b6d937bf2eebd15e226b72a82c4f39217667c1ca0", + "size": 53692 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/pins.py": { + "mode": 420, + "sha256": "b57ba4262e6a6a79f2db15c27356acf3e54f579a7edd13b483b2e16d140aca6d", + "size": 678 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/usb_storage.py": { + "mode": 420, + "sha256": "3352f2cf70d38e7158ef8ac20bb736dba55c73239cbdd3ab7f431dbacfb5027e", + "size": 2189 + }, + "python/_iqclosure/iqpilot/system/hardware/usb.py": { + "mode": 420, + "sha256": "8c5b26f3967100ce0e5af7043a47a852fb5e8311f00ac95e7a263934c38e4ec0", + "size": 8069 + }, + "python/_iqclosure/iqpilot/system/micd.py": { + "mode": 420, + "sha256": "1a59cbe6b72fcca5723ab56dc09f52039817299071a8d8da37f04acea58776bc", + "size": 5977 + }, + "python/_iqclosure/iqpilot/system/sentry.py": { + "mode": 420, + "sha256": "c3da338feb533937b6a5258ee450b6a3ff7a77b69cc9e48e31d16b875855caf3", + "size": 5229 + }, + "python/_iqclosure/iqpilot/system/version.py": { + "mode": 420, + "sha256": "3a6bc7520dae7944a1da6f911cd090704a463e011f39949ea6c9df51b0e8c616", + "size": 6033 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/emac/__init__.py": { + "mode": 420, + "sha256": "5865243a95ca4557d2a960302124a9898545cc3a8387e88ef569308e3d0f7077", + "size": 119 + }, + "python/iqpilot_private/emac/bulk_transport.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "f42a1bab373092b3010ca45b02d7ea7b27cd1e1e574c97f701129b2fad01f833", + "size": 333888 + }, + "python/iqpilot_private/emac/ffs_holder.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "306f0362e86558d33072f800b736fa71bfaf4ee5e4383c4e743b72b74724d2e3", + "size": 68064 + }, + "python/iqpilot_private/emac/mac_client.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "31339f53f093c3877e13eac90a6647cbca2de92f339c47e5006a85bcd2e3656c", + "size": 267960 + }, + "python/iqpilot_private/emac/mac_protocol.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "d5e855d1784a8ba66844639b871d2747ccce264c55359cf0e641ce7e3d66460d", + "size": 203512 + }, + "python/iqpilot_private/emac/maciqmodeld.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "34d4ef1746143ea714f84f3c325e2ddaecec6a19c544fed68d8fc4080578c73f", + "size": 399040 + }, + "runtime": { + "entries": { + "iqpilot_private.emac.maciqmodeld": { + "path": "python/iqpilot_private/emac/maciqmodeld.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/emac/bulk_transport.cpython-312-aarch64-linux-gnu.so": "7BtEAP11moL2lbQW5dYt1hDqJmDV1EuiEoSfJ0Tfislun2kS+/rwPiy7Ws8kjgrKLv+ZlXlWz6G5IBWk6z+aAw==", + "python/iqpilot_private/emac/ffs_holder.cpython-312-aarch64-linux-gnu.so": "Sv2riVgvm+4PDVTDLTuy1wpf15JObbP8hSAD4iiwF4RUs49GVGhulXkjzO28mLmF6tEuNDNWHRucxmuZrCKNAg==", + "python/iqpilot_private/emac/mac_client.cpython-312-aarch64-linux-gnu.so": "d4kaBPAEwe55BrQEVHWmxcVlEoQPsMVLOAYgpZVd6uiBnwWSUxl1X5nmqdKtxWSk8TFqU2xZkhfw4OOgG9JmDw==", + "python/iqpilot_private/emac/mac_protocol.cpython-312-aarch64-linux-gnu.so": "hvBkDKSMKjpxmRzhhGoRZT5WuOWLY+g3p2NIMlA7b6qYYpVaApoZNuquOerywEF1zJnwPiwpsg5QtQVe/5DfAA==", + "python/iqpilot_private/emac/maciqmodeld.cpython-312-aarch64-linux-gnu.so": "d3JAlH7P/X87II6iobeQ51melHy1vxdlXn0Nzo2DG65rcdVLM2B66YETPpwlX6Qv9NxhUlDcl/364CR+V+eyDQ==" + } +} diff --git a/artifacts/iqpilot_emac_private/manifest.json.sig b/artifacts/iqpilot_emac_private/manifest.json.sig new file mode 100644 index 000000000..aa8f71111 --- /dev/null +++ b/artifacts/iqpilot_emac_private/manifest.json.sig @@ -0,0 +1 @@ +KylnzVsK5XC3Jq1G7bBbKa5lv+oJSlfBpBsNpWMEEUgHDyOEj7+5EeeHDOgy8Lt4LEFgEeIV2WEJW0GJVpxUCQ== diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_emac_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..996cdfc5c --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/_vendored.json @@ -0,0 +1,86 @@ +[ + "iqpilot.common.api", + "iqpilot.common.api.base", + "iqpilot.common.api.comma_connect", + "iqpilot.common.atlas_alerts", + "iqpilot.common.basedir", + "iqpilot.common.constants", + "iqpilot.common.file_chunker", + "iqpilot.common.filter_simple", + "iqpilot.common.gpio", + "iqpilot.common.i2c", + "iqpilot.common.iq_perf", + "iqpilot.common.issue_debug", + "iqpilot.common.logging_extra", + "iqpilot.common.realtime", + "iqpilot.common.spinner", + "iqpilot.common.steer_delay", + "iqpilot.common.swaglog", + "iqpilot.common.time_helpers", + "iqpilot.common.utils", + "iqpilot.konn3kt.cloud_client", + "iqpilot.konn3kt.registration", + "iqpilot.selfdrive.controls.lib.desire_helper", + "iqpilot.selfdrive.controls.lib.drive_helpers", + "iqpilot.selfdrive.controls.lib.helpers.lane_change", + "iqpilot.selfdrive.controls.lib.helpers.lane_turn", + "iqpilot.selfdrive.controls.lib.helpers.lateral_edge_guard", + "iqpilot.selfdrive.iqmodeld.big_catalog", + "iqpilot.selfdrive.iqmodeld.camera", + "iqpilot.selfdrive.iqmodeld.config", + "iqpilot.selfdrive.iqmodeld.daemon", + "iqpilot.selfdrive.iqmodeld.driving_action", + "iqpilot.selfdrive.iqmodeld.egpu_helpers", + "iqpilot.selfdrive.iqmodeld.egpu_model", + "iqpilot.selfdrive.iqmodeld.emac_model_meta", + "iqpilot.selfdrive.iqmodeld.messaging", + "iqpilot.selfdrive.iqmodeld.metadata", + "iqpilot.selfdrive.iqmodeld.model_bundle_downloader", + "iqpilot.selfdrive.iqmodeld.model_channel", + "iqpilot.selfdrive.iqmodeld.model_warp", + "iqpilot.selfdrive.iqmodeld.models", + "iqpilot.selfdrive.iqmodeld.models.combined_artifact", + "iqpilot.selfdrive.iqmodeld.models.fetcher", + "iqpilot.selfdrive.iqmodeld.models.helpers", + "iqpilot.selfdrive.iqmodeld.models.inference_state", + "iqpilot.selfdrive.iqmodeld.models.runners.model_runner", + "iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.combined_split_runner", + "iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.fused_runner", + "iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.model_types", + "iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.supercombo_runner", + "iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner", + "iqpilot.selfdrive.iqmodeld.models.split_model_constants", + "iqpilot.selfdrive.iqmodeld.parser", + "iqpilot.selfdrive.iqmodeld.runtime.tinygrad", + "iqpilot.selfdrive.iqmodeld.temporal_state", + "iqpilot.selfdrive.iqmodeld.tools.compile_supercombo", + "iqpilot.selfdrive.iqmodeld.tools.compile_warp", + "iqpilot.selfdrive.locationd.calibration_helpers", + "iqpilot.selfdrive.locationd.calibrationd", + "iqpilot.selfdrive.locationd.helpers", + "iqpilot.selfdrive.locationd.locationd", + "iqpilot.selfdrive.locationd.models.constants", + "iqpilot.selfdrive.locationd.models.pose_kf", + "iqpilot.selfdrive.selfdrived.alertmanager", + "iqpilot.selfdrive.selfdrived.events", + "iqpilot.selfdrive.state_estimation", + "iqpilot.selfdrive.state_estimation.estimator", + "iqpilot.selfdrive.ui.feedback.feedbackd", + "iqpilot.system", + "iqpilot.system.camerad.cameras.nv12_info", + "iqpilot.system.hardware", + "iqpilot.system.hardware.base", + "iqpilot.system.hardware.hw", + "iqpilot.system.hardware.pc.hardware", + "iqpilot.system.hardware.tici", + "iqpilot.system.hardware.tici.amplifier", + "iqpilot.system.hardware.tici.hardware", + "iqpilot.system.hardware.tici.iwlist", + "iqpilot.system.hardware.tici.lpa", + "iqpilot.system.hardware.tici.pins", + "iqpilot.system.hardware.tici.usb_storage", + "iqpilot.system.hardware.usb", + "iqpilot.system.micd", + "iqpilot.system.sentry", + "iqpilot.system.version" +] diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/__init__.py new file mode 100644 index 000000000..7c7b26fc2 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/__init__.py @@ -0,0 +1,26 @@ +import iqpilot.common.api.comma_connect + + +class Api: + def __init__(self, dongle_id): + self.service = iqpilot.common.api.comma_connect.CommaConnectApi(dongle_id) + + def request(self, method, endpoint, **params): + return self.service.request(method, endpoint, **params) + + def get(self, *args, **kwargs): + return self.service.get(*args, **kwargs) + + def post(self, *args, **kwargs): + return self.service.post(*args, **kwargs) + + def get_token(self, payload_extra=None, expiry_hours=1): + return self.service.get_token(payload_extra, expiry_hours) + + +def api_get(endpoint, method='GET', timeout=None, access_token=None, session=None, **params): + return iqpilot.common.api.comma_connect.CommaConnectApi(None).api_get(endpoint, method, timeout, access_token, session, **params) + + +def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]: + return iqpilot.common.api.comma_connect.CommaConnectApi(None).get_key_pair() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/base.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/base.py new file mode 100644 index 000000000..8170a19b2 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/base.py @@ -0,0 +1,84 @@ +import jwt +import os +import requests +import unicodedata +from datetime import datetime, timedelta, UTC +from functools import lru_cache +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.version import get_version + +# name: jwt signature algorithm +KEYS = {"id_rsa": "RS256", + "id_ecdsa": "ES256"} + + +@lru_cache(maxsize=4) +def load_signing_key(private_key: str): + # PyJWT re-parses a PEM string on every encode; an RSA parse is ~40ms, so cache the key object + try: + from cryptography.hazmat.primitives.serialization import load_pem_private_key + return load_pem_private_key(private_key.encode(), password=None) + except Exception: + return private_key + + +class BaseApi: + def __init__(self, dongle_id, api_host, user_agent="openpilot-"): + self.dongle_id = dongle_id + self.api_host = api_host + self.user_agent = user_agent + self.jwt_algorithm, self.private_key, _ = self.get_key_pair() + + def get(self, *args, **kwargs): + return self.request('GET', *args, **kwargs) + + def post(self, *args, **kwargs): + return self.request('POST', *args, **kwargs) + + def request(self, method, endpoint, timeout=None, access_token=None, **params): + return self.api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params) + + def _get_token(self, payload_extra=None, expiry_hours=1, **extra_payload): + now = datetime.now(UTC).replace(tzinfo=None) + payload = { + 'identity': self.dongle_id, + 'nbf': now, + 'iat': now, + 'exp': now + timedelta(hours=expiry_hours), + **extra_payload + } + if payload_extra is not None: + payload.update(payload_extra) + key = load_signing_key(self.private_key) if self.private_key else self.private_key + token = jwt.encode(payload, key, algorithm=self.jwt_algorithm) + if isinstance(token, bytes): + token = token.decode('utf8') + return token + + def get_token(self, payload_extra=None, expiry_hours=1): + return self._get_token(payload_extra, expiry_hours) + + def remove_non_ascii_chars(self, text): + normalized_text = unicodedata.normalize('NFD', text) + ascii_encoded_text = normalized_text.encode('ascii', 'ignore') + return ascii_encoded_text.decode() + + def api_get(self, endpoint, method='GET', timeout=None, access_token=None, session=None, json=None, **params): + headers = {} + if access_token is not None: + headers['Authorization'] = "JWT " + access_token + + version = self.remove_non_ascii_chars(get_version()) + headers['User-Agent'] = self.user_agent + version + + # TODO: add session to Api + req = requests if session is None else session + return req.request(method, f"{self.api_host}/{endpoint}", timeout=timeout, headers=headers, json=json, params=params) + + @staticmethod + def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]: + for key in KEYS: + if os.path.isfile(Paths.persist_root() + f'/comma/{key}') and os.path.isfile(Paths.persist_root() + f'/comma/{key}.pub'): + with open(Paths.persist_root() + f'/comma/{key}') as private, open(Paths.persist_root() + f'/comma/{key}.pub') as public: + return KEYS[key], private.read(), public.read() + return None, None, None diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/comma_connect.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/comma_connect.py new file mode 100644 index 000000000..bc16d40eb --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/api/comma_connect.py @@ -0,0 +1,11 @@ +import os + +from iqpilot.common.api.base import BaseApi + +API_HOST = os.getenv('API_HOST', 'https://api-iqlabs.konn3kt.com') + + +class CommaConnectApi(BaseApi): + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "openpilot-" diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/atlas_alerts.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/atlas_alerts.py new file mode 100644 index 000000000..c261db844 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/atlas_alerts.py @@ -0,0 +1,281 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from bisect import insort +from collections.abc import Callable, Iterable +from dataclasses import dataclass, field +from enum import IntEnum + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car, log +from iqpilot.common.realtime import DT_CTRL +from iqpilot.system.hardware import HARDWARE + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus +VisualAlert = car.CarControl.HUDControl.VisualAlert +AudibleAlert = car.CarControl.HUDControl.AudibleAlert + + +def _frames_for(seconds: float) -> int: + return int(seconds / DT_CTRL) + + +class Tier(IntEnum): + LOWEST = 0 + LOWER = 1 + LOW = 2 + MID = 3 + HIGH = 4 + HIGHEST = 5 + + +class Tags: + ENABLE = "enable" + PRE_ENABLE = "preEnable" + OVERRIDE_LATERAL = "overrideLateral" + OVERRIDE_LONGITUDINAL = "overrideLongitudinal" + NO_ENTRY = "noEntry" + WARNING = "warning" + USER_DISABLE = "userDisable" + SOFT_DISABLE = "softDisable" + IMMEDIATE_DISABLE = "immediateDisable" + PERMANENT = "permanent" + + +@dataclass(slots=True) +class AlertCard: + alert_text_1: str + alert_text_2: str + alert_status: log.SelfdriveState.AlertStatus + alert_size: log.SelfdriveState.AlertSize + priority: Tier + visual_alert: car.CarControl.HUDControl.VisualAlert + audible_alert: car.CarControl.HUDControl.AudibleAlert + duration: int + creation_delay: float = 0.0 + alert_type: str = field(default="", init=False) + event_type: str | None = field(default=None, init=False) + + def __init__(self, + alert_text_1: str, + alert_text_2: str, + alert_status: log.SelfdriveState.AlertStatus, + alert_size: log.SelfdriveState.AlertSize, + priority: Tier, + visual_alert: car.CarControl.HUDControl.VisualAlert, + audible_alert: car.CarControl.HUDControl.AudibleAlert, + duration: float, + creation_delay: float = 0.0): + self.alert_text_1 = alert_text_1 + self.alert_text_2 = alert_text_2 + self.alert_status = alert_status + self.alert_size = alert_size + self.priority = priority + self.visual_alert = visual_alert + self.audible_alert = audible_alert + self.duration = _frames_for(duration) + self.creation_delay = creation_delay + self.alert_type = "" + self.event_type = None + + def __str__(self) -> str: + return f"{self.alert_text_1}/{self.alert_text_2} {self.priority} {self.visual_alert} {self.audible_alert}" + + +AlertFactory = Callable[[car.CarParams, car.CarState, messaging.SubMaster, bool, int, log.ControlsState], AlertCard] + + +def car_mode_entry_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> AlertCard: + del CS, sm, metric, soft_disable_time, personality + headline = "Enable Adaptive Cruise to Engage" + if CP.brand == "honda": + headline = "Enable Main Switch to Engage" + return NoEntryCard(headline) + + +class EventBook(ABC): + def __init__(self): + self._live_names: list[int] = [] + self._latched_names: list[int] = [] + self.event_counters: dict[int, int] = {} + + @property + def events(self) -> list[int]: + return self._live_names + + @events.setter + def events(self, values: list[int]) -> None: + self._live_names = values + + @property + def static_events(self) -> list[int]: + return self._latched_names + + @static_events.setter + def static_events(self, values: list[int]) -> None: + self._latched_names = values + + @property + def names(self) -> list[int]: + return list(self._live_names) + + def __len__(self) -> int: + return len(self._live_names) + + def add(self, event_name: int, static: bool = False) -> None: + if static: + insort(self._latched_names, event_name) + insort(self._live_names, event_name) + + def clear(self) -> None: + refreshed: dict[int, int] = {} + for event_name, frames_seen in self.event_counters.items(): + refreshed[event_name] = frames_seen + 1 if event_name in self._live_names else 0 + self.event_counters = refreshed + self._live_names = list(self._latched_names) + + def contains(self, event_type: str) -> bool: + board = self.get_events_mapping() + return any(event_type in board.get(event_name, {}) for event_name in self._live_names) + + def has(self, event_name: int) -> bool: + return event_name in self._live_names + + def contains_in_list(self, events_list: list[int]) -> bool: + return any(event_name in self._live_names for event_name in events_list) + + def remove(self, event_name: int, static: bool = False) -> None: + if static and event_name in self._latched_names: + self._latched_names.remove(event_name) + + if event_name in self._live_names: + self.event_counters[event_name] = self.event_counters.get(event_name, 0) + 1 + self._live_names.remove(event_name) + + def add_from_msg(self, events: Iterable) -> None: + for event in events: + insort(self._live_names, event.name.raw) + + def to_msg(self): + board = self.get_events_mapping() + outbound = [] + for event_name in self._live_names: + msg = self.get_event_msg_type().new_message() + msg.name = event_name + for event_kind in board.get(event_name, {}): + setattr(msg, event_kind, True) + outbound.append(msg) + return outbound + + def create_alerts(self, event_types: list[str], callback_args=None): + callback_args = [] if callback_args is None else callback_args + board = self.get_events_mapping() + spawned: list[AlertCard] = [] + for event_name in self._live_names: + variants = board.get(event_name, {}) + for event_type in event_types: + chosen = variants.get(event_type) + if chosen is None: + continue + alert = self._realize(chosen, callback_args) + age_frames = self.event_counters.get(event_name, 0) + 1 + if age_frames * DT_CTRL < alert.creation_delay: + continue + alert.alert_type = f"{self.get_event_name(event_name)}/{event_type}" + alert.event_type = event_type + spawned.append(alert) + return spawned + + @staticmethod + def _realize(candidate: AlertCard | AlertFactory, callback_args: list) -> AlertCard: + return candidate if isinstance(candidate, AlertCard) else candidate(*callback_args) + + @abstractmethod + def get_events_mapping(self) -> dict[int, dict[str, AlertCard | AlertFactory]]: + raise NotImplementedError + + @abstractmethod + def get_event_name(self, event: int) -> str: + raise NotImplementedError + + @abstractmethod + def get_event_msg_type(self): + raise NotImplementedError + + +def _mici_reframe(primary: str, secondary: str) -> tuple[str, str, log.SelfdriveState.AlertSize]: + if HARDWARE.get_device_type() == "mici": + return secondary, primary, AlertSize.small + return primary, secondary, AlertSize.mid + + +class NoEntryCard(AlertCard): + def __init__(self, + alert_text_2: str, + alert_text_1: str = "IQ.Pilot Unavailable", + visual_alert: car.CarControl.HUDControl.VisualAlert = VisualAlert.none, + priority: Tier = Tier.LOW): + primary, secondary, size = _mici_reframe(alert_text_1, alert_text_2) + super().__init__(primary, secondary, AlertStatus.normal, size, priority, visual_alert, AudibleAlert.refuse, 3.0) + + +class GentleDisableCard(AlertCard): + def __init__(self, alert_text_2: str): + super().__init__( + "TAKE CONTROL IMMEDIATELY", + alert_text_2, + AlertStatus.userPrompt, + AlertSize.full, + Tier.MID, + VisualAlert.steerRequired, + AudibleAlert.warningSoft, + 2.0, + ) + + +class PendingDisableCard(GentleDisableCard): + def __init__(self, alert_text_2: str): + super().__init__(alert_text_2) + self.alert_text_1 = "IQ.Pilot will disengage" + + +class HardDisableCard(AlertCard): + def __init__(self, alert_text_2: str): + super().__init__( + "TAKE CONTROL IMMEDIATELY", + alert_text_2, + AlertStatus.critical, + AlertSize.full, + Tier.HIGHEST, + VisualAlert.steerRequired, + AudibleAlert.warningImmediate, + 4.0, + ) + + +class ChimeCard(AlertCard): + def __init__(self, audible_alert: car.CarControl.HUDControl.AudibleAlert): + super().__init__("", "", AlertStatus.normal, AlertSize.none, Tier.MID, VisualAlert.none, audible_alert, 0.2) + + +class BannerCard(AlertCard): + def __init__(self, alert_text_1: str, alert_text_2: str = "", duration: float = 0.2, priority: Tier = Tier.LOWER, creation_delay: float = 0.0): + size = AlertSize.mid if alert_text_2 else AlertSize.small + super().__init__(alert_text_1, alert_text_2, AlertStatus.normal, size, priority, VisualAlert.none, AudibleAlert.none, duration, creation_delay) + + +class BootCard(AlertCard): + def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal): + if HARDWARE.get_device_type() == "mici": + compact_secondary = "" if alert_text_2 == "Always keep hands on wheel and eyes on road" else alert_text_2 + super().__init__(alert_text_1, compact_secondary, alert_status, AlertSize.small, Tier.LOWER, VisualAlert.none, AudibleAlert.none, 5.0) + else: + super().__init__(alert_text_1, alert_text_2, alert_status, AlertSize.mid, Tier.LOWER, VisualAlert.none, AudibleAlert.none, 5.0) + + +class AlertBase(AlertCard): + pass + + +NULL_ALERT = AlertCard("", "", AlertStatus.normal, AlertSize.none, Tier.LOWEST, VisualAlert.none, AudibleAlert.none, 0.0) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/basedir.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/basedir.py new file mode 100644 index 000000000..49b092d93 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/basedir.py @@ -0,0 +1,4 @@ +import os + + +BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../..")) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/constants.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/constants.py new file mode 100644 index 000000000..7ca425c4b --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/constants.py @@ -0,0 +1,23 @@ +import numpy as np + +# conversions +class CV: + # Speed + MPH_TO_KPH = 1.609344 + KPH_TO_MPH = 1. / MPH_TO_KPH + MS_TO_KPH = 3.6 + KPH_TO_MS = 1. / MS_TO_KPH + MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH + MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS + MS_TO_KNOTS = 1.9438 + KNOTS_TO_MS = 1. / MS_TO_KNOTS + + # Angle + DEG_TO_RAD = np.pi / 180. + RAD_TO_DEG = 1. / DEG_TO_RAD + + # Mass + LB_TO_KG = 0.453592 + + +ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2 diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/file_chunker.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/file_chunker.py new file mode 100644 index 000000000..57dfc3553 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/file_chunker.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +import sys +import math +import os +from pathlib import Path + +CHUNK_SIZE = 45 * 1024 * 1024 # 45MB, under GitHub's 50MB limit + +def get_chunk_name(name, idx, num_chunks): + return f"{name}.chunk{idx+1:02d}of{num_chunks:02d}" + +def get_manifest_path(name): + return f"{name}.chunkmanifest" + +def _chunk_paths(path, num_chunks): + return [get_manifest_path(path)] + [get_chunk_name(path, i, num_chunks) for i in range(num_chunks)] + +def get_chunk_targets(path, file_size): + num_chunks = math.ceil(file_size / CHUNK_SIZE) + return _chunk_paths(path, num_chunks) + +def chunk_file(path, targets): + manifest_path, *chunk_paths = targets + with open(path, 'rb') as f: + data = f.read() + actual_num_chunks = max(1, math.ceil(len(data) / CHUNK_SIZE)) + assert len(chunk_paths) >= actual_num_chunks, f"Allowed {len(chunk_paths)} chunks but needs at least {actual_num_chunks}, for path {path}" + for i, chunk_path in enumerate(chunk_paths): + with open(chunk_path, 'wb') as f: + f.write(data[i * CHUNK_SIZE:(i + 1) * CHUNK_SIZE]) + Path(manifest_path).write_text(str(len(chunk_paths))) + os.remove(path) + +def get_existing_chunks(path): + if os.path.isfile(path): + return [path] + if os.path.isfile(manifest := get_manifest_path(path)): + num_chunks = int(Path(manifest).read_text().strip()) + return _chunk_paths(path, num_chunks) + raise FileNotFoundError(path) + +def read_file_chunked(path): + manifest_path = get_manifest_path(path) + if os.path.isfile(manifest_path): + num_chunks = int(Path(manifest_path).read_text().strip()) + return b''.join(Path(get_chunk_name(path, i, num_chunks)).read_bytes() for i in range(num_chunks)) + if os.path.isfile(path): + return Path(path).read_bytes() + raise FileNotFoundError(path) + + +if __name__ == "__main__": + path = sys.argv[1] + chunk_paths = get_chunk_targets(path, os.path.getsize(path)) + chunk_file(path, chunk_paths) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/filter_simple.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/filter_simple.py new file mode 100644 index 000000000..30839f66e --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/filter_simple.py @@ -0,0 +1,71 @@ +from collections import deque + +import numpy as np + + +class FirstOrderFilter: + def __init__(self, x0, rc, dt, initialized=True): + self.x = x0 + self.dt = dt + self.update_alpha(rc) + self.initialized = initialized + + def update_alpha(self, rc): + self.alpha = self.dt / (rc + self.dt) + + def update(self, x): + if self.initialized: + self.x = (1. - self.alpha) * self.x + self.alpha * x + else: + self.initialized = True + self.x = x + return self.x + + +class BounceFilter(FirstOrderFilter): + def __init__(self, x0, rc, dt, initialized=True, bounce=2): + self.velocity = FirstOrderFilter(0.0, 0.15, dt) + self.bounce = bounce + super().__init__(x0, rc, dt, initialized) + + def update(self, x): + super().update(x) + scale = self.dt / (1.0 / 60.0) # tuned at 60 fps + self.velocity.x += (x - self.x) * self.bounce * scale * self.dt + self.velocity.update(0.0) + if abs(self.velocity.x) < 1e-5: + self.velocity.x = 0.0 + self.x += self.velocity.x + return self.x + + +class MyMovingAverage: + def __init__(self, window_size, value=None): + self.window_size = window_size + if value is not None: + self.values = deque([value] * window_size, maxlen=window_size) + self.sum = value * window_size + self.result = value + else: + self.values = deque(maxlen=window_size) + self.sum = 0 + self.result = 0 + + def set(self, value): + self.values.clear() + self.values.append(value) + self.sum = value + self.result = value + return value + + def set_all(self, value): + self.values = deque([value] * self.window_size, maxlen=self.window_size) + self.sum = value * self.window_size + self.result = value + return value + + def process(self, value, median=False): + self.values.append(value) + self.sum = sum(self.values) + self.result = float(np.median(self.values)) if median else float(self.sum) / len(self.values) + return self.result diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/gpio.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/gpio.py new file mode 100644 index 000000000..8f025a2da --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/gpio.py @@ -0,0 +1,89 @@ +import os +import fcntl +import ctypes +from functools import cache + +def gpio_init(pin: int, output: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f: + f.write(b"out" if output else b"in") + except Exception as e: + print(f"Failed to set gpio {pin} direction: {e}") + +def gpio_set(pin: int, high: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f: + f.write(b"1" if high else b"0") + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + +def gpio_read(pin: int) -> bool | None: + val = None + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f: + val = bool(int(f.read().strip())) + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + + return val + +def gpio_export(pin: int) -> None: + if os.path.isdir(f"/sys/class/gpio/gpio{pin}"): + return + + try: + with open("/sys/class/gpio/export", 'w') as f: + f.write(str(pin)) + except Exception: + print(f"Failed to export gpio {pin}") + +@cache +def get_irq_action(irq: int) -> list[str]: + try: + with open(f"/sys/kernel/irq/{irq}/actions") as f: + actions = f.read().strip().split(',') + return actions + except FileNotFoundError: + return [] + +def get_irqs_for_action(action: str) -> list[str]: + ret = [] + with open("/proc/interrupts") as f: + for l in f.readlines(): + irq = l.split(':')[0].strip() + if irq.isdigit() and action in get_irq_action(irq): + ret.append(irq) + return ret + +# *** gpiochip *** + +class gpioevent_data(ctypes.Structure): + _fields_ = [ + ("timestamp", ctypes.c_uint64), + ("id", ctypes.c_uint32), + ] + +class gpioevent_request(ctypes.Structure): + _fields_ = [ + ("lineoffset", ctypes.c_uint32), + ("handleflags", ctypes.c_uint32), + ("eventflags", ctypes.c_uint32), + ("label", ctypes.c_char * 32), + ("fd", ctypes.c_int) + ] + +def gpiochip_get_ro_value_fd(label: str, gpiochip_id: int, pin: int) -> int: + GPIOEVENT_REQUEST_BOTH_EDGES = 0x3 + GPIOHANDLE_REQUEST_INPUT = 0x1 + GPIO_GET_LINEEVENT_IOCTL = 0xc030b404 + + rq = gpioevent_request() + rq.lineoffset = pin + rq.handleflags = GPIOHANDLE_REQUEST_INPUT + rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES + rq.label = label.encode('utf-8')[:31] + b'\0' + + fd = os.open(f"/dev/gpiochip{gpiochip_id}", os.O_RDONLY) + fcntl.ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, rq) + os.close(fd) + return int(rq.fd) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/i2c.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/i2c.py new file mode 100644 index 000000000..1dfaa659a --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/i2c.py @@ -0,0 +1,81 @@ +import os +import fcntl +import ctypes + +# I2C constants from /usr/include/linux/i2c-dev.h +I2C_SLAVE = 0x0703 +I2C_SLAVE_FORCE = 0x0706 +I2C_SMBUS = 0x0720 + +# SMBus transfer types +I2C_SMBUS_READ = 1 +I2C_SMBUS_WRITE = 0 +I2C_SMBUS_BYTE_DATA = 2 +I2C_SMBUS_I2C_BLOCK_DATA = 8 + +I2C_SMBUS_BLOCK_MAX = 32 + + +class _I2cSmbusData(ctypes.Union): + _fields_ = [ + ("byte", ctypes.c_uint8), + ("word", ctypes.c_uint16), + ("block", ctypes.c_uint8 * (I2C_SMBUS_BLOCK_MAX + 2)), + ] + + +class _I2cSmbusIoctlData(ctypes.Structure): + _fields_ = [ + ("read_write", ctypes.c_uint8), + ("command", ctypes.c_uint8), + ("size", ctypes.c_uint32), + ("data", ctypes.POINTER(_I2cSmbusData)), + ] + + +class SMBus: + def __init__(self, bus: int): + self._fd = os.open(f'/dev/i2c-{bus}', os.O_RDWR) + + def __enter__(self) -> 'SMBus': + return self + + def __exit__(self, *args) -> None: + self.close() + + def close(self) -> None: + if hasattr(self, '_fd') and self._fd >= 0: + os.close(self._fd) + self._fd = -1 + + def _set_address(self, addr: int, force: bool = False) -> None: + ioctl_arg = I2C_SLAVE_FORCE if force else I2C_SLAVE + fcntl.ioctl(self._fd, ioctl_arg, addr) + + def _smbus_access(self, read_write: int, command: int, size: int, data: _I2cSmbusData) -> None: + ioctl_data = _I2cSmbusIoctlData(read_write, command, size, ctypes.pointer(data)) + fcntl.ioctl(self._fd, I2C_SMBUS, ioctl_data) + + def read_byte_data(self, addr: int, register: int, force: bool = False) -> int: + self._set_address(addr, force) + data = _I2cSmbusData() + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_BYTE_DATA, data) + return int(data.byte) + + def write_byte_data(self, addr: int, register: int, value: int, force: bool = False) -> None: + self._set_address(addr, force) + data = _I2cSmbusData() + data.byte = value & 0xFF + self._smbus_access(I2C_SMBUS_WRITE, register, I2C_SMBUS_BYTE_DATA, data) + + def read_i2c_block_data(self, addr: int, register: int, length: int, force: bool = False) -> list[int]: + self._set_address(addr, force) + if not (0 <= length <= I2C_SMBUS_BLOCK_MAX): + raise ValueError(f"length must be 0..{I2C_SMBUS_BLOCK_MAX}") + + data = _I2cSmbusData() + data.block[0] = length + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_I2C_BLOCK_DATA, data) + read_len = int(data.block[0]) or length + read_len = min(read_len, length) + return [int(b) for b in data.block[1 : read_len + 1]] diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/iq_perf.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/iq_perf.py new file mode 100644 index 000000000..f36f5edef --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/iq_perf.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import time +from collections import deque +from dataclasses import dataclass +from typing import Any + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import custom +from iqpilot.common.swaglog import cloudlog + + +TRACE_SERVICE = "iqPerfTrace" +MAX_TRACE_SAMPLES = 16 +_SHARED_PM: messaging.PubMaster | None = None + + +@dataclass(slots=True) +class PerfSample: + frame_id: int = 0 + loop_dt_us: int = 0 + update_us: int = 0 + state_control_us: int = 0 + publish_us: int = 0 + tail_work_us: int = 0 + rk_remaining_us: int = 0 + stale_carcontrol_us: int = 0 + stale_carcontrol_frames: int = 0 + sendcan_gap_us: int = 0 + model_eval_us: int = 0 + model_dropped_frames: int = 0 + model_backlog: int = 0 + texture_decode_us: int = 0 + texture_upload_us: int = 0 + texture_unload_us: int = 0 + texture_prune_us: int = 0 + texture_consume_us: int = 0 + texture_batch_size: int = 0 + texture_bytes: int = 0 + texture_cache_before: int = 0 + texture_cache_after: int = 0 + texture_unloaded: int = 0 + memory_usage_percent: int = 0 + gpu_usage_percent: int = 0 + cpu_usage_percent: int = 0 + flags: int = 0 + + +class PerfTraceRing: + def __init__(self, size: int = MAX_TRACE_SAMPLES): + self._samples: deque[PerfSample] = deque(maxlen=size) + + def push(self, sample: PerfSample) -> None: + self._samples.append(sample) + + def snapshot(self) -> list[PerfSample]: + return list(self._samples) + + +class PerfTraceEmitter: + _SEVERITY_MAP = { + "info": custom.IQPerfTrace.Severity.info, + "warning": custom.IQPerfTrace.Severity.warning, + "error": custom.IQPerfTrace.Severity.error, + "critical": custom.IQPerfTrace.Severity.critical, + } + + def __init__(self, process_name: str, pubmaster: messaging.PubMaster | None = None): + self.process_name = process_name + self._pm: messaging.PubMaster | None = pubmaster + self._last_emit_mono: dict[str, float] = {} + self._disabled = False + + def _pubmaster(self) -> messaging.PubMaster: + global _SHARED_PM + if self._pm is not None: + return self._pm + if _SHARED_PM is None: + _SHARED_PM = messaging.PubMaster([TRACE_SERVICE]) + self._pm = _SHARED_PM + return self._pm + + @staticmethod + def _clamp_uint(value: int, bits: int) -> int: + return max(0, min(value, (1 << bits) - 1)) + + @staticmethod + def _clamp_int(value: int, bits: int) -> int: + lo = -(1 << (bits - 1)) + hi = (1 << (bits - 1)) - 1 + return max(lo, min(value, hi)) + + def emit(self, event_class: str, *, + severity: str = "warning", + frame_id: int = 0, + total_time_us: int = 0, + rk_remaining_us: int = 0, + batch_size: int = 0, + dropped_frames: int = 0, + backlog: int = 0, + flags: int = 0, + samples: list[PerfSample] | None = None, + missing_services: list[str] | None = None, + top_processes: list[str] | None = None, + detail: str = "", + min_interval_s: float = 0.0, + mirror_cloudlog: bool = True) -> bool: + if self._disabled: + return False + now = time.monotonic() + last_emit = self._last_emit_mono.get(event_class, 0.0) + if min_interval_s > 0.0 and (now - last_emit) < min_interval_s: + return False + self._last_emit_mono[event_class] = now + + msg = messaging.new_message(TRACE_SERVICE) + trace = msg.iqPerfTrace + trace.process = self.process_name + trace.eventClass = event_class + trace.severity = self._SEVERITY_MAP.get(severity, custom.IQPerfTrace.Severity.warning) + trace.frameId = self._clamp_uint(int(frame_id), 32) + trace.totalTimeUs = self._clamp_uint(int(total_time_us), 32) + trace.rkRemainingUs = self._clamp_int(int(rk_remaining_us), 32) + trace.batchSize = self._clamp_uint(int(batch_size), 16) + trace.droppedFrames = self._clamp_uint(int(dropped_frames), 16) + trace.backlog = self._clamp_uint(int(backlog), 16) + trace.flags = self._clamp_uint(int(flags), 32) + trace.missingServices = list(missing_services or []) + trace.topProcesses = list(top_processes or []) + trace.detail = detail + + trace_samples = samples or [] + samples_builder = trace.init("samples", len(trace_samples)) + for i, sample in enumerate(trace_samples): + builder = samples_builder[i] + builder.frameId = self._clamp_uint(int(sample.frame_id), 32) + builder.loopDtUs = self._clamp_uint(int(sample.loop_dt_us), 32) + builder.updateUs = self._clamp_uint(int(sample.update_us), 32) + builder.stateControlUs = self._clamp_uint(int(sample.state_control_us), 32) + builder.publishUs = self._clamp_uint(int(sample.publish_us), 32) + builder.tailWorkUs = self._clamp_uint(int(sample.tail_work_us), 32) + builder.rkRemainingUs = self._clamp_int(int(sample.rk_remaining_us), 32) + builder.staleCarControlUs = self._clamp_uint(int(sample.stale_carcontrol_us), 32) + builder.staleCarControlFrames = self._clamp_uint(int(sample.stale_carcontrol_frames), 16) + builder.sendcanGapUs = self._clamp_uint(int(sample.sendcan_gap_us), 32) + builder.modelEvalUs = self._clamp_uint(int(sample.model_eval_us), 32) + builder.modelDroppedFrames = self._clamp_uint(int(sample.model_dropped_frames), 16) + builder.modelBacklog = self._clamp_uint(int(sample.model_backlog), 16) + builder.textureDecodeUs = self._clamp_uint(int(sample.texture_decode_us), 32) + builder.textureUploadUs = self._clamp_uint(int(sample.texture_upload_us), 32) + builder.textureUnloadUs = self._clamp_uint(int(sample.texture_unload_us), 32) + builder.texturePruneUs = self._clamp_uint(int(sample.texture_prune_us), 32) + builder.textureConsumeUs = self._clamp_uint(int(sample.texture_consume_us), 32) + builder.textureBatchSize = self._clamp_uint(int(sample.texture_batch_size), 16) + builder.textureBytes = self._clamp_uint(int(sample.texture_bytes), 32) + builder.textureCacheBefore = self._clamp_uint(int(sample.texture_cache_before), 16) + builder.textureCacheAfter = self._clamp_uint(int(sample.texture_cache_after), 16) + builder.textureUnloaded = self._clamp_uint(int(sample.texture_unloaded), 16) + builder.memoryUsagePercent = self._clamp_uint(int(sample.memory_usage_percent), 16) + builder.gpuUsagePercent = self._clamp_uint(int(sample.gpu_usage_percent), 16) + builder.cpuUsagePercent = self._clamp_uint(int(sample.cpu_usage_percent), 16) + builder.flags = self._clamp_uint(int(sample.flags), 32) + + try: + self._pubmaster().send(TRACE_SERVICE, msg) + except messaging.MultiplePublishersError: + self._disabled = True + cloudlog.error(f"iq_perf_trace disabled for {self.process_name}: duplicate publisher for {TRACE_SERVICE}") + return False + except Exception: + cloudlog.exception(f"iq_perf_trace publish failed for {self.process_name}") + return False + + if mirror_cloudlog: + cloudlog.event( + "iq_perf_trace", + process=self.process_name, + event_class=event_class, + severity=severity, + frame_id=int(frame_id), + total_time_us=int(total_time_us), + dropped_frames=int(dropped_frames), + flags=int(flags), + detail=detail, + ) + return True diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/issue_debug.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/issue_debug.py new file mode 100644 index 000000000..e8c517a7d --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/issue_debug.py @@ -0,0 +1,44 @@ +import os +import threading +import time +from datetime import datetime +from pathlib import Path + +from iqpilot.system.hardware import PC +from iqpilot.system.hardware.hw import Paths + + +DEBUG_FILENAME = "iqpilot_issue_debug.txt" +DEBUG_PATH = Path(Paths.comma_home()) / "community" / DEBUG_FILENAME if PC else Path("/data/community") / DEBUG_FILENAME + +_lock = threading.Lock() +_last_log_times: dict[str, float] = {} + + +def log_issue(tag: str, message: str) -> None: + try: + DEBUG_PATH.parent.mkdir(parents=True, exist_ok=True) + with _lock: + with open(DEBUG_PATH, "a", encoding="utf-8") as f: + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + f.write(f"[{timestamp}] [{tag}] {message}\n") + except OSError: + pass + + +def log_issue_limited(key: str, tag: str, message: str, interval_sec: float = 1.0) -> None: + now = time.monotonic() + with _lock: + last = _last_log_times.get(key, 0.0) + if now - last < interval_sec: + return + _last_log_times[key] = now + + log_issue(tag, message) + + +def clear_issue_debug_log() -> None: + try: + os.remove(DEBUG_PATH) + except OSError: + pass diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/logging_extra.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/logging_extra.py new file mode 100644 index 000000000..ceaf083cd --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/logging_extra.py @@ -0,0 +1,249 @@ +import io +import os +import sys +import copy +import json +import time +import uuid +import socket +import logging +import traceback +import numpy as np +from threading import local +from collections import OrderedDict +from contextlib import contextmanager + +LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ + +def json_handler(obj): + if isinstance(obj, np.bool_): + return bool(obj) + # if isinstance(obj, (datetime.date, datetime.time)): + # return obj.isoformat() + return repr(obj) + +def json_robust_dumps(obj): + return json.dumps(obj, default=json_handler) + +class NiceOrderedDict(OrderedDict): + def __str__(self): + return json_robust_dumps(self) + +class SwagFormatter(logging.Formatter): + def __init__(self, swaglogger): + logging.Formatter.__init__(self, None, '%a %b %d %H:%M:%S %Z %Y') + + self.swaglogger = swaglogger + self.host = socket.gethostname() + + def format_dict(self, record): + record_dict = NiceOrderedDict() + + if isinstance(record.msg, dict): + record_dict['msg'] = record.msg + else: + try: + record_dict['msg'] = record.getMessage() + except (ValueError, TypeError): + record_dict['msg'] = [record.msg]+record.args + + record_dict['ctx'] = self.swaglogger.get_ctx() + + if record.exc_info: + record_dict['exc_info'] = self.formatException(record.exc_info) + + record_dict['level'] = record.levelname + record_dict['levelnum'] = record.levelno + record_dict['name'] = record.name + record_dict['filename'] = record.filename + record_dict['lineno'] = record.lineno + record_dict['pathname'] = record.pathname + record_dict['module'] = record.module + record_dict['funcName'] = record.funcName + record_dict['host'] = self.host + record_dict['process'] = record.process + record_dict['thread'] = record.thread + record_dict['threadName'] = record.threadName + record_dict['created'] = record.created + + return record_dict + + def format(self, record): + if self.swaglogger is None: + raise Exception("must set swaglogger before calling format()") + return json_robust_dumps(self.format_dict(record)) + +class SwagLogFileFormatter(SwagFormatter): + def fix_kv(self, k, v): + # append type to names to preserve legacy naming in logs + # avoids overlapping key namespaces with different types + # e.g. log.info() creates 'msg' -> 'msg$s' + # log.event() creates 'msg.health.logMonoTime' -> 'msg.health.logMonoTime$i' + # because overlapping namespace 'msg' caused problems + if isinstance(v, (str, bytes)): + k += "$s" + elif isinstance(v, float): + k += "$f" + elif isinstance(v, bool): + k += "$b" + elif isinstance(v, int): + k += "$i" + elif isinstance(v, dict): + nv = {} + for ik, iv in v.items(): + ik, iv = self.fix_kv(ik, iv) + nv[ik] = iv + v = nv + elif isinstance(v, list): + k += "$a" + return k, v + + def format(self, record): + if isinstance(record, str): + v = json.loads(record) + else: + v = self.format_dict(record) + + mk, mv = self.fix_kv('msg', v['msg']) + del v['msg'] + v[mk] = mv + v['id'] = uuid.uuid4().hex + + return json_robust_dumps(v) + +class SwagErrorFilter(logging.Filter): + def filter(self, record): + return record.levelno < logging.ERROR + +def _tmpfunc(): + return 0 + +def _srcfile(): + return os.path.normcase(_tmpfunc.__code__.co_filename) + +class SwagLogger(logging.Logger): + def __init__(self): + logging.Logger.__init__(self, "swaglog") + + self.global_ctx = {} + + self.log_local = local() + self.log_local.ctx = {} + + def local_ctx(self): + try: + return self.log_local.ctx + except AttributeError: + self.log_local.ctx = {} + return self.log_local.ctx + + def get_ctx(self): + return dict(self.local_ctx(), **self.global_ctx) + + @contextmanager + def ctx(self, **kwargs): + old_ctx = self.local_ctx() + self.log_local.ctx = copy.copy(old_ctx) or {} + self.log_local.ctx.update(kwargs) + try: + yield + finally: + self.log_local.ctx = old_ctx + + def bind(self, **kwargs): + self.local_ctx().update(kwargs) + + def bind_global(self, **kwargs): + self.global_ctx.update(kwargs) + + def event(self, event, *args, **kwargs): + evt = NiceOrderedDict() + evt['event'] = event + if args: + evt['args'] = args + evt.update(kwargs) + if 'error' in kwargs: + self.error(evt) + elif 'debug' in kwargs: + self.debug(evt) + else: + self.info(evt) + + def timestamp(self, event_name): + if LOG_TIMESTAMPS: + t = time.monotonic() + tstp = NiceOrderedDict() + tstp['timestamp'] = NiceOrderedDict() + tstp['timestamp']["event"] = event_name + tstp['timestamp']["time"] = t*1e9 + self.debug(tstp) + + def findCaller(self, stack_info=False, stacklevel=1): + """ + Find the stack frame of the caller so that we can note the source + file name, line number and function name. + """ + f = sys._getframe(3) + #On some versions of IronPython, currentframe() returns None if + #IronPython isn't run with -X:Frames. + if f is not None: + f = f.f_back + orig_f = f + while f and stacklevel > 1: + f = f.f_back + stacklevel -= 1 + if not f: + f = orig_f + rv = "(unknown file)", 0, "(unknown function)", None + while hasattr(f, "f_code"): + co = f.f_code + filename = os.path.normcase(co.co_filename) + + if filename == _srcfile: + f = f.f_back + continue + sinfo = None + if stack_info: + sio = io.StringIO() + sio.write('Stack (most recent call last):\n') + traceback.print_stack(f, file=sio) + sinfo = sio.getvalue() + if sinfo[-1] == '\n': + sinfo = sinfo[:-1] + sio.close() + rv = (co.co_filename, f.f_lineno, co.co_name, sinfo) + break + return rv + +if __name__ == "__main__": + log = SwagLogger() + + stdout_handler = logging.StreamHandler(sys.stdout) + stdout_handler.setLevel(logging.INFO) + stdout_handler.addFilter(SwagErrorFilter()) + log.addHandler(stdout_handler) + + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.ERROR) + log.addHandler(stderr_handler) + + log.info("asdasd %s", "a") + log.info({'wut': 1}) + log.warning("warning") + log.error("error") + log.critical("critical") + log.event("test", x="y") + + with log.ctx(): + stdout_handler.setFormatter(SwagFormatter(log)) + stderr_handler.setFormatter(SwagFormatter(log)) + log.bind(user="some user") + log.info("in req") + print("") + log.warning("warning") + print("") + log.error("error") + print("") + log.critical("critical") + print("") + log.event("do_req", a=1, b="c") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/realtime.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/realtime.py new file mode 100644 index 000000000..9fd2f695d --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/realtime.py @@ -0,0 +1,134 @@ +"""Utilities for reading real time clocks and keeping soft real time constraints.""" +import gc +import os +import sys +import time + +from setproctitle import getproctitle + +from iqpilot.common.utils import MovingAverage +from iqpilot.system.hardware import PC + + +# time step for each process +DT_CTRL = 0.01 # controlsd +DT_MDL = 0.05 # model +DT_HW = 0.5 # hardwared and manager +DT_DMON = 0.05 # driver monitoring + + +class Priority: + # CORE 2 + # - modeld = 55 + # - camerad = 54 + CTRL_LOW = 51 # plannerd & radard + + # CORE 3 + # - pandad = 55 + CTRL_HIGH = 53 + + +def set_core_affinity(cores: list[int]) -> None: + if sys.platform == 'linux' and not PC: + os.sched_setaffinity(0, cores) + + +def config_realtime_process(cores: int | list[int], priority: int) -> None: + gc.disable() + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(priority)) + c = cores if isinstance(cores, list) else [cores, ] + set_core_affinity(c) + + +def config_background_thread() -> None: + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_OTHER, os.sched_param(0)) + set_core_affinity(list(range(os.cpu_count() or 1))) + + +def lock_memory() -> None: + """mlockall this process so memory reclaim/compaction can't stall it. RT control + procs only (locking ui/modeld would worsen pressure). Best-effort.""" + if sys.platform != 'linux' or PC: + return + try: + import ctypes + import resource + resource.setrlimit(resource.RLIMIT_MEMLOCK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) + MCL_CURRENT, MCL_FUTURE = 0x1, 0x2 + libc = ctypes.CDLL("libc.so.6", use_errno=True) + if libc.mlockall(MCL_CURRENT | MCL_FUTURE) != 0: + raise OSError(ctypes.get_errno(), os.strerror(ctypes.get_errno())) + except Exception as e: + try: + from iqpilot.common.swaglog import cloudlog + cloudlog.warning(f"lock_memory (mlockall) failed: {e}") + except Exception: + pass + + +class Ratekeeper: + def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None: + """Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative.""" + self._interval = 1. / rate + self._print_delay_threshold = print_delay_threshold + self._frame = 0 + self._remaining = 0.0 + self._process_name = getproctitle() + self._last_monitor_time = -1. + self._next_frame_time = -1. + + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + def reset(self) -> None: + self._remaining = 0.0 + self._last_monitor_time = -1. + self._next_frame_time = -1. + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + @property + def frame(self) -> int: + return self._frame + + @property + def remaining(self) -> float: + return self._remaining + + @property + def lag(self) -> float: + return max(0., -self._remaining) + + @property + def lagging(self) -> bool: + expected_dt = self._interval * (1 / 0.9) + return self.avg_dt.get_average() > expected_dt + + # Maintain loop rate by calling this at the end of each loop + def keep_time(self) -> bool: + lagged = self.monitor_time() + if self._remaining > 0: + time.sleep(self._remaining) + return lagged + + # Monitors the cumulative lag, but does not enforce a rate + def monitor_time(self) -> bool: + if self._last_monitor_time < 0: + self._next_frame_time = time.monotonic() + self._interval + self._last_monitor_time = time.monotonic() + + prev = self._last_monitor_time + self._last_monitor_time = time.monotonic() + self.avg_dt.add_value(self._last_monitor_time - prev) + + lagged = False + remaining = self._next_frame_time - time.monotonic() + self._next_frame_time += self._interval + if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: + print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms") + lagged = True + self._frame += 1 + self._remaining = remaining + return lagged diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/spinner.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/spinner.py new file mode 100644 index 000000000..b823d09a4 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/spinner.py @@ -0,0 +1,52 @@ +import os +import subprocess +from iqpilot.common.basedir import BASEDIR + + +class Spinner: + def __init__(self): + try: + self.spinner_proc = subprocess.Popen(["./spinner.py"], + stdin=subprocess.PIPE, + cwd=os.path.join(BASEDIR, "iqpilot", "system", "ui"), + close_fds=True) + except OSError: + self.spinner_proc = None + + def __enter__(self): + return self + + def update(self, spinner_text: str): + if self.spinner_proc is not None: + self.spinner_proc.stdin.write(spinner_text.encode('utf8') + b"\n") + try: + self.spinner_proc.stdin.flush() + except BrokenPipeError: + pass + + def update_progress(self, cur: float, total: float): + self.update(str(round(100 * cur / total))) + + def close(self): + if self.spinner_proc is not None: + self.spinner_proc.kill() + try: + self.spinner_proc.communicate(timeout=2.) + except subprocess.TimeoutExpired: + print("WARNING: failed to kill spinner") + self.spinner_proc = None + + def __del__(self): + self.close() + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + + +if __name__ == "__main__": + import time + with Spinner() as s: + s.update("Spinner text") + time.sleep(5.0) + print("gone") + time.sleep(5.0) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/steer_delay.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/steer_delay.py new file mode 100644 index 000000000..349f975d3 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/steer_delay.py @@ -0,0 +1,60 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Chooses which steer-actuator delay the lateral controllers run with: the value the +live estimator learned, or the driver's fixed software delay — gated by the +"IQLiveSteerDelay" param. The pick is mirrored into "IQSteerDelayCache" so consumers that do +not subscribe to lateralDelay can still read the current value. +""" +from iqpilot.cereal import car +from iqpilot.common.params import Params + +_ENABLE_KEY = "IQLiveSteerDelay" +_FIXED_KEY = "IQSoftwareSteerDelay" +_CACHE_KEY = "IQSteerDelayCache" + + +def fixed_steer_delay(params, stock_delay): + """The rack's own delay plus the driver's IQSoftwareSteerDelay offset, as the UI reports it.""" + return stock_delay + float(params.get(_FIXED_KEY, return_default=True)) + + +def resolve_steer_delay(params, stock_delay): + """Learned lateral delay while live-learning is enabled, otherwise the driver's fixed delay.""" + if not params.get_bool(_ENABLE_KEY): + return fixed_steer_delay(params, stock_delay) + return float(params.get(_CACHE_KEY, return_default=True)) + + +def lateral_action_delay(params, car_params, live_delay): + """Delay the lateral path should be planned against. + + Angle cars honour the IQLiveSteerDelay toggle so that with live learning off the + estimate never reaches the path: lagd cross-correlates against localizer lateral + accel, so it reports whole-vehicle response (~0.36 s measured on VW MQB, 0.44 s on + Tesla) where the lookahead wants actuator delay (~0.10 s). Torque cars keep the + live estimate. + """ + if car_params.steerControlType == car.CarParams.SteerControlType.angle: + return resolve_steer_delay(params, car_params.steerActuatorDelay) + return live_delay + + +def cached_steer_delay(): + """Last value SteerDelayPublisher mirrored into the param — usable without a + lateralDelay subscription (e.g. at process startup).""" + return Params().get(_CACHE_KEY, return_default=True) + + +class SteerDelayPublisher: + """Refreshes IQSteerDelayCache every lag message: the learned live delay when the + toggle is on, else the actuator delay plus the driver's fixed software offset.""" + + def __init__(self, car_params): + self._params = Params() + self._actuator_delay = car_params.steerActuatorDelay + + def update(self, lag_msg): + live = self._params.get_bool(_ENABLE_KEY) + value = lag_msg.lateralDelay.lateralDelay if live else fixed_steer_delay(self._params, self._actuator_delay) + self._params.put_nonblocking(_CACHE_KEY, value) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/swaglog.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/swaglog.py new file mode 100644 index 000000000..f8fd9d392 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/swaglog.py @@ -0,0 +1,165 @@ +import logging +import os +import sys +import time +import warnings +from pathlib import Path +from logging.handlers import BaseRotatingHandler + +import zmq + +from iqpilot.common.logging_extra import SwagLogger, SwagFormatter, SwagLogFileFormatter +from iqpilot.system.hardware.hw import Paths + + +def get_file_handler(): + Path(Paths.swaglog_root()).mkdir(parents=True, exist_ok=True) + base_filename = os.path.join(Paths.swaglog_root(), "swaglog") + handler = SwaglogRotatingFileHandler(base_filename) + return handler + +class SwaglogRotatingFileHandler(BaseRotatingHandler): + def __init__(self, base_filename, interval=60, max_bytes=1024*256, backup_count=2500, encoding=None): + super().__init__(base_filename, mode="a", encoding=encoding, delay=True) + self.base_filename = base_filename + self.interval = interval # seconds + self.max_bytes = max_bytes + self.backup_count = backup_count + self.log_files = self.get_existing_logfiles() + log_indexes = [f.split(".")[-1] for f in self.log_files] + self.last_file_idx = max([int(i) for i in log_indexes if i.isdigit()] or [-1]) + self.last_rollover = None + self.doRollover() + + def _open(self): + self.last_rollover = time.monotonic() + self.last_file_idx += 1 + next_filename = f"{self.base_filename}.{self.last_file_idx:010}" + stream = open(next_filename, self.mode, encoding=self.encoding) + self.log_files.insert(0, next_filename) + return stream + + def get_existing_logfiles(self): + log_files = list() + base_dir = os.path.dirname(self.base_filename) + for fn in os.listdir(base_dir): + fp = os.path.join(base_dir, fn) + if fp.startswith(self.base_filename) and os.path.isfile(fp): + log_files.append(fp) + return sorted(log_files) + + def shouldRollover(self, record): + size_exceeded = self.max_bytes > 0 and self.stream.tell() >= self.max_bytes + time_exceeded = self.interval > 0 and self.last_rollover + self.interval <= time.monotonic() + return size_exceeded or time_exceeded + + def doRollover(self): + if self.stream: + self.stream.close() + self.stream = self._open() + + if self.backup_count > 0: + while len(self.log_files) > self.backup_count: + to_delete = self.log_files.pop() + if os.path.exists(to_delete): # just being safe, should always exist + os.remove(to_delete) + +class UnixDomainSocketHandler(logging.Handler): + def __init__(self, formatter): + logging.Handler.__init__(self) + self.setFormatter(formatter) + self.pid = None + + self.zctx = None + self.sock = None + + def __del__(self): + self.close() + + def close(self): + if self.sock is not None: + self.sock.close() + if self.zctx is not None: + self.zctx.term() + + def connect(self): + self.zctx = zmq.Context() + self.sock = self.zctx.socket(zmq.PUSH) + self.sock.setsockopt(zmq.LINGER, 10) + self.sock.connect(Paths.swaglog_ipc()) + self.pid = os.getpid() + + def emit(self, record): + if os.getpid() != self.pid: + # TODO suppresses warning about forking proc with zmq socket, fix root cause + warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*") + self.connect() + + msg = self.format(record).rstrip('\n') + # print("SEND".format(repr(msg))) + try: + s = chr(record.levelno)+msg + self.sock.send(s.encode('utf8'), zmq.NOBLOCK) + except zmq.error.Again: + # drop :/ + pass + + +class ForwardingHandler(logging.Handler): + def __init__(self, target_logger): + super().__init__() + self.target_logger = target_logger + + def emit(self, record): + self.target_logger.handle(record) + + +def add_file_handler(log): + """ + Function to add the file log handler to swaglog. + This can be used to store logs when logmessaged is not running. + """ + handler = get_file_handler() + handler.setFormatter(SwagLogFileFormatter(log)) + log.addHandler(handler) + + +cloudlog = log = SwagLogger() +log.setLevel(logging.DEBUG) + + +class PrettyConsoleFormatter(logging.Formatter): + # StreamHandler writes to stderr, so tty-gate on that + _COLOR = sys.stderr.isatty() and os.environ.get('NO_COLOR') is None + + def format(self, record): + msg = record.getMessage() + if not self._COLOR: + return f"{record.filename}: {msg}" + lvl = record.levelno + if lvl >= 50: lc, ln = "\033[1;38;5;196m", "CRIT" + elif lvl >= 40: lc, ln = "\033[1;38;5;203m", " ERR" + elif lvl >= 30: lc, ln = "\033[38;5;214m", "WARN" + elif lvl >= 20: lc, ln = "\033[38;5;110m", "info" + else: lc, ln = "\033[38;5;244m", " dbg" + body = f"\033[1;38;5;210m{msg}\033[0m" if lvl >= 40 else msg + src = "" if record.filename == "(unknown file)" else f"\033[2m{record.filename}\033[0m " + return f"{lc}{ln:>4}\033[0m {src}{body}" + + +outhandler = logging.StreamHandler() +outhandler.setFormatter(PrettyConsoleFormatter()) + +print_level = os.environ.get('LOGPRINT', 'warning') +if print_level == 'debug': + outhandler.setLevel(logging.DEBUG) +elif print_level == 'info': + outhandler.setLevel(logging.INFO) +elif print_level == 'warning': + outhandler.setLevel(logging.WARNING) + +ipchandler = UnixDomainSocketHandler(SwagFormatter(log)) + +log.addHandler(outhandler) +# logs are sent through IPC before writing to disk to prevent disk I/O blocking +log.addHandler(ipchandler) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/time_helpers.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/time_helpers.py new file mode 100644 index 000000000..8564e270c --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/time_helpers.py @@ -0,0 +1,15 @@ +import datetime +from pathlib import Path + +MIN_DATE = datetime.datetime(year=2025, month=2, day=21) + +def min_date(): + # on systemd systems, the default time is the systemd build time + systemd_path = Path("/lib/systemd/systemd") + if systemd_path.exists(): + d = datetime.datetime.fromtimestamp(systemd_path.stat().st_mtime) + return max(MIN_DATE, d + datetime.timedelta(days=1)) + return MIN_DATE + +def system_time_valid(): + return datetime.datetime.now() > min_date() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/utils.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/utils.py new file mode 100644 index 000000000..e0aa1605d --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/common/utils.py @@ -0,0 +1,271 @@ +import io +import os +import tempfile +import contextlib +import subprocess +import time +import functools +from subprocess import Popen, PIPE, TimeoutExpired +import zstandard as zstd + +LOG_COMPRESSION_LEVEL = 10 # little benefit up to level 15. level ~17 is a small step change + +class Timer: + """Simple lap timer for profiling sequential operations.""" + + def __init__(self): + self._start = self._lap = time.monotonic() + self._sections = {} + + def lap(self, name): + now = time.monotonic() + self._sections[name] = now - self._lap + self._lap = now + + @property + def total(self): + return time.monotonic() - self._start + + def fmt(self, duration): + parts = ", ".join(f"{k}={v:.2f}s" + (f" ({duration/v:.0f}x)" if k == 'render' and v > 0 else "") for k, v in self._sections.items()) + total = self.total + realtime = f"{duration/total:.1f}x realtime" if total > 0 else "N/A" + return f"{duration}s in {total:.1f}s ({realtime}) | {parts}" + +def sudo_write(val: str, path: str) -> None: + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + os.system(f"sudo chmod a+w {path}") + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + # fallback for debugfs files + os.system(f"sudo su -c 'echo {val} > {path}'") + + +def sudo_read(path: str) -> str: + try: + return subprocess.check_output(f"sudo cat {path}", shell=True, encoding='utf8').strip() + except Exception: + return "" + + +class MovingAverage: + def __init__(self, window_size: int): + self.window_size: int = window_size + self.buffer: list[float] = [0.0] * window_size + self.index: int = 0 + self.count: int = 0 + self.sum: float = 0.0 + + def add_value(self, new_value: float): + # Update the sum: subtract the value being replaced and add the new value + self.sum -= self.buffer[self.index] + self.buffer[self.index] = new_value + self.sum += new_value + + # Update the index in a circular manner + self.index = (self.index + 1) % self.window_size + + # Track the number of added values (for partial windows) + self.count = min(self.count + 1, self.window_size) + + def get_average(self) -> float: + if self.count == 0: + return float('nan') + return self.sum / self.count + + +class CallbackReader: + """Wraps a file, but overrides the read method to also + call a callback function with the number of bytes read so far.""" + + def __init__(self, f, callback, *args): + self.f = f + self.callback = callback + self.cb_args = args + self.total_read = 0 + + def __getattr__(self, attr): + return getattr(self.f, attr) + + def read(self, *args, **kwargs): + chunk = self.f.read(*args, **kwargs) + self.total_read += len(chunk) + self.callback(*self.cb_args, self.total_read) + return chunk + + +@contextlib.contextmanager +def atomic_write(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None, + overwrite: bool = False): + """Write to a file atomically using a temporary file in the same directory as the destination file.""" + dir_name = os.path.dirname(path) + + if not overwrite and os.path.exists(path): + raise FileExistsError(f"File '{path}' already exists. To overwrite it, set 'overwrite' to True.") + + with tempfile.NamedTemporaryFile(mode=mode, buffering=buffering, encoding=encoding, newline=newline, dir=dir_name, delete=False) as tmp_file: + yield tmp_file + tmp_file_name = tmp_file.name + os.replace(tmp_file_name, path) + + +def get_upload_stream(filepath: str, should_compress: bool) -> tuple[io.BufferedIOBase, int]: + if not should_compress: + file_size = os.path.getsize(filepath) + file_stream = open(filepath, "rb") + return file_stream, file_size + + # Compress the file on the fly + compressed_stream = io.BytesIO() + compressor = zstd.ZstdCompressor(level=LOG_COMPRESSION_LEVEL) + + with open(filepath, "rb") as f: + compressor.copy_stream(f, compressed_stream) + compressed_size = compressed_stream.tell() + compressed_stream.seek(0) + return compressed_stream, compressed_size + + +# remove all keys that end in DEPRECATED +def strip_deprecated_keys(d): + for k in list(d.keys()): + if isinstance(k, str): + if k.endswith('DEPRECATED'): + d.pop(k) + elif isinstance(d[k], dict): + strip_deprecated_keys(d[k]) + return d + + +def run_cmd(cmd: list[str], cwd=None, env=None) -> str: + return subprocess.check_output(cmd, encoding='utf8', cwd=cwd, env=env).strip() + + +def run_cmd_default(cmd: list[str], default: str = "", cwd=None, env=None) -> str: + try: + return run_cmd(cmd, cwd=cwd, env=env) + except subprocess.CalledProcessError: + return default + + +@contextlib.contextmanager +def managed_proc(cmd: list[str], env: dict[str, str]): + proc = Popen(cmd, env=env, stdout=PIPE, stderr=PIPE) + try: + yield proc + finally: + if proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=5) + except TimeoutExpired: + proc.kill() + + +def tabulate(tabular_data, headers=(), tablefmt="simple", floatfmt="g", stralign="left", numalign=None): + rows = [list(row) for row in tabular_data] + + def fmt(val): + if isinstance(val, str): + return val + if isinstance(val, (bool, int)): + return str(val) + try: + return format(val, floatfmt) + except (TypeError, ValueError): + return str(val) + + formatted = [[fmt(c) for c in row] for row in rows] + hdrs = [str(h) for h in headers] if headers else None + + ncols = max((len(r) for r in formatted), default=0) + if hdrs: + ncols = max(ncols, len(hdrs)) + if ncols == 0: + return "" + + for r in formatted: + r.extend([""] * (ncols - len(r))) + if hdrs: + hdrs.extend([""] * (ncols - len(hdrs))) + + widths = [0] * ncols + if hdrs: + for i in range(ncols): + widths[i] = len(hdrs[i]) + for row in formatted: + for i in range(ncols): + widths[i] = max(widths[i], max(len(ln) for ln in row[i].split('\n'))) + + def _align(s, w): + if stralign == "center": + return s.center(w) + return s.ljust(w) + + if tablefmt == "html": + parts = [""] + if hdrs: + parts.append("") + parts.append("" + "".join(f"" for h in hdrs) + "") + parts.append("") + parts.append("") + for row in formatted: + parts.append("" + "".join(f"" for c in row) + "") + parts.append("") + parts.append("
{h}
{c}
") + return "\n".join(parts) + + if tablefmt == "simple_grid": + def _sep(left, mid, right): + return left + mid.join("─" * (w + 2) for w in widths) + right + + top, mid_sep, bot = _sep("┌", "â”Ŧ", "┐"), _sep("├", "â”ŧ", "┤"), _sep("└", "┴", "┘") + + def _fmt_row(cells): + split = [c.split('\n') for c in cells] + nlines = max(len(s) for s in split) + for s in split: + s.extend([""] * (nlines - len(s))) + return ["│" + "│".join(f" {_align(split[i][li], widths[i])} " for i in range(ncols)) + "│" for li in range(nlines)] + + lines = [top] + if hdrs: + lines.extend(_fmt_row(hdrs)) + lines.append(mid_sep) + for ri, row in enumerate(formatted): + lines.extend(_fmt_row(row)) + lines.append(mid_sep if ri < len(formatted) - 1 else bot) + return "\n".join(lines) + + gap = " " + lines = [] + if hdrs: + lines.append(gap.join(h.ljust(w) for h, w in zip(hdrs, widths, strict=True))) + lines.append(gap.join("-" * w for w in widths)) + for row in formatted: + lines.append(gap.join(_align(row[i], widths[i]) for i in range(ncols))) + return "\n".join(lines) + + +def retry(attempts=3, delay=1.0, ignore_failure=False): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + for _ in range(attempts): + try: + return func(*args, **kwargs) + except Exception: + print(f"{func.__name__} failed, trying again") + time.sleep(delay) + + if ignore_failure: + print(f"{func.__name__} failed after retry") + else: + raise Exception(f"{func.__name__} failed after retry") + return wrapper + return decorator diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/konn3kt/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/konn3kt/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py new file mode 100644 index 000000000..2897609eb --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py @@ -0,0 +1,17 @@ +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + + +import os +from iqpilot.common.api.base import BaseApi +API_HOST = os.getenv('KONN3KT_API_HOST', 'https://api-iqlabs.konn3kt.com') + +class Konn3ktApi(BaseApi): + + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "konn3kt-device-" + + def get_token(self, expiry_hours=1): + return super()._get_token(expiry_hours=expiry_hours) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/konn3kt/registration.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/konn3kt/registration.py new file mode 100644 index 000000000..1ef907dd9 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/konn3kt/registration.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +import os +import time +import json +import jwt +import re +import secrets +from typing import cast +from pathlib import Path + +from datetime import datetime, timedelta, UTC +from iqpilot.common.api import api_get, get_key_pair +from iqpilot.common.params import Params +from iqpilot.common.spinner import Spinner +from iqpilot.system.hardware import HARDWARE, PC +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog + + +UNREGISTERED_DONGLE_ID = "UnregisteredDevice" + +_DONGLE_ID_RE = re.compile(r"^[a-fA-F0-9]{16}$") +IMEI_WAIT_TIMEOUT = 15.0 + + +def _read_persist_dongle_id() -> str | None: + p = Path(Paths.persist_root()) / "comma" / "dongle_id" + try: + if not p.is_file(): + return None + s = p.read_text().strip() + return s or None + except Exception: + cloudlog.exception("failed to read persist dongle_id") + return None + + +def get_cached_dongle_id(params: Params | None = None, prefer_readonly: bool = True) -> str | None: + ro = _read_persist_dongle_id() + if is_valid_dongle_id(ro): + ro = ro.lower() + if prefer_readonly and ro: + return ro + p = Params() if params is None else params + v = p.get("DongleId") + if v and v != UNREGISTERED_DONGLE_ID: + return v.lower() if is_valid_dongle_id(v) else v + return ro or None +def is_valid_dongle_id(dongle_id: str | None) -> bool: + return bool(dongle_id and _DONGLE_ID_RE.fullmatch(dongle_id)) +def get_or_create_dongle_id(params: Params | None = None, prefer_readonly: bool = True) -> str: + p = Params() if params is None else params + dongle_id = get_cached_dongle_id(p, prefer_readonly=prefer_readonly) + if dongle_id and dongle_id != UNREGISTERED_DONGLE_ID: + return dongle_id + dongle_id = secrets.token_hex(8) + p.put("DongleId", dongle_id) + cloudlog.warning(f"generated new DongleId={dongle_id} (no readonly dongle_id found)") + return dongle_id +def ensure_dev_pairing_identity(params: Params | None = None, force_reset: bool = False) -> dict[str, str]: + p = Params() if params is None else params + + persist_dir = Path(Paths.persist_root()) / "comma" + persist_dir.mkdir(parents=True, exist_ok=True) + + dongle_path = persist_dir / "dongle_id" + priv_path = persist_dir / "id_rsa" + pub_path = persist_dir / "id_rsa.pub" + + if force_reset: + for fp in (dongle_path, priv_path, pub_path): + try: + fp.unlink(missing_ok=True) + except Exception: + cloudlog.exception(f"failed to remove {fp}") + try: + (persist_dir / "konn3kt_prime_type").unlink(missing_ok=True) + except Exception: + pass + try: + p.remove("PrimeType") + except Exception: + pass + forced_dongle = os.getenv("KONN3KT_DEV_DONGLE_ID") + dongle_id = forced_dongle.strip().lower() if forced_dongle else None + if dongle_id and not is_valid_dongle_id(dongle_id): + cloudlog.error("KONN3KT_DEV_DONGLE_ID must be 16 hex chars") + dongle_id = None + if dongle_id is None: + existing = None + try: + existing = dongle_path.read_text().strip().lower() if dongle_path.is_file() else None + except Exception: + cloudlog.exception("failed reading existing dev dongle_id") + dongle_id = existing if is_valid_dongle_id(existing) else secrets.token_hex(8) + try: + dongle_path.write_text(dongle_id) + except Exception: + cloudlog.exception("failed writing dev dongle_id") + p.put("DongleId", dongle_id) + p.put("HardwareSerial", p.get("HardwareSerial") or f"DEV-{dongle_id}") + if force_reset or (not priv_path.is_file()) or (not pub_path.is_file()): + try: + from cryptography.hazmat.primitives import serialization + from cryptography.hazmat.primitives.asymmetric import rsa + key = rsa.generate_private_key(public_exponent=65537, key_size=2048) + priv_bytes = key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption(), + ) + pub_bytes = key.public_key().public_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PublicFormat.SubjectPublicKeyInfo, + ) + priv_path.write_bytes(priv_bytes) + pub_path.write_bytes(pub_bytes) + except Exception: + cloudlog.exception("failed generating dev RSA keys") + raise + return { + "dongle_id": dongle_id, + "serial": p.get("HardwareSerial") or f"DEV-{dongle_id}", + "persist_dir": str(persist_dir), + } +def is_registered_device() -> bool: + dongle = Params().get("DongleId") + return dongle not in (None, UNREGISTERED_DONGLE_ID) + + +def _normalize_imei(value: str | None) -> str: + return value or "" + + +def get_registration_identifiers(wait_timeout: float = IMEI_WAIT_TIMEOUT, show_spinner: bool = False) -> tuple[str, str, str]: + serial = HARDWARE.get_serial() + spinner = Spinner() if show_spinner else None + start_time = time.monotonic() + imei1: str | None = None + imei2: str | None = None + + while time.monotonic() - start_time < wait_timeout: + try: + imei1, imei2 = HARDWARE.get_imei(0), HARDWARE.get_imei(1) + if imei1 or imei2: + break + except RuntimeError as e: + if "no modems" in str(e).lower(): + cloudlog.warning("No cellular modem available, proceeding without IMEI") + break + cloudlog.exception("Error getting imei, trying again...") + except Exception: + cloudlog.exception("Error getting imei, trying again...") + time.sleep(1) + + imei1 = _normalize_imei(imei1) + imei2 = _normalize_imei(imei2) + + if not imei1 and not imei2: + cloudlog.warning(f"proceeding with serial-only registration for serial={serial}") + if spinner is not None: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1 or None}, {imei2 or None})") + spinner.close() + + return serial, imei1, imei2 + + +def register(show_spinner=False) -> str | None: + params = Params() + + dongle_id: str | None = get_cached_dongle_id(params, prefer_readonly=True) + if dongle_id in ("", UNREGISTERED_DONGLE_ID): + dongle_id = None + + jwt_algo, private_key, public_key = get_key_pair() + + if not public_key: + dongle_id = UNREGISTERED_DONGLE_ID + cloudlog.warning("missing public key") + elif dongle_id is None: + if show_spinner: + spinner = Spinner() + spinner.update("registering device") + + serial, imei1, imei2 = get_registration_identifiers(wait_timeout=IMEI_WAIT_TIMEOUT, show_spinner=False) + + backoff = 0 + start_time = time.monotonic() + while True: + try: + register_token = jwt.encode({'register': True, 'exp': datetime.now(UTC).replace(tzinfo=None) + timedelta(hours=1)}, + cast(str, private_key), algorithm=jwt_algo) + cloudlog.info("getting pilotauth") + cloudlog.info("getting pilotauth") + resp = api_get("v2/pilotauth/", method='POST', timeout=15, + imei=imei1, imei2=imei2, serial=serial, public_key=public_key, register_token=register_token) + + if resp.status_code in (400, 402, 403): + cloudlog.info(f"Unable to register device, got {resp.status_code}") + dongle_id = UNREGISTERED_DONGLE_ID + else: + dongleauth = json.loads(resp.text) + dongle_id = dongleauth["dongle_id"] + break + except Exception: + cloudlog.exception("failed to authenticate") + backoff = min(backoff + 1, 15) + time.sleep(backoff) + + if time.monotonic() - start_time > 60 and show_spinner: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") + return UNREGISTERED_DONGLE_ID + + if show_spinner: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1 or None}, {imei2 or None})") + spinner.close() + + if dongle_id: + params.put("DongleId", dongle_id) + from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert + set_offroad_alert("Offroad_UnregisteredHardware", False) + return dongle_id + + +if __name__ == "__main__": + print(register()) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/desire_helper.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/desire_helper.py new file mode 100644 index 000000000..ce77ab134 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/desire_helper.py @@ -0,0 +1,294 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +from iqpilot.cereal import car, custom, log + +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.controls.lib.helpers.lane_change import ( + IQLaneSwapController, + AutoLaneChangeMode, + NavExitLaneChangeController, +) +from iqpilot.selfdrive.controls.lib.helpers.lateral_edge_guard import LateralEdgeGuard +from iqpilot.selfdrive.controls.lib.helpers.lane_turn import IQNavTurnController + +LaneChangeState = log.LaneChangeState +LaneChangeDirection = log.LaneChangeDirection +TurnDirection = custom.IQTurnSignalDirection +LateralEdgeBlock = custom.IQLateralEdgeBlock +NavManeuverPhase = custom.IQNavState.ManeuverPhase + +LANE_CHANGE_SPEED_MIN = 20 * CV.MPH_TO_MS +LANE_CHANGE_TIME_MAX = 10.0 +TURN_DESIRE_STOP_HOLD_TIME = 3.4 +TURN_DESIRE_STOP_GAP_TIME = 0.2 +TURN_DESIRE_STOP_CYCLE_TIME = TURN_DESIRE_STOP_HOLD_TIME + TURN_DESIRE_STOP_GAP_TIME +TURN_DESIRE_CYCLE_SPEED_MAX = 5 * CV.MPH_TO_MS +TURN_DESIRE_COMMIT_YAW_RATE = 0.08 + +_LANE_CHANGE_DESIRES = { + (LaneChangeDirection.none, LaneChangeState.off): log.Desire.none, + (LaneChangeDirection.none, LaneChangeState.preLaneChange): log.Desire.none, + (LaneChangeDirection.none, LaneChangeState.laneChangeStarting): log.Desire.none, + (LaneChangeDirection.none, LaneChangeState.laneChangeFinishing): log.Desire.none, + (LaneChangeDirection.left, LaneChangeState.off): log.Desire.none, + (LaneChangeDirection.left, LaneChangeState.preLaneChange): log.Desire.none, + (LaneChangeDirection.left, LaneChangeState.laneChangeStarting): log.Desire.laneChangeLeft, + (LaneChangeDirection.left, LaneChangeState.laneChangeFinishing): log.Desire.laneChangeLeft, + (LaneChangeDirection.right, LaneChangeState.off): log.Desire.none, + (LaneChangeDirection.right, LaneChangeState.preLaneChange): log.Desire.none, + (LaneChangeDirection.right, LaneChangeState.laneChangeStarting): log.Desire.laneChangeRight, + (LaneChangeDirection.right, LaneChangeState.laneChangeFinishing): log.Desire.laneChangeRight, +} + +_TURN_DESIRES = { + TurnDirection.none: log.Desire.none, + TurnDirection.turnLeft: log.Desire.turnLeft, + TurnDirection.turnRight: log.Desire.turnRight, +} + +_STOP_CYCLING_TURN_DESIRES = { + log.Desire.turnLeft, + log.Desire.turnRight, +} + + +def turn_desire(turn_direction) -> log.Desire: + return _TURN_DESIRES[getattr(turn_direction, "raw", turn_direction)] + + +def _direction_from_blinkers(carstate) -> int: + if carstate.leftBlinker: + return LaneChangeDirection.left + if carstate.rightBlinker: + return LaneChangeDirection.right + return LaneChangeDirection.none + + +def _steering_nudge_matches(carstate, direction: int) -> bool: + if not carstate.steeringPressed: + return False + return ( + (direction == LaneChangeDirection.left and carstate.steeringTorque > 0) or + (direction == LaneChangeDirection.right and carstate.steeringTorque < 0) + ) + + +def _blindspot_matches(carstate, direction: int) -> bool: + return ( + (direction == LaneChangeDirection.left and carstate.leftBlindspot) or + (direction == LaneChangeDirection.right and carstate.rightBlindspot) + ) + + +def _read_enable_bsm() -> bool: + try: + with car.CarParams.from_bytes(Params().get("CarParams")) as cp: + return bool(cp.enableBsm) + except Exception: + return False + + +class DesireHelper: + def __init__(self): + self.lane_change_state = LaneChangeState.off + self.lane_change_direction = LaneChangeDirection.none + self.lane_change_timer = 0.0 + self.lane_change_ll_prob = 1.0 + self.prev_one_blinker = False + self.prev_nav_exit_active = False + self.desire = log.Desire.none + + self.alc = IQLaneSwapController(self) + self.lane_turn_controller = IQNavTurnController(self) + self.nav_exit = NavExitLaneChangeController(_read_enable_bsm()) + self.lateral_edge_guard = LateralEdgeGuard() + self.lateral_edge_block = LateralEdgeBlock.none + self.lane_turn_direction = TurnDirection.none + self.nav_turn_direction = TurnDirection.none + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + self.turn_desire_cycle_input = log.Desire.none + self.turn_desire_committed = False + + @staticmethod + def get_lane_change_direction(carstate): + return _direction_from_blinkers(carstate) + + @staticmethod + def _nav_turn_desire(nav_state): + if nav_state is None or not getattr(nav_state, "active", False): + return TurnDirection.none + if getattr(nav_state, "maneuverPhase", NavManeuverPhase.none) != NavManeuverPhase.turnActive: + return TurnDirection.none + if not getattr(nav_state, "shouldSendTurnDesire", False): + return TurnDirection.none + return getattr(nav_state, "turnDesireDirection", TurnDirection.none) + + def _clear_lane_change(self) -> None: + self.lane_change_state = LaneChangeState.off + self.lane_change_direction = LaneChangeDirection.none + + def _refresh_turn_overrides(self, carstate, nav_state) -> bool: + speed_mps = carstate.vEgo + self.lane_turn_controller.update_params() + self.lane_turn_controller.update_lane_turn( + blindspot_left=carstate.leftBlindspot, + blindspot_right=carstate.rightBlindspot, + left_blinker=carstate.leftBlinker, + right_blinker=carstate.rightBlinker, + v_ego=speed_mps, + ) + self.lane_turn_direction = self.lane_turn_controller.get_turn_direction() + self.nav_turn_direction = self._nav_turn_desire(nav_state) + + self.nav_exit.update_params() + self.nav_exit.update(nav_state, carstate) + return bool(self.nav_exit.active) + + def _reset_required(self, lateral_active: bool, nav_exit_active: bool) -> bool: + timed_out = self.lane_change_timer > LANE_CHANGE_TIME_MAX + feature_disabled = self.alc.lane_change_set_timer == AutoLaneChangeMode.OFF and not nav_exit_active + return (not lateral_active) or timed_out or feature_disabled + + def _begin_from_idle(self, one_blinker: bool, nav_exit_active: bool, below_speed: bool) -> None: + if below_speed: + return + if one_blinker and not self.prev_one_blinker: + self.lane_change_state = LaneChangeState.preLaneChange + self.lane_change_direction = _direction_from_blinkers(self._last_carstate) + self.lane_change_ll_prob = 1.0 + return + if nav_exit_active and not self.prev_nav_exit_active: + self.lane_change_state = LaneChangeState.preLaneChange + self.lane_change_direction = self.nav_exit.direction + self.lane_change_ll_prob = 1.0 + + def _refresh_requested_direction(self, one_blinker: bool, nav_exit_active: bool) -> None: + if one_blinker: + self.lane_change_direction = _direction_from_blinkers(self._last_carstate) + elif nav_exit_active: + self.lane_change_direction = self.nav_exit.direction + + def _step_pre_lane_change(self, one_blinker: bool, nav_exit_active: bool, below_speed: bool) -> None: + self._refresh_requested_direction(one_blinker, nav_exit_active) + blindspot_detected = _blindspot_matches(self._last_carstate, self.lane_change_direction) + self.lateral_edge_block = self.lateral_edge_guard.block_for_direction(self.lane_change_direction) + lateral_edge_blocked = self.lateral_edge_block != LateralEdgeBlock.none + steering_ready = _steering_nudge_matches(self._last_carstate, self.lane_change_direction) + nav_auto_start = nav_exit_active and self.nav_exit.auto_allowed + + self.alc.update_lane_change(blindspot_detected=blindspot_detected, brake_pressed=self._last_carstate.brakePressed) + allowed_to_launch = steering_ready or self.alc.auto_lane_change_allowed or nav_auto_start + + if (not (one_blinker or nav_exit_active)) or below_speed: + self._clear_lane_change() + elif allowed_to_launch and not blindspot_detected and not lateral_edge_blocked: + self.lane_change_state = LaneChangeState.laneChangeStarting + + def _step_lane_change_starting(self, lane_change_prob: float) -> None: + self.lane_change_ll_prob = max(self.lane_change_ll_prob - (2.0 * DT_MDL), 0.0) + if lane_change_prob < 0.02 and self.lane_change_ll_prob < 0.01: + self.lane_change_state = LaneChangeState.laneChangeFinishing + + def _step_lane_change_finishing(self, one_blinker: bool) -> None: + self.lane_change_ll_prob = min(self.lane_change_ll_prob + DT_MDL, 1.0) + if self.lane_change_ll_prob <= 0.99: + return + self.lane_change_direction = LaneChangeDirection.none + self.lane_change_state = LaneChangeState.preLaneChange if one_blinker else LaneChangeState.off + + def _advance_lane_change_machine(self, one_blinker: bool, nav_exit_active: bool, below_speed: bool, lane_change_prob: float) -> None: + if self.lane_change_state == LaneChangeState.off: + self._begin_from_idle(one_blinker, nav_exit_active, below_speed) + return + if self.lane_change_state == LaneChangeState.preLaneChange: + self._step_pre_lane_change(one_blinker, nav_exit_active, below_speed) + return + if self.lane_change_state == LaneChangeState.laneChangeStarting: + self._step_lane_change_starting(lane_change_prob) + return + if self.lane_change_state == LaneChangeState.laneChangeFinishing: + self._step_lane_change_finishing(one_blinker) + + def _update_timer(self) -> None: + if self.lane_change_state in (LaneChangeState.off, LaneChangeState.preLaneChange): + self.lane_change_timer = 0.0 + else: + self.lane_change_timer += DT_MDL + + def _clear_turn_desire_stop_cycle(self) -> None: + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + self.turn_desire_cycle_input = log.Desire.none + self.turn_desire_committed = False + + def _cycle_turn_desire_when_stopped(self, desired_output: log.Desire) -> log.Desire: + if desired_output not in _STOP_CYCLING_TURN_DESIRES: + self._clear_turn_desire_stop_cycle() + return desired_output + + if desired_output != self.turn_desire_cycle_input: + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + self.turn_desire_cycle_input = desired_output + self.turn_desire_committed = False + + if abs(getattr(self._last_carstate, "yawRate", 0.0)) >= TURN_DESIRE_COMMIT_YAW_RATE: + self.turn_desire_committed = True + + if self.turn_desire_committed: + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + return desired_output + + if self._last_carstate.vEgo > TURN_DESIRE_CYCLE_SPEED_MAX: + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + return desired_output + + if not self.turn_desire_stop_active: + self.turn_desire_stop_active = True + self.turn_desire_stop_timer = 0.0 + + cycle_phase = self.turn_desire_stop_timer % TURN_DESIRE_STOP_CYCLE_TIME + self.turn_desire_stop_timer += DT_MDL + if cycle_phase >= TURN_DESIRE_STOP_HOLD_TIME: + return log.Desire.none + return desired_output + + def _pick_desire_output(self) -> None: + desired_output = log.Desire.none + if self.nav_turn_direction != TurnDirection.none: + desired_output = turn_desire(self.nav_turn_direction) + elif self.lane_turn_direction != TurnDirection.none: + desired_output = turn_desire(self.lane_turn_direction) + else: + desired_output = _LANE_CHANGE_DESIRES[(self.lane_change_direction, self.lane_change_state)] + + self.desire = self._cycle_turn_desire_when_stopped(desired_output) + + def update(self, carstate, lateral_active, lane_change_prob, nav_state=None, modeldata=None, radar_state=None): + self._last_carstate = carstate + self.lateral_edge_guard.update(modeldata, carstate.vEgo, DT_MDL) + self.lateral_edge_block = LateralEdgeBlock.none + one_blinker = carstate.leftBlinker != carstate.rightBlinker + below_speed = carstate.vEgo < LANE_CHANGE_SPEED_MIN + nav_exit_active = self._refresh_turn_overrides(carstate, nav_state) + + self.alc.update_params() + if self._reset_required(lateral_active, nav_exit_active): + self._clear_lane_change() + else: + self._advance_lane_change_machine(one_blinker, nav_exit_active, below_speed, lane_change_prob) + + self._update_timer() + self.prev_one_blinker = one_blinker and lateral_active + self.prev_nav_exit_active = nav_exit_active + self.alc.update_state() + self._pick_desire_output() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/drive_helpers.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/drive_helpers.py new file mode 100644 index 000000000..c89027b03 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/drive_helpers.py @@ -0,0 +1,80 @@ +import numpy as np +from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY +from iqpilot.common.realtime import DT_CTRL, DT_MDL + +MIN_SPEED = 1.0 +CONTROL_N = 17 +CAR_ROTATION_RADIUS = 0.0 +# This is a turn radius smaller than most cars can achieve +MAX_CURVATURE = 0.4 +MAX_VEL_ERR = 5.0 # m/s + +MAX_LATERAL_JERK = 5.0 # m/s^3 +MAX_LATERAL_ACCEL_NO_ROLL = 5.0 # m/s^2 +MAX_LATERAL_ACCEL_NO_ROLL_OVERRIDE = 5.0 # m/s^2 +DEFAULT_STOPPING_SPEED = 0.25 # m/s + + +def should_stop(v_ego: float, a_target: float, stopping_speed: float = DEFAULT_STOPPING_SPEED) -> bool: + return bool(v_ego < stopping_speed and a_target < 0.1) + + +def clamp(val, min_val, max_val): + clamped_val = float(np.clip(val, min_val, max_val)) + return clamped_val, clamped_val != val + +def smooth_value(val, prev_val, tau, dt=DT_MDL): + alpha = 1 - np.exp(-dt/tau) if tau > 0 else 1 + return alpha * val + (1 - alpha) * prev_val + +# "Model smoothing": when the policy's own predicted uncertainty (plan_stds) for the +# 1s-ahead lateral position spikes, temporarily lengthen the desiredCurvature smoothing +# time constant so a noisy/uncertain model output doesn't jerk the wheel. +MODEL_SMOOTHING_STD_LOW = 0.15 # m, plan y_std at 1s below which no extra smoothing is added +MODEL_SMOOTHING_STD_HIGH = 0.25 # m, plan y_std at 1s at/above which the full max_extra_seconds is added +MODEL_SMOOTHING_MAX_TOTAL_SEC = 0.60 # hard ceiling on base + dynamic lat smoothing seconds + +def dynamic_lat_smooth_extra_seconds(y_std_1s: float, max_extra_seconds: float) -> float: + if max_extra_seconds <= 0.0: + return 0.0 + return float(np.interp(y_std_1s, [MODEL_SMOOTHING_STD_LOW, MODEL_SMOOTHING_STD_HIGH], [0.0, max_extra_seconds])) + +def clip_curvature(v_ego, prev_curvature, new_curvature, roll, override=False) -> tuple[float, bool]: + # This function respects ISO lateral jerk and acceleration limits + a max curvature + v_ego = max(v_ego, MIN_SPEED) + max_curvature_rate = MAX_LATERAL_JERK / (v_ego ** 2) # inexact calculation, check https://github.com/commaai/openpilot/pull/24755 + new_curvature = np.clip(new_curvature, + prev_curvature - max_curvature_rate * DT_CTRL, + prev_curvature + max_curvature_rate * DT_CTRL) + + max_lat_accel_no_roll = MAX_LATERAL_ACCEL_NO_ROLL_OVERRIDE if override else MAX_LATERAL_ACCEL_NO_ROLL + roll_compensation = roll * ACCELERATION_DUE_TO_GRAVITY + max_lat_accel = max_lat_accel_no_roll + roll_compensation + min_lat_accel = -max_lat_accel_no_roll + roll_compensation + new_curvature, limited_accel = clamp(new_curvature, min_lat_accel / v_ego ** 2, max_lat_accel / v_ego ** 2) + + new_curvature, limited_max_curv = clamp(new_curvature, -MAX_CURVATURE, MAX_CURVATURE) + return float(new_curvature), limited_accel or limited_max_curv + + +def get_accel_from_plan(speeds, accels, t_idxs, action_t=DT_MDL, stopping_speed=DEFAULT_STOPPING_SPEED): + if len(speeds) == len(t_idxs): + v_now = speeds[0] + a_now = accels[0] + v_target = np.interp(action_t, t_idxs, speeds) + a_target = 2 * (v_target - v_now) / (action_t) - a_now + else: + v_now = 0.0 + v_target = 0.0 + a_target = 0.0 + return a_target, should_stop(v_now, a_target, stopping_speed) + +def curv_from_psis(psi_target, psi_rate, vego, action_t): + vego = np.clip(vego, MIN_SPEED, np.inf) + curv_from_psi = psi_target / (vego * action_t) + return 2*curv_from_psi - psi_rate / vego + +def get_curvature_from_plan(yaws, yaw_rates, t_idxs, vego, action_t): + psi_target = np.interp(action_t, t_idxs, yaws) + psi_rate = yaw_rates[0] + return curv_from_psis(psi_target, psi_rate, vego, action_t) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lane_change.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lane_change.py new file mode 100644 index 000000000..58d826647 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lane_change.py @@ -0,0 +1,293 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.cereal import custom, log + +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL + +NAV_EXIT_COMMIT_DISTANCE = 500.0 # m before a route exit to begin moving into the exit lane +_ManeuverType = custom.IQNavState.ManeuverType +_NavDirection = custom.NavDirection + + +class LaneSwapPreset: + DISABLED = -1 + STEERING_NUDGE = 0 + DIRECT = 1 + DELAY_HALF = 2 + DELAY_ONE = 3 + DELAY_TWO = 4 + DELAY_THREE = 5 + OFF = DISABLED + NUDGE = STEERING_NUDGE + NUDGELESS = DIRECT + HALF_SECOND = DELAY_HALF + ONE_SECOND = DELAY_ONE + TWO_SECONDS = DELAY_TWO + THREE_SECONDS = DELAY_THREE + + +PRESET_SECONDS = { + LaneSwapPreset.DISABLED: 0.0, + LaneSwapPreset.STEERING_NUDGE: 0.0, + LaneSwapPreset.DIRECT: 0.05, + LaneSwapPreset.DELAY_HALF: 0.5, + LaneSwapPreset.DELAY_ONE: 1.0, + LaneSwapPreset.DELAY_TWO: 2.0, + LaneSwapPreset.DELAY_THREE: 3.0, +} + +LANE_SWAP_SECONDS = dict(PRESET_SECONDS) +BLINDSPOT_WAIT_OFFSET = -1 + + +class LaneSwapEngine: + def __init__(self, desire_hub): + self._hub = desire_hub + self._kv = Params() + self._mem = { + "sec": 0.0, + "tick": 0, + "gate": 0.0, + "preset": self._kv.get("IQLaneChangeTimer", return_default=True), + "bsm_hold": False, + "braked": False, + "ready": False, + "used": False, + } + self.reload_setup() + + def _pull_setup(self) -> None: + self._mem["bsm_hold"] = self._kv.get_bool("IQLaneChangeBsmDelay") + self._mem["preset"] = self._kv.get("IQLaneChangeTimer", return_default=True) + + def _idle_phase(self) -> bool: + return ( + self._hub.lane_change_state == log.LaneChangeState.off and + self._hub.lane_change_direction == log.LaneChangeDirection.none + ) + + def _seconds_for_preset(self) -> float: + picked = self._mem["preset"] + return PRESET_SECONDS.get(picked, PRESET_SECONDS[LaneSwapPreset.STEERING_NUDGE]) + + def _auto_preset_active(self) -> bool: + picked = self._mem["preset"] + return picked not in (LaneSwapPreset.DISABLED, LaneSwapPreset.STEERING_NUDGE) + + def _advance_clock(self, blindspot_now: bool) -> None: + wait_s = self._seconds_for_preset() + self._mem["gate"] = wait_s + self._mem["sec"] += DT_MDL + if self._mem["bsm_hold"] and blindspot_now and wait_s > 0.0: + if wait_s == PRESET_SECONDS[LaneSwapPreset.DIRECT]: + self._mem["sec"] = BLINDSPOT_WAIT_OFFSET + else: + self._mem["sec"] = wait_s + BLINDSPOT_WAIT_OFFSET + + def _ready_to_fire(self) -> bool: + return ( + self._auto_preset_active() and + (not self._mem["braked"]) and + (not self._mem["used"]) and + (self._mem["sec"] > self._mem["gate"]) + ) + + def reload_setup(self) -> None: + self._pull_setup() + + def heartbeat(self) -> None: + if (self._mem["tick"] % 50) == 0: + self._pull_setup() + self._mem["tick"] += 1 + + def sample(self, blindspot_now: bool = False, brake_now: bool = False, **legacy) -> None: + blindspot_now = bool(legacy.get("blindspot_detected", blindspot_now)) + brake_now = bool(legacy.get("brake_pressed", brake_now)) + self._mem["braked"] = self._mem["braked"] or brake_now + self._advance_clock(blindspot_now) + self._mem["ready"] = self._ready_to_fire() + + def finalize(self) -> None: + started = self._hub.lane_change_state == log.LaneChangeState.laneChangeStarting + self._mem["used"] = self._mem["used"] or started + if self._idle_phase(): + self._mem["sec"] = 0.0 + self._mem["braked"] = False + self._mem["used"] = False + + @property + def ready(self): + return self._mem["ready"] + + @property + def delay(self): + return self._mem["gate"] + + @property + def elapsed(self): + return self._mem["sec"] + + @property + def preset(self): + return self._mem["preset"] + + @preset.setter + def preset(self, value): + self._mem["preset"] = value + + @property + def bsm_hold(self): + return self._mem["bsm_hold"] + + @bsm_hold.setter + def bsm_hold(self, value): + self._mem["bsm_hold"] = bool(value) + + @property + def braked(self): + return self._mem["braked"] + + @braked.setter + def braked(self, value): + self._mem["braked"] = bool(value) + + @property + def used(self): + return self._mem["used"] + + @used.setter + def used(self, value): + self._mem["used"] = bool(value) + + +class NavExitLaneChangeController: + def __init__(self, enable_bsm: bool): + self._params = Params() + self._enable_bsm = bool(enable_bsm) + self.enabled = self._read_enabled() + self._tick = 0 + self.active = False + self.direction = log.LaneChangeDirection.none + self.auto_allowed = False + + def _read_enabled(self) -> bool: + try: + return self._params.get_bool("NavExitLaneChange") + except Exception: + return False + + def update_params(self) -> None: + if self._tick % 50 == 0: + self.enabled = self._read_enabled() + self._tick += 1 + + @staticmethod + def _raw(value): + return getattr(value, "raw", value) + + def update(self, nav_state, carstate) -> None: + self.active = False + self.direction = log.LaneChangeDirection.none + self.auto_allowed = False + + if not self.enabled or nav_state is None or not getattr(nav_state, "active", False): + return + if not getattr(nav_state, "nextManeuverValid", False): + return + if self._raw(getattr(nav_state, "nextManeuverType", _ManeuverType.none)) != int(_ManeuverType.exit): + return + distance = float(getattr(nav_state, "nextManeuverDistance", 0.0)) + if not 0.0 < distance <= NAV_EXIT_COMMIT_DISTANCE: + return + + direction = self._raw(getattr(nav_state, "nextManeuverDirection", _NavDirection.none)) + if direction == int(_NavDirection.left): + self.direction = log.LaneChangeDirection.left + elif direction == int(_NavDirection.right): + self.direction = log.LaneChangeDirection.right + else: + return + + self.active = True + blindspot = carstate.leftBlindspot if self.direction == log.LaneChangeDirection.left else carstate.rightBlindspot + self.auto_allowed = (not blindspot) if self._enable_bsm else False + + +AutoLaneChangeMode = LaneSwapPreset +AUTO_LANE_CHANGE_TIMER = LANE_SWAP_SECONDS +ONE_SECOND_DELAY = BLINDSPOT_WAIT_OFFSET + + +class IQLaneSwapController(LaneSwapEngine): + def __init__(self, desire_helper): + super().__init__(desire_helper) + + def reset(self) -> None: + self.finalize() + + def update_params(self) -> None: + self.heartbeat() + + def update_lane_change(self, blindspot_detected: bool, brake_pressed: bool) -> None: + self.sample(blindspot_now=blindspot_detected, brake_now=brake_pressed) + + def update_state(self) -> None: + self.finalize() + + @property + def lane_change_wait_timer(self): + return self.elapsed + + @lane_change_wait_timer.setter + def lane_change_wait_timer(self, value): + self._mem["sec"] = float(value) + + @property + def lane_change_delay(self): + return self.delay + + @lane_change_delay.setter + def lane_change_delay(self, value): + self._mem["gate"] = float(value) + + @property + def lane_change_set_timer(self): + return self.preset + + @lane_change_set_timer.setter + def lane_change_set_timer(self, value): + self.preset = value + + @property + def lane_change_bsm_delay(self): + return self.bsm_hold + + @lane_change_bsm_delay.setter + def lane_change_bsm_delay(self, value): + self.bsm_hold = value + + @property + def prev_brake_pressed(self): + return self.braked + + @prev_brake_pressed.setter + def prev_brake_pressed(self, value): + self.braked = value + + @property + def auto_lane_change_allowed(self): + return self.ready + + @auto_lane_change_allowed.setter + def auto_lane_change_allowed(self, value): + self._mem["ready"] = bool(value) + + @property + def prev_lane_change(self): + return self.used + + @prev_lane_change.setter + def prev_lane_change(self, value): + self.used = value diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py new file mode 100644 index 000000000..dd1c0598e --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py @@ -0,0 +1,157 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +from dataclasses import dataclass + +from iqpilot.cereal import custom + +from iqpilot.common.constants import CV +from iqpilot.common.params import Params + +TurnDirection = custom.IQTurnSignalDirection + +TURN_TRIGGER_MPS = 20 * CV.MPH_TO_MS +TURN_SPEED_GATE_MPS = TURN_TRIGGER_MPS +LANE_CHANGE_SPEED_MIN = TURN_SPEED_GATE_MPS + + +@dataclass +class _TurnGateState: + active: bool = False + speed_limit_mps: float = TURN_TRIGGER_MPS + outcome: int = TurnDirection.none + refresh_tick: int = 0 + + +def _mph_param_to_mps(raw_value) -> float: + try: + return float(raw_value) * CV.MPH_TO_MS + except (TypeError, ValueError): + return TURN_TRIGGER_MPS + + +def _resolve_signal_choice(speed_mps: float, + speed_limit_mps: float, + left_signal: bool, + right_signal: bool, + left_blocked: bool, + right_blocked: bool) -> int: + if speed_mps >= speed_limit_mps: + return TurnDirection.none + if left_signal and not right_signal and not left_blocked: + return TurnDirection.turnLeft + if right_signal and not left_signal and not right_blocked: + return TurnDirection.turnRight + return TurnDirection.none + + +class TurnSignalPlanner: + _REFRESH_STRIDE = 50 + + def __init__(self, desire_hub): + self._desire_hub = desire_hub + self._params = Params() + self._state = _TurnGateState() + self.reload_setup() + + def _refresh_from_params(self) -> None: + requested_gate = _mph_param_to_mps(self._params.get("IQLaneTurnValue", return_default=True)) + self._state.active = self._params.get_bool("IQLaneTurnDesire") + self._state.speed_limit_mps = min(TURN_TRIGGER_MPS, requested_gate) + + def _consume_legacy_kwargs(self, **legacy) -> tuple[bool, bool, bool, bool, float]: + return ( + bool(legacy.get("blindspot_left", False)), + bool(legacy.get("blindspot_right", False)), + bool(legacy.get("left_blinker", False)), + bool(legacy.get("right_blinker", False)), + float(legacy.get("v_ego", 0.0)), + ) + + def reload_setup(self): + self._refresh_from_params() + + def heartbeat(self) -> None: + if self._state.refresh_tick % self._REFRESH_STRIDE == 0: + self._refresh_from_params() + self._state.refresh_tick += 1 + + def sample(self, + blocked_l: bool = False, + blocked_r: bool = False, + blink_l: bool = False, + blink_r: bool = False, + speed_mps: float = 0.0, + **legacy) -> None: + if legacy: + blocked_l, blocked_r, blink_l, blink_r, speed_mps = self._consume_legacy_kwargs(**legacy) + self._state.outcome = _resolve_signal_choice(speed_mps, + self._state.speed_limit_mps, + blink_l, + blink_r, + blocked_l, + blocked_r) + + def output(self): + return self._state.outcome if self._state.active else TurnDirection.none + + @property + def enabled(self): + return self._state.active + + @enabled.setter + def enabled(self, value): + self._state.active = bool(value) + + @property + def speed_gate(self): + return self._state.speed_limit_mps + + @speed_gate.setter + def speed_gate(self, value): + self._state.speed_limit_mps = float(value) + + @property + def turn_direction(self): + return self._state.outcome + + @turn_direction.setter + def turn_direction(self, value): + self._state.outcome = value + + +class IQNavTurnController(TurnSignalPlanner): + def __init__(self, desire_helper): + super().__init__(desire_helper) + + def read_params(self): + self.reload_setup() + + def update_params(self) -> None: + self.heartbeat() + + def update_lane_turn(self, + blindspot_left: bool, + blindspot_right: bool, + left_blinker: bool, + right_blinker: bool, + v_ego: float) -> None: + self.sample(blocked_l=blindspot_left, + blocked_r=blindspot_right, + blink_l=left_blinker, + blink_r=right_blinker, + speed_mps=v_ego) + + def get_turn_direction(self): + return self.output() + + @property + def lane_turn_value(self): + return self.speed_gate + + @lane_turn_value.setter + def lane_turn_value(self, value): + self.speed_gate = value diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lateral_edge_guard.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lateral_edge_guard.py new file mode 100644 index 000000000..602ca2231 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/controls/lib/helpers/lateral_edge_guard.py @@ -0,0 +1,268 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import math +from dataclasses import dataclass, replace +from enum import IntEnum +from typing import Any + +from iqpilot.cereal import custom, log +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog + + +MIN_ACTIVE_SPEED_MPS = 20.0 * CV.MPH_TO_MS +MAX_VALID_ROAD_EDGE_STD_M = 1.0 +EDGE_CONFIDENCE_SIGMA = 1.0 +ROAD_EDGE_LOOKAHEAD_MIN_M = 5.0 +ROAD_EDGE_LOOKAHEAD_MAX_M = 40.0 +LANE_CENTER_OFFSET_M = 3.5 +VEHICLE_LATERAL_HALF_WIDTH_M = 1.90 / 2.0 +EDGE_CLEARANCE_MARGIN_M = 0.25 +ADJACENT_LANE_LINE_PROB = 0.5 +EGO_LANE_LINE_PROB_MIN = 0.5 +MIN_MEASURED_LANE_WIDTH_M = 2.5 +MAX_MEASURED_LANE_WIDTH_M = 4.5 +OUTER_LANE_LINE_INDEX = (0, 3) +EGO_LANE_LINE_INDEX = (1, 2) +REQUIRED_ROAD_EDGE_DISTANCE_M = LANE_CENTER_OFFSET_M + VEHICLE_LATERAL_HALF_WIDTH_M + EDGE_CLEARANCE_MARGIN_M +BLOCK_DEBOUNCE_S = 0.30 +CLEAR_DEBOUNCE_S = 0.50 +UNAVAILABLE_HOLD_S = 0.50 +TIMER_EPSILON_S = 1e-9 +PARAM_REFRESH_FRAMES = 50 + +LaneChangeDirection = log.LaneChangeDirection +LateralEdgeBlock = custom.IQLateralEdgeBlock + + +class RoadEdgeDataState(IntEnum): + VALID = 0 + UNAVAILABLE = 1 + INVALID = 2 + + +@dataclass(frozen=True, slots=True) +class RoadEdgeMeasurement: + state: RoadEdgeDataState + lateral_distance_m: float | None = None + conservative_distance_m: float | None = None + should_block: bool | None = None + + +@dataclass(frozen=True, slots=True) +class _SideState: + blocked: bool = False + block_timer_s: float = 0.0 + clear_timer_s: float = 0.0 + unavailable_timer_s: float = 0.0 + fallback_reported: bool = False + + +def evaluate_road_edge(edge: Any, std_m: Any, direction: int, + lane_width_m: float = LANE_CENTER_OFFSET_M) -> RoadEdgeMeasurement: + if edge is None or std_m is None: + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + try: + xs = edge.x + ys = edge.y + count = len(xs) + y_count = len(ys) + except (AttributeError, TypeError): + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + if count == 0 or y_count != count: + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + try: + std = float(std_m) + except (TypeError, ValueError): + return RoadEdgeMeasurement(RoadEdgeDataState.INVALID) + if not math.isfinite(std) or std < 0.0 or std > MAX_VALID_ROAD_EDGE_STD_M: + return RoadEdgeMeasurement(RoadEdgeDataState.INVALID) + + lateral_distance_m: float | None = None + for idx in range(count): + try: + x_m = float(xs[idx]) + y_m = float(ys[idx]) + except (IndexError, TypeError, ValueError): + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + if not math.isfinite(x_m) or not math.isfinite(y_m): + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + if not ROAD_EDGE_LOOKAHEAD_MIN_M <= x_m <= ROAD_EDGE_LOOKAHEAD_MAX_M: + continue + if ((direction == LaneChangeDirection.left and y_m >= 0.0) or + (direction == LaneChangeDirection.right and y_m <= 0.0)): + return RoadEdgeMeasurement(RoadEdgeDataState.INVALID) + distance_m = abs(y_m) + lateral_distance_m = distance_m if lateral_distance_m is None else min(lateral_distance_m, distance_m) + + if lateral_distance_m is None: + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + conservative_distance_m = lateral_distance_m - EDGE_CONFIDENCE_SIGMA * std + required_distance_m = lane_width_m + VEHICLE_LATERAL_HALF_WIDTH_M + EDGE_CLEARANCE_MARGIN_M + return RoadEdgeMeasurement( + RoadEdgeDataState.VALID, + lateral_distance_m, + conservative_distance_m, + conservative_distance_m < required_distance_m, + ) + + +def step_side_guard(state: _SideState, measurement: RoadEdgeMeasurement, speed_active: bool, + dt_s: float) -> tuple[_SideState, bool]: + if not speed_active: + return _SideState(), False + + if measurement.state == RoadEdgeDataState.UNAVAILABLE: + unavailable_timer_s = state.unavailable_timer_s + dt_s + if unavailable_timer_s < UNAVAILABLE_HOLD_S - TIMER_EPSILON_S: + return _SideState(state.blocked, unavailable_timer_s=unavailable_timer_s, + fallback_reported=state.fallback_reported), False + fallback_started = not state.fallback_reported + return _SideState(unavailable_timer_s=unavailable_timer_s, fallback_reported=True), fallback_started + + should_block = bool(measurement.should_block) if measurement.state == RoadEdgeDataState.VALID else False + if should_block == state.blocked: + return _SideState(blocked=state.blocked), False + + if should_block: + block_timer_s = state.block_timer_s + dt_s + if block_timer_s >= BLOCK_DEBOUNCE_S - TIMER_EPSILON_S: + return _SideState(blocked=True), False + return _SideState(block_timer_s=block_timer_s), False + + clear_timer_s = state.clear_timer_s + dt_s + if clear_timer_s >= CLEAR_DEBOUNCE_S - TIMER_EPSILON_S: + return _SideState(), False + return _SideState(blocked=True, clear_timer_s=clear_timer_s), False + + +class LateralEdgeGuard: + def __init__(self, enabled: bool | None = None) -> None: + self._params = Params() if enabled is None else None + self._param_refresh_frame = 0 + self.enabled = self._read_enabled() if enabled is None else enabled + self._active = False + self._left = _SideState() + self._right = _SideState() + self.left_measurement = RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + self.right_measurement = RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + def _read_enabled(self) -> bool: + try: + return bool(self._params and self._params.get_bool("IQEdgeGuard")) + except Exception: + return False + + def _refresh_enabled(self) -> None: + if self._params is not None and self._param_refresh_frame % PARAM_REFRESH_FRAMES == 0: + self.enabled = self._read_enabled() + self._param_refresh_frame += 1 + + def _reset(self) -> None: + self._left = _SideState() + self._right = _SideState() + self.left_measurement = RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + self.right_measurement = RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + @staticmethod + def _model_side(modeldata: Any, side_index: int) -> tuple[Any | None, Any | None]: + if modeldata is None: + return None, None + try: + edges = modeldata.roadEdges + stds = modeldata.roadEdgeStds + if len(edges) <= side_index or len(stds) <= side_index: + return None, None + return edges[side_index], stds[side_index] + except (AttributeError, TypeError): + return None, None + + @staticmethod + def _lane_line_prob(modeldata: Any, index: int) -> float | None: + if modeldata is None: + return None + try: + probs = modeldata.laneLineProbs + if len(probs) <= index: + return None + value = float(probs[index]) + except (AttributeError, TypeError, IndexError, ValueError): + return None + return value if math.isfinite(value) else None + + @classmethod + def _adjacent_lane_visible(cls, modeldata: Any, side_index: int) -> bool: + prob = cls._lane_line_prob(modeldata, OUTER_LANE_LINE_INDEX[side_index]) + return prob is not None and prob > ADJACENT_LANE_LINE_PROB + + @classmethod + def _measured_lane_width(cls, modeldata: Any) -> float: + left_prob = cls._lane_line_prob(modeldata, EGO_LANE_LINE_INDEX[0]) + right_prob = cls._lane_line_prob(modeldata, EGO_LANE_LINE_INDEX[1]) + if left_prob is None or right_prob is None: + return LANE_CENTER_OFFSET_M + if left_prob <= EGO_LANE_LINE_PROB_MIN or right_prob <= EGO_LANE_LINE_PROB_MIN: + return LANE_CENTER_OFFSET_M + try: + lines = modeldata.laneLines + left_y = float(lines[EGO_LANE_LINE_INDEX[0]].y[0]) + right_y = float(lines[EGO_LANE_LINE_INDEX[1]].y[0]) + except (AttributeError, TypeError, IndexError, ValueError): + return LANE_CENTER_OFFSET_M + width = abs(right_y - left_y) + if not math.isfinite(width): + return LANE_CENTER_OFFSET_M + return min(max(width, MIN_MEASURED_LANE_WIDTH_M), MAX_MEASURED_LANE_WIDTH_M) + + @staticmethod + def _apply_lane_evidence(measurement: RoadEdgeMeasurement, lane_visible: bool) -> RoadEdgeMeasurement: + if lane_visible and measurement.state == RoadEdgeDataState.VALID and measurement.should_block: + return replace(measurement, should_block=False) + return measurement + + def update(self, modeldata: Any, v_ego_mps: float, dt_s: float) -> None: + self._refresh_enabled() + if not self.enabled: + if self._active: + self._reset() + self._active = False + return + if not self._active: + self._reset() + self._active = True + + dt = max(float(dt_s), 0.0) + left_edge, left_std = self._model_side(modeldata, 0) + right_edge, right_std = self._model_side(modeldata, 1) + lane_width_m = self._measured_lane_width(modeldata) + self.left_measurement = self._apply_lane_evidence( + evaluate_road_edge(left_edge, left_std, LaneChangeDirection.left, lane_width_m), + self._adjacent_lane_visible(modeldata, 0)) + self.right_measurement = self._apply_lane_evidence( + evaluate_road_edge(right_edge, right_std, LaneChangeDirection.right, lane_width_m), + self._adjacent_lane_visible(modeldata, 1)) + speed_active = math.isfinite(v_ego_mps) and v_ego_mps >= MIN_ACTIVE_SPEED_MPS + self._left, left_fallback = step_side_guard(self._left, self.left_measurement, speed_active, dt) + self._right, right_fallback = step_side_guard(self._right, self.right_measurement, speed_active, dt) + if left_fallback: + cloudlog.warning(f"lateral edge guard: left road edge unavailable for {UNAVAILABLE_HOLD_S:.2f} s; falling back to not blocking") + if right_fallback: + cloudlog.warning(f"lateral edge guard: right road edge unavailable for {UNAVAILABLE_HOLD_S:.2f} s; falling back to not blocking") + + def block_for_direction(self, direction: int) -> custom.IQLateralEdgeBlock: + if not self.enabled: + return LateralEdgeBlock.none + if direction == LaneChangeDirection.left and self._left.blocked: + return LateralEdgeBlock.left + if direction == LaneChangeDirection.right and self._right.blocked: + return LateralEdgeBlock.right + return LateralEdgeBlock.none diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/big_catalog.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/big_catalog.py new file mode 100644 index 000000000..972671971 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/big_catalog.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.big_catalog") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.big_catalog import * diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/camera.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/camera.py new file mode 100644 index 000000000..a19e6ce51 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/camera.py @@ -0,0 +1,70 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import numpy as np + +from iqpilot.common.transformations.camera import DEVICE_CAMERAS + +MAX_CAMERA_OFFSET_METERS = 0.35 + + +class _OffsetSmoother: + def __init__(self, blend: float = 0.1): + self._blend = blend + self._value = 0.0 + + def step(self, target: float) -> float: + self._value = ((1.0 - self._blend) * self._value) + (self._blend * float(target)) + return self._value + + +def _clamped_offset(raw_offset) -> float: + try: + parsed = float(raw_offset) + except (TypeError, ValueError): + parsed = 0.0 + return float(np.clip(parsed, -MAX_CAMERA_OFFSET_METERS, MAX_CAMERA_OFFSET_METERS)) + + +def _camera_profile(sm): + return DEVICE_CAMERAS[(str(sm["deviceState"].deviceType), str(sm["roadCameraState"].sensor))] + + +def _calibration_height(sm) -> float: + from iqpilot.selfdrive.locationd.calibrationd import HEIGHT_SANE_MIN, HEIGHT_SANE_MAX + h = sm["extrinsicsCalibration"].height[0] if sm["extrinsicsCalibration"].height else 1.22 + return h if HEIGHT_SANE_MIN <= h <= HEIGHT_SANE_MAX else 1.22 + + +def _sheared_transform(model_transform, intrinsics, height: float, lateral_offset: float): + optical_center_y = intrinsics[1, 2] + projection_bias = np.eye(3, dtype=np.float32) + projection_bias[0, 1] = lateral_offset / height + projection_bias[0, 2] = -(lateral_offset / height) * optical_center_y + return (projection_bias @ model_transform).astype(np.float32) + + +class CameraOffsetHelper: + def __init__(self): + self.camera_offset = 0.0 + self.actual_camera_offset = 0.0 + self._smoother = _OffsetSmoother() + + @staticmethod + def apply_camera_offset(model_transform, intrinsics, height, offset_param): + return _sheared_transform(model_transform, intrinsics, height, offset_param) + + def set_offset(self, offset): + self.camera_offset = _clamped_offset(offset) + + def update(self, model_transform_main, model_transform_extra, sm, main_wide_camera, extra_uses_wide_camera=True): + self.actual_camera_offset = self._smoother.step(self.camera_offset) + camera_bundle = _camera_profile(sm) + camera_height = _calibration_height(sm) + main_intrinsics = camera_bundle.ecam.intrinsics if main_wide_camera else camera_bundle.fcam.intrinsics + extra_intrinsics = camera_bundle.ecam.intrinsics if extra_uses_wide_camera else camera_bundle.fcam.intrinsics + + return ( + self.apply_camera_offset(model_transform_main, main_intrinsics, camera_height, self.actual_camera_offset), + self.apply_camera_offset(model_transform_extra, extra_intrinsics, camera_height, self.actual_camera_offset), + ) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py new file mode 100644 index 000000000..5b73c0115 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py @@ -0,0 +1,133 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + + +def index_function(index: int, max_val: float = 192, max_idx: int = 32) -> float: + return max_val * ((index / max_idx) ** 2) + + +def _quadratic_series(limit: float, steps: int) -> list[float]: + return [index_function(index, max_val=limit, max_idx=steps - 1) for index in range(steps)] + + +def _probability_window(*values: float) -> np.ndarray: + return np.asarray(values, dtype=np.float32) + + +def _field_group(start: int, stop: int, stride: int) -> slice: + return slice(start, stop, stride) + + +_IDX_COUNT = 33 +_T_AXIS = _quadratic_series(10.0, _IDX_COUNT) +_X_AXIS = _quadratic_series(192.0, _IDX_COUNT) + + +class ModelConstants: + IDX_N = _IDX_COUNT + T_IDXS = _T_AXIS + X_IDXS = _X_AXIS + LEAD_T_IDXS = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0] + LEAD_T_OFFSETS = [0.0, 2.0, 4.0] + META_T_IDXS = [2.0, 4.0, 6.0, 8.0, 10.0] + + MODEL_FREQ = 20 + FEATURE_LEN = 512 + FULL_HISTORY_BUFFER_LEN = 99 + HISTORY_BUFFER_LEN = FULL_HISTORY_BUFFER_LEN + DESIRE_LEN = 8 + TRAFFIC_CONVENTION_LEN = 2 + NAV_FEATURE_LEN = 256 + NAV_INSTRUCTION_LEN = 150 + LAT_PLANNER_STATE_LEN = 4 + LATERAL_CONTROL_PARAMS_LEN = 2 + PREV_DESIRED_CURV_LEN = 1 + + FCW_THRESHOLDS_5MS2 = _probability_window(0.05, 0.05, 0.15, 0.15, 0.15) + FCW_THRESHOLDS_3MS2 = _probability_window(0.7, 0.7) + FCW_5MS2_PROBS_WIDTH = 5 + FCW_3MS2_PROBS_WIDTH = 2 + + DISENGAGE_WIDTH = 5 + POSE_WIDTH = 6 + WIDE_FROM_DEVICE_WIDTH = 3 + SIM_POSE_WIDTH = 6 + LEAD_WIDTH = 4 + LANE_LINES_WIDTH = 2 + ROAD_EDGES_WIDTH = 2 + PLAN_WIDTH = 15 + DESIRE_PRED_WIDTH = 8 + LAT_PLANNER_SOLUTION_WIDTH = 4 + DESIRED_CURV_WIDTH = 1 + + NUM_LANE_LINES = 4 + NUM_ROAD_EDGES = 2 + LEAD_TRAJ_LEN = 6 + DESIRE_PRED_LEN = 4 + + PLAN_MHP_N = 5 + LEAD_MHP_N = 2 + PLAN_MHP_SELECTION = 1 + LEAD_MHP_SELECTION = 3 + + FCW_THRESHOLD_5MS2_HIGH = 0.15 + FCW_THRESHOLD_5MS2_LOW = 0.05 + FCW_THRESHOLD_3MS2 = 0.7 + + CONFIDENCE_BUFFER_LEN = 5 + RYG_GREEN = 0.01165 + RYG_YELLOW = 0.06157 + POLY_PATH_DEGREE = 4 + + +class Plan: + POSITION = slice(0, 3) + VELOCITY = slice(3, 6) + ACCELERATION = slice(6, 9) + T_FROM_CURRENT_EULER = slice(9, 12) + ORIENTATION_RATE = slice(12, 15) + + +class Meta: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 31, 6) + BRAKE_DISENGAGE = _field_group(2, 31, 6) + STEER_OVERRIDE = _field_group(3, 31, 6) + HARD_BRAKE_3 = _field_group(4, 31, 6) + HARD_BRAKE_4 = _field_group(5, 31, 6) + HARD_BRAKE_5 = _field_group(6, 31, 6) + GAS_PRESS = _field_group(31, 55, 4) + BRAKE_PRESS = _field_group(32, 55, 4) + LEFT_BLINKER = _field_group(33, 55, 4) + RIGHT_BLINKER = _field_group(34, 55, 4) + + +class MetaTombRaider: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 41, 8) + BRAKE_DISENGAGE = _field_group(2, 41, 8) + STEER_OVERRIDE = _field_group(3, 41, 8) + HARD_BRAKE_3 = _field_group(4, 41, 8) + HARD_BRAKE_4 = _field_group(5, 41, 8) + HARD_BRAKE_5 = _field_group(6, 41, 8) + GAS_PRESS = _field_group(7, 41, 8) + BRAKE_PRESS = _field_group(8, 41, 8) + LEFT_BLINKER = _field_group(41, 53, 2) + RIGHT_BLINKER = _field_group(42, 53, 2) + + +class MetaSimPose: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 36, 7) + BRAKE_DISENGAGE = _field_group(2, 36, 7) + STEER_OVERRIDE = _field_group(3, 36, 7) + HARD_BRAKE_3 = _field_group(4, 36, 7) + HARD_BRAKE_4 = _field_group(5, 36, 7) + HARD_BRAKE_5 = _field_group(6, 36, 7) + GAS_PRESS = _field_group(7, 36, 7) + LEFT_BLINKER = _field_group(36, 48, 2) + RIGHT_BLINKER = _field_group(37, 48, 2) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/daemon.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/daemon.py new file mode 100644 index 000000000..97327992f --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/daemon.py @@ -0,0 +1,767 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import sys +import time +from dataclasses import dataclass +from typing import Any + +import iqpilot.cereal.messaging as messaging +import numpy as np + +from iqpilot.cereal import car, custom, log +from iqpilot.cereal.messaging import PubMaster, SubMaster +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionBuf, VisionIpcClient +from iqdbc.car.car_helpers import get_demo_car_params +from setproctitle import setproctitle + +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.iq_perf import PerfSample, PerfTraceEmitter, PerfTraceRing +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL, config_realtime_process +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.transformations.camera import DEVICE_CAMERAS +from iqpilot.common.transformations.model import get_warp_matrix +from iqpilot.selfdrive.controls.lib.desire_helper import DesireHelper +from iqpilot.selfdrive.controls.lib.drive_helpers import ( + MODEL_SMOOTHING_MAX_TOTAL_SEC, + dynamic_lat_smooth_extra_seconds, + get_accel_from_plan, + smooth_value, +) +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy +from iqpilot.system import sentry + +from iqpilot.common.steer_delay import lateral_action_delay +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle +from iqpilot.selfdrive.iqmodeld.models.inference_state import InferenceStateBase +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import get_model_runner +from iqpilot.selfdrive.iqmodeld.camera import CameraOffsetHelper +from iqpilot.selfdrive.iqmodeld.config import Plan +from iqpilot.selfdrive.iqmodeld.messaging import ( + DrivePacketMemory, + pick_curvature, + populate_drive_messages, + populate_odometry_message, +) +from iqpilot.selfdrive.iqmodeld.metadata import select_meta_layout + +try: + from iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import RoadProjector, WarpContext +except ModuleNotFoundError: + class WarpContext: + def __init__(self, *args, **kwargs): + raise ModuleNotFoundError("iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx is not built") + + class RoadProjector: + def __init__(self, *args, **kwargs): + raise ModuleNotFoundError("iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx is not built") + + +PROCESS_NAME = "iqpilot.selfdrive.iqmodeld.daemon" +IQP_NAV_MODEL_INFLUENCE_ENABLED = False +TurnDirection = custom.IQTurnSignalDirection +IQMODEL_EVAL_WARN_US = int(DT_MDL * 1_000_000) +IQMODEL_EVAL_ERROR_US = IQMODEL_EVAL_WARN_US * 2 +_FRAME_STARVED_BACKOFF_POLLS = 5 +_FRAME_STARVED_BACKOFF_SECONDS = 0.005 +_FRAME_STARVED_LOG_EVERY = 200 + + +def _plan_y_std_1s(outputs: dict[str, np.ndarray]) -> float: + # plan_stds is (batch, IDX_N, PLAN_WIDTH); index 10 ~= 1s ahead (see ModelConstants.T_IDXS), + # POSITION is an (x, y, z) slice within PLAN_WIDTH so [1] picks the lateral (y) std. + try: + return float(outputs["plan_stds"][0, 10, Plan.POSITION][1]) + except (KeyError, IndexError): + return 0.0 + + +def _model_lat_smooth_max_sec(params: Params) -> float: + if not params.get_bool("ModelSmoothingEnabled"): + return 0.0 + try: + raw = params.get("ModelLatSmoothSec", return_default=True) + raw = 0 if raw is None else int(raw) + except (ValueError, TypeError): + raw = 0 + return min(max(raw, 0), 30) * 0.01 + + +@dataclass +class CaptureStamp: + frame_id: int = 0 + timestamp_sof: int = 0 + timestamp_eof: int = 0 + + @classmethod + def from_vipc(cls, client: VisionIpcClient) -> "CaptureStamp": + return cls(client.frame_id, client.timestamp_sof, client.timestamp_eof) + + +@dataclass(frozen=True) +class StreamLayout: + dual_camera: bool + main_is_wide: bool + primary_stream: VisionStreamType + + +class ReplayLedger: + def __init__(self, tensor_shapes: dict[str, tuple[int, ...]], frame_inputs: list[str]): + self.inputs: dict[str, np.ndarray] = {} + self.archive: dict[str, np.ndarray] = {} + self.selectors: dict[str, np.ndarray] = {} + self._frame_inputs = set(frame_inputs) + self._pulse_name: str | None = None + self._pulse_memory: np.ndarray | None = None + + feature_shape = tensor_shapes.get("features_buffer") + for tensor_name, tensor_shape in tensor_shapes.items(): + if tensor_name in self._frame_inputs: + continue + + self.inputs[tensor_name] = np.zeros(tensor_shape, dtype=np.float32) + if len(tensor_shape) != 3 or tensor_shape[1] <= 1: + continue + + history_len = self._history_length(tensor_shape, feature_shape) + self.archive[tensor_name] = np.zeros((1, history_len, tensor_shape[2]), dtype=np.float32) + export_index = self._export_index(tensor_shape, history_len, feature_shape) + if export_index is not None: + self.selectors[tensor_name] = export_index + + if tensor_name.startswith("desire"): + self._pulse_name = tensor_name + self._pulse_memory = np.zeros(tensor_shape[2], dtype=np.float32) + + @staticmethod + def _history_length(tensor_shape: tuple[int, ...], feature_shape: tuple[int, ...] | None) -> int: + if tensor_shape[1] >= 99: + return tensor_shape[1] + if tensor_shape[1] in (24, 25) and feature_shape is not None and feature_shape[1] == 24: + return (feature_shape[1] + 1) * 4 + return tensor_shape[1] * 4 + + @staticmethod + def _export_index(tensor_shape: tuple[int, ...], history_len: int, + feature_shape: tuple[int, ...] | None) -> np.ndarray | None: + if tensor_shape[1] in (24, 25) and feature_shape is not None and feature_shape[1] == 24: + stride = int(-history_len / tensor_shape[1]) + return np.arange(stride, stride * (tensor_shape[1] + 1), stride)[::-1] + if tensor_shape[1] == 25: + skip = history_len // tensor_shape[1] + return np.arange(history_len)[-1 - (skip * (tensor_shape[1] - 1))::skip] + if tensor_shape[1] >= 99: + return np.arange(tensor_shape[1]) + return None + + @property + def pulse_name(self) -> str: + if self._pulse_name is None: + raise KeyError("No desire-like pulse input present in model inputs") + return self._pulse_name + + def _shift_archive(self, tensor_name: str) -> np.ndarray: + history = self.archive[tensor_name] + history[0, :-1] = history[0, 1:] + return history + + def inject_pulse(self, pulse_values: np.ndarray) -> None: + pulse = pulse_values.copy() + pulse[0] = 0 + assert self._pulse_memory is not None + rising = np.where(pulse - self._pulse_memory > 0.99, pulse, 0) + self._pulse_memory[:] = pulse + + history = self._shift_archive(self.pulse_name) + history[0, -1] = rising + exported_shape = self.inputs[self.pulse_name].shape + if history.shape[1] > exported_shape[1]: + stride = history.shape[1] // exported_shape[1] + self.inputs[self.pulse_name][:] = history[0].reshape( + exported_shape[0], exported_shape[1], stride, -1 + ).max(axis=2) + return + self.inputs[self.pulse_name][:] = history[0, self.selectors[self.pulse_name]] + + def merge_inputs(self, fresh_inputs: dict[str, np.ndarray]) -> None: + pulse_name = self.pulse_name + for tensor_name, tensor_value in fresh_inputs.items(): + if tensor_name in self.inputs and tensor_name != pulse_name: + self.inputs[tensor_name][:] = tensor_value + + def note_hidden_state(self, hidden_state: np.ndarray) -> None: + if "features_buffer" not in self.archive: + return + history = self._shift_archive("features_buffer") + history[0, -1] = hidden_state[0] + self.inputs["features_buffer"][:] = history[0, self.selectors["features_buffer"]] + + def note_feedback(self, tensor_name: str, values: np.ndarray, zero_export: bool = False) -> None: + if tensor_name not in self.archive: + return + history = self._shift_archive(tensor_name) + history[0, -1, :] = values[0] + exported = history[0, self.selectors[tensor_name]] + self.inputs[tensor_name][:] = 0 * exported if zero_export else exported + + +def _planplus_gain(vehicle_speed: float) -> float: + return 0.75 if vehicle_speed >= 25.0 else 1.0 + + +def _merged_plan(runtime_state: "NeuralEngineState", outputs: dict[str, np.ndarray], vehicle_speed: float) -> np.ndarray: + base_plan = outputs["plan"][0] + if "planplus" not in outputs: + return base_plan + return base_plan + (runtime_state.PLANPLUS_CONTROL * _planplus_gain(vehicle_speed)) * outputs["planplus"][0] + + +class NeuralEngineState(InferenceStateBase): + frames: dict[str, RoadProjector] + + def __init__(self, gpu_context: WarpContext): + super().__init__() + runner = get_model_runner() + bundle = get_active_bundle() + + self.model_runner = runner + self.constants = runner.constants + self.generation = bundle.generation if bundle is not None else None + + knob_values = {entry.key: entry.value for entry in bundle.overrides} if bundle is not None else {} + self.LAT_SMOOTH_SECONDS = float(knob_values.get("lat", ".0")) + self.LONG_SMOOTH_SECONDS = float(knob_values.get("long", ".0")) + self.MIN_LAT_CONTROL_SPEED = 0.3 + self.PLANPLUS_CONTROL = 1.0 + self.model_smoothing_max_extra_sec = 0.0 + + context_depth = 5 if runner.is_20hz else 2 + self.frames = { + stream_name: RoadProjector(gpu_context, context_depth) + for stream_name in runner.vision_input_names + } + + self._ledger = ReplayLedger(runner.input_shapes, runner.vision_input_names) + self.numpy_inputs = self._ledger.inputs + self.temporal_buffers = self._ledger.archive + self.temporal_idxs_map = self._ledger.selectors + + @property + def mlsim(self) -> bool: + return bool(self.generation is not None and self.generation >= 11) + + @property + def desire_key(self) -> str: + return self._ledger.pulse_name + + def _warp_frames(self, vision_bufs: dict[str, VisionBuf], + transform_map: dict[str, np.ndarray]) -> dict[str, Any]: + return { + stream_name: self.frames[stream_name].stage(vision_bufs[stream_name], transform_map[stream_name].flatten()) + for stream_name in self.model_runner.vision_input_names + } + + def _run_split_model(self) -> dict[str, np.ndarray]: + if hasattr(self.model_runner, "run_vision"): + vision_packet = self.model_runner.run_vision() + self._ledger.note_hidden_state(vision_packet["hidden_state"]) + self.model_runner.refresh_policy_features(self.numpy_inputs["features_buffer"]) + return {**vision_packet, **self.model_runner.run_policy()} + + result = self.model_runner.run_model() + if "hidden_state" in result: + self._ledger.note_hidden_state(result["hidden_state"]) + return result + + def _write_curvature_memory(self, outputs: dict[str, np.ndarray]) -> None: + if "desired_curvature" not in outputs: + return + + feedback_slot = None + if "prev_desired_curvs" in self.numpy_inputs: + feedback_slot = "prev_desired_curvs" + elif "prev_desired_curv" in self.numpy_inputs: + feedback_slot = "prev_desired_curv" + + if feedback_slot is not None: + self._ledger.note_feedback(feedback_slot, outputs["desired_curvature"], zero_export=self.mlsim) + + def run(self, vision_bufs: dict[str, VisionBuf], transform_map: dict[str, np.ndarray], + fresh_inputs: dict[str, np.ndarray]) -> dict[str, np.ndarray] | None: + if not getattr(self.model_runner, "uses_opencl_warp", True): + return self.model_runner.run_fused(vision_bufs, transform_map, fresh_inputs) + + self._ledger.inject_pulse(fresh_inputs[self.desire_key]) + self._ledger.merge_inputs(fresh_inputs) + warped_frames = self._warp_frames(vision_bufs, transform_map) + self.model_runner.prepare_inputs(warped_frames, self.numpy_inputs, self.frames) + + outputs = self._run_split_model() + self._write_curvature_memory(outputs) + return outputs + + def get_action_from_model(self, outputs: dict[str, np.ndarray], previous_action: log.ModelDataV2.Action, + lat_action_t: float, long_action_t: float, vehicle_speed: float, + lat_smooth_seconds: float | None = None) -> log.ModelDataV2.Action: + if lat_smooth_seconds is None: + lat_smooth_seconds = self.LAT_SMOOTH_SECONDS + + if "action" in outputs: + curvature_cmd = outputs["action"][0, 0] / (max(1.0, vehicle_speed)) ** 2 + accel_cmd = outputs["action"][0, 1] + should_stop = bool(vehicle_speed < 0.3 and accel_cmd < 0.1) + + accel_cmd = smooth_value(accel_cmd, previous_action.desiredAcceleration, self.LONG_SMOOTH_SECONDS) + if vehicle_speed > self.MIN_LAT_CONTROL_SPEED: + curvature_cmd = smooth_value(curvature_cmd, previous_action.desiredCurvature, lat_smooth_seconds) + else: + curvature_cmd = previous_action.desiredCurvature + + return log.ModelDataV2.Action( + desiredCurvature=float(curvature_cmd), + desiredAcceleration=float(accel_cmd), + shouldStop=should_stop, + ) + + plan_rows = _merged_plan(self, outputs, vehicle_speed) + accel_cmd, should_stop = get_accel_from_plan( + plan_rows[:, Plan.VELOCITY][:, 0], + plan_rows[:, Plan.ACCELERATION][:, 0], + self.constants.T_IDXS, + action_t=long_action_t, + ) + accel_cmd = smooth_value(accel_cmd, previous_action.desiredAcceleration, self.LONG_SMOOTH_SECONDS) + + curvature_cmd = pick_curvature(outputs, plan_rows, vehicle_speed, lat_action_t, self.mlsim) + if self.generation is not None and self.generation >= 10: + if vehicle_speed > self.MIN_LAT_CONTROL_SPEED: + curvature_cmd = smooth_value(curvature_cmd, previous_action.desiredCurvature, lat_smooth_seconds) + else: + curvature_cmd = previous_action.desiredCurvature + + return log.ModelDataV2.Action( + desiredCurvature=float(curvature_cmd), + desiredAcceleration=float(accel_cmd), + shouldStop=bool(should_stop), + ) + + +class CameraIngress: + def __init__(self, gpu_context: WarpContext): + self.layout = self._discover_layout() + self._primary = VisionIpcClient("camerad", self.layout.primary_stream, True, gpu_context) + self._secondary = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_WIDE_ROAD, False, gpu_context) + + while not self._primary.connect(False): + time.sleep(0.1) + while self.layout.dual_camera and not self._secondary.connect(False): + time.sleep(0.1) + + cloudlog.warning( + f"connected main cam with buffer size: {self._primary.buffer_len} ({self._primary.width} x {self._primary.height})" + ) + if self.layout.dual_camera: + cloudlog.warning( + f"connected extra cam with buffer size: {self._secondary.buffer_len} ({self._secondary.width} x {self._secondary.height})" + ) + + @staticmethod + def _discover_layout() -> StreamLayout: + while True: + available = VisionIpcClient.available_streams("camerad", block=False) + if available: + dual_camera = ( + VisionStreamType.VISION_STREAM_WIDE_ROAD in available + and VisionStreamType.VISION_STREAM_ROAD in available + ) + main_is_wide = VisionStreamType.VISION_STREAM_ROAD not in available + primary_stream = VisionStreamType.VISION_STREAM_WIDE_ROAD if main_is_wide else VisionStreamType.VISION_STREAM_ROAD + cloudlog.warning( + f"vision stream set up, main_wide_camera: {main_is_wide}, use_extra_client: {dual_camera}" + ) + return StreamLayout(dual_camera=dual_camera, main_is_wide=main_is_wide, primary_stream=primary_stream) + time.sleep(0.1) + + def pull(self) -> tuple[VisionBuf, VisionBuf, CaptureStamp, CaptureStamp] | None: + main_buf = None + wide_buf = None + main_stamp = CaptureStamp() + wide_stamp = CaptureStamp() + + while main_stamp.timestamp_sof < wide_stamp.timestamp_sof + 25000000: + main_buf = self._primary.recv() + main_stamp = CaptureStamp.from_vipc(self._primary) + if main_buf is None: + return None + + if not self.layout.dual_camera: + return main_buf, main_buf, main_stamp, main_stamp + + while True: + wide_buf = self._secondary.recv() + wide_stamp = CaptureStamp.from_vipc(self._secondary) + if wide_buf is None or main_stamp.timestamp_sof < wide_stamp.timestamp_sof + 25000000: + break + + if wide_buf is None: + return None + + if abs(main_stamp.timestamp_sof - wide_stamp.timestamp_sof) > 10000000: + cloudlog.error( + f"frames out of sync! main: {main_stamp.frame_id} ({main_stamp.timestamp_sof / 1e9:.5f})," + f" extra: {wide_stamp.frame_id} ({wide_stamp.timestamp_sof / 1e9:.5f})" + ) + return main_buf, wide_buf, main_stamp, wide_stamp + + +class CalibrationAtlas: + def __init__(self): + self.main_warp = np.zeros((3, 3), dtype=np.float32) + self.extra_warp = np.zeros((3, 3), dtype=np.float32) + self.ready = False + self._offset_tuner = CameraOffsetHelper() + + def set_offset(self, offset_value: Any) -> None: + self._offset_tuner.set_offset(offset_value) + + def refresh(self, sm: SubMaster, main_is_wide: bool, dual_camera: bool) -> tuple[np.ndarray, np.ndarray, bool]: + if not (sm.seen["extrinsicsCalibration"] and sm.seen["roadCameraState"] and sm.seen["deviceState"]): + return self.main_warp, self.extra_warp, self.ready + + rpy = get_calibrated_rpy(sm["extrinsicsCalibration"]) + if rpy is None: + live_calib = sm["extrinsicsCalibration"] + if len(live_calib.rpyCalib) == 3: + rpy = np.array(live_calib.rpyCalib, dtype=np.float32) + else: + rpy = np.zeros(3, dtype=np.float32) + + device_key = (str(sm["deviceState"].deviceType), str(sm["roadCameraState"].sensor)) + device_camera = DEVICE_CAMERAS[device_key] + main_intrinsics = device_camera.ecam.intrinsics if main_is_wide else device_camera.fcam.intrinsics + extra_uses_wide_camera = dual_camera or main_is_wide + extra_intrinsics = device_camera.ecam.intrinsics if extra_uses_wide_camera else device_camera.fcam.intrinsics + self.main_warp = get_warp_matrix(rpy, main_intrinsics, False).astype(np.float32) + self.extra_warp = get_warp_matrix(rpy, extra_intrinsics, True).astype(np.float32) + self.main_warp, self.extra_warp = self._offset_tuner.update( + self.main_warp, self.extra_warp, sm, main_is_wide, extra_uses_wide_camera + ) + self.ready = True + return self.main_warp, self.extra_warp, self.ready + + +class FrameDropMeter: + def __init__(self, model_freq: float): + self._smoother = FirstOrderFilter(0.0, 10.0, 1.0 / model_freq) + self._warm_frames = 0 + self._last_frame_id = 0 + + def sample(self, frame_id: int) -> tuple[int, float, bool]: + dropped = max(0, frame_id - self._last_frame_id - 1) + smooth = self._smoother.update(min(dropped, 10)) + if self._warm_frames < 10: + self._smoother.x = 0.0 + smooth = 0.0 + self._warm_frames += 1 + return dropped, smooth / (1 + smooth), dropped > 0 + + def commit(self, frame_id: int) -> None: + self._last_frame_id = frame_id + + +class InferenceDaemon: + def __init__(self, demo: bool = False, channel_path: str | None = None): + cloudlog.warning("iqmodeld init") + sentry.set_tag("daemon", PROCESS_NAME) + cloudlog.bind(daemon=PROCESS_NAME) + setproctitle(PROCESS_NAME) + config_realtime_process(7, 54) + + cloudlog.warning("setting up CL context") + self._gpu = WarpContext() + cloudlog.warning("CL context ready; loading model") + self._runtime = NeuralEngineState(self._gpu) + self._meta_layout = select_meta_layout() + cloudlog.warning("models loaded, iqmodeld starting") + + self._channel = None + if channel_path is not None: + from iqpilot.selfdrive.iqmodeld.model_channel import ModelChannel + self._channel = ModelChannel(channel_path, create=True) + + self._cameras = CameraIngress(self._gpu) + pub_services = ["iqPerfTrace"] if self._channel is not None else [ + "modelV2", "drivingModelData", "cameraOdometry", "iqDriveModelData", "iqPerfTrace"] + self._pub = PubMaster(pub_services) + self._sub = SubMaster([ + "deviceState", "carState", "roadCameraState", "extrinsicsCalibration", + "driverMonitoringState", "carControl", "lateralDelay", "iqNavState", "radarState", + ]) + self._message_memory = DrivePacketMemory() + self._params = Params() + self._frame_meter = FrameDropMeter(self._runtime.constants.MODEL_FREQ) + self._warps = CalibrationAtlas() + self._perf = PerfTraceEmitter("iqmodeld", pubmaster=self._pub) + self._perf_ring = PerfTraceRing() + + self._car_params = self._load_car_params(demo) + self._long_action_delay = self._car_params.longitudinalActuatorDelay + self._runtime.LONG_SMOOTH_SECONDS + self._previous_action = log.ModelDataV2.Action() + self._desire_logic = DesireHelper() + self._lat_smooth_extra_sec = 0.0 + + def _load_car_params(self, demo: bool): + car_params = get_demo_car_params() if demo else messaging.log_from_bytes( + self._params.get("CarParams", block=True), car.CarParams) + cloudlog.info("iqmodeld got CarParams: %s", car_params.brand) + return car_params + + def _refresh_tunables(self, tick: int) -> None: + if tick % 60 != 0: + return + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + big_enabled = self._params.get_bool("IQEmacEnabled") or egpu_selected(self._params) + if big_enabled != (self._channel is not None): + # publish mode is fixed at startup: staying up would fight the selector for modelV2 + cloudlog.warning("iqmodeld: big backend toggled, restarting to switch publish mode") + sys.exit(0) + self._runtime.lat_delay = lateral_action_delay(self._params, self._car_params, self._sub["lateralDelay"].lateralDelay) + self._runtime.PLANPLUS_CONTROL = self._params.get("PlanplusControl", return_default=True) + self._runtime.model_smoothing_max_extra_sec = _model_lat_smooth_max_sec(self._params) + self._warps.set_offset(self._params.get("CameraOffset", return_default=True)) + + def _traffic_side(self) -> np.ndarray: + traffic = np.zeros(2, dtype=np.float32) + traffic[int(self._sub["driverMonitoringState"].isRHD)] = 1 + return traffic + + def _desire_pulse(self) -> np.ndarray: + pulse = np.zeros(self._runtime.constants.DESIRE_LEN, dtype=np.float32) + desire_idx = self._desire_logic.desire + if 0 <= desire_idx < self._runtime.constants.DESIRE_LEN: + pulse[desire_idx] = 1 + return pulse + + def _compose_inputs(self, vehicle_speed: float, lat_horizon: float, long_horizon: float) -> dict[str, np.ndarray]: + inputs: dict[str, np.ndarray] = { + self._runtime.desire_key: self._desire_pulse(), + "traffic_convention": self._traffic_side(), + } + if "lateral_control_params" in self._runtime.numpy_inputs: + inputs["lateral_control_params"] = np.array([vehicle_speed, lat_horizon], dtype=np.float32) + if "action_t" in self._runtime.numpy_inputs: + inputs["action_t"] = np.array([lat_horizon, long_horizon], dtype=np.float32) + return inputs + + def _publish(self, outputs: dict[str, np.ndarray], main_stamp: CaptureStamp, extra_stamp: CaptureStamp, + road_frame_id: int, frame_drop_ratio: float, dropped_frames: int, + execution_time: float, live_calib_seen: bool, + lat_horizon: float, long_horizon: float, vehicle_speed: float) -> None: + model_msg = messaging.new_message("modelV2") + driving_msg = messaging.new_message("drivingModelData") + pose_msg = messaging.new_message("cameraOdometry") + iq_msg = messaging.new_message("iqDriveModelData") + + self._lat_smooth_extra_sec = dynamic_lat_smooth_extra_seconds( + _plan_y_std_1s(outputs), self._runtime.model_smoothing_max_extra_sec + ) + lat_smooth_total_sec = min(self._runtime.LAT_SMOOTH_SECONDS + self._lat_smooth_extra_sec, MODEL_SMOOTHING_MAX_TOTAL_SEC) + action = self._runtime.get_action_from_model( + outputs, self._previous_action, lat_horizon, long_horizon, vehicle_speed, lat_smooth_total_sec + ) + self._previous_action = action + + populate_drive_messages( + driving_msg, + model_msg, + outputs, + action, + self._message_memory, + main_stamp.frame_id, + extra_stamp.frame_id, + road_frame_id, + frame_drop_ratio, + main_stamp.timestamp_eof, + execution_time, + live_calib_seen, + self._meta_layout, + ) + + desire_state = model_msg.modelV2.meta.desireState + lane_change_prob = desire_state[log.Desire.laneChangeLeft] + desire_state[log.Desire.laneChangeRight] + self._desire_logic.update( + self._sub["carState"], + self._sub["carControl"].latActive, + lane_change_prob, + self._sub["iqNavState"], + model_msg.modelV2, + self._sub["radarState"], + ) + model_msg.modelV2.meta.laneChangeState = self._desire_logic.lane_change_state + model_msg.modelV2.meta.laneChangeDirection = self._desire_logic.lane_change_direction + driving_msg.drivingModelData.meta.laneChangeState = self._desire_logic.lane_change_state + driving_msg.drivingModelData.meta.laneChangeDirection = self._desire_logic.lane_change_direction + iq_msg.iqDriveModelData.turnSignalDirection = self._desire_logic.lane_turn_direction + iq_msg.iqDriveModelData.lateralEdgeBlock = self._desire_logic.lateral_edge_block + + populate_odometry_message( + pose_msg, + outputs, + main_stamp.frame_id, + dropped_frames, + main_stamp.timestamp_eof, + live_calib_seen, + ) + + if self._channel is not None: + self._channel.write(main_stamp.frame_id, { + "source": "small", + "frame_id": main_stamp.frame_id, + "timestamp_sof": int(main_stamp.timestamp_sof), + "live_calib_seen": bool(live_calib_seen), + "model_execution_time": float(execution_time), + "msgs": { + "modelV2": model_msg.to_bytes(), + "drivingModelData": driving_msg.to_bytes(), + "cameraOdometry": pose_msg.to_bytes(), + "iqDriveModelData": iq_msg.to_bytes(), + }, + }) + return + + self._pub.send("modelV2", model_msg) + self._pub.send("drivingModelData", driving_msg) + self._pub.send("cameraOdometry", pose_msg) + self._pub.send("iqDriveModelData", iq_msg) + + def serve(self) -> None: + tick = 0 + starved_polls = 0 + while True: + frame_pair = self._cameras.pull() + if frame_pair is None: + starved_polls += 1 + if starved_polls >= _FRAME_STARVED_BACKOFF_POLLS: + time.sleep(_FRAME_STARVED_BACKOFF_SECONDS) + if starved_polls % _FRAME_STARVED_LOG_EVERY == 0: + cloudlog.error(f"visionipc delivered no frames for {starved_polls} polls; model is not running") + continue + + if starved_polls: + cloudlog.warning(f"visionipc recovered after {starved_polls} frameless polls") + starved_polls = 0 + + main_buf, extra_buf, main_stamp, extra_stamp = frame_pair + self._sub.update(0) + self._refresh_tunables(tick) + + vehicle_speed = max(self._sub["carState"].vEgo, 0.0) + lat_horizon = self._runtime.lat_delay + self._runtime.LAT_SMOOTH_SECONDS + self._lat_smooth_extra_sec + DT_MDL + long_horizon = self._long_action_delay + DT_MDL + + main_warp, extra_warp, live_calib_seen = self._warps.refresh( + self._sub, self._cameras.layout.main_is_wide, self._cameras.layout.dual_camera + ) + dropped_frames, frame_drop_ratio, prepare_only = self._frame_meter.sample(main_stamp.frame_id) + + vision_bufs = { + stream_name: extra_buf if "big" in stream_name else main_buf + for stream_name in self._runtime.model_runner.vision_input_names + } + warp_map = { + stream_name: extra_warp if "big" in stream_name else main_warp + for stream_name in self._runtime.model_runner.vision_input_names + } + fresh_inputs = self._compose_inputs(vehicle_speed, lat_horizon, long_horizon) + + started_at = time.perf_counter() + outputs = self._runtime.run(vision_bufs, warp_map, fresh_inputs) + execution_time = time.perf_counter() - started_at + execution_us = int(execution_time * 1_000_000) + + sample = PerfSample( + frame_id=main_stamp.frame_id, + model_eval_us=execution_us, + model_dropped_frames=dropped_frames, + model_backlog=max(0, dropped_frames), + ) + self._perf_ring.push(sample) + if dropped_frames > 0 or execution_us >= IQMODEL_EVAL_WARN_US: + severity = "warning" + if dropped_frames > 0 or execution_us >= IQMODEL_EVAL_ERROR_US: + severity = "error" + self._perf.emit( + "iqmodeld_dropped_frames" if dropped_frames > 0 else "iqmodeld_slow_eval", + severity=severity, + frame_id=main_stamp.frame_id, + total_time_us=execution_us, + dropped_frames=dropped_frames, + backlog=max(0, dropped_frames), + samples=self._perf_ring.snapshot(), + detail=( + f"model_eval_us={execution_us} dropped_frames={dropped_frames} prepare_only={int(prepare_only)} " + f"road_frame_id={self._sub['roadCameraState'].frameId}" + ), + min_interval_s=0.25, + ) + + if outputs is not None: + self._publish( + outputs, + main_stamp, + extra_stamp, + self._sub["roadCameraState"].frameId, + frame_drop_ratio, + dropped_frames, + execution_time, + live_calib_seen, + lat_horizon, + long_horizon, + vehicle_speed, + ) + + self._frame_meter.commit(main_stamp.frame_id) + tick += 1 + + +def main(demo: bool = False, channel_path: str | None = "auto"): + if channel_path == "auto": + channel_path = None + params = Params() + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + if params.get_bool("IQEmacEnabled") or egpu_selected(params): + from iqpilot.selfdrive.iqmodeld.model_channel import SMALL_CHANNEL + channel_path = SMALL_CHANNEL + InferenceDaemon(demo=demo, channel_path=channel_path).serve() + + +__all__ = [ + "PROCESS_NAME", + "IQP_NAV_MODEL_INFLUENCE_ENABLED", + "TurnDirection", + "CaptureStamp", + "ReplayLedger", + "NeuralEngineState", + "CameraIngress", + "CalibrationAtlas", + "FrameDropMeter", + "InferenceDaemon", + "main", +] + + +if __name__ == "__main__": + try: + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("--demo", action="store_true", help="Run iqmodeld in demo mode.") + args = parser.parse_args() + main(demo=args.demo) + except KeyboardInterrupt: + cloudlog.warning(f"child {PROCESS_NAME} got SIGINT") + except Exception: + sentry.capture_exception() + raise diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/driving_action.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/driving_action.py new file mode 100644 index 000000000..3e5f9750c --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/driving_action.py @@ -0,0 +1,46 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + +from iqpilot.cereal import log + +from iqpilot.selfdrive.controls.lib.drive_helpers import smooth_value + +LAT_SMOOTH_SECONDS = 0.0 +LONG_SMOOTH_SECONDS = 0.3 +MIN_LAT_CONTROL_SPEED = 0.3 +DESIRE_LEN = 8 + + +def get_action_from_model(outputs: dict[str, np.ndarray], prev_action: log.ModelDataV2.Action, + v_ego: float, lat_action_t: float, long_action_t: float, + lat_smooth_seconds: float | None = None) -> log.ModelDataV2.Action: + if "action" in outputs: + desired_accel = float(outputs["action"][0, 1]) + desired_curvature = float(outputs["action"][0, 0]) / (max(1.0, v_ego)) ** 2 + should_stop = bool(v_ego < 0.3 and desired_accel < 0.1) + else: + from iqpilot.selfdrive.controls.lib.drive_helpers import get_accel_from_plan, get_curvature_from_plan + from iqpilot.selfdrive.iqmodeld.config import ModelConstants, Plan + plan = outputs["plan"][0] + desired_accel, should_stop = get_accel_from_plan(plan[:, Plan.VELOCITY][:, 0], + plan[:, Plan.ACCELERATION][:, 0], + ModelConstants.T_IDXS, + action_t=long_action_t) + desired_curvature = get_curvature_from_plan(plan[:, Plan.T_FROM_CURRENT_EULER][:, 2], + plan[:, Plan.ORIENTATION_RATE][:, 2], + ModelConstants.T_IDXS, v_ego, lat_action_t) + desired_accel, should_stop = float(desired_accel), bool(should_stop) + desired_curvature = float(desired_curvature) + desired_accel = smooth_value(desired_accel, prev_action.desiredAcceleration, LONG_SMOOTH_SECONDS) + if v_ego > MIN_LAT_CONTROL_SPEED: + lat_smooth = LAT_SMOOTH_SECONDS if lat_smooth_seconds is None else lat_smooth_seconds + desired_curvature = smooth_value(desired_curvature, prev_action.desiredCurvature, lat_smooth) + else: + desired_curvature = prev_action.desiredCurvature + return log.ModelDataV2.Action(desiredCurvature=float(desired_curvature), + desiredAcceleration=float(desired_accel), + shouldStop=should_stop) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py new file mode 100644 index 000000000..1317d78be --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py @@ -0,0 +1,209 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +import json +import os + +from iqpilot.common.swaglog import cloudlog +import urllib.request +from pathlib import Path + +from iqpilot.system.hardware.usb import egpu_dock_ready + +USB_SYSFS_ROOT = "/sys/bus/usb/devices" +FIRMWARE_MIRROR = os.getenv("IQ_EGPU_FIRMWARE_MIRROR", "/data/firmware/tinygrad") +TINYGRAD_CACHE = "/data/.cache" + +COMMA_LFS_BATCH_URL = "https://gitlab.com/commaai/openpilot-lfs.git/info/lfs/objects/batch" + +DOWNLOAD_CHUNK = 4 * 1024 * 1024 + + +def usbgpu_present(sysfs_root: str = USB_SYSFS_ROOT) -> bool: + return egpu_dock_ready(Path(sysfs_root)) + + +def egpu_present_consented(params, sysfs_root: str = USB_SYSFS_ROOT) -> bool: + try: + if params is not None and params.get_bool("IQEgpuDisabled"): + return False + except Exception: + pass + return usbgpu_present(sysfs_root) + + +def egpu_selected(params, sysfs_root: str = USB_SYSFS_ROOT) -> bool: + try: + if params is not None and params.get_bool("IQEgpuDisabled"): + return False + if params is not None and params.get_bool("IQEgpuEnabled"): + return True + except Exception: + pass + return usbgpu_present(sysfs_root) + + +def resolve_backend(emac_enabled: bool, egpu_enabled: bool, egpu_present: bool = False) -> str | None: + if egpu_present: + return "egpu" + if emac_enabled: + return "emac" + if egpu_enabled: + return "egpu" + return None + + +def egpu_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_tinygrad.pkl") + + +def egpu_policy_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_policy.pkl") + + +def egpu_oob_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_policy_oob.pkl") + + +def onnx_cache_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"{meta['model_name']}_{meta['sha256'][:8]}.onnx") + + +def _sha256_file(path: str) -> str: + digest = hashlib.sha256() + with open(path, "rb") as f: + while chunk := f.read(DOWNLOAD_CHUNK): + digest.update(chunk) + return digest.hexdigest() + + +def quarantine_artifact(path: str, why: str) -> None: + try: + if os.path.isfile(path): + os.replace(path, path + ".unusable") + except OSError: + try: + os.remove(path) + except OSError: + pass + + +def local_onnx(meta: dict) -> str | None: + path = onnx_cache_path(meta) + if not os.path.isfile(path): + return None + size = int(meta.get("download", {}).get("size", 0)) + if size and os.path.getsize(path) != size: + quarantine_artifact(path, "onnx size mismatch") + return None + if _sha256_file(path) != meta["sha256"]: + quarantine_artifact(path, "onnx sha256 mismatch") + return None + return path + + +def resolve_download_url(download_url: str, sha256: str, size: int, timeout: float = 30.0) -> str: + if download_url.startswith("commalfs:"): + oid = download_url.split(":", 1)[1] + body = json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}).encode() + req = urllib.request.Request(COMMA_LFS_BATCH_URL, data=body, headers={ + "Accept": "application/vnd.git-lfs+json", "Content-Type": "application/vnd.git-lfs+json"}) + with urllib.request.urlopen(req, timeout=timeout) as r: + d = json.load(r) + return d["objects"][0]["actions"]["download"]["href"] + return download_url + + +def download_onnx(meta: dict, progress_cb=None) -> str: + from iqpilot.selfdrive.iqmodeld.egpu_model import download_descriptor + download_url, size = download_descriptor(meta) + if not download_url: + raise RuntimeError(f"model {meta['key']} has no download source; stage the onnx at {onnx_cache_path(meta)}") + + path = onnx_cache_path(meta) + os.makedirs(os.path.dirname(path), exist_ok=True) + try: + from iqpilot.selfdrive.iqmodeld.model_bundle_downloader import download_hf_file + return download_hf_file(f"onnx/{meta['sha256']}.onnx", path, meta["sha256"], int(size or 0), progress_cb=progress_cb) + except Exception as e: + cloudlog.warning(f"onnx {meta['key']} unavailable from HF ({e}); falling back to {download_url.split(':', 1)[0]}") + url = resolve_download_url(download_url, meta["sha256"], size) + tmp = path + ".part" + digest = hashlib.sha256() + got = 0 + with urllib.request.urlopen(url, timeout=60) as r, open(tmp, "wb") as f: + while chunk := r.read(DOWNLOAD_CHUNK): + f.write(chunk) + digest.update(chunk) + got += len(chunk) + if progress_cb is not None and size: + progress_cb(got / size) + if size and got != size: + os.remove(tmp) + raise RuntimeError(f"onnx download truncated: {got}/{size} bytes") + if digest.hexdigest() != meta["sha256"]: + os.remove(tmp) + raise RuntimeError(f"onnx sha256 mismatch for {meta['key']}") + os.replace(tmp, path) + return path + + +def download_precompiled(meta: dict, progress_cb=None, policy: bool = False, oob: bool = False) -> str | None: + field = "egpu_oob_artifact" if oob else "egpu_policy_artifact" if policy else "egpu_artifact" + art = meta.get(field) + if not art or not (art.get("objects") or art.get("hf_path")): + return None + from iqpilot.selfdrive.iqmodeld.model_bundle_downloader import download_hf_file, download_lfs_bundle + dest = egpu_oob_pkl_path(meta) if oob else egpu_policy_pkl_path(meta) if policy else egpu_pkl_path(meta) + if art.get("hf_path"): + try: + return download_hf_file(art["hf_path"], dest, art["sha256"], int(art.get("size", 0)), progress_cb=progress_cb) + except Exception as e: + cloudlog.warning(f"precompiled {meta['key']} unavailable from HF ({e}); trying LFS") + if not art.get("objects"): + raise + return download_lfs_bundle(art["objects"], dest, art["sha256"], int(art.get("size", 0)), progress_cb=progress_cb) + + +def patch_tinygrad_fetch_fw() -> None: + import pathlib + + import zstandard + from tinygrad import helpers + if getattr(helpers.fetch_fw, "_iq_patched", False): + return + _orig = helpers.fetch_fw + + def fetch_fw(path, name, sha256): + mirror = pathlib.Path(FIRMWARE_MIRROR) / path / name + if mirror.is_file(): + blob = mirror.read_bytes() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + p = pathlib.Path(f"/lib/firmware/{path}/{name}.zst") + if p.is_file(): + blob = zstandard.ZstdDecompressor().stream_reader(p.read_bytes()).read() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + blob = _orig(path, name, sha256) + # The dock's GPU firmware otherwise lives only in tinygrad's per-user download cache, which is + # a network fetch the first time a new HOME sees it; onroad the car is usually offline. + try: + mirror.parent.mkdir(parents=True, exist_ok=True) + tmp = mirror.with_suffix(mirror.suffix + ".part") + tmp.write_bytes(blob) + os.replace(tmp, mirror) + except OSError: + pass + return blob + + fetch_fw._iq_patched = True + helpers.fetch_fw = fetch_fw diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py new file mode 100644 index 000000000..b9dc2c77e --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.egpu_model") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.egpu_model import * diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/emac_model_meta.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/emac_model_meta.py new file mode 100644 index 000000000..75f405d67 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/emac_model_meta.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.emac_model_meta") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.emac_model_meta import * diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/messaging.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/messaging.py new file mode 100644 index 000000000..ca43b2702 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/messaging.py @@ -0,0 +1,269 @@ +from __future__ import annotations + +import os +from dataclasses import dataclass, field + +import capnp +import numpy as np + +from iqpilot.cereal import log +from iqpilot.selfdrive.iqmodeld.models.helpers import plan_x_idxs_helper +from iqpilot.selfdrive.iqmodeld.config import ModelConstants, Plan +from iqpilot.selfdrive.controls.lib.drive_helpers import get_curvature_from_plan + +SEND_RAW_PRED = os.getenv("SEND_RAW_PRED") +ConfidenceClass = log.ModelDataV2.ConfidenceClass + + +def pick_curvature(outputs: dict[str, np.ndarray], plan_rows: np.ndarray, vehicle_speed: float, + action_horizon: float, synthetic_lane_logic: bool) -> float: + direct_signal = None if synthetic_lane_logic else outputs.get("desired_curvature") + if direct_signal is not None: + return float(direct_signal[0, 0]) + + yaw_track = plan_rows[:, Plan.T_FROM_CURRENT_EULER][:, 2] + yaw_rate_track = plan_rows[:, Plan.ORIENTATION_RATE][:, 2] + return float(get_curvature_from_plan(yaw_track, yaw_rate_track, ModelConstants.T_IDXS, vehicle_speed, action_horizon)) + + +@dataclass +class DrivePacketMemory: + disengage_rollup: np.ndarray = field(default_factory=lambda: np.zeros( + ModelConstants.CONFIDENCE_BUFFER_LEN * ModelConstants.DISENGAGE_WIDTH, dtype=np.float32)) + brake_watch_5: np.ndarray = field(default_factory=lambda: np.zeros( + ModelConstants.FCW_5MS2_PROBS_WIDTH, dtype=np.float32)) + brake_watch_3: np.ndarray = field(default_factory=lambda: np.zeros( + ModelConstants.FCW_3MS2_PROBS_WIDTH, dtype=np.float32)) + + +def _assign_xyz(builder, t_points, x_track, y_track, z_track, + x_std=None, y_std=None, z_std=None) -> None: + builder.t = t_points + builder.x = x_track.tolist() + builder.y = y_track.tolist() + builder.z = z_track.tolist() + if x_std is not None: + builder.xStd = x_std.tolist() + if y_std is not None: + builder.yStd = y_std.tolist() + if z_std is not None: + builder.zStd = z_std.tolist() + + +def _assign_xyva(builder, t_points, x_track, y_track, v_track, a_track, + x_std=None, y_std=None, v_std=None, a_std=None) -> None: + builder.t = t_points + builder.x = x_track.tolist() + builder.y = y_track.tolist() + builder.v = v_track.tolist() + builder.a = a_track.tolist() + if x_std is not None: + builder.xStd = x_std.tolist() + if y_std is not None: + builder.yStd = y_std.tolist() + if v_std is not None: + builder.vStd = v_std.tolist() + if a_std is not None: + builder.aStd = a_std.tolist() + + +def fill_xyz_poly(builder, degree: int, x_track: np.ndarray, y_track: np.ndarray, z_track: np.ndarray) -> None: + stacked = np.stack([x_track, y_track, z_track], axis=1) + coeffs = np.polynomial.polynomial.polyfit(ModelConstants.T_IDXS, stacked, deg=degree) + builder.xCoefficients = coeffs[:, 0].tolist() + builder.yCoefficients = coeffs[:, 1].tolist() + builder.zCoefficients = coeffs[:, 2].tolist() + + +def fill_lane_line_meta(builder, lane_lines, lane_probs: list[float]) -> None: + builder.leftY = lane_lines[1].y[0] + builder.leftProb = lane_probs[1] + builder.rightY = lane_lines[2].y[0] + builder.rightProb = lane_probs[2] + + +def _roll_brake_watch(outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout) -> bool: + memory.brake_watch_5[:-1] = memory.brake_watch_5[1:] + memory.brake_watch_5[-1] = outputs["meta"][0, meta_layout.HARD_BRAKE_5][0] + memory.brake_watch_3[:-1] = memory.brake_watch_3[1:] + memory.brake_watch_3[-1] = outputs["meta"][0, meta_layout.HARD_BRAKE_3][0] + return bool( + (memory.brake_watch_5 > ModelConstants.FCW_THRESHOLDS_5MS2).all() + and (memory.brake_watch_3 > ModelConstants.FCW_THRESHOLDS_3MS2).all() + ) + + +def _confidence_bucket(outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout, frame_id: int): + width = ModelConstants.DISENGAGE_WIDTH + if frame_id % (2 * ModelConstants.MODEL_FREQ) == 0: + brake_probs = outputs["meta"][0, meta_layout.BRAKE_DISENGAGE] + gas_probs = outputs["meta"][0, meta_layout.GAS_DISENGAGE] + steer_probs = outputs["meta"][0, meta_layout.STEER_OVERRIDE] + takeover_curve = 1 - ((1 - brake_probs) * (1 - gas_probs) * (1 - steer_probs)) + independent = np.r_[takeover_curve[0], np.diff(takeover_curve) / (1 - takeover_curve[:-1])] + memory.disengage_rollup[:-width] = memory.disengage_rollup[width:] + memory.disengage_rollup[-width:] = independent + + score = 0.0 + for idx in range(width): + score += memory.disengage_rollup[idx * width + width - 1 - idx].item() / width + + if score < ModelConstants.RYG_GREEN: + return ConfidenceClass.green + if score < ModelConstants.RYG_YELLOW: + return ConfidenceClass.yellow + return ConfidenceClass.red + + +def _write_plan_family(model_packet, driving_packet, outputs: dict[str, np.ndarray]) -> None: + plan_rows = outputs["plan"][0] + plan_stds = outputs["plan_stds"][0] + _assign_xyz(model_packet.position, ModelConstants.T_IDXS, *plan_rows[:, Plan.POSITION].T, *plan_stds[:, Plan.POSITION].T) + _assign_xyz(model_packet.velocity, ModelConstants.T_IDXS, *plan_rows[:, Plan.VELOCITY].T) + _assign_xyz(model_packet.acceleration, ModelConstants.T_IDXS, *plan_rows[:, Plan.ACCELERATION].T) + _assign_xyz(model_packet.orientation, ModelConstants.T_IDXS, *plan_rows[:, Plan.T_FROM_CURRENT_EULER].T) + _assign_xyz(model_packet.orientationRate, ModelConstants.T_IDXS, *plan_rows[:, Plan.ORIENTATION_RATE].T) + fill_xyz_poly(driving_packet.path, ModelConstants.POLY_PATH_DEGREE, *plan_rows[:, Plan.POSITION].T) + + +def _write_temporal_pose(model_packet, outputs: dict[str, np.ndarray]) -> None: + pose_packet = model_packet.temporalPoseDEPRECATED + if "sim_pose" in outputs: + half_width = ModelConstants.POSE_WIDTH // 2 + pose_packet.trans = outputs["sim_pose"][0, :half_width].tolist() + pose_packet.transStd = outputs["sim_pose_stds"][0, :half_width].tolist() + pose_packet.rot = outputs["sim_pose"][0, half_width:].tolist() + pose_packet.rotStd = outputs["sim_pose_stds"][0, half_width:].tolist() + return + + pose_packet.trans = outputs["plan"][0, 0, Plan.VELOCITY].tolist() + pose_packet.transStd = outputs["plan_stds"][0, 0, Plan.VELOCITY].tolist() + pose_packet.rot = outputs["plan"][0, 0, Plan.ORIENTATION_RATE].tolist() + pose_packet.rotStd = outputs["plan_stds"][0, 0, Plan.ORIENTATION_RATE].tolist() + + +def _write_lane_family(model_packet, driving_packet, outputs: dict[str, np.ndarray]) -> None: + time_axis = plan_x_idxs_helper(ModelConstants, Plan, outputs) + model_packet.init("laneLines", 4) + for lane_idx in range(4): + lane_builder = model_packet.laneLines[lane_idx] + _assign_xyz( + lane_builder, + time_axis, + np.array(ModelConstants.X_IDXS), + outputs["lane_lines"][0, lane_idx, :, 0], + outputs["lane_lines"][0, lane_idx, :, 1], + ) + model_packet.laneLineStds = outputs["lane_lines_stds"][0, :, 0, 0].tolist() + model_packet.laneLineProbs = outputs["lane_lines_prob"][0, 1::2].tolist() + fill_lane_line_meta(driving_packet.laneLineMeta, model_packet.laneLines, model_packet.laneLineProbs) + + model_packet.init("roadEdges", 2) + for edge_idx in range(2): + edge_builder = model_packet.roadEdges[edge_idx] + _assign_xyz( + edge_builder, + time_axis, + np.array(ModelConstants.X_IDXS), + outputs["road_edges"][0, edge_idx, :, 0], + outputs["road_edges"][0, edge_idx, :, 1], + ) + model_packet.roadEdgeStds = outputs["road_edges_stds"][0, :, 0, 0].tolist() + + +def _write_leads(model_packet, outputs: dict[str, np.ndarray]) -> None: + model_packet.init("leadsV3", 3) + for lead_idx in range(3): + lead_builder = model_packet.leadsV3[lead_idx] + _assign_xyva( + lead_builder, + ModelConstants.LEAD_T_IDXS, + *outputs["lead"][0, lead_idx].T, + *outputs["lead_stds"][0, lead_idx].T, + ) + lead_builder.prob = outputs["lead_prob"][0, lead_idx].tolist() + lead_builder.probTime = ModelConstants.LEAD_T_OFFSETS[lead_idx] + + +def _write_meta(model_packet, outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout, frame_id: int) -> None: + meta = model_packet.meta + meta.desireState = outputs["desire_state"][0].reshape(-1).tolist() + meta.desirePrediction = outputs["desire_pred"][0].reshape(-1).tolist() + meta.engagedProb = outputs["meta"][0, meta_layout.ENGAGED].item() + meta.init("disengagePredictions") + + pred = meta.disengagePredictions + pred.t = ModelConstants.META_T_IDXS + pred.brakeDisengageProbs = outputs["meta"][0, meta_layout.BRAKE_DISENGAGE].tolist() + pred.gasDisengageProbs = outputs["meta"][0, meta_layout.GAS_DISENGAGE].tolist() + pred.steerOverrideProbs = outputs["meta"][0, meta_layout.STEER_OVERRIDE].tolist() + pred.brake3MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_3].tolist() + pred.brake4MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_4].tolist() + pred.brake5MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_5].tolist() + + if hasattr(meta_layout, "GAS_PRESS") and hasattr(meta_layout, "BRAKE_PRESS"): + pred.gasPressProbs = outputs["meta"][0, meta_layout.GAS_PRESS].tolist() + pred.brakePressProbs = outputs["meta"][0, meta_layout.BRAKE_PRESS].tolist() + + meta.hardBrakePredicted = _roll_brake_watch(outputs, memory, meta_layout) + model_packet.confidence = _confidence_bucket(outputs, memory, meta_layout, frame_id) + + +def populate_drive_messages(primary_msg: capnp._DynamicStructBuilder, extended_msg: capnp._DynamicStructBuilder, + outputs: dict[str, np.ndarray], action: log.ModelDataV2.Action, + memory: DrivePacketMemory, vipc_frame_id: int, vipc_frame_id_extra: int, + frame_id: int, frame_drop: float, timestamp_eof: int, + model_execution_time: float, valid: bool, meta_layout) -> None: + frame_age = frame_id - vipc_frame_id if frame_id > vipc_frame_id else 0 + frame_drop_percent = frame_drop * 100 + primary_msg.valid = valid + extended_msg.valid = valid + + driving_packet = primary_msg.drivingModelData + driving_packet.frameId = vipc_frame_id + driving_packet.frameIdExtra = vipc_frame_id_extra + driving_packet.frameDropPerc = frame_drop_percent + driving_packet.modelExecutionTime = model_execution_time + driving_packet.action = action + + model_packet = extended_msg.modelV2 + model_packet.frameId = vipc_frame_id + model_packet.frameIdExtra = vipc_frame_id_extra + model_packet.frameAge = frame_age + model_packet.frameDropPerc = frame_drop_percent + model_packet.timestampEof = timestamp_eof + model_packet.modelExecutionTime = model_execution_time + model_packet.action = action + + _write_plan_family(model_packet, driving_packet, outputs) + _write_temporal_pose(model_packet, outputs) + _write_lane_family(model_packet, driving_packet, outputs) + _write_leads(model_packet, outputs) + _write_meta(model_packet, outputs, memory, meta_layout, vipc_frame_id) + + if SEND_RAW_PRED: + model_packet.rawPredictions = outputs["raw_pred"].tobytes() + + +def populate_odometry_message(msg: capnp._DynamicStructBuilder, outputs: dict[str, np.ndarray], + vipc_frame_id: int, vipc_dropped_frames: int, + timestamp_eof: int, live_calib_seen: bool) -> None: + msg.valid = live_calib_seen & (vipc_dropped_frames < 1) + odo = msg.cameraOdometry + odo.frameId = vipc_frame_id + odo.timestampEof = timestamp_eof + odo.trans = outputs["pose"][0, :3].tolist() + odo.rot = outputs["pose"][0, 3:].tolist() + odo.wideFromDeviceEuler = outputs["wide_from_device_euler"][0, :].tolist() + odo.roadTransformTrans = outputs["road_transform"][0, :3].tolist() + odo.transStd = outputs["pose_stds"][0, :3].tolist() + odo.rotStd = outputs["pose_stds"][0, 3:].tolist() + odo.wideFromDeviceEulerStd = outputs["wide_from_device_euler_stds"][0, :].tolist() + odo.roadTransformTransStd = outputs["road_transform_stds"][0, :3].tolist() + +__all__ = [ + "DrivePacketMemory", + "pick_curvature", + "populate_drive_messages", + "populate_odometry_message", +] diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/metadata.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/metadata.py new file mode 100644 index 000000000..c81ebe542 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/metadata.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +import codecs +import pathlib +import pickle +import sys +from collections.abc import Iterable +from typing import Any + +from iqpilot.cereal import custom +from tinygrad.nn.onnx import OnnxPBParser + +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle +from iqpilot.selfdrive.iqmodeld.config import Meta + + +ModelBundle = custom.IQModelManager.ModelBundle + + +def _blank_proto_doc() -> dict[str, Any]: + return {"graph": {"input": [], "output": []}, "metadata_props": []} + + +class TelemetryEnvelopeParser(OnnxPBParser): + def _parse_ModelProto(self) -> dict: + envelope = _blank_proto_doc() + for fid, wire_type in self._parse_message(self.reader.len): + if fid == 7: + envelope["graph"] = self._parse_GraphProto() + elif fid == 14: + envelope["metadata_props"].append(self._parse_StringStringEntryProto()) + else: + self.reader.skip_field(wire_type) + return envelope + + +def _shape_fingerprint(value_info: dict[str, Any]) -> tuple[str, tuple[int, ...]]: + resolved = [] + for axis in value_info["parsed_type"].shape: + resolved.append(int(axis) if isinstance(axis, int) else 0) + return value_info["name"], tuple(resolved) + + +def _lookup_metadata(props: Iterable[dict[str, Any]], wanted_key: str) -> str | Any: + for entry in props: + if entry["key"] == wanted_key: + return entry["value"] + return None + + +class Meta20hz(Meta): + ENGAGED = slice(0, 1) + GAS_DISENGAGE = slice(1, 31, 6) + BRAKE_DISENGAGE = slice(2, 31, 6) + STEER_OVERRIDE = slice(3, 31, 6) + HARD_BRAKE_3 = slice(4, 31, 6) + HARD_BRAKE_4 = slice(5, 31, 6) + HARD_BRAKE_5 = slice(6, 31, 6) + GAS_PRESS = slice(31, 55, 4) + BRAKE_PRESS = slice(32, 55, 4) + LEFT_BLINKER = slice(33, 55, 4) + RIGHT_BLINKER = slice(34, 55, 4) + + +def select_meta_layout(): + active_bundle = get_active_bundle() + return Meta20hz if active_bundle is not None and active_bundle.is20hz else Meta + + +def _decoded_slices(props: Iterable[dict[str, Any]]): + encoded = _lookup_metadata(props, "output_slices") + assert encoded is not None, "output_slices not found in metadata" + return pickle.loads(codecs.decode(encoded.encode(), "base64")) + + +def _graph_shape_table(graph_doc: dict[str, Any], field_name: str) -> dict[str, tuple[int, ...]]: + return dict(_shape_fingerprint(item) for item in graph_doc[field_name]) + + +def build_metadata_record(model_path): + parsed = TelemetryEnvelopeParser(model_path).parse() + props = parsed["metadata_props"] + graph = parsed["graph"] + return { + "model_checkpoint": _lookup_metadata(props, "model_checkpoint"), + "output_slices": _decoded_slices(props), + "input_shapes": _graph_shape_table(graph, "input"), + "output_shapes": _graph_shape_table(graph, "output"), + } + + +if __name__ == "__main__": + model_path = pathlib.Path(sys.argv[1]) + metadata_path = model_path.parent / f"{model_path.stem}_metadata.pkl" + with open(metadata_path, "wb") as handle: + pickle.dump(build_metadata_record(model_path), handle) + print(f"saved metadata to {metadata_path}") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py new file mode 100644 index 000000000..f71e29594 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py @@ -0,0 +1,211 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +import json +import os + +MODELS_BASE_URLS = ( + "https://git.konn3kt.com/teal/IQModels/raw/branch/main", + "https://gitlvb.teallvbs.xyz/teal/IQModels/raw/branch/main", +) +CHUNK = 4 * 1024 * 1024 +HTTP_TIMEOUT_S = 60.0 +STREAM_RETRIES = 6 + + +def _requests_auth(): + import importlib + for mod in ("iqpilot_private.models.git_auth", "iqpilot.models_private_src.git_auth", + "iqpilot.selfdrive.iqmodeld.models.git_auth"): + try: + return importlib.import_module(mod).get_requests_auth() + except Exception: + continue + return None + + +def _hf(): + import importlib + for mod in ("iqpilot_private.models.git_auth", "iqpilot.selfdrive.iqmodeld.models.git_auth"): + try: + m = importlib.import_module(mod) + return m.get_hf_headers(), m.hf_resolve_url + except Exception: + continue + return None, None + + +def download_hf_file(hf_path: str, dst: str, sha256: str, size: int, progress_cb=None) -> str: + import requests + headers, resolve = _hf() + if resolve is None: + raise RuntimeError("no HF credentials available") + url = resolve(hf_path) + os.makedirs(os.path.dirname(dst), exist_ok=True) + tmp = dst + ".hfpart" + last_error: Exception | None = None + for _attempt in range(STREAM_RETRIES): + try: + have = os.path.getsize(tmp) if os.path.isfile(tmp) else 0 + if size and have > size: + os.remove(tmp) + have = 0 + if not size or have < size: + req_headers = dict(headers) + if have: + req_headers["Range"] = f"bytes={have}-" + with requests.get(url, headers=req_headers, stream=True, timeout=HTTP_TIMEOUT_S, allow_redirects=True) as r: + r.raise_for_status() + if have and r.status_code != 206: + have = 0 + with open(tmp, "ab" if have else "wb") as f: + got = have + for chunk in r.iter_content(CHUNK): + f.write(chunk) + got += len(chunk) + if progress_cb is not None and size: + progress_cb(min(1.0, got / size)) + digest = hashlib.sha256() + with open(tmp, "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + digest.update(chunk) + if size and os.path.getsize(tmp) != size: + raise RuntimeError(f"size mismatch: {os.path.getsize(tmp)}/{size} bytes") + if sha256 and digest.hexdigest() != sha256: + os.remove(tmp) + raise RuntimeError("sha256 mismatch") + os.replace(tmp, dst) + return dst + except Exception as e: + last_error = e + raise RuntimeError(f"HF download failed: {last_error}") + + +def _lfs_endpoint(base_url: str) -> str: + return base_url.split("/raw/", 1)[0] + ".git/info/lfs" + + +def _resolve_oid(session, base_url: str, oid: str, size: int, auth): + import requests + batch = session.post(f"{_lfs_endpoint(base_url)}/objects/batch", + data=json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}), + headers={"Content-Type": "application/vnd.git-lfs+json", + "Accept": "application/vnd.git-lfs+json"}, + auth=auth, timeout=HTTP_TIMEOUT_S) + batch.raise_for_status() + entry = batch.json()["objects"][0] + if "actions" not in entry: + raise requests.RequestException(f"LFS object unavailable: {entry.get('error', oid)}") + action = entry["actions"]["download"] + return action["href"], action.get("header", {}) + + +def _part_path(dst: str, oid: str) -> str: + return os.path.join(dst + ".parts", oid) + + +def _part_complete(path: str, oid: str, size: int) -> bool: + if not os.path.isfile(path) or os.path.getsize(path) != size: + return False + digest = hashlib.sha256() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + digest.update(chunk) + return digest.hexdigest() == oid + + +def _fetch_part(session, base_url: str, obj: dict, path: str, auth, progress) -> None: + size = int(obj["size"]) + have = os.path.getsize(path) if os.path.isfile(path) else 0 + if have > size: + os.remove(path) + have = 0 + href, headers = _resolve_oid(session, base_url, obj["oid"], size, auth) + obj_auth = None if headers.get("Authorization") else auth + # LFS parts are content-addressed (oid == sha256), so a half-written part can be resumed with a + # Range request and verified afterwards instead of being thrown away on every restart. + if have: + headers = {**headers, "Range": f"bytes={have}-"} + with session.get(href, headers=headers, stream=True, timeout=HTTP_TIMEOUT_S, auth=obj_auth) as r: + r.raise_for_status() + if have and r.status_code != 206: + have = 0 + with open(path, "ab" if have else "wb") as f: + for chunk in r.iter_content(CHUNK): + f.write(chunk) + progress(len(chunk)) + + +def download_lfs_bundle(objects: list, dst: str, sha256: str, size: int, progress_cb=None) -> str: + import requests + auth = _requests_auth() + session = requests.Session() + os.makedirs(dst + ".parts", exist_ok=True) + total = int(size) or sum(int(o["size"]) for o in objects) + done_bytes = sum(int(o["size"]) for o in objects if _part_complete(_part_path(dst, o["oid"]), o["oid"], int(o["size"]))) + got = [done_bytes] + + def progress(n: int) -> None: + got[0] += n + if progress_cb is not None and total: + progress_cb(min(1.0, got[0] / total)) + + last_error: Exception | None = None + for base_url in MODELS_BASE_URLS: + for _attempt in range(STREAM_RETRIES): + try: + for obj in objects: + path = _part_path(dst, obj["oid"]) + if _part_complete(path, obj["oid"], int(obj["size"])): + continue + got[0] = done_bytes + _fetch_part(session, base_url, obj, path, auth, progress) + if not _part_complete(path, obj["oid"], int(obj["size"])): + if os.path.getsize(path) >= int(obj["size"]): + os.remove(path) + raise RuntimeError(f"part {obj['oid'][:12]} incomplete or failed verification") + done_bytes += int(obj["size"]) + got[0] = done_bytes + break + except Exception as e: + last_error = e + else: + continue + break + else: + raise RuntimeError(f"model bundle download failed: {last_error}") + + tmp = dst + ".part" + digest = hashlib.sha256() + with open(tmp, "wb") as out: + for obj in objects: + with open(_part_path(dst, obj["oid"]), "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + out.write(chunk) + digest.update(chunk) + if total and os.path.getsize(tmp) != total: + os.remove(tmp) + raise RuntimeError(f"size mismatch: {os.path.getsize(tmp) if os.path.exists(tmp) else 0}/{total} bytes") + if sha256 and digest.hexdigest() != sha256: + os.remove(tmp) + for obj in objects: + try: + os.remove(_part_path(dst, obj["oid"])) + except OSError: + pass + raise RuntimeError("sha256 mismatch") + os.replace(tmp, dst) + for obj in objects: + try: + os.remove(_part_path(dst, obj["oid"])) + except OSError: + pass + try: + os.rmdir(dst + ".parts") + except OSError: + pass + return dst diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_channel.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_channel.py new file mode 100644 index 000000000..a9fa710bc --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_channel.py @@ -0,0 +1,58 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import mmap +import os +import pickle +import struct + +from iqpilot.common.swaglog import cloudlog + +SMALL_CHANNEL = "/dev/shm/iqpilot_smallmodel" +BIG_CHANNEL = "/dev/shm/iqpilot_bigmodel" +SHM_SIZE = 8 * 1024 * 1024 +HEADER = struct.Struct(" None: + data = pickle.dumps(payload, protocol=pickle.HIGHEST_PROTOCOL) + if HEADER.size + len(data) > SHM_SIZE: + cloudlog.error(f"model payload {len(data)} bytes exceeds shm {SHM_SIZE}, dropping frame {frame_id}") + return + seq = HEADER.unpack(self.mm[:HEADER.size])[0] + HEADER.pack_into(self.mm, 0, seq + 1, frame_id, len(data)) + self.mm[HEADER.size:HEADER.size + len(data)] = data + HEADER.pack_into(self.mm, 0, seq + 2, frame_id, len(data)) + + def peek_frame_id(self) -> int | None: + seq, frame_id, length = HEADER.unpack(self.mm[:HEADER.size]) + if seq == 0 or seq % 2 != 0 or length == 0: + return None + return frame_id + + def read(self) -> tuple[int, dict] | None: + seq1, frame_id, length = HEADER.unpack(self.mm[:HEADER.size]) + if seq1 == 0 or seq1 % 2 != 0 or length == 0: + return None + data = bytes(self.mm[HEADER.size:HEADER.size + length]) + seq2 = HEADER.unpack(self.mm[:HEADER.size])[0] + if seq1 != seq2: + return None + try: + return frame_id, pickle.loads(data) + except Exception: + return None diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_warp.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_warp.py new file mode 100644 index 000000000..50697728a --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_warp.py @@ -0,0 +1,80 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import os +import pickle + +import numpy as np + +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware.hw import Paths + + +def _load_bundle(pkl_path: str, cam_w: int, cam_h: int, frame_skip: int) -> dict: + with open(pkl_path, "rb") as f: + bundle = pickle.load(f) + if bundle.get("frame_skip") != frame_skip: + raise RuntimeError(f"frame_skip {bundle.get('frame_skip')} != {frame_skip}") + if (cam_w, cam_h) not in bundle: + raise RuntimeError(f"missing {cam_w}x{cam_h}; has {[k for k in bundle if isinstance(k, tuple)]}") + _verify_selftest(bundle, cam_w, cam_h) + return bundle + + +def _verify_selftest(bundle: dict, cam_w: int, cam_h: int) -> None: + want = bundle.get("selftest") + if not want: + raise RuntimeError("warp artifact predates the self-test; recompiling") + from iqpilot.system.camerad.cameras.nv12_info import get_nv12_info + from iqpilot.selfdrive.iqmodeld.tools.compile_warp import selftest_digest + nv12_size = get_nv12_info(cam_w, cam_h)[3] + got = selftest_digest(bundle[(cam_w, cam_h)], cam_w, cam_h, nv12_size) + if got != want: + raise RuntimeError(f"warp self-test {got[:12]} != {want[:12]}; artifact computes differently here") + + +class FrameWarp: + + def __init__(self, cam_w: int, cam_h: int, frame_skip: int): + from tinygrad.tensor import Tensor + + pkl_path = os.path.join(Paths.model_root(), f"emac_warp_{cam_w}x{cam_h}_tinygrad.pkl") + bundle = None + if os.path.isfile(pkl_path): + try: + bundle = _load_bundle(pkl_path, cam_w, cam_h, frame_skip) + except Exception as e: + cloudlog.warning(f"warp artifact unusable ({e}); discarding and recompiling") + os.remove(pkl_path) + if bundle is None: + cloudlog.warning(f"warp artifact missing; compiling for {cam_w}x{cam_h} (one-time)") + from iqpilot.selfdrive.iqmodeld.tools.compile_warp import compile_warp + compile_warp(cam_w, cam_h, pkl_path, frame_skip=frame_skip) + cloudlog.warning(f"warp compiled -> {pkl_path}") + bundle = _load_bundle(pkl_path, cam_w, cam_h, frame_skip) + self._jit = bundle[(cam_w, cam_h)] + + self._npy = {"tfm": np.zeros((3, 3), dtype=np.float32), "big_tfm": np.zeros((3, 3), dtype=np.float32)} + self._tensors = {k: Tensor(v, device="NPY").realize() for k, v in self._npy.items()} + self._blob_cache: dict[tuple[str, int], object] = {} + self._Tensor = Tensor + + def _frame_tensor(self, key: str, buf): + from tinygrad.device import Device + arr = np.frombuffer(buf.data, dtype=np.uint8) + ck = (key, arr.ctypes.data) + t = self._blob_cache.get(ck) + if t is None: + t = self._Tensor.from_blob(arr.ctypes.data, (arr.size,), dtype="uint8", device=Device.DEFAULT) + self._blob_cache[ck] = t + return t + + def run(self, main_buf, extra_buf, main_tfm: np.ndarray, extra_tfm: np.ndarray) -> np.ndarray: + self._npy["tfm"][:] = main_tfm + self._npy["big_tfm"][:] = extra_tfm + warped = self._jit(tfm=self._tensors["tfm"], big_tfm=self._tensors["big_tfm"], + frame=self._frame_tensor("img", main_buf), + big_frame=self._frame_tensor("big_img", extra_buf)) + return warped.numpy().astype(np.uint8, copy=False) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py new file mode 100644 index 000000000..5ece1c074 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py new file mode 100644 index 000000000..bf17800a7 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py @@ -0,0 +1,100 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import os +import re +from pathlib import Path + +from iqpilot.system.hardware.hw import Paths + + +_MODEL_ROOT = Path(Paths.model_root()) +_OVERRIDE_KEYS = ( + "combinedRuntimeArtifact", + "combinedSplitArtifact", + "iqCombinedArtifact", +) +_SPLIT_ROLE_PATTERN = re.compile(r"^driving_(vision|policy|off_policy|on_policy)_(.+)_tinygrad\.pkl$") + + +def _bundle_models(bundle) -> list: + models = getattr(bundle, "models", None) + return list(models) if models is not None else [] + + +def _bundle_override_map(bundle) -> dict[str, str]: + result: dict[str, str] = {} + for override in getattr(bundle, "overrides", None) or []: + key = getattr(override, "key", None) + value = getattr(override, "value", None) + if key and value: + result[str(key)] = str(value) + return result + + +def _artifact_name(model) -> str: + return getattr(getattr(model, "artifact", None), "fileName", "") or "" + + +def _split_suffixes(bundle) -> list[str]: + suffixes: list[str] = [] + for model in _bundle_models(bundle): + match = _SPLIT_ROLE_PATTERN.match(_artifact_name(model)) + if match: + suffixes.append(match.group(2)) + return suffixes + + +def _derived_candidates(bundle) -> list[str]: + seen: set[str] = set() + candidates: list[str] = [] + + for suffix in _split_suffixes(bundle): + for candidate in ( + f"driving_combined_{suffix}.pkl", + f"iqmodeld_combined_{suffix}.pkl", + ): + if candidate not in seen: + seen.add(candidate) + candidates.append(candidate) + + ref = getattr(bundle, "ref", None) + if ref: + short_ref = str(ref)[:8] + for candidate in ( + f"driving_combined_{short_ref}.pkl", + f"iqmodeld_combined_{short_ref}.pkl", + ): + if candidate not in seen: + seen.add(candidate) + candidates.append(candidate) + + return candidates + + +def combined_split_artifact_candidates(bundle) -> list[Path]: + explicit_env = os.getenv("IQMODEL_COMBINED_PKL") + if explicit_env: + explicit_path = Path(explicit_env) + return [explicit_path if explicit_path.is_absolute() else _MODEL_ROOT / explicit_path] + + overrides = _bundle_override_map(bundle) + explicit_names = [overrides[key] for key in _OVERRIDE_KEYS if key in overrides] + if explicit_names: + return [_MODEL_ROOT / name for name in explicit_names] + + return [_MODEL_ROOT / name for name in _derived_candidates(bundle)] + + +def resolve_combined_split_artifact(bundle) -> Path | None: + for candidate in combined_split_artifact_candidates(bundle): + if candidate.is_file(): + return candidate + return None + + +def has_combined_split_artifact(bundle) -> bool: + return resolve_combined_split_artifact(bundle) is not None diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py new file mode 100644 index 000000000..d06c7c3dd --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.fetcher") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.fetcher import * # noqa: F403 diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py new file mode 100644 index 000000000..4b9a2f4d4 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python3 +""" +Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import json +import os +import shutil +from pathlib import Path + +from iqpilot.cereal import custom +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module +from iqpilot.system.hardware.hw import Paths + +try: + load_private_module(__name__, "iqpilot_private.models.helpers") +except ProprietaryModuleMissing: + try: + from iqpilot.models_private_src.helpers import * # noqa: F403 + except ImportError: + pass + + +ModelBundle = custom.IQModelManager.ModelBundle +Runner = custom.IQModelManager.Runner +_MODEL_ROOT = Path(Paths.model_root()) +_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle" +_MODELS_CACHE_KEY = "ModelManager_ModelsCache" +_RUNNER_CACHE_KEY = "ModelRunnerTypeCache" +_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex" +_PENDING_INDEX_KEY = "ModelManager_PendingIndex" +_PENDING_MODEL_RESTORE_FILE = "/data/k3_pending_model_restore" +_STOCK_RUNNER = int(Runner.stock) +_TINYGRAD_RUNNER = int(Runner.tinygrad) +_SNPE_RUNNER = int(Runner.snpe) + +_DEFAULT_MODEL_DIR = Path(__file__).resolve().parents[1] / "default_model" +_DEFAULT_BUNDLE_JSON = _DEFAULT_MODEL_DIR / "bundle.json" +_DEFAULT_BUNDLE_REF = "default" + + +def get_default_model_bundle(_bundles): + return None + + +def _coerce_runner_value(value) -> int | None: + raw = getattr(value, "raw", value) + try: + return int(raw) + except (TypeError, ValueError): + return None + + +def _bundle_models(bundle) -> list: + models = getattr(bundle, "models", None) + return list(models) if models is not None else [] + + +def _bundle_needs_runtime_upgrade(bundle) -> bool: + if bundle is None: + return False + + if _coerce_runner_value(getattr(bundle, "runner", None)) == _SNPE_RUNNER: + return True + + for model in _bundle_models(bundle): + file_name = getattr(getattr(model, "artifact", None), "fileName", "") or "" + if file_name.endswith(".thneed"): + return True + + return False + + +def _load_cached_manifest_bundles(params: Params): + cached = params.get(_MODELS_CACHE_KEY) or {} + bundles = [] + for raw_bundle in cached.get("bundles", []): + try: + min_selector_version = int(raw_bundle.get("minimumSelectorVersion", raw_bundle.get("minimum_selector_version", 0))) + compatibility_view = dict(raw_bundle) + compatibility_view["minimumSelectorVersion"] = min_selector_version + is_compatible = globals().get("is_bundle_version_compatible") + if is_compatible is not None and not is_compatible(compatibility_view): + continue + + if "short_name" in raw_bundle: + from iqpilot.selfdrive.iqmodeld.models.fetcher import ManifestDecoder + bundles.append(ManifestDecoder._decode_bundle(raw_bundle)) + continue + + if "internalName" in raw_bundle: + bundles.append(ModelBundle(**raw_bundle)) + continue + + bundle = ModelBundle() + bundle.index = int(raw_bundle["index"]) + bundle.internalName = raw_bundle.get("short_name") + bundle.displayName = raw_bundle.get("display_name") + bundle.status = 0 + bundle.generation = int(raw_bundle["generation"]) + bundle.environment = raw_bundle["environment"] + bundle.runner = raw_bundle.get("runner", Runner.tinygrad) + bundle.is20hz = raw_bundle.get("is_20hz", False) + bundle.minimumSelectorVersion = int(min_selector_version) + bundle.ref = raw_bundle.get("ref") + bundle.overrides = [] + for key, value in raw_bundle.get("overrides", {}).items(): + override = custom.IQModelManager.Override() + override.key = key + override.value = value + bundle.overrides.append(override) + + bundle.models = [] + for raw_model in raw_bundle.get("models", []): + model = custom.IQModelManager.Model() + model.type = raw_model.get("type") + for attr_name in ("artifact", "metadata"): + raw_artifact = raw_model.get(attr_name) + if not raw_artifact: + continue + artifact = custom.IQModelManager.Artifact() + artifact.fileName = raw_artifact.get("file_name") + download_uri = custom.IQModelManager.DownloadUri() + download_uri.uri = raw_artifact.get("download_uri", {}).get("url") + download_uri.sha256 = raw_artifact.get("download_uri", {}).get("sha256") + artifact.downloadUri = download_uri + setattr(model, attr_name, artifact) + bundle.models.append(model) + + bundles.append(bundle) + except Exception: + continue + return bundles + + +def _bundle_match_key(bundle) -> tuple[str | None, str | None, str | None]: + return ( + getattr(bundle, "ref", None), + getattr(bundle, "internalName", None), + getattr(bundle, "displayName", None), + ) + + +def _find_runtime_upgrade(bundle, params: Params, available_bundles=None): + if not _bundle_needs_runtime_upgrade(bundle): + return bundle + + candidate_bundles = available_bundles if available_bundles is not None else _load_cached_manifest_bundles(params) + ref, internal_name, display_name = _bundle_match_key(bundle) + + for candidate in candidate_bundles: + if getattr(candidate, "ref", None) and getattr(candidate, "ref", None) == ref: + return candidate + + for candidate in candidate_bundles: + if getattr(candidate, "internalName", None) == internal_name: + return candidate + + for candidate in candidate_bundles: + if getattr(candidate, "displayName", None) == display_name: + return candidate + + return None + + +def bundle_files_ready(bundle) -> bool: + if bundle is None: + return False + + for model in _bundle_models(bundle): + artifact = getattr(model, "artifact", None) + metadata = getattr(model, "metadata", None) + for file_name in (getattr(metadata, "fileName", None), getattr(artifact, "fileName", None)): + if file_name and not (_MODEL_ROOT / file_name).is_file(): + return False + return True + + +def persist_active_bundle(params: Params, bundle) -> None: + params.put(_ACTIVE_BUNDLE_KEY, bundle.to_dict()) + params.remove(_RUNNER_CACHE_KEY) + + +def _load_default_bundle_dict() -> dict: + return json.loads(_DEFAULT_BUNDLE_JSON.read_text()) + + +def _default_bundle_filenames(bundle_dict: dict) -> list[str]: + names = [] + for model in bundle_dict.get("models", []): + for artifact in (model.get("metadata"), model.get("artifact")): + file_name = artifact.get("fileName", "") if isinstance(artifact, dict) else "" + if file_name: + names.append(file_name) + return names + + +def is_default_bundle(bundle) -> bool: + return bool(bundle is not None and getattr(bundle, "ref", None) == _DEFAULT_BUNDLE_REF) + + +def ensure_default_model_files(bundle_dict: dict = None) -> None: + bundle_dict = bundle_dict if bundle_dict is not None else _load_default_bundle_dict() + try: + _MODEL_ROOT.mkdir(parents=True, exist_ok=True) + except OSError as e: + cloudlog.exception(f"default_model: cannot create model root: {e}") + return + for file_name in _default_bundle_filenames(bundle_dict): + src = _DEFAULT_MODEL_DIR / file_name + dst = _MODEL_ROOT / file_name + if not src.is_file(): + cloudlog.error(f"default_model: shipped asset missing {src}") + continue + if dst.is_file() and dst.stat().st_size == src.stat().st_size: + continue + try: + shutil.copy2(src, dst) + cloudlog.warning(f"default_model: staged {file_name} into model root") + except OSError as e: + cloudlog.exception(f"default_model: failed staging {file_name}: {e}") + + +def select_default_model(params: Params = None) -> None: + params = Params() if params is None else params + bundle_dict = _load_default_bundle_dict() + ensure_default_model_files(bundle_dict) + params.remove(_DOWNLOAD_INDEX_KEY) + params.remove(_PENDING_INDEX_KEY) + params.put(_ACTIVE_BUNDLE_KEY, bundle_dict) + params.remove(_RUNNER_CACHE_KEY) + params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER) + try: + if os.path.isfile(_PENDING_MODEL_RESTORE_FILE): + os.remove(_PENDING_MODEL_RESTORE_FILE) + except OSError: + pass + + +def seed_default_bundle_if_unset(params: Params = None) -> None: + params = Params() if params is None else params + if params.get(_ACTIVE_BUNDLE_KEY): + return + queued_download = params.get(_DOWNLOAD_INDEX_KEY) + try: + select_default_model(params) + if queued_download is not None: + params.put(_DOWNLOAD_INDEX_KEY, queued_download) + cloudlog.warning("default_model: seeded Default (CD210) as active bundle") + except Exception as e: + cloudlog.exception(f"default_model: failed to seed default bundle: {e}") + + +def get_runtime_bundle_upgrade(bundle, params: Params = None, available_bundles=None): + params = Params() if params is None else params + return _find_runtime_upgrade(bundle, params, available_bundles) + + +def get_active_bundle(params: Params = None): + params = Params() if params is None else params + + try: + active_bundle = params.get(_ACTIVE_BUNDLE_KEY) or {} + if not active_bundle: + return None + is_compatible = globals().get("is_bundle_version_compatible") + if is_compatible is not None and not is_compatible(active_bundle): + return None + bundle = ModelBundle(**active_bundle) + except Exception: + return None + + replacement = _find_runtime_upgrade(bundle, params) + if replacement is not None and replacement is not bundle and bundle_files_ready(replacement): + persist_active_bundle(params, replacement) + return replacement + + return bundle + + +def get_active_model_runner(params: Params = None, force_check=False): + params = Params() if params is None else params + + active_bundle = get_active_bundle(params) + if not active_bundle: + seed_default_bundle_if_unset(params) + active_bundle = get_active_bundle(params) + if not active_bundle: + if params.get(_RUNNER_CACHE_KEY) != str(_TINYGRAD_RUNNER): + params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER) + return _TINYGRAD_RUNNER + + cached_runner_type = params.get(_RUNNER_CACHE_KEY) + if cached_runner_type and not force_check and isinstance(cached_runner_type, str) and cached_runner_type.isdigit(): + return int(cached_runner_type) + + runner_type = _coerce_runner_value(active_bundle.runner) + if runner_type == _SNPE_RUNNER: + replacement = _find_runtime_upgrade(active_bundle, params) + if replacement is not None and replacement is not active_bundle and bundle_files_ready(replacement): + persist_active_bundle(params, replacement) + runner_type = _coerce_runner_value(replacement.runner) + else: + if replacement is not None and getattr(replacement, "index", None) is not None and params.get(_DOWNLOAD_INDEX_KEY) is None: + params.put(_DOWNLOAD_INDEX_KEY, int(replacement.index)) + cloudlog.warning(f"Queued tinygrad migration for retired bundle {getattr(active_bundle, 'internalName', '')}") + runner_type = _TINYGRAD_RUNNER + + if cached_runner_type != runner_type: + params.put(_RUNNER_CACHE_KEY, int(runner_type)) + + return runner_type diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/inference_state.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/inference_state.py new file mode 100644 index 000000000..1bc1a254a --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/inference_state.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.common.steer_delay import cached_steer_delay + + +class InferenceStateBase: + def __init__(self): + self.lat_delay = cached_steer_delay() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py new file mode 100644 index 000000000..8ede5f6c4 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py @@ -0,0 +1,231 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import os +import pickle as _pk +from dataclasses import dataclass, field +from typing import TYPE_CHECKING, Any + +import numpy as np +from iqpilot.cereal import custom +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import TICI +from iqpilot.system.hardware.hw import Paths as _hw_paths +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle as _fetch_bundle +from iqpilot.selfdrive.iqmodeld.models.combined_artifact import has_combined_split_artifact + +# ---- runtime type surface (native OpenCL/frame handles resolve to Any off-device) ---- +if TYPE_CHECKING: + from iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import GpuMemorySlot, RoadProjector +else: + def _resolve_native_types() -> tuple[Any, Any]: + try: + from iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import GpuMemorySlot as iq_clmem + from iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import RoadProjector as iq_frame + return iq_clmem, iq_frame + except (ModuleNotFoundError, ImportError): + return Any, Any + + GpuMemorySlot, RoadProjector = _resolve_native_types() + +NumpyDict = dict[str, np.ndarray] +ShapeDict = dict[str, tuple[int, ...]] +SliceDict = dict[str, slice] +CLMemDict = dict[str, GpuMemorySlot] +FrameDict = dict[str, RoadProjector] + +ModelType = custom.IQModelManager.Model.Type +Model = custom.IQModelManager.Model + +SEND_RAW_PRED = os.getenv("SEND_RAW_PRED") +CUSTOM_MODEL_PATH = _hw_paths.model_root() + +_META_FIELDS = ("input_shapes", "output_slices") + +USBGPU = "USBGPU" in os.environ + + +def _configure_accelerator(): + """Point tinygrad at the right backend. Must run before tinygrad is imported, + which is why it fires at module import.""" + backend, extra = ("QCOM" if TICI else "CPU"), {} + if USBGPU: + backend, extra = "AMD", {"AMD_IFACE": "USB"} + elif TICI: + extra = {"QCOM_PRIORITY": "8"} + os.environ["DEV"] = backend + os.environ.update(extra) + + +_configure_accelerator() + + +# real metadata pkls are a few KB; anything bigger is a model artifact wrongly +# referenced as metadata (pre-fix manifests self-referenced the artifact), and +# unpickling it here double-loads the model onto the GPU +_META_MAX_BYTES = 1 << 20 + + +def load_artifact_metadata(metadata_filename): + """Read one artifact's metadata pkl: (input shapes, output slices).""" + try: + path = os.path.join(CUSTOM_MODEL_PATH, metadata_filename) + if os.path.getsize(path) > _META_MAX_BYTES: + cloudlog.error(f"metadata pkl {metadata_filename} is artifact-sized, refusing to unpickle it") + return tuple({} for _ in _META_FIELDS) + with open(path, 'rb') as fh: + blob = _pk.load(fh) + return tuple(blob.get(field, {}) for field in _META_FIELDS) + except Exception: + cloudlog.exception(f"unreadable metadata pkl {metadata_filename}, continuing without it") + return tuple({} for _ in _META_FIELDS) + + +@dataclass +class ArtifactSpec: + """One model of the active bundle plus its unpacked metadata.""" + model: Any + metadata: Any = None + input_shapes: ShapeDict = field(default_factory=dict) + output_slices: SliceDict = field(default_factory=dict) + + def __post_init__(self): + self.metadata = self.model.metadata + if self.metadata: + self.input_shapes, self.output_slices = load_artifact_metadata(self.metadata.fileName) + + +# kept name: some runners annotate against the old alias +ModelData = ArtifactSpec + + +class RunnerRoot: + """Shared root of the runner hierarchy. + + Both ModelRunner and the per-model parser mixins (model_types.py) inherit + this, so the concrete `TinygradRunner(ModelRunner, *Tinygrad)` diamond keeps + one consistent parser registry + slice implementation. + """ + + parser_method_dict: dict + _model_data: "ArtifactSpec | None" + + def _slice_outputs(self, model_outputs): + raise NotImplementedError + + +class ModelRunner(RunnerRoot): + """Base for the tinygrad/ONNX runners. + + Owns the active bundle's ArtifactSpecs and the shared slice/parse plumbing; + subclasses provide input staging (prepare_inputs) and execution (_run_model). + """ + + # False for fused runners, which warp + manage temporal buffers inside the JIT + uses_opencl_warp = True + + def __init__(self): + active = _fetch_bundle() + if not active: + raise ValueError("runner started without an active model bundle") + + self.models = {spec.type.raw: ArtifactSpec(spec) for spec in _qcom_models(active)} + self.is_20hz_3d = False + self.is_20hz = active.is20hz + self.inputs = {} + self.parser_method_dict = {} + self._model_data = None # active spec for the current operation + self._parser = self._constants = None + + def _active_spec(self): + spec = self._model_data + if spec is None: + raise ValueError("Model data is not available. Ensure the model is loaded correctly.") + return spec + + # views proxied straight off the active artifact spec; kept out of the class + # body (served via __getattr__) so the read surface stays data-driven + _SPEC_VIEW = frozenset(("input_shapes", "output_slices")) + + def __getattr__(self, name): + if name == "constants": + return self._constants + if name == "vision_input_names": + return list(self._active_spec().input_shapes) + if name in ModelRunner._SPEC_VIEW: + return getattr(self._active_spec(), name) + raise AttributeError(name) + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + """Stage image + numpy inputs for inference; implemented per backend.""" + raise NotImplementedError + + def _run_model(self): + """Execute inference over the staged inputs; implemented per backend.""" + raise NotImplementedError + + def run_model(self): + # parsing happens inside each backend's _run_model + return self._run_model() + + def _slice_outputs(self, model_outputs): + """Split the flat output vector into named views per the artifact's slice table.""" + sliced = {} + for tag, span in self._active_spec().output_slices.items(): + sliced[tag] = model_outputs[np.newaxis, span] + if SEND_RAW_PRED: + sliced["raw_pred"] = model_outputs.copy() + return sliced + + +# ---- runner selection (which backend to build for the active bundle) ---------- + +def _qcom_models(bundle) -> list: + # usbeMac artifacts ride along in a bundle for the eGPU host; they are never + # loaded on QCOM and must not affect runner classification + return [m for m in bundle.models if m.type.raw != ModelType.usbeMac] + + +def _single_artifact_prefix(bundle, prefix: str) -> bool: + models = _qcom_models(bundle) + return len(models) == 1 and models[0].artifact.fileName.startswith(prefix) + + +def _is_fused_bundle(bundle) -> bool: + return _single_artifact_prefix(bundle, "driving_fused_") + + +def _is_supercombo_bundle(bundle) -> bool: + return _single_artifact_prefix(bundle, "driving_supercombo_") + + +def _is_split_bundle(bundle) -> bool: + present = {m.type.raw for m in _qcom_models(bundle)} + split_kinds = {ModelType.vision, ModelType.policy, ModelType.offPolicy, ModelType.onPolicy} + return not present.isdisjoint(split_kinds) + + +def get_model_runner() -> "ModelRunner": + """Build the runner backend that fits the active bundle (supercombo / fused / + combined-split / split / single). Concrete runners are imported lazily so one + backend failing to load can't take down the others at import time.""" + from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner import (TinygradRunner, + TinygradSplitRunner) + bundle = _fetch_bundle() + # an eMac-only bundle (no QCOM-loadable models) runs the stock default on + # device; the big host serves the bundle's precompiled artifact + if not (bundle and bundle.models and _qcom_models(bundle)): + return TinygradRunner(ModelType.supercombo) + + if _is_supercombo_bundle(bundle): + from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.supercombo_runner import TinygradSupercomboRunner + return TinygradSupercomboRunner() + if _is_fused_bundle(bundle): + from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.fused_runner import TinygradFusedRunner + return TinygradFusedRunner() + if _is_split_bundle(bundle) and has_combined_split_artifact(bundle): + from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.combined_split_runner import TinygradCombinedSplitRunner + return TinygradCombinedSplitRunner() + if _is_split_bundle(bundle): + return TinygradSplitRunner() + return TinygradRunner(_qcom_models(bundle)[0].type.raw) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py new file mode 100644 index 000000000..71a99cd13 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py @@ -0,0 +1,245 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import os +import pickle +from pathlib import Path +from typing import Any + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.combined_artifact import resolve_combined_split_artifact +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import NumpyDict, ShapeDict, SliceDict +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + + +def _tinygrad_imports(): + from tinygrad.device import Device + from tinygrad.tensor import Tensor + return Tensor, Device + + +def _phase_roles(meta_by_role: dict[str, dict]) -> list[str]: + return [name for name in meta_by_role if name != "vision"] + + +def _phase_desire_key(policy_shapes: dict[str, tuple[int, ...]]) -> str: + for key in policy_shapes: + if key.startswith("desire"): + return key + raise KeyError("No desire-like key found in policy inputs") + + +def _phase_image_keys(vision_shapes: dict[str, tuple[int, ...]]) -> tuple[str, str]: + names = sorted(name for name in vision_shapes if "img" in name) + road_key = next((name for name in names if "big" not in name), None) + wide_key = next((name for name in names if "big" in name), None) + if road_key is None or wide_key is None: + raise ValueError(f"Unable to resolve road/wide image keys from {list(vision_shapes)}") + return road_key, wide_key + + +def _base_policy_keys(policy_shapes: dict[str, tuple[int, ...]]) -> set[str]: + desired_key = _phase_desire_key(policy_shapes) + return {desired_key, "features_buffer", "traffic_convention", "action_t"} + + +def _slice_map(raw_blob: np.ndarray, slices: dict[str, slice]) -> NumpyDict: + return {name: raw_blob[np.newaxis, section] for name, section in slices.items() if name != "pad"} + + +class TinygradCombinedSplitRunner(ModelRunner): + uses_opencl_warp: bool = False + + def __init__(self): + super().__init__() + self._constants = SplitModelConstants + self._parser = PhaseParser() + self._bundle = get_active_bundle() + self._artifact_path = resolve_combined_split_artifact(self._bundle) + if self._artifact_path is None: + raise FileNotFoundError("No IQ combined split artifact is available for the active bundle") + + with open(self._artifact_path, "rb") as artifact: + runtime_package: dict[Any, Any] = pickle.load(artifact) + + self._meta_by_role = runtime_package.get("meta_by_role", runtime_package.get("metadata", {})) + self._policy_roles = runtime_package.get("roles", _phase_roles(self._meta_by_role)) + self._camera_programs = { + camera_key: spec + for camera_key, spec in runtime_package.items() + if isinstance(camera_key, tuple) and isinstance(spec, dict) + } + self._execute_bundle = runtime_package.get("execute_bundle", runtime_package.get("run_policy")) + self._frame_stride = int(runtime_package.get("frame_stride", runtime_package.get("frame_skip", 1))) + + if "vision" not in self._meta_by_role: + raise ValueError("Combined split artifact is missing vision metadata") + if not self._policy_roles: + raise ValueError("Combined split artifact is missing policy roles") + if self._execute_bundle is None: + raise ValueError("Combined split artifact is missing execute_bundle") + + self._vision_meta = self._meta_by_role["vision"] + self._primary_policy_meta = self._meta_by_role[self._policy_roles[0]] + self._desired_key = _phase_desire_key(self._primary_policy_meta["input_shapes"]) + self._road_key, self._wide_key = _phase_image_keys(self._vision_meta["input_shapes"]) + self._extra_policy_keys = [ + key for key in self._primary_policy_meta["input_shapes"] + if key not in _base_policy_keys(self._primary_policy_meta["input_shapes"]) + ] + + self._queue_tensors: dict[str, Any] | None = None + self._numpy_state: dict[str, np.ndarray] | None = None + self._camera_shape: tuple[int, int] | None = None + self._blob_cache: dict[tuple[str, int], Any] = {} + self._last_desire = np.zeros(self._primary_policy_meta["input_shapes"][self._desired_key][2], dtype=np.float32) + + @property + def vision_input_names(self) -> list[str]: + return [self._road_key, self._wide_key] + + @property + def input_shapes(self) -> ShapeDict: + merged: ShapeDict = dict(self._vision_meta["input_shapes"]) + for role in self._policy_roles: + merged.update(self._meta_by_role[role]["input_shapes"]) + return merged + + @property + def output_slices(self) -> SliceDict: + merged: SliceDict = dict(self._vision_meta["output_slices"]) + for role in self._policy_roles: + merged.update(self._meta_by_role[role]["output_slices"]) + return merged + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + raise RuntimeError("Combined split runner manages its own warp + queue state; use run_fused()") + + def _frame_blob(self, stream_name: str, buf): + Tensor, Device = _tinygrad_imports() + raw_frame = np.frombuffer(buf.data, dtype=np.uint8) + cache_key = (stream_name, raw_frame.ctypes.data) + tensor = self._blob_cache.get(cache_key) + if tensor is None: + tensor = Tensor.from_blob(raw_frame.ctypes.data, (raw_frame.size,), dtype="uint8", device=Device.DEFAULT) + self._blob_cache[cache_key] = tensor + return tensor + + def _allocate_runtime_state(self, camera_width: int, camera_height: int) -> None: + if self._queue_tensors is not None and self._camera_shape == (camera_width, camera_height): + return + if (camera_width, camera_height) not in self._camera_programs: + raise RuntimeError(f"No combined split kernels available for {camera_width}x{camera_height}") + + Tensor, Device = _tinygrad_imports() + vision_shapes = self._vision_meta["input_shapes"] + policy_shapes = self._primary_policy_meta["input_shapes"] + + image_shape = vision_shapes[self._road_key] + frame_history = image_shape[1] // 6 + queue_depth = self._frame_stride * (frame_history - 1) + 1 + frame_queue_shape = (queue_depth, 6, image_shape[2], image_shape[3]) + + feature_shape = policy_shapes["features_buffer"] + desired_shape = policy_shapes[self._desired_key] + traffic_shape = policy_shapes["traffic_convention"] + action_shape = policy_shapes.get("action_t", traffic_shape) + + numpy_state = { + "tfm": np.zeros((3, 3), dtype=np.float32), + "big_tfm": np.zeros((3, 3), dtype=np.float32), + "desire": np.zeros(desired_shape[2], dtype=np.float32), + "traffic_convention": np.zeros(traffic_shape, dtype=np.float32), + "action_t": np.zeros(action_shape, dtype=np.float32), + } + for key in self._extra_policy_keys: + numpy_state[key] = np.zeros(policy_shapes[key], dtype=np.float32) + + queue_tensors = { + "img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize(), + "big_img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize(), + "feat_q": Tensor( + np.zeros((self._frame_stride * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), dtype=np.float32), + device=Device.DEFAULT, + ).contiguous().realize(), + "desire_q": Tensor( + np.zeros((self._frame_stride * desired_shape[1], desired_shape[0], desired_shape[2]), dtype=np.float32), + device=Device.DEFAULT, + ).contiguous().realize(), + **{name: Tensor(value, device="NPY").realize() for name, value in numpy_state.items()}, + } + + self._queue_tensors = queue_tensors + self._numpy_state = numpy_state + self._camera_shape = (camera_width, camera_height) + + def _policy_inputs(self) -> dict[str, Any]: + assert self._queue_tensors is not None + tensor_names = ["feat_q", "desire_q", "desire", "traffic_convention", "action_t", *self._extra_policy_keys] + return {name: self._queue_tensors[name] for name in tensor_names if name in self._queue_tensors} + + def _merge_policy_outputs(self, raw_outputs: tuple[Any, ...]) -> NumpyDict: + outputs = self._parser.parse_vision_outputs( + _slice_map(raw_outputs[0].numpy().flatten(), self._vision_meta["output_slices"]) + ) + + has_on_policy = any(role == "on_policy" for role in self._policy_roles) + for role_name, tensor_out in zip(self._policy_roles, raw_outputs[1:], strict=True): + parsed = self._parser.parse_policy_outputs( + _slice_map(tensor_out.numpy().flatten(), self._meta_by_role[role_name]["output_slices"]) + ) + if role_name == "off_policy" and has_on_policy: + parsed.pop("plan", None) + outputs.update(parsed) + + if "planplus" in outputs and "plan" in outputs: + outputs["plan"] = outputs["plan"] + outputs["planplus"] + return outputs + + def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict: + main_buf = bufs[self._road_key] + self._allocate_runtime_state(main_buf.width, main_buf.height) + assert self._queue_tensors is not None and self._numpy_state is not None and self._camera_shape is not None + + self._numpy_state["tfm"][:] = transforms[self._road_key] + self._numpy_state["big_tfm"][:] = transforms[self._wide_key] + + current_desire = numpy_inputs[self._desired_key].copy() + current_desire[0] = 0 + self._numpy_state["desire"][:] = np.where(current_desire - self._last_desire > 0.99, current_desire, 0) + self._last_desire[:] = current_desire + + if "traffic_convention" in numpy_inputs: + self._numpy_state["traffic_convention"][:] = numpy_inputs["traffic_convention"] + if "action_t" in numpy_inputs: + self._numpy_state["action_t"][:] = numpy_inputs["action_t"] + for key in self._extra_policy_keys: + if key in numpy_inputs: + self._numpy_state[key][:] = numpy_inputs[key] + + stage_inputs = self._camera_programs[self._camera_shape].get("stage_inputs", self._camera_programs[self._camera_shape].get("warp_enqueue")) + if stage_inputs is None: + raise RuntimeError("Combined split artifact camera entry is missing stage_inputs") + + staged_main, staged_wide = stage_inputs( + img_q=self._queue_tensors["img_q"], + big_img_q=self._queue_tensors["big_img_q"], + tfm=self._queue_tensors["tfm"], + big_tfm=self._queue_tensors["big_tfm"], + frame=self._frame_blob(self._road_key, bufs[self._road_key]), + big_frame=self._frame_blob(self._wide_key, bufs[self._wide_key]), + ) + raw_outputs = self._execute_bundle(img=staged_main, big_img=staged_wide, **self._policy_inputs()) + if not isinstance(raw_outputs, tuple): + raw_outputs = (raw_outputs,) + return self._merge_policy_outputs(raw_outputs) + + def _run_model(self) -> NumpyDict: + raise RuntimeError("Combined split runner executes through run_fused()") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py new file mode 100644 index 000000000..33beea423 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py @@ -0,0 +1,178 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import os +import pickle +from typing import Any + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ( + CUSTOM_MODEL_PATH, NumpyDict, ShapeDict, SliceDict, +) +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + + +def _tinygrad_imports(): + from tinygrad.tensor import Tensor + from tinygrad.device import Device + return Tensor, Device + + +WARP_DEV = os.getenv('WARP_DEV') + + +class TinygradFusedRunner(ModelRunner): + uses_opencl_warp: bool = False + + def __init__(self): + super().__init__() + + self._constants = SplitModelConstants + self._parser = PhaseParser() + + if len(self.models) != 1: + raise ValueError(f"fused bundle must have exactly one artifact, got {list(self.models)}") + self._model_data = next(iter(self.models.values())) + + pkl_path = os.path.join(CUSTOM_MODEL_PATH, self._model_data.model.artifact.fileName) + with open(pkl_path, 'rb') as f: + self._fused: dict[Any, Any] = pickle.load(f) + + self._vision_meta = self._fused['metadata']['vision'] + self._on_meta = self._fused['metadata']['on_policy'] + self._off_meta = self._fused['metadata']['off_policy'] + self._run_policy = self._fused['run_policy'] + self._warp_jits: dict[tuple[int, int], Any] = {k: v for k, v in self._fused.items() if isinstance(k, tuple)} + if not self._warp_jits: + raise ValueError("fused pkl has no warp JITs") + + self._frame_skip: int = int(self._fused.get('frame_skip', 4)) + + self._queues: dict[str, Any] | None = None + self._npy_buffers: dict[str, np.ndarray] | None = None + self._cam_resolution: tuple[int, int] | None = None + self._blob_cache: dict[tuple[str, int], Any] = {} + + def _frame_tensor(self, key, buf): + Tensor, Device = _tinygrad_imports() + arr = np.frombuffer(buf.data, dtype=np.uint8) + ck = (key, arr.ctypes.data) + t = self._blob_cache.get(ck) + if t is None: + t = Tensor.from_blob(arr.ctypes.data, (arr.size,), dtype='uint8', device=Device.DEFAULT) + self._blob_cache[ck] = t + return t + + @property + def vision_input_names(self) -> list[str]: + return ['img', 'big_img'] + + @property + def input_shapes(self) -> ShapeDict: + return {**self._vision_meta['input_shapes'], **self._on_meta['input_shapes']} + + @property + def output_slices(self) -> SliceDict: + merged: SliceDict = {} + for src in (self._vision_meta['output_slices'], self._on_meta['output_slices'], self._off_meta['output_slices']): + merged.update({k: v for k, v in src.items() if k != 'pad'}) + return merged + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + raise RuntimeError("fused runner has no OpenCL path; use run_fused()") + + def _ensure_queues(self, cam_w: int, cam_h: int) -> None: + if self._queues is not None and self._cam_resolution == (cam_w, cam_h): + return + if (cam_w, cam_h) not in self._warp_jits: + raise RuntimeError(f"no warp JIT for {cam_w}x{cam_h}; have {sorted(self._warp_jits)}") + + Tensor, Device = _tinygrad_imports() + img_shape = self._vision_meta['input_shapes']['img'] + fb = self._on_meta['input_shapes']['features_buffer'] + dp = self._on_meta['input_shapes']['desire_pulse'] + n_frames = img_shape[1] // 6 + img_buf_shape = (self._frame_skip * (n_frames - 1) + 1, 6, img_shape[2], img_shape[3]) + + zeros_u8 = lambda shp: Tensor(np.zeros(shp, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize() + zeros_f32 = lambda shp: Tensor(np.zeros(shp, dtype=np.float32), device=Device.DEFAULT).contiguous().realize() + + self._queues = { + 'img_q': zeros_u8(img_buf_shape), + 'big_img_q': zeros_u8(img_buf_shape), + 'feat_q': zeros_f32((self._frame_skip * (fb[1] - 1) + 1, fb[0], fb[2])), + 'desire_q': zeros_f32((self._frame_skip * dp[1], dp[0], dp[2])), + } + on_shapes = self._on_meta['input_shapes'] + captured = self._run_policy.captured + jit_shapes = { + name: tuple(int(s) for s in view.shape) + for name, (view, _vars, _dtype, _device) in zip(captured.expected_names, captured.expected_input_info) + } + + def policy_input_shape(name): + shape = on_shapes.get(name, jit_shapes.get(name)) + if shape is None: + raise ValueError(f"fused pkl declares no shape for policy input {name}") + return shape + + self._npy_buffers = { + 'desire': np.zeros(dp[2], dtype=np.float32), + 'traffic_convention': np.zeros(policy_input_shape('traffic_convention'), dtype=np.float32), + 'tfm': np.zeros((3, 3), dtype=np.float32), + 'big_tfm': np.zeros((3, 3), dtype=np.float32), + } + if 'action_t' in jit_shapes: + self._npy_buffers['action_t'] = np.zeros(policy_input_shape('action_t'), dtype=np.float32) + self._cam_resolution = (cam_w, cam_h) + + def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict: + Tensor, Device = _tinygrad_imports() + + main_buf = bufs['img'] + self._ensure_queues(main_buf.width, main_buf.height) + assert self._queues is not None and self._npy_buffers is not None + + desire_key = next((k for k in numpy_inputs if k.startswith('desire')), None) + if desire_key is not None: + self._npy_buffers['desire'][:] = numpy_inputs[desire_key] + if 'traffic_convention' in numpy_inputs: + self._npy_buffers['traffic_convention'][:] = numpy_inputs['traffic_convention'] + if 'action_t' in numpy_inputs and 'action_t' in self._npy_buffers: + self._npy_buffers['action_t'][:] = numpy_inputs['action_t'] + self._npy_buffers['tfm'][:] = transforms['img'] + self._npy_buffers['big_tfm'][:] = transforms['big_img'] + + npy = lambda key: Tensor(self._npy_buffers[key], device='NPY') + + frame = self._frame_tensor('img', bufs['img']) + big_frame = self._frame_tensor('big_img', bufs['big_img']) + + warp_jit = self._warp_jits[self._cam_resolution] + img, big_img = warp_jit(img_q=self._queues['img_q'], big_img_q=self._queues['big_img_q'], + tfm=npy('tfm'), big_tfm=npy('big_tfm'), frame=frame, big_frame=big_frame) + + policy_inputs = dict( + img=img, big_img=big_img, feat_q=self._queues['feat_q'], desire_q=self._queues['desire_q'], + desire=npy('desire'), traffic_convention=npy('traffic_convention')) + if 'action_t' in self._npy_buffers: + policy_inputs['action_t'] = npy('action_t') + vision_out_t, on_out_t, off_out_t = self._run_policy(**policy_inputs) + + def _slice(tensor_out, meta) -> NumpyDict: + flat = tensor_out.numpy().flatten() + return {k: flat[np.newaxis, sl] for k, sl in meta['output_slices'].items() if k != 'pad'} + + parsed: NumpyDict = {} + parsed.update(self._parser.parse_vision_outputs(_slice(vision_out_t, self._vision_meta))) + parsed.update(self._parser.parse_policy_outputs(_slice(off_out_t, self._off_meta))) + parsed.update(self._parser.parse_policy_outputs(_slice(on_out_t, self._on_meta))) + return parsed + + def _run_model(self) -> NumpyDict: + raise RuntimeError("fused path goes through run_fused(), not _run_model()") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py new file mode 100644 index 000000000..a2f5ec5b6 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py @@ -0,0 +1,60 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +from abc import ABC +from collections.abc import Callable + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType, NumpyDict +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import RunnerRoot +from iqpilot.selfdrive.iqmodeld.parser import ArchiveParser, PhaseParser + + +class _ParserRole(RunnerRoot, ABC): + def _bind_parser_role(self, + selector: int, + parser_builder: Callable[[], object], + projector: Callable[[object, NumpyDict], NumpyDict]) -> None: + parser = parser_builder() + self.parser_method_dict[selector] = lambda model_blob: projector(parser, self._slice_outputs(model_blob)) + + +def _phase_policy(parser: PhaseParser, sliced_outputs: NumpyDict) -> NumpyDict: + return parser.parse_policy_outputs(sliced_outputs) + + +def _phase_vision(parser: PhaseParser, sliced_outputs: NumpyDict) -> NumpyDict: + return parser.parse_vision_outputs(sliced_outputs) + + +def _archive_combined(parser: ArchiveParser, sliced_outputs: NumpyDict) -> NumpyDict: + return parser.parse_outputs(sliced_outputs) + + +class OffPolicyTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.offPolicy, PhaseParser, _phase_policy) + + +class OnPolicyTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.onPolicy, PhaseParser, _phase_policy) + + +class PolicyTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.policy, PhaseParser, _phase_policy) + + +class VisionTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.vision, PhaseParser, _phase_vision) + + +class SupercomboTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.supercombo, ArchiveParser, _archive_combined) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py new file mode 100644 index 000000000..ccd4a5b1e --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py @@ -0,0 +1,339 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +import math +import os +import pickle +import re +from typing import Any + +import numpy as np + +from iqpilot.common.params import Params +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUSTOM_MODEL_PATH, NumpyDict, ShapeDict, SliceDict +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + + +def _tinygrad_imports(): + from tinygrad.tensor import Tensor + from tinygrad.device import Device + return Tensor, Device + + +def _captured_queue_depth(warp_jit: Any) -> int | None: + captured = getattr(warp_jit, "captured", None) + infos = getattr(captured, "expected_input_info", None) + if not infos or len(infos) < 2: + return None + + view_repr = repr(infos[1][0]) + dims = [int(val) for val in re.findall(r"arg=(\d+)", view_repr)] + return dims[0] if len(dims) >= 4 else None + + +def _captured_devices(warp_jit: Any) -> set[str]: + captured = getattr(warp_jit, "captured", None) + infos = getattr(captured, "expected_input_info", None) + if not infos: + return set() + + devices: set[str] = set() + for info in infos: + if isinstance(info, tuple) and len(info) >= 4 and isinstance(info[3], str): + devices.add(info[3]) + return devices + + +def _captured_expected_names(jit_obj: Any) -> list[str]: + captured = getattr(jit_obj, "captured", None) + names = getattr(captured, "expected_names", None) + return list(names) if names else [] + + +def _file_sha256(path: str) -> str: + digest = hashlib.sha256() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _is_jit_arg_mismatch(err: BaseException) -> bool: + return "args mismatch in JIT" in str(err) + + +class TinygradSupercomboRunner(ModelRunner): + uses_opencl_warp: bool = False + + def __init__(self): + super().__init__() + self._constants = SplitModelConstants + self._parser = PhaseParser() + + if len(self.models) != 1: + raise ValueError(f"supercombo bundle must have exactly one artifact, got {list(self.models)}") + self._model_data = next(iter(self.models.values())) + + pkl_path = os.path.join(CUSTOM_MODEL_PATH, self._model_data.model.artifact.fileName) + self._pkl_path = pkl_path + self._expected_sha256 = getattr(getattr(self._model_data.model.artifact, "downloadUri", None), "sha256", "") or "" + self._verify_artifact_file() + with open(pkl_path, 'rb') as f: + self._m: dict[Any, Any] = pickle.load(f) + + self._meta = self._m['metadata'] + self._ish = self._meta['input_shapes'] + self._slices = {k: v for k, v in self._meta['output_slices'].items() if k != 'pad'} + self._hidden_slice = self._meta['output_slices']['hidden_state'] + self._run_policy = self._m['run_policy'] + self._warp_jits: dict[tuple[int, int], Any] = {k: v for k, v in self._m.items() if isinstance(k, tuple)} + if not self._warp_jits: + raise ValueError("supercombo pkl has no warp JITs") + self._frame_skip = int(self._m.get('frame_skip', 4)) + self._validate_warp_jits(pkl_path) + self._validate_jit_names() + + self._queues: dict[str, Any] | None = None + self._npy: dict[str, np.ndarray] | None = None + self._cam: tuple[int, int] | None = None + self._prev_desire = np.zeros(self._ish['desire_pulse'][2], dtype=np.float32) + self._blob_cache: dict[tuple[str, int], Any] = {} + + def _verify_artifact_file(self) -> None: + if not self._expected_sha256: + return + + actual_sha256 = _file_sha256(self._pkl_path) + if actual_sha256 == self._expected_sha256: + return + + try: + os.remove(self._pkl_path) + except OSError: + pass + redownload_msg = self._schedule_active_bundle_redownload() + + raise RuntimeError( + "supercombo artifact SHA mismatch: " + f"expected {self._expected_sha256}, got {actual_sha256} for {self._pkl_path}. " + f"Deleted the stale cached file{redownload_msg}." + ) + + def _validate_warp_jits(self, pkl_path: str) -> None: + img = self._ish['img'] + n_frames = img[1] // 6 + expected_depth = self._frame_skip * (n_frames - 1) + 1 + expected_device = os.getenv('DEV') + + mismatches: list[str] = [] + for cam, warp_jit in sorted(self._warp_jits.items()): + captured_depth = _captured_queue_depth(warp_jit) + captured_devices = _captured_devices(warp_jit) + if captured_depth is not None and captured_depth != expected_depth: + mismatches.append( + f"{cam[0]}x{cam[1]} queue-depth captured={captured_depth} expected={expected_depth}" + ) + if expected_device and captured_devices and expected_device not in captured_devices: + mismatches.append( + f"{cam[0]}x{cam[1]} device captured={sorted(captured_devices)} expected={expected_device}" + ) + + if mismatches: + details = "; ".join(mismatches) + raise RuntimeError( + "supercombo warp JIT compatibility mismatch: " + f"{details}. Bundle {pkl_path} was compiled with the wrong backend, frame_skip, or queue shape; " + "re-download or rebuild this model artifact." + ) + + def _validate_jit_names(self) -> None: + expected_warp_names = ['big_frame', 'big_tfm', 'frame', 'tfm'] + expected_policy_names = ['big_img_q', 'desire_q', 'feat_q', 'img_q', 'packed_npy_inputs', 'warped'] + + mismatches: list[str] = [] + + policy_names = sorted(_captured_expected_names(self._run_policy)) + if policy_names and policy_names != expected_policy_names: + mismatches.append(f"run_policy captured={policy_names} expected={expected_policy_names}") + + for cam, warp_jit in sorted(self._warp_jits.items()): + warp_names = sorted(_captured_expected_names(warp_jit)) + if warp_names and warp_names != expected_warp_names: + mismatches.append(f"{cam[0]}x{cam[1]} warp captured={warp_names} expected={expected_warp_names}") + + if mismatches: + details = "; ".join(mismatches) + actual_sha = None + try: + actual_sha = _file_sha256(self._pkl_path) + except OSError: + pass + + if actual_sha and self._expected_sha256 and actual_sha != self._expected_sha256: + try: + os.remove(self._pkl_path) + except OSError: + pass + redownload_msg = self._schedule_active_bundle_redownload() + raise RuntimeError( + "supercombo artifact contract mismatch with stale cached SHA: " + f"{details}. Expected SHA {self._expected_sha256}, got {actual_sha}. " + f"Deleted the stale cached file{redownload_msg}." + ) + + raise RuntimeError( + "supercombo artifact JIT argument mismatch: " + f"{details}. This model file does not match the current IQPilot runtime contract. " + "Re-download or rebuild this model artifact." + ) + + def _handle_runtime_jit_mismatch(self, err: BaseException) -> None: + if not _is_jit_arg_mismatch(err): + raise err + + actual_sha = None + try: + actual_sha = _file_sha256(self._pkl_path) + except OSError: + pass + + if actual_sha and self._expected_sha256 and actual_sha != self._expected_sha256: + try: + os.remove(self._pkl_path) + except OSError: + pass + redownload_msg = self._schedule_active_bundle_redownload() + raise RuntimeError( + "supercombo artifact runtime JIT mismatch with stale cached SHA: " + f"expected {self._expected_sha256}, got {actual_sha} for {self._pkl_path}. " + f"Deleted the stale cached file{redownload_msg}." + ) from err + + raise RuntimeError( + "supercombo artifact runtime JIT mismatch: " + f"{err}. This model file does not match the current IQPilot runtime contract. " + "Re-download or rebuild this model artifact." + ) from err + + def _schedule_active_bundle_redownload(self) -> str: + try: + params = Params() + active_bundle = params.get("ModelManager_ActiveBundle") or {} + index = active_bundle.get("index") if isinstance(active_bundle, dict) else None + if isinstance(index, str) and index.isdigit(): + index = int(index) + if isinstance(index, int) and index >= 0: + params.put("ModelManager_DownloadIndex", str(index)) + params.remove("ModelRunnerTypeCache") + return "; scheduled automatic re-download of the active model" + except Exception: + pass + + return "; unable to schedule automatic re-download" + + def _frame_tensor(self, key: str, buf): + Tensor, Device = _tinygrad_imports() + arr = np.frombuffer(buf.data, dtype=np.uint8) + ck = (key, arr.ctypes.data) + t = self._blob_cache.get(ck) + if t is None: + t = Tensor.from_blob(arr.ctypes.data, (arr.size,), dtype='uint8', device=Device.DEFAULT) + self._blob_cache[ck] = t + return t + + @property + def vision_input_names(self) -> list[str]: + return ['img', 'big_img'] + + @property + def input_shapes(self) -> ShapeDict: + return dict(self._ish) + + @property + def output_slices(self) -> SliceDict: + return dict(self._slices) + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + raise RuntimeError("supercombo runner has no OpenCL path; use run_fused()") + + def _ensure_queues(self, cam_w: int, cam_h: int) -> None: + if self._queues is not None and self._cam == (cam_w, cam_h): + return + if (cam_w, cam_h) not in self._warp_jits: + raise RuntimeError(f"no warp JIT for {cam_w}x{cam_h}; have {sorted(self._warp_jits)}") + + Tensor, Device = _tinygrad_imports() + fs = self._frame_skip + img = self._ish['img'] + n_frames = img[1] // 6 + img_buf = (fs * (n_frames - 1) + 1, 6, img[2], img[3]) + fb = self._ish['features_buffer'] + dp = self._ish['desire_pulse'] + tc = self._ish['traffic_convention'] + at = self._ish['action_t'] + + zeros_u8 = lambda s: Tensor(np.zeros(s, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize() + zeros_f32 = lambda s: Tensor(np.zeros(s, dtype=np.float32), device=Device.DEFAULT).contiguous().realize() + + shapes = {'desire': (dp[2],), 'traffic_convention': tuple(tc), 'action_t': tuple(at), 'prev_feat': (fb[0], fb[2])} + sizes = [math.prod(s) for s in shapes.values()] + packed = np.zeros(sum(sizes), dtype=np.float32) + views = {k: v.reshape(s) for (k, s), v in zip(shapes.items(), np.split(packed, np.cumsum(sizes[:-1])), strict=True)} + + self._npy = {'tfm': np.zeros((3, 3), dtype=np.float32), 'big_tfm': np.zeros((3, 3), dtype=np.float32), **views} + self._queues = { + 'img_q': zeros_u8(img_buf), + 'big_img_q': zeros_u8(img_buf), + 'feat_q': zeros_f32((fs * fb[1], fb[0], fb[2])), + 'desire_q': zeros_f32((fs * dp[1], dp[0], dp[2])), + 'tfm': Tensor(self._npy['tfm'], device='NPY'), + 'big_tfm': Tensor(self._npy['big_tfm'], device='NPY'), + 'packed_npy_inputs': Tensor(packed, device='NPY'), + } + self._cam = (cam_w, cam_h) + + def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict: + Tensor, Device = _tinygrad_imports() + main_buf = bufs['img'] + self._ensure_queues(main_buf.width, main_buf.height) + assert self._queues is not None and self._npy is not None + + self._npy['tfm'][:] = transforms['img'] + self._npy['big_tfm'][:] = transforms['big_img'] + + desire_key = next((k for k in numpy_inputs if k.startswith('desire')), None) + cur = numpy_inputs[desire_key].copy() if desire_key is not None else np.zeros_like(self._prev_desire) + cur[0] = 0 + self._npy['desire'][:] = np.where(cur - self._prev_desire > .99, cur, 0) + self._prev_desire[:] = cur + if 'traffic_convention' in numpy_inputs: + self._npy['traffic_convention'][:] = numpy_inputs['traffic_convention'] + if 'action_t' in numpy_inputs: + self._npy['action_t'][:] = numpy_inputs['action_t'] + + frame = self._frame_tensor('img', bufs['img']) + big_frame = self._frame_tensor('big_img', bufs['big_img']) + + warp = self._warp_jits[self._cam] + try: + warped = warp(tfm=self._queues['tfm'], big_tfm=self._queues['big_tfm'], frame=frame, big_frame=big_frame) + out, = self._run_policy(warped=warped, img_q=self._queues['img_q'], big_img_q=self._queues['big_img_q'], + feat_q=self._queues['feat_q'], desire_q=self._queues['desire_q'], + packed_npy_inputs=self._queues['packed_npy_inputs']) + except Exception as err: + self._handle_runtime_jit_mismatch(err) + raise + flat = out.numpy().flatten() + + self._npy['prev_feat'][:] = flat[self._hidden_slice].reshape(self._npy['prev_feat'].shape) + + sliced = {k: flat[np.newaxis, sl] for k, sl in self._slices.items()} + return self._parser.parse_vision_outputs(sliced) + + def _run_model(self) -> NumpyDict: + raise RuntimeError("supercombo path goes through run_fused(), not _run_model()") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py new file mode 100644 index 000000000..2d91c3df1 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py @@ -0,0 +1,190 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import pickle +from dataclasses import dataclass + +import numpy as np +from tinygrad.dtype import dtypes +from tinygrad.tensor import Tensor + +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ( + CLMemDict, + CUSTOM_MODEL_PATH, + FrameDict, + ModelType, + NumpyDict, + ShapeDict, + SliceDict, +) +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.model_types import ( + OffPolicyTinygrad, + OnPolicyTinygrad, + PolicyTinygrad, + SupercomboTinygrad, + VisionTinygrad, +) +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.iqmodeld.runtime.tinygrad import qcom_tensor_from_opencl_address +from iqpilot.system.hardware import TICI + + +@dataclass(frozen=True) +class _TensorShapePlan: + dtype: object + device: str + + +def _artifact_path(filename: str) -> str: + return f"{CUSTOM_MODEL_PATH}/{filename}" + + +def _load_program_blob(filename: str): + with open(_artifact_path(filename), "rb") as artifact: + try: + return pickle.load(artifact) + except FileNotFoundError as exc: + assert "/dev/kgsl-3d0" not in str(exc), "Model was built on C3 or C3X, but is being loaded on PC" + raise + + +def _compile_input_plan(captured) -> dict[str, _TensorShapePlan]: + plan: dict[str, _TensorShapePlan] = {} + for name, info in zip(captured.expected_names, captured.expected_input_info, strict=True): + plan[name] = _TensorShapePlan(dtype=info[2], device=info[3]) + return plan + + +def _merge_step_outputs(output_groups: list[NumpyDict]) -> NumpyDict: + stitched: NumpyDict = {} + for payload in output_groups: + stitched.update(payload) + if "planplus" in stitched and "plan" in stitched: + stitched["plan"] = stitched["plan"] + stitched["planplus"] + return stitched + + +class TinygradRunner(ModelRunner, SupercomboTinygrad, PolicyTinygrad, VisionTinygrad, OffPolicyTinygrad, OnPolicyTinygrad): + def __init__(self, model_type: int = ModelType.supercombo): + ModelRunner.__init__(self) + for initializer in (SupercomboTinygrad, PolicyTinygrad, VisionTinygrad, OffPolicyTinygrad, OnPolicyTinygrad): + initializer.__init__(self) + + self._constants = ModelConstants + self._model_data = self.models.get(model_type) + if self._model_data is None or self._model_data.model is None: + raise ValueError(f"Model data for type {model_type} not available.") + + asset_name = self._model_data.model.artifact.fileName + assert asset_name.endswith("_tinygrad.pkl"), f"Invalid model file {asset_name} for TinygradRunner" + + self.model_run = _load_program_blob(asset_name) + self._input_plan = _compile_input_plan(self.model_run.captured) + for name, spec in self._input_plan.items(): + if "img" in name and spec.dtype is not dtypes.uint8: + raise ValueError(f"{asset_name}: image input {name} expects {spec.dtype}, incompatible with uint8 warp buffer") + self.input_to_dtype = {name: spec.dtype for name, spec in self._input_plan.items()} + self.input_to_device = {name: spec.device for name, spec in self._input_plan.items()} + + @property + def vision_input_names(self) -> list[str]: + return [stream_name for stream_name in self.input_shapes if "img" in stream_name] + + def _attach_vision_tensor(self, stream_name: str, frame_buffers: CLMemDict, frame_views: FrameDict) -> None: + spec = self._input_plan[stream_name] + frame_buffer = frame_buffers[stream_name] + if TICI: + self.inputs[stream_name] = qcom_tensor_from_opencl_address(frame_buffer.mem_address, + self.input_shapes[stream_name], + dtype=spec.dtype) + return + + mirrored = frame_views[stream_name].as_numpy(frame_buffer).reshape(self.input_shapes[stream_name]) + self.inputs[stream_name] = Tensor(mirrored, device=spec.device, dtype=spec.dtype).realize() + + def _attach_state_tensor(self, tensor_name: str, tensor_value: np.ndarray) -> None: + spec = self._input_plan[tensor_name] + self.inputs[tensor_name] = Tensor(tensor_value, device=spec.device, dtype=spec.dtype).realize() + + def prepare_vision_inputs(self, imgs_cl: CLMemDict, frames: FrameDict): + for stream_name in imgs_cl: + if stream_name not in self.inputs or not TICI: + self._attach_vision_tensor(stream_name, imgs_cl, frames) + + def prepare_policy_inputs(self, numpy_inputs: NumpyDict): + for tensor_name, tensor_value in numpy_inputs.items(): + self._attach_state_tensor(tensor_name, tensor_value) + + def prepare_inputs(self, imgs_cl: CLMemDict, numpy_inputs: NumpyDict, frames: FrameDict) -> dict: + self.prepare_vision_inputs(imgs_cl, frames) + self.prepare_policy_inputs(numpy_inputs) + return self.inputs + + def _parse_outputs(self, model_outputs: np.ndarray) -> NumpyDict: + if self._model_data is None: + raise ValueError("Model data is not available. Ensure the model is loaded correctly.") + return self.parser_method_dict[self._model_data.model.type.raw](model_outputs) + + def _run_model(self) -> NumpyDict: + raw_output = self.model_run(**self.inputs).numpy().reshape(-1) + return self._parse_outputs(raw_output) + + +class TinygradSplitRunner(ModelRunner): + def __init__(self): + super().__init__() + self.is_20hz_3d = True + self._constants = SplitModelConstants + self.vision_runner = TinygradRunner(ModelType.vision) + self.policy_runner = TinygradRunner(ModelType.policy) if self.models.get(ModelType.policy) else None + self.off_policy_runner = TinygradRunner(ModelType.offPolicy) if self.models.get(ModelType.offPolicy) else None + self.on_policy_runner = TinygradRunner(ModelType.onPolicy) if self.models.get(ModelType.onPolicy) else None + + def _policy_units(self) -> list[TinygradRunner]: + return [runner for runner in (self.policy_runner, self.off_policy_runner, self.on_policy_runner) if runner is not None] + + def run_vision(self) -> NumpyDict: + return self.vision_runner.run_model() + + def run_policy(self) -> NumpyDict: + return _merge_step_outputs([runner.run_model() for runner in self._policy_units()]) + + def refresh_policy_features(self, features_buffer: np.ndarray) -> None: + for runner in self._policy_units(): + if "features_buffer" in runner._input_plan: + runner._attach_state_tensor("features_buffer", features_buffer) + + def _run_model(self) -> NumpyDict: + return _merge_step_outputs([self.run_vision(), self.run_policy()]) + + @property + def vision_input_names(self) -> list[str]: + return list(self.vision_runner.vision_input_names) + + @property + def input_shapes(self) -> ShapeDict: + composite: ShapeDict = dict(self.vision_runner.input_shapes) + for runner in self._policy_units(): + composite.update(runner.input_shapes) + return composite + + @property + def output_slices(self) -> SliceDict: + composite: SliceDict = dict(self.vision_runner.output_slices) + for runner in self._policy_units(): + composite.update(runner.output_slices) + return composite + + def prepare_inputs(self, imgs_cl: CLMemDict, numpy_inputs: NumpyDict, frames: FrameDict) -> dict: + self.vision_runner.prepare_vision_inputs(imgs_cl, frames) + assembled_inputs = dict(self.vision_runner.inputs) + for runner in self._policy_units(): + runner.prepare_policy_inputs(numpy_inputs) + assembled_inputs.update(runner.inputs) + self.inputs = assembled_inputs + return assembled_inputs diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py new file mode 100644 index 000000000..3f83ea806 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py @@ -0,0 +1,89 @@ +import numpy as np + + +def index_function(idx, max_val=192, max_idx=32): + return max_val * ((idx/max_idx)**2) + + +class SplitModelConstants: + IDX_N = 33 + T_IDXS = [index_function(idx, max_val=10.0) for idx in range(IDX_N)] + X_IDXS = [index_function(idx, max_val=192.0) for idx in range(IDX_N)] + LEAD_T_IDXS = [0., 2., 4., 6., 8., 10.] + LEAD_T_OFFSETS = [0., 2., 4.] + META_T_IDXS = [2., 4., 6., 8., 10.] + + MODEL_FREQ = 20 + HISTORY_FREQ = 5 + HISTORY_LEN_SECONDS = 5 + TEMPORAL_SKIP = MODEL_FREQ // HISTORY_FREQ + FULL_HISTORY_BUFFER_LEN = MODEL_FREQ * HISTORY_LEN_SECONDS + INPUT_HISTORY_BUFFER_LEN = HISTORY_FREQ * HISTORY_LEN_SECONDS + + FEATURE_LEN = 512 + + DESIRE_LEN = 8 + TRAFFIC_CONVENTION_LEN = 2 + LAT_PLANNER_STATE_LEN = 4 + LATERAL_CONTROL_PARAMS_LEN = 2 + PREV_DESIRED_CURV_LEN = 1 + + FCW_THRESHOLDS_5MS2 = np.array([.05, .05, .15, .15, .15], dtype=np.float32) + FCW_THRESHOLDS_3MS2 = np.array([.7, .7], dtype=np.float32) + FCW_5MS2_PROBS_WIDTH = 5 + FCW_3MS2_PROBS_WIDTH = 2 + + DISENGAGE_WIDTH = 5 + POSE_WIDTH = 6 + WIDE_FROM_DEVICE_WIDTH = 3 + LEAD_WIDTH = 4 + LANE_LINES_WIDTH = 2 + ROAD_EDGES_WIDTH = 2 + PLAN_WIDTH = 15 + DESIRE_PRED_WIDTH = 8 + LAT_PLANNER_SOLUTION_WIDTH = 4 + DESIRED_CURV_WIDTH = 1 + ACTION_WIDTH = 2 + + NUM_LANE_LINES = 4 + NUM_ROAD_EDGES = 2 + + LEAD_TRAJ_LEN = 6 + DESIRE_PRED_LEN = 4 + + PLAN_MHP_N = 5 + LEAD_MHP_N = 2 + PLAN_MHP_SELECTION = 1 + LEAD_MHP_SELECTION = 3 + + FCW_THRESHOLD_5MS2_HIGH = 0.15 + FCW_THRESHOLD_5MS2_LOW = 0.05 + FCW_THRESHOLD_3MS2 = 0.7 + + CONFIDENCE_BUFFER_LEN = 5 + RYG_GREEN = 0.01165 + RYG_YELLOW = 0.06157 + + POLY_PATH_DEGREE = 4 + + +class Plan: + POSITION = slice(0, 3) + VELOCITY = slice(3, 6) + ACCELERATION = slice(6, 9) + T_FROM_CURRENT_EULER = slice(9, 12) + ORIENTATION_RATE = slice(12, 15) + + +class Meta: + ENGAGED = slice(0, 1) + GAS_DISENGAGE = slice(1, 31, 6) + BRAKE_DISENGAGE = slice(2, 31, 6) + STEER_OVERRIDE = slice(3, 31, 6) + HARD_BRAKE_3 = slice(4, 31, 6) + HARD_BRAKE_4 = slice(5, 31, 6) + HARD_BRAKE_5 = slice(6, 31, 6) + GAS_PRESS = slice(31, 55, 4) + BRAKE_PRESS = slice(32, 55, 4) + LEFT_BLINKER = slice(33, 55, 4) + RIGHT_BLINKER = slice(34, 55, 4) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/parser.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/parser.py new file mode 100644 index 000000000..1b382b57f --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/parser.py @@ -0,0 +1,219 @@ +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.config import ModelConstants + + +def safe_exp(values, out=None): + return np.exp(np.clip(values, -np.inf, 11), out=out) + + +def sigmoid(values): + return 1.0 / (1.0 + safe_exp(-values)) + + +def _softmax_last(values, axis=-1): + values -= np.max(values, axis=axis, keepdims=True) + if values.dtype in (np.float32, np.float64): + safe_exp(values, out=values) + else: + values = safe_exp(values) + values /= np.sum(values, axis=axis, keepdims=True) + return values + + +@dataclass(frozen=True) +class _MixtureRecipe: + input_heads: int + output_heads: int + final_shape: tuple[int, ...] + + +class _TensorKitchen: + def __init__(self, ignore_missing: bool = False): + self.ignore_missing = ignore_missing + + def _grab(self, outputs: dict[str, np.ndarray], tensor_name: str) -> np.ndarray | None: + if tensor_name not in outputs: + if not self.ignore_missing: + raise ValueError(f"Missing output {tensor_name}") + return + return outputs[tensor_name] + + def categorical(self, outputs: dict[str, np.ndarray], tensor_name: str, shape=None) -> None: + raw = self._grab(outputs, tensor_name) + if raw is None: + return + if shape is not None: + raw = raw.reshape((raw.shape[0],) + shape) + outputs[tensor_name] = _softmax_last(raw, axis=-1) + + def binary(self, outputs: dict[str, np.ndarray], tensor_name: str) -> None: + raw = self._grab(outputs, tensor_name) + if raw is None: + return + outputs[tensor_name] = sigmoid(raw) + + def mixture(self, outputs: dict[str, np.ndarray], tensor_name: str, recipe: _MixtureRecipe) -> None: + raw = self._grab(outputs, tensor_name) + if raw is None: + return + + reshaped = raw.reshape((raw.shape[0], max(recipe.input_heads, 1), -1)) + value_count = (reshaped.shape[2] - recipe.output_heads) // 2 + means = reshaped[:, :, :value_count] + stds = safe_exp(reshaped[:, :, value_count:2 * value_count]) + + if recipe.input_heads > 1: + weights = np.zeros((reshaped.shape[0], recipe.input_heads, recipe.output_heads), dtype=reshaped.dtype) + for output_idx in range(recipe.output_heads): + weights[:, :, output_idx - recipe.output_heads] = _softmax_last( + reshaped[:, :, output_idx - recipe.output_heads], axis=-1 + ) + + if recipe.output_heads == 1: + for batch_idx in range(weights.shape[0]): + order = np.argsort(weights[batch_idx][:, 0])[::-1] + weights[batch_idx] = weights[batch_idx][order] + means[batch_idx] = means[batch_idx][order] + stds[batch_idx] = stds[batch_idx][order] + + hypothesis_shape = (reshaped.shape[0], recipe.input_heads, *recipe.final_shape) + outputs[f"{tensor_name}_weights"] = weights + outputs[f"{tensor_name}_hypotheses"] = means.reshape(hypothesis_shape) + outputs[f"{tensor_name}_stds_hypotheses"] = stds.reshape(hypothesis_shape) + + picked_means = np.zeros((reshaped.shape[0], recipe.output_heads, value_count), dtype=reshaped.dtype) + picked_stds = np.zeros((reshaped.shape[0], recipe.output_heads, value_count), dtype=reshaped.dtype) + for batch_idx in range(weights.shape[0]): + for output_idx in range(recipe.output_heads): + order = np.argsort(weights[batch_idx, :, output_idx])[::-1] + picked_means[batch_idx, output_idx] = means[batch_idx, order[0]] + picked_stds[batch_idx, output_idx] = stds[batch_idx, order[0]] + else: + picked_means = means + picked_stds = stds + + final_shape = ((reshaped.shape[0], recipe.output_heads, *recipe.final_shape) + if recipe.output_heads > 1 else (reshaped.shape[0], *recipe.final_shape)) + outputs[tensor_name] = picked_means.reshape(final_shape) + outputs[f"{tensor_name}_stds"] = picked_stds.reshape(final_shape) + + +class ArchiveParser(_TensorKitchen): + def __init__(self, ignore_missing: bool = False): + super().__init__(ignore_missing=ignore_missing) + self._c = ModelConstants + + def _recipes(self) -> list[tuple[str, _MixtureRecipe]]: + c = self._c + return [ + ("plan", _MixtureRecipe(c.PLAN_MHP_N, c.PLAN_MHP_SELECTION, (c.IDX_N, c.PLAN_WIDTH))), + ("lane_lines", _MixtureRecipe(0, 0, (c.NUM_LANE_LINES, c.IDX_N, c.LANE_LINES_WIDTH))), + ("road_edges", _MixtureRecipe(0, 0, (c.NUM_ROAD_EDGES, c.IDX_N, c.LANE_LINES_WIDTH))), + ("pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))), + ("road_transform", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))), + ("wide_from_device_euler", _MixtureRecipe(0, 0, (c.WIDE_FROM_DEVICE_WIDTH,))), + ("lead", _MixtureRecipe(c.LEAD_MHP_N, c.LEAD_MHP_SELECTION, (c.LEAD_TRAJ_LEN, c.LEAD_WIDTH))), + ] + + def parse_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + c = self._c + for tensor_name, recipe in self._recipes(): + self.mixture(outputs, tensor_name, recipe) + if "sim_pose" in outputs: + self.mixture(outputs, "sim_pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))) + if "lat_planner_solution" in outputs: + self.mixture(outputs, "lat_planner_solution", _MixtureRecipe(0, 0, (c.IDX_N, c.LAT_PLANNER_SOLUTION_WIDTH))) + if "desired_curvature" in outputs: + self.mixture(outputs, "desired_curvature", _MixtureRecipe(0, 0, (c.DESIRED_CURV_WIDTH,))) + for name in ("lead_prob", "lane_lines_prob", "meta"): + self.binary(outputs, name) + self.categorical(outputs, "desire_state", shape=(c.DESIRE_PRED_WIDTH,)) + self.categorical(outputs, "desire_pred", shape=(c.DESIRE_PRED_LEN, c.DESIRE_PRED_WIDTH)) + return outputs + + +class PhaseParser(_TensorKitchen): + def __init__(self, ignore_missing: bool = False): + super().__init__(ignore_missing=ignore_missing) + self._c = SplitModelConstants + + def _has_mixture_heads(self, outputs: dict[str, np.ndarray], tensor_name: str, flat_width: int) -> bool: + raw = self._grab(outputs, tensor_name) + if raw is None: + return False + return raw.shape[1] != 2 * flat_width + + def _decode_dynamic_family(self, outputs: dict[str, np.ndarray]) -> None: + c = self._c + if "lead" in outputs: + uses_heads = self._has_mixture_heads(outputs, "lead", c.LEAD_MHP_SELECTION * c.LEAD_TRAJ_LEN * c.LEAD_WIDTH) + self.mixture(outputs, "lead", _MixtureRecipe( + c.LEAD_MHP_N if uses_heads else 0, + c.LEAD_MHP_SELECTION if uses_heads else 0, + (c.LEAD_TRAJ_LEN, c.LEAD_WIDTH) if uses_heads else (c.LEAD_MHP_SELECTION, c.LEAD_TRAJ_LEN, c.LEAD_WIDTH), + )) + + if "plan" in outputs: + uses_heads = self._has_mixture_heads(outputs, "plan", c.IDX_N * c.PLAN_WIDTH) + self.mixture(outputs, "plan", _MixtureRecipe( + c.PLAN_MHP_N if uses_heads else 0, + c.PLAN_MHP_SELECTION if uses_heads else 0, + (c.IDX_N, c.PLAN_WIDTH), + )) + + if "planplus" in outputs: + self.mixture(outputs, "planplus", _MixtureRecipe(0, 0, (c.IDX_N, c.PLAN_WIDTH))) + + def _decode_policy_family(self, outputs: dict[str, np.ndarray]) -> None: + c = self._c + if "action" in outputs: + self.mixture(outputs, "action", _MixtureRecipe(0, 0, (c.ACTION_WIDTH,))) + if "desired_curvature" in outputs: + self.mixture(outputs, "desired_curvature", _MixtureRecipe(0, 0, (c.DESIRED_CURV_WIDTH,))) + if "desire_pred" in outputs: + self.categorical(outputs, "desire_pred", shape=(c.DESIRE_PRED_LEN, c.DESIRE_PRED_WIDTH)) + if "desire_state" in outputs: + self.categorical(outputs, "desire_state", shape=(c.DESIRE_PRED_WIDTH,)) + if "lane_lines" in outputs: + self.mixture(outputs, "lane_lines", _MixtureRecipe(0, 0, (c.NUM_LANE_LINES, c.IDX_N, c.LANE_LINES_WIDTH))) + if "lane_lines_prob" in outputs: + self.binary(outputs, "lane_lines_prob") + if "lead_prob" in outputs: + self.binary(outputs, "lead_prob") + if "lat_planner_solution" in outputs: + self.mixture(outputs, "lat_planner_solution", _MixtureRecipe(0, 0, (c.IDX_N, c.LAT_PLANNER_SOLUTION_WIDTH))) + if "meta" in outputs: + self.binary(outputs, "meta") + if "road_edges" in outputs: + self.mixture(outputs, "road_edges", _MixtureRecipe(0, 0, (c.NUM_ROAD_EDGES, c.IDX_N, c.LANE_LINES_WIDTH))) + if "sim_pose" in outputs: + self.mixture(outputs, "sim_pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))) + + def parse_vision_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + c = self._c + self.mixture(outputs, "pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))) + self.mixture(outputs, "wide_from_device_euler", _MixtureRecipe(0, 0, (c.WIDE_FROM_DEVICE_WIDTH,))) + self.mixture(outputs, "road_transform", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))) + self._decode_dynamic_family(outputs) + self._decode_policy_family(outputs) + return outputs + + def parse_policy_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + self._decode_dynamic_family(outputs) + self._decode_policy_family(outputs) + return outputs + + def parse_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + return self.parse_policy_outputs(self.parse_vision_outputs(outputs)) + + +__all__ = [ + "ArchiveParser", + "PhaseParser", +] diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/runtime/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/runtime/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py new file mode 100644 index 000000000..75c7e350e --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py @@ -0,0 +1,23 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from tinygrad.tensor import Tensor +from tinygrad.helpers import to_mv + +_PTR_STRIDE = 8 +_RAW_GPU_PTR_SLOT = 20 +_RAW_GPU_PTR_VIEW_BYTES = 0x100 + + +def _descriptor_pointer(opencl_address: int) -> int: + return to_mv(opencl_address, _PTR_STRIDE).cast("Q")[0] + + +def _raw_gpu_pointer(descriptor_pointer: int) -> int: + return to_mv(descriptor_pointer, _RAW_GPU_PTR_VIEW_BYTES).cast("Q")[_RAW_GPU_PTR_SLOT] + + +def qcom_tensor_from_opencl_address(opencl_address, shape, dtype): + descriptor_pointer = _descriptor_pointer(opencl_address) + device_pointer = _raw_gpu_pointer(descriptor_pointer) + return Tensor.from_blob(device_pointer, shape, dtype=dtype, device="QCOM") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/temporal_state.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/temporal_state.py new file mode 100644 index 000000000..70cac9f64 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/temporal_state.py @@ -0,0 +1,131 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import math + +import numpy as np + +DEFAULT_FRAME_SKIP = 4 + +MODEL_INPUT_SPEC: dict[str, tuple[tuple[int, ...], str]] = { + "img": ((1, 12, 128, 256), "uint8"), + "big_img": ((1, 12, 128, 256), "uint8"), + "desire_pulse": ((1, 25, 8), "float32"), + "traffic_convention": ((1, 2), "float32"), + "features_buffer": ((1, 24, 512), "float32"), + "action_t": ((1, 2), "float32"), +} + + +def spec_from_meta(meta: dict) -> dict[str, tuple[tuple[int, ...], str]] | None: + shapes = meta.get("input_shapes") + if not shapes: + return None + return {name: (tuple(shape), "uint8" if name in ("img", "big_img") else "float32") + for name, shape in shapes.items()} + + +class TemporalInputState: + def __init__(self, frame_skip: int, spec: dict[str, tuple[tuple[int, ...], str]] = MODEL_INPUT_SPEC): + self.frame_skip = frame_skip + img = spec["img"][0] + fb = spec["features_buffer"][0] + dp = spec["desire_pulse"][0] + + self.n_frames = img[1] // 6 + img_q_shape = (frame_skip * (self.n_frames - 1) + 1, 6, img[2], img[3]) + self._img_shape = img + self._fb_shape = fb + self._dp_shape = dp + feat_dim = math.prod(fb[2:]) + + self.img_q = np.zeros(img_q_shape, dtype=np.uint8) + self.big_img_q = np.zeros(img_q_shape, dtype=np.uint8) + self.feat_q = np.zeros((frame_skip * fb[1], fb[0], feat_dim), dtype=np.float32) + self.desire_q = np.zeros((frame_skip * dp[1], dp[0], dp[2]), dtype=np.float32) + self.prev_desire = np.zeros(dp[2], dtype=np.float32) + self.prev_feat = np.zeros((fb[0], feat_dim), dtype=np.float32) + + @staticmethod + def _shift_append(q: np.ndarray, new_val: np.ndarray) -> None: + q[:-1] = q[1:] + q[-1] = new_val + + def push_and_materialize(self, warped: np.ndarray, desire_pulse: np.ndarray, + traffic_convention: np.ndarray, action_t: np.ndarray, + ) -> dict[str, np.ndarray]: + fs = self.frame_skip + + cur = desire_pulse.astype(np.float32).copy() + cur[0] = 0 + pulse = np.where(cur - self.prev_desire > 0.99, cur, 0).astype(np.float32) + self.prev_desire[:] = cur + + self._shift_append(self.img_q, warped[0]) + self._shift_append(self.big_img_q, warped[1]) + self._shift_append(self.desire_q, pulse.reshape(self._dp_shape[0], self._dp_shape[2])) + self._shift_append(self.feat_q, self.prev_feat) + + dp = self._dp_shape + return { + "img": np.ascontiguousarray(self.img_q[::fs]).reshape(self._img_shape), + "big_img": np.ascontiguousarray(self.big_img_q[::fs]).reshape(self._img_shape), + "features_buffer": np.ascontiguousarray(self.feat_q[::fs]).reshape(self._fb_shape), + "desire_pulse": self.desire_q.reshape(dp[1], fs, dp[0], dp[2]).max(axis=1).reshape(dp), + "traffic_convention": traffic_convention.astype(np.float32).reshape(1, -1), + "action_t": action_t.astype(np.float32).reshape(1, -1), + } + + def note_hidden_state(self, model_output: np.ndarray, hidden_slice: slice) -> None: + self.prev_feat[:] = model_output[hidden_slice].reshape(self.prev_feat.shape) + + +class SplitTemporalState: + + def __init__(self, frame_skip: int, img_shape: tuple[int, ...], + feature_shape: tuple[int, ...], desire_shape: tuple[int, ...]): + self.frame_skip = frame_skip + self._img_shape = tuple(img_shape) + self._fb_shape = tuple(feature_shape) + self._dp_shape = tuple(desire_shape) + + n_frames = img_shape[1] // 6 + img_q_shape = (frame_skip * (n_frames - 1) + 1, 6, img_shape[2], img_shape[3]) + self.img_q = np.zeros(img_q_shape, dtype=np.uint8) + self.big_img_q = np.zeros(img_q_shape, dtype=np.uint8) + self.feat_q = np.zeros((frame_skip * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), + dtype=np.float32) + self.desire_q = np.zeros((frame_skip * desire_shape[1], desire_shape[0], desire_shape[2]), dtype=np.float32) + self.prev_desire = np.zeros(desire_shape[2], dtype=np.float32) + + def materialize_vision(self, warped: np.ndarray, desire: np.ndarray) -> dict[str, np.ndarray]: + fs = self.frame_skip + cur = desire.astype(np.float32).copy() + cur[0] = 0 + pulse = np.where(cur - self.prev_desire > 0.99, cur, 0).astype(np.float32) + self.prev_desire[:] = cur + + TemporalInputState._shift_append(self.img_q, warped[0]) + TemporalInputState._shift_append(self.big_img_q, warped[1]) + TemporalInputState._shift_append(self.desire_q, pulse.reshape(self._dp_shape[0], self._dp_shape[2])) + return { + "img": np.ascontiguousarray(self.img_q[::fs]).reshape(self._img_shape), + "big_img": np.ascontiguousarray(self.big_img_q[::fs]).reshape(self._img_shape), + } + + def materialize_policy(self, vision_feature: np.ndarray, traffic_convention: np.ndarray, + action_t: np.ndarray | None = None) -> dict[str, np.ndarray]: + fs = self.frame_skip + TemporalInputState._shift_append(self.feat_q, vision_feature.reshape(self._fb_shape[0], self._fb_shape[2])) + dp = self._dp_shape + out = { + "features_buffer": np.ascontiguousarray(self.feat_q[::fs]).reshape(self._fb_shape), + "desire_pulse": self.desire_q.reshape(dp[1], fs, dp[0], dp[2]).max(axis=1).reshape(dp), + "traffic_convention": traffic_convention.astype(np.float32).reshape(1, -1), + } + if action_t is not None: + out["action_t"] = action_t.astype(np.float32).reshape(1, -1) + return out diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py new file mode 100644 index 000000000..56ce00b2e --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py @@ -0,0 +1,422 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import argparse +import atexit +import math +import os +import pickle +import re +import tempfile +import time +from functools import partial +from collections import namedtuple + +import numpy as np + +def _patch_tinygrad_fetch_fw(): + import hashlib + import pathlib + import zstandard + from tinygrad import helpers + _orig = helpers.fetch_fw + def fetch_fw(path, name, sha256): + p = pathlib.Path(f"/lib/firmware/{path}/{name}.zst") + if p.is_file(): + blob = zstandard.ZstdDecompressor().stream_reader(p.read_bytes()).read() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + return _orig(path, name, sha256) + helpers.fetch_fw = fetch_fw +_patch_tinygrad_fetch_fw() + +from tinygrad.tensor import Tensor +from tinygrad.helpers import Context +from tinygrad.device import Device +from tinygrad.engine.jit import TinyJit + + +NV12Frame = namedtuple("NV12Frame", ['width', 'height', 'stride', 'y_height', 'uv_height', 'size']) +WARP_INPUTS = ['tfm', 'big_tfm'] +POLICY_INPUTS = ['img_q', 'big_img_q', 'feat_q', 'desire_q', 'packed_npy_inputs'] + +UV_SCALE_MATRIX = np.array([[0.5, 0, 0], [0, 0.5, 0], [0, 0, 1]], dtype=np.float32) +UV_SCALE_MATRIX_INV = np.linalg.inv(UV_SCALE_MATRIX) + +WARP_DEV = os.getenv('WARP_DEV') + + +def make_random_images(keys, shape, device=None): + return {k: Tensor.randint(shape, low=0, high=256, dtype='uint8', device=device).realize() for k in keys} + + +def warp_perspective_tinygrad(src_flat, M_inv, dst_shape, src_shape, stride_pad, border_fill_val=None): + w_dst, h_dst = dst_shape + h_src, w_src = src_shape + + x = Tensor.arange(w_dst).reshape(1, w_dst).expand(h_dst, w_dst).reshape(-1) + y = Tensor.arange(h_dst).reshape(h_dst, 1).expand(h_dst, w_dst).reshape(-1) + + src_x = M_inv[0, 0] * x + M_inv[0, 1] * y + M_inv[0, 2] + src_y = M_inv[1, 0] * x + M_inv[1, 1] * y + M_inv[1, 2] + src_w = M_inv[2, 0] * x + M_inv[2, 1] * y + M_inv[2, 2] + + src_x = src_x / src_w + src_y = src_y / src_w + + x_round = Tensor.round(src_x) + y_round = Tensor.round(src_y) + x_nn_clipped = x_round.clip(0, w_src - 1).cast('int') + y_nn_clipped = y_round.clip(0, h_src - 1).cast('int') + idx = y_nn_clipped * (w_src + stride_pad) + x_nn_clipped + sampled = src_flat[idx] + + if border_fill_val is None: + return sampled + + in_bounds = ((x_round >= 0) & (x_round <= w_src - 1) & + (y_round >= 0) & (y_round <= h_src - 1)).cast(sampled.dtype) + return sampled * in_bounds + Tensor(border_fill_val, dtype=sampled.dtype) * (1 - in_bounds) + + +def frames_to_tensor(frames): + H = (frames.shape[0] * 2) // 3 + W = frames.shape[1] + in_img1 = Tensor.cat(frames[0:H:2, 0::2], + frames[1:H:2, 0::2], + frames[0:H:2, 1::2], + frames[1:H:2, 1::2], + frames[H:H+H//4].reshape((H//2, W//2)), + frames[H+H//4:H+H//2].reshape((H//2, W//2)), dim=0).reshape((6, H//2, W//2)) + return in_img1 + + +def make_frame_prepare(nv12: NV12Frame, model_w, model_h): + cam_w, cam_h, stride, y_height, uv_height, _ = nv12 + uv_offset = stride * y_height + stride_pad = stride - cam_w + + def frame_prepare_tinygrad(input_frame, M_inv): + M_inv_uv = M_inv * Tensor([[1.0, 1.0, 0.5], [1.0, 1.0, 0.5], [2.0, 2.0, 1.0]], device=WARP_DEV) + uv = input_frame[uv_offset:uv_offset + uv_height * stride].reshape(uv_height, stride) + with Context(SPLIT_REDUCEOP=0): + y = warp_perspective_tinygrad(input_frame[:cam_h*stride], + M_inv, (model_w, model_h), + (cam_h, cam_w), stride_pad).realize() + u = warp_perspective_tinygrad(uv[:cam_h//2, :cam_w:2].flatten(), + M_inv_uv, (model_w//2, model_h//2), + (cam_h//2, cam_w//2), 0).realize() + v = warp_perspective_tinygrad(uv[:cam_h//2, 1:cam_w:2].flatten(), + M_inv_uv, (model_w//2, model_h//2), + (cam_h//2, cam_w//2), 0).realize() + yuv = y.cat(u).cat(v).reshape((model_h * 3 // 2, model_w)) + tensor = frames_to_tensor(yuv) + return tensor + return frame_prepare_tinygrad + + +def make_warp_input_queues(vision_input_shapes, frame_skip, device): + img = vision_input_shapes['img'] # (1, 12, 128, 256) + n_frames = img[1] // 6 + img_buf_shape = (frame_skip * (n_frames - 1) + 1, 6, img[2], img[3]) + + npy = { + 'tfm': np.zeros((3, 3), dtype=np.float32), + 'big_tfm': np.zeros((3, 3), dtype=np.float32), + } + input_queues = { + 'img_q': Tensor(np.zeros(img_buf_shape, dtype=np.uint8), device=device).contiguous().realize(), + 'big_img_q': Tensor(np.zeros(img_buf_shape, dtype=np.uint8), device=device).contiguous().realize(), + **{k: Tensor(v, device='NPY').realize() for k, v in npy.items()}, + } + return input_queues, npy + + +def get_policy_npy_shapes(input_shapes): + dp = input_shapes['desire_pulse'] # (1, 25, 8) + tc = input_shapes['traffic_convention'] # (1, 2) + at = input_shapes['action_t'] # (1, 2) + fb = input_shapes['features_buffer'] # (1, 24, 512) + shapes = {'desire': (dp[2],), 'traffic_convention': tuple(tc), 'action_t': tuple(at), 'prev_feat': (fb[0], fb[2])} + return shapes, [math.prod(s) for s in shapes.values()] + + +def make_input_queues(input_shapes, frame_skip, device): + input_queues, npy = make_warp_input_queues(input_shapes, frame_skip, device) + + fb = input_shapes['features_buffer'] # (1, 24, 512), past features only; the model appends the current frame's feature + dp = input_shapes['desire_pulse'] # (1, 25, 8) + + shapes, sizes = get_policy_npy_shapes(input_shapes) + packed_npy_inputs = np.zeros(sum(sizes), dtype=np.float32) + npy.update({k: v.reshape(s) for (k, s), v in zip(shapes.items(), np.split(packed_npy_inputs, np.cumsum(sizes[:-1])), strict=True)}) + input_queues.update({ + 'feat_q': Tensor(np.zeros((frame_skip * fb[1], fb[0], fb[2]), dtype=np.float32), device=device).contiguous().realize(), + 'desire_q': Tensor(np.zeros((frame_skip * dp[1], dp[0], dp[2]), dtype=np.float32), device=device).contiguous().realize(), + 'packed_npy_inputs': Tensor(packed_npy_inputs, device='NPY').realize(), + }) + return input_queues, npy + + +def shift_and_sample(buf, new_val, sample_fn): + buf.assign(buf[1:].cat(new_val, dim=0).contiguous()) + return sample_fn(buf) + + +def sample_skip(buf, frame_skip): + return buf[::frame_skip].contiguous().flatten(0, 1).unsqueeze(0) + + +def sample_desire(buf, frame_skip): + return buf.reshape(-1, frame_skip, *buf.shape[1:]).max(1).flatten(0, 1).unsqueeze(0) + + +def make_warp(nv12, model_w, model_h, frame_skip): + frame_prepare = make_frame_prepare(nv12, model_w, model_h) + + def warp(tfm, big_tfm, frame, big_frame): + tfm = tfm.to(WARP_DEV) + big_tfm = big_tfm.to(WARP_DEV) + Tensor.realize(tfm, big_tfm) + + warped_frame = frame_prepare(frame, tfm).unsqueeze(0) + warped_big_frame = frame_prepare(big_frame, big_tfm).unsqueeze(0) + return Tensor.cat(warped_frame, warped_big_frame) + + return warp + + +def make_run_policy(model_runner, model_metadata, frame_skip): + sample_desire_fn = partial(sample_desire, frame_skip=frame_skip) + sample_skip_fn = partial(sample_skip, frame_skip=frame_skip) + npy_shapes, npy_sizes = get_policy_npy_shapes(model_metadata['input_shapes']) + + def run_policy(warped, img_q, big_img_q, feat_q, desire_q, packed_npy_inputs): + packed_npy_inputs = packed_npy_inputs.to(Device.DEFAULT) + warped = warped.to(Device.DEFAULT) + Tensor.realize(packed_npy_inputs, warped) + + img = shift_and_sample(img_q, warped[0:1], sample_skip_fn) + big_img = shift_and_sample(big_img_q, warped[1:2], sample_skip_fn) + + desire, traffic_convention, action_t, prev_feat = (t.reshape(s) for t, s in zip(packed_npy_inputs.split(npy_sizes), npy_shapes.values(), strict=True)) + desire_buf = shift_and_sample(desire_q, desire.reshape(1, 1, -1), sample_desire_fn) + feat_buf = shift_and_sample(feat_q, prev_feat.reshape(1, 1, -1), sample_skip_fn) + + inputs = { + 'img': img, + 'big_img': big_img, + 'features_buffer': feat_buf, + 'desire_pulse': desire_buf, + 'traffic_convention': traffic_convention, + 'action_t': action_t, + } + out = next(iter(model_runner(inputs).values())).cast('float32') + return out, + return run_policy + + +def compile_jit(jit, make_random_inputs, input_keys, make_queues): + SEED = 42 + def random_inputs_run(fn, seed, test_val=None, test_buffers=None, expect_match=True): + input_queues, npy = make_queues(Device.DEFAULT) + np.random.seed(seed) + Tensor.manual_seed(seed) + + testing = test_val is not None or test_buffers is not None + n_runs = 1 if testing else 3 + + for i in range(n_runs): + for v in npy.values(): + v[:] = np.random.randn(*v.shape).astype(v.dtype) + Device.default.synchronize() + random_inputs = make_random_inputs() + st = time.perf_counter() + outs = fn(**{k: input_queues[k] for k in input_keys}, **random_inputs) + mt = time.perf_counter() + Device.default.synchronize() + et = time.perf_counter() + print(f" [{i+1}/{n_runs}] enqueue {(mt-st)*1e3:6.2f} ms -- total {(et-st)*1e3:6.2f} ms") + + if i == 0: + val = [np.copy(v.numpy()) for v in outs] + buffers = [np.copy(v.numpy().copy()) for v in input_queues.values()] + + if test_val is not None: + match = all(np.array_equal(a, b) for a, b in zip(val, test_val, strict=True)) + assert match == expect_match, f"outputs {'differ from' if expect_match else 'match'} baseline (seed={seed})" + if test_buffers is not None: + match = all(np.array_equal(a, b) for a, b in zip(buffers, test_buffers, strict=True)) + assert match == expect_match, f"buffers {'differ from' if expect_match else 'match'} baseline (seed={seed})" + return val, buffers + + print('capture + replay') + test_val, test_buffers = random_inputs_run(jit, SEED) + print('pickle round trip') + jit = pickle.loads(pickle.dumps(jit)) + random_inputs_run(jit, SEED, test_val, test_buffers, expect_match=True) + random_inputs_run(jit, SEED+1, test_val, test_buffers, expect_match=False) + return jit + + +def _captured_devices(jit) -> set[str]: + captured = getattr(jit, 'captured', None) + infos = getattr(captured, 'expected_input_info', None) + if not infos: + return set() + + devices: set[str] = set() + for info in infos: + if isinstance(info, tuple) and len(info) >= 4 and isinstance(info[3], str): + devices.add(info[3]) + return devices + + +def _slice_outputs(model_outputs: np.ndarray, output_slices: dict[str, slice]) -> dict[str, np.ndarray]: + return {name: model_outputs[np.newaxis, tensor_slice] for name, tensor_slice in output_slices.items() if name != 'pad'} + + +def _validate_pose_outputs(parsed_outputs: dict[str, np.ndarray]) -> None: + from iqpilot.selfdrive.locationd.locationd import MIN_STD_SANITY_CHECK, ROTATION_SANITY_CHECK, TRANS_SANITY_CHECK + + required = ( + 'pose', 'pose_stds', 'wide_from_device_euler', 'wide_from_device_euler_stds', + 'road_transform', 'road_transform_stds', + ) + missing = [name for name in required if name not in parsed_outputs] + if missing: + raise AssertionError(f"parsed supercombo outputs missing required odometry tensors: {missing}") + + for name in required: + values = parsed_outputs[name] + if not np.isfinite(values).all(): + raise AssertionError(f"parsed supercombo output {name} contains non-finite values") + + pose = parsed_outputs['pose'][0] + pose_stds = parsed_outputs['pose_stds'][0] + road_transform_stds = parsed_outputs['road_transform_stds'][0] + wide_stds = parsed_outputs['wide_from_device_euler_stds'][0] + + if pose_stds.min() <= MIN_STD_SANITY_CHECK: + raise AssertionError(f"pose_stds min {pose_stds.min()} <= {MIN_STD_SANITY_CHECK}") + if road_transform_stds.min() <= MIN_STD_SANITY_CHECK: + raise AssertionError(f"road_transform_stds min {road_transform_stds.min()} <= {MIN_STD_SANITY_CHECK}") + if wide_stds.min() <= MIN_STD_SANITY_CHECK: + raise AssertionError(f"wide_from_device_euler_stds min {wide_stds.min()} <= {MIN_STD_SANITY_CHECK}") + + if np.linalg.norm(pose[:3]) > TRANS_SANITY_CHECK: + raise AssertionError(f"pose translation norm {np.linalg.norm(pose[:3])} exceeds {TRANS_SANITY_CHECK}") + if np.linalg.norm(pose[3:]) > ROTATION_SANITY_CHECK: + raise AssertionError(f"pose rotation norm {np.linalg.norm(pose[3:])} exceeds {ROTATION_SANITY_CHECK}") + if np.linalg.norm(pose_stds[:3]) > 10 * TRANS_SANITY_CHECK: + raise AssertionError( + f"pose translation std norm {np.linalg.norm(pose_stds[:3])} exceeds {10 * TRANS_SANITY_CHECK}" + ) + if np.linalg.norm(pose_stds[3:]) > 10 * ROTATION_SANITY_CHECK: + raise AssertionError( + f"pose rotation std norm {np.linalg.norm(pose_stds[3:])} exceeds {10 * ROTATION_SANITY_CHECK}" + ) + + +def validate_supercombo_release(run_policy_jit, model_runner, model_metadata, frame_skip, expected_device: str) -> None: + from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + + direct_fn = make_run_policy(model_runner, model_metadata, frame_skip) + parser = PhaseParser() + queue_factory = partial(make_input_queues, model_metadata['input_shapes'], frame_skip) + image_shape = model_metadata['input_shapes']['img'] + + jit_queues, jit_npy = queue_factory(Device.DEFAULT) + direct_queues, direct_npy = queue_factory(Device.DEFAULT) + + for payload in (jit_npy, direct_npy): + for name, value in payload.items(): + value[:] = 0 if value.dtype.kind in ('i', 'u') else 0.0 + + zero_inputs = { + 'warped': Tensor(np.zeros((2, 6, *image_shape[2:]), dtype=np.uint8), device=Device.DEFAULT).realize(), + } + + direct_outs, = direct_fn(**{k: direct_queues[k] for k in POLICY_INPUTS}, **zero_inputs) + jit_outs, = run_policy_jit(**{k: jit_queues[k] for k in POLICY_INPUTS}, **zero_inputs) + + direct_flat = direct_outs.numpy().astype(np.float32).reshape(-1) + jit_flat = jit_outs.numpy().astype(np.float32).reshape(-1) + + if not np.allclose(direct_flat, jit_flat, atol=1e-4, rtol=1e-4): + max_delta = float(np.max(np.abs(direct_flat - jit_flat))) + raise AssertionError(f"JIT supercombo output diverges from direct ONNX execution; max abs delta {max_delta}") + + parsed = parser.parse_vision_outputs(_slice_outputs(jit_flat, model_metadata['output_slices'])) + _validate_pose_outputs(parsed) + + captured_devices = _captured_devices(run_policy_jit) + if expected_device and captured_devices and expected_device not in captured_devices: + raise AssertionError( + f"compiled run_policy backend mismatch: captured {sorted(captured_devices)} expected {expected_device}" + ) + + +def _parse_size(s): + w, h = s.lower().split('x') + return int(w), int(h) + + +def read_file_chunked_to_shm(path): + from iqpilot.common.file_chunker import read_file_chunked + from iqpilot.system.hardware.hw import Paths + with tempfile.NamedTemporaryFile(prefix='compile_modeld_', dir=Paths.shm_path(), delete=False) as f: + f.write(read_file_chunked(path)) + tmp_path = f.name + atexit.register(lambda: os.path.exists(tmp_path) and os.remove(tmp_path)) + return tmp_path + + +if __name__ == "__main__": + from tinygrad.nn.onnx import OnnxRunner + from iqpilot.system.camerad.cameras.nv12_info import get_nv12_info + from iqpilot.selfdrive.iqmodeld.metadata import build_metadata_record + p = argparse.ArgumentParser() + p.add_argument('--model-size', type=_parse_size, required=True, help='model input WxH') + p.add_argument('--camera-resolutions', type=_parse_size, nargs='+', required=True, + help='camera resolutions WxH (one or more)') + p.add_argument('--onnx', required=True) + p.add_argument('--output', required=True) + p.add_argument('--frame-skip', type=int, required=True) + p.add_argument('--expected-device', default='QCOM', help='expected tinygrad backend baked into the JIT') + args = p.parse_args() + + model_path = read_file_chunked_to_shm(args.onnx) + model_w, model_h = args.model_size + + model_runner = OnnxRunner(model_path) + out = { + 'metadata': build_metadata_record(model_path), + 'frame_skip': args.frame_skip, + } + + run_policy_jit = TinyJit(make_run_policy(model_runner, out['metadata'], args.frame_skip), prune=True) + + make_policy_queues = partial(make_input_queues, out['metadata']['input_shapes'], args.frame_skip) + make_random_model_inputs = partial(make_random_images, keys=['warped'], shape=(2, 6, *out['metadata']['input_shapes']['img'][2:])) + out['run_policy'] = compile_jit(run_policy_jit, make_random_model_inputs, POLICY_INPUTS, + make_policy_queues) + validate_supercombo_release(out['run_policy'], model_runner, out['metadata'], args.frame_skip, args.expected_device) + + for cam_w, cam_h in args.camera_resolutions: + nv12 = NV12Frame(cam_w, cam_h, *get_nv12_info(cam_w, cam_h)) + make_random_warp_inputs = partial(make_random_images, keys=['frame', 'big_frame'], shape=nv12.size, device=WARP_DEV) + warp_enqueue = TinyJit(make_warp(nv12, model_w, model_h, args.frame_skip), prune=True) + make_warp_queues = partial(make_warp_input_queues, out['metadata']['input_shapes'], args.frame_skip) + out[(cam_w,cam_h)] = compile_jit(warp_enqueue, make_random_warp_inputs, WARP_INPUTS, make_warp_queues) + captured_devices = _captured_devices(out[(cam_w,cam_h)]) + if args.expected_device and captured_devices and args.expected_device not in captured_devices: + raise AssertionError( + f"compiled warp backend mismatch for {cam_w}x{cam_h}: captured {sorted(captured_devices)} expected {args.expected_device}" + ) + + with open(args.output, "wb") as f: + pickle.dump(out, f) + print(f"Saved JITs to {args.output} ({os.path.getsize(args.output) / 1e6:.2f} MB)") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/compile_warp.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/compile_warp.py new file mode 100644 index 000000000..07e4886eb --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/tools/compile_warp.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +Compile the backend-neutral warp-only artifact: NV12 camera frames + 3x3 +transforms -> (2, 6, model_h/2, model_w/2) uint8 warped tensor, on the device +GPU (QCOM). maciqmodeld runs this locally +and feed the output to their backend, so the big model's image pipeline is +bit-identical to comma's fused pkl warp stage. + +Run ON the device (needs the QCOM backend): + cd /data/openpilot && DEV=QCOM WARP_DEV=QCOM IMAGE=1 FLOAT16=1 NOLOCALS=1 JIT_BATCH_SIZE=0 \ + python3 iqpilot/selfdrive/iqmodeld/tools/compile_warp.py \ + --camera-resolutions 1928x1208 --output /data/models/emac_warp.pkl +The artifact is then split per-resolution into Paths.model_root(). +""" +from __future__ import annotations + +import argparse +import hashlib +import os +import pickle +from functools import partial + +import numpy as np + +SELFTEST_SEED = 20260817 + +from iqpilot.selfdrive.iqmodeld.temporal_state import DEFAULT_FRAME_SKIP, MODEL_INPUT_SPEC +from iqpilot.selfdrive.iqmodeld.tools.compile_supercombo import ( + NV12Frame, WARP_INPUTS, compile_jit, make_random_images, make_warp, make_warp_input_queues, +) + +MODEL_SIZE = (MODEL_INPUT_SPEC["img"][0][3] * 2, MODEL_INPUT_SPEC["img"][0][2] * 2) # (512, 256) + + +def _parse_size(s: str) -> tuple[int, int]: + w, h = s.lower().split("x") + return int(w), int(h) + + +def compile_warp(cam_w: int, cam_h: int, out_path: str | None = None, + frame_skip: int = DEFAULT_FRAME_SKIP) -> str: + """Compile the warp-only QCOM JIT for one camera resolution and write the pkl. + Returns the artifact path. Callable from the workers so a fresh device + self-provisions the warp instead of erroring — needs the QCOM backend.""" + # the QCOM warp env must be set before tinygrad is imported here + os.environ.setdefault("DEV", "QCOM") + os.environ.setdefault("WARP_DEV", "QCOM") + os.environ.setdefault("IMAGE", "1") + os.environ.setdefault("FLOAT16", "1") + os.environ.setdefault("NOLOCALS", "1") + os.environ.setdefault("JIT_BATCH_SIZE", "0") + from tinygrad.engine.jit import TinyJit + from iqpilot.system.camerad.cameras.nv12_info import get_nv12_info + from iqpilot.system.hardware.hw import Paths + + model_w, model_h = MODEL_SIZE + input_shapes = {name: shape for name, (shape, _) in MODEL_INPUT_SPEC.items()} + nv12 = NV12Frame(cam_w, cam_h, *get_nv12_info(cam_w, cam_h)) + make_random_warp_inputs = partial(make_random_images, keys=["frame", "big_frame"], + shape=nv12.size, device=os.getenv("WARP_DEV")) + warp_jit = TinyJit(make_warp(nv12, model_w, model_h, frame_skip), prune=True) + make_warp_queues = partial(make_warp_input_queues, input_shapes, frame_skip) + compiled = compile_jit(warp_jit, make_random_warp_inputs, WARP_INPUTS, make_warp_queues) + + # historical artifact name: already-provisioned devices keep their warp + out_path = out_path or os.path.join(Paths.model_root(), f"emac_warp_{cam_w}x{cam_h}_tinygrad.pkl") + os.makedirs(os.path.dirname(out_path), exist_ok=True) + tmp = out_path + ".part" + bundle = {(cam_w, cam_h): compiled, "frame_skip": frame_skip, "model_size": MODEL_SIZE} + bundle["selftest"] = selftest_digest(compiled, cam_w, cam_h, nv12.size) + with open(tmp, "wb") as f: + pickle.dump(bundle, f) + os.replace(tmp, out_path) # atomic: a reader never sees a half-written pkl + return out_path + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--camera-resolutions", type=_parse_size, nargs="+", default=[(1928, 1208)]) + p.add_argument("--output", default=None) + p.add_argument("--frame-skip", type=int, default=DEFAULT_FRAME_SKIP) + args = p.parse_args() + for cam_w, cam_h in args.camera_resolutions: + out = compile_warp(cam_w, cam_h, args.output, frame_skip=args.frame_skip) + print(f"saved warp JIT to {out} ({os.path.getsize(out) / 1e6:.2f} MB)") + + +if __name__ == "__main__": + main() + + +def selftest_inputs(cam_w: int, cam_h: int, nv12_size: int): + """A fixed synthetic frame pair and pair of matrices. Deterministic so the + digest is reproducible on the device that compiled the artifact.""" + rng = np.random.default_rng(SELFTEST_SEED) + frame = rng.integers(0, 256, nv12_size, dtype=np.uint8) + big_frame = rng.integers(0, 256, nv12_size, dtype=np.uint8) + tfm = np.array([[0.7, 0.02, 300.0], [0.01, 0.7, 240.0], [0.0, 0.0, 1.0]], dtype=np.float32) + big_tfm = np.array([[0.5, 0.01, 380.0], [0.02, 0.5, 300.0], [0.0, 0.0, 1.0]], dtype=np.float32) + return frame, big_frame, tfm, big_tfm + + +def selftest_digest(compiled, cam_w: int, cam_h: int, nv12_size: int) -> str: + """Hash the warp's output for a fixed input. + + A warp artifact pinned to one tinygrad can still unpickle under another and + then compute silently wrong, which reaches the model as a garbage image and + looks like a bad model rather than a stale artifact. A version string cannot + see that; running it can.""" + from tinygrad.tensor import Tensor + frame, big_frame, tfm, big_tfm = selftest_inputs(cam_w, cam_h, nv12_size) + dev = os.getenv("WARP_DEV") or "QCOM" + out = compiled(tfm=Tensor(tfm, device="NPY").realize(), + big_tfm=Tensor(big_tfm, device="NPY").realize(), + frame=Tensor(frame, device=dev).realize(), + big_frame=Tensor(big_frame, device=dev).realize()) + return hashlib.sha256(out.numpy().astype(np.uint8).tobytes()).hexdigest() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibration_helpers.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibration_helpers.py new file mode 100644 index 000000000..11e39af3e --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibration_helpers.py @@ -0,0 +1,32 @@ +import math + +import numpy as np +from iqpilot.cereal import log + +from iqpilot.selfdrive.locationd.calibrationd import HEIGHT_INIT, HEIGHT_SANE_MIN, HEIGHT_SANE_MAX + + +def get_calibrated_rpy(live_calib: log.ExtrinsicsCalibration) -> np.ndarray | None: + if live_calib.calStatus != log.ExtrinsicsCalibration.Status.calibrated: + return None + + if len(live_calib.rpyCalib) != 3: + return None + + calib_rpy = np.asarray(live_calib.rpyCalib, dtype=np.float32) + return calib_rpy if np.isfinite(calib_rpy).all() else None + + +def get_render_path_height(live_calib: log.ExtrinsicsCalibration) -> float: + if live_calib.calStatus != log.ExtrinsicsCalibration.Status.calibrated: + return float(HEIGHT_INIT[0]) + + if len(live_calib.height) != 1: + return float(HEIGHT_INIT[0]) + + height = float(live_calib.height[0]) + if not math.isfinite(height): + return float(HEIGHT_INIT[0]) + if not (HEIGHT_SANE_MIN <= height <= HEIGHT_SANE_MAX): + return float(HEIGHT_INIT[0]) + return height diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibrationd.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibrationd.py new file mode 100644 index 000000000..3e3ec6d45 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibrationd.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +''' +This process finds calibration values. More info on what these calibration values +are can be found here https://github.com/commaai/openpilot/tree/master/common/transformations +While the roll calibration is a real value that can be estimated, here we assume it's zero, +and the image input into the neural network is not corrected for roll. +''' + +import os +import capnp +import numpy as np +from typing import NoReturn + +from iqpilot.cereal import log, car +import iqpilot.cereal.messaging as messaging +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.issue_debug import log_issue_limited +from iqpilot.common.realtime import config_realtime_process +from iqpilot.common.transformations.orientation import rot_from_euler, euler_from_rot +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import HARDWARE + +MIN_SPEED_FILTER = 15 * CV.MPH_TO_MS +MAX_VEL_ANGLE_STD = np.radians(0.25) +MAX_YAW_RATE_FILTER = np.radians(2) # per second + +MAX_HEIGHT_STD = np.exp(-3.5) + +# This is at model frequency, blocks needed for efficiency +SMOOTH_CYCLES = 10 +BLOCK_SIZE = 100 +INPUTS_NEEDED = 5 # Minimum blocks needed for valid calibration +INPUTS_WANTED = 50 # We want a little bit more than we need for stability +MAX_ALLOWED_YAW_SPREAD = np.radians(2) +MAX_ALLOWED_PITCH_SPREAD = np.radians(4) +TICI_FAMILY_PITCH_SPREAD_RESET = np.radians(3) +RPY_INIT = np.array([0.0,0.0,0.0]) +WIDE_FROM_DEVICE_EULER_INIT = np.array([0.0, 0.0, 0.0]) +HEIGHT_INIT = np.array([1.22]) +HEIGHT_SANE_MIN, HEIGHT_SANE_MAX = 0.9, 2.0 +DEVICE_IS_TICI_FAMILY = HARDWARE.get_device_type() in ("tici", "tizi") + +# These values are needed to accommodate the model frame in the narrow cam +if HARDWARE.get_device_type() == 'mici': + PITCH_LIMITS = np.array([-0.143101, 0.22235988]) +else: + PITCH_LIMITS = np.array([-0.09074112085129739, 0.17]) +YAW_LIMITS = np.array([-0.06912048084718224, 0.06912048084718235]) +DEBUG = os.getenv("DEBUG") is not None + +def is_calibration_valid(rpy: np.ndarray) -> bool: + return (PITCH_LIMITS[0] < rpy[1] < PITCH_LIMITS[1]) and (YAW_LIMITS[0] < rpy[2] < YAW_LIMITS[1]) + + +def sanity_clip(rpy: np.ndarray) -> np.ndarray: + if np.isnan(rpy).any(): + rpy = RPY_INIT + return np.array([rpy[0], + np.clip(rpy[1], PITCH_LIMITS[0] - .005, PITCH_LIMITS[1] + .005), + np.clip(rpy[2], YAW_LIMITS[0] - .005, YAW_LIMITS[1] + .005)]) + +def moving_avg_with_linear_decay(prev_mean: np.ndarray, new_val: np.ndarray, idx: int, block_size: float) -> np.ndarray: + return (idx*prev_mean + (block_size - idx) * new_val) / block_size + +class Calibrator: + def __init__(self, param_put: bool = False): + self.param_put = param_put + + self.not_car = False + self.stable_rpy = RPY_INIT.copy() + self.stable_wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT.copy() + self.stable_height = HEIGHT_INIT.copy() + self.has_stable_snapshot = False + + # Read saved calibration + self.params = Params() + calibration_params = self.params.get("CalibrationParams") + rpy_init = RPY_INIT + wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT + height = HEIGHT_INIT + valid_blocks = 0 + self.cal_status = log.ExtrinsicsCalibration.Status.uncalibrated + + if param_put and calibration_params: + try: + with log.Event.from_bytes(calibration_params) as msg: + rpy_init = np.array(msg.extrinsicsCalibration.rpyCalib) + valid_blocks = msg.extrinsicsCalibration.validBlocks + wide_from_device_euler = np.array(msg.extrinsicsCalibration.wideFromDeviceEuler) + height = np.array(msg.extrinsicsCalibration.height) + except Exception: + cloudlog.exception("Error reading cached CalibrationParams") + + self.reset(rpy_init, valid_blocks, wide_from_device_euler, height) + self.update_status() + + # If saved calibration is immediately invalid (e.g. bad params from a previous + # bootstrap bug or device remount), auto-clear it so we recalibrate from scratch + # instead of getting permanently stuck in the "Calibration Invalid" state. + if self.cal_status == log.ExtrinsicsCalibration.Status.invalid: + cloudlog.warning("calibrationd: saved CalibrationParams are invalid, clearing and starting fresh") + if param_put: + self.params.remove("CalibrationParams") + self.reset() + self.update_status() + + def _remember_stable_solution(self) -> None: + self.stable_rpy = self.rpy.copy() + self.stable_wide_from_device_euler = self.wide_from_device_euler.copy() + self.stable_height = self.height.copy() + self.has_stable_snapshot = True + + def reset(self, rpy_init: np.ndarray = RPY_INIT, + valid_blocks: int = 0, + wide_from_device_euler_init: np.ndarray = WIDE_FROM_DEVICE_EULER_INIT, + height_init: np.ndarray = HEIGHT_INIT, + smooth_from: np.ndarray | None = None) -> None: + if not np.isfinite(rpy_init).all(): + self.rpy = RPY_INIT.copy() + else: + self.rpy = rpy_init.copy() + + if not np.isfinite(height_init).all() or len(height_init) != 1: + self.height = HEIGHT_INIT.copy() + else: + self.height = height_init.copy() + + if not np.isfinite(wide_from_device_euler_init).all() or len(wide_from_device_euler_init) != 3: + self.wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT.copy() + else: + self.wide_from_device_euler = wide_from_device_euler_init.copy() + + if not np.isfinite(valid_blocks) or valid_blocks < 0: + self.valid_blocks = 0 + else: + self.valid_blocks = valid_blocks + + self.rpys = np.tile(self.rpy, (INPUTS_WANTED, 1)) + self.wide_from_device_eulers = np.tile(self.wide_from_device_euler, (INPUTS_WANTED, 1)) + self.heights = np.tile(self.height, (INPUTS_WANTED, 1)) + + self.idx = 0 + self.block_idx = 0 + self.v_ego = 0.0 + + if smooth_from is None: + self.old_rpy = RPY_INIT + self.old_rpy_weight = 0.0 + else: + self.old_rpy = smooth_from + self.old_rpy_weight = 1.0 + + def get_valid_idxs(self) -> list[int]: + # exclude current block_idx from validity window + before_current = list(range(self.block_idx)) + after_current = list(range(min(self.valid_blocks, self.block_idx + 1), self.valid_blocks)) + return before_current + after_current + + def update_status(self) -> None: + valid_idxs = self.get_valid_idxs() + if valid_idxs: + self.wide_from_device_euler = np.mean(self.wide_from_device_eulers[valid_idxs], axis=0) + self.height = np.mean(self.heights[valid_idxs], axis=0) + rpys = self.rpys[valid_idxs] + self.rpy = np.mean(rpys, axis=0) + max_rpy_calib = np.array(np.max(rpys, axis=0)) + min_rpy_calib = np.array(np.min(rpys, axis=0)) + self.calib_spread = np.abs(max_rpy_calib - min_rpy_calib) + else: + self.calib_spread = np.zeros(3) + + if self.valid_blocks < INPUTS_NEEDED: + if self.cal_status == log.ExtrinsicsCalibration.Status.recalibrating: + self.cal_status = log.ExtrinsicsCalibration.Status.recalibrating + else: + self.cal_status = log.ExtrinsicsCalibration.Status.uncalibrated + elif is_calibration_valid(self.rpy): + self.cal_status = log.ExtrinsicsCalibration.Status.calibrated + else: + self.cal_status = log.ExtrinsicsCalibration.Status.invalid + + # If spread is too high, assume mounting was changed and reset to last block. + # Make the transition smooth. Abrupt transitions are not good for feedback loop through supercombo model. + # TODO: add height spread check with smooth transition too + pitch_spread_limit = TICI_FAMILY_PITCH_SPREAD_RESET if DEVICE_IS_TICI_FAMILY else MAX_ALLOWED_PITCH_SPREAD + spread_too_high = self.calib_spread[1] > pitch_spread_limit or self.calib_spread[2] > MAX_ALLOWED_YAW_SPREAD + if self.cal_status == log.ExtrinsicsCalibration.Status.calibrated and not spread_too_high: + self._remember_stable_solution() + + if spread_too_high and self.cal_status == log.ExtrinsicsCalibration.Status.calibrated: + use_stable_snapshot = DEVICE_IS_TICI_FAMILY and self.has_stable_snapshot + if use_stable_snapshot: + reset_rpy = self.stable_rpy + reset_wide = self.stable_wide_from_device_euler + reset_height = self.stable_height + else: + reset_rpy = self.rpys[self.block_idx - 1] + reset_wide = self.wide_from_device_eulers[self.block_idx - 1] + reset_height = self.heights[self.block_idx - 1] + + log_issue_limited( + "calibrationd_reset_spread", + "calibration", + f"calibrationd reset unstable solution pitchSpread={self.calib_spread[1]:.6f} " + f"yawSpread={self.calib_spread[2]:.6f} pitchLimit={pitch_spread_limit:.6f} " + f"use_stable_snapshot={use_stable_snapshot} rpy={self.rpy.tolist()}", + interval_sec=0.5, + ) + self.reset(reset_rpy, valid_blocks=1, wide_from_device_euler_init=reset_wide, + height_init=reset_height, smooth_from=self.stable_rpy if use_stable_snapshot else self.rpy) + self.cal_status = log.ExtrinsicsCalibration.Status.recalibrating + + write_this_cycle = (self.idx == 0) and (self.block_idx % (INPUTS_WANTED//5) == 5) + if self.param_put and write_this_cycle: + self.params.put_nonblocking("CalibrationParams", self.get_msg(True).to_bytes()) + + def handle_v_ego(self, v_ego: float) -> None: + self.v_ego = v_ego + + def get_smooth_rpy(self) -> np.ndarray: + if self.old_rpy_weight > 0: + return self.old_rpy_weight * self.old_rpy + (1.0 - self.old_rpy_weight) * self.rpy + else: + return self.rpy + + def handle_cam_odom(self, trans: list[float], + rot: list[float], + wide_from_device_euler: list[float], + trans_std: list[float], + road_transform_trans: list[float], + road_transform_trans_std: list[float]) -> np.ndarray | None: + self.old_rpy_weight = max(0.0, self.old_rpy_weight - 1/SMOOTH_CYCLES) + + fast_enough = self.v_ego > MIN_SPEED_FILTER + motion_speed = max(float(self.v_ego), float(trans[0])) + cam_fast_enough = motion_speed > MIN_SPEED_FILTER + yaw_ok = abs(rot[2]) < MAX_YAW_RATE_FILTER + straight_and_fast = fast_enough and cam_fast_enough and yaw_ok + angle_std_threshold = MAX_VEL_ANGLE_STD + height_std_threshold = MAX_HEIGHT_STD + rpy_certain = np.arctan2(trans_std[1], motion_speed) < angle_std_threshold + if len(road_transform_trans_std) == 3: + height_certain = road_transform_trans_std[2] < height_std_threshold + else: + height_certain = True + + certain_if_calib = rpy_certain + if not (straight_and_fast and certain_if_calib): + log_issue_limited( + "calibrationd_rejected_sample", + "calibration", + f"calibrationd rejected sample vEgo={self.v_ego:.2f} trans0={trans[0]:.2f} yawRate={rot[2]:.4f} " + f"fast_enough={fast_enough} cam_fast_enough={cam_fast_enough} motion_speed={motion_speed:.2f} yaw_ok={yaw_ok} " + f"rpy_certain={rpy_certain} height_certain={height_certain} valid_blocks={self.valid_blocks} idx={self.idx}", + interval_sec=1.0, + ) + return None + + observed_rpy = np.array([0, + -np.arctan2(trans[2], trans[0]), + np.arctan2(trans[1], trans[0])]) + new_rpy = euler_from_rot(rot_from_euler(self.get_smooth_rpy()).dot(rot_from_euler(observed_rpy))) + new_rpy = sanity_clip(new_rpy) + + if len(wide_from_device_euler) == 3: + new_wide_from_device_euler = np.array(wide_from_device_euler) + else: + new_wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT + + if len(road_transform_trans) == 3 and HEIGHT_SANE_MIN <= road_transform_trans[2] <= HEIGHT_SANE_MAX: + new_height = np.array([road_transform_trans[2]]) + else: + new_height = HEIGHT_INIT + + self.rpys[self.block_idx] = moving_avg_with_linear_decay(self.rpys[self.block_idx], new_rpy, self.idx, float(BLOCK_SIZE)) + self.wide_from_device_eulers[self.block_idx] = moving_avg_with_linear_decay(self.wide_from_device_eulers[self.block_idx], + new_wide_from_device_euler, self.idx, float(BLOCK_SIZE)) + self.heights[self.block_idx] = moving_avg_with_linear_decay(self.heights[self.block_idx], new_height, self.idx, float(BLOCK_SIZE)) + + self.idx = (self.idx + 1) % BLOCK_SIZE + if self.idx == 0: + self.block_idx += 1 + self.valid_blocks = max(self.block_idx, self.valid_blocks) + self.block_idx = self.block_idx % INPUTS_WANTED + + self.update_status() + + if self.idx == 0: + log_issue_limited( + "calibrationd_progress_block", + "calibration", + f"calibrationd progress status={int(self.cal_status)} valid_blocks={self.valid_blocks} " + f"calPerc={min(100 * (self.valid_blocks * BLOCK_SIZE + self.idx) // (INPUTS_NEEDED * BLOCK_SIZE), 100)} " + f"rpy={self.rpy.tolist()} spread={self.calib_spread.tolist()}", + interval_sec=0.5, + ) + + return new_rpy + + def get_msg(self, valid: bool) -> capnp.lib.capnp._DynamicStructBuilder: + smooth_rpy = self.get_smooth_rpy() + + msg = messaging.new_message('extrinsicsCalibration') + msg.valid = valid + + extrinsicsCalibration = msg.extrinsicsCalibration + extrinsicsCalibration.validBlocks = self.valid_blocks + extrinsicsCalibration.calStatus = self.cal_status + extrinsicsCalibration.calPerc = min(100 * (self.valid_blocks * BLOCK_SIZE + self.idx) // (INPUTS_NEEDED * BLOCK_SIZE), 100) + extrinsicsCalibration.rpyCalib = smooth_rpy.tolist() + extrinsicsCalibration.rpyCalibSpread = self.calib_spread.tolist() + extrinsicsCalibration.wideFromDeviceEuler = self.wide_from_device_euler.tolist() + extrinsicsCalibration.height = self.height.tolist() + + return msg + + def send_data(self, pm: messaging.PubMaster, valid: bool) -> None: + pm.send('extrinsicsCalibration', self.get_msg(valid)) + + +def main() -> NoReturn: + config_realtime_process([0, 1, 2, 3], 5) + + pm = messaging.PubMaster(['extrinsicsCalibration']) + sm = messaging.SubMaster(['cameraOdometry', 'carState'], poll='cameraOdometry') + + params_reader = Params() + CP = messaging.log_from_bytes(params_reader.get("CarParams", block=True), car.CarParams) + + calibrator = Calibrator(param_put=True) + calibrator.not_car = CP.notCar + + while 1: + timeout = 0 if sm.frame == -1 else 100 + sm.update(timeout) + + if sm.updated['cameraOdometry']: + calibrator.handle_v_ego(sm['carState'].vEgo) + new_rpy = calibrator.handle_cam_odom(sm['cameraOdometry'].trans, + sm['cameraOdometry'].rot, + sm['cameraOdometry'].wideFromDeviceEuler, + sm['cameraOdometry'].transStd, + sm['cameraOdometry'].roadTransformTrans, + sm['cameraOdometry'].roadTransformTransStd) + + if DEBUG and new_rpy is not None: + print('got new rpy', new_rpy) + + # 4Hz driven by cameraOdometry + if sm.frame % 5 == 0: + checks_ok = sm.all_checks() + if not checks_ok: + ft = sm.freq_tracker + recv_hz = {s: (round(1.0 / ft[s].avg_dt.get_average(), 2) if ft[s].avg_dt.count else None) for s in sm.services} + log_issue_limited( + "calibrationd_checks_failed", + "calibration", + f"calibrationd all_checks failed alive={sm.alive} freq_ok={sm.freq_ok} valid={sm.valid} " + f"seen={sm.seen} recv_hz={recv_hz}", + interval_sec=5.0, + ) + calibrator.send_data(pm, checks_ok) + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/helpers.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/helpers.py new file mode 100644 index 000000000..56a1c9039 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/helpers.py @@ -0,0 +1,188 @@ +import numpy as np +from typing import Any +from functools import cache + +from iqpilot.cereal import log +from iqpilot.common.transformations.orientation import rot_from_euler, euler_from_rot +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy + + +@cache +def fft_next_good_size(n: int) -> int: + """ + smallest composite of 2, 3, 5, 7, 11 that is >= n + inspired by pocketfft + """ + if n <= 6: + return n + best, f2 = 2 * n, 1 + while f2 < best: + f23 = f2 + while f23 < best: + f235 = f23 + while f235 < best: + f2357 = f235 + while f2357 < best: + f235711 = f2357 + while f235711 < best: + best = f235711 if f235711 >= n else best + f235711 *= 11 + f2357 *= 7 + f235 *= 5 + f23 *= 3 + f2 *= 2 + return best + + +def parabolic_peak_interp(R, max_index): + if max_index == 0 or max_index == len(R) - 1: + return max_index + + y_m1, y_0, y_p1 = R[max_index - 1], R[max_index], R[max_index + 1] + offset = 0.5 * (y_p1 - y_m1) / (2 * y_0 - y_p1 - y_m1) + + return max_index + offset + + +def rotate_cov(rot_matrix, cov_in): + return rot_matrix @ cov_in @ rot_matrix.T + + +def rotate_std(rot_matrix, std_in): + return np.sqrt(np.diag(rotate_cov(rot_matrix, np.diag(std_in**2)))) + + +class NPQueue: + def __init__(self, maxlen: int, rowsize: int) -> None: + self.maxlen = maxlen + self.arr = np.empty((0, rowsize)) + + def __len__(self) -> int: + return len(self.arr) + + def append(self, pt: list[float]) -> None: + if len(self.arr) < self.maxlen: + self.arr = np.append(self.arr, [pt], axis=0) + else: + self.arr[:-1] = self.arr[1:] + self.arr[-1] = pt + + +class PointBuckets: + def __init__(self, x_bounds: list[tuple[float, float]], min_points: list[float], min_points_total: int, points_per_bucket: int, rowsize: int) -> None: + self.x_bounds = x_bounds + self.buckets = {bounds: NPQueue(maxlen=points_per_bucket, rowsize=rowsize) for bounds in x_bounds} + self.buckets_min_points = dict(zip(x_bounds, min_points, strict=True)) + self.min_points_total = min_points_total + + def __len__(self) -> int: + return sum([len(v) for v in self.buckets.values()]) + + def is_valid(self) -> bool: + individual_buckets_valid = all(len(v) >= min_pts for v, min_pts in zip(self.buckets.values(), self.buckets_min_points.values(), strict=True)) + total_points_valid = self.__len__() >= self.min_points_total + return individual_buckets_valid and total_points_valid + + def get_valid_percent(self) -> int: + total_points_perc = min(self.__len__() / self.min_points_total * 100, 100) + individual_buckets_perc = min(min(len(v) / min_pts * 100 for v, min_pts in + zip(self.buckets.values(), self.buckets_min_points.values(), strict=True)), 100) + return int((total_points_perc + individual_buckets_perc) / 2) + + def is_calculable(self) -> bool: + return all(len(v) > 0 for v in self.buckets.values()) + + def add_point(self, x: float, y: float) -> None: + raise NotImplementedError + + def get_points(self, num_points: int | None = None) -> Any: + points = np.vstack([x.arr for x in self.buckets.values()]) + if num_points is None: + return points + return points[np.random.choice(np.arange(len(points)), min(len(points), num_points), replace=False)] + + def load_points(self, points: list[list[float]]) -> None: + for point in points: + self.add_point(*point) + + +class ParameterEstimator: + """ Base class for parameter estimators """ + def reset(self) -> None: + raise NotImplementedError + + def handle_log(self, t: int, which: str, msg: log.Event) -> None: + raise NotImplementedError + + def get_msg(self, valid: bool, with_points: bool) -> log.Event: + raise NotImplementedError + + +class Measurement: + x, y, z = (property(lambda self: self.xyz[0]), property(lambda self: self.xyz[1]), property(lambda self: self.xyz[2])) + x_std, y_std, z_std = (property(lambda self: self.xyz_std[0]), property(lambda self: self.xyz_std[1]), property(lambda self: self.xyz_std[2])) + roll, pitch, yaw = x, y, z + roll_std, pitch_std, yaw_std = x_std, y_std, z_std + + def __init__(self, xyz: np.ndarray, xyz_std: np.ndarray): + self.xyz: np.ndarray = xyz + self.xyz_std: np.ndarray = xyz_std + + @classmethod + def from_measurement_xyz(cls, measurement: log.DeviceMotion.XYZMeasurement) -> 'Measurement': + return cls( + xyz=np.array([measurement.x, measurement.y, measurement.z]), + xyz_std=np.array([measurement.xStd, measurement.yStd, measurement.zStd]) + ) + + +class Pose: + def __init__(self, orientation: Measurement, velocity: Measurement, acceleration: Measurement, angular_velocity: Measurement): + self.orientation = orientation + self.velocity = velocity + self.acceleration = acceleration + self.angular_velocity = angular_velocity + + @classmethod + def from_live_pose(cls, live_pose: log.DeviceMotion) -> 'Pose': + return Pose( + orientation=Measurement.from_measurement_xyz(live_pose.orientationNED), + velocity=Measurement.from_measurement_xyz(live_pose.velocityDevice), + acceleration=Measurement.from_measurement_xyz(live_pose.accelerationDevice), + angular_velocity=Measurement.from_measurement_xyz(live_pose.angularVelocityDevice) + ) + + +class PoseCalibrator: + def __init__(self): + self.calib_valid = False + self.calib_from_device = np.eye(3) + + def _transform_calib_from_device(self, meas: Measurement): + new_xyz = self.calib_from_device @ meas.xyz + new_xyz_std = rotate_std(self.calib_from_device, meas.xyz_std) + return Measurement(new_xyz, new_xyz_std) + + def _ned_from_calib(self, orientation: Measurement): + ned_from_device = rot_from_euler(orientation.xyz) + ned_from_calib = ned_from_device @ self.calib_from_device.T + ned_from_calib_euler_meas = Measurement(euler_from_rot(ned_from_calib), np.full(3, np.nan)) + return ned_from_calib_euler_meas + + def build_calibrated_pose(self, pose: Pose) -> Pose: + ned_from_calib_euler = self._ned_from_calib(pose.orientation) + angular_velocity_calib = self._transform_calib_from_device(pose.angular_velocity) + acceleration_calib = self._transform_calib_from_device(pose.acceleration) + velocity_calib = self._transform_calib_from_device(pose.velocity) + + return Pose(ned_from_calib_euler, velocity_calib, acceleration_calib, angular_velocity_calib) + + def feed_live_calib(self, live_calib: log.ExtrinsicsCalibration): + calib_rpy = get_calibrated_rpy(live_calib) + if calib_rpy is not None: + self.calib_from_device = rot_from_euler(calib_rpy).T + self.calib_valid = True + else: + if not self.calib_valid: + self.calib_from_device = np.eye(3) + self.calib_valid = False diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/locationd.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/locationd.py new file mode 100644 index 000000000..bd7864b82 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/locationd.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +import os +import time +import capnp +import numpy as np +from enum import Enum +from collections import defaultdict + +from iqpilot.cereal import log, messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.transformations.orientation import rot_from_euler +from iqpilot.common.realtime import config_realtime_process +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy +from iqpilot.selfdrive.locationd.helpers import rotate_std +from iqpilot.selfdrive.locationd.models.pose_kf import PoseKalman, States +from iqpilot.selfdrive.locationd.models.constants import ObservationKind + +ACCEL_SANITY_CHECK = 100.0 # m/s^2 +ROTATION_SANITY_CHECK = 10.0 # rad/s +TRANS_SANITY_CHECK = 200.0 # m/s +CALIB_RPY_SANITY_CHECK = 0.5 # rad (+- 30 deg) +MIN_STD_SANITY_CHECK = 1e-5 # m or rad +MAX_FILTER_REWIND_TIME = 0.8 # s +MAX_SENSOR_TIME_DIFF = 0.1 # s +YAWRATE_CROSS_ERR_CHECK_FACTOR = 30 +INPUT_INVALID_LIMIT = 2.0 # 1 (camodo) / 9 (sensor) bad input[s] ignored +INPUT_INVALID_RECOVERY = 10.0 # ~10 secs to resume after exceeding allowed bad inputs by one +POSENET_STD_INITIAL_VALUE = 10.0 +POSENET_STD_HIST_HALF = 20 + + +def calculate_invalid_input_decay(invalid_limit, recovery_time, frequency): + return (1 - 1 / (2 * invalid_limit)) ** (1 / (recovery_time * frequency)) + + +def init_xyz_measurement(measurement: capnp._DynamicStructBuilder, values: np.ndarray, stds: np.ndarray, valid: bool): + assert len(values) == len(stds) == 3 + measurement.x, measurement.y, measurement.z = map(float, values) + measurement.xStd, measurement.yStd, measurement.zStd = map(float, stds) + measurement.valid = valid + + +class HandleLogResult(Enum): + SUCCESS = 0 + TIMING_INVALID = 1 + INPUT_INVALID = 2 + SENSOR_SOURCE_INVALID = 3 + + +class LocationEstimator: + def __init__(self, debug: bool): + self.kf = PoseKalman(MAX_FILTER_REWIND_TIME) + + self.debug = debug + + self.posenet_stds = np.array([POSENET_STD_INITIAL_VALUE] * (POSENET_STD_HIST_HALF * 2)) + self.car_speed = 0.0 + self.camodo_yawrate_distribution = np.array([0.0, 10.0]) # mean, std + self.device_from_calib = np.eye(3) + + obs_kinds = [ObservationKind.PHONE_ACCEL, ObservationKind.PHONE_GYRO, ObservationKind.CAMERA_ODO_ROTATION, ObservationKind.CAMERA_ODO_TRANSLATION] + self.observations = {kind: np.zeros(3, dtype=np.float32) for kind in obs_kinds} + self.observation_errors = {kind: np.zeros(3, dtype=np.float32) for kind in obs_kinds} + + def reset(self, t: float, x_initial: np.ndarray = PoseKalman.initial_x, P_initial: np.ndarray = PoseKalman.initial_P): + self.kf.init_state(x_initial, covs=P_initial, filter_time=t) + + def _validate_sensor_source(self, source: log.SensorEventData.SensorSource): + # some segments have two IMUs, ignore the second one + return source != log.SensorEventData.SensorSource.bmx055 + + def _validate_sensor_time(self, sensor_time: float, t: float): + # ignore empty readings + if sensor_time == 0: + return False + + # sensor time and log time should be close + sensor_time_invalid = abs(sensor_time - t) > MAX_SENSOR_TIME_DIFF + if sensor_time_invalid: + cloudlog.warning("Sensor reading ignored, sensor timestamp more than 100ms off from log time") + return not sensor_time_invalid + + def _validate_timestamp(self, t: float): + kf_t = self.kf.t + invalid = not np.isnan(kf_t) and (kf_t - t) > MAX_FILTER_REWIND_TIME + if invalid: + cloudlog.warning("Observation timestamp is older than the max rewind threshold of the filter") + return not invalid + + def _finite_check(self, t: float, new_x: np.ndarray, new_P: np.ndarray): + all_finite = np.isfinite(new_x).all() and np.isfinite(new_P).all() + if not all_finite: + cloudlog.error("Non-finite values detected, kalman reset") + self.reset(t) + + def handle_log(self, t: float, which: str, msg: capnp._DynamicStructReader) -> HandleLogResult: + new_x, new_P = None, None + if which == "accelerometer" and msg.which() == "acceleration": + sensor_time = msg.timestamp * 1e-9 + + if not self._validate_sensor_time(sensor_time, t) or not self._validate_timestamp(sensor_time): + return HandleLogResult.TIMING_INVALID + + if not self._validate_sensor_source(msg.source): + return HandleLogResult.SENSOR_SOURCE_INVALID + + v = msg.acceleration.v + meas = np.array([-v[2], -v[1], -v[0]]) + if np.linalg.norm(meas) >= ACCEL_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + acc_res = self.kf.predict_and_observe(sensor_time, ObservationKind.PHONE_ACCEL, meas) + if acc_res is not None: + _, new_x, _, new_P, _, _, (acc_err,), _, _ = acc_res + self.observation_errors[ObservationKind.PHONE_ACCEL] = np.array(acc_err) + self.observations[ObservationKind.PHONE_ACCEL] = meas + + elif which == "gyroscope" and msg.which() == "gyroUncalibrated": + sensor_time = msg.timestamp * 1e-9 + + if not self._validate_sensor_time(sensor_time, t) or not self._validate_timestamp(sensor_time): + return HandleLogResult.TIMING_INVALID + + if not self._validate_sensor_source(msg.source): + return HandleLogResult.SENSOR_SOURCE_INVALID + + v = msg.gyroUncalibrated.v + meas = np.array([-v[2], -v[1], -v[0]]) + + gyro_bias = self.kf.x[States.GYRO_BIAS] + gyro_camodo_yawrate_err = np.abs((meas[2] - gyro_bias[2]) - self.camodo_yawrate_distribution[0]) + gyro_camodo_yawrate_err_threshold = YAWRATE_CROSS_ERR_CHECK_FACTOR * self.camodo_yawrate_distribution[1] + gyro_valid = gyro_camodo_yawrate_err < gyro_camodo_yawrate_err_threshold + + if np.linalg.norm(meas) >= ROTATION_SANITY_CHECK or not gyro_valid: + return HandleLogResult.INPUT_INVALID + + gyro_res = self.kf.predict_and_observe(sensor_time, ObservationKind.PHONE_GYRO, meas) + if gyro_res is not None: + _, new_x, _, new_P, _, _, (gyro_err,), _, _ = gyro_res + self.observation_errors[ObservationKind.PHONE_GYRO] = np.array(gyro_err) + self.observations[ObservationKind.PHONE_GYRO] = meas + + elif which == "carState": + self.car_speed = abs(msg.vEgo) + + elif which == "extrinsicsCalibration": + # Note that we use this message during calibration + calib = get_calibrated_rpy(msg) + if calib is None and len(msg.rpyCalib) > 0: + calib = np.array(msg.rpyCalib) + + if calib is not None: + if calib.min() < -CALIB_RPY_SANITY_CHECK or calib.max() > CALIB_RPY_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + self.device_from_calib = rot_from_euler(calib) + + elif which == "cameraOdometry": + if not self._validate_timestamp(t): + return HandleLogResult.TIMING_INVALID + + rot_device = np.matmul(self.device_from_calib, np.array(msg.rot)) + trans_device = np.matmul(self.device_from_calib, np.array(msg.trans)) + + if np.linalg.norm(rot_device) > ROTATION_SANITY_CHECK or np.linalg.norm(trans_device) > TRANS_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + rot_calib_std = np.array(msg.rotStd) + trans_calib_std = np.array(msg.transStd) + + if rot_calib_std.min() <= MIN_STD_SANITY_CHECK or trans_calib_std.min() <= MIN_STD_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + if np.linalg.norm(rot_calib_std) > 10 * ROTATION_SANITY_CHECK or np.linalg.norm(trans_calib_std) > 10 * TRANS_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + self.posenet_stds = np.roll(self.posenet_stds, -1) + self.posenet_stds[-1] = trans_calib_std[0] + + # Multiply by N to avoid to high certainty in kalman filter because of temporally correlated noise + rot_calib_std *= 10 + trans_calib_std *= 2 + + rot_device_std = rotate_std(self.device_from_calib, rot_calib_std) + trans_device_std = rotate_std(self.device_from_calib, trans_calib_std) + rot_device_noise = rot_device_std ** 2 + trans_device_noise = trans_device_std ** 2 + + cam_odo_rot_res = self.kf.predict_and_observe(t, ObservationKind.CAMERA_ODO_ROTATION, rot_device, np.array([np.diag(rot_device_noise)])) + cam_odo_trans_res = self.kf.predict_and_observe(t, ObservationKind.CAMERA_ODO_TRANSLATION, trans_device, np.array([np.diag(trans_device_noise)])) + self.camodo_yawrate_distribution = np.array([rot_device[2], rot_device_std[2]]) + if cam_odo_rot_res is not None: + _, new_x, _, new_P, _, _, (cam_odo_rot_err,), _, _ = cam_odo_rot_res + self.observation_errors[ObservationKind.CAMERA_ODO_ROTATION] = np.array(cam_odo_rot_err) + self.observations[ObservationKind.CAMERA_ODO_ROTATION] = rot_device + if cam_odo_trans_res is not None: + _, new_x, _, new_P, _, _, (cam_odo_trans_err,), _, _ = cam_odo_trans_res + self.observation_errors[ObservationKind.CAMERA_ODO_TRANSLATION] = np.array(cam_odo_trans_err) + self.observations[ObservationKind.CAMERA_ODO_TRANSLATION] = trans_device + + if new_x is not None and new_P is not None: + self._finite_check(t, new_x, new_P) + return HandleLogResult.SUCCESS + + def get_msg(self, sensors_valid: bool, inputs_valid: bool, filter_valid: bool): + state, cov = self.kf.x, self.kf.P + std = np.sqrt(np.diag(cov)) + + orientation_ned, orientation_ned_std = state[States.NED_ORIENTATION], std[States.NED_ORIENTATION] + velocity_device, velocity_device_std = state[States.DEVICE_VELOCITY], std[States.DEVICE_VELOCITY] + angular_velocity_device, angular_velocity_device_std = state[States.ANGULAR_VELOCITY], std[States.ANGULAR_VELOCITY] + acceleration_device, acceleration_device_std = state[States.ACCELERATION], std[States.ACCELERATION] + + msg = messaging.new_message("deviceMotion") + msg.valid = filter_valid + + deviceMotion = msg.deviceMotion + init_xyz_measurement(deviceMotion.orientationNED, orientation_ned, orientation_ned_std, filter_valid) + init_xyz_measurement(deviceMotion.velocityDevice, velocity_device, velocity_device_std, filter_valid) + init_xyz_measurement(deviceMotion.angularVelocityDevice, angular_velocity_device, angular_velocity_device_std, filter_valid) + init_xyz_measurement(deviceMotion.accelerationDevice, acceleration_device, acceleration_device_std, filter_valid) + if self.debug: + deviceMotion.debugFilterState.value = state.tolist() + deviceMotion.debugFilterState.std = std.tolist() + deviceMotion.debugFilterState.valid = filter_valid + deviceMotion.debugFilterState.observations = [ + {'kind': k, 'value': self.observations[k].tolist(), 'error': self.observation_errors[k].tolist()} + for k in self.observations.keys() + ] + + old_mean = np.mean(self.posenet_stds[:POSENET_STD_HIST_HALF]) + new_mean = np.mean(self.posenet_stds[POSENET_STD_HIST_HALF:]) + std_spike = (new_mean / old_mean) > 4.0 and new_mean > 7.0 + + deviceMotion.inputsOK = inputs_valid + deviceMotion.posenetOK = not std_spike or self.car_speed <= 5.0 + deviceMotion.sensorsOK = sensors_valid + + return msg + + +def sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, simulation): + cur_time = time.monotonic() + for which, msgs in [("accelerometer", acc_msgs), ("gyroscope", gyro_msgs)]: + if len(msgs) > 0: + sensor_valid[which] = msgs[-1].valid + sensor_recv_time[which] = cur_time + + if not simulation: + sensor_alive[which] = (cur_time - sensor_recv_time[which]) < 0.1 + else: + sensor_alive[which] = len(msgs) > 0 + + return all(sensor_alive.values()) and all(sensor_valid.values()) + + +def main(): + config_realtime_process([0, 1, 2, 3], 5) + + DEBUG = bool(int(os.getenv("DEBUG", "0"))) + SIMULATION = bool(int(os.getenv("SIMULATION", "0"))) + + pm = messaging.PubMaster(['deviceMotion']) + sm = messaging.SubMaster(['carState', 'extrinsicsCalibration', 'cameraOdometry'], poll='cameraOdometry') + # separate sensor sockets for efficiency + sensor_sockets = [messaging.sub_sock(which, timeout=20) for which in ['accelerometer', 'gyroscope']] + sensor_alive, sensor_valid, sensor_recv_time = defaultdict(bool), defaultdict(bool), defaultdict(float) + + params = Params() + + estimator = LocationEstimator(DEBUG) + + filter_initialized = False + critcal_services = ["accelerometer", "gyroscope", "cameraOdometry"] + observation_input_invalid = defaultdict(int) + + input_invalid_limit = {s: round(INPUT_INVALID_LIMIT * (SERVICE_LIST[s].frequency / 20.)) for s in critcal_services} + input_invalid_threshold = {s: input_invalid_limit[s] - 0.5 for s in critcal_services} + input_invalid_decay = {s: calculate_invalid_input_decay(input_invalid_limit[s], INPUT_INVALID_RECOVERY, SERVICE_LIST[s].frequency) for s in critcal_services} + + initial_pose_data = params.get("LocationFilterInitialState") + if initial_pose_data is not None: + with log.Event.from_bytes(initial_pose_data) as lp_msg: + filter_state = lp_msg.deviceMotion.debugFilterState + x_initial = np.array(filter_state.value, dtype=np.float64) if len(filter_state.value) != 0 else PoseKalman.initial_x + P_initial = np.diag(np.array(filter_state.std, dtype=np.float64)) if len(filter_state.std) != 0 else PoseKalman.initial_P + estimator.reset(None, x_initial, P_initial) + + while True: + sm.update() + + acc_msgs, gyro_msgs = (messaging.drain_sock(sock) for sock in sensor_sockets) + + if filter_initialized: + msgs = [] + for msg in acc_msgs + gyro_msgs: + t, valid, which, data = msg.logMonoTime, msg.valid, msg.which(), getattr(msg, msg.which()) + msgs.append((t, valid, which, data)) + for which, updated in sm.updated.items(): + if not updated: + continue + t, valid, data = sm.logMonoTime[which], sm.valid[which], sm[which] + msgs.append((t, valid, which, data)) + + for log_mono_time, valid, which, msg in sorted(msgs, key=lambda x: x[0]): + if valid: + t = log_mono_time * 1e-9 + res = estimator.handle_log(t, which, msg) + if which not in critcal_services: + continue + + if res == HandleLogResult.TIMING_INVALID: + cloudlog.warning(f"Observation {which} ignored due to failed timing check") + observation_input_invalid[which] += 1 + elif res == HandleLogResult.INPUT_INVALID: + cloudlog.warning(f"Observation {which} ignored due to failed sanity check") + observation_input_invalid[which] += 1 + elif res == HandleLogResult.SUCCESS: + observation_input_invalid[which] *= input_invalid_decay[which] + else: + filter_initialized = sm.all_checks() and sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, SIMULATION) + + if sm.updated["cameraOdometry"]: + critical_service_inputs_valid = all(observation_input_invalid[s] < input_invalid_threshold[s] for s in critcal_services) + inputs_valid = sm.all_valid() and critical_service_inputs_valid + sensors_valid = sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, SIMULATION) + + msg = estimator.get_msg(sensors_valid, inputs_valid, filter_initialized) + pm.send("deviceMotion", msg) + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/models/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/models/constants.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/models/constants.py new file mode 100644 index 000000000..8e95ff82e --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/models/constants.py @@ -0,0 +1,88 @@ +class ObservationKind: + UNKNOWN = 0 + NO_OBSERVATION = 1 + GPS_NED = 2 + ODOMETRIC_SPEED = 3 + PHONE_GYRO = 4 + GPS_VEL = 5 + PSEUDORANGE_GPS = 6 + PSEUDORANGE_RATE_GPS = 7 + SPEED = 8 + NO_ROT = 9 + PHONE_ACCEL = 10 + ORB_POINT = 11 + ECEF_POS = 12 + CAMERA_ODO_TRANSLATION = 13 + CAMERA_ODO_ROTATION = 14 + ORB_FEATURES = 15 + MSCKF_TEST = 16 + FEATURE_TRACK_TEST = 17 + LANE_PT = 18 + IMU_FRAME = 19 + PSEUDORANGE_GLONASS = 20 + PSEUDORANGE_RATE_GLONASS = 21 + PSEUDORANGE = 22 + PSEUDORANGE_RATE = 23 + ECEF_VEL = 35 + ECEF_ORIENTATION_FROM_GPS = 32 + NO_ACCEL = 33 + ORB_FEATURES_WIDE = 34 + + ROAD_FRAME_XY_SPEED = 24 # (x, y) [m/s] + ROAD_FRAME_YAW_RATE = 25 # [rad/s] + STEER_ANGLE = 26 # [rad] + ANGLE_OFFSET_FAST = 27 # [rad] + STIFFNESS = 28 # [-] + STEER_RATIO = 29 # [-] + ROAD_FRAME_X_SPEED = 30 # (x) [m/s] + ROAD_ROLL = 31 # [rad] + + names = [ + 'Unknown', + 'No observation', + 'GPS NED', + 'Odometric speed', + 'Phone gyro', + 'GPS velocity', + 'GPS pseudorange', + 'GPS pseudorange rate', + 'Speed', + 'No rotation', + 'Phone acceleration', + 'ORB point', + 'ECEF pos', + 'camera odometric translation', + 'camera odometric rotation', + 'ORB features', + 'MSCKF test', + 'Feature track test', + 'Lane ecef point', + 'imu frame eulers', + 'GLONASS pseudorange', + 'GLONASS pseudorange rate', + 'pseudorange', + 'pseudorange rate', + + 'Road Frame x,y speed', + 'Road Frame yaw rate', + 'Steer Angle', + 'Fast Angle Offset', + 'Stiffness', + 'Steer Ratio', + 'Road Frame x speed', + 'Road Roll', + 'ECEF orientation from GPS', + 'NO accel', + 'ORB features wide camera', + 'ECEF_VEL', + ] + + @classmethod + def to_string(cls, kind): + return cls.names[kind] + + +SAT_OBS = [ObservationKind.PSEUDORANGE_GPS, + ObservationKind.PSEUDORANGE_RATE_GPS, + ObservationKind.PSEUDORANGE_GLONASS, + ObservationKind.PSEUDORANGE_RATE_GLONASS] diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/models/pose_kf.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/models/pose_kf.py new file mode 100644 index 000000000..6dbf0f091 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/locationd/models/pose_kf.py @@ -0,0 +1,67 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import numpy as np + +from iqpilot.common.transformations.orientation import euler_from_rot, rot_from_euler +from iqpilot.selfdrive.locationd.models.constants import ObservationKind +from iqpilot.selfdrive.state_estimation import EstimatorModel, ModelDefinition, StateEstimator +try: + from iqpilot.selfdrive.state_estimation.native_binding_pyx import pose_predict, pose_update +except ModuleNotFoundError: + pose_predict = None + pose_update = None + + +EARTH_G = 9.81 + + +class States: + NED_ORIENTATION = slice(0, 3) + DEVICE_VELOCITY = slice(3, 6) + ANGULAR_VELOCITY = slice(6, 9) + GYRO_BIAS = slice(9, 12) + ACCELERATION = slice(12, 15) + ACCEL_BIAS = slice(15, 18) + + +def _transition(state: np.ndarray, dt: float, _: dict[str, float]) -> np.ndarray: + result = state.copy() + result[States.DEVICE_VELOCITY] += dt * state[States.ACCELERATION] + rotation = rot_from_euler(state[States.NED_ORIENTATION]) @ rot_from_euler(dt * state[States.ANGULAR_VELOCITY]) + result[States.NED_ORIENTATION] = euler_from_rot(rotation) + return result + + +def _phone_acceleration(state: np.ndarray, _: dict[str, float]) -> np.ndarray: + device_from_ned = rot_from_euler(state[States.NED_ORIENTATION]).T + centripetal = np.cross(state[States.ANGULAR_VELOCITY], state[States.DEVICE_VELOCITY]) + return device_from_ned @ np.array([0.0, 0.0, -EARTH_G]) + state[States.ACCELERATION] + centripetal + state[States.ACCEL_BIAS] + + +class PoseKalman(EstimatorModel): + name = "pose" + initial_x = np.zeros(18) + initial_P = np.diag([0.01**2] * 3 + [10**2] * 3 + [1**2] * 6 + [100**2] * 3 + [0.01**2] * 3) + Q = np.diag([0.001**2] * 3 + [0.01**2] * 3 + [0.1**2] * 3 + [(0.005 / 100)**2] * 3 + [3**2] * 3 + [0.005**2] * 3) + obs_noise = { + ObservationKind.PHONE_GYRO: np.diag([0.025**2] * 3), + ObservationKind.PHONE_ACCEL: np.diag([0.5**2] * 3), + ObservationKind.CAMERA_ODO_TRANSLATION: np.diag([0.5**2] * 3), + ObservationKind.CAMERA_ODO_ROTATION: np.diag([0.05**2] * 3), + } + + def __init__(self, max_rewind_age: float): + measurements = { + ObservationKind.PHONE_GYRO: lambda state, _: state[States.ANGULAR_VELOCITY] + state[States.GYRO_BIAS], + ObservationKind.PHONE_ACCEL: _phone_acceleration, + ObservationKind.CAMERA_ODO_TRANSLATION: lambda state, _: state[States.DEVICE_VELOCITY], + ObservationKind.CAMERA_ODO_ROTATION: lambda state, _: state[States.ANGULAR_VELOCITY], + } + def native_predict(state, covariance, dt, process_noise, _): + pose_predict(state, covariance, process_noise, dt) + + model = ModelDefinition(18, 18, _transition, measurements, self.Q, self.obs_noise, + native_predict=native_predict if pose_predict is not None else None, native_update=pose_update) + super().__init__(StateEstimator(model, self.initial_x, self.initial_P, max_rewind_age=max_rewind_age)) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/alertmanager.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/alertmanager.py new file mode 100644 index 000000000..0ffe29431 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/alertmanager.py @@ -0,0 +1,68 @@ +import copy +import os +import json +from collections import defaultdict +from dataclasses import dataclass + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.selfdrive.selfdrived.events import Alert +from iqpilot.common.atlas_alerts import NULL_ALERT as EmptyAlert + + +with open(os.path.join(BASEDIR, "iqpilot/selfdrive/selfdrived/alerts_offroad.json")) as f: + OFFROAD_ALERTS = json.load(f) + + +def set_offroad_alert(alert: str, show_alert: bool, extra_text: str | None = None) -> None: + if show_alert: + a = copy.copy(OFFROAD_ALERTS[alert]) + a['extra'] = extra_text or '' + Params().put(alert, a) + else: + Params().remove(alert) + + +@dataclass +class AlertEntry: + alert: Alert | None = None + start_frame: int = -1 + end_frame: int = -1 + added_frame: int = -1 + + def active(self, frame: int) -> bool: + return frame <= self.end_frame + + def just_added(self, frame: int) -> bool: + return self.active(frame) and frame == (self.added_frame + 1) + +class AlertManager: + def __init__(self): + self.alerts: dict[str, AlertEntry] = defaultdict(AlertEntry) + self.current_alert = EmptyAlert + + def add_many(self, frame: int, alerts: list[Alert]) -> None: + for alert in alerts: + entry = self.alerts[alert.alert_type] + entry.alert = alert + if not entry.just_added(frame): + entry.start_frame = frame + min_end_frame = entry.start_frame + alert.duration + entry.end_frame = max(frame + 1, min_end_frame) + entry.added_frame = frame + + def process_alerts(self, frame: int, clear_event_types: set): + ae = AlertEntry() + for v in self.alerts.values(): + if not v.alert: + continue + + if v.alert.event_type in clear_event_types: + v.end_frame = -1 + + # sort by priority first and then by start_frame + greater = ae.alert is None or (v.alert.priority, v.start_frame) > (ae.alert.priority, ae.start_frame) + if v.active(frame) and greater: + ae = v + + self.current_alert = ae.alert if ae.alert is not None else EmptyAlert diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/events.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/events.py new file mode 100644 index 000000000..f296a9744 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/events.py @@ -0,0 +1,991 @@ +#!/usr/bin/env python3 +import math + +from iqpilot.cereal import log, car +import iqpilot.cereal.messaging as messaging +from iqpilot.common.constants import CV +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.locationd.calibrationd import MIN_SPEED_FILTER +from iqpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER +from iqpilot.selfdrive.ui.feedback.feedbackd import FEEDBACK_MAX_DURATION +from iqpilot.system.hardware import HARDWARE + +from iqpilot.common.atlas_alerts import EventBook as EventsBase, Tier as Priority, Tags as ET, AlertCard as Alert, \ + NoEntryCard as NoEntryAlert, GentleDisableCard as SoftDisableAlert, PendingDisableCard as UserSoftDisableAlert, \ + HardDisableCard as ImmediateDisableAlert, ChimeCard as EngagementAlert, BannerCard as NormalPermanentAlert, \ + BootCard as StartupAlert, AlertFactory as AlertCallbackType, car_mode_entry_alert as wrong_car_mode_alert + + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus +VisualAlert = car.CarControl.HUDControl.VisualAlert +AudibleAlert = car.CarControl.HUDControl.AudibleAlert +EventName = log.OnroadEvent.EventName + + +# get event name from enum +EVENT_NAME = {v: k for k, v in EventName.schema.enumerants.items()} + + +class Events(EventsBase): + def __init__(self): + super().__init__() + self.event_counters = dict.fromkeys(EVENTS.keys(), 0) + + def get_events_mapping(self) -> dict[int, dict[str, Alert | AlertCallbackType]]: + return EVENTS + + def get_event_name(self, event: int): + return EVENT_NAME[event] + + def get_event_msg_type(self): + return log.OnroadEvent + + + +# ********** helper functions ********** +def get_display_speed(speed_ms: float, metric: bool) -> str: + speed = int(round(speed_ms * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH))) + unit = 'km/h' if metric else 'mph' + return f"{speed} {unit}" + + +# ********** alert callback functions ********** + + +def soft_disable_alert(alert_text_2: str) -> AlertCallbackType: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if soft_disable_time < int(0.5 / DT_CTRL): + return ImmediateDisableAlert(alert_text_2) + return SoftDisableAlert(alert_text_2) + return func + +def user_soft_disable_alert(alert_text_2: str) -> AlertCallbackType: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if soft_disable_time < int(0.5 / DT_CTRL): + return ImmediateDisableAlert(alert_text_2) + return UserSoftDisableAlert(alert_text_2) + return func + +def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NoEntryAlert(f"Drive above {get_display_speed(CP.minEnableSpeed, metric)} to engage") + + +def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return Alert( + f"Steer Assist Unavailable Below {get_display_speed(CP.minSteerSpeed, metric)}", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 0.4) + + +def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + first_word = 'Recalibrating' if sm['extrinsicsCalibration'].calStatus == log.ExtrinsicsCalibration.Status.recalibrating else 'Calibrating' + return Alert( + f"{first_word}: {sm['extrinsicsCalibration'].calPerc:.0f}%", + f"Drive Above {get_display_speed(MIN_SPEED_FILTER, metric)}", + AlertStatus.normal, AlertSize.mid, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) + + +def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + duration = FEEDBACK_MAX_DURATION - ((sm['audioFeedback'].blockNum + 1) * SAMPLE_BUFFER / SAMPLE_RATE) + return NormalPermanentAlert( + "Recording Audio Feedback", + f"{round(duration)} second{'s' if round(duration) != 1 else ''} remaining. Press again to save early.", + priority=Priority.LOW) + + +# *** debug alerts *** + +def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + full_perc = round(100. - sm['deviceState'].freeSpacePercent) + return NormalPermanentAlert("Out of Storage", f"{full_perc}% full") + + +def posenet_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if sm.frame * DT_CTRL < 10.: + return NoEntryAlert("IQModel is starting up", alert_text_1="Please Wait") + mdl = sm['modelV2'].velocity.x[0] if len(sm['modelV2'].velocity.x) else math.nan + err = CS.vEgo - mdl + msg = f"Speed Error: {err:.1f} m/s" + return NoEntryAlert(msg, alert_text_1="Posenet Speed Invalid") + + +def process_not_running_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + not_running = [p.name for p in sm['managerState'].processes if not p.running and p.shouldBeRunning] + msg = ', '.join(not_running) + return NoEntryAlert(msg, alert_text_1="Process Not Running") + + +def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + bs = [s for s in sm.data.keys() if not sm.all_checks([s, ])] + msg = ', '.join(bs[:4]) # can't fit too many on one line + return NoEntryAlert(msg, alert_text_1="Communication Issue Between Processes") + + +def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + all_cams = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState') + bad_cams = [s.replace('State', '') for s in all_cams if s in sm.data.keys() and not sm.all_checks([s, ])] + return NormalPermanentAlert("Camera Malfunction", ', '.join(bad_cams)) + + +def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + rpy = sm['extrinsicsCalibration'].rpyCalib + yaw = math.degrees(rpy[2] if len(rpy) == 3 else math.nan) + pitch = math.degrees(rpy[1] if len(rpy) == 3 else math.nan) + angles = f"Remount Device (Pitch: {pitch:.1f}°, Yaw: {yaw:.1f}°)" + return NormalPermanentAlert("Calibration Invalid", angles) + + +def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if not sm['vehicleParameters'].angleOffsetValid: + angle_offset_deg = sm['vehicleParameters'].angleOffsetDeg + title = "Steering misalignment detected" + text = f"Angle offset too high (Offset: {angle_offset_deg:.1f}°)" + elif not sm['vehicleParameters'].steerRatioValid: + steer_ratio = sm['vehicleParameters'].steerRatio + title = "Steer ratio mismatch" + text = f"Steering rack geometry may be off (Ratio: {steer_ratio:.1f})" + elif not sm['vehicleParameters'].stiffnessFactorValid: + stiffness_factor = sm['vehicleParameters'].stiffnessFactor + title = "Abnormal tire stiffness" + text = f"Check tires, pressure, or alignment (Factor: {stiffness_factor:.1f})" + else: + return NoEntryAlert("paramsd Temporary Error") + + return NoEntryAlert(alert_text_1=title, alert_text_2=text) + +def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + cpu = max(sm['deviceState'].cpuTempC, default=0.) + gpu = max(sm['deviceState'].gpuTempC, default=0.) + temp = max((cpu, gpu, sm['deviceState'].memoryTempC)) + return NormalPermanentAlert("System Overheated", f"{temp:.0f} °C") + + +def low_memory_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NormalPermanentAlert("Low Memory", f"{sm['deviceState'].memoryUsagePercent}% used") + + +def high_cpu_usage_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + x = max(sm['deviceState'].cpuUsagePercent, default=0.) + return NormalPermanentAlert("High CPU Usage", f"{x}% used") + + +def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NormalPermanentAlert("Driving Model Lagging", f"{sm['modelV2'].frameDropPerc:.1f}% frames dropped") + + +def _joystick_axes(sm: messaging.SubMaster) -> tuple[float, float] | None: + if 'testJoystick' not in sm.data or sm.recv_frame['testJoystick'] == 0: + return None + + axes = list(sm['testJoystick'].axes) + if len(axes) < 2: + return None + + return float(axes[0]), float(axes[1]) + + +def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + gb = sm['carControl'].actuators.accel / 4. + if CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED): + steer = sm['carControl'].actuators.steeringAngleDeg + vals = f"Gas: {round(gb * 100.)}%, Angle: {round(steer, 1)}°" + else: + steer = sm['carControl'].actuators.torque + vals = f"Gas: {round(gb * 100.)}%, Steer: {round(steer * 100.)}%" + return NormalPermanentAlert("Joystick Mode", vals) + + +def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + ad = sm['alertDebug'] + audible_alert = AudibleAlert.prompt if 'Active' in ad.alertText1 else AudibleAlert.none + alert_status = AlertStatus.userPrompt if 'Active' in ad.alertText1 else AlertStatus.normal + alert_size = AlertSize.mid if ad.alertText2 else AlertSize.small + return Alert(ad.alertText1, ad.alertText2, + alert_status, alert_size, + Priority.LOW, VisualAlert.none, audible_alert, 0.2) + + +def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + personality = str(personality).title() + return NormalPermanentAlert(f"Driving Personality: {personality}", duration=1.5) + + +def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + title = "Invalid LKAS setting" + text = "Toggle stock LKAS on or off to engage" + if CP.brand == "tesla": + title = "Dashcam Mode" + text = "FSD / Autosteer is active" + elif CP.brand == "mazda": + text = "Enable your car's LKAS to engage" + elif CP.brand == "nissan": + text = "Disable your car's stock LKAS to engage" + return NormalPermanentAlert(title, text) + + +def invalid_lkas_setting_no_entry_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, + metric: bool, soft_disable_time: int, personality) -> Alert: + if CP.brand == "tesla": + return NoEntryAlert("FSD / Autosteer is active", alert_text_1="Dashcam Mode") + return NoEntryAlert("Invalid LKAS setting") + + + +EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { + # ********** events with no alerts ********** + + EventName.stockFcw: {}, + EventName.actuatorsApiUnavailable: {}, + + # ********** events only containing alerts displayed in all states ********** + + EventName.joystickDebug: { + ET.WARNING: joystick_alert, + ET.PERMANENT: NormalPermanentAlert("Joystick Mode"), + }, + + EventName.longitudinalManeuver: { + ET.WARNING: longitudinal_maneuver_alert, + ET.PERMANENT: NormalPermanentAlert("Longitudinal Maneuver Mode", + "Ensure road ahead is clear"), + }, + + EventName.bigModelLoading: { + ET.NO_ENTRY: NoEntryAlert("Big Model Loading"), + }, + + EventName.bigModelFailed: { + ET.SOFT_DISABLE: soft_disable_alert("Big Model Failed"), + ET.PERMANENT: NormalPermanentAlert("Big Model Failed ", "Restart the car to retry,\nsmall model is still available", duration=20.), + }, + + EventName.lateralManeuver: { + ET.WARNING: longitudinal_maneuver_alert, + ET.PERMANENT: NormalPermanentAlert("Lateral Maneuver Mode"), + }, + + EventName.selfdriveInitializing: { + ET.NO_ENTRY: NoEntryAlert("IQ.Pilot Initializing"), + }, + + EventName.startup: { + ET.PERMANENT: StartupAlert("Welcome to IQ.Pilot!") + }, + + EventName.startupMaster: { + ET.PERMANENT: StartupAlert("Welcome to IQ.Pilot!"), + }, + + EventName.startupNoControl: { + ET.PERMANENT: StartupAlert("Dashcam mode"), + ET.NO_ENTRY: NoEntryAlert("Dashcam mode"), + }, + + EventName.startupNoCar: { + ET.PERMANENT: StartupAlert("IQ.Pilot Dashcam mode: car unrecognized"), + }, + + EventName.startupNoSecOcKey: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + "TSK Security Key Not Available", + priority=Priority.HIGH), + }, + + EventName.dashcamMode: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + priority=Priority.LOWEST), + }, + + EventName.invalidLkasSetting: { + ET.PERMANENT: invalid_lkas_setting_alert, + ET.NO_ENTRY: invalid_lkas_setting_no_entry_alert, + }, + + EventName.cruiseMismatch: { + #ET.PERMANENT: ImmediateDisableAlert("openpilot failed to cancel cruise"), + }, + + # openpilot doesn't recognize the car. This switches openpilot into a + # read-only mode. This can be solved by adding your fingerprint. + # See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information + EventName.carUnrecognized: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + "Car Unrecognized", + priority=Priority.LOWEST), + }, + + EventName.aeb: { + ET.PERMANENT: Alert( + "BRAKE!", + "Emergency Braking: Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.), + ET.NO_ENTRY: NoEntryAlert("AEB: Risk of Collision"), + }, + + EventName.stockAeb: { + ET.PERMANENT: Alert( + "BRAKE!", + "Stock AEB: Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.), + ET.NO_ENTRY: NoEntryAlert("Stock AEB: Risk of Collision"), + }, + + EventName.stockLkas: { + ET.PERMANENT: Alert( + "Stock LKAS: Lane Departure Detected", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.), + ET.NO_ENTRY: NoEntryAlert("Stock LKAS: Lane Departure Detected"), + }, + + EventName.fcw: { + ET.PERMANENT: Alert( + "BRAKE!", + "Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.warningSoft, 2.), + }, + + EventName.ldw: { + ET.PERMANENT: Alert( + "Lane Departure Detected", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.), + }, + + # ********** events only containing alerts that display while engaged ********** + + EventName.steerTempUnavailableSilent: { + ET.WARNING: Alert( + "Steering Assist Temporarily Unavailable", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 1.8), + }, + + EventName.preDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "", + AlertStatus.normal, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.promptDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "Driver Distracted", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1), + }, + + EventName.driverDistracted: { + ET.PERMANENT: Alert( + "DISENGAGE IMMEDIATELY", + "Driver Distracted", + AlertStatus.critical, AlertSize.full, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1), + }, + + EventName.preDriverUnresponsive: { + ET.PERMANENT: Alert( + "Touch Steering Wheel: No Face Detected", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1), + }, + + EventName.promptDriverUnresponsive: { + ET.PERMANENT: Alert( + "Touch Steering Wheel", + "Driver Unresponsive", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1), + }, + + EventName.driverUnresponsive: { + ET.PERMANENT: Alert( + "DISENGAGE IMMEDIATELY", + "Driver Unresponsive", + AlertStatus.critical, AlertSize.full, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1), + }, + + EventName.manualRestart: { + ET.WARNING: Alert( + "TAKE CONTROL", + "Resume Driving Manually", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.resumeRequired: { + ET.WARNING: Alert( + "Press Resume to Exit Standstill", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.belowSteerSpeed: { + ET.WARNING: below_steer_speed_alert, + }, + + EventName.preLaneChangeLeft: { + ET.WARNING: Alert( + "Steer Left to Start Lane Change Once Safe", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.preLaneChangeRight: { + ET.WARNING: Alert( + "Steer Right to Start Lane Change Once Safe", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.laneChangeBlocked: { + ET.WARNING: Alert( + "Car Detected in Blindspot", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1), + }, + + EventName.laneChange: { + ET.WARNING: Alert( + "Changing Lanes", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.steerSaturated: { + ET.WARNING: Alert( + "Take Control", + "Turn Exceeds Steering Limit", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.), + }, + + # Thrown when the fan is driven at >50% but is not rotating + EventName.fanMalfunction: { + ET.PERMANENT: NormalPermanentAlert("Fan Malfunction", "Likely Hardware Issue"), + }, + + # Camera is not outputting frames + EventName.cameraMalfunction: { + ET.PERMANENT: camera_malfunction_alert, + ET.SOFT_DISABLE: soft_disable_alert("Camera Malfunction"), + ET.NO_ENTRY: NoEntryAlert("Camera Malfunction: Reboot Your Device"), + }, + # Camera framerate too low + EventName.cameraFrameRate: { + ET.PERMANENT: NormalPermanentAlert("Camera Frame Rate Low", "Reboot your Device"), + ET.SOFT_DISABLE: soft_disable_alert("Camera Frame Rate Low"), + ET.NO_ENTRY: NoEntryAlert("Camera Frame Rate Low: Reboot Your Device"), + }, + + # Unused + + EventName.locationdTemporaryError: { + ET.NO_ENTRY: NoEntryAlert("locationd Temporary Error"), + ET.SOFT_DISABLE: soft_disable_alert("locationd Temporary Error"), + }, + + EventName.locationdPermanentError: { + ET.NO_ENTRY: NoEntryAlert("locationd Permanent Error"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("locationd Permanent Error"), + ET.PERMANENT: NormalPermanentAlert("locationd Permanent Error"), + }, + + # openpilot tries to learn certain parameters about your car by observing + # how the car behaves to steering inputs from both human and openpilot driving. + # This includes: + # - steer ratio: gear ratio of the steering rack. Steering angle divided by tire angle + # - tire stiffness: how much grip your tires have + # - angle offset: most steering angle sensors are offset and measure a non zero angle when driving straight + # This alert is thrown when any of these values exceed a sanity check. This can be caused by + # bad alignment or bad sensor data. If this happens consistently consider creating an issue on GitHub + EventName.paramsdTemporaryError: { + ET.NO_ENTRY: paramsd_invalid_alert, + ET.SOFT_DISABLE: soft_disable_alert("paramsd Temporary Error"), + }, + + EventName.paramsdPermanentError: { + ET.NO_ENTRY: NoEntryAlert("paramsd Permanent Error"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("paramsd Permanent Error"), + ET.PERMANENT: NormalPermanentAlert("paramsd Permanent Error"), + }, + + # ********** events that affect controls state transitions ********** + + EventName.pcmEnable: { + ET.ENABLE: EngagementAlert(AudibleAlert.engage), + }, + + EventName.buttonEnable: { + ET.ENABLE: EngagementAlert(AudibleAlert.engage), + }, + + EventName.pcmDisable: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + }, + + EventName.buttonCancel: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Cancel Pressed"), + }, + + EventName.brakeHold: { + ET.WARNING: Alert( + "Press Resume to Exit Brake Hold", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.parkBrake: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Parking Brake Engaged"), + }, + + EventName.pedalPressed: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Pedal Pressed", + visual_alert=VisualAlert.brakePressed), + }, + + EventName.steerDisengage: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Steering Pressed"), + }, + + EventName.preEnableStandstill: { + ET.PRE_ENABLE: Alert( + "Release Brake to Engage", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1, creation_delay=1.), + }, + + EventName.gasPressedOverride: { + ET.OVERRIDE_LONGITUDINAL: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.steerOverride: { + ET.OVERRIDE_LATERAL: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.wrongCarMode: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: wrong_car_mode_alert, + }, + + EventName.resumeBlocked: { + ET.NO_ENTRY: NoEntryAlert("Press Set to Engage"), + }, + + EventName.wrongCruiseMode: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Adaptive Cruise Disabled"), + }, + + EventName.steerTempUnavailable: { + ET.SOFT_DISABLE: soft_disable_alert("Steering Assist Temporarily Unavailable"), + ET.NO_ENTRY: NoEntryAlert("Steering Temporarily Unavailable"), + }, + + EventName.steerTimeLimit: { + ET.SOFT_DISABLE: soft_disable_alert("Vehicle Steering Time Limit"), + ET.NO_ENTRY: NoEntryAlert("Vehicle Steering Time Limit"), + }, + + EventName.outOfSpace: { + ET.PERMANENT: out_of_space_alert, + ET.NO_ENTRY: NoEntryAlert("Out of Storage"), + }, + + EventName.belowEngageSpeed: { + ET.NO_ENTRY: below_engage_speed_alert, + }, + + EventName.sensorDataInvalid: { + ET.PERMANENT: Alert( + "Sensor Data Invalid", + "Possible Hardware Issue", + AlertStatus.normal, AlertSize.mid, + Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2, creation_delay=1.), + ET.NO_ENTRY: NoEntryAlert("Sensor Data Invalid"), + ET.SOFT_DISABLE: soft_disable_alert("Sensor Data Invalid"), + }, + + EventName.noGps: { + }, + + EventName.tooDistracted: { + ET.NO_ENTRY: NoEntryAlert("Distraction Level Too High"), + }, + + EventName.excessiveActuation: { + ET.SOFT_DISABLE: soft_disable_alert("Excessive Actuation"), + ET.NO_ENTRY: NoEntryAlert("Excessive Actuation"), + }, + + EventName.overheat: { + ET.PERMANENT: overheat_alert, + ET.SOFT_DISABLE: soft_disable_alert("System Overheated"), + ET.NO_ENTRY: NoEntryAlert("System Overheated"), + }, + + EventName.wrongGear: { + ET.SOFT_DISABLE: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + ET.NO_ENTRY: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + }, + + # This alert is thrown when the calibration angles are outside of the acceptable range. + # For example if the device is pointed too much to the left or the right. + # Usually this can only be solved by removing the mount from the windshield completely, + # and attaching while making sure the device is pointed straight forward and is level. + # See https://comma.ai/setup for more information + EventName.calibrationInvalid: { + ET.PERMANENT: calibration_invalid_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Invalid: Remount Device & Recalibrate"), + ET.NO_ENTRY: NoEntryAlert("Calibration Invalid: Remount Device & Recalibrate"), + }, + + EventName.calibrationIncomplete: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"), + ET.NO_ENTRY: NoEntryAlert("Calibration in Progress"), + }, + + EventName.calibrationRecalibrating: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Device Remount Detected: Recalibrating"), + ET.NO_ENTRY: NoEntryAlert("Remount Detected: Recalibrating"), + }, + + EventName.doorOpen: { + ET.SOFT_DISABLE: user_soft_disable_alert("Door Open"), + ET.NO_ENTRY: NoEntryAlert("Door Open"), + }, + + EventName.seatbeltNotLatched: { + ET.SOFT_DISABLE: user_soft_disable_alert("Seatbelt Unlatched"), + ET.NO_ENTRY: NoEntryAlert("Seatbelt Unlatched"), + }, + + EventName.espDisabled: { + ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Disabled"), + ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Disabled"), + }, + + EventName.lowBattery: { + ET.SOFT_DISABLE: soft_disable_alert("Low Battery"), + ET.NO_ENTRY: NoEntryAlert("Low Battery"), + }, + + # Different openpilot services communicate between each other at a certain + # interval. If communication does not follow the regular schedule this alert + # is thrown. This can mean a service crashed, did not broadcast a message for + # ten times the regular interval, or the average interval is more than 10% too high. + # Soft warnings — no disable, no entry block. UI shows a silent yellow triangle instead. + EventName.commIssue: { + }, + EventName.commIssueAvgFreq: { + }, + + EventName.selfdrivedLagging: { + }, + + # Thrown when manager detects a service exited unexpectedly while driving + EventName.processNotRunning: { + ET.NO_ENTRY: process_not_running_alert, + ET.SOFT_DISABLE: soft_disable_alert("Process Not Running"), + }, + + EventName.radarFault: { + ET.SOFT_DISABLE: soft_disable_alert("Radar Error: Restart the Car"), + ET.NO_ENTRY: NoEntryAlert("Radar Error: Restart the Car"), + }, + + EventName.radarTempUnavailable: { + ET.SOFT_DISABLE: soft_disable_alert("Radar Temporarily Unavailable"), + ET.NO_ENTRY: NoEntryAlert("Radar Temporarily Unavailable"), + }, + + # Every frame from the camera should be processed by the model. If modeld + # is not processing frames fast enough they have to be dropped. This alert is + # thrown when over 20% of frames are dropped. + EventName.modeldLagging: { + ET.SOFT_DISABLE: soft_disable_alert("Driving Model Lagging"), + ET.NO_ENTRY: NoEntryAlert("Driving Model Lagging"), + ET.PERMANENT: modeld_lagging_alert, + }, + + # Besides predicting the path, lane lines and lead car data the model also + # predicts the current velocity and rotation speed of the car. If the model is + # very uncertain about the current velocity while the car is moving, this + # usually means the model has trouble understanding the scene. This is used + # as a heuristic to warn the driver. + EventName.posenetInvalid: { + ET.SOFT_DISABLE: soft_disable_alert("Posenet Speed Invalid"), + ET.NO_ENTRY: posenet_invalid_alert, + }, + + # When the localizer detects an acceleration of more than 40 m/s^2 (~4G) we + # alert the driver the device might have fallen from the windshield. + EventName.deviceFalling: { + ET.SOFT_DISABLE: soft_disable_alert("Device Fell Off Mount"), + ET.NO_ENTRY: NoEntryAlert("Device Fell Off Mount"), + }, + + EventName.lowMemory: { + ET.SOFT_DISABLE: soft_disable_alert("Low Memory: Reboot Your Device"), + ET.PERMANENT: low_memory_alert, + ET.NO_ENTRY: NoEntryAlert("Low Memory: Reboot Your Device"), + }, + + EventName.accFaulted: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"), + ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"), + ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"), + }, + + EventName.cruiseFaultLateralAllowed: { + ET.PERMANENT: NormalPermanentAlert("Cruise Faulted", "Lane Assist will continue to work", priority=Priority.LOWEST), + }, + + EventName.espActive: { + ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Active"), + ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Active"), + }, + + EventName.controlsMismatch: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch"), + ET.NO_ENTRY: NoEntryAlert("Controls Mismatch"), + }, + + # Sometimes the USB stack on the device can get into a bad state + # causing the connection to the panda to be lost + EventName.usbError: { + ET.SOFT_DISABLE: soft_disable_alert("USB Error: Reboot Your Device"), + ET.PERMANENT: NormalPermanentAlert("USB Error: Reboot Your Device"), + ET.NO_ENTRY: NoEntryAlert("USB Error: Reboot Your Device"), + }, + + # This alert can be thrown for the following reasons: + # - No CAN data received at all + # - CAN data is received, but some message are not received at the right frequency + # If you're not writing a new car port, this is usually cause by faulty wiring + # Minor canError: low-priority silent HUD badge only — no disable, no entry block, no audible/visual alert + EventName.canError: { + ET.PERMANENT: Alert( + "CAN Error", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.), + }, + + EventName.canBusMissing: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Bus Disconnected"), + ET.PERMANENT: Alert( + "CAN Bus Disconnected: Likely Faulty Cable", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.), + ET.NO_ENTRY: NoEntryAlert("CAN Bus Disconnected: Check Connections"), + }, + + EventName.steerUnavailable: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"), + ET.PERMANENT: NormalPermanentAlert("LKAS Fault: Restart the car to engage"), + ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"), + }, + + EventName.reverseGear: { + ET.PERMANENT: Alert( + "Reverse\nGear", + "", + AlertStatus.normal, AlertSize.full, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), + ET.USER_DISABLE: ImmediateDisableAlert("Reverse Gear"), + ET.NO_ENTRY: NoEntryAlert("Reverse Gear"), + }, + + # On cars that use stock ACC the car can decide to cancel ACC for various reasons. + # When this happens we can no long control the car so the user needs to be warned immediately. + EventName.cruiseDisabled: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Is Off"), + }, + + # When the relay in the harness box opens the CAN bus between the LKAS camera + # and the rest of the car is separated. When messages from the LKAS camera + # are received on the car side this usually means the relay hasn't opened correctly + # and this alert is thrown. + EventName.relayMalfunction: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Harness Relay Malfunction"), + ET.PERMANENT: NormalPermanentAlert("Harness Relay Malfunction", "Check Hardware"), + ET.NO_ENTRY: NoEntryAlert("Harness Relay Malfunction"), + }, + + EventName.speedTooLow: { + ET.IMMEDIATE_DISABLE: Alert( + "IQ.Pilot Canceled", + "Speed too low", + AlertStatus.normal, AlertSize.mid, + Priority.HIGH, VisualAlert.none, AudibleAlert.disengage, 3.), + }, + + # When the car is driving faster than most cars in the training data, the model outputs can be unpredictable. + EventName.speedTooHigh: { + ET.WARNING: Alert( + "Speed Too High", + "Model uncertain at this speed", + AlertStatus.userPrompt, AlertSize.mid, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 4.), + ET.NO_ENTRY: NoEntryAlert("Slow down to engage"), + }, + + EventName.vehicleSensorsInvalid: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Vehicle Sensors Invalid"), + ET.PERMANENT: NormalPermanentAlert("Vehicle Sensors Calibrating", "Drive to Calibrate"), + ET.NO_ENTRY: NoEntryAlert("Vehicle Sensors Calibrating"), + }, + + EventName.personalityChanged: { + ET.WARNING: personality_changed_alert, + }, + + EventName.userBookmark: { + ET.PERMANENT: NormalPermanentAlert("Bookmark Saved", duration=1.5), + }, + + EventName.audioFeedback: { + ET.PERMANENT: audio_feedback_alert, + }, +} + + +if HARDWARE.get_device_type() == 'mici': + EVENTS.update({ + EventName.preDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "", + AlertStatus.normal, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlert.none, 2), + }, + EventName.promptDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "Driver Distracted", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, 1), + }, + EventName.resumeRequired: { + ET.WARNING: Alert( + "Press Resume", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + EventName.preLaneChangeLeft: { + ET.WARNING: Alert( + "Steer Left", + "Confirm Lane Change", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + EventName.preLaneChangeRight: { + ET.WARNING: Alert( + "Steer Right", + "Confirm Lane Change", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + EventName.laneChangeBlocked: { + ET.WARNING: Alert( + "Car in Blindspot", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1), + }, + EventName.steerSaturated: { + ET.WARNING: Alert( + "take control", + "turn exceeds limit", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.), + }, + EventName.calibrationIncomplete: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"), + ET.NO_ENTRY: NoEntryAlert("Calibrating"), + }, + EventName.reverseGear: { + ET.PERMANENT: Alert( + "Reverse", + "", + AlertStatus.normal, AlertSize.full, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), + ET.USER_DISABLE: ImmediateDisableAlert("Reverse"), + ET.NO_ENTRY: NoEntryAlert("Reverse"), + }, + }) + + +if __name__ == '__main__': + # print all alerts by type and priority + from iqpilot.cereal.services import SERVICE_LIST + from collections import defaultdict + + event_names = {v: k for k, v in EventName.schema.enumerants.items()} + alerts_by_type: dict[str, dict[Priority, list[str]]] = defaultdict(lambda: defaultdict(list)) + + CP = car.CarParams.new_message() + CS = car.CarState.new_message() + sm = messaging.SubMaster(list(SERVICE_LIST.keys())) + + for i, alerts in EVENTS.items(): + for et, alert in alerts.items(): + if callable(alert): + alert = alert(CP, CS, sm, False, 1, log.LongitudinalPersonality.standard) + alerts_by_type[et][alert.priority].append(event_names[i]) + + all_alerts: dict[str, list[tuple[Priority, list[str]]]] = {} + for et, priority_alerts in alerts_by_type.items(): + all_alerts[et] = sorted(priority_alerts.items(), key=lambda x: x[0], reverse=True) + + for status, evs in sorted(all_alerts.items(), key=lambda x: x[0]): + print(f"**** {status} ****") + for p, alert_list in evs: + print(f" {repr(p)}:") + print(" ", ', '.join(alert_list), "\n") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/state_estimation/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/state_estimation/__init__.py new file mode 100644 index 000000000..958a822d4 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/state_estimation/__init__.py @@ -0,0 +1,7 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from iqpilot.selfdrive.state_estimation.estimator import EstimatorModel, ModelDefinition, Observation, StateEstimator + +__all__ = ["EstimatorModel", "ModelDefinition", "Observation", "StateEstimator"] diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/state_estimation/estimator.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/state_estimation/estimator.py new file mode 100644 index 000000000..696bdd737 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/state_estimation/estimator.py @@ -0,0 +1,311 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from collections.abc import Callable +from dataclasses import dataclass +import math + +import numpy as np + + +Array = np.ndarray +Prediction = Callable[[Array, float, dict[str, float]], Array] +Measurement = Callable[[Array, dict[str, float]], Array] +Injection = Callable[[Array, Array], Array] +NativePrediction = Callable[[Array, Array, float, Array, dict[str, float]], None] +NativeUpdate = Callable[[Array, Array, int, Array, Array], Array] + + +@dataclass(frozen=True) +class Observation: + kind: int + values: Array + noise: Array + + +@dataclass(frozen=True) +class ModelDefinition: + state_size: int + error_size: int + transition: Prediction + measurements: dict[int, Measurement] + process_noise: Array + observation_noise: dict[int, Array] + inject_error: Injection | None = None + error_projection: Callable[[Array], Array] | None = None + normalize: Callable[[Array], Array] | None = None + native_predict: NativePrediction | None = None + native_update: NativeUpdate | None = None + + +@dataclass +class _Snapshot: + time: float + state: Array + covariance: Array + + +@dataclass +class _Event: + time: float + observation: Observation + order: int + + +class StateEstimator: + def __init__(self, model: ModelDefinition, initial_state: Array, initial_covariance: Array, + max_rewind_age: float = 0.0): + self.model = model + self.parameters: dict[str, float] = {} + self.max_rewind_age = max_rewind_age + self._order = 0 + self.init_state(initial_state, initial_covariance, None) + + @property + def x(self) -> Array: + return self._state.copy() + + @property + def P(self) -> Array: + return self._covariance.copy() + + @property + def t(self) -> float: + return self._time + + def set_global(self, name: str, value: float) -> None: + self.parameters[name] = float(value) + + def init_state(self, state: Array, covs: Array, filter_time: float | None) -> None: + state = np.asarray(state, dtype=np.float64).reshape(-1) + covariance = np.asarray(covs, dtype=np.float64) + self._validate_state(state, covariance) + self._state = self._normalize(state.copy()) + self._covariance = self._stabilize(covariance.copy()) + self._time = math.nan if filter_time is None else float(filter_time) + self._events: list[_Event] = [] + self._snapshots = [_Snapshot(self._time, self._state.copy(), self._covariance.copy())] + + def set_filter_time(self, filter_time: float | None) -> None: + self._time = math.nan if filter_time is None else float(filter_time) + + def reset_rewind(self) -> None: + self._events.clear() + self._snapshots = [_Snapshot(self._time, self._state.copy(), self._covariance.copy())] + + def predict(self, time: float) -> None: + time = float(time) + if math.isnan(self._time): + self._time = time + return + if time < self._time: + raise ValueError("prediction time precedes estimator time") + dt = time - self._time + if dt == 0.0: + return + if self.model.native_predict is not None: + self.model.native_predict(self._state, self._covariance, dt, self.model.process_noise, self.parameters) + self._time = time + return + previous = self._state.copy() + transition_jacobian = self._jacobian(lambda value: self.model.transition(value, dt, self.parameters), previous) + predicted = self.model.transition(previous, dt, self.parameters) + projection = self._error_projection(previous) + if self.model.error_size == self.model.state_size: + error_transition = transition_jacobian + else: + error_transition = np.linalg.pinv(self._error_projection(predicted)) @ transition_jacobian @ projection + self._state = self._normalize(predicted) + self._covariance = self._stabilize(error_transition @ self._covariance @ error_transition.T + dt * self.model.process_noise) + self._time = time + + def predict_and_observe(self, time: float, kind: int, measurements: Array, noise: Array | None = None): + values = self._measurement_batch(kind, measurements) + noises = self._noise_batch(kind, len(values), noise) + event = _Event(float(time), Observation(kind, values, noises), self._order) + self._order += 1 + if not math.isnan(self._time) and event.time < self._time: + if self.max_rewind_age <= 0.0 or self._time - event.time > self.max_rewind_age: + return None + return self._rewind(event) + result = self._apply_event(event) + self._events.append(event) + self._snapshots.append(_Snapshot(self._time, self._state.copy(), self._covariance.copy())) + self._trim_history() + return result + + def _apply_event(self, event: _Event): + self.predict(event.time) + prior_state = self._state.copy() + prior_covariance = self._covariance.copy() + innovations = [] + for measurement, noise in zip(event.observation.values, event.observation.noise, strict=True): + innovations.append(self._update(event.observation.kind, measurement, noise)) + return (event.time, self.x, prior_state, self.P, prior_covariance, event.observation.kind, + tuple(innovations), event.observation.values.copy(), event.observation.noise.copy()) + + def _update(self, kind: int, measurement: Array, noise: Array) -> Array: + measurement_function = self.model.measurements.get(kind) + if measurement_function is None: + raise KeyError(f"unknown observation kind {kind}") + measurement = np.asarray(measurement, dtype=np.float64).reshape(-1) + if noise.shape != (measurement.size, measurement.size): + raise ValueError("observation noise dimension mismatch") + if self.model.native_update is not None: + innovation = self.model.native_update(self._state, self._covariance, kind, measurement, noise) + return innovation + predicted = np.asarray(measurement_function(self._state, self.parameters), dtype=np.float64).reshape(-1) + if predicted.shape != measurement.shape: + raise ValueError("measurement dimension mismatch") + innovation = measurement - predicted + state_jacobian = self._jacobian(lambda value: measurement_function(value, self.parameters), self._state) + observation_jacobian = state_jacobian @ self._error_projection(self._state) + innovation_covariance = observation_jacobian @ self._covariance @ observation_jacobian.T + noise + gain = np.linalg.solve(innovation_covariance, observation_jacobian @ self._covariance).T + delta = gain @ innovation + self._state = self._normalize(self._inject(self._state, delta)) + identity = np.eye(self.model.error_size) + residual = identity - gain @ observation_jacobian + self._covariance = self._stabilize(residual @ self._covariance @ residual.T + gain @ noise @ gain.T) + self._require_finite() + return innovation + + def _rewind(self, new_event: _Event): + events = sorted(self._events + [new_event], key=lambda event: (event.time, event.order)) + base_index = max(i for i, snapshot in enumerate(self._snapshots) if math.isnan(snapshot.time) or snapshot.time <= new_event.time) + base = self._snapshots[base_index] + retained = self._events[:base_index] + retained_orders = {event.order for event in retained} + replay = [event for event in events if event.order not in retained_orders] + self._state = base.state.copy() + self._covariance = base.covariance.copy() + self._time = base.time + self._events = retained.copy() + self._snapshots = self._snapshots[:base_index + 1] + result = None + for event in replay: + current = self._apply_event(event) + self._events.append(event) + self._snapshots.append(_Snapshot(self._time, self._state.copy(), self._covariance.copy())) + if event is new_event: + result = current + self._trim_history() + return result + + def _trim_history(self) -> None: + if self.max_rewind_age <= 0.0 or math.isnan(self._time): + return + cutoff = self._time - self.max_rewind_age + remove = 0 + while remove < len(self._events) and self._events[remove].time < cutoff: + remove += 1 + if remove: + self._events = self._events[remove:] + self._snapshots = self._snapshots[remove:] + + def _measurement_batch(self, kind: int, measurements: Array) -> Array: + measurement_function = self.model.measurements.get(kind) + if measurement_function is None: + raise KeyError(f"unknown observation kind {kind}") + if self.model.native_update is not None and kind in self.model.observation_noise: + expected = self.model.observation_noise[kind].shape[0] + else: + expected = np.asarray(measurement_function(self._state, self.parameters)).size + values = np.asarray(measurements, dtype=np.float64) + if values.ndim == 1: + values = values.reshape(1, -1) + elif values.ndim != 2: + raise ValueError("measurements must be one or two dimensional") + if values.shape[1] != expected: + raise ValueError("measurement dimension mismatch") + return values + + def _noise_batch(self, kind: int, count: int, noise: Array | None) -> Array: + if noise is None: + base = self.model.observation_noise.get(kind) + if base is None: + raise KeyError(f"missing observation noise for kind {kind}") + return np.repeat(np.asarray(base, dtype=np.float64)[None, :, :], count, axis=0) + noises = np.asarray(noise, dtype=np.float64) + if noises.ndim == 2: + noises = noises[None, :, :] + if noises.shape[0] == 1 and count > 1: + noises = np.repeat(noises, count, axis=0) + if noises.shape[0] != count: + raise ValueError("observation noise batch mismatch") + return noises + + def _jacobian(self, function: Callable[[Array], Array], value: Array) -> Array: + output = np.asarray(function(value), dtype=np.float64).reshape(-1) + result = np.empty((output.size, value.size), dtype=np.float64) + for index in range(value.size): + step = np.cbrt(np.finfo(np.float64).eps) * max(1.0, abs(value[index])) + upper = value.copy() + lower = value.copy() + upper[index] += step + lower[index] -= step + result[:, index] = (np.asarray(function(upper)).reshape(-1) - np.asarray(function(lower)).reshape(-1)) / (2.0 * step) + return result + + def _inject(self, state: Array, delta: Array) -> Array: + if self.model.inject_error is None: + return state + delta + return self.model.inject_error(state, delta) + + def _error_projection(self, state: Array) -> Array: + if self.model.error_projection is None: + return np.eye(self.model.state_size, self.model.error_size) + return np.asarray(self.model.error_projection(state), dtype=np.float64) + + def _normalize(self, state: Array) -> Array: + if self.model.normalize is None: + return np.asarray(state, dtype=np.float64).reshape(-1) + return np.asarray(self.model.normalize(state), dtype=np.float64).reshape(-1) + + def _stabilize(self, covariance: Array) -> Array: + covariance = (covariance + covariance.T) * 0.5 + eigenvalues, eigenvectors = np.linalg.eigh(covariance) + if eigenvalues[0] < -1e-10: + raise FloatingPointError("covariance is not positive semidefinite") + return (eigenvectors * np.maximum(eigenvalues, 0.0)) @ eigenvectors.T + + def _validate_state(self, state: Array, covariance: Array) -> None: + if state.shape != (self.model.state_size,): + raise ValueError("state dimension mismatch") + if covariance.shape != (self.model.error_size, self.model.error_size): + raise ValueError("covariance dimension mismatch") + if self.model.process_noise.shape != covariance.shape: + raise ValueError("process noise dimension mismatch") + if not np.isfinite(state).all() or not np.isfinite(covariance).all(): + raise ValueError("state and covariance must be finite") + + def _require_finite(self) -> None: + if not np.isfinite(self._state).all() or not np.isfinite(self._covariance).all(): + raise FloatingPointError("estimator produced non-finite values") + + +class EstimatorModel: + def __init__(self, estimator: StateEstimator): + self.filter = estimator + + @property + def x(self) -> Array: + return self.filter.x + + @property + def P(self) -> Array: + return self.filter.P + + @property + def t(self) -> float: + return self.filter.t + + def init_state(self, state: Array, covs: Array, filter_time: float | None) -> None: + self.filter.init_state(state, covs, filter_time) + + def predict(self, time: float) -> None: + self.filter.predict(time) + + def predict_and_observe(self, time: float, kind: int, measurements: Array, noise: Array | None = None): + return self.filter.predict_and_observe(time, kind, measurements, noise) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/ui/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/ui/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/feedbackd.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/feedbackd.py new file mode 100644 index 000000000..0412edd32 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/feedbackd.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +import iqpilot.cereal.messaging as messaging +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.cereal import car +from iqpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER + +FEEDBACK_MAX_DURATION = 10.0 +ButtonType = car.CarState.ButtonEvent.Type + + +def main(): + params = Params() + pm = messaging.PubMaster(['userBookmark', 'audioFeedback']) + sm = messaging.SubMaster(['rawAudioData', 'bookmarkButton']) + should_record_audio = False + block_num = 0 + waiting_for_release = False + early_stop_triggered = False + + while True: + sm.update() + should_send_bookmark = False + + if False and sm.updated['carState'] and sm['carState'].canValid and not sm['iqState'].aol.available: + for be in sm['carState'].buttonEvents: + if be.type == ButtonType.lkas: + if be.pressed: + if not should_record_audio: + if params.get_bool("RecordAudioFeedback"): + should_record_audio = True + block_num = 0 + waiting_for_release = False + early_stop_triggered = False + cloudlog.info("LKAS button pressed - starting 10-second audio feedback") + else: + should_send_bookmark = True + cloudlog.info("LKAS button pressed - bookmarking") + elif should_record_audio and not waiting_for_release: + waiting_for_release = True + elif waiting_for_release: + waiting_for_release = False + early_stop_triggered = True + cloudlog.info("LKAS button released - ending recording early") + + if should_record_audio and sm.updated['rawAudioData']: + raw_audio = sm['rawAudioData'] + msg = messaging.new_message('audioFeedback', valid=True) + msg.audioFeedback.audio.data = raw_audio.data + msg.audioFeedback.audio.sampleRate = raw_audio.sampleRate + msg.audioFeedback.blockNum = block_num + block_num += 1 + if (block_num * SAMPLE_BUFFER / SAMPLE_RATE) >= FEEDBACK_MAX_DURATION or early_stop_triggered: + should_send_bookmark = True + should_record_audio = False + early_stop_triggered = False + cloudlog.info("10-second recording completed or second button press - stopping audio feedback") + pm.send('audioFeedback', msg) + + if sm.updated['bookmarkButton']: + cloudlog.info("Bookmark button pressed!") + should_send_bookmark = True + + if should_send_bookmark: + msg = messaging.new_message('userBookmark', valid=True) + pm.send('userBookmark', msg) + + +if __name__ == '__main__': + main() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/camerad/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/camerad/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/camerad/cameras/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/camerad/cameras/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/camerad/cameras/nv12_info.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/camerad/cameras/nv12_info.py new file mode 100644 index 000000000..bcb6312d2 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/camerad/cameras/nv12_info.py @@ -0,0 +1,21 @@ +# Python version of system/camerad/cameras/nv12_info.h +# Calculations from third_party/linux/include/msm_media_info.h (VENUS_BUFFER_SIZE) + +def align(val: int, alignment: int) -> int: + return ((val + alignment - 1) // alignment) * alignment + +def get_nv12_info(width: int, height: int) -> tuple[int, int, int, int]: + """Returns (stride, y_height, uv_height, buffer_size) for NV12 frame dimensions.""" + stride = align(width, 128) + y_height = align(height, 32) + uv_height = align(height // 2, 16) + + # VENUS_BUFFER_SIZE for NV12 + y_plane = stride * y_height + uv_plane = stride * uv_height + 4096 + size = y_plane + uv_plane + max(16 * 1024, 8 * stride) + size = align(size, 4096) + size += align(width, 512) * 512 # kernel padding for non-aligned frames + size = align(size, 4096) + + return stride, y_height, uv_height, size diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/__init__.py new file mode 100644 index 000000000..1338aa2cf --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/__init__.py @@ -0,0 +1,22 @@ +import os +from typing import cast + +from iqpilot.system.hardware.base import HardwareBase +from iqpilot.system.hardware.tici.hardware import Tici +from iqpilot.system.hardware.pc.hardware import Pc + +TICI = os.path.isfile('/TICI') +AGNOS = os.path.isfile('/AGNOS') +PC = not TICI + + +if TICI: + HARDWARE = cast(HardwareBase, Tici()) +else: + HARDWARE = cast(HardwareBase, Pc()) + +# Only comma 3/3X expose the DMA-BUF EGL extensions used by the zero-copy +# camera renderer and the direct EGL frame-pacing calls. /TICI is also present +# on comma 4, so it identifies the AGNOS hardware family rather than this GPU +# capability. +EGL_DMA_BUF_SUPPORTED = TICI and HARDWARE.get_device_type() in ("tici", "tizi") diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/base.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/base.py new file mode 100644 index 000000000..217696e09 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/base.py @@ -0,0 +1,228 @@ +import os +from abc import abstractmethod, ABC +from dataclasses import dataclass, fields + +from iqpilot.cereal import log + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +class LPAError(RuntimeError): + pass + +class LPAProfileNotFoundError(LPAError): + pass + +@dataclass +class Profile: + iccid: str + nickname: str + enabled: bool + provider: str + +@dataclass +class ThermalZone: + # a zone from /sys/class/thermal/thermal_zone* + name: str # a.k.a type + scale: float = 1000. # scale to get degrees in C + zone_number = -1 + + def read(self) -> float: + if self.zone_number < 0: + for n in os.listdir("/sys/devices/virtual/thermal"): + if not n.startswith("thermal_zone"): + continue + with open(os.path.join("/sys/devices/virtual/thermal", n, "type")) as f: + if f.read().strip() == self.name: + self.zone_number = int(n.removeprefix("thermal_zone")) + break + + try: + with open(f"/sys/devices/virtual/thermal/thermal_zone{self.zone_number}/temp") as f: + return int(f.read()) / self.scale + except FileNotFoundError: + return 0 + +@dataclass +class ThermalConfig: + cpu: list[ThermalZone] | None = None + gpu: list[ThermalZone] | None = None + dsp: ThermalZone | None = None + pmic: list[ThermalZone] | None = None + memory: ThermalZone | None = None + intake: ThermalZone | None = None + exhaust: ThermalZone | None = None + case: ThermalZone | None = None + + def get_msg(self): + ret = {} + for f in fields(ThermalConfig): + v = getattr(self, f.name) + if v is not None: + if isinstance(v, list): + ret[f.name + "TempC"] = [x.read() for x in v] + else: + ret[f.name + "TempC"] = v.read() + return ret + +class LPABase(ABC): + @abstractmethod + def list_profiles(self) -> list[Profile]: + pass + + @abstractmethod + def get_active_profile(self) -> Profile | None: + pass + + @abstractmethod + def delete_profile(self, iccid: str) -> None: + pass + + @abstractmethod + def bootstrap(self) -> None: + pass + + @abstractmethod + def download_profile(self, qr: str, nickname: str | None = None) -> None: + pass + + @abstractmethod + def nickname_profile(self, iccid: str, nickname: str) -> None: + pass + + @abstractmethod + def switch_profile(self, iccid: str) -> None: + pass + + def is_comma_profile(self, iccid: str) -> bool: + return any(iccid.startswith(prefix) for prefix in ('8985235',)) + +class HardwareBase(ABC): + @staticmethod + def get_cmdline() -> dict[str, str]: + with open('/proc/cmdline') as f: + cmdline = f.read() + return {kv[0]: kv[1] for kv in [s.split('=') for s in cmdline.split(' ')] if len(kv) == 2} + + @staticmethod + def read_param_file(path, parser, default=0): + try: + with open(path) as f: + return parser(f.read()) + except Exception: + return default + + def booted(self) -> bool: + return True + + def reboot(self, reason=None): + print("REBOOT!") + + def uninstall(self): + print("uninstall") + + def get_os_version(self): + return None + + @abstractmethod + def get_device_type(self): + pass + + def get_imei(self, slot) -> str: + return "" + + def get_serial(self): + return "" + + def get_network_info(self): + return None + + def get_network_type(self): + return NetworkType.none + + def get_sim_info(self): + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + + def get_sim_lpa(self) -> LPABase: + raise NotImplementedError("SIM LPA not available") + + def get_network_strength(self, network_type): + return NetworkStrength.unknown + + def get_network_metered(self, network_type) -> bool: + return network_type not in (NetworkType.none, NetworkType.wifi, NetworkType.ethernet) + + def get_current_power_draw(self): + return 0 + + def get_som_power_draw(self): + return 0 + + def shutdown(self): + print("SHUTDOWN!") + + def get_thermal_config(self): + return ThermalConfig() + + def set_display_power(self, on: bool): + pass + + def set_screen_brightness(self, percentage): + pass + + def get_screen_brightness(self): + return 0 + + def set_power_save(self, powersave_enabled): + pass + + def get_gpu_usage_percent(self): + return 0 + + def get_modem_version(self): + return None + + def get_modem_temperatures(self): + return [] + + def initialize_hardware(self): + pass + + def configure_modem(self): + pass + + def reboot_modem(self): + pass + + def recover_sim_detection(self) -> bool: + return False + + def get_networks(self): + return None + + def has_internal_panda(self) -> bool: + return False + + def reset_internal_panda(self): + pass + + def recover_internal_panda(self): + pass + + def get_modem_data_usage(self): + return -1, -1 + + def get_voltage(self) -> float: + return 0. + + def get_current(self) -> float: + return 0. + + def set_ir_power(self, percent: int): + pass diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/hw.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/hw.py new file mode 100644 index 000000000..7263ddbfc --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/hw.py @@ -0,0 +1,137 @@ +import os +import platform +from pathlib import Path + +from iqpilot.system.hardware import PC + +DEFAULT_DOWNLOAD_CACHE_ROOT = "/tmp/comma_download_cache" + +class Paths: + _persist_root_cache: str | None = None + + @staticmethod + def _is_writable_persist_root(path: str) -> bool: + try: + os.makedirs(path, exist_ok=True) + comma_dir = os.path.join(path, "comma") + os.makedirs(comma_dir, exist_ok=True) + + probe_path = os.path.join(comma_dir, ".rw_probe") + with open(probe_path, "w") as f: + f.write("1") + os.remove(probe_path) + return True + except OSError: + return False + + @staticmethod + def comma_home() -> str: + return os.path.join(str(Path.home()), ".comma" + os.environ.get("OPENPILOT_PREFIX", "")) + + @staticmethod + def params() -> str: + if os.environ.get("PARAMS_ROOT"): + return os.environ["PARAMS_ROOT"] + return os.path.join(Paths.comma_home(), "params") if PC else "/data/params" + + @staticmethod + def log_root() -> str: + if os.environ.get('LOG_ROOT', False): + return os.environ['LOG_ROOT'] + elif PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "realdata") + else: + return '/data/media/0/realdata/' + + @staticmethod + def log_root_external() -> str: + return '/mnt/external_realdata/' + + @staticmethod + def swaglog_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "log") + else: + return "/data/log/" + + @staticmethod + def swaglog_ipc() -> str: + return "ipc:///tmp/logmessage" + os.environ.get("OPENPILOT_PREFIX", "") + + @staticmethod + def download_cache_root() -> str: + if os.environ.get('COMMA_CACHE', False): + return os.environ['COMMA_CACHE'] + "/" + return DEFAULT_DOWNLOAD_CACHE_ROOT + os.environ.get("OPENPILOT_PREFIX", "") + "/" + + @staticmethod + def persist_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "persist") + + if Paths._persist_root_cache is not None: + return Paths._persist_root_cache + + for candidate in ("/persist", "/data/persist"): + if Paths._is_writable_persist_root(candidate): + Paths._persist_root_cache = candidate + return candidate + + # Keep previous behavior as a last resort. + Paths._persist_root_cache = "/persist" + return Paths._persist_root_cache + + @staticmethod + def stats_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats/" + + @staticmethod + def stats_iq_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats_iq/" + + @staticmethod + def config_root() -> str: + if PC: + return Paths.comma_home() + else: + return "/tmp/.comma" + + @staticmethod + def shm_path() -> str: + if PC and platform.system() == "Darwin": + return "/tmp" # This is not really shared memory on macOS, but it's the closest we can get + return "/dev/shm" + + @staticmethod + def model_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "models") + else: + return "/data/media/0/models" + + @staticmethod + def crash_log_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "community" / "crashes") + else: + return "/data/community/crashes" + + @staticmethod + def mapd_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "osm") + else: + return "/data/media/0/osm" + + @staticmethod + def screen_recordings_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "screen_recordings") + else: + return "/data/media/0/screen_recordings" diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py new file mode 100644 index 000000000..72ef2f235 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py @@ -0,0 +1,12 @@ +from iqpilot.cereal import log +from iqpilot.system.hardware.base import HardwareBase + +NetworkType = log.DeviceState.NetworkType + + +class Pc(HardwareBase): + def get_device_type(self): + return "pc" + + def get_network_type(self): + return NetworkType.wifi diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py new file mode 100644 index 000000000..48a34ea48 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +import time +from collections import namedtuple + +from iqpilot.common.i2c import SMBus + +# https://datasheets.maximintegrated.com/en/ds/MAX98089.pdf + +AmpConfig = namedtuple('AmpConfig', ['name', 'value', 'register', 'offset', 'mask']) +EQParams = namedtuple('EQParams', ['K', 'k1', 'k2', 'c1', 'c2']) + + +def configs_from_eq_params(base, eq_params): + return [ + AmpConfig("K (high)", (eq_params.K >> 8), base, 0, 0xFF), + AmpConfig("K (low)", (eq_params.K & 0xFF), base + 1, 0, 0xFF), + AmpConfig("k1 (high)", (eq_params.k1 >> 8), base + 2, 0, 0xFF), + AmpConfig("k1 (low)", (eq_params.k1 & 0xFF), base + 3, 0, 0xFF), + AmpConfig("k2 (high)", (eq_params.k2 >> 8), base + 4, 0, 0xFF), + AmpConfig("k2 (low)", (eq_params.k2 & 0xFF), base + 5, 0, 0xFF), + AmpConfig("c1 (high)", (eq_params.c1 >> 8), base + 6, 0, 0xFF), + AmpConfig("c1 (low)", (eq_params.c1 & 0xFF), base + 7, 0, 0xFF), + AmpConfig("c2 (high)", (eq_params.c2 >> 8), base + 8, 0, 0xFF), + AmpConfig("c2 (low)", (eq_params.c2 & 0xFF), base + 9, 0, 0xFF), + ] + + +BASE_CONFIG = [ + AmpConfig("MCLK prescaler", 0b01, 0x10, 4, 0b00110000), + AmpConfig("PM: enable speakers", 0b11, 0x4D, 4, 0b00110000), + AmpConfig("PM: enable DACs", 0b11, 0x4D, 0, 0b00000011), + AmpConfig("Enable PLL1", 0b1, 0x12, 7, 0b10000000), + AmpConfig("Enable PLL2", 0b1, 0x1A, 7, 0b10000000), + AmpConfig("DAI1: I2S mode", 0b00100, 0x14, 2, 0b01111100), + AmpConfig("DAI2: I2S mode", 0b00100, 0x1C, 2, 0b01111100), + AmpConfig("DAI1 Passband filtering: music mode", 0b1, 0x18, 7, 0b10000000), + AmpConfig("DAI1 voice mode gain (DV1G)", 0b00, 0x2F, 4, 0b00110000), + AmpConfig("DAI1 attenuation (DV1)", 0x0, 0x2F, 0, 0b00001111), + AmpConfig("DAI2 attenuation (DV2)", 0x0, 0x31, 0, 0b00001111), + AmpConfig("DAI2: DC blocking", 0b1, 0x20, 0, 0b00000001), + AmpConfig("DAI2: High sample rate", 0b0, 0x20, 3, 0b00001000), + AmpConfig("ALC enable", 0b1, 0x43, 7, 0b10000000), + AmpConfig("ALC/excursion limiter release time", 0b101, 0x43, 4, 0b01110000), + AmpConfig("ALC multiband enable", 0b1, 0x43, 3, 0b00001000), + AmpConfig("DAI1 EQ enable", 0b0, 0x49, 0, 0b00000001), + AmpConfig("DAI2 EQ clip detection disabled", 0b1, 0x32, 4, 0b00010000), + AmpConfig("DAI2 EQ attenuation", 0x5, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b100, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter lower corner freq", 0b00, 0x41, 0, 0b00000011), + AmpConfig("Excursion limiter threshold", 0b000, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x6, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b0, 0x46, 0, 0b00000001), + AmpConfig("Right DAC input mixer: DAI1 left", 0b0, 0x22, 3, 0b00001000), + AmpConfig("Right DAC input mixer: DAI1 right", 0b0, 0x22, 2, 0b00000100), + AmpConfig("Right DAC input mixer: DAI2 left", 0b1, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b0, 0x22, 0, 0b00000001), + AmpConfig("DAI1 audio port selector", 0b10, 0x16, 6, 0b11000000), + AmpConfig("DAI2 audio port selector", 0b01, 0x1E, 6, 0b11000000), + AmpConfig("Enable left digital microphone", 0b1, 0x48, 5, 0b00100000), + AmpConfig("Enable right digital microphone", 0b1, 0x48, 4, 0b00010000), + AmpConfig("Enhanced volume smoothing disabled", 0b0, 0x49, 7, 0b10000000), + AmpConfig("Volume adjustment smoothing disabled", 0b0, 0x49, 6, 0b01000000), + AmpConfig("Zero-crossing detection disabled", 0b0, 0x49, 5, 0b00100000), +] + +CONFIGS = { + "tici": [ + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Right speaker output volume", 0x1c, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b1, 0x49, 1, 0b00000010), + *configs_from_eq_params(0x84, EQParams(0x274F, 0xC0FF, 0x3BF9, 0x0B3C, 0x1656)), + *configs_from_eq_params(0x8E, EQParams(0x1009, 0xC6BF, 0x2952, 0x1C97, 0x30DF)), + *configs_from_eq_params(0x98, EQParams(0x0F75, 0xCBE5, 0x0ED2, 0x2528, 0x3E42)), + *configs_from_eq_params(0xA2, EQParams(0x091F, 0x3D4C, 0xCE11, 0x1266, 0x2807)), + *configs_from_eq_params(0xAC, EQParams(0x0A9E, 0x3F20, 0xE573, 0x0A8B, 0x3A3B)), + ], + "tizi": [ + AmpConfig("Left speaker output from left DAC", 0b1, 0x2B, 0, 0b11111111), + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Left Speaker Mixer Gain", 0b00, 0x2D, 0, 0b00000011), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Left speaker output volume", 0x17, 0x3D, 0, 0b00011111), + AmpConfig("Right speaker output volume", 0x17, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b0, 0x49, 1, 0b00000010), + AmpConfig("DAI2: DC blocking", 0b0, 0x20, 0, 0b00000001), + AmpConfig("ALC enable", 0b0, 0x43, 7, 0b10000000), + AmpConfig("DAI2 EQ attenuation", 0x2, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b001, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter threshold", 0b100, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x0, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b1, 0x46, 0, 0b00000001), + AmpConfig("Left DAC input mixer: DAI1 left", 0b0, 0x22, 7, 0b10000000), + AmpConfig("Left DAC input mixer: DAI1 right", 0b0, 0x22, 6, 0b01000000), + AmpConfig("Left DAC input mixer: DAI2 left", 0b1, 0x22, 5, 0b00100000), + AmpConfig("Left DAC input mixer: DAI2 right", 0b0, 0x22, 4, 0b00010000), + AmpConfig("Right DAC input mixer: DAI2 left", 0b0, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b1, 0x22, 0, 0b00000001), + AmpConfig("Volume adjustment smoothing disabled", 0b1, 0x49, 6, 0b01000000), + ], +} + + +class Amplifier: + AMP_I2C_BUS = 0 + AMP_ADDRESS = 0x10 + + def __init__(self, debug=False): + self.debug = debug + + def _get_shutdown_config(self, amp_disabled: bool) -> AmpConfig: + return AmpConfig("Global shutdown", 0b0 if amp_disabled else 0b1, 0x51, 7, 0b10000000) + + def _set_configs(self, configs: list[AmpConfig]) -> None: + with SMBus(self.AMP_I2C_BUS) as bus: + for config in configs: + if self.debug: + print(f"Setting \"{config.name}\" to {config.value}:") + + old_value = bus.read_byte_data(self.AMP_ADDRESS, config.register, force=True) + new_value = (old_value & (~config.mask)) | ((config.value << config.offset) & config.mask) + bus.write_byte_data(self.AMP_ADDRESS, config.register, new_value, force=True) + + if self.debug: + print(f" Changed {hex(config.register)}: {hex(old_value)} -> {hex(new_value)}") + + def set_configs(self, configs: list[AmpConfig]) -> bool: + tries = 15 + backoff = 0. + for i in range(tries): + try: + self._set_configs(configs) + return True + except OSError: + backoff += 0.1 + time.sleep(backoff) + print(f"Failed to set amp config, {tries - i - 1} retries left") + return False + + def set_global_shutdown(self, amp_disabled: bool) -> bool: + return self.set_configs([self._get_shutdown_config(amp_disabled), ]) + + def initialize_configuration(self, model: str) -> bool: + cfgs = [ + self._get_shutdown_config(True), + *BASE_CONFIG, + *CONFIGS[model], + self._get_shutdown_config(False), + ] + return self.set_configs(cfgs) + + +if __name__ == "__main__": + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + model = model.split('comma ')[-1] + + amp = Amplifier() + amp.initialize_configuration(model) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py new file mode 100644 index 000000000..b9fa7fbff --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py @@ -0,0 +1,740 @@ +import math +import os +import sys +import subprocess +import time +import tempfile +from enum import IntEnum +from functools import cached_property, lru_cache +from pathlib import Path + +from iqpilot.cereal import log +from iqpilot.common.utils import sudo_read, sudo_write +from iqpilot.common.gpio import gpio_set, gpio_init, get_irqs_for_action +from iqpilot.system.hardware.base import HardwareBase, LPABase, ThermalConfig, ThermalZone +from iqpilot.system.hardware.tici import iwlist +from iqpilot.system.hardware.tici.lpa import TiciLPA +from iqpilot.system.hardware.tici.pins import GPIO +from iqpilot.system.hardware.tici.amplifier import Amplifier + +NM = 'org.freedesktop.NetworkManager' +NM_CON_ACT = NM + '.Connection.Active' +NM_DEV = NM + '.Device' +NM_DEV_WL = NM + '.Device.Wireless' +NM_DEV_STATS = NM + '.Device.Statistics' +NM_AP = NM + '.AccessPoint' +DBUS_PROPS = 'org.freedesktop.DBus.Properties' + +MM = 'org.freedesktop.ModemManager1' +MM_MODEM = MM + ".Modem" +MM_MODEM_SIMPLE = MM + ".Modem.Simple" +MM_SIM = MM + ".Sim" + +class MM_MODEM_STATE(IntEnum): + FAILED = -1 + UNKNOWN = 0 + INITIALIZING = 1 + LOCKED = 2 + DISABLED = 3 + DISABLING = 4 + ENABLING = 5 + ENABLED = 6 + SEARCHING = 7 + REGISTERED = 8 + DISCONNECTING = 9 + CONNECTING = 10 + CONNECTED = 11 + +class NMActiveConnectionState(IntEnum): + UNKNOWN = 0 + ACTIVATING = 1 + ACTIVATED = 2 + DEACTIVATING = 3 + DEACTIVATED = 4 + +class NMMetered(IntEnum): + NM_METERED_UNKNOWN = 0 + NM_METERED_YES = 1 + NM_METERED_NO = 2 + NM_METERED_GUESS_YES = 3 + NM_METERED_GUESS_NO = 4 + +TIMEOUT = 0.1 +REFRESH_RATE_MS = 1000 + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +# https://developer.gnome.org/ModemManager/unstable/ModemManager-Flags-and-Enumerations.html#MMModemAccessTechnology +MM_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5 +MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14 + +# MMModemStateFailedReason +MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2 + + +def affine_irq(val, action): + irqs = get_irqs_for_action(action) + if len(irqs) == 0: + return + + for i in irqs: + sudo_write(str(val), f"/proc/irq/{i}/smp_affinity_list") + +@lru_cache +def get_device_type(): + # lru_cache and cache can cause memory leaks when used in classes + try: + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + except FileNotFoundError: + # off-device (e.g. the prebuilt build container fakes /TICI but has no + # devicetree); import must not crash. Not a real device type. + return "unknown" + return model.split('comma ')[-1] + +class Tici(HardwareBase): + @staticmethod + def _ensure_system_python_path() -> None: + system_site = "/usr/lib/python3/dist-packages" + if system_site not in sys.path and os.path.isdir(system_site): + sys.path.append(system_site) + + @staticmethod + def _run_direct_modem_command(command: str) -> None: + import serial + + last_error: Exception | None = None + for device in ("/dev/ttyUSB2", "/dev/ttyUSB3"): + if not os.path.exists(device): + continue + + try: + with serial.Serial(device, baudrate=9600, timeout=2) as modem: + modem.reset_input_buffer() + modem.write((command + "\r").encode("ascii")) + + deadline = time.monotonic() + 3.0 + while time.monotonic() < deadline: + line = modem.readline().decode(errors="ignore").strip() + if not line: + continue + if line == "OK": + return + if line == "ERROR" or "ERROR" in line: + raise RuntimeError(f"{device}: {line}") + raise TimeoutError(f"{device}: timed out waiting for modem response") + except Exception as e: + last_error = e + + if last_error is not None: + raise last_error + raise RuntimeError("No modem AT port available") + + @cached_property + def bus(self): + try: + import dbus + except ModuleNotFoundError: + self._ensure_system_python_path() + import dbus + return dbus.SystemBus() + + @cached_property + def nm(self): + return self.bus.get_object(NM, '/org/freedesktop/NetworkManager') + + @property # this should not be cached, in case the modemmanager restarts + def mm(self): + return self.bus.get_object(MM, '/org/freedesktop/ModemManager1') + + @cached_property + def amplifier(self): + if self.get_device_type() == "mici": + return None + if os.path.exists('/tmp/lite_hw') or os.environ.get('LITE') == '1': + return None + return Amplifier() + + def get_os_version(self): + with open("/VERSION") as f: + return f.read().strip() + + def get_device_type(self): + return get_device_type() + + def reboot(self, reason=None): + subprocess.check_output(["sudo", "reboot"]) + + def uninstall(self): + Path("/data/__system_reset__").touch() + os.sync() + self.reboot() + + def get_serial(self): + return self.get_cmdline()['androidboot.serialno'] + + def get_voltage(self): + with open("/sys/class/hwmon/hwmon1/in1_input") as f: + return int(f.read()) + + def get_current(self): + with open("/sys/class/hwmon/hwmon1/curr1_input") as f: + return int(f.read()) + + def set_ir_power(self, percent: int): + if self.get_device_type() in ("tici", "tizi"): + return + + value = int((percent / 100) * 300) + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write("0\n") + with open("/sys/class/leds/led:torch_2/brightness", "w") as f: + f.write(f"{value}\n") + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write(f"{value}\n") + + def get_network_type(self): + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_type = primary_connection.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if primary_type == '802-3-ethernet': + return NetworkType.ethernet + elif primary_type == '802-11-wireless': + return NetworkType.wifi + else: + active_connections = self.nm.Get(NM, 'ActiveConnections', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + for conn in active_connections: + c = self.bus.get_object(NM, conn) + tp = c.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if tp == 'gsm': + modem = self.get_modem() + modem_state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if modem_state < MM_MODEM_STATE.REGISTERED: + return NetworkType.none + access_t = modem.Get(MM_MODEM, 'AccessTechnologies', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if access_t >= MM_MODEM_ACCESS_TECHNOLOGY_LTE: + return NetworkType.cell4G + elif access_t >= MM_MODEM_ACCESS_TECHNOLOGY_UMTS: + return NetworkType.cell3G + else: + return NetworkType.cell2G + except Exception: + pass + + return NetworkType.none + + def get_modem(self): + objects = self.mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=TIMEOUT) + if not objects: + raise RuntimeError("ModemManager returned no modems") + modem_path = next(iter(objects)) + return self.bus.get_object(MM, modem_path) + + def get_wlan(self): + wlan_path = self.nm.GetDeviceByIpIface('wlan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wlan_path) + + def get_wwan(self): + wwan_path = self.nm.GetDeviceByIpIface('wwan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wwan_path) + + def get_sim_info(self): + modem = self.get_modem() + sim_path = modem.Get(MM_MODEM, 'Sim', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if sim_path == "/": + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + else: + sim = self.bus.get_object(MM, sim_path) + return { + 'sim_id': str(sim.Get(MM_SIM, 'SimIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'mcc_mnc': str(sim.Get(MM_SIM, 'OperatorIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'network_type': ["Unknown"], + 'sim_state': ["READY"], + 'data_connected': modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) == MM_MODEM_STATE.CONNECTED, + } + + def get_sim_lpa(self) -> LPABase: + return TiciLPA() + + def get_imei(self, slot): + if slot != 0: + return "" + + return str(self.get_modem().Get(MM_MODEM, 'EquipmentIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + + def get_network_info(self): + if self.get_device_type() == "mici": + return None + try: + modem = self.get_modem() + info = modem.Command("AT+QNWINFO", math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + extra = modem.Command('AT+QENG="servingcell"', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + if info and info.startswith('+QNWINFO: '): + info = info.replace('+QNWINFO: ', '').replace('"', '').split(',') + extra = "" if extra is None else extra.replace('+QENG: "servingcell",', '').replace('"', '') + state = "" if state is None else MM_MODEM_STATE(state).name + + if len(info) != 4: + return None + + technology, operator, band, channel = info + + return({ + 'technology': technology, + 'operator': operator, + 'band': band, + 'channel': int(channel), + 'extra': extra, + 'state': state, + }) + else: + return None + + def parse_strength(self, percentage): + if percentage < 25: + return NetworkStrength.poor + elif percentage < 50: + return NetworkStrength.moderate + elif percentage < 75: + return NetworkStrength.good + else: + return NetworkStrength.great + + def get_network_strength(self, network_type): + network_strength = NetworkStrength.unknown + + try: + if network_type == NetworkType.none: + pass + elif network_type == NetworkType.wifi: + wlan = self.get_wlan() + active_ap_path = wlan.Get(NM_DEV_WL, 'ActiveAccessPoint', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if active_ap_path != "/": + active_ap = self.bus.get_object(NM, active_ap_path) + strength = int(active_ap.Get(NM_AP, 'Strength', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + network_strength = self.parse_strength(strength) + else: # Cellular + modem = self.get_modem() + strength = int(modem.Get(MM_MODEM, 'SignalQuality', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)[0]) + network_strength = self.parse_strength(strength) + except Exception: + pass + + return network_strength + + def get_network_metered(self, network_type) -> bool: + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_devices = primary_connection.Get(NM_CON_ACT, 'Devices', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + for dev in primary_devices: + dev_obj = self.bus.get_object(NM, str(dev)) + metered_prop = dev_obj.Get(NM_DEV, 'Metered', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if network_type == NetworkType.wifi: + if metered_prop in [NMMetered.NM_METERED_YES, NMMetered.NM_METERED_GUESS_YES]: + return True + elif network_type in [NetworkType.cell2G, NetworkType.cell3G, NetworkType.cell4G, NetworkType.cell5G]: + if metered_prop == NMMetered.NM_METERED_NO: + return False + except Exception: + pass + + return super().get_network_metered(network_type) + + def get_modem_version(self): + try: + modem = self.get_modem() + return modem.Get(MM_MODEM, 'Revision', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + def get_modem_temperatures(self): + timeout = 0.2 # Default timeout is too short + try: + modem = self.get_modem() + temps = modem.Command("AT+QTEMP", math.ceil(timeout), dbus_interface=MM_MODEM, timeout=timeout) + return list(filter(lambda t: t != 255, map(int, temps.split(' ')[1].split(',')))) + except Exception: + return [] + + + def get_current_power_draw(self): + return (self.read_param_file("/sys/class/hwmon/hwmon1/power1_input", int) / 1e6) + + def get_som_power_draw(self): + return (self.read_param_file("/sys/class/power_supply/bms/voltage_now", int) * self.read_param_file("/sys/class/power_supply/bms/current_now", int) / 1e12) + + def shutdown(self): + os.system("sudo poweroff") + + def get_thermal_config(self): + intake, exhaust, case = None, None, None + if self.get_device_type() == "mici": + case = ThermalZone("case") + intake = ThermalZone("intake") + exhaust = ThermalZone("exhaust") + return ThermalConfig(cpu=[ThermalZone(f"cpu{i}-silver-usr") for i in range(4)] + + [ThermalZone(f"cpu{i}-gold-usr") for i in range(4)], + gpu=[ThermalZone("gpu0-usr"), ThermalZone("gpu1-usr")], + dsp=ThermalZone("compute-hvx-usr"), + memory=ThermalZone("ddr-usr"), + pmic=[ThermalZone("pm8998_tz"), ThermalZone("pm8005_tz")], + intake=intake, + exhaust=exhaust, + case=case) + + def set_display_power(self, on): + try: + with open("/sys/class/backlight/panel0-backlight/bl_power", "w") as f: + f.write("0" if on else "4") + except Exception: + pass + + def set_screen_brightness(self, percentage): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + val = int(percentage * (max_brightness / 100.)) + with open("/sys/class/backlight/panel0-backlight/brightness", "w") as f: + f.write(str(val)) + except Exception: + pass + + def get_screen_brightness(self): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + with open("/sys/class/backlight/panel0-backlight/brightness") as f: + return int(float(f.read()) / (max_brightness / 100.)) + except Exception: + return 0 + + def set_power_save(self, powersave_enabled): + # amplifier, 100mW at idle + if self.amplifier is not None: + self.amplifier.set_global_shutdown(amp_disabled=powersave_enabled) + if not powersave_enabled: + self.amplifier.initialize_configuration(self.get_device_type()) + + # *** CPU config *** + + # offline big cluster + for i in range(4, 8): + val = '0' if powersave_enabled else '1' + sudo_write(val, f'/sys/devices/system/cpu/cpu{i}/online') + + for n in ('0', '4'): + if powersave_enabled and n == '4': + continue + gov = 'ondemand' if powersave_enabled else 'performance' + sudo_write(gov, f'/sys/devices/system/cpu/cpufreq/policy{n}/scaling_governor') + + # *** IRQ config *** + + # GPU, modeld core + affine_irq(7, "kgsl-3d0") + + # camerad core + camera_irqs = ("a5", "cci", "cpas_camnoc", "cpas-cdm", "csid", "ife", "csid-lite", "ife-lite") + for n in camera_irqs: + affine_irq(6, n) + + def get_gpu_usage_percent(self): + try: + with open('/sys/class/kgsl/kgsl-3d0/gpubusy') as f: + used, total = f.read().strip().split() + return 100.0 * int(used) / int(total) + except Exception: + return 0 + + def initialize_hardware(self): + if self.amplifier is not None: + self.amplifier.initialize_configuration(self.get_device_type()) + + # Allow hardwared to write engagement status to kmsg + os.system("sudo chmod a+w /dev/kmsg") + + # Ensure fan gpio is enabled so fan runs until shutdown, also turned on at boot by the ABL + gpio_init(GPIO.SOM_ST_IO, True) + gpio_set(GPIO.SOM_ST_IO, 1) + + # *** IRQ config *** + + # mask off big cluster from default affinity + sudo_write("f", "/proc/irq/default_smp_affinity") + + # move these off the default core + affine_irq(1, "msm_vidc") # encoders + affine_irq(1, "i2c_geni") # sensors + + # *** GPU config *** + # https://github.com/commaai/agnos-kernel-sdm845/blob/master/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi#L216 + affine_irq(5, "fts_ts") # touch + affine_irq(5, "msm_drm") # display + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/min_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/max_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_bus_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_clk_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_rail_on") + sudo_write("1000", "/sys/class/kgsl/kgsl-3d0/idle_timer") + sudo_write("performance", "/sys/class/kgsl/kgsl-3d0/devfreq/governor") + sudo_write("710", "/sys/class/kgsl/kgsl-3d0/max_clock_mhz") + + # setup governors + sudo_write("performance", "/sys/class/devfreq/soc:qcom,cpubw/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu0/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu4/governor") + + # *** VIDC (encoder) config *** + sudo_write("N", "/sys/kernel/debug/msm_vidc/clock_scaling") + sudo_write("Y", "/sys/kernel/debug/msm_vidc/disable_thermal_mitigation") + + # pandad core + affine_irq(3, "spi_geni") # SPI + if "tici" in self.get_device_type(): + affine_irq(3, "xhci-hcd:usb3") + affine_irq(3, "xhci-hcd:usb1") + try: + pid = subprocess.check_output(["pgrep", "-f", "spi0"], encoding='utf8').strip() + subprocess.call(["sudo", "chrt", "-f", "-p", "1", pid]) + subprocess.call(["sudo", "taskset", "-pc", "3", pid], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessException as e: + print(str(e)) + + def configure_modem(self): + from iqpilot.common.params import Params + + sim_info = self.get_sim_info() + sim_id = sim_info.get('sim_id', '') + params = Params() + manual_apn = params.get("GsmApn", encoding="utf-8") or "" + metered_enabled = params.get_bool("GsmMetered") + + modem = self.get_modem() + try: + manufacturer = str(modem.Get(MM_MODEM, 'Manufacturer', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + except Exception: + manufacturer = None + + cmds = [] + is_comma_profile = self.get_sim_lpa().is_comma_profile(sim_id) + roaming_enabled = params.get_bool("GsmRoaming") + initial_eps_apn = "" if is_comma_profile else manual_apn + + if not is_comma_profile and params.get("GsmRoaming") is None: + params.put_bool("GsmRoaming", True) + roaming_enabled = True + + subprocess.call([ + "nmcli", "connection", "modify", "lte", + "gsm.auto-config", "no" if manual_apn else "yes", + "gsm.apn", manual_apn, + "gsm.home-only", "no" if roaming_enabled else "yes", + "gsm.network-id", "", + "gsm.initial-eps-bearer-configure", "yes" if initial_eps_apn else "no", + "gsm.initial-eps-bearer-apn", initial_eps_apn, + "connection.metered", "unknown" if metered_enabled else "no", + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + if self.get_device_type() in ("tici", "tizi"): + if initial_eps_apn: + subprocess.call(["mmcli", "-m", "any", f'--3gpp-set-initial-eps-bearer-settings=apn={initial_eps_apn}']) + else: + subprocess.call(["mmcli", "-m", "any", '--3gpp-set-initial-eps-bearer-settings=apn=']) + + cmds += [ + # configure modem as data-centric + 'AT+QNVW=5280,0,"0102000000000000"', + 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', + 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', + ] + if self.get_device_type() == "tizi": + cmds += [ + 'AT+QSIMDET=1,0', + 'AT+QSIMSTAT=1', + ] + elif manufacturer == 'Cavli Inc.': + cmds += [ + 'AT^SIMSWAP=1', # use SIM slot, instead of internal eSIM + 'AT$QCSIMSLEEP=0', # disable SIM sleep + 'AT$QCSIMCFG=SimPowerSave,0', # more sleep disable + + # ethernet config + 'AT$QCPCFG=usbNet,0', + 'AT$QCNETDEVCTL=3,1', + ] + else: + # this modem gets upset with too many AT commands + if sim_id is None or len(sim_id) == 0: + cmds += [ + # SIM sleep disable + 'AT$QCSIMSLEEP=0', + 'AT$QCSIMCFG=SimPowerSave,0', + + # ethernet config + 'AT$QCPCFG=usbNet,1', + ] + + for cmd in cmds: + try: + modem.Command(cmd, math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + + # eSIM prime + dest = "/etc/NetworkManager/system-connections/esim.nmconnection" + if self.get_sim_lpa().is_comma_profile(sim_id) and not os.path.exists(dest): + with open(Path(__file__).parent/'esim.nmconnection') as f, tempfile.NamedTemporaryFile(mode='w') as tf: + dat = f.read() + dat = dat.replace("sim-id=", f"sim-id={sim_id}") + tf.write(dat) + tf.flush() + + # needs to be root + os.system(f"sudo cp {tf.name} {dest}") + os.system(f"sudo nmcli con load {dest}") + + def recover_sim_detection(self) -> bool: + # A worn SIM-tray presence switch can read "removed" while the SIM pads still make + # contact; with hot-swap detect armed (AT+QSIMDET=1) the modem never powers the SIM + # and lands in failed/sim-missing. Disabling detect and rebooting the modem makes it + # probe the SIM electrically. Safe to retry on failure: firing disarms the QSIMDET + # gate, so a genuinely SIM-less device gets at most one extra modem reboot per boot. + if self.get_device_type() not in ("tici", "tizi"): + return False + + try: + modem = self.get_modem() + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if state != MM_MODEM_STATE.FAILED: + return False + reason = modem.Get(MM_MODEM, 'StateFailedReason', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if reason != MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: + return False + detect = str(modem.Command('AT+QSIMDET?', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT)).strip() + if not detect.startswith('+QSIMDET: 1'): + return False + modem.Command('AT+QSIMDET=0,0', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + modem.Command('AT+CFUN=1,1', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + return True + except Exception: + return False + + def reboot_modem(self): + modem = None + try: + modem = self.get_modem() + except Exception: + pass + + if modem is not None: + for state in (0, 1): + try: + modem.Command(f'AT+CFUN={state}', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + return + + for state in (0, 1): + try: + self._run_direct_modem_command(f"AT+CFUN={state}") + except Exception: + pass + + def get_networks(self): + r = {} + + wlan = iwlist.scan() + if wlan is not None: + r['wlan'] = wlan + + lte_info = self.get_network_info() + if lte_info is not None: + extra = lte_info['extra'] + + # ,"LTE",,,,,,,, + # ,,,,,,, + if 'LTE' in extra: + extra = extra.split(',') + try: + r['lte'] = [{ + "mcc": int(extra[3]), + "mnc": int(extra[4]), + "cid": int(extra[5], 16), + "nmr": [{"pci": int(extra[6]), "earfcn": int(extra[7])}], + }] + except (ValueError, IndexError): + pass + + return r + + def get_modem_data_usage(self): + try: + wwan = self.get_wwan() + + # Ensure refresh rate is set so values don't go stale + refresh_rate = wwan.Get(NM_DEV_STATS, 'RefreshRateMs', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if refresh_rate != REFRESH_RATE_MS: + u = type(refresh_rate) + wwan.Set(NM_DEV_STATS, 'RefreshRateMs', u(REFRESH_RATE_MS), dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + tx = wwan.Get(NM_DEV_STATS, 'TxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + rx = wwan.Get(NM_DEV_STATS, 'RxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + return int(tx), int(rx) + except Exception: + return -1, -1 + + def has_internal_panda(self): + return True + + def reset_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 0) + time.sleep(1) + gpio_set(GPIO.STM_RST_N, 0) + + def recover_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 1) + time.sleep(0.5) + gpio_set(GPIO.STM_RST_N, 0) + time.sleep(0.5) + gpio_set(GPIO.STM_BOOT0, 0) + + def booted(self): + # this normally boots within 8s, but on rare occasions takes 30+s + encoder_state = sudo_read("/sys/kernel/debug/msm_vidc/core0/info") + if "Core state: 0" in encoder_state and (time.monotonic() < 60*2): + return False + return True + +if __name__ == "__main__": + t = Tici() + t.configure_modem() + t.initialize_hardware() + t.set_power_save(False) + print(t.get_sim_info()) diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py new file mode 100644 index 000000000..1e7c428b4 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py @@ -0,0 +1,35 @@ +import subprocess + + +def scan(interface="wlan0"): + result = [] + try: + r = subprocess.check_output(["iwlist", interface, "scan"], encoding='utf8') + + mac = None + for line in r.split('\n'): + if "Address" in line: + # Based on the adapter eithere a percentage or dBm is returned + # Add previous network in case no dBm signal level was seen + if mac is not None: + result.append({"mac": mac}) + mac = None + + mac = line.split(' ')[-1] + elif "dBm" in line: + try: + level = line.split('Signal level=')[1] + rss = int(level.split(' ')[0]) + result.append({"mac": mac, "rss": rss}) + mac = None + except ValueError: + continue + + # Add last network if no dBm was found + if mac is not None: + result.append({"mac": mac}) + + return result + + except Exception: + return None diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py new file mode 100644 index 000000000..a636742d5 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py @@ -0,0 +1,1482 @@ +#!/usr/bin/env python3 +# SGP.22 v2.3: https://www.gsma.com/solutions-and-impact/technologies/esim/wp-content/uploads/2021/07/SGP.22-v2.3.pdf + +import argparse +import atexit +import base64 +import hashlib +import json +import math +import os +import re +import requests +import serial +import subprocess +import sys +import time + +from collections.abc import Generator +from contextlib import contextmanager +from pathlib import Path +from typing import Literal +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.system.hardware.base import LPABase, LPAError, LPAProfileNotFoundError, Profile + +GSMA_CI_BUNDLE = str(Path(__file__).parent / 'gsma_ci_bundle.pem') + + +DEFAULT_DEVICE = "/dev/modem_at0" +DEFAULT_BAUD = 9600 +DEFAULT_TIMEOUT = 5.0 +# https://euicc-manual.osmocom.org/docs/lpa/applet-id/ +ISDR_AID = "A0000005591010FFFFFFFF8900000100" +ES10X_MSS = 120 +MM = "org.freedesktop.ModemManager1" +MM_MODEM = MM + ".Modem" + +# TLV Tags +TAG_ICCID = 0x5A +TAG_STATUS = 0x80 +TAG_EUICC_INFO = 0xBF20 +TAG_PREPARE_DOWNLOAD = 0xBF21 +TAG_PROFILE_INFO_LIST = 0xBF2D +TAG_EUICC_CHALLENGE = 0xBF2E +TAG_SET_NICKNAME = 0xBF29 +TAG_LIST_NOTIFICATION = 0xBF28 +TAG_RETRIEVE_NOTIFICATION = 0xBF2B +TAG_NOTIFICATION_METADATA = 0xBF2F +TAG_NOTIFICATION_SENT = 0xBF30 +TAG_ENABLE_PROFILE = 0xBF31 +TAG_DISABLE_PROFILE = 0xBF32 +TAG_DELETE_PROFILE = 0xBF33 +TAG_BPP = 0xBF36 +TAG_PROFILE_INSTALL_RESULT = 0xBF37 +TAG_AUTH_SERVER = 0xBF38 +TAG_CANCEL_SESSION = 0xBF41 + +STATE_LABELS = {0: "disabled", 1: "enabled", 255: "unknown"} +ICON_LABELS = {0: "jpeg", 1: "png", 255: "unknown"} +CLASS_LABELS = {0: "test", 1: "provisioning", 2: "operational", 255: "unknown"} +PROFILE_ERROR_CODES = { + 0x01: "iccidOrAidNotFound", 0x02: "profileNotInDisabledState", + 0x03: "disallowedByPolicy", 0x04: "wrongProfileReenabling", + 0x05: "catBusy", 0x06: "undefinedError", +} +AUTH_SERVER_ERROR_CODES = { + 0x01: "eUICCVerificationFailed", 0x02: "eUICCCertificateExpired", + 0x03: "eUICCCertificateRevoked", 0x05: "invalidServerSignature", + 0x06: "euiccCiPKUnknown", 0x0A: "matchingIdRefused", + 0x10: "insufficientMemory", +} +BPP_COMMAND_NAMES = { + 0: "initialiseSecureChannel", 1: "configureISDP", 2: "storeMetadata", + 3: "storeMetadata2", 4: "replaceSessionKeys", 5: "loadProfileElements", +} +BPP_ERROR_REASONS = { + 1: "incorrectInputValues", 2: "invalidSignature", 3: "invalidTransactionId", + 4: "unsupportedCrtValues", 5: "unsupportedRemoteOperationType", + 6: "unsupportedProfileClass", 7: "scp03tStructureError", 8: "scp03tSecurityError", + 9: "iccidAlreadyExistsOnEuicc", 10: "insufficientMemoryForProfile", + 11: "installInterrupted", 12: "peProcessingError", 13: "dataMismatch", + 14: "invalidNAA", +} +CANCEL_SESSION_REASON = { + 0: "endUserRejection", 1: "postponed", 2: "timeout", + 3: "pprNotAllowed", 127: "undefinedReason", +} + +ESIM_TLS_BUNDLE_ENV = "IQPILOT_ESIM_CA_BUNDLE" +ESIM_QESIM_INIT_ENV = "IQPILOT_ESIM_QESIM_INIT" +ESIM_EXCLUSIVE_MODEM_ENV = "IQPILOT_ESIM_EXCLUSIVE_MODEM" + + +def _ensure_dbus_import(): + try: + import dbus # noqa: F401 + return + except ModuleNotFoundError: + dist_packages = "/usr/lib/python3/dist-packages" + if dist_packages not in sys.path and os.path.isdir(dist_packages): + sys.path.append(dist_packages) + import dbus # noqa: F401 + + +def _tls_verify_option() -> bool | str: + # Default to the GSMA CI bundle used by the reference eSIM branch. + # Allow explicit override for local testing or forced system trust behavior. + override = os.getenv(ESIM_TLS_BUNDLE_ENV, "").strip() + if not override: + return GSMA_CI_BUNDLE + if override.lower() in ("0", "false", "off"): + return False + if override.lower() in ("1", "true", "on", "system"): + return True + return override + + +def b64e(data: bytes) -> str: + return base64.b64encode(data).decode("ascii") + + +def b64d(s: str) -> bytes: + return base64.b64decode(base64_trim(s)) + + +def _decode_apdu_response_blob(raw: str, label: str) -> bytes: + filtered = re.sub(r"[^0-9A-Fa-f]", "", raw) + if len(filtered) < 2 or len(filtered) % 2: + raise RuntimeError(f"Malformed {label} response payload") + return bytes.fromhex(filtered) + + +class AtClient: + def __init__(self, device: str, baud: int, timeout: float, verbose: bool) -> None: + self._device = device + self._baud = baud + self._timeout = timeout + self.verbose = verbose + self.channel: str | None = None + self._serial: serial.Serial | None = None + self._use_csim = False + self._has_qesim = False + self._qesim_lpa_enabled = False + try: + self._serial = serial.Serial(device, baudrate=baud, timeout=timeout) + self._disable_echo() + except (serial.SerialException, PermissionError, OSError): + self._serial = None + if self.verbose: + print(f"!! using ModemManager DBus AT transport for {device}", file=sys.stderr) + + def close(self) -> None: + try: + if self.channel: + try: + self.query(f"AT+CCHC={self.channel}") + except Exception as e: + if self.verbose: + print(f"!! ignoring channel close failure: {e}", file=sys.stderr) + finally: + self.channel = None + finally: + if self._serial is not None: + self._serial.close() + + @staticmethod + def _is_busy_open_error(error: Exception) -> bool: + text = str(error).lower() + return "errno 16" in text or "device or resource busy" in text + + def _disable_echo(self) -> None: + if self._serial is None: + return + self._serial.reset_input_buffer() + self._serial.write(b"ATE0\r") + time.sleep(0.1) + self._serial.reset_input_buffer() + + def _send(self, cmd: str) -> None: + if self.verbose: + print(f">> {cmd}", file=sys.stderr) + assert self._serial is not None + self._serial.write((cmd + "\r").encode("ascii")) + + def _expect(self) -> list[str]: + lines: list[str] = [] + while True: + assert self._serial is not None + raw = self._serial.readline() + if not raw: + raise TimeoutError("AT command timed out") + line = raw.decode(errors="ignore").strip() + if not line: + continue + if self.verbose: + print(f"<< {line}", file=sys.stderr) + if line == "OK": + return lines + if line == "ERROR": + raise RuntimeError("AT command failed") + if "ERROR" in line and line.startswith("+"): + # Catch +CME ERROR / +CMS ERROR and similar modem-specific failures. + raise RuntimeError(f"AT command failed: {line}") + lines.append(line) + + def _get_modem(self): + _ensure_dbus_import() + import dbus + + bus = dbus.SystemBus() + mm = bus.get_object(MM, '/org/freedesktop/ModemManager1') + objects = mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=self._timeout) + modem_paths = [path for path in objects.keys() if "/Modem/" in str(path)] + if not modem_paths: + raise RuntimeError("ModemManager returned no modems") + return bus.get_object(MM, modem_paths[0]) + + def _dbus_query(self, cmd: str) -> list[str]: + if self.verbose: + print(f"DBUS >> {cmd}", file=sys.stderr) + try: + result = str(self._get_modem().Command(cmd, math.ceil(self._timeout), dbus_interface=MM_MODEM, timeout=self._timeout)) + except Exception as e: + raise RuntimeError(f"AT command failed: {e}") from e + lines = [line.strip() for line in result.splitlines() if line.strip()] + if self.verbose: + for line in lines: + print(f"DBUS << {line}", file=sys.stderr) + return lines + + def _reconnect_serial(self) -> None: + self.channel = None + try: + if self._serial is not None: + self._serial.close() + except Exception: + pass + self._serial = serial.Serial(self._device, baudrate=self._baud, timeout=self._timeout) + self._disable_echo() + + def query(self, cmd: str) -> list[str]: + if self._serial is None: + return self._dbus_query(cmd) + try: + self._send(cmd) + return self._expect() + except (OSError, serial.SerialException) as e: + try: + self._reconnect_serial() + self._send(cmd) + return self._expect() + except Exception: + raise RuntimeError(f"AT transport error ({cmd}): {e}") from e + except TimeoutError as e: + raise TimeoutError(f"AT command timed out ({cmd})") from e + except RuntimeError as e: + raise RuntimeError(f"AT command failed ({cmd}): {e}") from e + + def _supports_qesim(self) -> bool: + try: + lines = self.query("AT+QESIM=?") + except Exception: + return False + return any(line.startswith("+QESIM:") for line in lines) + + def _set_quectel_lpa_mode(self) -> None: + self._has_qesim = self._supports_qesim() + self._qesim_lpa_enabled = False + if not self._has_qesim: + return + + # Some Quectel firmwares require enabling internal LPA mode before + # ISO7816 channel open commands (CCHO/CGLA) will succeed. + lpa_enable_cmds = ( + 'AT+QESIM="lpa_enable",1', + 'AT+QESIM="lpa_enable"', + ) + for cmd in lpa_enable_cmds: + try: + self.query(cmd) + self._qesim_lpa_enabled = True + break + except Exception: + continue + + # Keep BIP auth enabled when supported; this is needed by some firmware + # revisions for profile download/auth paths. + try: + lines = self.query('AT+QCFG="bip/auth"?') + needs_enable = any('"bip/auth",0' in line for line in lines) + if needs_enable: + self.query('AT+QCFG="bip/auth",1') + except Exception: + pass + + def ensure_capabilities(self) -> None: + if self._serial is None: + return + + # Some modem firmwares reject command test forms (e.g. AT+CCHO=?) + # while still supporting real execution. Keep these probes non-fatal. + self.query("AT") + # Keep IQ-specific QESIM initialization opt-in for debugging only. + # Default behavior should match upstream greatgitsby/esim transport flow. + if os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + try: + self.query("AT+CMEE=2") + except Exception: + pass + self._set_quectel_lpa_mode() + for command in ("AT+CCHO", "AT+CCHC", "AT+CGLA", "AT+CSIM"): + try: + self.query(f"{command}=?") + except Exception as e: + if self.verbose: + print(f"!! capability probe failed for {command}: {e}", file=sys.stderr) + + def open_isdr(self) -> None: + try: + self.query(f'AT+CCHC=1') + except Exception: + pass + ccho_candidates = [ + f'AT+CCHO="{ISDR_AID}"', + f"AT+CCHO={ISDR_AID}", + ] + for cmd in ccho_candidates: + try: + lines = self.query(cmd) + except Exception: + continue + for line in lines: + if line.startswith("+CCHO:") and (ch := line.split(":", 1)[1].strip()): + self.channel = ch + return + + # Fallback for modems that reject CCHO but allow APDUs over basic channel. + self.channel = "0" + aid_len = len(ISDR_AID) // 2 + select_isdr = bytes.fromhex(f"00A40400{aid_len:02X}{ISDR_AID}") + try: + _, sw1, sw2 = self.send_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + return + raise RuntimeError(f"ISD-R SELECT failed on basic channel SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + # Final fallback for modems that only support APDU via CSIM. + try: + _, sw1, sw2 = self._send_csim_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + self._use_csim = True + self.channel = "csim" + if self.verbose: + print("!! using CSIM APDU transport fallback", file=sys.stderr) + return + raise RuntimeError(f"ISD-R SELECT failed on CSIM SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + if self._has_qesim and not self._qesim_lpa_enabled and os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + raise RuntimeError( + "Modem exposes AT+QESIM but rejects LPA enable and ISD-R access; " + "this firmware/SKU likely does not provide usable eSIM functionality" + ) + raise RuntimeError("Failed to access eUICC ISD-R (CCHO/CGLA/CSIM all failed)") + + def send_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + for attempt in range(3): + try: + if not self.channel: + self.open_isdr() + if self._use_csim: + return self._send_csim_apdu(apdu) + hex_payload = apdu.hex().upper() + cmd = f'AT+CGLA={self.channel},{len(hex_payload)},"{hex_payload}"' + for query_attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CGLA:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CGLA") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if query_attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CGLA response") + except RuntimeError: + self.channel = None + self._use_csim = False + if attempt == 2: + raise + time.sleep(1 + attempt) + raise RuntimeError("send_apdu failed") + + def _send_csim_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + hex_payload = apdu.hex().upper() + cmd = f'AT+CSIM={len(hex_payload)},"{hex_payload}"' + for attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CSIM:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CSIM") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CSIM response") + + +# --- TLV utilities --- + +def iter_tlv(data: bytes, with_positions: bool = False) -> Generator: + idx, length = 0, len(data) + while idx < length: + start_pos = idx + tag = data[idx] + idx += 1 + if tag & 0x1F == 0x1F: # Multi-byte tag + tag_value = tag + while idx < length: + next_byte = data[idx] + idx += 1 + tag_value = (tag_value << 8) | next_byte + if not (next_byte & 0x80): + break + else: + tag_value = tag + if idx >= length: + break + size = data[idx] + idx += 1 + if size & 0x80: # Multi-byte length + num_bytes = size & 0x7F + if idx + num_bytes > length: + break + size = int.from_bytes(data[idx : idx + num_bytes], "big") + idx += num_bytes + if idx + size > length: + break + value = data[idx : idx + size] + idx += size + yield (tag_value, value, start_pos, idx) if with_positions else (tag_value, value) + + +def find_tag(data: bytes, target: int) -> bytes | None: + return next((v for t, v in iter_tlv(data) if t == target), None) + + +def encode_tlv(tag: int, value: bytes) -> bytes: + tag_bytes = bytes([(tag >> 8) & 0xFF, tag & 0xFF]) if tag > 255 else bytes([tag]) + vlen = len(value) + if vlen <= 127: + return tag_bytes + bytes([vlen]) + value + length_bytes = vlen.to_bytes((vlen.bit_length() + 7) // 8, "big") + return tag_bytes + bytes([0x80 | len(length_bytes)]) + length_bytes + value + + +def tbcd_to_string(raw: bytes) -> str: + return "".join(str(n) for b in raw for n in (b & 0x0F, b >> 4) if n <= 9) + + +def string_to_tbcd(s: str) -> bytes: + digits = [int(c) for c in s if c.isdigit()] + return bytes(digits[i] | ((digits[i + 1] if i + 1 < len(digits) else 0xF) << 4) for i in range(0, len(digits), 2)) + + +def base64_trim(s: str) -> str: + return "".join(c for c in s if c not in "\n\r \t") + + +# --- Shared helpers --- + +def _int_bytes(n: int) -> bytes: + """Encode a positive integer as minimal big-endian bytes (at least 1 byte).""" + return n.to_bytes((n.bit_length() + 7) // 8 or 1, "big") + + +def _extract_status(response: bytes, tag: int, name: str) -> int: + """Extract the status byte from a tagged ES10x response.""" + root = find_tag(response, tag) + if root is None: + raise RuntimeError(f"Missing {name}Response") + status = find_tag(root, TAG_STATUS) + if status is None: + raise RuntimeError(f"Missing status in {name}Response") + return status[0] + + +# Profile field decoders: TLV tag -> (field_name, decoder) +_PROFILE_FIELDS = { + TAG_ICCID: ("iccid", tbcd_to_string), + 0x4F: ("isdpAid", lambda v: v.hex().upper()), + 0x9F70: ("profileState", lambda v: STATE_LABELS.get(v[0], "unknown")), + 0x90: ("profileNickname", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x91: ("serviceProviderName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x92: ("profileName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x93: ("iconType", lambda v: ICON_LABELS.get(v[0], "unknown")), + 0x94: ("icon", b64e), + 0x95: ("profileClass", lambda v: CLASS_LABELS.get(v[0], "unknown")), +} + + +def _decode_profile_fields(data: bytes) -> dict: + """Parse known profile metadata TLV fields into a dict.""" + result = {} + for tag, value in iter_tlv(data): + if (field := _PROFILE_FIELDS.get(tag)): + result[field[0]] = field[1](value) + return result + + +# Notification field decoders: TLV tag -> (field_name, decoder) +_NOTIF_FIELDS = { + TAG_STATUS: ("seqNumber", lambda v: int.from_bytes(v, "big")), + 0x81: ("profileManagementOperation", lambda v: next((m for m in [0x80, 0x40, 0x20, 0x10] if len(v) >= 2 and v[1] & m), 0xFF)), + 0x0C: ("notificationAddress", lambda v: v.decode("utf-8", errors="ignore")), + TAG_ICCID: ("iccid", tbcd_to_string), +} + + +# --- ES10x command transport --- + +def es10x_command(client: AtClient, data: bytes) -> bytes: + response = bytearray() + sequence = 0 + offset = 0 + while offset < len(data): + chunk = data[offset : offset + ES10X_MSS] + offset += len(chunk) + is_last = offset == len(data) + apdu = bytes([0x80, 0xE2, 0x91 if is_last else 0x11, sequence & 0xFF, len(chunk)]) + chunk + segment, sw1, sw2 = client.send_apdu(apdu) + response.extend(segment) + while True: + if sw1 == 0x61: # More data available + segment, sw1, sw2 = client.send_apdu(bytes([0x80, 0xC0, 0x00, 0x00, sw2 or 0])) + response.extend(segment) + continue + if (sw1 & 0xF0) == 0x90: + break + raise RuntimeError(f"APDU failed with SW={sw1:02X}{sw2:02X}") + sequence += 1 + return bytes(response) + + +# --- ES9P HTTP --- + +def es9p_request(smdp_address: str, endpoint: str, payload: dict, error_prefix: str = "Request") -> dict: + if not system_time_valid(): + raise RuntimeError("System time is not set; TLS certificate validation requires a valid clock") + url = f"https://{smdp_address}/gsma/rsp2/es9plus/{endpoint}" + headers = {"User-Agent": "gsma-rsp-lpad", "X-Admin-Protocol": "gsma/rsp/v2.3.0", "Content-Type": "application/json"} + resp = requests.post(url, json=payload, headers=headers, timeout=30, verify=_tls_verify_option()) + resp.raise_for_status() + if not resp.content: + return {} + data = resp.json() + if "header" in data and "functionExecutionStatus" in data["header"]: + status = data["header"]["functionExecutionStatus"] + if status.get("status") == "Failed": + sd = status.get("statusCodeData", {}) + raise RuntimeError(f"{error_prefix} failed: {sd.get('reasonCode', 'unknown')}/{sd.get('subjectCode', 'unknown')} - {sd.get('message', 'unknown')}") + return data + + +# --- Profile operations --- + +def decode_profiles(blob: bytes) -> list[dict]: + root = find_tag(blob, TAG_PROFILE_INFO_LIST) + if root is None: + raise RuntimeError("Missing ProfileInfoList") + list_ok = find_tag(root, 0xA0) + if list_ok is None: + return [] + defaults = {name: None for name, _ in _PROFILE_FIELDS.values()} + return [{**defaults, **_decode_profile_fields(value)} for tag, value in iter_tlv(list_ok) if tag == 0xE3] + + +def list_profiles(client: AtClient) -> list[dict]: + return decode_profiles(es10x_command(client, bytes.fromhex("BF2D00"))) + + +def _profile_op(client: AtClient, tag: int, iccid: str, refresh: bool, action: str) -> None: + inner = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + if tag != TAG_DELETE_PROFILE: + if not refresh: + inner += encode_tlv(0x81, b'\x00') + inner = encode_tlv(0xA0, inner) + code = _extract_status(es10x_command(client, encode_tlv(tag, inner)), tag, f"{action.capitalize()}Profile") + if code == 0x00: + return + if code == 0x02 and tag != TAG_DELETE_PROFILE: + print(f"profile {iccid} already {action}d") + return + raise RuntimeError(f"{action.capitalize()}Profile failed: {PROFILE_ERROR_CODES.get(code, 'unknown')} (0x{code:02X})") + + +def enable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_ENABLE_PROFILE, iccid, refresh, "enable") + + +def disable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_DISABLE_PROFILE, iccid, refresh, "disable") + + +def delete_profile(client: AtClient, iccid: str) -> None: + _profile_op(client, TAG_DELETE_PROFILE, iccid, True, "delete") + + +def set_profile_nickname(client: AtClient, iccid: str, nickname: str) -> None: + nickname_bytes = nickname.encode("utf-8") + if len(nickname_bytes) > 64: + raise ValueError("Profile nickname must be 64 bytes or less") + content = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + encode_tlv(0x90, nickname_bytes) + code = _extract_status(es10x_command(client, encode_tlv(TAG_SET_NICKNAME, content)), TAG_SET_NICKNAME, "SetNickname") + if code == 0x01: + raise RuntimeError(f"profile {iccid} not found") + if code != 0x00: + raise RuntimeError(f"SetNickname failed with status 0x{code:02X}") + + +# --- Notifications --- + +def list_notifications(client: AtClient) -> list[dict]: + response = es10x_command(client, encode_tlv(TAG_LIST_NOTIFICATION, b"")) + root = find_tag(response, TAG_LIST_NOTIFICATION) + if root is None: + raise RuntimeError("Missing ListNotificationResponse") + metadata_list = find_tag(root, 0xA0) + if metadata_list is None: + return [] + notifications: list[dict] = [] + for tag, value in iter_tlv(metadata_list): + if tag != TAG_NOTIFICATION_METADATA: + continue + notification = {"seqNumber": None, "profileManagementOperation": None, "notificationAddress": None, "iccid": None} + for t, v in iter_tlv(value): + if (field := _NOTIF_FIELDS.get(t)): + notification[field[0]] = field[1](v) + if notification["seqNumber"] is not None and notification["profileManagementOperation"] is not None and notification["notificationAddress"]: + notifications.append(notification) + return notifications + + +def retrieve_notification(client: AtClient, seq_number: int) -> dict: + request = encode_tlv(TAG_RETRIEVE_NOTIFICATION, encode_tlv(0xA0, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + response = es10x_command(client, request) + root = find_tag(response, TAG_RETRIEVE_NOTIFICATION) + if root is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + a0_content = find_tag(root, 0xA0) + if a0_content is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + pending_notif, pending_tag = None, None + for tag, value in iter_tlv(a0_content): + if tag in (TAG_PROFILE_INSTALL_RESULT, 0x30): + pending_notif, pending_tag = value, tag + break + if pending_notif is None: + raise RuntimeError("Missing PendingNotification") + if pending_tag == TAG_PROFILE_INSTALL_RESULT: + result_data = find_tag(pending_notif, 0xBF27) + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) if result_data else None + else: + notif_meta = find_tag(pending_notif, TAG_NOTIFICATION_METADATA) + if notif_meta is None: + raise RuntimeError("Missing NotificationMetadata") + addr = find_tag(notif_meta, 0x0C) + if addr is None: + raise RuntimeError("Missing notificationAddress") + return {"notificationAddress": addr.decode("utf-8", errors="ignore"), "b64_PendingNotification": b64e(pending_notif)} + + +def remove_notification(client: AtClient, seq_number: int) -> None: + response = es10x_command(client, encode_tlv(TAG_NOTIFICATION_SENT, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + root = find_tag(response, TAG_NOTIFICATION_SENT) + if root is None: + raise RuntimeError("Invalid NotificationSentResponse") + status = find_tag(root, TAG_STATUS) + if status is None or int.from_bytes(status, "big") != 0: + raise RuntimeError("RemoveNotificationFromList failed") + + +def process_notifications(client: AtClient) -> None: + for notification in list_notifications(client): + seq_number, smdp_address = notification["seqNumber"], notification["notificationAddress"] + if not seq_number or not smdp_address: + continue + try: + notif_data = retrieve_notification(client, seq_number) + es9p_request(smdp_address, "handleNotification", {"pendingNotification": notif_data["b64_PendingNotification"]}, "HandleNotification") + remove_notification(client, seq_number) + except Exception: + pass + + +# --- Authentication & Download --- + +def get_challenge_and_info(client: AtClient) -> tuple[bytes, bytes]: + challenge_resp = es10x_command(client, encode_tlv(TAG_EUICC_CHALLENGE, b"")) + root = find_tag(challenge_resp, TAG_EUICC_CHALLENGE) + if root is None: + raise RuntimeError("Missing GetEuiccDataResponse") + challenge = find_tag(root, TAG_STATUS) + if challenge is None: + raise RuntimeError("Missing challenge in response") + info_resp = es10x_command(client, encode_tlv(TAG_EUICC_INFO, b"")) + if not info_resp.startswith(bytes([0xBF, 0x20])): + raise RuntimeError("Missing GetEuiccInfo1Response") + return challenge, info_resp + + +def authenticate_server(client: AtClient, b64_signed1: str, b64_sig1: str, b64_pk_id: str, b64_cert: str, matching_id: str | None = None) -> str: + # Build request + tac = bytes([0x35, 0x29, 0x06, 0x11]) + device_info = encode_tlv(TAG_STATUS, tac) + encode_tlv(0xA1, b"") + ctx_inner = b"" + if matching_id: + ctx_inner += encode_tlv(TAG_STATUS, matching_id.encode("utf-8")) + ctx_inner += encode_tlv(0xA1, device_info) + content = base64.b64decode(b64_signed1) + base64.b64decode(b64_sig1) + base64.b64decode(b64_pk_id) + base64.b64decode(b64_cert) + encode_tlv(0xA0, ctx_inner) + request = encode_tlv(TAG_AUTH_SERVER, content) + + response = es10x_command(client, request) + if not response.startswith(bytes([0xBF, 0x38])): + raise RuntimeError("Invalid AuthenticateServerResponse") + + # Check for eUICC-side errors + root = find_tag(response, TAG_AUTH_SERVER) + if root is not None: + error_tag = find_tag(root, 0xA1) + if error_tag is not None: + code = int.from_bytes(error_tag, "big") if error_tag else 0 + desc = AUTH_SERVER_ERROR_CODES.get(code, "unknown") + raise RuntimeError(f"AuthenticateServer rejected by eUICC: {desc} (0x{code:02X})") + + return b64e(response) + + +def prepare_download(client: AtClient, b64_signed2: str, b64_sig2: str, b64_cert: str, cc: str | None = None) -> str: + smdp_signed2 = base64.b64decode(b64_signed2) + smdp_signature2 = base64.b64decode(b64_sig2) + smdp_certificate = base64.b64decode(b64_cert) + smdp_signed2_root = find_tag(smdp_signed2, 0x30) + if smdp_signed2_root is None: + raise RuntimeError("Invalid smdpSigned2") + transaction_id = find_tag(smdp_signed2_root, TAG_STATUS) + cc_required_flag = find_tag(smdp_signed2_root, 0x01) + if transaction_id is None or cc_required_flag is None: + raise RuntimeError("Invalid smdpSigned2") + content = smdp_signed2 + smdp_signature2 + if int.from_bytes(cc_required_flag, "big") != 0: + if not cc: + raise RuntimeError("Confirmation code required but not provided") + content += encode_tlv(0x04, hashlib.sha256(hashlib.sha256(cc.encode("utf-8")).digest() + transaction_id).digest()) + content += smdp_certificate + response = es10x_command(client, encode_tlv(TAG_PREPARE_DOWNLOAD, content)) + if not response.startswith(bytes([0xBF, 0x21])): + raise RuntimeError("Invalid PrepareDownloadResponse") + return b64e(response) + + +def _parse_tlv_header_len(data: bytes) -> int: + """Return the combined tag + length header size for a TLV element.""" + tag_len = 2 if data[0] & 0x1F == 0x1F else 1 + length_byte = data[tag_len] + return tag_len + (1 + (length_byte & 0x7F) if length_byte & 0x80 else 1) + + +def load_bpp(client: AtClient, b64_bpp: str) -> dict: + bpp = b64d(b64_bpp) + if not bpp.startswith(bytes([0xBF, 0x36])): + raise RuntimeError("Invalid BoundProfilePackage") + + bpp_root_value = None + for tag, value, start, end in iter_tlv(bpp, with_positions=True): + if tag == TAG_BPP: + bpp_root_value = value + bpp_value_start = start + _parse_tlv_header_len(bpp[start:end]) + break + if bpp_root_value is None: + raise RuntimeError("Invalid BoundProfilePackage") + + chunks = [] + for tag, value, start, end in iter_tlv(bpp_root_value, with_positions=True): + if tag == 0xBF23: + chunks.append(bpp[0 : bpp_value_start + end]) + elif tag == 0xA0: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + elif tag in (0xA1, 0xA3): + hdr_len = _parse_tlv_header_len(bpp_root_value[start:end]) + chunks.append(bpp[bpp_value_start + start : bpp_value_start + start + hdr_len]) + for _, _, child_start, child_end in iter_tlv(value, with_positions=True): + chunks.append(value[child_start:child_end]) + elif tag == 0xA2: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + + result = {"seqNumber": 0, "success": False, "bppCommandId": None, "errorReason": None} + for chunk in chunks: + response = es10x_command(client, chunk) + if not response: + continue + root = find_tag(response, TAG_PROFILE_INSTALL_RESULT) + if not root: + continue + result_data = find_tag(root, 0xBF27) + if not result_data: + break + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) + if notif_meta: + seq_num = find_tag(notif_meta, TAG_STATUS) + if seq_num: + result["seqNumber"] = int.from_bytes(seq_num, "big") + final_result = find_tag(result_data, 0xA2) + if final_result: + for tag, value in iter_tlv(final_result): + if tag == 0xA0: + result["success"] = True + elif tag == 0xA1: + bpp_cmd = find_tag(value, TAG_STATUS) + if bpp_cmd: + result["bppCommandId"] = int.from_bytes(bpp_cmd, "big") + err = find_tag(value, 0x81) + if err: + result["errorReason"] = int.from_bytes(err, "big") + break # ProfileInstallResult received — eUICC session is finalized + if not result["success"] and result["errorReason"] is not None: + cmd_name = BPP_COMMAND_NAMES.get(result["bppCommandId"], f"unknown({result['bppCommandId']})") + err_name = BPP_ERROR_REASONS.get(result["errorReason"], f"unknown({result['errorReason']})") + raise RuntimeError(f"Profile installation failed at {cmd_name}: {err_name} (bppCommandId={result['bppCommandId']}, errorReason={result['errorReason']})") + return result + + +def parse_metadata(b64_metadata: str) -> dict: + root = find_tag(b64d(b64_metadata), 0xBF25) + if root is None: + raise RuntimeError("Invalid profileMetadata") + defaults = {"iccid": None, "serviceProviderName": None, "profileName": None, "iconType": None, "icon": None, "profileClass": None} + return {**defaults, **_decode_profile_fields(root)} + + +def cancel_session(client: AtClient, transaction_id: bytes, reason: int = 127) -> str: + content = encode_tlv(0x80, transaction_id) + encode_tlv(0x81, bytes([reason])) + response = es10x_command(client, encode_tlv(TAG_CANCEL_SESSION, content)) + return b64e(response) + + +def parse_lpa_activation_code(activation_code: str) -> tuple[str, str, str]: + if not activation_code.startswith("LPA:"): + raise ValueError("Invalid activation code format") + + parts = activation_code[4:].split("$") + if len(parts) != 3: + raise ValueError("Invalid activation code format") + + version, smdp, matching_id = [p.strip() for p in parts] + if version != "1": + raise ValueError("Unsupported activation code version") + if len(smdp) == 0 or "." not in smdp: + raise ValueError("Invalid SM-DP+ address in activation code") + if len(matching_id) == 0: + raise ValueError("Missing matching ID in activation code") + return version, smdp, matching_id + + +def download_profile(client: AtClient, activation_code: str) -> str: + _, smdp, matching_id = parse_lpa_activation_code(activation_code) + + challenge, euicc_info = get_challenge_and_info(client) + + payload = {"smdpAddress": smdp, "euiccChallenge": b64e(challenge), "euiccInfo1": b64e(euicc_info)} + if matching_id: + payload["matchingId"] = matching_id + auth = es9p_request(smdp, "initiateAuthentication", payload, "Authentication") + tx_id = base64_trim(auth.get("transactionId", "")) + tx_id_bytes = base64.b64decode(tx_id) if tx_id else b"" + + try: + b64_auth_resp = authenticate_server( + client, base64_trim(auth.get("serverSigned1", "")), base64_trim(auth.get("serverSignature1", "")), + base64_trim(auth.get("euiccCiPKIdToBeUsed", "")), base64_trim(auth.get("serverCertificate", "")), + matching_id=matching_id) + + cli = es9p_request(smdp, "authenticateClient", {"transactionId": tx_id, "authenticateServerResponse": b64_auth_resp}, "Authentication") + metadata = parse_metadata(base64_trim(cli.get("profileMetadata", ""))) + iccid = str(metadata.get("iccid") or "") + print(f'Downloading profile: {iccid} - {metadata["serviceProviderName"]} - {metadata["profileName"]}') + + b64_prep = prepare_download( + client, base64_trim(cli.get("smdpSigned2", "")), base64_trim(cli.get("smdpSignature2", "")), base64_trim(cli.get("smdpCertificate", ""))) + + bpp = es9p_request(smdp, "getBoundProfilePackage", {"transactionId": tx_id, "prepareDownloadResponse": b64_prep}, "GetBoundProfilePackage") + + result = load_bpp(client, base64_trim(bpp.get("boundProfilePackage", ""))) + if result["success"]: + print(f"Profile installed successfully (seqNumber: {result['seqNumber']})") + return iccid + else: + raise RuntimeError(f"Profile installation failed: {result}") + except Exception: + if tx_id_bytes: + b64_cancel_resp = "" + try: + b64_cancel_resp = cancel_session(client, tx_id_bytes) + except Exception: + pass + try: + es9p_request(smdp, "cancelSession", { + "transactionId": tx_id, + "cancelSessionResponse": b64_cancel_resp, + }, "CancelSession") + except Exception: + pass + raise + + +class TiciLPA(LPABase): + handles_modem_restart = True + _instance = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self, interface: Literal["qmi", "at"] = "at", device: str = DEFAULT_DEVICE, baud: int = DEFAULT_BAUD, + timeout: float = DEFAULT_TIMEOUT, verbose: bool = False): + if getattr(self, "_initialized", False): + self.verbose = verbose or self.verbose + return + # This backend is AT-only. Keep interface arg for compatibility with existing CLI/call sites. + self.interface = interface + self.device = device + self.baud = baud + self.timeout = timeout + self.verbose = verbose + self._last_good_device = device + self._euicc_present_cache: bool | None = None + from iqpilot.system.hardware.tici.hardware import get_device_type + self._is_eg25 = get_device_type() in ("tizi",) + self._client: AtClient | None = None + self._initialized = True + # _client is opened lazily via _ensure_client() on first actual eSIM operation. + # Do NOT call _open_ready_client() here: on pSIM devices (no eUICC) it retries + # for 10–30 s against the AT port, blocking hw_state_thread and starving the + # network-type polling loop that drives the WiFi/LTE sidebar indicator. + atexit.register(self.close) + + def close(self) -> None: + if self._client is not None: + try: + self._client.close() + finally: + self._client = None + + @staticmethod + def _set_modemmanager_running(running: bool) -> None: + action = "start" if running else "stop" + subprocess.check_call(["sudo", "systemctl", action, "ModemManager"]) + + @staticmethod + def _is_modemmanager_running() -> bool: + res = subprocess.run(["systemctl", "is-active", "ModemManager"], + capture_output=True, text=True, check=False) + return res.stdout.strip() == "active" + + def _probe_euicc_present(self) -> bool | None: + if self._euicc_present_cache is not None: + return self._euicc_present_cache + + if self._is_modemmanager_running(): + return None + + restarted_modemmanager = False + try: + res = subprocess.run( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-get-slot-status"], + capture_output=True, text=True, check=False, timeout=12, + ) + output = f"{res.stdout}\n{res.stderr}" + if "Is eUICC: yes" in output: + self._euicc_present_cache = True + elif "Is eUICC: no" in output: + self._euicc_present_cache = False + else: + self._euicc_present_cache = None + except Exception: + self._euicc_present_cache = None + finally: + if restarted_modemmanager: + self._set_modemmanager_running(True) + time.sleep(2.0) + + return self._euicc_present_cache + + @staticmethod + def _ttyusb2_mm_ignored() -> bool: + # AGNOS PR 521 marks ttyUSB2 with ID_MM_PORT_IGNORE=1 for EG25. + # If missing, ModemManager may contend with direct AT eSIM operations. + if not os.path.exists("/dev/ttyUSB2"): + return False + try: + res = subprocess.run( + ["udevadm", "info", "-q", "property", "-n", "/dev/ttyUSB2"], + capture_output=True, text=True, check=False, + ) + if res.returncode != 0: + return False + return "ID_MM_PORT_IGNORE=1" in res.stdout + except Exception: + return False + + def _ensure_client(self) -> AtClient: + if self._client is None: + self._client = self._open_ready_client() + return self._client + + @contextmanager + def _open_client(self): + yield self._ensure_client() + + def _open_ready_client(self) -> AtClient: + euicc_present = self._probe_euicc_present() + if euicc_present is False: + raise LPAError("Modem reports no eUICC support on this unit (QMI: Is eUICC: no)") + + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(1, 6): + for device in self._candidate_devices(): + client: AtClient | None = None + try: + if self.verbose: + print(f"!! trying modem AT device: {device} (attempt {attempt})", file=sys.stderr) + client = AtClient(device, self.baud, self.timeout, self.verbose) + client.ensure_capabilities() + client.open_isdr() + self._last_good_device = device + if self.verbose: + print(f"!! selected modem AT device: {device}", file=sys.stderr) + return client + except Exception as e: + if self.verbose: + print(f"!! modem AT device failed: {device}: {e}", file=sys.stderr) + last_error = e + if client is not None: + try: + client.close() + except Exception: + pass + if not recovery_attempted and last_error is not None and self._should_recover_isdr(last_error): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + # Give modem a moment to finish startup / channel release. + time.sleep(min(0.4 * attempt, 1.5)) + assert last_error is not None + raise last_error + + def _candidate_devices(self) -> list[str]: + if self.device and not os.path.exists(self.device): + return [self.device] + + candidates = [ + self._last_good_device, + self.device, + "/dev/modem_at0", + "/dev/ttyUSB3", + "/dev/ttyUSB2", + "/dev/ttyUSB1", + "/dev/ttyUSB0", + ] + ordered: list[str] = [] + for dev in candidates: + should_include = dev in (self.device, "/dev/modem_at0") or os.path.exists(dev) + if dev and dev not in ordered and should_include: + ordered.append(dev) + return ordered if ordered else [self.device] + + @staticmethod + def _to_profile(data: dict) -> Profile: + return Profile( + iccid=str(data.get("iccid") or ""), + nickname=str(data.get("profileNickname") or ""), + enabled=str(data.get("profileState") or "") == "enabled", + provider=str(data.get("serviceProviderName") or ""), + ) + + def _clear_cat_busy(self) -> None: + time.sleep(3) + try: + self._ensure_client().query('AT+QSTKRSP=254') + except Exception: + pass + time.sleep(1) + try: + self._ensure_client().query('AT+CFUN=4') + except Exception: + pass + time.sleep(2) + try: + self._ensure_client().query('AT+CFUN=1') + except Exception: + pass + self._ensure_client().channel = None + time.sleep(5) + + def _wait_for_modem(self, timeout: float = 45.0) -> None: + start = time.monotonic() + last_error: Exception | None = None + while time.monotonic() - start < timeout: + try: + self.close() + self._client = self._open_ready_client() + return + except Exception as e: + last_error = e + time.sleep(2) + if last_error is not None: + raise RuntimeError("Modem did not recover after reboot") from last_error + raise RuntimeError("Modem did not recover after reboot") + + def _restart_modem(self) -> None: + client = self._ensure_client() + for cmd in ('AT+CFUN=0', 'AT+CFUN=1,1'): + try: + client.query(cmd) + except Exception: + pass + client.channel = None + client._use_csim = False + self._wait_for_modem() + + @staticmethod + def _should_recover_isdr(error: Exception) -> bool: + message = str(error).lower() + markers = ( + "failed to open isd-r", + "failed to access euicc isd-r", + "simfilenotfound", + "at+ccho", + "at+cgla", + ) + return any(marker in message for marker in markers) + + def _recover_isdr_access(self) -> bool: + was_modemmanager_running = self._is_modemmanager_running() + self.close() + try: + if was_modemmanager_running: + self._set_modemmanager_running(False) + time.sleep(2.0) + + for cmd in ( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-reset"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-off=1"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-on=1"], + ): + subprocess.check_call(cmd) + time.sleep(2.0) + + self._euicc_present_cache = None + return True + except Exception as e: + if self.verbose: + print(f"!! ISD-R recovery failed: {e}", file=sys.stderr) + return False + finally: + if was_modemmanager_running: + self._set_modemmanager_running(True) + time.sleep(2.0) + + def _with_lpa_error(self, fn): + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(3): + try: + return fn() + except LPAError: + raise + except RuntimeError as e: + last_error = e + if "does not provide usable esim functionality" in str(e).lower(): + raise LPAError(str(e)) from e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(str(e)) from e + except (OSError, serial.SerialException) as e: + last_error = e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(f"AT transport error: {e}") from e + except TimeoutError as e: + raise LPAError(f"AT modem timeout: {e}") from e + except ValueError as e: + raise LPAError(str(e)) from e + assert last_error is not None + raise LPAError(str(last_error)) + + @staticmethod + def _is_transient_transport_error(message: str) -> bool: + lower = message.lower() + transient_markers = ( + "broken pipe", + "resource busy", + "input/output error", + "device disconnected", + "device reports readiness to read but returned no data", + "transport error", + "missing +cgla response", + "missing +csim response", + "malformed +cgla response payload", + "malformed +csim response payload", + "non-hexadecimal number found in fromhex", + ) + return any(m in lower for m in transient_markers) + + def list_profiles(self) -> list[Profile]: + def _run() -> list[Profile]: + return [self._to_profile(p) for p in list_profiles(self._ensure_client())] + return self._with_lpa_error(_run) + + def get_active_profile(self) -> Profile | None: + return next((p for p in self.list_profiles() if p.enabled), None) + + def _validate_profile_exists(self, iccid: str) -> None: + if not any(p.iccid == iccid for p in self.list_profiles()): + raise LPAProfileNotFoundError(f"profile {iccid} does not exist") + + def _is_bootstrapped(self) -> bool: + return not any(self.is_comma_profile(p.iccid) for p in self.list_profiles()) + + def _ensure_switchable_profile(self, iccid: str) -> None: + if self.is_comma_profile(iccid): + return + + if not self._is_bootstrapped(): + raise LPAError( + "Delete the existing Comma pSIM profile before activating a user eSIM profile" + ) + + def _process_notifications_after_delete(self, client: AtClient, iccid: str) -> None: + try: + process_notifications(client) + return + except Exception as error: + notification_error = error + + self._restart_modem() + + try: + deleted = not any(p.iccid == iccid for p in self.list_profiles()) + except Exception: + raise RuntimeError( + "Profile delete may have succeeded, but modem notification cleanup failed; " + "refresh profiles and retry if needed" + ) from notification_error + + if deleted: + return + + raise RuntimeError( + "Profile delete did not finish cleanly; refresh profiles and retry" + ) from notification_error + + def _process_notifications_after_state_change( + self, + validator, + recovery_message: str, + failure_message: str, + ) -> None: + try: + process_notifications(self._ensure_client()) + return + except Exception as notification_error: + pass + + self._wait_for_modem() + + try: + if validator(): + return + except Exception: + raise RuntimeError(recovery_message) from notification_error + + raise RuntimeError(failure_message) from notification_error + + def delete_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + raise LPAError("cannot delete active profile, switch to another profile first") + + def _run() -> None: + client = self._ensure_client() + try: + delete_profile(client, iccid) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + delete_profile(client, iccid) + else: + raise + self._process_notifications_after_delete(client, iccid) + + self._with_lpa_error(_run) + + def bootstrap(self) -> None: + comma_profiles = [p for p in self.list_profiles() if self.is_comma_profile(p.iccid)] + if not comma_profiles: + return + + def _run() -> None: + client = self._ensure_client() + for profile in comma_profiles: + if profile.enabled: + disable_profile(client, profile.iccid, refresh=True) + process_notifications(client) + delete_profile(client, profile.iccid) + process_notifications(client) + self._restart_modem() + + self._with_lpa_error(_run) + + def download_profile(self, qr: str, nickname: str | None = None) -> None: + # Strict upfront validation to provide immediate user feedback. + parse_lpa_activation_code(qr) + before = {p.iccid for p in self.list_profiles()} + + def _run() -> None: + client = self._ensure_client() + iccid = download_profile(client, qr) + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid for profile in self.list_profiles()), + "Profile add may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile add did not finish cleanly; refresh profiles and retry", + ) + + self._with_lpa_error(_run) + + if nickname: + after = self.list_profiles() + new_profile = next((p for p in after if p.iccid not in before), None) + if new_profile is not None and new_profile.iccid: + self.nickname_profile(new_profile.iccid, nickname) + + def nickname_profile(self, iccid: str, nickname: str) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + set_profile_nickname(self._ensure_client(), iccid, nickname) + self._with_lpa_error(_run) + + def switch_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + self._ensure_switchable_profile(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + return + + def _run() -> None: + client = self._ensure_client() + use_refresh = self._is_eg25 + try: + enable_profile(client, iccid, refresh=use_refresh) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + enable_profile(client, iccid, refresh=use_refresh) + else: + raise + client.channel = None + client._use_csim = False + if use_refresh: + self._wait_for_modem() + else: + self._restart_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile switch may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile switch did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + # Compatibility methods retained for old tests/scripts. + def process_notifications(self) -> None: + def _run() -> None: + process_notifications(self._ensure_client()) + self._with_lpa_error(_run) + + def enable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + enable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile enable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile enable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + def disable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + disable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and not profile.enabled for profile in self.list_profiles()), + "Profile disable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile disable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + +# --- CLI --- + +def main() -> None: + parser = argparse.ArgumentParser(description="Minimal AT-only LPA implementation") + parser.add_argument("--device", default=DEFAULT_DEVICE) + parser.add_argument("--baud", type=int, default=DEFAULT_BAUD) + parser.add_argument("--timeout", type=float, default=DEFAULT_TIMEOUT) + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--enable", type=str) + parser.add_argument("--disable", type=str) + parser.add_argument("--delete", type=str, metavar="ICCID", help="Delete a disabled profile") + parser.add_argument("--no-refresh", action="store_true", help="Skip REFRESH after enable/disable") + parser.add_argument("--set-nickname", nargs=2, metavar=("ICCID", "NICKNAME")) + parser.add_argument("--list-notifications", action="store_true") + parser.add_argument("--process-notifications", action="store_true") + parser.add_argument("--download", type=str, metavar="CODE") + args = parser.parse_args() + + lpa = TiciLPA(device=args.device, baud=args.baud, timeout=args.timeout, verbose=args.verbose) + + if args.enable: + lpa.enable_profile(args.enable, refresh=not args.no_refresh) + elif args.disable: + lpa.disable_profile(args.disable, refresh=not args.no_refresh) + elif args.delete: + lpa.delete_profile(args.delete) + elif args.set_nickname: + lpa.nickname_profile(args.set_nickname[0], args.set_nickname[1]) + elif args.list_notifications: + with lpa._open_client() as client: + print(json.dumps(list_notifications(client), indent=2)) + return + elif args.process_notifications: + lpa.process_notifications() + return + elif args.download: + lpa.download_profile(args.download) + + profiles_out = [{ + "iccid": p.iccid, + "profileNickname": p.nickname, + "profileState": "enabled" if p.enabled else "disabled", + "serviceProviderName": p.provider, + } for p in lpa.list_profiles()] + print(json.dumps(profiles_out, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py new file mode 100644 index 000000000..d53183f7a --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py @@ -0,0 +1,30 @@ +# GPIO pin definitions +class GPIO: + # both GPIO_STM_RST_N and GPIO_LTE_RST_N are misnamed, they are high to reset + HUB_RST_N = 30 + UBLOX_RST_N = 32 + UBLOX_SAFEBOOT_N = 33 + GNSS_PWR_EN = 34 # SCHEMATIC LABEL: GPIO_UBLOX_PWR_EN + + STM_RST_N = 124 + STM_BOOT0 = 134 + STM_PWR_EN_N = 41 # because STM32H7 RST doesn't generate a full power-on-reset + + SIREN = 42 + SOM_ST_IO = 49 + + LTE_RST_N = 50 + LTE_PWRKEY = 116 + LTE_BOOT = 52 + + # GPIO_CAM0_DVDD_EN = /sys/kernel/debug/regulator/camera_rear_ldo + CAM0_AVDD_EN = 8 + CAM0_RSTN = 9 + CAM1_RSTN = 7 + CAM2_RSTN = 12 + + # Sensor interrupts + BMX055_ACCEL_INT = 21 + BMX055_GYRO_INT = 23 + BMX055_MAGN_INT = 87 + LSM_INT = 84 diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/usb_storage.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/usb_storage.py new file mode 100644 index 000000000..7dcb52214 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/tici/usb_storage.py @@ -0,0 +1,71 @@ +import os +import subprocess + +from iqpilot.common.params import Params + +SCRIPT_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "set_usb_storage.sh") + + +def apply_usb_storage_state(state: bool): + Params().put_bool("UsbStorageEnabled", state) + try: + args = ["sudo", SCRIPT_PATH] + if state: + args.append("--rebuild") + subprocess.Popen(args) + except OSError: + pass + + +NCM_TRIED_MARKER = "/tmp/.iqemac_ncm_provisioned" +MAX_NCM_ATTEMPTS = 3 + + +def _ncm_attempts() -> int: + try: + with open(NCM_TRIED_MARKER) as f: + return int(f.read().strip() or 0) + except (OSError, ValueError): + return 0 + + +def ensure_ncm_gadget() -> bool: + # configfs is RAM backed, so the gadget must be rebuilt every boot; binding it + # enumerates on the host, which must not happen mid-drive + if os.path.isdir("/sys/class/net/usb0"): + return True + params = Params() + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + if not (params.get_bool("IQEmacEnabled") or egpu_selected(params)): + return False + attempts = _ncm_attempts() + if attempts >= MAX_NCM_ATTEMPTS: + return False + try: + # stamped before the run: the gadget build can wedge configfs in + # uninterruptible D state, and retrying that forever helps nobody + with open(NCM_TRIED_MARKER, "w") as f: + f.write(str(attempts + 1)) + subprocess.run(["sudo", "-n", SCRIPT_PATH], timeout=120, check=False) + except (OSError, subprocess.SubprocessError): + return False + return os.path.isdir("/sys/class/net/usb0") + + +INPUT_SUSPEND = "/sys/class/power_supply/battery/input_suspend" + + +def suspend_usb_input(suspend: bool = True) -> bool: + # a host on the data port makes the PMIC sink USB-PD while OBD-C feeds the same + # rail; the SOM browns out. This closes the charge path only, data is untouched + if not os.path.exists(INPUT_SUSPEND): + return False + try: + with open(INPUT_SUSPEND) as f: + if f.read().strip() == ("1" if suspend else "0"): + return True + except OSError: + pass + rc = subprocess.run(["sudo", "-n", "sh", "-c", f"echo {int(suspend)} > {INPUT_SUSPEND}"], + check=False, capture_output=True) + return rc.returncode == 0 diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/usb.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/usb.py new file mode 100644 index 000000000..8c8a2d7e8 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/hardware/usb.py @@ -0,0 +1,205 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +USB bus snapshot for deviceState: every enumerated device with its negotiated +speed and its controller's link-error count. Landing this in every rlog makes +cable/hub/link regressions diagnosable from a recorded route instead of only +live. + +Link errors come from `portli` on the ssusb controller (IQ.OS 4.9.1+); on older +builds the file is absent and the counts read 0. + +The USB eGPU dock is identified by VID/PID only. comma's internal codename for +it is deliberately not used here: IQ.Pilot runs these models on several +backends (eGPU dock, eMac), so the naming stays about the role, not the vendor. +""" +import subprocess +from pathlib import Path + +# comma's USB eGPU dock, both shipped USB IDs. The ROM ids are the same board +# sitting in its bootloader (ASMedia) before vendor firmware is flashed — it +# enumerates but cannot serve a GPU in that state. +EGPU_DOCK_USB_IDS = ((0xADD1, 0x0001), (0x3801, 0x0001)) +EGPU_DOCK_ROM_USB_IDS = ((0x174C, 0x2464), (0x174C, 0x2463)) +# must equal image_product() of the bundled firmware; test_egpu_dock_flash pins them together +EGPU_DOCK_FW_PRODUCT = "custom ed4e39b7-CLEAN" + + +def is_egpu_usb_device(vendor_id: int, product_id: int, include_bootloader: bool = False) -> bool: + ids = EGPU_DOCK_USB_IDS + EGPU_DOCK_ROM_USB_IDS if include_bootloader else EGPU_DOCK_USB_IDS + return (vendor_id, product_id) in ids +USB_DEVICES_PATH = Path("/sys/bus/usb/devices") +UDC_PATH = Path("/sys/class/udc") +TYPEC_CC_ORIENTATION_PATH = Path("/sys/class/power_supply/usb/typec_cc_orientation") +USB3_LANES = {1: "a", 2: "b"} # 0 = unattached +SOC_PLATFORM_PATH = Path("/sys/devices/platform/soc") +CONTROLLER_SUFFIX = ".ssusb" +LINK_ERRORS_FILE = "portli" + + +def read(path: Path) -> str | None: + # a controller in peripheral mode fails portli's show(); that surfaces as TypeError, not OSError + try: + return path.read_text().strip() + except Exception: + return None + + +def read_int(path: Path, base: int = 10) -> int: + try: + return int(path.read_text(), base) + except Exception: + return 0 + + +def read_hex_counter(path: Path) -> int: + """sysfs counter printed as '0x0000002a' (portli), tolerating a bare hex value.""" + raw = read(path) + if raw is None: + return 0 + try: + return int(raw, 0) if raw.lower().startswith("0x") else int(raw, 16) + except ValueError: + return 0 + + +def get_usb_topology(root: Path = USB_DEVICES_PATH) -> set[str]: + """Names of everything on the bus; a cheap way to detect hotplug without + re-reading every attribute.""" + try: + return {p.name for p in root.iterdir()} + except Exception: + return set() + + +def usb_devices(root: Path = USB_DEVICES_PATH) -> list[Path]: + try: + return sorted((d for d in root.glob("*") if (d / "idVendor").exists()), key=lambda p: p.name) + except Exception: + return [] + + +def controller(device: Path) -> Path | None: + """The SuperSpeed controller a device hangs off (â€Ļ/a800000.ssusb).""" + try: + return next((p for p in device.resolve().parents if p.name.endswith(CONTROLLER_SUFFIX)), None) + except Exception: + return None + + +def usb_controllers(soc: Path = SOC_PLATFORM_PATH) -> list[Path]: + try: + return sorted(soc.glob(f"*{CONTROLLER_SUFFIX}")) + except Exception: + return [] + + +def link_controller(udc_root: Path = UDC_PATH) -> str: + """Name of the Type-C port's controller, derived from the UDC rather than + hardcoded: the gadget exposes `.dwc3`, whose address prefix is the + `.ssusb` controller behind the same connector. comma pins the 3X value + directly, which would be wrong on any other board.""" + try: + udc = next(iter(sorted(p.name for p in udc_root.iterdir())), "") + except Exception: + return "" + return f"{udc.split('.')[0]}{CONTROLLER_SUFFIX}" if udc else "" + + +def usb3_lane(orientation: int | None = None) -> str: + """Which SuperSpeed lane the Type-C connector landed on. Unattached reads 0, + which is 'unknown' rather than a lane.""" + if orientation is None: + orientation = read_int(TYPEC_CC_ORIENTATION_PATH) + return USB3_LANES.get(orientation, "unknown") + + +def link_errors(ctrl: Path | None) -> int: + return read_hex_counter(ctrl / LINK_ERRORS_FILE) if ctrl is not None else 0 + + +def get_link_error_count(soc: Path = SOC_PLATFORM_PATH) -> int: + """Cumulative SS port link errors, read off the controller rather than a + device: in peripheral mode (eMac gadget link) the peer never enumerates on + our side, so there is no device row to carry the count.""" + return sum(link_errors(c) for c in usb_controllers(soc)) + + +def host_role_controller(soc: Path = SOC_PLATFORM_PATH, udc_root: Path = UDC_PATH) -> Path | None: + ctrl = link_controller(udc_root) + return (soc / ctrl / "mode") if ctrl else None + + +def ensure_host_role(mode_path: Path | None = None) -> bool: + """A usbpd blip mid-drive can leave the Type-C controller in 'none'/'peripheral', and the + dock can never re-enumerate until something puts the port back into host mode.""" + path = mode_path if mode_path is not None else host_role_controller() + if path is None: + return False + current = read(path) + if current == "host": + return True + if current is None: + return False + rc = subprocess.run(["sudo", "-n", "sh", "-c", f"echo host > {path}"], check=False, capture_output=True) + return rc.returncode == 0 and read(path) == "host" + + +def egpu_dock_present(root: Path = USB_DEVICES_PATH) -> bool: + """A dock in ROM/bootloader state is deliberately NOT counted as present: it + enumerates but cannot serve a GPU until vendor firmware is flashed.""" + return any((read_int(d / "idVendor", 16), read_int(d / "idProduct", 16)) in EGPU_DOCK_USB_IDS + for d in usb_devices(root)) + + +def egpu_dock_ready(root: Path = USB_DEVICES_PATH) -> bool: + """Present AND running the exact firmware we ship. A dock on any other + firmware enumerates fine but has not been validated with this stack, so the + runtime refuses it; the flasher still sees it via egpu_dock_present.""" + return any((read_int(d / "idVendor", 16), read_int(d / "idProduct", 16)) in EGPU_DOCK_USB_IDS + and (read(d / "product") or "").strip() == EGPU_DOCK_FW_PRODUCT + for d in usb_devices(root)) + + +def get_usb_state(root: Path = USB_DEVICES_PATH, udc_root: Path = UDC_PATH) -> list[dict]: + devices = [] + lane, link_ctrl = usb3_lane(), link_controller(udc_root) + for device in usb_devices(root): + ctrl = controller(device) + devices.append({ + "usb3Lane": lane if ctrl is not None and ctrl.name == link_ctrl else "unknown", + "busnum": read_int(device / "busnum"), + "devnum": read_int(device / "devnum"), + "vendorId": read_int(device / "idVendor", 16), + "productId": read_int(device / "idProduct", 16), + "speedMbps": read_int(device / "speed"), + "manufacturer": read(device / "manufacturer") or "", + "product": read(device / "product") or "", + # 16-bit field upstream, so mask rather than let a wrapped counter overflow it + "linkErrorCount": link_errors(ctrl) & 0xFFFF, + }) + return devices + + +def set_usb_state(device_state, devices: list[dict], link_error_count: int = 0, + lane: str | None = None) -> None: + entries = device_state.usbState.init('devices', len(devices)) + + dock_present = False + for entry, device in zip(entries, devices, strict=True): + entry.busnum = device["busnum"] + entry.devnum = device["devnum"] + entry.vendorId = device["vendorId"] + entry.productId = device["productId"] + entry.speedMbps = device["speedMbps"] + entry.manufacturer = device["manufacturer"] + entry.product = device["product"] + entry.linkErrorCount = device.get("linkErrorCount", 0) & 0xFFFF + entry.usb3Lane = device.get("usb3Lane", "unknown") + + if (entry.vendorId, entry.productId) in EGPU_DOCK_USB_IDS: + dock_present = True + + device_state.usbState.linkErrorCount = link_error_count + device_state.usbState.usb3Lane = lane if lane is not None else usb3_lane() + device_state.egpuDockPresent = dock_present diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/micd.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/micd.py new file mode 100644 index 000000000..5c8d05594 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/micd.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +import numpy as np +import os +import time +from functools import cache +import threading + +from iqpilot.cereal import messaging +from iqpilot.common.params import Params +from iqpilot.common.realtime import Ratekeeper +from iqpilot.common.utils import retry +from iqpilot.common.swaglog import cloudlog + +RATE = 10 +FFT_SAMPLES = 1600 # 100ms +REFERENCE_SPL = 2e-5 # newtons/m^2 +SAMPLE_RATE = 16000 +SAMPLE_BUFFER = 800 # 50ms + + +@cache +def get_a_weighting_filter(): + # Calculate the A-weighting filter + # https://en.wikipedia.org/wiki/A-weighting + freqs = np.fft.fftfreq(FFT_SAMPLES, d=1 / SAMPLE_RATE) + A = 12194 ** 2 * freqs ** 4 / ((freqs ** 2 + 20.6 ** 2) * (freqs ** 2 + 12194 ** 2) * np.sqrt((freqs ** 2 + 107.7 ** 2) * (freqs ** 2 + 737.9 ** 2))) + return A / np.max(A) + + +def calculate_spl(measurements): + # https://www.engineeringtoolbox.com/sound-pressure-d_711.html + sound_pressure = np.sqrt(np.mean(measurements ** 2)) # RMS of amplitudes + if sound_pressure > 0: + sound_pressure_level = 20 * np.log10(sound_pressure / REFERENCE_SPL) # dB + else: + sound_pressure_level = 0 + return sound_pressure, sound_pressure_level + + +def apply_a_weighting(measurements: np.ndarray) -> np.ndarray: + # Generate a Hanning window of the same length as the audio measurements + measurements_windowed = measurements * np.hanning(len(measurements)) + + # Apply the A-weighting filter to the signal + return np.abs(np.fft.ifft(np.fft.fft(measurements_windowed) * get_a_weighting_filter())) + + +class Mic: + def __init__(self): + self.rk = Ratekeeper(RATE) + self.pm = messaging.PubMaster(['soundPressure', 'rawAudioData']) + self.params = Params() + + self.measurements = np.empty(0) + + self.sound_pressure = 0 + self.sound_pressure_weighted = 0 + self.sound_pressure_level_weighted = 0 + + self.lock = threading.Lock() + self.callback_count = 0 + self.last_audio_rms = 0.0 + self.last_audio_peak = 0.0 + self.last_device = None + self.last_status = None + + def update(self): + with self.lock: + sound_pressure = self.sound_pressure + sound_pressure_weighted = self.sound_pressure_weighted + sound_pressure_level_weighted = self.sound_pressure_level_weighted + callback_count = self.callback_count + audio_rms = self.last_audio_rms + audio_peak = self.last_audio_peak + device_name = self.last_device + status = self.last_status + + msg = messaging.new_message('soundPressure', valid=True) + msg.soundPressure.soundPressure = float(sound_pressure) + msg.soundPressure.soundPressureWeighted = float(sound_pressure_weighted) + msg.soundPressure.soundPressureWeightedDb = float(sound_pressure_level_weighted) + + self.pm.send('soundPressure', msg) + if callback_count % RATE == 0: + cloudlog.info( + f"micd health: callbacks={callback_count} rms={audio_rms:.6f} peak={audio_peak:.6f} " + f"device={device_name} status={status!r} livestream={self.params.get_bool('IsLiveStreaming')}" + ) + self.rk.keep_time() + + def callback(self, indata, frames, time, status): + """ + Using amplitude measurements, calculate an uncalibrated sound pressure and sound pressure level. + Then apply A-weighting to the raw amplitudes and run the same calculations again. + + Logged A-weighted equivalents are rough approximations of the human-perceived loudness. + """ + msg = messaging.new_message('rawAudioData', valid=True) + audio_data_int_16 = (indata[:, 0] * 32767).astype(np.int16) + msg.rawAudioData.data = audio_data_int_16.tobytes() + msg.rawAudioData.sampleRate = SAMPLE_RATE + self.pm.send('rawAudioData', msg) + + with self.lock: + self.callback_count += 1 + self.last_audio_rms = float(np.sqrt(np.mean(np.square(indata[:, 0])))) + self.last_audio_peak = float(np.max(np.abs(indata[:, 0]))) + self.last_status = str(status) if status else None + self.measurements = np.concatenate((self.measurements, indata[:, 0])) + + while self.measurements.size >= FFT_SAMPLES: + measurements = self.measurements[:FFT_SAMPLES] + + self.sound_pressure, _ = calculate_spl(measurements) + measurements_weighted = apply_a_weighting(measurements) + self.sound_pressure_weighted, self.sound_pressure_level_weighted = calculate_spl(measurements_weighted) + + self.measurements = self.measurements[FFT_SAMPLES:] + + @retry(attempts=10, delay=3) + def get_stream(self, sd): + # reload sounddevice to reinitialize portaudio + sd._terminate() + sd._initialize() + requested_device = os.environ.get("MICD_DEVICE") + device = int(requested_device) if requested_device is not None else None + return sd.InputStream(channels=1, samplerate=SAMPLE_RATE, callback=self.callback, blocksize=SAMPLE_BUFFER, device=device) + + def micd_thread(self): + # sounddevice must be imported after forking processes + import sounddevice as sd + + device = sd.default.device + if os.environ.get("MICD_DEVICE") is not None: + device = int(os.environ["MICD_DEVICE"]) + sd.default.device = (device, device) + self.last_device = f"{device}: {sd.query_devices(device)['name']}" if isinstance(device, int) else str(device) + cloudlog.info(f"micd selecting input device {self.last_device}") + + while True: + try: + with self.get_stream(sd) as stream: + cloudlog.info(f"micd stream started: {stream.samplerate=} {stream.channels=} {stream.dtype=} {stream.device=}, {stream.blocksize=}") + while True: + self.update() + except Exception: + # Some A1s wedge the audio DSP (ALSA EINVAL / ADSP_EFAILED until reboot). Dying here + # crash-loops the process and selfdrived raises a takeover alert mid-drive over a + # microphone - stay alive and keep retrying instead; recovers if the DSP comes back. + cloudlog.exception("micd: audio stream unavailable, retrying") + time.sleep(10) + + +def main(): + mic = Mic() + mic.micd_thread() + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/sentry.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/sentry.py new file mode 100644 index 000000000..0205903d5 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/sentry.py @@ -0,0 +1,171 @@ +"""Install exception handler for process crash.""" +import os +import shutil +import traceback +from datetime import datetime +import sentry_sdk +from enum import Enum +from sentry_sdk.integrations.threading import ThreadingIntegration + +from iqpilot.common.params import Params +from iqpilot.konn3kt.registration import UNREGISTERED_DONGLE_ID +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.version import get_build_metadata, get_version + +CRASHES_DIR = Paths.crash_log_root() +CRASH_UPLOADS_DIR = os.path.join(Paths.log_root(), "crash") + + +class SentryProject(Enum): + # python project + SELFDRIVE = "https://186a6736b7927e5ae9b92c869ba81b6b@o1138119.ingest.us.sentry.io/4508660076052480" + # native project + SELFDRIVE_NATIVE = SELFDRIVE + + +def _sentry_enabled() -> bool: + return os.getenv("IQPILOT_ENABLE_SENTRY", "0") == "1" + + +def _ensure_dir(path: str) -> None: + os.makedirs(path, exist_ok=True) + + +def _queue_crash_upload(src: str, name: str | None = None) -> None: + try: + _ensure_dir(CRASH_UPLOADS_DIR) + dest_name = name or os.path.basename(src) + shutil.copyfile(src, os.path.join(CRASH_UPLOADS_DIR, dest_name)) + except Exception: + cloudlog.exception("error when attempting to queue crash upload") + + +def report_tombstone(fn: str, message: str, contents: str) -> None: + cloudlog.error({'tombstone': message}) + + if not _sentry_enabled(): + return + + with sentry_sdk.configure_scope() as scope: + set_user() + scope.set_extra("tombstone_fn", fn) + scope.set_extra("tombstone", contents) + sentry_sdk.capture_message(message=message) + sentry_sdk.flush() + + +def capture_exception(*args, **kwargs) -> None: + cloudlog.error("crash", exc_info=kwargs.get('exc_info', 1)) + + try: + save_exception(traceback.format_exc()) + + if not _sentry_enabled(): + return + + set_user() + sentry_sdk.capture_exception(*args, **kwargs) + sentry_sdk.flush() # https://github.com/getsentry/sentry-python/issues/291 + except Exception: + cloudlog.exception("sentry exception") + + +def save_exception(content: str) -> None: + try: + _ensure_dir(CRASHES_DIR) + commit = (get_build_metadata().openpilot.git_commit or "nocommit")[:8] + + dated_fn = os.path.join(CRASHES_DIR, datetime.now().strftime("%Y-%m-%d--%H-%M-%S.log")) + files = [ + dated_fn, + os.path.join(CRASHES_DIR, "error.log") + ] + + for fn in files: + with open(fn, 'w') as f: + if os.path.basename(fn) == "error.log": + lines = content.splitlines()[-3:] + f.write("\n".join(lines)) + else: + f.write(content) + + upload_name = f"{os.path.splitext(os.path.basename(dated_fn))[0]}_{commit}_python.log" + _queue_crash_upload(dated_fn, upload_name) + cloudlog.error(f"logged crash to {files}") + except Exception: + cloudlog.exception("error when attempting to save exception") + + +def capture_fingerprint_mock() -> None: + try: + set_user() + message = "car doesn't match any fingerprints" + sentry_sdk.capture_message(message=message, level="error") + sentry_sdk.flush() + except Exception as e: + cloudlog.exception(f"sentry fingerprint MOCK exception: {e}") + + +def capture_fingerprint(candidate: str, car_name: str) -> None: + try: + set_user() + sentry_sdk.set_tag("carFingerprint", candidate) + sentry_sdk.set_tag("carName", car_name) + + message = f"Fingerprinted {candidate}" + sentry_sdk.capture_message(message=message, level="info") + sentry_sdk.flush() + except Exception as e: + cloudlog.exception(f"sentry fingerprint exception: {e}") + + +def set_tag(key: str, value: str) -> None: + sentry_sdk.set_tag(key, value) + + +def set_user() -> None: + dongle_id, git_username = get_properties() + sentry_sdk.set_user({"id": dongle_id, "name": git_username}) + + +def get_properties() -> tuple[str, str]: + params = Params() + hardware_serial: str = params.get("HardwareSerial") or "" + git_username: str = params.get("GithubUsername") or "" + dongle_id: str = params.get("DongleId") or f"{UNREGISTERED_DONGLE_ID}-{hardware_serial}" + + return dongle_id, git_username + + +def init(project: SentryProject) -> bool: + if not _sentry_enabled(): + cloudlog.info("Sentry disabled, using local crash logging + konn3kt uploader") + return False + + build_metadata = get_build_metadata() + + env = build_metadata.channel_type + dongle_id, git_username = get_properties() + + integrations = [] + if project == SentryProject.SELFDRIVE: + integrations.append(ThreadingIntegration(propagate_hub=True)) + + sentry_sdk.init(project.value, + default_integrations=False, + release=get_version(), + integrations=integrations, + traces_sample_rate=1.0, + max_value_length=8192, + environment=env) + + sentry_sdk.set_user({"id": dongle_id, "name": git_username}) + sentry_sdk.set_tag("dirty", build_metadata.openpilot.is_dirty) + sentry_sdk.set_tag("origin", build_metadata.openpilot.git_origin) + sentry_sdk.set_tag("branch", build_metadata.channel) + sentry_sdk.set_tag("commit", build_metadata.openpilot.git_commit) + sentry_sdk.set_tag("device", HARDWARE.get_device_type()) + + return True diff --git a/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/version.py b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/version.py new file mode 100644 index 000000000..cb731d009 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/_iqclosure/iqpilot/system/version.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 +from dataclasses import dataclass +from functools import cache +import json +import os +import pathlib +import subprocess + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_commit_date + +RELEASE_IQ_BRANCHES = ['release', 'release-tici', 'release-new'] +TESTED_BRANCHES = RELEASE_IQ_BRANCHES +IQ_BRANCH_MIGRATIONS: dict[tuple[str, str], str] = {} + +BUILD_METADATA_FILENAME = "build.json" + +training_version: str = "0.2.0" +terms_version: str = "2" + + +UNKNOWN_VERSION = "0.0.0" + + +@cache +def get_version(path: str = BASEDIR) -> str: + try: + with open(os.path.join(path, "iqpilot", "common", "version.h")) as _versionf: + return _versionf.read().split('"')[1] + except (OSError, IndexError): + return UNKNOWN_VERSION + + +def get_release_notes(path: str = BASEDIR) -> str: + for rel in (("iqpilot", "docs", "CHANGELOG.md"), ("docs", "CHANGELOG.md")): + try: + with open(os.path.join(path, *rel)) as f: + return f.read().split('\n\n', 1)[0] + except OSError: + continue + return "" + + +@cache +def is_prebuilt(path: str = BASEDIR) -> bool: + return os.path.exists(os.path.join(path, 'prebuilt')) + + +@cache +def is_dirty(cwd: str = BASEDIR) -> bool: + if not get_origin() or not get_short_branch(): + return True + + dirty = False + try: + # Actually check dirty files + if not is_prebuilt(cwd): + # This is needed otherwise touched files might show up as modified + try: + subprocess.check_call(["git", "update-index", "--refresh"], cwd=cwd) + except subprocess.CalledProcessError: + pass + + branch = get_branch() + if not branch: + return True + dirty = (subprocess.call(["git", "diff-index", "--quiet", branch, "--"], cwd=cwd)) != 0 + except subprocess.CalledProcessError: + cloudlog.exception("git subprocess failed while checking dirty") + dirty = True + + return dirty + + +@dataclass +class OpenpilotMetadata: + version: str + release_notes: str + git_commit: str + git_origin: str + git_commit_date: str + build_style: str + is_dirty: bool # whether there are local changes + + @property + def short_version(self) -> str: + return self.version.split('-')[0] + + @property + def comma_remote(self) -> bool: + # note to fork maintainers, this is used for release metrics. please do not + # touch this to get rid of the orange startup alert. there's better ways to do that + return self.git_normalized_origin == "github.com/commaai/openpilot" + + @property + def iqpilot_remote(self) -> bool: + return self.git_normalized_origin in ("github.com/iqpilot/iqpilot", + "github.com/iqpilot/openpilot") + + @property + def git_normalized_origin(self) -> str: + return self.git_origin \ + .replace("git@", "", 1) \ + .replace(".git", "", 1) \ + .replace("https://", "", 1) \ + .replace(":", "/", 1) + + +@dataclass +class BuildMetadata: + channel: str + openpilot: OpenpilotMetadata + + @property + def tested_channel(self) -> bool: + return self.channel in TESTED_BRANCHES + + @property + def release_channel(self) -> bool: + return self.channel in RELEASE_IQ_BRANCHES + + @property + def canonical(self) -> str: + return f"{self.openpilot.version}-{self.openpilot.git_commit}-{self.openpilot.build_style}" + + @property + def ui_description(self) -> str: + return f"{self.openpilot.version} / {self.openpilot.git_commit[:6]} / {self.channel}" + + @property + def master_channel(self) -> bool: + return self.channel in RELEASE_IQ_BRANCHES + + @property + def development_channel(self) -> bool: + return self.channel == "dev" or self.channel.startswith("dev-") or self.channel.endswith("-prebuilt") + + @property + def channel_type(self) -> str: + if "-tici" in self.channel or self.channel in ("release-new" or "master-mici"): + return "tici" + elif self.development_channel: + return "development" + elif self.tested_channel: + return "staging" + elif self.master_channel: + return "master" + elif self.release_channel: + return "release" + else: + return "feature" + + +def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: + channel = build_metadata.get("channel", "unknown") + openpilot_metadata = build_metadata.get("openpilot", {}) + version = openpilot_metadata.get("version", "unknown") + release_notes = openpilot_metadata.get("release_notes", "unknown") + git_commit = openpilot_metadata.get("git_commit", "unknown") + git_origin = openpilot_metadata.get("git_origin", "unknown") + git_commit_date = openpilot_metadata.get("git_commit_date", "unknown") + build_style = openpilot_metadata.get("build_style", "unknown") + return BuildMetadata(channel, + OpenpilotMetadata( + version=version, + release_notes=release_notes, + git_commit=git_commit, + git_origin=git_origin, + git_commit_date=git_commit_date, + build_style=build_style, + is_dirty=False)) + + +def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: + build_metadata_path = pathlib.Path(path) / BUILD_METADATA_FILENAME + + if build_metadata_path.exists(): + build_metadata = json.loads(build_metadata_path.read_text()) + return build_metadata_from_dict(build_metadata) + + git_folder = pathlib.Path(path) / ".git" + + if git_folder.exists(): + return BuildMetadata(get_short_branch(path), + OpenpilotMetadata( + version=get_version(path), + release_notes=get_release_notes(path), + git_commit=get_commit(path), + git_origin=get_origin(path), + git_commit_date=get_commit_date(path), + build_style="unknown", + is_dirty=is_dirty(path))) + + cloudlog.exception("unable to get build metadata") + raise Exception("invalid build metadata") + + +if __name__ == "__main__": + print(get_build_metadata()) diff --git a/artifacts/iqpilot_emac_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_emac_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/__init__.py b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/__init__.py new file mode 100644 index 000000000..5ece1c074 --- /dev/null +++ b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" diff --git a/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/bulk_transport.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/bulk_transport.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..df0ee109a Binary files /dev/null and b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/bulk_transport.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/ffs_holder.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/ffs_holder.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..8d73db59b Binary files /dev/null and b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/ffs_holder.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/mac_client.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/mac_client.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..792dea995 Binary files /dev/null and b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/mac_client.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/mac_protocol.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/mac_protocol.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..adfe15cf6 Binary files /dev/null and b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/mac_protocol.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/maciqmodeld.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/maciqmodeld.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..5c00696b1 Binary files /dev/null and b/artifacts/iqpilot_emac_private/python/iqpilot_private/emac/maciqmodeld.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/manifest.json b/artifacts/iqpilot_hephaestusd_private/manifest.json new file mode 100644 index 000000000..3543cbcf0 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/manifest.json @@ -0,0 +1,559 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "4971aeda24749e9b8554757d9655115369b1764789afc80d8b4639dba812cba6", + "size": 1950 + }, + "python/_iqclosure/iqpilot/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/api/__init__.py": { + "mode": 420, + "sha256": "97d6e0d8cbd3e47797d734322b42d04efea4d95a2dae5a56f1baef3fd847aa0d", + "size": 939 + }, + "python/_iqclosure/iqpilot/common/api/base.py": { + "mode": 420, + "sha256": "be55c83869bad911ee0204e8779b4673653f7d29ae4f524c978a280bd84c7777", + "size": 3187 + }, + "python/_iqclosure/iqpilot/common/api/comma_connect.py": { + "mode": 420, + "sha256": "e7c2dd0b56fb8533c2cbc614e728a9ffc5ce7360524cfa62a02f5235bc23b9a8", + "size": 267 + }, + "python/_iqclosure/iqpilot/common/atlas_alerts.py": { + "mode": 420, + "sha256": "ef0d867f6213bb67ed6b7fd6ef4e694eb1705d9dc694163a80c8dd9572932954", + "size": 9448 + }, + "python/_iqclosure/iqpilot/common/basedir.py": { + "mode": 420, + "sha256": "58cfa5d6405903ee1acecc4544463bb8f47a66921b120c382143aa80d8539b28", + "size": 106 + }, + "python/_iqclosure/iqpilot/common/constants.py": { + "mode": 420, + "sha256": "fc439d59c24b95ed349b84f1a5862df3ea50e0891dbec4ea3cf5e1e0ccff6513", + "size": 434 + }, + "python/_iqclosure/iqpilot/common/file_helpers.py": { + "mode": 420, + "sha256": "3c661d05dea697fae741b3e65a93385e4e0f5941eae8e8f4ea64da8da90e2f52", + "size": 67 + }, + "python/_iqclosure/iqpilot/common/git_creds.py": { + "mode": 420, + "sha256": "aab57b08d1907d0a761111e2a9a415af990475a55307c0ced6f2573664abbc49", + "size": 7327 + }, + "python/_iqclosure/iqpilot/common/gpio.py": { + "mode": 420, + "sha256": "01ba8cb32a644a2df545e764ba19bf1c7a320a217f983f8bac73b45d3a6891cf", + "size": 2408 + }, + "python/_iqclosure/iqpilot/common/i2c.py": { + "mode": 420, + "sha256": "4af8f9da7504a548d15f18b91d71c1379cb7c05c84be031448764cc49920ce68", + "size": 2449 + }, + "python/_iqclosure/iqpilot/common/issue_debug.py": { + "mode": 420, + "sha256": "73a10d846c735d4bcfda65f7828aa82192349b53920cb9d1b01cef8c211982fe", + "size": 1128 + }, + "python/_iqclosure/iqpilot/common/logging_extra.py": { + "mode": 420, + "sha256": "ce9b3b3d8498d76e1c4c0352a3e98e72759bb7f367ff8629c1329c46040595c3", + "size": 6628 + }, + "python/_iqclosure/iqpilot/common/realtime.py": { + "mode": 420, + "sha256": "f137ef62c1602a1f7c329731883dc518c62288bd25596891858d460ae3209ae2", + "size": 3966 + }, + "python/_iqclosure/iqpilot/common/spinner.py": { + "mode": 420, + "sha256": "33a2eb2aa3148492414035c5dc7150b3a69467905d7a3e58c8f65cfe70d3552c", + "size": 1371 + }, + "python/_iqclosure/iqpilot/common/swaglog.py": { + "mode": 420, + "sha256": "0a133b4ef49f80b8890f115e81273f3f3e21351ae79f92dc02abc033e6d24027", + "size": 5274 + }, + "python/_iqclosure/iqpilot/common/time_helpers.py": { + "mode": 420, + "sha256": "c14cda1f84149d5ffa63a2adec5ca24126f77c1412a78412e5e3e68a6fd12bcf", + "size": 474 + }, + "python/_iqclosure/iqpilot/common/utils.py": { + "mode": 420, + "sha256": "6475ad94bc89252398c41e9eabf7929ba5eb8fa23a08ad7545e7a67b400af9f3", + "size": 8090 + }, + "python/_iqclosure/iqpilot/common/version.py": { + "mode": 420, + "sha256": "c04a243c77a170b750bad283da5e92bc6b1072bb674ece20dfa4eb9ec2d90309", + "size": 106 + }, + "python/_iqclosure/iqpilot/konn3kt/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/konn3kt/cloud_client.py": { + "mode": 420, + "sha256": "4d58e62f8d628a8570881f2b87c82c801b46928fbb84f8dab8a81a9b55ba4e15", + "size": 493 + }, + "python/_iqclosure/iqpilot/konn3kt/registration.py": { + "mode": 420, + "sha256": "d8da8fa6373d54c3090b4466a975969317c9f5cd7c0ba20fd905e11ce9b95efd", + "size": 7948 + }, + "python/_iqclosure/iqpilot/konn3kt/service_health.py": { + "mode": 420, + "sha256": "10fa7d8490322275963308a1162ac5a0d0e3a96ac4a4771884eb2d3ec69fb480", + "size": 264 + }, + "python/_iqclosure/iqpilot/selfdrive/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/car/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/car/vehicle_catalog.json": { + "mode": 420, + "sha256": "205c2220b1e04bbb7400bcde757543dd538f6b9929fe0cac624da0195c878550", + "size": 122245 + }, + "python/_iqclosure/iqpilot/selfdrive/car/vehicle_catalog.py": { + "mode": 420, + "sha256": "8193cfcd9bda8651bf93f8d629996a22c760a42351c35a10c94329ab23fbf3f3", + "size": 2380 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py": { + "mode": 420, + "sha256": "056c744bbd9f1fe1053555d9b1fc1257d53093d69ddc94be3f05d840eb70781c", + "size": 3590 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py": { + "mode": 420, + "sha256": "0b8f118dc45ad0c3809855800960b47c893ee121ea75d94e8569dcce46d58ce5", + "size": 7312 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py": { + "mode": 420, + "sha256": "eb3ebc7065a863d51d5bb4359d68f26fc2f1929e1d7e044377f15cf5bac7f77d", + "size": 367 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py": { + "mode": 420, + "sha256": "27aade5852507baf84ed460b9446d0de4df58a4a535b82c301113040b7ba472a", + "size": 7305 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py": { + "mode": 420, + "sha256": "5865243a95ca4557d2a960302124a9898545cc3a8387e88ef569308e3d0f7077", + "size": 119 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py": { + "mode": 420, + "sha256": "23622cdec9eed5649a05422ba19eae956ba16a63850927af4a222c3d9030a1bb", + "size": 399 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py": { + "mode": 420, + "sha256": "e4f524c7595754fd9db86724a7bd9b67524c630275ac78599ab6838d1aa7d809", + "size": 11037 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/locationd/calibrationd.py": { + "mode": 420, + "sha256": "6bceebb5a15895d2b6d20a28cbd14b9112f9422e0a0cf466314a7e8779da39dc", + "size": 15698 + }, + "python/_iqclosure/iqpilot/selfdrive/selfdrived/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/selfdrived/alertmanager.py": { + "mode": 420, + "sha256": "c601bac30951a750d3ebf3d30f06c597bacd148210b1c405d5d3eca79bb7c4e3", + "size": 2045 + }, + "python/_iqclosure/iqpilot/selfdrive/selfdrived/events.py": { + "mode": 420, + "sha256": "5e37693eeced1e3ba81f03234b7b0dad33b7564826d232d288998be5fae7efd6", + "size": 37038 + }, + "python/_iqclosure/iqpilot/selfdrive/ui/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/ui/feedback/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/ui/feedback/feedbackd.py": { + "mode": 420, + "sha256": "7c1e6cb2c3c2c6aae91210f6cbc5c372f33c28cc3edb292ef71439b83844615d", + "size": 2615 + }, + "python/_iqclosure/iqpilot/system/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/__init__.py": { + "mode": 420, + "sha256": "889391bffca493e74bfc108cae2976a53b644caca13ab600061fd29e9622c627", + "size": 695 + }, + "python/_iqclosure/iqpilot/system/hardware/base.py": { + "mode": 420, + "sha256": "a56293f7c23e503ff62d0d3ed39f1831b5544a65b37378165934361a5ddcd304", + "size": 4966 + }, + "python/_iqclosure/iqpilot/system/hardware/hw.py": { + "mode": 420, + "sha256": "c69185d8f6482c8b021f687b793246d2e2ede853e89a88748c64b85f60711b59", + "size": 3638 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/hardware.py": { + "mode": 420, + "sha256": "2520895597c375ae570bd04d5f189e874c89d642f3f07bdbeb20388cb6691433", + "size": 258 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py": { + "mode": 420, + "sha256": "98f46f8705259b00efae7274186b4e68201aad467a19de4f16d5f850d10ab0b5", + "size": 7585 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/esim_manager.py": { + "mode": 420, + "sha256": "ac8d6d33286a021b0e1591329b779742d73993279d3f4c56e933cd7efd3114c8", + "size": 10930 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/hardware.py": { + "mode": 420, + "sha256": "f1ddffa9bdb5071a49fd65eb4b49958b60b1873e1ec70e6f3f2e2b2501abce2f", + "size": 25584 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py": { + "mode": 420, + "sha256": "d22858982705531732d5a20a45a73795496e5bbd9e23028c24609a7e58ac7aed", + "size": 890 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/lpa.py": { + "mode": 420, + "sha256": "2bffb84aef35892c4788e80b6d937bf2eebd15e226b72a82c4f39217667c1ca0", + "size": 53692 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/pins.py": { + "mode": 420, + "sha256": "b57ba4262e6a6a79f2db15c27356acf3e54f579a7edd13b483b2e16d140aca6d", + "size": 678 + }, + "python/_iqclosure/iqpilot/system/hardware/usb.py": { + "mode": 420, + "sha256": "7c2cd7c6d5a859fb8454059da1b36e3b5ce4639aca6fea296b4f91096b46c1ba", + "size": 7257 + }, + "python/_iqclosure/iqpilot/system/loggerd/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/loggerd/xattr_cache.py": { + "mode": 420, + "sha256": "3aec77de0fe1ac5d32bef6cf59c4eeab3fcc37c86de42bdc1a9d730166225295", + "size": 991 + }, + "python/_iqclosure/iqpilot/system/manager/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/manager/process.py": { + "mode": 420, + "sha256": "d036d82e2163a249186238375fb82f8dca250fae2272428ea47a46e4d6a8649d", + "size": 11519 + }, + "python/_iqclosure/iqpilot/system/manager/process_config.py": { + "mode": 420, + "sha256": "8b8de3f4d266213530dbc37248cf86c6a36241ec9b2f04afe0389e126fd2282f", + "size": 13597 + }, + "python/_iqclosure/iqpilot/system/micd.py": { + "mode": 420, + "sha256": "1a59cbe6b72fcca5723ab56dc09f52039817299071a8d8da37f04acea58776bc", + "size": 5977 + }, + "python/_iqclosure/iqpilot/system/sentry.py": { + "mode": 420, + "sha256": "c3da338feb533937b6a5258ee450b6a3ff7a77b69cc9e48e31d16b875855caf3", + "size": 5229 + }, + "python/_iqclosure/iqpilot/system/ui/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/ui/lib/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/ui/lib/networkmanager.py": { + "mode": 420, + "sha256": "5d239320755efad6e88df237af763ed206ee37c0c8200db93bbdb0e0c884eb56", + "size": 1717 + }, + "python/_iqclosure/iqpilot/system/ui/lib/os_update.py": { + "mode": 420, + "sha256": "f5b87e4e4b43d591eff61472922781ac41f2d43d10d2fe095207e7c14951dbd6", + "size": 4444 + }, + "python/_iqclosure/iqpilot/system/ui/lib/wifi_manager.py": { + "mode": 420, + "sha256": "c9fe91484344f154726b0cab62a19f58a172e4f06dfd6341ca9b179c0c4646a8", + "size": 41618 + }, + "python/_iqclosure/iqpilot/system/version.py": { + "mode": 420, + "sha256": "3a6bc7520dae7944a1da6f911cd090704a463e011f39949ea6c9df51b0e8c616", + "size": 6033 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/backups/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "8d8808534c26b97369f5a69da3afbb2f6bdb2e2708c2479ff55a07574eab3cbd", + "size": 135552 + }, + "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "5ec7c8dc4e4d21f47b9e949a8960baacb470ab267752681ae840ea537646d29a", + "size": 67664 + }, + "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "91e0fab17809c6a7231a956ef082033c906a8e5e44972a10bd32f9b653d634ea", + "size": 204640 + }, + "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "d7356d8cb1ef60ac025ec806f6fe1c1c734c234f5fe5256f17c1bfd3ff36052f", + "size": 69768 + }, + "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "58c1601759b2f61b942d18bf7a07d16050c53424337882e040afb6d083dbd4a4", + "size": 203088 + }, + "python/iqpilot_private/konn3kt/flockd/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "3dea6e1a02a92a5cbebda37b768bcb4ba65224b4920307cded9247f738e6bdfe", + "size": 202184 + }, + "python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "34a58774d1243add0c0dc5cc95d78e0b17b13ede3bbfb8f0de63dd47a4c6a39f", + "size": 68080 + }, + "python/iqpilot_private/konn3kt/hephaestus/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip": { + "mode": 420, + "sha256": "60ce72178566082562ceeeeb84693f04640a2436d5d6c88657ee10fbf570adaa", + "size": 1379342 + }, + "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "c83f7947d210eee887750ca5e494e859cd6a099371eede6740282ee5f95fc725", + "size": 268080 + }, + "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "f7e0c6471e5ae85e4bdb7225d60cdd67e2a54bd7e9386436e6f9eef7249354b3", + "size": 406176 + }, + "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "83e7f6f18984c947811e2a17707def76fc2e563aea9eb37e9f37f5e09e377548", + "size": 68048 + }, + "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "20f4505b5c0a320c2bab7f5026f55a0a405d85840b40f89a624b417f764f8a07", + "size": 335848 + }, + "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "b1a14c8534fc8b20bef3661b9390db53a3f39086337d241f931af72a368f7da2", + "size": 272112 + }, + "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "cf3c6b74668adb6f8830e52c25aa17f4211c5fe4cbea88e50dbd3c077e92bd84", + "size": 134408 + }, + "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "2f30fe07926a2b6d51c6ec88ee4d57d0895d841e080bd3866a8750b5f9608aa1", + "size": 3915272 + }, + "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "823b330d38eac09dbc22a01d1abe00d110f9d2cf8c5dc489ce58b05050db3dbe", + "size": 136472 + }, + "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "02b76b8792b8f62ec4278dad6e63e5c8574479b8e714538c2cc73ebc216872eb", + "size": 68208 + }, + "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "46197da34eed0bf10c17baf32081b6a9871ddc9f3807f5de376e41699286e38c", + "size": 67840 + }, + "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "144af2138c5e8f90c8432d9b90a8acafe995c1a030eb864aeb4e1b210b53b871", + "size": 135664 + }, + "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "3918430ba6f7dd7b654c73222bb7444afa2ef78be7bf595092b0813cebd61606", + "size": 269600 + }, + "python/iqpilot_private/konn3kt/uploaderd/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "77a0da7cf61eaa05df08c448460cb2e563929ee7c41257d9b5f0814d6d32016f", + "size": 336280 + }, + "runtime": { + "entries": { + "iqpilot_private.konn3kt.backups.backup_orchestrator": { + "path": "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.flockd.flockd": { + "path": "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.hephaestus.ble_transportd": { + "path": "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.hephaestus.cloud_routes": { + "path": "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.hephaestus.hephaestusd": { + "path": "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.hephaestus.manage_hephaestusd": { + "path": "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.hephaestus.motd": { + "path": "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.hephaestus.vw_pq_flasher": { + "path": "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.uploaderd.iquploaderd": { + "path": "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "lRrLXy0fYvSR0U/mJbw1BXUacNm7Jc6YRknVHM8DuT0gGsLp0y0xrYXSlarISHznZvV0JbPsNf3wgbQA5NZ3CA==", + "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "H0GqhuuUrSJYyT4UXbf7GujRXxGx/zgIn+ZDaiyjPghcYdy64bGH2fVWwEm69OC409ZtVB0sI69GlqGPMKF/Dg==", + "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "sF93qmp1nxbSBfqq0FBr/jI8QK1jP3wQgEYoys3McYNfC3IOk6V7eqL1AZz8Rj20j7Iu1TOpWsGsSVxo+G0xAg==", + "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "FcuWnfFQt7EWTRH5Lev1PhNpQposz/8d6p8DK6Jg7Zi+Rf93GUDgg3/t74IjHTq+aPSvR1J1ArKAUGRstGmpDw==", + "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "UkRfnbDSg3UPzTL6BgLM3pXTOKUqo/QA/DP1qCUVYWm7hTGX5balWH3inYKaxQTP6WkbIm0dGusMT2pldW7JAg==", + "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "VLvLBhbqm6+V8udYUKpv7hXQygiu3scB6FXmfjyRVKLvGcCsVUA2LKLNtH8Ff+TPsdEXRp7wCBMrVBVUslCiBA==", + "python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "b9jhc7aE//J2/bE8fyglw3hO+KKSOEjnzDzKSPmfL+bVmVUvtdN/F/1lpvdYrb2RalkBvl7ktFOgymZKn0vrBA==", + "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "IovyDAeYBOAC8yv67H+UqiicwOd210iwDXMvNuTXbU4lbq0xuqa1uy7t/oCClt4P0BhZLgvJQ0KI/jqMRsbxBA==", + "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "xmIlShogvGuAh7RJOaOJSV/oB7EhvUpjPFiPHah97yvwg+pmrDYy2avmjWM8wCE3kKrKCFgEVW6ye6u4Eo0wCA==", + "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "Zbj2hW+Z5TMeXrXOVd7htJ1KAOkEOX7W4jqj1hulsO/hsUEzcIBFEYkCTGzEJ7jkU7QO1LzUjT04WyqlRAgOAA==", + "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "L+gCCPfiImd9gqtJ0jnSKzRWYnJjqB8f1ixz7WFJGDipbjMF1NDj24nwYLE21oUAqTdDSVnb3bQG9gtLkNbeBg==", + "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "Tu14xhw8hc5vgg0oJ4vYZSwuml+k80ZrWjf8VgTefxvG8JGvm4ZwZ34lVdesUfvZCAVCszkEUustAXVhTLu0Cw==", + "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "VvPIQ0Ffu2K0T806hzzK5sLdAtL6I0ORgLVW6Hl4VNgzwJucMPSHQChFn3q94G7KhD20F1g0UvBF+0NrgRVCDg==", + "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "qMi6U7oxlcOf9s3O+o2mFRorOYNxjK/MPrw0JxRJ2cVgG64hbzXou1yw/LZTVTAjun/EGCJgfXC313G/nGP9Cg==", + "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "/kjgZ33Ev8UgrJtqsyGWCMp5IIeqk6Kb9UGpwzZE5jrJiym15HjVQZnfWIqAECUOxBnJsIKrun5tcKKndfgsAQ==", + "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "/eUDZy8k0jVHALTMabHt3f9Va3xGc2FnXUX0ly7oSqaWPsoB/CivrxP+jlc5NcKNsigwqox97lDye291B1LOBg==", + "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "C+ObT5E4w707z7kVKW89SUsEzVb7ZExmDLKXnTh1a2oa92hzRusH60iIEMF8ofL0eZBORRmbNVsewVEEGQ6ZDQ==", + "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "2vqBy+02ldRHcVMlKUT+Vk6Hz7diGSxVct+FK/LcMCpXg5N51YqhvX5YdBgtZWnQpbvIPi1wyr9Zqs3oIT5hAw==", + "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "uHyniVaxBLNTVLx/40UH6pifUZF/xwwo9Jd8slS+0lyhAXMuZnmoQoHnaJRN4adTuEGOyKKyi/wisjFASuwqCA==", + "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "No8Xim23VntTR9aceGofLd/vNC3jVQSZ9PmB3qwS5osNqdUrEh/5Y5RpXWKU2/azhsOMqnlbT0ppARqNGVDKCQ==" + } +} diff --git a/artifacts/iqpilot_hephaestusd_private/manifest.json.sig b/artifacts/iqpilot_hephaestusd_private/manifest.json.sig new file mode 100644 index 000000000..5108cec68 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/manifest.json.sig @@ -0,0 +1 @@ +Li23uJ7UFsHmYsNYtk8ZvF7oFHZoV8tl9yuzsFSkEzPBnX5MQJwpihQtEwVC1mn1EAHwyjj7nJ/uaZww1o9wCg== diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..ff65a9a08 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/_vendored.json @@ -0,0 +1,56 @@ +[ + "iqpilot.common.api", + "iqpilot.common.api.base", + "iqpilot.common.api.comma_connect", + "iqpilot.common.atlas_alerts", + "iqpilot.common.basedir", + "iqpilot.common.constants", + "iqpilot.common.file_helpers", + "iqpilot.common.git_creds", + "iqpilot.common.gpio", + "iqpilot.common.i2c", + "iqpilot.common.issue_debug", + "iqpilot.common.logging_extra", + "iqpilot.common.realtime", + "iqpilot.common.spinner", + "iqpilot.common.swaglog", + "iqpilot.common.time_helpers", + "iqpilot.common.utils", + "iqpilot.common.version", + "iqpilot.konn3kt.cloud_client", + "iqpilot.konn3kt.registration", + "iqpilot.konn3kt.service_health", + "iqpilot.selfdrive.car.vehicle_catalog", + "iqpilot.selfdrive.iqmodeld.config", + "iqpilot.selfdrive.iqmodeld.egpu_helpers", + "iqpilot.selfdrive.iqmodeld.egpu_model", + "iqpilot.selfdrive.iqmodeld.model_bundle_downloader", + "iqpilot.selfdrive.iqmodeld.models", + "iqpilot.selfdrive.iqmodeld.models.fetcher", + "iqpilot.selfdrive.iqmodeld.models.helpers", + "iqpilot.selfdrive.locationd.calibrationd", + "iqpilot.selfdrive.selfdrived.alertmanager", + "iqpilot.selfdrive.selfdrived.events", + "iqpilot.selfdrive.ui.feedback.feedbackd", + "iqpilot.system.hardware", + "iqpilot.system.hardware.base", + "iqpilot.system.hardware.hw", + "iqpilot.system.hardware.pc.hardware", + "iqpilot.system.hardware.tici", + "iqpilot.system.hardware.tici.amplifier", + "iqpilot.system.hardware.tici.esim_manager", + "iqpilot.system.hardware.tici.hardware", + "iqpilot.system.hardware.tici.iwlist", + "iqpilot.system.hardware.tici.lpa", + "iqpilot.system.hardware.tici.pins", + "iqpilot.system.hardware.usb", + "iqpilot.system.loggerd.xattr_cache", + "iqpilot.system.manager.process", + "iqpilot.system.manager.process_config", + "iqpilot.system.micd", + "iqpilot.system.sentry", + "iqpilot.system.ui.lib.networkmanager", + "iqpilot.system.ui.lib.os_update", + "iqpilot.system.ui.lib.wifi_manager", + "iqpilot.system.version" +] diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/__init__.py new file mode 100644 index 000000000..7c7b26fc2 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/__init__.py @@ -0,0 +1,26 @@ +import iqpilot.common.api.comma_connect + + +class Api: + def __init__(self, dongle_id): + self.service = iqpilot.common.api.comma_connect.CommaConnectApi(dongle_id) + + def request(self, method, endpoint, **params): + return self.service.request(method, endpoint, **params) + + def get(self, *args, **kwargs): + return self.service.get(*args, **kwargs) + + def post(self, *args, **kwargs): + return self.service.post(*args, **kwargs) + + def get_token(self, payload_extra=None, expiry_hours=1): + return self.service.get_token(payload_extra, expiry_hours) + + +def api_get(endpoint, method='GET', timeout=None, access_token=None, session=None, **params): + return iqpilot.common.api.comma_connect.CommaConnectApi(None).api_get(endpoint, method, timeout, access_token, session, **params) + + +def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]: + return iqpilot.common.api.comma_connect.CommaConnectApi(None).get_key_pair() diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/base.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/base.py new file mode 100644 index 000000000..8170a19b2 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/base.py @@ -0,0 +1,84 @@ +import jwt +import os +import requests +import unicodedata +from datetime import datetime, timedelta, UTC +from functools import lru_cache +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.version import get_version + +# name: jwt signature algorithm +KEYS = {"id_rsa": "RS256", + "id_ecdsa": "ES256"} + + +@lru_cache(maxsize=4) +def load_signing_key(private_key: str): + # PyJWT re-parses a PEM string on every encode; an RSA parse is ~40ms, so cache the key object + try: + from cryptography.hazmat.primitives.serialization import load_pem_private_key + return load_pem_private_key(private_key.encode(), password=None) + except Exception: + return private_key + + +class BaseApi: + def __init__(self, dongle_id, api_host, user_agent="openpilot-"): + self.dongle_id = dongle_id + self.api_host = api_host + self.user_agent = user_agent + self.jwt_algorithm, self.private_key, _ = self.get_key_pair() + + def get(self, *args, **kwargs): + return self.request('GET', *args, **kwargs) + + def post(self, *args, **kwargs): + return self.request('POST', *args, **kwargs) + + def request(self, method, endpoint, timeout=None, access_token=None, **params): + return self.api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params) + + def _get_token(self, payload_extra=None, expiry_hours=1, **extra_payload): + now = datetime.now(UTC).replace(tzinfo=None) + payload = { + 'identity': self.dongle_id, + 'nbf': now, + 'iat': now, + 'exp': now + timedelta(hours=expiry_hours), + **extra_payload + } + if payload_extra is not None: + payload.update(payload_extra) + key = load_signing_key(self.private_key) if self.private_key else self.private_key + token = jwt.encode(payload, key, algorithm=self.jwt_algorithm) + if isinstance(token, bytes): + token = token.decode('utf8') + return token + + def get_token(self, payload_extra=None, expiry_hours=1): + return self._get_token(payload_extra, expiry_hours) + + def remove_non_ascii_chars(self, text): + normalized_text = unicodedata.normalize('NFD', text) + ascii_encoded_text = normalized_text.encode('ascii', 'ignore') + return ascii_encoded_text.decode() + + def api_get(self, endpoint, method='GET', timeout=None, access_token=None, session=None, json=None, **params): + headers = {} + if access_token is not None: + headers['Authorization'] = "JWT " + access_token + + version = self.remove_non_ascii_chars(get_version()) + headers['User-Agent'] = self.user_agent + version + + # TODO: add session to Api + req = requests if session is None else session + return req.request(method, f"{self.api_host}/{endpoint}", timeout=timeout, headers=headers, json=json, params=params) + + @staticmethod + def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]: + for key in KEYS: + if os.path.isfile(Paths.persist_root() + f'/comma/{key}') and os.path.isfile(Paths.persist_root() + f'/comma/{key}.pub'): + with open(Paths.persist_root() + f'/comma/{key}') as private, open(Paths.persist_root() + f'/comma/{key}.pub') as public: + return KEYS[key], private.read(), public.read() + return None, None, None diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/comma_connect.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/comma_connect.py new file mode 100644 index 000000000..bc16d40eb --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/api/comma_connect.py @@ -0,0 +1,11 @@ +import os + +from iqpilot.common.api.base import BaseApi + +API_HOST = os.getenv('API_HOST', 'https://api-iqlabs.konn3kt.com') + + +class CommaConnectApi(BaseApi): + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "openpilot-" diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/atlas_alerts.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/atlas_alerts.py new file mode 100644 index 000000000..c261db844 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/atlas_alerts.py @@ -0,0 +1,281 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from bisect import insort +from collections.abc import Callable, Iterable +from dataclasses import dataclass, field +from enum import IntEnum + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car, log +from iqpilot.common.realtime import DT_CTRL +from iqpilot.system.hardware import HARDWARE + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus +VisualAlert = car.CarControl.HUDControl.VisualAlert +AudibleAlert = car.CarControl.HUDControl.AudibleAlert + + +def _frames_for(seconds: float) -> int: + return int(seconds / DT_CTRL) + + +class Tier(IntEnum): + LOWEST = 0 + LOWER = 1 + LOW = 2 + MID = 3 + HIGH = 4 + HIGHEST = 5 + + +class Tags: + ENABLE = "enable" + PRE_ENABLE = "preEnable" + OVERRIDE_LATERAL = "overrideLateral" + OVERRIDE_LONGITUDINAL = "overrideLongitudinal" + NO_ENTRY = "noEntry" + WARNING = "warning" + USER_DISABLE = "userDisable" + SOFT_DISABLE = "softDisable" + IMMEDIATE_DISABLE = "immediateDisable" + PERMANENT = "permanent" + + +@dataclass(slots=True) +class AlertCard: + alert_text_1: str + alert_text_2: str + alert_status: log.SelfdriveState.AlertStatus + alert_size: log.SelfdriveState.AlertSize + priority: Tier + visual_alert: car.CarControl.HUDControl.VisualAlert + audible_alert: car.CarControl.HUDControl.AudibleAlert + duration: int + creation_delay: float = 0.0 + alert_type: str = field(default="", init=False) + event_type: str | None = field(default=None, init=False) + + def __init__(self, + alert_text_1: str, + alert_text_2: str, + alert_status: log.SelfdriveState.AlertStatus, + alert_size: log.SelfdriveState.AlertSize, + priority: Tier, + visual_alert: car.CarControl.HUDControl.VisualAlert, + audible_alert: car.CarControl.HUDControl.AudibleAlert, + duration: float, + creation_delay: float = 0.0): + self.alert_text_1 = alert_text_1 + self.alert_text_2 = alert_text_2 + self.alert_status = alert_status + self.alert_size = alert_size + self.priority = priority + self.visual_alert = visual_alert + self.audible_alert = audible_alert + self.duration = _frames_for(duration) + self.creation_delay = creation_delay + self.alert_type = "" + self.event_type = None + + def __str__(self) -> str: + return f"{self.alert_text_1}/{self.alert_text_2} {self.priority} {self.visual_alert} {self.audible_alert}" + + +AlertFactory = Callable[[car.CarParams, car.CarState, messaging.SubMaster, bool, int, log.ControlsState], AlertCard] + + +def car_mode_entry_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> AlertCard: + del CS, sm, metric, soft_disable_time, personality + headline = "Enable Adaptive Cruise to Engage" + if CP.brand == "honda": + headline = "Enable Main Switch to Engage" + return NoEntryCard(headline) + + +class EventBook(ABC): + def __init__(self): + self._live_names: list[int] = [] + self._latched_names: list[int] = [] + self.event_counters: dict[int, int] = {} + + @property + def events(self) -> list[int]: + return self._live_names + + @events.setter + def events(self, values: list[int]) -> None: + self._live_names = values + + @property + def static_events(self) -> list[int]: + return self._latched_names + + @static_events.setter + def static_events(self, values: list[int]) -> None: + self._latched_names = values + + @property + def names(self) -> list[int]: + return list(self._live_names) + + def __len__(self) -> int: + return len(self._live_names) + + def add(self, event_name: int, static: bool = False) -> None: + if static: + insort(self._latched_names, event_name) + insort(self._live_names, event_name) + + def clear(self) -> None: + refreshed: dict[int, int] = {} + for event_name, frames_seen in self.event_counters.items(): + refreshed[event_name] = frames_seen + 1 if event_name in self._live_names else 0 + self.event_counters = refreshed + self._live_names = list(self._latched_names) + + def contains(self, event_type: str) -> bool: + board = self.get_events_mapping() + return any(event_type in board.get(event_name, {}) for event_name in self._live_names) + + def has(self, event_name: int) -> bool: + return event_name in self._live_names + + def contains_in_list(self, events_list: list[int]) -> bool: + return any(event_name in self._live_names for event_name in events_list) + + def remove(self, event_name: int, static: bool = False) -> None: + if static and event_name in self._latched_names: + self._latched_names.remove(event_name) + + if event_name in self._live_names: + self.event_counters[event_name] = self.event_counters.get(event_name, 0) + 1 + self._live_names.remove(event_name) + + def add_from_msg(self, events: Iterable) -> None: + for event in events: + insort(self._live_names, event.name.raw) + + def to_msg(self): + board = self.get_events_mapping() + outbound = [] + for event_name in self._live_names: + msg = self.get_event_msg_type().new_message() + msg.name = event_name + for event_kind in board.get(event_name, {}): + setattr(msg, event_kind, True) + outbound.append(msg) + return outbound + + def create_alerts(self, event_types: list[str], callback_args=None): + callback_args = [] if callback_args is None else callback_args + board = self.get_events_mapping() + spawned: list[AlertCard] = [] + for event_name in self._live_names: + variants = board.get(event_name, {}) + for event_type in event_types: + chosen = variants.get(event_type) + if chosen is None: + continue + alert = self._realize(chosen, callback_args) + age_frames = self.event_counters.get(event_name, 0) + 1 + if age_frames * DT_CTRL < alert.creation_delay: + continue + alert.alert_type = f"{self.get_event_name(event_name)}/{event_type}" + alert.event_type = event_type + spawned.append(alert) + return spawned + + @staticmethod + def _realize(candidate: AlertCard | AlertFactory, callback_args: list) -> AlertCard: + return candidate if isinstance(candidate, AlertCard) else candidate(*callback_args) + + @abstractmethod + def get_events_mapping(self) -> dict[int, dict[str, AlertCard | AlertFactory]]: + raise NotImplementedError + + @abstractmethod + def get_event_name(self, event: int) -> str: + raise NotImplementedError + + @abstractmethod + def get_event_msg_type(self): + raise NotImplementedError + + +def _mici_reframe(primary: str, secondary: str) -> tuple[str, str, log.SelfdriveState.AlertSize]: + if HARDWARE.get_device_type() == "mici": + return secondary, primary, AlertSize.small + return primary, secondary, AlertSize.mid + + +class NoEntryCard(AlertCard): + def __init__(self, + alert_text_2: str, + alert_text_1: str = "IQ.Pilot Unavailable", + visual_alert: car.CarControl.HUDControl.VisualAlert = VisualAlert.none, + priority: Tier = Tier.LOW): + primary, secondary, size = _mici_reframe(alert_text_1, alert_text_2) + super().__init__(primary, secondary, AlertStatus.normal, size, priority, visual_alert, AudibleAlert.refuse, 3.0) + + +class GentleDisableCard(AlertCard): + def __init__(self, alert_text_2: str): + super().__init__( + "TAKE CONTROL IMMEDIATELY", + alert_text_2, + AlertStatus.userPrompt, + AlertSize.full, + Tier.MID, + VisualAlert.steerRequired, + AudibleAlert.warningSoft, + 2.0, + ) + + +class PendingDisableCard(GentleDisableCard): + def __init__(self, alert_text_2: str): + super().__init__(alert_text_2) + self.alert_text_1 = "IQ.Pilot will disengage" + + +class HardDisableCard(AlertCard): + def __init__(self, alert_text_2: str): + super().__init__( + "TAKE CONTROL IMMEDIATELY", + alert_text_2, + AlertStatus.critical, + AlertSize.full, + Tier.HIGHEST, + VisualAlert.steerRequired, + AudibleAlert.warningImmediate, + 4.0, + ) + + +class ChimeCard(AlertCard): + def __init__(self, audible_alert: car.CarControl.HUDControl.AudibleAlert): + super().__init__("", "", AlertStatus.normal, AlertSize.none, Tier.MID, VisualAlert.none, audible_alert, 0.2) + + +class BannerCard(AlertCard): + def __init__(self, alert_text_1: str, alert_text_2: str = "", duration: float = 0.2, priority: Tier = Tier.LOWER, creation_delay: float = 0.0): + size = AlertSize.mid if alert_text_2 else AlertSize.small + super().__init__(alert_text_1, alert_text_2, AlertStatus.normal, size, priority, VisualAlert.none, AudibleAlert.none, duration, creation_delay) + + +class BootCard(AlertCard): + def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal): + if HARDWARE.get_device_type() == "mici": + compact_secondary = "" if alert_text_2 == "Always keep hands on wheel and eyes on road" else alert_text_2 + super().__init__(alert_text_1, compact_secondary, alert_status, AlertSize.small, Tier.LOWER, VisualAlert.none, AudibleAlert.none, 5.0) + else: + super().__init__(alert_text_1, alert_text_2, alert_status, AlertSize.mid, Tier.LOWER, VisualAlert.none, AudibleAlert.none, 5.0) + + +class AlertBase(AlertCard): + pass + + +NULL_ALERT = AlertCard("", "", AlertStatus.normal, AlertSize.none, Tier.LOWEST, VisualAlert.none, AudibleAlert.none, 0.0) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/basedir.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/basedir.py new file mode 100644 index 000000000..49b092d93 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/basedir.py @@ -0,0 +1,4 @@ +import os + + +BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../..")) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/constants.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/constants.py new file mode 100644 index 000000000..7ca425c4b --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/constants.py @@ -0,0 +1,23 @@ +import numpy as np + +# conversions +class CV: + # Speed + MPH_TO_KPH = 1.609344 + KPH_TO_MPH = 1. / MPH_TO_KPH + MS_TO_KPH = 3.6 + KPH_TO_MS = 1. / MS_TO_KPH + MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH + MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS + MS_TO_KNOTS = 1.9438 + KNOTS_TO_MS = 1. / MS_TO_KNOTS + + # Angle + DEG_TO_RAD = np.pi / 180. + RAD_TO_DEG = 1. / DEG_TO_RAD + + # Mass + LB_TO_KG = 0.453592 + + +ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2 diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/file_helpers.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/file_helpers.py new file mode 100644 index 000000000..1d459fe13 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/file_helpers.py @@ -0,0 +1 @@ +from iqpilot.common.utils import CallbackReader, get_upload_stream diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/git_creds.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/git_creds.py new file mode 100644 index 000000000..c130b0317 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/git_creds.py @@ -0,0 +1,250 @@ +import base64 +import json +import os +import subprocess + +from iqpilot.common.params import Params + +PARAM = "GitAuthBlob" +PARAMS_DIR = os.environ.get("PARAMS_DIR", "/data/params/d") +KEY_DIR = "/data/konn3kt" +KEY_PATH = os.path.join(KEY_DIR, "git_auth.key") +HELPER_PATH = os.path.join(KEY_DIR, "git_credential_helper.py") +DEFAULT_REPO_DIR = "/data/openpilot" +CREDENTIAL_HOSTS = ("git.konn3kt.com", "gitlvb.teallvbs.xyz") + +_HELPER_SCRIPT = '''#!/usr/bin/env python3 +import json +import os +import sys + +KEY_PATH = "{key_path}" + + +def main() -> None: + if len(sys.argv) < 2 or sys.argv[1] != "get": + return + # drain git's request on stdin (terminated by a blank line) + for line in sys.stdin: + if not line.strip(): + break + params_dir = os.environ.get("PARAMS_DIR", "/data/params/d") + blob_path = os.path.join(params_dir, "GitAuthBlob") + try: + with open(KEY_PATH, "rb") as f: + key = f.read().strip() + with open(blob_path, "rb") as f: + blob = f.read() + if not blob: + return + from cryptography.fernet import Fernet + data = json.loads(Fernet(key).decrypt(blob).decode()) + username = data.get("u", "") + token = data.get("t", "") + if username and token: + sys.stdout.write("username=%s\\npassword=%s\\n" % (username, token)) + except Exception: + return + + +if __name__ == "__main__": + main() +''' + + +def _params_get(name: str) -> bytes | None: + # Params -> cereal -> iqdbc: that chain is unavailable mid-bootstrap (this module's + # callers install those very packages), so fall back to the params file directly, + # exactly like the embedded credential helper does. + try: + return Params().get(name) + except Exception: + try: + with open(os.path.join(PARAMS_DIR, name), "rb") as f: + return f.read() + except OSError: + return None + + +def _params_put(name: str, value: bytes) -> None: + try: + Params().put(name, value) + return + except Exception: + pass + os.makedirs(PARAMS_DIR, exist_ok=True) + tmp = os.path.join(PARAMS_DIR, f".tmp_{name}") + fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o644) + with os.fdopen(fd, "wb") as f: + f.write(value) + f.flush() + os.fsync(f.fileno()) + os.replace(tmp, os.path.join(PARAMS_DIR, name)) + + +def _params_remove(name: str) -> None: + try: + Params().remove(name) + return + except Exception: + pass + try: + os.unlink(os.path.join(PARAMS_DIR, name)) + except OSError: + pass + + +def _load_or_create_key() -> bytes: + from cryptography.fernet import Fernet + try: + with open(KEY_PATH, "rb") as f: + return f.read().strip() + except FileNotFoundError: + pass + key = Fernet.generate_key() + os.makedirs(KEY_DIR, exist_ok=True) + # write atomically with restrictive perms + tmp = KEY_PATH + ".tmp" + fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600) + with os.fdopen(fd, "wb") as f: + f.write(key) + os.replace(tmp, KEY_PATH) + return key + + +def set_credentials(username: str, token: str) -> None: + """Encrypt and store credentials. Empty username AND token clears them.""" + username = (username or "").strip() + token = (token or "").strip() + if not username and not token: + clear_credentials() + return + from cryptography.fernet import Fernet + blob = Fernet(_load_or_create_key()).encrypt( + json.dumps({"u": username, "t": token}).encode() + ) + _params_put(PARAM, blob) + try: + install_credential_helper(DEFAULT_REPO_DIR) + except Exception: + pass + + +def get_credentials() -> tuple[str, str] | None: + """Return (username, token), or None if unset / unreadable.""" + blob = _params_get(PARAM) + if not blob: + return None + try: + from cryptography.fernet import Fernet + data = json.loads(Fernet(_load_or_create_key()).decrypt(blob).decode()) + return data.get("u", ""), data.get("t", "") + except Exception: + return None + + +def clear_credentials() -> None: + _params_remove(PARAM) + + +def has_credentials() -> bool: + return get_credentials() is not None + + +def _auth_header(username: str, token: str) -> str: + return "Authorization: Basic " + base64.b64encode(f"{username}:{token}".encode()).decode() + + +def ssh_to_https(url: str) -> str: + """Convert an SSH git URL to its HTTPS equivalent. Returns url unchanged if it + is not an SSH URL. A leading ssh. host label is dropped (ssh.host -> host).""" + url = url.strip() + host = path = "" + if url.startswith("ssh://"): + rest = url[len("ssh://"):] + rest = rest.split("@", 1)[-1] # drop user@ + hostport, _, path = rest.partition("/") + host = hostport.split(":", 1)[0] # drop :port + elif url.startswith("git@") or ("@" in url and ":" in url.split("@", 1)[-1] and "://" not in url): + rest = url.split("@", 1)[-1] # host:owner/repo.git + host, _, path = rest.partition(":") + else: + return url # already https/http or unrecognised + if host.startswith("ssh."): + host = host[len("ssh."):] + return f"https://{host}/{path}" + + +def install_credential_helper(repo_dir: str = DEFAULT_REPO_DIR) -> None: + if get_credentials() is None: + return + + scopes = {f"https://{host}" for host in CREDENTIAL_HOSTS} + origin = subprocess.run( + ["git", "-C", repo_dir, "config", "--get", "remote.origin.url"], + capture_output=True, text=True, check=False, + ).stdout.strip() + https = ssh_to_https(origin) + if https.startswith("https://"): + from urllib.parse import urlsplit + parts = urlsplit(https) + if parts.hostname: + scopes.add(f"{parts.scheme}://{parts.hostname}") + + try: + os.makedirs(KEY_DIR, exist_ok=True) + tmp = HELPER_PATH + ".tmp" + fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o755) + with os.fdopen(fd, "w") as f: + f.write(_HELPER_SCRIPT.format(key_path=KEY_PATH)) + os.replace(tmp, HELPER_PATH) + except Exception: + return + + helper_cmd = f"!/usr/bin/env python3 {HELPER_PATH}" + for scope in scopes: + subprocess.run( + ["git", "config", "--global", f"credential.{scope}.helper", helper_cmd], + check=False, capture_output=True, + ) + + +def configure(repo_dir: str) -> None: + """Apply on-device credentials to the git repo at repo_dir before a remote op. + + No-op when no credentials are stored. If the origin is an SSH URL it is + rewritten in-place to the HTTPS equivalent so the Basic-auth header applies. + The header is injected via GIT_CONFIG_* env (never persisted to .git/config). + Idempotent.""" + creds = get_credentials() + if creds is None: + return + username, token = creds + + try: + install_credential_helper(repo_dir) + except Exception: + pass + + origin = subprocess.run( + ["git", "-C", repo_dir, "config", "--get", "remote.origin.url"], + capture_output=True, text=True, check=False, + ).stdout.strip() + if not origin: + return + + https = ssh_to_https(origin) + if https != origin and https.startswith("https://"): + subprocess.run( + ["git", "-C", repo_dir, "config", "remote.origin.url", https], + check=False, capture_output=True, + ) + + if not https.startswith("https://"): + return # header auth only works over https + + # scope to this exact repo URL prefix (trailing slash => component boundary) + key = https if https.endswith("/") else https + "/" + os.environ["GIT_CONFIG_COUNT"] = "1" + os.environ["GIT_CONFIG_KEY_0"] = f"http.{key}.extraHeader" + os.environ["GIT_CONFIG_VALUE_0"] = _auth_header(username, token) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/gpio.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/gpio.py new file mode 100644 index 000000000..8f025a2da --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/gpio.py @@ -0,0 +1,89 @@ +import os +import fcntl +import ctypes +from functools import cache + +def gpio_init(pin: int, output: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f: + f.write(b"out" if output else b"in") + except Exception as e: + print(f"Failed to set gpio {pin} direction: {e}") + +def gpio_set(pin: int, high: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f: + f.write(b"1" if high else b"0") + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + +def gpio_read(pin: int) -> bool | None: + val = None + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f: + val = bool(int(f.read().strip())) + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + + return val + +def gpio_export(pin: int) -> None: + if os.path.isdir(f"/sys/class/gpio/gpio{pin}"): + return + + try: + with open("/sys/class/gpio/export", 'w') as f: + f.write(str(pin)) + except Exception: + print(f"Failed to export gpio {pin}") + +@cache +def get_irq_action(irq: int) -> list[str]: + try: + with open(f"/sys/kernel/irq/{irq}/actions") as f: + actions = f.read().strip().split(',') + return actions + except FileNotFoundError: + return [] + +def get_irqs_for_action(action: str) -> list[str]: + ret = [] + with open("/proc/interrupts") as f: + for l in f.readlines(): + irq = l.split(':')[0].strip() + if irq.isdigit() and action in get_irq_action(irq): + ret.append(irq) + return ret + +# *** gpiochip *** + +class gpioevent_data(ctypes.Structure): + _fields_ = [ + ("timestamp", ctypes.c_uint64), + ("id", ctypes.c_uint32), + ] + +class gpioevent_request(ctypes.Structure): + _fields_ = [ + ("lineoffset", ctypes.c_uint32), + ("handleflags", ctypes.c_uint32), + ("eventflags", ctypes.c_uint32), + ("label", ctypes.c_char * 32), + ("fd", ctypes.c_int) + ] + +def gpiochip_get_ro_value_fd(label: str, gpiochip_id: int, pin: int) -> int: + GPIOEVENT_REQUEST_BOTH_EDGES = 0x3 + GPIOHANDLE_REQUEST_INPUT = 0x1 + GPIO_GET_LINEEVENT_IOCTL = 0xc030b404 + + rq = gpioevent_request() + rq.lineoffset = pin + rq.handleflags = GPIOHANDLE_REQUEST_INPUT + rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES + rq.label = label.encode('utf-8')[:31] + b'\0' + + fd = os.open(f"/dev/gpiochip{gpiochip_id}", os.O_RDONLY) + fcntl.ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, rq) + os.close(fd) + return int(rq.fd) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/i2c.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/i2c.py new file mode 100644 index 000000000..1dfaa659a --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/i2c.py @@ -0,0 +1,81 @@ +import os +import fcntl +import ctypes + +# I2C constants from /usr/include/linux/i2c-dev.h +I2C_SLAVE = 0x0703 +I2C_SLAVE_FORCE = 0x0706 +I2C_SMBUS = 0x0720 + +# SMBus transfer types +I2C_SMBUS_READ = 1 +I2C_SMBUS_WRITE = 0 +I2C_SMBUS_BYTE_DATA = 2 +I2C_SMBUS_I2C_BLOCK_DATA = 8 + +I2C_SMBUS_BLOCK_MAX = 32 + + +class _I2cSmbusData(ctypes.Union): + _fields_ = [ + ("byte", ctypes.c_uint8), + ("word", ctypes.c_uint16), + ("block", ctypes.c_uint8 * (I2C_SMBUS_BLOCK_MAX + 2)), + ] + + +class _I2cSmbusIoctlData(ctypes.Structure): + _fields_ = [ + ("read_write", ctypes.c_uint8), + ("command", ctypes.c_uint8), + ("size", ctypes.c_uint32), + ("data", ctypes.POINTER(_I2cSmbusData)), + ] + + +class SMBus: + def __init__(self, bus: int): + self._fd = os.open(f'/dev/i2c-{bus}', os.O_RDWR) + + def __enter__(self) -> 'SMBus': + return self + + def __exit__(self, *args) -> None: + self.close() + + def close(self) -> None: + if hasattr(self, '_fd') and self._fd >= 0: + os.close(self._fd) + self._fd = -1 + + def _set_address(self, addr: int, force: bool = False) -> None: + ioctl_arg = I2C_SLAVE_FORCE if force else I2C_SLAVE + fcntl.ioctl(self._fd, ioctl_arg, addr) + + def _smbus_access(self, read_write: int, command: int, size: int, data: _I2cSmbusData) -> None: + ioctl_data = _I2cSmbusIoctlData(read_write, command, size, ctypes.pointer(data)) + fcntl.ioctl(self._fd, I2C_SMBUS, ioctl_data) + + def read_byte_data(self, addr: int, register: int, force: bool = False) -> int: + self._set_address(addr, force) + data = _I2cSmbusData() + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_BYTE_DATA, data) + return int(data.byte) + + def write_byte_data(self, addr: int, register: int, value: int, force: bool = False) -> None: + self._set_address(addr, force) + data = _I2cSmbusData() + data.byte = value & 0xFF + self._smbus_access(I2C_SMBUS_WRITE, register, I2C_SMBUS_BYTE_DATA, data) + + def read_i2c_block_data(self, addr: int, register: int, length: int, force: bool = False) -> list[int]: + self._set_address(addr, force) + if not (0 <= length <= I2C_SMBUS_BLOCK_MAX): + raise ValueError(f"length must be 0..{I2C_SMBUS_BLOCK_MAX}") + + data = _I2cSmbusData() + data.block[0] = length + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_I2C_BLOCK_DATA, data) + read_len = int(data.block[0]) or length + read_len = min(read_len, length) + return [int(b) for b in data.block[1 : read_len + 1]] diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/issue_debug.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/issue_debug.py new file mode 100644 index 000000000..e8c517a7d --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/issue_debug.py @@ -0,0 +1,44 @@ +import os +import threading +import time +from datetime import datetime +from pathlib import Path + +from iqpilot.system.hardware import PC +from iqpilot.system.hardware.hw import Paths + + +DEBUG_FILENAME = "iqpilot_issue_debug.txt" +DEBUG_PATH = Path(Paths.comma_home()) / "community" / DEBUG_FILENAME if PC else Path("/data/community") / DEBUG_FILENAME + +_lock = threading.Lock() +_last_log_times: dict[str, float] = {} + + +def log_issue(tag: str, message: str) -> None: + try: + DEBUG_PATH.parent.mkdir(parents=True, exist_ok=True) + with _lock: + with open(DEBUG_PATH, "a", encoding="utf-8") as f: + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + f.write(f"[{timestamp}] [{tag}] {message}\n") + except OSError: + pass + + +def log_issue_limited(key: str, tag: str, message: str, interval_sec: float = 1.0) -> None: + now = time.monotonic() + with _lock: + last = _last_log_times.get(key, 0.0) + if now - last < interval_sec: + return + _last_log_times[key] = now + + log_issue(tag, message) + + +def clear_issue_debug_log() -> None: + try: + os.remove(DEBUG_PATH) + except OSError: + pass diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/logging_extra.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/logging_extra.py new file mode 100644 index 000000000..ceaf083cd --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/logging_extra.py @@ -0,0 +1,249 @@ +import io +import os +import sys +import copy +import json +import time +import uuid +import socket +import logging +import traceback +import numpy as np +from threading import local +from collections import OrderedDict +from contextlib import contextmanager + +LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ + +def json_handler(obj): + if isinstance(obj, np.bool_): + return bool(obj) + # if isinstance(obj, (datetime.date, datetime.time)): + # return obj.isoformat() + return repr(obj) + +def json_robust_dumps(obj): + return json.dumps(obj, default=json_handler) + +class NiceOrderedDict(OrderedDict): + def __str__(self): + return json_robust_dumps(self) + +class SwagFormatter(logging.Formatter): + def __init__(self, swaglogger): + logging.Formatter.__init__(self, None, '%a %b %d %H:%M:%S %Z %Y') + + self.swaglogger = swaglogger + self.host = socket.gethostname() + + def format_dict(self, record): + record_dict = NiceOrderedDict() + + if isinstance(record.msg, dict): + record_dict['msg'] = record.msg + else: + try: + record_dict['msg'] = record.getMessage() + except (ValueError, TypeError): + record_dict['msg'] = [record.msg]+record.args + + record_dict['ctx'] = self.swaglogger.get_ctx() + + if record.exc_info: + record_dict['exc_info'] = self.formatException(record.exc_info) + + record_dict['level'] = record.levelname + record_dict['levelnum'] = record.levelno + record_dict['name'] = record.name + record_dict['filename'] = record.filename + record_dict['lineno'] = record.lineno + record_dict['pathname'] = record.pathname + record_dict['module'] = record.module + record_dict['funcName'] = record.funcName + record_dict['host'] = self.host + record_dict['process'] = record.process + record_dict['thread'] = record.thread + record_dict['threadName'] = record.threadName + record_dict['created'] = record.created + + return record_dict + + def format(self, record): + if self.swaglogger is None: + raise Exception("must set swaglogger before calling format()") + return json_robust_dumps(self.format_dict(record)) + +class SwagLogFileFormatter(SwagFormatter): + def fix_kv(self, k, v): + # append type to names to preserve legacy naming in logs + # avoids overlapping key namespaces with different types + # e.g. log.info() creates 'msg' -> 'msg$s' + # log.event() creates 'msg.health.logMonoTime' -> 'msg.health.logMonoTime$i' + # because overlapping namespace 'msg' caused problems + if isinstance(v, (str, bytes)): + k += "$s" + elif isinstance(v, float): + k += "$f" + elif isinstance(v, bool): + k += "$b" + elif isinstance(v, int): + k += "$i" + elif isinstance(v, dict): + nv = {} + for ik, iv in v.items(): + ik, iv = self.fix_kv(ik, iv) + nv[ik] = iv + v = nv + elif isinstance(v, list): + k += "$a" + return k, v + + def format(self, record): + if isinstance(record, str): + v = json.loads(record) + else: + v = self.format_dict(record) + + mk, mv = self.fix_kv('msg', v['msg']) + del v['msg'] + v[mk] = mv + v['id'] = uuid.uuid4().hex + + return json_robust_dumps(v) + +class SwagErrorFilter(logging.Filter): + def filter(self, record): + return record.levelno < logging.ERROR + +def _tmpfunc(): + return 0 + +def _srcfile(): + return os.path.normcase(_tmpfunc.__code__.co_filename) + +class SwagLogger(logging.Logger): + def __init__(self): + logging.Logger.__init__(self, "swaglog") + + self.global_ctx = {} + + self.log_local = local() + self.log_local.ctx = {} + + def local_ctx(self): + try: + return self.log_local.ctx + except AttributeError: + self.log_local.ctx = {} + return self.log_local.ctx + + def get_ctx(self): + return dict(self.local_ctx(), **self.global_ctx) + + @contextmanager + def ctx(self, **kwargs): + old_ctx = self.local_ctx() + self.log_local.ctx = copy.copy(old_ctx) or {} + self.log_local.ctx.update(kwargs) + try: + yield + finally: + self.log_local.ctx = old_ctx + + def bind(self, **kwargs): + self.local_ctx().update(kwargs) + + def bind_global(self, **kwargs): + self.global_ctx.update(kwargs) + + def event(self, event, *args, **kwargs): + evt = NiceOrderedDict() + evt['event'] = event + if args: + evt['args'] = args + evt.update(kwargs) + if 'error' in kwargs: + self.error(evt) + elif 'debug' in kwargs: + self.debug(evt) + else: + self.info(evt) + + def timestamp(self, event_name): + if LOG_TIMESTAMPS: + t = time.monotonic() + tstp = NiceOrderedDict() + tstp['timestamp'] = NiceOrderedDict() + tstp['timestamp']["event"] = event_name + tstp['timestamp']["time"] = t*1e9 + self.debug(tstp) + + def findCaller(self, stack_info=False, stacklevel=1): + """ + Find the stack frame of the caller so that we can note the source + file name, line number and function name. + """ + f = sys._getframe(3) + #On some versions of IronPython, currentframe() returns None if + #IronPython isn't run with -X:Frames. + if f is not None: + f = f.f_back + orig_f = f + while f and stacklevel > 1: + f = f.f_back + stacklevel -= 1 + if not f: + f = orig_f + rv = "(unknown file)", 0, "(unknown function)", None + while hasattr(f, "f_code"): + co = f.f_code + filename = os.path.normcase(co.co_filename) + + if filename == _srcfile: + f = f.f_back + continue + sinfo = None + if stack_info: + sio = io.StringIO() + sio.write('Stack (most recent call last):\n') + traceback.print_stack(f, file=sio) + sinfo = sio.getvalue() + if sinfo[-1] == '\n': + sinfo = sinfo[:-1] + sio.close() + rv = (co.co_filename, f.f_lineno, co.co_name, sinfo) + break + return rv + +if __name__ == "__main__": + log = SwagLogger() + + stdout_handler = logging.StreamHandler(sys.stdout) + stdout_handler.setLevel(logging.INFO) + stdout_handler.addFilter(SwagErrorFilter()) + log.addHandler(stdout_handler) + + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.ERROR) + log.addHandler(stderr_handler) + + log.info("asdasd %s", "a") + log.info({'wut': 1}) + log.warning("warning") + log.error("error") + log.critical("critical") + log.event("test", x="y") + + with log.ctx(): + stdout_handler.setFormatter(SwagFormatter(log)) + stderr_handler.setFormatter(SwagFormatter(log)) + log.bind(user="some user") + log.info("in req") + print("") + log.warning("warning") + print("") + log.error("error") + print("") + log.critical("critical") + print("") + log.event("do_req", a=1, b="c") diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/realtime.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/realtime.py new file mode 100644 index 000000000..9fd2f695d --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/realtime.py @@ -0,0 +1,134 @@ +"""Utilities for reading real time clocks and keeping soft real time constraints.""" +import gc +import os +import sys +import time + +from setproctitle import getproctitle + +from iqpilot.common.utils import MovingAverage +from iqpilot.system.hardware import PC + + +# time step for each process +DT_CTRL = 0.01 # controlsd +DT_MDL = 0.05 # model +DT_HW = 0.5 # hardwared and manager +DT_DMON = 0.05 # driver monitoring + + +class Priority: + # CORE 2 + # - modeld = 55 + # - camerad = 54 + CTRL_LOW = 51 # plannerd & radard + + # CORE 3 + # - pandad = 55 + CTRL_HIGH = 53 + + +def set_core_affinity(cores: list[int]) -> None: + if sys.platform == 'linux' and not PC: + os.sched_setaffinity(0, cores) + + +def config_realtime_process(cores: int | list[int], priority: int) -> None: + gc.disable() + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(priority)) + c = cores if isinstance(cores, list) else [cores, ] + set_core_affinity(c) + + +def config_background_thread() -> None: + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_OTHER, os.sched_param(0)) + set_core_affinity(list(range(os.cpu_count() or 1))) + + +def lock_memory() -> None: + """mlockall this process so memory reclaim/compaction can't stall it. RT control + procs only (locking ui/modeld would worsen pressure). Best-effort.""" + if sys.platform != 'linux' or PC: + return + try: + import ctypes + import resource + resource.setrlimit(resource.RLIMIT_MEMLOCK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) + MCL_CURRENT, MCL_FUTURE = 0x1, 0x2 + libc = ctypes.CDLL("libc.so.6", use_errno=True) + if libc.mlockall(MCL_CURRENT | MCL_FUTURE) != 0: + raise OSError(ctypes.get_errno(), os.strerror(ctypes.get_errno())) + except Exception as e: + try: + from iqpilot.common.swaglog import cloudlog + cloudlog.warning(f"lock_memory (mlockall) failed: {e}") + except Exception: + pass + + +class Ratekeeper: + def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None: + """Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative.""" + self._interval = 1. / rate + self._print_delay_threshold = print_delay_threshold + self._frame = 0 + self._remaining = 0.0 + self._process_name = getproctitle() + self._last_monitor_time = -1. + self._next_frame_time = -1. + + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + def reset(self) -> None: + self._remaining = 0.0 + self._last_monitor_time = -1. + self._next_frame_time = -1. + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + @property + def frame(self) -> int: + return self._frame + + @property + def remaining(self) -> float: + return self._remaining + + @property + def lag(self) -> float: + return max(0., -self._remaining) + + @property + def lagging(self) -> bool: + expected_dt = self._interval * (1 / 0.9) + return self.avg_dt.get_average() > expected_dt + + # Maintain loop rate by calling this at the end of each loop + def keep_time(self) -> bool: + lagged = self.monitor_time() + if self._remaining > 0: + time.sleep(self._remaining) + return lagged + + # Monitors the cumulative lag, but does not enforce a rate + def monitor_time(self) -> bool: + if self._last_monitor_time < 0: + self._next_frame_time = time.monotonic() + self._interval + self._last_monitor_time = time.monotonic() + + prev = self._last_monitor_time + self._last_monitor_time = time.monotonic() + self.avg_dt.add_value(self._last_monitor_time - prev) + + lagged = False + remaining = self._next_frame_time - time.monotonic() + self._next_frame_time += self._interval + if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: + print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms") + lagged = True + self._frame += 1 + self._remaining = remaining + return lagged diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/spinner.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/spinner.py new file mode 100644 index 000000000..b823d09a4 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/spinner.py @@ -0,0 +1,52 @@ +import os +import subprocess +from iqpilot.common.basedir import BASEDIR + + +class Spinner: + def __init__(self): + try: + self.spinner_proc = subprocess.Popen(["./spinner.py"], + stdin=subprocess.PIPE, + cwd=os.path.join(BASEDIR, "iqpilot", "system", "ui"), + close_fds=True) + except OSError: + self.spinner_proc = None + + def __enter__(self): + return self + + def update(self, spinner_text: str): + if self.spinner_proc is not None: + self.spinner_proc.stdin.write(spinner_text.encode('utf8') + b"\n") + try: + self.spinner_proc.stdin.flush() + except BrokenPipeError: + pass + + def update_progress(self, cur: float, total: float): + self.update(str(round(100 * cur / total))) + + def close(self): + if self.spinner_proc is not None: + self.spinner_proc.kill() + try: + self.spinner_proc.communicate(timeout=2.) + except subprocess.TimeoutExpired: + print("WARNING: failed to kill spinner") + self.spinner_proc = None + + def __del__(self): + self.close() + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + + +if __name__ == "__main__": + import time + with Spinner() as s: + s.update("Spinner text") + time.sleep(5.0) + print("gone") + time.sleep(5.0) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/swaglog.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/swaglog.py new file mode 100644 index 000000000..f8fd9d392 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/swaglog.py @@ -0,0 +1,165 @@ +import logging +import os +import sys +import time +import warnings +from pathlib import Path +from logging.handlers import BaseRotatingHandler + +import zmq + +from iqpilot.common.logging_extra import SwagLogger, SwagFormatter, SwagLogFileFormatter +from iqpilot.system.hardware.hw import Paths + + +def get_file_handler(): + Path(Paths.swaglog_root()).mkdir(parents=True, exist_ok=True) + base_filename = os.path.join(Paths.swaglog_root(), "swaglog") + handler = SwaglogRotatingFileHandler(base_filename) + return handler + +class SwaglogRotatingFileHandler(BaseRotatingHandler): + def __init__(self, base_filename, interval=60, max_bytes=1024*256, backup_count=2500, encoding=None): + super().__init__(base_filename, mode="a", encoding=encoding, delay=True) + self.base_filename = base_filename + self.interval = interval # seconds + self.max_bytes = max_bytes + self.backup_count = backup_count + self.log_files = self.get_existing_logfiles() + log_indexes = [f.split(".")[-1] for f in self.log_files] + self.last_file_idx = max([int(i) for i in log_indexes if i.isdigit()] or [-1]) + self.last_rollover = None + self.doRollover() + + def _open(self): + self.last_rollover = time.monotonic() + self.last_file_idx += 1 + next_filename = f"{self.base_filename}.{self.last_file_idx:010}" + stream = open(next_filename, self.mode, encoding=self.encoding) + self.log_files.insert(0, next_filename) + return stream + + def get_existing_logfiles(self): + log_files = list() + base_dir = os.path.dirname(self.base_filename) + for fn in os.listdir(base_dir): + fp = os.path.join(base_dir, fn) + if fp.startswith(self.base_filename) and os.path.isfile(fp): + log_files.append(fp) + return sorted(log_files) + + def shouldRollover(self, record): + size_exceeded = self.max_bytes > 0 and self.stream.tell() >= self.max_bytes + time_exceeded = self.interval > 0 and self.last_rollover + self.interval <= time.monotonic() + return size_exceeded or time_exceeded + + def doRollover(self): + if self.stream: + self.stream.close() + self.stream = self._open() + + if self.backup_count > 0: + while len(self.log_files) > self.backup_count: + to_delete = self.log_files.pop() + if os.path.exists(to_delete): # just being safe, should always exist + os.remove(to_delete) + +class UnixDomainSocketHandler(logging.Handler): + def __init__(self, formatter): + logging.Handler.__init__(self) + self.setFormatter(formatter) + self.pid = None + + self.zctx = None + self.sock = None + + def __del__(self): + self.close() + + def close(self): + if self.sock is not None: + self.sock.close() + if self.zctx is not None: + self.zctx.term() + + def connect(self): + self.zctx = zmq.Context() + self.sock = self.zctx.socket(zmq.PUSH) + self.sock.setsockopt(zmq.LINGER, 10) + self.sock.connect(Paths.swaglog_ipc()) + self.pid = os.getpid() + + def emit(self, record): + if os.getpid() != self.pid: + # TODO suppresses warning about forking proc with zmq socket, fix root cause + warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*") + self.connect() + + msg = self.format(record).rstrip('\n') + # print("SEND".format(repr(msg))) + try: + s = chr(record.levelno)+msg + self.sock.send(s.encode('utf8'), zmq.NOBLOCK) + except zmq.error.Again: + # drop :/ + pass + + +class ForwardingHandler(logging.Handler): + def __init__(self, target_logger): + super().__init__() + self.target_logger = target_logger + + def emit(self, record): + self.target_logger.handle(record) + + +def add_file_handler(log): + """ + Function to add the file log handler to swaglog. + This can be used to store logs when logmessaged is not running. + """ + handler = get_file_handler() + handler.setFormatter(SwagLogFileFormatter(log)) + log.addHandler(handler) + + +cloudlog = log = SwagLogger() +log.setLevel(logging.DEBUG) + + +class PrettyConsoleFormatter(logging.Formatter): + # StreamHandler writes to stderr, so tty-gate on that + _COLOR = sys.stderr.isatty() and os.environ.get('NO_COLOR') is None + + def format(self, record): + msg = record.getMessage() + if not self._COLOR: + return f"{record.filename}: {msg}" + lvl = record.levelno + if lvl >= 50: lc, ln = "\033[1;38;5;196m", "CRIT" + elif lvl >= 40: lc, ln = "\033[1;38;5;203m", " ERR" + elif lvl >= 30: lc, ln = "\033[38;5;214m", "WARN" + elif lvl >= 20: lc, ln = "\033[38;5;110m", "info" + else: lc, ln = "\033[38;5;244m", " dbg" + body = f"\033[1;38;5;210m{msg}\033[0m" if lvl >= 40 else msg + src = "" if record.filename == "(unknown file)" else f"\033[2m{record.filename}\033[0m " + return f"{lc}{ln:>4}\033[0m {src}{body}" + + +outhandler = logging.StreamHandler() +outhandler.setFormatter(PrettyConsoleFormatter()) + +print_level = os.environ.get('LOGPRINT', 'warning') +if print_level == 'debug': + outhandler.setLevel(logging.DEBUG) +elif print_level == 'info': + outhandler.setLevel(logging.INFO) +elif print_level == 'warning': + outhandler.setLevel(logging.WARNING) + +ipchandler = UnixDomainSocketHandler(SwagFormatter(log)) + +log.addHandler(outhandler) +# logs are sent through IPC before writing to disk to prevent disk I/O blocking +log.addHandler(ipchandler) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/time_helpers.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/time_helpers.py new file mode 100644 index 000000000..8564e270c --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/time_helpers.py @@ -0,0 +1,15 @@ +import datetime +from pathlib import Path + +MIN_DATE = datetime.datetime(year=2025, month=2, day=21) + +def min_date(): + # on systemd systems, the default time is the systemd build time + systemd_path = Path("/lib/systemd/systemd") + if systemd_path.exists(): + d = datetime.datetime.fromtimestamp(systemd_path.stat().st_mtime) + return max(MIN_DATE, d + datetime.timedelta(days=1)) + return MIN_DATE + +def system_time_valid(): + return datetime.datetime.now() > min_date() diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/utils.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/utils.py new file mode 100644 index 000000000..e0aa1605d --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/utils.py @@ -0,0 +1,271 @@ +import io +import os +import tempfile +import contextlib +import subprocess +import time +import functools +from subprocess import Popen, PIPE, TimeoutExpired +import zstandard as zstd + +LOG_COMPRESSION_LEVEL = 10 # little benefit up to level 15. level ~17 is a small step change + +class Timer: + """Simple lap timer for profiling sequential operations.""" + + def __init__(self): + self._start = self._lap = time.monotonic() + self._sections = {} + + def lap(self, name): + now = time.monotonic() + self._sections[name] = now - self._lap + self._lap = now + + @property + def total(self): + return time.monotonic() - self._start + + def fmt(self, duration): + parts = ", ".join(f"{k}={v:.2f}s" + (f" ({duration/v:.0f}x)" if k == 'render' and v > 0 else "") for k, v in self._sections.items()) + total = self.total + realtime = f"{duration/total:.1f}x realtime" if total > 0 else "N/A" + return f"{duration}s in {total:.1f}s ({realtime}) | {parts}" + +def sudo_write(val: str, path: str) -> None: + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + os.system(f"sudo chmod a+w {path}") + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + # fallback for debugfs files + os.system(f"sudo su -c 'echo {val} > {path}'") + + +def sudo_read(path: str) -> str: + try: + return subprocess.check_output(f"sudo cat {path}", shell=True, encoding='utf8').strip() + except Exception: + return "" + + +class MovingAverage: + def __init__(self, window_size: int): + self.window_size: int = window_size + self.buffer: list[float] = [0.0] * window_size + self.index: int = 0 + self.count: int = 0 + self.sum: float = 0.0 + + def add_value(self, new_value: float): + # Update the sum: subtract the value being replaced and add the new value + self.sum -= self.buffer[self.index] + self.buffer[self.index] = new_value + self.sum += new_value + + # Update the index in a circular manner + self.index = (self.index + 1) % self.window_size + + # Track the number of added values (for partial windows) + self.count = min(self.count + 1, self.window_size) + + def get_average(self) -> float: + if self.count == 0: + return float('nan') + return self.sum / self.count + + +class CallbackReader: + """Wraps a file, but overrides the read method to also + call a callback function with the number of bytes read so far.""" + + def __init__(self, f, callback, *args): + self.f = f + self.callback = callback + self.cb_args = args + self.total_read = 0 + + def __getattr__(self, attr): + return getattr(self.f, attr) + + def read(self, *args, **kwargs): + chunk = self.f.read(*args, **kwargs) + self.total_read += len(chunk) + self.callback(*self.cb_args, self.total_read) + return chunk + + +@contextlib.contextmanager +def atomic_write(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None, + overwrite: bool = False): + """Write to a file atomically using a temporary file in the same directory as the destination file.""" + dir_name = os.path.dirname(path) + + if not overwrite and os.path.exists(path): + raise FileExistsError(f"File '{path}' already exists. To overwrite it, set 'overwrite' to True.") + + with tempfile.NamedTemporaryFile(mode=mode, buffering=buffering, encoding=encoding, newline=newline, dir=dir_name, delete=False) as tmp_file: + yield tmp_file + tmp_file_name = tmp_file.name + os.replace(tmp_file_name, path) + + +def get_upload_stream(filepath: str, should_compress: bool) -> tuple[io.BufferedIOBase, int]: + if not should_compress: + file_size = os.path.getsize(filepath) + file_stream = open(filepath, "rb") + return file_stream, file_size + + # Compress the file on the fly + compressed_stream = io.BytesIO() + compressor = zstd.ZstdCompressor(level=LOG_COMPRESSION_LEVEL) + + with open(filepath, "rb") as f: + compressor.copy_stream(f, compressed_stream) + compressed_size = compressed_stream.tell() + compressed_stream.seek(0) + return compressed_stream, compressed_size + + +# remove all keys that end in DEPRECATED +def strip_deprecated_keys(d): + for k in list(d.keys()): + if isinstance(k, str): + if k.endswith('DEPRECATED'): + d.pop(k) + elif isinstance(d[k], dict): + strip_deprecated_keys(d[k]) + return d + + +def run_cmd(cmd: list[str], cwd=None, env=None) -> str: + return subprocess.check_output(cmd, encoding='utf8', cwd=cwd, env=env).strip() + + +def run_cmd_default(cmd: list[str], default: str = "", cwd=None, env=None) -> str: + try: + return run_cmd(cmd, cwd=cwd, env=env) + except subprocess.CalledProcessError: + return default + + +@contextlib.contextmanager +def managed_proc(cmd: list[str], env: dict[str, str]): + proc = Popen(cmd, env=env, stdout=PIPE, stderr=PIPE) + try: + yield proc + finally: + if proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=5) + except TimeoutExpired: + proc.kill() + + +def tabulate(tabular_data, headers=(), tablefmt="simple", floatfmt="g", stralign="left", numalign=None): + rows = [list(row) for row in tabular_data] + + def fmt(val): + if isinstance(val, str): + return val + if isinstance(val, (bool, int)): + return str(val) + try: + return format(val, floatfmt) + except (TypeError, ValueError): + return str(val) + + formatted = [[fmt(c) for c in row] for row in rows] + hdrs = [str(h) for h in headers] if headers else None + + ncols = max((len(r) for r in formatted), default=0) + if hdrs: + ncols = max(ncols, len(hdrs)) + if ncols == 0: + return "" + + for r in formatted: + r.extend([""] * (ncols - len(r))) + if hdrs: + hdrs.extend([""] * (ncols - len(hdrs))) + + widths = [0] * ncols + if hdrs: + for i in range(ncols): + widths[i] = len(hdrs[i]) + for row in formatted: + for i in range(ncols): + widths[i] = max(widths[i], max(len(ln) for ln in row[i].split('\n'))) + + def _align(s, w): + if stralign == "center": + return s.center(w) + return s.ljust(w) + + if tablefmt == "html": + parts = [""] + if hdrs: + parts.append("") + parts.append("" + "".join(f"" for h in hdrs) + "") + parts.append("") + parts.append("") + for row in formatted: + parts.append("" + "".join(f"" for c in row) + "") + parts.append("") + parts.append("
{h}
{c}
") + return "\n".join(parts) + + if tablefmt == "simple_grid": + def _sep(left, mid, right): + return left + mid.join("─" * (w + 2) for w in widths) + right + + top, mid_sep, bot = _sep("┌", "â”Ŧ", "┐"), _sep("├", "â”ŧ", "┤"), _sep("└", "┴", "┘") + + def _fmt_row(cells): + split = [c.split('\n') for c in cells] + nlines = max(len(s) for s in split) + for s in split: + s.extend([""] * (nlines - len(s))) + return ["│" + "│".join(f" {_align(split[i][li], widths[i])} " for i in range(ncols)) + "│" for li in range(nlines)] + + lines = [top] + if hdrs: + lines.extend(_fmt_row(hdrs)) + lines.append(mid_sep) + for ri, row in enumerate(formatted): + lines.extend(_fmt_row(row)) + lines.append(mid_sep if ri < len(formatted) - 1 else bot) + return "\n".join(lines) + + gap = " " + lines = [] + if hdrs: + lines.append(gap.join(h.ljust(w) for h, w in zip(hdrs, widths, strict=True))) + lines.append(gap.join("-" * w for w in widths)) + for row in formatted: + lines.append(gap.join(_align(row[i], widths[i]) for i in range(ncols))) + return "\n".join(lines) + + +def retry(attempts=3, delay=1.0, ignore_failure=False): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + for _ in range(attempts): + try: + return func(*args, **kwargs) + except Exception: + print(f"{func.__name__} failed, trying again") + time.sleep(delay) + + if ignore_failure: + print(f"{func.__name__} failed after retry") + else: + raise Exception(f"{func.__name__} failed after retry") + return wrapper + return decorator diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/version.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/version.py new file mode 100644 index 000000000..c6d11163a --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/common/version.py @@ -0,0 +1,5 @@ +from iqpilot.common.git import get_normalized_origin + + +def get_version() -> str: + return "IQ.Pilot 1.0c" diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py new file mode 100644 index 000000000..2897609eb --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py @@ -0,0 +1,17 @@ +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + + +import os +from iqpilot.common.api.base import BaseApi +API_HOST = os.getenv('KONN3KT_API_HOST', 'https://api-iqlabs.konn3kt.com') + +class Konn3ktApi(BaseApi): + + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "konn3kt-device-" + + def get_token(self, expiry_hours=1): + return super()._get_token(expiry_hours=expiry_hours) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/registration.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/registration.py new file mode 100644 index 000000000..1ef907dd9 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/registration.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +import os +import time +import json +import jwt +import re +import secrets +from typing import cast +from pathlib import Path + +from datetime import datetime, timedelta, UTC +from iqpilot.common.api import api_get, get_key_pair +from iqpilot.common.params import Params +from iqpilot.common.spinner import Spinner +from iqpilot.system.hardware import HARDWARE, PC +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog + + +UNREGISTERED_DONGLE_ID = "UnregisteredDevice" + +_DONGLE_ID_RE = re.compile(r"^[a-fA-F0-9]{16}$") +IMEI_WAIT_TIMEOUT = 15.0 + + +def _read_persist_dongle_id() -> str | None: + p = Path(Paths.persist_root()) / "comma" / "dongle_id" + try: + if not p.is_file(): + return None + s = p.read_text().strip() + return s or None + except Exception: + cloudlog.exception("failed to read persist dongle_id") + return None + + +def get_cached_dongle_id(params: Params | None = None, prefer_readonly: bool = True) -> str | None: + ro = _read_persist_dongle_id() + if is_valid_dongle_id(ro): + ro = ro.lower() + if prefer_readonly and ro: + return ro + p = Params() if params is None else params + v = p.get("DongleId") + if v and v != UNREGISTERED_DONGLE_ID: + return v.lower() if is_valid_dongle_id(v) else v + return ro or None +def is_valid_dongle_id(dongle_id: str | None) -> bool: + return bool(dongle_id and _DONGLE_ID_RE.fullmatch(dongle_id)) +def get_or_create_dongle_id(params: Params | None = None, prefer_readonly: bool = True) -> str: + p = Params() if params is None else params + dongle_id = get_cached_dongle_id(p, prefer_readonly=prefer_readonly) + if dongle_id and dongle_id != UNREGISTERED_DONGLE_ID: + return dongle_id + dongle_id = secrets.token_hex(8) + p.put("DongleId", dongle_id) + cloudlog.warning(f"generated new DongleId={dongle_id} (no readonly dongle_id found)") + return dongle_id +def ensure_dev_pairing_identity(params: Params | None = None, force_reset: bool = False) -> dict[str, str]: + p = Params() if params is None else params + + persist_dir = Path(Paths.persist_root()) / "comma" + persist_dir.mkdir(parents=True, exist_ok=True) + + dongle_path = persist_dir / "dongle_id" + priv_path = persist_dir / "id_rsa" + pub_path = persist_dir / "id_rsa.pub" + + if force_reset: + for fp in (dongle_path, priv_path, pub_path): + try: + fp.unlink(missing_ok=True) + except Exception: + cloudlog.exception(f"failed to remove {fp}") + try: + (persist_dir / "konn3kt_prime_type").unlink(missing_ok=True) + except Exception: + pass + try: + p.remove("PrimeType") + except Exception: + pass + forced_dongle = os.getenv("KONN3KT_DEV_DONGLE_ID") + dongle_id = forced_dongle.strip().lower() if forced_dongle else None + if dongle_id and not is_valid_dongle_id(dongle_id): + cloudlog.error("KONN3KT_DEV_DONGLE_ID must be 16 hex chars") + dongle_id = None + if dongle_id is None: + existing = None + try: + existing = dongle_path.read_text().strip().lower() if dongle_path.is_file() else None + except Exception: + cloudlog.exception("failed reading existing dev dongle_id") + dongle_id = existing if is_valid_dongle_id(existing) else secrets.token_hex(8) + try: + dongle_path.write_text(dongle_id) + except Exception: + cloudlog.exception("failed writing dev dongle_id") + p.put("DongleId", dongle_id) + p.put("HardwareSerial", p.get("HardwareSerial") or f"DEV-{dongle_id}") + if force_reset or (not priv_path.is_file()) or (not pub_path.is_file()): + try: + from cryptography.hazmat.primitives import serialization + from cryptography.hazmat.primitives.asymmetric import rsa + key = rsa.generate_private_key(public_exponent=65537, key_size=2048) + priv_bytes = key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption(), + ) + pub_bytes = key.public_key().public_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PublicFormat.SubjectPublicKeyInfo, + ) + priv_path.write_bytes(priv_bytes) + pub_path.write_bytes(pub_bytes) + except Exception: + cloudlog.exception("failed generating dev RSA keys") + raise + return { + "dongle_id": dongle_id, + "serial": p.get("HardwareSerial") or f"DEV-{dongle_id}", + "persist_dir": str(persist_dir), + } +def is_registered_device() -> bool: + dongle = Params().get("DongleId") + return dongle not in (None, UNREGISTERED_DONGLE_ID) + + +def _normalize_imei(value: str | None) -> str: + return value or "" + + +def get_registration_identifiers(wait_timeout: float = IMEI_WAIT_TIMEOUT, show_spinner: bool = False) -> tuple[str, str, str]: + serial = HARDWARE.get_serial() + spinner = Spinner() if show_spinner else None + start_time = time.monotonic() + imei1: str | None = None + imei2: str | None = None + + while time.monotonic() - start_time < wait_timeout: + try: + imei1, imei2 = HARDWARE.get_imei(0), HARDWARE.get_imei(1) + if imei1 or imei2: + break + except RuntimeError as e: + if "no modems" in str(e).lower(): + cloudlog.warning("No cellular modem available, proceeding without IMEI") + break + cloudlog.exception("Error getting imei, trying again...") + except Exception: + cloudlog.exception("Error getting imei, trying again...") + time.sleep(1) + + imei1 = _normalize_imei(imei1) + imei2 = _normalize_imei(imei2) + + if not imei1 and not imei2: + cloudlog.warning(f"proceeding with serial-only registration for serial={serial}") + if spinner is not None: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1 or None}, {imei2 or None})") + spinner.close() + + return serial, imei1, imei2 + + +def register(show_spinner=False) -> str | None: + params = Params() + + dongle_id: str | None = get_cached_dongle_id(params, prefer_readonly=True) + if dongle_id in ("", UNREGISTERED_DONGLE_ID): + dongle_id = None + + jwt_algo, private_key, public_key = get_key_pair() + + if not public_key: + dongle_id = UNREGISTERED_DONGLE_ID + cloudlog.warning("missing public key") + elif dongle_id is None: + if show_spinner: + spinner = Spinner() + spinner.update("registering device") + + serial, imei1, imei2 = get_registration_identifiers(wait_timeout=IMEI_WAIT_TIMEOUT, show_spinner=False) + + backoff = 0 + start_time = time.monotonic() + while True: + try: + register_token = jwt.encode({'register': True, 'exp': datetime.now(UTC).replace(tzinfo=None) + timedelta(hours=1)}, + cast(str, private_key), algorithm=jwt_algo) + cloudlog.info("getting pilotauth") + cloudlog.info("getting pilotauth") + resp = api_get("v2/pilotauth/", method='POST', timeout=15, + imei=imei1, imei2=imei2, serial=serial, public_key=public_key, register_token=register_token) + + if resp.status_code in (400, 402, 403): + cloudlog.info(f"Unable to register device, got {resp.status_code}") + dongle_id = UNREGISTERED_DONGLE_ID + else: + dongleauth = json.loads(resp.text) + dongle_id = dongleauth["dongle_id"] + break + except Exception: + cloudlog.exception("failed to authenticate") + backoff = min(backoff + 1, 15) + time.sleep(backoff) + + if time.monotonic() - start_time > 60 and show_spinner: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") + return UNREGISTERED_DONGLE_ID + + if show_spinner: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1 or None}, {imei2 or None})") + spinner.close() + + if dongle_id: + params.put("DongleId", dongle_id) + from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert + set_offroad_alert("Offroad_UnregisteredHardware", False) + return dongle_id + + +if __name__ == "__main__": + print(register()) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/service_health.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/service_health.py new file mode 100644 index 000000000..848978c1e --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/konn3kt/service_health.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +def hephaestus_ready(params=None) -> bool: + return True + + +def hephaestus_ready_shim(): + return hephaestus_ready() \ No newline at end of file diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/car/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/car/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/car/vehicle_catalog.json b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/car/vehicle_catalog.json new file mode 100644 index 000000000..b3fdefead --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/car/vehicle_catalog.json @@ -0,0 +1,5341 @@ +{ + "catalog": "iqlvbs/supported-vehicles", + "rev": 1, + "vehicles": { + "ACURA_ILX|2016-2018": { + "label": "Acura ILX 2016-18", + "id": "ACURA_ILX", + "mk": "Acura", + "grp": "honda", + "mdl": "ILX", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "Technology Plus Package or AcuraWatch Plus" + }, + "ACURA_ILX|2019": { + "label": "Acura ILX 2019", + "id": "ACURA_ILX", + "mk": "Acura", + "grp": "honda", + "mdl": "ILX", + "yrs": [ + "2019" + ], + "req": "All" + }, + "ACURA_MDX_4G_MMR|2025-2026": { + "label": "Acura MDX 2025-26", + "id": "ACURA_MDX_4G_MMR", + "mk": "Acura", + "grp": "honda", + "mdl": "MDX", + "yrs": [ + "2025", + "2026" + ], + "req": "All except Type S" + }, + "ACURA_RDX|2016-2018": { + "label": "Acura RDX 2016-18", + "id": "ACURA_RDX", + "mk": "Acura", + "grp": "honda", + "mdl": "RDX", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "AcuraWatch Plus or Advance Package" + }, + "ACURA_RDX_3G|2019-2021": { + "label": "Acura RDX 2019-21", + "id": "ACURA_RDX_3G", + "mk": "Acura", + "grp": "honda", + "mdl": "RDX", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "ACURA_TLX_2G|2021": { + "label": "Acura TLX 2021", + "id": "ACURA_TLX_2G", + "mk": "Acura", + "grp": "honda", + "mdl": "TLX", + "yrs": [ + "2021" + ], + "req": "All" + }, + "ACURA_TLX_2G_MMR|2025": { + "label": "Acura TLX 2025", + "id": "ACURA_TLX_2G_MMR", + "mk": "Acura", + "grp": "honda", + "mdl": "TLX", + "yrs": [ + "2025" + ], + "req": "All" + }, + "AUDI_A3_MK3|2014-2019": { + "label": "Audi A3 2014-19", + "id": "AUDI_A3_MK3", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "A3", + "yrs": [ + "2014", + "2015", + "2016", + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_A3_MK3|2017-2018": { + "label": "Audi A3 Sportback e-tron 2017-18", + "id": "AUDI_A3_MK3", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "A3 Sportback e-tron", + "yrs": [ + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_A4_MK4|2013-2016": { + "label": "Audi A4 2013-16", + "id": "AUDI_A4_MK4", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "A4", + "yrs": [ + "2013", + "2014", + "2015", + "2016" + ], + "req": "Cruise Control" + }, + "AUDI_Q2_MK1|2018": { + "label": "Audi Q2 2018", + "id": "AUDI_Q2_MK1", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q2", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_Q3_MK2|2019-2024": { + "label": "Audi Q3 2019-24", + "id": "AUDI_Q3_MK2", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q3", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_Q4_MK1|2021-2023": { + "label": "Audi Q4 2021-23", + "id": "AUDI_Q4_MK1", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q4", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_Q4_MK2|2024-2025": { + "label": "Audi Q4 2024-25", + "id": "AUDI_Q4_MK2", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q4", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_Q5_MK1|2013-2017": { + "label": "Audi Q5 2013-17", + "id": "AUDI_Q5_MK1", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q5", + "yrs": [ + "2013", + "2014", + "2015", + "2016", + "2017" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_A3_MK3|2018": { + "label": "Audi RS3 2018", + "id": "AUDI_A3_MK3", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "RS3", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_A3_MK3|2015-2017": { + "label": "Audi S3 2015-17", + "id": "AUDI_A3_MK3", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "S3", + "yrs": [ + "2015", + "2016", + "2017" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "BUICK_LACROSSE|2017-2019": { + "label": "Buick LaCrosse 2017-19", + "id": "BUICK_LACROSSE", + "mk": "Buick", + "grp": "gm", + "mdl": "LaCrosse", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "Driver Confidence Package 2" + }, + "CADILLAC_ESCALADE|2017": { + "label": "Cadillac Escalade 2017", + "id": "CADILLAC_ESCALADE", + "mk": "Cadillac", + "grp": "gm", + "mdl": "Escalade", + "yrs": [ + "2017" + ], + "req": "Driver Assist Package" + }, + "CADILLAC_ESCALADE_ESV|2016": { + "label": "Cadillac Escalade ESV 2016", + "id": "CADILLAC_ESCALADE_ESV", + "mk": "Cadillac", + "grp": "gm", + "mdl": "Escalade ESV", + "yrs": [ + "2016" + ], + "req": "Adaptive Cruise Control (ACC) & LKAS" + }, + "CADILLAC_ESCALADE_ESV_2019|2019": { + "label": "Cadillac Escalade ESV 2019", + "id": "CADILLAC_ESCALADE_ESV_2019", + "mk": "Cadillac", + "grp": "gm", + "mdl": "Escalade ESV", + "yrs": [ + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & LKAS" + }, + "CADILLAC_XT4|2023": { + "label": "Cadillac XT4 2023", + "id": "CADILLAC_XT4", + "mk": "Cadillac", + "grp": "gm", + "mdl": "XT4", + "yrs": [ + "2023" + ], + "req": "Driver Assist Package" + }, + "CHEVROLET_BOLT_EUV|2022-2023": { + "label": "Chevrolet Bolt EUV 2022-23", + "id": "CHEVROLET_BOLT_EUV", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Bolt EUV", + "yrs": [ + "2022", + "2023" + ], + "req": "Premier or Premier Redline Trim, without Super Cruise Package" + }, + "CHEVROLET_BOLT_EUV|2022-2023#2": { + "label": "Chevrolet Bolt EV 2022-23", + "id": "CHEVROLET_BOLT_EUV", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Bolt EV", + "yrs": [ + "2022", + "2023" + ], + "req": "2LT Trim with Adaptive Cruise Control Package" + }, + "CHEVROLET_BOLT_NON_ACC|2017": { + "label": "Chevrolet Bolt EV Non-ACC 2017", + "id": "CHEVROLET_BOLT_NON_ACC", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Bolt EV Non-ACC", + "yrs": [ + "2017" + ], + "req": "No Adaptive Cruise Control (Non-ACC)" + }, + "CHEVROLET_BOLT_NON_ACC_1ST_GEN|2018-2021": { + "label": "Chevrolet Bolt EV Non-ACC 2018-21", + "id": "CHEVROLET_BOLT_NON_ACC_1ST_GEN", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Bolt EV Non-ACC", + "yrs": [ + "2018", + "2019", + "2020", + "2021" + ], + "req": "No Adaptive Cruise Control (Non-ACC)" + }, + "CHEVROLET_EQUINOX|2019-2022": { + "label": "Chevrolet Equinox 2019-22", + "id": "CHEVROLET_EQUINOX", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Equinox", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHEVROLET_MALIBU_NON_ACC_9TH_GEN|2016-2023": { + "label": "Chevrolet Malibu Non-ACC 2016-23", + "id": "CHEVROLET_MALIBU_NON_ACC_9TH_GEN", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Malibu Non-ACC", + "yrs": [ + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "No Adaptive Cruise Control (Non-ACC)" + }, + "CHEVROLET_SILVERADO|2020-2021": { + "label": "Chevrolet Silverado 1500 2020-21", + "id": "CHEVROLET_SILVERADO", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Silverado 1500", + "yrs": [ + "2020", + "2021" + ], + "req": "Safety Package II" + }, + "CHEVROLET_TRAILBLAZER|2021-2022": { + "label": "Chevrolet Trailblazer 2021-22", + "id": "CHEVROLET_TRAILBLAZER", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Trailblazer", + "yrs": [ + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHEVROLET_TRAVERSE|2022-2023": { + "label": "Chevrolet Traverse 2022-23", + "id": "CHEVROLET_TRAVERSE", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Traverse", + "yrs": [ + "2022", + "2023" + ], + "req": "RS, Premier, or High Country Trim" + }, + "CHEVROLET_VOLT|2017-2018": { + "label": "Chevrolet Volt 2017-18", + "id": "CHEVROLET_VOLT", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Volt", + "yrs": [ + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHEVROLET_VOLT_2019|2019": { + "label": "Chevrolet Volt 2019", + "id": "CHEVROLET_VOLT_2019", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Volt", + "yrs": [ + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & LKAS" + }, + "CHRYSLER_PACIFICA_2018|2017-2018": { + "label": "Chrysler Pacifica 2017-18", + "id": "CHRYSLER_PACIFICA_2018", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica", + "yrs": [ + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHRYSLER_PACIFICA_2020|2019-2020": { + "label": "Chrysler Pacifica 2019-20", + "id": "CHRYSLER_PACIFICA_2020", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica", + "yrs": [ + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHRYSLER_PACIFICA_2020|2021-2023": { + "label": "Chrysler Pacifica 2021-23", + "id": "CHRYSLER_PACIFICA_2020", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "CHRYSLER_PACIFICA_2018_HYBRID|2017-2018": { + "label": "Chrysler Pacifica Hybrid 2017-18", + "id": "CHRYSLER_PACIFICA_2018_HYBRID", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica Hybrid", + "yrs": [ + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHRYSLER_PACIFICA_2019_HYBRID|2019-2025": { + "label": "Chrysler Pacifica Hybrid 2019-25", + "id": "CHRYSLER_PACIFICA_2019_HYBRID", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica Hybrid", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "COMMA_BODY|na": { + "label": "comma body", + "id": "COMMA_BODY", + "mk": "comma", + "grp": "body", + "mdl": "body", + "yrs": [], + "req": "All" + }, + "SEAT_ATECA_MK1|2018-2023": { + "label": "CUPRA Ateca 2018-23", + "id": "SEAT_ATECA_MK1", + "mk": "CUPRA", + "grp": "volkswagen", + "mdl": "Ateca", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "CUPRA_BORN_MK1|2022-2023": { + "label": "CUPRA Born 2022-23", + "id": "CUPRA_BORN_MK1", + "mk": "CUPRA", + "grp": "volkswagen", + "mdl": "Born", + "yrs": [ + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "DODGE_DURANGO|2020-2021": { + "label": "Dodge Durango 2020-21", + "id": "DODGE_DURANGO", + "mk": "Dodge", + "grp": "chrysler", + "mdl": "Durango", + "yrs": [ + "2020", + "2021" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "FORD_BRONCO_SPORT_MK1|2021-2024": { + "label": "Ford Bronco Sport 2021-24", + "id": "FORD_BRONCO_SPORT_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Bronco Sport", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4|2020-2022": { + "label": "Ford Escape 2020-22", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4_5|2023-2024": { + "label": "Ford Escape 2023-24", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4|2020-2022#2": { + "label": "Ford Escape Hybrid 2020-22", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4_5|2023-2024#2": { + "label": "Ford Escape Hybrid 2023-24", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape Hybrid", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4|2020-2022#3": { + "label": "Ford Escape Plug-in Hybrid 2020-22", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape Plug-in Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4_5|2023-2024#3": { + "label": "Ford Escape Plug-in Hybrid 2023-24", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape Plug-in Hybrid", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_EXPEDITION_MK4|2022-2024": { + "label": "Ford Expedition 2022-24", + "id": "FORD_EXPEDITION_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Expedition", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist 2.0" + }, + "FORD_EXPLORER_MK6|2020-2024": { + "label": "Ford Explorer 2020-24", + "id": "FORD_EXPLORER_MK6", + "mk": "Ford", + "grp": "ford", + "mdl": "Explorer", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_EXPLORER_MK6|2020-2024#2": { + "label": "Ford Explorer Hybrid 2020-24", + "id": "FORD_EXPLORER_MK6", + "mk": "Ford", + "grp": "ford", + "mdl": "Explorer Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_F_150_MK14|2021-2023": { + "label": "Ford F-150 2021-23", + "id": "FORD_F_150_MK14", + "mk": "Ford", + "grp": "ford", + "mdl": "F-150", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Co-Pilot360 Assist 2.0" + }, + "FORD_F_150_MK14|2021-2023#2": { + "label": "Ford F-150 Hybrid 2021-23", + "id": "FORD_F_150_MK14", + "mk": "Ford", + "grp": "ford", + "mdl": "F-150 Hybrid", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Co-Pilot360 Assist 2.0" + }, + "FORD_F_150_LIGHTNING_MK1|2022-2023": { + "label": "Ford F-150 Lightning 2022-23", + "id": "FORD_F_150_LIGHTNING_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "F-150 Lightning", + "yrs": [ + "2022", + "2023" + ], + "req": "Co-Pilot360 Assist 2.0" + }, + "FORD_FOCUS_MK4|2018": { + "label": "Ford Focus 2018", + "id": "FORD_FOCUS_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Focus", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_FOCUS_MK4|2018#2": { + "label": "Ford Focus Hybrid 2018", + "id": "FORD_FOCUS_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Focus Hybrid", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_ESCAPE_MK4|2020-2023": { + "label": "Ford Kuga 2020-23", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_ESCAPE_MK4|2020-2023#2": { + "label": "Ford Kuga Hybrid 2020-23", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_ESCAPE_MK4_5|2024": { + "label": "Ford Kuga Hybrid 2024", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga Hybrid", + "yrs": [ + "2024" + ], + "req": "All" + }, + "FORD_ESCAPE_MK4|2020-2023#3": { + "label": "Ford Kuga Plug-in Hybrid 2020-23", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga Plug-in Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_ESCAPE_MK4_5|2024#2": { + "label": "Ford Kuga Plug-in Hybrid 2024", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga Plug-in Hybrid", + "yrs": [ + "2024" + ], + "req": "All" + }, + "FORD_MAVERICK_MK1|2022": { + "label": "Ford Maverick 2022", + "id": "FORD_MAVERICK_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Maverick", + "yrs": [ + "2022" + ], + "req": "LARIAT Luxury" + }, + "FORD_MAVERICK_MK1|2023-2024": { + "label": "Ford Maverick 2023-24", + "id": "FORD_MAVERICK_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Maverick", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist" + }, + "FORD_MAVERICK_MK1|2022#2": { + "label": "Ford Maverick Hybrid 2022", + "id": "FORD_MAVERICK_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Maverick Hybrid", + "yrs": [ + "2022" + ], + "req": "LARIAT Luxury" + }, + "FORD_MAVERICK_MK1|2023-2024#2": { + "label": "Ford Maverick Hybrid 2023-24", + "id": "FORD_MAVERICK_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Maverick Hybrid", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist" + }, + "FORD_MUSTANG_MACH_E_MK1|2021-2024": { + "label": "Ford Mustang Mach-E 2021-24", + "id": "FORD_MUSTANG_MACH_E_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Mustang Mach-E", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "FORD_RANGER_MK2|2024": { + "label": "Ford Ranger 2024", + "id": "FORD_RANGER_MK2", + "mk": "Ford", + "grp": "ford", + "mdl": "Ranger", + "yrs": [ + "2024" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "GENESIS_EQ900|2017": { + "label": "Genesis EQ900 2017", + "id": "GENESIS_EQ900", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "EQ900", + "yrs": [ + "2017" + ], + "req": "All" + }, + "GENESIS_EQ900_L|2016-2018": { + "label": "Genesis EQ900 Limousine 2016-18", + "id": "GENESIS_EQ900_L", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "EQ900 Limousine", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "All" + }, + "GENESIS_G70|2018": { + "label": "Genesis G70 2018", + "id": "GENESIS_G70", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G70", + "yrs": [ + "2018" + ], + "req": "All" + }, + "GENESIS_G70_2020|2019-2021": { + "label": "Genesis G70 2019-21", + "id": "GENESIS_G70_2020", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G70", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "GENESIS_G70_2020|2022-2023": { + "label": "Genesis G70 2022-23", + "id": "GENESIS_G70_2020", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G70", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_GENESIS|2017": { + "label": "Genesis G80 2017", + "id": "HYUNDAI_GENESIS", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G80", + "yrs": [ + "2017" + ], + "req": "All" + }, + "GENESIS_G80|2018-2019": { + "label": "Genesis G80 2018-19", + "id": "GENESIS_G80", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G80", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "GENESIS_G80_2ND_GEN_FL|2024": { + "label": "Genesis G80 (2.5T Advanced Trim, with HDA II) 2024", + "id": "GENESIS_G80_2ND_GEN_FL", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G80 (2.5T Advanced Trim, with HDA II)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "GENESIS_G90|2017-2020": { + "label": "Genesis G90 2017-20", + "id": "GENESIS_G90", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G90", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "GENESIS_G90_2019|2019": { + "label": "Genesis G90 (South Korea only) 2019", + "id": "GENESIS_G90_2019", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G90 (South Korea only)", + "yrs": [ + "2019" + ], + "req": "All" + }, + "GENESIS_GV60_EV_1ST_GEN|2023": { + "label": "Genesis GV60 (Advanced Trim) 2023", + "id": "GENESIS_GV60_EV_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV60 (Advanced Trim)", + "yrs": [ + "2023" + ], + "req": "All" + }, + "GENESIS_GV60_EV_1ST_GEN|2022-2023": { + "label": "Genesis GV60 (Performance Trim) 2022-23", + "id": "GENESIS_GV60_EV_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV60 (Performance Trim)", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "GENESIS_GV70_1ST_GEN|2022-2024": { + "label": "Genesis GV70 (2.5T Trim, without HDA II) 2022-24", + "id": "GENESIS_GV70_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 (2.5T Trim, without HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "GENESIS_GV70_1ST_GEN|2022-2023": { + "label": "Genesis GV70 (3.5T Trim, without HDA II) 2022-23", + "id": "GENESIS_GV70_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 (3.5T Trim, without HDA II)", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "GENESIS_GV70_ELECTRIFIED_1ST_GEN|2022": { + "label": "Genesis GV70 Electrified (Australia Only) 2022", + "id": "GENESIS_GV70_ELECTRIFIED_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 Electrified (Australia Only)", + "yrs": [ + "2022" + ], + "req": "All" + }, + "GENESIS_GV70_EV_1ST_GEN|2022-2023": { + "label": "Genesis GV70 Electrified (South Korea only) 2022-23", + "id": "GENESIS_GV70_EV_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 Electrified (South Korea only)", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "GENESIS_GV70_ELECTRIFIED_1ST_GEN|2023-2024": { + "label": "Genesis GV70 Electrified (with HDA II) 2023-24", + "id": "GENESIS_GV70_ELECTRIFIED_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 Electrified (with HDA II)", + "yrs": [ + "2023", + "2024" + ], + "req": "Highway Driving Assist II" + }, + "GENESIS_GV80|2023": { + "label": "Genesis GV80 2023", + "id": "GENESIS_GV80", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV80", + "yrs": [ + "2023" + ], + "req": "All" + }, + "GMC_ACADIA|2018": { + "label": "GMC Acadia 2018", + "id": "GMC_ACADIA", + "mk": "GMC", + "grp": "gm", + "mdl": "Acadia", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHEVROLET_SILVERADO|2020-2021#2": { + "label": "GMC Sierra 1500 2020-21", + "id": "CHEVROLET_SILVERADO", + "mk": "GMC", + "grp": "gm", + "mdl": "Sierra 1500", + "yrs": [ + "2020", + "2021" + ], + "req": "Driver Alert Package II" + }, + "HONDA_ACCORD|2018-2022": { + "label": "Honda Accord 2018-22", + "id": "HONDA_ACCORD", + "mk": "Honda", + "grp": "honda", + "mdl": "Accord", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HONDA_ACCORD_11G|2023-2025": { + "label": "Honda Accord 2023-25", + "id": "HONDA_ACCORD_11G", + "mk": "Honda", + "grp": "honda", + "mdl": "Accord", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_ACCORD|2018-2022#2": { + "label": "Honda Accord Hybrid 2018-22", + "id": "HONDA_ACCORD", + "mk": "Honda", + "grp": "honda", + "mdl": "Accord Hybrid", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HONDA_ACCORD_11G|2023-2025#2": { + "label": "Honda Accord Hybrid 2023-25", + "id": "HONDA_ACCORD_11G", + "mk": "Honda", + "grp": "honda", + "mdl": "Accord Hybrid", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_CITY_7G|2023": { + "label": "Honda City (Brazil only) 2023", + "id": "HONDA_CITY_7G", + "mk": "Honda", + "grp": "honda", + "mdl": "City (Brazil only)", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HONDA_CIVIC|2016-2018": { + "label": "Honda Civic 2016-18", + "id": "HONDA_CIVIC", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "Honda Sensing" + }, + "HONDA_CIVIC_BOSCH|2019-2021": { + "label": "Honda Civic 2019-21", + "id": "HONDA_CIVIC_BOSCH", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2022-2024": { + "label": "Honda Civic 2022-24", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "HONDA_CIVIC_BOSCH|2017-2018": { + "label": "Honda Civic Hatchback 2017-18", + "id": "HONDA_CIVIC_BOSCH", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback", + "yrs": [ + "2017", + "2018" + ], + "req": "Honda Sensing" + }, + "HONDA_CIVIC_BOSCH|2019-2021#2": { + "label": "Honda Civic Hatchback 2019-21", + "id": "HONDA_CIVIC_BOSCH", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2022-2024#2": { + "label": "Honda Civic Hatchback 2022-24", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2025-2026": { + "label": "Honda Civic Hatchback Hybrid 2025-26", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback Hybrid", + "yrs": [ + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2023": { + "label": "Honda Civic Hatchback Hybrid (Europe only) 2023", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback Hybrid (Europe only)", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2025-2026#2": { + "label": "Honda Civic Hybrid 2025-26", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hybrid", + "yrs": [ + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_CLARITY|2018-2021": { + "label": "Honda Clarity 2018-21", + "id": "HONDA_CLARITY", + "mk": "Honda", + "grp": "honda", + "mdl": "Clarity", + "yrs": [ + "2018", + "2019", + "2020", + "2021" + ], + "req": "Honda Sensing" + }, + "HONDA_CRV|2015-2016": { + "label": "Honda CR-V 2015-16", + "id": "HONDA_CRV", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V", + "yrs": [ + "2015", + "2016" + ], + "req": "Touring Trim" + }, + "HONDA_CRV_5G|2017-2022": { + "label": "Honda CR-V 2017-22", + "id": "HONDA_CRV_5G", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Honda Sensing" + }, + "HONDA_CRV_6G|2023-2026": { + "label": "Honda CR-V 2023-26", + "id": "HONDA_CRV_6G", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V", + "yrs": [ + "2023", + "2024", + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_CRV_HYBRID|2017-2022": { + "label": "Honda CR-V Hybrid 2017-22", + "id": "HONDA_CRV_HYBRID", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V Hybrid", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Honda Sensing" + }, + "HONDA_CRV_6G|2023-2026#2": { + "label": "Honda CR-V Hybrid 2023-26", + "id": "HONDA_CRV_6G", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V Hybrid", + "yrs": [ + "2023", + "2024", + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_E|2020": { + "label": "Honda e 2020", + "id": "HONDA_E", + "mk": "Honda", + "grp": "honda", + "mdl": "e", + "yrs": [ + "2020" + ], + "req": "All" + }, + "HONDA_FIT|2018-2020": { + "label": "Honda Fit 2018-20", + "id": "HONDA_FIT", + "mk": "Honda", + "grp": "honda", + "mdl": "Fit", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "Honda Sensing" + }, + "HONDA_FREED|2020": { + "label": "Honda Freed 2020", + "id": "HONDA_FREED", + "mk": "Honda", + "grp": "honda", + "mdl": "Freed", + "yrs": [ + "2020" + ], + "req": "Honda Sensing" + }, + "HONDA_HRV|2019-2022": { + "label": "Honda HR-V 2019-22", + "id": "HONDA_HRV", + "mk": "Honda", + "grp": "honda", + "mdl": "HR-V", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "Honda Sensing" + }, + "HONDA_HRV_3G|2023-2025": { + "label": "Honda HR-V 2023-25", + "id": "HONDA_HRV_3G", + "mk": "Honda", + "grp": "honda", + "mdl": "HR-V", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_INSIGHT|2019-2022": { + "label": "Honda Insight 2019-22", + "id": "HONDA_INSIGHT", + "mk": "Honda", + "grp": "honda", + "mdl": "Insight", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HONDA_ACCORD|2018": { + "label": "Honda Inspire 2018", + "id": "HONDA_ACCORD", + "mk": "Honda", + "grp": "honda", + "mdl": "Inspire", + "yrs": [ + "2018" + ], + "req": "All" + }, + "HONDA_NBOX_2G|2018": { + "label": "Honda N-Box 2018", + "id": "HONDA_NBOX_2G", + "mk": "Honda", + "grp": "honda", + "mdl": "N-Box", + "yrs": [ + "2018" + ], + "req": "All" + }, + "HONDA_ODYSSEY|2018-2020": { + "label": "Honda Odyssey 2018-20", + "id": "HONDA_ODYSSEY", + "mk": "Honda", + "grp": "honda", + "mdl": "Odyssey", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "Honda Sensing" + }, + "HONDA_ODYSSEY_5G_MMR|2021-2026": { + "label": "Honda Odyssey 2021-26", + "id": "HONDA_ODYSSEY_5G_MMR", + "mk": "Honda", + "grp": "honda", + "mdl": "Odyssey", + "yrs": [ + "2021", + "2022", + "2023", + "2024", + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_ODYSSEY_TWN|2018-2019": { + "label": "Honda Odyssey (Taiwan) 2018-19", + "id": "HONDA_ODYSSEY_TWN", + "mk": "Honda", + "grp": "honda", + "mdl": "Odyssey (Taiwan)", + "yrs": [ + "2018", + "2019" + ], + "req": "Honda Sensing" + }, + "HONDA_PILOT|2019-2025": { + "label": "Honda Passport 2019-25", + "id": "HONDA_PILOT", + "mk": "Honda", + "grp": "honda", + "mdl": "Passport", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_PASSPORT_4G|2026": { + "label": "Honda Passport 2026", + "id": "HONDA_PASSPORT_4G", + "mk": "Honda", + "grp": "honda", + "mdl": "Passport", + "yrs": [ + "2026" + ], + "req": "All" + }, + "HONDA_PILOT|2016-2022": { + "label": "Honda Pilot 2016-22", + "id": "HONDA_PILOT", + "mk": "Honda", + "grp": "honda", + "mdl": "Pilot", + "yrs": [ + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Honda Sensing" + }, + "HONDA_PILOT_4G|2023-2025": { + "label": "Honda Pilot 2023-25", + "id": "HONDA_PILOT_4G", + "mk": "Honda", + "grp": "honda", + "mdl": "Pilot", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_RIDGELINE|2017-2025": { + "label": "Honda Ridgeline 2017-25", + "id": "HONDA_RIDGELINE", + "mk": "Honda", + "grp": "honda", + "mdl": "Ridgeline", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "Honda Sensing" + }, + "HYUNDAI_AZERA_6TH_GEN|2022": { + "label": "Hyundai Azera 2022", + "id": "HYUNDAI_AZERA_6TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Azera", + "yrs": [ + "2022" + ], + "req": "All" + }, + "HYUNDAI_AZERA_7TH_GEN|2023-2024": { + "label": "Hyundai Azera 2023-24", + "id": "HYUNDAI_AZERA_7TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Azera", + "yrs": [ + "2023", + "2024" + ], + "req": "All" + }, + "HYUNDAI_AZERA_HEV_6TH_GEN|2019": { + "label": "Hyundai Azera Hybrid 2019", + "id": "HYUNDAI_AZERA_HEV_6TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Azera Hybrid", + "yrs": [ + "2019" + ], + "req": "All" + }, + "HYUNDAI_AZERA_HEV_6TH_GEN|2020": { + "label": "Hyundai Azera Hybrid 2020", + "id": "HYUNDAI_AZERA_HEV_6TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Azera Hybrid", + "yrs": [ + "2020" + ], + "req": "All" + }, + "HYUNDAI_CASPER|2023": { + "label": "Hyundai Casper 2023", + "id": "HYUNDAI_CASPER", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Casper", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HYUNDAI_CASPER_EV|2024": { + "label": "Hyundai Casper Electric 2024", + "id": "HYUNDAI_CASPER_EV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Casper Electric", + "yrs": [ + "2024" + ], + "req": "All" + }, + "HYUNDAI_CUSTIN_1ST_GEN|2023": { + "label": "Hyundai Custin 2023", + "id": "HYUNDAI_CUSTIN_1ST_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Custin", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HYUNDAI_ELANTRA|2017-2018": { + "label": "Hyundai Elantra 2017-18", + "id": "HYUNDAI_ELANTRA", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra", + "yrs": [ + "2017", + "2018" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_ELANTRA|2019": { + "label": "Hyundai Elantra 2019", + "id": "HYUNDAI_ELANTRA", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_ELANTRA_2021|2021-2023": { + "label": "Hyundai Elantra 2021-23", + "id": "HYUNDAI_ELANTRA_2021", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_ELANTRA_GT_I30|2017-2020": { + "label": "Hyundai Elantra GT 2017-20", + "id": "HYUNDAI_ELANTRA_GT_I30", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra GT", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_ELANTRA_HEV_2021|2021-2023": { + "label": "Hyundai Elantra Hybrid 2021-23", + "id": "HYUNDAI_ELANTRA_HEV_2021", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra Hybrid", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_GENESIS|2015-2016": { + "label": "Hyundai Genesis 2015-16", + "id": "HYUNDAI_GENESIS", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Genesis", + "yrs": [ + "2015", + "2016" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_GRANDEUR_IG|2018-2019": { + "label": "Hyundai Grandeur 2018-19", + "id": "HYUNDAI_GRANDEUR_IG", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Grandeur", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "HYUNDAI_GRANDEUR_IG_HEV|2018-2019": { + "label": "Hyundai Grandeur Hybrid 2018-19", + "id": "HYUNDAI_GRANDEUR_IG_HEV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Grandeur Hybrid", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "HYUNDAI_ELANTRA_GT_I30|2017-2019": { + "label": "Hyundai i30 2017-19", + "id": "HYUNDAI_ELANTRA_GT_I30", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "i30", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_5|2022-2024": { + "label": "Hyundai Ioniq 5 (Southeast Asia and Europe only) 2022-24", + "id": "HYUNDAI_IONIQ_5", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 (Southeast Asia and Europe only)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "HYUNDAI_IONIQ_5|2022-2024#2": { + "label": "Hyundai Ioniq 5 (with HDA II) 2022-24", + "id": "HYUNDAI_IONIQ_5", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 (with HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Highway Driving Assist II" + }, + "HYUNDAI_IONIQ_5|2022-2024#3": { + "label": "Hyundai Ioniq 5 (without HDA II) 2022-24", + "id": "HYUNDAI_IONIQ_5", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 (without HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Highway Driving Assist" + }, + "HYUNDAI_IONIQ_5_N|2024": { + "label": "Hyundai Ioniq 5 N (with HDA II) 2024", + "id": "HYUNDAI_IONIQ_5_N", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 N (with HDA II)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "HYUNDAI_IONIQ_5_PE|2024": { + "label": "Hyundai Ioniq 5 PE (with HDA II) 2024", + "id": "HYUNDAI_IONIQ_5_PE", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 PE (with HDA II)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "HYUNDAI_IONIQ_5_PE|2024#2": { + "label": "Hyundai Ioniq 5 PE (without HDA II) 2024", + "id": "HYUNDAI_IONIQ_5_PE", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 PE (without HDA II)", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_6|2023-2024": { + "label": "Hyundai Ioniq 6 (with HDA II) 2023-24", + "id": "HYUNDAI_IONIQ_6", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 6 (with HDA II)", + "yrs": [ + "2023", + "2024" + ], + "req": "Highway Driving Assist II" + }, + "HYUNDAI_IONIQ_9|2026": { + "label": "Hyundai Ioniq 9 2026", + "id": "HYUNDAI_IONIQ_9", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 9", + "yrs": [ + "2026" + ], + "req": "All" + }, + "HYUNDAI_IONIQ_EV_LTD|2019": { + "label": "Hyundai Ioniq Electric 2019", + "id": "HYUNDAI_IONIQ_EV_LTD", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Electric", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_EV_2020|2020": { + "label": "Hyundai Ioniq Electric 2020", + "id": "HYUNDAI_IONIQ_EV_2020", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Electric", + "yrs": [ + "2020" + ], + "req": "All" + }, + "HYUNDAI_IONIQ|2017-2019": { + "label": "Hyundai Ioniq Hybrid 2017-19", + "id": "HYUNDAI_IONIQ", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Hybrid", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_HEV_2022|2020-2022": { + "label": "Hyundai Ioniq Hybrid 2020-22", + "id": "HYUNDAI_IONIQ_HEV_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_PHEV_2019|2019": { + "label": "Hyundai Ioniq Plug-in Hybrid 2019", + "id": "HYUNDAI_IONIQ_PHEV_2019", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Plug-in Hybrid", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_PHEV|2020-2022": { + "label": "Hyundai Ioniq Plug-in Hybrid 2020-22", + "id": "HYUNDAI_IONIQ_PHEV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Plug-in Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HYUNDAI_KONA|2020": { + "label": "Hyundai Kona 2020", + "id": "HYUNDAI_KONA", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona", + "yrs": [ + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_2022|2022": { + "label": "Hyundai Kona 2022", + "id": "HYUNDAI_KONA_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona", + "yrs": [ + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_EV|2018-2021": { + "label": "Hyundai Kona Electric 2018-21", + "id": "HYUNDAI_KONA_EV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Electric", + "yrs": [ + "2018", + "2019", + "2020", + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_EV_2022|2022-2023": { + "label": "Hyundai Kona Electric 2022-23", + "id": "HYUNDAI_KONA_EV_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Electric", + "yrs": [ + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_EV_2ND_GEN|2023": { + "label": "Hyundai Kona Electric (with HDA II, Korea only) 2023", + "id": "HYUNDAI_KONA_EV_2ND_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Electric (with HDA II, Korea only)", + "yrs": [ + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_HEV|2020": { + "label": "Hyundai Kona Hybrid 2020", + "id": "HYUNDAI_KONA_HEV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Hybrid", + "yrs": [ + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_HEV_2ND_GEN|2024": { + "label": "Hyundai Kona Hybrid 2024", + "id": "HYUNDAI_KONA_HEV_2ND_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Hybrid", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_NEXO_1ST_GEN|2021": { + "label": "Hyundai Nexo 2021", + "id": "HYUNDAI_NEXO_1ST_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Nexo", + "yrs": [ + "2021" + ], + "req": "All" + }, + "HYUNDAI_NEXO|2018-2020": { + "label": "Hyundai Nexo (South Korea only) 2018-20", + "id": "HYUNDAI_NEXO", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Nexo (South Korea only)", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "HYUNDAI_PALISADE|2020-2022": { + "label": "Hyundai Palisade 2020-22", + "id": "HYUNDAI_PALISADE", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Palisade", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HYUNDAI_PORTER_II_EV|2024": { + "label": "Hyundai Porter II Electric 2024", + "id": "HYUNDAI_PORTER_II_EV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Porter II Electric", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SANTA_CRUZ_1ST_GEN|2022-2024": { + "label": "Hyundai Santa Cruz 2022-24", + "id": "HYUNDAI_SANTA_CRUZ_1ST_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Cruz", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SANTA_FE|2019-2020": { + "label": "Hyundai Santa Fe 2019-20", + "id": "HYUNDAI_SANTA_FE", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe", + "yrs": [ + "2019", + "2020" + ], + "req": "All" + }, + "HYUNDAI_SANTA_FE_2022|2021-2023": { + "label": "Hyundai Santa Fe 2021-23", + "id": "HYUNDAI_SANTA_FE_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_SANTAFE_MX5|2024": { + "label": "Hyundai Santa Fe (MX5) 2024", + "id": "HYUNDAI_SANTAFE_MX5", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe (MX5)", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SANTA_FE_HEV_2022|2022-2023": { + "label": "Hyundai Santa Fe Hybrid 2022-23", + "id": "HYUNDAI_SANTA_FE_HEV_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe Hybrid", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_SANTAFE_MX5_HEV|2024": { + "label": "Hyundai Santa Fe Hybrid (MX5) 2024", + "id": "HYUNDAI_SANTAFE_MX5_HEV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe Hybrid (MX5)", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SANTA_FE_PHEV_2022|2022-2023": { + "label": "Hyundai Santa Fe Plug-in Hybrid 2022-23", + "id": "HYUNDAI_SANTA_FE_PHEV_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe Plug-in Hybrid", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_SONATA_LF|2018-2019": { + "label": "Hyundai Sonata 2018-19", + "id": "HYUNDAI_SONATA_LF", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Sonata", + "yrs": [ + "2018", + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SONATA|2020-2023": { + "label": "Hyundai Sonata 2020-23", + "id": "HYUNDAI_SONATA", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Sonata", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_SONATA_2024|2024-2025": { + "label": "Hyundai Sonata 2024-25", + "id": "HYUNDAI_SONATA_2024", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Sonata", + "yrs": [ + "2024", + "2025" + ], + "req": "All" + }, + "HYUNDAI_SONATA_HYBRID|2020-2023": { + "label": "Hyundai Sonata Hybrid 2020-23", + "id": "HYUNDAI_SONATA_HYBRID", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Sonata Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_STARIA_4TH_GEN|2023": { + "label": "Hyundai Staria 2023", + "id": "HYUNDAI_STARIA_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Staria", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HYUNDAI_TUCSON|2021": { + "label": "Hyundai Tucson 2021", + "id": "HYUNDAI_TUCSON", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson", + "yrs": [ + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_TUCSON_4TH_GEN|2022": { + "label": "Hyundai Tucson 2022", + "id": "HYUNDAI_TUCSON_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson", + "yrs": [ + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_TUCSON_4TH_GEN|2023-2024": { + "label": "Hyundai Tucson 2023-24", + "id": "HYUNDAI_TUCSON_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson", + "yrs": [ + "2023", + "2024" + ], + "req": "All" + }, + "HYUNDAI_TUCSON|2019": { + "label": "Hyundai Tucson Diesel 2019", + "id": "HYUNDAI_TUCSON", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson Diesel", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_TUCSON_4TH_GEN|2022-2024": { + "label": "Hyundai Tucson Hybrid 2022-24", + "id": "HYUNDAI_TUCSON_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson Hybrid", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "HYUNDAI_TUCSON_4TH_GEN|2024": { + "label": "Hyundai Tucson Plug-in Hybrid 2024", + "id": "HYUNDAI_TUCSON_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson Plug-in Hybrid", + "yrs": [ + "2024" + ], + "req": "All" + }, + "HYUNDAI_VELOSTER|2019-2020": { + "label": "Hyundai Veloster 2019-20", + "id": "HYUNDAI_VELOSTER", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Veloster", + "yrs": [ + "2019", + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "JEEP_GRAND_CHEROKEE|2016-2018": { + "label": "Jeep Grand Cherokee 2016-18", + "id": "JEEP_GRAND_CHEROKEE", + "mk": "Jeep", + "grp": "chrysler", + "mdl": "Grand Cherokee", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "JEEP_GRAND_CHEROKEE_2019|2019-2021": { + "label": "Jeep Grand Cherokee 2019-21", + "id": "JEEP_GRAND_CHEROKEE_2019", + "mk": "Jeep", + "grp": "chrysler", + "mdl": "Grand Cherokee", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "KIA_CARNIVAL_4TH_GEN|2022-2024": { + "label": "Kia Carnival 2022-24", + "id": "KIA_CARNIVAL_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Carnival", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_CARNIVAL_4TH_GEN|2023": { + "label": "Kia Carnival (China only) 2023", + "id": "KIA_CARNIVAL_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Carnival (China only)", + "yrs": [ + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_CEED|2019-2021": { + "label": "Kia Ceed 2019-21", + "id": "KIA_CEED", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Ceed", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_EV3|2025": { + "label": "Kia EV3 (SV1) 2025", + "id": "KIA_EV3", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV3 (SV1)", + "yrs": [ + "2025" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_EV4|2025": { + "label": "Kia EV4 2025", + "id": "KIA_EV4", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV4", + "yrs": [ + "2025" + ], + "req": "All" + }, + "KIA_EV6|2022-2024": { + "label": "Kia EV6 (Southeast Asia only) 2022-24", + "id": "KIA_EV6", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 (Southeast Asia only)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "KIA_EV6|2022-2024#2": { + "label": "Kia EV6 (with HDA II) 2022-24", + "id": "KIA_EV6", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 (with HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Highway Driving Assist II" + }, + "KIA_EV6|2022-2024#3": { + "label": "Kia EV6 (without HDA II) 2022-24", + "id": "KIA_EV6", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 (without HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Highway Driving Assist" + }, + "KIA_EV6_PE|2025": { + "label": "Kia EV6 PE (with HDA II) 2025", + "id": "KIA_EV6_PE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 PE (with HDA II)", + "yrs": [ + "2025" + ], + "req": "Highway Driving Assist II" + }, + "KIA_EV6_PE|2025#2": { + "label": "Kia EV6 PE (without HDA II) 2025", + "id": "KIA_EV6_PE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 PE (without HDA II)", + "yrs": [ + "2025" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_EV9|2024": { + "label": "Kia EV9 (MV) 2024", + "id": "KIA_EV9", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV9 (MV)", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_FORTE|2019-2021": { + "label": "Kia Forte 2019-21", + "id": "KIA_FORTE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Forte", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_FORTE|2022-2023": { + "label": "Kia Forte 2022-23", + "id": "KIA_FORTE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Forte", + "yrs": [ + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_K5|2016-2019": { + "label": "Kia K5 2016, 2019", + "id": "KIA_K5", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5", + "yrs": [ + "2016", + "2019" + ], + "req": "All" + }, + "KIA_K5_2021|2021-2024": { + "label": "Kia K5 2021-24", + "id": "KIA_K5_2021", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_K5_DL3_24|2024": { + "label": "Kia K5 (South Korea only) 2024", + "id": "KIA_K5_DL3_24", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 (South Korea only)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "KIA_K5_HEV|2017": { + "label": "Kia K5 Hybrid 2017", + "id": "KIA_K5_HEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 Hybrid", + "yrs": [ + "2017" + ], + "req": "All" + }, + "KIA_K5_HEV_2020|2020-2022": { + "label": "Kia K5 Hybrid 2020-22", + "id": "KIA_K5_HEV_2020", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_K5_HEV_2022|2022": { + "label": "Kia K5 Hybrid (South Korea only) 2022", + "id": "KIA_K5_HEV_2022", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 Hybrid (South Korea only)", + "yrs": [ + "2022" + ], + "req": "All" + }, + "KIA_K5_DL3_24_HEV|2024": { + "label": "Kia K5 Hybrid (South Korea only) 2024", + "id": "KIA_K5_DL3_24_HEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 Hybrid (South Korea only)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "KIA_K7|2016-2019": { + "label": "Kia K7 2016-19", + "id": "KIA_K7", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K7", + "yrs": [ + "2016", + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "KIA_K7_PE|2020": { + "label": "Kia K7 2020", + "id": "KIA_K7_PE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K7", + "yrs": [ + "2020" + ], + "req": "All" + }, + "KIA_K7_HEV|2016-2019": { + "label": "Kia K7 Hybrid 2016-19", + "id": "KIA_K7_HEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K7 Hybrid", + "yrs": [ + "2016", + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "KIA_K7_HEV_PE|2020": { + "label": "Kia K7 Hybrid 2020", + "id": "KIA_K7_HEV_PE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K7 Hybrid", + "yrs": [ + "2020" + ], + "req": "All" + }, + "KIA_K8_HEV_1ST_GEN|2023": { + "label": "Kia K8 Hybrid (with HDA II) 2023", + "id": "KIA_K8_HEV_1ST_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K8 Hybrid (with HDA II)", + "yrs": [ + "2023" + ], + "req": "Highway Driving Assist II" + }, + "KIA_K9|2016-2019": { + "label": "Kia K9 2016-19", + "id": "KIA_K9", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K9", + "yrs": [ + "2016", + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "KIA_MOHAVE|2019": { + "label": "Kia Mohave 2019", + "id": "KIA_MOHAVE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Mohave", + "yrs": [ + "2019" + ], + "req": "All" + }, + "KIA_NIRO_EV|2019": { + "label": "Kia Niro EV 2019", + "id": "KIA_NIRO_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2019" + ], + "req": "All" + }, + "KIA_NIRO_EV|2020": { + "label": "Kia Niro EV 2020", + "id": "KIA_NIRO_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2020" + ], + "req": "All" + }, + "KIA_NIRO_EV|2021": { + "label": "Kia Niro EV 2021", + "id": "KIA_NIRO_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2021" + ], + "req": "All" + }, + "KIA_NIRO_EV|2022": { + "label": "Kia Niro EV 2022", + "id": "KIA_NIRO_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2022" + ], + "req": "All" + }, + "KIA_NIRO_EV_2ND_GEN|2023": { + "label": "Kia Niro EV 2023", + "id": "KIA_NIRO_EV_2ND_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2023" + ], + "req": "All" + }, + "KIA_NIRO_PHEV|2018": { + "label": "Kia Niro Hybrid 2018", + "id": "KIA_NIRO_PHEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Hybrid", + "yrs": [ + "2018" + ], + "req": "All" + }, + "KIA_NIRO_HEV_2021|2021": { + "label": "Kia Niro Hybrid 2021", + "id": "KIA_NIRO_HEV_2021", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Hybrid", + "yrs": [ + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_HEV_2021|2022": { + "label": "Kia Niro Hybrid 2022", + "id": "KIA_NIRO_HEV_2021", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Hybrid", + "yrs": [ + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_HEV_2ND_GEN|2023": { + "label": "Kia Niro Hybrid 2023", + "id": "KIA_NIRO_HEV_2ND_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Hybrid", + "yrs": [ + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_PHEV|2018-2019": { + "label": "Kia Niro Plug-in Hybrid 2018-19", + "id": "KIA_NIRO_PHEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Plug-in Hybrid", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "KIA_NIRO_PHEV|2020": { + "label": "Kia Niro Plug-in Hybrid 2020", + "id": "KIA_NIRO_PHEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Plug-in Hybrid", + "yrs": [ + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_PHEV_2022|2021": { + "label": "Kia Niro Plug-in Hybrid 2021", + "id": "KIA_NIRO_PHEV_2022", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Plug-in Hybrid", + "yrs": [ + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_PHEV_2022|2022": { + "label": "Kia Niro Plug-in Hybrid 2022", + "id": "KIA_NIRO_PHEV_2022", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Plug-in Hybrid", + "yrs": [ + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_OPTIMA_G4|2017": { + "label": "Kia Optima 2017", + "id": "KIA_OPTIMA_G4", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Optima", + "yrs": [ + "2017" + ], + "req": "Advanced Smart Cruise Control" + }, + "KIA_OPTIMA_G4_FL|2019-2020": { + "label": "Kia Optima 2019-20", + "id": "KIA_OPTIMA_G4_FL", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Optima", + "yrs": [ + "2019", + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_OPTIMA_H|2017": { + "label": "Kia Optima Hybrid 2017", + "id": "KIA_OPTIMA_H", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Optima Hybrid", + "yrs": [ + "2017" + ], + "req": "Advanced Smart Cruise Control" + }, + "KIA_OPTIMA_H_G4_FL|2019": { + "label": "Kia Optima Hybrid 2019", + "id": "KIA_OPTIMA_H_G4_FL", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Optima Hybrid", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_PV5|2025": { + "label": "Kia PV5 (SW1) 2025", + "id": "KIA_PV5", + "mk": "Kia", + "grp": "hyundai", + "mdl": "PV5 (SW1)", + "yrs": [ + "2025" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_RAY_EV|2024": { + "label": "Kia Ray EV 2024", + "id": "KIA_RAY_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Ray EV", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SELTOS|2021": { + "label": "Kia Seltos 2021", + "id": "KIA_SELTOS", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Seltos", + "yrs": [ + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SORENTO|2018": { + "label": "Kia Sorento 2018", + "id": "KIA_SORENTO", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento", + "yrs": [ + "2018" + ], + "req": "Advanced Smart Cruise Control & LKAS" + }, + "KIA_SORENTO|2019": { + "label": "Kia Sorento 2019", + "id": "KIA_SORENTO", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SORENTO_4TH_GEN|2021-2023": { + "label": "Kia Sorento 2021-23", + "id": "KIA_SORENTO_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SORENTO_HEV_4TH_GEN|2021-2023": { + "label": "Kia Sorento Hybrid 2021-23", + "id": "KIA_SORENTO_HEV_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento Hybrid", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "KIA_SORENTO_HEV_4TH_GEN|2022-2023": { + "label": "Kia Sorento Plug-in Hybrid 2022-23", + "id": "KIA_SORENTO_HEV_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento Plug-in Hybrid", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "KIA_EV_SK3|2019": { + "label": "Kia Soul EV 2019", + "id": "KIA_EV_SK3", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Soul EV", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SPORTAGE_5TH_GEN|2023-2024": { + "label": "Kia Sportage 2023-24", + "id": "KIA_SPORTAGE_5TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sportage", + "yrs": [ + "2023", + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SPORTAGE_5TH_GEN|2023": { + "label": "Kia Sportage Hybrid 2023", + "id": "KIA_SPORTAGE_5TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sportage Hybrid", + "yrs": [ + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_STINGER|2018-2020": { + "label": "Kia Stinger 2018-20", + "id": "KIA_STINGER", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Stinger", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_STINGER_2022|2022-2023": { + "label": "Kia Stinger 2022-23", + "id": "KIA_STINGER_2022", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Stinger", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_PALISADE|2020-2022#2": { + "label": "Kia Telluride 2020-22", + "id": "HYUNDAI_PALISADE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Telluride", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "LEXUS_CTH|2017-2018": { + "label": "Lexus CT Hybrid 2017-18", + "id": "LEXUS_CTH", + "mk": "Lexus", + "grp": "toyota", + "mdl": "CT Hybrid", + "yrs": [ + "2017", + "2018" + ], + "req": "Lexus Safety System+" + }, + "LEXUS_ES|2017-2018": { + "label": "Lexus ES 2017-18", + "id": "LEXUS_ES", + "mk": "Lexus", + "grp": "toyota", + "mdl": "ES", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "LEXUS_ES_TSS2|2019-2025": { + "label": "Lexus ES 2019-25", + "id": "LEXUS_ES_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "ES", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "LEXUS_ES|2017-2018#2": { + "label": "Lexus ES Hybrid 2017-18", + "id": "LEXUS_ES", + "mk": "Lexus", + "grp": "toyota", + "mdl": "ES Hybrid", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "LEXUS_ES_TSS2|2019-2025#2": { + "label": "Lexus ES Hybrid 2019-25", + "id": "LEXUS_ES_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "ES Hybrid", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "LEXUS_GS_F|2016": { + "label": "Lexus GS F 2016", + "id": "LEXUS_GS_F", + "mk": "Lexus", + "grp": "toyota", + "mdl": "GS F", + "yrs": [ + "2016" + ], + "req": "All" + }, + "LEXUS_IS|2017-2019": { + "label": "Lexus IS 2017-19", + "id": "LEXUS_IS", + "mk": "Lexus", + "grp": "toyota", + "mdl": "IS", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_IS_TSS2|2022-2024": { + "label": "Lexus IS 2022-24", + "id": "LEXUS_IS_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "IS", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "LEXUS_LC_TSS2|2024-2025": { + "label": "Lexus LC 2024-25", + "id": "LEXUS_LC_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "LC", + "yrs": [ + "2024", + "2025" + ], + "req": "All" + }, + "LEXUS_LS|2018": { + "label": "Lexus LS 2018", + "id": "LEXUS_LS", + "mk": "Lexus", + "grp": "toyota", + "mdl": "LS", + "yrs": [ + "2018" + ], + "req": "All except Lexus Safety System+ A" + }, + "LEXUS_NX|2018-2019": { + "label": "Lexus NX 2018-19", + "id": "LEXUS_NX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "NX", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_NX_TSS2|2020-2021": { + "label": "Lexus NX 2020-21", + "id": "LEXUS_NX_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "NX", + "yrs": [ + "2020", + "2021" + ], + "req": "All" + }, + "LEXUS_NX|2018-2019#2": { + "label": "Lexus NX Hybrid 2018-19", + "id": "LEXUS_NX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "NX Hybrid", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_NX_TSS2|2020-2021#2": { + "label": "Lexus NX Hybrid 2020-21", + "id": "LEXUS_NX_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "NX Hybrid", + "yrs": [ + "2020", + "2021" + ], + "req": "All" + }, + "LEXUS_RC|2018-2020": { + "label": "Lexus RC 2018-20", + "id": "LEXUS_RC", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RC", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "LEXUS_RC_TSS2|2023": { + "label": "Lexus RC 2023", + "id": "LEXUS_RC_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RC", + "yrs": [ + "2023" + ], + "req": "All" + }, + "LEXUS_RX|2016": { + "label": "Lexus RX 2016", + "id": "LEXUS_RX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX", + "yrs": [ + "2016" + ], + "req": "Lexus Safety System+" + }, + "LEXUS_RX|2017-2019": { + "label": "Lexus RX 2017-19", + "id": "LEXUS_RX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_RX_TSS2|2020-2022": { + "label": "Lexus RX 2020-22", + "id": "LEXUS_RX_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "LEXUS_RX|2016#2": { + "label": "Lexus RX Hybrid 2016", + "id": "LEXUS_RX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX Hybrid", + "yrs": [ + "2016" + ], + "req": "Lexus Safety System+" + }, + "LEXUS_RX|2017-2019#2": { + "label": "Lexus RX Hybrid 2017-19", + "id": "LEXUS_RX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX Hybrid", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_RX_TSS2|2020-2022#2": { + "label": "Lexus RX Hybrid 2020-22", + "id": "LEXUS_RX_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2019-2024": { + "label": "Lexus UX Hybrid 2019-24", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "UX Hybrid", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "FORD_EXPLORER_MK6|2020-2024#3": { + "label": "Lincoln Aviator 2020-24", + "id": "FORD_EXPLORER_MK6", + "mk": "Lincoln", + "grp": "ford", + "mdl": "Aviator", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Plus" + }, + "FORD_EXPLORER_MK6|2020-2024#4": { + "label": "Lincoln Aviator Plug-in Hybrid 2020-24", + "id": "FORD_EXPLORER_MK6", + "mk": "Lincoln", + "grp": "ford", + "mdl": "Aviator Plug-in Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Plus" + }, + "VOLKSWAGEN_CRAFTER_MK2|2020-2024": { + "label": "MAN eTGE 2020-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "MAN", + "grp": "volkswagen", + "mdl": "eTGE", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CRAFTER_MK2|2017-2024": { + "label": "MAN TGE 2017-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "MAN", + "grp": "volkswagen", + "mdl": "TGE", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "MAZDA_CX5_2022|2022-2025": { + "label": "Mazda CX-5 2022-25", + "id": "MAZDA_CX5_2022", + "mk": "Mazda", + "grp": "mazda", + "mdl": "CX-5", + "yrs": [ + "2022", + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "MAZDA_CX9_2021|2021-2023": { + "label": "Mazda CX-9 2021-23", + "id": "MAZDA_CX9_2021", + "mk": "Mazda", + "grp": "mazda", + "mdl": "CX-9", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "NISSAN_ALTIMA|2019-2024": { + "label": "Nissan Altima 2019-20, 2024", + "id": "NISSAN_ALTIMA", + "mk": "Nissan", + "grp": "nissan", + "mdl": "Altima", + "yrs": [ + "2019", + "2020", + "2024" + ], + "req": "ProPILOT Assist" + }, + "NISSAN_LEAF|2018-2023": { + "label": "Nissan Leaf 2018-23", + "id": "NISSAN_LEAF", + "mk": "Nissan", + "grp": "nissan", + "mdl": "Leaf", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "ProPILOT Assist" + }, + "NISSAN_ROGUE|2018-2020": { + "label": "Nissan Rogue 2018-20", + "id": "NISSAN_ROGUE", + "mk": "Nissan", + "grp": "nissan", + "mdl": "Rogue", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "ProPILOT Assist" + }, + "NISSAN_XTRAIL|2017": { + "label": "Nissan X-Trail 2017", + "id": "NISSAN_XTRAIL", + "mk": "Nissan", + "grp": "nissan", + "mdl": "X-Trail", + "yrs": [ + "2017" + ], + "req": "ProPILOT Assist" + }, + "PORSCHE_MACAN_MK1|2017-2024": { + "label": "Porsche Macan 2017-24", + "id": "PORSCHE_MACAN_MK1", + "mk": "Porsche", + "grp": "volkswagen", + "mdl": "Macan", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "RAM_1500_5TH_GEN|2019-2024": { + "label": "Ram 1500 2019-24", + "id": "RAM_1500_5TH_GEN", + "mk": "Ram", + "grp": "chrysler", + "mdl": "1500", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "RAM_HD_5TH_GEN|2020-2024": { + "label": "Ram 2500 2020-24", + "id": "RAM_HD_5TH_GEN", + "mk": "Ram", + "grp": "chrysler", + "mdl": "2500", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "RAM_HD_5TH_GEN|2019-2022": { + "label": "Ram 3500 2019-22", + "id": "RAM_HD_5TH_GEN", + "mk": "Ram", + "grp": "chrysler", + "mdl": "3500", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "RIVIAN_R1_GEN1|2022-2024": { + "label": "Rivian R1S 2022-24", + "id": "RIVIAN_R1_GEN1", + "mk": "Rivian", + "grp": "rivian", + "mdl": "R1S", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "RIVIAN_R1_GEN1|2022-2024#2": { + "label": "Rivian R1T 2022-24", + "id": "RIVIAN_R1_GEN1", + "mk": "Rivian", + "grp": "rivian", + "mdl": "R1T", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "SEAT_ALHAMBRA_MK1|2018-2020": { + "label": "SEAT Alhambra 2018-20", + "id": "SEAT_ALHAMBRA_MK1", + "mk": "SEAT", + "grp": "volkswagen", + "mdl": "Alhambra", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SEAT_ATECA_MK1|2016-2023": { + "label": "SEAT Ateca 2016-23", + "id": "SEAT_ATECA_MK1", + "mk": "SEAT", + "grp": "volkswagen", + "mdl": "Ateca", + "yrs": [ + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SEAT_ATECA_MK1|2014-2020": { + "label": "SEAT Leon (Mk3) 2014-20", + "id": "SEAT_ATECA_MK1", + "mk": "SEAT", + "grp": "volkswagen", + "mdl": "Leon (Mk3)", + "yrs": [ + "2014", + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SEAT_LEON_MK4|2020-2025": { + "label": "SEAT Leon (Mk4) 2020-25", + "id": "SEAT_LEON_MK4", + "mk": "SEAT", + "grp": "volkswagen", + "mdl": "Leon (Mk4)", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SUBARU_ASCENT|2019-2021": { + "label": "Subaru Ascent 2019-21", + "id": "SUBARU_ASCENT", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Ascent", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "SUBARU_IMPREZA|2018-2019": { + "label": "Subaru Crosstrek 2018-19", + "id": "SUBARU_IMPREZA", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Crosstrek", + "yrs": [ + "2018", + "2019" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_IMPREZA_2020|2020-2023": { + "label": "Subaru Crosstrek 2020-23", + "id": "SUBARU_IMPREZA_2020", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Crosstrek", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_FORESTER_PREGLOBAL|2017-2018": { + "label": "Subaru Forester 2017-18", + "id": "SUBARU_FORESTER_PREGLOBAL", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Forester", + "yrs": [ + "2017", + "2018" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_FORESTER|2019-2021": { + "label": "Subaru Forester 2019-21", + "id": "SUBARU_FORESTER", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Forester", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "SUBARU_IMPREZA|2017-2019": { + "label": "Subaru Impreza 2017-19", + "id": "SUBARU_IMPREZA", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Impreza", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_IMPREZA_2020|2020-2022": { + "label": "Subaru Impreza 2020-22", + "id": "SUBARU_IMPREZA_2020", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Impreza", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_LEGACY_PREGLOBAL|2015-2018": { + "label": "Subaru Legacy 2015-18", + "id": "SUBARU_LEGACY_PREGLOBAL", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Legacy", + "yrs": [ + "2015", + "2016", + "2017", + "2018" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_LEGACY|2020-2022": { + "label": "Subaru Legacy 2020-22", + "id": "SUBARU_LEGACY", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Legacy", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "SUBARU_OUTBACK_PREGLOBAL|2015-2017": { + "label": "Subaru Outback 2015-17", + "id": "SUBARU_OUTBACK_PREGLOBAL", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Outback", + "yrs": [ + "2015", + "2016", + "2017" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_OUTBACK_PREGLOBAL_2018|2018-2019": { + "label": "Subaru Outback 2018-19", + "id": "SUBARU_OUTBACK_PREGLOBAL_2018", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Outback", + "yrs": [ + "2018", + "2019" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_OUTBACK|2020-2022": { + "label": "Subaru Outback 2020-22", + "id": "SUBARU_OUTBACK", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Outback", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "SUBARU_IMPREZA|2018-2019#2": { + "label": "Subaru XV 2018-19", + "id": "SUBARU_IMPREZA", + "mk": "Subaru", + "grp": "subaru", + "mdl": "XV", + "yrs": [ + "2018", + "2019" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_IMPREZA_2020|2020-2021": { + "label": "Subaru XV 2020-21", + "id": "SUBARU_IMPREZA_2020", + "mk": "Subaru", + "grp": "subaru", + "mdl": "XV", + "yrs": [ + "2020", + "2021" + ], + "req": "EyeSight Driver Assistance" + }, + "SKODA_ENYAQ_MK1|2021-2023": { + "label": "Å koda Enyaq 2021-23", + "id": "SKODA_ENYAQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Enyaq", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_ENYAQ_MK2|2024-2025": { + "label": "Å koda Enyaq 2024-25", + "id": "SKODA_ENYAQ_MK2", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Enyaq", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_FABIA_MK4|2022-2023": { + "label": "Å koda Fabia 2022-23", + "id": "SKODA_FABIA_MK4", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Fabia", + "yrs": [ + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_KAMIQ_MK1|2021-2023": { + "label": "Å koda Kamiq 2021-23", + "id": "SKODA_KAMIQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Kamiq", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_KAROQ_MK1|2019-2023": { + "label": "Å koda Karoq 2019-23", + "id": "SKODA_KAROQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Karoq", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_KODIAQ_MK1|2017-2023": { + "label": "Å koda Kodiaq 2017-23", + "id": "SKODA_KODIAQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Kodiaq", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_OCTAVIA_MK3|2015-2019": { + "label": "Å koda Octavia 2015-19", + "id": "SKODA_OCTAVIA_MK3", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Octavia", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_OCTAVIA_MK3|2016": { + "label": "Å koda Octavia RS 2016", + "id": "SKODA_OCTAVIA_MK3", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Octavia RS", + "yrs": [ + "2016" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_OCTAVIA_MK3|2017-2019": { + "label": "Å koda Octavia Scout 2017-19", + "id": "SKODA_OCTAVIA_MK3", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Octavia Scout", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_KAMIQ_MK1|2020-2023": { + "label": "Å koda Scala 2020-23", + "id": "SKODA_KAMIQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Scala", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_SUPERB_MK3|2015-2022": { + "label": "Å koda Superb 2015-22", + "id": "SKODA_SUPERB_MK3", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Superb", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "TESLA_MODEL_3|2019-2023": { + "label": "Tesla Model 3 (with HW3) 2019-23", + "id": "TESLA_MODEL_3", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model 3 (with HW3)", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TESLA_MODEL_3|2024-2025": { + "label": "Tesla Model 3 (with HW4) 2024-25", + "id": "TESLA_MODEL_3", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model 3 (with HW4)", + "yrs": [ + "2024", + "2025" + ], + "req": "All" + }, + "TESLA_MODEL_X|2024": { + "label": "Tesla Model X (with HW4) 2024", + "id": "TESLA_MODEL_X", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model X (with HW4)", + "yrs": [ + "2024" + ], + "req": "All" + }, + "TESLA_MODEL_Y|2020-2023": { + "label": "Tesla Model Y (with HW3) 2020-23", + "id": "TESLA_MODEL_Y", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model Y (with HW3)", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TESLA_MODEL_Y|2024-2025": { + "label": "Tesla Model Y (with HW4) 2024-25", + "id": "TESLA_MODEL_Y", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model Y (with HW4)", + "yrs": [ + "2024", + "2025" + ], + "req": "All" + }, + "TOYOTA_ALPHARD_TSS2|2019-2020": { + "label": "Toyota Alphard 2019-20", + "id": "TOYOTA_ALPHARD_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Alphard", + "yrs": [ + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_ALPHARD_TSS2|2021": { + "label": "Toyota Alphard Hybrid 2021", + "id": "TOYOTA_ALPHARD_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Alphard Hybrid", + "yrs": [ + "2021" + ], + "req": "All" + }, + "TOYOTA_AVALON|2016": { + "label": "Toyota Avalon 2016", + "id": "TOYOTA_AVALON", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon", + "yrs": [ + "2016" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_AVALON|2017-2018": { + "label": "Toyota Avalon 2017-18", + "id": "TOYOTA_AVALON", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "TOYOTA_AVALON_2019|2019-2021": { + "label": "Toyota Avalon 2019-21", + "id": "TOYOTA_AVALON_2019", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "TOYOTA_AVALON_TSS2|2022": { + "label": "Toyota Avalon 2022", + "id": "TOYOTA_AVALON_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon", + "yrs": [ + "2022" + ], + "req": "All" + }, + "TOYOTA_AVALON_2019|2019-2021#2": { + "label": "Toyota Avalon Hybrid 2019-21", + "id": "TOYOTA_AVALON_2019", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon Hybrid", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "TOYOTA_AVALON_TSS2|2022#2": { + "label": "Toyota Avalon Hybrid 2022", + "id": "TOYOTA_AVALON_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon Hybrid", + "yrs": [ + "2022" + ], + "req": "All" + }, + "TOYOTA_CHR|2017-2020": { + "label": "Toyota C-HR 2017-20", + "id": "TOYOTA_CHR", + "mk": "Toyota", + "grp": "toyota", + "mdl": "C-HR", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_CHR_TSS2|2021": { + "label": "Toyota C-HR 2021", + "id": "TOYOTA_CHR_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "C-HR", + "yrs": [ + "2021" + ], + "req": "All" + }, + "TOYOTA_CHR|2017-2020#2": { + "label": "Toyota C-HR Hybrid 2017-20", + "id": "TOYOTA_CHR", + "mk": "Toyota", + "grp": "toyota", + "mdl": "C-HR Hybrid", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_CHR_TSS2|2021-2022": { + "label": "Toyota C-HR Hybrid 2021-22", + "id": "TOYOTA_CHR_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "C-HR Hybrid", + "yrs": [ + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_CAMRY|2018-2020": { + "label": "Toyota Camry 2018-20", + "id": "TOYOTA_CAMRY", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Camry", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_CAMRY_TSS2|2021-2024": { + "label": "Toyota Camry 2021-24", + "id": "TOYOTA_CAMRY_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Camry", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "TOYOTA_CAMRY|2018-2020#2": { + "label": "Toyota Camry Hybrid 2018-20", + "id": "TOYOTA_CAMRY", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Camry Hybrid", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_CAMRY_TSS2|2021-2024#2": { + "label": "Toyota Camry Hybrid 2021-24", + "id": "TOYOTA_CAMRY_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Camry Hybrid", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "TOYOTA_COROLLA|2017-2019": { + "label": "Toyota Corolla 2017-19", + "id": "TOYOTA_COROLLA", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2022": { + "label": "Toyota Corolla 2020-22", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2023": { + "label": "Toyota Corolla Cross (Non-US only) 2020-23", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Cross (Non-US only)", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2022#2": { + "label": "Toyota Corolla Cross Hybrid (Non-US only) 2020-22", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Cross Hybrid (Non-US only)", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2019-2022": { + "label": "Toyota Corolla Hatchback 2019-22", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Hatchback", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2022#3": { + "label": "Toyota Corolla Hybrid 2020-22", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2023#2": { + "label": "Toyota Corolla Hybrid (South America only) 2020-23", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Hybrid (South America only)", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_HIGHLANDER|2017-2019": { + "label": "Toyota Highlander 2017-19", + "id": "TOYOTA_HIGHLANDER", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Highlander", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "TOYOTA_HIGHLANDER_TSS2|2020-2023": { + "label": "Toyota Highlander 2020-23", + "id": "TOYOTA_HIGHLANDER_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Highlander", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_HIGHLANDER|2017-2019#2": { + "label": "Toyota Highlander Hybrid 2017-19", + "id": "TOYOTA_HIGHLANDER", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Highlander Hybrid", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "TOYOTA_HIGHLANDER_TSS2|2020-2023#2": { + "label": "Toyota Highlander Hybrid 2020-23", + "id": "TOYOTA_HIGHLANDER_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Highlander Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_MIRAI|2021": { + "label": "Toyota Mirai 2021", + "id": "TOYOTA_MIRAI", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Mirai", + "yrs": [ + "2021" + ], + "req": "All" + }, + "TOYOTA_PRIUS|2016": { + "label": "Toyota Prius 2016", + "id": "TOYOTA_PRIUS", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius", + "yrs": [ + "2016" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_PRIUS|2017-2020": { + "label": "Toyota Prius 2017-20", + "id": "TOYOTA_PRIUS", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_PRIUS_TSS2|2021-2022": { + "label": "Toyota Prius 2021-22", + "id": "TOYOTA_PRIUS_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius", + "yrs": [ + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_PRIUS|2017-2020#2": { + "label": "Toyota Prius Prime 2017-20", + "id": "TOYOTA_PRIUS", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius Prime", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_PRIUS_TSS2|2021-2022#2": { + "label": "Toyota Prius Prime 2021-22", + "id": "TOYOTA_PRIUS_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius Prime", + "yrs": [ + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_PRIUS_V|2017": { + "label": "Toyota Prius v 2017", + "id": "TOYOTA_PRIUS_V", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius v", + "yrs": [ + "2017" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_RAV4|2016": { + "label": "Toyota RAV4 2016", + "id": "TOYOTA_RAV4", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2016" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_RAV4|2017-2018": { + "label": "Toyota RAV4 2017-18", + "id": "TOYOTA_RAV4", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2|2019-2021": { + "label": "Toyota RAV4 2019-21", + "id": "TOYOTA_RAV4_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2_2022|2022": { + "label": "Toyota RAV4 2022", + "id": "TOYOTA_RAV4_TSS2_2022", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2022" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2_2023|2023-2025": { + "label": "Toyota RAV4 2023-25", + "id": "TOYOTA_RAV4_TSS2_2023", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "TOYOTA_RAV4H|2016": { + "label": "Toyota RAV4 Hybrid 2016", + "id": "TOYOTA_RAV4H", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2016" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_RAV4H|2017-2018": { + "label": "Toyota RAV4 Hybrid 2017-18", + "id": "TOYOTA_RAV4H", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2|2019-2021#2": { + "label": "Toyota RAV4 Hybrid 2019-21", + "id": "TOYOTA_RAV4_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2_2022|2022#2": { + "label": "Toyota RAV4 Hybrid 2022", + "id": "TOYOTA_RAV4_TSS2_2022", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2022" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2_2023|2023-2025#2": { + "label": "Toyota RAV4 Hybrid 2023-25", + "id": "TOYOTA_RAV4_TSS2_2023", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "TOYOTA_RAV4_PRIME|2021-2023": { + "label": "Toyota RAV4 Prime 2021-23", + "id": "TOYOTA_RAV4_PRIME", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Prime", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_SIENNA|2018-2020": { + "label": "Toyota Sienna 2018-20", + "id": "TOYOTA_SIENNA", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Sienna", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_SIENNA_4TH_GEN|2021-2023": { + "label": "Toyota Sienna 2021-23", + "id": "TOYOTA_SIENNA_4TH_GEN", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Sienna", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_YARIS|2020-2023": { + "label": "Toyota Yaris (Non-US only) 2020, 2023", + "id": "TOYOTA_YARIS", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Yaris (Non-US only)", + "yrs": [ + "2020", + "2023" + ], + "req": "All" + }, + "VOLKSWAGEN_ARTEON_MK1|2018-2023": { + "label": "Volkswagen Arteon 2018-23", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Arteon", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ARTEON_MK1|2020-2023": { + "label": "Volkswagen Arteon eHybrid 2020-23", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Arteon eHybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ARTEON_MK1|2020-2023#2": { + "label": "Volkswagen Arteon R 2020-23", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Arteon R", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ARTEON_MK1|2020-2023#3": { + "label": "Volkswagen Arteon Shooting Brake 2020-23", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Arteon Shooting Brake", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2018-2023": { + "label": "Volkswagen Atlas 2018-23", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Atlas", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2020-2022": { + "label": "Volkswagen Atlas Cross Sport 2020-22", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Atlas Cross Sport", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CADDY_MK3|2019": { + "label": "Volkswagen Caddy 2019", + "id": "VOLKSWAGEN_CADDY_MK3", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Caddy", + "yrs": [ + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CADDY_MK3|2019#2": { + "label": "Volkswagen Caddy Maxi 2019", + "id": "VOLKSWAGEN_CADDY_MK3", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Caddy Maxi", + "yrs": [ + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TRANSPORTER_T61|2021-2023": { + "label": "Volkswagen California 2021-23", + "id": "VOLKSWAGEN_TRANSPORTER_T61", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "California", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TRANSPORTER_T61|2020": { + "label": "Volkswagen Caravelle 2020", + "id": "VOLKSWAGEN_TRANSPORTER_T61", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Caravelle", + "yrs": [ + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ARTEON_MK1|2018-2022": { + "label": "Volkswagen CC 2018-22", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "CC", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CRAFTER_MK2|2017-2024#2": { + "label": "Volkswagen Crafter 2017-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Crafter", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CRAFTER_MK2|2018-2024": { + "label": "Volkswagen e-Crafter 2018-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "e-Crafter", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2014-2020": { + "label": "Volkswagen e-Golf 2014-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "e-Golf", + "yrs": [ + "2014", + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2020": { + "label": "Volkswagen Golf (Mk7) 2015-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf (Mk7)", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK8|2020-2025": { + "label": "Volkswagen Golf (Mk8) 2020-25", + "id": "VOLKSWAGEN_GOLF_MK8", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf (Mk8)", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2019": { + "label": "Volkswagen Golf Alltrack 2015-19", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf Alltrack", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2020#2": { + "label": "Volkswagen Golf GTD 2015-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf GTD", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2020#3": { + "label": "Volkswagen Golf GTE 2015-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf GTE", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2021": { + "label": "Volkswagen Golf GTI 2015-21", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf GTI", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2019#2": { + "label": "Volkswagen Golf R 2015-19", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf R", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2020#4": { + "label": "Volkswagen Golf SportsVan 2015-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf SportsVan", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CRAFTER_MK2|2019-2024": { + "label": "Volkswagen Grand California 2019-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Grand California", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID3_MK1|2020-2023": { + "label": "Volkswagen ID.3 2020-23", + "id": "VOLKSWAGEN_ID3_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.3", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID3_MK2|2024-2025": { + "label": "Volkswagen ID.3 2024-25", + "id": "VOLKSWAGEN_ID3_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.3", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID4_MK1|2021-2023": { + "label": "Volkswagen ID.4 2021-23", + "id": "VOLKSWAGEN_ID4_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.4", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID4_MK2|2024-2025": { + "label": "Volkswagen ID.4 2024-25", + "id": "VOLKSWAGEN_ID4_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.4", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID4_MK1|2022-2023": { + "label": "Volkswagen ID.5 2022-23", + "id": "VOLKSWAGEN_ID4_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.5", + "yrs": [ + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_JETTA_MK6|2015-2018": { + "label": "Volkswagen Jetta 2015-18", + "id": "VOLKSWAGEN_JETTA_MK6", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Jetta", + "yrs": [ + "2015", + "2016", + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_JETTA_MK7|2019-2023": { + "label": "Volkswagen Jetta 2019-23", + "id": "VOLKSWAGEN_JETTA_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Jetta", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_JETTA_MK7|2021-2023": { + "label": "Volkswagen Jetta GLI 2021-23", + "id": "VOLKSWAGEN_JETTA_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Jetta GLI", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID3_MK1|2020-2023#2": { + "label": "Volkswagen MEB Gen 1 2020-23", + "id": "VOLKSWAGEN_ID3_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "MEB Gen 1", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID3_MK2|2024-2025#2": { + "label": "Volkswagen MEB Gen 2 2024-25", + "id": "VOLKSWAGEN_ID3_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "MEB Gen 2", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_MK7|2014": { + "label": "Volkswagen Passat 2.0 TDI 2014", + "id": "VOLKSWAGEN_PASSAT_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat 2.0 TDI", + "yrs": [ + "2014" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_MK8|2015-2022": { + "label": "Volkswagen Passat 2015-22", + "id": "VOLKSWAGEN_PASSAT_MK8", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_MK8|2015-2022#2": { + "label": "Volkswagen Passat Alltrack 2015-22", + "id": "VOLKSWAGEN_PASSAT_MK8", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat Alltrack", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_B7|2011-2015": { + "label": "Volkswagen Passat B7 2011-15", + "id": "VOLKSWAGEN_PASSAT_B7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat B7", + "yrs": [ + "2011", + "2012", + "2013", + "2014", + "2015" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_MK8|2015-2022#3": { + "label": "Volkswagen Passat GTE 2015-22", + "id": "VOLKSWAGEN_PASSAT_MK8", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat GTE", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_NMS|2015-2017": { + "label": "Volkswagen Passat NMS 2015-17", + "id": "VOLKSWAGEN_PASSAT_NMS", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat NMS", + "yrs": [ + "2015", + "2016", + "2017" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_NMS_PLUS|2018-2022": { + "label": "Volkswagen Passat NMS 2018-22", + "id": "VOLKSWAGEN_PASSAT_NMS_PLUS", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat NMS", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_POLO_MK6|2018-2023": { + "label": "Volkswagen Polo 2018-23", + "id": "VOLKSWAGEN_POLO_MK6", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Polo", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_POLO_MK6|2018-2023#2": { + "label": "Volkswagen Polo GTI 2018-23", + "id": "VOLKSWAGEN_POLO_MK6", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Polo GTI", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_SHARAN_MK2|2018-2022": { + "label": "Volkswagen Sharan 2018-22", + "id": "VOLKSWAGEN_SHARAN_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Sharan", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TCROSS_MK1|2021": { + "label": "Volkswagen T-Cross 2021", + "id": "VOLKSWAGEN_TCROSS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "T-Cross", + "yrs": [ + "2021" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TROC_MK1|2018-2023": { + "label": "Volkswagen T-Roc 2018-23", + "id": "VOLKSWAGEN_TROC_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "T-Roc", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TAOS_MK1|2022-2024": { + "label": "Volkswagen Taos 2022-24", + "id": "VOLKSWAGEN_TAOS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Taos", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2018-2022": { + "label": "Volkswagen Teramont 2018-22", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Teramont", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2021-2022": { + "label": "Volkswagen Teramont Cross Sport 2021-22", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Teramont Cross Sport", + "yrs": [ + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2021-2022#2": { + "label": "Volkswagen Teramont X 2021-22", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Teramont X", + "yrs": [ + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TIGUAN_MK2|2018-2024": { + "label": "Volkswagen Tiguan 2018-24", + "id": "VOLKSWAGEN_TIGUAN_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Tiguan", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TIGUAN_MK2|2021-2023": { + "label": "Volkswagen Tiguan eHybrid 2021-23", + "id": "VOLKSWAGEN_TIGUAN_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Tiguan eHybrid", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TOURAN_MK2|2016-2023": { + "label": "Volkswagen Touran 2016-23", + "id": "VOLKSWAGEN_TOURAN_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Touran", + "yrs": [ + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + } + } +} \ No newline at end of file diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/car/vehicle_catalog.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/car/vehicle_catalog.py new file mode 100644 index 000000000..790e2acf4 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/car/vehicle_catalog.py @@ -0,0 +1,85 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import json +import os + +from iqpilot.common.basedir import BASEDIR + +SCHEMA = "iqlvbs/supported-vehicles" +REV = 1 + +CATALOG_FILENAME = "vehicle_catalog.json" +_CANDIDATE_PARTS = ( + ("iqpilot", "selfdrive", "car", CATALOG_FILENAME), +) + +# in-memory (car-interface) field -> on-disk compact key +_ATTR_TO_KEY = ( + ("platform", "id"), + ("make", "mk"), + ("brand", "grp"), + ("model", "mdl"), + ("year", "yrs"), + ("package", "req"), +) + + +def _reference(platform: str, years: list[str], claimed: set[str]) -> str: + span = f"{years[0]}-{years[-1]}" if len(years) > 1 else (years[0] if years else "na") + stem = f"{platform}|{span}" + ref, bump = stem, 2 + while ref in claimed: + ref = f"{stem}#{bump}" + bump += 1 + claimed.add(ref) + return ref + + +def encode(vehicles: dict[str, dict]) -> dict: + records: dict[str, dict] = {} + claimed: set[str] = set() + for label, attrs in vehicles.items(): + years = list(attrs.get("year") or []) + ref = _reference(attrs.get("platform", ""), years, claimed) + record = {"label": label} + for attr, key in _ATTR_TO_KEY: + record[key] = attrs.get(attr) + records[ref] = record + return {"catalog": SCHEMA, "rev": REV, "vehicles": records} + + +def decode(envelope: dict) -> dict[str, dict]: + vehicles: dict[str, dict] = {} + for record in (envelope.get("vehicles") or {}).values(): + attrs = {attr: record.get(key) for attr, key in _ATTR_TO_KEY} + vehicles[record.get("label", "")] = attrs + return vehicles + + +def catalog_path(basedir: str = BASEDIR) -> str | None: + for parts in _CANDIDATE_PARTS: + candidate = os.path.join(basedir, *parts) + if os.path.isfile(candidate): + return candidate + return None + + +def load_catalog(basedir: str = BASEDIR) -> dict[str, dict]: + path = catalog_path(basedir) + if path is None: + return {} + with open(path) as handle: + return decode(json.load(handle)) + + +def _write(vehicles: dict[str, dict], basedir: str = BASEDIR) -> str: + out = os.path.join(basedir, "iqpilot", "selfdrive", "car", CATALOG_FILENAME) + with open(out, "w") as handle: + json.dump(encode(vehicles), handle, indent=2, ensure_ascii=False) + return out + + +if __name__ == "__main__": + from iqdbc.lvbs.car.car_catalog import build_car_catalog + print("wrote", _write(build_car_catalog())) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py new file mode 100644 index 000000000..5b73c0115 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py @@ -0,0 +1,133 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + + +def index_function(index: int, max_val: float = 192, max_idx: int = 32) -> float: + return max_val * ((index / max_idx) ** 2) + + +def _quadratic_series(limit: float, steps: int) -> list[float]: + return [index_function(index, max_val=limit, max_idx=steps - 1) for index in range(steps)] + + +def _probability_window(*values: float) -> np.ndarray: + return np.asarray(values, dtype=np.float32) + + +def _field_group(start: int, stop: int, stride: int) -> slice: + return slice(start, stop, stride) + + +_IDX_COUNT = 33 +_T_AXIS = _quadratic_series(10.0, _IDX_COUNT) +_X_AXIS = _quadratic_series(192.0, _IDX_COUNT) + + +class ModelConstants: + IDX_N = _IDX_COUNT + T_IDXS = _T_AXIS + X_IDXS = _X_AXIS + LEAD_T_IDXS = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0] + LEAD_T_OFFSETS = [0.0, 2.0, 4.0] + META_T_IDXS = [2.0, 4.0, 6.0, 8.0, 10.0] + + MODEL_FREQ = 20 + FEATURE_LEN = 512 + FULL_HISTORY_BUFFER_LEN = 99 + HISTORY_BUFFER_LEN = FULL_HISTORY_BUFFER_LEN + DESIRE_LEN = 8 + TRAFFIC_CONVENTION_LEN = 2 + NAV_FEATURE_LEN = 256 + NAV_INSTRUCTION_LEN = 150 + LAT_PLANNER_STATE_LEN = 4 + LATERAL_CONTROL_PARAMS_LEN = 2 + PREV_DESIRED_CURV_LEN = 1 + + FCW_THRESHOLDS_5MS2 = _probability_window(0.05, 0.05, 0.15, 0.15, 0.15) + FCW_THRESHOLDS_3MS2 = _probability_window(0.7, 0.7) + FCW_5MS2_PROBS_WIDTH = 5 + FCW_3MS2_PROBS_WIDTH = 2 + + DISENGAGE_WIDTH = 5 + POSE_WIDTH = 6 + WIDE_FROM_DEVICE_WIDTH = 3 + SIM_POSE_WIDTH = 6 + LEAD_WIDTH = 4 + LANE_LINES_WIDTH = 2 + ROAD_EDGES_WIDTH = 2 + PLAN_WIDTH = 15 + DESIRE_PRED_WIDTH = 8 + LAT_PLANNER_SOLUTION_WIDTH = 4 + DESIRED_CURV_WIDTH = 1 + + NUM_LANE_LINES = 4 + NUM_ROAD_EDGES = 2 + LEAD_TRAJ_LEN = 6 + DESIRE_PRED_LEN = 4 + + PLAN_MHP_N = 5 + LEAD_MHP_N = 2 + PLAN_MHP_SELECTION = 1 + LEAD_MHP_SELECTION = 3 + + FCW_THRESHOLD_5MS2_HIGH = 0.15 + FCW_THRESHOLD_5MS2_LOW = 0.05 + FCW_THRESHOLD_3MS2 = 0.7 + + CONFIDENCE_BUFFER_LEN = 5 + RYG_GREEN = 0.01165 + RYG_YELLOW = 0.06157 + POLY_PATH_DEGREE = 4 + + +class Plan: + POSITION = slice(0, 3) + VELOCITY = slice(3, 6) + ACCELERATION = slice(6, 9) + T_FROM_CURRENT_EULER = slice(9, 12) + ORIENTATION_RATE = slice(12, 15) + + +class Meta: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 31, 6) + BRAKE_DISENGAGE = _field_group(2, 31, 6) + STEER_OVERRIDE = _field_group(3, 31, 6) + HARD_BRAKE_3 = _field_group(4, 31, 6) + HARD_BRAKE_4 = _field_group(5, 31, 6) + HARD_BRAKE_5 = _field_group(6, 31, 6) + GAS_PRESS = _field_group(31, 55, 4) + BRAKE_PRESS = _field_group(32, 55, 4) + LEFT_BLINKER = _field_group(33, 55, 4) + RIGHT_BLINKER = _field_group(34, 55, 4) + + +class MetaTombRaider: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 41, 8) + BRAKE_DISENGAGE = _field_group(2, 41, 8) + STEER_OVERRIDE = _field_group(3, 41, 8) + HARD_BRAKE_3 = _field_group(4, 41, 8) + HARD_BRAKE_4 = _field_group(5, 41, 8) + HARD_BRAKE_5 = _field_group(6, 41, 8) + GAS_PRESS = _field_group(7, 41, 8) + BRAKE_PRESS = _field_group(8, 41, 8) + LEFT_BLINKER = _field_group(41, 53, 2) + RIGHT_BLINKER = _field_group(42, 53, 2) + + +class MetaSimPose: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 36, 7) + BRAKE_DISENGAGE = _field_group(2, 36, 7) + STEER_OVERRIDE = _field_group(3, 36, 7) + HARD_BRAKE_3 = _field_group(4, 36, 7) + HARD_BRAKE_4 = _field_group(5, 36, 7) + HARD_BRAKE_5 = _field_group(6, 36, 7) + GAS_PRESS = _field_group(7, 36, 7) + LEFT_BLINKER = _field_group(36, 48, 2) + RIGHT_BLINKER = _field_group(37, 48, 2) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py new file mode 100644 index 000000000..1317d78be --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py @@ -0,0 +1,209 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +import json +import os + +from iqpilot.common.swaglog import cloudlog +import urllib.request +from pathlib import Path + +from iqpilot.system.hardware.usb import egpu_dock_ready + +USB_SYSFS_ROOT = "/sys/bus/usb/devices" +FIRMWARE_MIRROR = os.getenv("IQ_EGPU_FIRMWARE_MIRROR", "/data/firmware/tinygrad") +TINYGRAD_CACHE = "/data/.cache" + +COMMA_LFS_BATCH_URL = "https://gitlab.com/commaai/openpilot-lfs.git/info/lfs/objects/batch" + +DOWNLOAD_CHUNK = 4 * 1024 * 1024 + + +def usbgpu_present(sysfs_root: str = USB_SYSFS_ROOT) -> bool: + return egpu_dock_ready(Path(sysfs_root)) + + +def egpu_present_consented(params, sysfs_root: str = USB_SYSFS_ROOT) -> bool: + try: + if params is not None and params.get_bool("IQEgpuDisabled"): + return False + except Exception: + pass + return usbgpu_present(sysfs_root) + + +def egpu_selected(params, sysfs_root: str = USB_SYSFS_ROOT) -> bool: + try: + if params is not None and params.get_bool("IQEgpuDisabled"): + return False + if params is not None and params.get_bool("IQEgpuEnabled"): + return True + except Exception: + pass + return usbgpu_present(sysfs_root) + + +def resolve_backend(emac_enabled: bool, egpu_enabled: bool, egpu_present: bool = False) -> str | None: + if egpu_present: + return "egpu" + if emac_enabled: + return "emac" + if egpu_enabled: + return "egpu" + return None + + +def egpu_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_tinygrad.pkl") + + +def egpu_policy_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_policy.pkl") + + +def egpu_oob_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_policy_oob.pkl") + + +def onnx_cache_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"{meta['model_name']}_{meta['sha256'][:8]}.onnx") + + +def _sha256_file(path: str) -> str: + digest = hashlib.sha256() + with open(path, "rb") as f: + while chunk := f.read(DOWNLOAD_CHUNK): + digest.update(chunk) + return digest.hexdigest() + + +def quarantine_artifact(path: str, why: str) -> None: + try: + if os.path.isfile(path): + os.replace(path, path + ".unusable") + except OSError: + try: + os.remove(path) + except OSError: + pass + + +def local_onnx(meta: dict) -> str | None: + path = onnx_cache_path(meta) + if not os.path.isfile(path): + return None + size = int(meta.get("download", {}).get("size", 0)) + if size and os.path.getsize(path) != size: + quarantine_artifact(path, "onnx size mismatch") + return None + if _sha256_file(path) != meta["sha256"]: + quarantine_artifact(path, "onnx sha256 mismatch") + return None + return path + + +def resolve_download_url(download_url: str, sha256: str, size: int, timeout: float = 30.0) -> str: + if download_url.startswith("commalfs:"): + oid = download_url.split(":", 1)[1] + body = json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}).encode() + req = urllib.request.Request(COMMA_LFS_BATCH_URL, data=body, headers={ + "Accept": "application/vnd.git-lfs+json", "Content-Type": "application/vnd.git-lfs+json"}) + with urllib.request.urlopen(req, timeout=timeout) as r: + d = json.load(r) + return d["objects"][0]["actions"]["download"]["href"] + return download_url + + +def download_onnx(meta: dict, progress_cb=None) -> str: + from iqpilot.selfdrive.iqmodeld.egpu_model import download_descriptor + download_url, size = download_descriptor(meta) + if not download_url: + raise RuntimeError(f"model {meta['key']} has no download source; stage the onnx at {onnx_cache_path(meta)}") + + path = onnx_cache_path(meta) + os.makedirs(os.path.dirname(path), exist_ok=True) + try: + from iqpilot.selfdrive.iqmodeld.model_bundle_downloader import download_hf_file + return download_hf_file(f"onnx/{meta['sha256']}.onnx", path, meta["sha256"], int(size or 0), progress_cb=progress_cb) + except Exception as e: + cloudlog.warning(f"onnx {meta['key']} unavailable from HF ({e}); falling back to {download_url.split(':', 1)[0]}") + url = resolve_download_url(download_url, meta["sha256"], size) + tmp = path + ".part" + digest = hashlib.sha256() + got = 0 + with urllib.request.urlopen(url, timeout=60) as r, open(tmp, "wb") as f: + while chunk := r.read(DOWNLOAD_CHUNK): + f.write(chunk) + digest.update(chunk) + got += len(chunk) + if progress_cb is not None and size: + progress_cb(got / size) + if size and got != size: + os.remove(tmp) + raise RuntimeError(f"onnx download truncated: {got}/{size} bytes") + if digest.hexdigest() != meta["sha256"]: + os.remove(tmp) + raise RuntimeError(f"onnx sha256 mismatch for {meta['key']}") + os.replace(tmp, path) + return path + + +def download_precompiled(meta: dict, progress_cb=None, policy: bool = False, oob: bool = False) -> str | None: + field = "egpu_oob_artifact" if oob else "egpu_policy_artifact" if policy else "egpu_artifact" + art = meta.get(field) + if not art or not (art.get("objects") or art.get("hf_path")): + return None + from iqpilot.selfdrive.iqmodeld.model_bundle_downloader import download_hf_file, download_lfs_bundle + dest = egpu_oob_pkl_path(meta) if oob else egpu_policy_pkl_path(meta) if policy else egpu_pkl_path(meta) + if art.get("hf_path"): + try: + return download_hf_file(art["hf_path"], dest, art["sha256"], int(art.get("size", 0)), progress_cb=progress_cb) + except Exception as e: + cloudlog.warning(f"precompiled {meta['key']} unavailable from HF ({e}); trying LFS") + if not art.get("objects"): + raise + return download_lfs_bundle(art["objects"], dest, art["sha256"], int(art.get("size", 0)), progress_cb=progress_cb) + + +def patch_tinygrad_fetch_fw() -> None: + import pathlib + + import zstandard + from tinygrad import helpers + if getattr(helpers.fetch_fw, "_iq_patched", False): + return + _orig = helpers.fetch_fw + + def fetch_fw(path, name, sha256): + mirror = pathlib.Path(FIRMWARE_MIRROR) / path / name + if mirror.is_file(): + blob = mirror.read_bytes() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + p = pathlib.Path(f"/lib/firmware/{path}/{name}.zst") + if p.is_file(): + blob = zstandard.ZstdDecompressor().stream_reader(p.read_bytes()).read() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + blob = _orig(path, name, sha256) + # The dock's GPU firmware otherwise lives only in tinygrad's per-user download cache, which is + # a network fetch the first time a new HOME sees it; onroad the car is usually offline. + try: + mirror.parent.mkdir(parents=True, exist_ok=True) + tmp = mirror.with_suffix(mirror.suffix + ".part") + tmp.write_bytes(blob) + os.replace(tmp, mirror) + except OSError: + pass + return blob + + fetch_fw._iq_patched = True + helpers.fetch_fw = fetch_fw diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py new file mode 100644 index 000000000..b9dc2c77e --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.egpu_model") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.egpu_model import * diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py new file mode 100644 index 000000000..f71e29594 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py @@ -0,0 +1,211 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +import json +import os + +MODELS_BASE_URLS = ( + "https://git.konn3kt.com/teal/IQModels/raw/branch/main", + "https://gitlvb.teallvbs.xyz/teal/IQModels/raw/branch/main", +) +CHUNK = 4 * 1024 * 1024 +HTTP_TIMEOUT_S = 60.0 +STREAM_RETRIES = 6 + + +def _requests_auth(): + import importlib + for mod in ("iqpilot_private.models.git_auth", "iqpilot.models_private_src.git_auth", + "iqpilot.selfdrive.iqmodeld.models.git_auth"): + try: + return importlib.import_module(mod).get_requests_auth() + except Exception: + continue + return None + + +def _hf(): + import importlib + for mod in ("iqpilot_private.models.git_auth", "iqpilot.selfdrive.iqmodeld.models.git_auth"): + try: + m = importlib.import_module(mod) + return m.get_hf_headers(), m.hf_resolve_url + except Exception: + continue + return None, None + + +def download_hf_file(hf_path: str, dst: str, sha256: str, size: int, progress_cb=None) -> str: + import requests + headers, resolve = _hf() + if resolve is None: + raise RuntimeError("no HF credentials available") + url = resolve(hf_path) + os.makedirs(os.path.dirname(dst), exist_ok=True) + tmp = dst + ".hfpart" + last_error: Exception | None = None + for _attempt in range(STREAM_RETRIES): + try: + have = os.path.getsize(tmp) if os.path.isfile(tmp) else 0 + if size and have > size: + os.remove(tmp) + have = 0 + if not size or have < size: + req_headers = dict(headers) + if have: + req_headers["Range"] = f"bytes={have}-" + with requests.get(url, headers=req_headers, stream=True, timeout=HTTP_TIMEOUT_S, allow_redirects=True) as r: + r.raise_for_status() + if have and r.status_code != 206: + have = 0 + with open(tmp, "ab" if have else "wb") as f: + got = have + for chunk in r.iter_content(CHUNK): + f.write(chunk) + got += len(chunk) + if progress_cb is not None and size: + progress_cb(min(1.0, got / size)) + digest = hashlib.sha256() + with open(tmp, "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + digest.update(chunk) + if size and os.path.getsize(tmp) != size: + raise RuntimeError(f"size mismatch: {os.path.getsize(tmp)}/{size} bytes") + if sha256 and digest.hexdigest() != sha256: + os.remove(tmp) + raise RuntimeError("sha256 mismatch") + os.replace(tmp, dst) + return dst + except Exception as e: + last_error = e + raise RuntimeError(f"HF download failed: {last_error}") + + +def _lfs_endpoint(base_url: str) -> str: + return base_url.split("/raw/", 1)[0] + ".git/info/lfs" + + +def _resolve_oid(session, base_url: str, oid: str, size: int, auth): + import requests + batch = session.post(f"{_lfs_endpoint(base_url)}/objects/batch", + data=json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}), + headers={"Content-Type": "application/vnd.git-lfs+json", + "Accept": "application/vnd.git-lfs+json"}, + auth=auth, timeout=HTTP_TIMEOUT_S) + batch.raise_for_status() + entry = batch.json()["objects"][0] + if "actions" not in entry: + raise requests.RequestException(f"LFS object unavailable: {entry.get('error', oid)}") + action = entry["actions"]["download"] + return action["href"], action.get("header", {}) + + +def _part_path(dst: str, oid: str) -> str: + return os.path.join(dst + ".parts", oid) + + +def _part_complete(path: str, oid: str, size: int) -> bool: + if not os.path.isfile(path) or os.path.getsize(path) != size: + return False + digest = hashlib.sha256() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + digest.update(chunk) + return digest.hexdigest() == oid + + +def _fetch_part(session, base_url: str, obj: dict, path: str, auth, progress) -> None: + size = int(obj["size"]) + have = os.path.getsize(path) if os.path.isfile(path) else 0 + if have > size: + os.remove(path) + have = 0 + href, headers = _resolve_oid(session, base_url, obj["oid"], size, auth) + obj_auth = None if headers.get("Authorization") else auth + # LFS parts are content-addressed (oid == sha256), so a half-written part can be resumed with a + # Range request and verified afterwards instead of being thrown away on every restart. + if have: + headers = {**headers, "Range": f"bytes={have}-"} + with session.get(href, headers=headers, stream=True, timeout=HTTP_TIMEOUT_S, auth=obj_auth) as r: + r.raise_for_status() + if have and r.status_code != 206: + have = 0 + with open(path, "ab" if have else "wb") as f: + for chunk in r.iter_content(CHUNK): + f.write(chunk) + progress(len(chunk)) + + +def download_lfs_bundle(objects: list, dst: str, sha256: str, size: int, progress_cb=None) -> str: + import requests + auth = _requests_auth() + session = requests.Session() + os.makedirs(dst + ".parts", exist_ok=True) + total = int(size) or sum(int(o["size"]) for o in objects) + done_bytes = sum(int(o["size"]) for o in objects if _part_complete(_part_path(dst, o["oid"]), o["oid"], int(o["size"]))) + got = [done_bytes] + + def progress(n: int) -> None: + got[0] += n + if progress_cb is not None and total: + progress_cb(min(1.0, got[0] / total)) + + last_error: Exception | None = None + for base_url in MODELS_BASE_URLS: + for _attempt in range(STREAM_RETRIES): + try: + for obj in objects: + path = _part_path(dst, obj["oid"]) + if _part_complete(path, obj["oid"], int(obj["size"])): + continue + got[0] = done_bytes + _fetch_part(session, base_url, obj, path, auth, progress) + if not _part_complete(path, obj["oid"], int(obj["size"])): + if os.path.getsize(path) >= int(obj["size"]): + os.remove(path) + raise RuntimeError(f"part {obj['oid'][:12]} incomplete or failed verification") + done_bytes += int(obj["size"]) + got[0] = done_bytes + break + except Exception as e: + last_error = e + else: + continue + break + else: + raise RuntimeError(f"model bundle download failed: {last_error}") + + tmp = dst + ".part" + digest = hashlib.sha256() + with open(tmp, "wb") as out: + for obj in objects: + with open(_part_path(dst, obj["oid"]), "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + out.write(chunk) + digest.update(chunk) + if total and os.path.getsize(tmp) != total: + os.remove(tmp) + raise RuntimeError(f"size mismatch: {os.path.getsize(tmp) if os.path.exists(tmp) else 0}/{total} bytes") + if sha256 and digest.hexdigest() != sha256: + os.remove(tmp) + for obj in objects: + try: + os.remove(_part_path(dst, obj["oid"])) + except OSError: + pass + raise RuntimeError("sha256 mismatch") + os.replace(tmp, dst) + for obj in objects: + try: + os.remove(_part_path(dst, obj["oid"])) + except OSError: + pass + try: + os.rmdir(dst + ".parts") + except OSError: + pass + return dst diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py new file mode 100644 index 000000000..5ece1c074 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py new file mode 100644 index 000000000..d06c7c3dd --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.fetcher") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.fetcher import * # noqa: F403 diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py new file mode 100644 index 000000000..4b9a2f4d4 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python3 +""" +Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import json +import os +import shutil +from pathlib import Path + +from iqpilot.cereal import custom +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module +from iqpilot.system.hardware.hw import Paths + +try: + load_private_module(__name__, "iqpilot_private.models.helpers") +except ProprietaryModuleMissing: + try: + from iqpilot.models_private_src.helpers import * # noqa: F403 + except ImportError: + pass + + +ModelBundle = custom.IQModelManager.ModelBundle +Runner = custom.IQModelManager.Runner +_MODEL_ROOT = Path(Paths.model_root()) +_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle" +_MODELS_CACHE_KEY = "ModelManager_ModelsCache" +_RUNNER_CACHE_KEY = "ModelRunnerTypeCache" +_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex" +_PENDING_INDEX_KEY = "ModelManager_PendingIndex" +_PENDING_MODEL_RESTORE_FILE = "/data/k3_pending_model_restore" +_STOCK_RUNNER = int(Runner.stock) +_TINYGRAD_RUNNER = int(Runner.tinygrad) +_SNPE_RUNNER = int(Runner.snpe) + +_DEFAULT_MODEL_DIR = Path(__file__).resolve().parents[1] / "default_model" +_DEFAULT_BUNDLE_JSON = _DEFAULT_MODEL_DIR / "bundle.json" +_DEFAULT_BUNDLE_REF = "default" + + +def get_default_model_bundle(_bundles): + return None + + +def _coerce_runner_value(value) -> int | None: + raw = getattr(value, "raw", value) + try: + return int(raw) + except (TypeError, ValueError): + return None + + +def _bundle_models(bundle) -> list: + models = getattr(bundle, "models", None) + return list(models) if models is not None else [] + + +def _bundle_needs_runtime_upgrade(bundle) -> bool: + if bundle is None: + return False + + if _coerce_runner_value(getattr(bundle, "runner", None)) == _SNPE_RUNNER: + return True + + for model in _bundle_models(bundle): + file_name = getattr(getattr(model, "artifact", None), "fileName", "") or "" + if file_name.endswith(".thneed"): + return True + + return False + + +def _load_cached_manifest_bundles(params: Params): + cached = params.get(_MODELS_CACHE_KEY) or {} + bundles = [] + for raw_bundle in cached.get("bundles", []): + try: + min_selector_version = int(raw_bundle.get("minimumSelectorVersion", raw_bundle.get("minimum_selector_version", 0))) + compatibility_view = dict(raw_bundle) + compatibility_view["minimumSelectorVersion"] = min_selector_version + is_compatible = globals().get("is_bundle_version_compatible") + if is_compatible is not None and not is_compatible(compatibility_view): + continue + + if "short_name" in raw_bundle: + from iqpilot.selfdrive.iqmodeld.models.fetcher import ManifestDecoder + bundles.append(ManifestDecoder._decode_bundle(raw_bundle)) + continue + + if "internalName" in raw_bundle: + bundles.append(ModelBundle(**raw_bundle)) + continue + + bundle = ModelBundle() + bundle.index = int(raw_bundle["index"]) + bundle.internalName = raw_bundle.get("short_name") + bundle.displayName = raw_bundle.get("display_name") + bundle.status = 0 + bundle.generation = int(raw_bundle["generation"]) + bundle.environment = raw_bundle["environment"] + bundle.runner = raw_bundle.get("runner", Runner.tinygrad) + bundle.is20hz = raw_bundle.get("is_20hz", False) + bundle.minimumSelectorVersion = int(min_selector_version) + bundle.ref = raw_bundle.get("ref") + bundle.overrides = [] + for key, value in raw_bundle.get("overrides", {}).items(): + override = custom.IQModelManager.Override() + override.key = key + override.value = value + bundle.overrides.append(override) + + bundle.models = [] + for raw_model in raw_bundle.get("models", []): + model = custom.IQModelManager.Model() + model.type = raw_model.get("type") + for attr_name in ("artifact", "metadata"): + raw_artifact = raw_model.get(attr_name) + if not raw_artifact: + continue + artifact = custom.IQModelManager.Artifact() + artifact.fileName = raw_artifact.get("file_name") + download_uri = custom.IQModelManager.DownloadUri() + download_uri.uri = raw_artifact.get("download_uri", {}).get("url") + download_uri.sha256 = raw_artifact.get("download_uri", {}).get("sha256") + artifact.downloadUri = download_uri + setattr(model, attr_name, artifact) + bundle.models.append(model) + + bundles.append(bundle) + except Exception: + continue + return bundles + + +def _bundle_match_key(bundle) -> tuple[str | None, str | None, str | None]: + return ( + getattr(bundle, "ref", None), + getattr(bundle, "internalName", None), + getattr(bundle, "displayName", None), + ) + + +def _find_runtime_upgrade(bundle, params: Params, available_bundles=None): + if not _bundle_needs_runtime_upgrade(bundle): + return bundle + + candidate_bundles = available_bundles if available_bundles is not None else _load_cached_manifest_bundles(params) + ref, internal_name, display_name = _bundle_match_key(bundle) + + for candidate in candidate_bundles: + if getattr(candidate, "ref", None) and getattr(candidate, "ref", None) == ref: + return candidate + + for candidate in candidate_bundles: + if getattr(candidate, "internalName", None) == internal_name: + return candidate + + for candidate in candidate_bundles: + if getattr(candidate, "displayName", None) == display_name: + return candidate + + return None + + +def bundle_files_ready(bundle) -> bool: + if bundle is None: + return False + + for model in _bundle_models(bundle): + artifact = getattr(model, "artifact", None) + metadata = getattr(model, "metadata", None) + for file_name in (getattr(metadata, "fileName", None), getattr(artifact, "fileName", None)): + if file_name and not (_MODEL_ROOT / file_name).is_file(): + return False + return True + + +def persist_active_bundle(params: Params, bundle) -> None: + params.put(_ACTIVE_BUNDLE_KEY, bundle.to_dict()) + params.remove(_RUNNER_CACHE_KEY) + + +def _load_default_bundle_dict() -> dict: + return json.loads(_DEFAULT_BUNDLE_JSON.read_text()) + + +def _default_bundle_filenames(bundle_dict: dict) -> list[str]: + names = [] + for model in bundle_dict.get("models", []): + for artifact in (model.get("metadata"), model.get("artifact")): + file_name = artifact.get("fileName", "") if isinstance(artifact, dict) else "" + if file_name: + names.append(file_name) + return names + + +def is_default_bundle(bundle) -> bool: + return bool(bundle is not None and getattr(bundle, "ref", None) == _DEFAULT_BUNDLE_REF) + + +def ensure_default_model_files(bundle_dict: dict = None) -> None: + bundle_dict = bundle_dict if bundle_dict is not None else _load_default_bundle_dict() + try: + _MODEL_ROOT.mkdir(parents=True, exist_ok=True) + except OSError as e: + cloudlog.exception(f"default_model: cannot create model root: {e}") + return + for file_name in _default_bundle_filenames(bundle_dict): + src = _DEFAULT_MODEL_DIR / file_name + dst = _MODEL_ROOT / file_name + if not src.is_file(): + cloudlog.error(f"default_model: shipped asset missing {src}") + continue + if dst.is_file() and dst.stat().st_size == src.stat().st_size: + continue + try: + shutil.copy2(src, dst) + cloudlog.warning(f"default_model: staged {file_name} into model root") + except OSError as e: + cloudlog.exception(f"default_model: failed staging {file_name}: {e}") + + +def select_default_model(params: Params = None) -> None: + params = Params() if params is None else params + bundle_dict = _load_default_bundle_dict() + ensure_default_model_files(bundle_dict) + params.remove(_DOWNLOAD_INDEX_KEY) + params.remove(_PENDING_INDEX_KEY) + params.put(_ACTIVE_BUNDLE_KEY, bundle_dict) + params.remove(_RUNNER_CACHE_KEY) + params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER) + try: + if os.path.isfile(_PENDING_MODEL_RESTORE_FILE): + os.remove(_PENDING_MODEL_RESTORE_FILE) + except OSError: + pass + + +def seed_default_bundle_if_unset(params: Params = None) -> None: + params = Params() if params is None else params + if params.get(_ACTIVE_BUNDLE_KEY): + return + queued_download = params.get(_DOWNLOAD_INDEX_KEY) + try: + select_default_model(params) + if queued_download is not None: + params.put(_DOWNLOAD_INDEX_KEY, queued_download) + cloudlog.warning("default_model: seeded Default (CD210) as active bundle") + except Exception as e: + cloudlog.exception(f"default_model: failed to seed default bundle: {e}") + + +def get_runtime_bundle_upgrade(bundle, params: Params = None, available_bundles=None): + params = Params() if params is None else params + return _find_runtime_upgrade(bundle, params, available_bundles) + + +def get_active_bundle(params: Params = None): + params = Params() if params is None else params + + try: + active_bundle = params.get(_ACTIVE_BUNDLE_KEY) or {} + if not active_bundle: + return None + is_compatible = globals().get("is_bundle_version_compatible") + if is_compatible is not None and not is_compatible(active_bundle): + return None + bundle = ModelBundle(**active_bundle) + except Exception: + return None + + replacement = _find_runtime_upgrade(bundle, params) + if replacement is not None and replacement is not bundle and bundle_files_ready(replacement): + persist_active_bundle(params, replacement) + return replacement + + return bundle + + +def get_active_model_runner(params: Params = None, force_check=False): + params = Params() if params is None else params + + active_bundle = get_active_bundle(params) + if not active_bundle: + seed_default_bundle_if_unset(params) + active_bundle = get_active_bundle(params) + if not active_bundle: + if params.get(_RUNNER_CACHE_KEY) != str(_TINYGRAD_RUNNER): + params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER) + return _TINYGRAD_RUNNER + + cached_runner_type = params.get(_RUNNER_CACHE_KEY) + if cached_runner_type and not force_check and isinstance(cached_runner_type, str) and cached_runner_type.isdigit(): + return int(cached_runner_type) + + runner_type = _coerce_runner_value(active_bundle.runner) + if runner_type == _SNPE_RUNNER: + replacement = _find_runtime_upgrade(active_bundle, params) + if replacement is not None and replacement is not active_bundle and bundle_files_ready(replacement): + persist_active_bundle(params, replacement) + runner_type = _coerce_runner_value(replacement.runner) + else: + if replacement is not None and getattr(replacement, "index", None) is not None and params.get(_DOWNLOAD_INDEX_KEY) is None: + params.put(_DOWNLOAD_INDEX_KEY, int(replacement.index)) + cloudlog.warning(f"Queued tinygrad migration for retired bundle {getattr(active_bundle, 'internalName', '')}") + runner_type = _TINYGRAD_RUNNER + + if cached_runner_type != runner_type: + params.put(_RUNNER_CACHE_KEY, int(runner_type)) + + return runner_type diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/locationd/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/locationd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibrationd.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibrationd.py new file mode 100644 index 000000000..3e3ec6d45 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/locationd/calibrationd.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +''' +This process finds calibration values. More info on what these calibration values +are can be found here https://github.com/commaai/openpilot/tree/master/common/transformations +While the roll calibration is a real value that can be estimated, here we assume it's zero, +and the image input into the neural network is not corrected for roll. +''' + +import os +import capnp +import numpy as np +from typing import NoReturn + +from iqpilot.cereal import log, car +import iqpilot.cereal.messaging as messaging +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.issue_debug import log_issue_limited +from iqpilot.common.realtime import config_realtime_process +from iqpilot.common.transformations.orientation import rot_from_euler, euler_from_rot +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import HARDWARE + +MIN_SPEED_FILTER = 15 * CV.MPH_TO_MS +MAX_VEL_ANGLE_STD = np.radians(0.25) +MAX_YAW_RATE_FILTER = np.radians(2) # per second + +MAX_HEIGHT_STD = np.exp(-3.5) + +# This is at model frequency, blocks needed for efficiency +SMOOTH_CYCLES = 10 +BLOCK_SIZE = 100 +INPUTS_NEEDED = 5 # Minimum blocks needed for valid calibration +INPUTS_WANTED = 50 # We want a little bit more than we need for stability +MAX_ALLOWED_YAW_SPREAD = np.radians(2) +MAX_ALLOWED_PITCH_SPREAD = np.radians(4) +TICI_FAMILY_PITCH_SPREAD_RESET = np.radians(3) +RPY_INIT = np.array([0.0,0.0,0.0]) +WIDE_FROM_DEVICE_EULER_INIT = np.array([0.0, 0.0, 0.0]) +HEIGHT_INIT = np.array([1.22]) +HEIGHT_SANE_MIN, HEIGHT_SANE_MAX = 0.9, 2.0 +DEVICE_IS_TICI_FAMILY = HARDWARE.get_device_type() in ("tici", "tizi") + +# These values are needed to accommodate the model frame in the narrow cam +if HARDWARE.get_device_type() == 'mici': + PITCH_LIMITS = np.array([-0.143101, 0.22235988]) +else: + PITCH_LIMITS = np.array([-0.09074112085129739, 0.17]) +YAW_LIMITS = np.array([-0.06912048084718224, 0.06912048084718235]) +DEBUG = os.getenv("DEBUG") is not None + +def is_calibration_valid(rpy: np.ndarray) -> bool: + return (PITCH_LIMITS[0] < rpy[1] < PITCH_LIMITS[1]) and (YAW_LIMITS[0] < rpy[2] < YAW_LIMITS[1]) + + +def sanity_clip(rpy: np.ndarray) -> np.ndarray: + if np.isnan(rpy).any(): + rpy = RPY_INIT + return np.array([rpy[0], + np.clip(rpy[1], PITCH_LIMITS[0] - .005, PITCH_LIMITS[1] + .005), + np.clip(rpy[2], YAW_LIMITS[0] - .005, YAW_LIMITS[1] + .005)]) + +def moving_avg_with_linear_decay(prev_mean: np.ndarray, new_val: np.ndarray, idx: int, block_size: float) -> np.ndarray: + return (idx*prev_mean + (block_size - idx) * new_val) / block_size + +class Calibrator: + def __init__(self, param_put: bool = False): + self.param_put = param_put + + self.not_car = False + self.stable_rpy = RPY_INIT.copy() + self.stable_wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT.copy() + self.stable_height = HEIGHT_INIT.copy() + self.has_stable_snapshot = False + + # Read saved calibration + self.params = Params() + calibration_params = self.params.get("CalibrationParams") + rpy_init = RPY_INIT + wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT + height = HEIGHT_INIT + valid_blocks = 0 + self.cal_status = log.ExtrinsicsCalibration.Status.uncalibrated + + if param_put and calibration_params: + try: + with log.Event.from_bytes(calibration_params) as msg: + rpy_init = np.array(msg.extrinsicsCalibration.rpyCalib) + valid_blocks = msg.extrinsicsCalibration.validBlocks + wide_from_device_euler = np.array(msg.extrinsicsCalibration.wideFromDeviceEuler) + height = np.array(msg.extrinsicsCalibration.height) + except Exception: + cloudlog.exception("Error reading cached CalibrationParams") + + self.reset(rpy_init, valid_blocks, wide_from_device_euler, height) + self.update_status() + + # If saved calibration is immediately invalid (e.g. bad params from a previous + # bootstrap bug or device remount), auto-clear it so we recalibrate from scratch + # instead of getting permanently stuck in the "Calibration Invalid" state. + if self.cal_status == log.ExtrinsicsCalibration.Status.invalid: + cloudlog.warning("calibrationd: saved CalibrationParams are invalid, clearing and starting fresh") + if param_put: + self.params.remove("CalibrationParams") + self.reset() + self.update_status() + + def _remember_stable_solution(self) -> None: + self.stable_rpy = self.rpy.copy() + self.stable_wide_from_device_euler = self.wide_from_device_euler.copy() + self.stable_height = self.height.copy() + self.has_stable_snapshot = True + + def reset(self, rpy_init: np.ndarray = RPY_INIT, + valid_blocks: int = 0, + wide_from_device_euler_init: np.ndarray = WIDE_FROM_DEVICE_EULER_INIT, + height_init: np.ndarray = HEIGHT_INIT, + smooth_from: np.ndarray | None = None) -> None: + if not np.isfinite(rpy_init).all(): + self.rpy = RPY_INIT.copy() + else: + self.rpy = rpy_init.copy() + + if not np.isfinite(height_init).all() or len(height_init) != 1: + self.height = HEIGHT_INIT.copy() + else: + self.height = height_init.copy() + + if not np.isfinite(wide_from_device_euler_init).all() or len(wide_from_device_euler_init) != 3: + self.wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT.copy() + else: + self.wide_from_device_euler = wide_from_device_euler_init.copy() + + if not np.isfinite(valid_blocks) or valid_blocks < 0: + self.valid_blocks = 0 + else: + self.valid_blocks = valid_blocks + + self.rpys = np.tile(self.rpy, (INPUTS_WANTED, 1)) + self.wide_from_device_eulers = np.tile(self.wide_from_device_euler, (INPUTS_WANTED, 1)) + self.heights = np.tile(self.height, (INPUTS_WANTED, 1)) + + self.idx = 0 + self.block_idx = 0 + self.v_ego = 0.0 + + if smooth_from is None: + self.old_rpy = RPY_INIT + self.old_rpy_weight = 0.0 + else: + self.old_rpy = smooth_from + self.old_rpy_weight = 1.0 + + def get_valid_idxs(self) -> list[int]: + # exclude current block_idx from validity window + before_current = list(range(self.block_idx)) + after_current = list(range(min(self.valid_blocks, self.block_idx + 1), self.valid_blocks)) + return before_current + after_current + + def update_status(self) -> None: + valid_idxs = self.get_valid_idxs() + if valid_idxs: + self.wide_from_device_euler = np.mean(self.wide_from_device_eulers[valid_idxs], axis=0) + self.height = np.mean(self.heights[valid_idxs], axis=0) + rpys = self.rpys[valid_idxs] + self.rpy = np.mean(rpys, axis=0) + max_rpy_calib = np.array(np.max(rpys, axis=0)) + min_rpy_calib = np.array(np.min(rpys, axis=0)) + self.calib_spread = np.abs(max_rpy_calib - min_rpy_calib) + else: + self.calib_spread = np.zeros(3) + + if self.valid_blocks < INPUTS_NEEDED: + if self.cal_status == log.ExtrinsicsCalibration.Status.recalibrating: + self.cal_status = log.ExtrinsicsCalibration.Status.recalibrating + else: + self.cal_status = log.ExtrinsicsCalibration.Status.uncalibrated + elif is_calibration_valid(self.rpy): + self.cal_status = log.ExtrinsicsCalibration.Status.calibrated + else: + self.cal_status = log.ExtrinsicsCalibration.Status.invalid + + # If spread is too high, assume mounting was changed and reset to last block. + # Make the transition smooth. Abrupt transitions are not good for feedback loop through supercombo model. + # TODO: add height spread check with smooth transition too + pitch_spread_limit = TICI_FAMILY_PITCH_SPREAD_RESET if DEVICE_IS_TICI_FAMILY else MAX_ALLOWED_PITCH_SPREAD + spread_too_high = self.calib_spread[1] > pitch_spread_limit or self.calib_spread[2] > MAX_ALLOWED_YAW_SPREAD + if self.cal_status == log.ExtrinsicsCalibration.Status.calibrated and not spread_too_high: + self._remember_stable_solution() + + if spread_too_high and self.cal_status == log.ExtrinsicsCalibration.Status.calibrated: + use_stable_snapshot = DEVICE_IS_TICI_FAMILY and self.has_stable_snapshot + if use_stable_snapshot: + reset_rpy = self.stable_rpy + reset_wide = self.stable_wide_from_device_euler + reset_height = self.stable_height + else: + reset_rpy = self.rpys[self.block_idx - 1] + reset_wide = self.wide_from_device_eulers[self.block_idx - 1] + reset_height = self.heights[self.block_idx - 1] + + log_issue_limited( + "calibrationd_reset_spread", + "calibration", + f"calibrationd reset unstable solution pitchSpread={self.calib_spread[1]:.6f} " + f"yawSpread={self.calib_spread[2]:.6f} pitchLimit={pitch_spread_limit:.6f} " + f"use_stable_snapshot={use_stable_snapshot} rpy={self.rpy.tolist()}", + interval_sec=0.5, + ) + self.reset(reset_rpy, valid_blocks=1, wide_from_device_euler_init=reset_wide, + height_init=reset_height, smooth_from=self.stable_rpy if use_stable_snapshot else self.rpy) + self.cal_status = log.ExtrinsicsCalibration.Status.recalibrating + + write_this_cycle = (self.idx == 0) and (self.block_idx % (INPUTS_WANTED//5) == 5) + if self.param_put and write_this_cycle: + self.params.put_nonblocking("CalibrationParams", self.get_msg(True).to_bytes()) + + def handle_v_ego(self, v_ego: float) -> None: + self.v_ego = v_ego + + def get_smooth_rpy(self) -> np.ndarray: + if self.old_rpy_weight > 0: + return self.old_rpy_weight * self.old_rpy + (1.0 - self.old_rpy_weight) * self.rpy + else: + return self.rpy + + def handle_cam_odom(self, trans: list[float], + rot: list[float], + wide_from_device_euler: list[float], + trans_std: list[float], + road_transform_trans: list[float], + road_transform_trans_std: list[float]) -> np.ndarray | None: + self.old_rpy_weight = max(0.0, self.old_rpy_weight - 1/SMOOTH_CYCLES) + + fast_enough = self.v_ego > MIN_SPEED_FILTER + motion_speed = max(float(self.v_ego), float(trans[0])) + cam_fast_enough = motion_speed > MIN_SPEED_FILTER + yaw_ok = abs(rot[2]) < MAX_YAW_RATE_FILTER + straight_and_fast = fast_enough and cam_fast_enough and yaw_ok + angle_std_threshold = MAX_VEL_ANGLE_STD + height_std_threshold = MAX_HEIGHT_STD + rpy_certain = np.arctan2(trans_std[1], motion_speed) < angle_std_threshold + if len(road_transform_trans_std) == 3: + height_certain = road_transform_trans_std[2] < height_std_threshold + else: + height_certain = True + + certain_if_calib = rpy_certain + if not (straight_and_fast and certain_if_calib): + log_issue_limited( + "calibrationd_rejected_sample", + "calibration", + f"calibrationd rejected sample vEgo={self.v_ego:.2f} trans0={trans[0]:.2f} yawRate={rot[2]:.4f} " + f"fast_enough={fast_enough} cam_fast_enough={cam_fast_enough} motion_speed={motion_speed:.2f} yaw_ok={yaw_ok} " + f"rpy_certain={rpy_certain} height_certain={height_certain} valid_blocks={self.valid_blocks} idx={self.idx}", + interval_sec=1.0, + ) + return None + + observed_rpy = np.array([0, + -np.arctan2(trans[2], trans[0]), + np.arctan2(trans[1], trans[0])]) + new_rpy = euler_from_rot(rot_from_euler(self.get_smooth_rpy()).dot(rot_from_euler(observed_rpy))) + new_rpy = sanity_clip(new_rpy) + + if len(wide_from_device_euler) == 3: + new_wide_from_device_euler = np.array(wide_from_device_euler) + else: + new_wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT + + if len(road_transform_trans) == 3 and HEIGHT_SANE_MIN <= road_transform_trans[2] <= HEIGHT_SANE_MAX: + new_height = np.array([road_transform_trans[2]]) + else: + new_height = HEIGHT_INIT + + self.rpys[self.block_idx] = moving_avg_with_linear_decay(self.rpys[self.block_idx], new_rpy, self.idx, float(BLOCK_SIZE)) + self.wide_from_device_eulers[self.block_idx] = moving_avg_with_linear_decay(self.wide_from_device_eulers[self.block_idx], + new_wide_from_device_euler, self.idx, float(BLOCK_SIZE)) + self.heights[self.block_idx] = moving_avg_with_linear_decay(self.heights[self.block_idx], new_height, self.idx, float(BLOCK_SIZE)) + + self.idx = (self.idx + 1) % BLOCK_SIZE + if self.idx == 0: + self.block_idx += 1 + self.valid_blocks = max(self.block_idx, self.valid_blocks) + self.block_idx = self.block_idx % INPUTS_WANTED + + self.update_status() + + if self.idx == 0: + log_issue_limited( + "calibrationd_progress_block", + "calibration", + f"calibrationd progress status={int(self.cal_status)} valid_blocks={self.valid_blocks} " + f"calPerc={min(100 * (self.valid_blocks * BLOCK_SIZE + self.idx) // (INPUTS_NEEDED * BLOCK_SIZE), 100)} " + f"rpy={self.rpy.tolist()} spread={self.calib_spread.tolist()}", + interval_sec=0.5, + ) + + return new_rpy + + def get_msg(self, valid: bool) -> capnp.lib.capnp._DynamicStructBuilder: + smooth_rpy = self.get_smooth_rpy() + + msg = messaging.new_message('extrinsicsCalibration') + msg.valid = valid + + extrinsicsCalibration = msg.extrinsicsCalibration + extrinsicsCalibration.validBlocks = self.valid_blocks + extrinsicsCalibration.calStatus = self.cal_status + extrinsicsCalibration.calPerc = min(100 * (self.valid_blocks * BLOCK_SIZE + self.idx) // (INPUTS_NEEDED * BLOCK_SIZE), 100) + extrinsicsCalibration.rpyCalib = smooth_rpy.tolist() + extrinsicsCalibration.rpyCalibSpread = self.calib_spread.tolist() + extrinsicsCalibration.wideFromDeviceEuler = self.wide_from_device_euler.tolist() + extrinsicsCalibration.height = self.height.tolist() + + return msg + + def send_data(self, pm: messaging.PubMaster, valid: bool) -> None: + pm.send('extrinsicsCalibration', self.get_msg(valid)) + + +def main() -> NoReturn: + config_realtime_process([0, 1, 2, 3], 5) + + pm = messaging.PubMaster(['extrinsicsCalibration']) + sm = messaging.SubMaster(['cameraOdometry', 'carState'], poll='cameraOdometry') + + params_reader = Params() + CP = messaging.log_from_bytes(params_reader.get("CarParams", block=True), car.CarParams) + + calibrator = Calibrator(param_put=True) + calibrator.not_car = CP.notCar + + while 1: + timeout = 0 if sm.frame == -1 else 100 + sm.update(timeout) + + if sm.updated['cameraOdometry']: + calibrator.handle_v_ego(sm['carState'].vEgo) + new_rpy = calibrator.handle_cam_odom(sm['cameraOdometry'].trans, + sm['cameraOdometry'].rot, + sm['cameraOdometry'].wideFromDeviceEuler, + sm['cameraOdometry'].transStd, + sm['cameraOdometry'].roadTransformTrans, + sm['cameraOdometry'].roadTransformTransStd) + + if DEBUG and new_rpy is not None: + print('got new rpy', new_rpy) + + # 4Hz driven by cameraOdometry + if sm.frame % 5 == 0: + checks_ok = sm.all_checks() + if not checks_ok: + ft = sm.freq_tracker + recv_hz = {s: (round(1.0 / ft[s].avg_dt.get_average(), 2) if ft[s].avg_dt.count else None) for s in sm.services} + log_issue_limited( + "calibrationd_checks_failed", + "calibration", + f"calibrationd all_checks failed alive={sm.alive} freq_ok={sm.freq_ok} valid={sm.valid} " + f"seen={sm.seen} recv_hz={recv_hz}", + interval_sec=5.0, + ) + calibrator.send_data(pm, checks_ok) + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/alertmanager.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/alertmanager.py new file mode 100644 index 000000000..0ffe29431 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/alertmanager.py @@ -0,0 +1,68 @@ +import copy +import os +import json +from collections import defaultdict +from dataclasses import dataclass + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.selfdrive.selfdrived.events import Alert +from iqpilot.common.atlas_alerts import NULL_ALERT as EmptyAlert + + +with open(os.path.join(BASEDIR, "iqpilot/selfdrive/selfdrived/alerts_offroad.json")) as f: + OFFROAD_ALERTS = json.load(f) + + +def set_offroad_alert(alert: str, show_alert: bool, extra_text: str | None = None) -> None: + if show_alert: + a = copy.copy(OFFROAD_ALERTS[alert]) + a['extra'] = extra_text or '' + Params().put(alert, a) + else: + Params().remove(alert) + + +@dataclass +class AlertEntry: + alert: Alert | None = None + start_frame: int = -1 + end_frame: int = -1 + added_frame: int = -1 + + def active(self, frame: int) -> bool: + return frame <= self.end_frame + + def just_added(self, frame: int) -> bool: + return self.active(frame) and frame == (self.added_frame + 1) + +class AlertManager: + def __init__(self): + self.alerts: dict[str, AlertEntry] = defaultdict(AlertEntry) + self.current_alert = EmptyAlert + + def add_many(self, frame: int, alerts: list[Alert]) -> None: + for alert in alerts: + entry = self.alerts[alert.alert_type] + entry.alert = alert + if not entry.just_added(frame): + entry.start_frame = frame + min_end_frame = entry.start_frame + alert.duration + entry.end_frame = max(frame + 1, min_end_frame) + entry.added_frame = frame + + def process_alerts(self, frame: int, clear_event_types: set): + ae = AlertEntry() + for v in self.alerts.values(): + if not v.alert: + continue + + if v.alert.event_type in clear_event_types: + v.end_frame = -1 + + # sort by priority first and then by start_frame + greater = ae.alert is None or (v.alert.priority, v.start_frame) > (ae.alert.priority, ae.start_frame) + if v.active(frame) and greater: + ae = v + + self.current_alert = ae.alert if ae.alert is not None else EmptyAlert diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/events.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/events.py new file mode 100644 index 000000000..f296a9744 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/selfdrived/events.py @@ -0,0 +1,991 @@ +#!/usr/bin/env python3 +import math + +from iqpilot.cereal import log, car +import iqpilot.cereal.messaging as messaging +from iqpilot.common.constants import CV +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.locationd.calibrationd import MIN_SPEED_FILTER +from iqpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER +from iqpilot.selfdrive.ui.feedback.feedbackd import FEEDBACK_MAX_DURATION +from iqpilot.system.hardware import HARDWARE + +from iqpilot.common.atlas_alerts import EventBook as EventsBase, Tier as Priority, Tags as ET, AlertCard as Alert, \ + NoEntryCard as NoEntryAlert, GentleDisableCard as SoftDisableAlert, PendingDisableCard as UserSoftDisableAlert, \ + HardDisableCard as ImmediateDisableAlert, ChimeCard as EngagementAlert, BannerCard as NormalPermanentAlert, \ + BootCard as StartupAlert, AlertFactory as AlertCallbackType, car_mode_entry_alert as wrong_car_mode_alert + + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus +VisualAlert = car.CarControl.HUDControl.VisualAlert +AudibleAlert = car.CarControl.HUDControl.AudibleAlert +EventName = log.OnroadEvent.EventName + + +# get event name from enum +EVENT_NAME = {v: k for k, v in EventName.schema.enumerants.items()} + + +class Events(EventsBase): + def __init__(self): + super().__init__() + self.event_counters = dict.fromkeys(EVENTS.keys(), 0) + + def get_events_mapping(self) -> dict[int, dict[str, Alert | AlertCallbackType]]: + return EVENTS + + def get_event_name(self, event: int): + return EVENT_NAME[event] + + def get_event_msg_type(self): + return log.OnroadEvent + + + +# ********** helper functions ********** +def get_display_speed(speed_ms: float, metric: bool) -> str: + speed = int(round(speed_ms * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH))) + unit = 'km/h' if metric else 'mph' + return f"{speed} {unit}" + + +# ********** alert callback functions ********** + + +def soft_disable_alert(alert_text_2: str) -> AlertCallbackType: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if soft_disable_time < int(0.5 / DT_CTRL): + return ImmediateDisableAlert(alert_text_2) + return SoftDisableAlert(alert_text_2) + return func + +def user_soft_disable_alert(alert_text_2: str) -> AlertCallbackType: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if soft_disable_time < int(0.5 / DT_CTRL): + return ImmediateDisableAlert(alert_text_2) + return UserSoftDisableAlert(alert_text_2) + return func + +def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NoEntryAlert(f"Drive above {get_display_speed(CP.minEnableSpeed, metric)} to engage") + + +def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return Alert( + f"Steer Assist Unavailable Below {get_display_speed(CP.minSteerSpeed, metric)}", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 0.4) + + +def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + first_word = 'Recalibrating' if sm['extrinsicsCalibration'].calStatus == log.ExtrinsicsCalibration.Status.recalibrating else 'Calibrating' + return Alert( + f"{first_word}: {sm['extrinsicsCalibration'].calPerc:.0f}%", + f"Drive Above {get_display_speed(MIN_SPEED_FILTER, metric)}", + AlertStatus.normal, AlertSize.mid, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) + + +def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + duration = FEEDBACK_MAX_DURATION - ((sm['audioFeedback'].blockNum + 1) * SAMPLE_BUFFER / SAMPLE_RATE) + return NormalPermanentAlert( + "Recording Audio Feedback", + f"{round(duration)} second{'s' if round(duration) != 1 else ''} remaining. Press again to save early.", + priority=Priority.LOW) + + +# *** debug alerts *** + +def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + full_perc = round(100. - sm['deviceState'].freeSpacePercent) + return NormalPermanentAlert("Out of Storage", f"{full_perc}% full") + + +def posenet_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if sm.frame * DT_CTRL < 10.: + return NoEntryAlert("IQModel is starting up", alert_text_1="Please Wait") + mdl = sm['modelV2'].velocity.x[0] if len(sm['modelV2'].velocity.x) else math.nan + err = CS.vEgo - mdl + msg = f"Speed Error: {err:.1f} m/s" + return NoEntryAlert(msg, alert_text_1="Posenet Speed Invalid") + + +def process_not_running_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + not_running = [p.name for p in sm['managerState'].processes if not p.running and p.shouldBeRunning] + msg = ', '.join(not_running) + return NoEntryAlert(msg, alert_text_1="Process Not Running") + + +def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + bs = [s for s in sm.data.keys() if not sm.all_checks([s, ])] + msg = ', '.join(bs[:4]) # can't fit too many on one line + return NoEntryAlert(msg, alert_text_1="Communication Issue Between Processes") + + +def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + all_cams = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState') + bad_cams = [s.replace('State', '') for s in all_cams if s in sm.data.keys() and not sm.all_checks([s, ])] + return NormalPermanentAlert("Camera Malfunction", ', '.join(bad_cams)) + + +def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + rpy = sm['extrinsicsCalibration'].rpyCalib + yaw = math.degrees(rpy[2] if len(rpy) == 3 else math.nan) + pitch = math.degrees(rpy[1] if len(rpy) == 3 else math.nan) + angles = f"Remount Device (Pitch: {pitch:.1f}°, Yaw: {yaw:.1f}°)" + return NormalPermanentAlert("Calibration Invalid", angles) + + +def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if not sm['vehicleParameters'].angleOffsetValid: + angle_offset_deg = sm['vehicleParameters'].angleOffsetDeg + title = "Steering misalignment detected" + text = f"Angle offset too high (Offset: {angle_offset_deg:.1f}°)" + elif not sm['vehicleParameters'].steerRatioValid: + steer_ratio = sm['vehicleParameters'].steerRatio + title = "Steer ratio mismatch" + text = f"Steering rack geometry may be off (Ratio: {steer_ratio:.1f})" + elif not sm['vehicleParameters'].stiffnessFactorValid: + stiffness_factor = sm['vehicleParameters'].stiffnessFactor + title = "Abnormal tire stiffness" + text = f"Check tires, pressure, or alignment (Factor: {stiffness_factor:.1f})" + else: + return NoEntryAlert("paramsd Temporary Error") + + return NoEntryAlert(alert_text_1=title, alert_text_2=text) + +def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + cpu = max(sm['deviceState'].cpuTempC, default=0.) + gpu = max(sm['deviceState'].gpuTempC, default=0.) + temp = max((cpu, gpu, sm['deviceState'].memoryTempC)) + return NormalPermanentAlert("System Overheated", f"{temp:.0f} °C") + + +def low_memory_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NormalPermanentAlert("Low Memory", f"{sm['deviceState'].memoryUsagePercent}% used") + + +def high_cpu_usage_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + x = max(sm['deviceState'].cpuUsagePercent, default=0.) + return NormalPermanentAlert("High CPU Usage", f"{x}% used") + + +def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NormalPermanentAlert("Driving Model Lagging", f"{sm['modelV2'].frameDropPerc:.1f}% frames dropped") + + +def _joystick_axes(sm: messaging.SubMaster) -> tuple[float, float] | None: + if 'testJoystick' not in sm.data or sm.recv_frame['testJoystick'] == 0: + return None + + axes = list(sm['testJoystick'].axes) + if len(axes) < 2: + return None + + return float(axes[0]), float(axes[1]) + + +def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + gb = sm['carControl'].actuators.accel / 4. + if CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED): + steer = sm['carControl'].actuators.steeringAngleDeg + vals = f"Gas: {round(gb * 100.)}%, Angle: {round(steer, 1)}°" + else: + steer = sm['carControl'].actuators.torque + vals = f"Gas: {round(gb * 100.)}%, Steer: {round(steer * 100.)}%" + return NormalPermanentAlert("Joystick Mode", vals) + + +def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + ad = sm['alertDebug'] + audible_alert = AudibleAlert.prompt if 'Active' in ad.alertText1 else AudibleAlert.none + alert_status = AlertStatus.userPrompt if 'Active' in ad.alertText1 else AlertStatus.normal + alert_size = AlertSize.mid if ad.alertText2 else AlertSize.small + return Alert(ad.alertText1, ad.alertText2, + alert_status, alert_size, + Priority.LOW, VisualAlert.none, audible_alert, 0.2) + + +def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + personality = str(personality).title() + return NormalPermanentAlert(f"Driving Personality: {personality}", duration=1.5) + + +def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + title = "Invalid LKAS setting" + text = "Toggle stock LKAS on or off to engage" + if CP.brand == "tesla": + title = "Dashcam Mode" + text = "FSD / Autosteer is active" + elif CP.brand == "mazda": + text = "Enable your car's LKAS to engage" + elif CP.brand == "nissan": + text = "Disable your car's stock LKAS to engage" + return NormalPermanentAlert(title, text) + + +def invalid_lkas_setting_no_entry_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, + metric: bool, soft_disable_time: int, personality) -> Alert: + if CP.brand == "tesla": + return NoEntryAlert("FSD / Autosteer is active", alert_text_1="Dashcam Mode") + return NoEntryAlert("Invalid LKAS setting") + + + +EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { + # ********** events with no alerts ********** + + EventName.stockFcw: {}, + EventName.actuatorsApiUnavailable: {}, + + # ********** events only containing alerts displayed in all states ********** + + EventName.joystickDebug: { + ET.WARNING: joystick_alert, + ET.PERMANENT: NormalPermanentAlert("Joystick Mode"), + }, + + EventName.longitudinalManeuver: { + ET.WARNING: longitudinal_maneuver_alert, + ET.PERMANENT: NormalPermanentAlert("Longitudinal Maneuver Mode", + "Ensure road ahead is clear"), + }, + + EventName.bigModelLoading: { + ET.NO_ENTRY: NoEntryAlert("Big Model Loading"), + }, + + EventName.bigModelFailed: { + ET.SOFT_DISABLE: soft_disable_alert("Big Model Failed"), + ET.PERMANENT: NormalPermanentAlert("Big Model Failed ", "Restart the car to retry,\nsmall model is still available", duration=20.), + }, + + EventName.lateralManeuver: { + ET.WARNING: longitudinal_maneuver_alert, + ET.PERMANENT: NormalPermanentAlert("Lateral Maneuver Mode"), + }, + + EventName.selfdriveInitializing: { + ET.NO_ENTRY: NoEntryAlert("IQ.Pilot Initializing"), + }, + + EventName.startup: { + ET.PERMANENT: StartupAlert("Welcome to IQ.Pilot!") + }, + + EventName.startupMaster: { + ET.PERMANENT: StartupAlert("Welcome to IQ.Pilot!"), + }, + + EventName.startupNoControl: { + ET.PERMANENT: StartupAlert("Dashcam mode"), + ET.NO_ENTRY: NoEntryAlert("Dashcam mode"), + }, + + EventName.startupNoCar: { + ET.PERMANENT: StartupAlert("IQ.Pilot Dashcam mode: car unrecognized"), + }, + + EventName.startupNoSecOcKey: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + "TSK Security Key Not Available", + priority=Priority.HIGH), + }, + + EventName.dashcamMode: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + priority=Priority.LOWEST), + }, + + EventName.invalidLkasSetting: { + ET.PERMANENT: invalid_lkas_setting_alert, + ET.NO_ENTRY: invalid_lkas_setting_no_entry_alert, + }, + + EventName.cruiseMismatch: { + #ET.PERMANENT: ImmediateDisableAlert("openpilot failed to cancel cruise"), + }, + + # openpilot doesn't recognize the car. This switches openpilot into a + # read-only mode. This can be solved by adding your fingerprint. + # See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information + EventName.carUnrecognized: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + "Car Unrecognized", + priority=Priority.LOWEST), + }, + + EventName.aeb: { + ET.PERMANENT: Alert( + "BRAKE!", + "Emergency Braking: Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.), + ET.NO_ENTRY: NoEntryAlert("AEB: Risk of Collision"), + }, + + EventName.stockAeb: { + ET.PERMANENT: Alert( + "BRAKE!", + "Stock AEB: Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.), + ET.NO_ENTRY: NoEntryAlert("Stock AEB: Risk of Collision"), + }, + + EventName.stockLkas: { + ET.PERMANENT: Alert( + "Stock LKAS: Lane Departure Detected", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.), + ET.NO_ENTRY: NoEntryAlert("Stock LKAS: Lane Departure Detected"), + }, + + EventName.fcw: { + ET.PERMANENT: Alert( + "BRAKE!", + "Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.warningSoft, 2.), + }, + + EventName.ldw: { + ET.PERMANENT: Alert( + "Lane Departure Detected", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.), + }, + + # ********** events only containing alerts that display while engaged ********** + + EventName.steerTempUnavailableSilent: { + ET.WARNING: Alert( + "Steering Assist Temporarily Unavailable", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 1.8), + }, + + EventName.preDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "", + AlertStatus.normal, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.promptDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "Driver Distracted", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1), + }, + + EventName.driverDistracted: { + ET.PERMANENT: Alert( + "DISENGAGE IMMEDIATELY", + "Driver Distracted", + AlertStatus.critical, AlertSize.full, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1), + }, + + EventName.preDriverUnresponsive: { + ET.PERMANENT: Alert( + "Touch Steering Wheel: No Face Detected", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1), + }, + + EventName.promptDriverUnresponsive: { + ET.PERMANENT: Alert( + "Touch Steering Wheel", + "Driver Unresponsive", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1), + }, + + EventName.driverUnresponsive: { + ET.PERMANENT: Alert( + "DISENGAGE IMMEDIATELY", + "Driver Unresponsive", + AlertStatus.critical, AlertSize.full, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1), + }, + + EventName.manualRestart: { + ET.WARNING: Alert( + "TAKE CONTROL", + "Resume Driving Manually", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.resumeRequired: { + ET.WARNING: Alert( + "Press Resume to Exit Standstill", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.belowSteerSpeed: { + ET.WARNING: below_steer_speed_alert, + }, + + EventName.preLaneChangeLeft: { + ET.WARNING: Alert( + "Steer Left to Start Lane Change Once Safe", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.preLaneChangeRight: { + ET.WARNING: Alert( + "Steer Right to Start Lane Change Once Safe", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.laneChangeBlocked: { + ET.WARNING: Alert( + "Car Detected in Blindspot", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1), + }, + + EventName.laneChange: { + ET.WARNING: Alert( + "Changing Lanes", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.steerSaturated: { + ET.WARNING: Alert( + "Take Control", + "Turn Exceeds Steering Limit", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.), + }, + + # Thrown when the fan is driven at >50% but is not rotating + EventName.fanMalfunction: { + ET.PERMANENT: NormalPermanentAlert("Fan Malfunction", "Likely Hardware Issue"), + }, + + # Camera is not outputting frames + EventName.cameraMalfunction: { + ET.PERMANENT: camera_malfunction_alert, + ET.SOFT_DISABLE: soft_disable_alert("Camera Malfunction"), + ET.NO_ENTRY: NoEntryAlert("Camera Malfunction: Reboot Your Device"), + }, + # Camera framerate too low + EventName.cameraFrameRate: { + ET.PERMANENT: NormalPermanentAlert("Camera Frame Rate Low", "Reboot your Device"), + ET.SOFT_DISABLE: soft_disable_alert("Camera Frame Rate Low"), + ET.NO_ENTRY: NoEntryAlert("Camera Frame Rate Low: Reboot Your Device"), + }, + + # Unused + + EventName.locationdTemporaryError: { + ET.NO_ENTRY: NoEntryAlert("locationd Temporary Error"), + ET.SOFT_DISABLE: soft_disable_alert("locationd Temporary Error"), + }, + + EventName.locationdPermanentError: { + ET.NO_ENTRY: NoEntryAlert("locationd Permanent Error"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("locationd Permanent Error"), + ET.PERMANENT: NormalPermanentAlert("locationd Permanent Error"), + }, + + # openpilot tries to learn certain parameters about your car by observing + # how the car behaves to steering inputs from both human and openpilot driving. + # This includes: + # - steer ratio: gear ratio of the steering rack. Steering angle divided by tire angle + # - tire stiffness: how much grip your tires have + # - angle offset: most steering angle sensors are offset and measure a non zero angle when driving straight + # This alert is thrown when any of these values exceed a sanity check. This can be caused by + # bad alignment or bad sensor data. If this happens consistently consider creating an issue on GitHub + EventName.paramsdTemporaryError: { + ET.NO_ENTRY: paramsd_invalid_alert, + ET.SOFT_DISABLE: soft_disable_alert("paramsd Temporary Error"), + }, + + EventName.paramsdPermanentError: { + ET.NO_ENTRY: NoEntryAlert("paramsd Permanent Error"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("paramsd Permanent Error"), + ET.PERMANENT: NormalPermanentAlert("paramsd Permanent Error"), + }, + + # ********** events that affect controls state transitions ********** + + EventName.pcmEnable: { + ET.ENABLE: EngagementAlert(AudibleAlert.engage), + }, + + EventName.buttonEnable: { + ET.ENABLE: EngagementAlert(AudibleAlert.engage), + }, + + EventName.pcmDisable: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + }, + + EventName.buttonCancel: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Cancel Pressed"), + }, + + EventName.brakeHold: { + ET.WARNING: Alert( + "Press Resume to Exit Brake Hold", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.parkBrake: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Parking Brake Engaged"), + }, + + EventName.pedalPressed: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Pedal Pressed", + visual_alert=VisualAlert.brakePressed), + }, + + EventName.steerDisengage: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Steering Pressed"), + }, + + EventName.preEnableStandstill: { + ET.PRE_ENABLE: Alert( + "Release Brake to Engage", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1, creation_delay=1.), + }, + + EventName.gasPressedOverride: { + ET.OVERRIDE_LONGITUDINAL: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.steerOverride: { + ET.OVERRIDE_LATERAL: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.wrongCarMode: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: wrong_car_mode_alert, + }, + + EventName.resumeBlocked: { + ET.NO_ENTRY: NoEntryAlert("Press Set to Engage"), + }, + + EventName.wrongCruiseMode: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Adaptive Cruise Disabled"), + }, + + EventName.steerTempUnavailable: { + ET.SOFT_DISABLE: soft_disable_alert("Steering Assist Temporarily Unavailable"), + ET.NO_ENTRY: NoEntryAlert("Steering Temporarily Unavailable"), + }, + + EventName.steerTimeLimit: { + ET.SOFT_DISABLE: soft_disable_alert("Vehicle Steering Time Limit"), + ET.NO_ENTRY: NoEntryAlert("Vehicle Steering Time Limit"), + }, + + EventName.outOfSpace: { + ET.PERMANENT: out_of_space_alert, + ET.NO_ENTRY: NoEntryAlert("Out of Storage"), + }, + + EventName.belowEngageSpeed: { + ET.NO_ENTRY: below_engage_speed_alert, + }, + + EventName.sensorDataInvalid: { + ET.PERMANENT: Alert( + "Sensor Data Invalid", + "Possible Hardware Issue", + AlertStatus.normal, AlertSize.mid, + Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2, creation_delay=1.), + ET.NO_ENTRY: NoEntryAlert("Sensor Data Invalid"), + ET.SOFT_DISABLE: soft_disable_alert("Sensor Data Invalid"), + }, + + EventName.noGps: { + }, + + EventName.tooDistracted: { + ET.NO_ENTRY: NoEntryAlert("Distraction Level Too High"), + }, + + EventName.excessiveActuation: { + ET.SOFT_DISABLE: soft_disable_alert("Excessive Actuation"), + ET.NO_ENTRY: NoEntryAlert("Excessive Actuation"), + }, + + EventName.overheat: { + ET.PERMANENT: overheat_alert, + ET.SOFT_DISABLE: soft_disable_alert("System Overheated"), + ET.NO_ENTRY: NoEntryAlert("System Overheated"), + }, + + EventName.wrongGear: { + ET.SOFT_DISABLE: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + ET.NO_ENTRY: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + }, + + # This alert is thrown when the calibration angles are outside of the acceptable range. + # For example if the device is pointed too much to the left or the right. + # Usually this can only be solved by removing the mount from the windshield completely, + # and attaching while making sure the device is pointed straight forward and is level. + # See https://comma.ai/setup for more information + EventName.calibrationInvalid: { + ET.PERMANENT: calibration_invalid_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Invalid: Remount Device & Recalibrate"), + ET.NO_ENTRY: NoEntryAlert("Calibration Invalid: Remount Device & Recalibrate"), + }, + + EventName.calibrationIncomplete: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"), + ET.NO_ENTRY: NoEntryAlert("Calibration in Progress"), + }, + + EventName.calibrationRecalibrating: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Device Remount Detected: Recalibrating"), + ET.NO_ENTRY: NoEntryAlert("Remount Detected: Recalibrating"), + }, + + EventName.doorOpen: { + ET.SOFT_DISABLE: user_soft_disable_alert("Door Open"), + ET.NO_ENTRY: NoEntryAlert("Door Open"), + }, + + EventName.seatbeltNotLatched: { + ET.SOFT_DISABLE: user_soft_disable_alert("Seatbelt Unlatched"), + ET.NO_ENTRY: NoEntryAlert("Seatbelt Unlatched"), + }, + + EventName.espDisabled: { + ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Disabled"), + ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Disabled"), + }, + + EventName.lowBattery: { + ET.SOFT_DISABLE: soft_disable_alert("Low Battery"), + ET.NO_ENTRY: NoEntryAlert("Low Battery"), + }, + + # Different openpilot services communicate between each other at a certain + # interval. If communication does not follow the regular schedule this alert + # is thrown. This can mean a service crashed, did not broadcast a message for + # ten times the regular interval, or the average interval is more than 10% too high. + # Soft warnings — no disable, no entry block. UI shows a silent yellow triangle instead. + EventName.commIssue: { + }, + EventName.commIssueAvgFreq: { + }, + + EventName.selfdrivedLagging: { + }, + + # Thrown when manager detects a service exited unexpectedly while driving + EventName.processNotRunning: { + ET.NO_ENTRY: process_not_running_alert, + ET.SOFT_DISABLE: soft_disable_alert("Process Not Running"), + }, + + EventName.radarFault: { + ET.SOFT_DISABLE: soft_disable_alert("Radar Error: Restart the Car"), + ET.NO_ENTRY: NoEntryAlert("Radar Error: Restart the Car"), + }, + + EventName.radarTempUnavailable: { + ET.SOFT_DISABLE: soft_disable_alert("Radar Temporarily Unavailable"), + ET.NO_ENTRY: NoEntryAlert("Radar Temporarily Unavailable"), + }, + + # Every frame from the camera should be processed by the model. If modeld + # is not processing frames fast enough they have to be dropped. This alert is + # thrown when over 20% of frames are dropped. + EventName.modeldLagging: { + ET.SOFT_DISABLE: soft_disable_alert("Driving Model Lagging"), + ET.NO_ENTRY: NoEntryAlert("Driving Model Lagging"), + ET.PERMANENT: modeld_lagging_alert, + }, + + # Besides predicting the path, lane lines and lead car data the model also + # predicts the current velocity and rotation speed of the car. If the model is + # very uncertain about the current velocity while the car is moving, this + # usually means the model has trouble understanding the scene. This is used + # as a heuristic to warn the driver. + EventName.posenetInvalid: { + ET.SOFT_DISABLE: soft_disable_alert("Posenet Speed Invalid"), + ET.NO_ENTRY: posenet_invalid_alert, + }, + + # When the localizer detects an acceleration of more than 40 m/s^2 (~4G) we + # alert the driver the device might have fallen from the windshield. + EventName.deviceFalling: { + ET.SOFT_DISABLE: soft_disable_alert("Device Fell Off Mount"), + ET.NO_ENTRY: NoEntryAlert("Device Fell Off Mount"), + }, + + EventName.lowMemory: { + ET.SOFT_DISABLE: soft_disable_alert("Low Memory: Reboot Your Device"), + ET.PERMANENT: low_memory_alert, + ET.NO_ENTRY: NoEntryAlert("Low Memory: Reboot Your Device"), + }, + + EventName.accFaulted: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"), + ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"), + ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"), + }, + + EventName.cruiseFaultLateralAllowed: { + ET.PERMANENT: NormalPermanentAlert("Cruise Faulted", "Lane Assist will continue to work", priority=Priority.LOWEST), + }, + + EventName.espActive: { + ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Active"), + ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Active"), + }, + + EventName.controlsMismatch: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch"), + ET.NO_ENTRY: NoEntryAlert("Controls Mismatch"), + }, + + # Sometimes the USB stack on the device can get into a bad state + # causing the connection to the panda to be lost + EventName.usbError: { + ET.SOFT_DISABLE: soft_disable_alert("USB Error: Reboot Your Device"), + ET.PERMANENT: NormalPermanentAlert("USB Error: Reboot Your Device"), + ET.NO_ENTRY: NoEntryAlert("USB Error: Reboot Your Device"), + }, + + # This alert can be thrown for the following reasons: + # - No CAN data received at all + # - CAN data is received, but some message are not received at the right frequency + # If you're not writing a new car port, this is usually cause by faulty wiring + # Minor canError: low-priority silent HUD badge only — no disable, no entry block, no audible/visual alert + EventName.canError: { + ET.PERMANENT: Alert( + "CAN Error", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.), + }, + + EventName.canBusMissing: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Bus Disconnected"), + ET.PERMANENT: Alert( + "CAN Bus Disconnected: Likely Faulty Cable", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.), + ET.NO_ENTRY: NoEntryAlert("CAN Bus Disconnected: Check Connections"), + }, + + EventName.steerUnavailable: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"), + ET.PERMANENT: NormalPermanentAlert("LKAS Fault: Restart the car to engage"), + ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"), + }, + + EventName.reverseGear: { + ET.PERMANENT: Alert( + "Reverse\nGear", + "", + AlertStatus.normal, AlertSize.full, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), + ET.USER_DISABLE: ImmediateDisableAlert("Reverse Gear"), + ET.NO_ENTRY: NoEntryAlert("Reverse Gear"), + }, + + # On cars that use stock ACC the car can decide to cancel ACC for various reasons. + # When this happens we can no long control the car so the user needs to be warned immediately. + EventName.cruiseDisabled: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Is Off"), + }, + + # When the relay in the harness box opens the CAN bus between the LKAS camera + # and the rest of the car is separated. When messages from the LKAS camera + # are received on the car side this usually means the relay hasn't opened correctly + # and this alert is thrown. + EventName.relayMalfunction: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Harness Relay Malfunction"), + ET.PERMANENT: NormalPermanentAlert("Harness Relay Malfunction", "Check Hardware"), + ET.NO_ENTRY: NoEntryAlert("Harness Relay Malfunction"), + }, + + EventName.speedTooLow: { + ET.IMMEDIATE_DISABLE: Alert( + "IQ.Pilot Canceled", + "Speed too low", + AlertStatus.normal, AlertSize.mid, + Priority.HIGH, VisualAlert.none, AudibleAlert.disengage, 3.), + }, + + # When the car is driving faster than most cars in the training data, the model outputs can be unpredictable. + EventName.speedTooHigh: { + ET.WARNING: Alert( + "Speed Too High", + "Model uncertain at this speed", + AlertStatus.userPrompt, AlertSize.mid, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 4.), + ET.NO_ENTRY: NoEntryAlert("Slow down to engage"), + }, + + EventName.vehicleSensorsInvalid: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Vehicle Sensors Invalid"), + ET.PERMANENT: NormalPermanentAlert("Vehicle Sensors Calibrating", "Drive to Calibrate"), + ET.NO_ENTRY: NoEntryAlert("Vehicle Sensors Calibrating"), + }, + + EventName.personalityChanged: { + ET.WARNING: personality_changed_alert, + }, + + EventName.userBookmark: { + ET.PERMANENT: NormalPermanentAlert("Bookmark Saved", duration=1.5), + }, + + EventName.audioFeedback: { + ET.PERMANENT: audio_feedback_alert, + }, +} + + +if HARDWARE.get_device_type() == 'mici': + EVENTS.update({ + EventName.preDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "", + AlertStatus.normal, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlert.none, 2), + }, + EventName.promptDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "Driver Distracted", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, 1), + }, + EventName.resumeRequired: { + ET.WARNING: Alert( + "Press Resume", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + EventName.preLaneChangeLeft: { + ET.WARNING: Alert( + "Steer Left", + "Confirm Lane Change", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + EventName.preLaneChangeRight: { + ET.WARNING: Alert( + "Steer Right", + "Confirm Lane Change", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + EventName.laneChangeBlocked: { + ET.WARNING: Alert( + "Car in Blindspot", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1), + }, + EventName.steerSaturated: { + ET.WARNING: Alert( + "take control", + "turn exceeds limit", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.), + }, + EventName.calibrationIncomplete: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"), + ET.NO_ENTRY: NoEntryAlert("Calibrating"), + }, + EventName.reverseGear: { + ET.PERMANENT: Alert( + "Reverse", + "", + AlertStatus.normal, AlertSize.full, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), + ET.USER_DISABLE: ImmediateDisableAlert("Reverse"), + ET.NO_ENTRY: NoEntryAlert("Reverse"), + }, + }) + + +if __name__ == '__main__': + # print all alerts by type and priority + from iqpilot.cereal.services import SERVICE_LIST + from collections import defaultdict + + event_names = {v: k for k, v in EventName.schema.enumerants.items()} + alerts_by_type: dict[str, dict[Priority, list[str]]] = defaultdict(lambda: defaultdict(list)) + + CP = car.CarParams.new_message() + CS = car.CarState.new_message() + sm = messaging.SubMaster(list(SERVICE_LIST.keys())) + + for i, alerts in EVENTS.items(): + for et, alert in alerts.items(): + if callable(alert): + alert = alert(CP, CS, sm, False, 1, log.LongitudinalPersonality.standard) + alerts_by_type[et][alert.priority].append(event_names[i]) + + all_alerts: dict[str, list[tuple[Priority, list[str]]]] = {} + for et, priority_alerts in alerts_by_type.items(): + all_alerts[et] = sorted(priority_alerts.items(), key=lambda x: x[0], reverse=True) + + for status, evs in sorted(all_alerts.items(), key=lambda x: x[0]): + print(f"**** {status} ****") + for p, alert_list in evs: + print(f" {repr(p)}:") + print(" ", ', '.join(alert_list), "\n") diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/ui/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/ui/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/feedbackd.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/feedbackd.py new file mode 100644 index 000000000..0412edd32 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/selfdrive/ui/feedback/feedbackd.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +import iqpilot.cereal.messaging as messaging +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.cereal import car +from iqpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER + +FEEDBACK_MAX_DURATION = 10.0 +ButtonType = car.CarState.ButtonEvent.Type + + +def main(): + params = Params() + pm = messaging.PubMaster(['userBookmark', 'audioFeedback']) + sm = messaging.SubMaster(['rawAudioData', 'bookmarkButton']) + should_record_audio = False + block_num = 0 + waiting_for_release = False + early_stop_triggered = False + + while True: + sm.update() + should_send_bookmark = False + + if False and sm.updated['carState'] and sm['carState'].canValid and not sm['iqState'].aol.available: + for be in sm['carState'].buttonEvents: + if be.type == ButtonType.lkas: + if be.pressed: + if not should_record_audio: + if params.get_bool("RecordAudioFeedback"): + should_record_audio = True + block_num = 0 + waiting_for_release = False + early_stop_triggered = False + cloudlog.info("LKAS button pressed - starting 10-second audio feedback") + else: + should_send_bookmark = True + cloudlog.info("LKAS button pressed - bookmarking") + elif should_record_audio and not waiting_for_release: + waiting_for_release = True + elif waiting_for_release: + waiting_for_release = False + early_stop_triggered = True + cloudlog.info("LKAS button released - ending recording early") + + if should_record_audio and sm.updated['rawAudioData']: + raw_audio = sm['rawAudioData'] + msg = messaging.new_message('audioFeedback', valid=True) + msg.audioFeedback.audio.data = raw_audio.data + msg.audioFeedback.audio.sampleRate = raw_audio.sampleRate + msg.audioFeedback.blockNum = block_num + block_num += 1 + if (block_num * SAMPLE_BUFFER / SAMPLE_RATE) >= FEEDBACK_MAX_DURATION or early_stop_triggered: + should_send_bookmark = True + should_record_audio = False + early_stop_triggered = False + cloudlog.info("10-second recording completed or second button press - stopping audio feedback") + pm.send('audioFeedback', msg) + + if sm.updated['bookmarkButton']: + cloudlog.info("Bookmark button pressed!") + should_send_bookmark = True + + if should_send_bookmark: + msg = messaging.new_message('userBookmark', valid=True) + pm.send('userBookmark', msg) + + +if __name__ == '__main__': + main() diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py new file mode 100644 index 000000000..1338aa2cf --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py @@ -0,0 +1,22 @@ +import os +from typing import cast + +from iqpilot.system.hardware.base import HardwareBase +from iqpilot.system.hardware.tici.hardware import Tici +from iqpilot.system.hardware.pc.hardware import Pc + +TICI = os.path.isfile('/TICI') +AGNOS = os.path.isfile('/AGNOS') +PC = not TICI + + +if TICI: + HARDWARE = cast(HardwareBase, Tici()) +else: + HARDWARE = cast(HardwareBase, Pc()) + +# Only comma 3/3X expose the DMA-BUF EGL extensions used by the zero-copy +# camera renderer and the direct EGL frame-pacing calls. /TICI is also present +# on comma 4, so it identifies the AGNOS hardware family rather than this GPU +# capability. +EGL_DMA_BUF_SUPPORTED = TICI and HARDWARE.get_device_type() in ("tici", "tizi") diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/base.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/base.py new file mode 100644 index 000000000..217696e09 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/base.py @@ -0,0 +1,228 @@ +import os +from abc import abstractmethod, ABC +from dataclasses import dataclass, fields + +from iqpilot.cereal import log + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +class LPAError(RuntimeError): + pass + +class LPAProfileNotFoundError(LPAError): + pass + +@dataclass +class Profile: + iccid: str + nickname: str + enabled: bool + provider: str + +@dataclass +class ThermalZone: + # a zone from /sys/class/thermal/thermal_zone* + name: str # a.k.a type + scale: float = 1000. # scale to get degrees in C + zone_number = -1 + + def read(self) -> float: + if self.zone_number < 0: + for n in os.listdir("/sys/devices/virtual/thermal"): + if not n.startswith("thermal_zone"): + continue + with open(os.path.join("/sys/devices/virtual/thermal", n, "type")) as f: + if f.read().strip() == self.name: + self.zone_number = int(n.removeprefix("thermal_zone")) + break + + try: + with open(f"/sys/devices/virtual/thermal/thermal_zone{self.zone_number}/temp") as f: + return int(f.read()) / self.scale + except FileNotFoundError: + return 0 + +@dataclass +class ThermalConfig: + cpu: list[ThermalZone] | None = None + gpu: list[ThermalZone] | None = None + dsp: ThermalZone | None = None + pmic: list[ThermalZone] | None = None + memory: ThermalZone | None = None + intake: ThermalZone | None = None + exhaust: ThermalZone | None = None + case: ThermalZone | None = None + + def get_msg(self): + ret = {} + for f in fields(ThermalConfig): + v = getattr(self, f.name) + if v is not None: + if isinstance(v, list): + ret[f.name + "TempC"] = [x.read() for x in v] + else: + ret[f.name + "TempC"] = v.read() + return ret + +class LPABase(ABC): + @abstractmethod + def list_profiles(self) -> list[Profile]: + pass + + @abstractmethod + def get_active_profile(self) -> Profile | None: + pass + + @abstractmethod + def delete_profile(self, iccid: str) -> None: + pass + + @abstractmethod + def bootstrap(self) -> None: + pass + + @abstractmethod + def download_profile(self, qr: str, nickname: str | None = None) -> None: + pass + + @abstractmethod + def nickname_profile(self, iccid: str, nickname: str) -> None: + pass + + @abstractmethod + def switch_profile(self, iccid: str) -> None: + pass + + def is_comma_profile(self, iccid: str) -> bool: + return any(iccid.startswith(prefix) for prefix in ('8985235',)) + +class HardwareBase(ABC): + @staticmethod + def get_cmdline() -> dict[str, str]: + with open('/proc/cmdline') as f: + cmdline = f.read() + return {kv[0]: kv[1] for kv in [s.split('=') for s in cmdline.split(' ')] if len(kv) == 2} + + @staticmethod + def read_param_file(path, parser, default=0): + try: + with open(path) as f: + return parser(f.read()) + except Exception: + return default + + def booted(self) -> bool: + return True + + def reboot(self, reason=None): + print("REBOOT!") + + def uninstall(self): + print("uninstall") + + def get_os_version(self): + return None + + @abstractmethod + def get_device_type(self): + pass + + def get_imei(self, slot) -> str: + return "" + + def get_serial(self): + return "" + + def get_network_info(self): + return None + + def get_network_type(self): + return NetworkType.none + + def get_sim_info(self): + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + + def get_sim_lpa(self) -> LPABase: + raise NotImplementedError("SIM LPA not available") + + def get_network_strength(self, network_type): + return NetworkStrength.unknown + + def get_network_metered(self, network_type) -> bool: + return network_type not in (NetworkType.none, NetworkType.wifi, NetworkType.ethernet) + + def get_current_power_draw(self): + return 0 + + def get_som_power_draw(self): + return 0 + + def shutdown(self): + print("SHUTDOWN!") + + def get_thermal_config(self): + return ThermalConfig() + + def set_display_power(self, on: bool): + pass + + def set_screen_brightness(self, percentage): + pass + + def get_screen_brightness(self): + return 0 + + def set_power_save(self, powersave_enabled): + pass + + def get_gpu_usage_percent(self): + return 0 + + def get_modem_version(self): + return None + + def get_modem_temperatures(self): + return [] + + def initialize_hardware(self): + pass + + def configure_modem(self): + pass + + def reboot_modem(self): + pass + + def recover_sim_detection(self) -> bool: + return False + + def get_networks(self): + return None + + def has_internal_panda(self) -> bool: + return False + + def reset_internal_panda(self): + pass + + def recover_internal_panda(self): + pass + + def get_modem_data_usage(self): + return -1, -1 + + def get_voltage(self) -> float: + return 0. + + def get_current(self) -> float: + return 0. + + def set_ir_power(self, percent: int): + pass diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/hw.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/hw.py new file mode 100644 index 000000000..7263ddbfc --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/hw.py @@ -0,0 +1,137 @@ +import os +import platform +from pathlib import Path + +from iqpilot.system.hardware import PC + +DEFAULT_DOWNLOAD_CACHE_ROOT = "/tmp/comma_download_cache" + +class Paths: + _persist_root_cache: str | None = None + + @staticmethod + def _is_writable_persist_root(path: str) -> bool: + try: + os.makedirs(path, exist_ok=True) + comma_dir = os.path.join(path, "comma") + os.makedirs(comma_dir, exist_ok=True) + + probe_path = os.path.join(comma_dir, ".rw_probe") + with open(probe_path, "w") as f: + f.write("1") + os.remove(probe_path) + return True + except OSError: + return False + + @staticmethod + def comma_home() -> str: + return os.path.join(str(Path.home()), ".comma" + os.environ.get("OPENPILOT_PREFIX", "")) + + @staticmethod + def params() -> str: + if os.environ.get("PARAMS_ROOT"): + return os.environ["PARAMS_ROOT"] + return os.path.join(Paths.comma_home(), "params") if PC else "/data/params" + + @staticmethod + def log_root() -> str: + if os.environ.get('LOG_ROOT', False): + return os.environ['LOG_ROOT'] + elif PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "realdata") + else: + return '/data/media/0/realdata/' + + @staticmethod + def log_root_external() -> str: + return '/mnt/external_realdata/' + + @staticmethod + def swaglog_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "log") + else: + return "/data/log/" + + @staticmethod + def swaglog_ipc() -> str: + return "ipc:///tmp/logmessage" + os.environ.get("OPENPILOT_PREFIX", "") + + @staticmethod + def download_cache_root() -> str: + if os.environ.get('COMMA_CACHE', False): + return os.environ['COMMA_CACHE'] + "/" + return DEFAULT_DOWNLOAD_CACHE_ROOT + os.environ.get("OPENPILOT_PREFIX", "") + "/" + + @staticmethod + def persist_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "persist") + + if Paths._persist_root_cache is not None: + return Paths._persist_root_cache + + for candidate in ("/persist", "/data/persist"): + if Paths._is_writable_persist_root(candidate): + Paths._persist_root_cache = candidate + return candidate + + # Keep previous behavior as a last resort. + Paths._persist_root_cache = "/persist" + return Paths._persist_root_cache + + @staticmethod + def stats_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats/" + + @staticmethod + def stats_iq_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats_iq/" + + @staticmethod + def config_root() -> str: + if PC: + return Paths.comma_home() + else: + return "/tmp/.comma" + + @staticmethod + def shm_path() -> str: + if PC and platform.system() == "Darwin": + return "/tmp" # This is not really shared memory on macOS, but it's the closest we can get + return "/dev/shm" + + @staticmethod + def model_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "models") + else: + return "/data/media/0/models" + + @staticmethod + def crash_log_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "community" / "crashes") + else: + return "/data/community/crashes" + + @staticmethod + def mapd_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "osm") + else: + return "/data/media/0/osm" + + @staticmethod + def screen_recordings_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "screen_recordings") + else: + return "/data/media/0/screen_recordings" diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py new file mode 100644 index 000000000..72ef2f235 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py @@ -0,0 +1,12 @@ +from iqpilot.cereal import log +from iqpilot.system.hardware.base import HardwareBase + +NetworkType = log.DeviceState.NetworkType + + +class Pc(HardwareBase): + def get_device_type(self): + return "pc" + + def get_network_type(self): + return NetworkType.wifi diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py new file mode 100644 index 000000000..48a34ea48 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +import time +from collections import namedtuple + +from iqpilot.common.i2c import SMBus + +# https://datasheets.maximintegrated.com/en/ds/MAX98089.pdf + +AmpConfig = namedtuple('AmpConfig', ['name', 'value', 'register', 'offset', 'mask']) +EQParams = namedtuple('EQParams', ['K', 'k1', 'k2', 'c1', 'c2']) + + +def configs_from_eq_params(base, eq_params): + return [ + AmpConfig("K (high)", (eq_params.K >> 8), base, 0, 0xFF), + AmpConfig("K (low)", (eq_params.K & 0xFF), base + 1, 0, 0xFF), + AmpConfig("k1 (high)", (eq_params.k1 >> 8), base + 2, 0, 0xFF), + AmpConfig("k1 (low)", (eq_params.k1 & 0xFF), base + 3, 0, 0xFF), + AmpConfig("k2 (high)", (eq_params.k2 >> 8), base + 4, 0, 0xFF), + AmpConfig("k2 (low)", (eq_params.k2 & 0xFF), base + 5, 0, 0xFF), + AmpConfig("c1 (high)", (eq_params.c1 >> 8), base + 6, 0, 0xFF), + AmpConfig("c1 (low)", (eq_params.c1 & 0xFF), base + 7, 0, 0xFF), + AmpConfig("c2 (high)", (eq_params.c2 >> 8), base + 8, 0, 0xFF), + AmpConfig("c2 (low)", (eq_params.c2 & 0xFF), base + 9, 0, 0xFF), + ] + + +BASE_CONFIG = [ + AmpConfig("MCLK prescaler", 0b01, 0x10, 4, 0b00110000), + AmpConfig("PM: enable speakers", 0b11, 0x4D, 4, 0b00110000), + AmpConfig("PM: enable DACs", 0b11, 0x4D, 0, 0b00000011), + AmpConfig("Enable PLL1", 0b1, 0x12, 7, 0b10000000), + AmpConfig("Enable PLL2", 0b1, 0x1A, 7, 0b10000000), + AmpConfig("DAI1: I2S mode", 0b00100, 0x14, 2, 0b01111100), + AmpConfig("DAI2: I2S mode", 0b00100, 0x1C, 2, 0b01111100), + AmpConfig("DAI1 Passband filtering: music mode", 0b1, 0x18, 7, 0b10000000), + AmpConfig("DAI1 voice mode gain (DV1G)", 0b00, 0x2F, 4, 0b00110000), + AmpConfig("DAI1 attenuation (DV1)", 0x0, 0x2F, 0, 0b00001111), + AmpConfig("DAI2 attenuation (DV2)", 0x0, 0x31, 0, 0b00001111), + AmpConfig("DAI2: DC blocking", 0b1, 0x20, 0, 0b00000001), + AmpConfig("DAI2: High sample rate", 0b0, 0x20, 3, 0b00001000), + AmpConfig("ALC enable", 0b1, 0x43, 7, 0b10000000), + AmpConfig("ALC/excursion limiter release time", 0b101, 0x43, 4, 0b01110000), + AmpConfig("ALC multiband enable", 0b1, 0x43, 3, 0b00001000), + AmpConfig("DAI1 EQ enable", 0b0, 0x49, 0, 0b00000001), + AmpConfig("DAI2 EQ clip detection disabled", 0b1, 0x32, 4, 0b00010000), + AmpConfig("DAI2 EQ attenuation", 0x5, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b100, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter lower corner freq", 0b00, 0x41, 0, 0b00000011), + AmpConfig("Excursion limiter threshold", 0b000, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x6, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b0, 0x46, 0, 0b00000001), + AmpConfig("Right DAC input mixer: DAI1 left", 0b0, 0x22, 3, 0b00001000), + AmpConfig("Right DAC input mixer: DAI1 right", 0b0, 0x22, 2, 0b00000100), + AmpConfig("Right DAC input mixer: DAI2 left", 0b1, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b0, 0x22, 0, 0b00000001), + AmpConfig("DAI1 audio port selector", 0b10, 0x16, 6, 0b11000000), + AmpConfig("DAI2 audio port selector", 0b01, 0x1E, 6, 0b11000000), + AmpConfig("Enable left digital microphone", 0b1, 0x48, 5, 0b00100000), + AmpConfig("Enable right digital microphone", 0b1, 0x48, 4, 0b00010000), + AmpConfig("Enhanced volume smoothing disabled", 0b0, 0x49, 7, 0b10000000), + AmpConfig("Volume adjustment smoothing disabled", 0b0, 0x49, 6, 0b01000000), + AmpConfig("Zero-crossing detection disabled", 0b0, 0x49, 5, 0b00100000), +] + +CONFIGS = { + "tici": [ + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Right speaker output volume", 0x1c, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b1, 0x49, 1, 0b00000010), + *configs_from_eq_params(0x84, EQParams(0x274F, 0xC0FF, 0x3BF9, 0x0B3C, 0x1656)), + *configs_from_eq_params(0x8E, EQParams(0x1009, 0xC6BF, 0x2952, 0x1C97, 0x30DF)), + *configs_from_eq_params(0x98, EQParams(0x0F75, 0xCBE5, 0x0ED2, 0x2528, 0x3E42)), + *configs_from_eq_params(0xA2, EQParams(0x091F, 0x3D4C, 0xCE11, 0x1266, 0x2807)), + *configs_from_eq_params(0xAC, EQParams(0x0A9E, 0x3F20, 0xE573, 0x0A8B, 0x3A3B)), + ], + "tizi": [ + AmpConfig("Left speaker output from left DAC", 0b1, 0x2B, 0, 0b11111111), + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Left Speaker Mixer Gain", 0b00, 0x2D, 0, 0b00000011), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Left speaker output volume", 0x17, 0x3D, 0, 0b00011111), + AmpConfig("Right speaker output volume", 0x17, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b0, 0x49, 1, 0b00000010), + AmpConfig("DAI2: DC blocking", 0b0, 0x20, 0, 0b00000001), + AmpConfig("ALC enable", 0b0, 0x43, 7, 0b10000000), + AmpConfig("DAI2 EQ attenuation", 0x2, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b001, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter threshold", 0b100, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x0, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b1, 0x46, 0, 0b00000001), + AmpConfig("Left DAC input mixer: DAI1 left", 0b0, 0x22, 7, 0b10000000), + AmpConfig("Left DAC input mixer: DAI1 right", 0b0, 0x22, 6, 0b01000000), + AmpConfig("Left DAC input mixer: DAI2 left", 0b1, 0x22, 5, 0b00100000), + AmpConfig("Left DAC input mixer: DAI2 right", 0b0, 0x22, 4, 0b00010000), + AmpConfig("Right DAC input mixer: DAI2 left", 0b0, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b1, 0x22, 0, 0b00000001), + AmpConfig("Volume adjustment smoothing disabled", 0b1, 0x49, 6, 0b01000000), + ], +} + + +class Amplifier: + AMP_I2C_BUS = 0 + AMP_ADDRESS = 0x10 + + def __init__(self, debug=False): + self.debug = debug + + def _get_shutdown_config(self, amp_disabled: bool) -> AmpConfig: + return AmpConfig("Global shutdown", 0b0 if amp_disabled else 0b1, 0x51, 7, 0b10000000) + + def _set_configs(self, configs: list[AmpConfig]) -> None: + with SMBus(self.AMP_I2C_BUS) as bus: + for config in configs: + if self.debug: + print(f"Setting \"{config.name}\" to {config.value}:") + + old_value = bus.read_byte_data(self.AMP_ADDRESS, config.register, force=True) + new_value = (old_value & (~config.mask)) | ((config.value << config.offset) & config.mask) + bus.write_byte_data(self.AMP_ADDRESS, config.register, new_value, force=True) + + if self.debug: + print(f" Changed {hex(config.register)}: {hex(old_value)} -> {hex(new_value)}") + + def set_configs(self, configs: list[AmpConfig]) -> bool: + tries = 15 + backoff = 0. + for i in range(tries): + try: + self._set_configs(configs) + return True + except OSError: + backoff += 0.1 + time.sleep(backoff) + print(f"Failed to set amp config, {tries - i - 1} retries left") + return False + + def set_global_shutdown(self, amp_disabled: bool) -> bool: + return self.set_configs([self._get_shutdown_config(amp_disabled), ]) + + def initialize_configuration(self, model: str) -> bool: + cfgs = [ + self._get_shutdown_config(True), + *BASE_CONFIG, + *CONFIGS[model], + self._get_shutdown_config(False), + ] + return self.set_configs(cfgs) + + +if __name__ == "__main__": + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + model = model.split('comma ')[-1] + + amp = Amplifier() + amp.initialize_configuration(model) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/esim_manager.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/esim_manager.py new file mode 100644 index 000000000..af08fd059 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/esim_manager.py @@ -0,0 +1,290 @@ +import threading +import subprocess +import time +from dataclasses import dataclass +from enum import Enum +from queue import Queue, Empty +from typing import Callable + +from iqpilot.common.params import Params +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.hardware.base import LPAError, LPAProfileNotFoundError, Profile + + +class EsimOperationState(Enum): + IDLE = "idle" + SCANNING = "scanning" + DOWNLOADING = "downloading" + SWITCHING = "switching" + RENAMING = "renaming" + DELETING = "deleting" + REBOOTING_MODEM = "rebooting modem" + COMPLETED = "completed" + FAILED = "failed" + + +@dataclass +class EsimUiState: + state: EsimOperationState = EsimOperationState.IDLE + message: str = "" + profiles: list[Profile] | None = None + busy: bool = False + + +class EsimManager: + def __init__(self): + self._params = Params() + self._lock = threading.Lock() + self._callbacks: list[Callable[[EsimUiState], None]] = [] + self._state = EsimUiState() + self._support_cache: bool | None = None + self._support_cache_ts = 0.0 + + self._ops: Queue[Callable[[], None]] = Queue() + self._worker = threading.Thread(target=self._worker_loop, daemon=True) + self._worker.start() + + def is_supported(self) -> bool: + raw_flag = self._params.get("EnableEsimProvisioning") + enabled = True if raw_flag is None else self._params.get_bool("EnableEsimProvisioning") + if not enabled: + return False + if HARDWARE.get_device_type() not in ("tici", "tizi", "mici"): + return False + return self._has_euicc() + + def _has_euicc(self, force_refresh: bool = False) -> bool: + now = time.monotonic() + if not force_refresh and self._support_cache is not None and now - self._support_cache_ts < 5.0: + return self._support_cache + + supported = self._query_euicc_support() + self._support_cache = supported + self._support_cache_ts = now + return supported + + @staticmethod + def _query_euicc_support() -> bool: + try: + res = subprocess.run( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-get-slot-status"], + capture_output=True, text=True, check=False, timeout=8, + ) + except Exception: + return False + + output = f"{res.stdout}\n{res.stderr}" + if "Is eUICC: yes" in output: + return True + if "Is eUICC: no" in output: + return False + return False + + def add_callback(self, cb: Callable[[EsimUiState], None]) -> None: + with self._lock: + self._callbacks.append(cb) + state = self._copy_state_locked() + cb(state) + + def remove_callback(self, cb: Callable[[EsimUiState], None]) -> None: + with self._lock: + self._callbacks = [c for c in self._callbacks if c is not cb] + + def get_state(self) -> EsimUiState: + with self._lock: + return self._copy_state_locked() + + def refresh_profiles(self) -> None: + if not self._is_supported_for_operation(): + self._set_profiles([]) + self._set_state(EsimOperationState.IDLE, self._unavailable_message(), busy=False) + return + self._enqueue(self._refresh_profiles) + + def is_comma_profile(self, iccid: str) -> bool: + try: + return HARDWARE.get_sim_lpa().is_comma_profile(iccid) + except Exception: + return False + + def add_profile(self, activation_code: str, nickname: str | None = None) -> None: + def _op() -> None: + self._set_state(EsimOperationState.DOWNLOADING, "Downloading profile...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.download_profile(activation_code, nickname=nickname) + self._set_state(EsimOperationState.REBOOTING_MODEM, "Reconnecting modem...", busy=True) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Profile added", busy=False) + self._enqueue(_op) + + def switch_profile(self, iccid: str) -> None: + def _op() -> None: + self._set_state(EsimOperationState.SWITCHING, "Switching profile...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.switch_profile(iccid) + self._set_state(EsimOperationState.REBOOTING_MODEM, "Reconnecting modem...", busy=True) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Profile switched", busy=False) + self._enqueue(_op) + + def rename_profile(self, iccid: str, nickname: str) -> None: + def _op() -> None: + self._set_state(EsimOperationState.RENAMING, "Renaming profile...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.nickname_profile(iccid, nickname) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Profile renamed", busy=False) + self._enqueue(_op) + + def delete_profile(self, iccid: str) -> None: + def _op() -> None: + self._set_state(EsimOperationState.DELETING, "Deleting profile...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.delete_profile(iccid) + self._set_state(EsimOperationState.REBOOTING_MODEM, "Reconnecting modem...", busy=True) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Profile deleted", busy=False) + self._enqueue(_op) + + def bootstrap(self) -> None: + def _op() -> None: + self._set_state(EsimOperationState.DELETING, "Removing Comma pSIM...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.bootstrap() + self._set_state(EsimOperationState.REBOOTING_MODEM, "Reconnecting modem...", busy=True) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Comma pSIM removed", busy=False) + self._enqueue(_op) + + def set_scanning_state(self, scanning: bool) -> None: + if scanning: + self._set_state(EsimOperationState.SCANNING, "Point camera at an eSIM QR code", busy=True) + else: + self._set_state(EsimOperationState.IDLE, "", busy=False) + + def _enqueue(self, fn: Callable[[], None]) -> None: + if not self._is_supported_for_operation(): + self._set_state(EsimOperationState.FAILED, self._unavailable_message(), busy=False) + return + self._ops.put(fn) + + def _is_supported_for_operation(self) -> bool: + raw_flag = self._params.get("EnableEsimProvisioning") + enabled = True if raw_flag is None else self._params.get_bool("EnableEsimProvisioning") + if not enabled: + return False + if HARDWARE.get_device_type() not in ("tici", "tizi", "mici"): + return False + return self._has_euicc(force_refresh=True) + + def _unavailable_message(self) -> str: + if HARDWARE.get_device_type() in ("tici", "tizi", "mici"): + return "Insert the original comma SIM card that came with the device to use eSIM" + return "eSIM provisioning is unavailable on this device" + + def _worker_loop(self) -> None: + while True: + try: + op = self._ops.get(timeout=0.2) + except Empty: + continue + try: + op() + except Exception as e: + self._set_state(EsimOperationState.FAILED, self._map_error(e), busy=False) + finally: + self._ops.task_done() + + def _refresh_profiles(self) -> None: + if not self._is_supported_for_operation(): + self._set_profiles([]) + return + profiles = HARDWARE.get_sim_lpa().list_profiles() + self._set_profiles(profiles) + + def _set_profiles(self, profiles: list[Profile]) -> None: + with self._lock: + self._state.profiles = profiles + state = self._copy_state_locked() + callbacks = list(self._callbacks) + for cb in callbacks: + cb(state) + + def _set_state(self, state: EsimOperationState, message: str, busy: bool) -> None: + with self._lock: + self._state.state = state + self._state.message = message + self._state.busy = busy + snapshot = self._copy_state_locked() + callbacks = list(self._callbacks) + for cb in callbacks: + cb(snapshot) + + def _copy_state_locked(self) -> EsimUiState: + profiles = list(self._state.profiles) if self._state.profiles is not None else None + return EsimUiState( + state=self._state.state, + message=self._state.message, + profiles=profiles, + busy=self._state.busy, + ) + + @staticmethod + def _map_error(error: Exception) -> str: + if isinstance(error, LPAProfileNotFoundError): + return "Profile not found" + if isinstance(error, LPAError): + message = str(error) + lower = message.lower() + if "is euicc: no" in lower or "reports no euicc support" in lower: + return "Insert the original comma SIM to enable eSIM provisioning on this device" + if "certificate verify failed" in lower or "ssl" in lower or "tls" in lower: + return "TLS validation failed while contacting SM-DP+" + if "system time is not set" in lower: + return "Device time is invalid; connect to network and retry" + if "returned no modems" in lower or "object does not exist at path" in lower: + return "Modem is restarting; wait a moment and refresh profiles" + if "timed out" in lower or "timeout" in lower: + return "Modem timed out while provisioning eSIM" + if "delete the existing comma psim profile" in lower: + return "Delete the Comma pSIM profile before activating RedPocket" + if "not bootstrapped" in lower: + return "Delete the Comma pSIM profile before using user eSIM profiles" + if "cannot delete active profile" in lower: + return "Cannot delete active profile" + if "profile delete may have succeeded" in lower: + return "Profile may already be deleted; refresh profiles" + if "profile delete did not finish cleanly" in lower: + return "Profile delete did not complete; refresh profiles and retry" + if "profile switch may have succeeded" in lower: + return "Profile likely switched; refresh profiles" + if "profile switch did not finish cleanly" in lower: + return "Profile switch did not complete; refresh profiles and retry" + if "profile add may have succeeded" in lower: + return "Profile may already be added; refresh profiles" + if "profile add did not finish cleanly" in lower: + return "Profile add did not complete; refresh profiles and retry" + if "profile enable may have succeeded" in lower: + return "Profile may already be enabled; refresh profiles" + if "profile enable did not finish cleanly" in lower: + return "Profile enable did not complete; refresh profiles and retry" + if "profile disable may have succeeded" in lower: + return "Profile may already be disabled; refresh profiles" + if "profile disable did not finish cleanly" in lower: + return "Profile disable did not complete; refresh profiles and retry" + if "bf2800" in lower or "listnotification" in lower: + return "Modem notification cleanup failed; refresh profiles" + return message + return str(error) + + +_ESIM_MANAGER: EsimManager | None = None +_ESIM_MANAGER_LOCK = threading.Lock() + + +def get_esim_manager() -> EsimManager: + global _ESIM_MANAGER + with _ESIM_MANAGER_LOCK: + if _ESIM_MANAGER is None: + _ESIM_MANAGER = EsimManager() + return _ESIM_MANAGER diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py new file mode 100644 index 000000000..b9fa7fbff --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py @@ -0,0 +1,740 @@ +import math +import os +import sys +import subprocess +import time +import tempfile +from enum import IntEnum +from functools import cached_property, lru_cache +from pathlib import Path + +from iqpilot.cereal import log +from iqpilot.common.utils import sudo_read, sudo_write +from iqpilot.common.gpio import gpio_set, gpio_init, get_irqs_for_action +from iqpilot.system.hardware.base import HardwareBase, LPABase, ThermalConfig, ThermalZone +from iqpilot.system.hardware.tici import iwlist +from iqpilot.system.hardware.tici.lpa import TiciLPA +from iqpilot.system.hardware.tici.pins import GPIO +from iqpilot.system.hardware.tici.amplifier import Amplifier + +NM = 'org.freedesktop.NetworkManager' +NM_CON_ACT = NM + '.Connection.Active' +NM_DEV = NM + '.Device' +NM_DEV_WL = NM + '.Device.Wireless' +NM_DEV_STATS = NM + '.Device.Statistics' +NM_AP = NM + '.AccessPoint' +DBUS_PROPS = 'org.freedesktop.DBus.Properties' + +MM = 'org.freedesktop.ModemManager1' +MM_MODEM = MM + ".Modem" +MM_MODEM_SIMPLE = MM + ".Modem.Simple" +MM_SIM = MM + ".Sim" + +class MM_MODEM_STATE(IntEnum): + FAILED = -1 + UNKNOWN = 0 + INITIALIZING = 1 + LOCKED = 2 + DISABLED = 3 + DISABLING = 4 + ENABLING = 5 + ENABLED = 6 + SEARCHING = 7 + REGISTERED = 8 + DISCONNECTING = 9 + CONNECTING = 10 + CONNECTED = 11 + +class NMActiveConnectionState(IntEnum): + UNKNOWN = 0 + ACTIVATING = 1 + ACTIVATED = 2 + DEACTIVATING = 3 + DEACTIVATED = 4 + +class NMMetered(IntEnum): + NM_METERED_UNKNOWN = 0 + NM_METERED_YES = 1 + NM_METERED_NO = 2 + NM_METERED_GUESS_YES = 3 + NM_METERED_GUESS_NO = 4 + +TIMEOUT = 0.1 +REFRESH_RATE_MS = 1000 + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +# https://developer.gnome.org/ModemManager/unstable/ModemManager-Flags-and-Enumerations.html#MMModemAccessTechnology +MM_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5 +MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14 + +# MMModemStateFailedReason +MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2 + + +def affine_irq(val, action): + irqs = get_irqs_for_action(action) + if len(irqs) == 0: + return + + for i in irqs: + sudo_write(str(val), f"/proc/irq/{i}/smp_affinity_list") + +@lru_cache +def get_device_type(): + # lru_cache and cache can cause memory leaks when used in classes + try: + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + except FileNotFoundError: + # off-device (e.g. the prebuilt build container fakes /TICI but has no + # devicetree); import must not crash. Not a real device type. + return "unknown" + return model.split('comma ')[-1] + +class Tici(HardwareBase): + @staticmethod + def _ensure_system_python_path() -> None: + system_site = "/usr/lib/python3/dist-packages" + if system_site not in sys.path and os.path.isdir(system_site): + sys.path.append(system_site) + + @staticmethod + def _run_direct_modem_command(command: str) -> None: + import serial + + last_error: Exception | None = None + for device in ("/dev/ttyUSB2", "/dev/ttyUSB3"): + if not os.path.exists(device): + continue + + try: + with serial.Serial(device, baudrate=9600, timeout=2) as modem: + modem.reset_input_buffer() + modem.write((command + "\r").encode("ascii")) + + deadline = time.monotonic() + 3.0 + while time.monotonic() < deadline: + line = modem.readline().decode(errors="ignore").strip() + if not line: + continue + if line == "OK": + return + if line == "ERROR" or "ERROR" in line: + raise RuntimeError(f"{device}: {line}") + raise TimeoutError(f"{device}: timed out waiting for modem response") + except Exception as e: + last_error = e + + if last_error is not None: + raise last_error + raise RuntimeError("No modem AT port available") + + @cached_property + def bus(self): + try: + import dbus + except ModuleNotFoundError: + self._ensure_system_python_path() + import dbus + return dbus.SystemBus() + + @cached_property + def nm(self): + return self.bus.get_object(NM, '/org/freedesktop/NetworkManager') + + @property # this should not be cached, in case the modemmanager restarts + def mm(self): + return self.bus.get_object(MM, '/org/freedesktop/ModemManager1') + + @cached_property + def amplifier(self): + if self.get_device_type() == "mici": + return None + if os.path.exists('/tmp/lite_hw') or os.environ.get('LITE') == '1': + return None + return Amplifier() + + def get_os_version(self): + with open("/VERSION") as f: + return f.read().strip() + + def get_device_type(self): + return get_device_type() + + def reboot(self, reason=None): + subprocess.check_output(["sudo", "reboot"]) + + def uninstall(self): + Path("/data/__system_reset__").touch() + os.sync() + self.reboot() + + def get_serial(self): + return self.get_cmdline()['androidboot.serialno'] + + def get_voltage(self): + with open("/sys/class/hwmon/hwmon1/in1_input") as f: + return int(f.read()) + + def get_current(self): + with open("/sys/class/hwmon/hwmon1/curr1_input") as f: + return int(f.read()) + + def set_ir_power(self, percent: int): + if self.get_device_type() in ("tici", "tizi"): + return + + value = int((percent / 100) * 300) + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write("0\n") + with open("/sys/class/leds/led:torch_2/brightness", "w") as f: + f.write(f"{value}\n") + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write(f"{value}\n") + + def get_network_type(self): + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_type = primary_connection.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if primary_type == '802-3-ethernet': + return NetworkType.ethernet + elif primary_type == '802-11-wireless': + return NetworkType.wifi + else: + active_connections = self.nm.Get(NM, 'ActiveConnections', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + for conn in active_connections: + c = self.bus.get_object(NM, conn) + tp = c.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if tp == 'gsm': + modem = self.get_modem() + modem_state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if modem_state < MM_MODEM_STATE.REGISTERED: + return NetworkType.none + access_t = modem.Get(MM_MODEM, 'AccessTechnologies', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if access_t >= MM_MODEM_ACCESS_TECHNOLOGY_LTE: + return NetworkType.cell4G + elif access_t >= MM_MODEM_ACCESS_TECHNOLOGY_UMTS: + return NetworkType.cell3G + else: + return NetworkType.cell2G + except Exception: + pass + + return NetworkType.none + + def get_modem(self): + objects = self.mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=TIMEOUT) + if not objects: + raise RuntimeError("ModemManager returned no modems") + modem_path = next(iter(objects)) + return self.bus.get_object(MM, modem_path) + + def get_wlan(self): + wlan_path = self.nm.GetDeviceByIpIface('wlan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wlan_path) + + def get_wwan(self): + wwan_path = self.nm.GetDeviceByIpIface('wwan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wwan_path) + + def get_sim_info(self): + modem = self.get_modem() + sim_path = modem.Get(MM_MODEM, 'Sim', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if sim_path == "/": + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + else: + sim = self.bus.get_object(MM, sim_path) + return { + 'sim_id': str(sim.Get(MM_SIM, 'SimIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'mcc_mnc': str(sim.Get(MM_SIM, 'OperatorIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'network_type': ["Unknown"], + 'sim_state': ["READY"], + 'data_connected': modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) == MM_MODEM_STATE.CONNECTED, + } + + def get_sim_lpa(self) -> LPABase: + return TiciLPA() + + def get_imei(self, slot): + if slot != 0: + return "" + + return str(self.get_modem().Get(MM_MODEM, 'EquipmentIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + + def get_network_info(self): + if self.get_device_type() == "mici": + return None + try: + modem = self.get_modem() + info = modem.Command("AT+QNWINFO", math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + extra = modem.Command('AT+QENG="servingcell"', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + if info and info.startswith('+QNWINFO: '): + info = info.replace('+QNWINFO: ', '').replace('"', '').split(',') + extra = "" if extra is None else extra.replace('+QENG: "servingcell",', '').replace('"', '') + state = "" if state is None else MM_MODEM_STATE(state).name + + if len(info) != 4: + return None + + technology, operator, band, channel = info + + return({ + 'technology': technology, + 'operator': operator, + 'band': band, + 'channel': int(channel), + 'extra': extra, + 'state': state, + }) + else: + return None + + def parse_strength(self, percentage): + if percentage < 25: + return NetworkStrength.poor + elif percentage < 50: + return NetworkStrength.moderate + elif percentage < 75: + return NetworkStrength.good + else: + return NetworkStrength.great + + def get_network_strength(self, network_type): + network_strength = NetworkStrength.unknown + + try: + if network_type == NetworkType.none: + pass + elif network_type == NetworkType.wifi: + wlan = self.get_wlan() + active_ap_path = wlan.Get(NM_DEV_WL, 'ActiveAccessPoint', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if active_ap_path != "/": + active_ap = self.bus.get_object(NM, active_ap_path) + strength = int(active_ap.Get(NM_AP, 'Strength', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + network_strength = self.parse_strength(strength) + else: # Cellular + modem = self.get_modem() + strength = int(modem.Get(MM_MODEM, 'SignalQuality', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)[0]) + network_strength = self.parse_strength(strength) + except Exception: + pass + + return network_strength + + def get_network_metered(self, network_type) -> bool: + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_devices = primary_connection.Get(NM_CON_ACT, 'Devices', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + for dev in primary_devices: + dev_obj = self.bus.get_object(NM, str(dev)) + metered_prop = dev_obj.Get(NM_DEV, 'Metered', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if network_type == NetworkType.wifi: + if metered_prop in [NMMetered.NM_METERED_YES, NMMetered.NM_METERED_GUESS_YES]: + return True + elif network_type in [NetworkType.cell2G, NetworkType.cell3G, NetworkType.cell4G, NetworkType.cell5G]: + if metered_prop == NMMetered.NM_METERED_NO: + return False + except Exception: + pass + + return super().get_network_metered(network_type) + + def get_modem_version(self): + try: + modem = self.get_modem() + return modem.Get(MM_MODEM, 'Revision', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + def get_modem_temperatures(self): + timeout = 0.2 # Default timeout is too short + try: + modem = self.get_modem() + temps = modem.Command("AT+QTEMP", math.ceil(timeout), dbus_interface=MM_MODEM, timeout=timeout) + return list(filter(lambda t: t != 255, map(int, temps.split(' ')[1].split(',')))) + except Exception: + return [] + + + def get_current_power_draw(self): + return (self.read_param_file("/sys/class/hwmon/hwmon1/power1_input", int) / 1e6) + + def get_som_power_draw(self): + return (self.read_param_file("/sys/class/power_supply/bms/voltage_now", int) * self.read_param_file("/sys/class/power_supply/bms/current_now", int) / 1e12) + + def shutdown(self): + os.system("sudo poweroff") + + def get_thermal_config(self): + intake, exhaust, case = None, None, None + if self.get_device_type() == "mici": + case = ThermalZone("case") + intake = ThermalZone("intake") + exhaust = ThermalZone("exhaust") + return ThermalConfig(cpu=[ThermalZone(f"cpu{i}-silver-usr") for i in range(4)] + + [ThermalZone(f"cpu{i}-gold-usr") for i in range(4)], + gpu=[ThermalZone("gpu0-usr"), ThermalZone("gpu1-usr")], + dsp=ThermalZone("compute-hvx-usr"), + memory=ThermalZone("ddr-usr"), + pmic=[ThermalZone("pm8998_tz"), ThermalZone("pm8005_tz")], + intake=intake, + exhaust=exhaust, + case=case) + + def set_display_power(self, on): + try: + with open("/sys/class/backlight/panel0-backlight/bl_power", "w") as f: + f.write("0" if on else "4") + except Exception: + pass + + def set_screen_brightness(self, percentage): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + val = int(percentage * (max_brightness / 100.)) + with open("/sys/class/backlight/panel0-backlight/brightness", "w") as f: + f.write(str(val)) + except Exception: + pass + + def get_screen_brightness(self): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + with open("/sys/class/backlight/panel0-backlight/brightness") as f: + return int(float(f.read()) / (max_brightness / 100.)) + except Exception: + return 0 + + def set_power_save(self, powersave_enabled): + # amplifier, 100mW at idle + if self.amplifier is not None: + self.amplifier.set_global_shutdown(amp_disabled=powersave_enabled) + if not powersave_enabled: + self.amplifier.initialize_configuration(self.get_device_type()) + + # *** CPU config *** + + # offline big cluster + for i in range(4, 8): + val = '0' if powersave_enabled else '1' + sudo_write(val, f'/sys/devices/system/cpu/cpu{i}/online') + + for n in ('0', '4'): + if powersave_enabled and n == '4': + continue + gov = 'ondemand' if powersave_enabled else 'performance' + sudo_write(gov, f'/sys/devices/system/cpu/cpufreq/policy{n}/scaling_governor') + + # *** IRQ config *** + + # GPU, modeld core + affine_irq(7, "kgsl-3d0") + + # camerad core + camera_irqs = ("a5", "cci", "cpas_camnoc", "cpas-cdm", "csid", "ife", "csid-lite", "ife-lite") + for n in camera_irqs: + affine_irq(6, n) + + def get_gpu_usage_percent(self): + try: + with open('/sys/class/kgsl/kgsl-3d0/gpubusy') as f: + used, total = f.read().strip().split() + return 100.0 * int(used) / int(total) + except Exception: + return 0 + + def initialize_hardware(self): + if self.amplifier is not None: + self.amplifier.initialize_configuration(self.get_device_type()) + + # Allow hardwared to write engagement status to kmsg + os.system("sudo chmod a+w /dev/kmsg") + + # Ensure fan gpio is enabled so fan runs until shutdown, also turned on at boot by the ABL + gpio_init(GPIO.SOM_ST_IO, True) + gpio_set(GPIO.SOM_ST_IO, 1) + + # *** IRQ config *** + + # mask off big cluster from default affinity + sudo_write("f", "/proc/irq/default_smp_affinity") + + # move these off the default core + affine_irq(1, "msm_vidc") # encoders + affine_irq(1, "i2c_geni") # sensors + + # *** GPU config *** + # https://github.com/commaai/agnos-kernel-sdm845/blob/master/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi#L216 + affine_irq(5, "fts_ts") # touch + affine_irq(5, "msm_drm") # display + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/min_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/max_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_bus_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_clk_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_rail_on") + sudo_write("1000", "/sys/class/kgsl/kgsl-3d0/idle_timer") + sudo_write("performance", "/sys/class/kgsl/kgsl-3d0/devfreq/governor") + sudo_write("710", "/sys/class/kgsl/kgsl-3d0/max_clock_mhz") + + # setup governors + sudo_write("performance", "/sys/class/devfreq/soc:qcom,cpubw/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu0/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu4/governor") + + # *** VIDC (encoder) config *** + sudo_write("N", "/sys/kernel/debug/msm_vidc/clock_scaling") + sudo_write("Y", "/sys/kernel/debug/msm_vidc/disable_thermal_mitigation") + + # pandad core + affine_irq(3, "spi_geni") # SPI + if "tici" in self.get_device_type(): + affine_irq(3, "xhci-hcd:usb3") + affine_irq(3, "xhci-hcd:usb1") + try: + pid = subprocess.check_output(["pgrep", "-f", "spi0"], encoding='utf8').strip() + subprocess.call(["sudo", "chrt", "-f", "-p", "1", pid]) + subprocess.call(["sudo", "taskset", "-pc", "3", pid], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessException as e: + print(str(e)) + + def configure_modem(self): + from iqpilot.common.params import Params + + sim_info = self.get_sim_info() + sim_id = sim_info.get('sim_id', '') + params = Params() + manual_apn = params.get("GsmApn", encoding="utf-8") or "" + metered_enabled = params.get_bool("GsmMetered") + + modem = self.get_modem() + try: + manufacturer = str(modem.Get(MM_MODEM, 'Manufacturer', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + except Exception: + manufacturer = None + + cmds = [] + is_comma_profile = self.get_sim_lpa().is_comma_profile(sim_id) + roaming_enabled = params.get_bool("GsmRoaming") + initial_eps_apn = "" if is_comma_profile else manual_apn + + if not is_comma_profile and params.get("GsmRoaming") is None: + params.put_bool("GsmRoaming", True) + roaming_enabled = True + + subprocess.call([ + "nmcli", "connection", "modify", "lte", + "gsm.auto-config", "no" if manual_apn else "yes", + "gsm.apn", manual_apn, + "gsm.home-only", "no" if roaming_enabled else "yes", + "gsm.network-id", "", + "gsm.initial-eps-bearer-configure", "yes" if initial_eps_apn else "no", + "gsm.initial-eps-bearer-apn", initial_eps_apn, + "connection.metered", "unknown" if metered_enabled else "no", + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + if self.get_device_type() in ("tici", "tizi"): + if initial_eps_apn: + subprocess.call(["mmcli", "-m", "any", f'--3gpp-set-initial-eps-bearer-settings=apn={initial_eps_apn}']) + else: + subprocess.call(["mmcli", "-m", "any", '--3gpp-set-initial-eps-bearer-settings=apn=']) + + cmds += [ + # configure modem as data-centric + 'AT+QNVW=5280,0,"0102000000000000"', + 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', + 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', + ] + if self.get_device_type() == "tizi": + cmds += [ + 'AT+QSIMDET=1,0', + 'AT+QSIMSTAT=1', + ] + elif manufacturer == 'Cavli Inc.': + cmds += [ + 'AT^SIMSWAP=1', # use SIM slot, instead of internal eSIM + 'AT$QCSIMSLEEP=0', # disable SIM sleep + 'AT$QCSIMCFG=SimPowerSave,0', # more sleep disable + + # ethernet config + 'AT$QCPCFG=usbNet,0', + 'AT$QCNETDEVCTL=3,1', + ] + else: + # this modem gets upset with too many AT commands + if sim_id is None or len(sim_id) == 0: + cmds += [ + # SIM sleep disable + 'AT$QCSIMSLEEP=0', + 'AT$QCSIMCFG=SimPowerSave,0', + + # ethernet config + 'AT$QCPCFG=usbNet,1', + ] + + for cmd in cmds: + try: + modem.Command(cmd, math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + + # eSIM prime + dest = "/etc/NetworkManager/system-connections/esim.nmconnection" + if self.get_sim_lpa().is_comma_profile(sim_id) and not os.path.exists(dest): + with open(Path(__file__).parent/'esim.nmconnection') as f, tempfile.NamedTemporaryFile(mode='w') as tf: + dat = f.read() + dat = dat.replace("sim-id=", f"sim-id={sim_id}") + tf.write(dat) + tf.flush() + + # needs to be root + os.system(f"sudo cp {tf.name} {dest}") + os.system(f"sudo nmcli con load {dest}") + + def recover_sim_detection(self) -> bool: + # A worn SIM-tray presence switch can read "removed" while the SIM pads still make + # contact; with hot-swap detect armed (AT+QSIMDET=1) the modem never powers the SIM + # and lands in failed/sim-missing. Disabling detect and rebooting the modem makes it + # probe the SIM electrically. Safe to retry on failure: firing disarms the QSIMDET + # gate, so a genuinely SIM-less device gets at most one extra modem reboot per boot. + if self.get_device_type() not in ("tici", "tizi"): + return False + + try: + modem = self.get_modem() + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if state != MM_MODEM_STATE.FAILED: + return False + reason = modem.Get(MM_MODEM, 'StateFailedReason', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if reason != MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: + return False + detect = str(modem.Command('AT+QSIMDET?', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT)).strip() + if not detect.startswith('+QSIMDET: 1'): + return False + modem.Command('AT+QSIMDET=0,0', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + modem.Command('AT+CFUN=1,1', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + return True + except Exception: + return False + + def reboot_modem(self): + modem = None + try: + modem = self.get_modem() + except Exception: + pass + + if modem is not None: + for state in (0, 1): + try: + modem.Command(f'AT+CFUN={state}', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + return + + for state in (0, 1): + try: + self._run_direct_modem_command(f"AT+CFUN={state}") + except Exception: + pass + + def get_networks(self): + r = {} + + wlan = iwlist.scan() + if wlan is not None: + r['wlan'] = wlan + + lte_info = self.get_network_info() + if lte_info is not None: + extra = lte_info['extra'] + + # ,"LTE",,,,,,,, + # ,,,,,,, + if 'LTE' in extra: + extra = extra.split(',') + try: + r['lte'] = [{ + "mcc": int(extra[3]), + "mnc": int(extra[4]), + "cid": int(extra[5], 16), + "nmr": [{"pci": int(extra[6]), "earfcn": int(extra[7])}], + }] + except (ValueError, IndexError): + pass + + return r + + def get_modem_data_usage(self): + try: + wwan = self.get_wwan() + + # Ensure refresh rate is set so values don't go stale + refresh_rate = wwan.Get(NM_DEV_STATS, 'RefreshRateMs', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if refresh_rate != REFRESH_RATE_MS: + u = type(refresh_rate) + wwan.Set(NM_DEV_STATS, 'RefreshRateMs', u(REFRESH_RATE_MS), dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + tx = wwan.Get(NM_DEV_STATS, 'TxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + rx = wwan.Get(NM_DEV_STATS, 'RxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + return int(tx), int(rx) + except Exception: + return -1, -1 + + def has_internal_panda(self): + return True + + def reset_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 0) + time.sleep(1) + gpio_set(GPIO.STM_RST_N, 0) + + def recover_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 1) + time.sleep(0.5) + gpio_set(GPIO.STM_RST_N, 0) + time.sleep(0.5) + gpio_set(GPIO.STM_BOOT0, 0) + + def booted(self): + # this normally boots within 8s, but on rare occasions takes 30+s + encoder_state = sudo_read("/sys/kernel/debug/msm_vidc/core0/info") + if "Core state: 0" in encoder_state and (time.monotonic() < 60*2): + return False + return True + +if __name__ == "__main__": + t = Tici() + t.configure_modem() + t.initialize_hardware() + t.set_power_save(False) + print(t.get_sim_info()) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py new file mode 100644 index 000000000..1e7c428b4 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py @@ -0,0 +1,35 @@ +import subprocess + + +def scan(interface="wlan0"): + result = [] + try: + r = subprocess.check_output(["iwlist", interface, "scan"], encoding='utf8') + + mac = None + for line in r.split('\n'): + if "Address" in line: + # Based on the adapter eithere a percentage or dBm is returned + # Add previous network in case no dBm signal level was seen + if mac is not None: + result.append({"mac": mac}) + mac = None + + mac = line.split(' ')[-1] + elif "dBm" in line: + try: + level = line.split('Signal level=')[1] + rss = int(level.split(' ')[0]) + result.append({"mac": mac, "rss": rss}) + mac = None + except ValueError: + continue + + # Add last network if no dBm was found + if mac is not None: + result.append({"mac": mac}) + + return result + + except Exception: + return None diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py new file mode 100644 index 000000000..a636742d5 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py @@ -0,0 +1,1482 @@ +#!/usr/bin/env python3 +# SGP.22 v2.3: https://www.gsma.com/solutions-and-impact/technologies/esim/wp-content/uploads/2021/07/SGP.22-v2.3.pdf + +import argparse +import atexit +import base64 +import hashlib +import json +import math +import os +import re +import requests +import serial +import subprocess +import sys +import time + +from collections.abc import Generator +from contextlib import contextmanager +from pathlib import Path +from typing import Literal +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.system.hardware.base import LPABase, LPAError, LPAProfileNotFoundError, Profile + +GSMA_CI_BUNDLE = str(Path(__file__).parent / 'gsma_ci_bundle.pem') + + +DEFAULT_DEVICE = "/dev/modem_at0" +DEFAULT_BAUD = 9600 +DEFAULT_TIMEOUT = 5.0 +# https://euicc-manual.osmocom.org/docs/lpa/applet-id/ +ISDR_AID = "A0000005591010FFFFFFFF8900000100" +ES10X_MSS = 120 +MM = "org.freedesktop.ModemManager1" +MM_MODEM = MM + ".Modem" + +# TLV Tags +TAG_ICCID = 0x5A +TAG_STATUS = 0x80 +TAG_EUICC_INFO = 0xBF20 +TAG_PREPARE_DOWNLOAD = 0xBF21 +TAG_PROFILE_INFO_LIST = 0xBF2D +TAG_EUICC_CHALLENGE = 0xBF2E +TAG_SET_NICKNAME = 0xBF29 +TAG_LIST_NOTIFICATION = 0xBF28 +TAG_RETRIEVE_NOTIFICATION = 0xBF2B +TAG_NOTIFICATION_METADATA = 0xBF2F +TAG_NOTIFICATION_SENT = 0xBF30 +TAG_ENABLE_PROFILE = 0xBF31 +TAG_DISABLE_PROFILE = 0xBF32 +TAG_DELETE_PROFILE = 0xBF33 +TAG_BPP = 0xBF36 +TAG_PROFILE_INSTALL_RESULT = 0xBF37 +TAG_AUTH_SERVER = 0xBF38 +TAG_CANCEL_SESSION = 0xBF41 + +STATE_LABELS = {0: "disabled", 1: "enabled", 255: "unknown"} +ICON_LABELS = {0: "jpeg", 1: "png", 255: "unknown"} +CLASS_LABELS = {0: "test", 1: "provisioning", 2: "operational", 255: "unknown"} +PROFILE_ERROR_CODES = { + 0x01: "iccidOrAidNotFound", 0x02: "profileNotInDisabledState", + 0x03: "disallowedByPolicy", 0x04: "wrongProfileReenabling", + 0x05: "catBusy", 0x06: "undefinedError", +} +AUTH_SERVER_ERROR_CODES = { + 0x01: "eUICCVerificationFailed", 0x02: "eUICCCertificateExpired", + 0x03: "eUICCCertificateRevoked", 0x05: "invalidServerSignature", + 0x06: "euiccCiPKUnknown", 0x0A: "matchingIdRefused", + 0x10: "insufficientMemory", +} +BPP_COMMAND_NAMES = { + 0: "initialiseSecureChannel", 1: "configureISDP", 2: "storeMetadata", + 3: "storeMetadata2", 4: "replaceSessionKeys", 5: "loadProfileElements", +} +BPP_ERROR_REASONS = { + 1: "incorrectInputValues", 2: "invalidSignature", 3: "invalidTransactionId", + 4: "unsupportedCrtValues", 5: "unsupportedRemoteOperationType", + 6: "unsupportedProfileClass", 7: "scp03tStructureError", 8: "scp03tSecurityError", + 9: "iccidAlreadyExistsOnEuicc", 10: "insufficientMemoryForProfile", + 11: "installInterrupted", 12: "peProcessingError", 13: "dataMismatch", + 14: "invalidNAA", +} +CANCEL_SESSION_REASON = { + 0: "endUserRejection", 1: "postponed", 2: "timeout", + 3: "pprNotAllowed", 127: "undefinedReason", +} + +ESIM_TLS_BUNDLE_ENV = "IQPILOT_ESIM_CA_BUNDLE" +ESIM_QESIM_INIT_ENV = "IQPILOT_ESIM_QESIM_INIT" +ESIM_EXCLUSIVE_MODEM_ENV = "IQPILOT_ESIM_EXCLUSIVE_MODEM" + + +def _ensure_dbus_import(): + try: + import dbus # noqa: F401 + return + except ModuleNotFoundError: + dist_packages = "/usr/lib/python3/dist-packages" + if dist_packages not in sys.path and os.path.isdir(dist_packages): + sys.path.append(dist_packages) + import dbus # noqa: F401 + + +def _tls_verify_option() -> bool | str: + # Default to the GSMA CI bundle used by the reference eSIM branch. + # Allow explicit override for local testing or forced system trust behavior. + override = os.getenv(ESIM_TLS_BUNDLE_ENV, "").strip() + if not override: + return GSMA_CI_BUNDLE + if override.lower() in ("0", "false", "off"): + return False + if override.lower() in ("1", "true", "on", "system"): + return True + return override + + +def b64e(data: bytes) -> str: + return base64.b64encode(data).decode("ascii") + + +def b64d(s: str) -> bytes: + return base64.b64decode(base64_trim(s)) + + +def _decode_apdu_response_blob(raw: str, label: str) -> bytes: + filtered = re.sub(r"[^0-9A-Fa-f]", "", raw) + if len(filtered) < 2 or len(filtered) % 2: + raise RuntimeError(f"Malformed {label} response payload") + return bytes.fromhex(filtered) + + +class AtClient: + def __init__(self, device: str, baud: int, timeout: float, verbose: bool) -> None: + self._device = device + self._baud = baud + self._timeout = timeout + self.verbose = verbose + self.channel: str | None = None + self._serial: serial.Serial | None = None + self._use_csim = False + self._has_qesim = False + self._qesim_lpa_enabled = False + try: + self._serial = serial.Serial(device, baudrate=baud, timeout=timeout) + self._disable_echo() + except (serial.SerialException, PermissionError, OSError): + self._serial = None + if self.verbose: + print(f"!! using ModemManager DBus AT transport for {device}", file=sys.stderr) + + def close(self) -> None: + try: + if self.channel: + try: + self.query(f"AT+CCHC={self.channel}") + except Exception as e: + if self.verbose: + print(f"!! ignoring channel close failure: {e}", file=sys.stderr) + finally: + self.channel = None + finally: + if self._serial is not None: + self._serial.close() + + @staticmethod + def _is_busy_open_error(error: Exception) -> bool: + text = str(error).lower() + return "errno 16" in text or "device or resource busy" in text + + def _disable_echo(self) -> None: + if self._serial is None: + return + self._serial.reset_input_buffer() + self._serial.write(b"ATE0\r") + time.sleep(0.1) + self._serial.reset_input_buffer() + + def _send(self, cmd: str) -> None: + if self.verbose: + print(f">> {cmd}", file=sys.stderr) + assert self._serial is not None + self._serial.write((cmd + "\r").encode("ascii")) + + def _expect(self) -> list[str]: + lines: list[str] = [] + while True: + assert self._serial is not None + raw = self._serial.readline() + if not raw: + raise TimeoutError("AT command timed out") + line = raw.decode(errors="ignore").strip() + if not line: + continue + if self.verbose: + print(f"<< {line}", file=sys.stderr) + if line == "OK": + return lines + if line == "ERROR": + raise RuntimeError("AT command failed") + if "ERROR" in line and line.startswith("+"): + # Catch +CME ERROR / +CMS ERROR and similar modem-specific failures. + raise RuntimeError(f"AT command failed: {line}") + lines.append(line) + + def _get_modem(self): + _ensure_dbus_import() + import dbus + + bus = dbus.SystemBus() + mm = bus.get_object(MM, '/org/freedesktop/ModemManager1') + objects = mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=self._timeout) + modem_paths = [path for path in objects.keys() if "/Modem/" in str(path)] + if not modem_paths: + raise RuntimeError("ModemManager returned no modems") + return bus.get_object(MM, modem_paths[0]) + + def _dbus_query(self, cmd: str) -> list[str]: + if self.verbose: + print(f"DBUS >> {cmd}", file=sys.stderr) + try: + result = str(self._get_modem().Command(cmd, math.ceil(self._timeout), dbus_interface=MM_MODEM, timeout=self._timeout)) + except Exception as e: + raise RuntimeError(f"AT command failed: {e}") from e + lines = [line.strip() for line in result.splitlines() if line.strip()] + if self.verbose: + for line in lines: + print(f"DBUS << {line}", file=sys.stderr) + return lines + + def _reconnect_serial(self) -> None: + self.channel = None + try: + if self._serial is not None: + self._serial.close() + except Exception: + pass + self._serial = serial.Serial(self._device, baudrate=self._baud, timeout=self._timeout) + self._disable_echo() + + def query(self, cmd: str) -> list[str]: + if self._serial is None: + return self._dbus_query(cmd) + try: + self._send(cmd) + return self._expect() + except (OSError, serial.SerialException) as e: + try: + self._reconnect_serial() + self._send(cmd) + return self._expect() + except Exception: + raise RuntimeError(f"AT transport error ({cmd}): {e}") from e + except TimeoutError as e: + raise TimeoutError(f"AT command timed out ({cmd})") from e + except RuntimeError as e: + raise RuntimeError(f"AT command failed ({cmd}): {e}") from e + + def _supports_qesim(self) -> bool: + try: + lines = self.query("AT+QESIM=?") + except Exception: + return False + return any(line.startswith("+QESIM:") for line in lines) + + def _set_quectel_lpa_mode(self) -> None: + self._has_qesim = self._supports_qesim() + self._qesim_lpa_enabled = False + if not self._has_qesim: + return + + # Some Quectel firmwares require enabling internal LPA mode before + # ISO7816 channel open commands (CCHO/CGLA) will succeed. + lpa_enable_cmds = ( + 'AT+QESIM="lpa_enable",1', + 'AT+QESIM="lpa_enable"', + ) + for cmd in lpa_enable_cmds: + try: + self.query(cmd) + self._qesim_lpa_enabled = True + break + except Exception: + continue + + # Keep BIP auth enabled when supported; this is needed by some firmware + # revisions for profile download/auth paths. + try: + lines = self.query('AT+QCFG="bip/auth"?') + needs_enable = any('"bip/auth",0' in line for line in lines) + if needs_enable: + self.query('AT+QCFG="bip/auth",1') + except Exception: + pass + + def ensure_capabilities(self) -> None: + if self._serial is None: + return + + # Some modem firmwares reject command test forms (e.g. AT+CCHO=?) + # while still supporting real execution. Keep these probes non-fatal. + self.query("AT") + # Keep IQ-specific QESIM initialization opt-in for debugging only. + # Default behavior should match upstream greatgitsby/esim transport flow. + if os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + try: + self.query("AT+CMEE=2") + except Exception: + pass + self._set_quectel_lpa_mode() + for command in ("AT+CCHO", "AT+CCHC", "AT+CGLA", "AT+CSIM"): + try: + self.query(f"{command}=?") + except Exception as e: + if self.verbose: + print(f"!! capability probe failed for {command}: {e}", file=sys.stderr) + + def open_isdr(self) -> None: + try: + self.query(f'AT+CCHC=1') + except Exception: + pass + ccho_candidates = [ + f'AT+CCHO="{ISDR_AID}"', + f"AT+CCHO={ISDR_AID}", + ] + for cmd in ccho_candidates: + try: + lines = self.query(cmd) + except Exception: + continue + for line in lines: + if line.startswith("+CCHO:") and (ch := line.split(":", 1)[1].strip()): + self.channel = ch + return + + # Fallback for modems that reject CCHO but allow APDUs over basic channel. + self.channel = "0" + aid_len = len(ISDR_AID) // 2 + select_isdr = bytes.fromhex(f"00A40400{aid_len:02X}{ISDR_AID}") + try: + _, sw1, sw2 = self.send_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + return + raise RuntimeError(f"ISD-R SELECT failed on basic channel SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + # Final fallback for modems that only support APDU via CSIM. + try: + _, sw1, sw2 = self._send_csim_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + self._use_csim = True + self.channel = "csim" + if self.verbose: + print("!! using CSIM APDU transport fallback", file=sys.stderr) + return + raise RuntimeError(f"ISD-R SELECT failed on CSIM SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + if self._has_qesim and not self._qesim_lpa_enabled and os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + raise RuntimeError( + "Modem exposes AT+QESIM but rejects LPA enable and ISD-R access; " + "this firmware/SKU likely does not provide usable eSIM functionality" + ) + raise RuntimeError("Failed to access eUICC ISD-R (CCHO/CGLA/CSIM all failed)") + + def send_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + for attempt in range(3): + try: + if not self.channel: + self.open_isdr() + if self._use_csim: + return self._send_csim_apdu(apdu) + hex_payload = apdu.hex().upper() + cmd = f'AT+CGLA={self.channel},{len(hex_payload)},"{hex_payload}"' + for query_attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CGLA:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CGLA") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if query_attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CGLA response") + except RuntimeError: + self.channel = None + self._use_csim = False + if attempt == 2: + raise + time.sleep(1 + attempt) + raise RuntimeError("send_apdu failed") + + def _send_csim_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + hex_payload = apdu.hex().upper() + cmd = f'AT+CSIM={len(hex_payload)},"{hex_payload}"' + for attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CSIM:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CSIM") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CSIM response") + + +# --- TLV utilities --- + +def iter_tlv(data: bytes, with_positions: bool = False) -> Generator: + idx, length = 0, len(data) + while idx < length: + start_pos = idx + tag = data[idx] + idx += 1 + if tag & 0x1F == 0x1F: # Multi-byte tag + tag_value = tag + while idx < length: + next_byte = data[idx] + idx += 1 + tag_value = (tag_value << 8) | next_byte + if not (next_byte & 0x80): + break + else: + tag_value = tag + if idx >= length: + break + size = data[idx] + idx += 1 + if size & 0x80: # Multi-byte length + num_bytes = size & 0x7F + if idx + num_bytes > length: + break + size = int.from_bytes(data[idx : idx + num_bytes], "big") + idx += num_bytes + if idx + size > length: + break + value = data[idx : idx + size] + idx += size + yield (tag_value, value, start_pos, idx) if with_positions else (tag_value, value) + + +def find_tag(data: bytes, target: int) -> bytes | None: + return next((v for t, v in iter_tlv(data) if t == target), None) + + +def encode_tlv(tag: int, value: bytes) -> bytes: + tag_bytes = bytes([(tag >> 8) & 0xFF, tag & 0xFF]) if tag > 255 else bytes([tag]) + vlen = len(value) + if vlen <= 127: + return tag_bytes + bytes([vlen]) + value + length_bytes = vlen.to_bytes((vlen.bit_length() + 7) // 8, "big") + return tag_bytes + bytes([0x80 | len(length_bytes)]) + length_bytes + value + + +def tbcd_to_string(raw: bytes) -> str: + return "".join(str(n) for b in raw for n in (b & 0x0F, b >> 4) if n <= 9) + + +def string_to_tbcd(s: str) -> bytes: + digits = [int(c) for c in s if c.isdigit()] + return bytes(digits[i] | ((digits[i + 1] if i + 1 < len(digits) else 0xF) << 4) for i in range(0, len(digits), 2)) + + +def base64_trim(s: str) -> str: + return "".join(c for c in s if c not in "\n\r \t") + + +# --- Shared helpers --- + +def _int_bytes(n: int) -> bytes: + """Encode a positive integer as minimal big-endian bytes (at least 1 byte).""" + return n.to_bytes((n.bit_length() + 7) // 8 or 1, "big") + + +def _extract_status(response: bytes, tag: int, name: str) -> int: + """Extract the status byte from a tagged ES10x response.""" + root = find_tag(response, tag) + if root is None: + raise RuntimeError(f"Missing {name}Response") + status = find_tag(root, TAG_STATUS) + if status is None: + raise RuntimeError(f"Missing status in {name}Response") + return status[0] + + +# Profile field decoders: TLV tag -> (field_name, decoder) +_PROFILE_FIELDS = { + TAG_ICCID: ("iccid", tbcd_to_string), + 0x4F: ("isdpAid", lambda v: v.hex().upper()), + 0x9F70: ("profileState", lambda v: STATE_LABELS.get(v[0], "unknown")), + 0x90: ("profileNickname", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x91: ("serviceProviderName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x92: ("profileName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x93: ("iconType", lambda v: ICON_LABELS.get(v[0], "unknown")), + 0x94: ("icon", b64e), + 0x95: ("profileClass", lambda v: CLASS_LABELS.get(v[0], "unknown")), +} + + +def _decode_profile_fields(data: bytes) -> dict: + """Parse known profile metadata TLV fields into a dict.""" + result = {} + for tag, value in iter_tlv(data): + if (field := _PROFILE_FIELDS.get(tag)): + result[field[0]] = field[1](value) + return result + + +# Notification field decoders: TLV tag -> (field_name, decoder) +_NOTIF_FIELDS = { + TAG_STATUS: ("seqNumber", lambda v: int.from_bytes(v, "big")), + 0x81: ("profileManagementOperation", lambda v: next((m for m in [0x80, 0x40, 0x20, 0x10] if len(v) >= 2 and v[1] & m), 0xFF)), + 0x0C: ("notificationAddress", lambda v: v.decode("utf-8", errors="ignore")), + TAG_ICCID: ("iccid", tbcd_to_string), +} + + +# --- ES10x command transport --- + +def es10x_command(client: AtClient, data: bytes) -> bytes: + response = bytearray() + sequence = 0 + offset = 0 + while offset < len(data): + chunk = data[offset : offset + ES10X_MSS] + offset += len(chunk) + is_last = offset == len(data) + apdu = bytes([0x80, 0xE2, 0x91 if is_last else 0x11, sequence & 0xFF, len(chunk)]) + chunk + segment, sw1, sw2 = client.send_apdu(apdu) + response.extend(segment) + while True: + if sw1 == 0x61: # More data available + segment, sw1, sw2 = client.send_apdu(bytes([0x80, 0xC0, 0x00, 0x00, sw2 or 0])) + response.extend(segment) + continue + if (sw1 & 0xF0) == 0x90: + break + raise RuntimeError(f"APDU failed with SW={sw1:02X}{sw2:02X}") + sequence += 1 + return bytes(response) + + +# --- ES9P HTTP --- + +def es9p_request(smdp_address: str, endpoint: str, payload: dict, error_prefix: str = "Request") -> dict: + if not system_time_valid(): + raise RuntimeError("System time is not set; TLS certificate validation requires a valid clock") + url = f"https://{smdp_address}/gsma/rsp2/es9plus/{endpoint}" + headers = {"User-Agent": "gsma-rsp-lpad", "X-Admin-Protocol": "gsma/rsp/v2.3.0", "Content-Type": "application/json"} + resp = requests.post(url, json=payload, headers=headers, timeout=30, verify=_tls_verify_option()) + resp.raise_for_status() + if not resp.content: + return {} + data = resp.json() + if "header" in data and "functionExecutionStatus" in data["header"]: + status = data["header"]["functionExecutionStatus"] + if status.get("status") == "Failed": + sd = status.get("statusCodeData", {}) + raise RuntimeError(f"{error_prefix} failed: {sd.get('reasonCode', 'unknown')}/{sd.get('subjectCode', 'unknown')} - {sd.get('message', 'unknown')}") + return data + + +# --- Profile operations --- + +def decode_profiles(blob: bytes) -> list[dict]: + root = find_tag(blob, TAG_PROFILE_INFO_LIST) + if root is None: + raise RuntimeError("Missing ProfileInfoList") + list_ok = find_tag(root, 0xA0) + if list_ok is None: + return [] + defaults = {name: None for name, _ in _PROFILE_FIELDS.values()} + return [{**defaults, **_decode_profile_fields(value)} for tag, value in iter_tlv(list_ok) if tag == 0xE3] + + +def list_profiles(client: AtClient) -> list[dict]: + return decode_profiles(es10x_command(client, bytes.fromhex("BF2D00"))) + + +def _profile_op(client: AtClient, tag: int, iccid: str, refresh: bool, action: str) -> None: + inner = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + if tag != TAG_DELETE_PROFILE: + if not refresh: + inner += encode_tlv(0x81, b'\x00') + inner = encode_tlv(0xA0, inner) + code = _extract_status(es10x_command(client, encode_tlv(tag, inner)), tag, f"{action.capitalize()}Profile") + if code == 0x00: + return + if code == 0x02 and tag != TAG_DELETE_PROFILE: + print(f"profile {iccid} already {action}d") + return + raise RuntimeError(f"{action.capitalize()}Profile failed: {PROFILE_ERROR_CODES.get(code, 'unknown')} (0x{code:02X})") + + +def enable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_ENABLE_PROFILE, iccid, refresh, "enable") + + +def disable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_DISABLE_PROFILE, iccid, refresh, "disable") + + +def delete_profile(client: AtClient, iccid: str) -> None: + _profile_op(client, TAG_DELETE_PROFILE, iccid, True, "delete") + + +def set_profile_nickname(client: AtClient, iccid: str, nickname: str) -> None: + nickname_bytes = nickname.encode("utf-8") + if len(nickname_bytes) > 64: + raise ValueError("Profile nickname must be 64 bytes or less") + content = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + encode_tlv(0x90, nickname_bytes) + code = _extract_status(es10x_command(client, encode_tlv(TAG_SET_NICKNAME, content)), TAG_SET_NICKNAME, "SetNickname") + if code == 0x01: + raise RuntimeError(f"profile {iccid} not found") + if code != 0x00: + raise RuntimeError(f"SetNickname failed with status 0x{code:02X}") + + +# --- Notifications --- + +def list_notifications(client: AtClient) -> list[dict]: + response = es10x_command(client, encode_tlv(TAG_LIST_NOTIFICATION, b"")) + root = find_tag(response, TAG_LIST_NOTIFICATION) + if root is None: + raise RuntimeError("Missing ListNotificationResponse") + metadata_list = find_tag(root, 0xA0) + if metadata_list is None: + return [] + notifications: list[dict] = [] + for tag, value in iter_tlv(metadata_list): + if tag != TAG_NOTIFICATION_METADATA: + continue + notification = {"seqNumber": None, "profileManagementOperation": None, "notificationAddress": None, "iccid": None} + for t, v in iter_tlv(value): + if (field := _NOTIF_FIELDS.get(t)): + notification[field[0]] = field[1](v) + if notification["seqNumber"] is not None and notification["profileManagementOperation"] is not None and notification["notificationAddress"]: + notifications.append(notification) + return notifications + + +def retrieve_notification(client: AtClient, seq_number: int) -> dict: + request = encode_tlv(TAG_RETRIEVE_NOTIFICATION, encode_tlv(0xA0, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + response = es10x_command(client, request) + root = find_tag(response, TAG_RETRIEVE_NOTIFICATION) + if root is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + a0_content = find_tag(root, 0xA0) + if a0_content is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + pending_notif, pending_tag = None, None + for tag, value in iter_tlv(a0_content): + if tag in (TAG_PROFILE_INSTALL_RESULT, 0x30): + pending_notif, pending_tag = value, tag + break + if pending_notif is None: + raise RuntimeError("Missing PendingNotification") + if pending_tag == TAG_PROFILE_INSTALL_RESULT: + result_data = find_tag(pending_notif, 0xBF27) + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) if result_data else None + else: + notif_meta = find_tag(pending_notif, TAG_NOTIFICATION_METADATA) + if notif_meta is None: + raise RuntimeError("Missing NotificationMetadata") + addr = find_tag(notif_meta, 0x0C) + if addr is None: + raise RuntimeError("Missing notificationAddress") + return {"notificationAddress": addr.decode("utf-8", errors="ignore"), "b64_PendingNotification": b64e(pending_notif)} + + +def remove_notification(client: AtClient, seq_number: int) -> None: + response = es10x_command(client, encode_tlv(TAG_NOTIFICATION_SENT, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + root = find_tag(response, TAG_NOTIFICATION_SENT) + if root is None: + raise RuntimeError("Invalid NotificationSentResponse") + status = find_tag(root, TAG_STATUS) + if status is None or int.from_bytes(status, "big") != 0: + raise RuntimeError("RemoveNotificationFromList failed") + + +def process_notifications(client: AtClient) -> None: + for notification in list_notifications(client): + seq_number, smdp_address = notification["seqNumber"], notification["notificationAddress"] + if not seq_number or not smdp_address: + continue + try: + notif_data = retrieve_notification(client, seq_number) + es9p_request(smdp_address, "handleNotification", {"pendingNotification": notif_data["b64_PendingNotification"]}, "HandleNotification") + remove_notification(client, seq_number) + except Exception: + pass + + +# --- Authentication & Download --- + +def get_challenge_and_info(client: AtClient) -> tuple[bytes, bytes]: + challenge_resp = es10x_command(client, encode_tlv(TAG_EUICC_CHALLENGE, b"")) + root = find_tag(challenge_resp, TAG_EUICC_CHALLENGE) + if root is None: + raise RuntimeError("Missing GetEuiccDataResponse") + challenge = find_tag(root, TAG_STATUS) + if challenge is None: + raise RuntimeError("Missing challenge in response") + info_resp = es10x_command(client, encode_tlv(TAG_EUICC_INFO, b"")) + if not info_resp.startswith(bytes([0xBF, 0x20])): + raise RuntimeError("Missing GetEuiccInfo1Response") + return challenge, info_resp + + +def authenticate_server(client: AtClient, b64_signed1: str, b64_sig1: str, b64_pk_id: str, b64_cert: str, matching_id: str | None = None) -> str: + # Build request + tac = bytes([0x35, 0x29, 0x06, 0x11]) + device_info = encode_tlv(TAG_STATUS, tac) + encode_tlv(0xA1, b"") + ctx_inner = b"" + if matching_id: + ctx_inner += encode_tlv(TAG_STATUS, matching_id.encode("utf-8")) + ctx_inner += encode_tlv(0xA1, device_info) + content = base64.b64decode(b64_signed1) + base64.b64decode(b64_sig1) + base64.b64decode(b64_pk_id) + base64.b64decode(b64_cert) + encode_tlv(0xA0, ctx_inner) + request = encode_tlv(TAG_AUTH_SERVER, content) + + response = es10x_command(client, request) + if not response.startswith(bytes([0xBF, 0x38])): + raise RuntimeError("Invalid AuthenticateServerResponse") + + # Check for eUICC-side errors + root = find_tag(response, TAG_AUTH_SERVER) + if root is not None: + error_tag = find_tag(root, 0xA1) + if error_tag is not None: + code = int.from_bytes(error_tag, "big") if error_tag else 0 + desc = AUTH_SERVER_ERROR_CODES.get(code, "unknown") + raise RuntimeError(f"AuthenticateServer rejected by eUICC: {desc} (0x{code:02X})") + + return b64e(response) + + +def prepare_download(client: AtClient, b64_signed2: str, b64_sig2: str, b64_cert: str, cc: str | None = None) -> str: + smdp_signed2 = base64.b64decode(b64_signed2) + smdp_signature2 = base64.b64decode(b64_sig2) + smdp_certificate = base64.b64decode(b64_cert) + smdp_signed2_root = find_tag(smdp_signed2, 0x30) + if smdp_signed2_root is None: + raise RuntimeError("Invalid smdpSigned2") + transaction_id = find_tag(smdp_signed2_root, TAG_STATUS) + cc_required_flag = find_tag(smdp_signed2_root, 0x01) + if transaction_id is None or cc_required_flag is None: + raise RuntimeError("Invalid smdpSigned2") + content = smdp_signed2 + smdp_signature2 + if int.from_bytes(cc_required_flag, "big") != 0: + if not cc: + raise RuntimeError("Confirmation code required but not provided") + content += encode_tlv(0x04, hashlib.sha256(hashlib.sha256(cc.encode("utf-8")).digest() + transaction_id).digest()) + content += smdp_certificate + response = es10x_command(client, encode_tlv(TAG_PREPARE_DOWNLOAD, content)) + if not response.startswith(bytes([0xBF, 0x21])): + raise RuntimeError("Invalid PrepareDownloadResponse") + return b64e(response) + + +def _parse_tlv_header_len(data: bytes) -> int: + """Return the combined tag + length header size for a TLV element.""" + tag_len = 2 if data[0] & 0x1F == 0x1F else 1 + length_byte = data[tag_len] + return tag_len + (1 + (length_byte & 0x7F) if length_byte & 0x80 else 1) + + +def load_bpp(client: AtClient, b64_bpp: str) -> dict: + bpp = b64d(b64_bpp) + if not bpp.startswith(bytes([0xBF, 0x36])): + raise RuntimeError("Invalid BoundProfilePackage") + + bpp_root_value = None + for tag, value, start, end in iter_tlv(bpp, with_positions=True): + if tag == TAG_BPP: + bpp_root_value = value + bpp_value_start = start + _parse_tlv_header_len(bpp[start:end]) + break + if bpp_root_value is None: + raise RuntimeError("Invalid BoundProfilePackage") + + chunks = [] + for tag, value, start, end in iter_tlv(bpp_root_value, with_positions=True): + if tag == 0xBF23: + chunks.append(bpp[0 : bpp_value_start + end]) + elif tag == 0xA0: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + elif tag in (0xA1, 0xA3): + hdr_len = _parse_tlv_header_len(bpp_root_value[start:end]) + chunks.append(bpp[bpp_value_start + start : bpp_value_start + start + hdr_len]) + for _, _, child_start, child_end in iter_tlv(value, with_positions=True): + chunks.append(value[child_start:child_end]) + elif tag == 0xA2: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + + result = {"seqNumber": 0, "success": False, "bppCommandId": None, "errorReason": None} + for chunk in chunks: + response = es10x_command(client, chunk) + if not response: + continue + root = find_tag(response, TAG_PROFILE_INSTALL_RESULT) + if not root: + continue + result_data = find_tag(root, 0xBF27) + if not result_data: + break + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) + if notif_meta: + seq_num = find_tag(notif_meta, TAG_STATUS) + if seq_num: + result["seqNumber"] = int.from_bytes(seq_num, "big") + final_result = find_tag(result_data, 0xA2) + if final_result: + for tag, value in iter_tlv(final_result): + if tag == 0xA0: + result["success"] = True + elif tag == 0xA1: + bpp_cmd = find_tag(value, TAG_STATUS) + if bpp_cmd: + result["bppCommandId"] = int.from_bytes(bpp_cmd, "big") + err = find_tag(value, 0x81) + if err: + result["errorReason"] = int.from_bytes(err, "big") + break # ProfileInstallResult received — eUICC session is finalized + if not result["success"] and result["errorReason"] is not None: + cmd_name = BPP_COMMAND_NAMES.get(result["bppCommandId"], f"unknown({result['bppCommandId']})") + err_name = BPP_ERROR_REASONS.get(result["errorReason"], f"unknown({result['errorReason']})") + raise RuntimeError(f"Profile installation failed at {cmd_name}: {err_name} (bppCommandId={result['bppCommandId']}, errorReason={result['errorReason']})") + return result + + +def parse_metadata(b64_metadata: str) -> dict: + root = find_tag(b64d(b64_metadata), 0xBF25) + if root is None: + raise RuntimeError("Invalid profileMetadata") + defaults = {"iccid": None, "serviceProviderName": None, "profileName": None, "iconType": None, "icon": None, "profileClass": None} + return {**defaults, **_decode_profile_fields(root)} + + +def cancel_session(client: AtClient, transaction_id: bytes, reason: int = 127) -> str: + content = encode_tlv(0x80, transaction_id) + encode_tlv(0x81, bytes([reason])) + response = es10x_command(client, encode_tlv(TAG_CANCEL_SESSION, content)) + return b64e(response) + + +def parse_lpa_activation_code(activation_code: str) -> tuple[str, str, str]: + if not activation_code.startswith("LPA:"): + raise ValueError("Invalid activation code format") + + parts = activation_code[4:].split("$") + if len(parts) != 3: + raise ValueError("Invalid activation code format") + + version, smdp, matching_id = [p.strip() for p in parts] + if version != "1": + raise ValueError("Unsupported activation code version") + if len(smdp) == 0 or "." not in smdp: + raise ValueError("Invalid SM-DP+ address in activation code") + if len(matching_id) == 0: + raise ValueError("Missing matching ID in activation code") + return version, smdp, matching_id + + +def download_profile(client: AtClient, activation_code: str) -> str: + _, smdp, matching_id = parse_lpa_activation_code(activation_code) + + challenge, euicc_info = get_challenge_and_info(client) + + payload = {"smdpAddress": smdp, "euiccChallenge": b64e(challenge), "euiccInfo1": b64e(euicc_info)} + if matching_id: + payload["matchingId"] = matching_id + auth = es9p_request(smdp, "initiateAuthentication", payload, "Authentication") + tx_id = base64_trim(auth.get("transactionId", "")) + tx_id_bytes = base64.b64decode(tx_id) if tx_id else b"" + + try: + b64_auth_resp = authenticate_server( + client, base64_trim(auth.get("serverSigned1", "")), base64_trim(auth.get("serverSignature1", "")), + base64_trim(auth.get("euiccCiPKIdToBeUsed", "")), base64_trim(auth.get("serverCertificate", "")), + matching_id=matching_id) + + cli = es9p_request(smdp, "authenticateClient", {"transactionId": tx_id, "authenticateServerResponse": b64_auth_resp}, "Authentication") + metadata = parse_metadata(base64_trim(cli.get("profileMetadata", ""))) + iccid = str(metadata.get("iccid") or "") + print(f'Downloading profile: {iccid} - {metadata["serviceProviderName"]} - {metadata["profileName"]}') + + b64_prep = prepare_download( + client, base64_trim(cli.get("smdpSigned2", "")), base64_trim(cli.get("smdpSignature2", "")), base64_trim(cli.get("smdpCertificate", ""))) + + bpp = es9p_request(smdp, "getBoundProfilePackage", {"transactionId": tx_id, "prepareDownloadResponse": b64_prep}, "GetBoundProfilePackage") + + result = load_bpp(client, base64_trim(bpp.get("boundProfilePackage", ""))) + if result["success"]: + print(f"Profile installed successfully (seqNumber: {result['seqNumber']})") + return iccid + else: + raise RuntimeError(f"Profile installation failed: {result}") + except Exception: + if tx_id_bytes: + b64_cancel_resp = "" + try: + b64_cancel_resp = cancel_session(client, tx_id_bytes) + except Exception: + pass + try: + es9p_request(smdp, "cancelSession", { + "transactionId": tx_id, + "cancelSessionResponse": b64_cancel_resp, + }, "CancelSession") + except Exception: + pass + raise + + +class TiciLPA(LPABase): + handles_modem_restart = True + _instance = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self, interface: Literal["qmi", "at"] = "at", device: str = DEFAULT_DEVICE, baud: int = DEFAULT_BAUD, + timeout: float = DEFAULT_TIMEOUT, verbose: bool = False): + if getattr(self, "_initialized", False): + self.verbose = verbose or self.verbose + return + # This backend is AT-only. Keep interface arg for compatibility with existing CLI/call sites. + self.interface = interface + self.device = device + self.baud = baud + self.timeout = timeout + self.verbose = verbose + self._last_good_device = device + self._euicc_present_cache: bool | None = None + from iqpilot.system.hardware.tici.hardware import get_device_type + self._is_eg25 = get_device_type() in ("tizi",) + self._client: AtClient | None = None + self._initialized = True + # _client is opened lazily via _ensure_client() on first actual eSIM operation. + # Do NOT call _open_ready_client() here: on pSIM devices (no eUICC) it retries + # for 10–30 s against the AT port, blocking hw_state_thread and starving the + # network-type polling loop that drives the WiFi/LTE sidebar indicator. + atexit.register(self.close) + + def close(self) -> None: + if self._client is not None: + try: + self._client.close() + finally: + self._client = None + + @staticmethod + def _set_modemmanager_running(running: bool) -> None: + action = "start" if running else "stop" + subprocess.check_call(["sudo", "systemctl", action, "ModemManager"]) + + @staticmethod + def _is_modemmanager_running() -> bool: + res = subprocess.run(["systemctl", "is-active", "ModemManager"], + capture_output=True, text=True, check=False) + return res.stdout.strip() == "active" + + def _probe_euicc_present(self) -> bool | None: + if self._euicc_present_cache is not None: + return self._euicc_present_cache + + if self._is_modemmanager_running(): + return None + + restarted_modemmanager = False + try: + res = subprocess.run( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-get-slot-status"], + capture_output=True, text=True, check=False, timeout=12, + ) + output = f"{res.stdout}\n{res.stderr}" + if "Is eUICC: yes" in output: + self._euicc_present_cache = True + elif "Is eUICC: no" in output: + self._euicc_present_cache = False + else: + self._euicc_present_cache = None + except Exception: + self._euicc_present_cache = None + finally: + if restarted_modemmanager: + self._set_modemmanager_running(True) + time.sleep(2.0) + + return self._euicc_present_cache + + @staticmethod + def _ttyusb2_mm_ignored() -> bool: + # AGNOS PR 521 marks ttyUSB2 with ID_MM_PORT_IGNORE=1 for EG25. + # If missing, ModemManager may contend with direct AT eSIM operations. + if not os.path.exists("/dev/ttyUSB2"): + return False + try: + res = subprocess.run( + ["udevadm", "info", "-q", "property", "-n", "/dev/ttyUSB2"], + capture_output=True, text=True, check=False, + ) + if res.returncode != 0: + return False + return "ID_MM_PORT_IGNORE=1" in res.stdout + except Exception: + return False + + def _ensure_client(self) -> AtClient: + if self._client is None: + self._client = self._open_ready_client() + return self._client + + @contextmanager + def _open_client(self): + yield self._ensure_client() + + def _open_ready_client(self) -> AtClient: + euicc_present = self._probe_euicc_present() + if euicc_present is False: + raise LPAError("Modem reports no eUICC support on this unit (QMI: Is eUICC: no)") + + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(1, 6): + for device in self._candidate_devices(): + client: AtClient | None = None + try: + if self.verbose: + print(f"!! trying modem AT device: {device} (attempt {attempt})", file=sys.stderr) + client = AtClient(device, self.baud, self.timeout, self.verbose) + client.ensure_capabilities() + client.open_isdr() + self._last_good_device = device + if self.verbose: + print(f"!! selected modem AT device: {device}", file=sys.stderr) + return client + except Exception as e: + if self.verbose: + print(f"!! modem AT device failed: {device}: {e}", file=sys.stderr) + last_error = e + if client is not None: + try: + client.close() + except Exception: + pass + if not recovery_attempted and last_error is not None and self._should_recover_isdr(last_error): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + # Give modem a moment to finish startup / channel release. + time.sleep(min(0.4 * attempt, 1.5)) + assert last_error is not None + raise last_error + + def _candidate_devices(self) -> list[str]: + if self.device and not os.path.exists(self.device): + return [self.device] + + candidates = [ + self._last_good_device, + self.device, + "/dev/modem_at0", + "/dev/ttyUSB3", + "/dev/ttyUSB2", + "/dev/ttyUSB1", + "/dev/ttyUSB0", + ] + ordered: list[str] = [] + for dev in candidates: + should_include = dev in (self.device, "/dev/modem_at0") or os.path.exists(dev) + if dev and dev not in ordered and should_include: + ordered.append(dev) + return ordered if ordered else [self.device] + + @staticmethod + def _to_profile(data: dict) -> Profile: + return Profile( + iccid=str(data.get("iccid") or ""), + nickname=str(data.get("profileNickname") or ""), + enabled=str(data.get("profileState") or "") == "enabled", + provider=str(data.get("serviceProviderName") or ""), + ) + + def _clear_cat_busy(self) -> None: + time.sleep(3) + try: + self._ensure_client().query('AT+QSTKRSP=254') + except Exception: + pass + time.sleep(1) + try: + self._ensure_client().query('AT+CFUN=4') + except Exception: + pass + time.sleep(2) + try: + self._ensure_client().query('AT+CFUN=1') + except Exception: + pass + self._ensure_client().channel = None + time.sleep(5) + + def _wait_for_modem(self, timeout: float = 45.0) -> None: + start = time.monotonic() + last_error: Exception | None = None + while time.monotonic() - start < timeout: + try: + self.close() + self._client = self._open_ready_client() + return + except Exception as e: + last_error = e + time.sleep(2) + if last_error is not None: + raise RuntimeError("Modem did not recover after reboot") from last_error + raise RuntimeError("Modem did not recover after reboot") + + def _restart_modem(self) -> None: + client = self._ensure_client() + for cmd in ('AT+CFUN=0', 'AT+CFUN=1,1'): + try: + client.query(cmd) + except Exception: + pass + client.channel = None + client._use_csim = False + self._wait_for_modem() + + @staticmethod + def _should_recover_isdr(error: Exception) -> bool: + message = str(error).lower() + markers = ( + "failed to open isd-r", + "failed to access euicc isd-r", + "simfilenotfound", + "at+ccho", + "at+cgla", + ) + return any(marker in message for marker in markers) + + def _recover_isdr_access(self) -> bool: + was_modemmanager_running = self._is_modemmanager_running() + self.close() + try: + if was_modemmanager_running: + self._set_modemmanager_running(False) + time.sleep(2.0) + + for cmd in ( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-reset"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-off=1"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-on=1"], + ): + subprocess.check_call(cmd) + time.sleep(2.0) + + self._euicc_present_cache = None + return True + except Exception as e: + if self.verbose: + print(f"!! ISD-R recovery failed: {e}", file=sys.stderr) + return False + finally: + if was_modemmanager_running: + self._set_modemmanager_running(True) + time.sleep(2.0) + + def _with_lpa_error(self, fn): + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(3): + try: + return fn() + except LPAError: + raise + except RuntimeError as e: + last_error = e + if "does not provide usable esim functionality" in str(e).lower(): + raise LPAError(str(e)) from e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(str(e)) from e + except (OSError, serial.SerialException) as e: + last_error = e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(f"AT transport error: {e}") from e + except TimeoutError as e: + raise LPAError(f"AT modem timeout: {e}") from e + except ValueError as e: + raise LPAError(str(e)) from e + assert last_error is not None + raise LPAError(str(last_error)) + + @staticmethod + def _is_transient_transport_error(message: str) -> bool: + lower = message.lower() + transient_markers = ( + "broken pipe", + "resource busy", + "input/output error", + "device disconnected", + "device reports readiness to read but returned no data", + "transport error", + "missing +cgla response", + "missing +csim response", + "malformed +cgla response payload", + "malformed +csim response payload", + "non-hexadecimal number found in fromhex", + ) + return any(m in lower for m in transient_markers) + + def list_profiles(self) -> list[Profile]: + def _run() -> list[Profile]: + return [self._to_profile(p) for p in list_profiles(self._ensure_client())] + return self._with_lpa_error(_run) + + def get_active_profile(self) -> Profile | None: + return next((p for p in self.list_profiles() if p.enabled), None) + + def _validate_profile_exists(self, iccid: str) -> None: + if not any(p.iccid == iccid for p in self.list_profiles()): + raise LPAProfileNotFoundError(f"profile {iccid} does not exist") + + def _is_bootstrapped(self) -> bool: + return not any(self.is_comma_profile(p.iccid) for p in self.list_profiles()) + + def _ensure_switchable_profile(self, iccid: str) -> None: + if self.is_comma_profile(iccid): + return + + if not self._is_bootstrapped(): + raise LPAError( + "Delete the existing Comma pSIM profile before activating a user eSIM profile" + ) + + def _process_notifications_after_delete(self, client: AtClient, iccid: str) -> None: + try: + process_notifications(client) + return + except Exception as error: + notification_error = error + + self._restart_modem() + + try: + deleted = not any(p.iccid == iccid for p in self.list_profiles()) + except Exception: + raise RuntimeError( + "Profile delete may have succeeded, but modem notification cleanup failed; " + "refresh profiles and retry if needed" + ) from notification_error + + if deleted: + return + + raise RuntimeError( + "Profile delete did not finish cleanly; refresh profiles and retry" + ) from notification_error + + def _process_notifications_after_state_change( + self, + validator, + recovery_message: str, + failure_message: str, + ) -> None: + try: + process_notifications(self._ensure_client()) + return + except Exception as notification_error: + pass + + self._wait_for_modem() + + try: + if validator(): + return + except Exception: + raise RuntimeError(recovery_message) from notification_error + + raise RuntimeError(failure_message) from notification_error + + def delete_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + raise LPAError("cannot delete active profile, switch to another profile first") + + def _run() -> None: + client = self._ensure_client() + try: + delete_profile(client, iccid) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + delete_profile(client, iccid) + else: + raise + self._process_notifications_after_delete(client, iccid) + + self._with_lpa_error(_run) + + def bootstrap(self) -> None: + comma_profiles = [p for p in self.list_profiles() if self.is_comma_profile(p.iccid)] + if not comma_profiles: + return + + def _run() -> None: + client = self._ensure_client() + for profile in comma_profiles: + if profile.enabled: + disable_profile(client, profile.iccid, refresh=True) + process_notifications(client) + delete_profile(client, profile.iccid) + process_notifications(client) + self._restart_modem() + + self._with_lpa_error(_run) + + def download_profile(self, qr: str, nickname: str | None = None) -> None: + # Strict upfront validation to provide immediate user feedback. + parse_lpa_activation_code(qr) + before = {p.iccid for p in self.list_profiles()} + + def _run() -> None: + client = self._ensure_client() + iccid = download_profile(client, qr) + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid for profile in self.list_profiles()), + "Profile add may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile add did not finish cleanly; refresh profiles and retry", + ) + + self._with_lpa_error(_run) + + if nickname: + after = self.list_profiles() + new_profile = next((p for p in after if p.iccid not in before), None) + if new_profile is not None and new_profile.iccid: + self.nickname_profile(new_profile.iccid, nickname) + + def nickname_profile(self, iccid: str, nickname: str) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + set_profile_nickname(self._ensure_client(), iccid, nickname) + self._with_lpa_error(_run) + + def switch_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + self._ensure_switchable_profile(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + return + + def _run() -> None: + client = self._ensure_client() + use_refresh = self._is_eg25 + try: + enable_profile(client, iccid, refresh=use_refresh) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + enable_profile(client, iccid, refresh=use_refresh) + else: + raise + client.channel = None + client._use_csim = False + if use_refresh: + self._wait_for_modem() + else: + self._restart_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile switch may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile switch did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + # Compatibility methods retained for old tests/scripts. + def process_notifications(self) -> None: + def _run() -> None: + process_notifications(self._ensure_client()) + self._with_lpa_error(_run) + + def enable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + enable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile enable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile enable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + def disable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + disable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and not profile.enabled for profile in self.list_profiles()), + "Profile disable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile disable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + +# --- CLI --- + +def main() -> None: + parser = argparse.ArgumentParser(description="Minimal AT-only LPA implementation") + parser.add_argument("--device", default=DEFAULT_DEVICE) + parser.add_argument("--baud", type=int, default=DEFAULT_BAUD) + parser.add_argument("--timeout", type=float, default=DEFAULT_TIMEOUT) + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--enable", type=str) + parser.add_argument("--disable", type=str) + parser.add_argument("--delete", type=str, metavar="ICCID", help="Delete a disabled profile") + parser.add_argument("--no-refresh", action="store_true", help="Skip REFRESH after enable/disable") + parser.add_argument("--set-nickname", nargs=2, metavar=("ICCID", "NICKNAME")) + parser.add_argument("--list-notifications", action="store_true") + parser.add_argument("--process-notifications", action="store_true") + parser.add_argument("--download", type=str, metavar="CODE") + args = parser.parse_args() + + lpa = TiciLPA(device=args.device, baud=args.baud, timeout=args.timeout, verbose=args.verbose) + + if args.enable: + lpa.enable_profile(args.enable, refresh=not args.no_refresh) + elif args.disable: + lpa.disable_profile(args.disable, refresh=not args.no_refresh) + elif args.delete: + lpa.delete_profile(args.delete) + elif args.set_nickname: + lpa.nickname_profile(args.set_nickname[0], args.set_nickname[1]) + elif args.list_notifications: + with lpa._open_client() as client: + print(json.dumps(list_notifications(client), indent=2)) + return + elif args.process_notifications: + lpa.process_notifications() + return + elif args.download: + lpa.download_profile(args.download) + + profiles_out = [{ + "iccid": p.iccid, + "profileNickname": p.nickname, + "profileState": "enabled" if p.enabled else "disabled", + "serviceProviderName": p.provider, + } for p in lpa.list_profiles()] + print(json.dumps(profiles_out, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py new file mode 100644 index 000000000..d53183f7a --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py @@ -0,0 +1,30 @@ +# GPIO pin definitions +class GPIO: + # both GPIO_STM_RST_N and GPIO_LTE_RST_N are misnamed, they are high to reset + HUB_RST_N = 30 + UBLOX_RST_N = 32 + UBLOX_SAFEBOOT_N = 33 + GNSS_PWR_EN = 34 # SCHEMATIC LABEL: GPIO_UBLOX_PWR_EN + + STM_RST_N = 124 + STM_BOOT0 = 134 + STM_PWR_EN_N = 41 # because STM32H7 RST doesn't generate a full power-on-reset + + SIREN = 42 + SOM_ST_IO = 49 + + LTE_RST_N = 50 + LTE_PWRKEY = 116 + LTE_BOOT = 52 + + # GPIO_CAM0_DVDD_EN = /sys/kernel/debug/regulator/camera_rear_ldo + CAM0_AVDD_EN = 8 + CAM0_RSTN = 9 + CAM1_RSTN = 7 + CAM2_RSTN = 12 + + # Sensor interrupts + BMX055_ACCEL_INT = 21 + BMX055_GYRO_INT = 23 + BMX055_MAGN_INT = 87 + LSM_INT = 84 diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/usb.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/usb.py new file mode 100644 index 000000000..15be6f295 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/hardware/usb.py @@ -0,0 +1,184 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +USB bus snapshot for deviceState: every enumerated device with its negotiated +speed and its controller's link-error count. Landing this in every rlog makes +cable/hub/link regressions diagnosable from a recorded route instead of only +live. + +Link errors come from `portli` on the ssusb controller (IQ.OS 4.9.1+); on older +builds the file is absent and the counts read 0. + +The USB eGPU dock is identified by VID/PID only. comma's internal codename for +it is deliberately not used here: IQ.Pilot runs these models on several +backends (eGPU dock, eMac), so the naming stays about the role, not the vendor. +""" +from pathlib import Path + +# comma's USB eGPU dock, both shipped USB IDs. The ROM ids are the same board +# sitting in its bootloader (ASMedia) before vendor firmware is flashed — it +# enumerates but cannot serve a GPU in that state. +EGPU_DOCK_USB_IDS = ((0xADD1, 0x0001), (0x3801, 0x0001)) +EGPU_DOCK_ROM_USB_IDS = ((0x174C, 0x2464), (0x174C, 0x2463)) +# must equal image_product() of the bundled firmware; test_egpu_dock_flash pins them together +EGPU_DOCK_FW_PRODUCT = "custom ed4e39b7-CLEAN" + + +def is_egpu_usb_device(vendor_id: int, product_id: int, include_bootloader: bool = False) -> bool: + ids = EGPU_DOCK_USB_IDS + EGPU_DOCK_ROM_USB_IDS if include_bootloader else EGPU_DOCK_USB_IDS + return (vendor_id, product_id) in ids +USB_DEVICES_PATH = Path("/sys/bus/usb/devices") +UDC_PATH = Path("/sys/class/udc") +TYPEC_CC_ORIENTATION_PATH = Path("/sys/class/power_supply/usb/typec_cc_orientation") +USB3_LANES = {1: "a", 2: "b"} # 0 = unattached +SOC_PLATFORM_PATH = Path("/sys/devices/platform/soc") +CONTROLLER_SUFFIX = ".ssusb" +LINK_ERRORS_FILE = "portli" + + +def read(path: Path) -> str | None: + # a controller in peripheral mode fails portli's show(); that surfaces as TypeError, not OSError + try: + return path.read_text().strip() + except Exception: + return None + + +def read_int(path: Path, base: int = 10) -> int: + try: + return int(path.read_text(), base) + except Exception: + return 0 + + +def read_hex_counter(path: Path) -> int: + """sysfs counter printed as '0x0000002a' (portli), tolerating a bare hex value.""" + raw = read(path) + if raw is None: + return 0 + try: + return int(raw, 0) if raw.lower().startswith("0x") else int(raw, 16) + except ValueError: + return 0 + + +def get_usb_topology(root: Path = USB_DEVICES_PATH) -> set[str]: + """Names of everything on the bus; a cheap way to detect hotplug without + re-reading every attribute.""" + try: + return {p.name for p in root.iterdir()} + except Exception: + return set() + + +def usb_devices(root: Path = USB_DEVICES_PATH) -> list[Path]: + try: + return sorted((d for d in root.glob("*") if (d / "idVendor").exists()), key=lambda p: p.name) + except Exception: + return [] + + +def controller(device: Path) -> Path | None: + """The SuperSpeed controller a device hangs off (â€Ļ/a800000.ssusb).""" + try: + return next((p for p in device.resolve().parents if p.name.endswith(CONTROLLER_SUFFIX)), None) + except Exception: + return None + + +def usb_controllers(soc: Path = SOC_PLATFORM_PATH) -> list[Path]: + try: + return sorted(soc.glob(f"*{CONTROLLER_SUFFIX}")) + except Exception: + return [] + + +def link_controller(udc_root: Path = UDC_PATH) -> str: + """Name of the Type-C port's controller, derived from the UDC rather than + hardcoded: the gadget exposes `.dwc3`, whose address prefix is the + `.ssusb` controller behind the same connector. comma pins the 3X value + directly, which would be wrong on any other board.""" + try: + udc = next(iter(sorted(p.name for p in udc_root.iterdir())), "") + except Exception: + return "" + return f"{udc.split('.')[0]}{CONTROLLER_SUFFIX}" if udc else "" + + +def usb3_lane(orientation: int | None = None) -> str: + """Which SuperSpeed lane the Type-C connector landed on. Unattached reads 0, + which is 'unknown' rather than a lane.""" + if orientation is None: + orientation = read_int(TYPEC_CC_ORIENTATION_PATH) + return USB3_LANES.get(orientation, "unknown") + + +def link_errors(ctrl: Path | None) -> int: + return read_hex_counter(ctrl / LINK_ERRORS_FILE) if ctrl is not None else 0 + + +def get_link_error_count(soc: Path = SOC_PLATFORM_PATH) -> int: + """Cumulative SS port link errors, read off the controller rather than a + device: in peripheral mode (eMac gadget link) the peer never enumerates on + our side, so there is no device row to carry the count.""" + return sum(link_errors(c) for c in usb_controllers(soc)) + + +def egpu_dock_present(root: Path = USB_DEVICES_PATH) -> bool: + """A dock in ROM/bootloader state is deliberately NOT counted as present: it + enumerates but cannot serve a GPU until vendor firmware is flashed.""" + return any((read_int(d / "idVendor", 16), read_int(d / "idProduct", 16)) in EGPU_DOCK_USB_IDS + for d in usb_devices(root)) + + +def egpu_dock_ready(root: Path = USB_DEVICES_PATH) -> bool: + """Present AND running the exact firmware we ship. A dock on any other + firmware enumerates fine but has not been validated with this stack, so the + runtime refuses it; the flasher still sees it via egpu_dock_present.""" + return any((read_int(d / "idVendor", 16), read_int(d / "idProduct", 16)) in EGPU_DOCK_USB_IDS + and (read(d / "product") or "").strip() == EGPU_DOCK_FW_PRODUCT + for d in usb_devices(root)) + + +def get_usb_state(root: Path = USB_DEVICES_PATH, udc_root: Path = UDC_PATH) -> list[dict]: + devices = [] + lane, link_ctrl = usb3_lane(), link_controller(udc_root) + for device in usb_devices(root): + ctrl = controller(device) + devices.append({ + "usb3Lane": lane if ctrl is not None and ctrl.name == link_ctrl else "unknown", + "busnum": read_int(device / "busnum"), + "devnum": read_int(device / "devnum"), + "vendorId": read_int(device / "idVendor", 16), + "productId": read_int(device / "idProduct", 16), + "speedMbps": read_int(device / "speed"), + "manufacturer": read(device / "manufacturer") or "", + "product": read(device / "product") or "", + # 16-bit field upstream, so mask rather than let a wrapped counter overflow it + "linkErrorCount": link_errors(ctrl) & 0xFFFF, + }) + return devices + + +def set_usb_state(device_state, devices: list[dict], link_error_count: int = 0, + lane: str | None = None) -> None: + entries = device_state.usbState.init('devices', len(devices)) + + dock_present = False + for entry, device in zip(entries, devices, strict=True): + entry.busnum = device["busnum"] + entry.devnum = device["devnum"] + entry.vendorId = device["vendorId"] + entry.productId = device["productId"] + entry.speedMbps = device["speedMbps"] + entry.manufacturer = device["manufacturer"] + entry.product = device["product"] + entry.linkErrorCount = device.get("linkErrorCount", 0) & 0xFFFF + entry.usb3Lane = device.get("usb3Lane", "unknown") + + if (entry.vendorId, entry.productId) in EGPU_DOCK_USB_IDS: + dock_present = True + + device_state.usbState.linkErrorCount = link_error_count + device_state.usbState.usb3Lane = lane if lane is not None else usb3_lane() + device_state.egpuDockPresent = dock_present diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/loggerd/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/loggerd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/loggerd/xattr_cache.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/loggerd/xattr_cache.py new file mode 100644 index 000000000..194b46459 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/loggerd/xattr_cache.py @@ -0,0 +1,28 @@ +import errno +import os + +import xattr + +_cached_attributes: dict[tuple[str, str], tuple[tuple[int, int, int], bytes | None]] = {} + +def getxattr(path: str, attr_name: str) -> bytes | None: + key = (path, attr_name) + st = os.stat(path) + identity = (st.st_dev, st.st_ino, st.st_ctime_ns) + cached = _cached_attributes.get(key) + if cached is None or cached[0] != identity: + try: + response = xattr.getxattr(path, attr_name) + except OSError as e: + # ENODATA (Linux) or ENOATTR (macOS) means attribute hasn't been set + if e.errno == errno.ENODATA or (hasattr(errno, 'ENOATTR') and e.errno == errno.ENOATTR): + response = None + else: + raise + _cached_attributes[key] = (identity, response) + return _cached_attributes[key][1] + +def setxattr(path: str, attr_name: str, attr_value: bytes) -> None: + xattr.setxattr(path, attr_name, attr_value) + st = os.stat(path) + _cached_attributes[(path, attr_name)] = ((st.st_dev, st.st_ino, st.st_ctime_ns), attr_value) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/manager/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/manager/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/manager/process.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/manager/process.py new file mode 100644 index 000000000..c0fe7caa8 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/manager/process.py @@ -0,0 +1,365 @@ +import importlib +import os +import signal +import time +import subprocess +from pathlib import Path +from collections.abc import Callable, ValuesView +from abc import ABC, abstractmethod +from multiprocessing import Process + +from setproctitle import setproctitle + +from iqpilot.cereal import car, log +import iqpilot.cereal.messaging as messaging +import iqpilot.system.sentry as sentry +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog + +MAX_CRASH_BACKOFF = 300.0 +CRASH_RESET_TIME = 60.0 +CRASH_LOOP_THRESHOLD = 6 + +try: + from iqpilot.system.proprietary_runtime.runtime_paths import preferred_runner_path +except ModuleNotFoundError: + _VERIFIED_RUNNER_PATH = Path("/usr/libexec/iqpilot/iqpilot_bundle_runner") + _FALLBACK_RUNNER_PATH = Path("/data/openpilot/iqpilot/system/proprietary_runtime/iqpilot_bundle_runner") + + def preferred_runner_path() -> Path: + if _VERIFIED_RUNNER_PATH.is_file() and os.access(_VERIFIED_RUNNER_PATH, os.X_OK): + return _VERIFIED_RUNNER_PATH + if os.getenv("IQPILOT_ALLOW_DEV_FALLBACKS") == "1" and _FALLBACK_RUNNER_PATH.is_file(): + return _FALLBACK_RUNNER_PATH + return _VERIFIED_RUNNER_PATH + + +def launcher(proc: str, name: str) -> None: + try: + # import the process + mod = importlib.import_module(proc) + + # rename the process + setproctitle(proc) + + # create new context since we forked + messaging.reset_context() + + # add daemon name tag to logs + cloudlog.bind(daemon=name) + sentry.set_tag("daemon", name) + + # exec the process + mod.main() + except KeyboardInterrupt: + cloudlog.warning(f"child {proc} got SIGINT") + except Exception: + # can't install the crash handler because sys.excepthook doesn't play nice + # with threads, so catch it here. + sentry.capture_exception() + raise + + +def nativelauncher(pargs: list[str], cwd: str, name: str) -> None: + os.environ['MANAGER_DAEMON'] = name + + # exec the process + os.chdir(cwd) + os.environ['PWD'] = cwd + os.execvp(pargs[0], pargs) + + +def join_process(process: Process, timeout: float) -> None: + # Process().join(timeout) will hang due to a python 3 bug: https://bugs.python.org/issue28382 + # We have to poll the exitcode instead + t = time.monotonic() + while time.monotonic() - t < timeout and process.exitcode is None: + time.sleep(0.001) + + +class ManagerProcess(ABC): + daemon = False + sigkill = False + should_run: Callable[[bool, Params, car.CarParams], bool] + proc: Process | None = None + enabled = True + name = "" + shutting_down = False + restart_if_crash = False + crash_count = 0 + last_restart_time = 0.0 + last_alive_time = 0.0 + crash_loop_logged = False + + @abstractmethod + def prepare(self) -> None: + pass + + @abstractmethod + def start(self) -> None: + pass + + def restart(self) -> None: + self.stop(sig=signal.SIGKILL) + self.start() + + def stop(self, retry: bool = True, block: bool = True, sig: signal.Signals | None = None, timeout: float = 5) -> int | None: + if self.proc is None: + return None + + if self.proc.exitcode is None: + if not self.shutting_down: + cloudlog.info(f"killing {self.name}") + if sig is None: + sig = signal.SIGKILL if self.sigkill else signal.SIGINT + self.signal(sig) + self.shutting_down = True + + if not block: + return None + + join_process(self.proc, timeout) + + # If process failed to die send SIGKILL + if self.proc.exitcode is None and retry: + cloudlog.info(f"killing {self.name} with SIGKILL") + self.signal(signal.SIGKILL) + self.proc.join() + + ret = self.proc.exitcode + cloudlog.info(f"{self.name} is dead with {ret}") + + if self.proc.exitcode is not None: + self.shutting_down = False + self.proc = None + + return ret + + def signal(self, sig: int) -> None: + if self.proc is None: + return + + # Don't signal if already exited + if self.proc.exitcode is not None and self.proc.pid is not None: + return + + # Can't signal if we don't have a pid + if self.proc.pid is None: + return + + cloudlog.info(f"sending signal {sig} to {self.name}") + os.kill(self.proc.pid, sig) + + def get_process_state_msg(self): + state = log.ManagerState.ProcessState.new_message() + state.name = self.name + if self.proc: + state.running = self.proc.is_alive() + state.shouldBeRunning = self.proc is not None and not self.shutting_down + state.pid = self.proc.pid or 0 + state.exitCode = self.proc.exitcode or 0 + return state + + +class NativeProcess(ManagerProcess): + def __init__(self, name, cwd, cmdline, should_run, enabled=True, sigkill=False, restart_if_crash=False): + self.name = name + self.cwd = cwd + self.cmdline = cmdline + self.should_run = should_run + self.enabled = enabled + self.sigkill = sigkill + self.launcher = nativelauncher + self.restart_if_crash = restart_if_crash + + def prepare(self) -> None: + pass + + def start(self) -> None: + # In case we only tried a non blocking stop we need to stop it before restarting + if self.shutting_down: + self.stop() + + if self.proc is not None: + return + + cwd = os.path.join(BASEDIR, self.cwd) + cloudlog.info(f"starting process {self.name}") + self.proc = Process(name=self.name, target=self.launcher, args=(self.cmdline, cwd, self.name)) + self.proc.start() + self.shutting_down = False + + +def _normalize_bundle_modes(bundle: str) -> None: + import json + candidates = [] + if env_root := os.environ.get("IQPILOT_PROPRIETARY_ROOT"): + candidates += [os.path.join(env_root, bundle), env_root] + candidates += [ + os.path.join(BASEDIR, ".iqpilot", "bundles", bundle), + os.path.join(os.path.dirname(BASEDIR), ".iqpilot", "bundles", bundle), + os.path.join(BASEDIR, "artifacts", bundle), + ] + root = next((c for c in candidates if os.path.isfile(os.path.join(c, "manifest.json"))), None) + if root is None: + return + try: + with open(os.path.join(root, "manifest.json")) as f: + manifest = json.load(f) + for rel, meta in manifest.items(): + if not (isinstance(meta, dict) and "mode" in meta and "sha256" in meta): + continue + path = os.path.join(root, rel) + if os.path.isfile(path) and (os.stat(path).st_mode & 0o777) != meta["mode"]: + os.chmod(path, meta["mode"]) + except Exception: + cloudlog.exception(f"failed to normalize bundle modes for {bundle}") + + +class BundleProcess(NativeProcess): + def __init__(self, name, bundle, entry, should_run, enabled=True, sigkill=False, restart_if_crash=False): + self.bundle = bundle + self.entry = entry + self.restart_if_crash = restart_if_crash + runner_path = preferred_runner_path() + runner_cmd = str(runner_path) if runner_path.is_absolute() else "./iqpilot_bundle_runner" + runner_cwd = ".iqpilot/runtime_root" if runner_path.is_absolute() else "system/proprietary_runtime" + super().__init__( + name=name, + cwd=runner_cwd, + cmdline=[ + runner_cmd, + "--bundle", bundle, + "--mode", "python-module", + "--entry", entry, + "--daemon-name", name, + ], + should_run=should_run, + enabled=enabled, + sigkill=sigkill, + ) + + def start(self) -> None: + if self.proc is None: + _normalize_bundle_modes(self.bundle) + super().start() + + def stop(self, retry: bool = True, block: bool = True, sig: signal.Signals | None = None, timeout: float = 5) -> int | None: + return super().stop(retry=retry, block=block, sig=signal.SIGTERM if sig is None else sig, timeout=timeout) + + +class PythonProcess(ManagerProcess): + def __init__(self, name, module, should_run, enabled=True, sigkill=False, restart_if_crash=False): + self.name = name + self.module = module + self.should_run = should_run + self.enabled = enabled + self.sigkill = sigkill + self.launcher = launcher + self.restart_if_crash = restart_if_crash + + def prepare(self) -> None: + if self.enabled: + cloudlog.info(f"preimporting {self.module}") + importlib.import_module(self.module) + + def start(self) -> None: + # In case we only tried a non blocking stop we need to stop it before restarting + if self.shutting_down: + self.stop() + + if self.proc is not None: + return + + cloudlog.info(f"starting python {self.module}") + self.proc = Process(name=self.name, target=self.launcher, args=(self.module, self.name)) + self.proc.start() + self.shutting_down = False + + +class DaemonProcess(ManagerProcess): + """Python process that has to stay running across manager restart. + This is used for athena so you don't lose SSH access when restarting manager.""" + def __init__(self, name, module, param_name, enabled=True): + self.name = name + self.module = module + self.param_name = param_name + self.enabled = enabled + self.params = None + + @staticmethod + def should_run(started, params, CP): + return True + + def prepare(self) -> None: + pass + + def start(self) -> None: + if self.params is None: + self.params = Params() + + pid = self.params.get(self.param_name) + if pid is not None: + try: + os.kill(int(pid), 0) + with open(f'/proc/{pid}/cmdline') as f: + if self.module in f.read(): + # daemon is running + return + except (OSError, FileNotFoundError): + # process is dead + pass + + cloudlog.info(f"starting daemon {self.name}") + proc = subprocess.Popen(['python', '-m', self.module], + stdin=open('/dev/null'), + stdout=open('/dev/null', 'w'), + stderr=open('/dev/null', 'w'), + preexec_fn=os.setpgrp) + + self.params.put(self.param_name, proc.pid) + + def stop(self, retry=True, block=True, sig=None) -> None: + pass + + +def ensure_running(procs: ValuesView[ManagerProcess], started: bool, params=None, CP: car.CarParams=None, + not_run: list[str] | None=None) -> list[ManagerProcess]: + if not_run is None: + not_run = [] + + running = [] + now = time.monotonic() + for p in procs: + if p.enabled and p.name not in not_run and p.should_run(started, params, CP): + if p.restart_if_crash and p.proc is not None and p.proc.is_alive(): + p.last_alive_time = now + elif p.restart_if_crash and p.proc is not None: + # uptime, not time-since-restart: the latter also counts the backoff wait, + # which would reset the counter as soon as backoff exceeds CRASH_RESET_TIME + if p.last_alive_time - p.last_restart_time > CRASH_RESET_TIME: + p.crash_count = 0 + p.crash_loop_logged = False + + backoff = 0.0 if not p.crash_count else min(MAX_CRASH_BACKOFF, 2.0 ** (p.crash_count - 1)) + if now - p.last_restart_time >= backoff: + p.crash_count += 1 + p.last_restart_time = now + cloudlog.error(f'Restarting {p.name} (exitcode {p.proc.exitcode}) [crash {p.crash_count}]') + if p.crash_count >= CRASH_LOOP_THRESHOLD and not p.crash_loop_logged: + # never stop retrying: giving up on hardwared or ui is worse than restarting slowly + cloudlog.error(f'{p.name} is in a crash loop, backing off to {MAX_CRASH_BACKOFF}s between restarts') + p.crash_loop_logged = True + p.restart() + running.append(p) + else: + p.crash_count = 0 + p.crash_loop_logged = False + p.last_alive_time = 0.0 + p.stop(block=False) + + for p in running: + p.start() + + return running diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/manager/process_config.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/manager/process_config.py new file mode 100644 index 000000000..2b1de9aee --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/manager/process_config.py @@ -0,0 +1,254 @@ +import os +import platform +from pathlib import Path + +from iqpilot.cereal import car, custom +from iqpilot.common.params import Params +from iqpilot.system.hardware import HARDWARE, PC, TICI +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.manager.process import PythonProcess, NativeProcess, BundleProcess + +from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected, resolve_backend, usbgpu_present +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_model_runner +from iqpilot.konn3kt.service_health import hephaestus_ready + +def driverview(started: bool, params: Params, CP: car.CarParams) -> bool: + return started or params.get_bool("IsDriverViewEnabled") + +def driver_monitoring(started: bool, params: Params, CP: car.CarParams) -> bool: + if os.path.exists('/tmp/lite_hw'): + return False + return driverview(started, params, CP) + +def notcar(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and CP.notCar + +def iscar(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not CP.notCar + +def logging(started: bool, params: Params, CP: car.CarParams) -> bool: + run = (not CP.notCar) or not params.get_bool("DisableLogging") + return started and run and params.get_bool("DashcamEnabled") + +def ublox_available() -> bool: + if HARDWARE.get_device_type() == "tizi" or os.path.exists('/tmp/lite_hw'): + return False + + quectel_override = Path(Paths.persist_root()) / "comma" / "use-quectel-gps" + return os.path.exists('/dev/ttyHS0') and not quectel_override.exists() + +def ublox(started: bool, params: Params, CP: car.CarParams) -> bool: + use_ublox = ublox_available() + if use_ublox != params.get_bool("UbloxAvailable"): + params.put_bool("UbloxAvailable", use_ublox) + return started and use_ublox + +def joystick(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("JoystickDebugMode") + +def not_joystick(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not params.get_bool("JoystickDebugMode") + +def long_maneuver(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("LongitudinalManeuverMode") + +def not_long_maneuver(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not params.get_bool("LongitudinalManeuverMode") + +def lat_maneuver(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("LateralManeuverMode") + +def not_lat_maneuver(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not params.get_bool("LateralManeuverMode") + +def qcomgps(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not ublox_available() + +def always_run(started: bool, params: Params, CP: car.CarParams) -> bool: + return True + +def only_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started + +def navd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("NavigationEnabled") + +def navrenderd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("NavigationEnabled") and params.get_bool("OnScreenNavigation") + +def navincidentd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("NavigationEnabled") and bool(params.get("WazePoliceApiKey")) and ( + params.get_int("WazePoliceAlertMode") > 0 or params.get_bool("WazePoliceShadow") + ) + +def iqmapd_needed(params: Params) -> bool: + return ( + params.get_bool("IQRoadNameOverlay") + or params.get_bool("ShowSpeedLimits") + or params.get_bool("SpeedLimitController") + or params.get_bool("EnableSpeedLimitControl") + or params.get_bool("EnableSpeedLimitPredicative") + or params.get_bool("MapCurveSpeedController") + or params.get_bool("VisionCurveSpeedController") + ) + +def iqmapd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("NavigationEnabled") and iqmapd_needed(params) + +def mapd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and iqmapd_needed(params) + +def constructiond_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("ConstructionZoneAssist") + +def iqvd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + # held for 1.0d: iqvd runs a detector per frame and the added load is not + # something 1.0c needs to carry. re-enable by restoring the param check. + return False + +def only_offroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return not started + +def livestream(started: bool, params: Params, CP: car.CarParams) -> bool: + # Konn3kt Live View: hephaestusd sets IsLiveStreaming when a viewer connects, so the + # manager brings up the stream encoder (and camerad/webrtcd when offroad) and tears them + # down cleanly when the session ends — no subprocess management inside hephaestusd. + return params.get_bool("IsLiveStreaming") + +def canlive(started: bool, params: Params, CP: car.CarParams) -> bool: + # Remote live CAN debugging via konn3kt. hephaestusd sets CanLiveStreaming when a viewer + # connects (startCanLive) and clears it when the last one leaves (stopCanLive), so canlived + # runs only during an active debug session — no idle connection or battery cost otherwise. + return params.get_bool("CanLiveStreaming") + +def is_tinygrad_model(started, params, CP: car.CarParams) -> bool: + """Check if the active model runner is tinygrad.""" + return bool(get_active_model_runner(params, not started) == custom.IQModelManager.Runner.tinygrad) + +def _egpu_present(params) -> bool: + if params.get_bool("IQEgpuDisabled"): + return False + return usbgpu_present() + + +def emac_enabled(started, params, CP: car.CarParams) -> bool: + return resolve_backend(params.get_bool("IQEmacEnabled"), egpu_selected(params), _egpu_present(params)) == "emac" + +def egpu_enabled(started, params, CP: car.CarParams) -> bool: + return (resolve_backend(params.get_bool("IQEmacEnabled"), egpu_selected(params), _egpu_present(params)) == "egpu" + and _egpu_present(params)) + +def egpu_prefetch_enabled(started, params, CP: car.CarParams) -> bool: + if params.get_bool("IQEgpuDisabled"): + return False + return resolve_backend(params.get_bool("IQEmacEnabled"), True, _egpu_present(params)) == "egpu" + +def big_model_enabled(started, params, CP: car.CarParams) -> bool: + return params.get_bool("IQEmacEnabled") or egpu_selected(params) + +def hephaestus_ready_shim(started, params, CP: car.CarParams) -> bool: + return hephaestus_ready(params) + +def not_low_power(started: bool, params: Params, CP: car.CarParams) -> bool: + # FastSleep deep standby: heavy processes are shed offroad while DevicePowerState is low_power + return started or params.get("DevicePowerState") != "low_power" + +def iquploaderd_ready(started: bool, params: Params, CP: car.CarParams) -> bool: + if not params.get_bool("OnroadUploads"): + return only_offroad(started, params, CP) + + return always_run(started, params, CP) + +def or_(*fns): + return lambda *args: any(fn(*args) for fn in fns) + +def and_(*fns): + return lambda *args: all(fn(*args) for fn in fns) + +procs = [ + NativeProcess("loggerd", "iqpilot/system/loggerd", ["./loggerd"], logging), + NativeProcess("encoderd", "iqpilot/system/loggerd", ["./encoderd"], only_onroad), + NativeProcess("stream_encoderd", "iqpilot/system/loggerd", ["./encoderd", "--stream"], or_(notcar, livestream)), + PythonProcess("logmessaged", "iqpilot.system.logmessaged", always_run, restart_if_crash=True), + + NativeProcess("camerad", "iqpilot/system/camerad", ["./camerad"], or_(driverview, livestream), restart_if_crash=True), + PythonProcess("proclogd", "iqpilot.system.proclogd", only_onroad, enabled=platform.system() != "Darwin"), + PythonProcess("journald", "iqpilot.system.journald", only_onroad, platform.system() != "Darwin"), + PythonProcess("micd", "iqpilot.system.micd", or_(iscar, livestream)), + PythonProcess("timed", "iqpilot.system.timed", always_run, enabled=not PC), + + PythonProcess("dmonitoringmodeld", "iqpilot.selfdrive.dmonitoringmodeld.dmonitoringmodeld", driver_monitoring, enabled=not PC), + + PythonProcess("sensord", "iqpilot.system.sensord.sensord", only_onroad, enabled=not PC), + PythonProcess("ui", "iqpilot.selfdrive.ui.ui", not_low_power, restart_if_crash=True), + PythonProcess("soundd", "iqpilot.selfdrive.ui.soundd", driverview), + PythonProcess("locationd", "iqpilot.selfdrive.locationd.locationd", only_onroad), + NativeProcess("_pandad", "iqpilot/selfdrive/pandad", ["./pandad"], always_run, enabled=False), + PythonProcess("calibrationd", "iqpilot.selfdrive.locationd.calibrationd", only_onroad), + PythonProcess("controlsd", "iqpilot.selfdrive.controls.controlsd", and_(not_joystick, iscar)), + PythonProcess("joystickd", "iqpilot.tools.joystick.joystickd", or_(joystick, notcar)), + PythonProcess("selfdrived", "iqpilot.selfdrive.selfdrived.selfdrived", only_onroad), + PythonProcess("card", "iqpilot.selfdrive.car.card", only_onroad), + PythonProcess("deleter", "iqpilot.system.loggerd.deleter", always_run), + PythonProcess("dmonitoringd", "iqpilot.selfdrive.monitoring.dmonitoringd", driver_monitoring, enabled=not PC), + PythonProcess("qcomgpsd", "iqpilot.system.qcomgpsd.qcomgpsd", qcomgps, enabled=TICI), + PythonProcess("pandad", "iqpilot.selfdrive.pandad.pandad", always_run), + PythonProcess("estimatord", "iqpilot.selfdrive.locationd.estimatord", only_onroad), + PythonProcess("ubloxd", "iqpilot.system.ubloxd.ubloxd", ublox, enabled=TICI), + PythonProcess("pigeond", "iqpilot.system.ubloxd.pigeond", ublox, enabled=TICI), + PythonProcess("plannerd", "iqpilot.selfdrive.controls.plannerd", not_long_maneuver), + PythonProcess("maneuversd", "iqpilot.tools.maneuvers.longitudinal_maneuversd", long_maneuver), + PythonProcess("lateral_maneuversd", "iqpilot.tools.maneuvers.lateral_maneuversd", lat_maneuver), + PythonProcess("radard", "iqpilot.selfdrive.controls.radard", only_onroad), + PythonProcess("hardwared", "iqpilot.system.hardware.hardwared", always_run, restart_if_crash=True), + PythonProcess("tombstoned", "iqpilot.system.tombstoned", always_run, enabled=not PC), + PythonProcess("updated", "iqpilot.system.updated.updated", and_(only_offroad, not_low_power), enabled=not PC), + BundleProcess("iquploaderd", "iqpilot_hephaestusd_private", "iqpilot_private.konn3kt.uploaderd.iquploaderd", + and_(iquploaderd_ready, not_low_power), restart_if_crash=True), + PythonProcess("feedbackd", "iqpilot.selfdrive.ui.feedback.feedbackd", and_(only_onroad, not_lat_maneuver)), + + # debug procs + NativeProcess("bridge", "iqpilot/cereal/messaging", ["./bridge"], notcar), + PythonProcess("webrtcd", "iqpilot.system.webrtc.webrtcd", or_(iscar, livestream)), + PythonProcess("canlived", "iqpilot.konn3kt.canlive.canlived", canlive), +] + +# iqpilot +procs += [ + # Models + BundleProcess("models_manager", "iqpilot_model_selector_private", "iqpilot_private.models.manager", and_(only_offroad, not_low_power)), + NativeProcess("iqmodeld", "iqpilot/selfdrive/iqmodeld", ["./iqmodeld"], and_(only_onroad, is_tinygrad_model), restart_if_crash=True), + # big-model backends: iqmodeld self-demotes to the small channel worker when + # either backend is enabled; the selector publishes, and exactly one big + # worker (Mac or eGPU, eMac wins) feeds the BIG channel + PythonProcess("modeld_selector", "iqpilot.selfdrive.iqmodeld.modeld_selector", + and_(only_onroad, and_(is_tinygrad_model, big_model_enabled)), restart_if_crash=True), + BundleProcess("maciqmodeld", "iqpilot_emac_private", "iqpilot_private.emac.maciqmodeld", + and_(only_onroad, and_(is_tinygrad_model, emac_enabled)), restart_if_crash=True), + PythonProcess("iqegpumodeld", "iqpilot.selfdrive.iqmodeld.iqegpumodeld", + and_(only_onroad, and_(is_tinygrad_model, egpu_enabled)), restart_if_crash=True), + PythonProcess("egpu_prefetch", "iqpilot.selfdrive.iqmodeld.egpu_prefetch", + and_(only_offroad, and_(is_tinygrad_model, egpu_prefetch_enabled)), restart_if_crash=True), + + BundleProcess("backup_manager_k3", "iqpilot_hephaestusd_private", "iqpilot_private.konn3kt.backups.backup_orchestrator", + and_(only_offroad, hephaestus_ready_shim, not_low_power)), + BundleProcess("navd", "iqpilot_navd_private", "iqpilot_private.navd.navd", navd_onroad, restart_if_crash=True), + BundleProcess("navincidentd", "iqpilot_navd_private", "iqpilot_private.navd.navincidentd", navincidentd_onroad, restart_if_crash=True), + BundleProcess("navrenderd", "iqpilot_navd_private", "iqpilot_private.navd.navrenderd", navrenderd_onroad, restart_if_crash=True), + BundleProcess("iqmapd", "iqpilot_navd_private", "iqpilot_private.navd.iqmapd", iqmapd_onroad, restart_if_crash=True), + + # work-zone detector for Speed Limit Assist + PythonProcess("constructiond", "iqpilot.selfdrive.constructiond", constructiond_onroad, restart_if_crash=True), + + # iqvd: vision vehicle detector for UI ambient track dots + BundleProcess("iqvd", "iqpilot_iqvd_private", "iqpilot_private.iqvd.iqvd", iqvd_onroad, restart_if_crash=True), + + # mapd + NativeProcess("mapd", "iqpilot/third_party/mapd_pfeiferj", ["./mapd"], mapd_onroad, restart_if_crash=True), + PythonProcess("mapd_manager", "iqpilot.iq_maps.orchestrator", and_(only_offroad, not_low_power)), + + # locationd + NativeProcess("iqlocd", "iqpilot/selfdrive/iqlocd", ["./iqlocd"], only_onroad), +] + +managed_processes = {p.name: p for p in procs} diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/micd.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/micd.py new file mode 100644 index 000000000..5c8d05594 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/micd.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +import numpy as np +import os +import time +from functools import cache +import threading + +from iqpilot.cereal import messaging +from iqpilot.common.params import Params +from iqpilot.common.realtime import Ratekeeper +from iqpilot.common.utils import retry +from iqpilot.common.swaglog import cloudlog + +RATE = 10 +FFT_SAMPLES = 1600 # 100ms +REFERENCE_SPL = 2e-5 # newtons/m^2 +SAMPLE_RATE = 16000 +SAMPLE_BUFFER = 800 # 50ms + + +@cache +def get_a_weighting_filter(): + # Calculate the A-weighting filter + # https://en.wikipedia.org/wiki/A-weighting + freqs = np.fft.fftfreq(FFT_SAMPLES, d=1 / SAMPLE_RATE) + A = 12194 ** 2 * freqs ** 4 / ((freqs ** 2 + 20.6 ** 2) * (freqs ** 2 + 12194 ** 2) * np.sqrt((freqs ** 2 + 107.7 ** 2) * (freqs ** 2 + 737.9 ** 2))) + return A / np.max(A) + + +def calculate_spl(measurements): + # https://www.engineeringtoolbox.com/sound-pressure-d_711.html + sound_pressure = np.sqrt(np.mean(measurements ** 2)) # RMS of amplitudes + if sound_pressure > 0: + sound_pressure_level = 20 * np.log10(sound_pressure / REFERENCE_SPL) # dB + else: + sound_pressure_level = 0 + return sound_pressure, sound_pressure_level + + +def apply_a_weighting(measurements: np.ndarray) -> np.ndarray: + # Generate a Hanning window of the same length as the audio measurements + measurements_windowed = measurements * np.hanning(len(measurements)) + + # Apply the A-weighting filter to the signal + return np.abs(np.fft.ifft(np.fft.fft(measurements_windowed) * get_a_weighting_filter())) + + +class Mic: + def __init__(self): + self.rk = Ratekeeper(RATE) + self.pm = messaging.PubMaster(['soundPressure', 'rawAudioData']) + self.params = Params() + + self.measurements = np.empty(0) + + self.sound_pressure = 0 + self.sound_pressure_weighted = 0 + self.sound_pressure_level_weighted = 0 + + self.lock = threading.Lock() + self.callback_count = 0 + self.last_audio_rms = 0.0 + self.last_audio_peak = 0.0 + self.last_device = None + self.last_status = None + + def update(self): + with self.lock: + sound_pressure = self.sound_pressure + sound_pressure_weighted = self.sound_pressure_weighted + sound_pressure_level_weighted = self.sound_pressure_level_weighted + callback_count = self.callback_count + audio_rms = self.last_audio_rms + audio_peak = self.last_audio_peak + device_name = self.last_device + status = self.last_status + + msg = messaging.new_message('soundPressure', valid=True) + msg.soundPressure.soundPressure = float(sound_pressure) + msg.soundPressure.soundPressureWeighted = float(sound_pressure_weighted) + msg.soundPressure.soundPressureWeightedDb = float(sound_pressure_level_weighted) + + self.pm.send('soundPressure', msg) + if callback_count % RATE == 0: + cloudlog.info( + f"micd health: callbacks={callback_count} rms={audio_rms:.6f} peak={audio_peak:.6f} " + f"device={device_name} status={status!r} livestream={self.params.get_bool('IsLiveStreaming')}" + ) + self.rk.keep_time() + + def callback(self, indata, frames, time, status): + """ + Using amplitude measurements, calculate an uncalibrated sound pressure and sound pressure level. + Then apply A-weighting to the raw amplitudes and run the same calculations again. + + Logged A-weighted equivalents are rough approximations of the human-perceived loudness. + """ + msg = messaging.new_message('rawAudioData', valid=True) + audio_data_int_16 = (indata[:, 0] * 32767).astype(np.int16) + msg.rawAudioData.data = audio_data_int_16.tobytes() + msg.rawAudioData.sampleRate = SAMPLE_RATE + self.pm.send('rawAudioData', msg) + + with self.lock: + self.callback_count += 1 + self.last_audio_rms = float(np.sqrt(np.mean(np.square(indata[:, 0])))) + self.last_audio_peak = float(np.max(np.abs(indata[:, 0]))) + self.last_status = str(status) if status else None + self.measurements = np.concatenate((self.measurements, indata[:, 0])) + + while self.measurements.size >= FFT_SAMPLES: + measurements = self.measurements[:FFT_SAMPLES] + + self.sound_pressure, _ = calculate_spl(measurements) + measurements_weighted = apply_a_weighting(measurements) + self.sound_pressure_weighted, self.sound_pressure_level_weighted = calculate_spl(measurements_weighted) + + self.measurements = self.measurements[FFT_SAMPLES:] + + @retry(attempts=10, delay=3) + def get_stream(self, sd): + # reload sounddevice to reinitialize portaudio + sd._terminate() + sd._initialize() + requested_device = os.environ.get("MICD_DEVICE") + device = int(requested_device) if requested_device is not None else None + return sd.InputStream(channels=1, samplerate=SAMPLE_RATE, callback=self.callback, blocksize=SAMPLE_BUFFER, device=device) + + def micd_thread(self): + # sounddevice must be imported after forking processes + import sounddevice as sd + + device = sd.default.device + if os.environ.get("MICD_DEVICE") is not None: + device = int(os.environ["MICD_DEVICE"]) + sd.default.device = (device, device) + self.last_device = f"{device}: {sd.query_devices(device)['name']}" if isinstance(device, int) else str(device) + cloudlog.info(f"micd selecting input device {self.last_device}") + + while True: + try: + with self.get_stream(sd) as stream: + cloudlog.info(f"micd stream started: {stream.samplerate=} {stream.channels=} {stream.dtype=} {stream.device=}, {stream.blocksize=}") + while True: + self.update() + except Exception: + # Some A1s wedge the audio DSP (ALSA EINVAL / ADSP_EFAILED until reboot). Dying here + # crash-loops the process and selfdrived raises a takeover alert mid-drive over a + # microphone - stay alive and keep retrying instead; recovers if the DSP comes back. + cloudlog.exception("micd: audio stream unavailable, retrying") + time.sleep(10) + + +def main(): + mic = Mic() + mic.micd_thread() + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/sentry.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/sentry.py new file mode 100644 index 000000000..0205903d5 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/sentry.py @@ -0,0 +1,171 @@ +"""Install exception handler for process crash.""" +import os +import shutil +import traceback +from datetime import datetime +import sentry_sdk +from enum import Enum +from sentry_sdk.integrations.threading import ThreadingIntegration + +from iqpilot.common.params import Params +from iqpilot.konn3kt.registration import UNREGISTERED_DONGLE_ID +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.version import get_build_metadata, get_version + +CRASHES_DIR = Paths.crash_log_root() +CRASH_UPLOADS_DIR = os.path.join(Paths.log_root(), "crash") + + +class SentryProject(Enum): + # python project + SELFDRIVE = "https://186a6736b7927e5ae9b92c869ba81b6b@o1138119.ingest.us.sentry.io/4508660076052480" + # native project + SELFDRIVE_NATIVE = SELFDRIVE + + +def _sentry_enabled() -> bool: + return os.getenv("IQPILOT_ENABLE_SENTRY", "0") == "1" + + +def _ensure_dir(path: str) -> None: + os.makedirs(path, exist_ok=True) + + +def _queue_crash_upload(src: str, name: str | None = None) -> None: + try: + _ensure_dir(CRASH_UPLOADS_DIR) + dest_name = name or os.path.basename(src) + shutil.copyfile(src, os.path.join(CRASH_UPLOADS_DIR, dest_name)) + except Exception: + cloudlog.exception("error when attempting to queue crash upload") + + +def report_tombstone(fn: str, message: str, contents: str) -> None: + cloudlog.error({'tombstone': message}) + + if not _sentry_enabled(): + return + + with sentry_sdk.configure_scope() as scope: + set_user() + scope.set_extra("tombstone_fn", fn) + scope.set_extra("tombstone", contents) + sentry_sdk.capture_message(message=message) + sentry_sdk.flush() + + +def capture_exception(*args, **kwargs) -> None: + cloudlog.error("crash", exc_info=kwargs.get('exc_info', 1)) + + try: + save_exception(traceback.format_exc()) + + if not _sentry_enabled(): + return + + set_user() + sentry_sdk.capture_exception(*args, **kwargs) + sentry_sdk.flush() # https://github.com/getsentry/sentry-python/issues/291 + except Exception: + cloudlog.exception("sentry exception") + + +def save_exception(content: str) -> None: + try: + _ensure_dir(CRASHES_DIR) + commit = (get_build_metadata().openpilot.git_commit or "nocommit")[:8] + + dated_fn = os.path.join(CRASHES_DIR, datetime.now().strftime("%Y-%m-%d--%H-%M-%S.log")) + files = [ + dated_fn, + os.path.join(CRASHES_DIR, "error.log") + ] + + for fn in files: + with open(fn, 'w') as f: + if os.path.basename(fn) == "error.log": + lines = content.splitlines()[-3:] + f.write("\n".join(lines)) + else: + f.write(content) + + upload_name = f"{os.path.splitext(os.path.basename(dated_fn))[0]}_{commit}_python.log" + _queue_crash_upload(dated_fn, upload_name) + cloudlog.error(f"logged crash to {files}") + except Exception: + cloudlog.exception("error when attempting to save exception") + + +def capture_fingerprint_mock() -> None: + try: + set_user() + message = "car doesn't match any fingerprints" + sentry_sdk.capture_message(message=message, level="error") + sentry_sdk.flush() + except Exception as e: + cloudlog.exception(f"sentry fingerprint MOCK exception: {e}") + + +def capture_fingerprint(candidate: str, car_name: str) -> None: + try: + set_user() + sentry_sdk.set_tag("carFingerprint", candidate) + sentry_sdk.set_tag("carName", car_name) + + message = f"Fingerprinted {candidate}" + sentry_sdk.capture_message(message=message, level="info") + sentry_sdk.flush() + except Exception as e: + cloudlog.exception(f"sentry fingerprint exception: {e}") + + +def set_tag(key: str, value: str) -> None: + sentry_sdk.set_tag(key, value) + + +def set_user() -> None: + dongle_id, git_username = get_properties() + sentry_sdk.set_user({"id": dongle_id, "name": git_username}) + + +def get_properties() -> tuple[str, str]: + params = Params() + hardware_serial: str = params.get("HardwareSerial") or "" + git_username: str = params.get("GithubUsername") or "" + dongle_id: str = params.get("DongleId") or f"{UNREGISTERED_DONGLE_ID}-{hardware_serial}" + + return dongle_id, git_username + + +def init(project: SentryProject) -> bool: + if not _sentry_enabled(): + cloudlog.info("Sentry disabled, using local crash logging + konn3kt uploader") + return False + + build_metadata = get_build_metadata() + + env = build_metadata.channel_type + dongle_id, git_username = get_properties() + + integrations = [] + if project == SentryProject.SELFDRIVE: + integrations.append(ThreadingIntegration(propagate_hub=True)) + + sentry_sdk.init(project.value, + default_integrations=False, + release=get_version(), + integrations=integrations, + traces_sample_rate=1.0, + max_value_length=8192, + environment=env) + + sentry_sdk.set_user({"id": dongle_id, "name": git_username}) + sentry_sdk.set_tag("dirty", build_metadata.openpilot.is_dirty) + sentry_sdk.set_tag("origin", build_metadata.openpilot.git_origin) + sentry_sdk.set_tag("branch", build_metadata.channel) + sentry_sdk.set_tag("commit", build_metadata.openpilot.git_commit) + sentry_sdk.set_tag("device", HARDWARE.get_device_type()) + + return True diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/networkmanager.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/networkmanager.py new file mode 100644 index 000000000..1165a9892 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/networkmanager.py @@ -0,0 +1,47 @@ +from enum import IntEnum + + +# NetworkManager device states +class NMDeviceState(IntEnum): + UNKNOWN = 0 + DISCONNECTED = 30 + PREPARE = 40 + STATE_CONFIG = 50 + NEED_AUTH = 60 + IP_CONFIG = 70 + ACTIVATED = 100 + DEACTIVATING = 110 + + +# NetworkManager constants +NM = "org.freedesktop.NetworkManager" +NM_PATH = '/org/freedesktop/NetworkManager' +NM_IFACE = 'org.freedesktop.NetworkManager' +NM_ACCESS_POINT_IFACE = 'org.freedesktop.NetworkManager.AccessPoint' +NM_SETTINGS_PATH = '/org/freedesktop/NetworkManager/Settings' +NM_SETTINGS_IFACE = 'org.freedesktop.NetworkManager.Settings' +NM_CONNECTION_IFACE = 'org.freedesktop.NetworkManager.Settings.Connection' +NM_ACTIVE_CONNECTION_IFACE = 'org.freedesktop.NetworkManager.Connection.Active' +NM_WIRELESS_IFACE = 'org.freedesktop.NetworkManager.Device.Wireless' +NM_PROPERTIES_IFACE = 'org.freedesktop.DBus.Properties' +NM_DEVICE_IFACE = 'org.freedesktop.NetworkManager.Device' +NM_IP4_CONFIG_IFACE = 'org.freedesktop.NetworkManager.IP4Config' + +NM_DEVICE_TYPE_WIFI = 2 +NM_DEVICE_TYPE_MODEM = 8 +NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT = 8 +NM_DEVICE_STATE_REASON_NEW_ACTIVATION = 60 + +# https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NM80211ApFlags +NM_802_11_AP_FLAGS_NONE = 0x0 +NM_802_11_AP_FLAGS_PRIVACY = 0x1 +NM_802_11_AP_FLAGS_WPS = 0x2 + +# https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NM80211ApSecurityFlags +NM_802_11_AP_SEC_PAIR_WEP40 = 0x00000001 +NM_802_11_AP_SEC_PAIR_WEP104 = 0x00000002 +NM_802_11_AP_SEC_GROUP_WEP40 = 0x00000010 +NM_802_11_AP_SEC_GROUP_WEP104 = 0x00000020 +NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x00000100 +NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200 +NM_802_11_AP_SEC_KEY_MGMT_SAE = 0x00000400 # WPA3-Personal (SAE) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/os_update.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/os_update.py new file mode 100644 index 000000000..806beee73 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/os_update.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +""" +IQ.OS compatibility check + in-place AGNOS update for the setup flow. + +A chosen IQ.Pilot channel may target a newer IQ.OS than the device is running +(its cloned tree pins the required version in launch_env.sh AGNOS_VERSION). When +that differs from the running /VERSION, the setup flow flashes the target IQ.OS +via comma's own agnos.py BEFORE writing continue.sh, so the single reboot lands +on a compatible OS. The risky flashing is delegated entirely to agnos.py; this +module only reads versions, picks the right manifest, and streams coarse +progress. +""" +import json +import os +import re +import subprocess +import threading +from typing import Callable + +VERSION_PATH = "/VERSION" + + +def current_os_version() -> str: + try: + with open(VERSION_PATH) as f: + return f.read().strip() + except Exception: + return "" + + +def required_agnos_version(install_path: str) -> str: + """Read the target OS version the cloned fork pins in launch_env.sh.""" + path = os.path.join(install_path, "launch_env.sh") + try: + with open(path) as f: + for line in f: + m = re.search(r'AGNOS_VERSION\s*=\s*"([^"]+)"', line) + if m: + return m.group(1).strip() + except Exception: + pass + return "" + + +def _hardware_dir(install_path: str) -> str: + nested = os.path.join(install_path, "iqpilot", "system", "hardware", "tici") + if os.path.isdir(nested): + return nested + return os.path.join(install_path, "system", "hardware", "tici") + + +def agnos_manifest_path(install_path: str, device_type: str) -> str: + # comma 3 (tici) uses a different AGNOS manifest than comma 3x (tizi) / comma 4 (mici). + fname = "agnos_tici_15_1.json" if device_type == "tici" else "agnos.json" + return os.path.join(_hardware_dir(install_path), fname) + + +def os_update_needed(install_path: str) -> tuple[bool, str, str]: + """Returns (needed, current, required).""" + current = current_os_version() + required = required_agnos_version(install_path) + needed = bool(required and current and required != current) + return needed, current, required + + +ProgressCb = Callable[[int, str], None] + + +def run_agnos_update(install_path: str, device_type: str, progress_cb: ProgressCb) -> bool: + """Flash + swap to the target IQ.OS. Streams coarse partition-level progress + via progress_cb(percent, note). Returns True on success. The device must be + rebooted by the caller afterward for the new slot to take effect.""" + manifest = agnos_manifest_path(install_path, device_type) + agnos_py = os.path.join(_hardware_dir(install_path), "agnos.py") + if not os.path.isfile(manifest) or not os.path.isfile(agnos_py): + progress_cb(0, "manifest_missing") + return False + + try: + total_partitions = max(1, len(json.load(open(manifest)))) + except Exception: + total_partitions = 1 + + progress_cb(1, "starting") + try: + proc = subprocess.Popen( + ["python3", agnos_py, "--swap", manifest], + cwd=install_path, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + env={**os.environ, "PYTHONPATH": install_path}, + ) + except Exception: + progress_cb(0, "launch_failed") + return False + + completed = 0 + swapping = False + assert proc.stdout is not None + for line in proc.stdout: + line = line.strip() + if "Downloading and writing" in line or "Already flashed" in line: + completed += 1 + pct = min(94, int((completed / total_partitions) * 90) + 2) + progress_cb(pct, "flashing") + elif "Swapping to slot" in line or "AGNOS ready" in line: + swapping = True + progress_cb(96, "swapping") + proc.wait() + if proc.returncode == 0: + progress_cb(100, "done") + return True + progress_cb(0, "failed" if not swapping else "swap_failed") + return False + + +class OsUpdateCoordinator: + """Bridges the setup UI's install thread and the BLE confirmation from the app. + The install thread posts a required-update, waits for the phone's confirm, then + runs the flash. On-screen setup can confirm locally too.""" + + def __init__(self): + self.confirmed = threading.Event() + self.needed = False + self.current = "" + self.required = "" + + def request(self, current: str, required: str) -> None: + self.needed = True + self.current = current + self.required = required + self.confirmed.clear() + + def confirm(self) -> None: + self.confirmed.set() + + def wait_for_confirm(self, timeout: float) -> bool: + return self.confirmed.wait(timeout=timeout) diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/wifi_manager.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/wifi_manager.py new file mode 100644 index 000000000..a52cdab8b --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/ui/lib/wifi_manager.py @@ -0,0 +1,1091 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import atexit +import os +import threading +import time +import uuid +import subprocess +from collections.abc import Callable +from dataclasses import dataclass +from enum import IntEnum +from typing import Any + +from jeepney import DBusAddress, new_method_call +from jeepney.bus_messages import MatchRule, message_bus +from jeepney.io.blocking import open_dbus_connection as open_dbus_connection_blocking +from jeepney.io.threading import DBusRouter, open_dbus_connection as open_dbus_connection_threading +from jeepney.low_level import MessageType +from jeepney.wrappers import Properties + +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import PC +from iqpilot.system.ui.lib.networkmanager import (NM, NM_WIRELESS_IFACE, NM_802_11_AP_SEC_PAIR_WEP40, + NM_802_11_AP_SEC_PAIR_WEP104, NM_802_11_AP_SEC_GROUP_WEP40, + NM_802_11_AP_SEC_GROUP_WEP104, NM_802_11_AP_SEC_KEY_MGMT_PSK, + NM_802_11_AP_SEC_KEY_MGMT_802_1X, NM_802_11_AP_SEC_KEY_MGMT_SAE, + NM_802_11_AP_FLAGS_NONE, + NM_802_11_AP_FLAGS_PRIVACY, NM_802_11_AP_FLAGS_WPS, + NM_PATH, NM_IFACE, NM_ACCESS_POINT_IFACE, NM_SETTINGS_PATH, + NM_SETTINGS_IFACE, NM_CONNECTION_IFACE, NM_DEVICE_IFACE, + NM_DEVICE_TYPE_WIFI, NM_DEVICE_TYPE_MODEM, NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT, + NM_DEVICE_STATE_REASON_NEW_ACTIVATION, NM_ACTIVE_CONNECTION_IFACE, + NM_IP4_CONFIG_IFACE, NMDeviceState) + +try: + from iqpilot.common.params import Params +except Exception: + Params = None + +TETHERING_IP_ADDRESS = "192.168.43.1" +DEFAULT_TETHERING_PASSWORD = "swagswagcomma" +SIGNAL_QUEUE_SIZE = 10 +SCAN_PERIOD_SECONDS = 5 +SYSTEM_DBUS_SOCKET_CANDIDATES = ( + "/run/dbus/system_bus_socket", + "/var/run/dbus/system_bus_socket", +) + + +def normalize_ssid(ssid: str) -> str: + return ssid.replace("’", "'") + + +class SecurityType(IntEnum): + OPEN = 0 + WPA = 1 + WPA2 = 2 + WPA3 = 3 + UNSUPPORTED = 4 + + +class MeteredType(IntEnum): + UNKNOWN = 0 + YES = 1 + NO = 2 + + +_WARNED_UNSUPPORTED_NETWORKS: set[tuple[int, int, int]] = set() + + +def get_security_type(flags: int, wpa_flags: int, rsn_flags: int) -> SecurityType: + wpa_props = wpa_flags | rsn_flags + + # obtained by looking at flags of networks in the office as reported by an Android phone + supports_wpa = (NM_802_11_AP_SEC_PAIR_WEP40 | NM_802_11_AP_SEC_PAIR_WEP104 | NM_802_11_AP_SEC_GROUP_WEP40 | + NM_802_11_AP_SEC_GROUP_WEP104 | NM_802_11_AP_SEC_KEY_MGMT_PSK) + + if (flags == NM_802_11_AP_FLAGS_NONE) or ((flags & NM_802_11_AP_FLAGS_WPS) and not (wpa_props & supports_wpa) and not (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_SAE)): + return SecurityType.OPEN + elif (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_SAE) and not (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_PSK) and not (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_802_1X): + # WPA3-Personal only (SAE without PSK fallback) + return SecurityType.WPA3 + elif (flags & NM_802_11_AP_FLAGS_PRIVACY) and (wpa_props & (supports_wpa | NM_802_11_AP_SEC_KEY_MGMT_SAE)) and not (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_802_1X): + # WPA2, WPA2+WPA3 mixed, or WPA — all handled via WPA key_mgmt (NM negotiates SAE if available) + return SecurityType.WPA2 + else: + _key = (flags, wpa_flags, rsn_flags) + if _key not in _WARNED_UNSUPPORTED_NETWORKS: + _WARNED_UNSUPPORTED_NETWORKS.add(_key) + cloudlog.warning(f"Unsupported network! flags: {flags}, wpa_flags: {wpa_flags}, rsn_flags: {rsn_flags}") + return SecurityType.UNSUPPORTED + + +@dataclass(frozen=True) +class Network: + ssid: str + strength: int + is_connected: bool + security_type: SecurityType + is_saved: bool + ip_address: str = "" # TODO: implement + + @classmethod + def from_dbus(cls, ssid: str, aps: list["AccessPoint"], is_saved: bool) -> "Network": + # we only want to show the strongest AP for each Network/SSID + strongest_ap = max(aps, key=lambda ap: ap.strength) + is_connected = any(ap.is_connected for ap in aps) + security_type = get_security_type(strongest_ap.flags, strongest_ap.wpa_flags, strongest_ap.rsn_flags) + + return cls( + ssid=ssid, + strength=strongest_ap.strength, + is_connected=is_connected and is_saved, + security_type=security_type, + is_saved=is_saved, + ) + + +def wifi_network_sort_key(network: Network, network_missing: bool = False) -> tuple[int, int]: + if network.is_connected: + return (0, 0) + if network_missing or network.strength <= 0: + return (2, 0) + return (1, -network.strength) + + +@dataclass(frozen=True) +class AccessPoint: + ssid: str + bssid: str + strength: int + is_connected: bool + flags: int + wpa_flags: int + rsn_flags: int + ap_path: str + + @classmethod + def from_dbus(cls, ap_props: dict[str, tuple[str, Any]], ap_path: str, active_ap_path: str) -> "AccessPoint": + ssid = bytes(ap_props['Ssid'][1]).decode("utf-8", "replace") + bssid = str(ap_props['HwAddress'][1]) + strength = int(ap_props['Strength'][1]) + flags = int(ap_props['Flags'][1]) + wpa_flags = int(ap_props['WpaFlags'][1]) + rsn_flags = int(ap_props['RsnFlags'][1]) + + return cls( + ssid=ssid, + bssid=bssid, + strength=strength, + is_connected=ap_path == active_ap_path, + flags=flags, + wpa_flags=wpa_flags, + rsn_flags=rsn_flags, + ap_path=ap_path, + ) + + +class WifiManager: + def __init__(self): + self._networks: list[Network] = [] # a network can be comprised of multiple APs + self._active = True # used to not run when not in settings + self._exit = False + + # DBus connections + self._router_main: DBusRouter | None = None # used by scanner / general method calls + self._conn_monitor = None # used by state monitor thread + self._nm: DBusAddress | None = None + self._dbus_connected = False + self._last_dbus_connect_log = 0.0 + + # Store wifi device path + self._wifi_device: str | None = None + + # State + self._connecting_to_ssid: str = "" + self._ipv4_address: str = "" + self._current_network_metered: MeteredType = MeteredType.UNKNOWN + self._tethering_password: str = "" + self._ipv4_forward = False + self._tethering_transition = False + + self._last_network_update: float = 0.0 + self._callback_queue: list[Callable] = [] + self._scanning = False + + self._tethering_ssid = "weedle" + if Params is not None: + dongle_id = Params().get("DongleId") + if dongle_id: + self._tethering_ssid += "-" + dongle_id[:4] + + # Callbacks + self._need_auth: list[Callable[[str], None]] = [] + self._activated: list[Callable[[], None]] = [] + self._forgotten: list[Callable[[], None]] = [] + self._networks_updated: list[Callable[[list[Network]], None]] = [] + self._disconnected: list[Callable[[], None]] = [] + + self._lock = threading.Lock() + self._dbus_lock = threading.Lock() + self._bootstrap_thread = threading.Thread(target=self._bootstrap_loop, daemon=True) + self._scan_thread = threading.Thread(target=self._network_scanner, daemon=True) + self._state_thread = threading.Thread(target=self._monitor_state, daemon=True) + self._initialize() + atexit.register(self.stop) + + def _initialize(self): + self._bootstrap_thread.start() + self._scan_thread.start() + self._state_thread.start() + + def _bootstrap_loop(self): + while not self._exit: + if not self._ensure_wifi_ready(): + time.sleep(1) + continue + + if self._dbus_connected: + time.sleep(1) + continue + + try: + if Params is not None and self._tethering_ssid not in self._get_connections(): + self._add_tethering_connection() + self._tethering_password = self._get_tethering_password() + self._dbus_connected = True + cloudlog.debug("WifiManager initialized") + except Exception: + cloudlog.exception("WifiManager initialization failed") + self._reset_dbus() + time.sleep(1) + + def _connect_dbus(self) -> bool: + with self._dbus_lock: + if self._router_main is not None and self._conn_monitor is not None and self._nm is not None: + return True + + dbus_socket = next((path for path in SYSTEM_DBUS_SOCKET_CANDIDATES if os.path.exists(path)), None) + if dbus_socket is not None: + os.environ["DBUS_SYSTEM_BUS_ADDRESS"] = f"unix:path={dbus_socket}" + + try: + router_main = DBusRouter(open_dbus_connection_threading(bus="SYSTEM")) + conn_monitor = open_dbus_connection_blocking(bus="SYSTEM") + except FileNotFoundError: + now = time.monotonic() + if now - self._last_dbus_connect_log > 10: + cloudlog.warning(f"WifiManager waiting for system D-Bus socket={dbus_socket}") + self._last_dbus_connect_log = now + return False + except Exception: + cloudlog.exception("WifiManager failed to connect to system D-Bus") + return False + + self._router_main = router_main + self._conn_monitor = conn_monitor + self._nm = DBusAddress(NM_PATH, bus_name=NM, interface=NM_IFACE) + self._last_dbus_connect_log = 0.0 + return True + + def _reset_dbus(self): + with self._dbus_lock: + router_main = self._router_main + conn_monitor = self._conn_monitor + self._router_main = None + self._conn_monitor = None + self._nm = None + self._wifi_device = None + self._dbus_connected = False + + if router_main is not None: + try: + router_main.close() + except Exception: + pass + try: + router_main.conn.close() + except Exception: + pass + + if conn_monitor is not None: + try: + conn_monitor.close() + except Exception: + pass + + def _ensure_wifi_ready(self) -> bool: + if not self._connect_dbus(): + return False + + if self._wifi_device is not None: + return True + + self._wait_for_wifi_device() + return self._wifi_device is not None + + def add_callbacks(self, need_auth: Callable[[str], None] | None = None, + activated: Callable[[], None] | None = None, + forgotten: Callable[[], None] | None = None, + networks_updated: Callable[[list[Network]], None] | None = None, + disconnected: Callable[[], None] | None = None): + if need_auth is not None: + self._need_auth.append(need_auth) + if activated is not None: + self._activated.append(activated) + if forgotten is not None: + self._forgotten.append(forgotten) + if networks_updated is not None: + self._networks_updated.append(networks_updated) + if disconnected is not None: + self._disconnected.append(disconnected) + + def get_networks(self) -> list[Network]: + # Snapshot of the current scan results — used by non-UI consumers + # (e.g. the BLE setup transport) that can't drive process_callbacks(). + with self._lock: + return list(self._networks) + + @property + def ipv4_address(self) -> str: + return self._ipv4_address + + @property + def current_network_metered(self) -> MeteredType: + return self._current_network_metered + + @property + def tethering_password(self) -> str: + return self._tethering_password + + @property + def is_scanning(self) -> bool: + return self._scanning + + def _enqueue_callbacks(self, cbs: list[Callable], *args): + for cb in cbs: + self._callback_queue.append(lambda _cb=cb: _cb(*args)) + + def process_callbacks(self): + # Call from UI thread to run any pending callbacks + to_run, self._callback_queue = self._callback_queue, [] + for cb in to_run: + cb() + + def set_active(self, active: bool): + self._active = active + + # Scan immediately if we haven't scanned in a while + if active and time.monotonic() - self._last_network_update > SCAN_PERIOD_SECONDS / 2: + self._last_network_update = 0.0 + + def _monitor_state(self): + while not self._exit: + if not self._active: + time.sleep(1) + continue + + if not self._ensure_wifi_ready(): + time.sleep(1) + continue + + conn_monitor = self._conn_monitor + wifi_device = self._wifi_device + if conn_monitor is None or wifi_device is None: + time.sleep(1) + continue + + rule = MatchRule( + type="signal", + interface=NM_DEVICE_IFACE, + member="StateChanged", + path=wifi_device, + ) + + try: + conn_monitor.send_and_get_reply(message_bus.AddMatch(rule)) + with conn_monitor.filter(rule, bufsize=SIGNAL_QUEUE_SIZE) as q: + while not self._exit and self._conn_monitor is conn_monitor and self._wifi_device == wifi_device: + if not self._active: + time.sleep(1) + continue + + try: + msg = conn_monitor.recv_until_filtered(q, timeout=1) + except TimeoutError: + continue + + new_state, previous_state, change_reason = msg.body + + if self._tethering_transition: + continue + + if new_state == NMDeviceState.NEED_AUTH and change_reason == NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT and len(self._connecting_to_ssid): + self.forget_connection(self._connecting_to_ssid, block=True) + self._enqueue_callbacks(self._need_auth, self._connecting_to_ssid) + self._connecting_to_ssid = "" + + elif new_state == NMDeviceState.ACTIVATED: + if len(self._activated): + self._update_networks() + self._enqueue_callbacks(self._activated) + self._connecting_to_ssid = "" + + elif new_state == NMDeviceState.DISCONNECTED and change_reason != NM_DEVICE_STATE_REASON_NEW_ACTIVATION: + self._connecting_to_ssid = "" + self._enqueue_callbacks(self._forgotten) + except Exception: + if not self._exit: + cloudlog.exception("WifiManager state monitor lost D-Bus connection") + self._reset_dbus() + time.sleep(1) + + def _network_scanner(self): + while not self._exit: + if self._active: + if time.monotonic() - self._last_network_update > SCAN_PERIOD_SECONDS: + self._scanning = True + try: + if self._ensure_wifi_ready(): + self._update_networks() + self._request_scan() + self._last_network_update = time.monotonic() + except Exception: + if not self._exit: + cloudlog.exception("WifiManager scanner lost D-Bus connection") + self._reset_dbus() + finally: + self._scanning = False + time.sleep(1 / 2.) + + def _wait_for_wifi_device(self): + while not self._exit: + device_path = self._get_adapter(NM_DEVICE_TYPE_WIFI) + if device_path is not None: + self._wifi_device = device_path + break + time.sleep(1) + + def _get_adapter(self, adapter_type: int) -> str | None: + # Return the first NetworkManager device path matching adapter_type + if self._router_main is None or self._nm is None: + return None + + try: + reply = self._router_main.send_and_get_reply(new_method_call(self._nm, 'GetDevices')) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f"NetworkManager GetDevices failed: {reply.body!r}") + return None + + if len(reply.body) != 1 or not isinstance(reply.body[0], (list, tuple)): + cloudlog.warning(f"Unexpected NetworkManager GetDevices reply: {reply.body!r}") + return None + + device_paths = reply.body[0] + for device_path in device_paths: + if not isinstance(device_path, str) or not device_path.startswith("/"): + cloudlog.warning(f"Skipping malformed NetworkManager device path: {device_path!r}") + continue + dev_addr = DBusAddress(device_path, bus_name=NM, interface=NM_DEVICE_IFACE) + dev_type = self._router_main.send_and_get_reply(Properties(dev_addr).get('DeviceType')).body[0][1] + if dev_type == adapter_type: + return str(device_path) + except Exception as e: + cloudlog.exception(f"Error getting adapter type {adapter_type}: {e}") + return None + + def _get_connections(self) -> dict[str, str]: + if self._router_main is None: + return {} + + settings_addr = DBusAddress(NM_SETTINGS_PATH, bus_name=NM, interface=NM_SETTINGS_IFACE) + known_connections = self._router_main.send_and_get_reply(new_method_call(settings_addr, 'ListConnections')).body[0] + + conns: dict[str, str] = {} + for conn_path in known_connections: + settings = self._get_connection_settings(conn_path) + + if len(settings) == 0: + cloudlog.warning(f'Failed to get connection settings for {conn_path}') + continue + + if "802-11-wireless" in settings: + ssid = settings['802-11-wireless']['ssid'][1].decode("utf-8", "replace") + if ssid != "": + conns[ssid] = conn_path + return conns + + def _get_active_connections(self): + if self._router_main is None or self._nm is None: + return [] + + return self._router_main.send_and_get_reply(Properties(self._nm).get('ActiveConnections')).body[0][1] + + def _get_connection_settings(self, conn_path: str) -> dict: + if self._router_main is None: + return {} + + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(conn_addr, 'GetSettings')) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to get connection settings: {reply}') + return {} + return dict(reply.body[0]) + + def _add_tethering_connection(self): + if self._router_main is None: + return + + connection = { + 'connection': { + 'type': ('s', '802-11-wireless'), + 'uuid': ('s', str(uuid.uuid4())), + 'id': ('s', 'Hotspot'), + 'autoconnect-retries': ('i', 0), + 'interface-name': ('s', 'wlan0'), + 'autoconnect': ('b', False), + }, + '802-11-wireless': { + 'band': ('s', 'bg'), + 'mode': ('s', 'ap'), + 'ssid': ('ay', self._tethering_ssid.encode("utf-8")), + }, + '802-11-wireless-security': { + 'group': ('as', ['ccmp']), + 'key-mgmt': ('s', 'wpa-psk'), + 'pairwise': ('as', ['ccmp']), + 'proto': ('as', ['rsn']), + 'psk': ('s', DEFAULT_TETHERING_PASSWORD), + }, + 'ipv4': { + 'method': ('s', 'shared'), + 'address-data': ('aa{sv}', [[ + ('address', ('s', TETHERING_IP_ADDRESS)), + ('prefix', ('u', 24)), + ]]), + 'gateway': ('s', TETHERING_IP_ADDRESS), + 'never-default': ('b', True), + }, + 'ipv6': {'method': ('s', 'ignore')}, + } + + settings_addr = DBusAddress(NM_SETTINGS_PATH, bus_name=NM, interface=NM_SETTINGS_IFACE) + self._router_main.send_and_get_reply(new_method_call(settings_addr, 'AddConnection', 'a{sa{sv}}', (connection,))) + + def connect_to_network(self, ssid: str, password: str, hidden: bool = False, security_type: "SecurityType | None" = None): + def worker(): + if not self._ensure_wifi_ready() or self._router_main is None: + cloudlog.warning(f"WiFi not ready while connecting to {ssid}") + return + + # Resolve security type from current scan if not explicitly provided + resolved_security = security_type + if resolved_security is None: + for net in self._networks: + if net.ssid == ssid: + resolved_security = net.security_type + break + + # Clear all connections that may already exist to the network we are connecting to + self._connecting_to_ssid = ssid + self.forget_connection(ssid, block=True) + + connection = { + 'connection': { + 'type': ('s', '802-11-wireless'), + 'uuid': ('s', str(uuid.uuid4())), + 'id': ('s', f'iqpilot connection {ssid}'), + 'autoconnect-retries': ('i', 0), + }, + '802-11-wireless': { + 'ssid': ('ay', ssid.encode("utf-8")), + 'hidden': ('b', hidden), + 'mode': ('s', 'infrastructure'), + }, + 'ipv4': { + 'method': ('s', 'auto'), + 'dns-priority': ('i', 600), + }, + 'ipv6': {'method': ('s', 'ignore')}, + } + + if password: + if resolved_security == SecurityType.WPA3: + # WPA3-Personal (SAE) — PMF is mandatory for WPA3 + connection['802-11-wireless-security'] = { + 'key-mgmt': ('s', 'sae'), + 'psk': ('s', password), + 'pmf': ('i', 2), + } + else: + # WPA/WPA2/mixed — NM negotiates SAE automatically in transition mode + connection['802-11-wireless-security'] = { + 'key-mgmt': ('s', 'wpa-psk'), + 'auth-alg': ('s', 'open'), + 'psk': ('s', password), + } + + settings_addr = DBusAddress(NM_SETTINGS_PATH, bus_name=NM, interface=NM_SETTINGS_IFACE) + self._router_main.send_and_get_reply(new_method_call(settings_addr, 'AddConnection', 'a{sa{sv}}', (connection,))) + self.activate_connection(ssid, block=True) + + threading.Thread(target=worker, daemon=True).start() + + def forget_connection(self, ssid: str, block: bool = False): + def worker(): + if self._router_main is None: + cloudlog.warning(f"WiFi not ready while forgetting {ssid}") + return + + conn_path = self._get_connections().get(ssid, None) + if conn_path is not None: + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + self._router_main.send_and_get_reply(new_method_call(conn_addr, 'Delete')) + + if len(self._forgotten): + self._update_networks() + self._enqueue_callbacks(self._forgotten) + + if block: + worker() + else: + threading.Thread(target=worker, daemon=True).start() + + def activate_connection(self, ssid: str, block: bool = False): + def worker(): + if not self._ensure_wifi_ready() or self._router_main is None: + cloudlog.warning(f"WiFi not ready while activating {ssid}") + return + + conn_path = self._get_connections().get(ssid, None) + if conn_path is not None: + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + self._set_device_autoconnect(True) + self._connecting_to_ssid = ssid + self._router_main.send(new_method_call(self._nm, 'ActivateConnection', 'ooo', + (conn_path, self._wifi_device, "/"))) + + if block: + worker() + else: + threading.Thread(target=worker, daemon=True).start() + + def disconnect_connection(self, ssid: str, block: bool = False): + def worker(): + if self._router_main is None: + cloudlog.warning(f"WiFi not ready while disconnecting {ssid}") + return + + if ssid not in self._get_connections(): + return + + # the profile stays saved and untouched; without clearing autoconnect on the device + # NetworkManager re-associates within seconds + self._set_device_autoconnect(False) + self._connecting_to_ssid = "" + self._deactivate_connection(ssid) + self._update_networks() + self._enqueue_callbacks(self._disconnected) + + if block: + worker() + else: + threading.Thread(target=worker, daemon=True).start() + + def _set_device_autoconnect(self, enabled: bool) -> None: + if self._router_main is None or self._wifi_device is None: + return + + dev_addr = DBusAddress(self._wifi_device, bus_name=NM, interface=NM_DEVICE_IFACE) + reply = self._router_main.send_and_get_reply(Properties(dev_addr).set('Autoconnect', 'b', enabled)) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to set device autoconnect={enabled}: {reply}') + + def _deactivate_connection(self, ssid: str): + target_conn_path = self._get_connections().get(ssid, None) + if target_conn_path is None: + return + + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if active_conn_path == target_conn_path: + self._router_main.send_and_get_reply(new_method_call(self._nm, 'DeactivateConnection', 'o', (active_conn,))) + return + + def _deactivate_active_wifi_client(self): + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + conn_type = self._router_main.send_and_get_reply(Properties(conn_addr).get('Type')).body[0][1] + if conn_type != '802-11-wireless': + continue + + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + tether_conn_path = self._get_connections().get(self._tethering_ssid, None) + if active_conn_path == tether_conn_path: + continue + + self._router_main.send_and_get_reply(new_method_call(self._nm, 'DeactivateConnection', 'o', (active_conn,))) + return + + def is_tethering_active(self) -> bool: + tether_conn_path = self._get_connections().get(self._tethering_ssid, None) + if tether_conn_path is None: + return False + + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if active_conn_path == tether_conn_path: + return True + + return False + + def set_tethering_password(self, password: str): + def worker(): + if not self._ensure_wifi_ready() or self._router_main is None: + cloudlog.warning("WiFi not ready while updating tethering password") + return + + conn_path = self._get_connections().get(self._tethering_ssid, None) + if conn_path is None: + cloudlog.warning('No tethering connection found') + return + + settings = self._get_connection_settings(conn_path) + if len(settings) == 0: + cloudlog.warning(f'Failed to get tethering settings for {conn_path}') + return + + settings['802-11-wireless-security']['psk'] = ('s', password) + + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(conn_addr, 'Update', 'a{sa{sv}}', (settings,))) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to update tethering settings: {reply}') + return + + self._tethering_password = password + if self.is_tethering_active(): + self.activate_connection(self._tethering_ssid, block=True) + + threading.Thread(target=worker, daemon=True).start() + + def _get_tethering_password(self) -> str: + if self._router_main is None: + return '' + + conn_path = self._get_connections().get(self._tethering_ssid, None) + if conn_path is None: + cloudlog.warning('No tethering connection found') + return '' + + reply = self._router_main.send_and_get_reply(new_method_call( + DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE), + 'GetSecrets', 's', ('802-11-wireless-security',) + )) + + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to get tethering password: {reply}') + return '' + + secrets = reply.body[0] + if '802-11-wireless-security' not in secrets: + return '' + + return str(secrets['802-11-wireless-security'].get('psk', ('s', ''))[1]) + + def set_ipv4_forward(self, enabled: bool): + self._ipv4_forward = enabled + + def set_tethering_active(self, active: bool): + def worker(): + if not self._ensure_wifi_ready(): + cloudlog.warning("WiFi not ready while changing tethering state") + return + + if active: + self._tethering_transition = True + self._connecting_to_ssid = "" + self._deactivate_active_wifi_client() + self.activate_connection(self._tethering_ssid, block=True) + time.sleep(5) + subprocess.run(["sudo", "sysctl", "net.ipv4.ip_forward=1"], check=False) + nat_rule = ["POSTROUTING", "-t", "nat", "-s", "192.168.43.0/24", "-o", "wwan0", "-j", "MASQUERADE"] + rule_check = subprocess.run(["sudo", "iptables-legacy", "-C", *nat_rule], check=False) + if rule_check.returncode != 0: + subprocess.run(["sudo", "iptables-legacy", "-A", *nat_rule], check=False) + else: + self._deactivate_connection(self._tethering_ssid) + self._tethering_transition = False + + threading.Thread(target=worker, daemon=True).start() + + def _update_current_network_metered(self) -> None: + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + self._current_network_metered = MeteredType.UNKNOWN + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + conn_type = self._router_main.send_and_get_reply(Properties(conn_addr).get('Type')).body[0][1] + + if conn_type == '802-11-wireless': + conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if conn_path == "/": + continue + + settings = self._get_connection_settings(conn_path) + + if len(settings) == 0: + cloudlog.warning(f'Failed to get connection settings for {conn_path}') + continue + + metered_prop = settings['connection'].get('metered', ('i', 0))[1] + if metered_prop == MeteredType.YES: + self._current_network_metered = MeteredType.YES + elif metered_prop == MeteredType.NO: + self._current_network_metered = MeteredType.NO + return + + def set_current_network_metered(self, metered: MeteredType): + def worker(): + if self._router_main is None: + cloudlog.warning("WiFi not ready while updating metered setting") + return + + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + conn_type = self._router_main.send_and_get_reply(Properties(conn_addr).get('Type')).body[0][1] + + if conn_type == '802-11-wireless' and not self.is_tethering_active(): + conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if conn_path == "/": + continue + + settings = self._get_connection_settings(conn_path) + + if len(settings) == 0: + cloudlog.warning(f'Failed to get connection settings for {conn_path}') + return + + settings['connection']['metered'] = ('i', int(metered)) + + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(conn_addr, 'Update', 'a{sa{sv}}', (settings,))) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to update tethering settings: {reply}') + return + + threading.Thread(target=worker, daemon=True).start() + + def _request_scan(self): + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + wifi_addr = DBusAddress(self._wifi_device, bus_name=NM, interface=NM_WIRELESS_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(wifi_addr, 'RequestScan', 'a{sv}', ({},))) + + if reply.header.message_type == MessageType.error: + cloudlog.warning(f"Failed to request scan: {reply}") + + def _update_networks(self): + with self._lock: + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + # returns '/' if no active AP + wifi_addr = DBusAddress(self._wifi_device, NM, interface=NM_WIRELESS_IFACE) + active_ap_path = self._router_main.send_and_get_reply(Properties(wifi_addr).get('ActiveAccessPoint')).body[0][1] + ap_paths = self._router_main.send_and_get_reply(new_method_call(wifi_addr, 'GetAllAccessPoints')).body[0] + + aps: dict[str, list[AccessPoint]] = {} + + for ap_path in ap_paths: + ap_addr = DBusAddress(ap_path, NM, interface=NM_ACCESS_POINT_IFACE) + ap_props = self._router_main.send_and_get_reply(Properties(ap_addr).get_all()) + + # some APs have been seen dropping off during iteration + if ap_props.header.message_type == MessageType.error: + cloudlog.warning(f"Failed to get AP properties for {ap_path}") + continue + + try: + ap = AccessPoint.from_dbus(ap_props.body[0], ap_path, active_ap_path) + if ap.ssid == "": + continue + + if ap.ssid not in aps: + aps[ap.ssid] = [] + + aps[ap.ssid].append(ap) + except Exception: + # catch all for parsing errors + cloudlog.exception(f"Failed to parse AP properties for {ap_path}") + + known_connections = self._get_connections() + networks = [Network.from_dbus(ssid, ap_list, ssid in known_connections) for ssid, ap_list in aps.items()] + # sort with quantized strength to reduce jumping + networks.sort(key=lambda n: (-n.is_connected, -round(n.strength / 100 * 2), n.ssid.lower())) + self._networks = networks + + self._update_ipv4_address() + self._update_current_network_metered() + + self._enqueue_callbacks(self._networks_updated, self._networks) + + def _update_ipv4_address(self): + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + self._ipv4_address = "" + + for conn_path in self._get_active_connections(): + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + conn_type = self._router_main.send_and_get_reply(Properties(conn_addr).get('Type')).body[0][1] + if conn_type == '802-11-wireless': + ip4config_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Ip4Config')).body[0][1] + + if ip4config_path != "/": + ip4config_addr = DBusAddress(ip4config_path, bus_name=NM, interface=NM_IP4_CONFIG_IFACE) + address_data = self._router_main.send_and_get_reply(Properties(ip4config_addr).get('AddressData')).body[0][1] + + for entry in address_data: + if 'address' in entry: + self._ipv4_address = entry['address'][1] + return + + def __del__(self): + self.stop() + + def update_gsm_settings(self, roaming: bool, apn: str, metered: bool): + """Update GSM settings for cellular connection""" + + def worker(): + try: + lte_connection_path = self._get_lte_connection_path() + if not lte_connection_path: + cloudlog.warning("No LTE connection found") + return + + settings = self._get_connection_settings(lte_connection_path) + + if len(settings) == 0: + cloudlog.warning(f"Failed to get connection settings for {lte_connection_path}") + return + + # Ensure dicts exist + if 'gsm' not in settings: + settings['gsm'] = {} + if 'connection' not in settings: + settings['connection'] = {} + + changes = False + # NetworkManager updates an active modem connection in place. Quectel + # modems keep the existing PDP bearer in that case, so an APN change + # does not take effect until LTE is disconnected and reactivated. + apn_settings_changed = False + auto_config = apn == "" + initial_eps_apn = apn if not auto_config else "" + + if settings['gsm'].get('auto-config', ('b', False))[1] != auto_config: + cloudlog.warning(f'Changing gsm.auto-config to {auto_config}') + settings['gsm']['auto-config'] = ('b', auto_config) + changes = True + apn_settings_changed = True + + if settings['gsm'].get('apn', ('s', ''))[1] != apn: + cloudlog.warning(f'Changing gsm.apn to {apn}') + settings['gsm']['apn'] = ('s', apn) + changes = True + apn_settings_changed = True + + if settings['gsm'].get('home-only', ('b', False))[1] == roaming: + cloudlog.warning(f'Changing gsm.home-only to {not roaming}') + settings['gsm']['home-only'] = ('b', not roaming) + changes = True + + if settings['gsm'].get('initial-eps-bearer-configure', ('b', False))[1] != bool(initial_eps_apn): + cloudlog.warning(f'Changing gsm.initial-eps-bearer-configure to {bool(initial_eps_apn)}') + settings['gsm']['initial-eps-bearer-configure'] = ('b', bool(initial_eps_apn)) + changes = True + apn_settings_changed = True + + if settings['gsm'].get('initial-eps-bearer-apn', ('s', ''))[1] != initial_eps_apn: + cloudlog.warning(f'Changing gsm.initial-eps-bearer-apn to {initial_eps_apn}') + settings['gsm']['initial-eps-bearer-apn'] = ('s', initial_eps_apn) + changes = True + apn_settings_changed = True + + # Unknown means NetworkManager decides + metered_int = int(MeteredType.UNKNOWN if metered else MeteredType.NO) + if settings['connection'].get('metered', ('i', 0))[1] != metered_int: + cloudlog.warning(f'Changing connection.metered to {metered_int}') + settings['connection']['metered'] = ('i', metered_int) + changes = True + + if changes: + # Update the connection settings (temporary update) + conn_addr = DBusAddress(lte_connection_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(conn_addr, 'UpdateUnsaved', 'a{sa{sv}}', (settings,))) + + if reply.header.message_type == MessageType.error: + cloudlog.warning(f"Failed to update GSM settings: {reply}") + return + + if apn_settings_changed: + self._restart_modem_connection(lte_connection_path) + else: + self._activate_modem_connection(lte_connection_path) + except Exception as e: + cloudlog.exception(f"Error updating GSM settings: {e}") + + threading.Thread(target=worker, daemon=True).start() + + def _get_lte_connection_path(self) -> str | None: + if PC or self._router_main is None: + return None + try: + settings_addr = DBusAddress(NM_SETTINGS_PATH, bus_name=NM, interface=NM_SETTINGS_IFACE) + known_connections = self._router_main.send_and_get_reply(new_method_call(settings_addr, 'ListConnections')).body[0] + + for conn_path in known_connections: + settings = self._get_connection_settings(conn_path) + if settings and settings.get('connection', {}).get('id', ('s', ''))[1] == 'lte': + return str(conn_path) + except Exception as e: + cloudlog.exception(f"Error finding LTE connection: {e}") + return None + + def _activate_modem_connection(self, connection_path: str): + try: + modem_device = self._get_adapter(NM_DEVICE_TYPE_MODEM) + if modem_device and connection_path: + self._router_main.send_and_get_reply(new_method_call(self._nm, 'ActivateConnection', 'ooo', (connection_path, modem_device, "/"))) + except Exception as e: + cloudlog.exception(f"Error activating modem connection: {e}") + + def _restart_modem_connection(self, connection_path: str): + """Reconnect LTE so a changed APN is used for a new PDP bearer.""" + try: + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if active_conn_path == connection_path: + cloudlog.warning("Restarting LTE connection to apply APN settings") + reply = self._router_main.send_and_get_reply(new_method_call(self._nm, 'DeactivateConnection', 'o', (active_conn,))) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f"Failed to deactivate LTE connection: {reply}") + return + + for _ in range(20): + if not self._is_connection_active(connection_path): + break + time.sleep(0.25) + else: + cloudlog.warning("LTE connection did not deactivate after APN change") + return + break + + self._activate_modem_connection(connection_path) + except Exception as e: + cloudlog.exception(f"Error restarting modem connection: {e}") + + def _is_connection_active(self, connection_path: str) -> bool: + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if active_conn_path == connection_path: + return True + return False + + def stop(self): + if not self._exit: + self._exit = True + if self._bootstrap_thread.is_alive(): + self._bootstrap_thread.join() + if self._scan_thread.is_alive(): + self._scan_thread.join() + if self._state_thread.is_alive(): + self._state_thread.join() + self._reset_dbus() diff --git a/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/version.py b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/version.py new file mode 100644 index 000000000..cb731d009 --- /dev/null +++ b/artifacts/iqpilot_hephaestusd_private/python/_iqclosure/iqpilot/system/version.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 +from dataclasses import dataclass +from functools import cache +import json +import os +import pathlib +import subprocess + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_commit_date + +RELEASE_IQ_BRANCHES = ['release', 'release-tici', 'release-new'] +TESTED_BRANCHES = RELEASE_IQ_BRANCHES +IQ_BRANCH_MIGRATIONS: dict[tuple[str, str], str] = {} + +BUILD_METADATA_FILENAME = "build.json" + +training_version: str = "0.2.0" +terms_version: str = "2" + + +UNKNOWN_VERSION = "0.0.0" + + +@cache +def get_version(path: str = BASEDIR) -> str: + try: + with open(os.path.join(path, "iqpilot", "common", "version.h")) as _versionf: + return _versionf.read().split('"')[1] + except (OSError, IndexError): + return UNKNOWN_VERSION + + +def get_release_notes(path: str = BASEDIR) -> str: + for rel in (("iqpilot", "docs", "CHANGELOG.md"), ("docs", "CHANGELOG.md")): + try: + with open(os.path.join(path, *rel)) as f: + return f.read().split('\n\n', 1)[0] + except OSError: + continue + return "" + + +@cache +def is_prebuilt(path: str = BASEDIR) -> bool: + return os.path.exists(os.path.join(path, 'prebuilt')) + + +@cache +def is_dirty(cwd: str = BASEDIR) -> bool: + if not get_origin() or not get_short_branch(): + return True + + dirty = False + try: + # Actually check dirty files + if not is_prebuilt(cwd): + # This is needed otherwise touched files might show up as modified + try: + subprocess.check_call(["git", "update-index", "--refresh"], cwd=cwd) + except subprocess.CalledProcessError: + pass + + branch = get_branch() + if not branch: + return True + dirty = (subprocess.call(["git", "diff-index", "--quiet", branch, "--"], cwd=cwd)) != 0 + except subprocess.CalledProcessError: + cloudlog.exception("git subprocess failed while checking dirty") + dirty = True + + return dirty + + +@dataclass +class OpenpilotMetadata: + version: str + release_notes: str + git_commit: str + git_origin: str + git_commit_date: str + build_style: str + is_dirty: bool # whether there are local changes + + @property + def short_version(self) -> str: + return self.version.split('-')[0] + + @property + def comma_remote(self) -> bool: + # note to fork maintainers, this is used for release metrics. please do not + # touch this to get rid of the orange startup alert. there's better ways to do that + return self.git_normalized_origin == "github.com/commaai/openpilot" + + @property + def iqpilot_remote(self) -> bool: + return self.git_normalized_origin in ("github.com/iqpilot/iqpilot", + "github.com/iqpilot/openpilot") + + @property + def git_normalized_origin(self) -> str: + return self.git_origin \ + .replace("git@", "", 1) \ + .replace(".git", "", 1) \ + .replace("https://", "", 1) \ + .replace(":", "/", 1) + + +@dataclass +class BuildMetadata: + channel: str + openpilot: OpenpilotMetadata + + @property + def tested_channel(self) -> bool: + return self.channel in TESTED_BRANCHES + + @property + def release_channel(self) -> bool: + return self.channel in RELEASE_IQ_BRANCHES + + @property + def canonical(self) -> str: + return f"{self.openpilot.version}-{self.openpilot.git_commit}-{self.openpilot.build_style}" + + @property + def ui_description(self) -> str: + return f"{self.openpilot.version} / {self.openpilot.git_commit[:6]} / {self.channel}" + + @property + def master_channel(self) -> bool: + return self.channel in RELEASE_IQ_BRANCHES + + @property + def development_channel(self) -> bool: + return self.channel == "dev" or self.channel.startswith("dev-") or self.channel.endswith("-prebuilt") + + @property + def channel_type(self) -> str: + if "-tici" in self.channel or self.channel in ("release-new" or "master-mici"): + return "tici" + elif self.development_channel: + return "development" + elif self.tested_channel: + return "staging" + elif self.master_channel: + return "master" + elif self.release_channel: + return "release" + else: + return "feature" + + +def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: + channel = build_metadata.get("channel", "unknown") + openpilot_metadata = build_metadata.get("openpilot", {}) + version = openpilot_metadata.get("version", "unknown") + release_notes = openpilot_metadata.get("release_notes", "unknown") + git_commit = openpilot_metadata.get("git_commit", "unknown") + git_origin = openpilot_metadata.get("git_origin", "unknown") + git_commit_date = openpilot_metadata.get("git_commit_date", "unknown") + build_style = openpilot_metadata.get("build_style", "unknown") + return BuildMetadata(channel, + OpenpilotMetadata( + version=version, + release_notes=release_notes, + git_commit=git_commit, + git_origin=git_origin, + git_commit_date=git_commit_date, + build_style=build_style, + is_dirty=False)) + + +def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: + build_metadata_path = pathlib.Path(path) / BUILD_METADATA_FILENAME + + if build_metadata_path.exists(): + build_metadata = json.loads(build_metadata_path.read_text()) + return build_metadata_from_dict(build_metadata) + + git_folder = pathlib.Path(path) / ".git" + + if git_folder.exists(): + return BuildMetadata(get_short_branch(path), + OpenpilotMetadata( + version=get_version(path), + release_notes=get_release_notes(path), + git_commit=get_commit(path), + git_origin=get_origin(path), + git_commit_date=get_commit_date(path), + build_style="unknown", + is_dirty=is_dirty(path))) + + cloudlog.exception("unable to get build metadata") + raise Exception("invalid build metadata") + + +if __name__ == "__main__": + print(get_build_metadata()) diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..ee064e962 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..ec61f4849 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..8c8fa0305 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..e3018c11d Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..4a65717a2 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..339bbb687 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..23bfc0c99 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip new file mode 100644 index 000000000..bdc47cf56 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..5aa4c0ed2 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..0991bdfdb Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..d007bfb0c Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..0d96d04b1 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..acab67921 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..92f7eb82a Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..46776913c Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..07d143187 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..9b72d3ab6 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..ba238e278 Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..ed10ab96e Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..0a97a439b Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/__init__.py b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..b9b87c5fd Binary files /dev/null and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_iqvd_private/manifest.json b/artifacts/iqpilot_iqvd_private/manifest.json new file mode 100644 index 000000000..6ec6bd1a8 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/manifest.json @@ -0,0 +1,180 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "b5eb6863ec038e9d3dbd166ebd4ebce4e1bfdba80e399cc818660daa39121105", + "size": 548 + }, + "python/_iqclosure/iqpilot/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/gpio.py": { + "mode": 420, + "sha256": "01ba8cb32a644a2df545e764ba19bf1c7a320a217f983f8bac73b45d3a6891cf", + "size": 2408 + }, + "python/_iqclosure/iqpilot/common/i2c.py": { + "mode": 420, + "sha256": "4af8f9da7504a548d15f18b91d71c1379cb7c05c84be031448764cc49920ce68", + "size": 2449 + }, + "python/_iqclosure/iqpilot/common/logging_extra.py": { + "mode": 420, + "sha256": "ce9b3b3d8498d76e1c4c0352a3e98e72759bb7f367ff8629c1329c46040595c3", + "size": 6628 + }, + "python/_iqclosure/iqpilot/common/swaglog.py": { + "mode": 420, + "sha256": "0a133b4ef49f80b8890f115e81273f3f3e21351ae79f92dc02abc033e6d24027", + "size": 5274 + }, + "python/_iqclosure/iqpilot/common/time_helpers.py": { + "mode": 420, + "sha256": "c14cda1f84149d5ffa63a2adec5ca24126f77c1412a78412e5e3e68a6fd12bcf", + "size": 474 + }, + "python/_iqclosure/iqpilot/common/utils.py": { + "mode": 420, + "sha256": "6475ad94bc89252398c41e9eabf7929ba5eb8fa23a08ad7545e7a67b400af9f3", + "size": 8090 + }, + "python/_iqclosure/iqpilot/system/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/__init__.py": { + "mode": 420, + "sha256": "889391bffca493e74bfc108cae2976a53b644caca13ab600061fd29e9622c627", + "size": 695 + }, + "python/_iqclosure/iqpilot/system/hardware/base.py": { + "mode": 420, + "sha256": "a56293f7c23e503ff62d0d3ed39f1831b5544a65b37378165934361a5ddcd304", + "size": 4966 + }, + "python/_iqclosure/iqpilot/system/hardware/hw.py": { + "mode": 420, + "sha256": "32da46465ff0a232d21c6d54a54cf387db5e8441e568fe6c169abf9b8a016053", + "size": 3441 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/hardware.py": { + "mode": 420, + "sha256": "2520895597c375ae570bd04d5f189e874c89d642f3f07bdbeb20388cb6691433", + "size": 258 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py": { + "mode": 420, + "sha256": "98f46f8705259b00efae7274186b4e68201aad467a19de4f16d5f850d10ab0b5", + "size": 7585 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/hardware.py": { + "mode": 420, + "sha256": "65562d09e4a31e8ae43ee296b984f4fcc2675cf4187d9f134ec63ec1b55c9f7f", + "size": 25573 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py": { + "mode": 420, + "sha256": "d22858982705531732d5a20a45a73795496e5bbd9e23028c24609a7e58ac7aed", + "size": 890 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/lpa.py": { + "mode": 420, + "sha256": "2bffb84aef35892c4788e80b6d937bf2eebd15e226b72a82c4f39217667c1ca0", + "size": 53692 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/pins.py": { + "mode": 420, + "sha256": "b57ba4262e6a6a79f2db15c27356acf3e54f579a7edd13b483b2e16d140aca6d", + "size": 678 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "1c4be1980f8bea2ee72eae4765d6b380e7d495853014fd207eefd0ab1fbbf374", + "size": 67616 + }, + "python/iqpilot_private/iqvd/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "5b3d49e5f2ea6221f1fc64e3ac0b31374cd45a0cb051502c57d11670af5c492d", + "size": 135576 + }, + "python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "611bad42263b5da09629f37679ad63d677bc629a3c05beb29749b8ae9ee54d90", + "size": 67616 + }, + "python/iqpilot_private/iqvd/offload/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "7c97a0e3b954d686b1bb4b306a0821998136cd3e1295a2701f58224d2bfd72c8", + "size": 135296 + }, + "python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "f7c607f6487fab64ac9c9ee7545c941b6734f758e83525337396278ad1d93e56", + "size": 68232 + }, + "python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "a54404d60d084eced74741d5882290cb8a481d46930ce87b69cbd2276686af9d", + "size": 135976 + }, + "python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "94c127a4eae7c6e78efffac7bd409ef05969862193f261ad07d8c714fa5477dc", + "size": 68120 + }, + "python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "686706de59b099b7ed4d5951ef0b65d69f9fe8fcbe5b037bbcbc82aa58b50843", + "size": 204568 + }, + "runtime": { + "entries": { + "iqpilot_private.iqvd.iqvd": { + "path": "python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so": "3tT6t6kWFZJz0cXeZpiuaEVMgsqB8bn9lx5tSFWwFWWO8GrsU/OwN9wTGBfgZ8f4xsf3lZZTL4teYgFyw6QEDg==", + "python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so": "zgBeqo1BwRJaBJFbcefyxMDK4Lcsfrofzhr/BYowi+DFuDAeMKLnCHLqk0mtwub2xNs3oaRvMlT9B2jgCmD6Bw==", + "python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so": "jzl0UMSGy2phVm+iNXKEwqPPRAfaIi/UzV3Gs1Ddv30M+1yvR6rDT18HXIlfH7svVQt7pb71oKpOz0mcV7boCA==", + "python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so": "5MRbm702CIh4VRVxniKZGlsQkWm9l8+jv6gi3Tj8fPOZ4Pr5fiftDxdTe4QZbXstIrf7QwMvPoi20TT1bCQAAQ==", + "python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so": "uIzbsLsj9ew4UhnZr4x/WJYS9TiaNnULSRxYmDRazuGL+nQ6qhH+Z8rkmXeIw1dRH2CMC7IdVBnDiWjGqnFYAg==", + "python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so": "7b3N3vgx07TbxU2LwbwpOpUNKoEQ522wNdHjqgmnsLezN3o7TMZBeVcCE1Fjm3LL0XVnnprvMOwXev/RU07oBw==", + "python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so": "6QoWW88IhRZi5KOhjsMo17digxYIYyZWNxkoq3HRYWzp6887LbfXv/6YypQnMlPze7wtajygWcGpQXxwT8bBDQ==", + "python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so": "w9MhabKH5ZC9aCe4FOSkg2G4K2qjbqVpEXmeZhWDVffv/KuO5OeP+Njk37H8BKRWNU5/QKzE7tAr+CSGoQyXAw==" + } +} diff --git a/artifacts/iqpilot_iqvd_private/manifest.json.sig b/artifacts/iqpilot_iqvd_private/manifest.json.sig new file mode 100644 index 000000000..8b490c40d --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/manifest.json.sig @@ -0,0 +1 @@ +YxM3lrd+m/YgIAihoIQXsX/CvRRlYBfiYtIeJ3X1StASAgqUL1aDlb8FH7wiQbVV/BAbR9xUBs553sxqFnUAAQ== diff --git a/artifacts/iqpilot_iqvd_private/models/yolov8n.safetensors b/artifacts/iqpilot_iqvd_private/models/yolov8n.safetensors new file mode 100644 index 000000000..75b11808d --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/models/yolov8n.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5788ff529e26961281ebeb26facecaea38ec9a79a3ad2282995ab899eb905626 +size 6369332 diff --git a/artifacts/iqpilot_iqvd_private/models/yolov8n_qcom.pkl b/artifacts/iqpilot_iqvd_private/models/yolov8n_qcom.pkl new file mode 100644 index 000000000..9a9eb2e1a --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/models/yolov8n_qcom.pkl @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfa4fefd9277f8f480d17fdd225899656fd9810bd919f7fa0b5a79d978800a51 +size 30057443 diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_iqvd_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..265af07f4 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/_vendored.json @@ -0,0 +1,18 @@ +[ + "iqpilot.common.gpio", + "iqpilot.common.i2c", + "iqpilot.common.logging_extra", + "iqpilot.common.swaglog", + "iqpilot.common.time_helpers", + "iqpilot.common.utils", + "iqpilot.system.hardware", + "iqpilot.system.hardware.base", + "iqpilot.system.hardware.hw", + "iqpilot.system.hardware.pc.hardware", + "iqpilot.system.hardware.tici", + "iqpilot.system.hardware.tici.amplifier", + "iqpilot.system.hardware.tici.hardware", + "iqpilot.system.hardware.tici.iwlist", + "iqpilot.system.hardware.tici.lpa", + "iqpilot.system.hardware.tici.pins" +] diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/__init__.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/__init__.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/gpio.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/gpio.py new file mode 100644 index 000000000..8f025a2da --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/gpio.py @@ -0,0 +1,89 @@ +import os +import fcntl +import ctypes +from functools import cache + +def gpio_init(pin: int, output: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f: + f.write(b"out" if output else b"in") + except Exception as e: + print(f"Failed to set gpio {pin} direction: {e}") + +def gpio_set(pin: int, high: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f: + f.write(b"1" if high else b"0") + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + +def gpio_read(pin: int) -> bool | None: + val = None + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f: + val = bool(int(f.read().strip())) + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + + return val + +def gpio_export(pin: int) -> None: + if os.path.isdir(f"/sys/class/gpio/gpio{pin}"): + return + + try: + with open("/sys/class/gpio/export", 'w') as f: + f.write(str(pin)) + except Exception: + print(f"Failed to export gpio {pin}") + +@cache +def get_irq_action(irq: int) -> list[str]: + try: + with open(f"/sys/kernel/irq/{irq}/actions") as f: + actions = f.read().strip().split(',') + return actions + except FileNotFoundError: + return [] + +def get_irqs_for_action(action: str) -> list[str]: + ret = [] + with open("/proc/interrupts") as f: + for l in f.readlines(): + irq = l.split(':')[0].strip() + if irq.isdigit() and action in get_irq_action(irq): + ret.append(irq) + return ret + +# *** gpiochip *** + +class gpioevent_data(ctypes.Structure): + _fields_ = [ + ("timestamp", ctypes.c_uint64), + ("id", ctypes.c_uint32), + ] + +class gpioevent_request(ctypes.Structure): + _fields_ = [ + ("lineoffset", ctypes.c_uint32), + ("handleflags", ctypes.c_uint32), + ("eventflags", ctypes.c_uint32), + ("label", ctypes.c_char * 32), + ("fd", ctypes.c_int) + ] + +def gpiochip_get_ro_value_fd(label: str, gpiochip_id: int, pin: int) -> int: + GPIOEVENT_REQUEST_BOTH_EDGES = 0x3 + GPIOHANDLE_REQUEST_INPUT = 0x1 + GPIO_GET_LINEEVENT_IOCTL = 0xc030b404 + + rq = gpioevent_request() + rq.lineoffset = pin + rq.handleflags = GPIOHANDLE_REQUEST_INPUT + rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES + rq.label = label.encode('utf-8')[:31] + b'\0' + + fd = os.open(f"/dev/gpiochip{gpiochip_id}", os.O_RDONLY) + fcntl.ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, rq) + os.close(fd) + return int(rq.fd) diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/i2c.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/i2c.py new file mode 100644 index 000000000..1dfaa659a --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/i2c.py @@ -0,0 +1,81 @@ +import os +import fcntl +import ctypes + +# I2C constants from /usr/include/linux/i2c-dev.h +I2C_SLAVE = 0x0703 +I2C_SLAVE_FORCE = 0x0706 +I2C_SMBUS = 0x0720 + +# SMBus transfer types +I2C_SMBUS_READ = 1 +I2C_SMBUS_WRITE = 0 +I2C_SMBUS_BYTE_DATA = 2 +I2C_SMBUS_I2C_BLOCK_DATA = 8 + +I2C_SMBUS_BLOCK_MAX = 32 + + +class _I2cSmbusData(ctypes.Union): + _fields_ = [ + ("byte", ctypes.c_uint8), + ("word", ctypes.c_uint16), + ("block", ctypes.c_uint8 * (I2C_SMBUS_BLOCK_MAX + 2)), + ] + + +class _I2cSmbusIoctlData(ctypes.Structure): + _fields_ = [ + ("read_write", ctypes.c_uint8), + ("command", ctypes.c_uint8), + ("size", ctypes.c_uint32), + ("data", ctypes.POINTER(_I2cSmbusData)), + ] + + +class SMBus: + def __init__(self, bus: int): + self._fd = os.open(f'/dev/i2c-{bus}', os.O_RDWR) + + def __enter__(self) -> 'SMBus': + return self + + def __exit__(self, *args) -> None: + self.close() + + def close(self) -> None: + if hasattr(self, '_fd') and self._fd >= 0: + os.close(self._fd) + self._fd = -1 + + def _set_address(self, addr: int, force: bool = False) -> None: + ioctl_arg = I2C_SLAVE_FORCE if force else I2C_SLAVE + fcntl.ioctl(self._fd, ioctl_arg, addr) + + def _smbus_access(self, read_write: int, command: int, size: int, data: _I2cSmbusData) -> None: + ioctl_data = _I2cSmbusIoctlData(read_write, command, size, ctypes.pointer(data)) + fcntl.ioctl(self._fd, I2C_SMBUS, ioctl_data) + + def read_byte_data(self, addr: int, register: int, force: bool = False) -> int: + self._set_address(addr, force) + data = _I2cSmbusData() + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_BYTE_DATA, data) + return int(data.byte) + + def write_byte_data(self, addr: int, register: int, value: int, force: bool = False) -> None: + self._set_address(addr, force) + data = _I2cSmbusData() + data.byte = value & 0xFF + self._smbus_access(I2C_SMBUS_WRITE, register, I2C_SMBUS_BYTE_DATA, data) + + def read_i2c_block_data(self, addr: int, register: int, length: int, force: bool = False) -> list[int]: + self._set_address(addr, force) + if not (0 <= length <= I2C_SMBUS_BLOCK_MAX): + raise ValueError(f"length must be 0..{I2C_SMBUS_BLOCK_MAX}") + + data = _I2cSmbusData() + data.block[0] = length + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_I2C_BLOCK_DATA, data) + read_len = int(data.block[0]) or length + read_len = min(read_len, length) + return [int(b) for b in data.block[1 : read_len + 1]] diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/logging_extra.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/logging_extra.py new file mode 100644 index 000000000..ceaf083cd --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/logging_extra.py @@ -0,0 +1,249 @@ +import io +import os +import sys +import copy +import json +import time +import uuid +import socket +import logging +import traceback +import numpy as np +from threading import local +from collections import OrderedDict +from contextlib import contextmanager + +LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ + +def json_handler(obj): + if isinstance(obj, np.bool_): + return bool(obj) + # if isinstance(obj, (datetime.date, datetime.time)): + # return obj.isoformat() + return repr(obj) + +def json_robust_dumps(obj): + return json.dumps(obj, default=json_handler) + +class NiceOrderedDict(OrderedDict): + def __str__(self): + return json_robust_dumps(self) + +class SwagFormatter(logging.Formatter): + def __init__(self, swaglogger): + logging.Formatter.__init__(self, None, '%a %b %d %H:%M:%S %Z %Y') + + self.swaglogger = swaglogger + self.host = socket.gethostname() + + def format_dict(self, record): + record_dict = NiceOrderedDict() + + if isinstance(record.msg, dict): + record_dict['msg'] = record.msg + else: + try: + record_dict['msg'] = record.getMessage() + except (ValueError, TypeError): + record_dict['msg'] = [record.msg]+record.args + + record_dict['ctx'] = self.swaglogger.get_ctx() + + if record.exc_info: + record_dict['exc_info'] = self.formatException(record.exc_info) + + record_dict['level'] = record.levelname + record_dict['levelnum'] = record.levelno + record_dict['name'] = record.name + record_dict['filename'] = record.filename + record_dict['lineno'] = record.lineno + record_dict['pathname'] = record.pathname + record_dict['module'] = record.module + record_dict['funcName'] = record.funcName + record_dict['host'] = self.host + record_dict['process'] = record.process + record_dict['thread'] = record.thread + record_dict['threadName'] = record.threadName + record_dict['created'] = record.created + + return record_dict + + def format(self, record): + if self.swaglogger is None: + raise Exception("must set swaglogger before calling format()") + return json_robust_dumps(self.format_dict(record)) + +class SwagLogFileFormatter(SwagFormatter): + def fix_kv(self, k, v): + # append type to names to preserve legacy naming in logs + # avoids overlapping key namespaces with different types + # e.g. log.info() creates 'msg' -> 'msg$s' + # log.event() creates 'msg.health.logMonoTime' -> 'msg.health.logMonoTime$i' + # because overlapping namespace 'msg' caused problems + if isinstance(v, (str, bytes)): + k += "$s" + elif isinstance(v, float): + k += "$f" + elif isinstance(v, bool): + k += "$b" + elif isinstance(v, int): + k += "$i" + elif isinstance(v, dict): + nv = {} + for ik, iv in v.items(): + ik, iv = self.fix_kv(ik, iv) + nv[ik] = iv + v = nv + elif isinstance(v, list): + k += "$a" + return k, v + + def format(self, record): + if isinstance(record, str): + v = json.loads(record) + else: + v = self.format_dict(record) + + mk, mv = self.fix_kv('msg', v['msg']) + del v['msg'] + v[mk] = mv + v['id'] = uuid.uuid4().hex + + return json_robust_dumps(v) + +class SwagErrorFilter(logging.Filter): + def filter(self, record): + return record.levelno < logging.ERROR + +def _tmpfunc(): + return 0 + +def _srcfile(): + return os.path.normcase(_tmpfunc.__code__.co_filename) + +class SwagLogger(logging.Logger): + def __init__(self): + logging.Logger.__init__(self, "swaglog") + + self.global_ctx = {} + + self.log_local = local() + self.log_local.ctx = {} + + def local_ctx(self): + try: + return self.log_local.ctx + except AttributeError: + self.log_local.ctx = {} + return self.log_local.ctx + + def get_ctx(self): + return dict(self.local_ctx(), **self.global_ctx) + + @contextmanager + def ctx(self, **kwargs): + old_ctx = self.local_ctx() + self.log_local.ctx = copy.copy(old_ctx) or {} + self.log_local.ctx.update(kwargs) + try: + yield + finally: + self.log_local.ctx = old_ctx + + def bind(self, **kwargs): + self.local_ctx().update(kwargs) + + def bind_global(self, **kwargs): + self.global_ctx.update(kwargs) + + def event(self, event, *args, **kwargs): + evt = NiceOrderedDict() + evt['event'] = event + if args: + evt['args'] = args + evt.update(kwargs) + if 'error' in kwargs: + self.error(evt) + elif 'debug' in kwargs: + self.debug(evt) + else: + self.info(evt) + + def timestamp(self, event_name): + if LOG_TIMESTAMPS: + t = time.monotonic() + tstp = NiceOrderedDict() + tstp['timestamp'] = NiceOrderedDict() + tstp['timestamp']["event"] = event_name + tstp['timestamp']["time"] = t*1e9 + self.debug(tstp) + + def findCaller(self, stack_info=False, stacklevel=1): + """ + Find the stack frame of the caller so that we can note the source + file name, line number and function name. + """ + f = sys._getframe(3) + #On some versions of IronPython, currentframe() returns None if + #IronPython isn't run with -X:Frames. + if f is not None: + f = f.f_back + orig_f = f + while f and stacklevel > 1: + f = f.f_back + stacklevel -= 1 + if not f: + f = orig_f + rv = "(unknown file)", 0, "(unknown function)", None + while hasattr(f, "f_code"): + co = f.f_code + filename = os.path.normcase(co.co_filename) + + if filename == _srcfile: + f = f.f_back + continue + sinfo = None + if stack_info: + sio = io.StringIO() + sio.write('Stack (most recent call last):\n') + traceback.print_stack(f, file=sio) + sinfo = sio.getvalue() + if sinfo[-1] == '\n': + sinfo = sinfo[:-1] + sio.close() + rv = (co.co_filename, f.f_lineno, co.co_name, sinfo) + break + return rv + +if __name__ == "__main__": + log = SwagLogger() + + stdout_handler = logging.StreamHandler(sys.stdout) + stdout_handler.setLevel(logging.INFO) + stdout_handler.addFilter(SwagErrorFilter()) + log.addHandler(stdout_handler) + + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.ERROR) + log.addHandler(stderr_handler) + + log.info("asdasd %s", "a") + log.info({'wut': 1}) + log.warning("warning") + log.error("error") + log.critical("critical") + log.event("test", x="y") + + with log.ctx(): + stdout_handler.setFormatter(SwagFormatter(log)) + stderr_handler.setFormatter(SwagFormatter(log)) + log.bind(user="some user") + log.info("in req") + print("") + log.warning("warning") + print("") + log.error("error") + print("") + log.critical("critical") + print("") + log.event("do_req", a=1, b="c") diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/swaglog.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/swaglog.py new file mode 100644 index 000000000..f8fd9d392 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/swaglog.py @@ -0,0 +1,165 @@ +import logging +import os +import sys +import time +import warnings +from pathlib import Path +from logging.handlers import BaseRotatingHandler + +import zmq + +from iqpilot.common.logging_extra import SwagLogger, SwagFormatter, SwagLogFileFormatter +from iqpilot.system.hardware.hw import Paths + + +def get_file_handler(): + Path(Paths.swaglog_root()).mkdir(parents=True, exist_ok=True) + base_filename = os.path.join(Paths.swaglog_root(), "swaglog") + handler = SwaglogRotatingFileHandler(base_filename) + return handler + +class SwaglogRotatingFileHandler(BaseRotatingHandler): + def __init__(self, base_filename, interval=60, max_bytes=1024*256, backup_count=2500, encoding=None): + super().__init__(base_filename, mode="a", encoding=encoding, delay=True) + self.base_filename = base_filename + self.interval = interval # seconds + self.max_bytes = max_bytes + self.backup_count = backup_count + self.log_files = self.get_existing_logfiles() + log_indexes = [f.split(".")[-1] for f in self.log_files] + self.last_file_idx = max([int(i) for i in log_indexes if i.isdigit()] or [-1]) + self.last_rollover = None + self.doRollover() + + def _open(self): + self.last_rollover = time.monotonic() + self.last_file_idx += 1 + next_filename = f"{self.base_filename}.{self.last_file_idx:010}" + stream = open(next_filename, self.mode, encoding=self.encoding) + self.log_files.insert(0, next_filename) + return stream + + def get_existing_logfiles(self): + log_files = list() + base_dir = os.path.dirname(self.base_filename) + for fn in os.listdir(base_dir): + fp = os.path.join(base_dir, fn) + if fp.startswith(self.base_filename) and os.path.isfile(fp): + log_files.append(fp) + return sorted(log_files) + + def shouldRollover(self, record): + size_exceeded = self.max_bytes > 0 and self.stream.tell() >= self.max_bytes + time_exceeded = self.interval > 0 and self.last_rollover + self.interval <= time.monotonic() + return size_exceeded or time_exceeded + + def doRollover(self): + if self.stream: + self.stream.close() + self.stream = self._open() + + if self.backup_count > 0: + while len(self.log_files) > self.backup_count: + to_delete = self.log_files.pop() + if os.path.exists(to_delete): # just being safe, should always exist + os.remove(to_delete) + +class UnixDomainSocketHandler(logging.Handler): + def __init__(self, formatter): + logging.Handler.__init__(self) + self.setFormatter(formatter) + self.pid = None + + self.zctx = None + self.sock = None + + def __del__(self): + self.close() + + def close(self): + if self.sock is not None: + self.sock.close() + if self.zctx is not None: + self.zctx.term() + + def connect(self): + self.zctx = zmq.Context() + self.sock = self.zctx.socket(zmq.PUSH) + self.sock.setsockopt(zmq.LINGER, 10) + self.sock.connect(Paths.swaglog_ipc()) + self.pid = os.getpid() + + def emit(self, record): + if os.getpid() != self.pid: + # TODO suppresses warning about forking proc with zmq socket, fix root cause + warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*") + self.connect() + + msg = self.format(record).rstrip('\n') + # print("SEND".format(repr(msg))) + try: + s = chr(record.levelno)+msg + self.sock.send(s.encode('utf8'), zmq.NOBLOCK) + except zmq.error.Again: + # drop :/ + pass + + +class ForwardingHandler(logging.Handler): + def __init__(self, target_logger): + super().__init__() + self.target_logger = target_logger + + def emit(self, record): + self.target_logger.handle(record) + + +def add_file_handler(log): + """ + Function to add the file log handler to swaglog. + This can be used to store logs when logmessaged is not running. + """ + handler = get_file_handler() + handler.setFormatter(SwagLogFileFormatter(log)) + log.addHandler(handler) + + +cloudlog = log = SwagLogger() +log.setLevel(logging.DEBUG) + + +class PrettyConsoleFormatter(logging.Formatter): + # StreamHandler writes to stderr, so tty-gate on that + _COLOR = sys.stderr.isatty() and os.environ.get('NO_COLOR') is None + + def format(self, record): + msg = record.getMessage() + if not self._COLOR: + return f"{record.filename}: {msg}" + lvl = record.levelno + if lvl >= 50: lc, ln = "\033[1;38;5;196m", "CRIT" + elif lvl >= 40: lc, ln = "\033[1;38;5;203m", " ERR" + elif lvl >= 30: lc, ln = "\033[38;5;214m", "WARN" + elif lvl >= 20: lc, ln = "\033[38;5;110m", "info" + else: lc, ln = "\033[38;5;244m", " dbg" + body = f"\033[1;38;5;210m{msg}\033[0m" if lvl >= 40 else msg + src = "" if record.filename == "(unknown file)" else f"\033[2m{record.filename}\033[0m " + return f"{lc}{ln:>4}\033[0m {src}{body}" + + +outhandler = logging.StreamHandler() +outhandler.setFormatter(PrettyConsoleFormatter()) + +print_level = os.environ.get('LOGPRINT', 'warning') +if print_level == 'debug': + outhandler.setLevel(logging.DEBUG) +elif print_level == 'info': + outhandler.setLevel(logging.INFO) +elif print_level == 'warning': + outhandler.setLevel(logging.WARNING) + +ipchandler = UnixDomainSocketHandler(SwagFormatter(log)) + +log.addHandler(outhandler) +# logs are sent through IPC before writing to disk to prevent disk I/O blocking +log.addHandler(ipchandler) diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/time_helpers.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/time_helpers.py new file mode 100644 index 000000000..8564e270c --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/time_helpers.py @@ -0,0 +1,15 @@ +import datetime +from pathlib import Path + +MIN_DATE = datetime.datetime(year=2025, month=2, day=21) + +def min_date(): + # on systemd systems, the default time is the systemd build time + systemd_path = Path("/lib/systemd/systemd") + if systemd_path.exists(): + d = datetime.datetime.fromtimestamp(systemd_path.stat().st_mtime) + return max(MIN_DATE, d + datetime.timedelta(days=1)) + return MIN_DATE + +def system_time_valid(): + return datetime.datetime.now() > min_date() diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/utils.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/utils.py new file mode 100644 index 000000000..e0aa1605d --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/common/utils.py @@ -0,0 +1,271 @@ +import io +import os +import tempfile +import contextlib +import subprocess +import time +import functools +from subprocess import Popen, PIPE, TimeoutExpired +import zstandard as zstd + +LOG_COMPRESSION_LEVEL = 10 # little benefit up to level 15. level ~17 is a small step change + +class Timer: + """Simple lap timer for profiling sequential operations.""" + + def __init__(self): + self._start = self._lap = time.monotonic() + self._sections = {} + + def lap(self, name): + now = time.monotonic() + self._sections[name] = now - self._lap + self._lap = now + + @property + def total(self): + return time.monotonic() - self._start + + def fmt(self, duration): + parts = ", ".join(f"{k}={v:.2f}s" + (f" ({duration/v:.0f}x)" if k == 'render' and v > 0 else "") for k, v in self._sections.items()) + total = self.total + realtime = f"{duration/total:.1f}x realtime" if total > 0 else "N/A" + return f"{duration}s in {total:.1f}s ({realtime}) | {parts}" + +def sudo_write(val: str, path: str) -> None: + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + os.system(f"sudo chmod a+w {path}") + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + # fallback for debugfs files + os.system(f"sudo su -c 'echo {val} > {path}'") + + +def sudo_read(path: str) -> str: + try: + return subprocess.check_output(f"sudo cat {path}", shell=True, encoding='utf8').strip() + except Exception: + return "" + + +class MovingAverage: + def __init__(self, window_size: int): + self.window_size: int = window_size + self.buffer: list[float] = [0.0] * window_size + self.index: int = 0 + self.count: int = 0 + self.sum: float = 0.0 + + def add_value(self, new_value: float): + # Update the sum: subtract the value being replaced and add the new value + self.sum -= self.buffer[self.index] + self.buffer[self.index] = new_value + self.sum += new_value + + # Update the index in a circular manner + self.index = (self.index + 1) % self.window_size + + # Track the number of added values (for partial windows) + self.count = min(self.count + 1, self.window_size) + + def get_average(self) -> float: + if self.count == 0: + return float('nan') + return self.sum / self.count + + +class CallbackReader: + """Wraps a file, but overrides the read method to also + call a callback function with the number of bytes read so far.""" + + def __init__(self, f, callback, *args): + self.f = f + self.callback = callback + self.cb_args = args + self.total_read = 0 + + def __getattr__(self, attr): + return getattr(self.f, attr) + + def read(self, *args, **kwargs): + chunk = self.f.read(*args, **kwargs) + self.total_read += len(chunk) + self.callback(*self.cb_args, self.total_read) + return chunk + + +@contextlib.contextmanager +def atomic_write(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None, + overwrite: bool = False): + """Write to a file atomically using a temporary file in the same directory as the destination file.""" + dir_name = os.path.dirname(path) + + if not overwrite and os.path.exists(path): + raise FileExistsError(f"File '{path}' already exists. To overwrite it, set 'overwrite' to True.") + + with tempfile.NamedTemporaryFile(mode=mode, buffering=buffering, encoding=encoding, newline=newline, dir=dir_name, delete=False) as tmp_file: + yield tmp_file + tmp_file_name = tmp_file.name + os.replace(tmp_file_name, path) + + +def get_upload_stream(filepath: str, should_compress: bool) -> tuple[io.BufferedIOBase, int]: + if not should_compress: + file_size = os.path.getsize(filepath) + file_stream = open(filepath, "rb") + return file_stream, file_size + + # Compress the file on the fly + compressed_stream = io.BytesIO() + compressor = zstd.ZstdCompressor(level=LOG_COMPRESSION_LEVEL) + + with open(filepath, "rb") as f: + compressor.copy_stream(f, compressed_stream) + compressed_size = compressed_stream.tell() + compressed_stream.seek(0) + return compressed_stream, compressed_size + + +# remove all keys that end in DEPRECATED +def strip_deprecated_keys(d): + for k in list(d.keys()): + if isinstance(k, str): + if k.endswith('DEPRECATED'): + d.pop(k) + elif isinstance(d[k], dict): + strip_deprecated_keys(d[k]) + return d + + +def run_cmd(cmd: list[str], cwd=None, env=None) -> str: + return subprocess.check_output(cmd, encoding='utf8', cwd=cwd, env=env).strip() + + +def run_cmd_default(cmd: list[str], default: str = "", cwd=None, env=None) -> str: + try: + return run_cmd(cmd, cwd=cwd, env=env) + except subprocess.CalledProcessError: + return default + + +@contextlib.contextmanager +def managed_proc(cmd: list[str], env: dict[str, str]): + proc = Popen(cmd, env=env, stdout=PIPE, stderr=PIPE) + try: + yield proc + finally: + if proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=5) + except TimeoutExpired: + proc.kill() + + +def tabulate(tabular_data, headers=(), tablefmt="simple", floatfmt="g", stralign="left", numalign=None): + rows = [list(row) for row in tabular_data] + + def fmt(val): + if isinstance(val, str): + return val + if isinstance(val, (bool, int)): + return str(val) + try: + return format(val, floatfmt) + except (TypeError, ValueError): + return str(val) + + formatted = [[fmt(c) for c in row] for row in rows] + hdrs = [str(h) for h in headers] if headers else None + + ncols = max((len(r) for r in formatted), default=0) + if hdrs: + ncols = max(ncols, len(hdrs)) + if ncols == 0: + return "" + + for r in formatted: + r.extend([""] * (ncols - len(r))) + if hdrs: + hdrs.extend([""] * (ncols - len(hdrs))) + + widths = [0] * ncols + if hdrs: + for i in range(ncols): + widths[i] = len(hdrs[i]) + for row in formatted: + for i in range(ncols): + widths[i] = max(widths[i], max(len(ln) for ln in row[i].split('\n'))) + + def _align(s, w): + if stralign == "center": + return s.center(w) + return s.ljust(w) + + if tablefmt == "html": + parts = [""] + if hdrs: + parts.append("") + parts.append("" + "".join(f"" for h in hdrs) + "") + parts.append("") + parts.append("") + for row in formatted: + parts.append("" + "".join(f"" for c in row) + "") + parts.append("") + parts.append("
{h}
{c}
") + return "\n".join(parts) + + if tablefmt == "simple_grid": + def _sep(left, mid, right): + return left + mid.join("─" * (w + 2) for w in widths) + right + + top, mid_sep, bot = _sep("┌", "â”Ŧ", "┐"), _sep("├", "â”ŧ", "┤"), _sep("└", "┴", "┘") + + def _fmt_row(cells): + split = [c.split('\n') for c in cells] + nlines = max(len(s) for s in split) + for s in split: + s.extend([""] * (nlines - len(s))) + return ["│" + "│".join(f" {_align(split[i][li], widths[i])} " for i in range(ncols)) + "│" for li in range(nlines)] + + lines = [top] + if hdrs: + lines.extend(_fmt_row(hdrs)) + lines.append(mid_sep) + for ri, row in enumerate(formatted): + lines.extend(_fmt_row(row)) + lines.append(mid_sep if ri < len(formatted) - 1 else bot) + return "\n".join(lines) + + gap = " " + lines = [] + if hdrs: + lines.append(gap.join(h.ljust(w) for h, w in zip(hdrs, widths, strict=True))) + lines.append(gap.join("-" * w for w in widths)) + for row in formatted: + lines.append(gap.join(_align(row[i], widths[i]) for i in range(ncols))) + return "\n".join(lines) + + +def retry(attempts=3, delay=1.0, ignore_failure=False): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + for _ in range(attempts): + try: + return func(*args, **kwargs) + except Exception: + print(f"{func.__name__} failed, trying again") + time.sleep(delay) + + if ignore_failure: + print(f"{func.__name__} failed after retry") + else: + raise Exception(f"{func.__name__} failed after retry") + return wrapper + return decorator diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/__init__.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py new file mode 100644 index 000000000..1338aa2cf --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py @@ -0,0 +1,22 @@ +import os +from typing import cast + +from iqpilot.system.hardware.base import HardwareBase +from iqpilot.system.hardware.tici.hardware import Tici +from iqpilot.system.hardware.pc.hardware import Pc + +TICI = os.path.isfile('/TICI') +AGNOS = os.path.isfile('/AGNOS') +PC = not TICI + + +if TICI: + HARDWARE = cast(HardwareBase, Tici()) +else: + HARDWARE = cast(HardwareBase, Pc()) + +# Only comma 3/3X expose the DMA-BUF EGL extensions used by the zero-copy +# camera renderer and the direct EGL frame-pacing calls. /TICI is also present +# on comma 4, so it identifies the AGNOS hardware family rather than this GPU +# capability. +EGL_DMA_BUF_SUPPORTED = TICI and HARDWARE.get_device_type() in ("tici", "tizi") diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/base.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/base.py new file mode 100644 index 000000000..217696e09 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/base.py @@ -0,0 +1,228 @@ +import os +from abc import abstractmethod, ABC +from dataclasses import dataclass, fields + +from iqpilot.cereal import log + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +class LPAError(RuntimeError): + pass + +class LPAProfileNotFoundError(LPAError): + pass + +@dataclass +class Profile: + iccid: str + nickname: str + enabled: bool + provider: str + +@dataclass +class ThermalZone: + # a zone from /sys/class/thermal/thermal_zone* + name: str # a.k.a type + scale: float = 1000. # scale to get degrees in C + zone_number = -1 + + def read(self) -> float: + if self.zone_number < 0: + for n in os.listdir("/sys/devices/virtual/thermal"): + if not n.startswith("thermal_zone"): + continue + with open(os.path.join("/sys/devices/virtual/thermal", n, "type")) as f: + if f.read().strip() == self.name: + self.zone_number = int(n.removeprefix("thermal_zone")) + break + + try: + with open(f"/sys/devices/virtual/thermal/thermal_zone{self.zone_number}/temp") as f: + return int(f.read()) / self.scale + except FileNotFoundError: + return 0 + +@dataclass +class ThermalConfig: + cpu: list[ThermalZone] | None = None + gpu: list[ThermalZone] | None = None + dsp: ThermalZone | None = None + pmic: list[ThermalZone] | None = None + memory: ThermalZone | None = None + intake: ThermalZone | None = None + exhaust: ThermalZone | None = None + case: ThermalZone | None = None + + def get_msg(self): + ret = {} + for f in fields(ThermalConfig): + v = getattr(self, f.name) + if v is not None: + if isinstance(v, list): + ret[f.name + "TempC"] = [x.read() for x in v] + else: + ret[f.name + "TempC"] = v.read() + return ret + +class LPABase(ABC): + @abstractmethod + def list_profiles(self) -> list[Profile]: + pass + + @abstractmethod + def get_active_profile(self) -> Profile | None: + pass + + @abstractmethod + def delete_profile(self, iccid: str) -> None: + pass + + @abstractmethod + def bootstrap(self) -> None: + pass + + @abstractmethod + def download_profile(self, qr: str, nickname: str | None = None) -> None: + pass + + @abstractmethod + def nickname_profile(self, iccid: str, nickname: str) -> None: + pass + + @abstractmethod + def switch_profile(self, iccid: str) -> None: + pass + + def is_comma_profile(self, iccid: str) -> bool: + return any(iccid.startswith(prefix) for prefix in ('8985235',)) + +class HardwareBase(ABC): + @staticmethod + def get_cmdline() -> dict[str, str]: + with open('/proc/cmdline') as f: + cmdline = f.read() + return {kv[0]: kv[1] for kv in [s.split('=') for s in cmdline.split(' ')] if len(kv) == 2} + + @staticmethod + def read_param_file(path, parser, default=0): + try: + with open(path) as f: + return parser(f.read()) + except Exception: + return default + + def booted(self) -> bool: + return True + + def reboot(self, reason=None): + print("REBOOT!") + + def uninstall(self): + print("uninstall") + + def get_os_version(self): + return None + + @abstractmethod + def get_device_type(self): + pass + + def get_imei(self, slot) -> str: + return "" + + def get_serial(self): + return "" + + def get_network_info(self): + return None + + def get_network_type(self): + return NetworkType.none + + def get_sim_info(self): + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + + def get_sim_lpa(self) -> LPABase: + raise NotImplementedError("SIM LPA not available") + + def get_network_strength(self, network_type): + return NetworkStrength.unknown + + def get_network_metered(self, network_type) -> bool: + return network_type not in (NetworkType.none, NetworkType.wifi, NetworkType.ethernet) + + def get_current_power_draw(self): + return 0 + + def get_som_power_draw(self): + return 0 + + def shutdown(self): + print("SHUTDOWN!") + + def get_thermal_config(self): + return ThermalConfig() + + def set_display_power(self, on: bool): + pass + + def set_screen_brightness(self, percentage): + pass + + def get_screen_brightness(self): + return 0 + + def set_power_save(self, powersave_enabled): + pass + + def get_gpu_usage_percent(self): + return 0 + + def get_modem_version(self): + return None + + def get_modem_temperatures(self): + return [] + + def initialize_hardware(self): + pass + + def configure_modem(self): + pass + + def reboot_modem(self): + pass + + def recover_sim_detection(self) -> bool: + return False + + def get_networks(self): + return None + + def has_internal_panda(self) -> bool: + return False + + def reset_internal_panda(self): + pass + + def recover_internal_panda(self): + pass + + def get_modem_data_usage(self): + return -1, -1 + + def get_voltage(self) -> float: + return 0. + + def get_current(self) -> float: + return 0. + + def set_ir_power(self, percent: int): + pass diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/hw.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/hw.py new file mode 100644 index 000000000..eba33dfd2 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/hw.py @@ -0,0 +1,131 @@ +import os +import platform +from pathlib import Path + +from iqpilot.system.hardware import PC + +DEFAULT_DOWNLOAD_CACHE_ROOT = "/tmp/comma_download_cache" + +class Paths: + _persist_root_cache: str | None = None + + @staticmethod + def _is_writable_persist_root(path: str) -> bool: + try: + os.makedirs(path, exist_ok=True) + comma_dir = os.path.join(path, "comma") + os.makedirs(comma_dir, exist_ok=True) + + probe_path = os.path.join(comma_dir, ".rw_probe") + with open(probe_path, "w") as f: + f.write("1") + os.remove(probe_path) + return True + except OSError: + return False + + @staticmethod + def comma_home() -> str: + return os.path.join(str(Path.home()), ".comma" + os.environ.get("OPENPILOT_PREFIX", "")) + + @staticmethod + def log_root() -> str: + if os.environ.get('LOG_ROOT', False): + return os.environ['LOG_ROOT'] + elif PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "realdata") + else: + return '/data/media/0/realdata/' + + @staticmethod + def log_root_external() -> str: + return '/mnt/external_realdata/' + + @staticmethod + def swaglog_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "log") + else: + return "/data/log/" + + @staticmethod + def swaglog_ipc() -> str: + return "ipc:///tmp/logmessage" + os.environ.get("OPENPILOT_PREFIX", "") + + @staticmethod + def download_cache_root() -> str: + if os.environ.get('COMMA_CACHE', False): + return os.environ['COMMA_CACHE'] + "/" + return DEFAULT_DOWNLOAD_CACHE_ROOT + os.environ.get("OPENPILOT_PREFIX", "") + "/" + + @staticmethod + def persist_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "persist") + + if Paths._persist_root_cache is not None: + return Paths._persist_root_cache + + for candidate in ("/persist", "/data/persist"): + if Paths._is_writable_persist_root(candidate): + Paths._persist_root_cache = candidate + return candidate + + # Keep previous behavior as a last resort. + Paths._persist_root_cache = "/persist" + return Paths._persist_root_cache + + @staticmethod + def stats_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats/" + + @staticmethod + def stats_iq_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats_iq/" + + @staticmethod + def config_root() -> str: + if PC: + return Paths.comma_home() + else: + return "/tmp/.comma" + + @staticmethod + def shm_path() -> str: + if PC and platform.system() == "Darwin": + return "/tmp" # This is not really shared memory on macOS, but it's the closest we can get + return "/dev/shm" + + @staticmethod + def model_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "models") + else: + return "/data/media/0/models" + + @staticmethod + def crash_log_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "community" / "crashes") + else: + return "/data/community/crashes" + + @staticmethod + def mapd_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "osm") + else: + return "/data/media/0/osm" + + @staticmethod + def screen_recordings_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "screen_recordings") + else: + return "/data/media/0/screen_recordings" diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py new file mode 100644 index 000000000..72ef2f235 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py @@ -0,0 +1,12 @@ +from iqpilot.cereal import log +from iqpilot.system.hardware.base import HardwareBase + +NetworkType = log.DeviceState.NetworkType + + +class Pc(HardwareBase): + def get_device_type(self): + return "pc" + + def get_network_type(self): + return NetworkType.wifi diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py new file mode 100644 index 000000000..48a34ea48 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +import time +from collections import namedtuple + +from iqpilot.common.i2c import SMBus + +# https://datasheets.maximintegrated.com/en/ds/MAX98089.pdf + +AmpConfig = namedtuple('AmpConfig', ['name', 'value', 'register', 'offset', 'mask']) +EQParams = namedtuple('EQParams', ['K', 'k1', 'k2', 'c1', 'c2']) + + +def configs_from_eq_params(base, eq_params): + return [ + AmpConfig("K (high)", (eq_params.K >> 8), base, 0, 0xFF), + AmpConfig("K (low)", (eq_params.K & 0xFF), base + 1, 0, 0xFF), + AmpConfig("k1 (high)", (eq_params.k1 >> 8), base + 2, 0, 0xFF), + AmpConfig("k1 (low)", (eq_params.k1 & 0xFF), base + 3, 0, 0xFF), + AmpConfig("k2 (high)", (eq_params.k2 >> 8), base + 4, 0, 0xFF), + AmpConfig("k2 (low)", (eq_params.k2 & 0xFF), base + 5, 0, 0xFF), + AmpConfig("c1 (high)", (eq_params.c1 >> 8), base + 6, 0, 0xFF), + AmpConfig("c1 (low)", (eq_params.c1 & 0xFF), base + 7, 0, 0xFF), + AmpConfig("c2 (high)", (eq_params.c2 >> 8), base + 8, 0, 0xFF), + AmpConfig("c2 (low)", (eq_params.c2 & 0xFF), base + 9, 0, 0xFF), + ] + + +BASE_CONFIG = [ + AmpConfig("MCLK prescaler", 0b01, 0x10, 4, 0b00110000), + AmpConfig("PM: enable speakers", 0b11, 0x4D, 4, 0b00110000), + AmpConfig("PM: enable DACs", 0b11, 0x4D, 0, 0b00000011), + AmpConfig("Enable PLL1", 0b1, 0x12, 7, 0b10000000), + AmpConfig("Enable PLL2", 0b1, 0x1A, 7, 0b10000000), + AmpConfig("DAI1: I2S mode", 0b00100, 0x14, 2, 0b01111100), + AmpConfig("DAI2: I2S mode", 0b00100, 0x1C, 2, 0b01111100), + AmpConfig("DAI1 Passband filtering: music mode", 0b1, 0x18, 7, 0b10000000), + AmpConfig("DAI1 voice mode gain (DV1G)", 0b00, 0x2F, 4, 0b00110000), + AmpConfig("DAI1 attenuation (DV1)", 0x0, 0x2F, 0, 0b00001111), + AmpConfig("DAI2 attenuation (DV2)", 0x0, 0x31, 0, 0b00001111), + AmpConfig("DAI2: DC blocking", 0b1, 0x20, 0, 0b00000001), + AmpConfig("DAI2: High sample rate", 0b0, 0x20, 3, 0b00001000), + AmpConfig("ALC enable", 0b1, 0x43, 7, 0b10000000), + AmpConfig("ALC/excursion limiter release time", 0b101, 0x43, 4, 0b01110000), + AmpConfig("ALC multiband enable", 0b1, 0x43, 3, 0b00001000), + AmpConfig("DAI1 EQ enable", 0b0, 0x49, 0, 0b00000001), + AmpConfig("DAI2 EQ clip detection disabled", 0b1, 0x32, 4, 0b00010000), + AmpConfig("DAI2 EQ attenuation", 0x5, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b100, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter lower corner freq", 0b00, 0x41, 0, 0b00000011), + AmpConfig("Excursion limiter threshold", 0b000, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x6, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b0, 0x46, 0, 0b00000001), + AmpConfig("Right DAC input mixer: DAI1 left", 0b0, 0x22, 3, 0b00001000), + AmpConfig("Right DAC input mixer: DAI1 right", 0b0, 0x22, 2, 0b00000100), + AmpConfig("Right DAC input mixer: DAI2 left", 0b1, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b0, 0x22, 0, 0b00000001), + AmpConfig("DAI1 audio port selector", 0b10, 0x16, 6, 0b11000000), + AmpConfig("DAI2 audio port selector", 0b01, 0x1E, 6, 0b11000000), + AmpConfig("Enable left digital microphone", 0b1, 0x48, 5, 0b00100000), + AmpConfig("Enable right digital microphone", 0b1, 0x48, 4, 0b00010000), + AmpConfig("Enhanced volume smoothing disabled", 0b0, 0x49, 7, 0b10000000), + AmpConfig("Volume adjustment smoothing disabled", 0b0, 0x49, 6, 0b01000000), + AmpConfig("Zero-crossing detection disabled", 0b0, 0x49, 5, 0b00100000), +] + +CONFIGS = { + "tici": [ + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Right speaker output volume", 0x1c, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b1, 0x49, 1, 0b00000010), + *configs_from_eq_params(0x84, EQParams(0x274F, 0xC0FF, 0x3BF9, 0x0B3C, 0x1656)), + *configs_from_eq_params(0x8E, EQParams(0x1009, 0xC6BF, 0x2952, 0x1C97, 0x30DF)), + *configs_from_eq_params(0x98, EQParams(0x0F75, 0xCBE5, 0x0ED2, 0x2528, 0x3E42)), + *configs_from_eq_params(0xA2, EQParams(0x091F, 0x3D4C, 0xCE11, 0x1266, 0x2807)), + *configs_from_eq_params(0xAC, EQParams(0x0A9E, 0x3F20, 0xE573, 0x0A8B, 0x3A3B)), + ], + "tizi": [ + AmpConfig("Left speaker output from left DAC", 0b1, 0x2B, 0, 0b11111111), + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Left Speaker Mixer Gain", 0b00, 0x2D, 0, 0b00000011), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Left speaker output volume", 0x17, 0x3D, 0, 0b00011111), + AmpConfig("Right speaker output volume", 0x17, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b0, 0x49, 1, 0b00000010), + AmpConfig("DAI2: DC blocking", 0b0, 0x20, 0, 0b00000001), + AmpConfig("ALC enable", 0b0, 0x43, 7, 0b10000000), + AmpConfig("DAI2 EQ attenuation", 0x2, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b001, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter threshold", 0b100, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x0, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b1, 0x46, 0, 0b00000001), + AmpConfig("Left DAC input mixer: DAI1 left", 0b0, 0x22, 7, 0b10000000), + AmpConfig("Left DAC input mixer: DAI1 right", 0b0, 0x22, 6, 0b01000000), + AmpConfig("Left DAC input mixer: DAI2 left", 0b1, 0x22, 5, 0b00100000), + AmpConfig("Left DAC input mixer: DAI2 right", 0b0, 0x22, 4, 0b00010000), + AmpConfig("Right DAC input mixer: DAI2 left", 0b0, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b1, 0x22, 0, 0b00000001), + AmpConfig("Volume adjustment smoothing disabled", 0b1, 0x49, 6, 0b01000000), + ], +} + + +class Amplifier: + AMP_I2C_BUS = 0 + AMP_ADDRESS = 0x10 + + def __init__(self, debug=False): + self.debug = debug + + def _get_shutdown_config(self, amp_disabled: bool) -> AmpConfig: + return AmpConfig("Global shutdown", 0b0 if amp_disabled else 0b1, 0x51, 7, 0b10000000) + + def _set_configs(self, configs: list[AmpConfig]) -> None: + with SMBus(self.AMP_I2C_BUS) as bus: + for config in configs: + if self.debug: + print(f"Setting \"{config.name}\" to {config.value}:") + + old_value = bus.read_byte_data(self.AMP_ADDRESS, config.register, force=True) + new_value = (old_value & (~config.mask)) | ((config.value << config.offset) & config.mask) + bus.write_byte_data(self.AMP_ADDRESS, config.register, new_value, force=True) + + if self.debug: + print(f" Changed {hex(config.register)}: {hex(old_value)} -> {hex(new_value)}") + + def set_configs(self, configs: list[AmpConfig]) -> bool: + tries = 15 + backoff = 0. + for i in range(tries): + try: + self._set_configs(configs) + return True + except OSError: + backoff += 0.1 + time.sleep(backoff) + print(f"Failed to set amp config, {tries - i - 1} retries left") + return False + + def set_global_shutdown(self, amp_disabled: bool) -> bool: + return self.set_configs([self._get_shutdown_config(amp_disabled), ]) + + def initialize_configuration(self, model: str) -> bool: + cfgs = [ + self._get_shutdown_config(True), + *BASE_CONFIG, + *CONFIGS[model], + self._get_shutdown_config(False), + ] + return self.set_configs(cfgs) + + +if __name__ == "__main__": + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + model = model.split('comma ')[-1] + + amp = Amplifier() + amp.initialize_configuration(model) diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py new file mode 100644 index 000000000..25cc74069 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py @@ -0,0 +1,741 @@ +import math +import os +import sys +import subprocess +import time +import tempfile +from enum import IntEnum +from functools import cached_property, lru_cache +from pathlib import Path + +from iqpilot.cereal import log +from iqpilot.common.utils import sudo_read, sudo_write +from iqpilot.common.gpio import gpio_set, gpio_init, get_irqs_for_action +from iqpilot.system.hardware.base import HardwareBase, LPABase, ThermalConfig, ThermalZone +from iqpilot.system.hardware.tici import iwlist +from iqpilot.system.hardware.tici.lpa import TiciLPA +from iqpilot.system.hardware.tici.pins import GPIO +from iqpilot.system.hardware.tici.amplifier import Amplifier + +NM = 'org.freedesktop.NetworkManager' +NM_CON_ACT = NM + '.Connection.Active' +NM_DEV = NM + '.Device' +NM_DEV_WL = NM + '.Device.Wireless' +NM_DEV_STATS = NM + '.Device.Statistics' +NM_AP = NM + '.AccessPoint' +DBUS_PROPS = 'org.freedesktop.DBus.Properties' + +MM = 'org.freedesktop.ModemManager1' +MM_MODEM = MM + ".Modem" +MM_MODEM_SIMPLE = MM + ".Modem.Simple" +MM_SIM = MM + ".Sim" + +class MM_MODEM_STATE(IntEnum): + FAILED = -1 + UNKNOWN = 0 + INITIALIZING = 1 + LOCKED = 2 + DISABLED = 3 + DISABLING = 4 + ENABLING = 5 + ENABLED = 6 + SEARCHING = 7 + REGISTERED = 8 + DISCONNECTING = 9 + CONNECTING = 10 + CONNECTED = 11 + +class NMActiveConnectionState(IntEnum): + UNKNOWN = 0 + ACTIVATING = 1 + ACTIVATED = 2 + DEACTIVATING = 3 + DEACTIVATED = 4 + +class NMMetered(IntEnum): + NM_METERED_UNKNOWN = 0 + NM_METERED_YES = 1 + NM_METERED_NO = 2 + NM_METERED_GUESS_YES = 3 + NM_METERED_GUESS_NO = 4 + +TIMEOUT = 0.1 +REFRESH_RATE_MS = 1000 + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +# https://developer.gnome.org/ModemManager/unstable/ModemManager-Flags-and-Enumerations.html#MMModemAccessTechnology +MM_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5 +MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14 + +# MMModemStateFailedReason +MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2 + + +def affine_irq(val, action): + irqs = get_irqs_for_action(action) + if len(irqs) == 0: + print(f"No IRQs found for '{action}'") + return + + for i in irqs: + sudo_write(str(val), f"/proc/irq/{i}/smp_affinity_list") + +@lru_cache +def get_device_type(): + # lru_cache and cache can cause memory leaks when used in classes + try: + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + except FileNotFoundError: + # off-device (e.g. the prebuilt build container fakes /TICI but has no + # devicetree); import must not crash. Not a real device type. + return "unknown" + return model.split('comma ')[-1] + +class Tici(HardwareBase): + @staticmethod + def _ensure_system_python_path() -> None: + system_site = "/usr/lib/python3/dist-packages" + if system_site not in sys.path and os.path.isdir(system_site): + sys.path.append(system_site) + + @staticmethod + def _run_direct_modem_command(command: str) -> None: + import serial + + last_error: Exception | None = None + for device in ("/dev/ttyUSB2", "/dev/ttyUSB3"): + if not os.path.exists(device): + continue + + try: + with serial.Serial(device, baudrate=9600, timeout=2) as modem: + modem.reset_input_buffer() + modem.write((command + "\r").encode("ascii")) + + deadline = time.monotonic() + 3.0 + while time.monotonic() < deadline: + line = modem.readline().decode(errors="ignore").strip() + if not line: + continue + if line == "OK": + return + if line == "ERROR" or "ERROR" in line: + raise RuntimeError(f"{device}: {line}") + raise TimeoutError(f"{device}: timed out waiting for modem response") + except Exception as e: + last_error = e + + if last_error is not None: + raise last_error + raise RuntimeError("No modem AT port available") + + @cached_property + def bus(self): + try: + import dbus + except ModuleNotFoundError: + self._ensure_system_python_path() + import dbus + return dbus.SystemBus() + + @cached_property + def nm(self): + return self.bus.get_object(NM, '/org/freedesktop/NetworkManager') + + @property # this should not be cached, in case the modemmanager restarts + def mm(self): + return self.bus.get_object(MM, '/org/freedesktop/ModemManager1') + + @cached_property + def amplifier(self): + if self.get_device_type() == "mici": + return None + if os.path.exists('/tmp/lite_hw') or os.environ.get('LITE') == '1': + return None + return Amplifier() + + def get_os_version(self): + with open("/VERSION") as f: + return f.read().strip() + + def get_device_type(self): + return get_device_type() + + def reboot(self, reason=None): + subprocess.check_output(["sudo", "reboot"]) + + def uninstall(self): + Path("/data/__system_reset__").touch() + os.sync() + self.reboot() + + def get_serial(self): + return self.get_cmdline()['androidboot.serialno'] + + def get_voltage(self): + with open("/sys/class/hwmon/hwmon1/in1_input") as f: + return int(f.read()) + + def get_current(self): + with open("/sys/class/hwmon/hwmon1/curr1_input") as f: + return int(f.read()) + + def set_ir_power(self, percent: int): + if self.get_device_type() in ("tici", "tizi"): + return + + value = int((percent / 100) * 300) + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write("0\n") + with open("/sys/class/leds/led:torch_2/brightness", "w") as f: + f.write(f"{value}\n") + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write(f"{value}\n") + + def get_network_type(self): + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_type = primary_connection.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if primary_type == '802-3-ethernet': + return NetworkType.ethernet + elif primary_type == '802-11-wireless': + return NetworkType.wifi + else: + active_connections = self.nm.Get(NM, 'ActiveConnections', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + for conn in active_connections: + c = self.bus.get_object(NM, conn) + tp = c.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if tp == 'gsm': + modem = self.get_modem() + modem_state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if modem_state < MM_MODEM_STATE.REGISTERED: + return NetworkType.none + access_t = modem.Get(MM_MODEM, 'AccessTechnologies', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if access_t >= MM_MODEM_ACCESS_TECHNOLOGY_LTE: + return NetworkType.cell4G + elif access_t >= MM_MODEM_ACCESS_TECHNOLOGY_UMTS: + return NetworkType.cell3G + else: + return NetworkType.cell2G + except Exception: + pass + + return NetworkType.none + + def get_modem(self): + objects = self.mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=TIMEOUT) + if not objects: + raise RuntimeError("ModemManager returned no modems") + modem_path = next(iter(objects)) + return self.bus.get_object(MM, modem_path) + + def get_wlan(self): + wlan_path = self.nm.GetDeviceByIpIface('wlan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wlan_path) + + def get_wwan(self): + wwan_path = self.nm.GetDeviceByIpIface('wwan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wwan_path) + + def get_sim_info(self): + modem = self.get_modem() + sim_path = modem.Get(MM_MODEM, 'Sim', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if sim_path == "/": + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + else: + sim = self.bus.get_object(MM, sim_path) + return { + 'sim_id': str(sim.Get(MM_SIM, 'SimIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'mcc_mnc': str(sim.Get(MM_SIM, 'OperatorIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'network_type': ["Unknown"], + 'sim_state': ["READY"], + 'data_connected': modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) == MM_MODEM_STATE.CONNECTED, + } + + def get_sim_lpa(self) -> LPABase: + return TiciLPA() + + def get_imei(self, slot): + if slot != 0: + return "" + + return str(self.get_modem().Get(MM_MODEM, 'EquipmentIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + + def get_network_info(self): + if self.get_device_type() == "mici": + return None + try: + modem = self.get_modem() + info = modem.Command("AT+QNWINFO", math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + extra = modem.Command('AT+QENG="servingcell"', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + if info and info.startswith('+QNWINFO: '): + info = info.replace('+QNWINFO: ', '').replace('"', '').split(',') + extra = "" if extra is None else extra.replace('+QENG: "servingcell",', '').replace('"', '') + state = "" if state is None else MM_MODEM_STATE(state).name + + if len(info) != 4: + return None + + technology, operator, band, channel = info + + return({ + 'technology': technology, + 'operator': operator, + 'band': band, + 'channel': int(channel), + 'extra': extra, + 'state': state, + }) + else: + return None + + def parse_strength(self, percentage): + if percentage < 25: + return NetworkStrength.poor + elif percentage < 50: + return NetworkStrength.moderate + elif percentage < 75: + return NetworkStrength.good + else: + return NetworkStrength.great + + def get_network_strength(self, network_type): + network_strength = NetworkStrength.unknown + + try: + if network_type == NetworkType.none: + pass + elif network_type == NetworkType.wifi: + wlan = self.get_wlan() + active_ap_path = wlan.Get(NM_DEV_WL, 'ActiveAccessPoint', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if active_ap_path != "/": + active_ap = self.bus.get_object(NM, active_ap_path) + strength = int(active_ap.Get(NM_AP, 'Strength', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + network_strength = self.parse_strength(strength) + else: # Cellular + modem = self.get_modem() + strength = int(modem.Get(MM_MODEM, 'SignalQuality', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)[0]) + network_strength = self.parse_strength(strength) + except Exception: + pass + + return network_strength + + def get_network_metered(self, network_type) -> bool: + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_devices = primary_connection.Get(NM_CON_ACT, 'Devices', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + for dev in primary_devices: + dev_obj = self.bus.get_object(NM, str(dev)) + metered_prop = dev_obj.Get(NM_DEV, 'Metered', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if network_type == NetworkType.wifi: + if metered_prop in [NMMetered.NM_METERED_YES, NMMetered.NM_METERED_GUESS_YES]: + return True + elif network_type in [NetworkType.cell2G, NetworkType.cell3G, NetworkType.cell4G, NetworkType.cell5G]: + if metered_prop == NMMetered.NM_METERED_NO: + return False + except Exception: + pass + + return super().get_network_metered(network_type) + + def get_modem_version(self): + try: + modem = self.get_modem() + return modem.Get(MM_MODEM, 'Revision', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + def get_modem_temperatures(self): + timeout = 0.2 # Default timeout is too short + try: + modem = self.get_modem() + temps = modem.Command("AT+QTEMP", math.ceil(timeout), dbus_interface=MM_MODEM, timeout=timeout) + return list(filter(lambda t: t != 255, map(int, temps.split(' ')[1].split(',')))) + except Exception: + return [] + + + def get_current_power_draw(self): + return (self.read_param_file("/sys/class/hwmon/hwmon1/power1_input", int) / 1e6) + + def get_som_power_draw(self): + return (self.read_param_file("/sys/class/power_supply/bms/voltage_now", int) * self.read_param_file("/sys/class/power_supply/bms/current_now", int) / 1e12) + + def shutdown(self): + os.system("sudo poweroff") + + def get_thermal_config(self): + intake, exhaust, case = None, None, None + if self.get_device_type() == "mici": + case = ThermalZone("case") + intake = ThermalZone("intake") + exhaust = ThermalZone("exhaust") + return ThermalConfig(cpu=[ThermalZone(f"cpu{i}-silver-usr") for i in range(4)] + + [ThermalZone(f"cpu{i}-gold-usr") for i in range(4)], + gpu=[ThermalZone("gpu0-usr"), ThermalZone("gpu1-usr")], + dsp=ThermalZone("compute-hvx-usr"), + memory=ThermalZone("ddr-usr"), + pmic=[ThermalZone("pm8998_tz"), ThermalZone("pm8005_tz")], + intake=intake, + exhaust=exhaust, + case=case) + + def set_display_power(self, on): + try: + with open("/sys/class/backlight/panel0-backlight/bl_power", "w") as f: + f.write("0" if on else "4") + except Exception: + pass + + def set_screen_brightness(self, percentage): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + val = int(percentage * (max_brightness / 100.)) + with open("/sys/class/backlight/panel0-backlight/brightness", "w") as f: + f.write(str(val)) + except Exception: + pass + + def get_screen_brightness(self): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + with open("/sys/class/backlight/panel0-backlight/brightness") as f: + return int(float(f.read()) / (max_brightness / 100.)) + except Exception: + return 0 + + def set_power_save(self, powersave_enabled): + # amplifier, 100mW at idle + if self.amplifier is not None: + self.amplifier.set_global_shutdown(amp_disabled=powersave_enabled) + if not powersave_enabled: + self.amplifier.initialize_configuration(self.get_device_type()) + + # *** CPU config *** + + # offline big cluster + for i in range(4, 8): + val = '0' if powersave_enabled else '1' + sudo_write(val, f'/sys/devices/system/cpu/cpu{i}/online') + + for n in ('0', '4'): + if powersave_enabled and n == '4': + continue + gov = 'ondemand' if powersave_enabled else 'performance' + sudo_write(gov, f'/sys/devices/system/cpu/cpufreq/policy{n}/scaling_governor') + + # *** IRQ config *** + + # GPU, modeld core + affine_irq(7, "kgsl-3d0") + + # camerad core + camera_irqs = ("a5", "cci", "cpas_camnoc", "cpas-cdm", "csid", "ife", "csid-lite", "ife-lite") + for n in camera_irqs: + affine_irq(6, n) + + def get_gpu_usage_percent(self): + try: + with open('/sys/class/kgsl/kgsl-3d0/gpubusy') as f: + used, total = f.read().strip().split() + return 100.0 * int(used) / int(total) + except Exception: + return 0 + + def initialize_hardware(self): + if self.amplifier is not None: + self.amplifier.initialize_configuration(self.get_device_type()) + + # Allow hardwared to write engagement status to kmsg + os.system("sudo chmod a+w /dev/kmsg") + + # Ensure fan gpio is enabled so fan runs until shutdown, also turned on at boot by the ABL + gpio_init(GPIO.SOM_ST_IO, True) + gpio_set(GPIO.SOM_ST_IO, 1) + + # *** IRQ config *** + + # mask off big cluster from default affinity + sudo_write("f", "/proc/irq/default_smp_affinity") + + # move these off the default core + affine_irq(1, "msm_vidc") # encoders + affine_irq(1, "i2c_geni") # sensors + + # *** GPU config *** + # https://github.com/commaai/agnos-kernel-sdm845/blob/master/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi#L216 + affine_irq(5, "fts_ts") # touch + affine_irq(5, "msm_drm") # display + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/min_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/max_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_bus_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_clk_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_rail_on") + sudo_write("1000", "/sys/class/kgsl/kgsl-3d0/idle_timer") + sudo_write("performance", "/sys/class/kgsl/kgsl-3d0/devfreq/governor") + sudo_write("710", "/sys/class/kgsl/kgsl-3d0/max_clock_mhz") + + # setup governors + sudo_write("performance", "/sys/class/devfreq/soc:qcom,cpubw/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu0/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu4/governor") + + # *** VIDC (encoder) config *** + sudo_write("N", "/sys/kernel/debug/msm_vidc/clock_scaling") + sudo_write("Y", "/sys/kernel/debug/msm_vidc/disable_thermal_mitigation") + + # pandad core + affine_irq(3, "spi_geni") # SPI + if "tici" in self.get_device_type(): + affine_irq(3, "xhci-hcd:usb3") + affine_irq(3, "xhci-hcd:usb1") + try: + pid = subprocess.check_output(["pgrep", "-f", "spi0"], encoding='utf8').strip() + subprocess.call(["sudo", "chrt", "-f", "-p", "1", pid]) + subprocess.call(["sudo", "taskset", "-pc", "3", pid]) + except subprocess.CalledProcessException as e: + print(str(e)) + + def configure_modem(self): + from iqpilot.common.params import Params + + sim_info = self.get_sim_info() + sim_id = sim_info.get('sim_id', '') + params = Params() + manual_apn = params.get("GsmApn", encoding="utf-8") or "" + metered_enabled = params.get_bool("GsmMetered") + + modem = self.get_modem() + try: + manufacturer = str(modem.Get(MM_MODEM, 'Manufacturer', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + except Exception: + manufacturer = None + + cmds = [] + is_comma_profile = self.get_sim_lpa().is_comma_profile(sim_id) + roaming_enabled = params.get_bool("GsmRoaming") + initial_eps_apn = "" if is_comma_profile else manual_apn + + if not is_comma_profile and params.get("GsmRoaming") is None: + params.put_bool("GsmRoaming", True) + roaming_enabled = True + + subprocess.call([ + "nmcli", "connection", "modify", "lte", + "gsm.auto-config", "no" if manual_apn else "yes", + "gsm.apn", manual_apn, + "gsm.home-only", "no" if roaming_enabled else "yes", + "gsm.network-id", "", + "gsm.initial-eps-bearer-configure", "yes" if initial_eps_apn else "no", + "gsm.initial-eps-bearer-apn", initial_eps_apn, + "connection.metered", "unknown" if metered_enabled else "no", + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + if self.get_device_type() in ("tici", "tizi"): + if initial_eps_apn: + subprocess.call(["mmcli", "-m", "any", f'--3gpp-set-initial-eps-bearer-settings=apn={initial_eps_apn}']) + else: + subprocess.call(["mmcli", "-m", "any", '--3gpp-set-initial-eps-bearer-settings=apn=']) + + cmds += [ + # configure modem as data-centric + 'AT+QNVW=5280,0,"0102000000000000"', + 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', + 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', + ] + if self.get_device_type() == "tizi": + cmds += [ + 'AT+QSIMDET=1,0', + 'AT+QSIMSTAT=1', + ] + elif manufacturer == 'Cavli Inc.': + cmds += [ + 'AT^SIMSWAP=1', # use SIM slot, instead of internal eSIM + 'AT$QCSIMSLEEP=0', # disable SIM sleep + 'AT$QCSIMCFG=SimPowerSave,0', # more sleep disable + + # ethernet config + 'AT$QCPCFG=usbNet,0', + 'AT$QCNETDEVCTL=3,1', + ] + else: + # this modem gets upset with too many AT commands + if sim_id is None or len(sim_id) == 0: + cmds += [ + # SIM sleep disable + 'AT$QCSIMSLEEP=0', + 'AT$QCSIMCFG=SimPowerSave,0', + + # ethernet config + 'AT$QCPCFG=usbNet,1', + ] + + for cmd in cmds: + try: + modem.Command(cmd, math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + + # eSIM prime + dest = "/etc/NetworkManager/system-connections/esim.nmconnection" + if self.get_sim_lpa().is_comma_profile(sim_id) and not os.path.exists(dest): + with open(Path(__file__).parent/'esim.nmconnection') as f, tempfile.NamedTemporaryFile(mode='w') as tf: + dat = f.read() + dat = dat.replace("sim-id=", f"sim-id={sim_id}") + tf.write(dat) + tf.flush() + + # needs to be root + os.system(f"sudo cp {tf.name} {dest}") + os.system(f"sudo nmcli con load {dest}") + + def recover_sim_detection(self) -> bool: + # A worn SIM-tray presence switch can read "removed" while the SIM pads still make + # contact; with hot-swap detect armed (AT+QSIMDET=1) the modem never powers the SIM + # and lands in failed/sim-missing. Disabling detect and rebooting the modem makes it + # probe the SIM electrically. Safe to retry on failure: firing disarms the QSIMDET + # gate, so a genuinely SIM-less device gets at most one extra modem reboot per boot. + if self.get_device_type() not in ("tici", "tizi"): + return False + + try: + modem = self.get_modem() + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if state != MM_MODEM_STATE.FAILED: + return False + reason = modem.Get(MM_MODEM, 'StateFailedReason', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if reason != MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: + return False + detect = str(modem.Command('AT+QSIMDET?', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT)).strip() + if not detect.startswith('+QSIMDET: 1'): + return False + modem.Command('AT+QSIMDET=0,0', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + modem.Command('AT+CFUN=1,1', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + return True + except Exception: + return False + + def reboot_modem(self): + modem = None + try: + modem = self.get_modem() + except Exception: + pass + + if modem is not None: + for state in (0, 1): + try: + modem.Command(f'AT+CFUN={state}', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + return + + for state in (0, 1): + try: + self._run_direct_modem_command(f"AT+CFUN={state}") + except Exception: + pass + + def get_networks(self): + r = {} + + wlan = iwlist.scan() + if wlan is not None: + r['wlan'] = wlan + + lte_info = self.get_network_info() + if lte_info is not None: + extra = lte_info['extra'] + + # ,"LTE",,,,,,,, + # ,,,,,,, + if 'LTE' in extra: + extra = extra.split(',') + try: + r['lte'] = [{ + "mcc": int(extra[3]), + "mnc": int(extra[4]), + "cid": int(extra[5], 16), + "nmr": [{"pci": int(extra[6]), "earfcn": int(extra[7])}], + }] + except (ValueError, IndexError): + pass + + return r + + def get_modem_data_usage(self): + try: + wwan = self.get_wwan() + + # Ensure refresh rate is set so values don't go stale + refresh_rate = wwan.Get(NM_DEV_STATS, 'RefreshRateMs', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if refresh_rate != REFRESH_RATE_MS: + u = type(refresh_rate) + wwan.Set(NM_DEV_STATS, 'RefreshRateMs', u(REFRESH_RATE_MS), dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + tx = wwan.Get(NM_DEV_STATS, 'TxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + rx = wwan.Get(NM_DEV_STATS, 'RxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + return int(tx), int(rx) + except Exception: + return -1, -1 + + def has_internal_panda(self): + return True + + def reset_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 0) + time.sleep(1) + gpio_set(GPIO.STM_RST_N, 0) + + def recover_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 1) + time.sleep(0.5) + gpio_set(GPIO.STM_RST_N, 0) + time.sleep(0.5) + gpio_set(GPIO.STM_BOOT0, 0) + + def booted(self): + # this normally boots within 8s, but on rare occasions takes 30+s + encoder_state = sudo_read("/sys/kernel/debug/msm_vidc/core0/info") + if "Core state: 0" in encoder_state and (time.monotonic() < 60*2): + return False + return True + +if __name__ == "__main__": + t = Tici() + t.configure_modem() + t.initialize_hardware() + t.set_power_save(False) + print(t.get_sim_info()) diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py new file mode 100644 index 000000000..1e7c428b4 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py @@ -0,0 +1,35 @@ +import subprocess + + +def scan(interface="wlan0"): + result = [] + try: + r = subprocess.check_output(["iwlist", interface, "scan"], encoding='utf8') + + mac = None + for line in r.split('\n'): + if "Address" in line: + # Based on the adapter eithere a percentage or dBm is returned + # Add previous network in case no dBm signal level was seen + if mac is not None: + result.append({"mac": mac}) + mac = None + + mac = line.split(' ')[-1] + elif "dBm" in line: + try: + level = line.split('Signal level=')[1] + rss = int(level.split(' ')[0]) + result.append({"mac": mac, "rss": rss}) + mac = None + except ValueError: + continue + + # Add last network if no dBm was found + if mac is not None: + result.append({"mac": mac}) + + return result + + except Exception: + return None diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py new file mode 100644 index 000000000..a636742d5 --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py @@ -0,0 +1,1482 @@ +#!/usr/bin/env python3 +# SGP.22 v2.3: https://www.gsma.com/solutions-and-impact/technologies/esim/wp-content/uploads/2021/07/SGP.22-v2.3.pdf + +import argparse +import atexit +import base64 +import hashlib +import json +import math +import os +import re +import requests +import serial +import subprocess +import sys +import time + +from collections.abc import Generator +from contextlib import contextmanager +from pathlib import Path +from typing import Literal +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.system.hardware.base import LPABase, LPAError, LPAProfileNotFoundError, Profile + +GSMA_CI_BUNDLE = str(Path(__file__).parent / 'gsma_ci_bundle.pem') + + +DEFAULT_DEVICE = "/dev/modem_at0" +DEFAULT_BAUD = 9600 +DEFAULT_TIMEOUT = 5.0 +# https://euicc-manual.osmocom.org/docs/lpa/applet-id/ +ISDR_AID = "A0000005591010FFFFFFFF8900000100" +ES10X_MSS = 120 +MM = "org.freedesktop.ModemManager1" +MM_MODEM = MM + ".Modem" + +# TLV Tags +TAG_ICCID = 0x5A +TAG_STATUS = 0x80 +TAG_EUICC_INFO = 0xBF20 +TAG_PREPARE_DOWNLOAD = 0xBF21 +TAG_PROFILE_INFO_LIST = 0xBF2D +TAG_EUICC_CHALLENGE = 0xBF2E +TAG_SET_NICKNAME = 0xBF29 +TAG_LIST_NOTIFICATION = 0xBF28 +TAG_RETRIEVE_NOTIFICATION = 0xBF2B +TAG_NOTIFICATION_METADATA = 0xBF2F +TAG_NOTIFICATION_SENT = 0xBF30 +TAG_ENABLE_PROFILE = 0xBF31 +TAG_DISABLE_PROFILE = 0xBF32 +TAG_DELETE_PROFILE = 0xBF33 +TAG_BPP = 0xBF36 +TAG_PROFILE_INSTALL_RESULT = 0xBF37 +TAG_AUTH_SERVER = 0xBF38 +TAG_CANCEL_SESSION = 0xBF41 + +STATE_LABELS = {0: "disabled", 1: "enabled", 255: "unknown"} +ICON_LABELS = {0: "jpeg", 1: "png", 255: "unknown"} +CLASS_LABELS = {0: "test", 1: "provisioning", 2: "operational", 255: "unknown"} +PROFILE_ERROR_CODES = { + 0x01: "iccidOrAidNotFound", 0x02: "profileNotInDisabledState", + 0x03: "disallowedByPolicy", 0x04: "wrongProfileReenabling", + 0x05: "catBusy", 0x06: "undefinedError", +} +AUTH_SERVER_ERROR_CODES = { + 0x01: "eUICCVerificationFailed", 0x02: "eUICCCertificateExpired", + 0x03: "eUICCCertificateRevoked", 0x05: "invalidServerSignature", + 0x06: "euiccCiPKUnknown", 0x0A: "matchingIdRefused", + 0x10: "insufficientMemory", +} +BPP_COMMAND_NAMES = { + 0: "initialiseSecureChannel", 1: "configureISDP", 2: "storeMetadata", + 3: "storeMetadata2", 4: "replaceSessionKeys", 5: "loadProfileElements", +} +BPP_ERROR_REASONS = { + 1: "incorrectInputValues", 2: "invalidSignature", 3: "invalidTransactionId", + 4: "unsupportedCrtValues", 5: "unsupportedRemoteOperationType", + 6: "unsupportedProfileClass", 7: "scp03tStructureError", 8: "scp03tSecurityError", + 9: "iccidAlreadyExistsOnEuicc", 10: "insufficientMemoryForProfile", + 11: "installInterrupted", 12: "peProcessingError", 13: "dataMismatch", + 14: "invalidNAA", +} +CANCEL_SESSION_REASON = { + 0: "endUserRejection", 1: "postponed", 2: "timeout", + 3: "pprNotAllowed", 127: "undefinedReason", +} + +ESIM_TLS_BUNDLE_ENV = "IQPILOT_ESIM_CA_BUNDLE" +ESIM_QESIM_INIT_ENV = "IQPILOT_ESIM_QESIM_INIT" +ESIM_EXCLUSIVE_MODEM_ENV = "IQPILOT_ESIM_EXCLUSIVE_MODEM" + + +def _ensure_dbus_import(): + try: + import dbus # noqa: F401 + return + except ModuleNotFoundError: + dist_packages = "/usr/lib/python3/dist-packages" + if dist_packages not in sys.path and os.path.isdir(dist_packages): + sys.path.append(dist_packages) + import dbus # noqa: F401 + + +def _tls_verify_option() -> bool | str: + # Default to the GSMA CI bundle used by the reference eSIM branch. + # Allow explicit override for local testing or forced system trust behavior. + override = os.getenv(ESIM_TLS_BUNDLE_ENV, "").strip() + if not override: + return GSMA_CI_BUNDLE + if override.lower() in ("0", "false", "off"): + return False + if override.lower() in ("1", "true", "on", "system"): + return True + return override + + +def b64e(data: bytes) -> str: + return base64.b64encode(data).decode("ascii") + + +def b64d(s: str) -> bytes: + return base64.b64decode(base64_trim(s)) + + +def _decode_apdu_response_blob(raw: str, label: str) -> bytes: + filtered = re.sub(r"[^0-9A-Fa-f]", "", raw) + if len(filtered) < 2 or len(filtered) % 2: + raise RuntimeError(f"Malformed {label} response payload") + return bytes.fromhex(filtered) + + +class AtClient: + def __init__(self, device: str, baud: int, timeout: float, verbose: bool) -> None: + self._device = device + self._baud = baud + self._timeout = timeout + self.verbose = verbose + self.channel: str | None = None + self._serial: serial.Serial | None = None + self._use_csim = False + self._has_qesim = False + self._qesim_lpa_enabled = False + try: + self._serial = serial.Serial(device, baudrate=baud, timeout=timeout) + self._disable_echo() + except (serial.SerialException, PermissionError, OSError): + self._serial = None + if self.verbose: + print(f"!! using ModemManager DBus AT transport for {device}", file=sys.stderr) + + def close(self) -> None: + try: + if self.channel: + try: + self.query(f"AT+CCHC={self.channel}") + except Exception as e: + if self.verbose: + print(f"!! ignoring channel close failure: {e}", file=sys.stderr) + finally: + self.channel = None + finally: + if self._serial is not None: + self._serial.close() + + @staticmethod + def _is_busy_open_error(error: Exception) -> bool: + text = str(error).lower() + return "errno 16" in text or "device or resource busy" in text + + def _disable_echo(self) -> None: + if self._serial is None: + return + self._serial.reset_input_buffer() + self._serial.write(b"ATE0\r") + time.sleep(0.1) + self._serial.reset_input_buffer() + + def _send(self, cmd: str) -> None: + if self.verbose: + print(f">> {cmd}", file=sys.stderr) + assert self._serial is not None + self._serial.write((cmd + "\r").encode("ascii")) + + def _expect(self) -> list[str]: + lines: list[str] = [] + while True: + assert self._serial is not None + raw = self._serial.readline() + if not raw: + raise TimeoutError("AT command timed out") + line = raw.decode(errors="ignore").strip() + if not line: + continue + if self.verbose: + print(f"<< {line}", file=sys.stderr) + if line == "OK": + return lines + if line == "ERROR": + raise RuntimeError("AT command failed") + if "ERROR" in line and line.startswith("+"): + # Catch +CME ERROR / +CMS ERROR and similar modem-specific failures. + raise RuntimeError(f"AT command failed: {line}") + lines.append(line) + + def _get_modem(self): + _ensure_dbus_import() + import dbus + + bus = dbus.SystemBus() + mm = bus.get_object(MM, '/org/freedesktop/ModemManager1') + objects = mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=self._timeout) + modem_paths = [path for path in objects.keys() if "/Modem/" in str(path)] + if not modem_paths: + raise RuntimeError("ModemManager returned no modems") + return bus.get_object(MM, modem_paths[0]) + + def _dbus_query(self, cmd: str) -> list[str]: + if self.verbose: + print(f"DBUS >> {cmd}", file=sys.stderr) + try: + result = str(self._get_modem().Command(cmd, math.ceil(self._timeout), dbus_interface=MM_MODEM, timeout=self._timeout)) + except Exception as e: + raise RuntimeError(f"AT command failed: {e}") from e + lines = [line.strip() for line in result.splitlines() if line.strip()] + if self.verbose: + for line in lines: + print(f"DBUS << {line}", file=sys.stderr) + return lines + + def _reconnect_serial(self) -> None: + self.channel = None + try: + if self._serial is not None: + self._serial.close() + except Exception: + pass + self._serial = serial.Serial(self._device, baudrate=self._baud, timeout=self._timeout) + self._disable_echo() + + def query(self, cmd: str) -> list[str]: + if self._serial is None: + return self._dbus_query(cmd) + try: + self._send(cmd) + return self._expect() + except (OSError, serial.SerialException) as e: + try: + self._reconnect_serial() + self._send(cmd) + return self._expect() + except Exception: + raise RuntimeError(f"AT transport error ({cmd}): {e}") from e + except TimeoutError as e: + raise TimeoutError(f"AT command timed out ({cmd})") from e + except RuntimeError as e: + raise RuntimeError(f"AT command failed ({cmd}): {e}") from e + + def _supports_qesim(self) -> bool: + try: + lines = self.query("AT+QESIM=?") + except Exception: + return False + return any(line.startswith("+QESIM:") for line in lines) + + def _set_quectel_lpa_mode(self) -> None: + self._has_qesim = self._supports_qesim() + self._qesim_lpa_enabled = False + if not self._has_qesim: + return + + # Some Quectel firmwares require enabling internal LPA mode before + # ISO7816 channel open commands (CCHO/CGLA) will succeed. + lpa_enable_cmds = ( + 'AT+QESIM="lpa_enable",1', + 'AT+QESIM="lpa_enable"', + ) + for cmd in lpa_enable_cmds: + try: + self.query(cmd) + self._qesim_lpa_enabled = True + break + except Exception: + continue + + # Keep BIP auth enabled when supported; this is needed by some firmware + # revisions for profile download/auth paths. + try: + lines = self.query('AT+QCFG="bip/auth"?') + needs_enable = any('"bip/auth",0' in line for line in lines) + if needs_enable: + self.query('AT+QCFG="bip/auth",1') + except Exception: + pass + + def ensure_capabilities(self) -> None: + if self._serial is None: + return + + # Some modem firmwares reject command test forms (e.g. AT+CCHO=?) + # while still supporting real execution. Keep these probes non-fatal. + self.query("AT") + # Keep IQ-specific QESIM initialization opt-in for debugging only. + # Default behavior should match upstream greatgitsby/esim transport flow. + if os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + try: + self.query("AT+CMEE=2") + except Exception: + pass + self._set_quectel_lpa_mode() + for command in ("AT+CCHO", "AT+CCHC", "AT+CGLA", "AT+CSIM"): + try: + self.query(f"{command}=?") + except Exception as e: + if self.verbose: + print(f"!! capability probe failed for {command}: {e}", file=sys.stderr) + + def open_isdr(self) -> None: + try: + self.query(f'AT+CCHC=1') + except Exception: + pass + ccho_candidates = [ + f'AT+CCHO="{ISDR_AID}"', + f"AT+CCHO={ISDR_AID}", + ] + for cmd in ccho_candidates: + try: + lines = self.query(cmd) + except Exception: + continue + for line in lines: + if line.startswith("+CCHO:") and (ch := line.split(":", 1)[1].strip()): + self.channel = ch + return + + # Fallback for modems that reject CCHO but allow APDUs over basic channel. + self.channel = "0" + aid_len = len(ISDR_AID) // 2 + select_isdr = bytes.fromhex(f"00A40400{aid_len:02X}{ISDR_AID}") + try: + _, sw1, sw2 = self.send_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + return + raise RuntimeError(f"ISD-R SELECT failed on basic channel SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + # Final fallback for modems that only support APDU via CSIM. + try: + _, sw1, sw2 = self._send_csim_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + self._use_csim = True + self.channel = "csim" + if self.verbose: + print("!! using CSIM APDU transport fallback", file=sys.stderr) + return + raise RuntimeError(f"ISD-R SELECT failed on CSIM SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + if self._has_qesim and not self._qesim_lpa_enabled and os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + raise RuntimeError( + "Modem exposes AT+QESIM but rejects LPA enable and ISD-R access; " + "this firmware/SKU likely does not provide usable eSIM functionality" + ) + raise RuntimeError("Failed to access eUICC ISD-R (CCHO/CGLA/CSIM all failed)") + + def send_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + for attempt in range(3): + try: + if not self.channel: + self.open_isdr() + if self._use_csim: + return self._send_csim_apdu(apdu) + hex_payload = apdu.hex().upper() + cmd = f'AT+CGLA={self.channel},{len(hex_payload)},"{hex_payload}"' + for query_attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CGLA:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CGLA") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if query_attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CGLA response") + except RuntimeError: + self.channel = None + self._use_csim = False + if attempt == 2: + raise + time.sleep(1 + attempt) + raise RuntimeError("send_apdu failed") + + def _send_csim_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + hex_payload = apdu.hex().upper() + cmd = f'AT+CSIM={len(hex_payload)},"{hex_payload}"' + for attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CSIM:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CSIM") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CSIM response") + + +# --- TLV utilities --- + +def iter_tlv(data: bytes, with_positions: bool = False) -> Generator: + idx, length = 0, len(data) + while idx < length: + start_pos = idx + tag = data[idx] + idx += 1 + if tag & 0x1F == 0x1F: # Multi-byte tag + tag_value = tag + while idx < length: + next_byte = data[idx] + idx += 1 + tag_value = (tag_value << 8) | next_byte + if not (next_byte & 0x80): + break + else: + tag_value = tag + if idx >= length: + break + size = data[idx] + idx += 1 + if size & 0x80: # Multi-byte length + num_bytes = size & 0x7F + if idx + num_bytes > length: + break + size = int.from_bytes(data[idx : idx + num_bytes], "big") + idx += num_bytes + if idx + size > length: + break + value = data[idx : idx + size] + idx += size + yield (tag_value, value, start_pos, idx) if with_positions else (tag_value, value) + + +def find_tag(data: bytes, target: int) -> bytes | None: + return next((v for t, v in iter_tlv(data) if t == target), None) + + +def encode_tlv(tag: int, value: bytes) -> bytes: + tag_bytes = bytes([(tag >> 8) & 0xFF, tag & 0xFF]) if tag > 255 else bytes([tag]) + vlen = len(value) + if vlen <= 127: + return tag_bytes + bytes([vlen]) + value + length_bytes = vlen.to_bytes((vlen.bit_length() + 7) // 8, "big") + return tag_bytes + bytes([0x80 | len(length_bytes)]) + length_bytes + value + + +def tbcd_to_string(raw: bytes) -> str: + return "".join(str(n) for b in raw for n in (b & 0x0F, b >> 4) if n <= 9) + + +def string_to_tbcd(s: str) -> bytes: + digits = [int(c) for c in s if c.isdigit()] + return bytes(digits[i] | ((digits[i + 1] if i + 1 < len(digits) else 0xF) << 4) for i in range(0, len(digits), 2)) + + +def base64_trim(s: str) -> str: + return "".join(c for c in s if c not in "\n\r \t") + + +# --- Shared helpers --- + +def _int_bytes(n: int) -> bytes: + """Encode a positive integer as minimal big-endian bytes (at least 1 byte).""" + return n.to_bytes((n.bit_length() + 7) // 8 or 1, "big") + + +def _extract_status(response: bytes, tag: int, name: str) -> int: + """Extract the status byte from a tagged ES10x response.""" + root = find_tag(response, tag) + if root is None: + raise RuntimeError(f"Missing {name}Response") + status = find_tag(root, TAG_STATUS) + if status is None: + raise RuntimeError(f"Missing status in {name}Response") + return status[0] + + +# Profile field decoders: TLV tag -> (field_name, decoder) +_PROFILE_FIELDS = { + TAG_ICCID: ("iccid", tbcd_to_string), + 0x4F: ("isdpAid", lambda v: v.hex().upper()), + 0x9F70: ("profileState", lambda v: STATE_LABELS.get(v[0], "unknown")), + 0x90: ("profileNickname", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x91: ("serviceProviderName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x92: ("profileName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x93: ("iconType", lambda v: ICON_LABELS.get(v[0], "unknown")), + 0x94: ("icon", b64e), + 0x95: ("profileClass", lambda v: CLASS_LABELS.get(v[0], "unknown")), +} + + +def _decode_profile_fields(data: bytes) -> dict: + """Parse known profile metadata TLV fields into a dict.""" + result = {} + for tag, value in iter_tlv(data): + if (field := _PROFILE_FIELDS.get(tag)): + result[field[0]] = field[1](value) + return result + + +# Notification field decoders: TLV tag -> (field_name, decoder) +_NOTIF_FIELDS = { + TAG_STATUS: ("seqNumber", lambda v: int.from_bytes(v, "big")), + 0x81: ("profileManagementOperation", lambda v: next((m for m in [0x80, 0x40, 0x20, 0x10] if len(v) >= 2 and v[1] & m), 0xFF)), + 0x0C: ("notificationAddress", lambda v: v.decode("utf-8", errors="ignore")), + TAG_ICCID: ("iccid", tbcd_to_string), +} + + +# --- ES10x command transport --- + +def es10x_command(client: AtClient, data: bytes) -> bytes: + response = bytearray() + sequence = 0 + offset = 0 + while offset < len(data): + chunk = data[offset : offset + ES10X_MSS] + offset += len(chunk) + is_last = offset == len(data) + apdu = bytes([0x80, 0xE2, 0x91 if is_last else 0x11, sequence & 0xFF, len(chunk)]) + chunk + segment, sw1, sw2 = client.send_apdu(apdu) + response.extend(segment) + while True: + if sw1 == 0x61: # More data available + segment, sw1, sw2 = client.send_apdu(bytes([0x80, 0xC0, 0x00, 0x00, sw2 or 0])) + response.extend(segment) + continue + if (sw1 & 0xF0) == 0x90: + break + raise RuntimeError(f"APDU failed with SW={sw1:02X}{sw2:02X}") + sequence += 1 + return bytes(response) + + +# --- ES9P HTTP --- + +def es9p_request(smdp_address: str, endpoint: str, payload: dict, error_prefix: str = "Request") -> dict: + if not system_time_valid(): + raise RuntimeError("System time is not set; TLS certificate validation requires a valid clock") + url = f"https://{smdp_address}/gsma/rsp2/es9plus/{endpoint}" + headers = {"User-Agent": "gsma-rsp-lpad", "X-Admin-Protocol": "gsma/rsp/v2.3.0", "Content-Type": "application/json"} + resp = requests.post(url, json=payload, headers=headers, timeout=30, verify=_tls_verify_option()) + resp.raise_for_status() + if not resp.content: + return {} + data = resp.json() + if "header" in data and "functionExecutionStatus" in data["header"]: + status = data["header"]["functionExecutionStatus"] + if status.get("status") == "Failed": + sd = status.get("statusCodeData", {}) + raise RuntimeError(f"{error_prefix} failed: {sd.get('reasonCode', 'unknown')}/{sd.get('subjectCode', 'unknown')} - {sd.get('message', 'unknown')}") + return data + + +# --- Profile operations --- + +def decode_profiles(blob: bytes) -> list[dict]: + root = find_tag(blob, TAG_PROFILE_INFO_LIST) + if root is None: + raise RuntimeError("Missing ProfileInfoList") + list_ok = find_tag(root, 0xA0) + if list_ok is None: + return [] + defaults = {name: None for name, _ in _PROFILE_FIELDS.values()} + return [{**defaults, **_decode_profile_fields(value)} for tag, value in iter_tlv(list_ok) if tag == 0xE3] + + +def list_profiles(client: AtClient) -> list[dict]: + return decode_profiles(es10x_command(client, bytes.fromhex("BF2D00"))) + + +def _profile_op(client: AtClient, tag: int, iccid: str, refresh: bool, action: str) -> None: + inner = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + if tag != TAG_DELETE_PROFILE: + if not refresh: + inner += encode_tlv(0x81, b'\x00') + inner = encode_tlv(0xA0, inner) + code = _extract_status(es10x_command(client, encode_tlv(tag, inner)), tag, f"{action.capitalize()}Profile") + if code == 0x00: + return + if code == 0x02 and tag != TAG_DELETE_PROFILE: + print(f"profile {iccid} already {action}d") + return + raise RuntimeError(f"{action.capitalize()}Profile failed: {PROFILE_ERROR_CODES.get(code, 'unknown')} (0x{code:02X})") + + +def enable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_ENABLE_PROFILE, iccid, refresh, "enable") + + +def disable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_DISABLE_PROFILE, iccid, refresh, "disable") + + +def delete_profile(client: AtClient, iccid: str) -> None: + _profile_op(client, TAG_DELETE_PROFILE, iccid, True, "delete") + + +def set_profile_nickname(client: AtClient, iccid: str, nickname: str) -> None: + nickname_bytes = nickname.encode("utf-8") + if len(nickname_bytes) > 64: + raise ValueError("Profile nickname must be 64 bytes or less") + content = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + encode_tlv(0x90, nickname_bytes) + code = _extract_status(es10x_command(client, encode_tlv(TAG_SET_NICKNAME, content)), TAG_SET_NICKNAME, "SetNickname") + if code == 0x01: + raise RuntimeError(f"profile {iccid} not found") + if code != 0x00: + raise RuntimeError(f"SetNickname failed with status 0x{code:02X}") + + +# --- Notifications --- + +def list_notifications(client: AtClient) -> list[dict]: + response = es10x_command(client, encode_tlv(TAG_LIST_NOTIFICATION, b"")) + root = find_tag(response, TAG_LIST_NOTIFICATION) + if root is None: + raise RuntimeError("Missing ListNotificationResponse") + metadata_list = find_tag(root, 0xA0) + if metadata_list is None: + return [] + notifications: list[dict] = [] + for tag, value in iter_tlv(metadata_list): + if tag != TAG_NOTIFICATION_METADATA: + continue + notification = {"seqNumber": None, "profileManagementOperation": None, "notificationAddress": None, "iccid": None} + for t, v in iter_tlv(value): + if (field := _NOTIF_FIELDS.get(t)): + notification[field[0]] = field[1](v) + if notification["seqNumber"] is not None and notification["profileManagementOperation"] is not None and notification["notificationAddress"]: + notifications.append(notification) + return notifications + + +def retrieve_notification(client: AtClient, seq_number: int) -> dict: + request = encode_tlv(TAG_RETRIEVE_NOTIFICATION, encode_tlv(0xA0, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + response = es10x_command(client, request) + root = find_tag(response, TAG_RETRIEVE_NOTIFICATION) + if root is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + a0_content = find_tag(root, 0xA0) + if a0_content is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + pending_notif, pending_tag = None, None + for tag, value in iter_tlv(a0_content): + if tag in (TAG_PROFILE_INSTALL_RESULT, 0x30): + pending_notif, pending_tag = value, tag + break + if pending_notif is None: + raise RuntimeError("Missing PendingNotification") + if pending_tag == TAG_PROFILE_INSTALL_RESULT: + result_data = find_tag(pending_notif, 0xBF27) + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) if result_data else None + else: + notif_meta = find_tag(pending_notif, TAG_NOTIFICATION_METADATA) + if notif_meta is None: + raise RuntimeError("Missing NotificationMetadata") + addr = find_tag(notif_meta, 0x0C) + if addr is None: + raise RuntimeError("Missing notificationAddress") + return {"notificationAddress": addr.decode("utf-8", errors="ignore"), "b64_PendingNotification": b64e(pending_notif)} + + +def remove_notification(client: AtClient, seq_number: int) -> None: + response = es10x_command(client, encode_tlv(TAG_NOTIFICATION_SENT, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + root = find_tag(response, TAG_NOTIFICATION_SENT) + if root is None: + raise RuntimeError("Invalid NotificationSentResponse") + status = find_tag(root, TAG_STATUS) + if status is None or int.from_bytes(status, "big") != 0: + raise RuntimeError("RemoveNotificationFromList failed") + + +def process_notifications(client: AtClient) -> None: + for notification in list_notifications(client): + seq_number, smdp_address = notification["seqNumber"], notification["notificationAddress"] + if not seq_number or not smdp_address: + continue + try: + notif_data = retrieve_notification(client, seq_number) + es9p_request(smdp_address, "handleNotification", {"pendingNotification": notif_data["b64_PendingNotification"]}, "HandleNotification") + remove_notification(client, seq_number) + except Exception: + pass + + +# --- Authentication & Download --- + +def get_challenge_and_info(client: AtClient) -> tuple[bytes, bytes]: + challenge_resp = es10x_command(client, encode_tlv(TAG_EUICC_CHALLENGE, b"")) + root = find_tag(challenge_resp, TAG_EUICC_CHALLENGE) + if root is None: + raise RuntimeError("Missing GetEuiccDataResponse") + challenge = find_tag(root, TAG_STATUS) + if challenge is None: + raise RuntimeError("Missing challenge in response") + info_resp = es10x_command(client, encode_tlv(TAG_EUICC_INFO, b"")) + if not info_resp.startswith(bytes([0xBF, 0x20])): + raise RuntimeError("Missing GetEuiccInfo1Response") + return challenge, info_resp + + +def authenticate_server(client: AtClient, b64_signed1: str, b64_sig1: str, b64_pk_id: str, b64_cert: str, matching_id: str | None = None) -> str: + # Build request + tac = bytes([0x35, 0x29, 0x06, 0x11]) + device_info = encode_tlv(TAG_STATUS, tac) + encode_tlv(0xA1, b"") + ctx_inner = b"" + if matching_id: + ctx_inner += encode_tlv(TAG_STATUS, matching_id.encode("utf-8")) + ctx_inner += encode_tlv(0xA1, device_info) + content = base64.b64decode(b64_signed1) + base64.b64decode(b64_sig1) + base64.b64decode(b64_pk_id) + base64.b64decode(b64_cert) + encode_tlv(0xA0, ctx_inner) + request = encode_tlv(TAG_AUTH_SERVER, content) + + response = es10x_command(client, request) + if not response.startswith(bytes([0xBF, 0x38])): + raise RuntimeError("Invalid AuthenticateServerResponse") + + # Check for eUICC-side errors + root = find_tag(response, TAG_AUTH_SERVER) + if root is not None: + error_tag = find_tag(root, 0xA1) + if error_tag is not None: + code = int.from_bytes(error_tag, "big") if error_tag else 0 + desc = AUTH_SERVER_ERROR_CODES.get(code, "unknown") + raise RuntimeError(f"AuthenticateServer rejected by eUICC: {desc} (0x{code:02X})") + + return b64e(response) + + +def prepare_download(client: AtClient, b64_signed2: str, b64_sig2: str, b64_cert: str, cc: str | None = None) -> str: + smdp_signed2 = base64.b64decode(b64_signed2) + smdp_signature2 = base64.b64decode(b64_sig2) + smdp_certificate = base64.b64decode(b64_cert) + smdp_signed2_root = find_tag(smdp_signed2, 0x30) + if smdp_signed2_root is None: + raise RuntimeError("Invalid smdpSigned2") + transaction_id = find_tag(smdp_signed2_root, TAG_STATUS) + cc_required_flag = find_tag(smdp_signed2_root, 0x01) + if transaction_id is None or cc_required_flag is None: + raise RuntimeError("Invalid smdpSigned2") + content = smdp_signed2 + smdp_signature2 + if int.from_bytes(cc_required_flag, "big") != 0: + if not cc: + raise RuntimeError("Confirmation code required but not provided") + content += encode_tlv(0x04, hashlib.sha256(hashlib.sha256(cc.encode("utf-8")).digest() + transaction_id).digest()) + content += smdp_certificate + response = es10x_command(client, encode_tlv(TAG_PREPARE_DOWNLOAD, content)) + if not response.startswith(bytes([0xBF, 0x21])): + raise RuntimeError("Invalid PrepareDownloadResponse") + return b64e(response) + + +def _parse_tlv_header_len(data: bytes) -> int: + """Return the combined tag + length header size for a TLV element.""" + tag_len = 2 if data[0] & 0x1F == 0x1F else 1 + length_byte = data[tag_len] + return tag_len + (1 + (length_byte & 0x7F) if length_byte & 0x80 else 1) + + +def load_bpp(client: AtClient, b64_bpp: str) -> dict: + bpp = b64d(b64_bpp) + if not bpp.startswith(bytes([0xBF, 0x36])): + raise RuntimeError("Invalid BoundProfilePackage") + + bpp_root_value = None + for tag, value, start, end in iter_tlv(bpp, with_positions=True): + if tag == TAG_BPP: + bpp_root_value = value + bpp_value_start = start + _parse_tlv_header_len(bpp[start:end]) + break + if bpp_root_value is None: + raise RuntimeError("Invalid BoundProfilePackage") + + chunks = [] + for tag, value, start, end in iter_tlv(bpp_root_value, with_positions=True): + if tag == 0xBF23: + chunks.append(bpp[0 : bpp_value_start + end]) + elif tag == 0xA0: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + elif tag in (0xA1, 0xA3): + hdr_len = _parse_tlv_header_len(bpp_root_value[start:end]) + chunks.append(bpp[bpp_value_start + start : bpp_value_start + start + hdr_len]) + for _, _, child_start, child_end in iter_tlv(value, with_positions=True): + chunks.append(value[child_start:child_end]) + elif tag == 0xA2: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + + result = {"seqNumber": 0, "success": False, "bppCommandId": None, "errorReason": None} + for chunk in chunks: + response = es10x_command(client, chunk) + if not response: + continue + root = find_tag(response, TAG_PROFILE_INSTALL_RESULT) + if not root: + continue + result_data = find_tag(root, 0xBF27) + if not result_data: + break + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) + if notif_meta: + seq_num = find_tag(notif_meta, TAG_STATUS) + if seq_num: + result["seqNumber"] = int.from_bytes(seq_num, "big") + final_result = find_tag(result_data, 0xA2) + if final_result: + for tag, value in iter_tlv(final_result): + if tag == 0xA0: + result["success"] = True + elif tag == 0xA1: + bpp_cmd = find_tag(value, TAG_STATUS) + if bpp_cmd: + result["bppCommandId"] = int.from_bytes(bpp_cmd, "big") + err = find_tag(value, 0x81) + if err: + result["errorReason"] = int.from_bytes(err, "big") + break # ProfileInstallResult received — eUICC session is finalized + if not result["success"] and result["errorReason"] is not None: + cmd_name = BPP_COMMAND_NAMES.get(result["bppCommandId"], f"unknown({result['bppCommandId']})") + err_name = BPP_ERROR_REASONS.get(result["errorReason"], f"unknown({result['errorReason']})") + raise RuntimeError(f"Profile installation failed at {cmd_name}: {err_name} (bppCommandId={result['bppCommandId']}, errorReason={result['errorReason']})") + return result + + +def parse_metadata(b64_metadata: str) -> dict: + root = find_tag(b64d(b64_metadata), 0xBF25) + if root is None: + raise RuntimeError("Invalid profileMetadata") + defaults = {"iccid": None, "serviceProviderName": None, "profileName": None, "iconType": None, "icon": None, "profileClass": None} + return {**defaults, **_decode_profile_fields(root)} + + +def cancel_session(client: AtClient, transaction_id: bytes, reason: int = 127) -> str: + content = encode_tlv(0x80, transaction_id) + encode_tlv(0x81, bytes([reason])) + response = es10x_command(client, encode_tlv(TAG_CANCEL_SESSION, content)) + return b64e(response) + + +def parse_lpa_activation_code(activation_code: str) -> tuple[str, str, str]: + if not activation_code.startswith("LPA:"): + raise ValueError("Invalid activation code format") + + parts = activation_code[4:].split("$") + if len(parts) != 3: + raise ValueError("Invalid activation code format") + + version, smdp, matching_id = [p.strip() for p in parts] + if version != "1": + raise ValueError("Unsupported activation code version") + if len(smdp) == 0 or "." not in smdp: + raise ValueError("Invalid SM-DP+ address in activation code") + if len(matching_id) == 0: + raise ValueError("Missing matching ID in activation code") + return version, smdp, matching_id + + +def download_profile(client: AtClient, activation_code: str) -> str: + _, smdp, matching_id = parse_lpa_activation_code(activation_code) + + challenge, euicc_info = get_challenge_and_info(client) + + payload = {"smdpAddress": smdp, "euiccChallenge": b64e(challenge), "euiccInfo1": b64e(euicc_info)} + if matching_id: + payload["matchingId"] = matching_id + auth = es9p_request(smdp, "initiateAuthentication", payload, "Authentication") + tx_id = base64_trim(auth.get("transactionId", "")) + tx_id_bytes = base64.b64decode(tx_id) if tx_id else b"" + + try: + b64_auth_resp = authenticate_server( + client, base64_trim(auth.get("serverSigned1", "")), base64_trim(auth.get("serverSignature1", "")), + base64_trim(auth.get("euiccCiPKIdToBeUsed", "")), base64_trim(auth.get("serverCertificate", "")), + matching_id=matching_id) + + cli = es9p_request(smdp, "authenticateClient", {"transactionId": tx_id, "authenticateServerResponse": b64_auth_resp}, "Authentication") + metadata = parse_metadata(base64_trim(cli.get("profileMetadata", ""))) + iccid = str(metadata.get("iccid") or "") + print(f'Downloading profile: {iccid} - {metadata["serviceProviderName"]} - {metadata["profileName"]}') + + b64_prep = prepare_download( + client, base64_trim(cli.get("smdpSigned2", "")), base64_trim(cli.get("smdpSignature2", "")), base64_trim(cli.get("smdpCertificate", ""))) + + bpp = es9p_request(smdp, "getBoundProfilePackage", {"transactionId": tx_id, "prepareDownloadResponse": b64_prep}, "GetBoundProfilePackage") + + result = load_bpp(client, base64_trim(bpp.get("boundProfilePackage", ""))) + if result["success"]: + print(f"Profile installed successfully (seqNumber: {result['seqNumber']})") + return iccid + else: + raise RuntimeError(f"Profile installation failed: {result}") + except Exception: + if tx_id_bytes: + b64_cancel_resp = "" + try: + b64_cancel_resp = cancel_session(client, tx_id_bytes) + except Exception: + pass + try: + es9p_request(smdp, "cancelSession", { + "transactionId": tx_id, + "cancelSessionResponse": b64_cancel_resp, + }, "CancelSession") + except Exception: + pass + raise + + +class TiciLPA(LPABase): + handles_modem_restart = True + _instance = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self, interface: Literal["qmi", "at"] = "at", device: str = DEFAULT_DEVICE, baud: int = DEFAULT_BAUD, + timeout: float = DEFAULT_TIMEOUT, verbose: bool = False): + if getattr(self, "_initialized", False): + self.verbose = verbose or self.verbose + return + # This backend is AT-only. Keep interface arg for compatibility with existing CLI/call sites. + self.interface = interface + self.device = device + self.baud = baud + self.timeout = timeout + self.verbose = verbose + self._last_good_device = device + self._euicc_present_cache: bool | None = None + from iqpilot.system.hardware.tici.hardware import get_device_type + self._is_eg25 = get_device_type() in ("tizi",) + self._client: AtClient | None = None + self._initialized = True + # _client is opened lazily via _ensure_client() on first actual eSIM operation. + # Do NOT call _open_ready_client() here: on pSIM devices (no eUICC) it retries + # for 10–30 s against the AT port, blocking hw_state_thread and starving the + # network-type polling loop that drives the WiFi/LTE sidebar indicator. + atexit.register(self.close) + + def close(self) -> None: + if self._client is not None: + try: + self._client.close() + finally: + self._client = None + + @staticmethod + def _set_modemmanager_running(running: bool) -> None: + action = "start" if running else "stop" + subprocess.check_call(["sudo", "systemctl", action, "ModemManager"]) + + @staticmethod + def _is_modemmanager_running() -> bool: + res = subprocess.run(["systemctl", "is-active", "ModemManager"], + capture_output=True, text=True, check=False) + return res.stdout.strip() == "active" + + def _probe_euicc_present(self) -> bool | None: + if self._euicc_present_cache is not None: + return self._euicc_present_cache + + if self._is_modemmanager_running(): + return None + + restarted_modemmanager = False + try: + res = subprocess.run( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-get-slot-status"], + capture_output=True, text=True, check=False, timeout=12, + ) + output = f"{res.stdout}\n{res.stderr}" + if "Is eUICC: yes" in output: + self._euicc_present_cache = True + elif "Is eUICC: no" in output: + self._euicc_present_cache = False + else: + self._euicc_present_cache = None + except Exception: + self._euicc_present_cache = None + finally: + if restarted_modemmanager: + self._set_modemmanager_running(True) + time.sleep(2.0) + + return self._euicc_present_cache + + @staticmethod + def _ttyusb2_mm_ignored() -> bool: + # AGNOS PR 521 marks ttyUSB2 with ID_MM_PORT_IGNORE=1 for EG25. + # If missing, ModemManager may contend with direct AT eSIM operations. + if not os.path.exists("/dev/ttyUSB2"): + return False + try: + res = subprocess.run( + ["udevadm", "info", "-q", "property", "-n", "/dev/ttyUSB2"], + capture_output=True, text=True, check=False, + ) + if res.returncode != 0: + return False + return "ID_MM_PORT_IGNORE=1" in res.stdout + except Exception: + return False + + def _ensure_client(self) -> AtClient: + if self._client is None: + self._client = self._open_ready_client() + return self._client + + @contextmanager + def _open_client(self): + yield self._ensure_client() + + def _open_ready_client(self) -> AtClient: + euicc_present = self._probe_euicc_present() + if euicc_present is False: + raise LPAError("Modem reports no eUICC support on this unit (QMI: Is eUICC: no)") + + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(1, 6): + for device in self._candidate_devices(): + client: AtClient | None = None + try: + if self.verbose: + print(f"!! trying modem AT device: {device} (attempt {attempt})", file=sys.stderr) + client = AtClient(device, self.baud, self.timeout, self.verbose) + client.ensure_capabilities() + client.open_isdr() + self._last_good_device = device + if self.verbose: + print(f"!! selected modem AT device: {device}", file=sys.stderr) + return client + except Exception as e: + if self.verbose: + print(f"!! modem AT device failed: {device}: {e}", file=sys.stderr) + last_error = e + if client is not None: + try: + client.close() + except Exception: + pass + if not recovery_attempted and last_error is not None and self._should_recover_isdr(last_error): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + # Give modem a moment to finish startup / channel release. + time.sleep(min(0.4 * attempt, 1.5)) + assert last_error is not None + raise last_error + + def _candidate_devices(self) -> list[str]: + if self.device and not os.path.exists(self.device): + return [self.device] + + candidates = [ + self._last_good_device, + self.device, + "/dev/modem_at0", + "/dev/ttyUSB3", + "/dev/ttyUSB2", + "/dev/ttyUSB1", + "/dev/ttyUSB0", + ] + ordered: list[str] = [] + for dev in candidates: + should_include = dev in (self.device, "/dev/modem_at0") or os.path.exists(dev) + if dev and dev not in ordered and should_include: + ordered.append(dev) + return ordered if ordered else [self.device] + + @staticmethod + def _to_profile(data: dict) -> Profile: + return Profile( + iccid=str(data.get("iccid") or ""), + nickname=str(data.get("profileNickname") or ""), + enabled=str(data.get("profileState") or "") == "enabled", + provider=str(data.get("serviceProviderName") or ""), + ) + + def _clear_cat_busy(self) -> None: + time.sleep(3) + try: + self._ensure_client().query('AT+QSTKRSP=254') + except Exception: + pass + time.sleep(1) + try: + self._ensure_client().query('AT+CFUN=4') + except Exception: + pass + time.sleep(2) + try: + self._ensure_client().query('AT+CFUN=1') + except Exception: + pass + self._ensure_client().channel = None + time.sleep(5) + + def _wait_for_modem(self, timeout: float = 45.0) -> None: + start = time.monotonic() + last_error: Exception | None = None + while time.monotonic() - start < timeout: + try: + self.close() + self._client = self._open_ready_client() + return + except Exception as e: + last_error = e + time.sleep(2) + if last_error is not None: + raise RuntimeError("Modem did not recover after reboot") from last_error + raise RuntimeError("Modem did not recover after reboot") + + def _restart_modem(self) -> None: + client = self._ensure_client() + for cmd in ('AT+CFUN=0', 'AT+CFUN=1,1'): + try: + client.query(cmd) + except Exception: + pass + client.channel = None + client._use_csim = False + self._wait_for_modem() + + @staticmethod + def _should_recover_isdr(error: Exception) -> bool: + message = str(error).lower() + markers = ( + "failed to open isd-r", + "failed to access euicc isd-r", + "simfilenotfound", + "at+ccho", + "at+cgla", + ) + return any(marker in message for marker in markers) + + def _recover_isdr_access(self) -> bool: + was_modemmanager_running = self._is_modemmanager_running() + self.close() + try: + if was_modemmanager_running: + self._set_modemmanager_running(False) + time.sleep(2.0) + + for cmd in ( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-reset"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-off=1"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-on=1"], + ): + subprocess.check_call(cmd) + time.sleep(2.0) + + self._euicc_present_cache = None + return True + except Exception as e: + if self.verbose: + print(f"!! ISD-R recovery failed: {e}", file=sys.stderr) + return False + finally: + if was_modemmanager_running: + self._set_modemmanager_running(True) + time.sleep(2.0) + + def _with_lpa_error(self, fn): + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(3): + try: + return fn() + except LPAError: + raise + except RuntimeError as e: + last_error = e + if "does not provide usable esim functionality" in str(e).lower(): + raise LPAError(str(e)) from e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(str(e)) from e + except (OSError, serial.SerialException) as e: + last_error = e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(f"AT transport error: {e}") from e + except TimeoutError as e: + raise LPAError(f"AT modem timeout: {e}") from e + except ValueError as e: + raise LPAError(str(e)) from e + assert last_error is not None + raise LPAError(str(last_error)) + + @staticmethod + def _is_transient_transport_error(message: str) -> bool: + lower = message.lower() + transient_markers = ( + "broken pipe", + "resource busy", + "input/output error", + "device disconnected", + "device reports readiness to read but returned no data", + "transport error", + "missing +cgla response", + "missing +csim response", + "malformed +cgla response payload", + "malformed +csim response payload", + "non-hexadecimal number found in fromhex", + ) + return any(m in lower for m in transient_markers) + + def list_profiles(self) -> list[Profile]: + def _run() -> list[Profile]: + return [self._to_profile(p) for p in list_profiles(self._ensure_client())] + return self._with_lpa_error(_run) + + def get_active_profile(self) -> Profile | None: + return next((p for p in self.list_profiles() if p.enabled), None) + + def _validate_profile_exists(self, iccid: str) -> None: + if not any(p.iccid == iccid for p in self.list_profiles()): + raise LPAProfileNotFoundError(f"profile {iccid} does not exist") + + def _is_bootstrapped(self) -> bool: + return not any(self.is_comma_profile(p.iccid) for p in self.list_profiles()) + + def _ensure_switchable_profile(self, iccid: str) -> None: + if self.is_comma_profile(iccid): + return + + if not self._is_bootstrapped(): + raise LPAError( + "Delete the existing Comma pSIM profile before activating a user eSIM profile" + ) + + def _process_notifications_after_delete(self, client: AtClient, iccid: str) -> None: + try: + process_notifications(client) + return + except Exception as error: + notification_error = error + + self._restart_modem() + + try: + deleted = not any(p.iccid == iccid for p in self.list_profiles()) + except Exception: + raise RuntimeError( + "Profile delete may have succeeded, but modem notification cleanup failed; " + "refresh profiles and retry if needed" + ) from notification_error + + if deleted: + return + + raise RuntimeError( + "Profile delete did not finish cleanly; refresh profiles and retry" + ) from notification_error + + def _process_notifications_after_state_change( + self, + validator, + recovery_message: str, + failure_message: str, + ) -> None: + try: + process_notifications(self._ensure_client()) + return + except Exception as notification_error: + pass + + self._wait_for_modem() + + try: + if validator(): + return + except Exception: + raise RuntimeError(recovery_message) from notification_error + + raise RuntimeError(failure_message) from notification_error + + def delete_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + raise LPAError("cannot delete active profile, switch to another profile first") + + def _run() -> None: + client = self._ensure_client() + try: + delete_profile(client, iccid) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + delete_profile(client, iccid) + else: + raise + self._process_notifications_after_delete(client, iccid) + + self._with_lpa_error(_run) + + def bootstrap(self) -> None: + comma_profiles = [p for p in self.list_profiles() if self.is_comma_profile(p.iccid)] + if not comma_profiles: + return + + def _run() -> None: + client = self._ensure_client() + for profile in comma_profiles: + if profile.enabled: + disable_profile(client, profile.iccid, refresh=True) + process_notifications(client) + delete_profile(client, profile.iccid) + process_notifications(client) + self._restart_modem() + + self._with_lpa_error(_run) + + def download_profile(self, qr: str, nickname: str | None = None) -> None: + # Strict upfront validation to provide immediate user feedback. + parse_lpa_activation_code(qr) + before = {p.iccid for p in self.list_profiles()} + + def _run() -> None: + client = self._ensure_client() + iccid = download_profile(client, qr) + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid for profile in self.list_profiles()), + "Profile add may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile add did not finish cleanly; refresh profiles and retry", + ) + + self._with_lpa_error(_run) + + if nickname: + after = self.list_profiles() + new_profile = next((p for p in after if p.iccid not in before), None) + if new_profile is not None and new_profile.iccid: + self.nickname_profile(new_profile.iccid, nickname) + + def nickname_profile(self, iccid: str, nickname: str) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + set_profile_nickname(self._ensure_client(), iccid, nickname) + self._with_lpa_error(_run) + + def switch_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + self._ensure_switchable_profile(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + return + + def _run() -> None: + client = self._ensure_client() + use_refresh = self._is_eg25 + try: + enable_profile(client, iccid, refresh=use_refresh) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + enable_profile(client, iccid, refresh=use_refresh) + else: + raise + client.channel = None + client._use_csim = False + if use_refresh: + self._wait_for_modem() + else: + self._restart_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile switch may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile switch did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + # Compatibility methods retained for old tests/scripts. + def process_notifications(self) -> None: + def _run() -> None: + process_notifications(self._ensure_client()) + self._with_lpa_error(_run) + + def enable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + enable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile enable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile enable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + def disable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + disable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and not profile.enabled for profile in self.list_profiles()), + "Profile disable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile disable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + +# --- CLI --- + +def main() -> None: + parser = argparse.ArgumentParser(description="Minimal AT-only LPA implementation") + parser.add_argument("--device", default=DEFAULT_DEVICE) + parser.add_argument("--baud", type=int, default=DEFAULT_BAUD) + parser.add_argument("--timeout", type=float, default=DEFAULT_TIMEOUT) + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--enable", type=str) + parser.add_argument("--disable", type=str) + parser.add_argument("--delete", type=str, metavar="ICCID", help="Delete a disabled profile") + parser.add_argument("--no-refresh", action="store_true", help="Skip REFRESH after enable/disable") + parser.add_argument("--set-nickname", nargs=2, metavar=("ICCID", "NICKNAME")) + parser.add_argument("--list-notifications", action="store_true") + parser.add_argument("--process-notifications", action="store_true") + parser.add_argument("--download", type=str, metavar="CODE") + args = parser.parse_args() + + lpa = TiciLPA(device=args.device, baud=args.baud, timeout=args.timeout, verbose=args.verbose) + + if args.enable: + lpa.enable_profile(args.enable, refresh=not args.no_refresh) + elif args.disable: + lpa.disable_profile(args.disable, refresh=not args.no_refresh) + elif args.delete: + lpa.delete_profile(args.delete) + elif args.set_nickname: + lpa.nickname_profile(args.set_nickname[0], args.set_nickname[1]) + elif args.list_notifications: + with lpa._open_client() as client: + print(json.dumps(list_notifications(client), indent=2)) + return + elif args.process_notifications: + lpa.process_notifications() + return + elif args.download: + lpa.download_profile(args.download) + + profiles_out = [{ + "iccid": p.iccid, + "profileNickname": p.nickname, + "profileState": "enabled" if p.enabled else "disabled", + "serviceProviderName": p.provider, + } for p in lpa.list_profiles()] + print(json.dumps(profiles_out, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py new file mode 100644 index 000000000..d53183f7a --- /dev/null +++ b/artifacts/iqpilot_iqvd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py @@ -0,0 +1,30 @@ +# GPIO pin definitions +class GPIO: + # both GPIO_STM_RST_N and GPIO_LTE_RST_N are misnamed, they are high to reset + HUB_RST_N = 30 + UBLOX_RST_N = 32 + UBLOX_SAFEBOOT_N = 33 + GNSS_PWR_EN = 34 # SCHEMATIC LABEL: GPIO_UBLOX_PWR_EN + + STM_RST_N = 124 + STM_BOOT0 = 134 + STM_PWR_EN_N = 41 # because STM32H7 RST doesn't generate a full power-on-reset + + SIREN = 42 + SOM_ST_IO = 49 + + LTE_RST_N = 50 + LTE_PWRKEY = 116 + LTE_BOOT = 52 + + # GPIO_CAM0_DVDD_EN = /sys/kernel/debug/regulator/camera_rear_ldo + CAM0_AVDD_EN = 8 + CAM0_RSTN = 9 + CAM1_RSTN = 7 + CAM2_RSTN = 12 + + # Sensor interrupts + BMX055_ACCEL_INT = 21 + BMX055_GYRO_INT = 23 + BMX055_MAGN_INT = 87 + LSM_INT = 84 diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..6f9949d13 Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.py b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..3d8ffd27b Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/iqvd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..aa48ea426 Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.py b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..cd969bf9d Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/client.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..487e17f36 Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/geometry.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..eb4fb470c Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/perception.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..46510f02f Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/offload/protocol.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..09d0fe350 Binary files /dev/null and b/artifacts/iqpilot_iqvd_private/python/iqpilot_private/iqvd/yolov8_net.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_maps_private/manifest.json b/artifacts/iqpilot_maps_private/manifest.json new file mode 100644 index 000000000..d09b8d50e --- /dev/null +++ b/artifacts/iqpilot_maps_private/manifest.json @@ -0,0 +1,39 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570", + "size": 3 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "b4f12341a5ebeb6263226cd03391c6505c708279c9c4ff4c0057326f6325e8ab", + "size": 67616 + }, + "python/iqpilot_private/maps/__init__.py": { + "mode": 420, + "sha256": "5128931b54d4f1ff131185e7711d56a788b5e2cb71e3c8154a2f79fef184b452", + "size": 118 + }, + "python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "84600544b6ca61637b1d332d4881a00083ef9001efba65ac45cca79a2a526c33", + "size": 67856 + }, + "runtime": { + "entries": { + "iqpilot_private.maps.git_auth": { + "path": "python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so": "f9iG6goRpO0HKZpoQUoZ7KGcO7YBqV3oBtZxtES4IjeOqUl7zPaVAMxGYD0jkkjtC5HKBH2fldpGGOAoQvhbBw==", + "python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so": "63rRKgkKdIVzRaDNRFYj+X/NRNnZrwra43QGZF8VcafRopvwXnXrSgjxmgLPIRZQVk5YPcn9cgHXAuU2UJjdDw==" + } +} diff --git a/artifacts/iqpilot_maps_private/manifest.json.sig b/artifacts/iqpilot_maps_private/manifest.json.sig new file mode 100644 index 000000000..18a66bbb4 --- /dev/null +++ b/artifacts/iqpilot_maps_private/manifest.json.sig @@ -0,0 +1 @@ +UrGrwApvCiaSCaGrD+6aKwLNTm5TaQ02X2dS4DVbM9Gw6qvQ3w6/ql/mfbr/i0Y1SgPIDfKx8fCOdcCWIwJtBA== diff --git a/artifacts/iqpilot_maps_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_maps_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/artifacts/iqpilot_maps_private/python/_iqclosure/_vendored.json @@ -0,0 +1 @@ +[] diff --git a/artifacts/iqpilot_maps_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_maps_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..f9dc9ccb9 Binary files /dev/null and b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.py b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..2be9e39cb Binary files /dev/null and b/artifacts/iqpilot_maps_private/python/iqpilot_private/maps/git_auth.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_model_selector_private/manifest.json b/artifacts/iqpilot_model_selector_private/manifest.json new file mode 100644 index 000000000..5a3918714 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/manifest.json @@ -0,0 +1,240 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "870f5bc6aa5d8b528dc8e54bbaf03088193a5e764da6d7eb59706e1535dfd766", + "size": 868 + }, + "python/_iqclosure/iqpilot/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/api/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/api/base.py": { + "mode": 420, + "sha256": "be55c83869bad911ee0204e8779b4673653f7d29ae4f524c978a280bd84c7777", + "size": 3187 + }, + "python/_iqclosure/iqpilot/common/basedir.py": { + "mode": 420, + "sha256": "58cfa5d6405903ee1acecc4544463bb8f47a66921b120c382143aa80d8539b28", + "size": 106 + }, + "python/_iqclosure/iqpilot/common/gpio.py": { + "mode": 420, + "sha256": "01ba8cb32a644a2df545e764ba19bf1c7a320a217f983f8bac73b45d3a6891cf", + "size": 2408 + }, + "python/_iqclosure/iqpilot/common/i2c.py": { + "mode": 420, + "sha256": "4af8f9da7504a548d15f18b91d71c1379cb7c05c84be031448764cc49920ce68", + "size": 2449 + }, + "python/_iqclosure/iqpilot/common/logging_extra.py": { + "mode": 420, + "sha256": "ce9b3b3d8498d76e1c4c0352a3e98e72759bb7f367ff8629c1329c46040595c3", + "size": 6628 + }, + "python/_iqclosure/iqpilot/common/realtime.py": { + "mode": 420, + "sha256": "f137ef62c1602a1f7c329731883dc518c62288bd25596891858d460ae3209ae2", + "size": 3966 + }, + "python/_iqclosure/iqpilot/common/swaglog.py": { + "mode": 420, + "sha256": "0a133b4ef49f80b8890f115e81273f3f3e21351ae79f92dc02abc033e6d24027", + "size": 5274 + }, + "python/_iqclosure/iqpilot/common/time_helpers.py": { + "mode": 420, + "sha256": "c14cda1f84149d5ffa63a2adec5ca24126f77c1412a78412e5e3e68a6fd12bcf", + "size": 474 + }, + "python/_iqclosure/iqpilot/common/utils.py": { + "mode": 420, + "sha256": "6475ad94bc89252398c41e9eabf7929ba5eb8fa23a08ad7545e7a67b400af9f3", + "size": 8090 + }, + "python/_iqclosure/iqpilot/konn3kt/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/konn3kt/cloud_client.py": { + "mode": 420, + "sha256": "4d58e62f8d628a8570881f2b87c82c801b46928fbb84f8dab8a81a9b55ba4e15", + "size": 493 + }, + "python/_iqclosure/iqpilot/selfdrive/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py": { + "mode": 420, + "sha256": "056c744bbd9f1fe1053555d9b1fc1257d53093d69ddc94be3f05d840eb70781c", + "size": 3590 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py": { + "mode": 420, + "sha256": "5865243a95ca4557d2a960302124a9898545cc3a8387e88ef569308e3d0f7077", + "size": 119 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py": { + "mode": 420, + "sha256": "23622cdec9eed5649a05422ba19eae956ba16a63850927af4a222c3d9030a1bb", + "size": 399 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py": { + "mode": 420, + "sha256": "e4f524c7595754fd9db86724a7bd9b67524c630275ac78599ab6838d1aa7d809", + "size": 11037 + }, + "python/_iqclosure/iqpilot/system/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/__init__.py": { + "mode": 420, + "sha256": "889391bffca493e74bfc108cae2976a53b644caca13ab600061fd29e9622c627", + "size": 695 + }, + "python/_iqclosure/iqpilot/system/hardware/base.py": { + "mode": 420, + "sha256": "a56293f7c23e503ff62d0d3ed39f1831b5544a65b37378165934361a5ddcd304", + "size": 4966 + }, + "python/_iqclosure/iqpilot/system/hardware/hw.py": { + "mode": 420, + "sha256": "c69185d8f6482c8b021f687b793246d2e2ede853e89a88748c64b85f60711b59", + "size": 3638 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/hardware.py": { + "mode": 420, + "sha256": "2520895597c375ae570bd04d5f189e874c89d642f3f07bdbeb20388cb6691433", + "size": 258 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py": { + "mode": 420, + "sha256": "98f46f8705259b00efae7274186b4e68201aad467a19de4f16d5f850d10ab0b5", + "size": 7585 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/hardware.py": { + "mode": 420, + "sha256": "f1ddffa9bdb5071a49fd65eb4b49958b60b1873e1ec70e6f3f2e2b2501abce2f", + "size": 25584 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py": { + "mode": 420, + "sha256": "d22858982705531732d5a20a45a73795496e5bbd9e23028c24609a7e58ac7aed", + "size": 890 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/lpa.py": { + "mode": 420, + "sha256": "2bffb84aef35892c4788e80b6d937bf2eebd15e226b72a82c4f39217667c1ca0", + "size": 53692 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/pins.py": { + "mode": 420, + "sha256": "b57ba4262e6a6a79f2db15c27356acf3e54f579a7edd13b483b2e16d140aca6d", + "size": 678 + }, + "python/_iqclosure/iqpilot/system/version.py": { + "mode": 420, + "sha256": "3a6bc7520dae7944a1da6f911cd090704a463e011f39949ea6c9df51b0e8c616", + "size": 6033 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "aec72c78d58c37afb1b57bea4a29d322032fffdfa59deabdc85b4322b5ca3787", + "size": 67616 + }, + "python/iqpilot_private/models/__init__.py": { + "mode": 420, + "sha256": "5128931b54d4f1ff131185e7711d56a788b5e2cb71e3c8154a2f79fef184b452", + "size": 118 + }, + "python/iqpilot_private/models/big_catalog.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "30a25ebd3b37e2307c3a80ae0fea70b314ab71427d313ba5e2d540c4ba7658ed", + "size": 133840 + }, + "python/iqpilot_private/models/egpu_model.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "e8cb29388e31f636d19f916d5a1d32f38c38113f5fa882344d4effceb6e37d85", + "size": 68112 + }, + "python/iqpilot_private/models/emac_model_meta.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "b7938d9521352d5c1fa6b0d7ff8f3f11062e33bcc0d9a72ffb0edfb525423b6e", + "size": 68264 + }, + "python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "dad0c3c3a73338647da25dead17da0db6cebb24527bc9db381cd16753741f676", + "size": 136200 + }, + "python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "ce815034dd8bdadb79131e0b51013a9f9772c4421dfb96b62431d84125089ad2", + "size": 68056 + }, + "python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "798843f52120210c19da5b6c98723ca15d782ea9cd445cc8f96009471990d618", + "size": 137944 + }, + "python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "96be19ef4f59b87e44092c61f70676468617365923c4c8b91cf7e0b88cc62c05", + "size": 340000 + }, + "runtime": { + "entries": { + "iqpilot_private.models.manager": { + "path": "python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so": "CHPHmtjVAGTdtbWnwE5awrEKFJHs06YK4Gao9IKVaHZYXyj5WAc/d4t7hOKM3lm2/UfBaraTdVTdeSOij3dpCQ==", + "python/iqpilot_private/models/big_catalog.cpython-312-aarch64-linux-gnu.so": "Ekiv6tp3mDx+7Z4lNI+byVomzjShe93UkYQEOhYwl6kHlpxN06A3IqV8y5pwlJII4ZpE5yYEX9qp+VMXsdm9Aw==", + "python/iqpilot_private/models/egpu_model.cpython-312-aarch64-linux-gnu.so": "njYujmFBsfewILpjLI0nUN34rqzMNITattpewwxE4LuTcdkAgihQ3w/S/aYetSJzUtV/SH9mk26DhMciwn8KAw==", + "python/iqpilot_private/models/emac_model_meta.cpython-312-aarch64-linux-gnu.so": "zE2s6oQ3YqanaFG4RMNPydekiblRQVBk7QEJ5G30W2thGqzWt+1BW+75XdwaCigw//rINxKHbt3Neu5rub7PAw==", + "python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so": "hBKd/smbmwEszsGjU7FP2RNVmrINBpU4NPZMGDjEHAF7Rx1WBF49+pH1s0k571RBqdtqN7nya2HCnKKO0tHUBw==", + "python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so": "eKa9qfsfNNaSQpqggWSGw5YV/6cJk5iJcmhY+N/v3xdFvEMfCsIf+N3BhP0S3ZDO5T2CeE/I/Xc+1QbZh7oNDQ==", + "python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so": "k4BcKQAua+1YSC6P8jVEu2wBrI+WL8Bb5kKQbOnBYn/lupnrA96vMRYu4XVVDLGBoIqK8L7K/PYCYxu9Cx4RDA==", + "python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so": "+53NsV73jkF/1x9Bzsw99oZRhVBtqlQTeXaPfHydTAssd2V3UMO+BWqagtGbVG5qIOcgjaNweNExGu+Abo7iDA==" + } +} diff --git a/artifacts/iqpilot_model_selector_private/manifest.json.sig b/artifacts/iqpilot_model_selector_private/manifest.json.sig new file mode 100644 index 000000000..09517d18c --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/manifest.json.sig @@ -0,0 +1 @@ +8t0c8OQ6AY5JlVXqGQkiF2rlj3kN3MIwGHVz4TOgaudkW7XegnRhUqngcpNo5C74wFDKNGWsvXOJ4WtIiIrfCg== diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_model_selector_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..5966d743d --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/_vendored.json @@ -0,0 +1,27 @@ +[ + "iqpilot.common.api.base", + "iqpilot.common.basedir", + "iqpilot.common.gpio", + "iqpilot.common.i2c", + "iqpilot.common.logging_extra", + "iqpilot.common.realtime", + "iqpilot.common.swaglog", + "iqpilot.common.time_helpers", + "iqpilot.common.utils", + "iqpilot.konn3kt.cloud_client", + "iqpilot.selfdrive.iqmodeld.config", + "iqpilot.selfdrive.iqmodeld.models", + "iqpilot.selfdrive.iqmodeld.models.fetcher", + "iqpilot.selfdrive.iqmodeld.models.helpers", + "iqpilot.system.hardware", + "iqpilot.system.hardware.base", + "iqpilot.system.hardware.hw", + "iqpilot.system.hardware.pc.hardware", + "iqpilot.system.hardware.tici", + "iqpilot.system.hardware.tici.amplifier", + "iqpilot.system.hardware.tici.hardware", + "iqpilot.system.hardware.tici.iwlist", + "iqpilot.system.hardware.tici.lpa", + "iqpilot.system.hardware.tici.pins", + "iqpilot.system.version" +] diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/api/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/api/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/api/base.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/api/base.py new file mode 100644 index 000000000..8170a19b2 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/api/base.py @@ -0,0 +1,84 @@ +import jwt +import os +import requests +import unicodedata +from datetime import datetime, timedelta, UTC +from functools import lru_cache +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.version import get_version + +# name: jwt signature algorithm +KEYS = {"id_rsa": "RS256", + "id_ecdsa": "ES256"} + + +@lru_cache(maxsize=4) +def load_signing_key(private_key: str): + # PyJWT re-parses a PEM string on every encode; an RSA parse is ~40ms, so cache the key object + try: + from cryptography.hazmat.primitives.serialization import load_pem_private_key + return load_pem_private_key(private_key.encode(), password=None) + except Exception: + return private_key + + +class BaseApi: + def __init__(self, dongle_id, api_host, user_agent="openpilot-"): + self.dongle_id = dongle_id + self.api_host = api_host + self.user_agent = user_agent + self.jwt_algorithm, self.private_key, _ = self.get_key_pair() + + def get(self, *args, **kwargs): + return self.request('GET', *args, **kwargs) + + def post(self, *args, **kwargs): + return self.request('POST', *args, **kwargs) + + def request(self, method, endpoint, timeout=None, access_token=None, **params): + return self.api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params) + + def _get_token(self, payload_extra=None, expiry_hours=1, **extra_payload): + now = datetime.now(UTC).replace(tzinfo=None) + payload = { + 'identity': self.dongle_id, + 'nbf': now, + 'iat': now, + 'exp': now + timedelta(hours=expiry_hours), + **extra_payload + } + if payload_extra is not None: + payload.update(payload_extra) + key = load_signing_key(self.private_key) if self.private_key else self.private_key + token = jwt.encode(payload, key, algorithm=self.jwt_algorithm) + if isinstance(token, bytes): + token = token.decode('utf8') + return token + + def get_token(self, payload_extra=None, expiry_hours=1): + return self._get_token(payload_extra, expiry_hours) + + def remove_non_ascii_chars(self, text): + normalized_text = unicodedata.normalize('NFD', text) + ascii_encoded_text = normalized_text.encode('ascii', 'ignore') + return ascii_encoded_text.decode() + + def api_get(self, endpoint, method='GET', timeout=None, access_token=None, session=None, json=None, **params): + headers = {} + if access_token is not None: + headers['Authorization'] = "JWT " + access_token + + version = self.remove_non_ascii_chars(get_version()) + headers['User-Agent'] = self.user_agent + version + + # TODO: add session to Api + req = requests if session is None else session + return req.request(method, f"{self.api_host}/{endpoint}", timeout=timeout, headers=headers, json=json, params=params) + + @staticmethod + def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]: + for key in KEYS: + if os.path.isfile(Paths.persist_root() + f'/comma/{key}') and os.path.isfile(Paths.persist_root() + f'/comma/{key}.pub'): + with open(Paths.persist_root() + f'/comma/{key}') as private, open(Paths.persist_root() + f'/comma/{key}.pub') as public: + return KEYS[key], private.read(), public.read() + return None, None, None diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/basedir.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/basedir.py new file mode 100644 index 000000000..49b092d93 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/basedir.py @@ -0,0 +1,4 @@ +import os + + +BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../..")) diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/gpio.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/gpio.py new file mode 100644 index 000000000..8f025a2da --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/gpio.py @@ -0,0 +1,89 @@ +import os +import fcntl +import ctypes +from functools import cache + +def gpio_init(pin: int, output: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f: + f.write(b"out" if output else b"in") + except Exception as e: + print(f"Failed to set gpio {pin} direction: {e}") + +def gpio_set(pin: int, high: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f: + f.write(b"1" if high else b"0") + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + +def gpio_read(pin: int) -> bool | None: + val = None + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f: + val = bool(int(f.read().strip())) + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + + return val + +def gpio_export(pin: int) -> None: + if os.path.isdir(f"/sys/class/gpio/gpio{pin}"): + return + + try: + with open("/sys/class/gpio/export", 'w') as f: + f.write(str(pin)) + except Exception: + print(f"Failed to export gpio {pin}") + +@cache +def get_irq_action(irq: int) -> list[str]: + try: + with open(f"/sys/kernel/irq/{irq}/actions") as f: + actions = f.read().strip().split(',') + return actions + except FileNotFoundError: + return [] + +def get_irqs_for_action(action: str) -> list[str]: + ret = [] + with open("/proc/interrupts") as f: + for l in f.readlines(): + irq = l.split(':')[0].strip() + if irq.isdigit() and action in get_irq_action(irq): + ret.append(irq) + return ret + +# *** gpiochip *** + +class gpioevent_data(ctypes.Structure): + _fields_ = [ + ("timestamp", ctypes.c_uint64), + ("id", ctypes.c_uint32), + ] + +class gpioevent_request(ctypes.Structure): + _fields_ = [ + ("lineoffset", ctypes.c_uint32), + ("handleflags", ctypes.c_uint32), + ("eventflags", ctypes.c_uint32), + ("label", ctypes.c_char * 32), + ("fd", ctypes.c_int) + ] + +def gpiochip_get_ro_value_fd(label: str, gpiochip_id: int, pin: int) -> int: + GPIOEVENT_REQUEST_BOTH_EDGES = 0x3 + GPIOHANDLE_REQUEST_INPUT = 0x1 + GPIO_GET_LINEEVENT_IOCTL = 0xc030b404 + + rq = gpioevent_request() + rq.lineoffset = pin + rq.handleflags = GPIOHANDLE_REQUEST_INPUT + rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES + rq.label = label.encode('utf-8')[:31] + b'\0' + + fd = os.open(f"/dev/gpiochip{gpiochip_id}", os.O_RDONLY) + fcntl.ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, rq) + os.close(fd) + return int(rq.fd) diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/i2c.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/i2c.py new file mode 100644 index 000000000..1dfaa659a --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/i2c.py @@ -0,0 +1,81 @@ +import os +import fcntl +import ctypes + +# I2C constants from /usr/include/linux/i2c-dev.h +I2C_SLAVE = 0x0703 +I2C_SLAVE_FORCE = 0x0706 +I2C_SMBUS = 0x0720 + +# SMBus transfer types +I2C_SMBUS_READ = 1 +I2C_SMBUS_WRITE = 0 +I2C_SMBUS_BYTE_DATA = 2 +I2C_SMBUS_I2C_BLOCK_DATA = 8 + +I2C_SMBUS_BLOCK_MAX = 32 + + +class _I2cSmbusData(ctypes.Union): + _fields_ = [ + ("byte", ctypes.c_uint8), + ("word", ctypes.c_uint16), + ("block", ctypes.c_uint8 * (I2C_SMBUS_BLOCK_MAX + 2)), + ] + + +class _I2cSmbusIoctlData(ctypes.Structure): + _fields_ = [ + ("read_write", ctypes.c_uint8), + ("command", ctypes.c_uint8), + ("size", ctypes.c_uint32), + ("data", ctypes.POINTER(_I2cSmbusData)), + ] + + +class SMBus: + def __init__(self, bus: int): + self._fd = os.open(f'/dev/i2c-{bus}', os.O_RDWR) + + def __enter__(self) -> 'SMBus': + return self + + def __exit__(self, *args) -> None: + self.close() + + def close(self) -> None: + if hasattr(self, '_fd') and self._fd >= 0: + os.close(self._fd) + self._fd = -1 + + def _set_address(self, addr: int, force: bool = False) -> None: + ioctl_arg = I2C_SLAVE_FORCE if force else I2C_SLAVE + fcntl.ioctl(self._fd, ioctl_arg, addr) + + def _smbus_access(self, read_write: int, command: int, size: int, data: _I2cSmbusData) -> None: + ioctl_data = _I2cSmbusIoctlData(read_write, command, size, ctypes.pointer(data)) + fcntl.ioctl(self._fd, I2C_SMBUS, ioctl_data) + + def read_byte_data(self, addr: int, register: int, force: bool = False) -> int: + self._set_address(addr, force) + data = _I2cSmbusData() + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_BYTE_DATA, data) + return int(data.byte) + + def write_byte_data(self, addr: int, register: int, value: int, force: bool = False) -> None: + self._set_address(addr, force) + data = _I2cSmbusData() + data.byte = value & 0xFF + self._smbus_access(I2C_SMBUS_WRITE, register, I2C_SMBUS_BYTE_DATA, data) + + def read_i2c_block_data(self, addr: int, register: int, length: int, force: bool = False) -> list[int]: + self._set_address(addr, force) + if not (0 <= length <= I2C_SMBUS_BLOCK_MAX): + raise ValueError(f"length must be 0..{I2C_SMBUS_BLOCK_MAX}") + + data = _I2cSmbusData() + data.block[0] = length + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_I2C_BLOCK_DATA, data) + read_len = int(data.block[0]) or length + read_len = min(read_len, length) + return [int(b) for b in data.block[1 : read_len + 1]] diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/logging_extra.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/logging_extra.py new file mode 100644 index 000000000..ceaf083cd --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/logging_extra.py @@ -0,0 +1,249 @@ +import io +import os +import sys +import copy +import json +import time +import uuid +import socket +import logging +import traceback +import numpy as np +from threading import local +from collections import OrderedDict +from contextlib import contextmanager + +LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ + +def json_handler(obj): + if isinstance(obj, np.bool_): + return bool(obj) + # if isinstance(obj, (datetime.date, datetime.time)): + # return obj.isoformat() + return repr(obj) + +def json_robust_dumps(obj): + return json.dumps(obj, default=json_handler) + +class NiceOrderedDict(OrderedDict): + def __str__(self): + return json_robust_dumps(self) + +class SwagFormatter(logging.Formatter): + def __init__(self, swaglogger): + logging.Formatter.__init__(self, None, '%a %b %d %H:%M:%S %Z %Y') + + self.swaglogger = swaglogger + self.host = socket.gethostname() + + def format_dict(self, record): + record_dict = NiceOrderedDict() + + if isinstance(record.msg, dict): + record_dict['msg'] = record.msg + else: + try: + record_dict['msg'] = record.getMessage() + except (ValueError, TypeError): + record_dict['msg'] = [record.msg]+record.args + + record_dict['ctx'] = self.swaglogger.get_ctx() + + if record.exc_info: + record_dict['exc_info'] = self.formatException(record.exc_info) + + record_dict['level'] = record.levelname + record_dict['levelnum'] = record.levelno + record_dict['name'] = record.name + record_dict['filename'] = record.filename + record_dict['lineno'] = record.lineno + record_dict['pathname'] = record.pathname + record_dict['module'] = record.module + record_dict['funcName'] = record.funcName + record_dict['host'] = self.host + record_dict['process'] = record.process + record_dict['thread'] = record.thread + record_dict['threadName'] = record.threadName + record_dict['created'] = record.created + + return record_dict + + def format(self, record): + if self.swaglogger is None: + raise Exception("must set swaglogger before calling format()") + return json_robust_dumps(self.format_dict(record)) + +class SwagLogFileFormatter(SwagFormatter): + def fix_kv(self, k, v): + # append type to names to preserve legacy naming in logs + # avoids overlapping key namespaces with different types + # e.g. log.info() creates 'msg' -> 'msg$s' + # log.event() creates 'msg.health.logMonoTime' -> 'msg.health.logMonoTime$i' + # because overlapping namespace 'msg' caused problems + if isinstance(v, (str, bytes)): + k += "$s" + elif isinstance(v, float): + k += "$f" + elif isinstance(v, bool): + k += "$b" + elif isinstance(v, int): + k += "$i" + elif isinstance(v, dict): + nv = {} + for ik, iv in v.items(): + ik, iv = self.fix_kv(ik, iv) + nv[ik] = iv + v = nv + elif isinstance(v, list): + k += "$a" + return k, v + + def format(self, record): + if isinstance(record, str): + v = json.loads(record) + else: + v = self.format_dict(record) + + mk, mv = self.fix_kv('msg', v['msg']) + del v['msg'] + v[mk] = mv + v['id'] = uuid.uuid4().hex + + return json_robust_dumps(v) + +class SwagErrorFilter(logging.Filter): + def filter(self, record): + return record.levelno < logging.ERROR + +def _tmpfunc(): + return 0 + +def _srcfile(): + return os.path.normcase(_tmpfunc.__code__.co_filename) + +class SwagLogger(logging.Logger): + def __init__(self): + logging.Logger.__init__(self, "swaglog") + + self.global_ctx = {} + + self.log_local = local() + self.log_local.ctx = {} + + def local_ctx(self): + try: + return self.log_local.ctx + except AttributeError: + self.log_local.ctx = {} + return self.log_local.ctx + + def get_ctx(self): + return dict(self.local_ctx(), **self.global_ctx) + + @contextmanager + def ctx(self, **kwargs): + old_ctx = self.local_ctx() + self.log_local.ctx = copy.copy(old_ctx) or {} + self.log_local.ctx.update(kwargs) + try: + yield + finally: + self.log_local.ctx = old_ctx + + def bind(self, **kwargs): + self.local_ctx().update(kwargs) + + def bind_global(self, **kwargs): + self.global_ctx.update(kwargs) + + def event(self, event, *args, **kwargs): + evt = NiceOrderedDict() + evt['event'] = event + if args: + evt['args'] = args + evt.update(kwargs) + if 'error' in kwargs: + self.error(evt) + elif 'debug' in kwargs: + self.debug(evt) + else: + self.info(evt) + + def timestamp(self, event_name): + if LOG_TIMESTAMPS: + t = time.monotonic() + tstp = NiceOrderedDict() + tstp['timestamp'] = NiceOrderedDict() + tstp['timestamp']["event"] = event_name + tstp['timestamp']["time"] = t*1e9 + self.debug(tstp) + + def findCaller(self, stack_info=False, stacklevel=1): + """ + Find the stack frame of the caller so that we can note the source + file name, line number and function name. + """ + f = sys._getframe(3) + #On some versions of IronPython, currentframe() returns None if + #IronPython isn't run with -X:Frames. + if f is not None: + f = f.f_back + orig_f = f + while f and stacklevel > 1: + f = f.f_back + stacklevel -= 1 + if not f: + f = orig_f + rv = "(unknown file)", 0, "(unknown function)", None + while hasattr(f, "f_code"): + co = f.f_code + filename = os.path.normcase(co.co_filename) + + if filename == _srcfile: + f = f.f_back + continue + sinfo = None + if stack_info: + sio = io.StringIO() + sio.write('Stack (most recent call last):\n') + traceback.print_stack(f, file=sio) + sinfo = sio.getvalue() + if sinfo[-1] == '\n': + sinfo = sinfo[:-1] + sio.close() + rv = (co.co_filename, f.f_lineno, co.co_name, sinfo) + break + return rv + +if __name__ == "__main__": + log = SwagLogger() + + stdout_handler = logging.StreamHandler(sys.stdout) + stdout_handler.setLevel(logging.INFO) + stdout_handler.addFilter(SwagErrorFilter()) + log.addHandler(stdout_handler) + + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.ERROR) + log.addHandler(stderr_handler) + + log.info("asdasd %s", "a") + log.info({'wut': 1}) + log.warning("warning") + log.error("error") + log.critical("critical") + log.event("test", x="y") + + with log.ctx(): + stdout_handler.setFormatter(SwagFormatter(log)) + stderr_handler.setFormatter(SwagFormatter(log)) + log.bind(user="some user") + log.info("in req") + print("") + log.warning("warning") + print("") + log.error("error") + print("") + log.critical("critical") + print("") + log.event("do_req", a=1, b="c") diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/realtime.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/realtime.py new file mode 100644 index 000000000..9fd2f695d --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/realtime.py @@ -0,0 +1,134 @@ +"""Utilities for reading real time clocks and keeping soft real time constraints.""" +import gc +import os +import sys +import time + +from setproctitle import getproctitle + +from iqpilot.common.utils import MovingAverage +from iqpilot.system.hardware import PC + + +# time step for each process +DT_CTRL = 0.01 # controlsd +DT_MDL = 0.05 # model +DT_HW = 0.5 # hardwared and manager +DT_DMON = 0.05 # driver monitoring + + +class Priority: + # CORE 2 + # - modeld = 55 + # - camerad = 54 + CTRL_LOW = 51 # plannerd & radard + + # CORE 3 + # - pandad = 55 + CTRL_HIGH = 53 + + +def set_core_affinity(cores: list[int]) -> None: + if sys.platform == 'linux' and not PC: + os.sched_setaffinity(0, cores) + + +def config_realtime_process(cores: int | list[int], priority: int) -> None: + gc.disable() + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(priority)) + c = cores if isinstance(cores, list) else [cores, ] + set_core_affinity(c) + + +def config_background_thread() -> None: + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_OTHER, os.sched_param(0)) + set_core_affinity(list(range(os.cpu_count() or 1))) + + +def lock_memory() -> None: + """mlockall this process so memory reclaim/compaction can't stall it. RT control + procs only (locking ui/modeld would worsen pressure). Best-effort.""" + if sys.platform != 'linux' or PC: + return + try: + import ctypes + import resource + resource.setrlimit(resource.RLIMIT_MEMLOCK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) + MCL_CURRENT, MCL_FUTURE = 0x1, 0x2 + libc = ctypes.CDLL("libc.so.6", use_errno=True) + if libc.mlockall(MCL_CURRENT | MCL_FUTURE) != 0: + raise OSError(ctypes.get_errno(), os.strerror(ctypes.get_errno())) + except Exception as e: + try: + from iqpilot.common.swaglog import cloudlog + cloudlog.warning(f"lock_memory (mlockall) failed: {e}") + except Exception: + pass + + +class Ratekeeper: + def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None: + """Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative.""" + self._interval = 1. / rate + self._print_delay_threshold = print_delay_threshold + self._frame = 0 + self._remaining = 0.0 + self._process_name = getproctitle() + self._last_monitor_time = -1. + self._next_frame_time = -1. + + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + def reset(self) -> None: + self._remaining = 0.0 + self._last_monitor_time = -1. + self._next_frame_time = -1. + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + @property + def frame(self) -> int: + return self._frame + + @property + def remaining(self) -> float: + return self._remaining + + @property + def lag(self) -> float: + return max(0., -self._remaining) + + @property + def lagging(self) -> bool: + expected_dt = self._interval * (1 / 0.9) + return self.avg_dt.get_average() > expected_dt + + # Maintain loop rate by calling this at the end of each loop + def keep_time(self) -> bool: + lagged = self.monitor_time() + if self._remaining > 0: + time.sleep(self._remaining) + return lagged + + # Monitors the cumulative lag, but does not enforce a rate + def monitor_time(self) -> bool: + if self._last_monitor_time < 0: + self._next_frame_time = time.monotonic() + self._interval + self._last_monitor_time = time.monotonic() + + prev = self._last_monitor_time + self._last_monitor_time = time.monotonic() + self.avg_dt.add_value(self._last_monitor_time - prev) + + lagged = False + remaining = self._next_frame_time - time.monotonic() + self._next_frame_time += self._interval + if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: + print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms") + lagged = True + self._frame += 1 + self._remaining = remaining + return lagged diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/swaglog.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/swaglog.py new file mode 100644 index 000000000..f8fd9d392 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/swaglog.py @@ -0,0 +1,165 @@ +import logging +import os +import sys +import time +import warnings +from pathlib import Path +from logging.handlers import BaseRotatingHandler + +import zmq + +from iqpilot.common.logging_extra import SwagLogger, SwagFormatter, SwagLogFileFormatter +from iqpilot.system.hardware.hw import Paths + + +def get_file_handler(): + Path(Paths.swaglog_root()).mkdir(parents=True, exist_ok=True) + base_filename = os.path.join(Paths.swaglog_root(), "swaglog") + handler = SwaglogRotatingFileHandler(base_filename) + return handler + +class SwaglogRotatingFileHandler(BaseRotatingHandler): + def __init__(self, base_filename, interval=60, max_bytes=1024*256, backup_count=2500, encoding=None): + super().__init__(base_filename, mode="a", encoding=encoding, delay=True) + self.base_filename = base_filename + self.interval = interval # seconds + self.max_bytes = max_bytes + self.backup_count = backup_count + self.log_files = self.get_existing_logfiles() + log_indexes = [f.split(".")[-1] for f in self.log_files] + self.last_file_idx = max([int(i) for i in log_indexes if i.isdigit()] or [-1]) + self.last_rollover = None + self.doRollover() + + def _open(self): + self.last_rollover = time.monotonic() + self.last_file_idx += 1 + next_filename = f"{self.base_filename}.{self.last_file_idx:010}" + stream = open(next_filename, self.mode, encoding=self.encoding) + self.log_files.insert(0, next_filename) + return stream + + def get_existing_logfiles(self): + log_files = list() + base_dir = os.path.dirname(self.base_filename) + for fn in os.listdir(base_dir): + fp = os.path.join(base_dir, fn) + if fp.startswith(self.base_filename) and os.path.isfile(fp): + log_files.append(fp) + return sorted(log_files) + + def shouldRollover(self, record): + size_exceeded = self.max_bytes > 0 and self.stream.tell() >= self.max_bytes + time_exceeded = self.interval > 0 and self.last_rollover + self.interval <= time.monotonic() + return size_exceeded or time_exceeded + + def doRollover(self): + if self.stream: + self.stream.close() + self.stream = self._open() + + if self.backup_count > 0: + while len(self.log_files) > self.backup_count: + to_delete = self.log_files.pop() + if os.path.exists(to_delete): # just being safe, should always exist + os.remove(to_delete) + +class UnixDomainSocketHandler(logging.Handler): + def __init__(self, formatter): + logging.Handler.__init__(self) + self.setFormatter(formatter) + self.pid = None + + self.zctx = None + self.sock = None + + def __del__(self): + self.close() + + def close(self): + if self.sock is not None: + self.sock.close() + if self.zctx is not None: + self.zctx.term() + + def connect(self): + self.zctx = zmq.Context() + self.sock = self.zctx.socket(zmq.PUSH) + self.sock.setsockopt(zmq.LINGER, 10) + self.sock.connect(Paths.swaglog_ipc()) + self.pid = os.getpid() + + def emit(self, record): + if os.getpid() != self.pid: + # TODO suppresses warning about forking proc with zmq socket, fix root cause + warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*") + self.connect() + + msg = self.format(record).rstrip('\n') + # print("SEND".format(repr(msg))) + try: + s = chr(record.levelno)+msg + self.sock.send(s.encode('utf8'), zmq.NOBLOCK) + except zmq.error.Again: + # drop :/ + pass + + +class ForwardingHandler(logging.Handler): + def __init__(self, target_logger): + super().__init__() + self.target_logger = target_logger + + def emit(self, record): + self.target_logger.handle(record) + + +def add_file_handler(log): + """ + Function to add the file log handler to swaglog. + This can be used to store logs when logmessaged is not running. + """ + handler = get_file_handler() + handler.setFormatter(SwagLogFileFormatter(log)) + log.addHandler(handler) + + +cloudlog = log = SwagLogger() +log.setLevel(logging.DEBUG) + + +class PrettyConsoleFormatter(logging.Formatter): + # StreamHandler writes to stderr, so tty-gate on that + _COLOR = sys.stderr.isatty() and os.environ.get('NO_COLOR') is None + + def format(self, record): + msg = record.getMessage() + if not self._COLOR: + return f"{record.filename}: {msg}" + lvl = record.levelno + if lvl >= 50: lc, ln = "\033[1;38;5;196m", "CRIT" + elif lvl >= 40: lc, ln = "\033[1;38;5;203m", " ERR" + elif lvl >= 30: lc, ln = "\033[38;5;214m", "WARN" + elif lvl >= 20: lc, ln = "\033[38;5;110m", "info" + else: lc, ln = "\033[38;5;244m", " dbg" + body = f"\033[1;38;5;210m{msg}\033[0m" if lvl >= 40 else msg + src = "" if record.filename == "(unknown file)" else f"\033[2m{record.filename}\033[0m " + return f"{lc}{ln:>4}\033[0m {src}{body}" + + +outhandler = logging.StreamHandler() +outhandler.setFormatter(PrettyConsoleFormatter()) + +print_level = os.environ.get('LOGPRINT', 'warning') +if print_level == 'debug': + outhandler.setLevel(logging.DEBUG) +elif print_level == 'info': + outhandler.setLevel(logging.INFO) +elif print_level == 'warning': + outhandler.setLevel(logging.WARNING) + +ipchandler = UnixDomainSocketHandler(SwagFormatter(log)) + +log.addHandler(outhandler) +# logs are sent through IPC before writing to disk to prevent disk I/O blocking +log.addHandler(ipchandler) diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/time_helpers.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/time_helpers.py new file mode 100644 index 000000000..8564e270c --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/time_helpers.py @@ -0,0 +1,15 @@ +import datetime +from pathlib import Path + +MIN_DATE = datetime.datetime(year=2025, month=2, day=21) + +def min_date(): + # on systemd systems, the default time is the systemd build time + systemd_path = Path("/lib/systemd/systemd") + if systemd_path.exists(): + d = datetime.datetime.fromtimestamp(systemd_path.stat().st_mtime) + return max(MIN_DATE, d + datetime.timedelta(days=1)) + return MIN_DATE + +def system_time_valid(): + return datetime.datetime.now() > min_date() diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/utils.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/utils.py new file mode 100644 index 000000000..e0aa1605d --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/common/utils.py @@ -0,0 +1,271 @@ +import io +import os +import tempfile +import contextlib +import subprocess +import time +import functools +from subprocess import Popen, PIPE, TimeoutExpired +import zstandard as zstd + +LOG_COMPRESSION_LEVEL = 10 # little benefit up to level 15. level ~17 is a small step change + +class Timer: + """Simple lap timer for profiling sequential operations.""" + + def __init__(self): + self._start = self._lap = time.monotonic() + self._sections = {} + + def lap(self, name): + now = time.monotonic() + self._sections[name] = now - self._lap + self._lap = now + + @property + def total(self): + return time.monotonic() - self._start + + def fmt(self, duration): + parts = ", ".join(f"{k}={v:.2f}s" + (f" ({duration/v:.0f}x)" if k == 'render' and v > 0 else "") for k, v in self._sections.items()) + total = self.total + realtime = f"{duration/total:.1f}x realtime" if total > 0 else "N/A" + return f"{duration}s in {total:.1f}s ({realtime}) | {parts}" + +def sudo_write(val: str, path: str) -> None: + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + os.system(f"sudo chmod a+w {path}") + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + # fallback for debugfs files + os.system(f"sudo su -c 'echo {val} > {path}'") + + +def sudo_read(path: str) -> str: + try: + return subprocess.check_output(f"sudo cat {path}", shell=True, encoding='utf8').strip() + except Exception: + return "" + + +class MovingAverage: + def __init__(self, window_size: int): + self.window_size: int = window_size + self.buffer: list[float] = [0.0] * window_size + self.index: int = 0 + self.count: int = 0 + self.sum: float = 0.0 + + def add_value(self, new_value: float): + # Update the sum: subtract the value being replaced and add the new value + self.sum -= self.buffer[self.index] + self.buffer[self.index] = new_value + self.sum += new_value + + # Update the index in a circular manner + self.index = (self.index + 1) % self.window_size + + # Track the number of added values (for partial windows) + self.count = min(self.count + 1, self.window_size) + + def get_average(self) -> float: + if self.count == 0: + return float('nan') + return self.sum / self.count + + +class CallbackReader: + """Wraps a file, but overrides the read method to also + call a callback function with the number of bytes read so far.""" + + def __init__(self, f, callback, *args): + self.f = f + self.callback = callback + self.cb_args = args + self.total_read = 0 + + def __getattr__(self, attr): + return getattr(self.f, attr) + + def read(self, *args, **kwargs): + chunk = self.f.read(*args, **kwargs) + self.total_read += len(chunk) + self.callback(*self.cb_args, self.total_read) + return chunk + + +@contextlib.contextmanager +def atomic_write(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None, + overwrite: bool = False): + """Write to a file atomically using a temporary file in the same directory as the destination file.""" + dir_name = os.path.dirname(path) + + if not overwrite and os.path.exists(path): + raise FileExistsError(f"File '{path}' already exists. To overwrite it, set 'overwrite' to True.") + + with tempfile.NamedTemporaryFile(mode=mode, buffering=buffering, encoding=encoding, newline=newline, dir=dir_name, delete=False) as tmp_file: + yield tmp_file + tmp_file_name = tmp_file.name + os.replace(tmp_file_name, path) + + +def get_upload_stream(filepath: str, should_compress: bool) -> tuple[io.BufferedIOBase, int]: + if not should_compress: + file_size = os.path.getsize(filepath) + file_stream = open(filepath, "rb") + return file_stream, file_size + + # Compress the file on the fly + compressed_stream = io.BytesIO() + compressor = zstd.ZstdCompressor(level=LOG_COMPRESSION_LEVEL) + + with open(filepath, "rb") as f: + compressor.copy_stream(f, compressed_stream) + compressed_size = compressed_stream.tell() + compressed_stream.seek(0) + return compressed_stream, compressed_size + + +# remove all keys that end in DEPRECATED +def strip_deprecated_keys(d): + for k in list(d.keys()): + if isinstance(k, str): + if k.endswith('DEPRECATED'): + d.pop(k) + elif isinstance(d[k], dict): + strip_deprecated_keys(d[k]) + return d + + +def run_cmd(cmd: list[str], cwd=None, env=None) -> str: + return subprocess.check_output(cmd, encoding='utf8', cwd=cwd, env=env).strip() + + +def run_cmd_default(cmd: list[str], default: str = "", cwd=None, env=None) -> str: + try: + return run_cmd(cmd, cwd=cwd, env=env) + except subprocess.CalledProcessError: + return default + + +@contextlib.contextmanager +def managed_proc(cmd: list[str], env: dict[str, str]): + proc = Popen(cmd, env=env, stdout=PIPE, stderr=PIPE) + try: + yield proc + finally: + if proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=5) + except TimeoutExpired: + proc.kill() + + +def tabulate(tabular_data, headers=(), tablefmt="simple", floatfmt="g", stralign="left", numalign=None): + rows = [list(row) for row in tabular_data] + + def fmt(val): + if isinstance(val, str): + return val + if isinstance(val, (bool, int)): + return str(val) + try: + return format(val, floatfmt) + except (TypeError, ValueError): + return str(val) + + formatted = [[fmt(c) for c in row] for row in rows] + hdrs = [str(h) for h in headers] if headers else None + + ncols = max((len(r) for r in formatted), default=0) + if hdrs: + ncols = max(ncols, len(hdrs)) + if ncols == 0: + return "" + + for r in formatted: + r.extend([""] * (ncols - len(r))) + if hdrs: + hdrs.extend([""] * (ncols - len(hdrs))) + + widths = [0] * ncols + if hdrs: + for i in range(ncols): + widths[i] = len(hdrs[i]) + for row in formatted: + for i in range(ncols): + widths[i] = max(widths[i], max(len(ln) for ln in row[i].split('\n'))) + + def _align(s, w): + if stralign == "center": + return s.center(w) + return s.ljust(w) + + if tablefmt == "html": + parts = [""] + if hdrs: + parts.append("") + parts.append("" + "".join(f"" for h in hdrs) + "") + parts.append("") + parts.append("") + for row in formatted: + parts.append("" + "".join(f"" for c in row) + "") + parts.append("") + parts.append("
{h}
{c}
") + return "\n".join(parts) + + if tablefmt == "simple_grid": + def _sep(left, mid, right): + return left + mid.join("─" * (w + 2) for w in widths) + right + + top, mid_sep, bot = _sep("┌", "â”Ŧ", "┐"), _sep("├", "â”ŧ", "┤"), _sep("└", "┴", "┘") + + def _fmt_row(cells): + split = [c.split('\n') for c in cells] + nlines = max(len(s) for s in split) + for s in split: + s.extend([""] * (nlines - len(s))) + return ["│" + "│".join(f" {_align(split[i][li], widths[i])} " for i in range(ncols)) + "│" for li in range(nlines)] + + lines = [top] + if hdrs: + lines.extend(_fmt_row(hdrs)) + lines.append(mid_sep) + for ri, row in enumerate(formatted): + lines.extend(_fmt_row(row)) + lines.append(mid_sep if ri < len(formatted) - 1 else bot) + return "\n".join(lines) + + gap = " " + lines = [] + if hdrs: + lines.append(gap.join(h.ljust(w) for h, w in zip(hdrs, widths, strict=True))) + lines.append(gap.join("-" * w for w in widths)) + for row in formatted: + lines.append(gap.join(_align(row[i], widths[i]) for i in range(ncols))) + return "\n".join(lines) + + +def retry(attempts=3, delay=1.0, ignore_failure=False): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + for _ in range(attempts): + try: + return func(*args, **kwargs) + except Exception: + print(f"{func.__name__} failed, trying again") + time.sleep(delay) + + if ignore_failure: + print(f"{func.__name__} failed after retry") + else: + raise Exception(f"{func.__name__} failed after retry") + return wrapper + return decorator diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/konn3kt/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/konn3kt/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py new file mode 100644 index 000000000..2897609eb --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/konn3kt/cloud_client.py @@ -0,0 +1,17 @@ +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + + +import os +from iqpilot.common.api.base import BaseApi +API_HOST = os.getenv('KONN3KT_API_HOST', 'https://api-iqlabs.konn3kt.com') + +class Konn3ktApi(BaseApi): + + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "konn3kt-device-" + + def get_token(self, expiry_hours=1): + return super()._get_token(expiry_hours=expiry_hours) diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py new file mode 100644 index 000000000..5b73c0115 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py @@ -0,0 +1,133 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + + +def index_function(index: int, max_val: float = 192, max_idx: int = 32) -> float: + return max_val * ((index / max_idx) ** 2) + + +def _quadratic_series(limit: float, steps: int) -> list[float]: + return [index_function(index, max_val=limit, max_idx=steps - 1) for index in range(steps)] + + +def _probability_window(*values: float) -> np.ndarray: + return np.asarray(values, dtype=np.float32) + + +def _field_group(start: int, stop: int, stride: int) -> slice: + return slice(start, stop, stride) + + +_IDX_COUNT = 33 +_T_AXIS = _quadratic_series(10.0, _IDX_COUNT) +_X_AXIS = _quadratic_series(192.0, _IDX_COUNT) + + +class ModelConstants: + IDX_N = _IDX_COUNT + T_IDXS = _T_AXIS + X_IDXS = _X_AXIS + LEAD_T_IDXS = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0] + LEAD_T_OFFSETS = [0.0, 2.0, 4.0] + META_T_IDXS = [2.0, 4.0, 6.0, 8.0, 10.0] + + MODEL_FREQ = 20 + FEATURE_LEN = 512 + FULL_HISTORY_BUFFER_LEN = 99 + HISTORY_BUFFER_LEN = FULL_HISTORY_BUFFER_LEN + DESIRE_LEN = 8 + TRAFFIC_CONVENTION_LEN = 2 + NAV_FEATURE_LEN = 256 + NAV_INSTRUCTION_LEN = 150 + LAT_PLANNER_STATE_LEN = 4 + LATERAL_CONTROL_PARAMS_LEN = 2 + PREV_DESIRED_CURV_LEN = 1 + + FCW_THRESHOLDS_5MS2 = _probability_window(0.05, 0.05, 0.15, 0.15, 0.15) + FCW_THRESHOLDS_3MS2 = _probability_window(0.7, 0.7) + FCW_5MS2_PROBS_WIDTH = 5 + FCW_3MS2_PROBS_WIDTH = 2 + + DISENGAGE_WIDTH = 5 + POSE_WIDTH = 6 + WIDE_FROM_DEVICE_WIDTH = 3 + SIM_POSE_WIDTH = 6 + LEAD_WIDTH = 4 + LANE_LINES_WIDTH = 2 + ROAD_EDGES_WIDTH = 2 + PLAN_WIDTH = 15 + DESIRE_PRED_WIDTH = 8 + LAT_PLANNER_SOLUTION_WIDTH = 4 + DESIRED_CURV_WIDTH = 1 + + NUM_LANE_LINES = 4 + NUM_ROAD_EDGES = 2 + LEAD_TRAJ_LEN = 6 + DESIRE_PRED_LEN = 4 + + PLAN_MHP_N = 5 + LEAD_MHP_N = 2 + PLAN_MHP_SELECTION = 1 + LEAD_MHP_SELECTION = 3 + + FCW_THRESHOLD_5MS2_HIGH = 0.15 + FCW_THRESHOLD_5MS2_LOW = 0.05 + FCW_THRESHOLD_3MS2 = 0.7 + + CONFIDENCE_BUFFER_LEN = 5 + RYG_GREEN = 0.01165 + RYG_YELLOW = 0.06157 + POLY_PATH_DEGREE = 4 + + +class Plan: + POSITION = slice(0, 3) + VELOCITY = slice(3, 6) + ACCELERATION = slice(6, 9) + T_FROM_CURRENT_EULER = slice(9, 12) + ORIENTATION_RATE = slice(12, 15) + + +class Meta: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 31, 6) + BRAKE_DISENGAGE = _field_group(2, 31, 6) + STEER_OVERRIDE = _field_group(3, 31, 6) + HARD_BRAKE_3 = _field_group(4, 31, 6) + HARD_BRAKE_4 = _field_group(5, 31, 6) + HARD_BRAKE_5 = _field_group(6, 31, 6) + GAS_PRESS = _field_group(31, 55, 4) + BRAKE_PRESS = _field_group(32, 55, 4) + LEFT_BLINKER = _field_group(33, 55, 4) + RIGHT_BLINKER = _field_group(34, 55, 4) + + +class MetaTombRaider: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 41, 8) + BRAKE_DISENGAGE = _field_group(2, 41, 8) + STEER_OVERRIDE = _field_group(3, 41, 8) + HARD_BRAKE_3 = _field_group(4, 41, 8) + HARD_BRAKE_4 = _field_group(5, 41, 8) + HARD_BRAKE_5 = _field_group(6, 41, 8) + GAS_PRESS = _field_group(7, 41, 8) + BRAKE_PRESS = _field_group(8, 41, 8) + LEFT_BLINKER = _field_group(41, 53, 2) + RIGHT_BLINKER = _field_group(42, 53, 2) + + +class MetaSimPose: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 36, 7) + BRAKE_DISENGAGE = _field_group(2, 36, 7) + STEER_OVERRIDE = _field_group(3, 36, 7) + HARD_BRAKE_3 = _field_group(4, 36, 7) + HARD_BRAKE_4 = _field_group(5, 36, 7) + HARD_BRAKE_5 = _field_group(6, 36, 7) + GAS_PRESS = _field_group(7, 36, 7) + LEFT_BLINKER = _field_group(36, 48, 2) + RIGHT_BLINKER = _field_group(37, 48, 2) diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py new file mode 100644 index 000000000..5ece1c074 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py new file mode 100644 index 000000000..d06c7c3dd --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.fetcher") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.fetcher import * # noqa: F403 diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py new file mode 100644 index 000000000..4b9a2f4d4 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python3 +""" +Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import json +import os +import shutil +from pathlib import Path + +from iqpilot.cereal import custom +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module +from iqpilot.system.hardware.hw import Paths + +try: + load_private_module(__name__, "iqpilot_private.models.helpers") +except ProprietaryModuleMissing: + try: + from iqpilot.models_private_src.helpers import * # noqa: F403 + except ImportError: + pass + + +ModelBundle = custom.IQModelManager.ModelBundle +Runner = custom.IQModelManager.Runner +_MODEL_ROOT = Path(Paths.model_root()) +_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle" +_MODELS_CACHE_KEY = "ModelManager_ModelsCache" +_RUNNER_CACHE_KEY = "ModelRunnerTypeCache" +_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex" +_PENDING_INDEX_KEY = "ModelManager_PendingIndex" +_PENDING_MODEL_RESTORE_FILE = "/data/k3_pending_model_restore" +_STOCK_RUNNER = int(Runner.stock) +_TINYGRAD_RUNNER = int(Runner.tinygrad) +_SNPE_RUNNER = int(Runner.snpe) + +_DEFAULT_MODEL_DIR = Path(__file__).resolve().parents[1] / "default_model" +_DEFAULT_BUNDLE_JSON = _DEFAULT_MODEL_DIR / "bundle.json" +_DEFAULT_BUNDLE_REF = "default" + + +def get_default_model_bundle(_bundles): + return None + + +def _coerce_runner_value(value) -> int | None: + raw = getattr(value, "raw", value) + try: + return int(raw) + except (TypeError, ValueError): + return None + + +def _bundle_models(bundle) -> list: + models = getattr(bundle, "models", None) + return list(models) if models is not None else [] + + +def _bundle_needs_runtime_upgrade(bundle) -> bool: + if bundle is None: + return False + + if _coerce_runner_value(getattr(bundle, "runner", None)) == _SNPE_RUNNER: + return True + + for model in _bundle_models(bundle): + file_name = getattr(getattr(model, "artifact", None), "fileName", "") or "" + if file_name.endswith(".thneed"): + return True + + return False + + +def _load_cached_manifest_bundles(params: Params): + cached = params.get(_MODELS_CACHE_KEY) or {} + bundles = [] + for raw_bundle in cached.get("bundles", []): + try: + min_selector_version = int(raw_bundle.get("minimumSelectorVersion", raw_bundle.get("minimum_selector_version", 0))) + compatibility_view = dict(raw_bundle) + compatibility_view["minimumSelectorVersion"] = min_selector_version + is_compatible = globals().get("is_bundle_version_compatible") + if is_compatible is not None and not is_compatible(compatibility_view): + continue + + if "short_name" in raw_bundle: + from iqpilot.selfdrive.iqmodeld.models.fetcher import ManifestDecoder + bundles.append(ManifestDecoder._decode_bundle(raw_bundle)) + continue + + if "internalName" in raw_bundle: + bundles.append(ModelBundle(**raw_bundle)) + continue + + bundle = ModelBundle() + bundle.index = int(raw_bundle["index"]) + bundle.internalName = raw_bundle.get("short_name") + bundle.displayName = raw_bundle.get("display_name") + bundle.status = 0 + bundle.generation = int(raw_bundle["generation"]) + bundle.environment = raw_bundle["environment"] + bundle.runner = raw_bundle.get("runner", Runner.tinygrad) + bundle.is20hz = raw_bundle.get("is_20hz", False) + bundle.minimumSelectorVersion = int(min_selector_version) + bundle.ref = raw_bundle.get("ref") + bundle.overrides = [] + for key, value in raw_bundle.get("overrides", {}).items(): + override = custom.IQModelManager.Override() + override.key = key + override.value = value + bundle.overrides.append(override) + + bundle.models = [] + for raw_model in raw_bundle.get("models", []): + model = custom.IQModelManager.Model() + model.type = raw_model.get("type") + for attr_name in ("artifact", "metadata"): + raw_artifact = raw_model.get(attr_name) + if not raw_artifact: + continue + artifact = custom.IQModelManager.Artifact() + artifact.fileName = raw_artifact.get("file_name") + download_uri = custom.IQModelManager.DownloadUri() + download_uri.uri = raw_artifact.get("download_uri", {}).get("url") + download_uri.sha256 = raw_artifact.get("download_uri", {}).get("sha256") + artifact.downloadUri = download_uri + setattr(model, attr_name, artifact) + bundle.models.append(model) + + bundles.append(bundle) + except Exception: + continue + return bundles + + +def _bundle_match_key(bundle) -> tuple[str | None, str | None, str | None]: + return ( + getattr(bundle, "ref", None), + getattr(bundle, "internalName", None), + getattr(bundle, "displayName", None), + ) + + +def _find_runtime_upgrade(bundle, params: Params, available_bundles=None): + if not _bundle_needs_runtime_upgrade(bundle): + return bundle + + candidate_bundles = available_bundles if available_bundles is not None else _load_cached_manifest_bundles(params) + ref, internal_name, display_name = _bundle_match_key(bundle) + + for candidate in candidate_bundles: + if getattr(candidate, "ref", None) and getattr(candidate, "ref", None) == ref: + return candidate + + for candidate in candidate_bundles: + if getattr(candidate, "internalName", None) == internal_name: + return candidate + + for candidate in candidate_bundles: + if getattr(candidate, "displayName", None) == display_name: + return candidate + + return None + + +def bundle_files_ready(bundle) -> bool: + if bundle is None: + return False + + for model in _bundle_models(bundle): + artifact = getattr(model, "artifact", None) + metadata = getattr(model, "metadata", None) + for file_name in (getattr(metadata, "fileName", None), getattr(artifact, "fileName", None)): + if file_name and not (_MODEL_ROOT / file_name).is_file(): + return False + return True + + +def persist_active_bundle(params: Params, bundle) -> None: + params.put(_ACTIVE_BUNDLE_KEY, bundle.to_dict()) + params.remove(_RUNNER_CACHE_KEY) + + +def _load_default_bundle_dict() -> dict: + return json.loads(_DEFAULT_BUNDLE_JSON.read_text()) + + +def _default_bundle_filenames(bundle_dict: dict) -> list[str]: + names = [] + for model in bundle_dict.get("models", []): + for artifact in (model.get("metadata"), model.get("artifact")): + file_name = artifact.get("fileName", "") if isinstance(artifact, dict) else "" + if file_name: + names.append(file_name) + return names + + +def is_default_bundle(bundle) -> bool: + return bool(bundle is not None and getattr(bundle, "ref", None) == _DEFAULT_BUNDLE_REF) + + +def ensure_default_model_files(bundle_dict: dict = None) -> None: + bundle_dict = bundle_dict if bundle_dict is not None else _load_default_bundle_dict() + try: + _MODEL_ROOT.mkdir(parents=True, exist_ok=True) + except OSError as e: + cloudlog.exception(f"default_model: cannot create model root: {e}") + return + for file_name in _default_bundle_filenames(bundle_dict): + src = _DEFAULT_MODEL_DIR / file_name + dst = _MODEL_ROOT / file_name + if not src.is_file(): + cloudlog.error(f"default_model: shipped asset missing {src}") + continue + if dst.is_file() and dst.stat().st_size == src.stat().st_size: + continue + try: + shutil.copy2(src, dst) + cloudlog.warning(f"default_model: staged {file_name} into model root") + except OSError as e: + cloudlog.exception(f"default_model: failed staging {file_name}: {e}") + + +def select_default_model(params: Params = None) -> None: + params = Params() if params is None else params + bundle_dict = _load_default_bundle_dict() + ensure_default_model_files(bundle_dict) + params.remove(_DOWNLOAD_INDEX_KEY) + params.remove(_PENDING_INDEX_KEY) + params.put(_ACTIVE_BUNDLE_KEY, bundle_dict) + params.remove(_RUNNER_CACHE_KEY) + params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER) + try: + if os.path.isfile(_PENDING_MODEL_RESTORE_FILE): + os.remove(_PENDING_MODEL_RESTORE_FILE) + except OSError: + pass + + +def seed_default_bundle_if_unset(params: Params = None) -> None: + params = Params() if params is None else params + if params.get(_ACTIVE_BUNDLE_KEY): + return + queued_download = params.get(_DOWNLOAD_INDEX_KEY) + try: + select_default_model(params) + if queued_download is not None: + params.put(_DOWNLOAD_INDEX_KEY, queued_download) + cloudlog.warning("default_model: seeded Default (CD210) as active bundle") + except Exception as e: + cloudlog.exception(f"default_model: failed to seed default bundle: {e}") + + +def get_runtime_bundle_upgrade(bundle, params: Params = None, available_bundles=None): + params = Params() if params is None else params + return _find_runtime_upgrade(bundle, params, available_bundles) + + +def get_active_bundle(params: Params = None): + params = Params() if params is None else params + + try: + active_bundle = params.get(_ACTIVE_BUNDLE_KEY) or {} + if not active_bundle: + return None + is_compatible = globals().get("is_bundle_version_compatible") + if is_compatible is not None and not is_compatible(active_bundle): + return None + bundle = ModelBundle(**active_bundle) + except Exception: + return None + + replacement = _find_runtime_upgrade(bundle, params) + if replacement is not None and replacement is not bundle and bundle_files_ready(replacement): + persist_active_bundle(params, replacement) + return replacement + + return bundle + + +def get_active_model_runner(params: Params = None, force_check=False): + params = Params() if params is None else params + + active_bundle = get_active_bundle(params) + if not active_bundle: + seed_default_bundle_if_unset(params) + active_bundle = get_active_bundle(params) + if not active_bundle: + if params.get(_RUNNER_CACHE_KEY) != str(_TINYGRAD_RUNNER): + params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER) + return _TINYGRAD_RUNNER + + cached_runner_type = params.get(_RUNNER_CACHE_KEY) + if cached_runner_type and not force_check and isinstance(cached_runner_type, str) and cached_runner_type.isdigit(): + return int(cached_runner_type) + + runner_type = _coerce_runner_value(active_bundle.runner) + if runner_type == _SNPE_RUNNER: + replacement = _find_runtime_upgrade(active_bundle, params) + if replacement is not None and replacement is not active_bundle and bundle_files_ready(replacement): + persist_active_bundle(params, replacement) + runner_type = _coerce_runner_value(replacement.runner) + else: + if replacement is not None and getattr(replacement, "index", None) is not None and params.get(_DOWNLOAD_INDEX_KEY) is None: + params.put(_DOWNLOAD_INDEX_KEY, int(replacement.index)) + cloudlog.warning(f"Queued tinygrad migration for retired bundle {getattr(active_bundle, 'internalName', '')}") + runner_type = _TINYGRAD_RUNNER + + if cached_runner_type != runner_type: + params.put(_RUNNER_CACHE_KEY, int(runner_type)) + + return runner_type diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/__init__.py new file mode 100644 index 000000000..1338aa2cf --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/__init__.py @@ -0,0 +1,22 @@ +import os +from typing import cast + +from iqpilot.system.hardware.base import HardwareBase +from iqpilot.system.hardware.tici.hardware import Tici +from iqpilot.system.hardware.pc.hardware import Pc + +TICI = os.path.isfile('/TICI') +AGNOS = os.path.isfile('/AGNOS') +PC = not TICI + + +if TICI: + HARDWARE = cast(HardwareBase, Tici()) +else: + HARDWARE = cast(HardwareBase, Pc()) + +# Only comma 3/3X expose the DMA-BUF EGL extensions used by the zero-copy +# camera renderer and the direct EGL frame-pacing calls. /TICI is also present +# on comma 4, so it identifies the AGNOS hardware family rather than this GPU +# capability. +EGL_DMA_BUF_SUPPORTED = TICI and HARDWARE.get_device_type() in ("tici", "tizi") diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/base.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/base.py new file mode 100644 index 000000000..217696e09 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/base.py @@ -0,0 +1,228 @@ +import os +from abc import abstractmethod, ABC +from dataclasses import dataclass, fields + +from iqpilot.cereal import log + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +class LPAError(RuntimeError): + pass + +class LPAProfileNotFoundError(LPAError): + pass + +@dataclass +class Profile: + iccid: str + nickname: str + enabled: bool + provider: str + +@dataclass +class ThermalZone: + # a zone from /sys/class/thermal/thermal_zone* + name: str # a.k.a type + scale: float = 1000. # scale to get degrees in C + zone_number = -1 + + def read(self) -> float: + if self.zone_number < 0: + for n in os.listdir("/sys/devices/virtual/thermal"): + if not n.startswith("thermal_zone"): + continue + with open(os.path.join("/sys/devices/virtual/thermal", n, "type")) as f: + if f.read().strip() == self.name: + self.zone_number = int(n.removeprefix("thermal_zone")) + break + + try: + with open(f"/sys/devices/virtual/thermal/thermal_zone{self.zone_number}/temp") as f: + return int(f.read()) / self.scale + except FileNotFoundError: + return 0 + +@dataclass +class ThermalConfig: + cpu: list[ThermalZone] | None = None + gpu: list[ThermalZone] | None = None + dsp: ThermalZone | None = None + pmic: list[ThermalZone] | None = None + memory: ThermalZone | None = None + intake: ThermalZone | None = None + exhaust: ThermalZone | None = None + case: ThermalZone | None = None + + def get_msg(self): + ret = {} + for f in fields(ThermalConfig): + v = getattr(self, f.name) + if v is not None: + if isinstance(v, list): + ret[f.name + "TempC"] = [x.read() for x in v] + else: + ret[f.name + "TempC"] = v.read() + return ret + +class LPABase(ABC): + @abstractmethod + def list_profiles(self) -> list[Profile]: + pass + + @abstractmethod + def get_active_profile(self) -> Profile | None: + pass + + @abstractmethod + def delete_profile(self, iccid: str) -> None: + pass + + @abstractmethod + def bootstrap(self) -> None: + pass + + @abstractmethod + def download_profile(self, qr: str, nickname: str | None = None) -> None: + pass + + @abstractmethod + def nickname_profile(self, iccid: str, nickname: str) -> None: + pass + + @abstractmethod + def switch_profile(self, iccid: str) -> None: + pass + + def is_comma_profile(self, iccid: str) -> bool: + return any(iccid.startswith(prefix) for prefix in ('8985235',)) + +class HardwareBase(ABC): + @staticmethod + def get_cmdline() -> dict[str, str]: + with open('/proc/cmdline') as f: + cmdline = f.read() + return {kv[0]: kv[1] for kv in [s.split('=') for s in cmdline.split(' ')] if len(kv) == 2} + + @staticmethod + def read_param_file(path, parser, default=0): + try: + with open(path) as f: + return parser(f.read()) + except Exception: + return default + + def booted(self) -> bool: + return True + + def reboot(self, reason=None): + print("REBOOT!") + + def uninstall(self): + print("uninstall") + + def get_os_version(self): + return None + + @abstractmethod + def get_device_type(self): + pass + + def get_imei(self, slot) -> str: + return "" + + def get_serial(self): + return "" + + def get_network_info(self): + return None + + def get_network_type(self): + return NetworkType.none + + def get_sim_info(self): + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + + def get_sim_lpa(self) -> LPABase: + raise NotImplementedError("SIM LPA not available") + + def get_network_strength(self, network_type): + return NetworkStrength.unknown + + def get_network_metered(self, network_type) -> bool: + return network_type not in (NetworkType.none, NetworkType.wifi, NetworkType.ethernet) + + def get_current_power_draw(self): + return 0 + + def get_som_power_draw(self): + return 0 + + def shutdown(self): + print("SHUTDOWN!") + + def get_thermal_config(self): + return ThermalConfig() + + def set_display_power(self, on: bool): + pass + + def set_screen_brightness(self, percentage): + pass + + def get_screen_brightness(self): + return 0 + + def set_power_save(self, powersave_enabled): + pass + + def get_gpu_usage_percent(self): + return 0 + + def get_modem_version(self): + return None + + def get_modem_temperatures(self): + return [] + + def initialize_hardware(self): + pass + + def configure_modem(self): + pass + + def reboot_modem(self): + pass + + def recover_sim_detection(self) -> bool: + return False + + def get_networks(self): + return None + + def has_internal_panda(self) -> bool: + return False + + def reset_internal_panda(self): + pass + + def recover_internal_panda(self): + pass + + def get_modem_data_usage(self): + return -1, -1 + + def get_voltage(self) -> float: + return 0. + + def get_current(self) -> float: + return 0. + + def set_ir_power(self, percent: int): + pass diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/hw.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/hw.py new file mode 100644 index 000000000..7263ddbfc --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/hw.py @@ -0,0 +1,137 @@ +import os +import platform +from pathlib import Path + +from iqpilot.system.hardware import PC + +DEFAULT_DOWNLOAD_CACHE_ROOT = "/tmp/comma_download_cache" + +class Paths: + _persist_root_cache: str | None = None + + @staticmethod + def _is_writable_persist_root(path: str) -> bool: + try: + os.makedirs(path, exist_ok=True) + comma_dir = os.path.join(path, "comma") + os.makedirs(comma_dir, exist_ok=True) + + probe_path = os.path.join(comma_dir, ".rw_probe") + with open(probe_path, "w") as f: + f.write("1") + os.remove(probe_path) + return True + except OSError: + return False + + @staticmethod + def comma_home() -> str: + return os.path.join(str(Path.home()), ".comma" + os.environ.get("OPENPILOT_PREFIX", "")) + + @staticmethod + def params() -> str: + if os.environ.get("PARAMS_ROOT"): + return os.environ["PARAMS_ROOT"] + return os.path.join(Paths.comma_home(), "params") if PC else "/data/params" + + @staticmethod + def log_root() -> str: + if os.environ.get('LOG_ROOT', False): + return os.environ['LOG_ROOT'] + elif PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "realdata") + else: + return '/data/media/0/realdata/' + + @staticmethod + def log_root_external() -> str: + return '/mnt/external_realdata/' + + @staticmethod + def swaglog_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "log") + else: + return "/data/log/" + + @staticmethod + def swaglog_ipc() -> str: + return "ipc:///tmp/logmessage" + os.environ.get("OPENPILOT_PREFIX", "") + + @staticmethod + def download_cache_root() -> str: + if os.environ.get('COMMA_CACHE', False): + return os.environ['COMMA_CACHE'] + "/" + return DEFAULT_DOWNLOAD_CACHE_ROOT + os.environ.get("OPENPILOT_PREFIX", "") + "/" + + @staticmethod + def persist_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "persist") + + if Paths._persist_root_cache is not None: + return Paths._persist_root_cache + + for candidate in ("/persist", "/data/persist"): + if Paths._is_writable_persist_root(candidate): + Paths._persist_root_cache = candidate + return candidate + + # Keep previous behavior as a last resort. + Paths._persist_root_cache = "/persist" + return Paths._persist_root_cache + + @staticmethod + def stats_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats/" + + @staticmethod + def stats_iq_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats_iq/" + + @staticmethod + def config_root() -> str: + if PC: + return Paths.comma_home() + else: + return "/tmp/.comma" + + @staticmethod + def shm_path() -> str: + if PC and platform.system() == "Darwin": + return "/tmp" # This is not really shared memory on macOS, but it's the closest we can get + return "/dev/shm" + + @staticmethod + def model_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "models") + else: + return "/data/media/0/models" + + @staticmethod + def crash_log_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "community" / "crashes") + else: + return "/data/community/crashes" + + @staticmethod + def mapd_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "osm") + else: + return "/data/media/0/osm" + + @staticmethod + def screen_recordings_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "screen_recordings") + else: + return "/data/media/0/screen_recordings" diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py new file mode 100644 index 000000000..72ef2f235 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py @@ -0,0 +1,12 @@ +from iqpilot.cereal import log +from iqpilot.system.hardware.base import HardwareBase + +NetworkType = log.DeviceState.NetworkType + + +class Pc(HardwareBase): + def get_device_type(self): + return "pc" + + def get_network_type(self): + return NetworkType.wifi diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py new file mode 100644 index 000000000..48a34ea48 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +import time +from collections import namedtuple + +from iqpilot.common.i2c import SMBus + +# https://datasheets.maximintegrated.com/en/ds/MAX98089.pdf + +AmpConfig = namedtuple('AmpConfig', ['name', 'value', 'register', 'offset', 'mask']) +EQParams = namedtuple('EQParams', ['K', 'k1', 'k2', 'c1', 'c2']) + + +def configs_from_eq_params(base, eq_params): + return [ + AmpConfig("K (high)", (eq_params.K >> 8), base, 0, 0xFF), + AmpConfig("K (low)", (eq_params.K & 0xFF), base + 1, 0, 0xFF), + AmpConfig("k1 (high)", (eq_params.k1 >> 8), base + 2, 0, 0xFF), + AmpConfig("k1 (low)", (eq_params.k1 & 0xFF), base + 3, 0, 0xFF), + AmpConfig("k2 (high)", (eq_params.k2 >> 8), base + 4, 0, 0xFF), + AmpConfig("k2 (low)", (eq_params.k2 & 0xFF), base + 5, 0, 0xFF), + AmpConfig("c1 (high)", (eq_params.c1 >> 8), base + 6, 0, 0xFF), + AmpConfig("c1 (low)", (eq_params.c1 & 0xFF), base + 7, 0, 0xFF), + AmpConfig("c2 (high)", (eq_params.c2 >> 8), base + 8, 0, 0xFF), + AmpConfig("c2 (low)", (eq_params.c2 & 0xFF), base + 9, 0, 0xFF), + ] + + +BASE_CONFIG = [ + AmpConfig("MCLK prescaler", 0b01, 0x10, 4, 0b00110000), + AmpConfig("PM: enable speakers", 0b11, 0x4D, 4, 0b00110000), + AmpConfig("PM: enable DACs", 0b11, 0x4D, 0, 0b00000011), + AmpConfig("Enable PLL1", 0b1, 0x12, 7, 0b10000000), + AmpConfig("Enable PLL2", 0b1, 0x1A, 7, 0b10000000), + AmpConfig("DAI1: I2S mode", 0b00100, 0x14, 2, 0b01111100), + AmpConfig("DAI2: I2S mode", 0b00100, 0x1C, 2, 0b01111100), + AmpConfig("DAI1 Passband filtering: music mode", 0b1, 0x18, 7, 0b10000000), + AmpConfig("DAI1 voice mode gain (DV1G)", 0b00, 0x2F, 4, 0b00110000), + AmpConfig("DAI1 attenuation (DV1)", 0x0, 0x2F, 0, 0b00001111), + AmpConfig("DAI2 attenuation (DV2)", 0x0, 0x31, 0, 0b00001111), + AmpConfig("DAI2: DC blocking", 0b1, 0x20, 0, 0b00000001), + AmpConfig("DAI2: High sample rate", 0b0, 0x20, 3, 0b00001000), + AmpConfig("ALC enable", 0b1, 0x43, 7, 0b10000000), + AmpConfig("ALC/excursion limiter release time", 0b101, 0x43, 4, 0b01110000), + AmpConfig("ALC multiband enable", 0b1, 0x43, 3, 0b00001000), + AmpConfig("DAI1 EQ enable", 0b0, 0x49, 0, 0b00000001), + AmpConfig("DAI2 EQ clip detection disabled", 0b1, 0x32, 4, 0b00010000), + AmpConfig("DAI2 EQ attenuation", 0x5, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b100, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter lower corner freq", 0b00, 0x41, 0, 0b00000011), + AmpConfig("Excursion limiter threshold", 0b000, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x6, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b0, 0x46, 0, 0b00000001), + AmpConfig("Right DAC input mixer: DAI1 left", 0b0, 0x22, 3, 0b00001000), + AmpConfig("Right DAC input mixer: DAI1 right", 0b0, 0x22, 2, 0b00000100), + AmpConfig("Right DAC input mixer: DAI2 left", 0b1, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b0, 0x22, 0, 0b00000001), + AmpConfig("DAI1 audio port selector", 0b10, 0x16, 6, 0b11000000), + AmpConfig("DAI2 audio port selector", 0b01, 0x1E, 6, 0b11000000), + AmpConfig("Enable left digital microphone", 0b1, 0x48, 5, 0b00100000), + AmpConfig("Enable right digital microphone", 0b1, 0x48, 4, 0b00010000), + AmpConfig("Enhanced volume smoothing disabled", 0b0, 0x49, 7, 0b10000000), + AmpConfig("Volume adjustment smoothing disabled", 0b0, 0x49, 6, 0b01000000), + AmpConfig("Zero-crossing detection disabled", 0b0, 0x49, 5, 0b00100000), +] + +CONFIGS = { + "tici": [ + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Right speaker output volume", 0x1c, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b1, 0x49, 1, 0b00000010), + *configs_from_eq_params(0x84, EQParams(0x274F, 0xC0FF, 0x3BF9, 0x0B3C, 0x1656)), + *configs_from_eq_params(0x8E, EQParams(0x1009, 0xC6BF, 0x2952, 0x1C97, 0x30DF)), + *configs_from_eq_params(0x98, EQParams(0x0F75, 0xCBE5, 0x0ED2, 0x2528, 0x3E42)), + *configs_from_eq_params(0xA2, EQParams(0x091F, 0x3D4C, 0xCE11, 0x1266, 0x2807)), + *configs_from_eq_params(0xAC, EQParams(0x0A9E, 0x3F20, 0xE573, 0x0A8B, 0x3A3B)), + ], + "tizi": [ + AmpConfig("Left speaker output from left DAC", 0b1, 0x2B, 0, 0b11111111), + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Left Speaker Mixer Gain", 0b00, 0x2D, 0, 0b00000011), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Left speaker output volume", 0x17, 0x3D, 0, 0b00011111), + AmpConfig("Right speaker output volume", 0x17, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b0, 0x49, 1, 0b00000010), + AmpConfig("DAI2: DC blocking", 0b0, 0x20, 0, 0b00000001), + AmpConfig("ALC enable", 0b0, 0x43, 7, 0b10000000), + AmpConfig("DAI2 EQ attenuation", 0x2, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b001, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter threshold", 0b100, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x0, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b1, 0x46, 0, 0b00000001), + AmpConfig("Left DAC input mixer: DAI1 left", 0b0, 0x22, 7, 0b10000000), + AmpConfig("Left DAC input mixer: DAI1 right", 0b0, 0x22, 6, 0b01000000), + AmpConfig("Left DAC input mixer: DAI2 left", 0b1, 0x22, 5, 0b00100000), + AmpConfig("Left DAC input mixer: DAI2 right", 0b0, 0x22, 4, 0b00010000), + AmpConfig("Right DAC input mixer: DAI2 left", 0b0, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b1, 0x22, 0, 0b00000001), + AmpConfig("Volume adjustment smoothing disabled", 0b1, 0x49, 6, 0b01000000), + ], +} + + +class Amplifier: + AMP_I2C_BUS = 0 + AMP_ADDRESS = 0x10 + + def __init__(self, debug=False): + self.debug = debug + + def _get_shutdown_config(self, amp_disabled: bool) -> AmpConfig: + return AmpConfig("Global shutdown", 0b0 if amp_disabled else 0b1, 0x51, 7, 0b10000000) + + def _set_configs(self, configs: list[AmpConfig]) -> None: + with SMBus(self.AMP_I2C_BUS) as bus: + for config in configs: + if self.debug: + print(f"Setting \"{config.name}\" to {config.value}:") + + old_value = bus.read_byte_data(self.AMP_ADDRESS, config.register, force=True) + new_value = (old_value & (~config.mask)) | ((config.value << config.offset) & config.mask) + bus.write_byte_data(self.AMP_ADDRESS, config.register, new_value, force=True) + + if self.debug: + print(f" Changed {hex(config.register)}: {hex(old_value)} -> {hex(new_value)}") + + def set_configs(self, configs: list[AmpConfig]) -> bool: + tries = 15 + backoff = 0. + for i in range(tries): + try: + self._set_configs(configs) + return True + except OSError: + backoff += 0.1 + time.sleep(backoff) + print(f"Failed to set amp config, {tries - i - 1} retries left") + return False + + def set_global_shutdown(self, amp_disabled: bool) -> bool: + return self.set_configs([self._get_shutdown_config(amp_disabled), ]) + + def initialize_configuration(self, model: str) -> bool: + cfgs = [ + self._get_shutdown_config(True), + *BASE_CONFIG, + *CONFIGS[model], + self._get_shutdown_config(False), + ] + return self.set_configs(cfgs) + + +if __name__ == "__main__": + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + model = model.split('comma ')[-1] + + amp = Amplifier() + amp.initialize_configuration(model) diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py new file mode 100644 index 000000000..b9fa7fbff --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py @@ -0,0 +1,740 @@ +import math +import os +import sys +import subprocess +import time +import tempfile +from enum import IntEnum +from functools import cached_property, lru_cache +from pathlib import Path + +from iqpilot.cereal import log +from iqpilot.common.utils import sudo_read, sudo_write +from iqpilot.common.gpio import gpio_set, gpio_init, get_irqs_for_action +from iqpilot.system.hardware.base import HardwareBase, LPABase, ThermalConfig, ThermalZone +from iqpilot.system.hardware.tici import iwlist +from iqpilot.system.hardware.tici.lpa import TiciLPA +from iqpilot.system.hardware.tici.pins import GPIO +from iqpilot.system.hardware.tici.amplifier import Amplifier + +NM = 'org.freedesktop.NetworkManager' +NM_CON_ACT = NM + '.Connection.Active' +NM_DEV = NM + '.Device' +NM_DEV_WL = NM + '.Device.Wireless' +NM_DEV_STATS = NM + '.Device.Statistics' +NM_AP = NM + '.AccessPoint' +DBUS_PROPS = 'org.freedesktop.DBus.Properties' + +MM = 'org.freedesktop.ModemManager1' +MM_MODEM = MM + ".Modem" +MM_MODEM_SIMPLE = MM + ".Modem.Simple" +MM_SIM = MM + ".Sim" + +class MM_MODEM_STATE(IntEnum): + FAILED = -1 + UNKNOWN = 0 + INITIALIZING = 1 + LOCKED = 2 + DISABLED = 3 + DISABLING = 4 + ENABLING = 5 + ENABLED = 6 + SEARCHING = 7 + REGISTERED = 8 + DISCONNECTING = 9 + CONNECTING = 10 + CONNECTED = 11 + +class NMActiveConnectionState(IntEnum): + UNKNOWN = 0 + ACTIVATING = 1 + ACTIVATED = 2 + DEACTIVATING = 3 + DEACTIVATED = 4 + +class NMMetered(IntEnum): + NM_METERED_UNKNOWN = 0 + NM_METERED_YES = 1 + NM_METERED_NO = 2 + NM_METERED_GUESS_YES = 3 + NM_METERED_GUESS_NO = 4 + +TIMEOUT = 0.1 +REFRESH_RATE_MS = 1000 + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +# https://developer.gnome.org/ModemManager/unstable/ModemManager-Flags-and-Enumerations.html#MMModemAccessTechnology +MM_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5 +MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14 + +# MMModemStateFailedReason +MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2 + + +def affine_irq(val, action): + irqs = get_irqs_for_action(action) + if len(irqs) == 0: + return + + for i in irqs: + sudo_write(str(val), f"/proc/irq/{i}/smp_affinity_list") + +@lru_cache +def get_device_type(): + # lru_cache and cache can cause memory leaks when used in classes + try: + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + except FileNotFoundError: + # off-device (e.g. the prebuilt build container fakes /TICI but has no + # devicetree); import must not crash. Not a real device type. + return "unknown" + return model.split('comma ')[-1] + +class Tici(HardwareBase): + @staticmethod + def _ensure_system_python_path() -> None: + system_site = "/usr/lib/python3/dist-packages" + if system_site not in sys.path and os.path.isdir(system_site): + sys.path.append(system_site) + + @staticmethod + def _run_direct_modem_command(command: str) -> None: + import serial + + last_error: Exception | None = None + for device in ("/dev/ttyUSB2", "/dev/ttyUSB3"): + if not os.path.exists(device): + continue + + try: + with serial.Serial(device, baudrate=9600, timeout=2) as modem: + modem.reset_input_buffer() + modem.write((command + "\r").encode("ascii")) + + deadline = time.monotonic() + 3.0 + while time.monotonic() < deadline: + line = modem.readline().decode(errors="ignore").strip() + if not line: + continue + if line == "OK": + return + if line == "ERROR" or "ERROR" in line: + raise RuntimeError(f"{device}: {line}") + raise TimeoutError(f"{device}: timed out waiting for modem response") + except Exception as e: + last_error = e + + if last_error is not None: + raise last_error + raise RuntimeError("No modem AT port available") + + @cached_property + def bus(self): + try: + import dbus + except ModuleNotFoundError: + self._ensure_system_python_path() + import dbus + return dbus.SystemBus() + + @cached_property + def nm(self): + return self.bus.get_object(NM, '/org/freedesktop/NetworkManager') + + @property # this should not be cached, in case the modemmanager restarts + def mm(self): + return self.bus.get_object(MM, '/org/freedesktop/ModemManager1') + + @cached_property + def amplifier(self): + if self.get_device_type() == "mici": + return None + if os.path.exists('/tmp/lite_hw') or os.environ.get('LITE') == '1': + return None + return Amplifier() + + def get_os_version(self): + with open("/VERSION") as f: + return f.read().strip() + + def get_device_type(self): + return get_device_type() + + def reboot(self, reason=None): + subprocess.check_output(["sudo", "reboot"]) + + def uninstall(self): + Path("/data/__system_reset__").touch() + os.sync() + self.reboot() + + def get_serial(self): + return self.get_cmdline()['androidboot.serialno'] + + def get_voltage(self): + with open("/sys/class/hwmon/hwmon1/in1_input") as f: + return int(f.read()) + + def get_current(self): + with open("/sys/class/hwmon/hwmon1/curr1_input") as f: + return int(f.read()) + + def set_ir_power(self, percent: int): + if self.get_device_type() in ("tici", "tizi"): + return + + value = int((percent / 100) * 300) + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write("0\n") + with open("/sys/class/leds/led:torch_2/brightness", "w") as f: + f.write(f"{value}\n") + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write(f"{value}\n") + + def get_network_type(self): + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_type = primary_connection.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if primary_type == '802-3-ethernet': + return NetworkType.ethernet + elif primary_type == '802-11-wireless': + return NetworkType.wifi + else: + active_connections = self.nm.Get(NM, 'ActiveConnections', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + for conn in active_connections: + c = self.bus.get_object(NM, conn) + tp = c.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if tp == 'gsm': + modem = self.get_modem() + modem_state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if modem_state < MM_MODEM_STATE.REGISTERED: + return NetworkType.none + access_t = modem.Get(MM_MODEM, 'AccessTechnologies', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if access_t >= MM_MODEM_ACCESS_TECHNOLOGY_LTE: + return NetworkType.cell4G + elif access_t >= MM_MODEM_ACCESS_TECHNOLOGY_UMTS: + return NetworkType.cell3G + else: + return NetworkType.cell2G + except Exception: + pass + + return NetworkType.none + + def get_modem(self): + objects = self.mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=TIMEOUT) + if not objects: + raise RuntimeError("ModemManager returned no modems") + modem_path = next(iter(objects)) + return self.bus.get_object(MM, modem_path) + + def get_wlan(self): + wlan_path = self.nm.GetDeviceByIpIface('wlan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wlan_path) + + def get_wwan(self): + wwan_path = self.nm.GetDeviceByIpIface('wwan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wwan_path) + + def get_sim_info(self): + modem = self.get_modem() + sim_path = modem.Get(MM_MODEM, 'Sim', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if sim_path == "/": + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + else: + sim = self.bus.get_object(MM, sim_path) + return { + 'sim_id': str(sim.Get(MM_SIM, 'SimIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'mcc_mnc': str(sim.Get(MM_SIM, 'OperatorIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'network_type': ["Unknown"], + 'sim_state': ["READY"], + 'data_connected': modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) == MM_MODEM_STATE.CONNECTED, + } + + def get_sim_lpa(self) -> LPABase: + return TiciLPA() + + def get_imei(self, slot): + if slot != 0: + return "" + + return str(self.get_modem().Get(MM_MODEM, 'EquipmentIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + + def get_network_info(self): + if self.get_device_type() == "mici": + return None + try: + modem = self.get_modem() + info = modem.Command("AT+QNWINFO", math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + extra = modem.Command('AT+QENG="servingcell"', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + if info and info.startswith('+QNWINFO: '): + info = info.replace('+QNWINFO: ', '').replace('"', '').split(',') + extra = "" if extra is None else extra.replace('+QENG: "servingcell",', '').replace('"', '') + state = "" if state is None else MM_MODEM_STATE(state).name + + if len(info) != 4: + return None + + technology, operator, band, channel = info + + return({ + 'technology': technology, + 'operator': operator, + 'band': band, + 'channel': int(channel), + 'extra': extra, + 'state': state, + }) + else: + return None + + def parse_strength(self, percentage): + if percentage < 25: + return NetworkStrength.poor + elif percentage < 50: + return NetworkStrength.moderate + elif percentage < 75: + return NetworkStrength.good + else: + return NetworkStrength.great + + def get_network_strength(self, network_type): + network_strength = NetworkStrength.unknown + + try: + if network_type == NetworkType.none: + pass + elif network_type == NetworkType.wifi: + wlan = self.get_wlan() + active_ap_path = wlan.Get(NM_DEV_WL, 'ActiveAccessPoint', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if active_ap_path != "/": + active_ap = self.bus.get_object(NM, active_ap_path) + strength = int(active_ap.Get(NM_AP, 'Strength', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + network_strength = self.parse_strength(strength) + else: # Cellular + modem = self.get_modem() + strength = int(modem.Get(MM_MODEM, 'SignalQuality', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)[0]) + network_strength = self.parse_strength(strength) + except Exception: + pass + + return network_strength + + def get_network_metered(self, network_type) -> bool: + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_devices = primary_connection.Get(NM_CON_ACT, 'Devices', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + for dev in primary_devices: + dev_obj = self.bus.get_object(NM, str(dev)) + metered_prop = dev_obj.Get(NM_DEV, 'Metered', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if network_type == NetworkType.wifi: + if metered_prop in [NMMetered.NM_METERED_YES, NMMetered.NM_METERED_GUESS_YES]: + return True + elif network_type in [NetworkType.cell2G, NetworkType.cell3G, NetworkType.cell4G, NetworkType.cell5G]: + if metered_prop == NMMetered.NM_METERED_NO: + return False + except Exception: + pass + + return super().get_network_metered(network_type) + + def get_modem_version(self): + try: + modem = self.get_modem() + return modem.Get(MM_MODEM, 'Revision', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + def get_modem_temperatures(self): + timeout = 0.2 # Default timeout is too short + try: + modem = self.get_modem() + temps = modem.Command("AT+QTEMP", math.ceil(timeout), dbus_interface=MM_MODEM, timeout=timeout) + return list(filter(lambda t: t != 255, map(int, temps.split(' ')[1].split(',')))) + except Exception: + return [] + + + def get_current_power_draw(self): + return (self.read_param_file("/sys/class/hwmon/hwmon1/power1_input", int) / 1e6) + + def get_som_power_draw(self): + return (self.read_param_file("/sys/class/power_supply/bms/voltage_now", int) * self.read_param_file("/sys/class/power_supply/bms/current_now", int) / 1e12) + + def shutdown(self): + os.system("sudo poweroff") + + def get_thermal_config(self): + intake, exhaust, case = None, None, None + if self.get_device_type() == "mici": + case = ThermalZone("case") + intake = ThermalZone("intake") + exhaust = ThermalZone("exhaust") + return ThermalConfig(cpu=[ThermalZone(f"cpu{i}-silver-usr") for i in range(4)] + + [ThermalZone(f"cpu{i}-gold-usr") for i in range(4)], + gpu=[ThermalZone("gpu0-usr"), ThermalZone("gpu1-usr")], + dsp=ThermalZone("compute-hvx-usr"), + memory=ThermalZone("ddr-usr"), + pmic=[ThermalZone("pm8998_tz"), ThermalZone("pm8005_tz")], + intake=intake, + exhaust=exhaust, + case=case) + + def set_display_power(self, on): + try: + with open("/sys/class/backlight/panel0-backlight/bl_power", "w") as f: + f.write("0" if on else "4") + except Exception: + pass + + def set_screen_brightness(self, percentage): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + val = int(percentage * (max_brightness / 100.)) + with open("/sys/class/backlight/panel0-backlight/brightness", "w") as f: + f.write(str(val)) + except Exception: + pass + + def get_screen_brightness(self): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + with open("/sys/class/backlight/panel0-backlight/brightness") as f: + return int(float(f.read()) / (max_brightness / 100.)) + except Exception: + return 0 + + def set_power_save(self, powersave_enabled): + # amplifier, 100mW at idle + if self.amplifier is not None: + self.amplifier.set_global_shutdown(amp_disabled=powersave_enabled) + if not powersave_enabled: + self.amplifier.initialize_configuration(self.get_device_type()) + + # *** CPU config *** + + # offline big cluster + for i in range(4, 8): + val = '0' if powersave_enabled else '1' + sudo_write(val, f'/sys/devices/system/cpu/cpu{i}/online') + + for n in ('0', '4'): + if powersave_enabled and n == '4': + continue + gov = 'ondemand' if powersave_enabled else 'performance' + sudo_write(gov, f'/sys/devices/system/cpu/cpufreq/policy{n}/scaling_governor') + + # *** IRQ config *** + + # GPU, modeld core + affine_irq(7, "kgsl-3d0") + + # camerad core + camera_irqs = ("a5", "cci", "cpas_camnoc", "cpas-cdm", "csid", "ife", "csid-lite", "ife-lite") + for n in camera_irqs: + affine_irq(6, n) + + def get_gpu_usage_percent(self): + try: + with open('/sys/class/kgsl/kgsl-3d0/gpubusy') as f: + used, total = f.read().strip().split() + return 100.0 * int(used) / int(total) + except Exception: + return 0 + + def initialize_hardware(self): + if self.amplifier is not None: + self.amplifier.initialize_configuration(self.get_device_type()) + + # Allow hardwared to write engagement status to kmsg + os.system("sudo chmod a+w /dev/kmsg") + + # Ensure fan gpio is enabled so fan runs until shutdown, also turned on at boot by the ABL + gpio_init(GPIO.SOM_ST_IO, True) + gpio_set(GPIO.SOM_ST_IO, 1) + + # *** IRQ config *** + + # mask off big cluster from default affinity + sudo_write("f", "/proc/irq/default_smp_affinity") + + # move these off the default core + affine_irq(1, "msm_vidc") # encoders + affine_irq(1, "i2c_geni") # sensors + + # *** GPU config *** + # https://github.com/commaai/agnos-kernel-sdm845/blob/master/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi#L216 + affine_irq(5, "fts_ts") # touch + affine_irq(5, "msm_drm") # display + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/min_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/max_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_bus_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_clk_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_rail_on") + sudo_write("1000", "/sys/class/kgsl/kgsl-3d0/idle_timer") + sudo_write("performance", "/sys/class/kgsl/kgsl-3d0/devfreq/governor") + sudo_write("710", "/sys/class/kgsl/kgsl-3d0/max_clock_mhz") + + # setup governors + sudo_write("performance", "/sys/class/devfreq/soc:qcom,cpubw/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu0/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu4/governor") + + # *** VIDC (encoder) config *** + sudo_write("N", "/sys/kernel/debug/msm_vidc/clock_scaling") + sudo_write("Y", "/sys/kernel/debug/msm_vidc/disable_thermal_mitigation") + + # pandad core + affine_irq(3, "spi_geni") # SPI + if "tici" in self.get_device_type(): + affine_irq(3, "xhci-hcd:usb3") + affine_irq(3, "xhci-hcd:usb1") + try: + pid = subprocess.check_output(["pgrep", "-f", "spi0"], encoding='utf8').strip() + subprocess.call(["sudo", "chrt", "-f", "-p", "1", pid]) + subprocess.call(["sudo", "taskset", "-pc", "3", pid], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessException as e: + print(str(e)) + + def configure_modem(self): + from iqpilot.common.params import Params + + sim_info = self.get_sim_info() + sim_id = sim_info.get('sim_id', '') + params = Params() + manual_apn = params.get("GsmApn", encoding="utf-8") or "" + metered_enabled = params.get_bool("GsmMetered") + + modem = self.get_modem() + try: + manufacturer = str(modem.Get(MM_MODEM, 'Manufacturer', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + except Exception: + manufacturer = None + + cmds = [] + is_comma_profile = self.get_sim_lpa().is_comma_profile(sim_id) + roaming_enabled = params.get_bool("GsmRoaming") + initial_eps_apn = "" if is_comma_profile else manual_apn + + if not is_comma_profile and params.get("GsmRoaming") is None: + params.put_bool("GsmRoaming", True) + roaming_enabled = True + + subprocess.call([ + "nmcli", "connection", "modify", "lte", + "gsm.auto-config", "no" if manual_apn else "yes", + "gsm.apn", manual_apn, + "gsm.home-only", "no" if roaming_enabled else "yes", + "gsm.network-id", "", + "gsm.initial-eps-bearer-configure", "yes" if initial_eps_apn else "no", + "gsm.initial-eps-bearer-apn", initial_eps_apn, + "connection.metered", "unknown" if metered_enabled else "no", + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + if self.get_device_type() in ("tici", "tizi"): + if initial_eps_apn: + subprocess.call(["mmcli", "-m", "any", f'--3gpp-set-initial-eps-bearer-settings=apn={initial_eps_apn}']) + else: + subprocess.call(["mmcli", "-m", "any", '--3gpp-set-initial-eps-bearer-settings=apn=']) + + cmds += [ + # configure modem as data-centric + 'AT+QNVW=5280,0,"0102000000000000"', + 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', + 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', + ] + if self.get_device_type() == "tizi": + cmds += [ + 'AT+QSIMDET=1,0', + 'AT+QSIMSTAT=1', + ] + elif manufacturer == 'Cavli Inc.': + cmds += [ + 'AT^SIMSWAP=1', # use SIM slot, instead of internal eSIM + 'AT$QCSIMSLEEP=0', # disable SIM sleep + 'AT$QCSIMCFG=SimPowerSave,0', # more sleep disable + + # ethernet config + 'AT$QCPCFG=usbNet,0', + 'AT$QCNETDEVCTL=3,1', + ] + else: + # this modem gets upset with too many AT commands + if sim_id is None or len(sim_id) == 0: + cmds += [ + # SIM sleep disable + 'AT$QCSIMSLEEP=0', + 'AT$QCSIMCFG=SimPowerSave,0', + + # ethernet config + 'AT$QCPCFG=usbNet,1', + ] + + for cmd in cmds: + try: + modem.Command(cmd, math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + + # eSIM prime + dest = "/etc/NetworkManager/system-connections/esim.nmconnection" + if self.get_sim_lpa().is_comma_profile(sim_id) and not os.path.exists(dest): + with open(Path(__file__).parent/'esim.nmconnection') as f, tempfile.NamedTemporaryFile(mode='w') as tf: + dat = f.read() + dat = dat.replace("sim-id=", f"sim-id={sim_id}") + tf.write(dat) + tf.flush() + + # needs to be root + os.system(f"sudo cp {tf.name} {dest}") + os.system(f"sudo nmcli con load {dest}") + + def recover_sim_detection(self) -> bool: + # A worn SIM-tray presence switch can read "removed" while the SIM pads still make + # contact; with hot-swap detect armed (AT+QSIMDET=1) the modem never powers the SIM + # and lands in failed/sim-missing. Disabling detect and rebooting the modem makes it + # probe the SIM electrically. Safe to retry on failure: firing disarms the QSIMDET + # gate, so a genuinely SIM-less device gets at most one extra modem reboot per boot. + if self.get_device_type() not in ("tici", "tizi"): + return False + + try: + modem = self.get_modem() + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if state != MM_MODEM_STATE.FAILED: + return False + reason = modem.Get(MM_MODEM, 'StateFailedReason', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if reason != MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: + return False + detect = str(modem.Command('AT+QSIMDET?', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT)).strip() + if not detect.startswith('+QSIMDET: 1'): + return False + modem.Command('AT+QSIMDET=0,0', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + modem.Command('AT+CFUN=1,1', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + return True + except Exception: + return False + + def reboot_modem(self): + modem = None + try: + modem = self.get_modem() + except Exception: + pass + + if modem is not None: + for state in (0, 1): + try: + modem.Command(f'AT+CFUN={state}', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + return + + for state in (0, 1): + try: + self._run_direct_modem_command(f"AT+CFUN={state}") + except Exception: + pass + + def get_networks(self): + r = {} + + wlan = iwlist.scan() + if wlan is not None: + r['wlan'] = wlan + + lte_info = self.get_network_info() + if lte_info is not None: + extra = lte_info['extra'] + + # ,"LTE",,,,,,,, + # ,,,,,,, + if 'LTE' in extra: + extra = extra.split(',') + try: + r['lte'] = [{ + "mcc": int(extra[3]), + "mnc": int(extra[4]), + "cid": int(extra[5], 16), + "nmr": [{"pci": int(extra[6]), "earfcn": int(extra[7])}], + }] + except (ValueError, IndexError): + pass + + return r + + def get_modem_data_usage(self): + try: + wwan = self.get_wwan() + + # Ensure refresh rate is set so values don't go stale + refresh_rate = wwan.Get(NM_DEV_STATS, 'RefreshRateMs', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if refresh_rate != REFRESH_RATE_MS: + u = type(refresh_rate) + wwan.Set(NM_DEV_STATS, 'RefreshRateMs', u(REFRESH_RATE_MS), dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + tx = wwan.Get(NM_DEV_STATS, 'TxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + rx = wwan.Get(NM_DEV_STATS, 'RxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + return int(tx), int(rx) + except Exception: + return -1, -1 + + def has_internal_panda(self): + return True + + def reset_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 0) + time.sleep(1) + gpio_set(GPIO.STM_RST_N, 0) + + def recover_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 1) + time.sleep(0.5) + gpio_set(GPIO.STM_RST_N, 0) + time.sleep(0.5) + gpio_set(GPIO.STM_BOOT0, 0) + + def booted(self): + # this normally boots within 8s, but on rare occasions takes 30+s + encoder_state = sudo_read("/sys/kernel/debug/msm_vidc/core0/info") + if "Core state: 0" in encoder_state and (time.monotonic() < 60*2): + return False + return True + +if __name__ == "__main__": + t = Tici() + t.configure_modem() + t.initialize_hardware() + t.set_power_save(False) + print(t.get_sim_info()) diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py new file mode 100644 index 000000000..1e7c428b4 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py @@ -0,0 +1,35 @@ +import subprocess + + +def scan(interface="wlan0"): + result = [] + try: + r = subprocess.check_output(["iwlist", interface, "scan"], encoding='utf8') + + mac = None + for line in r.split('\n'): + if "Address" in line: + # Based on the adapter eithere a percentage or dBm is returned + # Add previous network in case no dBm signal level was seen + if mac is not None: + result.append({"mac": mac}) + mac = None + + mac = line.split(' ')[-1] + elif "dBm" in line: + try: + level = line.split('Signal level=')[1] + rss = int(level.split(' ')[0]) + result.append({"mac": mac, "rss": rss}) + mac = None + except ValueError: + continue + + # Add last network if no dBm was found + if mac is not None: + result.append({"mac": mac}) + + return result + + except Exception: + return None diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py new file mode 100644 index 000000000..a636742d5 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py @@ -0,0 +1,1482 @@ +#!/usr/bin/env python3 +# SGP.22 v2.3: https://www.gsma.com/solutions-and-impact/technologies/esim/wp-content/uploads/2021/07/SGP.22-v2.3.pdf + +import argparse +import atexit +import base64 +import hashlib +import json +import math +import os +import re +import requests +import serial +import subprocess +import sys +import time + +from collections.abc import Generator +from contextlib import contextmanager +from pathlib import Path +from typing import Literal +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.system.hardware.base import LPABase, LPAError, LPAProfileNotFoundError, Profile + +GSMA_CI_BUNDLE = str(Path(__file__).parent / 'gsma_ci_bundle.pem') + + +DEFAULT_DEVICE = "/dev/modem_at0" +DEFAULT_BAUD = 9600 +DEFAULT_TIMEOUT = 5.0 +# https://euicc-manual.osmocom.org/docs/lpa/applet-id/ +ISDR_AID = "A0000005591010FFFFFFFF8900000100" +ES10X_MSS = 120 +MM = "org.freedesktop.ModemManager1" +MM_MODEM = MM + ".Modem" + +# TLV Tags +TAG_ICCID = 0x5A +TAG_STATUS = 0x80 +TAG_EUICC_INFO = 0xBF20 +TAG_PREPARE_DOWNLOAD = 0xBF21 +TAG_PROFILE_INFO_LIST = 0xBF2D +TAG_EUICC_CHALLENGE = 0xBF2E +TAG_SET_NICKNAME = 0xBF29 +TAG_LIST_NOTIFICATION = 0xBF28 +TAG_RETRIEVE_NOTIFICATION = 0xBF2B +TAG_NOTIFICATION_METADATA = 0xBF2F +TAG_NOTIFICATION_SENT = 0xBF30 +TAG_ENABLE_PROFILE = 0xBF31 +TAG_DISABLE_PROFILE = 0xBF32 +TAG_DELETE_PROFILE = 0xBF33 +TAG_BPP = 0xBF36 +TAG_PROFILE_INSTALL_RESULT = 0xBF37 +TAG_AUTH_SERVER = 0xBF38 +TAG_CANCEL_SESSION = 0xBF41 + +STATE_LABELS = {0: "disabled", 1: "enabled", 255: "unknown"} +ICON_LABELS = {0: "jpeg", 1: "png", 255: "unknown"} +CLASS_LABELS = {0: "test", 1: "provisioning", 2: "operational", 255: "unknown"} +PROFILE_ERROR_CODES = { + 0x01: "iccidOrAidNotFound", 0x02: "profileNotInDisabledState", + 0x03: "disallowedByPolicy", 0x04: "wrongProfileReenabling", + 0x05: "catBusy", 0x06: "undefinedError", +} +AUTH_SERVER_ERROR_CODES = { + 0x01: "eUICCVerificationFailed", 0x02: "eUICCCertificateExpired", + 0x03: "eUICCCertificateRevoked", 0x05: "invalidServerSignature", + 0x06: "euiccCiPKUnknown", 0x0A: "matchingIdRefused", + 0x10: "insufficientMemory", +} +BPP_COMMAND_NAMES = { + 0: "initialiseSecureChannel", 1: "configureISDP", 2: "storeMetadata", + 3: "storeMetadata2", 4: "replaceSessionKeys", 5: "loadProfileElements", +} +BPP_ERROR_REASONS = { + 1: "incorrectInputValues", 2: "invalidSignature", 3: "invalidTransactionId", + 4: "unsupportedCrtValues", 5: "unsupportedRemoteOperationType", + 6: "unsupportedProfileClass", 7: "scp03tStructureError", 8: "scp03tSecurityError", + 9: "iccidAlreadyExistsOnEuicc", 10: "insufficientMemoryForProfile", + 11: "installInterrupted", 12: "peProcessingError", 13: "dataMismatch", + 14: "invalidNAA", +} +CANCEL_SESSION_REASON = { + 0: "endUserRejection", 1: "postponed", 2: "timeout", + 3: "pprNotAllowed", 127: "undefinedReason", +} + +ESIM_TLS_BUNDLE_ENV = "IQPILOT_ESIM_CA_BUNDLE" +ESIM_QESIM_INIT_ENV = "IQPILOT_ESIM_QESIM_INIT" +ESIM_EXCLUSIVE_MODEM_ENV = "IQPILOT_ESIM_EXCLUSIVE_MODEM" + + +def _ensure_dbus_import(): + try: + import dbus # noqa: F401 + return + except ModuleNotFoundError: + dist_packages = "/usr/lib/python3/dist-packages" + if dist_packages not in sys.path and os.path.isdir(dist_packages): + sys.path.append(dist_packages) + import dbus # noqa: F401 + + +def _tls_verify_option() -> bool | str: + # Default to the GSMA CI bundle used by the reference eSIM branch. + # Allow explicit override for local testing or forced system trust behavior. + override = os.getenv(ESIM_TLS_BUNDLE_ENV, "").strip() + if not override: + return GSMA_CI_BUNDLE + if override.lower() in ("0", "false", "off"): + return False + if override.lower() in ("1", "true", "on", "system"): + return True + return override + + +def b64e(data: bytes) -> str: + return base64.b64encode(data).decode("ascii") + + +def b64d(s: str) -> bytes: + return base64.b64decode(base64_trim(s)) + + +def _decode_apdu_response_blob(raw: str, label: str) -> bytes: + filtered = re.sub(r"[^0-9A-Fa-f]", "", raw) + if len(filtered) < 2 or len(filtered) % 2: + raise RuntimeError(f"Malformed {label} response payload") + return bytes.fromhex(filtered) + + +class AtClient: + def __init__(self, device: str, baud: int, timeout: float, verbose: bool) -> None: + self._device = device + self._baud = baud + self._timeout = timeout + self.verbose = verbose + self.channel: str | None = None + self._serial: serial.Serial | None = None + self._use_csim = False + self._has_qesim = False + self._qesim_lpa_enabled = False + try: + self._serial = serial.Serial(device, baudrate=baud, timeout=timeout) + self._disable_echo() + except (serial.SerialException, PermissionError, OSError): + self._serial = None + if self.verbose: + print(f"!! using ModemManager DBus AT transport for {device}", file=sys.stderr) + + def close(self) -> None: + try: + if self.channel: + try: + self.query(f"AT+CCHC={self.channel}") + except Exception as e: + if self.verbose: + print(f"!! ignoring channel close failure: {e}", file=sys.stderr) + finally: + self.channel = None + finally: + if self._serial is not None: + self._serial.close() + + @staticmethod + def _is_busy_open_error(error: Exception) -> bool: + text = str(error).lower() + return "errno 16" in text or "device or resource busy" in text + + def _disable_echo(self) -> None: + if self._serial is None: + return + self._serial.reset_input_buffer() + self._serial.write(b"ATE0\r") + time.sleep(0.1) + self._serial.reset_input_buffer() + + def _send(self, cmd: str) -> None: + if self.verbose: + print(f">> {cmd}", file=sys.stderr) + assert self._serial is not None + self._serial.write((cmd + "\r").encode("ascii")) + + def _expect(self) -> list[str]: + lines: list[str] = [] + while True: + assert self._serial is not None + raw = self._serial.readline() + if not raw: + raise TimeoutError("AT command timed out") + line = raw.decode(errors="ignore").strip() + if not line: + continue + if self.verbose: + print(f"<< {line}", file=sys.stderr) + if line == "OK": + return lines + if line == "ERROR": + raise RuntimeError("AT command failed") + if "ERROR" in line and line.startswith("+"): + # Catch +CME ERROR / +CMS ERROR and similar modem-specific failures. + raise RuntimeError(f"AT command failed: {line}") + lines.append(line) + + def _get_modem(self): + _ensure_dbus_import() + import dbus + + bus = dbus.SystemBus() + mm = bus.get_object(MM, '/org/freedesktop/ModemManager1') + objects = mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=self._timeout) + modem_paths = [path for path in objects.keys() if "/Modem/" in str(path)] + if not modem_paths: + raise RuntimeError("ModemManager returned no modems") + return bus.get_object(MM, modem_paths[0]) + + def _dbus_query(self, cmd: str) -> list[str]: + if self.verbose: + print(f"DBUS >> {cmd}", file=sys.stderr) + try: + result = str(self._get_modem().Command(cmd, math.ceil(self._timeout), dbus_interface=MM_MODEM, timeout=self._timeout)) + except Exception as e: + raise RuntimeError(f"AT command failed: {e}") from e + lines = [line.strip() for line in result.splitlines() if line.strip()] + if self.verbose: + for line in lines: + print(f"DBUS << {line}", file=sys.stderr) + return lines + + def _reconnect_serial(self) -> None: + self.channel = None + try: + if self._serial is not None: + self._serial.close() + except Exception: + pass + self._serial = serial.Serial(self._device, baudrate=self._baud, timeout=self._timeout) + self._disable_echo() + + def query(self, cmd: str) -> list[str]: + if self._serial is None: + return self._dbus_query(cmd) + try: + self._send(cmd) + return self._expect() + except (OSError, serial.SerialException) as e: + try: + self._reconnect_serial() + self._send(cmd) + return self._expect() + except Exception: + raise RuntimeError(f"AT transport error ({cmd}): {e}") from e + except TimeoutError as e: + raise TimeoutError(f"AT command timed out ({cmd})") from e + except RuntimeError as e: + raise RuntimeError(f"AT command failed ({cmd}): {e}") from e + + def _supports_qesim(self) -> bool: + try: + lines = self.query("AT+QESIM=?") + except Exception: + return False + return any(line.startswith("+QESIM:") for line in lines) + + def _set_quectel_lpa_mode(self) -> None: + self._has_qesim = self._supports_qesim() + self._qesim_lpa_enabled = False + if not self._has_qesim: + return + + # Some Quectel firmwares require enabling internal LPA mode before + # ISO7816 channel open commands (CCHO/CGLA) will succeed. + lpa_enable_cmds = ( + 'AT+QESIM="lpa_enable",1', + 'AT+QESIM="lpa_enable"', + ) + for cmd in lpa_enable_cmds: + try: + self.query(cmd) + self._qesim_lpa_enabled = True + break + except Exception: + continue + + # Keep BIP auth enabled when supported; this is needed by some firmware + # revisions for profile download/auth paths. + try: + lines = self.query('AT+QCFG="bip/auth"?') + needs_enable = any('"bip/auth",0' in line for line in lines) + if needs_enable: + self.query('AT+QCFG="bip/auth",1') + except Exception: + pass + + def ensure_capabilities(self) -> None: + if self._serial is None: + return + + # Some modem firmwares reject command test forms (e.g. AT+CCHO=?) + # while still supporting real execution. Keep these probes non-fatal. + self.query("AT") + # Keep IQ-specific QESIM initialization opt-in for debugging only. + # Default behavior should match upstream greatgitsby/esim transport flow. + if os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + try: + self.query("AT+CMEE=2") + except Exception: + pass + self._set_quectel_lpa_mode() + for command in ("AT+CCHO", "AT+CCHC", "AT+CGLA", "AT+CSIM"): + try: + self.query(f"{command}=?") + except Exception as e: + if self.verbose: + print(f"!! capability probe failed for {command}: {e}", file=sys.stderr) + + def open_isdr(self) -> None: + try: + self.query(f'AT+CCHC=1') + except Exception: + pass + ccho_candidates = [ + f'AT+CCHO="{ISDR_AID}"', + f"AT+CCHO={ISDR_AID}", + ] + for cmd in ccho_candidates: + try: + lines = self.query(cmd) + except Exception: + continue + for line in lines: + if line.startswith("+CCHO:") and (ch := line.split(":", 1)[1].strip()): + self.channel = ch + return + + # Fallback for modems that reject CCHO but allow APDUs over basic channel. + self.channel = "0" + aid_len = len(ISDR_AID) // 2 + select_isdr = bytes.fromhex(f"00A40400{aid_len:02X}{ISDR_AID}") + try: + _, sw1, sw2 = self.send_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + return + raise RuntimeError(f"ISD-R SELECT failed on basic channel SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + # Final fallback for modems that only support APDU via CSIM. + try: + _, sw1, sw2 = self._send_csim_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + self._use_csim = True + self.channel = "csim" + if self.verbose: + print("!! using CSIM APDU transport fallback", file=sys.stderr) + return + raise RuntimeError(f"ISD-R SELECT failed on CSIM SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + if self._has_qesim and not self._qesim_lpa_enabled and os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + raise RuntimeError( + "Modem exposes AT+QESIM but rejects LPA enable and ISD-R access; " + "this firmware/SKU likely does not provide usable eSIM functionality" + ) + raise RuntimeError("Failed to access eUICC ISD-R (CCHO/CGLA/CSIM all failed)") + + def send_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + for attempt in range(3): + try: + if not self.channel: + self.open_isdr() + if self._use_csim: + return self._send_csim_apdu(apdu) + hex_payload = apdu.hex().upper() + cmd = f'AT+CGLA={self.channel},{len(hex_payload)},"{hex_payload}"' + for query_attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CGLA:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CGLA") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if query_attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CGLA response") + except RuntimeError: + self.channel = None + self._use_csim = False + if attempt == 2: + raise + time.sleep(1 + attempt) + raise RuntimeError("send_apdu failed") + + def _send_csim_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + hex_payload = apdu.hex().upper() + cmd = f'AT+CSIM={len(hex_payload)},"{hex_payload}"' + for attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CSIM:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CSIM") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CSIM response") + + +# --- TLV utilities --- + +def iter_tlv(data: bytes, with_positions: bool = False) -> Generator: + idx, length = 0, len(data) + while idx < length: + start_pos = idx + tag = data[idx] + idx += 1 + if tag & 0x1F == 0x1F: # Multi-byte tag + tag_value = tag + while idx < length: + next_byte = data[idx] + idx += 1 + tag_value = (tag_value << 8) | next_byte + if not (next_byte & 0x80): + break + else: + tag_value = tag + if idx >= length: + break + size = data[idx] + idx += 1 + if size & 0x80: # Multi-byte length + num_bytes = size & 0x7F + if idx + num_bytes > length: + break + size = int.from_bytes(data[idx : idx + num_bytes], "big") + idx += num_bytes + if idx + size > length: + break + value = data[idx : idx + size] + idx += size + yield (tag_value, value, start_pos, idx) if with_positions else (tag_value, value) + + +def find_tag(data: bytes, target: int) -> bytes | None: + return next((v for t, v in iter_tlv(data) if t == target), None) + + +def encode_tlv(tag: int, value: bytes) -> bytes: + tag_bytes = bytes([(tag >> 8) & 0xFF, tag & 0xFF]) if tag > 255 else bytes([tag]) + vlen = len(value) + if vlen <= 127: + return tag_bytes + bytes([vlen]) + value + length_bytes = vlen.to_bytes((vlen.bit_length() + 7) // 8, "big") + return tag_bytes + bytes([0x80 | len(length_bytes)]) + length_bytes + value + + +def tbcd_to_string(raw: bytes) -> str: + return "".join(str(n) for b in raw for n in (b & 0x0F, b >> 4) if n <= 9) + + +def string_to_tbcd(s: str) -> bytes: + digits = [int(c) for c in s if c.isdigit()] + return bytes(digits[i] | ((digits[i + 1] if i + 1 < len(digits) else 0xF) << 4) for i in range(0, len(digits), 2)) + + +def base64_trim(s: str) -> str: + return "".join(c for c in s if c not in "\n\r \t") + + +# --- Shared helpers --- + +def _int_bytes(n: int) -> bytes: + """Encode a positive integer as minimal big-endian bytes (at least 1 byte).""" + return n.to_bytes((n.bit_length() + 7) // 8 or 1, "big") + + +def _extract_status(response: bytes, tag: int, name: str) -> int: + """Extract the status byte from a tagged ES10x response.""" + root = find_tag(response, tag) + if root is None: + raise RuntimeError(f"Missing {name}Response") + status = find_tag(root, TAG_STATUS) + if status is None: + raise RuntimeError(f"Missing status in {name}Response") + return status[0] + + +# Profile field decoders: TLV tag -> (field_name, decoder) +_PROFILE_FIELDS = { + TAG_ICCID: ("iccid", tbcd_to_string), + 0x4F: ("isdpAid", lambda v: v.hex().upper()), + 0x9F70: ("profileState", lambda v: STATE_LABELS.get(v[0], "unknown")), + 0x90: ("profileNickname", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x91: ("serviceProviderName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x92: ("profileName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x93: ("iconType", lambda v: ICON_LABELS.get(v[0], "unknown")), + 0x94: ("icon", b64e), + 0x95: ("profileClass", lambda v: CLASS_LABELS.get(v[0], "unknown")), +} + + +def _decode_profile_fields(data: bytes) -> dict: + """Parse known profile metadata TLV fields into a dict.""" + result = {} + for tag, value in iter_tlv(data): + if (field := _PROFILE_FIELDS.get(tag)): + result[field[0]] = field[1](value) + return result + + +# Notification field decoders: TLV tag -> (field_name, decoder) +_NOTIF_FIELDS = { + TAG_STATUS: ("seqNumber", lambda v: int.from_bytes(v, "big")), + 0x81: ("profileManagementOperation", lambda v: next((m for m in [0x80, 0x40, 0x20, 0x10] if len(v) >= 2 and v[1] & m), 0xFF)), + 0x0C: ("notificationAddress", lambda v: v.decode("utf-8", errors="ignore")), + TAG_ICCID: ("iccid", tbcd_to_string), +} + + +# --- ES10x command transport --- + +def es10x_command(client: AtClient, data: bytes) -> bytes: + response = bytearray() + sequence = 0 + offset = 0 + while offset < len(data): + chunk = data[offset : offset + ES10X_MSS] + offset += len(chunk) + is_last = offset == len(data) + apdu = bytes([0x80, 0xE2, 0x91 if is_last else 0x11, sequence & 0xFF, len(chunk)]) + chunk + segment, sw1, sw2 = client.send_apdu(apdu) + response.extend(segment) + while True: + if sw1 == 0x61: # More data available + segment, sw1, sw2 = client.send_apdu(bytes([0x80, 0xC0, 0x00, 0x00, sw2 or 0])) + response.extend(segment) + continue + if (sw1 & 0xF0) == 0x90: + break + raise RuntimeError(f"APDU failed with SW={sw1:02X}{sw2:02X}") + sequence += 1 + return bytes(response) + + +# --- ES9P HTTP --- + +def es9p_request(smdp_address: str, endpoint: str, payload: dict, error_prefix: str = "Request") -> dict: + if not system_time_valid(): + raise RuntimeError("System time is not set; TLS certificate validation requires a valid clock") + url = f"https://{smdp_address}/gsma/rsp2/es9plus/{endpoint}" + headers = {"User-Agent": "gsma-rsp-lpad", "X-Admin-Protocol": "gsma/rsp/v2.3.0", "Content-Type": "application/json"} + resp = requests.post(url, json=payload, headers=headers, timeout=30, verify=_tls_verify_option()) + resp.raise_for_status() + if not resp.content: + return {} + data = resp.json() + if "header" in data and "functionExecutionStatus" in data["header"]: + status = data["header"]["functionExecutionStatus"] + if status.get("status") == "Failed": + sd = status.get("statusCodeData", {}) + raise RuntimeError(f"{error_prefix} failed: {sd.get('reasonCode', 'unknown')}/{sd.get('subjectCode', 'unknown')} - {sd.get('message', 'unknown')}") + return data + + +# --- Profile operations --- + +def decode_profiles(blob: bytes) -> list[dict]: + root = find_tag(blob, TAG_PROFILE_INFO_LIST) + if root is None: + raise RuntimeError("Missing ProfileInfoList") + list_ok = find_tag(root, 0xA0) + if list_ok is None: + return [] + defaults = {name: None for name, _ in _PROFILE_FIELDS.values()} + return [{**defaults, **_decode_profile_fields(value)} for tag, value in iter_tlv(list_ok) if tag == 0xE3] + + +def list_profiles(client: AtClient) -> list[dict]: + return decode_profiles(es10x_command(client, bytes.fromhex("BF2D00"))) + + +def _profile_op(client: AtClient, tag: int, iccid: str, refresh: bool, action: str) -> None: + inner = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + if tag != TAG_DELETE_PROFILE: + if not refresh: + inner += encode_tlv(0x81, b'\x00') + inner = encode_tlv(0xA0, inner) + code = _extract_status(es10x_command(client, encode_tlv(tag, inner)), tag, f"{action.capitalize()}Profile") + if code == 0x00: + return + if code == 0x02 and tag != TAG_DELETE_PROFILE: + print(f"profile {iccid} already {action}d") + return + raise RuntimeError(f"{action.capitalize()}Profile failed: {PROFILE_ERROR_CODES.get(code, 'unknown')} (0x{code:02X})") + + +def enable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_ENABLE_PROFILE, iccid, refresh, "enable") + + +def disable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_DISABLE_PROFILE, iccid, refresh, "disable") + + +def delete_profile(client: AtClient, iccid: str) -> None: + _profile_op(client, TAG_DELETE_PROFILE, iccid, True, "delete") + + +def set_profile_nickname(client: AtClient, iccid: str, nickname: str) -> None: + nickname_bytes = nickname.encode("utf-8") + if len(nickname_bytes) > 64: + raise ValueError("Profile nickname must be 64 bytes or less") + content = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + encode_tlv(0x90, nickname_bytes) + code = _extract_status(es10x_command(client, encode_tlv(TAG_SET_NICKNAME, content)), TAG_SET_NICKNAME, "SetNickname") + if code == 0x01: + raise RuntimeError(f"profile {iccid} not found") + if code != 0x00: + raise RuntimeError(f"SetNickname failed with status 0x{code:02X}") + + +# --- Notifications --- + +def list_notifications(client: AtClient) -> list[dict]: + response = es10x_command(client, encode_tlv(TAG_LIST_NOTIFICATION, b"")) + root = find_tag(response, TAG_LIST_NOTIFICATION) + if root is None: + raise RuntimeError("Missing ListNotificationResponse") + metadata_list = find_tag(root, 0xA0) + if metadata_list is None: + return [] + notifications: list[dict] = [] + for tag, value in iter_tlv(metadata_list): + if tag != TAG_NOTIFICATION_METADATA: + continue + notification = {"seqNumber": None, "profileManagementOperation": None, "notificationAddress": None, "iccid": None} + for t, v in iter_tlv(value): + if (field := _NOTIF_FIELDS.get(t)): + notification[field[0]] = field[1](v) + if notification["seqNumber"] is not None and notification["profileManagementOperation"] is not None and notification["notificationAddress"]: + notifications.append(notification) + return notifications + + +def retrieve_notification(client: AtClient, seq_number: int) -> dict: + request = encode_tlv(TAG_RETRIEVE_NOTIFICATION, encode_tlv(0xA0, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + response = es10x_command(client, request) + root = find_tag(response, TAG_RETRIEVE_NOTIFICATION) + if root is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + a0_content = find_tag(root, 0xA0) + if a0_content is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + pending_notif, pending_tag = None, None + for tag, value in iter_tlv(a0_content): + if tag in (TAG_PROFILE_INSTALL_RESULT, 0x30): + pending_notif, pending_tag = value, tag + break + if pending_notif is None: + raise RuntimeError("Missing PendingNotification") + if pending_tag == TAG_PROFILE_INSTALL_RESULT: + result_data = find_tag(pending_notif, 0xBF27) + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) if result_data else None + else: + notif_meta = find_tag(pending_notif, TAG_NOTIFICATION_METADATA) + if notif_meta is None: + raise RuntimeError("Missing NotificationMetadata") + addr = find_tag(notif_meta, 0x0C) + if addr is None: + raise RuntimeError("Missing notificationAddress") + return {"notificationAddress": addr.decode("utf-8", errors="ignore"), "b64_PendingNotification": b64e(pending_notif)} + + +def remove_notification(client: AtClient, seq_number: int) -> None: + response = es10x_command(client, encode_tlv(TAG_NOTIFICATION_SENT, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + root = find_tag(response, TAG_NOTIFICATION_SENT) + if root is None: + raise RuntimeError("Invalid NotificationSentResponse") + status = find_tag(root, TAG_STATUS) + if status is None or int.from_bytes(status, "big") != 0: + raise RuntimeError("RemoveNotificationFromList failed") + + +def process_notifications(client: AtClient) -> None: + for notification in list_notifications(client): + seq_number, smdp_address = notification["seqNumber"], notification["notificationAddress"] + if not seq_number or not smdp_address: + continue + try: + notif_data = retrieve_notification(client, seq_number) + es9p_request(smdp_address, "handleNotification", {"pendingNotification": notif_data["b64_PendingNotification"]}, "HandleNotification") + remove_notification(client, seq_number) + except Exception: + pass + + +# --- Authentication & Download --- + +def get_challenge_and_info(client: AtClient) -> tuple[bytes, bytes]: + challenge_resp = es10x_command(client, encode_tlv(TAG_EUICC_CHALLENGE, b"")) + root = find_tag(challenge_resp, TAG_EUICC_CHALLENGE) + if root is None: + raise RuntimeError("Missing GetEuiccDataResponse") + challenge = find_tag(root, TAG_STATUS) + if challenge is None: + raise RuntimeError("Missing challenge in response") + info_resp = es10x_command(client, encode_tlv(TAG_EUICC_INFO, b"")) + if not info_resp.startswith(bytes([0xBF, 0x20])): + raise RuntimeError("Missing GetEuiccInfo1Response") + return challenge, info_resp + + +def authenticate_server(client: AtClient, b64_signed1: str, b64_sig1: str, b64_pk_id: str, b64_cert: str, matching_id: str | None = None) -> str: + # Build request + tac = bytes([0x35, 0x29, 0x06, 0x11]) + device_info = encode_tlv(TAG_STATUS, tac) + encode_tlv(0xA1, b"") + ctx_inner = b"" + if matching_id: + ctx_inner += encode_tlv(TAG_STATUS, matching_id.encode("utf-8")) + ctx_inner += encode_tlv(0xA1, device_info) + content = base64.b64decode(b64_signed1) + base64.b64decode(b64_sig1) + base64.b64decode(b64_pk_id) + base64.b64decode(b64_cert) + encode_tlv(0xA0, ctx_inner) + request = encode_tlv(TAG_AUTH_SERVER, content) + + response = es10x_command(client, request) + if not response.startswith(bytes([0xBF, 0x38])): + raise RuntimeError("Invalid AuthenticateServerResponse") + + # Check for eUICC-side errors + root = find_tag(response, TAG_AUTH_SERVER) + if root is not None: + error_tag = find_tag(root, 0xA1) + if error_tag is not None: + code = int.from_bytes(error_tag, "big") if error_tag else 0 + desc = AUTH_SERVER_ERROR_CODES.get(code, "unknown") + raise RuntimeError(f"AuthenticateServer rejected by eUICC: {desc} (0x{code:02X})") + + return b64e(response) + + +def prepare_download(client: AtClient, b64_signed2: str, b64_sig2: str, b64_cert: str, cc: str | None = None) -> str: + smdp_signed2 = base64.b64decode(b64_signed2) + smdp_signature2 = base64.b64decode(b64_sig2) + smdp_certificate = base64.b64decode(b64_cert) + smdp_signed2_root = find_tag(smdp_signed2, 0x30) + if smdp_signed2_root is None: + raise RuntimeError("Invalid smdpSigned2") + transaction_id = find_tag(smdp_signed2_root, TAG_STATUS) + cc_required_flag = find_tag(smdp_signed2_root, 0x01) + if transaction_id is None or cc_required_flag is None: + raise RuntimeError("Invalid smdpSigned2") + content = smdp_signed2 + smdp_signature2 + if int.from_bytes(cc_required_flag, "big") != 0: + if not cc: + raise RuntimeError("Confirmation code required but not provided") + content += encode_tlv(0x04, hashlib.sha256(hashlib.sha256(cc.encode("utf-8")).digest() + transaction_id).digest()) + content += smdp_certificate + response = es10x_command(client, encode_tlv(TAG_PREPARE_DOWNLOAD, content)) + if not response.startswith(bytes([0xBF, 0x21])): + raise RuntimeError("Invalid PrepareDownloadResponse") + return b64e(response) + + +def _parse_tlv_header_len(data: bytes) -> int: + """Return the combined tag + length header size for a TLV element.""" + tag_len = 2 if data[0] & 0x1F == 0x1F else 1 + length_byte = data[tag_len] + return tag_len + (1 + (length_byte & 0x7F) if length_byte & 0x80 else 1) + + +def load_bpp(client: AtClient, b64_bpp: str) -> dict: + bpp = b64d(b64_bpp) + if not bpp.startswith(bytes([0xBF, 0x36])): + raise RuntimeError("Invalid BoundProfilePackage") + + bpp_root_value = None + for tag, value, start, end in iter_tlv(bpp, with_positions=True): + if tag == TAG_BPP: + bpp_root_value = value + bpp_value_start = start + _parse_tlv_header_len(bpp[start:end]) + break + if bpp_root_value is None: + raise RuntimeError("Invalid BoundProfilePackage") + + chunks = [] + for tag, value, start, end in iter_tlv(bpp_root_value, with_positions=True): + if tag == 0xBF23: + chunks.append(bpp[0 : bpp_value_start + end]) + elif tag == 0xA0: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + elif tag in (0xA1, 0xA3): + hdr_len = _parse_tlv_header_len(bpp_root_value[start:end]) + chunks.append(bpp[bpp_value_start + start : bpp_value_start + start + hdr_len]) + for _, _, child_start, child_end in iter_tlv(value, with_positions=True): + chunks.append(value[child_start:child_end]) + elif tag == 0xA2: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + + result = {"seqNumber": 0, "success": False, "bppCommandId": None, "errorReason": None} + for chunk in chunks: + response = es10x_command(client, chunk) + if not response: + continue + root = find_tag(response, TAG_PROFILE_INSTALL_RESULT) + if not root: + continue + result_data = find_tag(root, 0xBF27) + if not result_data: + break + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) + if notif_meta: + seq_num = find_tag(notif_meta, TAG_STATUS) + if seq_num: + result["seqNumber"] = int.from_bytes(seq_num, "big") + final_result = find_tag(result_data, 0xA2) + if final_result: + for tag, value in iter_tlv(final_result): + if tag == 0xA0: + result["success"] = True + elif tag == 0xA1: + bpp_cmd = find_tag(value, TAG_STATUS) + if bpp_cmd: + result["bppCommandId"] = int.from_bytes(bpp_cmd, "big") + err = find_tag(value, 0x81) + if err: + result["errorReason"] = int.from_bytes(err, "big") + break # ProfileInstallResult received — eUICC session is finalized + if not result["success"] and result["errorReason"] is not None: + cmd_name = BPP_COMMAND_NAMES.get(result["bppCommandId"], f"unknown({result['bppCommandId']})") + err_name = BPP_ERROR_REASONS.get(result["errorReason"], f"unknown({result['errorReason']})") + raise RuntimeError(f"Profile installation failed at {cmd_name}: {err_name} (bppCommandId={result['bppCommandId']}, errorReason={result['errorReason']})") + return result + + +def parse_metadata(b64_metadata: str) -> dict: + root = find_tag(b64d(b64_metadata), 0xBF25) + if root is None: + raise RuntimeError("Invalid profileMetadata") + defaults = {"iccid": None, "serviceProviderName": None, "profileName": None, "iconType": None, "icon": None, "profileClass": None} + return {**defaults, **_decode_profile_fields(root)} + + +def cancel_session(client: AtClient, transaction_id: bytes, reason: int = 127) -> str: + content = encode_tlv(0x80, transaction_id) + encode_tlv(0x81, bytes([reason])) + response = es10x_command(client, encode_tlv(TAG_CANCEL_SESSION, content)) + return b64e(response) + + +def parse_lpa_activation_code(activation_code: str) -> tuple[str, str, str]: + if not activation_code.startswith("LPA:"): + raise ValueError("Invalid activation code format") + + parts = activation_code[4:].split("$") + if len(parts) != 3: + raise ValueError("Invalid activation code format") + + version, smdp, matching_id = [p.strip() for p in parts] + if version != "1": + raise ValueError("Unsupported activation code version") + if len(smdp) == 0 or "." not in smdp: + raise ValueError("Invalid SM-DP+ address in activation code") + if len(matching_id) == 0: + raise ValueError("Missing matching ID in activation code") + return version, smdp, matching_id + + +def download_profile(client: AtClient, activation_code: str) -> str: + _, smdp, matching_id = parse_lpa_activation_code(activation_code) + + challenge, euicc_info = get_challenge_and_info(client) + + payload = {"smdpAddress": smdp, "euiccChallenge": b64e(challenge), "euiccInfo1": b64e(euicc_info)} + if matching_id: + payload["matchingId"] = matching_id + auth = es9p_request(smdp, "initiateAuthentication", payload, "Authentication") + tx_id = base64_trim(auth.get("transactionId", "")) + tx_id_bytes = base64.b64decode(tx_id) if tx_id else b"" + + try: + b64_auth_resp = authenticate_server( + client, base64_trim(auth.get("serverSigned1", "")), base64_trim(auth.get("serverSignature1", "")), + base64_trim(auth.get("euiccCiPKIdToBeUsed", "")), base64_trim(auth.get("serverCertificate", "")), + matching_id=matching_id) + + cli = es9p_request(smdp, "authenticateClient", {"transactionId": tx_id, "authenticateServerResponse": b64_auth_resp}, "Authentication") + metadata = parse_metadata(base64_trim(cli.get("profileMetadata", ""))) + iccid = str(metadata.get("iccid") or "") + print(f'Downloading profile: {iccid} - {metadata["serviceProviderName"]} - {metadata["profileName"]}') + + b64_prep = prepare_download( + client, base64_trim(cli.get("smdpSigned2", "")), base64_trim(cli.get("smdpSignature2", "")), base64_trim(cli.get("smdpCertificate", ""))) + + bpp = es9p_request(smdp, "getBoundProfilePackage", {"transactionId": tx_id, "prepareDownloadResponse": b64_prep}, "GetBoundProfilePackage") + + result = load_bpp(client, base64_trim(bpp.get("boundProfilePackage", ""))) + if result["success"]: + print(f"Profile installed successfully (seqNumber: {result['seqNumber']})") + return iccid + else: + raise RuntimeError(f"Profile installation failed: {result}") + except Exception: + if tx_id_bytes: + b64_cancel_resp = "" + try: + b64_cancel_resp = cancel_session(client, tx_id_bytes) + except Exception: + pass + try: + es9p_request(smdp, "cancelSession", { + "transactionId": tx_id, + "cancelSessionResponse": b64_cancel_resp, + }, "CancelSession") + except Exception: + pass + raise + + +class TiciLPA(LPABase): + handles_modem_restart = True + _instance = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self, interface: Literal["qmi", "at"] = "at", device: str = DEFAULT_DEVICE, baud: int = DEFAULT_BAUD, + timeout: float = DEFAULT_TIMEOUT, verbose: bool = False): + if getattr(self, "_initialized", False): + self.verbose = verbose or self.verbose + return + # This backend is AT-only. Keep interface arg for compatibility with existing CLI/call sites. + self.interface = interface + self.device = device + self.baud = baud + self.timeout = timeout + self.verbose = verbose + self._last_good_device = device + self._euicc_present_cache: bool | None = None + from iqpilot.system.hardware.tici.hardware import get_device_type + self._is_eg25 = get_device_type() in ("tizi",) + self._client: AtClient | None = None + self._initialized = True + # _client is opened lazily via _ensure_client() on first actual eSIM operation. + # Do NOT call _open_ready_client() here: on pSIM devices (no eUICC) it retries + # for 10–30 s against the AT port, blocking hw_state_thread and starving the + # network-type polling loop that drives the WiFi/LTE sidebar indicator. + atexit.register(self.close) + + def close(self) -> None: + if self._client is not None: + try: + self._client.close() + finally: + self._client = None + + @staticmethod + def _set_modemmanager_running(running: bool) -> None: + action = "start" if running else "stop" + subprocess.check_call(["sudo", "systemctl", action, "ModemManager"]) + + @staticmethod + def _is_modemmanager_running() -> bool: + res = subprocess.run(["systemctl", "is-active", "ModemManager"], + capture_output=True, text=True, check=False) + return res.stdout.strip() == "active" + + def _probe_euicc_present(self) -> bool | None: + if self._euicc_present_cache is not None: + return self._euicc_present_cache + + if self._is_modemmanager_running(): + return None + + restarted_modemmanager = False + try: + res = subprocess.run( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-get-slot-status"], + capture_output=True, text=True, check=False, timeout=12, + ) + output = f"{res.stdout}\n{res.stderr}" + if "Is eUICC: yes" in output: + self._euicc_present_cache = True + elif "Is eUICC: no" in output: + self._euicc_present_cache = False + else: + self._euicc_present_cache = None + except Exception: + self._euicc_present_cache = None + finally: + if restarted_modemmanager: + self._set_modemmanager_running(True) + time.sleep(2.0) + + return self._euicc_present_cache + + @staticmethod + def _ttyusb2_mm_ignored() -> bool: + # AGNOS PR 521 marks ttyUSB2 with ID_MM_PORT_IGNORE=1 for EG25. + # If missing, ModemManager may contend with direct AT eSIM operations. + if not os.path.exists("/dev/ttyUSB2"): + return False + try: + res = subprocess.run( + ["udevadm", "info", "-q", "property", "-n", "/dev/ttyUSB2"], + capture_output=True, text=True, check=False, + ) + if res.returncode != 0: + return False + return "ID_MM_PORT_IGNORE=1" in res.stdout + except Exception: + return False + + def _ensure_client(self) -> AtClient: + if self._client is None: + self._client = self._open_ready_client() + return self._client + + @contextmanager + def _open_client(self): + yield self._ensure_client() + + def _open_ready_client(self) -> AtClient: + euicc_present = self._probe_euicc_present() + if euicc_present is False: + raise LPAError("Modem reports no eUICC support on this unit (QMI: Is eUICC: no)") + + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(1, 6): + for device in self._candidate_devices(): + client: AtClient | None = None + try: + if self.verbose: + print(f"!! trying modem AT device: {device} (attempt {attempt})", file=sys.stderr) + client = AtClient(device, self.baud, self.timeout, self.verbose) + client.ensure_capabilities() + client.open_isdr() + self._last_good_device = device + if self.verbose: + print(f"!! selected modem AT device: {device}", file=sys.stderr) + return client + except Exception as e: + if self.verbose: + print(f"!! modem AT device failed: {device}: {e}", file=sys.stderr) + last_error = e + if client is not None: + try: + client.close() + except Exception: + pass + if not recovery_attempted and last_error is not None and self._should_recover_isdr(last_error): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + # Give modem a moment to finish startup / channel release. + time.sleep(min(0.4 * attempt, 1.5)) + assert last_error is not None + raise last_error + + def _candidate_devices(self) -> list[str]: + if self.device and not os.path.exists(self.device): + return [self.device] + + candidates = [ + self._last_good_device, + self.device, + "/dev/modem_at0", + "/dev/ttyUSB3", + "/dev/ttyUSB2", + "/dev/ttyUSB1", + "/dev/ttyUSB0", + ] + ordered: list[str] = [] + for dev in candidates: + should_include = dev in (self.device, "/dev/modem_at0") or os.path.exists(dev) + if dev and dev not in ordered and should_include: + ordered.append(dev) + return ordered if ordered else [self.device] + + @staticmethod + def _to_profile(data: dict) -> Profile: + return Profile( + iccid=str(data.get("iccid") or ""), + nickname=str(data.get("profileNickname") or ""), + enabled=str(data.get("profileState") or "") == "enabled", + provider=str(data.get("serviceProviderName") or ""), + ) + + def _clear_cat_busy(self) -> None: + time.sleep(3) + try: + self._ensure_client().query('AT+QSTKRSP=254') + except Exception: + pass + time.sleep(1) + try: + self._ensure_client().query('AT+CFUN=4') + except Exception: + pass + time.sleep(2) + try: + self._ensure_client().query('AT+CFUN=1') + except Exception: + pass + self._ensure_client().channel = None + time.sleep(5) + + def _wait_for_modem(self, timeout: float = 45.0) -> None: + start = time.monotonic() + last_error: Exception | None = None + while time.monotonic() - start < timeout: + try: + self.close() + self._client = self._open_ready_client() + return + except Exception as e: + last_error = e + time.sleep(2) + if last_error is not None: + raise RuntimeError("Modem did not recover after reboot") from last_error + raise RuntimeError("Modem did not recover after reboot") + + def _restart_modem(self) -> None: + client = self._ensure_client() + for cmd in ('AT+CFUN=0', 'AT+CFUN=1,1'): + try: + client.query(cmd) + except Exception: + pass + client.channel = None + client._use_csim = False + self._wait_for_modem() + + @staticmethod + def _should_recover_isdr(error: Exception) -> bool: + message = str(error).lower() + markers = ( + "failed to open isd-r", + "failed to access euicc isd-r", + "simfilenotfound", + "at+ccho", + "at+cgla", + ) + return any(marker in message for marker in markers) + + def _recover_isdr_access(self) -> bool: + was_modemmanager_running = self._is_modemmanager_running() + self.close() + try: + if was_modemmanager_running: + self._set_modemmanager_running(False) + time.sleep(2.0) + + for cmd in ( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-reset"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-off=1"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-on=1"], + ): + subprocess.check_call(cmd) + time.sleep(2.0) + + self._euicc_present_cache = None + return True + except Exception as e: + if self.verbose: + print(f"!! ISD-R recovery failed: {e}", file=sys.stderr) + return False + finally: + if was_modemmanager_running: + self._set_modemmanager_running(True) + time.sleep(2.0) + + def _with_lpa_error(self, fn): + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(3): + try: + return fn() + except LPAError: + raise + except RuntimeError as e: + last_error = e + if "does not provide usable esim functionality" in str(e).lower(): + raise LPAError(str(e)) from e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(str(e)) from e + except (OSError, serial.SerialException) as e: + last_error = e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(f"AT transport error: {e}") from e + except TimeoutError as e: + raise LPAError(f"AT modem timeout: {e}") from e + except ValueError as e: + raise LPAError(str(e)) from e + assert last_error is not None + raise LPAError(str(last_error)) + + @staticmethod + def _is_transient_transport_error(message: str) -> bool: + lower = message.lower() + transient_markers = ( + "broken pipe", + "resource busy", + "input/output error", + "device disconnected", + "device reports readiness to read but returned no data", + "transport error", + "missing +cgla response", + "missing +csim response", + "malformed +cgla response payload", + "malformed +csim response payload", + "non-hexadecimal number found in fromhex", + ) + return any(m in lower for m in transient_markers) + + def list_profiles(self) -> list[Profile]: + def _run() -> list[Profile]: + return [self._to_profile(p) for p in list_profiles(self._ensure_client())] + return self._with_lpa_error(_run) + + def get_active_profile(self) -> Profile | None: + return next((p for p in self.list_profiles() if p.enabled), None) + + def _validate_profile_exists(self, iccid: str) -> None: + if not any(p.iccid == iccid for p in self.list_profiles()): + raise LPAProfileNotFoundError(f"profile {iccid} does not exist") + + def _is_bootstrapped(self) -> bool: + return not any(self.is_comma_profile(p.iccid) for p in self.list_profiles()) + + def _ensure_switchable_profile(self, iccid: str) -> None: + if self.is_comma_profile(iccid): + return + + if not self._is_bootstrapped(): + raise LPAError( + "Delete the existing Comma pSIM profile before activating a user eSIM profile" + ) + + def _process_notifications_after_delete(self, client: AtClient, iccid: str) -> None: + try: + process_notifications(client) + return + except Exception as error: + notification_error = error + + self._restart_modem() + + try: + deleted = not any(p.iccid == iccid for p in self.list_profiles()) + except Exception: + raise RuntimeError( + "Profile delete may have succeeded, but modem notification cleanup failed; " + "refresh profiles and retry if needed" + ) from notification_error + + if deleted: + return + + raise RuntimeError( + "Profile delete did not finish cleanly; refresh profiles and retry" + ) from notification_error + + def _process_notifications_after_state_change( + self, + validator, + recovery_message: str, + failure_message: str, + ) -> None: + try: + process_notifications(self._ensure_client()) + return + except Exception as notification_error: + pass + + self._wait_for_modem() + + try: + if validator(): + return + except Exception: + raise RuntimeError(recovery_message) from notification_error + + raise RuntimeError(failure_message) from notification_error + + def delete_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + raise LPAError("cannot delete active profile, switch to another profile first") + + def _run() -> None: + client = self._ensure_client() + try: + delete_profile(client, iccid) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + delete_profile(client, iccid) + else: + raise + self._process_notifications_after_delete(client, iccid) + + self._with_lpa_error(_run) + + def bootstrap(self) -> None: + comma_profiles = [p for p in self.list_profiles() if self.is_comma_profile(p.iccid)] + if not comma_profiles: + return + + def _run() -> None: + client = self._ensure_client() + for profile in comma_profiles: + if profile.enabled: + disable_profile(client, profile.iccid, refresh=True) + process_notifications(client) + delete_profile(client, profile.iccid) + process_notifications(client) + self._restart_modem() + + self._with_lpa_error(_run) + + def download_profile(self, qr: str, nickname: str | None = None) -> None: + # Strict upfront validation to provide immediate user feedback. + parse_lpa_activation_code(qr) + before = {p.iccid for p in self.list_profiles()} + + def _run() -> None: + client = self._ensure_client() + iccid = download_profile(client, qr) + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid for profile in self.list_profiles()), + "Profile add may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile add did not finish cleanly; refresh profiles and retry", + ) + + self._with_lpa_error(_run) + + if nickname: + after = self.list_profiles() + new_profile = next((p for p in after if p.iccid not in before), None) + if new_profile is not None and new_profile.iccid: + self.nickname_profile(new_profile.iccid, nickname) + + def nickname_profile(self, iccid: str, nickname: str) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + set_profile_nickname(self._ensure_client(), iccid, nickname) + self._with_lpa_error(_run) + + def switch_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + self._ensure_switchable_profile(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + return + + def _run() -> None: + client = self._ensure_client() + use_refresh = self._is_eg25 + try: + enable_profile(client, iccid, refresh=use_refresh) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + enable_profile(client, iccid, refresh=use_refresh) + else: + raise + client.channel = None + client._use_csim = False + if use_refresh: + self._wait_for_modem() + else: + self._restart_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile switch may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile switch did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + # Compatibility methods retained for old tests/scripts. + def process_notifications(self) -> None: + def _run() -> None: + process_notifications(self._ensure_client()) + self._with_lpa_error(_run) + + def enable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + enable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile enable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile enable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + def disable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + disable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and not profile.enabled for profile in self.list_profiles()), + "Profile disable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile disable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + +# --- CLI --- + +def main() -> None: + parser = argparse.ArgumentParser(description="Minimal AT-only LPA implementation") + parser.add_argument("--device", default=DEFAULT_DEVICE) + parser.add_argument("--baud", type=int, default=DEFAULT_BAUD) + parser.add_argument("--timeout", type=float, default=DEFAULT_TIMEOUT) + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--enable", type=str) + parser.add_argument("--disable", type=str) + parser.add_argument("--delete", type=str, metavar="ICCID", help="Delete a disabled profile") + parser.add_argument("--no-refresh", action="store_true", help="Skip REFRESH after enable/disable") + parser.add_argument("--set-nickname", nargs=2, metavar=("ICCID", "NICKNAME")) + parser.add_argument("--list-notifications", action="store_true") + parser.add_argument("--process-notifications", action="store_true") + parser.add_argument("--download", type=str, metavar="CODE") + args = parser.parse_args() + + lpa = TiciLPA(device=args.device, baud=args.baud, timeout=args.timeout, verbose=args.verbose) + + if args.enable: + lpa.enable_profile(args.enable, refresh=not args.no_refresh) + elif args.disable: + lpa.disable_profile(args.disable, refresh=not args.no_refresh) + elif args.delete: + lpa.delete_profile(args.delete) + elif args.set_nickname: + lpa.nickname_profile(args.set_nickname[0], args.set_nickname[1]) + elif args.list_notifications: + with lpa._open_client() as client: + print(json.dumps(list_notifications(client), indent=2)) + return + elif args.process_notifications: + lpa.process_notifications() + return + elif args.download: + lpa.download_profile(args.download) + + profiles_out = [{ + "iccid": p.iccid, + "profileNickname": p.nickname, + "profileState": "enabled" if p.enabled else "disabled", + "serviceProviderName": p.provider, + } for p in lpa.list_profiles()] + print(json.dumps(profiles_out, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py new file mode 100644 index 000000000..d53183f7a --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py @@ -0,0 +1,30 @@ +# GPIO pin definitions +class GPIO: + # both GPIO_STM_RST_N and GPIO_LTE_RST_N are misnamed, they are high to reset + HUB_RST_N = 30 + UBLOX_RST_N = 32 + UBLOX_SAFEBOOT_N = 33 + GNSS_PWR_EN = 34 # SCHEMATIC LABEL: GPIO_UBLOX_PWR_EN + + STM_RST_N = 124 + STM_BOOT0 = 134 + STM_PWR_EN_N = 41 # because STM32H7 RST doesn't generate a full power-on-reset + + SIREN = 42 + SOM_ST_IO = 49 + + LTE_RST_N = 50 + LTE_PWRKEY = 116 + LTE_BOOT = 52 + + # GPIO_CAM0_DVDD_EN = /sys/kernel/debug/regulator/camera_rear_ldo + CAM0_AVDD_EN = 8 + CAM0_RSTN = 9 + CAM1_RSTN = 7 + CAM2_RSTN = 12 + + # Sensor interrupts + BMX055_ACCEL_INT = 21 + BMX055_GYRO_INT = 23 + BMX055_MAGN_INT = 87 + LSM_INT = 84 diff --git a/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/version.py b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/version.py new file mode 100644 index 000000000..cb731d009 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/_iqclosure/iqpilot/system/version.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 +from dataclasses import dataclass +from functools import cache +import json +import os +import pathlib +import subprocess + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_commit_date + +RELEASE_IQ_BRANCHES = ['release', 'release-tici', 'release-new'] +TESTED_BRANCHES = RELEASE_IQ_BRANCHES +IQ_BRANCH_MIGRATIONS: dict[tuple[str, str], str] = {} + +BUILD_METADATA_FILENAME = "build.json" + +training_version: str = "0.2.0" +terms_version: str = "2" + + +UNKNOWN_VERSION = "0.0.0" + + +@cache +def get_version(path: str = BASEDIR) -> str: + try: + with open(os.path.join(path, "iqpilot", "common", "version.h")) as _versionf: + return _versionf.read().split('"')[1] + except (OSError, IndexError): + return UNKNOWN_VERSION + + +def get_release_notes(path: str = BASEDIR) -> str: + for rel in (("iqpilot", "docs", "CHANGELOG.md"), ("docs", "CHANGELOG.md")): + try: + with open(os.path.join(path, *rel)) as f: + return f.read().split('\n\n', 1)[0] + except OSError: + continue + return "" + + +@cache +def is_prebuilt(path: str = BASEDIR) -> bool: + return os.path.exists(os.path.join(path, 'prebuilt')) + + +@cache +def is_dirty(cwd: str = BASEDIR) -> bool: + if not get_origin() or not get_short_branch(): + return True + + dirty = False + try: + # Actually check dirty files + if not is_prebuilt(cwd): + # This is needed otherwise touched files might show up as modified + try: + subprocess.check_call(["git", "update-index", "--refresh"], cwd=cwd) + except subprocess.CalledProcessError: + pass + + branch = get_branch() + if not branch: + return True + dirty = (subprocess.call(["git", "diff-index", "--quiet", branch, "--"], cwd=cwd)) != 0 + except subprocess.CalledProcessError: + cloudlog.exception("git subprocess failed while checking dirty") + dirty = True + + return dirty + + +@dataclass +class OpenpilotMetadata: + version: str + release_notes: str + git_commit: str + git_origin: str + git_commit_date: str + build_style: str + is_dirty: bool # whether there are local changes + + @property + def short_version(self) -> str: + return self.version.split('-')[0] + + @property + def comma_remote(self) -> bool: + # note to fork maintainers, this is used for release metrics. please do not + # touch this to get rid of the orange startup alert. there's better ways to do that + return self.git_normalized_origin == "github.com/commaai/openpilot" + + @property + def iqpilot_remote(self) -> bool: + return self.git_normalized_origin in ("github.com/iqpilot/iqpilot", + "github.com/iqpilot/openpilot") + + @property + def git_normalized_origin(self) -> str: + return self.git_origin \ + .replace("git@", "", 1) \ + .replace(".git", "", 1) \ + .replace("https://", "", 1) \ + .replace(":", "/", 1) + + +@dataclass +class BuildMetadata: + channel: str + openpilot: OpenpilotMetadata + + @property + def tested_channel(self) -> bool: + return self.channel in TESTED_BRANCHES + + @property + def release_channel(self) -> bool: + return self.channel in RELEASE_IQ_BRANCHES + + @property + def canonical(self) -> str: + return f"{self.openpilot.version}-{self.openpilot.git_commit}-{self.openpilot.build_style}" + + @property + def ui_description(self) -> str: + return f"{self.openpilot.version} / {self.openpilot.git_commit[:6]} / {self.channel}" + + @property + def master_channel(self) -> bool: + return self.channel in RELEASE_IQ_BRANCHES + + @property + def development_channel(self) -> bool: + return self.channel == "dev" or self.channel.startswith("dev-") or self.channel.endswith("-prebuilt") + + @property + def channel_type(self) -> str: + if "-tici" in self.channel or self.channel in ("release-new" or "master-mici"): + return "tici" + elif self.development_channel: + return "development" + elif self.tested_channel: + return "staging" + elif self.master_channel: + return "master" + elif self.release_channel: + return "release" + else: + return "feature" + + +def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: + channel = build_metadata.get("channel", "unknown") + openpilot_metadata = build_metadata.get("openpilot", {}) + version = openpilot_metadata.get("version", "unknown") + release_notes = openpilot_metadata.get("release_notes", "unknown") + git_commit = openpilot_metadata.get("git_commit", "unknown") + git_origin = openpilot_metadata.get("git_origin", "unknown") + git_commit_date = openpilot_metadata.get("git_commit_date", "unknown") + build_style = openpilot_metadata.get("build_style", "unknown") + return BuildMetadata(channel, + OpenpilotMetadata( + version=version, + release_notes=release_notes, + git_commit=git_commit, + git_origin=git_origin, + git_commit_date=git_commit_date, + build_style=build_style, + is_dirty=False)) + + +def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: + build_metadata_path = pathlib.Path(path) / BUILD_METADATA_FILENAME + + if build_metadata_path.exists(): + build_metadata = json.loads(build_metadata_path.read_text()) + return build_metadata_from_dict(build_metadata) + + git_folder = pathlib.Path(path) / ".git" + + if git_folder.exists(): + return BuildMetadata(get_short_branch(path), + OpenpilotMetadata( + version=get_version(path), + release_notes=get_release_notes(path), + git_commit=get_commit(path), + git_origin=get_origin(path), + git_commit_date=get_commit_date(path), + build_style="unknown", + is_dirty=is_dirty(path))) + + cloudlog.exception("unable to get build metadata") + raise Exception("invalid build metadata") + + +if __name__ == "__main__": + print(get_build_metadata()) diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..147259b81 Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.py b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/big_catalog.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/big_catalog.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..a8cd85cc0 Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/big_catalog.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/egpu_model.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/egpu_model.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..033ae101f Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/egpu_model.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/emac_model_meta.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/emac_model_meta.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..24bc620b5 Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/emac_model_meta.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..450526348 Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..695c881f5 Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..fa3e70ce6 Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..057766128 Binary files /dev/null and b/artifacts/iqpilot_model_selector_private/python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/manifest.json b/artifacts/iqpilot_navd_private/manifest.json new file mode 100644 index 000000000..147c4a99c --- /dev/null +++ b/artifacts/iqpilot_navd_private/manifest.json @@ -0,0 +1,380 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "f66c056f33c5e8bd3c5add8e8ec397f3015278e2bb254c0c8e7a7645eb642d9e", + "size": 955 + }, + "python/_iqclosure/iqpilot/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/common/basedir.py": { + "mode": 420, + "sha256": "58cfa5d6405903ee1acecc4544463bb8f47a66921b120c382143aa80d8539b28", + "size": 106 + }, + "python/_iqclosure/iqpilot/common/constants.py": { + "mode": 420, + "sha256": "fc439d59c24b95ed349b84f1a5862df3ea50e0891dbec4ea3cf5e1e0ccff6513", + "size": 434 + }, + "python/_iqclosure/iqpilot/common/gpio.py": { + "mode": 420, + "sha256": "01ba8cb32a644a2df545e764ba19bf1c7a320a217f983f8bac73b45d3a6891cf", + "size": 2408 + }, + "python/_iqclosure/iqpilot/common/gps.py": { + "mode": 420, + "sha256": "28c6cfd1ade66a00bf4d79108f5121fb19ce38e96c94018a6ef3b740bef24a26", + "size": 202 + }, + "python/_iqclosure/iqpilot/common/i2c.py": { + "mode": 420, + "sha256": "4af8f9da7504a548d15f18b91d71c1379cb7c05c84be031448764cc49920ce68", + "size": 2449 + }, + "python/_iqclosure/iqpilot/common/issue_debug.py": { + "mode": 420, + "sha256": "73a10d846c735d4bcfda65f7828aa82192349b53920cb9d1b01cef8c211982fe", + "size": 1128 + }, + "python/_iqclosure/iqpilot/common/logging_extra.py": { + "mode": 420, + "sha256": "ce9b3b3d8498d76e1c4c0352a3e98e72759bb7f367ff8629c1329c46040595c3", + "size": 6628 + }, + "python/_iqclosure/iqpilot/common/realtime.py": { + "mode": 420, + "sha256": "f137ef62c1602a1f7c329731883dc518c62288bd25596891858d460ae3209ae2", + "size": 3966 + }, + "python/_iqclosure/iqpilot/common/slc_utilities.py": { + "mode": 420, + "sha256": "45396a7bf041a87b696e67d8394d7d635026485b17a3dac96addd94516aa4770", + "size": 3691 + }, + "python/_iqclosure/iqpilot/common/slc_variables.py": { + "mode": 420, + "sha256": "de64a714cac4e3971cb33a19abd38aeee8d1a05ac416fcc8308b1fd62cb09286", + "size": 1149 + }, + "python/_iqclosure/iqpilot/common/speed_assist_tiers.py": { + "mode": 420, + "sha256": "12d6c47f6bd2508596ca30b114df12612b5de95bfeebe0f31b89bbe3aacf2e7f", + "size": 780 + }, + "python/_iqclosure/iqpilot/common/swaglog.py": { + "mode": 420, + "sha256": "0a133b4ef49f80b8890f115e81273f3f3e21351ae79f92dc02abc033e6d24027", + "size": 5274 + }, + "python/_iqclosure/iqpilot/common/time_helpers.py": { + "mode": 420, + "sha256": "c14cda1f84149d5ffa63a2adec5ca24126f77c1412a78412e5e3e68a6fd12bcf", + "size": 474 + }, + "python/_iqclosure/iqpilot/common/utils.py": { + "mode": 420, + "sha256": "6475ad94bc89252398c41e9eabf7929ba5eb8fa23a08ad7545e7a67b400af9f3", + "size": 8090 + }, + "python/_iqclosure/iqpilot/iq_maps/__init__.py": { + "mode": 420, + "sha256": "8758731db1d9276ab5368be377989f8ad66d5866e881e1d654d822618646fa2a", + "size": 196 + }, + "python/_iqclosure/iqpilot/selfdrive/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/car/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/car/cruise.py": { + "mode": 420, + "sha256": "cb74245bc10dff8db84eeba299ab56915bb399f391f67c552bf53aa52e55841c", + "size": 16399 + }, + "python/_iqclosure/iqpilot/selfdrive/car/long_increments.py": { + "mode": 420, + "sha256": "80fd7b70f80be28ec7b07c1873798146ac63efca285166f6cc485f696a79dcbe", + "size": 2104 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py": { + "mode": 420, + "sha256": "056c744bbd9f1fe1053555d9b1fc1257d53093d69ddc94be3f05d840eb70781c", + "size": 3590 + }, + "python/_iqclosure/iqpilot/system/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/__init__.py": { + "mode": 420, + "sha256": "889391bffca493e74bfc108cae2976a53b644caca13ab600061fd29e9622c627", + "size": 695 + }, + "python/_iqclosure/iqpilot/system/hardware/base.py": { + "mode": 420, + "sha256": "a56293f7c23e503ff62d0d3ed39f1831b5544a65b37378165934361a5ddcd304", + "size": 4966 + }, + "python/_iqclosure/iqpilot/system/hardware/hw.py": { + "mode": 420, + "sha256": "c69185d8f6482c8b021f687b793246d2e2ede853e89a88748c64b85f60711b59", + "size": 3638 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/pc/hardware.py": { + "mode": 420, + "sha256": "2520895597c375ae570bd04d5f189e874c89d642f3f07bdbeb20388cb6691433", + "size": 258 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py": { + "mode": 420, + "sha256": "98f46f8705259b00efae7274186b4e68201aad467a19de4f16d5f850d10ab0b5", + "size": 7585 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/hardware.py": { + "mode": 420, + "sha256": "f1ddffa9bdb5071a49fd65eb4b49958b60b1873e1ec70e6f3f2e2b2501abce2f", + "size": 25584 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py": { + "mode": 420, + "sha256": "d22858982705531732d5a20a45a73795496e5bbd9e23028c24609a7e58ac7aed", + "size": 890 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/lpa.py": { + "mode": 420, + "sha256": "2bffb84aef35892c4788e80b6d937bf2eebd15e226b72a82c4f39217667c1ca0", + "size": 53692 + }, + "python/_iqclosure/iqpilot/system/hardware/tici/pins.py": { + "mode": 420, + "sha256": "b57ba4262e6a6a79f2db15c27356acf3e54f579a7edd13b483b2e16d140aca6d", + "size": 678 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "6e6de2f3270ad097c9b847fa10e833bac6b8eaab8ddad955603d163474a3c846", + "size": 67616 + }, + "python/iqpilot_private/navd/__init__.py": { + "mode": 420, + "sha256": "3faeaa3363b2f50fa135ad4c1f2466853d684d562120425f77a58039837fd8fb", + "size": 69 + }, + "python/iqpilot_private/navd/alpr_matcher.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "516370d0603f5134955826a3d8e9fea8ec0a9d27c116ad05af149a5c7ac15bcc", + "size": 269936 + }, + "python/iqpilot_private/navd/amap_client.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "dc8f27970c61a3b60c383ea69804896ee356d76c8bf7af5532a9338525fbc956", + "size": 202040 + }, + "python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "96eb02a86cab08d557f8df0adebd2cc72232b9348e9896acd9b71784a86b42d5", + "size": 136960 + }, + "python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "8fb8cc47f47971c530a68ccd81b9b5d9fc8ce82cdd1270967fa845399009e519", + "size": 135960 + }, + "python/iqpilot_private/navd/incident_feed.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "b49f7ce7e9a33777ffa896a95fc4a5580988b4966d5a9330efd8c79a5116be91", + "size": 135584 + }, + "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "747ae769bb35650dcd16b94a0a6260213373e352ede88bc1e57f114f27761d5a", + "size": 135632 + }, + "python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "eae425cd9bf60286fff4b980c6057351cb940f28981556269f05022258d80f0c", + "size": 69752 + }, + "python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "0fc4356fe57a11538e4a248dc803ceee61781d7c700640f78241a2d57cbb4574", + "size": 68144 + }, + "python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "92521da14a5bf334324f32315b13773d37d5f7d209d4bad6d62afc12ab5d1705", + "size": 203056 + }, + "python/iqpilot_private/navd/nav_turn_signals.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "67454e461abb76c7a3053a7f728baa0beb30fba235639a0a2a927a9c80443a4a", + "size": 135560 + }, + "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "9e0d5e929bfcd960fdba11804d1f70848ba40a68a65093c025a6d48171d0b2cc", + "size": 797392 + }, + "python/iqpilot_private/navd/navincidentd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "33d40decd32e8cfe3f9a267ebfccf48e8bfc67bf9609206ef230a9566bf5581d", + "size": 135344 + }, + "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "edf0d16511686ed3d4d7d6bf2b6b44fd8d484af348dab0eb415999656eb1d0af", + "size": 135584 + }, + "python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "b11bec6f1b49f169f218a87467781b6d62d64c367e0c3df5356341adce8c3f6b", + "size": 202384 + }, + "python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "d38218a6787234730ed39bdb04c00ab0778b1b56eefcedcb9ecfb31346d36378", + "size": 136216 + }, + "python/iqpilot_private/navd/road_incidents.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "f89f69e128b02eebc31b4c3702d62e12747f837863ad390026ea5004e506ea7c", + "size": 203136 + }, + "python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "311926ffa2b4474320411240e6656ee676ce8b61d1cea444c34cd9520113a6a6", + "size": 943640 + }, + "python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "dc08b2e6bf7be3fe0b4a7ccdfceab6c434317e7626efd9b40ea5bf15739647ba", + "size": 135760 + }, + "python/iqpilot_private/navd/traffic.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "f47146eddd7c8b499359d411150533c0e28e80851096d076ee8552a4d45175d9", + "size": 69720 + }, + "python/iqpilot_private/navd/traffic_sources.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "98845f8be1fd44009acf88fe685f6985ffb996d5d508858bdbb3edd2984a5146", + "size": 135968 + }, + "python/iqpilot_private/navd/traffic_writer.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "15aba494968b9673987d2d0168d797bfbd307046555cb89efa2378acc8bb042a", + "size": 136936 + }, + "python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "715f94a985599a983750affa5bf36e1fc2e6502871f1af7de553f9aaf29028cb", + "size": 69768 + }, + "python/iqpilot_private/navd/valhalla_process.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "2658d1a9f08f49e1294a3c26be733170ac7943970a79ee2969d9404cd4b55758", + "size": 204072 + }, + "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "d03bf4d8d7d1547c5fcd085dea2ff78f8071e04e51e7f4d002f7ba23b431038e", + "size": 201400 + }, + "runtime": { + "entries": { + "iqpilot_private.navd.amap_client": { + "path": "python/iqpilot_private/navd/amap_client.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.navd.iqmapd": { + "path": "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.navd.nav_turn_signals": { + "path": "python/iqpilot_private/navd/nav_turn_signals.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.navd.navd": { + "path": "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.navd.navincidentd": { + "path": "python/iqpilot_private/navd/navincidentd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.navd.navrenderd": { + "path": "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.navd.runtime_common": { + "path": "python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.navd.web_server": { + "path": "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so": "9i3/SfFfCLGyTzyQQYpsSxbA3ASc1OSK7fCYXpIiIMnX+jKB288Qy7TzJnr3uINt+LhRW1wwnMI6hWBXjgv5AA==", + "python/iqpilot_private/navd/alpr_matcher.cpython-312-aarch64-linux-gnu.so": "5K4w4dDRtts8QvxBAXL0qrYofb/bg9PV/rKn/GrVmtAVDMd0DhAiKAugoxkhl8n4JviFY8ZmsHwWBrQPIMdkAA==", + "python/iqpilot_private/navd/amap_client.cpython-312-aarch64-linux-gnu.so": "X+hzm32FyMwE9fSIaGZH/GQqHn78izqrX8o1FdATb0Fg4+62tcgI9LHe9PIM8VY6+IaryaWyKqFtATaq6BZrDw==", + "python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so": "dQnA8CCeRMXqiARr/Kzf2x736DuaT1/ALC8ZLDZep2/nY2IJ7StZeZ8DwOBuRPRK8KJ5HNU424QMZkVzQcDnBg==", + "python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so": "tdLykhS2t9M7R115Rse80M2Urg/8sNQTLaOz3YFyUTTkEzpaBlk3JnbgOQVpzDjrPB7y22y6mNORCkYI3cKfCw==", + "python/iqpilot_private/navd/incident_feed.cpython-312-aarch64-linux-gnu.so": "MJ/i1ZvGb3bYBVxKvT/zBk43CM/XT37GZa6la52Tfmqp9mrx6oz98PpvLZMgJ+18J4lSdMf2uGuJ2IHx5wWTAQ==", + "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so": "+ULQz9iDSDBtYRYSVVWz63TImB3DizGV2oFER6pmNttfJ6vA4SBVToxKV1YjHAebdMiSrTBrEkgPd5K4unE0Bg==", + "python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so": "PB+q882Oo/cOi+fN0IahlaBP7xEQrjF7BykAnCsxrnK8zJGkFZdrVUcLCS4T5DYjXhwlXbdveb3ZHdG/LoMcBQ==", + "python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so": "vqQRU0t5AS/oUs1JWxZlwHC5mrpaaHD10jgQCLzDGUL4Yv1aFHWAoM6KfFdUldmdSG1d4e6VGu+Y2bMdBIwAAw==", + "python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so": "OfuUD6/swlx5ggtvLfUVjGqpJbZWf+Ezwia5fE81FXA6RcuR4SMx1t/D38+TaMKDGvaBV31s08TJgh+/hXiiDA==", + "python/iqpilot_private/navd/nav_turn_signals.cpython-312-aarch64-linux-gnu.so": "WQOzntcyeraddagnvnxAwH/ciLFMztjfEhg07HFHy+++XJPCSGctdaxlgPWX6xq9kiE7aEkcTsW2CwOwYo3tDw==", + "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so": "5c68ZgFSkAXf9m32zKbBDSNHF0rVTwZPVu0puTiIcM7laHyHVtkQJduq6g4SUm+wz634nLK2u5pggaNf+mkhAw==", + "python/iqpilot_private/navd/navincidentd.cpython-312-aarch64-linux-gnu.so": "LBV8K1SPj+bN8idsPR/3B24grXQYRNarYsCUbVaRdkfORuib70gRlGz4KtyOyYT/vpCU4iuDhnSRsd4ltH4RAg==", + "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so": "ZT4bVD2W2w9w2AdbKkZ7AgfQv+zqTmJH5126ngiDDRFFuW2Bnp+E/4M+6U912uGZsV5xayCw8QmJbM9EeSqgDQ==", + "python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so": "jjmBJtLWRVkPsO4n7/N/pDVD9jrC4SCMm0lIT/P8HCzsMhIIAkXhRAMGKdl1kYDxK8VMGRMMF7eoiCKEFPq2AA==", + "python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so": "A0FeGUh384rTKZJLOL6wNdX3bLTTsmUX7kF3ysax7WjnyUSlctbms15E+3Ww87qmXwjMGbyPdlTdsnhvpcstAA==", + "python/iqpilot_private/navd/road_incidents.cpython-312-aarch64-linux-gnu.so": "J/I+XcODFE7LKvtyImt/Dw8fh2uvQeEhZ1IWx2IHZPH8sXhuVGVQIECVFGQJGfsckjzoUpgZq8AYNReRF62sBw==", + "python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so": "n/RFD32mlinaYGrWvKWGv8ziTTSFP8+qCS/I1ibFXRYU6gtwx/+03eUR+p2jh5hzPteo5RxLUfHDwxFvJMJzDA==", + "python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so": "/5mYKn9um2aBLipkFsEptfM3sOId3SKkV8AHXGslWdH9Evp2ll8XENvirAX5tV1X35WslGYIybK3Xv3cZ4o8DQ==", + "python/iqpilot_private/navd/traffic.cpython-312-aarch64-linux-gnu.so": "kfl1Mm7G3CguQGtUvDutvbd4StDnKr0pW7ojLn6gydVTyxEiD/VAEFfTKBK/CAyUcw3eeX5+U8Qq2+6o0zEUBA==", + "python/iqpilot_private/navd/traffic_sources.cpython-312-aarch64-linux-gnu.so": "SzicVJ2/F8aMjcOHVCmEeJ952a+JPL8NLI6wsVkA2f5xiOSKMdynvcf7EgvrvBA4bgTRUGOmtpoqzMiCcNh2AA==", + "python/iqpilot_private/navd/traffic_writer.cpython-312-aarch64-linux-gnu.so": "tMmnyV9knGA0eoRq1+bYLaQRAmLLrpSC9KraH9iNWMgleg+xdY3dIpx+uyP77de/oOQ2Bovsp3Vq2MobcDACCQ==", + "python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so": "kFb5U48pTMYRWee+JbH6CbOpE2je60Xk5ntJZIUCw66KWLTOUGFtQqMcUUcQ1b2/3xnCz7sb3Yt0GdbyyspMDg==", + "python/iqpilot_private/navd/valhalla_process.cpython-312-aarch64-linux-gnu.so": "u6o5lRGFT3PA7XPM0IXyr7iEsngyLKqh+kJhHNW7U7+iTI3hH25ag73YFQjnCfIuzPk2NtB4v2JKqcqBaNaQAQ==", + "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so": "4AB7oakyIWLG7OFuGpO+SidZnJzq3rC7/uWemSbhFVn9oOZBMQZ5IWN5Y3WfImyqoZXjZVGqxE9Yf0d8gmWdDA==" + } +} diff --git a/artifacts/iqpilot_navd_private/manifest.json.sig b/artifacts/iqpilot_navd_private/manifest.json.sig new file mode 100644 index 000000000..bb7022006 --- /dev/null +++ b/artifacts/iqpilot_navd_private/manifest.json.sig @@ -0,0 +1 @@ +NH/aexXGu1jWh6ks/x7lbVEUX9VZPhETrwkIozXSjmPR2isUyVlaZppveq23NB7BeIQTJuS/+KAuZ/pbL/kaDQ== diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_navd_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..6cef27bc0 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/_vendored.json @@ -0,0 +1,31 @@ +[ + "iqpilot.common.basedir", + "iqpilot.common.constants", + "iqpilot.common.gpio", + "iqpilot.common.gps", + "iqpilot.common.i2c", + "iqpilot.common.issue_debug", + "iqpilot.common.logging_extra", + "iqpilot.common.realtime", + "iqpilot.common.slc_utilities", + "iqpilot.common.slc_variables", + "iqpilot.common.speed_assist_tiers", + "iqpilot.common.swaglog", + "iqpilot.common.time_helpers", + "iqpilot.common.utils", + "iqpilot.iq_maps", + "iqpilot.selfdrive.car.cruise", + "iqpilot.selfdrive.car.long_increments", + "iqpilot.selfdrive.iqmodeld.config", + "iqpilot.system", + "iqpilot.system.hardware", + "iqpilot.system.hardware.base", + "iqpilot.system.hardware.hw", + "iqpilot.system.hardware.pc.hardware", + "iqpilot.system.hardware.tici", + "iqpilot.system.hardware.tici.amplifier", + "iqpilot.system.hardware.tici.hardware", + "iqpilot.system.hardware.tici.iwlist", + "iqpilot.system.hardware.tici.lpa", + "iqpilot.system.hardware.tici.pins" +] diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/basedir.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/basedir.py new file mode 100644 index 000000000..49b092d93 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/basedir.py @@ -0,0 +1,4 @@ +import os + + +BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../..")) diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/constants.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/constants.py new file mode 100644 index 000000000..7ca425c4b --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/constants.py @@ -0,0 +1,23 @@ +import numpy as np + +# conversions +class CV: + # Speed + MPH_TO_KPH = 1.609344 + KPH_TO_MPH = 1. / MPH_TO_KPH + MS_TO_KPH = 3.6 + KPH_TO_MS = 1. / MS_TO_KPH + MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH + MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS + MS_TO_KNOTS = 1.9438 + KNOTS_TO_MS = 1. / MS_TO_KNOTS + + # Angle + DEG_TO_RAD = np.pi / 180. + RAD_TO_DEG = 1. / DEG_TO_RAD + + # Mass + LB_TO_KG = 0.453592 + + +ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2 diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/gpio.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/gpio.py new file mode 100644 index 000000000..8f025a2da --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/gpio.py @@ -0,0 +1,89 @@ +import os +import fcntl +import ctypes +from functools import cache + +def gpio_init(pin: int, output: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f: + f.write(b"out" if output else b"in") + except Exception as e: + print(f"Failed to set gpio {pin} direction: {e}") + +def gpio_set(pin: int, high: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f: + f.write(b"1" if high else b"0") + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + +def gpio_read(pin: int) -> bool | None: + val = None + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f: + val = bool(int(f.read().strip())) + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + + return val + +def gpio_export(pin: int) -> None: + if os.path.isdir(f"/sys/class/gpio/gpio{pin}"): + return + + try: + with open("/sys/class/gpio/export", 'w') as f: + f.write(str(pin)) + except Exception: + print(f"Failed to export gpio {pin}") + +@cache +def get_irq_action(irq: int) -> list[str]: + try: + with open(f"/sys/kernel/irq/{irq}/actions") as f: + actions = f.read().strip().split(',') + return actions + except FileNotFoundError: + return [] + +def get_irqs_for_action(action: str) -> list[str]: + ret = [] + with open("/proc/interrupts") as f: + for l in f.readlines(): + irq = l.split(':')[0].strip() + if irq.isdigit() and action in get_irq_action(irq): + ret.append(irq) + return ret + +# *** gpiochip *** + +class gpioevent_data(ctypes.Structure): + _fields_ = [ + ("timestamp", ctypes.c_uint64), + ("id", ctypes.c_uint32), + ] + +class gpioevent_request(ctypes.Structure): + _fields_ = [ + ("lineoffset", ctypes.c_uint32), + ("handleflags", ctypes.c_uint32), + ("eventflags", ctypes.c_uint32), + ("label", ctypes.c_char * 32), + ("fd", ctypes.c_int) + ] + +def gpiochip_get_ro_value_fd(label: str, gpiochip_id: int, pin: int) -> int: + GPIOEVENT_REQUEST_BOTH_EDGES = 0x3 + GPIOHANDLE_REQUEST_INPUT = 0x1 + GPIO_GET_LINEEVENT_IOCTL = 0xc030b404 + + rq = gpioevent_request() + rq.lineoffset = pin + rq.handleflags = GPIOHANDLE_REQUEST_INPUT + rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES + rq.label = label.encode('utf-8')[:31] + b'\0' + + fd = os.open(f"/dev/gpiochip{gpiochip_id}", os.O_RDONLY) + fcntl.ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, rq) + os.close(fd) + return int(rq.fd) diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/gps.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/gps.py new file mode 100644 index 000000000..775a0a318 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/gps.py @@ -0,0 +1,8 @@ +from iqpilot.common.params import Params + + +def get_gps_location_service(params: Params) -> str: + if params.get_bool("UbloxAvailable"): + return "gpsLocationExternal" + else: + return "gpsLocation" diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/i2c.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/i2c.py new file mode 100644 index 000000000..1dfaa659a --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/i2c.py @@ -0,0 +1,81 @@ +import os +import fcntl +import ctypes + +# I2C constants from /usr/include/linux/i2c-dev.h +I2C_SLAVE = 0x0703 +I2C_SLAVE_FORCE = 0x0706 +I2C_SMBUS = 0x0720 + +# SMBus transfer types +I2C_SMBUS_READ = 1 +I2C_SMBUS_WRITE = 0 +I2C_SMBUS_BYTE_DATA = 2 +I2C_SMBUS_I2C_BLOCK_DATA = 8 + +I2C_SMBUS_BLOCK_MAX = 32 + + +class _I2cSmbusData(ctypes.Union): + _fields_ = [ + ("byte", ctypes.c_uint8), + ("word", ctypes.c_uint16), + ("block", ctypes.c_uint8 * (I2C_SMBUS_BLOCK_MAX + 2)), + ] + + +class _I2cSmbusIoctlData(ctypes.Structure): + _fields_ = [ + ("read_write", ctypes.c_uint8), + ("command", ctypes.c_uint8), + ("size", ctypes.c_uint32), + ("data", ctypes.POINTER(_I2cSmbusData)), + ] + + +class SMBus: + def __init__(self, bus: int): + self._fd = os.open(f'/dev/i2c-{bus}', os.O_RDWR) + + def __enter__(self) -> 'SMBus': + return self + + def __exit__(self, *args) -> None: + self.close() + + def close(self) -> None: + if hasattr(self, '_fd') and self._fd >= 0: + os.close(self._fd) + self._fd = -1 + + def _set_address(self, addr: int, force: bool = False) -> None: + ioctl_arg = I2C_SLAVE_FORCE if force else I2C_SLAVE + fcntl.ioctl(self._fd, ioctl_arg, addr) + + def _smbus_access(self, read_write: int, command: int, size: int, data: _I2cSmbusData) -> None: + ioctl_data = _I2cSmbusIoctlData(read_write, command, size, ctypes.pointer(data)) + fcntl.ioctl(self._fd, I2C_SMBUS, ioctl_data) + + def read_byte_data(self, addr: int, register: int, force: bool = False) -> int: + self._set_address(addr, force) + data = _I2cSmbusData() + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_BYTE_DATA, data) + return int(data.byte) + + def write_byte_data(self, addr: int, register: int, value: int, force: bool = False) -> None: + self._set_address(addr, force) + data = _I2cSmbusData() + data.byte = value & 0xFF + self._smbus_access(I2C_SMBUS_WRITE, register, I2C_SMBUS_BYTE_DATA, data) + + def read_i2c_block_data(self, addr: int, register: int, length: int, force: bool = False) -> list[int]: + self._set_address(addr, force) + if not (0 <= length <= I2C_SMBUS_BLOCK_MAX): + raise ValueError(f"length must be 0..{I2C_SMBUS_BLOCK_MAX}") + + data = _I2cSmbusData() + data.block[0] = length + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_I2C_BLOCK_DATA, data) + read_len = int(data.block[0]) or length + read_len = min(read_len, length) + return [int(b) for b in data.block[1 : read_len + 1]] diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/issue_debug.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/issue_debug.py new file mode 100644 index 000000000..e8c517a7d --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/issue_debug.py @@ -0,0 +1,44 @@ +import os +import threading +import time +from datetime import datetime +from pathlib import Path + +from iqpilot.system.hardware import PC +from iqpilot.system.hardware.hw import Paths + + +DEBUG_FILENAME = "iqpilot_issue_debug.txt" +DEBUG_PATH = Path(Paths.comma_home()) / "community" / DEBUG_FILENAME if PC else Path("/data/community") / DEBUG_FILENAME + +_lock = threading.Lock() +_last_log_times: dict[str, float] = {} + + +def log_issue(tag: str, message: str) -> None: + try: + DEBUG_PATH.parent.mkdir(parents=True, exist_ok=True) + with _lock: + with open(DEBUG_PATH, "a", encoding="utf-8") as f: + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + f.write(f"[{timestamp}] [{tag}] {message}\n") + except OSError: + pass + + +def log_issue_limited(key: str, tag: str, message: str, interval_sec: float = 1.0) -> None: + now = time.monotonic() + with _lock: + last = _last_log_times.get(key, 0.0) + if now - last < interval_sec: + return + _last_log_times[key] = now + + log_issue(tag, message) + + +def clear_issue_debug_log() -> None: + try: + os.remove(DEBUG_PATH) + except OSError: + pass diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/logging_extra.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/logging_extra.py new file mode 100644 index 000000000..ceaf083cd --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/logging_extra.py @@ -0,0 +1,249 @@ +import io +import os +import sys +import copy +import json +import time +import uuid +import socket +import logging +import traceback +import numpy as np +from threading import local +from collections import OrderedDict +from contextlib import contextmanager + +LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ + +def json_handler(obj): + if isinstance(obj, np.bool_): + return bool(obj) + # if isinstance(obj, (datetime.date, datetime.time)): + # return obj.isoformat() + return repr(obj) + +def json_robust_dumps(obj): + return json.dumps(obj, default=json_handler) + +class NiceOrderedDict(OrderedDict): + def __str__(self): + return json_robust_dumps(self) + +class SwagFormatter(logging.Formatter): + def __init__(self, swaglogger): + logging.Formatter.__init__(self, None, '%a %b %d %H:%M:%S %Z %Y') + + self.swaglogger = swaglogger + self.host = socket.gethostname() + + def format_dict(self, record): + record_dict = NiceOrderedDict() + + if isinstance(record.msg, dict): + record_dict['msg'] = record.msg + else: + try: + record_dict['msg'] = record.getMessage() + except (ValueError, TypeError): + record_dict['msg'] = [record.msg]+record.args + + record_dict['ctx'] = self.swaglogger.get_ctx() + + if record.exc_info: + record_dict['exc_info'] = self.formatException(record.exc_info) + + record_dict['level'] = record.levelname + record_dict['levelnum'] = record.levelno + record_dict['name'] = record.name + record_dict['filename'] = record.filename + record_dict['lineno'] = record.lineno + record_dict['pathname'] = record.pathname + record_dict['module'] = record.module + record_dict['funcName'] = record.funcName + record_dict['host'] = self.host + record_dict['process'] = record.process + record_dict['thread'] = record.thread + record_dict['threadName'] = record.threadName + record_dict['created'] = record.created + + return record_dict + + def format(self, record): + if self.swaglogger is None: + raise Exception("must set swaglogger before calling format()") + return json_robust_dumps(self.format_dict(record)) + +class SwagLogFileFormatter(SwagFormatter): + def fix_kv(self, k, v): + # append type to names to preserve legacy naming in logs + # avoids overlapping key namespaces with different types + # e.g. log.info() creates 'msg' -> 'msg$s' + # log.event() creates 'msg.health.logMonoTime' -> 'msg.health.logMonoTime$i' + # because overlapping namespace 'msg' caused problems + if isinstance(v, (str, bytes)): + k += "$s" + elif isinstance(v, float): + k += "$f" + elif isinstance(v, bool): + k += "$b" + elif isinstance(v, int): + k += "$i" + elif isinstance(v, dict): + nv = {} + for ik, iv in v.items(): + ik, iv = self.fix_kv(ik, iv) + nv[ik] = iv + v = nv + elif isinstance(v, list): + k += "$a" + return k, v + + def format(self, record): + if isinstance(record, str): + v = json.loads(record) + else: + v = self.format_dict(record) + + mk, mv = self.fix_kv('msg', v['msg']) + del v['msg'] + v[mk] = mv + v['id'] = uuid.uuid4().hex + + return json_robust_dumps(v) + +class SwagErrorFilter(logging.Filter): + def filter(self, record): + return record.levelno < logging.ERROR + +def _tmpfunc(): + return 0 + +def _srcfile(): + return os.path.normcase(_tmpfunc.__code__.co_filename) + +class SwagLogger(logging.Logger): + def __init__(self): + logging.Logger.__init__(self, "swaglog") + + self.global_ctx = {} + + self.log_local = local() + self.log_local.ctx = {} + + def local_ctx(self): + try: + return self.log_local.ctx + except AttributeError: + self.log_local.ctx = {} + return self.log_local.ctx + + def get_ctx(self): + return dict(self.local_ctx(), **self.global_ctx) + + @contextmanager + def ctx(self, **kwargs): + old_ctx = self.local_ctx() + self.log_local.ctx = copy.copy(old_ctx) or {} + self.log_local.ctx.update(kwargs) + try: + yield + finally: + self.log_local.ctx = old_ctx + + def bind(self, **kwargs): + self.local_ctx().update(kwargs) + + def bind_global(self, **kwargs): + self.global_ctx.update(kwargs) + + def event(self, event, *args, **kwargs): + evt = NiceOrderedDict() + evt['event'] = event + if args: + evt['args'] = args + evt.update(kwargs) + if 'error' in kwargs: + self.error(evt) + elif 'debug' in kwargs: + self.debug(evt) + else: + self.info(evt) + + def timestamp(self, event_name): + if LOG_TIMESTAMPS: + t = time.monotonic() + tstp = NiceOrderedDict() + tstp['timestamp'] = NiceOrderedDict() + tstp['timestamp']["event"] = event_name + tstp['timestamp']["time"] = t*1e9 + self.debug(tstp) + + def findCaller(self, stack_info=False, stacklevel=1): + """ + Find the stack frame of the caller so that we can note the source + file name, line number and function name. + """ + f = sys._getframe(3) + #On some versions of IronPython, currentframe() returns None if + #IronPython isn't run with -X:Frames. + if f is not None: + f = f.f_back + orig_f = f + while f and stacklevel > 1: + f = f.f_back + stacklevel -= 1 + if not f: + f = orig_f + rv = "(unknown file)", 0, "(unknown function)", None + while hasattr(f, "f_code"): + co = f.f_code + filename = os.path.normcase(co.co_filename) + + if filename == _srcfile: + f = f.f_back + continue + sinfo = None + if stack_info: + sio = io.StringIO() + sio.write('Stack (most recent call last):\n') + traceback.print_stack(f, file=sio) + sinfo = sio.getvalue() + if sinfo[-1] == '\n': + sinfo = sinfo[:-1] + sio.close() + rv = (co.co_filename, f.f_lineno, co.co_name, sinfo) + break + return rv + +if __name__ == "__main__": + log = SwagLogger() + + stdout_handler = logging.StreamHandler(sys.stdout) + stdout_handler.setLevel(logging.INFO) + stdout_handler.addFilter(SwagErrorFilter()) + log.addHandler(stdout_handler) + + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.ERROR) + log.addHandler(stderr_handler) + + log.info("asdasd %s", "a") + log.info({'wut': 1}) + log.warning("warning") + log.error("error") + log.critical("critical") + log.event("test", x="y") + + with log.ctx(): + stdout_handler.setFormatter(SwagFormatter(log)) + stderr_handler.setFormatter(SwagFormatter(log)) + log.bind(user="some user") + log.info("in req") + print("") + log.warning("warning") + print("") + log.error("error") + print("") + log.critical("critical") + print("") + log.event("do_req", a=1, b="c") diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/realtime.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/realtime.py new file mode 100644 index 000000000..9fd2f695d --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/realtime.py @@ -0,0 +1,134 @@ +"""Utilities for reading real time clocks and keeping soft real time constraints.""" +import gc +import os +import sys +import time + +from setproctitle import getproctitle + +from iqpilot.common.utils import MovingAverage +from iqpilot.system.hardware import PC + + +# time step for each process +DT_CTRL = 0.01 # controlsd +DT_MDL = 0.05 # model +DT_HW = 0.5 # hardwared and manager +DT_DMON = 0.05 # driver monitoring + + +class Priority: + # CORE 2 + # - modeld = 55 + # - camerad = 54 + CTRL_LOW = 51 # plannerd & radard + + # CORE 3 + # - pandad = 55 + CTRL_HIGH = 53 + + +def set_core_affinity(cores: list[int]) -> None: + if sys.platform == 'linux' and not PC: + os.sched_setaffinity(0, cores) + + +def config_realtime_process(cores: int | list[int], priority: int) -> None: + gc.disable() + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(priority)) + c = cores if isinstance(cores, list) else [cores, ] + set_core_affinity(c) + + +def config_background_thread() -> None: + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_OTHER, os.sched_param(0)) + set_core_affinity(list(range(os.cpu_count() or 1))) + + +def lock_memory() -> None: + """mlockall this process so memory reclaim/compaction can't stall it. RT control + procs only (locking ui/modeld would worsen pressure). Best-effort.""" + if sys.platform != 'linux' or PC: + return + try: + import ctypes + import resource + resource.setrlimit(resource.RLIMIT_MEMLOCK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) + MCL_CURRENT, MCL_FUTURE = 0x1, 0x2 + libc = ctypes.CDLL("libc.so.6", use_errno=True) + if libc.mlockall(MCL_CURRENT | MCL_FUTURE) != 0: + raise OSError(ctypes.get_errno(), os.strerror(ctypes.get_errno())) + except Exception as e: + try: + from iqpilot.common.swaglog import cloudlog + cloudlog.warning(f"lock_memory (mlockall) failed: {e}") + except Exception: + pass + + +class Ratekeeper: + def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None: + """Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative.""" + self._interval = 1. / rate + self._print_delay_threshold = print_delay_threshold + self._frame = 0 + self._remaining = 0.0 + self._process_name = getproctitle() + self._last_monitor_time = -1. + self._next_frame_time = -1. + + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + def reset(self) -> None: + self._remaining = 0.0 + self._last_monitor_time = -1. + self._next_frame_time = -1. + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + @property + def frame(self) -> int: + return self._frame + + @property + def remaining(self) -> float: + return self._remaining + + @property + def lag(self) -> float: + return max(0., -self._remaining) + + @property + def lagging(self) -> bool: + expected_dt = self._interval * (1 / 0.9) + return self.avg_dt.get_average() > expected_dt + + # Maintain loop rate by calling this at the end of each loop + def keep_time(self) -> bool: + lagged = self.monitor_time() + if self._remaining > 0: + time.sleep(self._remaining) + return lagged + + # Monitors the cumulative lag, but does not enforce a rate + def monitor_time(self) -> bool: + if self._last_monitor_time < 0: + self._next_frame_time = time.monotonic() + self._interval + self._last_monitor_time = time.monotonic() + + prev = self._last_monitor_time + self._last_monitor_time = time.monotonic() + self.avg_dt.add_value(self._last_monitor_time - prev) + + lagged = False + remaining = self._next_frame_time - time.monotonic() + self._next_frame_time += self._interval + if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: + print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms") + lagged = True + self._frame += 1 + self._remaining = remaining + return lagged diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/slc_utilities.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/slc_utilities.py new file mode 100644 index 000000000..296ab0785 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/slc_utilities.py @@ -0,0 +1,126 @@ +import math +import numpy as np + +try: + import requests +except ImportError: + requests = None + +from iqpilot.common.slc_variables import EARTH_RADIUS + + +def calculate_bearing_offset(latitude, longitude, current_bearing, distance): + """ + Calculate new GPS coordinates given a starting point, bearing, and distance. + Used for Mapbox API lookahead calculations. + + Args: + latitude: Starting latitude in degrees + longitude: Starting longitude in degrees + current_bearing: Bearing in degrees (0-360) + distance: Distance to project in meters + + Returns: + Tuple of (new_latitude, new_longitude) in degrees + """ + bearing = math.radians(current_bearing) + lat_rad = math.radians(latitude) + lon_rad = math.radians(longitude) + + delta = distance / EARTH_RADIUS + + new_lat = math.asin(math.sin(lat_rad) * math.cos(delta) + math.cos(lat_rad) * math.sin(delta) * math.cos(bearing)) + new_lon = lon_rad + math.atan2(math.sin(bearing) * math.sin(delta) * math.cos(lat_rad), math.cos(delta) - math.sin(lat_rad) * math.sin(new_lat)) + return math.degrees(new_lat), math.degrees(new_lon) + + +def calculate_distance_to_point(lat1, lon1, lat2, lon2): + """ + Calculate the great circle distance between two GPS points using the Haversine formula. + + Args: + lat1, lon1: First point coordinates in degrees + lat2, lon2: Second point coordinates in degrees + + Returns: + Distance in meters + """ + lat1_rad = math.radians(lat1) + lon1_rad = math.radians(lon1) + lat2_rad = math.radians(lat2) + lon2_rad = math.radians(lon2) + + delta_lat = lat2_rad - lat1_rad + delta_lon = lon2_rad - lon1_rad + + a = (math.sin(delta_lat / 2) ** 2) + math.cos(lat1_rad) * math.cos(lat2_rad) * (math.sin(delta_lon / 2) ** 2) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + + return EARTH_RADIUS * c + + +def calculate_lane_width(lane_line1, lane_line2, road_edge=None): + """ + Calculate the width of a lane based on lane line positions. + Used for speed limit filler to determine road width. + + Args: + lane_line1: First lane line object with x, y coordinates + lane_line2: Second lane line object with x, y coordinates + road_edge: Optional road edge object with x, y coordinates + + Returns: + Lane width in meters + """ + lane_line1_x = np.asarray(lane_line1.x) + lane_line1_y = np.asarray(lane_line1.y) + + lane_line2_x = np.asarray(lane_line2.x) + lane_line2_y = np.asarray(lane_line2.y) + + lane_y_interp = np.interp(lane_line2_x, lane_line1_x, lane_line1_y) + distance_to_lane = np.median(np.abs(lane_line2_y - lane_y_interp)) + + if road_edge is None: + return distance_to_lane + + road_edge_x = np.asarray(road_edge.x) + road_edge_y = np.asarray(road_edge.y) + + edge_y_interp = np.interp(lane_line2_x, road_edge_x, road_edge_y) + distance_to_edge = np.median(np.abs(lane_line2_y - edge_y_interp)) + + return max(distance_to_lane, distance_to_edge) + + +def is_url_pingable(url): + """ + Check if a URL is accessible and responding. + Used to verify Mapbox/Overpass API availability before making requests. + + Args: + url: URL to ping + + Returns: + Boolean indicating if URL is accessible + """ + if not url: + return False + + if requests is None: + return False + + if not hasattr(is_url_pingable, "session"): + is_url_pingable.session = requests.Session() + is_url_pingable.session.headers.update({"User-Agent": "iqpilot-ping-test/1.0"}) + + try: + response = is_url_pingable.session.head(url, timeout=10, allow_redirects=True) + if response.status_code in (405, 501): + response = is_url_pingable.session.get(url, timeout=10, allow_redirects=True, stream=True) + + is_accessible = response.ok + response.close() + return is_accessible + except Exception: + return False diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/slc_variables.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/slc_variables.py new file mode 100644 index 000000000..80278d580 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/slc_variables.py @@ -0,0 +1,35 @@ +# Earth radius in meters (for GPS calculations) +EARTH_RADIUS = 6378137 + +# Mapbox API limits +FREE_MAPBOX_REQUESTS = 100_000 + +# Speed limit offset zones for different unit systems +# Each entry is (min_speed_ms, max_speed_ms, param_name); the param value is a +# percent offset applied to the resolved limit (e.g. 10 -> +10%), lower bound inclusive + +OFFSET_PERCENT_MAX = 50.0 + +OFFSET_MAP_IMPERIAL = [ + (0, 8.94, "speed_limit_offset1"), # 0-20 mph + (8.94, 17.88, "speed_limit_offset2"), # 20-40 mph + (17.88, float("inf"), "speed_limit_offset3"), # 40+ mph +] + +OFFSET_MAP_METRIC = [ + (0, 8.33, "speed_limit_offset1"), # 0-30 km/h + (8.33, 16.67, "speed_limit_offset2"), # 30-60 km/h + (16.67, float("inf"), "speed_limit_offset3"), # 60+ km/h +] + +# Speed limit filler constants +BOUNDING_BOX_RADIUS_DEGREE = 0.1 +MAX_ENTRIES = 1_000_000 +MAX_OVERPASS_DATA_BYTES = 1_073_741_824 +MAX_OVERPASS_REQUESTS = 10_000 +METERS_PER_DEG_LAT = 111_320 +VETTING_INTERVAL_DAYS = 7 + +# Overpass API URLs +OVERPASS_API_URL = "https://overpass-api.de/api/interpreter" +OVERPASS_STATUS_URL = "https://overpass-api.de/api/status" diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/speed_assist_tiers.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/speed_assist_tiers.py new file mode 100644 index 000000000..ef94c1bb1 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/speed_assist_tiers.py @@ -0,0 +1,20 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Engagement tiers for the speed-assist feature. A tier is persisted as an integer +under the "IQSpeedAssistMode" param; the ordinal IS the stored value and must remain +stable (0..3), ordered by how much the tier is allowed to intervene. +""" +from enum import IntEnum + +STORE_KEY = "IQSpeedAssistMode" + +# none -> just display the limit -> highlight overspeed -> move the set speed +SpeedAssistTier = IntEnum("SpeedAssistTier", "DISABLED ADVISORY ALERTING ACTUATING", start=0) + +DEFAULT_TIER = SpeedAssistTier.ADVISORY + + +def actuates_speed(tier) -> bool: + """Only the top tier is permitted to drive the cruise set speed.""" + return int(tier) == SpeedAssistTier.ACTUATING diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/swaglog.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/swaglog.py new file mode 100644 index 000000000..f8fd9d392 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/swaglog.py @@ -0,0 +1,165 @@ +import logging +import os +import sys +import time +import warnings +from pathlib import Path +from logging.handlers import BaseRotatingHandler + +import zmq + +from iqpilot.common.logging_extra import SwagLogger, SwagFormatter, SwagLogFileFormatter +from iqpilot.system.hardware.hw import Paths + + +def get_file_handler(): + Path(Paths.swaglog_root()).mkdir(parents=True, exist_ok=True) + base_filename = os.path.join(Paths.swaglog_root(), "swaglog") + handler = SwaglogRotatingFileHandler(base_filename) + return handler + +class SwaglogRotatingFileHandler(BaseRotatingHandler): + def __init__(self, base_filename, interval=60, max_bytes=1024*256, backup_count=2500, encoding=None): + super().__init__(base_filename, mode="a", encoding=encoding, delay=True) + self.base_filename = base_filename + self.interval = interval # seconds + self.max_bytes = max_bytes + self.backup_count = backup_count + self.log_files = self.get_existing_logfiles() + log_indexes = [f.split(".")[-1] for f in self.log_files] + self.last_file_idx = max([int(i) for i in log_indexes if i.isdigit()] or [-1]) + self.last_rollover = None + self.doRollover() + + def _open(self): + self.last_rollover = time.monotonic() + self.last_file_idx += 1 + next_filename = f"{self.base_filename}.{self.last_file_idx:010}" + stream = open(next_filename, self.mode, encoding=self.encoding) + self.log_files.insert(0, next_filename) + return stream + + def get_existing_logfiles(self): + log_files = list() + base_dir = os.path.dirname(self.base_filename) + for fn in os.listdir(base_dir): + fp = os.path.join(base_dir, fn) + if fp.startswith(self.base_filename) and os.path.isfile(fp): + log_files.append(fp) + return sorted(log_files) + + def shouldRollover(self, record): + size_exceeded = self.max_bytes > 0 and self.stream.tell() >= self.max_bytes + time_exceeded = self.interval > 0 and self.last_rollover + self.interval <= time.monotonic() + return size_exceeded or time_exceeded + + def doRollover(self): + if self.stream: + self.stream.close() + self.stream = self._open() + + if self.backup_count > 0: + while len(self.log_files) > self.backup_count: + to_delete = self.log_files.pop() + if os.path.exists(to_delete): # just being safe, should always exist + os.remove(to_delete) + +class UnixDomainSocketHandler(logging.Handler): + def __init__(self, formatter): + logging.Handler.__init__(self) + self.setFormatter(formatter) + self.pid = None + + self.zctx = None + self.sock = None + + def __del__(self): + self.close() + + def close(self): + if self.sock is not None: + self.sock.close() + if self.zctx is not None: + self.zctx.term() + + def connect(self): + self.zctx = zmq.Context() + self.sock = self.zctx.socket(zmq.PUSH) + self.sock.setsockopt(zmq.LINGER, 10) + self.sock.connect(Paths.swaglog_ipc()) + self.pid = os.getpid() + + def emit(self, record): + if os.getpid() != self.pid: + # TODO suppresses warning about forking proc with zmq socket, fix root cause + warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*") + self.connect() + + msg = self.format(record).rstrip('\n') + # print("SEND".format(repr(msg))) + try: + s = chr(record.levelno)+msg + self.sock.send(s.encode('utf8'), zmq.NOBLOCK) + except zmq.error.Again: + # drop :/ + pass + + +class ForwardingHandler(logging.Handler): + def __init__(self, target_logger): + super().__init__() + self.target_logger = target_logger + + def emit(self, record): + self.target_logger.handle(record) + + +def add_file_handler(log): + """ + Function to add the file log handler to swaglog. + This can be used to store logs when logmessaged is not running. + """ + handler = get_file_handler() + handler.setFormatter(SwagLogFileFormatter(log)) + log.addHandler(handler) + + +cloudlog = log = SwagLogger() +log.setLevel(logging.DEBUG) + + +class PrettyConsoleFormatter(logging.Formatter): + # StreamHandler writes to stderr, so tty-gate on that + _COLOR = sys.stderr.isatty() and os.environ.get('NO_COLOR') is None + + def format(self, record): + msg = record.getMessage() + if not self._COLOR: + return f"{record.filename}: {msg}" + lvl = record.levelno + if lvl >= 50: lc, ln = "\033[1;38;5;196m", "CRIT" + elif lvl >= 40: lc, ln = "\033[1;38;5;203m", " ERR" + elif lvl >= 30: lc, ln = "\033[38;5;214m", "WARN" + elif lvl >= 20: lc, ln = "\033[38;5;110m", "info" + else: lc, ln = "\033[38;5;244m", " dbg" + body = f"\033[1;38;5;210m{msg}\033[0m" if lvl >= 40 else msg + src = "" if record.filename == "(unknown file)" else f"\033[2m{record.filename}\033[0m " + return f"{lc}{ln:>4}\033[0m {src}{body}" + + +outhandler = logging.StreamHandler() +outhandler.setFormatter(PrettyConsoleFormatter()) + +print_level = os.environ.get('LOGPRINT', 'warning') +if print_level == 'debug': + outhandler.setLevel(logging.DEBUG) +elif print_level == 'info': + outhandler.setLevel(logging.INFO) +elif print_level == 'warning': + outhandler.setLevel(logging.WARNING) + +ipchandler = UnixDomainSocketHandler(SwagFormatter(log)) + +log.addHandler(outhandler) +# logs are sent through IPC before writing to disk to prevent disk I/O blocking +log.addHandler(ipchandler) diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/time_helpers.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/time_helpers.py new file mode 100644 index 000000000..8564e270c --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/time_helpers.py @@ -0,0 +1,15 @@ +import datetime +from pathlib import Path + +MIN_DATE = datetime.datetime(year=2025, month=2, day=21) + +def min_date(): + # on systemd systems, the default time is the systemd build time + systemd_path = Path("/lib/systemd/systemd") + if systemd_path.exists(): + d = datetime.datetime.fromtimestamp(systemd_path.stat().st_mtime) + return max(MIN_DATE, d + datetime.timedelta(days=1)) + return MIN_DATE + +def system_time_valid(): + return datetime.datetime.now() > min_date() diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/utils.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/utils.py new file mode 100644 index 000000000..e0aa1605d --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/common/utils.py @@ -0,0 +1,271 @@ +import io +import os +import tempfile +import contextlib +import subprocess +import time +import functools +from subprocess import Popen, PIPE, TimeoutExpired +import zstandard as zstd + +LOG_COMPRESSION_LEVEL = 10 # little benefit up to level 15. level ~17 is a small step change + +class Timer: + """Simple lap timer for profiling sequential operations.""" + + def __init__(self): + self._start = self._lap = time.monotonic() + self._sections = {} + + def lap(self, name): + now = time.monotonic() + self._sections[name] = now - self._lap + self._lap = now + + @property + def total(self): + return time.monotonic() - self._start + + def fmt(self, duration): + parts = ", ".join(f"{k}={v:.2f}s" + (f" ({duration/v:.0f}x)" if k == 'render' and v > 0 else "") for k, v in self._sections.items()) + total = self.total + realtime = f"{duration/total:.1f}x realtime" if total > 0 else "N/A" + return f"{duration}s in {total:.1f}s ({realtime}) | {parts}" + +def sudo_write(val: str, path: str) -> None: + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + os.system(f"sudo chmod a+w {path}") + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + # fallback for debugfs files + os.system(f"sudo su -c 'echo {val} > {path}'") + + +def sudo_read(path: str) -> str: + try: + return subprocess.check_output(f"sudo cat {path}", shell=True, encoding='utf8').strip() + except Exception: + return "" + + +class MovingAverage: + def __init__(self, window_size: int): + self.window_size: int = window_size + self.buffer: list[float] = [0.0] * window_size + self.index: int = 0 + self.count: int = 0 + self.sum: float = 0.0 + + def add_value(self, new_value: float): + # Update the sum: subtract the value being replaced and add the new value + self.sum -= self.buffer[self.index] + self.buffer[self.index] = new_value + self.sum += new_value + + # Update the index in a circular manner + self.index = (self.index + 1) % self.window_size + + # Track the number of added values (for partial windows) + self.count = min(self.count + 1, self.window_size) + + def get_average(self) -> float: + if self.count == 0: + return float('nan') + return self.sum / self.count + + +class CallbackReader: + """Wraps a file, but overrides the read method to also + call a callback function with the number of bytes read so far.""" + + def __init__(self, f, callback, *args): + self.f = f + self.callback = callback + self.cb_args = args + self.total_read = 0 + + def __getattr__(self, attr): + return getattr(self.f, attr) + + def read(self, *args, **kwargs): + chunk = self.f.read(*args, **kwargs) + self.total_read += len(chunk) + self.callback(*self.cb_args, self.total_read) + return chunk + + +@contextlib.contextmanager +def atomic_write(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None, + overwrite: bool = False): + """Write to a file atomically using a temporary file in the same directory as the destination file.""" + dir_name = os.path.dirname(path) + + if not overwrite and os.path.exists(path): + raise FileExistsError(f"File '{path}' already exists. To overwrite it, set 'overwrite' to True.") + + with tempfile.NamedTemporaryFile(mode=mode, buffering=buffering, encoding=encoding, newline=newline, dir=dir_name, delete=False) as tmp_file: + yield tmp_file + tmp_file_name = tmp_file.name + os.replace(tmp_file_name, path) + + +def get_upload_stream(filepath: str, should_compress: bool) -> tuple[io.BufferedIOBase, int]: + if not should_compress: + file_size = os.path.getsize(filepath) + file_stream = open(filepath, "rb") + return file_stream, file_size + + # Compress the file on the fly + compressed_stream = io.BytesIO() + compressor = zstd.ZstdCompressor(level=LOG_COMPRESSION_LEVEL) + + with open(filepath, "rb") as f: + compressor.copy_stream(f, compressed_stream) + compressed_size = compressed_stream.tell() + compressed_stream.seek(0) + return compressed_stream, compressed_size + + +# remove all keys that end in DEPRECATED +def strip_deprecated_keys(d): + for k in list(d.keys()): + if isinstance(k, str): + if k.endswith('DEPRECATED'): + d.pop(k) + elif isinstance(d[k], dict): + strip_deprecated_keys(d[k]) + return d + + +def run_cmd(cmd: list[str], cwd=None, env=None) -> str: + return subprocess.check_output(cmd, encoding='utf8', cwd=cwd, env=env).strip() + + +def run_cmd_default(cmd: list[str], default: str = "", cwd=None, env=None) -> str: + try: + return run_cmd(cmd, cwd=cwd, env=env) + except subprocess.CalledProcessError: + return default + + +@contextlib.contextmanager +def managed_proc(cmd: list[str], env: dict[str, str]): + proc = Popen(cmd, env=env, stdout=PIPE, stderr=PIPE) + try: + yield proc + finally: + if proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=5) + except TimeoutExpired: + proc.kill() + + +def tabulate(tabular_data, headers=(), tablefmt="simple", floatfmt="g", stralign="left", numalign=None): + rows = [list(row) for row in tabular_data] + + def fmt(val): + if isinstance(val, str): + return val + if isinstance(val, (bool, int)): + return str(val) + try: + return format(val, floatfmt) + except (TypeError, ValueError): + return str(val) + + formatted = [[fmt(c) for c in row] for row in rows] + hdrs = [str(h) for h in headers] if headers else None + + ncols = max((len(r) for r in formatted), default=0) + if hdrs: + ncols = max(ncols, len(hdrs)) + if ncols == 0: + return "" + + for r in formatted: + r.extend([""] * (ncols - len(r))) + if hdrs: + hdrs.extend([""] * (ncols - len(hdrs))) + + widths = [0] * ncols + if hdrs: + for i in range(ncols): + widths[i] = len(hdrs[i]) + for row in formatted: + for i in range(ncols): + widths[i] = max(widths[i], max(len(ln) for ln in row[i].split('\n'))) + + def _align(s, w): + if stralign == "center": + return s.center(w) + return s.ljust(w) + + if tablefmt == "html": + parts = [""] + if hdrs: + parts.append("") + parts.append("" + "".join(f"" for h in hdrs) + "") + parts.append("") + parts.append("") + for row in formatted: + parts.append("" + "".join(f"" for c in row) + "") + parts.append("") + parts.append("
{h}
{c}
") + return "\n".join(parts) + + if tablefmt == "simple_grid": + def _sep(left, mid, right): + return left + mid.join("─" * (w + 2) for w in widths) + right + + top, mid_sep, bot = _sep("┌", "â”Ŧ", "┐"), _sep("├", "â”ŧ", "┤"), _sep("└", "┴", "┘") + + def _fmt_row(cells): + split = [c.split('\n') for c in cells] + nlines = max(len(s) for s in split) + for s in split: + s.extend([""] * (nlines - len(s))) + return ["│" + "│".join(f" {_align(split[i][li], widths[i])} " for i in range(ncols)) + "│" for li in range(nlines)] + + lines = [top] + if hdrs: + lines.extend(_fmt_row(hdrs)) + lines.append(mid_sep) + for ri, row in enumerate(formatted): + lines.extend(_fmt_row(row)) + lines.append(mid_sep if ri < len(formatted) - 1 else bot) + return "\n".join(lines) + + gap = " " + lines = [] + if hdrs: + lines.append(gap.join(h.ljust(w) for h, w in zip(hdrs, widths, strict=True))) + lines.append(gap.join("-" * w for w in widths)) + for row in formatted: + lines.append(gap.join(_align(row[i], widths[i]) for i in range(ncols))) + return "\n".join(lines) + + +def retry(attempts=3, delay=1.0, ignore_failure=False): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + for _ in range(attempts): + try: + return func(*args, **kwargs) + except Exception: + print(f"{func.__name__} failed, trying again") + time.sleep(delay) + + if ignore_failure: + print(f"{func.__name__} failed after retry") + else: + raise Exception(f"{func.__name__} failed after retry") + return wrapper + return decorator diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/iq_maps/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/iq_maps/__init__.py new file mode 100644 index 000000000..1d4270037 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/iq_maps/__init__.py @@ -0,0 +1,5 @@ +import os +from iqpilot.common.basedir import BASEDIR + +VENDOR_MAPD_BIN_DIR = os.path.join(BASEDIR, "iqpilot/third_party/mapd_pfeiferj") +VENDOR_MAPD_PATH = os.path.join(VENDOR_MAPD_BIN_DIR, "mapd") diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/car/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/car/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/car/cruise.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/car/cruise.py new file mode 100644 index 000000000..79881caee --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/car/cruise.py @@ -0,0 +1,387 @@ +import math +import numpy as np + +from iqpilot.cereal import car +from iqpilot.common.constants import CV +from iqpilot.cereal import car, custom +from iqdbc.car import structs +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.car.long_increments import LongIncrementConfig, read_long_increment_config, resolve_button_step + + +# ===== VCruiseHelperIQ (dissolved from iqpilot vcruise_helper_iq) ===== + +ButtonType = car.CarState.ButtonEvent.Type +SpeedLimitAssistState = custom.IQPlan.SpeedLimit.AssistState +SPEED_LIMIT_CONTROL_ACTIVE_STATES = (SpeedLimitAssistState.active, SpeedLimitAssistState.adapting) + + +def compare_cluster_target(v_cruise_cluster: float, target_set_speed: float, is_metric: bool) -> tuple[bool, bool]: + """Whether the cluster set-speed needs +/- presses to reach the target, in display units.""" + to_shown = CV.MS_TO_KPH if is_metric else CV.MS_TO_MPH + now = round(v_cruise_cluster * to_shown) + goal = round(target_set_speed * to_shown) + return now < goal, now > goal + + +CRUISE_BUTTON_TIMER = {ButtonType.decelCruise: 0, ButtonType.accelCruise: 0, + ButtonType.setCruise: 0, ButtonType.resumeCruise: 0, + ButtonType.cancel: 0, ButtonType.mainCruise: 0} + +V_CRUISE_MIN = 8 +V_CRUISE_MAX = 200 # ~ 124 mph +V_CRUISE_UNSET = 255 +IQ_SET_SPEED_MODE_OFF = 0 +IQ_SET_SPEED_MODE_FIXED = 1 +IQ_SET_SPEED_MPH_DEFAULT = 65 +IQ_SET_SPEED_MPH_MIN = 20 +IQ_SET_SPEED_MPH_MAX = 120 + + +def get_minimum_set_speed_kph(_is_metric: bool) -> float: + # IQ minimum set speed floor, expressed in kph for VCruiseHelper integration. + return float(V_CRUISE_MIN) + + +def update_manual_button_timers(CS: car.CarState, button_timers: dict[car.CarState.ButtonEvent.Type, int]) -> None: + # age any button that's currently held (nonzero timer) + for btn, held_frames in button_timers.items(): + if held_frames > 0: + button_timers[btn] = held_frames + 1 + + # a press/release edge (re)starts the timer at 1 or clears it to 0 + for event in CS.buttonEvents: + raw = event.type.raw + if raw in button_timers: + button_timers[raw] = 1 if event.pressed else 0 + + +class VCruiseHelperIQ: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams) -> None: + self.CP = CP + self.CP_IQ = CP_IQ + self.v_cruise_kph = V_CRUISE_UNSET + self.v_cruise_cluster_kph = V_CRUISE_UNSET + self.params = Params() + self.v_cruise_min = 0 + self.enabled_prev = False + + self.long_increment_config: LongIncrementConfig = read_long_increment_config(self.params) + self.set_speed_to_limit = self._read_set_speed_to_limit() + self.iq_set_speed_mode = self._read_iq_set_speed_mode() + self.iq_set_speed_use_current = self._read_iq_set_speed_use_current() + self.iq_set_speed_mph = self._read_iq_set_speed_mph() + + self.enable_button_timers = CRUISE_BUTTON_TIMER + + # Speed Limit Assist + self.speed_limit_state = SpeedLimitAssistState.disabled + self.prev_speed_limit_state = SpeedLimitAssistState.disabled + self.has_speed_limit = False + self.speed_limit_final_last = 0. + self.speed_limit_final_last_kph = 0. + self.prev_speed_limit_final_last_kph = 0. + self.req_plus = False + self.req_minus = False + + def _read_set_speed_to_limit(self) -> bool: + try: + return self.params.get_bool("SLCSetSpeedToLimit") + except Exception: + return False + + def _read_iq_set_speed_mode(self) -> int: + try: + return int(self.params.get("IQE2ESetSpeedMode", return_default=True) or IQ_SET_SPEED_MODE_OFF) + except Exception: + return IQ_SET_SPEED_MODE_OFF + + def _read_iq_set_speed_use_current(self) -> bool: + try: + return bool(self.params.get_bool("IQE2ESetSpeedUseCurrent")) + except Exception: + return False + + def _read_iq_set_speed_mph(self) -> int: + try: + value = int(self.params.get("IQE2ESetSpeedMph", return_default=True) or IQ_SET_SPEED_MPH_DEFAULT) + except Exception: + value = IQ_SET_SPEED_MPH_DEFAULT + return int(np.clip(value, IQ_SET_SPEED_MPH_MIN, IQ_SET_SPEED_MPH_MAX)) + + def read_custom_set_speed_params(self) -> None: + self.long_increment_config = read_long_increment_config(self.params) + self.set_speed_to_limit = self._read_set_speed_to_limit() + self.iq_set_speed_mode = self._read_iq_set_speed_mode() + self.iq_set_speed_use_current = self._read_iq_set_speed_use_current() + self.iq_set_speed_mph = self._read_iq_set_speed_mph() + + def get_iq_mode_initial_set_speed_kph(self, current_speed_kph: float, fallback_kph: float) -> float: + if self.iq_set_speed_mode != IQ_SET_SPEED_MODE_FIXED: + return fallback_kph + + if self.iq_set_speed_use_current: + return float(np.clip(round(current_speed_kph, 1), self.v_cruise_min, V_CRUISE_MAX)) + + fixed_kph = float(self.iq_set_speed_mph) * CV.MPH_TO_KPH + return float(np.clip(round(fixed_kph, 1), self.v_cruise_min, V_CRUISE_MAX)) + + def update_v_cruise_delta(self, long_press: bool, v_cruise_delta: float) -> tuple[bool, float]: + return resolve_button_step(self.long_increment_config, long_press, v_cruise_delta) + + def get_minimum_set_speed(self, is_metric: bool) -> None: + if self.CP_IQ.pcmCruiseSpeed: + self.v_cruise_min = V_CRUISE_MIN + return + + self.v_cruise_min = get_minimum_set_speed_kph(is_metric) + + def update_enabled_state(self, CS: car.CarState, enabled: bool) -> bool: + # pcmCruiseSpeed cars keep the stock enabled flag; others gate engagement on button release + if self.CP_IQ.pcmCruiseSpeed: + return enabled + + update_manual_button_timers(CS, self.enable_button_timers) + button_pressed = any(t > 0 for t in self.enable_button_timers.values()) + + if enabled and not self.enabled_prev: + # first engage frame while the button is still down: hold off until it's let go + self.enabled_prev = not button_pressed + return False + if not enabled: + self.enabled_prev = False + + return enabled and self.enabled_prev + + def update_speed_limit_assist(self, is_metric, LP_IQ: custom.IQPlan) -> None: + resolver = LP_IQ.speedLimit.resolver + self.has_speed_limit = resolver.speedLimitValid or resolver.speedLimitLastValid + self.speed_limit_final_last = LP_IQ.speedLimit.resolver.speedLimitFinalLast + self.speed_limit_final_last_kph = self.speed_limit_final_last * CV.MS_TO_KPH + self.speed_limit_state = LP_IQ.speedLimit.assist.state + self.req_plus, self.req_minus = compare_cluster_target(self.v_cruise_cluster_kph * CV.KPH_TO_MS, + self.speed_limit_final_last, is_metric) + + @property + def update_speed_limit_final_last_changed(self) -> bool: + if not self.has_speed_limit: + return False + return self.speed_limit_final_last_kph != self.prev_speed_limit_final_last_kph + + def update_speed_limit_assist_v_cruise_non_pcm(self) -> None: + if self.set_speed_to_limit and \ + self.speed_limit_state in SPEED_LIMIT_CONTROL_ACTIVE_STATES and \ + (self.prev_speed_limit_state not in SPEED_LIMIT_CONTROL_ACTIVE_STATES or self.update_speed_limit_final_last_changed): + self.v_cruise_kph = np.clip(round(self.speed_limit_final_last_kph, 1), self.v_cruise_min, V_CRUISE_MAX) + + self.prev_speed_limit_state = self.speed_limit_state + self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph + + def update_speed_limit_assist_v_cruise_op_long(self) -> None: + if not self.CP.openpilotLongitudinalControl or not self.set_speed_to_limit: + return + + if self.speed_limit_state == SpeedLimitAssistState.disabled: + self.prev_speed_limit_state = self.speed_limit_state + self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph + return + + if not self.has_speed_limit or self.speed_limit_final_last_kph <= 0: + self.prev_speed_limit_state = self.speed_limit_state + self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph + return + + target_kph = float(np.clip(round(self.speed_limit_final_last_kph, 1), self.v_cruise_min, V_CRUISE_MAX)) + # OP Long uses planner min(v_cruise, slc target) to enforce limits. + # Do not clamp the user's max (v_cruise) here, or they cannot raise/lower it. + # Only sync on initial activation or when the resolved limit changes. + if (self.v_cruise_kph == V_CRUISE_UNSET and self.speed_limit_state in SPEED_LIMIT_CONTROL_ACTIVE_STATES) or \ + self.update_speed_limit_final_last_changed: + self.v_cruise_kph = target_kph + self.v_cruise_cluster_kph = target_kph + + self.prev_speed_limit_state = self.speed_limit_state + self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph + + + +# WARNING: this value was determined based on the model's training distribution, +# model predictions above this speed can be unpredictable +# V_CRUISE's are in kph +V_CRUISE_MIN = 8 +V_CRUISE_MAX = 200 # ~ 124 mph +V_CRUISE_UNSET = 255 +V_CRUISE_INITIAL = 40 +V_CRUISE_INITIAL_EXPERIMENTAL_MODE = 105 +IMPERIAL_INCREMENT = round(CV.MPH_TO_KPH, 1) # round here to avoid rounding errors incrementing set speed + +ButtonEvent = car.CarState.ButtonEvent +ButtonType = car.CarState.ButtonEvent.Type +CRUISE_LONG_PRESS = 50 +CRUISE_NEAREST_FUNC = { + ButtonType.accelCruise: math.ceil, + ButtonType.decelCruise: math.floor, +} +CRUISE_INTERVAL_SIGN = { + ButtonType.accelCruise: +1, + ButtonType.decelCruise: -1, +} + + +class VCruiseHelper(VCruiseHelperIQ): + def __init__(self, CP, CP_IQ): + VCruiseHelperIQ.__init__(self, CP, CP_IQ) + self.CP = CP + self.v_cruise_kph = V_CRUISE_UNSET + self.v_cruise_cluster_kph = V_CRUISE_UNSET + self.v_cruise_kph_last = 0 + self.button_timers = {ButtonType.decelCruise: 0, ButtonType.accelCruise: 0} + self.button_change_states = {btn: {"standstill": False, "enabled": False} for btn in self.button_timers} + self.slc_set_speed_request_id = 0 + self.slc_set_speed_gesture_id = 0 + self.slc_set_speed_request_kph = 0.0 + self._slc_accel_held = False + self._slc_accel_release_frames = 0 + self._slc_pcm_speed_last = None + + def _update_slc_accel_gesture(self, CS): + self._slc_accel_release_frames = max(0, self._slc_accel_release_frames - 1) + for button in CS.buttonEvents: + if button.type in (ButtonType.accelCruise, ButtonType.resumeCruise): + if button.pressed: + self.slc_set_speed_gesture_id = (self.slc_set_speed_gesture_id + 1) % (1 << 32) + self._slc_accel_release_frames = 0 + else: + self._slc_accel_release_frames = int(0.5 / DT_CTRL) + self._slc_accel_held = button.pressed + elif button.pressed: + self._slc_accel_held = False + self._slc_accel_release_frames = 0 + if not CS.cruiseState.available: + self._slc_accel_held = False + self._slc_accel_release_frames = 0 + + def _record_slc_set_speed_increase(self, previous_kph, enabled): + if enabled and (self._slc_accel_held or self._slc_accel_release_frames > 0) and \ + previous_kph is not None and 0 < previous_kph < self.v_cruise_kph <= V_CRUISE_MAX: + self.slc_set_speed_request_id = (self.slc_set_speed_request_id + 1) % (1 << 32) + self.slc_set_speed_request_kph = float(self.v_cruise_kph) + + @property + def v_cruise_initialized(self): + return self.v_cruise_kph != V_CRUISE_UNSET + + @property + def volkswagen_standby_set_speed(self) -> bool: + return self.CP.brand == "volkswagen" and self.CP.openpilotLongitudinalControl and not self.CP.pcmCruise + + def update_v_cruise(self, CS, enabled, is_metric): + self.v_cruise_kph_last = self.v_cruise_kph + self._update_slc_accel_gesture(CS) + + self.get_minimum_set_speed(is_metric) + + if CS.cruiseState.available: + _enabled = self.update_enabled_state(CS, enabled) + if not self.CP.pcmCruise or (not self.CP_IQ.pcmCruiseSpeed and _enabled): + # if stock cruise is completely disabled, then we can use our own set speed logic + self._update_v_cruise_non_pcm(CS, _enabled, is_metric, self.volkswagen_standby_set_speed) + self._record_slc_set_speed_increase(self.v_cruise_kph_last, _enabled) + self.update_speed_limit_assist_v_cruise_non_pcm() + self.v_cruise_cluster_kph = self.v_cruise_kph + self.update_button_timers(CS, enabled) + else: + self.v_cruise_kph = CS.cruiseState.speed * CV.MS_TO_KPH + self.v_cruise_cluster_kph = CS.cruiseState.speedCluster * CV.MS_TO_KPH + self._record_slc_set_speed_increase(self._slc_pcm_speed_last, _enabled) + self._slc_pcm_speed_last = self.v_cruise_kph + if CS.cruiseState.speed == 0: + self.v_cruise_kph = V_CRUISE_UNSET + self.v_cruise_cluster_kph = V_CRUISE_UNSET + elif CS.cruiseState.speed == -1: + self.v_cruise_kph = -1 + self.v_cruise_cluster_kph = -1 + else: + self.update_speed_limit_assist_v_cruise_op_long() + else: + self.v_cruise_kph = V_CRUISE_UNSET + self.v_cruise_cluster_kph = V_CRUISE_UNSET + self._slc_pcm_speed_last = None + + def _update_v_cruise_non_pcm(self, CS, enabled, is_metric, allow_standby_adjustment=False): + # handle button presses. TODO: this should be in state_control, but a decelCruise press + # would have the effect of both enabling and changing speed is checked after the state transition + if not enabled and not allow_standby_adjustment: + return + + long_press = False + button_type = None + + v_cruise_delta = 1. if is_metric else IMPERIAL_INCREMENT + + for b in CS.buttonEvents: + if b.type.raw in self.button_timers and not b.pressed: + if self.button_timers[b.type.raw] > CRUISE_LONG_PRESS: + return # end long press + button_type = b.type.raw + break + else: + for k, timer in self.button_timers.items(): + if timer and timer % CRUISE_LONG_PRESS == 0: + button_type = k + long_press = True + break + + if button_type is None: + return + + # Don't adjust speed when pressing resume to exit standstill + cruise_standstill = self.button_change_states[button_type]["standstill"] or CS.cruiseState.standstill + if button_type == ButtonType.accelCruise and cruise_standstill: + return + + # Don't adjust speed if we've enabled since the button was depressed (some ports enable on rising edge) + if enabled and not self.button_change_states[button_type]["enabled"]: + return + + long_press, v_cruise_delta = VCruiseHelperIQ.update_v_cruise_delta(self, long_press, v_cruise_delta) + if long_press and self.v_cruise_kph % v_cruise_delta != 0: # partial interval + self.v_cruise_kph = CRUISE_NEAREST_FUNC[button_type](self.v_cruise_kph / v_cruise_delta) * v_cruise_delta + else: + self.v_cruise_kph += v_cruise_delta * CRUISE_INTERVAL_SIGN[button_type] + + # If set is pressed while overriding, clip cruise speed to minimum of vEgo + if enabled and CS.gasPressed and button_type in (ButtonType.decelCruise, ButtonType.setCruise): + self.v_cruise_kph = max(self.v_cruise_kph, CS.vEgo * CV.MS_TO_KPH) + + self.v_cruise_kph = np.clip(round(self.v_cruise_kph, 1), self.v_cruise_min, V_CRUISE_MAX) + + def update_button_timers(self, CS, enabled): + # increment timer for buttons still pressed + for k in self.button_timers: + if self.button_timers[k] > 0: + self.button_timers[k] += 1 + + for b in CS.buttonEvents: + if b.type.raw in self.button_timers: + # Start/end timer and store current state on change of button pressed + self.button_timers[b.type.raw] = 1 if b.pressed else 0 + self.button_change_states[b.type.raw] = {"standstill": CS.cruiseState.standstill, "enabled": enabled} + + def initialize_v_cruise(self, CS, experimental_mode: bool, iq_dynamic_mode: bool) -> None: + # initializing is handled by the PCM + if self.CP.pcmCruise or self.v_cruise_initialized: + return + + initial_experimental_mode = experimental_mode and not iq_dynamic_mode + initial = V_CRUISE_INITIAL_EXPERIMENTAL_MODE if initial_experimental_mode else V_CRUISE_INITIAL + if initial_experimental_mode: + initial = self.get_iq_mode_initial_set_speed_kph(CS.vEgo * CV.MS_TO_KPH, initial) + + if any(b.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for b in CS.buttonEvents) and self.v_cruise_initialized: + self.v_cruise_kph = self.v_cruise_kph_last + else: + self.v_cruise_kph = int(round(np.clip(CS.vEgo * CV.MS_TO_KPH, initial, V_CRUISE_MAX))) + + self.v_cruise_cluster_kph = self.v_cruise_kph diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/car/long_increments.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/car/long_increments.py new file mode 100644 index 000000000..04772ff70 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/car/long_increments.py @@ -0,0 +1,58 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from dataclasses import dataclass + +from iqpilot.common.params import Params + +# Cruise set-speed step (in the caller's working unit, kph or the imperial increment) +# a user is allowed to dial in for the accel/decel cruise buttons. +MIN_BUTTON_STEP = 1 +MAX_BUTTON_STEP = 10 + +# Once the resolved step reaches this size, we snap the set speed to the nearest +# multiple of the step (e.g. a step of 5 lands on 45/50/55...) instead of just +# adding it on top of whatever odd number the set speed currently sits at. +SNAP_TO_GRID_THRESHOLD = 5 + +# Stock behavior (feature disabled): tap moves by one unit, a held button moves +# five times faster. This mirrors what every other unmodified button-input car +# already does, so it's kept as the fallback rather than living in this module. +STOCK_HOLD_MULTIPLIER = 5 + + +@dataclass(frozen=True) +class LongIncrementConfig: + enabled: bool + tap_step: int + hold_step: int + + +def _clamp_step(value) -> int: + try: + step = int(value) + except (TypeError, ValueError): + return MIN_BUTTON_STEP + return min(max(step, MIN_BUTTON_STEP), MAX_BUTTON_STEP) + + +def read_long_increment_config(params: Params) -> LongIncrementConfig: + return LongIncrementConfig( + enabled=params.get_bool("LongIncrementsEnabled"), + tap_step=_clamp_step(params.get("LongIncrementTapStep", return_default=True)), + hold_step=_clamp_step(params.get("LongIncrementHoldStep", return_default=True)), + ) + + +def resolve_button_step(config: LongIncrementConfig, held: bool, unit_step: float) -> tuple[bool, float]: + """ + Turn a single tap/hold cruise button event into a (snap_to_grid, delta) pair, + where delta is expressed in the same unit as unit_step (kph, or the mph-derived + increment used for imperial cars). + """ + if not config.enabled: + return held, unit_step * (STOCK_HOLD_MULTIPLIER if held else 1) + + multiplier = config.hold_step if held else config.tap_step + snap_to_grid = multiplier >= SNAP_TO_GRID_THRESHOLD + return snap_to_grid, unit_step * multiplier diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py new file mode 100644 index 000000000..5b73c0115 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/selfdrive/iqmodeld/config.py @@ -0,0 +1,133 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + + +def index_function(index: int, max_val: float = 192, max_idx: int = 32) -> float: + return max_val * ((index / max_idx) ** 2) + + +def _quadratic_series(limit: float, steps: int) -> list[float]: + return [index_function(index, max_val=limit, max_idx=steps - 1) for index in range(steps)] + + +def _probability_window(*values: float) -> np.ndarray: + return np.asarray(values, dtype=np.float32) + + +def _field_group(start: int, stop: int, stride: int) -> slice: + return slice(start, stop, stride) + + +_IDX_COUNT = 33 +_T_AXIS = _quadratic_series(10.0, _IDX_COUNT) +_X_AXIS = _quadratic_series(192.0, _IDX_COUNT) + + +class ModelConstants: + IDX_N = _IDX_COUNT + T_IDXS = _T_AXIS + X_IDXS = _X_AXIS + LEAD_T_IDXS = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0] + LEAD_T_OFFSETS = [0.0, 2.0, 4.0] + META_T_IDXS = [2.0, 4.0, 6.0, 8.0, 10.0] + + MODEL_FREQ = 20 + FEATURE_LEN = 512 + FULL_HISTORY_BUFFER_LEN = 99 + HISTORY_BUFFER_LEN = FULL_HISTORY_BUFFER_LEN + DESIRE_LEN = 8 + TRAFFIC_CONVENTION_LEN = 2 + NAV_FEATURE_LEN = 256 + NAV_INSTRUCTION_LEN = 150 + LAT_PLANNER_STATE_LEN = 4 + LATERAL_CONTROL_PARAMS_LEN = 2 + PREV_DESIRED_CURV_LEN = 1 + + FCW_THRESHOLDS_5MS2 = _probability_window(0.05, 0.05, 0.15, 0.15, 0.15) + FCW_THRESHOLDS_3MS2 = _probability_window(0.7, 0.7) + FCW_5MS2_PROBS_WIDTH = 5 + FCW_3MS2_PROBS_WIDTH = 2 + + DISENGAGE_WIDTH = 5 + POSE_WIDTH = 6 + WIDE_FROM_DEVICE_WIDTH = 3 + SIM_POSE_WIDTH = 6 + LEAD_WIDTH = 4 + LANE_LINES_WIDTH = 2 + ROAD_EDGES_WIDTH = 2 + PLAN_WIDTH = 15 + DESIRE_PRED_WIDTH = 8 + LAT_PLANNER_SOLUTION_WIDTH = 4 + DESIRED_CURV_WIDTH = 1 + + NUM_LANE_LINES = 4 + NUM_ROAD_EDGES = 2 + LEAD_TRAJ_LEN = 6 + DESIRE_PRED_LEN = 4 + + PLAN_MHP_N = 5 + LEAD_MHP_N = 2 + PLAN_MHP_SELECTION = 1 + LEAD_MHP_SELECTION = 3 + + FCW_THRESHOLD_5MS2_HIGH = 0.15 + FCW_THRESHOLD_5MS2_LOW = 0.05 + FCW_THRESHOLD_3MS2 = 0.7 + + CONFIDENCE_BUFFER_LEN = 5 + RYG_GREEN = 0.01165 + RYG_YELLOW = 0.06157 + POLY_PATH_DEGREE = 4 + + +class Plan: + POSITION = slice(0, 3) + VELOCITY = slice(3, 6) + ACCELERATION = slice(6, 9) + T_FROM_CURRENT_EULER = slice(9, 12) + ORIENTATION_RATE = slice(12, 15) + + +class Meta: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 31, 6) + BRAKE_DISENGAGE = _field_group(2, 31, 6) + STEER_OVERRIDE = _field_group(3, 31, 6) + HARD_BRAKE_3 = _field_group(4, 31, 6) + HARD_BRAKE_4 = _field_group(5, 31, 6) + HARD_BRAKE_5 = _field_group(6, 31, 6) + GAS_PRESS = _field_group(31, 55, 4) + BRAKE_PRESS = _field_group(32, 55, 4) + LEFT_BLINKER = _field_group(33, 55, 4) + RIGHT_BLINKER = _field_group(34, 55, 4) + + +class MetaTombRaider: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 41, 8) + BRAKE_DISENGAGE = _field_group(2, 41, 8) + STEER_OVERRIDE = _field_group(3, 41, 8) + HARD_BRAKE_3 = _field_group(4, 41, 8) + HARD_BRAKE_4 = _field_group(5, 41, 8) + HARD_BRAKE_5 = _field_group(6, 41, 8) + GAS_PRESS = _field_group(7, 41, 8) + BRAKE_PRESS = _field_group(8, 41, 8) + LEFT_BLINKER = _field_group(41, 53, 2) + RIGHT_BLINKER = _field_group(42, 53, 2) + + +class MetaSimPose: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 36, 7) + BRAKE_DISENGAGE = _field_group(2, 36, 7) + STEER_OVERRIDE = _field_group(3, 36, 7) + HARD_BRAKE_3 = _field_group(4, 36, 7) + HARD_BRAKE_4 = _field_group(5, 36, 7) + HARD_BRAKE_5 = _field_group(6, 36, 7) + GAS_PRESS = _field_group(7, 36, 7) + LEFT_BLINKER = _field_group(36, 48, 2) + RIGHT_BLINKER = _field_group(37, 48, 2) diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py new file mode 100644 index 000000000..1338aa2cf --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/__init__.py @@ -0,0 +1,22 @@ +import os +from typing import cast + +from iqpilot.system.hardware.base import HardwareBase +from iqpilot.system.hardware.tici.hardware import Tici +from iqpilot.system.hardware.pc.hardware import Pc + +TICI = os.path.isfile('/TICI') +AGNOS = os.path.isfile('/AGNOS') +PC = not TICI + + +if TICI: + HARDWARE = cast(HardwareBase, Tici()) +else: + HARDWARE = cast(HardwareBase, Pc()) + +# Only comma 3/3X expose the DMA-BUF EGL extensions used by the zero-copy +# camera renderer and the direct EGL frame-pacing calls. /TICI is also present +# on comma 4, so it identifies the AGNOS hardware family rather than this GPU +# capability. +EGL_DMA_BUF_SUPPORTED = TICI and HARDWARE.get_device_type() in ("tici", "tizi") diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/base.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/base.py new file mode 100644 index 000000000..217696e09 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/base.py @@ -0,0 +1,228 @@ +import os +from abc import abstractmethod, ABC +from dataclasses import dataclass, fields + +from iqpilot.cereal import log + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +class LPAError(RuntimeError): + pass + +class LPAProfileNotFoundError(LPAError): + pass + +@dataclass +class Profile: + iccid: str + nickname: str + enabled: bool + provider: str + +@dataclass +class ThermalZone: + # a zone from /sys/class/thermal/thermal_zone* + name: str # a.k.a type + scale: float = 1000. # scale to get degrees in C + zone_number = -1 + + def read(self) -> float: + if self.zone_number < 0: + for n in os.listdir("/sys/devices/virtual/thermal"): + if not n.startswith("thermal_zone"): + continue + with open(os.path.join("/sys/devices/virtual/thermal", n, "type")) as f: + if f.read().strip() == self.name: + self.zone_number = int(n.removeprefix("thermal_zone")) + break + + try: + with open(f"/sys/devices/virtual/thermal/thermal_zone{self.zone_number}/temp") as f: + return int(f.read()) / self.scale + except FileNotFoundError: + return 0 + +@dataclass +class ThermalConfig: + cpu: list[ThermalZone] | None = None + gpu: list[ThermalZone] | None = None + dsp: ThermalZone | None = None + pmic: list[ThermalZone] | None = None + memory: ThermalZone | None = None + intake: ThermalZone | None = None + exhaust: ThermalZone | None = None + case: ThermalZone | None = None + + def get_msg(self): + ret = {} + for f in fields(ThermalConfig): + v = getattr(self, f.name) + if v is not None: + if isinstance(v, list): + ret[f.name + "TempC"] = [x.read() for x in v] + else: + ret[f.name + "TempC"] = v.read() + return ret + +class LPABase(ABC): + @abstractmethod + def list_profiles(self) -> list[Profile]: + pass + + @abstractmethod + def get_active_profile(self) -> Profile | None: + pass + + @abstractmethod + def delete_profile(self, iccid: str) -> None: + pass + + @abstractmethod + def bootstrap(self) -> None: + pass + + @abstractmethod + def download_profile(self, qr: str, nickname: str | None = None) -> None: + pass + + @abstractmethod + def nickname_profile(self, iccid: str, nickname: str) -> None: + pass + + @abstractmethod + def switch_profile(self, iccid: str) -> None: + pass + + def is_comma_profile(self, iccid: str) -> bool: + return any(iccid.startswith(prefix) for prefix in ('8985235',)) + +class HardwareBase(ABC): + @staticmethod + def get_cmdline() -> dict[str, str]: + with open('/proc/cmdline') as f: + cmdline = f.read() + return {kv[0]: kv[1] for kv in [s.split('=') for s in cmdline.split(' ')] if len(kv) == 2} + + @staticmethod + def read_param_file(path, parser, default=0): + try: + with open(path) as f: + return parser(f.read()) + except Exception: + return default + + def booted(self) -> bool: + return True + + def reboot(self, reason=None): + print("REBOOT!") + + def uninstall(self): + print("uninstall") + + def get_os_version(self): + return None + + @abstractmethod + def get_device_type(self): + pass + + def get_imei(self, slot) -> str: + return "" + + def get_serial(self): + return "" + + def get_network_info(self): + return None + + def get_network_type(self): + return NetworkType.none + + def get_sim_info(self): + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + + def get_sim_lpa(self) -> LPABase: + raise NotImplementedError("SIM LPA not available") + + def get_network_strength(self, network_type): + return NetworkStrength.unknown + + def get_network_metered(self, network_type) -> bool: + return network_type not in (NetworkType.none, NetworkType.wifi, NetworkType.ethernet) + + def get_current_power_draw(self): + return 0 + + def get_som_power_draw(self): + return 0 + + def shutdown(self): + print("SHUTDOWN!") + + def get_thermal_config(self): + return ThermalConfig() + + def set_display_power(self, on: bool): + pass + + def set_screen_brightness(self, percentage): + pass + + def get_screen_brightness(self): + return 0 + + def set_power_save(self, powersave_enabled): + pass + + def get_gpu_usage_percent(self): + return 0 + + def get_modem_version(self): + return None + + def get_modem_temperatures(self): + return [] + + def initialize_hardware(self): + pass + + def configure_modem(self): + pass + + def reboot_modem(self): + pass + + def recover_sim_detection(self) -> bool: + return False + + def get_networks(self): + return None + + def has_internal_panda(self) -> bool: + return False + + def reset_internal_panda(self): + pass + + def recover_internal_panda(self): + pass + + def get_modem_data_usage(self): + return -1, -1 + + def get_voltage(self) -> float: + return 0. + + def get_current(self) -> float: + return 0. + + def set_ir_power(self, percent: int): + pass diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/hw.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/hw.py new file mode 100644 index 000000000..7263ddbfc --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/hw.py @@ -0,0 +1,137 @@ +import os +import platform +from pathlib import Path + +from iqpilot.system.hardware import PC + +DEFAULT_DOWNLOAD_CACHE_ROOT = "/tmp/comma_download_cache" + +class Paths: + _persist_root_cache: str | None = None + + @staticmethod + def _is_writable_persist_root(path: str) -> bool: + try: + os.makedirs(path, exist_ok=True) + comma_dir = os.path.join(path, "comma") + os.makedirs(comma_dir, exist_ok=True) + + probe_path = os.path.join(comma_dir, ".rw_probe") + with open(probe_path, "w") as f: + f.write("1") + os.remove(probe_path) + return True + except OSError: + return False + + @staticmethod + def comma_home() -> str: + return os.path.join(str(Path.home()), ".comma" + os.environ.get("OPENPILOT_PREFIX", "")) + + @staticmethod + def params() -> str: + if os.environ.get("PARAMS_ROOT"): + return os.environ["PARAMS_ROOT"] + return os.path.join(Paths.comma_home(), "params") if PC else "/data/params" + + @staticmethod + def log_root() -> str: + if os.environ.get('LOG_ROOT', False): + return os.environ['LOG_ROOT'] + elif PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "realdata") + else: + return '/data/media/0/realdata/' + + @staticmethod + def log_root_external() -> str: + return '/mnt/external_realdata/' + + @staticmethod + def swaglog_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "log") + else: + return "/data/log/" + + @staticmethod + def swaglog_ipc() -> str: + return "ipc:///tmp/logmessage" + os.environ.get("OPENPILOT_PREFIX", "") + + @staticmethod + def download_cache_root() -> str: + if os.environ.get('COMMA_CACHE', False): + return os.environ['COMMA_CACHE'] + "/" + return DEFAULT_DOWNLOAD_CACHE_ROOT + os.environ.get("OPENPILOT_PREFIX", "") + "/" + + @staticmethod + def persist_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "persist") + + if Paths._persist_root_cache is not None: + return Paths._persist_root_cache + + for candidate in ("/persist", "/data/persist"): + if Paths._is_writable_persist_root(candidate): + Paths._persist_root_cache = candidate + return candidate + + # Keep previous behavior as a last resort. + Paths._persist_root_cache = "/persist" + return Paths._persist_root_cache + + @staticmethod + def stats_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats/" + + @staticmethod + def stats_iq_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats_iq/" + + @staticmethod + def config_root() -> str: + if PC: + return Paths.comma_home() + else: + return "/tmp/.comma" + + @staticmethod + def shm_path() -> str: + if PC and platform.system() == "Darwin": + return "/tmp" # This is not really shared memory on macOS, but it's the closest we can get + return "/dev/shm" + + @staticmethod + def model_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "models") + else: + return "/data/media/0/models" + + @staticmethod + def crash_log_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "community" / "crashes") + else: + return "/data/community/crashes" + + @staticmethod + def mapd_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "osm") + else: + return "/data/media/0/osm" + + @staticmethod + def screen_recordings_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "screen_recordings") + else: + return "/data/media/0/screen_recordings" diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/pc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py new file mode 100644 index 000000000..72ef2f235 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/pc/hardware.py @@ -0,0 +1,12 @@ +from iqpilot.cereal import log +from iqpilot.system.hardware.base import HardwareBase + +NetworkType = log.DeviceState.NetworkType + + +class Pc(HardwareBase): + def get_device_type(self): + return "pc" + + def get_network_type(self): + return NetworkType.wifi diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py new file mode 100644 index 000000000..48a34ea48 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/amplifier.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +import time +from collections import namedtuple + +from iqpilot.common.i2c import SMBus + +# https://datasheets.maximintegrated.com/en/ds/MAX98089.pdf + +AmpConfig = namedtuple('AmpConfig', ['name', 'value', 'register', 'offset', 'mask']) +EQParams = namedtuple('EQParams', ['K', 'k1', 'k2', 'c1', 'c2']) + + +def configs_from_eq_params(base, eq_params): + return [ + AmpConfig("K (high)", (eq_params.K >> 8), base, 0, 0xFF), + AmpConfig("K (low)", (eq_params.K & 0xFF), base + 1, 0, 0xFF), + AmpConfig("k1 (high)", (eq_params.k1 >> 8), base + 2, 0, 0xFF), + AmpConfig("k1 (low)", (eq_params.k1 & 0xFF), base + 3, 0, 0xFF), + AmpConfig("k2 (high)", (eq_params.k2 >> 8), base + 4, 0, 0xFF), + AmpConfig("k2 (low)", (eq_params.k2 & 0xFF), base + 5, 0, 0xFF), + AmpConfig("c1 (high)", (eq_params.c1 >> 8), base + 6, 0, 0xFF), + AmpConfig("c1 (low)", (eq_params.c1 & 0xFF), base + 7, 0, 0xFF), + AmpConfig("c2 (high)", (eq_params.c2 >> 8), base + 8, 0, 0xFF), + AmpConfig("c2 (low)", (eq_params.c2 & 0xFF), base + 9, 0, 0xFF), + ] + + +BASE_CONFIG = [ + AmpConfig("MCLK prescaler", 0b01, 0x10, 4, 0b00110000), + AmpConfig("PM: enable speakers", 0b11, 0x4D, 4, 0b00110000), + AmpConfig("PM: enable DACs", 0b11, 0x4D, 0, 0b00000011), + AmpConfig("Enable PLL1", 0b1, 0x12, 7, 0b10000000), + AmpConfig("Enable PLL2", 0b1, 0x1A, 7, 0b10000000), + AmpConfig("DAI1: I2S mode", 0b00100, 0x14, 2, 0b01111100), + AmpConfig("DAI2: I2S mode", 0b00100, 0x1C, 2, 0b01111100), + AmpConfig("DAI1 Passband filtering: music mode", 0b1, 0x18, 7, 0b10000000), + AmpConfig("DAI1 voice mode gain (DV1G)", 0b00, 0x2F, 4, 0b00110000), + AmpConfig("DAI1 attenuation (DV1)", 0x0, 0x2F, 0, 0b00001111), + AmpConfig("DAI2 attenuation (DV2)", 0x0, 0x31, 0, 0b00001111), + AmpConfig("DAI2: DC blocking", 0b1, 0x20, 0, 0b00000001), + AmpConfig("DAI2: High sample rate", 0b0, 0x20, 3, 0b00001000), + AmpConfig("ALC enable", 0b1, 0x43, 7, 0b10000000), + AmpConfig("ALC/excursion limiter release time", 0b101, 0x43, 4, 0b01110000), + AmpConfig("ALC multiband enable", 0b1, 0x43, 3, 0b00001000), + AmpConfig("DAI1 EQ enable", 0b0, 0x49, 0, 0b00000001), + AmpConfig("DAI2 EQ clip detection disabled", 0b1, 0x32, 4, 0b00010000), + AmpConfig("DAI2 EQ attenuation", 0x5, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b100, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter lower corner freq", 0b00, 0x41, 0, 0b00000011), + AmpConfig("Excursion limiter threshold", 0b000, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x6, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b0, 0x46, 0, 0b00000001), + AmpConfig("Right DAC input mixer: DAI1 left", 0b0, 0x22, 3, 0b00001000), + AmpConfig("Right DAC input mixer: DAI1 right", 0b0, 0x22, 2, 0b00000100), + AmpConfig("Right DAC input mixer: DAI2 left", 0b1, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b0, 0x22, 0, 0b00000001), + AmpConfig("DAI1 audio port selector", 0b10, 0x16, 6, 0b11000000), + AmpConfig("DAI2 audio port selector", 0b01, 0x1E, 6, 0b11000000), + AmpConfig("Enable left digital microphone", 0b1, 0x48, 5, 0b00100000), + AmpConfig("Enable right digital microphone", 0b1, 0x48, 4, 0b00010000), + AmpConfig("Enhanced volume smoothing disabled", 0b0, 0x49, 7, 0b10000000), + AmpConfig("Volume adjustment smoothing disabled", 0b0, 0x49, 6, 0b01000000), + AmpConfig("Zero-crossing detection disabled", 0b0, 0x49, 5, 0b00100000), +] + +CONFIGS = { + "tici": [ + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Right speaker output volume", 0x1c, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b1, 0x49, 1, 0b00000010), + *configs_from_eq_params(0x84, EQParams(0x274F, 0xC0FF, 0x3BF9, 0x0B3C, 0x1656)), + *configs_from_eq_params(0x8E, EQParams(0x1009, 0xC6BF, 0x2952, 0x1C97, 0x30DF)), + *configs_from_eq_params(0x98, EQParams(0x0F75, 0xCBE5, 0x0ED2, 0x2528, 0x3E42)), + *configs_from_eq_params(0xA2, EQParams(0x091F, 0x3D4C, 0xCE11, 0x1266, 0x2807)), + *configs_from_eq_params(0xAC, EQParams(0x0A9E, 0x3F20, 0xE573, 0x0A8B, 0x3A3B)), + ], + "tizi": [ + AmpConfig("Left speaker output from left DAC", 0b1, 0x2B, 0, 0b11111111), + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Left Speaker Mixer Gain", 0b00, 0x2D, 0, 0b00000011), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Left speaker output volume", 0x17, 0x3D, 0, 0b00011111), + AmpConfig("Right speaker output volume", 0x17, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b0, 0x49, 1, 0b00000010), + AmpConfig("DAI2: DC blocking", 0b0, 0x20, 0, 0b00000001), + AmpConfig("ALC enable", 0b0, 0x43, 7, 0b10000000), + AmpConfig("DAI2 EQ attenuation", 0x2, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b001, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter threshold", 0b100, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x0, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b1, 0x46, 0, 0b00000001), + AmpConfig("Left DAC input mixer: DAI1 left", 0b0, 0x22, 7, 0b10000000), + AmpConfig("Left DAC input mixer: DAI1 right", 0b0, 0x22, 6, 0b01000000), + AmpConfig("Left DAC input mixer: DAI2 left", 0b1, 0x22, 5, 0b00100000), + AmpConfig("Left DAC input mixer: DAI2 right", 0b0, 0x22, 4, 0b00010000), + AmpConfig("Right DAC input mixer: DAI2 left", 0b0, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b1, 0x22, 0, 0b00000001), + AmpConfig("Volume adjustment smoothing disabled", 0b1, 0x49, 6, 0b01000000), + ], +} + + +class Amplifier: + AMP_I2C_BUS = 0 + AMP_ADDRESS = 0x10 + + def __init__(self, debug=False): + self.debug = debug + + def _get_shutdown_config(self, amp_disabled: bool) -> AmpConfig: + return AmpConfig("Global shutdown", 0b0 if amp_disabled else 0b1, 0x51, 7, 0b10000000) + + def _set_configs(self, configs: list[AmpConfig]) -> None: + with SMBus(self.AMP_I2C_BUS) as bus: + for config in configs: + if self.debug: + print(f"Setting \"{config.name}\" to {config.value}:") + + old_value = bus.read_byte_data(self.AMP_ADDRESS, config.register, force=True) + new_value = (old_value & (~config.mask)) | ((config.value << config.offset) & config.mask) + bus.write_byte_data(self.AMP_ADDRESS, config.register, new_value, force=True) + + if self.debug: + print(f" Changed {hex(config.register)}: {hex(old_value)} -> {hex(new_value)}") + + def set_configs(self, configs: list[AmpConfig]) -> bool: + tries = 15 + backoff = 0. + for i in range(tries): + try: + self._set_configs(configs) + return True + except OSError: + backoff += 0.1 + time.sleep(backoff) + print(f"Failed to set amp config, {tries - i - 1} retries left") + return False + + def set_global_shutdown(self, amp_disabled: bool) -> bool: + return self.set_configs([self._get_shutdown_config(amp_disabled), ]) + + def initialize_configuration(self, model: str) -> bool: + cfgs = [ + self._get_shutdown_config(True), + *BASE_CONFIG, + *CONFIGS[model], + self._get_shutdown_config(False), + ] + return self.set_configs(cfgs) + + +if __name__ == "__main__": + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + model = model.split('comma ')[-1] + + amp = Amplifier() + amp.initialize_configuration(model) diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py new file mode 100644 index 000000000..b9fa7fbff --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/hardware.py @@ -0,0 +1,740 @@ +import math +import os +import sys +import subprocess +import time +import tempfile +from enum import IntEnum +from functools import cached_property, lru_cache +from pathlib import Path + +from iqpilot.cereal import log +from iqpilot.common.utils import sudo_read, sudo_write +from iqpilot.common.gpio import gpio_set, gpio_init, get_irqs_for_action +from iqpilot.system.hardware.base import HardwareBase, LPABase, ThermalConfig, ThermalZone +from iqpilot.system.hardware.tici import iwlist +from iqpilot.system.hardware.tici.lpa import TiciLPA +from iqpilot.system.hardware.tici.pins import GPIO +from iqpilot.system.hardware.tici.amplifier import Amplifier + +NM = 'org.freedesktop.NetworkManager' +NM_CON_ACT = NM + '.Connection.Active' +NM_DEV = NM + '.Device' +NM_DEV_WL = NM + '.Device.Wireless' +NM_DEV_STATS = NM + '.Device.Statistics' +NM_AP = NM + '.AccessPoint' +DBUS_PROPS = 'org.freedesktop.DBus.Properties' + +MM = 'org.freedesktop.ModemManager1' +MM_MODEM = MM + ".Modem" +MM_MODEM_SIMPLE = MM + ".Modem.Simple" +MM_SIM = MM + ".Sim" + +class MM_MODEM_STATE(IntEnum): + FAILED = -1 + UNKNOWN = 0 + INITIALIZING = 1 + LOCKED = 2 + DISABLED = 3 + DISABLING = 4 + ENABLING = 5 + ENABLED = 6 + SEARCHING = 7 + REGISTERED = 8 + DISCONNECTING = 9 + CONNECTING = 10 + CONNECTED = 11 + +class NMActiveConnectionState(IntEnum): + UNKNOWN = 0 + ACTIVATING = 1 + ACTIVATED = 2 + DEACTIVATING = 3 + DEACTIVATED = 4 + +class NMMetered(IntEnum): + NM_METERED_UNKNOWN = 0 + NM_METERED_YES = 1 + NM_METERED_NO = 2 + NM_METERED_GUESS_YES = 3 + NM_METERED_GUESS_NO = 4 + +TIMEOUT = 0.1 +REFRESH_RATE_MS = 1000 + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +# https://developer.gnome.org/ModemManager/unstable/ModemManager-Flags-and-Enumerations.html#MMModemAccessTechnology +MM_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5 +MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14 + +# MMModemStateFailedReason +MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2 + + +def affine_irq(val, action): + irqs = get_irqs_for_action(action) + if len(irqs) == 0: + return + + for i in irqs: + sudo_write(str(val), f"/proc/irq/{i}/smp_affinity_list") + +@lru_cache +def get_device_type(): + # lru_cache and cache can cause memory leaks when used in classes + try: + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + except FileNotFoundError: + # off-device (e.g. the prebuilt build container fakes /TICI but has no + # devicetree); import must not crash. Not a real device type. + return "unknown" + return model.split('comma ')[-1] + +class Tici(HardwareBase): + @staticmethod + def _ensure_system_python_path() -> None: + system_site = "/usr/lib/python3/dist-packages" + if system_site not in sys.path and os.path.isdir(system_site): + sys.path.append(system_site) + + @staticmethod + def _run_direct_modem_command(command: str) -> None: + import serial + + last_error: Exception | None = None + for device in ("/dev/ttyUSB2", "/dev/ttyUSB3"): + if not os.path.exists(device): + continue + + try: + with serial.Serial(device, baudrate=9600, timeout=2) as modem: + modem.reset_input_buffer() + modem.write((command + "\r").encode("ascii")) + + deadline = time.monotonic() + 3.0 + while time.monotonic() < deadline: + line = modem.readline().decode(errors="ignore").strip() + if not line: + continue + if line == "OK": + return + if line == "ERROR" or "ERROR" in line: + raise RuntimeError(f"{device}: {line}") + raise TimeoutError(f"{device}: timed out waiting for modem response") + except Exception as e: + last_error = e + + if last_error is not None: + raise last_error + raise RuntimeError("No modem AT port available") + + @cached_property + def bus(self): + try: + import dbus + except ModuleNotFoundError: + self._ensure_system_python_path() + import dbus + return dbus.SystemBus() + + @cached_property + def nm(self): + return self.bus.get_object(NM, '/org/freedesktop/NetworkManager') + + @property # this should not be cached, in case the modemmanager restarts + def mm(self): + return self.bus.get_object(MM, '/org/freedesktop/ModemManager1') + + @cached_property + def amplifier(self): + if self.get_device_type() == "mici": + return None + if os.path.exists('/tmp/lite_hw') or os.environ.get('LITE') == '1': + return None + return Amplifier() + + def get_os_version(self): + with open("/VERSION") as f: + return f.read().strip() + + def get_device_type(self): + return get_device_type() + + def reboot(self, reason=None): + subprocess.check_output(["sudo", "reboot"]) + + def uninstall(self): + Path("/data/__system_reset__").touch() + os.sync() + self.reboot() + + def get_serial(self): + return self.get_cmdline()['androidboot.serialno'] + + def get_voltage(self): + with open("/sys/class/hwmon/hwmon1/in1_input") as f: + return int(f.read()) + + def get_current(self): + with open("/sys/class/hwmon/hwmon1/curr1_input") as f: + return int(f.read()) + + def set_ir_power(self, percent: int): + if self.get_device_type() in ("tici", "tizi"): + return + + value = int((percent / 100) * 300) + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write("0\n") + with open("/sys/class/leds/led:torch_2/brightness", "w") as f: + f.write(f"{value}\n") + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write(f"{value}\n") + + def get_network_type(self): + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_type = primary_connection.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if primary_type == '802-3-ethernet': + return NetworkType.ethernet + elif primary_type == '802-11-wireless': + return NetworkType.wifi + else: + active_connections = self.nm.Get(NM, 'ActiveConnections', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + for conn in active_connections: + c = self.bus.get_object(NM, conn) + tp = c.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if tp == 'gsm': + modem = self.get_modem() + modem_state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if modem_state < MM_MODEM_STATE.REGISTERED: + return NetworkType.none + access_t = modem.Get(MM_MODEM, 'AccessTechnologies', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if access_t >= MM_MODEM_ACCESS_TECHNOLOGY_LTE: + return NetworkType.cell4G + elif access_t >= MM_MODEM_ACCESS_TECHNOLOGY_UMTS: + return NetworkType.cell3G + else: + return NetworkType.cell2G + except Exception: + pass + + return NetworkType.none + + def get_modem(self): + objects = self.mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=TIMEOUT) + if not objects: + raise RuntimeError("ModemManager returned no modems") + modem_path = next(iter(objects)) + return self.bus.get_object(MM, modem_path) + + def get_wlan(self): + wlan_path = self.nm.GetDeviceByIpIface('wlan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wlan_path) + + def get_wwan(self): + wwan_path = self.nm.GetDeviceByIpIface('wwan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wwan_path) + + def get_sim_info(self): + modem = self.get_modem() + sim_path = modem.Get(MM_MODEM, 'Sim', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if sim_path == "/": + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + else: + sim = self.bus.get_object(MM, sim_path) + return { + 'sim_id': str(sim.Get(MM_SIM, 'SimIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'mcc_mnc': str(sim.Get(MM_SIM, 'OperatorIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'network_type': ["Unknown"], + 'sim_state': ["READY"], + 'data_connected': modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) == MM_MODEM_STATE.CONNECTED, + } + + def get_sim_lpa(self) -> LPABase: + return TiciLPA() + + def get_imei(self, slot): + if slot != 0: + return "" + + return str(self.get_modem().Get(MM_MODEM, 'EquipmentIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + + def get_network_info(self): + if self.get_device_type() == "mici": + return None + try: + modem = self.get_modem() + info = modem.Command("AT+QNWINFO", math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + extra = modem.Command('AT+QENG="servingcell"', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + if info and info.startswith('+QNWINFO: '): + info = info.replace('+QNWINFO: ', '').replace('"', '').split(',') + extra = "" if extra is None else extra.replace('+QENG: "servingcell",', '').replace('"', '') + state = "" if state is None else MM_MODEM_STATE(state).name + + if len(info) != 4: + return None + + technology, operator, band, channel = info + + return({ + 'technology': technology, + 'operator': operator, + 'band': band, + 'channel': int(channel), + 'extra': extra, + 'state': state, + }) + else: + return None + + def parse_strength(self, percentage): + if percentage < 25: + return NetworkStrength.poor + elif percentage < 50: + return NetworkStrength.moderate + elif percentage < 75: + return NetworkStrength.good + else: + return NetworkStrength.great + + def get_network_strength(self, network_type): + network_strength = NetworkStrength.unknown + + try: + if network_type == NetworkType.none: + pass + elif network_type == NetworkType.wifi: + wlan = self.get_wlan() + active_ap_path = wlan.Get(NM_DEV_WL, 'ActiveAccessPoint', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if active_ap_path != "/": + active_ap = self.bus.get_object(NM, active_ap_path) + strength = int(active_ap.Get(NM_AP, 'Strength', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + network_strength = self.parse_strength(strength) + else: # Cellular + modem = self.get_modem() + strength = int(modem.Get(MM_MODEM, 'SignalQuality', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)[0]) + network_strength = self.parse_strength(strength) + except Exception: + pass + + return network_strength + + def get_network_metered(self, network_type) -> bool: + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_devices = primary_connection.Get(NM_CON_ACT, 'Devices', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + for dev in primary_devices: + dev_obj = self.bus.get_object(NM, str(dev)) + metered_prop = dev_obj.Get(NM_DEV, 'Metered', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if network_type == NetworkType.wifi: + if metered_prop in [NMMetered.NM_METERED_YES, NMMetered.NM_METERED_GUESS_YES]: + return True + elif network_type in [NetworkType.cell2G, NetworkType.cell3G, NetworkType.cell4G, NetworkType.cell5G]: + if metered_prop == NMMetered.NM_METERED_NO: + return False + except Exception: + pass + + return super().get_network_metered(network_type) + + def get_modem_version(self): + try: + modem = self.get_modem() + return modem.Get(MM_MODEM, 'Revision', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + def get_modem_temperatures(self): + timeout = 0.2 # Default timeout is too short + try: + modem = self.get_modem() + temps = modem.Command("AT+QTEMP", math.ceil(timeout), dbus_interface=MM_MODEM, timeout=timeout) + return list(filter(lambda t: t != 255, map(int, temps.split(' ')[1].split(',')))) + except Exception: + return [] + + + def get_current_power_draw(self): + return (self.read_param_file("/sys/class/hwmon/hwmon1/power1_input", int) / 1e6) + + def get_som_power_draw(self): + return (self.read_param_file("/sys/class/power_supply/bms/voltage_now", int) * self.read_param_file("/sys/class/power_supply/bms/current_now", int) / 1e12) + + def shutdown(self): + os.system("sudo poweroff") + + def get_thermal_config(self): + intake, exhaust, case = None, None, None + if self.get_device_type() == "mici": + case = ThermalZone("case") + intake = ThermalZone("intake") + exhaust = ThermalZone("exhaust") + return ThermalConfig(cpu=[ThermalZone(f"cpu{i}-silver-usr") for i in range(4)] + + [ThermalZone(f"cpu{i}-gold-usr") for i in range(4)], + gpu=[ThermalZone("gpu0-usr"), ThermalZone("gpu1-usr")], + dsp=ThermalZone("compute-hvx-usr"), + memory=ThermalZone("ddr-usr"), + pmic=[ThermalZone("pm8998_tz"), ThermalZone("pm8005_tz")], + intake=intake, + exhaust=exhaust, + case=case) + + def set_display_power(self, on): + try: + with open("/sys/class/backlight/panel0-backlight/bl_power", "w") as f: + f.write("0" if on else "4") + except Exception: + pass + + def set_screen_brightness(self, percentage): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + val = int(percentage * (max_brightness / 100.)) + with open("/sys/class/backlight/panel0-backlight/brightness", "w") as f: + f.write(str(val)) + except Exception: + pass + + def get_screen_brightness(self): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + with open("/sys/class/backlight/panel0-backlight/brightness") as f: + return int(float(f.read()) / (max_brightness / 100.)) + except Exception: + return 0 + + def set_power_save(self, powersave_enabled): + # amplifier, 100mW at idle + if self.amplifier is not None: + self.amplifier.set_global_shutdown(amp_disabled=powersave_enabled) + if not powersave_enabled: + self.amplifier.initialize_configuration(self.get_device_type()) + + # *** CPU config *** + + # offline big cluster + for i in range(4, 8): + val = '0' if powersave_enabled else '1' + sudo_write(val, f'/sys/devices/system/cpu/cpu{i}/online') + + for n in ('0', '4'): + if powersave_enabled and n == '4': + continue + gov = 'ondemand' if powersave_enabled else 'performance' + sudo_write(gov, f'/sys/devices/system/cpu/cpufreq/policy{n}/scaling_governor') + + # *** IRQ config *** + + # GPU, modeld core + affine_irq(7, "kgsl-3d0") + + # camerad core + camera_irqs = ("a5", "cci", "cpas_camnoc", "cpas-cdm", "csid", "ife", "csid-lite", "ife-lite") + for n in camera_irqs: + affine_irq(6, n) + + def get_gpu_usage_percent(self): + try: + with open('/sys/class/kgsl/kgsl-3d0/gpubusy') as f: + used, total = f.read().strip().split() + return 100.0 * int(used) / int(total) + except Exception: + return 0 + + def initialize_hardware(self): + if self.amplifier is not None: + self.amplifier.initialize_configuration(self.get_device_type()) + + # Allow hardwared to write engagement status to kmsg + os.system("sudo chmod a+w /dev/kmsg") + + # Ensure fan gpio is enabled so fan runs until shutdown, also turned on at boot by the ABL + gpio_init(GPIO.SOM_ST_IO, True) + gpio_set(GPIO.SOM_ST_IO, 1) + + # *** IRQ config *** + + # mask off big cluster from default affinity + sudo_write("f", "/proc/irq/default_smp_affinity") + + # move these off the default core + affine_irq(1, "msm_vidc") # encoders + affine_irq(1, "i2c_geni") # sensors + + # *** GPU config *** + # https://github.com/commaai/agnos-kernel-sdm845/blob/master/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi#L216 + affine_irq(5, "fts_ts") # touch + affine_irq(5, "msm_drm") # display + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/min_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/max_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_bus_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_clk_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_rail_on") + sudo_write("1000", "/sys/class/kgsl/kgsl-3d0/idle_timer") + sudo_write("performance", "/sys/class/kgsl/kgsl-3d0/devfreq/governor") + sudo_write("710", "/sys/class/kgsl/kgsl-3d0/max_clock_mhz") + + # setup governors + sudo_write("performance", "/sys/class/devfreq/soc:qcom,cpubw/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu0/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu4/governor") + + # *** VIDC (encoder) config *** + sudo_write("N", "/sys/kernel/debug/msm_vidc/clock_scaling") + sudo_write("Y", "/sys/kernel/debug/msm_vidc/disable_thermal_mitigation") + + # pandad core + affine_irq(3, "spi_geni") # SPI + if "tici" in self.get_device_type(): + affine_irq(3, "xhci-hcd:usb3") + affine_irq(3, "xhci-hcd:usb1") + try: + pid = subprocess.check_output(["pgrep", "-f", "spi0"], encoding='utf8').strip() + subprocess.call(["sudo", "chrt", "-f", "-p", "1", pid]) + subprocess.call(["sudo", "taskset", "-pc", "3", pid], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessException as e: + print(str(e)) + + def configure_modem(self): + from iqpilot.common.params import Params + + sim_info = self.get_sim_info() + sim_id = sim_info.get('sim_id', '') + params = Params() + manual_apn = params.get("GsmApn", encoding="utf-8") or "" + metered_enabled = params.get_bool("GsmMetered") + + modem = self.get_modem() + try: + manufacturer = str(modem.Get(MM_MODEM, 'Manufacturer', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + except Exception: + manufacturer = None + + cmds = [] + is_comma_profile = self.get_sim_lpa().is_comma_profile(sim_id) + roaming_enabled = params.get_bool("GsmRoaming") + initial_eps_apn = "" if is_comma_profile else manual_apn + + if not is_comma_profile and params.get("GsmRoaming") is None: + params.put_bool("GsmRoaming", True) + roaming_enabled = True + + subprocess.call([ + "nmcli", "connection", "modify", "lte", + "gsm.auto-config", "no" if manual_apn else "yes", + "gsm.apn", manual_apn, + "gsm.home-only", "no" if roaming_enabled else "yes", + "gsm.network-id", "", + "gsm.initial-eps-bearer-configure", "yes" if initial_eps_apn else "no", + "gsm.initial-eps-bearer-apn", initial_eps_apn, + "connection.metered", "unknown" if metered_enabled else "no", + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + if self.get_device_type() in ("tici", "tizi"): + if initial_eps_apn: + subprocess.call(["mmcli", "-m", "any", f'--3gpp-set-initial-eps-bearer-settings=apn={initial_eps_apn}']) + else: + subprocess.call(["mmcli", "-m", "any", '--3gpp-set-initial-eps-bearer-settings=apn=']) + + cmds += [ + # configure modem as data-centric + 'AT+QNVW=5280,0,"0102000000000000"', + 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', + 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', + ] + if self.get_device_type() == "tizi": + cmds += [ + 'AT+QSIMDET=1,0', + 'AT+QSIMSTAT=1', + ] + elif manufacturer == 'Cavli Inc.': + cmds += [ + 'AT^SIMSWAP=1', # use SIM slot, instead of internal eSIM + 'AT$QCSIMSLEEP=0', # disable SIM sleep + 'AT$QCSIMCFG=SimPowerSave,0', # more sleep disable + + # ethernet config + 'AT$QCPCFG=usbNet,0', + 'AT$QCNETDEVCTL=3,1', + ] + else: + # this modem gets upset with too many AT commands + if sim_id is None or len(sim_id) == 0: + cmds += [ + # SIM sleep disable + 'AT$QCSIMSLEEP=0', + 'AT$QCSIMCFG=SimPowerSave,0', + + # ethernet config + 'AT$QCPCFG=usbNet,1', + ] + + for cmd in cmds: + try: + modem.Command(cmd, math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + + # eSIM prime + dest = "/etc/NetworkManager/system-connections/esim.nmconnection" + if self.get_sim_lpa().is_comma_profile(sim_id) and not os.path.exists(dest): + with open(Path(__file__).parent/'esim.nmconnection') as f, tempfile.NamedTemporaryFile(mode='w') as tf: + dat = f.read() + dat = dat.replace("sim-id=", f"sim-id={sim_id}") + tf.write(dat) + tf.flush() + + # needs to be root + os.system(f"sudo cp {tf.name} {dest}") + os.system(f"sudo nmcli con load {dest}") + + def recover_sim_detection(self) -> bool: + # A worn SIM-tray presence switch can read "removed" while the SIM pads still make + # contact; with hot-swap detect armed (AT+QSIMDET=1) the modem never powers the SIM + # and lands in failed/sim-missing. Disabling detect and rebooting the modem makes it + # probe the SIM electrically. Safe to retry on failure: firing disarms the QSIMDET + # gate, so a genuinely SIM-less device gets at most one extra modem reboot per boot. + if self.get_device_type() not in ("tici", "tizi"): + return False + + try: + modem = self.get_modem() + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if state != MM_MODEM_STATE.FAILED: + return False + reason = modem.Get(MM_MODEM, 'StateFailedReason', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if reason != MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: + return False + detect = str(modem.Command('AT+QSIMDET?', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT)).strip() + if not detect.startswith('+QSIMDET: 1'): + return False + modem.Command('AT+QSIMDET=0,0', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + modem.Command('AT+CFUN=1,1', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + return True + except Exception: + return False + + def reboot_modem(self): + modem = None + try: + modem = self.get_modem() + except Exception: + pass + + if modem is not None: + for state in (0, 1): + try: + modem.Command(f'AT+CFUN={state}', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + return + + for state in (0, 1): + try: + self._run_direct_modem_command(f"AT+CFUN={state}") + except Exception: + pass + + def get_networks(self): + r = {} + + wlan = iwlist.scan() + if wlan is not None: + r['wlan'] = wlan + + lte_info = self.get_network_info() + if lte_info is not None: + extra = lte_info['extra'] + + # ,"LTE",,,,,,,, + # ,,,,,,, + if 'LTE' in extra: + extra = extra.split(',') + try: + r['lte'] = [{ + "mcc": int(extra[3]), + "mnc": int(extra[4]), + "cid": int(extra[5], 16), + "nmr": [{"pci": int(extra[6]), "earfcn": int(extra[7])}], + }] + except (ValueError, IndexError): + pass + + return r + + def get_modem_data_usage(self): + try: + wwan = self.get_wwan() + + # Ensure refresh rate is set so values don't go stale + refresh_rate = wwan.Get(NM_DEV_STATS, 'RefreshRateMs', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if refresh_rate != REFRESH_RATE_MS: + u = type(refresh_rate) + wwan.Set(NM_DEV_STATS, 'RefreshRateMs', u(REFRESH_RATE_MS), dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + tx = wwan.Get(NM_DEV_STATS, 'TxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + rx = wwan.Get(NM_DEV_STATS, 'RxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + return int(tx), int(rx) + except Exception: + return -1, -1 + + def has_internal_panda(self): + return True + + def reset_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 0) + time.sleep(1) + gpio_set(GPIO.STM_RST_N, 0) + + def recover_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 1) + time.sleep(0.5) + gpio_set(GPIO.STM_RST_N, 0) + time.sleep(0.5) + gpio_set(GPIO.STM_BOOT0, 0) + + def booted(self): + # this normally boots within 8s, but on rare occasions takes 30+s + encoder_state = sudo_read("/sys/kernel/debug/msm_vidc/core0/info") + if "Core state: 0" in encoder_state and (time.monotonic() < 60*2): + return False + return True + +if __name__ == "__main__": + t = Tici() + t.configure_modem() + t.initialize_hardware() + t.set_power_save(False) + print(t.get_sim_info()) diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py new file mode 100644 index 000000000..1e7c428b4 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/iwlist.py @@ -0,0 +1,35 @@ +import subprocess + + +def scan(interface="wlan0"): + result = [] + try: + r = subprocess.check_output(["iwlist", interface, "scan"], encoding='utf8') + + mac = None + for line in r.split('\n'): + if "Address" in line: + # Based on the adapter eithere a percentage or dBm is returned + # Add previous network in case no dBm signal level was seen + if mac is not None: + result.append({"mac": mac}) + mac = None + + mac = line.split(' ')[-1] + elif "dBm" in line: + try: + level = line.split('Signal level=')[1] + rss = int(level.split(' ')[0]) + result.append({"mac": mac, "rss": rss}) + mac = None + except ValueError: + continue + + # Add last network if no dBm was found + if mac is not None: + result.append({"mac": mac}) + + return result + + except Exception: + return None diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py new file mode 100644 index 000000000..a636742d5 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/lpa.py @@ -0,0 +1,1482 @@ +#!/usr/bin/env python3 +# SGP.22 v2.3: https://www.gsma.com/solutions-and-impact/technologies/esim/wp-content/uploads/2021/07/SGP.22-v2.3.pdf + +import argparse +import atexit +import base64 +import hashlib +import json +import math +import os +import re +import requests +import serial +import subprocess +import sys +import time + +from collections.abc import Generator +from contextlib import contextmanager +from pathlib import Path +from typing import Literal +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.system.hardware.base import LPABase, LPAError, LPAProfileNotFoundError, Profile + +GSMA_CI_BUNDLE = str(Path(__file__).parent / 'gsma_ci_bundle.pem') + + +DEFAULT_DEVICE = "/dev/modem_at0" +DEFAULT_BAUD = 9600 +DEFAULT_TIMEOUT = 5.0 +# https://euicc-manual.osmocom.org/docs/lpa/applet-id/ +ISDR_AID = "A0000005591010FFFFFFFF8900000100" +ES10X_MSS = 120 +MM = "org.freedesktop.ModemManager1" +MM_MODEM = MM + ".Modem" + +# TLV Tags +TAG_ICCID = 0x5A +TAG_STATUS = 0x80 +TAG_EUICC_INFO = 0xBF20 +TAG_PREPARE_DOWNLOAD = 0xBF21 +TAG_PROFILE_INFO_LIST = 0xBF2D +TAG_EUICC_CHALLENGE = 0xBF2E +TAG_SET_NICKNAME = 0xBF29 +TAG_LIST_NOTIFICATION = 0xBF28 +TAG_RETRIEVE_NOTIFICATION = 0xBF2B +TAG_NOTIFICATION_METADATA = 0xBF2F +TAG_NOTIFICATION_SENT = 0xBF30 +TAG_ENABLE_PROFILE = 0xBF31 +TAG_DISABLE_PROFILE = 0xBF32 +TAG_DELETE_PROFILE = 0xBF33 +TAG_BPP = 0xBF36 +TAG_PROFILE_INSTALL_RESULT = 0xBF37 +TAG_AUTH_SERVER = 0xBF38 +TAG_CANCEL_SESSION = 0xBF41 + +STATE_LABELS = {0: "disabled", 1: "enabled", 255: "unknown"} +ICON_LABELS = {0: "jpeg", 1: "png", 255: "unknown"} +CLASS_LABELS = {0: "test", 1: "provisioning", 2: "operational", 255: "unknown"} +PROFILE_ERROR_CODES = { + 0x01: "iccidOrAidNotFound", 0x02: "profileNotInDisabledState", + 0x03: "disallowedByPolicy", 0x04: "wrongProfileReenabling", + 0x05: "catBusy", 0x06: "undefinedError", +} +AUTH_SERVER_ERROR_CODES = { + 0x01: "eUICCVerificationFailed", 0x02: "eUICCCertificateExpired", + 0x03: "eUICCCertificateRevoked", 0x05: "invalidServerSignature", + 0x06: "euiccCiPKUnknown", 0x0A: "matchingIdRefused", + 0x10: "insufficientMemory", +} +BPP_COMMAND_NAMES = { + 0: "initialiseSecureChannel", 1: "configureISDP", 2: "storeMetadata", + 3: "storeMetadata2", 4: "replaceSessionKeys", 5: "loadProfileElements", +} +BPP_ERROR_REASONS = { + 1: "incorrectInputValues", 2: "invalidSignature", 3: "invalidTransactionId", + 4: "unsupportedCrtValues", 5: "unsupportedRemoteOperationType", + 6: "unsupportedProfileClass", 7: "scp03tStructureError", 8: "scp03tSecurityError", + 9: "iccidAlreadyExistsOnEuicc", 10: "insufficientMemoryForProfile", + 11: "installInterrupted", 12: "peProcessingError", 13: "dataMismatch", + 14: "invalidNAA", +} +CANCEL_SESSION_REASON = { + 0: "endUserRejection", 1: "postponed", 2: "timeout", + 3: "pprNotAllowed", 127: "undefinedReason", +} + +ESIM_TLS_BUNDLE_ENV = "IQPILOT_ESIM_CA_BUNDLE" +ESIM_QESIM_INIT_ENV = "IQPILOT_ESIM_QESIM_INIT" +ESIM_EXCLUSIVE_MODEM_ENV = "IQPILOT_ESIM_EXCLUSIVE_MODEM" + + +def _ensure_dbus_import(): + try: + import dbus # noqa: F401 + return + except ModuleNotFoundError: + dist_packages = "/usr/lib/python3/dist-packages" + if dist_packages not in sys.path and os.path.isdir(dist_packages): + sys.path.append(dist_packages) + import dbus # noqa: F401 + + +def _tls_verify_option() -> bool | str: + # Default to the GSMA CI bundle used by the reference eSIM branch. + # Allow explicit override for local testing or forced system trust behavior. + override = os.getenv(ESIM_TLS_BUNDLE_ENV, "").strip() + if not override: + return GSMA_CI_BUNDLE + if override.lower() in ("0", "false", "off"): + return False + if override.lower() in ("1", "true", "on", "system"): + return True + return override + + +def b64e(data: bytes) -> str: + return base64.b64encode(data).decode("ascii") + + +def b64d(s: str) -> bytes: + return base64.b64decode(base64_trim(s)) + + +def _decode_apdu_response_blob(raw: str, label: str) -> bytes: + filtered = re.sub(r"[^0-9A-Fa-f]", "", raw) + if len(filtered) < 2 or len(filtered) % 2: + raise RuntimeError(f"Malformed {label} response payload") + return bytes.fromhex(filtered) + + +class AtClient: + def __init__(self, device: str, baud: int, timeout: float, verbose: bool) -> None: + self._device = device + self._baud = baud + self._timeout = timeout + self.verbose = verbose + self.channel: str | None = None + self._serial: serial.Serial | None = None + self._use_csim = False + self._has_qesim = False + self._qesim_lpa_enabled = False + try: + self._serial = serial.Serial(device, baudrate=baud, timeout=timeout) + self._disable_echo() + except (serial.SerialException, PermissionError, OSError): + self._serial = None + if self.verbose: + print(f"!! using ModemManager DBus AT transport for {device}", file=sys.stderr) + + def close(self) -> None: + try: + if self.channel: + try: + self.query(f"AT+CCHC={self.channel}") + except Exception as e: + if self.verbose: + print(f"!! ignoring channel close failure: {e}", file=sys.stderr) + finally: + self.channel = None + finally: + if self._serial is not None: + self._serial.close() + + @staticmethod + def _is_busy_open_error(error: Exception) -> bool: + text = str(error).lower() + return "errno 16" in text or "device or resource busy" in text + + def _disable_echo(self) -> None: + if self._serial is None: + return + self._serial.reset_input_buffer() + self._serial.write(b"ATE0\r") + time.sleep(0.1) + self._serial.reset_input_buffer() + + def _send(self, cmd: str) -> None: + if self.verbose: + print(f">> {cmd}", file=sys.stderr) + assert self._serial is not None + self._serial.write((cmd + "\r").encode("ascii")) + + def _expect(self) -> list[str]: + lines: list[str] = [] + while True: + assert self._serial is not None + raw = self._serial.readline() + if not raw: + raise TimeoutError("AT command timed out") + line = raw.decode(errors="ignore").strip() + if not line: + continue + if self.verbose: + print(f"<< {line}", file=sys.stderr) + if line == "OK": + return lines + if line == "ERROR": + raise RuntimeError("AT command failed") + if "ERROR" in line and line.startswith("+"): + # Catch +CME ERROR / +CMS ERROR and similar modem-specific failures. + raise RuntimeError(f"AT command failed: {line}") + lines.append(line) + + def _get_modem(self): + _ensure_dbus_import() + import dbus + + bus = dbus.SystemBus() + mm = bus.get_object(MM, '/org/freedesktop/ModemManager1') + objects = mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=self._timeout) + modem_paths = [path for path in objects.keys() if "/Modem/" in str(path)] + if not modem_paths: + raise RuntimeError("ModemManager returned no modems") + return bus.get_object(MM, modem_paths[0]) + + def _dbus_query(self, cmd: str) -> list[str]: + if self.verbose: + print(f"DBUS >> {cmd}", file=sys.stderr) + try: + result = str(self._get_modem().Command(cmd, math.ceil(self._timeout), dbus_interface=MM_MODEM, timeout=self._timeout)) + except Exception as e: + raise RuntimeError(f"AT command failed: {e}") from e + lines = [line.strip() for line in result.splitlines() if line.strip()] + if self.verbose: + for line in lines: + print(f"DBUS << {line}", file=sys.stderr) + return lines + + def _reconnect_serial(self) -> None: + self.channel = None + try: + if self._serial is not None: + self._serial.close() + except Exception: + pass + self._serial = serial.Serial(self._device, baudrate=self._baud, timeout=self._timeout) + self._disable_echo() + + def query(self, cmd: str) -> list[str]: + if self._serial is None: + return self._dbus_query(cmd) + try: + self._send(cmd) + return self._expect() + except (OSError, serial.SerialException) as e: + try: + self._reconnect_serial() + self._send(cmd) + return self._expect() + except Exception: + raise RuntimeError(f"AT transport error ({cmd}): {e}") from e + except TimeoutError as e: + raise TimeoutError(f"AT command timed out ({cmd})") from e + except RuntimeError as e: + raise RuntimeError(f"AT command failed ({cmd}): {e}") from e + + def _supports_qesim(self) -> bool: + try: + lines = self.query("AT+QESIM=?") + except Exception: + return False + return any(line.startswith("+QESIM:") for line in lines) + + def _set_quectel_lpa_mode(self) -> None: + self._has_qesim = self._supports_qesim() + self._qesim_lpa_enabled = False + if not self._has_qesim: + return + + # Some Quectel firmwares require enabling internal LPA mode before + # ISO7816 channel open commands (CCHO/CGLA) will succeed. + lpa_enable_cmds = ( + 'AT+QESIM="lpa_enable",1', + 'AT+QESIM="lpa_enable"', + ) + for cmd in lpa_enable_cmds: + try: + self.query(cmd) + self._qesim_lpa_enabled = True + break + except Exception: + continue + + # Keep BIP auth enabled when supported; this is needed by some firmware + # revisions for profile download/auth paths. + try: + lines = self.query('AT+QCFG="bip/auth"?') + needs_enable = any('"bip/auth",0' in line for line in lines) + if needs_enable: + self.query('AT+QCFG="bip/auth",1') + except Exception: + pass + + def ensure_capabilities(self) -> None: + if self._serial is None: + return + + # Some modem firmwares reject command test forms (e.g. AT+CCHO=?) + # while still supporting real execution. Keep these probes non-fatal. + self.query("AT") + # Keep IQ-specific QESIM initialization opt-in for debugging only. + # Default behavior should match upstream greatgitsby/esim transport flow. + if os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + try: + self.query("AT+CMEE=2") + except Exception: + pass + self._set_quectel_lpa_mode() + for command in ("AT+CCHO", "AT+CCHC", "AT+CGLA", "AT+CSIM"): + try: + self.query(f"{command}=?") + except Exception as e: + if self.verbose: + print(f"!! capability probe failed for {command}: {e}", file=sys.stderr) + + def open_isdr(self) -> None: + try: + self.query(f'AT+CCHC=1') + except Exception: + pass + ccho_candidates = [ + f'AT+CCHO="{ISDR_AID}"', + f"AT+CCHO={ISDR_AID}", + ] + for cmd in ccho_candidates: + try: + lines = self.query(cmd) + except Exception: + continue + for line in lines: + if line.startswith("+CCHO:") and (ch := line.split(":", 1)[1].strip()): + self.channel = ch + return + + # Fallback for modems that reject CCHO but allow APDUs over basic channel. + self.channel = "0" + aid_len = len(ISDR_AID) // 2 + select_isdr = bytes.fromhex(f"00A40400{aid_len:02X}{ISDR_AID}") + try: + _, sw1, sw2 = self.send_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + return + raise RuntimeError(f"ISD-R SELECT failed on basic channel SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + # Final fallback for modems that only support APDU via CSIM. + try: + _, sw1, sw2 = self._send_csim_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + self._use_csim = True + self.channel = "csim" + if self.verbose: + print("!! using CSIM APDU transport fallback", file=sys.stderr) + return + raise RuntimeError(f"ISD-R SELECT failed on CSIM SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + if self._has_qesim and not self._qesim_lpa_enabled and os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + raise RuntimeError( + "Modem exposes AT+QESIM but rejects LPA enable and ISD-R access; " + "this firmware/SKU likely does not provide usable eSIM functionality" + ) + raise RuntimeError("Failed to access eUICC ISD-R (CCHO/CGLA/CSIM all failed)") + + def send_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + for attempt in range(3): + try: + if not self.channel: + self.open_isdr() + if self._use_csim: + return self._send_csim_apdu(apdu) + hex_payload = apdu.hex().upper() + cmd = f'AT+CGLA={self.channel},{len(hex_payload)},"{hex_payload}"' + for query_attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CGLA:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CGLA") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if query_attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CGLA response") + except RuntimeError: + self.channel = None + self._use_csim = False + if attempt == 2: + raise + time.sleep(1 + attempt) + raise RuntimeError("send_apdu failed") + + def _send_csim_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + hex_payload = apdu.hex().upper() + cmd = f'AT+CSIM={len(hex_payload)},"{hex_payload}"' + for attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CSIM:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CSIM") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CSIM response") + + +# --- TLV utilities --- + +def iter_tlv(data: bytes, with_positions: bool = False) -> Generator: + idx, length = 0, len(data) + while idx < length: + start_pos = idx + tag = data[idx] + idx += 1 + if tag & 0x1F == 0x1F: # Multi-byte tag + tag_value = tag + while idx < length: + next_byte = data[idx] + idx += 1 + tag_value = (tag_value << 8) | next_byte + if not (next_byte & 0x80): + break + else: + tag_value = tag + if idx >= length: + break + size = data[idx] + idx += 1 + if size & 0x80: # Multi-byte length + num_bytes = size & 0x7F + if idx + num_bytes > length: + break + size = int.from_bytes(data[idx : idx + num_bytes], "big") + idx += num_bytes + if idx + size > length: + break + value = data[idx : idx + size] + idx += size + yield (tag_value, value, start_pos, idx) if with_positions else (tag_value, value) + + +def find_tag(data: bytes, target: int) -> bytes | None: + return next((v for t, v in iter_tlv(data) if t == target), None) + + +def encode_tlv(tag: int, value: bytes) -> bytes: + tag_bytes = bytes([(tag >> 8) & 0xFF, tag & 0xFF]) if tag > 255 else bytes([tag]) + vlen = len(value) + if vlen <= 127: + return tag_bytes + bytes([vlen]) + value + length_bytes = vlen.to_bytes((vlen.bit_length() + 7) // 8, "big") + return tag_bytes + bytes([0x80 | len(length_bytes)]) + length_bytes + value + + +def tbcd_to_string(raw: bytes) -> str: + return "".join(str(n) for b in raw for n in (b & 0x0F, b >> 4) if n <= 9) + + +def string_to_tbcd(s: str) -> bytes: + digits = [int(c) for c in s if c.isdigit()] + return bytes(digits[i] | ((digits[i + 1] if i + 1 < len(digits) else 0xF) << 4) for i in range(0, len(digits), 2)) + + +def base64_trim(s: str) -> str: + return "".join(c for c in s if c not in "\n\r \t") + + +# --- Shared helpers --- + +def _int_bytes(n: int) -> bytes: + """Encode a positive integer as minimal big-endian bytes (at least 1 byte).""" + return n.to_bytes((n.bit_length() + 7) // 8 or 1, "big") + + +def _extract_status(response: bytes, tag: int, name: str) -> int: + """Extract the status byte from a tagged ES10x response.""" + root = find_tag(response, tag) + if root is None: + raise RuntimeError(f"Missing {name}Response") + status = find_tag(root, TAG_STATUS) + if status is None: + raise RuntimeError(f"Missing status in {name}Response") + return status[0] + + +# Profile field decoders: TLV tag -> (field_name, decoder) +_PROFILE_FIELDS = { + TAG_ICCID: ("iccid", tbcd_to_string), + 0x4F: ("isdpAid", lambda v: v.hex().upper()), + 0x9F70: ("profileState", lambda v: STATE_LABELS.get(v[0], "unknown")), + 0x90: ("profileNickname", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x91: ("serviceProviderName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x92: ("profileName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x93: ("iconType", lambda v: ICON_LABELS.get(v[0], "unknown")), + 0x94: ("icon", b64e), + 0x95: ("profileClass", lambda v: CLASS_LABELS.get(v[0], "unknown")), +} + + +def _decode_profile_fields(data: bytes) -> dict: + """Parse known profile metadata TLV fields into a dict.""" + result = {} + for tag, value in iter_tlv(data): + if (field := _PROFILE_FIELDS.get(tag)): + result[field[0]] = field[1](value) + return result + + +# Notification field decoders: TLV tag -> (field_name, decoder) +_NOTIF_FIELDS = { + TAG_STATUS: ("seqNumber", lambda v: int.from_bytes(v, "big")), + 0x81: ("profileManagementOperation", lambda v: next((m for m in [0x80, 0x40, 0x20, 0x10] if len(v) >= 2 and v[1] & m), 0xFF)), + 0x0C: ("notificationAddress", lambda v: v.decode("utf-8", errors="ignore")), + TAG_ICCID: ("iccid", tbcd_to_string), +} + + +# --- ES10x command transport --- + +def es10x_command(client: AtClient, data: bytes) -> bytes: + response = bytearray() + sequence = 0 + offset = 0 + while offset < len(data): + chunk = data[offset : offset + ES10X_MSS] + offset += len(chunk) + is_last = offset == len(data) + apdu = bytes([0x80, 0xE2, 0x91 if is_last else 0x11, sequence & 0xFF, len(chunk)]) + chunk + segment, sw1, sw2 = client.send_apdu(apdu) + response.extend(segment) + while True: + if sw1 == 0x61: # More data available + segment, sw1, sw2 = client.send_apdu(bytes([0x80, 0xC0, 0x00, 0x00, sw2 or 0])) + response.extend(segment) + continue + if (sw1 & 0xF0) == 0x90: + break + raise RuntimeError(f"APDU failed with SW={sw1:02X}{sw2:02X}") + sequence += 1 + return bytes(response) + + +# --- ES9P HTTP --- + +def es9p_request(smdp_address: str, endpoint: str, payload: dict, error_prefix: str = "Request") -> dict: + if not system_time_valid(): + raise RuntimeError("System time is not set; TLS certificate validation requires a valid clock") + url = f"https://{smdp_address}/gsma/rsp2/es9plus/{endpoint}" + headers = {"User-Agent": "gsma-rsp-lpad", "X-Admin-Protocol": "gsma/rsp/v2.3.0", "Content-Type": "application/json"} + resp = requests.post(url, json=payload, headers=headers, timeout=30, verify=_tls_verify_option()) + resp.raise_for_status() + if not resp.content: + return {} + data = resp.json() + if "header" in data and "functionExecutionStatus" in data["header"]: + status = data["header"]["functionExecutionStatus"] + if status.get("status") == "Failed": + sd = status.get("statusCodeData", {}) + raise RuntimeError(f"{error_prefix} failed: {sd.get('reasonCode', 'unknown')}/{sd.get('subjectCode', 'unknown')} - {sd.get('message', 'unknown')}") + return data + + +# --- Profile operations --- + +def decode_profiles(blob: bytes) -> list[dict]: + root = find_tag(blob, TAG_PROFILE_INFO_LIST) + if root is None: + raise RuntimeError("Missing ProfileInfoList") + list_ok = find_tag(root, 0xA0) + if list_ok is None: + return [] + defaults = {name: None for name, _ in _PROFILE_FIELDS.values()} + return [{**defaults, **_decode_profile_fields(value)} for tag, value in iter_tlv(list_ok) if tag == 0xE3] + + +def list_profiles(client: AtClient) -> list[dict]: + return decode_profiles(es10x_command(client, bytes.fromhex("BF2D00"))) + + +def _profile_op(client: AtClient, tag: int, iccid: str, refresh: bool, action: str) -> None: + inner = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + if tag != TAG_DELETE_PROFILE: + if not refresh: + inner += encode_tlv(0x81, b'\x00') + inner = encode_tlv(0xA0, inner) + code = _extract_status(es10x_command(client, encode_tlv(tag, inner)), tag, f"{action.capitalize()}Profile") + if code == 0x00: + return + if code == 0x02 and tag != TAG_DELETE_PROFILE: + print(f"profile {iccid} already {action}d") + return + raise RuntimeError(f"{action.capitalize()}Profile failed: {PROFILE_ERROR_CODES.get(code, 'unknown')} (0x{code:02X})") + + +def enable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_ENABLE_PROFILE, iccid, refresh, "enable") + + +def disable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_DISABLE_PROFILE, iccid, refresh, "disable") + + +def delete_profile(client: AtClient, iccid: str) -> None: + _profile_op(client, TAG_DELETE_PROFILE, iccid, True, "delete") + + +def set_profile_nickname(client: AtClient, iccid: str, nickname: str) -> None: + nickname_bytes = nickname.encode("utf-8") + if len(nickname_bytes) > 64: + raise ValueError("Profile nickname must be 64 bytes or less") + content = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + encode_tlv(0x90, nickname_bytes) + code = _extract_status(es10x_command(client, encode_tlv(TAG_SET_NICKNAME, content)), TAG_SET_NICKNAME, "SetNickname") + if code == 0x01: + raise RuntimeError(f"profile {iccid} not found") + if code != 0x00: + raise RuntimeError(f"SetNickname failed with status 0x{code:02X}") + + +# --- Notifications --- + +def list_notifications(client: AtClient) -> list[dict]: + response = es10x_command(client, encode_tlv(TAG_LIST_NOTIFICATION, b"")) + root = find_tag(response, TAG_LIST_NOTIFICATION) + if root is None: + raise RuntimeError("Missing ListNotificationResponse") + metadata_list = find_tag(root, 0xA0) + if metadata_list is None: + return [] + notifications: list[dict] = [] + for tag, value in iter_tlv(metadata_list): + if tag != TAG_NOTIFICATION_METADATA: + continue + notification = {"seqNumber": None, "profileManagementOperation": None, "notificationAddress": None, "iccid": None} + for t, v in iter_tlv(value): + if (field := _NOTIF_FIELDS.get(t)): + notification[field[0]] = field[1](v) + if notification["seqNumber"] is not None and notification["profileManagementOperation"] is not None and notification["notificationAddress"]: + notifications.append(notification) + return notifications + + +def retrieve_notification(client: AtClient, seq_number: int) -> dict: + request = encode_tlv(TAG_RETRIEVE_NOTIFICATION, encode_tlv(0xA0, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + response = es10x_command(client, request) + root = find_tag(response, TAG_RETRIEVE_NOTIFICATION) + if root is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + a0_content = find_tag(root, 0xA0) + if a0_content is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + pending_notif, pending_tag = None, None + for tag, value in iter_tlv(a0_content): + if tag in (TAG_PROFILE_INSTALL_RESULT, 0x30): + pending_notif, pending_tag = value, tag + break + if pending_notif is None: + raise RuntimeError("Missing PendingNotification") + if pending_tag == TAG_PROFILE_INSTALL_RESULT: + result_data = find_tag(pending_notif, 0xBF27) + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) if result_data else None + else: + notif_meta = find_tag(pending_notif, TAG_NOTIFICATION_METADATA) + if notif_meta is None: + raise RuntimeError("Missing NotificationMetadata") + addr = find_tag(notif_meta, 0x0C) + if addr is None: + raise RuntimeError("Missing notificationAddress") + return {"notificationAddress": addr.decode("utf-8", errors="ignore"), "b64_PendingNotification": b64e(pending_notif)} + + +def remove_notification(client: AtClient, seq_number: int) -> None: + response = es10x_command(client, encode_tlv(TAG_NOTIFICATION_SENT, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + root = find_tag(response, TAG_NOTIFICATION_SENT) + if root is None: + raise RuntimeError("Invalid NotificationSentResponse") + status = find_tag(root, TAG_STATUS) + if status is None or int.from_bytes(status, "big") != 0: + raise RuntimeError("RemoveNotificationFromList failed") + + +def process_notifications(client: AtClient) -> None: + for notification in list_notifications(client): + seq_number, smdp_address = notification["seqNumber"], notification["notificationAddress"] + if not seq_number or not smdp_address: + continue + try: + notif_data = retrieve_notification(client, seq_number) + es9p_request(smdp_address, "handleNotification", {"pendingNotification": notif_data["b64_PendingNotification"]}, "HandleNotification") + remove_notification(client, seq_number) + except Exception: + pass + + +# --- Authentication & Download --- + +def get_challenge_and_info(client: AtClient) -> tuple[bytes, bytes]: + challenge_resp = es10x_command(client, encode_tlv(TAG_EUICC_CHALLENGE, b"")) + root = find_tag(challenge_resp, TAG_EUICC_CHALLENGE) + if root is None: + raise RuntimeError("Missing GetEuiccDataResponse") + challenge = find_tag(root, TAG_STATUS) + if challenge is None: + raise RuntimeError("Missing challenge in response") + info_resp = es10x_command(client, encode_tlv(TAG_EUICC_INFO, b"")) + if not info_resp.startswith(bytes([0xBF, 0x20])): + raise RuntimeError("Missing GetEuiccInfo1Response") + return challenge, info_resp + + +def authenticate_server(client: AtClient, b64_signed1: str, b64_sig1: str, b64_pk_id: str, b64_cert: str, matching_id: str | None = None) -> str: + # Build request + tac = bytes([0x35, 0x29, 0x06, 0x11]) + device_info = encode_tlv(TAG_STATUS, tac) + encode_tlv(0xA1, b"") + ctx_inner = b"" + if matching_id: + ctx_inner += encode_tlv(TAG_STATUS, matching_id.encode("utf-8")) + ctx_inner += encode_tlv(0xA1, device_info) + content = base64.b64decode(b64_signed1) + base64.b64decode(b64_sig1) + base64.b64decode(b64_pk_id) + base64.b64decode(b64_cert) + encode_tlv(0xA0, ctx_inner) + request = encode_tlv(TAG_AUTH_SERVER, content) + + response = es10x_command(client, request) + if not response.startswith(bytes([0xBF, 0x38])): + raise RuntimeError("Invalid AuthenticateServerResponse") + + # Check for eUICC-side errors + root = find_tag(response, TAG_AUTH_SERVER) + if root is not None: + error_tag = find_tag(root, 0xA1) + if error_tag is not None: + code = int.from_bytes(error_tag, "big") if error_tag else 0 + desc = AUTH_SERVER_ERROR_CODES.get(code, "unknown") + raise RuntimeError(f"AuthenticateServer rejected by eUICC: {desc} (0x{code:02X})") + + return b64e(response) + + +def prepare_download(client: AtClient, b64_signed2: str, b64_sig2: str, b64_cert: str, cc: str | None = None) -> str: + smdp_signed2 = base64.b64decode(b64_signed2) + smdp_signature2 = base64.b64decode(b64_sig2) + smdp_certificate = base64.b64decode(b64_cert) + smdp_signed2_root = find_tag(smdp_signed2, 0x30) + if smdp_signed2_root is None: + raise RuntimeError("Invalid smdpSigned2") + transaction_id = find_tag(smdp_signed2_root, TAG_STATUS) + cc_required_flag = find_tag(smdp_signed2_root, 0x01) + if transaction_id is None or cc_required_flag is None: + raise RuntimeError("Invalid smdpSigned2") + content = smdp_signed2 + smdp_signature2 + if int.from_bytes(cc_required_flag, "big") != 0: + if not cc: + raise RuntimeError("Confirmation code required but not provided") + content += encode_tlv(0x04, hashlib.sha256(hashlib.sha256(cc.encode("utf-8")).digest() + transaction_id).digest()) + content += smdp_certificate + response = es10x_command(client, encode_tlv(TAG_PREPARE_DOWNLOAD, content)) + if not response.startswith(bytes([0xBF, 0x21])): + raise RuntimeError("Invalid PrepareDownloadResponse") + return b64e(response) + + +def _parse_tlv_header_len(data: bytes) -> int: + """Return the combined tag + length header size for a TLV element.""" + tag_len = 2 if data[0] & 0x1F == 0x1F else 1 + length_byte = data[tag_len] + return tag_len + (1 + (length_byte & 0x7F) if length_byte & 0x80 else 1) + + +def load_bpp(client: AtClient, b64_bpp: str) -> dict: + bpp = b64d(b64_bpp) + if not bpp.startswith(bytes([0xBF, 0x36])): + raise RuntimeError("Invalid BoundProfilePackage") + + bpp_root_value = None + for tag, value, start, end in iter_tlv(bpp, with_positions=True): + if tag == TAG_BPP: + bpp_root_value = value + bpp_value_start = start + _parse_tlv_header_len(bpp[start:end]) + break + if bpp_root_value is None: + raise RuntimeError("Invalid BoundProfilePackage") + + chunks = [] + for tag, value, start, end in iter_tlv(bpp_root_value, with_positions=True): + if tag == 0xBF23: + chunks.append(bpp[0 : bpp_value_start + end]) + elif tag == 0xA0: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + elif tag in (0xA1, 0xA3): + hdr_len = _parse_tlv_header_len(bpp_root_value[start:end]) + chunks.append(bpp[bpp_value_start + start : bpp_value_start + start + hdr_len]) + for _, _, child_start, child_end in iter_tlv(value, with_positions=True): + chunks.append(value[child_start:child_end]) + elif tag == 0xA2: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + + result = {"seqNumber": 0, "success": False, "bppCommandId": None, "errorReason": None} + for chunk in chunks: + response = es10x_command(client, chunk) + if not response: + continue + root = find_tag(response, TAG_PROFILE_INSTALL_RESULT) + if not root: + continue + result_data = find_tag(root, 0xBF27) + if not result_data: + break + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) + if notif_meta: + seq_num = find_tag(notif_meta, TAG_STATUS) + if seq_num: + result["seqNumber"] = int.from_bytes(seq_num, "big") + final_result = find_tag(result_data, 0xA2) + if final_result: + for tag, value in iter_tlv(final_result): + if tag == 0xA0: + result["success"] = True + elif tag == 0xA1: + bpp_cmd = find_tag(value, TAG_STATUS) + if bpp_cmd: + result["bppCommandId"] = int.from_bytes(bpp_cmd, "big") + err = find_tag(value, 0x81) + if err: + result["errorReason"] = int.from_bytes(err, "big") + break # ProfileInstallResult received — eUICC session is finalized + if not result["success"] and result["errorReason"] is not None: + cmd_name = BPP_COMMAND_NAMES.get(result["bppCommandId"], f"unknown({result['bppCommandId']})") + err_name = BPP_ERROR_REASONS.get(result["errorReason"], f"unknown({result['errorReason']})") + raise RuntimeError(f"Profile installation failed at {cmd_name}: {err_name} (bppCommandId={result['bppCommandId']}, errorReason={result['errorReason']})") + return result + + +def parse_metadata(b64_metadata: str) -> dict: + root = find_tag(b64d(b64_metadata), 0xBF25) + if root is None: + raise RuntimeError("Invalid profileMetadata") + defaults = {"iccid": None, "serviceProviderName": None, "profileName": None, "iconType": None, "icon": None, "profileClass": None} + return {**defaults, **_decode_profile_fields(root)} + + +def cancel_session(client: AtClient, transaction_id: bytes, reason: int = 127) -> str: + content = encode_tlv(0x80, transaction_id) + encode_tlv(0x81, bytes([reason])) + response = es10x_command(client, encode_tlv(TAG_CANCEL_SESSION, content)) + return b64e(response) + + +def parse_lpa_activation_code(activation_code: str) -> tuple[str, str, str]: + if not activation_code.startswith("LPA:"): + raise ValueError("Invalid activation code format") + + parts = activation_code[4:].split("$") + if len(parts) != 3: + raise ValueError("Invalid activation code format") + + version, smdp, matching_id = [p.strip() for p in parts] + if version != "1": + raise ValueError("Unsupported activation code version") + if len(smdp) == 0 or "." not in smdp: + raise ValueError("Invalid SM-DP+ address in activation code") + if len(matching_id) == 0: + raise ValueError("Missing matching ID in activation code") + return version, smdp, matching_id + + +def download_profile(client: AtClient, activation_code: str) -> str: + _, smdp, matching_id = parse_lpa_activation_code(activation_code) + + challenge, euicc_info = get_challenge_and_info(client) + + payload = {"smdpAddress": smdp, "euiccChallenge": b64e(challenge), "euiccInfo1": b64e(euicc_info)} + if matching_id: + payload["matchingId"] = matching_id + auth = es9p_request(smdp, "initiateAuthentication", payload, "Authentication") + tx_id = base64_trim(auth.get("transactionId", "")) + tx_id_bytes = base64.b64decode(tx_id) if tx_id else b"" + + try: + b64_auth_resp = authenticate_server( + client, base64_trim(auth.get("serverSigned1", "")), base64_trim(auth.get("serverSignature1", "")), + base64_trim(auth.get("euiccCiPKIdToBeUsed", "")), base64_trim(auth.get("serverCertificate", "")), + matching_id=matching_id) + + cli = es9p_request(smdp, "authenticateClient", {"transactionId": tx_id, "authenticateServerResponse": b64_auth_resp}, "Authentication") + metadata = parse_metadata(base64_trim(cli.get("profileMetadata", ""))) + iccid = str(metadata.get("iccid") or "") + print(f'Downloading profile: {iccid} - {metadata["serviceProviderName"]} - {metadata["profileName"]}') + + b64_prep = prepare_download( + client, base64_trim(cli.get("smdpSigned2", "")), base64_trim(cli.get("smdpSignature2", "")), base64_trim(cli.get("smdpCertificate", ""))) + + bpp = es9p_request(smdp, "getBoundProfilePackage", {"transactionId": tx_id, "prepareDownloadResponse": b64_prep}, "GetBoundProfilePackage") + + result = load_bpp(client, base64_trim(bpp.get("boundProfilePackage", ""))) + if result["success"]: + print(f"Profile installed successfully (seqNumber: {result['seqNumber']})") + return iccid + else: + raise RuntimeError(f"Profile installation failed: {result}") + except Exception: + if tx_id_bytes: + b64_cancel_resp = "" + try: + b64_cancel_resp = cancel_session(client, tx_id_bytes) + except Exception: + pass + try: + es9p_request(smdp, "cancelSession", { + "transactionId": tx_id, + "cancelSessionResponse": b64_cancel_resp, + }, "CancelSession") + except Exception: + pass + raise + + +class TiciLPA(LPABase): + handles_modem_restart = True + _instance = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self, interface: Literal["qmi", "at"] = "at", device: str = DEFAULT_DEVICE, baud: int = DEFAULT_BAUD, + timeout: float = DEFAULT_TIMEOUT, verbose: bool = False): + if getattr(self, "_initialized", False): + self.verbose = verbose or self.verbose + return + # This backend is AT-only. Keep interface arg for compatibility with existing CLI/call sites. + self.interface = interface + self.device = device + self.baud = baud + self.timeout = timeout + self.verbose = verbose + self._last_good_device = device + self._euicc_present_cache: bool | None = None + from iqpilot.system.hardware.tici.hardware import get_device_type + self._is_eg25 = get_device_type() in ("tizi",) + self._client: AtClient | None = None + self._initialized = True + # _client is opened lazily via _ensure_client() on first actual eSIM operation. + # Do NOT call _open_ready_client() here: on pSIM devices (no eUICC) it retries + # for 10–30 s against the AT port, blocking hw_state_thread and starving the + # network-type polling loop that drives the WiFi/LTE sidebar indicator. + atexit.register(self.close) + + def close(self) -> None: + if self._client is not None: + try: + self._client.close() + finally: + self._client = None + + @staticmethod + def _set_modemmanager_running(running: bool) -> None: + action = "start" if running else "stop" + subprocess.check_call(["sudo", "systemctl", action, "ModemManager"]) + + @staticmethod + def _is_modemmanager_running() -> bool: + res = subprocess.run(["systemctl", "is-active", "ModemManager"], + capture_output=True, text=True, check=False) + return res.stdout.strip() == "active" + + def _probe_euicc_present(self) -> bool | None: + if self._euicc_present_cache is not None: + return self._euicc_present_cache + + if self._is_modemmanager_running(): + return None + + restarted_modemmanager = False + try: + res = subprocess.run( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-get-slot-status"], + capture_output=True, text=True, check=False, timeout=12, + ) + output = f"{res.stdout}\n{res.stderr}" + if "Is eUICC: yes" in output: + self._euicc_present_cache = True + elif "Is eUICC: no" in output: + self._euicc_present_cache = False + else: + self._euicc_present_cache = None + except Exception: + self._euicc_present_cache = None + finally: + if restarted_modemmanager: + self._set_modemmanager_running(True) + time.sleep(2.0) + + return self._euicc_present_cache + + @staticmethod + def _ttyusb2_mm_ignored() -> bool: + # AGNOS PR 521 marks ttyUSB2 with ID_MM_PORT_IGNORE=1 for EG25. + # If missing, ModemManager may contend with direct AT eSIM operations. + if not os.path.exists("/dev/ttyUSB2"): + return False + try: + res = subprocess.run( + ["udevadm", "info", "-q", "property", "-n", "/dev/ttyUSB2"], + capture_output=True, text=True, check=False, + ) + if res.returncode != 0: + return False + return "ID_MM_PORT_IGNORE=1" in res.stdout + except Exception: + return False + + def _ensure_client(self) -> AtClient: + if self._client is None: + self._client = self._open_ready_client() + return self._client + + @contextmanager + def _open_client(self): + yield self._ensure_client() + + def _open_ready_client(self) -> AtClient: + euicc_present = self._probe_euicc_present() + if euicc_present is False: + raise LPAError("Modem reports no eUICC support on this unit (QMI: Is eUICC: no)") + + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(1, 6): + for device in self._candidate_devices(): + client: AtClient | None = None + try: + if self.verbose: + print(f"!! trying modem AT device: {device} (attempt {attempt})", file=sys.stderr) + client = AtClient(device, self.baud, self.timeout, self.verbose) + client.ensure_capabilities() + client.open_isdr() + self._last_good_device = device + if self.verbose: + print(f"!! selected modem AT device: {device}", file=sys.stderr) + return client + except Exception as e: + if self.verbose: + print(f"!! modem AT device failed: {device}: {e}", file=sys.stderr) + last_error = e + if client is not None: + try: + client.close() + except Exception: + pass + if not recovery_attempted and last_error is not None and self._should_recover_isdr(last_error): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + # Give modem a moment to finish startup / channel release. + time.sleep(min(0.4 * attempt, 1.5)) + assert last_error is not None + raise last_error + + def _candidate_devices(self) -> list[str]: + if self.device and not os.path.exists(self.device): + return [self.device] + + candidates = [ + self._last_good_device, + self.device, + "/dev/modem_at0", + "/dev/ttyUSB3", + "/dev/ttyUSB2", + "/dev/ttyUSB1", + "/dev/ttyUSB0", + ] + ordered: list[str] = [] + for dev in candidates: + should_include = dev in (self.device, "/dev/modem_at0") or os.path.exists(dev) + if dev and dev not in ordered and should_include: + ordered.append(dev) + return ordered if ordered else [self.device] + + @staticmethod + def _to_profile(data: dict) -> Profile: + return Profile( + iccid=str(data.get("iccid") or ""), + nickname=str(data.get("profileNickname") or ""), + enabled=str(data.get("profileState") or "") == "enabled", + provider=str(data.get("serviceProviderName") or ""), + ) + + def _clear_cat_busy(self) -> None: + time.sleep(3) + try: + self._ensure_client().query('AT+QSTKRSP=254') + except Exception: + pass + time.sleep(1) + try: + self._ensure_client().query('AT+CFUN=4') + except Exception: + pass + time.sleep(2) + try: + self._ensure_client().query('AT+CFUN=1') + except Exception: + pass + self._ensure_client().channel = None + time.sleep(5) + + def _wait_for_modem(self, timeout: float = 45.0) -> None: + start = time.monotonic() + last_error: Exception | None = None + while time.monotonic() - start < timeout: + try: + self.close() + self._client = self._open_ready_client() + return + except Exception as e: + last_error = e + time.sleep(2) + if last_error is not None: + raise RuntimeError("Modem did not recover after reboot") from last_error + raise RuntimeError("Modem did not recover after reboot") + + def _restart_modem(self) -> None: + client = self._ensure_client() + for cmd in ('AT+CFUN=0', 'AT+CFUN=1,1'): + try: + client.query(cmd) + except Exception: + pass + client.channel = None + client._use_csim = False + self._wait_for_modem() + + @staticmethod + def _should_recover_isdr(error: Exception) -> bool: + message = str(error).lower() + markers = ( + "failed to open isd-r", + "failed to access euicc isd-r", + "simfilenotfound", + "at+ccho", + "at+cgla", + ) + return any(marker in message for marker in markers) + + def _recover_isdr_access(self) -> bool: + was_modemmanager_running = self._is_modemmanager_running() + self.close() + try: + if was_modemmanager_running: + self._set_modemmanager_running(False) + time.sleep(2.0) + + for cmd in ( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-reset"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-off=1"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-on=1"], + ): + subprocess.check_call(cmd) + time.sleep(2.0) + + self._euicc_present_cache = None + return True + except Exception as e: + if self.verbose: + print(f"!! ISD-R recovery failed: {e}", file=sys.stderr) + return False + finally: + if was_modemmanager_running: + self._set_modemmanager_running(True) + time.sleep(2.0) + + def _with_lpa_error(self, fn): + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(3): + try: + return fn() + except LPAError: + raise + except RuntimeError as e: + last_error = e + if "does not provide usable esim functionality" in str(e).lower(): + raise LPAError(str(e)) from e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(str(e)) from e + except (OSError, serial.SerialException) as e: + last_error = e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(f"AT transport error: {e}") from e + except TimeoutError as e: + raise LPAError(f"AT modem timeout: {e}") from e + except ValueError as e: + raise LPAError(str(e)) from e + assert last_error is not None + raise LPAError(str(last_error)) + + @staticmethod + def _is_transient_transport_error(message: str) -> bool: + lower = message.lower() + transient_markers = ( + "broken pipe", + "resource busy", + "input/output error", + "device disconnected", + "device reports readiness to read but returned no data", + "transport error", + "missing +cgla response", + "missing +csim response", + "malformed +cgla response payload", + "malformed +csim response payload", + "non-hexadecimal number found in fromhex", + ) + return any(m in lower for m in transient_markers) + + def list_profiles(self) -> list[Profile]: + def _run() -> list[Profile]: + return [self._to_profile(p) for p in list_profiles(self._ensure_client())] + return self._with_lpa_error(_run) + + def get_active_profile(self) -> Profile | None: + return next((p for p in self.list_profiles() if p.enabled), None) + + def _validate_profile_exists(self, iccid: str) -> None: + if not any(p.iccid == iccid for p in self.list_profiles()): + raise LPAProfileNotFoundError(f"profile {iccid} does not exist") + + def _is_bootstrapped(self) -> bool: + return not any(self.is_comma_profile(p.iccid) for p in self.list_profiles()) + + def _ensure_switchable_profile(self, iccid: str) -> None: + if self.is_comma_profile(iccid): + return + + if not self._is_bootstrapped(): + raise LPAError( + "Delete the existing Comma pSIM profile before activating a user eSIM profile" + ) + + def _process_notifications_after_delete(self, client: AtClient, iccid: str) -> None: + try: + process_notifications(client) + return + except Exception as error: + notification_error = error + + self._restart_modem() + + try: + deleted = not any(p.iccid == iccid for p in self.list_profiles()) + except Exception: + raise RuntimeError( + "Profile delete may have succeeded, but modem notification cleanup failed; " + "refresh profiles and retry if needed" + ) from notification_error + + if deleted: + return + + raise RuntimeError( + "Profile delete did not finish cleanly; refresh profiles and retry" + ) from notification_error + + def _process_notifications_after_state_change( + self, + validator, + recovery_message: str, + failure_message: str, + ) -> None: + try: + process_notifications(self._ensure_client()) + return + except Exception as notification_error: + pass + + self._wait_for_modem() + + try: + if validator(): + return + except Exception: + raise RuntimeError(recovery_message) from notification_error + + raise RuntimeError(failure_message) from notification_error + + def delete_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + raise LPAError("cannot delete active profile, switch to another profile first") + + def _run() -> None: + client = self._ensure_client() + try: + delete_profile(client, iccid) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + delete_profile(client, iccid) + else: + raise + self._process_notifications_after_delete(client, iccid) + + self._with_lpa_error(_run) + + def bootstrap(self) -> None: + comma_profiles = [p for p in self.list_profiles() if self.is_comma_profile(p.iccid)] + if not comma_profiles: + return + + def _run() -> None: + client = self._ensure_client() + for profile in comma_profiles: + if profile.enabled: + disable_profile(client, profile.iccid, refresh=True) + process_notifications(client) + delete_profile(client, profile.iccid) + process_notifications(client) + self._restart_modem() + + self._with_lpa_error(_run) + + def download_profile(self, qr: str, nickname: str | None = None) -> None: + # Strict upfront validation to provide immediate user feedback. + parse_lpa_activation_code(qr) + before = {p.iccid for p in self.list_profiles()} + + def _run() -> None: + client = self._ensure_client() + iccid = download_profile(client, qr) + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid for profile in self.list_profiles()), + "Profile add may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile add did not finish cleanly; refresh profiles and retry", + ) + + self._with_lpa_error(_run) + + if nickname: + after = self.list_profiles() + new_profile = next((p for p in after if p.iccid not in before), None) + if new_profile is not None and new_profile.iccid: + self.nickname_profile(new_profile.iccid, nickname) + + def nickname_profile(self, iccid: str, nickname: str) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + set_profile_nickname(self._ensure_client(), iccid, nickname) + self._with_lpa_error(_run) + + def switch_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + self._ensure_switchable_profile(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + return + + def _run() -> None: + client = self._ensure_client() + use_refresh = self._is_eg25 + try: + enable_profile(client, iccid, refresh=use_refresh) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + enable_profile(client, iccid, refresh=use_refresh) + else: + raise + client.channel = None + client._use_csim = False + if use_refresh: + self._wait_for_modem() + else: + self._restart_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile switch may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile switch did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + # Compatibility methods retained for old tests/scripts. + def process_notifications(self) -> None: + def _run() -> None: + process_notifications(self._ensure_client()) + self._with_lpa_error(_run) + + def enable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + enable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile enable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile enable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + def disable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + disable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and not profile.enabled for profile in self.list_profiles()), + "Profile disable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile disable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + +# --- CLI --- + +def main() -> None: + parser = argparse.ArgumentParser(description="Minimal AT-only LPA implementation") + parser.add_argument("--device", default=DEFAULT_DEVICE) + parser.add_argument("--baud", type=int, default=DEFAULT_BAUD) + parser.add_argument("--timeout", type=float, default=DEFAULT_TIMEOUT) + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--enable", type=str) + parser.add_argument("--disable", type=str) + parser.add_argument("--delete", type=str, metavar="ICCID", help="Delete a disabled profile") + parser.add_argument("--no-refresh", action="store_true", help="Skip REFRESH after enable/disable") + parser.add_argument("--set-nickname", nargs=2, metavar=("ICCID", "NICKNAME")) + parser.add_argument("--list-notifications", action="store_true") + parser.add_argument("--process-notifications", action="store_true") + parser.add_argument("--download", type=str, metavar="CODE") + args = parser.parse_args() + + lpa = TiciLPA(device=args.device, baud=args.baud, timeout=args.timeout, verbose=args.verbose) + + if args.enable: + lpa.enable_profile(args.enable, refresh=not args.no_refresh) + elif args.disable: + lpa.disable_profile(args.disable, refresh=not args.no_refresh) + elif args.delete: + lpa.delete_profile(args.delete) + elif args.set_nickname: + lpa.nickname_profile(args.set_nickname[0], args.set_nickname[1]) + elif args.list_notifications: + with lpa._open_client() as client: + print(json.dumps(list_notifications(client), indent=2)) + return + elif args.process_notifications: + lpa.process_notifications() + return + elif args.download: + lpa.download_profile(args.download) + + profiles_out = [{ + "iccid": p.iccid, + "profileNickname": p.nickname, + "profileState": "enabled" if p.enabled else "disabled", + "serviceProviderName": p.provider, + } for p in lpa.list_profiles()] + print(json.dumps(profiles_out, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py new file mode 100644 index 000000000..d53183f7a --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/_iqclosure/iqpilot/system/hardware/tici/pins.py @@ -0,0 +1,30 @@ +# GPIO pin definitions +class GPIO: + # both GPIO_STM_RST_N and GPIO_LTE_RST_N are misnamed, they are high to reset + HUB_RST_N = 30 + UBLOX_RST_N = 32 + UBLOX_SAFEBOOT_N = 33 + GNSS_PWR_EN = 34 # SCHEMATIC LABEL: GPIO_UBLOX_PWR_EN + + STM_RST_N = 124 + STM_BOOT0 = 134 + STM_PWR_EN_N = 41 # because STM32H7 RST doesn't generate a full power-on-reset + + SIREN = 42 + SOM_ST_IO = 49 + + LTE_RST_N = 50 + LTE_PWRKEY = 116 + LTE_BOOT = 52 + + # GPIO_CAM0_DVDD_EN = /sys/kernel/debug/regulator/camera_rear_ldo + CAM0_AVDD_EN = 8 + CAM0_RSTN = 9 + CAM1_RSTN = 7 + CAM2_RSTN = 12 + + # Sensor interrupts + BMX055_ACCEL_INT = 21 + BMX055_GYRO_INT = 23 + BMX055_MAGN_INT = 87 + LSM_INT = 84 diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_navd_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..8c01230a6 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.py b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.py new file mode 100644 index 000000000..5161d7261 --- /dev/null +++ b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright ÂŠī¸ Project Teal Lvbs Licensed Under MIT License +""" diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/alpr_matcher.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/alpr_matcher.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..a65bd05a8 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/alpr_matcher.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/amap_client.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/amap_client.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..fb6dfc4dc Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/amap_client.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..bd35becf7 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..6dfe5daa2 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/incident_feed.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/incident_feed.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..ab4e17737 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/incident_feed.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..975d09ef3 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..da7445b64 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..30d3aa23d Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..cf2872da8 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_turn_signals.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_turn_signals.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..5c2ad19d0 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_turn_signals.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..9b1c09f73 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navincidentd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navincidentd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..46dfa6cc6 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navincidentd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..f772bb920 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..e1a1e021e Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..b60412bbe Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/road_incidents.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/road_incidents.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..3782626d8 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/road_incidents.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..f231af450 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..23397d0f0 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..2c4cdc159 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic_sources.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic_sources.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..bc22c99b7 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic_sources.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic_writer.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic_writer.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..1a0992dd7 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/traffic_writer.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..8b5f80ba2 Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/valhalla_process.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/valhalla_process.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..ba2de2caa Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/valhalla_process.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..78a84d4ea Binary files /dev/null and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_updater_private/manifest.json b/artifacts/iqpilot_updater_private/manifest.json new file mode 100644 index 000000000..d484b4641 --- /dev/null +++ b/artifacts/iqpilot_updater_private/manifest.json @@ -0,0 +1,51 @@ +{ + "python/_iqclosure/_vendored.json": { + "mode": 420, + "sha256": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570", + "size": 3 + }, + "python/iqpilot_private/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/updater/__init__.py": { + "mode": 420, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "size": 0 + }, + "python/iqpilot_private/updater/_hf_maps_blob.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "69b858142aeb82cf730f042f6bc354dabb19579654872eaed3f73d482a856802", + "size": 67616 + }, + "python/iqpilot_private/updater/_iqos_pat_blob.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "d8d9ccc3059b6239f2be41437e97b160b96278e419d84f9c0c243a2ba3ebf94c", + "size": 67616 + }, + "python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "cea69f651768732bcbbd1a7edff668876dcf6787c332e859f6f01c945d74cbe0", + "size": 67616 + }, + "python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "384782451d53a5ca89809f05bf5c68577596dfbaca3f2f82bb0a972663897491", + "size": 136608 + }, + "runtime": { + "entries": { + "iqpilot_private.updater.git_remote": { + "path": "python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + } + } + }, + "signatures": { + "python/iqpilot_private/updater/_hf_maps_blob.cpython-312-aarch64-linux-gnu.so": "2hlUdv1cuGpzNrKoSx3VqRGdaVsgkkGhiHKBirfYkEwJmQJizQ966d6iZQoIzh8LEmRdhi+77iLFXQiEWApSDQ==", + "python/iqpilot_private/updater/_iqos_pat_blob.cpython-312-aarch64-linux-gnu.so": "EHoKO6/esRwuP7oxR9a5FXiQVPjh+3CmtXS1jNQor7yOpra/LijNPHvvu423y+vlOn1KkVCbhZgaHrsB/3oJDA==", + "python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so": "oqWDyKXImMpVEHwBohGW1nL7oZaNMu12aP/zMfowkjDAsHZJOM+TOicUNketIi990nJMbhApcJk3zpoM+1nGCw==", + "python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so": "xp2MN37LX95Rbt3zGC/ZysyTCv8wUi6xpzbHoTLMwRfq4cDpWafItWgFiypcn5ANsAQA7weqMbihmtq6EbV3Bg==" + } +} diff --git a/artifacts/iqpilot_updater_private/manifest.json.sig b/artifacts/iqpilot_updater_private/manifest.json.sig new file mode 100644 index 000000000..3c650df70 --- /dev/null +++ b/artifacts/iqpilot_updater_private/manifest.json.sig @@ -0,0 +1 @@ +Q62ipKl3jmGXHvKYVnhQY7sk4ZSS7AmhXf23DY4sYqoTP7hn9WDDlQD82bMhQJdcY+Obcr9fRn1EGmGTuMUjDw== diff --git a/artifacts/iqpilot_updater_private/python/_iqclosure/_vendored.json b/artifacts/iqpilot_updater_private/python/_iqclosure/_vendored.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/artifacts/iqpilot_updater_private/python/_iqclosure/_vendored.json @@ -0,0 +1 @@ +[] diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/__init__.py b/artifacts/iqpilot_updater_private/python/iqpilot_private/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/__init__.py b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_hf_maps_blob.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_hf_maps_blob.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..aabbbf8e3 Binary files /dev/null and b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_hf_maps_blob.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_iqos_pat_blob.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_iqos_pat_blob.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..168c4883c Binary files /dev/null and b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_iqos_pat_blob.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..b4bc7150a Binary files /dev/null and b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 000000000..372c9b9eb Binary files /dev/null and b/artifacts/iqpilot_updater_private/python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_valhalla_runtime/manifest.json b/artifacts/iqpilot_valhalla_runtime/manifest.json new file mode 100644 index 000000000..130eba222 --- /dev/null +++ b/artifacts/iqpilot_valhalla_runtime/manifest.json @@ -0,0 +1,234 @@ +{ + "valhalla_runtime/bin/valhalla_service": { + "sha256": "6bef5c4ca7e1eb385ac1ae00d9ee20924a81a33f3e59c2b644d31430720d408d", + "size": 10754496 + }, + "valhalla_runtime/lib/libLerc.so.4": { + "sha256": "8148fbb2d121a08abf6ffe493a4994086eb43a785059871dbee1647ce115305b", + "size": 526288 + }, + "valhalla_runtime/lib/libbrotlicommon.so.1": { + "sha256": "016600f673a5d1a565cf98f608d8425033593ab78827eccc3384596f70386c8c", + "size": 198784 + }, + "valhalla_runtime/lib/libbrotlidec.so.1": { + "sha256": "b7895f0fd4ad47408cb01fcb959ae6792804c15512526166f9bf48358714d0b5", + "size": 67688 + }, + "valhalla_runtime/lib/libbsd.so.0": { + "sha256": "6c5348ee0e1777f13e148b7492fa311b6f65adb0dc21a001a67ebc18948e6b3e", + "size": 133944 + }, + "valhalla_runtime/lib/libcap.so.2": { + "sha256": "c2f7d3a8594ea3a24b8ffcea8f929e8fbd0d6c24256f8ece625f0be6a3d4e1f0", + "size": 67704 + }, + "valhalla_runtime/lib/libcom_err.so.2": { + "sha256": "6a9d07af8817ed06466027a77fc7f2e8972a4a0e68895738d9acdc35470f416e", + "size": 67432 + }, + "valhalla_runtime/lib/libcrypto.so.3": { + "sha256": "3d51e64ad7113b2ab863b9582866ad2b31e545d1fe9f197c634a65a8f2611786", + "size": 4597928 + }, + "valhalla_runtime/lib/libcurl-gnutls.so.4": { + "sha256": "d739419f4c0abc68119f407f24f3eca0283ad510ed022c90f5f7b0c2a04d249d", + "size": 732568 + }, + "valhalla_runtime/lib/libcurl.so.4": { + "sha256": "b9764fa500494d831b6b5766e9191d1946f1dcd76f2a011aee9707f0831f0828", + "size": 798104 + }, + "valhalla_runtime/lib/libczmq.so.4": { + "sha256": "5a066a2015cf9fd5fca00a82702802538c3500e5bc26123e60da433d421ef308", + "size": 526736 + }, + "valhalla_runtime/lib/libdeflate.so.0": { + "sha256": "fc8c2ebe21ec4eebfccabcd6618b216a1bcf9a55dfc38c5af26e3b0ab835f4eb", + "size": 67384 + }, + "valhalla_runtime/lib/libffi.so.8": { + "sha256": "9dd873a938c4d7df76912d01f6a28aa4aa73d583bd20485a0dbfe5aa9673a191", + "size": 67944 + }, + "valhalla_runtime/lib/libgcrypt.so.20": { + "sha256": "763eeb8f170de52b8bc7268eaf433f72f03c980c04511130229a338a0ee2bb06", + "size": 1000536 + }, + "valhalla_runtime/lib/libgeotiff.so.5": { + "sha256": "8777a15c365f87f0d20d177600bea9cf23633e04841914e5fba7245603bf59fa", + "size": 264144 + }, + "valhalla_runtime/lib/libgmp.so.10": { + "sha256": "39b6701812ed7135f28df49352b3f6664c7a9f56880a3fe50c1b87cd7681db9b", + "size": 526632 + }, + "valhalla_runtime/lib/libgnutls.so.30": { + "sha256": "6b12c4675dbf7fca76bd47228f22b19f4218bc8c72e2f8b5cb6de172dee14961", + "size": 2171912 + }, + "valhalla_runtime/lib/libgpg-error.so.0": { + "sha256": "ff2dccba4993ef97775b70c1ed1144f70dfe8581ee48c1eb25c76878c6cdfdf7", + "size": 198648 + }, + "valhalla_runtime/lib/libgssapi_krb5.so.2": { + "sha256": "35790a9f5a49b1368614a485cb6ba7cc54cb34560831da1bda657f2502641624", + "size": 334304 + }, + "valhalla_runtime/lib/libhogweed.so.6": { + "sha256": "0495ad11a2266d7300436d57859fc8ebceac79e5235a393c42ae91d6fc23ce84", + "size": 329656 + }, + "valhalla_runtime/lib/libidn2.so.0": { + "sha256": "34a2427db57d47458b460ab15a24e7de73b56fbc7b458af837556445f60ffb4e", + "size": 132968 + }, + "valhalla_runtime/lib/libjbig.so.0": { + "sha256": "edfa3b74da686481be974c3f514dbe8487ad8faf258b634ab4227d98b33cb888", + "size": 78448 + }, + "valhalla_runtime/lib/libjpeg.so.8": { + "sha256": "d45014b67ae6df2f15c8fb3e86d37b78375deede47ef73b7c61e8b6b28c8223f", + "size": 395264 + }, + "valhalla_runtime/lib/libk5crypto.so.3": { + "sha256": "35b10e68ef45885838026423e2ea0b4a9fc12fa804081f9806b95bc18512094f", + "size": 198920 + }, + "valhalla_runtime/lib/libkeyutils.so.1": { + "sha256": "a58e06275e8e2010be20f367b7f2263e56130c04cb83523f29ae94555705ea59", + "size": 67432 + }, + "valhalla_runtime/lib/libkrb5.so.3": { + "sha256": "b411523bb29d8aef30f208c91bcead2bd8b8a64067e891686e33fe6a00369663", + "size": 859904 + }, + "valhalla_runtime/lib/libkrb5support.so.0": { + "sha256": "05fe1c19d3717a12d3a6237daa8c71604237f30b723c0a9bc40b7b759a69f9a2", + "size": 68192 + }, + "valhalla_runtime/lib/liblber.so.2": { + "sha256": "92e756c779c3fa77c4e8ad1ef0d97ebc2eaeccb2f9829da521691c52df4129d5", + "size": 67792 + }, + "valhalla_runtime/lib/libldap.so.2": { + "sha256": "6d3332e01734a21c0b1b18e993d6117a31f8227d3859556397704f266e18e262", + "size": 396656 + }, + "valhalla_runtime/lib/liblz4.so.1": { + "sha256": "d1482a2f74152881d8b83708fedae7bca039f5608024f1178dc21a17df9887a7", + "size": 133136 + }, + "valhalla_runtime/lib/liblzma.so.5": { + "sha256": "cb4d37d810d354f1c3be46bd2897ba47c9f7388da7e6470a79e3accfa8e81f41", + "size": 198584 + }, + "valhalla_runtime/lib/libmd.so.0": { + "sha256": "30d117046ce9405745e0d0d4722cff121f532913180bbb9425b38d076319ac08", + "size": 67584 + }, + "valhalla_runtime/lib/libnettle.so.8": { + "sha256": "8fd8ed433f1b993fe8b8aa8d3fa5342955ab581dc5ce418381872cd3df3dbb11", + "size": 395272 + }, + "valhalla_runtime/lib/libnghttp2.so.14": { + "sha256": "943724df4606c5eaeb47b2371da22d08fa3870249cfe90c84cef8e57ed6d8db5", + "size": 198768 + }, + "valhalla_runtime/lib/libnorm.so.1": { + "sha256": "31ec03ead2addce2d5e017e641750bd9612a9250faac2b408b669de1182428b7", + "size": 395208 + }, + "valhalla_runtime/lib/libp11-kit.so.0": { + "sha256": "10a0b7558d6cac2d777cc39a673f85ada4bfc4be7d8a2f2516e00999154b68a4", + "size": 1889776 + }, + "valhalla_runtime/lib/libpgm-5.3.so.0": { + "sha256": "bd9cf5ac5a861376c67579b8b62357df29722242aa3b47c849ae1faec24e4e92", + "size": 330392 + }, + "valhalla_runtime/lib/libprime_server.so.0": { + "sha256": "e8a7afac9407ab2119bd1d4183037577dc19e87068a09bb7d0424895f07fa4f6", + "size": 6565856 + }, + "valhalla_runtime/lib/libproj.so.25": { + "sha256": "7db50e4d982d2535c39403f27596a53ac98f1bd5f9877d43f2bd828a023a732c", + "size": 3740296 + }, + "valhalla_runtime/lib/libprotobuf-lite.so.32": { + "sha256": "e87c7af5028f82824bbff41f892c7d6d1f9c844870890bc3621f338f280007b4", + "size": 854904 + }, + "valhalla_runtime/lib/libpsl.so.5": { + "sha256": "95bd0ee93925255421d4f2adc621ac26e451fae04f613c8edd368c288be43488", + "size": 132888 + }, + "valhalla_runtime/lib/libresolv.so.2": { + "sha256": "e79ba5df3dc6e7d1bc67b16a49f13337ba46bbb01be1c896f0bdfd8e91c8e9f7", + "size": 67720 + }, + "valhalla_runtime/lib/librtmp.so.1": { + "sha256": "0e449c6660fb3dc7e06c56034f41106e9cf48a3baf5d30c1e0b53a48276d0c51", + "size": 133928 + }, + "valhalla_runtime/lib/libsasl2.so.2": { + "sha256": "f936a889bcc2d8b5ac8b89e2b37e4359bbd87cbbe87bd2b2002358dfffe04cce", + "size": 133800 + }, + "valhalla_runtime/lib/libsharpyuv.so.0": { + "sha256": "aa4617020b4bc450ef4382ea93ab3d6bef6571433498794a9b88a5675d52fe6d", + "size": 67520 + }, + "valhalla_runtime/lib/libsodium.so.23": { + "sha256": "3b72f199720e9382acdc372a944fdee980dac2f7fe2e8f6b1eed38843bc6544f", + "size": 264384 + }, + "valhalla_runtime/lib/libsqlite3.so.0": { + "sha256": "43ba1659a6113bb4360f4a6da9e465bca6403d7d1f376015d5a57901ee5639b6", + "size": 1526192 + }, + "valhalla_runtime/lib/libssh.so.4": { + "sha256": "41b9c6f2b4ad8930bc089f8f8e3b483d2d8f0760f9a7aca721a207c1286e7bde", + "size": 466056 + }, + "valhalla_runtime/lib/libssl.so.3": { + "sha256": "f23c6de6c41fb0ecc159f1af052cae3b525de697fae242290e656a242e7bc25d", + "size": 737192 + }, + "valhalla_runtime/lib/libsystemd.so.0": { + "sha256": "f1db21e4bb449d1844ac033d7b6f2e3921e140f386370a4a32f9043ea1437b9e", + "size": 989464 + }, + "valhalla_runtime/lib/libtasn1.so.6": { + "sha256": "039d653f8fdfa01240882b0033aca6887e1e9e6dc39acbea51d658fa75437955", + "size": 133048 + }, + "valhalla_runtime/lib/libtiff.so.6": { + "sha256": "96c0ab894fc511a760a08d33e53083aa9fc95f7bdfd3c3bd81cfdbdf26b592db", + "size": 591816 + }, + "valhalla_runtime/lib/libunistring.so.5": { + "sha256": "639c4c15f94e960450b69475d7282e4760fd5895a6a4f4e85f44bb15b74e512c", + "size": 1771448 + }, + "valhalla_runtime/lib/libuuid.so.1": { + "sha256": "58d35ebee086e9f858cd3e597236f1d744e587a216330e3f1d5f1e9ad011c55c", + "size": 67576 + }, + "valhalla_runtime/lib/libwebp.so.7": { + "sha256": "d921459ab6508b3239218b0e4c2e44dbd2e702aeff4273190bf25d2036373930", + "size": 395616 + }, + "valhalla_runtime/lib/libz.so.1": { + "sha256": "170380b4e7ab28ec86eb090b48df90f84089392cb72fecd5067e5b7a4dc5239f", + "size": 133272 + }, + "valhalla_runtime/lib/libzmq.so.5": { + "sha256": "1d986e7d5a45493b6adce97808ec5307d6c625ea4921e074023481521c2af4d9", + "size": 659312 + }, + "valhalla_runtime/lib/libzstd.so.1": { + "sha256": "fe726238b170b83aa83bf1f8a79109b8b61b9eb45234304511d093bbe5f5fb20", + "size": 657432 + } +} diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/bin/valhalla_service b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/bin/valhalla_service new file mode 100755 index 000000000..5079b847c Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/bin/valhalla_service differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libLerc.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libLerc.so.4 new file mode 100644 index 000000000..bb7ed607b Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libLerc.so.4 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlicommon.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlicommon.so.1 new file mode 100644 index 000000000..abf0f2119 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlicommon.so.1 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlidec.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlidec.so.1 new file mode 100644 index 000000000..408f42eca Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbrotlidec.so.1 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbsd.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbsd.so.0 new file mode 100644 index 000000000..1bdd2de12 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libbsd.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcap.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcap.so.2 new file mode 100644 index 000000000..a44fd1ff1 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcap.so.2 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcom_err.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcom_err.so.2 new file mode 100644 index 000000000..b35b04b2f Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcom_err.so.2 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcrypto.so.3 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcrypto.so.3 new file mode 100644 index 000000000..cae87834e Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcrypto.so.3 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl-gnutls.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl-gnutls.so.4 new file mode 100644 index 000000000..8633971a0 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl-gnutls.so.4 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl.so.4 new file mode 100644 index 000000000..5c8bc4381 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libcurl.so.4 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libczmq.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libczmq.so.4 new file mode 100644 index 000000000..6492ee5b3 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libczmq.so.4 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libdeflate.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libdeflate.so.0 new file mode 100644 index 000000000..dc310b344 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libdeflate.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libffi.so.8 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libffi.so.8 new file mode 100644 index 000000000..b61badf40 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libffi.so.8 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgcrypt.so.20 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgcrypt.so.20 new file mode 100644 index 000000000..12edbbeb1 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgcrypt.so.20 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgeotiff.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgeotiff.so.5 new file mode 100644 index 000000000..2f0ee5f90 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgeotiff.so.5 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgmp.so.10 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgmp.so.10 new file mode 100644 index 000000000..bc27e7805 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgmp.so.10 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgnutls.so.30 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgnutls.so.30 new file mode 100644 index 000000000..918f69314 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgnutls.so.30 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgpg-error.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgpg-error.so.0 new file mode 100644 index 000000000..902811740 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgpg-error.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgssapi_krb5.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgssapi_krb5.so.2 new file mode 100644 index 000000000..9971c8381 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libgssapi_krb5.so.2 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libhogweed.so.6 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libhogweed.so.6 new file mode 100644 index 000000000..9e2729217 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libhogweed.so.6 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libidn2.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libidn2.so.0 new file mode 100644 index 000000000..cc368662a Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libidn2.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjbig.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjbig.so.0 new file mode 100644 index 000000000..401a46bfa Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjbig.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjpeg.so.8 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjpeg.so.8 new file mode 100644 index 000000000..11a9d2e43 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libjpeg.so.8 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libk5crypto.so.3 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libk5crypto.so.3 new file mode 100644 index 000000000..d5ebf4147 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libk5crypto.so.3 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkeyutils.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkeyutils.so.1 new file mode 100644 index 000000000..d94048b4b Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkeyutils.so.1 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5.so.3 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5.so.3 new file mode 100644 index 000000000..4138f0102 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5.so.3 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5support.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5support.so.0 new file mode 100644 index 000000000..6946197cf Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libkrb5support.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblber.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblber.so.2 new file mode 100644 index 000000000..9ea129ee9 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblber.so.2 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libldap.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libldap.so.2 new file mode 100644 index 000000000..3c4871c4f Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libldap.so.2 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblz4.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblz4.so.1 new file mode 100644 index 000000000..1b3cb2ee1 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblz4.so.1 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblzma.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblzma.so.5 new file mode 100644 index 000000000..c14c6ffbd Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/liblzma.so.5 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libmd.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libmd.so.0 new file mode 100644 index 000000000..890210262 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libmd.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnettle.so.8 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnettle.so.8 new file mode 100644 index 000000000..4e32dde37 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnettle.so.8 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnghttp2.so.14 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnghttp2.so.14 new file mode 100644 index 000000000..f211c1a82 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnghttp2.so.14 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnorm.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnorm.so.1 new file mode 100644 index 000000000..2c3c240ec Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libnorm.so.1 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libp11-kit.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libp11-kit.so.0 new file mode 100644 index 000000000..21760a0b9 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libp11-kit.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpgm-5.3.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpgm-5.3.so.0 new file mode 100644 index 000000000..bb659d72d Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpgm-5.3.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprime_server.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprime_server.so.0 new file mode 100644 index 000000000..3883d0a23 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprime_server.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libproj.so.25 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libproj.so.25 new file mode 100644 index 000000000..d8f30ad0c Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libproj.so.25 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprotobuf-lite.so.32 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprotobuf-lite.so.32 new file mode 100644 index 000000000..81b6b10af Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libprotobuf-lite.so.32 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpsl.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpsl.so.5 new file mode 100644 index 000000000..9c4ea4fd7 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libpsl.so.5 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libresolv.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libresolv.so.2 new file mode 100644 index 000000000..06360ad60 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libresolv.so.2 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/librtmp.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/librtmp.so.1 new file mode 100644 index 000000000..01d7d1ac6 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/librtmp.so.1 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsasl2.so.2 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsasl2.so.2 new file mode 100644 index 000000000..badf01bec Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsasl2.so.2 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsharpyuv.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsharpyuv.so.0 new file mode 100644 index 000000000..110fc6ad1 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsharpyuv.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsodium.so.23 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsodium.so.23 new file mode 100644 index 000000000..a87cb1166 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsodium.so.23 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsqlite3.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsqlite3.so.0 new file mode 100644 index 000000000..247df7fb0 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsqlite3.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssh.so.4 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssh.so.4 new file mode 100644 index 000000000..2ef5c4a4c Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssh.so.4 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssl.so.3 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssl.so.3 new file mode 100644 index 000000000..7b76fec8c Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libssl.so.3 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsystemd.so.0 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsystemd.so.0 new file mode 100644 index 000000000..a5a91c085 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libsystemd.so.0 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtasn1.so.6 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtasn1.so.6 new file mode 100644 index 000000000..145a1902d Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtasn1.so.6 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtiff.so.6 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtiff.so.6 new file mode 100644 index 000000000..e4146021a Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libtiff.so.6 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libunistring.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libunistring.so.5 new file mode 100644 index 000000000..b44518b9f Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libunistring.so.5 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libuuid.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libuuid.so.1 new file mode 100644 index 000000000..0e10134e9 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libuuid.so.1 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libwebp.so.7 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libwebp.so.7 new file mode 100644 index 000000000..dd228789b Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libwebp.so.7 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libz.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libz.so.1 new file mode 100644 index 000000000..16dce3683 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libz.so.1 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzmq.so.5 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzmq.so.5 new file mode 100644 index 000000000..daaff4150 Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzmq.so.5 differ diff --git a/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzstd.so.1 b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzstd.so.1 new file mode 100644 index 000000000..5e592595e Binary files /dev/null and b/artifacts/iqpilot_valhalla_runtime/valhalla_runtime/lib/libzstd.so.1 differ diff --git a/artifacts/package_runtime/iqdbc/__init__.py b/artifacts/package_runtime/iqdbc/__init__.py new file mode 100644 index 000000000..fcee77210 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/__init__.py @@ -0,0 +1,6 @@ +import os + +DBC_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'dbc') + +# -I include path for e.g. "#include " +INCLUDE_PATH = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../")) diff --git a/artifacts/package_runtime/iqdbc/can/__init__.py b/artifacts/package_runtime/iqdbc/can/__init__.py new file mode 100644 index 000000000..f4f57ddd2 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/__init__.py @@ -0,0 +1,8 @@ +from iqdbc.can.packer import CANPacker +from iqdbc.can.parser import CANParser, CANDefine + +__all__ = [ + "CANDefine", + "CANParser", + "CANPacker", +] diff --git a/artifacts/package_runtime/iqdbc/can/dbc.py b/artifacts/package_runtime/iqdbc/can/dbc.py new file mode 100644 index 000000000..524207633 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/dbc.py @@ -0,0 +1,217 @@ +import re +import os +from collections.abc import Callable +from dataclasses import dataclass +from functools import cache + +from iqdbc import DBC_PATH + +# TODO: these should just be passed in along with the DBC file +from iqdbc.car.honda.hondacan import honda_checksum +from iqdbc.car.toyota.toyotacan import toyota_checksum +from iqdbc.car.subaru.subarucan import subaru_checksum +from iqdbc.car.chrysler.chryslercan import chrysler_checksum, fca_giorgio_checksum +from iqdbc.car.hyundai.hyundaicanfd import hkg_can_fd_checksum +from iqdbc.car.volkswagen.mlbcan import volkswagen_mlb_checksum +from iqdbc.car.volkswagen.mqbcan import volkswagen_mqb_meb_checksum, volkswagen_mqb_meb_gen2_checksum, xor_checksum +from iqdbc.car.tesla.teslacan import tesla_checksum +from iqdbc.car.body.bodycan import body_checksum +from iqdbc.car.psa.psacan import psa_checksum + + +class SignalType: + DEFAULT = 0 + COUNTER = 1 + HONDA_CHECKSUM = 2 + TOYOTA_CHECKSUM = 3 + BODY_CHECKSUM = 4 + VOLKSWAGEN_MQB_MEB_CHECKSUM = 5 + XOR_CHECKSUM = 6 + SUBARU_CHECKSUM = 7 + CHRYSLER_CHECKSUM = 8 + HKG_CAN_FD_CHECKSUM = 9 + FCA_GIORGIO_CHECKSUM = 10 + TESLA_CHECKSUM = 11 + PSA_CHECKSUM = 12 + VOLKSWAGEN_MLB_CHECKSUM = 13 + VOLKSWAGEN_MQB_MEB_GEN2_CHECKSUM = 14 + + +@dataclass +class Signal: + name: str + start_bit: int + msb: int + lsb: int + size: int + is_signed: bool + factor: float + offset: float + is_little_endian: bool + type: int = SignalType.DEFAULT + calc_checksum: 'Callable[[int, Signal, bytearray], int] | None' = None + + +@dataclass +class Msg: + name: str + address: int + size: int + sigs: dict[str, Signal] + + +@dataclass +class Val: + name: str + address: int + def_val: str + sigs: dict[str, Signal] | None = None + + +BO_RE = re.compile(r"^BO_ (\w+) (\w+) *: (\w+) (\w+)") +SG_RE = re.compile(r"^SG_ (\w+) : (\d+)\|(\d+)@(\d)([+-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[[0-9.+\-eE]+\|[0-9.+\-eE]+\] \".*\" .*") +SGM_RE = re.compile(r"^SG_ (\w+) (\w+) *: (\d+)\|(\d+)@(\d)([+-]) \(([0-9.+\-eE]+),([0-9.+\-eE]+)\) \[[0-9.+\-eE]+\|[0-9.+\-eE]+\] \".*\" .*") +VAL_RE = re.compile(r"^VAL_ (\w+) (\w+) (.*);") +VAL_SPLIT_RE = re.compile(r'["]+') + + +@cache +class DBC: + def __init__(self, name: str): + dbc_path = name + if not os.path.exists(dbc_path): + dbc_path = os.path.join(DBC_PATH, name + ".dbc") + + self._parse(dbc_path) + + def _parse(self, path: str): + self.name = os.path.basename(path).replace(".dbc", "") + with open(path) as f: + lines = f.readlines() + + checksum_state = get_checksum_state(self.name) + be_bits = [j + i * 8 for i in range(64) for j in range(7, -1, -1)] + self.msgs: dict[int, Msg] = {} + self.addr_to_msg: dict[int, Msg] = {} + self.name_to_msg: dict[str, Msg] = {} + self.vals: list[Val] = [] + address = 0 + signals_temp: dict[int, dict[str, Signal]] = {} + for line_num, line in enumerate(lines, 1): + line = line.strip() + if line.startswith("BO_ "): + m = BO_RE.match(line) + if not m: + continue + address = int(m.group(1), 0) + msg_name = m.group(2) + size = int(m.group(3), 0) + sigs = {} + self.msgs[address] = Msg(msg_name, address, size, sigs) + self.addr_to_msg[address] = self.msgs[address] + self.name_to_msg[msg_name] = self.msgs[address] + signals_temp[address] = sigs + elif line.startswith("SG_ "): + m = SG_RE.search(line) + offset = 0 + if not m: + m = SGM_RE.search(line) + if not m: + continue + offset = 1 + sig_name = m.group(1) + start_bit = int(m.group(2 + offset)) + size = int(m.group(3 + offset)) + is_little_endian = m.group(4 + offset) == "1" + is_signed = m.group(5 + offset) == "-" + factor = float(m.group(6 + offset)) + offset_val = float(m.group(7 + offset)) + + if is_little_endian: + lsb = start_bit + msb = start_bit + size - 1 + else: + idx = be_bits.index(start_bit) + lsb = be_bits[idx + size - 1] + msb = start_bit + + sig = Signal(sig_name, start_bit, msb, lsb, size, is_signed, factor, offset_val, is_little_endian) + set_signal_type(sig, checksum_state, self.name, line_num) + signals_temp[address][sig_name] = sig + elif line.startswith("VAL_ "): + m = VAL_RE.search(line) + if not m: + continue + val_addr = int(m.group(1), 0) + sgname = m.group(2) + defs = m.group(3) + words = [w.strip() for w in VAL_SPLIT_RE.split(defs) if w.strip()] + words = [w.upper().replace(" ", "_") for w in words] + val_def = " ".join(words).strip() + self.vals.append(Val(sgname, val_addr, val_def)) + for addr, sigs in signals_temp.items(): + self.msgs[addr].sigs = sigs + + +# ***** checksum functions ***** + +def tesla_setup_signal(sig: Signal, dbc_name: str, line_num: int) -> None: + if sig.name.endswith("Counter"): + sig.type = SignalType.COUNTER + elif sig.name.endswith("Checksum"): + sig.type = SignalType.TESLA_CHECKSUM + sig.calc_checksum = tesla_checksum + + +@dataclass +class ChecksumState: + checksum_size: int + counter_size: int + checksum_start_bit: int + counter_start_bit: int + little_endian: bool + checksum_type: int + calc_checksum: Callable[[int, Signal, bytearray], int] | None + setup_signal: Callable[[Signal, str, int], None] | None = None + + +def get_checksum_state(dbc_name: str) -> ChecksumState | None: + if dbc_name.startswith(("honda_", "acura_")): + return ChecksumState(4, 2, 3, 5, False, SignalType.HONDA_CHECKSUM, honda_checksum) + elif dbc_name.startswith(("toyota_", "lexus_")): + return ChecksumState(8, -1, 7, -1, False, SignalType.TOYOTA_CHECKSUM, toyota_checksum) + elif dbc_name.startswith("hyundai_canfd_generated"): + return ChecksumState(16, -1, 0, -1, True, SignalType.HKG_CAN_FD_CHECKSUM, hkg_can_fd_checksum) + elif dbc_name.startswith("vw_meb_2024"): + return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MQB_MEB_GEN2_CHECKSUM, volkswagen_mqb_meb_gen2_checksum) + elif dbc_name.startswith(("vw_mqb", "vw_mqbevo", "vw_meb")): + return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MQB_MEB_CHECKSUM, volkswagen_mqb_meb_checksum) + elif dbc_name.startswith("vw_mlb"): + return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MLB_CHECKSUM, volkswagen_mlb_checksum) + elif dbc_name.startswith("vw_pq"): + return ChecksumState(8, 4, 0, -1, True, SignalType.XOR_CHECKSUM, xor_checksum) + elif dbc_name.startswith("subaru_global_"): + return ChecksumState(8, -1, 0, -1, True, SignalType.SUBARU_CHECKSUM, subaru_checksum) + elif dbc_name.startswith("chrysler_"): + return ChecksumState(8, -1, 7, -1, False, SignalType.CHRYSLER_CHECKSUM, chrysler_checksum) + elif dbc_name.startswith("fca_giorgio"): + return ChecksumState(8, -1, 7, -1, False, SignalType.FCA_GIORGIO_CHECKSUM, fca_giorgio_checksum) + elif dbc_name.startswith("comma_body"): + return ChecksumState(8, 4, 7, 3, False, SignalType.BODY_CHECKSUM, body_checksum) + elif dbc_name.startswith(("tesla_model3_party", "tesla_model3_vehicle")): + return ChecksumState(8, -1, 0, -1, True, SignalType.TESLA_CHECKSUM, tesla_checksum, tesla_setup_signal) + elif dbc_name.startswith("psa_"): + return ChecksumState(4, 4, 7, 3, False, SignalType.PSA_CHECKSUM, psa_checksum) + return None + + +def set_signal_type(sig: Signal, chk: ChecksumState | None, dbc_name: str, line_num: int) -> None: + sig.calc_checksum = None + if chk: + if chk.setup_signal: + chk.setup_signal(sig, dbc_name, line_num) + if sig.name == "CHECKSUM": + sig.type = chk.checksum_type + sig.calc_checksum = chk.calc_checksum + elif sig.name == "COUNTER": + sig.type = SignalType.COUNTER diff --git a/artifacts/package_runtime/iqdbc/can/packer.py b/artifacts/package_runtime/iqdbc/can/packer.py new file mode 100644 index 000000000..610b75571 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/packer.py @@ -0,0 +1,72 @@ +import math + +from iqdbc.car.carlog import carlog +from iqdbc.can.dbc import DBC, Signal, SignalType + + +class CANPacker: + def __init__(self, dbc_name: str): + self.dbc = DBC(dbc_name) + self.counters: dict[int, int] = {} + + def pack(self, address: int, values: dict[str, float]) -> bytearray: + msg = self.dbc.addr_to_msg.get(address) + if msg is None: + carlog.error(f"msg not found for {address=}") + return bytearray() + dat = bytearray(msg.size) + counter_set = False + for name, value in values.items(): + sig = msg.sigs.get(name) + if sig is None: + carlog.error(f"unknown signal {name=} in {msg.name}") + continue + ival = int(math.floor((value - sig.offset) / sig.factor + 0.5)) + if ival < 0: + ival = (1 << sig.size) + ival + set_value(dat, sig, ival) + if sig.type == SignalType.COUNTER or sig.name == "COUNTER": + self.counters[address] = int(value) + counter_set = True + sig_counter = next((s for s in msg.sigs.values() if s.type == SignalType.COUNTER or s.name == "COUNTER"), None) + if sig_counter and not counter_set: + if address not in self.counters: + self.counters[address] = 0 + set_value(dat, sig_counter, self.counters[address]) + self.counters[address] = (self.counters[address] + 1) % (1 << sig_counter.size) + sig_checksum = next((s for s in msg.sigs.values() if s.type > SignalType.COUNTER), None) + if sig_checksum and sig_checksum.calc_checksum: + checksum = sig_checksum.calc_checksum(address, sig_checksum, dat) + set_value(dat, sig_checksum, checksum) + return dat + + def make_can_msg(self, name_or_addr, bus: int, values: dict[str, float], rx_counter: int | None = None): + if isinstance(name_or_addr, int): + addr = name_or_addr + else: + msg = self.dbc.name_to_msg.get(name_or_addr) + if msg is None: + carlog.error(f"msg not found for {name_or_addr=}") + return 0, b'', bus + addr = msg.address + pack_values = values if rx_counter is None else values | {"COUNTER": rx_counter} + dat = self.pack(addr, pack_values) + if len(dat) == 0: + return 0, b'', bus + return addr, bytes(dat), bus + + +def set_value(msg: bytearray, sig: Signal, ival: int) -> None: + i = sig.lsb // 8 + bits = sig.size + if sig.size < 64: + ival &= (1 << sig.size) - 1 + while 0 <= i < len(msg) and bits > 0: + shift = sig.lsb % 8 if (sig.lsb // 8) == i else 0 + size = min(bits, 8 - shift) + mask = ((1 << size) - 1) << shift + msg[i] &= ~mask + msg[i] |= (ival & ((1 << size) - 1)) << shift + bits -= size + ival >>= size + i = i + 1 if sig.is_little_endian else i - 1 diff --git a/artifacts/package_runtime/iqdbc/can/parser.py b/artifacts/package_runtime/iqdbc/can/parser.py new file mode 100644 index 000000000..0db42b18b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/parser.py @@ -0,0 +1,285 @@ +import math +import numbers +import time +from collections import defaultdict, deque +from dataclasses import dataclass, field + +from iqdbc.car.carlog import carlog +from iqdbc.can.dbc import DBC, Signal + + +MAX_BAD_COUNTER = 5 +CAN_INVALID_CNT = 5 + + +def get_raw_value(dat: bytes | bytearray, sig: Signal) -> int: + ret = 0 + i = sig.msb // 8 + bits = sig.size + while 0 <= i < len(dat) and bits > 0: + lsb = sig.lsb if (sig.lsb // 8) == i else i * 8 + msb = sig.msb if (sig.msb // 8) == i else (i + 1) * 8 - 1 + size = msb - lsb + 1 + d = (dat[i] >> (lsb - (i * 8))) & ((1 << size) - 1) + ret |= d << (bits - size) + bits -= size + i = i - 1 if sig.is_little_endian else i + 1 + return ret + + +@dataclass +class MessageState: + address: int + name: str + size: int + signals: list[Signal] + ignore_alive: bool = False + ignore_checksum: bool = False + ignore_counter: bool = False + frequency: float = 0.0 + timeout_threshold: float = 1e5 # default to 1Hz threshold + vals: list[float] = field(default_factory=list) + all_vals: list[list[float]] = field(default_factory=list) + timestamps: deque[int] = field(default_factory=lambda: deque(maxlen=500)) + counter: int = 0 + counter_fail: int = 0 + first_seen_nanos: int = 0 + last_warning_log_nanos: int = 0 + + def rate_limited_log(self, last_update_nanos: int, msg: str) -> None: + if (last_update_nanos - self.last_warning_log_nanos) >= 1_000_000_000: + carlog.warning(f"CANParser: {hex(self.address)} {self.name} {msg}") + self.last_warning_log_nanos = last_update_nanos + + def parse(self, nanos: int, dat: bytes) -> bool: + tmp_vals: list[float] = [0.0] * len(self.signals) + checksum_failed = False + counter_failed = False + + if self.first_seen_nanos == 0: + self.first_seen_nanos = nanos + + for i, sig in enumerate(self.signals): + tmp = get_raw_value(dat, sig) + if sig.is_signed: + tmp -= ((tmp >> (sig.size - 1)) & 0x1) * (1 << sig.size) + + if not self.ignore_checksum and sig.calc_checksum is not None: + expected_checksum = sig.calc_checksum(self.address, sig, bytearray(dat)) + if tmp != expected_checksum: + checksum_failed = True + self.rate_limited_log(nanos, f"checksum failed: received {hex(tmp)}, calculated {hex(expected_checksum)}") + + if not self.ignore_counter and sig.type == 1: # COUNTER + if not self.update_counter(tmp, sig.size): + counter_failed = True + + tmp_vals[i] = tmp * sig.factor + sig.offset + + # must have good counter and checksum to update data + if checksum_failed or counter_failed: + return False + + if not self.vals: + self.vals = [0.0] * len(self.signals) + self.all_vals = [[] for _ in self.signals] + + for i, v in enumerate(tmp_vals): + self.vals[i] = v + self.all_vals[i].append(v) + + self.timestamps.append(nanos) + + if self.frequency < 1e-5 and len(self.timestamps) >= 3: + dt = (self.timestamps[-1] - self.timestamps[0]) * 1e-9 + if (dt > 1.0 or (self.timestamps.maxlen is not None and len(self.timestamps) >= self.timestamps.maxlen)) and dt != 0: + self.frequency = min(len(self.timestamps) / dt, 100.0) + self.timeout_threshold = (1_000_000_000 / self.frequency) * 10 + return True + + def update_counter(self, cur_count: int, cnt_size: int) -> bool: + if ((self.counter + 1) & ((1 << cnt_size) - 1)) != cur_count: + self.counter_fail = min(self.counter_fail + 1, MAX_BAD_COUNTER) + elif self.counter_fail > 0: + self.counter_fail -= 1 + self.counter = cur_count + return self.counter_fail < MAX_BAD_COUNTER + + def valid(self, current_nanos: int, bus_timeout: bool) -> bool: + if self.ignore_alive: + return True + if not self.timestamps: + return False + if (current_nanos - self.timestamps[-1]) > self.timeout_threshold: + return False + return True + + +class VLDict(dict): + def __init__(self, parser): + super().__init__() + self.parser = parser + + def __getitem__(self, key): + if key not in self: + self.parser._add_message(key) + return super().__getitem__(key) + + +class CANParser: + def __init__(self, dbc_name: str, messages: list[tuple[str | int, int]], bus: int): + self.dbc_name: str = dbc_name + self.bus: int = bus + self.dbc: DBC = DBC(dbc_name) + + self.vl: dict[int | str, dict[str, float]] = VLDict(self) + self.vl_all: dict[int | str, dict[str, list[float]]] = {} + self.ts_nanos: dict[int | str, dict[str, int]] = {} + self.dat: dict[int | str, bytes] = {} + self.addresses: set[int] = set() + self.seen_addresses: set[int] = set() + self.enable_capture: bool = True + self.controls_ready: bool = False + self.message_states: dict[int, MessageState] = {} + + for name_or_addr, freq in messages: + if isinstance(name_or_addr, numbers.Number): + msg = self.dbc.addr_to_msg.get(int(name_or_addr)) + else: + msg = self.dbc.name_to_msg.get(name_or_addr) + if msg is None: + raise RuntimeError(f"could not find message {name_or_addr!r} in DBC {dbc_name}") + if msg.address in self.addresses: + raise RuntimeError("Duplicate Message Check: %d" % msg.address) + + self._add_message(name_or_addr, freq) + + self.can_invalid_cnt: int = CAN_INVALID_CNT + self.last_nonempty_nanos: int = 0 + self._last_update_nanos: int = 0 + + def _add_message(self, name_or_addr: str | int, freq: int | None = None, ignore_counter: bool = False) -> None: + if isinstance(name_or_addr, numbers.Number): + msg = self.dbc.addr_to_msg.get(int(name_or_addr)) + else: + msg = self.dbc.name_to_msg.get(name_or_addr) + assert msg is not None + assert msg.address not in self.addresses + + self.addresses.add(msg.address) + signal_names = list(msg.sigs.keys()) + signals_dict = {s: 0.0 for s in signal_names} + dict.__setitem__(self.vl, msg.address, signals_dict) + dict.__setitem__(self.vl, msg.name, signals_dict) + self.vl_all[msg.address] = defaultdict(list) + self.vl_all[msg.name] = self.vl_all[msg.address] + self.ts_nanos[msg.address] = {s: 0 for s in signal_names} + self.ts_nanos[msg.name] = self.ts_nanos[msg.address] + state = MessageState( + address=msg.address, + name=msg.name, + size=msg.size, + signals=list(msg.sigs.values()), + ignore_alive=freq is not None and math.isnan(freq), + ignore_counter=ignore_counter, + ) + state.first_seen_nanos = time.monotonic_ns() + if freq is not None and freq > 0: + state.frequency = freq + else: + # if frequency not specified, assume 1Hz until we learn it + freq = 1 + state.timeout_threshold = (1_000_000_000 / freq) * 10 + + self.message_states[msg.address] = state + + @property + def bus_timeout(self) -> bool: + ignore_alive = all(s.ignore_alive for s in self.message_states.values()) + bus_timeout_threshold = 500 * 1_000_000 + for st in self.message_states.values(): + if st.timeout_threshold > 0: + bus_timeout_threshold = min(bus_timeout_threshold, st.timeout_threshold) + return ((self._last_update_nanos - self.last_nonempty_nanos) > bus_timeout_threshold) and not ignore_alive + + @property + def can_valid(self) -> bool: + valid = True + counters_valid = True + bus_timeout = self.bus_timeout + for state in self.message_states.values(): + if state.counter_fail >= MAX_BAD_COUNTER: + counters_valid = False + state.rate_limited_log(self._last_update_nanos, f"counter invalid, {state.counter_fail=} {MAX_BAD_COUNTER=}") + if not state.valid(self._last_update_nanos, bus_timeout): + valid = False + state.rate_limited_log(self._last_update_nanos, "not valid (timeout or missing)") + + # TODO: probably only want to increment this once per update() call + self.can_invalid_cnt = 0 if valid else min(self.can_invalid_cnt + 1, CAN_INVALID_CNT) + return self.can_invalid_cnt < CAN_INVALID_CNT and counters_valid + + def update(self, strings, sendcan: bool = False): + if strings and not isinstance(strings[0], list | tuple): + strings = [strings] + + for addr in self.addresses: + for k in self.vl_all[addr]: + self.vl_all[addr][k].clear() + + updated_addrs: set[int] = set() + for entry in strings: + t = entry[0] + frames = entry[1] + bus_empty = True + for address, dat, src in frames: + if src != self.bus: + continue + bus_empty = False + if self.enable_capture: + self.seen_addresses.add(address) + state = self.message_states.get(address) + if state is None or len(dat) > 64: + continue + if state.parse(t, dat): + updated_addrs.add(address) + + vl_addr = self.vl[address] + vl_all_addr = self.vl_all[address] + ts_addr = self.ts_nanos[address] + raw_dat = bytes(dat) + self.dat[address] = raw_dat + self.dat[state.name] = raw_dat + + for i, sig in enumerate(state.signals): + vl_addr[sig.name] = state.vals[i] + vl_all_addr[sig.name] = state.all_vals[i] + ts_addr[sig.name] = state.timestamps[-1] + + if not bus_empty: + self.last_nonempty_nanos = t + + self._last_update_nanos = t + + return updated_addrs + + +class CANDefine: + def __init__(self, dbc_name: str): + dbc = DBC(dbc_name) + + dv = defaultdict(dict) + for val in dbc.vals: + sgname = val.name + address = val.address + msg = dbc.addr_to_msg.get(address) + if msg is None: + raise KeyError(address) + msgname = msg.name + parts = val.def_val.split() + values = [int(v) for v in parts[::2]] + defs = parts[1::2] + dv[address][sgname] = dict(zip(values, defs, strict=True)) + dv[msgname][sgname] = dv[address][sgname] + + self.dv = dict(dv) diff --git a/artifacts/package_runtime/iqdbc/can/tests/.gitignore b/artifacts/package_runtime/iqdbc/can/tests/.gitignore new file mode 100644 index 000000000..192fb0945 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/.gitignore @@ -0,0 +1 @@ +*.bz2 diff --git a/artifacts/package_runtime/iqdbc/can/tests/__init__.py b/artifacts/package_runtime/iqdbc/can/tests/__init__.py new file mode 100644 index 000000000..e1a91cab0 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/__init__.py @@ -0,0 +1,8 @@ +import glob +import os + +from iqdbc import DBC_PATH + +ALL_DBCS = [os.path.basename(dbc).split('.')[0] for dbc in + glob.glob(f"{DBC_PATH}/*.dbc")] +TEST_DBC = os.path.abspath(os.path.join(os.path.dirname(__file__), "test.dbc")) diff --git a/artifacts/package_runtime/iqdbc/can/tests/benchmark.py b/artifacts/package_runtime/iqdbc/can/tests/benchmark.py new file mode 100644 index 000000000..8497421b1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/benchmark.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import time +from iqdbc.can import CANPacker, CANParser + + +def _benchmark(checks, n): + parser = CANParser('toyota_new_mc_pt_generated', checks, 0) + packer = CANPacker('toyota_new_mc_pt_generated') + + t1 = time.process_time_ns() + can_msgs = [] + for i in range(10000): + values = {"ACC_CONTROL": {"ACC_TYPE": 1, "ALLOW_LONG_PRESS": 3}} + msgs = [packer.make_can_msg(k, 0, v) for k, v in values.items()] + can_msgs.append([int(0.01 * i * 1e9), msgs]) + t2 = time.process_time_ns() + pack_dt = t2 - t1 + + ets = [] + for _ in range(25): + if n > 1: + strings = [] + for i in range(0, len(can_msgs), n): + strings.append(can_msgs[i:i + n]) + t1 = time.process_time_ns() + for m in strings: + parser.update(m) + t2 = time.process_time_ns() + else: + t1 = time.process_time_ns() + for m in can_msgs: + parser.update([m]) + t2 = time.process_time_ns() + + ets.append(t2 - t1) + + et = sum(ets) / len(ets) + avg_nanos = et / len(can_msgs) + print('[%d] %.1fms to pack, %.1fms to parse %s messages, avg: %dns' % (n, pack_dt/1e6, et/1e6, len(can_msgs), avg_nanos)) + + +if __name__ == "__main__": + # python -m cProfile -s cumulative benchmark.py + _benchmark([('ACC_CONTROL', 10)], 1) + _benchmark([('ACC_CONTROL', 10)], 5) + _benchmark([('ACC_CONTROL', 10)], 10) diff --git a/artifacts/package_runtime/iqdbc/can/tests/test.dbc b/artifacts/package_runtime/iqdbc/can/tests/test.dbc new file mode 100644 index 000000000..05104fb06 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/test.dbc @@ -0,0 +1,27 @@ +CM_ "This DBC is used for the CAN parser and packer tests."; + +BO_ 228 STEERING_CONTROL: 5 EON + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS + SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS + SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + +BO_ 316 Brake_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|46@1+ (1,0) [0|1] "" XXX + SG_ ES_Brake : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 59|3@1+ (1,0) [0|1] "" XXX + SG_ Brake : 62|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 245 CAN_FD_MESSAGE: 32 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|1] "" XXX + SG_ SIGNED : 22|16@0- (1,0) [0|1] "" XXX + SG_ 64_BIT_LE : 159|64@1+ (1,0) [0|1] "" XXX + SG_ 64_BIT_BE : 80|64@0+ (1,0) [0|1] "" XXX + +VAL_ 80 NON_EXISTENT_ADDR 0 "test"; diff --git a/artifacts/package_runtime/iqdbc/can/tests/test_checksums.py b/artifacts/package_runtime/iqdbc/can/tests/test_checksums.py new file mode 100644 index 000000000..45cb49ac5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/test_checksums.py @@ -0,0 +1,594 @@ +import copy +from iqdbc.can import CANPacker, CANParser + + +class TestCanChecksums: + + def verify_checksum(self, subtests, dbc_file: str, msg_name: str, msg_addr: int, test_messages: list[bytes], + checksum_field: str = 'CHECKSUM', counter_field = 'COUNTER'): + """ + Verify that iqdbc calculates payload CRCs/checksums matching those received in known-good sample messages + Depends on all non-zero bits in the sample message having a corresponding DBC signal, add UNKNOWN signals if needed + """ + parser = CANParser(dbc_file, [(msg_name, 0)], 0) + packer = CANPacker(dbc_file) + + for data in test_messages: + expected_msg = (msg_addr, data, 0) + parser.update([0, [expected_msg]]) + expected = copy.deepcopy(parser.vl[msg_name]) + + modified = copy.deepcopy(expected) + modified.pop(checksum_field, None) + modified_msg = packer.make_can_msg(msg_name, 0, modified) + + parser.update([0, [modified_msg]]) + tested = parser.vl[msg_name] + with subtests.test(counter=expected[counter_field]): + assert tested[checksum_field] == expected[checksum_field] + + def verify_fca_giorgio_crc(self, subtests, msg_name: str, msg_addr: int, test_messages: list[bytes]): + """Test modified SAE J1850 CRCs, with special final XOR cases for EPS messages""" + assert len(test_messages) == 3 + self.verify_checksum(subtests, "fca_giorgio", msg_name, msg_addr, test_messages) + + def test_fca_giorgio_eps_1(self, subtests): + self.verify_fca_giorgio_crc(subtests, "EPS_1", 0xDE, [ + b'\x17\x51\x97\xcc\x00\xdf', + b'\x17\x51\x97\xc9\x01\xa3', + b'\x17\x51\x97\xcc\x02\xe5', + ]) + + def test_fca_giorgio_eps_2(self, subtests): + self.verify_fca_giorgio_crc(subtests, "EPS_2", 0x106, [ + b'\x7c\x43\x57\x60\x00\x00\xa1', + b'\x7c\x63\x58\xe0\x00\x01\xd5', + b'\x7c\x63\x58\xe0\x00\x02\xf2', + ]) + + def test_fca_giorgio_eps_3(self, subtests): + self.verify_fca_giorgio_crc(subtests, "EPS_3", 0x122, [ + b'\x7b\x30\x00\xf8', + b'\x7b\x10\x01\x90', + b'\x7b\xf0\x02\x6e', + ]) + + def test_fca_giorgio_abs_2(self, subtests): + self.verify_fca_giorgio_crc(subtests, "ABS_2", 0xFE, [ + b'\x7e\x38\x00\x7d\x10\x31\x80\x32', + b'\x7e\x38\x00\x7d\x10\x31\x81\x2f', + b'\x7e\x38\x00\x7d\x20\x31\x82\x20', + ]) + + def test_honda_checksum(self): + """Test checksums for Honda standard and extended CAN ids""" + # TODO: refactor to use self.verify_checksum() + dbc_file = "honda_civic_hatchback_ex_2017_can_generated" + msgs = [("LKAS_HUD", 0), ("LKAS_HUD_A", 0)] + parser = CANParser(dbc_file, msgs, 0) + packer = CANPacker(dbc_file) + + values = { + 'LKAS_READY': 1, + 'LKAS_STATE_CHANGE': 1, + 'STEERING_REQUIRED': 1, + 'SOLID_LANES': 1, + 'BEEP': 0, + } + + # known correct checksums according to the above values + checksum_std = [11, 10, 9, 8] + checksum_ext = [4, 3, 2, 1] + + for std, ext in zip(checksum_std, checksum_ext, strict=True): + msgs = [ + packer.make_can_msg("LKAS_HUD", 0, values), + packer.make_can_msg("LKAS_HUD_A", 0, values), + ] + parser.update([0, msgs]) + + assert parser.vl['LKAS_HUD']['CHECKSUM'] == std + assert parser.vl['LKAS_HUD_A']['CHECKSUM'] == ext + + def test_honda_checksum_high_extended(self): + """Extended CAN ids above 0x100000 use a +10 checksum constant instead of +3""" + dbc_file = "honda_common_canfd_generated" + msgs = [("LANE_PATH", 0), ("RADAR_LEAD", 0)] + parser = CANParser(dbc_file, msgs, 0) + packer = CANPacker(dbc_file) + + lane_path_values = { + 'MUX': 1, + 'PATH_OFFSET_1': 0, + 'PATH_OFFSET_2': 0, + 'PATH_OFFSET_3': 2047, + 'PATH_OFFSET_4': 2047, + } + radar_lead_values = { + 'CNTR_REF': 2, + 'SET_ME_X01': 1, + 'TARGET_SPEED_MAYBE': 140, + 'LEFT_LANE': 3, + 'RIGHT_LANE': 3, + 'LANE_PATH_LENGTH': 6, + } + + # known correct checksums according to the above values + checksum_lane_path = [14, 13, 12, 11] + checksum_radar_lead = [4, 3, 2, 1] + + for lane_path, radar_lead in zip(checksum_lane_path, checksum_radar_lead, strict=True): + msgs = [ + packer.make_can_msg("LANE_PATH", 0, lane_path_values), + packer.make_can_msg("RADAR_LEAD", 0, radar_lead_values), + ] + parser.update([0, msgs]) + + assert parser.vl['LANE_PATH']['CHECKSUM'] == lane_path + assert parser.vl['RADAR_LEAD']['CHECKSUM'] == radar_lead + assert parser.can_valid + + def verify_volkswagen_mqb_crc(self, subtests, msg_name: str, msg_addr: int, test_messages: list[bytes], counter_field: str = 'COUNTER'): + """Test AUTOSAR E2E Profile 2 CRCs""" + assert len(test_messages) == 16 # All counter values must be tested + self.verify_checksum(subtests, "vw_mqb", msg_name, msg_addr, test_messages, counter_field=counter_field) + + def test_volkswagen_mqb_crc_lwi_01(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "LWI_01", 0x86, [ + b'\x6b\x00\xbd\x00\x00\x00\x00\x00', + b'\xee\x01\x0a\x00\x00\x00\x00\x00', + b'\xd8\x02\xa9\x00\x00\x00\x00\x00', + b'\x03\x03\xbe\xa2\x12\x00\x00\x00', + b'\x7b\x04\x31\x20\x03\x00\x00\x00', + b'\x8b\x05\xe2\x85\x09\x00\x00\x00', + b'\x63\x06\x13\x21\x00\x00\x00\x00', + b'\x66\x07\x05\x00\x00\x00\x00\x00', + b'\x49\x08\x0d\x00\x00\x00\x00\x00', + b'\x5f\x09\x7e\x60\x01\x00\x00\x00', + b'\xaf\x0a\x72\x20\x00\x00\x00\x00', + b'\x59\x0b\x1b\x00\x00\x00\x00\x00', + b'\xa8\x0c\x06\x00\x00\x00\x00\x00', + b'\xbc\x0d\x72\x20\x00\x00\x00\x00', + b'\xf9\x0e\x0f\x00\x00\x00\x00\x00', + b'\x60\x0f\x62\xc0\x00\x00\x00\x00', + ]) + + def test_volkswagen_mqb_crc_airbag_01(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "Airbag_01", 0x40, [ + b'\xaf\x00\x00\x80\xc0\x00\x20\x3e', + b'\x54\x01\x00\x80\xc0\x00\x20\x1a', + b'\x54\x02\x00\x80\xc0\x00\x60\x00', + b'\x31\x03\x00\x80\xc0\x00\x60\xf2', + b'\xe0\x04\x00\x80\xc0\x00\x60\xcc', + b'\xb3\x05\x00\x80\xc0\x00\x40\xde', + b'\xa4\x06\x00\x80\xc0\x00\x40\x18', + b'\x94\x07\x00\x80\xc0\x00\x20\x38', + b'\x2d\x08\x00\x80\xc0\x00\x60\xae', + b'\xc2\x09\x00\x80\xc0\x00\x00\x1c', + b'\x1f\x0a\x00\x80\xc0\x00\x60\x2c', + b'\x7f\x0b\x00\x80\xc0\x00\x00\x00', + b'\x03\x0c\x00\x80\xc0\x00\x40\xd6', + b'\x56\x0d\x00\x80\xc0\x00\x20\x50', + b'\x4a\x0e\x00\x80\xc0\x00\x20\xf2', + b'\xe5\x0f\x00\x80\xc0\x00\x40\xf6', + ]) + + def test_volkswagen_mqb_crc_lh_eps_03(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "LH_EPS_03", 0x9F, [ + b'\x11\x30\x2e\x00\x05\x1c\x80\x30', + b'\x5b\x31\x8e\x03\x05\x53\x00\x30', + b'\xcb\x32\xd3\x06\x05\x73\x00\x30', + b'\xf2\x33\x28\x00\x05\x26\x00\x30', + b'\x0b\x34\x44\x00\x05\x5b\x80\x30', + b'\xed\x35\x80\x00\x03\x34\x00\x30', + b'\xf0\x36\x88\x00\x05\x3d\x80\x30', + b'\x9e\x37\x44\x03\x05\x41\x00\x30', + b'\x68\x38\x06\x01\x05\x18\x80\x30', + b'\x87\x39\x51\x00\x05\x11\x80\x30', + b'\x8c\x3a\x29\x00\x05\xac\x00\x30', + b'\x08\x3b\xbd\x00\x05\x8e\x00\x30', + b'\xd4\x3c\x19\x00\x05\x05\x80\x30', + b'\x29\x3d\x54\x00\x05\x5b\x00\x30', + b'\xa1\x3e\x49\x01\x03\x04\x80\x30', + b'\xe2\x3f\x05\x00\x05\x0a\x00\x30', + ]) + + def test_volkswagen_mqb_crc_getriebe_11(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "Getriebe_11", 0xAD, [ + b'\xf8\xe0\xbf\xff\x5f\x20\x20\x20', + b'\xb0\xe1\xbf\xff\xc6\x98\x21\x80', + b'\xd2\xe2\xbf\xff\x5f\x20\x20\x20', + b'\x00\xe3\xbf\xff\xaa\x20\x20\x10', + b'\xf1\xe4\xbf\xff\x5f\x20\x20\x20', + b'\xc4\xe5\xbf\xff\x5f\x20\x20\x20', + b'\xda\xe6\xbf\xff\x5f\x20\x20\x20', + b'\x85\xe7\xbf\xff\x5f\x20\x20\x20', + b'\x12\xe8\xbf\xff\x5f\x20\x20\x20', + b'\x45\xe9\xbf\xff\xaa\x20\x20\x10', + b'\x03\xea\xbf\xff\xcc\x20\x20\x10', + b'\xfc\xeb\xbf\xff\x5f\x20\x21\x20', + b'\xfe\xec\xbf\xff\xad\x20\x20\x10', + b'\xbd\xed\xbf\xff\xaa\x20\x20\x10', + b'\x67\xee\xbf\xff\xaa\x20\x20\x10', + b'\x36\xef\xbf\xff\xaa\x20\x20\x10', + ], counter_field="COUNTER_DISABLED") # see iqdbc#1235 + + def test_volkswagen_mqb_crc_esp_21(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ESP_21", 0xFD, [ + b'\x66\xd0\x1f\x80\x45\x05\x00\x00', + b'\x87\xd1\x1f\x80\x52\x05\x00\x00', + b'\xcd\xd2\x1f\x80\x50\x06\x00\x00', + b'\xfd\xd3\x1f\x80\x35\x02\x00\x00', + b'\xfa\xd4\x1f\x80\x22\x05\x00\x00', + b'\xfd\xd5\x1f\x80\x84\x04\x00\x00', + b'\x2e\xd6\x1f\x80\xf0\x03\x00\x00', + b'\x9f\xd7\x1f\x80\x00\x00\x00\x00', + b'\x1e\xd8\x1f\x80\xb3\x03\x00\x00', + b'\x61\xd9\x1f\x80\x6d\x05\x00\x00', + b'\x44\xda\x1f\x80\x47\x02\x00\x00', + b'\x86\xdb\x1f\x80\x3a\x02\x00\x00', + b'\x39\xdc\x1f\x80\xcb\x01\x00\x00', + b'\x19\xdd\x1f\x80\x00\x00\x00\x00', + b'\x8c\xde\x1f\x80\xba\x04\x00\x00', + b'\xfb\xdf\x1f\x80\x46\x00\x00\x00', + ]) + + def test_volkswagen_mqb_crc_esp_02(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ESP_02", 0x101, [ + b'\xf2\x00\x7e\xff\xa1\x2a\x40\x00', + b'\xd3\x01\x7d\x00\xa2\x0c\x02\x00', + b'\x03\x02\x7a\x06\xa2\x49\x42\x00', + b'\xfd\x03\x70\xfb\xa1\xde\x00\x00', + b'\x8e\x04\x7b\xf7\xa1\xd2\x01\x00', + b'\x0f\x05\x7d\xfd\xa1\x31\x40\x00', + b'\xb6\x06\x7d\x01\xa2\x0a\x40\x00', + b'\xe8\x07\x7e\xfd\xa1\x12\x40\x00', + b'\x74\x08\x7a\x01\xa2\x40\x01\x00', + b'\xe3\x09\x81\x00\xa2\xb5\x01\x00', + b'\xab\x0a\x74\x09\xa2\x9f\x42\x00', + b'\xf3\x0b\x80\x12\xa2\x94\x00\x00', + b'\x88\x0c\x7f\x07\xa2\x46\x00\x00', + b'\x6f\x0d\x7f\xff\xa1\x53\x40\x00', + b'\x38\x0e\x73\xd6\xa1\x6a\x40\x00', + b'\x49\x0f\x85\x12\xa2\xf6\x01\x00', + ]) + + def test_volkswagen_mqb_crc_esp_05(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ESP_05", 0x106, [ + b'\x90\x80\x64\x00\x00\x00\xe7\x10', + b'\xf4\x81\x64\x00\x00\x00\xe7\x10', + b'\x90\x82\x63\x00\x00\x00\xe8\x10', + b'\xa0\x83\x63\x00\x00\x00\xe6\x10', + b'\xe7\x84\x63\x00\x00\x00\xe8\x10', + b'\x2e\x85\x78\x04\x00\x00\xea\x30', + b'\x7b\x86\x63\x00\x00\x00\xe6\x10', + b'\x71\x87\x79\x04\x00\x00\xd0\x30', + b'\x50\x88\x79\x04\x00\x00\xea\x30', + b'\x81\x89\x64\x00\x00\x00\xe1\x10', + b'\x6a\x8a\x68\x00\x00\x04\xd0\x10', + b'\x17\x8b\x6a\x04\x00\x00\xe6\x10', + b'\xc7\x8c\x63\x00\x00\x00\xd1\x10', + b'\x53\x8d\x64\x04\x00\x00\xe2\x10', + b'\x24\x8e\x63\x00\x00\x00\xe7\x10', + b'\x3f\x8f\x82\x04\x00\x00\xe6\x30', + ]) + + def test_volkswagen_mqb_crc_esp_10(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ESP_10", 0x116, [ + b'\x2d\x00\xd5\x98\x9f\x26\x25\x0f', + b'\x24\x01\x60\x63\x2c\x5e\x3b\x0f', + b'\x08\x02\xb2\x2f\xee\x9a\x29\x0f', + b'\x7c\x03\x17\x07\x1d\xe5\x8c\x0f', + b'\xaa\x04\xd6\xe3\xeb\x98\xe8\x0f', + b'\x4e\x05\xbb\xd9\x65\x43\xca\x0f', + b'\x59\x06\x78\xbd\x25\xc6\xf2\xff', + b'\xaf\x07\x42\x85\x53\xbe\xbe\x0f', + b'\x2a\x08\xa6\xcd\x95\x8c\x12\x0f', + b'\xce\x09\x6e\x17\x6d\x1b\x2f\x0f', + b'\x60\x0a\xd3\xe6\x3a\x8d\xf0\x0f', + b'\xc5\x0b\xfc\x69\x57\x50\x21\x0f', + b'\x70\x0c\xde\xf3\x9d\xe9\x6b\xff', + b'\x62\x0d\xc4\x1a\xdb\x61\x7a\x0f', + b'\x76\x0e\x79\x69\xe3\x32\x67\x0f', + b'\x15\x0f\x51\x59\x56\x35\xb1\x0f', + ]) + + def test_volkswagen_mqb_crc_acc_10(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ACC_10", 0x117, [ + b'\x9b\x00\x00\x40\x68\x00\x00\xff', + b'\xff\x01\x00\x40\x68\x00\x00\xff', + b'\x53\x02\x00\x40\x68\x00\x00\xff', + b'\x37\x03\x00\x40\x68\x00\x00\xff', + b'\x24\x04\x00\x40\x68\x00\x00\xff', + b'\x40\x05\x00\x40\x68\x00\x00\xff', + b'\xec\x06\x00\x40\x68\x00\x00\xff', + b'\x88\x07\x00\x40\x68\x00\x00\xff', + b'\xca\x08\x00\x40\x68\x00\x00\xff', + b'\xae\x09\x00\x40\x68\x00\x00\xff', + b'\x02\x0a\x00\x40\x68\x00\x00\xff', + b'\x66\x0b\x00\x40\x68\x00\x00\xff', + b'\x75\x0c\x00\x40\x68\x00\x00\xff', + b'\x11\x0d\x00\x40\x68\x00\x00\xff', + b'\xbd\x0e\x00\x40\x68\x00\x00\xff', + b'\xd9\x0f\x00\x40\x68\x00\x00\xff', + ]) + + def test_volkswagen_mqb_crc_tsk_06(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "TSK_06", 0x120, [ + b'\xc1\x00\x00\x02\x00\x08\xff\x21', + b'\x34\x01\x00\x02\x00\x08\xff\x21', + b'\xcc\x02\x00\x02\x00\x08\xff\x21', + b'\x1e\x03\x00\x02\x00\x08\xff\x21', + b'\x48\x04\x00\x02\x00\x08\xff\x21', + b'\x4a\x05\x00\x02\x00\x08\xff\x21', + b'\xa5\x06\x00\x02\x00\x08\xff\x21', + b'\xa7\x07\x00\x02\x00\x08\xff\x21', + b'\xfe\x08\x00\x02\x00\x08\xff\x21', + b'\xa8\x09\x00\x02\x00\x08\xff\x21', + b'\x73\x0a\x00\x02\x00\x08\xff\x21', + b'\xdf\x0b\x00\x02\x00\x08\xff\x21', + b'\x05\x0c\x00\x02\x00\x08\xff\x21', + b'\xb5\x0d\x00\x02\x00\x08\xff\x21', + b'\xde\x0e\x00\x02\x00\x08\xff\x21', + b'\x0b\x0f\x00\x02\x00\x08\xff\x21', + ]) + + def test_volkswagen_mqb_crc_motor_20(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "Motor_20", 0x121, [ + b'\xb9\x00\x00\xc0\x39\x46\x7e\xfe', + b'\x85\x31\x20\x00\x1a\x46\x7e\xfe', + b'\xc7\x12\x00\x40\x1a\x46\x7e\xfe', + b'\x53\x93\x00\x00\x19\x46\x7e\xfe', + b'\xa4\x34\x00\x80\x1a\x46\x7e\xfe', + b'\x0e\x55\x20\x60\x18\x46\x7e\xfe', + b'\x3f\x06\x00\xc0\x37\x4c\x7e\xfe', + b'\x0c\x07\x00\x40\x39\x46\x7e\xfe', + b'\x2a\x08\x00\x00\x3a\x46\x7e\xfe', + b'\x7f\x49\x20\x80\x1a\x46\x7e\xfe', + b'\x2f\x0a\x00\xc0\x39\x46\x7e\xfe', + b'\x70\xbb\x00\x00\x17\x46\x7e\xfe', + b'\x06\x0c\x00\x00\x39\x46\x7e\xfe', + b'\x4b\x9d\x20\xe0\x16\x4c\x7e\xfe', + b'\x73\xfe\x00\x40\x16\x46\x7e\xfe', + b'\xaf\x0f\x20\x80\x39\x4c\x7e\xfe', + ]) + + def test_volkswagen_mqb_crc_acc_06(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ACC_06", 0x122, [ + b'\x14\x80\x00\xfe\x07\x00\x00\x18', + b'\x9f\x81\x00\xfe\x07\x00\x00\x18', + b'\x0a\x82\x00\xfe\x07\x00\x00\x28', + b'\x40\x83\x00\xfe\x07\x00\x00\x18', + b'\x2d\x84\x00\xfe\x07\x00\x00\x28', + b'\xdb\x85\x00\xfe\x07\x00\x00\x18', + b'\x4d\x86\x00\xfe\x07\x00\x00\x28', + b'\x35\x87\x00\xfe\x07\x00\x00\x18', + b'\x23\x88\x00\xfe\x07\x00\x00\x28', + b'\x4a\x89\x00\xfe\x07\x00\x00\x28', + b'\xe1\x8a\x00\xfe\x07\x00\x00\x28', + b'\x30\x8b\x00\xfe\x07\x00\x00\x28', + b'\x60\x8c\x00\xfe\x07\x00\x00\x28', + b'\x0d\x8d\x00\xfe\x07\x00\x00\x18', + b'\x8c\x8e\x00\xfe\x07\x00\x00\x18', + b'\x6f\x8f\x00\xfe\x07\x00\x00\x28', + ]) + + def test_volkswagen_mqb_crc_hca_01(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "HCA_01", 0x126, [ + b'\x00\x30\x0d\xc0\x05\xfe\x07\x00', + b'\x3e\x31\x54\xc0\x05\xfe\x07\x00', + b'\xa7\x32\xbb\x40\x05\xfe\x07\x00', + b'\x96\x33\x29\xc0\x05\xfe\x07\x00', + b'\x5f\x34\x00\x00\x03\xfe\x07\x00', + b'\x3b\x35\xae\x40\x05\xfe\x07\x00', + b'\xc7\x36\x7a\x40\x05\xfe\x07\x00', + b'\x6f\x37\x76\x40\x05\xfe\x07\x00', + b'\xb1\x38\x00\x00\x03\xfe\x07\x00', + b'\xd5\x39\x00\x00\x03\xfe\x07\x00', + b'\xba\x3a\x69\xc0\x05\xfe\x07\x00', + b'\x65\x3b\x10\x40\x05\xfe\x07\x00', + b'\x49\x3c\x72\xc0\x05\xfe\x07\x00', + b'\xc6\x3d\xdf\x40\x05\xfe\x07\x00', + b'\x1d\x3e\x2c\xc1\x05\xfe\x07\x00', + b'\x9b\x3f\x20\x40\x05\xfe\x07\x00', + ]) + + def test_volkswagen_mqb_crc_gra_acc_01(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "GRA_ACC_01", 0x12B, [ + b'\x86\x40\x80\x2a\x00\x00\x00\x00', + b'\xf4\x41\x80\x2a\x00\x00\x00\x00', + b'\x50\x42\x80\x2a\x00\x00\x00\x00', + b'\x08\x43\x80\x2a\x00\x00\x00\x00', + b'\x88\x44\x80\x2a\x00\x00\x00\x00', + b'\x2d\x45\x80\x2a\x00\x00\x00\x00', + b'\x34\x46\x80\x2a\x00\x00\x00\x00', + b'\x11\x47\x80\x2a\x00\x00\x00\x00', + b'\xc4\x48\x80\x2a\x00\x00\x00\x00', + b'\xcc\x49\x80\x2a\x00\x00\x00\x00', + b'\xdc\x4a\x80\x2a\x00\x00\x00\x00', + b'\x79\x4b\x80\x2a\x00\x00\x00\x00', + b'\x3c\x4c\x80\x2a\x00\x00\x00\x00', + b'\x68\x4d\x80\x2a\x00\x00\x00\x00', + b'\x27\x4e\x80\x2a\x00\x00\x00\x00', + b'\x0d\x4f\x80\x2a\x00\x00\x00\x00', + ]) + + def test_volkswagen_mqb_crc_acc_07(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ACC_07", 0x12E, [ + b'\xac\xe0\x7f\x00\xfe\x00\xc0\xff', + b'\xa2\xe1\x7f\x00\xfe\x00\xc0\xff', + b'\x6b\xe2\x7f\x00\xfe\x00\xc0\xff', + b'\xf2\xe3\x7f\x00\xfe\x00\xc0\xff', + b'\xd5\xe4\x7f\x00\xfe\x00\xc0\xff', + b'\x35\xe5\x7f\x00\xfe\x00\xc0\xff', + b'\x7f\xe6\x7f\x00\xfe\x00\xc0\xff', + b'\x6c\xe7\x7f\x00\xfe\x00\xc0\xff', + b'\x05\xe8\x7f\x00\xfe\x00\xc0\xff', + b'\x79\xe9\x7f\x00\xfe\x00\xc0\xff', + b'\x25\xea\x7f\x00\xfe\x00\xc0\xff', + b'\xd1\xeb\x7f\x00\xfe\x00\xc0\xff', + b'\x72\xec\x7f\x00\xfe\x00\xc0\xff', + b'\x58\xed\x7f\x00\xfe\x00\xc0\xff', + b'\x82\xee\x7f\x00\xfe\x00\xc0\xff', + b'\x85\xef\x7f\x00\xfe\x00\xc0\xff', + ]) + + def test_volkswagen_mqb_crc_motor_ev_01(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "Motor_EV_01", 0x187, [ + b'\x70\x80\x15\x00\x00\x00\x00\xF0', + b'\x07\x81\x15\x00\x00\x00\x00\xF0', + b'\x7A\x82\x15\x00\x00\x00\x00\xF0', + b'\x26\x83\x15\x00\x00\x00\x00\xF0', + b'\xBE\x84\x15\x00\x00\x00\x00\xF0', + b'\x5A\x85\x15\x00\x00\x00\x00\xF0', + b'\xFC\x86\x15\x00\x00\x00\x00\xF0', + b'\x9E\x87\x15\x00\x00\x00\x00\xF0', + b'\xAF\x88\x15\x00\x00\x00\x00\xF0', + b'\x35\x89\x15\x00\x00\x00\x00\xF0', + b'\xC5\x8A\x15\x00\x00\x00\x00\xF0', + b'\x11\x8B\x15\x00\x00\x00\x00\xF0', + b'\xD0\x8C\x15\x00\x00\x00\x00\xF0', + b'\xE8\x8D\x15\x00\x00\x00\x00\xF0', + b'\xF5\x8E\x15\x00\x00\x00\x00\xF0', + b'\x00\x8F\x15\x00\x00\x00\x00\xF0', + ]) + + def test_volkswagen_mqb_crc_esp_33(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ESP_33", 0x1AB, [ + b'\x64\x00\x80\x02\x00\x00\x00\x00', + b'\x19\x01\x00\x00\x00\x00\x00\x00', + b'\xfc\x02\x00\x10\x01\x00\x00\x00', + b'\x8b\x03\x80\x02\x00\x00\x00\x00', + b'\xa4\x04\x00\x10\x01\x00\x00\x00', + b'\x97\x05\x00\x02\x00\x00\x01\x00', + b'\xd5\x06\x80\x02\x00\x00\x01\x00', + b'\xa0\x07\x80\x02\x00\x00\x01\x00', + b'\x89\x08\x00\x00\x00\x00\x00\x00', + b'\xe3\x09\x00\x00\x00\x00\x00\x00', + b'\x0e\x0a\x00\x00\x00\x00\x00\x00', + b'\x90\x0b\x00\x00\x00\x00\x00\x00', + b'\x32\x0c\x00\x10\x01\x00\x00\x00', + b'\x30\x0d\x00\x00\x00\x00\x00\x00', + b'\xc2\x0e\x00\x10\x01\x00\x00\x00', + b'\x68\x0f\x80\x02\x00\x00\x00\x00', + ]) + + def test_volkswagen_mqb_crc_acc_02(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ACC_02", 0x30C, [ + b'\x82\xf0\x3f\x00\x40\x30\x00\x40', + b'\xe6\xf1\x3f\x00\x40\x30\x00\x40', + b'\x4a\xf2\x3f\x00\x40\x30\x00\x40', + b'\x2e\xf3\x3f\x00\x40\x30\x00\x40', + b'\x3d\xf4\x3f\x00\x40\x30\x00\x40', + b'\x59\xf5\x3f\x00\x40\x30\x00\x40', + b'\xf5\xf6\x3f\x00\x40\x30\x00\x40', + b'\x91\xf7\x3f\x00\x40\x30\x00\x40', + b'\xd3\xf8\x3f\x00\x40\x30\x00\x40', + b'\xb7\xf9\x3f\x00\x40\x30\x00\x40', + b'\x1b\xfa\x3f\x00\x40\x30\x00\x40', + b'\x7f\xfb\x3f\x00\x40\x30\x00\x40', + b'\x6c\xfc\x3f\x00\x40\x30\x00\x40', + b'\x08\xfd\x3f\x00\x40\x30\x00\x40', + b'\xa4\xfe\x3f\x00\x40\x30\x00\x40', + b'\xc0\xff\x3f\x00\x40\x30\x00\x40', + ]) + + def test_volkswagen_mqb_crc_swa_01(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "SWA_01", 0x30F, [ + b'\x10\x00\x10\x00\x00\x00\x00\x00', + b'\x74\x01\x10\x00\x00\x00\x00\x00', + b'\xD8\x02\x10\x00\x00\x00\x00\x00', + b'\xBC\x03\x10\x00\x00\x00\x00\x00', + b'\xAF\x04\x10\x00\x00\x00\x00\x00', + b'\xCB\x05\x10\x00\x00\x00\x00\x00', + b'\x67\x06\x10\x00\x00\x00\x00\x00', + b'\x03\x07\x10\x00\x00\x00\x00\x00', + b'\x41\x08\x10\x00\x00\x00\x00\x00', + b'\x25\x09\x10\x00\x00\x00\x00\x00', + b'\x89\x0A\x10\x00\x00\x00\x00\x00', + b'\xED\x0B\x10\x00\x00\x00\x00\x00', + b'\xFE\x0C\x10\x00\x00\x00\x00\x00', + b'\x9A\x0D\x10\x00\x00\x00\x00\x00', + b'\x36\x0E\x10\x00\x00\x00\x00\x00', + b'\x52\x0F\x10\x00\x00\x00\x00\x00', + ]) + + def test_volkswagen_mqb_crc_acc_04(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ACC_04", 0x324, [ + b'\xba\x00\x00\x00\x00\x00\x00\x10', + b'\xde\x01\x00\x00\x00\x00\x00\x10', + b'\x72\x02\x00\x00\x00\x00\x00\x10', + b'\x16\x03\x00\x00\x00\x00\x00\x10', + b'\x05\x04\x00\x00\x00\x00\x00\x10', + b'\x44\x05\x00\x00\x00\x00\x00\x00', + b'\xe8\x06\x00\x00\x00\x00\x00\x00', + b'\xa9\x07\x00\x00\x00\x00\x00\x10', + b'\xeb\x08\x00\x00\x00\x00\x00\x10', + b'\x8f\x09\x00\x00\x00\x00\x00\x10', + b'\x06\x0a\x00\x00\x00\x00\x00\x00', + b'\x47\x0b\x00\x00\x00\x00\x00\x10', + b'\x71\x0c\x00\x00\x00\x00\x00\x00', + b'\x15\x0d\x00\x00\x00\x00\x00\x00', + b'\xb9\x0e\x00\x00\x00\x00\x00\x00', + b'\xdd\x0f\x00\x00\x00\x00\x00\x00', + ]) + + def test_volkswagen_mqb_crc_klemmen_status_01(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "Klemmen_Status_01", 0x3C0, [ + b'\x74\x00\x03\x00', + b'\xc1\x01\x03\x00', + b'\x31\x02\x03\x00', + b'\x84\x03\x03\x00', + b'\xfe\x04\x03\x00', + b'\x4b\x05\x03\x00', + b'\xbb\x06\x03\x00', + b'\x0e\x07\x03\x00', + b'\x4f\x08\x03\x00', + b'\xfa\x09\x03\x00', + b'\x0a\x0a\x03\x00', + b'\xbf\x0b\x03\x00', + b'\xc5\x0c\x03\x00', + b'\x70\x0d\x03\x00', + b'\x80\x0e\x03\x00', + b'\x35\x0f\x03\x00', + ]) + + def test_volkswagen_mqb_crc_licht_anf_01(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "Licht_Anf_01", 0x3D5, [ + b'\xc8\x00\x00\x04\x00\x00\x00\x00', + b'\x9f\x01\x00\x04\x00\x00\x00\x00', + b'\x5e\x02\x00\x04\x00\x00\x00\x00', + b'\x52\x03\x00\x04\x00\x00\x00\x00', + b'\xf2\x04\x00\x04\x00\x00\x00\x00', + b'\x79\x05\x00\x04\x00\x00\x00\x00', + b'\xe6\x06\x00\x04\x00\x00\x00\x00', + b'\xfd\x07\x00\x04\x00\x00\x00\x00', + b'\xf8\x08\x00\x04\x00\x00\x00\x00', + b'\xc6\x09\x00\x04\x00\x00\x00\x00', + b'\xf5\x0a\x00\x04\x00\x00\x00\x00', + b'\x1a\x0b\x00\x04\x00\x00\x00\x00', + b'\x65\x0c\x00\x04\x00\x00\x00\x00', + b'\x41\x0d\x00\x04\x00\x00\x00\x00', + b'\x7f\x0e\x00\x04\x00\x00\x00\x00', + b'\x98\x0f\x00\x04\x00\x00\x00\x00', + ]) + + def test_volkswagen_mqb_crc_esp_20(self, subtests): + self.verify_volkswagen_mqb_crc(subtests, "ESP_20", 0x65D, [ + b'\x98\x30\x2b\x10\x00\x00\x22\x81', + b'\xc8\x31\x2b\x10\x00\x00\x22\x81', + b'\x9d\x32\x2b\x10\x00\x00\x22\x81', + b'\x1f\x33\x2b\x10\x00\x00\x22\x81', + b'\x6e\x34\x2b\x10\x00\x00\x22\x81', + b'\x61\x35\x2b\x10\x00\x00\x22\x81', + b'\x6f\x36\x2b\x10\x00\x00\x22\x81', + b'\xe5\x37\x2b\x10\x00\x00\x22\x81', + b'\xf8\x38\x2b\x10\x00\x00\x22\x81', + b'\xe1\x39\x2b\x10\x00\x00\x22\x81', + b'\xaa\x3a\x2b\x10\x00\x00\x22\x81', + b'\xe6\x3b\x2b\x10\x00\x00\x22\x81', + b'\xef\x3c\x2b\x10\x00\x00\x22\x81', + b'\xbb\x3d\x2b\x10\x00\x00\x22\x81', + b'\x9b\x3e\x2b\x10\x00\x00\x22\x81', + b'\x72\x3f\x2b\x10\x00\x00\x22\x81', + ]) diff --git a/artifacts/package_runtime/iqdbc/can/tests/test_dbc_exceptions.py b/artifacts/package_runtime/iqdbc/can/tests/test_dbc_exceptions.py new file mode 100644 index 000000000..1b16fdbba --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/test_dbc_exceptions.py @@ -0,0 +1,29 @@ +import pytest + +from iqdbc.can import CANDefine, CANPacker, CANParser +from iqdbc.can.tests import TEST_DBC + + +class TestCanParserPackerExceptions: + def test_civic_exceptions(self): + dbc_file = "honda_civic_touring_2016_can_generated" + dbc_invalid = dbc_file + "abcdef" + msgs = [("STEERING_CONTROL", 50)] + with pytest.raises(FileNotFoundError): + CANParser(dbc_invalid, msgs, 0) + with pytest.raises(FileNotFoundError): + CANPacker(dbc_invalid) + with pytest.raises(FileNotFoundError): + CANDefine(dbc_invalid) + with pytest.raises(KeyError): + CANDefine(TEST_DBC) + + parser = CANParser(dbc_file, msgs, 0) + with pytest.raises(IndexError): + parser.update([b'']) + + # Everything is supposed to work below + CANParser(dbc_file, msgs, 0) + CANParser(dbc_file, [], 0) + CANPacker(dbc_file) + CANDefine(dbc_file) diff --git a/artifacts/package_runtime/iqdbc/can/tests/test_dbc_parser.py b/artifacts/package_runtime/iqdbc/can/tests/test_dbc_parser.py new file mode 100644 index 000000000..3e6005388 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/test_dbc_parser.py @@ -0,0 +1,21 @@ +from iqdbc.can import CANParser +from iqdbc.can.tests import ALL_DBCS + + +class TestDBCParser: + def test_enough_dbcs(self): + # sanity check that we're running on the real DBCs + assert len(ALL_DBCS) > 20 + + def test_parse_all_dbcs(self, subtests): + """ + Dynamic DBC parser checks: + - Checksum and counter length, start bit, endianness + - Duplicate message addresses and names + - Signal out of bounds + - All BO_, SG_, VAL_ lines for syntax errors + """ + + for dbc in ALL_DBCS: + with subtests.test(dbc=dbc): + CANParser(dbc, [], 0) diff --git a/artifacts/package_runtime/iqdbc/can/tests/test_define.py b/artifacts/package_runtime/iqdbc/can/tests/test_define.py new file mode 100644 index 000000000..dec8cf55d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/test_define.py @@ -0,0 +1,27 @@ +from iqdbc.can import CANDefine +from iqdbc.can.tests import ALL_DBCS + + +class TestCANDefine: + def test_civic(self): + + dbc_file = "honda_civic_touring_2016_can_generated" + defs = CANDefine(dbc_file) + + assert defs.dv[399] == defs.dv['STEER_STATUS'] + assert defs.dv[399] == {'STEER_STATUS': + {7: 'PERMANENT_FAULT', + 6: 'TMP_FAULT', + 5: 'FAULT_1', + 4: 'NO_TORQUE_ALERT_2', + 3: 'LOW_SPEED_LOCKOUT', + 2: 'NO_TORQUE_ALERT_1', + 1: 'DRIVER_STEERING', + 0: 'NORMAL'} + } + + def test_all_dbcs(self, subtests): + # Asserts no exceptions on all DBCs + for dbc in ALL_DBCS: + with subtests.test(dbc=dbc): + CANDefine(dbc) diff --git a/artifacts/package_runtime/iqdbc/can/tests/test_packer_parser.py b/artifacts/package_runtime/iqdbc/can/tests/test_packer_parser.py new file mode 100644 index 000000000..f6ea3922a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/can/tests/test_packer_parser.py @@ -0,0 +1,407 @@ +import pytest +import random + +from iqdbc.can import CANPacker, CANParser +from iqdbc.can.tests import TEST_DBC + +MAX_BAD_COUNTER = 5 + + +class TestCanParserPacker: + def test_seen_addresses(self): + parser = CANParser(TEST_DBC, [], 0) + parser.update([0, [(0x123, b'\x00', 0), (0x124, b'\x00', 1)]]) + assert parser.seen_addresses == {0x123} + parser.enable_capture = False + parser.update([1, [(0x125, b'\x00', 0)]]) + assert parser.seen_addresses == {0x123} + + def test_packer(self): + packer = CANPacker(TEST_DBC) + + for b in range(6): + for i in range(256): + values = {"COUNTER": i} + addr, dat, bus = packer.make_can_msg("CAN_FD_MESSAGE", b, values) + assert addr == 245 + assert bus == b + assert dat[0] == i + + def test_packer_counter(self): + msgs = [("CAN_FD_MESSAGE", 0), ] + packer = CANPacker(TEST_DBC) + parser = CANParser(TEST_DBC, msgs, 0) + + # packer should increment the counter + for i in range(1000): + msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {}) + parser.update([0, [msg]]) + assert parser.vl["CAN_FD_MESSAGE"]["COUNTER"] == (i % 256) + + # setting COUNTER should override + for _ in range(100): + cnt = random.randint(0, 255) + msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, { + "COUNTER": cnt, + "SIGNED": 0 + }) + parser.update([0, [msg]]) + assert parser.vl["CAN_FD_MESSAGE"]["COUNTER"] == cnt + + cnt = random.randint(0, 255) + msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {"SIGNED": 0}, rx_counter=cnt) + parser.update([0, [msg]]) + assert parser.vl["CAN_FD_MESSAGE"]["COUNTER"] == cnt + + # then, should resume counting from the override value + cnt = parser.vl["CAN_FD_MESSAGE"]["COUNTER"] + for i in range(100): + msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {}) + parser.update([0, [msg]]) + assert parser.vl["CAN_FD_MESSAGE"]["COUNTER"] == ((cnt + i) % 256) + + def test_parser_can_valid(self): + msgs = [("CAN_FD_MESSAGE", 10), ] + packer = CANPacker(TEST_DBC) + parser = CANParser(TEST_DBC, msgs, 0) + + # shouldn't be valid initially + assert not parser.can_valid + + # not valid until the message is seen + for _ in range(100): + parser.update([0, []]) + assert not parser.can_valid + + # valid once seen + for i in range(1, 100): + t = int(0.01 * i * 1e9) + msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {}) + parser.update([t, [msg]]) + assert parser.can_valid + + def test_lazy_add_not_ignore_alive(self): + """ + Accessing an undeclared message via parser.vl[...] lazily adds it via + _add_message(key) with the default freq=None, which is NOT the same as + declaring it with math.nan (ignore_alive=True). It's treated as "assume + ~1Hz, must be seen within ~10s" — so if that message is never fed, the + parser is permanently invalid. Declaring an optional/rarely-sent message + with math.nan (or gating the .vl[...] read entirely) is required to avoid + this; see iqdbc/car/volkswagen/carstate.py's Diagnose_1/EPB_1 bugs. + """ + parser = CANParser(TEST_DBC, [], 0) + assert parser.can_valid + + # lazily add STEERING_CONTROL by reading it, without ever declaring it + # or feeding any CAN data for it + _ = parser.vl["STEERING_CONTROL"] + state = parser.message_states[parser.dbc.name_to_msg["STEERING_CONTROL"].address] + assert not state.ignore_alive + + # never becomes valid again, no matter how many times it's checked + # (can_valid debounces over MAX_BAD_COUNTER reads before flipping false) + for _ in range(MAX_BAD_COUNTER): + _ = parser.can_valid + for _ in range(20): + assert not parser.can_valid + + def test_parser_updated_list(self): + msgs = [("CAN_FD_MESSAGE", 10), ] + parser = CANParser(TEST_DBC, msgs, 0) + packer = CANPacker(TEST_DBC) + + msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {}) + ret = parser.update([0, [msg]]) + assert ret == {245} + + ret = parser.update([]) + assert len(ret) == 0 + + def test_parser_counter_can_valid(self): + """ + Tests number of allowed bad counters + ensures CAN stays invalid + while receiving invalid messages + that we can recover + """ + msgs = [ + ("STEERING_CONTROL", 0), + ] + packer = CANPacker("honda_civic_touring_2016_can_generated") + parser = CANParser("honda_civic_touring_2016_can_generated", msgs, 0) + + msg = packer.make_can_msg("STEERING_CONTROL", 0, {"COUNTER": 0}) + + # bad static counter, invalid once it's seen MAX_BAD_COUNTER messages + for idx in range(0x1000): + parser.update([0, [msg]]) + assert ((idx + 1) < MAX_BAD_COUNTER) == parser.can_valid + + # one to recover + msg = packer.make_can_msg("STEERING_CONTROL", 0, {"COUNTER": 1}) + parser.update([0, [msg]]) + assert parser.can_valid + + def test_parser_no_partial_update(self): + """ + Ensure that the CANParser doesn't partially update messages with invalid signals (COUNTER/CHECKSUM). + Previously, the signal update loop would only break once it got to one of these invalid signals, + after already updating most/all of the signals. + """ + msgs = [ + ("STEERING_CONTROL", 0), + ] + packer = CANPacker("honda_civic_touring_2016_can_generated") + parser = CANParser("honda_civic_touring_2016_can_generated", msgs, 0) + + def rx_steering_msg(values, bad_checksum=False): + msg = packer.make_can_msg("STEERING_CONTROL", 0, values) + if bad_checksum: + # add 1 to checksum + dat = bytearray(msg[1]) + dat[4] = (dat[4] & 0xF0) | ((dat[4] & 0x0F) + 1) + msg = (msg[0], bytes(dat), msg[2]) + + parser.update([0, [msg]]) + + rx_steering_msg({"STEER_TORQUE": 100}, bad_checksum=False) + assert parser.vl["STEERING_CONTROL"]["STEER_TORQUE"] == 100 + assert parser.vl_all["STEERING_CONTROL"]["STEER_TORQUE"] == [100] + + for _ in range(5): + rx_steering_msg({"STEER_TORQUE": 200}, bad_checksum=True) + assert parser.vl["STEERING_CONTROL"]["STEER_TORQUE"] == 100 + assert parser.vl_all["STEERING_CONTROL"]["STEER_TORQUE"] == [] + + # Even if CANParser doesn't update instantaneous vl, make sure it didn't add invalid values to vl_all + rx_steering_msg({"STEER_TORQUE": 300}, bad_checksum=False) + assert parser.vl["STEERING_CONTROL"]["STEER_TORQUE"] == 300 + assert parser.vl_all["STEERING_CONTROL"]["STEER_TORQUE"] == [300] + + def test_packer_parser(self): + msgs = [ + ("Brake_Status", 0), + ("CAN_FD_MESSAGE", 0), + ("STEERING_CONTROL", 0), + ] + packer = CANPacker(TEST_DBC) + parser = CANParser(TEST_DBC, msgs, 0) + + for steer in range(-256, 255): + for active in (1, 0): + values = { + "STEERING_CONTROL": { + "STEER_TORQUE": steer, + "STEER_TORQUE_REQUEST": active, + }, + "Brake_Status": { + "Signal1": 61042322657536.0, + }, + "CAN_FD_MESSAGE": { + "SIGNED": steer, + "64_BIT_LE": random.randint(0, 100), + "64_BIT_BE": random.randint(0, 100), + }, + } + + msgs = [packer.make_can_msg(k, 0, v) for k, v in values.items()] + parser.update([0, msgs]) + + for k, v in values.items(): + for key, val in v.items(): + assert parser.vl[k][key] == pytest.approx(val) + + # also check address + for sig in ("STEER_TORQUE", "STEER_TORQUE_REQUEST", "COUNTER", "CHECKSUM"): + assert parser.vl["STEERING_CONTROL"][sig] == parser.vl[228][sig] + + def test_scale_offset(self): + """Test that both scale and offset are correctly preserved""" + dbc_file = "honda_civic_touring_2016_can_generated" + msgs = [("VSA_STATUS", 50)] + parser = CANParser(dbc_file, msgs, 0) + packer = CANPacker(dbc_file) + + for brake in range(100): + values = {"USER_BRAKE": brake} + msgs = packer.make_can_msg("VSA_STATUS", 0, values) + parser.update([0, [msgs]]) + + assert parser.vl["VSA_STATUS"]["USER_BRAKE"] == pytest.approx(brake) + + def test_subaru(self): + # Subaru is little endian + + dbc_file = "subaru_global_2017_generated" + + msgs = [("ES_LKAS", 50)] + + parser = CANParser(dbc_file, msgs, 0) + packer = CANPacker(dbc_file) + + idx = 0 + for steer in range(-256, 255): + for active in [1, 0]: + values = { + "LKAS_Output": steer, + "LKAS_Request": active, + "SET_1": 1 + } + + msgs = packer.make_can_msg("ES_LKAS", 0, values) + parser.update([0, [msgs]]) + + assert parser.vl["ES_LKAS"]["LKAS_Output"] == pytest.approx(steer) + assert parser.vl["ES_LKAS"]["LKAS_Request"] == pytest.approx(active) + assert parser.vl["ES_LKAS"]["SET_1"] == pytest.approx(1) + assert parser.vl["ES_LKAS"]["COUNTER"] == pytest.approx(idx % 16) + idx += 1 + + def test_bus_timeout(self): + """Test CAN bus timeout detection""" + dbc_file = "honda_civic_touring_2016_can_generated" + + freq = 100 + msgs = [("VSA_STATUS", freq), ("STEER_MOTOR_TORQUE", freq/2)] + + parser = CANParser(dbc_file, msgs, 0) + packer = CANPacker(dbc_file) + + i = 0 + + def send_msg(blank=False): + nonlocal i + i += 1 + t = i*((1 / freq) * 1e9) + + if blank: + msgs = [] + else: + msgs = [packer.make_can_msg("VSA_STATUS", 0, {}), ] + + parser.update([t, msgs]) + + # all good, no timeout + for _ in range(1000): + send_msg() + assert not parser.bus_timeout, str(_) + + # timeout after 10 blank msgs + for n in range(200): + send_msg(blank=True) + assert (n >= 10) == parser.bus_timeout + + # no timeout immediately after seen again + send_msg() + assert not parser.bus_timeout + + def test_updated(self): + """Test updated value dict""" + dbc_file = "honda_civic_touring_2016_can_generated" + msgs = [("VSA_STATUS", 50)] + parser = CANParser(dbc_file, msgs, 0) + packer = CANPacker(dbc_file) + + # Make sure nothing is updated + assert len(parser.vl_all["VSA_STATUS"]["USER_BRAKE"]) == 0 + + idx = 0 + for _ in range(10): + # Ensure CANParser holds the values of any duplicate messages over multiple frames + user_brake_vals = [random.randrange(100) for _ in range(random.randrange(5, 10))] + half_idx = len(user_brake_vals) // 2 + can_msgs = [[], []] + for frame, brake_vals in enumerate((user_brake_vals[:half_idx], user_brake_vals[half_idx:])): + for user_brake in brake_vals: + values = {"USER_BRAKE": user_brake} + can_msgs[frame].append(packer.make_can_msg("VSA_STATUS", 0, values)) + idx += 1 + + parser.update([[0, m] for m in can_msgs]) + vl_all = parser.vl_all["VSA_STATUS"]["USER_BRAKE"] + + assert vl_all == user_brake_vals + if len(user_brake_vals): + assert vl_all[-1] == parser.vl["VSA_STATUS"]["USER_BRAKE"] + + def test_timestamp_nanos(self): + """Test message timestamp dict""" + dbc_file = "honda_civic_touring_2016_can_generated" + + msgs = [ + ("VSA_STATUS", 50), + ("POWERTRAIN_DATA", 100), + ] + + parser = CANParser(dbc_file, msgs, 0) + packer = CANPacker(dbc_file) + + # Check the default timestamp is zero + for msg in ("VSA_STATUS", "POWERTRAIN_DATA"): + ts_nanos = parser.ts_nanos[msg].values() + assert set(ts_nanos) == {0} + + # Check: + # - timestamp is only updated for correct messages + # - timestamp is correct for multiple runs + # - timestamp is from the latest message if updating multiple strings + for _ in range(10): + can_strings = [] + log_mono_time = 0 + for i in range(10): + log_mono_time = int(0.01 * i * 1e+9) + can_msg = packer.make_can_msg("VSA_STATUS", 0, {}) + can_strings.append((log_mono_time, [can_msg])) + parser.update(can_strings) + + ts_nanos = parser.ts_nanos["VSA_STATUS"].values() + assert set(ts_nanos) == {log_mono_time} + ts_nanos = parser.ts_nanos["POWERTRAIN_DATA"].values() + assert set(ts_nanos) == {0} + + def test_nonexistent_messages(self): + # Ensure we don't allow messages not in the DBC + existing_messages = ("STEERING_CONTROL", 228, "CAN_FD_MESSAGE", 245) + + for msg in existing_messages: + CANParser(TEST_DBC, [(msg, 0)], 0) + with pytest.raises(RuntimeError): + new_msg = msg + "1" if isinstance(msg, str) else msg + 1 + CANParser(TEST_DBC, [(new_msg, 0)], 0) + + def test_track_all_signals(self): + parser = CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 0)], 0) + assert parser.vl["ACC_CONTROL"] == { + "ACCEL_CMD": 0, + "ALLOW_LONG_PRESS": 0, + "ACC_MALFUNCTION": 0, + "RADAR_DIRTY": 0, + "DISTANCE": 0, + "MINI_CAR": 0, + "ACC_TYPE": 0, + "CANCEL_REQ": 0, + "ACC_CUT_IN": 0, + "LEAD_VEHICLE_STOPPED": 0, + "PERMIT_BRAKING": 0, + "RELEASE_STANDSTILL": 0, + "ITS_CONNECT_LEAD": 0, + "ACCEL_CMD_ALT": 0, + "CHECKSUM": 0, + } + + def test_disallow_duplicate_messages(self): + CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 5)], 0) + + with pytest.raises(RuntimeError): + CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 5), ("ACC_CONTROL", 10)], 0) + + with pytest.raises(RuntimeError): + CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 10), ("ACC_CONTROL", 10)], 0) + + def test_allow_undefined_msgs(self): + # TODO: we should throw an exception for these, but we need good + # discovery tests in openpilot first + packer = CANPacker("toyota_nodsu_pt_generated") + + assert packer.make_can_msg("ACC_CONTROL", 0, {"UNKNOWN_SIGNAL": 0}) == (835, b'\x00\x00\x00\x00\x00\x00\x00N', 0) + assert packer.make_can_msg("UNKNOWN_MESSAGE", 0, {"UNKNOWN_SIGNAL": 0}) == (0, b'', 0) + assert packer.make_can_msg(0, 0, {"UNKNOWN_SIGNAL": 0}) == (0, b'', 0) diff --git a/artifacts/package_runtime/iqdbc/car/__init__.py b/artifacts/package_runtime/iqdbc/car/__init__.py new file mode 100644 index 000000000..a77c8212f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/__init__.py @@ -0,0 +1,252 @@ +# functions common among cars +import numpy as np +from dataclasses import dataclass, field +from enum import IntFlag, ReprEnum, StrEnum, EnumType, auto +from dataclasses import replace + +from iqdbc.car import structs, uds +from iqdbc.car.can_definitions import CanData +from iqdbc.car.docs_definitions import CarDocs, ExtraCarDocs + +DT_CTRL = 0.01 # car state and control loop timestep (s) + +# kg of standard extra cargo to count for drive, gas, etc... +STD_CARGO_KG = 136. + +ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2 + +ButtonType = structs.CarState.ButtonEvent.Type + + +def apply_hysteresis(val: float, val_steady: float, hyst_gap: float) -> float: + if val > val_steady + hyst_gap: + val_steady = val - hyst_gap + elif val < val_steady - hyst_gap: + val_steady = val + hyst_gap + return val_steady + + +def create_button_events(cur_btn: int, prev_btn: int, buttons_dict: dict[int, structs.CarState.ButtonEvent.Type], + unpressed_btn: int = 0) -> list[structs.CarState.ButtonEvent]: + events: list[structs.CarState.ButtonEvent] = [] + + if cur_btn == prev_btn: + return events + + # Add events for button presses, multiple when a button switches without going to unpressed + for pressed, btn in ((False, prev_btn), (True, cur_btn)): + if btn != unpressed_btn: + events.append(structs.CarState.ButtonEvent(pressed=pressed, + type=buttons_dict.get(btn, ButtonType.unknown))) + return events + + +def gen_empty_fingerprint(): + return {i: {} for i in range(8)} + + +# these params were derived for the Civic and used to calculate params for other cars +class VehicleDynamicsParams: + MASS = 1326. + STD_CARGO_KG + WHEELBASE = 2.70 + CENTER_TO_FRONT = WHEELBASE * 0.4 + CENTER_TO_REAR = WHEELBASE - CENTER_TO_FRONT + ROTATIONAL_INERTIA = 2500 + TIRE_STIFFNESS_FRONT = 192150 + TIRE_STIFFNESS_REAR = 202500 + + +# TODO: get actual value, for now starting with reasonable value for +# civic and scaling by mass and wheelbase +def scale_rot_inertia(mass, wheelbase): + return VehicleDynamicsParams.ROTATIONAL_INERTIA * mass * wheelbase ** 2 / (VehicleDynamicsParams.MASS * VehicleDynamicsParams.WHEELBASE ** 2) + + +# TODO: start from empirically derived lateral slip stiffness for the civic and scale by +# mass and CG position, so all cars will have approximately similar dyn behaviors +def scale_tire_stiffness(mass, wheelbase, center_to_front, tire_stiffness_factor): + center_to_rear = wheelbase - center_to_front + tire_stiffness_front = (VehicleDynamicsParams.TIRE_STIFFNESS_FRONT * tire_stiffness_factor) * mass / VehicleDynamicsParams.MASS * \ + (center_to_rear / wheelbase) / (VehicleDynamicsParams.CENTER_TO_REAR / VehicleDynamicsParams.WHEELBASE) + + tire_stiffness_rear = (VehicleDynamicsParams.TIRE_STIFFNESS_REAR * tire_stiffness_factor) * mass / VehicleDynamicsParams.MASS * \ + (center_to_front / wheelbase) / (VehicleDynamicsParams.CENTER_TO_FRONT / VehicleDynamicsParams.WHEELBASE) + + return tire_stiffness_front, tire_stiffness_rear + + +DbcDict = dict[StrEnum, str] + + +class Bus(StrEnum): + pt = auto() + aux = auto() + cam = auto() + radar = auto() + adas = auto() + alt = auto() + body = auto() + chassis = auto() + loopback = auto() + main = auto() + party = auto() + ap_party = auto() + + +def rate_limit(new_value, last_value, dw_step, up_step): + return float(np.clip(new_value, last_value + dw_step, last_value + up_step)) + + +def make_tester_present_msg(addr, bus, subaddr=None, suppress_response=False): + dat = [0x02, uds.SERVICE_TYPE.TESTER_PRESENT] + if subaddr is not None: + dat.insert(0, subaddr) + dat.append(0x80 if suppress_response else 0x0) # sub-function + + dat.extend([0x0] * (8 - len(dat))) + return CanData(addr, bytes(dat), bus) + + +def get_safety_config(safety_model: structs.CarParams.SafetyModel, safety_param: int | None = None) -> structs.CarParams.SafetyConfig: + ret = structs.CarParams.SafetyConfig() + ret.safetyModel = safety_model + if safety_param is not None: + ret.safetyParam = safety_param + return ret + + +class CanBusBase: + offset: int + + def __init__(self, CP, fingerprint: dict[int, dict[int, int]] | None) -> None: + if CP is None: + assert fingerprint is not None + num = max([k for k, v in fingerprint.items() if len(v)], default=0) // 4 + 1 + else: + num = len(CP.safetyConfigs) + self.offset = 4 * (num - 1) + + +class CanSignalRateCalculator: + """ + Calculates the instantaneous rate of a CAN signal by using the counter + variable and the known frequency of the CAN message that contains it. + """ + def __init__(self, frequency: int): + self.frequency = frequency + self.previous_value = 0 + self.rate = 0 + + def update(self, current_value: float, updated: bool): + if updated: + self.rate = (current_value - self.previous_value) * self.frequency + + self.previous_value = current_value + + return self.rate + + +@dataclass(frozen=True, kw_only=True) +class CarSpecs: + mass: float # kg, curb weight + wheelbase: float # meters + steerRatio: float + centerToFrontRatio: float = 0.5 + minSteerSpeed: float = 0.0 # m/s + minEnableSpeed: float = -1.0 # m/s + tireStiffnessFactor: float = 1.0 + + def override(self, **kwargs): + return replace(self, **kwargs) + + +class Freezable: + _frozen: bool = False + + def freeze(self): + if not self._frozen: + self._frozen = True + + def __setattr__(self, *args, **kwargs): + if self._frozen: + raise Exception("cannot modify frozen object") + super().__setattr__(*args, **kwargs) + + +@dataclass(order=True) +class PlatformConfigBase(Freezable): + car_docs: list[CarDocs] | list[ExtraCarDocs] + specs: CarSpecs + + dbc_dict: DbcDict + + flags: int = 0 + iq_flags: int = 0 + + platform_str: str | None = None + + origin_car_docs: list[CarDocs] | list[ExtraCarDocs] = field(init=False) + + def __hash__(self) -> int: + return hash(self.platform_str) + + def override(self, **kwargs): + return replace(self, **kwargs) + + def init(self): + pass + + def __post_init__(self): + self.origin_car_docs = self.car_docs + self.init() + + def get_all_docs(self): + return self.origin_car_docs + + +@dataclass(order=True) +class PlatformConfig(PlatformConfigBase): + car_docs: list[CarDocs] + specs: CarSpecs + dbc_dict: DbcDict + + +@dataclass(order=True) +class ExtraPlatformConfig(PlatformConfigBase): + car_docs: list[ExtraCarDocs] + specs: CarSpecs = CarSpecs(mass=0., wheelbase=0., steerRatio=0.) + dbc_dict: DbcDict = field(default_factory=lambda: dict()) + + +class PlatformsType(EnumType): + def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **kwds): + for key in classdict._member_names.keys(): + cfg: PlatformConfig = classdict[key] + cfg.platform_str = key + cfg.freeze() + return super().__new__(metacls, cls, bases, classdict, boundary=boundary, _simple=_simple, **kwds) + + +class Platforms(str, ReprEnum, metaclass=PlatformsType): + config: PlatformConfigBase + + def __new__(cls, platform_config: PlatformConfig): + member = str.__new__(cls, platform_config.platform_str) + member.config = platform_config + member._value_ = platform_config.platform_str + return member + + def __repr__(self): + return f"<{self.__class__.__name__}.{self.name}>" + + @classmethod + def create_dbc_map(cls) -> dict[str, DbcDict]: + return {p: p.config.dbc_dict for p in cls} + + @classmethod + def with_flags(cls, flags: IntFlag) -> set['Platforms']: + return {p for p in cls if p.config.flags & flags} + + @classmethod + def with_iq_flags(cls, iq_flags: IntFlag) -> set['Platforms']: + return {p for p in cls if p.config.iq_flags & iq_flags} diff --git a/artifacts/package_runtime/iqdbc/car/body/__init__.py b/artifacts/package_runtime/iqdbc/car/body/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/body/bodycan.py b/artifacts/package_runtime/iqdbc/car/body/bodycan.py new file mode 100644 index 000000000..2a7ee8996 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/body/bodycan.py @@ -0,0 +1,17 @@ +from iqdbc.car.crc import CRC8BODY + + +def create_control(packer, torque_l, torque_r): + values = { + "TORQUE_L": torque_l, + "TORQUE_R": torque_r, + } + + return packer.make_can_msg("TORQUE_CMD", 0, values) + + +def body_checksum(address: int, sig, d: bytearray) -> int: + crc = 0xFF + for i in range(len(d) - 2, -1, -1): + crc = CRC8BODY[crc ^ d[i]] + return crc diff --git a/artifacts/package_runtime/iqdbc/car/body/carcontroller.py b/artifacts/package_runtime/iqdbc/car/body/carcontroller.py new file mode 100644 index 000000000..7b222028d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/body/carcontroller.py @@ -0,0 +1,82 @@ +import numpy as np + +from iqdbc.can import CANPacker +from iqdbc.car import Bus, DT_CTRL +from iqdbc.car.common.pid import PIDController +from iqdbc.car.body import bodycan +from iqdbc.car.body.values import SPEED_FROM_RPM +from iqdbc.car.interfaces import CarControllerBase + +MAX_TORQUE = 500 +MAX_TORQUE_RATE = 50 +MAX_ANGLE_ERROR = np.radians(7) +MAX_POS_INTEGRATOR = 0.2 # meters +MAX_TURN_INTEGRATOR = 0.1 # meters + + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ): + super().__init__(dbc_names, CP, CP_IQ) + self.packer = CANPacker(dbc_names[Bus.main]) + + # PIDs + self.turn_pid = PIDController(110, k_i=11.5, rate=1 / DT_CTRL) + self.wheeled_speed_pid = PIDController(110, k_i=11.5, rate=1 / DT_CTRL) + + self.torque_r_filtered = 0. + self.torque_l_filtered = 0. + + @staticmethod + def deadband_filter(torque, deadband): + if torque > 0: + torque += deadband + else: + torque -= deadband + return torque + + def update(self, CC, CC_IQ, CS, now_nanos): + + torque_l = 0 + torque_r = 0 + + if CC.enabled: + # Read these from the joystick + # TODO: this isn't acceleration, okay? + speed_desired = CC.actuators.accel / 5. + speed_diff_desired = -CC.actuators.torque / 2. + + speed_measured = SPEED_FROM_RPM * (CS.out.wheelSpeeds.fl + CS.out.wheelSpeeds.fr) / 2. + speed_error = speed_desired - speed_measured + + torque = self.wheeled_speed_pid.update(speed_error, freeze_integrator=False) + + speed_diff_measured = SPEED_FROM_RPM * (CS.out.wheelSpeeds.fl - CS.out.wheelSpeeds.fr) + turn_error = speed_diff_measured - speed_diff_desired + freeze_integrator = ((turn_error < 0 and self.turn_pid.error_integral <= -MAX_TURN_INTEGRATOR) or + (turn_error > 0 and self.turn_pid.error_integral >= MAX_TURN_INTEGRATOR)) + torque_diff = self.turn_pid.update(turn_error, freeze_integrator=freeze_integrator) + + # Combine 2 PIDs outputs + torque_r = torque + torque_diff + torque_l = torque - torque_diff + + # Torque rate limits + self.torque_r_filtered = np.clip(self.deadband_filter(torque_r, 10), + self.torque_r_filtered - MAX_TORQUE_RATE, + self.torque_r_filtered + MAX_TORQUE_RATE) + self.torque_l_filtered = np.clip(self.deadband_filter(torque_l, 10), + self.torque_l_filtered - MAX_TORQUE_RATE, + self.torque_l_filtered + MAX_TORQUE_RATE) + torque_r = int(np.clip(self.torque_r_filtered, -MAX_TORQUE, MAX_TORQUE)) + torque_l = int(np.clip(self.torque_l_filtered, -MAX_TORQUE, MAX_TORQUE)) + + can_sends = [] + can_sends.append(bodycan.create_control(self.packer, torque_l, torque_r)) + + new_actuators = CC.actuators.as_builder() + new_actuators.accel = torque_l + new_actuators.torque = torque_r + new_actuators.torqueOutputCan = torque_r + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/body/carstate.py b/artifacts/package_runtime/iqdbc/car/body/carstate.py new file mode 100644 index 000000000..f929b22f6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/body/carstate.py @@ -0,0 +1,36 @@ +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.body.values import DBC + + +class CarState(CarStateBase): + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.main] + ret = structs.CarState() + ret_iq = structs.IQCarState() + + ret.wheelSpeeds.fl = cp.vl['MOTORS_DATA']['SPEED_L'] + ret.wheelSpeeds.fr = cp.vl['MOTORS_DATA']['SPEED_R'] + + ret.vEgoRaw = ((ret.wheelSpeeds.fl + ret.wheelSpeeds.fr) / 2.) * self.CP.wheelSpeedFactor + + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.standstill = False + + ret.steerFaultPermanent = any([cp.vl['VAR_VALUES']['MOTOR_ERR_L'], cp.vl['VAR_VALUES']['MOTOR_ERR_R'], + cp.vl['VAR_VALUES']['FAULT']]) + + ret.charging = cp.vl["BODY_DATA"]["CHARGER_CONNECTED"] == 1 + ret.fuelGauge = cp.vl["BODY_DATA"]["BATT_PERCENTAGE"] / 100 + + # irrelevant for non-car + ret.gearShifter = structs.CarState.GearShifter.drive + ret.cruiseState.enabled = True + ret.cruiseState.available = True + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + return {Bus.main: CANParser(DBC[CP.carFingerprint][Bus.main], [], 0)} diff --git a/artifacts/package_runtime/iqdbc/car/body/fingerprints.py b/artifacts/package_runtime/iqdbc/car/body/fingerprints.py new file mode 100644 index 000000000..a87cb7e53 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/body/fingerprints.py @@ -0,0 +1,28 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.body.values import CAR + +Ecu = CarParams.Ecu + +# debug ecu fw version is the git hash of the firmware + + +FINGERPRINTS = { + CAR.COMMA_BODY: [{ + 513: 8, 516: 8, 514: 3, 515: 4 + }], +} + +FW_VERSIONS = { + CAR.COMMA_BODY: { + (Ecu.engine, 0x720, None): [ + b'0.0.01', + b'0.3.00a', + b'02/27/2022', + ], + (Ecu.debug, 0x721, None): [ + b'166bd860', + b'dc780f85', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/body/interface.py b/artifacts/package_runtime/iqdbc/car/body/interface.py new file mode 100644 index 000000000..1510bb0b5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/body/interface.py @@ -0,0 +1,30 @@ +import math +from iqdbc.car import get_safety_config, structs +from iqdbc.car.body.carcontroller import CarController +from iqdbc.car.body.carstate import CarState +from iqdbc.car.body.values import SPEED_FROM_RPM +from iqdbc.car.interfaces import CarInterfaceBase + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.notCar = True + ret.brand = "body" + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.body)] + + ret.minSteerSpeed = -math.inf + ret.maxLateralAccel = math.inf # TODO: set to a reasonable value + ret.steerLimitTimer = 1.0 + ret.steerActuatorDelay = 0. + + ret.wheelSpeedFactor = SPEED_FROM_RPM + + ret.radarUnavailable = True + ret.openpilotLongitudinalControl = True + ret.steerControlType = structs.CarParams.SteerControlType.angle + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/body/values.py b/artifacts/package_runtime/iqdbc/car/body/values.py new file mode 100644 index 000000000..2a410b929 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/body/values.py @@ -0,0 +1,40 @@ +from iqdbc.car import Bus, CarSpecs, PlatformConfig, Platforms +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarDocs +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries + +Ecu = CarParams.Ecu + +SPEED_FROM_RPM = 0.008587 + + +class CarControllerParams: + ANGLE_DELTA_BP = [0., 5., 15.] + ANGLE_DELTA_V = [5., .8, .15] # windup limit + ANGLE_DELTA_VU = [5., 3.5, 0.4] # unwind limit + LKAS_MAX_TORQUE = 1 # A value of 1 is easy to overpower + STEER_THRESHOLD = 1.0 + + def __init__(self, CP): + pass + + +class CAR(Platforms): + COMMA_BODY = PlatformConfig( + [CarDocs("comma body", package="All", video="https://youtu.be/VT-i3yRsX2s?t=2736")], + CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44), + {Bus.main: 'comma_body'}, + ) + + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.UDS_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.UDS_VERSION_RESPONSE], + bus=0, + ), + ], +) + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/can_definitions.py b/artifacts/package_runtime/iqdbc/car/can_definitions.py new file mode 100644 index 000000000..2dba7f26a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/can_definitions.py @@ -0,0 +1,15 @@ +from collections.abc import Callable +from typing import NamedTuple, Protocol + + +class CanData(NamedTuple): + address: int + dat: bytes + src: int + + +CanSendCallable = Callable[[list[CanData]], None] + + +class CanRecvCallable(Protocol): + def __call__(self, wait_for_one: bool = False) -> list[list[CanData]]: ... diff --git a/artifacts/package_runtime/iqdbc/car/car.capnp b/artifacts/package_runtime/iqdbc/car/car.capnp new file mode 100644 index 000000000..48a71b75e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/car.capnp @@ -0,0 +1,839 @@ +using Cxx = import "./include/c++.capnp"; +$Cxx.namespace("cereal"); + +@0x8e2af1e708af8b8d; + +# ******* events causing controls state machine transition ******* + +# IMPORTANT: This struct is to not be modified so old logs can be parsed +struct OnroadEventDEPRECATED @0x9b1657f34caf3ad3 { + name @0 :EventName; + + # event types + enable @1 :Bool; + noEntry @2 :Bool; + warning @3 :Bool; # alerts presented only when enabled or soft disabling + userDisable @4 :Bool; + softDisable @5 :Bool; + immediateDisable @6 :Bool; + preEnable @7 :Bool; + permanent @8 :Bool; # alerts presented regardless of openpilot state + overrideLateral @10 :Bool; + overrideLongitudinal @9 :Bool; + + enum EventName @0xbaa8c5d505f727de { + canError @0; + steerUnavailable @1; + wrongGear @4; + doorOpen @5; + seatbeltNotLatched @6; + espDisabled @7; + wrongCarMode @8; + steerTempUnavailable @9; + reverseGear @10; + buttonCancel @11; + buttonEnable @12; + pedalPressed @13; # exits active state + preEnableStandstill @73; # added during pre-enable state with brake + gasPressedOverride @108; # added when user is pressing gas with no disengage on gas + steerOverride @114; + cruiseDisabled @14; + speedTooLow @17; + outOfSpace @18; + overheat @19; + calibrationIncomplete @20; + calibrationInvalid @21; + calibrationRecalibrating @117; + controlsMismatch @22; + pcmEnable @23; + pcmDisable @24; + radarFault @26; + brakeHold @28; + parkBrake @29; + manualRestart @30; + joystickDebug @34; + longitudinalManeuver @124; + steerTempUnavailableSilent @35; + resumeRequired @36; + preDriverDistracted @37; + promptDriverDistracted @38; + driverDistracted @39; + preDriverUnresponsive @43; + promptDriverUnresponsive @44; + driverUnresponsive @45; + belowSteerSpeed @46; + lowBattery @48; + accFaulted @51; + sensorDataInvalid @52; + commIssue @53; + commIssueAvgFreq @109; + tooDistracted @54; + posenetInvalid @55; + preLaneChangeLeft @57; + preLaneChangeRight @58; + laneChange @59; + lowMemory @63; + stockAeb @64; + ldw @65; + carUnrecognized @66; + invalidLkasSetting @69; + speedTooHigh @70; + laneChangeBlocked @71; + relayMalfunction @72; + stockFcw @74; + startup @75; + startupNoCar @76; + startupNoControl @77; + startupNoSecOcKey @125; + startupMaster @78; + fcw @79; + steerSaturated @80; + belowEngageSpeed @84; + noGps @85; + wrongCruiseMode @87; + modeldLagging @89; + deviceFalling @90; + fanMalfunction @91; + cameraMalfunction @92; + cameraFrameRate @110; + processNotRunning @95; + dashcamMode @96; + selfdriveInitializing @98; + usbError @99; + cruiseMismatch @106; + canBusMissing @111; + selfdrivedLagging @112; + resumeBlocked @113; + steerTimeLimit @115; + vehicleSensorsInvalid @116; + locationdTemporaryError @103; + locationdPermanentError @118; + paramsdTemporaryError @50; + paramsdPermanentError @119; + actuatorsApiUnavailable @120; + espActive @121; + personalityChanged @122; + aeb @123; + + radarCanErrorDEPRECATED @15; + communityFeatureDisallowedDEPRECATED @62; + radarCommIssueDEPRECATED @67; + driverMonitorLowAccDEPRECATED @68; + gasUnavailableDEPRECATED @3; + dataNeededDEPRECATED @16; + modelCommIssueDEPRECATED @27; + ipasOverrideDEPRECATED @33; + geofenceDEPRECATED @40; + driverMonitorOnDEPRECATED @41; + driverMonitorOffDEPRECATED @42; + calibrationProgressDEPRECATED @47; + invalidGiraffeHondaDEPRECATED @49; + invalidGiraffeToyotaDEPRECATED @60; + internetConnectivityNeededDEPRECATED @61; + whitePandaUnsupportedDEPRECATED @81; + commIssueWarningDEPRECATED @83; + focusRecoverActiveDEPRECATED @86; + neosUpdateRequiredDEPRECATED @88; + modelLagWarningDEPRECATED @93; + startupOneplusDEPRECATED @82; + startupFuzzyFingerprintDEPRECATED @97; + noTargetDEPRECATED @25; + brakeUnavailableDEPRECATED @2; + plannerErrorDEPRECATED @32; + gpsMalfunctionDEPRECATED @94; + roadCameraErrorDEPRECATED @100; + driverCameraErrorDEPRECATED @101; + wideRoadCameraErrorDEPRECATED @102; + highCpuUsageDEPRECATED @105; + startupNoFwDEPRECATED @104; + lowSpeedLockoutDEPRECATED @31; + lkasDisabledDEPRECATED @107; + soundsUnavailableDEPRECATED @56; + } +} + +struct CarState { + # CAN health + canValid @26 :Bool; # invalid counter/checksums + canTimeout @40 :Bool; # CAN bus dropped out + canErrorCounter @48 :UInt32; + + # process meta + cumLagMs @50 :Float32; + + # car speed + vEgo @1 :Float32; # best estimate of speed + aEgo @16 :Float32; # best estimate of aCAN cceleration + vEgoRaw @17 :Float32; # unfiltered speed from wheel speed sensors + vEgoCluster @44 :Float32; # best estimate of speed shown on car's instrument cluster, used for UI + + vCruise @53 :Float32; # actual set speed + vCruiseCluster @54 :Float32; # set speed to display in the UI + + yawRate @22 :Float32; # best estimate of yaw rate + standstill @18 :Bool; + wheelSpeeds @2 :WheelSpeeds; + + gasPressed @4 :Bool; # this is user pedal only + + # brake pedal, 0.0-1.0 + brake @5 :Float32; # this is user pedal only + brakePressed @6 :Bool; # this is user pedal only + regenBraking @45 :Bool; # this is user pedal only + parkingBrake @39 :Bool; + brakeHoldActive @38 :Bool; + + # steering wheel + steeringAngleDeg @7 :Float32; + steeringAngleOffsetDeg @37 :Float32; # Offset between sensors in case there multiple + steeringRateDeg @15 :Float32; # optional + steeringTorque @8 :Float32; # Native CAN units, only needed on cars where it's used for control + steeringTorqueEps @27 :Float32; # Native CAN units, only needed on cars where it's used for control + steeringPressed @9 :Bool; # is the user overring the steering wheel? + steeringDisengage @58 :Bool; # more force than steeringPressed, disengages for applicable brands + steerFaultTemporary @35 :Bool; + steerFaultPermanent @36 :Bool; + steeringCurvature @64 :Float32; + + invalidLkasSetting @55 :Bool; # stock LKAS is incorrectly configured (i.e. on or off) + stockAeb @30 :Bool; + stockLkas @59 :Bool; + stockFcw @31 :Bool; + espDisabled @32 :Bool; + accFaulted @42 :Bool; + carFaultedNonCritical @47 :Bool; # some ECU is faulted, but car remains controllable + espActive @51 :Bool; + vehicleSensorsInvalid @52 :Bool; # invalid steering angle readings, etc. + lowSpeedAlert @56 :Bool; # lost steering control due to a dynamic min steering speed + blockPcmEnable @60 :Bool; # whether to allow PCM to enable this frame + lateralAvailable @61 :Bool; # lateral control is available even if cruise is faulted + cruiseFaultLateralMode @62 :Bool; # cruise is faulted but lateral control is still active + carNotReady @95 :Bool; # car is transiently refusing engagement, not a fault + radarDisableFailed @66 :Bool; + # Physical vehicle odometer in kilometers. Zero means unavailable on this platform. + odometer @67 :Float64; + + # cruise state + cruiseState @10 :CruiseState; + + # gear + gearShifter @14 :GearShifter; + + # button presses + buttonEvents @11 :List(ButtonEvent); + buttonEnable @57 :Bool; # user is requesting enable, usually one frame. set if pcmCruise=False + leftBlinker @20 :Bool; + rightBlinker @21 :Bool; + genericToggle @23 :Bool; + + # lock info + doorOpen @24 :Bool; # ideally includes all doors + seatbeltUnlatched @25 :Bool; # driver seatbelt + + # blindspot sensors + leftBlindspot @33 :Bool; # Is there something blocking the left lane change + rightBlindspot @34 :Bool; # Is there something blocking the right lane change + + fuelGauge @41 :Float32; # battery or fuel tank level from [0.0, 1.0] + charging @43 :Bool; + fuelTankLevelL @63 :Float32; # raw fuel tank level in liters (konn3kt: VW PQ Kombi_1.Tankinhalt) + batteryDetails @65 :BatteryDetails; + + # carrotpilot HKG extension state + vCluRatio @68 :Float32; + logCarrot @69 :Text; + softHoldActive @70 :Int16; + activateCruise @71 :Int16; + latEnabled @72 :Bool; + pcmCruiseGap @73 :Int16; + speedLimit @74 :Float32; + speedLimitDistance @75 :Float32; + gearStep @76 :Int16; + tpms @77 :Tpms; + useLaneLineSpeed @78 :Float32; + leftLatDist @79 :Float32; + rightLatDist @80 :Float32; + leftLongDist @81 :Float32; + rightLongDist @82 :Float32; + carrotCruise @83 :Int16; + leftLaneLine @84 :Int16; + rightLaneLine @85 :Int16; + datetime @86 :UInt64; + leftRearLongDist @87 :Float32; + rightRearLongDist @88 :Float32; + leftRearLatDist @89 :Float32; + rightRearLatDist @90 :Float32; + trailerConnected @91 :Bool; + ureaGauge @92 :Float32; + evModeActive @93 :Bool; + evModeValid @94 :Bool; + + struct Tpms { + fl @0 :Float32; + fr @1 :Float32; + rl @2 :Float32; + rr @3 :Float32; + } + + struct BatteryDetails { + capacity @0 :Float32; + charge @1 :Float32; + soc @2 :Float32; + temperature @3 :Float32; + heaterActive @4 :Bool; + voltage @5 :Float32; + current @6 :Float32; + power @7 :Float32; + chargingMode @8 :UInt8; + } + + struct WheelSpeeds { + # optional wheel speeds + fl @0 :Float32; + fr @1 :Float32; + rl @2 :Float32; + rr @3 :Float32; + } + + struct CruiseState { + enabled @0 :Bool; + speed @1 :Float32; + speedCluster @6 :Float32; # Set speed as shown on instrument cluster + available @2 :Bool; + standstill @4 :Bool; + nonAdaptive @5 :Bool; + speedLimit @7 :Float32; + speedLimitPredicative @8 :Float32; + + speedOffsetDEPRECATED @3 :Float32; + } + + enum GearShifter { + unknown @0; + park @1; + drive @2; + neutral @3; + reverse @4; + sport @5; + low @6; + brake @7; + eco @8; + manumatic @9; + } + + # send on change + struct ButtonEvent { + pressed @0 :Bool; + type @1 :Type; + + enum Type { + unknown @0; + leftBlinker @1; + rightBlinker @2; + accelCruise @3; + decelCruise @4; + cancel @5; + lkas @6; + altButton2 @7; + mainCruise @8; + setCruise @9; + resumeCruise @10; + gapAdjustCruise @11; + lfaButton @12; + paddleLeft @13; + paddleRight @14; + } + } + + # deprecated + errorsDEPRECATED @0 :List(OnroadEventDEPRECATED.EventName); + gas @3 :Float32; # this is user pedal only + brakeLights @19 :Bool; + steeringRateLimitedDEPRECATED @29 :Bool; + canMonoTimesDEPRECATED @12: List(UInt64); + canRcvTimeoutDEPRECATED @49 :Bool; + eventsDEPRECATED @13 :List(OnroadEventDEPRECATED); + clutchPressedDEPRECATED @28 :Bool; + engineRpmDEPRECATED @46 :Float32; +} + +# ******* radar state @ 20hz ******* + +struct RadarData @0x888ad6581cf0aacb { + errors @3 :Error; + points @1 :List(RadarPoint); + + struct Error { + canError @0 :Bool; + radarFault @1 :Bool; + wrongConfig @2 :Bool; + radarUnavailableTemporary @3 :Bool; # radar data is temporarily unavailable due to conditions the car sets + } + + # similar to LiveTracks + # is one timestamp valid for all? I think so + struct RadarPoint { + trackId @0 :UInt64; # no trackId reuse + + # these 3 are the minimum required + dRel @1 :Float32; # m from the front bumper of the car + yRel @2 :Float32; # m + vRel @3 :Float32; # m/s + + # these are optional and valid if they are not NaN + aRel @4 :Float32; # m/s^2 + yvRel @5 :Float32; # m/s + + # some radars flag measurements VS estimates + measured @6 :Bool; + + vLead @7 :Float32; # m/s + aLead @8 :Float32; # m/s^2 + jLead @9 :Float32; # m/s^3 + radarSource @10 :RadarSource; + + enum RadarSource { + frontRadar @0; + scc @1; + corner235 @2; + corner180 @3; + } + } + + enum ErrorDEPRECATED { + canError @0; + fault @1; + wrongConfig @2; + } + + # deprecated + canMonoTimesDEPRECATED @2 :List(UInt64); + errorsDEPRECATED @0 :List(ErrorDEPRECATED); +} + +# ******* car controls @ 100hz ******* + +struct CarControl { + # must be true for any actuator commands to work + enabled @0 :Bool; + latActive @11: Bool; + longActive @12: Bool; + + # Final actuator commands + actuators @6 :Actuators; + + # Blinker controls + leftBlinker @15: Bool; + rightBlinker @16: Bool; + + orientationNED @13 :List(Float32); + angularVelocity @14 :List(Float32); + currentCurvature @17 :Float32; # From vehicle model + curvatureControllerActive @18: Bool; + rollCompensation @19 :Float32; + steerLimited @20: Bool; + forceRHDForBSM @21: Bool; + longComfortMode @22: Bool; + + cruiseControl @4 :CruiseControl; + hudControl @5 :HUDControl; + + struct Actuators { + # lateral commands, mutually exclusive + torque @2: Float32; # [0.0, 1.0] + steeringAngleDeg @3: Float32; + curvature @7: Float32; + + # longitudinal commands + accel @4: Float32; # m/s^2 + longControlState @5: LongControlState; + + # these are only for logging the actual values sent to the car over CAN + gas @0: Float32; # [0.0, 1.0] + brake @1: Float32; # [0.0, 1.0] + torqueOutputCan @8: Float32; # value sent over can to the car + speed @6: Float32; # m/s + jerk @9: Float32; # m/s^3 + aTarget @10: Float32; # m/s^2 + + enum LongControlState @0xe40f3a917d908282{ + off @0; + pid @1; + stopping @2; + starting @3; + } + } + + struct CruiseControl { + cancel @0: Bool; + resume @1: Bool; + override @4: Bool; + speedLimit @5: Bool; + speedLimitPredicative @6: Bool; + speedLimitPredReactToSL @7: Bool; + speedLimitPredReactToCurves @8: Bool; + speedOverrideDEPRECATED @2: Float32; + accelOverrideDEPRECATED @3: Float32; + } + + struct HUDControl { + speedVisible @0: Bool; + setSpeed @1: Float32; + lanesVisible @2: Bool; + leadVisible @3: Bool; + visualAlert @4: VisualAlert; + rightLaneVisible @6: Bool; + leftLaneVisible @7: Bool; + rightLaneDepart @8: Bool; + leftLaneDepart @9: Bool; + leadDistanceBars @10: Int8; # 1-3: 1 is closest, 3 is farthest. some ports may utilize 2-4 bars instead + leadFollowTime @11: Float32; + leadDistance @12: Float32; + driverUnresponsive @13: Bool; + activeCarrot @14: Int16; + leadRelSpeed @15: Float32; + leadDPath @16: Float32; + leadRadar @17: Int16; + modelDesire @18: Int16; + atcDistance @19: Float32; + + # not used with the dash, TODO: separate structs for dash UI and device UI + audibleAlert @5: AudibleAlert; + + enum VisualAlert { + # these are the choices from the Honda + # map as good as you can for your car + none @0; + fcw @1; + steerRequired @2; + brakePressed @3; + wrongGear @4; + seatbeltUnbuckled @5; + speedTooHigh @6; + ldw @7; + } + + enum AudibleAlert { + none @0; + + engage @1; + disengage @2; + refuse @3; + + warningSoft @4; + warningImmediate @5; + + prompt @6; + promptRepeat @7; + promptDistracted @8; + preAlert @9; + } + } + + gasDEPRECATED @1 :Float32; + brakeDEPRECATED @2 :Float32; + steeringTorqueDEPRECATED @3 :Float32; + activeDEPRECATED @7 :Bool; + rollDEPRECATED @8 :Float32; + pitchDEPRECATED @9 :Float32; + actuatorsOutputDEPRECATED @10 :Actuators; +} + +struct CarOutput { + # Any car specific rate limits or quirks applied by + # the CarController are reflected in actuatorsOutput + # and matches what is sent to the car + actuatorsOutput @0 :CarControl.Actuators; +} + +# ****** car param ****** + +struct CarParams { + brand @0 :Text; # Designates which group a platform falls under. Each folder in iqdbc/car is assigned one brand string + carFingerprint @1 :Text; + fuzzyFingerprint @55 :Bool; + + notCar @66 :Bool; # flag for non-car robotics platforms + + pcmCruise @3 :Bool; # is openpilot's state tied to the PCM's cruise state? + enableBsm @56 :Bool; # blind spot monitoring + flags @64 :UInt32; # flags for car specific quirks + alphaLongitudinalAvailable @71 :Bool; + extFlags @79 :UInt32; # carrotpilot HKG extension flags + + minEnableSpeed @7 :Float32; + minSteerSpeed @8 :Float32; + steerAtStandstill @77 :Bool; # is steering available at standstill? just check if it faults + safetyConfigs @62 :List(SafetyConfig); + alternativeExperience @65 :Int16; # panda flag for features like no disengage on gas + + # Car docs fields, not used for control + maxLateralAccel @68 :Float32; + autoResumeSng @69 :Bool; # describes whether car can resume from a stop automatically + + # things about the car in the manual + mass @17 :Float32; # [kg] curb weight: all fluids no cargo + wheelbase @18 :Float32; # [m] distance from rear axle to front axle + centerToFront @19 :Float32; # [m] distance from center of mass to front axle + steerRatio @20 :Float32; # [] ratio of steering wheel angle to front wheel angle + steerRatioRear @21 :Float32; # [] ratio of steering wheel angle to rear wheel angle (usually 0) + + # things we can derive + rotationalInertia @22 :Float32; # [kg*m2] body rotational inertia + tireStiffnessFactor @72 :Float32; # scaling factor used in calculating tireStiffness[Front,Rear] + tireStiffnessFront @23 :Float32; # [N/rad] front tire coeff of stiff + tireStiffnessRear @24 :Float32; # [N/rad] rear tire coeff of stiff + + longitudinalTuning @25 :LongitudinalPIDTuning; + lateralParams @48 :LateralParams; + lateralTuning :union { + pid @26 :LateralPIDTuning; + indiDEPRECATED @27 :LateralINDITuning; + lqrDEPRECATED @40 :LateralLQRTuning; + torque @67 :LateralTorqueTuning; + } + + steerLimitAlert @28 :Bool; + steerLimitTimer @47 :Float32; # time before steerLimitAlert is issued + + steerControlType @34 :SteerControlType; + radarUnavailable @35 :Bool; # True when radar objects aren't visible on CAN or aren't parsed out + stopAccel @60 :Float32; # Required acceleration to keep vehicle stationary + + steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds + longitudinalActuatorDelay @58 :Float32; # Gas/Brake actuator delay in seconds + openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control? + carVin @38 :Text; # VIN number queried during fingerprinting + dashcamOnly @41: Bool; + dashcamOnlyReason @78 :DashcamOnlyReason; + passive @73: Bool; # is openpilot in control? + transmissionType @43 :TransmissionType; + carFw @44 :List(CarFw); + + radarDelay @74 :Float32; + fingerprintSource @49: FingerprintSource; + networkLocation @50 :NetworkLocation; # Where Panda/C2 is integrated into the car's CAN network + + wheelSpeedFactor @63 :Float32; # Multiplier on wheels speeds to computer actual speeds + + secOcRequired @75 :Bool; # Car requires SecOC message authentication to operate + secOcKeyAvailable @76 :Bool; # Stored SecOC key loaded from params + + struct SafetyConfig { + safetyModel @0 :SafetyModel; + safetyParam @3 :UInt16; + safetyParamDEPRECATED @1 :Int16; + safetyParam2DEPRECATED @2 :UInt32; + } + + struct LateralParams { + torqueBP @0 :List(Int32); + torqueV @1 :List(Int32); + } + + struct LateralPIDTuning { + kpBP @0 :List(Float32); + kpV @1 :List(Float32); + kiBP @2 :List(Float32); + kiV @3 :List(Float32); + kf @4 :Float32; + } + + struct LateralTorqueTuning { + friction @3 :Float32; + steeringAngleDeadzoneDeg @5 :Float32; + latAccelFactor @6 :Float32; + latAccelOffset @7 :Float32; + useSteeringAngleDEPRECATED @0 :Bool; + kpDEPRECATED @1 :Float32; + kiDEPRECATED @2 :Float32; + kfDEPRECATED @4 :Float32; + kdDEPRECATED @8 : Float32; + } + + struct LongitudinalPIDTuning { + kpBP @0 :List(Float32); + kpV @1 :List(Float32); + kiBP @2 :List(Float32); + kiV @3 :List(Float32); + kf @6 :Float32; + deadzoneBPDEPRECATED @4 :List(Float32); + deadzoneVDEPRECATED @5 :List(Float32); + } + + struct LateralINDITuning { + outerLoopGainBP @4 :List(Float32); + outerLoopGainV @5 :List(Float32); + innerLoopGainBP @6 :List(Float32); + innerLoopGainV @7 :List(Float32); + timeConstantBP @8 :List(Float32); + timeConstantV @9 :List(Float32); + actuatorEffectivenessBP @10 :List(Float32); + actuatorEffectivenessV @11 :List(Float32); + + outerLoopGainDEPRECATED @0 :Float32; + innerLoopGainDEPRECATED @1 :Float32; + timeConstantDEPRECATED @2 :Float32; + actuatorEffectivenessDEPRECATED @3 :Float32; + } + + struct LateralLQRTuning { + scale @0 :Float32; + ki @1 :Float32; + dcGain @2 :Float32; + + # State space system + a @3 :List(Float32); + b @4 :List(Float32); + c @5 :List(Float32); + + k @6 :List(Float32); # LQR gain + l @7 :List(Float32); # Kalman gain + } + + enum SafetyModel { + silent @0; + hondaNidec @1; + toyota @2; + elm327 @3; + gm @4; + hondaBoschGiraffe @5; + ford @6; + cadillac @7; + hyundai @8; + chrysler @9; + tesla @10; + subaru @11; + gmPassive @12; + mazda @13; + nissan @14; + volkswagen @15; + toyotaIpas @16; + allOutput @17; + gmAscm @18; + noOutput @19; # like silent but without silent CAN TXs + hondaBosch @20; + volkswagenPq @21; + subaruPreglobal @22; # pre-Global platform + hyundaiLegacy @23; + hyundaiCommunity @24; + volkswagenMlb @25; + hongqi @26; + body @27; + hyundaiCanfd @28; + volkswagenMqbEvo @29; + chryslerCusw @30; + psa @31; + fcaGiorgio @32; + rivian @33; + volkswagenMeb @34; + } + + enum SteerControlType { + torque @0; + angle @1; + + curvatureDEPRECATED @2; + } + + enum TransmissionType { + unknown @0; + automatic @1; # Traditional auto, including DSG + manual @2; # True "stick shift" only + direct @3; # Electric vehicle or other direct drive + cvt @4; + } + + enum DashcamOnlyReason { + unknown @0; + radarDisableEngineOn @1; + } + + struct CarFw { + ecu @0 :Ecu; + fwVersion @1 :Data; + address @2 :UInt32; + subAddress @3 :UInt8; + responseAddress @4 :UInt32; + request @5 :List(Data); + brand @6 :Text; + bus @7 :UInt8; + logging @8 :Bool; + obdMultiplexing @9 :Bool; + } + + enum Ecu { + eps @0; + abs @1; + fwdRadar @2; + fwdCamera @3; + engine @4; + unknown @5; + transmission @8; # Transmission Control Module + hybrid @18; # hybrid control unit, e.g. Chrysler's HCP, Honda's IMA Control Unit, Toyota's hybrid control computer + inverter @25; # inverter for electric engine + srs @9; # airbag + gateway @10; # can gateway + hud @11; # heads up display + combinationMeter @12; # instrument cluster + electricBrakeBooster @15; + shiftByWire @16; + adas @19; + cornerRadar @21; + hvac @20; + parkingAdas @7; # parking assist system ECU, e.g. Toyota's IPAS, Hyundai's RSPA, etc. + epb @22; # electronic parking brake + telematics @23; + body @24; # body control module + + # Toyota only + dsu @6; + + # Honda only + vsa @13; # Vehicle Stability Assist + programmedFuelInjection @14; + + debug @17; + } + + enum FingerprintSource { + can @0; + fw @1; + fixed @2; + } + + enum NetworkLocation { + fwdCamera @0; # Standard/default integration at LKAS camera + gateway @1; # Integration at vehicle's CAN gateway + } + + enableGasInterceptorDEPRECATED @2 :Bool; + enableCameraDEPRECATED @4 :Bool; + enableApgsDEPRECATED @6 :Bool; + steerRateCostDEPRECATED @33 :Float32; + isPandaBlackDEPRECATED @39 :Bool; + hasStockCameraDEPRECATED @57 :Bool; + safetyParamDEPRECATED @10 :Int16; + safetyModelDEPRECATED @9 :SafetyModel; + safetyModelPassiveDEPRECATED @42 :SafetyModel = silent; + minSpeedCanDEPRECATED @51 :Float32; + communityFeatureDEPRECATED @46: Bool; + startingAccelRateDEPRECATED @53 :Float32; + steerMaxBPDEPRECATED @11 :List(Float32); + steerMaxVDEPRECATED @12 :List(Float32); + gasMaxBPDEPRECATED @13 :List(Float32); + gasMaxVDEPRECATED @14 :List(Float32); + brakeMaxBPDEPRECATED @15 :List(Float32); + brakeMaxVDEPRECATED @16 :List(Float32); + directAccelControlDEPRECATED @30 :Bool; + maxSteeringAngleDegDEPRECATED @54 :Float32; + longitudinalActuatorDelayLowerBoundDEPRECATED @61 :Float32; + stoppingControlDEPRECATED @31 :Bool; # Does the car allow full control even at lows speeds when stopping + radarTimeStep @45: Float32 = 0.05; # time delta between radar updates, 20Hz is very standard + enableDsuDEPRECATED @5 :Bool; # driving support unit + vEgoStarting @59 :Float32; + startAccel @32 :Float32; + startingState @70 :Bool; + vEgoStoppingDEPRECATED @29 :Float32; + stoppingDecelRateDEPRECATED @52 :Float32; +} diff --git a/artifacts/package_runtime/iqdbc/car/car_helpers.py b/artifacts/package_runtime/iqdbc/car/car_helpers.py new file mode 100644 index 000000000..e5d2084dd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/car_helpers.py @@ -0,0 +1,181 @@ +import os +import time + +from iqdbc.car import gen_empty_fingerprint +from iqdbc.car.can_definitions import CanRecvCallable, CanSendCallable +from iqdbc.car.carlog import carlog +from iqdbc.car.structs import CarParams, CarParamsT +from iqdbc.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars +from iqdbc.car.fw_versions import ObdCallback, get_fw_versions_ordered, get_present_ecus, match_fw_to_car +from iqdbc.car.mock.values import CAR as MOCK +from iqdbc.car.values import BRANDS +from iqdbc.car.vin import get_vin, is_valid_vin, VIN_UNKNOWN + +from iqdbc.lvbs.car.interfaces import apply_iq_car_config as iqpilot_interfaces + +FRAME_FINGERPRINT = 100 # 1s + + +def load_interfaces(brand_names): + ret = {} + for brand_name in brand_names: + path = f'iqdbc.car.{brand_name}' + CarInterface = __import__(path + '.interface', fromlist=['CarInterface']).CarInterface + for model_name in brand_names[brand_name]: + ret[model_name] = CarInterface + return ret + + +def _get_interface_names() -> dict[str, list[str]]: + # returns a dict of brand name and its respective models + brand_names = {} + for brand in BRANDS: + brand_name = brand.__module__.split('.')[-2] + brand_names[brand_name] = [model.value for model in brand] + + return brand_names + + +# imports from directory iqdbc/car// +interface_names = _get_interface_names() +interfaces = load_interfaces(interface_names) + + +def can_fingerprint(can_recv: CanRecvCallable) -> tuple[str | None, dict[int, dict]]: + finger = gen_empty_fingerprint() + candidate_cars = {i: all_legacy_fingerprint_cars() for i in [0, 1]} # attempt fingerprint on both bus 0 and 1 + frame = 0 + car_fingerprint = None + done = False + + while not done: + # can_recv(wait_for_one=True) may return zero or multiple packets, so we increment frame for each one we receive + can_packets = can_recv(wait_for_one=True) + for can_packet in can_packets: + for can in can_packet: + # The fingerprint dict is generated for all buses, this way the car interface + # can use it to detect a (valid) multipanda setup and initialize accordingly + if can.src < 128: + if can.src not in finger: + finger[can.src] = {} + finger[can.src][can.address] = len(can.dat) + + for b in candidate_cars: + # Ignore extended messages and VIN query response. + if can.src == b and can.address < 0x800 and can.address not in (0x7df, 0x7e0, 0x7e8): + candidate_cars[b] = eliminate_incompatible_cars(can, candidate_cars[b]) + + # if we only have one car choice and the time since we got our first + # message has elapsed, exit + for b in candidate_cars: + if len(candidate_cars[b]) == 1 and frame > FRAME_FINGERPRINT: + # fingerprint done + car_fingerprint = candidate_cars[b][0] + + # bail if no cars left or we've been waiting for more than 2s + failed = (all(len(cc) == 0 for cc in candidate_cars.values()) and frame > FRAME_FINGERPRINT) or frame > 200 + succeeded = car_fingerprint is not None + done = failed or succeeded + + frame += 1 + + return car_fingerprint, finger + + +# **** for use live only **** +def fingerprint(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, num_pandas: int, + cached_params: CarParamsT | None, + fixed_fingerprint: str | None) -> tuple[str | None, dict, str, list[CarParams.CarFw], CarParams.FingerprintSource, bool]: + fixed_fingerprint = fixed_fingerprint or os.environ.get('FINGERPRINT', "") + skip_fw_query = os.environ.get('SKIP_FW_QUERY', False) or bool(fixed_fingerprint) + disable_fw_cache = os.environ.get('DISABLE_FW_CACHE', False) + ecu_rx_addrs = set() + + start_time = time.monotonic() + if not skip_fw_query: + if cached_params is not None and cached_params.brand != "mock" and len(cached_params.carFw) > 0 and \ + cached_params.carVin is not VIN_UNKNOWN and not disable_fw_cache: + carlog.warning("Using cached CarParams") + vin_rx_addr, vin_rx_bus, vin = -1, -1, cached_params.carVin + car_fw = list(cached_params.carFw) + cached = True + else: + carlog.warning("Getting VIN & FW versions") + # enable OBD multiplexing for VIN query + # NOTE: this takes ~0.1s and is relied on to allow sendcan subscriber to connect in time + set_obd_multiplexing(True) + # VIN query only reliably works through OBDII + vin_rx_addr, vin_rx_bus, vin = get_vin(can_recv, can_send, (0, 1)) + ecu_rx_addrs = get_present_ecus(can_recv, can_send, set_obd_multiplexing, num_pandas=num_pandas) + car_fw = get_fw_versions_ordered(can_recv, can_send, set_obd_multiplexing, vin, ecu_rx_addrs, num_pandas=num_pandas) + cached = False + + exact_fw_match, fw_candidates = match_fw_to_car(car_fw, vin) + else: + vin_rx_addr, vin_rx_bus, vin = -1, -1, VIN_UNKNOWN + exact_fw_match, fw_candidates, car_fw = True, set(), [] + cached = False + + if not is_valid_vin(vin): + carlog.error({"event": "Malformed VIN", "vin": vin}) + vin = VIN_UNKNOWN + carlog.warning("VIN %s", vin) + + # disable OBD multiplexing for CAN fingerprinting and potential ECU knockouts + set_obd_multiplexing(False) + + fw_query_time = time.monotonic() - start_time + + # CAN fingerprint + # drain CAN socket so we get the latest messages + can_recv() + car_fingerprint, finger = can_fingerprint(can_recv) + + exact_match = True + source = CarParams.FingerprintSource.can + + # If FW query returns exactly 1 candidate, use it + if len(fw_candidates) == 1: + car_fingerprint = list(fw_candidates)[0] + source = CarParams.FingerprintSource.fw + exact_match = exact_fw_match + + if fixed_fingerprint: + car_fingerprint = fixed_fingerprint + source = CarParams.FingerprintSource.fixed + + carlog.error({"event": "fingerprinted", "car_fingerprint": str(car_fingerprint), "source": source, "fuzzy": not exact_match, + "cached": cached, "fw_count": len(car_fw), "ecu_responses": list(ecu_rx_addrs), "vin_rx_addr": vin_rx_addr, + "vin_rx_bus": vin_rx_bus, "fingerprints": repr(finger), "fw_query_time": fw_query_time}) + + return car_fingerprint, finger, vin, car_fw, source, exact_match + + +def get_car(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, alpha_long_allowed: bool, + is_release: bool, num_pandas: int = 1, cached_params: CarParamsT | None = None, + fixed_fingerprint: str | None = None, init_params_list_iq: list[dict[str, str]] | None = None, is_release_iq: bool = False): + candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(can_recv, can_send, set_obd_multiplexing, num_pandas, cached_params, + fixed_fingerprint) + + if candidate is None: + carlog.error({"event": "car doesn't match any fingerprints", "fingerprints": repr(fingerprints)}) + candidate = "MOCK" + + CarInterface = interfaces[candidate] + CP: CarParams = CarInterface.get_params(candidate, fingerprints, car_fw, alpha_long_allowed, is_release, docs=False) + CP.carVin = vin + CP.carFw = car_fw + CP.fingerprintSource = source + CP.fuzzyFingerprint = not exact_match + CP_IQ = CarInterface.get_params_iq(CP, candidate, fingerprints, car_fw, alpha_long_allowed, is_release_iq, docs=False) + + iqpilot_interfaces(CarInterface, CP, CP_IQ, init_params_list_iq, can_recv, can_send) + + return interfaces[CP.carFingerprint](CP, CP_IQ) + + +def get_demo_car_params(): + platform = MOCK.MOCK + CarInterface = interfaces[platform] + CP = CarInterface.get_non_essential_params(platform) + return CP diff --git a/artifacts/package_runtime/iqdbc/car/carlog.py b/artifacts/package_runtime/iqdbc/car/carlog.py new file mode 100644 index 000000000..5683d2a39 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/carlog.py @@ -0,0 +1,12 @@ +import os +import logging + +# set up logging +LOGPRINT = os.environ.get('LOGPRINT', 'INFO').upper() +carlog = logging.getLogger('carlog') +carlog.setLevel(LOGPRINT) +carlog.propagate = False + +handler = logging.StreamHandler() +handler.setFormatter(logging.Formatter('%(message)s')) +carlog.addHandler(handler) diff --git a/artifacts/package_runtime/iqdbc/car/ccp.py b/artifacts/package_runtime/iqdbc/car/ccp.py new file mode 100644 index 000000000..577c47685 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ccp.py @@ -0,0 +1,385 @@ +import sys +import time +import struct +from enum import IntEnum, Enum +from dataclasses import dataclass + + +@dataclass +class ExchangeStationIdsReturn: + id_length: int + data_type: int + available: int + protected: int + + +@dataclass +class GetDaqListSizeReturn: + list_size: int + first_pid: int + + +@dataclass +class GetSessionStatusReturn: + status: int + info: int | None + + +@dataclass +class DiagnosticServiceReturn: + length: int + type: int + + +@dataclass +class ActionServiceReturn: + length: int + type: int + + +class COMMAND_CODE(IntEnum): + CONNECT = 0x01 + SET_MTA = 0x02 + DNLOAD = 0x03 + UPLOAD = 0x04 + TEST = 0x05 + START_STOP = 0x06 + DISCONNECT = 0x07 + START_STOP_ALL = 0x08 + GET_ACTIVE_CAL_PAGE = 0x09 + SET_S_STATUS = 0x0C + GET_S_STATUS = 0x0D + BUILD_CHKSUM = 0x0E + SHORT_UP = 0x0F + CLEAR_MEMORY = 0x10 + SELECT_CAL_PAGE = 0x11 + GET_SEED = 0x12 + UNLOCK = 0x13 + GET_DAQ_SIZE = 0x14 + SET_DAQ_PTR = 0x15 + WRITE_DAQ = 0x16 + EXCHANGE_ID = 0x17 + PROGRAM = 0x18 + MOVE = 0x19 + GET_CCP_VERSION = 0x1B + DIAG_SERVICE = 0x20 + ACTION_SERVICE = 0x21 + PROGRAM_6 = 0x22 + DNLOAD_6 = 0x23 + + +COMMAND_RETURN_CODES = { + 0x00: "acknowledge / no error", + 0x01: "DAQ processor overload", + 0x10: "command processor busy", + 0x11: "DAQ processor busy", + 0x12: "internal timeout", + 0x18: "key request", + 0x19: "session status request", + 0x20: "cold start request", + 0x21: "cal. data init. request", + 0x22: "DAQ list init. request", + 0x23: "code update request", + 0x30: "unknown command", + 0x31: "command syntax", + 0x32: "parameter(s) out of range", + 0x33: "access denied", + 0x34: "overload", + 0x35: "access locked", + 0x36: "resource/function not available", +} + + +class BYTE_ORDER(Enum): + LITTLE_ENDIAN = '<' + BIG_ENDIAN = '>' + + +class CommandTimeoutError(Exception): + pass + + +class CommandCounterError(Exception): + pass + + +class CommandResponseError(Exception): + def __init__(self, message, return_code): + super().__init__() + self.message = message + self.return_code = return_code + + def __str__(self): + return self.message + + +class CcpClient: + def __init__(self, panda, tx_addr: int, rx_addr: int, bus: int=0, byte_order: BYTE_ORDER=BYTE_ORDER.BIG_ENDIAN, debug=False): + self.tx_addr = tx_addr + self.rx_addr = rx_addr + self.can_bus = bus + self.byte_order = byte_order + self.debug = debug + self._panda = panda + self._command_counter = -1 + + def _send_cro(self, cmd: int, dat: bytes = b"") -> None: + self._command_counter = (self._command_counter + 1) & 0xFF + tx_data = (bytes([cmd, self._command_counter]) + dat).ljust(8, b"\x00") + if self.debug: + print(f"CAN-TX: {hex(self.tx_addr)} - 0x{bytes.hex(tx_data)}") + assert len(tx_data) == 8, "data is not 8 bytes" + self._panda.can_clear(self.can_bus) + self._panda.can_clear(0xFFFF) + self._panda.can_send(self.tx_addr, tx_data, self.can_bus) + + def _recv_dto(self, timeout: float) -> bytes: + start_time = time.time() + while time.time() - start_time < timeout: + msgs = self._panda.can_recv() or [] + if len(msgs) >= 256: + print("CAN RX buffer overflow!!!", file=sys.stderr) + for rx_addr, rx_data_bytearray, rx_bus in msgs: + if rx_bus == self.can_bus and rx_addr == self.rx_addr: + rx_data = bytes(rx_data_bytearray) + if self.debug: + print(f"CAN-RX: {hex(rx_addr)} - 0x{bytes.hex(rx_data)}") + assert len(rx_data) == 8, f"message length not 8: {len(rx_data)}" + + pid = rx_data[0] + if pid == 0xFF or pid == 0xFE: + err = rx_data[1] + err_desc = COMMAND_RETURN_CODES.get(err, "unknown error") + ctr = rx_data[2] + dat = rx_data[3:] + + if pid == 0xFF and self._command_counter != ctr: + raise CommandCounterError(f"counter invalid: {ctr} != {self._command_counter}") + + if err >= 0x10 and err <= 0x12: + if self.debug: + print(f"CCP-WAIT: {hex(err)} - {err_desc}") + start_time = time.time() + continue + + if err >= 0x30: + raise CommandResponseError(f"{hex(err)} - {err_desc}", err) + else: + dat = rx_data[1:] + + return dat + time.sleep(0.001) + + raise CommandTimeoutError("timeout waiting for response") + + # commands + def connect(self, station_addr: int) -> None: + if station_addr > 65535: + raise ValueError("station address must be less than 65536") + # NOTE: station address is always little endian + self._send_cro(COMMAND_CODE.CONNECT, struct.pack(" ExchangeStationIdsReturn: + self._send_cro(COMMAND_CODE.EXCHANGE_ID, device_id_info) + resp = self._recv_dto(0.025) + return ExchangeStationIdsReturn(id_length=resp[0], data_type=resp[1], available=resp[2], protected=resp[3]) + + def get_seed(self, resource_mask: int) -> bytes: + if resource_mask > 255: + raise ValueError("resource mask must be less than 256") + self._send_cro(COMMAND_CODE.GET_SEED, bytes([resource_mask])) + resp = self._recv_dto(0.025) + # protected = resp[0] == 0 + seed = resp[1:] + return seed + + def unlock(self, key: bytes) -> int: + if len(key) > 6: + raise ValueError("max key size is 6 bytes") + self._send_cro(COMMAND_CODE.UNLOCK, key) + resp = self._recv_dto(0.025) + status = resp[0] + return status + + def set_memory_transfer_address(self, mta_num: int, addr_ext: int, addr: int) -> None: + if mta_num > 255: + raise ValueError("MTA number must be less than 256") + if addr_ext > 255: + raise ValueError("address extension must be less than 256") + self._send_cro(COMMAND_CODE.SET_MTA, bytes([mta_num, addr_ext]) + struct.pack(f"{self.byte_order.value}I", addr)) + self._recv_dto(0.025) + + def download(self, data: bytes) -> int: + if len(data) > 5: + raise ValueError("max data size is 5 bytes") + self._send_cro(COMMAND_CODE.DNLOAD, bytes([len(data)]) + data) + resp = self._recv_dto(0.025) + # mta_addr_ext = resp[0] + mta_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] + return mta_addr + + def download_6_bytes(self, data: bytes) -> int: + if len(data) != 6: + raise ValueError("data size must be 6 bytes") + self._send_cro(COMMAND_CODE.DNLOAD_6, data) + resp = self._recv_dto(0.025) + # mta_addr_ext = resp[0] + mta_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] + return mta_addr + + def upload(self, size: int) -> bytes: + if size > 5: + raise ValueError("size must be less than 6") + self._send_cro(COMMAND_CODE.UPLOAD, bytes([size])) + return self._recv_dto(0.025)[:size] + + def short_upload(self, size: int, addr_ext: int, addr: int) -> bytes: + if size > 5: + raise ValueError("size must be less than 6") + if addr_ext > 255: + raise ValueError("address extension must be less than 256") + self._send_cro(COMMAND_CODE.SHORT_UP, bytes([size, addr_ext]) + struct.pack(f"{self.byte_order.value}I", addr)) + return self._recv_dto(0.025)[:size] + + def select_calibration_page(self) -> None: + self._send_cro(COMMAND_CODE.SELECT_CAL_PAGE) + self._recv_dto(0.025) + + def get_daq_list_size(self, list_num: int, can_id: int = 0) -> GetDaqListSizeReturn: + if list_num > 255: + raise ValueError("list number must be less than 256") + self._send_cro(COMMAND_CODE.GET_DAQ_SIZE, bytes([list_num, 0]) + struct.pack(f"{self.byte_order.value}I", can_id)) + resp = self._recv_dto(0.025) + return GetDaqListSizeReturn(list_size=resp[0], first_pid=resp[1]) + + def set_daq_list_pointer(self, list_num: int, odt_num: int, element_num: int) -> None: + if list_num > 255: + raise ValueError("list number must be less than 256") + if odt_num > 255: + raise ValueError("ODT number must be less than 256") + if element_num > 255: + raise ValueError("element number must be less than 256") + self._send_cro(COMMAND_CODE.SET_DAQ_PTR, bytes([list_num, odt_num, element_num])) + self._recv_dto(0.025) + + def write_daq_list_entry(self, size: int, addr_ext: int, addr: int) -> None: + if size > 255: + raise ValueError("size must be less than 256") + if addr_ext > 255: + raise ValueError("address extension must be less than 256") + self._send_cro(COMMAND_CODE.WRITE_DAQ, bytes([size, addr_ext]) + struct.pack(f"{self.byte_order.value}I", addr)) + self._recv_dto(0.025) + + def start_stop_transmission(self, mode: int, list_num: int, odt_num: int, channel_num: int, rate_prescaler: int = 0) -> None: + if mode > 255: + raise ValueError("mode must be less than 256") + if list_num > 255: + raise ValueError("list number must be less than 256") + if odt_num > 255: + raise ValueError("ODT number must be less than 256") + if channel_num > 255: + raise ValueError("channel number must be less than 256") + if rate_prescaler > 65535: + raise ValueError("rate prescaler must be less than 65536") + self._send_cro(COMMAND_CODE.START_STOP, bytes([mode, list_num, odt_num, channel_num]) + struct.pack(f"{self.byte_order.value}H", rate_prescaler)) + self._recv_dto(0.025) + + def disconnect(self, station_addr: int, temporary: bool = False) -> None: + if station_addr > 65535: + raise ValueError("station address must be less than 65536") + # NOTE: station address is always little endian + self._send_cro(COMMAND_CODE.DISCONNECT, bytes([int(not temporary), 0x00]) + struct.pack(" None: + if status > 255: + raise ValueError("status must be less than 256") + self._send_cro(COMMAND_CODE.SET_S_STATUS, bytes([status])) + self._recv_dto(0.025) + + def get_session_status(self) -> GetSessionStatusReturn: + self._send_cro(COMMAND_CODE.GET_S_STATUS) + resp = self._recv_dto(0.025) + info = resp[2] if resp[1] else None + return GetSessionStatusReturn(status=resp[0], info=info) + + def build_checksum(self, size: int) -> bytes: + self._send_cro(COMMAND_CODE.BUILD_CHKSUM, struct.pack(f"{self.byte_order.value}I", size)) + resp = self._recv_dto(30.0) + chksum_size = resp[0] + assert chksum_size <= 4, "checksum more than 4 bytes" + chksum = resp[1:1+chksum_size] + return chksum + + def clear_memory(self, size: int) -> None: + self._send_cro(COMMAND_CODE.CLEAR_MEMORY, struct.pack(f"{self.byte_order.value}I", size)) + self._recv_dto(30.0) + + def program(self, size: int, data: bytes) -> int: + if size > 5: + raise ValueError("size must be less than 6") + if len(data) > 5: + raise ValueError("max data size is 5 bytes") + self._send_cro(COMMAND_CODE.PROGRAM, bytes([size]) + data) + resp = self._recv_dto(0.1) + # mta_addr_ext = resp[0] + mta_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] + return mta_addr + + def program_6_bytes(self, data: bytes) -> int: + if len(data) != 6: + raise ValueError("data size must be 6 bytes") + self._send_cro(COMMAND_CODE.PROGRAM_6, data) + resp = self._recv_dto(0.1) + # mta_addr_ext = resp[0] + mta_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] + return mta_addr + + def move_memory_block(self, size: int) -> None: + self._send_cro(COMMAND_CODE.MOVE, struct.pack(f"{self.byte_order.value}I", size)) + self._recv_dto(0.025) + + def diagnostic_service(self, service_num: int, data: bytes = b"") -> DiagnosticServiceReturn: + if service_num > 65535: + raise ValueError("service number must be less than 65536") + if len(data) > 4: + raise ValueError("max data size is 4 bytes") + self._send_cro(COMMAND_CODE.DIAG_SERVICE, struct.pack(f"{self.byte_order.value}H", service_num) + data) + resp = self._recv_dto(0.025) + return DiagnosticServiceReturn(length=resp[0], type=resp[1]) + + def action_service(self, service_num: int, data: bytes = b"") -> ActionServiceReturn: + if service_num > 65535: + raise ValueError("service number must be less than 65536") + if len(data) > 4: + raise ValueError("max data size is 4 bytes") + self._send_cro(COMMAND_CODE.ACTION_SERVICE, struct.pack(f"{self.byte_order.value}H", service_num) + data) + resp = self._recv_dto(0.025) + return ActionServiceReturn(length=resp[0], type=resp[1]) + + def test_availability(self, station_addr: int) -> None: + if station_addr > 65535: + raise ValueError("station address must be less than 65536") + # NOTE: station address is always little endian + self._send_cro(COMMAND_CODE.TEST, struct.pack(" None: + if mode > 255: + raise ValueError("mode must be less than 256") + self._send_cro(COMMAND_CODE.START_STOP_ALL, bytes([mode])) + self._recv_dto(0.025) + + def get_active_calibration_page(self): + self._send_cro(COMMAND_CODE.GET_ACTIVE_CAL_PAGE) + resp = self._recv_dto(0.025) + # cal_addr_ext = resp[0] + cal_addr = struct.unpack(f"{self.byte_order.value}I", resp[1:5])[0] + return cal_addr + + def get_version(self, desired_version: float = 2.1) -> float: + major, minor = map(int, str(desired_version).split(".")) + self._send_cro(COMMAND_CODE.GET_CCP_VERSION, bytes([major, minor])) + resp = self._recv_dto(0.025) + return float(f"{resp[0]}.{resp[1]}") diff --git a/artifacts/package_runtime/iqdbc/car/chrysler/__init__.py b/artifacts/package_runtime/iqdbc/car/chrysler/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/chrysler/carcontroller.py b/artifacts/package_runtime/iqdbc/car/chrysler/carcontroller.py new file mode 100644 index 000000000..eda820122 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/chrysler/carcontroller.py @@ -0,0 +1,96 @@ +from iqdbc.can import CANPacker +from iqdbc.car import Bus, DT_CTRL +from iqdbc.car.lateral import apply_meas_steer_torque_limits +from iqdbc.car.chrysler import chryslercan +from iqdbc.car.chrysler.values import RAM_CARS, CarControllerParams, ChryslerFlags, RAM_DT +from iqdbc.car.interfaces import CarControllerBase + +from iqdbc.lvbs.car.chrysler.iq_carcontroller import IQCarController +from iqdbc.lvbs.car.chrysler.aol import AolCarController +from iqdbc.lvbs.car.chrysler.iq_values import ChryslerFlagsIQ + + +class CarController(CarControllerBase, AolCarController, IQCarController): + def __init__(self, dbc_names, CP, CP_IQ): + CarControllerBase.__init__(self, dbc_names, CP, CP_IQ) + AolCarController.__init__(self) + IQCarController.__init__(self, CP, CP_IQ) + self.apply_torque_last = 0 + + self.hud_count = 0 + self.last_lkas_falling_edge = 0 + self.lkas_control_bit_prev = False + self.last_button_frame = 0 + + self.packer = CANPacker(dbc_names[Bus.pt]) + self.params = CarControllerParams(CP) + + def update(self, CC, CC_IQ, CS, now_nanos): + AolCarController.update(self, CC, CC_IQ, CS) + can_sends = [] + + lkas_active = CC.latActive and self.lkas_control_bit_prev + + # cruise buttons + if (self.frame - self.last_button_frame) * DT_CTRL > 0.05: + das_bus = 2 if self.CP.carFingerprint in RAM_CARS else 0 + + # ACC cancellation + if CC.cruiseControl.cancel: + self.last_button_frame = self.frame + can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, cancel=True)) + + # ACC resume from standstill + elif CC.cruiseControl.resume: + self.last_button_frame = self.frame + can_sends.append(chryslercan.create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, resume=True)) + + # HUD alerts + if self.frame % 25 == 0: + if CS.lkas_car_model != -1: + can_sends.append(chryslercan.create_lkas_hud(self.packer, self.CP, lkas_active, CC.hudControl.visualAlert, + self.hud_count, CS.lkas_car_model, CS.auto_high_beam, self.aol)) + self.hud_count += 1 + + # steering + if self.frame % self.params.STEER_STEP == 0: + + # TODO: can we make this more sane? why is it different for all the cars? + lkas_control_bit = self.lkas_control_bit_prev + if self.CP_IQ.flags & ChryslerFlagsIQ.NO_MIN_STEERING_SPEED or self.CP.carFingerprint in RAM_DT: + lkas_control_bit = IQCarController.get_lkas_control_bit(self, CS, CC, lkas_control_bit) + elif CS.out.vEgo > self.CP.minSteerSpeed: + lkas_control_bit = True + elif self.CP.flags & ChryslerFlags.HIGHER_MIN_STEERING_SPEED: + if CS.out.vEgo < (self.CP.minSteerSpeed - 3.0): + lkas_control_bit = False + elif self.CP.carFingerprint in RAM_CARS: + if CS.out.vEgo < (self.CP.minSteerSpeed - 0.5): + lkas_control_bit = False + + # EPS faults if LKAS re-enables too quickly + lkas_control_bit = lkas_control_bit and (self.frame - self.last_lkas_falling_edge > 200) + + if not lkas_control_bit and self.lkas_control_bit_prev: + self.last_lkas_falling_edge = self.frame + self.lkas_control_bit_prev = lkas_control_bit + + # steer torque + new_torque = int(round(CC.actuators.torque * self.params.STEER_MAX)) + apply_torque = apply_meas_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorqueEps, self.params) + if not lkas_active or not lkas_control_bit: + apply_torque = 0 + self.apply_torque_last = apply_torque + + can_sends.append(chryslercan.create_lkas_command(self.packer, self.CP, int(apply_torque), lkas_control_bit)) + + if self.frame % 10 == 0 and self.CP.carFingerprint not in RAM_CARS: + can_sends.append(AolCarController.create_lkas_heartbit(self.packer, CS.lkas_heartbit, self.aol)) + + self.frame += 1 + + new_actuators = CC.actuators.as_builder() + new_actuators.torque = self.apply_torque_last / self.params.STEER_MAX + new_actuators.torqueOutputCan = self.apply_torque_last + + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/chrysler/carstate.py b/artifacts/package_runtime/iqdbc/car/chrysler/carstate.py new file mode 100644 index 000000000..fc0cf4765 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/chrysler/carstate.py @@ -0,0 +1,123 @@ +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, create_button_events, structs +from iqdbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.interfaces import CarStateBase + +from iqdbc.lvbs.car.chrysler.aol import AolCarState +from iqdbc.lvbs.car.chrysler.iq_carstate import IQCarState + +ButtonType = structs.CarState.ButtonEvent.Type + + +class CarState(CarStateBase, AolCarState, IQCarState): + def __init__(self, CP, CP_IQ): + CarStateBase.__init__(self, CP, CP_IQ) + AolCarState.__init__(self, CP, CP_IQ) + IQCarState.__init__(self, CP, CP_IQ) + self.CP = CP + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + + self.auto_high_beam = 0 + self.button_counter = 0 + self.lkas_car_model = -1 + + if CP.carFingerprint in RAM_CARS: + self.shifter_values = can_define.dv["Transmission_Status"]["Gear_State"] + else: + self.shifter_values = can_define.dv["GEAR"]["PRNDL"] + + self.distance_button = 0 + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + + ret = structs.CarState() + ret_iq = structs.IQCarState() + + prev_distance_button = self.distance_button + self.distance_button = cp.vl["CRUISE_BUTTONS"]["ACC_Distance_Dec"] + + # lock info + ret.doorOpen = any([cp.vl["BCM_1"]["DOOR_OPEN_FL"], + cp.vl["BCM_1"]["DOOR_OPEN_FR"], + cp.vl["BCM_1"]["DOOR_OPEN_RL"], + cp.vl["BCM_1"]["DOOR_OPEN_RR"]]) + ret.seatbeltUnlatched = cp.vl["ORC_1"]["SEATBELT_DRIVER_UNLATCHED"] == 1 + + # brake pedal + ret.brake = 0 + ret.brakePressed = cp.vl["ESP_1"]['Brake_Pedal_State'] == 1 # Physical brake pedal switch + + # gas pedal + ret.gasPressed = cp.vl["ECM_5"]["Accelerator_Position"] > 1e-5 + + # car speed + if self.CP.carFingerprint in RAM_CARS: + ret.vEgoRaw = cp.vl["ESP_8"]["Vehicle_Speed"] * CV.KPH_TO_MS + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(cp.vl["Transmission_Status"]["Gear_State"], None)) + else: + ret.vEgoRaw = (cp.vl["SPEED_1"]["SPEED_LEFT"] + cp.vl["SPEED_1"]["SPEED_RIGHT"]) / 2. + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(cp.vl["GEAR"]["PRNDL"], None)) + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.standstill = not ret.vEgoRaw > 0.001 + + # button presses + ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(200, cp.vl["STEERING_LEVERS"]["TURN_SIGNALS"] == 1, + cp.vl["STEERING_LEVERS"]["TURN_SIGNALS"] == 2) + ret.genericToggle = cp.vl["STEERING_LEVERS"]["HIGH_BEAM_PRESSED"] == 1 + + # steering wheel + ret.steeringAngleDeg = cp.vl["STEERING"]["STEERING_ANGLE"] + cp.vl["STEERING"]["STEERING_ANGLE_HP"] + ret.steeringRateDeg = cp.vl["STEERING"]["STEERING_RATE"] + ret.steeringTorque = cp.vl["EPS_2"]["COLUMN_TORQUE"] + ret.steeringTorqueEps = cp.vl["EPS_2"]["EPS_TORQUE_MOTOR"] + ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD + + # cruise state + cp_cruise = cp_cam if self.CP.carFingerprint in RAM_CARS else cp + + ret.cruiseState.available = cp_cruise.vl["DAS_3"]["ACC_AVAILABLE"] == 1 + ret.cruiseState.enabled = cp_cruise.vl["DAS_3"]["ACC_ACTIVE"] == 1 + ret.cruiseState.speed = cp_cruise.vl["DAS_4"]["ACC_SET_SPEED_KPH"] * CV.KPH_TO_MS + ret.cruiseState.nonAdaptive = cp_cruise.vl["DAS_4"]["ACC_STATE"] in (1, 2) # 1 NormalCCOn and 2 NormalCCSet + ret.cruiseState.standstill = cp_cruise.vl["DAS_3"]["ACC_STANDSTILL"] == 1 + ret.accFaulted = cp_cruise.vl["DAS_3"]["ACC_FAULTED"] != 0 + + if self.CP.carFingerprint in RAM_CARS: + # Auto High Beam isn't Located in this message on chrysler or jeep currently located in 729 message + self.auto_high_beam = cp_cam.vl["DAS_6"]['AUTO_HIGH_BEAM_ON'] + ret.steerFaultTemporary = cp.vl["EPS_3"]["DASM_FAULT"] == 1 + else: + ret.steerFaultTemporary = cp.vl["EPS_2"]["LKAS_TEMPORARY_FAULT"] == 1 + ret.steerFaultPermanent = cp.vl["EPS_2"]["LKAS_STATE"] == 4 + + # blindspot sensors + if self.CP.enableBsm: + ret.leftBlindspot = cp.vl["BSM_1"]["LEFT_STATUS"] == 1 + ret.rightBlindspot = cp.vl["BSM_1"]["RIGHT_STATUS"] == 1 + + self.lkas_car_model = cp_cam.vl["DAS_6"]["CAR_MODEL"] + self.button_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"] + + AolCarState.update_aol(self, ret, can_parsers) + IQCarState.update(self, ret, ret_iq, can_parsers) + + ret.buttonEvents = [ + *create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}), + *create_button_events(self.lkas_button, self.prev_lkas_button, {1: ButtonType.lkas}), + *self.button_events, + ] + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + pt_messages: list = [] + cam_messages: list = [] + AolCarState.get_parser(CP, pt_messages, cam_messages) + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, 0), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, 2), + } diff --git a/artifacts/package_runtime/iqdbc/car/chrysler/chryslercan.py b/artifacts/package_runtime/iqdbc/car/chrysler/chryslercan.py new file mode 100644 index 000000000..c317c10ea --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/chrysler/chryslercan.py @@ -0,0 +1,118 @@ +from iqdbc.car import structs +from iqdbc.car.crc import CRC8J1850 +from iqdbc.car.chrysler.values import RAM_CARS + +GearShifter = structs.CarState.GearShifter +VisualAlert = structs.CarControl.HUDControl.VisualAlert + + +def create_lkas_hud(packer, CP, lkas_active, hud_alert, hud_count, car_model, auto_high_beam, aol): + # LKAS_HUD - Controls what lane-keeping icon is displayed + + # == Color == + # 0 hidden? + # 1 white + # 2 green + # 3 ldw + + # == Lines == + # 03 white Lines + # 04 grey lines + # 09 left lane close + # 0A right lane close + # 0B left Lane very close + # 0C right Lane very close + # 0D left cross cross + # 0E right lane cross + + # == Alerts == + # 7 Normal + # 6 lane departure place hands on wheel + + if aol.enable_aol: + color = 2 if lkas_active else 1 if aol.paused else 0 + else: + color = 2 if lkas_active else 1 + lines = 3 if lkas_active else 0 + alerts = 7 if lkas_active else 0 + + if hud_count < (1 * 4): # first 3 seconds, 4Hz + alerts = 1 + + if hud_alert in (VisualAlert.ldw, VisualAlert.steerRequired): + color = 4 + lines = 0 + alerts = 6 + + values = { + "LKAS_ICON_COLOR": color, + "CAR_MODEL": car_model, + "LKAS_LANE_LINES": lines, + "LKAS_ALERTS": alerts, + } + + if CP.carFingerprint in RAM_CARS: + values['AUTO_HIGH_BEAM_ON'] = auto_high_beam + + return packer.make_can_msg("DAS_6", 0, values) + + +def create_lkas_command(packer, CP, apply_torque, lkas_control_bit): + # LKAS_COMMAND Lane-keeping signal to turn the wheel + enabled_val = 2 if CP.carFingerprint in RAM_CARS else 1 + values = { + "STEERING_TORQUE": apply_torque, + "LKAS_CONTROL_BIT": enabled_val if lkas_control_bit else 0, + } + return packer.make_can_msg("LKAS_COMMAND", 0, values) + + +def create_cruise_buttons(packer, frame, bus, cancel=False, resume=False, accel=False, decel=False): + values = { + "ACC_Cancel": cancel, + "ACC_Resume": resume, + "ACC_Accel": accel, + "ACC_Decel": decel, + "COUNTER": frame % 0x10, + } + return packer.make_can_msg("CRUISE_BUTTONS", bus, values) + + +def chrysler_checksum(address: int, sig, d: bytearray) -> int: + checksum = 0xFF + for j in range(len(d) - 1): + curr = d[j] + shift = 0x80 + for _ in range(8): + bit_sum = curr & shift + temp_chk = checksum & 0x80 + if bit_sum: + bit_sum = 0x1C + if temp_chk: + bit_sum = 1 + checksum = (checksum << 1) & 0xFF + temp_chk = checksum | 1 + bit_sum ^= temp_chk + else: + if temp_chk: + bit_sum = 0x1D + checksum = (checksum << 1) & 0xFF + bit_sum ^= checksum + checksum = bit_sum & 0xFF + shift >>= 1 + return (~checksum) & 0xFF + + +def fca_giorgio_checksum(address: int, sig, d: bytearray) -> int: + crc = 0 + for i in range(len(d) - 1): + crc ^= d[i] + crc = CRC8J1850[crc] + if address == 0xDE: + return crc ^ 0x10 + elif address == 0x106: + return crc ^ 0xF6 + elif address == 0x122: + return crc ^ 0xF1 + else: + return crc ^ 0x0A diff --git a/artifacts/package_runtime/iqdbc/car/chrysler/fingerprints.py b/artifacts/package_runtime/iqdbc/car/chrysler/fingerprints.py new file mode 100644 index 000000000..a9c4fa425 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/chrysler/fingerprints.py @@ -0,0 +1,794 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.chrysler.values import CAR +from iqdbc.lvbs.car.iq_fingerprints import extend_fw_versions +from iqdbc.lvbs.car.chrysler.iq_fingerprints import FW_VERSIONS_EXT + + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.CHRYSLER_PACIFICA_2018: { + (Ecu.combinationMeter, 0x742, None): [ + b'68227902AF', + b'68227902AG', + b'68227902AH', + b'68227905AG', + b'68360252AC', + ], + (Ecu.srs, 0x744, None): [ + b'68211617AF', + b'68211617AG', + b'68358974AC', + b'68405937AA', + ], + (Ecu.abs, 0x747, None): [ + b'68222747AG', + b'68330876AA', + b'68330876AB', + b'68352227AA', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'04672758AA', + b'04672758AB', + b'68226356AF', + b'68226356AH', + b'68226356AI', + ], + (Ecu.eps, 0x75a, None): [ + b'68288891AE', + b'68378884AA', + b'68525338AA', + b'68525338AB', + ], + (Ecu.engine, 0x7e0, None): [ + b'68267018AO ', + b'68267020AJ ', + b'68303534AG ', + b'68303534AJ ', + b'68340762AD ', + b'68340764AD ', + b'68352652AE ', + b'68352654AE ', + b'68366851AH ', + b'68366853AE ', + b'68366853AG ', + b'68372861AF ', + ], + (Ecu.transmission, 0x7e1, None): [ + b'68277370AJ', + b'68277370AM', + b'68277372AD', + b'68277372AE', + b'68277372AN', + b'68277374AA', + b'68277374AB', + b'68277374AD', + b'68277374AN', + b'68367471AC', + b'68367471AD', + b'68380571AB', + ], + }, + CAR.CHRYSLER_PACIFICA_2020: { + (Ecu.combinationMeter, 0x742, None): [ + b'68405327AC', + b'68436233AB', + b'68436233AC', + b'68436234AB', + b'68436250AE', + b'68529067AA', + b'68594993AB', + b'68594994AB', + ], + (Ecu.srs, 0x744, None): [ + b'68405565AB', + b'68405565AC', + b'68444299AC', + b'68480707AC', + b'68480708AC', + b'68526663AB', + ], + (Ecu.abs, 0x747, None): [ + b'68397394AA', + b'68433480AB', + b'68453575AF', + b'68577676AA', + b'68593395AA', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'04672758AA', + b'04672758AB', + b'68417813AF', + b'68540436AA', + b'68540436AB', + b'68540436AC', + b'68540436AD', + b'68598670AB', + b'68598670AC', + ], + (Ecu.eps, 0x75a, None): [ + b'68416742AA', + b'68460393AA', + b'68460393AB', + b'68494461AB', + b'68494461AC', + b'68524936AA', + b'68524936AB', + b'68525338AB', + b'68594337AB', + b'68594340AB', + ], + (Ecu.engine, 0x7e0, None): [ + b'68413871AD ', + b'68413871AE ', + b'68413871AH ', + b'68413871AI ', + b'68413871AJ ', + b'68413873AH ', + b'68413873AI ', + b'68443120AE ', + b'68443123AC ', + b'68443125AC ', + b'68496647AI ', + b'68496647AJ ', + b'68496650AH ', + b'68496650AI ', + b'68496650AL ', + b'68496652AH ', + b'68526752AD ', + b'68526752AE ', + b'68526754AD ', + b'68526754AE ', + b'68536264AE ', + b'68700304AB ', + b'68700306AB ', + ], + (Ecu.transmission, 0x7e1, None): [ + b'68414271AC', + b'68414271AD', + b'68414275AC', + b'68414275AD', + b'68443154AB', + b'68443154AC', + b'68443155AC', + b'68443158AB', + b'68501050AD', + b'68501051AD', + b'68501055AD', + b'68527221AB', + b'68527223AB', + b'68586231AD', + b'68586233AD', + ], + }, + CAR.CHRYSLER_PACIFICA_2018_HYBRID: { + (Ecu.combinationMeter, 0x742, None): [ + b'68239262AH', + b'68239262AI', + b'68239262AJ', + b'68239263AH', + b'68239263AJ', + b'68358439AE', + b'68358439AG', + ], + (Ecu.srs, 0x744, None): [ + b'68238840AH', + b'68358990AC', + b'68405939AA', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'04672758AA', + b'68226356AI', + ], + (Ecu.eps, 0x75a, None): [ + b'68288309AC', + b'68288309AD', + b'68525339AA', + ], + (Ecu.engine, 0x7e0, None): [ + b'68277480AV ', + b'68277480AX ', + b'68277480AZ ', + b'68366580AI ', + b'68366580AK ', + b'68366580AM ', + ], + (Ecu.hybrid, 0x7e2, None): [ + b'05190175BF', + b'05190175BH', + b'05190226AI', + b'05190226AK', + b'05190226AM', + ], + }, + CAR.CHRYSLER_PACIFICA_2019_HYBRID: { + (Ecu.combinationMeter, 0x742, None): [ + b'68405292AC', + b'68434956AC', + b'68434956AD', + b'68434960AE', + b'68434960AF', + b'68529064AB', + b'68594990AB', + b'68594990AD', + b'68594990AE', + b'68594991AB', + ], + (Ecu.srs, 0x744, None): [ + b'68405567AB', + b'68405567AC', + b'68453076AD', + b'68480710AC', + b'68526665AB', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'04672758AB', + b'68417813AF', + b'68540436AA', + b'68540436AB', + b'68540436AC', + b'68540436AD', + b'68598670AB', + b'68598670AC', + b'68645752AA', + ], + (Ecu.eps, 0x75a, None): [ + b'68416741AA', + b'68460392AA', + b'68525339AA', + b'68525339AB', + b'68594341AB', + b'68594341AC', + ], + (Ecu.engine, 0x7e0, None): [ + b'05190392AB ', + b'68416680AD ', + b'68416680AE ', + b'68416680AF ', + b'68416680AG ', + b'68444228AC ', + b'68444228AD ', + b'68444228AE ', + b'68444228AF ', + b'68499122AD ', + b'68499122AE ', + b'68499122AF ', + b'68526772AD ', + b'68526772AH ', + b'68599493AC ', + b'68657433AA ', + b'68700317AC ', + ], + (Ecu.hybrid, 0x7e2, None): [ + b'05185116AF', + b'05185116AJ', + b'05185116AK', + b'05185116AL', + b'05190240AP', + b'05190240AQ', + b'05190240AR', + b'05190265AG', + b'05190265AH', + b'05190289AE', + b'68540977AH', + b'68540977AK', + b'68540977AL', + b'68597647AE', + b'68597647AF', + b'68632416AB', + b'68632416AC', + b'68676877AB', + ], + }, + CAR.JEEP_GRAND_CHEROKEE: { + (Ecu.combinationMeter, 0x742, None): [ + b'68243549AG', + b'68302211AC', + b'68302212AD', + b'68302214AC', + b'68302223AC', + b'68302246AC', + b'68331511AC', + b'68331574AC', + b'68331687AC', + b'68331690AC', + b'68340272AD', + ], + (Ecu.srs, 0x744, None): [ + b'68309533AA', + b'68316742AB', + b'68355363AB', + ], + (Ecu.abs, 0x747, None): [ + b'68252642AG', + b'68306178AD', + b'68336275AB', + b'68336276AB', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'04672627AB', + b'68251506AF', + b'68332015AB', + ], + (Ecu.eps, 0x75a, None): [ + b'68276201AG', + b'68321644AB', + b'68321644AC', + b'68321646AC', + b'68321648AC', + b'68321650AC', + ], + (Ecu.engine, 0x7e0, None): [ + b'05035920AE ', + b'68252272AG ', + b'68284455AI ', + b'68284456AI ', + b'68284456AJ ', + b'68284477AF ', + b'68325564AH ', + b'68325564AI ', + b'68325565AH ', + b'68325565AI ', + b'68325565AJ ', + b'68325618AD ', + ], + (Ecu.transmission, 0x7e1, None): [ + b'05035517AH', + b'68253222AF', + b'68311218AC', + b'68311218AD', + b'68311223AF', + b'68311223AG', + b'68361911AE', + b'68361911AF', + b'68361911AH', + b'68361914AE', + b'68361916AD', + ], + }, + CAR.JEEP_GRAND_CHEROKEE_2019: { + (Ecu.combinationMeter, 0x742, None): [ + b'68402703AB', + b'68402704AB', + b'68402707AB', + b'68402708AB', + b'68402714AB', + b'68402736AB', + b'68402971AD', + b'68454144AD', + b'68454145AB', + b'68454152AB', + b'68454156AB', + b'68516650AB', + b'68516651AB', + b'68516669AB', + b'68516671AB', + b'68516683AB', + ], + (Ecu.srs, 0x744, None): [ + b'68355363AB', + b'68355364AB', + ], + (Ecu.abs, 0x747, None): [ + b'68408639AC', + b'68408639AD', + b'68499978AB', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'04672788AA', + b'68456722AC', + ], + (Ecu.eps, 0x75a, None): [ + b'68417279AA', + b'68417280AA', + b'68417281AA', + b'68417283AA', + b'68453431AA', + b'68453433AA', + b'68453435AA', + b'68499171AA', + b'68499171AB', + b'68501183AA', + b'68501186AA', + ], + (Ecu.engine, 0x7e0, None): [ + b'05035674AB ', + b'68412635AE ', + b'68412635AG ', + b'68412635AH ', + b'68412660AD ', + b'68412660AF ', + b'68422860AB', + b'68449435AE ', + b'68496223AA ', + b'68504959AD ', + b'68504959AE ', + b'68504960AD ', + b'68504993AC ', + ], + (Ecu.transmission, 0x7e1, None): [ + b'05035707AA', + b'68419672AC', + b'68419675AC', + b'68419678AB', + b'68423905AB', + b'68449258AC', + b'68495807AA', + b'68495807AB', + b'68503641AC', + b'68503644AC', + b'68503664AC', + ], + }, + CAR.RAM_1500_5TH_GEN: { + (Ecu.combinationMeter, 0x742, None): [ + b'68294051AG', + b'68294051AI', + b'68294052AG', + b'68294052AH', + b'68294059AI', + b'68294063AG', + b'68294063AH', + b'68294063AI', + b'68434846AC', + b'68434847AC', + b'68434849AC', + b'68434850AC', + b'68434855AC', + b'68434856AC', + b'68434858AC', + b'68434859AC', + b'68434860AC', + b'68453471AD', + b'68453483AC', + b'68453483AD', + b'68453487AD', + b'68453491AC', + b'68453491AD', + b'68453499AD', + b'68453502AC', + b'68453503AC', + b'68453503AD', + b'68453505AC', + b'68453505AD', + b'68453511AC', + b'68453513AC', + b'68453513AD', + b'68453514AD', + b'68505633AB', + b'68510277AG', + b'68510277AH', + b'68510280AG', + b'68510280AH', + b'68510282AG', + b'68510282AH', + b'68510283AG', + b'68527346AE', + b'68527361AD', + b'68527375AD', + b'68527381AD', + b'68527381AE', + b'68527382AE', + b'68527383AD', + b'68527383AE', + b'68527387AE', + b'68527397AD', + b'68527403AC', + b'68527403AD', + b'68527404AD', + b'68546047AF', + b'68631938AA', + b'68631939AA', + b'68631940AA', + b'68631940AB', + b'68631941AB', + b'68631942AA', + b'68631943AB', + ], + (Ecu.srs, 0x744, None): [ + b'68428609AB', + b'68441329AA', + b'68441329AB', + b'68473844AB', + b'68490898AA', + b'68500728AA', + b'68615033AA', + b'68615034AA', + ], + (Ecu.abs, 0x747, None): [ + b'68292406AG', + b'68292406AH', + b'68432418AB', + b'68432418AC', + b'68432418AD', + b'68436004AD', + b'68436004AE', + b'68438454AC', + b'68438454AD', + b'68438456AE', + b'68438456AF', + b'68535469AB', + b'68535470AC', + b'68548900AB', + b'68548900AC', + b'68586307AB', + b'68586307AC', + b'68728724AA', + b'68728727AA', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'04672892AB', + b'04672932AB', + b'04672932AC', + b'22DTRHD_AA', + b'68320950AH', + b'68320950AI', + b'68320950AJ', + b'68320950AL', + b'68320950AM', + b'68454268AB', + b'68454268AC', + b'68475160AE', + b'68475160AF', + b'68475160AG', + ], + (Ecu.eps, 0x75a, None): [ + b'21590101AA', + b'21590101AB', + b'22490101AB', + b'68273275AF', + b'68273275AG', + b'68273275AH', + b'68312176AE', + b'68312176AF', + b'68312176AG', + b'68440789AC', + b'68466110AA', + b'68466110AB', + b'68466113AA', + b'68466116AA', + b'68469901AA', + b'68469904AA', + b'68469907AA', + b'68522583AA', + b'68522583AB', + b'68522584AA', + b'68522585AB', + b'68552788AA', + b'68552789AA', + b'68552790AA', + b'68552791AB', + b'68552794AA', + b'68552794AD', + b'68585106AB', + b'68585107AB', + b'68585108AB', + b'68585109AB', + b'68585112AB', + ], + (Ecu.engine, 0x7e0, None): [ + b'05035699AG ', + b'05035841AC ', + b'05035841AD ', + b'05036026AB ', + b'05036030AC ', + b'05036065AE ', + b'05036066AE ', + b'05036067AE ', + b'05036193AA ', + b'05149368AA ', + b'05149374AA ', + b'05149591AD ', + b'05149591AE ', + b'05149592AE ', + b'05149599AE ', + b'05149600AD ', + b'05149600AE ', + b'05149605AE ', + b'05149846AA ', + b'05149848AA ', + b'05149848AC ', + b'05190341AD', + b'05190346AD', + b'68378695AI ', + b'68378695AJ ', + b'68378695AK ', + b'68378696AJ ', + b'68378696AK ', + b'68378701AI ', + b'68378702AI ', + b'68378710AL ', + b'68378742AI ', + b'68378742AK ', + b'68378743AI ', + b'68378743AM ', + b'68378748AL ', + b'68378758AM ', + b'68378759AM ', + b'68448163AJ', + b'68448163AK', + b'68448163AL', + b'68448165AG', + b'68448165AK', + b'68455111AC ', + b'68455119AC ', + b'68455137AC ', + b'68455142AC ', + b'68455142AE ', + b'68455145AC ', + b'68455145AE ', + b'68455146AC ', + b'68460927AA ', + b'68467909AB ', + b'68467909AC ', + b'68467915AC ', + b'68467916AC ', + b'68467936AC ', + b'68500630AD', + b'68500630AE', + b'68500630AF', + b'68500631AE', + b'68502719AC ', + b'68502722AC ', + b'68502733AC ', + b'68502734AF ', + b'68502737AF ', + b'68502740AF ', + b'68502741AF ', + b'68502742AC ', + b'68502742AF ', + b'68539650AD', + b'68539650AF', + b'68539651AD', + b'68586101AA ', + b'68586102AA ', + b'68586105AB ', + b'68629917AC ', + b'68629919AC ', + b'68629919AD ', + b'68629922AC ', + b'68629925AC ', + b'68629926AC ', + ], + (Ecu.transmission, 0x7e1, None): [ + b'05035706AD', + b'05035842AB', + b'05036069AA', + b'05036181AA', + b'05149536AC', + b'05149537AC', + b'05149543AC', + b'68360078AL', + b'68360080AL', + b'68360080AM', + b'68360081AM', + b'68360081AN', + b'68360085AH', + b'68360085AJ', + b'68360085AK', + b'68360085AL', + b'68360085AO', + b'68360086AH', + b'68360086AK', + b'68360086AN', + b'68384328AD', + b'68384332AD', + b'68445531AC', + b'68445532AB', + b'68445533AB', + b'68445536AB', + b'68445537AB', + b'68466081AB', + b'68466086AB', + b'68466087AB', + b'68484466AC', + b'68484467AC', + b'68484471AC', + b'68502994AC', + b'68502994AD', + b'68502996AD', + b'68520867AE', + b'68520867AF', + b'68520870AC', + b'68520871AC', + b'68528325AE', + b'68540431AB', + b'68540433AB', + b'68551676AA', + b'68629935AB', + b'68629936AC', + ], + }, + CAR.RAM_HD_5TH_GEN: { + (Ecu.combinationMeter, 0x742, None): [ + b'68361606AH', + b'68437735AC', + b'68492693AD', + b'68525485AB', + b'68525487AB', + b'68525498AB', + b'68528791AF', + b'68628474AB', + ], + (Ecu.srs, 0x744, None): [ + b'68399794AC', + b'68428503AA', + b'68428505AA', + b'68428507AA', + ], + (Ecu.abs, 0x747, None): [ + b'68334977AH', + b'68455481AC', + b'68504022AA', + b'68504022AB', + b'68504022AC', + b'68530686AB', + b'68530686AC', + b'68544596AC', + b'68641704AA', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'04672895AB', + b'04672934AB', + b'56029827AG', + b'56029827AH', + b'68462657AE', + b'68484694AD', + b'68484694AE', + b'68615489AB', + ], + (Ecu.eps, 0x761, None): [ + b'68421036AC', + b'68507906AB', + b'68534023AC', + ], + (Ecu.engine, 0x7e0, None): [ + b'52370131AF', + b'52370231AF', + b'52370231AG', + b'52370491AA', + b'52370931CT', + b'52401032AE', + b'52421132AF', + b'52421332AF', + b'68527616AD ', + b'M2370131MB', + b'M2421132MB', + ], + }, + CAR.DODGE_DURANGO: { + (Ecu.combinationMeter, 0x742, None): [ + b'68454261AD', + b'68471535AE', + ], + (Ecu.srs, 0x744, None): [ + b'68355362AB', + b'68492238AD', + ], + (Ecu.abs, 0x747, None): [ + b'68408639AD', + b'68499978AB', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'68440581AE', + b'68456722AC', + ], + (Ecu.eps, 0x75a, None): [ + b'68453435AA', + b'68498477AA', + ], + (Ecu.engine, 0x7e0, None): [ + b'05035786AE ', + b'68449476AE ', + ], + (Ecu.transmission, 0x7e1, None): [ + b'05035826AC', + b'68449265AC', + ], + }, +} + + + +FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) diff --git a/artifacts/package_runtime/iqdbc/car/chrysler/interface.py b/artifacts/package_runtime/iqdbc/car/chrysler/interface.py new file mode 100644 index 000000000..7b880baa6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/chrysler/interface.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +from iqdbc.car import get_safety_config, structs +from iqdbc.car.chrysler.carcontroller import CarController +from iqdbc.car.chrysler.carstate import CarState +from iqdbc.car.chrysler.radar_interface import RadarInterface +from iqdbc.car.chrysler.values import CAR, RAM_HD, RAM_DT, RAM_CARS, ChryslerFlags, ChryslerSafetyFlags +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.lvbs.car.chrysler.iq_values import ChryslerFlagsIQ + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + DRIVABLE_GEARS = (structs.CarState.GearShifter.low,) + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "chrysler" + ret.dashcamOnly = candidate in RAM_HD + + # radar parsing needs some work, see https://github.com/commaai/openpilot/issues/26842 + ret.radarUnavailable = True # Bus.radar not in DBC[candidate][Bus.radar] + ret.steerActuatorDelay = 0.1 + ret.steerLimitTimer = 0.4 + + # safety config + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.chrysler)] + if candidate in RAM_HD: + ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.RAM_HD.value + elif candidate in RAM_DT: + ret.safetyConfigs[0].safetyParam |= ChryslerSafetyFlags.RAM_DT.value + + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + if candidate not in RAM_CARS: + # Newer FW versions standard on the following platforms, or flashed by a dealer onto older platforms have a higher minimum steering speed. + new_eps_platform = candidate in (CAR.CHRYSLER_PACIFICA_2019_HYBRID, CAR.CHRYSLER_PACIFICA_2020, CAR.JEEP_GRAND_CHEROKEE_2019, CAR.DODGE_DURANGO) + new_eps_firmware = any(fw.ecu == 'eps' and fw.fwVersion[:4] >= b"6841" for fw in car_fw) + if new_eps_platform or new_eps_firmware: + ret.flags |= ChryslerFlags.HIGHER_MIN_STEERING_SPEED.value + + # Chrysler + if candidate in (CAR.CHRYSLER_PACIFICA_2018, CAR.CHRYSLER_PACIFICA_2018_HYBRID, CAR.CHRYSLER_PACIFICA_2019_HYBRID, + CAR.CHRYSLER_PACIFICA_2020, CAR.DODGE_DURANGO): + ret.lateralTuning.init('pid') + ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kiBP = [[9., 20.], [9., 20.]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.15, 0.30], [0.03, 0.05]] + ret.lateralTuning.pid.kf = 0.00006 + + # Jeep + elif candidate in (CAR.JEEP_GRAND_CHEROKEE, CAR.JEEP_GRAND_CHEROKEE_2019): + ret.steerActuatorDelay = 0.2 + + ret.lateralTuning.init('pid') + ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kiBP = [[9., 20.], [9., 20.]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.15, 0.30], [0.03, 0.05]] + ret.lateralTuning.pid.kf = 0.00006 + + # Ram + elif candidate == CAR.RAM_1500_5TH_GEN: + ret.steerActuatorDelay = 0.2 + ret.wheelbase = 3.88 + # Older EPS FW allow steer to zero + if any(fw.ecu == 'eps' and b"68" < fw.fwVersion[:4] <= b"6831" for fw in car_fw): + ret.minSteerSpeed = 0. + + elif candidate == CAR.RAM_HD_5TH_GEN: + ret.steerActuatorDelay = 0.2 + + else: + raise ValueError(f"Unsupported car: {candidate}") + + if ret.flags & ChryslerFlags.HIGHER_MIN_STEERING_SPEED: + # TODO: allow these cars to steer down to 13 m/s if already engaged. + # TODO: Durango 2020 may be able to steer to zero once above 38 kph + ret.minSteerSpeed = 17.5 # m/s 17 on the way up, 13 on the way down once engaged. + + ret.centerToFront = ret.wheelbase * 0.44 + ret.enableBsm = 720 in fingerprint[0] + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + if candidate == CAR.RAM_1500_5TH_GEN: + if stock_cp.minSteerSpeed != 0.: + stock_cp.minSteerSpeed = 0.5 + stock_cp.minEnableSpeed = 14.5 + if any(fw.ecu == 'eps' and fw.fwVersion in (b"68273275AF", b"68273275AG", b"68312176AE", b"68312176AG",) for fw in car_fw): + stock_cp.minEnableSpeed = 0. + + if candidate == CAR.RAM_HD_5TH_GEN: + stock_cp.dashcamOnly = False + # https://github.com/commaai/openpilot/issues/25389 + stock_cp.tireStiffnessFactor = 1.0 + stock_cp.tireStiffnessFront = 65155. + stock_cp.tireStiffnessRear = 80926. + stock_cp.wheelbase = 3.79 + stock_cp.steerRatio = 19. + + # LKAS heartbeat on bus 0 (msg 0x4FF) means the camera is on the ADAS bus and + # IQ.Pilot can steer down to a standstill. + if 0x4FF in fingerprint[0]: + ret.flags |= ChryslerFlagsIQ.NO_MIN_STEERING_SPEED.value + stock_cp.minSteerSpeed = 0. + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/chrysler/radar_interface.py b/artifacts/package_runtime/iqdbc/car/chrysler/radar_interface.py new file mode 100644 index 000000000..b509e8461 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/chrysler/radar_interface.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.interfaces import RadarInterfaceBase +from iqdbc.car.chrysler.values import DBC + +RADAR_MSGS_C = list(range(0x2c2, 0x2d4+2, 2)) # c_ messages 706,...,724 +RADAR_MSGS_D = list(range(0x2a2, 0x2b4+2, 2)) # d_ messages +LAST_MSG = max(RADAR_MSGS_C + RADAR_MSGS_D) +NUMBER_MSGS = len(RADAR_MSGS_C) + len(RADAR_MSGS_D) + + +def _create_radar_can_parser(car_fingerprint): + if Bus.radar not in DBC[car_fingerprint]: + return None + + msg_n = len(RADAR_MSGS_C) + # list of [(signal name, message name or number), (...)] + # [('RADAR_STATE', 1024), + # ('LONG_DIST', 1072), + # ('LONG_DIST', 1073), + # ('LONG_DIST', 1074), + # ('LONG_DIST', 1075), + + messages = list(zip(RADAR_MSGS_C + + RADAR_MSGS_D, + [20] * msg_n + # 20Hz (0.05s) + [20] * msg_n, strict=True)) # 20Hz (0.05s) + + return CANParser(DBC[car_fingerprint][Bus.radar], messages, 1) + + +def _address_to_track(address): + if address in RADAR_MSGS_C: + return (address - RADAR_MSGS_C[0]) // 2 + if address in RADAR_MSGS_D: + return (address - RADAR_MSGS_D[0]) // 2 + raise ValueError("radar received unexpected address %d" % address) + + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + self.rcp = _create_radar_can_parser(CP.carFingerprint) + self.updated_messages = set() + self.trigger_msg = LAST_MSG + + def update(self, can_strings): + if self.rcp is None or self.CP.radarUnavailable: + return super().update(None) + + vls = self.rcp.update(can_strings) + self.updated_messages.update(vls) + + if self.trigger_msg not in self.updated_messages: + return None + + ret = structs.RadarData() + if not self.rcp.can_valid: + ret.errors.canError = True + + for ii in self.updated_messages: # ii should be the message ID as a number + cpt = self.rcp.vl[ii] + trackId = _address_to_track(ii) + + if trackId not in self.pts: + self.pts[trackId] = structs.RadarData.RadarPoint() + self.pts[trackId].trackId = trackId + self.pts[trackId].aRel = float('nan') + self.pts[trackId].yvRel = float('nan') + self.pts[trackId].measured = True + + if 'LONG_DIST' in cpt: # c_* message + self.pts[trackId].dRel = cpt['LONG_DIST'] # from front of car + # our lat_dist is positive to the right in car's frame. + # LAT_DIST is right-positive, yRel is left-positive + self.pts[trackId].yRel = -cpt['LAT_DIST'] # in car frame's y axis, left is positive + else: # d_* message + self.pts[trackId].vRel = cpt['REL_SPEED'] + + # We want a list, not a dictionary. Filter out LONG_DIST==0 because that means it's not valid. + ret.points = [x for x in self.pts.values() if x.dRel != 0] + + self.updated_messages.clear() + return ret diff --git a/artifacts/package_runtime/iqdbc/car/chrysler/values.py b/artifacts/package_runtime/iqdbc/car/chrysler/values.py new file mode 100644 index 000000000..2c54310f6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/chrysler/values.py @@ -0,0 +1,160 @@ +from enum import IntFlag +from dataclasses import dataclass, field + +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarHarness, CarDocs, CarParts +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, p16 + +Ecu = CarParams.Ecu + + +class ChryslerSafetyFlags(IntFlag): + RAM_DT = 1 + RAM_HD = 2 + + +class ChryslerFlags(IntFlag): + # Detected flags + HIGHER_MIN_STEERING_SPEED = 1 + + +@dataclass +class ChryslerCarDocs(CarDocs): + package: str = "Adaptive Cruise Control (ACC)" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca])) + + +@dataclass +class ChryslerPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: { + Bus.pt: 'chrysler_pacifica_2017_hybrid_generated', + Bus.radar: 'chrysler_pacifica_2017_hybrid_private_fusion', + }) + + +@dataclass(frozen=True) +class ChryslerCarSpecs(CarSpecs): + minSteerSpeed: float = 3.8 # m/s + + +class CAR(Platforms): + # Chrysler + CHRYSLER_PACIFICA_2018_HYBRID = ChryslerPlatformConfig( + [ChryslerCarDocs("Chrysler Pacifica Hybrid 2017-18")], + ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), + ) + CHRYSLER_PACIFICA_2019_HYBRID = ChryslerPlatformConfig( + [ChryslerCarDocs("Chrysler Pacifica Hybrid 2019-25")], + CHRYSLER_PACIFICA_2018_HYBRID.specs, + ) + CHRYSLER_PACIFICA_2018 = ChryslerPlatformConfig( + [ChryslerCarDocs("Chrysler Pacifica 2017-18")], + CHRYSLER_PACIFICA_2018_HYBRID.specs, + ) + CHRYSLER_PACIFICA_2020 = ChryslerPlatformConfig( + [ + ChryslerCarDocs("Chrysler Pacifica 2019-20"), + ChryslerCarDocs("Chrysler Pacifica 2021-23", package="All"), + ], + CHRYSLER_PACIFICA_2018_HYBRID.specs, + ) + + # Dodge + DODGE_DURANGO = ChryslerPlatformConfig( + [ChryslerCarDocs("Dodge Durango 2020-21")], + CHRYSLER_PACIFICA_2018_HYBRID.specs, + ) + + # Jeep + JEEP_GRAND_CHEROKEE = ChryslerPlatformConfig( # includes 2017 Trailhawk + [ChryslerCarDocs("Jeep Grand Cherokee 2016-18", video="https://www.youtube.com/watch?v=eLR9o2JkuRk")], + ChryslerCarSpecs(mass=1778., wheelbase=2.71, steerRatio=16.7), + ) + + JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk + [ChryslerCarDocs("Jeep Grand Cherokee 2019-21", video="https://www.youtube.com/watch?v=jBe4lWnRSu4")], + JEEP_GRAND_CHEROKEE.specs, + ) + + # Ram + RAM_1500_5TH_GEN = ChryslerPlatformConfig( + [ChryslerCarDocs("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram]))], + ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5), + {Bus.pt: 'chrysler_ram_dt_generated'}, + ) + RAM_HD_5TH_GEN = ChryslerPlatformConfig( + [ + ChryslerCarDocs("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), + ChryslerCarDocs("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])), + ], + ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.), + {Bus.pt: 'chrysler_ram_hd_generated'}, + ) + + +class CarControllerParams: + def __init__(self, CP): + self.STEER_STEP = 2 # 50 Hz + self.STEER_ERROR_MAX = 80 + if CP.carFingerprint in RAM_HD: + self.STEER_DELTA_UP = 14 + self.STEER_DELTA_DOWN = 14 + self.STEER_MAX = 361 # higher than this faults the EPS + elif CP.carFingerprint in RAM_DT: + self.STEER_DELTA_UP = 6 + self.STEER_DELTA_DOWN = 6 + self.STEER_MAX = 350 # EPS allows more, up to 350? + else: + self.STEER_DELTA_UP = 3 + self.STEER_DELTA_DOWN = 3 + self.STEER_MAX = 261 # higher than this faults the EPS + + +STEER_THRESHOLD = 120 + +RAM_DT = {CAR.RAM_1500_5TH_GEN, } +RAM_HD = {CAR.RAM_HD_5TH_GEN, } +RAM_CARS = RAM_DT | RAM_HD + + +CHRYSLER_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(0xf132) +CHRYSLER_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(0xf132) + +CHRYSLER_SOFTWARE_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_NUMBER) +CHRYSLER_SOFTWARE_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_NUMBER) + +CHRYSLER_RX_OFFSET = -0x280 + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + Request( + [CHRYSLER_VERSION_REQUEST], + [CHRYSLER_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.srs, Ecu.fwdRadar, Ecu.combinationMeter], + rx_offset=CHRYSLER_RX_OFFSET, + bus=0, + ), + Request( + [CHRYSLER_VERSION_REQUEST], + [CHRYSLER_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.hybrid, Ecu.engine, Ecu.transmission], + bus=0, + ), + Request( + [CHRYSLER_SOFTWARE_VERSION_REQUEST], + [CHRYSLER_SOFTWARE_VERSION_RESPONSE], + whitelist_ecus=[Ecu.engine, Ecu.transmission], + bus=0, + ), + ], + extra_ecus=[ + (Ecu.abs, 0x7e4, None), # alt address for abs on hybrids, NOTE: not on all hybrid platforms + ], +) + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/common/__init__.py b/artifacts/package_runtime/iqdbc/car/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/common/basedir.py b/artifacts/package_runtime/iqdbc/car/common/basedir.py new file mode 100644 index 000000000..6b4811e53 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/common/basedir.py @@ -0,0 +1,4 @@ +import os + + +BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../")) diff --git a/artifacts/package_runtime/iqdbc/car/common/conversions.py b/artifacts/package_runtime/iqdbc/car/common/conversions.py new file mode 100644 index 000000000..111c92884 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/common/conversions.py @@ -0,0 +1,20 @@ +import numpy as np + + +class Conversions: + # Speed + MPH_TO_KPH = 1.609344 + KPH_TO_MPH = 1. / MPH_TO_KPH + MS_TO_KPH = 3.6 + KPH_TO_MS = 1. / MS_TO_KPH + MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH + MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS + MS_TO_KNOTS = 1.9438 + KNOTS_TO_MS = 1. / MS_TO_KNOTS + + # Angle + DEG_TO_RAD = np.pi / 180. + RAD_TO_DEG = 1. / DEG_TO_RAD + + # Mass + LB_TO_KG = 0.453592 diff --git a/artifacts/package_runtime/iqdbc/car/common/filter_simple.py b/artifacts/package_runtime/iqdbc/car/common/filter_simple.py new file mode 100644 index 000000000..c08bde389 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/common/filter_simple.py @@ -0,0 +1,44 @@ +class FirstOrderFilter: + # first order filter + def __init__(self, x0, rc, dt, initialized=True): + self.x = x0 + self._dt = dt + self.update_alpha(rc) + self.initialized = initialized + + def update_dt(self, dt): + self._dt = dt + self.update_alpha(self._rc) + + def update_alpha(self, rc): + self._rc = rc + self._alpha = self._dt / (self._rc + self._dt) + + def update(self, x): + if self.initialized: + self.x = (1. - self._alpha) * self.x + self._alpha * x + else: + self.initialized = True + self.x = x + return self.x + + +class HighPassFilter: + # technically a band-pass filter + def __init__(self, x0, rc1, rc2, dt, initialized=True): + self.x = x0 + self._f1 = FirstOrderFilter(x0, rc1, dt, initialized) + self._f2 = FirstOrderFilter(x0, rc2, dt, initialized) + assert rc2 > rc1, "rc2 must be greater than rc1" + + def update_dt(self, dt): + self._f1.update_dt(dt) + self._f2.update_dt(dt) + + def update_alpha(self, rc1, rc2): + self._f1.update_alpha(rc1) + self._f2.update_alpha(rc2) + + def update(self, x): + self.x = self._f1.update(x) - self._f2.update(x) + return self.x diff --git a/artifacts/package_runtime/iqdbc/car/common/numpy_fast.py b/artifacts/package_runtime/iqdbc/car/common/numpy_fast.py new file mode 100644 index 000000000..e1e9f8ed7 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/common/numpy_fast.py @@ -0,0 +1,20 @@ +def clip(x, lo, hi): + return max(lo, min(hi, x)) + +def interp(x, xp, fp): + N = len(xp) + + def get_interp(xv): + hi = 0 + while hi < N and xv > xp[hi]: + hi += 1 + low = hi - 1 + return fp[-1] if hi == N and xv > xp[low] else ( + fp[0] if hi == 0 else + (xv - xp[low]) * (fp[hi] - fp[low]) / (xp[hi] - xp[low]) + fp[low]) + + return [get_interp(v) for v in x] if hasattr(x, '__iter__') else get_interp(x) + +def mean(x): + return sum(x) / len(x) + diff --git a/artifacts/package_runtime/iqdbc/car/common/pid.py b/artifacts/package_runtime/iqdbc/car/common/pid.py new file mode 100644 index 000000000..e9b5bb981 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/common/pid.py @@ -0,0 +1,71 @@ +import numpy as np +from numbers import Number + + +class PIDController: + def __init__(self, k_p, k_i, k_f=0., k_d=0., pos_limit=1e308, neg_limit=-1e308, rate=100): + self._k_p = k_p + self._k_i = k_i + self._k_d = k_d + self.k_f = k_f # feedforward gain + if isinstance(self._k_p, Number): + self._k_p = [[0], [self._k_p]] + if isinstance(self._k_i, Number): + self._k_i = [[0], [self._k_i]] + if isinstance(self._k_d, Number): + self._k_d = [[0], [self._k_d]] + + self.pos_limit = pos_limit + self.neg_limit = neg_limit + + self.i_unwind_rate = 0.3 / rate + self.i_rate = 1.0 / rate + self.speed = 0.0 + + self.reset() + + @property + def k_p(self): + return np.interp(self.speed, self._k_p[0], self._k_p[1]) + + @property + def k_i(self): + return np.interp(self.speed, self._k_i[0], self._k_i[1]) + + @property + def k_d(self): + return np.interp(self.speed, self._k_d[0], self._k_d[1]) + + @property + def error_integral(self): + return self.i/self.k_i + + def reset(self): + self.p = 0.0 + self.i = 0.0 + self.d = 0.0 + self.f = 0.0 + self.control = 0 + + def update(self, error, error_rate=0.0, speed=0.0, override=False, feedforward=0., freeze_integrator=False): + self.speed = speed + + self.p = float(error) * self.k_p + self.f = feedforward * self.k_f + self.d = error_rate * self.k_d + + if override: + self.i -= self.i_unwind_rate * float(np.sign(self.i)) + else: + if not freeze_integrator: + self.i = self.i + error * self.k_i * self.i_rate + + # Clip i to prevent exceeding control limits + control_no_i = self.p + self.d + self.f + control_no_i = np.clip(control_no_i, self.neg_limit, self.pos_limit) + self.i = np.clip(self.i, self.neg_limit - control_no_i, self.pos_limit - control_no_i) + + control = self.p + self.i + self.d + self.f + + self.control = np.clip(control, self.neg_limit, self.pos_limit) + return self.control diff --git a/artifacts/package_runtime/iqdbc/car/common/simple_kalman.py b/artifacts/package_runtime/iqdbc/car/common/simple_kalman.py new file mode 100644 index 000000000..194b27204 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/common/simple_kalman.py @@ -0,0 +1,54 @@ +import numpy as np + + +def get_kalman_gain(dt, A, C, Q, R, iterations=100): + P = np.zeros_like(Q) + for _ in range(iterations): + P = A.dot(P).dot(A.T) + dt * Q + S = C.dot(P).dot(C.T) + R + K = P.dot(C.T).dot(np.linalg.inv(S)) + P = (np.eye(len(P)) - K.dot(C)).dot(P) + return K + + +class KF1D: + # this EKF assumes constant covariance matrix, so calculations are much simpler + # the Kalman gain also needs to be precomputed using the control module + + def __init__(self, x0, A, C, K): + self.x0_0 = x0[0][0] + self.x1_0 = x0[1][0] + self.A0_0 = A[0][0] + self.A0_1 = A[0][1] + self.A1_0 = A[1][0] + self.A1_1 = A[1][1] + self.C0_0 = C[0] + self.C0_1 = C[1] + self.K0_0 = K[0][0] + self.K1_0 = K[1][0] + + self.A_K_0 = self.A0_0 - self.K0_0 * self.C0_0 + self.A_K_1 = self.A0_1 - self.K0_0 * self.C0_1 + self.A_K_2 = self.A1_0 - self.K1_0 * self.C0_0 + self.A_K_3 = self.A1_1 - self.K1_0 * self.C0_1 + + # K matrix needs to be pre-computed as follow: + # import control + # (x, l, K) = control.dare(np.transpose(self.A), np.transpose(self.C), Q, R) + # self.K = np.transpose(K) + + def update(self, meas): + #self.x = np.dot(self.A_K, self.x) + np.dot(self.K, meas) + x0_0 = self.A_K_0 * self.x0_0 + self.A_K_1 * self.x1_0 + self.K0_0 * meas + x1_0 = self.A_K_2 * self.x0_0 + self.A_K_3 * self.x1_0 + self.K1_0 * meas + self.x0_0 = x0_0 + self.x1_0 = x1_0 + return [self.x0_0, self.x1_0] + + @property + def x(self): + return [[self.x0_0], [self.x1_0]] + + def set_x(self, x): + self.x0_0 = x[0][0] + self.x1_0 = x[1][0] diff --git a/artifacts/package_runtime/iqdbc/car/crc.py b/artifacts/package_runtime/iqdbc/car/crc.py new file mode 100644 index 000000000..4aa721aaf --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/crc.py @@ -0,0 +1,31 @@ + +def _gen_crc8_table(poly: int) -> list[int]: + table = [] + for i in range(256): + crc = i + for _ in range(8): + if crc & 0x80: + crc = ((crc << 1) ^ poly) & 0xFF + else: + crc = (crc << 1) & 0xFF + table.append(crc) + return table + + +def _gen_crc16_table(poly: int) -> list[int]: + table = [] + for i in range(256): + crc = i << 8 + for _ in range(8): + if crc & 0x8000: + crc = ((crc << 1) ^ poly) & 0xFFFF + else: + crc = (crc << 1) & 0xFFFF + table.append(crc) + return table + + +CRC8H2F = _gen_crc8_table(0x2F) +CRC8J1850 = _gen_crc8_table(0x1D) +CRC8BODY = _gen_crc8_table(0xD5) +CRC16_XMODEM = _gen_crc16_table(0x1021) diff --git a/artifacts/package_runtime/iqdbc/car/debug/format_fingerprints.py b/artifacts/package_runtime/iqdbc/car/debug/format_fingerprints.py new file mode 100644 index 000000000..5989f8151 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/debug/format_fingerprints.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +import jinja2 +import os + +from iqdbc.car.common.basedir import BASEDIR +from iqdbc.car.interfaces import get_interface_attr +from iqdbc.car.structs import CarParams + +Ecu = CarParams.Ecu + +CARS = get_interface_attr('CAR') +FW_VERSIONS = get_interface_attr('FW_VERSIONS') +FINGERPRINTS = get_interface_attr('FINGERPRINTS') +ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()} + +FINGERPRINTS_PY_TEMPLATE = jinja2.Template(""" +{%- if FINGERPRINTS[brand] and brand != 'body' %} +# ruff: noqa: E501 +{% endif %} +\"\"\" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.\"\"\" +{% if FW_VERSIONS[brand] %} +from iqdbc.car.structs import CarParams +{% endif %} +from iqdbc.car.{{brand}}.values import CAR +{% if FW_VERSIONS[brand] %} + +Ecu = CarParams.Ecu +{% endif %} +{% if comments +%} +{{ comments | join() }} +{% endif %} +{% if FINGERPRINTS[brand] %} + +FINGERPRINTS = { +{% for car, fingerprints in FINGERPRINTS[brand].items() %} + CAR.{{car.name}}: [{ +{% for fingerprint in fingerprints %} +{% if not loop.first %} + {{ "{" }} +{% endif %} + {% for key, value in fingerprint.items() %}{{key}}: {{value}}{% if not loop.last %}, {% endif %}{% endfor %} + + }{% if loop.last %}]{% endif %}, +{% endfor %} +{% endfor %} +} +{% endif %} + +FW_VERSIONS{% if not FW_VERSIONS[brand] %}: dict[str, dict[tuple, list[bytes]]]{% endif %} = { +{% for car, _ in FW_VERSIONS[brand].items() %} + CAR.{{car.name}}: { +{% for key, fw_versions in FW_VERSIONS[brand][car].items() %} + (Ecu.{{ECU_NAME[key[0]]}}, 0x{{"%0x" | format(key[1] | int)}}, \ +{% if key[2] %}0x{{"%0x" | format(key[2] | int)}}{% else %}{{key[2]}}{% endif %}): [ + {% for fw_version in (fw_versions + extra_fw_versions.get(car, {}).get(key, [])) | unique | sort %} + {{fw_version}}, + {% endfor %} + ], +{% endfor %} + }, +{% endfor %} +} + +""", trim_blocks=True) + + +def format_brand_fw_versions(brand, extra_fw_versions: None | dict[str, dict[tuple, list[bytes]]] = None): + extra_fw_versions = extra_fw_versions or {} + + fingerprints_file = os.path.join(BASEDIR, f"{brand}/fingerprints.py") + with open(fingerprints_file) as f: + comments = [line for line in f.readlines() if line.startswith("#") and "noqa" not in line] + + with open(fingerprints_file, "w") as f: + f.write(FINGERPRINTS_PY_TEMPLATE.render(brand=brand, comments=comments, ECU_NAME=ECU_NAME, + FINGERPRINTS=FINGERPRINTS, FW_VERSIONS=FW_VERSIONS, + extra_fw_versions=extra_fw_versions)) + + +if __name__ == "__main__": + for brand in FW_VERSIONS.keys(): + format_brand_fw_versions(brand) diff --git a/artifacts/package_runtime/iqdbc/car/disable_ecu.py b/artifacts/package_runtime/iqdbc/car/disable_ecu.py new file mode 100644 index 000000000..b5e49df81 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/disable_ecu.py @@ -0,0 +1,80 @@ +from iqdbc.car.can_definitions import CanData +from iqdbc.car.carlog import carlog +from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery + +EXT_DIAG_REQUEST = b'\x10\x03' +EXT_DIAG_RESPONSE = b'\x50\x03' + +COM_CONT_RESPONSE = b'' + +CLEAR_DTC_REQUEST = b'\x14\xff\xff\xff' +CLEAR_DTC_RESPONSE = b'\x54' + +FUNCTIONAL_ADDR_29BIT = 0x18DB33F1 +CLEAR_DTC_ISOTP_SF = bytes([len(CLEAR_DTC_REQUEST)]) + CLEAR_DTC_REQUEST + b'\x00' * (7 - len(CLEAR_DTC_REQUEST)) + + +def clear_all_dtcs(can_send, buses, functional_addr=FUNCTIONAL_ADDR_29BIT): + # broadcast clears stored DTCs on every ECU on the bus, including safety-relevant modules + for bus in buses: + carlog.warning(f"clear all DTCs (functional) on bus {bus} ...") + can_send([CanData(functional_addr, CLEAR_DTC_ISOTP_SF, bus)]) + + +def clear_ecu_dtcs(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, timeout=0.1, retry=10, response_offset: int = 0x8): + carlog.warning(f"ecu clear DTCs {hex(addr), sub_addr} ...") + + for i in range(retry): + try: + query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr, sub_addr)], [EXT_DIAG_REQUEST], [EXT_DIAG_RESPONSE], response_offset) + + for _, _ in query.get_data(timeout).items(): + carlog.warning("clear diagnostic information ...") + query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr, sub_addr)], [CLEAR_DTC_REQUEST], [CLEAR_DTC_RESPONSE], response_offset) + query.get_data(timeout) + + carlog.warning("ecu DTCs cleared") + return True + + except Exception: + carlog.exception("ecu clear DTCs exception") + + carlog.error(f"ecu clear DTCs retry ({i + 1}) ...") + carlog.error("ecu clear DTCs failed") + return False + + +def disable_ecu(can_recv, can_send, bus=0, addr=0x7d0, sub_addr=None, com_cont_req=b'\x28\x83\x01', + timeout=0.1, retry=10, response_offset: int = 0x8, clear_dtc=False): + """Silence an ECU by disabling sending and receiving messages using UDS 0x28. + The ECU will stay silent as long as openpilot keeps sending Tester Present. + + This is used to disable the radar in some cars. Openpilot will emulate the radar. + WARNING: THIS DISABLES AEB!""" + carlog.warning(f"ecu disable {hex(addr), sub_addr} ...") + + for i in range(retry): + try: + query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr, sub_addr)], [EXT_DIAG_REQUEST], [EXT_DIAG_RESPONSE], response_offset) + + for _, _ in query.get_data(timeout).items(): + # a DTC clear can take the ECU several hundred ms, so it must complete before comms go down + if clear_dtc: + carlog.warning("clear diagnostic information ...") + query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr, sub_addr)], [CLEAR_DTC_REQUEST], [CLEAR_DTC_RESPONSE], response_offset) + query.get_data(timeout) + + carlog.warning("communication control disable tx/rx ...") + + query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr, sub_addr)], [com_cont_req], [COM_CONT_RESPONSE], response_offset) + query.get_data(0) + + carlog.warning("ecu disabled") + return True + + except Exception: + carlog.exception("ecu disable exception") + + carlog.error(f"ecu disable retry ({i + 1}) ...") + carlog.error("ecu disable failed") + return False diff --git a/artifacts/package_runtime/iqdbc/car/docs.py b/artifacts/package_runtime/iqdbc/car/docs.py new file mode 100644 index 000000000..43e85fbf1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/docs.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +import re +import os +import jinja2 +import argparse +import unicodedata +from typing import get_args + +from enum import Enum +from collections import defaultdict + +from iqdbc.car.common.basedir import BASEDIR +from iqdbc.car import gen_empty_fingerprint +from iqdbc.car.structs import CarParams, IQCarParams +from iqdbc.car.docs_definitions import BaseCarHarness, CarDocs, Device, ExtraCarDocs, Column, ExtraCarsColumn, CommonFootnote, PartType, SupportType +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.interfaces import get_interface_attr +from iqdbc.car.values import Platform +from iqdbc.car.mock.values import CAR as MOCK +from iqdbc.car.extra_cars import CAR as EXTRA + + +EXTRA_CARS_MD_OUT = os.path.join(BASEDIR, "../", "../", "docs", "CARS.md") + +# TODO: merge these platforms into normal car ports with SupportType flag +ExtraPlatform = Platform | EXTRA +EXTRA_BRANDS = get_args(ExtraPlatform) +EXTRA_PLATFORMS: dict[str, ExtraPlatform] = {str(platform): platform for brand in EXTRA_BRANDS for platform in brand} + + +def get_params_for_docs(platform) -> tuple[CarParams, IQCarParams]: + cp_platform = platform if platform in interfaces else MOCK.MOCK + CP: CarParams = interfaces[cp_platform].get_params(cp_platform, fingerprint=gen_empty_fingerprint(), + car_fw=[CarParams.CarFw(ecu=CarParams.Ecu.unknown)], + alpha_long=True, is_release=True, docs=True) + + CP_IQ: IQCarParams = interfaces[cp_platform].get_params_iq(CP, cp_platform, fingerprint=gen_empty_fingerprint(), + car_fw=[CarParams.CarFw(ecu=CarParams.Ecu.unknown)], + alpha_long=True, is_release_iq=True, docs=True) + return CP, CP_IQ + + +def get_all_footnotes() -> dict[Enum, int]: + all_footnotes = list(CommonFootnote) + for footnotes in get_interface_attr("Footnote", ignore_none=True).values(): + all_footnotes.extend(footnotes) + return {fn: idx + 1 for idx, fn in enumerate(all_footnotes)} + + +def _natural_sort_key(s): + # NFKD normalization ensures accented characters sort with their base letter (e.g., Å  sorts with S) + normalized = unicodedata.normalize('NFKD', s) + return [int(t) if t.isdigit() else t.lower() for t in re.split(r'(\d+)', normalized) if t] + + +def build_sorted_car_docs_list(platforms, footnotes=None): + collected_car_docs: list[CarDocs | ExtraCarDocs] = [] + for platform in platforms.values(): + car_docs = platform.config.car_docs + CP, CP_IQ = get_params_for_docs(platform) + + if not len(car_docs): + continue + + # A platform can include multiple car models + for _car_docs in car_docs: + if not hasattr(_car_docs, "row"): + _car_docs.init_make(CP) + _car_docs.init(CP, footnotes) + collected_car_docs.append(_car_docs) + + # Sort cars by make and model + year + sorted_cars = sorted(collected_car_docs, key=lambda car: _natural_sort_key(car.name)) + return sorted_cars + + +# CAUTION: This function is imported by shop.comma.ai and comma.ai/vehicles, test changes carefully +def get_all_car_docs() -> list[CarDocs]: + collected_footnotes = get_all_footnotes() + sorted_list: list[CarDocs] = build_sorted_car_docs_list(EXTRA_PLATFORMS, footnotes=collected_footnotes) + return sorted_list + + +def group_by_make(all_car_docs: list[CarDocs]) -> dict[str, list[CarDocs]]: + sorted_car_docs = defaultdict(list) + for car_docs in all_car_docs: + sorted_car_docs[car_docs.make].append(car_docs) + return dict(sorted_car_docs) + + +def generate_cars_md(all_car_docs: list[CarDocs], template_fn: str, **kwargs) -> str: + with open(template_fn) as f: + template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True) + + footnotes = [fn.value.text for fn in get_all_footnotes()] + cars_md: str = template.render(all_car_docs=all_car_docs, PartType=PartType, + group_by_make=group_by_make, footnotes=footnotes, + Device=Device, Column=Column, ExtraCarsColumn=ExtraCarsColumn, + BaseCarHarness=BaseCarHarness, SupportType=SupportType, + **kwargs) + return cars_md + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Auto generates supportability info docs for all known cars", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument("--out", default=EXTRA_CARS_MD_OUT, help="Override default generated filename") + args = parser.parse_args() + + with open(args.out, 'w') as f: + f.write(generate_cars_md(get_all_car_docs(), args.template)) + print(f"Generated and written to {args.out}") diff --git a/artifacts/package_runtime/iqdbc/car/docs_definitions.py b/artifacts/package_runtime/iqdbc/car/docs_definitions.py new file mode 100644 index 000000000..8d0a3adcb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/docs_definitions.py @@ -0,0 +1,406 @@ +import re +from collections import namedtuple +import copy +from dataclasses import dataclass, field +from enum import Enum + +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.structs import CarParams + +GOOD_TORQUE_THRESHOLD = 1.0 # m/s^2 +MODEL_YEARS_RE = r"(?<= )((\d{4}-\d{2})|(\d{4}))(,|$)" + + +class Column(Enum): + MAKE = "Make" + MODEL = "Model" + PACKAGE = "Supported Package" + LONGITUDINAL = "ACC" + FSR_LONGITUDINAL = "No ACC accel below" + FSR_STEERING = "No ALC below" + STEERING_TORQUE = "Steering Torque" + AUTO_RESUME = "Resume from stop" + HARDWARE = "Hardware Needed" + VIDEO = "Video" + SETUP_VIDEO = "Setup Video" + + +class ExtraCarsColumn(Enum): + MAKE = "Make" + MODEL = "Model" + PACKAGE = "Package" + SUPPORT = "Support Level" + + +class SupportType(Enum): + UPSTREAM = "Upstream" # Actively maintained by comma, plug-and-play in release versions of openpilot + REVIEW = "Under review" # Dashcam, but planned for official support after safety validation + DASHCAM = "Dashcam mode" # Dashcam, but may be drivable in a community fork + COMMUNITY = "Community" # Not upstream, but available in a custom community fork, not validated by comma + CUSTOM = "Custom" # Upstream, but don't have a harness available or need an unusual custom install + INCOMPATIBLE = "Not compatible" # Known fundamental incompatibility such as Flexray or hydraulic power steering + + +class Star(Enum): + FULL = "full" + HALF = "half" + EMPTY = "empty" + + +# A part + its comprised parts +@dataclass +class BasePart: + name: str + parts: list[Enum] = field(default_factory=list) + + def all_parts(self): + # Recursively get all parts + _parts = 'parts' + parts = [] + parts.extend(getattr(self, _parts)) + for part in getattr(self, _parts): + parts.extend(part.value.all_parts()) + + return parts + + +class EnumBase(Enum): + @property + def part_type(self): + return PartType(self.__class__) + + +class Mount(EnumBase): + mount = BasePart("mount") + + +class Cable(EnumBase): + long_obdc_cable = BasePart("long OBD-C cable (9.5 ft)") + usb_a_2_a_cable = BasePart("USB A-A cable") + usbc_otg_cable = BasePart("USB C OTG cable") + obd_c_cable_2ft = BasePart("OBD-C cable (2 ft)") + + +class Accessory(EnumBase): + harness_box = BasePart("harness box") + comma_power = BasePart("comma power v3") + + +class Tool(EnumBase): + socket_8mm_deep = BasePart("Socket Wrench 8mm or 5/16\" (deep)") + pry_tool = BasePart("Pry Tool") + + +@dataclass +class BaseCarHarness(BasePart): + parts: list[Enum] = field(default_factory=lambda: [Accessory.harness_box, Accessory.comma_power]) + has_connector: bool = True # without are hidden on the harness connector page + + +class CarHarness(EnumBase): + nidec = BaseCarHarness("Honda Nidec connector") + bosch_a = BaseCarHarness("Honda Bosch A connector") + bosch_b = BaseCarHarness("Honda Bosch B connector") + bosch_c = BaseCarHarness("Honda Bosch C connector") + toyota_a = BaseCarHarness("Toyota A connector") + toyota_b = BaseCarHarness("Toyota B connector") + subaru_a = BaseCarHarness("Subaru A connector", parts=[Accessory.harness_box, Accessory.comma_power, Tool.socket_8mm_deep, Tool.pry_tool]) + subaru_b = BaseCarHarness("Subaru B connector", parts=[Accessory.harness_box, Accessory.comma_power, Tool.socket_8mm_deep, Tool.pry_tool]) + subaru_c = BaseCarHarness("Subaru C connector", parts=[Accessory.harness_box, Accessory.comma_power, Tool.socket_8mm_deep, Tool.pry_tool]) + subaru_d = BaseCarHarness("Subaru D connector", parts=[Accessory.harness_box, Accessory.comma_power, Tool.socket_8mm_deep, Tool.pry_tool]) + fca = BaseCarHarness("FCA connector") + ram = BaseCarHarness("Ram connector") + vw_a = BaseCarHarness("VW A connector") + vw_j533 = BaseCarHarness("VW J533 connector", parts=[Accessory.harness_box, Cable.long_obdc_cable]) + hyundai_a = BaseCarHarness("Hyundai A connector") + hyundai_b = BaseCarHarness("Hyundai B connector") + hyundai_c = BaseCarHarness("Hyundai C connector") + hyundai_d = BaseCarHarness("Hyundai D connector") + hyundai_e = BaseCarHarness("Hyundai E connector") + hyundai_f = BaseCarHarness("Hyundai F connector") + hyundai_g = BaseCarHarness("Hyundai G connector") + hyundai_h = BaseCarHarness("Hyundai H connector") + hyundai_i = BaseCarHarness("Hyundai I connector") + hyundai_j = BaseCarHarness("Hyundai J connector") + hyundai_k = BaseCarHarness("Hyundai K connector") + hyundai_l = BaseCarHarness("Hyundai L connector") + hyundai_m = BaseCarHarness("Hyundai M connector") + hyundai_n = BaseCarHarness("Hyundai N connector") + hyundai_o = BaseCarHarness("Hyundai O connector") + hyundai_p = BaseCarHarness("Hyundai P connector") + hyundai_q = BaseCarHarness("Hyundai Q connector") + hyundai_r = BaseCarHarness("Hyundai R connector") + custom = BaseCarHarness("Developer connector") + obd_ii = BaseCarHarness("OBD-II connector", parts=[Cable.long_obdc_cable], has_connector=False) + gm = BaseCarHarness("GM connector", parts=[Accessory.harness_box]) + gmsdgm = BaseCarHarness("GM SDGM connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable]) + nissan_a = BaseCarHarness("Nissan A connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable]) + nissan_b = BaseCarHarness("Nissan B connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable]) + mazda = BaseCarHarness("Mazda connector") + ford_q3 = BaseCarHarness("Ford Q3 connector") + ford_q4 = BaseCarHarness("Ford Q4 connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable]) + rivian = BaseCarHarness("Rivian A connector", parts=[Accessory.harness_box, Accessory.comma_power, Cable.long_obdc_cable]) + tesla_a = BaseCarHarness("Tesla A connector", parts=[Accessory.harness_box, Cable.long_obdc_cable]) + tesla_b = BaseCarHarness("Tesla B connector", parts=[Accessory.harness_box, Cable.long_obdc_cable]) + psa_a = BaseCarHarness("PSA A connector", parts=[Accessory.harness_box, Cable.long_obdc_cable]) + + # custom harness + honda_clarity = BaseCarHarness("Honda Nidec connector + Honda Clarity Proxy Board") + + +class Device(EnumBase): + four = BasePart("comma four", parts=[Mount.mount, Cable.obd_c_cable_2ft]) + + +class PartType(Enum): + accessory = Accessory + cable = Cable + connector = CarHarness + device = Device + mount = Mount + tool = Tool + + +DEFAULT_CAR_PARTS: list[EnumBase] = [Device.four] + + +@dataclass +class CarParts: + parts: list[EnumBase] = field(default_factory=list) + custom_parts_url: str | None = None + + def __call__(self): + return copy.deepcopy(self) + + @classmethod + def common(cls, add: list[EnumBase] | None = None, remove: list[EnumBase] | None = None): + p = [part for part in (add or []) + DEFAULT_CAR_PARTS if part not in (remove or [])] + return cls(p) + + def all_parts(self): + parts = [] + for part in self.parts: + parts.extend(part.value.all_parts()) + return self.parts + parts + + +CarFootnote = namedtuple("CarFootnote", ["text", "column", "docs_only", "setup_note"], defaults=(False, False)) + + +class CommonFootnote(Enum): + EXP_LONG_AVAIL = CarFootnote( + "openpilot Longitudinal Control (Alpha) is available behind a toggle; " + + "the toggle is only available in non-release branches such as `devel` or `nightly-dev`.", + Column.LONGITUDINAL, docs_only=True) + + +def get_footnotes(footnotes: list[Enum], column: Column) -> list[Enum]: + # Returns applicable footnotes given current column + return [fn for fn in footnotes if fn.value.column == column] + + +# TODO: store years as a list +def get_year_list(years): + years_list = [] + if len(years) == 0: + return years_list + + for year in years.split(','): + year = year.strip() + if len(year) == 4: + years_list.append(str(year)) + elif "-" in year and len(year) == 7: + start, end = year.split("-") + years_list.extend(map(str, range(int(start), int(f"20{end}") + 1))) + else: + raise Exception(f"Malformed year string: {years}") + return years_list + + +def split_name(name: str) -> tuple[str, str, str]: + make, model = name.split(" ", 1) + years = "" + match = re.search(MODEL_YEARS_RE, model) + if match is not None: + years = model[match.start():] + model = model[:match.start() - 1] + return make, model, years + + +@dataclass +class CarDocs: + # make + model + model years + name: str + + # the simplest description of the requirements for the US market + package: str + + video: str | None = None + setup_video: str | None = None + footnotes: list[Enum] = field(default_factory=list) + min_steer_speed: float | None = None + min_enable_speed: float | None = None + auto_resume: bool | None = None + + # all the parts needed for the supported car + car_parts: CarParts = field(default_factory=CarParts) + + merged: bool = True + support_type: SupportType = SupportType.UPSTREAM + support_link: str | None = "#upstream" + + def __post_init__(self): + self.make, self.model, self.years = split_name(self.name) + self.year_list = get_year_list(self.years) + + def init(self, CP: CarParams, all_footnotes=None): + self.brand = CP.brand + self.car_fingerprint = CP.carFingerprint + self.longitudinal_control = CP.openpilotLongitudinalControl and not CP.alphaLongitudinalAvailable + + if self.merged and CP.dashcamOnly: + if self.support_type not in (SupportType.CUSTOM, SupportType.REVIEW): + self.support_type = SupportType.DASHCAM + self.support_link = "#dashcam" + + # longitudinal column + op_long = "Stock" + if CP.alphaLongitudinalAvailable: + op_long = "openpilot available" + self.footnotes.append(CommonFootnote.EXP_LONG_AVAIL) + elif CP.openpilotLongitudinalControl: + op_long = "openpilot" + + # min steer & enable speed columns + # TODO: set all the min steer speeds in carParams and remove this + if self.min_steer_speed is not None: + assert CP.minSteerSpeed < 0.5, f"{CP.carFingerprint}: Minimum steer speed set in both CarDocs and CarParams" + else: + self.min_steer_speed = CP.minSteerSpeed + + # TODO: set all the min enable speeds in carParams correctly and remove this + if self.min_enable_speed is None: + self.min_enable_speed = CP.minEnableSpeed + + if self.auto_resume is None: + self.auto_resume = CP.autoResumeSng and self.min_enable_speed <= 0 + + # hardware column + hardware_col = "None" + if self.car_parts.parts: + if self.car_parts.custom_parts_url is not None: + buy_link = f'Buy Here' + else: + buy_link = f'Buy Here' + + tools_docs = [part for part in self.car_parts.all_parts() if isinstance(part, Tool)] + parts_docs = [part for part in self.car_parts.all_parts() if not isinstance(part, Tool)] + + def display_func(parts): + return '
'.join([f"- {parts.count(part)} {part.value.name}" for part in sorted(set(parts), key=lambda part: str(part.value.name))]) + + hardware_col = f'
Parts{display_func(parts_docs)}
{buy_link}
' + if len(tools_docs): + hardware_col += f'
Tools{display_func(tools_docs)}
' + + self.row: dict[Enum, str | Star] = { + Column.MAKE: self.make, + Column.MODEL: self.model, + Column.PACKAGE: self.package, + Column.LONGITUDINAL: op_long, + Column.FSR_LONGITUDINAL: f"{max(self.min_enable_speed * CV.MS_TO_MPH, 0):.0f} mph", + Column.FSR_STEERING: f"{max(self.min_steer_speed * CV.MS_TO_MPH, 0):.0f} mph", + Column.STEERING_TORQUE: Star.EMPTY, + Column.AUTO_RESUME: Star.FULL if self.auto_resume else Star.EMPTY, + Column.HARDWARE: hardware_col, + Column.VIDEO: self.video or "", # replaced with an image and link from template in get_column + Column.SETUP_VIDEO: self.setup_video or "", # replaced with an image and link from template in get_column + } + + if self.support_link is not None: + support_info = f"[{self.support_type.value}]({self.support_link})" + else: + support_info = self.support_type.value + + self.extra_cars_row: dict[Enum, str] = { + ExtraCarsColumn.MAKE: self.make, + ExtraCarsColumn.MODEL: self.model, + ExtraCarsColumn.PACKAGE: self.package, + ExtraCarsColumn.SUPPORT: support_info, + } + + # Set steering torque star from max lateral acceleration + assert CP.maxLateralAccel > 0.1 + if CP.maxLateralAccel >= GOOD_TORQUE_THRESHOLD: + self.row[Column.STEERING_TORQUE] = Star.FULL + + self.all_footnotes = all_footnotes + self.detail_sentence = self.get_detail_sentence(CP) + + return self + + def init_make(self, CP: CarParams): + """CarDocs subclasses can add make-specific logic for harness selection, footnotes, etc.""" + + def get_detail_sentence(self, CP): + if not CP.notCar: + sentence_builder = "openpilot upgrades your {car_model} with automated lane centering{alc} and adaptive cruise control{acc}." + + if self.min_steer_speed > self.min_enable_speed: + alc = f" above {self.min_steer_speed * CV.MS_TO_MPH:.0f} mph," if self.min_steer_speed > 0 else " at all speeds," + else: + alc = "" + + # Exception for cars which do not auto-resume yet + acc = "" + if self.min_enable_speed > 0: + acc = f" while driving above {self.min_enable_speed * CV.MS_TO_MPH:.0f} mph" + elif self.auto_resume: + acc = " that automatically resumes from a stop" + + if self.row[Column.STEERING_TORQUE] != Star.FULL: + sentence_builder += " This car may not be able to take tight turns on its own." + + # experimental mode + exp_link = "Experimental mode" + if CP.openpilotLongitudinalControl and not CP.alphaLongitudinalAvailable: + sentence_builder += f" Traffic light and stop sign handling is also available in {exp_link}." + + return sentence_builder.format(car_model=f"{self.make} {self.model}", alc=alc, acc=acc) + + else: + if CP.carFingerprint == "COMMA_BODY": + return "The body is a robotics dev kit that can run openpilot. Learn more." + else: + raise Exception(f"This notCar does not have a detail sentence: {CP.carFingerprint}") + + def get_column(self, column: Column, star_icon: str, video_icon: str, footnote_tag: str) -> str: + item: str | Star = self.row[column] + if isinstance(item, Star): + item = star_icon.format(item.value) + elif column == Column.MODEL and len(self.years): + item += f" {self.years}" + elif column in (Column.VIDEO, Column.SETUP_VIDEO) and len(item) > 0: + item = video_icon.format(item) + + footnotes = get_footnotes(self.footnotes, column) + if len(footnotes): + sups = sorted([self.all_footnotes[fn] for fn in footnotes]) + item += footnote_tag.format(f'{",".join(map(str, sups))}') + + return item + + def get_extra_cars_column(self, column: ExtraCarsColumn) -> str: + item: str = self.extra_cars_row[column] + if column == ExtraCarsColumn.MODEL and len(self.years): + item += f" {self.years}" + + return item + + +@dataclass +class ExtraCarDocs(CarDocs): + package: str = "All" + merged: bool = False + support_type: SupportType = SupportType.INCOMPATIBLE + support_link: str | None = "#incompatible" diff --git a/artifacts/package_runtime/iqdbc/car/ecu_addrs.py b/artifacts/package_runtime/iqdbc/car/ecu_addrs.py new file mode 100644 index 000000000..bfc5b345c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ecu_addrs.py @@ -0,0 +1,56 @@ +import time + +from iqdbc.car import make_tester_present_msg, uds +from iqdbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable +from iqdbc.car.carlog import carlog +from iqdbc.car.fw_query_definitions import EcuAddrBusType + + +def _is_tester_present_response(msg: CanData, subaddr: int | None = None) -> bool: + # ISO-TP messages may use CAN frame optimization (not always 8 bytes) + # tester present response is always a single frame + dat_offset = 1 if subaddr is not None else 0 + min_length = 4 if subaddr is not None else 3 # bytes: frame len, (pos/neg) sid, (optional negative sid)/0x00 sub-function + if min_length <= len(msg.dat) <= 8 and 1 <= msg.dat[dat_offset] <= 7: + # success response + if msg.dat[dat_offset + 1] == (uds.SERVICE_TYPE.TESTER_PRESENT + 0x40): + return True + # error response + if msg.dat[dat_offset + 1] == 0x7F and msg.dat[dat_offset + 2] == uds.SERVICE_TYPE.TESTER_PRESENT: + return True + return False + + +def get_all_ecu_addrs(can_recv: CanRecvCallable, can_send: CanSendCallable, bus: int, timeout: float = 1) -> set[EcuAddrBusType]: + addr_list = [0x700 + i for i in range(256)] + [0x18da00f1 + (i << 8) for i in range(256)] + queries: set[EcuAddrBusType] = {(addr, None, bus) for addr in addr_list} + responses = queries + return get_ecu_addrs(can_recv, can_send, queries, responses, timeout=timeout) + + +def get_ecu_addrs(can_recv: CanRecvCallable, can_send: CanSendCallable, queries: set[EcuAddrBusType], + responses: set[EcuAddrBusType], timeout: float = 1) -> set[EcuAddrBusType]: + ecu_responses: set[EcuAddrBusType] = set() # set((addr, subaddr, bus),) + try: + msgs = [make_tester_present_msg(addr, bus, subaddr) for addr, subaddr, bus in queries] + + can_recv() + can_send(msgs) + start_time = time.monotonic() + while time.monotonic() - start_time < timeout: + can_packets = can_recv(wait_for_one=True) + for packet in can_packets: + for msg in packet: + if not len(msg.dat): + carlog.warning("ECU addr scan: skipping empty remote frame") + continue + + subaddr = None if (msg.address, None, msg.src) in responses else msg.dat[0] + if (msg.address, subaddr, msg.src) in responses and _is_tester_present_response(msg, subaddr): + carlog.debug(f"CAN-RX: {hex(msg.address)} - 0x{bytes.hex(msg.dat)}") + if (msg.address, subaddr, msg.src) in ecu_responses: + carlog.debug(f"Duplicate ECU address: {hex(msg.address)}") + ecu_responses.add((msg.address, subaddr, msg.src)) + except Exception: + carlog.exception("ECU addr scan exception") + return ecu_responses diff --git a/artifacts/package_runtime/iqdbc/car/extra_cars.py b/artifacts/package_runtime/iqdbc/car/extra_cars.py new file mode 100644 index 000000000..1dff5f7fa --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/extra_cars.py @@ -0,0 +1,88 @@ +from dataclasses import dataclass + +from iqdbc.car import structs, Platforms, ExtraPlatformConfig +from iqdbc.car.docs_definitions import ExtraCarDocs, SupportType + + +@dataclass +class CommunityCarDocs(ExtraCarDocs): + def init_make(self, CP: structs.CarParams): + self.support_type = SupportType.COMMUNITY + self.support_link = "#community" + + +@dataclass +class ToyotaSecurityCarDocs(ExtraCarDocs): + def init_make(self, CP: structs.CarParams): + self.support_type = SupportType.INCOMPATIBLE + self.support_link = "#can-bus-security" + + +@dataclass +class GMSecurityCarDocs(ExtraCarDocs): + def init_make(self, CP: structs.CarParams): + self.support_type = SupportType.INCOMPATIBLE + self.support_link = "#can-bus-security" + + +@dataclass +class FlexRayCarDocs(ExtraCarDocs): + def init_make(self, CP: structs.CarParams): + self.support_type = SupportType.INCOMPATIBLE + self.support_link = "#flexray" + + +class CAR(Platforms): + config: ExtraPlatformConfig + + EXTRA_HONDA = ExtraPlatformConfig( + [ + CommunityCarDocs("Acura ADX 2025-26"), + CommunityCarDocs("Acura Integra 2023-25"), + CommunityCarDocs("Acura MDX 2015-16", "Advance Package"), + CommunityCarDocs("Acura MDX 2017-20"), + CommunityCarDocs("Acura MDX Hybrid 2017-20"), + CommunityCarDocs("Acura MDX 2022-24"), + CommunityCarDocs("Acura RDX 2022-25"), + CommunityCarDocs("Acura RLX 2017", "Advance Package or Technology Package"), + CommunityCarDocs("Acura TLX 2015-17", "Advance Package"), + CommunityCarDocs("Acura TLX 2018-20"), + CommunityCarDocs("Acura TLX 2022-23"), + GMSecurityCarDocs("Acura ZDX 2024"), + CommunityCarDocs("Honda Accord 2016-17", "Honda Sensing"), + CommunityCarDocs("Honda Accord Hybrid 2017"), + CommunityCarDocs("Honda Clarity 2018-21"), + GMSecurityCarDocs("Honda Prologue 2024-25"), + ], + ) + + EXTRA_HYUNDAI = ExtraPlatformConfig( + [ + CommunityCarDocs("Hyundai Palisade 2023-24", "Highway Driving Assist II"), + CommunityCarDocs("Kia Telluride 2023-24", "Highway Driving Assist II"), + ], + ) + + EXTRA_TOYOTA = ExtraPlatformConfig( + [ + ToyotaSecurityCarDocs("Subaru Solterra 2023-25"), + ToyotaSecurityCarDocs("Lexus NS 2022-25"), + ToyotaSecurityCarDocs("Toyota bZ4x 2023-25"), + ToyotaSecurityCarDocs("Toyota Camry 2025"), + ToyotaSecurityCarDocs("Toyota Corolla Cross 2022-25"), + ToyotaSecurityCarDocs("Toyota Highlander 2025"), + ToyotaSecurityCarDocs("Toyota RAV4 Prime 2024-25"), + ToyotaSecurityCarDocs("Toyota Sequoia 2023-25"), + ToyotaSecurityCarDocs("Toyota Sienna 2024-25"), + ToyotaSecurityCarDocs("Toyota Tundra 2022-25"), + ToyotaSecurityCarDocs("Toyota Venza 2021-25"), + ], + ) + + EXTRA_VOLKSWAGEN = ExtraPlatformConfig( + [ + FlexRayCarDocs("Audi A4 2016-24"), + FlexRayCarDocs("Audi A5 2016-24"), + FlexRayCarDocs("Audi Q5 2017-24"), + ], + ) diff --git a/artifacts/package_runtime/iqdbc/car/fingerprints.py b/artifacts/package_runtime/iqdbc/car/fingerprints.py new file mode 100644 index 000000000..507a0451a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/fingerprints.py @@ -0,0 +1,341 @@ +from iqdbc.car.interfaces import get_interface_attr +from iqdbc.car.body.values import CAR as BODY +from iqdbc.car.chrysler.values import CAR as CHRYSLER +from iqdbc.car.ford.values import CAR as FORD +from iqdbc.car.gm.values import CAR as GM +from iqdbc.car.honda.values import CAR as HONDA +from iqdbc.car.hyundai.values import CAR as HYUNDAI +from iqdbc.car.mazda.values import CAR as MAZDA +from iqdbc.car.mock.values import CAR as MOCK +from iqdbc.car.nissan.values import CAR as NISSAN +from iqdbc.car.subaru.values import CAR as SUBARU +from iqdbc.car.toyota.values import CAR as TOYOTA +from iqdbc.car.volkswagen.values import CAR as VW + +FW_VERSIONS = get_interface_attr('FW_VERSIONS', combine_brands=True, ignore_none=True) +_FINGERPRINTS = get_interface_attr('FINGERPRINTS', combine_brands=True, ignore_none=True) + +_DEBUG_ADDRESS = {1880: 8} # reserved for debug purposes + + +def is_valid_for_fingerprint(msg, car_fingerprint: dict[int, int]): + adr = msg.address + # ignore addresses that are more than 11 bits + return (adr in car_fingerprint and car_fingerprint[adr] == len(msg.dat)) or adr >= 0x800 + + +def eliminate_incompatible_cars(msg, candidate_cars): + """Removes cars that could not have sent msg. + + Inputs: + msg: A cereal/log CanData message from the car. + candidate_cars: A list of cars to consider. + + Returns: + A list containing the subset of candidate_cars that could have sent msg. + """ + compatible_cars = [] + + for car_name in candidate_cars: + car_fingerprints = _FINGERPRINTS[car_name] + + for fingerprint in car_fingerprints: + # add alien debug address + if is_valid_for_fingerprint(msg, fingerprint | _DEBUG_ADDRESS): + compatible_cars.append(car_name) + break + + return compatible_cars + + +def all_legacy_fingerprint_cars(): + """Returns a list of all known car strings, FPv1 only.""" + return list(_FINGERPRINTS.keys()) + + +# A dict that maps old platform strings to their latest representations +MIGRATION = { + "ACURA ILX 2016 ACURAWATCH PLUS": HONDA.ACURA_ILX, + "ACURA RDX 2018 ACURAWATCH PLUS": HONDA.ACURA_RDX, + "ACURA RDX 2020 TECH": HONDA.ACURA_RDX_3G, + "AUDI A3": VW.AUDI_A3_MK3, + "HONDA ACCORD 2018 HYBRID TOURING": HONDA.HONDA_ACCORD, + "HONDA ACCORD 1.5T 2018": HONDA.HONDA_ACCORD, + "HONDA ACCORD 2018 LX 1.5T": HONDA.HONDA_ACCORD, + "HONDA ACCORD 2018 SPORT 2T": HONDA.HONDA_ACCORD, + "HONDA ACCORD 2T 2018": HONDA.HONDA_ACCORD, + "HONDA ACCORD HYBRID 2018": HONDA.HONDA_ACCORD, + "HONDA CIVIC 2016 TOURING": HONDA.HONDA_CIVIC, + "HONDA CIVIC HATCHBACK 2017 SEDAN/COUPE 2019": HONDA.HONDA_CIVIC_BOSCH, + "HONDA CIVIC SEDAN 1.6 DIESEL": HONDA.HONDA_CIVIC_BOSCH_DIESEL, + "HONDA CR-V 2016 EXECUTIVE": HONDA.HONDA_CRV_EU, + "HONDA CR-V 2016 TOURING": HONDA.HONDA_CRV, + "HONDA CR-V 2017 EX": HONDA.HONDA_CRV_5G, + "HONDA CR-V 2019 HYBRID": HONDA.HONDA_CRV_HYBRID, + "HONDA FIT 2018 EX": HONDA.HONDA_FIT, + "HONDA HRV 2019 TOURING": HONDA.HONDA_HRV, + "HONDA INSIGHT 2019 TOURING": HONDA.HONDA_INSIGHT, + "HONDA ODYSSEY 2018 EX-L": HONDA.HONDA_ODYSSEY, + "HONDA PILOT 2017 TOURING": HONDA.HONDA_PILOT, + "HONDA PILOT 2019 ELITE": HONDA.HONDA_PILOT, + "HONDA PILOT 2019": HONDA.HONDA_PILOT, + "HONDA PASSPORT 2021": HONDA.HONDA_PILOT, + "HONDA RIDGELINE 2017 BLACK EDITION": HONDA.HONDA_RIDGELINE, + "HYUNDAI ELANTRA LIMITED ULTIMATE 2017": HYUNDAI.HYUNDAI_ELANTRA, + "HYUNDAI SANTA FE LIMITED 2019": HYUNDAI.HYUNDAI_SANTA_FE, + "HYUNDAI TUCSON DIESEL 2019": HYUNDAI.HYUNDAI_TUCSON, + "KIA OPTIMA 2016": HYUNDAI.KIA_OPTIMA_G4, + "KIA OPTIMA 2019": HYUNDAI.KIA_OPTIMA_G4_FL, + "KIA OPTIMA SX 2019 & 2016": HYUNDAI.KIA_OPTIMA_G4_FL, + "LEXUS CT 200H 2018": TOYOTA.LEXUS_CTH, + "LEXUS ES 300H 2018": TOYOTA.LEXUS_ES, + "LEXUS ES 300H 2019": TOYOTA.LEXUS_ES_TSS2, + "LEXUS IS300 2018": TOYOTA.LEXUS_IS, + "LEXUS NX300 2018": TOYOTA.LEXUS_NX, + "LEXUS NX300H 2018": TOYOTA.LEXUS_NX, + "LEXUS RX 350 2016": TOYOTA.LEXUS_RX, + "LEXUS RX350 2020": TOYOTA.LEXUS_RX_TSS2, + "LEXUS RX450 HYBRID 2020": TOYOTA.LEXUS_RX_TSS2, + "TOYOTA SIENNA XLE 2018": TOYOTA.TOYOTA_SIENNA, + "TOYOTA C-HR HYBRID 2018": TOYOTA.TOYOTA_CHR, + "TOYOTA COROLLA HYBRID TSS2 2019": TOYOTA.TOYOTA_COROLLA_TSS2, + "TOYOTA RAV4 HYBRID 2019": TOYOTA.TOYOTA_RAV4_TSS2, + "LEXUS ES HYBRID 2019": TOYOTA.LEXUS_ES_TSS2, + "LEXUS NX HYBRID 2018": TOYOTA.LEXUS_NX, + "LEXUS NX HYBRID 2020": TOYOTA.LEXUS_NX_TSS2, + "LEXUS RX HYBRID 2020": TOYOTA.LEXUS_RX_TSS2, + "TOYOTA ALPHARD HYBRID 2021": TOYOTA.TOYOTA_ALPHARD_TSS2, + "TOYOTA AVALON HYBRID 2019": TOYOTA.TOYOTA_AVALON_2019, + "TOYOTA AVALON HYBRID 2022": TOYOTA.TOYOTA_AVALON_TSS2, + "TOYOTA CAMRY HYBRID 2018": TOYOTA.TOYOTA_CAMRY, + "TOYOTA CAMRY HYBRID 2021": TOYOTA.TOYOTA_CAMRY_TSS2, + "TOYOTA C-HR HYBRID 2022": TOYOTA.TOYOTA_CHR_TSS2, + "TOYOTA HIGHLANDER HYBRID 2020": TOYOTA.TOYOTA_HIGHLANDER_TSS2, + "TOYOTA RAV4 HYBRID 2022": TOYOTA.TOYOTA_RAV4_TSS2_2022, + "TOYOTA RAV4 HYBRID 2023": TOYOTA.TOYOTA_RAV4_TSS2_2023, + "TOYOTA HIGHLANDER HYBRID 2018": TOYOTA.TOYOTA_HIGHLANDER, + "LEXUS ES HYBRID 2018": TOYOTA.LEXUS_ES, + "LEXUS RX HYBRID 2017": TOYOTA.LEXUS_RX, + "HYUNDAI TUCSON HYBRID 4TH GEN": HYUNDAI.HYUNDAI_TUCSON_4TH_GEN, + "KIA SPORTAGE HYBRID 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN, + "KIA SORENTO PLUG-IN HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, + "CADILLAC ESCALADE ESV PLATINUM 2019": GM.CADILLAC_ESCALADE_ESV_2019, + + # Removal of platform_str, see https://github.com/commaai/openpilot/pull/31868/ + "COMMA BODY": BODY.COMMA_BODY, + "CHRYSLER PACIFICA HYBRID 2017": CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID, + "CHRYSLER_PACIFICA_2017_HYBRID": CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID, + "CHRYSLER PACIFICA HYBRID 2018": CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID, + "CHRYSLER PACIFICA HYBRID 2019": CHRYSLER.CHRYSLER_PACIFICA_2019_HYBRID, + "CHRYSLER PACIFICA 2018": CHRYSLER.CHRYSLER_PACIFICA_2018, + "CHRYSLER PACIFICA 2020": CHRYSLER.CHRYSLER_PACIFICA_2020, + "DODGE DURANGO 2021": CHRYSLER.DODGE_DURANGO, + "JEEP GRAND CHEROKEE V6 2018": CHRYSLER.JEEP_GRAND_CHEROKEE, + "JEEP GRAND CHEROKEE 2019": CHRYSLER.JEEP_GRAND_CHEROKEE_2019, + "RAM 1500 5TH GEN": CHRYSLER.RAM_1500_5TH_GEN, + "RAM HD 5TH GEN": CHRYSLER.RAM_HD_5TH_GEN, + "FORD BRONCO SPORT 1ST GEN": FORD.FORD_BRONCO_SPORT_MK1, + "FORD ESCAPE 4TH GEN": FORD.FORD_ESCAPE_MK4, + "FORD EXPLORER 6TH GEN": FORD.FORD_EXPLORER_MK6, + "FORD F-150 14TH GEN": FORD.FORD_F_150_MK14, + "FORD F-150 LIGHTNING 1ST GEN": FORD.FORD_F_150_LIGHTNING_MK1, + "FORD FOCUS 4TH GEN": FORD.FORD_FOCUS_MK4, + "FORD MAVERICK 1ST GEN": FORD.FORD_MAVERICK_MK1, + "FORD MUSTANG MACH-E 1ST GEN": FORD.FORD_MUSTANG_MACH_E_MK1, + "HOLDEN ASTRA RS-V BK 2017": GM.HOLDEN_ASTRA, + "CHEVROLET VOLT PREMIER 2017": GM.CHEVROLET_VOLT, + "CADILLAC ATS Premium Performance 2018": GM.CADILLAC_ATS, + "CHEVROLET MALIBU PREMIER 2017": GM.CHEVROLET_MALIBU, + "GMC ACADIA DENALI 2018": GM.GMC_ACADIA, + "BUICK LACROSSE 2017": GM.BUICK_LACROSSE, + "BUICK REGAL ESSENCE 2018": GM.BUICK_REGAL, + "CADILLAC ESCALADE 2017": GM.CADILLAC_ESCALADE, + "CADILLAC ESCALADE ESV 2016": GM.CADILLAC_ESCALADE_ESV, + "CADILLAC ESCALADE ESV 2019": GM.CADILLAC_ESCALADE_ESV_2019, + "CHEVROLET BOLT EUV 2022": GM.CHEVROLET_BOLT_EUV, + "CHEVROLET SILVERADO 1500 2020": GM.CHEVROLET_SILVERADO, + "CHEVROLET EQUINOX 2019": GM.CHEVROLET_EQUINOX, + "CHEVROLET TRAILBLAZER 2021": GM.CHEVROLET_TRAILBLAZER, + "HONDA ACCORD 2018": HONDA.HONDA_ACCORD, + "HONDA CIVIC (BOSCH) 2019": HONDA.HONDA_CIVIC_BOSCH, + "HONDA CIVIC SEDAN 1.6 DIESEL 2019": HONDA.HONDA_CIVIC_BOSCH_DIESEL, + "HONDA CIVIC 2022": HONDA.HONDA_CIVIC_2022, + "HONDA CR-V 2017": HONDA.HONDA_CRV_5G, + "HONDA CR-V HYBRID 2019": HONDA.HONDA_CRV_HYBRID, + "HONDA HR-V 2023": HONDA.HONDA_HRV_3G, + "ACURA RDX 2020": HONDA.ACURA_RDX_3G, + "HONDA INSIGHT 2019": HONDA.HONDA_INSIGHT, + "HONDA E 2020": HONDA.HONDA_E, + "ACURA ILX 2016": HONDA.ACURA_ILX, + "HONDA CR-V 2016": HONDA.HONDA_CRV, + "HONDA CR-V EU 2016": HONDA.HONDA_CRV_EU, + "HONDA FIT 2018": HONDA.HONDA_FIT, + "HONDA FREED 2020": HONDA.HONDA_FREED, + "HONDA HRV 2019": HONDA.HONDA_HRV, + "HONDA ODYSSEY 2018": HONDA.HONDA_ODYSSEY, + "ACURA RDX 2018": HONDA.ACURA_RDX, + "HONDA PILOT 2017": HONDA.HONDA_PILOT, + "HONDA RIDGELINE 2017": HONDA.HONDA_RIDGELINE, + "HONDA CIVIC 2016": HONDA.HONDA_CIVIC, + "HYUNDAI AZERA 6TH GEN": HYUNDAI.HYUNDAI_AZERA_6TH_GEN, + "HYUNDAI AZERA HYBRID 6TH GEN": HYUNDAI.HYUNDAI_AZERA_HEV_6TH_GEN, + "HYUNDAI ELANTRA 2017": HYUNDAI.HYUNDAI_ELANTRA, + "HYUNDAI I30 N LINE 2019 & GT 2018 DCT": HYUNDAI.HYUNDAI_ELANTRA_GT_I30, + "HYUNDAI ELANTRA 2021": HYUNDAI.HYUNDAI_ELANTRA_2021, + "HYUNDAI ELANTRA HYBRID 2021": HYUNDAI.HYUNDAI_ELANTRA_HEV_2021, + "HYUNDAI GENESIS 2015-2016": HYUNDAI.HYUNDAI_GENESIS, + "HYUNDAI IONIQ HYBRID 2017-2019": HYUNDAI.HYUNDAI_IONIQ, + "HYUNDAI IONIQ HYBRID 2020-2022": HYUNDAI.HYUNDAI_IONIQ_HEV_2022, + "HYUNDAI IONIQ ELECTRIC LIMITED 2019": HYUNDAI.HYUNDAI_IONIQ_EV_LTD, + "HYUNDAI IONIQ ELECTRIC 2020": HYUNDAI.HYUNDAI_IONIQ_EV_2020, + "HYUNDAI IONIQ PLUG-IN HYBRID 2019": HYUNDAI.HYUNDAI_IONIQ_PHEV_2019, + "HYUNDAI IONIQ PHEV 2020": HYUNDAI.HYUNDAI_IONIQ_PHEV, + "HYUNDAI KONA 2020": HYUNDAI.HYUNDAI_KONA, + "HYUNDAI KONA ELECTRIC 2019": HYUNDAI.HYUNDAI_KONA_EV, + "HYUNDAI KONA ELECTRIC 2022": HYUNDAI.HYUNDAI_KONA_EV_2022, + "HYUNDAI KONA ELECTRIC 2ND GEN": HYUNDAI.HYUNDAI_KONA_EV_2ND_GEN, + "HYUNDAI KONA HYBRID 2020": HYUNDAI.HYUNDAI_KONA_HEV, + "HYUNDAI SANTA FE 2019": HYUNDAI.HYUNDAI_SANTA_FE, + "HYUNDAI SANTA FE 2022": HYUNDAI.HYUNDAI_SANTA_FE_2022, + "HYUNDAI SANTA FE HYBRID 2022": HYUNDAI.HYUNDAI_SANTA_FE_HEV_2022, + "HYUNDAI SANTA FE PlUG-IN HYBRID 2022": HYUNDAI.HYUNDAI_SANTA_FE_PHEV_2022, + "HYUNDAI SONATA 2020": HYUNDAI.HYUNDAI_SONATA, + "HYUNDAI SONATA 2019": HYUNDAI.HYUNDAI_SONATA_LF, + "HYUNDAI STARIA 4TH GEN": HYUNDAI.HYUNDAI_STARIA_4TH_GEN, + "HYUNDAI TUCSON 2019": HYUNDAI.HYUNDAI_TUCSON, + "HYUNDAI PALISADE 2020": HYUNDAI.HYUNDAI_PALISADE, + "HYUNDAI VELOSTER 2019": HYUNDAI.HYUNDAI_VELOSTER, + "HYUNDAI SONATA HYBRID 2021": HYUNDAI.HYUNDAI_SONATA_HYBRID, + "HYUNDAI IONIQ 5 2022": HYUNDAI.HYUNDAI_IONIQ_5, + "HYUNDAI IONIQ 6 2023": HYUNDAI.HYUNDAI_IONIQ_6, + "HYUNDAI TUCSON 4TH GEN": HYUNDAI.HYUNDAI_TUCSON_4TH_GEN, + "HYUNDAI SANTA CRUZ 1ST GEN": HYUNDAI.HYUNDAI_SANTA_CRUZ_1ST_GEN, + "HYUNDAI CUSTIN 1ST GEN": HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN, + "KIA FORTE E 2018 & GT 2021": HYUNDAI.KIA_FORTE, + "KIA K5 2021": HYUNDAI.KIA_K5_2021, + "KIA K5 HYBRID 2020": HYUNDAI.KIA_K5_HEV_2020, + "KIA K8 HYBRID 1ST GEN": HYUNDAI.KIA_K8_HEV_1ST_GEN, + "KIA NIRO EV 2020": HYUNDAI.KIA_NIRO_EV, + "KIA NIRO EV 2ND GEN": HYUNDAI.KIA_NIRO_EV_2ND_GEN, + "KIA NIRO HYBRID 2019": HYUNDAI.KIA_NIRO_PHEV, + "KIA NIRO PLUG-IN HYBRID 2022": HYUNDAI.KIA_NIRO_PHEV_2022, + "KIA NIRO HYBRID 2021": HYUNDAI.KIA_NIRO_HEV_2021, + "KIA NIRO HYBRID 2ND GEN": HYUNDAI.KIA_NIRO_HEV_2ND_GEN, + "KIA OPTIMA 4TH GEN": HYUNDAI.KIA_OPTIMA_G4, + "KIA OPTIMA 4TH GEN FACELIFT": HYUNDAI.KIA_OPTIMA_G4_FL, + "KIA OPTIMA HYBRID 2017 & SPORTS 2019": HYUNDAI.KIA_OPTIMA_H, + "KIA OPTIMA HYBRID 4TH GEN FACELIFT": HYUNDAI.KIA_OPTIMA_H_G4_FL, + "KIA SELTOS 2021": HYUNDAI.KIA_SELTOS, + "KIA SPORTAGE 5TH GEN": HYUNDAI.KIA_SPORTAGE_5TH_GEN, + "KIA SORENTO GT LINE 2018": HYUNDAI.KIA_SORENTO, + "KIA SORENTO 4TH GEN": HYUNDAI.KIA_SORENTO_4TH_GEN, + "KIA SORENTO HYBRID 4TH GEN": HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, + "KIA STINGER GT2 2018": HYUNDAI.KIA_STINGER, + "KIA STINGER 2022": HYUNDAI.KIA_STINGER_2022, + "KIA CEED INTRO ED 2019": HYUNDAI.KIA_CEED, + "KIA EV6 2022": HYUNDAI.KIA_EV6, + "KIA CARNIVAL 4TH GEN": HYUNDAI.KIA_CARNIVAL_4TH_GEN, + "GENESIS GV60 ELECTRIC 1ST GEN": HYUNDAI.GENESIS_GV60_EV_1ST_GEN, + "GENESIS G70 2018": HYUNDAI.GENESIS_G70, + "GENESIS G70 2020": HYUNDAI.GENESIS_G70_2020, + "GENESIS GV70 1ST GEN": HYUNDAI.GENESIS_GV70_1ST_GEN, + "GENESIS G80 2017": HYUNDAI.GENESIS_G80, + "GENESIS G90 2017": HYUNDAI.GENESIS_G90, + "GENESIS GV80 2023": HYUNDAI.GENESIS_GV80, + "MAZDA CX-5": MAZDA.MAZDA_CX5, + "MAZDA CX-9": MAZDA.MAZDA_CX9, + "MAZDA 3": MAZDA.MAZDA_3, + "MAZDA 6": MAZDA.MAZDA_6, + "MAZDA CX-9 2021": MAZDA.MAZDA_CX9_2021, + "MAZDA CX-5 2022": MAZDA.MAZDA_CX5_2022, + "NISSAN X-TRAIL 2017": NISSAN.NISSAN_XTRAIL, + "NISSAN LEAF 2018": NISSAN.NISSAN_LEAF, + "NISSAN LEAF 2018 Instrument Cluster": NISSAN.NISSAN_LEAF_IC, + "NISSAN ROGUE 2019": NISSAN.NISSAN_ROGUE, + "NISSAN ALTIMA 2020": NISSAN.NISSAN_ALTIMA, + "SUBARU ASCENT LIMITED 2019": SUBARU.SUBARU_ASCENT, + "SUBARU OUTBACK 6TH GEN": SUBARU.SUBARU_OUTBACK, + "SUBARU LEGACY 7TH GEN": SUBARU.SUBARU_LEGACY, + "SUBARU IMPREZA LIMITED 2019": SUBARU.SUBARU_IMPREZA, + "SUBARU IMPREZA SPORT 2020": SUBARU.SUBARU_IMPREZA_2020, + "SUBARU CROSSTREK HYBRID 2020": SUBARU.SUBARU_CROSSTREK_HYBRID, + "SUBARU FORESTER 2019": SUBARU.SUBARU_FORESTER, + "SUBARU FORESTER HYBRID 2020": SUBARU.SUBARU_FORESTER_HYBRID, + "SUBARU FORESTER 2017 - 2018": SUBARU.SUBARU_FORESTER_PREGLOBAL, + "SUBARU LEGACY 2015 - 2018": SUBARU.SUBARU_LEGACY_PREGLOBAL, + "SUBARU OUTBACK 2015 - 2017": SUBARU.SUBARU_OUTBACK_PREGLOBAL, + "SUBARU OUTBACK 2018 - 2019": SUBARU.SUBARU_OUTBACK_PREGLOBAL_2018, + "SUBARU FORESTER 2022": SUBARU.SUBARU_FORESTER_2022, + "SUBARU OUTBACK 7TH GEN": SUBARU.SUBARU_OUTBACK_2023, + "SUBARU ASCENT 2023": SUBARU.SUBARU_ASCENT_2023, + "TOYOTA ALPHARD 2020": TOYOTA.TOYOTA_ALPHARD_TSS2, + "TOYOTA AVALON 2016": TOYOTA.TOYOTA_AVALON, + "TOYOTA AVALON 2019": TOYOTA.TOYOTA_AVALON_2019, + "TOYOTA AVALON 2022": TOYOTA.TOYOTA_AVALON_TSS2, + "TOYOTA CAMRY 2018": TOYOTA.TOYOTA_CAMRY, + "TOYOTA CAMRY 2021": TOYOTA.TOYOTA_CAMRY_TSS2, + "TOYOTA C-HR 2018": TOYOTA.TOYOTA_CHR, + "TOYOTA C-HR 2021": TOYOTA.TOYOTA_CHR_TSS2, + "TOYOTA COROLLA 2017": TOYOTA.TOYOTA_COROLLA, + "TOYOTA COROLLA TSS2 2019": TOYOTA.TOYOTA_COROLLA_TSS2, + "TOYOTA HIGHLANDER 2017": TOYOTA.TOYOTA_HIGHLANDER, + "TOYOTA HIGHLANDER 2020": TOYOTA.TOYOTA_HIGHLANDER_TSS2, + "TOYOTA PRIUS 2017": TOYOTA.TOYOTA_PRIUS, + "TOYOTA PRIUS v 2017": TOYOTA.TOYOTA_PRIUS_V, + "TOYOTA PRIUS TSS2 2021": TOYOTA.TOYOTA_PRIUS_TSS2, + "TOYOTA RAV4 2017": TOYOTA.TOYOTA_RAV4, + "TOYOTA RAV4 HYBRID 2017": TOYOTA.TOYOTA_RAV4H, + "TOYOTA RAV4 2019": TOYOTA.TOYOTA_RAV4_TSS2, + "TOYOTA RAV4 2022": TOYOTA.TOYOTA_RAV4_TSS2_2022, + "TOYOTA RAV4 2023": TOYOTA.TOYOTA_RAV4_TSS2_2023, + "TOYOTA MIRAI 2021": TOYOTA.TOYOTA_MIRAI, + "TOYOTA SIENNA 2018": TOYOTA.TOYOTA_SIENNA, + "LEXUS CT HYBRID 2018": TOYOTA.LEXUS_CTH, + "LEXUS ES 2018": TOYOTA.LEXUS_ES, + "LEXUS ES 2019": TOYOTA.LEXUS_ES_TSS2, + "LEXUS IS 2018": TOYOTA.LEXUS_IS, + "LEXUS IS 2023": TOYOTA.LEXUS_IS_TSS2, + "LEXUS NX 2018": TOYOTA.LEXUS_NX, + "LEXUS NX 2020": TOYOTA.LEXUS_NX_TSS2, + "LEXUS LC 2024": TOYOTA.LEXUS_LC_TSS2, + "LEXUS RC 2020": TOYOTA.LEXUS_RC, + "LEXUS RX 2016": TOYOTA.LEXUS_RX, + "LEXUS RX 2020": TOYOTA.LEXUS_RX_TSS2, + "LEXUS GS F 2016": TOYOTA.LEXUS_GS_F, + "VOLKSWAGEN ARTEON 1ST GEN": VW.VOLKSWAGEN_ARTEON_MK1, + "VOLKSWAGEN ATLAS 1ST GEN": VW.VOLKSWAGEN_ATLAS_MK1, + "VOLKSWAGEN CADDY 3RD GEN": VW.VOLKSWAGEN_CADDY_MK3, + "VOLKSWAGEN CRAFTER 2ND GEN": VW.VOLKSWAGEN_CRAFTER_MK2, + "VOLKSWAGEN GOLF 7TH GEN": VW.VOLKSWAGEN_GOLF_MK7, + "VOLKSWAGEN JETTA 6TH GEN": VW.VOLKSWAGEN_JETTA_MK6, + "VOLKSWAGEN JETTA 7TH GEN": VW.VOLKSWAGEN_JETTA_MK7, + "VOLKSWAGEN PASSAT 7TH GEN": VW.VOLKSWAGEN_PASSAT_MK7, + "VOLKSWAGEN PASSAT 8TH GEN": VW.VOLKSWAGEN_PASSAT_MK8, + "VOLKSWAGEN PASSAT NMS": VW.VOLKSWAGEN_PASSAT_NMS, + "VOLKSWAGEN POLO 6TH GEN": VW.VOLKSWAGEN_POLO_MK6, + "VOLKSWAGEN SHARAN 2ND GEN": VW.VOLKSWAGEN_SHARAN_MK2, + "VOLKSWAGEN TAOS 1ST GEN": VW.VOLKSWAGEN_TAOS_MK1, + "VOLKSWAGEN T-CROSS 1ST GEN": VW.VOLKSWAGEN_TCROSS_MK1, + "VOLKSWAGEN TIGUAN 2ND GEN": VW.VOLKSWAGEN_TIGUAN_MK2, + "VOLKSWAGEN TOURAN 2ND GEN": VW.VOLKSWAGEN_TOURAN_MK2, + "VOLKSWAGEN TRANSPORTER T6.1": VW.VOLKSWAGEN_TRANSPORTER_T61, + "VOLKSWAGEN T-ROC 1ST GEN": VW.VOLKSWAGEN_TROC_MK1, + "AUDI A3 3RD GEN": VW.AUDI_A3_MK3, + "AUDI Q2 1ST GEN": VW.AUDI_Q2_MK1, + "AUDI Q3 2ND GEN": VW.AUDI_Q3_MK2, + "AUDI Q5 1st GEN": VW.AUDI_Q5_MK1, + "Porsche Macan 1st GEN": VW.PORSCHE_MACAN_MK1, + "SEAT ATECA 1ST GEN": VW.SEAT_ATECA_MK1, + "SEAT LEON 3RD GEN": VW.SEAT_ATECA_MK1, + "SEAT_LEON_MK3": VW.SEAT_ATECA_MK1, + "SKODA FABIA 4TH GEN": VW.SKODA_FABIA_MK4, + "SKODA KAMIQ 1ST GEN": VW.SKODA_KAMIQ_MK1, + "SKODA KAROQ 1ST GEN": VW.SKODA_KAROQ_MK1, + "SKODA KODIAQ 1ST GEN": VW.SKODA_KODIAQ_MK1, + "SKODA OCTAVIA 3RD GEN": VW.SKODA_OCTAVIA_MK3, + "SKODA SCALA 1ST GEN": VW.SKODA_KAMIQ_MK1, + "SKODA_SCALA_MK1": VW.SKODA_KAMIQ_MK1, + "SKODA SUPERB 3RD GEN": VW.SKODA_SUPERB_MK3, + + "mock": MOCK.MOCK, +} diff --git a/artifacts/package_runtime/iqdbc/car/ford/__init__.py b/artifacts/package_runtime/iqdbc/car/ford/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/ford/carcontroller.py b/artifacts/package_runtime/iqdbc/car/ford/carcontroller.py new file mode 100644 index 000000000..6b6f58d5e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/carcontroller.py @@ -0,0 +1,203 @@ +import math +import numpy as np +from iqdbc.can import CANPacker +from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, DT_CTRL, apply_hysteresis, structs +from iqdbc.car.lateral import ISO_LATERAL_ACCEL, apply_std_steer_angle_limits +from iqdbc.car.ford import fordcan +from iqdbc.car.ford.values import CarControllerParams, FordFlags, CAR +from iqdbc.car.interfaces import CarControllerBase, V_CRUISE_MAX + +LongCtrlState = structs.CarControl.Actuators.LongControlState +VisualAlert = structs.CarControl.HUDControl.VisualAlert + +# CAN FD limits: +# Limit to average banked road since safety doesn't have the roll +AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees, 6% superelevation. higher actual roll raises lateral acceleration +MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL - (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL) # ~2.4 m/s^2 + + +def anti_overshoot(apply_curvature, apply_curvature_last, v_ego): + diff = 0.1 + tau = 5 # 5s smooths over the overshoot + dt = DT_CTRL * CarControllerParams.STEER_STEP + alpha = 1 - np.exp(-dt / tau) + + lataccel = apply_curvature * (v_ego ** 2) + last_lataccel = apply_curvature_last * (v_ego ** 2) + last_lataccel = apply_hysteresis(lataccel, last_lataccel, diff) + last_lataccel = alpha * lataccel + (1 - alpha) * last_lataccel + + output_curvature = last_lataccel / (max(v_ego, 1) ** 2) + + return float(np.interp(v_ego, [5, 10], [apply_curvature, output_curvature])) + + +def apply_ford_curvature_limits(apply_curvature, apply_curvature_last, current_curvature, v_ego_raw, steering_angle, lat_active, CP): + # No blending at low speed due to lack of torque wind-up and inaccurate current curvature + if v_ego_raw > 9: + apply_curvature = np.clip(apply_curvature, current_curvature - CarControllerParams.CURVATURE_ERROR, + current_curvature + CarControllerParams.CURVATURE_ERROR) + + # Curvature rate limit after driver torque limit + apply_curvature = apply_std_steer_angle_limits(apply_curvature, apply_curvature_last, v_ego_raw, steering_angle, lat_active, CarControllerParams.ANGLE_LIMITS) + + # Ford Q4/CAN FD has more torque available compared to Q3/CAN so we limit it based on lateral acceleration. + # Safety is not aware of the road roll so we subtract a conservative amount at all times + if CP.flags & FordFlags.CANFD: + # Limit curvature to conservative max lateral acceleration + curvature_accel_limit = MAX_LATERAL_ACCEL / (max(v_ego_raw, 1) ** 2) + apply_curvature = float(np.clip(apply_curvature, -curvature_accel_limit, curvature_accel_limit)) + + return apply_curvature + + +def apply_creep_compensation(accel: float, v_ego: float) -> float: + creep_accel = np.interp(v_ego, [1., 3.], [0.6, 0.]) + creep_accel = np.interp(accel, [0., 0.2], [creep_accel, 0.]) + accel -= creep_accel + return float(accel) + + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ): + super().__init__(dbc_names, CP, CP_IQ) + self.packer = CANPacker(dbc_names[Bus.pt]) + self.CAN = fordcan.CanBus(CP) + + self.apply_curvature_last = 0 + self.anti_overshoot_curvature_last = 0 + self.accel = 0.0 + self.gas = 0.0 + self.brake_request = False + self.main_on_last = False + self.lkas_enabled_last = False + self.steer_alert_last = False + self.lead_distance_bars_last = None + self.distance_bar_frame = 0 + + def update(self, CC, CC_IQ, CS, now_nanos): + can_sends = [] + + actuators = CC.actuators + hud_control = CC.hudControl + + main_on = CS.out.cruiseState.available + steer_alert = hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw) + fcw_alert = hud_control.visualAlert == VisualAlert.fcw + + ### acc buttons ### + if CC.cruiseControl.cancel: + can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.camera, CS.buttons_stock_values, cancel=True)) + can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.main, CS.buttons_stock_values, cancel=True)) + elif CC.cruiseControl.resume and (self.frame % CarControllerParams.BUTTONS_STEP) == 0: + can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.camera, CS.buttons_stock_values, resume=True)) + can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.main, CS.buttons_stock_values, resume=True)) + # if stock lane centering isn't off, send a button press to toggle it off + # the stock system checks for steering pressed, and eventually disengages cruise control + elif CS.acc_tja_status_stock_values["Tja_D_Stat"] != 0 and (self.frame % CarControllerParams.ACC_UI_STEP) == 0: + can_sends.append(fordcan.create_button_msg(self.packer, self.CAN.camera, CS.buttons_stock_values, tja_toggle=True)) + + ### lateral control ### + # send steer msg at 20Hz + if (self.frame % CarControllerParams.STEER_STEP) == 0: + # Bronco and some other cars consistently overshoot curv requests + # Apply some deadzone + smoothing convergence to avoid oscillations + if self.CP.carFingerprint in (CAR.FORD_BRONCO_SPORT_MK1, CAR.FORD_F_150_MK14): + self.anti_overshoot_curvature_last = anti_overshoot(actuators.curvature, self.anti_overshoot_curvature_last, CS.out.vEgoRaw) + apply_curvature = self.anti_overshoot_curvature_last + else: + apply_curvature = actuators.curvature + + # apply rate limits, curvature error limit, and clip to signal range + current_curvature = -CS.out.yawRate / max(CS.out.vEgoRaw, 0.1) + + self.apply_curvature_last = apply_ford_curvature_limits(apply_curvature, self.apply_curvature_last, current_curvature, + CS.out.vEgoRaw, 0., CC.latActive, self.CP) + + if self.CP.flags & FordFlags.CANFD: + # TODO: extended mode + # Ford uses four individual signals to dictate how to drive to the car. Curvature alone (limited to 0.02m/s^2) + # can actuate the steering for a large portion of any lateral movements. However, in order to get further control on + # steer actuation, the other three signals are necessary. Ford controls vehicles differently than most other makes. + # A detailed explanation on ford control can be found here: + # https://www.f150gen14.com/forum/threads/introducing-bluepilot-a-ford-specific-fork-for-comma3x-openpilot.24241/#post-457706 + mode = 1 if CC.latActive else 0 + counter = (self.frame // CarControllerParams.STEER_STEP) % 0x10 + can_sends.append(fordcan.create_lat_ctl2_msg(self.packer, self.CAN, mode, 0., 0., -self.apply_curvature_last, 0., counter)) + else: + can_sends.append(fordcan.create_lat_ctl_msg(self.packer, self.CAN, CC.latActive, 0., 0., -self.apply_curvature_last, 0.)) + + # send lka msg at 33Hz + if (self.frame % CarControllerParams.LKA_STEP) == 0: + can_sends.append(fordcan.create_lka_msg(self.packer, self.CAN)) + + ### longitudinal control ### + # send acc msg at 50Hz + if self.CP.openpilotLongitudinalControl and (self.frame % CarControllerParams.ACC_CONTROL_STEP) == 0: + accel = actuators.accel + gas = accel + + if CC.longActive: + # Compensate for engine creep at low speed. + # Either the ABS does not account for engine creep, or the correction is very slow + # TODO: verify this applies to EV/hybrid + accel = apply_creep_compensation(accel, CS.out.vEgo) + + # The stock system has been seen rate limiting the brake accel to 5 m/s^3, + # however even 3.5 m/s^3 causes some overshoot with a step response. + accel = max(accel, self.accel - (3.5 * CarControllerParams.ACC_CONTROL_STEP * DT_CTRL)) + + accel = float(np.clip(accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX)) + gas = float(np.clip(gas, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX)) + + # Both gas and accel are in m/s^2, accel is used solely for braking + if not CC.longActive or gas < CarControllerParams.MIN_GAS: + gas = CarControllerParams.INACTIVE_GAS + + # PCM applies pitch compensation to gas/accel, but we need to compensate for the brake/pre-charge bits + accel_due_to_pitch = 0.0 + if len(CC.orientationNED) == 3: + accel_due_to_pitch = math.sin(CC.orientationNED[1]) * ACCELERATION_DUE_TO_GRAVITY + + accel_pitch_compensated = accel + accel_due_to_pitch + if accel_pitch_compensated > 0.3 or not CC.longActive: + self.brake_request = False + elif accel_pitch_compensated < 0.0: + self.brake_request = True + + stopping = CC.actuators.longControlState == LongCtrlState.stopping + # TODO: look into using the actuators packet to send the desired speed + can_sends.append(fordcan.create_acc_msg(self.packer, self.CAN, CC.longActive, gas, accel, stopping, self.brake_request, v_ego_kph=V_CRUISE_MAX)) + + self.accel = accel + self.gas = gas + + ### ui ### + send_ui = (self.main_on_last != main_on) or (self.lkas_enabled_last != CC.latActive) or (self.steer_alert_last != steer_alert) + # send lkas ui msg at 1Hz or if ui state changes + if (self.frame % CarControllerParams.LKAS_UI_STEP) == 0 or send_ui: + can_sends.append(fordcan.create_lkas_ui_msg(self.packer, self.CAN, main_on, CC.latActive, steer_alert, hud_control, CS.lkas_status_stock_values)) + + # send acc ui msg at 5Hz or if ui state changes + if hud_control.leadDistanceBars != self.lead_distance_bars_last: + send_ui = True + self.distance_bar_frame = self.frame + + if (self.frame % CarControllerParams.ACC_UI_STEP) == 0 or send_ui: + show_distance_bars = self.frame - self.distance_bar_frame < 400 + can_sends.append(fordcan.create_acc_ui_msg(self.packer, self.CAN, self.CP, main_on, CC.latActive, + fcw_alert, CS.out.cruiseState.standstill, show_distance_bars, + hud_control, CS.acc_tja_status_stock_values)) + + self.main_on_last = main_on + self.lkas_enabled_last = CC.latActive + self.steer_alert_last = steer_alert + self.lead_distance_bars_last = hud_control.leadDistanceBars + + new_actuators = actuators.as_builder() + new_actuators.curvature = self.apply_curvature_last + new_actuators.accel = self.accel + new_actuators.gas = self.gas + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/ford/carstate.py b/artifacts/package_runtime/iqdbc/car/ford/carstate.py new file mode 100644 index 000000000..7080d2e9e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/carstate.py @@ -0,0 +1,123 @@ +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, create_button_events, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.ford.fordcan import CanBus +from iqdbc.car.ford.values import DBC, CarControllerParams, FordFlags +from iqdbc.car.interfaces import CarStateBase + +ButtonType = structs.CarState.ButtonEvent.Type +GearShifter = structs.CarState.GearShifter +TransmissionType = structs.CarParams.TransmissionType + + +class CarState(CarStateBase): + def __init__(self, CP, CP_IQ): + CarStateBase.__init__(self, CP, CP_IQ) + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + if CP.transmissionType == TransmissionType.automatic: + self.shifter_values = can_define.dv["PowertrainData_10"]["TrnRng_D_Rq"] + + self.distance_button = 0 + self.lc_button = 0 + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + + ret = structs.CarState() + ret_iq = structs.IQCarState() + + # Occasionally on startup, the ABS module recalibrates the steering pinion offset, so we need to block engagement + # The vehicle usually recovers out of this state within a minute of normal driving + ret.vehicleSensorsInvalid = cp.vl["SteeringPinion_Data"]["StePinCompAnEst_D_Qf"] != 3 + + # car speed + ret.vEgoRaw = cp.vl["BrakeSysFeatures"]["Veh_V_ActlBrk"] * CV.KPH_TO_MS + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.yawRate = cp.vl["Yaw_Data_FD1"]["VehYaw_W_Actl"] + ret.standstill = cp.vl["DesiredTorqBrk"]["VehStop_D_Stat"] == 1 + + # gas pedal + ret.gasPressed = cp.vl["EngVehicleSpThrottle"]["ApedPos_Pc_ActlArb"] / 100. > 1e-6 + + # brake pedal + ret.brake = cp.vl["BrakeSnData_4"]["BrkTot_Tq_Actl"] / 32756. # torque in Nm + ret.brakePressed = cp.vl["EngBrakeData"]["BpedDrvAppl_D_Actl"] == 2 + ret.parkingBrake = cp.vl["DesiredTorqBrk"]["PrkBrkStatus"] in (1, 2) + + # steering wheel + ret.steeringAngleDeg = cp.vl["SteeringPinion_Data"]["StePinComp_An_Est"] + ret.steeringTorque = cp.vl["EPAS_INFO"]["SteeringColumnTorque"] + ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE, 5) + ret.steerFaultTemporary = cp.vl["EPAS_INFO"]["EPAS_Failure"] == 1 + ret.steerFaultPermanent = cp.vl["EPAS_INFO"]["EPAS_Failure"] in (2, 3) + ret.espDisabled = cp.vl["Cluster_Info1_FD1"]["DrvSlipCtlMde_D_Rq"] != 0 # 0 is default mode + + if self.CP.flags & FordFlags.CANFD: + # this signal is always 0 on non-CAN FD cars + ret.steerFaultTemporary |= cp.vl["Lane_Assist_Data3_FD1"]["LatCtlSte_D_Stat"] not in (1, 2, 3) + + # cruise state + is_metric = cp.vl["INSTRUMENT_PANEL"]["METRIC_UNITS"] == 1 if not self.CP.flags & FordFlags.CANFD else False + ret.cruiseState.speed = cp.vl["EngBrakeData"]["Veh_V_DsplyCcSet"] * (CV.KPH_TO_MS if is_metric else CV.MPH_TO_MS) + ret.cruiseState.enabled = cp.vl["EngBrakeData"]["CcStat_D_Actl"] in (4, 5) + ret.cruiseState.available = cp.vl["EngBrakeData"]["CcStat_D_Actl"] in (3, 4, 5) + ret.cruiseState.nonAdaptive = cp.vl["Cluster_Info1_FD1"]["AccEnbl_B_RqDrv"] == 0 + ret.cruiseState.standstill = cp.vl["EngBrakeData"]["AccStopMde_D_Rq"] == 3 + ret.accFaulted = cp.vl["EngBrakeData"]["CcStat_D_Actl"] in (1, 2) + if not self.CP.openpilotLongitudinalControl: + ret.accFaulted = ret.accFaulted or cp_cam.vl["ACCDATA"]["CmbbDeny_B_Actl"] == 1 + + # gear + if self.CP.transmissionType == TransmissionType.automatic: + gear = self.shifter_values.get(cp.vl["PowertrainData_10"]["TrnRng_D_Rq"]) + ret.gearShifter = self.parse_gear_shifter(gear) + elif self.CP.transmissionType == TransmissionType.manual: + if bool(cp.vl["BCM_Lamp_Stat_FD1"]["RvrseLghtOn_B_Stat"]): + ret.gearShifter = GearShifter.reverse + else: + ret.gearShifter = GearShifter.drive + + # safety + ret.stockFcw = bool(cp_cam.vl["ACCDATA_3"]["FcwVisblWarn_B_Rq"]) + ret.stockAeb = bool(cp_cam.vl["ACCDATA_2"]["CmbbBrkDecel_B_Rq"]) + + # button presses + ret.leftBlinker = cp.vl["Steering_Data_FD1"]["TurnLghtSwtch_D_Stat"] == 1 + ret.rightBlinker = cp.vl["Steering_Data_FD1"]["TurnLghtSwtch_D_Stat"] == 2 + # TODO: block this going to the camera otherwise it will enable stock TJA + ret.genericToggle = bool(cp.vl["Steering_Data_FD1"]["TjaButtnOnOffPress"]) + prev_distance_button = self.distance_button + prev_lc_button = self.lc_button + self.distance_button = cp.vl["Steering_Data_FD1"]["AccButtnGapTogglePress"] + self.lc_button = bool(cp.vl["Steering_Data_FD1"]["TjaButtnOnOffPress"]) + + # lock info + ret.doorOpen = any([cp.vl["BodyInfo_3_FD1"]["DrStatDrv_B_Actl"], cp.vl["BodyInfo_3_FD1"]["DrStatPsngr_B_Actl"], + cp.vl["BodyInfo_3_FD1"]["DrStatRl_B_Actl"], cp.vl["BodyInfo_3_FD1"]["DrStatRr_B_Actl"]]) + ret.seatbeltUnlatched = cp.vl["RCMStatusMessage2_FD1"]["FirstRowBuckleDriver"] == 2 + + # blindspot sensors + if self.CP.enableBsm: + cp_bsm = cp_cam if self.CP.flags & FordFlags.CANFD else cp + ret.leftBlindspot = cp_bsm.vl["Side_Detect_L_Stat"]["SodDetctLeft_D_Stat"] != 0 + ret.rightBlindspot = cp_bsm.vl["Side_Detect_R_Stat"]["SodDetctRight_D_Stat"] != 0 + + # Stock steering buttons so that we can passthru blinkers etc. + self.buttons_stock_values = cp.vl["Steering_Data_FD1"] + # Stock values from IPMA so that we can retain some stock functionality + self.acc_tja_status_stock_values = cp_cam.vl["ACCDATA_3"] + self.lkas_status_stock_values = cp_cam.vl["IPMA_Data"] + + ret.buttonEvents = [ + *create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}), + *create_button_events(self.lc_button, prev_lc_button, {1: ButtonType.lkas}), + ] + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).main), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).camera), + } diff --git a/artifacts/package_runtime/iqdbc/car/ford/fingerprints.py b/artifacts/package_runtime/iqdbc/car/ford/fingerprints.py new file mode 100644 index 000000000..422fe1217 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/fingerprints.py @@ -0,0 +1,223 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.ford.values import CAR + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.FORD_BRONCO_SPORT_MK1: { + (Ecu.eps, 0x730, None): [ + b'LX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'LX6C-2D053-RD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-2D053-RE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-2D053-RF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'M1PT-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'M1PT-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_ESCAPE_MK4: { + (Ecu.eps, 0x730, None): [ + b'LX6C-14D003-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'LX6C-2D053-NS\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-2D053-NT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-2D053-NY\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-2D053-SA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-2D053-SD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'LJ6T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LJ6T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LV4T-14F397-GG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_ESCAPE_MK4_5: { + (Ecu.eps, 0x730, None): [ + b'PZ11-14D003-EA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'PZ1C-2D053-EJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'PJ6T-14H102-ABL\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_EXPLORER_MK6: { + (Ecu.eps, 0x730, None): [ + b'L1MC-14D003-AJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'M1MC-14D003-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'M1MC-14D003-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'P1MC-14D003-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'L1MC-2D053-AJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-2D053-BA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-2D053-BB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-2D053-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-2D053-BF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-2D053-BJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-2D053-KB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'LB5T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LB5T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LB5T-14F397-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LC5T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LC5T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_EXPEDITION_MK4: { + (Ecu.eps, 0x730, None): [ + b'NL14-14D003-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'RL14-2D053-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'ML3T-14H102-ABT\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_F_150_MK14: { + (Ecu.eps, 0x730, None): [ + b'ML3V-14D003-BC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'ML3V-14D003-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'NL34-2D053-CA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PL34-2D053-CA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PL34-2D053-CC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PL3V-2D053-BA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PL3V-2D053-BB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'ML3T-14D049-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'ML3T-14H102-ABR\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'ML3T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'ML3T-14H102-ABT\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PJ6T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'RJ6T-14H102-ACJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'RJ6T-14H102-BBC\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_F_150_LIGHTNING_MK1: { + (Ecu.abs, 0x760, None): [ + b'PL38-2D053-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'RL38-2D053-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'ML3T-14H102-ABT\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'RJ6T-14H102-ACJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'RJ6T-14H102-BBC\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x730, None): [ + b'RL38-14D003-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_MUSTANG_MACH_E_MK1: { + (Ecu.eps, 0x730, None): [ + b'LJ9C-14D003-AM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LJ9C-14D003-CC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LJ9C-14D003-FA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LJ9C-14D003-GA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LJ9C-14D003-HA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'LK9C-2D053-CK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LK9C-2D053-CN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'ML3T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'RJ6T-14H102-BAE\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_FOCUS_MK4: { + (Ecu.eps, 0x730, None): [ + b'JX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'JX61-2D053-CJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'JX7T-14D049-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'JX7T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_MAVERICK_MK1: { + (Ecu.eps, 0x730, None): [ + b'NZ6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'NZ6C-2D053-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6C-2D053-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6C-2D053-AG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PZ6C-2D053-ED\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PZ6C-2D053-EE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PZ6C-2D053-EF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'NZ6T-14D049-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'NZ6T-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.FORD_RANGER_MK2: { + (Ecu.eps, 0x730, None): [ + b'NB3C-14D003-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NL14-14D003-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'RB3C-14D003-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'PB3C-2D053-ZD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PB3C-2D053-ZG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PB3C-2D053-ZJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'RJ6T-14H102-BBB\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/ford/fordcan.py b/artifacts/package_runtime/iqdbc/car/ford/fordcan.py new file mode 100644 index 000000000..c5ec73c0c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/fordcan.py @@ -0,0 +1,342 @@ +from iqdbc.car import CanBusBase, structs + +HUDControl = structs.CarControl.HUDControl + + +class CanBus(CanBusBase): + def __init__(self, CP=None, fingerprint=None) -> None: + super().__init__(CP, fingerprint) + + @property + def main(self) -> int: + return self.offset + + @property + def radar(self) -> int: + return self.offset + 1 + + @property + def camera(self) -> int: + return self.offset + 2 + + +def calculate_lat_ctl2_checksum(mode: int, counter: int, dat: bytearray) -> int: + curvature = (dat[2] << 3) | ((dat[3]) >> 5) + curvature_rate = (dat[6] << 3) | ((dat[7]) >> 5) + path_angle = ((dat[3] & 0x1F) << 6) | ((dat[4]) >> 2) + path_offset = ((dat[4] & 0x3) << 8) | dat[5] + + checksum = mode + counter + for sig_val in (curvature, curvature_rate, path_angle, path_offset): + checksum += sig_val + (sig_val >> 8) + + return 0xFF - (checksum & 0xFF) + + +def create_lka_msg(packer, CAN: CanBus): + """ + Creates an empty CAN message for the Ford LKA Command. + + This command can apply "Lane Keeping Aid" maneuvers, which are subject to the PSCM lockout. + + Frequency is 33Hz. + """ + + return packer.make_can_msg("Lane_Assist_Data1", CAN.main, {}) + + +def create_lat_ctl_msg(packer, CAN: CanBus, lat_active: bool, path_offset: float, path_angle: float, curvature: float, + curvature_rate: float): + """ + Creates a CAN message for the Ford TJA/LCA Command. + + This command can apply "Lane Centering" maneuvers: continuous lane centering for traffic jam assist and highway + driving. It is not subject to the PSCM lockout. + + Ford lane centering command uses a third order polynomial to describe the road centerline. The polynomial is defined + by the following coefficients: + c0: lateral offset between the vehicle and the centerline (positive is right) + c1: heading angle between the vehicle and the centerline (positive is right) + c2: curvature of the centerline (positive is left) + c3: rate of change of curvature of the centerline + As the PSCM combines this information with other sensor data, such as the vehicle's yaw rate and speed, the steering + angle cannot be easily controlled. + + The PSCM should be configured to accept TJA/LCA commands before these commands will be processed. This can be done + using tools such as Forscan. + + Frequency is 20Hz. + """ + + values = { + "LatCtlRng_L_Max": 0, # Unknown [0|126] meter + "HandsOffCnfm_B_Rq": 0, # Unknown: 0=Inactive, 1=Active [0|1] + "LatCtl_D_Rq": 1 if lat_active else 0, # Mode: 0=None, 1=ContinuousPathFollowing, 2=InterventionLeft, + # 3=InterventionRight, 4-7=NotUsed [0|7] + "LatCtlRampType_D_Rq": 0, # Ramp speed: 0=Slow, 1=Medium, 2=Fast, 3=Immediate [0|3] + # Makes no difference with curvature control + "LatCtlPrecision_D_Rq": 1, # Precision: 0=Comfortable, 1=Precise, 2/3=NotUsed [0|3] + # The stock system always uses comfortable + "LatCtlPathOffst_L_Actl": path_offset, # Path offset [-5.12|5.11] meter + "LatCtlPath_An_Actl": path_angle, # Path angle [-0.5|0.5235] radians + "LatCtlCurv_NoRate_Actl": curvature_rate, # Curvature rate [-0.001024|0.00102375] 1/meter^2 + "LatCtlCurv_No_Actl": curvature, # Curvature [-0.02|0.02094] 1/meter + } + return packer.make_can_msg("LateralMotionControl", CAN.main, values) + + +def create_lat_ctl2_msg(packer, CAN: CanBus, mode: int, path_offset: float, path_angle: float, curvature: float, + curvature_rate: float, counter: int): + """ + Create a CAN message for the new Ford Lane Centering command. + + This message is used on the CAN FD platform and replaces the old LateralMotionControl message. It is similar but has + additional signals for a counter and checksum. + + Frequency is 20Hz. + """ + + values = { + "LatCtl_D2_Rq": mode, # Mode: 0=None, 1=PathFollowingLimitedMode, 2=PathFollowingExtendedMode, + # 3=SafeRampOut, 4-7=NotUsed [0|7] + "LatCtlRampType_D_Rq": 0, # 0=Slow, 1=Medium, 2=Fast, 3=Immediate [0|3] + "LatCtlPrecision_D_Rq": 1, # 0=Comfortable, 1=Precise, 2/3=NotUsed [0|3] + "LatCtlPathOffst_L_Actl": path_offset, # [-5.12|5.11] meter + "LatCtlPath_An_Actl": path_angle, # [-0.5|0.5235] radians + "LatCtlCurv_No_Actl": curvature, # [-0.02|0.02094] 1/meter + "LatCtlCrv_NoRate2_Actl": curvature_rate, # [-0.001024|0.001023] 1/meter^2 + "HandsOffCnfm_B_Rq": 0, # 0=Inactive, 1=Active [0|1] + "LatCtlPath_No_Cnt": counter, # [0|15] + "LatCtlPath_No_Cs": 0, # [0|255] + } + + # calculate checksum + dat = packer.make_can_msg("LateralMotionControl2", 0, values)[1] + values["LatCtlPath_No_Cs"] = calculate_lat_ctl2_checksum(mode, counter, dat) + + return packer.make_can_msg("LateralMotionControl2", CAN.main, values) + + +def create_acc_msg(packer, CAN: CanBus, long_active: bool, gas: float, accel: float, stopping: bool, brake_request, v_ego_kph: float): + """ + Creates a CAN message for the Ford ACC Command. + + This command can be used to enable ACC, to set the ACC gas/brake/decel values + and to disable ACC. + + Frequency is 50Hz. + """ + values = { + "AccBrkTot_A_Rq": accel, # Brake total accel request: [-20|11.9449] m/s^2 + "Cmbb_B_Enbl": 1 if long_active else 0, # Enabled: 0=No, 1=Yes + "AccPrpl_A_Rq": gas, # Acceleration request: [-5|5.23] m/s^2 + # No observed acceleration seen from this signal alone. During stock system operation, it appears to + # be the raw acceleration request (AccPrpl_A_Rq when positive, AccBrkTot_A_Rq when negative) + "AccPrpl_A_Pred": -5.0, # Acceleration request: [-5|5.23] m/s^2 + "AccResumEnbl_B_Rq": 1 if long_active else 0, + # No observed acceleration seen from this signal alone + "AccVeh_V_Trg": v_ego_kph, # Target speed: [0|255] km/h + # TODO: we may be able to improve braking response by utilizing pre-charging better + # When setting these two bits without AccBrkTot_A_Rq, an initial jerk is observed and car may be able to brake temporarily with AccPrpl_A_Rq + "AccBrkPrchg_B_Rq": 1 if brake_request else 0, # Pre-charge brake request: 0=No, 1=Yes + "AccBrkDecel_B_Rq": 1 if brake_request else 0, # Deceleration request: 0=Inactive, 1=Active + "AccStopStat_B_Rq": 1 if stopping else 0, + } + return packer.make_can_msg("ACCDATA", CAN.main, values) + + +def create_acc_ui_msg(packer, CAN: CanBus, CP, main_on: bool, enabled: bool, fcw_alert: bool, standstill: bool, + show_distance_bars: bool, hud_control, stock_values: dict): + """ + Creates a CAN message for the Ford IPC adaptive cruise, forward collision warning and traffic jam + assist status. + + Stock functionality is maintained by passing through unmodified signals. + + Frequency is 5Hz. + """ + + # Tja_D_Stat + if enabled: + if hud_control.leftLaneDepart: + status = 3 # ActiveInterventionLeft + elif hud_control.rightLaneDepart: + status = 4 # ActiveInterventionRight + else: + status = 2 # Active + elif main_on: + if hud_control.leftLaneDepart: + status = 5 # ActiveWarningLeft + elif hud_control.rightLaneDepart: + status = 6 # ActiveWarningRight + else: + status = 1 # Standby + else: + status = 0 # Off + + values = {s: stock_values[s] for s in [ + "HaDsply_No_Cs", + "HaDsply_No_Cnt", + "AccStopStat_D_Dsply", # ACC stopped status message + "AccTrgDist2_D_Dsply", # ACC target distance + "AccStopRes_B_Dsply", + "TjaWarn_D_Rq", # TJA warning + "TjaMsgTxt_D_Dsply", # TJA text + "IaccLamp_D_Rq", # iACC status icon + "AccMsgTxt_D2_Rq", # ACC text + "FcwDeny_B_Dsply", # FCW disabled + "FcwMemStat_B_Actl", # FCW enabled setting + "AccTGap_B_Dsply", # ACC time gap display setting + "CadsAlignIncplt_B_Actl", + "AccFllwMde_B_Dsply", # ACC follow mode display setting + "CadsRadrBlck_B_Actl", + "CmbbPostEvnt_B_Dsply", # AEB event status + "AccStopMde_B_Dsply", # ACC stop mode display setting + "FcwMemSens_D_Actl", # FCW sensitivity setting + "FcwMsgTxt_D_Rq", # FCW text + "AccWarn_D_Dsply", # ACC warning + "FcwVisblWarn_B_Rq", # FCW visible alert + "FcwAudioWarn_B_Rq", # FCW audio alert + "AccTGap_D_Dsply", # ACC time gap + "AccMemEnbl_B_RqDrv", # ACC adaptive/normal setting + "FdaMem_B_Stat", # FDA enabled setting + ]} + + values.update({ + "Tja_D_Stat": status, # TJA status + }) + + if CP.openpilotLongitudinalControl: + values.update({ + "AccStopStat_D_Dsply": 2 if standstill else 0, # Stopping status text + "AccMsgTxt_D2_Rq": 0, # ACC text + "AccTGap_B_Dsply": 1 if show_distance_bars else 0, # Show time gap control UI + "AccFllwMde_B_Dsply": 1 if hud_control.leadVisible else 0, # Lead indicator + "AccStopMde_B_Dsply": 1 if standstill else 0, + "AccWarn_D_Dsply": 0, # ACC warning + "AccTGap_D_Dsply": hud_control.leadDistanceBars, # Time gap + }) + + # Forwards FCW alert from IPMA + if fcw_alert: + values["FcwVisblWarn_B_Rq"] = 1 # FCW visible alert + + return packer.make_can_msg("ACCDATA_3", CAN.main, values) + + +def create_lkas_ui_msg(packer, CAN: CanBus, main_on: bool, enabled: bool, steer_alert: bool, hud_control, + stock_values: dict): + """ + Creates a CAN message for the Ford IPC IPMA/LKAS status. + + Show the LKAS status with the "driver assist" lines in the IPC. + + Stock functionality is maintained by passing through unmodified signals. + + Frequency is 1Hz. + """ + + # LaActvStats_D_Dsply + # R Intvn Warn Supprs Avail No + # L + # Intvn 24 19 14 9 4 + # Warn 23 18 13 8 3 + # Supprs 22 17 12 7 2 + # Avail 21 16 11 6 1 + # No 20 15 10 5 0 + # + # TODO: test suppress state + if enabled: + lines = 0 # NoLeft_NoRight + if hud_control.leftLaneDepart: + lines += 4 + elif hud_control.leftLaneVisible: + lines += 1 + if hud_control.rightLaneDepart: + lines += 20 + elif hud_control.rightLaneVisible: + lines += 5 + elif main_on: + lines = 0 + else: + if hud_control.leftLaneDepart: + lines = 3 # WarnLeft_NoRight + elif hud_control.rightLaneDepart: + lines = 15 # NoLeft_WarnRight + else: + lines = 30 # LA_Off + + hands_on_wheel_dsply = 1 if steer_alert else 0 + + values = {s: stock_values[s] for s in [ + "FeatConfigIpmaActl", + "FeatNoIpmaActl", + "PersIndexIpma_D_Actl", + "AhbcRampingV_D_Rq", # AHB ramping + "LaDenyStats_B_Dsply", # LKAS error + "CamraDefog_B_Req", # Windshield heater? + "CamraStats_D_Dsply", # Camera status + "DasAlrtLvl_D_Dsply", # DAS alert level + "DasStats_D_Dsply", # DAS status + "DasWarn_D_Dsply", # DAS warning + "AhbHiBeam_D_Rq", # AHB status + "Passthru_63", + "Passthru_48", + ]} + + values.update({ + "LaActvStats_D_Dsply": lines, # LKAS status (lines) [0|31] + "LaHandsOff_D_Dsply": hands_on_wheel_dsply, # 0=HandsOn, 1=Level1 (w/o chime), 2=Level2 (w/ chime), 3=Suppressed + }) + return packer.make_can_msg("IPMA_Data", CAN.main, values) + + +def create_button_msg(packer, bus: int, stock_values: dict, cancel=False, resume=False, tja_toggle=False): + """ + Creates a CAN message for the Ford SCCM buttons/switches. + + Includes cruise control buttons, turn lights and more. + + Frequency is 10Hz. + """ + + values = {s: stock_values[s] for s in [ + "HeadLghtHiFlash_D_Stat", # SCCM Passthrough the remaining buttons + "TurnLghtSwtch_D_Stat", # SCCM Turn signal switch + "WiprFront_D_Stat", + "LghtAmb_D_Sns", + "AccButtnGapDecPress", + "AccButtnGapIncPress", + "AslButtnOnOffCnclPress", + "AslButtnOnOffPress", + "LaSwtchPos_D_Stat", + "CcAslButtnCnclResPress", + "CcAslButtnDeny_B_Actl", + "CcAslButtnIndxDecPress", + "CcAslButtnIndxIncPress", + "CcAslButtnOffCnclPress", + "CcAslButtnOnOffCncl", + "CcAslButtnOnPress", + "CcAslButtnResDecPress", + "CcAslButtnResIncPress", + "CcAslButtnSetDecPress", + "CcAslButtnSetIncPress", + "CcAslButtnSetPress", + "CcButtnOffPress", + "CcButtnOnOffCnclPress", + "CcButtnOnOffPress", + "CcButtnOnPress", + "HeadLghtHiFlash_D_Actl", + "HeadLghtHiOn_B_StatAhb", + "AhbStat_B_Dsply", + "AccButtnGapTogglePress", + "WiprFrontSwtch_D_Stat", + "HeadLghtHiCtrl_D_RqAhb", + ]} + + values.update({ + "CcAslButtnCnclPress": 1 if cancel else 0, # CC cancel button + "CcAsllButtnResPress": 1 if resume else 0, # CC resume button + "TjaButtnOnOffPress": 1 if tja_toggle else 0, # LCA/TJA toggle button + }) + return packer.make_can_msg("Steering_Data_FD1", bus, values) diff --git a/artifacts/package_runtime/iqdbc/car/ford/interface.py b/artifacts/package_runtime/iqdbc/car/ford/interface.py new file mode 100644 index 000000000..468e7fa42 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/interface.py @@ -0,0 +1,100 @@ +import numpy as np +from iqdbc.car import Bus, get_safety_config, structs +from iqdbc.car.carlog import carlog +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.ford.carcontroller import CarController +from iqdbc.car.ford.carstate import CarState +from iqdbc.car.ford.fordcan import CanBus +from iqdbc.car.ford.radar_interface import RadarInterface +from iqdbc.car.ford.values import CarControllerParams, DBC, Ecu, FordFlags, RADAR, FordSafetyFlags +from iqdbc.car.interfaces import CarInterfaceBase + +TransmissionType = structs.CarParams.TransmissionType + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + DRIVABLE_GEARS = (structs.CarState.GearShifter.low, structs.CarState.GearShifter.manumatic) + + @staticmethod + def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed): + # PCM doesn't allow acceleration near cruise_speed, + # so limit limits of pid to prevent windup + ACCEL_MAX_VALS = [CarControllerParams.ACCEL_MAX, 0.2] + ACCEL_MAX_BP = [cruise_speed - 2., cruise_speed - .4] + return CarControllerParams.ACCEL_MIN, np.interp(current_speed, ACCEL_MAX_BP, ACCEL_MAX_VALS) + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "ford" + + ret.radarUnavailable = Bus.radar not in DBC[candidate] + ret.steerControlType = structs.CarParams.SteerControlType.angle + ret.steerActuatorDelay = 0.2 + ret.steerLimitTimer = 1.0 + ret.steerAtStandstill = True + + ret.longitudinalTuning.kiBP = [0.] + ret.longitudinalTuning.kiV = [0.5] + + if not ret.radarUnavailable and DBC[candidate][Bus.radar] == RADAR.DELPHI_MRR: + # average of 33.3 Hz radar timestep / 4 scan modes = 60 ms + # MRR_Header_Timestamps->CAN_DET_TIME_SINCE_MEAS reports 61.3 ms + ret.radarDelay = 0.06 + + CAN = CanBus(fingerprint=fingerprint) + cfgs = [get_safety_config(structs.CarParams.SafetyModel.ford)] + if CAN.main >= 4: + cfgs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput)) + ret.safetyConfigs = cfgs + + ret.alphaLongitudinalAvailable = ret.radarUnavailable + if alpha_long or not ret.radarUnavailable: + ret.safetyConfigs[-1].safetyParam |= FordSafetyFlags.LONG_CONTROL.value + ret.openpilotLongitudinalControl = True + + if ret.flags & FordFlags.CANFD: + ret.safetyConfigs[-1].safetyParam |= FordSafetyFlags.CANFD.value + + # TRON (SecOC) platforms are not supported + # LateralMotionControl2, ACCDATA are 16 bytes on these platforms + if len(fingerprint[CAN.camera]): + if fingerprint[CAN.camera].get(0x3d6) != 8 or fingerprint[CAN.camera].get(0x186) != 8: + carlog.error('dashcamOnly: SecOC is unsupported') + ret.dashcamOnly = True + else: + # Lock out if the car does not have needed lateral and longitudinal control APIs. + # Note that we also check CAN for adaptive cruise, but no known signal for LCA exists + pscm_config = next((fw for fw in car_fw if fw.ecu == Ecu.eps and b'\x22\xDE\x01' in fw.request), None) + if pscm_config: + if len(pscm_config.fwVersion) != 24: + carlog.error('dashcamOnly: Invalid EPS FW version') + ret.dashcamOnly = True + else: + config_tja = pscm_config.fwVersion[7] # Traffic Jam Assist + config_lca = pscm_config.fwVersion[8] # Lane Centering Assist + if config_tja != 0xFF or config_lca != 0xFF: + carlog.error('dashcamOnly: Car lacks required lateral control APIs') + ret.dashcamOnly = True + + # Auto Transmission: 0x732 ECU or Gear_Shift_by_Wire_FD1 + found_ecus = [fw.ecu for fw in car_fw] + if Ecu.shiftByWire in found_ecus or 0x5A in fingerprint[CAN.main] or docs: + ret.transmissionType = TransmissionType.automatic + else: + ret.transmissionType = TransmissionType.manual + ret.minEnableSpeed = 20.0 * CV.MPH_TO_MS + + # BSM: Side_Detect_L_Stat, Side_Detect_R_Stat + # TODO: detect bsm in car_fw? + ret.enableBsm = 0x3A6 in fingerprint[CAN.main] and 0x3A7 in fingerprint[CAN.main] + + # LCA can steer down to zero + ret.minSteerSpeed = 0. + + ret.autoResumeSng = ret.minEnableSpeed == -1. + ret.centerToFront = ret.wheelbase * 0.44 + return ret diff --git a/artifacts/package_runtime/iqdbc/car/ford/radar_interface.py b/artifacts/package_runtime/iqdbc/car/ford/radar_interface.py new file mode 100644 index 000000000..ece346460 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/radar_interface.py @@ -0,0 +1,272 @@ +import numpy as np +from typing import cast +from collections import defaultdict +from math import cos, sin +from dataclasses import dataclass +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.ford.fordcan import CanBus +from iqdbc.car.ford.values import DBC, RADAR +from iqdbc.car.interfaces import RadarInterfaceBase + +DELPHI_ESR_RADAR_MSGS = list(range(0x500, 0x540)) + +DELPHI_MRR_RADAR_START_ADDR = 0x120 +DELPHI_MRR_RADAR_HEADER_ADDR = 0x174 # MRR_Header_SensorCoverage +DELPHI_MRR_RADAR_MSG_COUNT = 64 + +DELPHI_MRR_RADAR_RANGE_COVERAGE = {0: 42, 1: 164, 2: 45, 3: 175} # scan index to detection range (m) +DELPHI_MRR_MIN_LONG_RANGE_DIST = 30 # meters +DELPHI_MRR_CLUSTER_THRESHOLD = 5 # meters, lateral distance and relative velocity are weighted + + +@dataclass +class Cluster: + dRel: float = 0.0 + yRel: float = 0.0 + vRel: float = 0.0 + trackId: int = 0 + + +def cluster_points(pts_l: list[list[float]], pts2_l: list[list[float]], max_dist: float) -> list[int]: + """ + Clusters a collection of points based on another collection of points. This is useful for correlating clusters through time. + Points in pts2 not close enough to any point in pts are assigned -1. + Args: + pts_l: List of points to base the new clusters on + pts2_l: List of points to cluster using pts + max_dist: Max distance from cluster center to candidate point + + Returns: + List of cluster indices for pts2 that correspond to pts + """ + + if not len(pts2_l): + return [] + + if not len(pts_l): + return [-1] * len(pts2_l) + + max_dist_sq = max_dist ** 2 + pts = np.array(pts_l) + pts2 = np.array(pts2_l) + + # Compute squared norms + pts_norm_sq = np.sum(pts ** 2, axis=1) + pts2_norm_sq = np.sum(pts2 ** 2, axis=1) + + # Compute squared Euclidean distances using the identity + # dist_sq[i, j] = ||pts2[i]||^2 + ||pts[j]||^2 - 2 * pts2[i] . pts[j] + dist_sq = pts2_norm_sq[:, np.newaxis] + pts_norm_sq[np.newaxis, :] - 2 * np.dot(pts2, pts.T) + dist_sq = np.maximum(dist_sq, 0.0) + + # Find the closest cluster for each point and assign its index + closest_clusters = np.argmin(dist_sq, axis=1) + closest_dist_sq = dist_sq[np.arange(len(pts2)), closest_clusters] + cluster_idxs = np.where(closest_dist_sq < max_dist_sq, closest_clusters, -1) + + return cast(list[int], cluster_idxs.tolist()) + + +def _create_delphi_esr_radar_can_parser(CP) -> CANParser: + msg_n = len(DELPHI_ESR_RADAR_MSGS) + messages = list(zip(DELPHI_ESR_RADAR_MSGS, [20] * msg_n, strict=True)) + + return CANParser(RADAR.DELPHI_ESR, messages, CanBus(CP).radar) + + +def _create_delphi_mrr_radar_can_parser(CP) -> CANParser: + messages = [ + ("MRR_Header_InformationDetections", 33), + ("MRR_Header_SensorCoverage", 33), + ] + + for i in range(1, DELPHI_MRR_RADAR_MSG_COUNT + 1): + msg = f"MRR_Detection_{i:03d}" + messages += [(msg, 33)] + + return CANParser(RADAR.DELPHI_MRR, messages, CanBus(CP).radar) + + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + + self.points: list[list[float]] = [] + self.clusters: list[Cluster] = [] + + self.updated_messages = set() + self.track_id = 0 + self.radar = DBC[CP.carFingerprint].get(Bus.radar) + self.scan_index_invalid_cnt = 0 + self.radar_unavailable_cnt = 0 + self.prev_headerScanIndex = 0 + if CP.radarUnavailable: + self.rcp = None + elif self.radar == RADAR.DELPHI_ESR: + self.rcp = _create_delphi_esr_radar_can_parser(CP) + self.trigger_msg = DELPHI_ESR_RADAR_MSGS[-1] + self.valid_cnt = {key: 0 for key in DELPHI_ESR_RADAR_MSGS} + elif self.radar == RADAR.DELPHI_MRR: + self.rcp = _create_delphi_mrr_radar_can_parser(CP) + self.trigger_msg = DELPHI_MRR_RADAR_HEADER_ADDR + else: + raise ValueError(f"Unsupported radar: {self.radar}") + + def update(self, can_strings): + if self.rcp is None: + return super().update(None) + + vls = self.rcp.update(can_strings) + self.updated_messages.update(vls) + + if self.trigger_msg not in self.updated_messages: + return None + self.updated_messages.clear() + + ret = structs.RadarData() + if not self.rcp.can_valid: + ret.errors.canError = True + + if self.radar == RADAR.DELPHI_ESR: + self._update_delphi_esr() + elif self.radar == RADAR.DELPHI_MRR: + _update = self._update_delphi_mrr(ret) + if not _update: + return None + + ret.points = list(self.pts.values()) + return ret + + def _update_delphi_esr(self): + for ii in sorted(self.updated_messages): + cpt = self.rcp.vl[ii] + + if cpt['X_Rel'] > 0.00001: + self.valid_cnt[ii] = 0 # reset counter + + if cpt['X_Rel'] > 0.00001: + self.valid_cnt[ii] += 1 + else: + self.valid_cnt[ii] = max(self.valid_cnt[ii] - 1, 0) + #print ii, self.valid_cnt[ii], cpt['VALID'], cpt['X_Rel'], cpt['Angle'] + + # radar point only valid if there have been enough valid measurements + if self.valid_cnt[ii] > 0: + if ii not in self.pts: + self.pts[ii] = structs.RadarData.RadarPoint() + self.pts[ii].trackId = self.track_id + self.track_id += 1 + self.pts[ii].dRel = cpt['X_Rel'] # from front of car + self.pts[ii].yRel = cpt['X_Rel'] * cpt['Angle'] * CV.DEG_TO_RAD # in car frame's y axis, left is positive + self.pts[ii].vRel = cpt['V_Rel'] + self.pts[ii].aRel = float('nan') + self.pts[ii].yvRel = float('nan') + self.pts[ii].measured = True + else: + if ii in self.pts: + del self.pts[ii] + + def _update_delphi_mrr(self, ret: structs.RadarData): + headerScanIndex = int(self.rcp.vl["MRR_Header_InformationDetections"]['CAN_SCAN_INDEX']) & 0b11 + + # In reverse, the radar continually sends the last messages. Mark this as invalid + if (self.prev_headerScanIndex + 1) % 4 != headerScanIndex: + self.radar_unavailable_cnt += 1 + else: + self.radar_unavailable_cnt = 0 + self.prev_headerScanIndex = headerScanIndex + + if self.radar_unavailable_cnt >= 5: + self.pts.clear() + self.points.clear() + self.clusters.clear() + ret.errors.radarUnavailableTemporary = True + return True + + # Use points with Doppler coverage of +-60 m/s, reduces similar points + if headerScanIndex not in (2, 3): + return False + + if DELPHI_MRR_RADAR_RANGE_COVERAGE[headerScanIndex] != int(self.rcp.vl["MRR_Header_SensorCoverage"]["CAN_RANGE_COVERAGE"]): + self.scan_index_invalid_cnt += 1 + else: + self.scan_index_invalid_cnt = 0 + + # Rarely MRR_Header_InformationDetections can fail to send a message. The scan index is skipped in this case + if self.scan_index_invalid_cnt >= 5: + ret.errors.wrongConfig = True + + for ii in range(1, DELPHI_MRR_RADAR_MSG_COUNT + 1): + msg = self.rcp.vl[f"MRR_Detection_{ii:03d}"] + + # SCAN_INDEX rotates through 0..3 on each message for different measurement modes + # Indexes 0 and 2 have a max range of ~40m, 1 and 3 are ~170m (MRR_Header_SensorCoverage->CAN_RANGE_COVERAGE) + # Indexes 0 and 1 have a Doppler coverage of +-71 m/s, 2 and 3 have +-60 m/s + scanIndex = msg[f"CAN_SCAN_INDEX_2LSB_{ii:02d}"] + + # Throw out old measurements. Very unlikely to happen, but is proper behavior + if scanIndex != headerScanIndex: + continue + + valid = bool(msg[f"CAN_DET_VALID_LEVEL_{ii:02d}"]) + + # Long range measurement mode is more sensitive and can detect the road surface + dist = msg[f"CAN_DET_RANGE_{ii:02d}"] # m [0|255.984] + if scanIndex in (1, 3) and dist < DELPHI_MRR_MIN_LONG_RANGE_DIST: + valid = False + + if valid: + azimuth = msg[f"CAN_DET_AZIMUTH_{ii:02d}"] # rad [-3.1416|3.13964] + distRate = msg[f"CAN_DET_RANGE_RATE_{ii:02d}"] # m/s [-128|127.984] + dRel = cos(azimuth) * dist # m from front of car + yRel = -sin(azimuth) * dist # in car frame's y axis, left is positive + + self.points.append([dRel, yRel * 2, distRate * 2]) + + # Cluster and publish using stored points once we've cycled through all 4 scan modes + if headerScanIndex != 3: + return False + + # Cluster points from this cycle against the centroids from the previous cycle + prev_keys = [[p.dRel, p.yRel * 2, p.vRel * 2] for p in self.clusters] + labels = cluster_points(prev_keys, self.points, DELPHI_MRR_CLUSTER_THRESHOLD) + + points_by_track_id = defaultdict(list) + for idx, label in enumerate(labels): + if label != -1: + points_by_track_id[self.clusters[label].trackId].append(self.points[idx]) + else: + points_by_track_id[self.track_id].append(self.points[idx]) + self.track_id += 1 + + self.clusters = [] + for idx, (track_id, pts) in enumerate(points_by_track_id.items()): + dRel = [p[0] for p in pts] + min_dRel = min(dRel) + dRel = sum(dRel) / len(dRel) + + yRel = [p[1] for p in pts] + yRel = sum(yRel) / len(yRel) / 2 + + vRel = [p[2] for p in pts] + vRel = sum(vRel) / len(vRel) / 2 + + # FIXME: creating capnp RadarPoint and accessing attributes are both expensive, so we store a dataclass and reuse the RadarPoint + self.clusters.append(Cluster(dRel=dRel, yRel=yRel, vRel=vRel, trackId=track_id)) + + if idx not in self.pts: + self.pts[idx] = structs.RadarData.RadarPoint(measured=True, aRel=float('nan'), yvRel=float('nan')) + + self.pts[idx].dRel = min_dRel + self.pts[idx].yRel = yRel + self.pts[idx].vRel = vRel + self.pts[idx].trackId = track_id + + for idx in range(len(points_by_track_id), len(self.pts)): + del self.pts[idx] + + self.points = [] + + return True diff --git a/artifacts/package_runtime/iqdbc/car/ford/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/ford/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/ford/tests/print_platform_codes.py b/artifacts/package_runtime/iqdbc/car/ford/tests/print_platform_codes.py new file mode 100644 index 000000000..65595fe42 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/tests/print_platform_codes.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +from collections import defaultdict + +from iqdbc.car.structs import CarParams +from iqdbc.car.ford.values import get_platform_codes +from iqdbc.car.ford.fingerprints import FW_VERSIONS + +Ecu = CarParams.Ecu + +if __name__ == "__main__": + cars_for_code: defaultdict = defaultdict(lambda: defaultdict(set)) + + for car_model, ecus in FW_VERSIONS.items(): + print(car_model) + for ecu in sorted(ecus): + platform_codes = get_platform_codes(ecus[ecu]) + for code in platform_codes: + cars_for_code[ecu][code].add(car_model) + + print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):') + print(f' Codes: {sorted(platform_codes)}') + print() + + print('\nCar models vs. platform codes:') + for ecu, codes in cars_for_code.items(): + print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):') + for code, cars in codes.items(): + print(f' {code!r}: {sorted(map(str, cars))}') diff --git a/artifacts/package_runtime/iqdbc/car/ford/tests/test_ford.py b/artifacts/package_runtime/iqdbc/car/ford/tests/test_ford.py new file mode 100644 index 000000000..0235c86c8 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/tests/test_ford.py @@ -0,0 +1,142 @@ +import random +from collections.abc import Iterable + +from hypothesis import settings, given, strategies as st +from parameterized import parameterized + +from iqdbc.car.structs import CarParams +from iqdbc.car.fw_versions import build_fw_dict +from iqdbc.car.ford.values import CAR, FW_QUERY_CONFIG, FW_PATTERN, get_platform_codes +from iqdbc.car.ford.fingerprints import FW_VERSIONS + +Ecu = CarParams.Ecu + + +ECU_ADDRESSES = { + Ecu.eps: 0x730, # Power Steering Control Module (PSCM) + Ecu.abs: 0x760, # Anti-Lock Brake System (ABS) + Ecu.fwdRadar: 0x764, # Cruise Control Module (CCM) + Ecu.fwdCamera: 0x706, # Image Processing Module A (IPMA) + Ecu.engine: 0x7E0, # Powertrain Control Module (PCM) + Ecu.shiftByWire: 0x732, # Gear Shift Module (GSM) + Ecu.debug: 0x7D0, # Accessory Protocol Interface Module (APIM) +} + + +ECU_PART_NUMBER = { + Ecu.eps: [ + b"14D003", + ], + Ecu.abs: [ + b"2D053", + ], + Ecu.fwdRadar: [ + b"14D049", + ], + Ecu.fwdCamera: [ + b"14F397", # Ford Q3 + b"14H102", # Ford Q4 + ], +} + + +class TestFordFW: + def test_fw_query_config(self): + for (ecu, addr, subaddr) in FW_QUERY_CONFIG.extra_ecus: + assert ecu in ECU_ADDRESSES, "Unknown ECU" + assert addr == ECU_ADDRESSES[ecu], "ECU address mismatch" + assert subaddr is None, "Unexpected ECU subaddress" + + @parameterized.expand(FW_VERSIONS.items()) + def test_fw_versions(self, car_model: str, fw_versions: dict[tuple[int, int, int | None], Iterable[bytes]]): + for (ecu, addr, subaddr), fws in fw_versions.items(): + assert ecu in ECU_PART_NUMBER, "Unexpected ECU" + assert addr == ECU_ADDRESSES[ecu], "ECU address mismatch" + assert subaddr is None, "Unexpected ECU subaddress" + + for fw in fws: + assert len(fw) == 24, "Expected ECU response to be 24 bytes" + + match = FW_PATTERN.match(fw) + assert match is not None, f"Unable to parse FW: {fw!r}" + if match: + part_number = match.group("part_number") + assert part_number in ECU_PART_NUMBER[ecu], f"Unexpected part number for {fw!r}" + + codes = get_platform_codes([fw]) + assert 1 == len(codes), f"Unable to parse FW: {fw!r}" + + @settings(max_examples=100) + @given(data=st.data()) + def test_platform_codes_fuzzy_fw(self, data): + """Ensure function doesn't raise an exception""" + fw_strategy = st.lists(st.binary()) + fws = data.draw(fw_strategy) + get_platform_codes(fws) + + def test_platform_codes_spot_check(self): + # Asserts basic platform code parsing behavior for a few cases + results = get_platform_codes([ + b"JX6A-14C204-BPL\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"NZ6T-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"LB5A-14C204-EAC\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ]) + assert results == {(b"X6A", b"J"), (b"Z6T", b"N"), (b"J6T", b"P"), (b"B5A", b"L")} + + def test_fuzzy_match(self): + for platform, fw_by_addr in FW_VERSIONS.items(): + # Ensure there's no overlaps in platform codes + for _ in range(20): + car_fw = [] + for ecu, fw_versions in fw_by_addr.items(): + ecu_name, addr, sub_addr = ecu + fw = random.choice(fw_versions) + car_fw.append(CarParams.CarFw(ecu=ecu_name, fwVersion=fw, address=addr, + subAddress=0 if sub_addr is None else sub_addr)) + + CP = CarParams(carFw=car_fw) + matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, FW_VERSIONS) + assert matches == {platform} + + def test_match_fw_fuzzy(self): + offline_fw = { + (Ecu.eps, 0x730, None): [ + b"L1MC-14D003-AJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"L1MC-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ], + (Ecu.abs, 0x760, None): [ + b"L1MC-2D053-BA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"L1MC-2D053-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ], + (Ecu.fwdRadar, 0x764, None): [ + b"LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"LB5T-14D049-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ], + # We consider all model year hints for ECU, even with different platform codes + (Ecu.fwdCamera, 0x706, None): [ + b"LB5T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"NC5T-14F397-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ], + } + expected_fingerprint = CAR.FORD_EXPLORER_MK6 + + # ensure that we fuzzy match on all non-exact FW with changed revisions + live_fw = { + (0x730, None): {b"L1MC-14D003-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, + (0x760, None): {b"L1MC-2D053-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, + (0x764, None): {b"LB5T-14D049-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, + (0x706, None): {b"LB5T-14F397-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, + } + candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw}) + assert candidates == {expected_fingerprint} + + # model year hint in between the range should match + live_fw[(0x706, None)] = {b"MB5T-14F397-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"} + candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw,}) + assert candidates == {expected_fingerprint} + + # unseen model year hint should not match + live_fw[(0x760, None)] = {b"M1MC-2D053-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"} + candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw}) + assert len(candidates) == 0, "Should not match new model year hint" diff --git a/artifacts/package_runtime/iqdbc/car/ford/values.py b/artifacts/package_runtime/iqdbc/car/ford/values.py new file mode 100644 index 000000000..7e608c5d3 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/ford/values.py @@ -0,0 +1,315 @@ +import copy +import re +from dataclasses import dataclass, field, replace +from enum import Enum, IntFlag + +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds +from iqdbc.car.lateral import AngleSteeringLimits +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column +from iqdbc.car.fw_query_definitions import FwQueryConfig, LiveFwVersions, OfflineFwVersions, Request, StdQueries, p16 + +Ecu = CarParams.Ecu + + +class CarControllerParams: + STEER_STEP = 5 # LateralMotionControl, 20Hz + LKA_STEP = 3 # Lane_Assist_Data1, 33Hz + ACC_CONTROL_STEP = 2 # ACCDATA, 50Hz + LKAS_UI_STEP = 100 # IPMA_Data, 1Hz + ACC_UI_STEP = 20 # ACCDATA_3, 5Hz + BUTTONS_STEP = 5 # Steering_Data_FD1, 10Hz, but send twice as fast + + STEER_DRIVER_ALLOWANCE = 1.0 # Driver intervention threshold, Nm + + ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( + 0.02, # Max curvature for steering command, m^-1 + # Curvature rate limits + # Max curvature is limited by the EPS to an equivalent of ~2.0 m/s^2 at all speeds, + # however max curvature rate linearly decreases as speed increases: + # ~0.009 m^-1/sec at 7 m/s, ~0.002 m^-1/sec at 35 m/s + # Limit to ~2 m/s^3 up, ~3.3 m/s^3 down at 75 mph and match EPS limit at low speed + ([5, 25], [0.00045, 0.0001]), + ([5, 25], [0.00045, 0.00015]) + ) + CURVATURE_ERROR = 0.002 # ~6 degrees at 10 m/s, ~10 degrees at 35 m/s + + ACCEL_MAX = 2.0 # m/s^2 max acceleration + ACCEL_MIN = -3.5 # m/s^2 max deceleration + MIN_GAS = -0.5 + INACTIVE_GAS = -5.0 + + def __init__(self, CP): + pass + + +class FordSafetyFlags(IntFlag): + LONG_CONTROL = 1 + CANFD = 2 + + +class FordFlags(IntFlag): + # Static flags + CANFD = 1 + + +class RADAR: + DELPHI_ESR = 'ford_fusion_2018_adas' + DELPHI_MRR = 'FORD_CADS' + + +class Footnote(Enum): + FOCUS = CarFootnote( + "Refers only to the Focus Mk4 (C519) available in Europe/China/Taiwan/Australasia, not the Focus Mk3 (C346) in " + + "North and South America/Southeast Asia.", + Column.MODEL, + ) + + +@dataclass +class FordCarDocs(CarDocs): + package: str = "Co-Pilot360 Assist+" + hybrid: bool = False + plug_in_hybrid: bool = False + + def init_make(self, CP: CarParams): + harness = CarHarness.ford_q4 if CP.flags & FordFlags.CANFD else CarHarness.ford_q3 + self.car_parts = CarParts.common([harness]) + + if harness == CarHarness.ford_q4: + self.setup_video = "https://www.youtube.com/watch?v=uUGkH6C_EQU" + + if CP.carFingerprint in (CAR.FORD_F_150_MK14, CAR.FORD_F_150_LIGHTNING_MK1, CAR.FORD_EXPEDITION_MK4): + self.setup_video = "https://www.youtube.com/watch?v=MewJc9LYp9M" + + +@dataclass +class FordPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: { + Bus.pt: 'ford_lincoln_base_pt', + Bus.radar: RADAR.DELPHI_MRR, + }) + + def init(self): + for car_docs in list(self.car_docs): + if car_docs.hybrid: + name = f"{car_docs.make} {car_docs.model} Hybrid {car_docs.years}" + self.car_docs.append(replace(copy.deepcopy(car_docs), name=name)) + if car_docs.plug_in_hybrid: + name = f"{car_docs.make} {car_docs.model} Plug-in Hybrid {car_docs.years}" + self.car_docs.append(replace(copy.deepcopy(car_docs), name=name)) + + +@dataclass +class FordCANFDPlatformConfig(FordPlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: { + Bus.pt: 'ford_lincoln_base_pt', + }) + + def init(self): + super().init() + self.flags |= FordFlags.CANFD + + +@dataclass +class FordF150LightningPlatform(FordCANFDPlatformConfig): + def init(self): + super().init() + + # Don't show in docs until this issue is resolved. See https://github.com/commaai/openpilot/issues/30302 + self.car_docs = [] + + +class CAR(Platforms): + FORD_BRONCO_SPORT_MK1 = FordPlatformConfig( + [FordCarDocs("Ford Bronco Sport 2021-24")], + CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), + ) + FORD_ESCAPE_MK4 = FordPlatformConfig( + [ + FordCarDocs("Ford Escape 2020-22", hybrid=True, plug_in_hybrid=True), + FordCarDocs("Ford Kuga 2020-23", "Adaptive Cruise Control with Lane Centering", hybrid=True, plug_in_hybrid=True), + ], + CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), + ) + FORD_ESCAPE_MK4_5 = FordCANFDPlatformConfig( + [ + FordCarDocs("Ford Escape 2023-24", hybrid=True, plug_in_hybrid=True, setup_video="https://www.youtube.com/watch?v=M6uXf4b2SHM"), + FordCarDocs("Ford Kuga Hybrid 2024", "All"), + FordCarDocs("Ford Kuga Plug-in Hybrid 2024", "All"), + ], + CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), + ) + FORD_EXPLORER_MK6 = FordPlatformConfig( + [ + FordCarDocs("Ford Explorer 2020-24", hybrid=True), # Hybrid: Limited and Platinum only + FordCarDocs("Lincoln Aviator 2020-24", "Co-Pilot360 Plus", plug_in_hybrid=True), # Hybrid: Grand Touring only + ], + CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), + ) + FORD_EXPEDITION_MK4 = FordCANFDPlatformConfig( + [FordCarDocs("Ford Expedition 2022-24", "Co-Pilot360 Assist 2.0", hybrid=False)], + CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), + ) + FORD_F_150_MK14 = FordCANFDPlatformConfig( + [FordCarDocs("Ford F-150 2021-23", "Co-Pilot360 Assist 2.0", hybrid=True)], + CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), + ) + FORD_F_150_LIGHTNING_MK1 = FordF150LightningPlatform( + [FordCarDocs("Ford F-150 Lightning 2022-23", "Co-Pilot360 Assist 2.0")], + CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), + ) + FORD_FOCUS_MK4 = FordPlatformConfig( + [FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS], hybrid=True)], # mHEV only + CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), + ) + FORD_MAVERICK_MK1 = FordPlatformConfig( + [ + FordCarDocs("Ford Maverick 2022", "LARIAT Luxury", hybrid=True), + FordCarDocs("Ford Maverick 2023-24", "Co-Pilot360 Assist", hybrid=True), + ], + CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), + ) + FORD_MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( + [FordCarDocs("Ford Mustang Mach-E 2021-24", "All", setup_video="https://www.youtube.com/watch?v=AR4_eTF3b_A")], + CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio + ) + FORD_RANGER_MK2 = FordCANFDPlatformConfig( + [FordCarDocs("Ford Ranger 2024", "Adaptive Cruise Control with Lane Centering", setup_video="https://www.youtube.com/watch?v=2oJlXCKYOy0")], + CarSpecs(mass=2000, wheelbase=3.27, steerRatio=17.0), + ) + + +# FW response contains a combined software and part number +# A-Z except no I, O or W +# e.g. NZ6A-14C204-AAA +# 1222-333333-444 +# 1 = Model year hint (approximates model year/generation) +# 2 = Platform hint +# 3 = Part number +# 4 = Software version +FW_ALPHABET = b'A-HJ-NP-VX-Z' +FW_PATTERN = re.compile(b'^(?P[' + FW_ALPHABET + b'])' + + b'(?P[0-9' + FW_ALPHABET + b']{3})-' + + b'(?P[0-9' + FW_ALPHABET + b']{5,6})-' + + b'(?P[' + FW_ALPHABET + b']{2,})\x00*$') + + +def get_platform_codes(fw_versions: list[bytes] | set[bytes]) -> set[tuple[bytes, bytes]]: + codes = set() + for fw in fw_versions: + match = FW_PATTERN.match(fw) + if match is not None: + codes.add((match.group('platform_hint'), match.group('model_year_hint'))) + + return codes + + +def match_fw_to_car_fuzzy(live_fw_versions: LiveFwVersions, vin: str, offline_fw_versions: OfflineFwVersions) -> set[str]: + candidates: set[str] = set() + + for candidate, fws in offline_fw_versions.items(): + # Keep track of ECUs which pass all checks (platform hint, within model year hint range) + valid_found_ecus = set() + valid_expected_ecus = {ecu[1:] for ecu in fws if ecu[0] in PLATFORM_CODE_ECUS} + for ecu, expected_versions in fws.items(): + addr = ecu[1:] + # Only check ECUs expected to have platform codes + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + # Expected platform codes & model year hints + codes = get_platform_codes(expected_versions) + expected_platform_codes = {code for code, _ in codes} + expected_model_year_hints = {model_year_hint for _, model_year_hint in codes} + + # Found platform codes & model year hints + codes = get_platform_codes(live_fw_versions.get(addr, set())) + found_platform_codes = {code for code, _ in codes} + found_model_year_hints = {model_year_hint for _, model_year_hint in codes} + + # Check platform code matches for any found versions + if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes): + break + + # Check any model year hint within range in the database. Note that some models have more than one + # platform code per ECU which we don't consider as separate ranges + if not any(min(expected_model_year_hints) <= found_model_year_hint <= max(expected_model_year_hints) for + found_model_year_hint in found_model_year_hints): + break + + valid_found_ecus.add(addr) + + # If all live ECUs pass all checks for candidate, add it as a match + if valid_expected_ecus.issubset(valid_found_ecus): + candidates.add(candidate) + + return candidates + + +# All of these ECUs must be present and are expected to have platform codes we can match +PLATFORM_CODE_ECUS = (Ecu.abs, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.eps) + +DATA_IDENTIFIER_FORD_ASBUILT = 0xDE00 + +ASBUILT_BLOCKS: list[tuple[int, list]] = [ + (1, [Ecu.debug, Ecu.fwdCamera, Ecu.eps]), + (2, [Ecu.abs, Ecu.debug, Ecu.eps]), + (3, [Ecu.abs, Ecu.debug, Ecu.eps]), + (4, [Ecu.debug, Ecu.fwdCamera]), + (5, [Ecu.debug]), + (6, [Ecu.debug]), + (7, [Ecu.debug]), + (8, [Ecu.debug]), + (9, [Ecu.debug]), + (16, [Ecu.debug, Ecu.fwdCamera]), + (18, [Ecu.fwdCamera]), + (20, [Ecu.fwdCamera]), + (21, [Ecu.fwdCamera]), +] + + +def ford_asbuilt_block_request(block_id: int): + return bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + p16(DATA_IDENTIFIER_FORD_ASBUILT + block_id - 1) + + +def ford_asbuilt_block_response(block_id: int): + return bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + p16(DATA_IDENTIFIER_FORD_ASBUILT + block_id - 1) + + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + # CAN and CAN FD queries are combined. + # FIXME: For CAN FD, ECUs respond with frames larger than 8 bytes on the powertrain bus + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.debug, Ecu.engine, Ecu.eps, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.shiftByWire], + logging=True, + ), + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.debug, Ecu.engine, Ecu.eps, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.shiftByWire], + bus=0, + auxiliary=True, + ), + *[Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(block_id)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(block_id)], + whitelist_ecus=ecus, + bus=0, + logging=True, + ) for block_id, ecus in ASBUILT_BLOCKS], + ], + extra_ecus=[ + (Ecu.engine, 0x7e0, None), # Powertrain Control Module + # Note: We are unlikely to get a response from behind the gateway + (Ecu.shiftByWire, 0x732, None), # Gear Shift Module + (Ecu.debug, 0x7d0, None), # Accessory Protocol Interface Module + ], + # Custom fuzzy fingerprinting function using platform and model year hints + match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, +) + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/fw_query_definitions.py b/artifacts/package_runtime/iqdbc/car/fw_query_definitions.py new file mode 100644 index 000000000..062839f87 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/fw_query_definitions.py @@ -0,0 +1,153 @@ +import copy +from dataclasses import dataclass, field +import struct +from collections.abc import Callable + +from iqdbc.car import uds +from iqdbc.car.structs import CarParams + +Ecu = CarParams.Ecu + +AddrType = tuple[int, int | None] +EcuAddrBusType = tuple[int, int | None, int] +EcuAddrSubAddr = tuple[Ecu, int, int | None] + +LiveFwVersions = dict[AddrType, set[bytes]] +OfflineFwVersions = dict[str, dict[EcuAddrSubAddr, list[bytes]]] + +# A global list of addresses we will only ever consider for VIN responses +# engine, hybrid controller, Ford abs, Hyundai CAN FD cluster, 29-bit engine, PGM-FI +# TODO: move these to each brand's FW query config +STANDARD_VIN_ADDRS = [0x7e0, 0x7e2, 0x760, 0x7c6, 0x18da10f1, 0x18da0ef1] + +ESSENTIAL_ECUS = [Ecu.engine, Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.vsa] +ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()} + + +def p16(val): + return struct.pack("!H", val) + + +class StdQueries: + # FW queries + TESTER_PRESENT_REQUEST = bytes([uds.SERVICE_TYPE.TESTER_PRESENT, 0x0]) + TESTER_PRESENT_RESPONSE = bytes([uds.SERVICE_TYPE.TESTER_PRESENT + 0x40, 0x0]) + + SHORT_TESTER_PRESENT_REQUEST = bytes([uds.SERVICE_TYPE.TESTER_PRESENT]) + SHORT_TESTER_PRESENT_RESPONSE = bytes([uds.SERVICE_TYPE.TESTER_PRESENT + 0x40]) + + DEFAULT_DIAGNOSTIC_REQUEST = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, + uds.SESSION_TYPE.DEFAULT]) + DEFAULT_DIAGNOSTIC_RESPONSE = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, + uds.SESSION_TYPE.DEFAULT, 0x0, 0x32, 0x1, 0xf4]) + + EXTENDED_DIAGNOSTIC_REQUEST = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, + uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC]) + EXTENDED_DIAGNOSTIC_RESPONSE = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, + uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC, 0x0, 0x32, 0x1, 0xf4]) + + MANUFACTURER_SOFTWARE_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER) + MANUFACTURER_SOFTWARE_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER) + + SUPPLIER_SOFTWARE_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_VERSION_NUMBER) + SUPPLIER_SOFTWARE_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_VERSION_NUMBER) + + MANUFACTURER_ECU_HARDWARE_NUMBER_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_HARDWARE_NUMBER) + MANUFACTURER_ECU_HARDWARE_NUMBER_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_HARDWARE_NUMBER) + + UDS_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_SOFTWARE_IDENTIFICATION) + UDS_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_SOFTWARE_IDENTIFICATION) + + OBD_VERSION_REQUEST = b'\x09\x04' + OBD_VERSION_RESPONSE = b'\x49\x04' + + # VIN queries + OBD_VIN_REQUEST = b'\x09\x02' + OBD_VIN_RESPONSE = b'\x49\x02\x01' + + UDS_VIN_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + p16(uds.DATA_IDENTIFIER_TYPE.VIN) + UDS_VIN_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + p16(uds.DATA_IDENTIFIER_TYPE.VIN) + + GM_VIN_REQUEST = b'\x1a\x90' + GM_VIN_RESPONSE = b'\x5a\x90' + + KWP_VIN_REQUEST = b'\x21\x81' + KWP_VIN_RESPONSE = b'\x61\x81' + + +@dataclass +class Request: + request: list[bytes] + response: list[bytes] + whitelist_ecus: list[Ecu] = field(default_factory=list) + rx_offset: int = 0x8 + bus: int = 1 + # Whether this query should be run on the first auxiliary panda (CAN FD cars for example) + auxiliary: bool = False + # FW responses from these queries will not be used for fingerprinting + logging: bool = False + # pandad toggles OBD multiplexing on/off as needed + obd_multiplexing: bool = True + + +@dataclass +class FwQueryConfig: + requests: list[Request] + # TODO: make this automatic and remove hardcoded lists, or do fingerprinting with ecus + # Overrides and removes from essential ecus for specific models and ecus (exact matching) + non_essential_ecus: dict[Ecu, list[str]] = field(default_factory=dict) + # Ecus added for data collection, not to be fingerprinted on + extra_ecus: list[tuple[Ecu, int, int | None]] = field(default_factory=list) + # Function a brand can implement to provide better fuzzy matching. Takes in FW versions and VIN, + # returns set of candidates. Only will match if one candidate is returned + match_fw_to_car_fuzzy: Callable[[LiveFwVersions, str, OfflineFwVersions], set[str]] | None = None + refine_fw_matches: Callable[[set[str], str], set[str]] | None = None + + def __post_init__(self): + # Asserts that a request exists if extra ecus are used + if len(self.extra_ecus): + assert len(self.requests), "Must define a request with extra ecus" + + # All extra ecus should be used in a request + for ecu, _, _ in self.extra_ecus: + assert (any(ecu in request.whitelist_ecus for request in self.requests) or + any(not request.whitelist_ecus for request in self.requests)), f"Ecu.{ECU_NAME[ecu]} not in any request" + + # These ECUs are already not in ESSENTIAL_ECUS which the fingerprint functions give a pass if missing + unnecessary_non_essential_ecus = set(self.non_essential_ecus) - set(ESSENTIAL_ECUS) + assert unnecessary_non_essential_ecus == set(), ("Declaring non-essential ECUs non-essential is not required: " + + f"{', '.join([f'Ecu.{ECU_NAME[ecu]}' for ecu in unnecessary_non_essential_ecus])}") + + # Asserts equal length request and response lists + for request_obj in self.requests: + assert len(request_obj.request) == len(request_obj.response), ("Request and response lengths do not match: " + + f"{request_obj.request} vs. {request_obj.response}") + + # No request on the OBD port (bus 1, multiplexed) should be run on an aux panda + assert not (request_obj.auxiliary and request_obj.bus == 1 and request_obj.obd_multiplexing), ("OBD multiplexed request should not " + + f"be marked auxiliary: {request_obj}") + + # Add aux requests (second panda) for all requests that are marked as auxiliary + for i in range(len(self.requests)): + if self.requests[i].auxiliary: + new_request = copy.deepcopy(self.requests[i]) + new_request.bus += 4 + self.requests.append(new_request) + + def get_all_ecus(self, offline_fw_versions: OfflineFwVersions, + include_extra_ecus: bool = True) -> set[EcuAddrSubAddr]: + # Add ecus in database + extra ecus + brand_ecus = {ecu for ecus in offline_fw_versions.values() for ecu in ecus} + + if include_extra_ecus: + brand_ecus |= set(self.extra_ecus) + + return brand_ecus diff --git a/artifacts/package_runtime/iqdbc/car/fw_versions.py b/artifacts/package_runtime/iqdbc/car/fw_versions.py new file mode 100644 index 000000000..cbc53923c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/fw_versions.py @@ -0,0 +1,331 @@ +from collections import defaultdict +from collections.abc import Callable, Iterator +from typing import Protocol, TypeVar + +from tqdm import tqdm + +from iqdbc.car import uds +from iqdbc.car.can_definitions import CanRecvCallable, CanSendCallable +from iqdbc.car.carlog import carlog +from iqdbc.car.structs import CarParams +from iqdbc.car.ecu_addrs import get_ecu_addrs +from iqdbc.car.fingerprints import FW_VERSIONS +from iqdbc.car.fw_query_definitions import ESSENTIAL_ECUS, AddrType, EcuAddrBusType, FwQueryConfig, LiveFwVersions, OfflineFwVersions +from iqdbc.car.interfaces import get_interface_attr +from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery + +Ecu = CarParams.Ecu +FUZZY_EXCLUDE_ECUS = [Ecu.fwdCamera, Ecu.fwdRadar, Ecu.eps, Ecu.debug] + +FW_QUERY_CONFIGS: dict[str, FwQueryConfig] = get_interface_attr('FW_QUERY_CONFIG', ignore_none=True) +VERSIONS = get_interface_attr('FW_VERSIONS', ignore_none=True) + +MODEL_TO_BRAND = {c: b for b, e in VERSIONS.items() for c in e} +REQUESTS = [(brand, config, r) for brand, config in FW_QUERY_CONFIGS.items() for r in config.requests] + +T = TypeVar('T') +ObdCallback = Callable[[bool], None] + + +def chunks(l: list[T], n: int = 128) -> Iterator[list[T]]: + for i in range(0, len(l), n): + yield l[i:i + n] + + +def is_brand(brand: str, filter_brand: str | None) -> bool: + """Returns if brand matches filter_brand or no brand filter is specified""" + return filter_brand is None or brand == filter_brand + + +def build_fw_dict(fw_versions: list[CarParams.CarFw], filter_brand: str | None = None) -> dict[AddrType, set[bytes]]: + fw_versions_dict: defaultdict[AddrType, set[bytes]] = defaultdict(set) + for fw in fw_versions: + if is_brand(fw.brand, filter_brand) and not fw.logging: + sub_addr = fw.subAddress if fw.subAddress != 0 else None + fw_versions_dict[(fw.address, sub_addr)].add(fw.fwVersion) + return dict(fw_versions_dict) + + +class MatchFwToCar(Protocol): + def __call__(self, live_fw_versions: LiveFwVersions, match_brand: str | None = None, log: bool = True) -> set[str]: + ... + + +def match_fw_to_car_fuzzy(live_fw_versions: LiveFwVersions, match_brand: str | None = None, log: bool = True, exclude: str | None = None) -> set[str]: + """Do a fuzzy FW match. This function will return a match, and the number of firmware version + that were matched uniquely to that specific car. If multiple ECUs uniquely match to different cars + the match is rejected.""" + + # Build lookup table from (addr, sub_addr, fw) to list of candidate cars + all_fw_versions = defaultdict(list) + for candidate, fw_by_addr in FW_VERSIONS.items(): + if not is_brand(MODEL_TO_BRAND[candidate], match_brand): + continue + + if candidate == exclude: + continue + + for addr, fws in fw_by_addr.items(): + # These ECUs are known to be shared between models (EPS only between hybrid/ICE version) + # Getting this exactly right isn't crucial, but excluding camera and radar makes it almost + # impossible to get 3 matching versions, even if two models with shared parts are released at the same + # time and only one is in our database. + if addr[0] in FUZZY_EXCLUDE_ECUS: + continue + for f in fws: + all_fw_versions[(addr[1], addr[2], f)].append(candidate) + + matched_ecus = set() + match: str | None = None + for addr, versions in live_fw_versions.items(): + ecu_key = (addr[0], addr[1]) + for version in versions: + # All cars that have this FW response on the specified address + candidates = all_fw_versions[(*ecu_key, version)] + + if len(candidates) == 1: + matched_ecus.add(ecu_key) + if match is None: + match = candidates[0] + # We uniquely matched two different cars. No fuzzy match possible + elif match != candidates[0]: + return set() + + # Note that it is possible to match to a candidate without all its ECUs being present + # if there are enough matches. FIXME: parameterize this or require all ECUs to exist like exact matching + if match and len(matched_ecus) >= 2: + if log: + carlog.error(f"Fingerprinted {match} using fuzzy match. {len(matched_ecus)} matching ECUs") + return {match} + else: + return set() + + +def match_fw_to_car_exact(live_fw_versions: LiveFwVersions, match_brand: str | None = None, + log: bool = True, extra_fw_versions: dict | None = None) -> set[str]: + """Do an exact FW match. Returns all cars that match the given + FW versions for a list of "essential" ECUs. If an ECU is not considered + essential the FW version can be missing to get a fingerprint, but if it's present it + needs to match the database.""" + if extra_fw_versions is None: + extra_fw_versions = {} + + invalid = set() + candidates = {c: f for c, f in FW_VERSIONS.items() if + is_brand(MODEL_TO_BRAND[c], match_brand)} + + for candidate, fws in candidates.items(): + config = FW_QUERY_CONFIGS[MODEL_TO_BRAND[candidate]] + for ecu, expected_versions in fws.items(): + expected_versions = expected_versions + extra_fw_versions.get(candidate, {}).get(ecu, []) + ecu_type = ecu[0] + addr = ecu[1:] + + found_versions = live_fw_versions.get(addr, set()) + if not len(found_versions): + # Some models can sometimes miss an ecu, or show on two different addresses + # FIXME: this logic can be improved to be more specific, should require one of the two addresses + if candidate in config.non_essential_ecus.get(ecu_type, []): + continue + + # Ignore non essential ecus + if ecu_type not in ESSENTIAL_ECUS: + continue + + # Virtual debug ecu doesn't need to match the database + if ecu_type == Ecu.debug: + continue + + if not any(found_version in expected_versions for found_version in found_versions): + invalid.add(candidate) + break + + return set(candidates.keys()) - invalid + + +def match_fw_to_car(fw_versions: list[CarParams.CarFw], vin: str, allow_exact: bool = True, + allow_fuzzy: bool = True, log: bool = True) -> tuple[bool, set[str]]: + # Try exact matching first + exact_matches: list[tuple[bool, MatchFwToCar]] = [] + if allow_exact: + exact_matches = [(True, match_fw_to_car_exact)] + if allow_fuzzy: + exact_matches.append((False, match_fw_to_car_fuzzy)) + + for exact_match, match_func in exact_matches: + # For each brand, attempt to fingerprint using all FW returned from its queries + matches: set[str] = set() + for brand in VERSIONS.keys(): + fw_versions_dict = build_fw_dict(fw_versions, filter_brand=brand) + config = FW_QUERY_CONFIGS[brand] + brand_matches = match_func(fw_versions_dict, match_brand=brand, log=log) + if exact_match and len(brand_matches) > 1 and config.refine_fw_matches is not None: + brand_matches = config.refine_fw_matches(brand_matches, vin) + matches |= brand_matches + + # If specified and no matches so far, fall back to brand's fuzzy fingerprinting function + if not exact_match and not len(matches) and config.match_fw_to_car_fuzzy is not None: + matches |= config.match_fw_to_car_fuzzy(fw_versions_dict, vin, VERSIONS[brand]) + + if len(matches): + return exact_match, matches + + return True, set() + + +def get_present_ecus(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, num_pandas: int = 1) -> set[EcuAddrBusType]: + # queries are split by OBD multiplexing mode + queries: dict[bool, list[list[EcuAddrBusType]]] = {True: [], False: []} + parallel_queries: dict[bool, list[EcuAddrBusType]] = {True: [], False: []} + responses: set[EcuAddrBusType] = set() + + for brand, config, r in REQUESTS: + # Skip query if no panda available + if r.bus > num_pandas * 4 - 1: + continue + + for ecu_type, addr, sub_addr in config.get_all_ecus(VERSIONS[brand]): + # Only query ecus in whitelist if whitelist is not empty + if len(r.whitelist_ecus) == 0 or ecu_type in r.whitelist_ecus: + a = (addr, sub_addr, r.bus) + # Build set of queries + if sub_addr is None: + if a not in parallel_queries[r.obd_multiplexing]: + parallel_queries[r.obd_multiplexing].append(a) + else: # subaddresses must be queried one by one + if [a] not in queries[r.obd_multiplexing]: + queries[r.obd_multiplexing].append([a]) + + # Build set of expected responses to filter + response_addr = uds.get_rx_addr_for_tx_addr(addr, r.rx_offset) + responses.add((response_addr, sub_addr, r.bus)) + + for obd_multiplexing in queries: + queries[obd_multiplexing].insert(0, parallel_queries[obd_multiplexing]) + + ecu_responses = set() + for obd_multiplexing in queries: + set_obd_multiplexing(obd_multiplexing) + for query in queries[obd_multiplexing]: + ecu_responses.update(get_ecu_addrs(can_recv, can_send, set(query), responses, timeout=0.1)) + return ecu_responses + + +def get_brand_ecu_matches(ecu_rx_addrs: set[EcuAddrBusType]) -> dict[str, list[bool]]: + """Returns dictionary of brands and matches with ECUs in their FW versions""" + + brand_rx_addrs = {brand: set() for brand in FW_QUERY_CONFIGS} + brand_matches = {brand: [] for brand, _, _ in REQUESTS} + + # Since we can't know what request an ecu responded to, add matches for all possible rx offsets + for brand, config, r in REQUESTS: + for ecu in config.get_all_ecus(VERSIONS[brand]): + if len(r.whitelist_ecus) == 0 or ecu[0] in r.whitelist_ecus: + brand_rx_addrs[brand].add((uds.get_rx_addr_for_tx_addr(ecu[1], r.rx_offset), ecu[2])) + + for brand, addrs in brand_rx_addrs.items(): + for addr in addrs: + # TODO: check bus from request as well + brand_matches[brand].append(addr in [addr[:2] for addr in ecu_rx_addrs]) + + return brand_matches + + +def get_fw_versions_ordered(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, vin: str, + ecu_rx_addrs: set[EcuAddrBusType], timeout: float = 0.1, num_pandas: int = 1, progress: bool = False) -> list[CarParams.CarFw]: + """Queries for FW versions ordering brands by likelihood, breaks when exact match is found""" + + all_car_fw = [] + brand_matches = get_brand_ecu_matches(ecu_rx_addrs) + + # Sort brands by number of matching ECUs first, then percentage of matching ECUs in the database + # This allows brands with only one ECU to be queried first (e.g. Tesla) + for brand in sorted(brand_matches, key=lambda b: (brand_matches[b].count(True), brand_matches[b].count(True) / len(brand_matches[b])), reverse=True): + # Skip this brand if there are no matching present ECUs + if True not in brand_matches[brand]: + continue + + car_fw = get_fw_versions(can_recv, can_send, set_obd_multiplexing, query_brand=brand, timeout=timeout, num_pandas=num_pandas, progress=progress) + all_car_fw.extend(car_fw) + + # If there is a match using this brand's FW alone, finish querying early + _, matches = match_fw_to_car(car_fw, vin, log=False) + if len(matches) == 1: + break + + return all_car_fw + + +def get_fw_versions(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, query_brand: str | None = None, + extra: OfflineFwVersions | None = None, timeout: float = 0.1, num_pandas: int = 1, progress: bool = False) -> list[CarParams.CarFw]: + versions = VERSIONS.copy() + + if query_brand is not None: + versions = {query_brand: versions[query_brand]} + + if extra is not None: + versions.update(extra) + + # Extract ECU addresses to query from fingerprints + # ECUs using a subaddress need be queried one by one, the rest can be done in parallel + addrs = [] + parallel_addrs = [] + ecu_types = {} + + for brand, brand_versions in versions.items(): + config = FW_QUERY_CONFIGS[brand] + for ecu_type, addr, sub_addr in config.get_all_ecus(brand_versions): + a = (brand, addr, sub_addr) + if a not in ecu_types: + ecu_types[a] = ecu_type + + if sub_addr is None: + if a not in parallel_addrs: + parallel_addrs.append(a) + else: + if [a] not in addrs: + addrs.append([a]) + + addrs.insert(0, parallel_addrs) + + # Get versions and build capnp list to put into CarParams + car_fw = [] + requests = [(brand, config, r) for brand, config, r in REQUESTS if is_brand(brand, query_brand)] + for addr_group in tqdm(addrs, disable=not progress): # split by subaddr, if any + for addr_chunk in chunks(addr_group): + for brand, config, r in requests: + # Skip query if no panda available + if r.bus > num_pandas * 4 - 1: + continue + + # Toggle OBD multiplexing for each request + if r.bus % 4 == 1: + set_obd_multiplexing(r.obd_multiplexing) + + try: + query_addrs = [(a, s) for (b, a, s) in addr_chunk if b in (brand, 'any') and + (len(r.whitelist_ecus) == 0 or ecu_types[(b, a, s)] in r.whitelist_ecus)] + + if query_addrs: + query = IsoTpParallelQuery(can_send, can_recv, r.bus, query_addrs, r.request, r.response, r.rx_offset) + for (tx_addr, sub_addr), version in query.get_data(timeout).items(): + f = CarParams.CarFw() + + f.ecu = ecu_types.get((brand, tx_addr, sub_addr), Ecu.unknown) + f.fwVersion = version + f.address = tx_addr + f.responseAddress = uds.get_rx_addr_for_tx_addr(tx_addr, r.rx_offset) + f.request = r.request + f.brand = brand + f.bus = r.bus + f.logging = r.logging or (f.ecu, tx_addr, sub_addr) in config.extra_ecus + f.obdMultiplexing = r.obd_multiplexing + + if sub_addr is not None: + f.subAddress = sub_addr + + car_fw.append(f) + except Exception: + carlog.exception("FW query exception") + + return car_fw diff --git a/artifacts/package_runtime/iqdbc/car/gm/__init__.py b/artifacts/package_runtime/iqdbc/car/gm/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/gm/carcontroller.py b/artifacts/package_runtime/iqdbc/car/gm/carcontroller.py new file mode 100644 index 000000000..c9431d9dc --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/gm/carcontroller.py @@ -0,0 +1,163 @@ +import numpy as np +from iqdbc.can import CANPacker +from iqdbc.car import Bus, DT_CTRL, structs +from iqdbc.car.lateral import apply_driver_steer_torque_limits +from iqdbc.car.gm import gmcan +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.gm.values import DBC, CanBus, CarControllerParams, CruiseButtons +from iqdbc.car.interfaces import CarControllerBase + +VisualAlert = structs.CarControl.HUDControl.VisualAlert +NetworkLocation = structs.CarParams.NetworkLocation +LongCtrlState = structs.CarControl.Actuators.LongControlState + +# Camera cancels up to 0.1s after brake is pressed, ECM allows 0.5s +CAMERA_CANCEL_DELAY_FRAMES = 10 +# Enforce a minimum interval between steering messages to avoid a fault +MIN_STEER_MSG_INTERVAL_MS = 15 + + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ): + super().__init__(dbc_names, CP, CP_IQ) + self.start_time = 0. + self.apply_torque_last = 0 + self.apply_gas = 0 + self.apply_brake = 0 + self.last_steer_frame = 0 + self.last_button_frame = 0 + self.cancel_counter = 0 + + self.lka_steering_cmd_counter = 0 + self.lka_icon_status_last = (False, False) + + self.params = CarControllerParams(self.CP) + + self.packer_pt = CANPacker(DBC[self.CP.carFingerprint][Bus.pt]) + self.packer_obj = CANPacker(DBC[self.CP.carFingerprint][Bus.radar]) + self.packer_ch = CANPacker(DBC[self.CP.carFingerprint][Bus.chassis]) + + def update(self, CC, CC_IQ, CS, now_nanos): + actuators = CC.actuators + hud_control = CC.hudControl + hud_alert = hud_control.visualAlert + hud_v_cruise = hud_control.setSpeed + if hud_v_cruise > 70: + hud_v_cruise = 0 + + # Send CAN commands. + can_sends = [] + + # Steering (Active: 50Hz, inactive: 10Hz) + steer_step = self.params.STEER_STEP if CC.latActive else self.params.INACTIVE_STEER_STEP + + if self.CP.networkLocation == NetworkLocation.fwdCamera: + # Also send at 50Hz: + # - on startup, first few msgs are blocked + # - until we're in sync with camera so counters align when relay closes, preventing a fault. + # openpilot can subtly drift, so this is activated throughout a drive to stay synced + out_of_sync = self.lka_steering_cmd_counter % 4 != (CS.cam_lka_steering_cmd_counter + 1) % 4 + if CS.loopback_lka_steering_cmd_ts_nanos == 0 or out_of_sync: + steer_step = self.params.STEER_STEP + + self.lka_steering_cmd_counter += 1 if CS.loopback_lka_steering_cmd_updated else 0 + + # Avoid GM EPS faults when transmitting messages too close together: skip this transmit if we + # received the ASCMLKASteeringCmd loopback confirmation too recently + last_lka_steer_msg_ms = (now_nanos - CS.loopback_lka_steering_cmd_ts_nanos) * 1e-6 + if (self.frame - self.last_steer_frame) >= steer_step and last_lka_steer_msg_ms > MIN_STEER_MSG_INTERVAL_MS: + # Initialize ASCMLKASteeringCmd counter using the camera until we get a msg on the bus + if CS.loopback_lka_steering_cmd_ts_nanos == 0: + self.lka_steering_cmd_counter = CS.pt_lka_steering_cmd_counter + 1 + + if CC.latActive: + new_torque = int(round(actuators.torque * self.params.STEER_MAX)) + apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.params) + else: + apply_torque = 0 + + self.last_steer_frame = self.frame + self.apply_torque_last = apply_torque + idx = self.lka_steering_cmd_counter % 4 + can_sends.append(gmcan.create_steering_control(self.packer_pt, CanBus.POWERTRAIN, apply_torque, idx, CC.latActive)) + + if self.CP.openpilotLongitudinalControl: + # Gas/regen, brakes, and UI commands - all at 25Hz + if self.frame % 4 == 0: + stopping = actuators.longControlState == LongCtrlState.stopping + if not CC.longActive: + # ASCM sends max regen when not enabled + self.apply_gas = self.params.INACTIVE_REGEN + self.apply_brake = 0 + else: + self.apply_gas = float(np.interp(actuators.accel, self.params.GAS_LOOKUP_BP, self.params.GAS_LOOKUP_V)) + self.apply_brake = int(round(np.interp(actuators.accel, self.params.BRAKE_LOOKUP_BP, self.params.BRAKE_LOOKUP_V))) + # Don't allow any gas above inactive regen while stopping + # FIXME: brakes aren't applied immediately when enabling at a stop + if stopping: + self.apply_gas = self.params.INACTIVE_REGEN + + idx = (self.frame // 4) % 4 + + at_full_stop = CC.longActive and CS.out.standstill + near_stop = CC.longActive and (abs(CS.out.vEgo) < self.params.NEAR_STOP_BRAKE_PHASE) + friction_brake_bus = CanBus.CHASSIS + # GM Camera exceptions + # TODO: can we always check the longControlState? + if self.CP.networkLocation == NetworkLocation.fwdCamera: + at_full_stop = at_full_stop and stopping + friction_brake_bus = CanBus.POWERTRAIN + + # GasRegenCmdActive needs to be 1 to avoid cruise faults. It describes the ACC state, not actuation + can_sends.append(gmcan.create_gas_regen_command(self.packer_pt, CanBus.POWERTRAIN, self.apply_gas, idx, CC.enabled, at_full_stop)) + can_sends.append(gmcan.create_friction_brake_command(self.packer_ch, friction_brake_bus, self.apply_brake, + idx, CC.enabled, near_stop, at_full_stop, self.CP)) + + # Send dashboard UI commands (ACC status) + send_fcw = hud_alert == VisualAlert.fcw + can_sends.append(gmcan.create_acc_dashboard_command(self.packer_pt, CanBus.POWERTRAIN, CC.enabled, + hud_v_cruise * CV.MS_TO_KPH, hud_control, send_fcw)) + + # Radar needs to know current speed and yaw rate (50hz), + # and that ADAS is alive (10hz) + if not self.CP.radarUnavailable: + tt = self.frame * DT_CTRL + time_and_headlights_step = 10 + if self.frame % time_and_headlights_step == 0: + idx = (self.frame // time_and_headlights_step) % 4 + can_sends.append(gmcan.create_adas_time_status(CanBus.OBSTACLE, int((tt - self.start_time) * 60), idx)) + can_sends.append(gmcan.create_adas_headlights_status(self.packer_obj, CanBus.OBSTACLE)) + + speed_and_accelerometer_step = 2 + if self.frame % speed_and_accelerometer_step == 0: + idx = (self.frame // speed_and_accelerometer_step) % 4 + can_sends.append(gmcan.create_adas_steering_status(CanBus.OBSTACLE, idx)) + can_sends.append(gmcan.create_adas_accelerometer_speed_status(CanBus.OBSTACLE, abs(CS.out.vEgo), idx)) + + if self.CP.networkLocation == NetworkLocation.gateway and self.frame % self.params.ADAS_KEEPALIVE_STEP == 0: + can_sends += gmcan.create_adas_keepalive(CanBus.POWERTRAIN) + + else: + # While car is braking, cancel button causes ECM to enter a soft disable state with a fault status. + # A delayed cancellation allows camera to cancel and avoids a fault when user depresses brake quickly + self.cancel_counter = self.cancel_counter + 1 if CC.cruiseControl.cancel else 0 + + # Stock longitudinal, integrated at camera + if (self.frame - self.last_button_frame) * DT_CTRL > 0.04: + if self.cancel_counter > CAMERA_CANCEL_DELAY_FRAMES: + self.last_button_frame = self.frame + can_sends.append(gmcan.create_buttons(self.packer_pt, CanBus.CAMERA, CS.buttons_counter, CruiseButtons.CANCEL)) + + if self.CP.networkLocation == NetworkLocation.fwdCamera: + # Silence "Take Steering" alert sent by camera, forward PSCMStatus with HandsOffSWlDetectionStatus=1 + if self.frame % 10 == 0: + can_sends.append(gmcan.create_pscm_status(self.packer_pt, CanBus.CAMERA, CS.pscm_status)) + + new_actuators = actuators.as_builder() + new_actuators.torque = self.apply_torque_last / self.params.STEER_MAX + new_actuators.torqueOutputCan = self.apply_torque_last + new_actuators.gas = self.apply_gas + new_actuators.brake = self.apply_brake + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/gm/carstate.py b/artifacts/package_runtime/iqdbc/car/gm/carstate.py new file mode 100644 index 000000000..b7c18c385 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/gm/carstate.py @@ -0,0 +1,186 @@ +import copy +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, create_button_events, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.gm.values import DBC, AccState, CruiseButtons, STEER_THRESHOLD, SDGM_CAR, ALT_ACCS + +from iqdbc.lvbs.car.gm.iq_carstate import IQCarState +from iqdbc.lvbs.car.gm.iq_values import GMFlagsIQ + +ButtonType = structs.CarState.ButtonEvent.Type +TransmissionType = structs.CarParams.TransmissionType +NetworkLocation = structs.CarParams.NetworkLocation + +STANDSTILL_THRESHOLD = 10 * 0.0311 + +BUTTONS_DICT = {CruiseButtons.RES_ACCEL: ButtonType.accelCruise, CruiseButtons.DECEL_SET: ButtonType.decelCruise, + CruiseButtons.MAIN: ButtonType.mainCruise, CruiseButtons.CANCEL: ButtonType.cancel} + + +class CarState(CarStateBase, IQCarState): + def __init__(self, CP, CP_IQ): + CarStateBase.__init__(self, CP, CP_IQ) + IQCarState.__init__(self, CP, CP_IQ) + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + self.shifter_values = can_define.dv["ECMPRDNL2"]["PRNDL2"] + self.cluster_speed_hyst_gap = CV.KPH_TO_MS / 2. + self.cluster_min_speed = CV.KPH_TO_MS / 2. + + self.loopback_lka_steering_cmd_updated = False + self.loopback_lka_steering_cmd_ts_nanos = 0 + self.pt_lka_steering_cmd_counter = 0 + self.cam_lka_steering_cmd_counter = 0 + self.buttons_counter = 0 + + self.distance_button = 0 + + def update_button_enable(self, buttonEvents: list[structs.CarState.ButtonEvent]): + if not self.CP.pcmCruise: + for b in buttonEvents: + # The ECM allows enabling on falling edge of set, but only rising edge of resume + if (b.type == ButtonType.accelCruise and b.pressed) or \ + (b.type == ButtonType.decelCruise and not b.pressed): + return True + return False + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + pt_cp = can_parsers[Bus.pt] + cam_cp = can_parsers[Bus.cam] + loopback_cp = can_parsers[Bus.loopback] + + ret = structs.CarState() + ret_iq = structs.IQCarState() + + prev_cruise_buttons = self.cruise_buttons + prev_distance_button = self.distance_button + self.cruise_buttons = pt_cp.vl["ASCMSteeringButton"]["ACCButtons"] + self.distance_button = pt_cp.vl["ASCMSteeringButton"]["DistanceButton"] + self.buttons_counter = pt_cp.vl["ASCMSteeringButton"]["RollingCounter"] + self.pscm_status = copy.copy(pt_cp.vl["PSCMStatus"]) + + # Variables used for avoiding LKAS faults + self.loopback_lka_steering_cmd_updated = len(loopback_cp.vl_all["ASCMLKASteeringCmd"]["RollingCounter"]) > 0 + if self.loopback_lka_steering_cmd_updated: + self.loopback_lka_steering_cmd_ts_nanos = loopback_cp.ts_nanos["ASCMLKASteeringCmd"]["RollingCounter"] + if self.CP.networkLocation == NetworkLocation.fwdCamera: + self.pt_lka_steering_cmd_counter = pt_cp.vl["ASCMLKASteeringCmd"]["RollingCounter"] + self.cam_lka_steering_cmd_counter = cam_cp.vl["ASCMLKASteeringCmd"]["RollingCounter"] + + # This is to avoid a fault where you engage while still moving backwards after shifting to D. + # An Equinox has been seen with an unsupported status (3), so only check if either wheel is in reverse (2) + left_whl_sign = -1 if pt_cp.vl["EBCMWheelSpdRear"]["RLWheelDir"] == 2 else 1 + right_whl_sign = -1 if pt_cp.vl["EBCMWheelSpdRear"]["RRWheelDir"] == 2 else 1 + self.parse_wheel_speeds(ret, + left_whl_sign * pt_cp.vl["EBCMWheelSpdFront"]["FLWheelSpd"], + right_whl_sign * pt_cp.vl["EBCMWheelSpdFront"]["FRWheelSpd"], + left_whl_sign * pt_cp.vl["EBCMWheelSpdRear"]["RLWheelSpd"], + right_whl_sign * pt_cp.vl["EBCMWheelSpdRear"]["RRWheelSpd"], + ) + # sample rear wheel speeds to match the safety which only uses the rear CAN message + # standstill=True if ECM allows engagement with brake + ret.standstill = abs(pt_cp.vl["EBCMWheelSpdRear"]["RLWheelSpd"]) <= STANDSTILL_THRESHOLD and \ + abs(pt_cp.vl["EBCMWheelSpdRear"]["RRWheelSpd"]) <= STANDSTILL_THRESHOLD + + if pt_cp.vl["ECMPRDNL2"]["ManualMode"] == 1: + ret.gearShifter = self.parse_gear_shifter("T") + else: + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["ECMPRDNL2"]["PRNDL2"], None)) + + ret.brake = pt_cp.vl["ECMAcceleratorPos"]["BrakePedalPos"] + if self.CP.networkLocation == NetworkLocation.fwdCamera: + ret.brakePressed = pt_cp.vl["ECMEngineStatus"]["BrakePressed"] != 0 + else: + # Some Volt 2016-17 have loose brake pedal push rod retainers which causes the ECM to believe + # that the brake is being intermittently pressed without user interaction. + # To avoid a cruise fault we need to use a conservative brake position threshold + # https://static.nhtsa.gov/odi/tsbs/2017/MC-10137629-9999.pdf + ret.brakePressed = ret.brake >= 8 + + # Regen braking is braking + if self.CP.transmissionType == TransmissionType.direct: + ret.regenBraking = pt_cp.vl["EBCMRegenPaddle"]["RegenPaddle"] != 0 + + ret.gasPressed = pt_cp.vl["AcceleratorPedal2"]["AcceleratorPedal2"] / 254. > 1e-5 + + ret.steeringAngleDeg = pt_cp.vl["PSCMSteeringAngle"]["SteeringWheelAngle"] + ret.steeringRateDeg = pt_cp.vl["PSCMSteeringAngle"]["SteeringWheelRate"] + ret.steeringTorque = pt_cp.vl["PSCMStatus"]["LKADriverAppldTrq"] + ret.steeringTorqueEps = pt_cp.vl["PSCMStatus"]["LKATorqueDelivered"] + ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD + + # 0 inactive, 1 active, 2 temporarily limited, 3 failed + self.lkas_status = pt_cp.vl["PSCMStatus"]["LKATorqueDeliveredStatus"] + ret.steerFaultTemporary = self.lkas_status == 2 + ret.steerFaultPermanent = self.lkas_status == 3 + + # 1 - open, 0 - closed + ret.doorOpen = (pt_cp.vl["BCMDoorBeltStatus"]["FrontLeftDoor"] == 1 or + pt_cp.vl["BCMDoorBeltStatus"]["FrontRightDoor"] == 1 or + pt_cp.vl["BCMDoorBeltStatus"]["RearLeftDoor"] == 1 or + pt_cp.vl["BCMDoorBeltStatus"]["RearRightDoor"] == 1) + + # 1 - latched + ret.seatbeltUnlatched = pt_cp.vl["BCMDoorBeltStatus"]["LeftSeatBelt"] == 0 + ret.leftBlinker = pt_cp.vl["BCMTurnSignals"]["TurnSignals"] == 1 + ret.rightBlinker = pt_cp.vl["BCMTurnSignals"]["TurnSignals"] == 2 + + ret.parkingBrake = pt_cp.vl["BCMGeneralPlatformStatus"]["ParkBrakeSwActive"] == 1 + ret.cruiseState.available = pt_cp.vl["ECMEngineStatus"]["CruiseMainOn"] != 0 + ret.espDisabled = pt_cp.vl["ESPStatus"]["TractionControlOn"] != 1 + ret.accFaulted = (pt_cp.vl["AcceleratorPedal2"]["CruiseState"] == AccState.FAULTED or + pt_cp.vl["EBCMFrictionBrakeStatus"]["FrictionBrakeUnavailable"] == 1) + + ret.cruiseState.enabled = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] != AccState.OFF + ret.cruiseState.standstill = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] == AccState.STANDSTILL + if self.CP.networkLocation == NetworkLocation.fwdCamera: + if self.CP.carFingerprint not in ALT_ACCS and not self.CP_IQ.flags & GMFlagsIQ.NON_ACC: + ret.cruiseState.speed = cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCSpeedSetpoint"] * CV.KPH_TO_MS + # This FCW signal only works for SDGM cars. CAM cars send FCW on GMLAN but this bit is always 0 for them + ret.stockFcw = cam_cp.vl["ASCMActiveCruiseControlStatus"]["FCWAlert"] != 0 + if self.CP.pcmCruise: + # openpilot controls nonAdaptive when not pcmCruise + ret.cruiseState.nonAdaptive = cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCCruiseState"] not in (2, 3) + else: + ret.cruiseState.speed = pt_cp.vl["ECMCruiseControl"]["CruiseSetSpeed"] * CV.KPH_TO_MS + + if self.CP.carFingerprint not in SDGM_CAR: + ret.stockAeb = cam_cp.vl["AEBCmd"]["AEBCmdActive"] != 0 + + if self.CP.enableBsm: + ret.leftBlindspot = pt_cp.vl["BCMBlindSpotMonitor"]["LeftBSM"] == 1 + ret.rightBlindspot = pt_cp.vl["BCMBlindSpotMonitor"]["RightBSM"] == 1 + + # Don't add event if transitioning from INIT, unless it's to an actual button + if self.cruise_buttons != CruiseButtons.UNPRESS or prev_cruise_buttons != CruiseButtons.INIT: + ret.buttonEvents = [ + *create_button_events(self.cruise_buttons, prev_cruise_buttons, BUTTONS_DICT, + unpressed_btn=CruiseButtons.UNPRESS), + *create_button_events(self.distance_button, prev_distance_button, + {1: ButtonType.gapAdjustCruise}) + ] + + if ret.vEgo < self.CP.minSteerSpeed: + ret.lowSpeedAlert = True + + IQCarState.update(self, ret, can_parsers) + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + pt_messages = [] + if CP.networkLocation == NetworkLocation.fwdCamera: + pt_messages += [ + ("ASCMLKASteeringCmd", float('nan')), + ] + + loopback_messages = [ + ("ASCMLKASteeringCmd", float('nan')), + ] + + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, 0), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2), + Bus.loopback: CANParser(DBC[CP.carFingerprint][Bus.pt], loopback_messages, 128), + } diff --git a/artifacts/package_runtime/iqdbc/car/gm/fingerprints.py b/artifacts/package_runtime/iqdbc/car/gm/fingerprints.py new file mode 100644 index 000000000..25063d77c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/gm/fingerprints.py @@ -0,0 +1,84 @@ +# ruff: noqa: E501 +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.gm.values import CAR +from iqdbc.lvbs.car.iq_fingerprints import extend_fingerprints +from iqdbc.lvbs.car.gm.iq_fingerprints import FINGERPRINTS_EXT + +# Trailblazer also matches as a SILVERADO, TODO: split with fw versions +# FIXME: There are Equinox users with different message lengths, specifically 304 and 320 + + +FINGERPRINTS = { + CAR.HOLDEN_ASTRA: [{ + 190: 8, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 8, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 401: 8, 413: 8, 417: 8, 419: 8, 422: 1, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 8, 455: 7, 456: 8, 458: 5, 479: 8, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 8, 501: 8, 508: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 647: 5, 707: 8, 715: 8, 723: 8, 753: 5, 761: 7, 806: 1, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1009: 8, 1011: 6, 1017: 8, 1019: 3, 1020: 8, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 8, 1280: 4, 1300: 8, 1328: 4, 1417: 8, 1906: 7, 1907: 7, 1908: 7, 1912: 7, 1919: 7 + }], + CAR.CHEVROLET_VOLT: [{ + 170: 8, 171: 8, 189: 7, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 289: 8, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 4, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 5, 567: 3, 568: 1, 573: 1, 577: 8, 647: 3, 707: 8, 711: 6, 715: 8, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 961: 8, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7, 1928: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8 + }, + { + 170: 8, 171: 8, 189: 7, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 4, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 5, 567: 3, 568: 1, 573: 1, 577: 8, 578: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 715: 8, 717: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1516: 8, 1601: 8, 1618: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7, 1930: 7, 2016: 8, 2018: 8, 2020: 8, 2024: 8, 2028: 8 + }, + { + 170: 8, 171: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 199: 4, 201: 6, 209: 7, 211: 2, 241: 6, 288: 5, 289: 1, 290: 1, 298: 2, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 368: 8, 381: 2, 384: 8, 386: 5, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 3, 508: 8, 512: 3, 528: 4, 530: 8, 532: 6, 537: 5, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 4, 563: 5, 564: 5, 565: 5, 566: 5, 567: 3, 568: 1, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 761: 7, 810: 8, 821: 4, 823: 7, 832: 8, 840: 5, 842: 5, 844: 8, 853: 8, 866: 4, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7 + }], + CAR.BUICK_LACROSSE: [{ + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 510: 8, 528: 5, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 5, 707: 8, 753: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 872: 1, 882: 8, 890: 1, 892: 2, 893: 1, 894: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1914: 7, 1916: 7, 1918: 7, 1919: 7, 1937: 8, 1953: 8, 1968: 8, 2001: 8, 2017: 8, 2018: 8, 2020: 8, 2026: 8 + }], + CAR.BUICK_REGAL: [{ + 190: 8, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 8, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 8, 419: 8, 422: 4, 426: 8, 431: 8, 442: 8, 451: 8, 452: 8, 453: 8, 455: 7, 456: 8, 463: 3, 479: 8, 481: 7, 485: 8, 487: 8, 489: 8, 495: 8, 497: 8, 499: 3, 500: 8, 501: 8, 508: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 569: 3, 573: 1, 577: 8, 578: 8, 579: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 882: 8, 884: 8, 890: 1, 892: 2, 893: 2, 894: 1, 961: 8, 967: 8, 969: 8, 977: 8, 979: 8, 985: 8, 1001: 8, 1005: 6, 1009: 8, 1011: 8, 1013: 3, 1017: 8, 1020: 8, 1024: 8, 1025: 8, 1026: 8, 1027: 8, 1028: 8, 1029: 8, 1030: 8, 1031: 8, 1032: 2, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 8, 1225: 7, 1233: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 8, 1263: 8, 1265: 8, 1267: 8, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1601: 8, 1602: 8, 1603: 7, 1611: 8, 1618: 8, 1906: 8, 1907: 7, 1912: 7, 1914: 7, 1916: 7, 1919: 7, 1930: 7, 2016: 8, 2018: 8, 2019: 8, 2024: 8, 2026: 8 + }], + CAR.CADILLAC_ATS: [{ + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 368: 3, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 462: 4, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 491: 2, 493: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 528: 5, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 719: 5, 723: 2, 753: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 882: 8, 890: 1, 892: 2, 893: 2, 894: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1241: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1916: 7, 1917: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7, 2016: 8, 2024: 8 + }], + CAR.CHEVROLET_MALIBU: [{ + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1930: 7, 2016: 8, 2024: 8 + }], + CAR.GMC_ACADIA: [{ + 190: 6, 192: 5, 193: 8, 197: 8, 199: 4, 201: 6, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 7, 368: 8, 381: 8, 384: 8, 386: 8, 388: 8, 393: 8, 398: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 458: 8, 460: 4, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 512: 3, 530: 8, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 568: 2, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 801: 8, 803: 8, 804: 3, 805: 8, 832: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1003: 5, 1005: 6, 1009: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7 + }, + { + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 313: 8, 320: 3, 322: 7, 328: 1, 338: 6, 340: 6, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1919: 7, 1920: 7, 1930: 7, 2016: 8, 2024: 8 + }], + CAR.CADILLAC_ESCALADE: [{ + 170: 8, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 4, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 460: 5, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 534: 2, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 719: 5, 761: 7, 801: 8, 804: 3, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1917: 7, 1918: 7, 1919: 7, 1920: 7, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 2001: 8, 2017: 8, 2018: 8, 2020: 8, 2026: 8 + }], + CAR.CADILLAC_ESCALADE_ESV: [{ + 309: 1, 848: 8, 849: 8, 850: 8, 851: 8, 852: 8, 853: 8, 854: 3, 1056: 6, 1057: 8, 1058: 8, 1059: 8, 1060: 8, 1061: 8, 1062: 8, 1063: 8, 1064: 8, 1065: 8, 1066: 8, 1067: 8, 1068: 8, 1120: 8, 1121: 8, 1122: 8, 1123: 8, 1124: 8, 1125: 8, 1126: 8, 1127: 8, 1128: 8, 1129: 8, 1130: 8, 1131: 8, 1132: 8, 1133: 8, 1134: 8, 1135: 8, 1136: 8, 1137: 8, 1138: 8, 1139: 8, 1140: 8, 1141: 8, 1142: 8, 1143: 8, 1146: 8, 1147: 8, 1148: 8, 1149: 8, 1150: 8, 1151: 8, 1216: 8, 1217: 8, 1218: 8, 1219: 8, 1220: 8, 1221: 8, 1222: 8, 1223: 8, 1224: 8, 1225: 8, 1226: 8, 1232: 8, 1233: 8, 1234: 8, 1235: 8, 1236: 8, 1237: 8, 1238: 8, 1239: 8, 1240: 8, 1241: 8, 1242: 8, 1787: 8, 1788: 8 + }], + CAR.CADILLAC_ESCALADE_ESV_2019: [{ + 715: 8, 840: 5, 717: 5, 869: 4, 880: 6, 289: 8, 454: 8, 842: 5, 460: 5, 463: 3, 801: 8, 170: 8, 190: 6, 241: 6, 201: 8, 417: 7, 211: 2, 419: 1, 398: 8, 426: 7, 487: 8, 442: 8, 451: 8, 452: 8, 453: 6, 479: 3, 311: 8, 500: 6, 647: 6, 193: 8, 707: 8, 197: 8, 209: 7, 199: 4, 455: 7, 313: 8, 481: 7, 485: 8, 489: 8, 249: 8, 393: 7, 407: 7, 413: 8, 422: 4, 431: 8, 501: 8, 499: 3, 810: 8, 508: 8, 381: 8, 462: 4, 532: 6, 562: 8, 386: 8, 761: 7, 573: 1, 554: 3, 719: 5, 560: 8, 1279: 4, 388: 8, 288: 5, 1005: 6, 497: 8, 844: 8, 961: 8, 967: 4, 977: 8, 979: 8, 985: 5, 1001: 8, 1017: 8, 1019: 2, 1020: 8, 1217: 8, 510: 8, 866: 4, 304: 1, 969: 8, 384: 4, 1033: 7, 1009: 8, 1034: 7, 1296: 4, 1930: 7, 1105: 5, 1013: 5, 1225: 7, 1919: 7, 320: 3, 534: 2, 352: 5, 298: 8, 1223: 2, 1233: 8, 608: 8, 1265: 8, 609: 6, 1267: 1, 1417: 8, 610: 6, 1906: 7, 611: 6, 612: 8, 613: 8, 208: 8, 564: 5, 309: 8, 1221: 5, 1280: 4, 1249: 8, 1907: 7, 1257: 6, 1300: 8, 1920: 7, 563: 5, 1322: 6, 1323: 4, 1328: 4, 1917: 7, 328: 1, 1912: 7, 1914: 7, 804: 3, 1918: 7 + }], + CAR.CHEVROLET_BOLT_EUV: [{ + 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7 + }], + CAR.CHEVROLET_SILVERADO: [{ + 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 534: 2, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7 + }, + { + 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 3, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 534: 2, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7 + }], + CAR.CHEVROLET_EQUINOX: [{ + 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 510: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7 + }, + { + 190: 6, 201: 8, 211: 2, 717: 5, 241: 6, 451: 8, 298: 8, 452: 8, 453: 6, 479: 3, 485: 8, 249: 8, 500: 6, 587: 8, 1611: 8, 289: 8, 481: 7, 193: 8, 197: 8, 209: 7, 455: 7, 489: 8, 309: 8, 413: 8, 501: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 311: 8, 510: 8, 528: 5, 532: 6, 715: 8, 560: 8, 562: 8, 707: 8, 789: 5, 869: 4, 880: 6, 761: 7, 840: 5, 842: 5, 844: 8, 313: 8, 381: 8, 386: 8, 810: 8, 322: 7, 384: 4, 800: 6, 1033: 7, 1034: 7, 1296: 4, 753: 5, 388: 8, 288: 5, 497: 8, 463: 3, 304: 3, 977: 8, 1001: 8, 1280: 4, 320: 4, 352: 5, 563: 5, 565: 5, 1221: 5, 1011: 6, 1017: 8, 1020: 8, 1249: 8, 1300: 8, 328: 1, 1217: 8, 1233: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1930: 7, 1271: 8 + }], + CAR.CADILLAC_XT4: [{ + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 309: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 353: 3, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 719: 5, 761: 7, 806: 1, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 880: 6, 961: 8, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 5, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1037: 5, 1105: 5, 1187: 5, 1195: 3, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1268: 2, 1271: 8, 1273: 3, 1276: 2, 1277: 7, 1278: 4, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1345: 8, 1417: 8, 1512: 8, 1517: 8, 1601: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1920: 8, 1924: 8, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1984: 8, 1988: 8, 2000: 8, 2001: 8, 2002: 8, 2016: 8, 2017: 8, 2018: 8, 2020: 8, 2021: 8, 2024: 8, 2026: 8 + }], + CAR.CHEVROLET_VOLT_2019: [{ + 170: 8, 189: 7, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 331: 3, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 7, 567: 5, 573: 1, 577: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 715: 8, 717: 5, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 5, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1268: 2, 1273: 3, 1275: 3, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1345: 8, 1417: 8, 1512: 8, 1513: 8, 1516: 8, 1517: 8, 1601: 8, 1609: 8, 1611: 8, 1618: 8, 1613: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1799: 8, 1810: 8, 1813: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1856: 8, 1858: 8, 1859: 8, 1860: 8, 1862: 8, 1863: 8, 1871: 8, 1872: 8, 1875: 8, 1879: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1920: 8, 1922: 7, 1927: 7, 1930: 7, 1937: 8, 1953: 8, 1954: 8, 1955: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1988: 8, 1990: 8, 2000: 8, 2001: 8, 2004: 8, 2017: 8, 2018: 8, 2020: 8, 2021: 8, 2023: 8, 2025: 8, 2028: 8, 2031: 8 + }], + CAR.CHEVROLET_TRAVERSE: [{ + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 309: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 573: 1, 577: 8, 578: 8, 579: 8, 587: 8, 603: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 723: 4, 730: 4, 753: 5, 761: 7, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 5, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 5, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1268: 2, 1271: 8, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1345: 8, 1346: 8, 1347: 8, 1355: 8, 1362: 8, 1417: 8, 1512: 8, 1514: 8, 1601: 8, 1602: 8, 1603: 7, 1609: 8, 1611: 8, 1613: 8, 1618: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1799: 8, 1810: 8, 1813: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1856: 8, 1858: 8, 1859: 8, 1860: 8, 1862: 8, 1863: 8, 1871: 8, 1872: 8, 1875: 8, 1879: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1920: 7, 1927: 8, 1930: 7, 1937: 8, 1953: 8, 1954: 8, 1955: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1988: 8, 1990: 8, 2000: 8, 2001: 8, 2004: 8, 2016: 8, 2017: 8, 2018: 8, 2019: 8, 2020: 8, 2024: 8, 2026: 8 + }], + CAR.GMC_YUKON: [{ + 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 510: 8, 528: 5, 532: 6, 534: 2, 562: 8, 563: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 761: 7, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1355: 8, 1611: 8 + }], +} + +FW_VERSIONS: dict[str, dict[tuple, list[bytes]]] = { +} + + +FINGERPRINTS = extend_fingerprints(FINGERPRINTS, FINGERPRINTS_EXT) diff --git a/artifacts/package_runtime/iqdbc/car/gm/gmcan.py b/artifacts/package_runtime/iqdbc/car/gm/gmcan.py new file mode 100644 index 000000000..0ed1c6688 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/gm/gmcan.py @@ -0,0 +1,171 @@ +from iqdbc.car.can_definitions import CanData +from iqdbc.car.gm.values import CAR + + +def create_buttons(packer, bus, idx, button): + values = { + "ACCButtons": button, + "RollingCounter": idx, + "ACCAlwaysOne": 1, + "DistanceButton": 0, + } + + checksum = 240 + int(values["ACCAlwaysOne"] * 0xf) + checksum += values["RollingCounter"] * (0x4ef if values["ACCAlwaysOne"] != 0 else 0x3f0) + checksum -= int(values["ACCButtons"] - 1) << 4 # not correct if value is 0 + checksum -= 2 * values["DistanceButton"] + + values["SteeringButtonChecksum"] = checksum + return packer.make_can_msg("ASCMSteeringButton", bus, values) + + +def create_pscm_status(packer, bus, pscm_status): + values = {s: pscm_status[s] for s in [ + "HandsOffSWDetectionMode", + "HandsOffSWlDetectionStatus", + "LKATorqueDeliveredStatus", + "LKADriverAppldTrq", + "LKATorqueDelivered", + "LKATotalTorqueDelivered", + "RollingCounter", + "PSCMStatusChecksum", + ]} + checksum_mod = int(1 - values["HandsOffSWlDetectionStatus"]) << 5 + values["HandsOffSWlDetectionStatus"] = 1 + values["PSCMStatusChecksum"] += checksum_mod + return packer.make_can_msg("PSCMStatus", bus, values) + + +def create_steering_control(packer, bus, apply_torque, idx, lkas_active): + values = { + "LKASteeringCmdActive": lkas_active, + "LKASteeringCmd": apply_torque, + "RollingCounter": idx, + "LKASteeringCmdChecksum": 0x1000 - (lkas_active << 11) - (apply_torque & 0x7ff) - idx + } + + return packer.make_can_msg("ASCMLKASteeringCmd", bus, values) + + +def create_adas_keepalive(bus): + dat = b"\x00\x00\x00\x00\x00\x00\x00" + return [CanData(0x409, dat, bus), CanData(0x40a, dat, bus)] + + +def create_gas_regen_command(packer, bus, throttle, idx, enabled, at_full_stop): + values = { + "GasRegenCmdActive": enabled, + "RollingCounter": idx, + "GasRegenCmd": throttle, + "GasRegenFullStopActive": at_full_stop, + "GasRegenAccType": 1, + } + + dat = packer.make_can_msg("ASCMGasRegenCmd", bus, values)[1] + values["GasRegenChecksum"] = ((1 - enabled) << 24) | \ + (((0xff - dat[1]) & 0xff) << 16) | \ + (((0xff - dat[2]) & 0xff) << 8) | \ + ((0x100 - dat[3] - idx) & 0xff) + + return packer.make_can_msg("ASCMGasRegenCmd", bus, values) + + +def create_friction_brake_command(packer, bus, apply_brake, idx, enabled, near_stop, at_full_stop, CP): + mode = 0x1 + + # TODO: Understand this better. Volts and ICE Camera ACC cars are 0x1 when enabled with no brake + if enabled and CP.carFingerprint in (CAR.CHEVROLET_BOLT_EUV,): + mode = 0x9 + + if apply_brake > 0: + mode = 0xa + if at_full_stop: + mode = 0xd + + # TODO: this is to have GM bringing the car to complete stop, + # but currently it conflicts with OP controls, so turned off. Not set by all cars + #elif near_stop: + # mode = 0xb + + brake = (0x1000 - apply_brake) & 0xfff + checksum = (0x10000 - (mode << 12) - brake - idx) & 0xffff + + values = { + "RollingCounter": idx, + "FrictionBrakeMode": mode, + "FrictionBrakeChecksum": checksum, + "FrictionBrakeCmd": -apply_brake + } + + return packer.make_can_msg("EBCMFrictionBrakeCmd", bus, values) + + +def create_acc_dashboard_command(packer, bus, enabled, target_speed_kph, hud_control, fcw): + target_speed = min(target_speed_kph, 255) + + values = { + "ACCAlwaysOne": 1, + "ACCResumeButton": 0, + "ACCSpeedSetpoint": target_speed, + "ACCGapLevel": hud_control.leadDistanceBars * enabled, # 3 "far", 0 "inactive" + "ACCCmdActive": enabled, + "ACCAlwaysOne2": 1, + "ACCLeadCar": hud_control.leadVisible, + "FCWAlert": 0x3 if fcw else 0 + } + + return packer.make_can_msg("ASCMActiveCruiseControlStatus", bus, values) + + +def create_adas_time_status(bus, tt, idx): + dat = [(tt >> 20) & 0xff, (tt >> 12) & 0xff, (tt >> 4) & 0xff, + ((tt & 0xf) << 4) + (idx << 2)] + chksum = 0x1000 - dat[0] - dat[1] - dat[2] - dat[3] + chksum = chksum & 0xfff + dat += [0x40 + (chksum >> 8), chksum & 0xff, 0x12] + return CanData(0xa1, bytes(dat), bus) + + +def create_adas_steering_status(bus, idx): + dat = [idx << 6, 0xf0, 0x20, 0, 0, 0] + chksum = 0x60 + sum(dat) + dat += [chksum >> 8, chksum & 0xff] + return CanData(0x306, bytes(dat), bus) + + +def create_adas_accelerometer_speed_status(bus, speed_ms, idx): + spd = int(speed_ms * 16) & 0xfff + accel = 0 & 0xfff + # 0 if in park/neutral, 0x10 if in reverse, 0x08 for D/L + #stick = 0x08 + near_range_cutoff = 0x27 + near_range_mode = 1 if spd <= near_range_cutoff else 0 + far_range_mode = 1 - near_range_mode + dat = [0x08, spd >> 4, ((spd & 0xf) << 4) | (accel >> 8), accel & 0xff, 0] + chksum = 0x62 + far_range_mode + (idx << 2) + dat[0] + dat[1] + dat[2] + dat[3] + dat[4] + dat += [(idx << 5) + (far_range_mode << 4) + (near_range_mode << 3) + (chksum >> 8), chksum & 0xff] + return CanData(0x308, bytes(dat), bus) + + +def create_adas_headlights_status(packer, bus): + values = { + "Always42": 0x42, + "Always4": 0x4, + } + return packer.make_can_msg("ASCMHeadlight", bus, values) + + +def create_lka_icon_command(bus, active, critical, steer): + if active and steer == 1: + if critical: + dat = b"\x50\xc0\x14" + else: + dat = b"\x50\x40\x18" + elif active: + if critical: + dat = b"\x40\xc0\x14" + else: + dat = b"\x40\x40\x18" + else: + dat = b"\x00\x00\x00" + return CanData(0x104c006c, dat, bus) diff --git a/artifacts/package_runtime/iqdbc/car/gm/interface.py b/artifacts/package_runtime/iqdbc/car/gm/interface.py new file mode 100644 index 000000000..238a9923a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/gm/interface.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python3 +from math import fabs, exp +import numpy as np + +from iqdbc.car import get_safety_config, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.gm.carcontroller import CarController +from iqdbc.car.gm.carstate import CarState +from iqdbc.car.gm.radar_interface import RadarInterface, RADAR_HEADER_MSG, CAMERA_DATA_HEADER_MSG +from iqdbc.car.gm.values import CAR, CarControllerParams, EV_CAR, CAMERA_ACC_CAR, SDGM_CAR, ALT_ACCS, CanBus, GMSafetyFlags +from iqdbc.car.interfaces import CarInterfaceBase, TorqueFromLateralAccelCallbackType, LateralAccelFromTorqueCallbackType + +from iqdbc.lvbs.car.gm.iq_interface import IQCarInterface +from iqdbc.lvbs.car.gm.iq_values import GMFlagsIQ, GMSafetyFlagsIQ + +TransmissionType = structs.CarParams.TransmissionType +NetworkLocation = structs.CarParams.NetworkLocation + +# Bolt Non-ACC uses the 4th (d) tune parameter; stock tunes zero it out. +NON_LINEAR_TORQUE_PARAMS_IQ = { + CAR.CHEVROLET_BOLT_NON_ACC: [2.24, 1.1, 0.28, -0.07], + CAR.CHEVROLET_BOLT_NON_ACC_1ST_GEN: [1.8, 1.1, 0.3, -0.045], +} + +NON_LINEAR_TORQUE_PARAMS = { + CAR.CHEVROLET_BOLT_EUV: [2.6531724862969748, 1.0, 0.1919764879840985, 0.009054123646805178], + CAR.GMC_ACADIA: [4.78003305, 1.0, 0.3122, 0.05591772], + CAR.CHEVROLET_SILVERADO: [3.29974374, 1.0, 0.25571356, 0.0465122], + **NON_LINEAR_TORQUE_PARAMS_IQ, +} + + +class CarInterface(CarInterfaceBase, IQCarInterface): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + DRIVABLE_GEARS = (structs.CarState.GearShifter.sport, structs.CarState.GearShifter.low, + structs.CarState.GearShifter.eco, structs.CarState.GearShifter.manumatic) + + def __init__(self, CP, CP_IQ): + CarInterfaceBase.__init__(self, CP, CP_IQ) + IQCarInterface.__init__(self, CP, CarInterfaceBase) + + @staticmethod + def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed): + return CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX + + # Determined by iteratively plotting and minimizing error for f(angle, speed) = steer. + @staticmethod + def get_steer_feedforward_volt(desired_angle, v_ego): + desired_angle *= 0.02904609 + sigmoid = desired_angle / (1 + fabs(desired_angle)) + return 0.10006696 * sigmoid * (v_ego + 3.12485927) + + def get_steer_feedforward_function(self): + if self.CP.carFingerprint == CAR.CHEVROLET_VOLT: + return self.get_steer_feedforward_volt + else: + return CarInterfaceBase.get_steer_feedforward_default + + def get_lataccel_torque_siglin(self) -> tuple[list[float], np.ndarray]: + + def torque_from_lateral_accel_siglin_func(lateral_acceleration: float) -> float: + # The "lat_accel vs torque" relationship is assumed to be the sum of "sigmoid + linear" curves + # An important thing to consider is that the slope at 0 should be > 0 (ideally >1) + # This has big effect on the stability about 0 (noise when going straight) + non_linear_torque_params = NON_LINEAR_TORQUE_PARAMS.get(self.CP.carFingerprint) + assert non_linear_torque_params, "The params are not defined" + a, b, c, d = non_linear_torque_params + d = d if NON_LINEAR_TORQUE_PARAMS_IQ.get(self.CP.carFingerprint) else 0.0 + sig_input = a * lateral_acceleration + sig = np.sign(sig_input) * (1 / (1 + exp(-fabs(sig_input))) - 0.5) + steer_torque = (sig * b) + (lateral_acceleration * c) + d + return float(steer_torque) + + lataccel_values = np.arange(-5.0, 5.0, 0.01) + torque_values = [torque_from_lateral_accel_siglin_func(x) for x in lataccel_values] + assert min(torque_values) < -1 and max(torque_values) > 1, "The torque values should cover the range [-1, 1]" + return torque_values, lataccel_values + + def torque_from_lateral_accel(self) -> TorqueFromLateralAccelCallbackType: + if self.CP.carFingerprint in NON_LINEAR_TORQUE_PARAMS: + torque_values, lataccel_values = self.get_lataccel_torque_siglin() + + def torque_from_lateral_accel_siglin(lateral_acceleration: float, torque_params: structs.CarParams.LateralTorqueTuning): + return np.interp(lateral_acceleration, lataccel_values, torque_values) + return torque_from_lateral_accel_siglin + else: + return self.torque_from_lateral_accel_linear + + def lateral_accel_from_torque(self) -> LateralAccelFromTorqueCallbackType: + if self.CP.carFingerprint in NON_LINEAR_TORQUE_PARAMS: + torque_values, lataccel_values = self.get_lataccel_torque_siglin() + + def lateral_accel_from_torque_siglin(torque: float, torque_params: structs.CarParams.LateralTorqueTuning): + return np.interp(torque, torque_values, lataccel_values) + return lateral_accel_from_torque_siglin + else: + return self.lateral_accel_from_torque_linear + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "gm" + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.gm)] + ret.autoResumeSng = False + ret.enableBsm = 0x142 in fingerprint[CanBus.POWERTRAIN] + + if candidate in EV_CAR: + ret.transmissionType = TransmissionType.direct + ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.EV.value + else: + ret.transmissionType = TransmissionType.automatic + + ret.longitudinalTuning.kiBP = [5., 35.] + + if candidate in (CAMERA_ACC_CAR | SDGM_CAR): + ret.alphaLongitudinalAvailable = candidate not in SDGM_CAR + ret.networkLocation = NetworkLocation.fwdCamera + ret.radarUnavailable = True # no radar + ret.pcmCruise = True + ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.HW_CAM.value + ret.minEnableSpeed = -1 if candidate in SDGM_CAR else 5 * CV.KPH_TO_MS + ret.minSteerSpeed = 10 * CV.KPH_TO_MS + + # Tuning for experimental long + ret.longitudinalTuning.kiV = [2.0, 1.5] + + if alpha_long: + ret.pcmCruise = False + ret.openpilotLongitudinalControl = True + ret.safetyConfigs[0].safetyParam |= GMSafetyFlags.HW_CAM_LONG.value + + if candidate in ALT_ACCS: + ret.alphaLongitudinalAvailable = False + ret.openpilotLongitudinalControl = False + ret.minEnableSpeed = -1. # engage speed is decided by PCM + + else: # ASCM, OBD-II harness + ret.openpilotLongitudinalControl = True + ret.networkLocation = NetworkLocation.gateway + # LRR messages can take up to a few seconds to start sending after ignition, check camera data as well which starts earlier + ret.radarUnavailable = RADAR_HEADER_MSG not in fingerprint[CanBus.OBSTACLE] and CAMERA_DATA_HEADER_MSG not in fingerprint[CanBus.OBSTACLE] and not docs + ret.pcmCruise = False # stock non-adaptive cruise control is kept off + # supports stop and go, but initial engage must (conservatively) be above 18mph + ret.minEnableSpeed = 18 * CV.MPH_TO_MS + ret.minSteerSpeed = 7 * CV.MPH_TO_MS + + # Tuning + ret.longitudinalTuning.kiV = [2.4, 1.5] + + # These cars have been put into dashcam only due to both a lack of users and test coverage. + # These cars likely still work fine. Once a user confirms each car works and a test route is + # added to iqdbc/car/tests/routes.py, we can remove it from this list. + ret.dashcamOnly = candidate in {CAR.CADILLAC_ATS, CAR.HOLDEN_ASTRA, CAR.CHEVROLET_MALIBU, CAR.BUICK_REGAL} or \ + (ret.networkLocation == NetworkLocation.gateway and ret.radarUnavailable) + + # Start with a baseline tuning for all GM vehicles. Override tuning as needed in each model section below. + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.00]] + ret.lateralTuning.pid.kf = 0.00004 # full torque for 20 deg at 80mph means 0.00007818594 + ret.steerActuatorDelay = 0.1 # Default delay, not measured yet + + ret.steerLimitTimer = 0.4 + ret.longitudinalActuatorDelay = 0.5 # large delay to initially start braking + + if candidate == CAR.CHEVROLET_VOLT: + ret.lateralTuning.pid.kpBP = [0., 40.] + ret.lateralTuning.pid.kpV = [0., 0.17] + ret.lateralTuning.pid.kiBP = [0.] + ret.lateralTuning.pid.kiV = [0.] + ret.lateralTuning.pid.kf = 1. # get_steer_feedforward_volt() + ret.steerActuatorDelay = 0.2 + + elif candidate == CAR.GMC_ACADIA: + ret.minEnableSpeed = -1. # engage speed is decided by pcm + ret.steerActuatorDelay = 0.2 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.BUICK_LACROSSE: + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.CADILLAC_ESCALADE: + ret.minEnableSpeed = -1. # engage speed is decided by pcm + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate in (CAR.CADILLAC_ESCALADE_ESV, CAR.CADILLAC_ESCALADE_ESV_2019): + ret.minEnableSpeed = -1. # engage speed is decided by pcm + + if candidate == CAR.CADILLAC_ESCALADE_ESV: + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[10., 41.0], [10., 41.0]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.13, 0.24], [0.01, 0.02]] + ret.lateralTuning.pid.kf = 0.000045 + else: + ret.steerActuatorDelay = 0.2 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.CHEVROLET_BOLT_EUV: + ret.steerActuatorDelay = 0.2 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.CHEVROLET_SILVERADO: + # On the Bolt, the ECM and camera independently check that you are either above 5 kph or at a stop + # with foot on brake to allow engagement, but this platform only has that check in the camera. + # TODO: check if this is split by EV/ICE with more platforms in the future + if ret.openpilotLongitudinalControl: + ret.minEnableSpeed = -1. + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.CHEVROLET_EQUINOX: + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.CHEVROLET_TRAILBLAZER: + ret.steerActuatorDelay = 0.2 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.CADILLAC_XT4: + ret.steerActuatorDelay = 0.2 + ret.minSteerSpeed = 30 * CV.MPH_TO_MS + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.CHEVROLET_VOLT_2019: + ret.steerActuatorDelay = 0.2 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.CHEVROLET_TRAVERSE: + ret.steerActuatorDelay = 0.2 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.GMC_YUKON: + ret.steerActuatorDelay = 0.5 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + ret.dashcamOnly = True # Needs steerRatio, tireStiffness, and lat accel factor tuning + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + if candidate in (CAR.CHEVROLET_MALIBU_NON_ACC_9TH_GEN, CAR.CHEVROLET_BOLT_NON_ACC, CAR.CHEVROLET_BOLT_NON_ACC_1ST_GEN, + CAR.CHEVROLET_BOLT_NON_ACC_2ND_GEN, CAR.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN): + stock_cp.steerActuatorDelay = 0.2 + CarInterfaceBase.configure_torque_tune(candidate, stock_cp.lateralTuning) + elif candidate in (CAR.CHEVROLET_EQUINOX_NON_ACC_3RD_GEN, ): + CarInterfaceBase.configure_torque_tune(candidate, stock_cp.lateralTuning) + + # Non-ACC cars steer/long via the forward camera and pcmCruise, not the ASCM. + if ret.flags & GMFlagsIQ.NON_ACC: + stock_cp.dashcamOnly = False + stock_cp.alphaLongitudinalAvailable = False + stock_cp.networkLocation = NetworkLocation.fwdCamera + stock_cp.openpilotLongitudinalControl = False + stock_cp.pcmCruise = True + stock_cp.safetyConfigs[0].safetyParam |= GMSafetyFlags.HW_CAM.value + ret.iqSafetyFlags |= GMSafetyFlagsIQ.NON_ACC + stock_cp.minEnableSpeed = 24 * CV.MPH_TO_MS + stock_cp.minSteerSpeed = 3.0 + + # Untested Non-ACC platforms ship dashcam-only pending user validation. + if candidate in (CAR.CHEVROLET_BOLT_NON_ACC_2ND_GEN, CAR.CHEVROLET_EQUINOX_NON_ACC_3RD_GEN, + CAR.CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN, CAR.CADILLAC_CT6_NON_ACC_1ST_GEN, + CAR.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN, CAR.CADILLAC_XT5_NON_ACC_1ST_GEN): + stock_cp.dashcamOnly = True + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/gm/radar_interface.py b/artifacts/package_runtime/iqdbc/car/gm/radar_interface.py new file mode 100644 index 000000000..b030dbe44 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/gm/radar_interface.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +import math +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.gm.values import DBC, CanBus +from iqdbc.car.interfaces import RadarInterfaceBase + +RADAR_HEADER_MSG = 1120 # F_LRR_Obj_Header +CAMERA_DATA_HEADER_MSG = 1056 # F_Vision_Obj_Header +SLOT_1_MSG = RADAR_HEADER_MSG + 1 +NUM_SLOTS = 20 + +# Actually it's 0x47f, but can parser only reports +# messages that are present in DBC +LAST_RADAR_MSG = RADAR_HEADER_MSG + NUM_SLOTS + + +def create_radar_can_parser(car_fingerprint): + # C1A-ARS3-A by Continental + radar_targets = list(range(SLOT_1_MSG, SLOT_1_MSG + NUM_SLOTS)) + signals = list(zip(['FLRRNumValidTargets', + 'FLRRSnsrBlckd', 'FLRRYawRtPlsblityFlt', + 'FLRRHWFltPrsntInt', 'FLRRAntTngFltPrsnt', + 'FLRRAlgnFltPrsnt', 'FLRRSnstvFltPrsntInt'] + + ['TrkRange'] * NUM_SLOTS + ['TrkRangeRate'] * NUM_SLOTS + + ['TrkRangeAccel'] * NUM_SLOTS + ['TrkAzimuth'] * NUM_SLOTS + + ['TrkWidth'] * NUM_SLOTS + ['TrkObjectID'] * NUM_SLOTS, + [RADAR_HEADER_MSG] * 7 + radar_targets * 6, strict=True)) + + messages = list({(s[1], 14) for s in signals}) + + return CANParser(DBC[car_fingerprint][Bus.radar], messages, CanBus.OBSTACLE) + + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + + self.rcp = None if CP.radarUnavailable else create_radar_can_parser(CP.carFingerprint) + + self.trigger_msg = LAST_RADAR_MSG + self.updated_messages = set() + + def update(self, can_strings): + if self.rcp is None: + return super().update(None) + + vls = self.rcp.update(can_strings) + self.updated_messages.update(vls) + + if self.trigger_msg not in self.updated_messages: + return None + + ret = structs.RadarData() + header = self.rcp.vl[RADAR_HEADER_MSG] + fault = header['FLRRSnsrBlckd'] or header['FLRRSnstvFltPrsntInt'] or \ + header['FLRRYawRtPlsblityFlt'] or header['FLRRHWFltPrsntInt'] or \ + header['FLRRAntTngFltPrsnt'] or header['FLRRAlgnFltPrsnt'] + if not self.rcp.can_valid: + ret.errors.canError = True + if fault: + ret.errors.radarFault = True + + currentTargets = set() + num_targets = header['FLRRNumValidTargets'] + + # Not all radar messages describe targets, + # no need to monitor all of the self.rcp.msgs_upd + for ii in self.updated_messages: + if ii == RADAR_HEADER_MSG: + continue + + if num_targets == 0: + break + + cpt = self.rcp.vl[ii] + # Zero distance means it's an empty target slot + if cpt['TrkRange'] > 0.0: + targetId = cpt['TrkObjectID'] + currentTargets.add(targetId) + if targetId not in self.pts: + self.pts[targetId] = structs.RadarData.RadarPoint() + self.pts[targetId].trackId = targetId + distance = cpt['TrkRange'] + self.pts[targetId].dRel = distance # from front of car + # From driver's pov, left is positive + self.pts[targetId].yRel = math.sin(cpt['TrkAzimuth'] * CV.DEG_TO_RAD) * distance + self.pts[targetId].vRel = cpt['TrkRangeRate'] + self.pts[targetId].aRel = float('nan') + self.pts[targetId].yvRel = float('nan') + + for oldTarget in list(self.pts.keys()): + if oldTarget not in currentTargets: + del self.pts[oldTarget] + + ret.points = list(self.pts.values()) + self.updated_messages.clear() + return ret diff --git a/artifacts/package_runtime/iqdbc/car/gm/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/gm/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/gm/tests/test_gm.py b/artifacts/package_runtime/iqdbc/car/gm/tests/test_gm.py new file mode 100644 index 000000000..41510ff35 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/gm/tests/test_gm.py @@ -0,0 +1,20 @@ +from parameterized import parameterized + +from iqdbc.car.gm.fingerprints import FINGERPRINTS +from iqdbc.car.gm.values import CAMERA_ACC_CAR, GM_RX_OFFSET + +CAMERA_DIAGNOSTIC_ADDRESS = 0x24b + + +class TestGMFingerprint: + @parameterized.expand(FINGERPRINTS.items()) + def test_can_fingerprints(self, car_model, fingerprints): + assert len(fingerprints) > 0 + + assert all(len(finger) for finger in fingerprints) + + # The camera can sometimes be communicating on startup + if car_model in CAMERA_ACC_CAR: + for finger in fingerprints: + for required_addr in (CAMERA_DIAGNOSTIC_ADDRESS, CAMERA_DIAGNOSTIC_ADDRESS + GM_RX_OFFSET): + assert finger.get(required_addr) == 8, required_addr diff --git a/artifacts/package_runtime/iqdbc/car/gm/values.py b/artifacts/package_runtime/iqdbc/car/gm/values.py new file mode 100644 index 000000000..62c06118f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/gm/values.py @@ -0,0 +1,343 @@ +from dataclasses import dataclass, field +from enum import Enum, IntFlag + +from iqdbc.car import Bus, PlatformConfig, DbcDict, Platforms, CarSpecs +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column, SupportType +from iqdbc.lvbs.car.gm.iq_values import GMFlagsIQ +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries + +Ecu = CarParams.Ecu + + +class CarControllerParams: + STEER_MAX = 300 # GM limit is 3Nm. Used by carcontroller to generate LKA output + STEER_STEP = 3 # Active control frames per command (~33hz) + INACTIVE_STEER_STEP = 10 # Inactive control frames per command (10hz) + STEER_DELTA_UP = 10 # Delta rates require review due to observed EPS weakness + STEER_DELTA_DOWN = 15 + STEER_DRIVER_ALLOWANCE = 65 + STEER_DRIVER_MULTIPLIER = 4 + STEER_DRIVER_FACTOR = 100 + NEAR_STOP_BRAKE_PHASE = 0.5 # m/s + + # Heartbeat for dash "Service Adaptive Cruise" and "Service Front Camera" + ADAS_KEEPALIVE_STEP = 100 + CAMERA_KEEPALIVE_STEP = 100 + + # Allow small margin below -3.5 m/s^2 from ISO 15622:2018 since we + # perform the closed loop control, and might need some + # to apply some more braking if we're on a downhill slope. + # Our controller should still keep the 2 second average above + # -3.5 m/s^2 as per planner limits + ACCEL_MAX = 2. # m/s^2 + ACCEL_MIN = -4. # m/s^2 + + def __init__(self, CP): + # Gas/brake lookups + self.MAX_BRAKE = 400 # ~ -4.0 m/s^2 with regen + + if CP.carFingerprint in (CAMERA_ACC_CAR | SDGM_CAR): + self.MAX_GAS = 1346.0 + self.MAX_ACC_REGEN = -540.0 + self.INACTIVE_REGEN = -500.0 + # Camera ACC vehicles have no regen while enabled. + # Camera transitions to MAX_ACC_REGEN from zero gas and uses friction brakes instantly + max_regen_acceleration = 0. + + else: + self.MAX_GAS = 1018.0 # Safety limit, not ACC max. Stock ACC >2042 from standstill. + self.MAX_ACC_REGEN = -650.0 # Max ACC regen is slightly less than max paddle regen + self.INACTIVE_REGEN = -650.0 + # ICE has much less engine braking force compared to regen in EVs, + # lower threshold removes some braking deadzone + max_regen_acceleration = -1. if CP.carFingerprint in EV_CAR else -0.1 + + self.GAS_LOOKUP_BP = [max_regen_acceleration, 0., self.ACCEL_MAX] + self.GAS_LOOKUP_V = [self.MAX_ACC_REGEN, 0., self.MAX_GAS] + + self.BRAKE_LOOKUP_BP = [self.ACCEL_MIN, max_regen_acceleration] + self.BRAKE_LOOKUP_V = [self.MAX_BRAKE, 0.] + + +class GMSafetyFlags(IntFlag): + HW_CAM = 1 + HW_CAM_LONG = 2 + EV = 4 + + +class Footnote(Enum): + SETUP = CarFootnote( + "See more setup details for GM.", + Column.MAKE, setup_note=True) + + +@dataclass +class GMCarDocs(CarDocs): + package: str = "Adaptive Cruise Control (ACC)" + + def init_make(self, CP: CarParams): + if CP.networkLocation == CarParams.NetworkLocation.fwdCamera: + if CP.carFingerprint in SDGM_CAR: + self.car_parts = CarParts.common([CarHarness.gmsdgm]) + else: + self.car_parts = CarParts.common([CarHarness.gm]) + else: + self.footnotes.insert(0, Footnote.SETUP) + self.car_parts = CarParts.common([CarHarness.obd_ii]) + + +@dataclass(frozen=True, kw_only=True) +class GMCarSpecs(CarSpecs): + tireStiffnessFactor: float = 0.444 # not optimized yet + + +@dataclass +class GMPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: { + Bus.pt: 'gm_global_a_powertrain_generated', + Bus.radar: 'gm_global_a_object', + Bus.chassis: 'gm_global_a_chassis', + }) + + +@dataclass +class GMASCMPlatformConfig(GMPlatformConfig): + def init(self): + # ASCM is supported, but due to a janky install and hardware configuration, we are not showing in the car docs + self.car_docs = [] + + +@dataclass +class GMSDGMPlatformConfig(GMPlatformConfig): + def init(self): + # Don't show in docs until the harness is sold. See https://github.com/commaai/openpilot/issues/32471 + self.car_docs = [] + + +@dataclass +class GMNonAccCarDocs(GMCarDocs): + package: str = "No Adaptive Cruise Control (Non-ACC)" + support_type: SupportType = SupportType.COMMUNITY + support_link: str = "community" + + +@dataclass +class GMNonSccPlatformConfig(GMPlatformConfig): + def init(self): + self.iq_flags |= GMFlagsIQ.NON_ACC + + +class CAR(Platforms): + HOLDEN_ASTRA = GMASCMPlatformConfig( + [GMCarDocs("Holden Astra 2017")], + GMCarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), + ) + CHEVROLET_VOLT = GMASCMPlatformConfig( + [GMCarDocs("Chevrolet Volt 2017-18", min_enable_speed=0, video="https://youtu.be/QeMCN_4TFfQ")], + GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45, tireStiffnessFactor=0.469), + ) + CADILLAC_ATS = GMASCMPlatformConfig( + [GMCarDocs("Cadillac ATS Premium Performance 2018")], + GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), + ) + CHEVROLET_MALIBU = GMASCMPlatformConfig( + [GMCarDocs("Chevrolet Malibu Premier 2017")], + GMCarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), + ) + GMC_ACADIA = GMASCMPlatformConfig( + [GMCarDocs("GMC Acadia 2018", video="https://www.youtube.com/watch?v=0ZN6DdsBUZo")], + GMCarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), + ) + BUICK_LACROSSE = GMASCMPlatformConfig( + [GMCarDocs("Buick LaCrosse 2017-19", "Driver Confidence Package 2")], + GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), + ) + BUICK_REGAL = GMASCMPlatformConfig( + [GMCarDocs("Buick Regal Essence 2018")], + GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), + ) + CADILLAC_ESCALADE = GMASCMPlatformConfig( + [GMCarDocs("Cadillac Escalade 2017", "Driver Assist Package")], + GMCarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), + ) + CADILLAC_ESCALADE_ESV = GMASCMPlatformConfig( + [GMCarDocs("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS")], + GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0), + ) + CADILLAC_ESCALADE_ESV_2019 = GMASCMPlatformConfig( + [GMCarDocs("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS")], + CADILLAC_ESCALADE_ESV.specs, + ) + CHEVROLET_BOLT_EUV = GMPlatformConfig( + [ + GMCarDocs("Chevrolet Bolt EUV 2022-23", "Premier or Premier Redline Trim, without Super Cruise Package", video="https://youtu.be/xvwzGMUA210"), + GMCarDocs("Chevrolet Bolt EV 2022-23", "2LT Trim with Adaptive Cruise Control Package"), + ], + GMCarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), + ) + CHEVROLET_SILVERADO = GMPlatformConfig( + [ + GMCarDocs("Chevrolet Silverado 1500 2020-21", "Safety Package II"), + GMCarDocs("GMC Sierra 1500 2020-21", "Driver Alert Package II", video="https://youtu.be/5HbNoBLzRwE"), + ], + GMCarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3, tireStiffnessFactor=1.0), + ) + CHEVROLET_EQUINOX = GMPlatformConfig( + [GMCarDocs("Chevrolet Equinox 2019-22")], + GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), + ) + CHEVROLET_TRAILBLAZER = GMPlatformConfig( + [GMCarDocs("Chevrolet Trailblazer 2021-22")], + GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), + ) + CADILLAC_XT4 = GMSDGMPlatformConfig( + [GMCarDocs("Cadillac XT4 2023", "Driver Assist Package")], + GMCarSpecs(mass=1660, wheelbase=2.78, steerRatio=14.4, centerToFrontRatio=0.4), + ) + CHEVROLET_VOLT_2019 = GMSDGMPlatformConfig( + [GMCarDocs("Chevrolet Volt 2019", "Adaptive Cruise Control (ACC) & LKAS")], + GMCarSpecs(mass=1607, wheelbase=2.69, steerRatio=15.7, centerToFrontRatio=0.45), + ) + CHEVROLET_TRAVERSE = GMSDGMPlatformConfig( + [GMCarDocs("Chevrolet Traverse 2022-23", "RS, Premier, or High Country Trim")], + GMCarSpecs(mass=1955, wheelbase=3.07, steerRatio=17.9, centerToFrontRatio=0.4), + ) + GMC_YUKON = GMPlatformConfig( + [GMCarDocs("GMC Yukon 2019-20", "Adaptive Cruise Control (ACC) & LKAS")], + GMCarSpecs(mass=2490, wheelbase=2.94, steerRatio=17.3, centerToFrontRatio=0.5, tireStiffnessFactor=1.0), + ) + + # IQ.Pilot Non-ACC camera-harness ports (no factory adaptive cruise). + CHEVROLET_BOLT_NON_ACC = GMNonSccPlatformConfig( + [GMNonAccCarDocs("Chevrolet Bolt EV Non-ACC 2017")], + CHEVROLET_BOLT_EUV.specs, + ) + CHEVROLET_BOLT_NON_ACC_1ST_GEN = GMNonSccPlatformConfig( + [GMNonAccCarDocs("Chevrolet Bolt EV Non-ACC 2018-21")], + CHEVROLET_BOLT_EUV.specs, + ) + CHEVROLET_BOLT_NON_ACC_2ND_GEN = GMNonSccPlatformConfig( + [ + GMNonAccCarDocs("Chevrolet Bolt EUV LT Non-ACC 2022-23"), + GMNonAccCarDocs("Chevrolet Bolt EV LT Non-ACC 2022-23"), + ], + CHEVROLET_BOLT_EUV.specs, + ) + CHEVROLET_EQUINOX_NON_ACC_3RD_GEN = GMNonSccPlatformConfig( + [GMNonAccCarDocs("Chevrolet Equinox Non-ACC 2019-22")], + CHEVROLET_EQUINOX.specs, + ) + CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN = GMNonSccPlatformConfig( + [GMNonAccCarDocs("Chevrolet Suburban Non-ACC 2016-20")], + CarSpecs(mass=2731, wheelbase=3.302, steerRatio=17.3, centerToFrontRatio=0.49), + ) + CADILLAC_CT6_NON_ACC_1ST_GEN = GMNonSccPlatformConfig( + [GMNonAccCarDocs("Cadillac CT6 Non-ACC 2017-18")], + CarSpecs(mass=2358, wheelbase=3.11, steerRatio=17.7, centerToFrontRatio=0.4), + ) + CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN = GMNonSccPlatformConfig( + [GMNonAccCarDocs("Chevrolet Trailblazer Non-ACC 2021-22")], + CHEVROLET_TRAILBLAZER.specs, + ) + CHEVROLET_MALIBU_NON_ACC_9TH_GEN = GMNonSccPlatformConfig( + [GMNonAccCarDocs("Chevrolet Malibu Non-ACC 2016-23")], + CarSpecs(mass=1450, wheelbase=2.8, steerRatio=15.8, centerToFrontRatio=0.4), + ) + CADILLAC_XT5_NON_ACC_1ST_GEN = GMNonSccPlatformConfig( + [GMNonAccCarDocs("Cadillac XT5 Non-ACC 2018")], + CarSpecs(mass=1810, wheelbase=2.86, steerRatio=16.34, centerToFrontRatio=0.5), + ) + + +class CruiseButtons: + INIT = 0 + UNPRESS = 1 + RES_ACCEL = 2 + DECEL_SET = 3 + MAIN = 5 + CANCEL = 6 + + +class AccState: + OFF = 0 + ACTIVE = 1 + FAULTED = 3 + STANDSTILL = 4 + + +class CanBus: + POWERTRAIN = 0 + OBSTACLE = 1 + CAMERA = 2 + CHASSIS = 2 + LOOPBACK = 128 + DROPPED = 192 + + +# In a Data Module, an identifier is a string used to recognize an object, +# either by itself or together with the identifiers of parent objects. +# Each returns a 4 byte hex representation of the decimal part number. `b"\x02\x8c\xf0'"` -> 42790951 +GM_BOOT_SOFTWARE_PART_NUMER_REQUEST = b'\x1a\xc0' # likely does not contain anything useful +GM_SOFTWARE_MODULE_1_REQUEST = b'\x1a\xc1' +GM_SOFTWARE_MODULE_2_REQUEST = b'\x1a\xc2' +GM_SOFTWARE_MODULE_3_REQUEST = b'\x1a\xc3' + +# Part number of XML data file that is used to configure ECU +GM_XML_DATA_FILE_PART_NUMBER = b'\x1a\x9c' +GM_XML_CONFIG_COMPAT_ID = b'\x1a\x9b' # used to know if XML file is compatible with the ECU software/hardware + +# This DID is for identifying the part number that reflects the mix of hardware, +# software, and calibrations in the ECU when it first arrives at the vehicle assembly plant. +# If there's an Alpha Code, it's associated with this part number and stored in the DID $DB. +GM_END_MODEL_PART_NUMBER_REQUEST = b'\x1a\xcb' +GM_END_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST = b'\x1a\xdb' +GM_BASE_MODEL_PART_NUMBER_REQUEST = b'\x1a\xcc' +GM_BASE_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST = b'\x1a\xdc' +GM_FW_RESPONSE = b'\x5a' + +GM_FW_REQUESTS = [ + GM_BOOT_SOFTWARE_PART_NUMER_REQUEST, + GM_SOFTWARE_MODULE_1_REQUEST, + GM_SOFTWARE_MODULE_2_REQUEST, + GM_SOFTWARE_MODULE_3_REQUEST, + GM_XML_DATA_FILE_PART_NUMBER, + GM_XML_CONFIG_COMPAT_ID, + GM_END_MODEL_PART_NUMBER_REQUEST, + GM_END_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST, + GM_BASE_MODEL_PART_NUMBER_REQUEST, + GM_BASE_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST, +] + +GM_RX_OFFSET = 0x400 + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[request for req in GM_FW_REQUESTS for request in [ + Request( + [StdQueries.SHORT_TESTER_PRESENT_REQUEST, req], + [StdQueries.SHORT_TESTER_PRESENT_RESPONSE, GM_FW_RESPONSE + bytes([req[-1]])], + rx_offset=GM_RX_OFFSET, + bus=0, + logging=True, + ), + ]], + extra_ecus=[(Ecu.fwdCamera, 0x24b, None)], +) + +# TODO: detect most of these sets live +EV_CAR = {CAR.CHEVROLET_VOLT, CAR.CHEVROLET_VOLT_2019, CAR.CHEVROLET_BOLT_EUV, + # Non-ACC EV ports + CAR.CHEVROLET_BOLT_NON_ACC, CAR.CHEVROLET_BOLT_NON_ACC_1ST_GEN, CAR.CHEVROLET_BOLT_NON_ACC_2ND_GEN} + +# We're integrated at the camera with VOACC on these cars (instead of ASCM w/ OBD-II harness) +CAMERA_ACC_CAR = {CAR.CHEVROLET_BOLT_EUV, CAR.CHEVROLET_SILVERADO, CAR.CHEVROLET_EQUINOX, CAR.CHEVROLET_TRAILBLAZER, CAR.GMC_YUKON} + +# Alt ASCMActiveCruiseControlStatus +ALT_ACCS = {CAR.GMC_YUKON} + +# We're integrated at the Safety Data Gateway Module on these cars +SDGM_CAR = {CAR.CADILLAC_XT4, CAR.CHEVROLET_VOLT_2019, CAR.CHEVROLET_TRAVERSE} + +STEER_THRESHOLD = 1.0 + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/honda/__init__.py b/artifacts/package_runtime/iqdbc/car/honda/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/honda/carcontroller.py b/artifacts/package_runtime/iqdbc/car/honda/carcontroller.py new file mode 100644 index 000000000..4be23b889 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/carcontroller.py @@ -0,0 +1,490 @@ +import numpy as np +import math + +from iqdbc.can import CANPacker +from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, DT_CTRL, rate_limit, make_tester_present_msg, structs +from iqdbc.car.common.pid import PIDController +from iqdbc.car.honda import dash_lane, dash_objects, hondacan +from iqdbc.car.honda.values import CAR, CruiseButtons, CruiseSettings, HONDA_BOSCH, HONDA_BOSCH_CANFD, HONDA_BOSCH_RADARLESS, \ + HONDA_BOSCH_TJA_CONTROL, HONDA_NIDEC_ALT_PCM_ACCEL, CarControllerParams +from iqdbc.car.interfaces import CarControllerBase + +from iqdbc.lvbs.car.honda.aol import AolCarController +from iqdbc.lvbs.car.honda.gas_interceptor import GasInterceptorCarController + +VisualAlert = structs.CarControl.HUDControl.VisualAlert +LongCtrlState = structs.CarControl.Actuators.LongControlState + + +def compute_gb_honda_bosch(accel, speed): + # TODO returns 0s, is unused + return 0.0, 0.0 + + +def compute_gb_honda_nidec(accel, speed): + creep_brake = 0.0 + creep_speed = 2.3 + creep_brake_value = 0.15 + if speed < creep_speed: + creep_brake = (creep_speed - speed) / creep_speed * creep_brake_value + gb = float(accel) / 4.8 - creep_brake + return np.clip(gb, 0.0, 1.0), np.clip(-gb, 0.0, 1.0) + + +def compute_gas_brake(accel, speed, fingerprint): + if fingerprint in HONDA_BOSCH: + return compute_gb_honda_bosch(accel, speed) + else: + return compute_gb_honda_nidec(accel, speed) + + +# TODO not clear this does anything useful +def actuator_hysteresis(brake, braking, brake_steady, v_ego, car_fingerprint): + # hyst params + brake_hyst_on = 0.02 # to activate brakes exceed this value + brake_hyst_off = 0.005 # to deactivate brakes below this value + brake_hyst_gap = 0.01 # don't change brake command for small oscillations within this value + + # *** hysteresis logic to avoid brake blinking. go above 0.1 to trigger + if (brake < brake_hyst_on and not braking) or brake < brake_hyst_off: + brake = 0. + braking = brake > 0. + + # for small brake oscillations within brake_hyst_gap, don't change the brake command + if brake == 0.: + brake_steady = 0. + elif brake > brake_steady + brake_hyst_gap: + brake_steady = brake - brake_hyst_gap + elif brake < brake_steady - brake_hyst_gap: + brake_steady = brake + brake_hyst_gap + brake = brake_steady + + return brake, braking, brake_steady + + +def brake_pump_hysteresis(apply_brake, apply_brake_last, last_pump_ts, ts): + pump_on = False + + # reset pump timer if: + # - there is an increment in brake request + # - we are applying steady state brakes and we haven't been running the pump + # for more than 20s (to prevent pressure bleeding) + if apply_brake > apply_brake_last or (ts - last_pump_ts > 20. and apply_brake > 0): + last_pump_ts = ts + + # once the pump is on, run it for at least 0.2s + if ts - last_pump_ts < 0.2 and apply_brake > 0: + pump_on = True + + return pump_on, last_pump_ts + + +def process_hud_alert(hud_alert): + alert_fcw = False + alert_steer_required = False + + # Make sure FCW is prioritized over steering required + # TODO: implement separate available LDW alert + if hud_alert == VisualAlert.fcw: + alert_fcw = True + elif hud_alert in (VisualAlert.steerRequired, VisualAlert.ldw): + alert_steer_required = True + + return alert_fcw, alert_steer_required + + +class CarController(CarControllerBase, AolCarController, GasInterceptorCarController): + def __init__(self, dbc_names, CP, CP_IQ): + CarControllerBase.__init__(self, dbc_names, CP, CP_IQ) + AolCarController.__init__(self) + GasInterceptorCarController.__init__(self, CP, CP_IQ) + self.packer = CANPacker(dbc_names[Bus.pt]) + self.params = CarControllerParams(CP) + self.CAN = hondacan.CanBus(CP) + self.tja_control = CP.carFingerprint in HONDA_BOSCH_TJA_CONTROL + + self.lane_renderer = dash_lane.LanePathRenderer() + self.dash_object_author = dash_objects.DashObjectAuthor() + self.rendered_lane = dash_lane.RenderedLane() + self.lkas_hud_key = None + self.lkas_state_change_frames = 0 + + self.braking = False + self.brake_steady = 0. + self.brake_last = 0. + self.apply_brake_last = 0 + self.last_pump_ts = 0. + self.stopping_counter = 0 + + self.accel = 0.0 + self.speed = 0.0 + self.gas = 0.0 + self.brake = 0.0 + self.last_torque = 0.0 + self.bosch_last_gas = 0 + + self.lkas_button_send_remaining = 0 + self.last_lkas_button_frame = 0 + self.radar_disable_counter = 0 + self.radar_mux = 0 + # stock RADAR_HUD_CANFD raises its CMBS bit only for a short burst after ACC engages; 10Hz hud ticks + self.radar_hud_pulse = 0 + self.last_acc_enabled = False + + self.gasfactor = 1.0 + self.gasfactor_before_maxgas = 1.0 + self.windfactor = 1.0 + self.windfactor_before_maxgas = 1.0 + self.windfactor_before_brake = 0.0 + self.pitch = 0.0 + + self.brake_pid = PIDController(k_p=0.0, k_i=1.0, pos_limit=0.0, neg_limit=-2.0, rate=50) + self.brake_pid.reset() + + def update(self, CC, CC_IQ, CS, now_nanos): + AolCarController.update(self, self.CP, CC, CC_IQ) + gas_pedal_force = 0.0 + min_gas = self.params.BOSCH_GAS_LOOKUP_BP[0] + actuators = CC.actuators + hud_control = CC.hudControl + hud_v_cruise = hud_control.setSpeed / CS.v_cruise_factor if hud_control.speedVisible else 255 + pcm_cancel_cmd = CC.cruiseControl.cancel + + if len(CC.orientationNED) == 3: + self.pitch = CC.orientationNED[1] + hill_brake = math.sin(self.pitch) * ACCELERATION_DUE_TO_GRAVITY + + if CC.longActive: + accel = actuators.accel + gas, brake = compute_gas_brake(actuators.accel + hill_brake, CS.out.vEgo, self.CP.carFingerprint) + else: + accel = 0.0 + gas, brake = 0.0, 0.0 + + # *** rate limit steer *** + limited_torque = rate_limit(actuators.torque, self.last_torque, -self.params.STEER_DELTA_DOWN * DT_CTRL, + self.params.STEER_DELTA_UP * DT_CTRL) + self.last_torque = limited_torque + + # *** apply brake hysteresis *** + pre_limit_brake, self.braking, self.brake_steady = actuator_hysteresis(brake, self.braking, self.brake_steady, + CS.out.vEgo, self.CP.carFingerprint) + + # *** rate limit after the enable check *** + self.brake_last = rate_limit(pre_limit_brake, self.brake_last, -2., 3 * DT_CTRL) + + # vehicle hud display, wait for one update from 10Hz 0x304 msg + alert_fcw, alert_steer_required = process_hud_alert(hud_control.visualAlert) + + # **** process the car messages **** + + # steer torque is converted back to CAN reference (positive when steering right) + apply_torque = int(np.interp(-limited_torque * self.params.STEER_MAX, + self.params.STEER_LOOKUP_BP, self.params.STEER_LOOKUP_V)) + + # Send CAN commands + can_sends = [] + + if self.CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) and self.CP.openpilotLongitudinalControl: + if self.CP.carFingerprint in HONDA_BOSCH_CANFD and CS.stock_acc_alive: + # CAN FD: the radar is silenced from here rather than from CarInterface.init(), and only once + # the comma relay is confirmed open: init() ran under the ELM327 safety mode, so the + # replacement ACC_CONTROL stream was blocked until the safety-mode switch landed, and whenever + # that took longer than ~110ms after radar silence the brake module latched CRUISE_FAULT for + # the whole drive. With the relay open the replacement stream starts within a few frames of + # radar silence (see CS.stock_acc_alive), well inside the fault threshold + if CS.canfd_relay_open: + if self.radar_disable_counter % 50 == 0: + # UDS extended diagnostic session, required before CommunicationControl + can_sends.append((0x18DAB0F1, b'\x02\x10\x03\x00\x00\x00\x00\x00', self.CAN.pt)) + elif self.radar_disable_counter % 50 == 5: + # UDS CommunicationControl disableRxAndTx (0x80 suppresses the response), retried every + # 0.5s until the radar goes silent + can_sends.append((0x18DAB0F1, b'\x03\x28\x83\x03\x00\x00\x00\x00', self.CAN.pt)) + self.radar_disable_counter += 1 + elif self.frame % 10 == 0: + # tester present - w/ no response (keeps radar disabled) + can_sends.append(make_tester_present_msg(0x18DAB0F1, self.CAN.pt, suppress_response=True)) + + # simulate the disabled canfd radar to prevent faults. These look-alikes are consumed by both the + # camera (behind the relay, on the camera bus) and the powertrain: openpilot's own TX is not + # forwarded across the open relay, so each frame is packed exactly once (the packer's + # counter/checksum only advance once per cycle) and the identical bytes are mirrored onto both + # buses (re-packing would double-increment the counter and desync the buses). While the stock + # radar is still transmitting it authors all of these itself + if self.CP.carFingerprint in HONDA_BOSCH_CANFD and self.CP.openpilotLongitudinalControl and not CS.stock_acc_alive: + if CC.enabled and not self.last_acc_enabled: + self.radar_hud_pulse = 30 # ~3s at 10Hz, matching the stock 2-6s engage burst + self.last_acc_enabled = CC.enabled + radar_msgs = [] + if CS.hud_tick: + radar_msgs.append(hondacan.create_radar_hud_canfd(self.packer, self.CAN.pt, CC.enabled, self.radar_hud_pulse > 0)) + if self.radar_hud_pulse > 0: + self.radar_hud_pulse -= 1 + if CS.supp_tick: + radar_msgs.append(hondacan.create_canfd_supplemental(self.packer, self.CAN.pt)) + if CS.radar_50hz_tick: + # Cycle the radar MUX through the stock banks: 1-10, 17-26, 33-42, 49-58. This counter also + # drives the LANE_PATH/HUD_OBJECTS mux below: it advances exactly one step per transmitted + # frame, so the sweep stays contiguous even when a tick is missed (a frame-derived mux left + # holes in the sweep the stock radar never produces). + # These must be elif: a bare `if` at a bank start would fall through to the increment, + # skipping the bank-start values (17, 33, 49) + if self.radar_mux >= 58: + self.radar_mux = 1 + elif self.radar_mux == 10: + self.radar_mux = 17 + elif self.radar_mux == 26: + self.radar_mux = 33 + elif self.radar_mux == 42: + self.radar_mux = 49 + else: + self.radar_mux += 1 + if CS.radar_5hz_tick: + # RADAR_LEAD's LANE_PATH_LENGTH must track the valid-point count of the LANE_PATH sweep being + # authored, and LEFT_LANE/RIGHT_LANE the per-side line-detected status, in lockstep with the + # stock radar's behavior or the dash won't draw the lane lines + radar_msgs.extend(hondacan.create_canfd_5hz_radar_messages(self.packer, self.CAN.pt, CS.radar_ref_counter, + dash_lane.canfd_lane_length(self.rendered_lane), + dash_lane.LANE_LINE_ON if self.rendered_lane.left_line else 0, + dash_lane.LANE_LINE_ON if self.rendered_lane.right_line else 0)) + + for addr, dat, _ in radar_msgs: + can_sends.append((addr, dat, self.CAN.pt)) + can_sends.append((addr, dat, self.CAN.camera)) + + # Send steering command. + can_sends.append(hondacan.create_steering_control(self.packer, self.CAN, apply_torque, CC.latActive, self.tja_control)) + + # wind brake from air resistance decel at high speed + wind_brake = np.interp(CS.out.vEgo, [0.0, 2.3, 35.0], [0.001, 0.002, 0.15]) * self.windfactor # not in m/s2 units + wind_brake_ms2 = np.interp(CS.out.vEgo, [0.0, 13.4, 22.4, 31.3, 40.2], [0.000, 0.049, 0.136, 0.267, 0.441]) # in m/s2 units + # all of this is only relevant for HONDA NIDEC + max_accel = np.interp(CS.out.vEgo, self.params.NIDEC_MAX_ACCEL_BP, self.params.NIDEC_MAX_ACCEL_V) + # TODO this 1.44 is just to maintain previous behavior + pcm_speed_BP = [-wind_brake, + -wind_brake * (3 / 4), + 0.0, + 0.5] + # The Honda ODYSSEY seems to have different PCM_ACCEL + # msgs, is it other cars too? + if self.CP_IQ.enableGasInterceptor or not CC.longActive: + pcm_speed = 0.0 + pcm_accel = int(0.0) + elif self.CP.carFingerprint in HONDA_NIDEC_ALT_PCM_ACCEL: + pcm_speed_V = [0.0, + np.clip(CS.out.vEgo - 3.0, 0.0, 100.0), + np.clip(CS.out.vEgo + 0.0, 0.0, 100.0), + np.clip(CS.out.vEgo + 5.0, 0.0, 100.0)] + pcm_speed = float(np.interp(gas - brake, pcm_speed_BP, pcm_speed_V)) + pcm_accel = int(1.0 * self.params.NIDEC_GAS_MAX) + else: + pcm_speed_V = [0.0, + np.clip(CS.out.vEgo - 2.0, 0.0, 100.0), + np.clip(CS.out.vEgo + 2.0, 0.0, 100.0), + np.clip(CS.out.vEgo + 5.0, 0.0, 100.0)] + pcm_speed = float(np.interp(gas - brake, pcm_speed_BP, pcm_speed_V)) + pcm_accel = int(np.clip((accel / 1.44) / max_accel, 0.0, 1.0) * self.params.NIDEC_GAS_MAX) + + if not self.CP.openpilotLongitudinalControl: + if self.frame % 2 == 0 and self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD: + can_sends.append(hondacan.create_bosch_supplemental_1(self.packer, self.CAN)) + # If using stock ACC, spam cancel command to kill gas when OP disengages. + if pcm_cancel_cmd: + can_sends.append(hondacan.spam_buttons_command(self.packer, self.CAN, CruiseButtons.CANCEL, 0, CS.scm_ambient_light, + self.CP.carFingerprint)) + elif CC.cruiseControl.resume: + can_sends.append(hondacan.spam_buttons_command(self.packer, self.CAN, CruiseButtons.RES_ACCEL, 0, CS.scm_ambient_light, + self.CP.carFingerprint)) + + else: + # Send gas and brake commands. + if self.frame % 2 == 0: + ts = self.frame * DT_CTRL + + if self.CP.carFingerprint in HONDA_BOSCH: + # low-speed extra brake: the fixed accel command under-delivers approaching a stop, so an + # integral-only term closes the gap, releasing at 1 m/s^3 once out of the window + if (accel < min_gas) and (CS.out.vEgo < 3.0) and not (-1e-3 < CS.out.vEgo < 1e-3): + brake_addon = self.brake_pid.update(error=accel - CS.out.aEgo, speed=CS.out.vEgo) + target_accel = min(accel, accel + brake_addon) + else: + if (self.brake_pid.i < 0.0) and (accel < min_gas): + self.brake_pid.i = min(0.0, self.brake_pid.i + 0.02) + else: + self.brake_pid.reset() + target_accel = min(accel, accel + self.brake_pid.i) + + self.accel = float(np.clip(target_accel, self.params.BOSCH_ACCEL_MIN, self.params.BOSCH_ACCEL_MAX)) + # not using self.accel since the brake pid resets with the gas pedal + gas_pedal_force = accel + wind_brake_ms2 * self.windfactor + hill_brake + + # Live-learn gas pedal adjustments when openpilot is controlling gas. + if (actuators.longControlState == LongCtrlState.pid) and (not CS.out.gasPressed): + gas_error = accel - CS.out.aEgo + if gas_error != 0.0 and gas_pedal_force > min_gas: + if self.CP.carFingerprint in (CAR.HONDA_INSIGHT, CAR.HONDA_CIVIC_BOSCH): # gas pedal reacts too slowly + learn_speed = 150 + elif self.CP.carFingerprint == CAR.ACURA_RDX_3G: # prevent overreacting to turbo lag + learn_speed = 300 + else: + learn_speed = 50 + self.gasfactor = np.clip(self.gasfactor + gas_error / learn_speed * (gas_pedal_force - min_gas), 0.01, 3.0) + if gas_error != 0.0 and (not CS.out.brakePressed) and (CS.out.vEgo > 0.0): + wind_learn_speed = 100 if self.CP.carFingerprint == CAR.ACURA_RDX_3G else 1000 + wind_adjust = 1 + wind_brake_ms2 / wind_learn_speed + self.windfactor = np.clip(self.windfactor * (wind_adjust if (gas_error > 0) else 1.0 / wind_adjust), 0.1, 3.0) + if gas_pedal_force <= min_gas: + self.windfactor = max(self.windfactor, self.windfactor_before_brake) + else: + self.windfactor_before_brake = self.windfactor + if gas_pedal_force >= self.params.BOSCH_ACCEL_MAX: + self.gasfactor = min(self.gasfactor, self.gasfactor_before_maxgas) + self.windfactor = min(self.windfactor, self.windfactor_before_maxgas) + else: + self.gasfactor_before_maxgas = self.gasfactor + self.windfactor_before_maxgas = self.windfactor + self.gas = float(np.interp((gas_pedal_force - min_gas) * self.gasfactor + min_gas, + self.params.BOSCH_GAS_LOOKUP_BP, self.params.BOSCH_GAS_LOOKUP_V)) + + # limit gas ramp to 60 units per frame, matches stock; higher sometimes makes the powertrain ignore the command + max_gas = max(60, self.bosch_last_gas + 60) + self.gas = min(self.gas, max_gas) + self.bosch_last_gas = self.gas + + stopping = actuators.longControlState == LongCtrlState.stopping + self.stopping_counter = self.stopping_counter + 1 if stopping else 0 + # CAN FD: never overlap the stock radar's own ACC_CONTROL stream; ours starts within a few + # frames of the radar going silent (see the deferred radar disable above) + if not (self.CP.carFingerprint in HONDA_BOSCH_CANFD and CS.stock_acc_alive): + can_sends.extend(hondacan.create_acc_commands(self.packer, self.CAN, CC.enabled, CC.longActive, self.accel, self.gas, + self.stopping_counter, self.CP, gas_pedal_force)) + else: + apply_brake = np.clip(self.brake_last - wind_brake, 0.0, 1.0) + apply_brake = int(np.clip(apply_brake * self.params.NIDEC_BRAKE_MAX, 0, self.params.NIDEC_BRAKE_MAX - 1)) + pump_on, self.last_pump_ts = brake_pump_hysteresis(apply_brake, self.apply_brake_last, self.last_pump_ts, ts) + + pcm_override = True + can_sends.append(hondacan.create_brake_command(self.packer, self.CAN, apply_brake, pump_on, + pcm_override, pcm_cancel_cmd, alert_fcw, + self.CP.carFingerprint, CS.stock_brake, self.CP_IQ)) + self.apply_brake_last = apply_brake + self.brake = apply_brake / self.params.NIDEC_BRAKE_MAX + + gas_error = actuators.accel - CS.out.aEgo + if (not CS.out.gasPressed) and (actuators.longControlState == LongCtrlState.pid) and self.CP_IQ.enableGasInterceptor: + if gas_error != 0.0 and gas > 0.0: + self.gasfactor = np.clip(self.gasfactor + gas_error / 50 * (gas * 4.8), 0.1, 3.0) + if gas_error != 0.0 and (not CS.out.brakePressed) and (CS.out.vEgo > 0.0): + wind_adjust = 1 + (wind_brake * 4.8) / 1000 + self.windfactor = np.clip(self.windfactor * (wind_adjust if (gas_error > 0) else 1.0 / wind_adjust), 0.1, 5.0) + if gas <= 0.0: + self.windfactor = max(self.windfactor, self.windfactor_before_brake) + else: + self.windfactor_before_brake = self.windfactor + + can_sends.extend(GasInterceptorCarController.update(self, CC, CS, gas * self.gasfactor, brake, wind_brake, self.packer, self.frame)) + + # Send dashboard UI commands. On CAN FD, ACC_HUD is a radar look-alike that openpilot only owns + # once it has disabled the radar; it rides the phase-locked 10Hz hud tick instead of frame % 10 + if (self.CP.carFingerprint in HONDA_BOSCH_CANFD and CS.hud_tick and + self.CP.openpilotLongitudinalControl and not CS.stock_acc_alive): + can_sends.append(hondacan.create_acc_hud(self.packer, self.CAN.pt, self.CP, CC.enabled, pcm_speed, actuators.accel, + hud_control, hud_v_cruise, CS.is_metric, CS.acc_hud)) + + if self.frame % 10 == 0: + if self.CP.openpilotLongitudinalControl and self.CP.carFingerprint not in HONDA_BOSCH_CANFD: + # On Nidec, this also controls longitudinal positive acceleration + can_sends.append(hondacan.create_acc_hud(self.packer, self.CAN.pt, self.CP, CC.enabled, pcm_speed, pcm_accel, + hud_control, hud_v_cruise, CS.is_metric, CS.acc_hud)) + + steering_available = CS.out.cruiseState.available and CS.out.vEgo > self.CP.minSteerSpeed + reduced_steering = CS.out.steeringPressed + + lkas_state_change = None + if self.CP.carFingerprint in HONDA_BOSCH_CANFD: + # The key must contain exactly the signals that change the LKAS_HUD payload, nothing more: + # a flickering input (like steer saturation) re-triggers the pulse continuously, which keeps + # LKAS_STATE_CHANGE high and suppresses the dash lane lines entirely + hud_key = (bool(CC.latActive), bool(self.dashed_lanes), bool(alert_steer_required), bool(CS.out.steerFaultPermanent)) + if hud_key != self.lkas_hud_key: + self.lkas_hud_key = hud_key + self.lkas_state_change_frames = 30 # 3s at the 10Hz LKAS_HUD rate, matching the stock pulse length + lkas_state_change = self.lkas_state_change_frames > 0 + self.lkas_state_change_frames = max(0, self.lkas_state_change_frames - 1) + + can_sends.extend(hondacan.create_lkas_hud(self.packer, self.CAN.lkas, self.CP, hud_control, CC.latActive, + steering_available, reduced_steering, alert_steer_required, CS.lkas_hud, self.dashed_lanes, + steer_fault_permanent=CS.out.steerFaultPermanent, lkas_state_change=lkas_state_change)) + + if self.CP.openpilotLongitudinalControl: + # TODO: combining with create_acc_hud block above will change message order and will need replay logs regenerated + if self.CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS - HONDA_BOSCH_CANFD): + can_sends.append(hondacan.create_radar_hud(self.packer, self.CAN.pt)) + if self.CP.carFingerprint == CAR.HONDA_CIVIC_BOSCH: + can_sends.append(hondacan.create_legacy_brake_command(self.packer, self.CAN.pt)) + if self.CP.carFingerprint not in HONDA_BOSCH: + self.speed = pcm_speed + if not self.CP_IQ.enableGasInterceptor: + self.gas = pcm_accel / self.params.NIDEC_GAS_MAX + + # Render OP's lane and lead cars on the dash. On CAN FD these are radar look-alikes that only + # exist (and are only allowed by panda safety) when the radar is disabled. Radarless keeps the + # camera as the dash authority (known-good), so OP does not author these there + if (CS.radar_50hz_tick and self.CP.carFingerprint in HONDA_BOSCH_CANFD and self.CP.openpilotLongitudinalControl + and not CS.stock_acc_alive): + leads = dash_objects.leads_from_model(self.model, CS.out.vEgo) + lead = leads[0] + lead_d = lead.dRel if lead.status else 0.0 + self.rendered_lane = self.lane_renderer.update(self.model, CS.out.vEgo, lead_d) + mux = self.radar_mux + # no LKAS_HUD_2 on CAN FD: the dash reads the lane length from the in-band terminator, so the + # path is reshaped into the terminated-prefix form + lane_offsets = dash_lane.canfd_lane_offsets(self.rendered_lane) + lane_msg = dash_lane.create_lane_path(self.packer, self.CAN.lkas, lane_offsets, mux) + can_sends.append(lane_msg) + + # CAN FD cars have no camera HUD_OBJECTS to poll (the disabled radar owned it): author OP's + # lead in slot 0 with the other slots blank (tracks=None) + tracks = CS.camera_object_tracker.snapshot() if CS.camera_object_tracker is not None else None + hud_msg = self.dash_object_author.create(self.packer, self.CAN.lkas, lead, tracks, mux, now_nanos * 1e-9, + extra_leads=leads[1:]) + can_sends.append(hud_msg) + + # the camera (behind the relay) also consumes these; mirror the identical packed bytes onto the + # camera bus (packed once, so the counter/checksum stay in lockstep) + for addr, dat, _ in (lane_msg, hud_msg): + can_sends.append((addr, dat, self.CAN.camera)) + + # CAN FD: when stock LKAS is active, the touch-steering-wheel nag eventually forces an ACC + # disengagement (a brake tap from the VSA). Disable LKAS automatically and block the driver's LKAS + # button by taking over SCM_BUTTONS on the camera bus while engaged (panda blocks the forwarded + # stock SCM_BUTTONS while this stream flows). Radarless keeps the stock camera LKAS untouched + if self.CP.carFingerprint in HONDA_BOSCH_CANFD and CC.enabled and self.frame % 4 == 0 and \ + not pcm_cancel_cmd and not CC.cruiseControl.resume: + if self.lkas_button_send_remaining == 0 and CS.lkas_hud["LKAS_READY"] and self.frame >= self.last_lkas_button_frame + 500: + self.lkas_button_send_remaining = 3 + + if self.lkas_button_send_remaining > 0: + self.last_lkas_button_frame = self.frame + self.lkas_button_send_remaining -= 1 + cruise_setting = CruiseSettings.LKAS + elif CS.cruise_setting == CruiseSettings.LKAS: + cruise_setting = 0 # block the driver's LKAS button press + else: + cruise_setting = CS.cruise_setting + + can_sends.append(hondacan.spam_buttons_command(self.packer, self.CAN, CS.cruise_buttons, cruise_setting, + CS.scm_ambient_light, self.CP.carFingerprint, bus=self.CAN.camera)) + + # Finalize actuator state for downstream consumers + new_actuators = actuators.as_builder() + new_actuators.speed = self.speed + new_actuators.accel = self.accel + new_actuators.gas = self.gas + new_actuators.brake = self.brake + new_actuators.torque = self.last_torque + new_actuators.torqueOutputCan = apply_torque + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/honda/carstate.py b/artifacts/package_runtime/iqdbc/car/honda/carstate.py new file mode 100644 index 000000000..44ffa15c4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/carstate.py @@ -0,0 +1,383 @@ +import numpy as np +from collections import defaultdict + +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, create_button_events, structs, DT_CTRL +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.honda.hondacan import CanBus +from iqdbc.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, HONDA_BOSCH_ALT_RADAR, HONDA_BOSCH_CANFD, \ + HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS, HONDA_BOSCH_TJA_CONTROL, \ + HondaFlags, CruiseButtons, CruiseSettings, GearShifter, CarControllerParams +from iqdbc.car.honda.dash_objects import CameraObjectTracker +from iqdbc.car.interfaces import CarStateBase + +from iqdbc.lvbs.car.honda.iq_carstate import IQCarState + +TransmissionType = structs.CarParams.TransmissionType +ButtonType = structs.CarState.ButtonEvent.Type + +BUTTONS_DICT = {CruiseButtons.RES_ACCEL: ButtonType.accelCruise, CruiseButtons.DECEL_SET: ButtonType.decelCruise, + CruiseButtons.MAIN: ButtonType.mainCruise, CruiseButtons.CANCEL: ButtonType.cancel} +SETTINGS_BUTTONS_DICT = {CruiseSettings.DISTANCE: ButtonType.gapAdjustCruise, CruiseSettings.LKAS: ButtonType.lkas} + + +class CarState(CarStateBase, IQCarState): + def __init__(self, CP, CP_IQ): + CarStateBase.__init__(self, CP, CP_IQ) + IQCarState.__init__(self, CP, CP_IQ) + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + + if CP.transmissionType != TransmissionType.manual: + self.gearbox_msg = "GEARBOX_AUTO" + if CP.transmissionType == TransmissionType.cvt: + self.gearbox_msg = "GEARBOX_CVT" + self.shifter_values = can_define.dv[self.gearbox_msg]["GEAR_SHIFTER"] + + self.car_state_scm_msg = "SCM_FEEDBACK" + if CP.carFingerprint in HONDA_NIDEC_ALT_SCM_MESSAGES: + self.car_state_scm_msg = "SCM_BUTTONS" + + self.brake_error_msg = "HYBRID_BRAKE_ERROR" if CP.flags & HondaFlags.HYBRID else "STANDSTILL" + + self.steer_status_values = defaultdict(lambda: "UNKNOWN", can_define.dv["STEER_STATUS"]["STEER_STATUS"]) + + self.brake_switch_prev = False + self.brake_switch_active = False + self.low_speed_alert = False + + self.dynamic_v_cruise_units = self.CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_ALT_RADAR | + HONDA_BOSCH_TJA_CONTROL | HONDA_BOSCH_CANFD) + self.cruise_setting = 0 + self.v_cruise_pcm_prev = 0 + + # When available we use cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] to populate vEgoCluster + # However, on cars without a digital speedometer this is not always present (HRV, FIT, CRV 2016, ILX and RDX) + self.dash_speed_seen = False + self.is_metric = False + self.v_cruise_factor = 1. + + self.initial_accFault_cleared = False + self.initial_accFault_cleared_timer = int(10 / DT_CTRL) # 10 seconds after startup for initial faults to clear + + self.scm_ambient_light = 0 + + self.radar_ref_counter = 0 + self.radar_5hz_tick_counter = 0 + self.radar_5hz_tick = False + self.supp_tick_counter = 0 + self.supp_tick = False + self.hud_tick_counter = 0 + self.hud_tick = False + self.radar_50hz_tick_counter = 0 + self.radar_50hz_tick = False + + # CAN FD deferred radar disable (see carcontroller): the stock radar is assumed alive until it has + # been silent for a few frames, and the relay is detected open once the camera's STEERING_CONTROL + # stops being physically visible on the PT bus + self.stock_acc_counter = 0 + self.stock_acc_alive = False + self.camera_steer_counter = 0 + self.camera_steer_seen = False + self.canfd_frames = 0 + self.canfd_relay_open = False + + # only radarless cameras emit HUD_OBJECTS to poll for adjacent-car positions; on CAN FD the + # (disabled) radar owned it, so there is nothing to track + self.camera_object_tracker = CameraObjectTracker() if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS else None + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + if self.CP.enableBsm: + cp_body = can_parsers[Bus.body] + if self.CP.carFingerprint in HONDA_BOSCH_CANFD: + cp_radar = can_parsers[Bus.radar] + + ret = structs.CarState() + ret_iq = structs.IQCarState() + + # car params + v_weight_v = [0., 1.] # don't trust smooth speed at low values to avoid premature zero snapping + v_weight_bp = [1., 6.] # smooth blending, below ~0.6m/s the smooth speed snaps to zero + + # update prevs, update must run once per loop + prev_cruise_buttons = self.cruise_buttons + prev_cruise_setting = self.cruise_setting + self.cruise_setting = cp.vl["SCM_BUTTONS"]["CRUISE_SETTING"] + self.cruise_buttons = cp.vl["SCM_BUTTONS"]["CRUISE_BUTTONS"] + if self.CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD): + # The camera consumes SCM_BUTTONS content beyond the buttons (losing/zeroing this byte raises an + # adaptive high beam error), so it must be echoed on frames sent in the SCM's place + self.scm_ambient_light = cp.vl["SCM_BUTTONS"]["AMBIENT_LIGHT_MAYBE"] + + # used for car hud message + # TODO: find CAR_SPEED for HONDA_ODYSSEY_TWN or use ACC_HUD w/ detection + self.is_metric = self.CP.carFingerprint in (CAR.HONDA_ODYSSEY_TWN,) or not cp.vl["CAR_SPEED"]["IMPERIAL_UNIT"] + self.v_cruise_factor = CV.MPH_TO_MS if self.dynamic_v_cruise_units and not self.is_metric else CV.KPH_TO_MS + + # ******************* parse out can ******************* + + # blend in transmission speed at low speed, since it has more low speed accuracy + # STANDSTILL->WHEELS_MOVING bit can be noisy around zero, so use XMISSION_SPEED + v_wheel = sum([cp.vl["WHEEL_SPEEDS"][f"WHEEL_SPEED_{s}"] for s in ("FL", "FR", "RL", "RR")]) / 4.0 * CV.KPH_TO_MS + v_weight = float(np.interp(v_wheel, v_weight_bp, v_weight_v)) + ret.vEgoRaw = (1. - v_weight) * cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] * CV.KPH_TO_MS * self.CP.wheelSpeedFactor + v_weight * v_wheel + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 1e-5 + + # doorOpen is true if we can find any door open, but signal locations vary, and we may only see the driver's door + # TODO: Test the eight Nidec cars without SCM signals for driver's door state, may be able to consolidate further + if self.CP.flags & HondaFlags.HAS_ALL_DOOR_STATES: + ret.doorOpen = any([cp.vl["DOORS_STATUS"]["DOOR_OPEN_FL"], cp.vl["DOORS_STATUS"]["DOOR_OPEN_FR"], + cp.vl["DOORS_STATUS"]["DOOR_OPEN_RL"], cp.vl["DOORS_STATUS"]["DOOR_OPEN_RR"]]) + elif "DRIVERS_DOOR_OPEN" in cp.vl["SCM_BUTTONS"]: + ret.doorOpen = bool(cp.vl["SCM_BUTTONS"]["DRIVERS_DOOR_OPEN"]) + else: + ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"]) + + ret.seatbeltUnlatched = bool(cp.vl["SEATBELT_STATUS"]["SEATBELT_DRIVER_LAMP"] or not cp.vl["SEATBELT_STATUS"]["SEATBELT_DRIVER_LATCHED"]) + + steer_status = self.steer_status_values[cp.vl["STEER_STATUS"]["STEER_STATUS"]] + ret.steerFaultPermanent = steer_status not in ("NORMAL", "NO_TORQUE_ALERT_1", "NO_TORQUE_ALERT_2", "LOW_SPEED_LOCKOUT", "TMP_FAULT") + if self.CP.carFingerprint in (HONDA_BOSCH_ALT_RADAR | HONDA_BOSCH_CANFD): + # TODO: See if this logic works for all other Honda + min_steer_speed = max(CarControllerParams.STEER_GLOBAL_MIN_SPEED, self.CP.minSteerSpeed) + expected_low_speed_lockout = steer_status == "LOW_SPEED_LOCKOUT" and ret.vEgo < min_steer_speed + ret.steerFaultTemporary = steer_status != "NORMAL" and not expected_low_speed_lockout + else: + # LOW_SPEED_LOCKOUT is not worth a warning + # NO_TORQUE_ALERT_2 can be caused by bump or steering nudge from driver + # FIXME: the stock camera stops steering on NO_TORQUE_ALERT_1 + ret.steerFaultTemporary = steer_status not in ("NORMAL", "LOW_SPEED_LOCKOUT", "TJA_LOW_SPEED_LOCKOUT", "NO_TORQUE_ALERT_2") + + # All Honda EPS cut off slightly above standstill, some much higher + # Don't alert in the near-standstill range, but alert for per-vehicle configured minimums above that + if CarControllerParams.STEER_GLOBAL_MIN_SPEED < ret.vEgo < (self.CP.minSteerSpeed + 0.5): + self.low_speed_alert = True + elif ret.vEgo > (self.CP.minSteerSpeed + 1.): + # TODO: better handle delayed steering enablement on ALT_RADAR cars + self.low_speed_alert = False + ret.lowSpeedAlert = self.low_speed_alert + + if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS: + ret.accFaulted = bool(cp.vl["CRUISE_FAULT_STATUS"]["CRUISE_FAULT"]) + else: + if self.CP.openpilotLongitudinalControl: + if self.CP.carFingerprint in (HONDA_BOSCH_CANFD | HONDA_BOSCH_TJA_CONTROL) and (self.CP.flags & HondaFlags.BOSCH_ALT_BRAKE): + ret.accFaulted = bool(cp.vl["BRAKE_MODULE"]["CRUISE_FAULT"]) + else: + ret.accFaulted = bool(cp.vl[self.brake_error_msg]["BRAKE_ERROR_1"] or cp.vl[self.brake_error_msg]["BRAKE_ERROR_2"]) + + # Log non-critical stock ACC/LKAS faults if Nidec (camera) + if self.CP.carFingerprint not in HONDA_BOSCH: + ret.carFaultedNonCritical = bool(cp_cam.vl["ACC_HUD"]["ACC_PROBLEM"] or cp_cam.vl["LKAS_HUD"]["LKAS_PROBLEM"]) + + ret.espDisabled = cp.vl["VSA_STATUS"]["ESP_DISABLED"] != 0 + + if self.CP.carFingerprint not in (CAR.HONDA_ODYSSEY_TWN,): + self.dash_speed_seen = self.dash_speed_seen or cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] > 1e-3 + if self.dash_speed_seen: + conversion = CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS + ret.vEgoCluster = cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] * conversion + + ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEER_ANGLE"] + ret.steeringRateDeg = cp.vl["STEERING_SENSORS"]["STEER_ANGLE_RATE"] + + ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk( + 250, cp.vl["SCM_FEEDBACK"]["LEFT_BLINKER"], cp.vl["SCM_FEEDBACK"]["RIGHT_BLINKER"]) + ret.brakeHoldActive = cp.vl["VSA_STATUS"]["BRAKE_HOLD_ACTIVE"] == 1 + ret.parkingBrake = bool(cp.vl[self.car_state_scm_msg]["PARKING_BRAKE_ON"]) + + if self.CP.transmissionType == TransmissionType.manual: + ret.gearShifter = GearShifter.reverse if bool(cp.vl["SCM_FEEDBACK"]["REVERSE_LIGHT"]) else GearShifter.drive + else: + gear_position = self.shifter_values.get(cp.vl[self.gearbox_msg]["GEAR_SHIFTER"], None) + ret.gearShifter = self.parse_gear_shifter(gear_position) + + ret.gasPressed = cp.vl["POWERTRAIN_DATA"]["PEDAL_GAS"] > 1e-5 + + ret.steeringTorque = cp.vl["STEER_STATUS"]["STEER_TORQUE_SENSOR"] + ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD.get(self.CP.carFingerprint, 1200) + + if self.CP.carFingerprint in HONDA_BOSCH: + # The PCM always manages its own cruise control state, but doesn't publish it + if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS: + ret.cruiseState.nonAdaptive = cp_cam.vl["ACC_HUD"]["CRUISE_CONTROL_LABEL"] != 0 + + if not self.CP.openpilotLongitudinalControl: + # ACC_HUD is on camera bus on radarless cars + acc_hud = cp_cam.vl["ACC_HUD"] if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS else cp.vl["ACC_HUD"] + ret.cruiseState.nonAdaptive = acc_hud["CRUISE_CONTROL_LABEL"] != 0 + ret.cruiseState.standstill = acc_hud["CRUISE_SPEED"] == 252. + + # On set, cruise set speed pulses between 254~255 and the set speed prev is set to avoid this. + ret.cruiseState.speed = self.v_cruise_pcm_prev if acc_hud["CRUISE_SPEED"] > 160.0 else acc_hud["CRUISE_SPEED"] * self.v_cruise_factor + self.v_cruise_pcm_prev = ret.cruiseState.speed + else: + ret.cruiseState.speed = cp.vl["CRUISE"]["CRUISE_SPEED_PCM"] * CV.KPH_TO_MS + + if self.CP.flags & HondaFlags.BOSCH_ALT_BRAKE: + ret.brakePressed = cp.vl["BRAKE_MODULE"]["BRAKE_PRESSED"] != 0 + else: + # brake switch has shown some single time step noise, so only considered when + # switch is on for at least 2 consecutive CAN samples + # brake switch rises earlier than brake pressed but is never 1 when in park + brake_switch_vals = cp.vl_all["POWERTRAIN_DATA"]["BRAKE_SWITCH"] + if len(brake_switch_vals): + brake_switch = cp.vl["POWERTRAIN_DATA"]["BRAKE_SWITCH"] != 0 + if len(brake_switch_vals) > 1: + self.brake_switch_prev = brake_switch_vals[-2] != 0 + self.brake_switch_active = brake_switch and self.brake_switch_prev + self.brake_switch_prev = brake_switch + ret.brakePressed = (cp.vl["POWERTRAIN_DATA"]["BRAKE_PRESSED"] != 0) or self.brake_switch_active + + ret.brake = cp.vl["VSA_STATUS"]["USER_BRAKE"] + ret.cruiseState.enabled = cp.vl["POWERTRAIN_DATA"]["ACC_STATUS"] != 0 + ret.cruiseState.available = bool(cp.vl[self.car_state_scm_msg]["MAIN_ON"]) + + # Bosch cars can report stale ACC faults during early startup. + if ret.accFaulted: + if (self.CP.carFingerprint in HONDA_BOSCH) and not self.initial_accFault_cleared: + # Gate initial stale faults via availability (accFaulted is sticky until offroad). + ret.accFaulted = False + ret.cruiseState.available = False + elif self.initial_accFault_cleared_timer == 0: + self.initial_accFault_cleared = True + + if self.initial_accFault_cleared_timer > 0: + self.initial_accFault_cleared_timer -= 1 + + # Gets rid of Pedal Grinding noise when brake is pressed at slow speeds for some models + if self.CP.carFingerprint in (CAR.HONDA_PILOT, CAR.HONDA_RIDGELINE): + if ret.brake > 0.1: + ret.brakePressed = True + + if self.CP.carFingerprint in HONDA_BOSCH: + # TODO: find the radarless AEB_STATUS bit and make sure ACCEL_COMMAND is correct to enable AEB alerts + if self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS: + ret.stockAeb = (not self.CP.openpilotLongitudinalControl) and bool(cp.vl["ACC_CONTROL"]["AEB_STATUS"] and cp.vl["ACC_CONTROL"]["ACCEL_COMMAND"] < -1e-5) + else: + ret.stockAeb = bool(cp_cam.vl["BRAKE_COMMAND"]["AEB_REQ_1"] and cp_cam.vl["BRAKE_COMMAND"]["COMPUTER_BRAKE"] > 1e-5) + + self.acc_hud = False + self.lkas_hud = False + if self.CP.carFingerprint not in HONDA_BOSCH: + ret.stockFcw = cp_cam.vl["BRAKE_COMMAND"]["FCW"] != 0 + self.acc_hud = cp_cam.vl["ACC_HUD"] + self.stock_brake = cp_cam.vl["BRAKE_COMMAND"] + if self.CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD): + self.lkas_hud = cp_cam.vl["LKAS_HUD"] + if self.CP.carFingerprint in HONDA_BOSCH_CANFD: + # The radar emits low-rate tick reference messages that keep running even while its data + # messages are disabled, so the look-alikes are phased to the stock cadence off of them. + # + # There is a one-frame (10 ms) delay between reading a tick here in carstate and transmitting the + # response in carcontroller. The stock radar sends each data message in the SAME frame as its + # tick, so we pulse one frame BEFORE the next tick (counter == period-1): the +1 transmit delay + # then lands the message on the next tick frame, matching stock. + # period (frames @100Hz): 0x710=100, 0x730=10, 0x750=2, RADAR_REFERENCE=20 + self.radar_ref_counter = cp.vl["RADAR_REFERENCE"]["COUNTER"] + + # 5 Hz: RADAR_REFERENCE (0x3A1) is on the powertrain bus (cp), not the radar bus (cp_radar). + # RADAR_LEAD does NOT ride with the reference; stock sends it ~120 ms (12 frames) after, so fire + # at frame 11 (+1 transmit delay -> ~120 ms) + ref_tick_vals = cp.vl_all.get("RADAR_REFERENCE", {}).get("COUNTER", []) + if len(ref_tick_vals) > 0: + self.radar_5hz_tick_counter = 0 + else: + self.radar_5hz_tick_counter += 1 + self.radar_5hz_tick = (self.radar_5hz_tick_counter == 11) + + supp_tick_vals = cp_radar.vl_all.get("RADAR_SUPP_TICK_REFERENCE", {}).get("IGNORE", []) + if len(supp_tick_vals) > 0: + self.supp_tick_counter = 0 + else: + self.supp_tick_counter += 1 + self.supp_tick = (self.supp_tick_counter == 99) + + hud_tick_vals = cp_radar.vl_all.get("RADAR_HUD_TICK_REFERENCE", {}).get("IGNORE", []) + if len(hud_tick_vals) > 0: + self.hud_tick_counter = 0 + else: + self.hud_tick_counter += 1 + self.hud_tick = (self.hud_tick_counter == 9) + + tick_50hz_vals = cp_radar.vl_all.get("RADAR_50HZ_TICK_REFERENCE", {}).get("IGNORE", []) + if len(tick_50hz_vals) > 0: + self.radar_50hz_tick_counter = 0 + else: + self.radar_50hz_tick_counter += 1 + self.radar_50hz_tick = (self.radar_50hz_tick_counter == 1) + + # Deferred radar disable (see carcontroller). The stock radar transmits ACC_CONTROL every 2 + # frames, so 4 missed frames means it has been silenced; assume alive until then so the + # replacement stream never overlaps it + self.canfd_frames += 1 + if len(cp.vl_all.get("ACC_CONTROL", {}).get("COUNTER", [])) > 0: + self.stock_acc_counter = 0 + else: + self.stock_acc_counter += 1 + self.stock_acc_alive = self.stock_acc_counter < 4 + + # While the comma relay is closed the camera's STEERING_CONTROL is physically visible on the PT + # bus; when the relay opens it disappears (openpilot's own 0xE4 TX is not parsed as RX). As a + # fallback, assume the relay is open after 5 s of controls in case the camera was never seen + if len(cp.vl_all.get("STEERING_CONTROL", {}).get("COUNTER", [])) > 0: + self.camera_steer_counter = 0 + self.camera_steer_seen = True + else: + self.camera_steer_counter += 1 + self.canfd_relay_open = (self.camera_steer_seen and self.camera_steer_counter >= 5) or self.canfd_frames >= 500 + else: + self.supp_tick = False + self.hud_tick = False + self.radar_5hz_tick = False + self.radar_50hz_tick = False + + if self.CP.enableBsm: + # BSM messages are on B-CAN, requires a panda forwarding B-CAN messages to CAN 0 + # more info here: https://github.com/commaai/openpilot/pull/1867 + ret.leftBlindspot = cp_body.vl["BSM_STATUS_LEFT"]["BSM_ALERT"] == 1 + ret.rightBlindspot = cp_body.vl["BSM_STATUS_RIGHT"]["BSM_ALERT"] == 1 + + ret.buttonEvents = [ + *create_button_events(self.cruise_buttons, prev_cruise_buttons, BUTTONS_DICT), + *create_button_events(self.cruise_setting, prev_cruise_setting, SETTINGS_BUTTONS_DICT), + ] + + IQCarState.update(self, ret, ret_iq, can_parsers) + + if self.camera_object_tracker is not None: + self.camera_object_tracker.update(cp_cam) + + return ret, ret_iq + + def get_can_parsers(self, CP, CP_IQ): + pt_messages = [] + cam_messages = [] + if CP.carFingerprint in HONDA_BOSCH_CANFD: + # Radar-alive and relay-open detection for the deferred radar disable (see carcontroller). + # Both messages intentionally go silent (the radar is disabled, the camera ends up behind the + # open relay), so subscribe with NaN frequency to skip the alive/timeout checks + pt_messages += [("ACC_CONTROL", float('nan')), ("STEERING_CONTROL", float('nan'))] + if CP.carFingerprint in HONDA_BOSCH_RADARLESS: + # polled by the CameraObjectTracker, but not every radarless camera emits it + cam_messages += [("HUD_OBJECTS", float('nan'))] + parsers = { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, CanBus(CP).pt), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, CanBus(CP).camera), + } + if CP.enableBsm: + parsers[Bus.body] = CANParser(DBC[CP.carFingerprint][Bus.body], [], CanBus(CP).radar) + if CP.carFingerprint in HONDA_BOSCH_CANFD: + # The tick references are only read via vl_all, which (unlike vl) does not auto-subscribe + # messages, so they must be listed explicitly or they are never parsed. + # 0x710 RADAR_SUPP_TICK_REFERENCE (1 Hz), 0x730 RADAR_HUD_TICK_REFERENCE (10 Hz), + # 0x750 RADAR_50HZ_TICK_REFERENCE (50 Hz) + parsers[Bus.radar] = CANParser(DBC[CP.carFingerprint][Bus.radar], [ + ("RADAR_SUPP_TICK_REFERENCE", 0), + ("RADAR_HUD_TICK_REFERENCE", 0), + ("RADAR_50HZ_TICK_REFERENCE", 0), + ], CanBus(CP).radar) + + return parsers diff --git a/artifacts/package_runtime/iqdbc/car/honda/dash_lane.py b/artifacts/package_runtime/iqdbc/car/honda/dash_lane.py new file mode 100644 index 000000000..e5335e790 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/dash_lane.py @@ -0,0 +1,186 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from dataclasses import dataclass, field + +import numpy as np + +POINT_COUNT = 40 +POINTS_PER_FRAME = 4 +SWEEP_INDICES = POINT_COUNT // POINTS_PER_FRAME + +# the camera repeats each sweep index across four redundant banks: mux = index + bank*16, +# giving mux values 1-10, 17-26, 33-42 and 49-58 for logical indices 0-9 +MUX_CYCLE = tuple(index + bank * 16 for bank in range(4) for index in range(1, SWEEP_INDICES + 1)) + +OFFSET_UNAVAILABLE = 2047 +OFFSET_VALID_MAX = 2046 + +NEAR_M = 2.0 +FAR_M = 100.0 +LOOKAHEAD_M = np.linspace(NEAR_M, FAR_M, POINT_COUNT) + +# full swing center -> max turn is slewed over this long so model jumps can't teleport the dash lane +SLEW_RATE_HZ = 50.0 +SLEW_FULL_SCALE_S = 2.0 +SLEW_MAX_STEP = OFFSET_VALID_MAX / (SLEW_FULL_SCALE_S * SLEW_RATE_HZ) + + +def _stock_gain(d): + # raw offset units per meter of lateral, regressed from stock radar sweeps vs modelV2 lane centers + return 29.3 + 0.243 * d - 0.00228 * d ** 2 + + +def _legacy_gain(d): + return 6.27 + 0.0106 * d + 0.000354 * d ** 2 + + +GAIN = _stock_gain(LOOKAHEAD_M) + + +def gain_correction(d: float) -> float: + # the HUD lead marker's lateral scale was tuned against lanes drawn with the legacy (flatter) gain + # law, so the lead's lateral must ride this ratio to stay on the corrected lane rendering + d = min(max(float(d), NEAR_M), FAR_M) + return _stock_gain(d) / _legacy_gain(d) + + +LANE_LINE_ON = 3 +LANE_LENGTH_MAX_VALUE = 33 +LANE_WIDTH_DEFAULT = 32 + +LINE_PROB_ON = 0.25 +LINE_PROB_OFF = 0.10 +HALF_LANE_M = 1.65 +FULL_REACH_SPEED = 27.0 +FULL_REACH_LEAD_DIST = 70.0 +MIN_REACH = 0.15 + + +def encode_lane_path(x, y): + x = np.asarray(x, dtype=float) + y = np.asarray(y, dtype=float) + if x.size < 2 or x.max() < FAR_M: + return [OFFSET_UNAVAILABLE] * POINT_COUNT + lat = np.interp(LOOKAHEAD_M, x, y) + # stock encodes offsets with the opposite lateral sign to openpilot's +left convention + raw = np.clip(np.round(-GAIN * lat), -OFFSET_VALID_MAX, OFFSET_VALID_MAX) + return [int(v) for v in raw] + + +# The CAN FD dash has no LKAS_HUD_2 to carry the drawn length: it reads the path as a contiguous valid +# prefix ended by an in-band OFFSET_UNAVAILABLE terminator, idles at 6 valid zero offsets (never +# all-unavailable), and cross-checks the prefix length against RADAR_LEAD's LANE_PATH_LENGTH. +CANFD_MAX_VALID_PTS = 23 +CANFD_MIN_VALID_PTS = 6 +CANFD_IDLE_OFFSETS = [0] * CANFD_MIN_VALID_PTS + [OFFSET_UNAVAILABLE] * (POINT_COUNT - CANFD_MIN_VALID_PTS) + +# stock valid-point count is a function of ego speed alone, fit from factory lanes-on RADAR_LEAD frames +CANFD_LEN_INTERCEPT = 6.74 +CANFD_LEN_SLOPE = 0.862 + + +@dataclass +class RenderedLane: + offsets: list[int] = field(default_factory=lambda: [OFFSET_UNAVAILABLE] * POINT_COUNT) + reach: float = 0.0 + left_line: bool = False + right_line: bool = False + lane_cross: int = 0 + v_ego: float = 0.0 + + @property + def blank(self) -> bool: + return self.reach <= 0.0 or self.offsets[0] == OFFSET_UNAVAILABLE + + +def canfd_lane_length(lane: RenderedLane) -> int: + if lane.blank: + return CANFD_MIN_VALID_PTS + n = round(CANFD_LEN_INTERCEPT + CANFD_LEN_SLOPE * lane.v_ego) + return max(CANFD_MIN_VALID_PTS, min(CANFD_MAX_VALID_PTS, n)) + + +def canfd_lane_offsets(lane: RenderedLane) -> list[int]: + if lane.blank: + return CANFD_IDLE_OFFSETS + n_valid = canfd_lane_length(lane) + return list(lane.offsets[:n_valid]) + [OFFSET_UNAVAILABLE] * (POINT_COUNT - n_valid) + + +def create_lane_path(packer, bus, offsets, mux): + base = ((mux - 1) % 16) * POINTS_PER_FRAME + values = {"MUX": mux} + for i in range(POINTS_PER_FRAME): + values[f"PATH_OFFSET_{i + 1}"] = offsets[base + i] + return packer.make_can_msg("LANE_PATH", bus, values) + + +def create_lkas_hud_2(packer, bus, counter_2, reach=1.0, lane_cross=0, left_line=True, right_line=True): + lane_length = max(0, min(LANE_LENGTH_MAX_VALUE, round(reach * LANE_LENGTH_MAX_VALUE))) + shown = lane_length > 0 + values = { + "COUNTER_2": counter_2, + "SET_ME_X01": 1, + "LANE_WIDTH": LANE_WIDTH_DEFAULT, + "LEFT_LANE": LANE_LINE_ON if (shown and left_line) else 0, + "RIGHT_LANE": LANE_LINE_ON if (shown and right_line) else 0, + "LEFT_LANE_CROSSED": 1 if (shown and lane_cross < 0) else 0, + "RIGHT_LANE_CROSSED": 1 if (shown and lane_cross > 0) else 0, + "LANE_LENGTH": lane_length, + } + return packer.make_can_msg("LKAS_HUD_2", bus, values) + + +class LanePathRenderer: + def __init__(self): + self._left_on = False + self._right_on = False + self._shown = None + + def _lane_center(self, model): + lls, probs = model.laneLines, model.laneLineProbs + if len(lls) < 3 or len(probs) < 3 or len(lls[1].x) == 0: + return None, None, False, False + + left = probs[1] >= (LINE_PROB_OFF if self._left_on else LINE_PROB_ON) + right = probs[2] >= (LINE_PROB_OFF if self._right_on else LINE_PROB_ON) + x = np.array(lls[1].x) + yl, yr = np.array(lls[1].y), np.array(lls[2].y) + if left and right: + y = (yl + yr) / 2.0 + elif right: + y = yr - HALF_LANE_M + elif left: + y = yl + HALF_LANE_M + else: + return None, None, False, False + return x, y, left, right + + def _slew(self, offsets): + # an all-sentinel fit draws nothing: pass through and reset so the next real fit shows unslewed + if offsets[0] == OFFSET_UNAVAILABLE: + self._shown = None + return offsets + target = np.asarray(offsets, dtype=float) + if self._shown is None: + self._shown = target + else: + self._shown = self._shown + np.clip(target - self._shown, -SLEW_MAX_STEP, SLEW_MAX_STEP) + return [int(v) for v in np.round(self._shown)] + + def update(self, model, v_ego, lead_d) -> RenderedLane: + x = y = None + left_on = right_on = False + if model is not None: + x, y, left_on, right_on = self._lane_center(model) + if x is None: + self._shown = None + return RenderedLane() + self._left_on, self._right_on = left_on, right_on + + reach = float(np.clip(max(v_ego / FULL_REACH_SPEED, lead_d / FULL_REACH_LEAD_DIST, MIN_REACH), 0.0, 1.0)) + if round(reach * LANE_LENGTH_MAX_VALUE) <= 0: + self._shown = None + return RenderedLane() + return RenderedLane(self._slew(encode_lane_path(x, y)), reach, left_on, right_on, v_ego=v_ego) diff --git a/artifacts/package_runtime/iqdbc/car/honda/dash_objects.py b/artifacts/package_runtime/iqdbc/car/honda/dash_objects.py new file mode 100644 index 000000000..bf228a214 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/dash_objects.py @@ -0,0 +1,314 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import math +from dataclasses import dataclass + +from iqdbc.can.parser import CANParser +from iqdbc.car.honda import dash_lane + +NUM_SLOTS = 10 +LONG_DIST_CAP_M = 195.0 + +# byte-faithful empty-slot payload decoded from stock HUD_OBJECTS; an inconsistent frame risks the dash rejecting it +INACTIVE = { + "OBJECT_ID": 0, + "IS_LEAD_CAR": 0, + "CAR_TYPE": -1, + "ROTATION": -128, + "LONG_DIST": 196.9, + "LAT_DIST": 204.7, +} + +CAR_TYPE_CAR = 7 +LONG_DIST_MAX_M = 194.0 +LAT_DIST_LIM_M = 204.7 + +# the dash under-scales LAT_DIST ~0.3x in the ego frame; tuned on-car so the lead marker lands on the lane +LAT_SCALE = 0.35 + +ROT_BAND_M = 1.5 +ROT_MAX = 6 + +REID_GAP_M = 8.0 +REID_TAU = 1.5 +REID_REFRACTORY = 1.5 +MAX_OBJECT_ID = 31 + +DREL_SMOOTH_TAU = 0.6 +YREL_SMOOTH_TAU = 0.5 +FF_VREL_MIN = 0.5 +DREL_RESID_CLAMP = 1.5 + +LEAD_PROB_ON = 0.5 +LEAD_PROB_OFF = 0.35 +LEAD_HOLD_S = 0.6 + +# modelV2.leadsV3 entries are one car at three time horizons, not three cars: only render the extra +# horizons when spatially distinct from everything already rendered (a genuinely different vehicle) +EXTRA_LEAD_SLOTS = (1, 2) +EXTRA_LEAD_MIN_SEP_D = 5.0 +EXTRA_LEAD_MIN_SEP_Y = 1.5 + + +@dataclass +class CameraObject: + slot: int + object_id: int + d_rel: float + y_rel: float + is_lead_car: bool + valid: bool + car_type: int = -1 + rotation: int = -128 + + +class CameraObjectTracker: + def __init__(self): + self._tracks: list[CameraObject] = [ + CameraObject(slot=i, object_id=0, d_rel=0.0, y_rel=0.0, is_lead_car=False, valid=False) + for i in range(NUM_SLOTS) + ] + + def update(self, cp_cam: CANParser) -> None: + vla = cp_cam.vl_all["HUD_OBJECTS"] + for mux, oid, ld, yd, lead, ct, rot in zip(vla["MUX"], vla["OBJECT_ID"], vla["LONG_DIST"], vla["LAT_DIST"], + vla["IS_LEAD_CAR"], vla["CAR_TYPE"], vla["ROTATION"], strict=True): + slot = (int(mux) - 1) % 16 + if 0 <= slot < NUM_SLOTS: + self._tracks[slot] = CameraObject( + slot=slot, + object_id=int(oid), + d_rel=float(ld), + y_rel=float(yd), + is_lead_car=bool(lead), + valid=oid != 0 and ld < LONG_DIST_CAP_M, + car_type=int(ct), + rotation=int(rot), + ) + + def snapshot(self) -> list[CameraObject]: + return self._tracks + + +@dataclass +class ModelLead: + status: bool + dRel: float + yRel: float + vRel: float + prob: float = 0.0 + + +def leads_from_model(model, v_ego, n=3): + # modelV2's lateral is +right; the dash convention is +left. v is made relative for the smoother. + # Data stays populated below LEAD_PROB_ON (status False, prob carried) so the author's hysteresis + # can keep an already-rendered lead alive down to LEAD_PROB_OFF instead of blinking it + out = [] + for i in range(n): + if model is None or len(model.leadsV3) <= i or len(model.leadsV3[i].x) == 0: + out.append(ModelLead(False, 0.0, 0.0, 0.0)) + continue + lead = model.leadsV3[i] + out.append(ModelLead(bool(lead.prob >= LEAD_PROB_ON), float(lead.x[0]), -float(lead.y[0]), + float(lead.v[0]) - v_ego, prob=float(lead.prob))) + return out + + +def lead_rotation(lateral_left_m: float) -> int: + magnitude = min(round(abs(lateral_left_m) / ROT_BAND_M), ROT_MAX) + return -magnitude if lateral_left_m > 0 else magnitude + + +class LeadIdentity: + """Mints a stable OBJECT_ID for the rendered lead, re-IDing on a fresh lead or a range discontinuity. + dRel is noisy, so a leaky predictor (feed-forward vRel, leak toward dRel) accumulates the residual + instead of a per-sample range-rate test.""" + + def __init__(self): + self.object_id = 0 + self._on = False + self._pred = 0.0 + self._prev_t = 0.0 + self._reid_t = -1e9 + + def update(self, status: bool, d_rel: float, v_rel: float, now: float) -> int: + if not status: + self.object_id = 0 + self._on = False + return 0 + + new_lead = not self._on + if self._on: + dt = max(now - self._prev_t, 1e-3) + self._pred += v_rel * dt + self._pred += min(dt / REID_TAU, 1.0) * (d_rel - self._pred) + if abs(d_rel - self._pred) > REID_GAP_M and now - self._reid_t > REID_REFRACTORY: + new_lead = True + self._prev_t = now + + if new_lead: + self.object_id = self.object_id % MAX_OBJECT_ID + 1 + self._reid_t = now + self._pred = d_rel + self._on = True + return self.object_id + + +class MarkerSmoother: + """Stabilizes a rendered marker without lagging real motion: vRel feed-forward on dRel with a + clamped leak toward the measurement, plain low-pass on yRel, snapping on an identity change.""" + + def __init__(self): + self._id = 0 + self._d = 0.0 + self._y = 0.0 + self._t = 0.0 + + def update(self, d_rel: float, y_rel: float, v_rel: float, object_id: int, now: float) -> tuple[float, float]: + if object_id != self._id: + self._id, self._d, self._y, self._t = object_id, d_rel, y_rel, now + return d_rel, y_rel + dt = max(now - self._t, 1e-3) + self._t = now + if abs(v_rel) >= FF_VREL_MIN: + self._d += v_rel * dt + resid = min(max(d_rel - self._d, -DREL_RESID_CLAMP), DREL_RESID_CLAMP) + self._d += (1.0 - math.exp(-dt / DREL_SMOOTH_TAU)) * resid + self._y += (1.0 - math.exp(-dt / YREL_SMOOTH_TAU)) * (y_rel - self._y) + return self._d, self._y + + +def create_hud_object(packer, bus, mux, track): + values = {"MUX": mux} + if track is None: + values.update(INACTIVE) + else: + values.update({ + "OBJECT_ID": int(track["object_id"]), + "IS_LEAD_CAR": int(track["is_lead_car"]), + "CAR_TYPE": int(track["car_type"]), + "ROTATION": int(track["rotation"]), + "LONG_DIST": min(max(track["d_rel"], 0.0), LONG_DIST_MAX_M), + "LAT_DIST": min(max(track["y_rel"], -LAT_DIST_LIM_M), LAT_DIST_LIM_M), + }) + return packer.make_can_msg("HUD_OBJECTS", bus, values) + + +def forward_hud_object(packer, bus, mux, tracks): + slot = (mux - 1) % 16 + st = tracks[slot] if (tracks and slot < len(tracks)) else None + track = ({"d_rel": st.d_rel, "y_rel": st.y_rel, "object_id": st.object_id, "is_lead_car": st.is_lead_car, + "car_type": st.car_type, "rotation": st.rotation} if (st is not None and st.valid) else None) + return create_hud_object(packer, bus, mux, track) + + +class DashObjectAuthor: + """Authors HUD_OBJECTS: openpilot's lead in slot 0 with a stable identity and smoothed marker, the + camera's non-lead cars forwarded in slots 1-9 (or distinct extra model leads where there is no + camera to forward), one frame per mux tick.""" + + def __init__(self): + self._identity = LeadIdentity() + self._smoother = MarkerSmoother() + self._lead_id = 0 + self._prev_op_id = 0 + self._lead_on = False + self._lead_hold: ModelLead | None = None + self._lead_seen_t = -1e9 + self._extra_ids = {slot: LeadIdentity() for slot in EXTRA_LEAD_SLOTS} + self._extra_smooth = {slot: MarkerSmoother() for slot in EXTRA_LEAD_SLOTS} + self._extra_emit = dict.fromkeys(EXTRA_LEAD_SLOTS, 0) + + def _gate_lead(self, lead: ModelLead, now: float) -> ModelLead: + # leadsV3[0].prob hovers around 0.5 in traffic; hysteresis plus a short dead-reckoned hold keeps + # the marker from blinking at a cadence the stock radar never produces + if lead.prob >= (LEAD_PROB_OFF if self._lead_on else LEAD_PROB_ON): + self._lead_on = True + self._lead_hold = lead + self._lead_seen_t = now + return lead if lead.status else ModelLead(True, lead.dRel, lead.yRel, lead.vRel, lead.prob) + if self._lead_on and self._lead_hold is not None and now - self._lead_seen_t < LEAD_HOLD_S: + h = self._lead_hold + return ModelLead(True, h.dRel + h.vRel * (now - self._lead_seen_t), h.yRel, h.vRel, h.prob) + self._lead_on = False + self._lead_hold = None + return ModelLead(False, 0.0, 0.0, 0.0) + + def _lead_object_id(self, status: bool, op_id: int, stock_lead_id: int | None, in_use: set[int]) -> int: + if not status: + self._lead_id = 0 + elif stock_lead_id is not None: + self._lead_id = stock_lead_id + elif self._lead_id == 0 or op_id != self._prev_op_id or self._lead_id in in_use: + # advance from the current id rather than picking the lowest free one: with no camera ids in + # use a handoff would keep the same id and the id-keyed smoother would slide between two cars + # instead of snapping + nxt = self._lead_id % MAX_OBJECT_ID + 1 + while nxt in in_use: + nxt = nxt % MAX_OBJECT_ID + 1 + self._lead_id = nxt + self._prev_op_id = op_id + return self._lead_id + + def _update_extras(self, extra_leads, lead, in_use, now): + rendered = [(lead.dRel, lead.yRel)] if lead.status else [] + out = {} + for slot, ex in zip(EXTRA_LEAD_SLOTS, extra_leads or (), strict=False): + distinct = ex.status and all(abs(ex.dRel - d) >= EXTRA_LEAD_MIN_SEP_D or + abs(ex.yRel - y) >= EXTRA_LEAD_MIN_SEP_Y + for d, y in rendered) + op_id = self._extra_ids[slot].update(distinct, ex.dRel, ex.vRel, now) + if not distinct: + self._extra_emit[slot] = 0 + out[slot] = None + continue + emit = self._extra_emit[slot] + if emit == 0 or emit in in_use: + emit = op_id + while emit in in_use: + emit = emit % MAX_OBJECT_ID + 1 + self._extra_emit[slot] = emit + in_use.add(emit) + d_rel, y_rel = self._extra_smooth[slot].update(ex.dRel, LAT_SCALE * ex.yRel, ex.vRel, emit, now) + rendered.append((ex.dRel, ex.yRel)) + out[slot] = {"d_rel": d_rel, "y_rel": y_rel, "object_id": emit, "is_lead_car": 0, + "car_type": CAR_TYPE_CAR, "rotation": lead_rotation(y_rel / LAT_SCALE)} + return out + + def create(self, packer, bus, lead, tracks, mux: int, now: float, extra_leads=None): + lead = self._gate_lead(lead, now) + op_id = self._identity.update(lead.status, lead.dRel, lead.vRel, now) + stock_lead, in_use = None, set() + for t in (tracks or ()): + if not t.valid: + continue + if t.is_lead_car: + stock_lead = t + elif t.slot != 0: + in_use.add(t.object_id) + stock_lead_id = stock_lead.object_id if stock_lead is not None else None + lead_id = self._lead_object_id(lead.status, op_id, stock_lead_id, in_use) + if lead.status: + in_use.add(lead_id) + + # ride the lane gain-law correction at the lead's distance so the marker tracks the lane rendering + lat_scale = LAT_SCALE * dash_lane.gain_correction(lead.dRel) + d_rel, y_rel = self._smoother.update(lead.dRel, lat_scale * lead.yRel, lead.vRel, lead_id, now) + + extras = self._update_extras(extra_leads, lead, in_use, now) if tracks is None else {} + + slot = (mux - 1) % 16 + if slot == 0 and lead.status: + track = {"d_rel": d_rel, "y_rel": y_rel, "object_id": lead_id, "is_lead_car": 1, + "car_type": stock_lead.car_type if stock_lead is not None else CAR_TYPE_CAR, + "rotation": stock_lead.rotation if stock_lead is not None else lead_rotation(y_rel / lat_scale)} + elif slot in extras: + track = extras[slot] + else: + st = tracks[slot] if (tracks and slot < len(tracks)) else None + # never forward the camera's lead: if OP has no lead, the HUD must not flag one OP isn't acting on + track = ({"d_rel": st.d_rel, "y_rel": st.y_rel, "object_id": st.object_id, "is_lead_car": 0, + "car_type": st.car_type, "rotation": st.rotation} + if (st is not None and st.valid and not st.is_lead_car) else None) + return create_hud_object(packer, bus, mux, track) diff --git a/artifacts/package_runtime/iqdbc/car/honda/fingerprints.py b/artifacts/package_runtime/iqdbc/car/honda/fingerprints.py new file mode 100644 index 000000000..89b1da068 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/fingerprints.py @@ -0,0 +1,1102 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.honda.values import CAR + +from iqdbc.lvbs.car.iq_fingerprints import extend_fw_versions +from iqdbc.lvbs.car.honda.iq_fingerprints import FW_VERSIONS_EXT + +Ecu = CarParams.Ecu + +# Modified FW can be identified by the second dash being replaced by a comma +# For example: `b'39990-TVA,A150\x00\x00'` +# +# TODO: vsa is "essential" for fpv2 but doesn't appear on some CAR.FREED models + + +FW_VERSIONS = { + CAR.HONDA_NBOX_2G: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TTA-J030\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TTA-J040\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TTA-N930\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TTA-J070\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'38897-TTA-J010\x00\x00', + ], + }, + CAR.HONDA_ACCORD: { + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TVC-A910\x00\x00', + b'54008-TWA-A910\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-6A7-A220\x00\x00', + b'28101-6A7-A230\x00\x00', + b'28101-6A7-A320\x00\x00', + b'28101-6A7-A330\x00\x00', + b'28101-6A7-A410\x00\x00', + b'28101-6A7-A510\x00\x00', + b'28101-6A7-A610\x00\x00', + b'28101-6A7-A710\x00\x00', + b'28101-6A9-H140\x00\x00', + b'28101-6A9-H420\x00\x00', + b'28102-6B8-A560\x00\x00', + b'28102-6B8-A570\x00\x00', + b'28102-6B8-A700\x00\x00', + b'28102-6B8-A800\x00\x00', + b'28102-6B8-C560\x00\x00', + b'28102-6B8-C570\x00\x00', + b'28102-6B8-M520\x00\x00', + b'28102-6B8-R700\x00\x00', + ], + (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ + b'46114-TVA-A050\x00\x00', + b'46114-TVA-A060\x00\x00', + b'46114-TVA-A080\x00\x00', + b'46114-TVA-A120\x00\x00', + b'46114-TVA-A320\x00\x00', + b'46114-TVA-A410\x00\x00', + b'46114-TVE-H550\x00\x00', + b'46114-TVE-H560\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TVA-B040\x00\x00', + b'57114-TVA-B050\x00\x00', + b'57114-TVA-B060\x00\x00', + b'57114-TVA-B530\x00\x00', + b'57114-TVA-C040\x00\x00', + b'57114-TVA-C050\x00\x00', + b'57114-TVA-C060\x00\x00', + b'57114-TVA-C530\x00\x00', + b'57114-TVA-D520\x00\x00', + b'57114-TVA-E520\x00\x00', + b'57114-TVE-H250\x00\x00', + b'57114-TWA-A040\x00\x00', + b'57114-TWA-A050\x00\x00', + b'57114-TWA-A530\x00\x00', + b'57114-TWA-B520\x00\x00', + b'57114-TWA-C510\x00\x00', + b'57114-TWB-H030\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TBX-H120\x00\x00', + b'39990-TVA-A140\x00\x00', + b'39990-TVA-A150\x00\x00', + b'39990-TVA-A160\x00\x00', + b'39990-TVA-A340\x00\x00', + b'39990-TVA-X030\x00\x00', + b'39990-TVA-X040\x00\x00', + b'39990-TVE-H130\x00\x00', + b'39990-TWB-H120\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TBX-H230\x00\x00', + b'77959-TVA-A460\x00\x00', + b'77959-TVA-F330\x00\x00', + b'77959-TVA-H230\x00\x00', + b'77959-TVA-L420\x00\x00', + b'77959-TVA-X330\x00\x00', + b'77959-TWA-A440\x00\x00', + b'77959-TWA-L420\x00\x00', + b'77959-TWB-H220\x00\x00', + ], + (Ecu.hud, 0x18da61f1, None): [ + b'78209-TVA-A010\x00\x00', + b'78209-TVA-A110\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TBX-H140\x00\x00', + b'36802-TVA-A150\x00\x00', + b'36802-TVA-A160\x00\x00', + b'36802-TVA-A170\x00\x00', + b'36802-TVA-A180\x00\x00', + b'36802-TVA-A330\x00\x00', + b'36802-TVC-A330\x00\x00', + b'36802-TVE-H070\x00\x00', + b'36802-TWA-A070\x00\x00', + b'36802-TWA-A080\x00\x00', + b'36802-TWA-A210\x00\x00', + b'36802-TWA-A330\x00\x00', + b'36802-TWB-H060\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TBX-H130\x00\x00', + b'36161-TVA-A060\x00\x00', + b'36161-TVA-A330\x00\x00', + b'36161-TVC-A330\x00\x00', + b'36161-TVE-H050\x00\x00', + b'36161-TWA-A070\x00\x00', + b'36161-TWA-A330\x00\x00', + b'36161-TWB-H040\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TVA-A010\x00\x00', + b'38897-TVA-A020\x00\x00', + b'38897-TVA-A230\x00\x00', + b'38897-TVA-A240\x00\x00', + b'38897-TWA-A120\x00\x00', + b'38897-TWD-J020\x00\x00', + ], + }, + CAR.HONDA_CIVIC: { + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-5CG-A040\x00\x00', + b'28101-5CG-A050\x00\x00', + b'28101-5CG-A070\x00\x00', + b'28101-5CG-A080\x00\x00', + b'28101-5CG-A320\x00\x00', + b'28101-5CG-A810\x00\x00', + b'28101-5CG-A820\x00\x00', + b'28101-5DJ-A040\x00\x00', + b'28101-5DJ-A060\x00\x00', + b'28101-5DJ-A510\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TBA-A540\x00\x00', + b'57114-TBA-A550\x00\x00', + b'57114-TBA-A560\x00\x00', + b'57114-TBA-A570\x00\x00', + b'57114-TEA-Q220\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TBA-A030\x00\x00', + b'39990-TBG-A030\x00\x00', + b'39990-TEA-T020\x00\x00', + b'39990-TEG-A010\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TBA-A030\x00\x00', + b'77959-TBA-A040\x00\x00', + b'77959-TBG-A020\x00\x00', + b'77959-TBG-A030\x00\x00', + b'77959-TEA-Q820\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-TBA-A020\x00\x00', + b'36161-TBA-A030\x00\x00', + b'36161-TBA-A040\x00\x00', + b'36161-TBC-A020\x00\x00', + b'36161-TBC-A030\x00\x00', + b'36161-TED-Q320\x00\x00', + b'36161-TEG-A010\x00\x00', + b'36161-TEG-A020\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TBA-A010\x00\x00', + b'38897-TBA-A020\x00\x00', + ], + }, + CAR.HONDA_CIVIC_BOSCH: { + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-5CG-A920\x00\x00', + b'28101-5CG-AB10\x00\x00', + b'28101-5CG-C110\x00\x00', + b'28101-5CG-C220\x00\x00', + b'28101-5CG-C320\x00\x00', + b'28101-5CG-G020\x00\x00', + b'28101-5CG-L020\x00\x00', + b'28101-5CK-A130\x00\x00', + b'28101-5CK-A140\x00\x00', + b'28101-5CK-A150\x00\x00', + b'28101-5CK-C130\x00\x00', + b'28101-5CK-C140\x00\x00', + b'28101-5CK-C150\x00\x00', + b'28101-5CK-G210\x00\x00', + b'28101-5CK-J710\x00\x00', + b'28101-5CK-Q110\x00\x00', + b'28101-5CK-Q610\x00\x00', + b'28101-5DJ-A610\x00\x00', + b'28101-5DJ-A710\x00\x00', + b'28101-5DV-E330\x00\x00', + b'28101-5DV-E610\x00\x00', + b'28101-5DV-E820\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TBG-A330\x00\x00', + b'57114-TBG-A340\x00\x00', + b'57114-TBG-A350\x00\x00', + b'57114-TGG-A340\x00\x00', + b'57114-TGG-C120\x00\x00', + b'57114-TGG-C320\x00\x00', + b'57114-TGG-G320\x00\x00', + b'57114-TGG-L320\x00\x00', + b'57114-TGG-L330\x00\x00', + b'57114-TGH-A130\x00\x00', + b'57114-TGH-L130\x00\x00', + b'57114-TGJ-Q330\x00\x00', + b'57114-TGK-T320\x00\x00', + b'57114-TGL-G330\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TBA-C020\x00\x00', + b'39990-TBA-C120\x00\x00', + b'39990-TEA-T330\x00\x00', + b'39990-TEA-T820\x00\x00', + b'39990-TEZ-T020\x00\x00', + b'39990-TGG-A020\x00\x00', + b'39990-TGG-A120\x00\x00', + b'39990-TGG-J510\x00\x00', + b'39990-TGH-J020\x00\x00', + b'39990-TGH-J530\x00\x00', + b'39990-TGL-E130\x00\x00', + b'39990-TGN-E120\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TBA-A060\x00\x00', + b'77959-TBG-A050\x00\x00', + b'77959-TEA-G020\x00\x00', + b'77959-TGG-A020\x00\x00', + b'77959-TGG-A030\x00\x00', + b'77959-TGG-E010\x00\x00', + b'77959-TGG-G010\x00\x00', + b'77959-TGG-G110\x00\x00', + b'77959-TGG-J320\x00\x00', + b'77959-TGG-Q810\x00\x00', + b'77959-TGG-Z820\x00\x00', + b'77959-TGH-E220\x00\x00', + b'77959-TGH-J110\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TBA-A150\x00\x00', + b'36802-TBA-A160\x00\x00', + b'36802-TFJ-G060\x00\x00', + b'36802-TGG-A050\x00\x00', + b'36802-TGG-A060\x00\x00', + b'36802-TGG-A070\x00\x00', + b'36802-TGG-A130\x00\x00', + b'36802-TGG-G040\x00\x00', + b'36802-TGG-G130\x00\x00', + b'36802-TGH-A030\x00\x00', + b'36802-TGH-A140\x00\x00', + b'36802-TGK-Q030\x00\x00', + b'36802-TGK-Q120\x00\x00', + b'36802-TGL-G040\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TBA-A130\x00\x00', + b'36161-TBA-A140\x00\x00', + b'36161-TFJ-G070\x00\x00', + b'36161-TGG-A060\x00\x00', + b'36161-TGG-A080\x00\x00', + b'36161-TGG-A120\x00\x00', + b'36161-TGG-G050\x00\x00', + b'36161-TGG-G070\x00\x00', + b'36161-TGG-G130\x00\x00', + b'36161-TGG-G140\x00\x00', + b'36161-TGH-A020\x00\x00', + b'36161-TGH-A140\x00\x00', + b'36161-TGK-Q040\x00\x00', + b'36161-TGK-Q120\x00\x00', + b'36161-TGL-G050\x00\x00', + b'36161-TGL-G070\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TBA-A020\x00\x00', + b'38897-TBA-A110\x00\x00', + b'38897-TGH-A010\x00\x00', + ], + (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ + b'39494-TGL-G030\x00\x00', + ], + }, + CAR.HONDA_CIVIC_BOSCH_DIESEL: { + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-59Y-G220\x00\x00', + b'28101-59Y-G620\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TGN-E320\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TFK-G020\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TFK-G210\x00\x00', + b'77959-TGN-G220\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TFK-G130\x00\x00', + b'36802-TGN-G130\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TGN-E010\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TFK-G130\x00\x00', + b'36161-TGN-G130\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TBA-A020\x00\x00', + ], + }, + CAR.HONDA_CRV: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-T1W-A230\x00\x00', + b'57114-T1W-A240\x00\x00', + b'57114-TFF-A930\x00\x00', + b'57114-TFF-A940\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-T0A-A230\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-T1W-A830\x00\x00', + b'36161-T1W-C830\x00\x00', + b'36161-T1X-A830\x00\x00', + ], + }, + CAR.HONDA_CRV_5G: { + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-5RG-A020\x00\x00', + b'28101-5RG-A030\x00\x00', + b'28101-5RG-A040\x00\x00', + b'28101-5RG-A120\x00\x00', + b'28101-5RG-A220\x00\x00', + b'28101-5RH-A020\x00\x00', + b'28101-5RH-A030\x00\x00', + b'28101-5RH-A040\x00\x00', + b'28101-5RH-A120\x00\x00', + b'28101-5RH-A220\x00\x00', + b'28101-5RL-Q010\x00\x00', + b'28101-5RM-F010\x00\x00', + b'28101-5RM-K010\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TLA-A040\x00\x00', + b'57114-TLA-A050\x00\x00', + b'57114-TLA-A060\x00\x00', + b'57114-TLB-A830\x00\x00', + b'57114-TMC-Z040\x00\x00', + b'57114-TMC-Z050\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TLA-A040\x00\x00', + b'39990-TLA-A110\x00\x00', + b'39990-TLA-A220\x00\x00', + b'39990-TME-T030\x00\x00', + b'39990-TME-T120\x00\x00', + b'39990-TMT-T010\x00\x00', + ], + (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ + b'46114-TLA-A040\x00\x00', + b'46114-TLA-A050\x00\x00', + b'46114-TLA-A930\x00\x00', + b'46114-TMC-U020\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TLA-A010\x00\x00', + b'38897-TLA-A110\x00\x00', + b'38897-TNY-G010\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TLA-A040\x00\x00', + b'36802-TLA-A050\x00\x00', + b'36802-TLA-A060\x00\x00', + b'36802-TLA-A070\x00\x00', + b'36802-TMC-Q040\x00\x00', + b'36802-TMC-Q070\x00\x00', + b'36802-TNY-A030\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TLA-A060\x00\x00', + b'36161-TLA-A070\x00\x00', + b'36161-TLA-A080\x00\x00', + b'36161-TMC-Q020\x00\x00', + b'36161-TMC-Q030\x00\x00', + b'36161-TMC-Q040\x00\x00', + b'36161-TNY-A020\x00\x00', + b'36161-TNY-A030\x00\x00', + b'36161-TNY-A040\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TLA-A240\x00\x00', + b'77959-TLA-A250\x00\x00', + b'77959-TLA-A320\x00\x00', + b'77959-TLA-A410\x00\x00', + b'77959-TLA-A420\x00\x00', + b'77959-TLA-Q040\x00\x00', + b'77959-TLA-Z040\x00\x00', + b'77959-TMM-F040\x00\x00', + ], + }, + CAR.HONDA_CRV_EU: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-T1V-G920\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-T1V-G520\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-T1V-G010\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-5LH-E120\x00\x00', + b'28103-5LH-E100\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-T1G-G940\x00\x00', + ], + }, + CAR.HONDA_CRV_HYBRID: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TMB-H030\x00\x00', + b'57114-TPA-G020\x00\x00', + b'57114-TPG-A020\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TMA-H020\x00\x00', + b'39990-TPA-G030\x00\x00', + b'39990-TPG-A020\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TMA-H110\x00\x00', + b'38897-TPG-A110\x00\x00', + b'38897-TPG-A210\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TMB-H510\x00\x00', + b'54008-TMB-H610\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TMB-H040\x00\x00', + b'36161-TPA-E050\x00\x00', + b'36161-TPA-E070\x00\x00', + b'36161-TPG-A030\x00\x00', + b'36161-TPG-A040\x00\x00', + b'36161-TPG-A050\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TMB-H040\x00\x00', + b'36802-TPA-E040\x00\x00', + b'36802-TPG-A020\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TLA-C320\x00\x00', + b'77959-TLA-C410\x00\x00', + b'77959-TLA-C420\x00\x00', + b'77959-TLA-G220\x00\x00', + b'77959-TLA-H240\x00\x00', + ], + }, + CAR.HONDA_FIT: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-T5R-L020\x00\x00', + b'57114-T5R-L220\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-T5R-C020\x00\x00', + b'39990-T5R-C030\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-T5A-J010\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-T5R-A040\x00\x00', + b'36161-T5R-A240\x00\x00', + b'36161-T5R-A520\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-T5R-A230\x00\x00', + ], + }, + CAR.HONDA_FREED: { + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TDK-J010\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TDK-J050\x00\x00', + b'39990-TDK-N020\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TDK-J120\x00\x00', + b'57114-TDK-J330\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-TDK-J070\x00\x00', + b'36161-TDK-J080\x00\x00', + b'36161-TDK-J530\x00\x00', + ], + }, + CAR.ACURA_MDX_4G_MMR: { + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'8S102-TYA-A020\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S302-TYA-A020\x00\x00', + ], + }, + CAR.HONDA_ODYSSEY: { + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-THR-A010\x00\x00', + b'38897-THR-A020\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-THR-A020\x00\x00', + b'39990-THR-A030\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-THR-A010\x00\x00', + b'77959-THR-A110\x00\x00', + b'77959-THR-X010\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-THR-A020\x00\x00', + b'36161-THR-A030\x00\x00', + b'36161-THR-A110\x00\x00', + b'36161-THR-A720\x00\x00', + b'36161-THR-A730\x00\x00', + b'36161-THR-A810\x00\x00', + b'36161-THR-A910\x00\x00', + b'36161-THR-C010\x00\x00', + b'36161-THR-D110\x00\x00', + b'36161-THR-K020\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-5NZ-A110\x00\x00', + b'28101-5NZ-A310\x00\x00', + b'28101-5NZ-C310\x00\x00', + b'28102-5MX-A001\x00\x00', + b'28102-5MX-A600\x00\x00', + b'28102-5MX-A610\x00\x00', + b'28102-5MX-A700\x00\x00', + b'28102-5MX-A710\x00\x00', + b'28102-5MX-A900\x00\x00', + b'28102-5MX-A910\x00\x00', + b'28102-5MX-C001\x00\x00', + b'28102-5MX-C610\x00\x00', + b'28102-5MX-C910\x00\x00', + b'28102-5MX-D001\x00\x00', + b'28102-5MX-D710\x00\x00', + b'28102-5MX-K610\x00\x00', + b'28103-5NZ-A100\x00\x00', + b'28103-5NZ-A300\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-THR-A040\x00\x00', + b'57114-THR-A110\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-THR-A020\x00\x00', + ], + }, + CAR.HONDA_ODYSSEY_TWN: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-T6A-J210\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-T6A-P110\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-T6A-P040\x00\x00', + ], + }, + CAR.HONDA_ODYSSEY_5G_MMR: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-THR-A240\x00\x00', + b'57114-THR-A520\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-THR-A220\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-THR-A220\x00\x00', + b'36161-THR-A230\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-THR-A310\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28102-5MX-A100\x00\x00', + b'28102-5MX-A200\x00\x00', + b'28102-5MX-A410\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-THR-A220\x00\x00', + b'77959-THR-A230\x00\x00', + b'77959-THR-A320\x00\x00', + ], + (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ + b'46114-THR-A530\x00\x00', + b'46114-THR-A540\x00\x00', + b'46114-THR-A720\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-THR-A130\x00\x00', + b'38897-THR-A320\x00\x00', + b'38897-THR-A410\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-THR-A050\x00\x00', + b'39990-THR-A110\x00\x00', + ], + }, + CAR.HONDA_PILOT: { + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TG7-A520\x00\x00', + b'54008-TG7-A530\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-5EY-A040\x00\x00', + b'28101-5EY-A050\x00\x00', + b'28101-5EY-A100\x00\x00', + b'28101-5EY-A330\x00\x00', + b'28101-5EY-A430\x00\x00', + b'28101-5EY-A500\x00\x00', + b'28101-5EZ-A050\x00\x00', + b'28101-5EZ-A060\x00\x00', + b'28101-5EZ-A100\x00\x00', + b'28101-5EZ-A210\x00\x00', + b'28101-5EZ-A330\x00\x00', + b'28101-5EZ-A430\x00\x00', + b'28101-5EZ-A500\x00\x00', + b'28101-5EZ-A600\x00\x00', + b'28101-5EZ-A700\x00\x00', + b'28103-5EY-A110\x00\x00', + b'28103-5EZ-A010\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TG7-A030\x00\x00', + b'38897-TG7-A040\x00\x00', + b'38897-TG7-A110\x00\x00', + b'38897-TG7-A210\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TG7-A030\x00\x00', + b'39990-TG7-A040\x00\x00', + b'39990-TG7-A060\x00\x00', + b'39990-TG7-A070\x00\x00', + b'39990-TGS-A230\x00\x00', + b'39990-TGS-A320\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-TG7-A310\x00\x00', + b'36161-TG7-A520\x00\x00', + b'36161-TG7-A630\x00\x00', + b'36161-TG7-A720\x00\x00', + b'36161-TG7-A820\x00\x00', + b'36161-TG7-A930\x00\x00', + b'36161-TG7-C520\x00\x00', + b'36161-TG7-D520\x00\x00', + b'36161-TG7-D630\x00\x00', + b'36161-TG7-Y630\x00\x00', + b'36161-TG8-A410\x00\x00', + b'36161-TG8-A520\x00\x00', + b'36161-TG8-A630\x00\x00', + b'36161-TG8-A720\x00\x00', + b'36161-TG8-A830\x00\x00', + b'36161-TGS-A030\x00\x00', + b'36161-TGS-A130\x00\x00', + b'36161-TGS-A220\x00\x00', + b'36161-TGS-A320\x00\x00', + b'36161-TGT-A030\x00\x00', + b'36161-TGT-A130\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TG7-A020\x00\x00', + b'77959-TG7-A110\x00\x00', + b'77959-TG7-A210\x00\x00', + b'77959-TG7-Y210\x00\x00', + b'77959-TGS-A010\x00\x00', + b'77959-TGS-A110\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TG7-A130\x00\x00', + b'57114-TG7-A140\x00\x00', + b'57114-TG7-A230\x00\x00', + b'57114-TG7-A240\x00\x00', + b'57114-TG7-A630\x00\x00', + b'57114-TG7-A730\x00\x00', + b'57114-TG8-A140\x00\x00', + b'57114-TG8-A230\x00\x00', + b'57114-TG8-A240\x00\x00', + b'57114-TG8-A630\x00\x00', + b'57114-TG8-A730\x00\x00', + b'57114-TGS-A530\x00\x00', + b'57114-TGT-A530\x00\x00', + ], + }, + CAR.ACURA_RDX: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TX4-A220\x00\x00', + b'57114-TX5-A220\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-TX4-A030\x00\x00', + b'36161-TX5-A030\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TX4-B010\x00\x00', + b'77959-TX4-C010\x00\x00', + b'77959-TX4-C020\x00\x00', + ], + }, + CAR.ACURA_RDX_3G: { + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TJB-A030\x00\x00', + b'57114-TJB-A040\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TJB-A040\x00\x00', + b'36802-TJB-A050\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TJB-A040\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TJB-A520\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28102-5YK-A610\x00\x00', + b'28102-5YK-A620\x00\x00', + b'28102-5YK-A630\x00\x00', + b'28102-5YK-A700\x00\x00', + b'28102-5YK-A711\x00\x00', + b'28102-5YL-A620\x00\x00', + b'28102-5YL-A700\x00\x00', + b'28102-5YL-A711\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TJB-A040\x00\x00', + b'77959-TJB-A210\x00\x00', + ], + (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ + b'46114-TJB-A040\x00\x00', + b'46114-TJB-A050\x00\x00', + b'46114-TJB-A060\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TJB-A040\x00\x00', + b'38897-TJB-A110\x00\x00', + b'38897-TJB-A120\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TJB-A030\x00\x00', + b'39990-TJB-A040\x00\x00', + b'39990-TJB-A130\x00\x00', + ], + }, + CAR.HONDA_RIDGELINE: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-T6Z-A020\x00\x00', + b'39990-T6Z-A030\x00\x00', + b'39990-T6Z-A050\x00\x00', + b'39990-T6Z-A110\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-T6Z-A020\x00\x00', + b'36161-T6Z-A310\x00\x00', + b'36161-T6Z-A420\x00\x00', + b'36161-T6Z-A520\x00\x00', + b'36161-T6Z-A620\x00\x00', + b'36161-T6Z-A720\x00\x00', + b'36161-TJZ-A120\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-T6Z-A010\x00\x00', + b'38897-T6Z-A110\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-T6Z-A020\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-T6Z-A120\x00\x00', + b'57114-T6Z-A130\x00\x00', + b'57114-T6Z-A520\x00\x00', + b'57114-T6Z-A610\x00\x00', + b'57114-TJZ-A520\x00\x00', + ], + }, + CAR.HONDA_INSIGHT: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TXM-A040\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TXM-A070\x00\x00', + b'36802-TXM-A080\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TXM-A050\x00\x00', + b'36161-TXM-A060\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TXM-A230\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TXM-A030\x00\x00', + b'57114-TXM-A040\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TWA-A910\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TXM-A020\x00\x00', + ], + }, + CAR.HONDA_HRV: { + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-T7A-A010\x00\x00', + b'38897-T7A-A110\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-THX-A020\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-T7A-A040\x00\x00', + b'36161-T7A-A140\x00\x00', + b'36161-T7A-A240\x00\x00', + b'36161-T7A-C440\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-T7A-A230\x00\x00', + ], + }, + CAR.HONDA_HRV_3G: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-3M0-G110\x00\x00', + b'39990-3M0-J030\x00\x00', + b'39990-3W0-A030\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-3M0-M110\x00\x00', + b'38897-3M0-Z010\x00\x00', + b'38897-3W1-A010\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-3M0-K840\x00\x00', + b'77959-3N1-Z840\x00\x00', + b'77959-3V0-A820\x00\x00', + b'77959-3V0-A910\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S102-3M1-T050\x00\x00', + b'8S102-3M3-T050\x00\x00', + b'8S102-3M6-P030\x00\x00', + b'8S102-3M6-PA20\x00\x00', + b'8S102-3W0-A060\x00\x00', + b'8S102-3W0-AB10\x00\x00', + b'8S102-3W0-AB20\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-3M6-M010\x00\x00', + b'57114-3N1-T020\x00\x00', + b'57114-3W0-A040\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-6EH-A010\x00\x00', + b'28101-6EH-A110\x00\x00', + b'28101-6JC-M310\x00\x00', + ], + (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ + b'46114-3W0-A020\x00\x00', + b'46114-3W0-A050\x00\x00', + ], + }, + CAR.ACURA_ILX: { + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TX6-A010\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-TV9-A040\x00\x00', + b'36161-TV9-A140\x00\x00', + b'36161-TV9-C140\x00\x00', + b'36161-TX6-A030\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TX6-A210\x00\x00', + b'77959-TX6-A230\x00\x00', + b'77959-TX6-C210\x00\x00', + ], + }, + CAR.HONDA_E: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TYF-N030\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TYF-E140\x00\x00', + ], + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TYF-E010\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TYF-G430\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TYF-E030\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TYF-E020\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TYF-E030\x00\x00', + ], + }, + CAR.HONDA_CIVIC_2022: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-T24-T120\x00\x00', + b'39990-T38-A040\x00\x00', + b'39990-T39-A130\x00\x00', + b'39990-T43-J020\x00\x00', + b'39990-T43-J030\x00\x00', + b'39990-T50-J030\x00\x00', + b'39990-T50-J110\x00\x00', + b'39990-T56-A040\x00\x00', + b'39990-T60-J030\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-T20-A020\x00\x00', + b'38897-T20-A210\x00\x00', + b'38897-T20-A310\x00\x00', + b'38897-T20-A510\x00\x00', + b'38897-T21-A010\x00\x00', + b'38897-T22-A110\x00\x00', + b'38897-T24-Z120\x00\x00', + b'38897-T47-AA20\x00\x00', + b'38897-T50-E310\x00\x00', + b'38897-T50-EA10\x00\x00', + b'38897-T60-A110\x00\x00', + b'38897-T61-A320\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-T20-A970\x00\x00', + b'77959-T20-A980\x00\x00', + b'77959-T20-M820\x00\x00', + b'77959-T39-A910\x00\x00', + b'77959-T47-A940\x00\x00', + b'77959-T47-A950\x00\x00', + b'77959-T50-G010\x00\x00', + b'77959-T50-G930\x00\x00', + b'77959-T60-A920\x00\x00', + b'77959-T61-A920\x00\x00', + b'77959-T65-A920\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-T20-A060\x00\x00', + b'36161-T20-A070\x00\x00', + b'36161-T20-A080\x00\x00', + b'36161-T24-T070\x00\x00', + b'36161-T38-A060\x00\x00', + b'36161-T47-A050\x00\x00', + b'36161-T47-A060\x00\x00', + b'36161-T47-A070\x00\x00', + b'8S102-T20-AA10\x00\x00', + b'8S102-T43-J540\x00\x00', + b'8S102-T47-AA10\x00\x00', + b'8S102-T47-AA20\x00\x00', + b'8S102-T50-EA10\x00\x00', + b'8S102-T56-A060\x00\x00', + b'8S102-T56-A070\x00\x00', + b'8S102-T60-AA10\x00\x00', + b'8S102-T64-A040\x00\x00', + b'8S102-T64-A050\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-T20-AB40\x00\x00', + b'57114-T24-TB30\x00\x00', + b'57114-T38-AA20\x00\x00', + b'57114-T43-JA30\x00\x00', + b'57114-T43-JB30\x00\x00', + b'57114-T50-JC20\x00\x00', + b'57114-T60-AA20\x00\x00', + b'57114-T61-AJ30\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-65D-A020\x00\x00', + b'28101-65D-A120\x00\x00', + b'28101-65H-A020\x00\x00', + b'28101-65H-A120\x00\x00', + b'28101-65J-N010\x00\x00', + ], + }, + CAR.HONDA_PILOT_4G: { + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'8S102-T90-A050\x00\x00', + b'8S102-T90-A060\x00\x00', + b'8S102-T90-A070\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S302-T90-A040\x00\x00', + ], + }, + CAR.HONDA_ACCORD_11G: { + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S302-30A-A040\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'8S102-30A-A050\x00\x00', + b'8S102-30A-A060\x00\x00', + b'8S102-30A-A070\x00\x00', + ], + }, + CAR.HONDA_CRV_6G: { + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S302-3A0-A060\x00\x00', + b'8S302-3A0-A220\x00\x00', + b'8S302-3C0-Q050\x00\x00', + b'8S302-3D4-A050\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'8S102-3A0-A070\x00\x00', + b'8S102-3A0-A090\x00\x00', + b'8S102-3A0-A110\x00\x00', + b'8S102-3A0-A230\x00\x00', + b'8S102-3C0-Q060\x00\x00', + b'8S102-3D4-A060\x00\x00', + b'8S102-3D4-A070\x00\x00', + b'8S102-3D4-A080\x00\x00', + b'8S102-3D4-A090\x00\x00', + ], + }, + CAR.HONDA_CITY_7G: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-T14-B030\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-T14-M110\x00\x00', + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-T00-B830\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-T14-P050\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-T14-B030\x00\x00', + ], + (Ecu.transmission, 0x18da1ef1, None): [ + b'28101-63B-M420\x00\x00', + ], + }, + CAR.HONDA_PASSPORT_4G: { + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S302-3BM-A020\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'8S102-3BM-A020\x00\x00', + ], + }, + CAR.ACURA_TLX_2G: { + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36802-TGV-A060\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'36161-TGV-A030\x00\x00', + ], + }, + CAR.ACURA_TLX_2G_MMR: { + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'8S302-TGV-A030\x00\x00', + ], + (Ecu.fwdCamera, 0x18dab5f1, None): [ + b'8S102-TGV-A030\x00\x00', + ], + }, +} + +FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) diff --git a/artifacts/package_runtime/iqdbc/car/honda/hondacan.py b/artifacts/package_runtime/iqdbc/car/honda/hondacan.py new file mode 100644 index 000000000..7b855e3e4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/hondacan.py @@ -0,0 +1,324 @@ +from iqdbc.car import CanBusBase +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.honda.values import (HondaFlags, HONDA_BOSCH, HONDA_BOSCH_ALT_RADAR, HONDA_BOSCH_RADARLESS, + HONDA_BOSCH_CANFD, CarControllerParams) +from iqdbc.lvbs.car.honda.iq_values import HondaFlagsIQ + +# CAN bus layout with relay +# 0 = ACC-CAN - radar side +# 1 = F-CAN B - powertrain +# 2 = ACC-CAN - camera side +# 3 = F-CAN A - OBDII port + + +class CanBus(CanBusBase): + def __init__(self, CP=None, fingerprint=None) -> None: + # use fingerprint if specified + super().__init__(CP if fingerprint is None else None, fingerprint) + + # powertrain bus is split instead of radar on radarless and CAN FD Bosch + if CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS - HONDA_BOSCH_CANFD): + self._pt, self._radar = self.offset + 1, self.offset + # normally steering commands are sent to radar, which forwards them to powertrain bus + # when radar is disabled, steering commands are sent directly to powertrain bus + self._lkas = self._pt if CP.openpilotLongitudinalControl else self._radar + else: + self._pt, self._radar, self._lkas = self.offset, self.offset + 1, self.offset + + @property + def pt(self) -> int: + return self._pt + + @property + def radar(self) -> int: + return self._radar + + @property + def camera(self) -> int: + return self.offset + 2 + + @property + def lkas(self) -> int: + return self._lkas + + # B-CAN is forwarded to ACC-CAN radar side (CAN 0 on fake ethernet port) + @property + def body(self) -> int: + return self.offset + + +def create_brake_command(packer, CAN, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, car_fingerprint, stock_brake, CP_IQ): + # TODO: do we loose pressure if we keep pump off for long? + brakelights = apply_brake > 0 + brake_rq = apply_brake > 0 + pcm_fault_cmd = False + + values = { + "CRUISE_OVERRIDE": pcm_override, + "CRUISE_FAULT_CMD": pcm_fault_cmd, + "CRUISE_CANCEL_CMD": pcm_cancel_cmd, + "COMPUTER_BRAKE_REQUEST": brake_rq, + "SET_ME_1": 1, + "BRAKE_LIGHTS": brakelights, + "CHIME": stock_brake["CHIME"] if fcw else 0, # send the chime for stock fcw + "FCW": fcw << 1, # TODO: Why are there two bits for fcw? + "AEB_REQ_1": 0, + "AEB_REQ_2": 0, + "AEB_STATUS": 0, + } + + if CP_IQ.flags & HondaFlagsIQ.NIDEC_HYBRID: + values["COMPUTER_BRAKE_HYBRID"] = apply_brake + values["BRAKE_PUMP_REQUEST_HYBRID"] = apply_brake > 0 + else: + values["COMPUTER_BRAKE"] = apply_brake + values["BRAKE_PUMP_REQUEST"] = pump_on + + return packer.make_can_msg("BRAKE_COMMAND", CAN.pt, values) + + +def create_acc_commands(packer, CAN, enabled, active, accel, gas, stopping_counter, CP, gas_force): + commands = [] + min_gas_accel = CarControllerParams.BOSCH_GAS_LOOKUP_BP[0] + + control_on = 5 if enabled else 0 + gas_command = gas if active and gas_force > min_gas_accel else -30000 + accel_command = accel if active else 0 + braking = 1 if active and gas_force < min_gas_accel else 0 + standstill = 1 if active and stopping_counter > 0 else 0 + standstill_release = 1 if active and stopping_counter == 0 else 0 + + # common ACC_CONTROL values + acc_control_values = { + 'ACCEL_COMMAND': accel_command, + 'STANDSTILL': standstill, + } + + if CP.flags & HondaFlags.BOSCH_RADARLESS: + acc_control_values.update({ + "CONTROL_ON": enabled, + # hybrid and alt-brake cars require this bit whenever braking; others use it for idle stop after 4s at 50Hz + "COMPUTER_BRAKE_ASSIST": braking if CP.flags & (HondaFlags.HYBRID | HondaFlags.BOSCH_ALT_BRAKE) else stopping_counter > 200, + }) + else: + acc_control_values.update({ + 'BRAKE_REQUEST': braking, + # setting CONTROL_ON causes car to set POWERTRAIN_DATA->ACC_STATUS = 1 + "CONTROL_ON": control_on, + "GAS_COMMAND": gas_command, # used for gas + "BRAKE_LIGHTS": braking, + "STANDSTILL_RELEASE": standstill_release, + }) + acc_control_on_values = { + "SET_TO_3": 0x03, + "CONTROL_ON": enabled, + "SET_TO_FF": 0xff, + "SET_TO_75": 0x75, + "SET_TO_30": 0x30, + } + commands.append(packer.make_can_msg("ACC_CONTROL_ON", CAN.pt, acc_control_on_values)) + + commands.append(packer.make_can_msg("ACC_CONTROL", CAN.pt, acc_control_values)) + return commands + + +def create_steering_control(packer, CAN, apply_torque, lkas_active, tja_control): + values = { + "STEER_TORQUE": apply_torque if lkas_active else 0, + "STEER_TORQUE_REQUEST": lkas_active, + } + + if tja_control: + values["STEER_DOWN_TO_ZERO"] = lkas_active + + return packer.make_can_msg("STEERING_CONTROL", CAN.lkas, values) + + +def create_bosch_supplemental_1(packer, CAN): + # non-active params + values = { + "SET_ME_X04": 0x04, + "SET_ME_X80": 0x80, + "SET_ME_X10": 0x10, + } + return packer.make_can_msg("BOSCH_SUPPLEMENTAL_1", CAN.lkas, values) + + +def create_acc_hud(packer, bus, CP, enabled, pcm_speed, pcm_accel, hud_control, hud_v_cruise, is_metric, acc_hud): + acc_hud_values = { + 'CRUISE_SPEED': hud_v_cruise, + 'ENABLE_MINI_CAR': 1 if enabled else 0, + # only moves the lead car without ACC_ON + 'HUD_DISTANCE': hud_control.leadDistanceBars, # wraps to 0 at 4 bars + 'IMPERIAL_UNIT': int(not is_metric), + 'HUD_LEAD': 2 if enabled and hud_control.leadVisible else 1 if enabled else 0, + 'SET_ME_X01_2': 1, + } + + if CP.flags & HondaFlags.BOSCH_CANFD: + acc_hud_values['SET_ME_X01'] = int(enabled and (bool(acc_hud_values['HUD_LEAD']) or (pcm_accel < 0.2))) + acc_hud_values['SET_ME_X01_2'] = int(enabled and (bool(acc_hud_values['HUD_LEAD']) or (pcm_accel < 0.2))) + + if CP.carFingerprint in HONDA_BOSCH: + acc_hud_values['ACC_ON'] = int(enabled) + acc_hud_values['FCM_OFF'] = 0 + acc_hud_values['FCM_OFF_2'] = 0 + else: + # Shows the distance bars, TODO: stock camera shows updates temporarily while disabled + acc_hud_values['ACC_ON'] = int(enabled) + acc_hud_values['PCM_SPEED'] = pcm_speed * CV.MS_TO_KPH + acc_hud_values['PCM_GAS'] = pcm_accel + acc_hud_values['SET_ME_X01'] = 1 + acc_hud_values['FCM_OFF'] = acc_hud['FCM_OFF'] + acc_hud_values['FCM_OFF_2'] = acc_hud['FCM_OFF_2'] + acc_hud_values['FCM_PROBLEM'] = acc_hud['FCM_PROBLEM'] + acc_hud_values['ICONS'] = acc_hud['ICONS'] + + return packer.make_can_msg("ACC_HUD", bus, acc_hud_values) + + +def create_lkas_hud(packer, bus, CP, hud_control, lat_active, steering_available, reduced_steering, alert_steer_required, lkas_hud, dashed_lanes, + steer_fault_permanent=False, lkas_state_change=None): + commands = [] + + lkas_hud_values = { + 'LKAS_READY': 1, + 'LKAS_STATE_CHANGE': 1, + 'STEERING_REQUIRED': alert_steer_required, + 'SOLID_LANES': lat_active, + 'DASHED_LANES': dashed_lanes, + 'BEEP': 0, + } + + # the stock camera holds LKAS_STATE_CHANGE low, pulsing it high ~3s around HUD state changes; + # holding it high permanently suppresses the dash lane-line rendering + if lkas_state_change is not None: + lkas_hud_values['LKAS_STATE_CHANGE'] = int(lkas_state_change) + + if CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD): + lkas_hud_values['LANE_LINES'] = 3 + lkas_hud_values['DASHED_LANES'] = lat_active + + # car likely needs to see LKAS_PROBLEM fall within a specific time frame, so forward from camera + if CP.carFingerprint in HONDA_BOSCH_RADARLESS: + lkas_hud_values['LKAS_PROBLEM'] = lkas_hud['LKAS_PROBLEM'] + + if CP.carFingerprint in HONDA_BOSCH_CANFD: + lkas_hud_values['LKAS_PROBLEM'] = steer_fault_permanent + # CAN FD: dashed lanes are the AOL armed indication (dashed_lanes is aol.enabled and not + # latActive, which is not standstill-gated - so parked LKAS button presses produce cluster + # feedback). ORed with lat_active so the engaged payload keeps SOLID and DASHED set together, + # byte-matching the stock camera's lanes-on state + lkas_hud_values['DASHED_LANES'] = dashed_lanes or lat_active + # every payload change must coincide with an LKAS_STATE_CHANGE pulse (see carcontroller); keyed + # on lat_active, not lanesVisible, so the dash LKAS indication follows AOL's lateral state + lkas_hud_values['SOLID_LANES'] = lat_active + + if not (CP.flags & HondaFlags.BOSCH_EXT_HUD): + lkas_hud_values['RDM_OFF'] = 1 + lkas_hud_values['LANE_ASSIST_BEEP_OFF'] = 1 + + # New HUD concept for selected Bosch cars, overwrites some of the above + # TODO: make global across all Honda if feedback is favorable + if CP.carFingerprint in HONDA_BOSCH_ALT_RADAR: + lkas_hud_values['DASHED_LANES'] = steering_available and lat_active + lkas_hud_values['SOLID_LANES'] = lat_active + lkas_hud_values['LKAS_PROBLEM'] = lat_active and reduced_steering + + if CP.flags & HondaFlags.BOSCH_EXT_HUD and not CP.openpilotLongitudinalControl: + commands.append(packer.make_can_msg('LKAS_HUD_A', bus, lkas_hud_values)) + commands.append(packer.make_can_msg('LKAS_HUD_B', bus, lkas_hud_values)) + else: + commands.append(packer.make_can_msg('LKAS_HUD', bus, lkas_hud_values)) + + return commands + + +def create_radar_hud(packer, bus): + radar_hud_values = { + 'CMBS_OFF': 0x01, + 'SET_TO_1': 0x01, + } + + return packer.make_can_msg('RADAR_HUD', bus, radar_hud_values) + + +def create_legacy_brake_command(packer, bus): + return packer.make_can_msg("LEGACY_BRAKE_COMMAND", bus, {}) + + +def spam_buttons_command(packer, CAN, cruise_button, cruise_setting, ambient_light, car_fingerprint, bus=None): + values = { + 'CRUISE_BUTTONS': cruise_button, + 'CRUISE_SETTING': cruise_setting, + # the camera consumes this byte too (adaptive high beam); echo the SCM's live value + 'AMBIENT_LIGHT_MAYBE': ambient_light, + } + if bus is None: + # send buttons to camera on radarless (camera does ACC) cars + bus = CAN.camera if car_fingerprint in HONDA_BOSCH_RADARLESS else CAN.pt + return packer.make_can_msg("SCM_BUTTONS", bus, values) + + +def create_radar_hud_canfd(packer, bus, acc, acc_pulse=False): + values = { + # the stock radar raises this bit only in short bursts right after ACC engages, never held + 'CMBS_ENABLED_MAYBE': 1 if (acc and acc_pulse) else 0, + 'ACC_ON': acc, + 'SET_ME_X01': 0x01, + 'SET_ME_X01_2': 0x01, + } + return packer.make_can_msg("RADAR_HUD_CANFD", bus, values) + + +def create_canfd_supplemental(packer, bus): + values = { + 'SET_ME_X01': 0x01, + 'SET_ME_X41': 0x41, + } + return packer.make_can_msg("BOSCH_SUPPLEMENTAL_CANFD", bus, values) + + +def create_canfd_5hz_radar_messages(packer, bus, radar_ref_cntr, lane_path_length=6, left_lane=0, right_lane=0): + commands = [] + + radar_lead_values = { + 'CNTR_REF': radar_ref_cntr, + 'SET_ME_X01': 0x01, + # stock radar transmits a constant 140 here; 120 causes a camera mismatch + 'TARGET_SPEED_MAYBE': 140, + 'LEFT_LANE': left_lane, + 'RIGHT_LANE': right_lane, + # the dash cross-checks this against the LANE_PATH in-band terminator; a mismatch suppresses the lane lines + 'LANE_PATH_LENGTH': lane_path_length, + } + commands.append(packer.make_can_msg('RADAR_LEAD', bus, radar_lead_values)) + + radar_lead2_values = { + 'SET_ME_X88': 136, + 'SET_ME_X78': 120, + 'LEAD_DISTANCE_MAYBE': 0, + } + commands.append(packer.make_can_msg('RADAR_LEAD2', bus, radar_lead2_values)) + + return commands + + +def honda_checksum(address: int, sig, d: bytearray) -> int: + s = 0 + extended = address > 0x7FF + # extended ids above 0x100000 use a different checksum constant, observed on Bosch CAN FD radar messages + high_extended = address > 0x100000 + addr = address + while addr: + s += addr & 0xF + addr >>= 4 + for i in range(len(d)): + x = d[i] + if i == len(d) - 1: + x >>= 4 + s += (x & 0xF) + (x >> 4) + s = 8 - s + if extended: + s += 10 if high_extended else 3 + return s & 0xF diff --git a/artifacts/package_runtime/iqdbc/car/honda/interface.py b/artifacts/package_runtime/iqdbc/car/honda/interface.py new file mode 100644 index 000000000..7b3003e54 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/interface.py @@ -0,0 +1,392 @@ +#!/usr/bin/env python3 +import numpy as np +from iqdbc.car import get_safety_config, structs, uds +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.disable_ecu import disable_ecu, clear_all_dtcs, clear_ecu_dtcs +from iqdbc.car.honda.hondacan import CanBus +from iqdbc.car.honda.values import CarControllerParams, HondaFlags, CAR, HONDA_BOSCH, HONDA_BOSCH_CANFD, \ + HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS, \ + HONDA_RADAR_SCAN_VERIFIED, HondaSafetyFlags +from iqdbc.car.honda.carcontroller import CarController +from iqdbc.car.honda.carstate import CarState +from iqdbc.car.honda.radar_interface import RadarInterface +from iqdbc.car.interfaces import CarInterfaceBase + +from iqdbc.lvbs.car.honda.iq_values import HondaFlagsIQ, HondaSafetyFlagsIQ + +TransmissionType = structs.CarParams.TransmissionType + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + DRIVABLE_GEARS = (structs.CarState.GearShifter.sport,) + + @staticmethod + def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed): + if CP.carFingerprint in HONDA_BOSCH: + return CarControllerParams.BOSCH_ACCEL_MIN, CarControllerParams.BOSCH_ACCEL_MAX + elif CP_IQ.enableGasInterceptor: + return CarControllerParams.NIDEC_ACCEL_MIN, CarControllerParams.NIDEC_ACCEL_MAX + else: + # NIDECs don't allow acceleration near cruise_speed, + # so limit limits of pid to prevent windup + ACCEL_MAX_VALS = [CarControllerParams.NIDEC_ACCEL_MAX, 0.2] + ACCEL_MAX_BP = [cruise_speed - 2., cruise_speed - .2] + return CarControllerParams.NIDEC_ACCEL_MIN, np.interp(current_speed, ACCEL_MAX_BP, ACCEL_MAX_VALS) + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "honda" + + CAN = CanBus(ret, fingerprint) + + if candidate in HONDA_BOSCH: + cfgs = [get_safety_config(structs.CarParams.SafetyModel.hondaBosch)] + if candidate in HONDA_BOSCH_CANFD and CAN.pt >= 4: + cfgs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput)) + ret.safetyConfigs = cfgs + + # The object scan survives openpilot longitudinal: the radar disable is subnet-scoped to the + # powertrain bus, while the scan rides the camera-side ACC-CAN + ret.radarUnavailable = docs or candidate not in HONDA_RADAR_SCAN_VERIFIED + # Disable the radar and let openpilot control longitudinal + # WARNING: THIS DISABLES AEB! + # If Bosch radarless, this blocks ACC messages from the camera + ret.alphaLongitudinalAvailable = True + ret.openpilotLongitudinalControl = alpha_long + ret.pcmCruise = not ret.openpilotLongitudinalControl + else: + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.hondaNidec)] + ret.openpilotLongitudinalControl = True + + ret.pcmCruise = True + + if candidate == CAR.HONDA_CRV_5G: + ret.enableBsm = 0x12f8bfa7 in fingerprint[CAN.radar] + + # Detect Bosch cars with new HUD msgs + if any(0x33DA in f for f in fingerprint.values()): + ret.flags |= HondaFlags.BOSCH_EXT_HUD.value + + if 0x184 in fingerprint[CAN.pt]: + ret.flags |= HondaFlags.HYBRID.value + + if ret.flags & HondaFlags.ALLOW_MANUAL_TRANS and all(msg not in fingerprint[CAN.pt] for msg in (0x191, 0x1A3)): + # Manual transmission support for allowlisted cars only, to prevent silent fall-through on auto-detection failures + ret.transmissionType = TransmissionType.manual + elif 0x191 in fingerprint[CAN.pt] and candidate != CAR.ACURA_RDX: + # Traditional CVTs, gearshift position in GEARBOX_CVT + ret.transmissionType = TransmissionType.cvt + else: + # Traditional autos, direct-drive EVs and eCVTs, gearshift position in GEARBOX_AUTO + ret.transmissionType = TransmissionType.automatic + + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0], [0]] + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]] + ret.lateralTuning.pid.kf = 0.00006 # conservative feed-forward + ret.steerActuatorDelay = 0.1 + + if candidate in HONDA_BOSCH: + if candidate in HONDA_BOSCH_RADARLESS: + ret.stopAccel = CarControllerParams.BOSCH_ACCEL_MIN # stock uses -4.0 m/s^2 once stopped but limited by safety model + ret.longitudinalActuatorDelay = 0.25 # s + elif candidate in HONDA_BOSCH_CANFD: + ret.longitudinalActuatorDelay = 0.05 # near zero, canfd seems to have stock feedforward correction + else: + ret.longitudinalActuatorDelay = 0.25 # s, per Bosch A log + else: + # default longitudinal tuning for all hondas + ret.longitudinalTuning.kiBP = [0., 5., 35.] + ret.longitudinalTuning.kiV = [1.2, 0.8, 0.5] + + # Disable control if EPS mod detected + for fw in car_fw: + if fw.ecu == "eps" and b"," in fw.fwVersion: + ret.dashcamOnly = True + + if candidate == CAR.HONDA_CIVIC: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560], [0, 2560]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[1.1], [0.33]] + + elif candidate in (CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL): + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] + + elif candidate == CAR.HONDA_CIVIC_2022: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 5120], [0, 5120]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kpV = [[0, 10], [0.05, 0.5]] + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kiV = [[0, 10], [0.0125, 0.125]] + + elif candidate == CAR.HONDA_ACCORD: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] + if ret.transmissionType == TransmissionType.manual: + CarControllerParams.BOSCH_GAS_LOOKUP_BP = [-0.2, 2.0] + + elif candidate == CAR.HONDA_ACCORD_11G: + ret.steerActuatorDelay = 0.22 + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 12747], [0, 12747]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.18]] + + elif candidate == CAR.ACURA_ILX: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] + + elif candidate in (CAR.HONDA_CRV, CAR.HONDA_CRV_EU): + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 1000], [0, 1000]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] + ret.wheelSpeedFactor = 1.025 + + elif candidate == CAR.HONDA_CRV_5G: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.64], [0.192]] + ret.wheelSpeedFactor = 1.025 + + elif candidate == CAR.HONDA_CRV_HYBRID: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] + ret.wheelSpeedFactor = 1.025 + + elif candidate == CAR.HONDA_CRV_6G: + ret.steerActuatorDelay = 0.15 + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 5100], [0, 5100]] + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + elif candidate == CAR.HONDA_FIT: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] + + elif candidate == CAR.HONDA_FREED: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] + + elif candidate in (CAR.HONDA_HRV, CAR.HONDA_HRV_3G): + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] + if candidate == CAR.HONDA_HRV: + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.025]] + ret.wheelSpeedFactor = 1.025 + else: + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] # TODO: can probably use some tuning + + elif candidate == CAR.ACURA_RDX: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 1000], [0, 1000]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] + + elif candidate == CAR.ACURA_RDX_3G: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4095], [0, 4095]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]] + + elif candidate == CAR.HONDA_ODYSSEY: + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]] + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + + elif candidate == CAR.HONDA_ODYSSEY_TWN: + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]] + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 32767], [0, 32767]] # TODO: determine if there is a dead zone at the top end + + elif candidate in (CAR.HONDA_PILOT, CAR.HONDA_PILOT_4G, CAR.HONDA_PASSPORT_4G, CAR.ACURA_MDX_4G_MMR): + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kpV = [[0, 10], [0.05, 0.5]] + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kiV = [[0, 10], [0.0125, 0.125]] + + elif candidate == CAR.HONDA_RIDGELINE: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]] + + elif candidate in (CAR.HONDA_INSIGHT, CAR.HONDA_NBOX_2G): + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] + + elif candidate == CAR.HONDA_E: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] # TODO: can probably use some tuning + + elif candidate == CAR.HONDA_ODYSSEY_5G_MMR: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3810], [0, 3810]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]] + ret.steerActuatorDelay = 0.15 + CarControllerParams.BOSCH_GAS_LOOKUP_V = [0, 2000] + if not ret.openpilotLongitudinalControl: + # When using stock ACC, the radar intercepts and filters steering commands the EPS would otherwise accept + ret.minSteerSpeed = 70. * CV.KPH_TO_MS + + elif candidate == CAR.ACURA_TLX_2G_MMR: + ret.steerActuatorDelay = 0.15 + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] + ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kpV = [[0, 10], [0.05, 0.5]] + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kiV = [[0, 10], [0.0125, 0.125]] + + elif candidate == CAR.HONDA_CLARITY: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560], [0, 2560]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] + + else: + ret.steerActuatorDelay = 0.15 + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560], [0, 2560]] + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + if candidate == CAR.HONDA_PILOT_4G: + CarControllerParams.BOSCH_GAS_LOOKUP_V = [0, 2200] + elif candidate == CAR.ACURA_RDX_3G: + CarControllerParams.BOSCH_GAS_LOOKUP_V = [0, 2200] + elif candidate == CAR.HONDA_CRV_6G and ret.flags & HondaFlags.HYBRID: + CarControllerParams.BOSCH_GAS_LOOKUP_BP = [-0.3, 2.0] + + # These cars use alternate user brake msg (0x1BE) + if 0x1BE in fingerprint[CAN.pt] and candidate in HONDA_BOSCH: + ret.flags |= HondaFlags.BOSCH_ALT_BRAKE.value + + if ret.flags & HondaFlags.BOSCH_ALT_BRAKE: + ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.ALT_BRAKE.value + if candidate in HONDA_NIDEC_ALT_SCM_MESSAGES: + ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.NIDEC_ALT.value + if ret.openpilotLongitudinalControl and candidate in HONDA_BOSCH: + ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.BOSCH_LONG.value + if candidate in HONDA_BOSCH_RADARLESS: + ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.RADARLESS.value + if candidate in HONDA_BOSCH_CANFD: + ret.safetyConfigs[-1].safetyParam |= HondaSafetyFlags.BOSCH_CANFD.value + + # min speed to enable ACC. if car can do stop and go, then set enabling speed + # to a negative value, so it won't matter. Otherwise, add 0.5 mph margin to not + # conflict with PCM acc + if (ret.transmissionType == TransmissionType.manual) and (not ret.openpilotLongitudinalControl): + ret.autoResumeSng = False + else: + ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.HONDA_CIVIC}) + if ret.autoResumeSng: + ret.minEnableSpeed = -1. + elif candidate == CAR.HONDA_ODYSSEY_TWN: + ret.minEnableSpeed = 19. * CV.MPH_TO_MS + else: + ret.minEnableSpeed = 25.51 * CV.MPH_TO_MS + + ret.steerLimitTimer = 0.8 + ret.radarDelay = 0.1 + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + CAN = CanBus(stock_cp, fingerprint) + + for fw in car_fw: + if fw.ecu == "eps" and b"," in fw.fwVersion: + ret.flags |= HondaFlagsIQ.EPS_MODIFIED.value + stock_cp.dashcamOnly = False + + if bool(stock_cp.flags & HondaFlags.NIDEC) and bool(stock_cp.flags & HondaFlags.HYBRID): + ret.flags |= HondaFlagsIQ.NIDEC_HYBRID.value + ret.iqSafetyFlags |= HondaSafetyFlagsIQ.NIDEC_HYBRID + # some hybrids use a different brake hold + if 0x223 in fingerprint[CAN.pt]: + ret.flags |= HondaFlagsIQ.HYBRID_ALT_BRAKEHOLD.value + + if 0x35E in fingerprint[CAN.pt]: + ret.flags |= HondaFlagsIQ.HAS_CAMERA_MESSAGES.value + + if candidate == CAR.HONDA_CIVIC: + if ret.flags & HondaFlagsIQ.EPS_MODIFIED: + # stock request input values: 0x0000, 0x00DE, 0x014D, 0x01EF, 0x0290, 0x0377, 0x0454, 0x0610, 0x06EE + # stock request output values: 0x0000, 0x0917, 0x0DC5, 0x1017, 0x119F, 0x140B, 0x1680, 0x1680, 0x1680 + # modified request output values: 0x0000, 0x0917, 0x0DC5, 0x1017, 0x119F, 0x140B, 0x1680, 0x2880, 0x3180 + # stock filter output values: 0x009F, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108 + # modified filter output values: 0x009F, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0400, 0x0480 + # note: max request allowed is 4096, but request is capped at 3840 in firmware, so modifications result in 2x max + stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2560, 8000], [0, 2560, 3840]] + stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.1]] + + elif candidate in (CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL): + if ret.flags & HondaFlagsIQ.EPS_MODIFIED: + stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2564, 8000], [0, 2564, 3840]] + stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.09]] # 2.5x Modded EPS + + elif candidate == CAR.HONDA_CIVIC_2022: + if ret.flags & HondaFlagsIQ.EPS_MODIFIED: + stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2564, 8000], [0, 2564, 3840]] + stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.09]] # 2.5x Modded EPS + + elif candidate == CAR.HONDA_ACCORD: + if ret.flags & HondaFlagsIQ.EPS_MODIFIED: + stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.09]] + + elif candidate == CAR.HONDA_CRV_5G: + if ret.flags & HondaFlagsIQ.EPS_MODIFIED: + # stock request input values: 0x0000, 0x00DB, 0x01BB, 0x0296, 0x0377, 0x0454, 0x0532, 0x0610, 0x067F + # stock request output values: 0x0000, 0x0500, 0x0A15, 0x0E6D, 0x1100, 0x1200, 0x129A, 0x134D, 0x1400 + # modified request output values: 0x0000, 0x0500, 0x0A15, 0x0E6D, 0x1100, 0x1200, 0x1ACD, 0x239A, 0x2800 + stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2560, 10000], [0, 2560, 3840]] + stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.21], [0.07]] + + elif candidate == CAR.HONDA_CLARITY: + stock_cp.autoResumeSng = True + stock_cp.minEnableSpeed = -1 + if ret.flags & HondaFlagsIQ.EPS_MODIFIED: + for fw in car_fw: + if fw.ecu == "eps" and b"-" not in fw.fwVersion and b"," in fw.fwVersion: + stock_cp.lateralTuning.pid.kf = 0.00004 + stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 5760, 15360], [0, 2560, 3840]] + stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.1575], [0.05175]] + elif fw.ecu == "eps" and b"-" in fw.fwVersion and b"," in fw.fwVersion: + stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 5760, 10240], [0, 2560, 3840]] + stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.3], [0.1]] + else: + stock_cp.lateralParams.torqueBP, stock_cp.lateralParams.torqueV = [[0, 2560], [0, 2560]] + stock_cp.lateralTuning.pid.kpV, stock_cp.lateralTuning.pid.kiV = [[0.8], [0.24]] + + if candidate in HONDA_BOSCH: + pass + else: + ret.enableGasInterceptor = 0x201 in fingerprint[CAN.pt] + stock_cp.pcmCruise = not ret.enableGasInterceptor + + if ret.enableGasInterceptor and candidate not in HONDA_BOSCH: + ret.iqSafetyFlags |= HondaSafetyFlagsIQ.GAS_INTERCEPTOR + + stock_cp.autoResumeSng = stock_cp.autoResumeSng or ret.enableGasInterceptor + + if candidate == CAR.HONDA_CITY_7G: + ret.longitudinalStoppingSpeedOverride = 2.0 + ret.stoppingDecelRateOverride = 0.3 + else: + ret.longitudinalStoppingSpeedOverride = 0.5 + ret.stoppingDecelRateOverride = 0.1 + + return ret + + @staticmethod + def init(CP, CP_IQ, can_recv, can_send, communication_control=None): + if CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) and CP.openpilotLongitudinalControl: + if communication_control is None and CP.carFingerprint in HONDA_BOSCH_CANFD: + # CAN FD: only clear DTCs here; the radar silencing itself is deferred to CarController until + # the comma relay is confirmed open. init() runs while the panda is still in the ELM327 safety + # mode, and silencing the radar from here raced the safety-mode switch: whenever the switch + # took longer than ~110 ms after radar silence, the brake module latched CRUISE_FAULT for the + # entire drive. + # + # The brake module's radar lost-communication DTC matures over trips (Honda two-trip + # detection): once confirmed from a previous drive, the very next comm-loss detection faults + # ~0.16 s after the radar goes silent. Broadcast-clear stored DTCs on the powertrain and + # camera buses every drive to reset the maturation counter, and clear the radar's own stored + # DTCs so codes accumulated while it was disabled don't re-fault a later drive. Clearing must + # precede the radar silence because a DTC clear can take an ECU several hundred ms. + # NOTE: ELM327 safety mode allows the 29-bit functional diagnostic address on every bus, so + # the broadcast needs no TX allowlist entry in the car safety mode + clear_all_dtcs(can_send, [CanBus(CP).pt, CanBus(CP).camera]) + clear_ecu_dtcs(can_recv, can_send, bus=CanBus(CP).pt, addr=0x18DAB0F1) + else: + # 0x80 silences response + if communication_control is None: + communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, 0x80 | uds.CONTROL_TYPE.DISABLE_RX_DISABLE_TX, + uds.MESSAGE_TYPE.NORMAL_AND_NETWORK_MANAGEMENT]) + disable_ecu(can_recv, can_send, bus=CanBus(CP).pt, addr=0x18DAB0F1, com_cont_req=communication_control) + + @staticmethod + def deinit(CP, can_recv, can_send): + communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, 0x80 | uds.CONTROL_TYPE.ENABLE_RX_ENABLE_TX, + uds.MESSAGE_TYPE.NORMAL_AND_NETWORK_MANAGEMENT]) + CarInterface.init(CP, None, can_recv, can_send, communication_control) diff --git a/artifacts/package_runtime/iqdbc/car/honda/radar_interface.py b/artifacts/package_runtime/iqdbc/car/honda/radar_interface.py new file mode 100644 index 000000000..d0ed30ece --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/radar_interface.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.interfaces import RadarInterfaceBase +from iqdbc.car.honda.radar_scan import SCAN_DBC_NAME, HondaRadarScanner +from iqdbc.car.honda.values import DBC + + +def _create_nidec_can_parser(car_fingerprint): + radar_messages = [0x400] + list(range(0x430, 0x43A)) + list(range(0x440, 0x446)) + messages = [(m, 20) for m in radar_messages] + return CANParser(DBC[car_fingerprint][Bus.radar], messages, 1) + + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + self.track_id = 0 + self.radar_fault = False + self.radar_wrong_config = False + self.radar_off_can = CP.radarUnavailable + self.scanner = None + + if self.radar_off_can: + self.rcp = None + self.trigger_msg = 0x445 + elif DBC[CP.carFingerprint].get(Bus.radar) == SCAN_DBC_NAME: + self.scanner = HondaRadarScanner(CP) + self.rcp = self.scanner.rcp + self.pts = self.scanner.pts + self.trigger_msg = self.scanner.trigger_msg + else: + # Nidec + self.rcp = _create_nidec_can_parser(CP.carFingerprint) + self.trigger_msg = 0x445 + self.updated_messages = set() + + def update(self, can_strings): + # in Bosch radar and we are only steering for now, so sleep 0.05s to keep + # radard at 20Hz and return no points + if self.radar_off_can: + return super().update(None) + + vls = self.rcp.update(can_strings) + self.updated_messages.update(vls) + + if self.trigger_msg not in self.updated_messages: + if self.scanner is not None and self.scanner.sweep_overdue(): + return self.scanner.quiet_bus_radardata() + return None + + rr = self._update(self.updated_messages) + self.updated_messages.clear() + return rr + + def _update(self, updated_messages): + if self.scanner is not None: + return self.scanner.process_sweep(updated_messages) + + ret = structs.RadarData() + + for ii in sorted(updated_messages): + cpt = self.rcp.vl[ii] + if ii == 0x400: + # check for radar faults + self.radar_fault = cpt['RADAR_STATE'] != 0x79 + self.radar_wrong_config = cpt['RADAR_STATE'] == 0x69 + elif cpt['LONG_DIST'] < 255: + if ii not in self.pts or cpt['NEW_TRACK']: + self.pts[ii] = structs.RadarData.RadarPoint() + self.pts[ii].trackId = self.track_id + self.track_id += 1 + self.pts[ii].dRel = cpt['LONG_DIST'] # from front of car + self.pts[ii].yRel = -cpt['LAT_DIST'] # in car frame's y axis, left is positive + self.pts[ii].vRel = cpt['REL_SPEED'] + self.pts[ii].aRel = float('nan') + self.pts[ii].yvRel = float('nan') + self.pts[ii].measured = True + else: + if ii in self.pts: + del self.pts[ii] + + if not self.rcp.can_valid: + ret.errors.canError = True + if self.radar_fault: + ret.errors.radarFault = True + if self.radar_wrong_config: + ret.errors.wrongConfig = True + + ret.points = list(self.pts.values()) + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/honda/radar_scan.py b/artifacts/package_runtime/iqdbc/car/honda/radar_scan.py new file mode 100644 index 000000000..cba826ab5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/radar_scan.py @@ -0,0 +1,396 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import math +from collections import deque +from dataclasses import dataclass, field + +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.honda.hondacan import CanBus +from iqdbc.car.honda.values import DBC +from iqdbc.dbc.generator.honda.honda_radar_scan import QUARTET_KINDS, SCAN_SLOTS, frame_address + +SCAN_DBC_NAME = 'honda_radar_scan_generated' +SWEEP_HZ = 15 + +SLOT_ADDRS = [tuple(frame_address(slot, kind) for kind in (*QUARTET_KINDS, "MOTION")) for slot in range(SCAN_SLOTS)] +ALL_SCAN_ADDRS = [addr for addrs in SLOT_ADDRS for addr in addrs] +# slot 15's IDENT frame closes every observed sweep's quartet family; its MOTION companion follows +# but must never gate an otherwise valid sweep, so the quartet frame stays the trigger +SWEEP_TRIGGER_ADDR = SLOT_ADDRS[SCAN_SLOTS - 1][3] + +DIST_LSB_M = 0.05712 +DIST_BIAS_M = -3.0 +BEARING_LSB_RAD = 1.0 / 2048.0 +BEARING_ZERO = 1024 + +STATE_INVALID = 0xF +DIST_RAW_INVALID = 0xFFF +BEARING_RAW_INVALID = 0x7FF +AGE_RAW_INVALID = 0xFFF +HANDLE_MIN = 1 +HANDLE_MAX = 0x3F + +CLOSING_SPEED_RAW_INVALID = 0x7FE +CLOSING_SPEED_RAW_MIN = 0 +CLOSING_SPEED_RAW_MAX = 1728 +CLOSING_SPEED_RAW_ZERO = 864 +CLOSING_SPEED_LSB_MPS = 1.0 / 64.0 +# replay-derived quality gate: the native speed field degrades gradually with its sigma companion; +# above this the field is no longer authoritative and the decoder coasts instead +CLOSING_SPEED_SIGMA_TRUST_MAX = 511 + +DIST_RATIO_RAW_INVALID = 0x3FF +DIST_RATIO_LSB = 0.001 +DIST_RATIO_BIAS = 0.5 + +# replay-derived acceptance gates, not recovered firmware constants; innovation is measured from the +# previous ACCEPTED observation so a reset can never become the baseline for following sweeps +DIST_SIGMA_DEGRADED_RAW = 4 +DIST_INNOVATION_SOFT_M = 2.0 +DIST_INNOVATION_HARD_M = 5.0 +RAW_RATE_LIMIT_MPS = 50.0 + +HISTORY_LEN = 8 +QUIET_TIMEOUT_S = 0.20 + + +def decode_closing_speed(raw, sigma_raw=None): + if raw is None: + return None + raw = int(raw) + if raw == CLOSING_SPEED_RAW_INVALID or not CLOSING_SPEED_RAW_MIN <= raw <= CLOSING_SPEED_RAW_MAX: + return None + if sigma_raw is not None and int(sigma_raw) > CLOSING_SPEED_SIGMA_TRUST_MAX: + return None + return (raw - CLOSING_SPEED_RAW_ZERO) * CLOSING_SPEED_LSB_MPS + + +def decode_dist_ratio(raw): + if raw is None: + return None + raw = int(raw) + if raw == DIST_RATIO_RAW_INVALID or not 0 <= raw < DIST_RATIO_RAW_INVALID: + return None + return DIST_RATIO_BIAS + DIST_RATIO_LSB * raw + + +def ratio_implied_rate(raw, dist, dt): + ratio = decode_dist_ratio(raw) + if ratio is None or dt <= 0.0 or not math.isfinite(dist): + return None + return dist * (1.0 - ratio) / dt + + +def reading_degraded(dist_sigma_raw, presence_raw, speed_sigma_raw): + geometry_bad = dist_sigma_raw >= DIST_SIGMA_DEGRADED_RAW or presence_raw in (0, 0x7F) + motion_bad = speed_sigma_raw is not None and speed_sigma_raw > CLOSING_SPEED_SIGMA_TRUST_MAX + return geometry_bad or motion_bad + + +@dataclass +class SlotReading: + slot: int + cycle: int + age: int + handle: int + handle_ok: bool + coherent: bool + dist_raw: int = 0 + bearing_raw: int = 0 + dist_sigma_raw: int = 0 + presence_raw: int = 0 + speed_raw: int | None = None + speed_sigma_raw: int | None = None + ratio_raw: int | None = None + + +@dataclass +class ObjectLedger: + handle: int + prev_cycle: int | None = None + prev_age: int | None = None + last_seen_nanos: int | None = None + wire_slot: int | None = None + history: deque = field(default_factory=lambda: deque(maxlen=HISTORY_LEN)) + held_speed: float | None = None + held_speed_nanos: int | None = None + + def continues_incarnation(self, cycle: int, age: int) -> bool: + if self.prev_cycle is None or self.prev_age is None: + return False + cycle_delta = (cycle - self.prev_cycle) & 0xF + age_delta = (age - self.prev_age) & 0xFFF + return age_delta == 2 * cycle_delta + + def restart_incarnation(self): + self.history.clear() + self.held_speed = None + self.held_speed_nanos = None + + def held_speed_fresh(self, now: int) -> bool: + return (self.held_speed is not None and self.held_speed_nanos is not None and + (now - self.held_speed_nanos) * 1e-9 <= QUIET_TIMEOUT_S) + + +def create_scan_parser(CP) -> CANParser: + # the object scan is physically on the camera-side ACC-CAN + return CANParser(DBC[CP.carFingerprint][Bus.radar], [(addr, SWEEP_HZ) for addr in ALL_SCAN_ADDRS], CanBus(CP).camera) + + +class HondaRadarScanner: + def __init__(self, CP): + self.rcp = create_scan_parser(CP) + self.trigger_msg = SWEEP_TRIGGER_ADDR + self.pts: dict[int, structs.RadarData.RadarPoint] = {} + self._ledgers: dict[int, ObjectLedger] = {} + self._slot_handles: list[int | None] = [None] * SCAN_SLOTS + self._last_sweep_nanos = -1 + + def sweep_overdue(self) -> bool: + if self._last_sweep_nanos < 0: + return False + return (self.rcp._last_update_nanos - self._last_sweep_nanos) * 1e-9 > QUIET_TIMEOUT_S + + def quiet_bus_radardata(self) -> structs.RadarData: + # whole-bus silence: drop everything and emit an EMPTY RadarData (not None) so radard sheds any + # lead within a cycle instead of freezing a phantom + self.pts.clear() + self._ledgers.clear() + self._slot_handles = [None] * SCAN_SLOTS + self._last_sweep_nanos = -1 + ret = structs.RadarData() + if not self.rcp.can_valid: + ret.errors.canError = True + ret.errors.radarUnavailableTemporary = True + return ret + + def _drop_ledger(self, handle: int): + self._ledgers.pop(handle, None) + self.pts.pop(handle, None) + for slot, bound in enumerate(self._slot_handles): + if bound == handle: + self._slot_handles[slot] = None + + def _drop_expired_ledgers(self, now: int): + for handle, ledger in list(self._ledgers.items()): + if ledger.last_seen_nanos is not None and (now - ledger.last_seen_nanos) * 1e-9 > QUIET_TIMEOUT_S: + self._drop_ledger(handle) + + def _read_slot(self, slot: int, updated_messages) -> SlotReading | None: + pos, shape, life, ident, motion = SLOT_ADDRS[slot] + if not all(addr in updated_messages for addr in (pos, shape, life, ident)): + # a missing CAN frame is not a lifecycle event; ledgers expire on their own staleness only + return None + + v_pos, v_shape, v_life, v_ident = (self.rcp.vl[a] for a in (pos, shape, life, ident)) + cycle = int(v_pos['CYCLE']) + if not (cycle == int(v_shape['CYCLE']) == int(v_life['CYCLE']) == int(v_ident['CYCLE'])): + # the quartet doesn't share one radar cycle: not a coherent observation this window + return None + + state = int(v_pos['SCAN_STATE']) + dist_raw = int(v_pos['DIST_RAW']) + bearing_raw = int(v_pos['BEARING_RAW']) + age = int(v_life['AGE_RAW']) + handle = int(v_ident['OBJECT_HANDLE']) + reading = SlotReading( + slot=slot, + cycle=cycle, + age=age, + handle=handle, + handle_ok=HANDLE_MIN <= handle <= HANDLE_MAX, + coherent=(state != STATE_INVALID and dist_raw != DIST_RAW_INVALID and + bearing_raw != BEARING_RAW_INVALID and age != AGE_RAW_INVALID), + dist_raw=dist_raw, + bearing_raw=bearing_raw, + dist_sigma_raw=int(v_pos['DIST_SIGMA_RAW']), + presence_raw=int(v_shape['PRESENCE_RAW']), + ) + + # the MOTION companion only contributes when it rides the same cycle; its absence never + # invalidates the quartet, it only removes independent motion evidence + if motion in updated_messages: + v_motion = self.rcp.vl[motion] + if int(v_motion['CYCLE']) == cycle: + reading.speed_raw = int(v_motion['CLOSING_SPEED_RAW']) + reading.speed_sigma_raw = int(v_motion['CLOSING_SPEED_SIGMA_RAW']) + reading.ratio_raw = int(v_motion['DIST_RATIO_RAW']) + return reading + + def _elect_by_handle(self, readings: list[SlotReading]) -> dict[int, SlotReading]: + # one CAN identity can never yield two points; ties prefer the wire slot already bound to the + # ledger, then the lower slot for deterministic handling of a malformed duplicate + elected: dict[int, SlotReading] = {} + for reading in readings: + if not (reading.coherent and reading.handle_ok): + # an invalid observation ends publication for the slot's current occupant without destroying + # persistent state; the object may be multiplexed elsewhere or return before its deadline + hidden = {self._slot_handles[reading.slot]} + if reading.handle_ok: + hidden.add(reading.handle) + for handle in hidden - {None}: + self.pts.pop(handle, None) + continue + current = elected.get(reading.handle) + if current is None: + elected[reading.handle] = reading + continue + bound_slot = self._ledgers[reading.handle].wire_slot if reading.handle in self._ledgers else None + current_rank = (0 if bound_slot == current.slot else 1, current.slot) + candidate_rank = (0 if bound_slot == reading.slot else 1, reading.slot) + if candidate_rank < current_rank: + elected[reading.handle] = reading + return elected + + def _bind_slot(self, ledger: ObjectLedger, reading: SlotReading, now: int): + ledger.prev_cycle = reading.cycle + ledger.prev_age = reading.age + ledger.last_seen_nanos = now + ledger.wire_slot = reading.slot + for slot, bound in enumerate(self._slot_handles): + if slot != reading.slot and bound == ledger.handle: + self._slot_handles[slot] = None + self._slot_handles[reading.slot] = ledger.handle + + def _coast_point(self, ledger: ObjectLedger, now: int, dist: float, y_rel: float): + # coasting keeps trustworthy geometry visible with the last authoritative motion, unmeasured, + # instead of publishing a synthesized rate; without fresh held motion the point drops + if ledger.held_speed_fresh(now): + point = self.pts.get(ledger.handle) + if point is not None: + point.dRel = dist + point.yRel = y_rel + point.vRel = ledger.held_speed + point.measured = False + return + ledger.held_speed = None + ledger.held_speed_nanos = None + self.pts.pop(ledger.handle, None) + + def process_sweep(self, updated_messages) -> structs.RadarData: + ret = structs.RadarData() + if not self.rcp.can_valid: + ret.errors.canError = True + + now = self.rcp._last_update_nanos + self._last_sweep_nanos = now + self._drop_expired_ledgers(now) + + readings = [r for r in (self._read_slot(slot, updated_messages) for slot in range(SCAN_SLOTS)) if r is not None] + elected = self._elect_by_handle(readings) + elected_handles = set(elected) + + for handle, reading in sorted(elected.items(), key=lambda item: item[1].slot): + # a wire-slot replacement ends publication for the old occupant, but not its persistent state + old_handle = self._slot_handles[reading.slot] + if old_handle is not None and old_handle != handle and old_handle not in elected_handles: + self.pts.pop(old_handle, None) + + ledger = self._ledgers.get(handle) + if ledger is None: + ledger = ObjectLedger(handle=handle) + self._ledgers[handle] = ledger + + if not ledger.continues_incarnation(reading.cycle, reading.age): + # the CAN identity stays the external key, but a lifecycle discontinuity starts a new + # incarnation and must not inherit the previous object's range-rate history + ledger.restart_incarnation() + self.pts.pop(handle, None) + + dist = DIST_LSB_M * reading.dist_raw + DIST_BIAS_M + bearing = BEARING_LSB_RAD * (reading.bearing_raw - BEARING_ZERO) + # the radar consumes range as a forward-axis quantity; positive bearing is left of center, + # matching the RadarPoint.yRel sign contract + y_rel = dist * math.tan(bearing) + + now_s = now * 1e-9 + native_speed = decode_closing_speed(reading.speed_raw, reading.speed_sigma_raw) + unqualified_speed = decode_closing_speed(reading.speed_raw) + # a live native speed rejected only by its sigma companion: geometry acceptance is still decided + # on the same terms as every other sweep (high sigma correlates with bad/discontinuous range), + # and only then does the point coast instead of publishing a synthesized rate + sigma_veto = (native_speed is None and unqualified_speed is not None and + reading.speed_sigma_raw is not None and + reading.speed_sigma_raw > CLOSING_SPEED_SIGMA_TRUST_MAX) + + degraded = reading_degraded(reading.dist_sigma_raw, reading.presence_raw, reading.speed_sigma_raw) + previous = ledger.history[-1] if ledger.history else None + ratio_rate = None + dist_rejected = False + if previous is not None: + prev_time, prev_dist = previous + dt = now_s - prev_time + if dt <= 0.0: + dist_rejected = True + else: + ratio = decode_dist_ratio(reading.ratio_raw) + ratio_rate = ratio_implied_rate(reading.ratio_raw, dist, dt) + + residuals_m = [] + if native_speed is not None: + residuals_m.append(abs(dist - (prev_dist + native_speed * dt))) + if ratio is not None: + residuals_m.append(abs(prev_dist - dist * ratio)) + + if residuals_m: + innovation_m = min(residuals_m) + dist_rejected = (innovation_m > DIST_INNOVATION_HARD_M or + (degraded and innovation_m > DIST_INNOVATION_SOFT_M)) + else: + dist_rejected = abs((dist - prev_dist) / dt) > RAW_RATE_LIMIT_MPS + + if dist_rejected: + # keep the last accepted point briefly as an unmeasured coast; rejected geometry is never + # published and never becomes the baseline for a later derivative + accepted_fresh = previous is not None and now_s - previous[0] <= QUIET_TIMEOUT_S + point = self.pts.get(handle) + if accepted_fresh and point is not None: + point.measured = False + else: + self.pts.pop(handle, None) + self._bind_slot(ledger, reading, now) + continue + + if sigma_veto: + self._coast_point(ledger, now, dist, y_rel) + self._bind_slot(ledger, reading, now) + continue + + # with neither a qualified native speed nor a usable ratio, the only remaining source is the + # raw one-sweep derivative, which must never become an authoritative measurement: coast instead. + # A true birth (no previous accepted sample) cannot mature this cycle regardless, so only + # intercept once a derivative would have something to poison + if native_speed is None and (ratio_rate is None or degraded) and previous is not None: + self._coast_point(ledger, now, dist, y_rel) + self._bind_slot(ledger, reading, now) + continue + + ledger.history.append((now_s, dist)) + + speed = native_speed if native_speed is not None else ratio_rate + ledger.held_speed = speed + ledger.held_speed_nanos = now + + # a birth observation has no range rate yet: keep it as history, publish only once a second + # coherent observation of the same identity supplies a finite rate + matured = len(ledger.history) >= 2 and math.isfinite(speed) + if matured: + if handle not in self.pts: + point = structs.RadarData.RadarPoint() + point.trackId = handle + point.aRel = float('nan') + point.yvRel = float('nan') + self.pts[handle] = point + self.pts[handle].dRel = dist + self.pts[handle].yRel = y_rel + self.pts[handle].vRel = speed + self.pts[handle].measured = True + else: + self.pts.pop(handle, None) + + self._bind_slot(ledger, reading, now) + + ret.points = [self.pts[handle] for handle in sorted(self.pts)] + return ret diff --git a/artifacts/package_runtime/iqdbc/car/honda/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/honda/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/honda/tests/test_canfd_carcontroller.py b/artifacts/package_runtime/iqdbc/car/honda/tests/test_canfd_carcontroller.py new file mode 100644 index 000000000..1117823ee --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/tests/test_canfd_carcontroller.py @@ -0,0 +1,166 @@ +from iqdbc.car import DT_CTRL, gen_empty_fingerprint, structs +from iqdbc.car.honda.interface import CarInterface +from iqdbc.car.honda.values import CAR + +CANFD_CAR = CAR.HONDA_CRV_6G + +RADAR_DIAG_ADDR = 0x18DAB0F1 +ACC_CONTROL_ADDR = 0x1DF +ACC_HUD_ADDR = 0x30C +SCM_BUTTONS_ADDR = 0x296 +RADAR_HUD_ADDR = 0x310 +LANE_PATH_ADDR = 0x6CD5558 +HUD_OBJECTS_ADDR = 0x6CD5559 +RADAR_LEAD_ADDR = 0xF31AA5C +RADAR_LEAD2_ADDR = 0xF31AA52 +SUPPLEMENTAL_ADDR = 0x1A45AA4E +LOOKALIKE_ADDRS = (RADAR_HUD_ADDR, LANE_PATH_ADDR, HUD_OBJECTS_ADDR, RADAR_LEAD_ADDR, RADAR_LEAD2_ADDR, SUPPLEMENTAL_ADDR) + +EXT_DIAG_SESSION = b'\x02\x10\x03\x00\x00\x00\x00\x00' +COMM_CONTROL_DISABLE = b'\x03\x28\x83\x03\x00\x00\x00\x00' + + +def build_long_interface(): + fingerprint = gen_empty_fingerprint() + CP = CarInterface.get_params(CANFD_CAR, fingerprint, [], False, False, False) + CP.openpilotLongitudinalControl = True + CP.pcmCruise = False + CP_IQ = CarInterface.get_params_iq(CP, CANFD_CAR, fingerprint, [], False, False, False) + return CarInterface(CP, CP_IQ) + + +def make_cc(enabled=True): + CC = structs.CarControl() + CC.enabled = enabled + CC.latActive = enabled + CC.longActive = enabled + return CC.as_reader() + + +class CanfdControllerHarness: + def __init__(self): + self.ci = build_long_interface() + self.cs = self.ci.CS + self.ci.update([]) + self.now_nanos = 0 + self.set_radar(alive=True, relay_open=False) + self.set_ticks() + + def set_radar(self, alive, relay_open): + self.cs.stock_acc_alive = alive + self.cs.canfd_relay_open = relay_open + + def set_ticks(self, hud=False, supp=False, five=False, fifty=False): + self.cs.hud_tick = hud + self.cs.supp_tick = supp + self.cs.radar_5hz_tick = five + self.cs.radar_50hz_tick = fifty + + def step(self, CC=None, model=None): + self.now_nanos += int(DT_CTRL * 1e9) + _, can_sends = self.ci.apply(CC or make_cc(), structs.IQCarControl(), self.now_nanos, model) + return can_sends + + @staticmethod + def by_addr(can_sends, addr): + return [m for m in can_sends if m[0] == addr] + + +class TestCanfdDeferredRadarDisable: + def setup_method(self): + self.h = CanfdControllerHarness() + + def test_no_disable_requests_before_relay_open(self): + for _ in range(20): + sends = self.h.step() + assert not self.h.by_addr(sends, RADAR_DIAG_ADDR) + assert not self.h.by_addr(sends, ACC_CONTROL_ADDR) + assert not any(self.h.by_addr(sends, a) for a in LOOKALIKE_ADDRS) + + def test_disable_handshake_after_relay_open(self): + self.h.set_radar(alive=True, relay_open=True) + payloads = [] + for _ in range(101): + for msg in self.h.by_addr(self.h.step(), RADAR_DIAG_ADDR): + payloads.append(msg[1]) + assert payloads == [EXT_DIAG_SESSION, COMM_CONTROL_DISABLE, EXT_DIAG_SESSION, COMM_CONTROL_DISABLE, EXT_DIAG_SESSION] + + def test_tester_present_keeps_radar_down_once_silent(self): + self.h.set_radar(alive=False, relay_open=True) + payloads = [] + for _ in range(60): + payloads += [m[1] for m in self.h.by_addr(self.h.step(), RADAR_DIAG_ADDR)] + assert payloads == [b'\x02\x3E\x80\x00\x00\x00\x00\x00'] * 6 + + +class TestCanfdReplacementStream: + def setup_method(self): + self.h = CanfdControllerHarness() + self.h.set_radar(alive=False, relay_open=True) + + def test_acc_control_every_second_frame(self): + seen = [bool(self.h.by_addr(self.h.step(), ACC_CONTROL_ADDR)) for _ in range(10)] + assert sum(seen) == 5 + + def test_no_acc_control_while_stock_alive(self): + self.h.set_radar(alive=True, relay_open=True) + for _ in range(10): + assert not self.h.by_addr(self.h.step(), ACC_CONTROL_ADDR) + + def test_lookalikes_mirrored_byte_identical_on_both_buses(self): + self.h.set_ticks(hud=True, supp=True, five=True, fifty=True) + sends = self.h.step() + for addr in LOOKALIKE_ADDRS: + msgs = self.h.by_addr(sends, addr) + assert len(msgs) == 2, hex(addr) + buses = sorted(m[2] for m in msgs) + assert buses == [0, 2], hex(addr) + assert msgs[0][1] == msgs[1][1], hex(addr) + + def test_no_lookalikes_without_ticks(self): + sends = self.h.step() + for addr in (RADAR_HUD_ADDR, RADAR_LEAD_ADDR, RADAR_LEAD2_ADDR, SUPPLEMENTAL_ADDR, LANE_PATH_ADDR, HUD_OBJECTS_ADDR): + assert not self.h.by_addr(sends, addr) + + def test_mux_sweep_contiguous_across_banks(self): + self.h.set_ticks(fifty=True) + muxes = [] + for _ in range(45): + msgs = self.h.by_addr(self.h.step(), LANE_PATH_ADDR) + muxes.append(msgs[0][1][0] >> 2) + sweep = list(range(1, 11)) + list(range(17, 27)) + list(range(33, 43)) + list(range(49, 59)) + assert muxes == (sweep + sweep)[:45] + + def test_acc_hud_rides_hud_tick(self): + assert not self.h.by_addr(self.h.step(), ACC_HUD_ADDR) + self.h.set_ticks(hud=True) + assert self.h.by_addr(self.h.step(), ACC_HUD_ADDR) + self.h.set_ticks() + assert not self.h.by_addr(self.h.step(), ACC_HUD_ADDR) + + +class TestCanfdButtonTakeover: + def setup_method(self): + self.h = CanfdControllerHarness() + self.h.set_radar(alive=False, relay_open=True) + + def test_buttons_streamed_to_camera_while_engaged(self): + seen = 0 + for _ in range(20): + for msg in self.h.by_addr(self.h.step(), SCM_BUTTONS_ADDR): + assert msg[2] == 2 + seen += 1 + assert seen == 5 + + def test_no_button_stream_when_disengaged(self): + for _ in range(20): + assert not self.h.by_addr(self.h.step(make_cc(enabled=False)), SCM_BUTTONS_ADDR) + + def test_ambient_light_echoed(self): + self.h.cs.scm_ambient_light = 0x77 + for _ in range(4): + msgs = self.h.by_addr(self.h.step(), SCM_BUTTONS_ADDR) + if msgs: + assert msgs[0][1][2] == 0x77 + return + raise AssertionError("no SCM_BUTTONS takeover frame seen") diff --git a/artifacts/package_runtime/iqdbc/car/honda/tests/test_canfd_radar_state.py b/artifacts/package_runtime/iqdbc/car/honda/tests/test_canfd_radar_state.py new file mode 100644 index 000000000..c4b6f3239 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/tests/test_canfd_radar_state.py @@ -0,0 +1,202 @@ +import pytest + +from iqdbc.can import CANPacker +from iqdbc.car import Bus, DT_CTRL, gen_empty_fingerprint +from iqdbc.car.honda.interface import CarInterface +from iqdbc.car.honda.values import CAR, DBC +from iqdbc.car.common.conversions import Conversions as CV + +CANFD_CAR = CAR.HONDA_CRV_6G +RADARLESS_CAR = CAR.HONDA_CIVIC_2022 +CAMERA_MESSAGES_ADDR = 0x35E + + +def build_car(candidate, extra_pt_addrs=()): + fingerprint = gen_empty_fingerprint() + for addr in extra_pt_addrs: + fingerprint[0][addr] = 8 + CP = CarInterface.get_params(candidate, fingerprint, [], False, False, False) + CP_IQ = CarInterface.get_params_iq(CP, candidate, fingerprint, [], False, False, False) + return CarInterface(CP, CP_IQ) + + +class CanFeed: + def __init__(self, ci, dbc_name): + self.ci = ci + self.packer = CANPacker(dbc_name) + self.nanos = 0 + # the first CarState.update lazily subscribes vl-read messages, so run one empty + # cycle before feeding data or the first fed frame of those messages is dropped + self.step() + self.ci.CS.update(self.ci.can_parsers) + + def step(self, msgs=()): + self.nanos += int(DT_CTRL * 1e9) + packed = [self.packer.make_can_msg(name, bus, values) for name, bus, values in msgs] + for parser in self.ci.can_parsers.values(): + parser.update([self.nanos, packed]) + + +class TestHondaCanfdRadarState: + def setup_method(self): + self.ci = build_car(CANFD_CAR) + self.cs = self.ci.CS + self.feed = CanFeed(self.ci, DBC[CANFD_CAR][Bus.pt]) + + def update(self, msgs=()): + self.feed.step(msgs) + return self.cs.update(self.ci.can_parsers) + + def test_parsers_include_radar_bus(self): + assert Bus.radar in self.ci.can_parsers + assert self.ci.can_parsers[Bus.radar].bus == 1 + + def test_50hz_tick_fires_one_frame_before_next_tick(self): + ticks = [] + for frame in range(20): + msgs = [("RADAR_50HZ_TICK_REFERENCE", 1, {})] if frame % 2 == 0 else [] + self.update(msgs) + ticks.append(self.cs.radar_50hz_tick) + assert ticks[2:] == [frame % 2 == 1 for frame in range(2, 20)] + + def test_hud_tick_fires_one_frame_before_next_tick(self): + fired = [] + for frame in range(40): + msgs = [("RADAR_HUD_TICK_REFERENCE", 1, {})] if frame % 10 == 0 else [] + self.update(msgs) + if self.cs.hud_tick: + fired.append(frame) + assert fired == [9, 19, 29, 39] + + def test_5hz_tick_fires_at_stock_radar_lead_offset(self): + fired = [] + for frame in range(60): + msgs = [("RADAR_REFERENCE", 0, {})] if frame % 20 == 0 else [] + self.update(msgs) + if self.cs.radar_5hz_tick: + fired.append(frame) + assert fired == [11, 31, 51] + + def test_stock_acc_alive_until_four_silent_frames(self): + for frame in range(11): + msgs = [("ACC_CONTROL", 0, {})] if frame % 2 == 0 else [] + self.update(msgs) + assert self.cs.stock_acc_alive + + silent_state = [] + for _ in range(6): + self.update() + silent_state.append(self.cs.stock_acc_alive) + assert silent_state == [True, True, True, False, False, False] + + self.update([("ACC_CONTROL", 0, {})]) + assert self.cs.stock_acc_alive + + def test_relay_open_when_camera_steering_disappears(self): + for _ in range(10): + self.update([("STEERING_CONTROL", 0, {})]) + assert not self.cs.canfd_relay_open + assert self.cs.camera_steer_seen + + open_state = [] + for _ in range(7): + self.update() + open_state.append(self.cs.canfd_relay_open) + assert open_state == [False, False, False, False, True, True, True] + + def test_relay_open_fallback_without_camera(self): + primed_frames = self.cs.canfd_frames + for frame in range(510): + self.update() + assert self.cs.canfd_relay_open == (primed_frames + frame + 1 >= 500) + + def test_ambient_light_echoed_from_scm_buttons(self): + self.update([("SCM_BUTTONS", 0, {"AMBIENT_LIGHT_MAYBE": 0x5A})]) + assert self.cs.scm_ambient_light == 0x5A + + +class TestHondaNonCanfdRadarState: + def test_no_radar_parser_and_ticks_stay_low(self): + ci = build_car(RADARLESS_CAR) + feed = CanFeed(ci, DBC[RADARLESS_CAR][Bus.pt]) + assert Bus.radar not in ci.can_parsers + for _ in range(5): + feed.step() + ci.CS.update(ci.can_parsers) + assert not ci.CS.radar_50hz_tick + assert not ci.CS.hud_tick + assert not ci.CS.supp_tick + assert not ci.CS.radar_5hz_tick + + +class TestCanfdLongInterface: + def test_alpha_long_available_on_canfd(self): + CP = CarInterface.get_params(CANFD_CAR, gen_empty_fingerprint(), [], False, False, False) + assert CP.alphaLongitudinalAvailable + assert not CP.openpilotLongitudinalControl + assert CP.pcmCruise + + def test_alpha_long_enabled_on_canfd(self): + CP = CarInterface.get_params(CANFD_CAR, gen_empty_fingerprint(), [], True, False, False) + assert CP.openpilotLongitudinalControl + assert not CP.pcmCruise + assert CP.longitudinalActuatorDelay == pytest.approx(0.05) + + def test_canfd_long_init_clears_dtcs_without_disabling_radar(self, mocker): + clear_all = mocker.patch("iqdbc.car.honda.interface.clear_all_dtcs") + clear_ecu = mocker.patch("iqdbc.car.honda.interface.clear_ecu_dtcs") + disable = mocker.patch("iqdbc.car.honda.interface.disable_ecu") + + CP = CarInterface.get_params(CANFD_CAR, gen_empty_fingerprint(), [], True, False, False) + CarInterface.init(CP, None, None, None) + assert clear_all.call_count == 1 + assert clear_all.call_args.args[1] == [0, 2] + assert clear_ecu.call_count == 1 + assert disable.call_count == 0 + + def test_canfd_deinit_reenables_radar(self, mocker): + clear_all = mocker.patch("iqdbc.car.honda.interface.clear_all_dtcs") + disable = mocker.patch("iqdbc.car.honda.interface.disable_ecu") + + CP = CarInterface.get_params(CANFD_CAR, gen_empty_fingerprint(), [], True, False, False) + CarInterface.deinit(CP, None, None) + assert clear_all.call_count == 0 + assert disable.call_count == 1 + + def test_bosch_a_long_init_still_disables_radar(self, mocker): + clear_all = mocker.patch("iqdbc.car.honda.interface.clear_all_dtcs") + disable = mocker.patch("iqdbc.car.honda.interface.disable_ecu") + + CP = CarInterface.get_params(CAR.HONDA_ACCORD, gen_empty_fingerprint(), [], True, False, False) + CarInterface.init(CP, None, None, None) + assert clear_all.call_count == 0 + assert disable.call_count == 1 + + +class TestHondaDashboardSpeedLimit: + def build(self, candidate, with_camera_messages): + extra = (CAMERA_MESSAGES_ADDR,) if with_camera_messages else () + return build_car(candidate, extra_pt_addrs=extra) + + @pytest.mark.parametrize("sign_value,expected_mph", [(101, 25), (97, 5), (113, 85)]) + def test_speed_limit_sign_reported(self, sign_value, expected_mph): + ci = self.build(RADARLESS_CAR, True) + feed = CanFeed(ci, DBC[RADARLESS_CAR][Bus.pt]) + feed.step([("CAMERA_MESSAGES", 2, {"SPEED_LIMIT_SIGN": sign_value})]) + _, ret_iq = ci.CS.update(ci.can_parsers) + assert ret_iq.speedLimit == pytest.approx(expected_mph * CV.MPH_TO_MS) + + @pytest.mark.parametrize("sign_value", [125, 0, 32]) + def test_invalid_sign_reports_no_limit(self, sign_value): + ci = self.build(RADARLESS_CAR, True) + feed = CanFeed(ci, DBC[RADARLESS_CAR][Bus.pt]) + feed.step([("CAMERA_MESSAGES", 2, {"SPEED_LIMIT_SIGN": sign_value})]) + _, ret_iq = ci.CS.update(ci.can_parsers) + assert ret_iq.speedLimit == 0.0 + + def test_without_camera_messages_flag_no_limit(self): + ci = self.build(RADARLESS_CAR, False) + feed = CanFeed(ci, DBC[RADARLESS_CAR][Bus.pt]) + feed.step([("CAMERA_MESSAGES", 2, {"SPEED_LIMIT_SIGN": 101})]) + _, ret_iq = ci.CS.update(ci.can_parsers) + assert ret_iq.speedLimit == 0.0 diff --git a/artifacts/package_runtime/iqdbc/car/honda/tests/test_dash_rendering.py b/artifacts/package_runtime/iqdbc/car/honda/tests/test_dash_rendering.py new file mode 100644 index 000000000..223902d7b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/tests/test_dash_rendering.py @@ -0,0 +1,235 @@ +import math +from types import SimpleNamespace + +import numpy as np + +from iqdbc.can import CANPacker +from iqdbc.car.honda import dash_lane, dash_objects + +V_EGO = 30.0 + + +def model_at(center_y): + x = list(np.linspace(0.0, 110.0, 23)) + + def line(y): + return SimpleNamespace(x=x, y=[y] * len(x)) + return SimpleNamespace(laneLines=[line(center_y + 3.3), line(center_y + 1.65), line(center_y - 1.65), line(center_y - 3.3)], + laneLineProbs=[0.0, 1.0, 1.0, 0.0], + leadsV3=[]) + + +def lane_xy(center_y): + m = model_at(center_y) + return m.laneLines[1].x, [(a + b) / 2.0 for a, b in zip(m.laneLines[1].y, m.laneLines[2].y, strict=True)] + + +class TestLanePathSlew: + def test_first_fit_shown_unslewed(self): + renderer = dash_lane.LanePathRenderer() + lane = renderer.update(model_at(-2.0), V_EGO, 0.0) + assert lane.offsets == dash_lane.encode_lane_path(*lane_xy(-2.0)) + + def test_step_is_rate_limited(self): + renderer = dash_lane.LanePathRenderer() + prev = renderer.update(model_at(0.0), V_EGO, 0.0).offsets + assert all(o == 0 for o in prev) + + target = dash_lane.encode_lane_path(*lane_xy(-2.0)) + max_step = math.ceil(dash_lane.SLEW_MAX_STEP) + for _ in range(10): + cur = renderer.update(model_at(-2.0), V_EGO, 0.0).offsets + for p, c, t in zip(prev, cur, target, strict=True): + assert abs(c - p) <= max_step + assert abs(t - c) <= abs(t - p) + prev = cur + assert prev == target + + def test_full_scale_takes_two_seconds(self): + renderer = dash_lane.LanePathRenderer() + renderer.update(model_at(0.0), V_EGO, 0.0) + target = dash_lane.encode_lane_path(*lane_xy(-100.0)) + assert all(t == dash_lane.OFFSET_VALID_MAX for t in target) + + n_updates = round(dash_lane.SLEW_FULL_SCALE_S * dash_lane.SLEW_RATE_HZ) + for i in range(n_updates): + lane = renderer.update(model_at(-100.0), V_EGO, 0.0) + if i < n_updates - 1: + assert lane.offsets != target + assert lane.offsets == target + + def test_blank_resets_slew(self): + renderer = dash_lane.LanePathRenderer() + renderer.update(model_at(0.0), V_EGO, 0.0) + lane = renderer.update(None, V_EGO, 0.0) + assert lane.offsets == [dash_lane.OFFSET_UNAVAILABLE] * dash_lane.POINT_COUNT + lane = renderer.update(model_at(-2.0), V_EGO, 0.0) + assert lane.offsets == dash_lane.encode_lane_path(*lane_xy(-2.0)) + + def test_short_path_passthrough_and_reset(self): + renderer = dash_lane.LanePathRenderer() + renderer.update(model_at(0.0), V_EGO, 0.0) + + short = model_at(-2.0) + for ll in short.laneLines: + ll.x = ll.x[:10] + ll.y = ll.y[:10] + lane = renderer.update(short, V_EGO, 0.0) + assert lane.offsets == [dash_lane.OFFSET_UNAVAILABLE] * dash_lane.POINT_COUNT + + lane = renderer.update(model_at(-2.0), V_EGO, 0.0) + assert lane.offsets == dash_lane.encode_lane_path(*lane_xy(-2.0)) + + +class TestLaneLineHysteresis: + def test_single_line_offset_and_hysteresis(self): + renderer = dash_lane.LanePathRenderer() + m = model_at(0.0) + m.laneLineProbs = [0.0, 0.0, 1.0, 0.0] + lane = renderer.update(m, V_EGO, 0.0) + assert not lane.left_line and lane.right_line + assert lane.offsets == dash_lane.encode_lane_path(m.laneLines[2].x, [y - dash_lane.HALF_LANE_M for y in m.laneLines[2].y]) + + # a left prob between OFF and ON must not switch the left line on + m.laneLineProbs = [0.0, (dash_lane.LINE_PROB_OFF + dash_lane.LINE_PROB_ON) / 2, 1.0, 0.0] + lane = renderer.update(m, V_EGO, 0.0) + assert not lane.left_line + + # once on, the same mid prob keeps it on + m.laneLineProbs = [0.0, dash_lane.LINE_PROB_ON, 1.0, 0.0] + assert renderer.update(m, V_EGO, 0.0).left_line + m.laneLineProbs = [0.0, (dash_lane.LINE_PROB_OFF + dash_lane.LINE_PROB_ON) / 2, 1.0, 0.0] + assert renderer.update(m, V_EGO, 0.0).left_line + + +class TestCanfdReshape: + def test_idle_pattern_when_blank(self): + assert dash_lane.canfd_lane_offsets(dash_lane.RenderedLane()) == dash_lane.CANFD_IDLE_OFFSETS + assert dash_lane.canfd_lane_length(dash_lane.RenderedLane()) == dash_lane.CANFD_MIN_VALID_PTS + + def test_terminated_prefix_matches_length_law(self): + for v_ego, expected in ((0.0, 7), (10.0, 15), (19.0, 23), (38.0, 23)): + lane = dash_lane.RenderedLane(offsets=[5] * dash_lane.POINT_COUNT, reach=1.0, v_ego=v_ego) + n = dash_lane.canfd_lane_length(lane) + assert n == expected + offs = dash_lane.canfd_lane_offsets(lane) + assert offs[:n] == [5] * n + assert offs[n:] == [dash_lane.OFFSET_UNAVAILABLE] * (dash_lane.POINT_COUNT - n) + + +class TestMuxMapping: + def test_mux_cycle_covers_all_banks(self): + assert len(dash_lane.MUX_CYCLE) == 40 + assert set(dash_lane.MUX_CYCLE) == set(range(1, 11)) | set(range(17, 27)) | set(range(33, 43)) | set(range(49, 59)) + + def test_lane_path_frame_selects_offsets_by_mux(self): + packer = CANPacker("honda_bosch_radarless_generated") + offsets = list(range(40)) + for mux in dash_lane.MUX_CYCLE: + addr, dat, bus = dash_lane.create_lane_path(packer, 0, offsets, mux) + base = ((mux - 1) % 16) * 4 + raw_mux = dat[0] >> 2 + assert raw_mux == mux + assert base < 40 + + +class TestDashObjectAuthor: + def make_lead(self, prob=0.9, d=30.0, y=0.0, v=0.0): + status = prob >= dash_objects.LEAD_PROB_ON + return dash_objects.ModelLead(status, d, y, v, prob=prob) + + def payload(self, msg): + return msg[1] + + def test_inactive_slot_bytes_match_stock_sentinel(self): + packer = CANPacker("honda_common_canfd_generated") + author = dash_objects.DashObjectAuthor() + msg = author.create(packer, 0, self.make_lead(prob=0.0), None, 2, 0.0) + parsed_long = ((self.payload(msg)[4] << 2) | (self.payload(msg)[5] >> 6)) & 0x3FF + assert parsed_long == 1023 + + def test_lead_rendered_in_slot0_only(self): + packer = CANPacker("honda_common_canfd_generated") + author = dash_objects.DashObjectAuthor() + lead = self.make_lead() + slot0 = author.create(packer, 0, lead, None, 1, 0.0) + slot3 = author.create(packer, 0, lead, None, 4, 0.02) + assert self.payload(slot0)[1] != 0 + assert self.payload(slot3)[1] & 0xF8 == 0 + + def test_lead_prob_hysteresis_and_hold(self): + packer = CANPacker("honda_common_canfd_generated") + author = dash_objects.DashObjectAuthor() + now = 0.0 + + def object_id(prob): + nonlocal now + now += 0.02 + msg = author.create(packer, 0, self.make_lead(prob=prob), None, 1, now) + return self.payload(msg)[1] >> 3 + + assert object_id(0.6) != 0 + # dips below ON but above OFF keep rendering + assert object_id(0.4) != 0 + # a full drop is bridged for LEAD_HOLD_S + assert object_id(0.0) != 0 + now += dash_objects.LEAD_HOLD_S + assert object_id(0.0) == 0 + + def test_reid_on_range_discontinuity(self): + ident = dash_objects.LeadIdentity() + now = 0.0 + first = ident.update(True, 30.0, 0.0, now) + # stay steady past the re-id refractory window + for _ in range(int(dash_objects.REID_REFRACTORY / 0.02) + 10): + now += 0.02 + same = ident.update(True, 30.0, 0.0, now) + assert same == first + now += 0.02 + assert ident.update(True, 60.0, 0.0, now) != first + + def test_camera_lead_never_forwarded(self): + packer = CANPacker("honda_bosch_radarless_generated") + author = dash_objects.DashObjectAuthor() + tracks = [dash_objects.CameraObject(slot=i, object_id=0, d_rel=0.0, y_rel=0.0, is_lead_car=False, valid=False) + for i in range(dash_objects.NUM_SLOTS)] + tracks[0] = dash_objects.CameraObject(slot=0, object_id=9, d_rel=40.0, y_rel=0.0, is_lead_car=True, valid=True, + car_type=7, rotation=0) + msg = author.create(packer, 0, self.make_lead(prob=0.0), tracks, 1, 0.0) + assert self.payload(msg)[1] >> 3 == 0 + + def test_adjacent_car_forwarded_with_own_mux(self): + packer = CANPacker("honda_bosch_radarless_generated") + tracks = [dash_objects.CameraObject(slot=i, object_id=0, d_rel=0.0, y_rel=0.0, is_lead_car=False, valid=False) + for i in range(dash_objects.NUM_SLOTS)] + tracks[3] = dash_objects.CameraObject(slot=3, object_id=12, d_rel=25.0, y_rel=3.0, is_lead_car=False, valid=True, + car_type=7, rotation=1) + msg = dash_objects.forward_hud_object(packer, 0, 20, tracks) + assert msg[1][0] >> 2 == 20 + assert msg[1][1] >> 3 == 12 + + +class TestCameraObjectTracker: + def test_tracks_persist_across_banks(self): + tracker = dash_objects.CameraObjectTracker() + + class FakeParser: + vl_all = {"HUD_OBJECTS": { + "MUX": [2, 18], "OBJECT_ID": [5, 5], "LONG_DIST": [30.0, 31.0], "LAT_DIST": [1.0, 1.1], + "IS_LEAD_CAR": [0, 0], "CAR_TYPE": [7, 7], "ROTATION": [0, 0], + }} + tracker.update(FakeParser()) + snap = tracker.snapshot() + assert snap[1].valid and snap[1].object_id == 5 + assert snap[1].d_rel == 31.0 + + def test_empty_sentinel_invalid(self): + tracker = dash_objects.CameraObjectTracker() + + class FakeParser: + vl_all = {"HUD_OBJECTS": { + "MUX": [1], "OBJECT_ID": [0], "LONG_DIST": [196.9], "LAT_DIST": [204.7], + "IS_LEAD_CAR": [0], "CAR_TYPE": [-1], "ROTATION": [-128], + }} + tracker.update(FakeParser()) + assert not tracker.snapshot()[0].valid diff --git a/artifacts/package_runtime/iqdbc/car/honda/tests/test_honda.py b/artifacts/package_runtime/iqdbc/car/honda/tests/test_honda.py new file mode 100644 index 000000000..15b627ab6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/tests/test_honda.py @@ -0,0 +1,18 @@ +import re + +from iqdbc.car.honda.fingerprints import FW_VERSIONS +from iqdbc.car.honda.values import HONDA_BOSCH, HONDA_BOSCH_TJA_CONTROL + +HONDA_FW_VERSION_RE = br"[A-Z0-9]{5}(-|,)[A-Z0-9]{3}(-|,)[A-Z0-9]{4}(\x00){2}$" + + +class TestHondaFingerprint: + def test_fw_version_format(self): + # Asserts all FW versions follow an expected format + for fw_by_ecu in FW_VERSIONS.values(): + for fws in fw_by_ecu.values(): + for fw in fws: + assert re.match(HONDA_FW_VERSION_RE, fw) is not None, fw + + def test_tja_bosch_only(self): + assert set(HONDA_BOSCH_TJA_CONTROL).issubset(set(HONDA_BOSCH)), "Nidec car found in TJA control list" diff --git a/artifacts/package_runtime/iqdbc/car/honda/tests/test_radar_scan.py b/artifacts/package_runtime/iqdbc/car/honda/tests/test_radar_scan.py new file mode 100644 index 000000000..88ecf1d24 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/tests/test_radar_scan.py @@ -0,0 +1,490 @@ +import math + +import pytest + +from iqdbc.can import CANParser +from iqdbc.car.honda.radar_scan import (AGE_RAW_INVALID, ALL_SCAN_ADDRS, BEARING_RAW_INVALID, BEARING_ZERO, + CLOSING_SPEED_RAW_INVALID, CLOSING_SPEED_RAW_ZERO, + CLOSING_SPEED_SIGMA_TRUST_MAX, DIST_BIAS_M, DIST_LSB_M, + DIST_RATIO_RAW_INVALID, DIST_RAW_INVALID, HondaRadarScanner, + QUIET_TIMEOUT_S, SCAN_DBC_NAME, SCAN_SLOTS, STATE_INVALID, + SWEEP_TRIGGER_ADDR, decode_closing_speed, decode_dist_ratio) +from iqdbc.dbc.generator.honda.honda_radar_scan import FRAME_SIGNALS, frame_address + +BUS = 2 +SWEEP_DT_NS = 66_000_000 + + +def set_bits(data, start_bit, size, value): + value = int(value) & ((1 << size) - 1) + pos = start_bit + for i in range(size): + bit = (value >> (size - 1 - i)) & 1 + byte_i, bit_i = pos // 8, pos % 8 + if bit: + data[byte_i] |= (1 << bit_i) + pos = pos - 1 if bit_i > 0 else pos + 15 + + +GEOMETRY = {kind: {name: (start, size) for name, start, size in sigs} for kind, sigs in FRAME_SIGNALS.items()} + + +def build_frame(slot, kind, **fields): + data = bytearray(8) + for name, value in fields.items(): + set_bits(data, *GEOMETRY[kind][name], value) + return (frame_address(slot, kind), bytes(data), BUS) + + +def quartet(slot, cycle, dist_raw=1000, bearing_raw=BEARING_ZERO, state=1, dist_sigma=0, presence=40, + age=100, handle=5): + return [ + build_frame(slot, "POS", SCAN_STATE=state, CYCLE=cycle, DIST_RAW=dist_raw, BEARING_RAW=bearing_raw, + DIST_SIGMA_RAW=dist_sigma), + build_frame(slot, "SHAPE", CYCLE=cycle, PRESENCE_RAW=presence), + build_frame(slot, "LIFE", CYCLE=cycle, AGE_RAW=age), + build_frame(slot, "IDENT", CYCLE=cycle, OBJECT_HANDLE=handle), + ] + + +def motion_frame(slot, cycle, speed_raw=CLOSING_SPEED_RAW_ZERO, sigma_raw=0, ratio_raw=500): + return build_frame(slot, "MOTION", CYCLE=cycle, CLOSING_SPEED_RAW=speed_raw, + CLOSING_SPEED_SIGMA_RAW=sigma_raw, DIST_RATIO_RAW=ratio_raw) + + +def closing_sweep(slot_msgs, cycle): + # slot 15's quartet closes every sweep so the trigger fires + msgs = list(slot_msgs) + if not any(m[0] == SWEEP_TRIGGER_ADDR for m in msgs): + msgs += quartet(15, cycle, state=STATE_INVALID, dist_raw=DIST_RAW_INVALID, + bearing_raw=BEARING_RAW_INVALID, age=AGE_RAW_INVALID, handle=0) + return msgs + + +class ScanHarness: + def __init__(self): + self.scanner = object.__new__(HondaRadarScanner) + self.scanner.rcp = CANParser(SCAN_DBC_NAME, [(a, 15) for a in ALL_SCAN_ADDRS], BUS) + self.scanner.trigger_msg = SWEEP_TRIGGER_ADDR + self.scanner.pts = {} + self.scanner._ledgers = {} + self.scanner._slot_handles = [None] * SCAN_SLOTS + self.scanner._last_sweep_nanos = -1 + self.updated = set() + self.nanos = 0 + self.cycle = 0 + + def feed(self, msgs, dt_ns=SWEEP_DT_NS): + self.nanos += dt_ns + vls = self.scanner.rcp.update([self.nanos, list(msgs)]) + self.updated.update(vls) + if self.scanner.trigger_msg not in self.updated: + if self.scanner.sweep_overdue(): + return self.scanner.quiet_bus_radardata() + return None + result = self.scanner.process_sweep(self.updated) + self.updated.clear() + return result + + def sweep(self, slot_msgs=(), cycle_step=1, dt_ns=SWEEP_DT_NS): + self.cycle = (self.cycle + cycle_step) & 0xF + return self.feed(closing_sweep(slot_msgs, self.cycle), dt_ns=dt_ns) + + def object_sweep(self, slot=0, handle=5, dist_raw=1000, with_motion=True, cycle_step=1, age_step=None, + dt_ns=SWEEP_DT_NS, **kwargs): + if age_step is None: + age_step = 2 * cycle_step + self._age = (getattr(self, "_age", 100) + age_step) & 0xFFF + cycle = (self.cycle + cycle_step) & 0xF + msgs = quartet(slot, cycle, dist_raw=dist_raw, age=self._age, handle=handle, **kwargs) + if with_motion: + msgs.append(motion_frame(slot, cycle)) + return self.sweep(msgs, cycle_step=cycle_step, dt_ns=dt_ns) + + +class TestFieldDecoding: + def test_dist_conversion(self): + assert DIST_LSB_M * 1000 + DIST_BIAS_M == pytest.approx(54.12) + + def test_closing_speed_decode_and_domain(self): + assert decode_closing_speed(CLOSING_SPEED_RAW_ZERO) == 0.0 + assert decode_closing_speed(CLOSING_SPEED_RAW_ZERO + 64) == 1.0 + assert decode_closing_speed(CLOSING_SPEED_RAW_INVALID) is None + assert decode_closing_speed(1729) is None + assert decode_closing_speed(None) is None + + def test_closing_speed_sigma_veto(self): + assert decode_closing_speed(CLOSING_SPEED_RAW_ZERO, CLOSING_SPEED_SIGMA_TRUST_MAX) == 0.0 + assert decode_closing_speed(CLOSING_SPEED_RAW_ZERO, CLOSING_SPEED_SIGMA_TRUST_MAX + 1) is None + + def test_dist_ratio_decode(self): + assert decode_dist_ratio(500) == pytest.approx(1.0) + assert decode_dist_ratio(DIST_RATIO_RAW_INVALID) is None + assert decode_dist_ratio(None) is None + + def test_bearing_sign_convention(self): + h = ScanHarness() + h.object_sweep(bearing_raw=BEARING_ZERO + 100) + result = h.object_sweep(bearing_raw=BEARING_ZERO + 100) + assert result.points[0].yRel > 0 # left of center is positive + dist = result.points[0].dRel + assert result.points[0].yRel == pytest.approx(dist * math.tan(100 / 2048)) + + def test_bearing_right_of_center_is_negative(self): + h = ScanHarness() + h.object_sweep(bearing_raw=BEARING_ZERO - 100) + result = h.object_sweep(bearing_raw=BEARING_ZERO - 100) + assert result.points[0].yRel < 0 + + def test_boresight_is_zero(self): + h = ScanHarness() + h.object_sweep(bearing_raw=BEARING_ZERO) + result = h.object_sweep(bearing_raw=BEARING_ZERO) + assert result.points[0].yRel == 0.0 + + +class TestPublicationRules: + def test_birth_is_withheld_until_second_observation(self): + h = ScanHarness() + result = h.object_sweep() + assert len(result.points) == 0 + result = h.object_sweep() + assert len(result.points) == 1 + point = result.points[0] + assert point.trackId == 5 + assert point.measured + assert math.isnan(point.aRel) and math.isnan(point.yvRel) + + def test_handle_is_wire_identity_not_synthetic(self): + h = ScanHarness() + h.object_sweep(handle=0x22) + result = h.object_sweep(handle=0x22) + assert result.points[0].trackId == 0x22 + + @pytest.mark.parametrize("field,value", [("state", STATE_INVALID), ("dist_raw", DIST_RAW_INVALID), + ("bearing_raw", BEARING_RAW_INVALID)]) + def test_sentinels_invalidate_observation(self, field, value): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + kwargs = {field: value} + result = h.object_sweep(**kwargs) + assert len(result.points) == 0 + + def test_age_sentinel_invalidates_observation(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + cycle = (h.cycle + 1) & 0xF + msgs = quartet(0, cycle, age=AGE_RAW_INVALID, handle=5) + [motion_frame(0, cycle)] + result = h.sweep(msgs) + assert len(result.points) == 0 + + @pytest.mark.parametrize("handle", [0, 0x40, 0xFF]) + def test_out_of_range_handle_invalidates(self, handle): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + result = h.object_sweep(handle=handle) + assert len(result.points) == 0 + + def test_incomplete_quartet_is_not_an_observation(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + cycle = (h.cycle + 1) & 0xF + h._age = (h._age + 2) & 0xFFF + msgs = quartet(0, cycle, age=h._age, handle=5)[:3] # drop IDENT + result = h.sweep(msgs) + # a dropped CAN frame is not a lifecycle event: the published point persists untouched + assert len(result.points) == 1 + result = h.object_sweep() + assert len(result.points) == 1 + assert result.points[0].measured + + def test_cycle_mismatch_across_quartet_is_incoherent(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + cycle = (h.cycle + 1) & 0xF + msgs = quartet(0, cycle, age=200, handle=5) + bad_life = build_frame(0, "LIFE", CYCLE=(cycle + 1) & 0xF, AGE_RAW=200) + msgs[2] = bad_life + result = h.sweep(msgs) + # an incoherent quartet is not an observation: the published point persists untouched + assert len(result.points) == 1 + assert result.points[0].measured + + +class TestLifecycle: + def test_age_advances_two_per_cycle_keeps_identity(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + result = h.object_sweep() + assert len(result.points) == 1 + + def test_continuity_across_skipped_cycles(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + result = h.object_sweep(cycle_step=3, age_step=6) + assert len(result.points) == 1 + + def test_cycle_and_age_wraparound_stay_same_incarnation(self): + h = ScanHarness() + h.cycle = 14 + h._age = 4094 + h.object_sweep() # cycle 15, age 4094+2 wraps + h.object_sweep() # cycle 0 + result = h.object_sweep() + assert len(result.points) == 1 + + def test_lifecycle_break_starts_new_incarnation(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + # same handle, age jumps arbitrarily: history must not carry over, so no publication this sweep + result = h.object_sweep(age_step=500) + assert len(result.points) == 0 + result = h.object_sweep() + assert len(result.points) == 1 + + def test_death_then_rebirth_reuses_handle_with_clean_history(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + for _ in range(4): + h.sweep() # object absent long enough to expire its ledger + result = h.object_sweep() + assert len(result.points) == 0 + result = h.object_sweep() + assert len(result.points) == 1 + + +class TestMotionPolicy: + def test_native_speed_is_published(self): + h = ScanHarness() + speed_raw = CLOSING_SPEED_RAW_ZERO + 128 + cycle = (h.cycle + 1) & 0xF + h.sweep(quartet(0, cycle, age=100, handle=5) + [motion_frame(0, cycle, speed_raw=speed_raw)]) + cycle = (h.cycle + 1) & 0xF + result = h.sweep(quartet(0, cycle, age=102, handle=5) + [motion_frame(0, cycle, speed_raw=speed_raw)]) + assert result.points[0].vRel == pytest.approx(2.0) + assert result.points[0].measured + + def test_missing_motion_frame_never_invalidates_geometry(self): + h = ScanHarness() + h.object_sweep(with_motion=False) + result = h.object_sweep(with_motion=False) + # without any motion source and no held speed, the point is withheld rather than synthesized + assert len(result.points) == 0 + + def test_stale_motion_cycle_is_ignored(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + cycle = (h.cycle + 1) & 0xF + h._age = (h._age + 2) & 0xFFF + msgs = quartet(0, cycle, age=h._age, handle=5) + [motion_frame(0, (cycle - 1) & 0xF)] + result = h.sweep(msgs) + # motion from another cycle contributes nothing: coasts on held speed, unmeasured + assert len(result.points) == 1 + assert not result.points[0].measured + + def test_high_sigma_speed_coasts_instead_of_synthesizing(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + cycle = (h.cycle + 1) & 0xF + h._age = (h._age + 2) & 0xFFF + msgs = quartet(0, cycle, age=h._age, handle=5) + \ + [motion_frame(0, cycle, sigma_raw=CLOSING_SPEED_SIGMA_TRUST_MAX + 1)] + result = h.sweep(msgs) + assert len(result.points) == 1 + assert not result.points[0].measured + assert result.points[0].vRel == pytest.approx(0.0) # the held speed, not a derivative + + def test_ratio_field_supplies_speed_when_native_missing(self): + h = ScanHarness() + dist_raw = 1000 + cycle = (h.cycle + 1) & 0xF + h.sweep(quartet(0, cycle, dist_raw=dist_raw, age=100, handle=5) + + [motion_frame(0, cycle, speed_raw=CLOSING_SPEED_RAW_INVALID, ratio_raw=490)]) + cycle = (h.cycle + 1) & 0xF + result = h.sweep(quartet(0, cycle, dist_raw=dist_raw, age=102, handle=5) + + [motion_frame(0, cycle, speed_raw=CLOSING_SPEED_RAW_INVALID, ratio_raw=490)]) + assert len(result.points) == 1 + dist = DIST_LSB_M * dist_raw + DIST_BIAS_M + dt = SWEEP_DT_NS * 1e-9 + assert result.points[0].vRel == pytest.approx(dist * (1.0 - 0.99) / dt) + assert result.points[0].measured + + def test_fast_clean_range_rate_without_sources_is_withheld(self): + h = ScanHarness() + h.object_sweep(with_motion=False, dist_raw=1000) + # large clean jump with no motion evidence: raw-rate limit rejects the range outright + result = h.object_sweep(with_motion=False, dist_raw=3000) + assert len(result.points) == 0 + + +class TestRangeAcceptance: + def test_discontinuity_is_rejected_and_never_becomes_baseline(self): + h = ScanHarness() + h.object_sweep(dist_raw=1000) + h.object_sweep(dist_raw=1002) + # jump far beyond the hard innovation gate while claiming zero closing speed + result = h.object_sweep(dist_raw=3000) + assert len(result.points) == 1 + assert not result.points[0].measured + # the rejected range did not become the derivative baseline: returning to the + # consistent range publishes measured again + result = h.object_sweep(dist_raw=1004) + assert result.points[0].measured + + def test_small_innovation_accepted(self): + h = ScanHarness() + h.object_sweep(dist_raw=1000) + result = h.object_sweep(dist_raw=1005) + assert result.points[0].measured + + +class TestSlotsAndIdentity: + def test_slot_migration_preserves_identity(self): + h = ScanHarness() + h.object_sweep(slot=2) + h.object_sweep(slot=2) + result = h.object_sweep(slot=9) + assert len(result.points) == 1 + assert result.points[0].trackId == 5 + + def test_duplicate_identity_prefers_bound_slot(self): + h = ScanHarness() + h.object_sweep(slot=2, dist_raw=1000) + h.object_sweep(slot=2, dist_raw=1002) + cycle = (h.cycle + 1) & 0xF + h._age = (h._age + 2) & 0xFFF + msgs = quartet(2, cycle, dist_raw=1004, age=h._age, handle=5) + [motion_frame(2, cycle)] + \ + quartet(9, cycle, dist_raw=2000, age=h._age, handle=5) + [motion_frame(9, cycle)] + result = h.sweep(msgs) + assert len(result.points) == 1 + assert result.points[0].dRel == pytest.approx(DIST_LSB_M * 1004 + DIST_BIAS_M) + + def test_slot_replacement_hides_old_occupant(self): + h = ScanHarness() + h.object_sweep(slot=3, handle=7) + h.object_sweep(slot=3, handle=7) + # a different identity takes the slot; the old one is hidden but not destroyed + result = h.object_sweep(slot=3, handle=9, age_step=333) + assert all(p.trackId != 7 for p in result.points) + + def test_one_identity_never_two_points(self): + h = ScanHarness() + cycle = (h.cycle + 1) & 0xF + msgs = quartet(1, cycle, age=100, handle=5) + [motion_frame(1, cycle)] + \ + quartet(6, cycle, age=100, handle=5) + [motion_frame(6, cycle)] + h.sweep(msgs) + cycle = (h.cycle + 1) & 0xF + msgs = quartet(1, cycle, age=102, handle=5) + [motion_frame(1, cycle)] + \ + quartet(6, cycle, age=102, handle=5) + [motion_frame(6, cycle)] + result = h.sweep(msgs) + assert len(result.points) == 1 + + +class TestBusSilence: + def test_quiet_bus_publishes_empty_not_none(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + result = None + for _ in range(30): + result = h.feed([], dt_ns=10_000_000) + if result is not None: + break + assert result is not None + assert result.errors.radarUnavailableTemporary + assert len(result.points) == 0 + + def test_recovery_after_silence_starts_fresh(self): + h = ScanHarness() + h.object_sweep() + h.object_sweep() + for _ in range(30): + if h.feed([], dt_ns=10_000_000) is not None: + break + result = h.object_sweep() + assert len(result.points) == 0 + result = h.object_sweep() + assert len(result.points) == 1 + + def test_no_stale_publication_before_first_sweep(self): + h = ScanHarness() + for _ in range(50): + assert h.feed([], dt_ns=10_000_000) is None + + +class TestQuietTimeoutValue: + def test_timeout_is_about_three_sweeps(self): + assert QUIET_TIMEOUT_S == pytest.approx(3 / 15, abs=0.01) + + +class TestScanInterfaceGating: + def build(self, candidate, alpha_long=False, docs=False): + from iqdbc.car import gen_empty_fingerprint + from iqdbc.car.honda.interface import CarInterface + CP = CarInterface.get_params(candidate, gen_empty_fingerprint(), [], alpha_long, False, docs) + return CP + + def test_verified_platform_has_radar(self): + from iqdbc.car.honda.values import CAR + for car in (CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_ACCORD, CAR.HONDA_CRV_5G): + assert not self.build(car).radarUnavailable + + def test_radar_survives_openpilot_longitudinal(self): + from iqdbc.car.honda.values import CAR + CP = self.build(CAR.HONDA_CIVIC_BOSCH, alpha_long=True) + assert CP.openpilotLongitudinalControl + assert not CP.radarUnavailable + + def test_unverified_family_platform_stays_off(self): + from iqdbc.car.honda.values import CAR + for car in (CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_NBOX_2G, CAR.ACURA_RDX_3G, CAR.HONDA_CRV_HYBRID): + assert self.build(car).radarUnavailable + + def test_radarless_and_canfd_stay_off(self): + from iqdbc.car.honda.values import CAR + assert self.build(CAR.HONDA_CIVIC_2022).radarUnavailable + assert self.build(CAR.HONDA_CRV_6G).radarUnavailable + + def test_docs_never_claim_radar(self): + from iqdbc.car.honda.values import CAR + assert self.build(CAR.HONDA_CIVIC_BOSCH, docs=True).radarUnavailable + + def test_radar_interface_routes_scanner(self): + from iqdbc.car import gen_empty_fingerprint + from iqdbc.car.honda.interface import CarInterface + from iqdbc.car.honda.values import CAR + CP = self.build(CAR.HONDA_CIVIC_BOSCH) + CP_IQ = CarInterface.get_params_iq(CP, CAR.HONDA_CIVIC_BOSCH, gen_empty_fingerprint(), [], False, False, False) + ri = CarInterface.RadarInterface(CP, CP_IQ) + assert ri.scanner is not None + assert ri.trigger_msg == SWEEP_TRIGGER_ADDR + + def test_radar_interface_keeps_nidec_path(self): + from iqdbc.car import gen_empty_fingerprint + from iqdbc.car.honda.interface import CarInterface + from iqdbc.car.honda.values import CAR + CP = self.build(CAR.HONDA_CIVIC) + CP_IQ = CarInterface.get_params_iq(CP, CAR.HONDA_CIVIC, gen_empty_fingerprint(), [], False, False, False) + ri = CarInterface.RadarInterface(CP, CP_IQ) + assert ri.scanner is None + assert ri.trigger_msg == 0x445 + + def test_radar_interface_sleeps_when_unavailable(self): + from iqdbc.car import gen_empty_fingerprint + from iqdbc.car.honda.interface import CarInterface + from iqdbc.car.honda.values import CAR + CP = self.build(CAR.HONDA_E) + CP_IQ = CarInterface.get_params_iq(CP, CAR.HONDA_E, gen_empty_fingerprint(), [], False, False, False) + ri = CarInterface.RadarInterface(CP, CP_IQ) + assert ri.scanner is None and ri.rcp is None diff --git a/artifacts/package_runtime/iqdbc/car/honda/tests/test_radar_scan_dbc.py b/artifacts/package_runtime/iqdbc/car/honda/tests/test_radar_scan_dbc.py new file mode 100644 index 000000000..9ec752e56 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/tests/test_radar_scan_dbc.py @@ -0,0 +1,84 @@ +from iqdbc.can.dbc import DBC as DbcFile +from iqdbc.car import Bus +from iqdbc.car.honda.values import CAR, DBC, HONDA_RADAR_SCAN_CAPABLE, HONDA_RADAR_SCAN_VERIFIED +from iqdbc.dbc.generator.honda.honda_radar_scan import (FRAME_SIGNALS, QUARTET_KINDS, SCAN_SLOTS, + frame_address, motion_address, quartet_base_address) + +SCAN_DBC_NAME = 'honda_radar_scan_generated' + + +class TestScanAddressing: + def test_quartet_bases(self): + assert [quartet_base_address(s) for s in range(SCAN_SLOTS)] == \ + [0x280, 0x284, 0x288, 0x28C, 0x2D0, 0x2D4, 0x2D8, 0x2DC, 0x2E0, 0x2E4, 0x2E8, 0x2EC, 0x2F0, 0x2F4, 0x2F8, 0x2FC] + + def test_motion_addresses(self): + assert [motion_address(s) for s in range(SCAN_SLOTS)] == \ + [0x2C8, 0x2C9, 0x2CA, 0x2CB, 0x2CC, 0x2CD, 0x2CE, 0x2CF, 0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297] + + def test_eighty_unique_addresses(self): + addrs = [frame_address(s, k) for s in range(SCAN_SLOTS) for k in (*QUARTET_KINDS, "MOTION")] + assert len(addrs) == 80 + assert len(set(addrs)) == 80 + + def test_quartet_kind_order(self): + for slot in range(SCAN_SLOTS): + base = quartet_base_address(slot) + assert [frame_address(slot, k) for k in QUARTET_KINDS] == [base, base + 1, base + 2, base + 3] + + +class TestScanDbcGeometry: + def setup_method(self): + self.dbc = DbcFile(SCAN_DBC_NAME) + + def geometry(self, addr): + msg = self.dbc.addr_to_msg[addr] + return {sig.name: (sig.start_bit, sig.size) for sig in msg.sigs.values()} + + def test_every_frame_present_with_size_8(self): + for slot in range(SCAN_SLOTS): + for kind in (*QUARTET_KINDS, "MOTION"): + msg = self.dbc.addr_to_msg[frame_address(slot, kind)] + assert msg.name == f"RADAR_SCAN_{slot:02d}_{kind}" + assert msg.size == 8 + + def test_bit_geometry_matches_spec(self): + expected = {kind: {name: (start, size) for name, start, size in sigs} for kind, sigs in FRAME_SIGNALS.items()} + for slot in range(SCAN_SLOTS): + for kind in (*QUARTET_KINDS, "MOTION"): + assert self.geometry(frame_address(slot, kind)) == expected[kind], (slot, kind) + + def test_pos_frame_field_widths(self): + geo = self.geometry(frame_address(0, "POS")) + assert geo["DIST_RAW"] == (23, 12) + assert geo["BEARING_RAW"] == (39, 11) + assert geo["SCAN_STATE"] == (15, 4) + assert geo["DIST_SIGMA_RAW"] == (7, 7) + + def test_ident_handle_is_byte_six(self): + geo = self.geometry(frame_address(0, "IDENT")) + assert geo["OBJECT_HANDLE"] == (55, 8) + + def test_motion_field_widths(self): + geo = self.geometry(frame_address(0, "MOTION")) + assert geo["CLOSING_SPEED_RAW"] == (7, 11) + assert geo["CLOSING_SPEED_SIGMA_RAW"] == (23, 10) + assert geo["DIST_RATIO_RAW"] == (55, 10) + + def test_cycle_positions_per_kind(self): + positions = {"POS": (27, 4), "SHAPE": (28, 4), "LIFE": (11, 4), "IDENT": (12, 4), "MOTION": (12, 4)} + for kind, expected in positions.items(): + assert self.geometry(frame_address(3, kind))["CYCLE"] == expected + + +class TestScanPlatformWiring: + def test_scan_dbc_on_exactly_the_capable_family(self): + for car in CAR: + has_scan_dbc = DBC[car].get(Bus.radar) == SCAN_DBC_NAME + assert has_scan_dbc == (car in HONDA_RADAR_SCAN_CAPABLE), car + + def test_verified_platforms_are_capable(self): + assert HONDA_RADAR_SCAN_VERIFIED <= HONDA_RADAR_SCAN_CAPABLE + + def test_verified_set(self): + assert HONDA_RADAR_SCAN_VERIFIED == {CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G} diff --git a/artifacts/package_runtime/iqdbc/car/honda/values.py b/artifacts/package_runtime/iqdbc/car/honda/values.py new file mode 100644 index 000000000..5b29df2dd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/honda/values.py @@ -0,0 +1,468 @@ +from dataclasses import dataclass, field +from enum import Enum, IntFlag + +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, structs, uds +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column, SupportType +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 + +Ecu = structs.CarParams.Ecu +VisualAlert = structs.CarControl.HUDControl.VisualAlert +GearShifter = structs.CarState.GearShifter + + +class CarControllerParams: + # Allow small margin below -3.5 m/s^2 from ISO 15622:2018 since we + # perform the closed loop control, and might need some + # to apply some more braking if we're on a downhill slope. + # Our controller should still keep the 2 second average above + # -3.5 m/s^2 as per planner limits + NIDEC_ACCEL_MIN = -4.0 # m/s^2 + NIDEC_ACCEL_MAX = 1.6 # m/s^2, lower than 2.0 m/s^2 for tuning reasons + + NIDEC_ACCEL_LOOKUP_BP = [-1., 0., .6] + NIDEC_ACCEL_LOOKUP_V = [-4.8, 0., 2.0] + + NIDEC_MAX_ACCEL_V = [0.5, 2.4, 1.4, 0.6] + NIDEC_MAX_ACCEL_BP = [0.0, 4.0, 10., 20.] + + NIDEC_GAS_MAX = 198 # 0xc6 + NIDEC_BRAKE_MAX = 1024 // 4 + + BOSCH_ACCEL_MIN = -3.5 # m/s^2 + BOSCH_ACCEL_MAX = 2.0 # m/s^2 + + BOSCH_GAS_LOOKUP_BP = [0.0, 2.0] # 2m/s^2 + BOSCH_GAS_LOOKUP_V = [0, 1600] + + STEER_STEP = 1 # 100 Hz + STEER_DELTA_UP = 3 # min/max in 0.33s for all Honda + STEER_DELTA_DOWN = 3 + STEER_GLOBAL_MIN_SPEED = 3 * CV.MPH_TO_MS + + def __init__(self, CP): + self.STEER_MAX = CP.lateralParams.torqueBP[-1] + # mirror of list (assuming first item is zero) for interp of signed request + # values and verify that both arrays begin at zero + assert CP.lateralParams.torqueBP[0] == 0 + assert CP.lateralParams.torqueV[0] == 0 + self.STEER_LOOKUP_BP = [v * -1 for v in CP.lateralParams.torqueBP][1:][::-1] + list(CP.lateralParams.torqueBP) + self.STEER_LOOKUP_V = [v * -1 for v in CP.lateralParams.torqueV][1:][::-1] + list(CP.lateralParams.torqueV) + + +class HondaSafetyFlags(IntFlag): + ALT_BRAKE = 1 + BOSCH_LONG = 2 + NIDEC_ALT = 4 + RADARLESS = 8 + BOSCH_CANFD = 16 + + +class HondaFlags(IntFlag): + # Detected flags + # Bosch models with alternate set of LKAS_HUD messages + BOSCH_EXT_HUD = 1 + BOSCH_ALT_BRAKE = 2 + + # Static flags + BOSCH = 4 + BOSCH_RADARLESS = 8 + + NIDEC = 16 + NIDEC_ALT_PCM_ACCEL = 32 + NIDEC_ALT_SCM_MESSAGES = 64 + + BOSCH_CANFD = 128 + + HAS_ALL_DOOR_STATES = 256 # Some Hondas have all door states, others only driver door + BOSCH_ALT_RADAR = 512 + ALLOW_MANUAL_TRANS = 1024 + HYBRID = 2048 + BOSCH_TJA_CONTROL = 4096 + + +# Car button codes +class CruiseButtons: + RES_ACCEL = 4 + DECEL_SET = 3 + CANCEL = 2 + MAIN = 1 + + +class CruiseSettings: + DISTANCE = 3 + LKAS = 1 + + +@dataclass +class HondaCarDocs(CarDocs): + package: str = "Honda Sensing" + + def init_make(self, CP: structs.CarParams): + if CP.flags & HondaFlags.BOSCH: + if CP.flags & HondaFlags.BOSCH_CANFD: + harness = CarHarness.bosch_c + elif CP.flags & HondaFlags.BOSCH_RADARLESS: + harness = CarHarness.bosch_b + else: + harness = CarHarness.bosch_a + else: + harness = CarHarness.nidec + + self.car_parts = CarParts.common([harness]) + + if CP.carFingerprint in (CAR.HONDA_CLARITY,): + self.car_parts = CarParts.common([CarHarness.honda_clarity]) + self.car_parts.custom_parts_url = "https://shop.retropilot.org/product/honda-clarity-proxy-board-kit" + self.support_type: SupportType = SupportType.COMMUNITY + self.support_link: str = "community" + + +class Footnote(Enum): + CIVIC_DIESEL = CarFootnote( + "2019 Honda Civic 1.6L Diesel Sedan does not have ALC below 12mph.", + Column.FSR_STEERING) + + +@dataclass +class HondaBoschPlatformConfig(PlatformConfig): + def init(self): + self.flags |= HondaFlags.BOSCH + + +@dataclass +class HondaBoschCANFDPlatformConfig(HondaBoschPlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'honda_common_canfd_generated', Bus.radar: 'honda_common_canfd_generated'}) + + def init(self): + super().init() + self.flags |= HondaFlags.BOSCH_CANFD + + +@dataclass +class HondaNidecPlatformConfig(PlatformConfig): + def init(self): + self.flags |= HondaFlags.NIDEC + + +def radar_dbc_dict(pt_dict): + return {Bus.pt: pt_dict, Bus.radar: 'acura_ilx_2016_nidec'} + + +# Certain Hondas have an extra steering sensor at the bottom of the steering rack, +# which improves controls quality as it removes the steering column torsion from feedback. +# Tire stiffness factor fictitiously lower if it includes the steering column torsion effect. +# For modeling details, see p.198-200 in "The Science of Vehicle Dynamics (2014), M. Guiggiani" + + +class CAR(Platforms): + # Bosch Cars + HONDA_NBOX_2G = HondaBoschPlatformConfig( + [ + HondaCarDocs("Honda N-Box 2018", "All", min_steer_speed=5.), + ], + CarSpecs(mass=890., wheelbase=2.520, steerRatio=18.64), + {Bus.pt: 'acura_rdx_2020_can_generated', Bus.radar: 'honda_radar_scan_generated'}, + ) + HONDA_ACCORD = HondaBoschPlatformConfig( + [ + HondaCarDocs("Honda Accord 2018-22", "All", video="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS), + HondaCarDocs("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS), + HondaCarDocs("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), + ], + # steerRatio: 11.82 is spec end-to-end + CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39, tireStiffnessFactor=0.8467), + {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated', Bus.radar: 'honda_radar_scan_generated'}, + flags=HondaFlags.ALLOW_MANUAL_TRANS, + ) + HONDA_ACCORD_11G = HondaBoschCANFDPlatformConfig( + [ + HondaCarDocs("Honda Accord 2023-25", "All"), + HondaCarDocs("Honda Accord Hybrid 2023-25", "All"), + ], + CarSpecs(mass=3477 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.0, centerToFrontRatio=0.39), + ) + HONDA_CIVIC_BOSCH = HondaBoschPlatformConfig( + [ + HondaCarDocs("Honda Civic 2019-21", "All", video="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", + footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS), + HondaCarDocs("Honda Civic Hatchback 2017-18", min_steer_speed=12. * CV.MPH_TO_MS), + HondaCarDocs("Honda Civic Hatchback 2019-21", "All", min_steer_speed=12. * CV.MPH_TO_MS), + ], + CarSpecs(mass=1326, wheelbase=2.7, steerRatio=15.38, centerToFrontRatio=0.4), # steerRatio: 10.93 is end-to-end spec + {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated', Bus.radar: 'honda_radar_scan_generated'}, + flags=HondaFlags.ALLOW_MANUAL_TRANS, + ) + HONDA_CIVIC_BOSCH_DIESEL = HondaBoschPlatformConfig( + [], # don't show in docs + HONDA_CIVIC_BOSCH.specs, + {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated', Bus.radar: 'honda_radar_scan_generated'}, + ) + HONDA_CIVIC_2022 = HondaBoschPlatformConfig( + [ + HondaCarDocs("Honda Civic 2022-24", "All", video="https://youtu.be/ytiOT5lcp6Q"), + HondaCarDocs("Honda Civic Hybrid 2025-26", "All"), + HondaCarDocs("Honda Civic Hatchback 2022-24", "All", video="https://youtu.be/ytiOT5lcp6Q"), + HondaCarDocs("Honda Civic Hatchback Hybrid (Europe only) 2023", "All"), + # TODO: Confirm 2024 + HondaCarDocs("Honda Civic Hatchback Hybrid 2025-26", "All"), + ], + HONDA_CIVIC_BOSCH.specs, + {Bus.pt: 'honda_bosch_radarless_generated'}, + flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.ALLOW_MANUAL_TRANS + ) + HONDA_CRV_5G = HondaBoschPlatformConfig( + [HondaCarDocs("Honda CR-V 2017-22", min_steer_speed=15. * CV.MPH_TO_MS)], + # steerRatio: 12.3 is spec end-to-end + CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), + {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated', Bus.body: 'honda_crv_ex_2017_body_generated', + Bus.radar: 'honda_radar_scan_generated'}, + flags=HondaFlags.BOSCH_ALT_BRAKE, + ) + HONDA_CRV_6G = HondaBoschCANFDPlatformConfig( + [ + HondaCarDocs("Honda CR-V 2023-26", "All"), + HondaCarDocs("Honda CR-V Hybrid 2023-26", "All"), + ], + CarSpecs(mass=1703, wheelbase=2.7, steerRatio=16.2, centerToFrontRatio=0.42), + ) + HONDA_CRV_HYBRID = HondaBoschPlatformConfig( + [HondaCarDocs("Honda CR-V Hybrid 2017-22", min_steer_speed=12. * CV.MPH_TO_MS)], + # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end + CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), + {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated', Bus.radar: 'honda_radar_scan_generated'}, + ) + HONDA_HRV_3G = HondaBoschPlatformConfig( + [HondaCarDocs("Honda HR-V 2023-25", "All")], + CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41, tireStiffnessFactor=0.5), + {Bus.pt: 'honda_bosch_radarless_generated'}, + flags=HondaFlags.BOSCH_RADARLESS, + ) + HONDA_CITY_7G = HondaBoschPlatformConfig( + [HondaCarDocs("Honda City (Brazil only) 2023", "All")], + CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.6, steerRatio=19.0, centerToFrontRatio=0.41, minSteerSpeed=23. * CV.KPH_TO_MS), + {Bus.pt: 'honda_bosch_radarless_generated'}, + flags=HondaFlags.BOSCH_RADARLESS, + ) + ACURA_RDX_3G = HondaBoschPlatformConfig( + [HondaCarDocs("Acura RDX 2019-21", "All", min_steer_speed=3. * CV.MPH_TO_MS)], + CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), # as spec + {Bus.pt: 'acura_rdx_2020_can_generated', Bus.radar: 'honda_radar_scan_generated'}, + flags=HondaFlags.BOSCH_ALT_BRAKE, + ) + HONDA_INSIGHT = HondaBoschPlatformConfig( + [HondaCarDocs("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS)], + CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39, tireStiffnessFactor=0.82), # as spec + {Bus.pt: 'honda_insight_ex_2019_can_generated', Bus.radar: 'honda_radar_scan_generated'}, + ) + HONDA_E = HondaBoschPlatformConfig( + [HondaCarDocs("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS)], + CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71, tireStiffnessFactor=0.82), + {Bus.pt: 'acura_rdx_2020_can_generated', Bus.radar: 'honda_radar_scan_generated'}, + ) + HONDA_PILOT_4G = HondaBoschCANFDPlatformConfig( + [HondaCarDocs("Honda Pilot 2023-25", "All")], + CarSpecs(mass=4660 * CV.LB_TO_KG, wheelbase=2.89, centerToFrontRatio=0.442, steerRatio=17.5), + ) + HONDA_PASSPORT_4G = HondaBoschCANFDPlatformConfig( + [HondaCarDocs("Honda Passport 2026", "All")], + CarSpecs(mass=4620 * CV.LB_TO_KG, wheelbase=2.89, centerToFrontRatio=0.442, steerRatio=18.5), + ) + # mid-model refresh + ACURA_MDX_4G_MMR = HondaBoschCANFDPlatformConfig( + [HondaCarDocs("Acura MDX 2025-26", "All except Type S")], + CarSpecs(mass=4544 * CV.LB_TO_KG, wheelbase=2.89, centerToFrontRatio=0.428, steerRatio=16.2), + ) + HONDA_ODYSSEY_5G_MMR = HondaBoschPlatformConfig( + [HondaCarDocs("Honda Odyssey 2021-26", "All", min_steer_speed=70. * CV.KPH_TO_MS)], + CarSpecs(mass=4590 * CV.LB_TO_KG, wheelbase=3.00, steerRatio=19.4, centerToFrontRatio=0.41), + {Bus.pt: 'acura_rdx_2020_can_generated'}, + flags=HondaFlags.BOSCH_ALT_BRAKE | HondaFlags.BOSCH_ALT_RADAR, + ) + ACURA_TLX_2G = HondaBoschPlatformConfig( + [HondaCarDocs("Acura TLX 2021", "All")], + CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.87, steerRatio=14.0, centerToFrontRatio=0.43), + {Bus.pt: 'honda_civic_hatchback_ex_2017_can_generated'}, + flags=HondaFlags.BOSCH_ALT_RADAR, + ) + # mid-model refresh + ACURA_TLX_2G_MMR = HondaBoschCANFDPlatformConfig( + [HondaCarDocs("Acura TLX 2025", "All")], + CarSpecs(mass=3990 * CV.LB_TO_KG, wheelbase=2.87, centerToFrontRatio=0.43, steerRatio=13.7), + ) + + # Nidec Cars + ACURA_ILX = HondaNidecPlatformConfig( + [ + HondaCarDocs("Acura ILX 2016-18", "Technology Plus Package or AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS), + HondaCarDocs("Acura ILX 2019", "All", min_steer_speed=25. * CV.MPH_TO_MS), + ], + CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37, tireStiffnessFactor=0.72), # 15.3 is spec end-to-end + radar_dbc_dict('acura_ilx_2016_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES, + ) + HONDA_CRV = HondaNidecPlatformConfig( + [HondaCarDocs("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS)], + CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41, tireStiffnessFactor=0.444), # as spec + radar_dbc_dict('honda_crv_touring_2016_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES, + ) + HONDA_CRV_EU = HondaNidecPlatformConfig( + [], # Euro version of CRV Touring, don't show in docs + HONDA_CRV.specs, + radar_dbc_dict('honda_crv_touring_2016_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES, + ) + HONDA_FIT = HondaNidecPlatformConfig( + [HondaCarDocs("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS)], + CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), + radar_dbc_dict('acura_ilx_2016_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + HONDA_FREED = HondaNidecPlatformConfig( + [HondaCarDocs("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS)], + CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39, tireStiffnessFactor=0.75), # mostly copied from FIT + radar_dbc_dict('acura_ilx_2016_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + HONDA_HRV = HondaNidecPlatformConfig( + [HondaCarDocs("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS)], + HONDA_HRV_3G.specs, + radar_dbc_dict('acura_ilx_2016_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + HONDA_ODYSSEY = HondaNidecPlatformConfig( + [HondaCarDocs("Honda Odyssey 2018-20")], + CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41, tireStiffnessFactor=0.82), + radar_dbc_dict('honda_odyssey_exl_2018_generated'), + flags=HondaFlags.NIDEC_ALT_PCM_ACCEL | HondaFlags.HAS_ALL_DOOR_STATES, + ) + HONDA_ODYSSEY_TWN = HondaNidecPlatformConfig( + [HondaCarDocs("Honda Odyssey (Taiwan) 2018-19")], + CarSpecs(mass=1865, wheelbase=2.9, steerRatio=14.35, centerToFrontRatio=0.44, tireStiffnessFactor=0.82), + radar_dbc_dict('honda_odyssey_twn_2018_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + ACURA_RDX = HondaNidecPlatformConfig( + [HondaCarDocs("Acura RDX 2016-18", "AcuraWatch Plus or Advance Package", min_steer_speed=12. * CV.MPH_TO_MS)], + CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38, tireStiffnessFactor=0.444), # as spec + radar_dbc_dict('acura_rdx_2018_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES, + ) + HONDA_PILOT = HondaNidecPlatformConfig( + [ + HondaCarDocs("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS), + HondaCarDocs("Honda Passport 2019-25", "All", min_steer_speed=12. * CV.MPH_TO_MS), + ], + HONDA_PILOT_4G.specs, + radar_dbc_dict('acura_ilx_2016_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES, + ) + HONDA_RIDGELINE = HondaNidecPlatformConfig( + [HondaCarDocs("Honda Ridgeline 2017-25", min_steer_speed=12. * CV.MPH_TO_MS)], + CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59, tireStiffnessFactor=0.444), # as spec + radar_dbc_dict('acura_ilx_2016_can_generated'), + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES | HondaFlags.HAS_ALL_DOOR_STATES, + ) + HONDA_CIVIC = HondaNidecPlatformConfig( + [HondaCarDocs("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video="https://youtu.be/-IkImTe1NYE")], + CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec + radar_dbc_dict('honda_civic_touring_2016_can_generated'), + flags=HondaFlags.HAS_ALL_DOOR_STATES + ) + + # port extensions + HONDA_CLARITY = HondaNidecPlatformConfig( + [HondaCarDocs("Honda Clarity 2018-21", min_steer_speed=12. * CV.MPH_TO_MS)], + CarSpecs(mass=1834, wheelbase=2.75, centerToFrontRatio=0.4, steerRatio=16.5), + radar_dbc_dict('honda_clarity_hybrid_2018_can_generated'), + flags=HondaFlags.HAS_ALL_DOOR_STATES, + ) + + +HONDA_NIDEC_ALT_PCM_ACCEL = CAR.with_flags(HondaFlags.NIDEC_ALT_PCM_ACCEL) +HONDA_NIDEC_ALT_SCM_MESSAGES = CAR.with_flags(HondaFlags.NIDEC_ALT_SCM_MESSAGES) +HONDA_BOSCH = CAR.with_flags(HondaFlags.BOSCH) +HONDA_BOSCH_RADARLESS = CAR.with_flags(HondaFlags.BOSCH_RADARLESS) +HONDA_BOSCH_CANFD = CAR.with_flags(HondaFlags.BOSCH_CANFD) +HONDA_BOSCH_ALT_RADAR = CAR.with_flags(HondaFlags.BOSCH_ALT_RADAR) +HONDA_BOSCH_TJA_CONTROL = CAR.with_flags(HondaFlags.BOSCH_TJA_CONTROL) + +# Bosch harness family whose radar broadcasts the decodable 16-slot object scan +HONDA_RADAR_SCAN_CAPABLE = HONDA_BOSCH - HONDA_BOSCH_RADARLESS - HONDA_BOSCH_CANFD - HONDA_BOSCH_ALT_RADAR +# scan decode stays off per platform until a real route capture has been validated +HONDA_RADAR_SCAN_VERIFIED = frozenset({CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G}) + + +DBC = CAR.create_dbc_map() + + +STEER_THRESHOLD = { + # default is 1200, overrides go here + CAR.ACURA_RDX: 400, + CAR.HONDA_CRV_EU: 400, + CAR.HONDA_ACCORD_11G: 600, + CAR.HONDA_PILOT_4G: 600, + CAR.HONDA_PASSPORT_4G: 600, + CAR.ACURA_MDX_4G_MMR: 600, + CAR.HONDA_CRV_6G: 600, + CAR.HONDA_CITY_7G: 600, + CAR.HONDA_NBOX_2G: 600, +} + + +HONDA_ALT_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(0xF112) +HONDA_ALT_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(0xF112) + + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + # Currently used to fingerprint + Request( + [StdQueries.UDS_VERSION_REQUEST], + [StdQueries.UDS_VERSION_RESPONSE], + bus=1, + ), + + # Data collection requests: + # Log manufacturer-specific identifier for current ECUs + Request( + [HONDA_ALT_VERSION_REQUEST], + [HONDA_ALT_VERSION_RESPONSE], + bus=1, + logging=True, + ), + # Nidec PT bus + Request( + [StdQueries.UDS_VERSION_REQUEST], + [StdQueries.UDS_VERSION_RESPONSE], + bus=0, + ), + # Bosch PT bus + Request( + [StdQueries.UDS_VERSION_REQUEST], + [StdQueries.UDS_VERSION_RESPONSE], + bus=1, + obd_multiplexing=False, + ), + ], + # We lose these ECUs without the comma power on these cars. + # Note that we still attempt to match with them when they are present + # This is or'd with (ALL_ECUS - ESSENTIAL_ECUS) from fw_versions.py + non_essential_ecus={ + Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_E, *HONDA_BOSCH_ALT_RADAR, *HONDA_BOSCH_RADARLESS, *HONDA_BOSCH_CANFD], + Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID, + CAR.HONDA_E, CAR.HONDA_INSIGHT, CAR.HONDA_NBOX_2G, *HONDA_BOSCH_ALT_RADAR, *HONDA_BOSCH_RADARLESS, *HONDA_BOSCH_CANFD], + }, + extra_ecus=[ + (Ecu.combinationMeter, 0x18da60f1, None), + (Ecu.programmedFuelInjection, 0x18da10f1, None), + # The only other ECU on PT bus accessible by camera on radarless Civic + # This is likely a manufacturer-specific sub-address implementation: the camera responds to this and 0x18dab0f1 + # Unclear what the part number refers to: 8S103 is 'Camera Set Mono', while 36160 is 'Camera Monocular - Honda' + # TODO: add query back, camera does not support querying both in parallel and 0x18dab0f1 often fails to respond + # (Ecu.unknown, 0x18DAB3F1, None), + ], +) diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/__init__.py b/artifacts/package_runtime/iqdbc/car/hyundai/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/carcontroller.py b/artifacts/package_runtime/iqdbc/car/hyundai/carcontroller.py new file mode 100644 index 000000000..25fb87a10 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/carcontroller.py @@ -0,0 +1,788 @@ +import numpy as np +from iqdbc.can import CANPacker +from iqdbc.car import Bus, DT_CTRL, make_tester_present_msg, structs +from iqdbc.car.lateral import apply_driver_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.hyundai import hyundaicanfd, hyundaican +from iqdbc.car.hyundai.carstate import CarState +from iqdbc.car.hyundai.hyundaicanfd import CanBus +from iqdbc.car.hyundai.values import HyundaiFlags, Buttons, CarControllerParams, CAR, CAN_GEARS, HyundaiExtFlags +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.vehicle_model import VehicleModel + +VisualAlert = structs.CarControl.HUDControl.VisualAlert +LongCtrlState = structs.CarControl.Actuators.LongControlState + + +from iqpilot.common.params import Params + +# EPS faults if you apply torque while the steering angle is above 90 degrees for more than 1 second +# All slightly below EPS thresholds to avoid fault +MAX_ANGLE = 85 +MAX_ANGLE_FRAMES = 89 +MAX_ANGLE_CONSECUTIVE_FRAMES = 2 +DRIVER_TORQUE_FILTER_TAU = 0.12 +PRE_OVERRIDE_PREDICTION_TIME = 0.15 +PRE_OVERRIDE_START_RATIO = 0.90 +PRE_OVERRIDE_FULL_RATIO = 1.05 +PRE_OVERRIDE_RAW_MIN_RATIO = 0.70 +PRE_OVERRIDE_FILTERED_MIN_RATIO = 0.65 +PRE_OVERRIDE_MIN_RATE_RATIO = 0.50 +PRE_OVERRIDE_CONFIRM_FRAMES = 2 +PRE_OVERRIDE_MAX_TORQUE_DELTA = -10.0 +LOW_SPEED_ANGLE_RATE_RAMP_SPEED = 15.0 * CV.KPH_TO_MS +MID_SPEED_ANGLE_RATE_LIMIT_SPEED = 40.0 * CV.KPH_TO_MS + +vibrate_intervals = [ + (0.0, 0.5), + (1.0, 1.5), + #(2.5, 3.0), + #(3.5, 4.0), + (5.0, 5.5), + (6.0, 6.5), + (7.5, 8.0), +] + +def process_hud_alert(enabled, fingerprint, hud_control): + sys_warning = (hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw)) + + # initialize to no line visible + # TODO: this is not accurate for all cars + sys_state = 1 + if hud_control.leftLaneVisible and hud_control.rightLaneVisible or sys_warning: # HUD alert only display when LKAS status is active + sys_state = 3 if enabled or sys_warning else 4 + elif hud_control.leftLaneVisible: + sys_state = 5 + elif hud_control.rightLaneVisible: + sys_state = 6 + + # initialize to no warnings + left_lane_warning = 0 + right_lane_warning = 0 + if hud_control.leftLaneDepart: + left_lane_warning = 1 if fingerprint in (CAR.GENESIS_G90, CAR.GENESIS_G80) else 2 + if hud_control.rightLaneDepart: + right_lane_warning = 1 if fingerprint in (CAR.GENESIS_G90, CAR.GENESIS_G80) else 2 + + return sys_warning, sys_state, left_lane_warning, right_lane_warning + +def rate_limit(x, x_last, lo, hi): + return float(np.clip(x, x_last + lo, x_last + hi)) + +def apply_steer_angle_limits_physics(desired_sw_deg: float, + last_sw_deg: float, + v_ego: float, + steering_sw_deg: float, + lat_active: bool, + wheelbase_m: float, + steer_ratio: float, + steer_sw_max_deg: float, + model_v2=None) -> float: + max_lat_accel = 8.5 # m/s^2 + max_lat_jerk = 4.0 # m/s^3 + y_std_1s = 0.1 + if model_v2 is not None and len(model_v2.position.yStd) > 10: + model_y_std_1s = float(model_v2.position.yStd[10]) + if np.isfinite(model_y_std_1s) and model_y_std_1s >= 0.0: + y_std_1s = model_y_std_1s + max_sw_rate_deg_per_tick = float(np.interp(y_std_1s, [0.1, 0.2, 0.4], [2.0, 1.5, 0.8])) + v = max(float(v_ego), 1.0) + + target_sw = float(np.clip(desired_sw_deg, -steer_sw_max_deg, steer_sw_max_deg)) + if v_ego < MID_SPEED_ANGLE_RATE_LIMIT_SPEED: + # Keep low/mid-speed angle commands quieter without reducing LKAS_ANGLE_MAX_TORQUE. + # Allow the angle, but slow the arrival: 0~15 kph ramps 0.8->1.1 deg/tick, + # then 15~40 kph tapers 1.1->0.8 deg/tick. Above 40 kph, physics limits take over. + low_mid_speed_cap = float(np.interp(v_ego, + [0.0, LOW_SPEED_ANGLE_RATE_RAMP_SPEED, MID_SPEED_ANGLE_RATE_LIMIT_SPEED], + [0.8, 1.1, 0.8])) + max_sw_rate_deg_per_tick = min(max_sw_rate_deg_per_tick, low_mid_speed_cap) + + target_rw = target_sw / steer_ratio + last_rw = float(last_sw_deg) / steer_ratio + + # --- accel limit --- + rw_max_rad = np.arctan((max_lat_accel * wheelbase_m) / (v * v)) + rw_max = float(np.degrees(rw_max_rad)) + + # --- jerk -> rate limit --- + sec2 = 1.2 + max_drw_dt = (max_lat_jerk * wheelbase_m) / (v * v * sec2) # rad/s + max_drw_per_tick = max_drw_dt * DT_CTRL # rad/tick + max_drw_per_tick_deg = float(np.degrees(max_drw_per_tick)) + + err = abs(target_sw - last_sw_deg) + if err > 20.0: + max_sw_rate_deg_per_tick = min(max_sw_rate_deg_per_tick, 1.0) + + max_drw_per_tick_deg = min( + max_drw_per_tick_deg, + max_sw_rate_deg_per_tick / steer_ratio + ) + + # --- rate limit --- + cmd_rw = rate_limit(target_rw, last_rw, -max_drw_per_tick_deg, max_drw_per_tick_deg) + + # --- accel clip --- + cmd_rw = float(np.clip(cmd_rw, -rw_max, rw_max)) + + if not lat_active: + cmd_rw = float(steering_sw_deg) / steer_ratio + + cmd_sw = cmd_rw * steer_ratio + return float(np.clip(cmd_sw, -steer_sw_max_deg, steer_sw_max_deg)) + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ=None): + super().__init__(dbc_names, CP, CP_IQ or structs.IQCarParams()) + self.CAN = CanBus(CP) + self.params = CarControllerParams(CP) + self.packer = CANPacker(dbc_names[Bus.pt]) + self.angle_limit_counter = 0 + + self.accel_last = 0 + self.apply_torque_last = 0 + self.car_fingerprint = CP.carFingerprint + self.last_button_frame = 0 + + self.hyundai_jerk = HyundaiJerk() + self.speedCameraHapticEndFrame = 0 + self.hapticFeedbackWhenSpeedCamera = 0 + self.max_angle_frames = MAX_ANGLE_FRAMES + self.blinking_signal = False # 1Hz + self.blinking_frame = int(1.0 / DT_CTRL) + self.soft_hold_mode = 2 + + self.activateCruise = 0 + self.button_wait = 12 + self.cruise_buttons_msg_values = None + self.cruise_buttons_msg_cnt = 0 + self.button_spamming_count = 0 + self.prev_clu_speed = 0 + self.button_spam1 = 8 + self.button_spam2 = 30 + self.button_spam3 = 1 + + self.apply_angle_last = 0 + self.lkas_max_torque = 0 + self.angle_max_torque = 250 + self.steering_pressed_prev = False + self.recovering_from_override = False + self.full_recovery_frames = 0 + self.repeated_override_count = 0 + self.override_latched = False + self.override_release_frames = 0 + self.driver_torque_filtered = 0.0 + self.driver_torque_filtered_prev = 0.0 + self.pre_override_frames = 0 + + self.lkas11_active = False + + self.canfd_debug = 0 + self.MainMode_ACC_trigger = 0 + self.LFA_trigger = 0 + + self.activeCarrot = 0 + self.camera_scc_params = Params().get_int("HyundaiCameraSCC") + self.is_ldws_car = Params().get_bool("IsLdwsCar") + self.enable_corner_radar = 0 + + self.steerDeltaUpOrg = self.steerDeltaUp = self.steerDeltaUpLC = self.params.STEER_DELTA_UP + self.steerDeltaDownOrg = self.steerDeltaDown = self.steerDeltaDownLC = self.params.STEER_DELTA_DOWN + + def update(self, CC, CC_IQ, CS, now_nanos): + + if self.frame % 50 == 0: + params = Params() + self.max_angle_frames = params.get_int("MaxAngleFrames") + steerMax = params.get_int("CustomSteerMax") + steerDeltaUp = params.get_int("CustomSteerDeltaUp") + steerDeltaDown = params.get_int("CustomSteerDeltaDown") + steerDeltaUpLC = params.get_int("CustomSteerDeltaUpLC") + steerDeltaDownLC = params.get_int("CustomSteerDeltaDownLC") + if steerMax > 0: + self.params.STEER_MAX = steerMax + if steerDeltaUp > 0: + self.steerDeltaUp = steerDeltaUp + #self.params.ANGLE_TORQUE_UP_RATE = steerDeltaUp + else: + self.steerDeltaUp = self.steerDeltaUpOrg + if steerDeltaDown > 0: + self.steerDeltaDown = steerDeltaDown + #self.params.ANGLE_TORQUE_DOWN_RATE = steerDeltaDown + else: + self.steerDeltaDown = self.steerDeltaDownOrg + + if steerDeltaUpLC > 0: + self.steerDeltaUpLC = steerDeltaUpLC + else: + self.steerDeltaUpLC = self.steerDeltaUp + if steerDeltaDownLC > 0: + self.steerDeltaDownLC = steerDeltaDownLC + else: + self.steerDeltaDownLC = self.steerDeltaDown + + self.soft_hold_mode = 1 if params.get_int("AutoCruiseControl") > 1 else 2 + self.hapticFeedbackWhenSpeedCamera = int(params.get_int("HapticFeedbackWhenSpeedCamera")) + + self.button_spam1 = params.get_int("CruiseButtonTest1") + self.button_spam2 = params.get_int("CruiseButtonTest2") + self.button_spam3 = params.get_int("CruiseButtonTest3") + self.speed_from_pcm = params.get_int("SpeedFromPCM") + + self.canfd_debug = params.get_int("CanfdDebug") + self.camera_scc_params = params.get_int("HyundaiCameraSCC") + self.enable_corner_radar = params.get_int("EnableCornerRadar") + + actuators = CC.actuators + hud_control = CC.hudControl + + if hud_control.modelDesire in [3,4]: + self.params.STEER_DELTA_UP = self.steerDeltaUpLC + self.params.STEER_DELTA_DOWN = self.steerDeltaDownLC + else: + self.params.STEER_DELTA_UP = self.steerDeltaUp + self.params.STEER_DELTA_DOWN = self.steerDeltaDown + + angle_control = self.CP.flags & HyundaiFlags.ANGLE_CONTROL + + # steering torque + new_torque = int(round(actuators.torque * self.params.STEER_MAX)) + apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.params) + + # >90 degree steering fault prevention + self.angle_limit_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringAngleDeg) >= MAX_ANGLE, CC.latActive, + self.angle_limit_counter, self.max_angle_frames, + MAX_ANGLE_CONSECUTIVE_FRAMES) + + #apply_angle = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw, + # CS.out.steeringAngleDeg, CC.latActive, self.params.ANGLE_LIMITS) + + apply_angle = apply_steer_angle_limits_physics( + actuators.steeringAngleDeg, + self.apply_angle_last, + CS.out.vEgoRaw, + CS.out.steeringAngleDeg, + CC.latActive, + self.CP.wheelbase, + self.CP.steerRatio, + self.params.ANGLE_LIMITS.STEER_ANGLE_MAX, + CS.modelV2, + ) + + + if angle_control: + apply_steer_req = CC.latActive + + angle_torque_cap = self.angle_max_torque + + steering_pressed_rising = CS.out.steeringPressed and not self.steering_pressed_prev + if steering_pressed_rising: + if 0 < self.full_recovery_frames < int(5.0 / DT_CTRL): + self.repeated_override_count = min(self.repeated_override_count + 1, 3) + self.full_recovery_frames = 0 + self.recovering_from_override = True + + torque_threshold = max(self.params.STEER_THRESHOLD, 1.0) + # Filter signed torque so alternating sensor noise cancels out before its + # magnitude is used for pre-override prediction. + driver_torque = float(CS.out.steeringTorque) + driver_torque_abs = abs(driver_torque) + if not CC.latActive: + self.driver_torque_filtered = driver_torque + self.driver_torque_filtered_prev = driver_torque + self.pre_override_frames = 0 + else: + torque_filter_alpha = DT_CTRL / (DRIVER_TORQUE_FILTER_TAU + DT_CTRL) + self.driver_torque_filtered_prev = self.driver_torque_filtered + self.driver_torque_filtered += torque_filter_alpha * (driver_torque - self.driver_torque_filtered) + + driver_torque_filtered_abs = abs(self.driver_torque_filtered) + driver_torque_filtered_prev_abs = abs(self.driver_torque_filtered_prev) + driver_torque_rate = max(0.0, (driver_torque_filtered_abs - driver_torque_filtered_prev_abs) / DT_CTRL) + torque_ratio = driver_torque_filtered_abs / torque_threshold + raw_torque_ratio = driver_torque_abs / torque_threshold + predicted_torque_ratio = ( + driver_torque_filtered_abs + driver_torque_rate * PRE_OVERRIDE_PREDICTION_TIME + ) / torque_threshold + pre_override_candidate = ( + CC.latActive and + not CS.out.steeringPressed and + raw_torque_ratio > PRE_OVERRIDE_RAW_MIN_RATIO and + torque_ratio > PRE_OVERRIDE_FILTERED_MIN_RATIO and + predicted_torque_ratio > PRE_OVERRIDE_START_RATIO and + driver_torque_rate > torque_threshold * PRE_OVERRIDE_MIN_RATE_RATIO + ) + self.pre_override_frames = self.pre_override_frames + 1 if pre_override_candidate else 0 + pre_override_yield = 0.0 + if self.pre_override_frames >= PRE_OVERRIDE_CONFIRM_FRAMES: + pre_override_yield = float(np.interp( + predicted_torque_ratio, + [PRE_OVERRIDE_START_RATIO, PRE_OVERRIDE_FULL_RATIO], + [0.0, 1.0], + )) + recovery_allowed = False + + if CS.out.steeringPressed: + # Start yielding immediately when driver override is confirmed. + self.override_latched = True + self.override_release_frames = 0 + torque_delta = -20.0 + elif pre_override_yield > 0.0: + # Start handing off gently before steeringPressed flips to avoid a sharp torque drop. + torque_delta = PRE_OVERRIDE_MAX_TORQUE_DELTA * pre_override_yield + elif self.lkas_max_torque >= self.angle_max_torque: + # Once fully recovered, hold full authority until the next driver override. + torque_delta = 0.0 + elif self.override_latched: + # Hold reduced authority until driver torque stays below 60% for 0.2 seconds. + self.override_release_frames = self.override_release_frames + 1 if torque_ratio < 0.6 else 0 + if self.override_release_frames >= int(0.2 / DT_CTRL): + self.override_latched = False + self.override_release_frames = 0 + recovery_allowed = True + else: + torque_delta = 0.0 + else: + recovery_allowed = True + + if recovery_allowed: + # Use one-second model uncertainty to set the base torque recovery time. + # Missing or invalid model data falls back to a moderate 1.5-second recovery. + y_std_1s = 0.2 + if CS.modelV2 is not None and len(CS.modelV2.position.yStd) > 10: + model_y_std_1s = float(CS.modelV2.position.yStd[10]) + if np.isfinite(model_y_std_1s) and model_y_std_1s >= 0.0: + y_std_1s = model_y_std_1s + + recovery_time = float(np.interp(y_std_1s, [0.1, 0.2, 0.3, 0.4], [0.5, 0.8, 1.5, 3.0])) + recovery_time = max(recovery_time, float(np.interp( + self.repeated_override_count, + [0, 1, 2, 3], + [0.1, 1.0, 2.0, 3.0], + ))) + base_rate_up = (self.angle_max_torque - self.params.ANGLE_MIN_TORQUE) * DT_CTRL / recovery_time + + # During recovery, taper the rate to zero. Only steeringPressed can reduce authority. + torque_delta = base_rate_up * float(np.interp(torque_ratio, [0.6, 0.8], [1.0, 0.0])) + self.lkas_max_torque = float(np.clip(self.lkas_max_torque + torque_delta, + self.params.ANGLE_MIN_TORQUE, angle_torque_cap)) + + if not CS.out.steeringPressed and self.recovering_from_override and self.lkas_max_torque >= self.angle_max_torque: + self.recovering_from_override = False + self.full_recovery_frames = 1 + elif not CS.out.steeringPressed and self.full_recovery_frames > 0: + self.full_recovery_frames += 1 + if self.full_recovery_frames >= int(5.0 / DT_CTRL): + self.full_recovery_frames = 0 + self.repeated_override_count = 0 + + if not CC.latActive: + apply_torque = 0 + self.lkas_max_torque = 0 + self.recovering_from_override = False + self.full_recovery_frames = 0 + self.repeated_override_count = 0 + self.override_latched = False + self.override_release_frames = 0 + self.driver_torque_filtered = 0.0 + self.driver_torque_filtered_prev = 0.0 + self.pre_override_frames = 0 + + self.steering_pressed_prev = CS.out.steeringPressed if CC.latActive else False + + self.apply_angle_last = apply_angle + + # Hold torque with induced temporary fault when cutting the actuation bit + torque_fault = CC.latActive and not apply_steer_req + + self.apply_torque_last = apply_torque + + # accel + longitudinal + accel = float(np.clip(actuators.accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX)) + stopping = actuators.longControlState == LongCtrlState.stopping + set_speed_in_units = hud_control.setSpeed * (CV.MS_TO_KPH if CS.is_metric else CV.MS_TO_MPH) + + # HUD messages + sys_warning, sys_state, left_lane_warning, right_lane_warning = process_hud_alert(CC.enabled, self.car_fingerprint, + hud_control) + + active_speed_decel = hud_control.activeCarrot == 3 and self.activeCarrot != 3 # 3: Speed Decel + self.activeCarrot = hud_control.activeCarrot + if active_speed_decel and self.speedCameraHapticEndFrame < 0: # ęŗŧė†ėš´ëŠ”ëŧ ę°ė†ė‹œėž‘ + self.speedCameraHapticEndFrame = self.frame + (8.0 / DT_CTRL) #8ė´ˆę°„ ėŧœė¤Œ. + elif not active_speed_decel: + self.speedCameraHapticEndFrame = -1 + + if 0 <= self.speedCameraHapticEndFrame - self.frame < int(8.0 / DT_CTRL) and self.hapticFeedbackWhenSpeedCamera > 0: + t = (self.frame - (self.speedCameraHapticEndFrame - int(8.0 / DT_CTRL))) * DT_CTRL + + for start, end in vibrate_intervals: + if start <= t < end: + left_lane_warning = right_lane_warning = self.hapticFeedbackWhenSpeedCamera + break + + if self.frame >= self.speedCameraHapticEndFrame: + self.speedCameraHapticEndFrame = -1 + + if self.frame % self.blinking_frame == 0: + self.blinking_signal = True + elif self.frame % self.blinking_frame == self.blinking_frame / 2: + self.blinking_signal = False + + + + can_sends = [] + + # *** common hyundai stuff *** + + # tester present - w/ no response (keeps relevant ECU disabled) + if self.frame % 100 == 0 and not (self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC) and self.CP.openpilotLongitudinalControl: + # for longitudinal control, either radar or ADAS driving ECU + addr, bus = 0x7d0, self.CAN.ECAN if self.CP.flags & HyundaiFlags.CANFD else 0 + if self.CP.flags & HyundaiFlags.CANFD_HDA2.value: + addr, bus = 0x730, self.CAN.ECAN + can_sends.append(make_tester_present_msg(addr, bus, suppress_response=True)) + + # for blinkers + if self.CP.flags & HyundaiFlags.ENABLE_BLINKERS: + can_sends.append(make_tester_present_msg(0x7b1, self.CAN.ECAN, suppress_response=True)) + + camera_scc = self.CP.flags & HyundaiFlags.CAMERA_SCC + # CAN-FD platforms + if self.CP.flags & HyundaiFlags.CANFD: + hda2 = self.CP.flags & HyundaiFlags.CANFD_HDA2 + hda2_long = hda2 and self.CP.openpilotLongitudinalControl + # steering control + can_sends.extend(hyundaicanfd.create_steering_messages( + self.packer, self.CP, self.CAN, CC.enabled, apply_steer_req, apply_torque, + apply_angle, self.lkas_max_torque, angle_control, + )) + + # prevent LFA from activating on HDA2 by sending "no lane lines detected" to ADAS ECU + if self.frame % 5 == 0 and hda2 and not camera_scc: + can_sends.extend(hyundaicanfd.create_suppress_lfa(self.packer, self.CAN, CS)) + + # LFA and HDA icons + if self.frame % 5 == 0 and (not hda2 or hda2_long or camera_scc): + can_sends.extend(hyundaicanfd.create_lfahda_cluster(self.packer, CS, self.CAN, CC.longActive, CC.latActive)) + if not camera_scc: + can_sends.extend(hyundaicanfd.create_lfa_icon_non_camera_scc(self.packer, CS, self.CAN, CC)) + + # blinkers + if hda2 and self.CP.flags & HyundaiFlags.ENABLE_BLINKERS: + can_sends.extend(hyundaicanfd.create_spas_messages(self.packer, self.CAN, self.frame, CC.leftBlinker, CC.rightBlinker)) + + if self.camera_scc_params in [2, 3]: + self.canfd_toggle_adas(CC, CS) + if self.CP.openpilotLongitudinalControl: + self.hyundai_jerk.make_jerk(self.CP, CS, accel, actuators, hud_control) + self.hyundai_jerk.check_carrot_cruise(CC, CS, hud_control, stopping, accel, actuators.aTarget) + + if True: #not camera_scc: + can_sends.extend(hyundaicanfd.create_ccnc_messages(self.CP, self.packer, self.CAN, self.frame, CC, CS, hud_control, apply_angle, left_lane_warning, right_lane_warning, self.enable_corner_radar, stopping, self.canfd_debug)) + if hda2: + can_sends.extend(hyundaicanfd.create_adrv_messages(self.CP, self.packer, self.CAN, self.frame)) + else: + can_sends.extend(hyundaicanfd.create_fca_warning_light(self.CP, self.packer, self.CAN, self.frame)) + if self.frame % 2 == 0: + if self.CP.flags & HyundaiFlags.CAMERA_SCC.value: + msg = hyundaicanfd.create_acc_control_scc2(self.packer, self.CAN, CC.enabled, self.accel_last, accel, stopping, CC.cruiseControl.override, + set_speed_in_units, hud_control, self.hyundai_jerk, CS) + if msg is not None: + can_sends.append(msg) + can_sends.extend(hyundaicanfd.create_tcs_messages(self.packer, self.CAN, CS)) # for sorento SCC radar... + else: + can_sends.append(hyundaicanfd.create_acc_control(self.packer, self.CAN, CC.enabled, self.accel_last, accel, stopping, CC.cruiseControl.override, + set_speed_in_units, hud_control, self.hyundai_jerk.jerk_u, self.hyundai_jerk.jerk_l, CS)) + self.accel_last = accel + else: + # button presses + if self.camera_scc_params == 3: # camera scc but stock long + send_button = self.make_spam_button(CC, CS) + can_sends.extend(hyundaicanfd.forward_button_message(self.packer, self.CAN, self.frame, CS, send_button, self.MainMode_ACC_trigger, self.LFA_trigger)) + else: + can_sends.extend(self.create_button_messages(CC, CS, use_clu11=False)) + else: + if CS.lkas11 is not None: + if self.lkas11_active: + can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.CP, apply_torque, apply_steer_req, + torque_fault, CS.lkas11, sys_warning, sys_state, CC.enabled, + hud_control.leftLaneVisible, hud_control.rightLaneVisible, + left_lane_warning, right_lane_warning, self.is_ldws_car)) + self.lkas11_active = True + + if not self.CP.openpilotLongitudinalControl: + can_sends.extend(self.create_button_messages(CC, CS, use_clu11=True)) + if self.CP.carFingerprint in CAN_GEARS["send_mdps12"] and CS.mdps12 is not None: # send mdps12 to LKAS to prevent LKAS error + can_sends.append(hyundaican.create_mdps12(self.packer, self.frame, CS.mdps12)) + + casper_ev = self.CP.carFingerprint == CAR.HYUNDAI_CASPER_EV + if self.frame % 2 == 0 and self.CP.openpilotLongitudinalControl: + self.hyundai_jerk.make_jerk(self.CP, CS, accel, actuators, hud_control) + self.hyundai_jerk.check_carrot_cruise(CC, CS, hud_control, stopping, accel, actuators.aTarget) + #jerk = 3.0 if actuators.longControlState == LongCtrlState.pid else 1.0 + use_fca = self.CP.flags & HyundaiFlags.USE_FCA.value + if camera_scc: + + can_sends.extend(hyundaican.create_acc_commands_scc(self.packer, CC.enabled, accel, self.hyundai_jerk, int(self.frame / 2), + hud_control, set_speed_in_units, stopping, + CC.cruiseControl.override, casper_ev, CS, self.soft_hold_mode)) + else: + can_sends.extend(hyundaican.create_acc_commands(self.packer, CC.enabled, accel, self.hyundai_jerk, int(self.frame / 2), + hud_control, set_speed_in_units, stopping, + CC.cruiseControl.override, use_fca, self.CP, CS, self.soft_hold_mode)) + + + # 20 Hz LFA MFA message + if self.frame % 5 == 0 and self.CP.flags & HyundaiFlags.SEND_LFA.value: + can_sends.append(hyundaican.create_lfahda_mfc(self.packer, CC, self.blinking_signal)) + + # 5 Hz ACC options + if self.frame % 20 == 0 and self.CP.openpilotLongitudinalControl: + if camera_scc: + if CS.scc13 is not None: + if casper_ev: + #can_sends.append(hyundaican.create_acc_opt_copy(CS, self.packer)) + pass + pass + else: + can_sends.extend(hyundaican.create_acc_opt(self.packer, self.CP)) + + # 2 Hz front radar options + if self.frame % 50 == 0 and self.CP.openpilotLongitudinalControl and not camera_scc: + can_sends.append(hyundaican.create_frt_radar_opt(self.packer)) + + new_actuators = actuators.as_builder() + new_actuators.torque = apply_torque / self.params.STEER_MAX + # torqueOutputCan reflects the steering authority value actually sent over CAN. + # Torque-control platforms send the signed torque command, while angle-control + # platforms send LKAS_ANGLE_MAX_TORQUE alongside the requested angle. + new_actuators.torqueOutputCan = self.lkas_max_torque if angle_control else apply_torque + new_actuators.steeringAngleDeg = float(apply_angle) + new_actuators.accel = accel + + self.frame += 1 + return new_actuators, can_sends + + + def create_button_messages(self, CC: structs.CarControl, CS: CarState, use_clu11: bool): + can_sends = [] + if CS.out.brakePressed or CS.out.brakeHoldActive: + return can_sends + if use_clu11: + if CS.clu11 is None: + return can_sends + + if CC.cruiseControl.cancel: + can_sends.append(hyundaican.create_clu11(self.packer, self.frame, CS.clu11, Buttons.CANCEL, self.CP)) + elif False: #CC.cruiseControl.resume: + # send resume at a max freq of 10Hz + if (self.frame - self.last_button_frame) * DT_CTRL > 0.1: + # send 25 messages at a time to increases the likelihood of resume being accepted + can_sends.extend([hyundaican.create_clu11(self.packer, self.frame, CS.clu11, Buttons.RES_ACCEL, self.CP)] * 25) + if (self.frame - self.last_button_frame) * DT_CTRL >= 0.15: + self.last_button_frame = self.frame + + if self.last_button_frame != self.frame: + send_button = self.make_spam_button(CC, CS) + if send_button > 0: + can_sends.append(hyundaican.create_clu11_button(self.packer, self.frame, CS.clu11, send_button, self.CP)) + + else: + + # carrot.. ė™œ alt_cruise_button는 ę°’ė´ ëĻŦėŠ¤íŠ¸ėŧ까?, ꡸ëĻŦęŗ  ė™œ? ëšˆë°ė´í„°ę°€ ë“¤ė–´ė˜¤ëŠ”ę˛ƒėŧ까? + if CS.cruise_buttons_msg is not None and self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS: + try: + cruise_buttons_msg_values = {key: value[0] for key, value in CS.cruise_buttons_msg.items()} + except: # IndexError: + #print("IndexError....") + cruise_buttons_msg_values = None + self.cruise_buttons_msg_cnt += 1 + if cruise_buttons_msg_values is not None: + self.cruise_buttons_msg_values = cruise_buttons_msg_values + self.cruise_buttons_msg_cnt = 0 + + if (self.frame - self.last_button_frame) * DT_CTRL > 0.25: + # cruise cancel + if CC.cruiseControl.cancel: + if (self.frame - self.last_button_frame) * DT_CTRL > 0.1: + print("cruiseControl.cancel222222") + if self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS: + #can_sends.append(hyundaicanfd.create_acc_cancel(self.packer, self.CP, self.CAN, CS.scc_control)) + if self.cruise_buttons_msg_values is not None: + can_sends.append(hyundaicanfd.alt_cruise_buttons(self.packer, self.CP, self.CAN, Buttons.CANCEL, self.cruise_buttons_msg_values, self.cruise_buttons_msg_cnt)) + + else: + for _ in range(20): + can_sends.append(hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter+1, Buttons.CANCEL)) + self.last_button_frame = self.frame + + # cruise standstill resume + elif False: #CC.cruiseControl.resume: + if self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS: + # TODO: resume for alt button cars + pass + else: + for _ in range(20): + can_sends.append(hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter+1, Buttons.RES_ACCEL)) + self.last_button_frame = self.frame + + ## button ėŠ¤íŒ¨ë°ė„ ė•ˆí–ˆė„ë•Œ... + if self.last_button_frame != self.frame: + dat = self.canfd_speed_control_pcm(CC, CS, self.cruise_buttons_msg_values) + if dat is not None: + for _ in range(self.button_spam3): + can_sends.append(dat) + self.cruise_buttons_msg_cnt += 1 + + return can_sends + + def canfd_toggle_adas(self, CC, CS): + trigger_min = -200 + trigger_start = 6 + self.MainMode_ACC_trigger = max(trigger_min, self.MainMode_ACC_trigger - 1) + self.LFA_trigger = max(trigger_min, self.LFA_trigger - 1) + if self.MainMode_ACC_trigger == trigger_min and self.LFA_trigger == trigger_min: + if CC.enabled and not CS.MainMode_ACC and CS.out.vEgo > 3.: + self.MainMode_ACC_trigger = trigger_start + elif CC.latActive and CS.LFA_ICON == 0: + self.LFA_trigger = trigger_start + + def canfd_speed_control_pcm(self, CC, CS, cruise_buttons_msg_values): + + alt_buttons = True if self.CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS else False + + if alt_buttons and cruise_buttons_msg_values is None: + return None + + send_button = self.make_spam_button(CC, CS) + if send_button > 0: + if alt_buttons: + return hyundaicanfd.alt_cruise_buttons(self.packer, self.CP, self.CAN, send_button, cruise_buttons_msg_values, self.cruise_buttons_msg_cnt) + else: + return hyundaicanfd.create_buttons(self.packer, self.CP, self.CAN, CS.buttons_counter+1, send_button) + + return None + + + def make_spam_button(self, CC, CS): + hud_control = CC.hudControl + set_speed_in_units = hud_control.setSpeed * (CV.MS_TO_KPH if CS.is_metric else CV.MS_TO_MPH) + target = int(set_speed_in_units+0.5) + current = int(CS.out.cruiseState.speed * (CV.MS_TO_KPH if CS.is_metric else CV.MS_TO_MPH) + 0.5) + v_ego_kph = CS.out.vEgo * CV.MS_TO_KPH + + send_button = 0 + activate_cruise = False + + if CC.enabled: + if not CS.out.cruiseState.enabled: + if (hud_control.leadVisible or v_ego_kph > 10.0) and self.activateCruise == 0: + send_button = Buttons.RES_ACCEL + self.activateCruise = 1 + activate_cruise = True + elif CC.cruiseControl.resume: + send_button = Buttons.RES_ACCEL + elif target < current and current>= 31 and self.speed_from_pcm != 1: + send_button = Buttons.SET_DECEL + elif target > current and current < 160 and self.speed_from_pcm != 1: + send_button = Buttons.RES_ACCEL + elif CS.out.activateCruise: #CC.cruiseControl.activate: + if (hud_control.leadVisible or v_ego_kph > 10.0) and self.activateCruise == 0: + self.activateCruise = 1 + send_button = Buttons.RES_ACCEL + activate_cruise = True + + if CS.out.brakePressed or CS.out.gasPressed: + self.activateCruise = 0 + + if send_button == 0: + self.button_spamming_count = 0 + self.prev_clu_speed = current + return 0 + + speed_diff = self.prev_clu_speed - current + spamming_max = self.button_spam1 + if CS.cruise_buttons[-1] != Buttons.NONE: + self.last_button_frame = self.frame + self.button_wait = self.button_spam2 + self.button_spamming_count = 0 + elif abs(self.button_spamming_count) >= spamming_max or abs(speed_diff) > 0: + self.last_button_frame = self.frame + self.button_wait = self.button_spam2 if abs(self.button_spamming_count) >= spamming_max else 7 + self.button_spamming_count = 0 + + self.prev_clu_speed = current + send_button_allowed = (self.frame - self.last_button_frame) > self.button_wait + #CC.debugTextCC = "{} speed_diff={:.1f},{:.0f}/{:.0f}, button={}, button_wait={}, count={}".format( + # send_button_allowed, speed_diff, target, current, send_button, self.button_wait, self.button_spamming_count) + + if send_button_allowed or activate_cruise or (CC.cruiseControl.resume and self.frame % 2 == 0): + self.button_spamming_count = self.button_spamming_count + 1 if send_button == Buttons.RES_ACCEL else self.button_spamming_count - 1 + return send_button + else: + self.button_spamming_count = 0 + return 0 + +from iqpilot.common.filter_simple import MyMovingAverage +class HyundaiJerk: + def __init__(self): + self.params = Params() + self.jerk = 0.0 + self.jerk_u = self.jerk_l = 0.0 + self.cb_upper = self.cb_lower = 0.0 + self.jerk_u_min = 0.5 + self.carrot_cruise = 1 + self.carrot_cruise_accel = 0.0 + + def check_carrot_cruise(self, CC, CS, hud_control, stopping, accel, a_target): + carrot_cruise_decel = self.params.get_float("CarrotCruiseDecel") + carrot_cruise_atc_decel = self.params.get_float("CarrotCruiseAtcDecel") + if carrot_cruise_atc_decel >= 0 and 0 < hud_control.atcDistance < 500: + carrot_cruise_decel = max(carrot_cruise_decel, carrot_cruise_atc_decel) + self.carrot_cruise = 0 + if CS.out.carrotCruise > 0 and not CC.cruiseControl.override: + if CS.softHoldActive == 0 and not stopping: + if CS.out.vEgo > 10/3.6: + if carrot_cruise_decel < 0: + if (a_target > -0.1 or accel > -0.1): + self.carrot_cruise = 1 + self.carrot_cruise_accel = 0.0 + else: + self.carrot_cruise = 2 + carrot_cruise = min(accel, -carrot_cruise_decel * 0.01) + self.carrot_cruise_accel = max(carrot_cruise, self.carrot_cruise_accel - 1.0 * DT_CTRL) # 렐맄렁ėœŧ로 ė¤„ėž„. + if self.carrot_cruise == 0: + self.carrot_cruise_accel = CS.out.aEgo + + def make_jerk(self, CP, CS, accel, actuators, hud_control): + if actuators.longControlState == LongCtrlState.stopping: + self.jerk = self.jerk_u_min / 2 - CS.out.aEgo + else: + jerk = actuators.jerk if actuators.longControlState == LongCtrlState.pid else 0.0 + #a_error = actuators.aTarget - CS.out.aEgo + self.jerk = jerk# + a_error + + jerk_max_l = 5.0 + jerk_max_u = jerk_max_l + if actuators.longControlState == LongCtrlState.off: + self.jerk_u = jerk_max_u + self.jerk_l = jerk_max_l + self.cb_upper = self.cb_lower = 0.0 + else: + if CP.flags & HyundaiFlags.CANFD: + # Keep deceleration authority after the MPC jerk settles to zero. Stock SCC raises the + # lower jerk limit with the raw acceleration request instead of relying on jerk alone. + jerk_l_base = 1.2 + jerk_l_raw = np.clip(jerk_l_base + 2.0 * max(0.0, -accel - 2.8), jerk_l_base, jerk_max_l) + jerk_l_mpc = np.clip(-self.jerk * 4.0, jerk_l_base, jerk_max_l) + + self.jerk_u = min(max(self.jerk_u_min, self.jerk * 2.0), jerk_max_u) + self.jerk_l = max(jerk_l_raw, jerk_l_mpc) + self.cb_upper = self.cb_lower = 0.0 + else: + self.jerk_u = min(max(self.jerk_u_min, self.jerk * 2.0), jerk_max_u) + self.jerk_l = min(max(1.0, -self.jerk * 4.0), jerk_max_l) + self.cb_upper = np.clip(0.9 + accel * 0.2, 0, 1.2) + self.cb_lower = np.clip(0.8 + accel * 0.2, 0, 1.2) diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/carstate.py b/artifacts/package_runtime/iqdbc/car/hyundai/carstate.py new file mode 100644 index 000000000..f15547e7d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/carstate.py @@ -0,0 +1,839 @@ +from collections import deque +import copy +import math +import numpy as np +import ast + +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, create_button_events, structs, DT_CTRL +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.hyundai.hyundaicanfd import CanBus +from iqdbc.car.hyundai.values import HyundaiFlags, CAR, DBC, Buttons, CarControllerParams, CAMERA_SCC_CAR, HyundaiExtFlags, \ + EV_MODE_ACTIVE_VALUES, EV_MODE_STATUS_ADDR, EV_MODE_STATUS_DLC, EV_MODE_STATUS_MSG, \ + EV_MODE_STATUS_SIGNAL +from iqdbc.car.interfaces import CarStateBase + +from iqpilot.common.params import Params + +from datetime import datetime +from zoneinfo import ZoneInfo + + +ButtonType = structs.CarState.ButtonEvent.Type + +PREV_BUTTON_SAMPLES = 8 +CLUSTER_SAMPLE_RATE = 20 # frames +STANDSTILL_THRESHOLD = 12 * 0.03125 * CV.KPH_TO_MS + +BUTTONS_DICT = {Buttons.RES_ACCEL: ButtonType.accelCruise, Buttons.SET_DECEL: ButtonType.decelCruise, + Buttons.GAP_DIST: ButtonType.gapAdjustCruise, Buttons.CANCEL: ButtonType.cancel, Buttons.LFA_BUTTON: ButtonType.lfaButton} + +GearShifter = structs.CarState.GearShifter + +READY_COUNT_OK = 200 +TRAILER_DISCONNECT_GRACE_FRAMES = int(5.0 / DT_CTRL) +EV_MODE_STATUS_TIMEOUT_NS = 500_000_000 + + +def _get_ev_mode_state(cp: CANParser) -> tuple[bool, bool]: + timestamps = cp.ts_nanos.get(EV_MODE_STATUS_MSG) + if timestamps is None: + return False, False + + timestamp = timestamps.get(EV_MODE_STATUS_SIGNAL, 0) + dat = cp.dat.get(EV_MODE_STATUS_ADDR, b"") + # The update timestamp advances even when the whole ECAN bus is silent. + # last_nonempty_nanos would leave the final decoded state valid forever. + age = cp._last_update_nanos - timestamp + valid = timestamp > 0 and len(dat) == EV_MODE_STATUS_DLC and not cp.bus_timeout and 0 <= age <= EV_MODE_STATUS_TIMEOUT_NS + active = valid and int(cp.vl[EV_MODE_STATUS_MSG][EV_MODE_STATUS_SIGNAL]) in EV_MODE_ACTIVE_VALUES + return active, valid + + +NUMERIC_TO_TZ = { + 840: "America/New_York", # 미ęĩ­ (US) → 동ëļ€ ė‹œę°„ëŒ€ + 124: "America/Toronto", # ėēë‚˜ë‹¤ (CA) → 동ëļ€ ė‹œę°„ëŒ€ + 250: "Europe/Paris", # í”„ëž‘ėŠ¤ (FR) + 276: "Europe/Berlin", # 독ėŧ (DE) + 826: "Europe/London", # 똁ęĩ­ (GB) + 392: "Asia/Tokyo", # ėŧëŗ¸ (JP) + 156: "Asia/Shanghai", # 뤑ęĩ­ (CN) + 410: "Asia/Seoul", # 한ęĩ­ (KR) + 36: "Australia/Sydney", # 호ėŖŧ (AU) + 356: "Asia/Kolkata", # ė¸ë„ (IN) +} + +class CarState(CarStateBase): + def __init__(self, CP, CP_IQ=None): + super().__init__(CP, CP_IQ or structs.IQCarParams()) + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + + self.cruise_buttons: deque = deque([Buttons.NONE] * PREV_BUTTON_SAMPLES, maxlen=PREV_BUTTON_SAMPLES) + self.main_buttons: deque = deque([Buttons.NONE] * PREV_BUTTON_SAMPLES, maxlen=PREV_BUTTON_SAMPLES) + + self.gear_msg_canfd = "GEAR" if CP.extFlags & HyundaiExtFlags.CANFD_GEARS_69 else \ + "ACCELERATOR" if CP.flags & HyundaiFlags.EV else \ + "GEAR_ALT" if CP.flags & HyundaiFlags.CANFD_ALT_GEARS else \ + "GEAR_ALT_2" if CP.flags & HyundaiFlags.CANFD_ALT_GEARS_2 else \ + "GEAR_SHIFTER" + + self.use_accelerator = self.gear_msg_canfd == "ACCELERATOR" + if CP.flags & HyundaiFlags.CANFD: + self.shifter_values = can_define.dv[self.gear_msg_canfd]["GEAR"] + elif CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV): + self.shifter_values = can_define.dv["ELECT_GEAR"]["Elect_Gear_Shifter"] + elif self.CP.flags & HyundaiFlags.CLUSTER_GEARS: + self.shifter_values = can_define.dv["CLU15"]["CF_Clu_Gear"] + elif self.CP.flags & HyundaiFlags.TCU_GEARS: + self.shifter_values = can_define.dv["TCU12"]["CUR_GR"] + elif CP.flags & HyundaiFlags.FCEV: + self.shifter_values = can_define.dv["EMS20"]["HYDROGEN_GEAR_SHIFTER"] + else: + self.shifter_values = can_define.dv["LVR12"]["CF_Lvr_Gear"] + + self.accelerator_msg_canfd = "ACCELERATOR" if CP.flags & HyundaiFlags.EV else \ + "ACCELERATOR_ALT" if CP.flags & HyundaiFlags.HYBRID else \ + "ACCELERATOR_BRAKE_ALT" + self.cruise_btns_msg_canfd = "CRUISE_BUTTONS_ALT" if CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS else \ + "CRUISE_BUTTONS" + self.is_metric = False + self.buttons_counter = 0 + + # for generic CAN parsing + self.fca11 = None + self.scc11 = None + self.scc12 = None + self.scc13 = None + self.scc14 = None + self.lkas11 = None + self.clu11 = None + + # for CANFD parsing + self.scc_control = None + self.lfa = None + self.lfa_alt = None + self.lfahda_cluster = None + self.adrv_0x161 = None + self.adrv_0x200 = None + self.adrv_0x1ea = None + self.adrv_0x160 = None + self.ccnc_0x162 = None + self.hda_info_4a3 = None + self.tcs = None + self.mdps = None + self.steer_touch_2af = None + self.cruise_buttons_msg = None + self.cam_0x362 = None + self.cam_0x2a4 = None + self.manual_speed_limit_assist = None + self.accelerator = None + self.blinkers = None + self.blinkers_alt = None + self.doors_seatbelts = None + self.cruise_buttons_alt2 = None + + # On some cars, CLU15->CF_Clu_VehicleSpeed can oscillate faster than the dash updates. Sample at 5 Hz + self.cluster_speed = 0 + self.cluster_speed_counter = CLUSTER_SAMPLE_RATE + + self.params = CarControllerParams(CP) + self.op_params = Params() + + self.main_enabled = True if self.op_params.get_int("AutoEngage") == 2 else False + self.gear_shifter = GearShifter.drive # Gear_init for Nexo ?? unknown 21.02.23.LSW + + self.totalDistance = 0.0 + self.speedLimitDistance = 0 + self.pcmCruiseGap = 0 + + self.cruise_buttons_alt = True if self.CP.carFingerprint in (CAR.HYUNDAI_CASPER, CAR.HYUNDAI_CASPER_EV) else False + self.MainMode_ACC = False + self.ACCMode = 0 + self.LFA_ICON = 0 + self.paddle_button_prev = 0 + + self.lf_distance = 0 + self.rf_distance = 0 + self.lr_distance = 0 + self.rr_distance = 0 + #self.lf_lateral = 0 + #self.rf_lateral = 0 + + fingerprints_str = Params().get("FingerPrints") + try: + fingerprints = ast.literal_eval(fingerprints_str) if fingerprints_str else {i: {} for i in range(8)} + except (SyntaxError, ValueError): + fingerprints = {i: {} for i in range(8)} + #print("fingerprints =", fingerprints) + ecu_disabled = False + if self.CP.openpilotLongitudinalControl and not (self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC): + ecu_disabled = True + + + self.HAS_LFA_BUTTON = True if 913 in fingerprints[0] else False + self.CRUISE_BUTTON_ALT = True if 1007 in fingerprints[0] else False + + cam_bus = CanBus(CP).CAM + pt_bus = CanBus(CP).ECAN + alt_bus = CanBus(CP).ACAN + self.GEAR = True if 69 in fingerprints[pt_bus] else False + self.GEAR_ALT = True if 64 in fingerprints[pt_bus] else False + self.TPMS = True if 0x3a0 in fingerprints[pt_bus] else False + self.LOCAL_TIME = True if 1264 in fingerprints[pt_bus] else False + + self.cp_bsm = None + self.time_zone = "UTC" + + self.cp = None + self.cp_cam = None + self.cp_alt = None + self.controls_ready_count = 0 + + # trailer detection + self.trailer_connected = False + self.trailer_timeout_cnt = 0 + self.trailer_connected_prev = False + self.trailer_status = None + + def monitor_fingerprint(self, can_parsers, canfd): + if self.controls_ready_count <= READY_COUNT_OK: + if Params().get_bool("ControlsReady"): + self.controls_ready_count += 1 + + self.cp = can_parsers[Bus.pt] + self.cp_cam = can_parsers[Bus.cam] + self.cp_alt = can_parsers[Bus.alt] if Bus.alt in can_parsers else None + + def add_if_seen(parser, name, ignore_counter = False): + msg = parser.dbc.name_to_msg.get(name) + if not msg: + print(f"{name} not in DBC") + return + if msg.address not in parser.seen_addresses: + return + if msg.address in parser.addresses: + return + parser._add_message(name, ignore_counter = ignore_counter) # ← ė´ëĻ„ėœŧ로 등록 + + def add_and_cache(parser, name: str, attr: str, ignore_counter: bool = False): + add_if_seen(parser, name, ignore_counter) + if name in parser.vl: # 등록 ė„ąęŗĩí–ˆė„ 때만 + setattr(self, attr, parser.vl[name]) + return True + return False + + if self.controls_ready_count == 50: + self.cp.controls_ready = self.cp_cam.controls_ready = True + if self.cp_alt is not None: + self.cp_alt.controls_ready = True + elif self.controls_ready_count == 100: + self.cp.enable_capture = self.cp_cam.enable_capture = False + if self.cp_alt is not None: + self.cp_alt.enable_capture = False + elif self.controls_ready_count == 101: + print("cp_cam.seen_addresses =", self.cp_cam.seen_addresses) + elif self.controls_ready_count == 102: + print("cp.seen_addresses =", self.cp.seen_addresses) + elif self.controls_ready_count == 103: + if self.cp_alt is not None: + print("cp_alt.seen_addresses =", self.cp_alt.seen_addresses) + else: + print("cp_alt.seen_addresses = None") + if not canfd: + if self.controls_ready_count == 104: + cp_cruise = self.cp_cam if self.CP.flags & HyundaiFlags.CAMERA_SCC else self.cp + add_and_cache(cp_cruise, "FCA11", "fca11") + add_and_cache(self.cp_cam, "LKAS11", "lkas11") + add_and_cache(self.cp, "CLU11", "clu11") + elif self.controls_ready_count == 105: + cp_cruise = self.cp_cam if self.CP.flags & HyundaiFlags.CAMERA_SCC else self.cp + scc_messages_expected = not self.CP.openpilotLongitudinalControl or self.CP.flags & HyundaiFlags.CAMERA_SCC + if scc_messages_expected: + add_and_cache(cp_cruise, "SCC11", "scc11") + add_and_cache(cp_cruise, "SCC12", "scc12") + add_and_cache(cp_cruise, "SCC13", "scc13") + add_and_cache(cp_cruise, "SCC14", "scc14") + else: # canfd + if self.controls_ready_count == 120: + cp_cruise = self.cp_cam if self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC else self.cp + add_and_cache(cp_cruise, "SCC_CONTROL", "scc_control") + elif self.controls_ready_count == 121: + add_and_cache(self.cp, "TCS", "tcs") + add_and_cache(self.cp, "MDPS", "mdps") + add_and_cache(self.cp_cam, "LFA", "lfa") + add_and_cache(self.cp_cam, "LFA_ALT", "lfa_alt") + add_and_cache(self.cp_cam, "LFAHDA_CLUSTER", "lfahda_cluster") + elif self.controls_ready_count == 122: + add_and_cache(self.cp_cam, "ADRV_0x161", "adrv_0x161") + add_and_cache(self.cp_cam, "ADRV_0x200", "adrv_0x200") + add_and_cache(self.cp_cam, "ADRV_0x1ea", "adrv_0x1ea") + add_and_cache(self.cp_cam, "ADRV_0x160", "adrv_0x160") + add_and_cache(self.cp_cam, "CCNC_0x162", "ccnc_0x162") + elif self.controls_ready_count == 123: + add_and_cache(self.cp, "HDA_INFO_4A3", "hda_info_4a3") + add_and_cache(self.cp, "STEER_TOUCH_2AF", "steer_touch_2af") + elif self.controls_ready_count == 124: + add_and_cache(self.cp, self.cruise_btns_msg_canfd, "cruise_buttons_msg") + if not add_and_cache(self.cp_cam, "CAM_0x362", "cam_0x362") and self.cp_alt is not None: + add_and_cache(self.cp_alt, "CAM_0x362", "cam_0x362") + if not add_and_cache(self.cp_alt, "CAM_0x2a4", "cam_0x2a4", ignore_counter=True) and self.cp_cam is not None: + add_and_cache(self.cp_cam, "CAM_0x2a4", "cam_0x2a4", ignore_counter=True) + elif self.controls_ready_count == 125: + add_and_cache(self.cp, "MANUAL_SPEED_LIMIT_ASSIST", "manual_speed_limit_assist", ignore_counter = True) + if self.gear_msg_canfd == "ACCELERATOR": + add_and_cache(self.cp, "ACCELERATOR", "accelerator", ignore_counter = True) + add_and_cache(self.cp, "BLINKERS", "blinkers") + add_and_cache(self.cp, "BLINKERS_ALT", "blinkers_alt") + add_and_cache(self.cp, "DOORS_SEATBELTS", "doors_seatbelts") + elif self.controls_ready_count == 126: + add_and_cache(self.cp, "CRUISE_BUTTONS_ALT2", "cruise_buttons_alt2", ignore_counter = True) + add_and_cache(self.cp, "TRAILER_STATUS", "trailer_status", ignore_counter = True) + + + + + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + self.monitor_fingerprint(can_parsers, self.CP.flags & HyundaiFlags.CANFD) + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + cp_alt = can_parsers[Bus.alt] if Bus.alt in can_parsers else None + + if self.CP.flags & HyundaiFlags.CANFD: + return self.update_canfd(can_parsers), self.out_iq + + ret = structs.CarState() + cp_cruise = cp_cam if self.CP.flags & HyundaiFlags.CAMERA_SCC else cp + self.is_metric = cp.vl["CLU11"]["CF_Clu_SPEED_UNIT"] == 0 + speed_conv = CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS + + ret.doorOpen = any([cp.vl["CGW1"]["CF_Gway_DrvDrSw"], cp.vl["CGW1"]["CF_Gway_AstDrSw"], + cp.vl["CGW2"]["CF_Gway_RLDrSw"], cp.vl["CGW2"]["CF_Gway_RRDrSw"]]) + + ret.seatbeltUnlatched = cp.vl["CGW1"]["CF_Gway_DrvSeatBeltSw"] == 0 + + if cp.ts_nanos["EMS21"]["SCR_UREA_LEVEL"] > 0: + ret.ureaGauge = float(np.clip(cp.vl["EMS21"]["SCR_UREA_LEVEL"] / 100.0, 0.0, 1.0)) + + ret.wheelSpeeds = self.get_wheel_speeds( + cp.vl["WHL_SPD11"]["WHL_SPD_FL"], + cp.vl["WHL_SPD11"]["WHL_SPD_FR"], + cp.vl["WHL_SPD11"]["WHL_SPD_RL"], + cp.vl["WHL_SPD11"]["WHL_SPD_RR"], + ) + ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr + ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4. + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.standstill = ret.wheelSpeeds.fl <= STANDSTILL_THRESHOLD and ret.wheelSpeeds.rr <= STANDSTILL_THRESHOLD + + self.cluster_speed_counter += 1 + if self.cluster_speed_counter > CLUSTER_SAMPLE_RATE: + self.cluster_speed = cp.vl["CLU15"]["CF_Clu_VehicleSpeed"] + self.cluster_speed_counter = 0 + + # Mimic how dash converts to imperial. + # Sorento is the only platform where CF_Clu_VehicleSpeed is already imperial when not is_metric + # TODO: CGW_USM1->CF_Gway_DrLockSoundRValue may describe this + if not self.is_metric and self.CP.carFingerprint not in (CAR.KIA_SORENTO,): + self.cluster_speed = math.floor(self.cluster_speed * CV.KPH_TO_MPH + CV.KPH_TO_MPH) + + #ret.vEgoCluster = self.cluster_speed * speed_conv + + ret.steeringAngleDeg = cp.vl["SAS11"]["SAS_Angle"] + ret.steeringRateDeg = cp.vl["SAS11"]["SAS_Speed"] + ret.yawRate = cp.vl["ESP12"]["YAW_RATE"] + ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp( + 50, cp.vl["CGW1"]["CF_Gway_TurnSigLh"], cp.vl["CGW1"]["CF_Gway_TurnSigRh"]) + ret.steeringTorque = cp.vl["MDPS12"]["CR_Mdps_StrColTq"] + ret.steeringTorqueEps = cp.vl["MDPS12"]["CR_Mdps_OutTq"] + ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > self.params.STEER_THRESHOLD, 5) + ret.steerFaultTemporary = cp.vl["MDPS12"]["CF_Mdps_ToiUnavail"] != 0 or cp.vl["MDPS12"]["CF_Mdps_ToiFlt"] != 0 + + # cruise state + if self.CP.openpilotLongitudinalControl: + # These are not used for engage/disengage since openpilot keeps track of state using the buttons + ret.cruiseState.available = self.main_enabled and self.controls_ready_count >= READY_COUNT_OK #cp.vl["TCS13"]["ACCEnable"] == 0 + ret.cruiseState.enabled = cp.vl["TCS13"]["ACC_REQ"] == 1 + ret.cruiseState.standstill = False + ret.cruiseState.nonAdaptive = False + elif not self.CP.flags & HyundaiFlags.CC_ONLY_CAR: + self.main_enabled = ret.cruiseState.available = cp_cruise.vl["SCC11"]["MainMode_ACC"] == 1 + ret.cruiseState.enabled = cp_cruise.vl["SCC12"]["ACCMode"] != 0 + ret.cruiseState.standstill = cp_cruise.vl["SCC11"]["SCCInfoDisplay"] == 4. + ret.cruiseState.nonAdaptive = cp_cruise.vl["SCC11"]["SCCInfoDisplay"] == 2. # Shows 'Cruise Control' on dash + ret.cruiseState.speed = cp_cruise.vl["SCC11"]["VSetDis"] * speed_conv + + ret.pcmCruiseGap = cp_cruise.vl["SCC11"]["TauGapSet"] + + # TODO: Find brake pressure + ret.brake = 0 + if not self.CP.flags & HyundaiFlags.CC_ONLY_CAR: + ret.brakePressed = cp.vl["TCS13"]["DriverOverride"] == 2 # 2 includes regen braking by user on HEV/EV + ret.brakeHoldActive = cp.vl["TCS15"]["AVH_LAMP"] == 2 # 0 OFF, 1 ERROR, 2 ACTIVE, 3 READY + ret.parkingBrake = cp.vl["TCS13"]["PBRAKE_ACT"] == 1 + ret.espDisabled = cp.vl["TCS11"]["TCS_PAS"] == 1 + ret.espActive = cp.vl["TCS11"]["ABS_ACT"] == 1 + ret.accFaulted = cp.vl["TCS13"]["ACCEnable"] != 0 # 0 ACC CONTROL ENABLED, 1-3 ACC CONTROL DISABLED + ret.brakeLights = bool(cp.vl["TCS13"]["BrakeLight"] or ret.brakePressed) + + if self.CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV | HyundaiFlags.FCEV): + if self.CP.flags & HyundaiFlags.FCEV: + ret.gas = cp.vl["FCEV_ACCELERATOR"]["ACCELERATOR_PEDAL"] / 254. + elif self.CP.flags & HyundaiFlags.HYBRID: + ret.gas = cp.vl["E_EMS11"]["CR_Vcu_AccPedDep_Pos"] / 254. + else: + ret.gas = cp.vl["E_EMS11"]["Accel_Pedal_Pos"] / 254. + ret.gasPressed = ret.gas > 0 + else: + ret.gas = cp.vl["EMS12"]["PV_AV_CAN"] / 100. + ret.gasPressed = bool(cp.vl["EMS16"]["CF_Ems_AclAct"]) + + # Gear Selection via Cluster - For those Kia/Hyundai which are not fully discovered, we can use the Cluster Indicator for Gear Selection, + # as this seems to be standard over all cars, but is not the preferred method. + if self.CP.flags & (HyundaiFlags.HYBRID | HyundaiFlags.EV): + gear = cp.vl["ELECT_GEAR"]["Elect_Gear_Shifter"] + ret.gearStep = cp.vl["ELECT_GEAR"]["Elect_Gear_Step"] + if self.CP.carFingerprint == CAR.HYUNDAI_CASPER_EV: + ret.gearStep = 0 + elif self.CP.flags & HyundaiFlags.FCEV: + gear = cp.vl["EMS20"]["HYDROGEN_GEAR_SHIFTER"] + elif self.CP.flags & HyundaiFlags.CLUSTER_GEARS: + gear = cp.vl["CLU15"]["CF_Clu_Gear"] + if self.CP.carFingerprint == CAR.KIA_K7: + ret.gearStep = cp.vl["LVR11"]["CF_Lvr_GearInf"] + elif self.CP.flags & HyundaiFlags.TCU_GEARS: + gear = cp.vl["TCU12"]["CUR_GR"] + else: + gear = cp.vl["LVR12"]["CF_Lvr_Gear"] + ret.gearStep = cp.vl["LVR11"]["CF_Lvr_GearInf"] + + if not self.CP.carFingerprint in (CAR.HYUNDAI_NEXO): + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear)) + else: + gear = cp.vl["ELECT_GEAR"]["Elect_Gear_Shifter"] + gear_disp = cp.vl["ELECT_GEAR"] + + gear_shifter = GearShifter.unknown + + if gear == 1546: # Thank you for Neokii # fix PolorBear 22.06.05 + gear_shifter = GearShifter.drive + elif gear == 2314: + gear_shifter = GearShifter.neutral + elif gear == 2569: + gear_shifter = GearShifter.park + elif gear == 2566: + gear_shifter = GearShifter.reverse + + if gear_shifter != GearShifter.unknown and self.gear_shifter != gear_shifter: + self.gear_shifter = gear_shifter + + ret.gearShifter = self.gear_shifter + + if not self.CP.flags & HyundaiFlags.CC_ONLY_CAR and (not self.CP.openpilotLongitudinalControl or self.CP.flags & HyundaiFlags.CAMERA_SCC): + aeb_src = "FCA11" if self.CP.flags & HyundaiFlags.USE_FCA.value else "SCC12" + aeb_sig = "FCA_CmdAct" if self.CP.flags & HyundaiFlags.USE_FCA.value else "AEB_CmdAct" + aeb_warning = cp_cruise.vl[aeb_src]["CF_VSM_Warn"] != 0 + scc_warning = cp_cruise.vl["SCC12"]["TakeOverReq"] == 1 # sometimes only SCC system shows an FCW + aeb_braking = cp_cruise.vl[aeb_src]["CF_VSM_DecCmdAct"] != 0 or cp_cruise.vl[aeb_src][aeb_sig] != 0 + if self.CP.carFingerprint == CAR.HYUNDAI_CASPER_EV and aeb_src == "FCA11": + fca_fault = cp_cruise.vl["FCA11"]["FCA_Failinfo"] != 0 or cp_cruise.vl["FCA11"]["FCA_Status"] == 3 + if fca_fault: + aeb_warning = False + aeb_braking = False + ret.stockFcw = (aeb_warning or scc_warning) and not aeb_braking + ret.stockAeb = aeb_warning and aeb_braking + + if self.CP.enableBsm: + ret.leftBlindspot = cp.vl["LCA11"]["CF_Lca_IndLeft"] != 0 + ret.rightBlindspot = cp.vl["LCA11"]["CF_Lca_IndRight"] != 0 + + self.steer_state = cp.vl["MDPS12"]["CF_Mdps_ToiActive"] # 0 NOT ACTIVE, 1 ACTIVE + prev_cruise_buttons = self.cruise_buttons[-1] + #self.cruise_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwState"]) + #carrot {{ + #if self.CRUISE_BUTTON_ALT and cp.vl["CRUISE_BUTTON_ALT"]["SET_ME_1"] == 1: + # self.cruise_buttons_alt = True + + cruise_button = [Buttons.NONE] + if self.cruise_buttons_alt: + lfa_button = cp.vl["CRUISE_BUTTON_LFA"]["CruiseSwLfa"] + cruise_button = [Buttons.LFA_BUTTON] if lfa_button > 0 else [cp.vl["CRUISE_BUTTON_ALT"]["CruiseSwState"]] + elif self.HAS_LFA_BUTTON and cp.vl["BCM_PO_11"]["LFA_Pressed"] == 1: # for K5 + cruise_button = [Buttons.LFA_BUTTON] + else: + cruise_button = cp.vl_all["CLU11"]["CF_Clu_CruiseSwState"] + self.cruise_buttons.extend(cruise_button) + # }} carrot + prev_main_buttons = self.main_buttons[-1] + #self.cruise_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwState"]) + if self.cruise_buttons_alt: + self.main_buttons.extend(cp.vl_all["CRUISE_BUTTON_ALT"]["CruiseSwMain"]) + else: + self.main_buttons.extend(cp.vl_all["CLU11"]["CF_Clu_CruiseSwMain"]) + self.mdps12 = copy.copy(cp.vl["MDPS12"]) + + ret.buttonEvents = [*create_button_events(self.cruise_buttons[-1], prev_cruise_buttons, BUTTONS_DICT), + *create_button_events(self.main_buttons[-1], prev_main_buttons, {1: ButtonType.mainCruise})] + + + if not self.CP.flags & HyundaiFlags.CC_ONLY_CAR: + tpms_unit = cp.vl["TPMS11"]["UNIT"] * 0.725 if int(cp.vl["TPMS11"]["UNIT"]) > 0 else 1. + ret.tpms.fl = tpms_unit * cp.vl["TPMS11"]["PRESSURE_FL"] + ret.tpms.fr = tpms_unit * cp.vl["TPMS11"]["PRESSURE_FR"] + ret.tpms.rl = tpms_unit * cp.vl["TPMS11"]["PRESSURE_RL"] + ret.tpms.rr = tpms_unit * cp.vl["TPMS11"]["PRESSURE_RR"] + + cluSpeed = cp.vl["CLU11"]["CF_Clu_Vanz"] + decimal = cp.vl["CLU11"]["CF_Clu_VanzDecimal"] + if 0. < decimal < 0.5: + cluSpeed += decimal + + ret.vEgoCluster = cluSpeed * speed_conv + vEgoClu, aEgoClu = self.update_clu_speed_kf(ret.vEgoCluster) + ret.vCluRatio = (ret.vEgo / vEgoClu) if (vEgoClu > 3. and ret.vEgo > 3.) else 1.0 + + if self.CP.extFlags & HyundaiExtFlags.NAVI_CLUSTER.value: + speedLimit = cp.vl["Navi_HU"]["SpeedLim_Nav_Clu"] + speedLimitCam = cp.vl["Navi_HU"]["SpeedLim_Nav_Cam"] + ret.speedLimit = speedLimit if speedLimit < 255 and speedLimitCam == 1 else 0 + speed_limit_cam = speedLimitCam == 1 + else: + ret.speedLimit = 0 + ret.speedLimitDistance = 0 + speed_limit_cam = False + + self.update_speed_limit(ret, speed_limit_cam) + + if prev_main_buttons == 0 and self.main_buttons[-1] != 0: + self.main_enabled = not self.main_enabled + + return ret, self.out_iq + + def update_speed_limit(self, ret, speed_limit_cam): + self.totalDistance += ret.vEgo * DT_CTRL + if ret.speedLimit > 0 and not ret.gasPressed and speed_limit_cam: + if self.speedLimitDistance <= self.totalDistance: + self.speedLimitDistance = self.totalDistance + ret.speedLimit * 6 + self.speedLimitDistance = max(self.totalDistance + 1, self.speedLimitDistance) + else: + self.speedLimitDistance = self.totalDistance + ret.speedLimitDistance = self.speedLimitDistance - self.totalDistance + + def update_canfd(self, can_parsers) -> structs.CarState: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + cp_alt = can_parsers[Bus.alt] if Bus.alt in can_parsers else None + + ret = structs.CarState() + + if self.CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230: + ret.evModeActive, ret.evModeValid = _get_ev_mode_state(cp) + + self.is_metric = cp.vl["CRUISE_BUTTONS_ALT"]["DISTANCE_UNIT"] != 1 + speed_factor = CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS + + if self.CP.flags & (HyundaiFlags.EV | HyundaiFlags.HYBRID): + offset = 255. if self.CP.flags & HyundaiFlags.EV else 1023. + ret.gas = cp.vl[self.accelerator_msg_canfd]["ACCELERATOR_PEDAL"] / offset if not self.use_accelerator else 0 if self.accelerator is None else self.accelerator["ACCELERATOR_PEDAL"] / offset + ret.gasPressed = ret.gas > 1e-5 + else: + ret.gasPressed = bool(cp.vl[self.accelerator_msg_canfd]["ACCELERATOR_PEDAL_PRESSED"]) if not self.use_accelerator else False if self.accelerator is None else bool(self.accelerator["ACCELERATOR_PEDAL_PRESSED"]) + + ret.brakePressed = cp.vl["TCS"]["DriverBraking"] == 1 + #print(cp.vl["TCS"], cp.vl_all["TCS"]["DriverBraking"][-10:]) + + if self.doors_seatbelts is not None: + ret.doorOpen = self.doors_seatbelts["DRIVER_DOOR"] == 1 + ret.seatbeltUnlatched = self.doors_seatbelts["DRIVER_SEATBELT"] == 0 + + gear = cp.vl[self.gear_msg_canfd]["GEAR"] if not self.use_accelerator else 0 if self.accelerator is None else self.accelerator["GEAR"] + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear)) + + if self.TPMS: + tpms_unit = cp.vl["TPMS"]["UNIT"] * 0.725 if int(cp.vl["TPMS"]["UNIT"]) > 0 else 1. + ret.tpms.fl = tpms_unit * cp.vl["TPMS"]["PRESSURE_FL"] + ret.tpms.fr = tpms_unit * cp.vl["TPMS"]["PRESSURE_FR"] + ret.tpms.rl = tpms_unit * cp.vl["TPMS"]["PRESSURE_RL"] + ret.tpms.rr = tpms_unit * cp.vl["TPMS"]["PRESSURE_RR"] + + # TODO: figure out positions + ret.wheelSpeeds = self.get_wheel_speeds( + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_1"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_2"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_3"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_4"], + ) + ret.vEgoRaw = (ret.wheelSpeeds.fl + ret.wheelSpeeds.fr + ret.wheelSpeeds.rl + ret.wheelSpeeds.rr) / 4. + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.standstill = all(speed <= STANDSTILL_THRESHOLD for speed in + (ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr)) + + ret.brakeLights = ret.brakePressed or cp.vl["TCS"]["BrakeLight"] == 1 or ret.aEgo < -0.5 + + ret.steeringRateDeg = cp.vl["STEERING_SENSORS"]["STEERING_RATE"] + + # steering angle degę°’ė´ ė´ėƒí•¨. mdpsę°’ė´ 더 ė‹ ëĸ°ę°€ ę°€ëŠ”ë“¯.. torque steering ė°¨ëŸ‰ë„ í™•ė¸í•´ė•ŧ함. + #ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEERING_ANGLE"] * -1 + #ret.steeringAngleDeg = cp.vl["MDPS"]["STEERING_ANGLE"] * -1 + if self.CP.flags & HyundaiFlags.ANGLE_CONTROL: + ret.steeringAngleDeg = cp.vl["MDPS"]["STEERING_ANGLE_2"] * -1 + else: + ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEERING_ANGLE"] * -1 + + trailer_signal = self.trailer_status is not None and self.trailer_status["TRAILER_CONNECTED"] != 0 + if trailer_signal: + # Rising edge is immediate so trailer-specific behavior is preserved. + self.trailer_timeout_cnt = 0 + self.trailer_connected = True + elif self.trailer_connected: + # During ignition-off, the trailer bit can clear before the cluster shuts down. + # Keep suppression active through that transient, while still detecting a real + # disconnect after 5 seconds at the 100 Hz CarState update rate. + self.trailer_timeout_cnt += 1 + if self.trailer_timeout_cnt > TRAILER_DISCONNECT_GRACE_FRAMES: + self.trailer_connected = False + else: + self.trailer_timeout_cnt = 0 + + ret.trailerConnected = self.trailer_connected + + if self.trailer_connected != self.trailer_connected_prev: + print(f"[TRAILER_DEBUG] connected={self.trailer_connected} timeout={self.trailer_timeout_cnt}") + self.trailer_connected_prev = self.trailer_connected + + ret.steeringTorque = cp.vl["MDPS"]["STEERING_COL_TORQUE"] + ret.steeringTorqueEps = cp.vl["MDPS"]["STEERING_OUT_TORQUE"] + ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > self.params.STEER_THRESHOLD, 5) + ret.steerFaultTemporary = cp.vl["MDPS"]["LKA_FAULT"] != 0 or cp.vl["MDPS"]["LFA2_FAULT"] != 0 + #ret.steerFaultTemporary = False + + blinkers_info = self.blinkers if self.blinkers is not None else self.blinkers_alt if self.blinkers_alt is not None else None + if blinkers_info is not None: + left_blinker_lamp = blinkers_info["LEFT_LAMP"] or blinkers_info["LEFT_LAMP_ALT"] + right_blinker_lamp = blinkers_info["RIGHT_LAMP"] or blinkers_info["RIGHT_LAMP_ALT"] + ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, left_blinker_lamp, right_blinker_lamp) + + if self.CP.enableBsm: + if self.cp_bsm is None: + if 442 in cp.seen_addresses: + self.cp_bsm = cp + print("######## BSM in ECAN") + elif 442 in cp_cam.seen_addresses: + self.cp_bsm = cp_cam + print("######## BSM in CAM") + else: + bsm_info = self.cp_bsm.vl["BLINDSPOTS_REAR_CORNERS"] + ret.leftBlindspot = (bsm_info["FL_INDICATOR"] + bsm_info["INDICATOR_LEFT_TWO"] + bsm_info["INDICATOR_LEFT_FOUR"]) > 0 + ret.rightBlindspot = (bsm_info["FR_INDICATOR"] + bsm_info["INDICATOR_RIGHT_TWO"] + bsm_info["INDICATOR_RIGHT_FOUR"]) > 0 + + # cruise state + if self.cruise_buttons_alt2 is not None: + cruise_button = self.cruise_buttons_alt2["CRUISE_BUTTONS"] + else: + cruise_button = cp.vl[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"] + if cruise_button in [Buttons.RES_ACCEL, Buttons.SET_DECEL] and self.CP.openpilotLongitudinalControl: + self.main_enabled = True + # CAN FD cars enable on main button press, set available if no TCS faults preventing engagement + ret.cruiseState.available = self.main_enabled and self.controls_ready_count >= READY_COUNT_OK #cp.vl["TCS"]["ACCEnable"] == 0 + if self.CP.flags & HyundaiFlags.CAMERA_SCC.value: + self.MainMode_ACC = cp_cam.vl["SCC_CONTROL"]["MainMode_ACC"] == 1 + self.ACCMode = cp_cam.vl["SCC_CONTROL"]["ACCMode"] + self.LFA_ICON = cp_cam.vl["LFAHDA_CLUSTER"]["HDA_LFA_SymSta"] + + if self.CP.openpilotLongitudinalControl: + # These are not used for engage/disengage since openpilot keeps track of state using the buttons + ret.cruiseState.enabled = cp.vl["TCS"]["ACC_REQ"] == 1 + ret.cruiseState.standstill = False + if self.MainMode_ACC or self.main_enabled: + self.main_enabled = True + else: + cp_cruise_info = cp_cam if self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC else cp + ret.cruiseState.enabled = cp_cruise_info.vl["SCC_CONTROL"]["ACCMode"] in (1, 2) + if cp_cruise_info.vl["SCC_CONTROL"]["MainMode_ACC"] == 1: # carrot + ret.cruiseState.available = self.main_enabled = True + ret.pcmCruiseGap = int(np.clip(cp_cruise_info.vl["SCC_CONTROL"]["DISTANCE_SETTING"], 1, 4)) + ret.cruiseState.standstill = cp_cruise_info.vl["SCC_CONTROL"]["InfoDisplay"] >= 4 + ret.cruiseState.speed = cp_cruise_info.vl["SCC_CONTROL"]["VSetDis"] * speed_factor + ret.brakeHoldActive = cp.vl["ESP_STATUS"]["AUTO_HOLD"] == 1 and cp_cruise_info.vl["SCC_CONTROL"]["ACCMode"] not in (1, 2) + + speed_limit_cam = False + corner = False + corner_infos = [info for info in (self.adrv_0x1ea, self.ccnc_0x162) if info is not None] + if corner_infos: + def corner_max(signal): + return max(info[signal] for info in corner_infos) + + ret.leftLongDist = self.lf_distance = corner_max("LF_DETECT_DISTANCE") + ret.rightLongDist = self.rf_distance = corner_max("RF_DETECT_DISTANCE") + self.lr_distance = corner_max("LR_DETECT_DISTANCE") + self.rr_distance = corner_max("RR_DETECT_DISTANCE") + ret.leftLatDist = corner_max("LF_DETECT_LATERAL") + ret.rightLatDist = corner_max("RF_DETECT_LATERAL") + ret.leftRearLongDist = self.lr_distance + ret.rightRearLongDist = self.rr_distance + ret.leftRearLatDist = corner_max("LR_DETECT_LATERAL") + ret.rightRearLatDist = corner_max("RR_DETECT_LATERAL") + corner = True + if corner: + raw_corner_radar_enabled = ( + self.op_params.get_int("EnableCornerRadar") > 0 and + bool(self.CP.extFlags & (HyundaiExtFlags.CORNER_RADAR_OBJECTS_235.value | + HyundaiExtFlags.CORNER_RADAR_OBJECTS_180.value)) + ) + left_front_block = (not raw_corner_radar_enabled) and 0 < ret.leftLongDist < 7.0 + right_front_block = (not raw_corner_radar_enabled) and 0 < ret.rightLongDist < 7.0 + rear_block_dist = 5.0 if raw_corner_radar_enabled else 7.0 + left_rear_block = 0 < self.lr_distance < rear_block_dist + right_rear_block = 0 < self.rr_distance < rear_block_dist + left_block = left_front_block or left_rear_block + right_block = right_front_block or right_rear_block + if left_block: + ret.leftBlindspot = True + if right_block: + ret.rightBlindspot = True + + if self.hda_info_4a3 is not None: + speedLimit = self.hda_info_4a3["SPEED_LIMIT"] + if not self.is_metric: + speedLimit *= CV.MPH_TO_KPH + ret.speedLimit = speedLimit if speedLimit < 255 else 0 + if int(self.hda_info_4a3["MapSource"]) == 2: + speed_limit_cam = True + + if self.time_zone == "UTC": + country_code = int(self.hda_info_4a3["CountryCode"]) + self.time_zone = ZoneInfo(NUMERIC_TO_TZ.get(country_code, "UTC")) + + ret.gearStep = cp.vl["GEAR"]["GEAR_STEP"] if self.GEAR else 0 + if 1 <= ret.gearStep <= 8 and ret.gearShifter == GearShifter.unknown: + ret.gearShifter = GearShifter.drive + ret.gearStep = cp.vl["GEAR_ALT"]["GEAR_STEP"] if self.GEAR_ALT else ret.gearStep + + lane_info = self.cam_0x2a4 if self.cam_0x2a4 is not None else self.cam_0x362 + + if lane_info is not None: + left_lane_prob = lane_info["LEFT_LANE_PROB"] + right_lane_prob = lane_info["RIGHT_LANE_PROB"] + left_lane_type = lane_info["LEFT_LANE_TYPE"] # 0: dashed, 1: solid, 2: undecided, 3: road edge, 4: DLM Inner Solid, 5: DLM InnerDashed, 6:DLM Inner Undecided, 7: Botts Dots, 8: Barrier + right_lane_type = lane_info["RIGHT_LANE_TYPE"] + left_lane_color = lane_info["LEFT_LANE_COLOR"] # 0: none, 1: white, 2: yellow, 3: blue + right_lane_color = lane_info["RIGHT_LANE_COLOR"] + left_lane_info = left_lane_color * 10 + left_lane_type + right_lane_info = right_lane_color * 10 + right_lane_type + ret.leftLaneLine = left_lane_info + ret.rightLaneLine = right_lane_info + + # Manual Speed Limit Assist is a feature that replaces non-adaptive cruise control on EV CAN FD platforms. + # It limits the vehicle speed, overridable by pressing the accelerator past a certain point. + # The car will brake, but does not respect positive acceleration commands in this mode + # TODO: find this message on ICE & HYBRID cars + cruise control signals (if exists) + if self.CP.flags & HyundaiFlags.EV: + if self.manual_speed_limit_assist is not None: + #ret.cruiseState.nonAdaptive = cp.vl["MANUAL_SPEED_LIMIT_ASSIST"]["MSLA_ENABLED"] == 1 + ret.cruiseState.nonAdaptive = self.manual_speed_limit_assist["MSLA_ENABLED"] == 1 + + if self.LOCAL_TIME and self.time_zone != "UTC": + lt = cp.vl["LOCAL_TIME"] + y, m, d, H, M, S = int(lt["YEAR"]) + 2000, int(lt["MONTH"]), int(lt["DATE"]), int(lt["HOURS"]), int(lt["MINUTES"]), int(lt["SECONDS"]) + try: + dt_local = datetime(y, m, d, H, M, S, tzinfo=self.time_zone) + ret.datetime = int(dt_local.timestamp() * 1000) + except: + #print(f"Error parsing local time: {y}-{m}-{d} {H}:{M}:{S} in {self.time_zone}") + pass + + prev_cruise_buttons = self.cruise_buttons[-1] + #self.cruise_buttons.extend(cp.vl_all[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"]) + #carrot {{ + + if self.cruise_buttons_alt2 is not None: + if int(self.cruise_buttons_alt2.get("LFA_BTN", 0)) == 1: + cruise_button = [Buttons.LFA_BUTTON] + else: + v = int(self.cruise_buttons_alt2.get("CRUISE_BUTTONS", 0)) + cruise_button = [v if v < 5 else Buttons.NONE] + elif cp.vl[self.cruise_btns_msg_canfd]["LFA_BTN"]: + cruise_button = [Buttons.LFA_BUTTON] + else: + cruise_button = cp.vl_all[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"] + + self.cruise_buttons.extend(cruise_button) + # }} carrot + + + #if self.cruise_btns_msg_canfd in cp.vl: + # self.cruise_buttons_msg = copy.copy(cp.vl[self.cruise_btns_msg_canfd]) + """ + if self.cruise_btns_msg_canfd in cp.vl: #carrot + if not cp.vl[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"]: + pass + #print("empty cruise btns...") + else: + self.cruise_buttons_msg = copy.copy(cp.vl[self.cruise_btns_msg_canfd]) + """ + prev_main_buttons = self.main_buttons[-1] + #self.cruise_buttons.extend(cp.vl_all[self.cruise_btns_msg_canfd]["CRUISE_BUTTONS"]) + if self.cruise_buttons_alt2 is not None: + self.main_buttons.extend([1 if int(self.cruise_buttons_alt2.get("CRUISE_BUTTONS", 0)) == 8 else 0]) + else: + adaptive_main = cp.vl_all[self.cruise_btns_msg_canfd]["ADAPTIVE_CRUISE_MAIN_BTN"] + normal_main = cp.vl_all[self.cruise_btns_msg_canfd]["NORMAL_CRUISE_MAIN_BTN"] + self.main_buttons.extend(int(adaptive or normal) for adaptive, normal in zip(adaptive_main, normal_main, strict=True)) + if self.main_buttons[-1] != prev_main_buttons and not self.main_buttons[-1]: # and self.CP.openpilotLongitudinalControl: #carrot + self.main_enabled = not self.main_enabled + print("main_enabled = {}".format(self.main_enabled)) + self.buttons_counter = cp.vl[self.cruise_btns_msg_canfd]["COUNTER"] + ret.accFaulted = cp.vl["TCS"]["ACCEnable"] != 0 # 0 ACC CONTROL ENABLED, 1-3 ACC CONTROL DISABLED + + speed_conv = CV.KPH_TO_MS # if self.is_metric else CV.MPH_TO_MS + cluSpeed = cp.vl["CRUISE_BUTTONS_ALT"]["CLU_SPEED"] + ret.vEgoCluster = cluSpeed * speed_conv # MPHë‹¨ėœ„ė—ė„œë„ KPH로 ë‚˜ė˜¤ëŠ”ë“¯.. + vEgoClu, aEgoClu = self.update_clu_speed_kf(ret.vEgoCluster) + ret.vCluRatio = (ret.vEgo / vEgoClu) if (vEgoClu > 3. and ret.vEgo > 3.) else 1.0 + + self.update_speed_limit(ret, speed_limit_cam) + + paddle_button = self.paddle_button_prev + if self.cruise_btns_msg_canfd == "CRUISE_BUTTONS": + paddle_button = 1 if cp.vl["CRUISE_BUTTONS"]["LEFT_PADDLE"] == 1 else 2 if cp.vl["CRUISE_BUTTONS"]["RIGHT_PADDLE"] == 1 else 0 + elif self.gear_msg_canfd == "GEAR": + paddle_button = 1 if cp.vl["GEAR"]["LEFT_PADDLE"] == 1 else 2 if cp.vl["GEAR"]["RIGHT_PADDLE"] == 1 else 0 + + ret.buttonEvents = [*create_button_events(self.cruise_buttons[-1], prev_cruise_buttons, BUTTONS_DICT), + *create_button_events(paddle_button, self.paddle_button_prev, {1: ButtonType.paddleLeft, 2: ButtonType.paddleRight}), + *create_button_events(self.main_buttons[-1], prev_main_buttons, {1: ButtonType.mainCruise})] + + self.paddle_button_prev = paddle_button + + return ret + + def get_can_parsers_canfd(self, CP, CP_IQ=None): + msgs = [] + if not (CP.flags & HyundaiFlags.CANFD_ALT_BUTTONS): + # TODO: this can be removed once we add dynamic support to vl_all + msgs += [ + ("CRUISE_BUTTONS", 50) + ] + + CAN = CanBus(CP) + pt_parser = CANParser(DBC[CP.carFingerprint][Bus.pt], msgs, CAN.ECAN) + if CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230: + # Display-only while the signal is fleet-validated: checksum and freshness + # gate the value without making a counter/alive fault disable controls. + pt_parser._add_message(EV_MODE_STATUS_MSG, math.nan, ignore_counter=True) + + return { + Bus.pt: pt_parser, + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CAN.CAM), + Bus.alt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CAN.ACAN), + } + + def get_can_parsers(self, CP, CP_IQ=None): + if CP.flags & HyundaiFlags.CANFD: + return self.get_can_parsers_canfd(CP) + + return { + # EMS21 carries SCR_UREA_LEVEL on diesel platforms. NaN frequency makes + # it optional, so gasoline/EV platforms do not fail CAN validity. + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [("EMS21", math.nan), ("TPMS11", math.nan)], 0), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2), + } diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/fingerprints.py b/artifacts/package_runtime/iqdbc/car/hyundai/fingerprints.py new file mode 100644 index 000000000..602400202 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/fingerprints.py @@ -0,0 +1,1302 @@ +from iqdbc.car.structs import CarParams +from iqdbc.car.hyundai.values import CAR + +Ecu = CarParams.Ecu + +# The existence of SCC or RDR in the fwdRadar FW usually determines the radar's function, +# i.e. if it sends the SCC messages or if another ECU like the camera or ADAS Driving ECU does + + +FW_VERSIONS = { + CAR.HYUNDAI_AZERA_7TH_GEN: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00GN7_ RDR ----- 1.00 1.03 99110-N1000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00GN7 MFC AT KOR LHD 1.00 1.03 99211-N1000 230322', + ], + }, + CAR.HYUNDAI_AZERA_6TH_GEN: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00IG__ SCC F-CU- 1.00 1.00 99110-G8100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00IG MDPS C 1.00 1.02 56310G8510\x00 4IGSC103', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00IG MFC AT MES LHD 1.00 1.04 99211-G8100 200511', + ], + }, + CAR.HYUNDAI_AZERA_HEV_6TH_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.00 99211-G8000 180903', + b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.01 99211-G8000 181109', + b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.02 99211-G8100 191029', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00IG MDPS C 1.00 1.00 56310M9600\x00 4IHSC100', + b'\xf1\x00IG MDPS C 1.00 1.01 56310M9350\x00 4IH8C101', + b'\xf1\x00IG MDPS C 1.00 1.02 56310M9350\x00 4IH8C102', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00IGhe SCC FHCUP 1.00 1.00 99110-M9100 ', + b'\xf1\x00IGhe SCC FHCUP 1.00 1.01 99110-M9000 ', + b'\xf1\x00IGhe SCC FHCUP 1.00 1.02 99110-M9000 ', + ], + }, + CAR.HYUNDAI_GENESIS: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DH LKAS 1.1 -150210', + b'\xf1\x00DH LKAS 1.4 -140110', + b'\xf1\x00DH LKAS 1.5 -140425', + ], + }, + CAR.HYUNDAI_IONIQ: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ', + b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00AE MDPS C 1.00 1.03 56310/G2300 4AEHC103', + b'\xf1\x00AE MDPS C 1.00 1.05 56310/G2501 4AEHC105', + b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2301 4AEHC107', + b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2501 4AEHC107', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00AEH MFC AT EUR LHD 1.00 1.00 95740-G2400 180222', + b'\xf1\x00AEH MFC AT EUR LHD 1.00 1.00 95740-G7200 160418', + b'\xf1\x00AEH MFC AT USA LHD 1.00 1.00 95740-G2400 180222', + ], + }, + CAR.HYUNDAI_IONIQ_PHEV_2019: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ', + b'\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2501 4AEHC107', + b'\xf1\x00AE MDPS C 1.00 1.07 56310/G2551 4AEHC107', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00AEP MFC AT AUS RHD 1.00 1.00 95740-G2400 180222', + b'\xf1\x00AEP MFC AT USA LHD 1.00 1.00 95740-G2400 180222', + ], + }, + CAR.HYUNDAI_IONIQ_PHEV: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2200 ', + b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2600 ', + b'\xf1\x00AEhe SCC F-CUP 1.00 1.02 99110-G2100 ', + b'\xf1\x00AEhe SCC FHCUP 1.00 1.00 99110-G2600 ', + b'\xf1\x00AEhe SCC FHCUP 1.00 1.02 99110-G2100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2210 4APHC101', + b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2310 4APHC101', + b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2510 4APHC101', + b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2560 4APHC101', + b'\xf1\x00AE MDPS C 1.00 1.01 56310G2510\x00 4APHC101', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00AEP MFC AT EUR LHD 1.00 1.01 95740-G2600 190819', + b'\xf1\x00AEP MFC AT EUR RHD 1.00 1.01 95740-G2600 190819', + b'\xf1\x00AEP MFC AT USA LHD 1.00 1.00 95740-G2700 201027', + b'\xf1\x00AEP MFC AT USA LHD 1.00 1.01 95740-G2600 190819', + ], + }, + CAR.HYUNDAI_IONIQ_EV_2020: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00AEev SCC F-CUP 1.00 1.00 99110-G7200 ', + b'\xf1\x00AEev SCC F-CUP 1.00 1.00 99110-G7500 ', + b'\xf1\x00AEev SCC F-CUP 1.00 1.01 99110-G7000 ', + b'\xf1\x00AEev SCC F-CUP 1.00 1.01 99110-G7100 ', + b'\xf1\x00AEev SCC FHCUP 1.00 1.01 99110-G7100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00AE MDPS C 1.00 1.01 56310/G7310 4APEC101', + b'\xf1\x00AE MDPS C 1.00 1.01 56310/G7510 4APEC101', + b'\xf1\x00AE MDPS C 1.00 1.01 56310/G7560 4APEC101', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G2600 190730', + b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G2700 201027', + b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.01 95740-G2600 190819', + b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.03 95740-G2500 190516', + b'\xf1\x00AEE MFC AT EUR RHD 1.00 1.01 95740-G2600 190819', + b'\xf1\x00AEE MFC AT USA LHD 1.00 1.01 95740-G2600 190819', + ], + }, + CAR.HYUNDAI_IONIQ_EV_LTD: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00AEev SCC F-CUP 1.00 1.00 96400-G7000 ', + b'\xf1\x00AEev SCC F-CUP 1.00 1.00 96400-G7100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00AE MDPS C 1.00 1.02 56310G7300\x00 4AEEC102', + b'\xf1\x00AE MDPS C 1.00 1.03 56310/G7300 4AEEC103', + b'\xf1\x00AE MDPS C 1.00 1.03 56310G7300\x00 4AEEC103', + b'\xf1\x00AE MDPS C 1.00 1.04 56310/G7301 4AEEC104', + b'\xf1\x00AE MDPS C 1.00 1.04 56310/G7501 4AEEC104', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G2300 170703', + b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G2400 180222', + b'\xf1\x00AEE MFC AT EUR LHD 1.00 1.00 95740-G7200 160418', + b'\xf1\x00AEE MFC AT USA LHD 1.00 1.00 95740-G2400 180222', + ], + }, + CAR.HYUNDAI_IONIQ_HEV_2022: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00AEhe SCC F-CUP 1.00 1.00 99110-G2600 ', + b'\xf1\x00AEhe SCC FHCUP 1.00 1.00 99110-G2600 ', + b'\xf1\x00AEhe SCC FHCUP 1.00 1.02 99110-G2100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00AE MDPS C 1.00 1.01 56310/G2510 4APHC101', + b'\xf1\x00AE MDPS C 1.00 1.01 56310G2510\x00 4APHC101', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00AEH MFC AT USA LHD 1.00 1.00 95740-G2700 201027', + b'\xf1\x00AEH MFC AT USA LHD 1.00 1.01 95740-G2600 190819', + ], + }, + CAR.HYUNDAI_SONATA: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DN8_ SCC F-CU- 1.00 1.00 99110-L0000 ', + b'\xf1\x00DN8_ SCC F-CUP 1.00 1.00 99110-L0000 ', + b'\xf1\x00DN8_ SCC F-CUP 1.00 1.02 99110-L1000 ', + b'\xf1\x00DN8_ SCC FHCUP 1.00 1.00 99110-L0000 ', + b'\xf1\x00DN8_ SCC FHCUP 1.00 1.01 99110-L1000 ', + b'\xf1\x00DN8_ SCC FHCUP 1.00 1.02 99110-L1000 ', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00DN ESC \x01 102\x19\x04\x13 58910-L1300', + b'\xf1\x00DN ESC \x03 100 \x08\x01 58910-L0300', + b'\xf1\x00DN ESC \x06 104\x19\x08\x01 58910-L0100', + b'\xf1\x00DN ESC \x06 106 \x07\x01 58910-L0100', + b'\xf1\x00DN ESC \x06 107 \x07\x03 58910-L1300', + b'\xf1\x00DN ESC \x06 107"\x08\x07 58910-L0100', + b'\xf1\x00DN ESC \x07 104\x19\x08\x01 58910-L0100', + b'\xf1\x00DN ESC \x07 106 \x07\x01 58910-L0100', + b'\xf1\x00DN ESC \x07 107"\x08\x07 58910-L0100', + b'\xf1\x00DN ESC \x08 103\x19\x06\x01 58910-L1300', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DN8 MDPS C 1,00 1,01 56310L0010\x00 4DNAC101', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0200 4DNAC101', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0200 4DNAC102', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC102', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0010\x00 4DNAC101', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0200\x00 4DNAC102', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0210\x00 4DNAC101', + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310L0210\x00 4DNAC102', + b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L1010 4DNDC103', + b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L1030 4DNDC103', + b'\xf1\x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100', + b'\xf1\x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP101', + b'\xf1\x00DN8 MDPS R 1.00 1.02 57700-L1000 4DNDP105', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.02 99211-L1000 190422', + b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.04 99211-L1000 191016', + b'\xf1\x00DN8 MFC AT RUS LHD 1.00 1.03 99211-L1000 190705', + b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.00 99211-L0000 190716', + b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.01 99211-L0000 191016', + b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.03 99211-L0000 210603', + b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.05 99211-L1000 201109', + b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.06 99211-L1000 210325', + b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.07 99211-L1000 211223', + ], + }, + CAR.HYUNDAI_SONATA_LF: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00LF__ SCC F-CUP 1.00 1.00 96401-C2200 ', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00LF ESC \t 11 \x17\x01\x13 58920-C2610', + b'\xf1\x00LF ESC \x0c 11 \x17\x01\x13 58920-C2610', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00LFF LKAS AT USA LHD 1.00 1.01 95740-C1000 E51', + b'\xf1\x00LFF LKAS AT USA LHD 1.01 1.02 95740-C1000 E52', + ], + }, + CAR.HYUNDAI_SONATA_2024: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DN8_ RDR ----- 1.00 1.00 99110-L1800 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.01 99211-L1800 230512', + b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.01 99211-L1800 230512', + ], + }, + CAR.HYUNDAI_TUCSON: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00TL__ FCA F-CUP 1.00 1.01 99110-D3500 ', + b'\xf1\x00TL__ FCA F-CUP 1.00 1.02 99110-D3510 ', + b'\xf1\x00TL__ FCA FHCUP 1.00 1.02 99110-D3500 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00TL MFC AT KOR LHD 1.00 1.02 95895-D3800 180719', + b'\xf1\x00TL MFC AT KOR LHD 1.00 1.06 95895-D3800 190107', + b'\xf1\x00TL MFC AT USA LHD 1.00 1.06 95895-D3800 190107', + ], + }, + CAR.HYUNDAI_SANTA_FE: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00TM__ SCC F-CUP 1.00 1.00 99110-S1210 ', + b'\xf1\x00TM__ SCC F-CUP 1.00 1.01 99110-S2000 ', + b'\xf1\x00TM__ SCC F-CUP 1.00 1.02 99110-S2000 ', + b'\xf1\x00TM__ SCC F-CUP 1.00 1.03 99110-S2000 ', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00TM ESC \x02 100\x18\x030 58910-S2600', + b'\xf1\x00TM ESC \x02 102\x18\x07\x01 58910-S2600', + b'\xf1\x00TM ESC \x02 103\x18\x11\x05 58910-S2500', + b'\xf1\x00TM ESC \x02 103\x18\x11\x07 58910-S2600', + b'\xf1\x00TM ESC \x02 104\x19\x07\x07 58910-S2600', + b'\xf1\x00TM ESC \x03 103\x18\x11\x07 58910-S2600', + b'\xf1\x00TM ESC \x0c 103\x18\x11\x08 58910-S2650', + b'\xf1\x00TM ESC \r 100\x18\x031 58910-S2650', + b'\xf1\x00TM ESC \r 103\x18\x11\x08 58910-S2650', + b'\xf1\x00TM ESC \r 104\x19\x07\x08 58910-S2650', + b'\xf1\x00TM ESC \r 105\x19\x05# 58910-S1500', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00TM MDPS C 1.00 1.00 56340-S2000 8409', + b'\xf1\x00TM MDPS C 1.00 1.00 56340-S2000 8A12', + b'\xf1\x00TM MDPS C 1.00 1.01 56340-S2000 9129', + b'\xf1\x00TM MDPS R 1.00 1.02 57700-S1100 4TMDP102', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00TM MFC AT EUR LHD 1.00 1.01 99211-S1010 181207', + b'\xf1\x00TM MFC AT USA LHD 1.00 1.00 99211-S2000 180409', + ], + }, + CAR.HYUNDAI_SANTA_FE_2022: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00TM__ SCC F-CUP 1.00 1.00 99110-S1500 ', + b'\xf1\x00TM__ SCC F-CUP 1.00 1.01 99110-S1500 ', + b'\xf1\x00TM__ SCC FHCUP 1.00 1.00 99110-S1500 ', + b'\xf1\x00TM__ SCC FHCUP 1.00 1.01 99110-S1500 ', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00TM ESC \x01 102!\x04\x03 58910-S2DA0', + b'\xf1\x00TM ESC \x01 104"\x10\x07 58910-S2DA0', + b'\xf1\x00TM ESC \x02 101 \x08\x04 58910-S2GA0', + b'\xf1\x00TM ESC \x02 103"\x07\x08 58910-S2GA0', + b'\xf1\x00TM ESC \x03 101 \x08\x02 58910-S2DA0', + b'\xf1\x00TM ESC \x03 102!\x04\x03 58910-S2DA0', + b'\xf1\x00TM ESC \x03 103"\x07\x06 58910-S2DA0', + b'\xf1\x00TM ESC \x04 101 \x08\x04 58910-S2GA0', + b'\xf1\x00TM ESC \x04 102!\x04\x05 58910-S2GA0', + b'\xf1\x00TM ESC \x04 103"\x07\x08 58910-S2GA0', + b'\xf1\x00TM ESC \x1e 102 \x08\x08 58910-S1DA0', + b'\xf1\x00TM ESC 103!\x030 58910-S1MA0', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00TM MDPS C 1.00 1.01 56310-S1AB0 4TSDC101', + b'\xf1\x00TM MDPS C 1.00 1.01 56310-S1EB0 4TSDC101', + b'\xf1\x00TM MDPS C 1.00 1.02 56370-S2AA0 0B19', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00TM MFC AT EUR LHD 1.00 1.03 99211-S1500 210224', + b'\xf1\x00TM MFC AT MES LHD 1.00 1.05 99211-S1500 220126', + b'\xf1\x00TMA MFC AT MEX LHD 1.00 1.01 99211-S2500 210205', + b'\xf1\x00TMA MFC AT USA LHD 1.00 1.00 99211-S2500 200720', + b'\xf1\x00TMA MFC AT USA LHD 1.00 1.01 99211-S2500 210205', + b'\xf1\x00TMA MFC AT USA LHD 1.00 1.03 99211-S2500 220414', + ], + }, + CAR.HYUNDAI_SANTA_FE_HEV_2022: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ', + b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102', + b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102', + b'\xf1\x00TM MDPS C 1.00 1.02 56310-GA000 4TSHA100', + b'\xf1\x00TM MDPS C 1.00 1.02 56310GA000\x00 4TSHA100', + b'\xf1\x00TM MDPS R 1.00 1.05 57700-CL000 4TSHP105', + b'\xf1\x00TM MDPS R 1.00 1.06 57700-CL000 4TSHP106', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00TMA MFC AT USA LHD 1.00 1.03 99211-S2500 220414', + b'\xf1\x00TMH MFC AT EUR LHD 1.00 1.06 99211-S1500 220727', + b'\xf1\x00TMH MFC AT KOR LHD 1.00 1.06 99211-S1500 220727', + b'\xf1\x00TMH MFC AT USA LHD 1.00 1.03 99211-S1500 210224', + b'\xf1\x00TMH MFC AT USA LHD 1.00 1.05 99211-S1500 220126', + b'\xf1\x00TMH MFC AT USA LHD 1.00 1.06 99211-S1500 220727', + ], + }, + CAR.HYUNDAI_SANTA_FE_PHEV_2022: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00TMhe SCC F-CUP 1.00 1.00 99110-CL500 ', + b'\xf1\x00TMhe SCC FHCUP 1.00 1.00 99110-CL500 ', + b'\xf1\x00TMhe SCC FHCUP 1.00 1.01 99110-CL500 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102', + b'\xf1\x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102', + b'\xf1\x00TM MDPS C 1.00 1.02 56310CLEC0\x00 4TSHC102', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00TMP MFC AT USA LHD 1.00 1.03 99211-S1500 210224', + b'\xf1\x00TMP MFC AT USA LHD 1.00 1.05 99211-S1500 220126', + b'\xf1\x00TMP MFC AT USA LHD 1.00 1.06 99211-S1500 220727', + ], + }, + CAR.HYUNDAI_CUSTIN_1ST_GEN: { + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00KU ESC \x01 101!\x02\x03 58910-O3200', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00KU__ SCC F-CUP 1.00 1.01 99110-O3000 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00KU MDPS C 1.00 1.01 56310/O3100 4KUCC101', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00KU2 MFC AT CHN LHD 1.00 1.02 99211-O3000 220923', + ], + }, + CAR.KIA_STINGER: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00CK__ SCC F_CUP 1.00 1.01 96400-J5000 ', + b'\xf1\x00CK__ SCC F_CUP 1.00 1.01 96400-J5100 ', + b'\xf1\x00CK__ SCC F_CUP 1.00 1.02 96400-J5100 ', + b'\xf1\x00CK__ SCC F_CUP 1.00 1.03 96400-J5100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00CK MDPS R 1.00 1.04 57700-J5200 4C2CL104', + b'\xf1\x00CK MDPS R 1.00 1.04 57700-J5220 4C2VL104', + b'\xf1\x00CK MDPS R 1.00 1.04 57700-J5420 4C4VL104', + b'\xf1\x00CK MDPS R 1.00 1.06 57700-J5220 4C2VL106', + b'\xf1\x00CK MDPS R 1.00 1.06 57700-J5420 4C4VL106', + b'\xf1\x00CK MDPS R 1.00 1.07 57700-J5220 4C2VL107', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CK MFC AT EUR LHD 1.00 1.03 95740-J5000 170822', + b'\xf1\x00CK MFC AT USA LHD 1.00 1.03 95740-J5000 170822', + b'\xf1\x00CK MFC AT USA LHD 1.00 1.04 95740-J5000 180504', + ], + }, + CAR.KIA_STINGER_2022: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00CK__ SCC F-CUP 1.00 1.00 99110-J5500 ', + b'\xf1\x00CK__ SCC FHCUP 1.00 1.00 99110-J5500 ', + b'\xf1\x00CK__ SCC FHCUP 1.00 1.00 99110-J5600 ', + b'\xf1\x00CK__ SCC FHCUP 1.00 1.01 99110-J5100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503', + b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5320 4C2VL503', + b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503', + b'\xf1\x00CK MDPS R 1.00 5.03 57700-J5520 4C4VL503', + b'\xf1\x00CK MDPS R 1.00 5.04 57700-J5520 4C4VL504', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CK MFC AT AUS RHD 1.00 1.00 99211-J5500 210622', + b'\xf1\x00CK MFC AT KOR LHD 1.00 1.00 99211-J5500 210622', + b'\xf1\x00CK MFC AT USA LHD 1.00 1.00 99211-J5500 210622', + b'\xf1\x00CK MFC AT USA LHD 1.00 1.03 99211-J5000 201209', + ], + }, + CAR.HYUNDAI_PALISADE: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00LX2 SCC FHCUP 1.00 1.04 99110-S8100 ', + b'\xf1\x00LX2_ SCC F-CU- 1.00 1.05 99110-S8100 ', + b'\xf1\x00LX2_ SCC F-CUP 1.00 1.00 99110-S8110 ', + b'\xf1\x00LX2_ SCC F-CUP 1.00 1.04 99110-S8100 ', + b'\xf1\x00LX2_ SCC F-CUP 1.00 1.05 99110-S8100 ', + b'\xf1\x00LX2_ SCC FHCU- 1.00 1.05 99110-S8100 ', + b'\xf1\x00LX2_ SCC FHCUP 1.00 1.00 99110-S8110 ', + b'\xf1\x00LX2_ SCC FHCUP 1.00 1.03 99110-S8100 ', + b'\xf1\x00LX2_ SCC FHCUP 1.00 1.04 99110-S8100 ', + b'\xf1\x00LX2_ SCC FHCUP 1.00 1.05 99110-S8100 ', + b'\xf1\x00ON__ FCA FHCU- 1.00 1.00 99110-S9110 ', + b'\xf1\x00ON__ FCA FHCUP 1.00 1.00 99110-S9110 ', + b'\xf1\x00ON__ FCA FHCUP 1.00 1.01 99110-S9110 ', + b'\xf1\x00ON__ FCA FHCUP 1.00 1.02 99110-S9100 ', + b'\xf1\x00ON__ FCA FHCUP 1.00 1.03 99110-S9100 ', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00LX ESC \x01 103\x19\t\x10 58910-S8360', + b'\xf1\x00LX ESC \x01 1031\t\x10 58910-S8360', + b'\xf1\x00LX ESC \x01 104 \x10\x15 58910-S8350', + b'\xf1\x00LX ESC \x01 104 \x10\x16 58910-S8360', + b'\xf1\x00LX ESC \x0b 101\x19\x03\x17 58910-S8330', + b'\xf1\x00LX ESC \x0b 101\x19\x03 58910-S8360', + b'\xf1\x00LX ESC \x0b 102\x19\x05\x07 58910-S8330', + b'\xf1\x00LX ESC \x0b 103\x19\t\x07 58910-S8330', + b'\xf1\x00LX ESC \x0b 103\x19\t\t 58910-S8350', + b'\xf1\x00LX ESC \x0b 103\x19\t\x10 58910-S8360', + b'\xf1\x00LX ESC \x0b 104 \x10\x13 58910-S8330', + b'\xf1\x00LX ESC \x0b 104 \x10\x16 58910-S8360', + b'\xf1\x00ON ESC \x01 101\x19\t\x08 58910-S9360', + b'\xf1\x00ON ESC \x0b 100\x18\x12\x18 58910-S9360', + b'\xf1\x00ON ESC \x0b 101\x19\t\x05 58910-S9320', + b'\xf1\x00ON ESC \x0b 101\x19\t\x08 58910-S9360', + b'\xf1\x00ON ESC \x0b 103$\x04\x08 58910-S9360', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00LX2 MDPS C 1,00 1,03 56310-S8020 4LXDC103', + b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-S8000 4LXDC103', + b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103', + b'\xf1\x00LX2 MDPS C 1.00 1.03 56310-XX000 4LXDC103', + b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8000 4LXDC104', + b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104', + b'\xf1\x00LX2 MDPS C 1.00 1.04 56310-S8420 4LXDC104', + b'\xf1\x00LX2 MDPS R 1.00 1.02 56370-S8300 9318', + b'\xf1\x00ON MDPS C 1.00 1.00 56340-S9000 8B13', + b'\xf1\x00ON MDPS C 1.00 1.01 56340-S9000 9201', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00LX2 MFC AT KOR LHD 1.00 1.08 99211-S8100 200903', + b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.00 99211-S8110 210226', + b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.03 99211-S8100 190125', + b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.05 99211-S8100 190909', + b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.07 99211-S8100 200422', + b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.08 99211-S8100 200903', + b'\xf1\x00ON MFC AT USA LHD 1.00 1.01 99211-S9100 181105', + b'\xf1\x00ON MFC AT USA LHD 1.00 1.03 99211-S9100 200720', + b'\xf1\x00ON MFC AT USA LHD 1.00 1.04 99211-S9100 211227', + ], + }, + CAR.HYUNDAI_VELOSTER: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JS__ SCC H-CUP 1.00 1.02 95650-J3200 ', + b'\xf1\x00JS__ SCC HNCUP 1.00 1.02 95650-J3100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00JSL MDPS C 1.00 1.03 56340-J3000 8308', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JS LKAS AT KOR LHD 1.00 1.03 95740-J3000 K33', + b'\xf1\x00JS LKAS AT USA LHD 1.00 1.02 95740-J3000 K32', + ], + }, + CAR.GENESIS_G70: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00IK__ SCC F-CUP 1.00 1.01 96400-G9100 ', + b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00IK MDPS R 1.00 1.06 57700-G9420 4I4VL106', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00IK MFC AT USA LHD 1.00 1.01 95740-G9000 170920', + ], + }, + CAR.GENESIS_G70_2020: { + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00IK MDPS R 1.00 1.06 57700-G9220 4I2VL106', + b'\xf1\x00IK MDPS R 1.00 1.07 57700-G9220 4I2VL107', + b'\xf1\x00IK MDPS R 1.00 1.07 57700-G9420 4I4VL107', + b'\xf1\x00IK MDPS R 1.00 1.08 57700-G9200 4I2CL108', + b'\xf1\x00IK MDPS R 1.00 1.08 57700-G9420 4I4VL108', + b'\xf1\x00IK MDPS R 1.00 5.09 57700-G9520 4I4VL509', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00IK__ SCC F-CUP 1.00 1.01 96400-G9100 ', + b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 ', + b'\xf1\x00IK__ SCC F-CUP 1.00 1.02 96400-G9100 \xf1\xa01.02', + b'\xf1\x00IK__ SCC FHCUP 1.00 1.00 99110-G9300 ', + b'\xf1\x00IK__ SCC FHCUP 1.00 1.02 96400-G9000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00IK MFC AT KOR LHD 1.00 1.01 95740-G9000 170920', + b'\xf1\x00IK MFC AT USA LHD 1.00 1.01 95740-G9000 170920', + b'\xf1\x00IK MFC AT USA LHD 1.00 1.04 99211-G9000 220401', + ], + }, + CAR.GENESIS_G80: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DH__ SCC F-CU- 1.00 1.01 96400-B1110 ', + b'\xf1\x00DH__ SCC F-CUP 1.00 1.01 96400-B1120 ', + b'\xf1\x00DH__ SCC F-CUP 1.00 1.02 96400-B1120 ', + b'\xf1\x00DH__ SCC FHCUP 1.00 1.01 96400-B1110 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DH LKAS AT EUR LHD 1.01 1.01 95895-B1500 161014', + b'\xf1\x00DH LKAS AT KOR LHD 1.01 1.01 95895-B1500 161014', + b'\xf1\x00DH LKAS AT KOR LHD 1.01 1.02 95895-B1500 170810', + b'\xf1\x00DH LKAS AT USA LHD 1.01 1.01 95895-B1500 161014', + b'\xf1\x00DH LKAS AT USA LHD 1.01 1.02 95895-B1500 170810', + b'\xf1\x00DH LKAS AT USA LHD 1.01 1.03 95895-B1500 180713', + b'\xf1\x00DH LKAS AT USA LHD 1.01 1.04 95895-B1500 181213', + ], + }, + CAR.GENESIS_G80_2ND_GEN_FL: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00RG3_ SCC ----- 1.00 1.02 99110-T1120 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00RG3 MFC AT USA LHD 1.00 1.01 99211-T1200 230607', + ], + }, + CAR.GENESIS_G90: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00HI__ SCC F-CUP 1.00 1.01 96400-D2100 ', + b'\xf1\x00HI__ SCC FHCUP 1.00 1.02 99110-D2100 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00HI LKAS AT USA LHD 1.00 1.00 95895-D2020 160302', + b'\xf1\x00HI LKAS AT USA LHD 1.00 1.00 95895-D2030 170208', + b'\xf1\x00HI LKAS AT USA LHD 1.00 1.01 95895-D2030 170811', + b'\xf1\x00HI MFC AT USA LHD 1.00 1.03 99211-D2000 190831', + ], + }, + CAR.HYUNDAI_KONA: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00OS__ SCC F-CUP 1.00 1.00 95655-J9200 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00OS MDPS C 1.00 1.05 56310J9030\x00 4OSDC105', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00OS9 LKAS AT USA LHD 1.00 1.00 95740-J9300 g21', + ], + }, + CAR.KIA_CEED: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00CD__ SCC F-CUP 1.00 1.00 99110-J7500 ', + b'\xf1\x00CD__ SCC F-CUP 1.00 1.02 99110-J7000 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00CD MDPS C 1.00 1.06 56310-XX000 4CDEC106', + b'\xf1\x00CDT MDPS C 1.00 1.00 56310-XX000 4CDTC100', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CD LKAS AT EUR LHD 1.00 1.01 99211-J7000 B40', + b'\xf1\x00CDT LKAS AT EUR LHD 1.00 1.01 99211-J7210 521', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00CD ESC \x03 102\x18\x08\x05 58920-J7350', + b'\xf1\x00CD ESC \x0b 101 \x10\x03 58910-J7AC0', + ], + }, + CAR.KIA_FORTE: { + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00BD MDPS C 1.00 1.02 56310-XX000 4BD2C102', + b'\xf1\x00BD MDPS C 1.00 1.08 56310/M6300 4BDDC108', + b'\xf1\x00BD MDPS C 1.00 1.08 56310M6300\x00 4BDDC108', + b'\xf1\x00BDm MDPS C A.01 1.01 56310M7800\x00 4BPMC101', + b'\xf1\x00BDm MDPS C A.01 1.03 56310M7800\x00 4BPMC103', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00BD LKAS AT USA LHD 1.00 1.04 95740-M6000 J33', + b'\xf1\x00BDP LKAS AT USA LHD 1.00 1.05 99211-M6500 744', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00BDPE_SCC FHCUPC 1.00 1.04 99110-M6500\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'\xf1\x00BD__ SCC H-CUP 1.00 1.02 99110-M6000 ', + ], + }, + CAR.KIA_K5_2021: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DL3_ SCC F-CUP 1.00 1.03 99110-L2100 ', + b'\xf1\x00DL3_ SCC FHCUP 1.00 1.03 99110-L2000 ', + b'\xf1\x00DL3_ SCC FHCUP 1.00 1.03 99110-L2100 ', + b'\xf1\x00DL3_ SCC FHCUP 1.00 1.04 99110-L2100 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3110 4DLAC101', + b'\xf1\x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101', + b'\xf1\x00DL3 MDPS C 1.00 1.01 56310L3220\x00 4DLAC101', + b'\xf1\x00DL3 MDPS C 1.00 1.02 56310-L2220 4DLDC102', + b'\xf1\x00DL3 MDPS C 1.00 1.02 56310L3220\x00 4DLAC102', + b'\xf1\x00DL3 MDPS R 1.00 1.02 57700-L3000 4DLAP102', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DL3 MFC AT KOR LHD 1.00 1.04 99210-L2000 210527', + b'\xf1\x00DL3 MFC AT USA LHD 1.00 1.03 99210-L3000 200915', + b'\xf1\x00DL3 MFC AT USA LHD 1.00 1.04 99210-L3000 210208', + b'\xf1\x00DL3 MFC AT USA LHD 1.00 1.05 99210-L3000 211222', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00DL ESC \x01 104 \x07\x12 58910-L2200', + b'\xf1\x00DL ESC \x03 100 \x08\x02 58910-L3600', + b'\xf1\x00DL ESC \x06 101 \x04\x02 58910-L3200', + b'\xf1\x00DL ESC \x06 102 \x07\x02 58910-L3200', + b'\xf1\x00DL ESC \x06 103"\x08\x06 58910-L3200', + b'\xf1\x00DL ESC \t 100 \x06\x02 58910-L3800', + b'\xf1\x00DL ESC \t 101 \x07\x02 58910-L3800', + b'\xf1\x00DL ESC \t 102"\x08\x10 58910-L3800', + ], + }, + CAR.KIA_K5_HEV_2020: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DLhe SCC FHCUP 1.00 1.02 99110-L7000 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DL3 MDPS C 1.00 1.02 56310-L7000 4DLHC102', + b'\xf1\x00DL3 MDPS C 1.00 1.02 56310-L7220 4DLHC102', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.01 99210-L2000 191022', + b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.02 99210-L2000 200309', + b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.04 99210-L2000 210527', + ], + }, + CAR.KIA_K5_DL3_24_HEV: { # (DL3) + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DL3HMFC AT KOR LHD 1.00 1.02 99210-L2500 230911' + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DL3_ RDR ----- 1.00 1.01 99110-L2500 ', + ], + }, + CAR.HYUNDAI_KONA_EV: { + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00OS IEB \x01 212 \x11\x13 58520-K4000', + b'\xf1\x00OS IEB \x02 210 \x02\x14 58520-K4000', + b'\xf1\x00OS IEB \x02 212 \x11\x13 58520-K4000', + b'\xf1\x00OS IEB \x03 210 \x02\x14 58520-K4000', + b'\xf1\x00OS IEB \x03 211 \x04\x02 58520-K4000', + b'\xf1\x00OS IEB \x03 212 \x11\x13 58520-K4000', + b'\xf1\x00OS IEB \x04 212 \x11\x13 58520-K4000', + b'\xf1\x00OS IEB \r 105\x18\t\x18 58520-K4000', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00OE2 LKAS AT EUR LHD 1.00 1.00 95740-K4200 200', + b'\xf1\x00OSE LKAS AT AUS RHD 1.00 1.00 95740-K4300 W50', + b'\xf1\x00OSE LKAS AT EUR LHD 1.00 1.00 95740-K4100 W40', + b'\xf1\x00OSE LKAS AT EUR RHD 1.00 1.00 95740-K4100 W40', + b'\xf1\x00OSE LKAS AT KOR LHD 1.00 1.00 95740-K4100 W40', + b'\xf1\x00OSE LKAS AT KOR LHD 1.00 1.00 95740-K4300 W50', + b'\xf1\x00OSE LKAS AT USA LHD 1.00 1.00 95740-K4100 W40', + b'\xf1\x00OSE LKAS AT USA LHD 1.00 1.00 95740-K4300 W50', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00OS MDPS C 1.00 1.03 56310/K4550 4OEDC103', + b'\xf1\x00OS MDPS C 1.00 1.04 56310-XX000 4OEDC104', + b'\xf1\x00OS MDPS C 1.00 1.04 56310/K4550 4OEDC104', + b'\xf1\x00OS MDPS C 1.00 1.04 56310K4000\x00 4OEDC104', + b'\xf1\x00OS MDPS C 1.00 1.04 56310K4050\x00 4OEDC104', + b'\xf1\x00OS MDPS C 1.00 1.05 56310K4000\x00 4OEDC105', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00OSev SCC F-CUP 1.00 1.00 99110-K4000 ', + b'\xf1\x00OSev SCC F-CUP 1.00 1.00 99110-K4100 ', + b'\xf1\x00OSev SCC F-CUP 1.00 1.01 99110-K4000 ', + b'\xf1\x00OSev SCC FNCUP 1.00 1.01 99110-K4000 ', + ], + }, + CAR.HYUNDAI_KONA_EV_2022: { + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00OS IEB \x02 102"\x05\x16 58520-K4010', + b'\xf1\x00OS IEB \x03 101 \x11\x13 58520-K4010', + b'\xf1\x00OS IEB \x03 102"\x05\x16 58520-K4010', + b'\xf1\x00OS IEB \r 102"\x05\x16 58520-K4010', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00OSP LKA AT AUS RHD 1.00 1.04 99211-J9200 904', + b'\xf1\x00OSP LKA AT CND LHD 1.00 1.02 99211-J9110 802', + b'\xf1\x00OSP LKA AT EUR LHD 1.00 1.04 99211-J9200 904', + b'\xf1\x00OSP LKA AT EUR RHD 1.00 1.02 99211-J9110 802', + b'\xf1\x00OSP LKA AT EUR RHD 1.00 1.04 99211-J9200 904', + b'\xf1\x00OSP LKA AT USA LHD 1.00 1.04 99211-J9200 904', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00OSP MDPS C 1.00 1.02 56310-K4271 4OEPC102', + b'\xf1\x00OSP MDPS C 1.00 1.02 56310/K4271 4OEPC102', + b'\xf1\x00OSP MDPS C 1.00 1.02 56310/K4970 4OEPC102', + b'\xf1\x00OSP MDPS C 1.00 1.02 56310K4260\x00 4OEPC102', + b'\xf1\x00OSP MDPS C 1.00 1.02 56310K4261\x00 4OEPC102', + b'\xf1\x00OSP MDPS C 1.00 1.02 56310K4971\x00 4OEPC102', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00YB__ FCA ----- 1.00 1.01 99110-K4500 \x00\x00\x00', + ], + }, + CAR.HYUNDAI_KONA_EV_2ND_GEN: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00SXev RDR ----- 1.00 1.00 99110-BF000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00SX2EMFC AT KOR LHD 1.00 1.00 99211-BF000 230410', + ], + }, + CAR.HYUNDAI_KONA_HEV_2ND_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00SX2HMFC AT EUR RHD 1.00 1.04 99211-BE000 231010', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00SX2_ RDR ----- 1.00 1.02 99110-BE500 ', + ], + }, + CAR.KIA_NIRO_EV: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4000 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4100 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4500 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.00 99110-Q4600 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.02 96400-Q4000 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.02 96400-Q4100 ', + b'\xf1\x00DEev SCC F-CUP 1.00 1.03 96400-Q4100 ', + b'\xf1\x00DEev SCC FHCUP 1.00 1.00 99110-Q4600 ', + b'\xf1\x00DEev SCC FHCUP 1.00 1.03 96400-Q4000 ', + b'\xf1\x00DEev SCC FNCUP 1.00 1.00 99110-Q4600 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DE MDPS C 1.00 1.04 56310Q4100\x00 4DEEC104', + b'\xf1\x00DE MDPS C 1.00 1.05 56310Q4000\x00 4DEEC105', + b'\xf1\x00DE MDPS C 1.00 1.05 56310Q4100\x00 4DEEC105', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DEE MFC AT EUR LHD 1.00 1.00 99211-Q4000 191211', + b'\xf1\x00DEE MFC AT EUR LHD 1.00 1.00 99211-Q4100 200706', + b'\xf1\x00DEE MFC AT EUR LHD 1.00 1.03 95740-Q4000 180821', + b'\xf1\x00DEE MFC AT KOR LHD 1.00 1.02 95740-Q4000 180705', + b'\xf1\x00DEE MFC AT KOR LHD 1.00 1.03 95740-Q4000 180821', + b'\xf1\x00DEE MFC AT USA LHD 1.00 1.00 99211-Q4000 191211', + b'\xf1\x00DEE MFC AT USA LHD 1.00 1.01 99211-Q4500 210428', + b'\xf1\x00DEE MFC AT USA LHD 1.00 1.02 99211-Q4100 201218', + b'\xf1\x00DEE MFC AT USA LHD 1.00 1.03 95740-Q4000 180821', + ], + }, + CAR.KIA_NIRO_EV_2ND_GEN: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00SG2_ RDR ----- 1.00 1.01 99110-AT000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00SG2EMFC AT EUR LHD 1.01 1.09 99211-AT000 220801', + b'\xf1\x00SG2EMFC AT USA LHD 1.01 1.09 99211-AT000 220801', + ], + }, + CAR.KIA_NIRO_PHEV: { + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101', + b'\xf1\x00DE MDPS C 1.00 1.09 56310G5301\x00 4DEHC109', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DEH MFC AT USA LHD 1.00 1.00 95740-G5010 170117', + b'\xf1\x00DEP MFC AT USA LHD 1.00 1.00 95740-G5010 170117', + b'\xf1\x00DEP MFC AT USA LHD 1.00 1.01 95740-G5010 170424', + b'\xf1\x00DEP MFC AT USA LHD 1.00 1.05 99211-G5000 190826', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DEhe SCC F-CUP 1.00 1.02 99110-G5100 ', + b'\xf1\x00DEhe SCC FHCUP 1.00 1.02 99110-G5100 ', + b'\xf1\x00DEhe SCC H-CUP 1.01 1.02 96400-G5100 ', + ], + }, + CAR.KIA_NIRO_PHEV_2022: { + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DEP MFC AT USA LHD 1.00 1.00 99211-G5500 210428', + b'\xf1\x00DEP MFC AT USA LHD 1.00 1.06 99211-G5000 201028', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DEhe SCC F-CUP 1.00 1.00 99110-G5600 ', + b'\xf1\x00DEhe SCC FHCUP 1.00 1.00 99110-G5600 ', + ], + }, + CAR.KIA_NIRO_HEV_2021: { + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DE MDPS C 1.00 1.01 56310G5520\x00 4DEPC101', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DEH MFC AT KOR LHD 1.00 1.04 99211-G5000 190516', + b'\xf1\x00DEH MFC AT USA LHD 1.00 1.00 99211-G5500 210428', + b'\xf1\x00DEH MFC AT USA LHD 1.00 1.06 99211-G5000 201028', + b'\xf1\x00DEH MFC AT USA LHD 1.00 1.07 99211-G5000 201221', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DEhe SCC FHCUP 1.00 1.00 99110-G5600 ', + b'\xf1\x00DEhe SCC FHCUP 1.00 1.01 99110-G5000 ', + ], + }, + CAR.KIA_SELTOS: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00SP2_ SCC FHCUP 1.01 1.05 99110-Q5100 ', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00SP ESC \x07 101\x19\t\x05 58910-Q5450', + b'\xf1\x00SP ESC \t 101\x19\t\x05 58910-Q5450', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00SP2 MDPS C 1.00 1.04 56300Q5200 ', + b'\xf1\x00SP2 MDPS C 1.01 1.05 56300Q5200 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00SP2 MFC AT USA LHD 1.00 1.04 99210-Q5000 191114', + b'\xf1\x00SP2 MFC AT USA LHD 1.00 1.05 99210-Q5000 201012', + ], + }, + CAR.KIA_OPTIMA_G4: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JF__ SCC F-CUP 1.00 1.00 96400-D4100 ', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00JF ESC \t 17 \x16\x06# 58920-D4180', + b'\xf1\x00JF ESC \x0f 16 \x16\x06\x17 58920-D5080', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JFWGN LDWS AT USA LHD 1.00 1.02 95895-D4100 G21', + b'\xf1\x00JFWGN LKAS AT EUR LHD 1.00 1.01 95895-D4100 G20', + ], + }, + CAR.KIA_OPTIMA_G4_FL: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JF__ SCC F-CUP 1.00 1.00 96400-D4110 ', + ], + (Ecu.abs, 0x7d1, None): [ + b"\xf1\x00JF ESC \t 11 \x18\x03' 58920-D5260", + b'\xf1\x00JF ESC \x0b 11 \x18\x030 58920-D5180', + b'\xf1\x00JF ESC \x0c 11 \x18\x030 58920-D5180', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JFA LKAS AT USA LHD 1.00 1.00 95895-D5001 h32', + b'\xf1\x00JFA LKAS AT USA LHD 1.00 1.00 95895-D5100 h32', + ], + }, + CAR.KIA_OPTIMA_H: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JFhe SCC FNCUP 1.00 1.00 96400-A8000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JFP LKAS AT EUR LHD 1.00 1.03 95895-A8100 160711', + ], + }, + CAR.KIA_OPTIMA_H_G4_FL: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JFhe SCC FHCUP 1.00 1.01 99110-A8500 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JFH MFC AT KOR LHD 1.00 1.01 95895-A8200 180323', + ], + }, + CAR.HYUNDAI_ELANTRA: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00AD LKAS AT USA LHD 1.01 1.01 95895-F2000 251', + b'\xf1\x00ADP LKAS AT USA LHD 1.00 1.03 99211-F2000 X31', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00AD ESC \x11 11 \x18\x05\x06 58910-F2840', + b'\xf1\x00AD ESC \x11 12 \x15\t\t 58920-F2810', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00AD__ SCC H-CUP 1.00 1.00 99110-F2100 ', + b'\xf1\x00AD__ SCC H-CUP 1.00 1.01 96400-F2100 ', + ], + }, + CAR.HYUNDAI_ELANTRA_GT_I30: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00PD LKAS AT KOR LHD 1.00 1.02 95740-G3000 A51', + b'\xf1\x00PD LKAS AT USA LHD 1.00 1.02 95740-G3000 A51', + b'\xf1\x00PD LKAS AT USA LHD 1.01 1.01 95740-G3100 A54', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00PD MDPS C 1.00 1.00 56310G3300\x00 4PDDC100', + b'\xf1\x00PD MDPS C 1.00 1.03 56310/G3300 4PDDC103', + b'\xf1\x00PD MDPS C 1.00 1.04 56310/G3300 4PDDC104', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00PD ESC \t 104\x18\t\x03 58920-G3350', + b'\xf1\x00PD ESC \x0b 103\x17\x110 58920-G3350', + b'\xf1\x00PD ESC \x0b 104\x18\t\x03 58920-G3350', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00PD__ SCC F-CUP 1.00 1.00 96400-G3300 ', + b'\xf1\x00PD__ SCC F-CUP 1.01 1.00 96400-G3100 ', + b'\xf1\x00PD__ SCC FNCUP 1.01 1.00 96400-G3000 ', + ], + }, + CAR.HYUNDAI_ELANTRA_2021: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00CN7_ SCC F-CUP 1.00 1.01 99110-AA000 ', + b'\xf1\x00CN7_ SCC FHCUP 1.00 1.01 99110-AA000 ', + b'\xf1\x00CN7_ SCC FNCUP 1.00 1.01 99110-AA000 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00CN7 MDPS C 1.00 1.06 56310/AA050 4CNDC106', + b'\xf1\x00CN7 MDPS C 1.00 1.06 56310/AA070 4CNDC106', + b'\xf1\x00CN7 MDPS C 1.00 1.06 56310AA050\x00 4CNDC106', + b'\xf1\x00CN7 MDPS C 1.00 1.07 56310AA050\x00 4CNDC107', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.00 99210-AB000 200819', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.01 99210-AB000 210205', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.02 99210-AB000 220111', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.03 99210-AA000 200819', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.03 99210-AB000 220426', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.06 99210-AA000 220111', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.07 99210-AA000 220426', + b'\xf1\x00CN7 MFC AT USA LHD 1.00 1.08 99210-AA000 220728', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00CN ESC \t 101 \x10\x03 58910-AB800', + b'\xf1\x00CN ESC \t 104 \x08\x03 58910-AA800', + b'\xf1\x00CN ESC \t 105 \x10\x03 58910-AA800', + ], + }, + CAR.HYUNDAI_ELANTRA_HEV_2021: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.03 99210-AA000 200819', + b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.05 99210-AA000 210930', + b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.07 99210-AA000 220426', + b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.08 99210-AA000 220728', + b'\xf1\x00CN7HMFC AT USA LHD 1.00 1.09 99210-AA000 221108', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00CNhe SCC FHCUP 1.00 1.01 99110-BY000 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00CN7 MDPS C 1.00 1.02 56310/BY050 4CNHC102', + b'\xf1\x00CN7 MDPS C 1.00 1.03 56310/BY050 4CNHC103', + b'\xf1\x00CN7 MDPS C 1.00 1.03 56310BY050\x00 4CNHC103', + b'\xf1\x00CN7 MDPS C 1.00 1.03 56310BY0500 4CNHC103', + b'\xf1\x00CN7 MDPS C 1.00 1.04 56310BY050\x00 4CNHC104', + ], + }, + CAR.HYUNDAI_KONA_HEV: { + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00OS IEB \x01 104 \x11 58520-CM000', + b'\xf1\x00OS IEB \x03 104 \x11 58520-CM000', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00OShe SCC F-CUP 1.00 1.01 99110-CM000 ', + b'\xf1\x00OShe SCC FNCUP 1.00 1.01 99110-CM000 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00OS MDPS C 1.00 1.00 56310CM020\x00 4OHDC100', + b'\xf1\x00OS MDPS C 1.00 1.00 56310CM030\x00 4OHDC100', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00OSH LKAS AT EUR LHD 1.00 1.01 95740-CM000 l31', + b'\xf1\x00OSH LKAS AT KOR LHD 1.00 1.01 95740-CM000 l31', + ], + }, + CAR.HYUNDAI_SONATA_HYBRID: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00DNhe SCC F-CUP 1.00 1.02 99110-L5000 ', + b'\xf1\x00DNhe SCC FHCUP 1.00 1.00 99110-L5000 ', + b'\xf1\x00DNhe SCC FHCUP 1.00 1.02 99110-L5000 ', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00DN8 MDPS C 1.00 1.01 56310-L5000 4DNHC101', + b'\xf1\x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102', + b'\xf1\x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102', + b'\xf1\x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103', + b'\xf1\x00DN8 MDPS C 1.00 1.03 56310L5450\x00 4DNHC104', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DN8HMFC AT KOR LHD 1.00 1.03 99211-L1000 190705', + b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.04 99211-L1000 191016', + b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.05 99211-L1000 201109', + b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.06 99211-L1000 210325', + b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.07 99211-L1000 211223', + ], + }, + CAR.KIA_SORENTO: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00UMP LKAS AT KOR LHD 1.00 1.00 95740-C5550 S30', + b'\xf1\x00UMP LKAS AT USA LHD 1.00 1.00 95740-C6550 d00', + b'\xf1\x00UMP LKAS AT USA LHD 1.01 1.01 95740-C6550 d01', + ], + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00UM ESC \x02 12 \x18\x05\x05 58910-C6300', + b'\xf1\x00UM ESC \x0c 12 \x18\x05\x06 58910-C6330', + b'\xf1\x00UM ESC \x13 12 \x17\x07\x05 58910-C5320', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00UM__ SCC F-CUP 1.00 1.00 96400-C5500 ', + b'\xf1\x00UM__ SCC F-CUP 1.00 1.00 96400-C6500 ', + ], + }, + CAR.KIA_EV6: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00CV1_ RDR ----- 1.00 1.01 99110-CV000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CV1 MFC AT EUR LHD 1.00 1.05 99210-CV000 211027', + b'\xf1\x00CV1 MFC AT EUR LHD 1.00 1.06 99210-CV000 220328', + b'\xf1\x00CV1 MFC AT EUR RHD 1.00 1.00 99210-CV100 220630', + b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.00 99210-CV100 220630', + b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.00 99210-CV200 230510', + b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.04 99210-CV000 210823', + b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.05 99210-CV000 211027', + b'\xf1\x00CV1 MFC AT KOR LHD 1.00 1.06 99210-CV000 220328', + b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.00 99210-CV100 220630', + b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.00 99210-CV200 230510', + b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.05 99210-CV000 211027', + b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.06 99210-CV000 220328', + ], + }, + CAR.KIA_EV6_PE: { # (CV1) + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00CV__ RDR ----- 1.00 1.01 99110-CV500 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CV MFC AT KOR LHD 1.00 1.01 99210-CV500 240405', + ], + }, + CAR.HYUNDAI_IONIQ_5: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00NE1_ RDR ----- 1.00 1.00 99110-GI000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00NE1 MFC AT CAN LHD 1.00 1.01 99211-GI010 211007', + b'\xf1\x00NE1 MFC AT CAN LHD 1.00 1.05 99211-GI010 220614', + b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.00 99211-GI100 230915', + b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.01 99211-GI010 211007', + b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.01 99211-GI100 240110', + b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.03 99211-GI010 220401', + b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.06 99211-GI000 210813', + b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.06 99211-GI010 230110', + b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.01 99211-GI010 211007', + b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.01 99211-GI100 240110', + b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.02 99211-GI010 211206', + b'\xf1\x00NE1 MFC AT IND RHD 1.00 1.07 99211-GI010 230620', + b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.00 99211-GI020 230719', + b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.01 99211-GI010 211007', + b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.05 99211-GI010 220614', + b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.00 99211-GI020 230719', + b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.00 99211-GI100 230915', + b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.01 99211-GI010 211007', + b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.02 99211-GI010 211206', + b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.03 99211-GI010 220401', + b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.05 99211-GI010 220614', + b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.06 99211-GI010 230110', + ], + }, + CAR.HYUNDAI_IONIQ_5_PE: { # (NE1) + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00NE__ RDR ----- 1.00 1.00 99110-GI500 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00NE MFC AT KOR LHD 1.00 1.02 99211-GI500 240221', + ], + }, + CAR.HYUNDAI_IONIQ_5_N: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00NE1N RDR ----- 1.00 1.00 99110-NI000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00NE1NMFC AT KOR LHD 1.00 1.04 99211-NI000 231219', + b'\xf1\x00NE1NMFC AT USA LHD 1.00 1.04 99211-NI000 231219', + ], + }, + CAR.HYUNDAI_IONIQ_6: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00CE__ RDR ----- 1.00 1.01 99110-KL000 ', + b'\xf1\x00CE__ RDR ----- 1.00 1.02 99110-KL000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CE MFC AT CAN LHD 1.00 1.04 99211-KL000 221213', + b'\xf1\x00CE MFC AT EUR LHD 1.00 1.03 99211-KL000 221011', + b'\xf1\x00CE MFC AT EUR LHD 1.00 1.04 99211-KL000 221213', + b'\xf1\x00CE MFC AT USA LHD 1.00 1.04 99211-KL000 221213', + b'\xf1\x00CE MFC AT USA LHD 1.00 1.06 99211-KL000 230915', + ], + }, + CAR.HYUNDAI_IONIQ_9: { + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00MEev RDR ----- 1.00 1.00 99110-GO000 ', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00ME MFC AT KOR LHD 1.00 1.00 99211-GO000 241007', + ], + }, + CAR.HYUNDAI_TUCSON_4TH_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00NX4 FR_CMR AT CAN LHD 1.00 1.00 99211-N9260 14Y', + b'\xf1\x00NX4 FR_CMR AT CAN LHD 1.00 1.01 99211-N9100 14A', + b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 1.00 99211-N9220 14K', + b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 2.02 99211-N9000 14E', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9210 14G', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9220 14K', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9240 14Q', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9250 14W', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9260 14Y', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.01 99211-N9100 14A', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.01 99211-N9240 14T', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00NX4__ 1.00 1.00 99110-N9100 ', + b'\xf1\x00NX4__ 1.00 1.01 99110-N9000 ', + b'\xf1\x00NX4__ 1.00 1.02 99110-N9000 ', + b'\xf1\x00NX4__ 1.01 1.00 99110-N9100 ', + ], + }, + CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW000 14M', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW010 14X', + b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW020 14Z', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00NX4__ 1.00 1.00 99110-K5000 ', + b'\xf1\x00NX4__ 1.01 1.00 99110-K5000 ', + ], + }, + CAR.KIA_SPORTAGE_5TH_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00NQ5 FR_CMR AT AUS RHD 1.00 1.00 99211-P1040 663', + b'\xf1\x00NQ5 FR_CMR AT EUR LHD 1.00 1.00 99211-P1040 663', + b'\xf1\x00NQ5 FR_CMR AT GEN LHD 1.00 1.00 99211-P1060 665', + b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1030 662', + b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1040 663', + b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1060 665', + b'\xf1\x00NQ5 FR_CMR AT USA LHD 1.00 1.00 99211-P1070 690', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00NQ5__ 1.00 1.02 99110-P1000 ', + b'\xf1\x00NQ5__ 1.00 1.03 99110-CH000 ', + b'\xf1\x00NQ5__ 1.00 1.03 99110-P1000 ', + b'\xf1\x00NQ5__ 1.01 1.03 99110-CH000 ', + b'\xf1\x00NQ5__ 1.01 1.03 99110-P1000 ', + ], + }, + CAR.GENESIS_GV70_1ST_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JK1 MFC AT CAN LHD 1.00 1.02 99211-IY000 230627', + b'\xf1\x00JK1 MFC AT USA LHD 1.00 1.01 99211-AR200 220125', + b'\xf1\x00JK1 MFC AT USA LHD 1.00 1.01 99211-AR300 220125', + b'\xf1\x00JK1 MFC AT USA LHD 1.00 1.04 99211-AR000 210204', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JK1_ SCC FHCUP 1.00 1.00 99110-AR200 ', + b'\xf1\x00JK1_ SCC FHCUP 1.00 1.00 99110-AR300 ', + b'\xf1\x00JK1_ SCC FHCUP 1.00 1.00 99110-IY000 ', + b'\xf1\x00JK1_ SCC FHCUP 1.00 1.02 99110-AR000 ', + ], + }, + CAR.GENESIS_GV70_ELECTRIFIED_1ST_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JK1EMFC AT AUS RHD 1.00 1.01 99211-DS100 220125', + b'\xf1\x00JK1EMFC AT USA LHD 1.00 1.00 99211-IT100 220919', + b'\xf1\x00JK1EMFC AT USA LHD 1.00 1.01 99211-IT100 230628', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JKev SCC ----- 1.00 1.01 99110-DS000 ', + ], + }, + + CAR.HYUNDAI_NEXO_1ST_GEN: { + (Ecu.abs, 0x7d1, None): [ + b'\xf1\x00FE IEB \x01 312 \x11\x13 58520-M5000', + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00FE MFC AT KOR LHD 1.00 1.00 99211-M5100 201218', + b'\xf1\x00FE MFC AT KOR LHD 1.00 1.02 99211-M5100 220405', + ], + (Ecu.eps, 0x7d4, None): [ + b'\xf1\x00FE MDPS C 1.00 1.05 56340-M5000 9903', + b'\xf1\x00FE MDPS C 1.00 1.06 56340-M5000 1625', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00FE__ SCC FHCUP 1.00 1.05 99110-M5000 ', + ], + }, + + CAR.GENESIS_GV60_EV_1ST_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JW1 MFC AT AUS RHD 1.00 1.03 99211-CU100 221118', + b'\xf1\x00JW1 MFC AT USA LHD 1.00 1.02 99211-CU000 211215', + b'\xf1\x00JW1 MFC AT USA LHD 1.00 1.02 99211-CU100 211215', + b'\xf1\x00JW1 MFC AT USA LHD 1.00 1.03 99211-CU000 221118', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JW1_ RDR ----- 1.00 1.00 99110-CU000 ', + ], + }, + CAR.KIA_SORENTO_4TH_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00MQ4 MFC AT USA LHD 1.00 1.00 99210-R5100 221019', + b'\xf1\x00MQ4 MFC AT USA LHD 1.00 1.03 99210-R5000 200903', + b'\xf1\x00MQ4 MFC AT USA LHD 1.00 1.05 99210-R5000 210623', + b'\xf1\x00MQ4 MFC AT USA LHD 1.00 1.06 99210-R5000 211216', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00MQ4_ SCC F-CUP 1.00 1.06 99110-P2000 ', + b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.00 99110-R5000 ', + b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.06 99110-P2000 ', + b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.08 99110-P2000 ', + ], + }, + CAR.KIA_SORENTO_HEV_4TH_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00MQ4HMFC AT KOR LHD 1.00 1.04 99210-P2000 200330', + b'\xf1\x00MQ4HMFC AT KOR LHD 1.00 1.12 99210-P2000 230331', + b'\xf1\x00MQ4HMFC AT USA LHD 1.00 1.10 99210-P2000 210406', + b'\xf1\x00MQ4HMFC AT USA LHD 1.00 1.11 99210-P2000 211217', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00MQhe SCC FHCUP 1.00 1.04 99110-P4000 ', + b'\xf1\x00MQhe SCC FHCUP 1.00 1.06 99110-P4000 ', + b'\xf1\x00MQhe SCC FHCUP 1.00 1.07 99110-P4000 ', + ], + }, + CAR.KIA_NIRO_HEV_2ND_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00SG2HMFC AT USA LHD 1.01 1.08 99211-AT000 220531', + b'\xf1\x00SG2HMFC AT USA LHD 1.01 1.09 99211-AT000 220801', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00SG2_ RDR ----- 1.00 1.01 99110-AT000 ', + ], + }, + CAR.GENESIS_GV80: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00JX1 MFC AT USA LHD 1.00 1.02 99211-T6110 220513', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00JX1_ SCC FHCUP 1.00 1.01 99110-T6100 ', + ], + }, + CAR.KIA_CARNIVAL_4TH_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00KA4 MFC AT EUR LHD 1.00 1.06 99210-R0000 220221', + b'\xf1\x00KA4 MFC AT KOR LHD 1.00 1.05 99210-R0000 201221', + b'\xf1\x00KA4 MFC AT KOR LHD 1.00 1.06 99210-R0000 220221', + b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.00 99210-R0100 230105', + b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.01 99210-R0100 230710', + b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.05 99210-R0000 201221', + b'\xf1\x00KA4 MFC AT USA LHD 1.00 1.06 99210-R0000 220221', + b'\xf1\x00KA4CMFC AT CHN LHD 1.00 1.01 99211-I4000 210525', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00KA4_ SCC F-CUP 1.00 1.03 99110-R0000 ', + b'\xf1\x00KA4_ SCC FHCUP 1.00 1.00 99110-R0100 ', + b'\xf1\x00KA4_ SCC FHCUP 1.00 1.02 99110-R0000 ', + b'\xf1\x00KA4_ SCC FHCUP 1.00 1.03 99110-R0000 ', + b'\xf1\x00KA4c SCC FHCUP 1.00 1.01 99110-I4000 ', + ], + }, + CAR.KIA_K8_HEV_1ST_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00GL3HMFC AT KOR LHD 1.00 1.03 99211-L8000 210907', + b'\xf1\x00GL3HMFC AT KOR LHD 1.00 1.04 99211-L8000 230207', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00GL3_ RDR ----- 1.00 1.02 99110-L8000 ', + ], + }, + CAR.HYUNDAI_STARIA_4TH_GEN: { + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00US4 MFC AT KOR LHD 1.00 1.06 99211-CG000 230524', + ], + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00US4_ RDR ----- 1.00 1.00 99110-CG000 ', + ], + }, + CAR.KIA_EV9: { # (MV) + (Ecu.fwdRadar, 0x7d0, None): [ + b'\xf1\x00MV__ RDR ----- 1.00 1.02 99110-DO700 ', + b'\xf1\x00MV__ RDR ----- 1.00 1.02 99110-DO000 ' + ], + (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00MV MFC AT KOR LHD 1.00 1.01 99211-DO000 230419', + b'\xf1\x00MV MFC AT USA LHD 1.00 1.02 99211-DO000 230616', + b'\xf1\x00MV MFC AT EUR LHD 1.00 1.02 99211-DO000 230616', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/hyundaican.py b/artifacts/package_runtime/iqdbc/car/hyundai/hyundaican.py new file mode 100644 index 000000000..f021118c5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/hyundaican.py @@ -0,0 +1,403 @@ +import copy +import crcmod +from iqdbc.car.hyundai.values import CAR, HyundaiFlags + +hyundai_checksum = crcmod.mkCrcFun(0x11D, initCrc=0xFD, rev=False, xorOut=0xdf) + +def suppress_casper_ev_fca11_fault(values): + # CASPER EV can report transient FCA faults during camera-SCC handoff. + # Keep the copied FCA11 frame non-faulting without changing other cars. + fca_fault = values["FCA_Failinfo"] != 0 or values["FCA_Status"] == 3 + values["FCA_Failinfo"] = 0 + + if fca_fault: + values["FCA_Status"] = 2 + values["CF_VSM_Prefill"] = 0 + values["CF_VSM_HBACmd"] = 0 + values["CF_VSM_Warn"] = 0 + values["CF_VSM_BeltCmd"] = 0 + values["CR_VSM_DecCmd"] = 0 + values["FCA_CmdAct"] = 0 + values["FCA_StopReq"] = 0 + values["CF_VSM_DecCmdAct"] = 0 + + return values + +def create_lkas11(packer, frame, CP, apply_torque, steer_req, + torque_fault, lkas11, sys_warning, sys_state, enabled, + left_lane, right_lane, + left_lane_depart, right_lane_depart, is_ldws_car): + + values = {s: lkas11[s] for s in [ + "CF_Lkas_LdwsActivemode", + "CF_Lkas_LdwsSysState", + "CF_Lkas_SysWarning", + "CF_Lkas_LdwsLHWarning", + "CF_Lkas_LdwsRHWarning", + "CF_Lkas_HbaLamp", + "CF_Lkas_FcwBasReq", + "CF_Lkas_HbaSysState", + "CF_Lkas_FcwOpt", + "CF_Lkas_HbaOpt", + "CF_Lkas_FcwSysState", + "CF_Lkas_FcwCollisionWarning", + "CF_Lkas_FusionState", + "CF_Lkas_FcwOpt_USM", + "CF_Lkas_LdwsOpt_USM", + ]} + values["CF_Lkas_LdwsSysState"] = sys_state + values["CF_Lkas_SysWarning"] = 0 # 3 if sys_warning else 0 + values["CF_Lkas_LdwsLHWarning"] = left_lane_depart + values["CF_Lkas_LdwsRHWarning"] = right_lane_depart + values["CR_Lkas_StrToqReq"] = apply_torque + values["CF_Lkas_ActToi"] = steer_req + values["CF_Lkas_ToiFlt"] = torque_fault # seems to allow actuation on CR_Lkas_StrToqReq + values["CF_Lkas_MsgCount"] = frame % 0x10 + + + if CP.flags & HyundaiFlags.SEND_LFA.value or CP.carFingerprint in (CAR.HYUNDAI_SANTA_FE): + values["CF_Lkas_LdwsActivemode"] = int(left_lane) + (int(right_lane) << 1) + values["CF_Lkas_LdwsOpt_USM"] = 0 if CP.carFingerprint in (CAR.KIA_RAY_EV) else 2 + + # FcwOpt_USM 5 = Orange blinking car + lanes + # FcwOpt_USM 4 = Orange car + lanes + # FcwOpt_USM 3 = Green blinking car + lanes + # FcwOpt_USM 2 = Green car + lanes + # FcwOpt_USM 1 = White car + lanes + # FcwOpt_USM 0 = No car + lanes + values["CF_Lkas_FcwOpt_USM"] = 2 if enabled else 1 + + # SysWarning 4 = keep hands on wheel + # SysWarning 5 = keep hands on wheel (red) + # SysWarning 6 = keep hands on wheel (red) + beep + # Note: the warning is hidden while the blinkers are on + values["CF_Lkas_SysWarning"] = 0 #4 if sys_warning else 0 + + # Likely cars lacking the ability to show individual lane lines in the dash + elif CP.carFingerprint in (CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL): + # SysWarning 4 = keep hands on wheel + beep + values["CF_Lkas_SysWarning"] = 4 if sys_warning else 0 + + # SysState 0 = no icons + # SysState 1-2 = white car + lanes + # SysState 3 = green car + lanes, green steering wheel + # SysState 4 = green car + lanes + values["CF_Lkas_LdwsSysState"] = 3 if enabled else 1 + values["CF_Lkas_LdwsOpt_USM"] = 2 # non-2 changes above SysState definition + + # these have no effect + values["CF_Lkas_LdwsActivemode"] = 0 + values["CF_Lkas_FcwOpt_USM"] = 0 + + elif CP.carFingerprint == CAR.HYUNDAI_GENESIS: + # This field is actually LdwsActivemode + # Genesis and Optima fault when forwarding while engaged + values["CF_Lkas_LdwsActivemode"] = 2 + + if is_ldws_car: + values["CF_Lkas_LdwsOpt_USM"] = 3 + + values["CF_Lkas_Chksum"] = 0 + + dat = packer.make_can_msg("LKAS11", 0, values)[1] + + if CP.flags & HyundaiFlags.CHECKSUM_CRC8: + # CRC Checksum as seen on 2019 Hyundai Santa Fe + dat = dat[:6] + dat[7:8] + checksum = hyundai_checksum(dat) + elif CP.flags & HyundaiFlags.CHECKSUM_6B: + # Checksum of first 6 Bytes, as seen on 2018 Kia Sorento + checksum = sum(dat[:6]) % 256 + else: + # Checksum of first 6 Bytes and last Byte as seen on 2018 Kia Stinger + checksum = (sum(dat[:6]) + dat[7]) % 256 + + values["CF_Lkas_Chksum"] = checksum + + return packer.make_can_msg("LKAS11", 0, values) + + +def create_clu11(packer, frame, clu11, button, CP): + values = {s: clu11[s] for s in [ + "CF_Clu_CruiseSwState", + "CF_Clu_CruiseSwMain", + "CF_Clu_SldMainSW", + "CF_Clu_ParityBit1", + "CF_Clu_VanzDecimal", + "CF_Clu_Vanz", + "CF_Clu_SPEED_UNIT", + "CF_Clu_DetentOut", + "CF_Clu_RheostatLevel", + "CF_Clu_CluInfo", + "CF_Clu_AmpInfo", + "CF_Clu_AliveCnt1", + ]} + values["CF_Clu_CruiseSwState"] = button + values["CF_Clu_AliveCnt1"] = frame % 0x10 + # send buttons to camera on camera-scc based cars + bus = 2 if CP.flags & HyundaiFlags.CAMERA_SCC else 0 + return packer.make_can_msg("CLU11", bus, values) + + +def create_lfahda_mfc(packer, CC, blinking_signal): + activeCarrot = CC.hudControl.activeCarrot + values = { + "LFA_Icon_State": 2 if CC.latActive else 1 if CC.enabled else 0, + #"HDA_Active": 1 if activeCarrot >= 2 else 0, + #"HDA_Icon_State": 2 if activeCarrot == 3 and blinking_signal else 2 if activeCarrot >= 2 else 0, + "HDA_Icon_State": 0 if activeCarrot == 3 and blinking_signal else 2 if activeCarrot >= 1 else 0, + "HDA_VSetReq": 0, #set_speed_in_units if activeCarrot >= 2 else 0, + "HDA_USM" : 2, + "HDA_Icon_Wheel" : 1 if CC.latActive else 0, + #"HDA_Chime" : 1 if CC.latActive else 0, # comment for K9 chime, + } + return packer.make_can_msg("LFAHDA_MFC", 0, values) + +def create_acc_commands_scc(packer, enabled, accel, jerk, idx, hud_control, set_speed, stopping, long_override, suppress_casper_ev_fca, CS, soft_hold_mode): + from iqdbc.car.hyundai.carcontroller import HyundaiJerk + cruise_available = CS.out.cruiseState.available + if CS.paddle_button_prev > 0: + cruise_available = False + soft_hold_active = CS.softHoldActive + soft_hold_info = soft_hold_active > 1 and enabled + #soft_hold_mode = 2 ## some cars can't enable while braking + long_enabled = enabled or (soft_hold_active > 0 and soft_hold_mode == 2) + stop_req = 1 if stopping or (soft_hold_active > 0 and soft_hold_mode == 2) else 0 + d = hud_control.leadDistance + objGap = 0 if d == 0 else 2 if d < 25 else 3 if d < 40 else 4 if d < 70 else 5 + objGap2 = 0 if objGap == 0 else 2 if hud_control.leadRelSpeed < -0.2 else 1 + + if long_enabled: + if jerk.carrot_cruise == 1: + long_enabled = False + accel = -0.5 + elif jerk.carrot_cruise == 2: + accel = jerk.carrot_cruise_accel + + if long_enabled: + scc12_acc_mode = 2 if long_override else 1 + scc14_acc_mode = 2 if long_override else 1 + if CS.out.brakeHoldActive: + scc12_acc_mode = 0 + scc14_acc_mode = 4 + elif CS.out.brakePressed: + scc12_acc_mode = 1 + scc14_acc_mode = 1 + else: + scc12_acc_mode = 0 + scc14_acc_mode = 4 + + warning_front = False + + commands = [] + if CS.scc11 is not None: + values = copy.copy(CS.scc11) + values["MainMode_ACC"] = 1 if cruise_available else 0 + values["TauGapSet"] = hud_control.leadDistanceBars + values["VSetDis"] = set_speed if enabled else 0 + values["AliveCounterACC"] = idx % 0x10 + values["SCCInfoDisplay"] = 3 if warning_front else 4 if soft_hold_info else 0 if enabled else 0 #2: íŦëŖ¨ėψ ė„ íƒ, 3: ė „ë°Šėƒí™ŠėŖŧė˜, 4: ėļœë°œė¤€ëš„ + values["ObjValid"] = 1 if hud_control.leadVisible else 0 + values["ACC_ObjStatus"] = 1 if hud_control.leadVisible else 0 + values["ACC_ObjLatPos"] = 0 + values["ACC_ObjRelSpd"] = hud_control.leadRelSpeed + values["ACC_ObjDist"] = int(hud_control.leadDistance) + values["DriverAlertDisplay"] = 0 + commands.append(packer.make_can_msg("SCC11", 0, values)) + + if CS.scc12 is not None: + values = copy.copy(CS.scc12) + values["ACCMode"] = scc12_acc_mode #2 if enabled and long_override else 1 if long_enabled else 0 + values["StopReq"] = stop_req + values["aReqRaw"] = accel + values["aReqValue"] = accel + values["ACCFailInfo"] = 0 + + #values["DESIRED_DIST"] = CS.out.vEgo * 1.0 + 4.0 # TF: 1.0 + STOPDISTANCE 4.0 m로 ę°€ė •í•¨. + + values["CR_VSM_ChkSum"] = 0 + values["CR_VSM_Alive"] = idx % 0xF + scc12_dat = packer.make_can_msg("SCC12", 0, values)[1] + values["CR_VSM_ChkSum"] = 0x10 - sum(sum(divmod(i, 16)) for i in scc12_dat) % 0x10 + + commands.append(packer.make_can_msg("SCC12", 0, values)) + + if CS.scc14 is not None: + values = copy.copy(CS.scc14) + values["ComfortBandUpper"] = jerk.cb_upper + values["ComfortBandLower"] = jerk.cb_lower + values["JerkUpperLimit"] = jerk.jerk_u + values["JerkLowerLimit"] = jerk.jerk_l if long_enabled else 0 # for KONA test + values["ACCMode"] = scc14_acc_mode #2 if enabled and long_override else 1 if long_enabled else 4 # stock will always be 4 instead of 0 after first disengage + values["ObjGap"] = objGap #2 if hud_control.leadVisible else 0 # 5: >30, m, 4: 25-30 m, 3: 20-25 m, 2: < 20 m, 0: no lead + values["ObjDistStat"] = objGap2 + commands.append(packer.make_can_msg("SCC14", 0, values)) + + if CS.fca11 is not None and suppress_casper_ev_fca: # CASPER_EVė˜ ę˛Ŋ뚰 FCA11ė—ė„œ failė´ ę°„í—ė  ë°œėƒí•¨.. ꡸ëƒĨë§‰ėž.. ė›ė¸ëļˆëĒ….. + values = suppress_casper_ev_fca11_fault(copy.copy(CS.fca11)) + fca11_dat = packer.make_can_msg("FCA11", 0, values)[1] + values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7]) + commands.append(packer.make_can_msg("FCA11", 0, values)) + # Only send FCA11 on cars where it exists on the bus + if False: #use_fca: + # note that some vehicles most likely have an alternate checksum/counter definition + # https://github.com/commaai/iqdbc/commit/9ddcdb22c4929baf310295e832668e6e7fcfa602 + fca11_values = { + "CR_FCA_Alive": idx % 0xF, + "PAINT1_Status": 1, + "FCA_DrvSetStatus": 1, + "FCA_Status": 1, # AEB disabled + } + fca11_dat = packer.make_can_msg("FCA11", 0, fca11_values)[1] + fca11_values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7]) + commands.append(packer.make_can_msg("FCA11", 0, fca11_values)) + + return commands + +def create_acc_opt_copy(CS, packer): + values = copy.copy(CS.scc13) + if values["NEW_SIGNAL_1"] == 255: + values["NEW_SIGNAL_1"] = 218 + values["NEW_SIGNAL_2"] = 0 + return packer.make_can_msg("SCC13", 0, CS.scc13) + +def create_acc_commands(packer, enabled, accel, jerk, idx, hud_control, set_speed, stopping, long_override, use_fca, CP, CS, soft_hold_mode): + from iqdbc.car.hyundai.carcontroller import HyundaiJerk + cruise_available = CS.out.cruiseState.available + soft_hold_active = CS.softHoldActive + soft_hold_info = soft_hold_active > 1 and enabled + #soft_hold_mode = 2 ## some cars can't enable while braking + long_enabled = enabled or (soft_hold_active > 0 and soft_hold_mode == 2) + stop_req = 1 if stopping or (soft_hold_active > 0 and soft_hold_mode == 2) else 0 + d = hud_control.leadDistance + objGap = 0 if d == 0 else 2 if d < 25 else 3 if d < 40 else 4 if d < 70 else 5 + objGap2 = 0 if objGap == 0 else 2 if hud_control.leadRelSpeed < -0.2 else 1 + + if long_enabled: + scc12_acc_mode = 2 if long_override else 1 + scc14_acc_mode = 2 if long_override else 1 + if CS.out.brakeHoldActive: + scc12_acc_mode = 0 + scc14_acc_mode = 4 + elif CS.out.brakePressed: + scc12_acc_mode = 1 + scc14_acc_mode = 1 + else: + scc12_acc_mode = 0 + scc14_acc_mode = 4 + + warning_front = False + + commands = [] + + scc11_values = { + "MainMode_ACC": 1 if cruise_available else 0, + "TauGapSet": hud_control.leadDistanceBars, + "VSetDis": set_speed if enabled else 0, + "AliveCounterACC": idx % 0x10, + "SCCInfoDisplay": 3 if warning_front else 4 if soft_hold_info else 0 if enabled else 0, + "ObjValid": 1 if hud_control.leadVisible else 0, # close lead makes controls tighter + "ACC_ObjStatus": 1 if hud_control.leadVisible else 0, # close lead makes controls tighter + "ACC_ObjLatPos": 0, + "ACC_ObjRelSpd": hud_control.leadRelSpeed, + "ACC_ObjDist": int(hud_control.leadDistance), # close lead makes controls tighter + "DriverAlertDisplay": 0, + } + commands.append(packer.make_can_msg("SCC11", 0, scc11_values)) + + scc12_values = { + "ACCMode": scc12_acc_mode, + "StopReq": stop_req, + "aReqRaw": 0 if stop_req > 0 else accel, + "aReqValue": accel, # stock ramps up and down respecting jerk limit until it reaches aReqRaw + #"DESIRED_DIST": CS.out.vEgo * 1.0 + 4.0, + "CR_VSM_Alive": idx % 0xF, + } + + # show AEB disabled indicator on dash with SCC12 if not sending FCA messages. + # these signals also prevent a TCS fault on non-FCA cars with alpha longitudinal + if not use_fca: + scc12_values["CF_VSM_ConfMode"] = 1 + scc12_values["AEB_Status"] = 1 # AEB disabled + + scc12_dat = packer.make_can_msg("SCC12", 0, scc12_values)[1] + scc12_values["CR_VSM_ChkSum"] = 0x10 - sum(sum(divmod(i, 16)) for i in scc12_dat) % 0x10 + + commands.append(packer.make_can_msg("SCC12", 0, scc12_values)) + + scc14_values = { + "ComfortBandUpper": jerk.cb_upper, # stock usually is 0 but sometimes uses higher values + "ComfortBandLower": jerk.cb_lower, # stock usually is 0 but sometimes uses higher values + "JerkUpperLimit": jerk.jerk_u, # stock usually is 1.0 but sometimes uses higher values + "JerkLowerLimit": jerk.jerk_l, # stock usually is 0.5 but sometimes uses higher values + "ACCMode": scc14_acc_mode, # if enabled and long_override else 1 if enabled else 4, # stock will always be 4 instead of 0 after first disengage + "ObjGap": objGap, #2 if hud_control.leadVisible else 0, # 5: >30, m, 4: 25-30 m, 3: 20-25 m, 2: < 20 m, 0: no lead + "ObjDistStat": objGap2, + } + commands.append(packer.make_can_msg("SCC14", 0, scc14_values)) + + # Only send FCA11 on cars where it exists on the bus + # On Camera SCC cars, FCA11 is not disabled, so we forward stock FCA11 back to the car forward hooks + if use_fca and not (CP.flags & HyundaiFlags.CAMERA_SCC): + # note that some vehicles most likely have an alternate checksum/counter definition + # https://github.com/commaai/iqdbc/commit/9ddcdb22c4929baf310295e832668e6e7fcfa602 + fca11_values = { + "CR_FCA_Alive": idx % 0xF, + "PAINT1_Status": 1, + "FCA_DrvSetStatus": 1, + "FCA_Status": 1, # AEB disabled + } + fca11_dat = packer.make_can_msg("FCA11", 0, fca11_values)[1] + fca11_values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7]) + commands.append(packer.make_can_msg("FCA11", 0, fca11_values)) + + return commands + +def create_acc_opt(packer, CP): + commands = [] + + scc13_values = { + "SCCDrvModeRValue": 2, + "SCC_Equip": 1, + "Lead_Veh_Dep_Alert_USM": 2, + } + commands.append(packer.make_can_msg("SCC13", 0, scc13_values)) + + # TODO: this needs to be detected and conditionally sent on unsupported long cars + # On Camera SCC cars, FCA12 is not disabled, so we forward stock FCA12 back to the car forward hooks + if not (CP.flags & HyundaiFlags.CAMERA_SCC): + fca12_values = { + "FCA_DrvSetState": 2, + "FCA_USM": 1, # AEB disabled + } + commands.append(packer.make_can_msg("FCA12", 0, fca12_values)) + + return commands + +def create_frt_radar_opt(packer): + frt_radar11_values = { + "CF_FCA_Equip_Front_Radar": 1, + } + return packer.make_can_msg("FRT_RADAR11", 0, frt_radar11_values) + +def create_clu11_button(packer, frame, clu11, button, CP): + values = clu11.copy() + values["CF_Clu_CruiseSwState"] = button + #values["CF_Clu_AliveCnt1"] = frame % 0x10 + values["CF_Clu_AliveCnt1"] = (values["CF_Clu_AliveCnt1"] + 1) % 0x10 + # send buttons to camera on camera-scc based cars + bus = 2 if CP.flags & HyundaiFlags.CAMERA_SCC else 0 + return packer.make_can_msg("CLU11", bus, values) + +def create_mdps12(packer, frame, mdps12): + values = mdps12 + values["CF_Mdps_ToiActive"] = 0 + values["CF_Mdps_ToiUnavail"] = 1 + values["CF_Mdps_MsgCount2"] = frame % 0x100 + values["CF_Mdps_Chksum2"] = 0 + + dat = packer.make_can_msg("MDPS12", 2, values)[1] + checksum = sum(dat) % 256 + values["CF_Mdps_Chksum2"] = checksum + + return packer.make_can_msg("MDPS12", 2, values) diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/hyundaicanfd.py b/artifacts/package_runtime/iqdbc/car/hyundai/hyundaicanfd.py new file mode 100644 index 000000000..003a56e91 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/hyundaicanfd.py @@ -0,0 +1,830 @@ +import copy +import numpy as np +from iqdbc.car import CanBusBase +from iqdbc.car.crc import CRC16_XMODEM +from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiExtFlags +from iqpilot.common.params import Params +from iqdbc.car.common.conversions import Conversions as CV +from iqpilot.cereal import log + +LaneChangeState = log.LaneChangeState +LaneChangeDirection = log.LaneChangeDirection +TurnDirection = log.Desire + + +class CanBus(CanBusBase): + def __init__(self, CP, fingerprint=None, lka_steering=None) -> None: + super().__init__(CP, fingerprint) + + if lka_steering is None: + lka_steering = CP.flags & HyundaiFlags.CANFD_HDA2.value if CP is not None else False + + # On the CAN-FD platforms, the LKAS camera is on both A-CAN and E-CAN. LKA steering cars + # have a different harness than the LFA steering variants in order to split + # a different bus, since the steering is done by different ECUs. + self._a, self._e = 1, 0 + if lka_steering and Params().get_int("HyundaiCameraSCC") == 0: #ë°°ė„ ę°œėĄ°ëŠ” ëŦ´ėĄ°ęą´ Bus0가 ECANėž„. + self._a, self._e = 0, 1 + + self._a += self.offset + self._e += self.offset + self._cam = 2 + self.offset + + @property + def ECAN(self): + return self._e + + @property + def ACAN(self): + return self._a + + @property + def CAM(self): + return self._cam + +# CAN LIST (CAM) - 륹ėģ¨ę°œėĄ°ė‹œ... ADAS + CAM +# 160: ADRV_0x160 +# 1da: ADRV_0x1da +# 1ea: ADRV_0x1ea +# 200: ADRV_0x200 +# 345: ADRV_0x345 +# 1fa: CLUSTER_SPEED_LIMIT +# 12a: LFA +# 1e0: LFAHDA_CLUSTER +# 11a: +# 1b5: +# 1a0: SCC_CONTROL + +# CAN LIST (ACAN) +# 160: ADRV_0x160 +# 51: ADRV_0x51 +# 180: CAM_0x180 +# ... +# 185: CAM_0x185 +# 1b6: CAM_0x1b6 +# ... +# 1b9: CAM_0x1b9 +# 1fb: CAM_0x1fb +# 2a2 - 2a4 +# 2bb - 2be +# LKAS +# 201 - 2a0 + +def create_steering_messages(packer, CP, CAN, enabled, lat_active, apply_steer, apply_angle, max_torque, angle_control): + + ret = [] + if angle_control: + values = { + "LKA_MODE": 0, + "LKA_ICON": 2 if enabled else 1, + "TORQUE_REQUEST": 0, # apply_steer, + "VALUE63": 0, # LKA_ASSIST + "STEER_REQ": 0, # 1 if lat_active else 0, + "HAS_LANE_SAFETY": 0, # hide LKAS settings + "LKA_ACTIVE": 3 if lat_active else 0, # this changes sometimes, 3 seems to indicate engaged + "VALUE64": 0, #STEER_MODE, NEW_SIGNAL_2 + "LKAS_ANGLE_CMD": -apply_angle, + "LKAS_ANGLE_ACTIVE": 2 if lat_active else 1, + "LKAS_ANGLE_MAX_TORQUE": max_torque if lat_active else 0, + + # test for EV6PE + "NEW_SIGNAL_1": 10, #2, + "DampingGain": 9, + "VALUE231": 146, + "VALUE239": 1, + "VALUE247": 255, + "VALUE255": 255, + } + else: + values = { + "LKA_MODE": 2, + "LKA_ICON": 2 if enabled else 1, + "TORQUE_REQUEST": apply_steer, + "DampingGain": 100, #3 if enabled else 100, + "STEER_REQ": 1 if lat_active else 0, + #"STEER_MODE": 0, + "HAS_LANE_SAFETY": 0, # hide LKAS settings + "VALUE63": 0, + "VALUE64": 100, + } + + if CP.flags & HyundaiFlags.CANFD_HDA2: + lkas_msg = "LKAS_ALT" if CP.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING else "LKAS" + if CP.openpilotLongitudinalControl: + ret.append(packer.make_can_msg("LFA", CAN.ECAN, values)) + if not (CP.flags & HyundaiFlags.CAMERA_SCC.value): + ret.append(packer.make_can_msg(lkas_msg, CAN.ACAN, values)) + else: + ret.append(packer.make_can_msg("LFA", CAN.ECAN, values)) + + return ret + +def create_suppress_lfa(packer, CAN, CS): + if CS.cam_0x362 is not None: + suppress_msg = "CAM_0x362" + lfa_block_msg = CS.cam_0x362 + elif CS.cam_0x2a4 is not None: + suppress_msg = "CAM_0x2a4" + lfa_block_msg = CS.cam_0x2a4 + else: + return [] + + #values = {f"BYTE{i}": lfa_block_msg[f"BYTE{i}"] for i in range(3, msg_bytes) if i != 7} + values = copy.copy(lfa_block_msg) + values["COUNTER"] = lfa_block_msg["COUNTER"] + values["SET_ME_0"] = 0 + values["SET_ME_0_2"] = 0 + values["LEFT_LANE_LINE"] = 0 + values["RIGHT_LANE_LINE"] = 0 + return [packer.make_can_msg(suppress_msg, CAN.ACAN, values)] + +def create_buttons(packer, CP, CAN, cnt, btn): + values = { + "COUNTER": cnt, + "SET_ME_1": 1, + "CRUISE_BUTTONS": btn, + } + + #bus = CAN.ECAN if CP.flags & HyundaiFlags.CANFD_HDA2 else CAN.CAM + bus = CAN.ECAN + return packer.make_can_msg("CRUISE_BUTTONS", bus, values) + +def create_acc_cancel(packer, CP, CAN, cruise_info_copy): + # TODO: why do we copy different values here? + if CP.flags & HyundaiFlags.CANFD_CAMERA_SCC.value: + values = {s: cruise_info_copy[s] for s in [ + "COUNTER", + "CHECKSUM", + "NEW_SIGNAL_1", + "MainMode_ACC", + "ACCMode", + "ZEROS_9", + "CRUISE_STANDSTILL", + "ZEROS_5", + "DISTANCE_SETTING", + "VSetDis", + ]} + else: + values = {s: cruise_info_copy[s] for s in [ + "COUNTER", + "CHECKSUM", + "ACCMode", + "VSetDis", + "CRUISE_STANDSTILL", + ]} + values.update({ + "ACCMode": 4, + "aReqRaw": 0.0, + "aReqValue": 0.0, + }) + return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values) + +def create_lfahda_cluster(packer, CS, CAN, long_active, lat_active): + + + if CS.lfahda_cluster is not None: + values = copy.copy(CS.lfahda_cluster) + rx_counter = values.pop("COUNTER", None) + else: + return [] + values = {} + rx_counter = None + values["LFA_OptUsmSta"] = 2 + values["HDA_OptUsmSta"] = 2 + values["HDA_CntrlModSta"] = 2 if long_active else 0 + values["HDA_LFA_SymSta"] = 2 if lat_active else 0 + return [packer.make_can_msg("LFAHDA_CLUSTER", CAN.ECAN, values, rx_counter=rx_counter)] + +def create_lfa_icon_non_camera_scc(packer, CS, CAN, CC): + ret = [] + if CS.adrv_0x161 is not None: + values = copy.copy(CS.adrv_0x161) + rx_counter = values.pop("COUNTER", None) + + lat_active = CC.latActive + lat_enabled = CS.out.latEnabled + + values["LFA_ICON"] = 2 if lat_active else 1 if lat_enabled else 0 + values["LKA_ICON"] = 4 if lat_active else 3 if lat_enabled else 0 + + if values["ALERTS_2"] in [1, 2, 5, 6, 10, 21, 22]: + values["ALERTS_2"] = 0 + values["DAW_ICON"] = 0 + + if values["ALERTS_1"] == 0: + values["SOUNDS_1"] = 0 + values["SOUNDS_2"] = 0 + values["SOUNDS_4"] = 0 + + if values["ALERTS_3"] in [3, 4, 11, 12, 13, 14, 17, 19, 26, 7, 8, 9, 10]: + values["ALERTS_3"] = 0 + values["SOUNDS_3"] = 0 + + if values["ALERTS_5"] in [1, 2, 3, 4, 5]: + values["ALERTS_5"] = 0 + + ret.append(packer.make_can_msg("ADRV_0x161", CAN.ECAN, values, rx_counter=rx_counter)) + return ret + +def create_acc_control_scc2(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed, hud_control, hyundai_jerk, CS): + + if CS.scc_control is None: + return None + enabled = (enabled or CS.softHoldActive > 0) and CS.paddle_button_prev == 0 + + acc_mode = 0 if not enabled else (2 if gas_override else 1) + + if hyundai_jerk.carrot_cruise == 1: + acc_mode = 4 if enabled else 0 + enabled = False + accel = accel_last = 0.5 + + elif hyundai_jerk.carrot_cruise == 2: + accel = accel_last = hyundai_jerk.carrot_cruise_accel + + jerk_u = hyundai_jerk.jerk_u + jerk_l = hyundai_jerk.jerk_l + jerk = 5 + jn = jerk / 50 + if not enabled or gas_override: + a_val, a_raw = 0, 0 + else: + a_raw = accel + a_val = accel #np.clip(accel, accel_last - jn, accel_last + jn) + + values = copy.copy(CS.scc_control) + rx_counter = values.pop("COUNTER", None) + values["ACCMode"] = acc_mode + values["MainMode_ACC"] = 1 + values["StopReq"] = 1 if stopping or CS.softHoldActive > 0 else 0 # 1: Stop control is required, 2: Not used, 3: Error Indicator + values["aReqValue"] = a_val + values["aReqRaw"] = a_raw + values["VSetDis"] = set_speed + #values["JerkLowerLimit"] = jerk if enabled else 1 + #values["JerkUpperLimit"] = 3.0 + values["JerkLowerLimit"] = jerk_l if enabled else 1 + values["JerkUpperLimit"] = 2.0 if stopping or CS.softHoldActive else jerk_u + values["DISTANCE_SETTING"] = hud_control.leadDistanceBars # + 5 + #values["DISTANCE_SETTING"] = hud_control.leadDistanceBars + 5 + + #values["ACC_ObjDist"] = 1 + #values["ObjValid"] = 0 + #values["OBJ_STATUS"] = 2 + #values["NSCCOper"] = 1 if enabled else 0 # 0: off, 1: Ready, 2: Act, 3: Error Indicator + #values["NSCCOnOff"] = 2 # 0: Default, 1: Off, 2: On, 3: Invalid + #values["SET_ME_3"] = 0x3 # objRelsped뙀 ėļŠëŒ + #values["ACC_ObjLatPos"] = - hud_control.leadDPath + values["DriveMode"] = 0 # 0: Default, 1: Comfort Mode, 2:Normal mode, 3:Dynamic mode, reserved + + hud_lead_info = 0 + if hud_control.leadVisible: + hud_lead_info = 1 if values["ACC_ObjRelSpd"] > 0 else 2 + values["HUD_LEAD_INFO"] = hud_lead_info #1: in-path object detected(uncontrollable), 2: controllable long, 3: controllable long & lat, ... reserved + + values["DriverAlert"] = 0 # 1: SCC Disengaged, 2: No SCC Engage condition, 3: SCC Disenganed when the vehicle stops + + values["TARGET_DISTANCE"] = CS.out.vEgo * 1.0 + 4.0 + + soft_hold_info = 1 if CS.softHoldActive > 1 and enabled else 0 + + # ė´ęą°ė•ˆí•˜ëŠ´ 렕맀뤑 뒤로 밀ëĻŦ는 í˜„ėƒ ë°œėƒí•˜ëŠ”ë“¯.. (ė‹ í˜¸ė •ė§€ė¤‘ė— 뒤로 밀ëĻŦ는 ę˛Ŋ험함.. ė‹œí—˜í•´ë´ė•ŧ) + if values["InfoDisplay"] != 5: #5: Front Car Departure Notice + values["InfoDisplay"] = 4 if stopping and CS.out.aEgo > -0.3 else 0 # 1: SCC Mode, 2: Convention Cruise Mode, 3: Object disappered at low speed, 4: Available to resume acceleration control, 5: Front vehicle departure notice, 6: Reserved, 7: Invalid + + values["TakeOverReq"] = 0 # 1: Takeover request, 2: Not used, 3: Error indicator , ė´ę˛ƒė´ ėŧœė§€ëŠ´ ę°€ė†ė„ ė•ˆí•˜ëŠ”ë“¯í•¨. + #values["NEW_SIGNAL_4"] = 9 if hud_control.leadVisible else 0 + # AccelLimitBandUpper, Lower + values["SysFailState"] = 0 # 1: Performance degredation, 2: system temporairy unavailble, 3: SCC Service required , ëˆˆė´ ëŦģė–´ ë ˆė´ë”ė˜¤ëĨ˜ė‹œ... 2가 됨. ė´ë•Œ ę°€ė†ė„ ė•ˆí•¨... + + values["AccelLimitBandUpper"] = 0.0 # ė´ę°’ė´ 1.26ėŧ때 ę°€ė†ė„ ė•ˆí•˜ëŠ” ėĻėƒė´ ëŗ´ėž„.. + values["AccelLimitBandLower"] = 0.0 + + values["ZEROS_7"] = 1 + + return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values) + +def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed, hud_control, jerk_u, jerk_l, CS): + + enabled = enabled or CS.softHoldActive > 0 + jerk = 5 + jn = jerk / 50 + if not enabled or gas_override: + a_val, a_raw = 0, 0 + else: + a_raw = accel + a_val = np.clip(accel, accel_last - jn, accel_last + jn) + + values = { + "ACCMode": 0 if not enabled else (2 if gas_override else 1), + "MainMode_ACC": 1, + "StopReq": 1 if stopping or CS.softHoldActive > 0 else 0, + "aReqValue": a_val, + "aReqRaw": a_raw, + "VSetDis": set_speed, + #"JerkLowerLimit": jerk if enabled else 1, + #"JerkUpperLimit": 3.0, + "JerkLowerLimit": jerk_l if enabled else 1, + "JerkUpperLimit": jerk_u, + + "ACC_ObjDist": 1, + #"ObjValid": 0, + #"OBJ_STATUS": 2, + "NSCCOper": 0, + "NSCCOnOff": 2, + "DriveMode": 0, + #"SET_ME_3": 0x3, + "ACC_ObjLatPos": 0x64, + "DISTANCE_SETTING": hud_control.leadDistanceBars, # + 5, + "InfoDisplay": 4 if stopping and CS.out.cruiseState.standstill else 0, + } + + return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values) + + +def create_spas_messages(packer, CAN, frame, left_blink, right_blink): + ret = [] + + values = { + } + ret.append(packer.make_can_msg("SPAS1", CAN.ECAN, values)) + + blink = 0 + if left_blink: + blink = 3 + elif right_blink: + blink = 4 + values = { + "BLINKER_CONTROL": blink, + } + ret.append(packer.make_can_msg("SPAS2", CAN.ECAN, values)) + + return ret + + +def create_fca_warning_light(CP, packer, CAN, frame): + ret = [] + if CP.flags & HyundaiFlags.CAMERA_SCC.value: + return ret + + if frame % 2 == 0: + values = { + 'AEB_SETTING': 0x1, # show AEB disabled icon + 'SET_ME_2': 0x2, + 'SET_ME_FF': 0xff, + 'SET_ME_FC': 0xfc, + 'SET_ME_9': 0x9, + #'DATA102': 1, + } + ret.append(packer.make_can_msg("ADRV_0x160", CAN.ECAN, values)) + return ret + +def create_tcs_messages(packer, CAN, CS): + ret = [] + if CS.tcs is not None: + values = copy.copy(CS.tcs) + #rx_counter = values.pop("COUNTER", None) + values["DriverBraking"] = 0 + values["NEW_SIGNAL_20"] = 0 + values["NEW_SIGNAL_11"] = 0 + values["DriverBrakingLowSens"] = 0 + #values["NEW_SIGNAL_1"] = 0 # accelęŗŧ 관련.. ė˜†ë‘ëļ€ ęēŧė§€ëŠ”ę˛ƒęŗŧ 관련? í™•ė¸í•„ėš” + #values["ACC_REQ"] = 1 # ė˜†ë‘ëļ€ ęēŧė§€ëŠ”ę˛ƒęŗŧ 관련? í™•ė¸í•„ėš”.. í•­ėƒ ėŧœė§€ę˛Œí•¨.. + values["NEW_SIGNAL_1"] = 0 if values["ACC_REQ"] == 1 else 1 # ė˜†ë‘ëļ€.. + #ret.append(packer.make_can_msg("TCS", CAN.CAM, values, rx_counter = rx_counter)) + ret.append(packer.make_can_msg("TCS", CAN.CAM, values)) + return ret + +def forward_button_message(packer, CAN, frame, CS, cruise_button, MainMode_ACC_trigger, LFA_trigger): + ret = [] + if frame % 2 == 0: + if CS.cruise_buttons_msg is not None: + values = copy.copy(CS.cruise_buttons_msg) + # A held MAIN is reported on this bit and switches some clusters to LIMIT mode. + values["NORMAL_CRUISE_MAIN_BTN"] = 0 + #rx_counter = values.pop("COUNTER", None) + cruise_button_driver = values["CRUISE_BUTTONS"] + if cruise_button_driver == 0: + values["CRUISE_BUTTONS"] = cruise_button + if MainMode_ACC_trigger > 0: + #values["ADAPTIVE_CRUISE_MAIN_BTN"] = 1 + pass + elif LFA_trigger > 0: + values["LFA_BTN"] = 1 + + #ret.append(packer.make_can_msg(CS.cruise_btns_msg_canfd, CAN.CAM, values, rx_counter = rx_counter)) + ret.append(packer.make_can_msg(CS.cruise_btns_msg_canfd, CAN.CAM, values)) + return ret + +def create_adrv_messages(CP, packer, CAN, frame): + # messages needed to car happy after disabling + # the ADAS Driving ECU to do longitudinal control + + ret = [] + + if not CP.flags & HyundaiFlags.CAMERA_SCC.value: + values = {} + + ret.extend(create_fca_warning_light(CP, packer, CAN, frame)) + if frame % 5 == 0: + values = { + #'HDA_MODE1': 0x8, + 'HDA_MODE2': 0x1, + #'SET_ME_1C': 0x1c, + 'SET_ME_FF': 0xff, + #'SET_ME_TMP_F': 0xf, + #'SET_ME_TMP_F_2': 0xf, + #'DATA26': 1, #1 + #'DATA32': 5, #5 + } + ret.append(packer.make_can_msg("ADRV_0x1ea", CAN.ECAN, values)) + + values = { + 'SET_ME_E1': 0xe1, + #'SET_ME_3A': 0x3a, + 'TauGapSet' : 1, + 'NEW_SIGNAL_2': 3, + } + ret.append(packer.make_can_msg("ADRV_0x200", CAN.ECAN, values)) + + if frame % 20 == 0: + values = { + 'SET_ME_15': 0x15, + } + ret.append(packer.make_can_msg("ADRV_0x345", CAN.ECAN, values)) + + if frame % 100 == 0: + values = { + 'SET_ME_22': 0x22, + 'SET_ME_41': 0x41, + } + ret.append(packer.make_can_msg("ADRV_0x1da", CAN.ECAN, values)) + + return ret + +## carrot +def alt_cruise_buttons(packer, CP, CAN, buttons, cruise_btns_msg, cnt): + cruise_btns_msg["CRUISE_BUTTONS"] = buttons + cruise_btns_msg["COUNTER"] = (cruise_btns_msg["COUNTER"] + 1 + cnt) % 256 + bus = CAN.ECAN if CP.flags & HyundaiFlags.CANFD_HDA2 else CAN.CAM + return packer.make_can_msg("CRUISE_BUTTONS_ALT", bus, cruise_btns_msg) + +def hkg_can_fd_checksum(address: int, sig, d: bytearray) -> int: + crc = 0 + for i in range(2, len(d)): + crc = ((crc << 8) ^ CRC16_XMODEM[(crc >> 8) ^ d[i]]) & 0xFFFF + crc = ((crc << 8) ^ CRC16_XMODEM[(crc >> 8) ^ ((address >> 0) & 0xFF)]) & 0xFFFF + crc = ((crc << 8) ^ CRC16_XMODEM[(crc >> 8) ^ ((address >> 8) & 0xFF)]) & 0xFFFF + if len(d) == 8: + crc ^= 0x5F29 + elif len(d) == 16: + crc ^= 0x041D + elif len(d) == 24: + crc ^= 0x819D + elif len(d) == 32: + crc ^= 0x9F5B + return crc + + + + +def _clip_int(x, lo, hi): + return lo if x < lo else hi if x > hi else int(x) + +def _get_desire_and_lane_changing(md): + desire = 0 + lane_changing = 0 + if md is not None: + desire = md.meta.desire.raw + ds = md.meta.desireState + if len(ds) > 4: + if ds[1] > 0.9: lane_changing = 1 + if ds[2] > 0.9: lane_changing = 2 + if ds[3] > 0.9: lane_changing = 3 + if ds[4] > 0.9: lane_changing = 4 + return desire, lane_changing + +def _apply_lane_desire(values, desire): + #values['LANE_CHANGING'] = 0 + + if desire == 1: # ėĸŒíšŒė „ + values['LANE_CHANGING'] = 1 + values["LANELINE_CURVATURE"] = 15 + values["LANELINE_CURVATURE_DIRECTION"] = 0 + + elif desire == 2: # ėš°íšŒė „ + values['LANE_CHANGING'] = 2 + values["LANELINE_CURVATURE"] = 15 + values["LANELINE_CURVATURE_DIRECTION"] = 1 + + elif desire == 3: # ėĸŒė°¨ė„ ëŗ€ę˛Ŋ + values['LANE_CHANGING'] = 3 + + elif desire == 4: # ėš°ė°¨ė„ ëŗ€ę˛Ŋ + values['LANE_CHANGING'] = 4 + +def _apply_radar_blink(values, radar_pairs, frame, *, + disp_dist=30.0, min_dist=14.0, + max_interval=100, t=1.0): + """ + ęą°ëĻŦ > min_dist ėŧ 때만 ęšœëšĄėž„. + ęą°ëĻŦ ëŠ€ėˆ˜ëĄ interval ėģ¤ė§(느ëĻŦ枌). + """ + for det_key, dist_key in radar_pairs: + dist = values[dist_key] + if dist <= min_dist: + continue + + d = min(dist, disp_dist) + interval = int((1 + (max_interval - 1) * (d / disp_dist)) * t) + interval = _clip_int(interval, 1, max_interval) + + blink = (frame // interval) & 1 + values[det_key] = 2 - blink + values[dist_key] = min_dist + +def _suppress_trailer_mode_warning(values, CS): + # Logs from IONIQ 9 show ALERTS_5=6 is the periodic + # "driver assistance limited in trailer mode" popup. + if CS.trailer_connected and values.get("ALERTS_5") == 6: + values["ALERTS_5"] = 0 + +def _make_ccnc_values(values, CS, lat_active, frame, hud_control, + lane_line=True, corner_radar=True, + desire=0, + blink_pairs=None, + blink_t=1.0): + if lane_line: + curvature = round(CS.out.steeringAngleDeg / 3) + mag = min(abs(curvature), 15) + curv = mag + (-1 if curvature < 0 else 0) + direction = 1 if curvature < 0 else 0 + values["LANELINE_CURVATURE"] = curv if lat_active else 0 + values["LANELINE_CURVATURE_DIRECTION"] = direction if lat_active else 0 + if desire: + _apply_lane_desire(values, desire) + + if corner_radar: + radar_all = [ + ('LF_DETECT', 'LF_DETECT_DISTANCE'), + ('RF_DETECT', 'RF_DETECT_DISTANCE'), + ('LR_DETECT', 'LR_DETECT_DISTANCE'), + ('RR_DETECT', 'RR_DETECT_DISTANCE'), + ] + for det_key, dist_key in radar_all: + if values[det_key] >= 4 and values[dist_key] != 0: + values[det_key] = 1 + + if blink_pairs: + _apply_radar_blink(values, blink_pairs, frame, t=blink_t) + +def create_ccnc_messages(CP, packer, CAN, frame, CC, CS, hud_control, + disp_angle, left_lane_warning, right_lane_warning, + enable_corner_radar, stopping, canfd_debug): + ret = [] + + md = CS.modelV2 + if not hasattr(create_ccnc_messages, '_lane_line_check') or frame % 100 == 0: + create_ccnc_messages._lane_line_check = Params().get_int("LaneLineCheck") + lane_line_check = create_ccnc_messages._lane_line_check + desire, lane_changing = _get_desire_and_lane_changing(md) + + if CP.flags & HyundaiFlags.CAMERA_SCC.value: + HDA_CntrlModSta = 0 + HDA_LFA_SymSta = 0 + if CS.lfahda_cluster is not None: + HDA_CntrlModSta = CS.lfahda_cluster["HDA_CntrlModSta"] + HDA_LFA_SymSta = CS.lfahda_cluster["HDA_LFA_SymSta"] + + if frame % 2 == 0: + #if CS.adrv_0x160 is not None: + # values = copy.copy(CS.adrv_0x160) + # ret.append(packer.make_can_msg("ADRV_0x160", CAN.ECAN, values)) + + if CS.cruise_buttons_msg is not None: + values = copy.copy(CS.cruise_buttons_msg) + # Keep the physical long press on ECAN for CarState, but don't forward it to CAM. + values["NORMAL_CRUISE_MAIN_BTN"] = 0 + + if HDA_LFA_SymSta == 0 and 0 < frame % 200 < 12: + values["LFA_BTN"] = 1 + + if CC.enabled: + if not CS.MainMode_ACC: + if 10 < frame % 200 <= 16 and CS.out.vEgo > 3.: + values["ADAPTIVE_CRUISE_MAIN_BTN"] = 1 + elif CS.ACCMode in [0, 4]: + if 10 < frame % 200 <= 16 and CS.out.vEgo > 3.: + values["CRUISE_BUTTONS"] = 2 + elif CS.scc_control is not None and CS.scc_control["InfoDisplay"] == 4: + if 10 < frame % 30 <= 16 and not stopping: + values["CRUISE_BUTTONS"] = 2 + else: + if CS.adrv_0x1ea is not None and CS.adrv_0x1ea["HDA_MODE2"] == 0: # if corner radar is disabled, send main btn + if 10 < frame % 1000 <= 16 and CS.out.vEgo > 3: + values["ADAPTIVE_CRUISE_MAIN_BTN"] = 1 + + ret.append(packer.make_can_msg(CS.cruise_btns_msg_canfd, CAN.CAM, values)) + + # --- 0x161/0x200/0x1ea/0x162 (frame%5) --- + if frame % 5 == 0: + lat_active = CC.latActive + + if CS.adrv_0x161 is not None: + main_enabled = CS.out.cruiseState.available + cruise_enabled = CC.enabled + lat_enabled = CS.out.latEnabled + nav_active = hud_control.activeCarrot > 1 + + # hdpuse carrot + hdp_use = int(Params().get("HDPuse")) + hdp_active = False + if hdp_use == 1: + hdp_active = cruise_enabled and nav_active + elif hdp_use == 2: + hdp_active = cruise_enabled + # hdpuse carrot + + values = copy.copy(CS.adrv_0x161) + rx_counter = values.pop("COUNTER", None) + values["SETSPEED"] = (6 if hdp_active else 3 if cruise_enabled else 1) if main_enabled else 0 + values["SETSPEED_HUD"] = (5 if hdp_active else 3 if cruise_enabled else 1) if main_enabled else 0 + + set_speed_in_units = hud_control.setSpeed * (CV.MS_TO_KPH if CS.is_metric else CV.MS_TO_MPH) + values["vSetDis"] = int(set_speed_in_units + 0.5) + + values["DISTANCE"] = 4 if hdp_active else hud_control.leadDistanceBars + values["DISTANCE_LEAD"] = 2 if cruise_enabled and hud_control.leadVisible else 1 if main_enabled and hud_control.leadVisible else 0 + values["DISTANCE_CAR"] = 3 if hdp_active else 2 if cruise_enabled else 1 if main_enabled else 0 + values["DISTANCE_SPACING"] = 5 if hdp_active else 1 if cruise_enabled else 0 + + values["TARGET"] = 1 if hud_control.leadVisible and cruise_enabled else 0 + values["TARGET_DISTANCE"] = int(hud_control.leadDistance) + + values["BACKGROUND"] = 6 if CS.paddle_button_prev > 0 else 1 if cruise_enabled else 3 if lat_active else 7 + values["CENTERLINE"] = 1 if HDA_CntrlModSta > 0 else 0 + values["CAR_CIRCLE"] = 2 if hdp_active else 1 if cruise_enabled else 0 + + values["NAV_ICON"] = 2 if nav_active and cruise_enabled else 1 if main_enabled and nav_active else 0 + values["HDA_ICON"] = 5 if hdp_active else 2 if cruise_enabled else 1 if main_enabled else 0 + values["LFA_ICON"] = 5 if hdp_active else 2 if lat_active else 1 if lat_enabled else 0 + values["LKA_ICON"] = 4 if lat_active else 3 if lat_enabled else 0 + values["FCA_ALT_ICON"] = 0 + + if values["ALERTS_2"] in [1, 2, 5, 6, 10, 21, 22]: + values["ALERTS_2"] = 0 + values["DAW_ICON"] = 0 + + if values["ALERTS_1"] == 0: # alerts가 ėžˆėœŧ늴 ė‚Ŧėš´ë“œë„ ę°™ė´ ë‚˜ė˜´ + values["SOUNDS_1"] = 0 + values["SOUNDS_2"] = 0 + values["SOUNDS_4"] = 0 + + if values["ALERTS_3"] in [3, 4, 11, 12, 13, 14, 17, 19, 20, 26, 27, 28, 7, 8, 9, 10]: # hide gap distance msg.(11,12,13,14), lanechange(19,20,27, 28) + values["ALERTS_3"] = 0 + values["SOUNDS_3"] = 0 + + if values["ALERTS_5"] in [1, 2, 3, 4, 5]: + values["ALERTS_5"] = 0 + + if values["ALERTS_5"] in [11] and CS.softHoldActive == 0: + values["ALERTS_5"] = 0 + + # curvature í‘œė‹œ(0x161ėĒŊ ę¸°ėĄ´ ëĄœė§ ėœ ė§€) + _suppress_trailer_mode_warning(values, CS) + + curvature = round(CS.out.steeringAngleDeg / 3) + values["LANELINE_CURVATURE"] = (min(abs(curvature), 15) + (-1 if curvature < 0 else 0)) if lat_active else 0 + values["LANELINE_CURVATURE_DIRECTION"] = 1 if curvature < 0 and lat_active else 0 + + trailer_lane_change_blocked = CS.trailer_connected + if trailer_lane_change_blocked: + values["LANELINE_LEFT"] = 2 if hud_control.leftLaneVisible else 0 + values["LANELINE_RIGHT"] = 2 if hud_control.rightLaneVisible else 0 + else: + lane_color = 6 if md is not None and md.meta.laneChangeAvailableLeft else 2 + if lane_line_check >= 1: + lane_line_warn_left = CS.out.leftLaneLine % 10 not in (0, 5) + else: + lane_line_warn_left = CS.out.leftLaneLine // 10 == 2 + lane_color = 4 if lane_line_warn_left or CS.out.leftBlindspot else lane_color + if hud_control.leftLaneDepart: + values["LANELINE_LEFT"] = 4 if (frame // 50) % 2 == 0 else 1 + else: + values["LANELINE_LEFT"] = lane_color if hud_control.leftLaneVisible else 0 + + lane_color = 6 if md is not None and md.meta.laneChangeAvailableRight else 2 + if lane_line_check >= 1: + lane_line_warn_right = CS.out.rightLaneLine % 10 not in (0, 5) + else: + lane_line_warn_right = CS.out.rightLaneLine // 10 == 2 + lane_color = 4 if lane_line_warn_right or CS.out.rightBlindspot else lane_color + if hud_control.rightLaneDepart: + values["LANELINE_RIGHT"] = 4 if (frame // 50) % 2 == 0 else 1 + else: + values["LANELINE_RIGHT"] = lane_color if hud_control.rightLaneVisible else 0 + + values["LCA_LEFT_ARROW"] = 2 if CS.out.leftBlinker else 0 + values["LCA_RIGHT_ARROW"] = 2 if CS.out.rightBlinker else 0 + + if trailer_lane_change_blocked: + values["LCA_LEFT_ICON"] = 1 if lat_active else 0 + values["LCA_RIGHT_ICON"] = 1 if lat_active else 0 + else: + values["LCA_LEFT_ICON"] = (1 if CS.out.leftBlindspot else 2) if lat_active else 0 + values["LCA_RIGHT_ICON"] = (1 if CS.out.rightBlindspot else 2) if lat_active else 0 + + values["LANE_LEFT"] = 0 if trailer_lane_change_blocked else 1 if desire in (1, 3) else 0 + values["LANE_RIGHT"] = 0 if trailer_lane_change_blocked else 1 if desire in (2, 4) else 0 + + ret.append(packer.make_can_msg("ADRV_0x161", CAN.ECAN, values, rx_counter = rx_counter)) + + if CS.adrv_0x200 is not None: + values = copy.copy(CS.adrv_0x200) + rx_counter = values.pop("COUNTER", None) + values["TauGapSet"] = hud_control.leadDistanceBars + ret.append(packer.make_can_msg("ADRV_0x200", CAN.ECAN, values, rx_counter = rx_counter)) + + if CS.adrv_0x1ea is not None: + values = copy.copy(CS.adrv_0x1ea) + rx_counter = values.pop("COUNTER", None) + # blinker hold + values['LEFT_BLINK_HOLD'] = 1 if lane_changing == 3 else 0 + values['RIGHT_BLINK_HOLD'] = 1 if lane_changing == 4 else 0 + + _make_ccnc_values( + values, CS, lat_active, frame, hud_control, + lane_line=True, + corner_radar=True, + desire=desire, + # ę¸°ėĄ´ëŒ€ëĄœ LR/RR만 ęšœëšĄėž„ + blink_pairs=[('LR_DETECT', 'LR_DETECT_DISTANCE'), + ('RR_DETECT', 'RR_DETECT_DISTANCE')], + blink_t=1.0 + ) + + ret.append(packer.make_can_msg("ADRV_0x1ea", CAN.ECAN, values, rx_counter = rx_counter)) + + if CS.ccnc_0x162 is not None: + values = copy.copy(CS.ccnc_0x162) + + if hud_control.leadDistance > 0: + values["FF_DISTANCE"] = hud_control.leadDistance + ff_type = 3 if hud_control.leadRadar == 1 else 13 + values["FF_DETECT"] = ff_type if hud_control.leadRelSpeed > -0.1 else ff_type + 1 + + _make_ccnc_values( + values, CS, lat_active, frame, hud_control, + lane_line=False, + corner_radar=True, + desire=0, + # í•„ėš”í•˜ëŠ´ 162도 ęšœëšĄėž„ ė ėšŠ(ė›ëž˜ ėŊ”ë“œė˛˜ëŸŧ LR/RR만) + blink_pairs=[('LR_DETECT', 'LR_DETECT_DISTANCE'), + ('RR_DETECT', 'RR_DETECT_DISTANCE')], + blink_t=1.0 + ) + + if (left_lane_warning and not CS.out.leftBlinker) or (right_lane_warning and not CS.out.rightBlinker): + values["VIBRATE"] = 1 + + if canfd_debug > 0: + values["FAULT_LSS"] = 0 + values["FAULT_DAS"] = 0 + + ret.append(packer.make_can_msg("CCNC_0x162", CAN.ECAN, values)) + + # --- NEW_MSG_4B9 (corner radar keep-alive?) --- + if enable_corner_radar > 0: + if HDA_CntrlModSta == 0: + if frame % 500 in [10, 20, 30]: + values = { + 'BYTE_1': 0, + 'BYTE_2': 0, + 'BYTE_3': 0x80, + 'BYTE_4': 0x8A, + 'BYTE_5': 0x32, + 'BYTE_6': 0x30, + 'BYTE_7': 0x01, + 'BYTE_8': 0x00, + } + ret.append(packer.make_can_msg("NEW_MSG_4B9", CAN.CAM, values)) + elif frame % 500 in [40, 50, 60]: + values = { + 'BYTE_1': 0xff, + 'BYTE_2': 0xff, + 'BYTE_3': 0xff, + 'BYTE_4': 0xff, + 'BYTE_5': 0xff, + 'BYTE_6': 0xff, + 'BYTE_7': 0xff, + 'BYTE_8': 0xff, + } + ret.append(packer.make_can_msg("NEW_MSG_4B9", CAN.CAM, values)) + + if False: # canfd_debug > 1 and frame % 20 == 0: + if CS.hda_info_4a3 is not None: + values = copy.copy(CS.hda_info_4a3) + values["LinkClass"] = 1 + values["SPEED_LIMIT"] = 100 + ret.append(packer.make_can_msg("HDA_INFO_4A3", CAN.CAM, values)) + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/interface.py b/artifacts/package_runtime/iqdbc/car/hyundai/interface.py new file mode 100644 index 000000000..d091d34d1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/interface.py @@ -0,0 +1,315 @@ +from iqdbc.car import Bus, get_safety_config, structs +from iqdbc.car.hyundai.hyundaicanfd import CanBus +from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiFlagsIQ, CAR, DBC, CANFD_RADAR_SCC_CAR, \ + CANFD_UNSUPPORTED_LONGITUDINAL_CAR, \ + UNSUPPORTED_LONGITUDINAL_CAR, HyundaiSafetyFlags, HyundaiSafetyFlagsIQ, HyundaiExtFlags, \ + CANFD_HYBRID_STATUS_ADDR, CANFD_HYBRID_STATUS_DLC, \ + EV_MODE_STATUS_ADDR, EV_MODE_STATUS_DLC +from iqdbc.car.hyundai.radar_interface import RADAR_START_ADDR +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.disable_ecu import disable_ecu +from iqdbc.car.hyundai.carcontroller import CarController +from iqdbc.car.hyundai.carstate import CarState +from iqdbc.car.hyundai.radar_interface import RadarInterface + +from iqpilot.common.params import Params + +ButtonType = structs.CarState.ButtonEvent.Type +Ecu = structs.CarParams.Ecu + +# Cancel button can sometimes be ACC pause/resume button, main button can also enable on some cars +ENABLE_BUTTONS = (ButtonType.accelCruise, ButtonType.decelCruise, ButtonType.cancel, ButtonType.mainCruise) + +SteerControlType = structs.CarParams.SteerControlType + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + + params = Params() + camera_scc = params.get_int("HyundaiCameraSCC") + if camera_scc > 0: + ret.flags |= HyundaiFlags.CAMERA_SCC.value + print("$$$CAMERA_SCC toggled...") + + ret.brand = "hyundai" + + if candidate == CAR.KIA_SORENTO: + ret.extFlags |= HyundaiExtFlags.RADAR_GROUP4.value + + cam_can = CanBus(None, fingerprint).CAM if camera_scc == 0 else 1 + hda2 = 0x50 in fingerprint[cam_can] or 0x110 in fingerprint[cam_can] or params.get_int("CanfdHDA2") > 0 + CAN = CanBus(None, fingerprint, hda2) + + if ret.flags & HyundaiFlags.CANFD: + # Shared configuration for CAN-FD cars + ret.alphaLongitudinalAvailable = True #candidate not in (CANFD_UNSUPPORTED_LONGITUDINAL_CAR | CANFD_RADAR_SCC_CAR) + #ret.enableBsm = 0x1e5 in fingerprint[CAN.ECAN] + ret.enableBsm = 0x1ba in fingerprint[CAN.ECAN] # BLINDSPOTS_REAR_CORNERS 0x1ba(442) + + if 0x105 in fingerprint[CAN.ECAN]: + ret.flags |= HyundaiFlags.HYBRID.value + + # Keep drivetrain/safety classification unchanged: this capability is display-only and requires both exact ECAN frames. + has_ev_mode_status = fingerprint[CAN.ECAN].get(CANFD_HYBRID_STATUS_ADDR) == CANFD_HYBRID_STATUS_DLC and \ + fingerprint[CAN.ECAN].get(EV_MODE_STATUS_ADDR) == EV_MODE_STATUS_DLC + if has_ev_mode_status: + ret.extFlags |= HyundaiExtFlags.EV_MODE_STATUS_230.value + + if 203 in fingerprint[CAN.CAM]: # LFA_ALT + print("##### Anglecontrol detected (LFA_ALT)") + ret.flags |= HyundaiFlags.ANGLE_CONTROL.value + + print("ACAN=", fingerprint[CAN.ACAN]) + + if 0x210 in fingerprint[CAN.ACAN]: + print("##### Radar Group 1 detected (0x210)") + ret.extFlags |= HyundaiExtFlags.RADAR_GROUP1.value + elif 0x400 in fingerprint[CAN.ACAN] and 0x41D in fingerprint[CAN.ACAN]: + print("##### Radar Group 3 detected (0x400-0x41D)") + ret.extFlags |= HyundaiExtFlags.RADAR_GROUP3.value + if all(fingerprint[CAN.ACAN].get(addr) == 32 for addr in range(0x235, 0x249)): + ret.extFlags |= HyundaiExtFlags.CORNER_RADAR_OBJECTS_235.value + print("##### Corner radar objects 0x235 group detected") + if all(fingerprint[CAN.ACAN].get(addr) == 32 for addr in range(0x180, 0x185)): + ret.extFlags |= HyundaiExtFlags.CORNER_RADAR_OBJECTS_180.value + print("##### Corner radar objects 0x180 group detected") + if all(fingerprint[CAN.ACAN].get(addr) == 32 for addr in tuple(range(0x430, 0x438)) + tuple(range(0x440, 0x448))): + ret.extFlags |= HyundaiExtFlags.CORNER_RADAR_OBJECTS_430.value + print("##### Corner radar objects 0x430/0x440 group detected") + + # detect HDA2 with ADAS Driving ECU + if hda2: + print("$$$CANFD HDA2") + ret.flags |= HyundaiFlags.CANFD_HDA2.value + if camera_scc > 0: + if 0x110 in fingerprint[CAN.ACAN]: + ret.flags |= HyundaiFlags.CANFD_HDA2_ALT_STEERING.value + print("$$$CANFD ALT_STEERING1") + else: + if 0x110 in fingerprint[CAN.CAM]: # 0x110(272): LKAS_ALT + ret.flags |= HyundaiFlags.CANFD_HDA2_ALT_STEERING.value + print("$$$CANFD ALT_STEERING1") + ## carrot_todo: sorento: + if 0x2a4 not in fingerprint[CAN.CAM]: # 0x2a4(676): CAM_0x2a4 + ret.flags |= HyundaiFlags.CANFD_HDA2_ALT_STEERING.value + print("$$$CANFD ALT_STEERING2") + + ## carrot: canival 4th, no 0x1cf + if 0x1cf not in fingerprint[CAN.ECAN]: # 0x1cf(463): CRUISE_BUTTONS + ret.flags |= HyundaiFlags.CANFD_ALT_BUTTONS.value + print("$$$CANFD ALT_BUTTONS") + else: + # non-HDA2 + print("$$$CANFD non HDA2") + if 0x1cf not in fingerprint[CAN.ECAN]: + ret.flags |= HyundaiFlags.CANFD_ALT_BUTTONS.value + print("$$$CANFD ALT_BUTTONS") + if not ret.flags & HyundaiFlags.RADAR_SCC: + ret.flags |= HyundaiFlags.CANFD_CAMERA_SCC.value + #if not ret.flags & HyundaiFlags.RADAR_SCC: + # ret.flags |= HyundaiFlags.CANFD_CAMERA_SCC.value + # print("$$$CANFD CAMERA_SCC") + # Some HDA2 cars have alternative messages for gear checks + # ICE cars do not have 0x130; GEARS message on 0x40 or 0x70 instead + if 0x40 in fingerprint[CAN.ECAN]: # 0x40(64): GEAR_ALT + ret.flags |= HyundaiFlags.CANFD_ALT_GEARS.value + print("$$$CANFD ALT_GEARS") + elif 69 in fingerprint[CAN.ECAN]: # Special case + ret.extFlags |= HyundaiExtFlags.CANFD_GEARS_69.value + print("$$$CANFD GEARS_69") + elif 112 in fingerprint[CAN.ECAN]: # carrot: eGV70 + ret.flags |= HyundaiFlags.CANFD_ALT_GEARS_2.value + print("$$$CANFD ALT_GEARS_2") + elif 0x130 in fingerprint[CAN.ECAN]: # 0x130(304): GEAR_SHIFTER + print("$$$CANFD GEAR_SHIFTER present") + else: + ret.extFlags |= HyundaiExtFlags.CANFD_GEARS_NONE.value + print("$$$CANFD GEARS_NONE") + + cfgs = [get_safety_config(structs.CarParams.SafetyModel.hyundaiCanfd), ] + if CAN.ECAN >= 4: + cfgs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput)) + ret.safetyConfigs = cfgs + + if ret.flags & HyundaiFlags.CANFD_HDA2: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_LKA_STEERING.value + if ret.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT.value + if ret.flags & HyundaiFlags.CANFD_ALT_BUTTONS: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_ALT_BUTTONS.value + if ret.flags & HyundaiFlags.CANFD_CAMERA_SCC: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value + + else: + # Shared configuration for non CAN-FD cars + ret.alphaLongitudinalAvailable = True #candidate not in (UNSUPPORTED_LONGITUDINAL_CAR | CAMERA_SCC_CAR) + ret.enableBsm = 0x58b in fingerprint[0] + print(f"$$$ enableBsm = {ret.enableBsm}") + + # Send LFA message on cars with HDA + if 0x485 in fingerprint[2]: + ret.flags |= HyundaiFlags.SEND_LFA.value + print("$$$SEND_LFA") + + # These cars use the FCA11 message for the AEB and FCW signals, all others use SCC12 + if 0x38d in fingerprint[0] or 0x38d in fingerprint[2]: + ret.flags |= HyundaiFlags.USE_FCA.value + print("$$$USE_FCA") + + if ret.flags & HyundaiFlags.LEGACY: + # these cars require a special panda safety mode due to missing counters and checksums in the messages + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.hyundaiLegacy)] + print("$$$Legacy Safety Model") + else: + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.hyundai, 0)] + + if ret.flags & HyundaiFlags.CAMERA_SCC: + ret.safetyConfigs[0].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value + print("$$$CAMERA_SCC") + + # Common lateral control setup + + ret.centerToFront = ret.wheelbase * 0.4 + ret.steerActuatorDelay = 0.1 + ret.steerLimitTimer = 0.4 + if ret.flags & HyundaiFlags.ANGLE_CONTROL: + ret.steerControlType = SteerControlType.angle + else: + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + if ret.flags & HyundaiFlags.ALT_LIMITS: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.ALT_LIMITS.value + + # Common longitudinal control setup + + ret.radarUnavailable = RADAR_START_ADDR not in fingerprint[1] or Bus.radar not in DBC[ret.carFingerprint] + ret.openpilotLongitudinalControl = alpha_long and ret.alphaLongitudinalAvailable + + # carrot, if camera_scc enabled, enable openpilotLongitudinalControl + enable_radar_tracks = params.get_int("EnableRadarTracks") + if ret.flags & HyundaiFlags.CAMERA_SCC.value or enable_radar_tracks > 0 or enable_radar_tracks == -2: + ret.radarUnavailable = False + ret.openpilotLongitudinalControl = True if camera_scc < 3 else False + print(f"$$$OenpilotLongitudinalControl = True, CAMERA_SCC({ret.flags & HyundaiFlags.CAMERA_SCC.value}) or RadarTracks{enable_radar_tracks}") + else: + print(f"$$$OenpilotLongitudinalControl = {alpha_long}") + + #ret.radarUnavailable = False # TODO: canfd... carrot, hyundai cars have radar + + ret.radarTimeStep = 0.05 #if params.get_int("EnableRadarTracks") > 0 else 0.02 + + ret.pcmCruise = not ret.openpilotLongitudinalControl + ret.startingState = False # True # carrot + ret.vEgoStarting = 0.1 + ret.startAccel = 1.0 + ret.longitudinalActuatorDelay = 0.5 + + ret.longitudinalTuning.kpBP = [0.] + ret.longitudinalTuning.kpV = [1.] + ret.longitudinalTuning.kf = 1.0 + + # *** feature detection *** + if ret.flags & HyundaiFlags.CANFD: + print(f"$$$$$ CanFD ECAN = {CAN.ECAN}") + if 0x1fa in fingerprint[CAN.ECAN]: + ret.extFlags |= HyundaiExtFlags.NAVI_CLUSTER.value + print("$$$$ NaviCluster = True") + else: + print("$$$$ NaviCluster = False") + + else: + if 1348 in fingerprint[0]: + ret.extFlags |= HyundaiExtFlags.NAVI_CLUSTER.value + print("$$$$ NaviCluster = True") + if 1157 in fingerprint[0] or 1157 in fingerprint[2]: + ret.extFlags |= HyundaiExtFlags.HAS_LFAHDA.value + print("$$$$ HasLFAHDA") + if 1007 in fingerprint[0]: + print("#### cruiseButtonAlt") + + print(f"$$$$ enableBsm = {ret.enableBsm}") + + if ret.openpilotLongitudinalControl: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.LONG.value + if ret.flags & HyundaiFlags.HYBRID: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.HYBRID_GAS.value + elif ret.flags & HyundaiFlags.EV: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.EV_GAS.value + elif ret.flags & HyundaiFlags.FCEV: + ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.FCEV_GAS.value + + # Car specific configuration overrides + + if candidate == CAR.KIA_OPTIMA_G4_FL: + ret.steerActuatorDelay = 0.2 + + # Dashcam cars are missing a test route, or otherwise need validation + # TODO: Optima Hybrid 2017 uses a different SCC12 checksum + #ret.dashcamOnly = candidate in {CAR.KIA_OPTIMA_H, } + + return ret + + @staticmethod + def _get_params_iq(stock_cp, ret, candidate, fingerprint, car_fw, alpha_long, is_release_iq, docs): + del candidate, car_fw, alpha_long, is_release_iq, docs + if not stock_cp.flags & HyundaiFlags.CANFD and 0x391 in fingerprint[0]: + ret.flags |= HyundaiFlagsIQ.HAS_LFA_BUTTON + ret.iqSafetyFlags |= HyundaiSafetyFlagsIQ.HAS_LDA_BUTTON + return ret + + @staticmethod + def init(CP, CP_IQ, can_recv, can_send): + del CP_IQ + + Params().put_int('LongitudinalPersonalityMax', 4) + + if CP.openpilotLongitudinalControl and not (CP.flags & HyundaiFlags.CANFD_CAMERA_SCC): + addr, bus = 0x7d0, 0 + if CP.flags & HyundaiFlags.CANFD_HDA2.value: + addr, bus = 0x730, CanBus(CP).ECAN + disable_ecu(can_recv, can_send, bus=bus, addr=addr, com_cont_req=b'\x28\x83\x01') + + params = Params() + if params.get_int("EnableRadarTracks") > 0 and not CP.flags & HyundaiFlags.CANFD: + result = enable_radar_tracks(CP, can_recv, can_send) + params.put_bool("EnableRadarTracksResult", result) + + # for blinkers + if CP.flags & HyundaiFlags.ENABLE_BLINKERS: + disable_ecu(can_recv, can_send, bus=CanBus(CP).ECAN, addr=0x7B1, com_cont_req=b'\x28\x83\x01') + +def enable_radar_tracks(CP, logcan, sendcan): + from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery + print("################ Try To Enable Radar Tracks ####################") + + ret = False + sccBus = 2 if CP.flags & HyundaiFlags.CAMERA_SCC.value else 0 + rdr_fw = None + rdr_fw_address = 0x7d0 # + try: + try: + query = IsoTpParallelQuery(sendcan, logcan, sccBus, [rdr_fw_address], [b'\x10\x07'], [b'\x50\x07']) + for addr, dat in query.get_data(0.1).items(): # pylint: disable=unused-variable + print("ecu write data by id ...") + new_config = b"\x00\x00\x00\x01\x00\x01" + #new_config = b"\x00\x00\x00\x00\x00\x01" + dataId = b'\x01\x42' + WRITE_DAT_REQUEST = b'\x2e' + WRITE_DAT_RESPONSE = b'\x68' + query = IsoTpParallelQuery(sendcan, logcan, sccBus, [rdr_fw_address], [WRITE_DAT_REQUEST+dataId+new_config], [WRITE_DAT_RESPONSE]) + result = query.get_data(0) + print("result=", result) + ret = True + break + except Exception as e: + print(f"Failed : {e}") + except Exception as e: + print("############## Failed to enable tracks" + str(e)) + print("################ END Try to enable radar tracks") + return ret diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/radar_interface.py b/artifacts/package_runtime/iqdbc/car/hyundai/radar_interface.py new file mode 100644 index 000000000..bf0fd2c73 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/radar_interface.py @@ -0,0 +1,885 @@ +import math +import os +from collections import deque + +from iqdbc import DBC_PATH +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.interfaces import RadarInterfaceBase +from iqdbc.car.hyundai.values import DBC, HyundaiFlags, HyundaiExtFlags +from iqpilot.common.params import Params +from iqdbc.car.hyundai.hyundaicanfd import CanBus +from iqpilot.common.filter_simple import MyMovingAverage + +SCC_TID = 0 +RADAR_START_ADDR = 0x500 +RADAR_MSG_COUNT = 32 +RADAR_MSG_COUNT4 = 8 +RADAR_GROUP4_MAX_LONG_DIST = 325.0 +RADAR_GROUP4_MAX_YREL = 6.0 +RADAR_START_ADDR_CANFD1 = 0x210 +RADAR_MSG_COUNT1 = 16 +RADAR_START_ADDR_CANFD2 = 0x3A5 # Group 2, Group 1: 0x210 2ę°œė”Š?ė–´???단 ëŗ´ëĨ˜. +RADAR_MSG_COUNT2 = 32 +RADAR_START_ADDR_CANFD3 = 0x400 +RADAR_MSG_COUNT3 = 30 +CORNER_OBJECT_235_START_ADDR = 0x235 +CORNER_OBJECT_235_MSG_COUNT = 20 +CORNER_OBJECT_235_TRACK_ID_OFFSET = 200 +CORNER_OBJECT_235_DBC = 'hyundai_canfd_corner_radar_235_generated' +CORNER_OBJECT_180_START_ADDR = 0x180 +CORNER_OBJECT_180_MSG_COUNT = 5 +CORNER_OBJECT_180_SLOTS_PER_MSG = 2 +CORNER_OBJECT_180_TRACK_ID_OFFSET = 240 +CORNER_OBJECT_180_DBC = 'hyundai_canfd_corner_radar_180_generated' +CORNER_OBJECT_430_LEFT_START_ADDR = 0x430 +CORNER_OBJECT_430_RIGHT_START_ADDR = 0x440 +CORNER_OBJECT_430_MSG_COUNT_PER_SIDE = 8 +CORNER_OBJECT_430_SLOTS_PER_MSG = 7 +CORNER_OBJECT_430_TRACK_ID_OFFSET = 300 +CORNER_OBJECT_430_DBC = 'hyundai_canfd_corner_radar_430_generated' +CORNER_OBJECT_430_EMPTY_RAW_VALUES = (0x010d1f40, 0x00010d1f) +CORNER_OBJECT_430_DEFAULT_DISTANCE_RAW_MIN = 2520 # 126.0 m +CORNER_OBJECT_430_DEFAULT_DISTANCE_RAW_MAX = 2600 # 130.0 m +CORNER_OBJECT_430_MAX_DREL = 120.0 +CORNER_OBJECT_430_MAX_TRACKS_PER_SIDE = 4 +CORNER_OBJECT_430_DT = 0.05 +CORNER_OBJECT_430_MAX_DREL_DELTA = 1.5 +CORNER_OBJECT_430_CANDIDATE_META_BYTE_3 = (2,) +CORNER_OBJECT_430_CANDIDATE_EXCLUDED_SLOTS = (1,) +CORNER_OBJECT_430_CANDIDATE_RAW_DELTA = 200 +CORNER_OBJECT_430_STRONG_META_BYTE_2 = (10,) +CORNER_OBJECT_430_WEAK_META_BYTE_2 = (5, 6, 7, 8, 9) +CORNER_OBJECT_430_STRONG_MIN_SUPPORT = 2 +CORNER_OBJECT_430_WEAK_MIN_SUPPORT = 3 +CORNER_OBJECT_430_CLUSTER_RAW_GAP = 200 +CORNER_OBJECT_430_TRACK_MATCH_MAX_DREL_DELTA = 3.0 +CORNER_OBJECT_430_MAX_ABS_VREL = 20.0 +CORNER_OBJECT_430_MAX_ABS_YVREL = 3.0 +CORNER_OBJECT_430_VREL_ALPHA = 0.35 +CORNER_OBJECT_430_YVREL_ALPHA = 0.35 +CORNER_OBJECT_430_LATERAL_CELL_MSG_WEIGHT = 0.35 +CORNER_OBJECT_430_LATERAL_CELL_SLOT_WEIGHT = 0.65 +CORNER_OBJECT_430_YREL_OFFSET = 5.8 +CORNER_OBJECT_430_YREL_SCALE = 1.1 +CORNER_OBJECT_430_RIGHT_CELL_MIRROR = 7.0 +CORNER_OBJECT_430_MIN_ABS_YREL = 0.8 +CORNER_OBJECT_430_MAX_ABS_YREL = 4.2 +CORNER_OBJECT_430_HISTORY_SIZE = 8 +CORNER_OBJECT_430_MIN_HISTORY = 5 +CORNER_OBJECT_430_MIN_INWARD_YREL_DELTA = 0.35 +CORNER_OBJECT_430_MIN_RECENT_INWARD_YREL_DELTA = 0.05 +CORNER_OBJECT_430_MIN_INWARD_RATIO = 0.65 +CORNER_OBJECT_430_INWARD_CENTER_ABS_YREL = 1.55 +CORNER_OBJECT_430_INWARD_KEEP_YVREL_ABS_YREL = 2.2 +CORNER_OBJECT_430_EARLY_INWARD_NONCENTER_FRAMES = 2 +CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL = 2.0 +CORNER_OBJECT_STABLE_TRACK_ID_START = 1000 +CORNER_SIDE_OBJECT_MAX_DREL = 0.2 +CORNER_SIDE_OBJECT_MIN_ABS_YREL = 1.4 +CORNER_SIDE_OBJECT_MAX_ABS_YREL = 4.5 + +# POC for parsing corner radars: https://github.com/commaai/openpilot/pull/24221/ + + +class CornerObjectTrackIdManager: + def __init__(self): + self.next_track_id = CORNER_OBJECT_STABLE_TRACK_ID_START + self.objects: dict[tuple[str, int], tuple[int, int]] = {} + + def get_track_id(self, source: str, object_id: int, age: int) -> int: + key = (source, object_id) + previous = self.objects.get(key) + if previous is None or age < previous[1]: + track_id = self.next_track_id + self.next_track_id += 1 + else: + track_id = previous[0] + self.objects[key] = (track_id, age) + return track_id + + def clear_source(self, source: str): + self.objects = {key: value for key, value in self.objects.items() if key[0] != source} + + +def corner_object_position_valid(d_rel: float, y_rel: float) -> bool: + normal_object = 0.2 < d_rel < 180.0 + clipped_side_object = ( + 0.0 <= d_rel <= CORNER_SIDE_OBJECT_MAX_DREL and + CORNER_SIDE_OBJECT_MIN_ABS_YREL <= abs(y_rel) <= CORNER_SIDE_OBJECT_MAX_ABS_YREL + ) + return (normal_object or clipped_side_object) and abs(y_rel) < 40.0 + + +def get_radar_can_parser(CP, radar_tracks, msg_start_addr, msg_count, radar_group4=False): + if not radar_tracks: + return None + #if Bus.radar not in DBC[CP.carFingerprint]: + # return None + print("RadarInterface: RadarTracks...") + + if CP.flags & HyundaiFlags.CANFD: + CAN = CanBus(CP) + messages = [(f"RADAR_TRACK_{addr:x}", 20) for addr in range(msg_start_addr, msg_start_addr + msg_count)] + return CANParser('hyundai_canfd_radar_generated', messages, CAN.ACAN) + else: + messages = [(f"RADAR_TRACK_{addr:x}", 20) for addr in range(msg_start_addr, msg_start_addr + msg_count)] + #return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, 1) + dbc_name = 'hyundai_kia_denso_front_radar_generated' if radar_group4 else 'hyundai_kia_mando_front_radar_generated' + return CANParser(dbc_name, messages, 1) + +def get_corner_object_can_parser(CP, enabled): + if not enabled or not (CP.flags & HyundaiFlags.CANFD): + return None + + dbc_path = os.path.join(DBC_PATH, f"{CORNER_OBJECT_235_DBC}.dbc") + if not os.path.exists(dbc_path): + print(f"RadarInterface: missing {CORNER_OBJECT_235_DBC}.dbc, 0x235 corner radar disabled") + return None + + CAN = CanBus(CP) + messages = [(f"CORNER_RADAR_235_OBJECTS_{addr:x}", 33) for addr in range(CORNER_OBJECT_235_START_ADDR, CORNER_OBJECT_235_START_ADDR + CORNER_OBJECT_235_MSG_COUNT)] + return CANParser(CORNER_OBJECT_235_DBC, messages, CAN.ACAN) + +def get_corner_object_180_can_parser(CP, enabled): + if not enabled or not (CP.flags & HyundaiFlags.CANFD): + return None + + dbc_path = os.path.join(DBC_PATH, f"{CORNER_OBJECT_180_DBC}.dbc") + if not os.path.exists(dbc_path): + print(f"RadarInterface: missing {CORNER_OBJECT_180_DBC}.dbc, 0x180 corner radar disabled") + return None + + CAN = CanBus(CP) + messages = [(f"CORNER_RADAR_180_OBJECTS_{addr:x}", 33) for addr in range(CORNER_OBJECT_180_START_ADDR, CORNER_OBJECT_180_START_ADDR + CORNER_OBJECT_180_MSG_COUNT)] + return CANParser(CORNER_OBJECT_180_DBC, messages, CAN.ACAN) + +def get_corner_object_430_can_parser(CP, enabled): + if not enabled or not (CP.flags & HyundaiFlags.CANFD): + return None + + dbc_path = os.path.join(DBC_PATH, f"{CORNER_OBJECT_430_DBC}.dbc") + if not os.path.exists(dbc_path): + print(f"RadarInterface: missing {CORNER_OBJECT_430_DBC}.dbc, 0x430/0x440 corner radar disabled") + return None + + CAN = CanBus(CP) + messages = [(f"CORNER_RADAR_430_OBJECTS_{addr:x}", 33) for addr in range(CORNER_OBJECT_430_LEFT_START_ADDR, CORNER_OBJECT_430_LEFT_START_ADDR + CORNER_OBJECT_430_MSG_COUNT_PER_SIDE)] + messages += [(f"CORNER_RADAR_430_OBJECTS_{addr:x}", 33) for addr in range(CORNER_OBJECT_430_RIGHT_START_ADDR, CORNER_OBJECT_430_RIGHT_START_ADDR + CORNER_OBJECT_430_MSG_COUNT_PER_SIDE)] + return CANParser(CORNER_OBJECT_430_DBC, messages, CAN.ACAN) + +def get_radar_can_parser_scc(CP): + CAN = CanBus(CP) + if CP.flags & HyundaiFlags.CANFD: + messages = [("SCC_CONTROL", 50)] + bus = CAN.ECAN + else: + messages = [("SCC11", 50)] + bus = CAN.ECAN + + print("$$$$$$$$ ECAN = ", CAN.ECAN) + bus = CAN.CAM if CP.flags & HyundaiFlags.CAMERA_SCC else bus + return CANParser(DBC[CP.carFingerprint][Bus.pt], messages, bus) + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ=None): + super().__init__(CP, CP_IQ or structs.IQCarParams()) + self.v_ego = 0.0 + + self.canfd = True if CP.flags & HyundaiFlags.CANFD else False + self.radar_group1 = False + self.radar_group3 = False + self.radar_group4 = not self.canfd and bool(CP.extFlags & HyundaiExtFlags.RADAR_GROUP4.value) + if self.canfd: + if CP.extFlags & HyundaiExtFlags.RADAR_GROUP1.value: + self.radar_start_addr = RADAR_START_ADDR_CANFD1 + self.radar_msg_count = RADAR_MSG_COUNT1 + self.radar_group1 = True + elif CP.extFlags & HyundaiExtFlags.RADAR_GROUP3.value: + self.radar_start_addr = RADAR_START_ADDR_CANFD3 + self.radar_msg_count = RADAR_MSG_COUNT3 + self.radar_group3 = True + else: + self.radar_start_addr = RADAR_START_ADDR_CANFD2 + self.radar_msg_count = RADAR_MSG_COUNT2 + else: + self.radar_start_addr = RADAR_START_ADDR + self.radar_msg_count = RADAR_MSG_COUNT4 if self.radar_group4 else RADAR_MSG_COUNT + + self.params = Params() + self.radar_tracks = self.params.get_int("EnableRadarTracks") >= 1 + self.corner_object_tracks = bool(CP.extFlags & HyundaiExtFlags.CORNER_RADAR_OBJECTS_235.value) and self.params.get_int("EnableCornerRadar") > 0 + self.corner_object_180_tracks = bool(CP.extFlags & HyundaiExtFlags.CORNER_RADAR_OBJECTS_180.value) and self.params.get_int("EnableCornerRadar") > 0 + self.corner_object_430_tracks = bool(CP.extFlags & HyundaiExtFlags.CORNER_RADAR_OBJECTS_430.value) and self.params.get_int("EnableCornerRadar") > 0 + self.updated_tracks = set() + self.updated_scc = set() + self.updated_corner_objects = set() + self.updated_corner_objects_180 = set() + self.updated_corner_objects_430 = set() + self.corner_object_missed_updates = 0 + self.corner_object_180_missed_updates = 0 + self.corner_object_430_missed_updates = 0 + self.corner_object_track_ids = CornerObjectTrackIdManager() + self.rcp_tracks = get_radar_can_parser(CP, self.radar_tracks, self.radar_start_addr, self.radar_msg_count, self.radar_group4) + self.rcp_corner_objects = get_corner_object_can_parser(CP, self.corner_object_tracks) + self.rcp_corner_objects_180 = get_corner_object_180_can_parser(CP, self.corner_object_180_tracks) + self.rcp_corner_objects_430 = get_corner_object_430_can_parser(CP, self.corner_object_430_tracks) + # Enabling raw radar tracks on legacy CAN disables the stock SCC11 stream on + # some Hyundai/Kia platforms. Camera-SCC cars may still use SCC11. + use_scc_parser = not (self.radar_tracks and not self.canfd and not (CP.flags & HyundaiFlags.CAMERA_SCC)) + self.rcp_scc = get_radar_can_parser_scc(CP) if use_scc_parser else None + self.trigger_msg_scc = 416 if self.canfd else 0x420 + + self.trigger_msg_tracks = self.radar_start_addr + self.radar_msg_count - 1 + self.trigger_msg_corner_objects = CORNER_OBJECT_235_START_ADDR + CORNER_OBJECT_235_MSG_COUNT - 1 + self.trigger_msg_corner_objects_180 = CORNER_OBJECT_180_START_ADDR + CORNER_OBJECT_180_MSG_COUNT - 1 + self.trigger_msg_corner_objects_430 = CORNER_OBJECT_430_RIGHT_START_ADDR + CORNER_OBJECT_430_MSG_COUNT_PER_SIDE - 1 + self.track_id = 0 + + self.corner_objects_available = self.rcp_corner_objects is not None or self.rcp_corner_objects_180 is not None or self.rcp_corner_objects_430 is not None + self.radar_off_can = CP.radarUnavailable and not self.corner_objects_available + print( + "RadarInterface: " + f"radarUnavailable={CP.radarUnavailable} radarTracks={self.radar_tracks} " + f"group4={self.radar_group4} " + f"corner235={self.rcp_corner_objects is not None} corner180={self.rcp_corner_objects_180 is not None} " + f"corner430={self.rcp_corner_objects_430 is not None} " + f"radarOffCan={self.radar_off_can}" + ) + + self.vRel_last = 0 + self.dRel_last = 0 + self.corner_object_430_prev_d_rel = {} + self.corner_object_430_prev_v_rel = {} + self.corner_object_430_prev_y_rel = {} + self.corner_object_430_prev_yv_rel = {} + self.corner_object_430_prev_code = {} + self.corner_object_430_history = {} + self.corner_object_430_noncenter_inward_frames = {} + + # Initialize pts + if self.rcp_tracks is not None: + total_tracks = self.radar_msg_count * (2 if self.radar_group1 else 1) + for track_id in range(total_tracks): + t_id = track_id + 32 + self.pts[t_id] = structs.RadarData.RadarPoint() + self.pts[t_id].measured = False + self.pts[t_id].trackId = t_id + + if self.rcp_scc is not None: + self.pts[SCC_TID] = structs.RadarData.RadarPoint() + self.pts[SCC_TID].trackId = SCC_TID + self.pts[SCC_TID].radarSource = "scc" + if self.rcp_corner_objects is not None: + for slot in range(CORNER_OBJECT_235_MSG_COUNT): + t_id = CORNER_OBJECT_235_TRACK_ID_OFFSET + slot + self.pts[t_id] = structs.RadarData.RadarPoint() + self.pts[t_id].measured = False + self.pts[t_id].trackId = t_id + self.pts[t_id].radarSource = "corner235" + if self.rcp_corner_objects_180 is not None: + for slot in range(CORNER_OBJECT_180_MSG_COUNT * CORNER_OBJECT_180_SLOTS_PER_MSG): + t_id = CORNER_OBJECT_180_TRACK_ID_OFFSET + slot + self.pts[t_id] = structs.RadarData.RadarPoint() + self.pts[t_id].measured = False + self.pts[t_id].trackId = t_id + self.pts[t_id].radarSource = "corner180" + if self.rcp_corner_objects_430 is not None: + for slot in range(CORNER_OBJECT_430_MSG_COUNT_PER_SIDE * 2 * CORNER_OBJECT_430_SLOTS_PER_MSG): + t_id = CORNER_OBJECT_430_TRACK_ID_OFFSET + slot + self.pts[t_id] = structs.RadarData.RadarPoint() + self.pts[t_id].measured = False + self.pts[t_id].trackId = t_id + + self.frame = 0 + + + def update(self, can_strings): + self.frame += 1 + if self.radar_off_can or (self.rcp_tracks is None and self.rcp_scc is None and self.rcp_corner_objects is None and self.rcp_corner_objects_180 is None and self.rcp_corner_objects_430 is None): + return super().update(None) + + if self.rcp_scc is not None: + vls_s = self.rcp_scc.update(can_strings) + self.updated_scc.update(vls_s) + + track_ready = False + if self.radar_tracks and self.rcp_tracks is not None: + vls_t = self.rcp_tracks.update(can_strings) + self.updated_tracks.update(vls_t) + track_ready = self.trigger_msg_tracks in self.updated_tracks + + corner_ready = False + if self.rcp_corner_objects is not None: + vls_c = self.rcp_corner_objects.update(can_strings) + self.updated_corner_objects.update(vls_c) + corner_ready = self.trigger_msg_corner_objects in self.updated_corner_objects + + corner_180_ready = False + if self.rcp_corner_objects_180 is not None: + vls_180 = self.rcp_corner_objects_180.update(can_strings) + self.updated_corner_objects_180.update(vls_180) + corner_180_ready = self.trigger_msg_corner_objects_180 in self.updated_corner_objects_180 + + corner_430_ready = False + if self.rcp_corner_objects_430 is not None: + vls_430 = self.rcp_corner_objects_430.update(can_strings) + self.updated_corner_objects_430.update(vls_430) + corner_430_ready = self.trigger_msg_corner_objects_430 in self.updated_corner_objects_430 + + scc_ready = not self.radar_tracks and self.frame % 5 == 0 and self.rcp_scc is not None + + if track_ready: + self._update(self.updated_tracks) + self.updated_tracks.clear() + + if corner_ready: + self._update_corner_objects(self.updated_corner_objects) + self.corner_object_missed_updates = 0 + self.updated_corner_objects.clear() + + if corner_180_ready: + self._update_corner_objects_180(self.updated_corner_objects_180) + self.corner_object_180_missed_updates = 0 + self.updated_corner_objects_180.clear() + + if corner_430_ready: + self._update_corner_objects_430(self.updated_corner_objects_430) + self.corner_object_430_missed_updates = 0 + self.updated_corner_objects_430.clear() + + # Corner radar runs at its own cadence. Do not let corner-only frames publish + # RadarData, since liveTracks uses a fixed radarTimeStep for aLead/jLead. + publish_ready = track_ready or scc_ready + if not publish_ready: + return None + + if self.rcp_scc is not None: + self._update_scc(self.updated_scc) + if self.rcp_corner_objects is not None: + if self.updated_corner_objects: + self._update_corner_objects(self.updated_corner_objects) + self.corner_object_missed_updates = 0 + else: + self.corner_object_missed_updates += 1 + if self.corner_object_missed_updates > 10: + self._clear_corner_objects() + if self.rcp_corner_objects_180 is not None: + if self.updated_corner_objects_180: + self._update_corner_objects_180(self.updated_corner_objects_180) + self.corner_object_180_missed_updates = 0 + else: + self.corner_object_180_missed_updates += 1 + if self.corner_object_180_missed_updates > 10: + self._clear_corner_objects_180() + if self.rcp_corner_objects_430 is not None: + if self.updated_corner_objects_430: + self._update_corner_objects_430(self.updated_corner_objects_430) + self.corner_object_430_missed_updates = 0 + else: + self.corner_object_430_missed_updates += 1 + if self.corner_object_430_missed_updates > 10: + self._clear_corner_objects_430() + self.updated_scc.clear() + self.updated_corner_objects.clear() + self.updated_corner_objects_180.clear() + self.updated_corner_objects_430.clear() + + ret = structs.RadarData() + if ((self.rcp_tracks is not None and self.radar_tracks and not self.rcp_tracks.can_valid) or + (self.rcp_scc is not None and not self.corner_objects_available and not self.rcp_scc.can_valid) or + (self.rcp_corner_objects is not None and not self.rcp_corner_objects.can_valid) or + (self.rcp_corner_objects_180 is not None and not self.rcp_corner_objects_180.can_valid) or + (self.rcp_corner_objects_430 is not None and not self.rcp_corner_objects_430.can_valid)): + ret.errors.canError = True + ret.points = [point for point in self.pts.values() if point.measured] + return ret + + def _update(self, updated_messages): + + t_id = 32 + for addr in range(self.radar_start_addr, self.radar_start_addr + self.radar_msg_count): + + msg = self.rcp_tracks.vl[f"RADAR_TRACK_{addr:x}"] + + if self.radar_group1: + valid = msg['VALID_CNT1'] > 10 + elif self.radar_group3: + # Group 3 marks an empty object slot with LONG_DIST raw 0x7ff (204.7 m). + valid = msg['LONG_DIST'] < 204.7 + elif self.canfd: + valid = msg['VALID_CNT'] > 10 + elif self.radar_group4: + # EN: DNMWR006 exposes eight stable tracked-object slots at 0x500-0x507. + # Messages from 0x508 onward are distance-sorted raw detections without + # stable IDs, so they are excluded. OBJECT_STATE 3 is a confirmed track; + # empty slots use LONG_DIST raw 0xfff8 (409.55 m). Driving logs reached + # 317.80 m, so 325 m preserves every observed confirmed track while + # retaining margin from the empty-slot sentinel. Keep the +/-6 m + # ego/adjacent-lane envelope to suppress farther roadside reflections. + # KO: DNMWR006ė˜ ė•ˆė •ė ė¸ ėļ”렁 ę°ė˛´ ėŠŦëĄ¯ė€ 0x500~0x507ė˜ 8ę°œėž„. + # 0x508 ė´í›„ ëŠ”ė‹œė§€ëŠ” ęŗ ė • ID가 ė—†ëŠ” ęą°ëĻŦ눜 raw detectionė´ë¯€ëĄœ ė œė™¸í•¨. + # OBJECT_STATE 3ė€ í™•ė • ėļ”렁 ę°ė˛´ė´ëŠ°, 뚈 ėŠŦëĄ¯ė€ LONG_DIST raw + # 0xfff8(409.55m)ė„ ė‚ŦėšŠí•¨. ėŖŧ행 ëĄœęˇ¸ė˜ ėĩœëŒ€ę°’ė€ 317.80mė˜€ėœŧë¯€ëĄœ + # 325m ėƒí•œėœŧ로 ę´€ė¸Ąëœ í™•ė • íŠ¸ëž™ė„ ëĒ¨ë‘ ëŗ´ėĄ´í•˜ëŠ´ė„œ 뚈 ėŠŦëĄ¯ 값ęŗŧ ėļŠëļ„한 + # ė—Ŧ뜠ëĨŧ í™•ëŗ´í•¨. ė›ęą°ëĻŦ ë„ëĄœëŗ€ 반ė‚ŦëĨŧ ė¤„ė´ę¸° ėœ„í•´ ėĸŒėš° 6m ë˛”ėœ„ëĨŧ ėœ ė§€í•¨. + valid = (msg['OBJECT_STATE'] == 3 and 0.2 < msg['LONG_DIST'] < RADAR_GROUP4_MAX_LONG_DIST and + abs(msg['LAT_DIST']) <= RADAR_GROUP4_MAX_YREL) + else: + valid = msg['STATE'] in (3, 4) + + self.pts[t_id].measured = bool(valid) + if not valid: + self.pts[t_id].dRel = 0 + self.pts[t_id].yRel = 0 + self.pts[t_id].vRel = 0 + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = 0 + elif self.radar_group1: + self.pts[t_id].dRel = msg['LONG_DIST1'] + self.pts[t_id].yRel = msg['LAT_DIST1'] + self.pts[t_id].vRel = msg['REL_SPEED1'] + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = msg['REL_ACCEL1'] + self.pts[t_id].yvRel = msg['LAT_SPEED1'] + elif self.canfd: + if self.radar_group3: + # Group 3 reports the object's center. Convert it to the rear surface to match SCC/vision dRel. + self.pts[t_id].dRel = max(0.0, msg['LONG_DIST'] - msg['OBJECT_LENGTH'] * 0.5 - 0.1) + else: + self.pts[t_id].dRel = msg['LONG_DIST'] + self.pts[t_id].yRel = msg['LAT_DIST'] + self.pts[t_id].vRel = msg['REL_SPEED'] + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = float('nan') if self.radar_group3 else msg['REL_ACCEL'] + self.pts[t_id].yvRel = 0.0 if self.radar_group3 else msg['LAT_SPEED'] + elif self.radar_group4: + self.pts[t_id].dRel = msg['LONG_DIST'] + self.pts[t_id].yRel = -msg['LAT_DIST'] + self.pts[t_id].vRel = msg['REL_SPEED'] + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = 0.0 + else: + azimuth = math.radians(msg['AZIMUTH']) + self.pts[t_id].dRel = math.cos(azimuth) * msg['LONG_DIST'] + self.pts[t_id].yRel = 0.5 * -math.sin(azimuth) * msg['LONG_DIST'] + self.pts[t_id].vRel = msg['REL_SPEED'] + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = msg['REL_ACCEL'] + self.pts[t_id].yvRel = 0.0 + + t_id += 1 + # radar group1? ?나??msg??2ę°œė˜ ?ė´?? ?ė–´?ėŒ. + if self.radar_group1: + for addr in range(self.radar_start_addr, self.radar_start_addr + self.radar_msg_count): + msg = self.rcp_tracks.vl[f"RADAR_TRACK_{addr:x}"] + + valid = msg['VALID_CNT2'] > 10 + self.pts[t_id].measured = bool(valid) + if not valid: + self.pts[t_id].dRel = 0 + self.pts[t_id].yRel = 0 + self.pts[t_id].vRel = 0 + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = 0 + else: + self.pts[t_id].dRel = msg['LONG_DIST2'] + self.pts[t_id].yRel = msg['LAT_DIST2'] + self.pts[t_id].vRel = msg['REL_SPEED2'] + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = msg['REL_ACCEL2'] + self.pts[t_id].yvRel = msg['LAT_SPEED2'] + + t_id += 1 + + def _update_corner_objects(self, updated_messages): + if self.rcp_corner_objects is None: + return + + if not updated_messages: + self._clear_corner_objects() + return + + candidates = [] + for slot, addr in enumerate(range(CORNER_OBJECT_235_START_ADDR, CORNER_OBJECT_235_START_ADDR + CORNER_OBJECT_235_MSG_COUNT)): + t_id = CORNER_OBJECT_235_TRACK_ID_OFFSET + slot + msg = self.rcp_corner_objects.vl[f"CORNER_RADAR_235_OBJECTS_{addr:x}"] + + d_rel = msg["OBJ_REL_POS_X"] + y_rel = msg["OBJ_REL_POS_Y"] + v_rel = msg["OBJ_REL_VEL_X"] + yv_rel = msg["OBJ_REL_VEL_Y"] + a_rel = msg["OBJ_REL_ACCEL_X"] + # Side objects are clipped to x=0 by the corner radar. Quality, identity, + # and lateral motion still describe a real object, so keep them for + # corner-confirmed front-radar association in radard. + valid = msg["OBJ_QUAL_LEVEL"] > 0 and corner_object_position_valid(d_rel, y_rel) and v_rel > -99.0 + + if not valid: + continue + candidates.append((t_id, int(msg["OBJ_OBJECT_ID"]), int(msg["OBJ_AGE"]), int(msg["OBJ_QUAL_LEVEL"]), + d_rel, y_rel, v_rel, yv_rel, a_rel)) + + self._apply_corner_objects("corner235", candidates, + range(CORNER_OBJECT_235_TRACK_ID_OFFSET, + CORNER_OBJECT_235_TRACK_ID_OFFSET + CORNER_OBJECT_235_MSG_COUNT)) + + def _update_corner_objects_180(self, updated_messages): + if self.rcp_corner_objects_180 is None: + return + + if not updated_messages: + self._clear_corner_objects_180() + return + + candidates = [] + for msg_index, addr in enumerate(range(CORNER_OBJECT_180_START_ADDR, CORNER_OBJECT_180_START_ADDR + CORNER_OBJECT_180_MSG_COUNT)): + msg = self.rcp_corner_objects_180.vl[f"CORNER_RADAR_180_OBJECTS_{addr:x}"] + for slot_index in range(CORNER_OBJECT_180_SLOTS_PER_MSG): + t_id = CORNER_OBJECT_180_TRACK_ID_OFFSET + msg_index * CORNER_OBJECT_180_SLOTS_PER_MSG + slot_index + prefix = f"SLOT{slot_index + 1}_" + d_rel = msg[f"{prefix}REL_POS_X"] + y_rel = msg[f"{prefix}REL_POS_Y"] + v_rel = msg[f"{prefix}REL_VEL_X"] + yv_rel = msg[f"{prefix}REL_VEL_Y"] + a_rel = msg[f"{prefix}REL_ACCEL_X"] + valid = msg[f"{prefix}QUAL_LEVEL"] > 0 and corner_object_position_valid(d_rel, y_rel) and v_rel > -99.0 + + if not valid: + continue + candidates.append((t_id, int(msg[f"{prefix}OBJECT_ID"]), int(msg[f"{prefix}AGE"]), int(msg[f"{prefix}QUAL_LEVEL"]), + d_rel, y_rel, v_rel, yv_rel, a_rel)) + + self._apply_corner_objects("corner180", candidates, + range(CORNER_OBJECT_180_TRACK_ID_OFFSET, + CORNER_OBJECT_180_TRACK_ID_OFFSET + CORNER_OBJECT_180_MSG_COUNT * CORNER_OBJECT_180_SLOTS_PER_MSG)) + + def _apply_corner_objects(self, source, candidates, slot_ids): + for t_id in slot_ids: + self._clear_point(t_id) + + # The same object can occupy two CAN slots for one cycle during a slot handoff. + # Publish only the newest/highest-quality copy so trackId stays unique. + objects = {} + for candidate in candidates: + object_id = candidate[1] + previous = objects.get(object_id) + if previous is None or (candidate[2], candidate[3]) > (previous[2], previous[3]): + objects[object_id] = candidate + + for t_id, object_id, age, _, d_rel, y_rel, v_rel, yv_rel, a_rel in objects.values(): + point = self.pts[t_id] + point.measured = True + point.trackId = self.corner_object_track_ids.get_track_id(source, object_id, age) + point.radarSource = source + point.dRel = d_rel + point.yRel = y_rel + point.vRel = v_rel + point.vLead = v_rel + self.v_ego + point.aRel = a_rel + point.yvRel = yv_rel + + + def _update_corner_objects_430(self, updated_messages): + if self.rcp_corner_objects_430 is None: + return + + if not updated_messages: + self._clear_corner_objects_430() + return + + bank_defs = ( + (CORNER_OBJECT_430_LEFT_START_ADDR, 1.0, 0), + (CORNER_OBJECT_430_RIGHT_START_ADDR, -1.0, CORNER_OBJECT_430_MSG_COUNT_PER_SIDE * CORNER_OBJECT_430_SLOTS_PER_MSG), + ) + for start_addr, side_sign, track_base in bank_defs: + bins = [] + for msg_index, addr in enumerate(range(start_addr, start_addr + CORNER_OBJECT_430_MSG_COUNT_PER_SIDE)): + msg = self.rcp_corner_objects_430.vl[f"CORNER_RADAR_430_OBJECTS_{addr:x}"] + for slot_index in range(CORNER_OBJECT_430_SLOTS_PER_MSG): + prefix = f"SLOT{slot_index + 1}_" + distance_raw = int(msg[f"{prefix}DISTANCE_RAW"]) + raw = ( + distance_raw | + (int(msg[f"{prefix}META_13_15"]) << 13) | + (int(msg[f"{prefix}META_BYTE_2"]) << 16) | + (int(msg[f"{prefix}META_BYTE_3"]) << 24) + ) + code = ( + int(msg[f"{prefix}META_13_15"]), + int(msg[f"{prefix}META_BYTE_2"]), + int(msg[f"{prefix}META_BYTE_3"]), + ) + d_rel = distance_raw * 0.05 + default_distance = CORNER_OBJECT_430_DEFAULT_DISTANCE_RAW_MIN <= distance_raw <= CORNER_OBJECT_430_DEFAULT_DISTANCE_RAW_MAX + base_valid = ( + raw not in CORNER_OBJECT_430_EMPTY_RAW_VALUES and + distance_raw not in (0, 8000, 8191) and + not default_distance and + 0.2 < d_rel < CORNER_OBJECT_430_MAX_DREL + ) + candidate_valid = ( + base_valid and + slot_index + 1 not in CORNER_OBJECT_430_CANDIDATE_EXCLUDED_SLOTS and + code[2] in CORNER_OBJECT_430_CANDIDATE_META_BYTE_3 and + code[1] in CORNER_OBJECT_430_STRONG_META_BYTE_2 + CORNER_OBJECT_430_WEAK_META_BYTE_2 + ) + bins.append({ + "msg_index": msg_index, + "slot_index": slot_index, + "distance_raw": distance_raw, + "d_rel": d_rel, + "code": code, + "candidate_valid": candidate_valid, + }) + + supported_bins = [] + candidates = [b for b in bins if b["candidate_valid"]] + for b in candidates: + support = 1 + for other in candidates: + if other is b: + continue + if abs(other["msg_index"] - b["msg_index"]) > 1: + continue + if abs(other["slot_index"] - b["slot_index"]) > 2: + continue + if abs(other["distance_raw"] - b["distance_raw"]) > CORNER_OBJECT_430_CANDIDATE_RAW_DELTA: + continue + support += 1 + min_support = (CORNER_OBJECT_430_STRONG_MIN_SUPPORT if b["code"][1] in CORNER_OBJECT_430_STRONG_META_BYTE_2 + else CORNER_OBJECT_430_WEAK_MIN_SUPPORT) + if support >= min_support: + supported_bins.append({**b, "support": support}) + + clusters = [] + for b in sorted(supported_bins, key=lambda item: item["distance_raw"]): + if not clusters or b["distance_raw"] - clusters[-1][-1]["distance_raw"] > CORNER_OBJECT_430_CLUSTER_RAW_GAP: + clusters.append([b]) + else: + clusters[-1].append(b) + clusters = sorted(clusters, key=lambda cluster: sum(b["distance_raw"] for b in cluster) / len(cluster))[:CORNER_OBJECT_430_MAX_TRACKS_PER_SIDE] + + cluster_objects = [] + for cluster in clusters: + msg_index = sum(b["msg_index"] for b in cluster) / len(cluster) + slot = sum(b["slot_index"] + 1 for b in cluster) / len(cluster) + lateral_cell = (CORNER_OBJECT_430_LATERAL_CELL_MSG_WEIGHT * msg_index + + CORNER_OBJECT_430_LATERAL_CELL_SLOT_WEIGHT * slot) + mapped_cell = lateral_cell if side_sign > 0.0 else CORNER_OBJECT_430_RIGHT_CELL_MIRROR - lateral_cell + y_abs = max(CORNER_OBJECT_430_MIN_ABS_YREL, + min(CORNER_OBJECT_430_MAX_ABS_YREL, + CORNER_OBJECT_430_YREL_OFFSET - CORNER_OBJECT_430_YREL_SCALE * mapped_cell)) + cluster_objects.append({ + "d_rel": sum(b["d_rel"] for b in cluster) / len(cluster), + "y_rel": side_sign * y_abs, + "code": max((b["code"] for b in cluster), key=lambda code: sum(1 for item in cluster if item["code"] == code)), + }) + + active_t_ids = set() + side_track_ids = [ + CORNER_OBJECT_430_TRACK_ID_OFFSET + track_base + slot + for slot in range(CORNER_OBJECT_430_MAX_TRACKS_PER_SIDE) + ] + unmatched_track_ids = {t_id for t_id in side_track_ids if t_id in self.corner_object_430_prev_d_rel} + unused_track_ids = [t_id for t_id in side_track_ids if t_id not in unmatched_track_ids] + + for cluster in cluster_objects: + d_rel = cluster["d_rel"] + code = cluster["code"] + matched_t_id = None + if unmatched_track_ids: + nearest_t_id = min(unmatched_track_ids, key=lambda t_id: abs(d_rel - self.corner_object_430_prev_d_rel[t_id])) + if abs(d_rel - self.corner_object_430_prev_d_rel[nearest_t_id]) <= CORNER_OBJECT_430_TRACK_MATCH_MAX_DREL_DELTA: + matched_t_id = nearest_t_id + unmatched_track_ids.remove(matched_t_id) + if matched_t_id is None and unused_track_ids: + matched_t_id = unused_track_ids.pop(0) + if matched_t_id is None: + continue + + t_id = matched_t_id + active_t_ids.add(t_id) + prev_d_rel = self.corner_object_430_prev_d_rel.get(t_id) + prev_code = self.corner_object_430_prev_code.get(t_id) + self.corner_object_430_prev_d_rel[t_id] = d_rel + self.corner_object_430_prev_y_rel[t_id] = cluster["y_rel"] + self.corner_object_430_prev_code[t_id] = code + reset_track = prev_d_rel is None or code != prev_code or abs(d_rel - prev_d_rel) > CORNER_OBJECT_430_MAX_DREL_DELTA + if reset_track: + self.corner_object_430_prev_v_rel.pop(t_id, None) + self.corner_object_430_prev_yv_rel.pop(t_id, None) + self.corner_object_430_history.pop(t_id, None) + self.corner_object_430_noncenter_inward_frames.pop(t_id, None) + + history = self.corner_object_430_history.setdefault(t_id, deque(maxlen=CORNER_OBJECT_430_HISTORY_SIZE)) + history.append((d_rel, cluster["y_rel"])) + if len(history) < CORNER_OBJECT_430_MIN_HISTORY: + self._clear_point(t_id) + continue + + window_dt = CORNER_OBJECT_430_DT * (len(history) - 1) + first_d_rel, first_y_rel = history[0] + hist_v_rel = (d_rel - first_d_rel) / window_dt + if abs(hist_v_rel) > CORNER_OBJECT_430_MAX_ABS_VREL: + self.corner_object_430_prev_v_rel.pop(t_id, None) + self.corner_object_430_prev_yv_rel.pop(t_id, None) + self.corner_object_430_history.pop(t_id, None) + self.corner_object_430_noncenter_inward_frames.pop(t_id, None) + self._clear_point(t_id) + continue + prev_v_rel = self.corner_object_430_prev_v_rel.get(t_id, hist_v_rel) + v_rel = (1.0 - CORNER_OBJECT_430_VREL_ALPHA) * prev_v_rel + CORNER_OBJECT_430_VREL_ALPHA * hist_v_rel + self.corner_object_430_prev_v_rel[t_id] = v_rel + + inward_steps = 0 + usable_steps = 0 + prev_abs_y = abs(history[0][1]) + for _, y_rel in list(history)[1:]: + abs_y = abs(y_rel) + delta = prev_abs_y - abs_y + if abs(delta) > 1e-3: + usable_steps += 1 + if delta > 0.0: + inward_steps += 1 + prev_abs_y = abs_y + net_inward_y = abs(first_y_rel) - abs(cluster["y_rel"]) + inward_ratio = inward_steps / usable_steps if usable_steps > 0 else 0.0 + hist_yv_rel = (cluster["y_rel"] - first_y_rel) / window_dt + recent_inward_y = abs(history[-3][1]) - abs(cluster["y_rel"]) if len(history) >= 3 else net_inward_y + if (net_inward_y < CORNER_OBJECT_430_MIN_INWARD_YREL_DELTA or + recent_inward_y < CORNER_OBJECT_430_MIN_RECENT_INWARD_YREL_DELTA or + inward_ratio < CORNER_OBJECT_430_MIN_INWARD_RATIO or + abs(hist_yv_rel) > CORNER_OBJECT_430_MAX_ABS_YVREL): + hist_yv_rel = 0.0 + inward_motion_candidate = hist_yv_rel != 0.0 and abs(cluster["y_rel"]) <= CORNER_OBJECT_430_INWARD_KEEP_YVREL_ABS_YREL + inward_center_candidate = inward_motion_candidate and abs(cluster["y_rel"]) <= CORNER_OBJECT_430_INWARD_CENTER_ABS_YREL + y_rel = cluster["y_rel"] + if inward_motion_candidate: + if inward_center_candidate: + self.corner_object_430_noncenter_inward_frames[t_id] = 0 + prev_yv_rel = self.corner_object_430_prev_yv_rel.get(t_id, hist_yv_rel) + yv_rel = (1.0 - CORNER_OBJECT_430_YVREL_ALPHA) * prev_yv_rel + CORNER_OBJECT_430_YVREL_ALPHA * hist_yv_rel + else: + noncenter_frames = self.corner_object_430_noncenter_inward_frames.get(t_id, 0) + 1 + self.corner_object_430_noncenter_inward_frames[t_id] = noncenter_frames + if noncenter_frames <= CORNER_OBJECT_430_EARLY_INWARD_NONCENTER_FRAMES: + prev_yv_rel = self.corner_object_430_prev_yv_rel.get(t_id, hist_yv_rel) + yv_rel = (1.0 - CORNER_OBJECT_430_YVREL_ALPHA) * prev_yv_rel + CORNER_OBJECT_430_YVREL_ALPHA * hist_yv_rel + else: + yv_rel = 0.0 + if not inward_center_candidate and abs(y_rel) < CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL: + y_rel = math.copysign(CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL, y_rel) + else: + hist_yv_rel = 0.0 + yv_rel = 0.0 + self.corner_object_430_noncenter_inward_frames[t_id] = 0 + if abs(y_rel) < CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL: + y_rel = math.copysign(CORNER_OBJECT_430_SIDE_KEEP_ABS_YREL, y_rel) + self.corner_object_430_prev_yv_rel[t_id] = yv_rel + + self.pts[t_id].measured = True + self.pts[t_id].trackId = t_id + self.pts[t_id].dRel = d_rel + self.pts[t_id].yRel = y_rel + self.pts[t_id].vRel = v_rel + self.pts[t_id].vLead = v_rel + self.v_ego + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = yv_rel + + side_track_count = CORNER_OBJECT_430_MSG_COUNT_PER_SIDE * CORNER_OBJECT_430_SLOTS_PER_MSG + for slot in range(side_track_count): + t_id = CORNER_OBJECT_430_TRACK_ID_OFFSET + track_base + slot + if t_id in active_t_ids: + continue + self.corner_object_430_prev_d_rel.pop(t_id, None) + self.corner_object_430_prev_v_rel.pop(t_id, None) + self.corner_object_430_prev_y_rel.pop(t_id, None) + self.corner_object_430_prev_yv_rel.pop(t_id, None) + self.corner_object_430_prev_code.pop(t_id, None) + self.corner_object_430_history.pop(t_id, None) + self.corner_object_430_noncenter_inward_frames.pop(t_id, None) + self._clear_point(t_id) + + + def _clear_point(self, t_id): + self.pts[t_id].measured = False + self.pts[t_id].dRel = 0 + self.pts[t_id].yRel = 0 + self.pts[t_id].vRel = 0 + self.pts[t_id].vLead = self.v_ego + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = 0 + + def _clear_corner_objects(self): + for slot in range(CORNER_OBJECT_235_MSG_COUNT): + self._clear_point(CORNER_OBJECT_235_TRACK_ID_OFFSET + slot) + self.corner_object_track_ids.clear_source("corner235") + + def _clear_corner_objects_180(self): + for slot in range(CORNER_OBJECT_180_MSG_COUNT * CORNER_OBJECT_180_SLOTS_PER_MSG): + self._clear_point(CORNER_OBJECT_180_TRACK_ID_OFFSET + slot) + self.corner_object_track_ids.clear_source("corner180") + + def _clear_corner_objects_430(self): + self.corner_object_430_prev_d_rel.clear() + self.corner_object_430_prev_v_rel.clear() + self.corner_object_430_prev_y_rel.clear() + self.corner_object_430_prev_yv_rel.clear() + self.corner_object_430_prev_code.clear() + self.corner_object_430_history.clear() + self.corner_object_430_noncenter_inward_frames.clear() + for slot in range(CORNER_OBJECT_430_MSG_COUNT_PER_SIDE * 2 * CORNER_OBJECT_430_SLOTS_PER_MSG): + self._clear_point(CORNER_OBJECT_430_TRACK_ID_OFFSET + slot) + + def _update_scc(self, updated_messages): + cpt = self.rcp_scc.vl + t_id = SCC_TID + if self.canfd: + dRel = cpt["SCC_CONTROL"]['ACC_ObjDist'] + vRel = cpt["SCC_CONTROL"]['ACC_ObjRelSpd'] + new_pts = abs(dRel - self.dRel_last) > 3 or abs(vRel - self.vRel_last) > 1 + vLead = vRel + self.v_ego + valid = 0 < dRel < 150 and not new_pts #cpt["SCC_CONTROL"]['OBJ_STATUS'] and dRel < 150 + self.pts[t_id].measured = bool(valid) + if not valid: + self.pts[t_id].dRel = 0 + self.pts[t_id].yRel = 0 + self.pts[t_id].vRel = 0 + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = 0 + else: + self.pts[t_id].dRel = dRel + self.pts[t_id].yRel = 0 + self.pts[t_id].vRel = vRel + self.pts[t_id].vLead = vLead + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = 0 #float('nan') + else: + dRel = cpt["SCC11"]['ACC_ObjDist'] + vRel = cpt["SCC11"]['ACC_ObjRelSpd'] + new_pts = abs(dRel - self.dRel_last) > 3 or abs(vRel - self.vRel_last) > 1 + vLead = vRel + self.v_ego + valid = cpt["SCC11"]['ACC_ObjStatus'] and dRel < 150 and not new_pts + self.pts[t_id].measured = bool(valid) + if not valid: + self.pts[t_id].dRel = 0 + self.pts[t_id].yRel = 0 + self.pts[t_id].vRel = 0 + self.pts[t_id].vLead = self.pts[t_id].vRel + self.v_ego + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = 0 + else: + self.pts[t_id].dRel = dRel + self.pts[t_id].yRel = -cpt["SCC11"]['ACC_ObjLatPos'] # in car frame's y axis, left is negative + self.pts[t_id].vRel = vRel + self.pts[t_id].vLead = vLead + self.pts[t_id].aRel = float('nan') + self.pts[t_id].yvRel = 0 #float('nan') + + self.dRel_last = dRel + self.vRel_last = vRel diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/hyundai/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/tests/print_platform_codes.py b/artifacts/package_runtime/iqdbc/car/hyundai/tests/print_platform_codes.py new file mode 100644 index 000000000..c96e131e4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/tests/print_platform_codes.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +from iqdbc.car.structs import CarParams +from iqdbc.car.hyundai.values import PLATFORM_CODE_ECUS, get_platform_codes +from iqdbc.car.hyundai.fingerprints import FW_VERSIONS + +Ecu = CarParams.Ecu + +if __name__ == "__main__": + for car_model, ecus in FW_VERSIONS.items(): + print() + print(car_model) + for ecu in sorted(ecus): + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + platform_codes = get_platform_codes(ecus[ecu]) + codes = {code for code, _ in platform_codes} + dates = {date for _, date in platform_codes if date is not None} + print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):') + print(f' Codes: {codes}') + print(f' Dates: {dates}') diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_ev_mode.py b/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_ev_mode.py new file mode 100644 index 000000000..d8ed2074d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_ev_mode.py @@ -0,0 +1,194 @@ +import math + +import pytest + +from iqdbc.can import CANPacker, CANParser +from iqdbc.car import Bus, gen_empty_fingerprint, structs +from iqdbc.car.hyundai.carstate import CarState, EV_MODE_STATUS_TIMEOUT_NS, _get_ev_mode_state +from iqdbc.car.hyundai.interface import CarInterface +from iqdbc.car.hyundai.values import CANFD_HYBRID_STATUS_ADDR, CANFD_HYBRID_STATUS_DLC, CAR, DBC, EV_MODE_ACTIVE_VALUES, \ + EV_MODE_STATUS_ADDR, EV_MODE_STATUS_DLC, EV_MODE_STATUS_MSG, EV_MODE_STATUS_SIGNAL, \ + HyundaiExtFlags, HyundaiFlags +from iqpilot.common.params import Params + + +def get_params(candidate, *, hybrid=True, hybrid_bus=0, hybrid_status=None, hybrid_status_bus=0, + hybrid_status_dlc=CANFD_HYBRID_STATUS_DLC, status_bus=0, status_dlc=EV_MODE_STATUS_DLC): + Params().put_int("HyundaiCameraSCC", 1) + Params().put_int("CanfdHDA2", 1) + + fingerprint = gen_empty_fingerprint() + if hybrid: + fingerprint[hybrid_bus][0x105] = 32 + if hybrid_status is None: + hybrid_status = hybrid + if hybrid_status: + fingerprint[hybrid_status_bus][CANFD_HYBRID_STATUS_ADDR] = hybrid_status_dlc + if status_bus is not None: + fingerprint[status_bus][EV_MODE_STATUS_ADDR] = status_dlc + return CarInterface.get_params(candidate, fingerprint, [], False, False, False) + + +@pytest.mark.parametrize(("candidate", "hybrid", "status_bus", "status_dlc", "expected"), ( + (CAR.HYUNDAI_SANTAFE_MX5_HEV, True, 0, 32, True), + (CAR.HYUNDAI_SANTAFE_MX5_HEV, False, 0, 32, False), + (CAR.HYUNDAI_SANTAFE_MX5_HEV, True, None, 32, False), + (CAR.HYUNDAI_SANTAFE_MX5_HEV, True, 1, 32, False), + (CAR.HYUNDAI_SANTAFE_MX5_HEV, True, 0, 16, False), + (CAR.KIA_SORENTO_4TH_GEN, False, None, 32, False), + # Shared ICE/HEV/PHEV candidates rely on the observed ECAN capability frames, not their model name. + (CAR.HYUNDAI_TUCSON_4TH_GEN, True, 0, 32, True), + (CAR.HYUNDAI_TUCSON_4TH_GEN, False, 0, 32, False), + (CAR.KIA_SORENTO_HEV_4TH_GEN, True, 0, 32, True), + (CAR.HYUNDAI_KONA_HEV_2ND_GEN, True, 0, 32, True), + (CAR.HYUNDAI_KONA_HEV_2ND_GEN, False, 0, 32, False), + (CAR.HYUNDAI_ELANTRA_HEV_2021, True, 0, 32, False), +)) +def test_ev_mode_capability(candidate, hybrid, status_bus, status_dlc, expected): + CP = get_params(candidate, hybrid=hybrid, status_bus=status_bus, status_dlc=status_dlc) + assert bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230) == expected + + +@pytest.mark.parametrize(("hybrid_status_bus", "hybrid_status_dlc"), ( + (1, CANFD_HYBRID_STATUS_DLC), + (0, 16), +)) +def test_ev_mode_capability_requires_ecan_hybrid_status_dlc32(hybrid_status_bus, hybrid_status_dlc): + CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV, hybrid_status_bus=hybrid_status_bus, + hybrid_status_dlc=hybrid_status_dlc) + + assert not bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230) + + +def test_0x105_and_ev_status_without_0xfa_do_not_enable_ev_mode(): + CP = get_params(CAR.HYUNDAI_TUCSON_4TH_GEN, hybrid=True, hybrid_status=False) + + assert bool(CP.flags & HyundaiFlags.HYBRID) + assert not bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230) + + +def test_ev_mode_display_capability_does_not_change_hybrid_safety_classification(): + CP = get_params(CAR.HYUNDAI_TUCSON_4TH_GEN, hybrid=False, hybrid_status=True) + + assert not bool(CP.flags & HyundaiFlags.HYBRID) + assert bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230) + + +def test_ev_mode_capability_uses_the_detected_ecan_offset(): + CP = get_params(CAR.KIA_SORENTO_HEV_4TH_GEN, hybrid_bus=4, hybrid_status_bus=4, status_bus=4) + + assert bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230) + + +def test_ev_mode_parser_registration_is_capability_gated(): + supported = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV) + unsupported = get_params(CAR.KIA_SORENTO_4TH_GEN, hybrid=False, status_bus=1, status_dlc=16) + + supported_parser = CarState.get_can_parsers_canfd(None, supported)[Bus.pt] + unsupported_parser = CarState.get_can_parsers_canfd(None, unsupported)[Bus.pt] + + assert EV_MODE_STATUS_ADDR in supported_parser.addresses + assert supported_parser.message_states[EV_MODE_STATUS_ADDR].ignore_alive + assert supported_parser.message_states[EV_MODE_STATUS_ADDR].ignore_counter + assert EV_MODE_STATUS_ADDR not in unsupported_parser.addresses + + +def test_sorento_ice_corner_radar_status_does_not_enable_ev_mode(): + Params().put_int("HyundaiCameraSCC", 1) + Params().put_int("CanfdHDA2", 1) + + fingerprint = gen_empty_fingerprint() + fingerprint[1][0x230] = 16 # Actual Sorento ICE ACAN corner-radar status frame. + CP = CarInterface.get_params(CAR.KIA_SORENTO_4TH_GEN, fingerprint, [], False, False, False) + parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt] + + assert not bool(CP.extFlags & HyundaiExtFlags.EV_MODE_STATUS_230) + assert EV_MODE_STATUS_ADDR not in parser.addresses + + +def test_ev_mode_state_requires_a_fresh_dlc32_frame(): + CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV) + parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt] + packer = CANPacker(DBC[CP.carFingerprint][Bus.pt]) + + assert _get_ev_mode_state(parser) == (False, False) + + timestamp = 1_000_000_000 + wrong_bus_short_status = (EV_MODE_STATUS_ADDR, b"\x00" * 16, 1) + parser.update([timestamp, [wrong_bus_short_status]]) + assert _get_ev_mode_state(parser) == (False, False) + + ev_active = packer.make_can_msg(EV_MODE_STATUS_MSG, parser.bus, {"COUNTER": 1, EV_MODE_STATUS_SIGNAL: 6}) + parser.update([timestamp + 100_000_000, [ev_active]]) + assert _get_ev_mode_state(parser) == (True, True) + + ev_inactive = packer.make_can_msg(EV_MODE_STATUS_MSG, parser.bus, {"COUNTER": 2, EV_MODE_STATUS_SIGNAL: 3}) + parser.update([timestamp + 200_000_000, [ev_inactive]]) + assert _get_ev_mode_state(parser) == (False, True) + + parser.dat[EV_MODE_STATUS_ADDR] = b"\x00" * 16 + assert _get_ev_mode_state(parser) == (False, False) + + parser.dat[EV_MODE_STATUS_ADDR] = ev_inactive[1] + parser.update([timestamp + 200_000_000 + EV_MODE_STATUS_TIMEOUT_NS + 1, []]) + assert not parser.bus_timeout + assert _get_ev_mode_state(parser) == (False, False) + + +@pytest.mark.parametrize("mode", range(16)) +def test_ev_mode_enum_mapping(mode): + CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV) + parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt] + packer = CANPacker(DBC[CP.carFingerprint][Bus.pt]) + msg = packer.make_can_msg(EV_MODE_STATUS_MSG, parser.bus, {"COUNTER": mode, EV_MODE_STATUS_SIGNAL: mode}) + + parser.update([1_000_000_000, [msg]]) + + assert int(parser.vl[EV_MODE_STATUS_MSG][EV_MODE_STATUS_SIGNAL]) == mode + assert _get_ev_mode_state(parser) == (mode in EV_MODE_ACTIVE_VALUES, True) + + +@pytest.mark.parametrize(("payload", "expected_mode", "expected_active"), ( + ("758139048402000000000000000000000000d3009805001c24000000c05dc80f", 1, True), + ("4d466f048402000000000000000000000000bf007408001c24000000c05dc80f", 2, True), + ("32206e048402000000000000000000000000c9007418001c24000000c05dc80f", 6, True), + # Route 455 mode 3 was a false positive with the old single-bit 0x230 interpretation. + ("4f935e0484020000000000000000000000004400640d001c10000000c05dc40f", 3, False), + ("066558048402000000000000000000000000c4003020001c24000000c05dc80f", 8, False), + ("059683048402000000000000000000000000a1008425001c24000000c05dc80f", 9, False), + ("011305048402000000000000000000000000d600a829001c24000000c05dc80f", 10, False), +)) +def test_ev_mode_dbc_decodes_real_mx5_frames(payload, expected_mode, expected_active): + parser = CANParser("hyundai_canfd_generated", [(EV_MODE_STATUS_MSG, math.nan)], 0) + updated = parser.update([1_000_000_000, [(EV_MODE_STATUS_ADDR, bytes.fromhex(payload), 0)]]) + + assert updated == {EV_MODE_STATUS_ADDR} + assert int(parser.vl[EV_MODE_STATUS_MSG][EV_MODE_STATUS_SIGNAL]) == expected_mode + assert _get_ev_mode_state(parser) == (expected_active, True) + + +def test_ev_mode_rejects_checksum_corruption(): + CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV) + parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt] + payload = bytearray.fromhex("32206e048402000000000000000000000000c9007418001c24000000c05dc80f") + payload[-1] ^= 1 + + parser.update([1_000_000_000, [(EV_MODE_STATUS_ADDR, bytes(payload), parser.bus)]]) + + assert EV_MODE_STATUS_ADDR not in parser.dat + assert _get_ev_mode_state(parser) == (False, False) + + +def test_ev_mode_fields_default_invalid(): + state = structs.CarState() + assert not state.evModeActive + assert not state.evModeValid + + +def test_ev_mode_parser_is_optional_for_can_validity(): + CP = get_params(CAR.HYUNDAI_SANTAFE_MX5_HEV) + parser = CarState.get_can_parsers_canfd(None, CP)[Bus.pt] + state = parser.message_states[EV_MODE_STATUS_ADDR] + + assert state.ignore_alive + assert state.ignore_counter diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_hyundai.py b/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_hyundai.py new file mode 100644 index 000000000..c7158c6f5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_hyundai.py @@ -0,0 +1,225 @@ +from hypothesis import settings, given, strategies as st + +from iqdbc.car import gen_empty_fingerprint +from iqdbc.car.structs import CarParams +from iqdbc.car.fw_versions import build_fw_dict +from iqdbc.car.hyundai.interface import CarInterface +from iqdbc.car.hyundai.radar_interface import RADAR_START_ADDR +from iqdbc.car.hyundai.values import CANFD_CAR, CAN_GEARS, CAR, CHECKSUM, DATE_FW_ECUS, \ + HYBRID_CAR, EV_CAR, FW_QUERY_CONFIG, LEGACY_SAFETY_MODE_CAR, \ + PLATFORM_CODE_ECUS, HYUNDAI_VERSION_REQUEST_LONG, \ + HyundaiFlags, get_platform_codes, HyundaiSafetyFlags +from iqdbc.car.hyundai.fingerprints import FW_VERSIONS + +Ecu = CarParams.Ecu + +# Some platforms have date codes in a different format we don't yet parse (or are missing). +# For now, assert list of expected missing date cars +NO_DATES_PLATFORMS = { + # CAN FD + CAR.KIA_SPORTAGE_5TH_GEN, + CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN, + CAR.HYUNDAI_TUCSON_4TH_GEN, + # CAN + CAR.HYUNDAI_ELANTRA, + CAR.HYUNDAI_ELANTRA_GT_I30, + CAR.KIA_CEED, + CAR.KIA_FORTE, + CAR.KIA_OPTIMA_G4, + CAR.KIA_OPTIMA_G4_FL, + CAR.KIA_SORENTO, + CAR.HYUNDAI_KONA, + CAR.HYUNDAI_KONA_EV, + CAR.HYUNDAI_KONA_EV_2022, + CAR.HYUNDAI_KONA_HEV, + CAR.HYUNDAI_SONATA_LF, + CAR.HYUNDAI_VELOSTER, + CAR.HYUNDAI_KONA_2022, +} + +CANFD_EXPECTED_ECUS = {Ecu.fwdCamera, Ecu.fwdRadar} + + +class TestHyundaiFingerprint: + def test_feature_detection(self, monkeypatch, tmp_path): + monkeypatch.setenv("PARAMS_ROOT", str(tmp_path)) + # radar available + for radar in (True, False): + fingerprint = gen_empty_fingerprint() + if radar: + fingerprint[1][RADAR_START_ADDR] = 8 + CP = CarInterface.get_params(CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False) + assert CP.radarUnavailable != radar + + def test_alternate_limits(self): + # Alternate lateral control limits, for high torque cars, verify Panda safety mode flag is set + fingerprint = gen_empty_fingerprint() + for car_model in CAR: + CP = CarInterface.get_params(car_model, fingerprint, [], False, False, False) + assert bool(CP.flags & HyundaiFlags.ALT_LIMITS) == bool(CP.safetyConfigs[-1].safetyParam & HyundaiSafetyFlags.ALT_LIMITS) + + def test_can_features(self): + # Test no EV/HEV in any gear lists (should all use ELECT_GEAR) + assert set.union(*CAN_GEARS.values()) & (HYBRID_CAR | EV_CAR) == set() + + # Test CAN FD cars are not classified with classic-CAN-only parsing or safety modes. + can_specific_feature_list = set.union(*CAN_GEARS.values(), *CHECKSUM.values(), LEGACY_SAFETY_MODE_CAR) + for car_model in CANFD_CAR: + assert car_model not in can_specific_feature_list, "CAN FD car unexpectedly found in a CAN feature list" + + def test_hybrid_ev_sets(self): + assert HYBRID_CAR & EV_CAR == set(), "Shared cars between hybrid and EV" + assert HYBRID_CAR <= set(CAR) + assert EV_CAR <= set(CAR) + + def test_canfd_ecu_whitelist(self): + # Asserts only expected Ecus can exist in database for CAN-FD cars + for car_model in CANFD_CAR: + ecus = {fw[0] for fw in FW_VERSIONS.get(car_model, {}).keys()} + ecus_not_in_whitelist = ecus - CANFD_EXPECTED_ECUS + ecu_strings = ", ".join([f"Ecu.{ecu}" for ecu in ecus_not_in_whitelist]) + assert len(ecus_not_in_whitelist) == 0, \ + f"{car_model}: Car model has unexpected ECUs: {ecu_strings}" + + def test_blacklisted_parts(self, subtests): + # Asserts no ECUs known to be shared across platforms exist in the database. + # Tucson having Santa Cruz camera and EPS for example + for car_model, ecus in FW_VERSIONS.items(): + if car_model == CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN: + continue + with subtests.test(car_model=car_model.value): + for code, _ in get_platform_codes(ecus[(Ecu.fwdCamera, 0x7c4, None)]): + if b"-" not in code: + continue + part = code.split(b"-")[1] + assert not part.startswith(b'CW'), "Car has bad part number" + + def test_correct_ecu_response_database(self, subtests): + """ + Assert standard responses for certain ECUs, since they can + respond to multiple queries with different data + """ + expected_fw_prefix = HYUNDAI_VERSION_REQUEST_LONG[1:] + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + for ecu, fws in ecus.items(): + assert all(fw.startswith(expected_fw_prefix) for fw in fws), \ + f"FW from unexpected request in database: {(ecu, fws)}" + + @settings(max_examples=100) + @given(data=st.data()) + def test_platform_codes_fuzzy_fw(self, data): + """Ensure function doesn't raise an exception""" + fw_strategy = st.lists(st.binary()) + fws = data.draw(fw_strategy) + get_platform_codes(fws) + + def test_expected_platform_codes(self, subtests): + # Ensures we don't accidentally add multiple platform codes for a car unless it is intentional + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + for ecu, fws in ecus.items(): + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + # Third and fourth character are usually EV/hybrid identifiers + codes = {code.split(b"-")[0][:2] for code, _ in get_platform_codes(fws)} + if car_model == CAR.HYUNDAI_PALISADE: + assert codes == {b"LX", b"ON"}, f"Car has unexpected platform codes: {car_model} {codes}" + elif car_model == CAR.HYUNDAI_KONA_EV and ecu[0] == Ecu.fwdCamera: + assert codes == {b"OE", b"OS"}, f"Car has unexpected platform codes: {car_model} {codes}" + else: + assert len(codes) == 1, f"Car has multiple platform codes: {car_model} {codes}" + + # Tests for platform codes, part numbers, and FW dates which Hyundai will use to fuzzy + # fingerprint in the absence of full FW matches: + def test_platform_code_ecus_available(self, subtests): + # TODO: add queries for these non-CAN FD cars to get EPS + no_eps_platforms = CANFD_CAR | {CAR.KIA_SORENTO, CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL, CAR.KIA_OPTIMA_H, + CAR.KIA_OPTIMA_H_G4_FL, CAR.HYUNDAI_SONATA_LF, CAR.HYUNDAI_TUCSON, CAR.GENESIS_G90, CAR.GENESIS_G80, CAR.HYUNDAI_ELANTRA} + + # Asserts ECU keys essential for fuzzy fingerprinting are available on all platforms + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + for platform_code_ecu in PLATFORM_CODE_ECUS: + if platform_code_ecu in (Ecu.fwdRadar, Ecu.eps) and car_model == CAR.HYUNDAI_GENESIS: + continue + if platform_code_ecu == Ecu.eps and car_model in no_eps_platforms: + continue + assert platform_code_ecu in [e[0] for e in ecus] + + def test_fw_format(self, subtests): + # Asserts: + # - every supported ECU FW version returns one platform code + # - every supported ECU FW version has a part number + # - expected parsing of ECU FW dates + + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + for ecu, fws in ecus.items(): + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + codes = set() + for fw in fws: + result = get_platform_codes([fw]) + assert 1 == len(result), f"Unable to parse FW: {fw}" + codes |= result + + if ecu[0] not in DATE_FW_ECUS or car_model in NO_DATES_PLATFORMS: + assert all(date is None for _, date in codes) + else: + assert all(date is not None for _, date in codes) + + if car_model != CAR.HYUNDAI_GENESIS: + assert all(b"-" in code for code, _ in codes), \ + f"FW does not have part number: {fw}" + + def test_platform_codes_spot_check(self): + # Asserts basic platform code parsing behavior for a few cases + results = get_platform_codes([b"\xf1\x00DH LKAS 1.1 -150210"]) + assert results == {(b"DH", b"150210")} + + # Some cameras and all radars do not have dates + results = get_platform_codes([b"\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 "]) + assert results == {(b"AEhe-G2000", None)} + + results = get_platform_codes([b"\xf1\x00CV1_ RDR ----- 1.00 1.01 99110-CV000 "]) + assert results == {(b"CV1-CV000", None)} + + results = get_platform_codes([ + b"\xf1\x00DH LKAS 1.1 -150210", + b"\xf1\x00AEhe SCC H-CUP 1.01 1.01 96400-G2000 ", + b"\xf1\x00CV1_ RDR ----- 1.00 1.01 99110-CV000 ", + ]) + assert results == {(b"DH", b"150210"), (b"AEhe-G2000", None), (b"CV1-CV000", None)} + + results = get_platform_codes([ + b"\xf1\x00LX2 MFC AT USA LHD 1.00 1.07 99211-S8100 220222", + b"\xf1\x00LX2 MFC AT USA LHD 1.00 1.08 99211-S8100 211103", + b"\xf1\x00ON MFC AT USA LHD 1.00 1.01 99211-S9100 190405", + b"\xf1\x00ON MFC AT USA LHD 1.00 1.03 99211-S9100 190720", + ]) + assert results == {(b"LX2-S8100", b"220222"), (b"LX2-S8100", b"211103"), + (b"ON-S9100", b"190405"), (b"ON-S9100", b"190720")} + + def test_fuzzy_excluded_platforms(self): + platforms_with_shared_codes = set() + for platform, fw_by_addr in FW_VERSIONS.items(): + car_fw = [] + for ecu, fw_versions in fw_by_addr.items(): + ecu_name, addr, sub_addr = ecu + for fw in fw_versions: + car_fw.append(CarParams.CarFw(ecu=ecu_name, fwVersion=fw, address=addr, + subAddress=0 if sub_addr is None else sub_addr)) + + CP = CarParams(carFw=car_fw) + matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, FW_VERSIONS) + if len(matches) == 1: + assert list(matches)[0] == platform + else: + platforms_with_shared_codes.add(platform) + + # A unique fuzzy match must always resolve back to the platform that supplied the firmware. + # Ambiguity is expected for shared platform codes and for platforms without parseable dates. + assert {CAR.GENESIS_G70, CAR.GENESIS_G70_2020} <= platforms_with_shared_codes diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_integration.py b/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_integration.py new file mode 100644 index 000000000..5dfb818a6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_integration.py @@ -0,0 +1,53 @@ +import pytest + +from iqdbc.car import gen_empty_fingerprint, structs +from iqdbc.car.hyundai.interface import CarInterface +from iqdbc.car.hyundai.values import CAR, HyundaiFlagsIQ, HyundaiSafetyFlagsIQ + + +@pytest.mark.parametrize("candidate", list(CAR), ids=lambda candidate: candidate.value) +@pytest.mark.parametrize("alpha_long", (False, True), ids=("stock_long", "openpilot_long")) +def test_all_platform_state_controller_and_radar(candidate, alpha_long, monkeypatch, tmp_path): + """Every declared HKG platform must initialize and execute one complete interface cycle.""" + monkeypatch.setenv("PARAMS_ROOT", str(tmp_path / candidate.value)) + fingerprint = gen_empty_fingerprint() + + cp = CarInterface.get_params(candidate, fingerprint, [], alpha_long, False, False) + cp_iq = CarInterface.get_params_iq(cp, candidate, fingerprint, [], alpha_long, False, False) + interface = CarInterface(cp, cp_iq) + + state, state_iq = interface.update([]) + actuators, can_sends = interface.apply(structs.CarControl().as_reader(), structs.IQCarControl()) + radar = interface.RadarInterface(cp, cp_iq) + radar_result = radar.update([]) + + assert state.vEgo == 0.0 + assert state_iq is not None + assert actuators is not None + assert isinstance(can_sends, list) + assert radar_result is None + + +def test_parameter_defaults_do_not_require_persisted_fingerprint(monkeypatch, tmp_path): + """A clean installation must not crash when carrotpilot-specific Params have not been written yet.""" + monkeypatch.setenv("PARAMS_ROOT", str(tmp_path)) + fingerprint = gen_empty_fingerprint() + + cp = CarInterface.get_params(CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False) + cp_iq = CarInterface.get_params_iq(cp, CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False) + interface = CarInterface(cp, cp_iq) + + state, _ = interface.update([]) + assert state.vEgo == 0.0 + + +def test_classic_lfa_button_capability_survives_iq_module_removal(monkeypatch, tmp_path): + monkeypatch.setenv("PARAMS_ROOT", str(tmp_path)) + fingerprint = gen_empty_fingerprint() + fingerprint[0][0x391] = 8 + + cp = CarInterface.get_params(CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False) + cp_iq = CarInterface.get_params_iq(cp, CAR.HYUNDAI_SONATA, fingerprint, [], False, False, False) + + assert cp_iq.flags & HyundaiFlagsIQ.HAS_LFA_BUTTON + assert cp_iq.iqSafetyFlags & HyundaiSafetyFlagsIQ.HAS_LDA_BUTTON diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_radar.py b/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_radar.py new file mode 100644 index 000000000..ceace1ff9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/tests/test_radar.py @@ -0,0 +1,326 @@ +import math + +import pytest + +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +import iqdbc.car.hyundai.hyundaicanfd as hyundaicanfd +import iqdbc.car.hyundai.radar_interface as radar_interface_module +from iqdbc.car.hyundai.radar_interface import ( + CORNER_OBJECT_STABLE_TRACK_ID_START, + RADAR_MSG_COUNT3, + RADAR_MSG_COUNT4, + RADAR_START_ADDR_CANFD3, + CornerObjectTrackIdManager, + RadarInterface, + corner_object_position_valid, +) +from iqdbc.car.hyundai.values import CAR, HyundaiExtFlags, HyundaiFlags + + +class TestDensoRadar: + @staticmethod + def parse(addr, dat): + name = f"RADAR_TRACK_{addr:x}" + parser = CANParser("hyundai_kia_denso_front_radar_generated", [(name, 20)], 1) + parser.update([0, [(addr, bytes.fromhex(dat), 1)]]) + return parser.vl[name] + + def test_active_track_signals(self): + # Person walking toward the parked car, left of the camera center. + track = self.parse(0x503, "bc047efcc1fe8b00") + + assert track["LONG_DIST"] == pytest.approx(7.1875) + assert track["LAT_DIST"] == pytest.approx(-1.625) + assert track["REL_SPEED"] == pytest.approx(-0.734375) + assert track["OBJECT_STATE"] == 3 + + def test_empty_track(self): + track = self.parse(0x507, "53fff80000000081") + + assert track["LONG_DIST"] == pytest.approx(409.55) + assert track["LAT_DIST"] == 0 + assert track["REL_SPEED"] == 0 + assert track["OBJECT_STATE"] == 0 + + def test_long_range_lateral_distance(self): + # Real driving sample: treating the signed field as -12 degrees would put + # this target about 34 m sideways at 161 m. It is instead -3.0 m lateral. + track = self.parse(0x506, "b664eafa00cd230b") + + assert track["LONG_DIST"] == pytest.approx(161.4625) + assert track["LAT_DIST"] == pytest.approx(-3.0) + assert track["OBJECT_STATE"] == 3 + + def test_parser_selection_and_point_conversion(self, monkeypatch): + class FakeParams: + def get_int(self, key): + return 1 if key == "EnableRadarTracks" else 0 + + monkeypatch.setattr(radar_interface_module, "Params", FakeParams) + cp = structs.CarParams() + cp.carFingerprint = CAR.KIA_SORENTO + cp.flags = 0 + cp.extFlags = HyundaiExtFlags.RADAR_GROUP4.value + cp.radarUnavailable = False + cp.safetyConfigs = [structs.CarParams.SafetyConfig()] + + radar_interface = RadarInterface(cp) + + assert radar_interface.radar_group4 + assert RADAR_MSG_COUNT4 == 8 + assert radar_interface.radar_msg_count == RADAR_MSG_COUNT4 + assert radar_interface.trigger_msg_tracks == 0x507 + + active_dat = bytes.fromhex("bc047efcc1fe8b00") + empty_dat = bytes.fromhex("bcfff80000000081") + packets = [(addr, active_dat if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)] + radar_data = radar_interface.update([0, packets]) + point = next(point for point in radar_data.points if point.trackId == 35) + + assert point.measured + assert point.dRel == pytest.approx(7.1875) + assert point.yRel == pytest.approx(1.625) + assert point.vRel == pytest.approx(-0.734375) + assert math.isnan(point.aRel) + + # EN: Confirm that the long-range sample survives the filter and converts + # radar-left-negative to openpilot-left-positive coordinates. + # KO: ėžĨęą°ëĻŦ ėƒ˜í”Œė˜ 필터 í†ĩęŗŧ뙀 ë ˆė´ë” ėĸŒė¸Ą ėŒėˆ˜ ėĸŒí‘œę°€ openpilot ėĸŒė¸Ą + # ė–‘ėˆ˜ ėĸŒí‘œëĄœ ëŗ€í™˜ë˜ëŠ”ė§€ í™•ė¸í•¨. + long_range_dat = bytes.fromhex("b664eafa00cd230b") + packets = [(addr, long_range_dat if addr == 0x506 else empty_dat, 1) for addr in range(0x500, 0x508)] + radar_data = radar_interface.update([0, packets]) + point = next(point for point in radar_data.points if point.trackId == 38) + + assert point.dRel == pytest.approx(161.4625) + assert point.yRel == pytest.approx(3.0) + + # EN: A state-0 raw detection must not enter a stable tracked-object slot. + # KO: ėƒíƒœ 0ė¸ raw detectionė´ ė•ˆė •ė ė¸ ėļ”렁 ę°ė˛´ ėŠŦëĄ¯ė— ë“¤ė–´ė˜¤ė§€ ė•ŠėŒė„ í™•ė¸í•¨. + raw_detection = bytes.fromhex("d702f4fc200000e4") + packets = [(addr, raw_detection if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)] + radar_data = radar_interface.update([0, packets]) + assert not radar_data.points + + # EN: A real confirmed track beyond the former 205 m limit remains valid. + # KO: ę¸°ėĄ´ 205m ėƒí•œė„ 넘는 ė‹¤ė œ í™•ė • 트랙도 ėœ íš¨í•˜ę˛Œ ėœ ė§€ë¨. + confirmed_213m_track = bytes.fromhex("35854c0780f163e0") + packets = [(addr, confirmed_213m_track if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)] + radar_data = radar_interface.update([0, packets]) + point = next(point for point in radar_data.points if point.trackId == 35) + assert point.dRel == pytest.approx(213.275) + assert point.yRel == pytest.approx(-3.75) + + # EN: The 325 m boundary is rejected, leaving ample separation from the + # 409.55 m empty-slot sentinel. + # KO: 325m ę˛Ŋęŗ„ę°’ė„ ė œė™¸í•´ 409.55m 뚈 ėŠŦëĄ¯ 값ęŗŧ ėļŠëļ„한 ę°„ę˛Šė„ í™•ëŗ´í•¨. + boundary_track = bytes.fromhex("bccb200000000300") + packets = [(addr, boundary_track if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)] + radar_data = radar_interface.update([0, packets]) + assert not radar_data.points + + # EN: The wider profile keeps a real stable track at 4.875 m, covering more + # of the outer adjacent lane than the conservative 4.5 m profile. + # KO: ë„“ė–´ė§„ í•„í„°ė—ė„œ 4.875mė˜ ė‹¤ė œ ė•ˆė • íŠ¸ëž™ė„ ėœ ė§€í•´ ëŗ´ėˆ˜ė ė¸ 4.5m + # ė„¤ė •ëŗ´ë‹¤ 바ęšĨėĒŊ ė¸ė ‘ ė°¨ė„ ė„ 더 넓게 íŦ함함. + outer_lane_track = bytes.fromhex("d80b66f640000300") + packets = [(addr, outer_lane_track if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)] + radar_data = radar_interface.update([0, packets]) + point = next(point for point in radar_data.points if point.trackId == 35) + assert point.yRel == pytest.approx(4.875) + + # EN: Tracks beyond the widened envelope are rejected as roadside clutter; + # this payload differs only in lateral distance (-7.0 m). + # KO: ë„“ė–´ė§„ ë˛”ėœ„ëĨŧ ë˛—ė–´ë‚œ íŠ¸ëž™ė€ ë„ëĄœëŗ€ ėžĄėŒėœŧ로 ė œė™¸í•¨. ė´ payload는 + # 횡방í–Ĩ ęą°ëĻŦ(-7.0m)만 다ëĻ„. + far_side_reflection = bytes.fromhex("d80b66f200000300") + packets = [(addr, far_side_reflection if addr == 0x503 else empty_dat, 1) for addr in range(0x500, 0x508)] + radar_data = radar_interface.update([0, packets]) + assert not radar_data.points + + +class TestRadarGroup3: + @staticmethod + def parse(addr, dat): + name = f"RADAR_TRACK_{addr:x}" + parser = CANParser("hyundai_canfd_radar_generated", [(name, 20)], 1) + parser.update([0, [(addr, bytes.fromhex(dat), 1)]]) + return parser.vl[name] + + def test_group3_active_track(self): + track = self.parse(0x406, "e1043b0f02590e692a227e16f80fe00f28fcc753a20a0000") + + assert track["OBJECT_LENGTH"] == pytest.approx(4.4) + assert track["LONG_DIST"] == pytest.approx(55.4) + assert track["LAT_DIST"] == pytest.approx(-3.0) + assert track["REL_SPEED"] == pytest.approx(4.4) + + def test_group3_empty_track(self): + track = self.parse(0x407, "c03d3b0000000000ff0700000000000000d0020000000000") + + assert track["OBJECT_LENGTH"] == 0 + assert track["LONG_DIST"] == pytest.approx(204.7) + assert track["LAT_DIST"] == 0 + assert track["REL_SPEED"] == 0 + + def test_group3_parser_selection(self, monkeypatch): + class FakeParams: + def get_int(self, key): + return 1 if key == "EnableRadarTracks" else 0 + + monkeypatch.setattr(radar_interface_module, "Params", FakeParams) + monkeypatch.setattr(hyundaicanfd, "Params", FakeParams) + cp = structs.CarParams() + cp.carFingerprint = next(car for car, dbc in radar_interface_module.DBC.items() if "hyundai_canfd" in dbc[Bus.pt]) + cp.flags = HyundaiFlags.CANFD.value + cp.extFlags = HyundaiExtFlags.RADAR_GROUP3.value + cp.radarUnavailable = False + cp.safetyConfigs = [structs.CarParams.SafetyConfig()] + + radar_interface = RadarInterface(cp) + + assert radar_interface.radar_group3 + assert radar_interface.radar_start_addr == RADAR_START_ADDR_CANFD3 + assert radar_interface.radar_msg_count == RADAR_MSG_COUNT3 + assert radar_interface.trigger_msg_tracks == 0x41D + + active_dat = bytes.fromhex("e1043b0f02590e692a227e16f80fe00f28fcc753a20a0000") + empty_dat = bytes.fromhex("c03d3b0000000000ff0700000000000000d0020000000000") + packets = [(addr, active_dat if addr == 0x406 else empty_dat, 1) for addr in range(0x400, 0x41E)] + radar_data = radar_interface.update([0, packets]) + point = next(point for point in radar_data.points if point.trackId == 38) + + assert point.measured + assert point.dRel == pytest.approx(53.1) + assert point.yRel == pytest.approx(-3.0) + assert point.vRel == pytest.approx(4.4) + + +class TestCornerRadarObjectIdentity: + @staticmethod + def set_bits(data, start, size, value): + for offset in range(size): + bit = start + offset + data[bit // 8] |= ((value >> offset) & 1) << (bit % 8) + + @pytest.mark.parametrize( + "dbc,msg_name,addr,age_signal,id_signal,age_start,id_start", + ( + ("hyundai_canfd_corner_radar_180_generated", "CORNER_RADAR_180_OBJECTS_180", 0x180, + "SLOT1_AGE", "SLOT1_OBJECT_ID", 32, 44), + ("hyundai_canfd_corner_radar_235_generated", "CORNER_RADAR_235_OBJECTS_235", 0x235, + "OBJ_AGE", "OBJ_OBJECT_ID", 32, 44), + ), + ) + def test_object_identity_signals(self, dbc, msg_name, addr, age_signal, id_signal, age_start, id_start): + data = bytearray(32) + self.set_bits(data, age_start, 8, 23) + self.set_bits(data, id_start, 7, 46) + parser = CANParser(dbc, [(msg_name, 33)], 1) + parser.update([0, [(addr, bytes(data), 1)]]) + + assert parser.vl[msg_name][age_signal] == 23 + assert parser.vl[msg_name][id_signal] == 46 + + def test_track_id_survives_slot_move_and_resets_with_age(self): + manager = CornerObjectTrackIdManager() + first_id = manager.get_track_id("corner180", object_id=108, age=240) + + assert first_id == CORNER_OBJECT_STABLE_TRACK_ID_START + assert manager.get_track_id("corner180", object_id=108, age=241) == first_id + assert manager.get_track_id("corner235", object_id=108, age=241) != first_id + assert manager.get_track_id("corner180", object_id=108, age=2) != first_id + + def test_clipped_side_object_position_is_valid(self): + assert corner_object_position_valid(0.0, 2.8) + assert corner_object_position_valid(25.0, 0.2) + assert not corner_object_position_valid(0.0, 0.0) + assert not corner_object_position_valid(0.0, 5.0) + + +class TestCornerRadar430CandidateFilter: + @staticmethod + def slot_word(distance_raw, meta13=0, b2=10, b3=2): + return distance_raw | (meta13 << 13) | (b2 << 16) | (b3 << 24) + + @classmethod + def message(cls, slots): + words = [0x010d1f40] * 7 + for slot, word in slots.items(): + words[slot - 1] = word + + dat = bytearray(32) + for idx, word in enumerate(words): + dat[4 + idx * 4:8 + idx * 4] = int(word).to_bytes(4, "little") + return bytes(dat) + + @staticmethod + def build_interface(monkeypatch): + class FakeParams: + def get_int(self, key): + return 1 if key == "EnableCornerRadar" else 0 + + monkeypatch.setattr(radar_interface_module, "Params", FakeParams) + monkeypatch.setattr(hyundaicanfd, "Params", FakeParams) + cp = structs.CarParams() + cp.carFingerprint = next(car for car, dbc in radar_interface_module.DBC.items() if "hyundai_canfd" in dbc[Bus.pt]) + cp.flags = HyundaiFlags.CANFD.value + cp.extFlags = HyundaiExtFlags.CORNER_RADAR_OBJECTS_430.value + cp.radarUnavailable = True + cp.safetyConfigs = [structs.CarParams.SafetyConfig()] + return RadarInterface(cp) + + @staticmethod + def update_frames(radar_interface, packets, frames=5): + radar_data = None + for _ in range(frames): + radar_data = radar_interface.update([0, packets]) + return radar_data + + def test_430_promotes_supported_neighbor_bins(self, monkeypatch): + radar_interface = self.build_interface(monkeypatch) + empty = self.message({}) + supported_bins = self.message({ + 6: self.slot_word(1000), + 7: self.slot_word(1004), + }) + packets = [(addr, supported_bins if addr == 0x436 else empty, 1) for addr in range(0x430, 0x438)] + packets += [(addr, empty, 1) for addr in range(0x440, 0x448)] + + radar_data = self.update_frames(radar_interface, packets) + points = {point.trackId: point for point in radar_data.points} + + assert points[300].measured + assert points[300].dRel == pytest.approx(50.1) + assert points[300].yRel == pytest.approx(2.0) + assert points[300].yvRel == 0.0 + + def test_430_expires_noncenter_inward_yvrel(self, monkeypatch): + radar_interface = self.build_interface(monkeypatch) + empty = self.message({}) + frame_defs = ( + (0x431, 4, 5), + (0x433, 3, 4), + (0x435, 2, 3), + (0x430, 5, 6), + (0x432, 4, 5), + (0x434, 3, 4), + (0x436, 2, 3), + ) + + radar_data = None + for addr, first_slot, second_slot in frame_defs: + msg = self.message({ + first_slot: self.slot_word(1000), + second_slot: self.slot_word(1004), + }) + packets = [(a, msg if a == addr else empty, 1) for a in range(0x430, 0x438)] + packets += [(a, empty, 1) for a in range(0x440, 0x448)] + radar_data = radar_interface.update([0, packets]) + radar_data = self.update_frames(radar_interface, packets, frames=3) + points = {point.trackId: point for point in radar_data.points} + + assert points[300].measured + assert points[300].yRel == pytest.approx(2.0) + assert points[300].yvRel == 0.0 diff --git a/artifacts/package_runtime/iqdbc/car/hyundai/values.py b/artifacts/package_runtime/iqdbc/car/hyundai/values.py new file mode 100644 index 000000000..4d909db4e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/hyundai/values.py @@ -0,0 +1,1070 @@ +import re +from dataclasses import dataclass, field +from enum import Enum, IntFlag + +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds +from iqdbc.car.lateral import AngleSteeringLimits +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, p16 + +Ecu = CarParams.Ecu + + +class CarControllerParams: + ACCEL_MIN = -4.0 # m/s + ACCEL_MAX = 2.5 # m/s + ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( + # LKAS angle command is unlimited, but LFA is limited to 176.7 deg (but does not fault if requesting above) + 175, # deg + # stock comma's + #([0, 9, 16, 25], [1.4, 0.6, 0.4, 0.1]), + #([0, 9, 16, 25], [1.4, 0.7, 0.5, 0.1]), + ([0, 9, 16, 25], [1.8, 1.6, 1.3, 0.8]), + ([0, 9, 16, 25], [2.4, 2.0, 1.6, 1.0]), + #([0, 9, 16, 25], [1.6, 1.0, 0.6, 0.15]), + #([0, 9, 16, 25], [2.0, 1.2, 0.8, 0.28]), + ) + # Stock LFA system is seen sending 250 max, but for LKAS events it's 175 max. + # 250 can at least achieve 4 m/s^2, 80 corresponds to ~2.5 m/s^2 + ANGLE_MAX_TORQUE = 200 # The maximum amount of torque that will be allowed + ANGLE_MIN_TORQUE = 25 # equivalent to ~0.8 m/s^2 of torque (based on ANGLE_MAX_TORQUE) when overriding + ANGLE_TORQUE_UP_RATE = 8 #2 # Indicates how fast the torque ramps up after user intervention. + ANGLE_TORQUE_DOWN_RATE = 12 #4 Indicates how fast the torque ramps down during user intervention (handing off). + + def __init__(self, CP): + self.STEER_DELTA_UP = 3 + self.STEER_DELTA_DOWN = 7 + self.STEER_DRIVER_ALLOWANCE = 50 + self.STEER_DRIVER_MULTIPLIER = 2 + self.STEER_DRIVER_FACTOR = 1 + self.STEER_THRESHOLD = 150 + self.STEER_STEP = 1 # 100 Hz + + if CP.flags & HyundaiFlags.CANFD: + self.STEER_MAX = 270 + self.STEER_DRIVER_ALLOWANCE = 250 + self.STEER_DRIVER_MULTIPLIER = 2 + self.STEER_THRESHOLD = 250 + self.STEER_DELTA_UP = 2 + self.STEER_DELTA_DOWN = 3 + + # To determine the limit for your car, find the maximum value that the stock LKAS will request. + # If the max stock LKAS request is <384, add your car to this list. + elif CP.carFingerprint in (CAR.GENESIS_G80, CAR.HYUNDAI_ELANTRA, CAR.HYUNDAI_ELANTRA_GT_I30, CAR.HYUNDAI_IONIQ, + CAR.HYUNDAI_IONIQ_EV_LTD, CAR.HYUNDAI_SANTA_FE_PHEV_2022, CAR.HYUNDAI_SONATA_LF, CAR.KIA_FORTE, CAR.KIA_NIRO_PHEV, + CAR.KIA_OPTIMA_H, CAR.KIA_OPTIMA_H_G4_FL, CAR.KIA_SORENTO): + self.STEER_MAX = 255 + + elif CP.carFingerprint in (CAR.HYUNDAI_SANTA_FE_PHEV_2022): + self.STEER_MAX = 409 + # these cars have significantly more torque than most HKG; limit to 70% of max + elif CP.flags & HyundaiFlags.ALT_LIMITS: + self.STEER_MAX = 384 + self.STEER_DELTA_UP = 2 + self.STEER_DELTA_DOWN = 3 + + # Default for most HKG + else: + self.STEER_MAX = 409 + + +class HyundaiSafetyFlags(IntFlag): + EV_GAS = 1 + HYBRID_GAS = 2 + LONG = 4 + CAMERA_SCC = 8 + CANFD_LKA_STEERING = 16 + CANFD_ALT_BUTTONS = 32 + ALT_LIMITS = 64 + CANFD_LKA_STEERING_ALT = 128 + FCEV_GAS = 256 + ALT_LIMITS_2 = 512 + + +class HyundaiSafetyFlagsIQ: + DEFAULT = 0 + ESCC = 16 + MAIN_BTN_LONG_TOGGLE = 32 + HAS_LDA_BUTTON = 64 + NON_SCC = 128 + + +class HyundaiFlagsIQ(IntFlag): + ENHANCED_SCC = 1 + HAS_LFA_BUTTON = 2 + MAIN_BTN_LONG_TOGGLE = 2 ** 2 + ENABLE_RADAR_TRACKS_DEPRECATED = 2 ** 3 + LONG_TUNING_DYNAMIC = 2 ** 4 + LONG_TUNING_PREDICTIVE = 2 ** 5 + NON_SCC = 2 ** 6 + NON_SCC_RADAR_FCA = 2 ** 7 + NON_SCC_NO_FCA = 2 ** 8 + SPEED_LIMIT_AVAILABLE = 2 ** 9 + HAS_LKAS12 = 2 ** 10 + + +class HyundaiFlags(IntFlag): + # Dynamic Flags + CANFD_HDA2 = 1 + CANFD_ALT_BUTTONS = 2 + CANFD_ALT_GEARS = 2 ** 2 + CANFD_CAMERA_SCC = 2 ** 3 + + ALT_LIMITS = 2 ** 4 + ENABLE_BLINKERS = 2 ** 5 + CANFD_ALT_GEARS_2 = 2 ** 6 + SEND_LFA = 2 ** 7 + USE_FCA = 2 ** 8 + CANFD_HDA2_ALT_STEERING = 2 ** 9 + + # these cars use a different gas signal + HYBRID = 2 ** 10 + EV = 2 ** 11 + + # Static flags + + # If 0x500 is present on bus 1 it probably has a Mando radar outputting radar points. + # If no points are outputted by default it might be possible to turn it on using iqdbc/lvbs/tools/ecu/hyundai_enable_radar_points.py + MANDO_RADAR = 2 ** 12 + CANFD = 2 ** 13 + + # The radar does SCC on these cars when HDA I, rather than the camera + RADAR_SCC = 2 ** 14 + # The camera does SCC on these cars, rather than the radar + CAMERA_SCC = CANFD_CAMERA_SCC #2 ** 15 + CHECKSUM_CRC8 = 2 ** 16 + CHECKSUM_6B = 2 ** 17 + + # these cars require a special panda safety mode due to missing counters and checksums in the messages + LEGACY = 2 ** 18 + + # these cars have not been verified to work with longitudinal yet - radar disable, sending correct messages, etc. + UNSUPPORTED_LONGITUDINAL = 2 ** 19 + + # These CAN FD cars do not accept communication control to disable the ADAS ECU, + # responds with 0x7F2822 - 'conditions not correct' + CANFD_NO_RADAR_DISABLE = 2 ** 20 + + CLUSTER_GEARS = 2 ** 21 + TCU_GEARS = 2 ** 22 + + MIN_STEER_32_MPH = 2 ** 23 + + ANGLE_CONTROL = 2 ** 24 + + FCEV = 2 ** 25 + + ALT_LIMITS_2 = 2 ** 26 + + CC_ONLY_CAR = 2 ** 31 + +class HyundaiExtFlags(IntFlag): + NAVI_CLUSTER = 2 ** 2 + HAS_LFAHDA = 2 ** 4 + CANFD_GEARS_NONE = 2 ** 6 + RADAR_GROUP1 = 2 ** 7 # 0x210 radar group 1, 0x3A5 radar group 2 + CANFD_GEARS_69 = 2 ** 10 + RADAR_GROUP3 = 2 ** 11 # 0x400-0x41D radar object group + CORNER_RADAR_OBJECTS_235 = 2 ** 12 # 0x230 status + 0x235-0x248 raw corner radar objects + CORNER_RADAR_OBJECTS_180 = 2 ** 13 # 0x180-0x184 bus 1 two-slot raw corner/front radar objects + CORNER_RADAR_OBJECTS_430 = 2 ** 14 # 0x430-0x437 left + 0x440-0x447 right IONIQ 9 corner radar bins + RADAR_GROUP4 = 2 ** 15 # 0x500-0x507 Denso DNMWR006 stable radar tracks + EV_MODE_STATUS_230 = 2 ** 16 # ECAN 0x230/DLC32 exposes the hybrid power-flow mode used for the EV indicator + +class Footnote(Enum): + CANFD = CarFootnote( + "Requires a CAN FD panda kit if not using " + + "comma 3X for this CAN FD car.", + Column.MODEL) + + +@dataclass +class HyundaiCarDocs(CarDocs): + package: str = "Smart Cruise Control (SCC)" + + def init_make(self, CP: CarParams): + if CP.flags & HyundaiFlags.CANFD: + self.footnotes.insert(0, Footnote.CANFD) + + +@dataclass +class HyundaiPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_kia_generic"}) + + def init(self): + if self.flags & HyundaiFlags.MANDO_RADAR: + self.dbc_dict = {Bus.pt: "hyundai_kia_generic", Bus.radar: 'hyundai_kia_mando_front_radar_generated'} + + if self.flags & HyundaiFlags.MIN_STEER_32_MPH: + self.specs = self.specs.override(minSteerSpeed=32 * CV.MPH_TO_MS) + + +@dataclass +class HyundaiCanFDPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_canfd_generated", Bus.radar: 'hyundai_canfd_radar_generated'}) + + def init(self): + self.flags |= HyundaiFlags.CANFD + + +class CAR(Platforms): + # Hyundai + HYUNDAI_AZERA_7TH_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Hyundai Azera 2023-24", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], + CarSpecs(mass=1700, wheelbase=2.895, steerRatio=16.5), + ) + HYUNDAI_AZERA_6TH_GEN = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), + ) + HYUNDAI_AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), + HyundaiCarDocs("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + ], + CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5), + flags=HyundaiFlags.HYBRID, + ) + HYUNDAI_ELANTRA = HyundaiPlatformConfig( + [ + # TODO: 2017-18 could be Hyundai G + HyundaiCarDocs("Hyundai Elantra 2017-18", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b])), + HyundaiCarDocs("Hyundai Elantra 2019", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_g])), + ], + # steerRatio: 14 is Stock | Settled Params Learner values are steerRatio: 15.401566348670535, stiffnessFactor settled on 1.0081302973865127 + CarSpecs(mass=1275, wheelbase=2.7, steerRatio=15.4, tireStiffnessFactor=0.385), + flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, + ) + HYUNDAI_ELANTRA_GT_I30 = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Hyundai Elantra GT 2017-20", car_parts=CarParts.common([CarHarness.hyundai_e])), + HyundaiCarDocs("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), + ], + HYUNDAI_ELANTRA.specs, + flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, + ) + HYUNDAI_ELANTRA_2021 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Elantra 2021-23", video="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=2800 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), + flags=HyundaiFlags.CHECKSUM_CRC8, + ) + HYUNDAI_ELANTRA_HEV_2021 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Elantra Hybrid 2021-23", video="https://youtu.be/_EdYQtV52-c", + car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), + flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, + ) + HYUNDAI_GENESIS = HyundaiPlatformConfig( + [ + # TODO: check 2015 packages + HyundaiCarDocs("Hyundai Genesis 2015-16", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), + HyundaiCarDocs("Genesis G80 2017", "All", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_j])), + ], + CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5, minSteerSpeed=60 * CV.KPH_TO_MS), + flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.LEGACY, + ) + HYUNDAI_IONIQ = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, + ) + HYUNDAI_IONIQ_HEV_2022 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, + ) + HYUNDAI_IONIQ_EV_LTD = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY | HyundaiFlags.MIN_STEER_32_MPH, + ) + HYUNDAI_IONIQ_EV_2020 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + flags=HyundaiFlags.EV, + ) + HYUNDAI_IONIQ_PHEV_2019 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH, + ) + HYUNDAI_IONIQ_PHEV = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + flags=HyundaiFlags.HYBRID, + ) + HYUNDAI_KONA = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Kona 2020", min_enable_speed=6 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_b]))], + CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + flags=HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.ALT_LIMITS, + ) + HYUNDAI_KONA_2022 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Kona 2022", car_parts=CarParts.common([CarHarness.hyundai_o]))], + CarSpecs(mass=1491, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + flags=HyundaiFlags.CAMERA_SCC, + ) + HYUNDAI_KONA_EV = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))], + CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + flags=HyundaiFlags.EV | HyundaiFlags.ALT_LIMITS, + ) + HYUNDAI_KONA_EV_2022 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o]))], + CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV | HyundaiFlags.ALT_LIMITS, + ) + HYUNDAI_KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Hyundai Kona Electric (with HDA II, Korea only) 2023", video="https://www.youtube.com/watch?v=U2fOCmcQ8hw", + car_parts=CarParts.common([CarHarness.hyundai_r]))], + CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385), + flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, + ) + HYUNDAI_KONA_HEV = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages, + CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + flags=HyundaiFlags.HYBRID | HyundaiFlags.ALT_LIMITS, + ) + HYUNDAI_KONA_HEV_2ND_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Hyundai Kona Hybrid 2024", car_parts=CarParts.common([CarHarness.hyundai_l]))], + CarSpecs(mass=1590, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385), + flags=HyundaiFlags.HYBRID, + ) + HYUNDAI_NEXO_1ST_GEN = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Nexo 2021", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=3990 * CV.LB_TO_KG, wheelbase=2.79, steerRatio=14.19), # https://www.hyundainews.com/assets/documents/original/42768-2021NEXOProductGuideSpecs.pdf + flags=HyundaiFlags.FCEV, + ) + HYUNDAI_SANTA_FE = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Santa Fe 2019-20", "All", video="https://youtu.be/bjDR0YjM__s", + car_parts=CarParts.common([CarHarness.hyundai_d]))], + CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82), + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, + ) + HYUNDAI_SANTA_FE_2022 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Santa Fe 2021-23", "All", video="https://youtu.be/VnHzSTygTS4", + car_parts=CarParts.common([CarHarness.hyundai_l]))], + HYUNDAI_SANTA_FE.specs, + flags=HyundaiFlags.CHECKSUM_CRC8, + ) + HYUNDAI_SANTA_FE_HEV_2022 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], + HYUNDAI_SANTA_FE.specs, + flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, + ) + HYUNDAI_SANTA_FE_PHEV_2022 = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l]))], + HYUNDAI_SANTA_FE.specs, + flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, + ) + HYUNDAI_SONATA = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Sonata 2020-23", "All", video="https://www.youtube.com/watch?v=ix63r9kE3Fw", + car_parts=CarParts.common([CarHarness.hyundai_a]))], + CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, + ) + HYUNDAI_SONATA_LF = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))], + CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable + + flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, + ) + HYUNDAI_SONATA_2024 = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Hyundai Sonata 2024-25", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], + CarSpecs(mass=1556, wheelbase=2.84, steerRatio=12.81), + flags=HyundaiFlags.CAMERA_SCC, + ) + HYUNDAI_STARIA_4TH_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=2205, wheelbase=3.273, steerRatio=11.94), # https://www.hyundai.com/content/dam/hyundai/au/en/models/staria-load/premium-pip-update-2023/spec-sheet/STARIA_Load_Spec-Table_March_2023_v3.1.pdf + ) + HYUNDAI_TUCSON = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Hyundai Tucson 2021", min_enable_speed=19 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_l])), + HyundaiCarDocs("Hyundai Tucson Diesel 2019", car_parts=CarParts.common([CarHarness.hyundai_l])), + ], + CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385), + flags=HyundaiFlags.TCU_GEARS, + ) + HYUNDAI_PALISADE = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Hyundai Palisade 2020-22", "All", video="https://youtu.be/TAnDqjF4fDY?t=456", car_parts=CarParts.common([CarHarness.hyundai_h])), + HyundaiCarDocs("Kia Telluride 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), + ], + CarSpecs(mass=1999, wheelbase=2.9, steerRatio=15.6 * 1.15, tireStiffnessFactor=0.63), + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8, + ) + HYUNDAI_VELOSTER = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e]))], + CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor=0.5), + flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS, + ) + HYUNDAI_SONATA_HYBRID = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], + HYUNDAI_SONATA.specs, + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, + ) + HYUNDAI_IONIQ_5 = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Hyundai Ioniq 5 (Southeast Asia and Europe only) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), + HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), + HyundaiCarDocs("Hyundai Ioniq 5 (with HDA II) 2022-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), + ], + CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65), + flags=HyundaiFlags.EV, + ) + HYUNDAI_IONIQ_5_PE = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Hyundai Ioniq 5 PE (without HDA II) 2024", car_parts=CarParts.common([CarHarness.hyundai_q])), + HyundaiCarDocs("Hyundai Ioniq 5 PE (with HDA II) 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), + ], + #CarSpecs(mass=2012, wheelbase=3.0, steerRatio=14.26, tireStiffnessFactor=0.65), + CarSpecs(mass=2012, wheelbase=3.0, steerRatio=14.26, tireStiffnessFactor=1.0), + flags=HyundaiFlags.EV | HyundaiFlags.ANGLE_CONTROL, + ) + HYUNDAI_IONIQ_5_N = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Hyundai Ioniq 5 N (with HDA II) 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_m]))], + CarSpecs(mass=2200, wheelbase=3.00, steerRatio=12.54), + flags=HyundaiFlags.EV, + ) + HYUNDAI_IONIQ_6 = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Hyundai Ioniq 6 (with HDA II) 2023-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))], + HYUNDAI_IONIQ_5.specs, + flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, + ) + HYUNDAI_IONIQ_9 = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Hyundai Ioniq 9 2026", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), + ], + CarSpecs(mass=2505, wheelbase=3.13, steerRatio=16.02), + flags=HyundaiFlags.EV | HyundaiFlags.ANGLE_CONTROL, + ) + HYUNDAI_TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Hyundai Tucson 2023-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Hyundai Tucson Hybrid 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Hyundai Tucson Plug-in Hybrid 2024", "All", car_parts=CarParts.common([CarHarness.hyundai_n])), + ], + CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385), + ) + HYUNDAI_SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))], + # weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf + CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2), + ) + HYUNDAI_CUSTIN_1ST_GEN = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner + flags=HyundaiFlags.CHECKSUM_CRC8, + ) + HYUNDAI_CASPER = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Casper 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=1060, wheelbase=2.4, steerRatio=14.3), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner + flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.CHECKSUM_CRC8, + ) + + HYUNDAI_CASPER_EV = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Casper Electric 2024", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=1355, wheelbase=2.58, steerRatio=14.3), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner + flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.EV + ) + HYUNDAI_PORTER_II_EV = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Porter II Electric 2024", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=1970, wheelbase=2.64, steerRatio=14.5), + flags=HyundaiFlags.EV | HyundaiFlags.CC_ONLY_CAR, + ) + HYUNDAI_SANTAFE_MX5 = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Hyundai Santa Fe (MX5) 2024", car_parts=CarParts.common([CarHarness.hyundai_k])), + ], + CarSpecs(mass=1910, wheelbase=2.76, steerRatio=15.8, tireStiffnessFactor=0.82), + flags=HyundaiFlags.ANGLE_CONTROL, + ) + HYUNDAI_SANTAFE_MX5_HEV = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Hyundai Santa Fe Hybrid (MX5) 2024", car_parts=CarParts.common([CarHarness.hyundai_k])), + ], + HYUNDAI_SANTAFE_MX5.specs, + flags=HyundaiFlags.ANGLE_CONTROL, + ) + + # Kia + KIA_FORTE = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Kia Forte 2019-21", min_enable_speed=6 * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_g])), + HyundaiCarDocs("Kia Forte 2022-23", car_parts=CarParts.common([CarHarness.hyundai_e])), + ], + CarSpecs(mass=2878 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5) + ) + KIA_K5_2021 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))], + CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims) + flags=HyundaiFlags.CHECKSUM_CRC8, + ) + KIA_K5_HEV_2020 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))], + KIA_K5_2021.specs, + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, + ) + KIA_K5_DL3_24 = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia K5 (South Korea only) 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_k])), + ], + CarSpecs(mass=1553, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), + ) + KIA_K5_DL3_24_HEV = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia K5 Hybrid (South Korea only) 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_k])), + ], + CarSpecs(mass=1553, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), + ) + KIA_K8_HEV_1ST_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q]))], + # mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform + CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27) + ) + KIA_NIRO_EV = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Kia Niro EV 2019", "All", video="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), + HyundaiCarDocs("Kia Niro EV 2020", "All", video="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_f])), + HyundaiCarDocs("Kia Niro EV 2021", "All", video="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_c])), + HyundaiCarDocs("Kia Niro EV 2022", "All", video="https://www.youtube.com/watch?v=lT7zcG6ZpGo", car_parts=CarParts.common([CarHarness.hyundai_h])), + ], + CarSpecs(mass=3543 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=13.6, tireStiffnessFactor=0.385), # average of all the cars + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV, + ) + KIA_NIRO_EV_2ND_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], + KIA_NIRO_EV.specs, + flags=HyundaiFlags.EV, + ) + KIA_NIRO_PHEV = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Kia Niro Hybrid 2018", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2018-19", "All", min_enable_speed=10. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_c])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_d])), + ], + KIA_NIRO_EV.specs, + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.MIN_STEER_32_MPH, + ) + KIA_NIRO_PHEV_2022 = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), + HyundaiCarDocs("Kia Niro Plug-in Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), + ], + KIA_NIRO_EV.specs, + flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR, + ) + KIA_NIRO_HEV_2021 = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), + HyundaiCarDocs("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), + ], + KIA_NIRO_EV.specs, + flags=HyundaiFlags.HYBRID, + ) + KIA_NIRO_HEV_2ND_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a]))], + KIA_NIRO_EV.specs, + ) + KIA_OPTIMA_G4 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Optima 2017", "Advanced Smart Cruise Control", + car_parts=CarParts.common([CarHarness.hyundai_b]))], # TODO: may support 2016, 2018 + CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), + flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS | HyundaiFlags.MIN_STEER_32_MPH, + ) + KIA_OPTIMA_G4_FL = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g]))], + CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), + flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, + ) + # TODO: may support adjacent years. may have a non-zero minimum steering speed + KIA_OPTIMA_H = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=3758 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), + flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, + ) + KIA_OPTIMA_H_G4_FL = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), + flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, + ) + KIA_SELTOS = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a]))], + CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), + flags=HyundaiFlags.CHECKSUM_CRC8, + ) + KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia Sportage 2023-24", car_parts=CarParts.common([CarHarness.hyundai_n])), + HyundaiCarDocs("Kia Sportage Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), + ], + # weight from SX and above trims, average of FWD and AWD version, steering ratio according to Kia News https://www.kiamedia.com/us/en/models/sportage/2023/specifications + CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6), + ) + KIA_SORENTO = HyundaiPlatformConfig( + [ + HyundaiCarDocs("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video="https://www.youtube.com/watch?v=Fkh3s6WHJz8", + car_parts=CarParts.common([CarHarness.hyundai_e])), + HyundaiCarDocs("Kia Sorento 2019", video="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])), + ], + CarSpecs(mass=1985, wheelbase=2.78, steerRatio=14.4 * 1.1), # 10% higher at the center seems reasonable + dbc_dict={Bus.pt: "hyundai_kia_generic", Bus.radar: "hyundai_kia_denso_front_radar_generated"}, + flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, + ) + KIA_SORENTO_4TH_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms + flags=HyundaiFlags.RADAR_SCC, + ) + KIA_SORENTO_HEV_4TH_GEN = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia Sorento Hybrid 2021-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), + HyundaiCarDocs("Kia Sorento Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), + ], + CarSpecs(mass=4395 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms + flags=HyundaiFlags.RADAR_SCC, + ) + KIA_STINGER = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Stinger 2018-20", video="https://www.youtube.com/watch?v=MJ94qoofYw0", + car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1825, wheelbase=2.78, steerRatio=14.4 * 1.15) # 15% higher at the center seems reasonable + ) + KIA_STINGER_2022 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + KIA_STINGER.specs, + ) + KIA_CEED = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Ceed 2019-21", car_parts=CarParts.common([CarHarness.hyundai_e]))], + CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5), + flags=HyundaiFlags.LEGACY, + ) + KIA_EV4 = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Kia EV4 2025", "All", car_parts=CarParts.common([CarHarness.hyundai_q]))], + CarSpecs(mass=1710, wheelbase=2.83, steerRatio=14.5, tireStiffnessFactor=0.65), + flags=HyundaiFlags.EV, + ) + KIA_EV6 = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia EV6 (Southeast Asia only) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_p])), + HyundaiCarDocs("Kia EV6 (without HDA II) 2022-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])), + HyundaiCarDocs("Kia EV6 (with HDA II) 2022-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p])) + ], + CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65), + flags=HyundaiFlags.EV, + ) + KIA_EV6_PE = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia EV6 PE (without HDA II) 2025", car_parts=CarParts.common([CarHarness.hyundai_p])), + HyundaiCarDocs("Kia EV6 PE (with HDA II) 2025", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p])) + ], + CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65), + flags=HyundaiFlags.EV | HyundaiFlags.ANGLE_CONTROL, + ) + KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia Carnival 2022-24", car_parts=CarParts.common([CarHarness.hyundai_a])), + HyundaiCarDocs("Kia Carnival (China only) 2023", car_parts=CarParts.common([CarHarness.hyundai_k])) + ], + CarSpecs(mass=2087, wheelbase=3.09, steerRatio=14.23), + flags=HyundaiFlags.RADAR_SCC, + ) + + # Genesis + GENESIS_GV60_EV_1ST_GEN = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Genesis GV60 (Advanced Trim) 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), + HyundaiCarDocs("Genesis GV60 (Performance Trim) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + ], + CarSpecs(mass=2205, wheelbase=2.9, steerRatio=17.6), + flags=HyundaiFlags.EV, + ) + GENESIS_G70 = HyundaiPlatformConfig( + [HyundaiCarDocs("Genesis G70 2018", "All", car_parts=CarParts.common([CarHarness.hyundai_f]))], + CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), + flags=HyundaiFlags.LEGACY, + ) + GENESIS_G70_2020 = HyundaiPlatformConfig( + [ + # TODO: 2021 MY harness is unknown + HyundaiCarDocs("Genesis G70 2019-21", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + # TODO: From 3.3T Sport Advanced 2022 & Prestige 2023 Trim, 2.0T is unknown + HyundaiCarDocs("Genesis G70 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), + ], + GENESIS_G70.specs, + flags=HyundaiFlags.MANDO_RADAR, + ) + GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig( + [ + # TODO: Hyundai P is likely the correct harness for HDA II for 2.5T (unsupported due to missing ADAS ECU, is that the radar?) + HyundaiCarDocs("Genesis GV70 (2.5T Trim, without HDA II) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), + HyundaiCarDocs("Genesis GV70 (3.5T Trim, without HDA II) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), + ], + CarSpecs(mass=1950, wheelbase=2.87, steerRatio=14.6), + flags=HyundaiFlags.RADAR_SCC, + ) + GENESIS_GV70_ELECTRIFIED_1ST_GEN = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Genesis GV70 Electrified (Australia Only) 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), + HyundaiCarDocs("Genesis GV70 Electrified (with HDA II) 2023-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), + ], + CarSpecs(mass=2260, wheelbase=2.87, steerRatio=17.1), + flags=HyundaiFlags.EV, + ) + GENESIS_G80 = HyundaiPlatformConfig( + [HyundaiCarDocs("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5), + flags=HyundaiFlags.LEGACY, + ) + GENESIS_G80_2ND_GEN_FL = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Genesis G80 (2.5T Advanced Trim, with HDA II) 2024", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))], + CarSpecs(mass=2060, wheelbase=3.00, steerRatio=14.0), + ) + GENESIS_G90 = HyundaiPlatformConfig( + [HyundaiCarDocs("Genesis G90 2017-20", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069), + ) + GENESIS_GV80 = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))], + CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14), + flags=HyundaiFlags.RADAR_SCC, + ) + GENESIS_GV70_EV_1ST_GEN = HyundaiCanFDPlatformConfig( + [HyundaiCarDocs("Genesis GV70 Electrified (South Korea only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_m]))], + CarSpecs(mass=2230, wheelbase=2.87, steerRatio=14.6), + flags=HyundaiFlags.EV | HyundaiFlags.RADAR_SCC, + ) + HYUNDAI_GRANDEUR_IG = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Grandeur 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1570, wheelbase=2.845, steerRatio=16., tireStiffnessFactor=0.7), + flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS, + ) + HYUNDAI_GRANDEUR_IG_HEV = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Grandeur Hybrid 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1570, wheelbase=2.845, steerRatio=16., tireStiffnessFactor=0.7), + flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, + ) + GENESIS_EQ900 = HyundaiPlatformConfig( + [HyundaiCarDocs("Genesis EQ900 2017", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=2200, wheelbase=3.15, steerRatio=16., tireStiffnessFactor=0.7), + flags=HyundaiFlags.LEGACY, + ) + GENESIS_EQ900_L = HyundaiPlatformConfig( + [HyundaiCarDocs("Genesis EQ900 Limousine 2016-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=2290, wheelbase=3.45, steerRatio=16., tireStiffnessFactor=0.7), + flags=HyundaiFlags.LEGACY, + ) + GENESIS_G90_2019 = HyundaiPlatformConfig( + [HyundaiCarDocs("Genesis G90 (South Korea only) 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=2150, wheelbase=3.16, steerRatio=16., tireStiffnessFactor=0.7), + flags=HyundaiFlags.LEGACY, + ) + HYUNDAI_NEXO = HyundaiPlatformConfig( + [HyundaiCarDocs("Hyundai Nexo (South Korea only) 2018-20", "All", car_parts=CarParts.common([CarHarness.hyundai_a]))], + CarSpecs(mass=1885, wheelbase=2.79, steerRatio=15.3, tireStiffnessFactor=0.385), + flags=HyundaiFlags.EV, + ) + KIA_MOHAVE = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Mohave 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))], + CarSpecs(mass=2285, wheelbase=2.895, steerRatio=16., tireStiffnessFactor=0.7), + flags=HyundaiFlags.LEGACY, + ) + KIA_K5 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K5 2016, 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_b]))], + CarSpecs(mass=1515, wheelbase=2.80, steerRatio=15.5, tireStiffnessFactor=0.7), + flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS, + ) + KIA_K5_HEV = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K5 Hybrid 2017", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1705, wheelbase=2.80, steerRatio=15.5, tireStiffnessFactor=0.7), + flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, + ) + KIA_K5_HEV_2022 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K5 Hybrid (South Korea only) 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1515, wheelbase=2.85, steerRatio=15.5, tireStiffnessFactor=0.7), + flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, + ) + KIA_K7 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K7 2016-19", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1850, wheelbase=2.855, steerRatio=15.5, tireStiffnessFactor=0.7), + flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS, + ) + KIA_K7_HEV = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K7 Hybrid 2016-19", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1515, wheelbase=2.855, steerRatio=15.5, tireStiffnessFactor=0.7), + flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY, + ) + KIA_K7_PE = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K7 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1850, wheelbase=2.855, steerRatio=15.5, tireStiffnessFactor=0.7), + ) + KIA_K7_HEV_PE = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K7 Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1515, wheelbase=2.855, steerRatio=15.5, tireStiffnessFactor=0.7), + flags=HyundaiFlags.HYBRID, + ) + KIA_K9 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia K9 2016-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=2075, wheelbase=3.15, steerRatio=14.5, tireStiffnessFactor=0.7), + flags=HyundaiFlags.LEGACY, + ) + KIA_EV_SK3 = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Soul EV 2019", car_parts=CarParts.common([CarHarness.hyundai_c]))], + CarSpecs(mass=1695, wheelbase=2.6, steerRatio=13.75), + flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.EV, + ) + KIA_EV9 = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia EV9 (MV) 2024", car_parts=CarParts.common([CarHarness.hyundai_k])), + ], + CarSpecs(mass=2625, wheelbase=3.1, steerRatio=16.02), + flags=HyundaiFlags.EV | HyundaiFlags.ANGLE_CONTROL, + ) + KIA_EV3 = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia EV3 (SV1) 2025", car_parts=CarParts.common([CarHarness.hyundai_n])), + ], + CarSpecs(mass=2055, wheelbase=2.90, steerRatio=16.0, tireStiffnessFactor=0.65), + flags=HyundaiFlags.EV, + ) + KIA_PV5 = HyundaiCanFDPlatformConfig( + [ + HyundaiCarDocs("Kia PV5 (SW1) 2025", car_parts=CarParts.common([CarHarness.hyundai_n])), + ], + CarSpecs(mass=2600, wheelbase=2.995, steerRatio=16.0, tireStiffnessFactor=0.65), + flags=HyundaiFlags.EV, + ) + KIA_RAY_EV = HyundaiPlatformConfig( + [HyundaiCarDocs("Kia Ray EV 2024", car_parts=CarParts.common([CarHarness.hyundai_h]))], + CarSpecs(mass=1295, wheelbase=2.520, steerRatio=14.5), + flags=HyundaiFlags.EV | HyundaiFlags.CC_ONLY_CAR | HyundaiFlags.CHECKSUM_CRC8, + ) + +class Buttons: + NONE = 0 + RES_ACCEL = 1 + SET_DECEL = 2 + GAP_DIST = 3 + CANCEL = 4 # on newer models, this is a pause/resume button + LFA_BUTTON = 5 + + +def get_platform_codes(fw_versions: list[bytes]) -> set[tuple[bytes, bytes | None]]: + # Returns unique, platform-specific identification codes for a set of versions + codes = set() # (code-Optional[part], date) + for fw in fw_versions: + code_match = PLATFORM_CODE_FW_PATTERN.search(fw) + part_match = PART_NUMBER_FW_PATTERN.search(fw) + date_match = DATE_FW_PATTERN.search(fw) + if code_match is not None: + code: bytes = code_match.group() + part = part_match.group() if part_match else None + date = date_match.group() if date_match else None + if part is not None: + # part number starts with generic ECU part type, add what is specific to platform + code += b"-" + part[-5:] + + codes.add((code, date)) + return codes + + +def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: + # Non-electric CAN FD platforms often do not have platform code specifiers needed + # to distinguish between hybrid and ICE. All EVs so far are either exclusively + # electric or specify electric in the platform code. + fuzzy_platform_blacklist = {str(c) for c in (CANFD_CAR - EV_CAR - CANFD_FUZZY_WHITELIST)} + candidates: set[str] = set() + + for candidate, fws in offline_fw_versions.items(): + # Keep track of ECUs which pass all checks (platform codes, within date range) + valid_found_ecus = set() + valid_expected_ecus = {ecu[1:] for ecu in fws if ecu[0] in PLATFORM_CODE_ECUS} + for ecu, expected_versions in fws.items(): + addr = ecu[1:] + # Only check ECUs expected to have platform codes + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + # Expected platform codes & dates + codes = get_platform_codes(expected_versions) + expected_platform_codes = {code for code, _ in codes} + expected_dates = {date for _, date in codes if date is not None} + + # Found platform codes & dates + codes = get_platform_codes(live_fw_versions.get(addr, set())) + found_platform_codes = {code for code, _ in codes} + found_dates = {date for _, date in codes if date is not None} + + # Check platform code + part number matches for any found versions + if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes): + break + + if ecu[0] in DATE_FW_ECUS: + # If ECU can have a FW date, require it to exist + # (this excludes candidates in the database without dates) + if not len(expected_dates) or not len(found_dates): + break + + # Check any date within range in the database, format is %y%m%d + if not any(min(expected_dates) <= found_date <= max(expected_dates) for found_date in found_dates): + break + + valid_found_ecus.add(addr) + + # If all live ECUs pass all checks for candidate, add it as a match + if valid_expected_ecus.issubset(valid_found_ecus): + candidates.add(candidate) + + return candidates - fuzzy_platform_blacklist + + +HYUNDAI_VERSION_REQUEST_LONG = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(0xf100) # Long description + +HYUNDAI_VERSION_REQUEST_ALT = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(0xf110) # Alt long description + +HYUNDAI_ECU_MANUFACTURING_DATE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.ECU_MANUFACTURING_DATE) + +HYUNDAI_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + +# Regex patterns for parsing platform code, FW date, and part number from FW versions +PLATFORM_CODE_FW_PATTERN = re.compile(b'((?<=' + HYUNDAI_VERSION_REQUEST_LONG[1:] + + b')[A-Z]{2}[A-Za-z0-9]{0,2})') +DATE_FW_PATTERN = re.compile(b'(?<=[ -])([0-9]{6}$)') +PART_NUMBER_FW_PATTERN = re.compile(b'(?<=[0-9][.,][0-9]{2} )([0-9]{5}[-/]?[A-Z][A-Z0-9]{3}[0-9])') + +# We've seen both ICE and hybrid for these platforms, and they have hybrid descriptors (e.g. MQ4 vs MQ4H) +CANFD_FUZZY_WHITELIST = {CAR.KIA_SORENTO_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN, CAR.KIA_K8_HEV_1ST_GEN, + # TODO: the hybrid variant is not out yet + CAR.KIA_CARNIVAL_4TH_GEN} + +# List of ECUs expected to have platform codes, camera and radar should exist on all cars +# TODO: use abs, it has the platform code and part number on many platforms +PLATFORM_CODE_ECUS = [Ecu.fwdRadar, Ecu.fwdCamera, Ecu.eps] +# So far we've only seen dates in fwdCamera +# TODO: there are date codes in the ABS firmware versions in hex +DATE_FW_ECUS = [Ecu.fwdCamera] + +# Note: an ECU on CAN FD cars may sometimes send 0x30080aaaaaaaaaaa (flow control continue) while we +# are attempting to query ECUs. This currently does not seem to affect fingerprinting from the camera +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + # TODO: add back whitelists + # CAN queries (OBD-II port) + Request( + [HYUNDAI_VERSION_REQUEST_LONG], + [HYUNDAI_VERSION_RESPONSE], + ), + + # CAN & CAN-FD queries (from camera) + Request( + [HYUNDAI_VERSION_REQUEST_LONG], + [HYUNDAI_VERSION_RESPONSE], + bus=0, + auxiliary=True, + ), + Request( + [HYUNDAI_VERSION_REQUEST_LONG], + [HYUNDAI_VERSION_RESPONSE], + bus=1, + auxiliary=True, + obd_multiplexing=False, + ), + + # CAN & CAN FD query to understand the three digit date code + # LKA steering cars usually use 6 digit date codes, so skip bus 1 + Request( + [HYUNDAI_ECU_MANUFACTURING_DATE], + [HYUNDAI_VERSION_RESPONSE], + bus=0, + auxiliary=True, + logging=True, + ), + + # CAN-FD alt request logging queries for hvac and parkingAdas + Request( + [HYUNDAI_VERSION_REQUEST_ALT], + [HYUNDAI_VERSION_RESPONSE], + bus=0, + auxiliary=True, + logging=True, + ), + Request( + [HYUNDAI_VERSION_REQUEST_ALT], + [HYUNDAI_VERSION_RESPONSE], + bus=1, + auxiliary=True, + logging=True, + obd_multiplexing=False, + ), + ], + # We lose these ECUs without the comma power on these cars. + # Note that we still attempt to match with them when they are present + non_essential_ecus={ + Ecu.abs: [CAR.HYUNDAI_PALISADE, CAR.HYUNDAI_SONATA, CAR.HYUNDAI_SANTA_FE_2022, CAR.KIA_K5_2021, CAR.HYUNDAI_ELANTRA_2021, + CAR.HYUNDAI_SANTA_FE, CAR.HYUNDAI_KONA_EV_2022, CAR.HYUNDAI_KONA_EV, CAR.HYUNDAI_CUSTIN_1ST_GEN, CAR.KIA_SORENTO, + CAR.KIA_CEED, CAR.KIA_SELTOS], + }, + extra_ecus=[ + (Ecu.adas, 0x730, None), # ADAS Driving ECU on platforms with LKA steering + (Ecu.parkingAdas, 0x7b1, None), # ADAS Parking ECU (may exist on all platforms) + (Ecu.hvac, 0x7b3, None), # HVAC Control Assembly + (Ecu.cornerRadar, 0x7b7, None), + (Ecu.combinationMeter, 0x7c6, None), # CAN FD Instrument cluster + ], + # Custom fuzzy fingerprinting function using platform codes, part numbers + FW dates: + match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, +) + +CHECKSUM = { + "crc8": CAR.with_flags(HyundaiFlags.CHECKSUM_CRC8), + "6B": CAR.with_flags(HyundaiFlags.CHECKSUM_6B), +} + +CAN_GEARS = { + # which message has the gear. hybrid and EV use ELECT_GEAR + "use_cluster_gears": CAR.with_flags(HyundaiFlags.CLUSTER_GEARS), + "use_tcu_gears": CAR.with_flags(HyundaiFlags.TCU_GEARS), + "send_mdps12": {CAR.GENESIS_G90, CAR.GENESIS_G90_2019, CAR.KIA_K9, CAR.KIA_K7}, +} + +CANFD_CAR = CAR.with_flags(HyundaiFlags.CANFD) +CANFD_RADAR_SCC_CAR = CAR.with_flags(HyundaiFlags.RADAR_SCC) # TODO: merge with UNSUPPORTED_LONGITUDINAL_CAR + +CANFD_HYBRID_STATUS_ADDR = 0xFA +CANFD_HYBRID_STATUS_DLC = 32 + +EV_MODE_STATUS_ADDR = 0x230 +EV_MODE_STATUS_DLC = 32 +EV_MODE_STATUS_MSG = "HCU_STATUS_230" +EV_MODE_STATUS_SIGNAL = "HYBRID_POWER_FLOW_MODE" +EV_MODE_ACTIVE_VALUES = frozenset((1, 2, 6)) + +CANFD_UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.CANFD_NO_RADAR_DISABLE) # TODO: merge with UNSUPPORTED_LONGITUDINAL_CAR + +CAMERA_SCC_CAR = CAR.with_flags(HyundaiFlags.CAMERA_SCC) + +HYBRID_CAR = CAR.with_flags(HyundaiFlags.HYBRID) + +EV_CAR = CAR.with_flags(HyundaiFlags.EV) + +LEGACY_SAFETY_MODE_CAR = CAR.with_flags(HyundaiFlags.LEGACY) + +# TODO: another PR with (HyundaiFlags.LEGACY | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.CAMERA_SCC | +# HyundaiFlags.CANFD_RADAR_SCC | HyundaiFlags.CANFD_NO_RADAR_DISABLE | ) +UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.LEGACY) | CAR.with_flags(HyundaiFlags.UNSUPPORTED_LONGITUDINAL) + +DBC = CAR.create_dbc_map() + +if __name__ == "__main__": + cars = [] + for platform in CAR: + for doc in platform.config.car_docs: + cars.append(doc.name) + cars.sort() + for c in cars: + print(c) diff --git a/artifacts/package_runtime/iqdbc/car/include/c++.capnp b/artifacts/package_runtime/iqdbc/car/include/c++.capnp new file mode 100644 index 000000000..2bda54717 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/include/c++.capnp @@ -0,0 +1,26 @@ +# Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors +# Licensed under the MIT License: +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +@0xbdf87d7bb8304e81; +$namespace("capnp::annotations"); + +annotation namespace(file): Text; +annotation name(field, enumerant, struct, enum, interface, method, param, group, union): Text; diff --git a/artifacts/package_runtime/iqdbc/car/interfaces.py b/artifacts/package_runtime/iqdbc/car/interfaces.py new file mode 100644 index 000000000..55d457019 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/interfaces.py @@ -0,0 +1,476 @@ +import os +import numpy as np +import time +import tomllib +from abc import abstractmethod, ABC +from enum import StrEnum +from typing import Any +from collections.abc import Callable +from functools import cache + +from iqdbc.car import DT_CTRL, apply_hysteresis, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG +from iqdbc.car import structs +from iqdbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable +from iqdbc.car.common.basedir import BASEDIR +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.common.simple_kalman import KF1D, get_kalman_gain +from iqdbc.car.values import PLATFORMS +from iqdbc.can import CANParser +from iqdbc.car.carlog import carlog + +from iqdbc.lvbs.car.interfaces import CarInterfaceBaseIQ + +GearShifter = structs.CarState.GearShifter +ButtonType = structs.CarState.ButtonEvent.Type + +V_CRUISE_MAX = 196 +MAX_CTRL_SPEED = (V_CRUISE_MAX + 4) * CV.KPH_TO_MS +ACCEL_MAX = 2.0 +ACCEL_MIN = -3.5 + +TORQUE_PARAMS_PATH = os.path.join(BASEDIR, 'torque_data/params.toml') +TORQUE_OVERRIDE_PATH = os.path.join(BASEDIR, 'torque_data/override.toml') +TORQUE_SUBSTITUTE_PATH = os.path.join(BASEDIR, 'torque_data/substitute.toml') + +GEAR_SHIFTER_MAP: dict[str, structs.CarState.GearShifter] = { + 'P': GearShifter.park, 'PARK': GearShifter.park, + 'R': GearShifter.reverse, 'REVERSE': GearShifter.reverse, + 'N': GearShifter.neutral, 'NEUTRAL': GearShifter.neutral, + 'E': GearShifter.eco, 'ECO': GearShifter.eco, + 'T': GearShifter.manumatic, 'MANUAL': GearShifter.manumatic, + 'D': GearShifter.drive, 'DRIVE': GearShifter.drive, + 'S': GearShifter.sport, 'SPORT': GearShifter.sport, + 'L': GearShifter.low, 'LOW': GearShifter.low, + 'B': GearShifter.brake, 'BRAKE': GearShifter.brake, +} + +TorqueFromLateralAccelCallbackType = Callable[[float, structs.CarParams.LateralTorqueTuning, bool], float] +LateralAccelFromTorqueCallbackType = Callable[[float, structs.CarParams.LateralTorqueTuning, bool], float] + + +@cache +def get_torque_params(): + with open(TORQUE_SUBSTITUTE_PATH, 'rb') as f: + sub = tomllib.load(f) + with open(TORQUE_PARAMS_PATH, 'rb') as f: + params = tomllib.load(f) + with open(TORQUE_OVERRIDE_PATH, 'rb') as f: + override = tomllib.load(f) + + torque_params = {} + for candidate in (sub.keys() | params.keys() | override.keys()) - {'legend'}: + if sum([candidate in x for x in [sub, params, override]]) > 1: + raise RuntimeError(f'{candidate} is defined twice in torque config') + + sub_candidate = sub.get(candidate, candidate) + + if sub_candidate in override: + out = override[sub_candidate] + elif sub_candidate in params: + out = params[sub_candidate] + else: + raise NotImplementedError(f"Did not find torque params for {sub_candidate}") + + torque_params[sub_candidate] = {key: out[i] for i, key in enumerate(params['legend'])} + if candidate in sub: + torque_params[candidate] = torque_params[sub_candidate] + + return torque_params + +# generic car and radar interfaces + + +class RadarInterfaceBase(ABC): + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + self.rcp = None + self.pts: dict[int, structs.RadarData.RadarPoint] = {} + self.frame = 0 + + def update(self, can_packets: list[tuple[int, list[CanData]]]) -> structs.RadarDataT | None: + self.frame += 1 + if (self.frame % 5) == 0: # 20 Hz is very standard + return structs.RadarData() + return None + + +class CarInterfaceBase(ABC, CarInterfaceBaseIQ): + CarState: type['CarStateBase'] + CarController: type['CarControllerBase'] + RadarInterface: type['RadarInterfaceBase'] = RadarInterfaceBase + + DRIVABLE_GEARS: tuple[structs.CarState.GearShifter, ...] = () + + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + + self.frame = 0 + self.v_ego_cluster_seen = False + + self.CS: CarStateBase = self.CarState(CP, CP_IQ) + self.can_parsers: dict[StrEnum, CANParser] = self.CS.get_can_parsers(CP, CP_IQ) + + dbc_names = {bus: cp.dbc_name for bus, cp in self.can_parsers.items()} + self.CC: CarControllerBase = self.CarController(dbc_names, CP, CP_IQ) + + def apply(self, c: structs.CarControl, c_iq: structs.IQCarControl, now_nanos: int | None = None, + model=None) -> tuple[structs.CarControl.Actuators, list[CanData]]: + if now_nanos is None: + now_nanos = int(time.monotonic() * 1e9) + # modelV2 for cars that render it on the dash; an attr so every CarController.update keeps its signature + self.CC.model = model + return self.CC.update(c, c_iq, self.CS, now_nanos) + + @staticmethod + def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed): + return ACCEL_MIN, ACCEL_MAX + + @classmethod + def get_non_essential_params(cls, candidate: str) -> structs.CarParams: + """ + Parameters essential to controlling the car may be incomplete or wrong without FW versions or fingerprints. + """ + return cls.get_params(candidate, gen_empty_fingerprint(), list(), False, False, False) + + @classmethod + def get_non_essential_params_iq(cls, car_params, candidate: str) -> structs.IQCarParams: + return cls.get_params_iq(car_params, candidate, gen_empty_fingerprint(), list(), False, False, False) + + @classmethod + def get_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], + alpha_long: bool, is_release: bool, docs: bool) -> structs.CarParams: + ret = CarInterfaceBase.get_std_params(candidate) + + platform = PLATFORMS[candidate] + ret.mass = platform.config.specs.mass + ret.wheelbase = platform.config.specs.wheelbase + ret.steerRatio = platform.config.specs.steerRatio + ret.centerToFront = ret.wheelbase * platform.config.specs.centerToFrontRatio + ret.minEnableSpeed = platform.config.specs.minEnableSpeed + ret.minSteerSpeed = platform.config.specs.minSteerSpeed + ret.tireStiffnessFactor = platform.config.specs.tireStiffnessFactor + ret.flags |= int(platform.config.flags) + + ret = cls._get_params(ret, candidate, fingerprint, car_fw, alpha_long, is_release, docs) + + # Vehicle mass is published curb weight plus assumed payload such as a human driver; notCars have no assumed payload + if not ret.notCar: + ret.mass = ret.mass + STD_CARGO_KG + + # Set params dependent on values set by the car interface + ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase) + ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront, ret.tireStiffnessFactor) + + return ret + + @classmethod + def get_params_iq(cls, car_params, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], alpha_long: bool, + is_release_iq: bool, docs: bool) -> structs.IQCarParams: + car_params_iq = structs.IQCarParams() + + platform = PLATFORMS[candidate] + car_params_iq.flags |= int(platform.config.iq_flags) + car_params_iq.pcmCruiseSpeed = True + + return cls._get_params_iq(car_params, car_params_iq, candidate, fingerprint, car_fw, alpha_long, is_release_iq, docs) + + @staticmethod + @abstractmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release: bool, docs: bool) -> structs.CarParams: + raise NotImplementedError + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + carlog.debug(f"Car {candidate} does not have a _get_params_iq method, using defaults") + return ret + + @classmethod + def get_longitudinal_tuning_iq(cls, stock_cp: structs.CarParams, ret: structs.IQCarParams) -> structs.IQCarParams: + return cls._get_longitudinal_tuning_iq(stock_cp, ret) + + @staticmethod + def _get_longitudinal_tuning_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams) -> structs.IQCarParams: + """Apply longitudinal tuning specific to the car's brand. """ + carlog.debug(f"Car {stock_cp.carFingerprint} does not have a _get_longitudinal_tuning_iq method, using defaults") + return ret + + @staticmethod + def pre_init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv: CanRecvCallable, can_send: CanSendCallable): + """Used to check conditions to disable longitudinal ECUs as needed and set/change car params""" + + @staticmethod + def init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv: CanRecvCallable, can_send: CanSendCallable): + """Used to disable longitudinal ECUs as needed""" + + @staticmethod + def pre_init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv: CanRecvCallable, can_send: CanSendCallable): + """Optional early setup hook used before interface initialization.""" + + @staticmethod + def deinit(CP: structs.CarParams, can_recv: CanRecvCallable, can_send: CanSendCallable): + """Used to re-enable longitudinal ECUs as needed""" + + @staticmethod + def get_steer_feedforward_default(desired_angle, v_ego): + # Proportional to realigning tire momentum: lateral acceleration. + return desired_angle * (v_ego**2) + + def get_steer_feedforward_function(self): + return self.get_steer_feedforward_default + + def torque_from_lateral_accel_linear(self, lateral_acceleration: float, torque_params: structs.CarParams.LateralTorqueTuning) -> float: + # The default is a linear relationship between torque and lateral acceleration (accounting for road roll and steering friction) + return lateral_acceleration / float(torque_params.latAccelFactor) + + def torque_from_lateral_accel(self) -> TorqueFromLateralAccelCallbackType: + return self.torque_from_lateral_accel_linear + + def lateral_accel_from_torque_linear(self, torque: float, torque_params: structs.CarParams.LateralTorqueTuning) -> float: + return torque * float(torque_params.latAccelFactor) + + def lateral_accel_from_torque(self) -> LateralAccelFromTorqueCallbackType: + return self.lateral_accel_from_torque_linear + + # returns a set of default params to avoid repetition in car specific params + @staticmethod + def get_std_params(candidate: str) -> structs.CarParams: + ret = structs.CarParams() + ret.carFingerprint = candidate + + # Car docs fields + ret.maxLateralAccel = get_torque_params()[candidate]['MAX_LAT_ACCEL_MEASURED'] + ret.autoResumeSng = True # describes whether car can resume from a stop automatically + + # standard ALC params + ret.tireStiffnessFactor = 1.0 + ret.steerControlType = structs.CarParams.SteerControlType.torque + ret.minSteerSpeed = 0. + ret.wheelSpeedFactor = 1.0 + + ret.pcmCruise = True # openpilot's state is tied to the PCM's cruise state on most cars + ret.minEnableSpeed = -1. # enable is done by stock ACC, so ignore this + ret.steerRatioRear = 0. # no rear steering, at least on the listed cars aboveA + ret.openpilotLongitudinalControl = False + ret.stopAccel = -2.0 + ret.longitudinalTuning.kpBP = [0.] + ret.longitudinalTuning.kpV = [0.] + ret.longitudinalTuning.kiBP = [0.] + ret.longitudinalTuning.kiV = [0.] + # TODO estimate car specific lag, use .15s for now + ret.longitudinalActuatorDelay = 0.15 + ret.steerLimitTimer = 1.0 + return ret + + @staticmethod + def configure_torque_tune(candidate: str, tune: structs.CarParams.LateralTuning, steering_angle_deadzone_deg: float = 0.0): + params = get_torque_params()[candidate] + + tune.init('torque') + tune.torque.friction = params['FRICTION'] + tune.torque.latAccelFactor = params['LAT_ACCEL_FACTOR'] + tune.torque.latAccelOffset = 0.0 + tune.torque.steeringAngleDeadzoneDeg = steering_angle_deadzone_deg + + def update(self, can_packets: list[tuple[int, list[CanData]]]) -> tuple[structs.CarState, structs.IQCarState]: + # parse can + for cp in self.can_parsers.values(): + if cp is not None: + cp.update(can_packets) + + # get CarState + ret, ret_iq = self.CS.update(self.can_parsers) + + ret.canValid = all(cp.can_valid for cp in self.can_parsers.values()) + ret.canTimeout = any(cp.bus_timeout for cp in self.can_parsers.values()) + + if ret.vEgoCluster == 0.0 and not self.v_ego_cluster_seen: + ret.vEgoCluster = ret.vEgo + else: + self.v_ego_cluster_seen = True + + # Many cars apply hysteresis to the ego dash speed + ret.vEgoCluster = apply_hysteresis(ret.vEgoCluster, self.CS.out.vEgoCluster, self.CS.cluster_speed_hyst_gap) + if abs(ret.vEgo) < self.CS.cluster_min_speed: + ret.vEgoCluster = 0.0 + + if ret.cruiseState.speedCluster == 0: + ret.cruiseState.speedCluster = ret.cruiseState.speed + + ret.buttonEnable = self.CS.update_button_enable(ret.buttonEvents) + + # save for next iteration + self.CS.out = ret + self.CS.out_iq = ret_iq + + return ret, ret_iq + + +class CarStateBase(ABC): + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + self.car_fingerprint = CP.carFingerprint + self.out = structs.CarState() + self.out_iq = structs.IQCarState() + + self.cruise_buttons = 0 + self.left_blinker_cnt = 0 + self.right_blinker_cnt = 0 + self.steering_pressed_cnt = 0 + self.left_blinker_prev = False + self.right_blinker_prev = False + self.low_speed_alert = False + self.cluster_speed_hyst_gap = 0.0 + self.cluster_min_speed = 0.0 # min speed before dropping to 0 + self.secoc_key: bytes = b"00" * 16 + + Q = [[0.0, 0.0], [0.0, 100.0]] + R = 0.3 + A = [[1.0, DT_CTRL], [0.0, 1.0]] + C = [[1.0, 0.0]] + x0=[[0.0], [0.0]] + K = get_kalman_gain(DT_CTRL, np.array(A), np.array(C), np.array(Q), R) + self.v_ego_kf = KF1D(x0=x0, A=A, C=C[0], K=K) + self.v_ego_clu_kf = KF1D(x0=x0, A=A, C=C[0], K=K) + + self.softHoldActive = 0 + self.is_metric = True + self.lkas_enabled = False + self.modelV2 = None + + @abstractmethod + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + pass + + def parse_wheel_speeds(self, cs, fl, fr, rl, rr, unit=CV.KPH_TO_MS): + cs.vEgoRaw = sum((fl, fr, rl, rr)) / 4 * unit * self.CP.wheelSpeedFactor + cs.vEgo, cs.aEgo = self.update_speed_kf(cs.vEgoRaw) + + def update_speed_kf(self, v_ego_raw): + if abs(v_ego_raw - self.v_ego_kf.x[0][0]) > 2.0: # Prevent large accelerations when car starts at non zero speed + self.v_ego_kf.set_x([[v_ego_raw], [0.0]]) + + v_ego_x = self.v_ego_kf.update(v_ego_raw) + return float(v_ego_x[0]), float(v_ego_x[1]) + + def update_clu_speed_kf(self, v_ego_raw): + if abs(v_ego_raw - self.v_ego_clu_kf.x[0][0]) > 2.0: + self.v_ego_clu_kf.set_x([[v_ego_raw], [0.0]]) + + v_ego_x = self.v_ego_clu_kf.update(v_ego_raw) + return float(v_ego_x[0]), float(v_ego_x[1]) + + def get_wheel_speeds(self, fl, fr, rl, rr, unit=CV.KPH_TO_MS): + factor = unit * self.CP.wheelSpeedFactor + wheel_speeds = structs.CarState.WheelSpeeds() + wheel_speeds.fl = fl * factor + wheel_speeds.fr = fr * factor + wheel_speeds.rl = rl * factor + wheel_speeds.rr = rr * factor + return wheel_speeds + + def update_blinker_from_lamp(self, blinker_time: int, left_blinker_lamp: bool, right_blinker_lamp: bool): + """Update blinkers from lights. Enable output when light was seen within the last `blinker_time` + iterations""" + # TODO: Handle case when switching direction. Now both blinkers can be on at the same time + self.left_blinker_cnt = blinker_time if left_blinker_lamp else max(self.left_blinker_cnt - 1, 0) + self.right_blinker_cnt = blinker_time if right_blinker_lamp else max(self.right_blinker_cnt - 1, 0) + return self.left_blinker_cnt > 0, self.right_blinker_cnt > 0 + + def update_steering_pressed(self, steering_pressed, steering_pressed_min_count): + """Applies filtering on steering pressed for noisy driver torque signals.""" + self.steering_pressed_cnt += 1 if steering_pressed else -1 + self.steering_pressed_cnt = int(np.clip(self.steering_pressed_cnt, 0, steering_pressed_min_count * 2 + 1)) + return self.steering_pressed_cnt > steering_pressed_min_count + + def update_blinker_from_stalk(self, blinker_time: int, left_blinker_stalk: bool, right_blinker_stalk: bool): + """Update blinkers from stalk position. When stalk is seen the blinker will be on for at least blinker_time, + or until the stalk is turned off, whichever is longer. If the opposite stalk direction is seen the blinker + is forced to the other side. On a rising edge of the stalk the timeout is reset.""" + + if left_blinker_stalk: + self.right_blinker_cnt = 0 + if not self.left_blinker_prev: + self.left_blinker_cnt = blinker_time + + if right_blinker_stalk: + self.left_blinker_cnt = 0 + if not self.right_blinker_prev: + self.right_blinker_cnt = blinker_time + + self.left_blinker_cnt = max(self.left_blinker_cnt - 1, 0) + self.right_blinker_cnt = max(self.right_blinker_cnt - 1, 0) + + self.left_blinker_prev = left_blinker_stalk + self.right_blinker_prev = right_blinker_stalk + + return bool(left_blinker_stalk or self.left_blinker_cnt > 0), bool(right_blinker_stalk or self.right_blinker_cnt > 0) + + def update_button_enable(self, buttonEvents: list[structs.CarState.ButtonEvent]): + if not self.CP.pcmCruise: + for b in buttonEvents: + # Enable OP long on falling edge of enable buttons + if b.type in (ButtonType.accelCruise, ButtonType.decelCruise) and not b.pressed: + return True + return False + + @staticmethod + def parse_gear_shifter(gear: str | None) -> structs.CarState.GearShifter: + if gear is None: + return GearShifter.unknown + return GEAR_SHIFTER_MAP.get(gear.upper(), GearShifter.unknown) + + @staticmethod + def get_can_parsers(CP, CP_IQ) -> dict[StrEnum, CANParser]: + return {} + + +class CarControllerBase(ABC): + def __init__(self, dbc_names: dict[StrEnum, str], CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + self.frame = 0 + self.secoc_key: bytes = b"00" * 16 + self.model = None + + @abstractmethod + def update(self, CC: structs.CarControl, CC_IQ: structs.IQCarControl, CS: CarStateBase, now_nanos: int) -> tuple[structs.CarControl.Actuators, list[CanData]]: + pass + + +INTERFACE_ATTR_FILE = { + "FINGERPRINTS": "fingerprints", + "FW_VERSIONS": "fingerprints", +} + +# interface-specific helpers + + +def get_interface_attr(attr: str, combine_brands: bool = False, ignore_none: bool = False) -> dict[str | StrEnum, Any]: + # read all the folders in iqdbc/car and return a dict where: + # - keys are all the car models or brand names + # - values are attr values from all car folders + result = {} + for car_folder in sorted([x[0] for x in os.walk(BASEDIR)]): + try: + brand_name = car_folder.split('/')[-1] + brand_values = __import__(f'iqdbc.car.{brand_name}.{INTERFACE_ATTR_FILE.get(attr, "values")}', fromlist=[attr]) + if hasattr(brand_values, attr) or not ignore_none: + attr_data = getattr(brand_values, attr, None) + else: + continue + + if combine_brands: + if isinstance(attr_data, dict): + for f, v in attr_data.items(): + result[f] = v + else: + result[brand_name] = attr_data + except (ImportError, OSError): + pass + + return result diff --git a/artifacts/package_runtime/iqdbc/car/isotp.py b/artifacts/package_runtime/iqdbc/car/isotp.py new file mode 100644 index 000000000..8ead67e6f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/isotp.py @@ -0,0 +1,147 @@ +import binascii +import time + +DEBUG = False + + +def msg(x): + if DEBUG: + print("S:", binascii.hexlify(x)) + assert len(x) <= 7 + ret = bytes([len(x)]) + x + return ret.ljust(8, b"\x00") + + +kmsgs = [] + + +def recv(panda, cnt, addr, nbus): + global kmsgs + ret = [] + + while len(ret) < cnt: + kmsgs += panda.can_recv() + nmsgs = [] + for ids, dat, bus in kmsgs: + if ids == addr and bus == nbus and len(ret) < cnt: + ret.append(dat) + else: + # leave around + nmsgs.append((ids, dat, bus)) + kmsgs = nmsgs[-256:] + return ret + + +def isotp_recv_subaddr(panda, addr, bus, sendaddr, subaddr): + msg = recv(panda, 1, addr, bus)[0] + + # TODO: handle other subaddr also communicating + assert msg[0] == subaddr + + if msg[1] & 0xf0 == 0x10: + # first + tlen = ((msg[1] & 0xf) << 8) | msg[2] + dat = msg[3:] + + # 0 block size? + CONTINUE = bytes([subaddr]) + b"\x30" + b"\x00" * 6 + panda.can_send(sendaddr, CONTINUE, bus) + + idx = 1 + for mm in recv(panda, (tlen - len(dat) + 5) // 6, addr, bus): + assert mm[0] == subaddr + assert mm[1] == (0x20 | (idx & 0xF)) + dat += mm[2:] + idx += 1 + elif msg[1] & 0xf0 == 0x00: + # single + tlen = msg[1] & 0xf + dat = msg[2:] + else: + print(binascii.hexlify(msg)) + raise AssertionError + + return dat[0:tlen] + +# **** import below this line **** + + +def isotp_send(panda, x, addr, bus=0, recvaddr=None, subaddr=None, rate=None): + if recvaddr is None: + recvaddr = addr + 8 + + if len(x) <= 7 and subaddr is None: + panda.can_send(addr, msg(x), bus) + elif len(x) <= 6 and subaddr is not None: + panda.can_send(addr, bytes([subaddr]) + msg(x)[0:7], bus) + else: + if subaddr: + ss = bytes([subaddr, 0x10 + (len(x) >> 8), len(x) & 0xFF]) + x[0:5] + x = x[5:] + else: + ss = bytes([0x10 + (len(x) >> 8), len(x) & 0xFF]) + x[0:6] + x = x[6:] + idx = 1 + sends = [] + while len(x) > 0: + if subaddr: + sends.append((bytes([subaddr, 0x20 + (idx & 0xF)]) + x[0:6]).ljust(8, b"\x00")) + x = x[6:] + else: + sends.append((bytes([0x20 + (idx & 0xF)]) + x[0:7]).ljust(8, b"\x00")) + x = x[7:] + idx += 1 + + # actually send + panda.can_send(addr, ss, bus) + rr = recv(panda, 1, recvaddr, bus)[0] + if rr.find(b"\x30\x01") != -1: + for s in sends[:-1]: + panda.can_send(addr, s, 0) + rr = recv(panda, 1, recvaddr, bus)[0] + panda.can_send(addr, sends[-1], 0) + else: + if rate is None: + panda.can_send_many([(addr, s, bus) for s in sends]) + else: + for dat in sends: + panda.can_send(addr, dat, bus) + time.sleep(rate) + + +def isotp_recv(panda, addr, bus=0, sendaddr=None, subaddr=None): + if sendaddr is None: + sendaddr = addr - 8 + + if subaddr is not None: + dat = isotp_recv_subaddr(panda, addr, bus, sendaddr, subaddr) + else: + msg = recv(panda, 1, addr, bus)[0] + + if msg[0] & 0xf0 == 0x10: + # first + tlen = ((msg[0] & 0xf) << 8) | msg[1] + dat = msg[2:] + + # 0 block size? + CONTINUE = b"\x30" + b"\x00" * 7 + + panda.can_send(sendaddr, CONTINUE, bus) + + idx = 1 + for mm in recv(panda, (tlen - len(dat) + 6) // 7, addr, bus): + assert mm[0] == (0x20 | (idx & 0xF)) + dat += mm[1:] + idx += 1 + elif msg[0] & 0xf0 == 0x00: + # single + tlen = msg[0] & 0xf + dat = msg[1:] + else: + raise AssertionError + dat = dat[0:tlen] + + if DEBUG: + print("R:", binascii.hexlify(dat)) + + return dat diff --git a/artifacts/package_runtime/iqdbc/car/isotp_parallel_query.py b/artifacts/package_runtime/iqdbc/car/isotp_parallel_query.py new file mode 100644 index 000000000..0519a2489 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/isotp_parallel_query.py @@ -0,0 +1,170 @@ +import time +from collections import defaultdict +from functools import partial + +from iqdbc.car import uds +from iqdbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable +from iqdbc.car.carlog import carlog +from iqdbc.car.fw_query_definitions import AddrType + + +class IsoTpParallelQuery: + def __init__(self, can_send: CanSendCallable, can_recv: CanRecvCallable, bus: int, addrs: list[int] | list[AddrType], + request: list[bytes], response: list[bytes], response_offset: int = 0x8, + functional_addrs: list[int] | None = None, response_pending_timeout: float = 10) -> None: + self.can_send = can_send + self.can_recv = can_recv + self.bus = bus + self.request = request + self.response = response + self.functional_addrs = functional_addrs or [] + self.response_pending_timeout = response_pending_timeout + + real_addrs = [a if isinstance(a, tuple) else (a, None) for a in addrs] + for tx_addr, _ in real_addrs: + assert tx_addr not in uds.FUNCTIONAL_ADDRS, f"Functional address should be defined in functional_addrs: {hex(tx_addr)}" + + self.msg_addrs = {tx_addr: uds.get_rx_addr_for_tx_addr(tx_addr[0], rx_offset=response_offset) for tx_addr in real_addrs} + self.msg_buffer: dict[int, list[CanData]] = defaultdict(list) + + def rx(self) -> None: + """Drain can socket and sort messages into buffers based on address""" + can_packets = self.can_recv(wait_for_one=True) + + for packet in can_packets: + for msg in packet: + if msg.src == self.bus and msg.address in self.msg_addrs.values(): + self.msg_buffer[msg.address].append(CanData(msg.address, msg.dat, msg.src)) + + def _can_tx(self, tx_addr: int, dat: bytes, bus: int): + """Helper function to send single message""" + msg = CanData(tx_addr, dat, bus) + self.can_send([msg]) + + def _can_rx(self, addr, sub_addr=None): + """Helper function to retrieve message with specified address and subaddress from buffer""" + keep_msgs = [] + + if sub_addr is None: + msgs = self.msg_buffer[addr] + else: + # Filter based on subaddress + msgs = [] + for m in self.msg_buffer[addr]: + first_byte = m[1][0] + if first_byte == sub_addr: + msgs.append(m) + else: + keep_msgs.append(m) + + self.msg_buffer[addr] = keep_msgs + return msgs + + def _drain_rx(self) -> None: + self.can_recv() + self.msg_buffer = defaultdict(list) + + def _create_isotp_msg(self, tx_addr: int, sub_addr: int | None, rx_addr: int): + can_client = uds.CanClient(self._can_tx, partial(self._can_rx, rx_addr, sub_addr=sub_addr), tx_addr, rx_addr, + self.bus, sub_addr=sub_addr) + + # uses iso-tp frame separation time of 10 ms + # TODO: use single_frame_mode so ECUs can send as fast as they want, + # as well as reduces chances we process messages from previous queries + return uds.IsoTpMessage(can_client, timeout=0, separation_time=0.01) + + def get_data(self, timeout: float, total_timeout: float = 60.) -> dict[AddrType, bytes]: + self._drain_rx() + + # Create message objects + msgs = {} + request_counter = {} + request_done = {} + for tx_addr, rx_addr in self.msg_addrs.items(): + msgs[tx_addr] = self._create_isotp_msg(*tx_addr, rx_addr) + request_counter[tx_addr] = 0 + request_done[tx_addr] = False + + # Send first request to functional addrs, subsequent responses are handled on physical addrs + if len(self.functional_addrs): + for addr in self.functional_addrs: + self._create_isotp_msg(addr, None, -1).send(self.request[0]) + + # Send first frame (single or first) to all addresses and receive asynchronously in the loop below. + # If querying functional addrs, only set up physical IsoTpMessages to send consecutive frames + for msg in msgs.values(): + msg.send(self.request[0], setup_only=len(self.functional_addrs) > 0) + + results = {} + start_time = time.monotonic() + addrs_responded = set() # track addresses that have ever sent a valid iso-tp frame for timeout logging + response_timeouts = {tx_addr: start_time + timeout for tx_addr in self.msg_addrs} + while True: + self.rx() + + for tx_addr, msg in msgs.items(): + try: + dat, rx_in_progress = msg.recv() + except Exception: + carlog.exception(f"Error processing UDS response: {tx_addr}") + request_done[tx_addr] = True + continue + + # Extend timeout for each consecutive ISO-TP frame to avoid timing out on long responses + if rx_in_progress: + addrs_responded.add(tx_addr) + response_timeouts[tx_addr] = time.monotonic() + timeout + + if dat is None: + continue + + # Log unexpected empty responses + if len(dat) == 0: + carlog.error(f"iso-tp query empty response: {tx_addr}") + request_done[tx_addr] = True + continue + + counter = request_counter[tx_addr] + expected_response = self.response[counter] + response_valid = dat.startswith(expected_response) + + if response_valid: + if counter + 1 < len(self.request): + response_timeouts[tx_addr] = time.monotonic() + timeout + msg.send(self.request[counter + 1]) + request_counter[tx_addr] += 1 + else: + results[tx_addr] = dat[len(expected_response):] + request_done[tx_addr] = True + else: + error_code = dat[2] if len(dat) > 2 else -1 + if error_code == 0x78: + response_timeouts[tx_addr] = time.monotonic() + self.response_pending_timeout + carlog.error(f"iso-tp query response pending: {tx_addr}") + else: + request_done[tx_addr] = True + carlog.error(f"iso-tp query bad response: {tx_addr} - 0x{dat.hex()}") + + # Mark request done if address timed out + cur_time = time.monotonic() + for tx_addr in response_timeouts: + if cur_time - response_timeouts[tx_addr] > 0: + if not request_done[tx_addr]: + if request_counter[tx_addr] > 0: + carlog.error(f"iso-tp query timeout after receiving partial response: {tx_addr}") + elif tx_addr in addrs_responded: + carlog.error(f"iso-tp query timeout while receiving response: {tx_addr}") + # TODO: handle functional addresses + # else: + # carlog.error(f"iso-tp query timeout with no response: {tx_addr}") + request_done[tx_addr] = True + + # Break if all requests are done (finished or timed out) + if all(request_done.values()): + break + + if cur_time - start_time > total_timeout: + carlog.error("iso-tp query timeout while receiving data") + break + + return results diff --git a/artifacts/package_runtime/iqdbc/car/lateral.py b/artifacts/package_runtime/iqdbc/car/lateral.py new file mode 100644 index 000000000..d757adb58 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/lateral.py @@ -0,0 +1,221 @@ +import math +import numpy as np +from dataclasses import dataclass +from iqdbc.car import structs, rate_limit, DT_CTRL, ACCELERATION_DUE_TO_GRAVITY +from iqdbc.car.vehicle_model import VehicleModel + +FRICTION_THRESHOLD = 0.2 + +ISO_LATERAL_ACCEL = 5.0 # m/s^2 +ISO_LATERAL_JERK = 5.0 # m/s^3 +AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees +MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL) # ~3.6 m/s^2 + +@dataclass +class AngleSteeringLimits: + # v1 limits (using apply_std_steer_angle_limits) + STEER_ANGLE_MAX: float + ANGLE_RATE_LIMIT_UP: tuple[list[float], list[float]] + ANGLE_RATE_LIMIT_DOWN: tuple[list[float], list[float]] + + # v2 vehicle model limits (using apply_steer_angle_limits_vm) + MAX_LATERAL_ACCEL: float = 0 + MAX_LATERAL_JERK: float = 0 + MAX_ANGLE_RATE: float = math.inf + + +@dataclass +class CurvatureSteeringLimits: + CURVATURE_MAX: float + + +def apply_driver_steer_torque_limits(apply_torque: int, apply_torque_last: int, driver_torque: float, LIMITS, steer_max: int | None = None): + # some safety modes utilize a dynamic max steer + if steer_max is None: + steer_max = LIMITS.STEER_MAX + + # limits due to driver torque + driver_max_torque = steer_max + (LIMITS.STEER_DRIVER_ALLOWANCE + driver_torque * LIMITS.STEER_DRIVER_FACTOR) * LIMITS.STEER_DRIVER_MULTIPLIER + driver_min_torque = -steer_max + (-LIMITS.STEER_DRIVER_ALLOWANCE + driver_torque * LIMITS.STEER_DRIVER_FACTOR) * LIMITS.STEER_DRIVER_MULTIPLIER + max_steer_allowed = max(min(steer_max, driver_max_torque), 0) + min_steer_allowed = min(max(-steer_max, driver_min_torque), 0) + apply_torque = np.clip(apply_torque, min_steer_allowed, max_steer_allowed) + + # slow rate if steer torque increases in magnitude + if apply_torque_last > 0: + apply_torque = np.clip(apply_torque, max(apply_torque_last - LIMITS.STEER_DELTA_DOWN, -LIMITS.STEER_DELTA_UP), + apply_torque_last + LIMITS.STEER_DELTA_UP) + else: + apply_torque = np.clip(apply_torque, apply_torque_last - LIMITS.STEER_DELTA_UP, + min(apply_torque_last + LIMITS.STEER_DELTA_DOWN, LIMITS.STEER_DELTA_UP)) + + return int(round(float(apply_torque))) + + +def apply_dist_to_meas_limits(val, val_last, val_meas, + STEER_DELTA_UP, STEER_DELTA_DOWN, + STEER_ERROR_MAX, STEER_MAX): + # limits due to comparison of commanded val VS measured val (torque/angle/curvature) + max_lim = min(max(val_meas + STEER_ERROR_MAX, STEER_ERROR_MAX), STEER_MAX) + min_lim = max(min(val_meas - STEER_ERROR_MAX, -STEER_ERROR_MAX), -STEER_MAX) + + val = np.clip(val, min_lim, max_lim) + + # slow rate if val increases in magnitude + if val_last > 0: + val = np.clip(val, + max(val_last - STEER_DELTA_DOWN, -STEER_DELTA_UP), + val_last + STEER_DELTA_UP) + else: + val = np.clip(val, + val_last - STEER_DELTA_UP, + min(val_last + STEER_DELTA_DOWN, STEER_DELTA_UP)) + + return float(val) + + +def apply_meas_steer_torque_limits(apply_torque, apply_torque_last, motor_torque, LIMITS): + return int(round(apply_dist_to_meas_limits(apply_torque, apply_torque_last, motor_torque, + LIMITS.STEER_DELTA_UP, LIMITS.STEER_DELTA_DOWN, + LIMITS.STEER_ERROR_MAX, LIMITS.STEER_MAX))) + + +def apply_std_steer_angle_limits(apply_angle: float, apply_angle_last: float, v_ego: float, steering_angle: float, + lat_active: bool, limits: AngleSteeringLimits) -> float: + # pick angle rate limits based on wind up/down + steer_up = apply_angle_last * apply_angle >= 0. and abs(apply_angle) > abs(apply_angle_last) + rate_limits = limits.ANGLE_RATE_LIMIT_UP if steer_up else limits.ANGLE_RATE_LIMIT_DOWN + + angle_rate_lim = np.interp(v_ego, rate_limits[0], rate_limits[1]) + new_apply_angle = np.clip(apply_angle, apply_angle_last - angle_rate_lim, apply_angle_last + angle_rate_lim) + + # angle is current steering wheel angle when inactive on all angle cars + if not lat_active: + new_apply_angle = steering_angle + + return float(np.clip(new_apply_angle, -limits.STEER_ANGLE_MAX, limits.STEER_ANGLE_MAX)) + + +def _get_max_curvature_jerk(v_ego: float, steer_step: int) -> float: + ts_elapsed = steer_step * DT_CTRL + curvature_rate_limit = ISO_LATERAL_JERK / (max(v_ego, 1.0) ** 2) + return curvature_rate_limit * ts_elapsed + + +def _get_max_curvature(v_ego: float) -> tuple[float, float]: + max_curvature = MAX_LATERAL_ACCEL / (max(v_ego, 1.0) ** 2) + return -max_curvature, max_curvature + + +def apply_std_curvature_limits(apply_curvature: float, apply_curvature_last: float, v_ego: float, curvature: float, override: bool, + steer_step: int, lat_active: bool, limits: CurvatureSteeringLimits) -> float: + max_jerk = _get_max_curvature_jerk(v_ego, steer_step) + new_apply_curvature = float(np.clip(apply_curvature, apply_curvature_last - max_jerk, apply_curvature_last + max_jerk)) + + min_curvature, max_curvature = _get_max_curvature(v_ego) + new_apply_curvature = float(np.clip(new_apply_curvature, min_curvature, max_curvature)) + + if not lat_active: + new_apply_curvature = curvature + + return float(np.clip(new_apply_curvature, -limits.CURVATURE_MAX, limits.CURVATURE_MAX)) + + +def get_max_angle_delta_vm(v_ego_raw: float, VM: VehicleModel, limits): + """Calculate the maximum steering angle rate based on lateral jerk limits.""" + max_curvature_rate_sec = limits.ANGLE_LIMITS.MAX_LATERAL_JERK / (v_ego_raw ** 2) # (1/m)/s + max_angle_rate_sec = math.degrees(VM.get_steer_from_curvature(max_curvature_rate_sec, v_ego_raw, 0)) # deg/s + return max_angle_rate_sec * (DT_CTRL * limits.STEER_STEP) + + +def get_max_angle_vm(v_ego_raw: float, VM: VehicleModel, limits): + """Calculate the maximum steering angle based on lateral acceleration limits.""" + max_curvature = limits.ANGLE_LIMITS.MAX_LATERAL_ACCEL / (v_ego_raw ** 2) # 1/m + return math.degrees(VM.get_steer_from_curvature(max_curvature, v_ego_raw, 0)) # deg + + +def apply_steer_angle_limits_vm(apply_angle: float, apply_angle_last: float, v_ego_raw: float, steering_angle: float, + lat_active: bool, limits, VM: VehicleModel) -> float: + """Apply jerk, accel, and safety limit constraints to steering angle.""" + v_ego_raw = max(v_ego_raw, 1) + + # *** max lateral jerk limit *** + max_angle_delta = get_max_angle_delta_vm(v_ego_raw, VM, limits) + + # prevent fault/low speed comfort + max_angle_delta = min(max_angle_delta, limits.ANGLE_LIMITS.MAX_ANGLE_RATE) + new_apply_angle = rate_limit(apply_angle, apply_angle_last, -max_angle_delta, max_angle_delta) + + # *** max lateral accel limit *** + max_angle = get_max_angle_vm(v_ego_raw, VM, limits) + new_apply_angle = np.clip(new_apply_angle, -max_angle, max_angle) + + # angle is current angle when inactive + if not lat_active: + new_apply_angle = steering_angle + + # prevent fault + return float(np.clip(new_apply_angle, -limits.ANGLE_LIMITS.STEER_ANGLE_MAX, limits.ANGLE_LIMITS.STEER_ANGLE_MAX)) + + +def apply_steer_angle_limits_simple(apply_angle: float, apply_angle_last: float, v_ego_raw: float, steering_angle: float, + lat_active: bool, limits, VM: VehicleModel, prog_map_x: list[float], prog_map_y: list[float]) -> float: + if not lat_active: + return steering_angle + + v_ego_raw = max(v_ego_raw, 1) + + apply_angle = np.clip(apply_angle, -limits.ANGLE_LIMITS.STEER_ANGLE_MAX, limits.ANGLE_LIMITS.STEER_ANGLE_MAX) + new_angle_abs = np.interp(abs(apply_angle), prog_map_x, prog_map_y) + corrected_angle = -new_angle_abs if apply_angle < 0 else new_angle_abs + + desired_curvature = VM.calc_curvature(math.radians(corrected_angle), v_ego_raw, 0) + desired_lat_accel = abs(desired_curvature * v_ego_raw ** 2) + + if desired_lat_accel > limits.ANGLE_LIMITS.MAX_LATERAL_ACCEL: + scale_factor = limits.ANGLE_LIMITS.MAX_LATERAL_ACCEL / desired_lat_accel + corrected_angle *= scale_factor + + final_angle = np.clip(corrected_angle, -limits.ANGLE_LIMITS.STEER_ANGLE_MAX, limits.ANGLE_LIMITS.STEER_ANGLE_MAX) + + return float(final_angle) + +def common_fault_avoidance(fault_condition: bool, request: bool, above_limit_frames: int, + max_above_limit_frames: int, max_mismatching_frames: int = 1): + """ + Several cars have the ability to work around their EPS limits by cutting the + request bit of their LKAS message after a certain number of frames above the limit. + """ + + # Count up to max_above_limit_frames, at which point we need to cut the request for above_limit_frames to avoid a fault + if request and fault_condition: + above_limit_frames += 1 + else: + above_limit_frames = 0 + + # Once we cut the request bit, count additionally to max_mismatching_frames before setting the request bit high again. + # Some brands do not respect our workaround without multiple messages on the bus, for example + if above_limit_frames > max_above_limit_frames: + request = False + + if above_limit_frames >= max_above_limit_frames + max_mismatching_frames: + above_limit_frames = 0 + + return above_limit_frames, request + + +def apply_center_deadzone(error, deadzone): + if (error > - deadzone) and (error < deadzone): + error = 0. + return error + + +def get_friction(lateral_accel_error: float, lateral_accel_deadzone: float, friction_threshold: float, + torque_params: structs.CarParams.LateralTorqueTuning) -> float: + # TODO torque params' friction should be in lataxel space, not torque space + friction_interp = np.interp( + apply_center_deadzone(lateral_accel_error, lateral_accel_deadzone), + [-friction_threshold, friction_threshold], + [-torque_params.friction * torque_params.latAccelFactor, torque_params.friction * torque_params.latAccelFactor] + ) + return float(friction_interp) diff --git a/artifacts/package_runtime/iqdbc/car/logreader.py b/artifacts/package_runtime/iqdbc/car/logreader.py new file mode 100644 index 000000000..92a5f6e33 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/logreader.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +import os +import capnp +import urllib.parse +import warnings +from urllib.request import urlopen, Request +import zstandard as zstd + +from iqdbc.car.common.basedir import BASEDIR + +capnp_log = capnp.load(os.path.join(BASEDIR, "rlog.capnp")) + + +def decompress_stream(data: bytes): + dctx = zstd.ZstdDecompressor() + decompressed_data = b"" + + with dctx.stream_reader(data) as reader: + decompressed_data = reader.read() + + return decompressed_data + + +class LogReader: + def __init__(self, fn, only_union_types=False, sort_by_time=False): + self._only_union_types = only_union_types + _, ext = os.path.splitext(urllib.parse.urlparse(fn).path) + + if fn.startswith("http"): + with urlopen(Request(fn, headers={"User-Agent": "iqdbc"})) as f: + dat = f.read() + else: + with open(fn, "rb") as f: + dat = f.read() + + if ext == ".zst" or dat.startswith(b'\x28\xB5\x2F\xFD'): + # https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#zstandard-frames + dat = decompress_stream(dat) + + ents = capnp_log.Event.read_multiple_bytes(dat) + + self._ents = [] + try: + for e in ents: + self._ents.append(e) + except capnp.KjException: + warnings.warn("Corrupted events detected", RuntimeWarning, stacklevel=1) + + if sort_by_time: + self._ents.sort(key=lambda x: x.logMonoTime) + + def __iter__(self): + for ent in self._ents: + if self._only_union_types: + try: + ent.which() + yield ent + except capnp.lib.capnp.KjException: + pass + else: + yield ent + + def filter(self, msg_type: str): + return (getattr(m, m.which()) for m in filter(lambda m: m.which() == msg_type, self)) + + def first(self, msg_type: str): + return next(self.filter(msg_type), None) diff --git a/artifacts/package_runtime/iqdbc/car/mazda/__init__.py b/artifacts/package_runtime/iqdbc/car/mazda/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/mazda/carcontroller.py b/artifacts/package_runtime/iqdbc/car/mazda/carcontroller.py new file mode 100644 index 000000000..f0ad356f0 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mazda/carcontroller.py @@ -0,0 +1,66 @@ +from iqdbc.can import CANPacker +from iqdbc.car import Bus, structs +from iqdbc.car.lateral import apply_driver_steer_torque_limits +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.mazda import mazdacan +from iqdbc.car.mazda.values import CarControllerParams, Buttons + + +VisualAlert = structs.CarControl.HUDControl.VisualAlert + + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ): + CarControllerBase.__init__(self, dbc_names, CP, CP_IQ) + self.apply_torque_last = 0 + self.packer = CANPacker(dbc_names[Bus.pt]) + self.brake_counter = 0 + + def update(self, CC, CC_IQ, CS, now_nanos): + can_sends = [] + + apply_torque = 0 + + if CC.latActive: + # calculate steer and also set limits due to driver torque + new_torque = int(round(CC.actuators.torque * CarControllerParams.STEER_MAX)) + apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, + CS.out.steeringTorque, CarControllerParams) + + if CC.cruiseControl.cancel: + # If brake is pressed, let us wait >70ms before trying to disable crz to avoid + # a race condition with the stock system, where the second cancel from openpilot + # will disable the crz 'main on'. crz ctrl msg runs at 50hz. 70ms allows us to + # read 3 messages and most likely sync state before we attempt cancel. + self.brake_counter = self.brake_counter + 1 + if self.frame % 10 == 0 and not (CS.out.brakePressed and self.brake_counter < 7): + # Cancel Stock ACC if it's enabled while OP is disengaged + # Send at a rate of 10hz until we sync with stock ACC state + can_sends.append(mazdacan.create_button_cmd(self.packer, self.CP, CS.crz_btns_counter, Buttons.CANCEL)) + else: + self.brake_counter = 0 + if CC.cruiseControl.resume and self.frame % 5 == 0: + # Mazda Stop and Go requires a RES button (or gas) press if the car stops more than 3 seconds + # Send Resume button when planner wants car to move + can_sends.append(mazdacan.create_button_cmd(self.packer, self.CP, CS.crz_btns_counter, Buttons.RESUME)) + + self.apply_torque_last = apply_torque + + # send HUD alerts + if self.frame % 50 == 0: + ldw = CC.hudControl.visualAlert == VisualAlert.ldw + steer_required = CC.hudControl.visualAlert == VisualAlert.steerRequired + # TODO: find a way to silence audible warnings so we can add more hud alerts + steer_required = steer_required and CS.lkas_allowed_speed + can_sends.append(mazdacan.create_alert_command(self.packer, CS.cam_laneinfo, ldw, steer_required)) + + # send steering command + can_sends.append(mazdacan.create_steering_control(self.packer, self.CP, + self.frame, apply_torque, CS.cam_lkas)) + + new_actuators = CC.actuators.as_builder() + new_actuators.torque = apply_torque / CarControllerParams.STEER_MAX + new_actuators.torqueOutputCan = apply_torque + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/mazda/carstate.py b/artifacts/package_runtime/iqdbc/car/mazda/carstate.py new file mode 100644 index 000000000..e29bc5986 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mazda/carstate.py @@ -0,0 +1,136 @@ +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, create_button_events, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.mazda.values import DBC, LKAS_LIMITS + +ButtonType = structs.CarState.ButtonEvent.Type + + +class CarState(CarStateBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + self.shifter_values = can_define.dv["GEAR"]["GEAR"] + + self.crz_btns_counter = 0 + self.acc_active_last = False + self.lkas_allowed_speed = False + + self.distance_button = 0 + self.accel_button = 0 + self.decel_button = 0 + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + + ret = structs.CarState() + ret_iq = structs.IQCarState() + + self.parse_wheel_speeds(ret, + cp.vl["WHEEL_SPEEDS"]["FL"], + cp.vl["WHEEL_SPEEDS"]["FR"], + cp.vl["WHEEL_SPEEDS"]["RL"], + cp.vl["WHEEL_SPEEDS"]["RR"], + ) + + # Match panda speed reading + speed_kph = cp.vl["ENGINE_DATA"]["SPEED"] + ret.standstill = speed_kph <= .1 + + can_gear = int(cp.vl["GEAR"]["GEAR"]) + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None)) + + ret.genericToggle = bool(cp.vl["BLINK_INFO"]["HIGH_BEAMS"]) + ret.leftBlindspot = cp.vl["BSM"]["LEFT_BS_STATUS"] != 0 + ret.rightBlindspot = cp.vl["BSM"]["RIGHT_BS_STATUS"] != 0 + ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(40, cp.vl["BLINK_INFO"]["LEFT_BLINK"] == 1, + cp.vl["BLINK_INFO"]["RIGHT_BLINK"] == 1) + + ret.steeringAngleDeg = cp.vl["STEER"]["STEER_ANGLE"] + ret.steeringTorque = cp.vl["STEER_TORQUE"]["STEER_TORQUE_SENSOR"] + ret.steeringPressed = abs(ret.steeringTorque) > LKAS_LIMITS.STEER_THRESHOLD + + ret.steeringTorqueEps = cp.vl["STEER_TORQUE"]["STEER_TORQUE_MOTOR"] + ret.steeringRateDeg = cp.vl["STEER_RATE"]["STEER_ANGLE_RATE"] + + # TODO: this should be from 0 - 1. + ret.brakePressed = cp.vl["PEDALS"]["BRAKE_ON"] == 1 + ret.brake = cp.vl["BRAKE"]["BRAKE_PRESSURE"] + + ret.seatbeltUnlatched = cp.vl["SEATBELT"]["DRIVER_SEATBELT"] == 0 + ret.doorOpen = any([cp.vl["DOORS"]["FL"], cp.vl["DOORS"]["FR"], + cp.vl["DOORS"]["BL"], cp.vl["DOORS"]["BR"]]) + + # TODO: this should be from 0 - 1. + ret.gasPressed = cp.vl["ENGINE_DATA"]["PEDAL_GAS"] > 0 + + # Either due to low speed or hands off + lkas_blocked = cp.vl["STEER_RATE"]["LKAS_BLOCK"] == 1 + + if self.CP.minSteerSpeed > 0: + # LKAS is enabled at 52kph going up and disabled at 45kph going down + # wait for LKAS_BLOCK signal to clear when going up since it lags behind the speed sometimes + if speed_kph > LKAS_LIMITS.ENABLE_SPEED and not lkas_blocked: + self.lkas_allowed_speed = True + elif speed_kph < LKAS_LIMITS.DISABLE_SPEED: + self.lkas_allowed_speed = False + else: + self.lkas_allowed_speed = True + + # TODO: the signal used for available seems to be the adaptive cruise signal, instead of the main on + # it should be used for carState.cruiseState.nonAdaptive instead + ret.cruiseState.available = cp.vl["CRZ_CTRL"]["CRZ_AVAILABLE"] == 1 + ret.cruiseState.enabled = cp.vl["CRZ_CTRL"]["CRZ_ACTIVE"] == 1 + ret.cruiseState.standstill = cp.vl["PEDALS"]["STANDSTILL"] == 1 + ret.cruiseState.speed = cp.vl["CRZ_EVENTS"]["CRZ_SPEED"] * CV.KPH_TO_MS + + # stock lkas should be on + # TODO: is this needed? + ret.invalidLkasSetting = cp_cam.vl["CAM_LANEINFO"]["LANE_LINES"] == 0 + + if ret.cruiseState.enabled: + if not self.lkas_allowed_speed and self.acc_active_last: + self.low_speed_alert = True + else: + self.low_speed_alert = False + ret.lowSpeedAlert = self.low_speed_alert + + # Check if LKAS is disabled due to lack of driver torque when all other states indicate + # it should be enabled (steer lockout). Don't warn until we actually get lkas active + # and lose it again, i.e, after initial lkas activation + ret.steerFaultTemporary = self.lkas_allowed_speed and lkas_blocked + + self.acc_active_last = ret.cruiseState.enabled + + self.crz_btns_counter = cp.vl["CRZ_BTNS"]["CTR"] + + # camera signals + self.cam_lkas = cp_cam.vl["CAM_LKAS"] + self.cam_laneinfo = cp_cam.vl["CAM_LANEINFO"] + ret.steerFaultPermanent = cp_cam.vl["CAM_LKAS"]["ERR_BIT_1"] == 1 + + # cruise control button events: distance, inc, and dec + prev_distance_button = self.distance_button + prev_accel_button = self.accel_button + prev_decel_button = self.decel_button + self.distance_button = cp.vl["CRZ_BTNS"]["DISTANCE_LESS"] + self.accel_button = cp.vl["CRZ_BTNS"]["RES"] + self.decel_button = cp.vl["CRZ_BTNS"]["SET_M"] + + ret.buttonEvents = [ + *create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}), + *create_button_events(self.accel_button, prev_accel_button, {1: ButtonType.accelCruise}), + *create_button_events(self.decel_button, prev_decel_button, {1: ButtonType.decelCruise}), + ] + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2), + } diff --git a/artifacts/package_runtime/iqdbc/car/mazda/fingerprints.py b/artifacts/package_runtime/iqdbc/car/mazda/fingerprints.py new file mode 100644 index 000000000..5ec935299 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mazda/fingerprints.py @@ -0,0 +1,283 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.mazda.values import CAR + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.MAZDA_CX5_2022: { + (Ecu.eps, 0x730, None): [ + b'KBST-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KSD5-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'PEW5-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PGK4-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PW67-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PW67-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PW8F-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PW8G-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2C-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2D-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2D-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2G-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2H-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2H-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX85-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXFG-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXFG-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXGC-188K2-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PY40-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'SH54-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'K131-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'KBSV-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KGWD-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KSD5-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'GSH7-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-U\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.transmission, 0x7e1, None): [ + b'PG69-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PG69-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PW66-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PW66-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXDL-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXFG-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXFG-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXGG-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYA4-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB2-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB2-21PS1-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYJ3-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYJ3-21PS1-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'SH51-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.MAZDA_CX5: { + (Ecu.eps, 0x730, None): [ + b'K319-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KCB8-3210X-B-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KJ01-3210X-G-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KJ01-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KJ01-3210X-M-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'PA53-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PAR4-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2E-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2F-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2G-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2H-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2H-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2H-188K2-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2K-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX38-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX42-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX68-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYFA-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYFC-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYFD-188K2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYNF-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'SHKT-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'K123-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'K123-437K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KBJ5-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KL2K-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KN0W-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'B61L-67XK2-R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-N\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.transmission, 0x7e1, None): [ + b'PA66-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PA66-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX39-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX39-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX68-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB1-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB1-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB1-21PS1-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB2-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB2-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB2-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB2-21PS1-G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYB2-21PS1-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYNC-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'SH9T-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.MAZDA_CX9: { + (Ecu.eps, 0x730, None): [ + b'K070-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KJ01-3210X-G-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KJ01-3210X-L-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'PX23-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX24-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM4-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXN8-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXN8-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD7-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD8-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYFM-188K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYFM-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'K123-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'TK80-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'TK80-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'TA0B-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'TK79-437K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'TK79-437K2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'TM53-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'TN40-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'B61L-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-K\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'TK80-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.transmission, 0x7e1, None): [ + b'PXM4-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM7-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD5-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD5-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD6-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYD6-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYFM-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYFM-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.MAZDA_3: { + (Ecu.eps, 0x730, None): [ + b'BHN1-3210X-J-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K070-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'KR11-3210X-K-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'P5JD-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PY2P-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYJW-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYKC-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYKE-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'B63C-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GHP9-67Y10---41\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'B45A-437AS-0-08\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'B61L-67XK2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.transmission, 0x7e1, None): [ + b'P52G-21PS1-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PY2S-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYKA-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYKE-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYKE-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.MAZDA_6: { + (Ecu.eps, 0x730, None): [ + b'GBEF-3210X-B-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GBEF-3210X-C-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GFBC-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'PA34-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX4F-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYH7-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYH7-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'K131-67XK2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'GBVH-437K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GBVH-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GDDM-437K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'B61L-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'B61L-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.transmission, 0x7e1, None): [ + b'PA28-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYH3-21PS1-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PYH7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, + CAR.MAZDA_CX9_2021: { + (Ecu.eps, 0x730, None): [ + b'TC3M-3210X-A-00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'PXGW-188K2-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXGW-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM4-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM4-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM6-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM7-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x764, None): [ + b'K131-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'K131-67XK2-F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x760, None): [ + b'TA0B-437K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x706, None): [ + b'GSH7-67XK2-M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-N\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-U\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.transmission, 0x7e1, None): [ + b'PXM4-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM6-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM7-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM7-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/mazda/interface.py b/artifacts/package_runtime/iqdbc/car/mazda/interface.py new file mode 100644 index 000000000..d833c3f4b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mazda/interface.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +from iqdbc.car import get_safety_config, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.mazda.carcontroller import CarController +from iqdbc.car.mazda.carstate import CarState +from iqdbc.car.mazda.values import CAR, LKAS_LIMITS + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "mazda" + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.mazda)] + ret.radarUnavailable = True + + ret.dashcamOnly = candidate not in (CAR.MAZDA_CX5_2022, CAR.MAZDA_CX9_2021) + + ret.steerActuatorDelay = 0.1 + ret.steerLimitTimer = 0.8 + + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + if candidate not in (CAR.MAZDA_CX5_2022,): + ret.minSteerSpeed = LKAS_LIMITS.DISABLE_SPEED * CV.KPH_TO_MS + + ret.centerToFront = ret.wheelbase * 0.41 + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/mazda/mazdacan.py b/artifacts/package_runtime/iqdbc/car/mazda/mazdacan.py new file mode 100644 index 000000000..78e2c6e38 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mazda/mazdacan.py @@ -0,0 +1,130 @@ +from iqdbc.car.mazda.values import Buttons, MazdaFlags + + +def create_steering_control(packer, CP, frame, apply_torque, lkas): + + tmp = apply_torque + 2048 + + lo = tmp & 0xFF + hi = tmp >> 8 + + # copy values from camera + b1 = int(lkas["BIT_1"]) + er1 = int(lkas["ERR_BIT_1"]) + lnv = 0 + ldw = 0 + er2 = int(lkas["ERR_BIT_2"]) + + # Some older models do have these, newer models don't. + # Either way, they all work just fine if set to zero. + steering_angle = 0 + b2 = 0 + + tmp = steering_angle + 2048 + ahi = tmp >> 10 + amd = (tmp & 0x3FF) >> 2 + amd = (amd >> 4) | ((amd & 0xF) << 4) + alo = (tmp & 0x3) << 2 + + ctr = frame % 16 + # bytes: [ 1 ] [ 2 ] [ 3 ] [ 4 ] + csum = 249 - ctr - hi - lo - (lnv << 3) - er1 - (ldw << 7) - (er2 << 4) - (b1 << 5) + + # bytes [ 5 ] [ 6 ] [ 7 ] + csum = csum - ahi - amd - alo - b2 + + if ahi == 1: + csum = csum + 15 + + if csum < 0: + if csum < -256: + csum = csum + 512 + else: + csum = csum + 256 + + csum = csum % 256 + + values = {} + if CP.flags & MazdaFlags.GEN1: + values = { + "LKAS_REQUEST": apply_torque, + "CTR": ctr, + "ERR_BIT_1": er1, + "LINE_NOT_VISIBLE": lnv, + "LDW": ldw, + "BIT_1": b1, + "ERR_BIT_2": er2, + "STEERING_ANGLE": steering_angle, + "ANGLE_ENABLED": b2, + "CHKSUM": csum + } + + return packer.make_can_msg("CAM_LKAS", 0, values) + + +def create_alert_command(packer, cam_msg: dict, ldw: bool, steer_required: bool): + values = {s: cam_msg[s] for s in [ + "LINE_VISIBLE", + "LINE_NOT_VISIBLE", + "LANE_LINES", + "BIT1", + "BIT2", + "BIT3", + "NO_ERR_BIT", + "S1", + "S1_HBEAM", + ]} + values.update({ + # TODO: what's the difference between all these? do we need to send all? + "HANDS_WARN_3_BITS": 0b111 if steer_required else 0, + "HANDS_ON_STEER_WARN": steer_required, + "HANDS_ON_STEER_WARN_2": steer_required, + + # TODO: right lane works, left doesn't + # TODO: need to do something about L/R + "LDW_WARN_LL": 0, + "LDW_WARN_RL": 0, + }) + return packer.make_can_msg("CAM_LANEINFO", 0, values) + + +def create_button_cmd(packer, CP, counter, button): + + can = int(button == Buttons.CANCEL) + res = int(button == Buttons.RESUME) + inc = int(button == Buttons.SET_PLUS) + dec = int(button == Buttons.SET_MINUS) + + if CP.flags & MazdaFlags.GEN1: + values = { + "CAN_OFF": can, + "CAN_OFF_INV": (can + 1) % 2, + + "SET_P": inc, + "SET_P_INV": (inc + 1) % 2, + + "RES": res, + "RES_INV": (res + 1) % 2, + + "SET_M": dec, + "SET_M_INV": (dec + 1) % 2, + + "DISTANCE_LESS": 0, + "DISTANCE_LESS_INV": 1, + + "DISTANCE_MORE": 0, + "DISTANCE_MORE_INV": 1, + + "MODE_X": 0, + "MODE_X_INV": 1, + + "MODE_Y": 0, + "MODE_Y_INV": 1, + + "BIT1": 1, + "BIT2": 1, + "BIT3": 1, + "CTR": (counter + 1) % 16, + } + + return packer.make_can_msg("CRZ_BTNS", 0, values) diff --git a/artifacts/package_runtime/iqdbc/car/mazda/values.py b/artifacts/package_runtime/iqdbc/car/mazda/values.py new file mode 100644 index 000000000..edbe67948 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mazda/values.py @@ -0,0 +1,103 @@ +from dataclasses import dataclass, field +from enum import IntFlag + +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarHarness, CarDocs, CarParts +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries + +Ecu = CarParams.Ecu + + +# Steer torque limits + +class CarControllerParams: + STEER_MAX = 800 # theoretical max_steer 2047 + STEER_DELTA_UP = 10 # torque increase per refresh + STEER_DELTA_DOWN = 25 # torque decrease per refresh + STEER_DRIVER_ALLOWANCE = 15 # allowed driver torque before start limiting + STEER_DRIVER_MULTIPLIER = 1 # weight driver torque + STEER_DRIVER_FACTOR = 1 # from dbc + STEER_STEP = 1 # 100 Hz + + def __init__(self, CP): + pass + + +@dataclass +class MazdaCarDocs(CarDocs): + package: str = "All" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda])) + + +@dataclass(frozen=True, kw_only=True) +class MazdaCarSpecs(CarSpecs): + tireStiffnessFactor: float = 0.7 # not optimized yet + + +class MazdaFlags(IntFlag): + # Static flags + # Gen 1 hardware: same CAN messages and same camera + GEN1 = 1 + + +@dataclass +class MazdaPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'mazda_2017'}) + flags: int = MazdaFlags.GEN1 + + +class CAR(Platforms): + MAZDA_CX5 = MazdaPlatformConfig( + [MazdaCarDocs("Mazda CX-5 2017-21")], + MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) + ) + MAZDA_CX9 = MazdaPlatformConfig( + [MazdaCarDocs("Mazda CX-9 2016-20")], + MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) + ) + MAZDA_3 = MazdaPlatformConfig( + [MazdaCarDocs("Mazda 3 2017-18")], + MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) + ) + MAZDA_6 = MazdaPlatformConfig( + [MazdaCarDocs("Mazda 6 2017-20")], + MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) + ) + MAZDA_CX9_2021 = MazdaPlatformConfig( + [MazdaCarDocs("Mazda CX-9 2021-23", video="https://youtu.be/dA3duO4a0O4")], + MAZDA_CX9.specs + ) + MAZDA_CX5_2022 = MazdaPlatformConfig( + [MazdaCarDocs("Mazda CX-5 2022-25")], + MAZDA_CX5.specs, + ) + + +class LKAS_LIMITS: + STEER_THRESHOLD = 15 + DISABLE_SPEED = 45 # kph + ENABLE_SPEED = 52 # kph + + +class Buttons: + NONE = 0 + SET_PLUS = 1 + SET_MINUS = 2 + RESUME = 3 + CANCEL = 4 + + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + # TODO: check data to ensure ABS does not skip ISO-TP frames on bus 0 + Request( + [StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], + [StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + bus=0, + ), + ], +) + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/mock/__init__.py b/artifacts/package_runtime/iqdbc/car/mock/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/mock/carcontroller.py b/artifacts/package_runtime/iqdbc/car/mock/carcontroller.py new file mode 100644 index 000000000..68407b2fa --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mock/carcontroller.py @@ -0,0 +1,6 @@ +from iqdbc.car.interfaces import CarControllerBase + + +class CarController(CarControllerBase): + def update(self, CC, CC_IQ, CS, now_nanos): + return CC.actuators.as_builder(), [] diff --git a/artifacts/package_runtime/iqdbc/car/mock/carstate.py b/artifacts/package_runtime/iqdbc/car/mock/carstate.py new file mode 100644 index 000000000..9a8a6f441 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mock/carstate.py @@ -0,0 +1,7 @@ +from iqdbc.car import structs +from iqdbc.car.interfaces import CarStateBase + + +class CarState(CarStateBase): + def update(self, *_) -> tuple[structs.CarState, structs.IQCarState]: + return structs.CarState(), structs.IQCarState() diff --git a/artifacts/package_runtime/iqdbc/car/mock/interface.py b/artifacts/package_runtime/iqdbc/car/mock/interface.py new file mode 100644 index 000000000..981323a69 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mock/interface.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +from iqdbc.car import structs +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.mock.carcontroller import CarController +from iqdbc.car.mock.carstate import CarState + + +# mocked car interface for dashcam mode +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "mock" + ret.mass = 1700. + ret.wheelbase = 2.70 + ret.centerToFront = ret.wheelbase * 0.5 + ret.steerRatio = 13. + ret.dashcamOnly = True + return ret diff --git a/artifacts/package_runtime/iqdbc/car/mock/values.py b/artifacts/package_runtime/iqdbc/car/mock/values.py new file mode 100644 index 000000000..473c9d03b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/mock/values.py @@ -0,0 +1,9 @@ +from iqdbc.car import CarSpecs, PlatformConfig, Platforms + + +class CAR(Platforms): + MOCK = PlatformConfig( + [], + CarSpecs(mass=1700, wheelbase=2.7, steerRatio=13), + {} + ) diff --git a/artifacts/package_runtime/iqdbc/car/nissan/__init__.py b/artifacts/package_runtime/iqdbc/car/nissan/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/nissan/carcontroller.py b/artifacts/package_runtime/iqdbc/car/nissan/carcontroller.py new file mode 100644 index 000000000..804e1c3da --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/nissan/carcontroller.py @@ -0,0 +1,76 @@ +from iqdbc.can import CANPacker +from iqdbc.car import Bus, structs +from iqdbc.car.lateral import apply_std_steer_angle_limits +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.nissan import nissancan +from iqdbc.car.nissan.values import CAR, CarControllerParams + +VisualAlert = structs.CarControl.HUDControl.VisualAlert + + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ): + super().__init__(dbc_names, CP, CP_IQ) + self.car_fingerprint = CP.carFingerprint + + self.apply_angle_last = 0 + + self.packer = CANPacker(dbc_names[Bus.pt]) + + def update(self, CC, CC_IQ, CS, now_nanos): + actuators = CC.actuators + hud_control = CC.hudControl + pcm_cancel_cmd = CC.cruiseControl.cancel + + can_sends = [] + + ### STEER ### + steer_hud_alert = 1 if hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw) else 0 + + # windup slower + self.apply_angle_last = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw, + CS.out.steeringAngleDeg, CC.latActive, CarControllerParams.ANGLE_LIMITS) + + lkas_max_torque = 0 + if CC.latActive: + # Max torque from driver before EPS will give up and not apply torque + if not bool(CS.out.steeringPressed): + lkas_max_torque = CarControllerParams.LKAS_MAX_TORQUE + else: + # Scale max torque based on how much torque the driver is applying to the wheel + lkas_max_torque = max( + # Scale max torque down to half LKAX_MAX_TORQUE as a minimum + CarControllerParams.LKAS_MAX_TORQUE * 0.5, + # Start scaling torque at STEER_THRESHOLD + CarControllerParams.LKAS_MAX_TORQUE - 0.6 * max(0, abs(CS.out.steeringTorque) - CarControllerParams.STEER_THRESHOLD) + ) + + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA) and pcm_cancel_cmd: + can_sends.append(nissancan.create_acc_cancel_cmd(self.packer, self.car_fingerprint, CS.cruise_throttle_msg)) + + # TODO: Find better way to cancel! + # For some reason spamming the cancel button is unreliable on the Leaf + # We now cancel by making propilot think the seatbelt is unlatched, + # this generates a beep and a warning message every time you disengage + if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC) and self.frame % 2 == 0: + can_sends.append(nissancan.create_cancel_msg(self.packer, CS.cancel_msg, pcm_cancel_cmd)) + + can_sends.append(nissancan.create_steering_control( + self.packer, self.apply_angle_last, self.frame, CC.latActive, lkas_max_torque)) + + # Below are the HUD messages. We copy the stock message and modify + if self.CP.carFingerprint != CAR.NISSAN_ALTIMA: + if self.frame % 2 == 0: + can_sends.append(nissancan.create_lkas_hud_msg(self.packer, CS.lkas_hud_msg, CC_IQ.aol.enabled, hud_control.leftLaneVisible, + hud_control.rightLaneVisible, hud_control.leftLaneDepart, hud_control.rightLaneDepart)) + + if self.frame % 50 == 0: + can_sends.append(nissancan.create_lkas_hud_info_msg( + self.packer, CS.lkas_hud_info_msg, steer_hud_alert + )) + + new_actuators = actuators.as_builder() + new_actuators.steeringAngleDeg = self.apply_angle_last + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/nissan/carstate.py b/artifacts/package_runtime/iqdbc/car/nissan/carstate.py new file mode 100644 index 000000000..d5394b8d7 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/nissan/carstate.py @@ -0,0 +1,148 @@ +import copy +from collections import deque +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, create_button_events, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.nissan.values import CAR, DBC, CarControllerParams + +from iqdbc.lvbs.car.nissan.iq_carstate import IQCarState + +ButtonType = structs.CarState.ButtonEvent.Type + +TORQUE_SAMPLES = 12 + + +class CarState(CarStateBase, IQCarState): + def __init__(self, CP, CP_IQ): + CarStateBase.__init__(self, CP, CP_IQ) + IQCarState.__init__(self, CP, CP_IQ) + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + + self.lkas_hud_msg = {} + self.lkas_hud_info_msg = {} + + self.steeringTorqueSamples = deque(TORQUE_SAMPLES*[0], TORQUE_SAMPLES) + self.shifter_values = can_define.dv["GEARBOX"]["GEAR_SHIFTER"] + + self.distance_button = 0 + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + cp_adas = can_parsers[Bus.adas] + + ret = structs.CarState() + ret_iq = structs.IQCarState() + + prev_distance_button = self.distance_button + self.distance_button = cp.vl["CRUISE_THROTTLE"]["FOLLOW_DISTANCE_BUTTON"] + + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA): + ret.gasPressed = bool(cp.vl["GAS_PEDAL"]["GAS_PEDAL"] > 3) + elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): + ret.gasPressed = bool(cp.vl["CRUISE_THROTTLE"]["GAS_PEDAL"] > 3) + + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA): + ret.brakePressed = bool(cp.vl["DOORS_LIGHTS"]["USER_BRAKE_PRESSED"]) + elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): + ret.brakePressed = bool(cp.vl["CRUISE_THROTTLE"]["USER_BRAKE_PRESSED"]) + + fl = cp.vl["WHEEL_SPEEDS_FRONT"]["WHEEL_SPEED_FL"] * CV.KPH_TO_MS + fr = cp.vl["WHEEL_SPEEDS_FRONT"]["WHEEL_SPEED_FR"] * CV.KPH_TO_MS + rl = cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RL"] * CV.KPH_TO_MS + rr = cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RR"] * CV.KPH_TO_MS + # safety uses the rear wheel speeds for the speed measurement and angle limiting + ret.vEgoRaw = (rl + rr) / 2.0 + + v_ego_raw_full = (fl + fr + rl + rr) / 4.0 + ret.vEgo, ret.aEgo = self.update_speed_kf(v_ego_raw_full) + ret.standstill = cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RL"] == 0.0 and cp.vl["WHEEL_SPEEDS_REAR"]["WHEEL_SPEED_RR"] == 0.0 + + if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: + ret.cruiseState.enabled = bool(cp.vl["CRUISE_STATE"]["CRUISE_ENABLED"]) + else: + ret.cruiseState.enabled = bool(cp_adas.vl["CRUISE_STATE"]["CRUISE_ENABLED"]) + + if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL): + ret.seatbeltUnlatched = cp.vl["HUD"]["SEATBELT_DRIVER_LATCHED"] == 0 + ret.cruiseState.available = bool(cp_cam.vl["PRO_PILOT"]["CRUISE_ON"]) + elif self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): + if self.CP.carFingerprint == CAR.NISSAN_LEAF: + ret.seatbeltUnlatched = cp.vl["SEATBELT"]["SEATBELT_DRIVER_LATCHED"] == 0 + elif self.CP.carFingerprint == CAR.NISSAN_LEAF_IC: + ret.seatbeltUnlatched = cp.vl["CANCEL_MSG"]["CANCEL_SEATBELT"] == 1 + ret.cruiseState.available = bool(cp.vl["CRUISE_THROTTLE"]["CRUISE_AVAILABLE"]) + elif self.CP.carFingerprint == CAR.NISSAN_ALTIMA: + ret.seatbeltUnlatched = cp.vl["HUD"]["SEATBELT_DRIVER_LATCHED"] == 0 + ret.cruiseState.available = bool(cp_adas.vl["PRO_PILOT"]["CRUISE_ON"]) + + if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: + speed = cp.vl["PROPILOT_HUD"]["SET_SPEED"] + else: + speed = cp_adas.vl["PROPILOT_HUD"]["SET_SPEED"] + + if speed != 255: + if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): + conversion = CV.MPH_TO_MS if cp.vl["HUD_SETTINGS"]["SPEED_MPH"] else CV.KPH_TO_MS + else: + conversion = CV.MPH_TO_MS if cp.vl["HUD"]["SPEED_MPH"] else CV.KPH_TO_MS + ret.cruiseState.speed = speed * conversion + ret.cruiseState.speedCluster = (speed - 1) * conversion # Speed on HUD is always 1 lower than actually sent on can bus + + if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: + ret.steeringTorque = cp_cam.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"] + else: + ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"] + + self.steeringTorqueSamples.append(ret.steeringTorque) + # Filtering driver torque to prevent steeringPressed false positives + ret.steeringPressed = bool(abs(sum(self.steeringTorqueSamples) / TORQUE_SAMPLES) > CarControllerParams.STEER_THRESHOLD) + + ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + + ret.leftBlinker = bool(cp.vl["LIGHTS"]["LEFT_BLINKER"]) + ret.rightBlinker = bool(cp.vl["LIGHTS"]["RIGHT_BLINKER"]) + + ret.doorOpen = any([cp.vl["DOORS_LIGHTS"]["DOOR_OPEN_RR"], + cp.vl["DOORS_LIGHTS"]["DOOR_OPEN_RL"], + cp.vl["DOORS_LIGHTS"]["DOOR_OPEN_FR"], + cp.vl["DOORS_LIGHTS"]["DOOR_OPEN_FL"]]) + + ret.espDisabled = bool(cp.vl["ESP"]["ESP_DISABLED"]) + + can_gear = int(cp.vl["GEARBOX"]["GEAR_SHIFTER"]) + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None)) + + # stock lkas should be off + # TODO: is this needed? + if self.CP.carFingerprint == CAR.NISSAN_ALTIMA: + ret.invalidLkasSetting = bool(cp.vl["LKAS_SETTINGS"]["LKAS_ENABLED"]) + else: + ret.invalidLkasSetting = bool(cp_adas.vl["LKAS_SETTINGS"]["LKAS_ENABLED"]) + + self.cruise_throttle_msg = copy.copy(cp.vl["CRUISE_THROTTLE"]) + + if self.CP.carFingerprint in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): + self.cancel_msg = copy.copy(cp.vl["CANCEL_MSG"]) + + if self.CP.carFingerprint != CAR.NISSAN_ALTIMA: + self.lkas_hud_msg = copy.copy(cp_adas.vl["PROPILOT_HUD"]) + self.lkas_hud_info_msg = copy.copy(cp_adas.vl["PROPILOT_HUD_INFO_MSG"]) + + IQCarState.update(self, ret, ret_iq, can_parsers) + + ret.buttonEvents = [ + *create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}), + *self.button_events, + ] + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 1 if CP.carFingerprint == CAR.NISSAN_ALTIMA else 0), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0 if CP.carFingerprint == CAR.NISSAN_ALTIMA else 1), + Bus.adas: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2), + } diff --git a/artifacts/package_runtime/iqdbc/car/nissan/fingerprints.py b/artifacts/package_runtime/iqdbc/car/nissan/fingerprints.py new file mode 100644 index 000000000..3c639b37d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/nissan/fingerprints.py @@ -0,0 +1,108 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.nissan.values import CAR + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.NISSAN_ALTIMA: { + (Ecu.fwdCamera, 0x707, None): [ + b'284N86CA1D', + ], + (Ecu.eps, 0x742, None): [ + b'6CA2B\xa9A\x02\x02G8A89P90D6A\x00\x00\x01\x80', + b'6CA2C\xa9A\x02\x02G8A89P90D6A\x00\x00\x01\x80', + ], + (Ecu.engine, 0x7e0, None): [ + b'237106GU3B', + b'237109HE2B', + ], + (Ecu.gateway, 0x18dad0f1, None): [ + b'284U29HE0A', + b'284U29HF0A', + ], + }, + CAR.NISSAN_LEAF: { + (Ecu.abs, 0x740, None): [ + b'476605SA1C', + b'476605SA7D', + b'476605SC2D', + b'476606WK7B', + b'476606WK9B', + ], + (Ecu.eps, 0x742, None): [ + b'5SA2A\x99A\x05\x02N123F\x15b\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SA2A\xb7A\x05\x02N123F\x15\xa2\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SN2A\xb7A\x05\x02N123F\x15\xa2\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SN2A\xb7A\x05\x02N126F\x15\xb2\x00\x00\x00\x00\x00\x00\x00\x80', + ], + (Ecu.fwdCamera, 0x707, None): [ + b'5SA0ADB\x04\x18\x00\x00\x00\x00\x00_*6\x04\x94a\x00\x00\x00\x80', + b'5SA2ADB\x04\x18\x00\x00\x00\x00\x00_*6\x04\x94a\x00\x00\x00\x80', + b'6WK2ADB\x04\x18\x00\x00\x00\x00\x00R;1\x18\x99\x10\x00\x00\x00\x80', + b'6WK2BDB\x04\x18\x00\x00\x00\x00\x00R;1\x18\x99\x10\x00\x00\x00\x80', + b'6WK2CDB\x04\x18\x00\x00\x00\x00\x00R=1\x18\x99\x10\x00\x00\x00\x80', + ], + (Ecu.gateway, 0x18dad0f1, None): [ + b'284U25SA3C', + b'284U25SP0C', + b'284U25SP1C', + b'284U26WK0A', + b'284U26WK0C', + ], + }, + CAR.NISSAN_LEAF_IC: { + (Ecu.fwdCamera, 0x707, None): [ + b'5SH1BDB\x04\x18\x00\x00\x00\x00\x00_-?\x04\x91\xf2\x00\x00\x00\x80', + b'5SH3BDB\x04\x18\x00\x00\x00\x00\x00_-?\x04\x91\xf2\x00\x00\x00\x80', + b'5SH4BDB\x04\x18\x00\x00\x00\x00\x00_-?\x04\x91\xf2\x00\x00\x00\x80', + b'5SK0ADB\x04\x18\x00\x00\x00\x00\x00_(5\x07\x9aQ\x00\x00\x00\x80', + ], + (Ecu.abs, 0x740, None): [ + b'476605SD2D', + b'476605SD2E', + b'476605SH1D', + b'476605SH7D', + b'476605SH7E', + b'476605SK2A', + ], + (Ecu.eps, 0x742, None): [ + b'5SH2A\x99A\x05\x02N123F\x15\x81\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SH2A\xb7A\x05\x02N123F\x15\xa3\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SH2C\xb7A\x05\x02N123F\x15\xa3\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SH3A\x99A\x05\x02N123F\x15\x81\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SH3C\xb7A\x05\x02N123F\x15\xa3\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SK3A\x99A\x05\x02N123F\x15u\x00\x00\x00\x00\x00\x00\x00\x80', + ], + (Ecu.gateway, 0x18dad0f1, None): [ + b'284U25SF0C', + b'284U25SH3A', + b'284U25SH3B', + b'284U25SK2D', + b'284U25SR0B', + b'284U25SR0C', + ], + }, + CAR.NISSAN_XTRAIL: { + (Ecu.fwdCamera, 0x707, None): [ + b'284N86FR2A', + ], + (Ecu.abs, 0x740, None): [ + b'6FU0AD\x11\x02\x00\x02e\x95e\x80iQ#\x01\x00\x00\x00\x00\x00\x80', + b'6FU1BD\x11\x02\x00\x02e\x95e\x80iX#\x01\x00\x00\x00\x00\x00\x80', + ], + (Ecu.eps, 0x742, None): [ + b'6FP2A\x99A\x05\x02N123F\x18\x02\x00\x00\x00\x00\x00\x00\x00\x80', + ], + (Ecu.combinationMeter, 0x743, None): [ + b'6FR2A\x18B\x05\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80', + ], + (Ecu.engine, 0x7e0, None): [ + b'6FR9A\xa0A\x06\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80', + b'6FU9B\xa0A\x06\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80', + ], + (Ecu.gateway, 0x18dad0f1, None): [ + b'284U26FR0E', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/nissan/interface.py b/artifacts/package_runtime/iqdbc/car/nissan/interface.py new file mode 100644 index 000000000..a7b680a02 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/nissan/interface.py @@ -0,0 +1,40 @@ +from iqdbc.car import get_safety_config, structs +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.nissan.carcontroller import CarController +from iqdbc.car.nissan.carstate import CarState +from iqdbc.car.nissan.values import CAR, NissanSafetyFlags +from iqdbc.lvbs.car.nissan.values import NissanSafetyFlagsIQ + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + + DRIVABLE_GEARS = (structs.CarState.GearShifter.brake,) + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "nissan" + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.nissan)] + ret.autoResumeSng = False + ret.steerAtStandstill = True + + ret.steerLimitTimer = 1.0 + + ret.steerActuatorDelay = 0.1 + + ret.steerControlType = structs.CarParams.SteerControlType.angle + ret.radarUnavailable = True + + if candidate == CAR.NISSAN_ALTIMA: + # Altima has EPS on C-CAN unlike the others that have it on V-CAN + ret.safetyConfigs[0].safetyParam |= NissanSafetyFlags.ALT_EPS_BUS.value + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + if candidate in (CAR.NISSAN_LEAF, CAR.NISSAN_LEAF_IC): + ret.iqSafetyFlags |= NissanSafetyFlagsIQ.LEAF + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/nissan/nissancan.py b/artifacts/package_runtime/iqdbc/car/nissan/nissancan.py new file mode 100644 index 000000000..e5e312eca --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/nissan/nissancan.py @@ -0,0 +1,154 @@ +import crcmod +from iqdbc.car.nissan.values import CAR + +# TODO: add this checksum to the CANPacker +nissan_checksum = crcmod.mkCrcFun(0x11d, initCrc=0x00, rev=False, xorOut=0xff) + + +def create_steering_control(packer, apply_torque, frame, steer_on, lkas_max_torque): + values = { + "COUNTER": frame % 0x10, + "DESIRED_ANGLE": apply_torque, + "SET_0x80_2": 0x80, + "SET_0x80": 0x80, + "MAX_TORQUE": lkas_max_torque if steer_on else 0, + "LKA_ACTIVE": steer_on, + } + + dat = packer.make_can_msg("LKAS", 0, values)[1] + + values["CHECKSUM"] = nissan_checksum(dat[:7]) + return packer.make_can_msg("LKAS", 0, values) + + +def create_acc_cancel_cmd(packer, car_fingerprint, cruise_throttle_msg): + values = {s: cruise_throttle_msg[s] for s in [ + "COUNTER", + "PROPILOT_BUTTON", + "CANCEL_BUTTON", + "GAS_PEDAL_INVERTED", + "SET_BUTTON", + "RES_BUTTON", + "FOLLOW_DISTANCE_BUTTON", + "NO_BUTTON_PRESSED", + "GAS_PEDAL", + "USER_BRAKE_PRESSED", + "NEW_SIGNAL_2", + "GAS_PRESSED_INVERTED", + "unsure1", + "unsure2", + "unsure3", + ]} + can_bus = 1 if car_fingerprint == CAR.NISSAN_ALTIMA else 2 + + values["CANCEL_BUTTON"] = 1 + values["NO_BUTTON_PRESSED"] = 0 + values["PROPILOT_BUTTON"] = 0 + values["SET_BUTTON"] = 0 + values["RES_BUTTON"] = 0 + values["FOLLOW_DISTANCE_BUTTON"] = 0 + + return packer.make_can_msg("CRUISE_THROTTLE", can_bus, values) + + +def create_cancel_msg(packer, cancel_msg, cruise_cancel): + values = {s: cancel_msg[s] for s in [ + "CANCEL_SEATBELT", + "NEW_SIGNAL_1", + "NEW_SIGNAL_2", + "NEW_SIGNAL_3", + ]} + + if cruise_cancel: + values["CANCEL_SEATBELT"] = 1 + + return packer.make_can_msg("CANCEL_MSG", 2, values) + + +def create_lkas_hud_msg(packer, lkas_hud_msg, enabled, left_line, right_line, left_lane_depart, right_lane_depart): + values = {s: lkas_hud_msg[s] for s in [ + "LARGE_WARNING_FLASHING", + "SIDE_RADAR_ERROR_FLASHING1", + "SIDE_RADAR_ERROR_FLASHING2", + "LEAD_CAR", + "LEAD_CAR_ERROR", + "FRONT_RADAR_ERROR", + "FRONT_RADAR_ERROR_FLASHING", + "SIDE_RADAR_ERROR_FLASHING3", + "LKAS_ERROR_FLASHING", + "SAFETY_SHIELD_ACTIVE", + "RIGHT_LANE_GREEN_FLASH", + "LEFT_LANE_GREEN_FLASH", + "FOLLOW_DISTANCE", + "AUDIBLE_TONE", + "SPEED_SET_ICON", + "SMALL_STEERING_WHEEL_ICON", + "unknown59", + "unknown55", + "unknown26", + "unknown28", + "unknown31", + "SET_SPEED", + "unknown43", + "unknown08", + "unknown05", + "unknown02", + ]} + + values["RIGHT_LANE_YELLOW_FLASH"] = 1 if right_lane_depart else 0 + values["LEFT_LANE_YELLOW_FLASH"] = 1 if left_lane_depart else 0 + + values["LARGE_STEERING_WHEEL_ICON"] = 2 if enabled else 0 + values["RIGHT_LANE_GREEN"] = 1 if right_line and enabled else 0 + values["LEFT_LANE_GREEN"] = 1 if left_line and enabled else 0 + + return packer.make_can_msg("PROPILOT_HUD", 0, values) + + +def create_lkas_hud_info_msg(packer, lkas_hud_info_msg, steer_hud_alert): + values = {s: lkas_hud_info_msg[s] for s in [ + "NA_HIGH_ACCEL_TEMP", + "SIDE_RADAR_NA_HIGH_CABIN_TEMP", + "SIDE_RADAR_MALFUNCTION", + "LKAS_MALFUNCTION", + "FRONT_RADAR_MALFUNCTION", + "SIDE_RADAR_NA_CLEAN_REAR_CAMERA", + "NA_POOR_ROAD_CONDITIONS", + "CURRENTLY_UNAVAILABLE", + "SAFETY_SHIELD_OFF", + "FRONT_COLLISION_NA_FRONT_RADAR_OBSTRUCTION", + "PEDAL_MISSAPPLICATION_SYSTEM_ACTIVATED", + "SIDE_IMPACT_NA_RADAR_OBSTRUCTION", + "WARNING_DO_NOT_ENTER", + "SIDE_IMPACT_SYSTEM_OFF", + "SIDE_IMPACT_MALFUNCTION", + "FRONT_COLLISION_MALFUNCTION", + "SIDE_RADAR_MALFUNCTION2", + "LKAS_MALFUNCTION2", + "FRONT_RADAR_MALFUNCTION2", + "PROPILOT_NA_MSGS", + "BOTTOM_MSG", + "HANDS_ON_WHEEL_WARNING", + "WARNING_STEP_ON_BRAKE_NOW", + "PROPILOT_NA_FRONT_CAMERA_OBSTRUCTED", + "PROPILOT_NA_HIGH_CABIN_TEMP", + "WARNING_PROPILOT_MALFUNCTION", + "ACC_UNAVAILABLE_HIGH_CABIN_TEMP", + "ACC_NA_FRONT_CAMERA_IMPARED", + "unknown07", + "unknown10", + "unknown15", + "unknown23", + "unknown19", + "unknown31", + "unknown32", + "unknown46", + "unknown61", + "unknown55", + "unknown50", + ]} + + if steer_hud_alert: + values["HANDS_ON_WHEEL_WARNING"] = 1 + + return packer.make_can_msg("PROPILOT_HUD_INFO_MSG", 0, values) diff --git a/artifacts/package_runtime/iqdbc/car/nissan/values.py b/artifacts/package_runtime/iqdbc/car/nissan/values.py new file mode 100644 index 000000000..aad48e25b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/nissan/values.py @@ -0,0 +1,125 @@ +from dataclasses import dataclass, field +from enum import Enum, IntFlag + +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds +from iqdbc.car.lateral import AngleSteeringLimits +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries + +Ecu = CarParams.Ecu + + +class CarControllerParams: + ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( + # When output steering Angle not within range -1311 and 1310, + # CANPacker packs wrong angle output to be decoded by panda + 600, # deg, reasonable limit + ([0., 5., 15.], [5., .8, .15]), + ([0., 5., 15.], [5., 3.5, 0.4]), + ) + + LKAS_MAX_TORQUE = 1 # A value of 1 is easy to overpower + STEER_THRESHOLD = 1.0 + + def __init__(self, CP): + pass + + +class NissanSafetyFlags(IntFlag): + ALT_EPS_BUS = 1 + + +class Footnote(Enum): + SETUP = CarFootnote( + "See more setup details for Nissan.", + Column.MAKE, setup_note=True) + + +@dataclass +class NissanCarDocs(CarDocs): + package: str = "ProPILOT Assist" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.nissan_a])) + footnotes: list[Enum] = field(default_factory=lambda: [Footnote.SETUP]) + + +@dataclass(frozen=True) +class NissanCarSpecs(CarSpecs): + centerToFrontRatio: float = 0.44 + steerRatio: float = 17. + + +@dataclass +class NissanPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'nissan_x_trail_2017_generated'}) + + +class CAR(Platforms): + NISSAN_XTRAIL = NissanPlatformConfig( + [NissanCarDocs("Nissan X-Trail 2017")], + NissanCarSpecs(mass=1610, wheelbase=2.705) + ) + NISSAN_LEAF = NissanPlatformConfig( + [NissanCarDocs("Nissan Leaf 2018-23", video="https://youtu.be/vaMbtAh_0cY")], + NissanCarSpecs(mass=1610, wheelbase=2.705), + {Bus.pt: 'nissan_leaf_2018_generated'}, + ) + # Leaf with ADAS ECU found behind instrument cluster instead of glovebox + # Currently the only known difference between them is the inverted seatbelt signal. + NISSAN_LEAF_IC = NISSAN_LEAF.override(car_docs=[]) + NISSAN_ROGUE = NissanPlatformConfig( + [NissanCarDocs("Nissan Rogue 2018-20")], + NissanCarSpecs(mass=1610, wheelbase=2.705) + ) + NISSAN_ALTIMA = NissanPlatformConfig( + [NissanCarDocs("Nissan Altima 2019-20, 2024", car_parts=CarParts.common([CarHarness.nissan_b]))], + NissanCarSpecs(mass=1492, wheelbase=2.824) + ) + + +DBC = CAR.create_dbc_map() + +# Default diagnostic session +NISSAN_DIAGNOSTIC_REQUEST_KWP = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, 0x81]) +NISSAN_DIAGNOSTIC_RESPONSE_KWP = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, 0x81]) + +# Manufacturer specific +NISSAN_DIAGNOSTIC_REQUEST_KWP_2 = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, 0xda]) +NISSAN_DIAGNOSTIC_RESPONSE_KWP_2 = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, 0xda]) + +NISSAN_VERSION_REQUEST_KWP = b'\x21\x83' +NISSAN_VERSION_RESPONSE_KWP = b'\x61\x83' + +NISSAN_RX_OFFSET = 0x20 + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[request for bus, logging in ((0, False), (1, True)) for request in [ + Request( + [NISSAN_DIAGNOSTIC_REQUEST_KWP, NISSAN_VERSION_REQUEST_KWP], + [NISSAN_DIAGNOSTIC_RESPONSE_KWP, NISSAN_VERSION_RESPONSE_KWP], + bus=bus, + logging=logging, + ), + Request( + [NISSAN_DIAGNOSTIC_REQUEST_KWP, NISSAN_VERSION_REQUEST_KWP], + [NISSAN_DIAGNOSTIC_RESPONSE_KWP, NISSAN_VERSION_RESPONSE_KWP], + rx_offset=NISSAN_RX_OFFSET, + bus=bus, + logging=logging, + ), + # Rogue's engine solely responds to this + Request( + [NISSAN_DIAGNOSTIC_REQUEST_KWP_2, NISSAN_VERSION_REQUEST_KWP], + [NISSAN_DIAGNOSTIC_RESPONSE_KWP_2, NISSAN_VERSION_RESPONSE_KWP], + bus=bus, + logging=logging, + ), + Request( + [StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], + [StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + rx_offset=NISSAN_RX_OFFSET, + bus=bus, + logging=logging, + ), + ]], +) diff --git a/artifacts/package_runtime/iqdbc/car/panda_runner.py b/artifacts/package_runtime/iqdbc/car/panda_runner.py new file mode 100644 index 000000000..83b75ae28 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/panda_runner.py @@ -0,0 +1,59 @@ +import time +from contextlib import AbstractContextManager + +from panda import Panda +from iqdbc.car.car_helpers import get_car +from iqdbc.car.can_definitions import CanData +from iqdbc.car.structs import CarParams, CarControl + + +class PandaRunner(AbstractContextManager): + def __enter__(self): + self.p = Panda() + self.p.reset() + + # setup + fingerprinting + self.p.set_safety_mode(CarParams.SafetyModel.elm327, 1) + self.CI = get_car(self._can_recv, self.p.can_send_many, self.p.set_obd, True, False) + assert self.CI.CP.carFingerprint.lower() != "mock", "Unable to identify car. Check connections and ensure car is supported." + + safety_model = self.CI.CP.safetyConfigs[0].safetyModel + self.p.set_safety_mode(CarParams.SafetyModel.elm327, 1) + self.CI.init(self.CI.CP, self._can_recv, self.p.can_send_many) + self.p.set_safety_mode(safety_model, self.CI.CP.safetyConfigs[0].safetyParam) + + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.p.set_safety_mode(CarParams.SafetyModel.noOutput) + self.p.reset() # avoid siren + return super().__exit__(exc_type, exc_value, traceback) + + @property + def panda(self) -> Panda: + return self.p + + def _can_recv(self, wait_for_one: bool = False) -> list[list[CanData]]: + recv = self.p.can_recv() + while len(recv) == 0 and wait_for_one: + recv = self.p.can_recv() + return [[CanData(addr, dat, bus) for addr, dat, bus in recv], ] + + def read(self, strict: bool = True): + cs = self.CI.update([int(time.monotonic()*1e9), self._can_recv()[0]]) + if strict: + assert cs.canValid, "CAN went invalid, check connections" + return cs + + def write(self, cc: CarControl) -> None: + if cc.enabled and not self.p.health()['controls_allowed']: + # prevent the car from faulting. print a warning? + cc = CarControl(enabled=False) + _, can_sends = self.CI.apply(cc) + self.p.can_send_many(can_sends, timeout=25) + self.p.send_heartbeat() + + +if __name__ == "__main__": + with PandaRunner() as p: + print(p.read()) diff --git a/artifacts/package_runtime/iqdbc/car/psa/__init__.py b/artifacts/package_runtime/iqdbc/car/psa/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/psa/carcontroller.py b/artifacts/package_runtime/iqdbc/car/psa/carcontroller.py new file mode 100644 index 000000000..4a3e2d50f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/psa/carcontroller.py @@ -0,0 +1,41 @@ +from iqdbc.can.packer import CANPacker +from iqdbc.car import Bus +from iqdbc.car.lateral import apply_std_steer_angle_limits +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.psa.psacan import create_lka_steering +from iqdbc.car.psa.values import CarControllerParams + + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ): + super().__init__(dbc_names, CP, CP_IQ) + self.packer = CANPacker(dbc_names[Bus.main]) + self.apply_angle_last = 0 + self.status = 2 + + def update(self, CC, CC_IQ, CS, now_nanos): + can_sends = [] + actuators = CC.actuators + + # lateral control + if self.frame % 5 == 0: + apply_angle = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw, + CS.out.steeringAngleDeg, CC.latActive, CarControllerParams.ANGLE_LIMITS) + + # EPS disengages on steering override, activation sequence 2->3->4 to re-engage + # STATUS - 0: UNAVAILABLE, 1: UNSELECTED, 2: READY, 3: AUTHORIZED, 4: ACTIVE + if not CC.latActive: + self.status = 2 + elif not CS.eps_active and not CS.out.steeringPressed: + self.status = 2 if self.status == 4 else self.status + 1 + else: + self.status = 4 + + can_sends.append(create_lka_steering(self.packer, CC.latActive, apply_angle, self.status)) + + self.apply_angle_last = apply_angle + + new_actuators = actuators.as_builder() + new_actuators.steeringAngleDeg = self.apply_angle_last + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/psa/carstate.py b/artifacts/package_runtime/iqdbc/car/psa/carstate.py new file mode 100644 index 000000000..aab441074 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/psa/carstate.py @@ -0,0 +1,74 @@ +from iqdbc.car import structs, Bus +from iqdbc.can.parser import CANParser +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.psa.values import DBC, CarControllerParams +from iqdbc.car.interfaces import CarStateBase + +GearShifter = structs.CarState.GearShifter +TransmissionType = structs.CarParams.TransmissionType + + +class CarState(CarStateBase): + def update(self, can_parsers) -> structs.CarState: + cp = can_parsers[Bus.main] + cp_adas = can_parsers[Bus.adas] + cp_cam = can_parsers[Bus.cam] + ret = structs.CarState() + ret_iq = structs.IQCarState() + + # car speed + self.parse_wheel_speeds(ret, + cp.vl['Dyn4_FRE']['P263_VehV_VPsvValWhlFrtL'], + cp.vl['Dyn4_FRE']['P264_VehV_VPsvValWhlFrtR'], + cp.vl['Dyn4_FRE']['P265_VehV_VPsvValWhlBckL'], + cp.vl['Dyn4_FRE']['P266_VehV_VPsvValWhlBckR'], + ) + ret.yawRate = cp_adas.vl['HS2_DYN_UCF_MDD_32D']['VITESSE_LACET_BRUTE'] * CV.DEG_TO_RAD + ret.standstill = bool(cp_adas.vl['HS2_DYN_UCF_MDD_32D']['VEHICLE_STANDSTILL']) + + # gas + ret.gasPressed = cp.vl['Dyn_CMM']['P002_Com_rAPP'] > 0 + + # brake + ret.brakePressed = bool(cp_cam.vl['Dat_BSI']['P013_MainBrake']) + ret.parkingBrake = cp.vl['Dyn_EasyMove']['P337_Com_stPrkBrk'] == 1 # 0: disengaged, 1: engaged, 3: brake actuator moving + + # steering wheel + ret.steeringAngleDeg = cp.vl['STEERING_ALT']['ANGLE'] # EPS + ret.steeringRateDeg = cp.vl['STEERING_ALT']['RATE'] * (2 * cp.vl['STEERING_ALT']['RATE_SIGN'] - 1) # convert [0,1] to [-1,1] EPS: rot. speed * rot. sign + ret.steeringTorque = cp.vl['STEERING']['DRIVER_TORQUE'] + ret.steeringTorqueEps = cp.vl['IS_DAT_DIRA']['EPS_TORQUE'] + ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE, 5) + self.eps_active = cp.vl['IS_DAT_DIRA']['EPS_STATE_LKA'] == 3 # 0: Unauthorized, 1: Authorized, 2: Available, 3: Active, 4: Defect + + # cruise + ret.cruiseState.speed = cp_adas.vl['HS2_DAT_MDD_CMD_452']['SPEED_SETPOINT'] * CV.KPH_TO_MS # set to 255 when ACC is off, -2 kph offset from dash speed + ret.cruiseState.enabled = cp_adas.vl['HS2_DAT_MDD_CMD_452']['RVV_ACC_ACTIVATION_REQ'] == 1 + ret.cruiseState.available = cp_adas.vl['HS2_DYN1_MDD_ETAT_2B6']['ACC_STATUS'] > 2 + ret.cruiseState.nonAdaptive = cp_adas.vl['HS2_DAT_MDD_CMD_452']['LONGITUDINAL_REGULATION_TYPE'] != 3 # 0: None, 1: CC, 2: Limiter, 3: ACC + ret.cruiseState.standstill = bool(cp_adas.vl['HS2_DYN_UCF_MDD_32D']['VEHICLE_STANDSTILL']) + ret.accFaulted = cp_adas.vl['HS2_DYN_UCF_MDD_32D']['ACC_ETAT_DECEL_OR_ESP_STATUS'] == 3 # 0: Inhibited, 1: Waiting, 2: Active, 3: Fault + + # gear + if bool(cp_cam.vl['Dat_BSI']['P103_Com_bRevGear']): + ret.gearShifter = GearShifter.reverse + else: + ret.gearShifter = GearShifter.drive + + # blinkers + blinker = cp_cam.vl['HS2_DAT7_BSI_612']['CDE_CLG_ET_HDC'] + ret.leftBlinker = blinker == 1 + ret.rightBlinker = blinker == 2 + + # lock info + ret.doorOpen = any((cp_cam.vl['Dat_BSI']['DRIVER_DOOR'], cp_cam.vl['Dat_BSI']['PASSENGER_DOOR'])) + ret.seatbeltUnlatched = cp_cam.vl['RESTRAINTS']['DRIVER_SEATBELT'] != 2 + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + return { + Bus.main: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0), + Bus.adas: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 1), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2), + } diff --git a/artifacts/package_runtime/iqdbc/car/psa/fingerprints.py b/artifacts/package_runtime/iqdbc/car/psa/fingerprints.py new file mode 100644 index 000000000..444a5c7c6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/psa/fingerprints.py @@ -0,0 +1,13 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.psa.values import CAR + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.PSA_PEUGEOT_208: { + (Ecu.fwdRadar, 0x6b6, None): [ + b'212053276', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/psa/interface.py b/artifacts/package_runtime/iqdbc/car/psa/interface.py new file mode 100644 index 000000000..d6fbc883c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/psa/interface.py @@ -0,0 +1,30 @@ +from iqdbc.car import structs, get_safety_config +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.psa.carcontroller import CarController +from iqdbc.car.psa.carstate import CarState + +TransmissionType = structs.CarParams.TransmissionType + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = 'psa' + + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.psa)] + + ret.dashcamOnly = True + + ret.steerActuatorDelay = 0.3 + ret.steerLimitTimer = 0.1 + ret.steerAtStandstill = True + + ret.steerControlType = structs.CarParams.SteerControlType.angle + ret.radarUnavailable = True + + ret.alphaLongitudinalAvailable = False + + return ret \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/car/psa/psacan.py b/artifacts/package_runtime/iqdbc/car/psa/psacan.py new file mode 100644 index 000000000..a039e752a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/psa/psacan.py @@ -0,0 +1,18 @@ +def psa_checksum(address: int, sig, d: bytearray) -> int: + chk_ini = {0x452: 0x4, 0x38D: 0x7, 0x42D: 0xC}.get(address, 0xB) + byte = sig.start_bit // 8 + d[byte] &= 0x0F if sig.start_bit % 8 >= 4 else 0xF0 + checksum = sum((b >> 4) + (b & 0xF) for b in d) + return (chk_ini - checksum) & 0xF + + +def create_lka_steering(packer, lat_active: bool, apply_angle: float, status: int): + values = { + 'DRIVE': 1, + 'STATUS': status, + 'LXA_ACTIVATION': 1, + 'TORQUE_FACTOR': lat_active * 100, + 'SET_ANGLE': apply_angle, + } + + return packer.make_can_msg('LANE_KEEP_ASSIST', 0, values) diff --git a/artifacts/package_runtime/iqdbc/car/psa/values.py b/artifacts/package_runtime/iqdbc/car/psa/values.py new file mode 100644 index 000000000..ffadfd0f6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/psa/values.py @@ -0,0 +1,54 @@ +from dataclasses import dataclass, field + +from iqdbc.car.structs import CarParams +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms +from iqdbc.car.lateral import AngleSteeringLimits +from iqdbc.car.docs_definitions import CarDocs, CarHarness, CarParts +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries + +Ecu = CarParams.Ecu + + +class CarControllerParams: + STEER_STEP = 1 + + ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( + 390, # deg + ([0., 5., 25.], [2.5, 1.5, .2]), + ([0., 5., 25.], [5., 2., .3]), + ) + STEER_DRIVER_ALLOWANCE = 5 # Driver intervention threshold, 0.5 Nm + + +@dataclass +class PSACarDocs(CarDocs): + package: str = "Adaptive Cruise Control (ACC) & Lane Assist" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.psa_a])) + + +@dataclass +class PSAPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: { + Bus.pt: 'psa_aee2010_r3', + }) + + +class CAR(Platforms): + PSA_PEUGEOT_208 = PSAPlatformConfig( + [PSACarDocs("Peugeot 208 2019-25")], + CarSpecs(mass=1530, wheelbase=2.54, steerRatio=17.6), + ) + + +# Placeholder, FW Query will be added in separate PR +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.UDS_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.UDS_VERSION_RESPONSE], + bus=0, + ), + ], +) + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/rivian/__init__.py b/artifacts/package_runtime/iqdbc/car/rivian/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/rivian/carcontroller.py b/artifacts/package_runtime/iqdbc/car/rivian/carcontroller.py new file mode 100644 index 000000000..5b9638b9c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rivian/carcontroller.py @@ -0,0 +1,62 @@ +import numpy as np +from iqdbc.can import CANPacker +from iqdbc.car import Bus +from iqdbc.car.lateral import apply_driver_steer_torque_limits +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.rivian.riviancan import create_lka_steering, create_longitudinal, create_wheel_touch, create_adas_status +from iqdbc.car.rivian.values import CarControllerParams + +from iqdbc.lvbs.car.rivian.aol import AolCarController + + +class CarController(CarControllerBase, AolCarController): + def __init__(self, dbc_names, CP, CP_IQ): + CarControllerBase.__init__(self, dbc_names, CP, CP_IQ) + AolCarController.__init__(self) + self.apply_torque_last = 0 + self.packer = CANPacker(dbc_names[Bus.pt]) + + self.cancel_frames = 0 + + def update(self, CC, CC_IQ, CS, now_nanos): + AolCarController.update(self, CC, CC_IQ, CS) + actuators = CC.actuators + can_sends = [] + + apply_torque = 0 + steer_max = round(float(np.interp(CS.out.vEgoRaw, CarControllerParams.STEER_MAX_LOOKUP[0], + CarControllerParams.STEER_MAX_LOOKUP[1]))) + if self.aol.lat_active: + new_torque = int(round(CC.actuators.torque * steer_max)) + apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, + CS.out.steeringTorque, CarControllerParams, steer_max) + + # send steering command + self.apply_torque_last = apply_torque + can_sends.append(create_lka_steering(self.packer, self.frame, CS.acm_lka_hba_cmd, apply_torque, CC.enabled, CC.latActive, self.aol)) + + if self.frame % 5 == 0: + can_sends.append(create_wheel_touch(self.packer, CS.sccm_wheel_touch, CC.enabled)) + + # Longitudinal control + if self.CP.openpilotLongitudinalControl: + accel = float(np.clip(actuators.accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX)) + can_sends.append(create_longitudinal(self.packer, self.frame, accel, CC.enabled)) + else: + interface_status = None + if CC.cruiseControl.cancel: + # if there is a noEntry, we need to send a status of "available" before the ACM will accept "unavailable" + # send "available" right away as the VDM itself takes a few frames to acknowledge + interface_status = 1 if self.cancel_frames < 5 else 0 + self.cancel_frames += 1 + else: + self.cancel_frames = 0 + + can_sends.append(create_adas_status(self.packer, CS.vdm_adas_status, interface_status)) + + new_actuators = actuators.as_builder() + new_actuators.torque = apply_torque / steer_max + new_actuators.torqueOutputCan = apply_torque + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/rivian/carstate.py b/artifacts/package_runtime/iqdbc/car/rivian/carstate.py new file mode 100644 index 000000000..1901913df --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rivian/carstate.py @@ -0,0 +1,109 @@ +import copy +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.rivian.values import DBC, GEAR_MAP +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.lvbs.car.rivian.iq_carstate import IQCarState + +GearShifter = structs.CarState.GearShifter + + +class CarState(CarStateBase, IQCarState): + def __init__(self, CP, CP_IQ): + CarStateBase.__init__(self, CP, CP_IQ) + IQCarState.__init__(self, CP, CP_IQ) + self.last_speed = 30 + + self.acm_lka_hba_cmd = None + self.sccm_wheel_touch = None + self.vdm_adas_status = None + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + cp_adas = can_parsers[Bus.adas] + ret = structs.CarState() + ret_iq = structs.IQCarState() + + # Vehicle speed + ret.vEgoRaw = cp.vl["ESP_Status"]["ESP_Vehicle_Speed"] * CV.KPH_TO_MS + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.standstill = abs(ret.vEgoRaw) < 0.01 + conversion = CV.KPH_TO_MS if cp_adas.vl["Cluster"]["Cluster_Unit"] == 0 else CV.MPH_TO_MS + ret.vEgoCluster = cp_adas.vl["Cluster"]["Cluster_VehicleSpeed"] * conversion + + # Gas pedal + ret.gasPressed = cp.vl["VDM_PropStatus"]["VDM_AcceleratorPedalPosition"] > 0 + + # Brake pedal + ret.brake = cp.vl["ESPiB3"]["ESPiB3_pMC1"] / 250.0 # pressure in Bar + ret.brakePressed = cp.vl["iBESP2"]["iBESP2_BrakePedalApplied"] == 1 + + # Steering wheel + ret.steeringAngleDeg = cp.vl["EPAS_AdasStatus"]["EPAS_InternalSas"] + ret.steeringRateDeg = cp.vl["EPAS_AdasStatus"]["EPAS_SteeringAngleSpeed"] + ret.steeringTorque = cp.vl["EPAS_SystemStatus"]["EPAS_TorsionBarTorque"] + ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > 1.0, 5) + + ret.steerFaultTemporary = cp.vl["EPAS_AdasStatus"]["EPAS_EacErrorCode"] != 0 + + # Cruise state + speed = min(int(cp_adas.vl["ACM_tsrCmd"]["ACM_tsrSpdDisClsMain"]), 85) + self.last_speed = speed if speed != 0 else self.last_speed + ret.cruiseState.enabled = cp_cam.vl["ACM_Status"]["ACM_FeatureStatus"] == 1 + # TODO: find cruise set speed on CAN + ret.cruiseState.speed = self.last_speed * CV.MPH_TO_MS # detected speed limit + if not self.CP.openpilotLongitudinalControl: + ret.cruiseState.speed = -1 + ret.cruiseState.available = True # cp.vl["VDM_AdasSts"]["VDM_AdasInterfaceStatus"] == 1 + ret.cruiseState.standstill = cp.vl["VDM_AdasSts"]["VDM_AdasVehicleHoldStatus"] == 1 + + # ACM_Status->ACM_FaultSupervisorState normally 1, appears to go to 3 when either: + # 1. car in park/not in drive (normal) + # 2. something (message from another ECU) ACM relies on is faulty + # * ACM_FaultStatus will stay 0 since ACM itself isn't faulted + # TODO: ACM_FaultStatus hasn't been seen high yet, but log anyway + ret.accFaulted = (cp_cam.vl["ACM_Status"]["ACM_FaultStatus"] == 1 or + # VDM_AdasFaultStatus=Brk_Intv is the default for some reason + # VDM_AdasFaultStatus=Cntr_Fault isn't fully understood, but we've seen it in the wild + # VDM_AdasFaultStatus=Imps_Cmd was seen when sending it rapidly changing ACC enable commands, or when ACC command drops out + cp.vl["VDM_AdasSts"]["VDM_AdasFaultStatus"] in (2, 3)) # 2=Cntr_Fault, 3=Imps_Cmd + + # Gear + ret.gearShifter = GEAR_MAP.get(int(cp.vl["VDM_PropStatus"]["VDM_Prndl_Status"]), GearShifter.unknown) + + # Doors + ret.doorOpen = any(cp_adas.vl["IndicatorLights"][door] != 2 for door in ("RearDriverDoor", "FrontPassengerDoor", "DriverDoor", "RearPassengerDoor")) + + # Blinkers + ret.leftBlinker = cp_adas.vl["IndicatorLights"]["TurnLightLeft"] in (1, 2) + ret.rightBlinker = cp_adas.vl["IndicatorLights"]["TurnLightRight"] in (1, 2) + + # Seatbelt + ret.seatbeltUnlatched = cp.vl["RCM_Status"]["RCM_Status_IND_WARN_BELT_DRIVER"] != 0 + + # Blindspot + # ret.leftBlindspot = False + # ret.rightBlindspot = False + + # AEB + ret.stockAeb = cp_cam.vl["ACM_AebRequest"]["ACM_EnableRequest"] != 0 + + # Messages needed by carcontroller + self.acm_lka_hba_cmd = copy.copy(cp_cam.vl["ACM_lkaHbaCmd"]) + self.sccm_wheel_touch = copy.copy(cp.vl["SCCM_WheelTouch"]) + self.vdm_adas_status = copy.copy(cp.vl["VDM_AdasSts"]) + + IQCarState.update(self, ret, can_parsers) + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0), + Bus.adas: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 1), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2), + **IQCarState.get_parser(CP, CP_IQ), + } diff --git a/artifacts/package_runtime/iqdbc/car/rivian/fingerprints.py b/artifacts/package_runtime/iqdbc/car/rivian/fingerprints.py new file mode 100644 index 000000000..46ebc0232 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rivian/fingerprints.py @@ -0,0 +1,14 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.rivian.values import CAR + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.RIVIAN_R1_GEN1: { + (Ecu.eps, 0x733, None): [ + b'R1TS_v3.4.1(51),3.4.1\x00', + b'R1TS_v4.4.1(63),4.4.1\x00', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/rivian/interface.py b/artifacts/package_runtime/iqdbc/car/rivian/interface.py new file mode 100644 index 000000000..a211a98f4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rivian/interface.py @@ -0,0 +1,54 @@ +from iqdbc.car import get_safety_config, structs +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.rivian.carcontroller import CarController +from iqdbc.car.rivian.carstate import CarState +from iqdbc.car.rivian.radar_interface import RadarInterface +from iqdbc.car.rivian.values import RivianSafetyFlags +from iqdbc.lvbs.car.rivian.values import RivianFlagsIQ + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "rivian" + + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.rivian)] + + ret.steerActuatorDelay = 0.15 + ret.steerLimitTimer = 0.4 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + ret.steerControlType = structs.CarParams.SteerControlType.torque + ret.radarUnavailable = True + + # TODO: pending finding/handling missing set speed + ret.alphaLongitudinalAvailable = False + if alpha_long: + ret.openpilotLongitudinalControl = True + ret.safetyConfigs[0].safetyParam |= RivianSafetyFlags.LONG_CONTROL.value + + ret.longitudinalActuatorDelay = 0.35 + ret.stopAccel = 0 + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + # Longitudinal harness upgrade advertises msg 0x31a on bus 5; when present it + # unlocks radar, blind-spot and openpilot longitudinal on Rivian. + if 0x31a in fingerprint[5]: + ret.flags |= RivianFlagsIQ.LONGITUDINAL_HARNESS_UPGRADE.value + stock_cp.radarUnavailable = False + stock_cp.enableBsm = True + stock_cp.alphaLongitudinalAvailable = True + + if alpha_long and stock_cp.alphaLongitudinalAvailable: + stock_cp.openpilotLongitudinalControl = True + stock_cp.safetyConfigs[0].safetyParam |= RivianSafetyFlags.LONG_CONTROL.value + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/rivian/radar_interface.py b/artifacts/package_runtime/iqdbc/car/rivian/radar_interface.py new file mode 100644 index 000000000..f6016af81 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rivian/radar_interface.py @@ -0,0 +1,77 @@ +import math + +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.interfaces import RadarInterfaceBase +from iqdbc.car.rivian.values import DBC + +RADAR_START_ADDR = 0x500 +RADAR_MSG_COUNT = 32 + + +def get_radar_can_parser(CP): + messages = [(f"RADAR_TRACK_{addr:x}", 20) for addr in range(RADAR_START_ADDR, RADAR_START_ADDR + RADAR_MSG_COUNT)] + return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, 1) + + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + self.updated_messages = set() + self.trigger_msg = RADAR_START_ADDR + RADAR_MSG_COUNT - 1 + self.track_id = 0 + + self.radar_off_can = CP.radarUnavailable + self.rcp = get_radar_can_parser(CP) + + def update(self, can_strings): + if self.radar_off_can or (self.rcp is None): + return super().update(None) + + vls = self.rcp.update(can_strings) + self.updated_messages.update(vls) + + if self.trigger_msg not in self.updated_messages: + return None + + rr = self._update(self.updated_messages) + self.updated_messages.clear() + + return rr + + def _update(self, updated_messages): + ret = structs.RadarData() + if self.rcp is None: + return ret + + if not self.rcp.can_valid: + ret.errors.canError = True + + for addr in range(RADAR_START_ADDR, RADAR_START_ADDR + RADAR_MSG_COUNT): + msg = self.rcp.vl[f"RADAR_TRACK_{addr:x}"] + + # STATE: 1=New, 2=New_updated, 3=Updated, 4=Coasting, 7=New_coasting + valid = msg['STATE'] in (1, 2, 3, 4, 7) + + # Rivian's Short Range Radar (SSR) detects close stationary objects like guardrails, which cause phantom braking. + # MODE: 1=SRR, 2=LRR, 3=SRR_and_LRR + valid = valid and msg['MODE'] in (2, 3) + + if valid: + if addr not in self.pts or msg['STATE'] in (1, 2, 7): + self.pts[addr] = structs.RadarData.RadarPoint() + self.pts[addr].trackId = self.track_id + self.track_id += 1 + + self.pts[addr].measured = msg['STATE'] in (2, 3) + azimuth = math.radians(msg['AZIMUTH']) + self.pts[addr].dRel = math.cos(azimuth) * msg['LONG_DIST'] + self.pts[addr].yRel = 0.5 * -math.sin(azimuth) * msg['LONG_DIST'] + self.pts[addr].vRel = msg['REL_SPEED'] + self.pts[addr].aRel = float('nan') + self.pts[addr].yvRel = float('nan') + elif addr in self.pts: + del self.pts[addr] + + ret.points = list(self.pts.values()) + return ret diff --git a/artifacts/package_runtime/iqdbc/car/rivian/riviancan.py b/artifacts/package_runtime/iqdbc/car/rivian/riviancan.py new file mode 100644 index 000000000..c818c6d24 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rivian/riviancan.py @@ -0,0 +1,99 @@ +def checksum(data, poly, xor_output): + crc = 0 + for byte in data: + crc ^= byte + for _ in range(8): + if crc & 0x80: + crc = (crc << 1) ^ poly + else: + crc <<= 1 + crc &= 0xFF + return crc ^ xor_output + + +def create_lka_steering(packer, frame, acm_lka_hba_cmd, apply_torque, enabled, active, aol): + # forward auto high beam and speed limit status and nothing else + values = {s: acm_lka_hba_cmd[s] for s in ( + "ACM_hbaSysState", + "ACM_hbaLamp", + "ACM_hbaOnOffState", + "ACM_slifOnOffState", + )} + + values |= { + "ACM_lkaHbaCmd_Counter": frame % 15, + "ACM_lkaStrToqReq": apply_torque, + "ACM_lkaActToi": aol.lat_active, + + "ACM_lkaLaneRecogState": 3 if aol.lka_icon_states else 0, + "ACM_lkaSymbolState": 3 if aol.lka_icon_states else 0, + + # static values + "ACM_lkaElkRequest": 0, + "ACM_ldwlkaOnOffState": 2, # 2=LKAS+LDW on + "ACM_elkOnOffState": 1, # 1=LKAS on + # TODO: what are these used for? + "ACM_ldwWarnTypeState": 2, # always 2 + "ACM_ldwWarnTimingState": 1, # always 1 + #"ACM_lkaHandsoffDisplayWarning": 1, # TODO: we can send this when openpilot wants you to pay attention + } + + data = packer.make_can_msg("ACM_lkaHbaCmd", 0, values)[1] + values["ACM_lkaHbaCmd_Checksum"] = checksum(data[1:], 0x1D, 0x63) + return packer.make_can_msg("ACM_lkaHbaCmd", 0, values) + + +def create_wheel_touch(packer, sccm_wheel_touch, enabled): + values = {s: sccm_wheel_touch[s] for s in ( + "SCCM_WheelTouch_Counter", + "SCCM_WheelTouch_HandsOn", + "SCCM_WheelTouch_CapacitiveValue", + "SETME_X52", + )} + + # When only using ACC without lateral, the ACM warns the driver to hold the steering wheel on engagement + # Tell the ACM that the user is holding the wheel to avoid this warning + if enabled: + values["SCCM_WheelTouch_HandsOn"] = 1 + values["SCCM_WheelTouch_CapacitiveValue"] = 100 # only need to send this value, but both are set for consistency + + data = packer.make_can_msg("SCCM_WheelTouch", 2, values)[1] + values["SCCM_WheelTouch_Checksum"] = checksum(data[1:], 0x1D, 0x97) + return packer.make_can_msg("SCCM_WheelTouch", 2, values) + + +def create_longitudinal(packer, frame, accel, enabled): + values = { + "ACM_longitudinalRequest_Counter": frame % 15, + "ACM_AccelerationRequest": accel, + "ACM_PrndRequest": 0, + "ACM_longInterfaceEnable": 1 if enabled else 0, + "ACM_VehicleHoldRequest": 0, + } + + data = packer.make_can_msg("ACM_longitudinalRequest", 0, values)[1] + values["ACM_longitudinalRequest_Checksum"] = checksum(data[1:], 0x1D, 0x12) + return packer.make_can_msg("ACM_longitudinalRequest", 0, values) + + +def create_adas_status(packer, vdm_adas_status, interface_status): + values = {s: vdm_adas_status[s] for s in ( + "VDM_AdasStatus_Checksum", + "VDM_AdasStatus_Counter", + "VDM_AdasDecelLimit", + "VDM_AdasDriverAccelPriorityStatus", + "VDM_AdasFaultStatus", + "VDM_AdasAccelLimit", + "VDM_AdasDriverModeStatus", + "VDM_AdasUnkown1", + "VDM_AdasInterfaceStatus", + "VDM_AdasVehicleHoldStatus", + "VDM_UserAdasRequest", + )} + + if interface_status is not None: + values["VDM_AdasInterfaceStatus"] = interface_status + + data = packer.make_can_msg("VDM_AdasSts", 2, values)[1] + values["VDM_AdasStatus_Checksum"] = checksum(data[1:], 0x1D, 0xD1) + return packer.make_can_msg("VDM_AdasSts", 2, values) diff --git a/artifacts/package_runtime/iqdbc/car/rivian/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/rivian/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/rivian/tests/test_rivian.py b/artifacts/package_runtime/iqdbc/car/rivian/tests/test_rivian.py new file mode 100644 index 000000000..ec795e9a1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rivian/tests/test_rivian.py @@ -0,0 +1,23 @@ +from iqdbc.car.rivian.fingerprints import FW_VERSIONS +from iqdbc.car.rivian.values import CAR, FW_QUERY_CONFIG, WMI, ModelLine, ModelYear + + +class TestRivian: + def test_custom_fuzzy_fingerprinting(self, subtests): + for platform in CAR: + with subtests.test(platform=platform.name): + for wmi in WMI: + for line in ModelLine: + for year in ModelYear: + for bad in (True, False): + vin = ["0"] * 17 + vin[:3] = wmi + vin[3] = line.value + vin[9] = year.value + if bad: + vin[3] = "Z" + vin = "".join(vin) + + matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy({}, vin, FW_VERSIONS) + should_match = year != ModelYear.S_2025 and not bad + assert (matches == {platform}) == should_match, "Bad match" diff --git a/artifacts/package_runtime/iqdbc/car/rivian/values.py b/artifacts/package_runtime/iqdbc/car/rivian/values.py new file mode 100644 index 000000000..d21eae318 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rivian/values.py @@ -0,0 +1,139 @@ +from dataclasses import dataclass, field +from enum import StrEnum, IntFlag + +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, structs, uds +from iqdbc.car.docs_definitions import CarHarness, CarDocs, CarParts +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 +from iqdbc.car.vin import Vin + + +class WMI(StrEnum): + RIVIAN_TRUCK = "7FC" + RIVIAN_MPV = "7PD" + + +class ModelLine(StrEnum): + R1T = "T" # R1T 4-door Pickup Truck + R1S = "S" # R1S 4-door MPV + + +class ModelYear(StrEnum): + N_2022 = "N" + P_2023 = "P" + R_2024 = "R" + S_2025 = "S" + + +@dataclass +class RivianCarDocs(CarDocs): + package: str = "All" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.rivian])) + setup_video: str = "https://youtu.be/uaISd1j7Z4U" + + +@dataclass +class RivianPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'rivian_primary_actuator', Bus.radar: 'rivian_mando_front_radar_generated', + Bus.alt: 'rivian_park_assist_can'}) + wmis: set[WMI] = field(default_factory=set) + lines: set[ModelLine] = field(default_factory=set) + years: set[ModelYear] = field(default_factory=set) + + +class CAR(Platforms): + RIVIAN_R1_GEN1 = RivianPlatformConfig( + # TODO: verify this + [ + RivianCarDocs("Rivian R1S 2022-24"), + RivianCarDocs("Rivian R1T 2022-24"), + ], + CarSpecs(mass=3206., wheelbase=3.08, steerRatio=15.2), + wmis={WMI.RIVIAN_TRUCK, WMI.RIVIAN_MPV}, + lines={ModelLine.R1T, ModelLine.R1S}, + years={ModelYear.N_2022, ModelYear.P_2023, ModelYear.R_2024}, + ) + + +def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: + # Rivian VIN reference: https://www.rivianforums.com/forum/threads/rivian-vin-decoder.1546 + vin_obj = Vin(vin) + line = vin_obj.vds[:1] + year = vin_obj.vis[:1] + + candidates = set() + for platform in CAR: + if vin_obj.wmi in platform.config.wmis and line in platform.config.lines and year in platform.config.years: + candidates.add(platform) + + return {str(c) for c in candidates} + + +RIVIAN_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(0xf1a0) +RIVIAN_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.SUPPLIER_SOFTWARE_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.SUPPLIER_SOFTWARE_VERSION_RESPONSE], + rx_offset=0x40, + bus=0, + ), + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_ECU_HARDWARE_NUMBER_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_ECU_HARDWARE_NUMBER_RESPONSE], + rx_offset=0x40, + bus=0, + logging=True, + ), + Request( + [StdQueries.TESTER_PRESENT_REQUEST, RIVIAN_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, RIVIAN_VERSION_RESPONSE], + rx_offset=0x40, + bus=0, + logging=True, + ), + ], + match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, +) + +GEAR_MAP = { + 0: structs.CarState.GearShifter.unknown, + 1: structs.CarState.GearShifter.park, + 2: structs.CarState.GearShifter.reverse, + 3: structs.CarState.GearShifter.neutral, + 4: structs.CarState.GearShifter.drive, +} + + +class CarControllerParams: + # The R1T 2023 and R1S 2023 we tested on achieves slightly more lateral acceleration going left vs. right + # and lateral acceleration falls linearly as speed decreases from 38 mph to 20 mph. These values are set + # conservatively to reach a maximum of 3.0 m/s^2 turning left at 80 mph + + # These refer to turning left: + # 250 is ~2.8 m/s^2 above 17 m/s, then linearly ramps to ~1.6 m/s^2 from 17 m/s to 9 m/s + # TODO: it is theorized older models have different steering racks and achieve down to half the + # lateral acceleration referenced here at all speeds. detect this and ship a torque increase for those models + STEER_MAX = 250 # 350 is intended to maintain lateral accel, not increase it + STEER_MAX_LOOKUP = [9, 17], [350, 250] + STEER_STEP = 1 + STEER_DELTA_UP = 3 # torque increase per refresh + STEER_DELTA_DOWN = 5 # torque decrease per refresh + STEER_DRIVER_ALLOWANCE = 100 # allowed driver torque before start limiting + STEER_DRIVER_MULTIPLIER = 2 # weight driver torque + STEER_DRIVER_FACTOR = 100 + + ACCEL_MIN = -3.5 # m/s^2 + ACCEL_MAX = 2.0 # m/s^2 + + def __init__(self, CP): + pass + + +class RivianSafetyFlags(IntFlag): + LONG_CONTROL = 1 + + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/rlog.capnp b/artifacts/package_runtime/iqdbc/car/rlog.capnp new file mode 100644 index 000000000..50cdd68b5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/rlog.capnp @@ -0,0 +1,23 @@ +@0xce500edaaae36b0e; + +# Minimal schema for parsing rlog CAN messages +# Subset of cereal/log.capnp + +struct CanData { + address @0 :UInt32; + busTimeDEPRECATED @1 :UInt16; + dat @2 :Data; + src @3 :UInt8; +} + +struct Event { + logMonoTime @0 :UInt64; + + union { + initData @1 :Void; + frame @2 :Void; + gpsNMEA @3 :Void; + sensorEventDEPRECATED @4 :Void; + can @5 :List(CanData); + } +} diff --git a/artifacts/package_runtime/iqdbc/car/secoc.py b/artifacts/package_runtime/iqdbc/car/secoc.py new file mode 100644 index 000000000..c61f4ca14 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/secoc.py @@ -0,0 +1,49 @@ +import struct + +from Crypto.Hash import CMAC +from Crypto.Cipher import AES + + +def add_mac(key, trip_cnt, reset_cnt, msg_cnt, msg): + # TODO: clean up conversion to and from hex + + addr, payload, bus = msg + reset_flag = reset_cnt & 0b11 + msg_cnt_flag = msg_cnt & 0b11 + payload = payload[:4] + + # Step 1: Build Freshness Value (48 bits) + # [Trip Counter (16 bit)][[Reset Counter (20 bit)][Message Counter (8 bit)][Reset Flag (2 bit)][Padding (2 bit)] + freshness_value = struct.pack('>HI', trip_cnt, (reset_cnt << 12) | ((msg_cnt & 0xff) << 4) | (reset_flag << 2)) + + # Step 2: Build data to authenticate (96 bits) + # [Message ID (16 bits)][Payload (32 bits)][Freshness Value (48 bits)] + to_auth = struct.pack('>H', addr) + payload + freshness_value + + # Step 3: Calculate CMAC (28 bit) + cmac = CMAC.new(key, ciphermod=AES) + cmac.update(to_auth) + mac = cmac.digest().hex()[:7] # truncated MAC + + # Step 4: Build message + # [Payload (32 bit)][Message Counter Flag (2 bit)][Reset Flag (2 bit)][Authenticator (28 bit)] + msg_cnt_rst_flag = struct.pack('>B', (msg_cnt_flag << 2) | reset_flag).hex()[1] + msg = payload.hex() + msg_cnt_rst_flag + mac + payload = bytes.fromhex(msg) + + return (addr, payload, bus) + + +def build_sync_mac(key, trip_cnt, reset_cnt, id_=0xf): + id_ = struct.pack('>H', id_) # 16 + trip_cnt = struct.pack('>H', trip_cnt) # 16 + reset_cnt = struct.pack('>I', reset_cnt << 12)[:-1] # 20 + 4 padding + + to_auth = id_ + trip_cnt + reset_cnt # SecOC 11.4.1.1 page 138 + + cmac = CMAC.new(key, ciphermod=AES) + cmac.update(to_auth) + + msg = "0" + cmac.digest().hex()[:7] + msg = bytes.fromhex(msg) + return struct.unpack('>I', msg)[0] diff --git a/artifacts/package_runtime/iqdbc/car/structs.py b/artifacts/package_runtime/iqdbc/car/structs.py new file mode 100644 index 000000000..520c7fca8 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/structs.py @@ -0,0 +1,145 @@ +from dataclasses import dataclass as _dataclass, field, is_dataclass +from enum import Enum, StrEnum as _StrEnum, auto +from typing import dataclass_transform, get_origin +import os +import capnp +from iqdbc.car.common.basedir import BASEDIR +try: + from iqpilot.cereal import car +except ImportError: + capnp.remove_import_hook() + car = capnp.load(os.path.join(BASEDIR, "car.capnp")) + +CarState = car.CarState +RadarData = car.RadarData +CarControl = car.CarControl +CarParams = car.CarParams + +CarStateT = capnp.lib.capnp._StructModule +RadarDataT = capnp.lib.capnp._StructModule +CarControlT = capnp.lib.capnp._StructModule +CarParamsT = capnp.lib.capnp._StructModule + +AUTO_OBJ = object() +def auto_field(): + return AUTO_OBJ +@dataclass_transform() +def auto_dataclass(cls=None, /, **kwargs): + cls_annotations = cls.__dict__.get('__annotations__', {}) + for name, typ in cls_annotations.items(): + current_value = getattr(cls, name) + if current_value is AUTO_OBJ: + origin_typ = get_origin(typ) or typ + if isinstance(origin_typ, str): + raise TypeError(f"Forward references are not supported for auto_field: '{origin_typ}'. Use a default_factory with lambda instead.") + elif origin_typ in (int, float, str, bytes, list, tuple, bool) or is_dataclass(origin_typ): + setattr(cls, name, field(default_factory=origin_typ)) + elif issubclass(origin_typ, Enum): # first enum is the default + setattr(cls, name, field(default=next(iter(origin_typ)))) + else: + raise TypeError(f"Unsupported type for auto_field: {origin_typ}") + return _dataclass(cls, **kwargs) + +class StrEnum(_StrEnum): + @staticmethod + def _generate_next_value_(name, *args): + return name + +@auto_dataclass +class IQCarParams: + flags: int = auto_field() + iqSafetyFlags: int = auto_field() + pcmCruiseSpeed: bool = auto_field() + enableGasInterceptor: bool = auto_field() + longitudinalStoppingSpeedOverride: float = auto_field() + stoppingDecelRateOverride: float = auto_field() + longActiveWithGasOverride: bool = auto_field() + + iqLateralNet: 'IQCarParams.LateralNet' = field(default_factory=lambda: IQCarParams.LateralNet()) + + @auto_dataclass + class LateralNet: + model: 'IQCarParams.LateralNet.Model' = field(default_factory=lambda: IQCarParams.LateralNet.Model()) + fuzzyFingerprint: bool = auto_field() + + @auto_dataclass + class Model: + path: str = auto_field() + name: str = auto_field() + + +@auto_dataclass +class AlwaysOnLateral: + state: 'AlwaysOnLateral.AlwaysOnLateralState' = field( + default_factory=lambda: AlwaysOnLateral.AlwaysOnLateralState.disabled + ) + enabled: bool = auto_field() + active: bool = auto_field() + available: bool = auto_field() + + class AlwaysOnLateralState(StrEnum): + disabled = auto() + paused = auto() + enabled = auto() + softDisabling = auto() + overriding = auto() + + +@auto_dataclass +class LeadData: + dRel: float = auto_field() + yRel: float = auto_field() + vRel: float = auto_field() + aRel: float = auto_field() + vLead: float = auto_field() + dPath: float = auto_field() + vLat: float = auto_field() + vLeadK: float = auto_field() + aLeadK: float = auto_field() + fcw: bool = auto_field() + status: bool = auto_field() + aLeadTau: float = auto_field() + modelProb: float = auto_field() + radar: bool = auto_field() + radarTrackId: int = auto_field() + + aLeadDEPRECATED: float = auto_field() + + +@auto_dataclass +class IQCarControl: + aol: 'AlwaysOnLateral' = field(default_factory=lambda: AlwaysOnLateral()) + params: list['IQCarControl.Param'] = auto_field() + leadOne: 'LeadData' = field(default_factory=lambda: LeadData()) + leadTwo: 'LeadData' = field(default_factory=lambda: LeadData()) + angleOffsetDeg: float = auto_field() + # VW PQ "Blend IQ.Pilot + Stock ACC Radar" intent (radar_manager -> RadarHandler) + radarBlendActive: bool = auto_field() + radarEngageReq: bool = auto_field() + radarCancelReq: bool = auto_field() + useRadarAccel: bool = auto_field() + radarSetSpeedKph: float = auto_field() + radarGapBars: int = auto_field() + + @auto_dataclass + class Param: + key: str = auto_field() + value: bytes = auto_field() + type: 'IQCarControl.ParamType' = field( + default_factory=lambda: IQCarControl.ParamType.string + ) + + class ParamType(StrEnum): + string = auto() + bool = auto() + int = auto() + float = auto() + time = auto() + json = auto() + bytes = auto() + + +@auto_dataclass +class IQCarState: + speedLimit: float = auto_field() + alcOverrideAlert: bool = auto_field() diff --git a/artifacts/package_runtime/iqdbc/car/subaru/__init__.py b/artifacts/package_runtime/iqdbc/car/subaru/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/subaru/carcontroller.py b/artifacts/package_runtime/iqdbc/car/subaru/carcontroller.py new file mode 100644 index 000000000..3a1cab647 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/subaru/carcontroller.py @@ -0,0 +1,149 @@ +import numpy as np +from iqdbc.can import CANPacker +from iqdbc.car import Bus, make_tester_present_msg +from iqdbc.car.lateral import apply_driver_steer_torque_limits, common_fault_avoidance +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.subaru import subarucan +from iqdbc.car.subaru.values import DBC, GLOBAL_ES_ADDR, CanBus, CarControllerParams, SubaruFlags + +from iqdbc.lvbs.car.subaru.creep_assist import IQStopAndGoController + +# FIXME: These limits aren't exact. The real limit is more than likely over a larger time period and +# involves the total steering angle change rather than rate, but these limits work well for now +MAX_STEER_RATE = 25 # deg/s +MAX_STEER_RATE_FRAMES = 7 # tx control frames needed before torque can be cut + + +class CarController(CarControllerBase, IQStopAndGoController): + def __init__(self, dbc_names, CP, CP_IQ): + CarControllerBase.__init__(self, dbc_names, CP, CP_IQ) + IQStopAndGoController.__init__(self, CP, CP_IQ) + self.apply_torque_last = 0 + + self.cruise_button_prev = 0 + self.steer_rate_counter = 0 + + self.p = CarControllerParams(CP) + self.packer = CANPacker(DBC[CP.carFingerprint][Bus.pt]) + + def update(self, CC, CC_IQ, CS, now_nanos): + actuators = CC.actuators + hud_control = CC.hudControl + pcm_cancel_cmd = CC.cruiseControl.cancel + + can_sends = [] + + # *** steering *** + if (self.frame % self.p.STEER_STEP) == 0: + apply_torque = int(round(actuators.torque * self.p.STEER_MAX)) + + # limits due to driver torque + + new_torque = int(round(apply_torque)) + apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.p) + + if not CC.latActive: + apply_torque = 0 + + if self.CP.flags & SubaruFlags.PREGLOBAL: + can_sends.append(subarucan.create_preglobal_steering_control(self.packer, self.frame // self.p.STEER_STEP, apply_torque, CC.latActive)) + else: + apply_steer_req = CC.latActive + + if self.CP.flags & SubaruFlags.STEER_RATE_LIMITED: + # Steering rate fault prevention + self.steer_rate_counter, apply_steer_req = \ + common_fault_avoidance(abs(CS.out.steeringRateDeg) > MAX_STEER_RATE, apply_steer_req, + self.steer_rate_counter, MAX_STEER_RATE_FRAMES) + + can_sends.append(subarucan.create_steering_control(self.packer, apply_torque, apply_steer_req)) + + self.apply_torque_last = apply_torque + + # *** longitudinal *** + + if CC.longActive: + apply_throttle = int(round(np.interp(actuators.accel, CarControllerParams.THROTTLE_LOOKUP_BP, CarControllerParams.THROTTLE_LOOKUP_V))) + apply_rpm = int(round(np.interp(actuators.accel, CarControllerParams.RPM_LOOKUP_BP, CarControllerParams.RPM_LOOKUP_V))) + apply_brake = int(round(np.interp(actuators.accel, CarControllerParams.BRAKE_LOOKUP_BP, CarControllerParams.BRAKE_LOOKUP_V))) + + # limit min and max values + cruise_throttle = np.clip(apply_throttle, CarControllerParams.THROTTLE_MIN, CarControllerParams.THROTTLE_MAX) + cruise_rpm = np.clip(apply_rpm, CarControllerParams.RPM_MIN, CarControllerParams.RPM_MAX) + cruise_brake = np.clip(apply_brake, CarControllerParams.BRAKE_MIN, CarControllerParams.BRAKE_MAX) + else: + cruise_throttle = CarControllerParams.THROTTLE_INACTIVE + cruise_rpm = CarControllerParams.RPM_MIN + cruise_brake = CarControllerParams.BRAKE_MIN + + # *** alerts and pcm cancel *** + if self.CP.flags & SubaruFlags.PREGLOBAL: + if self.frame % 5 == 0: + # 1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 = resume deep + # disengage ACC when OP is disengaged + if pcm_cancel_cmd: + cruise_button = 1 + # turn main on if off and past start-up state + elif not CS.out.cruiseState.available and CS.ready: + cruise_button = 1 + else: + cruise_button = CS.cruise_button + + # unstick previous mocked button press + if cruise_button == 1 and self.cruise_button_prev == 1: + cruise_button = 0 + self.cruise_button_prev = cruise_button + + can_sends.append(subarucan.create_preglobal_es_distance(self.packer, cruise_button, CS.es_distance_msg)) + + else: + if self.frame % 10 == 0: + can_sends.append(subarucan.create_es_dashstatus(self.packer, self.frame // 10, CS.es_dashstatus_msg, CC.enabled, + self.CP.openpilotLongitudinalControl, CC.longActive, hud_control.leadVisible)) + + can_sends.append(subarucan.create_es_lkas_state(self.packer, self.frame // 10, CS.es_lkas_state_msg, CC.enabled, hud_control.visualAlert, + hud_control.leftLaneVisible, hud_control.rightLaneVisible, + hud_control.leftLaneDepart, hud_control.rightLaneDepart)) + + if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT: + can_sends.append(subarucan.create_es_infotainment(self.packer, self.frame // 10, CS.es_infotainment_msg, hud_control.visualAlert)) + + if self.CP.openpilotLongitudinalControl: + if self.frame % 5 == 0: + can_sends.append(subarucan.create_es_status(self.packer, self.frame // 5, CS.es_status_msg, + self.CP.openpilotLongitudinalControl, CC.longActive, cruise_rpm)) + + can_sends.append(subarucan.create_es_brake(self.packer, self.frame // 5, CS.es_brake_msg, + self.CP.openpilotLongitudinalControl, CC.longActive, cruise_brake)) + + can_sends.append(subarucan.create_es_distance(self.packer, self.frame // 5, CS.es_distance_msg, 0, pcm_cancel_cmd, + self.CP.openpilotLongitudinalControl, cruise_brake > 0, cruise_throttle)) + else: + if pcm_cancel_cmd: + if not (self.CP.flags & SubaruFlags.HYBRID): + bus = CanBus.alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else CanBus.main + can_sends.append(subarucan.create_es_distance(self.packer, CS.es_distance_msg["COUNTER"] + 1, CS.es_distance_msg, bus, pcm_cancel_cmd)) + + if self.CP.flags & SubaruFlags.DISABLE_EYESIGHT: + # Tester present (keeps eyesight disabled) + if self.frame % 100 == 0: + can_sends.append(make_tester_present_msg(GLOBAL_ES_ADDR, CanBus.camera, suppress_response=True)) + + # Create all of the other eyesight messages to keep the rest of the car happy when eyesight is disabled + if self.frame % 5 == 0: + can_sends.append(subarucan.create_es_highbeamassist(self.packer)) + + if self.frame % 10 == 0: + can_sends.append(subarucan.create_es_static_1(self.packer)) + + if self.frame % 2 == 0: + can_sends.append(subarucan.create_es_static_2(self.packer)) + + can_sends.extend(IQStopAndGoController.create_creep_assist(self, self.packer, CC, CS, self.frame)) + + new_actuators = actuators.as_builder() + new_actuators.torque = self.apply_torque_last / self.p.STEER_MAX + new_actuators.torqueOutputCan = self.apply_torque_last + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/subaru/carstate.py b/artifacts/package_runtime/iqdbc/car/subaru/carstate.py new file mode 100644 index 000000000..5276c4d60 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/subaru/carstate.py @@ -0,0 +1,157 @@ +import copy +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.subaru.values import DBC, CanBus, SubaruFlags +from iqdbc.car import CanSignalRateCalculator + +from iqdbc.lvbs.car.subaru.aol import AolCarState +from iqdbc.lvbs.car.subaru.creep_assist import IQStopAndGoState + + +class CarState(CarStateBase, AolCarState, IQStopAndGoState): + def __init__(self, CP, CP_IQ): + CarStateBase.__init__(self, CP, CP_IQ) + AolCarState.__init__(self, CP, CP_IQ) + IQStopAndGoState.__init__(self, CP, CP_IQ) + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + self.shifter_values = can_define.dv["Transmission"]["Gear"] + + self.angle_rate_calulator = CanSignalRateCalculator(50) + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + cp_alt = can_parsers[Bus.alt] + ret = structs.CarState() + ret_iq = structs.IQCarState() + + throttle_msg = cp.vl["Throttle"] if not (self.CP.flags & SubaruFlags.HYBRID) else cp_alt.vl["Throttle_Hybrid"] + ret.gasPressed = throttle_msg["Throttle_Pedal"] > 1e-5 + if self.CP.flags & SubaruFlags.PREGLOBAL: + ret.brakePressed = cp.vl["Brake_Pedal"]["Brake_Pedal"] > 0 + else: + cp_brakes = cp_alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp + ret.brakePressed = cp_brakes.vl["Brake_Status"]["Brake"] == 1 + + cp_es_distance = cp_alt if self.CP.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID) else cp_cam + if not (self.CP.flags & SubaruFlags.HYBRID): + eyesight_fault = bool(cp_es_distance.vl["ES_Distance"]["Cruise_Fault"]) + + # if openpilot is controlling long, an eyesight fault is a non-critical fault. otherwise it's an ACC fault + if self.CP.openpilotLongitudinalControl: + ret.carFaultedNonCritical = eyesight_fault + else: + ret.accFaulted = eyesight_fault + + cp_wheels = cp_alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp + self.parse_wheel_speeds(ret, + cp_wheels.vl["Wheel_Speeds"]["FL"], + cp_wheels.vl["Wheel_Speeds"]["FR"], + cp_wheels.vl["Wheel_Speeds"]["RL"], + cp_wheels.vl["Wheel_Speeds"]["RR"], + ) + ret.standstill = ret.vEgoRaw == 0 + + # continuous blinker signals for assisted lane change + ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, cp.vl["Dashlights"]["LEFT_BLINKER"], + cp.vl["Dashlights"]["RIGHT_BLINKER"]) + + if self.CP.enableBsm: + ret.leftBlindspot = (cp.vl["BSD_RCTA"]["L_ADJACENT"] == 1) or (cp.vl["BSD_RCTA"]["L_APPROACHING"] == 1) + ret.rightBlindspot = (cp.vl["BSD_RCTA"]["R_ADJACENT"] == 1) or (cp.vl["BSD_RCTA"]["R_APPROACHING"] == 1) + + cp_transmission = cp_alt if self.CP.flags & SubaruFlags.HYBRID else cp + can_gear = int(cp_transmission.vl["Transmission"]["Gear"]) + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None)) + + if not (self.CP.flags & SubaruFlags.LKAS_ANGLE): + ret.steeringAngleDeg = cp.vl["Steering_Torque"]["Steering_Angle"] + steering_updated = len(cp.vl_all["Steering_Torque"]["Steering_Angle"]) > 0 + else: + # Steering_Torque->Steering_Angle exists on SUBARU_FORESTER_2022, SUBARU_OUTBACK_2023, SUBARU_ASCENT_2023 where + # it is identical to Steering_2's signal. However, it is always zero on newer LKAS_ANGLE cars + # such as 2024+ Crosstrek, 2023+ Ascent, etc. Use a universal signal for LKAS_ANGLE cars. + ret.steeringAngleDeg = cp.vl["Steering_2"]["Steering_Angle"] + steering_updated = len(cp.vl_all["Steering_2"]["Steering_Angle"]) > 0 + + if not (self.CP.flags & SubaruFlags.PREGLOBAL): + # ideally we get this from the car, but unclear if it exists. diagnostic software doesn't even have it + ret.steeringRateDeg = self.angle_rate_calulator.update(ret.steeringAngleDeg, steering_updated) + + ret.steeringTorque = cp.vl["Steering_Torque"]["Steer_Torque_Sensor"] + ret.steeringTorqueEps = cp.vl["Steering_Torque"]["Steer_Torque_Output"] + + steer_threshold = 75 if self.CP.flags & SubaruFlags.PREGLOBAL else 80 + ret.steeringPressed = abs(ret.steeringTorque) > steer_threshold + + cp_cruise = cp_alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp + cp_es_brake = cp_alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp_cam + + if self.CP.flags & (SubaruFlags.HYBRID | SubaruFlags.LKAS_ANGLE): + # ES_DashStatus->Cruise_Activated_Dash is likely intended for the dash display only, as it falls + # during user gas override and at standstill. ES_Status is missing on hybrid, so we use ES_Brake instead + + # TODO: ES_Brake->Cruise_Activated has been seen staying high when Crosstrek 2025 angle LKAS user pressed + # brake while engaged at a stop. ES_Status and ES_DashStatus->Signal7 correctly fell, but is either missing or + # always zero on hybrids. Probably need to split angle & hybrid. 0x27 and 0x225 on hybrids may work for them. + ret.cruiseState.enabled = cp_es_brake.vl["ES_Brake"]['Cruise_Activated'] != 0 + ret.cruiseState.available = cp_cam.vl["ES_DashStatus"]['Cruise_On'] != 0 + else: + ret.cruiseState.enabled = cp_cruise.vl["CruiseControl"]["Cruise_Activated"] != 0 + ret.cruiseState.available = cp_cruise.vl["CruiseControl"]["Cruise_On"] != 0 + ret.cruiseState.speed = cp_cam.vl["ES_DashStatus"]["Cruise_Set_Speed"] * CV.KPH_TO_MS + + if (self.CP.flags & SubaruFlags.PREGLOBAL and cp.vl["Dash_State2"]["UNITS"] == 1) or \ + (not (self.CP.flags & SubaruFlags.PREGLOBAL) and cp.vl["Dashlights"]["UNITS"] == 1): + ret.cruiseState.speed *= CV.MPH_TO_KPH + + ret.seatbeltUnlatched = cp.vl["Dashlights"]["SEATBELT_FL"] == 1 + ret.doorOpen = any([cp.vl["BodyInfo"]["DOOR_OPEN_RR"], + cp.vl["BodyInfo"]["DOOR_OPEN_RL"], + cp.vl["BodyInfo"]["DOOR_OPEN_FR"], + cp.vl["BodyInfo"]["DOOR_OPEN_FL"]]) + ret.steerFaultPermanent = cp.vl["Steering_Torque"]["Steer_Error_1"] == 1 + + if self.CP.flags & SubaruFlags.PREGLOBAL: + self.cruise_button = cp_cam.vl["ES_Distance"]["Cruise_Button"] + self.ready = not cp_cam.vl["ES_DashStatus"]["Not_Ready_Startup"] + else: + ret.steerFaultTemporary = cp.vl["Steering_Torque"]["Steer_Warning"] == 1 + ret.cruiseState.nonAdaptive = cp_cam.vl["ES_DashStatus"]["Conventional_Cruise"] == 1 + ret.cruiseState.standstill = cp_cam.vl["ES_DashStatus"]["Cruise_State"] == 3 + ret.stockFcw = (cp_cam.vl["ES_LKAS_State"]["LKAS_Alert"] == 1) or \ + (cp_cam.vl["ES_LKAS_State"]["LKAS_Alert"] == 2) + + self.es_lkas_state_msg = copy.copy(cp_cam.vl["ES_LKAS_State"]) + self.es_brake_msg = copy.copy(cp_es_brake.vl["ES_Brake"]) + + # TODO: Hybrid cars don't have ES_Distance, need a replacement + if not (self.CP.flags & SubaruFlags.HYBRID): + # 8 is known AEB, there are a few other values related to AEB we ignore + ret.stockAeb = (cp_es_distance.vl["ES_Brake"]["AEB_Status"] == 8) and \ + (cp_es_distance.vl["ES_Brake"]["Brake_Pressure"] != 0) + + self.es_status_msg = copy.copy(cp_es_brake.vl["ES_Status"]) + self.cruise_control_msg = copy.copy(cp_cruise.vl["CruiseControl"]) + + if not (self.CP.flags & SubaruFlags.HYBRID): + self.es_distance_msg = copy.copy(cp_es_distance.vl["ES_Distance"]) + + self.es_dashstatus_msg = copy.copy(cp_cam.vl["ES_DashStatus"]) + if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT: + self.es_infotainment_msg = copy.copy(cp_cam.vl["ES_Infotainment"]) + + AolCarState.update_aol(self, ret, can_parsers) + IQStopAndGoState.update(self, ret, can_parsers) + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus.main), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus.camera), + Bus.alt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus.alt) + } diff --git a/artifacts/package_runtime/iqdbc/car/subaru/fingerprints.py b/artifacts/package_runtime/iqdbc/car/subaru/fingerprints.py new file mode 100644 index 000000000..8cc65a171 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/subaru/fingerprints.py @@ -0,0 +1,586 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.subaru.values import CAR + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.SUBARU_ASCENT: { + (Ecu.abs, 0x7b0, None): [ + b'\xa5 \x19\x02\x00', + b'\xa5 !\x02\x00', + ], + (Ecu.eps, 0x746, None): [ + b'\x05\xc0\xd0\x00', + b'\x85\xc0\xd0\x00', + b'\x95\xc0\xd0\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00d\xb9\x00\x00\x00\x00', + b'\x00\x00d\xb9\x1f@ \x10', + b'\x00\x00e@\x00\x00\x00\x00', + b'\x00\x00e@\x1f@ $', + b"\x00\x00e~\x1f@ '", + ], + (Ecu.engine, 0x7e0, None): [ + b'\xbb,\xa0t\x07', + b'\xd1,\xa0q\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\x00>\xf0\x00\x00', + b'\x00\xfe\xf7\x00\x00', + b'\x01\xfe\xf7\x00\x00', + b'\x01\xfe\xf9\x00\x00', + b'\x01\xfe\xfa\x00\x00', + ], + }, + CAR.SUBARU_ASCENT_2023: { + (Ecu.abs, 0x7b0, None): [ + b'\xa5 #\x03\x00', + ], + (Ecu.eps, 0x746, None): [ + b'%\xc0\xd0\x11', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x05!\x08\x1dK\x05!\x08\x01/', + ], + (Ecu.engine, 0x7a2, None): [ + b'\xe5,\xa0P\x07', + ], + (Ecu.transmission, 0x7a3, None): [ + b'\x04\xfe\xf3\x00\x00', + ], + }, + CAR.SUBARU_LEGACY: { + (Ecu.abs, 0x7b0, None): [ + b'\xa1 \x02\x01', + b'\xa1 \x02\x02', + b'\xa1 \x03\x02', + b'\xa1 \x03\x03', + b'\xa1 \x04\x01', + b'\xa1 \x04\x02', + ], + (Ecu.eps, 0x746, None): [ + b'\x9b\xc0\x11\x00', + b'\x9b\xc0\x11\x02', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00e\x80\x00\x1f@ \x19\x00', + b'\x00\x00e\x9a\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xde"a0\x07', + b'\xde,\xa0@\x07', + b'\xe2"a0\x07', + b'\xe2"ap\x07', + b'\xe2"aq\x07', + b'\xe2,\xa0@\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xa5\xf6\x05@\x00', + b'\xa5\xfe\xc7@\x00', + b'\xa7\xf6\x04@\x00', + b'\xa7\xfe\xc4@\x00', + ], + }, + CAR.SUBARU_IMPREZA: { + (Ecu.abs, 0x7b0, None): [ + b'z\x84\x19\x90\x00', + b'z\x94\x08\x90\x00', + b'z\x94\x08\x90\x01', + b'z\x94\x0c\x90\x00', + b'z\x94\x0c\x90\x01', + b'z\x94.\x90\x00', + b'z\x94?\x90\x00', + b'z\x9c\x19\x80\x01', + b'\xa2 \x185\x00', + b'\xa2 \x193\x00', + b'\xa2 \x194\x00', + b'\xa2 \x19`\x00', + b'\xa2 5\x00', + ], + (Ecu.eps, 0x746, None): [ + b'z\xc0\x00\x00', + b'z\xc0\x04\x00', + b'z\xc0\x08\x00', + b'z\xc0\n\x00', + b'z\xc0\x0c\x00', + b'\x8a\xc0\x00\x00', + b'\x8a\xc0\x10\x00', + b'\x9a\xc0\x08\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00c\xf4\x00\x00\x00\x00', + b'\x00\x00c\xf4\x1f@ \x07', + b'\x00\x00d)\x00\x00\x00\x00', + b'\x00\x00d)\x1f@ \x07', + b'\x00\x00dd\x00\x00\x00\x00', + b'\x00\x00dd\x1f@ \x0e', + b'\x00\x00d\xb5\x1f@ \x0e', + b'\x00\x00d\xdc\x00\x00\x00\x00', + b'\x00\x00d\xdc\x1f@ \x0e', + b'\x00\x00e\x02\x1f@ \x14', + b'\x00\x00e\x1c\x00\x00\x00\x00', + b'\x00\x00e\x1c\x1f@ \x14', + b'\x00\x00e+\x00\x00\x00\x00', + b'\x00\x00e+\x1f@ \x14', + b'\x00\x00eq\x1f@ "', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xaa\x00Bu\x07', + b'\xaa\x01bt\x07', + b'\xaa\x01fr\x07', + b'\xaa!`u\x07', + b'\xaa!au\x07', + b'\xaa!av\x07', + b'\xaa!aw\x07', + b'\xaa!dq\x07', + b'\xaa!ds\x07', + b'\xaa!dt\x07', + b'\xaaafs\x07', + b'\xbe!as\x07', + b'\xbe!at\x07', + b'\xbeacr\x07', + b'\xc5!`r\x07', + b'\xc5!`s\x07', + b'\xc5!ap\x07', + b'\xc5!ar\x07', + b'\xc5!as\x07', + b'\xc5!au\x07', + b'\xc5!dr\x07', + b'\xc5!ds\x07', + b'\xca\x01b0\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xe3\xd0\x081\x00', + b'\xe3\xd5\x161\x00', + b'\xe3\xd5F1\x00', + b'\xe3\xe5F1\x00', + b'\xe3\xf5\x06\x00\x00', + b'\xe3\xf5\x07\x00\x00', + b'\xe3\xf5C\x00\x00', + b'\xe3\xf5F\x00\x00', + b'\xe3\xf5G\x00\x00', + b'\xe4\xe5\x021\x00', + b'\xe4\xe5\x061\x00', + b'\xe4\xf5\x02\x00\x00', + b'\xe4\xf5\x07\x00\x00', + b'\xe5\xf5\x04\x00\x00', + b'\xe5\xf5$\x00\x00', + b'\xe5\xf5B\x00\x00', + b'\xe6\xd5\x041\x00', + ], + }, + CAR.SUBARU_IMPREZA_2020: { + (Ecu.abs, 0x7b0, None): [ + b'\xa2 \x193\x00', + b'\xa2 \x194\x00', + b'\xa2 `\x00', + b'\xa2 !3\x00', + b'\xa2 !6\x00', + b'\xa2 !`\x00', + b'\xa2 !i\x00', + ], + (Ecu.eps, 0x746, None): [ + b'\n\xc0\x04\x00', + b'\n\xc0\x04\x01', + b'\x9a\xc0\x00\x00', + b'\x9a\xc0\x04\x00', + b'\x9a\xc0\n\x01', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00eb\x1f@ "', + b'\x00\x00eq\x00\x00\x00\x00', + b'\x00\x00eq\x1f@ "', + b'\x00\x00e\x8f\x00\x00\x00\x00', + b'\x00\x00e\x8f\x1f@ )', + b'\x00\x00e\x92\x00\x00\x00\x00', + b'\x00\x00e\xa4\x00\x00\x00\x00', + b'\x00\x00e\xa4\x1f@ (', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xca!`0\x07', + b'\xca!`p\x07', + b'\xca!`t\x07', + b'\xca!a0\x07', + b'\xca!ap\x07', + b'\xca!f@\x07', + b'\xca!fp\x07', + b'\xcaacp\x07', + b'\xcc!`p\x07', + b'\xcc!fp\x07', + b'\xcc"f0\x07', + b'\xe6!`@\x07', + b'\xe6!fp\x07', + b'\xe6"f0\x07', + b'\xe6"fp\x07', + b'\xf3"f@\x07', + b'\xf3"fp\x07', + b'\xf3"fr\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xe6\x15\x042\x00', + b'\xe6\xf5\x04\x00\x00', + b'\xe6\xf5$\x00\x00', + b'\xe6\xf5D0\x00', + b'\xe7\xf5\x04\x00\x00', + b'\xe7\xf5D0\x00', + b'\xe7\xf6B0\x00', + b'\xe9\xf5"\x00\x00', + b'\xe9\xf5B0\x00', + b'\xe9\xf6B0\x00', + b'\xe9\xf6F0\x00', + ], + }, + CAR.SUBARU_CROSSTREK_HYBRID: { + (Ecu.abs, 0x7b0, None): [ + b'\xa2 \x19e\x01', + b'\xa2 !e\x01', + ], + (Ecu.eps, 0x746, None): [ + b'\n\xc2\x01\x00', + b'\x9a\xc2\x01\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00el\x1f@ #', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xd7!`@\x07', + b'\xd7!`p\x07', + b'\xf4!`0\x07', + ], + }, + CAR.SUBARU_FORESTER: { + (Ecu.abs, 0x7b0, None): [ + b'\xa3 \x18\x14\x00', + b'\xa3 \x18&\x00', + b'\xa3 \x19\x14\x00', + b'\xa3 \x19&\x00', + b'\xa3 \x19h\x00', + b'\xa3 \x14\x00', + b'\xa3 \x14\x01', + ], + (Ecu.eps, 0x746, None): [ + b'\x8d\xc0\x00\x00', + b'\x8d\xc0\x04\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00e!\x00\x00\x00\x00', + b'\x00\x00e!\x1f@ \x11', + b'\x00\x00e^\x00\x00\x00\x00', + b'\x00\x00e^\x1f@ !', + b'\x00\x00e`\x00\x00\x00\x00', + b'\x00\x00e`\x1f@ ', + b'\x00\x00e\x97\x00\x00\x00\x00', + b'\x00\x00e\x97\x1f@ 0', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xb6"`A\x07', + b'\xb6\xa2`A\x07', + b'\xcb"`@\x07', + b'\xcb"`p\x07', + b'\xcf"`0\x07', + b'\xcf"`p\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\x1a\xe6B1\x00', + b'\x1a\xe6F1\x00', + b'\x1a\xf6B0\x00', + b'\x1a\xf6B`\x00', + b'\x1a\xf6F`\x00', + b'\x1a\xf6b0\x00', + b'\x1a\xf6b`\x00', + b'\x1a\xf6f`\x00', + ], + }, + CAR.SUBARU_FORESTER_HYBRID: { + (Ecu.abs, 0x7b0, None): [ + b'\xa3 \x19T\x00', + ], + (Ecu.eps, 0x746, None): [ + b'\x8d\xc2\x00\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00eY\x1f@ !', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xd2\xa1`r\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\x1b\xa7@a\x00', + ], + }, + CAR.SUBARU_FORESTER_PREGLOBAL: { + (Ecu.abs, 0x7b0, None): [ + b'm\x97\x14@', + b'}\x97\x14@', + ], + (Ecu.eps, 0x746, None): [ + b'm\xc0\x10\x00', + b'}\xc0\x10\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00c\xe9\x00\x00\x00\x00', + b'\x00\x00c\xe9\x1f@ \x03', + b'\x00\x00d5\x1f@ \t', + b'\x00\x00d\xd3\x1f@ \t', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xa7"@0\x07', + b'\xa7"@p\x07', + b'\xa7)\xa0q\x07', + b'\xba"@@\x07', + b'\xba"@p\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\x1a\xf6F`\x00', + b'\xda\xf2`p\x00', + b'\xda\xf2`\x80\x00', + b'\xda\xfd\xe0\x80\x00', + b'\xdc\xf2@`\x00', + b'\xdc\xf2``\x00', + b'\xdc\xf2`\x80\x00', + b'\xdc\xf2`\x81\x00', + ], + }, + CAR.SUBARU_LEGACY_PREGLOBAL: { + (Ecu.abs, 0x7b0, None): [ + b'[\x97D\x00', + b'[\xba\xc4\x03', + b'k\x97D\x00', + b'k\x9aD\x00', + b'{\x97D\x00', + ], + (Ecu.eps, 0x746, None): [ + b'K\xb0\x00\x01', + b'[\xb0\x00\x01', + b'k\xb0\x00\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00c\x94\x1f@\x10\x08', + b'\x00\x00c\xb7\x1f@\x10\x16', + b'\x00\x00c\xec\x1f@ \x04', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xa0"@q\x07', + b'\xa0+@p\x07', + b'\xab*@r\x07', + b'\xab+@p\x07', + b'\xb4"@0\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xbd\xf2\x00`\x00', + b'\xbe\xf2\x00p\x00', + b'\xbe\xfb\xc0p\x00', + b'\xbf\xf2\x00\x80\x00', + b'\xbf\xfb\xc0\x80\x00', + ], + }, + CAR.SUBARU_OUTBACK_PREGLOBAL: { + (Ecu.abs, 0x7b0, None): [ + b'[\xba\xac\x03', + b'[\xf7\xac\x00', + b'[\xf7\xac\x03', + b'[\xf7\xbc\x03', + b'k\x97\xac\x00', + b'k\x9a\xac\x00', + b'{\x97\xac\x00', + b'{\x9a\xac\x00', + ], + (Ecu.eps, 0x746, None): [ + b'K\xb0\x00\x00', + b'K\xb0\x00\x02', + b'[\xb0\x00\x00', + b'k\xb0\x00\x00', + b'{\xb0\x00\x01', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00c\x90\x1f@\x10\x0e', + b'\x00\x00c\x94\x00\x00\x00\x00', + b'\x00\x00c\x94\x1f@\x10\x08', + b'\x00\x00c\xb7\x1f@\x10\x16', + b'\x00\x00c\xd1\x1f@\x10\x17', + b'\x00\x00c\xec\x1f@ \x04', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xa0"@\x80\x07', + b'\xa0*@q\x07', + b'\xa0*@u\x07', + b'\xa0+@@\x07', + b'\xa0bAq\x07', + b'\xab"@@\x07', + b'\xab"@s\x07', + b'\xab*@@\x07', + b'\xab+@@\x07', + b'\xb4"@0\x07', + b'\xb4"@p\x07', + b'\xb4"@r\x07', + b'\xb4+@p\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xbd\xf2@`\x00', + b'\xbd\xf2@\x81\x00', + b'\xbd\xfb\xe0\x80\x00', + b'\xbe\xf2@p\x00', + b'\xbe\xf2@\x80\x00', + b'\xbe\xfb\xe0p\x00', + b'\xbf\xe2@\x80\x00', + b'\xbf\xf2@\x80\x00', + b'\xbf\xfb\xe0b\x00', + ], + }, + CAR.SUBARU_OUTBACK_PREGLOBAL_2018: { + (Ecu.abs, 0x7b0, None): [ + b'\x8b\x97\xac\x00', + b'\x8b\x97\xbc\x00', + b'\x8b\x99\xac\x00', + b'\x8b\x9a\xac\x00', + b'\x9b\x97\xac\x00', + b'\x9b\x97\xbe\x10', + b'\x9b\x9a\xac\x00', + ], + (Ecu.eps, 0x746, None): [ + b'{\xb0\x00\x00', + b'{\xb0\x00\x01', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00df\x1f@ \n', + b'\x00\x00d\x95\x00\x00\x00\x00', + b'\x00\x00d\x95\x1f@ \x0f', + b'\x00\x00d\xfe\x00\x00\x00\x00', + b'\x00\x00d\xfe\x1f@ \x15', + b'\x00\x00e\x19\x1f@ \x15', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xb5"@P\x07', + b'\xb5"@p\x07', + b'\xb5+@@\x07', + b'\xb5b@1\x07', + b'\xb5q\xe0@\x07', + b'\xc4"@0\x07', + b'\xc4+@0\x07', + b'\xc4b@p\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xbb\xf2@`\x00', + b'\xbb\xfb\xe0`\x00', + b'\xbc\xaf\xe0`\x00', + b'\xbc\xe2@\x80\x00', + b'\xbc\xf2@\x80\x00', + b'\xbc\xf2@\x81\x00', + b'\xbc\xfb\xe0`\x00', + b'\xbc\xfb\xe0\x80\x00', + ], + }, + CAR.SUBARU_OUTBACK: { + (Ecu.abs, 0x7b0, None): [ + b'\xa1 \x06\x00', + b'\xa1 \x06\x01', + b'\xa1 \x06\x02', + b'\xa1 \x06\x03', + b'\xa1 \x07\x00', + b'\xa1 \x07\x01', + b'\xa1 \x07\x02', + b'\xa1 \x07\x03', + b'\xa1 \x08\x00', + b'\xa1 \x08\x01', + b'\xa1 \x08\x02', + b'\xa1 "\t\x00', + b'\xa1 "\t\x01', + ], + (Ecu.eps, 0x746, None): [ + b'\x1b\xc0\x10\x00', + b'\x9b\xc0\x10\x00', + b'\x9b\xc0\x10\x02', + b'\x9b\xc0 \x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x00\x00eJ\x00\x00\x00\x00\x00\x00', + b'\x00\x00eJ\x00\x1f@ \x19\x00', + b'\x00\x00e\x80\x00\x1f@ \x19\x00', + b'\x00\x00e\x9a\x00\x00\x00\x00\x00\x00', + b'\x00\x00e\x9a\x00\x1f@ 1\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xbc"`@\x07', + b'\xbc"`q\x07', + b'\xbc,\xa0q\x07', + b'\xbc,\xa0u\x07', + b'\xde"`0\x07', + b'\xde,\xa0@\x07', + b'\xe2"`0\x07', + b'\xe2"`p\x07', + b'\xe2"`q\x07', + b'\xe2"`t\x07', + b'\xe2,\xa0p\x07', + b'\xe3,\xa0@\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xa5\xf6D@\x00', + b'\xa5\xfe\xf6@\x00', + b'\xa5\xfe\xf7@\x00', + b'\xa5\xfe\xf8@\x00', + b'\xa7\x8e\xf40\x00', + b'\xa7\xf6D@\x00', + b'\xa7\xfe\xf4@\x00', + b'\xa7\xfe\xf6@\x00', + ], + }, + CAR.SUBARU_FORESTER_2022: { + (Ecu.abs, 0x7b0, None): [ + b'\xa3 !v\x00', + b'\xa3 !x\x00', + b'\xa3 "v\x00', + b'\xa3 "x\x00', + ], + (Ecu.eps, 0x746, None): [ + b'-\xc0\x040', + b'-\xc0%0', + b'=\xc0%\x02', + b'=\xc04\x02', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\x04!\x01\x1eD\x07!\x00\x04,', + b'\x04!\x08\x01.\x07!\x08\x022', + b'\r!\x08\x017\x00\x00\x00\x00\x00', + b'\r!\x08\x017\n!\x08\x003', + ], + (Ecu.engine, 0x7e0, None): [ + b'\xd5"`0\x07', + b'\xd5"a0\x07', + b'\xf1"`q\x07', + b'\xf1"aq\x07', + b'\xfa"`p\x07', + b'\xfa"ap\x07', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\x1d\x86B0\x00', + b'\x1d\xf6B0\x00', + b'\x1e\x86B0\x00', + b'\x1e\x86F0\x00', + b'\x1e\xf6D0\x00', + b'\x1f\xf6B1\x00', + ], + }, + CAR.SUBARU_OUTBACK_2023: { + (Ecu.abs, 0x7b0, None): [ + b'\xa1 #\x14\x00', + b'\xa1 #\x17\x00', + ], + (Ecu.eps, 0x746, None): [ + b'+\xc0\x10\x11\x00', + b'+\xc0\x12\x11\x00', + ], + (Ecu.fwdCamera, 0x787, None): [ + b'\t!\x08\x046\x05!\x08\x01/', + ], + (Ecu.engine, 0x7a2, None): [ + b'\xed,\xa0q\x07', + b'\xed,\xa2q\x07', + ], + (Ecu.transmission, 0x7a3, None): [ + b'\xa8\x8e\xf41\x00', + b'\xa8\xfe\xf41\x00', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/subaru/interface.py b/artifacts/package_runtime/iqdbc/car/subaru/interface.py new file mode 100644 index 000000000..9cf2f83d4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/subaru/interface.py @@ -0,0 +1,122 @@ +from iqdbc.car import get_safety_config, structs, uds +from iqdbc.car.disable_ecu import disable_ecu +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.subaru.carcontroller import CarController +from iqdbc.car.subaru.carstate import CarState +from iqdbc.car.subaru.values import CAR, GLOBAL_ES_ADDR, SubaruFlags, SubaruSafetyFlags + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + + @staticmethod + def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "subaru" + ret.radarUnavailable = True + # for HYBRID CARS to be upstreamed, we need: + # - replacement for ES_Distance so we can cancel the cruise control + # - to find the Cruise_Activated bit from the car + # - proper panda safety setup (use the correct cruise_activated bit, throttle from Throttle_Hybrid, etc) + ret.dashcamOnly = bool(ret.flags & (SubaruFlags.PREGLOBAL | SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID)) + ret.autoResumeSng = False + + # Detect infotainment message sent from the camera + if not (ret.flags & SubaruFlags.PREGLOBAL) and 0x323 in fingerprint[2]: + ret.flags |= SubaruFlags.SEND_INFOTAINMENT.value + + if ret.flags & SubaruFlags.PREGLOBAL: + ret.enableBsm = 0x25c in fingerprint[0] + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.subaruPreglobal)] + else: + ret.enableBsm = 0x228 in fingerprint[0] + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.subaru)] + if ret.flags & SubaruFlags.GLOBAL_GEN2: + ret.safetyConfigs[0].safetyParam |= SubaruSafetyFlags.GEN2.value + + ret.steerLimitTimer = 0.4 + ret.steerActuatorDelay = 0.1 + + if not (ret.flags & SubaruFlags.LKAS_ANGLE): + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + if ret.flags & SubaruFlags.LKAS_ANGLE: + ret.steerControlType = structs.CarParams.SteerControlType.angle + + elif candidate == CAR.SUBARU_ASCENT: + ret.steerActuatorDelay = 0.3 # end-to-end angle controller + ret.lateralTuning.init('pid') + ret.lateralTuning.pid.kf = 0.00003 + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 20.], [0., 20.]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.0025, 0.1], [0.00025, 0.01]] + + elif candidate == CAR.SUBARU_IMPREZA: + ret.steerActuatorDelay = 0.4 # end-to-end angle controller + ret.lateralTuning.init('pid') + ret.lateralTuning.pid.kf = 0.00005 + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 20.], [0., 20.]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2, 0.3], [0.02, 0.03]] + + elif candidate == CAR.SUBARU_IMPREZA_2020: + ret.lateralTuning.init('pid') + ret.lateralTuning.pid.kf = 0.00005 + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 14., 23.], [0., 14., 23.]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.045, 0.042, 0.20], [0.04, 0.035, 0.045]] + + elif candidate == CAR.SUBARU_CROSSTREK_HYBRID: + ret.steerActuatorDelay = 0.1 + + elif candidate in (CAR.SUBARU_FORESTER, CAR.SUBARU_FORESTER_HYBRID): + ret.lateralTuning.init('pid') + ret.lateralTuning.pid.kf = 0.000038 + ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 14., 23.], [0., 14., 23.]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.01, 0.065, 0.2], [0.001, 0.015, 0.025]] + + elif candidate in (CAR.SUBARU_OUTBACK, CAR.SUBARU_LEGACY): + ret.steerActuatorDelay = 0.1 + + elif candidate in (CAR.SUBARU_FORESTER_PREGLOBAL, CAR.SUBARU_OUTBACK_PREGLOBAL_2018): + # Outback 2018-2019 and Forester have reversed driver torque signal + ret.safetyConfigs[0].safetyParam = SubaruSafetyFlags.PREGLOBAL_REVERSED_DRIVER_TORQUE.value + + elif candidate == CAR.SUBARU_LEGACY_PREGLOBAL: + ret.steerActuatorDelay = 0.15 + + elif candidate == CAR.SUBARU_OUTBACK_PREGLOBAL: + pass + else: + raise ValueError(f"unknown car: {candidate}") + + ret.alphaLongitudinalAvailable = not (ret.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.PREGLOBAL | + SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID)) + ret.openpilotLongitudinalControl = alpha_long and ret.alphaLongitudinalAvailable + + if ret.flags & SubaruFlags.GLOBAL_GEN2 and ret.openpilotLongitudinalControl: + ret.flags |= SubaruFlags.DISABLE_EYESIGHT.value + + if ret.openpilotLongitudinalControl: + ret.safetyConfigs[0].safetyParam |= SubaruSafetyFlags.LONG.value + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + stock_cp.dashcamOnly = bool(stock_cp.flags & (SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID)) + + if not stock_cp.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID): + stock_cp.autoResumeSng = True + + return ret + + @staticmethod + def init(CP, CP_IQ, can_recv, can_send, communication_control=None): + if CP.flags & SubaruFlags.DISABLE_EYESIGHT: + if communication_control is None: + communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.DISABLE_RX_DISABLE_TX, uds.MESSAGE_TYPE.NORMAL]) + disable_ecu(can_recv, can_send, bus=2, addr=GLOBAL_ES_ADDR, com_cont_req=communication_control) + + @staticmethod + def deinit(CP, can_recv, can_send): + communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.ENABLE_RX_ENABLE_TX, uds.MESSAGE_TYPE.NORMAL]) + CarInterface.init(CP, can_recv, can_send, communication_control) diff --git a/artifacts/package_runtime/iqdbc/car/subaru/subarucan.py b/artifacts/package_runtime/iqdbc/car/subaru/subarucan.py new file mode 100644 index 000000000..932dff0a0 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/subaru/subarucan.py @@ -0,0 +1,337 @@ +from iqdbc.car import structs +from iqdbc.car.subaru.values import CanBus + +VisualAlert = structs.CarControl.HUDControl.VisualAlert + + +def create_steering_control(packer, apply_torque, steer_req): + values = { + "LKAS_Output": apply_torque, + "LKAS_Request": steer_req, + "SET_1": 1 + } + return packer.make_can_msg("ES_LKAS", 0, values) + + +def create_steering_control_angle(packer, apply_torque, steer_req): + values = { + "LKAS_Output": apply_torque, + "LKAS_Request": steer_req, + "SET_3": 3 + } + return packer.make_can_msg("ES_LKAS_ANGLE", 0, values) + + +def create_steering_status(packer): + return packer.make_can_msg("ES_LKAS_State", 0, {}) + + +def create_es_distance(packer, frame, es_distance_msg, bus, pcm_cancel_cmd, long_enabled = False, brake_cmd = False, cruise_throttle = 0): + values = {s: es_distance_msg[s] for s in [ + "CHECKSUM", + "Signal1", + "Cruise_Fault", + "Cruise_Throttle", + "Signal2", + "Car_Follow", + "Low_Speed_Follow", + "Cruise_Soft_Disable", + "Signal7", + "Cruise_Brake_Active", + "Distance_Swap", + "Cruise_EPB", + "Signal4", + "Close_Distance", + "Signal5", + "Cruise_Cancel", + "Cruise_Set", + "Cruise_Resume", + "Signal6", + ]} + + values["COUNTER"] = frame % 0x10 + + if long_enabled: + values["Cruise_Throttle"] = cruise_throttle + + # Do not disable openpilot on Eyesight Soft Disable, if openpilot is controlling long + values["Cruise_Soft_Disable"] = 0 + values["Cruise_Fault"] = 0 + + values["Cruise_Brake_Active"] = brake_cmd + + if pcm_cancel_cmd: + values["Cruise_Cancel"] = 1 + values["Cruise_Throttle"] = 1818 # inactive throttle + + return packer.make_can_msg("ES_Distance", bus, values) + + +def create_es_lkas_state(packer, frame, es_lkas_state_msg, enabled, visual_alert, left_line, right_line, left_lane_depart, right_lane_depart): + values = {s: es_lkas_state_msg[s] for s in [ + "CHECKSUM", + "LKAS_Alert_Msg", + "Signal1", + "LKAS_ACTIVE", + "LKAS_Dash_State", + "Signal2", + "Backward_Speed_Limit_Menu", + "LKAS_Left_Line_Enable", + "LKAS_Left_Line_Light_Blink", + "LKAS_Right_Line_Enable", + "LKAS_Right_Line_Light_Blink", + "LKAS_Left_Line_Visible", + "LKAS_Right_Line_Visible", + "LKAS_Alert", + "Signal3", + ]} + + values["COUNTER"] = frame % 0x10 + + # Filter the stock LKAS "Keep hands on wheel" alert + if values["LKAS_Alert_Msg"] == 1: + values["LKAS_Alert_Msg"] = 0 + + # Filter the stock LKAS sending an audible alert when it turns off LKAS + if values["LKAS_Alert"] == 27: + values["LKAS_Alert"] = 0 + + # Filter the stock LKAS sending an audible alert when "Keep hands on wheel" alert is active (2020+ models) + if values["LKAS_Alert"] == 28 and values["LKAS_Alert_Msg"] == 7: + values["LKAS_Alert"] = 0 + + # Filter the stock LKAS sending an audible alert when "Keep hands on wheel OFF" alert is active (2020+ models) + if values["LKAS_Alert"] == 30: + values["LKAS_Alert"] = 0 + + # Filter the stock LKAS sending "Keep hands on wheel OFF" alert (2020+ models) + if values["LKAS_Alert_Msg"] == 7: + values["LKAS_Alert_Msg"] = 0 + + # Show Keep hands on wheel alert for openpilot steerRequired alert + if visual_alert == VisualAlert.steerRequired: + values["LKAS_Alert_Msg"] = 1 + + # Ensure we don't overwrite potentially more important alerts from stock (e.g. FCW) + if visual_alert == VisualAlert.ldw and values["LKAS_Alert"] == 0: + if left_lane_depart: + values["LKAS_Alert"] = 12 # Left lane departure dash alert + elif right_lane_depart: + values["LKAS_Alert"] = 11 # Right lane departure dash alert + + if enabled: + values["LKAS_ACTIVE"] = 1 # Show LKAS lane lines + values["LKAS_Dash_State"] = 2 # Green enabled indicator + else: + values["LKAS_Dash_State"] = 0 # LKAS Not enabled + + values["LKAS_Left_Line_Visible"] = int(left_line) + values["LKAS_Right_Line_Visible"] = int(right_line) + + return packer.make_can_msg("ES_LKAS_State", CanBus.main, values) + + +def create_es_dashstatus(packer, frame, dashstatus_msg, enabled, long_enabled, long_active, lead_visible): + values = {s: dashstatus_msg[s] for s in [ + "CHECKSUM", + "PCB_Off", + "LDW_Off", + "Signal1", + "Cruise_State_Msg", + "LKAS_State_Msg", + "Signal2", + "Cruise_Soft_Disable", + "Cruise_Status_Msg", + "Signal3", + "Cruise_Distance", + "Signal4", + "Conventional_Cruise", + "Signal5", + "Cruise_Disengaged_Dash", + "Cruise_Activated_Dash", + "Signal6", + "Cruise_Set_Speed", + "Cruise_Fault", + "Cruise_On", + "Display_Own_Car", + "Brake_Lights", + "Car_Follow", + "Signal7", + "Far_Distance", + "Cruise_State", + ]} + + values["COUNTER"] = frame % 0x10 + + if long_enabled: + values["Cruise_State"] = 0 + # TODO: Cruise_Activated_dash should respect gas pressed and standstill stock behavior + values["Cruise_Activated_Dash"] = enabled + values["Cruise_Disengaged_Dash"] = 0 + values["Car_Follow"] = int(lead_visible) + + values["PCB_Off"] = 1 # AEB is not presevered, so show the PCB_Off on dash + values["LDW_Off"] = 0 + values["Cruise_Fault"] = 0 + + # Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts + if values["LKAS_State_Msg"] in (2, 3): + values["LKAS_State_Msg"] = 0 + + return packer.make_can_msg("ES_DashStatus", CanBus.main, values) + + +def create_es_brake(packer, frame, es_brake_msg, long_enabled, long_active, brake_value): + values = {s: es_brake_msg[s] for s in [ + "CHECKSUM", + "Signal1", + "Brake_Pressure", + "AEB_Status", + "Cruise_Brake_Lights", + "Cruise_Brake_Fault", + "Cruise_Brake_Active", + "Cruise_Activated", + "Signal3", + ]} + + values["COUNTER"] = frame % 0x10 + + if long_enabled: + values["Cruise_Brake_Fault"] = 0 + values["Cruise_Activated"] = long_active + + values["Brake_Pressure"] = brake_value + + values["Cruise_Brake_Active"] = brake_value > 0 + values["Cruise_Brake_Lights"] = brake_value >= 70 + + return packer.make_can_msg("ES_Brake", CanBus.main, values) + + +def create_es_status(packer, frame, es_status_msg, long_enabled, long_active, cruise_rpm): + values = {s: es_status_msg[s] for s in [ + "CHECKSUM", + "Signal1", + "Cruise_Fault", + "Cruise_RPM", + "Cruise_Activated", + "Brake_Lights", + "Cruise_Hold", + "Signal3", + ]} + + values["COUNTER"] = frame % 0x10 + + if long_enabled: + values["Cruise_RPM"] = cruise_rpm + values["Cruise_Fault"] = 0 + + values["Cruise_Activated"] = long_active + + return packer.make_can_msg("ES_Status", CanBus.main, values) + + +def create_es_infotainment(packer, frame, es_infotainment_msg, visual_alert): + # Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts + values = {s: es_infotainment_msg[s] for s in [ + "CHECKSUM", + "LKAS_State_Infotainment", + "LKAS_Blue_Lines", + "Signal1", + "Signal2", + ]} + + values["COUNTER"] = frame % 0x10 + + if values["LKAS_State_Infotainment"] in (3, 4): + values["LKAS_State_Infotainment"] = 0 + + # Show Keep hands on wheel alert for openpilot steerRequired alert + if visual_alert == VisualAlert.steerRequired: + values["LKAS_State_Infotainment"] = 3 + + # Show Obstacle Detected for fcw + if visual_alert == VisualAlert.fcw: + values["LKAS_State_Infotainment"] = 2 + + return packer.make_can_msg("ES_Infotainment", CanBus.main, values) + + +def create_es_highbeamassist(packer): + values = { + "HBA_Available": False, + } + + return packer.make_can_msg("ES_HighBeamAssist", CanBus.main, values) + + +def create_es_static_1(packer): + values = { + "SET_3": 3, + } + + return packer.make_can_msg("ES_STATIC_1", CanBus.main, values) + + +def create_es_static_2(packer): + values = { + "SET_3": 3, + } + + return packer.make_can_msg("ES_STATIC_2", CanBus.main, values) + + +# *** Subaru Pre-global *** + +def subaru_preglobal_checksum(packer, values, addr, checksum_byte=7): + dat = packer.make_can_msg(addr, 0, values)[1] + return (sum(dat[:checksum_byte]) + sum(dat[checksum_byte+1:])) % 256 + + +def create_preglobal_steering_control(packer, frame, apply_torque, steer_req): + values = { + "COUNTER": frame % 0x08, + "LKAS_Command": apply_torque, + "LKAS_Active": steer_req, + } + values["Checksum"] = subaru_preglobal_checksum(packer, values, "ES_LKAS") + + return packer.make_can_msg("ES_LKAS", CanBus.main, values) + + +def create_preglobal_es_distance(packer, cruise_button, es_distance_msg): + values = {s: es_distance_msg[s] for s in [ + "Cruise_Throttle", + "Signal1", + "Car_Follow", + "Signal2", + "Cruise_Brake_Active", + "Distance_Swap", + "Standstill", + "Signal3", + "Close_Distance", + "Signal4", + "Standstill_2", + "Cruise_Fault", + "Signal5", + "COUNTER", + "Signal6", + "Cruise_Button", + "Signal7", + ]} + + values["Cruise_Button"] = cruise_button + values["Checksum"] = subaru_preglobal_checksum(packer, values, "ES_Distance") + + return packer.make_can_msg("ES_Distance", CanBus.main, values) + + +def subaru_checksum(address: int, sig, d: bytearray) -> int: + s = 0 + addr = address + while addr: + s += addr & 0xFF + addr >>= 8 + for i in range(1, len(d)): + s += d[i] + return s & 0xFF diff --git a/artifacts/package_runtime/iqdbc/car/subaru/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/subaru/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/subaru/tests/test_subaru.py b/artifacts/package_runtime/iqdbc/car/subaru/tests/test_subaru.py new file mode 100644 index 000000000..142705b39 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/subaru/tests/test_subaru.py @@ -0,0 +1,10 @@ +from iqdbc.car.subaru.fingerprints import FW_VERSIONS + + +class TestSubaruFingerprint: + def test_fw_version_format(self): + for platform, fws_per_ecu in FW_VERSIONS.items(): + for (ecu, _, _), fws in fws_per_ecu.items(): + fw_size = len(fws[0]) + for fw in fws: + assert len(fw) == fw_size, f"{platform} {ecu}: {len(fw)} {fw_size}" diff --git a/artifacts/package_runtime/iqdbc/car/subaru/values.py b/artifacts/package_runtime/iqdbc/car/subaru/values.py new file mode 100644 index 000000000..88ef05660 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/subaru/values.py @@ -0,0 +1,279 @@ +from dataclasses import dataclass, field +from enum import Enum, IntFlag + +from iqdbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 + +Ecu = CarParams.Ecu + + +class CarControllerParams: + def __init__(self, CP): + self.STEER_STEP = 2 # how often we update the steer cmd + self.STEER_DELTA_UP = 50 # torque increase per refresh, 0.8s to max + self.STEER_DELTA_DOWN = 70 # torque decrease per refresh + self.STEER_DRIVER_ALLOWANCE = 60 # allowed driver torque before start limiting + self.STEER_DRIVER_MULTIPLIER = 50 # weight driver torque heavily + self.STEER_DRIVER_FACTOR = 1 # from dbc + + if CP.flags & SubaruFlags.GLOBAL_GEN2: + self.STEER_MAX = 1500 + self.STEER_DELTA_UP = 35 + self.STEER_DELTA_DOWN = 50 + elif CP.carFingerprint == CAR.SUBARU_IMPREZA_2020: + self.STEER_DELTA_UP = 35 + self.STEER_MAX = 1439 + else: + self.STEER_MAX = 2047 + + THROTTLE_MIN = 808 + THROTTLE_MAX = 3400 + + THROTTLE_INACTIVE = 1818 # corresponds to zero acceleration + THROTTLE_ENGINE_BRAKE = 808 # while braking, eyesight sets throttle to this, probably for engine braking + + BRAKE_MIN = 0 + BRAKE_MAX = 600 # about -3.5m/s2 from testing + + RPM_MIN = 0 + RPM_MAX = 3600 + + RPM_INACTIVE = 600 # a good base rpm for zero acceleration + + THROTTLE_LOOKUP_BP = [0, 2] + THROTTLE_LOOKUP_V = [THROTTLE_INACTIVE, THROTTLE_MAX] + + RPM_LOOKUP_BP = [0, 2] + RPM_LOOKUP_V = [RPM_INACTIVE, RPM_MAX] + + BRAKE_LOOKUP_BP = [-3.5, 0] + BRAKE_LOOKUP_V = [BRAKE_MAX, BRAKE_MIN] + + +class SubaruSafetyFlags(IntFlag): + GEN2 = 1 + LONG = 2 + PREGLOBAL_REVERSED_DRIVER_TORQUE = 4 + + +class SubaruFlags(IntFlag): + # Detected flags + SEND_INFOTAINMENT = 1 + DISABLE_EYESIGHT = 2 + + # Static flags + GLOBAL_GEN2 = 4 + + # Cars that temporarily fault when steering angle rate is greater than some threshold. + # Appears to be all torque-based cars produced around 2019 - present + STEER_RATE_LIMITED = 8 + PREGLOBAL = 16 + HYBRID = 32 + LKAS_ANGLE = 64 + + +GLOBAL_ES_ADDR = 0x787 +GEN2_ES_BUTTONS_DID = b'\x11\x30' + + +class CanBus: + main = 0 + alt = 1 + camera = 2 + + +class Footnote(Enum): + GLOBAL = CarFootnote( + "In the non-US market, openpilot requires the car to come equipped with EyeSight with Lane Keep Assistance.", + Column.PACKAGE) + EXP_LONG = CarFootnote( + "Enabling longitudinal control (alpha) will disable all EyeSight functionality, including AEB, LDW, and RAB.", + Column.LONGITUDINAL) + + +@dataclass +class SubaruCarDocs(CarDocs): + package: str = "EyeSight Driver Assistance" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.subaru_a])) + footnotes: list[Enum] = field(default_factory=lambda: [Footnote.GLOBAL]) + + def init_make(self, CP: CarParams): + if CP.alphaLongitudinalAvailable: + self.footnotes.append(Footnote.EXP_LONG) + + +@dataclass +class SubaruPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'subaru_global_2017_generated'}) + + def init(self): + if self.flags & SubaruFlags.HYBRID: + self.dbc_dict = {Bus.pt: 'subaru_global_2020_hybrid_generated'} + + +@dataclass +class SubaruGen2PlatformConfig(SubaruPlatformConfig): + def init(self): + super().init() + self.flags |= SubaruFlags.GLOBAL_GEN2 + if not (self.flags & SubaruFlags.LKAS_ANGLE): + self.flags |= SubaruFlags.STEER_RATE_LIMITED + + +class CAR(Platforms): + # Global platform + SUBARU_ASCENT = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Ascent 2019-21", "All")], + CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), + ) + SUBARU_OUTBACK = SubaruGen2PlatformConfig( + [SubaruCarDocs("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], + CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), + ) + SUBARU_LEGACY = SubaruGen2PlatformConfig( + [SubaruCarDocs("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b]))], + SUBARU_OUTBACK.specs, + ) + SUBARU_IMPREZA = SubaruPlatformConfig( + [ + SubaruCarDocs("Subaru Impreza 2017-19"), + SubaruCarDocs("Subaru Crosstrek 2018-19", video="https://youtu.be/Agww7oE1k-s?t=26"), + SubaruCarDocs("Subaru XV 2018-19", video="https://youtu.be/Agww7oE1k-s?t=26"), + ], + CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15), + ) + SUBARU_IMPREZA_2020 = SubaruPlatformConfig( + [ + SubaruCarDocs("Subaru Impreza 2020-22"), + SubaruCarDocs("Subaru Crosstrek 2020-23"), + SubaruCarDocs("Subaru XV 2020-21"), + ], + CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17), + flags=SubaruFlags.STEER_RATE_LIMITED, + ) + # TODO: is there an XV and Impreza too? + SUBARU_CROSSTREK_HYBRID = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b]))], + CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), + flags=SubaruFlags.HYBRID, + ) + SUBARU_FORESTER = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Forester 2019-21", "All")], + CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), + flags=SubaruFlags.STEER_RATE_LIMITED, + ) + SUBARU_FORESTER_HYBRID = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Forester Hybrid 2020")], + SUBARU_FORESTER.specs, + flags=SubaruFlags.HYBRID, + ) + # Pre-global + SUBARU_FORESTER_PREGLOBAL = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Forester 2017-18")], + CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), + {Bus.pt: 'subaru_forester_2017_generated'}, + flags=SubaruFlags.PREGLOBAL, + ) + SUBARU_LEGACY_PREGLOBAL = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Legacy 2015-18")], + CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), + {Bus.pt: 'subaru_outback_2015_generated'}, + flags=SubaruFlags.PREGLOBAL, + ) + SUBARU_OUTBACK_PREGLOBAL = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Outback 2015-17")], + SUBARU_FORESTER_PREGLOBAL.specs, + {Bus.pt: 'subaru_outback_2015_generated'}, + flags=SubaruFlags.PREGLOBAL, + ) + SUBARU_OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Outback 2018-19")], + SUBARU_FORESTER_PREGLOBAL.specs, + {Bus.pt: 'subaru_outback_2019_generated'}, + flags=SubaruFlags.PREGLOBAL, + ) + # Angle LKAS + SUBARU_FORESTER_2022 = SubaruPlatformConfig( + [SubaruCarDocs("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c]))], + SUBARU_FORESTER.specs, + flags=SubaruFlags.LKAS_ANGLE, + ) + SUBARU_OUTBACK_2023 = SubaruGen2PlatformConfig( + [SubaruCarDocs("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], + SUBARU_OUTBACK.specs, + flags=SubaruFlags.LKAS_ANGLE, + ) + SUBARU_ASCENT_2023 = SubaruGen2PlatformConfig( + [SubaruCarDocs("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d]))], + SUBARU_ASCENT.specs, + flags=SubaruFlags.LKAS_ANGLE, + ) + + +SUBARU_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION) +SUBARU_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION) + +# The EyeSight ECU takes 10s to respond to SUBARU_VERSION_REQUEST properly, +# log this alternate manufacturer-specific query +SUBARU_ALT_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(0xf100) +SUBARU_ALT_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(0xf100) + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + Request( + [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.fwdCamera, Ecu.engine, Ecu.transmission], + logging=True, + ), + # Non-OBD requests + # Some Eyesight modules fail on TESTER_PRESENT_REQUEST + # TODO: check if this resolves the fingerprinting issue for the 2023 Ascent and other new Subaru cars + Request( + [SUBARU_VERSION_REQUEST], + [SUBARU_VERSION_RESPONSE], + whitelist_ecus=[Ecu.fwdCamera], + bus=0, + ), + Request( + [SUBARU_ALT_VERSION_REQUEST], + [SUBARU_ALT_VERSION_RESPONSE], + whitelist_ecus=[Ecu.fwdCamera], + bus=0, + logging=True, + ), + Request( + [StdQueries.DEFAULT_DIAGNOSTIC_REQUEST, StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], + [StdQueries.DEFAULT_DIAGNOSTIC_RESPONSE, StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], + whitelist_ecus=[Ecu.fwdCamera], + bus=0, + logging=True, + ), + Request( + [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.fwdCamera, Ecu.engine, Ecu.transmission], + bus=0, + ), + # GEN2 powertrain bus query + Request( + [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.fwdCamera, Ecu.engine, Ecu.transmission], + bus=1, + obd_multiplexing=False, + ), + ], + # We don't get the EPS from non-OBD queries on GEN2 cars. Note that we still attempt to match when it exists + non_essential_ecus={ + Ecu.eps: list(CAR.with_flags(SubaruFlags.GLOBAL_GEN2)), + } +) + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/tesla/__init__.py b/artifacts/package_runtime/iqdbc/car/tesla/__init__.py new file mode 100644 index 000000000..8c310536f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/__init__.py @@ -0,0 +1,2 @@ +# FIXME: gate by FingerPrint +TESLA_BLINKERS = False diff --git a/artifacts/package_runtime/iqdbc/car/tesla/carcontroller.py b/artifacts/package_runtime/iqdbc/car/tesla/carcontroller.py new file mode 100644 index 000000000..5b91e9371 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/carcontroller.py @@ -0,0 +1,113 @@ +import numpy as np +from iqdbc.can import CANPacker +from iqdbc.car import Bus, structs +from iqdbc.car.lateral import apply_steer_angle_limits_vm +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.tesla import TESLA_BLINKERS +from iqdbc.car.tesla.teslacan import TeslaCAN +from iqdbc.car.tesla.values import CarControllerParams +from iqdbc.car.vehicle_model import VehicleModel +from iqpilot.selfdrive.car.enhanced_stock_longitudinal_control import get_set_speed_kph_from_params +from iqdbc.lvbs.car.tesla.torque_blend import TorqueBlendController +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ + + +def get_safety_CP(): + # We use the TESLA_MODEL_Y platform for lateral limiting to match safety + # A Model 3 at 40 m/s using the Model Y limits sees a <0.3% difference in max angle (from curvature factor) + from iqdbc.car.tesla.interface import CarInterface + return CarInterface.get_non_essential_params("TESLA_MODEL_Y") + + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ): + CarControllerBase.__init__(self, dbc_names, CP, CP_IQ) + self.coop_steer = TorqueBlendController() + self.apply_angle_last = 0 + self.packer = CANPacker(dbc_names[Bus.party]) + self.tesla_can = TeslaCAN(CP, self.packer) + self.apply_accel_last = 0.0 + + # Vehicle model used for lateral limiting + self.VM = VehicleModel(get_safety_CP()) + + self.has_vehicle_bus = bool(CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS) + self.body_controls_counter_last = -1 + self.blinker_request_prev = False + self.blinker_cancel_frame = 0 + + def update(self, CC, CC_IQ, CS, now_nanos): + actuators = CC.actuators + can_sends = [] + + # Tesla EPS enforces disabling steering on heavy lateral override force. + # When enabling in a tight curve, we wait until user reduces steering force to start steering. + # Canceling is done on rising edge and is handled generically with CC.cruiseControl.cancel + lat_active = CC.latActive and CS.hands_on_level < 3 + + if self.frame % CarControllerParams.STEER_STEP == 0: + # Angular rate limit based on speed + self.apply_angle_last = apply_steer_angle_limits_vm(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw, CS.out.steeringAngleDeg, + lat_active, CarControllerParams, self.VM) + + can_sends.append(self.tesla_can.create_steering_control(*self.coop_steer.update(self.apply_angle_last, lat_active, self.CP_IQ, CS, self.VM))) + + if self.frame % 10 == 0: + can_sends.append(self.tesla_can.create_steering_allowed()) + + # Longitudinal control + if self.CP.openpilotLongitudinalControl: + if self.frame % 4 == 0: + state = 13 if CC.cruiseControl.cancel else 4 # 4=ACC_ON, 13=ACC_CANCEL_GENERIC_SILENT + accel = float(np.clip(actuators.accel, CarControllerParams.ACCEL_MIN, CarControllerParams.ACCEL_MAX)) + if not CC.longActive: + accel = 0. + self.apply_accel_last = accel + cntr = (self.frame // 4) % 8 + set_speed_kph = get_set_speed_kph_from_params(CC_IQ.params) + can_sends.append(self.tesla_can.create_longitudinal_command(state, accel, cntr, CS.out.vEgo, CC.longActive, + CS.cruise_override, set_speed_kph=set_speed_kph, + comfort_mode=bool(getattr(CC, "longComfortMode", False)), + stopping=getattr(actuators, "longControlState", None) == + structs.CarControl.Actuators.LongControlState.stopping, + cancel=CC.cruiseControl.cancel)) + + else: + # Increment counter so cancel is prioritized even without openpilot longitudinal + if CC.cruiseControl.cancel: + cntr = (CS.das_control["DAS_controlCounter"] + 1) % 8 + can_sends.append(self.tesla_can.create_longitudinal_command(13, 0, cntr, CS.out.vEgo, False, True)) + + # Nav blinker control via DAS_bodyControls on the vehicle bus, phase-locked to the car's + # counter. Cancel on the trailing edge since the body controller latches the signal. + stock_dat = getattr(CS, 'das_body_controls_dat', b"") + # FIXME: gate by FingerPrint + if TESLA_BLINKERS and self.has_vehicle_bus and len(stock_dat) >= 8: + left_blinker = CC.leftBlinker + right_blinker = CC.rightBlinker + + driver_opposes = (left_blinker and CS.out.rightBlinker) or (right_blinker and CS.out.leftBlinker) + if driver_opposes: + left_blinker = right_blinker = False + + nav_requesting = left_blinker or right_blinker + + if self.blinker_request_prev and not nav_requesting and not driver_opposes: + self.blinker_cancel_frame = self.frame + 150 # ~1.5 s + self.blinker_request_prev = nav_requesting + cancel = not nav_requesting and not driver_opposes and self.frame < self.blinker_cancel_frame + + body_counter = stock_dat[6] >> 4 + if body_counter != self.body_controls_counter_last: + can_sends.append(self.tesla_can.create_body_controls(stock_dat, left_blinker, right_blinker, cancel)) + self.body_controls_counter_last = body_counter + + # TODO: HUD control + new_actuators = actuators.as_builder() + new_actuators.steeringAngleDeg = self.apply_angle_last + new_actuators.accel = self.apply_accel_last + new_actuators.curvature = float(self.coop_steer.debug_angle_desired_limited) # debug + new_actuators.torque = float(self.coop_steer.override_angle_accu) # debug + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/tesla/carstate.py b/artifacts/package_runtime/iqdbc/car/tesla/carstate.py new file mode 100644 index 000000000..bc5d0362d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/carstate.py @@ -0,0 +1,171 @@ +import copy +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.tesla import TESLA_BLINKERS +from iqdbc.car.tesla.values import DBC, CANBUS, GEAR_MAP, STEER_THRESHOLD, TeslaFlags + +from iqdbc.lvbs.car.tesla.iq_carstate import IQCarState +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ, TeslaSafetyFlagsIQ +from iqpilot.common.params import Params + + +def stock_autosteer_invalid(CP, CP_IQ, autopilot_state: int) -> bool: + return (not (CP.flags & TeslaFlags.MISSING_DAS_SETTINGS) and + not (CP_IQ.iqSafetyFlags & TeslaSafetyFlagsIQ.FSD_VISUALIZATION) and + autopilot_state not in (0, 1, 2)) + + +class CarState(CarStateBase, IQCarState): + def __init__(self, CP, CP_IQ): + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + iq_lvbs_alc = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.alc") + CarStateBase.__init__(self, CP, CP_IQ) + IQCarState.__init__(self, CP, CP_IQ) + self.can_define = CANDefine(DBC[CP.carFingerprint][Bus.party]) + self.shifter_values = self.can_define.dv["DI_systemStatus"]["DI_gear"] + + self.summon = False + self.summon_prev = False + self.cruise_enabled_prev = False + + self.hands_on_level = 0 + self.das_control = None + self.das_body_controls_dat = b"" + self._odometer_store = iq_lvbs_alc.create_vehicle_odometer_store(CP, Params()) + self.cruise_override = False + + def update_summon_state(self, summon_state: str, cruise_enabled: bool): + summon_now = summon_state in ("ACTIVE", "COMPLETE", "SELFPARK_STARTED") + if summon_now and not self.summon_prev and not self.cruise_enabled_prev: + self.summon = True + if not summon_now: + self.summon = False + self.summon_prev = summon_now + self.cruise_enabled_prev = cruise_enabled + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp_party = can_parsers[Bus.party] + cp_ap_party = can_parsers[Bus.ap_party] + ret = structs.CarState() + ret_iq = structs.IQCarState() + scale_speed = 1.01 + length = 0.11 + + # Vehicle speed + ret.vEgoRaw = cp_party.vl["DI_speed"]["DI_vehicleSpeed"] * CV.KPH_TO_MS + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + + # Displayed speed + ui_speed_units = self.can_define.dv["DI_speed"]["DI_uiSpeedUnits"].get(int(cp_party.vl["DI_speed"]["DI_uiSpeedUnits"]), None) + if ui_speed_units == "DI_SPEED_KPH": + ret.vEgoCluster = cp_party.vl["DI_speed"]["DI_uiSpeed"] * CV.KPH_TO_MS + elif ui_speed_units == "DI_SPEED_MPH": + ret.vEgoCluster = cp_party.vl["DI_speed"]["DI_uiSpeed"] * CV.MPH_TO_MS + + # Gas pedal + ret.gasPressed = cp_party.vl["DI_systemStatus"]["DI_accelPedalPos"] > 0 + + # Brake pedal + ret.brake = 0 + ret.brakePressed = cp_party.vl["ESP_status"]["ESP_driverBrakeApply"] == 2 + + # Steering wheel + epas_status = cp_party.vl["EPAS3S_sysStatus"] + self.hands_on_level = epas_status["EPAS3S_handsOnLevel"] + ret.steeringAngleDeg = -epas_status["EPAS3S_internalSAS"] + ret.steeringRateDeg = -cp_ap_party.vl["SCCM_steeringAngleSensor"]["SCCM_steeringAngleSpeed"] + ret.steeringTorque = -epas_status["EPAS3S_torsionBarTorque"] + ret.steeringTorqueEps = -epas_status["EPAS3S_steeringRackForce"] * length / self.CP.steerRatio + + # stock handsOnLevel uses >0.5 for 0.25s, but is too slow + ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > STEER_THRESHOLD, 5) + + eac_status = self.can_define.dv["EPAS3S_sysStatus"]["EPAS3S_eacStatus"].get(int(epas_status["EPAS3S_eacStatus"]), None) + ret.steerFaultPermanent = eac_status == "EAC_FAULT" + ret.steerFaultTemporary = eac_status == "EAC_INHIBITED" + + # FSD disengages using union of handsOnLevel (slow overrides) and high angle rate faults (fast overrides, high speed) + eac_error_code = self.can_define.dv["EPAS3S_sysStatus"]["EPAS3S_eacErrorCode"].get(int(epas_status["EPAS3S_eacErrorCode"]), None) + ret.steeringDisengage = self.hands_on_level >= 3 or (eac_status == "EAC_INHIBITED" and + eac_error_code == "EAC_ERROR_HIGH_ANGLE_RATE_SAFETY") + + # Cruise state + cruise_state = self.can_define.dv["DI_state"]["DI_cruiseState"].get(int(cp_party.vl["DI_state"]["DI_cruiseState"]), None) + speed_units = self.can_define.dv["DI_state"]["DI_speedUnits"].get(int(cp_party.vl["DI_state"]["DI_speedUnits"]), None) + + summon_state = self.can_define.dv["DI_state"]["DI_autoparkState"].get(int(cp_party.vl["DI_state"]["DI_autoparkState"]), None) + cruise_enabled = cruise_state in ("ENABLED", "STANDSTILL", "OVERRIDE", "PRE_FAULT", "PRE_CANCEL") + self.cruise_override = cruise_state in ("OVERRIDE") + self.update_summon_state(summon_state, cruise_enabled) + + # Match panda safety cruise engaged logic + ret.cruiseState.enabled = cruise_enabled and not self.summon + if speed_units == "KPH": + ret.cruiseState.speedCluster = cp_party.vl["DI_state"]["DI_digitalSpeed"] * CV.KPH_TO_MS + elif speed_units == "MPH": + ret.cruiseState.speedCluster = cp_party.vl["DI_state"]["DI_digitalSpeed"] * CV.MPH_TO_MS + ret.cruiseState.speed = max(ret.cruiseState.speedCluster / scale_speed, 1e-3) + ret.cruiseState.available = cruise_state == "STANDBY" or ret.cruiseState.enabled + ret.cruiseState.standstill = False # This needs to be false, since we can resume from stop without sending anything special + ret.standstill = cp_party.vl["ESP_B"]["ESP_vehicleStandstillSts"] == 1 + ret.accFaulted = cruise_state == "FAULT" + + # Gear + ret.gearShifter = GEAR_MAP[self.can_define.dv["DI_systemStatus"]["DI_gear"].get(int(cp_party.vl["DI_systemStatus"]["DI_gear"]), "DI_GEAR_INVALID")] + + # Doors + ret.doorOpen = cp_party.vl["UI_warning"]["anyDoorOpen"] == 1 + + # Blinkers + ret.leftBlinker = cp_party.vl["UI_warning"]["leftBlinkerBlinking"] in (1, 2) + ret.rightBlinker = cp_party.vl["UI_warning"]["rightBlinkerBlinking"] in (1, 2) + + # Seatbelt + ret.seatbeltUnlatched = cp_party.vl["UI_warning"]["buckleStatus"] != 1 + + # Blindspot + ret.leftBlindspot = cp_ap_party.vl["DAS_status"]["DAS_blindSpotRearLeft"] != 0 + ret.rightBlindspot = cp_ap_party.vl["DAS_status"]["DAS_blindSpotRearRight"] != 0 + + # AEB + ret.stockAeb = cp_ap_party.vl["DAS_control"]["DAS_aebEvent"] == 1 + + # LKAS + steer_control_type = int(cp_ap_party.vl["DAS_steeringControl"]["DAS_steeringControlType"]) + if self.CP.flags & TeslaFlags.LEGACY_DAS_STEERING: + steer_control_type >>= 1 # legacy firmware uses a 2-bit field, one bit up from the 3-bit signal + ret.stockLkas = steer_control_type == 2 # LANE_KEEP_ASSIST + + # Stock Autosteer should be disengaged (includes FSD) + # TODO: find for TESLA_MODEL_X and HW2.5 vehicles + ret.invalidLkasSetting = stock_autosteer_invalid(self.CP, self.CP_IQ, int(cp_ap_party.vl["DAS_status"]["DAS_autopilotState"])) + + # Buttons # ToDo: add Gap adjust button + + # Messages needed by carcontroller + self.das_control = copy.copy(cp_ap_party.vl["DAS_control"]) + + # Raw stock DAS_bodyControls bytes (bus 2), used to ride the blinker on the vehicle bus. + # FIXME: gate by FingerPrint + if TESLA_BLINKERS and Bus.cam in can_parsers: + self.das_body_controls_dat = bytes(can_parsers[Bus.cam].dat.get(0x3E9, b"")) + + IQCarState.update(self, ret, ret_iq, can_parsers) + if ret.odometer > 0.0: + ret.odometer = self._odometer_store.record(ret.odometer) or 0.0 + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + parsers = { + Bus.party: CANParser(DBC[CP.carFingerprint][Bus.party], [], CANBUS.party), + Bus.ap_party: CANParser(DBC[CP.carFingerprint][Bus.party], [], CANBUS.autopilot_party), + **IQCarState.get_parser(CP, CP_IQ), + } + # Stock DAS_bodyControls from the AP bus (bus 2) for the nav blinker. + if TESLA_BLINKERS and CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS and Bus.adas in DBC[CP.carFingerprint]: + parsers[Bus.cam] = CANParser(DBC[CP.carFingerprint][Bus.adas], [("DAS_bodyControls", 2)], CANBUS.autopilot_party) + return parsers diff --git a/artifacts/package_runtime/iqdbc/car/tesla/fingerprints.py b/artifacts/package_runtime/iqdbc/car/tesla/fingerprints.py new file mode 100644 index 000000000..1a8ea7e69 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/fingerprints.py @@ -0,0 +1,56 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.tesla.values import CAR + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.TESLA_MODEL_3: { + (Ecu.eps, 0x730, None): [ + b'TeM3_E014p10_0.0.0 (16),E014.17.00', + b'TeM3_E014p10_0.0.0 (16),EL014.17.00', + b'TeM3_ES014p11_0.0.0 (25),ES014.19.0', + b'TeMYG4_DCS_Update_0.0.0 (13),E4014.28.1', + b'TeMYG4_DCS_Update_0.0.0 (9),E4014.26.0', + b'TeMYG4_Legacy3Y_0.0.0 (2),E4015.02.0', + b'TeMYG4_Legacy3Y_0.0.0 (5),E4015.03.2', + b'TeMYG4_Legacy3Y_0.0.0 (5),E4L015.03.2', + b'TeMYG4_Main_0.0.0 (59),E4H014.29.0', + b'TeMYG4_Main_0.0.0 (65),E4H015.01.0', + b'TeMYG4_Main_0.0.0 (67),E4H015.02.1', + b'TeMYG4_Main_0.0.0 (77),E4H015.04.5', + b'TeMYG4_Main_0.0.0 (77),E4HP015.04.5', + b'TeMYG4_Main_0.0.0 (78),E4H015.05.0', + b'TeMYG4_Main_0.0.0 (78),E4HP015.05.0', + b'TeMYG4_SingleECU_0.0.0 (33),E4S014.27', + ], + }, + CAR.TESLA_MODEL_Y: { + (Ecu.eps, 0x730, None): [ + b'TeM3_E014p10_0.0.0 (16),Y002.18.00', + b'TeM3_E014p10_0.0.0 (16),YP002.18.00', + b'TeM3_E014p10_0.0.0 (24),Y002.21.2', + b'TeM3_ES014p11_0.0.0 (16),YS002.17', + b'TeM3_ES014p11_0.0.0 (25),YS002.19.0', + b'TeMYG4_DCS_Update_0.0.0 (13),Y4002.27.1', + b'TeMYG4_DCS_Update_0.0.0 (13),Y4P002.27.1', + b'TeMYG4_DCS_Update_0.0.0 (9),Y4P002.25.0', + b'TeMYG4_Legacy3Y_0.0.0 (2),Y4003.02.0', + b'TeMYG4_Legacy3Y_0.0.0 (2),Y4P003.02.0', + b'TeMYG4_Legacy3Y_0.0.0 (5),Y4003.03.2', + b'TeMYG4_Legacy3Y_0.0.0 (5),Y4P003.03.2', + b'TeMYG4_SingleECU_0.0.0 (28),Y4S002.23.0', + b'TeMYG4_SingleECU_0.0.0 (33),Y4S002.26', + b'TeMYG4_Legacy3Y_0.0.0 (6),Y4003.04.0', + b'TeMYG4_Main_0.0.0 (77),Y4003.05.4', + b'TeMYG4_Main_0.0.0 (78),Y4003.06.0', + b'TeMYG4_Main_0.0.0 (87),Y4003.09.3', + ], + }, + CAR.TESLA_MODEL_X: { + (Ecu.eps, 0x730, None): [ + b'TeM3_SP_XP002p2_0.0.0 (23),XPR003.6.0', + b'TeM3_SP_XP002p2_0.0.0 (36),XPR003.10.0', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/tesla/interface.py b/artifacts/package_runtime/iqdbc/car/tesla/interface.py new file mode 100644 index 000000000..3cab3fd83 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/interface.py @@ -0,0 +1,69 @@ +from iqdbc.car import Bus, get_safety_config, structs +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.tesla.carcontroller import CarController +from iqdbc.car.tesla.carstate import CarState +from iqdbc.car.tesla.values import TeslaSafetyFlags, TeslaFlags, CANBUS, CAR, DBC, Ecu, is_legacy_das_steering +from iqdbc.car.tesla.radar_interface import RadarInterface, RADAR_START_ADDR + +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ, TeslaSafetyFlagsIQ + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "tesla" + + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.tesla)] + + ret.steerLimitTimer = 0.4 + ret.steerActuatorDelay = 0.1 + ret.steerAtStandstill = True + + ret.steerControlType = structs.CarParams.SteerControlType.angle + + # Model X and HW 2.5 vehicles are missing DAS_settings + if 0x293 not in fingerprint[CANBUS.autopilot_party]: + ret.flags |= TeslaFlags.MISSING_DAS_SETTINGS.value + + # Radar support is intended to work for: + # - Tesla Model 3 vehicles built approximately mid-2017 through early-2021 + # - Tesla Model Y vehicles built approximately mid-2020 through early-2021 + # - Vehicles equipped with the Continental ARS4-B radar (used on HW2 / HW2.5 / early HW3) + # - Radar CAN lines must be tapped and connected to CAN bus 1 (normally not used for tesla vehicles) + ret.radarUnavailable = RADAR_START_ADDR not in fingerprint[1] or Bus.radar not in DBC[candidate] + + ret.alphaLongitudinalAvailable = True + if alpha_long: + ret.openpilotLongitudinalControl = True + ret.safetyConfigs[0].safetyParam |= TeslaSafetyFlags.LONG_CONTROL.value + + legacy_das = any(fw.ecu == Ecu.eps and is_legacy_das_steering(candidate, fw.fwVersion) for fw in car_fw) + if legacy_das: + ret.flags |= TeslaFlags.LEGACY_DAS_STEERING.value + ret.safetyConfigs[0].safetyParam |= TeslaSafetyFlags.LEGACY_DAS_STEERING.value + + ret.dashcamOnly = candidate in (CAR.TESLA_MODEL_X,) # dashcam only, pending find invalidLkasSetting signal + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + + stock_cp.enableBsm = True + + if candidate == CAR.TESLA_MODEL_X: + stock_cp.dashcamOnly = False + + # Vehicle-bus messages can be slow enough to miss the initial capture window. + # Accept either the established 0x3DF marker or the absolute odometer frame. + vehicle_bus_seen = any(0x3DF in bus or 0x3B6 in bus for bus in fingerprint.values()) + if vehicle_bus_seen: + ret.flags |= TeslaFlagsIQ.HAS_VEHICLE_BUS.value + ret.iqSafetyFlags |= TeslaSafetyFlagsIQ.HAS_VEHICLE_BUS + + return ret diff --git a/artifacts/package_runtime/iqdbc/car/tesla/radar_interface.py b/artifacts/package_runtime/iqdbc/car/tesla/radar_interface.py new file mode 100644 index 000000000..d21d02288 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/radar_interface.py @@ -0,0 +1,89 @@ +from iqdbc.can import CANParser +from iqdbc.car import Bus, structs +from iqdbc.car.interfaces import RadarInterfaceBase +from iqdbc.car.tesla.values import DBC + +RADAR_START_ADDR = 0x410 +RADAR_MSG_COUNT = 80 # 40 points * 2 messages each + + +def get_radar_can_parser(CP): + if Bus.radar not in DBC[CP.carFingerprint]: + return None + + messages = [('RadarStatus', 16)] + for i in range(RADAR_MSG_COUNT // 2): + messages.extend([ + (f'RadarPoint{i}_A', 16), + (f'RadarPoint{i}_B', 16), + ]) + + return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, 1) + + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + self.updated_messages = set() + self.trigger_msg = RADAR_START_ADDR + RADAR_MSG_COUNT - 1 + self.track_id = 0 + + self.radar_off_can = CP.radarUnavailable + self.rcp = get_radar_can_parser(CP) + + def update(self, can_strings): + if self.radar_off_can or self.rcp is None: + return super().update(None) + + vls = self.rcp.update(can_strings) + self.updated_messages.update(vls) + + if self.trigger_msg not in self.updated_messages: + return None + + rr = self._update(self.updated_messages) + self.updated_messages.clear() + + return rr + + def _update(self, updated_messages): + ret = structs.RadarData() + if self.rcp is None: + return ret + + if not self.rcp.can_valid: + ret.errors.canError = True + + radar_status = self.rcp.vl['RadarStatus'] + if radar_status['shortTermUnavailable']: + ret.errors.radarUnavailableTemporary = True + if radar_status['sensorBlocked'] or radar_status['vehDynamicsError']: + ret.errors.radarFault = True + + for i in range(RADAR_MSG_COUNT // 2): + msg_a = self.rcp.vl[f'RadarPoint{i}_A'] + msg_b = self.rcp.vl[f'RadarPoint{i}_B'] + + # Make sure msg A and B are together + if msg_a['Index'] != msg_b['Index2']: + continue + + if not msg_a['Tracked']: + if i in self.pts: + del self.pts[i] + continue + + if i not in self.pts: + self.pts[i] = structs.RadarData.RadarPoint() + self.pts[i].trackId = self.track_id + self.track_id += 1 + + self.pts[i].dRel = msg_a['LongDist'] + self.pts[i].yRel = msg_a['LatDist'] + self.pts[i].vRel = msg_a['LongSpeed'] + self.pts[i].aRel = msg_a['LongAccel'] + self.pts[i].yvRel = msg_b['LatSpeed'] + self.pts[i].measured = bool(msg_a['Meas']) + + ret.points = list(self.pts.values()) + return ret diff --git a/artifacts/package_runtime/iqdbc/car/tesla/teslacan.py b/artifacts/package_runtime/iqdbc/car/tesla/teslacan.py new file mode 100644 index 000000000..6a3627adf --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/teslacan.py @@ -0,0 +1,141 @@ +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.tesla.values import CANBUS, CarControllerParams, TeslaFlags +from iqdbc.car import DT_CTRL + + +class TeslaCAN: + COAST_ENTRY_ACCEL = 0.03 + COAST_EXIT_ACCEL = 0.08 + IMMEDIATE_REGEN_ACCEL = -0.5 + COAST_JERK_LIMIT = 0.7 + + def __init__(self, CP, packer): + self.CP = CP + self.packer = packer + self.l_jerk = 0.0 + self.longitudinal_mode = "coast" + + def create_steering_control(self, angle, enabled, control_type): + # control_type comes from torque_blend: ANGLE_CONTROL (1) normally, LANE_KEEP_ASSIST (2) when cooperative steering is enabled + control_type = control_type if enabled else 0 + if self.CP.flags & TeslaFlags.LEGACY_DAS_STEERING: + control_type <<= 1 # legacy firmware uses a 2-bit field, one bit up from the 3-bit signal + + values = { + "DAS_steeringAngleRequest": -angle, + "DAS_steeringHapticRequest": 0, + "DAS_steeringControlType": control_type, + } + + return self.packer.make_can_msg("DAS_steeringControl", CANBUS.party, values) + + def _update_longitudinal_mode(self, accel, active, cruise_override, stopping, cancel): + if not active or cruise_override or cancel: + self.longitudinal_mode = "coast" + elif stopping or accel <= self.IMMEDIATE_REGEN_ACCEL: + self.longitudinal_mode = "regen" + elif self.longitudinal_mode == "drive": + if accel <= -self.COAST_EXIT_ACCEL: + self.longitudinal_mode = "regen" + elif accel <= self.COAST_ENTRY_ACCEL: + self.longitudinal_mode = "coast" + elif self.longitudinal_mode == "regen": + if accel >= self.COAST_EXIT_ACCEL: + self.longitudinal_mode = "drive" + elif accel >= -self.COAST_ENTRY_ACCEL: + self.longitudinal_mode = "coast" + elif accel >= self.COAST_EXIT_ACCEL: + self.longitudinal_mode = "drive" + elif accel <= -self.COAST_EXIT_ACCEL: + self.longitudinal_mode = "regen" + + def create_longitudinal_command(self, acc_state, accel, counter, v_ego, active, cruise_override, set_speed_kph=None, + comfort_mode=False, stopping=False, cancel=False): + from iqdbc.car.interfaces import V_CRUISE_MAX + + set_speed = max(v_ego * CV.MS_TO_KPH, 0) + if active: + self.l_jerk = 0.0 if cruise_override else min( + self.l_jerk + CarControllerParams.JERK_UP * DT_CTRL * 4, + CarControllerParams.JERK_LIMIT_MAX, + ) + else: + self.l_jerk = 0.0 + + accel_min = accel + accel_max = max(accel, 0) + jerk_min = CarControllerParams.JERK_LIMIT_MIN + jerk_max = self.l_jerk + + if active and comfort_mode: + self._update_longitudinal_mode(accel, active, cruise_override, stopping, cancel) + if self.longitudinal_mode == "drive": + set_speed = V_CRUISE_MAX if set_speed_kph is None else max(0.0, min(V_CRUISE_MAX, float(set_speed_kph))) + elif self.longitudinal_mode == "regen": + set_speed = 0 + else: + accel_min = min(accel, 0) + accel_max = max(accel, 0) + jerk_min = -self.COAST_JERK_LIMIT + jerk_max = self.COAST_JERK_LIMIT + elif active: + self._update_longitudinal_mode(accel, False, cruise_override, stopping, cancel) + set_speed = 0 if accel < 0 else V_CRUISE_MAX + if set_speed_kph is not None and accel >= 0: + set_speed = max(0.0, min(V_CRUISE_MAX, float(set_speed_kph))) + else: + self._update_longitudinal_mode(accel, active, cruise_override, stopping, cancel) + + values = { + "DAS_setSpeed": set_speed, + "DAS_accState": acc_state, + "DAS_aebEvent": 0, + "DAS_jerkMin": jerk_min, + "DAS_jerkMax": jerk_max, + "DAS_accelMin": accel_min, + "DAS_accelMax": accel_max, + "DAS_controlCounter": counter, + } + return self.packer.make_can_msg("DAS_control", CANBUS.party, values) + + def create_steering_allowed(self): + values = { + "APS_eacAllow": 1, + } + + return self.packer.make_can_msg("APS_eacMonitor", CANBUS.party, values) + + def create_body_controls(self, stock_dat, left_blinker, right_blinker, cancel=False): + # Ride alongside the car's native DAS_bodyControls: copy the raw frame, override only the + # turn-indicator bits, and stamp counter + 1 so our frame supersedes the stock one. + dat = bytearray(stock_dat) + if len(dat) < 8: + dat.extend(b"\x00" * (8 - len(dat))) + + if left_blinker or right_blinker: + turn_req = 1 if left_blinker else 2 # DAS_TURN_INDICATOR_LEFT / _RIGHT + dat[1] = (dat[1] & ~0x07) | (turn_req & 0x07) + dat[2] = (dat[2] & ~0x3C) | (1 << 2) # DAS_ACTIVE_NAV_LANE_CHANGE + elif cancel: + dat[1] = (dat[1] & ~0x07) | 0x03 # DAS_TURN_INDICATOR_CANCEL + dat[2] = (dat[2] & ~0x3C) | (4 << 2) # DAS_CANCEL_LANE_CHANGE + + counter = (((dat[6] >> 4) + 1) & 0x0F) + dat[6] = (dat[6] & ~0xF0) | (counter << 4) + + addr = 0x3E9 + checksum = (addr & 0xFF) + ((addr >> 8) & 0xFF) + for i in range(7): + checksum += dat[i] + dat[7] = checksum & 0xFF + + return addr, bytes(dat), CANBUS.vehicle + + +def tesla_checksum(address: int, sig, d: bytearray) -> int: + checksum = (address & 0xFF) + ((address >> 8) & 0xFF) + checksum_byte = sig.start_bit // 8 + for i in range(len(d)): + if i != checksum_byte: + checksum += d[i] + return checksum & 0xFF diff --git a/artifacts/package_runtime/iqdbc/car/tesla/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/tesla/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/tesla/tests/test_tesla.py b/artifacts/package_runtime/iqdbc/car/tesla/tests/test_tesla.py new file mode 100644 index 000000000..66d7f1c54 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/tests/test_tesla.py @@ -0,0 +1,312 @@ +from collections import defaultdict + +import pytest + +from iqdbc.car import gen_empty_fingerprint, structs +from iqdbc.car.structs import CarParams +from iqdbc.car.fw_versions import match_fw_to_car +from iqdbc.car.tesla.fingerprints import FW_VERSIONS +from iqdbc.car.tesla.interface import CarInterface +from iqdbc.car.tesla.teslacan import TeslaCAN +from iqdbc.car.tesla.radar_interface import RADAR_START_ADDR +from iqdbc.car.tesla.carcontroller import CarController +from iqdbc.car.tesla.carstate import stock_autosteer_invalid +from iqdbc.car.tesla.values import (CAR, FW_PATTERN, LEGACY_DAS_STEERING_FW, TeslaFlags, TeslaSafetyFlags, + get_platform_codes, is_legacy_das_steering) +from iqdbc.lvbs.car.interfaces import _apply_tesla_options +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ, TeslaSafetyFlagsIQ +from iqdbc.can import CANPacker, CANParser + +Ecu = CarParams.Ecu +EPS_ADDR = 0x730 + + +def fw_match(fw: bytes): + car_fw = [CarParams.CarFw(ecu=Ecu.eps, fwVersion=fw, address=EPS_ADDR, subAddress=0, brand='tesla')] + exact, matches = match_fw_to_car(car_fw, '0' * 17, log=False) + return exact, matches + + +class TestTeslaFwPattern: + def test_all_known_fw_parses(self): + for car, ecus in FW_VERSIONS.items(): + for fws in ecus.values(): + for fw in fws: + assert FW_PATTERN.match(fw) is not None, f'{car}: unparsed FW version: {fw}' + + def test_model_code_identifies_one_platform(self): + # a new platform reusing an existing model code would silently misfingerprint + platforms = defaultdict(set) + for car, ecus in FW_VERSIONS.items(): + for fws in ecus.values(): + for model, _, _ in get_platform_codes(fws): + platforms[model].add(car) + + for model, cars in platforms.items(): + assert len(cars) == 1, f'model code {model} maps to multiple platforms: {cars}' + + def test_exact_match_still_wins(self): + for car, ecus in FW_VERSIONS.items(): + for fws in ecus.values(): + for fw in fws: + exact, matches = fw_match(fw) + assert exact, f'{fw} fell back to fuzzy matching' + assert matches == {car}, f'{fw} matched {matches}, expected {car}' + + @pytest.mark.parametrize("fw, expected", [ + # a firmware bump within a known series, the case that used to fingerprint as MOCK + (b'TeMYG4_Main_0.0.0 (99),Y4003.14.0', CAR.TESLA_MODEL_Y), + (b'TeMYG4_Main_0.0.0 (99),E4H015.09.0', CAR.TESLA_MODEL_3), + (b'TeM3_SP_XP002p2_0.0.0 (40),XPR003.12.0', CAR.TESLA_MODEL_X), + # Tesla bumps the series within a platform (E4014 -> E4015, Y4002 -> Y4003) + (b'TeMYG4_Main_0.0.0 (12),Y4004.01.0', CAR.TESLA_MODEL_Y), + # an unknown model code is a car we don't support + (b'TeCT_Main_0.0.0 (1),CT001.01.0', None), + (b'garbage', None), + ]) + def test_unknown_fw_fuzzy_match(self, fw, expected): + exact, matches = fw_match(fw) + if expected is None: + assert matches == set(), f'{fw} unexpectedly matched {matches}' + else: + assert not exact + assert matches == {expected} + + +class TestTeslaLegacyDasSteering: + def test_reproduces_known_table(self): + for car, ecus in FW_VERSIONS.items(): + for fws in ecus.values(): + for fw in fws: + expected = fw in LEGACY_DAS_STEERING_FW.get(car, []) + assert is_legacy_das_steering(car, fw) == expected, f'{car}: wrong legacy DAS verdict for {fw}' + + @pytest.mark.parametrize("car, fw, expected", [ + # below a family's known modern cutoff (Y4/003 splits at 003.04.0) + (CAR.TESLA_MODEL_Y, b'TeMYG4_Legacy3Y_0.0.0 (5),Y4003.03.9', True), + (CAR.TESLA_MODEL_Y, b'TeMYG4_Main_0.0.0 (99),Y4003.14.0', False), + # E4/015 splits at 015.04.5 + (CAR.TESLA_MODEL_3, b'TeMYG4_Main_0.0.0 (68),E4H015.03.9', True), + (CAR.TESLA_MODEL_3, b'TeMYG4_Main_0.0.0 (99),E4H015.09.0', False), + # families with no known modern FW: interpolate legacy, extrapolate modern + (CAR.TESLA_MODEL_3, b'TeM3_E014p10_0.0.0 (16),E014.18.00', True), + (CAR.TESLA_MODEL_3, b'TeM3_E014p10_0.0.0 (30),E014.22.0', False), + # numeric, not lexical, version compare (XPR003.10.0 > XPR003.6.0) + (CAR.TESLA_MODEL_X, b'TeM3_SP_XP002p2_0.0.0 (30),XPR003.9.0', True), + # an unknown series has no history to compare against + (CAR.TESLA_MODEL_Y, b'TeMYG4_Main_0.0.0 (12),Y4004.01.0', False), + (CAR.TESLA_MODEL_Y, b'garbage', False), + ]) + def test_unknown_fw(self, car, fw, expected): + assert is_legacy_das_steering(car, fw) == expected + + def test_flag_set_from_fuzzy_match(self): + for fw, legacy in ((b'TeMYG4_Legacy3Y_0.0.0 (5),Y4003.03.9', True), + (b'TeMYG4_Main_0.0.0 (99),Y4003.14.0', False)): + car_fw = [CarParams.CarFw(ecu=Ecu.eps, fwVersion=fw, address=EPS_ADDR, subAddress=0, brand='tesla')] + CP = CarInterface.get_params(CAR.TESLA_MODEL_Y, gen_empty_fingerprint(), car_fw, False, False, False) + assert bool(CP.flags & TeslaFlags.LEGACY_DAS_STEERING) == legacy + assert bool(CP.safetyConfigs[0].safetyParam & TeslaSafetyFlags.LEGACY_DAS_STEERING) == legacy + + +def test_fsd_visualization_params(): + CP = structs.CarParams(brand="tesla") + CP_IQ = structs.IQCarParams() + _apply_tesla_options(CP, CP_IQ, {"IQTeslaFsdVisualization": "1"}) + assert CP_IQ.flags & TeslaFlagsIQ.FSD_VISUALIZATION + assert CP_IQ.iqSafetyFlags & TeslaSafetyFlagsIQ.FSD_VISUALIZATION + + +@pytest.mark.parametrize("enabled, expected", [(False, True), (True, False)]) +def test_fsd_visualization_invalid_lkas(enabled, expected): + CP = structs.CarParams() + CP_IQ = structs.IQCarParams(iqSafetyFlags=TeslaSafetyFlagsIQ.FSD_VISUALIZATION if enabled else 0) + assert stock_autosteer_invalid(CP, CP_IQ, 3) == expected + + +class TestTeslaFingerprint: + def test_radar_detection(self): + # Test radar availability detection for cars with radar DBC defined + for radar in (True, False): + fingerprint = gen_empty_fingerprint() + if radar: + fingerprint[1][RADAR_START_ADDR] = 8 + CP = CarInterface.get_params(CAR.TESLA_MODEL_3, fingerprint, [], False, False, False) + assert CP.radarUnavailable != radar + + def test_no_radar_car(self): + # Model X doesn't have radar DBC defined, should always be unavailable + for radar in (True, False): + fingerprint = gen_empty_fingerprint() + if radar: + fingerprint[1][RADAR_START_ADDR] = 8 + CP = CarInterface.get_params(CAR.TESLA_MODEL_X, fingerprint, [], False, False, False) + assert CP.radarUnavailable # Always unavailable since no radar DBC + + +class TestTeslaCan: + class DummyPacker: + def make_can_msg(self, name, bus, values): + return name, bus, values + + def test_vehicle_bus_odometer_decodes_kilometers(self): + packer = CANPacker("tesla_model3_vehicle") + parser = CANParser("tesla_model3_vehicle", [("ID3B6UI_odometer", 1)], 1) + + message = packer.make_can_msg("ID3B6UI_odometer", 1, { + "UI_odometer": 29150.377, + "UI_odometerCounter": 1, + "UI_odometerChecksum": 0, + }) + parser.update([1_000_000_000, [message]]) + + assert parser.vl["ID3B6UI_odometer"]["UI_odometer"] == 29150.377 + + def test_longitudinal_command_does_not_reference_missing_jerk_attr(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + tesla_can = TeslaCAN(CP, self.DummyPacker()) + + name, bus, values = tesla_can.create_longitudinal_command(4, 1.0, 0, 20.0, True, False) + + assert name == "DAS_control" + assert bus == 0 + assert values["DAS_jerkMax"] <= 4.9 + assert values["DAS_jerkMax"] >= 0.0 + + def test_longitudinal_jerk_accumulates_and_resets(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + tesla_can = TeslaCAN(CP, self.DummyPacker()) + + first = tesla_can.create_longitudinal_command(4, 1.0, 0, 20.0, True, False)[2] + second = tesla_can.create_longitudinal_command(4, 1.0, 1, 20.0, True, False)[2] + inactive = tesla_can.create_longitudinal_command(4, 0.0, 2, 20.0, False, False)[2] + + assert second["DAS_jerkMax"] > first["DAS_jerkMax"] > 0.0 + assert inactive["DAS_jerkMax"] == 0.0 + + def test_longitudinal_comfort_mode_hysteresis(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + tesla_can = TeslaCAN(CP, self.DummyPacker()) + + coast = tesla_can.create_longitudinal_command(4, 0.0, 0, 20.0, True, False, set_speed_kph=64.0, comfort_mode=True)[2] + drive = tesla_can.create_longitudinal_command(4, 0.08, 1, 20.0, True, False, set_speed_kph=64.0, comfort_mode=True)[2] + drive_held = tesla_can.create_longitudinal_command(4, 0.04, 2, 20.0, True, False, set_speed_kph=64.0, comfort_mode=True)[2] + coast_again = tesla_can.create_longitudinal_command(4, 0.03, 3, 20.0, True, False, set_speed_kph=64.0, comfort_mode=True)[2] + regen = tesla_can.create_longitudinal_command(4, -0.08, 4, 20.0, True, False, set_speed_kph=64.0, comfort_mode=True)[2] + regen_held = tesla_can.create_longitudinal_command(4, -0.04, 5, 20.0, True, False, set_speed_kph=64.0, comfort_mode=True)[2] + final_coast = tesla_can.create_longitudinal_command(4, -0.03, 6, 20.0, True, False, set_speed_kph=64.0, comfort_mode=True)[2] + + assert coast["DAS_setSpeed"] == 72.0 + assert coast["DAS_jerkMin"] == -0.7 + assert coast["DAS_jerkMax"] == 0.7 + assert drive["DAS_setSpeed"] == 64.0 + assert drive_held["DAS_setSpeed"] == 64.0 + assert coast_again["DAS_setSpeed"] == 72.0 + assert regen["DAS_setSpeed"] == 0 + assert regen_held["DAS_setSpeed"] == 0 + assert final_coast["DAS_setSpeed"] == 72.0 + + def test_longitudinal_comfort_mode_crosses_directly_between_drive_and_regen(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + tesla_can = TeslaCAN(CP, self.DummyPacker()) + + tesla_can.create_longitudinal_command(4, 0.08, 0, 20.0, True, False, comfort_mode=True) + regen = tesla_can.create_longitudinal_command(4, -0.08, 1, 20.0, True, False, comfort_mode=True)[2] + drive = tesla_can.create_longitudinal_command(4, 0.08, 2, 20.0, True, False, set_speed_kph=64.0, comfort_mode=True)[2] + + assert regen["DAS_setSpeed"] == 0 + assert drive["DAS_setSpeed"] == 64.0 + + def test_longitudinal_comfort_mode_stopping_bypasses_coast(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + tesla_can = TeslaCAN(CP, self.DummyPacker()) + + values = tesla_can.create_longitudinal_command(4, -0.01, 0, 20.0, True, False, comfort_mode=True, stopping=True)[2] + + assert values["DAS_setSpeed"] == 0 + assert values["DAS_jerkMin"] == -4.9 + + def test_route_zero_crossing_commands_stay_in_coast(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + tesla_can = TeslaCAN(CP, self.DummyPacker()) + commands = [0.001925, -0.007605, -0.003657, 0.001745, 0.014604, -0.000265, -0.008631, 0.003343, + 0.000620, -0.001185, -0.000301, 0.003632, 0.006865, -0.003242, -0.000854, 0.016680] + + set_speeds = [ + tesla_can.create_longitudinal_command(4, accel, counter % 8, 11.18, True, False, comfort_mode=True)[2]["DAS_setSpeed"] + for counter, accel in enumerate(commands) + ] + + assert set(set_speeds) == {11.18 * 3.6} + + def test_longitudinal_command_uses_explicit_set_speed(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + tesla_can = TeslaCAN(CP, self.DummyPacker()) + + name, bus, values = tesla_can.create_longitudinal_command(4, 1.0, 0, 20.0, True, False, set_speed_kph=64.0) + + assert name == "DAS_control" + assert bus == 0 + assert values["DAS_setSpeed"] == 64.0 + + def test_longitudinal_command_preserves_decel_when_explicit_set_speed_present(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + tesla_can = TeslaCAN(CP, self.DummyPacker()) + + name, bus, values = tesla_can.create_longitudinal_command(4, -0.5, 0, 20.0, True, False, set_speed_kph=64.0) + + assert name == "DAS_control" + assert bus == 0 + assert values["DAS_setSpeed"] == 0 + assert values["DAS_accelMin"] < 0 + + +class TestTeslaCarControllerIQParams: + def test_iq_params_override_set_speed(self): + CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) + CP.openpilotLongitudinalControl = True + controller = CarController(CAR.TESLA_MODEL_3.config.dbc_dict, CP, structs.IQCarParams()) + + class DummyCruise: + cancel = False + + class DummyActuators: + steeringAngleDeg = 0.0 + accel = 1.0 + longControlState = structs.CarControl.Actuators.LongControlState.pid + + def as_builder(self): + return self + + class DummyCarControl: + actuators = DummyActuators() + latActive = False + longActive = True + cruiseControl = DummyCruise() + + class DummyCarState: + hands_on_level = 0 + out = type("Out", (), {"vEgoRaw": 20.0, "steeringAngleDeg": 0.0, "steeringRateDeg": 0.0, "steeringTorque": 0.0, "vEgo": 20.0})() + das_accCancel = False + cruise_override = False + das_control = {"DAS_controlCounter": 0} + + cc_iq = structs.IQCarControl(params=[ + structs.IQCarControl.Param( + key="enhancedStockLongitudinalControl.setSpeedKph", + type="float", + value=b"64.0", + ) + ]) + + captured = {} + + def fake_longitudinal_command(state, accel, cntr, v_ego, active, cruise_override, set_speed_kph=None, **kwargs): + captured["set_speed_kph"] = set_speed_kph + return ("DAS_control", 0, {"DAS_setSpeed": set_speed_kph}) + + controller.tesla_can.create_longitudinal_command = fake_longitudinal_command + + new_actuators, _ = controller.update(DummyCarControl(), cc_iq, DummyCarState(), 0) + assert captured["set_speed_kph"] == 64.0 + assert new_actuators.accel == 1.0 diff --git a/artifacts/package_runtime/iqdbc/car/tesla/values.py b/artifacts/package_runtime/iqdbc/car/tesla/values.py new file mode 100644 index 000000000..80e6209eb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tesla/values.py @@ -0,0 +1,264 @@ +import re +from collections import defaultdict +from dataclasses import dataclass, field +from enum import Enum, IntFlag +from functools import cache +from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, CarSpecs, DbcDict, PlatformConfig, Platforms +from iqdbc.car.lateral import AngleSteeringLimits, ISO_LATERAL_ACCEL +from iqdbc.car.structs import CarParams, CarState +from iqdbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column, SupportType +from iqdbc.car.fw_query_definitions import FwQueryConfig, LiveFwVersions, OfflineFwVersions, Request, StdQueries + +Ecu = CarParams.Ecu + + +class Footnote(Enum): + HW_TYPE = CarFootnote( + "Some 2023 model years have HW4. To check which hardware type your vehicle has, look for " + + "Autopilot computer under Software -> Additional Vehicle Information on your vehicle's touchscreen.

" + + "See this page for more information.", + Column.MODEL) + + SETUP = CarFootnote( + "See more setup details for Tesla.", + Column.MAKE, setup_note=True) + + +@dataclass +class TeslaCarDocsHW3(CarDocs): + package: str = "All" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.tesla_a])) + footnotes: list[Enum] = field(default_factory=lambda: [Footnote.HW_TYPE, Footnote.SETUP]) + + +@dataclass +class TeslaCarDocsHW4(CarDocs): + package: str = "All" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.tesla_b])) + footnotes: list[Enum] = field(default_factory=lambda: [Footnote.HW_TYPE, Footnote.SETUP]) + +@dataclass +class TeslaCarHW4ModelSXDocs(TeslaCarDocsHW4): + support_type: SupportType = SupportType.COMMUNITY + support_link: str = "community" + + +@dataclass +class TeslaPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.party: 'tesla_model3_party', Bus.adas: 'tesla_model3_vehicle'}) + + +class CAR(Platforms): + TESLA_MODEL_3 = TeslaPlatformConfig( + [ + # TODO: do we support 2017? It's HW3 + TeslaCarDocsHW3("Tesla Model 3 (with HW3) 2019-23"), + TeslaCarDocsHW4("Tesla Model 3 (with HW4) 2024-25"), + ], + CarSpecs(mass=1899., wheelbase=2.875, steerRatio=12.0), + {Bus.party: 'tesla_model3_party', Bus.radar: 'tesla_radar_continental_generated', Bus.adas: 'tesla_model3_vehicle'}, + ) + TESLA_MODEL_Y = TeslaPlatformConfig( + [ + TeslaCarDocsHW3("Tesla Model Y (with HW3) 2020-23"), + TeslaCarDocsHW4("Tesla Model Y (with HW4) 2024-25"), + ], + CarSpecs(mass=2072., wheelbase=2.890, steerRatio=12.0), + {Bus.party: 'tesla_model3_party', Bus.radar: 'tesla_radar_continental_generated', Bus.adas: 'tesla_model3_vehicle'}, + ) + TESLA_MODEL_X = TeslaPlatformConfig( + [TeslaCarHW4ModelSXDocs("Tesla Model X (with HW4) 2024")], + CarSpecs(mass=2495., wheelbase=2.960, steerRatio=12.0), + ) + + +# Cars with this EPS FW have a 2-bit DAS_steeringControlType and use TeslaFlags.LEGACY_DAS_STEERING +LEGACY_DAS_STEERING_FW = { + CAR.TESLA_MODEL_3: [ + b'TeM3_E014p10_0.0.0 (16),E014.17.00', + b'TeM3_E014p10_0.0.0 (16),EL014.17.00', + b'TeM3_ES014p11_0.0.0 (25),ES014.19.0', + b'TeMYG4_DCS_Update_0.0.0 (13),E4014.28.1', + b'TeMYG4_DCS_Update_0.0.0 (9),E4014.26.0', + b'TeMYG4_Legacy3Y_0.0.0 (2),E4015.02.0', + b'TeMYG4_Legacy3Y_0.0.0 (5),E4015.03.2', + b'TeMYG4_Legacy3Y_0.0.0 (5),E4L015.03.2', + b'TeMYG4_Main_0.0.0 (59),E4H014.29.0', + b'TeMYG4_Main_0.0.0 (65),E4H015.01.0', + b'TeMYG4_Main_0.0.0 (67),E4H015.02.1', + b'TeMYG4_SingleECU_0.0.0 (33),E4S014.27', + ], + CAR.TESLA_MODEL_Y: [ + b'TeM3_E014p10_0.0.0 (16),Y002.18.00', + b'TeM3_E014p10_0.0.0 (16),YP002.18.00', + b'TeM3_ES014p11_0.0.0 (16),YS002.17', + b'TeM3_ES014p11_0.0.0 (25),YS002.19.0', + b'TeMYG4_DCS_Update_0.0.0 (13),Y4002.27.1', + b'TeMYG4_DCS_Update_0.0.0 (13),Y4P002.27.1', + b'TeMYG4_DCS_Update_0.0.0 (9),Y4P002.25.0', + b'TeMYG4_Legacy3Y_0.0.0 (2),Y4003.02.0', + b'TeMYG4_Legacy3Y_0.0.0 (2),Y4P003.02.0', + b'TeMYG4_Legacy3Y_0.0.0 (5),Y4003.03.2', + b'TeMYG4_Legacy3Y_0.0.0 (5),Y4P003.03.2', + b'TeMYG4_SingleECU_0.0.0 (28),Y4S002.23.0', + b'TeMYG4_SingleECU_0.0.0 (33),Y4S002.26', + ], + CAR.TESLA_MODEL_X: [ + b'TeM3_SP_XP002p2_0.0.0 (23),XPR003.6.0', + b'TeM3_SP_XP002p2_0.0.0 (36),XPR003.10.0', + ], +} + +# e.g. TeMYG4_Main_0.0.0 (87),Y4003.09.3 +# 11111_22222_______33____45__666666 +# 1 = EPS firmware program, 2 = build lineage, 3 = build number, 4 = model code, +# 5 = trim/hardware variant, 6 = series and software version +# +# Only the model code identifies the vehicle: 1 and 2 are shared across models (Model 3 and +# Model Y both ship TeM3_ and TeMYG4_ firmware) and 3 is only monotone within one lineage. +FW_PATTERN = re.compile(rb'^Te[A-Z0-9]+_[A-Za-z0-9_]+_0\.0\.0 \(\d+\),' + + rb'(?PE4|E|Y4|Y|XP)[A-Z]{0,2}(?P\d{3})\.(?P\d+(?:\.\d+)*)$') + + +def get_platform_codes(fw_versions: list[bytes] | set[bytes]) -> set[tuple[bytes, bytes, tuple[int, ...]]]: + codes = set() + for fw in fw_versions: + match = FW_PATTERN.match(fw) + if match is not None: + codes.add((match.group('model'), match.group('series'), + tuple(int(v) for v in match.group('version').split(b'.')))) + + return codes + + +@cache +def _das_steering_cutoffs() -> dict[tuple[str, bytes, bytes], tuple[tuple[int, ...] | None, tuple[int, ...] | None]]: + """Per (platform, model code, series) family, the oldest known modern version and the newest + known legacy version. Tesla only ever moves a family forward, so these bound the split.""" + # imported here because fingerprints.py imports this module + from iqdbc.car.tesla.fingerprints import FW_VERSIONS + + legacy: defaultdict[tuple, set] = defaultdict(set) + modern: defaultdict[tuple, set] = defaultdict(set) + for platform, ecus in FW_VERSIONS.items(): + known_legacy = LEGACY_DAS_STEERING_FW.get(platform, []) + for fws in ecus.values(): + for fw in fws: + for model, series, version in get_platform_codes([fw]): + (legacy if fw in known_legacy else modern)[(platform, model, series)].add(version) + + return {k: (min(modern[k]) if k in modern else None, max(legacy[k]) if k in legacy else None) + for k in set(legacy) | set(modern)} + + +def is_legacy_das_steering(candidate: str, fw: bytes) -> bool: + """Whether an EPS FW uses the 2-bit DAS_steeringControlType. Unknown firmware newer than + anything in a family is treated as modern: cars only move forward, and someone left behind + on legacy software can force the platform with CarPlatformBundle.""" + if fw in LEGACY_DAS_STEERING_FW.get(candidate, []): + return True + + codes = get_platform_codes([fw]) + if not len(codes): + return False + + model, series, version = next(iter(codes)) + first_modern, last_legacy = _das_steering_cutoffs().get((candidate, model, series), (None, None)) + if first_modern is not None: + return version < first_modern + + return last_legacy is not None and version <= last_legacy + + +def match_fw_to_car_fuzzy(live_fw_versions: LiveFwVersions, vin: str, offline_fw_versions: OfflineFwVersions) -> set[str]: + # Tesla fingerprints on the EPS alone and Ecu.eps is in FUZZY_EXCLUDE_ECUS, so the generic fuzzy + # matcher can never match a Tesla. Match on the model code, which survives the EPS version bumps + # that ship with Tesla software updates. The series is deliberately not required to be known: + # Tesla bumps it within a platform (E4014 -> E4015, Y4002 -> Y4003). + offline_codes: defaultdict[bytes, set[str]] = defaultdict(set) + for candidate, ecus in offline_fw_versions.items(): + for fws in ecus.values(): + for model, _, _ in get_platform_codes(fws): + offline_codes[model].add(candidate) + + candidates: set[str] = set() + for ecu, addr, sub_addr in {e for ecus in offline_fw_versions.values() for e in ecus}: + if ecu != Ecu.eps: + continue + for model, _, _ in get_platform_codes(live_fw_versions.get((addr, sub_addr), set())): + candidates |= offline_codes[model] + + return candidates if len(candidates) == 1 else set() + + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[ + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.SUPPLIER_SOFTWARE_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.SUPPLIER_SOFTWARE_VERSION_RESPONSE], + bus=0, + ) + ], + match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, +) + + +class CANBUS: + party = 0 + vehicle = 1 + autopilot_party = 2 + + +GEAR_MAP = { + "DI_GEAR_INVALID": CarState.GearShifter.unknown, + "DI_GEAR_P": CarState.GearShifter.park, + "DI_GEAR_R": CarState.GearShifter.reverse, + "DI_GEAR_N": CarState.GearShifter.neutral, + "DI_GEAR_D": CarState.GearShifter.drive, + "DI_GEAR_SNA": CarState.GearShifter.unknown, +} + + +# Add extra tolerance for average banked road since safety doesn't have the roll +AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees, 6% superelevation. higher actual roll lowers lateral acceleration + + +class CarControllerParams: + ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( + # EPAS faults above this angle + 360, # deg + # Tesla uses a vehicle model instead, check carcontroller.py for details + ([], []), + ([], []), + + # Vehicle model angle limits + # Add extra tolerance for average banked road since safety doesn't have the roll + MAX_LATERAL_ACCEL=ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^2 + MAX_LATERAL_JERK=3.0 + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^3 + + # limit angle rate to both prevent a fault and for low speed comfort (~12 mph rate down to 0 mph) + MAX_ANGLE_RATE=5, # deg/20ms frame, EPS faults at 12 at a standstill + ) + + STEER_STEP = 2 # Angle command is sent at 50 Hz + ACCEL_MAX = 2.0 # m/s^2 + ACCEL_MIN = -3.48 # m/s^2 + JERK_LIMIT_MAX = 4.9 # m/s^3, ACC faults at 5.0 + JERK_LIMIT_MIN = -4.9 # m/s^3, ACC faults at 5.0 + JERK_UP = 1.0 # m/s^3 + + +class TeslaSafetyFlags(IntFlag): + LONG_CONTROL = 1 + LEGACY_DAS_STEERING = 2 + + +class TeslaFlags(IntFlag): + LONG_CONTROL = 1 + LEGACY_DAS_STEERING = 2 + MISSING_DAS_SETTINGS = 4 + + +DBC = CAR.create_dbc_map() + +STEER_THRESHOLD = 1 diff --git a/artifacts/package_runtime/iqdbc/car/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/tests/car_diff.py b/artifacts/package_runtime/iqdbc/car/tests/car_diff.py new file mode 100644 index 000000000..dd16eba0a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/car_diff.py @@ -0,0 +1,323 @@ +#!/usr/bin/env python3 +import argparse +import os +import pickle +import re +import subprocess +import sys +import tempfile +import traceback +import zstandard as zstd +from tqdm import tqdm +from tqdm.contrib.concurrent import process_map +from urllib.request import urlopen +from collections import defaultdict +from pathlib import Path +from typing import Any + + +from iqdbc.car import structs +from iqdbc.car.can_definitions import CanData +from iqdbc.car.car_helpers import can_fingerprint, interfaces +from iqdbc.car.logreader import LogReader, decompress_stream + + +TOLERANCE = 1e-4 +DIFF_BUCKET = "car_diff" +IGNORE_FIELDS = ["cumLagMs", "canErrorCounter"] +PADDING = 5 + +Diff = tuple[str, int, tuple[Any, Any], int] +Ref = tuple[int, structs.CarState] +Result = tuple[str, str, list[Diff], list[Ref] | None, list[structs.CarState] | None, str | None] + + +def dict_diff(d1: dict[str, Any], d2: dict[str, Any], path: str = "", ignore: list[str] | None = None, tolerance: float = 0) -> list[tuple]: + ignore = ignore or [] + diffs = [] + for key in d1.keys() | d2.keys(): + if key in ignore: + continue + full_path = f"{path}.{key}" if path else key + v1, v2 = d1.get(key), d2.get(key) + if isinstance(v1, dict) and isinstance(v2, dict): + diffs.extend(dict_diff(v1, v2, full_path, ignore, tolerance)) + elif isinstance(v1, (int, float)) and isinstance(v2, (int, float)): + if abs(v1 - v2) > tolerance: + diffs.append(("change", full_path, (v1, v2))) + elif v1 != v2: + diffs.append(("change", full_path, (v1, v2))) + return diffs + + +def load_can_messages(seg: str) -> list[Any]: + from comma_car_segments import get_url + parts = seg.split("/") + url = get_url(f"{parts[0]}/{parts[1]}", parts[2]) + msgs = LogReader(url, only_union_types=True, sort_by_time=True) + return [m for m in msgs if m.which() == 'can'] + + +def replay_segment(platform: str, can_msgs: list[Any]) -> tuple[structs.CarParams, list[structs.CarState], list[int]]: + _can_msgs = ([CanData(can.address, can.dat, can.src) for can in m.can] for m in can_msgs) + + def can_recv(wait_for_one: bool = False) -> list[list[CanData]]: + return [next(_can_msgs, [])] + + _, fingerprint = can_fingerprint(can_recv) + + CarInterface = interfaces[platform] + CP = CarInterface.get_params(platform, fingerprint, [], False, False, False) + CP_IQ = CarInterface.get_params_iq(CP, platform, fingerprint, [], False, False, False) + CI = CarInterface(CP, CP_IQ) + CC = structs.CarControl().as_reader() + + states, timestamps = [], [] + for msg in can_msgs: + frames = [CanData(c.address, c.dat, c.src) for c in msg.can] + states.append(CI.update([(msg.logMonoTime, frames)])) + CI.apply(CC, msg.logMonoTime) + timestamps.append(msg.logMonoTime) + return CP, states, timestamps + + +def process_segment(args: tuple) -> Result: + platform, seg, ref_path, update = args + try: + can_msgs = load_can_messages(seg) + CP, states, timestamps = replay_segment(platform, can_msgs) + ref_file = Path(ref_path) / f"{platform}_{seg.replace('/', '_')}.zst" + + if update: + data = {"cp": CP.to_dict(), "frames": list(zip(timestamps, states, strict=True))} + ref_file.write_bytes(zstd.compress(pickle.dumps(data), 10)) + return (platform, seg, [], None, None, None) + + if not ref_file.exists(): + return (platform, seg, [], None, None, "no ref") + + ref_data = pickle.loads(decompress_stream(ref_file.read_bytes())) + cp: dict[str, Any] = ref_data["cp"] + ref: list[Ref] = ref_data["frames"] + diffs = [] + for diff in dict_diff(cp, CP.to_dict(), path="carParams", ignore=IGNORE_FIELDS, tolerance=TOLERANCE): + diffs.append((diff[1], -1, diff[2], 0)) + for i, ((ts, ref_state), state) in enumerate(zip(ref, states, strict=True)): + for diff in dict_diff(ref_state.to_dict(), state.to_dict(), ignore=IGNORE_FIELDS, tolerance=TOLERANCE): + diffs.append((diff[1], i, diff[2], ts)) + return (platform, seg, diffs, ref, states, None) + except Exception: + return (platform, seg, [], None, None, traceback.format_exc()) + + +def get_changed_platforms(cwd: Path, database: dict[str, Any], interfaces: dict[str, Any]) -> list[str]: + git_ref = os.environ.get("GIT_REF", "origin/master") + changed = subprocess.check_output(["git", "diff", "--name-only", f"{git_ref}...HEAD"], cwd=cwd, encoding='utf8').strip() + brands = set() + patterns = [r"iqdbc/car/(\w+)/", r"iqdbc/dbc/(\w+?)_", r"iqdbc/dbc/generator/(\w+)", r"iqdbc/safety/modes/(\w+?)[_.]"] + for line in changed.splitlines(): + for pattern in patterns: + m = re.search(pattern, line) + if m: + brands.add(m.group(1).lower()) + return [p for p in interfaces if any(b in p.lower() for b in brands) and p in database] + + +def download_refs(ref_path: Path, platforms: list[str], segments: dict[str, list[str]]) -> None: + base_url = f"https://raw.githubusercontent.com/commaai/ci-artifacts/refs/heads/{DIFF_BUCKET}" + for platform in tqdm(platforms): + for seg in segments.get(platform, []): + filename = f"{platform}_{seg.replace('/', '_')}.zst" + with urlopen(f"{base_url}/{filename}") as resp: + (Path(ref_path) / filename).write_bytes(resp.read()) + + +def run_replay(platforms: list[str], segments: dict[str, list[str]], ref_path: Path, update: bool, workers: int = 4) -> list[Result]: + work = [(platform, seg, ref_path, update) + for platform in platforms for seg in segments.get(platform, [])] + return process_map(process_segment, work, max_workers=workers) + + +# ASCII waveforms helpers +def find_edges(vals: list[bool]) -> tuple[list[int], list[int]]: + rises = [] + falls = [] + prev = vals[0] + for i, val in enumerate(vals): + if val and not prev: + rises.append(i) + if not val and prev: + falls.append(i) + prev = val + return rises, falls + + +def render_waveform(label: str, vals: list[bool]) -> str: + wave = {(False, False): "_", (True, True): "‾", (False, True): "/", (True, False): "\\"} + line = f" {label}:".ljust(12) + prev = vals[0] + for val in vals: + line += wave[(prev, val)] + prev = val + if len(line) > 80: + line = line[:80] + "..." + return line + + +def format_timing(edge_type: str, master_edges: list[int], pr_edges: list[int], ms_per_frame: float) -> str | None: + if not master_edges or not pr_edges: + return None + delta = pr_edges[0] - master_edges[0] + if delta == 0: + return None + direction = "lags" if delta > 0 else "leads" + ms = int(abs(delta) * ms_per_frame) + return " " * 12 + f"{edge_type}: PR {direction} by {abs(delta)} frames ({ms}ms)" + + +def group_frames(diffs: list[Diff], max_gap: int = 15) -> list[list[Diff]]: + groups = [] + current = [diffs[0]] + for diff in diffs[1:]: + _, frame, _, _ = diff + _, prev_frame, _, _ = current[-1] + if frame <= prev_frame + max_gap: + current.append(diff) + else: + groups.append(current) + current = [diff] + groups.append(current) + return groups + + +def build_signals(group: list[Diff], ref: list[Ref], states: list[structs.CarState], field: str) -> tuple[list[Any], list[Any], int, int]: + _, first_frame, _, _ = group[0] + _, last_frame, _, _ = group[-1] + start = max(0, first_frame - PADDING) + end = min(last_frame + PADDING + 1, len(ref)) + master_vals = [] + pr_vals = [] + for frame in range(start, end): + mval = ref[frame][1].to_dict() + pval = states[frame].to_dict() + for k in field.split("."): + mval = mval.get(k) if isinstance(mval, dict) else None + pval = pval.get(k) if isinstance(pval, dict) else None + master_vals.append(mval) + pr_vals.append(pval) + return master_vals, pr_vals, start, end + + +def format_numeric_diffs(diffs: list[Diff]) -> list[str]: + lines = [] + for _, frame, (old_val, new_val), _ in diffs[:10]: + lines.append(f" frame {frame}: {old_val} -> {new_val}") + if len(diffs) > 10: + lines.append(f" (... {len(diffs) - 10} more)") + return lines + + +def format_boolean_diffs(diffs: list[Diff], ref: list[Ref], states: list[structs.CarState], field: str) -> list[str]: + _, first_frame, _, first_ts = diffs[0] + _, last_frame, _, last_ts = diffs[-1] + frame_time = last_frame - first_frame + time_ms = (last_ts - first_ts) / 1e6 + ms = time_ms / frame_time if frame_time else 10.0 + lines = [] + for group in group_frames(diffs): + master_vals, pr_vals, start, end = build_signals(group, ref, states, field) + master_rises, master_falls = find_edges(master_vals) + pr_rises, pr_falls = find_edges(pr_vals) + lines.append(f"\n frames {start}-{end - 1}") + lines.append(render_waveform("master", master_vals)) + lines.append(render_waveform("PR", pr_vals)) + for edge_type, master_edges, pr_edges in [("rise", master_rises, pr_rises), ("fall", master_falls, pr_falls)]: + msg = format_timing(edge_type, master_edges, pr_edges, ms) + if msg: + lines.append(msg) + return lines + + +def format_diff(diffs: list[Diff], ref: list[Ref], states: list[structs.CarState], field: str) -> list[str]: + if not diffs: + return [] + _, _, (old, new), _ = diffs[0] + is_bool = isinstance(old, bool) and isinstance(new, bool) + if is_bool: + return format_boolean_diffs(diffs, ref, states, field) + return format_numeric_diffs(diffs) + + +def main(platform: str | None = None, segments_per_platform: int = 10, update_refs: bool = False, all_platforms: bool = False) -> int: + from comma_car_segments import get_comma_car_segments_database + cwd = Path(__file__).resolve().parents[3] + ref_path = cwd / DIFF_BUCKET + if not update_refs: + ref_path = Path(tempfile.mkdtemp()) + ref_path.mkdir(exist_ok=True) + database = get_comma_car_segments_database() + + if all_platforms: + print("Running all platforms...") + platforms = [p for p in interfaces if p in database] + elif platform and platform in interfaces: + platforms = [platform] + else: + platforms = get_changed_platforms(cwd, database, interfaces) + + print("## Car behavior report") + print("Replays driving segments through this PR and compares the behavior to master.") + print("Please review any changes carefully to ensure they are expected.\n") + + if not platforms: + print("✅ No changes detected") + return 0 + + segments = {p: database.get(p, [])[:segments_per_platform] for p in platforms} + n_segments = sum(len(s) for s in segments.values()) + print(f"{'Generating' if update_refs else 'Testing'} {n_segments} segments for: {', '.join(platforms)}") + + if update_refs: + results = run_replay(platforms, segments, ref_path, update=True) + errors = [e for _, _, _, _, _, e in results if e] + assert len(errors) == 0, f"Segment failures: {errors}" + print(f"Generated {n_segments} refs to {ref_path}") + return 0 + + download_refs(ref_path, platforms, segments) + results = run_replay(platforms, segments, ref_path, update=False) + with_diffs = [(platform, seg, diffs, ref, states) + for platform, seg, diffs, ref, states, err in results if diffs] + errors = [(platform, seg, err) for platform, seg, diffs, ref, states, err in results if err] + n_passed = len(results) - len(with_diffs) - len(errors) + + icon = "âš ī¸" if with_diffs else "✅" + print(f"\n{icon} {len(with_diffs)} changed, {n_passed} passed, {len(errors)} errors") + + for plat, seg, err in errors: + print(f"\nERROR {plat} - {seg}: {err}") + + if with_diffs: + print("
Show changes\n\n```") + for plat, seg, diffs, ref, states in with_diffs: + print(f"\n{plat} - {seg}") + by_field = defaultdict(list) + for d in diffs: + by_field[d[0]].append(d) + for field, fd in sorted(by_field.items()): + print(f"\n {field} ({len(fd)} diffs)") + for line in format_diff(fd, ref, states, field): + print(line) + print("```\n
") + + return 1 if errors else 0 + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--platform", help="diff single platform") + parser.add_argument("--segments-per-platform", type=int, default=10, help="number of segments to diff per platform") + parser.add_argument("--update-refs", action="store_true", help="update refs based on current commit") + parser.add_argument("--all", action="store_true", help="run diff on all platforms") + args = parser.parse_args() + sys.exit(main(args.platform, args.segments_per_platform, args.update_refs, args.all)) diff --git a/artifacts/package_runtime/iqdbc/car/tests/routes.py b/artifacts/package_runtime/iqdbc/car/tests/routes.py new file mode 100644 index 000000000..6ad0f6af5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/routes.py @@ -0,0 +1,413 @@ +from typing import NamedTuple + +from iqdbc.car.chrysler.values import CAR as CHRYSLER +from iqdbc.car.gm.values import CAR as GM +from iqdbc.car.ford.values import CAR as FORD +from iqdbc.car.honda.values import CAR as HONDA +from iqdbc.car.hyundai.values import CAR as HYUNDAI +from iqdbc.car.nissan.values import CAR as NISSAN +from iqdbc.car.mazda.values import CAR as MAZDA +from iqdbc.car.mock.values import CAR as MOCK +from iqdbc.car.rivian.values import CAR as RIVIAN +from iqdbc.car.subaru.values import CAR as SUBARU +from iqdbc.car.tesla.values import CAR as TESLA +from iqdbc.car.toyota.values import CAR as TOYOTA +from iqdbc.car.values import Platform +from iqdbc.car.volkswagen.values import CAR as VOLKSWAGEN +from iqdbc.car.body.values import CAR as COMMA +from iqdbc.car.psa.values import CAR as PSA + +# FIXME: add routes for these cars +route_exempt_cars = [ + MOCK.MOCK, + GM.CADILLAC_ATS, + GM.HOLDEN_ASTRA, + GM.CHEVROLET_MALIBU, + HYUNDAI.GENESIS_G90, + VOLKSWAGEN.VOLKSWAGEN_CRAFTER_MK2, # need a route from an ACC-equipped Crafter + SUBARU.SUBARU_FORESTER_HYBRID, + # Honda/Acura test routes below expired, replace when CI bucket sync is fixed + HONDA.ACURA_TLX_2G, + HONDA.HONDA_NBOX_2G, + HONDA.ACURA_MDX_4G_MMR, + HONDA.HONDA_CITY_7G, + + # These had their DSUs unplugged, need new routes + # TOYOTA.LEXUS_ES # hybrid + TOYOTA.TOYOTA_COROLLA, + TOYOTA.TOYOTA_RAV4H, + + HONDA.HONDA_CLARITY, + GM.CHEVROLET_BOLT_NON_ACC, + GM.CHEVROLET_BOLT_NON_ACC_1ST_GEN, + GM.CHEVROLET_BOLT_NON_ACC_2ND_GEN, + GM.CHEVROLET_EQUINOX_NON_ACC_3RD_GEN, + GM.CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN, + GM.CADILLAC_CT6_NON_ACC_1ST_GEN, + GM.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN, + GM.CHEVROLET_MALIBU_NON_ACC_9TH_GEN, + GM.CADILLAC_XT5_NON_ACC_1ST_GEN, + HYUNDAI.HYUNDAI_IONIQ_5_PE, + HYUNDAI.HYUNDAI_IONIQ_5_N, + HYUNDAI.HYUNDAI_IONIQ_9, + HYUNDAI.HYUNDAI_CASPER, + HYUNDAI.HYUNDAI_CASPER_EV, + HYUNDAI.HYUNDAI_PORTER_II_EV, + HYUNDAI.HYUNDAI_SANTAFE_MX5, + HYUNDAI.HYUNDAI_SANTAFE_MX5_HEV, + HYUNDAI.KIA_K5_DL3_24, + HYUNDAI.KIA_K5_DL3_24_HEV, + HYUNDAI.KIA_EV4, + HYUNDAI.KIA_EV6_PE, + HYUNDAI.GENESIS_GV70_EV_1ST_GEN, + HYUNDAI.HYUNDAI_GRANDEUR_IG, + HYUNDAI.HYUNDAI_GRANDEUR_IG_HEV, + HYUNDAI.GENESIS_EQ900, + HYUNDAI.GENESIS_EQ900_L, + HYUNDAI.GENESIS_G90_2019, + HYUNDAI.HYUNDAI_NEXO, + HYUNDAI.KIA_MOHAVE, + HYUNDAI.KIA_K5, + HYUNDAI.KIA_K5_HEV, + HYUNDAI.KIA_K5_HEV_2022, + HYUNDAI.KIA_K7, + HYUNDAI.KIA_K7_HEV, + HYUNDAI.KIA_K7_PE, + HYUNDAI.KIA_K7_HEV_PE, + HYUNDAI.KIA_K9, + HYUNDAI.KIA_EV_SK3, + HYUNDAI.KIA_EV9, + HYUNDAI.KIA_EV3, + HYUNDAI.KIA_PV5, + HYUNDAI.KIA_RAY_EV, + HYUNDAI.HYUNDAI_KONA_HEV_2ND_GEN, + HYUNDAI.HYUNDAI_SONATA_2024, + HYUNDAI.HYUNDAI_AZERA_7TH_GEN, + VOLKSWAGEN.SEAT_ALHAMBRA_MK1, + VOLKSWAGEN.AUDI_Q4_MK1, + VOLKSWAGEN.AUDI_Q4_MK2, + VOLKSWAGEN.SEAT_LEON_MK4, + VOLKSWAGEN.CUPRA_BORN_MK1, + VOLKSWAGEN.SKODA_ENYAQ_MK1, + VOLKSWAGEN.SKODA_ENYAQ_MK2, +] + + +class CarTestRoute(NamedTuple): + route: str + car_model: Platform | None + segment: int | None = None + + +routes = [ + CarTestRoute("efdf9af95e71cd84/2022-05-13--19-03-31", COMMA.COMMA_BODY), + + CarTestRoute("0c94aa1e1296d7c6/2021-05-05--19-48-37", CHRYSLER.JEEP_GRAND_CHEROKEE), + CarTestRoute("91dfedae61d7bd75/2021-05-22--20-07-52", CHRYSLER.JEEP_GRAND_CHEROKEE_2019), + CarTestRoute("420a8e183f1aed48/2020-03-05--07-15-29", CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID), # 2017 + CarTestRoute("43a685a66291579b/2021-05-27--19-47-29", CHRYSLER.CHRYSLER_PACIFICA_2018), + CarTestRoute("378472f830ee7395/2021-05-28--07-38-43", CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID), + CarTestRoute("8190c7275a24557b/2020-01-29--08-33-58", CHRYSLER.CHRYSLER_PACIFICA_2019_HYBRID), + CarTestRoute("3d84727705fecd04/2021-05-25--08-38-56", CHRYSLER.CHRYSLER_PACIFICA_2020), + CarTestRoute("221c253375af4ee9/2022-06-15--18-38-24", CHRYSLER.RAM_1500_5TH_GEN), + CarTestRoute("8fb5eabf914632ae/2022-08-04--17-28-53", CHRYSLER.RAM_HD_5TH_GEN, segment=6), + CarTestRoute("3379c85aeedc8285/2023-12-07--17-49-39", CHRYSLER.DODGE_DURANGO), + + CarTestRoute("54827bf84c38b14f/2023-01-25--14-14-11", FORD.FORD_BRONCO_SPORT_MK1), + CarTestRoute("f8eaaccd2a90aef8/2023-05-04--15-10-09", FORD.FORD_ESCAPE_MK4), + CarTestRoute("56574443e0c3783c/00000002--c00bd0fe69", FORD.FORD_ESCAPE_MK4_5), + CarTestRoute("62241b0c7fea4589/2022-09-01--15-32-49", FORD.FORD_EXPLORER_MK6), + CarTestRoute("e886087f430e7fe7/2023-06-16--23-06-36", FORD.FORD_FOCUS_MK4), + CarTestRoute("bd37e43731e5964b/2023-04-30--10-42-26", FORD.FORD_MAVERICK_MK1), + CarTestRoute("112e4d6e0cad05e1/2023-11-14--08-21-43", FORD.FORD_F_150_LIGHTNING_MK1), + CarTestRoute("e36b272d5679115f/00000369--a3e8499a85", FORD.FORD_F_150_MK14), + CarTestRoute("83a4e056c7072678/2023-11-13--16-51-33", FORD.FORD_MUSTANG_MACH_E_MK1), + CarTestRoute("37998aa0fade36ab/00000000--48f927c4f5", FORD.FORD_RANGER_MK2), + CarTestRoute("61a1b9e7a4eae0f6/00000000--79d85d1315", FORD.FORD_EXPEDITION_MK4), + #TestRoute("f1b4c567731f4a1b/2018-04-30--10-15-35", FORD.FUSION), + + CarTestRoute("7cc2a8365b4dd8a9/2018-12-02--12-10-44", GM.GMC_ACADIA), + CarTestRoute("aa20e335f61ba898/2019-02-05--16-59-04", GM.BUICK_REGAL), + CarTestRoute("75a6bcb9b8b40373/2023-03-11--22-47-33", GM.BUICK_LACROSSE), + CarTestRoute("e746f59bc96fd789/2024-01-31--22-25-58", GM.CHEVROLET_EQUINOX), + CarTestRoute("ef8f2185104d862e/2023-02-09--18-37-13", GM.CADILLAC_ESCALADE), + CarTestRoute("46460f0da08e621e/2021-10-26--07-21-46", GM.CADILLAC_ESCALADE_ESV), + CarTestRoute("168f8b3be57f66ae/2023-09-12--21-44-42", GM.CADILLAC_ESCALADE_ESV_2019), + CarTestRoute("c950e28c26b5b168/2018-05-30--22-03-41", GM.CHEVROLET_VOLT), + CarTestRoute("f08912a233c1584f/2022-08-11--18-02-41", GM.CHEVROLET_BOLT_EUV, segment=1), + CarTestRoute("555d4087cf86aa91/2022-12-02--12-15-07", GM.CHEVROLET_BOLT_EUV, segment=14), # Bolt EV + CarTestRoute("38aa7da107d5d252/2022-08-15--16-01-12", GM.CHEVROLET_SILVERADO), + CarTestRoute("5085c761395d1fe6/2023-04-07--18-20-06", GM.CHEVROLET_TRAILBLAZER), + CarTestRoute("162796f1469f2f1b/00000005--6f334eda14", GM.CADILLAC_XT4), + CarTestRoute("477dd485611d1e6e/00000009--85fc06e10a", GM.CHEVROLET_VOLT_2019), + CarTestRoute("a40976dc9f28ba62/0000001f--160e210119", GM.CHEVROLET_TRAVERSE), + CarTestRoute("36c62b5da6f08154/00000052--983c17c5b2", GM.GMC_YUKON), + + CarTestRoute("0e7a2ba168465df5/2020-10-18--14-14-22", HONDA.ACURA_RDX_3G), + CarTestRoute("a74b011b32b51b56/2020-07-26--17-09-36", HONDA.HONDA_CIVIC), + CarTestRoute("a859a044a447c2b0/2020-03-03--18-42-45", HONDA.HONDA_CRV_EU), + CarTestRoute("68aac44ad69f838e/2021-05-18--20-40-52", HONDA.HONDA_CRV), + CarTestRoute("14fed2e5fa0aa1a5/2021-05-25--14-59-42", HONDA.HONDA_CRV_HYBRID), + CarTestRoute("52f3e9ae60c0d886/2021-05-23--15-59-43", HONDA.HONDA_FIT), + CarTestRoute("2c4292a5cd10536c/2021-08-19--21-32-15", HONDA.HONDA_FREED), + CarTestRoute("03be5f2fd5c508d1/2020-04-19--18-44-15", HONDA.HONDA_HRV), + CarTestRoute("320098ff6c5e4730/2023-04-13--17-47-46", HONDA.HONDA_HRV_3G), + CarTestRoute("147613502316e718/00000001--dd141a3140", HONDA.HONDA_HRV_3G), # Brazilian model + CarTestRoute("1e4baee1aa2687a0/00000001--74c4cc0b23", HONDA.HONDA_HRV_3G), # Thailand model use ALT_GEAR + CarTestRoute("917b074700869333/2021-05-24--20-40-20", HONDA.ACURA_ILX), + CarTestRoute("08a3deb07573f157/2020-03-06--16-11-19", HONDA.HONDA_ACCORD), # 1.5T + CarTestRoute("1da5847ac2488106/2021-05-24--19-31-50", HONDA.HONDA_ACCORD), # 2.0T + CarTestRoute("085ac1d942c35910/2021-03-25--20-11-15", HONDA.HONDA_ACCORD), # 2021 with new style HUD msgs + CarTestRoute("07585b0da3c88459/2021-05-26--18-52-04", HONDA.HONDA_ACCORD), # hybrid + CarTestRoute("f29e2b57a55e7ad5/2021-03-24--20-52-38", HONDA.HONDA_ACCORD), # hybrid, 2021 with new style HUD msgs + CarTestRoute("1ad763dd22ef1a0e/2020-02-29--18-37-03", HONDA.HONDA_CRV_5G), + CarTestRoute("0a96f86fcfe35964/2020-02-05--07-25-51", HONDA.HONDA_ODYSSEY), + CarTestRoute("7817fe954aff07b8/00000001--fdaaf36c4f", HONDA.HONDA_ODYSSEY_TWN), + CarTestRoute("d7233a428eb7d0b5/00000001--9b99b04d43", HONDA.HONDA_ODYSSEY_5G_MMR), + CarTestRoute("d83f36766f8012a5/2020-02-05--18-42-21", HONDA.HONDA_CIVIC_BOSCH_DIESEL), + CarTestRoute("f0890d16a07a236b/2021-05-25--17-27-22", HONDA.HONDA_INSIGHT), + CarTestRoute("07d37d27996096b6/2020-03-04--21-57-27", HONDA.HONDA_PILOT), + CarTestRoute("684e8f96bd491a0e/2021-11-03--11-08-42", HONDA.HONDA_PILOT), # Passport + CarTestRoute("0a78dfbacc8504ef/2020-03-04--13-29-55", HONDA.HONDA_CIVIC_BOSCH), + CarTestRoute("f34a60d68d83b1e5/2020-10-06--14-35-55", HONDA.ACURA_RDX), + CarTestRoute("54fd8451b3974762/2021-04-01--14-50-10", HONDA.HONDA_RIDGELINE), + CarTestRoute("2d5808fae0b38ac6/2021-09-01--17-14-11", HONDA.HONDA_E), + CarTestRoute("f44aa96ace22f34a/2021-12-22--06-22-31", HONDA.HONDA_CIVIC_2022), + CarTestRoute("1f032f5173c8ad99/00000006--573b3fcaf5", HONDA.HONDA_CIVIC_2022), # Civic Type R with manual transmission + CarTestRoute("b1c832ad56b6bc9d/00000010--debfcf5867", HONDA.HONDA_CIVIC_2022), # 2025 Civic Hatch Hybrid with new eCVT transmission + CarTestRoute("f9c43864cf057d05/2024-01-15--23-01-20", HONDA.HONDA_PILOT_4G), # TODO: Replace with a newer route + CarTestRoute("f39cf149898833ff/0000002b--54f3fae045", HONDA.HONDA_ACCORD_11G), + # CarTestRoute("56b2cf1dacdcd033/00000017--d24ffdb376", HONDA.HONDA_CITY_7G), # Brazilian model + CarTestRoute("2dc4489d7e1410ca/00000001--bbec3f5117", HONDA.HONDA_CRV_6G), + CarTestRoute("a703d058f4e05aeb/00000008--f169423024", HONDA.HONDA_PASSPORT_4G), + CarTestRoute("ad9840558640c31d/000001f2--026c4f6275", HONDA.ACURA_TLX_2G_MMR), + + CarTestRoute("87d7f06ade479c2e/2023-09-11--23-30-11", HYUNDAI.HYUNDAI_AZERA_6TH_GEN), + CarTestRoute("66189dd8ec7b50e6/2023-09-20--07-02-12", HYUNDAI.HYUNDAI_AZERA_HEV_6TH_GEN), + CarTestRoute("6fe86b4e410e4c37/2020-07-22--16-27-13", HYUNDAI.HYUNDAI_GENESIS), + CarTestRoute("b5d6dc830ad63071/2022-12-12--21-28-25", HYUNDAI.GENESIS_GV60_EV_1ST_GEN, segment=12), + CarTestRoute("70c5bec28ec8e345/2020-08-08--12-22-23", HYUNDAI.GENESIS_G70), + CarTestRoute("ca4de5b12321bd98/2022-10-18--21-15-59", HYUNDAI.GENESIS_GV70_1ST_GEN), + CarTestRoute("afe09b9f5d3f3548/00000011--15fefe1c50", HYUNDAI.GENESIS_GV70_ELECTRIFIED_1ST_GEN), + CarTestRoute("afe09b9f5d3f3548/0000001b--a1129a4a15", HYUNDAI.GENESIS_GV70_ELECTRIFIED_1ST_GEN), # openpilot longitudinal enabled + CarTestRoute("6b301bf83f10aa90/2020-11-22--16-45-07", HYUNDAI.GENESIS_G80), + CarTestRoute("66eaa6c3b6b2afc6/00000009--3a5199aabe", HYUNDAI.GENESIS_G80_2ND_GEN_FL), # LKA steering + CarTestRoute("0bbe367c98fa1538/2023-09-16--00-16-49", HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN), + CarTestRoute("f0709d2bc6ca451f/2022-10-15--08-13-54", HYUNDAI.HYUNDAI_SANTA_CRUZ_1ST_GEN), + CarTestRoute("4dbd55df87507948/2022-03-01--09-45-38", HYUNDAI.HYUNDAI_SANTA_FE), + CarTestRoute("bf43d9df2b660eb0/2021-09-23--14-16-37", HYUNDAI.HYUNDAI_SANTA_FE_2022), + CarTestRoute("37398f32561a23ad/2021-11-18--00-11-35", HYUNDAI.HYUNDAI_SANTA_FE_HEV_2022), + CarTestRoute("656ac0d830792fcc/2021-12-28--14-45-56", HYUNDAI.HYUNDAI_SANTA_FE_PHEV_2022, segment=1), + CarTestRoute("de59124955b921d8/2023-06-24--00-12-50", HYUNDAI.KIA_CARNIVAL_4TH_GEN), + CarTestRoute("409c9409979a8abc/2023-07-11--09-06-44", HYUNDAI.KIA_CARNIVAL_4TH_GEN), # Chinese model + CarTestRoute("e0e98335f3ebc58f/2021-03-07--16-38-29", HYUNDAI.KIA_CEED), + CarTestRoute("7653b2bce7bcfdaa/2020-03-04--15-34-32", HYUNDAI.KIA_OPTIMA_G4), + CarTestRoute("018654717bc93d7d/2022-09-19--23-11-10", HYUNDAI.KIA_OPTIMA_G4_FL, segment=0), + CarTestRoute("f9716670b2481438/2023-08-23--14-49-50", HYUNDAI.KIA_OPTIMA_H), + CarTestRoute("6a42c1197b2a8179/2023-09-21--10-23-44", HYUNDAI.KIA_OPTIMA_H_G4_FL), + CarTestRoute("c75a59efa0ecd502/2021-03-11--20-52-55", HYUNDAI.KIA_SELTOS), + CarTestRoute("5b7c365c50084530/2020-04-15--16-13-24", HYUNDAI.HYUNDAI_SONATA), + CarTestRoute("b2a38c712dcf90bd/2020-05-18--18-12-48", HYUNDAI.HYUNDAI_SONATA_LF), + CarTestRoute("c344fd2492c7a9d2/2023-12-11--09-03-23", HYUNDAI.HYUNDAI_STARIA_4TH_GEN), + CarTestRoute("fb3fd42f0baaa2f8/2022-03-30--15-25-05", HYUNDAI.HYUNDAI_TUCSON), + CarTestRoute("db68bbe12250812c/2022-12-05--00-54-12", HYUNDAI.HYUNDAI_TUCSON_4TH_GEN), # 2023 + CarTestRoute("36e10531feea61a4/2022-07-25--13-37-42", HYUNDAI.HYUNDAI_TUCSON_4TH_GEN), # hybrid + CarTestRoute("5875672fc1d4bf57/2020-07-23--21-33-28", HYUNDAI.KIA_SORENTO), + CarTestRoute("1d0d000db3370fd0/2023-01-04--22-28-42", HYUNDAI.KIA_SORENTO_4TH_GEN, segment=5), + CarTestRoute("fc19648042eb6896/2023-08-16--11-43-27", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, segment=14), + CarTestRoute("628935d7d3e5f4f7/2022-11-30--01-12-46", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN), # plug-in hybrid + CarTestRoute("9c917ba0d42ffe78/2020-04-17--12-43-19", HYUNDAI.HYUNDAI_PALISADE), + CarTestRoute("05a8f0197fdac372/2022-10-19--14-14-09", HYUNDAI.HYUNDAI_IONIQ_5), # LKA steering + CarTestRoute("eb4eae1476647463/2023-08-26--18-07-04", HYUNDAI.HYUNDAI_IONIQ_6, segment=6), # LKA steering + CarTestRoute("3f29334d6134fcd4/2022-03-30--22-00-50", HYUNDAI.HYUNDAI_IONIQ_PHEV_2019), + CarTestRoute("fa8db5869167f821/2021-06-10--22-50-10", HYUNDAI.HYUNDAI_IONIQ_PHEV), + CarTestRoute("e1107f9d04dfb1e2/2023-09-05--22-32-12", HYUNDAI.HYUNDAI_IONIQ_PHEV), # openpilot longitudinal enabled + CarTestRoute("2c5cf2dd6102e5da/2020-12-17--16-06-44", HYUNDAI.HYUNDAI_IONIQ_EV_2020), + CarTestRoute("610ebb9faaad6b43/2020-06-13--15-28-36", HYUNDAI.HYUNDAI_IONIQ_EV_LTD), + CarTestRoute("2c5cf2dd6102e5da/2020-06-26--16-00-08", HYUNDAI.HYUNDAI_IONIQ), + CarTestRoute("012c95f06918eca4/2023-01-15--11-19-36", HYUNDAI.HYUNDAI_IONIQ), # openpilot longitudinal enabled + CarTestRoute("ab59fe909f626921/2021-10-18--18-34-28", HYUNDAI.HYUNDAI_IONIQ_HEV_2022), + CarTestRoute("22d955b2cd499c22/2020-08-10--19-58-21", HYUNDAI.HYUNDAI_KONA), + CarTestRoute("0099bdb24d82951b/00000005--c38d940b04", HYUNDAI.HYUNDAI_KONA_2022), + CarTestRoute("efc48acf44b1e64d/2021-05-28--21-05-04", HYUNDAI.HYUNDAI_KONA_EV), + CarTestRoute("f90d3cd06caeb6fa/2023-09-06--17-15-47", HYUNDAI.HYUNDAI_KONA_EV), # openpilot longitudinal enabled + CarTestRoute("ff973b941a69366f/2022-07-28--22-01-19", HYUNDAI.HYUNDAI_KONA_EV_2022, segment=11), + CarTestRoute("1618132d68afc876/2023-08-27--09-32-14", HYUNDAI.HYUNDAI_KONA_EV_2ND_GEN, segment=13), + CarTestRoute("49f3c13141b6bc87/2021-07-28--08-05-13", HYUNDAI.HYUNDAI_KONA_HEV), + CarTestRoute("a74afe0cf708748f/0000000e--a2885a9a71", HYUNDAI.HYUNDAI_NEXO_1ST_GEN), + CarTestRoute("a74afe0cf708748f/0000000c--b476a8fd00", HYUNDAI.HYUNDAI_NEXO_1ST_GEN), # openpilot longitudinal enabled + CarTestRoute("5dddcbca6eb66c62/2020-07-26--13-24-19", HYUNDAI.KIA_STINGER), + CarTestRoute("5b50b883a4259afb/2022-11-09--15-00-42", HYUNDAI.KIA_STINGER_2022), + CarTestRoute("d624b3d19adce635/2020-08-01--14-59-12", HYUNDAI.HYUNDAI_VELOSTER), + CarTestRoute("d545129f3ca90f28/2022-10-19--09-22-54", HYUNDAI.KIA_EV6), # LKA steering + CarTestRoute("68d6a96e703c00c9/2022-09-10--16-09-39", HYUNDAI.KIA_EV6), # LFA steering + CarTestRoute("9b25e8c1484a1b67/2023-04-13--10-41-45", HYUNDAI.KIA_EV6), + CarTestRoute("007d5e4ad9f86d13/2021-09-30--15-09-23", HYUNDAI.KIA_K5_2021), + CarTestRoute("c58dfc9fc16590e0/2023-01-14--13-51-48", HYUNDAI.KIA_K5_HEV_2020), + CarTestRoute("78ad5150de133637/2023-09-13--16-15-57", HYUNDAI.KIA_K8_HEV_1ST_GEN), + CarTestRoute("50c6c9b85fd1ff03/2020-10-26--17-56-06", HYUNDAI.KIA_NIRO_EV), + CarTestRoute("b153671049a867b3/2023-04-05--10-00-30", HYUNDAI.KIA_NIRO_EV_2ND_GEN), + CarTestRoute("173219cf50acdd7b/2021-07-05--10-27-41", HYUNDAI.KIA_NIRO_PHEV), + CarTestRoute("23349923ba5c4e3b/2023-12-02--08-51-54", HYUNDAI.KIA_NIRO_PHEV_2022), + CarTestRoute("34a875f29f69841a/2021-07-29--13-02-09", HYUNDAI.KIA_NIRO_HEV_2021), + CarTestRoute("db04d2c63990e3ba/2023-02-08--16-52-39", HYUNDAI.KIA_NIRO_HEV_2ND_GEN), + CarTestRoute("50a2212c41f65c7b/2021-05-24--16-22-06", HYUNDAI.KIA_FORTE), + CarTestRoute("192283cdbb7a58c2/2022-10-15--01-43-18", HYUNDAI.KIA_SPORTAGE_5TH_GEN), + CarTestRoute("09559f1fcaed4704/2023-11-16--02-24-57", HYUNDAI.KIA_SPORTAGE_5TH_GEN, segment=0), # openpilot longitudinal + CarTestRoute("b3537035ffe6a7d6/2022-10-17--15-23-49", HYUNDAI.KIA_SPORTAGE_5TH_GEN), # hybrid + CarTestRoute("c5ac319aa9583f83/2021-06-01--18-18-31", HYUNDAI.HYUNDAI_ELANTRA), + CarTestRoute("734ef96182ddf940/2022-10-02--16-41-44", HYUNDAI.HYUNDAI_ELANTRA_GT_I30), + CarTestRoute("82e9cdd3f43bf83e/2021-05-15--02-42-51", HYUNDAI.HYUNDAI_ELANTRA_2021), + CarTestRoute("715ac05b594e9c59/2021-06-20--16-21-07", HYUNDAI.HYUNDAI_ELANTRA_HEV_2021), + CarTestRoute("7120aa90bbc3add7/2021-08-02--07-12-31", HYUNDAI.HYUNDAI_SONATA_HYBRID), + CarTestRoute("715ac05b594e9c59/2021-10-27--23-24-56", HYUNDAI.GENESIS_G70_2020), + CarTestRoute("6b0d44d22df18134/2023-05-06--10-36-55", HYUNDAI.GENESIS_GV80), + + CarTestRoute("00c829b1b7613dea/2021-06-24--09-10-10", TOYOTA.TOYOTA_ALPHARD_TSS2), + CarTestRoute("912119ebd02c7a42/2022-03-19--07-24-50", TOYOTA.TOYOTA_ALPHARD_TSS2), # hybrid + CarTestRoute("000cf3730200c71c/2021-05-24--10-42-05", TOYOTA.TOYOTA_AVALON), + CarTestRoute("0bb588106852abb7/2021-05-26--12-22-01", TOYOTA.TOYOTA_AVALON_2019), + CarTestRoute("87bef2930af86592/2021-05-30--09-40-54", TOYOTA.TOYOTA_AVALON_2019), # hybrid + CarTestRoute("e9966711cfb04ce3/2022-01-11--07-59-43", TOYOTA.TOYOTA_AVALON_TSS2), + CarTestRoute("eca1080a91720a54/2022-03-17--13-32-29", TOYOTA.TOYOTA_AVALON_TSS2), # hybrid + CarTestRoute("6cdecc4728d4af37/2020-02-23--15-44-18", TOYOTA.TOYOTA_CAMRY), + CarTestRoute("2f37c007683e85ba/2023-09-02--14-39-44", TOYOTA.TOYOTA_CAMRY), # openpilot longitudinal, with radar CAN filter + CarTestRoute("54034823d30962f5/2021-05-24--06-37-34", TOYOTA.TOYOTA_CAMRY), # hybrid + CarTestRoute("3456ad0cd7281b24/2020-12-13--17-45-56", TOYOTA.TOYOTA_CAMRY_TSS2), + CarTestRoute("ffccc77938ddbc44/2021-01-04--16-55-41", TOYOTA.TOYOTA_CAMRY_TSS2), # hybrid + # CarTestRoute("4e45c89c38e8ec4d/2021-05-02--02-49-28", TOYOTA.TOYOTA_COROLLA), + CarTestRoute("5f5afb36036506e4/2019-05-14--02-09-54", TOYOTA.TOYOTA_COROLLA_TSS2), + CarTestRoute("5ceff72287a5c86c/2019-10-19--10-59-02", TOYOTA.TOYOTA_COROLLA_TSS2), # hybrid + CarTestRoute("d2525c22173da58b/2021-04-25--16-47-04", TOYOTA.TOYOTA_PRIUS), + CarTestRoute("b14c5b4742e6fc85/2020-07-28--19-50-11", TOYOTA.TOYOTA_RAV4), + # CarTestRoute("32a7df20486b0f70/2020-02-06--16-06-50", TOYOTA.TOYOTA_RAV4H), + CarTestRoute("cdf2f7de565d40ae/2019-04-25--03-53-41", TOYOTA.TOYOTA_RAV4_TSS2), + CarTestRoute("a5c341bb250ca2f0/2022-05-18--16-05-17", TOYOTA.TOYOTA_RAV4_TSS2_2022), + CarTestRoute("ad5a3fa719bc2f83/2023-10-17--19-48-42", TOYOTA.TOYOTA_RAV4_TSS2_2023), + CarTestRoute("7e34a988419b5307/2019-12-18--19-13-30", TOYOTA.TOYOTA_RAV4_TSS2), # hybrid + CarTestRoute("2475fb3eb2ffcc2e/2022-04-29--12-46-23", TOYOTA.TOYOTA_RAV4_TSS2_2022), # hybrid + CarTestRoute("20ba9ade056a8c7b/2021-02-08--21-57-35", TOYOTA.TOYOTA_RAV4_PRIME), # SecOC + CarTestRoute("41ba5b181f29435d/00000001--e3ae76382f", TOYOTA.TOYOTA_RAV4_PRIME), # SecOC longitudinal + CarTestRoute("8bfb000e03b2a257/00000004--f9eee5f52e", TOYOTA.TOYOTA_SIENNA_4TH_GEN), # SecOC + CarTestRoute("0b54d0594d924cd9/00000057--b6206a3205", TOYOTA.TOYOTA_YARIS), # SecOC + CarTestRoute("7a31f030957b9c85/2023-04-01--14-12-51", TOYOTA.LEXUS_ES), + # CarTestRoute("37041c500fd30100/2020-12-30--12-17-24", TOYOTA.LEXUS_ES), # hybrid + CarTestRoute("e6a24be49a6cd46e/2019-10-29--10-52-42", TOYOTA.LEXUS_ES_TSS2), + CarTestRoute("f49e8041283f2939/2019-05-30--11-51-51", TOYOTA.LEXUS_ES_TSS2), # hybrid + CarTestRoute("da23c367491f53e2/2021-05-21--09-09-11", TOYOTA.LEXUS_CTH, segment=3), + CarTestRoute("32696cea52831b02/2021-11-19--18-13-30", TOYOTA.LEXUS_RC), + CarTestRoute("7f8f479cfa6f392a/00000001--9a84b69c9d", TOYOTA.LEXUS_RC_TSS2), + CarTestRoute("ab9b64a5e5960cba/2023-10-24--17-32-08", TOYOTA.LEXUS_GS_F), + CarTestRoute("886fcd8408d570e9/2020-01-29--02-18-55", TOYOTA.LEXUS_RX), + CarTestRoute("d27ad752e9b08d4f/2021-05-26--19-39-51", TOYOTA.LEXUS_RX), # hybrid + CarTestRoute("01b22eb2ed121565/2020-02-02--11-25-51", TOYOTA.LEXUS_RX_TSS2), + CarTestRoute("b74758c690a49668/2020-05-20--15-58-57", TOYOTA.LEXUS_RX_TSS2), # hybrid + CarTestRoute("964c09eb11ca8089/2020-11-03--22-04-00", TOYOTA.LEXUS_NX), + CarTestRoute("ec429c0f37564e3c/2020-02-01--17-28-12", TOYOTA.LEXUS_NX), # hybrid + CarTestRoute("3fd5305f8b6ca765/2021-04-28--19-26-49", TOYOTA.LEXUS_NX_TSS2), + CarTestRoute("09ae96064ed85a14/2022-06-09--12-22-31", TOYOTA.LEXUS_NX_TSS2), # hybrid + CarTestRoute("4765fbbf59e3cd88/2024-02-06--17-45-32", TOYOTA.LEXUS_LC_TSS2), + CarTestRoute("5afee5161ea1dcde/00000003--b8ae16aae0", TOYOTA.LEXUS_LS), + CarTestRoute("0a302ffddbb3e3d3/2020-02-08--16-19-08", TOYOTA.TOYOTA_HIGHLANDER_TSS2), + CarTestRoute("437e4d2402abf524/2021-05-25--07-58-50", TOYOTA.TOYOTA_HIGHLANDER_TSS2), # hybrid + CarTestRoute("3183cd9b021e89ce/2021-05-25--10-34-44", TOYOTA.TOYOTA_HIGHLANDER), + CarTestRoute("80d16a262e33d57f/2021-05-23--20-01-43", TOYOTA.TOYOTA_HIGHLANDER), # hybrid + CarTestRoute("eb6acd681135480d/2019-06-20--20-00-00", TOYOTA.TOYOTA_SIENNA), + CarTestRoute("2e07163a1ba9a780/2019-08-25--13-15-13", TOYOTA.LEXUS_IS), + CarTestRoute("649bf2997ada6e3a/2023-08-08--18-04-22", TOYOTA.LEXUS_IS_TSS2), + CarTestRoute("0a0de17a1e6a2d15/2020-09-21--21-24-41", TOYOTA.TOYOTA_PRIUS_TSS2), + CarTestRoute("9b36accae406390e/2021-03-30--10-41-38", TOYOTA.TOYOTA_MIRAI), + CarTestRoute("cd9cff4b0b26c435/2021-05-13--15-12-39", TOYOTA.TOYOTA_CHR), + CarTestRoute("57858ede0369a261/2021-05-18--20-34-20", TOYOTA.TOYOTA_CHR), # hybrid + CarTestRoute("ea8fbe72b96a185c/2023-02-08--15-11-46", TOYOTA.TOYOTA_CHR_TSS2), + CarTestRoute("ea8fbe72b96a185c|2023-02-22--09-20-34", TOYOTA.TOYOTA_CHR_TSS2), # openpilot longitudinal, with smartDSU + CarTestRoute("6719965b0e1d1737/2023-02-09--22-44-05", TOYOTA.TOYOTA_CHR_TSS2), # hybrid + CarTestRoute("6719965b0e1d1737/2023-08-29--06-40-05", TOYOTA.TOYOTA_CHR_TSS2), # hybrid, openpilot longitudinal, radar disabled + CarTestRoute("14623aae37e549f3/2021-10-24--01-20-49", TOYOTA.TOYOTA_PRIUS_V), + + CarTestRoute("202c40641158a6e5/2021-09-21--09-43-24", VOLKSWAGEN.VOLKSWAGEN_ARTEON_MK1), + CarTestRoute("2c68dda277d887ac/2021-05-11--15-22-20", VOLKSWAGEN.VOLKSWAGEN_ATLAS_MK1), + CarTestRoute("ffcd23abbbd02219/2024-02-28--14-59-38", VOLKSWAGEN.VOLKSWAGEN_CADDY_MK3), + CarTestRoute("cae14e88932eb364/2021-03-26--14-43-28", VOLKSWAGEN.VOLKSWAGEN_GOLF_MK7), # Stock ACC + CarTestRoute("3cfdec54aa035f3f/2022-10-13--14-58-58", VOLKSWAGEN.VOLKSWAGEN_GOLF_MK7), # openpilot longitudinal + CarTestRoute("578742b26807f756|00000010--41ee3e5bec", VOLKSWAGEN.VOLKSWAGEN_JETTA_MK6), + CarTestRoute("58a7d3b707987d65/2021-03-25--17-26-37", VOLKSWAGEN.VOLKSWAGEN_JETTA_MK7), + CarTestRoute("4d134e099430fba2/2021-03-26--00-26-06", VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK8), + CarTestRoute("b29ee8c5a0a735d1|000000dc--a384e9083e", VOLKSWAGEN.VOLKSWAGEN_PASSAT_NMS, segment=0), + CarTestRoute("0f53129ed44f6920|00000287--3efbddeb96", VOLKSWAGEN.VOLKSWAGEN_PASSAT_NMS, segment=0), + CarTestRoute("cecfd0ca8552b71c|00000057--a1a1986651", VOLKSWAGEN.PORSCHE_MACAN_MK1, segment=0), + CarTestRoute("0cd0b7f7e31a3853/2021-11-03--19-30-22", VOLKSWAGEN.VOLKSWAGEN_POLO_MK6), + CarTestRoute("064d1816e448f8eb/2022-09-29--15-32-34", VOLKSWAGEN.VOLKSWAGEN_SHARAN_MK2), + CarTestRoute("7d82b2f3a9115f1f/2021-10-21--15-39-42", VOLKSWAGEN.VOLKSWAGEN_TAOS_MK1), + CarTestRoute("2744c89a8dda9a51/2021-07-24--21-28-06", VOLKSWAGEN.VOLKSWAGEN_TCROSS_MK1), + CarTestRoute("2cef8a0b898f331a/2021-03-25--20-13-57", VOLKSWAGEN.VOLKSWAGEN_TIGUAN_MK2), + CarTestRoute("a589dcc642fdb10a/2021-06-14--20-54-26", VOLKSWAGEN.VOLKSWAGEN_TOURAN_MK2), + CarTestRoute("a459f4556782eba1/2021-09-19--09-48-00", VOLKSWAGEN.VOLKSWAGEN_TRANSPORTER_T61), + CarTestRoute("0cd0b7f7e31a3853/2021-11-18--00-38-32", VOLKSWAGEN.VOLKSWAGEN_TROC_MK1), + CarTestRoute("59c5dc50499d9d08/00000003--98586d2894", VOLKSWAGEN.VOLKSWAGEN_GOLF_MK8), + CarTestRoute("2b0e2b387c87c150/0000008f--7e47fb87d9", VOLKSWAGEN.VOLKSWAGEN_ID3_MK1), + CarTestRoute("db724585e1a2cceb/00000020--dbc57cf788", VOLKSWAGEN.VOLKSWAGEN_ID3_MK2), + CarTestRoute("fc76cf2b65550db6/00000091--5b1f61e718", VOLKSWAGEN.VOLKSWAGEN_ID4_MK1), + CarTestRoute("db724585e1a2cceb/00000124--f458af698a", VOLKSWAGEN.VOLKSWAGEN_ID4_MK2), + CarTestRoute("20e3cd4f0d5f39d1/00000091--d240bf0b44", VOLKSWAGEN.VOLKSWAGEN_PASSAT_B7), + CarTestRoute("79b0a26c081d6d6c/00000083--8407f96a1e", VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK7), + CarTestRoute("cc7e1fc0ce4ec686/00000004--dddc5bf4b6", VOLKSWAGEN.VOLKSWAGEN_PASSAT_NMS_PLUS), + CarTestRoute("07667b885add75fd/2021-01-23--19-48-42", VOLKSWAGEN.AUDI_A3_MK3), + CarTestRoute("c8b7d4cd76391e07|00000000--c42dead9c6", VOLKSWAGEN.AUDI_A4_MK4, segment=29), + CarTestRoute("5432d2499e17e646/000000e8--9ce8cf6d58", VOLKSWAGEN.AUDI_Q5_MK1), + CarTestRoute("6c6b466346192818/2021-06-06--14-17-47", VOLKSWAGEN.AUDI_Q2_MK1), + CarTestRoute("0cd0b7f7e31a3853/2021-12-03--03-12-05", VOLKSWAGEN.AUDI_Q3_MK2), + CarTestRoute("8f205bdd11bcbb65/2021-03-26--01-00-17", VOLKSWAGEN.SEAT_ATECA_MK1), + CarTestRoute("fc6b6c9a3471c846/2021-05-27--13-39-56", VOLKSWAGEN.SEAT_ATECA_MK1), # Leon + CarTestRoute("0bbe367c98fa1538/2023-03-04--17-46-11", VOLKSWAGEN.SKODA_FABIA_MK4), + CarTestRoute("12d6ae3057c04b0d/2021-09-15--00-04-07", VOLKSWAGEN.SKODA_KAMIQ_MK1), + CarTestRoute("12d6ae3057c04b0d/2021-09-04--21-21-21", VOLKSWAGEN.SKODA_KAROQ_MK1), + CarTestRoute("90434ff5d7c8d603/2021-03-15--12-07-31", VOLKSWAGEN.SKODA_KODIAQ_MK1), + CarTestRoute("66e5edc3a16459c5/2021-05-25--19-00-29", VOLKSWAGEN.SKODA_OCTAVIA_MK3), + CarTestRoute("026b6d18fba6417f/2021-03-26--09-17-04", VOLKSWAGEN.SKODA_KAMIQ_MK1), # Scala + CarTestRoute("b2e9858e29db492b/2021-03-26--16-58-42", VOLKSWAGEN.SKODA_SUPERB_MK3), + + CarTestRoute("3c8f0c502e119c1c/2020-06-30--12-58-02", SUBARU.SUBARU_ASCENT), + CarTestRoute("c321c6b697c5a5ff/2020-06-23--11-04-33", SUBARU.SUBARU_FORESTER), + CarTestRoute("791340bc01ed993d/2019-03-10--16-28-08", SUBARU.SUBARU_IMPREZA), + CarTestRoute("8bf7e79a3ce64055/2021-05-24--09-36-27", SUBARU.SUBARU_IMPREZA_2020), + CarTestRoute("8de015561e1ea4a0/2023-08-29--17-08-31", SUBARU.SUBARU_IMPREZA), # openpilot longitudinal + # CarTestRoute("c3d1ccb52f5f9d65/2023-07-22--01-23-20", SUBARU.OUTBACK, segment=9), # gen2 longitudinal, eyesight disabled + CarTestRoute("1bbe6bf2d62f58a8/2022-07-14--17-11-43", SUBARU.SUBARU_OUTBACK, segment=10), + CarTestRoute("c56e69bbc74b8fad/2022-08-18--09-43-51", SUBARU.SUBARU_LEGACY, segment=3), + CarTestRoute("f4e3a0c511a076f4/2022-08-04--16-16-48", SUBARU.SUBARU_CROSSTREK_HYBRID, segment=2), + CarTestRoute("7fd1e4f3a33c1673/2022-12-04--15-09-53", SUBARU.SUBARU_FORESTER_2022, segment=4), + CarTestRoute("f3b34c0d2632aa83/2023-07-23--20-43-25", SUBARU.SUBARU_OUTBACK_2023, segment=7), + CarTestRoute("99437cef6d5ff2ee/2023-03-13--21-21-38", SUBARU.SUBARU_ASCENT_2023, segment=7), + # Pre-global, dashcam + CarTestRoute("95441c38ae8c130e/2020-06-08--12-10-17", SUBARU.SUBARU_FORESTER_PREGLOBAL), + CarTestRoute("df5ca7660000fba8/2020-06-16--17-37-19", SUBARU.SUBARU_LEGACY_PREGLOBAL), + CarTestRoute("5ab784f361e19b78/2020-06-08--16-30-41", SUBARU.SUBARU_OUTBACK_PREGLOBAL), + CarTestRoute("e19eb5d5353b1ac1/2020-08-09--14-37-56", SUBARU.SUBARU_OUTBACK_PREGLOBAL_2018), + + CarTestRoute("fbbfa6af821552b9/2020-03-03--08-09-43", NISSAN.NISSAN_XTRAIL), + CarTestRoute("5b7c365c50084530/2020-03-25--22-10-13", NISSAN.NISSAN_LEAF), + CarTestRoute("22c3dcce2dd627eb/2020-12-30--16-38-48", NISSAN.NISSAN_LEAF_IC), + CarTestRoute("059ab9162e23198e/2020-05-30--09-41-01", NISSAN.NISSAN_ROGUE), + CarTestRoute("b72d3ec617c0a90f/2020-12-11--15-38-17", NISSAN.NISSAN_ALTIMA), + + CarTestRoute("32a319f057902bb3/2020-04-27--15-18-58", MAZDA.MAZDA_CX5), + CarTestRoute("10b5a4b380434151/2020-08-26--17-11-45", MAZDA.MAZDA_CX9), + CarTestRoute("74f1038827005090/2020-08-26--20-05-50", MAZDA.MAZDA_3), + CarTestRoute("fb53c640f499b73d/2021-06-01--04-17-56", MAZDA.MAZDA_6), + CarTestRoute("f6d5b1a9d7a1c92e/2021-07-08--06-56-59", MAZDA.MAZDA_CX9_2021), + CarTestRoute("a4af1602d8e668ac/2022-02-03--12-17-07", MAZDA.MAZDA_CX5_2022), + + CarTestRoute("6a7075a4fdd765ee/0000004e--1f612006dd", PSA.PSA_PEUGEOT_208), + + CarTestRoute("bc095dc92e101734/000000db--ee9fe46e57", RIVIAN.RIVIAN_R1_GEN1), + + CarTestRoute("7dc058789994da80/00000112--adb970f6a8", TESLA.TESLA_MODEL_3), + CarTestRoute("c8a98e58647765ad/00000002--84e4746136", TESLA.TESLA_MODEL_Y), + CarTestRoute("2c912ca5de3b1ee9/0000025d--6eb6bcbca4", TESLA.TESLA_MODEL_Y, segment=4), + CarTestRoute("bdda168c0c35fad7/00000001--5c5a36ec06", TESLA.TESLA_MODEL_X), # openpilot longitudinal + + # Segments that test specific issues + # Controls mismatch due to standstill threshold + CarTestRoute("bec2dcfde6a64235/2022-04-08--14-21-32", HONDA.HONDA_CRV_HYBRID, segment=22), +] diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_can_fingerprint.py b/artifacts/package_runtime/iqdbc/car/tests/test_can_fingerprint.py new file mode 100644 index 000000000..77ffcdfa3 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_can_fingerprint.py @@ -0,0 +1,55 @@ +import pytest +from iqdbc.car.can_definitions import CanData +from iqdbc.car.car_helpers import FRAME_FINGERPRINT, can_fingerprint +from iqdbc.car.fingerprints import _FINGERPRINTS as FINGERPRINTS + + +class TestCanFingerprint: + @pytest.mark.parametrize("car_model, fingerprints", FINGERPRINTS.items()) + def test_can_fingerprint(self, car_model, fingerprints): + """Tests online fingerprinting function on offline fingerprints""" + + for fingerprint in fingerprints: # can have multiple fingerprints for each platform + can = [CanData(address=address, dat=b'\x00' * length, src=src) + for address, length in fingerprint.items() for src in (0, 1)] + + fingerprint_iter = iter([can]) + car_fingerprint, finger = can_fingerprint(lambda **kwargs: [next(fingerprint_iter, [])]) # noqa: B023 + + assert car_fingerprint == car_model + assert finger[0] == fingerprint + assert finger[1] == fingerprint + assert finger[2] == {} + + def test_timing(self, subtests): + # just pick any CAN fingerprinting car + car_model = "CHEVROLET_BOLT_EUV" + fingerprint = FINGERPRINTS[car_model][0] + + cases = [] + + # case 1 - one match, make sure we keep going for 100 frames + can = [CanData(address=address, dat=b'\x00' * length, src=src) + for address, length in fingerprint.items() for src in (0, 1)] + cases.append((FRAME_FINGERPRINT, car_model, can)) + + # case 2 - no matches, make sure we keep going for 100 frames + can = [CanData(address=1, dat=b'\x00' * 1, src=src) for src in (0, 1)] # uncommon address + cases.append((FRAME_FINGERPRINT, None, can)) + + # case 3 - multiple matches, make sure we keep going for 200 frames to try to eliminate some + can = [CanData(address=2016, dat=b'\x00' * 8, src=src) for src in (0, 1)] # common address + cases.append((FRAME_FINGERPRINT * 2, None, can)) + + for expected_frames, car_model, can in cases: + with subtests.test(expected_frames=expected_frames, car_model=car_model): + frames = 0 + + def can_recv(**kwargs): + nonlocal frames + frames += 1 + return [can] # noqa: B023 + + car_fingerprint, _ = can_fingerprint(can_recv) + assert car_fingerprint == car_model + assert frames == expected_frames + 2 # TODO: fix extra frames diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_car_interfaces.py b/artifacts/package_runtime/iqdbc/car/tests/test_car_interfaces.py new file mode 100644 index 000000000..54cc2ae72 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_car_interfaces.py @@ -0,0 +1,200 @@ +import inspect +import math +import os +import subprocess +import sys +import hypothesis.strategies as st +import pytest +from functools import cache +from hypothesis import Phase, given, settings +from collections.abc import Callable +from typing import Any + +from iqdbc.car import DT_CTRL, CanData, structs +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.fingerprints import FW_VERSIONS +from iqdbc.car.fw_versions import FW_QUERY_CONFIGS +from iqdbc.car.interfaces import CarInterfaceBase, get_interface_attr +from iqdbc.car.mock.values import CAR as MOCK +from iqdbc.car.values import PLATFORMS + +DrawType = Callable[[st.SearchStrategy], Any] + +ALL_ECUS = {ecu for ecus in FW_VERSIONS.values() for ecu in ecus.keys()} +ALL_ECUS |= {ecu for config in FW_QUERY_CONFIGS.values() for ecu in config.extra_ecus} + +ALL_REQUESTS = {tuple(r.request) for config in FW_QUERY_CONFIGS.values() for r in config.requests} + +# From panda/python/__init__.py +DLC_TO_LEN = [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64] + +MAX_EXAMPLES = int(os.environ.get('MAX_EXAMPLES', '15')) +SIGNED_RUNTIME_BRANDS = {"tesla", "volkswagen"} +SIGNED_RUNTIME_PLATFORMS = tuple(car_name for car_name in sorted(PLATFORMS) + if interfaces[car_name].__module__.split(".")[-2] in SIGNED_RUNTIME_BRANDS) +PUBLIC_INTERFACE_PLATFORMS = tuple(car_name for car_name in sorted(PLATFORMS) + if car_name not in SIGNED_RUNTIME_PLATFORMS) + + +@cache +def get_fuzzy_strategy(): + # Fuzzy CAN fingerprints and FW versions to test more states of the CarInterface + fingerprint_strategy = st.fixed_dictionaries({0: st.dictionaries(st.integers(min_value=0, max_value=0x800), + st.sampled_from(DLC_TO_LEN))}) + + # only pick from possible ecus to reduce search space + car_fw_strategy = st.lists(st.builds( + lambda fw, req: structs.CarParams.CarFw(ecu=fw[0], address=fw[1], subAddress=fw[2] or 0, request=req), + st.sampled_from(sorted(ALL_ECUS)), + st.sampled_from(sorted(ALL_REQUESTS)), + )) + + params_strategy = st.fixed_dictionaries({ + 'fingerprints': fingerprint_strategy, + 'car_fw': car_fw_strategy, + 'alpha_long': st.booleans(), + }) + return params_strategy + + +def get_fuzzy_car_interface(car_name: str, draw: DrawType) -> CarInterfaceBase: + params: dict = draw(get_fuzzy_strategy()) + # reduce search space by duplicating CAN fingerprints across all buses + params['fingerprints'] |= {key + 1: params['fingerprints'][0] for key in range(6)} + + # initialize car interface + CarInterface = interfaces[car_name] + car_params = CarInterface.get_params(car_name, params['fingerprints'], params['car_fw'], + alpha_long=params['alpha_long'], is_release=False, docs=False) + car_params_iq = CarInterface.get_params_iq(car_params, car_name, params['fingerprints'], params['car_fw'], + alpha_long=params['alpha_long'], is_release_iq=False, docs=False) + return CarInterface(car_params, car_params_iq) + + +class TestCarInterfaces: + def test_init_contract(self): + for car_interface in set(interfaces.values()): + parameters = tuple(inspect.signature(car_interface.init).parameters) + assert parameters[:4] == ("CP", "CP_IQ", "can_recv", "can_send") + + # FIXME: Due to the lists used in carParams, Phase.target is very slow and will cause + # many generated examples to overrun when max_examples > ~20, don't use it + @pytest.mark.parametrize("car_name", PUBLIC_INTERFACE_PLATFORMS) + @settings(max_examples=MAX_EXAMPLES, deadline=None, + phases=(Phase.reuse, Phase.generate, Phase.shrink)) + @given(data=st.data()) + def test_car_interfaces(self, car_name, data): + car_interface = get_fuzzy_car_interface(car_name, data.draw) + car_params = car_interface.CP.as_reader() + car_params_iq = car_interface.CP_IQ + + assert car_params.mass > 1 + assert car_params.wheelbase > 0 + # centerToFront is center of gravity to front wheels, assert a reasonable range + assert car_params.wheelbase * 0.3 < car_params.centerToFront < car_params.wheelbase * 0.7 + assert car_params.maxLateralAccel > 0 + + # Longitudinal sanity checks + assert len(car_params.longitudinalTuning.kpV) == len(car_params.longitudinalTuning.kpBP) + assert len(car_params.longitudinalTuning.kiV) == len(car_params.longitudinalTuning.kiBP) + + # If we're using the interceptor for gasPressed, we should be commanding gas with it + if car_params_iq.enableGasInterceptor: + assert car_params.openpilotLongitudinalControl + + # Lateral sanity checks + if car_params.steerControlType not in (structs.CarParams.SteerControlType.angle, + structs.CarParams.SteerControlType.curvatureDEPRECATED): + tune = car_params.lateralTuning + if tune.which() == 'pid': + if car_name != MOCK.MOCK: + assert not math.isnan(tune.pid.kf) and tune.pid.kf > 0 + assert len(tune.pid.kpV) > 0 and len(tune.pid.kpV) == len(tune.pid.kpBP) + assert len(tune.pid.kiV) > 0 and len(tune.pid.kiV) == len(tune.pid.kiBP) + + elif tune.which() == 'torque': + assert not math.isnan(tune.torque.latAccelFactor) and tune.torque.latAccelFactor > 0 + assert not math.isnan(tune.torque.friction) and tune.torque.friction > 0 + + # Run car interface + # TODO: use hypothesis to generate random messages + now_nanos = 0 + CC = structs.CarControl().as_reader() + CC_IQ = structs.IQCarControl() + for _ in range(10): + car_interface.update([]) + car_interface.apply(CC, CC_IQ, now_nanos) + now_nanos += DT_CTRL * 1e9 # 10 ms + + CC = structs.CarControl() + CC.enabled = True + CC.latActive = True + CC.longActive = True + CC = CC.as_reader() + for _ in range(10): + car_interface.update([]) + car_interface.apply(CC, CC_IQ, now_nanos) + now_nanos += DT_CTRL * 1e9 # 10ms + + # Test radar interface + radar_interface = car_interface.RadarInterface(car_params, car_params_iq) + assert radar_interface + + # Run radar interface once + radar_interface.update([]) + if not car_params.radarUnavailable and radar_interface.rcp is not None and \ + hasattr(radar_interface, '_update') and hasattr(radar_interface, 'trigger_msg'): + radar_interface._update([radar_interface.trigger_msg]) + + # Test radar fault + if not car_params.radarUnavailable and radar_interface.rcp is not None: + cans = [(0, [CanData(0, b'', 0) for _ in range(5)])] + rr = radar_interface.update(cans) + assert rr is None or len(rr.errors) > 0 + + @pytest.mark.parametrize("car_name", SIGNED_RUNTIME_PLATFORMS) + def test_signed_runtime_params(self, car_name): + car_interface = interfaces[car_name] + fingerprints = {bus: {} for bus in range(7)} + car_params = car_interface.get_params(car_name, fingerprints, [], alpha_long=False, is_release=False, docs=False) + car_params_iq = car_interface.get_params_iq(car_params, car_name, fingerprints, [], + alpha_long=False, is_release_iq=False, docs=False) + assert car_params.mass > 1 + assert car_params.wheelbase > 0 + assert car_params.maxLateralAccel > 0 + assert car_params_iq is not None + + def test_interface_attrs(self): + """Asserts basic behavior of interface attribute getter""" + num_brands = len(get_interface_attr('CAR')) + assert num_brands >= 12 + + # Should return value for all brands when not combining, even if attribute doesn't exist + ret = get_interface_attr('FAKE_ATTR') + assert len(ret) == num_brands + + # Make sure we can combine dicts + ret = get_interface_attr('DBC', combine_brands=True) + assert len(ret) >= 160 + + # We don't support combining non-dicts + ret = get_interface_attr('CAR', combine_brands=True) + assert len(ret) == 0 + + # If brand has None value, it shouldn't return when ignore_none=True is specified + none_brands = {b for b, v in get_interface_attr('FINGERPRINTS').items() if v is None} + assert len(none_brands) >= 1 + + ret = get_interface_attr('FINGERPRINTS', ignore_none=True) + none_brands_in_ret = none_brands.intersection(ret) + assert len(none_brands_in_ret) == 0, f'Brands with None values in ignore_none=True result: {none_brands_in_ret}' + + +def test_interface_discovery_does_not_load_private_runtime(): + code = "; ".join(( + "import sys", + "sys.modules['iqpilot.system.proprietary_runtime._verified_import'] = None", + "from iqdbc.car.car_helpers import interfaces", + "assert len(interfaces) >= 300", + )) + subprocess.run([sys.executable, "-c", code], check=True) diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_disable_ecu.py b/artifacts/package_runtime/iqdbc/car/tests/test_disable_ecu.py new file mode 100644 index 000000000..5fd22afeb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_disable_ecu.py @@ -0,0 +1,93 @@ +from iqdbc.car.can_definitions import CanData +from iqdbc.car.disable_ecu import (CLEAR_DTC_ISOTP_SF, CLEAR_DTC_REQUEST, EXT_DIAG_REQUEST, + FUNCTIONAL_ADDR_29BIT, clear_all_dtcs, clear_ecu_dtcs, disable_ecu) + +RADAR_ADDR = 0x18DAB0F1 +COM_CONT_REQUEST = b'\x28\x83\x03' + + +class QueryRecorder: + def __init__(self): + self.requests = [] + + def make_fake_query(self): + recorder = self + + class FakeIsoTpParallelQuery: + def __init__(self, can_send, can_recv, bus, addrs, requests, responses, response_offset=0x8): + self.bus = bus + self.addrs = addrs + self.request = requests[0] + recorder.requests.append((bus, addrs[0][0], requests[0])) + + def get_data(self, timeout): + return {(self.addrs[0][0], None): b''} + + return FakeIsoTpParallelQuery + + +def test_clear_all_dtcs_broadcasts_single_frame(): + sent = [] + clear_all_dtcs(lambda msgs: sent.extend(msgs), [0, 2]) + + assert sent == [ + CanData(FUNCTIONAL_ADDR_29BIT, CLEAR_DTC_ISOTP_SF, 0), + CanData(FUNCTIONAL_ADDR_29BIT, CLEAR_DTC_ISOTP_SF, 2), + ] + + +def test_clear_dtc_isotp_framing(): + assert len(CLEAR_DTC_ISOTP_SF) == 8 + assert CLEAR_DTC_ISOTP_SF[0] == len(CLEAR_DTC_REQUEST) + assert CLEAR_DTC_ISOTP_SF[1:1 + len(CLEAR_DTC_REQUEST)] == CLEAR_DTC_REQUEST + assert CLEAR_DTC_REQUEST == b'\x14\xff\xff\xff' + + +def test_clear_ecu_dtcs_sequence(mocker): + recorder = QueryRecorder() + mocker.patch("iqdbc.car.disable_ecu.IsoTpParallelQuery", recorder.make_fake_query()) + + assert clear_ecu_dtcs(None, None, bus=0, addr=RADAR_ADDR) + assert recorder.requests == [ + (0, RADAR_ADDR, EXT_DIAG_REQUEST), + (0, RADAR_ADDR, CLEAR_DTC_REQUEST), + ] + + +def test_disable_ecu_sequence(mocker): + recorder = QueryRecorder() + mocker.patch("iqdbc.car.disable_ecu.IsoTpParallelQuery", recorder.make_fake_query()) + + assert disable_ecu(None, None, bus=1, addr=RADAR_ADDR, com_cont_req=COM_CONT_REQUEST) + assert recorder.requests == [ + (1, RADAR_ADDR, EXT_DIAG_REQUEST), + (1, RADAR_ADDR, COM_CONT_REQUEST), + ] + + +def test_disable_ecu_clears_dtcs_before_comm_control(mocker): + recorder = QueryRecorder() + mocker.patch("iqdbc.car.disable_ecu.IsoTpParallelQuery", recorder.make_fake_query()) + + assert disable_ecu(None, None, bus=1, addr=RADAR_ADDR, com_cont_req=COM_CONT_REQUEST, clear_dtc=True) + assert recorder.requests == [ + (1, RADAR_ADDR, EXT_DIAG_REQUEST), + (1, RADAR_ADDR, CLEAR_DTC_REQUEST), + (1, RADAR_ADDR, COM_CONT_REQUEST), + ] + + +def test_disable_ecu_retries_then_fails(mocker): + attempts = [] + + class NoResponseQuery: + def __init__(self, can_send, can_recv, bus, addrs, requests, responses, response_offset=0x8): + attempts.append(requests[0]) + + def get_data(self, timeout): + return {} + + mocker.patch("iqdbc.car.disable_ecu.IsoTpParallelQuery", NoResponseQuery) + + assert not disable_ecu(None, None, addr=RADAR_ADDR, retry=3) + assert attempts == [EXT_DIAG_REQUEST] * 3 diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_docs.py b/artifacts/package_runtime/iqdbc/car/tests/test_docs.py new file mode 100644 index 000000000..54c5c6003 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_docs.py @@ -0,0 +1,75 @@ +from collections import defaultdict + +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.docs import get_all_car_docs +from iqdbc.car.docs_definitions import Cable, Column, PartType, Star, SupportType +from iqdbc.car.honda.values import CAR as HONDA +from iqdbc.car.values import PLATFORMS + + +class TestCarDocs: + @classmethod + def setup_class(cls): + cls.all_cars = get_all_car_docs() + + def test_duplicate_years(self, subtests): + make_model_years = defaultdict(list) + for car in self.all_cars: + if car.support_type != SupportType.UPSTREAM: + continue + with subtests.test(car_docs_name=car.name): + make_model = (car.make, car.model) + for year in car.year_list: + assert year not in make_model_years[make_model], f"{car.name}: Duplicate model year" + make_model_years[make_model].append(year) + + def test_missing_car_docs(self, subtests): + all_car_docs_platforms = [name for name, config in PLATFORMS.items()] + for platform in sorted(interfaces.keys()): + with subtests.test(platform=platform): + assert platform in all_car_docs_platforms, f"Platform: {platform} doesn't have a CarDocs entry" + + def test_naming_conventions(self, subtests): + # Asserts market-standard car naming conventions by brand + for car in self.all_cars: + with subtests.test(car=car.name): + tokens = car.model.lower().split(" ") + if car.brand == "hyundai": + assert "phev" not in tokens, "Use `Plug-in Hybrid`" + assert "hev" not in tokens, "Use `Hybrid`" + if "plug-in hybrid" in car.model.lower(): + assert "Plug-in Hybrid" in car.model, "Use correct capitalization" + if car.make != "Kia": + assert "ev" not in tokens, "Use `Electric`" + elif car.brand == "toyota": + if "rav4" in tokens: + assert "RAV4" in car.model, "Use correct capitalization" + + def test_torque_star(self, subtests): + # Asserts brand-specific assumptions around steering torque star + for car in self.all_cars: + with subtests.test(car=car.name): + # honda sanity check, it's the definition of a no torque star + if car.car_fingerprint in (HONDA.HONDA_ACCORD, HONDA.HONDA_CIVIC, HONDA.HONDA_CRV, HONDA.HONDA_ODYSSEY, HONDA.HONDA_ODYSSEY_TWN, HONDA.HONDA_PILOT): + assert car.row[Column.STEERING_TORQUE] == Star.EMPTY, f"{car.name} has full torque star" + elif car.brand in ("toyota", "hyundai"): + assert car.row[Column.STEERING_TORQUE] != Star.EMPTY, f"{car.name} has no torque star" + + def test_year_format(self, subtests): + for car in self.all_cars: + if car.name == "comma body": + continue + with subtests.test(car=car.name): + assert car.years and car.year_list, f"Format years correctly: {car.name}" + + def test_harnesses(self, subtests): + for car in self.all_cars: + if car.name == "comma body" or car.support_type != SupportType.UPSTREAM: + continue + with subtests.test(car=car.name): + car_part_type = [p.part_type for p in car.car_parts.all_parts()] + car_parts = list(car.car_parts.all_parts()) + assert len(car_parts) > 0, f"Need to specify car parts: {car.name}" + assert car_part_type.count(PartType.connector) == 1, f"Need to specify one harness connector: {car.name}" + assert car_part_type.count(PartType.mount) == 1, f"Need to specify one mount: {car.name}" + assert Cable.obd_c_cable_2ft in car_parts, f"Need to specify an OBD-C cable (2ft): {car.name}" diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_fw_fingerprint.py b/artifacts/package_runtime/iqdbc/car/tests/test_fw_fingerprint.py new file mode 100644 index 000000000..b6f5a40f5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_fw_fingerprint.py @@ -0,0 +1,355 @@ +import pytest +import random +import time +from collections import defaultdict + +from iqdbc.car.can_definitions import CanData +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.structs import CarParams +from iqdbc.car.fingerprints import FW_VERSIONS +from iqdbc.car.fw_versions import FW_QUERY_CONFIGS, FUZZY_EXCLUDE_ECUS, VERSIONS, build_fw_dict, \ + match_fw_to_car, get_brand_ecu_matches, get_fw_versions, get_present_ecus +from iqdbc.car.vin import get_vin + +CarFw = CarParams.CarFw +Ecu = CarParams.Ecu + +ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()} + +VALID_VERSION_SETS = [ + (brand, car_model, ecus) + for brand, brand_versions in VERSIONS.items() + for car_model, ecus in brand_versions.items() + if ecus and all(fw_versions for fw_versions in ecus.values()) +] +CUSTOM_FUZZY_VERSION_SETS = [ + (brand, car_model, ecus) + for brand, car_model, ecus in VALID_VERSION_SETS + if FW_QUERY_CONFIGS[brand].match_fw_to_car_fuzzy is not None +] +FUZZY_VERSION_SETS = [ + (brand, car_model, ecus) + for brand, car_model, ecus in VALID_VERSION_SETS + if any(ecu[0] not in FUZZY_EXCLUDE_ECUS for ecu in ecus) +] + + +def representative_vin(car_model): + config = getattr(car_model, "config", None) + wmis = getattr(config, "wmis", set()) + chassis_codes = getattr(config, "chassis_codes", set()) + if not wmis or not chassis_codes: + return "" + + model_years = getattr(config, "model_years", set()) + vin = ["0"] * 17 + vin[0:3] = str(sorted(wmis, key=str)[0]) + vin[6:8] = sorted(chassis_codes)[0] + vin[9] = sorted(model_years)[0] if model_years else "0" + return "".join(vin) + + +class TestFwFingerprint: + def assertFingerprints(self, candidates, expected): + candidates = list(candidates) + assert len(candidates) == 1, f"got more than one candidate: {candidates}" + assert candidates[0] == expected + + @pytest.mark.parametrize("brand, car_model, ecus, test_non_essential", + [(*version_set, test_non_essential) + for version_set in VALID_VERSION_SETS for test_non_essential in (True, False)]) + def test_exact_match(self, brand, car_model, ecus, test_non_essential): + config = FW_QUERY_CONFIGS[brand] + CP = CarParams(carVin=representative_vin(car_model)) + for _ in range(20): + fw = [] + for ecu, fw_versions in ecus.items(): + # Assume non-essential ECUs apply to all cars, so we catch cases where Car A with + # missing ECUs won't match to Car B where only Car B has labeled non-essential ECUs + if ecu[0] in config.non_essential_ecus and test_non_essential: + continue + + ecu_name, addr, sub_addr = ecu + fw.append(CarFw(ecu=ecu_name, fwVersion=random.choice(fw_versions), brand=brand, + address=addr, subAddress=0 if sub_addr is None else sub_addr)) + CP.carFw = fw + _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_fuzzy=False) + if not test_non_essential: + self.assertFingerprints(matches, car_model) + else: + # if we're removing ECUs we expect some match loss, but it shouldn't mismatch + if len(matches) != 0: + self.assertFingerprints(matches, car_model) + + @pytest.mark.parametrize("brand, car_model, ecus", CUSTOM_FUZZY_VERSION_SETS) + def test_custom_fuzzy_match(self, brand, car_model, ecus): + config = FW_QUERY_CONFIGS[brand] + + CP = CarParams() + for _ in range(5): + fw = [] + for ecu, fw_versions in ecus.items(): + ecu_name, addr, sub_addr = ecu + fw.append(CarFw(ecu=ecu_name, fwVersion=random.choice(fw_versions), brand=brand, + address=addr, subAddress=0 if sub_addr is None else sub_addr)) + CP.carFw = fw + _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_exact=False, log=False) + brand_matches = config.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, VERSIONS[brand]) + + # If both have matches, they must agree + if len(matches) == 1 and len(brand_matches) == 1: + assert matches == brand_matches + + @pytest.mark.parametrize("brand, car_model, ecus", FUZZY_VERSION_SETS) + def test_fuzzy_match_ecu_count(self, brand, car_model, ecus): + valid_ecus = [e for e in ecus if e[0] not in FUZZY_EXCLUDE_ECUS] + + fw = [] + for ecu in valid_ecus: + ecu_name, addr, sub_addr = ecu + for _ in range(5): + # Add multiple FW versions to simulate ECU returning to multiple queries in a brand + fw.append(CarFw(ecu=ecu_name, fwVersion=random.choice(ecus[ecu]), brand=brand, + address=addr, subAddress=0 if sub_addr is None else sub_addr)) + CP = CarParams(carFw=fw) + _, matches = match_fw_to_car(CP.carFw, CP.carVin, allow_exact=False, log=False) + + # Assert no match if there are not enough unique ECUs + unique_ecus = {(f.address, f.subAddress) for f in fw} + if len(unique_ecus) < 2: + assert len(matches) == 0, car_model + # There won't always be a match due to shared FW, but if there is it should be correct + elif len(matches): + self.assertFingerprints(matches, car_model) + + def test_fw_version_lists(self, subtests): + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + for ecu, ecu_fw in ecus.items(): + with subtests.test(ecu): + duplicates = {fw for fw in ecu_fw if ecu_fw.count(fw) > 1} + assert not len(duplicates), f'{car_model}: Duplicate FW versions: Ecu.{ecu[0]}, {duplicates}' + assert len(ecu_fw) > 0, f'{car_model}: No FW versions: Ecu.{ecu[0]}' + + def test_all_addrs_map_to_one_ecu(self): + for brand, cars in VERSIONS.items(): + addr_to_ecu = defaultdict(set) + for ecus in cars.values(): + for ecu_type, addr, sub_addr in ecus.keys(): + addr_to_ecu[(addr, sub_addr)].add(ecu_type) + ecus_for_addr = addr_to_ecu[(addr, sub_addr)] + ecu_strings = ", ".join([f'Ecu.{ecu}' for ecu in ecus_for_addr]) + assert len(ecus_for_addr) <= 1, f"{brand} has multiple ECUs that map to one address: {ecu_strings} -> ({hex(addr)}, {sub_addr})" + + def test_data_collection_ecus(self, subtests): + # Asserts no extra ECUs are in the fingerprinting database + for brand, config in FW_QUERY_CONFIGS.items(): + for car_model, ecus in VERSIONS[brand].items(): + bad_ecus = set(ecus).intersection(config.extra_ecus) + with subtests.test(car_model=car_model.value): + assert not len(bad_ecus), f'{car_model}: Fingerprints contain ECUs added for data collection: {bad_ecus}' + + def test_blacklisted_ecus(self, subtests): + blacklisted_addrs = (0x7c4, 0x7d0) # includes A/C ecu and an unknown ecu + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + CP = interfaces[car_model].get_non_essential_params(car_model) + if CP.brand == 'subaru': + for ecu in ecus.keys(): + assert ecu[1] not in blacklisted_addrs, f'{car_model}: Blacklisted ecu: (Ecu.{ecu[0]}, {hex(ecu[1])})' + + elif CP.brand == "chrysler": + # Some HD trucks have a combined TCM and ECM + if CP.carFingerprint.startswith("RAM_HD"): + for ecu in ecus.keys(): + assert ecu[0] != Ecu.transmission, f"{car_model}: Blacklisted ecu: (Ecu.{ecu[0]}, {hex(ecu[1])})" + + def test_missing_versions_and_configs(self, subtests): + brand_versions = set(VERSIONS.keys()) + brand_configs = set(FW_QUERY_CONFIGS.keys()) + if len(brand_configs - brand_versions): + with subtests.test(): + pytest.fail(f"Brands do not implement FW_VERSIONS: {brand_configs - brand_versions}") + + if len(brand_versions - brand_configs): + with subtests.test(): + pytest.fail(f"Brands do not implement FW_QUERY_CONFIG: {brand_versions - brand_configs}") + + # Ensure each brand has at least 1 ECU to query, and extra ECU retrieval + for brand, config in FW_QUERY_CONFIGS.items(): + assert len(config.get_all_ecus({}, include_extra_ecus=False)) == 0 + assert config.get_all_ecus({}) == set(config.extra_ecus) + if len(VERSIONS[brand]) > 0: + assert len(config.get_all_ecus(VERSIONS[brand])) > 0 + + def test_fw_request_ecu_whitelist(self, subtests): + for brand, config in FW_QUERY_CONFIGS.items(): + with subtests.test(brand=brand): + whitelisted_ecus = {ecu for r in config.requests for ecu in r.whitelist_ecus} + brand_ecus = {fw[0] for car_fw in VERSIONS[brand].values() for fw in car_fw} + brand_ecus |= {ecu[0] for ecu in config.extra_ecus} + + # each ecu in brand's fw versions + extra ecus needs to be whitelisted at least once + ecus_not_whitelisted = brand_ecus - whitelisted_ecus + + ecu_strings = ", ".join([f'Ecu.{ecu}' for ecu in ecus_not_whitelisted]) + assert not (len(whitelisted_ecus) and len(ecus_not_whitelisted)), \ + f'{brand.title()}: ECUs not in any FW query whitelists: {ecu_strings}' + + def test_request_ecus_in_versions(self): + # All ECUs in requests should be in the brand's FW versions + for brand, config in FW_QUERY_CONFIGS.items(): + request_ecus = {ecu for r in config.requests for ecu in r.whitelist_ecus} - {ecu[0] for ecu in config.extra_ecus} + print(brand, request_ecus) + version_ecus = config.get_all_ecus(VERSIONS[brand], include_extra_ecus=False) + for request_ecu in request_ecus: + assert request_ecu in {e for e, _, _ in version_ecus}, f"Ecu.{ECU_NAME[request_ecu]} not in {brand} FW versions" + + def test_brand_ecu_matches(self): + brand_matches = get_brand_ecu_matches(set()) + assert len(brand_matches) > 0 + assert all(len(e) and not any(e) for e in brand_matches.values()) + + # we ignore bus + brand_matches = get_brand_ecu_matches({(0x758, 0xf, 99)}) + assert True in brand_matches['toyota'] + assert not any(any(e) for b, e in brand_matches.items() if b != 'toyota') + + +class TestFwFingerprintTiming: + N: int = 5 + TOL: float = 0.05 + + # for patched functions + current_obd_multiplexing: bool + total_time: float + + @staticmethod + def fake_can_send(msgs): + pass + + @staticmethod + def fake_can_recv(wait_for_one: bool = False) -> list[list[CanData]]: + return ([[CanData(random.randint(0x600, 0x800), b'\x00' * 8, 0)]] + if random.uniform(0, 1) > 0.5 else []) + + def fake_set_obd_multiplexing(self, obd_multiplexing): + """The 10Hz blocking params loop adds on average 50ms to the query time for each OBD multiplexing change""" + if obd_multiplexing != self.current_obd_multiplexing: + self.current_obd_multiplexing = obd_multiplexing + self.total_time += 0.1 / 2 + + def fake_get_data(self, timeout): + self.total_time += timeout + return {} + + def _benchmark_brand(self, brand, num_pandas, mocker): + self.total_time = 0 + mocker.patch("iqdbc.car.isotp_parallel_query.IsoTpParallelQuery.get_data", self.fake_get_data) + for _ in range(self.N): + # Treat each brand as the most likely (aka, the first) brand with OBD multiplexing initially on + self.current_obd_multiplexing = True + + t = time.perf_counter() + get_fw_versions(self.fake_can_recv, self.fake_can_send, self.fake_set_obd_multiplexing, brand, num_pandas=num_pandas) + self.total_time += time.perf_counter() - t + + return self.total_time / self.N + + def _assert_timing(self, avg_time, ref_time): + assert avg_time < ref_time + self.TOL + assert avg_time > ref_time - self.TOL, "Performance seems to have improved, update test refs." + + def test_startup_timing(self, subtests, mocker): + # Tests worse-case VIN query time and typical present ECU query time + vin_ref_times = {'worst': 1.6, 'best': 0.8} # best assumes we go through all queries to get a match + present_ecu_ref_time = 0.45 + + def fake_get_ecu_addrs(*_, timeout): + self.total_time += timeout + return set() + + self.total_time = 0.0 + mocker.patch("iqdbc.car.fw_versions.get_ecu_addrs", fake_get_ecu_addrs) + for _ in range(self.N): + self.current_obd_multiplexing = True + get_present_ecus(self.fake_can_recv, self.fake_can_send, self.fake_set_obd_multiplexing, num_pandas=2) + self._assert_timing(self.total_time / self.N, present_ecu_ref_time) + print(f'get_present_ecus, query time={self.total_time / self.N} seconds') + + for name, args in (('worst', {}), ('best', {'retry': 1})): + with subtests.test(name=name): + self.total_time = 0.0 + mocker.patch("iqdbc.car.isotp_parallel_query.IsoTpParallelQuery.get_data", self.fake_get_data) + for _ in range(self.N): + get_vin(self.fake_can_recv, self.fake_can_send, (0, 1), **args) + self._assert_timing(self.total_time / self.N, vin_ref_times[name]) + print(f'get_vin {name} case, query time={self.total_time / self.N} seconds') + + def test_fw_query_timing(self, subtests, mocker): + total_ref_time = {1: 7.7, 2: 8.3} + brand_ref_times = { + 1: { + 'gm': 1.0, + 'body': 0.1, + 'chrysler': 0.3, + 'ford': 1.5, + 'honda': 0.45, + 'hyundai': 0.65, + 'mazda': 0.1, + 'nissan': 0.8, + 'subaru': 0.65, + 'tesla': 0.1, + 'toyota': 0.7, + 'volkswagen': 0.95, + 'rivian': 0.3, + 'psa': 0.1, + }, + 2: { + 'ford': 1.6, + 'hyundai': 1.15, + } + } + + total_times = {1: 0.0, 2: 0.0} + for num_pandas in (1, 2): + for brand, config in FW_QUERY_CONFIGS.items(): + with subtests.test(brand=brand, num_pandas=num_pandas): + avg_time = self._benchmark_brand(brand, num_pandas, mocker) + total_times[num_pandas] += avg_time + avg_time = round(avg_time, 2) + + ref_time = brand_ref_times[num_pandas].get(brand) + if ref_time is None: + # ref time should be same as 1 panda if no aux queries + ref_time = brand_ref_times[num_pandas - 1][brand] + + self._assert_timing(avg_time, ref_time) + print(f'{brand=}, {num_pandas=}, {len(config.requests)=}, avg FW query time={avg_time} seconds') + + for num_pandas in (1, 2): + with subtests.test(brand='all_brands', num_pandas=num_pandas): + total_time = round(total_times[num_pandas], 2) + self._assert_timing(total_time, total_ref_time[num_pandas]) + print(f'all brands, total FW query time={total_time} seconds') + + def test_get_fw_versions(self, subtests, mocker): + # some coverage on IsoTpParallelQuery and panda UDS library + # TODO: replace this with full fingerprint simulation testing + # https://github.com/commaai/panda/pull/1329 + + def fake_carlog_exception(*args, **kwargs): + raise + + t = 0 + + def fake_monotonic(): + nonlocal t + t += 0.0001 + return t + + mocker.patch("iqdbc.car.carlog.carlog.exception", fake_carlog_exception) + mocker.patch("time.monotonic", fake_monotonic) + for brand in FW_QUERY_CONFIGS.keys(): + with subtests.test(brand=brand): + get_fw_versions(self.fake_can_recv, self.fake_can_send, lambda obd: None, brand) diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_lateral_limits.py b/artifacts/package_runtime/iqdbc/car/tests/test_lateral_limits.py new file mode 100644 index 000000000..4181d23cc --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_lateral_limits.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +from collections import defaultdict +import importlib +from parameterized import parameterized_class +import pytest +import sys + +from iqdbc.car import DT_CTRL, structs +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.interfaces import get_torque_params +from iqdbc.car.lateral import ISO_LATERAL_ACCEL +from iqdbc.car.values import PLATFORMS + +# ISO 11270 - allowed up jerk is strictly lower than recommended limits +MAX_LAT_JERK_UP = 2.5 # m/s^3 +MAX_LAT_JERK_DOWN = 5.0 # m/s^3 +MAX_LAT_JERK_UP_TOLERANCE = 0.5 # m/s^3 + +# jerk is measured over half a second +JERK_MEAS_T = 0.5 + + +def torque_platforms(): + platforms = [] + for car_model in sorted(PLATFORMS): + CP = interfaces[car_model].get_non_essential_params(car_model) + if car_model != 'MOCK' and CP.steerControlType == structs.CarParams.SteerControlType.torque and not CP.notCar: + platforms.append(car_model) + return platforms + + +@parameterized_class('car_model', [(car_model,) for car_model in torque_platforms()]) +class TestLateralLimits: + car_model: str + + @classmethod + def setup_class(cls): + CarInterface = interfaces[cls.car_model] + CP = CarInterface.get_non_essential_params(cls.car_model) + + CarControllerParams = importlib.import_module(f'iqdbc.car.{CP.brand}.values').CarControllerParams + cls.control_params = CarControllerParams(CP) + cls.torque_params = get_torque_params()[cls.car_model] + + @staticmethod + def calculate_0_5s_jerk(control_params, torque_params): + steer_step = control_params.STEER_STEP + max_lat_accel = torque_params['MAX_LAT_ACCEL_MEASURED'] + + # Steer up/down delta per 10ms frame, in percentage of max torque + steer_up_per_frame = control_params.STEER_DELTA_UP / control_params.STEER_MAX / steer_step + steer_down_per_frame = control_params.STEER_DELTA_DOWN / control_params.STEER_MAX / steer_step + + # Lateral acceleration reached in 0.5 seconds, clipping to max torque + accel_up_0_5_sec = min(steer_up_per_frame * JERK_MEAS_T / DT_CTRL, 1.0) * max_lat_accel + accel_down_0_5_sec = min(steer_down_per_frame * JERK_MEAS_T / DT_CTRL, 1.0) * max_lat_accel + + # Convert to m/s^3 + return accel_up_0_5_sec / JERK_MEAS_T, accel_down_0_5_sec / JERK_MEAS_T + + def test_jerk_limits(self): + up_jerk, down_jerk = self.calculate_0_5s_jerk(self.control_params, self.torque_params) + assert up_jerk <= MAX_LAT_JERK_UP + MAX_LAT_JERK_UP_TOLERANCE + assert down_jerk <= MAX_LAT_JERK_DOWN + + def test_max_lateral_accel(self): + assert self.torque_params["MAX_LAT_ACCEL_MEASURED"] <= ISO_LATERAL_ACCEL + + +class LatAccelReport: + car_model_jerks: defaultdict[str, dict[str, float]] = defaultdict(dict) + + def pytest_sessionfinish(self): + print(f"\n\n---- Lateral limit report ({len(PLATFORMS)} cars) ----\n") + + max_car_model_len = max([len(car_model) for car_model in self.car_model_jerks]) + for car_model, _jerks in sorted(self.car_model_jerks.items(), key=lambda i: i[1]['up_jerk'], reverse=True): + violation = _jerks["up_jerk"] > MAX_LAT_JERK_UP + MAX_LAT_JERK_UP_TOLERANCE or \ + _jerks["down_jerk"] > MAX_LAT_JERK_DOWN + violation_str = " - VIOLATION" if violation else "" + + print(f"{car_model:{max_car_model_len}} - up jerk: {round(_jerks['up_jerk'], 2):5} " + + f"m/s^3, down jerk: {round(_jerks['down_jerk'], 2):5} m/s^3{violation_str}") + + @pytest.fixture(scope="class", autouse=True) + def class_setup(self, request): + yield + cls = request.cls + if hasattr(cls, "control_params"): + up_jerk, down_jerk = TestLateralLimits.calculate_0_5s_jerk(cls.control_params, cls.torque_params) + self.car_model_jerks[cls.car_model] = {"up_jerk": up_jerk, "down_jerk": down_jerk} + + +if __name__ == '__main__': + sys.exit(pytest.main([__file__, '-n0', '--no-summary'], plugins=[LatAccelReport()])) # noqa: TID251 diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_platform_configs.py b/artifacts/package_runtime/iqdbc/car/tests/test_platform_configs.py new file mode 100644 index 000000000..7c3fc7fcd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_platform_configs.py @@ -0,0 +1,17 @@ +from iqdbc.car.values import PLATFORMS + + +class TestPlatformConfigs: + def test_configs(self, subtests): + + for name, platform in PLATFORMS.items(): + with subtests.test(platform=str(platform)): + assert platform.config._frozen + + if platform != "MOCK": + assert len(platform.config.dbc_dict) > 0 + assert len(platform.config.platform_str) > 0 + + assert name == platform.config.platform_str + + assert platform.config.specs is not None diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_routes.py b/artifacts/package_runtime/iqdbc/car/tests/test_routes.py new file mode 100644 index 000000000..282a202c2 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_routes.py @@ -0,0 +1,18 @@ +import pytest + +from iqdbc.car.values import PLATFORMS +from iqdbc.car.tests.routes import route_exempt_cars, routes + + +@pytest.mark.parametrize("platform", PLATFORMS.keys()) +def test_test_route_present(platform): + tested_platforms = [r.car_model for r in routes] + assert platform in set(tested_platforms) | set(route_exempt_cars), \ + f"Missing test route for {platform}. Add a route to iqdbc/car/tests/routes.py" + + +def test_route_exemptions_are_current(): + tested_platforms = {r.car_model for r in routes} + assert len(route_exempt_cars) == len(set(route_exempt_cars)) + assert not tested_platforms & set(route_exempt_cars) + assert set(route_exempt_cars) <= set(PLATFORMS) diff --git a/artifacts/package_runtime/iqdbc/car/tests/test_vehicle_model.py b/artifacts/package_runtime/iqdbc/car/tests/test_vehicle_model.py new file mode 100644 index 000000000..a35463a1e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/tests/test_vehicle_model.py @@ -0,0 +1,67 @@ +import pytest +import math + +import numpy as np + +from iqdbc.car.honda.interface import CarInterface +from iqdbc.car.honda.values import CAR +from iqdbc.car.vehicle_model import VehicleModel, dyn_ss_sol, create_dyn_state_matrices + + +class TestVehicleModel: + def setup_method(self): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + self.VM = VehicleModel(CP) + + def test_round_trip_yaw_rate(self): + # TODO: fix VM to work at zero speed + for u in np.linspace(1, 30, num=10): + for roll in np.linspace(math.radians(-20), math.radians(20), num=11): + for sa in np.linspace(math.radians(-20), math.radians(20), num=11): + yr = self.VM.yaw_rate(sa, u, roll) + new_sa = self.VM.get_steer_from_yaw_rate(yr, u, roll) + + assert sa == pytest.approx(new_sa) + + def test_dyn_ss_sol_against_yaw_rate(self): + """Verify that the yaw_rate helper function matches the results + from the state space model.""" + + for roll in np.linspace(math.radians(-20), math.radians(20), num=11): + for u in np.linspace(1, 30, num=10): + for sa in np.linspace(math.radians(-20), math.radians(20), num=11): + + # Compute yaw rate based on state space model + _, yr1 = dyn_ss_sol(sa, u, roll, self.VM) + + # Compute yaw rate using direct computations + yr2 = self.VM.yaw_rate(sa, u, roll) + assert float(yr1[0]) == pytest.approx(yr2) + + def test_syn_ss_sol_simulate(self): + """Verifies that dyn_ss_sol matches a simulation""" + + for roll in np.linspace(math.radians(-20), math.radians(20), num=11): + for u in np.linspace(1, 30, num=10): + A, B = create_dyn_state_matrices(u, self.VM) + + # Convert to discrete time system + dt = 0.01 + top = np.hstack((A, B)) + full = np.vstack((top, np.zeros_like(top))) * dt + Md = sum([np.linalg.matrix_power(full, k) / math.factorial(k) for k in range(25)]) + Ad = Md[:A.shape[0], :A.shape[1]] + Bd = Md[:A.shape[0], A.shape[1]:] + + for sa in np.linspace(math.radians(-20), math.radians(20), num=11): + inp = np.array([[sa], [roll]]) + + # Simulate for 1 second + x1 = np.zeros((2, 1)) + for _ in range(100): + x1 = Ad @ x1 + Bd @ inp + + # Compute steady state solution directly + x2 = dyn_ss_sol(sa, u, roll, self.VM) + + np.testing.assert_almost_equal(x1, x2, decimal=3) diff --git a/artifacts/package_runtime/iqdbc/car/torque_data/override.toml b/artifacts/package_runtime/iqdbc/car/torque_data/override.toml new file mode 100644 index 000000000..e7b2cfeac --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/torque_data/override.toml @@ -0,0 +1,138 @@ +legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] +### angle control +# Nissan appears to have torque +"NISSAN_XTRAIL" = [nan, 1.5, nan] +"NISSAN_ALTIMA" = [nan, 1.5, nan] +"NISSAN_LEAF_IC" = [nan, 1.5, nan] +"NISSAN_LEAF" = [nan, 1.5, nan] +"NISSAN_ROGUE" = [nan, 1.5, nan] + +# New subarus angle based controllers +"SUBARU_FORESTER_2022" = [nan, 3.0, nan] +"SUBARU_OUTBACK_2023" = [nan, 3.0, nan] +"SUBARU_ASCENT_2023" = [nan, 3.0, nan] + +# Toyota LTA also has torque +"TOYOTA_RAV4_TSS2_2023" = [nan, 3.0, nan] + +# Tesla angle based controllers +"TESLA_MODEL_3" = [nan, 2.5, nan] +"TESLA_MODEL_Y" = [nan, 2.5, nan] + +# Guess +"FORD_BRONCO_SPORT_MK1" = [nan, 1.5, nan] +"FORD_ESCAPE_MK4" = [nan, 1.5, nan] +"FORD_EXPLORER_MK6" = [nan, 1.5, nan] +"FORD_F_150_MK14" = [nan, 1.5, nan] +"FORD_FOCUS_MK4" = [nan, 1.5, nan] +"FORD_MAVERICK_MK1" = [nan, 1.5, nan] +"FORD_F_150_LIGHTNING_MK1" = [nan, 1.5, nan] +"FORD_MUSTANG_MACH_E_MK1" = [nan, 1.5, nan] +"FORD_RANGER_MK2" = [nan, 1.5, nan] +### + +# No steering wheel +"COMMA_BODY" = [nan, 1000, nan] + +# Totally new cars +"RAM_1500_5TH_GEN" = [2.0, 2.0, 0.05] +"RAM_HD_5TH_GEN" = [1.4, 1.4, 0.05] +"SUBARU_OUTBACK" = [2.0, 1.5, 0.2] +"BUICK_BABYENCLAVE" = [1.45, 1.6, 0.2] +"CADILLAC_ESCALADE" = [1.899999976158142, 1.842270016670227, 0.1120000034570694] +"CADILLAC_ESCALADE_ESV_2019" = [1.15, 1.3, 0.2] +"CADILLAC_XT4" = [1.45, 1.6, 0.2] +"CHEVROLET_BOLT_EUV" = [2.0, 2.0, 0.05] +"CHEVROLET_MALIBU_CC" = [1.85, 1.85, 0.075] +"CHEVROLET_SILVERADO" = [1.9, 1.9, 0.112] +"CHEVROLET_TRAILBLAZER" = [1.33, 1.9, 0.16] +"CHEVROLET_TRAVERSE" = [1.33, 1.33, 0.18] +"CHEVROLET_EQUINOX" = [2.5, 2.5, 0.05] +"CHEVROLET_VOLT_2019" = [1.4, 1.4, 0.16] +"CHEVROLET_TRAX" = [1.33, 1.9, 0.16] +"VOLKSWAGEN_ID4_MK1" = [2.0, 2.0, 0.1] +"VOLKSWAGEN_ID4_MK2" = [2.0, 2.0, 0.1] +"VOLKSWAGEN_CADDY_MK3" = [1.2, 1.2, 0.1] +"VOLKSWAGEN_PASSAT_NMS" = [2.5, 2.5, 0.1] +"VOLKSWAGEN_SHARAN_MK2" = [2.5, 2.5, 0.1] +"HYUNDAI_SANTA_CRUZ_1ST_GEN" = [2.7, 2.7, 0.1] +"KIA_SPORTAGE_5TH_GEN" = [2.6, 2.6, 0.1] +"GENESIS_GV70_1ST_GEN" = [2.42, 2.42, 0.1] +"GENESIS_GV60_EV_1ST_GEN" = [2.5, 2.5, 0.1] +"GMC_YUKON" = [1.2, 2.5, 0.26] +"KIA_SORENTO_4TH_GEN" = [2.5, 2.5, 0.1] +"KIA_SORENTO_HEV_4TH_GEN" = [2.5, 2.5, 0.1] +"KIA_NIRO_HEV_2ND_GEN" = [2.42, 2.5, 0.12] +"KIA_NIRO_EV_2ND_GEN" = [2.05, 2.5, 0.14] +"GENESIS_GV80" = [2.5, 2.5, 0.1] +"KIA_CARNIVAL_4TH_GEN" = [1.75, 1.75, 0.15] +"GMC_ACADIA" = [1.6, 1.6, 0.2] +"LEXUS_IS_TSS2" = [2.0, 2.0, 0.1] +"HYUNDAI_KONA_EV_2ND_GEN" = [2.5, 2.5, 0.1] +"HYUNDAI_KONA_HEV_2ND_GEN" = [2.5, 2.5, 0.1] +"HYUNDAI_IONIQ_6" = [2.5, 2.5, 0.005] +"HYUNDAI_IONIQ_9" = [1.75, 1.75, 0.15] +"HYUNDAI_AZERA_7TH_GEN" = [1.8, 1.8, 0.1] +"HYUNDAI_AZERA_6TH_GEN" = [1.8, 1.8, 0.1] +"HYUNDAI_AZERA_HEV_6TH_GEN" = [1.8, 1.8, 0.1] +"KIA_K8_HEV_1ST_GEN" = [2.5, 2.5, 0.1] +"HYUNDAI_CUSTIN_1ST_GEN" = [2.5, 2.5, 0.1] +"LEXUS_GS_F" = [2.5, 2.5, 0.08] +"HYUNDAI_STARIA_4TH_GEN" = [1.8, 2.0, 0.15] +"HYUNDAI_PORTER_II_EV" = [1.8, 2.0, 0.15] +"KIA_RAY_EV" = [1.8, 2.0, 0.15] +"GENESIS_GV70_ELECTRIFIED_1ST_GEN" = [1.9, 1.9, 0.09] +"GENESIS_G80_2ND_GEN_FL" = [2.5819356441497803, 2.5, 0.11244568973779678] +"RIVIAN_R1_GEN1" = [2.8, 2.5, 0.07] +"HYUNDAI_NEXO_1ST_GEN" = [2.5, 2.5, 0.1] + +# Dashcam or fallback configured as ideal car +"MOCK" = [10.0, 10, 0.0] + +# Manually checked +"HONDA_CIVIC_2022" = [2.5, 1.2, 0.15] +"HONDA_HRV_3G" = [2.5, 1.2, 0.2] + +# Community +"HYUNDAI_GRANDEUR_IG" = [2.3, 2.3, 0.1] +"HYUNDAI_GRANDEUR_IG_HEV" = [2.3, 2.3, 0.1] +"GENESIS_EQ900" = [2.3, 2.3, 0.1] +"GENESIS_EQ900_L" = [2.3, 2.3, 0.1] +"GENESIS_G90_2019" = [2.3, 2.3, 0.1] +"KIA_MOHAVE" = [2.3, 2.3, 0.1] +"KIA_K5" = [2.3, 2.3, 0.1] +"KIA_K5_HEV" = [2.3, 2.3, 0.1] +"KIA_K5_HEV_2022" = [2.3, 2.3, 0.1] +"KIA_K7" = [2.3, 2.3, 0.1] +"KIA_K7_HEV" = [2.3, 2.3, 0.1] +"KIA_K7_PE" = [2.3, 2.3, 0.1] +"KIA_K7_HEV_PE" = [2.3, 2.3, 0.1] +"KIA_K9" = [2.3, 2.3, 0.1] +"GENESIS_GV70_EV_1ST_GEN" = [2.42, 2.42, 0.1] +"HYUNDAI_NEXO" = [2.7, 2.7, 0.1] +"KIA_EV_SK3" = [2.5, 2.5, 0.1] +"HYUNDAI_CASPER"= [2.5, 2.5, 0.1] +"HYUNDAI_CASPER_EV"= [2.5, 2.5, 0.1] +"HYUNDAI_IONIQ_5_N" = [3.17, 2.71, 0.097] +"HYUNDAI_IONIQ_5_PE" = [1.75, 1.75, 0.15] + +# Synced verbatim from comma opendbc torque_data/override.toml — these platforms +# exist upstream and were simply never carried over when iqdbc forked. +ACURA_MDX_4G_MMR = [1.25, 1.25, 0.15] +ACURA_TLX_2G = [1.2, 1.2, 0.15] +ACURA_TLX_2G_MMR = [1.7, 1.7, 0.16] +AUDI_Q5_MK1 = [1.8, 1.8, 0.18] +CUPRA_BORN_MK1 = [nan, 2.5, nan] +FORD_ESCAPE_MK4_5 = [nan, 1.5, nan] +FORD_EXPEDITION_MK4 = [nan, 1.5, nan] +HONDA_ACCORD_11G = [1.35, 1.35, 0.17] +HONDA_CITY_7G = [1.2, 1.2, 0.23] +HONDA_CRV_6G = [1.3, 1.3, 0.2] +HONDA_NBOX_2G = [1.2, 1.2, 0.2] +HONDA_ODYSSEY_5G_MMR = [0.9, 0.9, 0.2] +HONDA_PASSPORT_4G = [1.2, 1.2, 0.16] +HONDA_PILOT_4G = [1.25, 1.25, 0.21] +LEXUS_LS = [1.35, 1.7, 0.17] +PORSCHE_MACAN_MK1 = [2.0, 2.0, 0.2] +PSA_PEUGEOT_208 = [nan, 2.0, nan] +TESLA_MODEL_X = [nan, 2.5, nan] diff --git a/artifacts/package_runtime/iqdbc/car/torque_data/params.toml b/artifacts/package_runtime/iqdbc/car/torque_data/params.toml new file mode 100644 index 000000000..1f563755b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/torque_data/params.toml @@ -0,0 +1,90 @@ +legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] +"ACURA_ILX" = [1.524988973896102, 0.519011053086259, 0.34236219253028] +"ACURA_RDX" = [0.9987728568686902, 0.5323765166196301, 0.303218805715844] +"ACURA_RDX_3G" = [1.4314459806646749, 0.33874701282109954, 0.18048847083897598] +"AUDI_A3_MK3" = [1.5122414863077502, 1.7443517531719404, 0.15194151892450905] +"AUDI_Q3_MK2" = [1.4439223359448605, 1.2254955789112076, 0.1413798895978097] +"CHEVROLET_VOLT" = [1.5961527626411784, 1.8422651988094612, 0.1572393918005158] +"CHRYSLER_PACIFICA_2018" = [2.07140, 1.3366521181047952, 0.13776367250652022] +"CHRYSLER_PACIFICA_2020" = [1.86206, 1.509076559398423, 0.14328246159386085] +"CHRYSLER_PACIFICA_2018_HYBRID" = [2.08887, 1.2943025830995154, 0.114818] +"CHRYSLER_PACIFICA_2019_HYBRID" = [1.90120, 1.1958788168371808, 0.131520] +"GENESIS_G70" = [3.8520195946707947, 2.354697063349854, 0.06830285485626221] +"HONDA_ACCORD" = [1.6893333799149202, 0.3246749081720698, 0.2120497022936265] +"HONDA_CIVIC_BOSCH" = [1.691708637466905, 0.40132900729454185, 0.25460295304024094] +"HONDA_CIVIC" = [1.6528895627785531, 0.4018518740819229, 0.25458812851328544] +"HONDA_CRV" = [0.7667141440182675, 0.5927571534745969, 0.40909087636157127] +"HONDA_CRV_5G" = [2.01323205142022, 0.2700612209345081, 0.2238412881331528] +"HONDA_CRV_HYBRID" = [2.072034634644233, 0.7152085160516978, 0.20237105008376083] +"HONDA_FIT" = [1.5719981427109775, 0.5712761407108976, 0.110773383324281] +"HONDA_HRV" = [2.0661212805710205, 0.7521343418694775, 0.17760375789242094] +"HONDA_INSIGHT" = [1.5201671214069354, 0.5660229120683284, 0.25808042580281876] +"HONDA_ODYSSEY" = [1.8774809275211801, 0.8394431662987996, 0.2096978613792822] +"HONDA_PILOT" = [1.7262026201812795, 0.9470005614967523, 0.21351430733218763] +"HONDA_RIDGELINE" = [1.4146525028237624, 0.7356572861629564, 0.23307177552211328] +"HYUNDAI_ELANTRA_2021" = [3.169, 2.1259108157250735, 0.0819] +"HYUNDAI_GENESIS" = [2.7807965280270794, 2.325, 0.0984484465421171] +"HYUNDAI_IONIQ_5" = [3.172929, 2.713050, 0.096019] +"HYUNDAI_IONIQ_EV_LTD" = [1.7662975472852054, 1.613755614526594, 0.17087579756306276] +"HYUNDAI_IONIQ_PHEV" = [3.2928700076638537, 2.1193482926455656, 0.12463700961468778] +"HYUNDAI_IONIQ_PHEV_2019" = [2.970807902012267, 1.6312321830002083, 0.1088964990357482] +"HYUNDAI_KONA_EV" = [3.078814714619148, 2.307336938253934, 0.12359762054065548] +"HYUNDAI_PALISADE" = [2.544642494803999, 1.8721703683337008, 0.1301424599248651] +"HYUNDAI_SANTA_FE" = [3.0787027729757632, 2.6173437483495565, 0.1207019341823945] +"HYUNDAI_SANTA_FE_HEV_2022" = [3.501877602644835, 2.729064118456137, 0.10384068104538963] +"HYUNDAI_SANTA_FE_PHEV_2022" = [1.6953050513611045, 1.5837614296206861, 0.12672855941458458] +"HYUNDAI_SONATA_LF" = [2.2200457811703953, 1.2967330275895228, 0.14039920986586393] +"HYUNDAI_SONATA" = [2.9638737459977467, 2.1259108157250735, 0.07813665616927593] +"HYUNDAI_SONATA_HYBRID" = [2.8990264092395734, 2.061410192222139, 0.0899805488717382] +"HYUNDAI_TUCSON_4TH_GEN" = [2.960174, 2.860284, 0.108745] +"HYUNDAI_SANTAFE_MX5" = [3.2, 3.0, 0.05] +"HYUNDAI_SANTAFE_MX5_HEV" = [3.2, 3.0, 0.05] +"JEEP_GRAND_CHEROKEE_2019" = [2.30972, 1.289689569171081, 0.117048] +"JEEP_GRAND_CHEROKEE" = [2.27116, 1.4057367824262523, 0.11725947414922003] +"KIA_EV6" = [3.2, 2.093457, 0.005] +"KIA_EV6_PE" = [3.2, 2.093457, 0.005] +"KIA_K5_2021" = [2.405339728085138, 1.460032270828705, 0.11650989850813716] +"KIA_K5_DL3_24" = [2.5, 2.5, 0.1] +"KIA_K5_DL3_24_HEV" = [2.5, 2.5, 0.1] +"KIA_NIRO_EV" = [2.9215954981365337, 2.1500583840260044, 0.09236802474810267] +"KIA_SORENTO" = [2.464854685101844, 1.5335274218367956, 0.12056170567599558] +"KIA_STINGER" = [2.7499043387418967, 1.849652021986449, 0.12048334239559202] +"KIA_EV9" = [1.75, 1.75, 0.15] +"KIA_EV3" = [3.2, 2.093457, 0.005] +"KIA_PV5" = [3.2, 2.093457, 0.005] +"LEXUS_ES_TSS2" = [2.0357564999999997, 1.999082295195227, 0.101533] +"LEXUS_NX" = [2.3525924753753613, 1.9731412277641067, 0.15168101064205927] +"LEXUS_NX_TSS2" = [2.4331999786982936, 2.1045680431705414, 0.14099899317761067] +"LEXUS_RX" = [1.6430539050086406, 1.181960058934143, 0.19768806040843034] +"LEXUS_RX_TSS2" = [1.5375561442049257, 1.343166476215164, 0.1931062001527557] +"MAZDA_CX9_2021" = [1.7601682915983443, 1.0889677335154337, 0.17713792194297195] +"SKODA_SUPERB_MK3" = [1.166437404652981, 1.1686163012668165, 0.12194533036948708] +"SUBARU_FORESTER" = [3.6617001649776793, 2.342197172531713, 0.11075960785398745] +"SUBARU_IMPREZA" = [1.0670704910352047, 0.8234374840709592, 0.20986563268614938] +"SUBARU_IMPREZA_2020" = [2.6068223389108303, 2.134872342760203, 0.15261513193561627] +"TOYOTA_AVALON" = [2.5185770183845646, 1.7153346784214922, 0.10603968787111022] +"TOYOTA_AVALON_2019" = [1.7036141952825095, 1.239619084240008, 0.08459830394899492] +"TOYOTA_AVALON_TSS2" = [2.3154403649717357, 2.7777922854327124, 0.11453999639164605] +"TOYOTA_CHR" = [1.5591084333664578, 1.271271459066948, 0.20259087058453193] +"TOYOTA_CHR_TSS2" = [1.7678810166088303, 1.3742176337919942, 0.2319674583741509] +"TOYOTA_CAMRY" = [2.0568162685952505, 1.7576185169559122, 0.108878753] +"TOYOTA_CAMRY_TSS2" = [2.3548324999999997, 2.368900128946771, 0.118436] +"TOYOTA_COROLLA" = [3.117154369115421, 1.8438132575043773, 0.12289685869250652] +"TOYOTA_COROLLA_TSS2" = [1.991132339206426, 1.868866242720403, 0.19570063298031432] +"TOYOTA_HIGHLANDER" = [1.8108348718624456, 1.6348421600679828, 0.15972686105120398] +"TOYOTA_HIGHLANDER_TSS2" = [1.9617570834136164, 1.8611643317268927, 0.14519673256119725] +"TOYOTA_MIRAI" = [2.506899832157829, 1.7417213930750164, 0.20182618449440565] +"TOYOTA_PRIUS" = [1.60, 1.5023147650693636, 0.151515] +"TOYOTA_PRIUS_TSS2" = [1.972600, 1.9104337425537743, 0.170968] +"TOYOTA_RAV4" = [2.085695074355425, 2.2142832316984733, 0.13339165270103975] +"TOYOTA_RAV4_TSS2" = [2.279239424615458, 2.087101966779332, 0.13682208413446817] +"TOYOTA_RAV4H" = [1.9796257271652042, 1.7503987331707576, 0.14628860048885406] +"TOYOTA_RAV4_TSS2_2022" = [2.241883248393209, 1.9304407208090029, 0.112174] +"TOYOTA_SIENNA" = [1.689726, 1.3208264576110418, 0.140456] +"TOYOTA_YARIS" = [2.22984, 1.86145, 0.168189] +"VOLKSWAGEN_ARTEON_MK1" = [1.45136518053819, 1.3639364049316804, 0.23806361745695032] +"VOLKSWAGEN_ATLAS_MK1" = [1.4677006726964945, 1.6733266634075656, 0.12959584092073367] +"VOLKSWAGEN_GOLF_MK7" = [1.3750394140491293, 1.5814743077200641, 0.2018321939386586] +"VOLKSWAGEN_JETTA_MK7" = [1.2271623034089392, 1.216955117387, 0.19437384688370712] +"VOLKSWAGEN_PASSAT_MK8" = [1.3432120736752917, 1.7087275587362314, 0.19444383787326647] +"VOLKSWAGEN_TIGUAN_MK2" = [0.9711965500094828, 1.0001565939459098, 0.1465626137072916] diff --git a/artifacts/package_runtime/iqdbc/car/torque_data/substitute.toml b/artifacts/package_runtime/iqdbc/car/torque_data/substitute.toml new file mode 100644 index 000000000..9a0858ada --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/torque_data/substitute.toml @@ -0,0 +1,134 @@ +legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] +"MAZDA_3" = "MAZDA_CX9_2021" +"MAZDA_6" = "MAZDA_CX9_2021" +"MAZDA_CX5" = "MAZDA_CX9_2021" +"MAZDA_CX5_2022" = "MAZDA_CX9_2021" +"MAZDA_CX9" = "MAZDA_CX9_2021" + +"DODGE_DURANGO" = "CHRYSLER_PACIFICA_2020" + +"TOYOTA_ALPHARD_TSS2" = "TOYOTA_SIENNA" +"TOYOTA_PRIUS_V" = "TOYOTA_PRIUS" +"TOYOTA_RAV4_PRIME" = "TOYOTA_RAV4_TSS2" +"TOYOTA_SIENNA_4TH_GEN" = "TOYOTA_RAV4_TSS2" +"LEXUS_IS" = "LEXUS_NX" +"LEXUS_CTH" = "LEXUS_NX" +"LEXUS_ES" = "TOYOTA_CAMRY" +"LEXUS_RC" = "LEXUS_NX_TSS2" +"LEXUS_LC_TSS2" = "LEXUS_NX_TSS2" + +"KIA_OPTIMA_G4" = "HYUNDAI_SONATA" +"KIA_OPTIMA_G4_FL" = "HYUNDAI_SONATA" +"KIA_OPTIMA_H" = "HYUNDAI_SONATA" +"KIA_OPTIMA_H_G4_FL" = "HYUNDAI_SONATA" +"KIA_FORTE" = "HYUNDAI_SONATA" +"KIA_CEED" = "HYUNDAI_SONATA" +"KIA_SELTOS" = "HYUNDAI_SONATA" +"KIA_NIRO_PHEV" = "KIA_NIRO_EV" +"KIA_EV4" = "KIA_EV6" +"KIA_NIRO_PHEV_2022" = "KIA_NIRO_EV" +"KIA_NIRO_HEV_2021" = "KIA_NIRO_EV" +"HYUNDAI_VELOSTER" = "HYUNDAI_SONATA_LF" +"HYUNDAI_KONA" = "HYUNDAI_KONA_EV" +"HYUNDAI_KONA_2022" = "HYUNDAI_KONA_EV" +"HYUNDAI_KONA_HEV" = "HYUNDAI_KONA_EV" +"HYUNDAI_KONA_EV_2022" = "HYUNDAI_KONA_EV" +"HYUNDAI_IONIQ" = "HYUNDAI_IONIQ_PHEV_2019" +"HYUNDAI_IONIQ_HEV_2022" = "HYUNDAI_IONIQ_PHEV_2019" +"HYUNDAI_IONIQ_EV_2020" = "HYUNDAI_IONIQ_PHEV_2019" +"HYUNDAI_ELANTRA" = "HYUNDAI_SONATA_LF" +"HYUNDAI_ELANTRA_GT_I30" = "HYUNDAI_SONATA_LF" +"HYUNDAI_ELANTRA_HEV_2021" = "HYUNDAI_SONATA" +"HYUNDAI_TUCSON" = "HYUNDAI_SANTA_FE" +"HYUNDAI_SANTA_FE_2022" = "HYUNDAI_SANTA_FE_HEV_2022" +"KIA_K5_HEV_2020" = "KIA_K5_2021" +"KIA_STINGER_2022" = "KIA_STINGER" +"GENESIS_G90" = "GENESIS_G70" +"GENESIS_G80" = "GENESIS_G70" +"GENESIS_G70_2020" = "HYUNDAI_SONATA" +"HYUNDAI_SONATA_2024" = "HYUNDAI_SONATA" + +"HONDA_FREED" = "HONDA_ODYSSEY" +"HONDA_CRV_EU" = "HONDA_CRV" +"HONDA_CIVIC_BOSCH_DIESEL" = "HONDA_CIVIC_BOSCH" +"HONDA_E" = "HONDA_CIVIC_BOSCH" +"HONDA_ODYSSEY_CHN" = "HONDA_ODYSSEY" + +"BUICK_LACROSSE" = "CHEVROLET_VOLT" +"BUICK_REGAL" = "CHEVROLET_VOLT" +"CADILLAC_ESCALADE_ESV" = "CHEVROLET_VOLT" +"CADILLAC_ATS" = "CHEVROLET_VOLT" +"CHEVROLET_MALIBU" = "CHEVROLET_VOLT" +"HOLDEN_ASTRA" = "CHEVROLET_VOLT" +"CHEVROLET_VOLT_CC" = "CHEVROLET_VOLT" +"CHEVROLET_BOLT_CC" = "CHEVROLET_BOLT_EUV" +"CHEVROLET_BOLT_2017" = "CHEVROLET_BOLT_EUV" +"CHEVROLET_BOLT_2018" = "CHEVROLET_BOLT_EUV" +"CHEVROLET_EQUINOX_CC" = "CHEVROLET_EQUINOX" +"CHEVROLET_SUBURBAN" = "CHEVROLET_SILVERADO" +"CHEVROLET_SUBURBAN_CC" = "CHEVROLET_SILVERADO" +"CHEVROLET_TRAX_2024" = "CHEVROLET_VOLT" +"CADILLAC_CT6_CC" = "CHEVROLET_VOLT" +"CADILLAC_CT6_ACC" = "CHEVROLET_VOLT" +"CHEVROLET_TRAILBLAZER_CC" = "CHEVROLET_TRAILBLAZER" +"CADILLAC_XT5_CC" = "GMC_ACADIA" + +"SKODA_FABIA_MK4" = "VOLKSWAGEN_GOLF_MK7" +"SKODA_OCTAVIA_MK3" = "SKODA_SUPERB_MK3" +"SKODA_KODIAQ_MK1" = "SKODA_SUPERB_MK3" +"SKODA_KAROQ_MK1" = "SKODA_SUPERB_MK3" +"SKODA_KAMIQ_MK1" = "SKODA_SUPERB_MK3" +"VOLKSWAGEN_CRAFTER_MK2" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TROC_MK1" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TCROSS_MK1" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TOURAN_MK2" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TRANSPORTER_T61" = "VOLKSWAGEN_TIGUAN_MK2" +"AUDI_Q2_MK1" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_TAOS_MK1" = "VOLKSWAGEN_TIGUAN_MK2" +"VOLKSWAGEN_POLO_MK6" = "VOLKSWAGEN_GOLF_MK7" +"SEAT_ATECA_MK1" = "VOLKSWAGEN_GOLF_MK7" +"VOLKSWAGEN_JETTA_MK6" = "VOLKSWAGEN_PASSAT_NMS" + +"SUBARU_CROSSTREK_HYBRID" = "SUBARU_IMPREZA_2020" +"SUBARU_FORESTER_HYBRID" = "SUBARU_IMPREZA_2020" +"SUBARU_LEGACY" = "SUBARU_OUTBACK" + +# Old subarus don't have much data guessing it's like low torque impreza" +"SUBARU_OUTBACK_PREGLOBAL_2018" = "SUBARU_IMPREZA" +"SUBARU_OUTBACK_PREGLOBAL" = "SUBARU_IMPREZA" +"SUBARU_FORESTER_PREGLOBAL" = "SUBARU_IMPREZA" +"SUBARU_LEGACY_PREGLOBAL" = "SUBARU_IMPREZA" +"SUBARU_ASCENT" = "SUBARU_FORESTER" + +# IQ.Pilot GM Non-ACC ports borrow their base platform's lateral tune +"CHEVROLET_BOLT_NON_ACC" = "CHEVROLET_BOLT_EUV" +"CHEVROLET_BOLT_NON_ACC_1ST_GEN" = "CHEVROLET_BOLT_EUV" +"CHEVROLET_BOLT_NON_ACC_2ND_GEN" = "CHEVROLET_BOLT_EUV" +"CHEVROLET_EQUINOX_NON_ACC_3RD_GEN" = "CHEVROLET_EQUINOX" +"CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN" = "CHEVROLET_SILVERADO" +"CADILLAC_CT6_NON_ACC_1ST_GEN" = "CHEVROLET_VOLT" +"CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN" = "CHEVROLET_TRAILBLAZER" +"CHEVROLET_MALIBU_NON_ACC_9TH_GEN" = "CHEVROLET_VOLT" +"CADILLAC_XT5_NON_ACC_1ST_GEN" = "CADILLAC_XT4" + +# Synced verbatim from comma opendbc torque_data/substitute.toml +"HONDA_ODYSSEY_TWN" = "HONDA_ODYSSEY" +"LEXUS_RC_TSS2" = "LEXUS_NX_TSS2" + +# Platform-sibling substitutes: comma has never shipped torque data for these, +# so rather than invent lateral-accel figures they borrow the tune of the closest +# platform twin. REVIEW: replace with measured values when available. +"SEAT_ALHAMBRA_MK1" = "VOLKSWAGEN_SHARAN_MK2" +"VOLKSWAGEN_PASSAT_NMS_PLUS" = "VOLKSWAGEN_PASSAT_NMS" +"VOLKSWAGEN_ID3_MK1" = "VOLKSWAGEN_ID4_MK1" +"VOLKSWAGEN_ID3_MK2" = "VOLKSWAGEN_ID4_MK2" +"SKODA_ENYAQ_MK1" = "VOLKSWAGEN_ID4_MK1" +"SKODA_ENYAQ_MK2" = "VOLKSWAGEN_ID4_MK2" +"AUDI_A4_MK4" = "AUDI_Q5_MK1" +"AUDI_Q4_MK1" = "VOLKSWAGEN_ID4_MK1" +"AUDI_Q4_MK2" = "VOLKSWAGEN_ID4_MK2" +"VOLKSWAGEN_GOLF_MK8" = "VOLKSWAGEN_GOLF_MK7" +"SEAT_LEON_MK4" = "VOLKSWAGEN_GOLF_MK7" +"VOLKSWAGEN_PASSAT_MK7" = "VOLKSWAGEN_PASSAT_NMS" +"VOLKSWAGEN_PASSAT_B7" = "VOLKSWAGEN_PASSAT_NMS" +"HONDA_CLARITY" = "HONDA_ACCORD" diff --git a/artifacts/package_runtime/iqdbc/car/toyota/__init__.py b/artifacts/package_runtime/iqdbc/car/toyota/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/toyota/carcontroller.py b/artifacts/package_runtime/iqdbc/car/toyota/carcontroller.py new file mode 100644 index 000000000..04fb4dbcc --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/carcontroller.py @@ -0,0 +1,337 @@ +import math +import numpy as np +from iqdbc.car import Bus, make_tester_present_msg, rate_limit, structs, ACCELERATION_DUE_TO_GRAVITY, DT_CTRL +from iqdbc.car.lateral import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance +from iqdbc.car.carlog import carlog +from iqdbc.car.common.filter_simple import FirstOrderFilter, HighPassFilter +from iqdbc.car.common.pid import PIDController +from iqdbc.car.secoc import add_mac, build_sync_mac +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.toyota import toyotacan +from iqdbc.car.toyota.values import CAR, NO_STOP_TIMER_CAR, TSS2_CAR, \ + CarControllerParams, ToyotaFlags, \ + UNSUPPORTED_DSU_CAR +from iqdbc.can import CANPacker + +from iqdbc.lvbs.car.toyota.gas_interceptor import GasInterceptorCarController +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ + +Ecu = structs.CarParams.Ecu +LongCtrlState = structs.CarControl.Actuators.LongControlState +SteerControlType = structs.CarParams.SteerControlType +VisualAlert = structs.CarControl.HUDControl.VisualAlert + +# The up limit allows the brakes/gas to unwind quickly leaving a stop, +# the down limit roughly matches the rate of ACCEL_NET, reducing PCM compensation windup +ACCEL_WINDUP_LIMIT = 4.0 * DT_CTRL * 3 # m/s^2 / frame +ACCEL_WINDDOWN_LIMIT = -4.0 * DT_CTRL * 3 # m/s^2 / frame +ACCEL_PID_UNWIND = 0.03 * DT_CTRL * 3 # m/s^2 / frame + +MAX_PITCH_COMPENSATION = 1.5 # m/s^2 + +# LKA limits +# EPS faults if you apply torque while the steering rate is above 100 deg/s for too long +MAX_STEER_RATE = 100 # deg/s +MAX_STEER_RATE_FRAMES = 17 # tx control frames needed before torque can be cut + +# EPS allows user torque above threshold for 50 frames before permanently faulting +MAX_USER_TORQUE = 500 + + +def get_long_tune(CP, params): + if CP.carFingerprint in TSS2_CAR: + kiBP = [2., 5.] + kiV = [0.5, 0.25] + else: + kiBP = [0., 5., 35.] + kiV = [3.6, 2.4, 1.5] + + return PIDController(0.0, (kiBP, kiV), k_f=1.0, + pos_limit=params.ACCEL_MAX, neg_limit=params.ACCEL_MIN, + rate=1 / (DT_CTRL * 3)) + + +class CarController(CarControllerBase, GasInterceptorCarController): + def __init__(self, dbc_names, CP, CP_IQ): + CarControllerBase.__init__(self, dbc_names, CP, CP_IQ) + GasInterceptorCarController.__init__(self, CP, CP_IQ) + self.params = CarControllerParams(self.CP) + self.last_torque = 0 + self.last_angle = 0 + self.alert_active = False + self.last_standstill = False + self.standstill_req = False + self.permit_braking = True + self.steer_rate_counter = 0 + self.distance_button = 0 + + # *** start long control state *** + self.long_pid = get_long_tune(self.CP, self.params) + self.aego = FirstOrderFilter(0.0, 0.25, DT_CTRL * 3) + self.pitch = FirstOrderFilter(0, 0.5, DT_CTRL) + self.pitch_hp = HighPassFilter(0.0, 0.25, 1.5, DT_CTRL) + + self.accel = 0 + self.prev_accel = 0 + # *** end long control state *** + + self.packer = CANPacker(dbc_names[Bus.pt]) + + self.secoc_lka_message_counter = 0 + self.secoc_lta_message_counter = 0 + self.secoc_acc_message_counter = 0 + self.secoc_prev_reset_counter = 0 + + def update(self, CC, CC_IQ, CS, now_nanos): + actuators = CC.actuators + stopping = actuators.longControlState == LongCtrlState.stopping + hud_control = CC.hudControl + pcm_cancel_cmd = CC.cruiseControl.cancel + lat_active = CC.latActive and abs(CS.out.steeringTorque) < MAX_USER_TORQUE + + if len(CC.orientationNED) == 3: + self.pitch.update(CC.orientationNED[1]) + self.pitch_hp.update(CC.orientationNED[1]) + + # *** control msgs *** + can_sends = [] + + # *** handle secoc reset counter increase *** + if self.CP.flags & ToyotaFlags.SECOC.value: + if CS.secoc_synchronization['RESET_CNT'] != self.secoc_prev_reset_counter: + self.secoc_lka_message_counter = 0 + self.secoc_lta_message_counter = 0 + self.secoc_acc_message_counter = 0 + self.secoc_prev_reset_counter = CS.secoc_synchronization['RESET_CNT'] + + expected_mac = build_sync_mac(self.secoc_key, int(CS.secoc_synchronization['TRIP_CNT']), int(CS.secoc_synchronization['RESET_CNT'])) + if int(CS.secoc_synchronization['AUTHENTICATOR']) != expected_mac: + carlog.error("SecOC synchronization MAC mismatch, wrong key?") + + # *** steer torque *** + new_torque = int(round(actuators.torque * self.params.STEER_MAX)) + apply_torque = apply_meas_steer_torque_limits(new_torque, self.last_torque, CS.out.steeringTorqueEps, self.params) + + # >100 degree/sec steering fault prevention + self.steer_rate_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringRateDeg) >= MAX_STEER_RATE, lat_active, + self.steer_rate_counter, MAX_STEER_RATE_FRAMES) + + if not lat_active: + apply_torque = 0 + + # *** steer angle *** + if self.CP.steerControlType == SteerControlType.angle: + # If using LTA control, disable LKA and set steering angle command + apply_torque = 0 + apply_steer_req = False + if self.frame % 2 == 0: + # EPS uses the torque sensor angle to control with, offset to compensate + apply_angle = actuators.steeringAngleDeg + CS.out.steeringAngleOffsetDeg + + # Angular rate limit based on speed + self.last_angle = apply_std_steer_angle_limits(apply_angle, self.last_angle, CS.out.vEgoRaw, + CS.out.steeringAngleDeg + CS.out.steeringAngleOffsetDeg, + CC.latActive, self.params.ANGLE_LIMITS) + + self.last_torque = apply_torque + + # toyota can trace shows STEERING_LKA at 42Hz, with counter adding alternatively 1 and 2; + # sending it at 100Hz seem to allow a higher rate limit, as the rate limit seems imposed + # on consecutive messages + steer_command = toyotacan.create_steer_command(self.packer, apply_torque, apply_steer_req) + if self.CP.flags & ToyotaFlags.SECOC.value: + # TODO: check if this slow and needs to be done by the CANPacker + steer_command = add_mac(self.secoc_key, + int(CS.secoc_synchronization['TRIP_CNT']), + int(CS.secoc_synchronization['RESET_CNT']), + self.secoc_lka_message_counter, + steer_command) + self.secoc_lka_message_counter += 1 + can_sends.append(steer_command) + + # STEERING_LTA does not seem to allow more rate by sending faster, and may wind up easier + if self.frame % 2 == 0 and self.CP.carFingerprint in TSS2_CAR: + lta_active = lat_active and self.CP.steerControlType == SteerControlType.angle + # cut steering torque with TORQUE_WIND_DOWN when either EPS torque or driver torque is above + # the threshold, to limit max lateral acceleration and for driver torque blending respectively. + full_torque_condition = (abs(CS.out.steeringTorqueEps) < self.params.STEER_MAX and + abs(CS.out.steeringTorque) < self.params.MAX_LTA_DRIVER_TORQUE_ALLOWANCE) + + # TORQUE_WIND_DOWN at 0 ramps down torque at roughly the max down rate of 1500 units/sec + torque_wind_down = 100 if lta_active and full_torque_condition else 0 + can_sends.append(toyotacan.create_lta_steer_command(self.packer, self.CP.steerControlType, self.last_angle, + lta_active, self.frame // 2, torque_wind_down)) + + if self.CP.flags & ToyotaFlags.SECOC.value: + lta_steer_2 = toyotacan.create_lta_steer_command_2(self.packer, self.frame // 2) + lta_steer_2 = add_mac(self.secoc_key, + int(CS.secoc_synchronization['TRIP_CNT']), + int(CS.secoc_synchronization['RESET_CNT']), + self.secoc_lta_message_counter, + lta_steer_2) + self.secoc_lta_message_counter += 1 + can_sends.append(lta_steer_2) + + # *** gas and brake *** + + # on entering standstill, send standstill request for older TSS-P cars that aren't designed to stay engaged at a stop + # SNG hack: skip setting standstill_req so RELEASE_STANDSTILL stays True and openpilot controls through the stop + if self.CP.carFingerprint not in NO_STOP_TIMER_CAR or self.CP_IQ.enableGasInterceptor: + if CS.out.standstill and not self.last_standstill and \ + (self.CP_IQ.enableGasInterceptor or not (self.CP_IQ.flags & ToyotaFlagsIQ.STOP_AND_GO_HACK)): + self.standstill_req = True + if CS.pcm_acc_status != 8: + # pcm entered standstill or it's disabled + self.standstill_req = False + + else: + # NO_STOP_TIMER cars: actively manage standstill hold/release based on planner intent. + # if user engages at a stop with foot on brake, PCM starts in a special cruise standstill mode. on resume press, + # brakes can take a while to ramp up causing a lurch forward. prevent resume press until planner wants to move. + # don't use CC.cruiseControl.resume since it is gated on CS.cruiseState.standstill which goes false for 3s after resume press + # whitelist hybrids as they do not have this issue and can stay stopped after resume press + if not self.CP.flags & ToyotaFlags.HYBRID.value: + should_resume = actuators.accel > 0 + if should_resume: + self.standstill_req = False + + if not should_resume and CS.out.cruiseState.standstill: + self.standstill_req = True + + self.last_standstill = CS.out.standstill + + # handle UI messages + fcw_alert = hud_control.visualAlert == VisualAlert.fcw + steer_alert = hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw) + lead = hud_control.leadVisible or CS.out.vEgo < 12. # at low speed we always assume the lead is present so ACC can be engaged + + if self.CP.openpilotLongitudinalControl: + if self.frame % 3 == 0: + # Press distance button until we are at the correct bar length. Only change while enabled to avoid skipping startup popup + if self.frame % 6 == 0 and self.CP.openpilotLongitudinalControl: + desired_distance = 4 - hud_control.leadDistanceBars + if CS.out.cruiseState.enabled and CS.pcm_follow_distance != desired_distance: + self.distance_button = not self.distance_button + else: + self.distance_button = 0 + + # internal PCM gas command can get stuck unwinding from negative accel so we apply a generous rate limit + pcm_accel_cmd = actuators.accel + if CC.longActive: + pcm_accel_cmd = rate_limit(pcm_accel_cmd, self.prev_accel, ACCEL_WINDDOWN_LIMIT, ACCEL_WINDUP_LIMIT) + self.prev_accel = pcm_accel_cmd + + # calculate amount of acceleration PCM should apply to reach target, given pitch. + # clipped to only include downhill angles, avoids erroneously unsetting PERMIT_BRAKING when stopping on uphills + accel_due_to_pitch = math.sin(min(self.pitch.x, 0.0)) * ACCELERATION_DUE_TO_GRAVITY + # TODO: on uphills this sometimes sets PERMIT_BRAKING low not considering the creep force + net_acceleration_request = pcm_accel_cmd + accel_due_to_pitch + + # GVC does not overshoot ego acceleration when starting from stop, but still has a similar delay + if not self.CP.flags & ToyotaFlags.SECOC.value: + a_ego_blended = float(np.interp(CS.out.vEgo, [1.0, 2.0], [CS.gvc, CS.out.aEgo])) + else: + a_ego_blended = CS.out.aEgo + + # wind down integral when approaching target for step changes and smooth ramps to reduce overshoot + prev_aego = self.aego.x + self.aego.update(a_ego_blended) + j_ego = (self.aego.x - prev_aego) / (DT_CTRL * 3) + + future_t = float(np.interp(CS.out.vEgo, [2., 5.], [0.25, 0.5])) + a_ego_future = a_ego_blended + j_ego * future_t + + if CC.longActive: + # constantly slowly unwind integral to recover from large temporary errors + self.long_pid.i -= ACCEL_PID_UNWIND * float(np.sign(self.long_pid.i)) + + error_future = pcm_accel_cmd - a_ego_future + + if not stopping: + # Toyota's PCM slowly responds to changes in pitch. On change, we amplify our + # acceleration request to compensate for the undershoot and following overshoot + pitch_compensation = float(np.clip(math.sin(self.pitch_hp.x) * ACCELERATION_DUE_TO_GRAVITY, + -MAX_PITCH_COMPENSATION, MAX_PITCH_COMPENSATION)) + pcm_accel_cmd += pitch_compensation + + pcm_accel_cmd = self.long_pid.update(error_future, + speed=CS.out.vEgo, + feedforward=pcm_accel_cmd, + freeze_integrator=actuators.longControlState != LongCtrlState.pid) + else: + self.long_pid.reset() + pcm_accel_cmd = 0. + + # Along with rate limiting positive jerk above, this greatly improves gas response time + # Consider the net acceleration request that the PCM should be applying (pitch included) + net_acceleration_request_min = min(actuators.accel + accel_due_to_pitch, net_acceleration_request) + if net_acceleration_request_min < 0.2 or stopping or not CC.longActive: + self.permit_braking = True + elif net_acceleration_request_min > 0.3: + self.permit_braking = False + + sdsu_tssp_long_active = bool(self.CP_IQ.flags & ToyotaFlagsIQ.SMART_DSU) and \ + (self.CP.carFingerprint not in TSS2_CAR) and CC.longActive + pcm_accel_cmd = actuators.accel if sdsu_tssp_long_active else pcm_accel_cmd + pcm_accel_cmd = float(np.clip(pcm_accel_cmd, self.params.ACCEL_MIN, self.params.ACCEL_MAX)) + + main_accel_cmd = 0. if self.CP.flags & ToyotaFlags.SECOC.value else pcm_accel_cmd + can_sends.append(toyotacan.create_accel_command(self.packer, main_accel_cmd, pcm_cancel_cmd, self.permit_braking, self.standstill_req, lead, + CS.acc_type, fcw_alert, self.distance_button)) + if self.CP.flags & ToyotaFlags.SECOC.value: + acc_cmd_2 = toyotacan.create_accel_command_2(self.packer, pcm_accel_cmd) + acc_cmd_2 = add_mac(self.secoc_key, + int(CS.secoc_synchronization['TRIP_CNT']), + int(CS.secoc_synchronization['RESET_CNT']), + self.secoc_acc_message_counter, + acc_cmd_2) + self.secoc_acc_message_counter += 1 + can_sends.append(acc_cmd_2) + + self.accel = pcm_accel_cmd + + else: + # we can spam can to cancel the system even if we are using lat only control + if pcm_cancel_cmd: + if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR: + can_sends.append(toyotacan.create_acc_cancel_command(self.packer)) + else: + can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, True, False, lead, CS.acc_type, False, self.distance_button)) + + can_sends.extend(GasInterceptorCarController.create_gas_command(self, CC, CS, actuators, self.packer, self.frame)) + + # *** hud ui *** + if self.CP.carFingerprint != CAR.TOYOTA_PRIUS_V: + # ui mesg is at 1Hz but we send asap if: + # - there is something to display + # - there is something to stop displaying + send_ui = False + if ((fcw_alert or steer_alert) and not self.alert_active) or \ + (not (fcw_alert or steer_alert) and self.alert_active): + send_ui = True + self.alert_active = not self.alert_active + elif pcm_cancel_cmd: + # forcing the pcm to disengage causes a bad fault sound so play a good sound instead + send_ui = True + + if self.frame % 20 == 0 or send_ui: + can_sends.append(toyotacan.create_ui_command(self.packer, steer_alert, pcm_cancel_cmd, hud_control.leftLaneVisible, + hud_control.rightLaneVisible, hud_control.leftLaneDepart, + hud_control.rightLaneDepart, CC.latActive, CS.lkas_hud)) + + if (self.frame % 100 == 0 or send_ui) and self.CP.flags & ToyotaFlags.DISABLE_RADAR.value: + can_sends.append(toyotacan.create_fcw_command(self.packer, fcw_alert)) + + # keep radar disabled + if self.frame % 20 == 0 and self.CP.flags & ToyotaFlags.DISABLE_RADAR.value: + can_sends.append(make_tester_present_msg(0x750, 0, 0xF)) + + new_actuators = actuators.as_builder() + new_actuators.torque = apply_torque / self.params.STEER_MAX + new_actuators.torqueOutputCan = apply_torque + new_actuators.steeringAngleDeg = self.last_angle + new_actuators.accel = self.accel + new_actuators.gas = self.gas + + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/toyota/carstate.py b/artifacts/package_runtime/iqdbc/car/toyota/carstate.py new file mode 100644 index 000000000..8300e29ba --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/carstate.py @@ -0,0 +1,231 @@ +import copy + +from iqdbc.can import CANDefine, CANParser +from iqdbc.car import Bus, DT_CTRL, create_button_events, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.common.filter_simple import FirstOrderFilter +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.toyota.values import ToyotaFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \ + TSS2_CAR, RADAR_ACC_CAR, EPS_SCALE, UNSUPPORTED_DSU_CAR, \ + SECOC_CAR +from iqdbc.lvbs.car.toyota.iq_carstate import IQCarState +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ + +ButtonType = structs.CarState.ButtonEvent.Type +SteerControlType = structs.CarParams.SteerControlType + +# These steering fault definitions seem to be common across LKA (torque) and LTA (angle): +# - high steer rate fault: goes to 21 or 25 for 1 frame, then 9 for 2 seconds +# - lka/lta msg drop out: goes to 9 then 11 for a combined total of 2 seconds, then 3. +# if using the other control command, goes directly to 3 after 1.5 seconds +# - initializing: LTA can report 0 as long as STEER_TORQUE_SENSOR->STEER_ANGLE_INITIALIZING is 1, +# and is a catch-all for LKA +TEMP_STEER_FAULTS = (0, 9, 11, 21, 25) +# - lka/lta msg drop out: 3 (recoverable) +# - prolonged high driver torque: 17 (permanent) +PERM_STEER_FAULTS = (3, 17) + + +class CarState(CarStateBase, IQCarState): + def __init__(self, CP, CP_IQ): + CarStateBase.__init__(self, CP, CP_IQ) + IQCarState.__init__(self, CP, CP_IQ) + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + self.eps_torque_scale = EPS_SCALE[CP.carFingerprint] / 100. + self.cluster_speed_hyst_gap = CV.KPH_TO_MS / 2. + self.cluster_min_speed = CV.KPH_TO_MS / 2. + + if CP.flags & ToyotaFlags.SECOC.value: + self.shifter_values = can_define.dv["GEAR_PACKET_HYBRID"]["GEAR"] + else: + self.shifter_values = can_define.dv["GEAR_PACKET"]["GEAR"] + + # On cars with cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"] + # the signal is zeroed to where the steering angle is at start. + # Need to apply an offset as soon as the steering angle measurements are both received + self.accurate_steer_angle_seen = False + self.angle_offset = FirstOrderFilter(None, 60.0, DT_CTRL, initialized=False) + + self.lkas_button = 0 + self.distance_button = 0 + + self.pcm_follow_distance = 0 + + self.acc_type = 1 + self.lkas_hud = {} + self.gvc = 0.0 + self.secoc_synchronization = None + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + + ret = structs.CarState() + ret_iq = structs.IQCarState() + cp_acc = cp_cam if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR) else cp + + if not self.CP.flags & ToyotaFlags.SECOC.value: + self.gvc = cp.vl["VSC1S07"]["GVC"] + + ret.doorOpen = any([cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_FL"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_FR"], + cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_RL"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_RR"]]) + ret.seatbeltUnlatched = cp.vl["BODY_CONTROL_STATE"]["SEATBELT_DRIVER_UNLATCHED"] != 0 + ret.parkingBrake = cp.vl["BODY_CONTROL_STATE"]["PARKING_BRAKE"] == 1 + + ret.brakePressed = cp.vl["BRAKE_MODULE"]["BRAKE_PRESSED"] != 0 + ret.brakeHoldActive = cp.vl["ESP_CONTROL"]["BRAKE_HOLD_ACTIVE"] == 1 + + if self.CP.flags & ToyotaFlags.SECOC.value: + self.secoc_synchronization = copy.copy(cp.vl["SECOC_SYNCHRONIZATION"]) + ret.gasPressed = cp.vl["GAS_PEDAL"]["GAS_PEDAL_USER"] > 0 + can_gear = int(cp.vl["GEAR_PACKET_HYBRID"]["GEAR"]) + else: + ret.gasPressed = cp.vl["PCM_CRUISE"]["GAS_RELEASED"] == 0 # TODO: these also have GAS_PEDAL, come back and unify + can_gear = int(cp.vl["GEAR_PACKET"]["GEAR"]) + if not self.CP.flags & ToyotaFlags.DISABLE_RADAR.value: + ret.stockAeb = bool(cp_acc.vl["PRE_COLLISION"]["PRECOLLISION_ACTIVE"] and cp_acc.vl["PRE_COLLISION"]["FORCE"] < -1e-5) + + self.parse_wheel_speeds(ret, + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_FL"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_FR"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_RL"], + cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_RR"], + ) + ret.vEgoCluster = ret.vEgo * 1.015 # minimum of all the cars + + ret.standstill = abs(ret.vEgoRaw) < 1e-3 + + ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + cp.vl["STEER_ANGLE_SENSOR"]["STEER_FRACTION"] + ret.steeringRateDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_RATE"] + torque_sensor_angle_deg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"] + + # On some cars, the angle measurement is non-zero while initializing + if abs(torque_sensor_angle_deg) > 1e-3 and not bool(cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE_INITIALIZING"]): + self.accurate_steer_angle_seen = True + + if self.accurate_steer_angle_seen: + # Offset seems to be invalid for large steering angles and high angle rates + if abs(ret.steeringAngleDeg) < 90 and abs(ret.steeringRateDeg) < 100 and cp.can_valid: + self.angle_offset.update(torque_sensor_angle_deg - ret.steeringAngleDeg) + + if self.angle_offset.initialized: + ret.steeringAngleOffsetDeg = self.angle_offset.x + ret.steeringAngleDeg = torque_sensor_angle_deg - self.angle_offset.x + + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None)) + ret.leftBlinker = cp.vl["BLINKERS_STATE"]["TURN_SIGNALS"] == 1 + ret.rightBlinker = cp.vl["BLINKERS_STATE"]["TURN_SIGNALS"] == 2 + + ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"] + ret.steeringTorqueEps = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_EPS"] * self.eps_torque_scale + # we could use the override bit from dbc, but it's triggered at too high torque values + ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD + + # Check EPS LKA/LTA fault status + ret.steerFaultTemporary = cp.vl["EPS_STATUS"]["LKA_STATE"] in TEMP_STEER_FAULTS + ret.steerFaultPermanent = cp.vl["EPS_STATUS"]["LKA_STATE"] in PERM_STEER_FAULTS + + if self.CP.steerControlType == SteerControlType.angle: + ret.steerFaultTemporary = ret.steerFaultTemporary or cp.vl["EPS_STATUS"]["LTA_STATE"] in TEMP_STEER_FAULTS + ret.steerFaultPermanent = ret.steerFaultPermanent or cp.vl["EPS_STATUS"]["LTA_STATE"] in PERM_STEER_FAULTS + + # Lane Tracing Assist control is unavailable (EPS_STATUS->LTA_STATE=0) until + # the more accurate angle sensor signal is initialized + ret.vehicleSensorsInvalid = not self.accurate_steer_angle_seen + + if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR: + # TODO: find the bit likely in DSU_CRUISE that describes an ACC fault. one may also exist in CLUTCH + ret.cruiseState.available = cp.vl["DSU_CRUISE"]["MAIN_ON"] != 0 + ret.cruiseState.speed = cp.vl["DSU_CRUISE"]["SET_SPEED"] * CV.KPH_TO_MS + cluster_set_speed = cp.vl["PCM_CRUISE_ALT"]["UI_SET_SPEED"] + else: + ret.accFaulted = cp.vl["PCM_CRUISE_2"]["ACC_FAULTED"] != 0 + ret.carFaultedNonCritical = cp.vl["PCM_CRUISE_SM"]["TEMP_ACC_FAULTED"] != 0 + ret.cruiseState.available = cp.vl["PCM_CRUISE_2"]["MAIN_ON"] != 0 + ret.cruiseState.speed = cp.vl["PCM_CRUISE_2"]["SET_SPEED"] * CV.KPH_TO_MS + cluster_set_speed = cp.vl["PCM_CRUISE_SM"]["UI_SET_SPEED"] + + ret.lateralAvailable = ret.cruiseState.available + + # UI_SET_SPEED is always non-zero when main is on, hide until first enable + is_metric = cp.vl["BODY_CONTROL_STATE_2"]["UNITS"] in (1, 2) + if ret.cruiseState.speed != 0: + conversion_factor = CV.KPH_TO_MS if is_metric else CV.MPH_TO_MS + ret.cruiseState.speedCluster = cluster_set_speed * conversion_factor + + if self.CP.carFingerprint in TSS2_CAR and not self.CP.flags & ToyotaFlags.DISABLE_RADAR.value: + self.acc_type = cp_acc.vl["ACC_CONTROL"]["ACC_TYPE"] + ret.stockFcw = bool(cp_acc.vl["PCS_HUD"]["FCW"]) + + # some TSS2 cars have low speed lockout permanently set, so ignore on those cars + # these cars are identified by an ACC_TYPE value of 2. + # TODO: it is possible to avoid the lockout and gain stop and go if you + # send your own ACC_CONTROL msg on startup with ACC_TYPE set to 1 + if (self.CP.carFingerprint not in TSS2_CAR and self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR) or \ + (self.CP.carFingerprint in TSS2_CAR and self.acc_type == 1): + if self.CP.openpilotLongitudinalControl: + ret.accFaulted = ret.accFaulted or cp.vl["PCM_CRUISE_2"]["LOW_SPEED_LOCKOUT"] == 2 + + self.pcm_acc_status = cp.vl["PCM_CRUISE"]["CRUISE_STATE"] + if self.CP.carFingerprint not in (NO_STOP_TIMER_CAR - TSS2_CAR): + # ignore standstill state in certain vehicles, since pcm allows to restart with just an acceleration request + ret.cruiseState.standstill = self.pcm_acc_status == 7 + ret.cruiseState.enabled = bool(cp.vl["PCM_CRUISE"]["CRUISE_ACTIVE"]) + ret.cruiseState.nonAdaptive = self.pcm_acc_status in (1, 2, 3, 4, 5, 6) + + ret.genericToggle = bool(cp.vl["LIGHT_STALK"]["AUTO_HIGH_BEAM"]) + ret.espDisabled = cp.vl["ESP_CONTROL"]["TC_DISABLED"] != 0 + + if self.CP.enableBsm: + ret.leftBlindspot = (cp.vl["BSM"]["L_ADJACENT"] == 1) or (cp.vl["BSM"]["L_APPROACHING"] == 1) + ret.rightBlindspot = (cp.vl["BSM"]["R_ADJACENT"] == 1) or (cp.vl["BSM"]["R_APPROACHING"] == 1) + + if self.CP.carFingerprint != CAR.TOYOTA_PRIUS_V: + self.lkas_hud = copy.copy(cp_cam.vl["LKAS_HUD"]) + + if self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR: + self.pcm_follow_distance = cp.vl["PCM_CRUISE_2"]["PCM_FOLLOW_DISTANCE"] + + buttonEvents = [] + prev_distance_button = self.distance_button + if self.CP.carFingerprint in TSS2_CAR: + # lkas button is wired to the camera + prev_lkas_button = self.lkas_button + self.lkas_button = cp_cam.vl["LKAS_HUD"]["LDA_ON_MESSAGE"] + + # Cycles between 1 and 2 when pressing the button, then rests back at 0 after ~3s + if self.lkas_button != 0 and self.lkas_button != prev_lkas_button: + buttonEvents.extend(create_button_events(1, 0, {1: ButtonType.lkas}) + + create_button_events(0, 1, {1: ButtonType.lkas})) + + if self.CP.carFingerprint not in (RADAR_ACC_CAR | SECOC_CAR): + # distance button is wired to the ACC module (camera or radar) + self.distance_button = cp_acc.vl["ACC_CONTROL"]["DISTANCE"] + + buttonEvents += create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}) + elif self.CP_IQ.flags & ToyotaFlagsIQ.SMART_DSU and not self.CP_IQ.flags & ToyotaFlagsIQ.RADAR_CAN_FILTER: + self.distance_button = cp.vl["SDSU"]["FD_BUTTON"] + + buttonEvents += create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}) + + ret.buttonEvents = buttonEvents + + IQCarState.update(self, ret, ret_iq, can_parsers) + + return ret, ret_iq + + @staticmethod + def get_can_parsers(CP, CP_IQ): + pt_messages = [ + ("BLINKERS_STATE", float('nan')), + ] + + cam_messages = [ + ("RSA1", 0), + ("RSA2", 0), + ] + + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, 0), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [] + cam_messages, 2), + } diff --git a/artifacts/package_runtime/iqdbc/car/toyota/fingerprints.py b/artifacts/package_runtime/iqdbc/car/toyota/fingerprints.py new file mode 100644 index 000000000..582f31427 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/fingerprints.py @@ -0,0 +1,1892 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.toyota.values import CAR + +from iqdbc.lvbs.car.iq_fingerprints import extend_fw_versions +from iqdbc.lvbs.car.toyota.iq_fingerprints import FW_VERSIONS_EXT + +Ecu = CarParams.Ecu + +FW_VERSIONS = { + CAR.TOYOTA_AVALON: { + (Ecu.abs, 0x7b0, None): [ + b'F152607060\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881510701300\x00\x00\x00\x00', + b'881510705100\x00\x00\x00\x00', + b'881510705200\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B41051\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0230721100\x00\x00\x00\x00\x00\x00\x00\x00A0C01000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230721200\x00\x00\x00\x00\x00\x00\x00\x00A0C01000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702000\x00\x00\x00\x00', + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F0701100\x00\x00\x00\x00', + b'8646F0703000\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_AVALON_2019: { + (Ecu.abs, 0x7b0, None): [ + b'F152607110\x00\x00\x00\x00\x00\x00', + b'F152607140\x00\x00\x00\x00\x00\x00', + b'F152607171\x00\x00\x00\x00\x00\x00', + b'F152607180\x00\x00\x00\x00\x00\x00', + b'F152641040\x00\x00\x00\x00\x00\x00', + b'F152641050\x00\x00\x00\x00\x00\x00', + b'F152641060\x00\x00\x00\x00\x00\x00', + b'F152641061\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881510703200\x00\x00\x00\x00', + b'881510704200\x00\x00\x00\x00', + b'881514107100\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B07010\x00\x00\x00\x00\x00\x00', + b'8965B41070\x00\x00\x00\x00\x00\x00', + b'8965B41080\x00\x00\x00\x00\x00\x00', + b'8965B41090\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x700, None): [ + b'\x01896630725100\x00\x00\x00\x00', + b'\x01896630725200\x00\x00\x00\x00', + b'\x01896630725300\x00\x00\x00\x00', + b'\x01896630725400\x00\x00\x00\x00', + b'\x01896630735100\x00\x00\x00\x00', + b'\x01896630738000\x00\x00\x00\x00', + b'\x02896630724000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x02896630728000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x02896630734000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x02896630737000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F0702100\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_AVALON_TSS2: { + (Ecu.abs, 0x7b0, None): [ + b'\x01F152607240\x00\x00\x00\x00\x00\x00', + b'\x01F152607250\x00\x00\x00\x00\x00\x00', + b'\x01F152607280\x00\x00\x00\x00\x00\x00', + b'F152641080\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B41110\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x700, None): [ + b'\x018966306Q6000\x00\x00\x00\x00', + b'\x01896630742000\x00\x00\x00\x00', + b'\x01896630743000\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F6201200\x00\x00\x00\x00', + b'\x018821F6201300\x00\x00\x00\x00', + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F4104100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F4104100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_CAMRY: { + (Ecu.engine, 0x700, None): [ + b'\x018966306L3100\x00\x00\x00\x00', + b'\x018966306L4200\x00\x00\x00\x00', + b'\x018966306L5200\x00\x00\x00\x00', + b'\x018966306L9000\x00\x00\x00\x00', + b'\x018966306P8000\x00\x00\x00\x00', + b'\x018966306Q3100\x00\x00\x00\x00', + b'\x018966306Q4000\x00\x00\x00\x00', + b'\x018966306Q4100\x00\x00\x00\x00', + b'\x018966306Q4200\x00\x00\x00\x00', + b'\x018966306Q6000\x00\x00\x00\x00', + b'\x018966333N1100\x00\x00\x00\x00', + b'\x018966333N4300\x00\x00\x00\x00', + b'\x018966333P3000\x00\x00\x00\x00', + b'\x018966333P3100\x00\x00\x00\x00', + b'\x018966333P3200\x00\x00\x00\x00', + b'\x018966333P4200\x00\x00\x00\x00', + b'\x018966333P4300\x00\x00\x00\x00', + b'\x018966333P4400\x00\x00\x00\x00', + b'\x018966333P4500\x00\x00\x00\x00', + b'\x018966333P4700\x00\x00\x00\x00', + b'\x018966333P4900\x00\x00\x00\x00', + b'\x018966333Q6000\x00\x00\x00\x00', + b'\x018966333Q6200\x00\x00\x00\x00', + b'\x018966333Q6300\x00\x00\x00\x00', + b'\x018966333Q6500\x00\x00\x00\x00', + b'\x018966333Q9200\x00\x00\x00\x00', + b'\x018966333W6000\x00\x00\x00\x00', + b'\x018966333X0000\x00\x00\x00\x00', + b'\x018966333X4000\x00\x00\x00\x00', + b'\x01896633T16000\x00\x00\x00\x00', + b'\x01896633TA2000\x00\x00\x00\x00', + b'\x028966306B2100\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306B2300\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306B2500\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306N8100\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306N8200\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306N8300\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306N8400\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306R5000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306R5000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x028966306R6000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966306R6000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x028966306S0000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x028966306S0100\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x028966306S1100\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x02333P1100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'8821F0601200 ', + b'8821F0601300 ', + b'8821F0601400 ', + b'8821F0601500 ', + b'8821F0601600 ', + b'8821F0602000 ', + b'8821F0603300 ', + b'8821F0603400 ', + b'8821F0604000 ', + b'8821F0604100 ', + b'8821F0604200 ', + b'8821F0605200 ', + b'8821F0606200 ', + b'8821F0607200 ', + b'8821F0607300 ', + b'8821F0608000 ', + b'8821F0608200 ', + b'8821F0608300 ', + b'8821F0609000 ', + b'8821F0609100 ', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152606210\x00\x00\x00\x00\x00\x00', + b'F152606230\x00\x00\x00\x00\x00\x00', + b'F152606260\x00\x00\x00\x00\x00\x00', + b'F152606270\x00\x00\x00\x00\x00\x00', + b'F152606290\x00\x00\x00\x00\x00\x00', + b'F152606410\x00\x00\x00\x00\x00\x00', + b'F152633214\x00\x00\x00\x00\x00\x00', + b'F152633540\x00\x00\x00\x00\x00\x00', + b'F152633660\x00\x00\x00\x00\x00\x00', + b'F152633712\x00\x00\x00\x00\x00\x00', + b'F152633713\x00\x00\x00\x00\x00\x00', + b'F152633A10\x00\x00\x00\x00\x00\x00', + b'F152633A20\x00\x00\x00\x00\x00\x00', + b'F152633B51\x00\x00\x00\x00\x00\x00', + b'F152633B60\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B33540\x00\x00\x00\x00\x00\x00', + b'8965B33542\x00\x00\x00\x00\x00\x00', + b'8965B33550\x00\x00\x00\x00\x00\x00', + b'8965B33551\x00\x00\x00\x00\x00\x00', + b'8965B33580\x00\x00\x00\x00\x00\x00', + b'8965B33581\x00\x00\x00\x00\x00\x00', + b'8965B33611\x00\x00\x00\x00\x00\x00', + b'8965B33621\x00\x00\x00\x00\x00\x00', + b'8965B33630\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F0601200 ', + b'8821F0601300 ', + b'8821F0601400 ', + b'8821F0601500 ', + b'8821F0601600 ', + b'8821F0602000 ', + b'8821F0603300 ', + b'8821F0603400 ', + b'8821F0604000 ', + b'8821F0604100 ', + b'8821F0604200 ', + b'8821F0605200 ', + b'8821F0606200 ', + b'8821F0607200 ', + b'8821F0607300 ', + b'8821F0608000 ', + b'8821F0608200 ', + b'8821F0608300 ', + b'8821F0609000 ', + b'8821F0609100 ', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F0601200 ', + b'8646F0601300 ', + b'8646F0601400 ', + b'8646F0603400 ', + b'8646F0603500 ', + b'8646F0604000 ', + b'8646F0604100 ', + b'8646F0605000 ', + b'8646F0606000 ', + b'8646F0606100 ', + b'8646F0607000 ', + b'8646F0607100 ', + ], + }, + CAR.TOYOTA_CAMRY_TSS2: { + (Ecu.eps, 0x7a1, None): [ + b'8965B33630\x00\x00\x00\x00\x00\x00', + b'8965B33640\x00\x00\x00\x00\x00\x00', + b'8965B33650\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F152606370\x00\x00\x00\x00\x00\x00', + b'\x01F152606390\x00\x00\x00\x00\x00\x00', + b'\x01F152606400\x00\x00\x00\x00\x00\x00', + b'\x01F152606431\x00\x00\x00\x00\x00\x00', + b'\x01F152633E11\x00\x00\x00\x00\x00\x00', + b'F152633310\x00\x00\x00\x00\x00\x00', + b'F152633D00\x00\x00\x00\x00\x00\x00', + b'F152633D60\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x700, None): [ + b'\x018966306Q5000\x00\x00\x00\x00', + b'\x018966306Q6000\x00\x00\x00\x00', + b'\x018966306Q7000\x00\x00\x00\x00', + b'\x018966306Q9000\x00\x00\x00\x00', + b'\x018966306R3000\x00\x00\x00\x00', + b'\x018966306R8000\x00\x00\x00\x00', + b'\x018966306T0000\x00\x00\x00\x00', + b'\x018966306T3100\x00\x00\x00\x00', + b'\x018966306T3200\x00\x00\x00\x00', + b'\x018966306T4000\x00\x00\x00\x00', + b'\x018966306T4100\x00\x00\x00\x00', + b'\x018966306V1000\x00\x00\x00\x00', + b'\x018966333Z1000\x00\x00\x00\x00', + b'\x018966333Z9000\x00\x00\x00\x00', + b'\x01896633T20000\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F6201200\x00\x00\x00\x00', + b'\x018821F6201300\x00\x00\x00\x00', + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F0602100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + b'\x028646F0602200\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + b'\x028646F0602300\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F3305200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F3305200\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + b'\x028646F3305300\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F3305300\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + b'\x028646F3305400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F3305500\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_CHR: { + (Ecu.engine, 0x700, None): [ + b'\x01896631017100\x00\x00\x00\x00', + b'\x01896631017200\x00\x00\x00\x00', + b'\x01896631021100\x00\x00\x00\x00', + b'\x0189663F413100\x00\x00\x00\x00', + b'\x0189663F414100\x00\x00\x00\x00', + b'\x0189663F438000\x00\x00\x00\x00', + b'\x02896631013200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x0289663F405000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x0289663F405100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x0289663F418000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x0289663F423000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x0289663F431000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'8821F0W01000 ', + b'8821F0W01100 ', + b'8821FF401600 ', + b'8821FF401800 ', + b'8821FF402300 ', + b'8821FF402400 ', + b'8821FF404000 ', + b'8821FF404100 ', + b'8821FF405000 ', + b'8821FF405100 ', + b'8821FF406000 ', + b'8821FF407100 ', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152610012\x00\x00\x00\x00\x00\x00', + b'F152610013\x00\x00\x00\x00\x00\x00', + b'F152610014\x00\x00\x00\x00\x00\x00', + b'F152610020\x00\x00\x00\x00\x00\x00', + b'F152610040\x00\x00\x00\x00\x00\x00', + b'F152610153\x00\x00\x00\x00\x00\x00', + b'F152610190\x00\x00\x00\x00\x00\x00', + b'F152610200\x00\x00\x00\x00\x00\x00', + b'F152610210\x00\x00\x00\x00\x00\x00', + b'F152610220\x00\x00\x00\x00\x00\x00', + b'F152610230\x00\x00\x00\x00\x00\x00', + b'F1526F4034\x00\x00\x00\x00\x00\x00', + b'F1526F4044\x00\x00\x00\x00\x00\x00', + b'F1526F4073\x00\x00\x00\x00\x00\x00', + b'F1526F4121\x00\x00\x00\x00\x00\x00', + b'F1526F4122\x00\x00\x00\x00\x00\x00', + b'F1526F4190\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B10011\x00\x00\x00\x00\x00\x00', + b'8965B10020\x00\x00\x00\x00\x00\x00', + b'8965B10040\x00\x00\x00\x00\x00\x00', + b'8965B10050\x00\x00\x00\x00\x00\x00', + b'8965B10070\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0331024000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00', + b'\x0331024000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00', + b'\x0331036000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00', + b'\x033F401100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203102\x00\x00\x00\x00', + b'\x033F401200\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00', + b'\x033F424000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00', + b'\x033F424000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00', + b'\x033F435000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F0W01000 ', + b'8821F0W01100 ', + b'8821FF401600 ', + b'8821FF401800 ', + b'8821FF402300 ', + b'8821FF402400 ', + b'8821FF404000 ', + b'8821FF404100 ', + b'8821FF405000 ', + b'8821FF405100 ', + b'8821FF406000 ', + b'8821FF407100 ', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646FF401700 ', + b'8646FF401800 ', + b'8646FF402100 ', + b'8646FF404000 ', + b'8646FF406000 ', + b'8646FF407000 ', + b'8646FF407100 ', + ], + }, + CAR.TOYOTA_CHR_TSS2: { + (Ecu.abs, 0x7b0, None): [ + b'F152610041\x00\x00\x00\x00\x00\x00', + b'F152610260\x00\x00\x00\x00\x00\x00', + b'F1526F4270\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B10091\x00\x00\x00\x00\x00\x00', + b'8965B10092\x00\x00\x00\x00\x00\x00', + b'8965B10110\x00\x00\x00\x00\x00\x00', + b'8965B10111\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x700, None): [ + b'\x0189663F438000\x00\x00\x00\x00', + b'\x0189663F459000\x00\x00\x00\x00', + b'\x02896631025000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x0289663F453000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0331014000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821FF410200\x00\x00\x00\x00', + b'\x018821FF410300\x00\x00\x00\x00', + b'\x018821FF410400\x00\x00\x00\x00', + b'\x018821FF410500\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646FF410200\x00\x00\x00\x008646GF408200\x00\x00\x00\x00', + b'\x028646FF411100\x00\x00\x00\x008646GF409000\x00\x00\x00\x00', + b'\x028646FF413000\x00\x00\x00\x008646GF411000\x00\x00\x00\x00', + b'\x028646FF413100\x00\x00\x00\x008646GF411100\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_COROLLA: { + (Ecu.engine, 0x7e0, None): [ + b'\x0230ZC2000\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZC2100\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZC2200\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZC2300\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZC3000\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZC3100\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZC3200\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZC3300\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0330ZC1200\x00\x00\x00\x00\x00\x00\x00\x0050212000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881510201100\x00\x00\x00\x00', + b'881510201200\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152602190\x00\x00\x00\x00\x00\x00', + b'F152602191\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B02181\x00\x00\x00\x00\x00\x00', + b'8965B02191\x00\x00\x00\x00\x00\x00', + b'8965B48150\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F0201101\x00\x00\x00\x00', + b'8646F0201200\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_COROLLA_TSS2: { + (Ecu.engine, 0x700, None): [ + b'\x01896630A22000\x00\x00\x00\x00', + b'\x01896630A42000\x00\x00\x00\x00', + b'\x01896630ZG2000\x00\x00\x00\x00', + b'\x01896630ZG5000\x00\x00\x00\x00', + b'\x01896630ZG5100\x00\x00\x00\x00', + b'\x01896630ZG5200\x00\x00\x00\x00', + b'\x01896630ZG5300\x00\x00\x00\x00', + b'\x01896630ZJ1000\x00\x00\x00\x00', + b'\x01896630ZP1000\x00\x00\x00\x00', + b'\x01896630ZP2000\x00\x00\x00\x00', + b'\x01896630ZQ5000\x00\x00\x00\x00', + b'\x01896630ZU8000\x00\x00\x00\x00', + b'\x01896630ZU9000\x00\x00\x00\x00', + b'\x01896630ZX4000\x00\x00\x00\x00', + b'\x01896630ZX7100\x00\x00\x00\x00', + b'\x018966312L8000\x00\x00\x00\x00', + b'\x018966312M0000\x00\x00\x00\x00', + b'\x018966312M9000\x00\x00\x00\x00', + b'\x018966312P9000\x00\x00\x00\x00', + b'\x018966312P9100\x00\x00\x00\x00', + b'\x018966312P9200\x00\x00\x00\x00', + b'\x018966312P9300\x00\x00\x00\x00', + b'\x018966312Q2300\x00\x00\x00\x00', + b'\x018966312Q8000\x00\x00\x00\x00', + b'\x018966312R0000\x00\x00\x00\x00', + b'\x018966312R0100\x00\x00\x00\x00', + b'\x018966312R0200\x00\x00\x00\x00', + b'\x018966312R1000\x00\x00\x00\x00', + b'\x018966312R1100\x00\x00\x00\x00', + b'\x018966312R3100\x00\x00\x00\x00', + b'\x018966312S5000\x00\x00\x00\x00', + b'\x018966312S7000\x00\x00\x00\x00', + b'\x018966312W3000\x00\x00\x00\x00', + b'\x018966312W9000\x00\x00\x00\x00', + b'\x01896637621000\x00\x00\x00\x00', + b'\x01896637623000\x00\x00\x00\x00', + b'\x01896637624000\x00\x00\x00\x00', + b'\x01896637625000\x00\x00\x00\x00', + b'\x01896637626000\x00\x00\x00\x00', + b'\x01896637639000\x00\x00\x00\x00', + b'\x01896637643000\x00\x00\x00\x00', + b'\x01896637644000\x00\x00\x00\x00', + b'\x01896637648000\x00\x00\x00\x00', + b'\x01896637649000\x00\x00\x00\x00', + b'\x02896630A07000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630A21000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630ZJ5000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630ZK8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630ZN8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630ZQ3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630ZR2000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630ZT8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630ZT9000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896630ZZ0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966312K6000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966312L0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966312L0100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966312Q3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966312Q3100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966312Q4000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x038966312L7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00', + b'\x038966312N1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00', + b'\x038966312T3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0230A10000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230A11000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZN4000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230ZN5000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02312K4000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02312U5000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x03312K7000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00', + b'\x03312M3000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00', + b'\x03312N6000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00', + b'\x03312N6000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00', + b'\x03312N6000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00', + b'\x03312N6100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00', + b'\x03312N6100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00', + b'\x03312N6200\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203202\x00\x00\x00\x00', + b'\x03312N6200\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203302\x00\x00\x00\x00', + b'\x03312N6200\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203402\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'\x018965B12350\x00\x00\x00\x00\x00\x00', + b'\x018965B12470\x00\x00\x00\x00\x00\x00', + b'\x018965B12490\x00\x00\x00\x00\x00\x00', + b'\x018965B12500\x00\x00\x00\x00\x00\x00', + b'\x018965B12510\x00\x00\x00\x00\x00\x00', + b'\x018965B12520\x00\x00\x00\x00\x00\x00', + b'\x018965B12530\x00\x00\x00\x00\x00\x00', + b'\x018965B1254000\x00\x00\x00\x00', + b'\x018965B1255000\x00\x00\x00\x00', + b'\x018965B1256000\x00\x00\x00\x00', + b'\x018965B1270000\x00\x00\x00\x00', + b'8965B12361\x00\x00\x00\x00\x00\x00', + b'8965B12451\x00\x00\x00\x00\x00\x00', + b'8965B16011\x00\x00\x00\x00\x00\x00', + b'8965B16101\x00\x00\x00\x00\x00\x00', + b'8965B16170\x00\x00\x00\x00\x00\x00', + b'8965B16260\x00\x00\x00\x00\x00\x00', + b'8965B76012\x00\x00\x00\x00\x00\x00', + b'8965B76050\x00\x00\x00\x00\x00\x00', + b'8965B76091\x00\x00\x00\x00\x00\x00', + b'8965B76101\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F152602280\x00\x00\x00\x00\x00\x00', + b'\x01F152602281\x00\x00\x00\x00\x00\x00', + b'\x01F152602470\x00\x00\x00\x00\x00\x00', + b'\x01F152602560\x00\x00\x00\x00\x00\x00', + b'\x01F152602590\x00\x00\x00\x00\x00\x00', + b'\x01F152602650\x00\x00\x00\x00\x00\x00', + b'\x01F15260A010\x00\x00\x00\x00\x00\x00', + b'\x01F15260A050\x00\x00\x00\x00\x00\x00', + b'\x01F15260A070\x00\x00\x00\x00\x00\x00', + b'\x01F15260A33000\x00\x00\x00\x00', + b'\x01F152612641\x00\x00\x00\x00\x00\x00', + b'\x01F152612651\x00\x00\x00\x00\x00\x00', + b'\x01F152612862\x00\x00\x00\x00\x00\x00', + b'\x01F152612B10\x00\x00\x00\x00\x00\x00', + b'\x01F152612B51\x00\x00\x00\x00\x00\x00', + b'\x01F152612B60\x00\x00\x00\x00\x00\x00', + b'\x01F152612B61\x00\x00\x00\x00\x00\x00', + b'\x01F152612B62\x00\x00\x00\x00\x00\x00', + b'\x01F152612B70\x00\x00\x00\x00\x00\x00', + b'\x01F152612B71\x00\x00\x00\x00\x00\x00', + b'\x01F152612B81\x00\x00\x00\x00\x00\x00', + b'\x01F152612B90\x00\x00\x00\x00\x00\x00', + b'\x01F152612B91\x00\x00\x00\x00\x00\x00', + b'\x01F152612C00\x00\x00\x00\x00\x00\x00', + b'\x01F152676250\x00\x00\x00\x00\x00\x00', + b'\x01F152676350\x00\x00\x00\x00\x00\x00', + b'F152612590\x00\x00\x00\x00\x00\x00', + b'F152612691\x00\x00\x00\x00\x00\x00', + b'F152612692\x00\x00\x00\x00\x00\x00', + b'F152612700\x00\x00\x00\x00\x00\x00', + b'F152612710\x00\x00\x00\x00\x00\x00', + b'F152612790\x00\x00\x00\x00\x00\x00', + b'F152612800\x00\x00\x00\x00\x00\x00', + b'F152612820\x00\x00\x00\x00\x00\x00', + b'F152612840\x00\x00\x00\x00\x00\x00', + b'F152612842\x00\x00\x00\x00\x00\x00', + b'F152612890\x00\x00\x00\x00\x00\x00', + b'F152612A00\x00\x00\x00\x00\x00\x00', + b'F152612A10\x00\x00\x00\x00\x00\x00', + b'F152612D00\x00\x00\x00\x00\x00\x00', + b'F152616011\x00\x00\x00\x00\x00\x00', + b'F152616030\x00\x00\x00\x00\x00\x00', + b'F152616060\x00\x00\x00\x00\x00\x00', + b'F152642540\x00\x00\x00\x00\x00\x00', + b'F152676293\x00\x00\x00\x00\x00\x00', + b'F152676303\x00\x00\x00\x00\x00\x00', + b'F152676304\x00\x00\x00\x00\x00\x00', + b'F152676311\x00\x00\x00\x00\x00\x00', + b'F152676371\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301100\x00\x00\x00\x00', + b'\x018821F3301200\x00\x00\x00\x00', + b'\x018821F3301300\x00\x00\x00\x00', + b'\x018821F3301400\x00\x00\x00\x00', + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F12010C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F12010D0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F1201100\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F1201200\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F1201300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F1201400\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + b'\x028646F1202000\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F1202100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F1202200\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + b'\x028646F1206000\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + b'\x028646F1601100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F1601200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F1601300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F1601500\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F4203400\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F76020C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F7603100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F7603200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F7603300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F7605100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_HIGHLANDER: { + (Ecu.engine, 0x700, None): [ + b'\x01896630E09000\x00\x00\x00\x00', + b'\x01896630E43000\x00\x00\x00\x00', + b'\x01896630E43100\x00\x00\x00\x00', + b'\x01896630E43200\x00\x00\x00\x00', + b'\x01896630E43500\x00\x00\x00\x00', + b'\x01896630E44200\x00\x00\x00\x00', + b'\x01896630E44400\x00\x00\x00\x00', + b'\x01896630E45000\x00\x00\x00\x00', + b'\x01896630E45100\x00\x00\x00\x00', + b'\x01896630E45200\x00\x00\x00\x00', + b'\x01896630E46000\x00\x00\x00\x00', + b'\x01896630E46200\x00\x00\x00\x00', + b'\x01896630E48200\x00\x00\x00\x00', + b'\x01896630E74000\x00\x00\x00\x00', + b'\x01896630E75000\x00\x00\x00\x00', + b'\x01896630E76000\x00\x00\x00\x00', + b'\x01896630E77000\x00\x00\x00\x00', + b'\x01896630E83000\x00\x00\x00\x00', + b'\x01896630E84000\x00\x00\x00\x00', + b'\x01896630E85000\x00\x00\x00\x00', + b'\x01896630E86000\x00\x00\x00\x00', + b'\x01896630E88000\x00\x00\x00\x00', + b'\x01896630EA0000\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0230E40000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230E40100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230E51000\x00\x00\x00\x00\x00\x00\x00\x0050E17000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230E82000\x00\x00\x00\x00\x00\x00\x00\x0050E17000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230EA2000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0230EA2100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B48140\x00\x00\x00\x00\x00\x00', + b'8965B48150\x00\x00\x00\x00\x00\x00', + b'8965B48160\x00\x00\x00\x00\x00\x00', + b'8965B48210\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F15260E011\x00\x00\x00\x00\x00\x00', + b'F152648541\x00\x00\x00\x00\x00\x00', + b'F152648542\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881510E01100\x00\x00\x00\x00', + b'881510E01200\x00\x00\x00\x00', + b'881510E02100\x00\x00\x00\x00', + b'881510E02200\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F0E01200\x00\x00\x00\x00', + b'8646F0E01300\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_HIGHLANDER_TSS2: { + (Ecu.eps, 0x7a1, None): [ + b'8965B48241\x00\x00\x00\x00\x00\x00', + b'8965B48310\x00\x00\x00\x00\x00\x00', + b'8965B48320\x00\x00\x00\x00\x00\x00', + b'8965B48400\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F15260E051\x00\x00\x00\x00\x00\x00', + b'\x01F15260E05300\x00\x00\x00\x00', + b'\x01F15260E061\x00\x00\x00\x00\x00\x00', + b'\x01F15260E110\x00\x00\x00\x00\x00\x00', + b'\x01F15260E170\x00\x00\x00\x00\x00\x00', + b'\x01F15264872300\x00\x00\x00\x00', + b'\x01F15264872400\x00\x00\x00\x00', + b'\x01F15264872500\x00\x00\x00\x00', + b'\x01F15264872600\x00\x00\x00\x00', + b'\x01F15264872700\x00\x00\x00\x00', + b'\x01F15264873500\x00\x00\x00\x00', + b'\x01F152648C6300\x00\x00\x00\x00', + b'\x01F152648J4000\x00\x00\x00\x00', + b'\x01F152648J5000\x00\x00\x00\x00', + b'\x01F152648J6000\x00\x00\x00\x00', + b'\x01F152648J7000\x00\x00\x00\x00', + b'\x01F152648L5000\x00\x00\x00\x00', + ], + (Ecu.engine, 0x700, None): [ + b'\x01896630E62100\x00\x00\x00\x00', + b'\x01896630E62200\x00\x00\x00\x00', + b'\x01896630E64100\x00\x00\x00\x00', + b'\x01896630E64200\x00\x00\x00\x00', + b'\x01896630E64400\x00\x00\x00\x00', + b'\x01896630E67000\x00\x00\x00\x00', + b'\x01896630EA1000\x00\x00\x00\x00', + b'\x01896630EB1000\x00\x00\x00\x00', + b'\x01896630EB1100\x00\x00\x00\x00', + b'\x01896630EB1200\x00\x00\x00\x00', + b'\x01896630EB1300\x00\x00\x00\x00', + b'\x01896630EB2000\x00\x00\x00\x00', + b'\x01896630EB2100\x00\x00\x00\x00', + b'\x01896630EB2200\x00\x00\x00\x00', + b'\x01896630EC4000\x00\x00\x00\x00', + b'\x01896630ED9000\x00\x00\x00\x00', + b'\x01896630ED9100\x00\x00\x00\x00', + b'\x01896630EE1000\x00\x00\x00\x00', + b'\x01896630EE1100\x00\x00\x00\x00', + b'\x01896630EE4000\x00\x00\x00\x00', + b'\x01896630EE4100\x00\x00\x00\x00', + b'\x01896630EE5000\x00\x00\x00\x00', + b'\x01896630EE6000\x00\x00\x00\x00', + b'\x01896630EE7000\x00\x00\x00\x00', + b'\x01896630EF8000\x00\x00\x00\x00', + b'\x01896630EG3000\x00\x00\x00\x00', + b'\x01896630EG3100\x00\x00\x00\x00', + b'\x01896630EG5000\x00\x00\x00\x00', + b'\x01896630EG5100\x00\x00\x00\x00', + b'\x02896630E66000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896630E66100\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896630EB3000\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896630EB3100\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896630EB3200\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301400\x00\x00\x00\x00', + b'\x018821F6201200\x00\x00\x00\x00', + b'\x018821F6201300\x00\x00\x00\x00', + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F0E02100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F4803000\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F4803000\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + b'\x028646F4803200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_IS: { + (Ecu.engine, 0x700, None): [ + b'\x018966353M7000\x00\x00\x00\x00', + b'\x018966353M7100\x00\x00\x00\x00', + b'\x018966353Q2000\x00\x00\x00\x00', + b'\x018966353Q2100\x00\x00\x00\x00', + b'\x018966353Q2300\x00\x00\x00\x00', + b'\x018966353Q4000\x00\x00\x00\x00', + b'\x018966353R1100\x00\x00\x00\x00', + b'\x018966353R5000\x00\x00\x00\x00', + b'\x018966353R7000\x00\x00\x00\x00', + b'\x018966353R7100\x00\x00\x00\x00', + b'\x018966353R8000\x00\x00\x00\x00', + b'\x018966353R8100\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0232480000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02353N5100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02353P7000\x00\x00\x00\x00\x00\x00\x00\x00530J5000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02353P9000\x00\x00\x00\x00\x00\x00\x00\x00553C1000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152653300\x00\x00\x00\x00\x00\x00', + b'F152653301\x00\x00\x00\x00\x00\x00', + b'F152653310\x00\x00\x00\x00\x00\x00', + b'F152653330\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881515306200\x00\x00\x00\x00', + b'881515306400\x00\x00\x00\x00', + b'881515306500\x00\x00\x00\x00', + b'881515307400\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B53270\x00\x00\x00\x00\x00\x00', + b'8965B53271\x00\x00\x00\x00\x00\x00', + b'8965B53280\x00\x00\x00\x00\x00\x00', + b'8965B53281\x00\x00\x00\x00\x00\x00', + b'8965B53310\x00\x00\x00\x00\x00\x00', + b'8965B53311\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F5301101\x00\x00\x00\x00', + b'8646F5301200\x00\x00\x00\x00', + b'8646F5301300\x00\x00\x00\x00', + b'8646F5301400\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_IS_TSS2: { + (Ecu.engine, 0x700, None): [ + b'\x018966353S1000\x00\x00\x00\x00', + b'\x018966353S2000\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x02353U0000\x00\x00\x00\x00\x00\x00\x00\x0052422000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F15265337200\x00\x00\x00\x00', + b'\x01F15265342000\x00\x00\x00\x00', + b'\x01F15265343000\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B53450\x00\x00\x00\x00\x00\x00', + b'8965B53800\x00\x00\x00\x00\x00\x00', + b'8965B53801\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F6201200\x00\x00\x00\x00', + b'\x018821F6201300\x00\x00\x00\x00', + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F5303300\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F5303300\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + b'\x028646F5303400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_PRIUS: { + (Ecu.engine, 0x700, None): [ + b'\x02896634761000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634761100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634761200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634762000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634762100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634763000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634763100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634765000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634765100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634769000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634769100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634769200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634770000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634770100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634774000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634774100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634774200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634782000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634784000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347A0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347A1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347A5000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347A8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347B0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x03896634759100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', + b'\x03896634759200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', + b'\x03896634759200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00', + b'\x03896634759300\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', + b'\x03896634759300\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00', + b'\x03896634760000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701002\x00\x00\x00\x00', + b'\x03896634760000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', + b'\x03896634760000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00', + b'\x03896634760100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', + b'\x03896634760200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', + b'\x03896634760200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00', + b'\x03896634760300\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00', + b'\x03896634768000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4703001\x00\x00\x00\x00', + b'\x03896634768000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4703002\x00\x00\x00\x00', + b'\x03896634768100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4703002\x00\x00\x00\x00', + b'\x03896634785000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4705001\x00\x00\x00\x00', + b'\x03896634785000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710001\x00\x00\x00\x00', + b'\x03896634786000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4705001\x00\x00\x00\x00', + b'\x03896634786000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710001\x00\x00\x00\x00', + b'\x03896634789000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4703002\x00\x00\x00\x00', + b'\x038966347A3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', + b'\x038966347A3000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4707001\x00\x00\x00\x00', + b'\x038966347B6000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710001\x00\x00\x00\x00', + b'\x038966347B7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00', + b'\x038966347B7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710001\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B47021\x00\x00\x00\x00\x00\x00', + b'8965B47022\x00\x00\x00\x00\x00\x00', + b'8965B47023\x00\x00\x00\x00\x00\x00', + b'8965B47050\x00\x00\x00\x00\x00\x00', + b'8965B47060\x00\x00\x00\x00\x00\x00', + b'8965B47070\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152647290\x00\x00\x00\x00\x00\x00', + b'F152647300\x00\x00\x00\x00\x00\x00', + b'F152647310\x00\x00\x00\x00\x00\x00', + b'F152647414\x00\x00\x00\x00\x00\x00', + b'F152647415\x00\x00\x00\x00\x00\x00', + b'F152647416\x00\x00\x00\x00\x00\x00', + b'F152647417\x00\x00\x00\x00\x00\x00', + b'F152647470\x00\x00\x00\x00\x00\x00', + b'F152647490\x00\x00\x00\x00\x00\x00', + b'F152647682\x00\x00\x00\x00\x00\x00', + b'F152647683\x00\x00\x00\x00\x00\x00', + b'F152647684\x00\x00\x00\x00\x00\x00', + b'F152647862\x00\x00\x00\x00\x00\x00', + b'F152647863\x00\x00\x00\x00\x00\x00', + b'F152647864\x00\x00\x00\x00\x00\x00', + b'F152647865\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881514702300\x00\x00\x00\x00', + b'881514702400\x00\x00\x00\x00', + b'881514703100\x00\x00\x00\x00', + b'881514704100\x00\x00\x00\x00', + b'881514706000\x00\x00\x00\x00', + b'881514706100\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702000\x00\x00\x00\x00', + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F4701300\x00\x00\x00\x00', + b'8646F4702001\x00\x00\x00\x00', + b'8646F4702100\x00\x00\x00\x00', + b'8646F4702200\x00\x00\x00\x00', + b'8646F4705000\x00\x00\x00\x00', + b'8646F4705200\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_PRIUS_V: { + (Ecu.abs, 0x7b0, None): [ + b'F152647280\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0234781000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881514705100\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F4703300\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_RAV4: { + (Ecu.engine, 0x7e0, None): [ + b'\x02342Q1000\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342Q1100\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342Q1200\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342Q1300\x00\x00\x00\x00\x00\x00\x00\x0054212000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342Q2000\x00\x00\x00\x00\x00\x00\x00\x0054213000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342Q2100\x00\x00\x00\x00\x00\x00\x00\x0054213000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342Q2200\x00\x00\x00\x00\x00\x00\x00\x0054213000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342Q3000\x00\x00\x00\x00\x00\x00\x00\x0054214000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342Q4000\x00\x00\x00\x00\x00\x00\x00\x0054215000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B42063\x00\x00\x00\x00\x00\x00', + b'8965B42073\x00\x00\x00\x00\x00\x00', + b'8965B42082\x00\x00\x00\x00\x00\x00', + b'8965B42083\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F15260R102\x00\x00\x00\x00\x00\x00', + b'F15260R103\x00\x00\x00\x00\x00\x00', + b'F152642492\x00\x00\x00\x00\x00\x00', + b'F152642493\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881514201200\x00\x00\x00\x00', + b'881514201300\x00\x00\x00\x00', + b'881514201400\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702000\x00\x00\x00\x00', + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F4201100\x00\x00\x00\x00', + b'8646F4201200\x00\x00\x00\x00', + b'8646F4202001\x00\x00\x00\x00', + b'8646F4202100\x00\x00\x00\x00', + b'8646F4204000\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_RAV4H: { + (Ecu.engine, 0x7e0, None): [ + b'\x02342N9000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342N9100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02342P0000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B42102\x00\x00\x00\x00\x00\x00', + b'8965B42103\x00\x00\x00\x00\x00\x00', + b'8965B42112\x00\x00\x00\x00\x00\x00', + b'8965B42162\x00\x00\x00\x00\x00\x00', + b'8965B42163\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152642090\x00\x00\x00\x00\x00\x00', + b'F152642110\x00\x00\x00\x00\x00\x00', + b'F152642120\x00\x00\x00\x00\x00\x00', + b'F152642400\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881514202200\x00\x00\x00\x00', + b'881514202300\x00\x00\x00\x00', + b'881514202400\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702000\x00\x00\x00\x00', + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F4201100\x00\x00\x00\x00', + b'8646F4201200\x00\x00\x00\x00', + b'8646F4202001\x00\x00\x00\x00', + b'8646F4202100\x00\x00\x00\x00', + b'8646F4204000\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_RAV4_PRIME: { + (Ecu.engine, 0x700, None): [ + b'\x018966342S7000\x00\x00\x00\x00', + b'\x018966342Z1000\x00\x00\x00\x00', + b'\x018966342Z1100\x00\x00\x00\x00', + b'\x01896634AJ7000\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F15264228300\x00\x00\x00\x00', + b'\x01F15264228500\x00\x00\x00\x00', + b'\x01F15264284100\x00\x00\x00\x00', + b'\x01F152642F3000\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'\x018965B4209000\x00\x00\x00\x00', + b'\x018965B4233100\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301400\x00\x00\x00\x00', + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F4205200\x00\x00\x00\x008646G4202000\x00\x00\x00\x00', + b'\x028646F4205300\x00\x00\x00\x008646G4202100\x00\x00\x00\x00', + b'\x028646F4210100\x00\x00\x00\x008646G3305000\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_RAV4_TSS2: { + (Ecu.engine, 0x700, None): [ + b'\x01896630R58000\x00\x00\x00\x00', + b'\x01896630R58100\x00\x00\x00\x00', + b'\x018966342E2000\x00\x00\x00\x00', + b'\x018966342M5000\x00\x00\x00\x00', + b'\x018966342M8000\x00\x00\x00\x00', + b'\x018966342S9000\x00\x00\x00\x00', + b'\x018966342T1000\x00\x00\x00\x00', + b'\x018966342T6000\x00\x00\x00\x00', + b'\x018966342T9000\x00\x00\x00\x00', + b'\x018966342U4000\x00\x00\x00\x00', + b'\x018966342U4100\x00\x00\x00\x00', + b'\x018966342U5100\x00\x00\x00\x00', + b'\x018966342V0000\x00\x00\x00\x00', + b'\x018966342V3000\x00\x00\x00\x00', + b'\x018966342V3100\x00\x00\x00\x00', + b'\x018966342V3200\x00\x00\x00\x00', + b'\x018966342W5000\x00\x00\x00\x00', + b'\x018966342W7000\x00\x00\x00\x00', + b'\x018966342W8000\x00\x00\x00\x00', + b'\x018966342W9000\x00\x00\x00\x00', + b'\x018966342X5000\x00\x00\x00\x00', + b'\x018966342X6000\x00\x00\x00\x00', + b'\x01896634A05000\x00\x00\x00\x00', + b'\x01896634A15000\x00\x00\x00\x00', + b'\x01896634A19000\x00\x00\x00\x00', + b'\x01896634A19100\x00\x00\x00\x00', + b'\x01896634A20000\x00\x00\x00\x00', + b'\x01896634A20100\x00\x00\x00\x00', + b'\x01896634A22000\x00\x00\x00\x00', + b'\x01896634A22100\x00\x00\x00\x00', + b'\x01896634A25000\x00\x00\x00\x00', + b'\x01896634A30000\x00\x00\x00\x00', + b'\x01896634A44000\x00\x00\x00\x00', + b'\x01896634A45000\x00\x00\x00\x00', + b'\x01896634A46000\x00\x00\x00\x00', + b'\x028966342M7000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00', + b'\x028966342T0000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00', + b'\x028966342V1000\x00\x00\x00\x00897CF1202001\x00\x00\x00\x00', + b'\x028966342W4001\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00', + b'\x028966342Y8000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00', + b'\x028966342Z8000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00', + b'\x02896634A13000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02896634A13001\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896634A13101\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896634A13201\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896634A14001\x00\x00\x00\x00897CF0R01000\x00\x00\x00\x00', + b'\x02896634A14001\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00', + b'\x02896634A14001\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896634A14101\x00\x00\x00\x00897CF4801001\x00\x00\x00\x00', + b'\x02896634A18000\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00', + b'\x02896634A18100\x00\x00\x00\x00897CF1201001\x00\x00\x00\x00', + b'\x02896634A23000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02896634A23001\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00', + b'\x02896634A23101\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00', + b'\x02896634A43000\x00\x00\x00\x00897CF4201001\x00\x00\x00\x00', + b'\x02896634A47000\x00\x00\x00\x00897CF4201001\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F15260R210\x00\x00\x00\x00\x00\x00', + b'\x01F15260R220\x00\x00\x00\x00\x00\x00', + b'\x01F15260R290\x00\x00\x00\x00\x00\x00', + b'\x01F15260R292\x00\x00\x00\x00\x00\x00', + b'\x01F15260R300\x00\x00\x00\x00\x00\x00', + b'\x01F15260R302\x00\x00\x00\x00\x00\x00', + b'\x01F152642551\x00\x00\x00\x00\x00\x00', + b'\x01F152642561\x00\x00\x00\x00\x00\x00', + b'\x01F152642601\x00\x00\x00\x00\x00\x00', + b'\x01F152642700\x00\x00\x00\x00\x00\x00', + b'\x01F152642701\x00\x00\x00\x00\x00\x00', + b'\x01F152642710\x00\x00\x00\x00\x00\x00', + b'\x01F152642711\x00\x00\x00\x00\x00\x00', + b'\x01F152642750\x00\x00\x00\x00\x00\x00', + b'\x01F152642751\x00\x00\x00\x00\x00\x00', + b'F152642290\x00\x00\x00\x00\x00\x00', + b'F152642291\x00\x00\x00\x00\x00\x00', + b'F152642322\x00\x00\x00\x00\x00\x00', + b'F152642330\x00\x00\x00\x00\x00\x00', + b'F152642331\x00\x00\x00\x00\x00\x00', + b'F152642520\x00\x00\x00\x00\x00\x00', + b'F152642521\x00\x00\x00\x00\x00\x00', + b'F152642531\x00\x00\x00\x00\x00\x00', + b'F152642532\x00\x00\x00\x00\x00\x00', + b'F152642540\x00\x00\x00\x00\x00\x00', + b'F152642541\x00\x00\x00\x00\x00\x00', + b'F152642542\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'\x028965B0R01200\x00\x00\x00\x008965B0R02200\x00\x00\x00\x00', + b'\x028965B0R01300\x00\x00\x00\x008965B0R02300\x00\x00\x00\x00', + b'\x028965B0R01400\x00\x00\x00\x008965B0R02400\x00\x00\x00\x00', + b'8965B42170\x00\x00\x00\x00\x00\x00', + b'8965B42171\x00\x00\x00\x00\x00\x00', + b'8965B42180\x00\x00\x00\x00\x00\x00', + b'8965B42181\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301100\x00\x00\x00\x00', + b'\x018821F3301200\x00\x00\x00\x00', + b'\x018821F3301300\x00\x00\x00\x00', + b'\x018821F3301400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F4203200\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F4203300\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F4203400\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F4203500\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F4203700\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F4203800\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_RAV4_TSS2_2022: { + (Ecu.abs, 0x7b0, None): [ + b'\x01F15260R350\x00\x00\x00\x00\x00\x00', + b'\x01F15260R361\x00\x00\x00\x00\x00\x00', + b'\x01F15264283100\x00\x00\x00\x00', + b'\x01F15264283200\x00\x00\x00\x00', + b'\x01F15264286100\x00\x00\x00\x00', + b'\x01F15264286200\x00\x00\x00\x00', + b'\x01F152642870\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'\x028965B0R01500\x00\x00\x00\x008965B0R02500\x00\x00\x00\x00', + b'8965B42172\x00\x00\x00\x00\x00\x00', + b'8965B42182\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x700, None): [ + b'\x01896634A02001\x00\x00\x00\x00', + b'\x01896634A02101\x00\x00\x00\x00', + b'\x01896634A03000\x00\x00\x00\x00', + b'\x01896634A08000\x00\x00\x00\x00', + b'\x01896634A59000\x00\x00\x00\x00', + b'\x01896634A61000\x00\x00\x00\x00', + b'\x01896634A62000\x00\x00\x00\x00', + b'\x01896634A62100\x00\x00\x00\x00', + b'\x01896634A63000\x00\x00\x00\x00', + b'\x01896634A88000\x00\x00\x00\x00', + b'\x01896634A89000\x00\x00\x00\x00', + b'\x01896634A89100\x00\x00\x00\x00', + b'\x01896634AA0000\x00\x00\x00\x00', + b'\x01896634AA0100\x00\x00\x00\x00', + b'\x01896634AA1000\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F0R01100\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F0R02100\x00\x00\x00\x008646G0R01100\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_RAV4_TSS2_2023: { + (Ecu.abs, 0x7b0, None): [ + b'\x01F15260R440\x00\x00\x00\x00\x00\x00', + b'\x01F15260R450\x00\x00\x00\x00\x00\x00', + b'\x01F15260R50000\x00\x00\x00\x00', + b'\x01F15260R51000\x00\x00\x00\x00', + b'\x01F15264283200\x00\x00\x00\x00', + b'\x01F15264283300\x00\x00\x00\x00', + b'\x01F152642F1000\x00\x00\x00\x00', + b'\x01F152642F8000\x00\x00\x00\x00', + b'\x01F152642F8100\x00\x00\x00\x00', + b'\x01F152642F9000\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'\x028965B0R11000\x00\x00\x00\x008965B0R12000\x00\x00\x00\x00', + b'8965B42371\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x700, None): [ + b'\x01896634A61000\x00\x00\x00\x00', + b'\x01896634A88100\x00\x00\x00\x00', + b'\x01896634A89100\x00\x00\x00\x00', + b'\x01896634AD7000\x00\x00\x00\x00', + b'\x01896634AE1001\x00\x00\x00\x00', + b'\x01896634AF0000\x00\x00\x00\x00', + b'\x01896634AJ2000\x00\x00\x00\x00', + b'\x01896634AJ3000\x00\x00\x00\x00', + b'\x01896634AL5000\x00\x00\x00\x00', + b'\x01896634AL6000\x00\x00\x00\x00', + b'\x01896634AL8000\x00\x00\x00\x00', + b'\x01896634AS8001\x00\x00\x00\x00', + b'\x01896634AS9000\x00\x00\x00\x00', + b'\x01896634AT7000\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F0R03100\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F0R05100\x00\x00\x00\x008646G0R02100\x00\x00\x00\x00', + b'\x028646F0R05200\x00\x00\x00\x008646G0R02200\x00\x00\x00\x00', + b'\x028646F0R05300\x00\x00\x00\x008646G0R02300\x00\x00\x00\x00', + b'\x028646F0R11000\x00\x00\x00\x008646G0R04000\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_SIENNA: { + (Ecu.engine, 0x700, None): [ + b'\x01896630832100\x00\x00\x00\x00', + b'\x01896630832200\x00\x00\x00\x00', + b'\x01896630838000\x00\x00\x00\x00', + b'\x01896630838100\x00\x00\x00\x00', + b'\x01896630842000\x00\x00\x00\x00', + b'\x01896630843000\x00\x00\x00\x00', + b'\x01896630851000\x00\x00\x00\x00', + b'\x01896630851100\x00\x00\x00\x00', + b'\x01896630851200\x00\x00\x00\x00', + b'\x01896630852000\x00\x00\x00\x00', + b'\x01896630852100\x00\x00\x00\x00', + b'\x01896630852200\x00\x00\x00\x00', + b'\x01896630859000\x00\x00\x00\x00', + b'\x01896630860000\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B45070\x00\x00\x00\x00\x00\x00', + b'8965B45080\x00\x00\x00\x00\x00\x00', + b'8965B45082\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152608130\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881510801100\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702200\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F0801100\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_SIENNA_4TH_GEN: { + (Ecu.engine, 0x700, None): [ + b'\x01896630841000\x00\x00\x00\x00', + b'\x01896630857101\x00\x00\x00\x00', + b'\x01896630864000\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F15260815100\x00\x00\x00\x00', + b'\x01F15260815300\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'\x018965B4509100\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301500\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F0802200\x00\x00\x00\x008646G4202100\x00\x00\x00\x00', + b'\x028646F0802300\x00\x00\x00\x008646G4202100\x00\x00\x00\x00', + b'\x028646F0802400\x00\x00\x00\x008646G4202100\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_CTH: { + (Ecu.dsu, 0x791, None): [ + b'881517601100\x00\x00\x00\x00', + b'881517602000\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152676144\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0237635000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0237641000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F7601100\x00\x00\x00\x00', + b'8646F7601200\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_ES_TSS2: { + (Ecu.engine, 0x700, None): [ + b'\x018966306U6000\x00\x00\x00\x00', + b'\x018966306V5000\x00\x00\x00\x00', + b'\x018966306W6000\x00\x00\x00\x00', + b'\x018966333T5000\x00\x00\x00\x00', + b'\x018966333T5100\x00\x00\x00\x00', + b'\x018966333X6000\x00\x00\x00\x00', + b'\x01896633T07000\x00\x00\x00\x00', + b'\x01896633T38000\x00\x00\x00\x00', + b'\x01896633T58000\x00\x00\x00\x00', + b'\x01896633T63000\x00\x00\x00\x00', + b'\x028966333S8000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x028966333S8000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x028966333T0100\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x028966333V4000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x028966333W1000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', + b'\x02896633T09000\x00\x00\x00\x00897CF3307001\x00\x00\x00\x00', + b'\x02896633T10000\x00\x00\x00\x00897CF3307001\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F152606281\x00\x00\x00\x00\x00\x00', + b'\x01F152606340\x00\x00\x00\x00\x00\x00', + b'\x01F152606461\x00\x00\x00\x00\x00\x00', + b'\x01F15260646200\x00\x00\x00\x00', + b'\x01F152633A71\x00\x00\x00\x00\x00\x00', + b'F152633423\x00\x00\x00\x00\x00\x00', + b'F152633680\x00\x00\x00\x00\x00\x00', + b'F152633681\x00\x00\x00\x00\x00\x00', + b'F152633F50\x00\x00\x00\x00\x00\x00', + b'F152633F51\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B33252\x00\x00\x00\x00\x00\x00', + b'8965B33590\x00\x00\x00\x00\x00\x00', + b'8965B33690\x00\x00\x00\x00\x00\x00', + b'8965B33702\x00\x00\x00\x00\x00\x00', + b'8965B33721\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301100\x00\x00\x00\x00', + b'\x018821F3301200\x00\x00\x00\x00', + b'\x018821F3301300\x00\x00\x00\x00', + b'\x018821F3301400\x00\x00\x00\x00', + b'\x018821F6201200\x00\x00\x00\x00', + b'\x018821F6201300\x00\x00\x00\x00', + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F0610000\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F0610100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F33030D0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F3303100\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F3303200\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F3304100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F3304200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F3304300\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + b'\x028646F3309100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F3309100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + b'\x028646F3309400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_ES: { + (Ecu.engine, 0x7e0, None): [ + b'\x02333M4100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02333M4200\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02333R0000\x00\x00\x00\x00\x00\x00\x00\x00A0C01000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152606201\x00\x00\x00\x00\x00\x00', + b'F152606202\x00\x00\x00\x00\x00\x00', + b'F152633171\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881513309400\x00\x00\x00\x00', + b'881513309500\x00\x00\x00\x00', + b'881513310400\x00\x00\x00\x00', + b'881513310500\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B33502\x00\x00\x00\x00\x00\x00', + b'8965B33512\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4701100\x00\x00\x00\x00', + b'8821F4701200\x00\x00\x00\x00', + b'8821F4701300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F3302001\x00\x00\x00\x00', + b'8646F3302100\x00\x00\x00\x00', + b'8646F3302200\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_GS_F: { + (Ecu.engine, 0x7e0, None): [ + b'\x0233075200\x00\x00\x00\x00\x00\x00\x00\x00530B9000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02330Y8000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152630700\x00\x00\x00\x00\x00\x00', + b'F152630400\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881513016200\x00\x00\x00\x00', + b'881513011300\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B30551\x00\x00\x00\x00\x00\x00', + b'8965B30431\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702000\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F3002100\x00\x00\x00\x00', + b'8646F3001200\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_NX: { + (Ecu.engine, 0x700, None): [ + b'\x01896637850000\x00\x00\x00\x00', + b'\x01896637851000\x00\x00\x00\x00', + b'\x01896637852000\x00\x00\x00\x00', + b'\x01896637854000\x00\x00\x00\x00', + b'\x01896637873000\x00\x00\x00\x00', + b'\x01896637878000\x00\x00\x00\x00', + b'\x01896637878100\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0237841000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0237842000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0237880000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0237882000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0237886000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152678130\x00\x00\x00\x00\x00\x00', + b'F152678140\x00\x00\x00\x00\x00\x00', + b'F152678160\x00\x00\x00\x00\x00\x00', + b'F152678170\x00\x00\x00\x00\x00\x00', + b'F152678171\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881517803100\x00\x00\x00\x00', + b'881517803300\x00\x00\x00\x00', + b'881517804100\x00\x00\x00\x00', + b'881517804300\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B78060\x00\x00\x00\x00\x00\x00', + b'8965B78080\x00\x00\x00\x00\x00\x00', + b'8965B78100\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F7801100\x00\x00\x00\x00', + b'8646F7801300\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_NX_TSS2: { + (Ecu.engine, 0x700, None): [ + b'\x018966378B2000\x00\x00\x00\x00', + b'\x018966378B2100\x00\x00\x00\x00', + b'\x018966378B3000\x00\x00\x00\x00', + b'\x018966378B3100\x00\x00\x00\x00', + b'\x018966378B4100\x00\x00\x00\x00', + b'\x018966378G2000\x00\x00\x00\x00', + b'\x018966378G3000\x00\x00\x00\x00', + b'\x018966378G4000\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0237881000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0237887000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02378A0000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02378F4000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F152678221\x00\x00\x00\x00\x00\x00', + b'F152678200\x00\x00\x00\x00\x00\x00', + b'F152678210\x00\x00\x00\x00\x00\x00', + b'F152678211\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B78110\x00\x00\x00\x00\x00\x00', + b'8965B78120\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301200\x00\x00\x00\x00', + b'\x018821F3301300\x00\x00\x00\x00', + b'\x018821F3301400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F78030A0\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F7803100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_LC_TSS2: { + (Ecu.engine, 0x7e0, None): [ + b'\x0131126000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0131130000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152611390\x00\x00\x00\x00\x00\x00', + b'F152611430\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B11091\x00\x00\x00\x00\x00\x00', + b'8965B11120\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F1104200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F1105200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_RC: { + (Ecu.engine, 0x700, None): [ + b'\x01896632461100\x00\x00\x00\x00', + b'\x01896632478100\x00\x00\x00\x00', + b'\x01896632478200\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x0232480000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0232484000\x00\x00\x00\x00\x00\x00\x00\x0052422000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152624150\x00\x00\x00\x00\x00\x00', + b'F152624171\x00\x00\x00\x00\x00\x00', + b'F152624221\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881512404100\x00\x00\x00\x00', + b'881512405100\x00\x00\x00\x00', + b'881512407000\x00\x00\x00\x00', + b'881512409100\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B24081\x00\x00\x00\x00\x00\x00', + b'8965B24240\x00\x00\x00\x00\x00\x00', + b'8965B24260\x00\x00\x00\x00\x00\x00', + b'8965B24320\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F2401100\x00\x00\x00\x00', + b'8646F2401200\x00\x00\x00\x00', + b'8646F2402200\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_RC_TSS2: { + (Ecu.engine, 0x700, None): [ + b'\x018966324C8000\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F15262426000\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B24481\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F2403100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_RX: { + (Ecu.engine, 0x700, None): [ + b'\x01896630E36100\x00\x00\x00\x00', + b'\x01896630E36200\x00\x00\x00\x00', + b'\x01896630E36300\x00\x00\x00\x00', + b'\x01896630E36600\x00\x00\x00\x00', + b'\x01896630E37100\x00\x00\x00\x00', + b'\x01896630E37200\x00\x00\x00\x00', + b'\x01896630E37300\x00\x00\x00\x00', + b'\x01896630E41000\x00\x00\x00\x00', + b'\x01896630E41100\x00\x00\x00\x00', + b'\x01896630E41200\x00\x00\x00\x00', + b'\x01896630E41500\x00\x00\x00\x00', + b'\x01896630EA3100\x00\x00\x00\x00', + b'\x01896630EA3300\x00\x00\x00\x00', + b'\x01896630EA3400\x00\x00\x00\x00', + b'\x01896630EA4100\x00\x00\x00\x00', + b'\x01896630EA4200\x00\x00\x00\x00', + b'\x01896630EA4300\x00\x00\x00\x00', + b'\x01896630EA4400\x00\x00\x00\x00', + b'\x01896630EA6300\x00\x00\x00\x00', + b'\x018966348R1300\x00\x00\x00\x00', + b'\x018966348R8500\x00\x00\x00\x00', + b'\x018966348R9300\x00\x00\x00\x00', + b'\x018966348W1300\x00\x00\x00\x00', + b'\x018966348W2300\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x02348J7000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348N0000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348Q4000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348Q4100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348T1000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348T1100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348T1200\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348T3000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348V6000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348Z3000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152648361\x00\x00\x00\x00\x00\x00', + b'F152648472\x00\x00\x00\x00\x00\x00', + b'F152648473\x00\x00\x00\x00\x00\x00', + b'F152648474\x00\x00\x00\x00\x00\x00', + b'F152648492\x00\x00\x00\x00\x00\x00', + b'F152648493\x00\x00\x00\x00\x00\x00', + b'F152648494\x00\x00\x00\x00\x00\x00', + b'F152648501\x00\x00\x00\x00\x00\x00', + b'F152648502\x00\x00\x00\x00\x00\x00', + b'F152648504\x00\x00\x00\x00\x00\x00', + b'F152648630\x00\x00\x00\x00\x00\x00', + b'F152648740\x00\x00\x00\x00\x00\x00', + b'F152648A30\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881514810300\x00\x00\x00\x00', + b'881514810500\x00\x00\x00\x00', + b'881514810700\x00\x00\x00\x00', + b'881514811300\x00\x00\x00\x00', + b'881514811500\x00\x00\x00\x00', + b'881514811700\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B0E011\x00\x00\x00\x00\x00\x00', + b'8965B0E012\x00\x00\x00\x00\x00\x00', + b'8965B48102\x00\x00\x00\x00\x00\x00', + b'8965B48111\x00\x00\x00\x00\x00\x00', + b'8965B48112\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4701000\x00\x00\x00\x00', + b'8821F4701100\x00\x00\x00\x00', + b'8821F4701200\x00\x00\x00\x00', + b'8821F4701300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F4801100\x00\x00\x00\x00', + b'8646F4801200\x00\x00\x00\x00', + b'8646F4802001\x00\x00\x00\x00', + b'8646F4802100\x00\x00\x00\x00', + b'8646F4802200\x00\x00\x00\x00', + b'8646F4809000\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_RX_TSS2: { + (Ecu.engine, 0x700, None): [ + b'\x01896630EA9000\x00\x00\x00\x00', + b'\x01896630EB0000\x00\x00\x00\x00', + b'\x01896630EC9000\x00\x00\x00\x00', + b'\x01896630EC9100\x00\x00\x00\x00', + b'\x01896630ED0000\x00\x00\x00\x00', + b'\x01896630ED0100\x00\x00\x00\x00', + b'\x01896630ED5000\x00\x00\x00\x00', + b'\x01896630ED6000\x00\x00\x00\x00', + b'\x018966348R9200\x00\x00\x00\x00', + b'\x018966348T8000\x00\x00\x00\x00', + b'\x018966348W5100\x00\x00\x00\x00', + b'\x018966348W9000\x00\x00\x00\x00', + b'\x018966348X0000\x00\x00\x00\x00', + b'\x01896634D11000\x00\x00\x00\x00', + b'\x01896634D12000\x00\x00\x00\x00', + b'\x01896634D12100\x00\x00\x00\x00', + b'\x01896634D43000\x00\x00\x00\x00', + b'\x01896634D44000\x00\x00\x00\x00', + ], + (Ecu.engine, 0x7e0, None): [ + b'\x02348U2000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348X4000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348X5000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348X6000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348X8000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348Y3000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0234D14000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0234D15000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0234D16000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F15260E031\x00\x00\x00\x00\x00\x00', + b'\x01F15260E041\x00\x00\x00\x00\x00\x00', + b'\x01F152648781\x00\x00\x00\x00\x00\x00', + b'\x01F152648801\x00\x00\x00\x00\x00\x00', + b'F152648493\x00\x00\x00\x00\x00\x00', + b'F152648811\x00\x00\x00\x00\x00\x00', + b'F152648831\x00\x00\x00\x00\x00\x00', + b'F152648891\x00\x00\x00\x00\x00\x00', + b'F152648C80\x00\x00\x00\x00\x00\x00', + b'F152648D00\x00\x00\x00\x00\x00\x00', + b'F152648D60\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B48261\x00\x00\x00\x00\x00\x00', + b'8965B48271\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301100\x00\x00\x00\x00', + b'\x018821F3301300\x00\x00\x00\x00', + b'\x018821F3301400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F4810100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', + b'\x028646F4810200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F4810300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F4810400\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_PRIUS_TSS2: { + (Ecu.engine, 0x700, None): [ + b'\x028966347B1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347C4000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347C6000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347C7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x028966347C8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x038966347C0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710101\x00\x00\x00\x00', + b'\x038966347C0000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710102\x00\x00\x00\x00', + b'\x038966347C1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4710101\x00\x00\x00\x00', + b'\x038966347C5000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4707101\x00\x00\x00\x00', + b'\x038966347C5100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4707101\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152647500\x00\x00\x00\x00\x00\x00', + b'F152647510\x00\x00\x00\x00\x00\x00', + b'F152647520\x00\x00\x00\x00\x00\x00', + b'F152647521\x00\x00\x00\x00\x00\x00', + b'F152647531\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B47070\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301300\x00\x00\x00\x00', + b'\x018821F3301400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F4707000\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F4710000\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + b'\x028646F4712000\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_MIRAI: { + (Ecu.abs, 0x7d1, None): [ + b'\x01898A36203000\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F15266203200\x00\x00\x00\x00', + b'\x01F15266203500\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'\x028965B6204100\x00\x00\x00\x008965B6203100\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F6201200\x00\x00\x00\x00', + b'\x018821F6201300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F6201400\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F6201400\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_ALPHARD_TSS2: { + (Ecu.engine, 0x7e0, None): [ + b'\x0235852100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0235870000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0235879000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x0235883000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B58040\x00\x00\x00\x00\x00\x00', + b'8965B58052\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152658160\x00\x00\x00\x00\x00\x00', + b'F152658320\x00\x00\x00\x00\x00\x00', + b'F152658341\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F3301000\x00\x00\x00\x00', + b'\x018821F3301200\x00\x00\x00\x00', + b'\x018821F3301400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F58010B0\x00\x00\x00\x008646G2601003\x00\x00\x00\x00', + b'\x028646F58010C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', + b'\x028646F5803200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646FV201000\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + ], + }, + CAR.TOYOTA_YARIS: { + (Ecu.engine, 0x700, None): [ + b'\x0189663K015300\x00\x00\x00\x00', + b'\x0189663K023000\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'\x018965BK002100\x00\x00\x00\x00', + b'\x018965BK003200\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'\x01F1526K005600\x00\x00\x00\x00', + b'\x01F1526K007500\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F0D04100\x00\x00\x00\x00', + b'\x018821F0D05300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F0W04100\x00\x00\x00\x008646G0W04100\x00\x00\x00\x00', + b'\x028646F5205200\x00\x00\x00\x008646G5202200\x00\x00\x00\x00', + ], + }, + CAR.LEXUS_LS: { + (Ecu.abs, 0x7b0, None): [ + b'F152650290\x00\x00\x00\x00\x00\x00', + ], + (Ecu.dsu, 0x791, None): [ + b'881515003400\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B50022\x00\x00\x00\x00\x00\x00', + ], + (Ecu.engine, 0x700, None): [ + b'\x028966350K7200\x00\x00\x00\x00896655066200\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'8821F4702300\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'8646F5001200\x00\x00\x00\x00', + ], + }, +} + +FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) diff --git a/artifacts/package_runtime/iqdbc/car/toyota/interface.py b/artifacts/package_runtime/iqdbc/car/toyota/interface.py new file mode 100644 index 000000000..40351c884 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/interface.py @@ -0,0 +1,212 @@ +from iqdbc.car import Bus, structs, get_safety_config, uds +from iqdbc.car.toyota.carstate import CarState +from iqdbc.car.toyota.carcontroller import CarController +from iqdbc.car.toyota.radar_interface import RadarInterface +from iqdbc.car.toyota.values import Ecu, CAR, DBC, ToyotaFlags, CarControllerParams, TSS2_CAR, RADAR_ACC_CAR, NO_DSU_CAR, \ + MIN_ACC_SPEED, EPS_SCALE, NO_STOP_TIMER_CAR, ANGLE_CONTROL_CAR, \ + ToyotaSafetyFlags, UNSUPPORTED_DSU_CAR +from iqdbc.car.disable_ecu import disable_ecu +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ, ToyotaSafetyFlagsIQ + +SteerControlType = structs.CarParams.SteerControlType + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + DRIVABLE_GEARS = (structs.CarState.GearShifter.sport,) + + @staticmethod + def get_pid_accel_limits(CP, CP_IQ, current_speed, cruise_speed): + return CarControllerParams(CP).ACCEL_MIN, CarControllerParams(CP).ACCEL_MAX + + @staticmethod + def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "toyota" + ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.toyota)] + ret.safetyConfigs[0].safetyParam = EPS_SCALE[candidate] + + # BRAKE_MODULE is on a different address for these cars + if DBC[candidate][Bus.pt] == "toyota_new_mc_pt_generated": + ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.ALT_BRAKE.value + + if ret.flags & ToyotaFlags.SECOC.value: + ret.secOcRequired = True + ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.SECOC.value + + if candidate in ANGLE_CONTROL_CAR: + ret.steerControlType = SteerControlType.angle + ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.LTA.value + + # LTA control can be more delayed and winds up more often + ret.steerActuatorDelay = 0.18 + ret.steerLimitTimer = 0.8 + else: + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + ret.steerActuatorDelay = 0.12 # Default delay, Prius has larger delay + ret.steerLimitTimer = 0.4 + + stop_and_go = candidate in TSS2_CAR + + # In TSS2 cars, the camera does long control + found_ecus = [fw.ecu for fw in car_fw] + + if Ecu.hybrid in found_ecus: + ret.flags |= ToyotaFlags.HYBRID.value + + if candidate == CAR.TOYOTA_PRIUS: + stop_and_go = True + # Only give steer angle deadzone to for bad angle sensor prius + for fw in car_fw: + if fw.ecu == "eps" and not fw.fwVersion == b'8965B47060\x00\x00\x00\x00\x00\x00': + ret.steerActuatorDelay = 0.25 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, steering_angle_deadzone_deg=0.2) + + elif candidate in (CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2): + stop_and_go = True + ret.wheelSpeedFactor = 1.035 + + elif candidate in (CAR.TOYOTA_AVALON, CAR.TOYOTA_AVALON_2019, CAR.TOYOTA_AVALON_TSS2): + # starting from 2019, all Avalon variants have stop and go + # https://engage.toyota.com/static/images/toyota_safety_sense/TSS_Applicability_Chart.pdf + stop_and_go = candidate != CAR.TOYOTA_AVALON + + elif candidate in (CAR.TOYOTA_CHR, CAR.TOYOTA_CAMRY, CAR.TOYOTA_SIENNA, CAR.LEXUS_CTH, CAR.LEXUS_LS, CAR.LEXUS_NX): + # TODO: Some of these platforms are not advertised to have full range ACC, do they really all have sng? + stop_and_go = True + + ret.centerToFront = ret.wheelbase * 0.44 + + # TODO: Some TSS-P platforms have BSM, but are flipped based on region or driving direction. + # Detect flipped signals and enable for C-HR and others + ret.enableBsm = 0x3F6 in fingerprint[0] and candidate in TSS2_CAR + + # No radar dbc for cars without DSU which are not TSS 2.0 + # TODO: make an adas dbc file for dsu-less models + ret.radarUnavailable = Bus.radar not in DBC[candidate] or candidate in (NO_DSU_CAR - TSS2_CAR) + + # since we don't yet parse radar on TSS2/TSS-P radar-based ACC cars, gate longitudinal behind experimental toggle + if candidate in (RADAR_ACC_CAR | NO_DSU_CAR): + ret.alphaLongitudinalAvailable = candidate in RADAR_ACC_CAR + + # Disabling radar is only supported on TSS2 radar-ACC cars + if alpha_long and candidate in RADAR_ACC_CAR: + ret.flags |= ToyotaFlags.DISABLE_RADAR.value + + # openpilot longitudinal enabled by default: + # - cars w/ DSU disconnected + # - TSS2 cars with camera sending ACC_CONTROL where we can block it + # openpilot longitudinal behind experimental long toggle: + # - TSS2 radar ACC cars (disables radar) + + ret.openpilotLongitudinalControl = (candidate in (TSS2_CAR - RADAR_ACC_CAR) or + bool(ret.flags & ToyotaFlags.DISABLE_RADAR.value)) + + ret.autoResumeSng = ret.openpilotLongitudinalControl and candidate in NO_STOP_TIMER_CAR + + if not ret.openpilotLongitudinalControl: + ret.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.STOCK_LONGITUDINAL.value + + # min speed to enable ACC. if car can do stop and go, then set enabling speed + # to a negative value, so it won't matter. + ret.minEnableSpeed = -1. if stop_and_go else MIN_ACC_SPEED + + if candidate in TSS2_CAR: + ret.flags |= ToyotaFlags.RAISED_ACCEL_LIMIT.value + + # Hybrids have much quicker longitudinal actuator response + if ret.flags & ToyotaFlags.HYBRID.value: + ret.longitudinalActuatorDelay = 0.05 + + return ret + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], + car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + if candidate in UNSUPPORTED_DSU_CAR: + ret.iqSafetyFlags |= ToyotaSafetyFlagsIQ.UNSUPPORTED_DSU + if candidate in TSS2_CAR: + ret.iqSafetyFlags |= ToyotaSafetyFlagsIQ.LKAS_HUD + + # Detect smartDSU, which intercepts ACC_CMD from the DSU (or radar) allowing openpilot to send it + # 0x2AA is sent by a similar device which intercepts the radar instead of DSU on NO_DSU_CARs + if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR): + ret.flags |= ToyotaFlagsIQ.SMART_DSU.value + + if 0x2AA in fingerprint[0] and candidate in NO_DSU_CAR: + ret.flags |= ToyotaFlagsIQ.RADAR_CAN_FILTER.value + + # Detect ZSS, which allows iqpilot to utilize an improved angle sensor for some Toyota vehicles + # https://github.com/zorrobyte/betterToyotaAngleSensorForOP + if 0x23 in fingerprint[0] and not stock_cp.flags & ToyotaFlags.SECOC: + ret.flags |= ToyotaFlagsIQ.ZSS.value + + if candidate == CAR.TOYOTA_PRIUS: + if ret.flags & ToyotaFlagsIQ.ZSS: + stock_cp.steerRatio = 15.0 + stock_cp.mass = 3370. + + # reuse logic from _get_params + # Only give steer angle deadzone to for bad angle sensor prius + for fw in car_fw: + if fw.ecu == "eps" and not fw.fwVersion == b'8965B47060\x00\x00\x00\x00\x00\x00': + stock_cp.steerActuatorDelay = 0.25 + CarInterfaceBase.configure_torque_tune(candidate, stock_cp.lateralTuning, steering_angle_deadzone_deg=0.0) + + use_sdsu = bool(ret.flags & ToyotaFlagsIQ.SMART_DSU) + + stock_cp.minEnableSpeed = -1. if use_sdsu else stock_cp.minEnableSpeed + + stock_cp.alphaLongitudinalAvailable = use_sdsu or candidate in RADAR_ACC_CAR + + if use_sdsu: + use_sdsu = use_sdsu and alpha_long + stock_cp.flags &= ~ToyotaFlags.DISABLE_RADAR.value + elif candidate in (RADAR_ACC_CAR | NO_DSU_CAR): + if alpha_long and candidate in RADAR_ACC_CAR: + stock_cp.flags |= ToyotaFlags.DISABLE_RADAR.value + + # openpilot longitudinal enabled by default: + # - TSS2 cars with camera sending ACC_CONTROL where we can block it + # openpilot longitudinal behind experimental long toggle: + # - cars w/ smartDSU or CAN filter installed + # - TSS2 radar ACC cars w/o smartDSU installed (disables radar) + stock_cp.openpilotLongitudinalControl = use_sdsu or \ + candidate in (TSS2_CAR - RADAR_ACC_CAR) or \ + bool(stock_cp.flags & ToyotaFlags.DISABLE_RADAR) + + ret.enableGasInterceptor = 0x201 in fingerprint[0] and stock_cp.openpilotLongitudinalControl and \ + not stock_cp.flags & ToyotaFlags.SECOC + + if ret.enableGasInterceptor: + ret.iqSafetyFlags |= ToyotaSafetyFlagsIQ.GAS_INTERCEPTOR + stock_cp.minEnableSpeed = -1. + + if ret.flags & ToyotaFlagsIQ.STOCK_LONGITUDINAL: + stock_cp.alphaLongitudinalAvailable = False + stock_cp.openpilotLongitudinalControl = False + + if not stock_cp.openpilotLongitudinalControl: + stock_cp.safetyConfigs[0].safetyParam |= ToyotaSafetyFlags.STOCK_LONGITUDINAL.value + else: + stock_cp.safetyConfigs[0].safetyParam &= ~ToyotaSafetyFlags.STOCK_LONGITUDINAL.value + + return ret + + @staticmethod + def init(CP, CP_IQ, can_recv, can_send, communication_control=None): + # disable radar if alpha longitudinal toggled on radar-ACC car without CAN filter/smartDSU + if CP.flags & ToyotaFlags.DISABLE_RADAR.value: + if communication_control is None: + communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.ENABLE_RX_DISABLE_TX, uds.MESSAGE_TYPE.NORMAL]) + disable_ecu(can_recv, can_send, bus=0, addr=0x750, sub_addr=0xf, com_cont_req=communication_control) + + @staticmethod + def deinit(CP, can_recv, can_send): + # re-enable radar if alpha longitudinal toggled on radar-ACC car + communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.ENABLE_RX_ENABLE_TX, uds.MESSAGE_TYPE.NORMAL]) + CarInterface.init(CP, can_recv, can_send, communication_control) diff --git a/artifacts/package_runtime/iqdbc/car/toyota/radar_interface.py b/artifacts/package_runtime/iqdbc/car/toyota/radar_interface.py new file mode 100644 index 000000000..1b63c40e1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/radar_interface.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +from iqdbc.can import CANParser +from iqdbc.car import Bus +from iqdbc.car.structs import RadarData +from iqdbc.car.toyota.values import DBC, TSS2_CAR +from iqdbc.car.interfaces import RadarInterfaceBase + + +def _create_radar_can_parser(car_fingerprint): + if car_fingerprint in TSS2_CAR: + RADAR_A_MSGS = list(range(0x180, 0x190)) + RADAR_B_MSGS = list(range(0x190, 0x1a0)) + else: + RADAR_A_MSGS = list(range(0x210, 0x220)) + RADAR_B_MSGS = list(range(0x220, 0x230)) + + msg_a_n = len(RADAR_A_MSGS) + msg_b_n = len(RADAR_B_MSGS) + messages = list(zip(RADAR_A_MSGS + RADAR_B_MSGS, [20] * (msg_a_n + msg_b_n), strict=True)) + + return CANParser(DBC[car_fingerprint][Bus.radar], messages, 1) + + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + self.track_id = 0 + + if CP.carFingerprint in TSS2_CAR: + self.RADAR_A_MSGS = list(range(0x180, 0x190)) + self.RADAR_B_MSGS = list(range(0x190, 0x1a0)) + else: + self.RADAR_A_MSGS = list(range(0x210, 0x220)) + self.RADAR_B_MSGS = list(range(0x220, 0x230)) + + self.valid_cnt = {key: 0 for key in self.RADAR_A_MSGS} + + self.rcp = None if CP.radarUnavailable else _create_radar_can_parser(CP.carFingerprint) + self.trigger_msg = self.RADAR_B_MSGS[-1] + self.updated_messages = set() + + def update(self, can_strings): + if self.rcp is None: + return super().update(None) + + vls = self.rcp.update(can_strings) + self.updated_messages.update(vls) + + if self.trigger_msg not in self.updated_messages: + return None + + rr = self._update(self.updated_messages) + self.updated_messages.clear() + + return rr + + def _update(self, updated_messages): + ret = RadarData() + if not self.rcp.can_valid: + ret.errors.canError = True + + for ii in sorted(updated_messages): + if ii in self.RADAR_A_MSGS: + cpt = self.rcp.vl[ii] + + if cpt['LONG_DIST'] >= 255 or cpt['NEW_TRACK']: + self.valid_cnt[ii] = 0 # reset counter + if cpt['VALID'] and cpt['LONG_DIST'] < 255: + self.valid_cnt[ii] += 1 + else: + self.valid_cnt[ii] = max(self.valid_cnt[ii] - 1, 0) + + score = self.rcp.vl[ii+16]['SCORE'] + # print ii, self.valid_cnt[ii], score, cpt['VALID'], cpt['LONG_DIST'], cpt['LAT_DIST'] + + # radar point only valid if it's a valid measurement and score is above 50 + if cpt['VALID'] or (score > 50 and cpt['LONG_DIST'] < 255 and self.valid_cnt[ii] > 0): + if ii not in self.pts or cpt['NEW_TRACK']: + self.pts[ii] = RadarData.RadarPoint() + self.pts[ii].trackId = self.track_id + self.track_id += 1 + self.pts[ii].dRel = cpt['LONG_DIST'] # from front of car + self.pts[ii].yRel = -cpt['LAT_DIST'] # in car frame's y axis, left is positive + self.pts[ii].vRel = cpt['REL_SPEED'] + self.pts[ii].aRel = float('nan') + self.pts[ii].yvRel = float('nan') + self.pts[ii].measured = bool(cpt['VALID']) + else: + if ii in self.pts: + del self.pts[ii] + + ret.points = list(self.pts.values()) + return ret diff --git a/artifacts/package_runtime/iqdbc/car/toyota/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/toyota/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/toyota/tests/print_platform_codes.py b/artifacts/package_runtime/iqdbc/car/toyota/tests/print_platform_codes.py new file mode 100644 index 000000000..3e86ca026 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/tests/print_platform_codes.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +from collections import defaultdict +from iqdbc.car.toyota.values import PLATFORM_CODE_ECUS, get_platform_codes +from iqdbc.car.toyota.fingerprints import FW_VERSIONS + +if __name__ == "__main__": + parts_for_ecu: dict = defaultdict(set) + cars_for_code: dict = defaultdict(lambda: defaultdict(set)) + for car_model, ecus in FW_VERSIONS.items(): + print() + print(car_model) + for ecu in sorted(ecus): + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + platform_codes = get_platform_codes(ecus[ecu]) + parts_for_ecu[ecu] |= {code.split(b'-')[0] for code in platform_codes if code.count(b'-') > 1} + for code in platform_codes: + cars_for_code[ecu][b'-'.join(code.split(b'-')[:2])] |= {car_model} + print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):') + print(f' Codes: {platform_codes}') + + print('\nECU parts:') + for ecu, parts in parts_for_ecu.items(): + print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}): {parts}') + + print('\nCar models vs. platform codes (no major versions):') + for ecu, codes in cars_for_code.items(): + print(f' (Ecu.{ecu[0]}, {hex(ecu[1])}, {ecu[2]}):') + for code, cars in codes.items(): + print(f' {code!r}: {sorted(cars)}') diff --git a/artifacts/package_runtime/iqdbc/car/toyota/tests/test_toyota.py b/artifacts/package_runtime/iqdbc/car/toyota/tests/test_toyota.py new file mode 100644 index 000000000..571ed7897 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/tests/test_toyota.py @@ -0,0 +1,167 @@ +from hypothesis import given, settings, strategies as st + +from iqdbc.car import Bus +from iqdbc.car.structs import CarParams +from iqdbc.car.fw_versions import build_fw_dict +from iqdbc.car.toyota.fingerprints import FW_VERSIONS +from iqdbc.car.toyota.values import CAR, DBC, TSS2_CAR, ANGLE_CONTROL_CAR, RADAR_ACC_CAR, SECOC_CAR, \ + FW_QUERY_CONFIG, PLATFORM_CODE_ECUS, FUZZY_EXCLUDED_PLATFORMS, \ + get_platform_codes + +Ecu = CarParams.Ecu + + +def check_fw_version(fw_version: bytes) -> bool: + # TODO: just use the FW patterns, need to support all chunks + return b'?' not in fw_version and b'!' not in fw_version + + +class TestToyotaInterfaces: + def test_car_sets(self): + assert len(ANGLE_CONTROL_CAR - TSS2_CAR) == 0 + assert len(RADAR_ACC_CAR - TSS2_CAR) == 0 + + def test_lta_platforms(self): + # At this time, only RAV4 2023 is expected to use LTA/angle control + assert ANGLE_CONTROL_CAR == {CAR.TOYOTA_RAV4_TSS2_2023} + + def test_tss2_dbc(self): + # We make some assumptions about TSS2 platforms, + # like looking up certain signals only in this DBC + for car_model, dbc in DBC.items(): + if car_model in TSS2_CAR and car_model not in SECOC_CAR: + assert dbc[Bus.pt] == "toyota_nodsu_pt_generated" + + def test_essential_ecus(self, subtests): + # Asserts standard ECUs exist for each platform + common_ecus = {Ecu.fwdRadar, Ecu.fwdCamera} + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + present_ecus = {ecu[0] for ecu in ecus} + missing_ecus = common_ecus - present_ecus + assert len(missing_ecus) == 0 + + # Some exceptions for other common ECUs + if car_model not in (CAR.TOYOTA_ALPHARD_TSS2,): + assert Ecu.abs in present_ecus + + if car_model not in (CAR.TOYOTA_MIRAI,): + assert Ecu.engine in present_ecus + + if car_model not in (CAR.TOYOTA_PRIUS_V, CAR.LEXUS_CTH): + assert Ecu.eps in present_ecus + + +class TestToyotaFingerprint: + def test_non_essential_ecus(self, subtests): + # Ensures only the cars that have multiple engine ECUs are in the engine non-essential ECU list + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + engine_ecus = {ecu for ecu in ecus if ecu[0] == Ecu.engine} + assert (len(engine_ecus) > 1) == (car_model in FW_QUERY_CONFIG.non_essential_ecus[Ecu.engine]), \ + f"Car model unexpectedly {'not ' if len(engine_ecus) > 1 else ''}in non-essential list" + + def test_valid_fw_versions(self, subtests): + # Asserts all FW versions are valid + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + for fws in ecus.values(): + for fw in fws: + assert check_fw_version(fw), fw + + # Tests for part numbers, platform codes, and sub-versions which Toyota will use to fuzzy + # fingerprint in the absence of full FW matches: + @settings(max_examples=100) + @given(data=st.data()) + def test_platform_codes_fuzzy_fw(self, data): + fw_strategy = st.lists(st.binary()) + fws = data.draw(fw_strategy) + get_platform_codes(fws) + + def test_platform_code_ecus_available(self, subtests): + # Asserts ECU keys essential for fuzzy fingerprinting are available on all platforms + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + for platform_code_ecu in PLATFORM_CODE_ECUS: + if platform_code_ecu == Ecu.eps and car_model in (CAR.TOYOTA_PRIUS_V, CAR.LEXUS_CTH,): + continue + if platform_code_ecu == Ecu.abs and car_model in (CAR.TOYOTA_ALPHARD_TSS2,): + continue + assert platform_code_ecu in [e[0] for e in ecus] + + def test_fw_format(self, subtests): + # Asserts: + # - every supported ECU FW version returns one platform code + # - every supported ECU FW version has a part number + # - expected parsing of ECU sub-versions + + for car_model, ecus in FW_VERSIONS.items(): + with subtests.test(car_model=car_model.value): + for ecu, fws in ecus.items(): + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + codes = dict() + for fw in fws: + result = get_platform_codes([fw]) + # Check only one platform code and sub-version + assert 1 == len(result), f"Unable to parse FW: {fw}" + assert 1 == len(list(result.values())[0]), f"Unable to parse FW: {fw}" + codes |= result + + # Toyota places the ECU part number in their FW versions, assert all parsable + # Note that there is only one unique part number per ECU across the fleet, so this + # is not important for identification, just a sanity check. + assert all(code.count(b"-") > 1 for code in codes), f"FW does not have part number: {fw} {codes}" + + def test_platform_codes_spot_check(self): + # Asserts basic platform code parsing behavior for a few cases + results = get_platform_codes([ + b"F152607140\x00\x00\x00\x00\x00\x00", + b"F152607171\x00\x00\x00\x00\x00\x00", + b"F152607110\x00\x00\x00\x00\x00\x00", + b"F152607180\x00\x00\x00\x00\x00\x00", + ]) + assert results == {b"F1526-07-1": {b"10", b"40", b"71", b"80"}} + + results = get_platform_codes([ + b"\x028646F4104100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00", + b"\x028646F4104100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00", + ]) + assert results == {b"8646F-41-04": {b"100"}} + + # Short version has no part number + results = get_platform_codes([ + b"\x0235870000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00", + b"\x0235883000\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00", + ]) + assert results == {b"58-70": {b"000"}, b"58-83": {b"000"}} + + results = get_platform_codes([ + b"F152607110\x00\x00\x00\x00\x00\x00", + b"F152607140\x00\x00\x00\x00\x00\x00", + b"\x028646F4104100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00", + b"\x0235879000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00", + ]) + assert results == {b"F1526-07-1": {b"10", b"40"}, b"8646F-41-04": {b"100"}, b"58-79": {b"000"}} + + def test_fuzzy_excluded_platforms(self): + # Asserts a list of platforms that will not fuzzy fingerprint with platform codes due to them being shared. + platforms_with_shared_codes = set() + for platform, fw_by_addr in FW_VERSIONS.items(): + car_fw = [] + for ecu, fw_versions in fw_by_addr.items(): + ecu_name, addr, sub_addr = ecu + for fw in fw_versions: + car_fw.append(CarParams.CarFw(ecu=ecu_name, fwVersion=fw, address=addr, + subAddress=0 if sub_addr is None else sub_addr)) + + CP = CarParams(carFw=car_fw) + matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(build_fw_dict(CP.carFw), CP.carVin, FW_VERSIONS) + if len(matches) == 1: + assert list(matches)[0] == platform + else: + # If a platform has multiple matches, add it and its matches + platforms_with_shared_codes |= {str(platform), *matches} + + assert platforms_with_shared_codes == FUZZY_EXCLUDED_PLATFORMS, (len(platforms_with_shared_codes), len(FW_VERSIONS)) diff --git a/artifacts/package_runtime/iqdbc/car/toyota/tests/test_toyota_iq.py b/artifacts/package_runtime/iqdbc/car/toyota/tests/test_toyota_iq.py new file mode 100644 index 000000000..1a9c492d6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/tests/test_toyota_iq.py @@ -0,0 +1,44 @@ +from iqdbc.car import gen_empty_fingerprint, structs +from iqdbc.car.toyota.interface import CarInterface +from iqdbc.car.toyota.values import CAR, ToyotaFlags +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ, ToyotaSafetyFlagsIQ + + +def test_secoc_toyota_not_dashcam_on_release(): + # SecOC Toyotas are controllable regardless of branch or fingerprint source. + candidate = CAR.TOYOTA_SIENNA_4TH_GEN + + # is_release=True (release branch) must not force dashcam mode + cp = CarInterface.get_params(candidate, gen_empty_fingerprint(), [], False, True, False) + assert cp.flags & ToyotaFlags.SECOC.value + assert cp.secOcRequired + assert not cp.dashcamOnly + + # fw/can-sourced fingerprint (not forced) must also stay controllable + cp.fingerprintSource = structs.CarParams.FingerprintSource.can + CarInterface.get_params_iq(cp, candidate, gen_empty_fingerprint(), [], False, True, False) + assert not cp.dashcamOnly + + +def test_smart_dsu_clears_disable_radar_on_radar_acc_toyota(): + candidate = CAR.TOYOTA_CHR_TSS2 + fingerprint = gen_empty_fingerprint() + fingerprint[0][0x2FF] = 8 + + cp = CarInterface.get_params(candidate, fingerprint, [], True, False, False) + assert cp.flags & ToyotaFlags.DISABLE_RADAR.value + + cp_iq = CarInterface.get_params_iq(cp, candidate, fingerprint, [], True, False, False) + + assert cp_iq.flags & ToyotaFlagsIQ.SMART_DSU.value + assert not (cp.flags & ToyotaFlags.DISABLE_RADAR.value) + assert cp.alphaLongitudinalAvailable + assert cp.openpilotLongitudinalControl + + +def test_lkas_hud_safety_flag_tracks_tss2(): + for candidate, expected in ((CAR.TOYOTA_CHR_TSS2, True), (CAR.TOYOTA_PRIUS_V, False)): + fingerprint = gen_empty_fingerprint() + cp = CarInterface.get_params(candidate, fingerprint, [], False, False, False) + cp_iq = CarInterface.get_params_iq(cp, candidate, fingerprint, [], False, False, False) + assert bool(cp_iq.iqSafetyFlags & ToyotaSafetyFlagsIQ.LKAS_HUD) is expected diff --git a/artifacts/package_runtime/iqdbc/car/toyota/toyotacan.py b/artifacts/package_runtime/iqdbc/car/toyota/toyotacan.py new file mode 100644 index 000000000..e55af5cbf --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/toyotacan.py @@ -0,0 +1,166 @@ +from iqdbc.car.structs import CarParams + +SteerControlType = CarParams.SteerControlType + + +def create_steer_command(packer, steer, steer_req): + """Creates a CAN message for the Toyota Steer Command.""" + + values = { + "STEER_REQUEST": steer_req, + "STEER_TORQUE_CMD": steer, + "SET_ME_1": 1, + } + return packer.make_can_msg("STEERING_LKA", 0, values) + + +def create_lta_steer_command(packer, steer_control_type, steer_angle, steer_req, frame, torque_wind_down): + """Creates a CAN message for the Toyota LTA Steer Command.""" + + values = { + "COUNTER": frame + 128, + "SETME_X1": 1, # suspected LTA feature availability + # 1 for TSS 2.5 cars, 3 for TSS 2.0. Send based on whether we're using LTA for lateral control + "SETME_X3": 1 if steer_control_type == SteerControlType.angle else 3, + "PERCENTAGE": 100, + "TORQUE_WIND_DOWN": torque_wind_down, + "ANGLE": 0, + "STEER_ANGLE_CMD": steer_angle, + "STEER_REQUEST": steer_req, + "STEER_REQUEST_2": steer_req, + "CLEAR_HOLD_STEERING_ALERT": 0, + } + return packer.make_can_msg("STEERING_LTA", 0, values) + + +def create_lta_steer_command_2(packer, frame): + values = { + "COUNTER": frame + 128, + } + return packer.make_can_msg("STEERING_LTA_2", 0, values) + + +def create_accel_command(packer, accel, pcm_cancel, permit_braking, standstill_req, lead, acc_type, fcw_alert, distance): + # TODO: find the exact canceling bit that does not create a chime + values = { + "ACCEL_CMD": accel, + "ACC_TYPE": acc_type, + "DISTANCE": distance, + "MINI_CAR": lead, + "PERMIT_BRAKING": permit_braking, + "RELEASE_STANDSTILL": not standstill_req, + "CANCEL_REQ": pcm_cancel, + "ALLOW_LONG_PRESS": 1, + "ACC_CUT_IN": fcw_alert, # only shown when ACC enabled + } + return packer.make_can_msg("ACC_CONTROL", 0, values) + + +def create_accel_command_2(packer, accel): + values = { + "ACCEL_CMD": accel, + } + return packer.make_can_msg("ACC_CONTROL_2", 0, values) + + +def create_pcs_commands(packer, accel, active, mass): + values1 = { + "COUNTER": 0, + "FORCE": round(min(accel, 0) * mass * 2), + "STATE": 3 if active else 0, + "BRAKE_STATUS": 0, + "PRECOLLISION_ACTIVE": 1 if active else 0, + } + msg1 = packer.make_can_msg("PRE_COLLISION", 0, values1) + + values2 = { + "DSS1GDRV": min(accel, 0), # accel + "PCSALM": 1 if active else 0, # goes high same time as PRECOLLISION_ACTIVE + "IBTRGR": 1 if active else 0, # unknown + "PBATRGR": 1 if active else 0, # noisy actuation bit? + "PREFILL": 1 if active else 0, # goes on and off before DSS1GDRV + "AVSTRGR": 1 if active else 0, + } + msg2 = packer.make_can_msg("PRE_COLLISION_2", 0, values2) + + return [msg1, msg2] + + +def create_acc_cancel_command(packer): + values = { + "GAS_RELEASED": 0, + "CRUISE_ACTIVE": 0, + "ACC_BRAKING": 0, + "ACCEL_NET": 0, + "CRUISE_STATE": 0, + "CANCEL_REQ": 1, + } + return packer.make_can_msg("PCM_CRUISE", 0, values) + + +def create_fcw_command(packer, fcw): + values = { + "PCS_INDICATOR": 1, # PCS turned off + "FCW": fcw, + "SET_ME_X20": 0x20, + "SET_ME_X10": 0x10, + "PCS_OFF": 1, + "PCS_SENSITIVITY": 0, + } + return packer.make_can_msg("PCS_HUD", 0, values) + + +def create_ui_command(packer, steer, chime, left_line, right_line, left_lane_depart, right_lane_depart, enabled, stock_lkas_hud): + values = { + "TWO_BEEPS": chime, + "LDA_ALERT": steer, + "RIGHT_LINE": 3 if right_lane_depart else 1 if right_line else 2, + "LEFT_LINE": 3 if left_lane_depart else 1 if left_line else 2, + "BARRIERS": 1 if enabled else 0, + + # static signals + "SET_ME_X02": 2, + "SET_ME_X01": 1, + "LKAS_STATUS": 1, + "REPEATED_BEEPS": 0, + "LANE_SWAY_FLD": 7, + "LANE_SWAY_BUZZER": 0, + "LANE_SWAY_WARNING": 0, + "LDA_FRONT_CAMERA_BLOCKED": 0, + "TAKE_CONTROL": 0, + "LANE_SWAY_SENSITIVITY": 2, + "LANE_SWAY_TOGGLE": 1, + "LDA_ON_MESSAGE": 0, + "LDA_MESSAGES": 0, + "LDA_SA_TOGGLE": 1, + "LDA_SENSITIVITY": 2, + "LDA_UNAVAILABLE": 0, + "LDA_MALFUNCTION": 0, + "LDA_UNAVAILABLE_QUIET": 0, + "ADJUSTING_CAMERA": 0, + "LDW_EXIST": 1, + } + + # lane sway functionality + # not all cars have LKAS_HUD — update with camera values if available + if len(stock_lkas_hud): + values.update({s: stock_lkas_hud[s] for s in [ + "LANE_SWAY_FLD", + "LANE_SWAY_BUZZER", + "LANE_SWAY_WARNING", + "LANE_SWAY_SENSITIVITY", + "LANE_SWAY_TOGGLE", + ]}) + + return packer.make_can_msg("LKAS_HUD", 0, values) + + +def toyota_checksum(address: int, sig, d: bytearray) -> int: + s = len(d) + addr = address + while addr: + s += addr & 0xFF + addr >>= 8 + for i in range(len(d) - 1): + s += d[i] + return s & 0xFF diff --git a/artifacts/package_runtime/iqdbc/car/toyota/values.py b/artifacts/package_runtime/iqdbc/car/toyota/values.py new file mode 100644 index 000000000..5662fcc74 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/toyota/values.py @@ -0,0 +1,610 @@ +import re +from collections import defaultdict +from dataclasses import dataclass, field +from enum import Enum, IntFlag + +from iqdbc.car import Bus, CarSpecs, PlatformConfig, Platforms +from iqdbc.car.lateral import AngleSteeringLimits +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.structs import CarParams +from iqdbc.car.docs_definitions import CarFootnote, CarDocs, Column, CarParts, CarHarness, SupportType +from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries + +Ecu = CarParams.Ecu +MIN_ACC_SPEED = 19. * CV.MPH_TO_MS +PEDAL_TRANSITION = 10. * CV.MPH_TO_MS + + +class CarControllerParams: + STEER_STEP = 1 + STEER_MAX = 1500 + STEER_ERROR_MAX = 350 # max delta between torque cmd and torque motor + + # Lane Tracing Assist (LTA) control limits + ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( + # EPS ignores commands above this angle and causes PCS to fault + 94.9461, # deg + # Assuming a steering ratio of 13.7: + # Limit to ~2.0 m/s^3 up (7.5 deg/s), ~3.5 m/s^3 down (13 deg/s) at 75 mph + # Worst case, the low speed limits will allow ~4.0 m/s^3 up (15 deg/s) and ~4.9 m/s^3 down (18 deg/s) at 75 mph, + # however the EPS has its own internal limits at all speeds which are less than that: + # Observed internal torque rate limit on TSS 2.5 Camry and RAV4 is ~1500 units/sec up and down when using LTA + ([5, 25], [0.3, 0.15]), + ([5, 25], [0.36, 0.26]), + ) + + MAX_LTA_DRIVER_TORQUE_ALLOWANCE = 150 # slightly above steering pressed allows some resistance when changing lanes + + def __init__(self, CP): + if CP.flags & ToyotaFlags.RAISED_ACCEL_LIMIT: + self.ACCEL_MAX = 2.0 + else: + self.ACCEL_MAX = 1.5 # m/s2, lower than allowed 2.0 m/s^2 for tuning reasons + self.ACCEL_MIN = -3.5 # m/s2 + + if CP.lateralTuning.which() == 'torque': + self.STEER_DELTA_UP = 15 # 1.0s time to peak torque + self.STEER_DELTA_DOWN = 25 # always lower than 45 otherwise the Rav4 faults (Prius seems ok with 50) + else: + self.STEER_DELTA_UP = 10 # 1.5s time to peak torque + self.STEER_DELTA_DOWN = 25 # always lower than 45 otherwise the Rav4 faults (Prius seems ok with 50) + + +class ToyotaSafetyFlags(IntFlag): + # first byte is for EPS scaling factor + ALT_BRAKE = (1 << 8) + STOCK_LONGITUDINAL = (2 << 8) + LTA = (4 << 8) + SECOC = (8 << 8) + + +class ToyotaFlags(IntFlag): + # Detected flags + HYBRID = 1 + DISABLE_RADAR = 4 + + # Static flags + TSS2 = 8 + NO_DSU = 16 + UNSUPPORTED_DSU = 32 + RADAR_ACC = 64 + # these cars use the Lane Tracing Assist (LTA) message for lateral control + ANGLE_CONTROL = 128 + NO_STOP_TIMER = 256 + # these cars can utilize 2.0 m/s^2 + RAISED_ACCEL_LIMIT = 1024 + SECOC = 2048 + + # deprecated flags + # these cars are speculated to allow stop and go when the DSU is unplugged or disabled with sDSU + SNG_WITHOUT_DSU_DEPRECATED = 512 + + +def dbc_dict(pt, radar): + return {Bus.pt: pt, Bus.radar: radar} + + +class Footnote(Enum): + CAMRY = CarFootnote( + "openpilot operates above 28mph for Camry 4CYL L, 4CYL LE and 4CYL SE which don't have Full-Speed Range Dynamic Radar Cruise Control.", + Column.FSR_LONGITUDINAL) + + +@dataclass +class ToyotaCarDocs(CarDocs): + package: str = "All" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.toyota_a])) + + +@dataclass +class ToyotaSecOcCarDocs(ToyotaCarDocs): + support_type: SupportType = SupportType.CUSTOM + support_link: str = "#secoc-cars-with-recoverable-keys" + + +@dataclass +class ToyotaTSS2PlatformConfig(PlatformConfig): + dbc_dict: dict = field(default_factory=lambda: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas')) + + def init(self): + self.flags |= ToyotaFlags.TSS2 | ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.NO_DSU + + if self.flags & ToyotaFlags.RADAR_ACC: + self.dbc_dict = {Bus.pt: 'toyota_nodsu_pt_generated'} + + +@dataclass +class ToyotaSecOCPlatformConfig(PlatformConfig): + dbc_dict: dict = field(default_factory=lambda: dbc_dict('toyota_secoc_pt_generated', 'toyota_tss2_adas')) + + def init(self): + self.flags |= ToyotaFlags.TSS2 | ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.NO_DSU | ToyotaFlags.SECOC + + if self.flags & ToyotaFlags.RADAR_ACC: + self.dbc_dict = {Bus.pt: 'toyota_secoc_pt_generated'} + + +class CAR(Platforms): + # Toyota + TOYOTA_ALPHARD_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Toyota Alphard 2019-20"), + ToyotaCarDocs("Toyota Alphard Hybrid 2021"), + ], + CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444), + ) + TOYOTA_AVALON = PlatformConfig( + [ + ToyotaCarDocs("Toyota Avalon 2016", "Toyota Safety Sense P"), + ToyotaCarDocs("Toyota Avalon 2017-18"), + ], + CarSpecs(mass=3505. * CV.LB_TO_KG, wheelbase=2.82, steerRatio=14.8, tireStiffnessFactor=0.7983), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + ) + TOYOTA_AVALON_2019 = PlatformConfig( + [ + ToyotaCarDocs("Toyota Avalon 2019-21"), + ToyotaCarDocs("Toyota Avalon Hybrid 2019-21"), + ], + TOYOTA_AVALON.specs, + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + ) + TOYOTA_AVALON_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5 + [ + ToyotaCarDocs("Toyota Avalon 2022"), + ToyotaCarDocs("Toyota Avalon Hybrid 2022"), + ], + TOYOTA_AVALON.specs, + ) + TOYOTA_CAMRY = PlatformConfig( + [ + ToyotaCarDocs("Toyota Camry 2018-20", video="https://www.youtube.com/watch?v=fkcjviZY9CM", footnotes=[Footnote.CAMRY]), + ToyotaCarDocs("Toyota Camry Hybrid 2018-20", video="https://www.youtube.com/watch?v=Q2DYY0AWKgk"), + ], + CarSpecs(mass=3400. * CV.LB_TO_KG, wheelbase=2.82448, steerRatio=13.7, tireStiffnessFactor=0.7933), + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_DSU, + ) + TOYOTA_CAMRY_TSS2 = ToyotaTSS2PlatformConfig( # TSS 2.5 + [ + ToyotaCarDocs("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), + ToyotaCarDocs("Toyota Camry Hybrid 2021-24"), + ], + TOYOTA_CAMRY.specs, + ) + TOYOTA_CHR = PlatformConfig( + [ + ToyotaCarDocs("Toyota C-HR 2017-20"), + ToyotaCarDocs("Toyota C-HR Hybrid 2017-20"), + ], + CarSpecs(mass=3300. * CV.LB_TO_KG, wheelbase=2.63906, steerRatio=13.6, tireStiffnessFactor=0.7933), + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_DSU, + ) + TOYOTA_CHR_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Toyota C-HR 2021"), + ToyotaCarDocs("Toyota C-HR Hybrid 2021-22"), + ], + TOYOTA_CHR.specs, + flags=ToyotaFlags.RADAR_ACC, + ) + TOYOTA_COROLLA = PlatformConfig( + [ToyotaCarDocs("Toyota Corolla 2017-19")], + CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + ) + # LSS2 Lexus UX Hybrid is same as a TSS2 Corolla Hybrid + TOYOTA_COROLLA_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Toyota Corolla 2020-22", video="https://www.youtube.com/watch?v=_66pXk0CBYA"), + ToyotaCarDocs("Toyota Corolla Cross (Non-US only) 2020-23", min_enable_speed=7.5), + ToyotaCarDocs("Toyota Corolla Hatchback 2019-22", video="https://www.youtube.com/watch?v=_66pXk0CBYA"), + # Hybrid platforms + ToyotaCarDocs("Toyota Corolla Hybrid 2020-22"), + ToyotaCarDocs("Toyota Corolla Hybrid (South America only) 2020-23", min_enable_speed=7.5), + ToyotaCarDocs("Toyota Corolla Cross Hybrid (Non-US only) 2020-22", min_enable_speed=7.5), + ToyotaCarDocs("Lexus UX Hybrid 2019-24"), + ], + CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444), + ) + TOYOTA_HIGHLANDER = PlatformConfig( + [ + ToyotaCarDocs("Toyota Highlander 2017-19", video="https://www.youtube.com/watch?v=0wS0wXSLzoo"), + ToyotaCarDocs("Toyota Highlander Hybrid 2017-19"), + ], + CarSpecs(mass=4516. * CV.LB_TO_KG, wheelbase=2.8194, steerRatio=16.0, tireStiffnessFactor=0.8), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_STOP_TIMER, + ) + TOYOTA_HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Toyota Highlander 2020-23"), + ToyotaCarDocs("Toyota Highlander Hybrid 2020-23"), + ], + TOYOTA_HIGHLANDER.specs, + ) + TOYOTA_PRIUS = PlatformConfig( + [ + ToyotaCarDocs("Toyota Prius 2016", "Toyota Safety Sense P", video="https://www.youtube.com/watch?v=8zopPJI8XQ0"), + ToyotaCarDocs("Toyota Prius 2017-20", video="https://www.youtube.com/watch?v=8zopPJI8XQ0"), + ToyotaCarDocs("Toyota Prius Prime 2017-20", video="https://www.youtube.com/watch?v=8zopPJI8XQ0"), + ], + CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371), + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + ) + TOYOTA_PRIUS_V = PlatformConfig( + [ToyotaCarDocs("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED)], + CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_STOP_TIMER, + ) + TOYOTA_PRIUS_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Toyota Prius 2021-22", video="https://www.youtube.com/watch?v=J58TvCpUd4U"), + ToyotaCarDocs("Toyota Prius Prime 2021-22", video="https://www.youtube.com/watch?v=J58TvCpUd4U"), + ], + CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371), + ) + TOYOTA_RAV4 = PlatformConfig( + [ + ToyotaCarDocs("Toyota RAV4 2016", "Toyota Safety Sense P"), + ToyotaCarDocs("Toyota RAV4 2017-18") + ], + CarSpecs(mass=3650. * CV.LB_TO_KG, wheelbase=2.65, steerRatio=16.88, tireStiffnessFactor=0.5533), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + ) + TOYOTA_RAV4H = PlatformConfig( + [ + ToyotaCarDocs("Toyota RAV4 Hybrid 2016", "Toyota Safety Sense P", video="https://youtu.be/LhT5VzJVfNI?t=26"), + ToyotaCarDocs("Toyota RAV4 Hybrid 2017-18", video="https://youtu.be/LhT5VzJVfNI?t=26") + ], + TOYOTA_RAV4.specs, + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + # Note that the ICE RAV4 does not respect positive acceleration commands under 19 mph + flags=ToyotaFlags.NO_STOP_TIMER, + ) + TOYOTA_RAV4_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Toyota RAV4 2019-21", video="https://www.youtube.com/watch?v=wJxjDd42gGA"), + ToyotaCarDocs("Toyota RAV4 Hybrid 2019-21"), + ], + CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933), + ) + TOYOTA_RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Toyota RAV4 2022"), + ToyotaCarDocs("Toyota RAV4 Hybrid 2022", video="https://youtu.be/U0nH9cnrFB0"), + ], + TOYOTA_RAV4_TSS2.specs, + flags=ToyotaFlags.RADAR_ACC, + ) + TOYOTA_RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Toyota RAV4 2023-25"), + ToyotaCarDocs("Toyota RAV4 Hybrid 2023-25", video="https://youtu.be/4eIsEq4L4Ng"), + ], + TOYOTA_RAV4_TSS2.specs, + flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL, + ) + TOYOTA_RAV4_PRIME = ToyotaSecOCPlatformConfig( + [ToyotaSecOcCarDocs("Toyota RAV4 Prime 2021-23", min_enable_speed=MIN_ACC_SPEED)], + CarSpecs(mass=4372. * CV.LB_TO_KG, wheelbase=2.68, steerRatio=16.88, tireStiffnessFactor=0.5533), + ) + TOYOTA_YARIS = ToyotaSecOCPlatformConfig( + [ToyotaSecOcCarDocs("Toyota Yaris (Non-US only) 2020, 2023", min_enable_speed=MIN_ACC_SPEED)], + CarSpecs(mass=1170, wheelbase=2.55, steerRatio=14.80, tireStiffnessFactor=0.5533), + flags=ToyotaFlags.RADAR_ACC, + ) + TOYOTA_MIRAI = ToyotaTSS2PlatformConfig( # TSS 2.5 + [ToyotaCarDocs("Toyota Mirai 2021")], + CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8), + ) + TOYOTA_SIENNA = PlatformConfig( + [ToyotaCarDocs("Toyota Sienna 2018-20", video="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED)], + CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_STOP_TIMER, + ) + TOYOTA_SIENNA_4TH_GEN = ToyotaSecOCPlatformConfig( + [ToyotaSecOcCarDocs("Toyota Sienna 2021-23", min_enable_speed=MIN_ACC_SPEED)], + CarSpecs(mass=4625. * CV.LB_TO_KG, wheelbase=3.06, steerRatio=17.8, tireStiffnessFactor=0.444), + ) + + # Lexus + LEXUS_CTH = PlatformConfig( + [ToyotaCarDocs("Lexus CT Hybrid 2017-18", "Lexus Safety System+")], + CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + ) + LEXUS_ES = PlatformConfig( + [ + ToyotaCarDocs("Lexus ES 2017-18"), + ToyotaCarDocs("Lexus ES Hybrid 2017-18"), + ], + CarSpecs(mass=3677. * CV.LB_TO_KG, wheelbase=2.8702, steerRatio=16.0, tireStiffnessFactor=0.444), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + ) + LEXUS_ES_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Lexus ES 2019-25"), + ToyotaCarDocs("Lexus ES Hybrid 2019-25", video="https://youtu.be/BZ29osRVJeg?t=12"), + ], + LEXUS_ES.specs, + ) + LEXUS_IS = PlatformConfig( + [ToyotaCarDocs("Lexus IS 2017-19")], + CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.UNSUPPORTED_DSU, + ) + LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig( + [ToyotaCarDocs("Lexus IS 2022-24")], + LEXUS_IS.specs, + ) + LEXUS_NX = PlatformConfig( + [ + ToyotaCarDocs("Lexus NX 2018-19"), + ToyotaCarDocs("Lexus NX Hybrid 2018-19"), + ], + CarSpecs(mass=4070. * CV.LB_TO_KG, wheelbase=2.66, steerRatio=14.7, tireStiffnessFactor=0.444), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + ) + LEXUS_NX_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Lexus NX 2020-21"), + ToyotaCarDocs("Lexus NX Hybrid 2020-21"), + ], + LEXUS_NX.specs, + ) + LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig( + [ToyotaCarDocs("Lexus LC 2024-25")], + CarSpecs(mass=4500. * CV.LB_TO_KG, wheelbase=2.87, steerRatio=13.0, tireStiffnessFactor=0.444), + ) + LEXUS_RC = PlatformConfig( + [ToyotaCarDocs("Lexus RC 2018-20")], + LEXUS_IS.specs, + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.UNSUPPORTED_DSU, + ) + LEXUS_RC_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Lexus RC 2023"), + ], + CarSpecs(mass=3986. * CV.LB_TO_KG, wheelbase=2.73, steerRatio=13.9, tireStiffnessFactor=0.444), + ) + LEXUS_RX = PlatformConfig( + [ + ToyotaCarDocs("Lexus RX 2016", "Lexus Safety System+"), + ToyotaCarDocs("Lexus RX 2017-19"), + # Hybrid platforms + ToyotaCarDocs("Lexus RX Hybrid 2016", "Lexus Safety System+"), + ToyotaCarDocs("Lexus RX Hybrid 2017-19"), + ], + CarSpecs(mass=4481. * CV.LB_TO_KG, wheelbase=2.79, steerRatio=16., tireStiffnessFactor=0.5533), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + ) + LEXUS_RX_TSS2 = ToyotaTSS2PlatformConfig( + [ + ToyotaCarDocs("Lexus RX 2020-22"), + ToyotaCarDocs("Lexus RX Hybrid 2020-22"), + ], + LEXUS_RX.specs, + ) + LEXUS_GS_F = PlatformConfig( + [ToyotaCarDocs("Lexus GS F 2016")], + CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.UNSUPPORTED_DSU, + ) + LEXUS_LS = PlatformConfig( + [ToyotaCarDocs("Lexus LS 2018", "All except Lexus Safety System+ A")], + CarSpecs(mass=4905. * CV.LB_TO_KG, wheelbase=3.125, steerRatio=15.0, tireStiffnessFactor=0.444), + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + ) + + +def get_platform_codes(fw_versions: list[bytes]) -> dict[bytes, set[bytes]]: + # Returns sub versions in a dict so comparisons can be made within part-platform-major_version combos + codes = defaultdict(set) # Optional[part]-platform-major_version: set of sub_version + for fw in fw_versions: + # FW versions returned from UDS queries can return multiple fields/chunks of data (different ECU calibrations, different data?) + # and are prefixed with a byte that describes how many chunks of data there are. + # But FW returned from KWP requires querying of each sub-data id and does not have a length prefix. + + length_code = 1 + length_code_match = FW_LEN_CODE.search(fw) + if length_code_match is not None: + length_code = length_code_match.group()[0] + fw = fw[1:] + + # fw length should be multiple of 16 bytes (per chunk, even if no length code), skip parsing if unexpected length + if length_code * FW_CHUNK_LEN != len(fw): + continue + + chunks = [fw[FW_CHUNK_LEN * i:FW_CHUNK_LEN * i + FW_CHUNK_LEN].strip(b'\x00 ') for i in range(length_code)] + + # only first is considered for now since second is commonly shared (TODO: understand that) + first_chunk = chunks[0] + if len(first_chunk) == 8: + # TODO: no part number, but some short chunks have it in subsequent chunks + fw_match = SHORT_FW_PATTERN.search(first_chunk) + if fw_match is not None: + platform, major_version, sub_version = fw_match.groups() + codes[b'-'.join((platform, major_version))].add(sub_version) + + elif len(first_chunk) == 10: + fw_match = MEDIUM_FW_PATTERN.search(first_chunk) + if fw_match is not None: + part, platform, major_version, sub_version = fw_match.groups() + codes[b'-'.join((part, platform, major_version))].add(sub_version) + + elif len(first_chunk) == 12: + fw_match = LONG_FW_PATTERN.search(first_chunk) + if fw_match is not None: + part, platform, major_version, sub_version = fw_match.groups() + codes[b'-'.join((part, platform, major_version))].add(sub_version) + + return dict(codes) + + +def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: + candidates = set() + + for candidate, fws in offline_fw_versions.items(): + # Keep track of ECUs which pass all checks (platform codes, within sub-version range) + valid_found_ecus = set() + valid_expected_ecus = {ecu[1:] for ecu in fws if ecu[0] in PLATFORM_CODE_ECUS} + for ecu, expected_versions in fws.items(): + addr = ecu[1:] + # Only check ECUs expected to have platform codes + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + # Expected platform codes & versions + expected_platform_codes = get_platform_codes(expected_versions) + + # Found platform codes & versions + found_platform_codes = get_platform_codes(live_fw_versions.get(addr, set())) + + # Check part number + platform code + major version matches for any found versions + # Platform codes and major versions change for different physical parts, generation, API, etc. + # Sub-versions are incremented for minor recalls, do not need to be checked. + if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes): + break + + valid_found_ecus.add(addr) + + # If all live ECUs pass all checks for candidate, add it as a match + if valid_expected_ecus.issubset(valid_found_ecus): + candidates.add(candidate) + + return {str(c) for c in (candidates - FUZZY_EXCLUDED_PLATFORMS)} + + +# Regex patterns for parsing more general platform-specific identifiers from FW versions. +# - Part number: Toyota part number (usually last character needs to be ignored to find a match). +# Each ECU address has just one part number. +# - Platform: usually multiple codes per an openpilot platform, however this is the least variable and +# is usually shared across ECUs and model years signifying this describes something about the specific platform. +# This describes more generational changes (TSS-P vs TSS2), or manufacture region. +# - Major version: second least variable part of the FW version. Seen splitting cars by model year/API such as +# RAV4 2022/2023 and Avalon. Used to differentiate cars where API has changed slightly, but is not a generational change. +# It is important to note that these aren't always consecutive, for example: +# Avalon 2016-18's fwdCamera has these major versions: 01, 03 while 2019 has: 02 +# - Sub version: exclusive to major version, but shared with other cars. Should only be used for further filtering. +# Seen bumped in TSB FW updates, and describes other minor differences. +SHORT_FW_PATTERN = re.compile(b'[A-Z0-9](?P[A-Z0-9]{2})(?P[A-Z0-9]{2})(?P[A-Z0-9]{3})') +MEDIUM_FW_PATTERN = re.compile(b'(?P[A-Z0-9]{5})(?P[A-Z0-9]{2})(?P[A-Z0-9]{1})(?P[A-Z0-9]{2})') +LONG_FW_PATTERN = re.compile(b'(?P[A-Z0-9]{5})(?P[A-Z0-9]{2})(?P[A-Z0-9]{2})(?P[A-Z0-9]{3})') +FW_LEN_CODE = re.compile(b'^[\x01-\x03]') # highest seen is 3 chunks, 16 bytes each +FW_CHUNK_LEN = 16 + +# List of ECUs that are most unique across openpilot platforms +# - fwdCamera: describes actual features related to ADAS. For example, on the Avalon it describes +# when TSS-P became standard, whether the car supports stop and go, and whether it's TSS2. +# On the RAV4, it describes the move to the radar doing ACC, and the use of LTA for lane keeping. +# Note that the platform codes & major versions do not describe features in plain text, only with +# matching against other seen FW versions in the database they can describe features. +# - fwdRadar: sanity check against fwdCamera, commonly shares a platform code. +# For example the RAV4 2022's new radar architecture is shown for both with platform code. +# - abs: differentiates hybrid/ICE on most cars (Corolla TSS2 is an exception, not used due to hybrid platform combination) +# - eps: describes lateral API changes for the EPS, such as using LTA for lane keeping and rejecting LKA messages +PLATFORM_CODE_ECUS = (Ecu.fwdCamera, Ecu.fwdRadar, Ecu.eps) + +# These platforms have at least one platform code for all ECUs shared with another platform. +FUZZY_EXCLUDED_PLATFORMS: set[CAR] = set() + +# Some ECUs that use KWP2000 have their FW versions on non-standard data identifiers. +# Toyota diagnostic software first gets the supported data ids, then queries them one by one. +# For example, sends: 0x1a8800, receives: 0x1a8800010203, queries: 0x1a8801, 0x1a8802, 0x1a8803 +TOYOTA_VERSION_REQUEST_KWP = b'\x1a\x88\x01' +TOYOTA_VERSION_RESPONSE_KWP = b'\x5a\x88\x01' + +FW_QUERY_CONFIG = FwQueryConfig( + # TODO: look at data to whitelist new ECUs effectively + requests=[ + Request( + [StdQueries.SHORT_TESTER_PRESENT_REQUEST, TOYOTA_VERSION_REQUEST_KWP], + [StdQueries.SHORT_TESTER_PRESENT_RESPONSE, TOYOTA_VERSION_RESPONSE_KWP], + whitelist_ecus=[Ecu.fwdCamera, Ecu.fwdRadar, Ecu.dsu, Ecu.abs, Ecu.eps, Ecu.srs, Ecu.transmission, Ecu.hvac], + bus=0, + ), + Request( + [StdQueries.SHORT_TESTER_PRESENT_REQUEST, StdQueries.OBD_VERSION_REQUEST], + [StdQueries.SHORT_TESTER_PRESENT_RESPONSE, StdQueries.OBD_VERSION_RESPONSE], + whitelist_ecus=[Ecu.engine, Ecu.hybrid, Ecu.srs, Ecu.transmission, Ecu.hvac], + bus=0, + ), + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.DEFAULT_DIAGNOSTIC_REQUEST, StdQueries.EXTENDED_DIAGNOSTIC_REQUEST, StdQueries.UDS_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.DEFAULT_DIAGNOSTIC_RESPONSE, StdQueries.EXTENDED_DIAGNOSTIC_RESPONSE, StdQueries.UDS_VERSION_RESPONSE], + whitelist_ecus=[Ecu.engine, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.abs, Ecu.eps, + Ecu.hybrid, Ecu.srs, Ecu.transmission, Ecu.hvac], + bus=0, + ), + ], + non_essential_ecus={ + # FIXME: On some models, abs can sometimes be missing + Ecu.abs: [CAR.TOYOTA_RAV4, CAR.TOYOTA_COROLLA, CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_SIENNA, CAR.LEXUS_IS, CAR.TOYOTA_ALPHARD_TSS2], + # On some models, the engine can show on two different addresses + Ecu.engine: [CAR.TOYOTA_HIGHLANDER, CAR.TOYOTA_CAMRY, CAR.TOYOTA_COROLLA_TSS2, CAR.TOYOTA_CHR, CAR.TOYOTA_CHR_TSS2, CAR.LEXUS_IS, + CAR.LEXUS_IS_TSS2, CAR.LEXUS_RC, CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2, CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2], + }, + extra_ecus=[ + # All known ECUs on a late-model Toyota vehicle not queried here: + # Responds to UDS: + # - Combination Meter (0x7c0) + # - HV Battery (0x713, 0x747) + # - Motor Generator (0x716, 0x724) + # - 2nd ABS "Brake/EPB" (0x730) + # - Electronic Parking Brake ((0x750, 0x2c)) + # - Telematics ((0x750, 0xc7)) + # Responds to KWP (0x1a8801): + # - Steering Angle Sensor (0x7b3) + # - EPS/EMPS (0x7a0, 0x7a1) + # - 2nd SRS Airbag (0x784) + # - Central Gateway ((0x750, 0x5f)) + # - Telematics ((0x750, 0xc7)) + # Responds to KWP (0x1a8881): + # - Body Control Module ((0x750, 0x40)) + # - Telematics ((0x750, 0xc7)) + + # Hybrid control computer can be on 0x7e2 (KWP) or 0x7d2 (UDS) depending on platform + (Ecu.hybrid, 0x7e2, None), # Hybrid Control Assembly & Computer + (Ecu.hybrid, 0x7d2, None), # Hybrid Control Assembly & Computer + (Ecu.srs, 0x780, None), # SRS Airbag + # Transmission is combined with engine on some platforms, such as TSS-P RAV4 + (Ecu.transmission, 0x701, None), + # A few platforms have a tester present response on this address, add to log + (Ecu.transmission, 0x7e1, None), + (Ecu.hvac, 0x7c4, None), + ], + match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, +) + +STEER_THRESHOLD = 100 + +# These cars have non-standard EPS torque scale factors. All others are 73 +EPS_SCALE = defaultdict(lambda: 73, + {CAR.TOYOTA_PRIUS: 66, CAR.TOYOTA_COROLLA: 88, CAR.LEXUS_IS: 77, CAR.LEXUS_RC: 77, CAR.LEXUS_CTH: 100, CAR.TOYOTA_PRIUS_V: 100}) + +# Toyota/Lexus Safety Sense 2.0 and 2.5 +TSS2_CAR = CAR.with_flags(ToyotaFlags.TSS2) + +NO_DSU_CAR = CAR.with_flags(ToyotaFlags.NO_DSU) + +# the DSU uses the AEB message for longitudinal on these cars +UNSUPPORTED_DSU_CAR = CAR.with_flags(ToyotaFlags.UNSUPPORTED_DSU) + +# these cars have a radar which sends ACC messages instead of the camera +RADAR_ACC_CAR = CAR.with_flags(ToyotaFlags.RADAR_ACC) + +ANGLE_CONTROL_CAR = CAR.with_flags(ToyotaFlags.ANGLE_CONTROL) + +SECOC_CAR = CAR.with_flags(ToyotaFlags.SECOC) + +# no resume button press required +NO_STOP_TIMER_CAR = CAR.with_flags(ToyotaFlags.NO_STOP_TIMER) + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/uds.py b/artifacts/package_runtime/iqdbc/car/uds.py new file mode 100644 index 000000000..8f5220366 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/uds.py @@ -0,0 +1,973 @@ +import time +import struct +from collections import deque +from typing import NamedTuple, cast +from collections.abc import Callable, Generator +from enum import IntEnum +from functools import partial + +from iqdbc.car.carlog import carlog + + +class SERVICE_TYPE(IntEnum): + DIAGNOSTIC_SESSION_CONTROL = 0x10 + ECU_RESET = 0x11 + SECURITY_ACCESS = 0x27 + COMMUNICATION_CONTROL = 0x28 + TESTER_PRESENT = 0x3E + ACCESS_TIMING_PARAMETER = 0x83 + SECURED_DATA_TRANSMISSION = 0x84 + CONTROL_DTC_SETTING = 0x85 + RESPONSE_ON_EVENT = 0x86 + LINK_CONTROL = 0x87 + READ_DATA_BY_IDENTIFIER = 0x22 + READ_MEMORY_BY_ADDRESS = 0x23 + READ_SCALING_DATA_BY_IDENTIFIER = 0x24 + READ_DATA_BY_PERIODIC_IDENTIFIER = 0x2A + DYNAMICALLY_DEFINE_DATA_IDENTIFIER = 0x2C + WRITE_DATA_BY_IDENTIFIER = 0x2E + WRITE_MEMORY_BY_ADDRESS = 0x3D + CLEAR_DIAGNOSTIC_INFORMATION = 0x14 + READ_DTC_INFORMATION = 0x19 + INPUT_OUTPUT_CONTROL_BY_IDENTIFIER = 0x2F + ROUTINE_CONTROL = 0x31 + REQUEST_DOWNLOAD = 0x34 + REQUEST_UPLOAD = 0x35 + TRANSFER_DATA = 0x36 + REQUEST_TRANSFER_EXIT = 0x37 + + +class SESSION_TYPE(IntEnum): + DEFAULT = 1 + PROGRAMMING = 2 + EXTENDED_DIAGNOSTIC = 3 + SAFETY_SYSTEM_DIAGNOSTIC = 4 + + +class RESET_TYPE(IntEnum): + HARD = 1 + KEY_OFF_ON = 2 + SOFT = 3 + ENABLE_RAPID_POWER_SHUTDOWN = 4 + DISABLE_RAPID_POWER_SHUTDOWN = 5 + + +class ACCESS_TYPE(IntEnum): + REQUEST_SEED = 1 + SEND_KEY = 2 + + +class CONTROL_TYPE(IntEnum): + ENABLE_RX_ENABLE_TX = 0 + ENABLE_RX_DISABLE_TX = 1 + DISABLE_RX_ENABLE_TX = 2 + DISABLE_RX_DISABLE_TX = 3 + + +class MESSAGE_TYPE(IntEnum): + NORMAL = 1 + NETWORK_MANAGEMENT = 2 + NORMAL_AND_NETWORK_MANAGEMENT = 3 + + +class TIMING_PARAMETER_TYPE(IntEnum): + READ_EXTENDED_SET = 1 + SET_TO_DEFAULT_VALUES = 2 + READ_CURRENTLY_ACTIVE = 3 + SET_TO_GIVEN_VALUES = 4 + + +class DTC_SETTING_TYPE(IntEnum): + ON = 1 + OFF = 2 + + +class RESPONSE_EVENT_TYPE(IntEnum): + STOP_RESPONSE_ON_EVENT = 0 + ON_DTC_STATUS_CHANGE = 1 + ON_TIMER_INTERRUPT = 2 + ON_CHANGE_OF_DATA_IDENTIFIER = 3 + REPORT_ACTIVATED_EVENTS = 4 + START_RESPONSE_ON_EVENT = 5 + CLEAR_RESPONSE_ON_EVENT = 6 + ON_COMPARISON_OF_VALUES = 7 + + +class LINK_CONTROL_TYPE(IntEnum): + VERIFY_BAUDRATE_TRANSITION_WITH_FIXED_BAUDRATE = 1 + VERIFY_BAUDRATE_TRANSITION_WITH_SPECIFIC_BAUDRATE = 2 + TRANSITION_BAUDRATE = 3 + + +class BAUD_RATE_TYPE(IntEnum): + PC9600 = 1 + PC19200 = 2 + PC38400 = 3 + PC57600 = 4 + PC115200 = 5 + CAN125000 = 16 + CAN250000 = 17 + CAN500000 = 18 + CAN1000000 = 19 + + +class DATA_IDENTIFIER_TYPE(IntEnum): + BOOT_SOFTWARE_IDENTIFICATION = 0xF180 + APPLICATION_SOFTWARE_IDENTIFICATION = 0xF181 + APPLICATION_DATA_IDENTIFICATION = 0xF182 + BOOT_SOFTWARE_FINGERPRINT = 0xF183 + APPLICATION_SOFTWARE_FINGERPRINT = 0xF184 + APPLICATION_DATA_FINGERPRINT = 0xF185 + ACTIVE_DIAGNOSTIC_SESSION = 0xF186 + VEHICLE_MANUFACTURER_SPARE_PART_NUMBER = 0xF187 + VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER = 0xF188 + VEHICLE_MANUFACTURER_ECU_SOFTWARE_VERSION_NUMBER = 0xF189 + SYSTEM_SUPPLIER_IDENTIFIER = 0xF18A + ECU_MANUFACTURING_DATE = 0xF18B + ECU_SERIAL_NUMBER = 0xF18C + SUPPORTED_FUNCTIONAL_UNITS = 0xF18D + VEHICLE_MANUFACTURER_KIT_ASSEMBLY_PART_NUMBER = 0xF18E + VIN = 0xF190 + VEHICLE_MANUFACTURER_ECU_HARDWARE_NUMBER = 0xF191 + SYSTEM_SUPPLIER_ECU_HARDWARE_NUMBER = 0xF192 + SYSTEM_SUPPLIER_ECU_HARDWARE_VERSION_NUMBER = 0xF193 + SYSTEM_SUPPLIER_ECU_SOFTWARE_NUMBER = 0xF194 + SYSTEM_SUPPLIER_ECU_SOFTWARE_VERSION_NUMBER = 0xF195 + EXHAUST_REGULATION_OR_TYPE_APPROVAL_NUMBER = 0xF196 + SYSTEM_NAME_OR_ENGINE_TYPE = 0xF197 + REPAIR_SHOP_CODE_OR_TESTER_SERIAL_NUMBER = 0xF198 + PROGRAMMING_DATE = 0xF199 + CALIBRATION_REPAIR_SHOP_CODE_OR_CALIBRATION_EQUIPMENT_SERIAL_NUMBER = 0xF19A + CALIBRATION_DATE = 0xF19B + CALIBRATION_EQUIPMENT_SOFTWARE_NUMBER = 0xF19C + ECU_INSTALLATION_DATE = 0xF19D + ODX_FILE = 0xF19E + ENTITY = 0xF19F + + +class TRANSMISSION_MODE_TYPE(IntEnum): + SEND_AT_SLOW_RATE = 1 + SEND_AT_MEDIUM_RATE = 2 + SEND_AT_FAST_RATE = 3 + STOP_SENDING = 4 + + +class DYNAMIC_DEFINITION_TYPE(IntEnum): + DEFINE_BY_IDENTIFIER = 1 + DEFINE_BY_MEMORY_ADDRESS = 2 + CLEAR_DYNAMICALLY_DEFINED_DATA_IDENTIFIER = 3 + + +class ISOTP_FRAME_TYPE(IntEnum): + SINGLE = 0 + FIRST = 1 + CONSECUTIVE = 2 + FLOW = 3 + + +class DynamicSourceDefinition(NamedTuple): + data_identifier: int + position: int + memory_size: int + memory_address: int + + +class DTC_GROUP_TYPE(IntEnum): + EMISSIONS = 0x000000 + ALL = 0xFFFFFF + + +class DTC_REPORT_TYPE(IntEnum): + NUMBER_OF_DTC_BY_STATUS_MASK = 0x01 + DTC_BY_STATUS_MASK = 0x02 + DTC_SNAPSHOT_IDENTIFICATION = 0x03 + DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER = 0x04 + DTC_SNAPSHOT_RECORD_BY_RECORD_NUMBER = 0x05 + DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER = 0x06 + NUMBER_OF_DTC_BY_SEVERITY_MASK_RECORD = 0x07 + DTC_BY_SEVERITY_MASK_RECORD = 0x08 + SEVERITY_INFORMATION_OF_DTC = 0x09 + SUPPORTED_DTC = 0x0A + FIRST_TEST_FAILED_DTC = 0x0B + FIRST_CONFIRMED_DTC = 0x0C + MOST_RECENT_TEST_FAILED_DTC = 0x0D + MOST_RECENT_CONFIRMED_DTC = 0x0E + MIRROR_MEMORY_DTC_BY_STATUS_MASK = 0x0F + MIRROR_MEMORY_DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER = 0x10 + NUMBER_OF_MIRROR_MEMORY_DTC_BY_STATUS_MASK = 0x11 + NUMBER_OF_EMISSIONS_RELATED_OBD_DTC_BY_STATUS_MASK = 0x12 + EMISSIONS_RELATED_OBD_DTC_BY_STATUS_MASK = 0x13 + DTC_FAULT_DETECTION_COUNTER = 0x14 + DTC_WITH_PERMANENT_STATUS = 0x15 + + +class DTC_STATUS_MASK_TYPE(IntEnum): + TEST_FAILED = 0x01 + TEST_FAILED_THIS_OPERATION_CYCLE = 0x02 + PENDING_DTC = 0x04 + CONFIRMED_DTC = 0x08 + TEST_NOT_COMPLETED_SINCE_LAST_CLEAR = 0x10 + TEST_FAILED_SINCE_LAST_CLEAR = 0x20 + TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE = 0x40 + WARNING_INDICATOR_REQUESTED = 0x80 + ALL = 0xFF + + +class DTC_SEVERITY_MASK_TYPE(IntEnum): + MAINTENANCE_ONLY = 0x20 + CHECK_AT_NEXT_HALT = 0x40 + CHECK_IMMEDIATELY = 0x80 + ALL = 0xE0 + + +class CONTROL_PARAMETER_TYPE(IntEnum): + RETURN_CONTROL_TO_ECU = 0 + RESET_TO_DEFAULT = 1 + FREEZE_CURRENT_STATE = 2 + SHORT_TERM_ADJUSTMENT = 3 + + +class ROUTINE_CONTROL_TYPE(IntEnum): + START = 1 + STOP = 2 + REQUEST_RESULTS = 3 + + +class ROUTINE_IDENTIFIER_TYPE(IntEnum): + ERASE_MEMORY = 0xFF00 + CHECK_PROGRAMMING_DEPENDENCIES = 0xFF01 + ERASE_MIRROR_MEMORY_DTCS = 0xFF02 + + +class MessageTimeoutError(Exception): + pass + + +class NegativeResponseError(Exception): + def __init__(self, message, service_id, error_code): + super().__init__() + self.message = message + self.service_id = service_id + self.error_code = error_code + + def __str__(self): + return self.message + + +class InvalidServiceIdError(Exception): + pass + + +class InvalidSubFunctionError(Exception): + pass + + +class InvalidSubAddressError(Exception): + pass + + +_negative_response_codes = { + 0x00: 'positive response', + 0x10: 'general reject', + 0x11: 'service not supported', + 0x12: 'sub-function not supported', + 0x13: 'incorrect message length or invalid format', + 0x14: 'response too long', + 0x21: 'busy repeat request', + 0x22: 'conditions not correct', + 0x24: 'request sequence error', + 0x25: 'no response from subnet component', + 0x26: 'failure prevents execution of requested action', + 0x31: 'request out of range', + 0x33: 'security access denied', + 0x35: 'invalid key', + 0x36: 'exceed number of attempts', + 0x37: 'required time delay not expired', + 0x70: 'upload download not accepted', + 0x71: 'transfer data suspended', + 0x72: 'general programming failure', + 0x73: 'wrong block sequence counter', + 0x78: 'request correctly received - response pending', + 0x7e: 'sub-function not supported in active session', + 0x7f: 'service not supported in active session', + 0x81: 'rpm too high', + 0x82: 'rpm too low', + 0x83: 'engine is running', + 0x84: 'engine is not running', + 0x85: 'engine run time too low', + 0x86: 'temperature too high', + 0x87: 'temperature too low', + 0x88: 'vehicle speed too high', + 0x89: 'vehicle speed too low', + 0x8a: 'throttle/pedal too high', + 0x8b: 'throttle/pedal too low', + 0x8c: 'transmission not in neutral', + 0x8d: 'transmission not in gear', + 0x8f: 'brake switch(es) not closed', + 0x90: 'shifter lever not in park', + 0x91: 'torque converter clutch locked', + 0x92: 'voltage too high', + 0x93: 'voltage too low', +} + + +def get_dtc_num_as_str(dtc_num_bytes): + # ISO 15031-6 + designator = { + 0b00: "P", + 0b01: "C", + 0b10: "B", + 0b11: "U", + } + d = designator[dtc_num_bytes[0] >> 6] + n = bytes([dtc_num_bytes[0] & 0x3F]) + dtc_num_bytes[1:] + return d + n.hex() + + +def get_dtc_status_names(status): + result = list() + for m in DTC_STATUS_MASK_TYPE: + if m == DTC_STATUS_MASK_TYPE.ALL: + continue + if status & m.value: + result.append(m.name) + return result + + +class CanClient: + def __init__(self, can_send: Callable[[int, bytes, int], None], can_recv: Callable[[], list[tuple[int, bytes, int]]], + tx_addr: int, rx_addr: int, bus: int, sub_addr: int | None = None, rx_sub_addr: int | None = None): + self.tx = can_send + self.rx = can_recv + self.tx_addr = tx_addr + self.rx_addr = rx_addr + self.rx_buff: deque[bytes] = deque() + self.sub_addr = sub_addr + self.rx_sub_addr = rx_sub_addr if rx_sub_addr is not None else sub_addr + self.bus = bus + + def _recv_filter(self, bus: int, addr: int) -> bool: + # handle functional addresses (switch to first addr to respond) + if self.tx_addr == 0x7DF: + is_response = addr >= 0x7E8 and addr <= 0x7EF + if is_response: + carlog.debug(f"switch to physical addr {hex(addr)}") + self.tx_addr = addr - 8 + self.rx_addr = addr + return is_response + if self.tx_addr == 0x18DB33F1: + is_response = addr >= 0x18DAF100 and addr <= 0x18DAF1FF + if is_response: + carlog.debug(f"switch to physical addr {hex(addr)}") + self.tx_addr = 0x18DA00F1 + (addr << 8 & 0xFF00) + self.rx_addr = addr + return bus == self.bus and addr == self.rx_addr + + def _recv_buffer(self, drain: bool = False) -> None: + while True: + msgs = self.rx() + if drain: + carlog.debug(f"CAN-RX: drain - {len(msgs)}") + self.rx_buff.clear() + else: + for rx_addr, rx_data, rx_bus in msgs or []: + if self._recv_filter(rx_bus, rx_addr) and len(rx_data) > 0: + rx_data = bytes(rx_data) # convert bytearray to bytes + + carlog.debug(f"CAN-RX: {hex(rx_addr)} - 0x{bytes.hex(rx_data)}") + + # Cut off sub addr in first byte + if self.rx_sub_addr is not None: + if rx_data[0] != self.rx_sub_addr: + raise InvalidSubAddressError(f"isotp - rx: invalid sub-address: {rx_data[0]}, expected: {self.rx_sub_addr}") + rx_data = rx_data[1:] + + self.rx_buff.append(rx_data) + # break when non-full buffer is processed + if len(msgs) < 254: + return + + def recv(self, drain: bool = False) -> Generator[bytes, None, None]: + # buffer rx messages in case two response messages are received at once + # (e.g. response pending and success/failure response) + self._recv_buffer(drain) + try: + while True: + yield self.rx_buff.popleft() + except IndexError: + pass # empty + + def send(self, msgs: list[bytes], delay: float = 0) -> None: + for i, msg in enumerate(msgs): + if delay and i != 0: + carlog.debug(f"CAN-TX: delay - {delay}") + time.sleep(delay) + + if self.sub_addr is not None: + msg = bytes([self.sub_addr]) + msg + + carlog.debug(f"CAN-TX: {hex(self.tx_addr)} - 0x{bytes.hex(msg)}") + assert len(msg) <= 8 + + self.tx(self.tx_addr, msg, self.bus) + # prevent rx buffer from overflowing on large tx + if i % 10 == 9: + self._recv_buffer() + + +class IsoTpMessage: + def __init__(self, can_client: CanClient, timeout: float = 1, single_frame_mode: bool = False, separation_time: float = 0): + self._can_client = can_client + self.timeout = timeout + self.single_frame_mode = single_frame_mode + self.max_len = 8 if self._can_client.sub_addr is None else 7 + + # <= 127, separation time in milliseconds + # 0xF1 to 0xF9 UF, 100 to 900 microseconds + if 1e-4 <= separation_time <= 9e-4: + offset = int(round(separation_time, 4) * 1e4) - 1 + separation_time = 0xF1 + offset + elif 0 <= separation_time <= 0.127: + separation_time = round(separation_time * 1000) + else: + raise Exception("Separation time not in range") + + self.flow_control_msg = bytes([ + 0x30, # flow control + 0x01 if self.single_frame_mode else 0x00, # block size + separation_time, + ]).ljust(self.max_len, b"\x00") + + def send(self, dat: bytes, setup_only: bool = False) -> None: + # throw away any stale data + self._can_client.recv(drain=True) + + self.tx_dat = dat + self.tx_len = len(dat) + self.tx_idx = 0 + self.tx_done = False + + self.rx_dat = b"" + self.rx_len = 0 + self.rx_idx = 0 + self.rx_done = False + + if not setup_only: + carlog.debug(f"ISO-TP: REQUEST - {hex(self._can_client.tx_addr)} 0x{bytes.hex(self.tx_dat)}") + self._tx_first_frame(setup_only=setup_only) + + def _tx_first_frame(self, setup_only: bool = False) -> None: + if self.tx_len < self.max_len: + # single frame (send all bytes) + if not setup_only: + carlog.debug(f"ISO-TP: TX - single frame - {hex(self._can_client.tx_addr)}") + msg = (bytes([self.tx_len]) + self.tx_dat).ljust(self.max_len, b"\x00") + self.tx_done = True + else: + # first frame (send first 6 bytes) + if not setup_only: + carlog.debug(f"ISO-TP: TX - first frame - {hex(self._can_client.tx_addr)}") + msg = (struct.pack("!H", 0x1000 | self.tx_len) + self.tx_dat[:self.max_len - 2]).ljust(self.max_len - 2, b"\x00") + if not setup_only: + self._can_client.send([msg]) + + def recv(self, timeout=None) -> tuple[bytes | None, bool]: + if timeout is None: + timeout = self.timeout + + start_time = time.monotonic() + rx_in_progress = False + try: + while True: + for msg in self._can_client.recv(): + frame_type = self._isotp_rx_next(msg) + start_time = time.monotonic() + # Anything that signifies we're building a response + rx_in_progress = frame_type in (ISOTP_FRAME_TYPE.FIRST, ISOTP_FRAME_TYPE.CONSECUTIVE) + if self.tx_done and self.rx_done: + return self.rx_dat, False + # no timeout indicates non-blocking + if timeout == 0: + return None, rx_in_progress + if time.monotonic() - start_time > timeout: + raise MessageTimeoutError("timeout waiting for response") + finally: + if self.rx_dat: + carlog.debug(f"ISO-TP: RESPONSE - {hex(self._can_client.rx_addr)} 0x{bytes.hex(self.rx_dat)}") + + def _isotp_rx_next(self, rx_data: bytes) -> ISOTP_FRAME_TYPE: + # TODO: Handle CAN frame data optimization, which is allowed with some frame types + # # ISO 15765-2 specifies an eight byte CAN frame for ISO-TP communication + # assert len(rx_data) == self.max_len, f"isotp - rx: invalid CAN frame length: {len(rx_data)}" + + if rx_data[0] >> 4 == ISOTP_FRAME_TYPE.SINGLE: + assert self.rx_dat == b"" or self.rx_done, "isotp - rx: single frame with active frame" + + # "if the first byte is 0x00, then it's a CAN-FD SF, and the second byte specifies the size of the data." + # - https://en.wikipedia.org/wiki/CAN_FD + if rx_data[0] & 0x0F == 0 and len(rx_data) > 8: + self.rx_len = rx_data[1] + offset = 2 + # TODO: update self.max_len for CAN FD + max_len = 62 if self._can_client.sub_addr is None else 61 + assert self.rx_len <= max_len, f"isotp - rx: invalid single frame length: {self.rx_len}" + else: + self.rx_len = rx_data[0] & 0x0F + offset = 1 + assert self.rx_len < self.max_len, f"isotp - rx: invalid single frame length: {self.rx_len}" + + self.rx_dat = rx_data[offset:offset + self.rx_len] + self.rx_idx = 0 + self.rx_done = True + carlog.debug(f"ISO-TP: RX - single frame - {hex(self._can_client.rx_addr)} idx={self.rx_idx} done={self.rx_done}") + return ISOTP_FRAME_TYPE.SINGLE + + elif rx_data[0] >> 4 == ISOTP_FRAME_TYPE.FIRST: + # TODO: support CAN FD first frames + # Once a first frame is received, further frames must be consecutive + assert self.rx_dat == b"" or self.rx_done, "isotp - rx: first frame with active frame" + self.rx_len = ((rx_data[0] & 0x0F) << 8) + rx_data[1] + assert self.rx_len >= self.max_len, f"isotp - rx: invalid first frame length: {self.rx_len}" + assert len(rx_data) == self.max_len, f"isotp - rx: invalid CAN frame length: {len(rx_data)}" + self.rx_dat = rx_data[2:] + self.rx_idx = 0 + self.rx_done = False + carlog.debug(f"ISO-TP: RX - first frame - {hex(self._can_client.rx_addr)} idx={self.rx_idx} done={self.rx_done}") + carlog.debug(f"ISO-TP: TX - flow control continue - {hex(self._can_client.tx_addr)}") + # send flow control message + self._can_client.send([self.flow_control_msg]) + return ISOTP_FRAME_TYPE.FIRST + + elif rx_data[0] >> 4 == ISOTP_FRAME_TYPE.CONSECUTIVE: + assert not self.rx_done, "isotp - rx: consecutive frame with no active frame" + self.rx_idx += 1 + assert self.rx_idx & 0xF == rx_data[0] & 0xF, "isotp - rx: invalid consecutive frame index" + rx_size = self.rx_len - len(self.rx_dat) + self.rx_dat += rx_data[1:1 + rx_size] + if self.rx_len == len(self.rx_dat): + self.rx_done = True + elif self.single_frame_mode: + # notify ECU to send next frame + self._can_client.send([self.flow_control_msg]) + carlog.debug(f"ISO-TP: RX - consecutive frame - {hex(self._can_client.rx_addr)} idx={self.rx_idx} done={self.rx_done}") + return ISOTP_FRAME_TYPE.CONSECUTIVE + + elif rx_data[0] >> 4 == ISOTP_FRAME_TYPE.FLOW: + assert not self.tx_done, "isotp - rx: flow control with no active frame" + assert rx_data[0] != 0x32, "isotp - rx: flow-control overflow/abort" + assert rx_data[0] == 0x30 or rx_data[0] == 0x31, "isotp - rx: flow-control transfer state indicator invalid" + if rx_data[0] == 0x30: + carlog.debug(f"ISO-TP: RX - flow control continue - {hex(self._can_client.tx_addr)}") + delay_ts = rx_data[2] & 0x7F + # scale is 1 milliseconds if first bit == 0, 100 micro seconds if first bit == 1 + delay_div = 1000. if rx_data[2] & 0x80 == 0 else 10000. + delay_sec = delay_ts / delay_div + + # first frame = 6 bytes, each consecutive frame = 7 bytes + num_bytes = self.max_len - 1 + start = self.max_len - 2 + self.tx_idx * num_bytes + count = rx_data[1] + end = start + count * num_bytes if count > 0 else self.tx_len + tx_msgs = [] + for i in range(start, end, num_bytes): + self.tx_idx += 1 + # consecutive tx messages + msg = (bytes([0x20 | (self.tx_idx & 0xF)]) + self.tx_dat[i:i + num_bytes]).ljust(self.max_len, b"\x00") + tx_msgs.append(msg) + # send consecutive tx messages + self._can_client.send(tx_msgs, delay=delay_sec) + if end >= self.tx_len: + self.tx_done = True + carlog.debug(f"ISO-TP: TX - consecutive frame - {hex(self._can_client.tx_addr)} idx={self.tx_idx} done={self.tx_done}") + elif rx_data[0] == 0x31: + # wait (do nothing until next flow control message) + carlog.debug(f"ISO-TP: TX - flow control wait - {hex(self._can_client.tx_addr)}") + return ISOTP_FRAME_TYPE.FLOW + + # 4-15 - reserved + else: + raise Exception(f"isotp - rx: invalid frame type: {rx_data[0] >> 4}") + + +FUNCTIONAL_ADDRS = [0x7DF, 0x18DB33F1] + + +def get_rx_addr_for_tx_addr(tx_addr, rx_offset=0x8): + if tx_addr in FUNCTIONAL_ADDRS: + return None + + if tx_addr < 0xFFF8: + # pseudo-standard 11 bit response addr (add 8) works for most manufacturers + # allow override; some manufacturers use other offsets for non-OBD2 access + return tx_addr + rx_offset + + if tx_addr > 0x10000000 and tx_addr < 0xFFFFFFFF: + # standard 29 bit response addr (flip last two bytes) + return (tx_addr & 0xFFFF0000) + (tx_addr << 8 & 0xFF00) + (tx_addr >> 8 & 0xFF) + + raise ValueError(f"invalid tx_addr: {tx_addr}") + + +class UdsClient: + def __init__(self, panda, tx_addr: int, rx_addr: int | None = None, bus: int = 0, sub_addr: int | None = None, rx_sub_addr: int | None = None, + timeout: float = 1, tx_timeout: float = 1, response_pending_timeout: float = 10): + self.bus = bus + self.tx_addr = tx_addr + self.rx_addr = rx_addr if rx_addr is not None else get_rx_addr_for_tx_addr(tx_addr) + self.sub_addr = sub_addr + self.timeout = timeout + can_send_with_timeout = partial(panda.can_send, timeout=int(tx_timeout*1000)) + self._can_client = CanClient(can_send_with_timeout, panda.can_recv, self.tx_addr, self.rx_addr, self.bus, self.sub_addr, rx_sub_addr) + self.response_pending_timeout = response_pending_timeout + + # generic uds request + def _uds_request(self, service_type: SERVICE_TYPE, subfunction: int | None = None, data: bytes | None = None) -> bytes: + req = bytes([service_type]) + if subfunction is not None: + req += bytes([subfunction]) + if data is not None: + req += data + + # send request, wait for response + isotp_msg = IsoTpMessage(self._can_client, timeout=self.timeout) + isotp_msg.send(req) + response_pending = False + while True: + timeout = self.response_pending_timeout if response_pending else self.timeout + resp, _ = isotp_msg.recv(timeout) + + if resp is None: + continue + + response_pending = False + resp_sid = resp[0] if len(resp) > 0 else None + + # negative response + if resp_sid == 0x7F: + service_id = resp[1] if len(resp) > 1 else -1 + try: + service_desc = SERVICE_TYPE(service_id).name + except BaseException: + service_desc = 'NON_STANDARD_SERVICE' + error_code = resp[2] if len(resp) > 2 else -1 + try: + error_desc = _negative_response_codes[error_code] + except BaseException: + error_desc = resp[3:].hex() + # wait for another message if response pending + if error_code == 0x78: + response_pending = True + carlog.debug("UDS-RX: response pending") + continue + raise NegativeResponseError(f'{service_desc} - {error_desc}', service_id, error_code) + + # positive response + if service_type + 0x40 != resp_sid: + resp_sid_hex = hex(resp_sid) if resp_sid is not None else None + raise InvalidServiceIdError(f'invalid response service id: {resp_sid_hex}') + + if subfunction is not None: + resp_sfn = resp[1] if len(resp) > 1 else None + if subfunction != resp_sfn: + resp_sfn_hex = hex(resp_sfn) if resp_sfn is not None else None + raise InvalidSubFunctionError(f'invalid response subfunction: {resp_sfn_hex}') + + # return data (exclude service id and sub-function id) + return resp[(1 if subfunction is None else 2):] + + # services + def diagnostic_session_control(self, session_type: SESSION_TYPE): + self._uds_request(SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, subfunction=session_type) + + def ecu_reset(self, reset_type: RESET_TYPE): + resp = self._uds_request(SERVICE_TYPE.ECU_RESET, subfunction=reset_type) + power_down_time = None + if reset_type == RESET_TYPE.ENABLE_RAPID_POWER_SHUTDOWN: + power_down_time = resp[0] + return power_down_time + + def security_access(self, access_type: ACCESS_TYPE, security_key: bytes = b'', data_record: bytes = b''): + request_seed = access_type % 2 != 0 + if request_seed and len(security_key) != 0: + raise ValueError('security_key not allowed') + if not request_seed and len(security_key) == 0: + raise ValueError('security_key is missing') + if not request_seed and len(data_record) != 0: + raise ValueError('data_record not allowed') + data = security_key + data_record + resp = self._uds_request(SERVICE_TYPE.SECURITY_ACCESS, subfunction=access_type, data=data) + if request_seed: + security_seed = resp + return security_seed + + def communication_control(self, control_type: CONTROL_TYPE, message_type: MESSAGE_TYPE): + data = bytes([message_type]) + self._uds_request(SERVICE_TYPE.COMMUNICATION_CONTROL, subfunction=control_type, data=data) + + def tester_present(self, ): + self._uds_request(SERVICE_TYPE.TESTER_PRESENT, subfunction=0x00) + + def access_timing_parameter(self, timing_parameter_type: TIMING_PARAMETER_TYPE, parameter_values: bytes | None = None): + write_custom_values = timing_parameter_type == TIMING_PARAMETER_TYPE.SET_TO_GIVEN_VALUES + read_values = (timing_parameter_type == TIMING_PARAMETER_TYPE.READ_CURRENTLY_ACTIVE or + timing_parameter_type == TIMING_PARAMETER_TYPE.READ_EXTENDED_SET) + if not write_custom_values and parameter_values is not None: + raise ValueError('parameter_values not allowed') + if write_custom_values and parameter_values is None: + raise ValueError('parameter_values is missing') + resp = self._uds_request(SERVICE_TYPE.ACCESS_TIMING_PARAMETER, subfunction=timing_parameter_type, data=parameter_values) + if read_values: + # TODO: parse response into values? + parameter_values = resp + return parameter_values + + def secured_data_transmission(self, data: bytes): + # TODO: split data into multiple input parameters? + resp = self._uds_request(SERVICE_TYPE.SECURED_DATA_TRANSMISSION, subfunction=None, data=data) + # TODO: parse response into multiple output values? + return resp + + def control_dtc_setting(self, dtc_setting_type: DTC_SETTING_TYPE): + self._uds_request(SERVICE_TYPE.CONTROL_DTC_SETTING, subfunction=dtc_setting_type) + + def response_on_event(self, response_event_type: RESPONSE_EVENT_TYPE, store_event: bool, window_time: int, + event_type_record: int, service_response_record: int): + if store_event: + response_event_type |= 0x20 # type: ignore + # TODO: split record parameters into arrays + data = bytes([window_time, event_type_record, service_response_record]) + resp = self._uds_request(SERVICE_TYPE.RESPONSE_ON_EVENT, subfunction=response_event_type, data=data) + + if response_event_type == RESPONSE_EVENT_TYPE.REPORT_ACTIVATED_EVENTS: + return { + "num_of_activated_events": resp[0], + "data": resp[1:], # TODO: parse the reset of response + } + + return { + "num_of_identified_events": resp[0], + "event_window_time": resp[1], + "data": resp[2:], # TODO: parse the reset of response + } + + def link_control(self, link_control_type: LINK_CONTROL_TYPE, baud_rate_type: BAUD_RATE_TYPE | None = None): + data: bytes | None + + if link_control_type == LINK_CONTROL_TYPE.VERIFY_BAUDRATE_TRANSITION_WITH_FIXED_BAUDRATE: + # baud_rate_type = BAUD_RATE_TYPE + data = bytes([cast(int, baud_rate_type)]) + elif link_control_type == LINK_CONTROL_TYPE.VERIFY_BAUDRATE_TRANSITION_WITH_SPECIFIC_BAUDRATE: + # baud_rate_type = custom value (3 bytes big-endian) + data = struct.pack('!I', baud_rate_type)[1:] + else: + data = None + self._uds_request(SERVICE_TYPE.LINK_CONTROL, subfunction=link_control_type, data=data) + + def read_data_by_identifier(self, data_identifier_type: DATA_IDENTIFIER_TYPE): + # TODO: support list of identifiers + data = struct.pack('!H', data_identifier_type) + resp = self._uds_request(SERVICE_TYPE.READ_DATA_BY_IDENTIFIER, subfunction=None, data=data) + resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None + if resp_id != data_identifier_type: + raise ValueError(f'invalid response data identifier: {hex(resp_id)} expected: {hex(data_identifier_type)}') + return resp[2:] + + def read_memory_by_address(self, memory_address: int, memory_size: int, memory_address_bytes: int = 4, memory_size_bytes: int = 1): + if memory_address_bytes < 1 or memory_address_bytes > 4: + raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}') + if memory_size_bytes < 1 or memory_size_bytes > 4: + raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}') + data = bytes([memory_size_bytes << 4 | memory_address_bytes]) + + if memory_address >= 1 << (memory_address_bytes * 8): + raise ValueError(f'invalid memory_address: {memory_address}') + data += struct.pack('!I', memory_address)[4 - memory_address_bytes:] + if memory_size >= 1 << (memory_size_bytes * 8): + raise ValueError(f'invalid memory_size: {memory_size}') + data += struct.pack('!I', memory_size)[4 - memory_size_bytes:] + + resp = self._uds_request(SERVICE_TYPE.READ_MEMORY_BY_ADDRESS, subfunction=None, data=data) + return resp + + def read_scaling_data_by_identifier(self, data_identifier_type: DATA_IDENTIFIER_TYPE): + data = struct.pack('!H', data_identifier_type) + resp = self._uds_request(SERVICE_TYPE.READ_SCALING_DATA_BY_IDENTIFIER, subfunction=None, data=data) + resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None + if resp_id != data_identifier_type: + raise ValueError(f'invalid response data identifier: {hex(resp_id)}') + return resp[2:] # TODO: parse the response + + def read_data_by_periodic_identifier(self, transmission_mode_type: TRANSMISSION_MODE_TYPE, periodic_data_identifier: int): + # TODO: support list of identifiers + data = bytes([transmission_mode_type, periodic_data_identifier]) + self._uds_request(SERVICE_TYPE.READ_DATA_BY_PERIODIC_IDENTIFIER, subfunction=None, data=data) + + def dynamically_define_data_identifier(self, dynamic_definition_type: DYNAMIC_DEFINITION_TYPE, dynamic_data_identifier: int, + source_definitions: list[DynamicSourceDefinition], memory_address_bytes: int = 4, memory_size_bytes: int = 1): + if memory_address_bytes < 1 or memory_address_bytes > 4: + raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}') + if memory_size_bytes < 1 or memory_size_bytes > 4: + raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}') + + data = struct.pack('!H', dynamic_data_identifier) + if dynamic_definition_type == DYNAMIC_DEFINITION_TYPE.DEFINE_BY_IDENTIFIER: + for s in source_definitions: + data += struct.pack('!H', s.data_identifier) + bytes([s.position, s.memory_size]) + elif dynamic_definition_type == DYNAMIC_DEFINITION_TYPE.DEFINE_BY_MEMORY_ADDRESS: + data += bytes([memory_size_bytes << 4 | memory_address_bytes]) + for s in source_definitions: + if s.memory_address >= 1 << (memory_address_bytes * 8): + raise ValueError(f'invalid memory_address: {s.memory_address}') + data += struct.pack('!I', s.memory_address)[4 - memory_address_bytes:] + if s.memory_size >= 1 << (memory_size_bytes * 8): + raise ValueError(f'invalid memory_size: {s.memory_size}') + data += struct.pack('!I', s.memory_size)[4 - memory_size_bytes:] + elif dynamic_definition_type == DYNAMIC_DEFINITION_TYPE.CLEAR_DYNAMICALLY_DEFINED_DATA_IDENTIFIER: + pass + else: + raise ValueError(f'invalid dynamic identifier type: {hex(dynamic_definition_type)}') + self._uds_request(SERVICE_TYPE.DYNAMICALLY_DEFINE_DATA_IDENTIFIER, subfunction=dynamic_definition_type, data=data) + + def write_data_by_identifier(self, data_identifier_type: DATA_IDENTIFIER_TYPE, data_record: bytes): + data = struct.pack('!H', data_identifier_type) + data_record + resp = self._uds_request(SERVICE_TYPE.WRITE_DATA_BY_IDENTIFIER, subfunction=None, data=data) + resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None + if resp_id != data_identifier_type: + raise ValueError(f'invalid response data identifier: {hex(resp_id)}') + + def write_memory_by_address(self, memory_address: int, memory_size: int, data_record: bytes, memory_address_bytes: int = 4, memory_size_bytes: int = 1): + if memory_address_bytes < 1 or memory_address_bytes > 4: + raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}') + if memory_size_bytes < 1 or memory_size_bytes > 4: + raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}') + data = bytes([memory_size_bytes << 4 | memory_address_bytes]) + + if memory_address >= 1 << (memory_address_bytes * 8): + raise ValueError(f'invalid memory_address: {memory_address}') + data += struct.pack('!I', memory_address)[4 - memory_address_bytes:] + if memory_size >= 1 << (memory_size_bytes * 8): + raise ValueError(f'invalid memory_size: {memory_size}') + data += struct.pack('!I', memory_size)[4 - memory_size_bytes:] + + data += data_record + self._uds_request(SERVICE_TYPE.WRITE_MEMORY_BY_ADDRESS, subfunction=None, data=data) + + def clear_diagnostic_information(self, dtc_group_type: DTC_GROUP_TYPE): + data = struct.pack('!I', dtc_group_type)[1:] # 3 bytes + self._uds_request(SERVICE_TYPE.CLEAR_DIAGNOSTIC_INFORMATION, subfunction=None, data=data) + + def read_dtc_information(self, dtc_report_type: DTC_REPORT_TYPE, dtc_status_mask_type: DTC_STATUS_MASK_TYPE = DTC_STATUS_MASK_TYPE.ALL, + dtc_severity_mask_type: DTC_SEVERITY_MASK_TYPE = DTC_SEVERITY_MASK_TYPE.ALL, dtc_mask_record: int = 0xFFFFFF, + dtc_snapshot_record_num: int = 0xFF, dtc_extended_record_num: int = 0xFF): + data = b'' + # dtc_status_mask_type + if dtc_report_type == DTC_REPORT_TYPE.NUMBER_OF_DTC_BY_STATUS_MASK or \ + dtc_report_type == DTC_REPORT_TYPE.DTC_BY_STATUS_MASK or \ + dtc_report_type == DTC_REPORT_TYPE.MIRROR_MEMORY_DTC_BY_STATUS_MASK or \ + dtc_report_type == DTC_REPORT_TYPE.NUMBER_OF_MIRROR_MEMORY_DTC_BY_STATUS_MASK or \ + dtc_report_type == DTC_REPORT_TYPE.NUMBER_OF_EMISSIONS_RELATED_OBD_DTC_BY_STATUS_MASK or \ + dtc_report_type == DTC_REPORT_TYPE.EMISSIONS_RELATED_OBD_DTC_BY_STATUS_MASK: + data += bytes([dtc_status_mask_type]) + # dtc_mask_record + if dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_IDENTIFICATION or \ + dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER or \ + dtc_report_type == DTC_REPORT_TYPE.DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER or \ + dtc_report_type == DTC_REPORT_TYPE.MIRROR_MEMORY_DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER or \ + dtc_report_type == DTC_REPORT_TYPE.SEVERITY_INFORMATION_OF_DTC: + data += struct.pack('!I', dtc_mask_record)[1:] # 3 bytes + # dtc_snapshot_record_num + if dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_IDENTIFICATION or \ + dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER or \ + dtc_report_type == DTC_REPORT_TYPE.DTC_SNAPSHOT_RECORD_BY_RECORD_NUMBER: + data += bytes([dtc_snapshot_record_num]) + # dtc_extended_record_num + if dtc_report_type == DTC_REPORT_TYPE.DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER or \ + dtc_report_type == DTC_REPORT_TYPE.MIRROR_MEMORY_DTC_EXTENDED_DATA_RECORD_BY_DTC_NUMBER: + data += bytes([dtc_extended_record_num]) + # dtc_severity_mask_type + if dtc_report_type == DTC_REPORT_TYPE.NUMBER_OF_DTC_BY_SEVERITY_MASK_RECORD or \ + dtc_report_type == DTC_REPORT_TYPE.DTC_BY_SEVERITY_MASK_RECORD: + data += bytes([dtc_severity_mask_type, dtc_status_mask_type]) + + resp = self._uds_request(SERVICE_TYPE.READ_DTC_INFORMATION, subfunction=dtc_report_type, data=data) + + # TODO: parse response + return resp + + def input_output_control_by_identifier(self, data_identifier_type: DATA_IDENTIFIER_TYPE, control_parameter_type: CONTROL_PARAMETER_TYPE, + control_option_record: bytes = b'', control_enable_mask_record: bytes = b''): + data = struct.pack('!H', data_identifier_type) + bytes([control_parameter_type]) + control_option_record + control_enable_mask_record + resp = self._uds_request(SERVICE_TYPE.INPUT_OUTPUT_CONTROL_BY_IDENTIFIER, subfunction=None, data=data) + resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None + if resp_id != data_identifier_type: + raise ValueError(f'invalid response data identifier: {hex(resp_id)}') + return resp[2:] + + def routine_control(self, routine_control_type: ROUTINE_CONTROL_TYPE, routine_identifier_type: ROUTINE_IDENTIFIER_TYPE, routine_option_record: bytes = b''): + data = struct.pack('!H', routine_identifier_type) + routine_option_record + resp = self._uds_request(SERVICE_TYPE.ROUTINE_CONTROL, subfunction=routine_control_type, data=data) + resp_id = struct.unpack('!H', resp[0:2])[0] if len(resp) >= 2 else None + if resp_id != routine_identifier_type: + raise ValueError(f'invalid response routine identifier: {hex(resp_id)}') + return resp[2:] + + def request_download(self, memory_address: int, memory_size: int, memory_address_bytes: int = 4, memory_size_bytes: int = 4, data_format: int = 0x00): + data = bytes([data_format]) + + if memory_address_bytes < 1 or memory_address_bytes > 4: + raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}') + if memory_size_bytes < 1 or memory_size_bytes > 4: + raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}') + data += bytes([memory_size_bytes << 4 | memory_address_bytes]) + + if memory_address >= 1 << (memory_address_bytes * 8): + raise ValueError(f'invalid memory_address: {memory_address}') + data += struct.pack('!I', memory_address)[4 - memory_address_bytes:] + if memory_size >= 1 << (memory_size_bytes * 8): + raise ValueError(f'invalid memory_size: {memory_size}') + data += struct.pack('!I', memory_size)[4 - memory_size_bytes:] + + resp = self._uds_request(SERVICE_TYPE.REQUEST_DOWNLOAD, subfunction=None, data=data) + max_num_bytes_len = resp[0] >> 4 if len(resp) > 0 else 0 + if max_num_bytes_len >= 1 and max_num_bytes_len <= 4: + max_num_bytes = struct.unpack('!I', (b"\x00" * (4 - max_num_bytes_len)) + resp[1:max_num_bytes_len + 1])[0] + else: + raise ValueError(f'invalid max_num_bytes_len: {max_num_bytes_len}') + + return max_num_bytes # max number of bytes per transfer data request + + def request_upload(self, memory_address: int, memory_size: int, memory_address_bytes: int = 4, memory_size_bytes: int = 4, data_format: int = 0x00): + data = bytes([data_format]) + + if memory_address_bytes < 1 or memory_address_bytes > 4: + raise ValueError(f'invalid memory_address_bytes: {memory_address_bytes}') + if memory_size_bytes < 1 or memory_size_bytes > 4: + raise ValueError(f'invalid memory_size_bytes: {memory_size_bytes}') + data += bytes([memory_size_bytes << 4 | memory_address_bytes]) + + if memory_address >= 1 << (memory_address_bytes * 8): + raise ValueError(f'invalid memory_address: {memory_address}') + data += struct.pack('!I', memory_address)[4 - memory_address_bytes:] + if memory_size >= 1 << (memory_size_bytes * 8): + raise ValueError(f'invalid memory_size: {memory_size}') + data += struct.pack('!I', memory_size)[4 - memory_size_bytes:] + + resp = self._uds_request(SERVICE_TYPE.REQUEST_UPLOAD, subfunction=None, data=data) + max_num_bytes_len = resp[0] >> 4 if len(resp) > 0 else 0 + if max_num_bytes_len >= 1 and max_num_bytes_len <= 4: + max_num_bytes = struct.unpack('!I', (b"\x00" * (4 - max_num_bytes_len)) + resp[1:max_num_bytes_len + 1])[0] + else: + raise ValueError(f'invalid max_num_bytes_len: {max_num_bytes_len}') + + return max_num_bytes # max number of bytes per transfer data request + + def transfer_data(self, block_sequence_count: int, data: bytes = b''): + data = bytes([block_sequence_count]) + data + resp = self._uds_request(SERVICE_TYPE.TRANSFER_DATA, subfunction=None, data=data) + resp_id = resp[0] if len(resp) > 0 else None + if resp_id != block_sequence_count: + raise ValueError(f'invalid block_sequence_count: {resp_id}') + return resp[1:] + + def request_transfer_exit(self): + self._uds_request(SERVICE_TYPE.REQUEST_TRANSFER_EXIT, subfunction=None) diff --git a/artifacts/package_runtime/iqdbc/car/values.py b/artifacts/package_runtime/iqdbc/car/values.py new file mode 100644 index 000000000..82c88359d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/values.py @@ -0,0 +1,21 @@ +from typing import get_args +from iqdbc.car.body.values import CAR as BODY +from iqdbc.car.chrysler.values import CAR as CHRYSLER +from iqdbc.car.ford.values import CAR as FORD +from iqdbc.car.gm.values import CAR as GM +from iqdbc.car.honda.values import CAR as HONDA +from iqdbc.car.hyundai.values import CAR as HYUNDAI +from iqdbc.car.mazda.values import CAR as MAZDA +from iqdbc.car.mock.values import CAR as MOCK +from iqdbc.car.nissan.values import CAR as NISSAN +from iqdbc.car.psa.values import CAR as PSA +from iqdbc.car.rivian.values import CAR as RIVIAN +from iqdbc.car.subaru.values import CAR as SUBARU +from iqdbc.car.tesla.values import CAR as TESLA +from iqdbc.car.toyota.values import CAR as TOYOTA +from iqdbc.car.volkswagen.values import CAR as VOLKSWAGEN + +Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | MOCK | NISSAN | PSA | RIVIAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN +BRANDS = get_args(Platform) + +PLATFORMS: dict[str, Platform] = {str(platform): platform for brand in BRANDS for platform in brand} diff --git a/artifacts/package_runtime/iqdbc/car/vehicle_model.py b/artifacts/package_runtime/iqdbc/car/vehicle_model.py new file mode 100644 index 000000000..57ff7ad83 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/vehicle_model.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +""" +Dynamic bicycle model from "The Science of Vehicle Dynamics (2014), M. Guiggiani" + +The state is x = [v, r]^T +with v lateral speed [m/s], and r rotational speed [rad/s] + +The input u is the steering angle [rad], and roll [rad] + +The system is defined by +x_dot = A*x + B*u + +A depends on longitudinal speed, u [m/s], and vehicle parameters CP +""" + +import numpy as np +from numpy.linalg import solve + +from iqdbc.car.structs import CarParams +from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY + + +class VehicleModel: + def __init__(self, CP: CarParams): + """ + Args: + CP: Car Parameters + """ + # for math readability, convert long names car params into short names + self.m: float = CP.mass + self.j: float = CP.rotationalInertia + self.l: float = CP.wheelbase + self.aF: float = CP.centerToFront + self.aR: float = CP.wheelbase - CP.centerToFront + self.chi: float = CP.steerRatioRear + + self.cF_orig: float = CP.tireStiffnessFront + self.cR_orig: float = CP.tireStiffnessRear + self.update_params(1.0, CP.steerRatio) + + def update_params(self, stiffness_factor: float, steer_ratio: float) -> None: + """Update the vehicle model with a new stiffness factor and steer ratio""" + self.cF: float = stiffness_factor * self.cF_orig + self.cR: float = stiffness_factor * self.cR_orig + self.sR: float = steer_ratio + + def steady_state_sol(self, sa: float, u: float, roll: float) -> np.ndarray: + """Returns the steady state solution. + + If the speed is too low we can't use the dynamic model (tire slip is undefined), + we then have to use the kinematic model + + Args: + sa: Steering wheel angle [rad] + u: Speed [m/s] + roll: Road Roll [rad] + + Returns: + 2x1 matrix with steady state solution (lateral speed, rotational speed) + """ + if u > 0.1: + return dyn_ss_sol(sa, u, roll, self) + else: + return kin_ss_sol(sa, u, self) + + def calc_curvature(self, sa: float, u: float, roll: float) -> float: + """Returns the curvature. Multiplied by the speed this will give the yaw rate. + + Args: + sa: Steering wheel angle [rad] + u: Speed [m/s] + roll: Road Roll [rad] + + Returns: + Curvature factor [1/m] + """ + return (self.curvature_factor(u) * sa / self.sR) + self.roll_compensation(roll, u) + + def curvature_factor(self, u: float) -> float: + """Returns the curvature factor. + Multiplied by wheel angle (not steering wheel angle) this will give the curvature. + + Args: + u: Speed [m/s] + + Returns: + Curvature factor [1/m] + """ + sf = calc_slip_factor(self) + return (1. - self.chi) / (1. - sf * u**2) / self.l + + def get_steer_from_curvature(self, curv: float, u: float, roll: float) -> float: + """Calculates the required steering wheel angle for a given curvature + + Args: + curv: Desired curvature [1/m] + u: Speed [m/s] + roll: Road Roll [rad] + + Returns: + Steering wheel angle [rad] + """ + + return (curv - self.roll_compensation(roll, u)) * self.sR * 1.0 / self.curvature_factor(u) + + def roll_compensation(self, roll: float, u: float) -> float: + """Calculates the roll-compensation to curvature + + Args: + roll: Road Roll [rad] + u: Speed [m/s] + + Returns: + Roll compensation curvature [rad] + """ + sf = calc_slip_factor(self) + + if abs(sf) < 1e-6: + return 0 + else: + return (ACCELERATION_DUE_TO_GRAVITY * roll) / ((1 / sf) - u**2) + + def get_steer_from_yaw_rate(self, yaw_rate: float, u: float, roll: float) -> float: + """Calculates the required steering wheel angle for a given yaw_rate + + Args: + yaw_rate: Desired yaw rate [rad/s] + u: Speed [m/s] + roll: Road Roll [rad] + + Returns: + Steering wheel angle [rad] + """ + curv = yaw_rate / u + return self.get_steer_from_curvature(curv, u, roll) + + def yaw_rate(self, sa: float, u: float, roll: float) -> float: + """Calculate yaw rate + + Args: + sa: Steering wheel angle [rad] + u: Speed [m/s] + roll: Road Roll [rad] + + Returns: + Yaw rate [rad/s] + """ + return self.calc_curvature(sa, u, roll) * u + + +def kin_ss_sol(sa: float, u: float, VM: VehicleModel) -> np.ndarray: + """Calculate the steady state solution at low speeds + At low speeds the tire slip is undefined, so a kinematic + model is used. + + Args: + sa: Steering angle [rad] + u: Speed [m/s] + VM: Vehicle model + + Returns: + 2x1 matrix with steady state solution + """ + K = np.zeros((2, 1)) + K[0, 0] = VM.aR / VM.sR / VM.l * u + K[1, 0] = 1. / VM.sR / VM.l * u + return K * sa + + +def create_dyn_state_matrices(u: float, VM: VehicleModel) -> tuple[np.ndarray, np.ndarray]: + """Returns the A and B matrix for the dynamics system + + Args: + u: Vehicle speed [m/s] + VM: Vehicle model + + Returns: + A tuple with the 2x2 A matrix, and 2x2 B matrix + + Parameters in the vehicle model: + cF: Tire stiffness Front [N/rad] + cR: Tire stiffness Rear [N/rad] + aF: Distance from CG to front wheels [m] + aR: Distance from CG to rear wheels [m] + m: Mass [kg] + j: Rotational inertia [kg m^2] + sR: Steering ratio [-] + chi: Steer ratio rear [-] + """ + A = np.zeros((2, 2)) + B = np.zeros((2, 2)) + A[0, 0] = - (VM.cF + VM.cR) / (VM.m * u) + A[0, 1] = - (VM.cF * VM.aF - VM.cR * VM.aR) / (VM.m * u) - u + A[1, 0] = - (VM.cF * VM.aF - VM.cR * VM.aR) / (VM.j * u) + A[1, 1] = - (VM.cF * VM.aF**2 + VM.cR * VM.aR**2) / (VM.j * u) + + # Steering input + B[0, 0] = (VM.cF + VM.chi * VM.cR) / VM.m / VM.sR + B[1, 0] = (VM.cF * VM.aF - VM.chi * VM.cR * VM.aR) / VM.j / VM.sR + + # Roll input + B[0, 1] = -ACCELERATION_DUE_TO_GRAVITY + + return A, B + + +def dyn_ss_sol(sa: float, u: float, roll: float, VM: VehicleModel) -> np.ndarray: + """Calculate the steady state solution when x_dot = 0, + Ax + Bu = 0 => x = -A^{-1} B u + + Args: + sa: Steering angle [rad] + u: Speed [m/s] + roll: Road Roll [rad] + VM: Vehicle model + + Returns: + 2x1 matrix with steady state solution + """ + A, B = create_dyn_state_matrices(u, VM) + inp = np.array([[sa], [roll]]) + return -solve(A, B) @ inp + + +def calc_slip_factor(VM: VehicleModel) -> float: + """The slip factor is a measure of how the curvature changes with speed + it's positive for Oversteering vehicle, negative (usual case) otherwise. + """ + return VM.m * (VM.cF * VM.aF - VM.cR * VM.aR) / (VM.l**2 * VM.cF * VM.cR) diff --git a/artifacts/package_runtime/iqdbc/car/vin.py b/artifacts/package_runtime/iqdbc/car/vin.py new file mode 100644 index 000000000..bb63147e8 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/vin.py @@ -0,0 +1,75 @@ +import re +from dataclasses import dataclass, field + +from iqdbc.car import uds +from iqdbc.car.carlog import carlog +from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery +from iqdbc.car.fw_query_definitions import STANDARD_VIN_ADDRS, StdQueries + +VIN_UNKNOWN = "0" * 17 +VIN_RE = "[A-HJ-NPR-Z0-9]{17}" + + +@dataclass +class Vin: + vin: str + wmi: str = field(init=False) + vds: str = field(init=False) + vis: str = field(init=False) + + def __post_init__(self): + # parses VIN in accordance with North America standard >2000 vehicles: + # https://en.wikipedia.org/wiki/Vehicle_identification_number#Components + self.wmi = self.vin[:3] # World Manufacturer Identifier + self.vds = self.vin[3:9] # Vehicle Descriptor Section + self.vis = self.vin[9:17] # Vehicle Identifier Section + + +def is_valid_vin(vin: str): + return re.fullmatch(VIN_RE, vin) is not None + + +def get_vin(can_recv, can_send, buses, timeout=0.1, retry=2): + for i in range(retry): + for bus in buses: + for request, response, valid_buses, vin_addrs, functional_addrs, rx_offset in ( + (StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0, 1), STANDARD_VIN_ADDRS, uds.FUNCTIONAL_ADDRS, 0x8), + (StdQueries.OBD_VIN_REQUEST, StdQueries.OBD_VIN_RESPONSE, (0, 1), STANDARD_VIN_ADDRS, uds.FUNCTIONAL_ADDRS, 0x8), + (StdQueries.GM_VIN_REQUEST, StdQueries.GM_VIN_RESPONSE, (0,), [0x24b], None, 0x400), # Bolt fwdCamera + (StdQueries.KWP_VIN_REQUEST, StdQueries.KWP_VIN_RESPONSE, (0,), [0x797], None, 0x3), # Nissan Leaf VCM + (StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0,), [0x74f], None, 0x6a), # Volkswagen fwdCamera + (StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0,), [0x733], None, 0x40), # Rivian EPAS + ): + if bus not in valid_buses: + continue + + # When querying functional addresses, ideally we respond to everything that sends a first frame to avoid leaving the + # ECU in a temporary bad state. Note that we may not cover all ECUs and response offsets. TODO: query physical addrs + tx_addrs = vin_addrs + if functional_addrs is not None: + tx_addrs = [a for a in range(0x700, 0x800) if a != 0x7DF] + list(range(0x18DA00F1, 0x18DB00F1, 0x100)) + + try: + query = IsoTpParallelQuery(can_send, can_recv, bus, tx_addrs, [request, ], [response, ], response_offset=rx_offset, + functional_addrs=functional_addrs) + results = query.get_data(timeout) + + for addr in vin_addrs: + vin = results.get((addr, None)) + if vin is not None: + # Ford and Nissan pads with null bytes + if len(vin) in (19, 24): + vin = re.sub(b'\x00*$', b'', vin) + + # Honda Bosch response starts with a length, trim to correct length + if vin.startswith(b'\x11'): + vin = vin[1:18] + + carlog.error(f"got vin with {request=}") + return uds.get_rx_addr_for_tx_addr(addr, rx_offset=rx_offset), bus, vin.decode() + except Exception: + carlog.exception("VIN query exception") + + carlog.error(f"vin query retry ({i+1}) ...") + + return -1, -1, VIN_UNKNOWN diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/__init__.py b/artifacts/package_runtime/iqdbc/car/volkswagen/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/carcontroller.py b/artifacts/package_runtime/iqdbc/car/volkswagen/carcontroller.py new file mode 100644 index 000000000..dbdd6bd36 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/carcontroller.py @@ -0,0 +1,712 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import sys +import os +import math +import numpy as np +import random +from iqdbc.can import CANPacker +from iqdbc.car import Bus, DT_CTRL, make_tester_present_msg, structs +from iqdbc.car.lateral import apply_driver_steer_torque_limits, apply_steer_angle_limits_simple +from iqdbc.car.lateral import apply_std_curvature_limits +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.common.numpy_fast import clip, interp +from iqdbc.car.interfaces import CarControllerBase +from iqdbc.car.volkswagen import mlbcan, mqbcan, pqcan, mebcan +from iqdbc.car.volkswagen.pq_radar_handler import PQRadarHandler +from iqdbc.car.volkswagen.values import ( + CanBus, CarControllerParams, MQB_A0_CARS, VolkswagenFlags, VolkswagenFlagsIQ, apply_pq_stopping_accel, +) +from iqdbc.car.volkswagen.mebutils import LongControlJerk, LongControlLimit, LatControlCurvature +from iqdbc.car.vehicle_model import VehicleModel + +iqpilot_path = os.path.join(os.path.dirname(__file__), '..', '..', '..') +sys.path.insert(0, iqpilot_path) +try: + from iqpilot.common.params import Params +except ImportError: + pass + +VisualAlert = structs.CarControl.HUDControl.VisualAlert +AudibleAlert = structs.CarControl.HUDControl.AudibleAlert +LongCtrlState = structs.CarControl.Actuators.LongControlState + + +def dVisual(CCS, CS): + if CCS == mqbcan: + decelV = CS.tsk_verzoeg_anf + elif CCS == pqcan: + decelV = CS.br8_acc_anf + else: + decelV = False + return decelV + +class MQBStandstillManager: + BRAKE_TORQUE_RAMP_RATE = 2000.0 # Nm/s + ASSUMED_WHEEL_RADIUS = 0.328 # m, typical tire rolling radius + GRAVITY = 9.81 # m/s^2 + WEGIMPULSE_STILLNESS_FRAMES = 5 # frames of no wheel tick change before assuming standstill + ESP_OVERRIDE_SPEED = 9.5 * CV.KPH_TO_MS + MAX_SAFE_STOPPING_SPEED = 10.0 * CV.KPH_TO_MS + + def __init__(self, vehicle_mass: float = 1540.0, accel_min: float = -3.5): + self.vehicle_mass = vehicle_mass + self.accel_min = accel_min + self.can_stop_forever = False + self.rollback_detected = False + self.start_commit_active = False + self.frames_since_last_wheel_pulse = 0 + self.prev_sum_wegimpulse: int | None = None + self.prev_accel = 0 + self.hold_recovery_active = False + + def get_hill_hold_decel_deficit(self, pitch: float, brake_torque: float) -> float: + if self.vehicle_mass <= 0: + return 0.0 + uphill_pitch = max(pitch, 0.0) + hill_hold_decel = self.GRAVITY * math.sin(uphill_pitch) + brake_decel = max(brake_torque, 0.0) / (self.vehicle_mass * self.ASSUMED_WHEEL_RADIUS) + return max(hill_hold_decel - brake_decel, 0.0) + + def get_safe_speed_for_brake_torque(self, pitch: float, brake_torque: float) -> float: + missing_brake_decel = self.get_hill_hold_decel_deficit(pitch, brake_torque) + if missing_brake_decel <= 0 or self.vehicle_mass <= 0: + return 0.0 + brake_decel_build_rate = self.BRAKE_TORQUE_RAMP_RATE / (self.vehicle_mass * self.ASSUMED_WHEEL_RADIUS) + forward_speed_needed_while_brake_builds = 1.5 * missing_brake_decel ** 2 / brake_decel_build_rate + return min(forward_speed_needed_while_brake_builds, self.MAX_SAFE_STOPPING_SPEED) + + def get_blended_brake_accel(self, raw_accel: float, v_ego: float, pitch: float, brake_torque: float) -> float: + zero_brake_decel_deficit = self.get_hill_hold_decel_deficit(pitch, 0.0) + current_brake_decel_deficit = self.get_hill_hold_decel_deficit(pitch, brake_torque) + zero_brake_safe_speed = self.get_safe_speed_for_brake_torque(pitch, 0.0) + if zero_brake_decel_deficit <= 0 or zero_brake_safe_speed <= 0: + return raw_accel + brake_deficit_risk = current_brake_decel_deficit / zero_brake_decel_deficit + speed_risk = max(zero_brake_safe_speed - v_ego, 0.0) / zero_brake_safe_speed + rollback_risk = float(np.clip(speed_risk * brake_deficit_risk, 0.0, 1.0)) + blended_accel = raw_accel + rollback_risk * (self.accel_min - raw_accel) + return min(raw_accel, blended_accel) + + def update(self, CS, long_active: bool, accel: float, stopping: bool, starting: bool, + max_planned_speed: float, pitch: float = 0.0, + tsk_brake_torque: float = 0.0) -> tuple[bool, float, bool, bool, bool | None, bool | None]: + + safe_stopping_speed = self.get_safe_speed_for_brake_torque(pitch, 0.0) + below_safe_stop_speed = CS.out.vEgo < safe_stopping_speed + can_accelerate = max_planned_speed > safe_stopping_speed + uphill_grade_pct = max(math.tan(pitch) * 100.0, 0.0) + takeoff_acceleration = max(0.2, 0.1 * uphill_grade_pct) + + if CS.out.vEgo < self.ESP_OVERRIDE_SPEED: + esp_starting_override: bool | None = True + esp_stopping_override: bool | None = False + else: + esp_starting_override = None + esp_stopping_override = None + + if CS.rolling_backward: + self.rollback_detected = True + elif CS.rolling_forward: + self.rollback_detected = False + + wheel_did_pulse = CS.sum_wegimpulse != self.prev_sum_wegimpulse + self.prev_sum_wegimpulse = CS.sum_wegimpulse + if wheel_did_pulse: + self.frames_since_last_wheel_pulse = 0 + else: + self.frames_since_last_wheel_pulse += 1 + near_standstill = self.frames_since_last_wheel_pulse >= self.WEGIMPULSE_STILLNESS_FRAMES + + # acc type 1 is sensitive to control signals when brake is pressed (when preEnabled) + if CS.out.brakePressed: + long_active = False + + if long_active and not CS.out.gasPressed: + if CS.esp_hold_confirmation: + self.start_commit_active = True + if can_accelerate and below_safe_stop_speed and accel > 0: + self.start_commit_active = True + elif self.start_commit_active: + if CS.out.vEgo > safe_stopping_speed: + self.start_commit_active = False + else: + self.start_commit_active = False + + if long_active: + raw_accel = accel + if self.start_commit_active: + accel = max(accel, takeoff_acceleration) + stopping = False + starting = True + elif self.rollback_detected: + accel = self.accel_min + stopping = True + starting = False + elif below_safe_stop_speed: + accel = self.get_blended_brake_accel(accel, CS.out.vEgo, pitch, tsk_brake_torque) + if accel < raw_accel: + stopping = True + starting = False + if near_standstill and accel < 0 and tsk_brake_torque == 0: + accel = self.accel_min + stopping = True + starting = False + if CS.out.standstill and accel < 0: + accel = min(accel, self.prev_accel) + + if long_active: + if CS.out.vEgo > self.ESP_OVERRIDE_SPEED: + self.can_stop_forever = False + if CS.esp_hold_confirmation: + self.can_stop_forever = False + self.hold_recovery_active = True + + if self.start_commit_active: + esp_starting_override = True + esp_stopping_override = False + elif CS.esp_stopping: + self.can_stop_forever = True + self.hold_recovery_active = False + esp_starting_override = True + esp_stopping_override = False + elif self.can_stop_forever: + esp_starting_override = True + esp_stopping_override = False + elif near_standstill: + esp_starting_override = False + esp_stopping_override = True + # recover from hold confirmations while moving to prevent reconfirming them + elif self.hold_recovery_active and not CS.out.standstill: + esp_starting_override = False + esp_stopping_override = True + else: + self.can_stop_forever = False + self.hold_recovery_active = False + + self.prev_accel = accel + return long_active, accel, stopping, starting, esp_starting_override, esp_stopping_override + + +def accel_during_driver_override(accel: float, gas_pressed: bool, keep_long_active: bool) -> float: + return 0.0 if gas_pressed and keep_long_active else accel + + +def ea_send_ready(stock_values, last_counter): + return bool(stock_values) and stock_values["COUNTER"] != last_counter + + +EA_BLINKER_STEP = 2 + + +def next_ea_counter(tx_counter, stock_counter): + return ((stock_counter if tx_counter is None else tx_counter) + 1) % 16 + + +def ea_blinker_command(left_request, right_request, left_active, right_active): + blinker_active = left_active or right_active + return left_request and not blinker_active, right_request and not blinker_active + + +class CarController(CarControllerBase): + def __init__(self, dbc_names, CP, CP_IQ): + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + self._iq_lvbs_alc = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.alc") + super().__init__(dbc_names, CP, CP_IQ) + self._params = Params() + self.CCP = CarControllerParams(CP) + self.CAN = CanBus(CP) + self.packer_pt = CANPacker(dbc_names[Bus.pt]) + + self._pt_tx_bus = self.CAN.pt + if CP.flags & VolkswagenFlags.PQ: + self.CCS = pqcan + if CP.flags & VolkswagenFlagsIQ.IQ_PQ_LOWLINE: + self._pt_tx_bus = self.CAN.aux + elif CP.flags & VolkswagenFlags.MLB: + self.CCS = mlbcan + if CP.flags & VolkswagenFlagsIQ.IQ_MLB_NO_ECAN: + self._pt_tx_bus = self.CAN.aux + elif CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + self.CCS = mebcan + else: + self.CCS = mqbcan + + self.accel = 0 + self.apply_torque_last = 0 + self.apply_curvature_last = 0. + self.apply_angle_last = 0 + self.ALC_entryCounter = 0 + self.ALC_driverExit = False + self.ALC_reentry_blocked = False + self.ALC_override_last = False + self.ALC_override_counter = 0 + self.entering = False + self.active = False + self.CSLH3_SignLast = 0 + self.CSsteeringAngleDegLast = 0 + self.steering_power_last = 0 + self.long_jerk_control = LongControlJerk(dt=(DT_CTRL * self.CCP.ACC_CONTROL_STEP)) if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO) else None + self.long_limit_control = LongControlLimit(dt=(DT_CTRL * self.CCP.ACC_CONTROL_STEP)) if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO) else None + self.gra_acc_counter_last = None + self.gra_cancel_ticks = 0 + self.motor3_frame_last = None + self.motor3_was_stopping = False + self.motor3_resuming = False + self.sng_handoff_active = False + self.acc_counter_seeded = False + self.klr_counter_last = None + self.ea_counter_last = None + self.ea_tx_counter = None + self.eps_timer_soft_disable_alert = False + self.hca_frame_timer_running = 0 + self.hca_frame_same_torque = 0 + self.accel_last = 0 + self.long_deviation = 0 + self.long_jerklimit = 0 + self.HCA_Status = 3 + self.leadDistanceBars = 0 + self.lead_distance_bars_last = None + self.distance_bar_frame = 0 + self.mlb_hud_text = 0 + self.mlb_hud_text_frame = 0 + self.mlb_set_speed_last = 0 + self.mlb_lead_distance_bars_last = None + self.speed_limit_last = 0 + self.speed_limit_changed_timer = 0 + self.blinkerActive = None + self.hide_ea_error = False + self.radar_disabled_warning_timer = 0 + # Check once at init whether the DBC includes MEB_AWV_01 (AEB HUD for radar-disabled camera harness cars) + self._has_aeb_hud_msg = "MEB_AWV_01" in self.packer_pt.dbc.name_to_msg + self.eps_timer_workaround = bool(CP.flags & (VolkswagenFlags.MLB | VolkswagenFlagsIQ.IQ_PQ_TIMEBOMB)) + self._pq_patch_checked = not bool(CP.flags & VolkswagenFlags.PQ) or self.eps_timer_workaround + self.hca_frame_timer_resetting = 0 + self.hca_frame_low_torque = 0 + self.acc_hold_type_last = mebcan.ACC_HMS_NO_REQUEST + self.acc_hold_ramp_counter = 0 + self.standstill_manager = MQBStandstillManager(CP.mass, self.CCP.ACCEL_MIN) if self.CCS == mqbcan else None + self.radar_handler = PQRadarHandler(self.CAN) if self.CCS is pqcan else None + self.blend_stock_radar = False + self.unavailable = False + self.unavailable_hold = 0 + self.VM = VehicleModel(CP) + self.is_mqb_a0 = self._is_mqb_a0_car(CP.carFingerprint) + self.LateralController = ( + LatControlCurvature(self.CCP.CURVATURE_PID, self.CCP.CURVATURE_LIMITS.CURVATURE_MAX, 1 / (DT_CTRL * self.CCP.STEER_STEP)) + if (CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO)) + else None + ) + + @staticmethod + def _is_mqb_a0_car(candidate) -> bool: + return candidate in MQB_A0_CARS + + def _get_mqb_steering_torque_scale(self, v_ego: float, enabled: bool) -> float: + if enabled and self.CCS == mqbcan: + return float(np.interp(v_ego, [0.4, 3.5, 4.0], [0.8, 0.95, 1.0])) + return 1.0 + + def _mlb_acc_hud_text(self, hud_control, set_speed: float) -> int: + # ACC_02 primary display text, briefly surfaced on a follow distance or set speed change + if hud_control.leadDistanceBars != self.mlb_lead_distance_bars_last: + self.mlb_hud_text_frame = self.frame + self.mlb_hud_text = self.CCP.ACC_HUD_TEXT_DISTANCE.get(hud_control.leadDistanceBars, self.CCP.ACC_HUD_TEXTS["none"]) + elif set_speed != self.mlb_set_speed_last and hud_control.speedVisible: + self.mlb_hud_text_frame = self.frame + self.mlb_hud_text = self.CCP.ACC_HUD_TEXTS["setSpeed"] + elif self.frame - self.mlb_hud_text_frame >= self.CCP.ACC_HUD_TEXT_STEP: + self.mlb_hud_text = self.CCP.ACC_HUD_TEXTS["none"] + self.mlb_lead_distance_bars_last = hud_control.leadDistanceBars + self.mlb_set_speed_last = set_speed + return self.mlb_hud_text + + def _tap_gra_cancel(self, cancel_req: bool, gra_send_ready: bool) -> bool: + if not cancel_req: + self.gra_cancel_ticks = 0 + return False + + period = self.CCP.GRA_CANCEL_TAP_ON + self.CCP.GRA_CANCEL_TAP_OFF + if self.gra_cancel_ticks >= period * self.CCP.GRA_CANCEL_MAX_TAPS: + return False + + pressed = self.gra_cancel_ticks % period < self.CCP.GRA_CANCEL_TAP_ON + if gra_send_ready: + self.gra_cancel_ticks += 1 + return pressed + + def _should_spam_mqb_a0_resume(self, CS, enabled: bool) -> bool: + return bool( + enabled and + self.is_mqb_a0 and + self.CCS == mqbcan and + CS.out.standstill and + self.frame % 50 < 15 + ) + + def update(self, CC, CC_IQ, CS, now_nanos): + actuators = CC.actuators + hud_control = CC.hudControl + can_sends = [] + output_torque = 0 + apply_torque = 0 + pqhca5or7Toggle = self._params.get_bool("pqhca5or7Toggle") + eBrakeActive = self._params.get_bool("eBrakeActive") + iq_mqb_steering_lockout = self._params.get_bool("iqMqbSteeringLockout") + iq_mqb_acc_resume = self._params.get_bool("iqMqbAccResume") + self.blend_stock_radar = self._params.get_bool("IQDynamicBlendStockRadar") + if not self._pq_patch_checked: + self._pq_patch_checked = True + self.eps_timer_workaround = not self._params.get_bool("VwPqEpsPatched") + blend_active = bool(self.blend_stock_radar and self.radar_handler is not None and self.CP.openpilotLongitudinalControl) + AngleLateralControl = self._iq_lvbs_alc.angle_lateral_control_enabled(self, CS) + self.entering = CS.vw_iq_lvbs_alc_entering + self.active = CS.vw_iq_lvbs_alc_active + + if hud_control.audibleAlert == AudibleAlert.refuse: + self.unavailable_hold = self.CCP.IQ_PQ_UNAVAILABLE_HUD_FRAMES + else: + self.unavailable_hold = max(0, self.unavailable_hold - 1) + self.unavailable = self.unavailable_hold > 0 + + CS.force_rhd_for_bsm = getattr(CC, "forceRHDForBSM", False) + CS.enable_predicative_speed_limit = getattr(CC.cruiseControl, "speedLimitPredicative", False) + CS.enable_pred_react_to_speed_limits = getattr(CC.cruiseControl, "speedLimitPredReactToSL", False) + CS.enable_pred_react_to_curves = getattr(CC.cruiseControl, "speedLimitPredReactToCurves", False) + + if self.frame % self.CCP.STEER_STEP == 0: + if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + if CC.latActive: + hca_enabled = True + if CC.curvatureControllerActive: + apply_curvature = self.LateralController.update(CS.out, CC, actuators.curvature) + apply_curvature = apply_curvature + (CS.out.steeringCurvature - (CC.currentCurvature - CC.rollCompensation)) + else: + apply_curvature = actuators.curvature + (CS.out.steeringCurvature - CC.currentCurvature) + apply_curvature = apply_std_curvature_limits(apply_curvature, self.apply_curvature_last, CS.out.vEgoRaw, CS.out.steeringCurvature, + CS.out.steeringPressed, self.CCP.STEER_STEP, CC.latActive, self.CCP.CURVATURE_LIMITS) + + min_power = max(self.steering_power_last - self.CCP.STEERING_POWER_STEP, self.CCP.STEERING_POWER_MIN) + max_power = min(self.steering_power_last + self.CCP.STEERING_POWER_STEP, self.CCP.STEERING_POWER_MAX) + target_power_driver = int(np.interp(abs(CS.out.steeringTorque), [self.CCP.STEER_DRIVER_ALLOWANCE, self.CCP.STEER_DRIVER_MAX], + [self.CCP.STEERING_POWER_MAX, self.CCP.STEERING_POWER_MIN])) + target_power = int(np.interp(CS.out.vEgo, [0., 0.5], [self.CCP.STEERING_POWER_MIN, target_power_driver])) + steering_power = min(max(target_power, min_power), max_power) + else: + if self.LateralController is not None: + self.LateralController.reset() + if self.steering_power_last > 0: + hca_enabled = True + handoff_curvature = self.apply_curvature_last + (CS.out.steeringCurvature - self.apply_curvature_last) * self.CCP.CURVATURE_HANDOFF_RATE + apply_curvature = apply_std_curvature_limits(handoff_curvature, self.apply_curvature_last, CS.out.vEgoRaw, CS.out.steeringCurvature, + CS.out.steeringPressed, self.CCP.STEER_STEP, True, self.CCP.CURVATURE_LIMITS) + steering_power = max(self.steering_power_last - self.CCP.STEERING_POWER_STEP, 0) + else: + hca_enabled = False + apply_curvature = 0. + steering_power = 0 + + can_sends.append(self.CCS.create_steering_control(self.packer_pt, self.CAN.pt, apply_curvature, hca_enabled, steering_power)) + self.apply_curvature_last = apply_curvature + self.steering_power_last = steering_power + else: + if CC.latActive and not AngleLateralControl: + torque_scale = self._get_mqb_steering_torque_scale(CS.out.vEgo, iq_mqb_steering_lockout) + new_torque = int(round(actuators.torque * self.CCP.STEER_MAX * torque_scale)) + apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.CCP) + self.hca_frame_timer_running += self.CCP.STEER_STEP + if self.apply_torque_last == apply_torque: + self.hca_frame_same_torque += self.CCP.STEER_STEP + if self.hca_frame_same_torque > self.CCP.STEER_TIME_STUCK_TORQUE / DT_CTRL: + apply_torque -= (1, -1)[apply_torque < 0] + self.hca_frame_same_torque = 0 + else: + self.hca_frame_same_torque = 0 + hca_enabled = abs(apply_torque) > 0 + if self.eps_timer_workaround and self.hca_frame_timer_running >= self.CCP.STEER_TIME_BM / DT_CTRL: + if abs(apply_torque) <= self.CCP.STEER_LOW_TORQUE: + self.hca_frame_low_torque += self.CCP.STEER_STEP + if self.hca_frame_low_torque >= self.CCP.STEER_TIME_LOW_TORQUE / DT_CTRL: + hca_enabled = False + else: + self.hca_frame_low_torque = 0 + if self.hca_frame_timer_resetting > 0: + apply_torque = 0 + else: + self.hca_frame_low_torque = 0 + hca_enabled = False + apply_torque = 0 + + if hca_enabled: + output_torque = apply_torque + self.hca_frame_timer_resetting = 0 + else: + output_torque = 0 + self.hca_frame_timer_resetting += self.CCP.STEER_STEP + if self.hca_frame_timer_resetting >= self.CCP.STEER_TIME_RESET / DT_CTRL or not self.eps_timer_workaround: + self.hca_frame_timer_running = 0 + apply_torque = 0 + + if hca_enabled and abs(apply_torque) > 0: + if pqhca5or7Toggle and (self.CP.flags & (VolkswagenFlags.PQ | VolkswagenFlags.MLB)): + self.HCA_Status = 7 + else: + self.HCA_Status = 5 + else: + self.HCA_Status = 3 + + self.eps_timer_soft_disable_alert = self.hca_frame_timer_running > self.CCP.STEER_TIME_ALERT / DT_CTRL + self.apply_torque_last = apply_torque + if not (AngleLateralControl and self.CCS in (mqbcan, pqcan, mlbcan)): + can_sends.append(self.CCS.create_hca_steering_control(self.packer_pt, self._pt_tx_bus, output_torque, self.HCA_Status)) + + if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT and self.CCS == mqbcan: + ea_simulated_torque = float(np.clip(apply_torque * 2, -self.CCP.STEER_MAX, self.CCP.STEER_MAX)) + if abs(CS.out.steeringTorque) > abs(ea_simulated_torque): + ea_simulated_torque = CS.out.steeringTorque + can_sends.append(self.CCS.create_eps_update(self.packer_pt, self.CAN.cam, CS.eps_stock_values, ea_simulated_torque)) + + self._iq_lvbs_alc.update_vw_alc(self, CC, CS, actuators, can_sends, apply_torque) + if self.frame % self.CCP.STEER_STEP == 0: + self._iq_lvbs_alc.append_private_apd(self, CC_IQ, can_sends) + + if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO) and self.CP.flags & VolkswagenFlags.STOCK_KLR_PRESENT: + if CS.klr_stock_values: + klr_send_ready = CS.klr_stock_values["COUNTER"] != self.klr_counter_last + if klr_send_ready: + can_sends.append(mebcan.create_capacitive_wheel_touch(self.packer_pt, self.CAN.cam, CC.latActive, CS.klr_stock_values)) + can_sends.append(mebcan.create_capacitive_wheel_touch(self.packer_pt, self.CAN.pt, CC.latActive, CS.klr_stock_values)) + self.klr_counter_last = CS.klr_stock_values["COUNTER"] + + if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + if CS.ea_hud_stock_values and self.frame % EA_BLINKER_STEP == 0: + self.ea_tx_counter = next_ea_counter(self.ea_tx_counter, CS.ea_hud_stock_values["COUNTER"]) + left_blinker, right_blinker = ea_blinker_command( + CC.leftBlinker, CC.rightBlinker, CS.left_blinker_active, CS.right_blinker_active, + ) + can_sends.append(self.CCS.create_blinker_control(self.packer_pt, self.CAN.pt, CS.ea_hud_stock_values, CS.ea_control_stock_values, + left_blinker, right_blinker, self.hide_ea_error, self.ea_tx_counter)) + self.ea_counter_last = CS.ea_hud_stock_values["COUNTER"] + + if self.CP.openpilotLongitudinalControl and self.CCS in (mqbcan, mlbcan) and not self.acc_counter_seeded and CS.acc_stock_counters: + seed_msgs = ("ACC_01", "ACC_02") if self.CCS is mlbcan else ("ACC_02", "ACC_06", "ACC_07", "ACC_10") + for name in seed_msgs: + addr = self.packer_pt.dbc.name_to_msg[name].address + self.packer_pt.counters[addr] = (CS.acc_stock_counters[name] + 1) % 16 + self.acc_counter_seeded = True + + if self.frame % self.CCP.ACC_CONTROL_STEP == 0 and self.CP.openpilotLongitudinalControl and not CS.out.radarDisableFailed: + stopping = actuators.longControlState == LongCtrlState.stopping + if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < 0.25) + accel = float(np.clip(actuators.accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX) if CC.enabled else 0) + + long_override = CC.cruiseControl.override or CS.out.gasPressed + + + critical_state = hud_control.visualAlert == VisualAlert.fcw + if CC.longComfortMode and self.long_jerk_control is not None and self.long_limit_control is not None: + self.long_jerk_control.update(CC.enabled, long_override, hud_control.leadDistance, hud_control.leadVisible, accel, critical_state) + self.long_limit_control.update(CC.enabled, CS.out.vEgoRaw, hud_control.setSpeed, hud_control.leadDistance, hud_control.leadVisible, critical_state) + + acc_control = self.CCS.acc_control_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.enabled, long_override) + acc_hold_type, self.acc_hold_ramp_counter = self.CCS.acc_hold_type( + CS.out.cruiseState.available, CS.out.accFaulted, CC.enabled, starting, stopping, + CS.esp_hold_confirmation, CS.out.vEgo, self.acc_hold_type_last, self.acc_hold_ramp_counter) + self.acc_hold_type_last = acc_hold_type + can_sends.extend(self.CCS.create_acc_accel_control( + self.packer_pt, self.CAN.pt, self.CP, CS.acc_type, CC.enabled, + self.long_jerk_control.get_jerk_up() if CC.longComfortMode and self.long_jerk_control is not None else 4.0, + self.long_jerk_control.get_jerk_down() if CC.longComfortMode and self.long_jerk_control is not None else 4.0, + self.long_limit_control.get_upper_limit() if CC.longComfortMode and self.long_limit_control is not None else 0., + self.long_limit_control.get_lower_limit() if CC.longComfortMode and self.long_limit_control is not None else 0., + accel, acc_control, acc_hold_type, stopping, starting, CS.esp_hold_confirmation, + CS.out.vEgoRaw * CV.MS_TO_KPH, long_override, CS.travel_assist_available, + )) + self.accel_last = accel + else: + stopping = actuators.longControlState == LongCtrlState.stopping + starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < 0.25) + long_active = CC.longActive + accel = accel_during_driver_override(actuators.accel, CS.out.gasPressed, self.CP_IQ.longActiveWithGasOverride) + esp_starting_override = None + esp_stopping_override = None + + if self.CCS == mqbcan and CS.acc_type == 1 and self.standstill_manager is not None: + pitch = CC.orientationNED[1] if len(CC.orientationNED) == 3 else 0.0 + long_active, accel, stopping, starting, esp_starting_override, esp_stopping_override = self.standstill_manager.update( + CS, long_active, accel, stopping, starting, float(getattr(actuators, "speed", 0.0)), + pitch, CS.tsk_brake_torque, + ) + + acc_control = self.CCS.acc_control_value(CS.out.cruiseState.available, long_active, CC.cruiseControl.override, CS.out.accFaulted) + accel = float(np.clip(accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX) if (long_active or CC.cruiseControl.override) else 0) + self.long_jerklimit = float(interp(accel, [-1.5, -0.3, 0.05], [2.0, 0.52, 0.30])) + self.long_deviation = float(interp(accel, [-0.3, 0.1], [0.0, 0.20])) + self.accel_last = accel + + if blend_active and getattr(CC_IQ, "useRadarAccel", False) and CS.acc_radar_sta_adr == 1 and not self.radar_handler.failed: + accel = float(np.clip(CS.acc_radar_sollbeschl, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX)) + self.long_jerklimit = CS.acc_radar_aendgrad + self.long_deviation = CS.acc_radar_regelabw + self.accel_last = accel + + if self.CCS == mqbcan: + can_sends.extend(self.CCS.create_acc_accel_control( + self.packer_pt, self.CAN.pt, CS.acc_type, accel, acc_control, stopping, starting, CS.esp_hold_confirmation, + self.long_deviation, self.long_jerklimit, eBrakeActive, + esp_starting_override=esp_starting_override, esp_stopping_override=esp_stopping_override, + )) + elif self.CCS == mlbcan: + can_sends.extend(self.CCS.create_acc_accel_control(self.packer_pt, self.CAN.pt, accel, acc_control, stopping)) + else: + accel = apply_pq_stopping_accel(self.CP.carFingerprint, accel, stopping) + + sng_ecd_enabled = bool(self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_SNG_ECD) + low_speed = CS.out.vEgo <= self.CCP.SNG_HANDOFF_SPEED + if sng_ecd_enabled and long_active and low_speed and accel <= 0.05 and not starting: + self.sng_handoff_active = True + else: + self.sng_handoff_active = False + sng_decel_req = float(np.clip(accel, self.CCP.ACCEL_MIN, self.CCP.SNG_HOLD_DECEL_MAX)) if self.sng_handoff_active else 0.0 + + can_sends.extend(self.CCS.create_acc_accel_control(self.packer_pt, self.CAN.pt, CS.acc_type, accel, acc_control, stopping and not self.motor3_resuming, starting, CS.esp_hold_confirmation, self.long_deviation, self.long_jerklimit, eBrakeActive, sng_active=self.sng_handoff_active)) + if sng_ecd_enabled: + can_sends.append(self.CCS.create_sng_handoff_control(self.packer_pt, self.CAN.aux, self.sng_handoff_active, sng_decel_req)) + + if (self.CP.flags & VolkswagenFlags.DISABLE_RADAR) and self.CP.openpilotLongitudinalControl and not CS.out.radarDisableFailed: + if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + if self.radar_disabled_warning_timer < 600: + self.radar_disabled_warning_timer += 1 + else: + self.hide_ea_error = True + + if self.frame % self.CCP.AEB_CONTROL_STEP == 0: + can_sends.append(make_tester_present_msg(0x700, self.CAN.pt, suppress_response=True)) + can_sends.append(self.CCS.create_aeb_control(self.packer_pt, self.CAN.pt, self.CP)) + + if self.frame % self.CCP.AEB_HUD_STEP == 0 and self._has_aeb_hud_msg: + can_sends.append(self.CCS.create_aeb_hud(self.packer_pt, self.CAN.pt, self.radar_disabled_warning_timer < 600)) + + if self.frame % 4 == 0: + can_sends.append(self.CCS.create_radar_objects(self.packer_pt, self.CAN.pt)) + + if self.frame % self.CCP.LDW_STEP == 0: + hud_alert = 0 + if hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw) or CS.out.steerFaultTemporary: + hud_alert = self.CCP.LDW_MESSAGES["laneAssistTakeOver"] + steering_pressed_hud = (self.frame // 2) % 2 == 0 if self.entering else CS.out.steeringPressed + if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + disable_alerts = getattr(CC, "disableCarSteerAlerts", False) + sound_alert = self.CCP.LDW_SOUNDS["Chime"] if hud_alert != 0 and not disable_alerts else self.CCP.LDW_SOUNDS["None"] + can_sends.append(self.CCS.create_lka_hud_control(self.packer_pt, self.CAN.pt, CS.ldw_stock_values, CC.latActive, CS.out.steeringPressed, + hud_alert, hud_control, sound_alert)) + else: + can_sends.append(self.CCS.create_lka_hud_control(self.packer_pt, self._pt_tx_bus, CS.ldw_stock_values, CC.latActive, steering_pressed_hud, + hud_alert, hud_control, self.entering, self.CCS is pqcan and AngleLateralControl, self.active)) + + if hud_control.leadDistanceBars != self.lead_distance_bars_last: + self.distance_bar_frame = self.frame + + if self.frame % self.CCP.ACC_HUD_STEP == 0 and self.CP.openpilotLongitudinalControl: + fcw_alert = hud_control.visualAlert == VisualAlert.fcw + d_unresponsive = hud_control.driverUnresponsive + if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + show_distance_bars = self.frame - self.distance_bar_frame < 400 + gap = max(8, CS.out.vEgo * hud_control.leadFollowTime) + distance = max(8, hud_control.leadDistance) if hud_control.leadDistance != 0 else 0 + acc_hud_status = self.CCS.acc_hud_status_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.enabled, + CC.cruiseControl.override or CS.out.gasPressed) + + sl_predicative_active = CC.cruiseControl.speedLimitPredicative and CS.out.cruiseState.speedLimitPredicative != 0 + if CC.cruiseControl.speedLimit and CS.out.cruiseState.speedLimit != 0 and self.speed_limit_last != CS.out.cruiseState.speedLimit: + self.speed_limit_changed_timer = self.frame + self.speed_limit_last = CS.out.cruiseState.speedLimit + sl_active = self.frame - self.speed_limit_changed_timer < 400 + speed_limit = CS.out.cruiseState.speedLimitPredicative if sl_predicative_active else (CS.out.cruiseState.speedLimit if sl_active else 0) + + acc_hud_event = self.CCS.acc_hud_event(acc_hud_status, CS.esp_hold_confirmation, sl_predicative_active, + CS.speed_limit_predicative_type, sl_active) + + can_sends.append(self.CCS.create_acc_hud_control(self.packer_pt, self.CAN.pt, acc_hud_status, hud_control.setSpeed * CV.MS_TO_KPH, + hud_control.leadVisible, hud_control.leadDistanceBars + 1, show_distance_bars, + CS.esp_hold_confirmation, distance, gap, fcw_alert, acc_hud_event, speed_limit)) + else: + # MLB scales the raw lead distance against the set follow gap in the packer, the others clamp to a bar count + leadDistance = hud_control.leadDistance if self.CCS is mlbcan else \ + (min(8, hud_control.leadDistance) if hud_control.leadDistance != 0 else 0) + self.leadDistanceBars = min(3, hud_control.leadDistanceBars) + acc_hud_status = self.CCS.acc_hud_status_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.longActive, + CC.cruiseControl.override or CS.out.gasPressed) + set_speed = hud_control.setSpeed * CV.MS_TO_KPH + decel = dVisual(self.CCS, CS) + hud_kwargs = {"hud_text": self._mlb_acc_hud_text(hud_control, set_speed), + "desired_distance": max(8.0, CS.out.vEgo * hud_control.leadFollowTime)} if self.CCS is mlbcan else {} + can_sends.append(self.CCS.create_acc_hud_control(self.packer_pt, self.CAN.pt, acc_hud_status, set_speed, leadDistance, + self.leadDistanceBars, fcw_alert, hud_control.leadVisible, self.unavailable, + decel, d_unresponsive, **hud_kwargs)) + + if self.CP.flags & VolkswagenFlags.PQ: + self._iq_lvbs_alc.update_turn_signals(self, CC, CS, can_sends) + + if self.CP.openpilotLongitudinalControl and (self.CP.flags & VolkswagenFlags.PQ): + if blend_active: + can_sends.extend(self.radar_handler.update( + self.packer_pt, self.frame, CS, + blend_active=True, + engage_req=getattr(CC_IQ, "radarEngageReq", False), + cancel_req=getattr(CC_IQ, "radarCancelReq", False), + set_speed_kph=getattr(CC_IQ, "radarSetSpeedKph", 0.0), + gap_bars=getattr(CC_IQ, "radarGapBars", 0), + v_ego=CS.out.vEgo, + )) + elif self.frame % 2 == 0: + can_sends.append(self.CCS.filter_motor2(self.packer_pt, self.CAN.ext, CS.motor2_stock)) + can_sends.append(self.CCS.filter_motor5(self.packer_pt, self.CAN.ext, CS.motor5_stock)) + + gra_send_ready = self.CP.pcmCruise and CS.gra_stock_values["COUNTER"] != self.gra_acc_counter_last + if self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + main_cruise_latching = not bool(CS.gra_stock_values["GRA_Typ_Hauptschalter"]) + stock_cancel_pressed = bool(CS.gra_stock_values["GRA_Abbrechen"] if main_cruise_latching else CS.gra_stock_values["GRA_Hauptschalter"]) + elif self.CP.flags & VolkswagenFlags.MLB: + stock_cancel_pressed = bool(CS.gra_stock_values["LS_Abbrechen"]) + else: + stock_cancel_pressed = bool(CS.gra_stock_values["GRA_Abbrechen"]) + + cancel_cmd = stock_cancel_pressed or self._tap_gra_cancel(CC.cruiseControl.cancel, gra_send_ready) + resume_cmd = CC.cruiseControl.resume or self._should_spam_mqb_a0_resume(CS, iq_mqb_acc_resume) + if gra_send_ready and (cancel_cmd or resume_cmd): + stalk_on_powertrain = self.CP.flags & VolkswagenFlags.PQ or self.CP.flags & VolkswagenFlagsIQ.IQ_MLB_NO_ECAN + bus_send = self.CAN.aux if stalk_on_powertrain else self.CAN.ext + can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, bus_send, CS.gra_stock_values, + cancel=cancel_cmd, resume=resume_cmd)) + + if self.CP.openpilotLongitudinalControl and self.CCS == pqcan and not blend_active: + if self.frame % 3: + can_sends.append(self.CCS.create_gra_neu(self.packer_pt, self.CAN.ext, CS.gra_stock_values, CC.longActive)) + + if self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB: + is_stopping = actuators.longControlState == LongCtrlState.stopping + if CS.out.vEgo > 0.5 or not CC.longActive: + self.motor3_resuming = False + elif (self.motor3_was_stopping and not is_stopping and self.CP.openpilotLongitudinalControl and CC.longActive): + self.motor3_resuming = True + if self.motor3_resuming and CS.motor3_stock: + can_sends.append(self.CCS.create_motor3_resume(self.packer_pt, self.CAN.aux, CS.motor1_stock, CS.motor3_stock, resume=True)) + self.motor3_was_stopping = is_stopping + + new_actuators = actuators.as_builder() + new_actuators.torque = self.apply_torque_last / self.CCP.STEER_MAX + new_actuators.torqueOutputCan = self.apply_torque_last + if self.CP.steerControlType == structs.CarParams.SteerControlType.angle: + new_actuators.steeringAngleDeg = float(self.apply_angle_last) + new_actuators.curvature = float(self.apply_curvature_last) + new_actuators.accel = self.accel_last + new_actuators.speed = float(getattr(actuators, "speed", 0.0)) + + self.lead_distance_bars_last = hud_control.leadDistanceBars + self.gra_acc_counter_last = CS.gra_stock_values["COUNTER"] + self.motor3_frame_last = CS.motor3_frame + self.frame += 1 + return new_actuators, can_sends diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/carstate.py b/artifacts/package_runtime/iqdbc/car/volkswagen/carstate.py new file mode 100644 index 000000000..f0913d186 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/carstate.py @@ -0,0 +1,894 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import sys +import os +import math +import time +from iqdbc.can import CANParser +from iqdbc.car import DT_CTRL, Bus, structs +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.common.filter_simple import FirstOrderFilter +from iqdbc.car.volkswagen.values import CAR, DBC, CanBus, NetworkLocation, RADAR_DISABLE_STATE, TransmissionType, GearShifter, \ + CarControllerParams, VolkswagenFlags, VolkswagenFlagsIQ +from iqdbc.car.volkswagen.speed_limit_manager import SpeedLimitManager + +iqpilot_path = os.path.join(os.path.dirname(__file__), '..', '..', '..') +sys.path.insert(0, iqpilot_path) +try: + from iqpilot.common.params import Params +except ImportError: + pass + +ButtonType = structs.CarState.ButtonEvent.Type + + +class CarState(CarStateBase): + CRUISE_FAULT_LATERAL_ENABLE_FRAMES = 5 + CRUISE_FAULT_LATERAL_DISABLE_FRAMES = 20 + MEB_TEMP_CRUISE_FAULT = 6 + MEB_TOLERANCE_MAX = 100 + DRIVER_TORQUE_TAU = 0.10 + + def __init__(self, CP, CP_IQ): + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + self._iq_lvbs_alc = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.alc") + super().__init__(CP, CP_IQ) + self._params = Params() + self.frame = 0 + self.eps_init_complete = False + self.CCP = CarControllerParams(CP) + self.driver_torque_filter = FirstOrderFilter(0.0, self.DRIVER_TORQUE_TAU, DT_CTRL) + self.button_states = {button.event_type: False for button in self.CCP.BUTTONS} + self.esp_hold_confirmation = False + self.upscale_lead_car_signal = False + self.eps_stock_values = False + self.curvature = 0. + self.klr_stock_values = {} + self.ea_hud_stock_values = {} + self.ea_control_stock_values = {} + self.acc_type = 0 + self.acc_radar_sollbeschl = 0.0 + self.acc_radar_regelabw = 0.0 + self.acc_radar_aendgrad = 0.0 + self.acc_radar_sta_adr = 0 + self.acc_radar_fehler = False + self.acc_radar_v_wunsch = 0.0 + self.acc_radar_sta_acc = 0 + self.epb_freigabe_ver = False + self.acc_stock_counters: dict[str, int] = {} + self.esp_stopping = False + self.tsk_brake_torque = 0.0 + self.last_cruiseActive = False + self.cruise_faulted_frames = 0 + self.cruise_fault_clear_frames = 0 + self.cruise_fault_lateral_active = False + self.cruise_faulted = False + self.grade = 0.0 + self.rolling_backward = False + self.rolling_forward = False + self.sum_wegimpulse = 0 + self.speed_limit_mgr = SpeedLimitManager(CP) + self.enable_predicative_speed_limit = False + self.enable_speed_limit_predicative = False + self.enable_pred_react_to_speed_limits = False + self.enable_pred_react_to_curves = False + self.speed_limit_predicative_type = 0 + self.force_rhd_for_bsm = False + self.grade = 0.0 + self.rolling_backward = False + self.rolling_forward = False + self.sum_wegimpulse = 0 + self.travel_assist_available = False + self.left_blinker_active = False + self.right_blinker_active = False + self._param_update_time = 0.0 + self.cruise_recovery_timer = 0 + self.tolerance_counter = self.MEB_TOLERANCE_MAX + self.lkas_button = 0 + self.prev_lkas_button = 0 + self.vw_iq_lvbs_alc_available = False + self.vw_iq_lvbs_alc_entering = False + self.vw_iq_lvbs_alc_active = False + self.vw_iq_lvbs_alc_key_slot = 0 + self.EPS_ALC_Status = 0 + self.EPS_ALC_Abbruch = 0 + self.PQ_ALC_Status_raw = 0 + self.alcOverrideAlert = False + self.bremse8_stock = None + self.br8_acc_anf = False + self.tsk_verzoeg_anf = False + self.cruise_main_switch = False + self.motor3_stock = {} + self.motor1_stock = {} + self.motor3_frame = 0 + self.motor1_frame = 0 + self._odometer_store = self._iq_lvbs_alc.create_vehicle_odometer_store(CP, self._params) + + def _update_odometer(self, ret: structs.CarState, raw_km: float) -> None: + """Publish the cluster value while proprietary Konn3kt code owns persistence.""" + odometer_km = self._odometer_store.record(raw_km) + if odometer_km is not None: + ret.odometer = odometer_km + + def _apply_iq_private_flags(self, ret_iq: structs.IQCarState) -> None: + ret_iq.alcOverrideAlert = bool(self.alcOverrideAlert) + + def update_button_enable(self, buttonEvents: list[structs.CarState.ButtonEvent]): + if not self.CP.pcmCruise: + if self.cruise_fault_lateral_active and self.cruise_faulted: + return False + for b in buttonEvents: + # Enable OP long on falling edge of enable buttons + if b.type in (ButtonType.setCruise, ButtonType.resumeCruise) and not b.pressed: + return True + return False + + def create_button_events(self, pt_cp, buttons): + button_events = [] + + for button in buttons: + state = pt_cp.vl[button.can_addr][button.can_msg] in button.values + if self.button_states[button.event_type] != state: + event = structs.CarState.ButtonEvent() + event.type = button.event_type + event.pressed = state + button_events.append(event) + self.button_states[button.event_type] = state + + return button_events + + def _update_mqb_iq_alc_state(self, pt_cp): + self._iq_lvbs_alc.update_mqb_carstate_alc_state(self, pt_cp) + + def _update_mlb_iq_alc_state(self, pt_cp): + self._iq_lvbs_alc.update_mlb_carstate_alc_state(self, pt_cp) + + def _update_pq_iq_alc_state(self, pt_cp): + self._iq_lvbs_alc.update_pq_carstate_alc_state(self, pt_cp) + + def update(self, can_parsers) -> tuple[structs.CarState, structs.IQCarState]: + pt_cp = can_parsers[Bus.pt] + cam_cp = can_parsers[Bus.cam] + ext_cp = pt_cp if self.CP.networkLocation == NetworkLocation.fwdCamera else cam_cp + + if self.CP.flags & VolkswagenFlags.PQ: + aux_cp = can_parsers.get(Bus.aux) + return self.update_pq(pt_cp, cam_cp, ext_cp, aux_cp) + elif self.CP.flags & VolkswagenFlags.MLB: + br_cp = can_parsers[Bus.aux] + return self.update_mlb(pt_cp, br_cp, cam_cp, ext_cp) + elif self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + main_cp = can_parsers[Bus.main] + return self.update_meb(pt_cp, main_cp, cam_cp, ext_cp) + + ret = structs.CarState() + ret_iq = structs.IQCarState() + + if self.CP.transmissionType == TransmissionType.direct: + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Motor_EV_01"]["MO_Waehlpos"], None)) + elif self.CP.transmissionType == TransmissionType.manual: + if bool(pt_cp.vl["Gateway_72"]["BCM1_Rueckfahrlicht_Schalter"]): + ret.gearShifter = GearShifter.reverse + else: + ret.gearShifter = GearShifter.drive + else: + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Gateway_73"]["GE_Fahrstufe"], None)) + + if True: + # MQB-specific + if self.CP.flags & VolkswagenFlags.KOMBI_PRESENT: + self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) # Analog v digital instrument cluster + + self.parse_wheel_speeds(ret, + pt_cp.vl["ESP_19"]["ESP_VL_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_VR_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_HL_Radgeschw_02"], + pt_cp.vl["ESP_19"]["ESP_HR_Radgeschw_02"], + ) + + self.rolling_backward = ( + pt_cp.vl["ESP_10"]["ESP_HR_Fahrtrichtung"] == 1 or + pt_cp.vl["ESP_10"]["ESP_HL_Fahrtrichtung"] == 1 or + pt_cp.vl["ESP_10"]["ESP_VR_Fahrtrichtung"] == 1 or + pt_cp.vl["ESP_10"]["ESP_VL_Fahrtrichtung"] == 1 + ) + self.rolling_forward = ( + pt_cp.vl["ESP_10"]["ESP_HR_Fahrtrichtung"] == 0 or + pt_cp.vl["ESP_10"]["ESP_HL_Fahrtrichtung"] == 0 or + pt_cp.vl["ESP_10"]["ESP_VR_Fahrtrichtung"] == 0 or + pt_cp.vl["ESP_10"]["ESP_VL_Fahrtrichtung"] == 0 + ) + self.sum_wegimpulse = int( + pt_cp.vl["ESP_10"]["ESP_Wegimpuls_VL"] + + pt_cp.vl["ESP_10"]["ESP_Wegimpuls_VR"] + + pt_cp.vl["ESP_10"]["ESP_Wegimpuls_HL"] + + pt_cp.vl["ESP_10"]["ESP_Wegimpuls_HR"] + ) + + if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT: + ret.carFaultedNonCritical = bool(cam_cp.vl["HCA_01"]["EA_Ruckfreigabe"]) or cam_cp.vl["HCA_01"]["EA_ACC_Sollstatus"] > 0 # EA + + ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects + brake_pedal_pressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"]) + brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"]) + ret.brakePressed = brake_pedal_pressed or brake_pressure_detected + ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"]) # FIXME: need to include an EPB check as well + + ret.doorOpen = any([pt_cp.vl["Gateway_72"]["ZV_FT_offen"], + pt_cp.vl["Gateway_72"]["ZV_BT_offen"], + pt_cp.vl["Gateway_72"]["ZV_HFS_offen"], + pt_cp.vl["Gateway_72"]["ZV_HBFS_offen"], + pt_cp.vl["Gateway_72"]["ZV_HD_offen"]]) + + if self.CP.enableBsm: + # Infostufe: BSM LED on, Warnung: BSM LED flashing + ret.leftBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"]) + ret.rightBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"]) + + if not (self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR): + ret.stockFcw = bool(ext_cp.vl["ACC_10"]["AWV2_Freigabe"]) + ret.stockAeb = bool(ext_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"]) + else: + ret.stockFcw = False + ret.stockAeb = False + + cc_only = self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY or self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR + self.acc_type = 0 if cc_only else ext_cp.vl["ACC_06"]["ACC_Typ"] + if not cc_only: + self.acc_stock_counters["ACC_02"] = int(ext_cp.vl["ACC_02"]["COUNTER"]) + self.acc_stock_counters["ACC_06"] = int(ext_cp.vl["ACC_06"]["COUNTER"]) + self.acc_stock_counters["ACC_07"] = int(ext_cp.vl["ACC_07"]["COUNTER"]) + self.acc_stock_counters["ACC_10"] = int(ext_cp.vl["ACC_10"]["COUNTER"]) + self.esp_stopping = bool(pt_cp.vl["ESP_21"]["ESP_Anhaltevorgang_ACC_aktiv"]) + self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) + self.tsk_brake_torque = pt_cp.vl["TSK_06"]["TSK_Radbremsmom"] if pt_cp.vl["TSK_06"]["TSK_Freig_Verzoeg_Anf"] else 0.0 + self.grade = pt_cp.vl["Motor_16"]["TSK_Steigung"] + acc_limiter_mode = False if cc_only else ext_cp.vl["ACC_02"]["ACC_Gesetzte_Zeitluecke"] == 0 + speed_limiter_mode = bool(pt_cp.vl["TSK_06"]["TSK_Limiter_ausgewaehlt"]) + self.tsk_verzoeg_anf = bool(pt_cp.vl["TSK_06"]["TSK_Freig_Verzoeg_Anf"]) + + self._update_mqb_iq_alc_state(pt_cp) + + ret.cruiseState.available = pt_cp.vl["TSK_06"]["TSK_Status"] in (2, 3, 4, 5) + ret.cruiseState.enabled = pt_cp.vl["TSK_06"]["TSK_Status"] in (3, 4, 5) + ret.cruiseState.speed = 0 if cc_only else ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS if self.CP.pcmCruise else 0 + ret.accFaulted = pt_cp.vl["TSK_06"]["TSK_Status"] in (6, 7) + + ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Left"]) + ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Right"]) + + # Shared logic + ret.vEgoCluster = pt_cp.vl["Kombi_01"]["KBI_angez_Geschw"] * CV.KPH_TO_MS + + if ret.cruiseState.speed > 0 and ret.vEgo > 1.0: + cluster_ratio = ret.vEgoCluster / ret.vEgo + ret.cruiseState.speedCluster = ret.cruiseState.speed * cluster_ratio + + self.parse_mlb_mqb_steering_state(ret, pt_cp) + + ret.gasPressed = pt_cp.vl["Motor_20"]["MO_Fahrpedalrohwert_01"] > 0 + ret.espActive = bool(pt_cp.vl["ESP_21"]["ESP_Eingriff"]) + ret.espDisabled = pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"] != 0 + ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3 + + ret.standstill = ret.vEgoRaw == 0 + ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation + ret.cruiseState.nonAdaptive = acc_limiter_mode or speed_limiter_mode + if ret.cruiseState.speed > 90: + ret.cruiseState.speed = 0 + + self.eps_stock_values = pt_cp.vl["LH_EPS_03"] + self.ldw_stock_values = cam_cp.vl["LDW_02"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {} + self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] + + ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) + + ret.lowSpeedAlert = self.update_low_speed_alert(ret.vEgo) + allow_lat_only = self._params.get_bool("AllowLateralWhenLongUnavailable") and self._params.get_bool("AolEnabled") + cruise_main_switch = bool(self.gra_stock_values["GRA_Hauptschalter"]) + ret.cruiseFaultLateralMode = allow_lat_only and ret.accFaulted and cruise_main_switch + ret.lateralAvailable = ret.cruiseState.available or ret.cruiseFaultLateralMode + ret.blockPcmEnable = ret.cruiseFaultLateralMode + + ret.fuelGauge = pt_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] / 55.0 + ret.fuelTankLevelL = pt_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] # raw liters for konn3kt + self._update_odometer(ret, pt_cp.vl["Kombi_02"]["KBI_Kilometerstand"]) + + self.cruise_faulted = ret.accFaulted + self._apply_iq_private_flags(ret_iq) + self.frame += 1 + return ret, ret_iq + + def update_meb(self, pt_cp, main_cp, cam_cp, ext_cp) -> tuple[structs.CarState, structs.IQCarState]: + ret = structs.CarState() + ret_iq = structs.IQCarState() + + if time.monotonic() - self._param_update_time > 2.0: + self.enable_speed_limit_predicative = self._params.get_bool("EnableSpeedLimitPredicative") + self.enable_pred_react_to_speed_limits = self._params.get_bool("EnableSLPredReactToSL") + self.enable_pred_react_to_curves = self._params.get_bool("EnableSLPredReactToCurves") + self._param_update_time = time.monotonic() + + self.parse_wheel_speeds(ret, + pt_cp.vl["ESC_51"]["VL_Radgeschw"], + pt_cp.vl["ESC_51"]["VR_Radgeschw"], + pt_cp.vl["ESC_51"]["HL_Radgeschw"], + pt_cp.vl["ESC_51"]["HR_Radgeschw"], + ) + + if self.CP.flags & VolkswagenFlags.KOMBI_PRESENT: + ret.vEgoCluster = pt_cp.vl["Kombi_01"]["KBI_angez_Geschw"] * CV.KPH_TO_MS + ret.standstill = ret.vEgoRaw == 0 + + ret.steeringAngleDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradwinkel"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradwinkel"])] + ret.steeringRateDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradw_Geschw"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradw_Geschw"])] + ret.steeringTorque = pt_cp.vl["LH_EPS_03"]["EPS_Lenkmoment"] * (1, -1)[int(pt_cp.vl["LH_EPS_03"]["EPS_VZ_Lenkmoment"])] + driver_override_threshold = self._iq_lvbs_alc.vw_driver_override_threshold_cnm(self, "mqb", self.CCP.STEER_DRIVER_ALLOWANCE) + ret.steeringPressed = abs(self.driver_torque_filter.update(ret.steeringTorque)) > driver_override_threshold + + self.curvature = -pt_cp.vl["QFK_01"]["Curvature"] * (1, -1)[int(pt_cp.vl["QFK_01"]["Curvature_VZ"])] + ret.steeringCurvature = self.curvature + ret.yawRate = -pt_cp.vl["ESC_50"]["Yaw_Rate"] * (1, -1)[int(pt_cp.vl["ESC_50"]["Yaw_Rate_Sign"])] * CV.DEG_TO_RAD + + if self.CP.flags & VolkswagenFlags.ALT_GEAR: + gear_raw = pt_cp.vl["Gateway_73"]["GE_Fahrstufe"] + else: + gear_raw = pt_cp.vl["Getriebe_11"]["GE_Fahrstufe"] + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(gear_raw, None)) + if (self.CP.flags & VolkswagenFlags.MQB_EVO) and ret.gearShifter == GearShifter.unknown: + reversing = bool(pt_cp.vl["Gateway_72"]["BCM1_Rueckfahrlicht_Schalter"]) + ret.gearShifter = GearShifter.reverse if reversing else GearShifter.drive + drive_mode = ret.gearShifter == GearShifter.drive + + hca_status = self.CCP.hca_status_values.get(pt_cp.vl["QFK_01"]["LatCon_HCA_Status"]) + ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status, drive_mode=drive_mode) + + self.eps_stock_values = pt_cp.vl["LH_EPS_03"] + self.klr_stock_values = pt_cp.vl["KLR_01"] if self.CP.flags & VolkswagenFlags.STOCK_KLR_PRESENT else {} + self.ea_hud_stock_values = cam_cp.vl["EA_02"] + self.ea_control_stock_values = cam_cp.vl["EA_01"] + ret.carFaultedNonCritical = cam_cp.vl["EA_01"]["EA_Funktionsstatus"] in (3, 4, 5, 6) + + ret.gasPressed = pt_cp.vl["Motor_51"]["Accel_Pedal_Pressure"] > 0 # Motor_54 has unreliable offset on MQBevo + ret.brakePressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"]) + ret.brake = pt_cp.vl["ESC_51"]["Brake_Pressure"] + + ret.parkingBrake = pt_cp.vl["ESC_50"]["EPB_Status"] in (1, 4) + + doors = pt_cp.vl["ZV_02"] if bool(pt_cp.vl["Gateway_72"]["ZV_02_alt"]) else pt_cp.vl["Gateway_72"] + ret.doorOpen = any([doors["ZV_FT_offen"], + doors["ZV_BT_offen"], + doors["ZV_HFS_offen"], + doors["ZV_HBFS_offen"], + doors["ZV_HD_offen"]]) + + ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3 + + if self.CP.enableBsm: + bsm_bus = pt_cp if self.CP.flags & (VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO) else ext_cp + blindspot_driver = bool(bsm_bus.vl["MEB_Side_Assist_01"]["Blind_Spot_Info_Driver"]) or bool(bsm_bus.vl["MEB_Side_Assist_01"]["Blind_Spot_Warn_Driver"]) + blindspot_passenger = bool(bsm_bus.vl["MEB_Side_Assist_01"]["Blind_Spot_Info_Passenger"]) or bool(bsm_bus.vl["MEB_Side_Assist_01"]["Blind_Spot_Warn_Passenger"]) + force_rhd = self.force_rhd_for_bsm or self._params.get_bool("ForceRHDForBSM") + car_is_lhd = not force_rhd + ret.leftBlindspot = blindspot_driver if car_is_lhd else blindspot_passenger + ret.rightBlindspot = blindspot_passenger if car_is_lhd else blindspot_driver + + self.ldw_stock_values = cam_cp.vl["LDW_02"] + + awv_values = ext_cp.vl.get("AWV_03", ext_cp.vl.get("ACC_10", {})) + ret.stockFcw = bool(awv_values.get("FCW_Active", 0)) or bool(awv_values.get("AWV2_Freigabe", 0)) + ret.stockAeb = False + + self.acc_type = ext_cp.vl["ACC_18"]["ACC_Typ"] + self.travel_assist_available = bool(pt_cp.vl.get("TA_01", {}).get("Travel_Assist_Available", 0)) + + ret.cruiseState.available = pt_cp.vl["Motor_51"]["TSK_Status"] in (2, 3, 4, 5) + ret.cruiseState.enabled = pt_cp.vl["Motor_51"]["TSK_Status"] in (3, 4, 5) + # TSK winds its braking down through brake_only after a driver brake. Requesting drive-off in this + # state can fault TSK, and stock refuses to engage here as well, so block entry until it clears. + ret.carNotReady = pt_cp.vl["Motor_51"]["TSK_Status"] == 5 # brake_only + acc_values = ext_cp.vl.get("MEB_ACC_01", ext_cp.vl.get("ACC_19", {})) + ret.cruiseState.nonAdaptive = bool(acc_values.get("ACC_Limiter_Mode", 0)) if self.CP.pcmCruise else bool(pt_cp.vl["Motor_51"]["TSK_Limiter_ausgewaehlt"]) + + acc_faulted = pt_cp.vl["Motor_51"]["TSK_Status"] in (6, 7) + ret.accFaulted = self.update_acc_fault(acc_faulted, parking_brake=ret.parkingBrake, drive_mode=drive_mode) + + if self.CP.flags & VolkswagenFlags.MQB_EVO: + self.esp_hold_confirmation = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) + else: + self.esp_hold_confirmation = pt_cp.vl["ESC_50"]["Motion_State"] == 3 + ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation + + if self.CP.pcmCruise: + ret.cruiseState.speed = float(int(round(acc_values.get("ACC_Wunschgeschw_02", 0)))) * CV.KPH_TO_MS + if ret.cruiseState.speed > 90: + ret.cruiseState.speed = 0 + + if ret.cruiseState.speed > 0 and ret.vEgo > 1.0 and ret.vEgoCluster > 0: + cluster_ratio = ret.vEgoCluster / ret.vEgo + ret.cruiseState.speedCluster = ret.cruiseState.speed * cluster_ratio + + raining = pt_cp.vl["RLS_01"]["RS_Regenmenge"] > 0 + vze_01_values = cam_cp.vl.get("MEB_VZE_01", cam_cp.vl.get("VZE_04", {})) + psd_04_values = main_cp.vl["PSD_04"] if self.CP.flags & VolkswagenFlags.STOCK_PSD_PRESENT else {} + psd_05_values = main_cp.vl["PSD_05"] if self.CP.flags & VolkswagenFlags.STOCK_PSD_PRESENT else {} + psd_06_values = main_cp.vl["PSD_06"] if self.CP.flags & VolkswagenFlags.STOCK_PSD_PRESENT else {} + psd_06_values = pt_cp.vl["PSD_06"] if not psd_06_values and self.CP.flags & VolkswagenFlags.STOCK_PSD_06_PRESENT else psd_06_values + diagnose_01_values = pt_cp.vl["Diagnose_01"] if self.CP.flags & VolkswagenFlags.STOCK_DIAGNOSE_01_PRESENT else {} + self._update_odometer(ret, pt_cp.vl["Diagnose_01"]["KBI_Kilometerstand"]) + + if self.enable_speed_limit_predicative and not self.enable_predicative_speed_limit: + self.enable_predicative_speed_limit = True + self.speed_limit_mgr.enable_predicative_speed_limit(self.enable_predicative_speed_limit, self.enable_pred_react_to_speed_limits, self.enable_pred_react_to_curves) + self.speed_limit_mgr.update(ret.vEgo, psd_04_values, psd_05_values, psd_06_values, vze_01_values, raining, diagnose_01_values) + ret.cruiseState.speedLimit = self.speed_limit_mgr.get_speed_limit() + ret.cruiseState.speedLimitPredicative = self.speed_limit_mgr.get_speed_limit_predicative() + self.speed_limit_predicative_type = self.speed_limit_mgr.get_speed_limit_predicative_type() + ret_iq.speedLimit = ret.cruiseState.speedLimit + + self.left_blinker_active = bool(pt_cp.vl["Blinkmodi_02"]["BM_links"]) + self.right_blinker_active = bool(pt_cp.vl["Blinkmodi_02"]["BM_rechts"]) + stalk_values = pt_cp.vl.get("SMLS_01", {}) + ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(240, stalk_values.get("BH_Blinker_li", 0), stalk_values.get("BH_Blinker_re", 0)) + + main_cruise_latching = not bool(pt_cp.vl["GRA_ACC_01"]["GRA_Typ_Hauptschalter"]) + buttons = getattr(self.CCP, "BUTTONS_ALT", self.CCP.BUTTONS) if main_cruise_latching else self.CCP.BUTTONS + ret.buttonEvents = self.create_button_events(pt_cp, buttons) + + self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] + + ret.espDisabled = bool(pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"]) + ret.espActive = bool(pt_cp.vl["ESP_21"]["ESP_Eingriff"]) + + allow_lat_only = self._params.get_bool("AllowLateralWhenLongUnavailable") and self._params.get_bool("AolEnabled") + cruise_fault_candidate = allow_lat_only and ret.accFaulted and bool(pt_cp.vl["GRA_ACC_01"]["GRA_Hauptschalter"]) + if cruise_fault_candidate: + self.cruise_faulted_frames += 1 + self.cruise_fault_clear_frames = 0 + if self.cruise_faulted_frames >= self.CRUISE_FAULT_LATERAL_ENABLE_FRAMES: + self.cruise_fault_lateral_active = True + else: + self.cruise_faulted_frames = 0 + if self.cruise_fault_lateral_active: + self.cruise_fault_clear_frames += 1 + if self.cruise_fault_clear_frames >= self.CRUISE_FAULT_LATERAL_DISABLE_FRAMES: + self.cruise_fault_lateral_active = False + else: + self.cruise_fault_clear_frames = 0 + if not allow_lat_only: + self.cruise_fault_lateral_active = False + self.cruise_faulted_frames = 0 + self.cruise_fault_clear_frames = 0 + ret.cruiseFaultLateralMode = self.cruise_fault_lateral_active + ret.lateralAvailable = ret.cruiseState.available or ret.cruiseFaultLateralMode + ret.blockPcmEnable = ret.cruiseFaultLateralMode + + if self.CP.flags & VolkswagenFlags.MEB: + ret.batteryDetails.charge = pt_cp.vl["Motor_16"]["MO_Energieinhalt_BMS"] + if self.CP.networkLocation == NetworkLocation.gateway: + ret.batteryDetails.heaterActive = bool(main_cp.vl["MEB_HVEM_03"]["PTC_ON"]) + ret.batteryDetails.voltage = main_cp.vl["MEB_HVEM_01"]["Battery_Voltage"] + ret.batteryDetails.capacity = main_cp.vl["BMS_04"]["BMS_Kapazitaet_02"] * ret.batteryDetails.voltage + ret.batteryDetails.soc = ret.batteryDetails.charge / ret.batteryDetails.capacity * 100.0 if ret.batteryDetails.capacity > 0 else 0.0 + ret.batteryDetails.power = main_cp.vl["MEB_HVEM_01"]["Engine_Power"] + ret.batteryDetails.temperature = main_cp.vl["DCDC_03"]["DC_Temperatur"] + ret.batteryDetails.chargingMode = int(main_cp.vl["BMS_04"]["BMS_IstModus"]) + ret.fuelGauge = ret.batteryDetails.soc / 100.0 + + self.update_meb_virtual_lkas(ret, pt_cp, hca_status) + + ret.lowSpeedAlert = self.update_low_speed_alert(ret.vEgo) + + # Propagate radar disable failure state so carcontroller can skip ACC sends + if self.CP.flags & VolkswagenFlags.DISABLE_RADAR: + ret.radarDisableFailed = RADAR_DISABLE_STATE["error"] + + self.cruise_faulted = ret.accFaulted + self.frame += 1 + self._apply_iq_private_flags(ret_iq) + return ret, ret_iq + + def update_pq(self, pt_cp, cam_cp, ext_cp, aux_cp=None) -> tuple[structs.CarState, structs.IQCarState]: + ret = structs.CarState() + ret_iq = structs.IQCarState() + sng_ecd_enabled = bool(self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_SNG_ECD) + + # vEgo obtained from Bremse_1 vehicle speed rather than Bremse_3 wheel speeds because Bremse_3 isn't present on NSF + ret.vEgoRaw = pt_cp.vl["Bremse_1"]["BR1_Rad_kmh"] * CV.KPH_TO_MS + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + ret.standstill = ret.vEgoRaw == 0 + + # Update EPS position and state info. For signed values, VW sends the sign in a separate signal. + ret.steeringAngleDeg = pt_cp.vl["Lenkhilfe_3"]["LH3_BLW"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_BLWSign"])] + ret.steeringRateDeg = pt_cp.vl["Lenkwinkel_1"]["LW1_Lenk_Gesch"] * (1, -1)[int(pt_cp.vl["Lenkwinkel_1"]["LW1_Gesch_Sign"])] + ret.steeringTorque = pt_cp.vl["Lenkhilfe_3"]["LH3_LM"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_LMSign"])] + hca_status = self.CCP.hca_status_values.get(pt_cp.vl["Lenkhilfe_2"]["LH2_Sta_HCA"]) + ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status, ready_confirms_init=False) + + # Update gas, brakes, and gearshift. + ret.gasPressed = pt_cp.vl["Motor_3"]["MO3_Pedalwert"] > 0 + ret.brake = pt_cp.vl["Bremse_5"]["BR5_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects + ret.brakePressed = bool(pt_cp.vl["Motor_2"]["MO2_BLS"]) + ret.parkingBrake = bool(pt_cp.vl["Kombi_1"]["Bremsinfo"]) + + # Update gear and/or clutch position data. + if self.CP.transmissionType == TransmissionType.automatic: + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_1"]["GE1_Wahl_Pos"], None)) + elif self.CP.transmissionType == TransmissionType.manual: + reverse_light = bool(pt_cp.vl["Gate_Komf_1"]["GK1_Rueckfahr"]) + if reverse_light: + ret.gearShifter = GearShifter.reverse + else: + ret.gearShifter = GearShifter.drive + + # Update door and trunk/hatch lid open status. + ret.doorOpen = any([pt_cp.vl["Gate_Komf_1"]["GK1_Fa_Tuerkont"], + pt_cp.vl["Gate_Komf_1"]["BSK_BT_geoeffnet"], + pt_cp.vl["Gate_Komf_1"]["BSK_HL_geoeffnet"], + pt_cp.vl["Gate_Komf_1"]["BSK_HR_geoeffnet"], + pt_cp.vl["Gate_Komf_1"]["BSK_HD_Hauptraste"]]) + + # Update seatbelt fastened status. + ret.seatbeltUnlatched = not bool(pt_cp.vl["Airbag_1"]["Gurtschalter_Fahrer"]) + + self.LH_3_Sign = pt_cp.vl["Lenkhilfe_3"]["LH3_BLWSign"] + self.LH2_steeringState = pt_cp.vl["Lenkhilfe_2"]["LH2_aktLenkeingriff"] + self._update_pq_iq_alc_state(pt_cp) + driver_override_threshold = self._iq_lvbs_alc.vw_driver_override_threshold_cnm(self, "pq", self.CCP.STEER_DRIVER_ALLOWANCE) + ret.steeringPressed = abs(ret.steeringTorque) > driver_override_threshold + + # Consume blind-spot monitoring info/warning LED states, if available. + # Infostufe: BSM LED on, Warnung: BSM LED flashing + if self.CP.enableBsm: + blindspot_li = bool(ext_cp.vl["SWA_1"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_1"]["SWA_Warnung_SWA_li"]) + blindspot_re = bool(ext_cp.vl["SWA_1"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_1"]["SWA_Warnung_SWA_re"]) + force_rhd = self.force_rhd_for_bsm or self._params.get_bool("ForceRHDForBSM") + ret.leftBlindspot = blindspot_re if force_rhd else blindspot_li + ret.rightBlindspot = blindspot_li if force_rhd else blindspot_re + + # Consume factory LDW data relevant for factory SWA (Lane Change Assist) + # and capture it for forwarding to the blind spot radar controller + self.ldw_stock_values = cam_cp.vl["LDW_Status"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {} + + cc_only = self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY or self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR + + if not (self.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR): + ret.stockFcw = bool(ext_cp.vl["AWV"]["AWV_2_Freigabe"]) + ret.stockAeb = bool(ext_cp.vl["AWV"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["AWV"]["ANB_Zielbremsung_Freigabe"]) + else: + ret.stockFcw = False + ret.stockAeb = False + + ret.espActive = bool(pt_cp.vl["Bremse_1"]["BR1_Lampe_ASR"]) + + # Update ACC radar status. + self.acc_type = 0 if cc_only else ext_cp.vl["ACC_System"]["ACS_Typ_ACC"] + cruise_main_switch = bool(pt_cp.vl["Motor_5"]["MO5_GRA_Hauptsch"]) + self.cruise_main_switch = cruise_main_switch + MO2_StaGRA = pt_cp.vl["Motor_2"]["MO2_Sta_GRA"] in (1, 2) + ACS_StaADR = False if cc_only else ext_cp.vl["ACC_System"]["ACS_Sta_ADR"] == 1 + cruiseActive = MO2_StaGRA or ACS_StaADR + self.epb_freigabe_ver = bool(aux_cp.vl["EPB_1"]["EP1_Freigabe_Ver"]) if sng_ecd_enabled and not cc_only else False + sng_holding = sng_ecd_enabled and self.epb_freigabe_ver + if cruiseActive or sng_holding: + self.last_cruiseActive = True + elif not MO2_StaGRA and not ACS_StaADR and not sng_holding: + self.last_cruiseActive = False + ret.cruiseState.enabled = self.last_cruiseActive + self.br8_acc_anf = bool(pt_cp.vl["Bremse_8"]["BR8_Sta_ACC_Anf"]) if not cc_only else False + + if self.CP.pcmCruise: + if cc_only: + cruise_faulted = pt_cp.vl["Motor_2"]["MO2_Sta_GRA"] == 3 + else: + cruise_faulted = ext_cp.vl["ACC_GRA_Anzeige"]["ACA_StaACC"] in (6, 7) or ext_cp.vl["ACC_System"]["ACS_Sta_ADR"] == 3 or pt_cp.vl["Motor_2"]["MO2_Sta_GRA"] == 3 + else: + cruise_faulted = pt_cp.vl["Motor_2"]["MO2_Sta_GRA"] == 3 + + ret.accFaulted = cruise_faulted + ret.cruiseState.available = cruise_main_switch and not cruise_faulted + allow_lat_only = self._params.get_bool("AllowLateralWhenLongUnavailable") and self._params.get_bool("AolEnabled") + cruise_main_available = cruise_main_switch + ret.cruiseFaultLateralMode = allow_lat_only and cruise_faulted and cruise_main_available + ret.lateralAvailable = ret.cruiseState.available or ret.cruiseFaultLateralMode + ret.blockPcmEnable = ret.cruiseFaultLateralMode + ret.carNotReady = bool(pt_cp.vl["Bremse_8"]["BR8_Sta_VerzReg"]) + + # Update ACC setpoint. When the setpoint reads as 255, the driver has not + # yet established an ACC setpoint, so treat it as zero. + if cc_only: + ret.cruiseState.speed = pt_cp.vl["Motor_2"]["MO2_GRA_Soll"] * CV.KPH_TO_MS + elif self.CP.pcmCruise: + ret.cruiseState.speed = ext_cp.vl["ACC_GRA_Anzeige"]["ACA_V_Wunsch"] * CV.KPH_TO_MS + else: + ret.cruiseState.speed = 0 + if ret.cruiseState.speed > 70: # 255 kph in m/s == no current setpoint + ret.cruiseState.speed = 0 + + self.motor2_stock = pt_cp.vl["Motor_2"] + self.motor5_stock = pt_cp.vl["Motor_5"] + + if self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB: + self.motor3_stock = aux_cp.vl["Motor_3"] + self.motor1_stock = aux_cp.vl["Motor_1"] + self.motor3_frame += 1 + self.motor1_frame += 1 + + if cc_only: + self.acc_radar_sollbeschl = 0.0 + self.acc_radar_regelabw = 0.0 + self.acc_radar_aendgrad = 0.0 + self.acc_radar_sta_adr = 0 + self.acc_radar_fehler = False + self.acc_radar_v_wunsch = 0.0 + self.acc_radar_sta_acc = 0 + else: + self.acc_radar_sollbeschl = ext_cp.vl["ACC_System"]["ACS_Sollbeschl"] + self.acc_radar_regelabw = ext_cp.vl["ACC_System"]["ACS_zul_Regelabw"] + self.acc_radar_aendgrad = ext_cp.vl["ACC_System"]["ACS_max_AendGrad"] + self.acc_radar_sta_adr = int(ext_cp.vl["ACC_System"]["ACS_Sta_ADR"]) + self.acc_radar_fehler = bool(ext_cp.vl["ACC_System"]["ACS_Fehler"]) + self.acc_radar_v_wunsch = ext_cp.vl["ACC_GRA_Anzeige"]["ACA_V_Wunsch"] + self.acc_radar_sta_acc = int(ext_cp.vl["ACC_GRA_Anzeige"]["ACA_StaACC"]) + + ret_iq.accRadarStaAdr = self.acc_radar_sta_adr + ret_iq.accRadarFehler = self.acc_radar_fehler + + # Update button states for turn signals and ACC controls, capture all ACC button state/config for passthrough + ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_stalk(300, pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_li"], + pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_re"]) + self.leftBlinkerUpdate = pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_li"] + self.rightBlinkerUpdate = pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_re"] + ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) + self.gra_stock_values = pt_cp.vl["GRA_Neu"] + + # Additional safety checks performed in CarInterface. + ret.espDisabled = bool(pt_cp.vl["Bremse_1"]["BR1_ESPASR_passive"]) + + ret.lowSpeedAlert = self.update_low_speed_alert(ret.vEgo) + + ret.fuelGauge = pt_cp.vl["Kombi_1"]["Tankinhalt"] / 55.0 + ret.fuelTankLevelL = pt_cp.vl["Kombi_1"]["Tankinhalt"] # raw liters for konn3kt + if aux_cp is not None: + self._update_odometer(ret, aux_cp.vl["Kombi_3"]["Kilometerstand"]) + + if self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB: + ret.cruiseState.standstill = self.CP.pcmCruise and bool(pt_cp.vl["Bremse_5"]["BR5_Stillstand"]) and ret.cruiseState.enabled + elif sng_ecd_enabled: + ret.cruiseState.standstill = sng_holding and ret.standstill + + self.cruise_faulted = ret.accFaulted + self.frame += 1 + self._apply_iq_private_flags(ret_iq) + return ret, ret_iq + + def update_mlb(self, pt_cp, br_cp, cam_cp, ext_cp) -> structs.CarState: + ret = structs.CarState() + ret_iq = structs.IQCarState() + + self.parse_wheel_speeds(ret, + pt_cp.vl["ESP_03"]["ESP_VL_Radgeschw"], + pt_cp.vl["ESP_03"]["ESP_VR_Radgeschw"], + pt_cp.vl["ESP_03"]["ESP_HL_Radgeschw"], + pt_cp.vl["ESP_03"]["ESP_HR_Radgeschw"], + ) + + ret.gasPressed = pt_cp.vl["Motor_03"]["MO_Fahrpedalrohwert_01"] > 0 + if self.CP.carFingerprint == CAR.PORSCHE_MACAN_MK1: + ret.gearShifter = self.parse_gear_shifter(self.CCP.shifter_values.get(pt_cp.vl["Getriebe_03"]["GE_Waehlhebel"], None)) + elif self.CP.transmissionType == TransmissionType.manual: + reverse = bool(br_cp.vl["Gateway_05"]["BCM1_Rueckfahrlicht_Schalter"]) + ret.gearShifter = GearShifter.reverse if reverse else GearShifter.drive + else: + ret.gearShifter = GearShifter.drive + + cc_only = bool(self.CP.flags & (VolkswagenFlagsIQ.IQ_CC_ONLY | VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR)) + cruise_main_switch = bool(pt_cp.vl["LS_01"]["LS_Hauptschalter"]) + if not self.CP.pcmCruise: + ret.cruiseState.available = cruise_main_switch + ret.cruiseState.enabled = False + ret.accFaulted = False + elif self.CP.carFingerprint == CAR.PORSCHE_MACAN_MK1: + ret.cruiseState.available = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (2, 3, 4, 5) + ret.cruiseState.enabled = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (3, 4, 5) + ret.accFaulted = ext_cp.vl["ACC_05"]["ACC_Status_ACC"] in (6, 7) + else: + ret.cruiseState.available = pt_cp.vl["TSK_02"]["TSK_Status"] in (0, 1, 2) + ret.cruiseState.enabled = pt_cp.vl["TSK_02"]["TSK_Status"] in (1, 2) + if not cc_only: + ret.cruiseState.speed = ext_cp.vl["ACC_02"]["ACC_Wunschgeschw_02"] * CV.KPH_TO_MS + ret.accFaulted = pt_cp.vl["TSK_02"]["TSK_Status"] in (3,) + + ret.cruiseState.nonAdaptive = bool(pt_cp.vl["LS_01"]["LS_Limiter"]) + if not self.CP.pcmCruise: + self.acc_stock_counters["ACC_01"] = int(ext_cp.vl["ACC_01"]["COUNTER"]) + self.acc_stock_counters["ACC_02"] = int(ext_cp.vl["ACC_02"]["COUNTER"]) + self.esp_hold_confirmation = bool(pt_cp.vl["ESP_02"]["ESP_Stillstandsflag"]) + + self.parse_mlb_mqb_steering_state(ret, pt_cp) + self._update_mlb_iq_alc_state(pt_cp) + + ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0 + brake_pedal_pressed = bool(pt_cp.vl["Motor_03"]["MO_BLS"]) # MO_Fahrer_bremst sticks on real MLB hardware + brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"]) + ret.brakePressed = brake_pedal_pressed or brake_pressure_detected + ret.parkingBrake = bool(pt_cp.vl["Kombi_01"]["KBI_Handbremse"]) + ret.espDisabled = pt_cp.vl["ESP_01"]["ESP_Tastung_passiv"] != 0 + + if self.CP.carFingerprint == CAR.PORSCHE_MACAN_MK1: + ret.leftBlinker = bool(pt_cp.vl["Gateway_11"]["BH_Blinker_li"]) + ret.rightBlinker = bool(pt_cp.vl["Gateway_11"]["BH_Blinker_re"]) + + ret.seatbeltUnlatched = pt_cp.vl["Gateway_06"]["AB_Gurtschloss_FA"] != 3 + ret.doorOpen = any([pt_cp.vl["Gateway_05"]["FT_Tuer_geoeffnet"], + pt_cp.vl["Gateway_05"]["BT_Tuer_geoeffnet"], + pt_cp.vl["Gateway_05"]["HL_Tuer_geoeffnet"], + pt_cp.vl["Gateway_05"]["HR_Tuer_geoeffnet"]]) + else: + ret.leftBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_links"]) + ret.rightBlinker = bool(pt_cp.vl["Blinkmodi_01"]["BM_rechts"]) + ret.seatbeltUnlatched = pt_cp.vl["Airbag_02"]["AB_Gurtschloss_FA"] != 3 + + # Consume blind-spot monitoring info/warning LED states, if available. + # Infostufe: BSM LED on, Warnung: BSM LED flashing + if self.CP.enableBsm: + ret.leftBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"]) + ret.rightBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"]) + + self.ldw_stock_values = cam_cp.vl["LDW_02"] if self.CP.networkLocation == NetworkLocation.fwdCamera else {} + self.gra_stock_values = pt_cp.vl["LS_01"] + + ret.fuelGauge = br_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] / 55.0 + ret.fuelTankLevelL = br_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] # raw liters for konn3kt + self._update_odometer(ret, br_cp.vl["Kombi_02"]["KBI_Kilometerstand"]) + + ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) + + ret.cruiseState.standstill = self.CP.pcmCruise and self.esp_hold_confirmation + ret.standstill = ret.vEgoRaw == 0 + allow_lat_only = self._params.get_bool("AllowLateralWhenLongUnavailable") and self._params.get_bool("AolEnabled") + ret.cruiseFaultLateralMode = allow_lat_only and ret.accFaulted and cruise_main_switch + ret.lateralAvailable = ret.cruiseState.available or ret.cruiseFaultLateralMode + ret.blockPcmEnable = ret.cruiseFaultLateralMode + + self.cruise_faulted = ret.accFaulted + self.frame += 1 + self._apply_iq_private_flags(ret_iq) + return ret, ret_iq + + def update_low_speed_alert(self, v_ego: float) -> bool: + # Low speed steer alert hysteresis logic + if (self.CP.minSteerSpeed - 1e-3) > CarControllerParams.DEFAULT_MIN_STEER_SPEED and v_ego < (self.CP.minSteerSpeed + 1.): + self.low_speed_alert = True + elif v_ego > (self.CP.minSteerSpeed + 2.): + self.low_speed_alert = False + return self.low_speed_alert + + def parse_mlb_mqb_steering_state(self, ret, pt_cp, drive_mode=True): + ret.steeringAngleDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradwinkel"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradwinkel"])] + ret.steeringRateDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradw_Geschw"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradw_Geschw"])] + + if self.CP.flags & VolkswagenFlagsIQ.IQ_MLB_NO_HCA_EPS: + ret.steeringTorque = 0.0 + ret.steeringPressed = False + ret.steerFaultTemporary, ret.steerFaultPermanent = False, True + return + + ret.steeringTorque = pt_cp.vl["LH_EPS_03"]["EPS_Lenkmoment"] * (1, -1)[int(pt_cp.vl["LH_EPS_03"]["EPS_VZ_Lenkmoment"])] + ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE + + hca_status = self.CCP.hca_status_values.get(pt_cp.vl["LH_EPS_03"]["EPS_HCA_Status"]) + ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status, drive_mode) + return + + def update_hca_state(self, hca_status, drive_mode=True, ready_confirms_init=True): + # Treat FAULT as temporary for worst likely EPS recovery time, for cars without factory Lane Assist + # DISABLED means the EPS hasn't been configured to support Lane Assist + init_statuses = ("DISABLED", "READY", "ACTIVE") if ready_confirms_init else ("DISABLED", "ACTIVE") + self.eps_init_complete = self.eps_init_complete or hca_status in init_statuses or self.frame > 1000 + perm_fault = drive_mode and hca_status == "DISABLED" or (self.eps_init_complete and hca_status == "FAULT") + temp_fault = drive_mode and hca_status in ("REJECTED", "PREEMPTED") or not self.eps_init_complete + return temp_fault, perm_fault + + def update_acc_fault(self, acc_fault, parking_brake=False, drive_mode=True, recovery_frames_max=100): + fault = acc_fault + if parking_brake and not drive_mode: + fault = False + self.cruise_recovery_timer = self.frame + elif self.frame - self.cruise_recovery_timer < recovery_frames_max: + fault = False + return fault + + def update_meb_virtual_lkas(self, ret, pt_cp, hca_status): + temp_cruise_fault = pt_cp.vl["Motor_51"]["TSK_Status"] == self.MEB_TEMP_CRUISE_FAULT + drive_mode = ret.gearShifter == GearShifter.drive + if temp_cruise_fault and ret.parkingBrake and not drive_mode: + ret.cruiseState.available = True + self.tolerance_counter = 0 + elif self.tolerance_counter < self.MEB_TOLERANCE_MAX: + ret.cruiseState.available = True + self.tolerance_counter = min(self.tolerance_counter + 1, self.MEB_TOLERANCE_MAX) + + self.prev_lkas_button = self.lkas_button + user_disable = any(b.type == ButtonType.cancel and b.pressed for b in ret.buttonEvents) + steering_enabled = hca_status == "ACTIVE" + cruise_standby = not ret.cruiseState.enabled + self.lkas_button = steering_enabled and user_disable and cruise_standby + + if self.prev_lkas_button != self.lkas_button: + event = structs.CarState.ButtonEvent() + event.type = ButtonType.lkas + event.pressed = self.lkas_button + ret.buttonEvents = list(ret.buttonEvents) + [event] + + @staticmethod + def get_can_parsers(CP, CP_IQ): + if CP.flags & VolkswagenFlags.PQ: + return CarState.get_can_parsers_pq(CP) + if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + return CarState.get_can_parsers_meb(CP) + + # manually configure some optional and variable-rate/edge-triggered messages + pt_messages, cam_messages = [], [] + + if not CP.flags & VolkswagenFlags.MLB: + pt_messages += [ + ("Blinkmodi_02", 1) # From J519 BCM (sent at 1Hz when no lights active, 50Hz when active) + ] + if CP.flags & VolkswagenFlags.MLB: + pt_messages += [ + ("Blinkmodi_01", math.nan), # From J519 BCM (is inactive when no lights active, 50Hz when active) + ("Kombi_02", math.nan), # Auxiliary-bus cluster odometer + ] + else: + pt_messages += [("Kombi_02", math.nan)] # Auxiliary-bus cluster odometer + if CP.flags & VolkswagenFlagsIQ.IQ_MLB_NO_HCA_EPS: + pt_messages += [("LH_EPS_03", math.nan)] + if CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT: + cam_messages += [ + ("HCA_01", 1), # From R242 Driver assistance camera, 50Hz if steering/1Hz if not + ] + + pt_bus = CanBus(CP).aux if CP.flags & VolkswagenFlagsIQ.IQ_MLB_NO_ECAN else CanBus(CP).pt + + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, pt_bus), + Bus.aux: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, CanBus(CP).aux), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, CanBus(CP).cam), + } + + @staticmethod + def get_can_parsers_pq(CP): + aux_messages = [("Kombi_3", math.nan)] # Bus 1 cluster odometer + if CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB: + aux_messages.append(("Motor_3", 0)) + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).powertrain), + Bus.aux: CANParser(DBC[CP.carFingerprint][Bus.pt], aux_messages, CanBus(CP).aux), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).cam), + } + + @staticmethod + def get_can_parsers_meb(CP): + pt_messages = [ + ("Blinkmodi_02", 1), + ("SMLS_01", 1), + # TA_01 lives on bus 0 (car ECU / OP-generated when long is active). + # math.nan → ignore_alive=True so it never contributes to can_valid. + ("TA_01", math.nan), + ("Diagnose_01", math.nan), # Bus 0 cluster odometer + ] + if CP.networkLocation == NetworkLocation.fwdCamera: + pt_messages.append(("AWV_03", 1)) + + cam_messages = [] + if CP.networkLocation == NetworkLocation.gateway: + cam_messages.append(("AWV_03", 1)) + + return { + Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], pt_messages, CanBus(CP).pt), + Bus.main: CANParser(DBC[CP.carFingerprint][Bus.pt], [], CanBus(CP).main), + Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], cam_messages, CanBus(CP).cam), + } diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/fingerprints.py b/artifacts/package_runtime/iqdbc/car/volkswagen/fingerprints.py new file mode 100644 index 000000000..f8084015b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/fingerprints.py @@ -0,0 +1,1590 @@ +""" AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" +from iqdbc.car.structs import CarParams +from iqdbc.car.volkswagen.values import CAR + +Ecu = CarParams.Ecu + +# TODO: Sharan Mk2 EPS and DQ250 auto trans both require KWP2000 support for fingerprinting + + +FW_VERSIONS = { + CAR.VOLKSWAGEN_ARTEON_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704L906026TM\xf1\x896847', + b'\xf1\x873G0906259AH\xf1\x890001', + b'\xf1\x873G0906259F \xf1\x890004', + b'\xf1\x873G0906259G \xf1\x890004', + b'\xf1\x873G0906259G \xf1\x890005', + b'\xf1\x873G0906259J \xf1\x890002', + b'\xf1\x873G0906259M \xf1\x890003', + b'\xf1\x873G0906259N \xf1\x890004', + b'\xf1\x873G0906259P \xf1\x890001', + b'\xf1\x875NA907115H \xf1\x890002', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927158L \xf1\x893611', + b'\xf1\x870DL300014C \xf1\x893704', + b'\xf1\x870GC300011L \xf1\x891401', + b'\xf1\x870GC300013Q \xf1\x892402', + b'\xf1\x870GC300014M \xf1\x892802', + b'\xf1\x870GC300019G \xf1\x892804', + b'\xf1\x870GC300040P \xf1\x891401', + b'\xf1\x870GC300043 \xf1\x892303', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e1616001613121157161111572900', + b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e1616001613121177161113772900', + b'\xf1\x873Q0959655BK\xf1\x890712\xf1\x82\x0e1616001613121157161111572C00', + b'\xf1\x873Q0959655CK\xf1\x890711\xf1\x82\x0e1712141712141105121122052900', + b'\xf1\x873Q0959655CR\xf1\x890720\xf1\x82\x0e1616001613121105161111052900', + b'\xf1\x873Q0959655DA\xf1\x890720\xf1\x82\x0e1712141712141105121122052900', + b'\xf1\x873Q0959655DL\xf1\x890732\xf1\x82\x0e1812141812171105141123052J00', + b'\xf1\x875QF959655AP\xf1\x890755\xf1\x82\x1311110011111311111100110200--1611125F49', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571B41815A1', + b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571B00817A1', + b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571B00818A1', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567B0020800', + b'\xf1\x875WA907145M \xf1\x891051\xf1\x82\x002MB4092M7N', + b'\xf1\x875WA907145M \xf1\x891051\xf1\x82\x002NB4202N7N', + b'\xf1\x875WA907145Q \xf1\x891063\xf1\x82\x002KB4092KOM', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572T \xf1\x890383', + b'\xf1\x875Q0907572J \xf1\x890654', + b'\xf1\x875Q0907572P \xf1\x890682', + b'\xf1\x875Q0907572R \xf1\x890771', + ], + }, + CAR.VOLKSWAGEN_ATLAS_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8703H906026AA\xf1\x899970', + b'\xf1\x8703H906026AG\xf1\x899971', + b'\xf1\x8703H906026AG\xf1\x899973', + b'\xf1\x8703H906026AJ\xf1\x890638', + b'\xf1\x8703H906026AJ\xf1\x891017', + b'\xf1\x8703H906026AT\xf1\x891922', + b'\xf1\x8703H906026BC\xf1\x892664', + b'\xf1\x8703H906026F \xf1\x896696', + b'\xf1\x8703H906026F \xf1\x899970', + b'\xf1\x8703H906026F \xf1\x899973', + b'\xf1\x8703H906026J \xf1\x896026', + b'\xf1\x8703H906026J \xf1\x899970', + b'\xf1\x8703H906026J \xf1\x899971', + b'\xf1\x8703H906026J \xf1\x899972', + b'\xf1\x8703H906026S \xf1\x896693', + b'\xf1\x8703H906026S \xf1\x899970', + b'\xf1\x8703H906026S \xf1\x899972', + b'\xf1\x873CN906259 \xf1\x890005', + b'\xf1\x873CN906259F \xf1\x890002', + b'\xf1\x873CN906259K \xf1\x890002', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927158A \xf1\x893387', + b'\xf1\x8709G927158DR\xf1\x893536', + b'\xf1\x8709G927158DR\xf1\x893742', + b'\xf1\x8709G927158EN\xf1\x893691', + b'\xf1\x8709G927158F \xf1\x893489', + b'\xf1\x8709G927158FT\xf1\x893835', + b'\xf1\x8709G927158GK\xf1\x893941', + b'\xf1\x8709G927158GL\xf1\x893939', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655BC\xf1\x890503\xf1\x82\x0e1914151912001103111122031200', + b'\xf1\x873Q0959655BN\xf1\x890713\xf1\x82\x0e2214152212001105141122052900', + b'\xf1\x873Q0959655DB\xf1\x890720\xf1\x82\x0e1114151112001105111122052900', + b'\xf1\x873Q0959655DB\xf1\x890720\xf1\x82\x0e2214152212001105141122052900', + b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1114151112001105111122052J00', + b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1114151112001105161122052J00', + b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1115151112001105121122052J00', + b'\xf1\x873Q0959655DM\xf1\x890732\xf1\x82\x0e1115151112001105171122052J00', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B60924A1', + b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6G920A1', + b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6M921A1', + b'\xf1\x873QF909144B \xf1\x891582\xf1\x82\x0571B6N920A1', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820528B6080105', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820528B6090105', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572R \xf1\x890372', + b'\xf1\x872Q0907572T \xf1\x890383', + b'\xf1\x875Q0907572H \xf1\x890620', + b'\xf1\x875Q0907572J \xf1\x890654', + b'\xf1\x875Q0907572P \xf1\x890682', + b'\xf1\x875Q0907572S \xf1\x890780', + ], + }, + CAR.VOLKSWAGEN_CADDY_MK3: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906027T \xf1\x892363', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x872K5959655E \xf1\x890018\xf1\x82\x05000P037605', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0155', + ], + }, + CAR.VOLKSWAGEN_CRAFTER_MK2: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704L906056BP\xf1\x894729', + b'\xf1\x8704L906056EK\xf1\x896391', + b'\xf1\x8704L906056SH\xf1\x899973', + b'\xf1\x8705L906023BC\xf1\x892688', + b'\xf1\x8705L906023MH\xf1\x892588', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655AL\xf1\x890505\xf1\x82\x0e1411001413001203151311031100', + b'\xf1\x873Q0959655BG\xf1\x890703\xf1\x82\x0e16120016130012051G1313052900', + b'\xf1\x875QF959655AG\xf1\x890753\xf1\x82\x13151300151500111111000502----1111120749', + b'\xf1\x875QF959655AS\xf1\x890755\xf1\x82\x1315140015150011111100050200--1311120749', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x872N0909143D\x00\xf1\x897010\xf1\x82\x05183AZ306A2', + b'\xf1\x872N0909143E \xf1\x897021\xf1\x82\x05163AZ306A2', + b'\xf1\x872N0909143H \xf1\x897045\xf1\x82\x05263AZ309A2', + b'\xf1\x872N0909144K \xf1\x897045\xf1\x82\x05233AZ810A2', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572J \xf1\x890156', + b'\xf1\x872Q0907572M \xf1\x890233', + b'\xf1\x872Q0907572R \xf1\x890372', + ], + }, + CAR.VOLKSWAGEN_GOLF_MK7: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906016A \xf1\x897697', + b'\xf1\x8704E906016AD\xf1\x895758', + b'\xf1\x8704E906016CE\xf1\x899096', + b'\xf1\x8704E906016CH\xf1\x899226', + b'\xf1\x8704E906016DF\xf1\x896188', + b'\xf1\x8704E906016N \xf1\x899105', + b'\xf1\x8704E906023AG\xf1\x891726', + b'\xf1\x8704E906023BN\xf1\x894518', + b'\xf1\x8704E906024K \xf1\x896811', + b'\xf1\x8704E906024K \xf1\x899970', + b'\xf1\x8704E906027GR\xf1\x892394', + b'\xf1\x8704E906027HD\xf1\x892603', + b'\xf1\x8704E906027HD\xf1\x893742', + b'\xf1\x8704E906027MA\xf1\x894958', + b'\xf1\x8704L906021DT\xf1\x895520', + b'\xf1\x8704L906021DT\xf1\x898127', + b'\xf1\x8704L906021N \xf1\x895518', + b'\xf1\x8704L906021N \xf1\x898138', + b'\xf1\x8704L906026BN\xf1\x891197', + b'\xf1\x8704L906026BP\xf1\x897608', + b'\xf1\x8704L906026NF\xf1\x899528', + b'\xf1\x8704L906027AA\xf1\x899525', + b'\xf1\x8704L906056CL\xf1\x893823', + b'\xf1\x8704L906056CR\xf1\x895813', + b'\xf1\x8704L906056HE\xf1\x893758', + b'\xf1\x8704L906056HN\xf1\x896590', + b'\xf1\x8704L906056HT\xf1\x896591', + b'\xf1\x8704L997022N \xf1\x899459', + b'\xf1\x870EA906016A \xf1\x898343', + b'\xf1\x870EA906016E \xf1\x894219', + b'\xf1\x870EA906016F \xf1\x894238', + b'\xf1\x870EA906016F \xf1\x895002', + b'\xf1\x870EA906016Q \xf1\x895993', + b'\xf1\x870EA906016S \xf1\x897207', + b'\xf1\x875G0906259 \xf1\x890007', + b'\xf1\x875G0906259C \xf1\x890002', + b'\xf1\x875G0906259D \xf1\x890002', + b'\xf1\x875G0906259J \xf1\x890002', + b'\xf1\x875G0906259L \xf1\x890002', + b'\xf1\x875G0906259N \xf1\x890003', + b'\xf1\x875G0906259Q \xf1\x890002', + b'\xf1\x875G0906259Q \xf1\x892313', + b'\xf1\x875G0906259T \xf1\x890003', + b'\xf1\x878V0906259H \xf1\x890002', + b'\xf1\x878V0906259J \xf1\x890003', + b'\xf1\x878V0906259J \xf1\x890103', + b'\xf1\x878V0906259K \xf1\x890001', + b'\xf1\x878V0906259K \xf1\x890003', + b'\xf1\x878V0906259P \xf1\x890001', + b'\xf1\x878V0906259Q \xf1\x890002', + b'\xf1\x878V0906259R \xf1\x890002', + b'\xf1\x878V0906264F \xf1\x890003', + b'\xf1\x878V0906264L \xf1\x890002', + b'\xf1\x878V0906264M \xf1\x890001', + b'\xf1\x878V09C0BB01 \xf1\x890001', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927749AP\xf1\x892943', + b'\xf1\x8709S927158A \xf1\x893585', + b'\xf1\x870CW300040H \xf1\x890606', + b'\xf1\x870CW300041D \xf1\x891004', + b'\xf1\x870CW300041H \xf1\x891010', + b'\xf1\x870CW300042F \xf1\x891604', + b'\xf1\x870CW300043B \xf1\x891601', + b'\xf1\x870CW300043E \xf1\x891603', + b'\xf1\x870CW300044S \xf1\x894530', + b'\xf1\x870CW300044T \xf1\x895245', + b'\xf1\x870CW300045 \xf1\x894531', + b'\xf1\x870CW300046A \xf1\x895113', + b'\xf1\x870CW300047D \xf1\x895261', + b'\xf1\x870CW300047E \xf1\x895261', + b'\xf1\x870CW300048J \xf1\x890611', + b'\xf1\x870CW300049H \xf1\x890905', + b'\xf1\x870CW300050G \xf1\x891905', + b'\xf1\x870D9300012 \xf1\x894904', + b'\xf1\x870D9300012 \xf1\x894913', + b'\xf1\x870D9300012 \xf1\x894937', + b'\xf1\x870D9300012 \xf1\x895045', + b'\xf1\x870D9300012 \xf1\x895046', + b'\xf1\x870D9300014M \xf1\x895004', + b'\xf1\x870D9300014Q \xf1\x895006', + b'\xf1\x870D9300018 \xf1\x895201', + b'\xf1\x870D9300020D \xf1\x894309', + b'\xf1\x870D9300020J \xf1\x894902', + b'\xf1\x870D9300020Q \xf1\x895201', + b'\xf1\x870D9300020S \xf1\x895201', + b'\xf1\x870D9300040A \xf1\x893613', + b'\xf1\x870D9300040S \xf1\x894311', + b'\xf1\x870D9300041H \xf1\x895220', + b'\xf1\x870D9300041N \xf1\x894512', + b'\xf1\x870D9300041P \xf1\x894507', + b'\xf1\x870D9300043F \xf1\x895204', + b'\xf1\x870DD300045K \xf1\x891120', + b'\xf1\x870DD300046F \xf1\x891601', + b'\xf1\x870GC300012A \xf1\x891401', + b'\xf1\x870GC300012A \xf1\x891403', + b'\xf1\x870GC300012A \xf1\x891422', + b'\xf1\x870GC300012M \xf1\x892301', + b'\xf1\x870GC300014B \xf1\x892401', + b'\xf1\x870GC300014B \xf1\x892403', + b'\xf1\x870GC300014B \xf1\x892405', + b'\xf1\x870GC300014E \xf1\x892407', + b'\xf1\x870GC300020G \xf1\x892401', + b'\xf1\x870GC300020G \xf1\x892403', + b'\xf1\x870GC300020G \xf1\x892404', + b'\xf1\x870GC300020N \xf1\x892804', + b'\xf1\x870GC300043T \xf1\x899999', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655AA\xf1\x890386\xf1\x82\x111413001113120043114317121C111C9113', + b'\xf1\x875Q0959655AA\xf1\x890386\xf1\x82\x111413001113120053114317121C111C9113', + b'\xf1\x875Q0959655AA\xf1\x890388\xf1\x82\x111413001113120043114317121C111C9113', + b'\xf1\x875Q0959655AA\xf1\x890388\xf1\x82\x111413001113120043114417121411149113', + b'\xf1\x875Q0959655AA\xf1\x890388\xf1\x82\x111413001113120053114317121C111C9113', + b'\xf1\x875Q0959655AR\xf1\x890317\xf1\x82\x13141500111233003142114A2131219333313100', + b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1314160011123300314211012230229333423100', + b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1314160011123300314211012230229333463100', + b'\xf1\x875Q0959655BJ\xf1\x890336\xf1\x82\x13141300111233003142115A1932199333463100', + b'\xf1\x875Q0959655BJ\xf1\x890336\xf1\x82\x13141600111233003142115A2231229333423100', + b'\xf1\x875Q0959655BJ\xf1\x890339\xf1\x82\x13141600111233003142115A2232229333463100', + b'\xf1\x875Q0959655BS\xf1\x890403\xf1\x82\x1314160011123300314240012250229333463100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142404A2251229333463100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142404A2252229333463100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142405A2251229333463100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x13141600111233003142405A2252229333463100', + b'\xf1\x875Q0959655C \xf1\x890361\xf1\x82\x111413001112120004110415121610169112', + b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x1314160011123300314240012250229333463100', + b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x13141600111233003142405A2251229333463100', + b'\xf1\x875Q0959655D \xf1\x890388\xf1\x82\x111413001113120006110417121A101A9113', + b'\xf1\x875Q0959655J \xf1\x890825\xf1\x82\x13271112111312--071104171825102591131211', + b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13271112111312--071104171825102591131211', + b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13271212111312--071104171838103891131211', + b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13272512111312--07110417182C102C91131211', + b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13341512112212--071104172328102891131211', + b'\xf1\x875Q0959655M \xf1\x890361\xf1\x82\x111413001112120041114115121611169112', + b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011211200061104171717101791132111', + b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011211200621143171717111791132111', + b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1324230011211200061104171724102491132111', + b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1324230011211200621143171724112491132111', + b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1324230011211200631143171724122491132111', + b'\xf1\x875Q0959655T \xf1\x890825\xf1\x82\x13271200111312--071104171837103791132111', + b'\xf1\x875Q0959655T \xf1\x890830\xf1\x82\x13271100111312--071104171826102691131211', + b'\xf1\x875QD959655 \xf1\x890388\xf1\x82\x111413001113120006110417121D101D9112', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144F \xf1\x895043\xf1\x82\x0561A01612A0', + b'\xf1\x873Q0909144H \xf1\x895061\xf1\x82\x0566A0J612A1', + b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A00514A1', + b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A01613A1', + b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A0J712A1', + b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571A0J714A1', + b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571A01A16A1', + b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571A0JA15A1', + b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A01A18A1', + b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A02A16A1', + b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A0JA16A1', + b'\xf1\x873QM909144 \xf1\x895072\xf1\x82\x0571A01714A1', + b'\xf1\x875Q0909143K \xf1\x892033\xf1\x820519A9040203', + b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521A00441A1', + b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521A00608A1', + b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521A00641A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521A00442A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521A00642A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521A07B05A1', + b'\xf1\x875Q0909144L \xf1\x891021\xf1\x82\x0521A00502A0', + b'\xf1\x875Q0909144L \xf1\x891021\xf1\x82\x0521A00602A0', + b'\xf1\x875Q0909144L \xf1\x891021\xf1\x82\x0522A00402A0', + b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0511A00403A0', + b'\xf1\x875Q0909144R \xf1\x891061\xf1\x82\x0516A00604A1', + b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516A00404A1', + b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516A00504A1', + b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516A00604A1', + b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516A07A02A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A00407A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A00507A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A07B04A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521A20B03A1', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A2000400', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A2000600', + b'\xf1\x875QD909144B \xf1\x891072\xf1\x82\x0521A00507A1', + b'\xf1\x875QM909144A \xf1\x891072\xf1\x82\x0521A20B03A1', + b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A00442A1', + b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A00642A1', + b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A16A1', + b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A17A1', + b'\xf1\x875QN909144A \xf1\x895081\xf1\x82\x0571A01A18A1', + b'\xf1\x875QN909144B \xf1\x895082\xf1\x82\x0571A01A18A1', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x875Q0907567G \xf1\x890390\xf1\x82\x0101', + b'\xf1\x875Q0907567J \xf1\x890396\xf1\x82\x0101', + b'\xf1\x875Q0907567L \xf1\x890098\xf1\x82\x0101', + b'\xf1\x875Q0907572A \xf1\x890141\xf1\x82\x0101', + b'\xf1\x875Q0907572B \xf1\x890200\xf1\x82\x0101', + b'\xf1\x875Q0907572C \xf1\x890210\xf1\x82\x0101', + b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101', + b'\xf1\x875Q0907572E \xf1\x89X310\xf1\x82\x0101', + b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101', + b'\xf1\x875Q0907572G \xf1\x890571', + b'\xf1\x875Q0907572H \xf1\x890620', + b'\xf1\x875Q0907572J \xf1\x890653', + b'\xf1\x875Q0907572J \xf1\x890654', + b'\xf1\x875Q0907572P \xf1\x890682', + b'\xf1\x875Q0907572R \xf1\x890771', + b'\xf1\x875Q0907572S \xf1\x890780', + ], + }, + CAR.VOLKSWAGEN_GOLF_MK8: { + (Ecu.cornerRadar, 0x74e, None): [ + b'\xf1\x872Q0907686J \xf1\x890288', + ], + (Ecu.adas, 0x769, None): [ + b'\xf1\x875WA980556C \xf1\x890314', + b'\xf1\x875WA980556D \xf1\x890364', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x875WA907572B \xf1\x890395', + b'\xf1\x875WA907572C \xf1\x890461', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x875WA980653C \xf1\x893301', + b'\xf1\x875WA980653D \xf1\x893405', + ], + }, + CAR.VOLKSWAGEN_ID3_MK1: { + (Ecu.inverter, 0x17fc007c, None): [ + b'\xf1\x871EA907121AH\xf1\x896050\xf1\x82010\x00', + ], + (Ecu.engine, 0x17fc0076, None): [ + b'\xf1\x870EA906012DG\xf1\x892604', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x871EA959655CD\xf1\x890366', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x871EA980654L \xf1\x895332', + ], + (Ecu.cornerRadar, 0x74e, None): [ + b'\xf1\x872Q0907686L \xf1\x890289', + ], + (Ecu.adas, 0x769, None): [ + b'\xf1\x871EA907556R \xf1\x890284', + ], + (Ecu.parkingAdas, 0x70a, None): [ + b'\xf1\x871EA919294D \xf1\x890421', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x871EA907572H \xf1\x890234', + ], + }, + CAR.VOLKSWAGEN_ID3_MK2: { + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x871EA980654P \xf1\x895570', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x871EA907567D \xf1\x890250', + ], + }, + CAR.VOLKSWAGEN_ID4_MK1: { + (Ecu.inverter, 0x17fc007c, None): [ + b'\xf1\x871EA907121BE\xf1\x896046\xf1\x82020\x00', + ], + (Ecu.engine, 0x17fc0076, None): [ + b'\xf1\x870EA906012DK\xf1\x892603', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x871EA959655EA\xf1\x890376', + b'\xf1\x875WA959655R \xf1\x890717', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x871EA907144AQ\xf1\x895033\xf1\x82\x000_BH0A0_ON', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x871EA980654L \xf1\x895332', + ], + (Ecu.cornerRadar, 0x74e, None): [ + b'\xf1\x872Q0907686K \xf1\x890289', + ], + (Ecu.adas, 0x769, None): [ + b'\xf1\x871EA980556J \xf1\x890397', + ], + (Ecu.parkingAdas, 0x70a, None): [ + b'\xf1\x871EA919294D \xf1\x890421', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x871EA907572H \xf1\x890234', + ], + }, + CAR.VOLKSWAGEN_ID4_MK2: { + (Ecu.inverter, 0x17fc007c, None): [ + b'\xf1\x870ET907121D \xf1\x897246\xf1\x82010', + ], + (Ecu.engine, 0x17fc0076, None): [ + b'\xf1\x870EA906014DR\xf1\x893630', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x871EA980653G \xf1\x895570', + b'\xf1\x871EA980653B \xf1\x895510', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x871EA907567D \xf1\x890250', + b'\xf1\x871EA907567C \xf1\x890099', + ], + }, + CAR.VOLKSWAGEN_JETTA_MK6: { + (Ecu.srs, 0x715, None): [ + b'\xf1\x875C0959655M \xf1\x890726\xf1\x82\t00NB1108--------24', + b'\xf1\x875K0959655H \xf1\x890724\xf1\x82\t00131108--------02', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0151', + b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0152', + ], + }, + CAR.VOLKSWAGEN_JETTA_MK7: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906024AF\xf1\x899970', + b'\xf1\x8704E906024AK\xf1\x899937', + b'\xf1\x8704E906024AS\xf1\x899912', + b'\xf1\x8704E906024AS\xf1\x899970', + b'\xf1\x8704E906024B \xf1\x895594', + b'\xf1\x8704E906024BC\xf1\x899971', + b'\xf1\x8704E906024BG\xf1\x891057', + b'\xf1\x8704E906024C \xf1\x899970', + b'\xf1\x8704E906024C \xf1\x899971', + b'\xf1\x8704E906024L \xf1\x895595', + b'\xf1\x8704E906024L \xf1\x899970', + b'\xf1\x8704E906027MS\xf1\x896223', + b'\xf1\x8705E906013BN\xf1\x893711', + b'\xf1\x8705E906013DB\xf1\x893361', + b'\xf1\x875G0906259T \xf1\x890003', + b'\xf1\x875G09C0BB02 \xf1\x890003', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927158BQ\xf1\x893545', + b'\xf1\x8709H927158 \xf1\x890515', + b'\xf1\x8709S927158BS\xf1\x893642', + b'\xf1\x8709S927158BS\xf1\x893694', + b'\xf1\x8709S927158CK\xf1\x893770', + b'\xf1\x8709S927158JC\xf1\x894113', + b'\xf1\x8709S927158R \xf1\x893552', + b'\xf1\x8709S927158R \xf1\x893587', + b'\xf1\x870GC300020N \xf1\x892803', + b'\xf1\x870GC300020N \xf1\x892804', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655AG\xf1\x890336\xf1\x82\x1313171231313500314611011530159333463100', + b'\xf1\x875Q0959655AG\xf1\x890336\xf1\x82\x1314171231313500314611011630169333463100', + b'\xf1\x875Q0959655AG\xf1\x890338\xf1\x82\x1314171231313500314611011630169333463100', + b'\xf1\x875Q0959655BM\xf1\x890403\xf1\x82\x1314171231313500314642011650169333463100', + b'\xf1\x875Q0959655BM\xf1\x890403\xf1\x82\x1314171231313500314643011650169333463100', + b'\xf1\x875Q0959655BR\xf1\x890403\xf1\x82\x1311170031313300314240011150119333433100', + b'\xf1\x875Q0959655BR\xf1\x890403\xf1\x82\x1319170031313300314240011550159333463100', + b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1314171231313500314642021650169333613100', + b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1314171231313500314643021650169333613100', + b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1317171231313500314642023050309333613100', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A10A11A1', + b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x000_A1080_OM', + b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A10A01A1', + b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521B00404A1', + b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A00642A1', + b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A10A01A1', + b'\xf1\x875QN909144B \xf1\x895082\xf1\x82\x0571A10A11A1', + b'\xf1\x875QV907144F \xf1\x891122\xf1\x82\x0001A00701]V', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907567B \xf1\x890534', + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x875Q0907572N \xf1\x890681', + b'\xf1\x875Q0907572P \xf1\x890682', + b'\xf1\x875Q0907572R \xf1\x890771', + ], + }, + CAR.VOLKSWAGEN_PASSAT_MK8: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8703N906026E \xf1\x892114', + b'\xf1\x8704E906023AH\xf1\x893379', + b'\xf1\x8704E906023BF\xf1\x893842', + b'\xf1\x8704E906023BM\xf1\x894522', + b'\xf1\x8704L906026DP\xf1\x891538', + b'\xf1\x8704L906026ET\xf1\x891990', + b'\xf1\x8704L906026FP\xf1\x892012', + b'\xf1\x8704L906026GA\xf1\x892013', + b'\xf1\x8704L906026GK\xf1\x899971', + b'\xf1\x8704L906026KD\xf1\x894798', + b'\xf1\x8705L906022A \xf1\x890827', + b'\xf1\x873G0906259 \xf1\x890004', + b'\xf1\x873G0906259B \xf1\x890002', + b'\xf1\x873G0906264 \xf1\x890004', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300041E \xf1\x891006', + b'\xf1\x870CW300042H \xf1\x891601', + b'\xf1\x870CW300042H \xf1\x891607', + b'\xf1\x870CW300043H \xf1\x891601', + b'\xf1\x870CW300048R \xf1\x890610', + b'\xf1\x870D9300013A \xf1\x894905', + b'\xf1\x870D9300014L \xf1\x895002', + b'\xf1\x870D9300018C \xf1\x895297', + b'\xf1\x870D9300041A \xf1\x894801', + b'\xf1\x870D9300042H \xf1\x894901', + b'\xf1\x870DD300045T \xf1\x891601', + b'\xf1\x870DD300046B \xf1\x891601', + b'\xf1\x870DD300046H \xf1\x891601', + b'\xf1\x870DL300011H \xf1\x895201', + b'\xf1\x870GC300042H \xf1\x891404', + b'\xf1\x870GC300043 \xf1\x892301', + b'\xf1\x870GC300046P \xf1\x892805', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655AE\xf1\x890195\xf1\x82\r56140056130012416612124111', + b'\xf1\x873Q0959655AF\xf1\x890195\xf1\x82\r56140056130012026612120211', + b'\xf1\x873Q0959655AN\xf1\x890305\xf1\x82\r58160058140013036914110311', + b'\xf1\x873Q0959655AN\xf1\x890306\xf1\x82\r58160058140013036914110311', + b'\xf1\x873Q0959655BA\xf1\x890195\xf1\x82\r56140056130012416612124111', + b'\xf1\x873Q0959655BA\xf1\x890195\xf1\x82\r56140056130012516612125111', + b'\xf1\x873Q0959655BB\xf1\x890195\xf1\x82\r56140056130012026612120211', + b'\xf1\x873Q0959655BG\xf1\x890712\xf1\x82\x0e5915005914001305701311052900', + b'\xf1\x873Q0959655BJ\xf1\x890703\xf1\x82\x0e5915005914001305701311052900', + b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e5915005914001344701311442900', + b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e5915005914001354701311542900', + b'\xf1\x873Q0959655CN\xf1\x890720\xf1\x82\x0e5915005914001305701311052900', + b'\xf1\x875Q0959655S \xf1\x890870\xf1\x82\x1315120011111200631145171716121691132111', + b'\xf1\x875QF959655S \xf1\x890639\xf1\x82\x13131100131300111111000120----2211114A48', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566B00611A1', + b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566B00711A1', + b'\xf1\x875Q0909143K \xf1\x892033\xf1\x820514B0060703', + b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522B0060803', + b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522B0080803', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820526B0060905', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521B00606A1', + b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516B00501A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521B00603A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521B00703A1', + b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563B0000600', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567B0020600', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x873Q0907572A \xf1\x890126', + b'\xf1\x873Q0907572A \xf1\x890130', + b'\xf1\x873Q0907572B \xf1\x890192', + b'\xf1\x873Q0907572B \xf1\x890194', + b'\xf1\x873Q0907572C \xf1\x890195', + b'\xf1\x873Q0907572C \xf1\x890196', + b'\xf1\x875Q0907572P \xf1\x890682', + b'\xf1\x875Q0907572R \xf1\x890771', + b'\xf1\x875Q0907572S \xf1\x890780', + ], + }, + CAR.VOLKSWAGEN_PASSAT_MK7: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8703L906018RE\xf1\x899979', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x873AA980654D \xf1\x890300\xf1\x82\x0143', + ], + }, + CAR.VOLKSWAGEN_PASSAT_NMS: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8706K906016C \xf1\x899609', + b'\xf1\x8706K906016E \xf1\x899830', + b'\xf1\x8706K906016G \xf1\x891124', + b'\xf1\x8706K906071BJ\xf1\x894891', + b'\xf1\x8706K906071AF\xf1\x894869', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927158AB\xf1\x893318', + b'\xf1\x8709G927158BD\xf1\x893121', + b'\xf1\x8709G927158DK\xf1\x893594', + b'\xf1\x8709G927158FQ\xf1\x893745', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x87561959655 \xf1\x890210\xf1\x82\x1212121111113000102011--121012--101312', + b'\xf1\x87561959655C \xf1\x890508\xf1\x82\x1215141111121100314919--153015--304831', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x87561907567A \xf1\x890132', + b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0152', + ], + }, + CAR.VOLKSWAGEN_PASSAT_NMS_PLUS: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8706K906016J\xf1\x891409', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927158FQ\xf1\x893745', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x87561959655D \xf1\x890508\xf1\x82\x1215141111121100314919--153015--304831', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x87561907567A \xf1\x890132', + b'\xf1\x873QF907572A \xf1\x890132', + ], + }, + CAR.VOLKSWAGEN_PASSAT_B7: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8703L906018RE\xf1\x899979', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x873AA980654D \xf1\x890300\xf1\x82\x0143', + ], + }, + CAR.VOLKSWAGEN_POLO_MK6: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704C906025H \xf1\x895177', + b'\xf1\x8705C906032J \xf1\x891702', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300042D \xf1\x891612', + b'\xf1\x870CW300050D \xf1\x891908', + b'\xf1\x870CW300051G \xf1\x891909', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x872Q0959655AG\xf1\x890248\xf1\x82\x1218130411110411--04040404231811152H14', + b'\xf1\x872Q0959655AJ\xf1\x890250\xf1\x82\x1248130411110416--04040404784811152H14', + b'\xf1\x872Q0959655AS\xf1\x890411\xf1\x82\x1384830511110516041405820599841215391471', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x872Q1909144M \xf1\x896041', + b'\xf1\x872Q2909144AB\xf1\x896050', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572R \xf1\x890372', + ], + }, + CAR.VOLKSWAGEN_SHARAN_MK2: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704L906016HE\xf1\x894635', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x877N0959655D \xf1\x890016\xf1\x82\x0801100705----10--', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0153', + ], + }, + CAR.SEAT_ALHAMBRA_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704L906016HE\xf1\x894635', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x877N0959655D \xf1\x890016\xf1\x82\x0801100705----10--', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0153', + ], + }, + CAR.VOLKSWAGEN_TAOS_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906025CK\xf1\x892228', + b'\xf1\x8704E906027NJ\xf1\x891445', + b'\xf1\x8704E906027NP\xf1\x891286', + b'\xf1\x8705E906013BD\xf1\x892496', + b'\xf1\x8705E906013DF\xf1\x893365', + b'\xf1\x8705E906013E \xf1\x891624', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927158EM\xf1\x893812', + b'\xf1\x8709S927158BL\xf1\x893791', + b'\xf1\x8709S927158CR\xf1\x893924', + b'\xf1\x8709S927158DN\xf1\x893946', + b'\xf1\x8709S927158FF\xf1\x893876', + b'\xf1\x8709S927158HM\xf1\x894112', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1311111111333500314646021450149333613100', + b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1312111111333500314646021550159333613100', + b'\xf1\x875Q0959655CE\xf1\x890421\xf1\x82\x1311110011333300314240021350139333613100', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x001O06081OOM', + b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521060405A1', + b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521060605A1', + b'\xf1\x875QV907144F \xf1\x891122\xf1\x82\x0001060801]V', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907567B \xf1\x890534', + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.VOLKSWAGEN_TCROSS_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704C906025AK\xf1\x897053', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300050E \xf1\x891903', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x872Q0959655AJ\xf1\x890250\xf1\x82\x1212130411110411--04041104141311152H14', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x872Q1909144M \xf1\x896041', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.VOLKSWAGEN_TIGUAN_MK2: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8703N906026D \xf1\x893680', + b'\xf1\x8704E906024AP\xf1\x891461', + b'\xf1\x8704E906027NB\xf1\x899504', + b'\xf1\x8704L906026EJ\xf1\x893661', + b'\xf1\x8704L906026EJ\xf1\x893916', + b'\xf1\x8704L906026KR\xf1\x893919', + b'\xf1\x8704L906027G \xf1\x899893', + b'\xf1\x8705E906018BS\xf1\x890914', + b'\xf1\x8705L906022GL\xf1\x892112', + b'\xf1\x875N0906259 \xf1\x890002', + b'\xf1\x875NA906259H \xf1\x890002', + b'\xf1\x875NA907115E \xf1\x890003', + b'\xf1\x875NA907115E \xf1\x890005', + b'\xf1\x875NA907115J \xf1\x890002', + b'\xf1\x875NA907115K \xf1\x890004', + b'\xf1\x8783A907115 \xf1\x890007', + b'\xf1\x8783A907115B \xf1\x890005', + b'\xf1\x8783A907115F \xf1\x890002', + b'\xf1\x8783A907115G \xf1\x890001', + b'\xf1\x8783A907115K \xf1\x890001', + b'\xf1\x8783A907115K \xf1\x890002', + b'\xf1\x8783A907115Q \xf1\x890001', + b'\xf1\x8783A907115Q \xf1\x890002', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927158DS\xf1\x893699', + b'\xf1\x8709G927158DT\xf1\x893698', + b'\xf1\x8709G927158FM\xf1\x893757', + b'\xf1\x8709G927158GC\xf1\x893821', + b'\xf1\x8709G927158GD\xf1\x893820', + b'\xf1\x8709G927158GM\xf1\x893936', + b'\xf1\x8709G927158GN\xf1\x893938', + b'\xf1\x8709G927158HB\xf1\x894069', + b'\xf1\x8709G927158HC\xf1\x894070', + b'\xf1\x870D9300043 \xf1\x895202', + b'\xf1\x870DD300046K \xf1\x892302', + b'\xf1\x870DL300011N \xf1\x892001', + b'\xf1\x870DL300011N \xf1\x892012', + b'\xf1\x870DL300011N \xf1\x892014', + b'\xf1\x870DL300012M \xf1\x892107', + b'\xf1\x870DL300012N \xf1\x892110', + b'\xf1\x870DL300012P \xf1\x892103', + b'\xf1\x870DL300013A \xf1\x893005', + b'\xf1\x870DL300013G \xf1\x892119', + b'\xf1\x870DL300013G \xf1\x892120', + b'\xf1\x870DL300014C \xf1\x893703', + b'\xf1\x870GC300013P \xf1\x892401', + b'\xf1\x870GC300018R \xf1\x892802', + b'\xf1\x870GC300046Q \xf1\x892802', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655AG\xf1\x890336\xf1\x82\x1316143231313500314617011730179333423100', + b'\xf1\x875Q0959655AG\xf1\x890338\xf1\x82\x1316143231313500314617011730179333423100', + b'\xf1\x875Q0959655AR\xf1\x890317\xf1\x82\x1331310031333334313132573732379333313100', + b'\xf1\x875Q0959655BJ\xf1\x890336\xf1\x82\x1311140031333300314232583632369333423100', + b'\xf1\x875Q0959655BJ\xf1\x890336\xf1\x82\x1312110031333300314232583732379333423100', + b'\xf1\x875Q0959655BJ\xf1\x890339\xf1\x82\x1331310031333334313132013730379333423100', + b'\xf1\x875Q0959655BK\xf1\x890339\xf1\x82\x1331310031333334313132573732379333423100', + b'\xf1\x875Q0959655BM\xf1\x890403\xf1\x82\x1316143231313500314641011750179333423100', + b'\xf1\x875Q0959655BS\xf1\x890403\xf1\x82\x1312110031333300314240013750379333423100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1312110031333300314240583752379333423100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1331310031333334313140013750379333423100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1331310031333334313140573752379333423100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1331310031333336313140013950399333423100', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1331310031333336313140573952399333423100', + b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1316143231313500314647021750179333613100', + b'\xf1\x875Q0959655CD\xf1\x890421\xf1\x82\x13123112313333003145406F6154619333613100', + b'\xf1\x875Q0959655CG\xf1\x890421\xf1\x82\x1331310031333300314240024050409333613100', + b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x13121100313333003142405G3754379333613100', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820529A6060603', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527A6050705', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527A6070705', + b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521A60803A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521A60604A1', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A6000600', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A6017A00', + b'\xf1\x875QF909144 \xf1\x895572\xf1\x82\x0571A60833A1', + b'\xf1\x875QF909144A \xf1\x895581\xf1\x82\x0571A60834A1', + b'\xf1\x875QF909144B \xf1\x895582\xf1\x82\x0571A60634A1', + b'\xf1\x875QF909144B \xf1\x895582\xf1\x82\x0571A62A32A1', + b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x002RA60A2ROM', + b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x002SA6092SOM', + b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A60604A1', + b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A60804A1', + b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A60604A1', + b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A60804A1', + b'\xf1\x875QV907144F \xf1\x891122\xf1\x82\x0001A6CA01]V', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907567B \xf1\x890534', + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572AB\xf1\x890397', + b'\xf1\x872Q0907572J \xf1\x890156', + b'\xf1\x872Q0907572M \xf1\x890233', + b'\xf1\x872Q0907572Q \xf1\x890342', + b'\xf1\x872Q0907572R \xf1\x890372', + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.VOLKSWAGEN_TOURAN_MK2: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906025BE\xf1\x890720', + b'\xf1\x8704E906027HQ\xf1\x893746', + b'\xf1\x8704L906026HM\xf1\x893017', + b'\xf1\x8705E906018CQ\xf1\x890808', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300020A \xf1\x891936', + b'\xf1\x870CW300041E \xf1\x891005', + b'\xf1\x870CW300041Q \xf1\x891606', + b'\xf1\x870CW300051M \xf1\x891926', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x1336350021353335314132014730479333313100', + b'\xf1\x875Q0959655AS\xf1\x890318\xf1\x82\x13363500213533353141324C4732479333313100', + b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1336350021353336314740025250529333613100', + b'\xf1\x875QD959655AJ\xf1\x890421\xf1\x82\x1336350021313300314240023330339333663100', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820531B0062105', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567A8090400', + b'\xf1\x875QD909144F \xf1\x891082\xf1\x82\x0521A00642A1', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x873Q0907572C \xf1\x890195', + b'\xf1\x875Q0907572R \xf1\x890771', + ], + }, + CAR.VOLKSWAGEN_TRANSPORTER_T61: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704L906056AG\xf1\x899970', + b'\xf1\x8704L906056AL\xf1\x899970', + b'\xf1\x8704L906057AP\xf1\x891186', + b'\xf1\x8704L906057N \xf1\x890413', + b'\xf1\x8705L906023E \xf1\x891352', + b'\xf1\x8705L906023MR\xf1\x892582', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870BT300012E \xf1\x893105', + b'\xf1\x870BT300012G \xf1\x893102', + b'\xf1\x870BT300046R \xf1\x893102', + b'\xf1\x870DV300012B \xf1\x893701', + b'\xf1\x870DV300012B \xf1\x893702', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x872Q0959655AE\xf1\x890506\xf1\x82\x1316170411110411--04041704161611152S1411', + b'\xf1\x872Q0959655AE\xf1\x890506\xf1\x82\x1316170411110411--04041704171711152S1411', + b'\xf1\x872Q0959655AF\xf1\x890506\xf1\x82\x1316171111110411--04041711121211152S1413', + b'\xf1\x872Q0959655AQ\xf1\x890511\xf1\x82\x1316170411110411--0404170426261215391421', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x877LA909144F \xf1\x897150\xf1\x82\x0532380518A2', + b'\xf1\x877LA909144F \xf1\x897150\xf1\x82\x05323A5519A2', + b'\xf1\x877LA909144G \xf1\x897160\xf1\x82\x05333A5519A2', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572R \xf1\x890372', + ], + }, + CAR.VOLKSWAGEN_TROC_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8705E906018AT\xf1\x899640', + b'\xf1\x8705E906018CK\xf1\x890863', + b'\xf1\x8705E906018P \xf1\x896020', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300041S \xf1\x891615', + b'\xf1\x870CW300050J \xf1\x891911', + b'\xf1\x870CW300051M \xf1\x891925', + b'\xf1\x870CW300051M \xf1\x891928', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655BH\xf1\x890712\xf1\x82\x0e1111001111001105111111052900', + b'\xf1\x875Q0959655BT\xf1\x890403\xf1\x82\x1311110012333300314240681152119333463100', + b'\xf1\x875Q0959655CF\xf1\x890421\xf1\x82\x1311110012333300314240021150119333613100', + b'\xf1\x875Q0959655CG\xf1\x890421\xf1\x82\x13111100123333003142404M1152119333613100', + b'\xf1\x875Q0959655CG\xf1\x890421\xf1\x82\x13111100123333003142404M1154119333613100', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521060403A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521060405A1', + b'\xf1\x875WA907144M \xf1\x891051\xf1\x82\x001T06081T7N', + b'\xf1\x875WA907144Q \xf1\x891063\xf1\x82\x001O06081OOM', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572M \xf1\x890233', + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.AUDI_A3_MK3: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906023AN\xf1\x893695', + b'\xf1\x8704E906023AR\xf1\x893440', + b'\xf1\x8704E906023BL\xf1\x895190', + b'\xf1\x8704E906027CJ\xf1\x897798', + b'\xf1\x8704L997022N \xf1\x899459', + b'\xf1\x875G0906259A \xf1\x890004', + b'\xf1\x875G0906259D \xf1\x890002', + b'\xf1\x875G0906259L \xf1\x890002', + b'\xf1\x875G0906259Q \xf1\x890002', + b'\xf1\x875G0906259Q \xf1\x890007', + b'\xf1\x878V0906259E \xf1\x890001', + b'\xf1\x878V0906259F \xf1\x890002', + b'\xf1\x878V0906259H \xf1\x890002', + b'\xf1\x878V0906259J \xf1\x890002', + b'\xf1\x878V0906259K \xf1\x890001', + b'\xf1\x878V0906259K \xf1\x890002', + b'\xf1\x878V0906264B \xf1\x890003', + b'\xf1\x878V0907115B \xf1\x890007', + b'\xf1\x878V0907404A \xf1\x890005', + b'\xf1\x878V0907404G \xf1\x890004', + b'\xf1\x878V0907404G \xf1\x890005', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300044T \xf1\x895245', + b'\xf1\x870CW300048 \xf1\x895201', + b'\xf1\x870D9300012 \xf1\x894912', + b'\xf1\x870D9300012 \xf1\x894931', + b'\xf1\x870D9300012K \xf1\x894513', + b'\xf1\x870D9300012L \xf1\x894521', + b'\xf1\x870D9300013B \xf1\x894902', + b'\xf1\x870D9300013B \xf1\x894931', + b'\xf1\x870D9300014Q \xf1\x895006', + b'\xf1\x870D9300041N \xf1\x894512', + b'\xf1\x870D9300043T \xf1\x899699', + b'\xf1\x870DD300046 \xf1\x891604', + b'\xf1\x870DD300046A \xf1\x891602', + b'\xf1\x870DD300046F \xf1\x891602', + b'\xf1\x870DD300046G \xf1\x891601', + b'\xf1\x870DL300012E \xf1\x892012', + b'\xf1\x870DL300012H \xf1\x892112', + b'\xf1\x870GC300011 \xf1\x890403', + b'\xf1\x870GC300013M \xf1\x892402', + b'\xf1\x870GC300042J \xf1\x891402', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655AB\xf1\x890388\xf1\x82\x111111001111111206110412111321139114', + b'\xf1\x875Q0959655AM\xf1\x890315\xf1\x82\x1311111111111111311411011231129321212100', + b'\xf1\x875Q0959655AM\xf1\x890318\xf1\x82\x1311111111111112311411011531159321212100', + b'\xf1\x875Q0959655AR\xf1\x890315\xf1\x82\x1311110011131115311211012331239321212100', + b'\xf1\x875Q0959655BJ\xf1\x890339\xf1\x82\x1311110011131100311111011731179321342100', + b'\xf1\x875Q0959655J \xf1\x890825\xf1\x82\x13111112111111--171115141112221291163221', + b'\xf1\x875Q0959655J \xf1\x890825\xf1\x82\x13111112111111--241115141112221291163221', + b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13111112111111--241115141112221291163221', + b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13121111111111--341117141212231291163221', + b'\xf1\x875Q0959655J \xf1\x890830\xf1\x82\x13121111111211--261117141112231291163221', + b'\xf1\x875Q0959655N \xf1\x890361\xf1\x82\x111212001112110004110411111421149114', + b'\xf1\x875Q0959655N \xf1\x890361\xf1\x82\x111212001112111104110411111521159114', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144F \xf1\x895043\xf1\x82\x0561G01A13A0', + b'\xf1\x873Q0909144H \xf1\x895061\xf1\x82\x0566G0HA14A1', + b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566G0HA14A1', + b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571G01A16A1', + b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571G0HA16A1', + b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571G0JA13A1', + b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571G0JA14A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521G0G809A1', + b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0503G00303A0', + b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0503G00803A0', + b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0503G0G803A0', + b'\xf1\x875Q0909144R \xf1\x891061\xf1\x82\x0516G00804A1', + b'\xf1\x875Q0909144S \xf1\x891063\xf1\x82\x0516G00804A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521G00807A1', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x875Q0907567M \xf1\x890398\xf1\x82\x0101', + b'\xf1\x875Q0907567N \xf1\x890400\xf1\x82\x0101', + b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101', + b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101', + b'\xf1\x875Q0907572G \xf1\x890571', + b'\xf1\x875Q0907572H \xf1\x890620', + b'\xf1\x875Q0907572P \xf1\x890682', + ], + }, + CAR.AUDI_A4_MK4: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x878K5907115M \xf1\x890005', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x878K0959655P \xf1\x890610\xf1\x82\x040E0D050G', + ], + }, + CAR.AUDI_Q2_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906027JT\xf1\x894145', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300041F \xf1\x891006', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655BD\xf1\x890336\xf1\x82\x1311111111111100311211011231129321312111', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144K \xf1\x895072\xf1\x82\x0571F60511A1', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572M \xf1\x890233', + ], + }, + CAR.AUDI_Q3_MK2: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8705E906018N \xf1\x899970', + b'\xf1\x8705L906022M \xf1\x890901', + b'\xf1\x8783A906259 \xf1\x890001', + b'\xf1\x8783A906259 \xf1\x890005', + b'\xf1\x8783A906259C \xf1\x890002', + b'\xf1\x8783A906259D \xf1\x890001', + b'\xf1\x8783A906259F \xf1\x890001', + b'\xf1\x8783A906259H \xf1\x890002', + b'\xf1\x8783A907115P \xf1\x890002', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8709G927158CN\xf1\x893608', + b'\xf1\x8709G927158FL\xf1\x893758', + b'\xf1\x8709G927158GG\xf1\x893825', + b'\xf1\x8709G927158GP\xf1\x893937', + b'\xf1\x8709G927158HC\xf1\x894070', + b'\xf1\x8709G927158HG\xf1\x894168', + b'\xf1\x870GC300045D \xf1\x892802', + b'\xf1\x870GC300046F \xf1\x892701', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655BF\xf1\x890403\xf1\x82\x1321211111211200311121232152219321422111', + b'\xf1\x875Q0959655BQ\xf1\x890421\xf1\x82\x132121111121120031112124218A219321532111', + b'\xf1\x875Q0959655BQ\xf1\x890421\xf1\x82\x132121111121120031112124218C219321532111', + b'\xf1\x875Q0959655CC\xf1\x890421\xf1\x82\x131111111111120031111224118A119321532111', + b'\xf1\x875Q0959655CC\xf1\x890421\xf1\x82\x131111111111120031111237116A119321532111', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567G6000300', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567G6000800', + b'\xf1\x875QF909144B \xf1\x895582\xf1\x82\x0571G60533A1', + b'\xf1\x875QF909144B \xf1\x895582\xf1\x82\x0571G60733A1', + b'\xf1\x875QS907145E \xf1\x891122\xf1\x82\x0001G67801]V', + b'\xf1\x875TA907145D \xf1\x891051\xf1\x82\x001PG60A1P7N', + b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x002VG60A2VOM', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907567C \xf1\x890541', + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572R \xf1\x890372', + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.AUDI_Q4_MK2: { + (Ecu.inverter, 0x17fc007c, None): [ + b'\xf1\x870ET907121G \xf1\x897260\xf1\x82040', + ], + (Ecu.engine, 0x17fc0076, None): [ + b'\xf1\x870EA906014GC\xf1\x894064', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x871EA980654M \xf1\x895556', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x871EA907567B \xf1\x890232', + ], + }, + CAR.AUDI_Q5_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x878R0907115N \xf1\x890006', + b'\xf1\x878R0907551F \xf1\x890007', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x878R0927158D \xf1\x891010', + b'\xf1\x878R0927158AM\xf1\x891003', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x878R0959655F \xf1\x890610\xf1\x82\x050304010402', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x878R0909144R \xf1\x890511\xf1\x82\x01\n\x1a', + b'\xf1\x878R0909144F \xf1\x890507\xf1\x82\x01\t\xe6', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x878R0907561A\x00\xf1\x890410\xf1\x80100', + ], + }, + CAR.PORSCHE_MACAN_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8795B906259BJ\xf1\x890001', + b'\xf1\x8795B906259BM\xf1\x890001', + b'\xf1\x8795B90652013\xf1\x893485', + b'\xf1\x8795B90654002\xf1\x893495', + b'\xf1\x8795B907551AD\xf1\x890001', + b'\xf1\x8795B907551D \xf1\x890006', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x8795B927156CE\xf1\x890022', + b'\xf1\x8795B927156JH\xf1\x890001', + b'\xf1\x8795B927156KD\xf1\x890001', + b'\xf1\x8795B927156KK\xf1\x890001', + b'\xf1\x8795B927156KP\xf1\x890001', + b'\xf1\x8795B927156R \xf1\x890021', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x05065Q033513', + b'\xf1\x8795B959655F \xf1\x890130\xf1\x82\x050682033514', + b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506B1033514', + b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506CG033517', + b'\xf1\x8795B959655G \xf1\x890150\xf1\x82\x0506CJ02D417', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04#\x04#', + b'\xf1\x8795B909144K \xf1\x891902\xf1\x82\x02\x04/\x04/', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x8795B907567B\x00\xf1\x890800\xf1\x82108', + b'\xf1\x8795B907567G\x00\xf1\x890410\xf1\x82104', + b'\xf1\x8795B907567H\x00\xf1\x890430\xf1\x82104', + b'\xf1\x8795B907567J \xf1\x890440\xf1\x82104', + ], + }, + CAR.SEAT_ATECA_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906027KA\xf1\x893749', + b'\xf1\x8704L906021EL\xf1\x897542', + b'\xf1\x8704L906026BP\xf1\x891198', + b'\xf1\x8704L906026BP\xf1\x897608', + b'\xf1\x8704L906056CR\xf1\x892181', + b'\xf1\x8704L906056CR\xf1\x892797', + b'\xf1\x8705E906018AS\xf1\x899596', + b'\xf1\x8781A906259B \xf1\x890003', + b'\xf1\x878V0906264H \xf1\x890005', + b'\xf1\x878V0907115E \xf1\x890002', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300041D \xf1\x891004', + b'\xf1\x870CW300041G \xf1\x891003', + b'\xf1\x870CW300050J \xf1\x891908', + b'\xf1\x870D9300014S \xf1\x895202', + b'\xf1\x870D9300042M \xf1\x895016', + b'\xf1\x870GC300014P \xf1\x892801', + b'\xf1\x870GC300043A \xf1\x892304', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655AC\xf1\x890189\xf1\x82\r11110011110011021511110200', + b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r11110011110011021511110200', + b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r12110012120012021612110200', + b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1212001211001305121211052900', + b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1312001313001305171311052900', + b'\xf1\x873Q0959655BH\xf1\x890712\xf1\x82\x0e1312001313001305171311052900', + b'\xf1\x873Q0959655CM\xf1\x890720\xf1\x82\x0e1312001313001305171311052900', + b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100110200--1113121149', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571N60511A1', + b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521N01842A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521N01342A1', + b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0511N01805A0', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521N01309A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521N05808A1', + b'\xf1\x875WA907145M \xf1\x891051\xf1\x82\x0013N619137N', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572M \xf1\x890233', + b'\xf1\x875Q0907572B \xf1\x890200\xf1\x82\x0101', + b'\xf1\x875Q0907572H \xf1\x890620', + b'\xf1\x875Q0907572K \xf1\x890402\xf1\x82\x0101', + b'\xf1\x875Q0907572P \xf1\x890682', + b'\xf1\x875Q0907572R \xf1\x890771', + ], + }, + CAR.SEAT_LEON_MK4: { + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW906556JA\xf1\x890780', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x871EA959655CK\xf1\x890166', + ], + (Ecu.cornerRadar, 0x74e, None): [ + b'\xf1\x872Q0907686E \xf1\x890284', + ], + (Ecu.adas, 0x769, None): [ + b'\xf1\x875WA980556D \xf1\x890344', + ], + (Ecu.parkingAdas, 0x70a, None): [ + b'\xf1\x875WA919298A \xf1\x890230', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x875WA907572B \xf1\x890395', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x875WA980653A \xf1\x893129', + ], + }, + CAR.CUPRA_BORN_MK1: { + (Ecu.inverter, 0x17fc007c, None): [ + b'\xf1\x871EA907121AJ\xf1\x893510\xf1\x8201S\x00', + ], + (Ecu.engine, 0x17fc0076, None): [ + b'\xf1\x870EA906012EC\xf1\x892855', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x871EA959655EH\xf1\x890381', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x871EA907144AQ\xf1\x895033', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x871EA980654L \xf1\x895332', + ], + (Ecu.cornerRadar, 0x74e, None): [ + b'\xf1\x872Q0907686L \xf1\x890289', + ], + (Ecu.adas, 0x769, None): [ + b'\xf1\x871EA980556J \xf1\x890397', + ], + (Ecu.parkingAdas, 0x70a, None): [ + b'\xf1\x871EA919294D \xf1\x890421', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x871EA907572H \xf1\x890234', + ], + }, + CAR.SKODA_ENYAQ_MK1: { + (Ecu.srs, 0x715, None): [ + b'\xf1\x871EA959655EA\xf1\x890376', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x871EA980654L \xf1\x895332', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x871EA907572H \xf1\x890234', + ], + }, + CAR.SKODA_ENYAQ_MK2: { + (Ecu.inverter, 0x17fc007c, None): [ + b'\xf1\x870ET907121G \xf1\x897260\xf1\x82040', + ], + (Ecu.engine, 0x17fc0076, None): [ + b'\xf1\x870EA906014FS\xf1\x894051', + ], + (Ecu.fwdCamera, 0x74f, None): [ + b'\xf1\x871EA980654M \xf1\x895556', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x871EA907567B \xf1\x890232', + ], + }, + CAR.SKODA_FABIA_MK4: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8705C906032L \xf1\x891701', + b'\xf1\x8705E906018CF\xf1\x891905', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300051G \xf1\x891906', + b'\xf1\x870CW300051M \xf1\x891936', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875QF959655AF\xf1\x890753\xf1\x82\x13111100111100111111001102----1111120749', + b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100110200--1111120749', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x872Q1909144S \xf1\x896042', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.SKODA_KAMIQ_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704C906025AK\xf1\x897053', + b'\xf1\x8705C906032M \xf1\x891333', + b'\xf1\x8705C906032M \xf1\x892365', + b'\xf1\x8705E906013CK\xf1\x892540', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300020 \xf1\x891906', + b'\xf1\x870CW300020 \xf1\x891907', + b'\xf1\x870CW300020T \xf1\x892204', + b'\xf1\x870CW300050 \xf1\x891709', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x872Q0959655AJ\xf1\x890250\xf1\x82\x1211110411110411--04040404131111112H14', + b'\xf1\x872Q0959655AM\xf1\x890351\xf1\x82\x12111104111104112104040404111111112H14', + b'\xf1\x872Q0959655AM\xf1\x890351\xf1\x82\x122221042111042121040404042E2711152H14', + b'\xf1\x872Q0959655AS\xf1\x890411\xf1\x82\x1311150411110411210404040417151215391413', + b'\xf1\x872Q0959655BJ\xf1\x890412\xf1\x82\x132223042111042121040404042B251215391423', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x872Q1909144AB\xf1\x896050', + b'\xf1\x872Q1909144M \xf1\x896041', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572R \xf1\x890372', + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.SKODA_KAROQ_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8705E906013CL\xf1\x892541', + b'\xf1\x8705E906013H \xf1\x892407', + b'\xf1\x8705E906018P \xf1\x895472', + b'\xf1\x8705E906018P \xf1\x896020', + b'\xf1\x8705L906022BS\xf1\x890913', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300020T \xf1\x892202', + b'\xf1\x870CW300041S \xf1\x891615', + b'\xf1\x870GC300014L \xf1\x892802', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1213001211001101131112012100', + b'\xf1\x873Q0959655BH\xf1\x890712\xf1\x82\x0e1213001211001101131122012100', + b'\xf1\x873Q0959655DE\xf1\x890731\xf1\x82\x0e1213001211001101131121012J00', + b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1312110012120011111100010200--2521210749', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563T6090500', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100500', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100600', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100700', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572AB\xf1\x890397', + b'\xf1\x872Q0907572M \xf1\x890233', + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.SKODA_KODIAQ_MK1: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906027DD\xf1\x893123', + b'\xf1\x8704E906027LD\xf1\x893433', + b'\xf1\x8704E906027NB\xf1\x896517', + b'\xf1\x8704E906027NB\xf1\x899504', + b'\xf1\x8704L906026DE\xf1\x895418', + b'\xf1\x8704L906026EJ\xf1\x893661', + b'\xf1\x8704L906026HT\xf1\x893617', + b'\xf1\x8705E906018DJ\xf1\x890915', + b'\xf1\x8705E906018DJ\xf1\x891903', + b'\xf1\x8705L906022GM\xf1\x893411', + b'\xf1\x875NA906259E \xf1\x890003', + b'\xf1\x875NA907115D \xf1\x890003', + b'\xf1\x875NA907115E \xf1\x890003', + b'\xf1\x875NA907115E \xf1\x890005', + b'\xf1\x8783A907115E \xf1\x890001', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870D9300014S \xf1\x895201', + b'\xf1\x870D9300043 \xf1\x895202', + b'\xf1\x870DL300011N \xf1\x892014', + b'\xf1\x870DL300012G \xf1\x892006', + b'\xf1\x870DL300012M \xf1\x892107', + b'\xf1\x870DL300012N \xf1\x892110', + b'\xf1\x870DL300013G \xf1\x892119', + b'\xf1\x870GC300014N \xf1\x892801', + b'\xf1\x870GC300018S \xf1\x892803', + b'\xf1\x870GC300019H \xf1\x892806', + b'\xf1\x870GC300046Q \xf1\x892802', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655AN\xf1\x890306\xf1\x82\r11110011110011031111310311', + b'\xf1\x873Q0959655AP\xf1\x890306\xf1\x82\r11110011110011421111314211', + b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1213001211001205212111052100', + b'\xf1\x873Q0959655BJ\xf1\x890703\xf1\x82\x0e1213001211001205212111052100', + b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e1213001211001244212111442100', + b'\xf1\x873Q0959655CN\xf1\x890720\xf1\x82\x0e1213001211001205212112052100', + b'\xf1\x873Q0959655CQ\xf1\x890720\xf1\x82\x0e1213111211001205212112052111', + b'\xf1\x873Q0959655DJ\xf1\x890731\xf1\x82\x0e1513001511001205232113052J00', + b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100010200--1121240749', + b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100010200--1121246149', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6050405', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6060405', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820527T6070405', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T600G500', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T600G600', + b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x0025T6BA25OM', + b'\xf1\x875TA907145F \xf1\x891063\xf1\x82\x002LT61A2LOM', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', + b'\xf1\x872Q0907572AB\xf1\x890397', + b'\xf1\x872Q0907572M \xf1\x890233', + b'\xf1\x872Q0907572Q \xf1\x890342', + b'\xf1\x872Q0907572R \xf1\x890372', + b'\xf1\x872Q0907572T \xf1\x890383', + ], + }, + CAR.SKODA_OCTAVIA_MK3: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704C906025L \xf1\x896198', + b'\xf1\x8704C906026AB\xf1\x892993', + b'\xf1\x8704E906016ER\xf1\x895823', + b'\xf1\x8704E906027HD\xf1\x893742', + b'\xf1\x8704E906027MH\xf1\x894786', + b'\xf1\x8704L906021DT\xf1\x898127', + b'\xf1\x8704L906021ER\xf1\x898361', + b'\xf1\x8704L906026BP\xf1\x897608', + b'\xf1\x8704L906026BS\xf1\x891541', + b'\xf1\x8704L906026BT\xf1\x897612', + b'\xf1\x875G0906259C \xf1\x890002', + b'\xf1\x875G0906259N \xf1\x890003', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300041L \xf1\x891601', + b'\xf1\x870CW300041N \xf1\x891605', + b'\xf1\x870CW300043B \xf1\x891601', + b'\xf1\x870CW300043P \xf1\x891605', + b'\xf1\x870CW300049M \xf1\x890901', + b'\xf1\x870D9300012H \xf1\x894518', + b'\xf1\x870D9300014T \xf1\x895221', + b'\xf1\x870D9300041C \xf1\x894936', + b'\xf1\x870D9300041H \xf1\x895220', + b'\xf1\x870D9300041J \xf1\x894902', + b'\xf1\x870D9300041P \xf1\x894507', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x873Q0959655AC\xf1\x890200\xf1\x82\r11120011100010022212110200', + b'\xf1\x873Q0959655AK\xf1\x890306\xf1\x82\r31210031210021033733310331', + b'\xf1\x873Q0959655AP\xf1\x890305\xf1\x82\r11110011110011213331312131', + b'\xf1\x873Q0959655AQ\xf1\x890200\xf1\x82\r11120011100010312212113100', + b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r11120011100010022212110200', + b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e3221003221002105755331052100', + b'\xf1\x873Q0959655BK\xf1\x890703\xf1\x82\x0e3221003221002132755331322100', + b'\xf1\x873Q0959655CM\xf1\x890720\xf1\x82\x0e3221003221002105755331052100', + b'\xf1\x873Q0959655CN\xf1\x890720\xf1\x82\x0e3221003221002105755331052100', + b'\xf1\x875QD959655 \xf1\x890388\xf1\x82\x111101000011110006110411111111119111', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x873Q0909144J \xf1\x895063\xf1\x82\x0566A01513A1', + b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571T01512A1', + b'\xf1\x875Q0909144AA\xf1\x891081\xf1\x82\x0521T00403A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521T00403A1', + b'\xf1\x875Q0909144AB\xf1\x891082\xf1\x82\x0521T00603A1', + b'\xf1\x875Q0909144R \xf1\x891061\xf1\x82\x0516A00604A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521T00401A1', + b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521T00601A1', + b'\xf1\x875QD909144E \xf1\x891081\xf1\x82\x0521T00503A1', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x875Q0907567P \xf1\x890100\xf1\x82\x0101', + b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101', + b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101', + b'\xf1\x875Q0907572H \xf1\x890620', + b'\xf1\x875Q0907572J \xf1\x890654', + b'\xf1\x875Q0907572K \xf1\x890402\xf1\x82\x0101', + b'\xf1\x875Q0907572P \xf1\x890682', + b'\xf1\x875Q0907572R \xf1\x890771', + ], + }, + CAR.SKODA_SUPERB_MK3: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906027BS\xf1\x892887', + b'\xf1\x8704E906027BT\xf1\x899042', + b'\xf1\x8704L906026ET\xf1\x891343', + b'\xf1\x8704L906026ET\xf1\x891990', + b'\xf1\x8704L906026FP\xf1\x891196', + b'\xf1\x8704L906026KA\xf1\x896014', + b'\xf1\x8704L906026KB\xf1\x894071', + b'\xf1\x8704L906026KD\xf1\x894798', + b'\xf1\x8704L906026MT\xf1\x893076', + b'\xf1\x8705L906022BK\xf1\x899971', + b'\xf1\x873G0906259 \xf1\x890004', + b'\xf1\x873G0906259B \xf1\x890002', + b'\xf1\x873G0906259L \xf1\x890003', + b'\xf1\x873G0906264A \xf1\x890002', + ], + (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x870CW300042H \xf1\x891601', + b'\xf1\x870CW300043B \xf1\x891603', + b'\xf1\x870CW300049Q \xf1\x890906', + b'\xf1\x870D9300011T \xf1\x894801', + b'\xf1\x870D9300012 \xf1\x894940', + b'\xf1\x870D9300013A \xf1\x894905', + b'\xf1\x870D9300014K \xf1\x895006', + b'\xf1\x870D9300041H \xf1\x894905', + b'\xf1\x870D9300042M \xf1\x895013', + b'\xf1\x870D9300043F \xf1\x895202', + b'\xf1\x870GC300013K \xf1\x892403', + b'\xf1\x870GC300014M \xf1\x892801', + b'\xf1\x870GC300019G \xf1\x892803', + b'\xf1\x870GC300043 \xf1\x892301', + b'\xf1\x870GC300046D \xf1\x892402', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x875Q0959655AE\xf1\x890130\xf1\x82\x12111200111121001121110012211292221111', + b'\xf1\x875Q0959655AE\xf1\x890130\xf1\x82\x12111200111121001121118112231292221111', + b'\xf1\x875Q0959655AK\xf1\x890130\xf1\x82\x12111200111121001121110012211292221111', + b'\xf1\x875Q0959655AS\xf1\x890317\xf1\x82\x1331310031313100313131823133319331313100', + b'\xf1\x875Q0959655AT\xf1\x890317\xf1\x82\x1331310031313100313131013131319331313100', + b'\xf1\x875Q0959655BH\xf1\x890336\xf1\x82\x1331310031313100313131013141319331413100', + b'\xf1\x875Q0959655BK\xf1\x890336\xf1\x82\x1331310031313100313131013141319331413100', + b'\xf1\x875Q0959655BS\xf1\x890403\xf1\x82\x1333310031313100313152015351539331423100', + b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x1331310031313100313151013141319331423100', + b'\xf1\x875Q0959655CA\xf1\x890403\xf1\x82\x1331310031313100313151823143319331423100', + b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1333310031313100313152025350539331463100', + b'\xf1\x875Q0959655CH\xf1\x890421\xf1\x82\x1333310031313100313152855372539331463100', + ], + (Ecu.eps, 0x712, None): [ + b'\xf1\x875Q0909143K \xf1\x892033\xf1\x820514UZ070203', + b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522UZ050303', + b'\xf1\x875Q0909143M \xf1\x892041\xf1\x820522UZ070303', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820526UZ060505', + b'\xf1\x875Q0909143P \xf1\x892051\xf1\x820526UZ070505', + b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563UZ060600', + b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563UZ060700', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567UZ070500', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567UZ070600', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567UZ070700', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x873Q0907572B \xf1\x890192', + b'\xf1\x873Q0907572B \xf1\x890194', + b'\xf1\x873Q0907572C \xf1\x890195', + b'\xf1\x875Q0907572R \xf1\x890771', + b'\xf1\x875Q0907572S \xf1\x890780', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/interface.py b/artifacts/package_runtime/iqdbc/car/volkswagen/interface.py new file mode 100644 index 000000000..f77a1913b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/interface.py @@ -0,0 +1,385 @@ +import time + +from iqdbc.car import get_safety_config, structs, uds +from iqdbc.car.carlog import carlog +from iqdbc.car.interfaces import CarInterfaceBase +from iqdbc.car.isotp_parallel_query import IsoTpParallelQuery +from iqdbc.car.volkswagen.carcontroller import CarController +from iqdbc.car.volkswagen.carstate import CarState +from iqdbc.car.volkswagen.values import ( + CAR, CanBus, DashcamOnlyReason, MLB_ACC_COORDINATOR_MSGS, MLB_GEARBOX_MSGS, MLB_MSG_ACC_10, + MLB_MSG_GATEWAY_05, MLB_MSG_LH_EPS_03, NetworkLocation, RADAR_DISABLE_STATE, TransmissionType, + VolkswagenFlags, VolkswagenSafetyFlags, VolkswagenFlagsIQ, get_longitudinal_stopping_speed_override, +) +from iqdbc.car.volkswagen.radar_interface import RadarInterface +import sys +import os +iqpilot_path = os.path.join(os.path.dirname(__file__), '..', '..', '..') +sys.path.insert(0, iqpilot_path) +try: + from iqpilot.common.params import Params +except ImportError: + pass + +try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module +except Exception: + import_verified_module = None + + +class CarInterface(CarInterfaceBase): + CarState = CarState + CarController = CarController + RadarInterface = RadarInterface + + DRIVABLE_GEARS = (structs.CarState.GearShifter.eco, structs.CarState.GearShifter.sport, + structs.CarState.GearShifter.manumatic, structs.CarState.GearShifter.neutral) + + @staticmethod + def _get_params(ret: structs.CarParams, candidate: CAR, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams: + ret.brand = "volkswagen" + ret.radarUnavailable = True + _params = Params() + angle_lat_enabled = _params.get_bool("AngleLateralControl") + joystick_mode = _params.get_bool("JoystickDebugMode") + + if ret.flags & VolkswagenFlags.PQ: + # Set global PQ35/PQ46/NMS parameters + safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenPq)] + if candidate == CAR.SEAT_ALHAMBRA_MK1: + ret.flags |= VolkswagenFlagsIQ.IQ_PQ_TIMEBOMB.value + if not (ret.flags & VolkswagenFlagsIQ.IQ_PQ_TIMEBOMB) and _params.get_bool("VwPqEpsPatched"): + ret.minSteerSpeed = 0 + if angle_lat_enabled: + ret.flags |= VolkswagenFlagsIQ.IQ_LVBS_ALC_MODULE.value + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_ALC_MODULE.value + if alpha_long: + ret.flags |= VolkswagenFlagsIQ.IQ_PQ_SNG_ECD.value + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_SNG_ECD.value + ret.enableBsm = 0x3BA in fingerprint[0] # SWA_1 + + if 0x440 in fingerprint[0] or docs: # Getriebe_1 + ret.transmissionType = TransmissionType.automatic + else: + ret.transmissionType = TransmissionType.manual + + # Auto-detect CC only mode by checking for ACC / AWV presence + # ACC_System = 0x368, ACC_GRA_Anzeige = 0x56A, AWV = 0x366 + has_acc = 0x368 in fingerprint[0] or 0x56A in fingerprint[0] + if not has_acc: + has_radar = 0x366 in fingerprint[0] # AWV for FCW/AEB + if has_radar: + ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY.value + else: + ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR.value + + cc_only_flags = VolkswagenFlagsIQ.IQ_CC_ONLY | VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR + if ret.flags & cc_only_flags: + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_NO_CAM_BUS.value + if (ret.flags & cc_only_flags) and not fingerprint[0]: + ret.flags |= VolkswagenFlagsIQ.IQ_PQ_LOWLINE.value + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_LOWLINE.value + + if any(msg in fingerprint[1] for msg in (0x1A0, 0xC2)): # Bremse_1, Lenkwinkel_1 + ret.networkLocation = NetworkLocation.gateway + else: + ret.networkLocation = NetworkLocation.fwdCamera + + ret.dashcamOnly = False + + elif ret.flags & VolkswagenFlags.MLB: + # Set global MLB parameters + safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMlb)] + ret.enableBsm = 0x30F in fingerprint[0] # SWA_01 + ret.networkLocation = NetworkLocation.gateway + ret.transmissionType = TransmissionType.automatic + ret.dashcamOnly = False + + ecan_msgs = fingerprint[0] | fingerprint[2] + fingerprinted = bool(ecan_msgs or fingerprint[1]) + + if fingerprinted and not ecan_msgs: + ret.flags |= VolkswagenFlagsIQ.IQ_MLB_NO_ECAN.value + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.MLB_NO_ECAN.value + ret.dashcamOnly = True + + has_acc = any(msg in ecan_msgs for msg in MLB_ACC_COORDINATOR_MSGS) + if fingerprinted and not has_acc: + if MLB_MSG_ACC_10 in ecan_msgs: + ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY.value + else: + ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR.value + + pt_msgs = fingerprint[1] if ret.flags & VolkswagenFlagsIQ.IQ_MLB_NO_ECAN else ecan_msgs + + if fingerprinted and MLB_MSG_LH_EPS_03 not in pt_msgs: + ret.flags |= VolkswagenFlagsIQ.IQ_MLB_NO_HCA_EPS.value + + all_msgs = ecan_msgs | fingerprint[1] + gearbox_seen = any(msg in all_msgs for msg in MLB_GEARBOX_MSGS) + transmission_ecu = any(fw.ecu == structs.CarParams.Ecu.transmission for fw in car_fw) + reverse_switch_seen = MLB_MSG_GATEWAY_05 in fingerprint[1] + if fingerprinted and not gearbox_seen and not transmission_ecu and reverse_switch_seen: + ret.transmissionType = TransmissionType.manual + + elif ret.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + if ret.flags & VolkswagenFlags.MEB: + safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMeb)] + else: + safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagenMqbEvo)] + + if ret.flags & VolkswagenFlags.MEB_GEN2: + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.ALT_CRC_VARIANT_1.value + if ret.flags & VolkswagenFlags.MQB_EVO: + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.NO_GAS_OFFSET.value + + ret.enableBsm = 0x24C in fingerprint[0] # MEB_Side_Assist_01 + ret.transmissionType = TransmissionType.direct + ret.steerControlType = structs.CarParams.SteerControlType.curvatureDEPRECATED + ret.steerAtStandstill = True + + if any(msg in fingerprint[1] for msg in (0x520, 0x86, 0xFD, 0x13D)): # Airbag_02, LWI_01, ESP_21, QFK_01 + ret.networkLocation = NetworkLocation.gateway + else: + ret.networkLocation = NetworkLocation.fwdCamera + + if ret.networkLocation == NetworkLocation.gateway: + ret.radarUnavailable = False + + if ret.networkLocation == NetworkLocation.fwdCamera: + ret.flags |= VolkswagenFlags.DISABLE_RADAR.value + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.DISABLE_RADAR.value + + if ret.flags & VolkswagenFlags.MQB_EVO and 0x30B in fingerprint[0]: + ret.flags |= VolkswagenFlags.KOMBI_PRESENT.value + if 0x25D in fingerprint[0]: # KLR_01 + ret.flags |= VolkswagenFlags.STOCK_KLR_PRESENT.value + if all(msg in fingerprint[1] for msg in (0x462, 0x463, 0x464)): # PSD_04, PSD_05, PSD_06 + ret.flags |= VolkswagenFlags.STOCK_PSD_PRESENT.value + if 0x464 in fingerprint[0]: # PSD_06 + ret.flags |= VolkswagenFlags.STOCK_PSD_06_PRESENT.value + if 0x6B2 in fingerprint[0]: # Diagnose_01 + ret.flags |= VolkswagenFlags.STOCK_DIAGNOSE_01_PRESENT.value + if 0x3DC in fingerprint[0]: # Gateway_73 + ret.flags |= VolkswagenFlags.ALT_GEAR.value + + else: + # Set global MQB parameters + safety_configs = [get_safety_config(structs.CarParams.SafetyModel.volkswagen)] + ret.enableBsm = 0x30F in fingerprint[0] # SWA_01 + + if 0xAD in fingerprint[0] or docs: # Getriebe_11 + ret.transmissionType = TransmissionType.automatic + elif 0x187 in fingerprint[0]: # Motor_EV_01 + ret.transmissionType = TransmissionType.direct + else: + ret.transmissionType = TransmissionType.manual + + if any(msg in fingerprint[1] for msg in (0x40, 0x86, 0xB2, 0xFD)): # Airbag_01, LWI_01, ESP_19, ESP_21 + ret.networkLocation = NetworkLocation.gateway + else: + ret.networkLocation = NetworkLocation.fwdCamera + + if 0x126 in fingerprint[2]: # HCA_01 + ret.flags |= VolkswagenFlags.STOCK_HCA_PRESENT.value + if 0x6B8 in fingerprint[0]: # Kombi_03 + ret.flags |= VolkswagenFlags.KOMBI_PRESENT.value + + # Auto-detect CC only mode by checking for ACC_06/ACC_07 presence + # ACC_06 = 0x122, ACC_07 = 0x12E, ACC_10 = 0x117 + has_acc = 0x122 in fingerprint[0] or 0x12E in fingerprint[0] + if not has_acc: + has_radar = 0x117 in fingerprint[0] # ACC_10 for FCW/AEB + if has_radar: + ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY.value + else: + ret.flags |= VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR.value + + # Global lateral tuning defaults, can be overridden per-vehicle + + ret.steerLimitTimer = 0.4 + if ret.flags & VolkswagenFlags.PQ: + ret.steerActuatorDelay = 0.2 + ret.longitudinalTuning.kf = 1.2 + ret.longitudinalTuning.kpBP = [0.] + ret.longitudinalTuning.kpV = [.45] + ret.longitudinalTuning.kiBP = [0.] + ret.longitudinalTuning.kiV = [.69] + ret.longitudinalActuatorDelay = 0.6 + if angle_lat_enabled: + ret.steerControlType = structs.CarParams.SteerControlType.angle + ret.steerAtStandstill = bool(joystick_mode) + else: + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + elif ret.flags & VolkswagenFlags.MLB: + ret.steerActuatorDelay = 0.2 + if angle_lat_enabled: + ret.steerControlType = structs.CarParams.SteerControlType.angle + ret.steerAtStandstill = bool(joystick_mode) + else: + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + elif ret.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + ret.steerActuatorDelay = 0.3 + else: + ret.steerActuatorDelay = 0.1 + if angle_lat_enabled: + ret.steerControlType = structs.CarParams.SteerControlType.angle + ret.steerAtStandstill = bool(joystick_mode) + else: + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + # Global longitudinal tuning defaults, can be overridden per-vehicle + + if ret.flags & VolkswagenFlags.MEB: + ret.longitudinalActuatorDelay = 0.5 + ret.radarDelay = 0.8 + ret.longitudinalTuning.kiBP = [0., 30.] + ret.longitudinalTuning.kiV = [0.4, 0.] + + ret.alphaLongitudinalAvailable = ret.networkLocation == NetworkLocation.gateway or docs or bool(ret.flags & VolkswagenFlags.DISABLE_RADAR) + + if ret.flags & VolkswagenFlags.MLB and ret.flags & (VolkswagenFlagsIQ.IQ_CC_ONLY | VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR): + ret.alphaLongitudinalAvailable = False + alpha_long = False + + if alpha_long: + # Proof-of-concept, prep for E2E only. No radar points available. Panda ALLOW_DEBUG firmware required. + ret.openpilotLongitudinalControl = True + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.LONG_CONTROL.value + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED.value + if ret.transmissionType == TransmissionType.manual: + ret.minEnableSpeed = 4.5 + + # Per-vehicle overrides + + if candidate == CAR.PORSCHE_MACAN_MK1: + ret.steerActuatorDelay = 0.07 + + if candidate in (CAR.VOLKSWAGEN_PASSAT_B7, CAR.SEAT_ALHAMBRA_MK1): + ret.flags |= VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB.value + safety_configs[0].safetyParam |= VolkswagenSafetyFlags.PQ_ACC_FTS_EPB.value + + ret.pcmCruise = not ret.openpilotLongitudinalControl + ret.stopAccel = -0.55 + ret.autoResumeSng = ret.minEnableSpeed == -1 + CAN = CanBus(fingerprint=fingerprint) + if CAN.pt >= 4: + safety_configs.insert(0, get_safety_config(structs.CarParams.SafetyModel.noOutput)) + ret.safetyConfigs = safety_configs + + return ret + + @staticmethod + def pre_init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv, can_send): + if not (CP.flags & VolkswagenFlags.PQ) or (CP.flags & VolkswagenFlagsIQ.IQ_PQ_TIMEBOMB) or import_verified_module is None: + return + try: + params = Params() + if params.get_bool("VwPqEpsPatched"): + return + flasher = import_verified_module("iqpilot_hephaestusd_private", "iqpilot_private.konn3kt.hephaestus.vw_pq_flasher") + status = flasher.check_eps_patch_status(1, can_recv, can_send) + except Exception: + return + if status == "patched": + params.put_bool("VwPqEpsPatched", True) + + @staticmethod + def init(CP: structs.CarParams, CP_IQ: structs.IQCarParams, can_recv, can_send): + # Disable radar via UDS programming session so openpilot can take over longitudinal. + # The radar stops transmitting AWV_03/Strukturen_01 and carcontroller replaces those messages. + if CP.openpilotLongitudinalControl and (CP.flags & VolkswagenFlags.DISABLE_RADAR): + RADAR_DISABLE_STATE["error"] = False + if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + if CarInterface._is_engine_state_allowed_meb(can_recv): + carlog.warning("VW MEB/MQBevo: disabling radar for longitudinal control") + if not CarInterface._radar_communication_control(CP, can_recv, can_send): + RADAR_DISABLE_STATE["error"] = True + else: + RADAR_DISABLE_STATE["error"] = True + carlog.warning("VW MEB/MQBevo: radar cannot be disabled — engine is on") + + @staticmethod + def deinit(CP: structs.CarParams, can_recv, can_send): + # Re-enable radar TX on exit (currently never called by openpilot, car recovers after ignition cycle) + if CP.openpilotLongitudinalControl and (CP.flags & VolkswagenFlags.DISABLE_RADAR): + if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + CarInterface._radar_communication_control(CP, can_recv, can_send, disable=False) + + @staticmethod + def _radar_communication_control(CP, can_recv, can_send, disable=True) -> bool: + # Send UDS commands to put the radar (addr 0x757) into programming session, + # which silences its CAN TX so openpilot can send replacement messages. + bus = CanBus(CP).pt + addr_radar = 0x757 + addr_diag = 0x700 # Functional address for TesterPresent broadcast + vw_rx_offset = 0x6A + + tp_req = bytes([uds.SERVICE_TYPE.TESTER_PRESENT, 0x00]) + tp_resp = bytes([uds.SERVICE_TYPE.TESTER_PRESENT + 0x40, 0x00]) + ext_diag_req = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC]) + ext_diag_resp = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL + 0x40, uds.SESSION_TYPE.EXTENDED_DIAGNOSTIC]) + flash_req = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, uds.SESSION_TYPE.PROGRAMMING]) + empty_resp = b'' + + txt = "disable" if disable else "enable" + + for attempt in range(3): + try: + if disable: + # Step 1: TesterPresent — wake up the radar + query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)], + [tp_req], [tp_resp], vw_rx_offset, functional_addrs=[addr_diag]) + if not query.get_data(0.5): + carlog.warning(f"VW radar {txt}: TesterPresent no response on attempt {attempt + 1}") + continue + + # Step 2: Extended diagnostic session + query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)], + [ext_diag_req], [ext_diag_resp], vw_rx_offset) + if not query.get_data(0.5): + carlog.warning(f"VW radar {txt}: ExtendedDiagSession no response on attempt {attempt + 1}") + continue + + # Step 3: Programming session — radar stops transmitting + query = IsoTpParallelQuery(can_send, can_recv, bus, [(addr_radar, None)], + [flash_req], [empty_resp], vw_rx_offset) + query.get_data(0) # fire-and-forget, no wait needed + carlog.warning(f"VW radar {txt}: programming session sent on attempt {attempt + 1}") + + return True + + except Exception as e: + carlog.error(f"VW radar {txt}: exception on attempt {attempt + 1}: {repr(e)}") + continue + + carlog.error(f"VW radar {txt}: all attempts failed") + return False + + @staticmethod + def _is_engine_state_allowed_meb(can_recv, timeout: float = 0.5) -> bool: + # Read Motor_54 (0x14C) to check Engine_On bit before attempting radar disable. + # Programming session is rejected by radar when engine is running. + end_time = time.monotonic() + timeout + while time.monotonic() < end_time: + packets = can_recv(wait_for_one=True) or [] + for packet in packets: + for msg in packet: + if msg.address != 0x14C: + continue + engine_on = bool((msg.dat[9] >> 5) & 0x01) + if engine_on: + carlog.warning(f"VW radar disable: engine is on, skipping") + return False + else: + carlog.warning(f"VW radar disable: engine is off, proceeding") + return True + carlog.warning("VW radar disable: Motor_54 not seen within timeout, assuming allowed") + return True + + @staticmethod + def _get_params_iq(stock_cp: structs.CarParams, ret: structs.IQCarParams, candidate, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], alpha_long: bool, is_release_iq: bool, docs: bool) -> structs.IQCarParams: + ret.longitudinalStoppingSpeedOverride = get_longitudinal_stopping_speed_override(candidate, stock_cp.flags) + override_excluded_platforms = VolkswagenFlags.MLB | VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO + ret.longActiveWithGasOverride = alpha_long and not bool(stock_cp.flags & override_excluded_platforms) + return ret diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/mebcan.py b/artifacts/package_runtime/iqdbc/car/volkswagen/mebcan.py new file mode 100644 index 000000000..05de04a8a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/mebcan.py @@ -0,0 +1,401 @@ +from iqdbc.car.volkswagen.mebutils import map_speed_to_acc_tempolimit +from iqdbc.car.volkswagen.values import VolkswagenFlags +from iqdbc.car.volkswagen.speed_limit_manager import PSD_TYPE_CURV_SPEED +from iqdbc.car.common.conversions import Conversions as CV + +ACCEL_INACTIVE = 3.01 +ACCEL_OVERRIDE = 0.00 + +ACC_CTRL_ERROR = 6 +ACC_CTRL_OVERRIDE = 4 +ACC_CTRL_ACTIVE = 3 +ACC_CTRL_ENABLED = 2 +ACC_CTRL_DISABLED = 0 + +ACC_HMS_RAMP_RELEASE = 5 +ACC_HMS_RELEASE = 4 +ACC_HMS_HOLD = 1 +ACC_HMS_NO_REQUEST = 0 +ACC_HMS_RAMP_FRAMES = 5 +ACC_HMS_RELEASE_SPEED = 5 * CV.KPH_TO_MS + +ACC_HUD_ERROR = 6 +ACC_HUD_OVERRIDE = 4 +ACC_HUD_ACTIVE = 3 +ACC_HUD_ENABLED = 2 +ACC_HUD_DISABLED = 0 + + +def create_steering_control(packer, bus, apply_curvature, lkas_enabled, power): + values = { + "Curvature": abs(apply_curvature), # in rad/m + "Curvature_VZ": 1 if apply_curvature > 0 and lkas_enabled else 0, + "Power": power if lkas_enabled else 0, + "RequestStatus": 4 if lkas_enabled else 2, + "HighSendRate": lkas_enabled, + } + return packer.make_can_msg("HCA_03", bus, values) + + +def create_eps_update(packer, bus, eps_stock_values, ea_simulated_torque): + values = {s: eps_stock_values[s] for s in [ + "COUNTER", # Sync counter value to EPS output + "EPS_Lenkungstyp", # EPS rack type + "EPS_Berechneter_LW", # Absolute raw steering angle + "EPS_VZ_BLW", # Raw steering angle sign + "EPS_HCA_Status", # EPS HCA control status + ]} + + values.update({ + # Absolute driver torque input and sign, with EA inactivity mitigation + "EPS_Lenkmoment": abs(ea_simulated_torque), + "EPS_VZ_Lenkmoment": 1 if ea_simulated_torque < 0 else 0, + }) + + return packer.make_can_msg("LH_EPS_03", bus, values) + + +def create_blinker_control(packer, bus, ea_hud_stock_values, ea_control_stock_values, left_blinker, right_blinker, hide_error, counter=None): + values = {s: ea_hud_stock_values[s] for s in [ + "COUNTER", + "EA_Texte", + "ACF_Lampe_Hands_Off", + "EA_Infotainment_Anf", + "EA_Tueren_Anf", + "EA_Innenraumlicht_Anf", + "zFAS_Warnblinken", + "STP_Primaeranz", + "EA_Bremslichtblinken", + "EA_Blinken", + "EA_Unknown", + ]} + + if counter is not None: + values["COUNTER"] = counter + + if ea_hud_stock_values["EA_Blinken"] == 0: + values.update({ + "EA_Blinken": 1 if left_blinker else (2 if right_blinker else ea_hud_stock_values["EA_Blinken"]), + }) + + if hide_error and ea_control_stock_values["EA_Funktionsstatus"] in (0, 1, 7, 8): + values.update({ + "EA_Texte": 0, + "EA_Unknown": 1, + }) + + return packer.make_can_msg("EA_02", bus, values) + + +def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control, sound_alert): + display_mode = 1 if lat_active else 0 # travel assist style showing yellow lanes when op is active + + values = {} + if len(ldw_stock_values): + values = {s: ldw_stock_values[s] for s in [ + "LDW_SW_Warnung_links", # Blind spot in warning mode on left side due to lane departure + "LDW_SW_Warnung_rechts", # Blind spot in warning mode on right side due to lane departure + "LDW_Seite_DLCTLC", # Direction of most likely lane departure (left or right) + "LDW_DLC", # Lane departure, distance to line crossing + "LDW_TLC", # Lane departure, time to line crossing + ]} + + values.update({ + "LDW_Gong": sound_alert, + "LDW_Status_LED_gelb": 1 if lat_active and steering_pressed else 0, + "LDW_Status_LED_gruen": 1 if lat_active and not steering_pressed else 0, + "LDW_Lernmodus_links": 3 + display_mode if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible + display_mode, + "LDW_Lernmodus_rechts": 3 + display_mode if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible + display_mode, + "LDW_Texte": hud_alert, + }) + return packer.make_can_msg("LDW_02", bus, values) + + +def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False, up=False, down=False, set_button=False): + values = {s: gra_stock_values[s] for s in [ + "GRA_Hauptschalter", # ACC button, on/off + "GRA_Typ_Hauptschalter", # ACC main button type + "GRA_Codierung", # ACC button configuration/coding + "GRA_Tip_Stufe_2", # unknown related to stalk type + "GRA_ButtonTypeInfo", # unknown related to stalk type + ]} + + values.update({ + "COUNTER": (gra_stock_values["COUNTER"] + 1) % 16, + "GRA_Abbrechen": cancel, + "GRA_Tip_Wiederaufnahme": resume or up, + "GRA_Tip_Setzen": down, + }) + return packer.make_can_msg("GRA_ACC_01", bus, values) + + +def create_capacitive_wheel_touch(packer, bus, lat_active, klr_stock_values): + values = {s: klr_stock_values[s] for s in [ + "COUNTER", + "KLR_Touchintensitaet_1", + "KLR_Touchintensitaet_2", + "KLR_Touchintensitaet_3", + "KLR_Touchauswertung", + ]} + + if lat_active: + values.update({ + "COUNTER": (klr_stock_values["COUNTER"] + 1) % 16, + "KLR_Touchintensitaet_1": 80, + "KLR_Touchintensitaet_2": 200, + "KLR_Touchintensitaet_3": 10, + "KLR_Touchauswertung": 10, + }) + return packer.make_can_msg("KLR_01", bus, values) + + +def acc_control_value(main_switch_on, acc_faulted, long_active, override): + + if acc_faulted: + acc_control = ACC_CTRL_ERROR # error state + elif long_active: + if override: + acc_control = ACC_CTRL_OVERRIDE # overriding + else: + acc_control = ACC_CTRL_ACTIVE # active long control state + elif main_switch_on: + acc_control = ACC_CTRL_ENABLED # long control ready + else: + acc_control = ACC_CTRL_DISABLED # long control deactivated state + + return acc_control + + +def acc_hold_type(main_switch_on, acc_faulted, long_active, starting, stopping, esp_hold, v_ego, + prev_acc_hold_type, ramp_counter): + # warning: car is reacting to hold mechanic even with long control off + # HALTEN or ANFAHREN straight to KEINE_ANFORDERUNG faults the car into park, so a ramp always sits + # in between: going inactive ramps for a fixed time, and a release while engaged ramps until the + # car is actually rolling + active = long_active and not acc_faulted + + if not active: + if ramp_counter > 0: + acc_hold_type = ACC_HMS_RAMP_RELEASE + ramp_counter -= 1 + else: + acc_hold_type = ACC_HMS_NO_REQUEST + else: + was_active = ramp_counter == ACC_HMS_RAMP_FRAMES + ramp_counter = ACC_HMS_RAMP_FRAMES + + if stopping: + acc_hold_type = ACC_HMS_HOLD + elif starting: + acc_hold_type = ACC_HMS_RELEASE + else: + releasing = was_active and prev_acc_hold_type in (ACC_HMS_HOLD, ACC_HMS_RELEASE, ACC_HMS_RAMP_RELEASE) + if releasing and v_ego < ACC_HMS_RELEASE_SPEED: + acc_hold_type = ACC_HMS_RAMP_RELEASE + else: + acc_hold_type = ACC_HMS_NO_REQUEST + + return acc_hold_type, ramp_counter + + +def create_acc_accel_control(packer, bus, CP, acc_type, acc_enabled, upper_jerk, lower_jerk, upper_control_limit, lower_control_limit, + accel, acc_control, acc_hold_type, stopping, starting, esp_hold, speed, override, travel_assist_available): + # active longitudinal control disables one pedal driving (regen mode) while using overriding mechnism + # error mitigation when stopping or stopped: (newer gen cars can be very sensitive) + # - send 0 m stopping distance for cars in kind of parameterized stopping mode (stopping accel -0.2 seen for those cars) + # -> this mode is seen for different cars with same firmware radars so could be a coded operational mode + # - jerk and control limits values set to 0 when fully stopped + # - set accel to 0 / no stop accel for full stop (seems to be compatible with old (non 0 stop accel) and new gen, because HMS state holds the car anyways) + # - stopping command sent as long as actually stopping + commands = [] + + terminal_rollout = 0.5 if CP.flags & VolkswagenFlags.MQB_EVO else 0 + + full_stop = stopping and esp_hold + full_stop_no_start = esp_hold and not starting + actually_stopping = stopping and not esp_hold + + if acc_enabled: + if override: # the car expects a non inactive accel while overriding + acceleration = ACCEL_OVERRIDE # original ACC still sends active accel in this case (seamless experience) + elif full_stop: + acceleration = ACCEL_INACTIVE # inactive accel, newer gen >2024 error of not neutral value + else: + acceleration = accel + else: + acceleration = ACCEL_INACTIVE # inactive accel + + values = { + "ACC_Typ": acc_type, + "ACC_Status_ACC": acc_control, + "ACC_StartStopp_Info": acc_enabled, + "ACC_Sollbeschleunigung_02": acceleration, + "ACC_zul_Regelabw_unten": lower_control_limit if acc_control in (ACC_CTRL_ACTIVE, ACC_CTRL_OVERRIDE) and not full_stop_no_start else 0, + "ACC_zul_Regelabw_oben": upper_control_limit if acc_control in (ACC_CTRL_ACTIVE, ACC_CTRL_OVERRIDE) and not full_stop_no_start else 0, + "ACC_neg_Sollbeschl_Grad_02": lower_jerk if acc_control in (ACC_CTRL_ACTIVE, ACC_CTRL_OVERRIDE) and not full_stop_no_start else 0, + "ACC_pos_Sollbeschl_Grad_02": upper_jerk if acc_control in (ACC_CTRL_ACTIVE, ACC_CTRL_OVERRIDE) and not full_stop_no_start else 0, + "ACC_Anfahren": starting, + "ACC_Anhalten": 1 if actually_stopping else 0, + "ACC_Anhalteweg": terminal_rollout if actually_stopping else 20.46, # if used the car can execute a hard brake probably if target is too close + "ACC_Anforderung_HMS": acc_hold_type, + "ACC_AKTIV_regelt": 1 if acc_control == ACC_CTRL_ACTIVE else 0, + "Speed": speed, + "SET_ME_0XFE": 0xFE, + "SET_ME_0X1": 0x1, + "SET_ME_0X9": 0x9, + } + + if CP.flags & VolkswagenFlags.MEB_GEN2: + values.update({ + "SET_ME_0x2FE": 0x2FE, # unclear if neccessary + }) + + commands.append(packer.make_can_msg("ACC_18", bus, values)) + + if travel_assist_available: + # satisfy car to prevent errors when pressing Travel Assist Button + values_ta = { + "Travel_Assist_Status": 4 if acc_enabled else 2, + "Travel_Assist_Request": 0, + "Travel_Assist_Available": 1, + } + + commands.append(packer.make_can_msg("TA_01", bus, values_ta)) + + return commands + + +def acc_hud_status_value(main_switch_on, acc_faulted, long_active, override): + + if acc_faulted: + acc_hud_control = ACC_HUD_ERROR # error state + elif long_active: + if override: + acc_hud_control = ACC_HUD_OVERRIDE # overriding + else: + acc_hud_control = ACC_HUD_ACTIVE # active + elif main_switch_on: + acc_hud_control = ACC_HUD_ENABLED # inactive + else: + acc_hud_control = ACC_HUD_DISABLED # deactivated + + return acc_hud_control + + +def acc_hud_event(acc_hud_control, esp_hold, speed_limit_predicative, speed_limit_predicative_type, speed_limit): + acc_event = 0 + + if esp_hold and acc_hud_control == ACC_HUD_ACTIVE: + acc_event = 3 # acc ready message at standstill + elif acc_hud_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) and speed_limit_predicative: + if speed_limit_predicative_type == PSD_TYPE_CURV_SPEED: + acc_event = 6 # acc limited by curve (predicative) + else: + acc_event = 4 # acc limited by speed limit by nav (predicative) + elif acc_hud_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) and speed_limit: + acc_event = 5 # acc limited by speed limit by camera (recently detected) + + return acc_event + + +def get_desired_gap(distance_bars, desired_gap, current_gap_signal): + # mapping desired gap to correct signal of corresponding distance bar + gap = 0 + + if distance_bars == current_gap_signal: + gap = desired_gap + + return gap + + +def create_acc_hud_control(packer, bus, acc_control, set_speed, lead_visible, distance_bars, show_distance_bars, esp_hold, distance, desired_gap, fcw_alert, acc_event, speed_limit): + + values = { + "ACC_Status_ACC": acc_control, + "ACC_Tempolimit": map_speed_to_acc_tempolimit(speed_limit) if acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # display speed limits (message type defined by ACC_Events) + "ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36, + "ACC_Gesetzte_Zeitluecke": distance_bars, # 5 distance bars available (3 are used by OP) + "ACC_Display_Prio": 0 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 1, # probably keeping warning in front + "ACC_Optischer_Fahrerhinweis": 1 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # enables optical warning + "ACC_Akustischer_Fahrerhinweis": 3 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # enables sound warning + "ACC_Texte_Zusatzanz_02": 11 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # type of warning: Break! + "ACC_Abstandsindex_02": 569, # seems to be default for MEB but is not static in every case + "ACC_EGO_Fahrzeug": 2 if fcw_alert and acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else (1 if acc_control == ACC_HUD_ACTIVE else 0), # red car warn symbol for fcw + "Lead_Type_Detected": 1 if lead_visible else 0, # object should be displayed + "Lead_Type": 3 if lead_visible else 0, # displaying a car + "Lead_Distance": distance if lead_visible else 0, # hud distance of object + "ACC_Enabled": 1 if acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, + "ACC_Standby_Override": 1 if acc_control != ACC_HUD_ACTIVE else 0, + "Street_Color": 1 if acc_control in (ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # light grey (1) or dark (0) street + "Lead_Brightness": 3 if acc_control == ACC_HUD_ACTIVE else 0, # object shows in colour + "ACC_Events": acc_event, # e.g. pACC Events + "ACC_Event_Wunschgeschw": speed_limit * CV.MS_TO_KPH, # this speed is shown for curve event speeds, not for speed signs (speed signs in "ACC_Tempolimit") + "Zeitluecke_1": get_desired_gap(distance_bars, desired_gap, 1), # desired distance to lead object for distance bar 1 + "Zeitluecke_2": get_desired_gap(distance_bars, desired_gap, 2), # desired distance to lead object for distance bar 2 + "Zeitluecke_3": get_desired_gap(distance_bars, desired_gap, 3), # desired distance to lead object for distance bar 3 + "Zeitluecke_4": get_desired_gap(distance_bars, desired_gap, 4), # desired distance to lead object for distance bar 4 + "Zeitluecke_5": get_desired_gap(distance_bars, desired_gap, 5), # desired distance to lead object for distance bar 5 + "Zeitluecke_Farbe": 1 if acc_control in (ACC_HUD_ENABLED, ACC_HUD_ACTIVE, ACC_HUD_OVERRIDE) else 0, # yellow (1) or white (0) time gap + "ACC_Anzeige_Zeitluecke": show_distance_bars if acc_control != ACC_HUD_DISABLED else 0, # show distance bar selection + "SET_ME_0X1": 0x1, # unknown + "SET_ME_0X6A": 0x6A, # unknown + "SET_ME_0XFFFF": 0xFFFF, # unknown + "SET_ME_0X7FFF": 0x7FFF, # unknown + } + + return packer.make_can_msg("MEB_ACC_01", bus, values) + + +def create_ea_control(packer, bus): + values = { + "EA_Funktionsstatus": 1, # Configured but disabled + "EA_Sollbeschleunigung": 2046, # Inactive value + } + + return packer.make_can_msg("EA_01", bus, values) + + +def create_ea_hud(packer, bus): + values = { + "EA_Unknown": 1, # Undocumented, value when inactive + } + + return packer.make_can_msg("EA_02", bus, values) + + +def create_aeb_control(packer, bus, CP): + # Replacement for radar-generated AWV_03 when radar is disabled via UDS programming session. + # Sends inactive/safe default values so downstream ECUs don't fault. + values = { + "SET_ME_63": 63, + "SET_ME_30": 30, + "SET_ME_127": 127, + "SET_ME_127_2": 127, + "SET_ME_63_2": 63, + "SET_ME_15_1": 15, + "SET_ME_255": 255, + "SET_ME_1023": 1023, + "SET_ME_1": 1, + } + if CP.flags & VolkswagenFlags.MQB_EVO: + values.update({"SET_ME_1_2": 1}) + return packer.make_can_msg("AWV_03", bus, values) + + +def create_aeb_hud(packer, bus, disabled): + # Replacement for radar-generated MEB_AWV_01 HUD message. + # When disabled=True (shortly after radar disable), shows AEB-unavailable state. + # When disabled=False (steady state), shows AEB active to prevent dash warnings. + values = { + "AWV_Enabled": not disabled, + "AWV_Init": 1, + "SET_ME_1": 1, + "SET_ME_511": 511, + } + return packer.make_can_msg("MEB_AWV_01", bus, values) + + +def create_radar_objects(packer, bus): + # Send empty MEB_Distance_01 (radar object list at 0x24F) to prevent ECU faults when radar is silent. + # Note: infinitecable2 calls this "Strukturen_01"; IQPilot DBC names it "MEB_Distance_01". + return packer.make_can_msg("MEB_Distance_01", bus, {}) diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/mebutils.py b/artifacts/package_runtime/iqdbc/car/volkswagen/mebutils.py new file mode 100644 index 000000000..0fe157b1d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/mebutils.py @@ -0,0 +1,274 @@ +import numpy as np + +from iqdbc.car.common.filter_simple import FirstOrderFilter +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.common.pid import PIDController +from iqdbc.car import DT_CTRL + + +class LongControlJerk(): + JERK_LIMIT_MIN = 0.5 + JERK_LIMIT_MIN_NO_LEAD = 0.7 + JERK_LIMIT_MAX = 5.0 + FILTER_GAIN_DISTANCE = [10, 50] + FILTER_GAIN_DISTANCE_CHANGE = [0, 20] + FILTER_GAIN_MAX = 0.95 + FILTER_GAIN_MIN = 0.75 + FILTER_GAIN_NO_LEAD = 0.95 + + def __init__(self, dt=DT_CTRL): + self.dy_up = 0. + self.dy_down = 0. + self.jerk_up = 0. + self.jerk_down = 0. + self.dt = dt + self.accel_last = 0. + self.distance_last = 0. + self.jerk_limit_min = self.JERK_LIMIT_MIN_NO_LEAD + + def update(self, enabled, override, distance, has_lead, accel, critical_state): + # jerk limits by accel change and distance are used to improve comfort while ensuring a fast enough car reaction + # override mechanics reminder: + # (1) sending accel = 0 and directly setting jerk to zero results in round about steady accel until harder accel pedal press -> lack of control + # (2) sending accel = 0 and allowing a high jerk results in a abrupt accel cut -> lack of comfort + if not enabled: + self.jerk_up = 0. + self.jerk_down = 0. + self.dy_up = 0. + self.dy_down = 0. + elif override: + self.jerk_up = self.JERK_LIMIT_MIN + self.jerk_down = self.JERK_LIMIT_MIN + self.dy_up = 0. + self.dy_down = 0. + elif critical_state: # force best car reaction + self.jerk_up = self.JERK_LIMIT_MAX + self.jerk_down = self.JERK_LIMIT_MAX + self.dy_up = 0. + self.dy_down = 0. + else: + jerk_limit_min_target = self.JERK_LIMIT_MIN if has_lead else self.JERK_LIMIT_MIN_NO_LEAD # jerk limit min base line + jerk_limit_min_delta = abs(self.JERK_LIMIT_MIN_NO_LEAD - self.JERK_LIMIT_MIN) * self.dt + if self.jerk_limit_min < jerk_limit_min_target: + self.jerk_limit_min = min(self.jerk_limit_min + jerk_limit_min_delta, jerk_limit_min_target) + elif self.jerk_limit_min > jerk_limit_min_target: + self.jerk_limit_min = max(self.jerk_limit_min - jerk_limit_min_delta, jerk_limit_min_target) + + if has_lead: + distance_change = (self.distance_last - distance) / self.dt if 0 not in (self.distance_last, distance) else 0 + filter_gain_dist = np.interp(distance, self.FILTER_GAIN_DISTANCE, [self.FILTER_GAIN_MAX, self.jerk_limit_min]) # gain by distance + filter_gain_dist_change = np.interp(abs(distance_change), self.FILTER_GAIN_DISTANCE_CHANGE, [self.jerk_limit_min, self.FILTER_GAIN_MAX]) # gain by distance change + filter_gain = max(filter_gain_dist, filter_gain_dist_change) # use highest gain + else: + filter_gain = self.FILTER_GAIN_NO_LEAD + + j = (accel - self.accel_last) / self.dt + + tgt_up = abs(j) if j > 0 else 0. + tgt_down = abs(j) if j < 0 else 0. + + # how fast does the car react to acceleration + self.dy_up += filter_gain * (tgt_up - self.jerk_up - self.dy_up) + self.jerk_up += self.dt * self.dy_up + self.jerk_up = np.clip(self.jerk_up, self.jerk_limit_min, self.JERK_LIMIT_MAX) + + # how fast does the car react to braking + self.dy_down += filter_gain * (tgt_down - self.jerk_down - self.dy_down) + self.jerk_down += self.dt * self.dy_down + self.jerk_down = np.clip(self.jerk_down, self.jerk_limit_min, self.JERK_LIMIT_MAX) + + self.accel_last = accel + self.distance_last = distance + + def get_jerk_up(self): + return self.jerk_up + + def get_jerk_down(self): + return self.jerk_down + + +class LongControlLimit(): + LOWER_LIMIT_FACTOR = 0.024 + LOWER_LIMIT_MAX = LOWER_LIMIT_FACTOR * 8 + LOWER_LIMIT_MIN = LOWER_LIMIT_FACTOR * 2 + UPPER_LIMIT_FACTOR = 0.0625 + UPPER_LIMIT_MAX = UPPER_LIMIT_FACTOR * 3 + LIMIT_MIN = 0. + LIMIT_DISTANCE = [10, 100] # limit range + LIMIT_DISTANCE_CHANGE_DOWN = [0, 20] # high precision for worst case high speed approaching a stopped lead + LIMIT_DISTANCE_CHANGE_UP = [0, 5] # precisely follow an accelerating lead especially from stop + LIMIT_DISTANCE_CHANGE_UP_ACT = [0, 60] + DISTANCE_FILTER_RC = [0.15, 0.6] # smooth noisy distance signal for distant leads + DISTANCE_TIMEOUT = 1. # seconds + + def __init__(self, dt=DT_CTRL): + self.upper_limit = self.LIMIT_MIN + self.lower_limit = self.LIMIT_MIN + self.dt = dt + self.distance_last = 0. + self.distance_filter = FirstOrderFilter(0.0, rc=self.DISTANCE_FILTER_RC[0], dt=dt, initialized=False) + self.distance_valid_timer = 0 + + def update(self, enabled: bool, speed: float, set_speed: float, distance: float, has_lead: bool, critical_state: bool): + # control limits by distance are used to improve comfort while ensuring precise car reaction if neccessary + # also used to reduce an effect of decel overshoot when target is breaking + # limits are controlled mainly by distance of lead car + if not enabled or critical_state: # force most precise accel command execution + self.upper_limit = self.LIMIT_MIN + self.lower_limit = self.LIMIT_MIN + self.distance_valid_timer = 0 + elif not has_lead: + if self.distance_valid_timer < self.DISTANCE_TIMEOUT: # fluctuation block: keep alive + self.distance_valid_timer += self.dt + else: # force most precise + self.upper_limit = self.LIMIT_MIN + self.lower_limit = self.LIMIT_MIN + else: + distance_change_raw = (self.distance_last - distance) / self.dt if 0 not in (self.distance_last, distance) else 0 + distance_filter_rc = np.interp(distance, self.LIMIT_DISTANCE, self.DISTANCE_FILTER_RC) + if (self.distance_last == 0 or self.distance_valid_timer != 0) and distance != 0: # for new lead detection reset filter and correctly force current state upon next iteration + self.distance_filter = FirstOrderFilter(0.0, rc=distance_filter_rc, dt=self.dt, initialized=False) + distance_change = distance_change_raw + else: + self.distance_filter.update_alpha(distance_filter_rc) + distance_change = self.distance_filter.update(distance_change_raw) + self.distance_valid_timer = 0 + + # how far can the true accel vary downwards from requested accel + upper_limit_dist = np.interp(distance, self.LIMIT_DISTANCE, [self.LIMIT_MIN, self.UPPER_LIMIT_MAX]) # base line based on distance + upper_limit_dist_change = np.interp(-min(0, distance_change), self.LIMIT_DISTANCE_CHANGE_UP, [self.UPPER_LIMIT_MAX, self.LIMIT_MIN]) # limit by distance change up + upper_limit_dist_change = np.interp(distance, self.LIMIT_DISTANCE_CHANGE_UP_ACT, [upper_limit_dist_change, upper_limit_dist]) # distance change activation + self.upper_limit = min(upper_limit_dist, upper_limit_dist_change) # use lowest limit + + # how far can the true accel vary upwards from requested accel + set_speed_diff_up = max(0, abs(speed) - abs(set_speed)) # set speed difference down requested by user or speed overshoot (includes hud - real speed difference!) + set_speed_diff_up_factor = np.interp(set_speed_diff_up, [1, 1.75], [1., 0.]) # faster requested speed decrease and less speed overshoot downhill + lower_limit_dist = np.interp(distance, self.LIMIT_DISTANCE, [self.LOWER_LIMIT_MIN, self.LOWER_LIMIT_MAX]) # base line based on distance + lower_limit_dist_speed = lower_limit_dist * set_speed_diff_up_factor + lower_limit_dist_change = np.interp(max(0, distance_change), self.LIMIT_DISTANCE_CHANGE_DOWN, [self.LOWER_LIMIT_MAX, self.LIMIT_MIN]) # limit by distance change down + self.lower_limit = min(lower_limit_dist_speed, lower_limit_dist_change) # use lowest limit + + self.distance_last = distance + + def get_upper_limit(self): + return self.upper_limit + + def get_lower_limit(self): + return self.lower_limit + + +def sigmoid_curvature_boost_meb(kappa: float, v_ego: float, kappa_thresh: float = 0.0) -> float: + # compensate non linear behaviour: boost low curvatures + # this is either a model issue (nerfing low curvatures) or a specific steering rack behaviour + v_points = np.array([20.0, 40.0]) + boost_values = np.array([1.5, 2.1]) # increase boost amplitude with speed + boost = float(np.interp(v_ego, v_points, boost_values)) + steepness_values = np.array([5000.0, 3200.0]) # increase boost area with speed + steepness = float(np.interp(v_ego, v_points, steepness_values)) + + abs_kappa = abs(kappa) + boost_factor = 1.0 + (boost - 1.0) / (1 + np.exp(steepness * (abs_kappa - kappa_thresh))) + + return np.sign(kappa) * abs_kappa * boost_factor + + +def map_speed_to_acc_tempolimit(v_ms): + acc_tempolimit_kph = { # DBC Mapping + 1: 5, 2: 7, 3: 10, 4: 15, 5: 20, 6: 25, 7: 30, 8: 35, + 9: 40, 10: 45, 11: 50, 12: 55, 13: 60, 14: 65, 15: 70, + 16: 75, 17: 80, 18: 85, 19: 90, 20: 95, 21: 100, 22: 110, + 23: 120, 24: 130, 25: 140, 26: 150, 27: 160, 28: 200, + 30: 250 + } + + v_kph = int(round(v_ms * CV.MS_TO_KPH)) + acc_value = 0 + + for val, limit in sorted(acc_tempolimit_kph.items()): + if v_kph >= limit: + acc_value = val + else: + break + + return acc_value + +def get_acc_warning_meb(self, acc_hud): + # this works as long our radar does not fault while using OP + if (acc_hud["ACC_Status_ACC"] in (3, 4) # ACC active or in override mode + and acc_hud["ACC_EGO_Fahrzeug"] == 2 # a warning for the lead car is active + and acc_hud["ACC_Optischer_Fahrerhinweis"] != 0 # there is an optical warning + and acc_hud["ACC_Akustischer_Fahrerhinweis"] != 0 # there is a sound warning + and acc_hud["ACC_Display_Prio"] == 0): # this warning has highest priority + return True + return False + +class MultiplicativeUnwindPID(PIDController): + def __init__(self, k_p, k_i, k_f=0., k_d=0., pos_limit=1e308, neg_limit=-1e308, rate=100, min_cmd=1e-10, ki_red_time=1.0): + super().__init__(k_p, k_i, k_f=k_f, k_d=k_d, pos_limit=pos_limit, neg_limit=neg_limit, rate=rate) + self.min_cmd = abs(min_cmd) + self.ki_red_time = float(ki_red_time) + self.rate = rate + self.override_prev = False + self.i_unwind_factor = 1.0 + + def _calc_unwind_factor(self, override): + if not override or self.override_prev: + return + if self.ki_red_time <= 0.0: + self.i_unwind_factor = 1.0 + return + if abs(self.i) <= self.min_cmd: + self.i_unwind_factor = 0.0 + return + steps = max(int(self.ki_red_time * self.rate), 1) + factor = (self.min_cmd / abs(self.i)) ** (1.0 / steps) + self.i_unwind_factor = min(factor, 1.0) + + def update(self, error, error_rate=0.0, speed=0.0, override=False, feedforward=0., freeze_integrator=False): + self.speed = speed + + self.p = float(error) * self.k_p + self.f = feedforward * self.k_f + self.d = error_rate * self.k_d + + if override: + self._calc_unwind_factor(override) + self.i *= self.i_unwind_factor + if abs(self.i) < self.min_cmd: + self.i = 0.0 + else: + if not freeze_integrator: + self.i = self.i + error * self.k_i * self.i_rate + + # Clip i to prevent exceeding control limits + control_no_i = self.p + self.d + self.f + control_no_i = np.clip(control_no_i, self.neg_limit, self.pos_limit) + self.i = np.clip(self.i, self.neg_limit - control_no_i, self.pos_limit - control_no_i) + + control = self.p + self.i + self.d + self.f + + self.control = np.clip(control, self.neg_limit, self.pos_limit) + self.override_prev = override + return self.control + +class LatControlCurvature(): + def __init__(self, pid_params, limit, rate): + self.pid = MultiplicativeUnwindPID((pid_params.kpBP, pid_params.kpV), + (pid_params.kiBP, pid_params.kiV), + k_f=pid_params.kf, pos_limit=limit, neg_limit=-limit, + rate=rate, min_cmd=6.7e-6, ki_red_time=2.0) + def reset(self): + self.pid.reset() + + def update(self, CS, CC, desired_curvature): + actual_curvature_vm = CC.currentCurvature # includes roll + speed_floor = max(CS.vEgo, 0.1) + yaw_rate_pose = CC.angularVelocity[2] if len(CC.angularVelocity) > 2 else actual_curvature_vm * speed_floor + actual_curvature_pose = yaw_rate_pose / speed_floor + actual_curvature = np.interp(CS.vEgo, [2.0, 5.0], [actual_curvature_vm, actual_curvature_pose]) + desired_curvature_corr = desired_curvature - CC.rollCompensation + error = desired_curvature - actual_curvature + freeze_integrator = CC.steerLimited or CS.vEgo < 5 + output_curvature = self.pid.update(error, feedforward=desired_curvature_corr, speed=CS.vEgo, + freeze_integrator=freeze_integrator, override=CS.steeringPressed) + return output_curvature diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/mlbcan.py b/artifacts/package_runtime/iqdbc/car/volkswagen/mlbcan.py new file mode 100644 index 000000000..c1b6f81cd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/mlbcan.py @@ -0,0 +1,126 @@ +from iqdbc.car.volkswagen.mqbcan import (volkswagen_mqb_meb_checksum, xor_checksum, + acc_hud_status_value as mqb_acc_hud_status_value, + create_lka_hud_control as mqb_create_lka_hud_control) + +def create_hca_steering_control(packer, bus, apply_steer, HCA_Status): + values = { + "HCA_01_Status_HCA": HCA_Status, + "HCA_01_LM_Offset": abs(apply_steer), + "HCA_01_LM_OffSign": 1 if apply_steer < 0 else 0, + "HCA_01_Vib_Freq": 18, + "HCA_01_Sendestatus": 1 if HCA_Status in (5, 7) else 0, + } + return packer.make_can_msg("HCA_01", bus, values) + + +def create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control, + entering=False, special_mode=False, special_active=False): + return mqb_create_lka_hud_control(packer, bus, ldw_stock_values, enabled, steering_pressed, hud_alert, hud_control, + entering, special_mode, special_active) + + +def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False, set_button=False): + values = {s: gra_stock_values[s] for s in [ + "LS_Hauptschalter", + "LS_Typ_Hauptschalter", + "LS_Codierung", + "LS_Tip_Stufe_2", + ]} + + values.update({ + "COUNTER": (gra_stock_values["COUNTER"] + 1) % 16, + "LS_Abbrechen": cancel, + "LS_Tip_Wiederaufnahme": resume, + }) + + return packer.make_can_msg("LS_01", bus, values) + + +def acc_control_value(main_switch_on, long_active, cruiseOverride, accFaulted): + # ACC_01.ACC_Status_ACC shares the MQB ACC_06 enum, but a fault outranks active regulation on MLB + if cruiseOverride: + acc_control = 4 + elif accFaulted: + acc_control = 6 + elif long_active: + acc_control = 3 + elif main_switch_on: + acc_control = 2 + else: + acc_control = 0 + + return acc_control + + +def acc_hud_status_value(main_switch_on, acc_faulted, longActive, longOverride): + return mqb_acc_hud_status_value(main_switch_on, acc_faulted, longActive, longOverride) + + +def create_acc_accel_control(packer, bus, accel, acc_control, stopping): + acc_enabled = acc_control in (3, 4) + + acc_01_values = { + "ACC_Status_ACC": acc_control, + "ACC_Sollbeschleunigung": accel if acc_enabled else 0, + "ACC_zul_Regelabw_unten": 0.2 if acc_enabled else 0, + "ACC_zul_Regelabw_oben": 0.2 if acc_enabled else 0, + "ACC_neg_Sollbeschl_Grad": 4.0 if acc_enabled else 0, + "ACC_pos_Sollbeschl_Grad": 4.0 if acc_enabled else 0, + "ACC_Dynamik": 3, + "ACC_Anhalten": stopping if acc_enabled else False, + "ACC_Minimale_Bremsung": 0, + } + + return [packer.make_can_msg("ACC_01", bus, acc_01_values)] + + +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, leadDistance, distanceBars, fcw_alert, leadVisible, + unavailable, decel, d_unresponsive, hud_text=0, desired_distance=8.0): + engaged = acc_hud_status in (3, 4) + priodisp = 0 if fcw_alert else 1 if (acc_hud_status == 4 or decel or leadVisible) else 2 if (acc_hud_status in (3, 2)) else 0 + + # The cluster renders the lead as a position on a fixed scale rather than a raw distance, with the + # set follow gap sitting at mid scale. The scale spans out to 1.5x the gap before it saturates. + if not engaged: + acc_distance_index = 1022 + elif not leadVisible: + acc_distance_index = 1023 + else: + distance_ratio = leadDistance / max(desired_distance, 1.0) + acc_distance_index = int(max(1, min(1021, round(490 * (3 - 2 * distance_ratio))))) + + values = { + "ACC_Status_Anzeige": acc_hud_status, # 0 off, 1 init, 2 standby, 3 active, 4 overridden, 5 shutdown reaction, 6/7 fault + "ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36, # 327.36 (raw 1023) = "no display" + "ACC_Gesetzte_Zeitluecke": distanceBars, # 1 aggressive, 2 standard, 3 relaxed + "ACC_Anzeige_Zeitluecke": 1 if engaged else 0, + "ACC_Tachokranz": 1 if engaged else 0, + "ACC_Display_Prio": priodisp, # 0 highest prio, 1 medium, 2 low, 3 none + "ACC_Abstandsindex": acc_distance_index, # 1-1020 lead distance, 1021 emergency brake, 1022 ACC off, 1023 ACC on without lead + "ACC_Relevantes_Objekt": 2 if fcw_alert else (1 if leadVisible else 0), # lead car: 1 green, 2 red, 0 off + "ACC_Status_Prim_Anz": 2 if fcw_alert else (1 if engaged else 0), # ACC symbol: 1 green, 2 red, 3 yellow, 0 off + "ACC_Optischer_Fahrerhinweis": 1 if fcw_alert else 0, + "ACC_Akustik": 1 if (fcw_alert or d_unresponsive) else 0, # 0 none, 1 high prio, 2 low prio, 3 high prio continuous + "ACC_Texte_Primaeranz": hud_text, + } + + return packer.make_can_msg("ACC_02", bus, values) + + +def volkswagen_mlb_checksum(address: int, sig, d: bytearray) -> int: + xor_starting_value = { + 0x109: 0x08, # ACC_01 + 0x111: 0x10, # TSK_05 + 0x30C: 0x0F, # ACC_02 + 0x324: 0x27, # ACC_04 + 0x10B: 0xA, # LS_01 + 0x10D: 0x0C, # ACC_05 + 0x10F: 0x0E, # ACC_0x10F + 0x311: 0x12, # ACC_0x311 + 0x397: 0x94, # LDW_02 + 0x10C: 0x0D, # TSK_02 + } + if address in xor_starting_value: + return xor_checksum(address, sig, d, xor_starting_value[address]) + else: + return volkswagen_mqb_meb_checksum(address, sig, d) diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/mqbcan.py b/artifacts/package_runtime/iqdbc/car/volkswagen/mqbcan.py new file mode 100644 index 000000000..bd759e2ec --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/mqbcan.py @@ -0,0 +1,326 @@ +from iqdbc.car.crc import CRC8H2F + + +def create_hca_steering_control(packer, bus, apply_torque, HCA_Status): + values = { + "HCA_01_Status_HCA": HCA_Status, + "HCA_01_LM_Offset": abs(apply_torque), + "HCA_01_LM_OffSign": 1 if apply_torque < 0 else 0, + "HCA_01_Vib_Freq": 18, + "HCA_01_Sendestatus": 1 if HCA_Status == 5 else 0, + "EA_ACC_Wunschgeschwindigkeit": 327.36, + } + return packer.make_can_msg("HCA_01", bus, values) + +def create_eps_update(packer, bus, eps_stock_values, ea_simulated_torque): + values = {s: eps_stock_values[s] for s in [ + "COUNTER", # Sync counter value to EPS output + "EPS_Lenkungstyp", # EPS rack type + "EPS_Berechneter_LW", # Absolute raw steering angle + "EPS_VZ_BLW", # Raw steering angle sign + "EPS_HCA_Status", # EPS HCA control status + ]} + + values.update({ + # Absolute driver torque input and sign, with EA inactivity mitigation + "EPS_Lenkmoment": abs(ea_simulated_torque), + "EPS_VZ_Lenkmoment": 1 if ea_simulated_torque < 0 else 0, + }) + + return packer.make_can_msg("LH_EPS_03", bus, values) + + +def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control, entering, special_mode=False, special_active=False): + values = {} + if len(ldw_stock_values): + values = {s: ldw_stock_values[s] for s in [ + "LDW_SW_Warnung_links", # Blind spot in warning mode on left side due to lane departure + "LDW_SW_Warnung_rechts", # Blind spot in warning mode on right side due to lane departure + "LDW_Seite_DLCTLC", # Direction of most likely lane departure (left or right) + "LDW_DLC", # Lane departure, distance to line crossing + "LDW_TLC", # Lane departure, time to line crossing + ]} + + if entering: + yellow_led = int(steering_pressed) + green_led = int(not steering_pressed) + else: + yellow_led = 1 if lat_active and steering_pressed else 0 + green_led = 1 if lat_active and not steering_pressed else 0 + + values.update({ + "LDW_Status_LED_gelb": yellow_led, + "LDW_Status_LED_gruen": green_led, + "LDW_Lernmodus_links": 3 if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible, + "LDW_Lernmodus_rechts": 3 if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible, + "LDW_Texte": hud_alert, + }) + return packer.make_can_msg("LDW_02", bus, values) + + +def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False, set_button=False): + values = {s: gra_stock_values[s] for s in [ + "GRA_Hauptschalter", # ACC button, on/off + "GRA_Typ_Hauptschalter", # ACC main button type + "GRA_Codierung", # ACC button configuration/coding + "GRA_Tip_Stufe_2", # unknown related to stalk type + "GRA_ButtonTypeInfo", # unknown related to stalk type + ]} + + values.update({ + "COUNTER": (gra_stock_values["COUNTER"] + 1) % 16, + "GRA_Abbrechen": cancel, + "GRA_Tip_Wiederaufnahme": resume, + }) + + return packer.make_can_msg("GRA_ACC_01", bus, values) + + +def acc_control_value(main_switch_on, long_active, cruiseOverride, accFaulted): + if cruiseOverride: + acc_control = 4 + elif long_active: + acc_control = 3 + elif accFaulted: + acc_control = 6 + elif main_switch_on: + acc_control = 2 + else: + acc_control = 0 + + return acc_control + + +def acc_hud_status_value(main_switch_on, acc_faulted, longActive, longOverride): + if longOverride: + hud_status = 4 + elif longActive: + hud_status = 3 + elif acc_faulted: + hud_status = 6 + elif main_switch_on: + hud_status = 2 + else: + hud_status = 0 + return hud_status + + +def create_acc_accel_control(packer, bus, acc_type, accel, acc_control, stopping, starting, esp_hold, comfortBand, jerkLimit, eBrakeActive, esp_starting_override=None, esp_stopping_override=None): + commands = [] + acc_enabled = acc_control in (3, 4) + + acc_06_values = { + "ACC_Typ": acc_type, + "ACC_Status_ACC": acc_control, + "ACC_StartStopp_Info": acc_enabled, + "ACC_Sollbeschleunigung_02": accel if acc_enabled else 3.01, + "ACC_zul_Regelabw_unten": 0.2, + "ACC_zul_Regelabw_oben": 0.2, + "ACC_neg_Sollbeschl_Grad_02": 3.0 if acc_enabled else 0, + "ACC_pos_Sollbeschl_Grad_02": 3.0 if acc_enabled else 0, + "ACC_Anfahren": starting if acc_enabled else False, + "ACC_Anhalten": stopping if acc_enabled else False, + } + commands.append(packer.make_can_msg("ACC_06", bus, acc_06_values)) + + acc_07_starting = starting if esp_starting_override is None else esp_starting_override + acc_07_stopping = stopping if esp_stopping_override is None else esp_stopping_override + + if acc_07_starting: + acc_hold_type = 4 # hold release / startup + elif esp_hold: + acc_hold_type = 3 # hold standby + elif acc_07_stopping: + acc_hold_type = 1 # hold request + else: + acc_hold_type = 0 + + acc_07_values = { + "ACC_Anhalteweg": 0.3 if acc_07_stopping and acc_enabled else 20.46, # Distance to stop (stopping coordinator handles terminal roll-out) + "ACC_Freilauf_Info": 2 if acc_enabled else 0, + "ACC_Folgebeschl": 3.02, # Not using secondary controller accel unless and until we understand its impact + "ACC_Sollbeschleunigung_02": accel if acc_enabled else 3.01, + "ACC_Anforderung_HMS": acc_hold_type, + "ACC_Anfahren": acc_07_starting if acc_enabled else False, + "ACC_Anhalten": acc_07_stopping if acc_enabled else False, + } + commands.append(packer.make_can_msg("ACC_07", bus, acc_07_values)) + + return commands + + +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, leadDistance, distanceBars, fcw_alert, leadVisible, unavailable, decel, d_unresponsive): + priodisp = 0 if fcw_alert else 1 if (acc_hud_status == 4 or decel or leadVisible) else 2 if (acc_hud_status in (3, 2)) else 0 + leadDistanceBars = distanceBars + 1 if distanceBars in (1, 2, 3) else 2 + values = { + "ACC_Status_Anzeige": acc_hud_status, + "ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36, + "ACC_Gesetzte_Zeitluecke": leadDistanceBars, + "ACC_Optischer_Fahrerhinweis": 1 if fcw_alert else 0, + "ACC_Display_Prio": priodisp, + "ACC_Relevantes_Objekt": leadDistanceBars, + "ACC_Abstandsindex": leadDistance if leadVisible else 0, + "ACC_Akustik_02": fcw_alert, + } + + return packer.make_can_msg("ACC_02", bus, values) + + +# AWV = Stopping Distance Reduction +# Refer to Self Study Program 890253: Volkswagen Driver Assistance Systems, Design and Function + + +def create_aeb_control(packer, fcw_active, aeb_active, accel): + values = { + "AWV_Vorstufe": 0, # Preliminary stage + "AWV1_Anf_Prefill": 0, # Brake pre-fill request + "AWV1_HBA_Param": 0, # Brake pre-fill level + "AWV2_Freigabe": 0, # Stage 2 braking release + "AWV2_Ruckprofil": 0, # Brake jerk level + "AWV2_Priowarnung": 0, # Suppress lane departure warning in favor of FCW + "ANB_Notfallblinken": 0, # Hazard flashers request + "ANB_Teilbremsung_Freigabe": 0, # Target braking release + "ANB_Zielbremsung_Freigabe": 0, # Partial braking release + "ANB_Zielbrems_Teilbrems_Verz_Anf": 0.0, # Acceleration requirement for target/partial braking, m/s/s + "AWV_Halten": 0, # Vehicle standstill request + "PCF_Time_to_collision": 0xFF, # Pre Crash Front, populated only with a target, might be used on Audi only + } + + return packer.make_can_msg("ACC_10", 0, values) + + +def create_aeb_hud(packer, aeb_supported, fcw_active): + values = { + "AWV_Texte": 5 if aeb_supported else 7, # FCW/AEB system status, display text (from menu in VAL) + "AWV_Status_Anzeige": 1 if aeb_supported else 2, # FCW/AEB system status, available or disabled + } + + return packer.make_can_msg("ACC_15", 0, values) + + +def volkswagen_mqb_meb_checksum(address: int, sig, d: bytearray, const: list[int] | None = None) -> int: + crc = 0xFF + for i in range(1, len(d)): + crc ^= d[i] + crc = CRC8H2F[crc] + counter = d[1] & 0x0F + if const is None: + const = VOLKSWAGEN_MQB_MEB_CONSTANTS.get(address) + if const: + crc ^= const[counter] + crc = CRC8H2F[crc] + return crc ^ 0xFF + + +def volkswagen_mqb_meb_dyn_len_checksum(address: int, sig, d: bytearray, entry: dict | None = None) -> int: + const = None + if entry: + d = d[:entry["length"]] + const = entry["magic"] + return volkswagen_mqb_meb_checksum(address, sig, d, const) + + +def volkswagen_mqb_meb_gen2_checksum(address: int, sig, d: bytearray) -> int: + entry = VOLKSWAGEN_MQB_MEB_GEN2_CONSTANTS.get(address) + if entry: + checksum = volkswagen_mqb_meb_dyn_len_checksum(address, sig, d, entry) + if checksum == d[0]: + return checksum + return volkswagen_mqb_meb_checksum(address, sig, d) + + +def xor_checksum(address: int, sig, d: bytearray, initial_value: int = 0) -> int: + checksum = initial_value + checksum_byte = sig.start_bit // 8 + for i in range(len(d)): + if i != checksum_byte: + checksum ^= d[i] + return checksum + + +VOLKSWAGEN_MQB_MEB_CONSTANTS: dict[int, list[int]] = { + 0x40: [0x40] * 16, # Airbag_01 + 0x86: [0x86] * 16, # LWI_01 + 0x9F: [0xF5] * 16, # LH_EPS_03 + 0xAD: [0x3F, 0x69, 0x39, 0xDC, 0x94, 0xF9, 0x14, 0x64, + 0xD8, 0x6A, 0x34, 0xCE, 0xA2, 0x55, 0xB5, 0x2C], # Getriebe_11 + 0x0DB: [0x09, 0xFA, 0xCA, 0x8E, 0x62, 0xD5, 0xD1, 0xF0, + 0x31, 0xA0, 0xAF, 0xDA, 0x4D, 0x1A, 0x0A, 0x97], # AWV_03 + 0xFC: [0x77, 0x5C, 0xA0, 0x89, 0x4B, 0x7C, 0xBB, 0xD6, + 0x1F, 0x6C, 0x4F, 0xF6, 0x20, 0x2B, 0x43, 0xDD], # ESC_51 + 0xFD: [0xB4, 0xEF, 0xF8, 0x49, 0x1E, 0xE5, 0xC2, 0xC0, + 0x97, 0x19, 0x3C, 0xC9, 0xF1, 0x98, 0xD6, 0x61], # ESP_21 + 0x101: [0xAA] * 16, # ESP_02 + 0x102: [0xD7, 0x12, 0x85, 0x7E, 0x0B, 0x34, 0xFA, 0x16, + 0x7A, 0x25, 0x2D, 0x8F, 0x04, 0x8E, 0x5D, 0x35], # ESC_50 + 0x106: [0x07] * 16, # ESP_05 + 0x10B: [0x77, 0x5C, 0xA0, 0x89, 0x4B, 0x7C, 0xBB, 0xD6, + 0x1F, 0x6C, 0x4F, 0xF6, 0x20, 0x2B, 0x43, 0xDD], # Motor_51 + 0x116: [0xAC] * 16, # ESP_10 + 0x117: [0x16] * 16, # ACC_10 + 0x120: [0xC4, 0xE2, 0x4F, 0xE4, 0xF8, 0x2F, 0x56, 0x81, + 0x9F, 0xE5, 0x83, 0x44, 0x05, 0x3F, 0x97, 0xDF], # TSK_06 + 0x121: [0xE9, 0x65, 0xAE, 0x6B, 0x7B, 0x35, 0xE5, 0x5F, + 0x4E, 0xC7, 0x86, 0xA2, 0xBB, 0xDD, 0xEB, 0xB4], # Motor_20 + 0x122: [0x37, 0x7D, 0xF3, 0xA9, 0x18, 0x46, 0x6D, 0x4D, + 0x3D, 0x71, 0x92, 0x9C, 0xE5, 0x32, 0x10, 0xB9], # ACC_06 + 0x126: [0xDA] * 16, # HCA_01 + 0x12B: [0x6A, 0x38, 0xB4, 0x27, 0x22, 0xEF, 0xE1, 0xBB, + 0xF8, 0x80, 0x84, 0x49, 0xC7, 0x9E, 0x1E, 0x2B], # GRA_ACC_01 + 0x12E: [0xF8, 0xE5, 0x97, 0xC9, 0xD6, 0x07, 0x47, 0x21, + 0x66, 0xDD, 0xCF, 0x6F, 0xA1, 0x94, 0x74, 0x63], # ACC_07 + 0x139: [0xED, 0x03, 0x1C, 0x13, 0xC6, 0x23, 0x78, 0x7A, + 0x8B, 0x40, 0x14, 0x51, 0xBF, 0x68, 0x32, 0xBA], # VMM_02 + 0x13D: [0x20, 0xCA, 0x68, 0xD5, 0x1B, 0x31, 0xE2, 0xDA, + 0x08, 0x0A, 0xD4, 0xDE, 0x9C, 0xE4, 0x35, 0x5B], # QFK_01 + 0x14C: [0x16, 0x35, 0x59, 0x15, 0x9A, 0x2A, 0x97, 0xB8, + 0x0E, 0x4E, 0x30, 0xCC, 0xB3, 0x07, 0x01, 0xAD], # Motor_54 + 0x14D: [0x1A, 0x65, 0x81, 0x96, 0xC0, 0xDF, 0x11, 0x92, + 0xD3, 0x61, 0xC6, 0x95, 0x8C, 0x29, 0x21, 0xB5], # ACC_18 + 0x187: [0x7F, 0xED, 0x17, 0xC2, 0x7C, 0xEB, 0x44, 0x21, + 0x01, 0xFA, 0xDB, 0x15, 0x4A, 0x6B, 0x23, 0x05], # Motor_EV_01 + 0x1A4: [0x69, 0xBB, 0x54, 0xE6, 0x4E, 0x46, 0x8D, 0x7B, + 0xEA, 0x87, 0xE9, 0xB3, 0x63, 0xCE, 0xF8, 0xBF], # EA_01 + 0x1AB: [0x13, 0x21, 0x9B, 0x6A, 0x9A, 0x62, 0xD4, 0x65, + 0x18, 0xF1, 0xAB, 0x16, 0x32, 0x89, 0xE7, 0x26], # ESP_33 + 0x1F0: [0x2F, 0x3C, 0x22, 0x60, 0x18, 0xEB, 0x63, 0x76, + 0xC5, 0x91, 0x0F, 0x27, 0x34, 0x04, 0x7F, 0x02], # EA_02 + 0x20A: [0x9D, 0xE8, 0x36, 0xA1, 0xCA, 0x3B, 0x1D, 0x33, + 0xE0, 0xD5, 0xBB, 0x5F, 0xAE, 0x3C, 0x31, 0x9F], # EML_06 + 0x25D: [0xDA, 0x6B, 0x0E, 0xB2, 0x78, 0xBD, 0x5A, 0x81, + 0x7B, 0xD6, 0x41, 0x39, 0x76, 0xB6, 0xD7, 0x35], # KLR_01 + 0x26B: [0xCE, 0xCC, 0xBD, 0x69, 0xA1, 0x3C, 0x18, 0x76, + 0x0F, 0x04, 0xF2, 0x3A, 0x93, 0x24, 0x19, 0x51], # TA_01 + 0x30C: [0x0F] * 16, # ACC_02 + 0x30F: [0x0C] * 16, # SWA_01 + 0x324: [0x27] * 16, # ACC_04 + 0x3BE: [0x1F, 0x28, 0xC6, 0x85, 0xE6, 0xF8, 0xB0, 0x19, + 0x5B, 0x64, 0x35, 0x21, 0xE4, 0xF7, 0x9C, 0x24], # Motor_14 + 0x3C0: [0xC3] * 16, # Klemmen_Status_01 + 0x3D5: [0xC5, 0x39, 0xC7, 0xF9, 0x92, 0xD8, 0x24, 0xCE, + 0xF1, 0xB5, 0x7A, 0xC4, 0xBC, 0x60, 0xE3, 0xD1], # Licht_Anf_01 + 0x65D: [0xAC, 0xB3, 0xAB, 0xEB, 0x7A, 0xE1, 0x3B, 0xF7, + 0x73, 0xBA, 0x7C, 0x9E, 0x06, 0x5F, 0x02, 0xD9], # ESP_20 +} + + +VOLKSWAGEN_MQB_MEB_GEN2_CONSTANTS: dict[int, dict] = { + 0x0DB: {"length": 42, + "magic": [0x09, 0xFA, 0xCA, 0x8E, 0x62, 0xD5, 0xD1, 0xF0, + 0x31, 0xA0, 0xAF, 0xDA, 0x4D, 0x1A, 0x0A, 0x97]}, + 0xFC: {"length": 60, + "magic": [0x69, 0xDC, 0xF9, 0x64, 0x6A, 0xCE, 0x55, 0x2C, + 0xC4, 0x38, 0x8F, 0xD1, 0xC6, 0x43, 0xB4, 0xB1]}, + 0x102: {"length": 44, + "magic": [0xD7, 0x12, 0x85, 0x7E, 0x0B, 0x34, 0xFA, 0x16, + 0x7A, 0x25, 0x2D, 0x8F, 0x04, 0x8E, 0x5D, 0x35]}, + 0x10B: {"length": 44, + "magic": [0x2C, 0xB1, 0x1A, 0x75, 0xBB, 0x65, 0x79, 0x47, + 0x81, 0x2B, 0xCC, 0x96, 0x17, 0xDB, 0xC0, 0x94]}, + 0x13D: {"length": 28, + "magic": [0x18, 0x71, 0x10, 0x8D, 0xD7, 0xAA, 0xB0, 0x78, + 0xAC, 0x12, 0xAE, 0x0C, 0xDD, 0xF1, 0x85, 0x68]}, + 0x139: {"length": 28, + "magic": [0x96, 0x92, 0x95, 0xB5, 0x6E, 0xE3, 0xBD, 0xB4, + 0xFA, 0xAE, 0xBE, 0xCB, 0xCF, 0xA5, 0x77, 0xEF]}, +} diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/pq_radar_handler.py b/artifacts/package_runtime/iqdbc/car/volkswagen/pq_radar_handler.py new file mode 100644 index 000000000..8596bc1b6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/pq_radar_handler.py @@ -0,0 +1,106 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.volkswagen import pqcan + + +class PQRadarHandler: + GRA_STEP = 3 # GRA_Neu cadence (~33 Hz), matches stock stalk module + SPOOF_STEP = 2 # Motor_2 / Motor_5 spoof cadence (50 Hz) + + ENGAGE_FLOOR = 1.0 * CV.KPH_TO_MS # never SET at/below 1 kph + REENGAGE_FLOOR = 2.0 * CV.KPH_TO_MS # hysteresis: only (re)engage above 2 kph + + SETSPEED_TOL_KPH = 1.0 # don't chase set-speed within this band + SHORT_STEP_KPH = 1.0 * CV.MPH_TO_KPH # GRA_*_kurz ~= 1 mph + LONG_STEP_KPH = 5.0 * CV.MPH_TO_KPH # GRA_*_lang ~= 5 mph + TAP_RELEASE_CYCLES = 2 # GRA cycles to release between set-speed taps + + def __init__(self, CAN): + self.bus = CAN.ext # radar lives on bus 2 (ext/cam) + self.counter = 0 + self.failed = False # ACS_Fehler / irrev_Fehler -> radar dead for the drive + self.want_engaged = False # our belief the radar cruise should be on + self._press_phase = 0 # alternate press/release for SET/cancel discrete edges + self._tap_cooldown = 0 # set-speed tap rate limiter + + def reset(self): + self.want_engaged = False + self._press_phase = 0 + self._tap_cooldown = 0 + + @staticmethod + def _map_gap_bars(gap_bars): + if not gap_bars: + return None + return int(min(3, max(1, gap_bars))) + + def update(self, packer, frame, CS, *, blend_active, engage_req, cancel_req, + set_speed_kph, gap_bars, v_ego): + can_sends = [] + + if not blend_active: + self.reset() + return can_sends + + if CS.acc_radar_fehler or CS.acc_radar_sta_adr == 3: + self.failed = True + + radar_active = (CS.acc_radar_sta_adr == 1) and not self.failed + + if self.failed: + self.want_engaged = False + elif cancel_req: + self.want_engaged = False + elif engage_req and v_ego > self.REENGAGE_FLOOR: + self.want_engaged = True + + if (frame % self.SPOOF_STEP) == 0: + # Mirror the stock engage handshake ORDER: the radar leads (SET -> ADR active) and only THEN + # does the engine report GRA regulating. Asserting MO2_Sta_GRA=1 before the radar's ADR is + # active presents an impossible state ("engine regulating but ADR didn't initiate it") and the + # radar latches an irreversible fault. So only assert cruise-active once ADR is actually active; + # relay Motor_5 (main switch) as verbatim OEM passthrough throughout. + hold_engaged = self.want_engaged and radar_active + can_sends.append(pqcan.filter_motor2(packer, self.bus, CS.motor2_stock, gra_active=hold_engaged)) + can_sends.append(pqcan.filter_motor5(packer, self.bus, CS.motor5_stock, gra_active=False)) + + if (frame % self.GRA_STEP) == 0: + set_btn = resume_btn = cancel = up_s = down_s = up_l = down_l = False + self._press_phase ^= 1 + pressing = self._press_phase == 0 + + if self.failed: + pass + elif cancel_req: + # Only actually press cancel when the radar is engaged (or overdriven) -- otherwise it's a + # no-op against a passive/off radar and just spams GRA_Abbrechen at ~16 Hz. Fires while + # active and stops once the radar leaves the active state. + cancel = pressing and radar_active + elif self.want_engaged and not radar_active and v_ego > self.ENGAGE_FLOOR: + # Engage with RESUME (GRA_Recall), not SET. Ground-truth from an OEM ACC engage (radar leads: + # RESUME -> ACS_Sta_ADR 2->1 in ~90ms -> engine MO2_Sta_GRA 0->1 ~80ms later) shows this radar + # engages from passive on GRA_Recall; it ignores GRA_Neu_Setzen from that state. + resume_btn = pressing + elif self.want_engaged and radar_active: + if self._tap_cooldown > 0: + self._tap_cooldown -= 1 + elif set_speed_kph > 0: + delta = set_speed_kph - CS.acc_radar_v_wunsch + if abs(delta) >= self.SETSPEED_TOL_KPH: + big = abs(delta) >= self.LONG_STEP_KPH + if delta > 0: + up_l, up_s = big, not big + else: + down_l, down_s = big, not big + self._tap_cooldown = self.TAP_RELEASE_CYCLES + + self.counter = (self.counter + 1) % 16 + can_sends.append(pqcan.create_radar_gra( + packer, self.bus, CS.gra_stock_values, self.counter, + set_btn=set_btn, resume=resume_btn, cancel=cancel, up_short=up_s, down_short=down_s, + up_long=up_l, down_long=down_l, zeitluecke=self._map_gap_bars(gap_bars), + )) + + return can_sends diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/pqcan.py b/artifacts/package_runtime/iqdbc/car/volkswagen/pqcan.py new file mode 100644 index 000000000..43942b00f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/pqcan.py @@ -0,0 +1,207 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +def create_hca_steering_control(packer, bus, apply_torque, HCA_Status): + values = { + "LM_Offset": abs(apply_torque), + "LM_OffSign": 1 if apply_torque < 0 else 0, + "HCA_Status": HCA_Status, + "Vib_Freq": 16, + } + + return packer.make_can_msg("HCA_1", bus, values) + +def create_lka_hud_control(packer, bus, ldw_stock_values, lat_active, steering_pressed, hud_alert, hud_control, entering, special_mode, special_active): + values = {} + if len(ldw_stock_values): + values = {s: ldw_stock_values[s] for s in [ + "LDW_SW_Warnung_links", # Blind spot in warning mode on left side due to lane departure + "LDW_SW_Warnung_rechts", # Blind spot in warning mode on right side due to lane departure + "LDW_Seite_DLCTLC", # Direction of most likely lane departure (left or right) + "LDW_DLC", # Lane departure, distance to line crossing + "LDW_TLC", # Lane departure, time to line crossing + ]} + + if entering: + yellow_led = int(steering_pressed) + green_led = int(not steering_pressed) + elif special_mode: + yellow_led = 1 if (lat_active and (steering_pressed or not special_active)) or not lat_active else 0 + green_led = 1 if lat_active and special_active and not steering_pressed else 0 + else: + yellow_led = 1 if (lat_active and steering_pressed) or not lat_active else 0 + green_led = 1 if lat_active and not steering_pressed else 0 + + values.update({ + "LDW_Kameratyp": 1, + "LDW_Lampe_gelb": yellow_led, + "LDW_Lampe_gruen": green_led, + "LDW_Lernmodus_links": 3 if hud_control.leftLaneDepart else 1 + hud_control.leftLaneVisible, + "LDW_Lernmodus_rechts": 3 if hud_control.rightLaneDepart else 1 + hud_control.rightLaneVisible, + "LDW_Textbits": hud_alert, + }) + + return packer.make_can_msg("LDW_Status", bus, values) + + +def create_acc_buttons_control(packer, bus, gra_stock_values, cancel=False, resume=False, set_button=False): + values = {s: gra_stock_values[s] for s in [ + "GRA_Hauptschalt", # ACC button, on/off + "GRA_Typ_Hauptschalt", # ACC button, momentary vs latching + "GRA_Kodierinfo", # ACC button, configuration + "GRA_Sender", # ACC button, CAN message originator + ]} + + values.update({ + "COUNTER": (gra_stock_values["COUNTER"] + 1) % 16, + "GRA_Abbrechen": cancel, + "GRA_Recall": resume, + "GRA_Neu_Setzen": set_button, + }) + + return packer.make_can_msg("GRA_Neu", bus, values) + +def create_gra_neu(packer, bus, gra_stock, longActive): + values = gra_stock.copy() + if longActive: + values.update({ + "GRA_Neu_Setzen": 0, + "GRA_Recall": 0, + "GRA_Hauptschalt": 0, + }) + return packer.make_can_msg("GRA_Neu", bus, values) + +def acc_control_value(main_switch_on, long_active, cruiseOverride, accFaulted): + if long_active or cruiseOverride: + acc_control = 1 + elif accFaulted: + acc_control = 3 + elif main_switch_on: + acc_control = 2 + else: + acc_control = 0 + + return acc_control + +def acc_hud_status_value(main_switch_on, acc_faulted, longActive, longOverride): + if longOverride: + hud_status = 4 + elif longActive: + hud_status = 3 + elif acc_faulted: + hud_status = 6 + elif main_switch_on: + hud_status = 2 + else: + hud_status = 0 + + return hud_status + + +def create_acc_accel_control(packer, bus, acc_type, accel, acc_control, stopping, starting, esp_hold, comfortBand, jerkLimit, eBrakeActive, sng_active=False): + commands = [] + acc_enabled = acc_control == 1 and not sng_active + + values = { + "ACS_Sta_ADR": 0 if sng_active else acc_control, + "ACS_StSt_Info": acc_enabled, + "ACS_Typ_ACC": acc_type, + "ACS_Anhaltewunsch": (acc_type == 1 and stopping or eBrakeActive) or sng_active, + "ACS_FreigSollB": acc_enabled, + "ACS_Sollbeschl": accel if acc_enabled else 3.01, + "ACS_zul_Regelabw": comfortBand if acc_enabled else 1.27, + "ACS_max_AendGrad": jerkLimit if acc_enabled else 5.08, + "ACS_Schubabsch": 1 if acc_enabled and accel > 0.05 else 0, + "ACS_MomEingriff": 0, + "ACS_ADR_Schub": 0, + } + + commands.append(packer.make_can_msg("ACC_System", bus, values)) + + return commands + + +def create_sng_handoff_control(packer, bus, handoff_active, decel_req): + values = { + "SNG_HandoffActive": handoff_active, + "SNG_DecelReq": decel_req if handoff_active else 0.0, + } + return packer.make_can_msg("SNG_1", bus, values) + + +def create_blinker_control(packer, bus, leftBlinker, rightBlinker): + values = { + "BM_rechts": rightBlinker, + "BM_links": leftBlinker, + } + return packer.make_can_msg("Blinkmodi_02", bus, values) + + +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, leadDistance, distanceBars, fcw_alert, leadVisible, unavailable, decel, d_unresponsive): + priodisp = 0 if fcw_alert else 0 if (acc_hud_status == 4 or decel) else 2 if (acc_hud_status in (3, 2) or leadVisible) else 0 + leadDistanceBars = distanceBars + 1 if distanceBars in (1, 2, 3) else 2 + values = { + "ACA_StaACC": acc_hud_status, + "ACA_AnzDisplay": 1 if acc_hud_status in (3, 4) else 0, + "ACA_Zeitluecke": leadDistanceBars, + "ACA_V_Wunsch": set_speed, + "ACA_gemZeitl": min(15, max(1, int(round(leadDistance)))) if leadVisible else 0, + "ACA_PrioDisp": priodisp, + "ACA_Akustik1": d_unresponsive, + "ACA_Akustik2": fcw_alert, + "ACA_ACC_Verz": decel, + } + + return packer.make_can_msg("ACC_GRA_Anzeige", bus, values) + +def filter_motor2(packer, bus, motor2_stock, gra_active=False): + values = dict(motor2_stock) + if gra_active: + values.update({ + "MO2_Sta_GRA": 1, + "MO2_Status_TSK": 1, + }) + else: + values.update({ + "MO2_Sta_GRA": 0, + }) + return packer.make_can_msg("Motor_2", bus, values) + + +def filter_motor5(packer, bus, motor5_stock, gra_active=False): + values = dict(motor5_stock) + if gra_active: + values["MO5_GRA_Hauptsch"] = 1 + return packer.make_can_msg("Motor_5", bus, values) + + +def create_motor3_resume(packer, bus, motor1_stock, motor3_stock, resume=False): + values = dict(motor3_stock) + values_motor1 = dict(motor1_stock) + if resume: + values["MO3_Pedalwert"] = values_motor1["MO1_Pedalwert"] + return packer.make_can_msg("Motor_3", bus, values) + + +def create_radar_gra(packer, bus, gra_stock, counter, set_btn=False, cancel=False, resume=False, + up_short=False, down_short=False, up_long=False, down_long=False, zeitluecke=None): + values = {s: gra_stock[s] for s in [ + "GRA_Hauptschalt", # ACC main switch passthrough + "GRA_Typ_Hauptschalt", # momentary vs latching + "GRA_Kodierinfo", # configuration + "GRA_Sender", # CAN originator + ]} + values.update({ + "COUNTER": counter % 16, + "GRA_Neu_Setzen": 1 if set_btn else 0, + "GRA_Abbrechen": 1 if cancel else 0, + "GRA_Recall": 1 if resume else 0, + "GRA_Up_kurz": 1 if up_short else 0, + "GRA_Down_kurz": 1 if down_short else 0, + "GRA_Up_lang": 1 if up_long else 0, + "GRA_Down_lang": 1 if down_long else 0, + }) + if zeitluecke is not None: + values["GRA_Zeitluecke"] = zeitluecke + return packer.make_can_msg("GRA_Neu", bus, values) diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/radar_interface.py b/artifacts/package_runtime/iqdbc/car/volkswagen/radar_interface.py new file mode 100644 index 000000000..0acb2458f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/radar_interface.py @@ -0,0 +1,120 @@ +import math + +from iqdbc.can import CANParser +from iqdbc.can.dbc import DBC as DBCLoader +from iqdbc.car import Bus, structs +from iqdbc.car.interfaces import RadarInterfaceBase +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.volkswagen.values import DBC, VolkswagenFlags + +RADAR_ADDR = 0x24F +NO_OBJECT = 0 +LANE_TYPES = ("Same_Lane", "Left_Lane", "Right_Lane") +SIGNAL_SETS = tuple( + ( + f"{prefix}_ObjectID", + f"{prefix}_Long_Distance", + f"{prefix}_Lat_Distance", + f"{prefix}_Rel_Velo", + ) + for lane in LANE_TYPES + for idx in (1, 2) + for prefix in (f"{lane}_0{idx}",) +) + + +def get_radar_can_parser(CP): + if CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + dbc_name = DBC[CP.carFingerprint][Bus.radar] + dbc = DBCLoader(dbc_name) + if "Strukturen_01" in dbc.name_to_msg: + messages = [("Strukturen_01", 25)] + elif "MEB_Distance_01" in dbc.name_to_msg: + messages = [("MEB_Distance_01", 25)] + else: + return None + else: + return None + + return CANParser(DBC[CP.carFingerprint][Bus.radar], messages, 2) + + +class RadarInterface(RadarInterfaceBase): + def __init__(self, CP, CP_IQ): + super().__init__(CP, CP_IQ) + + self.updated_messages: set[int] = set() + self.trigger_msg: int = RADAR_ADDR + self._track_id_counter: int = 0 + + self.radar_off_can: bool = CP.radarUnavailable + self.rcp: CANParser | None = get_radar_can_parser(CP) + + self._pts = self.pts + + def update(self, can_strings): + """Entry-point called by the vehicle loop every CAN tick.""" + if self.radar_off_can or self.rcp is None: + return super().update(None) + + vls = self.rcp.update(can_strings) + self.updated_messages.update(vls) + + if self.trigger_msg not in self.updated_messages: + return None + + radar_data = self._process_radar_frame() + self.updated_messages.clear() + return radar_data + + def _process_radar_frame(self): + ret = structs.RadarData() + + if self.rcp is None: + return ret + + if not self.rcp.can_valid: + ret.errors.canError = True + return ret + + msg = self.rcp.vl["Strukturen_01"] if "Strukturen_01" in self.rcp.vl else self.rcp.vl["MEB_Distance_01"] + get = msg.__getitem__ + + active_objects: dict[int, tuple[float, float, float]] = {} + for obj_id_sig, long_sig, lat_sig, vel_sig in SIGNAL_SETS: + obj_id = get(obj_id_sig) + if obj_id == NO_OBJECT: + continue + + if obj_id in active_objects: + ret.errors.canError = True + return ret + + active_objects[obj_id] = ( + get(long_sig), # dRel + get(lat_sig), # yRel + get(vel_sig), # vRel + ) + + for obj_id, (d_rel, y_rel, v_rel) in active_objects.items(): + if obj_id not in self._pts: + pt = structs.RadarData.RadarPoint() + pt.trackId = self._track_id_counter + self._track_id_counter += 1 + self._pts[obj_id] = pt + else: + pt = self._pts[obj_id] + + pt.measured = True + pt.dRel = d_rel + pt.yRel = y_rel + pt.vRel = v_rel + pt.aRel = math.nan + pt.yvRel = math.nan + + inactive_ids = self._pts.keys() - active_objects.keys() + for obj_id in inactive_ids: + self._pts.pop(obj_id, None) + + ret.points = list(self._pts.values()) + return ret diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/speed_limit_manager.py b/artifacts/package_runtime/iqdbc/car/volkswagen/speed_limit_manager.py new file mode 100644 index 000000000..05b32db47 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/speed_limit_manager.py @@ -0,0 +1,563 @@ +import time +import math + +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.volkswagen.values import VolkswagenFlags +from iqdbc.car.lateral import ISO_LATERAL_ACCEL + +NOT_SET = 0 +SPEED_SUGGESTED_MAX_HIGHWAY_GER_KPH = 130 # 130 kph in germany +STREET_TYPE_URBAN = 1 +STREET_TYPE_NONURBAN = 2 +STREET_TYPE_HIGHWAY = 3 +SANITY_CHECK_DIFF_PERCENT_LOWER = 30 +SPEED_LIMIT_UNLIMITED_VZE_KPH = int(round(144 * CV.MS_TO_KPH)) +DECELERATION_PREDICATIVE = 1.0 +SEGMENT_DECAY = 10 +PSD_TYPE_SPEED_LIMIT = 1 +PSD_TYPE_CURV_SPEED = 2 +PSD_CURV_SPEED_DECAY = 4 +PSD_UNIT_KPH = 0 +PSD_UNIT_MPH = 1 + + +class SpeedLimitManager: + def __init__(self, car_params, speed_limit_max_kph=SPEED_SUGGESTED_MAX_HIGHWAY_GER_KPH, predicative=False, predicative_speed_limit=False, predicative_curve=False): + self.CP = car_params + self.v_limit_psd = NOT_SET + self.v_limit_psd_next = NOT_SET + self.v_limit_psd_legal = NOT_SET + self.v_limit_psd_next_type = NOT_SET + self.v_limit_vze = NOT_SET + self.v_limit_speed_unit_psd = PSD_UNIT_KPH + self.v_limit_vze_sanity_error = False + self.v_limit_output_last = NOT_SET + self.v_limit_max = speed_limit_max_kph + self.predicative = predicative + self.predicative_speed_limit = predicative_speed_limit + self.predicative_curve = predicative_curve + self.predicative_segments = {} + self.current_predicative_segment = {"ID": NOT_SET, "Length": NOT_SET, "Speed": NOT_SET, "StreetType": NOT_SET, "OnRampExit": NOT_SET} + self.v_limit_psd_next_last_timestamp = 0 + self.v_limit_psd_next_last = NOT_SET + self.v_limit_psd_next_decay_time = NOT_SET + self.v_limit_changed = False + + def _reset_predicative(self): + self.v_limit_psd_next = NOT_SET + self.v_limit_psd_next_type = NOT_SET + self.v_limit_psd_next_last_timestamp = 0 + self.v_limit_psd_next_last = NOT_SET + self.v_limit_psd_next_decay_time = NOT_SET + + def enable_predicative_speed_limit(self, predicative=False, reaction_to_speed_limits=False, reaction_to_curves=False): + if self.predicative == predicative and self.predicative_speed_limit == reaction_to_speed_limits and self.predicative_curve == reaction_to_curves: + return # perf + + if not predicative or (not reaction_to_speed_limits and not reaction_to_curves): + self._reset_predicative() + self.predicative = False # fully disable execution + else: + self.predicative = predicative + + if (not reaction_to_speed_limits and self.predicative_speed_limit) or (not reaction_to_curves and self.predicative_curve): + self._reset_predicative() # force reset when disabling + + self.predicative_speed_limit = reaction_to_speed_limits + self.predicative_curve = reaction_to_curves + + + def update(self, current_speed_ms, psd_04, psd_05, psd_06, vze, raining, time_car): + # try reading speed form traffic sign recognition + if vze and self.CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + self._receive_speed_limit_vze_meb(vze) + + # read speed unit from PSD_06 and also use it for traffic sign recognition if present (for now always seen on bus 0) + # the vze location/unit flag is not stable and no corresponding flag has been found yet + if psd_06: + self._receive_speed_unit_psd(psd_06) + + # try reading speed from predicative street data + if psd_04 and psd_05 and psd_06: + self._receive_current_segment_psd(psd_05) + self._refresh_current_segment() + self._build_predicative_segments(psd_04, psd_06, raining, time_car) + self._receive_speed_limit_psd_legal(psd_06) + self._get_speed_limit_psd() + if self.predicative: + self._get_speed_limit_psd_next(current_speed_ms) # this is very cpu heavy + + def get_speed_limit_predicative(self): + v_limit_output = self.v_limit_psd_next if self.predicative and self.v_limit_psd_next != NOT_SET and self.v_limit_psd_next < self.v_limit_output_last else NOT_SET + return v_limit_output * CV.KPH_TO_MS + + def get_speed_limit_predicative_type(self): + return self.v_limit_psd_next_type + + def get_speed_limit(self): + candidates = { + "vze": self.v_limit_vze if self.v_limit_vze != NOT_SET and not self.v_limit_vze_sanity_error else NOT_SET, + "psd": self.v_limit_psd if self.v_limit_psd != NOT_SET else NOT_SET, + "legal": self.v_limit_psd_legal + } + + v_limit_output = NOT_SET + for source in ["vze", "psd", "legal"]: + v = candidates[source] + if v != NOT_SET: + v_limit_output = v + break + + if v_limit_output > self.v_limit_max: + v_limit_output = self.v_limit_max + + self.v_limit_changed = True if self.v_limit_output_last != v_limit_output else False + self.v_limit_output_last = v_limit_output + + return v_limit_output * CV.KPH_TO_MS + + def _speed_limit_vze_sanitiy_check(self, speed_limit_vze_new): + if self.v_limit_output_last == NOT_SET: + self.v_limit_vze_sanity_error = False + return + + diff_p = 100 * speed_limit_vze_new / self.v_limit_output_last + self.v_limit_vze_sanity_error = True if diff_p < SANITY_CHECK_DIFF_PERCENT_LOWER else False + if speed_limit_vze_new > SPEED_LIMIT_UNLIMITED_VZE_KPH: # unlimited sign detected: use psd logic for setting maximum speed + self.v_limit_vze_sanity_error = True + + def _receive_speed_unit_psd(self, psd_06): + # keep it simple for now, the unit is supplied shortly before the corresponding speed limits are supplied for given segment ID + if psd_06["PSD_06_Mux"] == 0 and psd_06["PSD_Sys_Segment_ID"] > 1: + self.v_limit_speed_unit_psd = psd_06["PSD_Sys_Geschwindigkeit_Einheit"] + + def _convert_raw_speed_psd(self, raw_speed, street_type): + speed = NOT_SET + + if self.v_limit_speed_unit_psd == PSD_UNIT_KPH: + if 0 < raw_speed < 11: # 0 - 45 kph + speed = (raw_speed - 1) * 5 + elif 11 <= raw_speed < 23: # 50 - 160 kph + speed = 50 + (raw_speed - 11) * 10 + elif raw_speed == 23: # explicitly no legal speed limit + if street_type == STREET_TYPE_HIGHWAY: + speed = self.v_limit_max + + elif self.v_limit_speed_unit_psd == PSD_UNIT_MPH: + if 3 < raw_speed < 18: # 0 - 70 mph + speed = (5 * (raw_speed - 3)) * CV.MPH_TO_KPH + elif 18 <= raw_speed < 23: # 75 - 105 mph + speed = ((5 * (raw_speed - 3)) + 10) * CV.MPH_TO_KPH + elif raw_speed == 23: # explicitly no legal speed limit + if street_type == STREET_TYPE_HIGHWAY: + speed = self.v_limit_max + + return speed + + def _receive_speed_limit_vze_meb(self, vze): + v_limit_vze = vze["VZE_Verkehrszeichen_1"] # main traffic sign + # "VZE_Anzeigemodus" has been seen not being stable for different drives in same USA mph car, no other flag has been found yet + # for now additionally assume a car with mph speed unit nav data sgements is also supplied with mph converted vze data ("PSD_06" is available on bus 0) + # mph speed unit set in signal "Einheiten_01" does not mean the speed data being supplied in mph unit! + v_limit_vze = v_limit_vze * CV.MPH_TO_KPH if vze["VZE_Anzeigemodus"] == 1 or self.v_limit_speed_unit_psd == PSD_UNIT_MPH else v_limit_vze + self._speed_limit_vze_sanitiy_check(v_limit_vze) + self.v_limit_vze = v_limit_vze + + def _receive_current_segment_psd(self, psd_05): + if psd_05["PSD_Pos_Standort_Eindeutig"] == 1 and psd_05["PSD_Pos_Segment_ID"] != NOT_SET: + self.current_predicative_segment["Length"] = psd_05["PSD_Pos_Segmentlaenge"] + + if self.current_predicative_segment["ID"] != psd_05["PSD_Pos_Segment_ID"]: + self.current_predicative_segment["ID"] = psd_05["PSD_Pos_Segment_ID"] + self.current_predicative_segment["Speed"] = NOT_SET + self.current_predicative_segment["StreetType"] = NOT_SET + self.current_predicative_segment["OnRampExit"] = False + + def _get_segment_curvature_psd(self, psd_curvature, psd_sign, scale=2e-5): + if psd_curvature in (0, 255): + return NOT_SET + + curvature = (255 - psd_curvature) * scale + if psd_sign == 1: + curvature *= -1 + + return curvature + + def _calculate_curve_speed(self, curvature): + if curvature == NOT_SET: + return NOT_SET + + curv_speed_ms = math.sqrt(ISO_LATERAL_ACCEL / abs(curvature)) + + if self.v_limit_speed_unit_psd == PSD_UNIT_MPH: + curv_speed = int((curv_speed_ms * CV.MS_TO_MPH) // 5 * 5) * CV.MPH_TO_KPH + else: + curv_speed = int((curv_speed_ms * CV.MS_TO_KPH) // 5 * 5) + + return curv_speed + + def _refresh_current_segment(self): + current_segment = self.current_predicative_segment["ID"] + if current_segment != NOT_SET: + seg = self.predicative_segments.get(current_segment) + if seg: + self.current_predicative_segment["Speed"] = self.predicative_segments[current_segment]["Speed"] + self.current_predicative_segment["StreetType"] = self.predicative_segments[current_segment]["StreetType"] + self.current_predicative_segment["OnRampExit"] = self.predicative_segments[current_segment]["OnRampExit"] + + def _build_predicative_segments(self, psd_04, psd_06, raining, time_car): + now = time.time() + + # Segment erfassen/aktualisieren + if (psd_04["PSD_ADAS_Qualitaet"] == 1 and + psd_04["PSD_wahrscheinlichster_Pfad"] == 1 and + psd_04["PSD_Segment_ID"] != NOT_SET): + + segment_id = psd_04["PSD_Segment_ID"] + seg = self.predicative_segments.get(segment_id) + if seg: + seg["Length"] = psd_04["PSD_Segmentlaenge"] + seg["Curvature_Begin"] = self._get_segment_curvature_psd(psd_04["PSD_Anfangskruemmung"], psd_04["PSD_Anfangskruemmung_Vorz"]) + seg["Curvature_End"] = self._get_segment_curvature_psd(psd_04["PSD_Endkruemmung"], psd_04["PSD_Endkruemmung_Vorz"]) + seg["StreetType"] = self._get_street_type(psd_04["PSD_Strassenkategorie"], psd_04["PSD_Bebauung"]) + seg["OnRampExit"] = psd_04["PSD_Rampe"] in (1, 2) + seg["ID_Prev"] = psd_04["PSD_Vorgaenger_Segment_ID"] + seg["Curve_Speed_Begin"] = self._calculate_curve_speed(seg["Curvature_Begin"]) + seg["Curve_Speed_End"] = self._calculate_curve_speed(seg["Curvature_End"]) + seg["Timestamp"] = now + else: + self.predicative_segments[segment_id] = { + "ID": segment_id, + "Length": psd_04["PSD_Segmentlaenge"], + "Curvature_Begin": self._get_segment_curvature_psd(psd_04["PSD_Anfangskruemmung"], psd_04["PSD_Anfangskruemmung_Vorz"]), + "Curvature_End": self._get_segment_curvature_psd(psd_04["PSD_Endkruemmung"], psd_04["PSD_Endkruemmung_Vorz"]), + "StreetType": self._get_street_type(psd_04["PSD_Strassenkategorie"], psd_04["PSD_Bebauung"]), + "OnRampExit": psd_04["PSD_Rampe"] in (1, 2), + "ID_Prev": psd_04["PSD_Vorgaenger_Segment_ID"], + "Speed": NOT_SET, + "Curve_Speed_Begin": NOT_SET, + "Curve_Speed_End": NOT_SET, + "QualityFlag": False, + "Timestamp": now + } + seg = self.predicative_segments.get(segment_id) + seg["Curve_Speed_Begin"] = self._calculate_curve_speed(seg["Curvature_Begin"]) + seg["Curve_Speed_End"] = self._calculate_curve_speed(seg["Curvature_End"]) + + # Schritt 2: Alte Segmente bereinigen + current_id = self.current_predicative_segment["ID"] + if current_id != NOT_SET: + self.predicative_segments = { + sid: seg for sid, seg in self.predicative_segments.items() + if now - seg.get("Timestamp", 0) <= SEGMENT_DECAY + } + + # Geschwindigkeit setzen (speed limits seen for changed limits only) + if (psd_06["PSD_06_Mux"] == 2 and + psd_06["PSD_Ges_Typ"] == 1 and + psd_06["PSD_Ges_Gesetzlich_Kategorie"] == 0 and + psd_06["PSD_Ges_Segment_ID"] != NOT_SET): + + raw_speed = psd_06["PSD_Ges_Geschwindigkeit"] if self._speed_limit_is_valid_now_psd(psd_06, raining, time_car) else NOT_SET + segment_id = psd_06["PSD_Ges_Segment_ID"] + + if segment_id in self.predicative_segments: + speed = self._convert_raw_speed_psd(raw_speed, self.predicative_segments[segment_id]["StreetType"]) + self.predicative_segments[segment_id]["Speed"] = speed + self.predicative_segments[segment_id]["Speed_Type"] = PSD_TYPE_SPEED_LIMIT + self.predicative_segments[segment_id]["QualityFlag"] = True + + def _get_time_from_vw_datetime(self, time_car): + if time_car: + try: + t = (time_car["UH_Jahr"], time_car["UH_Monat"], time_car["UH_Tag"], time_car["UH_Stunde"], time_car["UH_Minute"], time_car["UH_Sekunde"], 0, 0, -1) + local_time = time.mktime(t) + return time.localtime(local_time) + except Exception: + return time.localtime() + else: + return time.localtime() + + def _speed_limit_is_valid_now_psd(self, psd_06, raining, time_car): + local_time = self._get_time_from_vw_datetime(time_car) + + # by day + day_start = psd_06["PSD_Ges_Geschwindigkeit_Tag_Anf"] + day_end = psd_06["PSD_Ges_Geschwindigkeit_Tag_Ende"] + now_weekday = (local_time.tm_wday + 1) # Python: 0=Mon -> PSD: 1=Mon + + if 1 <= day_start <= 7 and 1 <= day_end <= 7: + if day_start <= day_end: + is_valid_by_day = day_start <= now_weekday <= day_end + else: + is_valid_by_day = now_weekday >= day_start or now_weekday <= day_end + else: + is_valid_by_day = True + + # by time + hour_start = psd_06["PSD_Ges_Geschwindigkeit_Std_Anf"] + hour_end = psd_06["PSD_Ges_Geschwindigkeit_Std_Ende"] + now_hour = local_time.tm_hour + + if (hour_start != 25 and hour_end != 25): + if hour_start <= hour_end: + is_valid_by_time = hour_start <= now_hour < hour_end + else: + is_valid_by_time = now_hour >= hour_start or now_hour < hour_end + else: + is_valid_by_time = True + + # by weather condition + weather_condition = psd_06["PSD_Ges_Geschwindigkeit_Witter"] + is_valid_by_weather_conditions = weather_condition == 0 or ( raining and weather_condition == 1 ) + + checks = [ + is_valid_by_time, + is_valid_by_day, + is_valid_by_weather_conditions, + ] + + return all(checks) + + def _speed_limit_curve_allowed(self, seg): + currently_on_ramp = self.current_predicative_segment.get("OnRampExit", False) + seg_on_ramp = seg.get("OnRampExit", False) + + ramp_allowed_on_ramp = currently_on_ramp and seg_on_ramp + ramp_allowed = ramp_allowed_on_ramp or not seg_on_ramp + + # on ramp is probably type 2 TODO + # for now only allow non urban, there are problems with highway curvature data + street_type = seg.get("StreetType", NOT_SET) + street_type_allowed = True if street_type == STREET_TYPE_NONURBAN or (street_type == STREET_TYPE_HIGHWAY and ramp_allowed_on_ramp) else False + + speed_curve = seg.get("Curve_Speed", NOT_SET) + + if NOT_SET not in (self.v_limit_output_last, speed_curve): + diff_p = 100 * speed_curve / self.v_limit_output_last + sanity_error = True if diff_p < SANITY_CHECK_DIFF_PERCENT_LOWER else False + else: + sanity_error = False + + checks = [ + ramp_allowed, + street_type_allowed, + not sanity_error, + ] + + return all(checks) + + def _hit_linear_profile(self, v0_ms, a, total_dist_m, L_m, v_b_kmh, v_e_kmh): + if L_m is None or L_m <= 0: + return None, None + + v_b = v_b_kmh * CV.KPH_TO_MS + v_e = v_e_kmh * CV.KPH_TO_MS + r = (v_e - v_b) / L_m # m/s pro m + + # Flaches Profil => Standard-Bremsweg gegen v_b am Beginn + if abs(r) < 1e-9: + if v0_ms <= v_b: + return None, None + brake_dist = (v0_ms**2 - v_b**2) / (2*a) + if brake_dist >= total_dist_m: + # Aktivierung am Segmentbeginn + return 0.0, v_b_kmh + return None, None + + A = r*r + B = 2*v_b*r + 2*a + C = v_b*v_b + 2*a*total_dist_m - v0_ms*v0_ms + + D = B*B - 4*A*C + if D < 0: + return None, None + + sqrtD = math.sqrt(D) + # Smallest non-negative solution + s1 = (-B - sqrtD) / (2*A) + s2 = (-B + sqrtD) / (2*A) + s_candidates = [s for s in (s1, s2) if s >= 0.0] + + if not s_candidates: + return None, None + + s_hit = min(s_candidates) + if s_hit > L_m: + return None, None + + v_req_ms = v_b + r * s_hit + return float(s_hit), (v_req_ms * CV.MS_TO_KPH) + + def _dfs(self, seg_id, total_dist, visited, current_speed_ms, best_result, path): + if seg_id in visited or seg_id not in path: + return + visited.add(seg_id) + + seg = self.predicative_segments.get(seg_id) + if not seg: + return + + candidates = [] + + length = seg.get("Length", NOT_SET) + + # Speed-Limit + if self.predicative_speed_limit: + sl = seg.get("Speed", NOT_SET) + if sl != NOT_SET: + qual_ok = seg.get("QualityFlag", False) + candidates.append((sl, PSD_TYPE_SPEED_LIMIT, 0.0, qual_ok)) + + # Curve-Speed + if self.predicative_curve and self._speed_limit_curve_allowed(seg): + cs_begin = seg.get("Curve_Speed_Begin", NOT_SET) + cs_end = seg.get("Curve_Speed_End", NOT_SET) + + if cs_begin != NOT_SET: + candidates.append((cs_begin, PSD_TYPE_CURV_SPEED, 0.0, True)) + + if cs_end != NOT_SET and length > 0: + candidates.append((cs_end, PSD_TYPE_CURV_SPEED, length, True)) + + # Curve-Speed Profile + if cs_begin != NOT_SET and cs_end != NOT_SET and length > 0: + s_hit, v_req_kmh = self._hit_linear_profile(v0_ms=current_speed_ms, a=DECELERATION_PREDICATIVE, + total_dist_m=total_dist, L_m=length, v_b_kmh=cs_begin, v_e_kmh=cs_end) + if s_hit is not None and v_req_kmh is not None: + candidates.append((v_req_kmh, PSD_TYPE_CURV_SPEED, s_hit, True)) + + # check candidates + for cand_speed_kmh, cand_type, activation_offset, qual_ok in candidates: + if cand_speed_kmh == NOT_SET: + continue + + if not qual_ok: + continue + + v_target_ms = cand_speed_kmh * CV.KPH_TO_MS + if not (v_target_ms < current_speed_ms and (cand_speed_kmh < self.v_limit_output_last or self.v_limit_output_last == NOT_SET)): + continue + + brake_dist = (current_speed_ms**2 - v_target_ms**2) / (2 * DECELERATION_PREDICATIVE) + if brake_dist <= 0: + continue + + dist_to_activation = total_dist + activation_offset + if dist_to_activation <= brake_dist: + # choose lowest limit or shorter length when equal + better = False + if cand_speed_kmh < best_result["limit"]: + better = True + elif cand_speed_kmh == best_result["limit"] and dist_to_activation < best_result["dist"]: + better = True + + if better: + best_result["limit"] = cand_speed_kmh + best_result["type"] = cand_type + best_result["dist"] = dist_to_activation # represents distance to limit + best_result["length"] = length - activation_offset # represents remaining distance with limit for curves + + children = [sid for sid, s in self.predicative_segments.items() if s.get("ID_Prev") == seg_id] + if len(children) > 1: + return # Split detected, can not decide unique limit on current path + + for next_id in children: + if seg_id == self.current_predicative_segment.get("ID"): + next_length = self.current_predicative_segment.get("Length", 0) + else: + next_length = seg.get("Length", 0) + + self._dfs(next_id, total_dist + next_length, visited.copy(), current_speed_ms, best_result, path) + + def _build_path_psd(self, start_seg_id): + path = [] + current_id = start_seg_id + visited = set() + + segment_children_map = {} + for sid, seg in self.predicative_segments.items(): + parent = seg.get("ID_Prev") + if parent not in (None, NOT_SET): + segment_children_map.setdefault(parent, []).append(sid) + + while current_id != NOT_SET: + if current_id in visited: + break + visited.add(current_id) + path.append(current_id) + children = segment_children_map.get(current_id, []) + if len(children) != 1: + break + current_id = children[0] + + return path + + def _get_speed_limit_psd_next(self, current_speed_ms): + current_id = self.current_predicative_segment.get("ID") + self.v_limit_psd_next = NOT_SET + + if current_id == NOT_SET: + return + + path = self._build_path_psd(current_id) + + if len(path) <= 1: + return + + best_result = {"limit": float('inf'), "type": NOT_SET, "dist": float('inf'), "length": float('inf')} + self._dfs(current_id, 0, set(), current_speed_ms, best_result, path) + + now = time.time() + if best_result["limit"] != float('inf'): + self.v_limit_psd_next = best_result["limit"] + self.v_limit_psd_next_type = best_result["type"] + self.v_limit_psd_next_last = best_result["limit"] + self.v_limit_psd_next_last_timestamp = now + self.v_limit_psd_next_decay_time = math.sqrt(2 * best_result["dist"] / DECELERATION_PREDICATIVE) + if self.v_limit_psd_next_type == PSD_TYPE_CURV_SPEED: + self.v_limit_psd_next_decay_time += max((best_result["length"] / (self.v_limit_psd_next * CV.KPH_TO_MS)), PSD_CURV_SPEED_DECAY) + else: + if now - self.v_limit_psd_next_last_timestamp <= self.v_limit_psd_next_decay_time and self.v_limit_output_last > self.v_limit_psd_next_last and not self.v_limit_changed: + self.v_limit_psd_next = self.v_limit_psd_next_last + else: + self.v_limit_psd_next_last = NOT_SET + self.v_limit_psd_next_decay_time = NOT_SET + self.v_limit_psd_next_type = NOT_SET + + def _get_speed_limit_psd(self): + seg_id = self.current_predicative_segment.get("ID") + if seg_id == NOT_SET: + self.v_limit_psd = NOT_SET + return + + seg = self.predicative_segments.get(seg_id) + if seg and seg.get("Speed") != NOT_SET: + self.v_limit_psd = seg.get("Speed") + + def _get_street_type(self, strassenkategorie, bebauung): + street_type = NOT_SET + + if strassenkategorie == 1: # base type: urban + street_type = STREET_TYPE_URBAN + + elif strassenkategorie in (2, 3, 4): # base type: non urban + if bebauung == 1: + street_type = STREET_TYPE_URBAN + else: + street_type = STREET_TYPE_NONURBAN + + elif strassenkategorie == 5: # base type: highway + street_type = STREET_TYPE_HIGHWAY + + return street_type + + def _receive_speed_limit_psd_legal(self, psd_06): + if psd_06["PSD_06_Mux"] == 2: + if psd_06["PSD_Ges_Typ"] == 2: + street_type = self.current_predicative_segment["StreetType"] + if ((psd_06["PSD_Ges_Gesetzlich_Kategorie"] == STREET_TYPE_URBAN and street_type == STREET_TYPE_URBAN) or + (psd_06["PSD_Ges_Gesetzlich_Kategorie"] == STREET_TYPE_NONURBAN and street_type == STREET_TYPE_NONURBAN) or + (psd_06["PSD_Ges_Gesetzlich_Kategorie"] == STREET_TYPE_HIGHWAY and street_type == STREET_TYPE_HIGHWAY)): + raw_speed = psd_06["PSD_Ges_Geschwindigkeit"] + self.v_limit_psd_legal = self._convert_raw_speed_psd(raw_speed, street_type) diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/__init__.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_driver_override.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_driver_override.py new file mode 100644 index 000000000..de9e1a372 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_driver_override.py @@ -0,0 +1,17 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import pytest + +from iqdbc.car.volkswagen.carcontroller import accel_during_driver_override + + +@pytest.mark.parametrize("accel", [-3.5, -0.5, 0.0, 0.5, 2.0]) +def test_opted_in_driver_override_sends_neutral_accel(accel): + assert accel_during_driver_override(accel, True, True) == 0.0 + + +@pytest.mark.parametrize("gas_pressed,keep_long_active", [(False, False), (False, True), (True, False)]) +def test_other_longitudinal_paths_preserve_accel(gas_pressed, keep_long_active): + assert accel_during_driver_override(-0.7, gas_pressed, keep_long_active) == -0.7 diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_gra_cancel_tap.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_gra_cancel_tap.py new file mode 100644 index 000000000..33d293f73 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_gra_cancel_tap.py @@ -0,0 +1,42 @@ +from iqdbc.car.volkswagen.carcontroller import CarController +from iqdbc.car.volkswagen.values import CarControllerParams + + +class _Tapper: + CCP = CarControllerParams + + def __init__(self): + self.gra_cancel_ticks = 0 + + def tap(self, cancel_req, gra_send_ready=True): + return CarController._tap_gra_cancel(self, cancel_req, gra_send_ready) + + +def _pattern(tapper, ticks, cancel_req=True): + return "".join("1" if tapper.tap(cancel_req) else "0" for _ in range(ticks)) + + +def test_held_cancel_is_bounded(): + held = _pattern(_Tapper(), 2000).count("1") + assert held == CarControllerParams.GRA_CANCEL_TAP_ON * CarControllerParams.GRA_CANCEL_MAX_TAPS + assert held < 50 + + +def test_cancel_is_tapped_not_held(): + on, off = CarControllerParams.GRA_CANCEL_TAP_ON, CarControllerParams.GRA_CANCEL_TAP_OFF + expected = ("1" * on + "0" * off) * CarControllerParams.GRA_CANCEL_MAX_TAPS + assert _pattern(_Tapper(), len(expected)) == expected + + +def test_taps_rearm_after_request_clears(): + tapper = _Tapper() + _pattern(tapper, 2000) + assert not tapper.tap(False) + assert _pattern(tapper, CarControllerParams.GRA_CANCEL_TAP_ON) == "1" * CarControllerParams.GRA_CANCEL_TAP_ON + + +def test_ticks_only_advance_on_stock_counter_change(): + tapper = _Tapper() + for _ in range(500): + assert tapper.tap(True, gra_send_ready=False) + assert tapper.gra_cancel_ticks == 0 diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_iqpilot_vw_toggles.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_iqpilot_vw_toggles.py new file mode 100644 index 000000000..7e0d6c733 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_iqpilot_vw_toggles.py @@ -0,0 +1,49 @@ +from types import SimpleNamespace + +from iqdbc.car.volkswagen import mqbcan, pqcan +from iqdbc.car.volkswagen.carcontroller import CarController +from iqdbc.car.volkswagen.values import CAR, MQB_A0_CARS + + +def test_is_mqb_a0_car_matches_expected_platforms(): + assert CAR.VOLKSWAGEN_POLO_MK6 in MQB_A0_CARS + assert CAR.VOLKSWAGEN_TCROSS_MK1 in MQB_A0_CARS + assert CAR.SKODA_FABIA_MK4 in MQB_A0_CARS + assert CAR.SKODA_KAMIQ_MK1 in MQB_A0_CARS + assert CarController._is_mqb_a0_car(CAR.VOLKSWAGEN_POLO_MK6) + assert CarController._is_mqb_a0_car(CAR.VOLKSWAGEN_TCROSS_MK1) + assert CarController._is_mqb_a0_car(CAR.SKODA_FABIA_MK4) + assert CarController._is_mqb_a0_car(CAR.SKODA_KAMIQ_MK1) + assert not CarController._is_mqb_a0_car(CAR.VOLKSWAGEN_GOLF_MK7) + + +def test_mqb_steering_torque_scale_only_changes_when_toggle_enabled(): + controller = object.__new__(CarController) + controller.CCS = mqbcan + assert controller._get_mqb_steering_torque_scale(0.4, False) == 1.0 + + assert controller._get_mqb_steering_torque_scale(0.4, True) == 0.8 + assert controller._get_mqb_steering_torque_scale(4.0, True) == 1.0 + + controller.CCS = pqcan + assert controller._get_mqb_steering_torque_scale(0.4, True) == 1.0 + + +def test_mqb_a0_resume_spam_requires_toggle_platform_and_window(): + controller = object.__new__(CarController) + controller.CCS = mqbcan + controller.is_mqb_a0 = True + controller.frame = 10 + cs = SimpleNamespace(out=SimpleNamespace(standstill=True)) + + assert controller._should_spam_mqb_a0_resume(cs, True) + + controller.frame = 20 + assert not controller._should_spam_mqb_a0_resume(cs, True) + + controller.frame = 10 + controller.is_mqb_a0 = False + assert not controller._should_spam_mqb_a0_resume(cs, True) + + controller.is_mqb_a0 = True + assert not controller._should_spam_mqb_a0_resume(cs, False) diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_meb_nav_blinker.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_meb_nav_blinker.py new file mode 100644 index 000000000..ff567fa38 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_meb_nav_blinker.py @@ -0,0 +1,98 @@ +"""Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved.""" + +from iqdbc.can import CANPacker, CANParser +from iqdbc.car.volkswagen import mebcan +from iqdbc.car.volkswagen.carcontroller import ea_blinker_command, ea_send_ready, next_ea_counter + + +EA_HUD_VALUES = { + "COUNTER": 0, + "EA_Texte": 0, + "ACF_Lampe_Hands_Off": 0, + "EA_Infotainment_Anf": 0, + "EA_Tueren_Anf": 0, + "EA_Innenraumlicht_Anf": 0, + "zFAS_Warnblinken": 0, + "STP_Primaeranz": 0, + "EA_Bremslichtblinken": 0, + "EA_Blinken": 0, + "EA_Unknown": 0, +} +EA_CONTROL_VALUES = {"EA_Funktionsstatus": 2} + + +def blinker_values(dbc, requests): + packer = CANPacker(dbc) + parser = CANParser(dbc, [("EA_02", 50)], 0) + values = [] + for counter, stock_blinker, left, right in requests: + ea_hud_values = {**EA_HUD_VALUES, "COUNTER": counter, "EA_Blinken": stock_blinker} + msg = mebcan.create_blinker_control( + packer, 0, ea_hud_values, EA_CONTROL_VALUES, left, right, False, + ) + parser.update([0, [msg]]) + values.append((int(parser.vl["EA_02"]["COUNTER"]), int(parser.vl["EA_02"]["EA_Blinken"]))) + return values + + +def blinker_value(dbc, counter, stock_blinker, left, right, override_counter=None): + packer = CANPacker(dbc) + parser = CANParser(dbc, [("EA_02", 50)], 0) + ea_hud_values = {**EA_HUD_VALUES, "COUNTER": counter, "EA_Blinken": stock_blinker} + msg = mebcan.create_blinker_control( + packer, 0, ea_hud_values, EA_CONTROL_VALUES, left, right, False, override_counter, + ) + parser.update([0, [msg]]) + return int(parser.vl["EA_02"]["COUNTER"]), int(parser.vl["EA_02"]["EA_Blinken"]) + + +def test_nav_blinker_request_remains_asserted_until_released(): + requests = [(counter % 16, 0, True, False) for counter in range(100)] + [(4, 0, False, False)] + assert blinker_values("vw_meb", requests) == [(counter % 16, 1) for counter in range(100)] + [(4, 0)] + + +def test_nav_blinker_directions_on_meb_variants(): + requests = [(7, 0, True, False), (8, 0, False, True), (9, 0, False, False)] + for dbc in ("vw_meb", "vw_meb_2024", "vw_mqbevo"): + assert blinker_values(dbc, requests) == [(7, 1), (8, 2), (9, 0)] + + +def test_stock_blinker_has_priority_over_nav_request(): + requests = [(10, 1, False, True), (11, 2, True, False), (12, 3, True, False)] + assert blinker_values("vw_meb", requests) == [(10, 1), (11, 2), (12, 3)] + + +def test_ea_frame_is_sent_once_per_stock_counter(): + last_counter = None + sends = [] + for counter in (5, 5, 5, 6, 6, 7): + stock_values = {"COUNTER": counter} + if ea_send_ready(stock_values, last_counter): + sends.append(counter) + last_counter = counter + assert sends == [5, 6, 7] + + +def test_blinker_counter_can_continue_between_stock_frames(): + assert blinker_value("vw_meb", 8, 0, True, False, 9) == (9, 1) + assert blinker_value("vw_meb", 8, 0, True, False, 10) == (10, 1) + + +def test_stock_blinker_priority_survives_counter_override(): + assert blinker_value("vw_meb", 8, 2, True, False, 9) == (9, 2) + + +def test_nav_blinker_retriggers_only_between_lamp_cycles(): + assert ea_blinker_command(True, False, False, False) == (True, False) + assert ea_blinker_command(True, False, True, False) == (False, False) + assert ea_blinker_command(True, False, False, False) == (True, False) + assert ea_blinker_command(False, True, False, True) == (False, False) + + +def test_blinker_counter_runs_at_20_ms(): + tx_counter = None + counters = [] + for _ in range(10): + tx_counter = next_ea_counter(tx_counter, 14) + counters.append(tx_counter) + assert counters == [15, 0, 1, 2, 3, 4, 5, 6, 7, 8] diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_mqb_extended_standstill.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_mqb_extended_standstill.py new file mode 100644 index 000000000..ab79339b7 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_mqb_extended_standstill.py @@ -0,0 +1,363 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import math +from types import SimpleNamespace + +from iqdbc.car.volkswagen.carcontroller import MQBStandstillManager + + +def _pitch(grade_pct): + return math.atan(grade_pct / 100.0) + + +def _mgr(): + return MQBStandstillManager(vehicle_mass=1540.0, accel_min=-3.5) + + +def _cs(*, esp_hold_confirmation=False, esp_stopping=False, rolling_backward=False, + rolling_forward=False, brake_pressed=False, gas_pressed=False, standstill=True, v_ego=0.0, + sum_wegimpulse=0): + out = SimpleNamespace(brakePressed=brake_pressed, gasPressed=gas_pressed, standstill=standstill, vEgo=v_ego) + return SimpleNamespace(out=out, esp_hold_confirmation=esp_hold_confirmation, + esp_stopping=esp_stopping, rolling_backward=rolling_backward, + rolling_forward=rolling_forward, sum_wegimpulse=sum_wegimpulse) + + +def _run(mgr, cs, *, long_active=True, accel=0.0, stopping=False, starting=False, + max_planned_speed=0.0, grade_pct=0.0, tsk_brake_torque=0.0): + return mgr.update(cs, long_active, accel, stopping, starting, max_planned_speed, + _pitch(grade_pct), tsk_brake_torque) + + +def _safe_speed(mgr, grade_pct, brake_torque=0.0): + return mgr.get_safe_speed_for_brake_torque(_pitch(grade_pct), brake_torque) + + +# ── brake press ────────────────────────────────────────────────────────────── + +def test_brake_pressed_disables_long_active(): + mgr = _mgr() + long_active, *_ = _run(mgr, _cs(brake_pressed=True), long_active=True) + assert not long_active + + +# ── rollback detection ─────────────────────────────────────────────────────── + +def test_rollback_detected_on_rolling_backward(): + mgr = _mgr() + _run(mgr, _cs(rolling_backward=True)) + assert mgr.rollback_detected + + +def test_rollback_clears_on_rolling_forward(): + mgr = _mgr() + _run(mgr, _cs(rolling_backward=True)) + assert mgr.rollback_detected + _run(mgr, _cs(rolling_forward=True)) + assert not mgr.rollback_detected + + +def test_rollback_forces_brake(): + mgr = _mgr() + _run(mgr, _cs(rolling_backward=True)) + _, accel, *_ = _run(mgr, _cs(), accel=-0.5) + assert accel == mgr.accel_min + + +def test_rollback_cleared_when_rolling_forward_passes_through_accel(): + mgr = _mgr() + _run(mgr, _cs(rolling_backward=True)) + _, accel, *_ = _run(mgr, _cs(rolling_forward=True, standstill=False), accel=-0.5) + assert accel == -0.5 + + +def test_rollback_forces_brake_with_positive_accel(): + mgr = _mgr() + _run(mgr, _cs(rolling_backward=True)) + _, accel, stopping, starting, *_ = _run(mgr, _cs(), accel=0.5) + assert accel == mgr.accel_min + assert stopping + assert not starting + + +# ── safe speed braking ─────────────────────────────────────────────────────── + +def test_flat_ground_passes_raw_accel(): + mgr = _mgr() + _, accel, stopping, starting, *_ = _run(mgr, _cs(v_ego=0.0), accel=-0.55, + stopping=True, starting=False, grade_pct=0.0) + assert accel == -0.55 + assert stopping + assert not starting + + +def test_current_brake_torque_reduces_safe_speed(): + mgr = _mgr() + zero_brake_safe_speed = _safe_speed(mgr, 20.0) + current_brake_safe_speed = _safe_speed(mgr, 20.0, 500.0) + assert 0.0 < current_brake_safe_speed < zero_brake_safe_speed + + +def test_current_brake_torque_can_eliminate_safe_speed(): + mgr = _mgr() + assert _safe_speed(mgr, 20.0, 10000.0) == 0.0 + + +def test_safe_speed_is_capped_at_10_kph(): + mgr = _mgr() + assert _safe_speed(mgr, 100.0) == MQBStandstillManager.MAX_SAFE_STOPPING_SPEED + + +def test_esp_stopping_passes_raw_accel_on_flat(): + mgr = _mgr() + _, accel, stopping, starting, esp_starting_override, esp_stopping_override = _run( + mgr, _cs(esp_stopping=True, v_ego=0.2), accel=-0.55, stopping=True, starting=False, + ) + assert accel == -0.55 + assert stopping + assert not starting + assert esp_starting_override is True + assert esp_stopping_override is False + + +def test_below_safe_speed_blends_brake(): + mgr = _mgr() + grade = 20.0 + safe_speed = _safe_speed(mgr, grade) + required_torque = mgr.get_hill_hold_decel_deficit(_pitch(grade), 0.0) * mgr.vehicle_mass * mgr.ASSUMED_WHEEL_RADIUS + _, accel, stopping, starting, *_ = _run( + mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.55, grade_pct=grade, + tsk_brake_torque=required_torque * 0.5, + ) + assert mgr.accel_min < accel < -0.55 + assert stopping + assert not starting + + +def test_sufficient_brake_torque_passes_raw_accel(): + mgr = _mgr() + grade = 20.0 + safe_speed = _safe_speed(mgr, grade) + _, accel, stopping, starting, *_ = _run( + mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.2, stopping=True, starting=False, + grade_pct=grade, tsk_brake_torque=10000.0, + ) + assert accel == -0.2 + assert stopping + assert not starting + + +def test_below_safe_speed_with_low_planned_speed_uses_blended_braking(): + mgr = _mgr() + grade = 20.0 + safe_speed = _safe_speed(mgr, grade) + _, accel, stopping, starting, *_ = _run( + mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.55, + max_planned_speed=safe_speed * 0.5, grade_pct=grade, + ) + assert mgr.accel_min <= accel < -0.55 + assert stopping + assert not starting + + +def test_below_safe_speed_with_high_planned_speed_and_negative_accel_uses_blended_braking(): + mgr = _mgr() + grade = 20.0 + safe_speed = _safe_speed(mgr, grade) + _, accel, stopping, starting, *_ = _run( + mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.55, + max_planned_speed=safe_speed * 2.0, grade_pct=grade, + ) + assert mgr.accel_min <= accel < -0.55 + assert stopping + assert not starting + + +def test_below_safe_speed_with_high_planned_speed_and_positive_accel_uses_hill_takeoff(): + mgr = _mgr() + grade = 20.0 + safe_speed = _safe_speed(mgr, grade) + _, accel, stopping, starting, *_ = _run( + mgr, _cs(v_ego=safe_speed * 0.5), accel=0.1, + max_planned_speed=safe_speed * 2.0, grade_pct=grade, + ) + assert accel == max(0.1, 0.1 * grade, 0.2) + assert starting + assert not stopping + + +# ── start commit ───────────────────────────────────────────────────────────── + +def test_start_commit_on_pre_enable(): + mgr = _mgr() + _run(mgr, _cs(esp_hold_confirmation=True)) + assert mgr.start_commit_active + + +def test_start_commit_forces_accel(): + mgr = _mgr() + grade = 10.0 + expected_min = max(0.1 * grade, 0.2) + _run(mgr, _cs(esp_hold_confirmation=True), grade_pct=grade) + _, accel, stopping, starting, *_ = _run( + mgr, _cs(esp_hold_confirmation=True), accel=0.0, grade_pct=grade, + ) + assert accel >= expected_min + assert starting + assert not stopping + + +def test_start_commit_clears_above_safe_speed_while_moving(): + mgr = _mgr() + grade = 20.0 + safe_speed = _safe_speed(mgr, grade) + _run(mgr, _cs(esp_hold_confirmation=True), grade_pct=grade) + assert mgr.start_commit_active + _run(mgr, _cs(v_ego=safe_speed * 2.0, standstill=True), grade_pct=grade) + assert not mgr.start_commit_active + + +def test_start_commit_persists_below_safe_speed(): + mgr = _mgr() + grade = 20.0 + safe_speed = _safe_speed(mgr, grade) + _run(mgr, _cs(esp_hold_confirmation=True), grade_pct=grade) + assert mgr.start_commit_active + _, accel, stopping, starting, *_ = _run( + mgr, _cs(v_ego=safe_speed * 0.5), accel=-0.55, grade_pct=grade, + ) + assert mgr.start_commit_active + assert accel == max(-0.55, 0.1 * grade, 0.2) + assert starting + assert not stopping + + +# ── can_stop_forever / ESP override ────────────────────────────────────────── + +def test_can_stop_forever_latches_on_esp_stopping(): + mgr = _mgr() + *_, esp_start, esp_stop = _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True) + assert mgr.can_stop_forever + assert esp_start is True + assert esp_stop is False + + +def test_can_stop_forever_persists(): + mgr = _mgr() + _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True) + *_, esp_start, esp_stop = _run(mgr, _cs(), accel=-1.0, stopping=True) + assert mgr.can_stop_forever + assert esp_start is True + assert esp_stop is False + + +def test_can_stop_forever_cleared_by_hold_confirmation(): + mgr = _mgr() + _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True) + assert mgr.can_stop_forever + _run(mgr, _cs(esp_hold_confirmation=True), accel=-1.0, stopping=True) + assert not mgr.can_stop_forever + + +def test_hold_confirmation_recovers_stop_forever_after_launch_commit(): + mgr = _mgr() + grade = 20.0 + safe_speed = _safe_speed(mgr, grade) + + *_, esp_start, esp_stop = _run(mgr, _cs(esp_hold_confirmation=True, sum_wegimpulse=0), + accel=0.0, grade_pct=grade) + assert mgr.start_commit_active + assert mgr.hold_recovery_active + assert esp_start is True + assert esp_stop is False + + *_, esp_start, esp_stop = _run(mgr, _cs(v_ego=safe_speed * 2.0, standstill=False, sum_wegimpulse=1), + accel=0.0, grade_pct=grade) + assert not mgr.start_commit_active + assert mgr.hold_recovery_active + assert esp_start is False + assert esp_stop is True + + *_, esp_start, esp_stop = _run(mgr, _cs(esp_stopping=True, v_ego=safe_speed * 2.0, standstill=False, + sum_wegimpulse=2), accel=0.0, grade_pct=grade) + assert mgr.can_stop_forever + assert not mgr.hold_recovery_active + assert esp_start is True + assert esp_stop is False + + +def test_can_stop_forever_cleared_when_moving(): + mgr = _mgr() + _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True) + assert mgr.can_stop_forever + _run(mgr, _cs(v_ego=MQBStandstillManager.ESP_OVERRIDE_SPEED + 0.01), accel=0.5) + assert not mgr.can_stop_forever + + +def test_can_stop_forever_cleared_when_long_inactive(): + mgr = _mgr() + _run(mgr, _cs(esp_stopping=True), accel=-1.0, stopping=True) + assert mgr.can_stop_forever + _run(mgr, _cs(), long_active=False) + assert not mgr.can_stop_forever + + +def test_esp_override_stop_at_standstill(): + mgr = _mgr() + esp_start = esp_stop = None + for _ in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + 1): + *_, esp_start, esp_stop = _run(mgr, _cs(sum_wegimpulse=0), accel=-1.0, stopping=True) + assert esp_start is False + assert esp_stop is True + + +def test_esp_override_stop_persists_at_standstill(): + mgr = _mgr() + for _ in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + 1): + _run(mgr, _cs(sum_wegimpulse=0), accel=-1.0, stopping=True) + *_, esp_start, esp_stop = _run(mgr, _cs(sum_wegimpulse=0), accel=-1.0, stopping=True) + assert esp_start is False + assert esp_stop is True + + +def test_esp_override_stop_not_sent_while_esp_stopping(): + mgr = _mgr() + *_, esp_start, esp_stop = _run(mgr, _cs(esp_stopping=True, sum_wegimpulse=0), + accel=-1.0, stopping=True) + assert mgr.can_stop_forever + assert esp_start is True + assert esp_stop is False + + +def test_esp_override_stop_not_requested_while_moving(): + mgr = _mgr() + esp_start = esp_stop = None + for sum_wegimpulse in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + 1): + *_, esp_start, esp_stop = _run(mgr, _cs(sum_wegimpulse=sum_wegimpulse), accel=-1.0, stopping=True) + assert esp_start is True + assert esp_stop is False + + +def test_esp_override_default_below_grant_speed_when_inactive(): + mgr = _mgr() + *_, esp_start, esp_stop = _run(mgr, _cs(), long_active=False) + assert esp_start is True + assert esp_stop is False + + +def test_wegimpulse_at_standstill_after_stillness_frames(): + mgr = _mgr() + for _ in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + 1): + _run(mgr, _cs(sum_wegimpulse=0)) + assert mgr.frames_since_last_wheel_pulse >= MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES + + +def test_wegimpulse_resets_on_change(): + mgr = _mgr() + for _ in range(MQBStandstillManager.WEGIMPULSE_STILLNESS_FRAMES): + _run(mgr, _cs(sum_wegimpulse=0)) + _run(mgr, _cs(sum_wegimpulse=1)) + assert mgr.frames_since_last_wheel_pulse == 0 + + diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_pq_accel_control.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_pq_accel_control.py new file mode 100644 index 000000000..143a169cc --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_pq_accel_control.py @@ -0,0 +1,26 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import pytest + +from iqdbc.can import CANPacker +from iqdbc.car.volkswagen import pqcan + + +@pytest.mark.parametrize("accel, acc_control, expected", [ + (-1.0, 1, False), + (0.0, 1, False), + (0.05, 1, False), + (0.051, 1, True), + (1.0, 1, True), + (1.0, 0, False), +]) +def test_positive_acceleration_prevents_fuel_cutoff(accel, acc_control, expected): + packer = CANPacker("vw_pq") + messages = pqcan.create_acc_accel_control( + packer, 0, 1, accel, acc_control, False, False, False, 0.2, 0.3, False, + ) + assert len(messages) == 1 + _, data, _ = messages[0] + assert bool(data[1] & 0x80) is expected diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_stopping.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_stopping.py new file mode 100644 index 000000000..9a07a21cb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_stopping.py @@ -0,0 +1,33 @@ +import pytest + +from iqdbc.car.volkswagen.interface import CarInterface +from iqdbc.car.volkswagen.values import ( + CAR, PASSAT_B7_STOP_ACCEL, PASSAT_B7_STOPPING_SPEED, PQ_STOPPING_SPEED, + VolkswagenFlags, apply_pq_stopping_accel, get_longitudinal_stopping_speed_override, +) + + +@pytest.mark.parametrize("candidate, flags, expected", [ + (CAR.VOLKSWAGEN_PASSAT_B7, VolkswagenFlags.PQ, PASSAT_B7_STOPPING_SPEED), + (CAR.VOLKSWAGEN_JETTA_MK6, VolkswagenFlags.PQ, PQ_STOPPING_SPEED), + (CAR.VOLKSWAGEN_GOLF_MK7, 0, 0.0), + (CAR.VOLKSWAGEN_ID4_MK1, VolkswagenFlags.MEB, 0.0), +]) +def test_stopping_speed_override(candidate, flags, expected): + assert get_longitudinal_stopping_speed_override(candidate, flags) == expected + + +def test_passat_b7_stop_accel_is_exact(): + assert apply_pq_stopping_accel(CAR.VOLKSWAGEN_PASSAT_B7, -0.2, True) == PASSAT_B7_STOP_ACCEL == -0.55 + assert apply_pq_stopping_accel(CAR.VOLKSWAGEN_PASSAT_B7, -0.2, False) == -0.2 + assert apply_pq_stopping_accel(CAR.VOLKSWAGEN_JETTA_MK6, -0.2, True) == -0.2 + + +@pytest.mark.parametrize("candidate", [ + CAR.VOLKSWAGEN_JETTA_MK6, + CAR.VOLKSWAGEN_PASSAT_NMS, +]) +def test_pq_longitudinal_feedforward_uses_active_schema_field(candidate): + fingerprint = {bus: {} for bus in range(8)} + cp = CarInterface.get_params(candidate, fingerprint, [], alpha_long=True, is_release=False, docs=False) + assert cp.longitudinalTuning.kf == pytest.approx(1.2) diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_volkswagen.py b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_volkswagen.py new file mode 100644 index 000000000..bff552d01 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/tests/test_volkswagen.py @@ -0,0 +1,436 @@ +import random +import re +from types import SimpleNamespace + +import pytest + +from iqdbc.can import CANPacker +from iqdbc.car import Bus, DT_CTRL, structs +from iqdbc.car.volkswagen.carstate import CarState +from iqdbc.car.structs import CarParams +from iqdbc.car.volkswagen.interface import CarInterface +from iqdbc.car.volkswagen.values import (CAR, FW_QUERY_CONFIG, MLB_ACC_COORDINATOR_MSGS, MLB_GEARBOX_MSGS, MLB_MSG_ACC_10, + MLB_MSG_GATEWAY_05, MLB_MSG_GETRIEBE_01, MLB_MSG_LH_EPS_03, WMI, VolkswagenFlags, + VolkswagenFlagsIQ, VolkswagenSafetyFlags) +from iqdbc.car.volkswagen.fingerprints import FW_VERSIONS + +Ecu = CarParams.Ecu + +CHASSIS_CODE_PATTERN = re.compile('[A-Z0-9]{2}') +# TODO: determine the unknown groups +SPARE_PART_FW_PATTERN = re.compile(b'\xf1\x87(?P[0-9][0-9A-Z]{2})(?P[0-9][0-9A-Z][0-9])(?P[0-9A-Z]{2}[0-9])([A-Z0-9]| )') + + +class TestVolkswagenPlatformConfigs: + def test_spare_part_fw_pattern(self, subtests): + # Relied on for determining if a FW is likely VW + for platform, ecus in FW_VERSIONS.items(): + with subtests.test(platform=platform.value): + for fws in ecus.values(): + for fw in fws: + assert SPARE_PART_FW_PATTERN.match(fw) is not None, f"Bad FW: {fw}" + + def test_chassis_codes(self, subtests): + for platform in CAR: + with subtests.test(platform=platform.value): + assert len(platform.config.wmis) > 0, "WMIs not set" + assert len(platform.config.chassis_codes) > 0, "Chassis codes not set" + assert all(CHASSIS_CODE_PATTERN.match(cc) for cc in + platform.config.chassis_codes), "Bad chassis codes" + + # No two platforms should share chassis codes + for comp in CAR: + if platform == comp: + continue + + shared_chassis_codes = platform.config.chassis_codes & comp.config.chassis_codes + if len(shared_chassis_codes) == 0: + continue + + # A shared chassis code is unambiguous when the VIN WMI separates the candidates. + if platform.config.wmis.isdisjoint(comp.config.wmis): + continue + + platform_model_years = getattr(platform.config, "model_years", set()) + comp_model_years = getattr(comp.config, "model_years", set()) + if platform_model_years and comp_model_years and platform_model_years.isdisjoint(comp_model_years): + continue + + radar_ecu = (Ecu.fwdRadar, 0x757, None) + platform_radar_fw = set(FW_VERSIONS.get(platform, {}).get(radar_ecu, [])) + comp_radar_fw = set(FW_VERSIONS.get(comp, {}).get(radar_ecu, [])) + if not platform_radar_fw or not comp_radar_fw: + continue + assert platform_radar_fw.isdisjoint(comp_radar_fw), f"Ambiguous VIN and radar firmware: {comp}" + + def test_custom_fuzzy_fingerprinting(self, subtests): + all_radar_fw = list({fw for ecus in FW_VERSIONS.values() for fw in ecus.get((Ecu.fwdRadar, 0x757, None), [])}) + + for platform in CAR: + with subtests.test(platform=platform.name): + for wmi in WMI: + for chassis_code in platform.config.chassis_codes | {"00"}: + platform_model_years = getattr(platform.config, "model_years", set()) + model_years = platform_model_years if platform_model_years else {"0"} + for model_year in model_years | {"0"}: + vin = ["0"] * 17 + vin[0:3] = wmi + vin[6:8] = chassis_code + vin[9] = model_year + vin = "".join(vin) + + for radar_fw in random.sample(all_radar_fw, 5) + [b'\xf1\x875Q0907572G \xf1\x890571', b'\xf1\x877H9907572AA\xf1\x890396']: + live_fws = {(0x757, None): [radar_fw]} + matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fws, vin, FW_VERSIONS) + + expected_matches = set() + for candidate in CAR: + candidate_model_years = getattr(candidate.config, "model_years", set()) + candidate_has_radar = (Ecu.fwdRadar, 0x757, None) in FW_VERSIONS.get(candidate, {}) + model_year_match = not candidate_model_years or model_year in candidate_model_years + if (wmi in candidate.config.wmis and chassis_code in candidate.config.chassis_codes and model_year_match and + radar_fw in all_radar_fw and candidate_has_radar): + expected_matches.add(candidate) + assert expected_matches == matches, "Bad match" + + @pytest.mark.parametrize("candidate, expected", ( + (CAR.VOLKSWAGEN_PASSAT_B7, True), + (CAR.SEAT_ALHAMBRA_MK1, True), + (CAR.VOLKSWAGEN_GOLF_MK7, False), + )) + def test_pq_acc_fts_epb_flags(self, candidate, expected): + params = CarInterface.get_params(candidate, {bus: {} for bus in range(7)}, [], alpha_long=False, is_release=False, docs=False) + assert bool(params.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB) is expected + assert bool(params.safetyConfigs[-1].safetyParam & VolkswagenSafetyFlags.PQ_ACC_FTS_EPB) is expected + + @pytest.mark.parametrize("candidate, alpha_long, expected", ( + (CAR.VOLKSWAGEN_PASSAT_B7, False, False), + (CAR.VOLKSWAGEN_PASSAT_B7, True, True), + (CAR.VOLKSWAGEN_GOLF_MK7, False, False), + (CAR.VOLKSWAGEN_GOLF_MK7, True, True), + (CAR.AUDI_Q5_MK1, True, False), + (CAR.VOLKSWAGEN_ID4_MK1, True, False), + (CAR.VOLKSWAGEN_GOLF_MK8, True, False), + )) + def test_supported_vw_longitudinal_stays_active_during_gas_override(self, candidate, alpha_long, expected): + fingerprints = {bus: {} for bus in range(7)} + params = CarInterface.get_params(candidate, fingerprints, [], alpha_long=alpha_long, is_release=False, docs=False) + params_iq = CarInterface.get_params_iq(params, candidate, fingerprints, [], alpha_long=alpha_long, is_release_iq=False, docs=False) + assert params_iq.longActiveWithGasOverride is expected + if expected: + assert bool(params.safetyConfigs[-1].safetyParam & VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED) is alpha_long + + +def _mlb_fingerprint(bus, msgs): + fingerprints = {b: {} for b in range(7)} + fingerprints[bus] = {msg: 8 for msg in msgs} + return fingerprints + + +A4_MK4_BUS_1 = (0x040, 0x080, 0x081, 0x086, 0x100, 0x101, 0x103, 0x104, 0x105, 0x106, 0x107, 0x10B, + 0x10C, 0x10E, 0x114, 0x11D, 0x309, 0x30B, 0x30E, 0x312, 0x391, 0x392, 0x39C, 0x3BF, + 0x3C0, 0x440, 0x471, 0x520, 0x585, 0x590, 0x5F0, 0x640, 0x641, 0x643, 0x644, 0x647, + 0x670, 0x6B2, 0x6B4, 0x6B7, 0x6B8, 0x6C0, 0x6C1) + +MLB_ECAN_GATEWAY = (0x086, 0x09F, 0x102, 0x103, 0x105, 0x106, 0x10B, 0x10C, 0x30B) +MLB_ECAN_CAMERA = (0x109, 0x10D, 0x117, 0x30C, 0x30F) + + +def test_mlb_no_ecan_car_moves_to_the_powertrain_bus(): + fingerprints = _mlb_fingerprint(1, A4_MK4_BUS_1) + params = CarInterface.get_params(CAR.AUDI_A4_MK4, fingerprints, [], alpha_long=True, is_release=False, docs=False) + + assert params.flags & VolkswagenFlagsIQ.IQ_MLB_NO_ECAN + assert params.safetyConfigs[-1].safetyParam & VolkswagenSafetyFlags.MLB_NO_ECAN + assert params.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR + assert params.flags & VolkswagenFlagsIQ.IQ_MLB_NO_HCA_EPS + assert params.transmissionType == CarParams.TransmissionType.manual + assert not params.alphaLongitudinalAvailable + assert not params.openpilotLongitudinalControl + assert params.dashcamOnly + + +def test_mlb_without_an_extended_can_is_not_controllable(): + for msgs in (A4_MK4_BUS_1, A4_MK4_BUS_1 + (0x9F,)): + params = CarInterface.get_params(CAR.AUDI_A4_MK4, _mlb_fingerprint(1, msgs), [], + alpha_long=False, is_release=False, docs=False) + assert params.dashcamOnly + + +def test_mlb_gateway_car_keeps_the_extended_can(): + fingerprints = _mlb_fingerprint(0, MLB_ECAN_GATEWAY) + fingerprints[2] = {msg: 8 for msg in MLB_ECAN_CAMERA} + params = CarInterface.get_params(CAR.AUDI_Q5_MK1, fingerprints, [], alpha_long=False, is_release=False, docs=False) + + assert not params.flags & VolkswagenFlagsIQ.IQ_MLB_NO_ECAN + assert not params.flags & (VolkswagenFlagsIQ.IQ_CC_ONLY | VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR) + assert not params.flags & VolkswagenFlagsIQ.IQ_MLB_NO_HCA_EPS + assert params.transmissionType == CarParams.TransmissionType.automatic + assert params.alphaLongitudinalAvailable + assert not params.dashcamOnly + + +def test_mlb_flags_are_not_inferred_without_a_fingerprint(): + fingerprints = {bus: {} for bus in range(7)} + for platform in (CAR.AUDI_Q5_MK1, CAR.PORSCHE_MACAN_MK1, CAR.AUDI_A4_MK4): + params = CarInterface.get_params(platform, fingerprints, [], alpha_long=False, is_release=False, docs=True) + assert not params.flags & VolkswagenFlagsIQ.IQ_MLB_NO_ECAN + assert not params.flags & (VolkswagenFlagsIQ.IQ_CC_ONLY | VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR) + assert not params.flags & VolkswagenFlagsIQ.IQ_MLB_NO_HCA_EPS + assert params.transmissionType == CarParams.TransmissionType.automatic + + +def _build_mlb_car(platform, fingerprints): + CP = CarInterface.get_params(platform, fingerprints, [], alpha_long=False, is_release=False, docs=False) + CP_IQ = CarInterface.get_params_iq(CP, platform, fingerprints, [], alpha_long=False, is_release_iq=False, docs=False) + return CarInterface(CP, CP_IQ) + + +def _a4_mk4_car(): + return _build_mlb_car(CAR.AUDI_A4_MK4, _mlb_fingerprint(1, A4_MK4_BUS_1)) + + +def _q5_mk1_car(): + fingerprints = _mlb_fingerprint(0, MLB_ECAN_GATEWAY) + fingerprints[2] = {msg: 8 for msg in MLB_ECAN_CAMERA} + return _build_mlb_car(CAR.AUDI_Q5_MK1, fingerprints) + + +def _a4_mk4_frames(packer, reverse=False, eps_torque=None): + msgs = [ + packer.make_can_msg("ESP_03", 1, {"ESP_%s_Radgeschw" % s: 30.0 for s in ("VL", "VR", "HL", "HR")}), + packer.make_can_msg("Motor_03", 1, {"MO_Fahrpedalrohwert_01": 0, "MO_BLS": 0}), + packer.make_can_msg("ESP_05", 1, {"ESP_Bremsdruck": 0, "ESP_Fahrer_bremst": 0}), + packer.make_can_msg("ESP_01", 1, {"ESP_Tastung_passiv": 0}), + packer.make_can_msg("ESP_02", 1, {"ESP_Stillstandsflag": 0}), + packer.make_can_msg("TSK_02", 1, {"TSK_Status": 0}), + packer.make_can_msg("LS_01", 1, {"LS_Hauptschalter": 1, "LS_Codierung": 2}), + packer.make_can_msg("LWI_01", 1, {"LWI_Lenkradwinkel": 12.0, "LWI_Lenkradw_Geschw": 4.0}), + packer.make_can_msg("Kombi_01", 1, {"KBI_angez_Geschw": 30.0, "KBI_Handbremse": 0}), + packer.make_can_msg("Kombi_02", 1, {"KBI_Inhalt_Tank": 40, "KBI_Kilometerstand": 100000}), + packer.make_can_msg("Airbag_02", 1, {"AB_Gurtschloss_FA": 3}), + packer.make_can_msg("Gateway_05", 1, {"BCM1_Rueckfahrlicht_Schalter": int(reverse)}), + packer.make_can_msg("LH_EPS_01", 1, {}), + ] + if eps_torque is not None: + msgs.append(packer.make_can_msg("LH_EPS_03", 1, {"EPS_Lenkmoment": abs(eps_torque), + "EPS_VZ_Lenkmoment": eps_torque < 0, + "EPS_HCA_Status": 3})) + return msgs + + +def _run(car, build, frames=25): + nanos = 0 + for _ in range(frames): + nanos += int(DT_CTRL * 1e9) + ret, _ = car.update([(nanos, build())]) + return ret + + +def test_mlb_no_ecan_parsers_read_the_powertrain_bus(): + a4 = _a4_mk4_car() + assert a4.CS.get_can_parsers(a4.CP, a4.CP_IQ)[Bus.pt].bus == 1 + + q5 = _q5_mk1_car() + assert q5.CS.get_can_parsers(q5.CP, q5.CP_IQ)[Bus.pt].bus == 0 + + +def test_mlb_no_ecan_transmits_on_the_powertrain_bus(): + a4 = _a4_mk4_car() + packer = CANPacker("vw_mlb") + + CC = structs.CarControl() + CC.enabled = True + CC.latActive = True + CC.cruiseControl.cancel = True + CC = CC.as_reader() + CC_IQ = structs.IQCarControl() + + sent = [] + nanos = 0 + for _ in range(20): + nanos += int(DT_CTRL * 1e9) + a4.update([(nanos, _a4_mk4_frames(packer, eps_torque=0))]) + _, can_sends = a4.apply(CC, CC_IQ, nanos) + sent.extend(can_sends) + + assert {addr for addr, _, _ in sent} == {0x126, 0x397, 0x10B} + assert {bus for _, _, bus in sent} == {1} + + +def test_mlb_no_hca_eps_reports_a_steer_fault_without_a_can_fault(): + a4 = _a4_mk4_car() + assert a4.CP.flags & VolkswagenFlagsIQ.IQ_MLB_NO_HCA_EPS + + packer = CANPacker("vw_mlb") + ret = _run(a4, lambda: _a4_mk4_frames(packer)) + + assert ret.steerFaultPermanent + assert not ret.steerFaultTemporary + assert ret.steeringTorque == 0.0 + assert not ret.steeringPressed + assert ret.steeringAngleDeg == pytest.approx(12.0, abs=0.2) + + pt = a4.can_parsers[Bus.pt] + assert pt.message_states[MLB_MSG_LH_EPS_03].ignore_alive + assert all(parser.can_valid for parser in a4.can_parsers.values()) + + +def test_mlb_no_hca_eps_survives_the_parser_aliveness_timeout(): + a4 = _a4_mk4_car() + packer = CANPacker("vw_mlb") + pt = a4.can_parsers[Bus.pt] + + nanos = 0 + for _ in range(int(15.0 / DT_CTRL)): + nanos += int(DT_CTRL * 1e9) + ret, _ = a4.update([(nanos, _a4_mk4_frames(packer))]) + pt.vl["LH_EPS_03"]["EPS_HCA_Status"] + + assert ret.steerFaultPermanent + assert all(parser.can_valid for parser in a4.can_parsers.values()) + assert not any(parser.bus_timeout for parser in a4.can_parsers.values()) + + +def test_mlb_lane_assist_eps_restores_the_normal_torque_path(): + fingerprints = _mlb_fingerprint(1, A4_MK4_BUS_1 + (0x9F,)) + a4 = _build_mlb_car(CAR.AUDI_A4_MK4, fingerprints) + assert not a4.CP.flags & VolkswagenFlagsIQ.IQ_MLB_NO_HCA_EPS + + packer = CANPacker("vw_mlb") + ret = _run(a4, lambda: _a4_mk4_frames(packer, eps_torque=-140)) + + assert ret.steeringTorque == pytest.approx(-140, abs=1) + assert ret.steeringPressed + assert not ret.steerFaultPermanent + assert not a4.can_parsers[Bus.pt].message_states[MLB_MSG_LH_EPS_03].ignore_alive + + +def test_mlb_cc_only_never_reads_the_acc_coordinator(): + a4 = _a4_mk4_car() + assert a4.CP.flags & VolkswagenFlagsIQ.IQ_CC_ONLY_NO_RADAR + + packer = CANPacker("vw_mlb") + ret = _run(a4, lambda: _a4_mk4_frames(packer)) + + assert ret.cruiseState.available + assert not ret.cruiseState.enabled + assert ret.cruiseState.speed == 0.0 + + parsers = a4.can_parsers + for msg in MLB_ACC_COORDINATOR_MSGS + (MLB_MSG_ACC_10,): + for parser in parsers.values(): + assert msg not in parser.addresses + + +def test_mlb_manual_gear_follows_the_reverse_light_switch(): + a4 = _a4_mk4_car() + assert a4.CP.transmissionType == CarParams.TransmissionType.manual + + packer = CANPacker("vw_mlb") + assert _run(a4, lambda: _a4_mk4_frames(packer, reverse=False)).gearShifter == structs.CarState.GearShifter.drive + assert _run(a4, lambda: _a4_mk4_frames(packer, reverse=True)).gearShifter == structs.CarState.GearShifter.reverse + assert _run(a4, lambda: _a4_mk4_frames(packer, reverse=False)).gearShifter == structs.CarState.GearShifter.drive + + +def _q5_params(bus0, bus1=(), car_fw=()): + fingerprints = _mlb_fingerprint(0, bus0) + fingerprints[1] = {msg: 8 for msg in bus1} + fingerprints[2] = {msg: 8 for msg in MLB_ECAN_CAMERA} + return CarInterface.get_params(CAR.AUDI_Q5_MK1, fingerprints, list(car_fw), alpha_long=False, is_release=False, docs=False) + + +MLB_ECAN_GATEWAY_NO_GEARBOX = tuple(msg for msg in MLB_ECAN_GATEWAY if msg not in MLB_GEARBOX_MSGS) + + +def test_mlb_gearbox_on_the_powertrain_bus_keeps_automatic(): + params = _q5_params(MLB_ECAN_GATEWAY_NO_GEARBOX, bus1=(MLB_MSG_GETRIEBE_01, MLB_MSG_GATEWAY_05)) + assert params.transmissionType == CarParams.TransmissionType.automatic + + +def test_mlb_transmission_ecu_firmware_keeps_automatic(): + transmission = CarParams.CarFw.new_message(ecu=Ecu.transmission, address=0x7e1) + params = _q5_params(MLB_ECAN_GATEWAY_NO_GEARBOX, bus1=(MLB_MSG_GATEWAY_05,), car_fw=(transmission,)) + assert params.transmissionType == CarParams.TransmissionType.automatic + + +def test_mlb_reverse_switch_on_the_extended_can_alone_keeps_automatic(): + params = _q5_params(MLB_ECAN_GATEWAY_NO_GEARBOX + (MLB_MSG_GATEWAY_05,)) + assert params.transmissionType == CarParams.TransmissionType.automatic + + +def test_mlb_manual_needs_no_gearbox_anywhere_and_a_reverse_switch_on_the_powertrain_bus(): + params = _q5_params(MLB_ECAN_GATEWAY_NO_GEARBOX, bus1=(MLB_MSG_GATEWAY_05,)) + assert params.transmissionType == CarParams.TransmissionType.manual + + +def test_mlb_manual_gateway_car_reads_reverse_from_the_powertrain_bus(): + fingerprints = _mlb_fingerprint(0, MLB_ECAN_GATEWAY_NO_GEARBOX) + fingerprints[1] = {MLB_MSG_GATEWAY_05: 8} + fingerprints[2] = {msg: 8 for msg in MLB_ECAN_CAMERA} + q5 = _build_mlb_car(CAR.AUDI_Q5_MK1, fingerprints) + assert q5.CP.transmissionType == CarParams.TransmissionType.manual + + packer = CANPacker("vw_mlb") + frames = lambda reverse: [packer.make_can_msg("Gateway_05", 1, {"BCM1_Rueckfahrlicht_Schalter": int(reverse)})] + assert _run(q5, lambda: frames(True)).gearShifter == structs.CarState.GearShifter.reverse + assert _run(q5, lambda: frames(False)).gearShifter == structs.CarState.GearShifter.drive + assert MLB_MSG_GATEWAY_05 not in q5.can_parsers[Bus.pt].addresses + + +def test_mlb_automatic_never_subscribes_gateway_05(): + q5 = _q5_mk1_car() + q5.update([(int(DT_CTRL * 1e9), [])]) + assert MLB_MSG_GATEWAY_05 not in q5.can_parsers[Bus.pt].addresses + assert MLB_MSG_GATEWAY_05 not in q5.can_parsers[Bus.aux].addresses + + +@pytest.mark.parametrize("button_type", ( + structs.CarState.ButtonEvent.Type.setCruise, + structs.CarState.ButtonEvent.Type.resumeCruise, +)) +def test_button_enable_is_blocked_while_cruise_fault_lateral_mode_is_still_faulted(button_type): + state = object.__new__(CarState) + state.CP = SimpleNamespace(pcmCruise=False) + state.cruise_fault_lateral_active = True + state.cruise_faulted = True + + button_events = [structs.CarState.ButtonEvent(pressed=False, type=button_type)] + + assert not state.update_button_enable(button_events) + + +def test_button_enable_recovers_once_cruise_fault_clears(): + state = object.__new__(CarState) + state.CP = SimpleNamespace(pcmCruise=False) + state.cruise_fault_lateral_active = True + state.cruise_faulted = False + + button_events = [structs.CarState.ButtonEvent( + pressed=False, + type=structs.CarState.ButtonEvent.Type.setCruise, + )] + + assert state.update_button_enable(button_events) + + +def test_pq_hca_ready_does_not_complete_eps_initialization(): + state = object.__new__(CarState) + state.eps_init_complete = False + + state.frame = 0 + assert state.update_hca_state("READY", ready_confirms_init=False) == (True, False) + + state.frame = 317 + assert state.update_hca_state("FAULT", ready_confirms_init=False) == (True, False) + + state.frame = 1001 + assert state.update_hca_state("FAULT", ready_confirms_init=False) == (False, True) + + +@pytest.mark.parametrize("platform", (CAR.AUDI_Q4_MK1, CAR.VOLKSWAGEN_ID4_MK2)) +def test_meb_does_not_infer_mqb_cluster_from_address(platform): + fingerprints = {bus: {} for bus in range(7)} + fingerprints[0][0x30B] = 8 + params = CarInterface.get_params(platform, fingerprints, [], alpha_long=False, is_release=False, docs=False) + assert not params.flags & VolkswagenFlags.KOMBI_PRESENT diff --git a/artifacts/package_runtime/iqdbc/car/volkswagen/values.py b/artifacts/package_runtime/iqdbc/car/volkswagen/values.py new file mode 100644 index 000000000..a226d03dc --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/volkswagen/values.py @@ -0,0 +1,985 @@ +from collections import defaultdict, namedtuple +from dataclasses import dataclass, field +from enum import Enum, IntFlag, StrEnum + +from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, CanBusBase, CarSpecs, DbcDict, DT_CTRL, PlatformConfig, Platforms, structs, uds +from iqdbc.car.lateral import CurvatureSteeringLimits +from iqdbc.can import CANDefine +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.docs_definitions import CarFootnote, CarHarness, CarDocs, CarParts, Column +from iqdbc.car.lateral import AngleSteeringLimits, ISO_LATERAL_ACCEL, ISO_LATERAL_JERK +from iqdbc.car.fw_query_definitions import EcuAddrSubAddr, FwQueryConfig, Request, p16 +from iqdbc.car.vin import Vin + +Ecu = structs.CarParams.Ecu +NetworkLocation = structs.CarParams.NetworkLocation +TransmissionType = structs.CarParams.TransmissionType +DashcamOnlyReason = structs.CarParams.DashcamOnlyReason +GearShifter = structs.CarState.GearShifter +Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) + + +class CanBus(CanBusBase): + def __init__(self, CP=None, fingerprint=None) -> None: + super().__init__(CP, fingerprint) + self.offset = 0 + + @property + def pt(self) -> int: + # ADAS / Extended CAN, gateway side of the relay + return 0 + + @property + def aux(self) -> int: + # NetworkLocation.fwdCamera: radar-camera object fusion CAN + # NetworkLocation.gateway: powertrain CAN + return 1 + + @property + def powertrain(self) -> int: + return 1 + + @property + def main(self) -> int: + return 1 + + @property + def cam(self) -> int: + # ADAS / Extended CAN, camera side of the relay + return 2 + + @property + def ext(self) -> int: + # ADAS / Extended CAN, side of the relay with the ACC radar + return 2 + +# Extra Tolerances For Road Variance +AVERAGE_ROAD_ROLL = 0.06 +PQ_STOPPING_SPEED = 1.5 * CV.KPH_TO_MS +PASSAT_B7_STOPPING_SPEED = 0.55 * CV.KPH_TO_MS +PASSAT_B7_STOP_ACCEL = -0.55 + + +class CarControllerParams: + ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits( + # Max Steering Angle Allowed + 500, # deg + # Volkswagen uses a vehicle model + ([], []), + ([], []), + + # Vehicle Model Angle Limits + # Add extra tolerance for average banked road since safety doesn't have the roll calculation + MAX_LATERAL_ACCEL=ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^2 + MAX_LATERAL_JERK=ISO_LATERAL_JERK + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^3 + + # Limit Angle Rate to both prevent a openpilot fault and for low speed comfort (~12 mph rate down to 0 mph) + MAX_ANGLE_RATE=5, # deg/20ms frame + ) + + STEER_STEP = 2 # HCA_01/HCA_1 message frequency 50Hz + ACC_CONTROL_STEP = 2 # ACC_06/ACC_07/ACC_System frequency 50Hz + AEB_CONTROL_STEP = 2 # ACC_10 frequency 50Hz + AEB_HUD_STEP = 20 # ACC_15 frequency 5Hz + VW_LOW_SPEED_STATE_SPEED = 0.5 # m/s; below this, always force starting or stopping in MQB legacy long + SNG_HANDOFF_SPEED = 5.0 * CV.KPH_TO_MS + SNG_HOLD_DECEL_MAX = -0.1 + + # Documented lateral limits: 3.00 Nm max, rate of change 5.00 Nm/sec. + # MQB vs PQ maximums are shared, but rate-of-change limited differently + # based on safety requirements driven by lateral accel testing. + + STEER_MAX = 300 # Max heading control assist torque 3.00 Nm + STEER_DRIVER_MULTIPLIER = 3 # weight driver torque heavily + STEER_DRIVER_FACTOR = 1 # from dbc + + STEER_TIME_MAX = 360 # Max time that EPS allows uninterrupted HCA steering control + STEER_TIME_BM = STEER_TIME_MAX - 120 # Attempts to mitigate the EPS max steer timer begin + STEER_TIME_ALERT = STEER_TIME_MAX - 10 # If mitigation fails, time to soft disengage before EPS timer expires + STEER_LOW_TORQUE = int(STEER_MAX * 0.20) # Steer timer mitigation performed when torque output under 20% + STEER_TIME_LOW_TORQUE = 0.5 # Wait for this duration of STEER_LOW_TORQUE to begin mitigation + STEER_TIME_STUCK_TORQUE = 1.9 # EPS limits same torque to 6 seconds, reset timer 3x within that period + STEER_TIME_RESET = 1.1 # Duration of HCA disable needed for effective EPS timer reset' + IQ_PQ_UNAVAILABLE_HUD_FRAMES = 25 + GRA_CANCEL_TAP_ON = 10 # Stock GRA frames to hold Abbrechen, roughly a human button tap + GRA_CANCEL_TAP_OFF = 20 # Stock GRA frames to release between taps + GRA_CANCEL_MAX_TAPS = 3 # PQ engine faults its GRA input if Abbrechen is held indefinitely + + DEFAULT_MIN_STEER_SPEED = 0.4 # m/s, newer EPS racks fault below this speed, don't show a low speed alert + + ACCEL_MAX = 2.0 # 2.0 m/s max acceleration + ACCEL_MIN = -3.5 # 3.5 m/s max deceleration + VW_LOW_SPEED_STATE_SPEED = 0.5 # Always send either starting or stopping below this speed + + def __init__(self, CP): + can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) + self.STEER_TIME_RESET = self.__class__.STEER_TIME_RESET + + if CP.flags & VolkswagenFlags.PQ: + self.LDW_STEP = 5 # LDW_1 message frequency 20Hz + self.ACC_HUD_STEP = 4 # ACC_GRA_Anzeige frequency 25Hz + self.STEER_DRIVER_ALLOWANCE = 80 + self.STEER_DELTA_UP = 6 + self.STEER_DELTA_DOWN = 10 + + if CP.transmissionType == TransmissionType.automatic: + self.shifter_values = can_define.dv["Getriebe_1"]["GE1_Wahl_Pos"] + self.hca_status_values = can_define.dv["Lenkhilfe_2"]["LH2_Sta_HCA"] + + self.BUTTONS = [ + Button(structs.CarState.ButtonEvent.Type.setCruise, "GRA_Neu", "GRA_Neu_Setzen", [1]), + Button(structs.CarState.ButtonEvent.Type.resumeCruise, "GRA_Neu", "GRA_Recall", [1]), + Button(structs.CarState.ButtonEvent.Type.accelCruise, "GRA_Neu", "GRA_Up_kurz", [1]), + Button(structs.CarState.ButtonEvent.Type.decelCruise, "GRA_Neu", "GRA_Down_kurz", [1]), + Button(structs.CarState.ButtonEvent.Type.cancel, "GRA_Neu", "GRA_Abbrechen", [1]), + Button(structs.CarState.ButtonEvent.Type.gapAdjustCruise, "GRA_Neu", "GRA_Zeitluecke", [1, 2, 3]), + ] + + self.LDW_MESSAGES = { + "none": 0, # Nothing to display + "laneAssistUnavail": 1, # "Lane Assist currently not available." + "laneAssistUnavailSysError": 2, # "Lane Assist system error" + "laneAssistUnavailNoSensorView": 3, # "Lane Assist not available. No sensor view." + "laneAssistTakeOver": 4, # "Lane Assist: Please Take Over Steering" + "laneAssistDeactivTrailer": 5, # "Lane Assist: no function with trailer" + } + + elif CP.flags & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO): + self.LDW_STEP = 10 + self.ACC_HUD_STEP = 6 + self.STEER_DRIVER_ALLOWANCE = 80 + self.STEER_DRIVER_MAX = 300 + self.STEERING_POWER_MAX = 90 + self.STEERING_POWER_MIN = 4 + self.STEERING_POWER_STEP = 2 + self.CURVATURE_HANDOFF_RATE = 0.20 + + self.CURVATURE_PID: structs.CarParams.LateralPIDTuning = structs.CarParams.LateralPIDTuning( + kpBP=[10., 40.], + kiBP=[10., 40.], + kf=1., + kpV=[0., 1.45], + kiV=[0., 0.12], + ) + + self.CURVATURE_LIMITS: CurvatureSteeringLimits = CurvatureSteeringLimits( + 0.195, + ) + + if CP.flags & VolkswagenFlags.ALT_GEAR: + self.shifter_values = can_define.dv["Gateway_73"]["GE_Fahrstufe"] + else: + self.shifter_values = can_define.dv["Getriebe_11"]["GE_Fahrstufe"] + + self.hca_status_values = can_define.dv["QFK_01"]["LatCon_HCA_Status"] + + BASE_BUTTONS = [ + Button(structs.CarState.ButtonEvent.Type.setCruise, "GRA_ACC_01", "GRA_Tip_Setzen", [1]), + Button(structs.CarState.ButtonEvent.Type.resumeCruise, "GRA_ACC_01", "GRA_Tip_Wiederaufnahme", [1]), + Button(structs.CarState.ButtonEvent.Type.accelCruise, "GRA_ACC_01", "GRA_Tip_Hoch", [1]), + Button(structs.CarState.ButtonEvent.Type.decelCruise, "GRA_ACC_01", "GRA_Tip_Runter", [1]), + Button(structs.CarState.ButtonEvent.Type.gapAdjustCruise, "GRA_ACC_01", "GRA_Verstellung_Zeitluecke", [1, 2, 3]), + ] + self.BUTTONS = BASE_BUTTONS + [ + Button(structs.CarState.ButtonEvent.Type.cancel, "GRA_ACC_01", "GRA_Hauptschalter", [1]), + ] + self.BUTTONS_ALT = BASE_BUTTONS + [ + Button(structs.CarState.ButtonEvent.Type.cancel, "GRA_ACC_01", "GRA_Abbrechen", [1]), + ] + + self.LDW_MESSAGES = { + "none": 0, + "laneAssistTakeOverUrgent": 4, + "laneAssistTakeOver": 8, + } + self.LDW_SOUNDS = { + "None": 0, + "Chime": 1, + "Beep": 2, + } + + else: + self.LDW_STEP = 10 # LDW_02 message frequency 10Hz + self.ACC_HUD_STEP = 6 # ACC_02 message frequency 16Hz + + self.hca_status_values = can_define.dv["LH_EPS_03"]["EPS_HCA_Status"] + + if CP.flags & VolkswagenFlags.MLB: + self.STEER_DRIVER_ALLOWANCE = 80 # Driver intervention threshold 0.8 Nm + self.STEER_DELTA_UP = 9 # Max HCA reached in 0.66s (STEER_MAX / (50Hz * 0.66)) + self.STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) + self.ACC_HUD_TEXT_STEP = int(2.0 / DT_CTRL) # ACC_02 primary display text dwell time + + if CP.carFingerprint == CAR.PORSCHE_MACAN_MK1: + self.shifter_values = can_define.dv["Getriebe_03"]["GE_Waehlhebel"] + else: + self.shifter_values = None + + self.BUTTONS = [ + Button(structs.CarState.ButtonEvent.Type.setCruise, "LS_01", "LS_Tip_Setzen", [1]), + Button(structs.CarState.ButtonEvent.Type.resumeCruise, "LS_01", "LS_Tip_Wiederaufnahme", [1]), + Button(structs.CarState.ButtonEvent.Type.accelCruise, "LS_01", "LS_Tip_Hoch", [1]), + Button(structs.CarState.ButtonEvent.Type.decelCruise, "LS_01", "LS_Tip_Runter", [1]), + Button(structs.CarState.ButtonEvent.Type.cancel, "LS_01", "LS_Abbrechen", [1]), + Button(structs.CarState.ButtonEvent.Type.gapAdjustCruise, "LS_01", "LS_Verstellung_Zeitluecke", [1, 2, 3]), + ] + + # ACC_02.ACC_Texte_Primaeranz, primary ACC display text at the bottom of the cluster + self.ACC_HUD_TEXTS = { + "none": 0, + "setSpeed": 21, + } + self.ACC_HUD_TEXT_DISTANCE = {1: 2, 2: 3, 3: 4, 4: 5} # follow distance bars to display text + + else: + self.STEER_DRIVER_ALLOWANCE = 80 + self.STEER_DELTA_UP = 4 # Max HCA reached in 1.50s (STEER_MAX / (50Hz * 1.50)) + self.STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) + + if CP.transmissionType == TransmissionType.automatic: + self.shifter_values = can_define.dv["Gateway_73"]["GE_Fahrstufe"] + elif CP.transmissionType == TransmissionType.direct: + self.shifter_values = can_define.dv["Motor_EV_01"]["MO_Waehlpos"] + + self.BUTTONS = [ + Button(structs.CarState.ButtonEvent.Type.setCruise, "GRA_ACC_01", "GRA_Tip_Setzen", [1]), + Button(structs.CarState.ButtonEvent.Type.resumeCruise, "GRA_ACC_01", "GRA_Tip_Wiederaufnahme", [1]), + Button(structs.CarState.ButtonEvent.Type.accelCruise, "GRA_ACC_01", "GRA_Tip_Hoch", [1]), + Button(structs.CarState.ButtonEvent.Type.decelCruise, "GRA_ACC_01", "GRA_Tip_Runter", [1]), + Button(structs.CarState.ButtonEvent.Type.cancel, "GRA_ACC_01", "GRA_Abbrechen", [1]), + Button(structs.CarState.ButtonEvent.Type.gapAdjustCruise, "GRA_ACC_01", "GRA_Verstellung_Zeitluecke", [1, 2, 3]), + ] + + self.LDW_MESSAGES = { + "none": 0, # Nothing to display + "laneAssistUnavailChime": 1, # "Lane Assist currently not available." with chime + "laneAssistUnavailNoSensorChime": 3, # "Lane Assist not available. No sensor view." with chime + "laneAssistTakeOverUrgent": 4, # "Lane Assist: Please Take Over Steering" with urgent beep + "emergencyAssistUrgent": 6, # "Emergency Assist: Please Take Over Steering" with urgent beep + "laneAssistTakeOverChime": 7, # "Lane Assist: Please Take Over Steering" with chime + "laneAssistTakeOver": 8, # "Lane Assist: Please Take Over Steering" silent + "emergencyAssistChangingLanes": 9, # "Emergency Assist: Changing lanes..." with urgent beep + "laneAssistDeactivated": 10, # "Lane Assist deactivated." silent with persistent icon afterward + } + + +HOLD_MAX_FRAMES = 60 +HOLD_TORQUE_DEADBAND_NM = 20 +HOLD_ACCEL_KI = 0.00002 + + +class WMI(StrEnum): + VOLKSWAGEN_USA_SUV = "1V2" + VOLKSWAGEN_USA_CAR = "1VW" + VOLKSWAGEN_MEXICO_SUV = "3VV" + VOLKSWAGEN_MEXICO_CAR = "3VW" + VOLKSWAGEN_ARGENTINA = "8AW" + VOLKSWAGEN_BRASIL = "9BW" + SAIC_VOLKSWAGEN = "LSV" + SKODA = "TMB" + SEAT = "VSS" + AUDI_EUROPE_MPV = "WA1" + AUDI_GERMANY_CAR = "WAU" + MAN = "WMA" + PORSCHE_SUV = "WP1" + AUDI_SPORT = "WUA" + VOLKSWAGEN_COMMERCIAL = "WV1" + VOLKSWAGEN_COMMERCIAL_BUS_VAN = "WV2" + VOLKSWAGEN_EUROPE_SUV = "WVG" + VOLKSWAGEN_EUROPE_CAR = "WVW" + VOLKSWAGEN_GROUP_RUS = "XW8" + + +class VolkswagenSafetyFlags(IntFlag): + LONG_CONTROL = 1 + ALT_CRC_VARIANT_1 = 2 + NO_GAS_OFFSET = 4 + ALLOW_LONG_ACCEL_WITH_GAS_PRESSED = 8 + DISABLE_RADAR = 16 + PQ_ALC_MODULE = 32 + PQ_LOWLINE = 64 + PQ_NO_CAM_BUS = 128 + PQ_ACC_FTS_EPB = 256 + PQ_SNG_ECD = 512 + MLB_NO_ECAN = 1024 + + +class VolkswagenFlags(IntFlag): + # Detected flags + STOCK_HCA_PRESENT = 1 + KOMBI_PRESENT = 4 + + # Static flags + PQ = 2 + MLB = 8 + MEB = 256 + MEB_GEN2 = 512 + MQB_EVO = 1024 + + # Detected flags (MEB/MQBevo) + STOCK_KLR_PRESENT = 2048 + STOCK_PSD_PRESENT = 4096 + STOCK_PSD_06_PRESENT = 8192 + STOCK_DIAGNOSE_01_PRESENT = 16384 + ALT_GEAR = 32768 + DISABLE_RADAR = 65536 + + +class VolkswagenFlagsIQ(IntFlag): + IQ_CC_ONLY = 1 << 5 # CC only mode with radar (has AEB) + IQ_CC_ONLY_NO_RADAR = 1 << 6 # CC only mode without radar + IQ_LVBS_ALC_MODULE = 1 << 7 # IQ.Lvbs VW ALC hardware module present / intended active path + IQ_PQ_LOWLINE = 1 << 17 # Non-ECAN lateral-only PQ: bus 0 dead, TX on bus 1 (ptCAN) + IQ_PQ_ACC_FTS_EPB = 1 << 18 # B7 TRW450: ACC FtS + EPB hold, Motor_1 resume spoof on bus 1 + IQ_PQ_SNG_ECD = 1 << 19 + IQ_PQ_TIMEBOMB = 1 << 20 + IQ_MLB_NO_ECAN = 1 << 21 + IQ_MLB_NO_HCA_EPS = 1 << 22 + + +RADAR_DISABLE_STATE = {"error": False} + +MLB_MSG_LH_EPS_03 = 0x9F +MLB_MSG_GETRIEBE_01 = 0x82 +MLB_MSG_GETRIEBE_02 = 0x83 +MLB_MSG_GETRIEBE_03 = 0x102 +MLB_MSG_GETRIEBE_04 = 0x441 +MLB_MSG_ACC_01 = 0x109 +MLB_MSG_ACC_05 = 0x10D +MLB_MSG_ACC_02 = 0x30C +MLB_MSG_ACC_10 = 0x117 +MLB_MSG_GATEWAY_05 = 0x39C + +MLB_ACC_COORDINATOR_MSGS = (MLB_MSG_ACC_01, MLB_MSG_ACC_05, MLB_MSG_ACC_02) +MLB_GEARBOX_MSGS = (MLB_MSG_GETRIEBE_01, MLB_MSG_GETRIEBE_02, MLB_MSG_GETRIEBE_03, MLB_MSG_GETRIEBE_04) + + +@dataclass +class VolkswagenMLBPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_mlb'}) + chassis_codes: set[str] = field(default_factory=set) + wmis: set[WMI] = field(default_factory=set) + + def init(self): + self.flags |= VolkswagenFlags.MLB + + +@dataclass +class VolkswagenMQBPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_mqb'}) + # Volkswagen uses the VIN WMI and chassis code to match in the absence of the comma power + # on camera-integrated cars, as we lose too many ECUs to reliably identify the vehicle + chassis_codes: set[str] = field(default_factory=set) + wmis: set[WMI] = field(default_factory=set) + model_years: set[str] = field(default_factory=set) + + +@dataclass +class VolkswagenPQPlatformConfig(VolkswagenMQBPlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_pq'}) + + def init(self): + self.flags |= VolkswagenFlags.PQ + + +@dataclass +class VolkswagenMEBPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_meb', Bus.radar: 'vw_meb'}) + chassis_codes: set[str] = field(default_factory=set) + wmis: set[WMI] = field(default_factory=set) + model_years: set[str] = field(default_factory=set) + + def init(self): + self.flags |= VolkswagenFlags.MEB + if self.flags & VolkswagenFlags.MEB_GEN2: + self.dbc_dict = {Bus.pt: 'vw_meb_2024', Bus.radar: 'vw_meb_2024'} + + +@dataclass +class VolkswagenMQBevoPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'vw_mqbevo', Bus.radar: 'vw_mqbevo'}) + chassis_codes: set[str] = field(default_factory=set) + wmis: set[WMI] = field(default_factory=set) + + def init(self): + self.flags |= VolkswagenFlags.MQB_EVO + + +@dataclass(frozen=True, kw_only=True) +class VolkswagenCarSpecs(CarSpecs): + centerToFrontRatio: float = 0.45 + steerRatio: float = 18.4 + minSteerSpeed: float = CarControllerParams.DEFAULT_MIN_STEER_SPEED + +# FIXME: nuke this +class Footnote(Enum): + KAMIQ = CarFootnote( + "Not including the China market Kamiq, which is based on the (currently) unsupported PQ34 platform.", + Column.MODEL) + PASSAT = CarFootnote( + "Refers only to the MQB-based European B8 Passat, not the NMS Passat in the USA/China/Mideast markets.", + Column.MODEL) + SKODA_HEATED_WINDSHIELD = CarFootnote( + "Some Å koda vehicles are equipped with heated windshields, which are known " + + "to block GPS signal needed for some comma four functionality.", + Column.MODEL) + VW_EXP_LONG = CarFootnote( + "Only available for vehicles using a gateway (J533) harness. At this time, vehicles using a camera harness " + + "are limited to using stock ACC.", + Column.LONGITUDINAL, docs_only=True) + VW_MQB_A0 = CarFootnote( + "Model-years 2022 and beyond may have a combined CAN gateway and BCM, which is supported by openpilot " + + "in software, but doesn't yet have a harness available from the comma store.", + Column.HARDWARE) + + +@dataclass +class VWCarDocs(CarDocs): + package: str = "Adaptive Cruise Control (ACC) & Lane Assist" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.vw_j533])) + + def init_make(self, CP: structs.CarParams): + self.footnotes.append(Footnote.VW_EXP_LONG) + if "SKODA" in CP.carFingerprint: + self.footnotes.append(Footnote.SKODA_HEATED_WINDSHIELD) + + if abs(CP.minSteerSpeed - CarControllerParams.DEFAULT_MIN_STEER_SPEED) < 1e-3: + self.min_steer_speed = 0 + + +# Check the 7th and 8th characters of the VIN before adding a new CAR. If the +# chassis code is already listed below, don't add a new CAR, just add to the +# FW_VERSIONS for that existing CAR. + +class CAR(Platforms): + config: VolkswagenMQBPlatformConfig | VolkswagenPQPlatformConfig | VolkswagenMLBPlatformConfig | VolkswagenMEBPlatformConfig | VolkswagenMQBevoPlatformConfig + + VOLKSWAGEN_ARTEON_MK1 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen Arteon 2018-23", video="https://youtu.be/FAomFKPFlDA"), + VWCarDocs("Volkswagen Arteon R 2020-23", video="https://youtu.be/FAomFKPFlDA"), + VWCarDocs("Volkswagen Arteon eHybrid 2020-23", video="https://youtu.be/FAomFKPFlDA"), + VWCarDocs("Volkswagen Arteon Shooting Brake 2020-23", video="https://youtu.be/FAomFKPFlDA"), + VWCarDocs("Volkswagen CC 2018-22", video="https://youtu.be/FAomFKPFlDA"), + ], + VolkswagenCarSpecs(mass=1733, wheelbase=2.84), + chassis_codes={"AN", "3H"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, + ) + VOLKSWAGEN_ATLAS_MK1 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen Atlas 2018-23"), + VWCarDocs("Volkswagen Atlas Cross Sport 2020-22"), + VWCarDocs("Volkswagen Teramont 2018-22"), + VWCarDocs("Volkswagen Teramont Cross Sport 2021-22"), + VWCarDocs("Volkswagen Teramont X 2021-22"), + ], + VolkswagenCarSpecs(mass=2011, wheelbase=2.98), + chassis_codes={"CA"}, + wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_SUV}, + ) + VOLKSWAGEN_CADDY_MK3 = VolkswagenPQPlatformConfig( + [ + VWCarDocs("Volkswagen Caddy 2019"), + VWCarDocs("Volkswagen Caddy Maxi 2019"), + ], + VolkswagenCarSpecs(mass=1613, wheelbase=2.6), + chassis_codes={"2K"}, + wmis={WMI.VOLKSWAGEN_COMMERCIAL_BUS_VAN}, + ) + VOLKSWAGEN_CRAFTER_MK2 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen Crafter 2017-24", video="https://youtu.be/4100gLeabmo"), + VWCarDocs("Volkswagen e-Crafter 2018-24", video="https://youtu.be/4100gLeabmo"), + VWCarDocs("Volkswagen Grand California 2019-24", video="https://youtu.be/4100gLeabmo"), + VWCarDocs("MAN TGE 2017-24", video="https://youtu.be/4100gLeabmo"), + VWCarDocs("MAN eTGE 2020-24", video="https://youtu.be/4100gLeabmo"), + ], + VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), + chassis_codes={"SY", "SZ", "UY", "UZ"}, + wmis={WMI.VOLKSWAGEN_COMMERCIAL, WMI.MAN}, + ) + VOLKSWAGEN_GOLF_MK7 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen e-Golf 2014-20"), + VWCarDocs("Volkswagen Golf (Mk7) 2015-20", auto_resume=False), + VWCarDocs("Volkswagen Golf Alltrack 2015-19", auto_resume=False), + VWCarDocs("Volkswagen Golf GTD 2015-20"), + VWCarDocs("Volkswagen Golf GTE 2015-20"), + VWCarDocs("Volkswagen Golf GTI 2015-21", auto_resume=False), + VWCarDocs("Volkswagen Golf R 2015-19"), + VWCarDocs("Volkswagen Golf SportsVan 2015-20"), + ], + VolkswagenCarSpecs(mass=1397, wheelbase=2.62, steerRatio=17.0), + chassis_codes={"5G", "AU", "BA", "BE"}, + wmis={WMI.VOLKSWAGEN_MEXICO_CAR, WMI.VOLKSWAGEN_EUROPE_CAR}, + ) + VOLKSWAGEN_GOLF_MK8 = VolkswagenMQBevoPlatformConfig( + [VWCarDocs("Volkswagen Golf (Mk8) 2020-25")], + VolkswagenCarSpecs(mass=1397, wheelbase=2.62), + chassis_codes={"CD"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, + ) + VOLKSWAGEN_ID3_MK1 = VolkswagenMEBPlatformConfig( + [ + VWCarDocs("Volkswagen ID.3 2020-23"), + VWCarDocs("Volkswagen MEB Gen 1 2020-23"), + ], + VolkswagenCarSpecs(mass=1935, wheelbase=2.77), + chassis_codes={"E1"}, + wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_CAR}, + model_years={"L", "M", "N", "P"}, + ) + VOLKSWAGEN_ID3_MK2 = VolkswagenMEBPlatformConfig( + [ + VWCarDocs("Volkswagen ID.3 2024-25"), + VWCarDocs("Volkswagen MEB Gen 2 2024-25"), + ], + VolkswagenCarSpecs(mass=1935, wheelbase=2.77), + chassis_codes={"E1"}, + wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_CAR}, + model_years={"R", "S"}, + flags=VolkswagenFlags.MEB_GEN2, + ) + VOLKSWAGEN_ID4_MK1 = VolkswagenMEBPlatformConfig( + [ + VWCarDocs("Volkswagen ID.4 2021-23"), + VWCarDocs("Volkswagen ID.5 2022-23"), + ], + VolkswagenCarSpecs(mass=2224, wheelbase=2.77), + chassis_codes={"E2"}, + wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_CAR, WMI.VOLKSWAGEN_EUROPE_SUV}, + ) + VOLKSWAGEN_ID4_MK2 = VolkswagenMEBPlatformConfig( + [VWCarDocs("Volkswagen ID.4 2024-25")], + VolkswagenCarSpecs(mass=2224, wheelbase=2.77), + chassis_codes={"E8"}, + wmis={WMI.VOLKSWAGEN_USA_SUV, WMI.VOLKSWAGEN_EUROPE_CAR, WMI.VOLKSWAGEN_EUROPE_SUV}, + flags=VolkswagenFlags.MEB_GEN2, + ) + VOLKSWAGEN_JETTA_MK6 = VolkswagenPQPlatformConfig( + [VWCarDocs("Volkswagen Jetta 2015-18")], + VolkswagenCarSpecs(mass=1518, wheelbase=2.65), + chassis_codes={"5K", "AJ"}, + wmis={WMI.VOLKSWAGEN_MEXICO_CAR}, + ) + VOLKSWAGEN_JETTA_MK7 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen Jetta 2019-23"), + VWCarDocs("Volkswagen Jetta GLI 2021-23"), + ], + VolkswagenCarSpecs(mass=1328, wheelbase=2.71), + chassis_codes={"BU"}, + wmis={WMI.VOLKSWAGEN_MEXICO_CAR, WMI.VOLKSWAGEN_EUROPE_CAR}, + ) + VOLKSWAGEN_PASSAT_MK8 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), + VWCarDocs("Volkswagen Passat Alltrack 2015-22"), + VWCarDocs("Volkswagen Passat GTE 2015-22"), + ], + VolkswagenCarSpecs(mass=1551, wheelbase=2.79), + chassis_codes={"3C", "3G"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, + model_years={"F", "G", "H", "J", "K", "L", "M", "N"}, # 2015-2022 + ) + VOLKSWAGEN_PASSAT_MK7 = VolkswagenPQPlatformConfig( + [VWCarDocs("Volkswagen Passat 2.0 TDI 2014")], + VolkswagenCarSpecs(mass=1836, wheelbase=2.70, steerRatio=13.0, minSteerSpeed=31 * CV.KPH_TO_MS), + chassis_codes={"3C"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, + model_years={"E"}, # 2014 + ) + VOLKSWAGEN_PASSAT_NMS = VolkswagenPQPlatformConfig( + [VWCarDocs("Volkswagen Passat NMS 2015-17")], + VolkswagenCarSpecs(mass=1503, wheelbase=2.80), + chassis_codes={"A3"}, + wmis={WMI.VOLKSWAGEN_USA_CAR}, + # NMS and NMS+ share chassis code A3; disambiguate by model year + model_years={"F", "G", "H"}, # 2015-2017 + ) + VOLKSWAGEN_PASSAT_NMS_PLUS = VolkswagenPQPlatformConfig( + [VWCarDocs("Volkswagen Passat NMS 2018-22")], + VolkswagenCarSpecs(mass=1503, wheelbase=2.80, minEnableSpeed=20 * CV.KPH_TO_MS), + chassis_codes={"A3"}, + wmis={WMI.VOLKSWAGEN_USA_CAR}, + model_years={"J", "K", "L", "M", "N"}, # 2018-2022 + ) + VOLKSWAGEN_PASSAT_B7 = VolkswagenPQPlatformConfig( + [VWCarDocs("Volkswagen Passat B7 2011-15")], + VolkswagenCarSpecs(mass=1503, wheelbase=2.712, steerRatio=16.4, minSteerSpeed=0), + chassis_codes={"A3"}, + wmis={WMI.VOLKSWAGEN_USA_CAR}, + ) + VOLKSWAGEN_POLO_MK6 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), + VWCarDocs("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), + ], + VolkswagenCarSpecs(mass=1230, wheelbase=2.55), + chassis_codes={"AW"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, + ) + VOLKSWAGEN_SHARAN_MK2 = VolkswagenPQPlatformConfig( + [ + VWCarDocs("Volkswagen Sharan 2018-22"), + ], + VolkswagenCarSpecs(mass=1639, wheelbase=2.92), + chassis_codes={"7N"}, + wmis={WMI.VOLKSWAGEN_EUROPE_CAR}, + ) + SEAT_ALHAMBRA_MK1 = VolkswagenPQPlatformConfig( + [ + VWCarDocs("SEAT Alhambra 2018-20"), + ], + VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50 * CV.KPH_TO_MS), + chassis_codes={"7N"}, + wmis={WMI.SEAT}, + ) + VOLKSWAGEN_TAOS_MK1 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Volkswagen Taos 2022-24")], + VolkswagenCarSpecs(mass=1498, wheelbase=2.69), + chassis_codes={"B2"}, + wmis={WMI.VOLKSWAGEN_MEXICO_SUV, WMI.VOLKSWAGEN_ARGENTINA}, + ) + VOLKSWAGEN_TCROSS_MK1 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0])], + VolkswagenCarSpecs(mass=1150, wheelbase=2.60), + chassis_codes={"C1"}, + wmis={WMI.VOLKSWAGEN_EUROPE_SUV}, + ) + VOLKSWAGEN_TIGUAN_MK2 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen Tiguan 2018-24"), + VWCarDocs("Volkswagen Tiguan eHybrid 2021-23"), + ], + VolkswagenCarSpecs(mass=1715, wheelbase=2.74), + chassis_codes={"5N", "AD", "AX", "BW"}, + wmis={WMI.VOLKSWAGEN_EUROPE_SUV, WMI.VOLKSWAGEN_MEXICO_SUV}, + ) + VOLKSWAGEN_TOURAN_MK2 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Volkswagen Touran 2016-23")], + VolkswagenCarSpecs(mass=1516, wheelbase=2.79), + chassis_codes={"1T"}, + wmis={WMI.VOLKSWAGEN_EUROPE_SUV}, + ) + VOLKSWAGEN_TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Volkswagen Caravelle 2020"), + VWCarDocs("Volkswagen California 2021-23"), + ], + VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0), + chassis_codes={"7H", "7L"}, + wmis={WMI.VOLKSWAGEN_COMMERCIAL_BUS_VAN}, + ) + VOLKSWAGEN_TROC_MK1 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Volkswagen T-Roc 2018-23")], + VolkswagenCarSpecs(mass=1413, wheelbase=2.63), + chassis_codes={"A1"}, + wmis={WMI.VOLKSWAGEN_EUROPE_SUV}, + ) + AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Audi A3 2014-19"), + VWCarDocs("Audi A3 Sportback e-tron 2017-18"), + VWCarDocs("Audi RS3 2018"), + VWCarDocs("Audi S3 2015-17"), + ], + VolkswagenCarSpecs(mass=1335, wheelbase=2.61), + chassis_codes={"8V", "FF"}, + wmis={WMI.AUDI_GERMANY_CAR, WMI.AUDI_SPORT}, + ) + AUDI_A4_MK4 = VolkswagenMLBPlatformConfig( + [VWCarDocs("Audi A4 2013-16", package="Cruise Control")], + VolkswagenCarSpecs(mass=1610, wheelbase=2.81, steerRatio=15.9), + chassis_codes={"8K", "FL"}, + wmis={WMI.AUDI_GERMANY_CAR}, + ) + AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Audi Q2 2018")], + VolkswagenCarSpecs(mass=1205, wheelbase=2.61), + chassis_codes={"GA"}, + wmis={WMI.AUDI_GERMANY_CAR}, + ) + AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Audi Q3 2019-24")], + VolkswagenCarSpecs(mass=1623, wheelbase=2.68), + chassis_codes={"8U", "F3", "FS"}, + wmis={WMI.AUDI_EUROPE_MPV, WMI.AUDI_GERMANY_CAR}, + ) + AUDI_Q4_MK1 = VolkswagenMEBPlatformConfig( + [VWCarDocs("Audi Q4 2021-23")], + VolkswagenCarSpecs(mass=1965, wheelbase=2.764), + chassis_codes={"FZ"}, + wmis={WMI.AUDI_EUROPE_MPV}, + model_years={"M", "N", "P"}, + ) + AUDI_Q4_MK2 = VolkswagenMEBPlatformConfig( + [VWCarDocs("Audi Q4 2024-25")], + VolkswagenCarSpecs(mass=1965, wheelbase=2.764), + chassis_codes={"FZ"}, + wmis={WMI.AUDI_EUROPE_MPV}, + model_years={"R", "S"}, + flags=VolkswagenFlags.MEB_GEN2, + ) + AUDI_Q5_MK1 = VolkswagenMLBPlatformConfig( + [VWCarDocs("Audi Q5 2013-17")], + VolkswagenCarSpecs(mass=1895, wheelbase=2.81), + chassis_codes={"8R"}, + wmis={WMI.AUDI_EUROPE_MPV, WMI.AUDI_GERMANY_CAR}, + ) + PORSCHE_MACAN_MK1 = VolkswagenMLBPlatformConfig( + [VWCarDocs("Porsche Macan 2017-24")], + VolkswagenCarSpecs(mass=1895, wheelbase=2.81, steerRatio=16.2), + chassis_codes={"95", "A5"}, + wmis={WMI.PORSCHE_SUV}, + ) + SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("CUPRA Ateca 2018-23"), + VWCarDocs("SEAT Ateca 2016-23"), + VWCarDocs("SEAT Leon (Mk3) 2014-20"), + ], + VolkswagenCarSpecs(mass=1300, wheelbase=2.64), + chassis_codes={"5F"}, + wmis={WMI.SEAT}, + ) + SEAT_LEON_MK4 = VolkswagenMQBevoPlatformConfig( + [VWCarDocs("SEAT Leon (Mk4) 2020-25")], + VolkswagenCarSpecs(mass=1300, wheelbase=2.685), + chassis_codes={"KL"}, + wmis={WMI.SEAT}, + ) + CUPRA_BORN_MK1 = VolkswagenMEBPlatformConfig( + [VWCarDocs("CUPRA Born 2022-23")], + VolkswagenCarSpecs(mass=1950, wheelbase=2.766, steerRatio=15.9), + chassis_codes={"K1"}, + model_years={"N", "P"}, + wmis={WMI.SEAT}, + ) + SKODA_ENYAQ_MK1 = VolkswagenMEBPlatformConfig( + [VWCarDocs("Å koda Enyaq 2021-23")], + VolkswagenCarSpecs(mass=1965, wheelbase=2.77), + chassis_codes={"NY"}, + model_years={"M", "N", "P"}, + wmis={WMI.SKODA}, + ) + SKODA_ENYAQ_MK2 = VolkswagenMEBPlatformConfig( + [VWCarDocs("Å koda Enyaq 2024-25")], + VolkswagenCarSpecs(mass=1965, wheelbase=2.77), + chassis_codes={"NY"}, + model_years={"R", "S"}, + wmis={WMI.SKODA}, + flags=VolkswagenFlags.MEB_GEN2, + ) + SKODA_FABIA_MK4 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Å koda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0])], + VolkswagenCarSpecs(mass=1266, wheelbase=2.56), + chassis_codes={"PJ"}, + wmis={WMI.SKODA}, + ) + SKODA_KAMIQ_MK1 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Å koda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ]), + VWCarDocs("Å koda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0]), + ], + VolkswagenCarSpecs(mass=1230, wheelbase=2.66), + chassis_codes={"NW"}, + wmis={WMI.SKODA}, + ) + SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Å koda Karoq 2019-23")], + VolkswagenCarSpecs(mass=1278, wheelbase=2.66), + chassis_codes={"NU"}, + wmis={WMI.SKODA}, + ) + SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Å koda Kodiaq 2017-23")], + VolkswagenCarSpecs(mass=1569, wheelbase=2.79), + chassis_codes={"NS"}, + wmis={WMI.SKODA, WMI.VOLKSWAGEN_GROUP_RUS}, + ) + SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( + [ + VWCarDocs("Å koda Octavia 2015-19"), + VWCarDocs("Å koda Octavia RS 2016"), + VWCarDocs("Å koda Octavia Scout 2017-19"), + ], + VolkswagenCarSpecs(mass=1388, wheelbase=2.68), + chassis_codes={"NE"}, + wmis={WMI.SKODA}, + ) + SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( + [VWCarDocs("Å koda Superb 2015-22")], + VolkswagenCarSpecs(mass=1505, wheelbase=2.84), + chassis_codes={"3V", "NP"}, + wmis={WMI.SKODA}, + ) + + +def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: + candidates = set() + + # Compile all FW versions for each ECU + all_ecu_versions: dict[EcuAddrSubAddr, set[str]] = defaultdict(set) + for ecus in offline_fw_versions.values(): + for ecu, versions in ecus.items(): + all_ecu_versions[ecu] |= set(versions) + + # Check the WMI and chassis code to determine the platform + # https://www.clubvw.org.au/vwreference/vwvin + vin_obj = Vin(vin) + vin_wmi = vin_obj.wmi if len(vin_obj.wmi) == 3 else None + chassis_code = vin_obj.vds[3:5] if len(vin_obj.vds) >= 5 else None + model_year_code = vin_obj.vis[0] if len(vin_obj.vis) > 0 else None + vin_available = vin_wmi is not None and chassis_code is not None + + fallback_ecus = CHECK_FUZZY_ECUS | {Ecu.fwdCamera, Ecu.adas, Ecu.cornerRadar, Ecu.parkingAdas} + fallback_optional_ecus = fallback_ecus - CHECK_FUZZY_ECUS + + for platform in CAR: + if not vin_available: + matched_ecus = set() + optional_ecu_seen = False + for ecu, versions in offline_fw_versions.get(platform, {}).items(): + if ecu[0] not in fallback_ecus: + continue + + found_versions = live_fw_versions.get(ecu[1:], []) + if len(found_versions) == 0: + continue + + if ecu[0] in fallback_optional_ecus: + optional_ecu_seen = True + + if any(found_version in versions for found_version in found_versions): + matched_ecus.add(ecu[0]) + else: + matched_ecus = set() + break + + if Ecu.fwdRadar in matched_ecus and (len(matched_ecus) >= 2 or not optional_ecu_seen): + candidates.add(platform) + continue + + valid_ecus = set() + for ecu in offline_fw_versions.get(platform, {}): + addr = ecu[1:] + if ecu[0] not in CHECK_FUZZY_ECUS: + continue + + # Sanity check that live FW is in the superset of all FW, Volkswagen ECU part numbers are commonly shared + found_versions = live_fw_versions.get(addr, []) + expected_versions = all_ecu_versions[ecu] + if not any(found_version in expected_versions for found_version in found_versions): + break + + valid_ecus.add(ecu[0]) + + if valid_ecus != CHECK_FUZZY_ECUS: + continue + + model_years = getattr(platform.config, "model_years", set()) + if vin_wmi in platform.config.wmis and chassis_code in platform.config.chassis_codes: + if len(model_years) > 0 and model_year_code is not None and model_year_code not in model_years: + continue + candidates.add(platform) + + return {str(c) for c in candidates} + + +def refine_fw_matches(matches, vin) -> set[str]: + vin_obj = Vin(vin) + if len(vin_obj.wmi) != 3 or len(vin_obj.vds) < 5: + return matches + + chassis_code = vin_obj.vds[3:5] + model_year_code = vin_obj.vis[0] if len(vin_obj.vis) > 0 else None + candidates = set() + for platform in CAR: + if platform not in matches: + continue + + model_years = getattr(platform.config, "model_years", set()) + if vin_obj.wmi not in platform.config.wmis or chassis_code not in platform.config.chassis_codes: + continue + if model_years and model_year_code not in model_years: + continue + candidates.add(platform) + + return {str(candidate) for candidate in candidates} or matches + + +# These ECUs are required to match to gain a VIN match +CHECK_FUZZY_ECUS = {Ecu.fwdRadar} + +# All supported cars should return FW from the engine, srs, eps, and fwdRadar. Cars +# with a manual trans won't return transmission firmware, but all other cars will. +# +# The 0xF187 SW part number query should return in the form of N[NX][NX] NNN NNN [X[X]], +# where N=number, X=letter, and the trailing two letters are optional. Performance +# tuners sometimes tamper with that field (e.g. 8V0 9C0 BB0 1 from COBB/EQT). Tampered +# ECU SW part numbers are invalid for vehicle ID and compatibility checks. Try to have +# them repaired by the tuner before including them in openpilot. + +VOLKSWAGEN_VERSION_REQUEST_MULTI = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_SPARE_PART_NUMBER) + \ + p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_VERSION_NUMBER) + \ + p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION) +VOLKSWAGEN_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + +VOLKSWAGEN_RX_OFFSET = 0x6a +VOLKSWAGEN_RX_OFFSET_CANFD = 0x20000 + +FW_QUERY_CONFIG = FwQueryConfig( + requests=[request for bus, obd_multiplexing in [(1, True), (1, False), (0, False)] for request in [ + Request( + [VOLKSWAGEN_VERSION_REQUEST_MULTI], + [VOLKSWAGEN_VERSION_RESPONSE], + whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.parkingAdas, Ecu.cornerRadar, Ecu.adas], + rx_offset=VOLKSWAGEN_RX_OFFSET, + bus=bus, + obd_multiplexing=obd_multiplexing, + ), + Request( + [VOLKSWAGEN_VERSION_REQUEST_MULTI], + [VOLKSWAGEN_VERSION_RESPONSE], + whitelist_ecus=[Ecu.engine, Ecu.transmission], + bus=bus, + obd_multiplexing=obd_multiplexing, + ), + Request( + [VOLKSWAGEN_VERSION_REQUEST_MULTI], + [VOLKSWAGEN_VERSION_RESPONSE], + whitelist_ecus=[Ecu.engine, Ecu.inverter], + rx_offset=VOLKSWAGEN_RX_OFFSET_CANFD, + bus=bus, + obd_multiplexing=obd_multiplexing, + ), + ]], + non_essential_ecus={Ecu.eps: list(CAR)}, + match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, + refine_fw_matches=refine_fw_matches, +) + +MQB_A0_CARS = { + CAR.VOLKSWAGEN_POLO_MK6, + CAR.VOLKSWAGEN_TCROSS_MK1, + CAR.SKODA_FABIA_MK4, + CAR.SKODA_KAMIQ_MK1, +} + + +def get_longitudinal_stopping_speed_override(candidate: CAR, flags: int) -> float: + if candidate == CAR.VOLKSWAGEN_PASSAT_B7: + return PASSAT_B7_STOPPING_SPEED + if flags & VolkswagenFlags.PQ: + return PQ_STOPPING_SPEED + return 0.0 + + +def apply_pq_stopping_accel(candidate: CAR, accel: float, stopping: bool) -> float: + return PASSAT_B7_STOP_ACCEL if candidate == CAR.VOLKSWAGEN_PASSAT_B7 and stopping else accel + + +DBC = CAR.create_dbc_map() diff --git a/artifacts/package_runtime/iqdbc/car/xcp.py b/artifacts/package_runtime/iqdbc/car/xcp.py new file mode 100644 index 000000000..046df7403 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/car/xcp.py @@ -0,0 +1,266 @@ +import sys +import time +import struct +from enum import IntEnum + + +class COMMAND_CODE(IntEnum): + CONNECT = 0xFF + DISCONNECT = 0xFE + GET_STATUS = 0xFD + SYNCH = 0xFC + GET_COMM_MODE_INFO = 0xFB + GET_ID = 0xFA + SET_REQUEST = 0xF9 + GET_SEED = 0xF8 + UNLOCK = 0xF7 + SET_MTA = 0xF6 + UPLOAD = 0xF5 + SHORT_UPLOAD = 0xF4 + BUILD_CHECKSUM = 0xF3 + TRANSPORT_LAYER_CMD = 0xF2 + USER_CMD = 0xF1 + DOWNLOAD = 0xF0 + DOWNLOAD_NEXT = 0xEF + DOWNLOAD_MAX = 0xEE + SHORT_DOWNLOAD = 0xED + MODIFY_BITS = 0xEC + SET_CAL_PAGE = 0xEB + GET_CAL_PAGE = 0xEA + GET_PAG_PROCESSOR_INFO = 0xE9 + GET_SEGMENT_INFO = 0xE8 + GET_PAGE_INFO = 0xE7 + SET_SEGMENT_MODE = 0xE6 + GET_SEGMENT_MODE = 0xE5 + COPY_CAL_PAGE = 0xE4 + CLEAR_DAQ_LIST = 0xE3 + SET_DAQ_PTR = 0xE2 + WRITE_DAQ = 0xE1 + SET_DAQ_LIST_MODE = 0xE0 + GET_DAQ_LIST_MODE = 0xDF + START_STOP_DAQ_LIST = 0xDE + START_STOP_SYNCH = 0xDD + GET_DAQ_CLOCK = 0xDC + READ_DAQ = 0xDB + GET_DAQ_PROCESSOR_INFO = 0xDA + GET_DAQ_RESOLUTION_INFO = 0xD9 + GET_DAQ_LIST_INFO = 0xD8 + GET_DAQ_EVENT_INFO = 0xD7 + FREE_DAQ = 0xD6 + ALLOC_DAQ = 0xD5 + ALLOC_ODT = 0xD4 + ALLOC_ODT_ENTRY = 0xD3 + PROGRAM_START = 0xD2 + PROGRAM_CLEAR = 0xD1 + PROGRAM = 0xD0 + PROGRAM_RESET = 0xCF + GET_PGM_PROCESSOR_INFO = 0xCE + GET_SECTOR_INFO = 0xCD + PROGRAM_PREPARE = 0xCC + PROGRAM_FORMAT = 0xCB + PROGRAM_NEXT = 0xCA + PROGRAM_MAX = 0xC9 + PROGRAM_VERIFY = 0xC8 + + +ERROR_CODES = { + 0x00: "Command processor synchronization", + 0x10: "Command was not executed", + 0x11: "Command rejected because DAQ is running", + 0x12: "Command rejected because PGM is running", + 0x20: "Unknown command or not implemented optional command", + 0x21: "Command syntax invalid", + 0x22: "Command syntax valid but command parameter(s) out of range", + 0x23: "The memory location is write protected", + 0x24: "The memory location is not accessible", + 0x25: "Access denied, Seed & Key is required", + 0x26: "Selected page not available", + 0x27: "Selected page mode not available", + 0x28: "Selected segment not valid", + 0x29: "Sequence error", + 0x2A: "DAQ configuration not valid", + 0x30: "Memory overflow error", + 0x31: "Generic error", + 0x32: "The slave internal program verify routine detects an error", +} + + +class CONNECT_MODE(IntEnum): + NORMAL = 0x00, + USER_DEFINED = 0x01, + + +class GET_ID_REQUEST_TYPE(IntEnum): + ASCII = 0x00, + ASAM_MC2_FILE = 0x01, + ASAM_MC2_PATH = 0x02, + ASAM_MC2_URL = 0x03, + ASAM_MC2_UPLOAD = 0x04, + # 128-255 user defined + + +class CommandTimeoutError(Exception): + pass + + +class CommandCounterError(Exception): + pass + + +class CommandResponseError(Exception): + def __init__(self, message, return_code): + super().__init__() + self.message = message + self.return_code = return_code + + def __str__(self): + return self.message + + +class XcpClient: + def __init__(self, panda, tx_addr: int, rx_addr: int, bus: int=0, timeout: float=0.1, debug=False, pad=True): + self.tx_addr = tx_addr + self.rx_addr = rx_addr + self.can_bus = bus + self.timeout = timeout + self.debug = debug + self._panda = panda + self._byte_order = ">" + self._max_cto = 8 + self._max_dto = 8 + self.pad = pad + + def _send_cto(self, cmd: int, dat: bytes = b"") -> None: + tx_data = (bytes([cmd]) + dat) + + # Some ECUs don't respond if the packets are not padded to 8 bytes + if self.pad: + tx_data = tx_data.ljust(8, b"\x00") + + if self.debug: + print("CAN-CLEAR: TX") + self._panda.can_clear(self.can_bus) + if self.debug: + print("CAN-CLEAR: RX") + self._panda.can_clear(0xFFFF) + if self.debug: + print(f"CAN-TX: {hex(self.tx_addr)} - 0x{bytes.hex(tx_data)}") + self._panda.can_send(self.tx_addr, tx_data, self.can_bus) + + def _recv_dto(self, timeout: float) -> bytes: + start_time = time.time() + while time.time() - start_time < timeout: + msgs = self._panda.can_recv() or [] + if len(msgs) >= 256: + print("CAN RX buffer overflow!!!", file=sys.stderr) + for rx_addr, rx_data, rx_bus in msgs: + if rx_bus == self.can_bus and rx_addr == self.rx_addr: + rx_data = bytes(rx_data) # convert bytearray to bytes + if self.debug: + print(f"CAN-RX: {hex(rx_addr)} - 0x{bytes.hex(rx_data)}") + + pid = rx_data[0] + if pid == 0xFE: + err = rx_data[1] + err_desc = ERROR_CODES.get(err, "unknown error") + dat = rx_data[2:] + raise CommandResponseError(f"{hex(err)} - {err_desc} {dat}", err) + + return bytes(rx_data[1:]) + time.sleep(0.001) + + raise CommandTimeoutError("timeout waiting for response") + + # commands + def connect(self, connect_mode: CONNECT_MODE=CONNECT_MODE.NORMAL) -> dict: + self._send_cto(COMMAND_CODE.CONNECT, bytes([connect_mode])) + resp = self._recv_dto(self.timeout) + assert len(resp) == 7, f"incorrect data length: {len(resp)}" + self._byte_order = ">" if resp[1] & 0x01 else "<" + self._slave_block_mode = resp[1] & 0x40 != 0 + self._max_cto = resp[2] + self._max_dto = struct.unpack(f"{self._byte_order}H", resp[3:5])[0] + return { + "cal_support": resp[0] & 0x01 != 0, + "daq_support": resp[0] & 0x04 != 0, + "stim_support": resp[0] & 0x08 != 0, + "pgm_support": resp[0] & 0x10 != 0, + "byte_order": self._byte_order, + "address_granularity": 2**((resp[1] & 0x06) >> 1), + "slave_block_mode": self._slave_block_mode, + "optional": resp[1] & 0x80 != 0, + "max_cto": self._max_cto, + "max_dto": self._max_dto, + "protocol_version": resp[5], + "transport_version": resp[6], + } + + def disconnect(self) -> None: + self._send_cto(COMMAND_CODE.DISCONNECT) + resp = self._recv_dto(self.timeout) + assert len(resp) == 0, f"incorrect data length: {len(resp)}" + + def get_id(self, req_id_type: GET_ID_REQUEST_TYPE = GET_ID_REQUEST_TYPE.ASCII) -> dict: + if req_id_type > 255: + raise ValueError("request id type must be less than 255") + self._send_cto(COMMAND_CODE.GET_ID, bytes([req_id_type])) + resp = self._recv_dto(self.timeout) + return { + # mode = 0 means MTA was set + # mode = 1 means data is at end (only CAN-FD has space for this) + "mode": resp[0], + "length": struct.unpack(f"{self._byte_order}I", resp[3:7])[0], + "identifier": resp[7:] if self._max_cto > 8 else None + } + + def get_seed(self, mode: int = 0) -> bytes: + if mode > 255: + raise ValueError("mode must be less than 255") + self._send_cto(COMMAND_CODE.GET_SEED, bytes([0, mode])) + + # TODO: add support for longer seeds spread over multiple blocks + ret = self._recv_dto(self.timeout) + length = ret[0] + return ret[1:length+1] + + def unlock(self, key: bytes) -> bytes: + # TODO: add support for longer keys spread over multiple blocks + self._send_cto(COMMAND_CODE.UNLOCK, bytes([len(key)]) + key) + return self._recv_dto(self.timeout) + + def set_mta(self, addr: int, addr_ext: int = 0) -> bytes: + if addr_ext > 255: + raise ValueError("address extension must be less than 256") + # TODO: this looks broken (missing addr extension) + self._send_cto(COMMAND_CODE.SET_MTA, bytes([0x00, 0x00, addr_ext]) + struct.pack(f"{self._byte_order}I", addr)) + return self._recv_dto(self.timeout) + + def upload(self, size: int) -> bytes: + if size > 255: + raise ValueError("size must be less than 256") + if not self._slave_block_mode and size > self._max_dto - 1: + raise ValueError("block mode not supported") + + self._send_cto(COMMAND_CODE.UPLOAD, bytes([size])) + resp = b"" + while len(resp) < size: + resp += self._recv_dto(self.timeout)[:size - len(resp) + 1] + return resp[:size] # trim off bytes with undefined values + + def short_upload(self, size: int, addr_ext: int, addr: int) -> bytes: + if size > 6: + raise ValueError("size must be less than 7") + if addr_ext > 255: + raise ValueError("address extension must be less than 256") + self._send_cto(COMMAND_CODE.SHORT_UPLOAD, bytes([size, 0x00, addr_ext]) + struct.pack(f"{self._byte_order}I", addr)) + return self._recv_dto(self.timeout)[:size] # trim off bytes with undefined values + + def download(self, data: bytes) -> bytes: + size = len(data) + if size > 255: + raise ValueError("size must be less than 256") + if not self._slave_block_mode and size > self._max_dto - 2: + raise ValueError("block mode not supported") + + self._send_cto(COMMAND_CODE.DOWNLOAD, bytes([size]) + data) + return self._recv_dto(self.timeout)[:size] diff --git a/artifacts/package_runtime/iqdbc/dbc/ESR.dbc b/artifacts/package_runtime/iqdbc/dbc/ESR.dbc new file mode 100644 index 000000000..8544a0c80 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/ESR.dbc @@ -0,0 +1,1080 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: Gateway ESR +VAL_TABLE_ ForwardReverse 1 "Reverse" 0 "Forward" ; +VAL_TABLE_ LeftRight 1 "Right Clockwise" 0 "Left CounterClockwise" ; +VAL_TABLE_ ValidInvalid 1 "Valid" 0 "Invalid" ; +VAL_TABLE_ TrueFalse 1 "True" 0 "False" ; + + +BO_ 1343 Target64: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1342 Target63: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1341 Target62: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1340 Target61: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1339 Target60: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1338 Target59: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1337 Target58: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1336 Target57: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1335 Target56: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1334 Target55: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1333 Target54: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1332 Target53: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1331 Target52: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1330 Target51: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1329 Target50: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1328 Target49: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1327 Target48: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1326 Target47: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1325 Target46: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1324 Target45: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1323 Target44: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1322 Target43: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1321 Target42: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1320 Target41: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1319 Target40: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1318 Target39: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1317 Target38: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1316 Target37: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1315 Target36: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1314 Target35: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1313 Target34: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1312 Target33: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1311 Target32: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1310 Target31: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1309 Target30: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1308 Target29: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1307 Target28: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1306 Target27: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1305 Target26: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1304 Target25: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1303 Target24: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1302 Target23: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1301 Target22: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1300 Target21: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1299 Target20: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1298 Target19: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1297 Target18: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1296 Target17: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1295 Target16: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1294 Target15: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1293 Target14: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1292 Target13: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1291 Target12: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1290 Target11: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1289 Target10: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1288 Target9: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1287 Target8: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1285 Target6: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1286 Target7: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1284 Target5: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1283 Target4: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1282 Target3: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1281 Target2: 8 Vector__XXX + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1524 VehicleData3: 8 Gateway + SG_ CAN_RX_YAW_RATE_BIAS_SHIFT : 15|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_WHEELBASE : 55|8@0+ (2,200) [200|710] "cm" Vector__XXX + SG_ CAN_RX_STEERING_GEAR_RATIO : 63|8@0+ (0.125,0) [0|31.875] "" Vector__XXX + SG_ CAN_RX_OVERSTEER_UNDERSTEER : 7|8@0- (1,0) [-128|127] "%" Vector__XXX + SG_ CAN_RX_FUNNEL_OFFSET_RIGHT : 31|8@0- (0.1,0) [-12.8|12.7] "m" Vector__XXX + SG_ CAN_RX_FUNNEL_OFFSET_LEFT : 23|8@0- (0.1,0) [-12.8|12.7] "m" Vector__XXX + SG_ CAN_RX_DISTANCE_REAR_AXLE : 47|8@0+ (2,200) [200|710] "cm" Vector__XXX + SG_ CAN_RX_CW_BLOCKAGE_TRESHOLD : 39|8@0+ (0.0078125,0) [0|1.9921875] "" Vector__XXX + SG_ CAN_RX_BEAMWIDTH_VERT : 14|7@0+ (0.0625,0) [0|7.9375] "deg" Vector__XXX + +BO_ 1523 FactoryAlignment: 8 Gateway + +BO_ 1522 Vehicle_Data2: 8 Gateway + SG_ CAN_RX_WHEEL_SLIP : 41|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_RX_SERV_ALIGN_UPDATES_NEED : 55|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_RX_SERV_ALIGN_TYPE : 47|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_RADAR_HEIGHT : 38|7@0+ (1,0) [0|127] "cm" Vector__XXX + SG_ CAN_RX_RADAR_FOV_MR : 30|7@0+ (1,0) [0|127] "deg" Vector__XXX + SG_ CAN_RX_RADAR_FOV_LR : 19|5@0+ (1,0) [0|31] "deg" Vector__XXX + SG_ CAN_RX_LONG_ACCEL_VALIDITY : 7|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_LONG_ACCEL : 12|9@0- (0.03125,0) [-8|7.96875] "m/s^2" Vector__XXX + SG_ CAN_RX_LAT_ACCEL_VALIDITY : 6|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_LAT_ACCEL : 5|9@0- (0.03125,0) [-8|7.96875] "m/s^2" Vector__XXX + SG_ CAN_RX_AUTO_ALIGN_DISABLE : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_AUTO_ALIGN_CONVERGED : 42|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_ANGLE_MOUNTING_OFFSET : 63|8@0- (0.0625,0) [-8|7.9375] "deg" Vector__XXX + SG_ CAN_RX_AALIGN_AVG_CTR_TOTAL : 45|3@0+ (250,250) [250|2000] "" Vector__XXX + +BO_ 1512 CIPV_Targets_Etc: 8 ESR + +BO_ 1511 ESR_History_Fault: 8 ESR + +BO_ 1510 ESR_Active_Fault: 8 ESR + +BO_ 1508 AD_Data: 8 ESR + +BO_ 1489 SensorValidation2: 8 ESR + SG_ CAN_TX_VALID_MR_SN : 7|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_VALID_MR_RANGE_RATE : 31|16@0- (0.0078125,0) [-256|255.9921875] "m/s" Vector__XXX + SG_ CAN_TX_VALID_MR_RANGE : 15|16@0+ (0.0078125,0) [0|511.9921875] "m" Vector__XXX + SG_ CAN_TX_VALID_MR_POWER : 63|8@0- (1,0) [-128|127] "db" Vector__XXX + SG_ CAN_TX_VALID_MR_ANGLE : 40|16@1- (0.0625,0) [-2048|2047.9375] "deg" Vector__XXX + +BO_ 1488 SensorValidation: 8 ESR + SG_ CAN_TX_VALID_LR_SN : 7|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_VALID_LR_RANGE_RATE : 31|16@0- (0.0078125,0) [-256|255.9921875] "m/s" Vector__XXX + SG_ CAN_TX_VALID_LR_RANGE : 15|16@0+ (0.0078125,0) [0|511.9921875] "m" Vector__XXX + SG_ CAN_TX_VALID_LR_POWER : 63|8@0- (1,0) [-128|127] "db" Vector__XXX + SG_ CAN_TX_VALID_LR_ANGLE : 47|16@0- (0.0625,0) [-2048|2047.9375] "deg" Vector__XXX + +BO_ 1344 Track_Sensor: 1 ESR + SG_ CAN_TX_TRACK_ROLLING_COUNT_2 : 4|1@0+ (1,0) [0|1] "" Vector__XXX + +BO_ 1280 Target1: 8 ESR + SG_ CAN_TX_TRACK_WIDTH : 37|4@0+ (0.5,0) [0|7.5] "" Vector__XXX + SG_ CAN_TX_TRACK_STATUS : 15|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ CAN_TX_TRACK_ROLLING_COUNT : 38|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_RATE : 53|14@0- (0.01,0) [-81.92|81.91] "m/s" Vector__XXX + SG_ CAN_TX_TRACK_RANGE_ACCEL : 33|10@0- (0.05,0) [-25.6|25.55] "m/s^2" Vector__XXX + SG_ CAN_TX_TRACK_RANGE : 18|11@0+ (0.1,0) [0|204.7] "m" Vector__XXX + SG_ CAN_TX_TRACK_ONCOMING : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_MED_RANGE_MODE : 55|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_TRACK_LAT_RATE : 7|6@0- (0.25,0) [-8|7.75] "" Vector__XXX + SG_ CAN_TX_TRACK_GROUPING_CHANGED : 1|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_BRIDGE_OBJECT : 39|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_TRACK_ANGLE : 12|10@0- (0.1,0) [-51.2|51.1] "" Vector__XXX + +BO_ 1265 SensorInput: 8 Gateway + SG_ CAN_RX_USE_ANGLE_MISALIGNMENT : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CAN_RX_SCAN_INDEX_ACK : 7|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_RX_LATERAL_MOUNTING_OFFSET : 47|8@0- (0.01563,0) [-2.00064|1.98501] "m" Vector__XXX + SG_ CAN_RX_WIPER_STATUS : 57|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_VOLVO_SHORT_TRACK_ROC : 31|4@0- (500,0) [-4000|3500] "m" Vector__XXX + SG_ CAN_RX_VEHICLE_SPEED_VALIDITY : 61|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_TURN_SIGNAL_STATUS : 63|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_RX_RAW_DATA_ENABLE : 56|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_RADAR_CMD_RADIATE : 55|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_MR_ONLY_TRANSMIT : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CAN_RX_MMR_UPSIDE_DOWN : 60|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_MAXIMUM_TRACKS : 53|6@0+ (1,0) [0|63] "" Vector__XXX + SG_ CAN_RX_LR_ONLY_TRANSMIT : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CAN_RX_HIGH_YAW_ANGLE : 21|6@0- (1,0) [-32|31] "deg" Vector__XXX + SG_ CAN_RX_GROUPING_MODE : 59|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_RX_CLEAR_FAULTS : 22|1@0- (1,0) [0|0] "" Vector__XXX + SG_ CAN_RX_BLOCKAGE_DISABLE : 54|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_ANGLE_MISALIGNMENT : 39|8@0- (0.0625,0) [-8|7.9375] "deg" Vector__XXX + +BO_ 1264 Vehicle_Data: 8 Gateway + SG_ CAN_RX_YAW_RATE_VALIDITY : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CAN_RX_YAW_RATE : 11|12@0- (0.0625,0) [-128|127.9375] "deg/s" Vector__XXX + SG_ CAN_RX_VEHICLE_SPEED_DIRECTION : 12|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_VEHICLE_SPEED : 7|11@0+ (0.0625,0) [0|127.9375] "m/s" Vector__XXX + SG_ CAN_RX_RADIUS_CURVATURE : 29|14@0- (1,0) [-8192|8191] "m" Vector__XXX + SG_ CAN_RX_STEERING_VALIDITY : 47|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_STEERING_ANGLE_SIGN : 46|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_STEERING_ANGLE_RATE_SIGN : 30|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_RX_STEERING_ANGLE_RATE : 50|11@0+ (1,0) [0|2047] "deg/s" Vector__XXX + SG_ CAN_RX_STEERING_ANGLE : 45|11@0+ (1,0) [0|2047] "deg" Vector__XXX + +BO_ 1251 ESR_Output_InPath: 8 ESR + SG_ CAN_TX_PATH_ID_ACC_MOVE : 15|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_TRUCK_TARGET_DET : 7|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_SIDELOBE_BLOCKATE : 5|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_ROLLING_COUNT_3 : 1|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_PATH_ID_FCW_STAT : 47|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_PATH_ID_FCW_MOVE : 39|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_PATH_ID_CMBB_STAT : 31|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_PATH_ID_CMBB_MOVE : 23|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_PATH_ID_ACC_STAT : 63|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_PARTIAL_BLOCKAGE : 4|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_LR_ONLY_GRATING_LOBE_DET : 6|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_LMR_LR_MODE : 3|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_AUTO_ALIGN_ANGLE : 55|8@0- (0.0625,0) [-8|7.9375] "" Vector__XXX + +BO_ 1250 ESR_SW: 8 ESR + SG_ CAN_TX_SW_VERSION_PLD : 63|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_TX_SW_VERSION_HOST : 15|24@0+ (1,0) [0|16777215] "" Vector__XXX + SG_ CAN_TX_SERIAL_NUM : 39|24@0+ (1,0) [0|16777215] "" Vector__XXX + SG_ CAN_TX_INTERFACE_VERSION : 7|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ CAN_TX_HW_VERSION : 3|4@0+ (1,0) [0|15] "" Vector__XXX + +BO_ 1249 ESR_Status2: 8 ESR + SG_ CAN_TX_YAW_RATE_BIAS : 47|8@0- (0.125,0) [-16|15.875] "" Vector__XXX + SG_ CAN_TX_XCVR_OPERATIONAL : 12|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_VEH_SPD_COMP_FACTOR : 39|6@0- (0.00195,1) [0.9376|1.06045] "" Vector__XXX + SG_ CAN_TX_TEMPERATURE : 31|8@0- (1,0) [-128|127] "degC" Vector__XXX + SG_ CAN_TX_SW_VERSION_DSP : 55|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_TX_STEERING_ANGLE_ACK : 10|11@0+ (1,0) [0|2047] "deg" Vector__XXX + SG_ CAN_TX_ROLLING_COUNT_2 : 1|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ CAN_TX_RAW_DATA_MODE : 11|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_RANGE_PERF_ERROR : 14|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_OVERHEAT_ERROR : 15|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_MAXIMUM_TRACKS_ACK : 7|6@0+ (1,1) [1|64] "" Vector__XXX + SG_ CAN_TX_INTERNAL_ERROR : 13|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_TX_GROUPING_MODE : 33|2@0+ (1,0) [0|3] "" Vector__XXX + +BO_ 1248 ESR_Status: 8 ESR + SG_ CAN_TX_COMM_ERROR : 14|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CAN_TX_RADIUS_CURVATURE_CALC : 13|14@0- (1,0) [-8192|8191] "" Vector__XXX + SG_ CAN_TX_YAW_RATE_CALC : 47|12@0- (0.0625,0) [-128|127.9375] "deg/s" Vector__XXX + SG_ CAN_TX_VEHICLE_SPEED_CALC : 50|11@0+ (0.0625,0) [0|127.9375] "m/s" Vector__XXX + SG_ CAN_TX_DSP_TIMESTAMP : 5|7@0+ (2,0) [0|254] "ms" Vector__XXX + SG_ CAN_TX_SCAN_INDEX : 31|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_TX_ROLLING_COUNT_1 : 6|2@1+ (1,0) [0|3] "" Vector__XXX + + + +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "BusType" "CAN"; +VAL_ 1264 CAN_RX_YAW_RATE_VALIDITY 1 "Valid" 0 "Invalid" ; +VAL_ 1264 CAN_RX_VEHICLE_SPEED_DIRECTION 1 "Reverse" 0 "Forward" ; +VAL_ 1264 CAN_RX_STEERING_VALIDITY 1 "True" 0 "False" ; +VAL_ 1264 CAN_RX_STEERING_ANGLE_SIGN 1 "Right Clockwise" 0 "Left CounterClockwise" ; +VAL_ 1264 CAN_RX_STEERING_ANGLE_RATE_SIGN 1 "Right Clockwise" 0 "Left CounterClockwise" ; + diff --git a/artifacts/package_runtime/iqdbc/dbc/FORD_CADS.dbc b/artifacts/package_runtime/iqdbc/dbc/FORD_CADS.dbc new file mode 100644 index 000000000..569739c9c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/FORD_CADS.dbc @@ -0,0 +1,3544 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: +BU_: MRR +BO_ 1073741824 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX + SG_ New_Signal_943 : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ CAN_SENSOR_VANGLE_OFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX + SG_ CAN_SENSOR_FOV_VER : 0|8@0+ (1,0) [0|255] "deg" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE_QF : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE_REF : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_MMIC_Temp4 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_MMIC_Temp3 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_MMIC_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_Processor_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_CHECKSUM : 0|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_COUNTER : 0|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ CAN_VEHICLE_MODE : 0|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ CAN_USC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_USC_CAL_VER_MINOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_SMC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_HW_VERSION : 0|32@0+ (1,0) [0|4.29497e+09] "" Vector__XXX + SG_ CAN_FAC_TGT_MTG_SPACE_VER : 0|8@0+ (1,-128) [-128|127] "cm" Vector__XXX + SG_ CAN_ANGLE_MISALIGNMENT_VER : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_ANGLE_MOUNTING_VOFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX + SG_ CAN_LATCH_FAULTS : 0|64@0+ (1,0) [0|100] "" Vector__XXX + SG_ CAN_ACTIVE_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX + SG_ CAN_HISTORY_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX + SG_ CAN_SERV_ALIGN_ENABLE : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_LONG_MOUNTING_OFFSET : 0|8@0+ (0.015625,-2) [-2|1.98438] "" Vector__XXX + SG_ CAN_BEAMWIDTH_VERT : 0|7@0+ (0.125,0) [0|15.875] "deg" Vector__XXX + SG_ CAN_VEHICLE_SPEED_CALC_QF : 0|2@0+ (1,0) [0|3] "" Vector__XXX + +BO_ 34 Active_Fault_Latched_2: 8 MRR + SG_ IPMA_PCAN_DataRangeCheck : 4|1@1+ (1,0) [0|1] "" External_Tool + SG_ IPMA_PCAN_MissingMsg : 3|1@1+ (1,0) [0|1] "" External_Tool + SG_ VINSignalCompareFailure : 2|1@1+ (1,0) [0|1] "" External_Tool + SG_ ModuleNotConfiguredError : 1|1@1+ (1,0) [0|1] "" External_Tool + SG_ CarCfgNotConfiguredError : 0|1@1+ (1,0) [0|1] "" External_Tool + +BO_ 33 Active_Fault_Latched_1: 8 MRR + SG_ Active_Flt_Latched_byte7_bit7 : 63|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit6 : 62|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit5 : 61|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit4 : 60|1@1+ (1,0) [0|1] "" External_Tool + SG_ ARMtoDSPChksumFault : 59|1@1+ (1,0) [0|1] "" External_Tool + SG_ DSPtoArmChksumFault : 58|1@1+ (1,0) [0|1] "" External_Tool + SG_ HostToArmChksumFault : 57|1@1+ (1,0) [0|1] "" External_Tool + SG_ ARMtoHostChksumFault : 56|1@1+ (1,0) [0|1] "" External_Tool + SG_ LoopBWOutOfRange : 55|1@1+ (1,0) [0|1] "" External_Tool + SG_ DSPOverrunFault : 54|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte6_bit5 : 53|1@1+ (1,0) [0|1] "" External_Tool + SG_ TuningSensitivityFault : 52|1@1+ (1,0) [0|1] "" External_Tool + SG_ SaturatedTuningFreqFault : 51|1@1+ (1,0) [0|1] "" External_Tool + SG_ LocalOscPowerFault : 50|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterPowerFault : 49|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte6_bit0 : 48|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit7 : 47|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit6 : 46|1@1+ (1,0) [0|1] "" External_Tool + SG_ XCVRDeviceSPIFault : 45|1@1+ (1,0) [0|1] "" External_Tool + SG_ FreqSynthesizerSPIFault : 44|1@1+ (1,0) [0|1] "" External_Tool + SG_ AnalogConverterDevicSPIFault : 43|1@1+ (1,0) [0|1] "" External_Tool + SG_ SidelobeBlockage : 42|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit1 : 41|1@1+ (1,0) [0|1] "" External_Tool + SG_ MNRBlocked : 40|1@1+ (1,0) [0|1] "" External_Tool + SG_ ECUTempHighFault : 39|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterTempHighFault : 38|1@1+ (1,0) [0|1] "" External_Tool + SG_ AlignmentRoutineFailedFault : 37|1@1+ (1,0) [0|1] "" External_Tool + SG_ UnreasonableRadarData : 36|1@1+ (1,0) [0|1] "" External_Tool + SG_ MicroprocessorTempHighFault : 35|1@1+ (1,0) [0|1] "" External_Tool + SG_ VerticalAlignmentOutOfRange : 34|1@1+ (1,0) [0|1] "" External_Tool + SG_ HorizontalAlignmentOutOfRange : 33|1@1+ (1,0) [0|1] "" External_Tool + SG_ FactoryAlignmentMode : 32|1@1+ (1,0) [0|1] "" External_Tool + SG_ BatteryLowFault : 31|1@1+ (1,0) [0|1] "" External_Tool + SG_ BatteryHighFault : 30|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_1p25SupplyOutOfRange : 29|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte3_bit4 : 28|1@1+ (1,0) [0|1] "" External_Tool + SG_ ThermistorOutOfRange : 27|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_3p3DACSupplyOutOfRange : 26|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_3p3RAWSupplyOutOfRange : 25|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_5_SupplyOutOfRange : 24|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterIDFault : 23|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit6 : 22|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit5 : 21|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit4 : 20|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit3 : 19|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit2 : 18|1@1+ (1,0) [0|1] "" External_Tool + SG_ PCANMissingMsgFault : 17|1@1+ (1,0) [0|1] "" External_Tool + SG_ PCANBusOff : 16|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit7 : 15|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit6 : 14|1@1+ (1,0) [0|1] "" External_Tool + SG_ InstructionSetCheckFault : 13|1@1+ (1,0) [0|1] "" External_Tool + SG_ StackOverflowFault : 12|1@1+ (1,0) [0|1] "" External_Tool + SG_ WatchdogFault : 11|1@1+ (1,0) [0|1] "" External_Tool + SG_ PLLLockFault : 10|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit1 : 9|1@1+ (1,0) [0|1] "" External_Tool + SG_ RAMMemoryTestFault : 8|1@1+ (1,0) [0|1] "" External_Tool + SG_ USCValidationFault : 7|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit6 : 6|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit5 : 5|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit4 : 4|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit3 : 3|1@1+ (1,0) [0|1] "" External_Tool + SG_ KeepAliveChecksumFault : 2|1@1+ (1,0) [0|1] "" External_Tool + SG_ ProgramCalibrationFlashChecksum : 1|1@1+ (1,0) [0|1] "" External_Tool + SG_ ApplicationFlashChecksumFault : 0|1@1+ (1,0) [0|1] "" External_Tool + +BO_ 500 XCP_MRR_DAQ_RESP: 8 MRR + SG_ MRR_xcp_daq_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 499 XCP_MRR_DTO_RESP: 8 MRR + SG_ MRR_xcp_dto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 497 XCP_MRR_CTO_RESP: 8 MRR + SG_ MRR_xcp_cto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 1900 Ford_Diag_Resp_Phys: 8 MRR + SG_ TesterPhysicalResCCM : 7|64@0+ (1,0) [0|1.84467e+19] "" IFV_Host + +BO_ 261 MRR_Status_SerialNumber: 8 MRR + SG_ CAN_SEQUENCE_NUMBER : 55|16@0+ (1,0) [0|65535] "" External_Tool + SG_ CAN_SERIAL_NUMBER : 7|40@0+ (1,0) [0|1.09951e+12] "" External_Tool + +BO_ 264 MRR_Status_SwVersion: 8 MRR + SG_ CAN_PBL_Field_Revision : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_PBL_Promote_Revision : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Field_Revision : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Promote_Revision : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Release_Revision : 7|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_PBL_Release_Revision : 31|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 373 MRR_Header_SensorPosition: 8 MRR + SG_ CAN_SENSOR_POLARITY : 55|1@0+ (1,0) [0|1] "" External_Tool + SG_ CAN_SENSOR_LAT_OFFSET : 39|16@0+ (0.01,0) [0|655.35] "cm" External_Tool + SG_ CAN_SENSOR_LONG_OFFSET : 23|16@0+ (0.01,0) [0|655.35] "cm" External_Tool + SG_ CAN_SENSOR_HANGLE_OFFSET : 7|8@0+ (0.0625,-8) [-8|7.9375] "deg" External_Tool + +BO_ 372 MRR_Header_SensorCoverage: 8 MRR + SG_ CAN_SENSOR_FOV_HOR : 39|8@0+ (1,0) [0|255] "deg" IFV_VFP + SG_ CAN_DOPPLER_COVERAGE : 23|8@0+ (1,-128) [-128|127] "m/s" IFV_VFP + SG_ CAN_RANGE_COVERAGE : 7|8@0+ (1,0) [0|255] "m" IFV_VFP + +BO_ 371 MRR_Header_AlignmentState: 8 MRR + SG_ CAN_AUTO_ALIGN_HANGLE_QF : 13|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_ALIGNMENT_STATUS : 51|4@0+ (1,0) [0|11] "" IFV_VFP + SG_ CAN_ALIGNMENT_STATE : 55|3@0+ (1,0) [0|7] "" IFV_VFP + SG_ CAN_AUTO_ALIGN_HANGLE_REF : 11|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP + SG_ CAN_AUTO_ALIGN_HANGLE : 7|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP + +BO_ 369 MRR_Header_Timestamps: 8 MRR + SG_ CAN_DET_TIME_SINCE_MEAS : 39|11@0+ (0.1,0) [0|204.7] "ms" IFV_Host + SG_ CAN_SENSOR_TIME_STAMP : 7|32@0+ (0.1,0) [0|4.29497e+08] "ms" IFV_VFP + +BO_ 368 MRR_Header_InformationDetections: 8 MRR + SG_ CAN_ALIGN_UPDATES_DONE : 55|16@0+ (1,0) [0|65535] "" IFV_VFP + SG_ CAN_SCAN_INDEX : 31|16@0+ (1,0) [0|65535] "" IFV_VFP + SG_ CAN_NUMBER_OF_DET : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_LOOK_ID : 23|2@0+ (1,0) [0|3] "" External_Tool + SG_ CAN_LOOK_INDEX : 7|16@0+ (1,0) [0|65535] "" External_Tool + +BO_ 265 MRR_Status_Temp_Volt: 8 MRR + SG_ CAN_BATT_VOLTS : 63|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_1_25_V : 55|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_5_V : 47|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_3_3_V_RAW : 31|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_3_3_V_DAC : 15|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_MMIC_Temp1 : 39|8@0+ (1,-50) [-50|205] "C" External_Tool + SG_ CAN_Processor_Thermistor : 23|8@0+ (1,-50) [-50|205] "C" External_Tool + SG_ CAN_Processor_Temp1 : 7|8@0+ (1,-50) [-50|205] "C" External_Tool + +BO_ 291 MRR_Detection_004: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_04 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_04 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_04 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_04 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_04 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_04 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_04 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_04 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_04 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_04 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 351 MRR_Detection_064: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_64 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_64 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_64 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_64 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_64 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_64 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_64 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_64 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_64 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_64 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 350 MRR_Detection_063: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_63 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_63 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_63 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_63 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_63 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_63 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_63 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_63 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_63 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_63 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 349 MRR_Detection_062: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_62 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_62 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_62 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_62 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_62 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_62 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_62 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_62 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_62 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_62 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 348 MRR_Detection_061: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_61 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_61 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_61 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_61 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_61 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_61 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_61 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_61 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_61 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_61 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 347 MRR_Detection_060: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_60 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_60 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_60 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_60 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_60 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_60 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_60 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_60 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_60 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_60 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 346 MRR_Detection_059: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_59 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_59 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_59 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_59 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_59 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_59 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_59 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_59 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_59 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_59 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 345 MRR_Detection_058: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_58 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_58 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_58 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_58 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_58 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_58 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_58 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_58 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_58 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_58 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 344 MRR_Detection_057: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_57 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_57 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_57 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_57 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_57 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_57 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_57 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_57 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_57 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_57 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 343 MRR_Detection_056: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_56 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_56 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_56 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_56 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_56 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_56 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_56 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_56 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_56 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_56 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 342 MRR_Detection_055: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_55 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_55 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_55 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_55 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_55 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_55 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_55 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_55 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_55 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_55 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 335 MRR_Detection_048: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_48 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_48 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_48 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_48 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_48 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_48 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_48 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_48 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_48 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_48 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 334 MRR_Detection_047: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_47 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_47 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_47 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_47 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_47 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_47 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_47 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_47 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_47 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_47 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 333 MRR_Detection_046: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_46 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_46 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_46 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_46 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_46 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_46 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_46 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_46 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_46 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_46 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 332 MRR_Detection_045: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_45 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_45 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_45 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_45 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_45 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_45 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_45 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_45 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_45 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_45 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 331 MRR_Detection_044: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_44 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_44 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_44 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_44 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_44 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_44 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_44 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_44 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_44 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_44 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 330 MRR_Detection_043: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_43 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_43 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_43 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_43 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_43 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_43 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_43 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_43 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_43 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_43 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 329 MRR_Detection_042: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_42 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_42 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_42 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_42 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_42 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_42 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_42 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_42 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_42 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_42 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 328 MRR_Detection_041: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_41 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_41 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_41 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_41 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_41 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_41 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_41 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_41 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_41 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_41 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 327 MRR_Detection_040: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_40 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_40 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_40 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_40 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_40 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_40 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_40 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_40 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_40 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_40 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 325 MRR_Detection_038: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_38 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_38 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_38 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_38 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_38 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_38 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_38 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_38 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_38 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_38 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 324 MRR_Detection_037: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_37 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_37 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_37 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_37 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_37 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_37 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_37 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_37 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_37 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_37 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 323 MRR_Detection_036: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_36 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_36 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_36 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_36 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_36 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_36 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_36 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_36 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_36 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_36 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 322 MRR_Detection_035: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_35 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_35 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_35 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_35 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_35 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_35 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_35 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_35 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_35 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_35 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 321 MRR_Detection_034: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_34 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_34 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_34 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_34 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_34 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_34 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_34 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_34 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_34 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_34 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 320 MRR_Detection_033: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_33 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_33 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_33 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_33 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_33 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_33 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_33 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_33 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_33 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_33 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 319 MRR_Detection_032: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_32 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_32 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_32 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_32 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_32 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_32 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_32 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_32 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_32 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_32 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 318 MRR_Detection_031: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_31 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_31 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_31 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_31 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_31 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_31 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_31 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_31 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_31 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_31 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 317 MRR_Detection_030: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_30 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_30 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_30 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_30 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_30 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_30 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_30 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_30 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_30 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_30 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 316 MRR_Detection_029: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_29 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_29 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_29 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_29 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_29 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_29 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_29 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_29 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_29 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_29 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 314 MRR_Detection_027: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_27 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_27 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_27 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_27 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_27 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_27 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_27 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_27 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_27 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_27 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 313 MRR_Detection_026: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_26 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_26 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_26 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_26 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_26 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_26 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_26 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_26 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_26 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_26 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 312 MRR_Detection_025: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_25 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_25 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_25 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_25 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_25 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_25 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_25 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_25 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_25 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_25 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 311 MRR_Detection_024: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_24 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_24 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_24 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_24 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_24 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_24 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_24 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_24 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_24 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_24 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 310 MRR_Detection_023: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_23 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_23 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_23 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_23 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_23 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_23 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_23 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_23 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_23 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_23 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 309 MRR_Detection_022: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_22 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_22 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_22 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_22 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_22 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_22 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_22 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_22 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_22 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_22 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 308 MRR_Detection_021: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_21 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_21 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_21 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_21 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_21 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_21 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_21 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_21 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_21 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_21 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 307 MRR_Detection_020: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_20 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_20 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_20 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_20 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_20 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_20 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_20 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_20 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_20 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_20 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 306 MRR_Detection_019: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_19 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_19 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_19 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_19 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_19 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_19 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_19 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_19 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_19 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_19 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 305 MRR_Detection_018: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_18 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_18 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_18 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_18 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_18 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_18 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_18 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_18 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_18 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_18 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 341 MRR_Detection_054: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_54 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_54 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_54 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_54 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_54 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_54 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_54 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_54 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_54 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_54 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 340 MRR_Detection_053: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_53 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_53 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_53 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_53 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_53 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_53 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_53 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_53 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_53 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_53 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 339 MRR_Detection_052: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_52 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_52 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_52 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_52 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_52 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_52 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_52 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_52 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_52 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_52 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 338 MRR_Detection_051: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_51 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_51 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_51 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_51 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_51 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_51 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_51 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_51 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_51 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_51 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 337 MRR_Detection_050: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_50 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_50 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_50 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_50 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_50 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_50 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_50 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_50 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_50 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_50 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 336 MRR_Detection_049: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_49 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_49 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_49 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_49 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_49 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_49 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_49 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_49 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_49 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_49 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 326 MRR_Detection_039: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_39 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_39 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_39 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_39 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_39 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_39 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_39 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_39 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_39 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_39 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 315 MRR_Detection_028: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_28 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_28 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_28 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_28 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_28 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_28 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_28 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_28 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_28 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_28 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 304 MRR_Detection_017: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_17 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_17 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_17 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_17 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_17 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_17 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_17 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_17 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_17 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_17 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 303 MRR_Detection_016: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_16 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_16 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_16 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_16 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_16 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_16 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_16 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_16 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_16 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_16 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 302 MRR_Detection_015: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_15 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_15 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_15 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_15 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_15 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_15 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_15 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_15 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_15 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_15 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 301 MRR_Detection_014: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_14 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_14 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_14 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_14 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_14 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_14 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_14 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_14 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_14 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_14 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 300 MRR_Detection_013: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_13 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_13 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_13 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_13 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_13 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_13 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_13 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_13 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_13 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_13 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 299 MRR_Detection_012: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_12 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_12 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_12 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_12 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_12 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_12 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_12 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_12 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_12 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_12 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 298 MRR_Detection_011: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_11 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_11 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_11 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_11 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_11 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_11 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_11 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_11 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_11 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_11 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 297 MRR_Detection_010: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_10 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_10 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_10 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_10 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_10 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_10 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_10 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_10 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_10 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_10 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 296 MRR_Detection_009: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_09 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_09 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_09 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_09 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_09 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_09 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_09 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_09 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_09 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_09 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 295 MRR_Detection_008: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_08 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_08 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_08 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_08 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_08 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_08 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_08 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_08 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_08 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_08 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 294 MRR_Detection_007: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_07 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_07 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_07 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_07 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_07 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_07 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_07 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_07 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_07 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_07 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 293 MRR_Detection_006: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_06 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_06 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_06 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_06 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_06 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_06 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_06 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_06 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_06 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_06 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 292 MRR_Detection_005: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_05 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_05 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_05 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_05 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_05 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_05 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_05 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_05 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_05 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_05 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 290 MRR_Detection_003: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_03 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_03 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_03 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_03 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_03 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_03 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_03 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_03 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_03 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_03 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 289 MRR_Detection_002: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_02 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_02 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_02 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_02 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_02 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_02 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_02 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_02 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_02 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_02 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 256 MRR_Status_CANVersion: 8 MRR + SG_ CAN_USC_SECTION_COMPATIBILITY : 23|16@0+ (1,0) [0|65535] "" External_Tool + SG_ CAN_PCAN_MINOR_MRR : 7|8@0+ (1,0) [0|255] "" IFV_VFP + SG_ CAN_PCAN_MAJOR_MRR : 15|8@0+ (1,0) [0|255] "" IFV_VFP + +BO_ 257 MRR_Status_Radar: 8 MRR + SG_ CAN_INTERFERENCE_TYPE : 11|2@0+ (1,0) [0|3] "" IFV_Host + SG_ CAN_RECOMMEND_UNCONVERGE : 9|1@0+ (1,0) [0|1] "" IFV_Host + SG_ CAN_BLOCKAGE_SIDELOBE_FILTER_VAL : 15|4@0+ (1,0) [0|15] "" IFV_Host + SG_ CAN_RADAR_ALIGN_INCOMPLETE : 8|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_BLOCKAGE_SIDELOBE : 4|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_BLOCKAGE_MNR : 5|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_EXT_COND_NOK : 1|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_ALIGN_OUT_RANGE : 2|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_ALIGN_NOT_START : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_OVERHEAT_ERROR : 3|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_NOT_OP : 6|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_XCVR_OPERATIONAL : 7|1@0+ (1,0) [0|1] "" IFV_VFP + +BO_ 288 MRR_Detection_001: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BA_DEF_ SG_ "CrossOver_InfoCAN" ENUM "No","Yes"; +BA_DEF_ SG_ "CrossOver_LIN" ENUM "No","Yes","No","Yes"; +BA_DEF_ SG_ "UsedOnPgmDBC" ENUM "No","Yes","No","Yes","No","Yes"; +BA_DEF_ SG_ "ContentDependant" ENUM "No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ SG_ "GenSigTimeoutTime_RCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_GWM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_OCS" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_ABS_ESC" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_CCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_IPMA" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_TSTR" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_SCCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_PSCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime__delete" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_Generic_BCM" INT 0 100000; +BA_DEF_ BO_ "NmMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "DiagResponse" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "DiagRequest" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "TpTxIndex" INT 0 255; +BA_DEF_ BO_ "DiagState" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "TpApplType" STRING ; +BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "Mulitplexer" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "ConfiguredTransmitter" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "EventRateOfChange" INT 10 10000; +BA_DEF_ BO_ "GenMsgHandlingTypeDoc" STRING ; +BA_DEF_ BO_ "GenMsgHandlingTypeCode" STRING ; +BA_DEF_ BO_ "GenMsgMarked" STRING ; +BA_DEF_ SG_ "GenSigMarked" STRING ; +BA_DEF_ SG_ "GenSigVtIndex" STRING ; +BA_DEF_ SG_ "GenSigVtName" STRING ; +BA_DEF_ SG_ "GenSigVtEn" STRING ; +BA_DEF_ SG_ "GenSigSNA" STRING ; +BA_DEF_ SG_ "GenSigCmt" STRING ; +BA_DEF_ BO_ "GenMsgCmt" STRING ; +BA_DEF_ SG_ "GenSigSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType"; +BA_DEF_ SG_ "GenSigInactiveValue" INT 0 100000; +BA_DEF_ SG_ "GenSigMissingSourceValue" INT 0 1e+09; +BA_DEF_ SG_ "WakeupSignal" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes"; +BA_DEF_ SG_ "GenSigStartValue" INT 0 1e+09; +BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes"; +BA_DEF_ BO_ "NetworkInitializationCommand" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "GenMsgSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType"; +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 100000; +BA_DEF_ BO_ "GenMsgDelayTime" INT 0 1000; +BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100; +BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 10000; +BA_DEF_ BO_ "NetworkInitialization" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes"; +BA_DEF_ BO_ "MessageGateway" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes"; +BA_DEF_ BU_ "ILUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BU_ "NetworkInitializationUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BU_ "PowerType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes","Switched","Latched","Sleep","vector_leerstring","vector_leerstring"; +BA_DEF_ BU_ "NodeStartUpTime" INT 0 10000; +BA_DEF_ BU_ "NodeWakeUpTime" INT 0 10000; +BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ; +BA_DEF_ BO_ "GenMsgForegroundColor" STRING ; +BA_ "GenMsgCycleTime" BO_ 34 1000; +BA_ "GenMsgSendType" BO_ 34 0; +BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck"; +BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck"; +BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg"; +BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg"; +BA_ "GenSigVtEn" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure"; +BA_ "GenSigVtName" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure"; +BA_ "GenSigVtEn" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError"; +BA_ "GenSigVtName" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError"; +BA_ "GenSigVtEn" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError"; +BA_ "GenSigVtName" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError"; +BA_ "GenMsgCycleTime" BO_ 33 1000; +BA_ "GenMsgSendType" BO_ 33 0; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4"; +BA_ "GenSigVtEn" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault"; +BA_ "GenSigVtName" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault"; +BA_ "GenSigVtEn" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault"; +BA_ "GenSigVtName" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault"; +BA_ "GenSigVtEn" SG_ 33 HostToArmChksumFault "HostToArmChksumFault"; +BA_ "GenSigVtName" SG_ 33 HostToArmChksumFault "HostToArmChksumFault"; +BA_ "GenSigVtEn" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault"; +BA_ "GenSigVtName" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault"; +BA_ "GenSigVtEn" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange"; +BA_ "GenSigVtName" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 DSPOverrunFault "DSPOverrunFault"; +BA_ "GenSigVtName" SG_ 33 DSPOverrunFault "DSPOverrunFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5"; +BA_ "GenSigVtEn" SG_ 33 TuningSensitivityFault "TuningSensitivityFault"; +BA_ "GenSigVtName" SG_ 33 TuningSensitivityFault "TuningSensitivityFault"; +BA_ "GenSigVtEn" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault"; +BA_ "GenSigVtName" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault"; +BA_ "GenSigVtEn" SG_ 33 LocalOscPowerFault "LocalOscPowerFault"; +BA_ "GenSigVtName" SG_ 33 LocalOscPowerFault "LocalOscPowerFault"; +BA_ "GenSigVtEn" SG_ 33 TransmitterPowerFault "TransmitterPowerFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterPowerFault "TransmitterPowerFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6"; +BA_ "GenSigVtEn" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault"; +BA_ "GenSigVtName" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault"; +BA_ "GenSigVtEn" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault"; +BA_ "GenSigVtName" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault"; +BA_ "GenSigVtEn" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault"; +BA_ "GenSigVtName" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault"; +BA_ "GenSigVtEn" SG_ 33 SidelobeBlockage "SidelobeBlockage"; +BA_ "GenSigVtName" SG_ 33 SidelobeBlockage "SidelobeBlockage"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1"; +BA_ "GenSigVtEn" SG_ 33 MNRBlocked "MNRBlocked"; +BA_ "GenSigVtName" SG_ 33 MNRBlocked "MNRBlocked"; +BA_ "GenSigVtEn" SG_ 33 ECUTempHighFault "ECUTempHighFault"; +BA_ "GenSigVtName" SG_ 33 ECUTempHighFault "ECUTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault"; +BA_ "GenSigVtName" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault"; +BA_ "GenSigVtEn" SG_ 33 UnreasonableRadarData "UnreasonableRadarData"; +BA_ "GenSigVtName" SG_ 33 UnreasonableRadarData "UnreasonableRadarData"; +BA_ "GenSigVtEn" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault"; +BA_ "GenSigVtName" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange"; +BA_ "GenSigVtName" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange"; +BA_ "GenSigVtName" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode"; +BA_ "GenSigVtName" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode"; +BA_ "GenSigVtEn" SG_ 33 BatteryLowFault "BatteryLowFault"; +BA_ "GenSigVtName" SG_ 33 BatteryLowFault "BatteryLowFault"; +BA_ "GenSigVtEn" SG_ 33 BatteryHighFault "BatteryHighFault"; +BA_ "GenSigVtName" SG_ 33 BatteryHighFault "BatteryHighFault"; +BA_ "GenSigVtEn" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4"; +BA_ "GenSigVtEn" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange"; +BA_ "GenSigVtName" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 TransmitterIDFault "TransmitterIDFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterIDFault "TransmitterIDFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2"; +BA_ "GenSigVtEn" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault"; +BA_ "GenSigVtName" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault"; +BA_ "GenSigVtEn" SG_ 33 PCANBusOff "PCANBusOff"; +BA_ "GenSigVtName" SG_ 33 PCANBusOff "PCANBusOff"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6"; +BA_ "GenSigVtEn" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault"; +BA_ "GenSigVtName" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault"; +BA_ "GenSigVtEn" SG_ 33 StackOverflowFault "StackOverflowFault"; +BA_ "GenSigVtName" SG_ 33 StackOverflowFault "StackOverflowFault"; +BA_ "GenSigVtEn" SG_ 33 WatchdogFault "WatchdogFault"; +BA_ "GenSigVtName" SG_ 33 WatchdogFault "WatchdogFault"; +BA_ "GenSigVtEn" SG_ 33 PLLLockFault "PLLLockFault"; +BA_ "GenSigVtName" SG_ 33 PLLLockFault "PLLLockFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1"; +BA_ "GenSigVtEn" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault"; +BA_ "GenSigVtName" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault"; +BA_ "GenSigVtName" SG_ 33 USCValidationFault "USCValidationFault"; +BA_ "GenSigVtEn" SG_ 33 USCValidationFault "USCValidationFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3"; +BA_ "GenSigVtEn" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault"; +BA_ "GenSigVtName" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault"; +BA_ "GenSigVtEn" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum"; +BA_ "GenSigVtName" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum"; +BA_ "GenSigVtEn" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault"; +BA_ "GenSigVtName" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault"; +BA_ "GenMsgNrOfRepetition" BO_ 500 0; +BA_ "GenMsgSendType" BO_ 500 1; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte7 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte7 "MRR_xcp_daq_resp_byte7"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte6 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte6 "MRR_xcp_daq_resp_byte6"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte5 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte5 "MRR_xcp_daq_resp_byte5"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte4 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte4 "MRR_xcp_daq_resp_byte4"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte3 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte3 "MRR_xcp_daq_resp_byte3"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte2 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte2 "MRR_xcp_daq_resp_byte2"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte1 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte1 "MRR_xcp_daq_resp_byte1"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte0 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte0 "MRR_xcp_daq_resp_byte0"; +BA_ "GenMsgNrOfRepetition" BO_ 499 0; +BA_ "GenMsgSendType" BO_ 499 1; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte7 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte7 "MRR_xcp_dto_resp_byte7"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte6 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte6 "MRR_xcp_dto_resp_byte6"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte5 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte5 "MRR_xcp_dto_resp_byte5"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte4 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte4 "MRR_xcp_dto_resp_byte4"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte3 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte3 "MRR_xcp_dto_resp_byte3"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte2 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte2 "MRR_xcp_dto_resp_byte2"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte1 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte1 "MRR_xcp_dto_resp_byte1"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte0 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte0 "MRR_xcp_dto_resp_byte0"; +BA_ "GenMsgNrOfRepetition" BO_ 497 0; +BA_ "GenMsgSendType" BO_ 497 1; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte7 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte7 "MRR_xcp_cto_resp_byte7"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte6 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte6 "MRR_xcp_cto_resp_byte6"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte5 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte5 "MRR_xcp_cto_resp_byte5"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte4 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte4 "MRR_xcp_cto_resp_byte4"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte3 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte3 "MRR_xcp_cto_resp_byte3"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte2 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte2 "MRR_xcp_cto_resp_byte2"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte1 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte1 "MRR_xcp_cto_resp_byte1"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte0 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte0 "MRR_xcp_cto_resp_byte0"; +BA_ "GenMsgSendType" BO_ 1900 1; +BA_ "GenMsgNrOfRepetition" BO_ 1900 0; +BA_ "DiagResponse" BO_ 1900 1; +BA_ "GenSigCmt" SG_ 1900 TesterPhysicalResCCM "TesterPhysicalResCCM"; +BA_ "GenSigSendType" SG_ 1900 TesterPhysicalResCCM 0; +BA_ "GenMsgSendType" BO_ 261 0; +BA_ "GenMsgCycleTime" BO_ 261 1000; +BA_ "GenMsgNrOfRepetition" BO_ 261 0; +BA_ "GenSigCmt" SG_ 261 CAN_SEQUENCE_NUMBER "CAN_SEQUENCE_NUMBER"; +BA_ "GenSigCmt" SG_ 261 CAN_SERIAL_NUMBER "CAN_SERIAL_NUMBER"; +BA_ "GenSigSendType" SG_ 261 CAN_SERIAL_NUMBER 0; +BA_ "GenMsgSendType" BO_ 264 1; +BA_ "GenMsgNrOfRepetition" BO_ 264 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Field_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Promote_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Field_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Promote_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Release_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Release_Revision 0; +BA_ "GenMsgSendType" BO_ 373 1; +BA_ "NetworkInitialization" BO_ 373 0; +BA_ "GenMsgNrOfRepetition" BO_ 373 0; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_POLARITY 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_POLARITY "CAN_SENSOR_POLARITY"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LAT_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LAT_OFFSET "CAN_SENSOR_LAT_OFFSET"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LONG_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LONG_OFFSET "CAN_SENSOR_LONG_OFFSET"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_HANGLE_OFFSET "CAN_SENSOR_HANGLE_OFFSET"; +BA_ "GenSigStartValue" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0; +BA_ "GenMsgSendType" BO_ 372 1; +BA_ "NetworkInitialization" BO_ 372 0; +BA_ "GenMsgNrOfRepetition" BO_ 372 0; +BA_ "GenSigSendType" SG_ 372 CAN_SENSOR_FOV_HOR 0; +BA_ "GenSigCmt" SG_ 372 CAN_SENSOR_FOV_HOR "CAN_SENSOR_FOV_HOR"; +BA_ "GenSigStartValue" SG_ 372 CAN_SENSOR_FOV_HOR 0; +BA_ "GenSigSendType" SG_ 372 CAN_DOPPLER_COVERAGE 0; +BA_ "GenSigCmt" SG_ 372 CAN_DOPPLER_COVERAGE "CAN_DOPPLER_COVERAGE"; +BA_ "GenSigStartValue" SG_ 372 CAN_DOPPLER_COVERAGE 0; +BA_ "GenSigSendType" SG_ 372 CAN_RANGE_COVERAGE 0; +BA_ "GenSigCmt" SG_ 372 CAN_RANGE_COVERAGE "CAN_RANGE_COVERAGE"; +BA_ "GenMsgSendType" BO_ 371 1; +BA_ "NetworkInitialization" BO_ 371 0; +BA_ "GenMsgNrOfRepetition" BO_ 371 0; +BA_ "GenSigVtEn" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigVtName" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATUS 0; +BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATE 0; +BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0; +BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF "CAN_AUTO_ALIGN_HANGLE_REF"; +BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE "CAN_AUTO_ALIGN_HANGLE"; +BA_ "GenMsgSendType" BO_ 369 1; +BA_ "NetworkInitialization" BO_ 369 0; +BA_ "GenMsgNrOfRepetition" BO_ 369 0; +BA_ "GenSigCmt" SG_ 369 CAN_DET_TIME_SINCE_MEAS "CAN_DET_TIME_SINCE_MEAS"; +BA_ "GenSigSendType" SG_ 369 CAN_DET_TIME_SINCE_MEAS 0; +BA_ "GenSigSendType" SG_ 369 CAN_SENSOR_TIME_STAMP 0; +BA_ "GenSigCmt" SG_ 369 CAN_SENSOR_TIME_STAMP "CAN_SENSOR_TIME_STAMP"; +BA_ "GenMsgSendType" BO_ 368 1; +BA_ "NetworkInitialization" BO_ 368 0; +BA_ "GenMsgNrOfRepetition" BO_ 368 0; +BA_ "GenSigSendType" SG_ 368 CAN_ALIGN_UPDATES_DONE 0; +BA_ "GenSigCmt" SG_ 368 CAN_ALIGN_UPDATES_DONE "CAN_ALIGN_UPDATES_DONE"; +BA_ "GenSigSendType" SG_ 368 CAN_SCAN_INDEX 0; +BA_ "GenSigCmt" SG_ 368 CAN_SCAN_INDEX "CAN_SCAN_INDEX"; +BA_ "GenSigSendType" SG_ 368 CAN_NUMBER_OF_DET 0; +BA_ "GenSigCmt" SG_ 368 CAN_NUMBER_OF_DET "CAN_NUMBER_OF_DET"; +BA_ "GenSigSendType" SG_ 368 CAN_LOOK_ID 0; +BA_ "GenSigCmt" SG_ 368 CAN_LOOK_ID "CAN_LOOK_ID"; +BA_ "GenSigSendType" SG_ 368 CAN_LOOK_INDEX 0; +BA_ "GenSigCmt" SG_ 368 CAN_LOOK_INDEX "CAN_LOOK_INDEX"; +BA_ "GenMsgSendType" BO_ 265 1; +BA_ "NetworkInitialization" BO_ 265 0; +BA_ "GenMsgNrOfRepetition" BO_ 265 0; +BA_ "GenSigCmt" SG_ 265 CAN_BATT_VOLTS "CAN_BATT_VOLTS"; +BA_ "GenSigCmt" SG_ 265 CAN_1_25_V "CAN_1_25_V"; +BA_ "GenSigCmt" SG_ 265 CAN_5_V "CAN_5_V"; +BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_RAW "CAN_3_3_V_RAW"; +BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_DAC "CAN_3_3_V_DAC"; +BA_ "GenSigSendType" SG_ 265 CAN_MMIC_Temp1 0; +BA_ "GenSigCmt" SG_ 265 CAN_MMIC_Temp1 "CAN_MMIC_Temp1"; +BA_ "GenSigStartValue" SG_ 265 CAN_MMIC_Temp1 0; +BA_ "GenSigSendType" SG_ 265 CAN_Processor_Thermistor 0; +BA_ "GenSigCmt" SG_ 265 CAN_Processor_Thermistor "CAN_Processor_Thermistor"; +BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Thermistor 0; +BA_ "GenSigSendType" SG_ 265 CAN_Processor_Temp1 0; +BA_ "GenSigCmt" SG_ 265 CAN_Processor_Temp1 "CAN_Processor_Temp1"; +BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Temp1 0; +BA_ "GenMsgSendType" BO_ 291 1; +BA_ "GenMsgILSupport" BO_ 291 1; +BA_ "GenMsgNrOfRepetition" BO_ 291 0; +BA_ "GenMsgCycleTime" BO_ 291 0; +BA_ "NetworkInitialization" BO_ 291 0; +BA_ "GenMsgDelayTime" BO_ 291 0; +BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04 "CAN_DET_CONFID_AZIMUTH_04"; +BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04 "CAN_DET_CONFID_AZIMUTH_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04 "CAN_DET_CONFID_AZIMUTH_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04 "CAN_DET_SUPER_RES_TARGET_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04 "CAN_DET_ND_TARGET_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04 "CAN_DET_HOST_VEH_CLUTTER_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04 "CAN_DET_VALID_LEVEL_04"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04 "CAN_DET_AZIMUTH_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04 "CAN_DET_RANGE_04"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04 "CAN_DET_RANGE_RATE_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04 "CAN_DET_AMPLITUDE_04"; +BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04 "CAN_SCAN_INDEX_2LSB_04"; +BA_ "GenMsgSendType" BO_ 351 1; +BA_ "GenMsgILSupport" BO_ 351 1; +BA_ "GenMsgNrOfRepetition" BO_ 351 0; +BA_ "GenMsgCycleTime" BO_ 351 0; +BA_ "NetworkInitialization" BO_ 351 0; +BA_ "GenMsgDelayTime" BO_ 351 0; +BA_ "GenSigVtEn" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigVtName" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 "CAN_DET_SUPER_RES_TARGET_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_ND_TARGET_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_ND_TARGET_64 "CAN_DET_ND_TARGET_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 "CAN_DET_HOST_VEH_CLUTTER_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_VALID_LEVEL_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_VALID_LEVEL_64 "CAN_DET_VALID_LEVEL_64"; +BA_ "GenSigStartValue" SG_ 351 CAN_DET_AZIMUTH_64 0; +BA_ "GenSigSendType" SG_ 351 CAN_DET_AZIMUTH_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_AZIMUTH_64 "CAN_DET_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_64 "CAN_DET_RANGE_64"; +BA_ "GenSigStartValue" SG_ 351 CAN_DET_RANGE_RATE_64 0; +BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_RATE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_RATE_64 "CAN_DET_RANGE_RATE_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_AMPLITUDE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_AMPLITUDE_64 "CAN_DET_AMPLITUDE_64"; +BA_ "GenSigSendType" SG_ 351 CAN_SCAN_INDEX_2LSB_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_SCAN_INDEX_2LSB_64 "CAN_SCAN_INDEX_2LSB_64"; +BA_ "GenMsgSendType" BO_ 350 1; +BA_ "GenMsgILSupport" BO_ 350 1; +BA_ "GenMsgNrOfRepetition" BO_ 350 0; +BA_ "GenMsgCycleTime" BO_ 350 0; +BA_ "NetworkInitialization" BO_ 350 0; +BA_ "GenMsgDelayTime" BO_ 350 0; +BA_ "GenSigVtEn" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigVtName" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 "CAN_DET_SUPER_RES_TARGET_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_ND_TARGET_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_ND_TARGET_63 "CAN_DET_ND_TARGET_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 "CAN_DET_HOST_VEH_CLUTTER_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_VALID_LEVEL_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_VALID_LEVEL_63 "CAN_DET_VALID_LEVEL_63"; +BA_ "GenSigStartValue" SG_ 350 CAN_DET_AZIMUTH_63 0; +BA_ "GenSigSendType" SG_ 350 CAN_DET_AZIMUTH_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_AZIMUTH_63 "CAN_DET_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_63 "CAN_DET_RANGE_63"; +BA_ "GenSigStartValue" SG_ 350 CAN_DET_RANGE_RATE_63 0; +BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_RATE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_RATE_63 "CAN_DET_RANGE_RATE_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_AMPLITUDE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_AMPLITUDE_63 "CAN_DET_AMPLITUDE_63"; +BA_ "GenSigSendType" SG_ 350 CAN_SCAN_INDEX_2LSB_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_SCAN_INDEX_2LSB_63 "CAN_SCAN_INDEX_2LSB_63"; +BA_ "GenMsgSendType" BO_ 349 1; +BA_ "GenMsgILSupport" BO_ 349 1; +BA_ "GenMsgNrOfRepetition" BO_ 349 0; +BA_ "GenMsgCycleTime" BO_ 349 0; +BA_ "NetworkInitialization" BO_ 349 0; +BA_ "GenMsgDelayTime" BO_ 349 0; +BA_ "GenSigVtEn" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigVtName" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 "CAN_DET_SUPER_RES_TARGET_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_ND_TARGET_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_ND_TARGET_62 "CAN_DET_ND_TARGET_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 "CAN_DET_HOST_VEH_CLUTTER_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_VALID_LEVEL_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_VALID_LEVEL_62 "CAN_DET_VALID_LEVEL_62"; +BA_ "GenSigStartValue" SG_ 349 CAN_DET_AZIMUTH_62 0; +BA_ "GenSigSendType" SG_ 349 CAN_DET_AZIMUTH_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_AZIMUTH_62 "CAN_DET_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_62 "CAN_DET_RANGE_62"; +BA_ "GenSigStartValue" SG_ 349 CAN_DET_RANGE_RATE_62 0; +BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_RATE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_RATE_62 "CAN_DET_RANGE_RATE_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_AMPLITUDE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_AMPLITUDE_62 "CAN_DET_AMPLITUDE_62"; +BA_ "GenSigSendType" SG_ 349 CAN_SCAN_INDEX_2LSB_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_SCAN_INDEX_2LSB_62 "CAN_SCAN_INDEX_2LSB_62"; +BA_ "GenMsgSendType" BO_ 348 1; +BA_ "GenMsgILSupport" BO_ 348 1; +BA_ "GenMsgNrOfRepetition" BO_ 348 0; +BA_ "GenMsgCycleTime" BO_ 348 0; +BA_ "NetworkInitialization" BO_ 348 0; +BA_ "GenMsgDelayTime" BO_ 348 0; +BA_ "GenSigVtEn" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigVtName" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 "CAN_DET_SUPER_RES_TARGET_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_ND_TARGET_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_ND_TARGET_61 "CAN_DET_ND_TARGET_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 "CAN_DET_HOST_VEH_CLUTTER_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_VALID_LEVEL_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_VALID_LEVEL_61 "CAN_DET_VALID_LEVEL_61"; +BA_ "GenSigStartValue" SG_ 348 CAN_DET_AZIMUTH_61 0; +BA_ "GenSigSendType" SG_ 348 CAN_DET_AZIMUTH_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_AZIMUTH_61 "CAN_DET_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_61 "CAN_DET_RANGE_61"; +BA_ "GenSigStartValue" SG_ 348 CAN_DET_RANGE_RATE_61 0; +BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_RATE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_RATE_61 "CAN_DET_RANGE_RATE_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_AMPLITUDE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_AMPLITUDE_61 "CAN_DET_AMPLITUDE_61"; +BA_ "GenSigSendType" SG_ 348 CAN_SCAN_INDEX_2LSB_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_SCAN_INDEX_2LSB_61 "CAN_SCAN_INDEX_2LSB_61"; +BA_ "GenMsgSendType" BO_ 347 1; +BA_ "GenMsgILSupport" BO_ 347 1; +BA_ "GenMsgNrOfRepetition" BO_ 347 0; +BA_ "GenMsgCycleTime" BO_ 347 0; +BA_ "NetworkInitialization" BO_ 347 0; +BA_ "GenMsgDelayTime" BO_ 347 0; +BA_ "GenSigVtEn" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigVtName" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 "CAN_DET_SUPER_RES_TARGET_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_ND_TARGET_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_ND_TARGET_60 "CAN_DET_ND_TARGET_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 "CAN_DET_HOST_VEH_CLUTTER_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_VALID_LEVEL_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_VALID_LEVEL_60 "CAN_DET_VALID_LEVEL_60"; +BA_ "GenSigStartValue" SG_ 347 CAN_DET_AZIMUTH_60 0; +BA_ "GenSigSendType" SG_ 347 CAN_DET_AZIMUTH_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_AZIMUTH_60 "CAN_DET_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_60 "CAN_DET_RANGE_60"; +BA_ "GenSigStartValue" SG_ 347 CAN_DET_RANGE_RATE_60 0; +BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_RATE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_RATE_60 "CAN_DET_RANGE_RATE_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_AMPLITUDE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_AMPLITUDE_60 "CAN_DET_AMPLITUDE_60"; +BA_ "GenSigSendType" SG_ 347 CAN_SCAN_INDEX_2LSB_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_SCAN_INDEX_2LSB_60 "CAN_SCAN_INDEX_2LSB_60"; +BA_ "GenMsgSendType" BO_ 346 1; +BA_ "GenMsgILSupport" BO_ 346 1; +BA_ "GenMsgNrOfRepetition" BO_ 346 0; +BA_ "GenMsgCycleTime" BO_ 346 0; +BA_ "NetworkInitialization" BO_ 346 0; +BA_ "GenMsgDelayTime" BO_ 346 0; +BA_ "GenSigVtEn" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigVtName" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 "CAN_DET_SUPER_RES_TARGET_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_ND_TARGET_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_ND_TARGET_59 "CAN_DET_ND_TARGET_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 "CAN_DET_HOST_VEH_CLUTTER_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_VALID_LEVEL_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_VALID_LEVEL_59 "CAN_DET_VALID_LEVEL_59"; +BA_ "GenSigStartValue" SG_ 346 CAN_DET_AZIMUTH_59 0; +BA_ "GenSigSendType" SG_ 346 CAN_DET_AZIMUTH_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_AZIMUTH_59 "CAN_DET_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_59 "CAN_DET_RANGE_59"; +BA_ "GenSigStartValue" SG_ 346 CAN_DET_RANGE_RATE_59 0; +BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_RATE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_RATE_59 "CAN_DET_RANGE_RATE_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_AMPLITUDE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_AMPLITUDE_59 "CAN_DET_AMPLITUDE_59"; +BA_ "GenSigSendType" SG_ 346 CAN_SCAN_INDEX_2LSB_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_SCAN_INDEX_2LSB_59 "CAN_SCAN_INDEX_2LSB_59"; +BA_ "GenMsgSendType" BO_ 345 1; +BA_ "GenMsgILSupport" BO_ 345 1; +BA_ "GenMsgNrOfRepetition" BO_ 345 0; +BA_ "GenMsgCycleTime" BO_ 345 0; +BA_ "NetworkInitialization" BO_ 345 0; +BA_ "GenMsgDelayTime" BO_ 345 0; +BA_ "GenSigVtEn" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigVtName" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 "CAN_DET_SUPER_RES_TARGET_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_ND_TARGET_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_ND_TARGET_58 "CAN_DET_ND_TARGET_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 "CAN_DET_HOST_VEH_CLUTTER_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_VALID_LEVEL_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_VALID_LEVEL_58 "CAN_DET_VALID_LEVEL_58"; +BA_ "GenSigStartValue" SG_ 345 CAN_DET_AZIMUTH_58 0; +BA_ "GenSigSendType" SG_ 345 CAN_DET_AZIMUTH_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_AZIMUTH_58 "CAN_DET_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_58 "CAN_DET_RANGE_58"; +BA_ "GenSigStartValue" SG_ 345 CAN_DET_RANGE_RATE_58 0; +BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_RATE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_RATE_58 "CAN_DET_RANGE_RATE_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_AMPLITUDE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_AMPLITUDE_58 "CAN_DET_AMPLITUDE_58"; +BA_ "GenSigSendType" SG_ 345 CAN_SCAN_INDEX_2LSB_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_SCAN_INDEX_2LSB_58 "CAN_SCAN_INDEX_2LSB_58"; +BA_ "GenMsgSendType" BO_ 344 1; +BA_ "GenMsgILSupport" BO_ 344 1; +BA_ "GenMsgNrOfRepetition" BO_ 344 0; +BA_ "GenMsgCycleTime" BO_ 344 0; +BA_ "NetworkInitialization" BO_ 344 0; +BA_ "GenMsgDelayTime" BO_ 344 0; +BA_ "GenSigVtEn" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigVtName" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 "CAN_DET_SUPER_RES_TARGET_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_ND_TARGET_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_ND_TARGET_57 "CAN_DET_ND_TARGET_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 "CAN_DET_HOST_VEH_CLUTTER_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_VALID_LEVEL_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_VALID_LEVEL_57 "CAN_DET_VALID_LEVEL_57"; +BA_ "GenSigStartValue" SG_ 344 CAN_DET_AZIMUTH_57 0; +BA_ "GenSigSendType" SG_ 344 CAN_DET_AZIMUTH_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_AZIMUTH_57 "CAN_DET_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_57 "CAN_DET_RANGE_57"; +BA_ "GenSigStartValue" SG_ 344 CAN_DET_RANGE_RATE_57 0; +BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_RATE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_RATE_57 "CAN_DET_RANGE_RATE_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_AMPLITUDE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_AMPLITUDE_57 "CAN_DET_AMPLITUDE_57"; +BA_ "GenSigSendType" SG_ 344 CAN_SCAN_INDEX_2LSB_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_SCAN_INDEX_2LSB_57 "CAN_SCAN_INDEX_2LSB_57"; +BA_ "GenMsgSendType" BO_ 343 1; +BA_ "GenMsgILSupport" BO_ 343 1; +BA_ "GenMsgNrOfRepetition" BO_ 343 0; +BA_ "GenMsgCycleTime" BO_ 343 0; +BA_ "NetworkInitialization" BO_ 343 0; +BA_ "GenMsgDelayTime" BO_ 343 0; +BA_ "GenSigVtEn" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigVtName" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 "CAN_DET_SUPER_RES_TARGET_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_ND_TARGET_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_ND_TARGET_56 "CAN_DET_ND_TARGET_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 "CAN_DET_HOST_VEH_CLUTTER_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_VALID_LEVEL_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_VALID_LEVEL_56 "CAN_DET_VALID_LEVEL_56"; +BA_ "GenSigStartValue" SG_ 343 CAN_DET_AZIMUTH_56 0; +BA_ "GenSigSendType" SG_ 343 CAN_DET_AZIMUTH_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_AZIMUTH_56 "CAN_DET_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_56 "CAN_DET_RANGE_56"; +BA_ "GenSigStartValue" SG_ 343 CAN_DET_RANGE_RATE_56 0; +BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_RATE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_RATE_56 "CAN_DET_RANGE_RATE_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_AMPLITUDE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_AMPLITUDE_56 "CAN_DET_AMPLITUDE_56"; +BA_ "GenSigSendType" SG_ 343 CAN_SCAN_INDEX_2LSB_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_SCAN_INDEX_2LSB_56 "CAN_SCAN_INDEX_2LSB_56"; +BA_ "GenMsgSendType" BO_ 342 1; +BA_ "GenMsgILSupport" BO_ 342 1; +BA_ "GenMsgNrOfRepetition" BO_ 342 0; +BA_ "GenMsgCycleTime" BO_ 342 0; +BA_ "NetworkInitialization" BO_ 342 0; +BA_ "GenMsgDelayTime" BO_ 342 0; +BA_ "GenSigVtEn" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigVtName" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 "CAN_DET_SUPER_RES_TARGET_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_ND_TARGET_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_ND_TARGET_55 "CAN_DET_ND_TARGET_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 "CAN_DET_HOST_VEH_CLUTTER_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_VALID_LEVEL_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_VALID_LEVEL_55 "CAN_DET_VALID_LEVEL_55"; +BA_ "GenSigStartValue" SG_ 342 CAN_DET_AZIMUTH_55 0; +BA_ "GenSigSendType" SG_ 342 CAN_DET_AZIMUTH_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_AZIMUTH_55 "CAN_DET_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_55 "CAN_DET_RANGE_55"; +BA_ "GenSigStartValue" SG_ 342 CAN_DET_RANGE_RATE_55 0; +BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_RATE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_RATE_55 "CAN_DET_RANGE_RATE_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_AMPLITUDE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_AMPLITUDE_55 "CAN_DET_AMPLITUDE_55"; +BA_ "GenSigSendType" SG_ 342 CAN_SCAN_INDEX_2LSB_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_SCAN_INDEX_2LSB_55 "CAN_SCAN_INDEX_2LSB_55"; +BA_ "GenMsgSendType" BO_ 335 1; +BA_ "GenMsgILSupport" BO_ 335 1; +BA_ "GenMsgNrOfRepetition" BO_ 335 0; +BA_ "GenMsgCycleTime" BO_ 335 0; +BA_ "NetworkInitialization" BO_ 335 0; +BA_ "GenMsgDelayTime" BO_ 335 0; +BA_ "GenSigVtEn" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigVtName" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 "CAN_DET_SUPER_RES_TARGET_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_ND_TARGET_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_ND_TARGET_48 "CAN_DET_ND_TARGET_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 "CAN_DET_HOST_VEH_CLUTTER_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_VALID_LEVEL_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_VALID_LEVEL_48 "CAN_DET_VALID_LEVEL_48"; +BA_ "GenSigStartValue" SG_ 335 CAN_DET_AZIMUTH_48 0; +BA_ "GenSigSendType" SG_ 335 CAN_DET_AZIMUTH_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_AZIMUTH_48 "CAN_DET_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_48 "CAN_DET_RANGE_48"; +BA_ "GenSigStartValue" SG_ 335 CAN_DET_RANGE_RATE_48 0; +BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_RATE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_RATE_48 "CAN_DET_RANGE_RATE_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_AMPLITUDE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_AMPLITUDE_48 "CAN_DET_AMPLITUDE_48"; +BA_ "GenSigSendType" SG_ 335 CAN_SCAN_INDEX_2LSB_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_SCAN_INDEX_2LSB_48 "CAN_SCAN_INDEX_2LSB_48"; +BA_ "GenMsgSendType" BO_ 334 1; +BA_ "GenMsgILSupport" BO_ 334 1; +BA_ "GenMsgNrOfRepetition" BO_ 334 0; +BA_ "GenMsgCycleTime" BO_ 334 0; +BA_ "NetworkInitialization" BO_ 334 0; +BA_ "GenMsgDelayTime" BO_ 334 0; +BA_ "GenSigVtEn" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigVtName" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 "CAN_DET_SUPER_RES_TARGET_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_ND_TARGET_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_ND_TARGET_47 "CAN_DET_ND_TARGET_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 "CAN_DET_HOST_VEH_CLUTTER_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_VALID_LEVEL_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_VALID_LEVEL_47 "CAN_DET_VALID_LEVEL_47"; +BA_ "GenSigStartValue" SG_ 334 CAN_DET_AZIMUTH_47 0; +BA_ "GenSigSendType" SG_ 334 CAN_DET_AZIMUTH_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_AZIMUTH_47 "CAN_DET_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_47 "CAN_DET_RANGE_47"; +BA_ "GenSigStartValue" SG_ 334 CAN_DET_RANGE_RATE_47 0; +BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_RATE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_RATE_47 "CAN_DET_RANGE_RATE_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_AMPLITUDE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_AMPLITUDE_47 "CAN_DET_AMPLITUDE_47"; +BA_ "GenSigSendType" SG_ 334 CAN_SCAN_INDEX_2LSB_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_SCAN_INDEX_2LSB_47 "CAN_SCAN_INDEX_2LSB_47"; +BA_ "GenMsgSendType" BO_ 333 1; +BA_ "GenMsgILSupport" BO_ 333 1; +BA_ "GenMsgNrOfRepetition" BO_ 333 0; +BA_ "GenMsgCycleTime" BO_ 333 0; +BA_ "NetworkInitialization" BO_ 333 0; +BA_ "GenMsgDelayTime" BO_ 333 0; +BA_ "GenSigVtEn" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigVtName" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 "CAN_DET_SUPER_RES_TARGET_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_ND_TARGET_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_ND_TARGET_46 "CAN_DET_ND_TARGET_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 "CAN_DET_HOST_VEH_CLUTTER_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_VALID_LEVEL_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_VALID_LEVEL_46 "CAN_DET_VALID_LEVEL_46"; +BA_ "GenSigStartValue" SG_ 333 CAN_DET_AZIMUTH_46 0; +BA_ "GenSigSendType" SG_ 333 CAN_DET_AZIMUTH_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_AZIMUTH_46 "CAN_DET_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_46 "CAN_DET_RANGE_46"; +BA_ "GenSigStartValue" SG_ 333 CAN_DET_RANGE_RATE_46 0; +BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_RATE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_RATE_46 "CAN_DET_RANGE_RATE_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_AMPLITUDE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_AMPLITUDE_46 "CAN_DET_AMPLITUDE_46"; +BA_ "GenSigSendType" SG_ 333 CAN_SCAN_INDEX_2LSB_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_SCAN_INDEX_2LSB_46 "CAN_SCAN_INDEX_2LSB_46"; +BA_ "GenMsgSendType" BO_ 332 1; +BA_ "GenMsgILSupport" BO_ 332 1; +BA_ "GenMsgNrOfRepetition" BO_ 332 0; +BA_ "GenMsgCycleTime" BO_ 332 0; +BA_ "NetworkInitialization" BO_ 332 0; +BA_ "GenMsgDelayTime" BO_ 332 0; +BA_ "GenSigVtEn" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigVtName" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 "CAN_DET_SUPER_RES_TARGET_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_ND_TARGET_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_ND_TARGET_45 "CAN_DET_ND_TARGET_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 "CAN_DET_HOST_VEH_CLUTTER_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_VALID_LEVEL_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_VALID_LEVEL_45 "CAN_DET_VALID_LEVEL_45"; +BA_ "GenSigStartValue" SG_ 332 CAN_DET_AZIMUTH_45 0; +BA_ "GenSigSendType" SG_ 332 CAN_DET_AZIMUTH_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_AZIMUTH_45 "CAN_DET_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_45 "CAN_DET_RANGE_45"; +BA_ "GenSigStartValue" SG_ 332 CAN_DET_RANGE_RATE_45 0; +BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_RATE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_RATE_45 "CAN_DET_RANGE_RATE_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_AMPLITUDE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_AMPLITUDE_45 "CAN_DET_AMPLITUDE_45"; +BA_ "GenSigSendType" SG_ 332 CAN_SCAN_INDEX_2LSB_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_SCAN_INDEX_2LSB_45 "CAN_SCAN_INDEX_2LSB_45"; +BA_ "GenMsgSendType" BO_ 331 1; +BA_ "GenMsgILSupport" BO_ 331 1; +BA_ "GenMsgNrOfRepetition" BO_ 331 0; +BA_ "GenMsgCycleTime" BO_ 331 0; +BA_ "NetworkInitialization" BO_ 331 0; +BA_ "GenMsgDelayTime" BO_ 331 0; +BA_ "GenSigVtEn" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigVtName" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 "CAN_DET_SUPER_RES_TARGET_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_ND_TARGET_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_ND_TARGET_44 "CAN_DET_ND_TARGET_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 "CAN_DET_HOST_VEH_CLUTTER_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_VALID_LEVEL_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_VALID_LEVEL_44 "CAN_DET_VALID_LEVEL_44"; +BA_ "GenSigStartValue" SG_ 331 CAN_DET_AZIMUTH_44 0; +BA_ "GenSigSendType" SG_ 331 CAN_DET_AZIMUTH_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_AZIMUTH_44 "CAN_DET_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_44 "CAN_DET_RANGE_44"; +BA_ "GenSigStartValue" SG_ 331 CAN_DET_RANGE_RATE_44 0; +BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_RATE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_RATE_44 "CAN_DET_RANGE_RATE_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_AMPLITUDE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_AMPLITUDE_44 "CAN_DET_AMPLITUDE_44"; +BA_ "GenSigSendType" SG_ 331 CAN_SCAN_INDEX_2LSB_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_SCAN_INDEX_2LSB_44 "CAN_SCAN_INDEX_2LSB_44"; +BA_ "GenMsgSendType" BO_ 330 1; +BA_ "GenMsgILSupport" BO_ 330 1; +BA_ "GenMsgNrOfRepetition" BO_ 330 0; +BA_ "GenMsgCycleTime" BO_ 330 0; +BA_ "NetworkInitialization" BO_ 330 0; +BA_ "GenMsgDelayTime" BO_ 330 0; +BA_ "GenSigVtEn" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigVtName" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 "CAN_DET_SUPER_RES_TARGET_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_ND_TARGET_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_ND_TARGET_43 "CAN_DET_ND_TARGET_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 "CAN_DET_HOST_VEH_CLUTTER_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_VALID_LEVEL_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_VALID_LEVEL_43 "CAN_DET_VALID_LEVEL_43"; +BA_ "GenSigStartValue" SG_ 330 CAN_DET_AZIMUTH_43 0; +BA_ "GenSigSendType" SG_ 330 CAN_DET_AZIMUTH_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_AZIMUTH_43 "CAN_DET_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_43 "CAN_DET_RANGE_43"; +BA_ "GenSigStartValue" SG_ 330 CAN_DET_RANGE_RATE_43 0; +BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_RATE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_RATE_43 "CAN_DET_RANGE_RATE_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_AMPLITUDE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_AMPLITUDE_43 "CAN_DET_AMPLITUDE_43"; +BA_ "GenSigSendType" SG_ 330 CAN_SCAN_INDEX_2LSB_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_SCAN_INDEX_2LSB_43 "CAN_SCAN_INDEX_2LSB_43"; +BA_ "GenMsgSendType" BO_ 329 1; +BA_ "GenMsgILSupport" BO_ 329 1; +BA_ "GenMsgNrOfRepetition" BO_ 329 0; +BA_ "GenMsgCycleTime" BO_ 329 0; +BA_ "NetworkInitialization" BO_ 329 0; +BA_ "GenMsgDelayTime" BO_ 329 0; +BA_ "GenSigVtEn" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigVtName" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 "CAN_DET_SUPER_RES_TARGET_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_ND_TARGET_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_ND_TARGET_42 "CAN_DET_ND_TARGET_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 "CAN_DET_HOST_VEH_CLUTTER_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_VALID_LEVEL_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_VALID_LEVEL_42 "CAN_DET_VALID_LEVEL_42"; +BA_ "GenSigStartValue" SG_ 329 CAN_DET_AZIMUTH_42 0; +BA_ "GenSigSendType" SG_ 329 CAN_DET_AZIMUTH_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_AZIMUTH_42 "CAN_DET_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_42 "CAN_DET_RANGE_42"; +BA_ "GenSigStartValue" SG_ 329 CAN_DET_RANGE_RATE_42 0; +BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_RATE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_RATE_42 "CAN_DET_RANGE_RATE_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_AMPLITUDE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_AMPLITUDE_42 "CAN_DET_AMPLITUDE_42"; +BA_ "GenSigSendType" SG_ 329 CAN_SCAN_INDEX_2LSB_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_SCAN_INDEX_2LSB_42 "CAN_SCAN_INDEX_2LSB_42"; +BA_ "GenMsgSendType" BO_ 328 1; +BA_ "GenMsgILSupport" BO_ 328 1; +BA_ "GenMsgNrOfRepetition" BO_ 328 0; +BA_ "GenMsgCycleTime" BO_ 328 0; +BA_ "NetworkInitialization" BO_ 328 0; +BA_ "GenMsgDelayTime" BO_ 328 0; +BA_ "GenSigVtEn" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigVtName" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 "CAN_DET_SUPER_RES_TARGET_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_ND_TARGET_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_ND_TARGET_41 "CAN_DET_ND_TARGET_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 "CAN_DET_HOST_VEH_CLUTTER_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_VALID_LEVEL_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_VALID_LEVEL_41 "CAN_DET_VALID_LEVEL_41"; +BA_ "GenSigStartValue" SG_ 328 CAN_DET_AZIMUTH_41 0; +BA_ "GenSigSendType" SG_ 328 CAN_DET_AZIMUTH_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_AZIMUTH_41 "CAN_DET_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_41 "CAN_DET_RANGE_41"; +BA_ "GenSigStartValue" SG_ 328 CAN_DET_RANGE_RATE_41 0; +BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_RATE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_RATE_41 "CAN_DET_RANGE_RATE_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_AMPLITUDE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_AMPLITUDE_41 "CAN_DET_AMPLITUDE_41"; +BA_ "GenSigSendType" SG_ 328 CAN_SCAN_INDEX_2LSB_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_SCAN_INDEX_2LSB_41 "CAN_SCAN_INDEX_2LSB_41"; +BA_ "GenMsgSendType" BO_ 327 1; +BA_ "GenMsgILSupport" BO_ 327 1; +BA_ "GenMsgNrOfRepetition" BO_ 327 0; +BA_ "GenMsgCycleTime" BO_ 327 0; +BA_ "NetworkInitialization" BO_ 327 0; +BA_ "GenMsgDelayTime" BO_ 327 0; +BA_ "GenSigVtEn" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigVtName" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 "CAN_DET_SUPER_RES_TARGET_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_ND_TARGET_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_ND_TARGET_40 "CAN_DET_ND_TARGET_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 "CAN_DET_HOST_VEH_CLUTTER_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_VALID_LEVEL_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_VALID_LEVEL_40 "CAN_DET_VALID_LEVEL_40"; +BA_ "GenSigStartValue" SG_ 327 CAN_DET_AZIMUTH_40 0; +BA_ "GenSigSendType" SG_ 327 CAN_DET_AZIMUTH_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_AZIMUTH_40 "CAN_DET_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_40 "CAN_DET_RANGE_40"; +BA_ "GenSigStartValue" SG_ 327 CAN_DET_RANGE_RATE_40 0; +BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_RATE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_RATE_40 "CAN_DET_RANGE_RATE_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_AMPLITUDE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_AMPLITUDE_40 "CAN_DET_AMPLITUDE_40"; +BA_ "GenSigSendType" SG_ 327 CAN_SCAN_INDEX_2LSB_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_SCAN_INDEX_2LSB_40 "CAN_SCAN_INDEX_2LSB_40"; +BA_ "GenMsgSendType" BO_ 325 1; +BA_ "GenMsgILSupport" BO_ 325 1; +BA_ "GenMsgNrOfRepetition" BO_ 325 0; +BA_ "GenMsgCycleTime" BO_ 325 0; +BA_ "NetworkInitialization" BO_ 325 0; +BA_ "GenMsgDelayTime" BO_ 325 0; +BA_ "GenSigVtEn" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigVtName" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 "CAN_DET_SUPER_RES_TARGET_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_ND_TARGET_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_ND_TARGET_38 "CAN_DET_ND_TARGET_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 "CAN_DET_HOST_VEH_CLUTTER_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_VALID_LEVEL_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_VALID_LEVEL_38 "CAN_DET_VALID_LEVEL_38"; +BA_ "GenSigStartValue" SG_ 325 CAN_DET_AZIMUTH_38 0; +BA_ "GenSigSendType" SG_ 325 CAN_DET_AZIMUTH_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_AZIMUTH_38 "CAN_DET_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_38 "CAN_DET_RANGE_38"; +BA_ "GenSigStartValue" SG_ 325 CAN_DET_RANGE_RATE_38 0; +BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_RATE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_RATE_38 "CAN_DET_RANGE_RATE_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_AMPLITUDE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_AMPLITUDE_38 "CAN_DET_AMPLITUDE_38"; +BA_ "GenSigSendType" SG_ 325 CAN_SCAN_INDEX_2LSB_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_SCAN_INDEX_2LSB_38 "CAN_SCAN_INDEX_2LSB_38"; +BA_ "GenMsgSendType" BO_ 324 1; +BA_ "GenMsgILSupport" BO_ 324 1; +BA_ "GenMsgNrOfRepetition" BO_ 324 0; +BA_ "GenMsgCycleTime" BO_ 324 0; +BA_ "NetworkInitialization" BO_ 324 0; +BA_ "GenMsgDelayTime" BO_ 324 0; +BA_ "GenSigVtEn" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigVtName" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 "CAN_DET_SUPER_RES_TARGET_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_ND_TARGET_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_ND_TARGET_37 "CAN_DET_ND_TARGET_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 "CAN_DET_HOST_VEH_CLUTTER_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_VALID_LEVEL_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_VALID_LEVEL_37 "CAN_DET_VALID_LEVEL_37"; +BA_ "GenSigStartValue" SG_ 324 CAN_DET_AZIMUTH_37 0; +BA_ "GenSigSendType" SG_ 324 CAN_DET_AZIMUTH_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_AZIMUTH_37 "CAN_DET_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_37 "CAN_DET_RANGE_37"; +BA_ "GenSigStartValue" SG_ 324 CAN_DET_RANGE_RATE_37 0; +BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_RATE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_RATE_37 "CAN_DET_RANGE_RATE_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_AMPLITUDE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_AMPLITUDE_37 "CAN_DET_AMPLITUDE_37"; +BA_ "GenSigSendType" SG_ 324 CAN_SCAN_INDEX_2LSB_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_SCAN_INDEX_2LSB_37 "CAN_SCAN_INDEX_2LSB_37"; +BA_ "GenMsgSendType" BO_ 323 1; +BA_ "GenMsgILSupport" BO_ 323 1; +BA_ "GenMsgNrOfRepetition" BO_ 323 0; +BA_ "GenMsgCycleTime" BO_ 323 0; +BA_ "NetworkInitialization" BO_ 323 0; +BA_ "GenMsgDelayTime" BO_ 323 0; +BA_ "GenSigVtEn" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigVtName" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 "CAN_DET_SUPER_RES_TARGET_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_ND_TARGET_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_ND_TARGET_36 "CAN_DET_ND_TARGET_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 "CAN_DET_HOST_VEH_CLUTTER_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_VALID_LEVEL_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_VALID_LEVEL_36 "CAN_DET_VALID_LEVEL_36"; +BA_ "GenSigStartValue" SG_ 323 CAN_DET_AZIMUTH_36 0; +BA_ "GenSigSendType" SG_ 323 CAN_DET_AZIMUTH_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_AZIMUTH_36 "CAN_DET_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_36 "CAN_DET_RANGE_36"; +BA_ "GenSigStartValue" SG_ 323 CAN_DET_RANGE_RATE_36 0; +BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_RATE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_RATE_36 "CAN_DET_RANGE_RATE_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_AMPLITUDE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_AMPLITUDE_36 "CAN_DET_AMPLITUDE_36"; +BA_ "GenSigSendType" SG_ 323 CAN_SCAN_INDEX_2LSB_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_SCAN_INDEX_2LSB_36 "CAN_SCAN_INDEX_2LSB_36"; +BA_ "GenMsgSendType" BO_ 322 1; +BA_ "GenMsgILSupport" BO_ 322 1; +BA_ "GenMsgNrOfRepetition" BO_ 322 0; +BA_ "GenMsgCycleTime" BO_ 322 0; +BA_ "NetworkInitialization" BO_ 322 0; +BA_ "GenMsgDelayTime" BO_ 322 0; +BA_ "GenSigVtEn" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigVtName" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 "CAN_DET_SUPER_RES_TARGET_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_ND_TARGET_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_ND_TARGET_35 "CAN_DET_ND_TARGET_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 "CAN_DET_HOST_VEH_CLUTTER_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_VALID_LEVEL_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_VALID_LEVEL_35 "CAN_DET_VALID_LEVEL_35"; +BA_ "GenSigStartValue" SG_ 322 CAN_DET_AZIMUTH_35 0; +BA_ "GenSigSendType" SG_ 322 CAN_DET_AZIMUTH_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_AZIMUTH_35 "CAN_DET_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_35 "CAN_DET_RANGE_35"; +BA_ "GenSigStartValue" SG_ 322 CAN_DET_RANGE_RATE_35 0; +BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_RATE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_RATE_35 "CAN_DET_RANGE_RATE_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_AMPLITUDE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_AMPLITUDE_35 "CAN_DET_AMPLITUDE_35"; +BA_ "GenSigSendType" SG_ 322 CAN_SCAN_INDEX_2LSB_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_SCAN_INDEX_2LSB_35 "CAN_SCAN_INDEX_2LSB_35"; +BA_ "GenMsgSendType" BO_ 321 1; +BA_ "GenMsgILSupport" BO_ 321 1; +BA_ "GenMsgNrOfRepetition" BO_ 321 0; +BA_ "GenMsgCycleTime" BO_ 321 0; +BA_ "NetworkInitialization" BO_ 321 0; +BA_ "GenMsgDelayTime" BO_ 321 0; +BA_ "GenSigVtEn" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigVtName" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 "CAN_DET_SUPER_RES_TARGET_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_ND_TARGET_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_ND_TARGET_34 "CAN_DET_ND_TARGET_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 "CAN_DET_HOST_VEH_CLUTTER_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_VALID_LEVEL_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_VALID_LEVEL_34 "CAN_DET_VALID_LEVEL_34"; +BA_ "GenSigStartValue" SG_ 321 CAN_DET_AZIMUTH_34 0; +BA_ "GenSigSendType" SG_ 321 CAN_DET_AZIMUTH_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_AZIMUTH_34 "CAN_DET_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_34 "CAN_DET_RANGE_34"; +BA_ "GenSigStartValue" SG_ 321 CAN_DET_RANGE_RATE_34 0; +BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_RATE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_RATE_34 "CAN_DET_RANGE_RATE_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_AMPLITUDE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_AMPLITUDE_34 "CAN_DET_AMPLITUDE_34"; +BA_ "GenSigSendType" SG_ 321 CAN_SCAN_INDEX_2LSB_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_SCAN_INDEX_2LSB_34 "CAN_SCAN_INDEX_2LSB_34"; +BA_ "GenMsgSendType" BO_ 320 1; +BA_ "GenMsgILSupport" BO_ 320 1; +BA_ "GenMsgNrOfRepetition" BO_ 320 0; +BA_ "GenMsgCycleTime" BO_ 320 0; +BA_ "NetworkInitialization" BO_ 320 0; +BA_ "GenMsgDelayTime" BO_ 320 0; +BA_ "GenSigVtEn" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigVtName" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 "CAN_DET_SUPER_RES_TARGET_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_ND_TARGET_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_ND_TARGET_33 "CAN_DET_ND_TARGET_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 "CAN_DET_HOST_VEH_CLUTTER_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_VALID_LEVEL_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_VALID_LEVEL_33 "CAN_DET_VALID_LEVEL_33"; +BA_ "GenSigStartValue" SG_ 320 CAN_DET_AZIMUTH_33 0; +BA_ "GenSigSendType" SG_ 320 CAN_DET_AZIMUTH_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_AZIMUTH_33 "CAN_DET_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_33 "CAN_DET_RANGE_33"; +BA_ "GenSigStartValue" SG_ 320 CAN_DET_RANGE_RATE_33 0; +BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_RATE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_RATE_33 "CAN_DET_RANGE_RATE_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_AMPLITUDE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_AMPLITUDE_33 "CAN_DET_AMPLITUDE_33"; +BA_ "GenSigSendType" SG_ 320 CAN_SCAN_INDEX_2LSB_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_SCAN_INDEX_2LSB_33 "CAN_SCAN_INDEX_2LSB_33"; +BA_ "GenMsgSendType" BO_ 319 1; +BA_ "GenMsgILSupport" BO_ 319 1; +BA_ "GenMsgNrOfRepetition" BO_ 319 0; +BA_ "GenMsgCycleTime" BO_ 319 0; +BA_ "NetworkInitialization" BO_ 319 0; +BA_ "GenMsgDelayTime" BO_ 319 0; +BA_ "GenSigVtEn" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigVtName" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 "CAN_DET_SUPER_RES_TARGET_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_ND_TARGET_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_ND_TARGET_32 "CAN_DET_ND_TARGET_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 "CAN_DET_HOST_VEH_CLUTTER_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_VALID_LEVEL_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_VALID_LEVEL_32 "CAN_DET_VALID_LEVEL_32"; +BA_ "GenSigStartValue" SG_ 319 CAN_DET_AZIMUTH_32 0; +BA_ "GenSigSendType" SG_ 319 CAN_DET_AZIMUTH_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_AZIMUTH_32 "CAN_DET_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_32 "CAN_DET_RANGE_32"; +BA_ "GenSigStartValue" SG_ 319 CAN_DET_RANGE_RATE_32 0; +BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_RATE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_RATE_32 "CAN_DET_RANGE_RATE_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_AMPLITUDE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_AMPLITUDE_32 "CAN_DET_AMPLITUDE_32"; +BA_ "GenSigSendType" SG_ 319 CAN_SCAN_INDEX_2LSB_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_SCAN_INDEX_2LSB_32 "CAN_SCAN_INDEX_2LSB_32"; +BA_ "GenMsgSendType" BO_ 318 1; +BA_ "GenMsgILSupport" BO_ 318 1; +BA_ "GenMsgNrOfRepetition" BO_ 318 0; +BA_ "GenMsgCycleTime" BO_ 318 0; +BA_ "NetworkInitialization" BO_ 318 0; +BA_ "GenMsgDelayTime" BO_ 318 0; +BA_ "GenSigVtEn" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigVtName" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 "CAN_DET_SUPER_RES_TARGET_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_ND_TARGET_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_ND_TARGET_31 "CAN_DET_ND_TARGET_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 "CAN_DET_HOST_VEH_CLUTTER_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_VALID_LEVEL_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_VALID_LEVEL_31 "CAN_DET_VALID_LEVEL_31"; +BA_ "GenSigStartValue" SG_ 318 CAN_DET_AZIMUTH_31 0; +BA_ "GenSigSendType" SG_ 318 CAN_DET_AZIMUTH_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_AZIMUTH_31 "CAN_DET_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_31 "CAN_DET_RANGE_31"; +BA_ "GenSigStartValue" SG_ 318 CAN_DET_RANGE_RATE_31 0; +BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_RATE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_RATE_31 "CAN_DET_RANGE_RATE_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_AMPLITUDE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_AMPLITUDE_31 "CAN_DET_AMPLITUDE_31"; +BA_ "GenSigSendType" SG_ 318 CAN_SCAN_INDEX_2LSB_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_SCAN_INDEX_2LSB_31 "CAN_SCAN_INDEX_2LSB_31"; +BA_ "GenMsgSendType" BO_ 317 1; +BA_ "GenMsgILSupport" BO_ 317 1; +BA_ "GenMsgNrOfRepetition" BO_ 317 0; +BA_ "GenMsgCycleTime" BO_ 317 0; +BA_ "NetworkInitialization" BO_ 317 0; +BA_ "GenMsgDelayTime" BO_ 317 0; +BA_ "GenSigVtEn" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigVtName" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 "CAN_DET_SUPER_RES_TARGET_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_ND_TARGET_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_ND_TARGET_30 "CAN_DET_ND_TARGET_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 "CAN_DET_HOST_VEH_CLUTTER_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_VALID_LEVEL_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_VALID_LEVEL_30 "CAN_DET_VALID_LEVEL_30"; +BA_ "GenSigStartValue" SG_ 317 CAN_DET_AZIMUTH_30 0; +BA_ "GenSigSendType" SG_ 317 CAN_DET_AZIMUTH_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_AZIMUTH_30 "CAN_DET_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_30 "CAN_DET_RANGE_30"; +BA_ "GenSigStartValue" SG_ 317 CAN_DET_RANGE_RATE_30 0; +BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_RATE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_RATE_30 "CAN_DET_RANGE_RATE_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_AMPLITUDE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_AMPLITUDE_30 "CAN_DET_AMPLITUDE_30"; +BA_ "GenSigSendType" SG_ 317 CAN_SCAN_INDEX_2LSB_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_SCAN_INDEX_2LSB_30 "CAN_SCAN_INDEX_2LSB_30"; +BA_ "GenMsgSendType" BO_ 316 1; +BA_ "GenMsgILSupport" BO_ 316 1; +BA_ "GenMsgNrOfRepetition" BO_ 316 0; +BA_ "GenMsgCycleTime" BO_ 316 0; +BA_ "NetworkInitialization" BO_ 316 0; +BA_ "GenMsgDelayTime" BO_ 316 0; +BA_ "GenSigVtEn" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigVtName" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 "CAN_DET_SUPER_RES_TARGET_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_ND_TARGET_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_ND_TARGET_29 "CAN_DET_ND_TARGET_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 "CAN_DET_HOST_VEH_CLUTTER_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_VALID_LEVEL_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_VALID_LEVEL_29 "CAN_DET_VALID_LEVEL_29"; +BA_ "GenSigStartValue" SG_ 316 CAN_DET_AZIMUTH_29 0; +BA_ "GenSigSendType" SG_ 316 CAN_DET_AZIMUTH_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_AZIMUTH_29 "CAN_DET_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_29 "CAN_DET_RANGE_29"; +BA_ "GenSigStartValue" SG_ 316 CAN_DET_RANGE_RATE_29 0; +BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_RATE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_RATE_29 "CAN_DET_RANGE_RATE_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_AMPLITUDE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_AMPLITUDE_29 "CAN_DET_AMPLITUDE_29"; +BA_ "GenSigSendType" SG_ 316 CAN_SCAN_INDEX_2LSB_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_SCAN_INDEX_2LSB_29 "CAN_SCAN_INDEX_2LSB_29"; +BA_ "GenMsgSendType" BO_ 314 1; +BA_ "GenMsgILSupport" BO_ 314 1; +BA_ "GenMsgNrOfRepetition" BO_ 314 0; +BA_ "GenMsgCycleTime" BO_ 314 0; +BA_ "NetworkInitialization" BO_ 314 0; +BA_ "GenMsgDelayTime" BO_ 314 0; +BA_ "GenSigVtEn" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigVtName" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 "CAN_DET_SUPER_RES_TARGET_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_ND_TARGET_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_ND_TARGET_27 "CAN_DET_ND_TARGET_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 "CAN_DET_HOST_VEH_CLUTTER_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_VALID_LEVEL_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_VALID_LEVEL_27 "CAN_DET_VALID_LEVEL_27"; +BA_ "GenSigStartValue" SG_ 314 CAN_DET_AZIMUTH_27 0; +BA_ "GenSigSendType" SG_ 314 CAN_DET_AZIMUTH_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_AZIMUTH_27 "CAN_DET_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_27 "CAN_DET_RANGE_27"; +BA_ "GenSigStartValue" SG_ 314 CAN_DET_RANGE_RATE_27 0; +BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_RATE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_RATE_27 "CAN_DET_RANGE_RATE_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_AMPLITUDE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_AMPLITUDE_27 "CAN_DET_AMPLITUDE_27"; +BA_ "GenSigSendType" SG_ 314 CAN_SCAN_INDEX_2LSB_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_SCAN_INDEX_2LSB_27 "CAN_SCAN_INDEX_2LSB_27"; +BA_ "GenMsgSendType" BO_ 313 1; +BA_ "GenMsgILSupport" BO_ 313 1; +BA_ "GenMsgNrOfRepetition" BO_ 313 0; +BA_ "GenMsgCycleTime" BO_ 313 0; +BA_ "NetworkInitialization" BO_ 313 0; +BA_ "GenMsgDelayTime" BO_ 313 0; +BA_ "GenSigVtEn" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigVtName" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 "CAN_DET_SUPER_RES_TARGET_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_ND_TARGET_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_ND_TARGET_26 "CAN_DET_ND_TARGET_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 "CAN_DET_HOST_VEH_CLUTTER_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_VALID_LEVEL_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_VALID_LEVEL_26 "CAN_DET_VALID_LEVEL_26"; +BA_ "GenSigStartValue" SG_ 313 CAN_DET_AZIMUTH_26 0; +BA_ "GenSigSendType" SG_ 313 CAN_DET_AZIMUTH_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_AZIMUTH_26 "CAN_DET_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_26 "CAN_DET_RANGE_26"; +BA_ "GenSigStartValue" SG_ 313 CAN_DET_RANGE_RATE_26 0; +BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_RATE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_RATE_26 "CAN_DET_RANGE_RATE_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_AMPLITUDE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_AMPLITUDE_26 "CAN_DET_AMPLITUDE_26"; +BA_ "GenSigSendType" SG_ 313 CAN_SCAN_INDEX_2LSB_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_SCAN_INDEX_2LSB_26 "CAN_SCAN_INDEX_2LSB_26"; +BA_ "GenMsgSendType" BO_ 312 1; +BA_ "GenMsgILSupport" BO_ 312 1; +BA_ "GenMsgNrOfRepetition" BO_ 312 0; +BA_ "GenMsgCycleTime" BO_ 312 0; +BA_ "NetworkInitialization" BO_ 312 0; +BA_ "GenMsgDelayTime" BO_ 312 0; +BA_ "GenSigVtEn" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigVtName" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 "CAN_DET_SUPER_RES_TARGET_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_ND_TARGET_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_ND_TARGET_25 "CAN_DET_ND_TARGET_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 "CAN_DET_HOST_VEH_CLUTTER_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_VALID_LEVEL_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_VALID_LEVEL_25 "CAN_DET_VALID_LEVEL_25"; +BA_ "GenSigStartValue" SG_ 312 CAN_DET_AZIMUTH_25 0; +BA_ "GenSigSendType" SG_ 312 CAN_DET_AZIMUTH_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_AZIMUTH_25 "CAN_DET_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_25 "CAN_DET_RANGE_25"; +BA_ "GenSigStartValue" SG_ 312 CAN_DET_RANGE_RATE_25 0; +BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_RATE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_RATE_25 "CAN_DET_RANGE_RATE_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_AMPLITUDE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_AMPLITUDE_25 "CAN_DET_AMPLITUDE_25"; +BA_ "GenSigSendType" SG_ 312 CAN_SCAN_INDEX_2LSB_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_SCAN_INDEX_2LSB_25 "CAN_SCAN_INDEX_2LSB_25"; +BA_ "GenMsgSendType" BO_ 311 1; +BA_ "GenMsgILSupport" BO_ 311 1; +BA_ "GenMsgNrOfRepetition" BO_ 311 0; +BA_ "GenMsgCycleTime" BO_ 311 0; +BA_ "NetworkInitialization" BO_ 311 0; +BA_ "GenMsgDelayTime" BO_ 311 0; +BA_ "GenSigVtEn" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigVtName" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 "CAN_DET_SUPER_RES_TARGET_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_ND_TARGET_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_ND_TARGET_24 "CAN_DET_ND_TARGET_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 "CAN_DET_HOST_VEH_CLUTTER_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_VALID_LEVEL_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_VALID_LEVEL_24 "CAN_DET_VALID_LEVEL_24"; +BA_ "GenSigStartValue" SG_ 311 CAN_DET_AZIMUTH_24 0; +BA_ "GenSigSendType" SG_ 311 CAN_DET_AZIMUTH_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_AZIMUTH_24 "CAN_DET_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_24 "CAN_DET_RANGE_24"; +BA_ "GenSigStartValue" SG_ 311 CAN_DET_RANGE_RATE_24 0; +BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_RATE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_RATE_24 "CAN_DET_RANGE_RATE_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_AMPLITUDE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_AMPLITUDE_24 "CAN_DET_AMPLITUDE_24"; +BA_ "GenSigSendType" SG_ 311 CAN_SCAN_INDEX_2LSB_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_SCAN_INDEX_2LSB_24 "CAN_SCAN_INDEX_2LSB_24"; +BA_ "GenMsgSendType" BO_ 310 1; +BA_ "GenMsgILSupport" BO_ 310 1; +BA_ "GenMsgNrOfRepetition" BO_ 310 0; +BA_ "GenMsgCycleTime" BO_ 310 0; +BA_ "NetworkInitialization" BO_ 310 0; +BA_ "GenMsgDelayTime" BO_ 310 0; +BA_ "GenSigVtEn" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigVtName" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 "CAN_DET_SUPER_RES_TARGET_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_ND_TARGET_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_ND_TARGET_23 "CAN_DET_ND_TARGET_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 "CAN_DET_HOST_VEH_CLUTTER_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_VALID_LEVEL_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_VALID_LEVEL_23 "CAN_DET_VALID_LEVEL_23"; +BA_ "GenSigStartValue" SG_ 310 CAN_DET_AZIMUTH_23 0; +BA_ "GenSigSendType" SG_ 310 CAN_DET_AZIMUTH_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_AZIMUTH_23 "CAN_DET_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_23 "CAN_DET_RANGE_23"; +BA_ "GenSigStartValue" SG_ 310 CAN_DET_RANGE_RATE_23 0; +BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_RATE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_RATE_23 "CAN_DET_RANGE_RATE_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_AMPLITUDE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_AMPLITUDE_23 "CAN_DET_AMPLITUDE_23"; +BA_ "GenSigSendType" SG_ 310 CAN_SCAN_INDEX_2LSB_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_SCAN_INDEX_2LSB_23 "CAN_SCAN_INDEX_2LSB_23"; +BA_ "GenMsgSendType" BO_ 309 1; +BA_ "GenMsgILSupport" BO_ 309 1; +BA_ "GenMsgNrOfRepetition" BO_ 309 0; +BA_ "GenMsgCycleTime" BO_ 309 0; +BA_ "NetworkInitialization" BO_ 309 0; +BA_ "GenMsgDelayTime" BO_ 309 0; +BA_ "GenSigVtEn" SG_ 309 CAN_DET_CONFID_AZIMUTH_22 "CAN_DET_CONFID_AZIMUTH_22"; +BA_ "GenSigVtName" SG_ 309 CAN_DET_CONFID_AZIMUTH_22 "CAN_DET_CONFID_AZIMUTH_22"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_CONFID_AZIMUTH_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_CONFID_AZIMUTH_22 "CAN_DET_CONFID_AZIMUTH_22"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_SUPER_RES_TARGET_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_SUPER_RES_TARGET_22 "CAN_DET_SUPER_RES_TARGET_22"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_ND_TARGET_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_ND_TARGET_22 "CAN_DET_ND_TARGET_22"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22 "CAN_DET_HOST_VEH_CLUTTER_22"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_VALID_LEVEL_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_VALID_LEVEL_22 "CAN_DET_VALID_LEVEL_22"; +BA_ "GenSigStartValue" SG_ 309 CAN_DET_AZIMUTH_22 0; +BA_ "GenSigSendType" SG_ 309 CAN_DET_AZIMUTH_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_AZIMUTH_22 "CAN_DET_AZIMUTH_22"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_22 "CAN_DET_RANGE_22"; +BA_ "GenSigStartValue" SG_ 309 CAN_DET_RANGE_RATE_22 0; +BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_RATE_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_RATE_22 "CAN_DET_RANGE_RATE_22"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_AMPLITUDE_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_AMPLITUDE_22 "CAN_DET_AMPLITUDE_22"; +BA_ "GenSigSendType" SG_ 309 CAN_SCAN_INDEX_2LSB_22 0; +BA_ "GenSigCmt" SG_ 309 CAN_SCAN_INDEX_2LSB_22 "CAN_SCAN_INDEX_2LSB_22"; +BA_ "GenMsgSendType" BO_ 308 1; +BA_ "GenMsgILSupport" BO_ 308 1; +BA_ "GenMsgNrOfRepetition" BO_ 308 0; +BA_ "GenMsgCycleTime" BO_ 308 0; +BA_ "NetworkInitialization" BO_ 308 0; +BA_ "GenMsgDelayTime" BO_ 308 0; +BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21 "CAN_DET_CONFID_AZIMUTH_21"; +BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21 "CAN_DET_CONFID_AZIMUTH_21"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21 "CAN_DET_CONFID_AZIMUTH_21"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21 "CAN_DET_SUPER_RES_TARGET_21"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21 "CAN_DET_ND_TARGET_21"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21 "CAN_DET_HOST_VEH_CLUTTER_21"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21 "CAN_DET_VALID_LEVEL_21"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21 "CAN_DET_AZIMUTH_21"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21 "CAN_DET_RANGE_21"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21 "CAN_DET_RANGE_RATE_21"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21 "CAN_DET_AMPLITUDE_21"; +BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21 0; +BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21 "CAN_SCAN_INDEX_2LSB_21"; +BA_ "GenMsgSendType" BO_ 307 1; +BA_ "GenMsgILSupport" BO_ 307 1; +BA_ "GenMsgNrOfRepetition" BO_ 307 0; +BA_ "GenMsgCycleTime" BO_ 307 0; +BA_ "NetworkInitialization" BO_ 307 0; +BA_ "GenMsgDelayTime" BO_ 307 0; +BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20 "CAN_DET_CONFID_AZIMUTH_20"; +BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20 "CAN_DET_CONFID_AZIMUTH_20"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20 "CAN_DET_CONFID_AZIMUTH_20"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20 "CAN_DET_SUPER_RES_TARGET_20"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20 "CAN_DET_ND_TARGET_20"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20 "CAN_DET_HOST_VEH_CLUTTER_20"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20 "CAN_DET_VALID_LEVEL_20"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20 "CAN_DET_AZIMUTH_20"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20 "CAN_DET_RANGE_20"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20 "CAN_DET_RANGE_RATE_20"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20 "CAN_DET_AMPLITUDE_20"; +BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20 0; +BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20 "CAN_SCAN_INDEX_2LSB_20"; +BA_ "GenMsgSendType" BO_ 306 1; +BA_ "GenMsgILSupport" BO_ 306 1; +BA_ "GenMsgNrOfRepetition" BO_ 306 0; +BA_ "GenMsgCycleTime" BO_ 306 0; +BA_ "NetworkInitialization" BO_ 306 0; +BA_ "GenMsgDelayTime" BO_ 306 0; +BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19 "CAN_DET_CONFID_AZIMUTH_19"; +BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19 "CAN_DET_CONFID_AZIMUTH_19"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19 "CAN_DET_CONFID_AZIMUTH_19"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19 "CAN_DET_SUPER_RES_TARGET_19"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19 "CAN_DET_ND_TARGET_19"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19 "CAN_DET_HOST_VEH_CLUTTER_19"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19 "CAN_DET_VALID_LEVEL_19"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19 "CAN_DET_AZIMUTH_19"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19 "CAN_DET_RANGE_19"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19 "CAN_DET_RANGE_RATE_19"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19 "CAN_DET_AMPLITUDE_19"; +BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19 0; +BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19 "CAN_SCAN_INDEX_2LSB_19"; +BA_ "GenMsgSendType" BO_ 305 1; +BA_ "GenMsgILSupport" BO_ 305 1; +BA_ "GenMsgNrOfRepetition" BO_ 305 0; +BA_ "GenMsgCycleTime" BO_ 305 0; +BA_ "NetworkInitialization" BO_ 305 0; +BA_ "GenMsgDelayTime" BO_ 305 0; +BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18 "CAN_DET_CONFID_AZIMUTH_18"; +BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18 "CAN_DET_CONFID_AZIMUTH_18"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18 "CAN_DET_CONFID_AZIMUTH_18"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18 "CAN_DET_SUPER_RES_TARGET_18"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18 "CAN_DET_ND_TARGET_18"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18 "CAN_DET_HOST_VEH_CLUTTER_18"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18 "CAN_DET_VALID_LEVEL_18"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18 "CAN_DET_AZIMUTH_18"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18 "CAN_DET_RANGE_18"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18 "CAN_DET_RANGE_RATE_18"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18 "CAN_DET_AMPLITUDE_18"; +BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18 0; +BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18 "CAN_SCAN_INDEX_2LSB_18"; +BA_ "GenMsgSendType" BO_ 341 1; +BA_ "GenMsgILSupport" BO_ 341 1; +BA_ "GenMsgNrOfRepetition" BO_ 341 0; +BA_ "GenMsgCycleTime" BO_ 341 0; +BA_ "NetworkInitialization" BO_ 341 0; +BA_ "GenMsgDelayTime" BO_ 341 0; +BA_ "GenSigVtEn" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigVtName" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 "CAN_DET_SUPER_RES_TARGET_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_ND_TARGET_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_ND_TARGET_54 "CAN_DET_ND_TARGET_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 "CAN_DET_HOST_VEH_CLUTTER_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_VALID_LEVEL_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_VALID_LEVEL_54 "CAN_DET_VALID_LEVEL_54"; +BA_ "GenSigStartValue" SG_ 341 CAN_DET_AZIMUTH_54 0; +BA_ "GenSigSendType" SG_ 341 CAN_DET_AZIMUTH_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_AZIMUTH_54 "CAN_DET_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_54 "CAN_DET_RANGE_54"; +BA_ "GenSigStartValue" SG_ 341 CAN_DET_RANGE_RATE_54 0; +BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_RATE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_RATE_54 "CAN_DET_RANGE_RATE_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_AMPLITUDE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_AMPLITUDE_54 "CAN_DET_AMPLITUDE_54"; +BA_ "GenSigSendType" SG_ 341 CAN_SCAN_INDEX_2LSB_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_SCAN_INDEX_2LSB_54 "CAN_SCAN_INDEX_2LSB_54"; +BA_ "GenMsgSendType" BO_ 340 1; +BA_ "GenMsgILSupport" BO_ 340 1; +BA_ "GenMsgNrOfRepetition" BO_ 340 0; +BA_ "GenMsgCycleTime" BO_ 340 0; +BA_ "NetworkInitialization" BO_ 340 0; +BA_ "GenMsgDelayTime" BO_ 340 0; +BA_ "GenSigVtEn" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigVtName" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 "CAN_DET_SUPER_RES_TARGET_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_ND_TARGET_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_ND_TARGET_53 "CAN_DET_ND_TARGET_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 "CAN_DET_HOST_VEH_CLUTTER_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_VALID_LEVEL_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_VALID_LEVEL_53 "CAN_DET_VALID_LEVEL_53"; +BA_ "GenSigStartValue" SG_ 340 CAN_DET_AZIMUTH_53 0; +BA_ "GenSigSendType" SG_ 340 CAN_DET_AZIMUTH_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_AZIMUTH_53 "CAN_DET_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_53 "CAN_DET_RANGE_53"; +BA_ "GenSigStartValue" SG_ 340 CAN_DET_RANGE_RATE_53 0; +BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_RATE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_RATE_53 "CAN_DET_RANGE_RATE_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_AMPLITUDE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_AMPLITUDE_53 "CAN_DET_AMPLITUDE_53"; +BA_ "GenSigSendType" SG_ 340 CAN_SCAN_INDEX_2LSB_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_SCAN_INDEX_2LSB_53 "CAN_SCAN_INDEX_2LSB_53"; +BA_ "GenMsgSendType" BO_ 339 1; +BA_ "GenMsgILSupport" BO_ 339 1; +BA_ "GenMsgNrOfRepetition" BO_ 339 0; +BA_ "GenMsgCycleTime" BO_ 339 0; +BA_ "NetworkInitialization" BO_ 339 0; +BA_ "GenMsgDelayTime" BO_ 339 0; +BA_ "GenSigVtEn" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigVtName" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 "CAN_DET_SUPER_RES_TARGET_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_ND_TARGET_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_ND_TARGET_52 "CAN_DET_ND_TARGET_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 "CAN_DET_HOST_VEH_CLUTTER_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_VALID_LEVEL_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_VALID_LEVEL_52 "CAN_DET_VALID_LEVEL_52"; +BA_ "GenSigStartValue" SG_ 339 CAN_DET_AZIMUTH_52 0; +BA_ "GenSigSendType" SG_ 339 CAN_DET_AZIMUTH_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_AZIMUTH_52 "CAN_DET_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_52 "CAN_DET_RANGE_52"; +BA_ "GenSigStartValue" SG_ 339 CAN_DET_RANGE_RATE_52 0; +BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_RATE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_RATE_52 "CAN_DET_RANGE_RATE_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_AMPLITUDE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_AMPLITUDE_52 "CAN_DET_AMPLITUDE_52"; +BA_ "GenSigSendType" SG_ 339 CAN_SCAN_INDEX_2LSB_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_SCAN_INDEX_2LSB_52 "CAN_SCAN_INDEX_2LSB_52"; +BA_ "GenMsgSendType" BO_ 338 1; +BA_ "GenMsgILSupport" BO_ 338 1; +BA_ "GenMsgNrOfRepetition" BO_ 338 0; +BA_ "GenMsgCycleTime" BO_ 338 0; +BA_ "NetworkInitialization" BO_ 338 0; +BA_ "GenMsgDelayTime" BO_ 338 0; +BA_ "GenSigVtEn" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigVtName" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 "CAN_DET_SUPER_RES_TARGET_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_ND_TARGET_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_ND_TARGET_51 "CAN_DET_ND_TARGET_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 "CAN_DET_HOST_VEH_CLUTTER_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_VALID_LEVEL_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_VALID_LEVEL_51 "CAN_DET_VALID_LEVEL_51"; +BA_ "GenSigStartValue" SG_ 338 CAN_DET_AZIMUTH_51 0; +BA_ "GenSigSendType" SG_ 338 CAN_DET_AZIMUTH_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_AZIMUTH_51 "CAN_DET_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_51 "CAN_DET_RANGE_51"; +BA_ "GenSigStartValue" SG_ 338 CAN_DET_RANGE_RATE_51 0; +BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_RATE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_RATE_51 "CAN_DET_RANGE_RATE_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_AMPLITUDE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_AMPLITUDE_51 "CAN_DET_AMPLITUDE_51"; +BA_ "GenSigSendType" SG_ 338 CAN_SCAN_INDEX_2LSB_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_SCAN_INDEX_2LSB_51 "CAN_SCAN_INDEX_2LSB_51"; +BA_ "GenMsgSendType" BO_ 337 1; +BA_ "GenMsgILSupport" BO_ 337 1; +BA_ "GenMsgNrOfRepetition" BO_ 337 0; +BA_ "GenMsgCycleTime" BO_ 337 0; +BA_ "NetworkInitialization" BO_ 337 0; +BA_ "GenMsgDelayTime" BO_ 337 0; +BA_ "GenSigVtEn" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigVtName" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 "CAN_DET_SUPER_RES_TARGET_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_ND_TARGET_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_ND_TARGET_50 "CAN_DET_ND_TARGET_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 "CAN_DET_HOST_VEH_CLUTTER_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_VALID_LEVEL_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_VALID_LEVEL_50 "CAN_DET_VALID_LEVEL_50"; +BA_ "GenSigStartValue" SG_ 337 CAN_DET_AZIMUTH_50 0; +BA_ "GenSigSendType" SG_ 337 CAN_DET_AZIMUTH_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_AZIMUTH_50 "CAN_DET_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_50 "CAN_DET_RANGE_50"; +BA_ "GenSigStartValue" SG_ 337 CAN_DET_RANGE_RATE_50 0; +BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_RATE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_RATE_50 "CAN_DET_RANGE_RATE_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_AMPLITUDE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_AMPLITUDE_50 "CAN_DET_AMPLITUDE_50"; +BA_ "GenSigSendType" SG_ 337 CAN_SCAN_INDEX_2LSB_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_SCAN_INDEX_2LSB_50 "CAN_SCAN_INDEX_2LSB_50"; +BA_ "GenMsgSendType" BO_ 336 1; +BA_ "GenMsgILSupport" BO_ 336 1; +BA_ "GenMsgNrOfRepetition" BO_ 336 0; +BA_ "GenMsgCycleTime" BO_ 336 0; +BA_ "NetworkInitialization" BO_ 336 0; +BA_ "GenMsgDelayTime" BO_ 336 0; +BA_ "GenSigVtEn" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigVtName" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 "CAN_DET_SUPER_RES_TARGET_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_ND_TARGET_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_ND_TARGET_49 "CAN_DET_ND_TARGET_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 "CAN_DET_HOST_VEH_CLUTTER_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_VALID_LEVEL_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_VALID_LEVEL_49 "CAN_DET_VALID_LEVEL_49"; +BA_ "GenSigStartValue" SG_ 336 CAN_DET_AZIMUTH_49 0; +BA_ "GenSigSendType" SG_ 336 CAN_DET_AZIMUTH_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_AZIMUTH_49 "CAN_DET_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_49 "CAN_DET_RANGE_49"; +BA_ "GenSigStartValue" SG_ 336 CAN_DET_RANGE_RATE_49 0; +BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_RATE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_RATE_49 "CAN_DET_RANGE_RATE_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_AMPLITUDE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_AMPLITUDE_49 "CAN_DET_AMPLITUDE_49"; +BA_ "GenSigSendType" SG_ 336 CAN_SCAN_INDEX_2LSB_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_SCAN_INDEX_2LSB_49 "CAN_SCAN_INDEX_2LSB_49"; +BA_ "GenMsgSendType" BO_ 326 1; +BA_ "GenMsgILSupport" BO_ 326 1; +BA_ "GenMsgNrOfRepetition" BO_ 326 0; +BA_ "GenMsgCycleTime" BO_ 326 0; +BA_ "NetworkInitialization" BO_ 326 0; +BA_ "GenMsgDelayTime" BO_ 326 0; +BA_ "GenSigVtEn" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigVtName" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 "CAN_DET_SUPER_RES_TARGET_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_ND_TARGET_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_ND_TARGET_39 "CAN_DET_ND_TARGET_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 "CAN_DET_HOST_VEH_CLUTTER_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_VALID_LEVEL_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_VALID_LEVEL_39 "CAN_DET_VALID_LEVEL_39"; +BA_ "GenSigStartValue" SG_ 326 CAN_DET_AZIMUTH_39 0; +BA_ "GenSigSendType" SG_ 326 CAN_DET_AZIMUTH_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_AZIMUTH_39 "CAN_DET_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_39 "CAN_DET_RANGE_39"; +BA_ "GenSigStartValue" SG_ 326 CAN_DET_RANGE_RATE_39 0; +BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_RATE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_RATE_39 "CAN_DET_RANGE_RATE_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_AMPLITUDE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_AMPLITUDE_39 "CAN_DET_AMPLITUDE_39"; +BA_ "GenSigSendType" SG_ 326 CAN_SCAN_INDEX_2LSB_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_SCAN_INDEX_2LSB_39 "CAN_SCAN_INDEX_2LSB_39"; +BA_ "GenMsgSendType" BO_ 315 1; +BA_ "GenMsgILSupport" BO_ 315 1; +BA_ "GenMsgNrOfRepetition" BO_ 315 0; +BA_ "GenMsgCycleTime" BO_ 315 0; +BA_ "NetworkInitialization" BO_ 315 0; +BA_ "GenMsgDelayTime" BO_ 315 0; +BA_ "GenSigVtEn" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigVtName" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 "CAN_DET_SUPER_RES_TARGET_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_ND_TARGET_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_ND_TARGET_28 "CAN_DET_ND_TARGET_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 "CAN_DET_HOST_VEH_CLUTTER_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_VALID_LEVEL_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_VALID_LEVEL_28 "CAN_DET_VALID_LEVEL_28"; +BA_ "GenSigStartValue" SG_ 315 CAN_DET_AZIMUTH_28 0; +BA_ "GenSigSendType" SG_ 315 CAN_DET_AZIMUTH_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_AZIMUTH_28 "CAN_DET_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_28 "CAN_DET_RANGE_28"; +BA_ "GenSigStartValue" SG_ 315 CAN_DET_RANGE_RATE_28 0; +BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_RATE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_RATE_28 "CAN_DET_RANGE_RATE_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_AMPLITUDE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_AMPLITUDE_28 "CAN_DET_AMPLITUDE_28"; +BA_ "GenSigSendType" SG_ 315 CAN_SCAN_INDEX_2LSB_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_SCAN_INDEX_2LSB_28 "CAN_SCAN_INDEX_2LSB_28"; +BA_ "GenMsgSendType" BO_ 304 1; +BA_ "GenMsgILSupport" BO_ 304 1; +BA_ "GenMsgNrOfRepetition" BO_ 304 0; +BA_ "GenMsgCycleTime" BO_ 304 0; +BA_ "NetworkInitialization" BO_ 304 0; +BA_ "GenMsgDelayTime" BO_ 304 0; +BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17 "CAN_DET_CONFID_AZIMUTH_17"; +BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17 "CAN_DET_CONFID_AZIMUTH_17"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17 "CAN_DET_CONFID_AZIMUTH_17"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17 "CAN_DET_SUPER_RES_TARGET_17"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17 "CAN_DET_ND_TARGET_17"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17 "CAN_DET_HOST_VEH_CLUTTER_17"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17 "CAN_DET_VALID_LEVEL_17"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17 "CAN_DET_AZIMUTH_17"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17 "CAN_DET_RANGE_17"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17 "CAN_DET_RANGE_RATE_17"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17 "CAN_DET_AMPLITUDE_17"; +BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17 0; +BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17 "CAN_SCAN_INDEX_2LSB_17"; +BA_ "GenMsgSendType" BO_ 303 1; +BA_ "GenMsgILSupport" BO_ 303 1; +BA_ "GenMsgNrOfRepetition" BO_ 303 0; +BA_ "GenMsgCycleTime" BO_ 303 0; +BA_ "NetworkInitialization" BO_ 303 0; +BA_ "GenMsgDelayTime" BO_ 303 0; +BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16 "CAN_DET_CONFID_AZIMUTH_16"; +BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16 "CAN_DET_CONFID_AZIMUTH_16"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16 "CAN_DET_CONFID_AZIMUTH_16"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16 "CAN_DET_SUPER_RES_TARGET_16"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16 "CAN_DET_ND_TARGET_16"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16 "CAN_DET_HOST_VEH_CLUTTER_16"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16 "CAN_DET_VALID_LEVEL_16"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16 "CAN_DET_AZIMUTH_16"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16 "CAN_DET_RANGE_16"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16 "CAN_DET_RANGE_RATE_16"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16 "CAN_DET_AMPLITUDE_16"; +BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16 0; +BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16 "CAN_SCAN_INDEX_2LSB_16"; +BA_ "GenMsgSendType" BO_ 302 1; +BA_ "GenMsgILSupport" BO_ 302 1; +BA_ "GenMsgNrOfRepetition" BO_ 302 0; +BA_ "GenMsgCycleTime" BO_ 302 0; +BA_ "NetworkInitialization" BO_ 302 0; +BA_ "GenMsgDelayTime" BO_ 302 0; +BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15 "CAN_DET_CONFID_AZIMUTH_15"; +BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15 "CAN_DET_CONFID_AZIMUTH_15"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15 "CAN_DET_CONFID_AZIMUTH_15"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15 "CAN_DET_SUPER_RES_TARGET_15"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15 "CAN_DET_ND_TARGET_15"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15 "CAN_DET_HOST_VEH_CLUTTER_15"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15 "CAN_DET_VALID_LEVEL_15"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15 "CAN_DET_AZIMUTH_15"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15 "CAN_DET_RANGE_15"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15 "CAN_DET_RANGE_RATE_15"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15 "CAN_DET_AMPLITUDE_15"; +BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15 0; +BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15 "CAN_SCAN_INDEX_2LSB_15"; +BA_ "GenMsgSendType" BO_ 301 1; +BA_ "GenMsgILSupport" BO_ 301 1; +BA_ "GenMsgNrOfRepetition" BO_ 301 0; +BA_ "GenMsgCycleTime" BO_ 301 0; +BA_ "NetworkInitialization" BO_ 301 0; +BA_ "GenMsgDelayTime" BO_ 301 0; +BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14 "CAN_DET_CONFID_AZIMUTH_14"; +BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14 "CAN_DET_CONFID_AZIMUTH_14"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14 "CAN_DET_CONFID_AZIMUTH_14"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14 "CAN_DET_SUPER_RES_TARGET_14"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14 "CAN_DET_ND_TARGET_14"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14 "CAN_DET_HOST_VEH_CLUTTER_14"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14 "CAN_DET_VALID_LEVEL_14"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14 "CAN_DET_AZIMUTH_14"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14 "CAN_DET_RANGE_14"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14 "CAN_DET_RANGE_RATE_14"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14 "CAN_DET_AMPLITUDE_14"; +BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14 0; +BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14 "CAN_SCAN_INDEX_2LSB_14"; +BA_ "GenMsgSendType" BO_ 300 1; +BA_ "GenMsgILSupport" BO_ 300 1; +BA_ "GenMsgNrOfRepetition" BO_ 300 0; +BA_ "GenMsgCycleTime" BO_ 300 0; +BA_ "NetworkInitialization" BO_ 300 0; +BA_ "GenMsgDelayTime" BO_ 300 0; +BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13 "CAN_DET_CONFID_AZIMUTH_13"; +BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13 "CAN_DET_CONFID_AZIMUTH_13"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13 "CAN_DET_CONFID_AZIMUTH_13"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13 "CAN_DET_SUPER_RES_TARGET_13"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13 "CAN_DET_ND_TARGET_13"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13 "CAN_DET_HOST_VEH_CLUTTER_13"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13 "CAN_DET_VALID_LEVEL_13"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13 "CAN_DET_AZIMUTH_13"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13 "CAN_DET_RANGE_13"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13 "CAN_DET_RANGE_RATE_13"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13 "CAN_DET_AMPLITUDE_13"; +BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13 0; +BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13 "CAN_SCAN_INDEX_2LSB_13"; +BA_ "GenMsgSendType" BO_ 299 1; +BA_ "GenMsgILSupport" BO_ 299 1; +BA_ "GenMsgNrOfRepetition" BO_ 299 0; +BA_ "GenMsgCycleTime" BO_ 299 0; +BA_ "NetworkInitialization" BO_ 299 0; +BA_ "GenMsgDelayTime" BO_ 299 0; +BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12 "CAN_DET_CONFID_AZIMUTH_12"; +BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12 "CAN_DET_CONFID_AZIMUTH_12"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12 "CAN_DET_CONFID_AZIMUTH_12"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12 "CAN_DET_SUPER_RES_TARGET_12"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12 "CAN_DET_ND_TARGET_12"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12 "CAN_DET_HOST_VEH_CLUTTER_12"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12 "CAN_DET_VALID_LEVEL_12"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12 "CAN_DET_AZIMUTH_12"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12 "CAN_DET_RANGE_12"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12 "CAN_DET_RANGE_RATE_12"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12 "CAN_DET_AMPLITUDE_12"; +BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12 0; +BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12 "CAN_SCAN_INDEX_2LSB_12"; +BA_ "GenMsgSendType" BO_ 298 1; +BA_ "GenMsgILSupport" BO_ 298 1; +BA_ "GenMsgNrOfRepetition" BO_ 298 0; +BA_ "GenMsgCycleTime" BO_ 298 0; +BA_ "NetworkInitialization" BO_ 298 0; +BA_ "GenMsgDelayTime" BO_ 298 0; +BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11 "CAN_DET_CONFID_AZIMUTH_11"; +BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11 "CAN_DET_CONFID_AZIMUTH_11"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11 "CAN_DET_CONFID_AZIMUTH_11"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11 "CAN_DET_SUPER_RES_TARGET_11"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11 "CAN_DET_ND_TARGET_11"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11 "CAN_DET_HOST_VEH_CLUTTER_11"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11 "CAN_DET_VALID_LEVEL_11"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11 "CAN_DET_AZIMUTH_11"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11 "CAN_DET_RANGE_11"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11 "CAN_DET_RANGE_RATE_11"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11 "CAN_DET_AMPLITUDE_11"; +BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11 0; +BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11 "CAN_SCAN_INDEX_2LSB_11"; +BA_ "GenMsgSendType" BO_ 297 1; +BA_ "GenMsgILSupport" BO_ 297 1; +BA_ "GenMsgNrOfRepetition" BO_ 297 0; +BA_ "GenMsgCycleTime" BO_ 297 0; +BA_ "NetworkInitialization" BO_ 297 0; +BA_ "GenMsgDelayTime" BO_ 297 0; +BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10 "CAN_DET_CONFID_AZIMUTH_10"; +BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10 "CAN_DET_CONFID_AZIMUTH_10"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10 "CAN_DET_CONFID_AZIMUTH_10"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10 "CAN_DET_SUPER_RES_TARGET_10"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10 "CAN_DET_ND_TARGET_10"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10 "CAN_DET_HOST_VEH_CLUTTER_10"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10 "CAN_DET_VALID_LEVEL_10"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10 "CAN_DET_AZIMUTH_10"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10 "CAN_DET_RANGE_10"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10 "CAN_DET_RANGE_RATE_10"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10 "CAN_DET_AMPLITUDE_10"; +BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10 0; +BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10 "CAN_SCAN_INDEX_2LSB_10"; +BA_ "GenMsgSendType" BO_ 296 1; +BA_ "GenMsgILSupport" BO_ 296 1; +BA_ "GenMsgNrOfRepetition" BO_ 296 0; +BA_ "GenMsgCycleTime" BO_ 296 0; +BA_ "NetworkInitialization" BO_ 296 0; +BA_ "GenMsgDelayTime" BO_ 296 0; +BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09 "CAN_DET_CONFID_AZIMUTH_09"; +BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09 "CAN_DET_CONFID_AZIMUTH_09"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09 "CAN_DET_CONFID_AZIMUTH_09"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09 "CAN_DET_SUPER_RES_TARGET_09"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09 "CAN_DET_ND_TARGET_09"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09 "CAN_DET_HOST_VEH_CLUTTER_09"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09 "CAN_DET_VALID_LEVEL_09"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09 "CAN_DET_AZIMUTH_09"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09 "CAN_DET_RANGE_09"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09 "CAN_DET_RANGE_RATE_09"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09 "CAN_DET_AMPLITUDE_09"; +BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09 0; +BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09 "CAN_SCAN_INDEX_2LSB_09"; +BA_ "GenMsgSendType" BO_ 295 1; +BA_ "GenMsgILSupport" BO_ 295 1; +BA_ "GenMsgNrOfRepetition" BO_ 295 0; +BA_ "GenMsgCycleTime" BO_ 295 0; +BA_ "NetworkInitialization" BO_ 295 0; +BA_ "GenMsgDelayTime" BO_ 295 0; +BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08 "CAN_DET_CONFID_AZIMUTH_08"; +BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08 "CAN_DET_CONFID_AZIMUTH_08"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08 "CAN_DET_CONFID_AZIMUTH_08"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08 "CAN_DET_SUPER_RES_TARGET_08"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08 "CAN_DET_ND_TARGET_08"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08 "CAN_DET_HOST_VEH_CLUTTER_08"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08 "CAN_DET_VALID_LEVEL_08"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08 "CAN_DET_AZIMUTH_08"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08 "CAN_DET_RANGE_08"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08 "CAN_DET_RANGE_RATE_08"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08 "CAN_DET_AMPLITUDE_08"; +BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08 0; +BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08 "CAN_SCAN_INDEX_2LSB_08"; +BA_ "GenMsgSendType" BO_ 294 1; +BA_ "GenMsgILSupport" BO_ 294 1; +BA_ "GenMsgNrOfRepetition" BO_ 294 0; +BA_ "GenMsgCycleTime" BO_ 294 0; +BA_ "NetworkInitialization" BO_ 294 0; +BA_ "GenMsgDelayTime" BO_ 294 0; +BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07 "CAN_DET_CONFID_AZIMUTH_07"; +BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07 "CAN_DET_CONFID_AZIMUTH_07"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07 "CAN_DET_CONFID_AZIMUTH_07"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07 "CAN_DET_SUPER_RES_TARGET_07"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07 "CAN_DET_ND_TARGET_07"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07 "CAN_DET_HOST_VEH_CLUTTER_07"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07 "CAN_DET_VALID_LEVEL_07"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07 "CAN_DET_AZIMUTH_07"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07 "CAN_DET_RANGE_07"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07 "CAN_DET_RANGE_RATE_07"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07 "CAN_DET_AMPLITUDE_07"; +BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07 0; +BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07 "CAN_SCAN_INDEX_2LSB_07"; +BA_ "GenMsgSendType" BO_ 293 1; +BA_ "GenMsgILSupport" BO_ 293 1; +BA_ "GenMsgNrOfRepetition" BO_ 293 0; +BA_ "GenMsgCycleTime" BO_ 293 0; +BA_ "NetworkInitialization" BO_ 293 0; +BA_ "GenMsgDelayTime" BO_ 293 0; +BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06 "CAN_DET_CONFID_AZIMUTH_06"; +BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06 "CAN_DET_CONFID_AZIMUTH_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06 "CAN_DET_CONFID_AZIMUTH_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06 "CAN_DET_SUPER_RES_TARGET_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06 "CAN_DET_ND_TARGET_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06 "CAN_DET_HOST_VEH_CLUTTER_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06 "CAN_DET_VALID_LEVEL_06"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06 "CAN_DET_AZIMUTH_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06 "CAN_DET_RANGE_06"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06 "CAN_DET_RANGE_RATE_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06 "CAN_DET_AMPLITUDE_06"; +BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06 "CAN_SCAN_INDEX_2LSB_06"; +BA_ "GenMsgSendType" BO_ 292 1; +BA_ "GenMsgILSupport" BO_ 292 1; +BA_ "GenMsgNrOfRepetition" BO_ 292 0; +BA_ "GenMsgCycleTime" BO_ 292 0; +BA_ "NetworkInitialization" BO_ 292 0; +BA_ "GenMsgDelayTime" BO_ 292 0; +BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05 "CAN_DET_CONFID_AZIMUTH_05"; +BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05 "CAN_DET_CONFID_AZIMUTH_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05 "CAN_DET_CONFID_AZIMUTH_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05 "CAN_DET_SUPER_RES_TARGET_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05 "CAN_DET_ND_TARGET_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05 "CAN_DET_HOST_VEH_CLUTTER_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05 "CAN_DET_VALID_LEVEL_05"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05 "CAN_DET_AZIMUTH_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05 "CAN_DET_RANGE_05"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05 "CAN_DET_RANGE_RATE_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05 "CAN_DET_AMPLITUDE_05"; +BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05 "CAN_SCAN_INDEX_2LSB_05"; +BA_ "GenMsgSendType" BO_ 290 1; +BA_ "GenMsgILSupport" BO_ 290 1; +BA_ "GenMsgNrOfRepetition" BO_ 290 0; +BA_ "GenMsgCycleTime" BO_ 290 0; +BA_ "NetworkInitialization" BO_ 290 0; +BA_ "GenMsgDelayTime" BO_ 290 0; +BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03 "CAN_DET_CONFID_AZIMUTH_03"; +BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03 "CAN_DET_CONFID_AZIMUTH_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03 "CAN_DET_CONFID_AZIMUTH_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03 "CAN_DET_SUPER_RES_TARGET_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03 "CAN_DET_ND_TARGET_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03 "CAN_DET_HOST_VEH_CLUTTER_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03 "CAN_DET_VALID_LEVEL_03"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03 "CAN_DET_AZIMUTH_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03 "CAN_DET_RANGE_03"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03 "CAN_DET_RANGE_RATE_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03 "CAN_DET_AMPLITUDE_03"; +BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03 "CAN_SCAN_INDEX_2LSB_03"; +BA_ "GenMsgSendType" BO_ 289 1; +BA_ "GenMsgILSupport" BO_ 289 1; +BA_ "GenMsgNrOfRepetition" BO_ 289 0; +BA_ "GenMsgCycleTime" BO_ 289 0; +BA_ "NetworkInitialization" BO_ 289 0; +BA_ "GenMsgDelayTime" BO_ 289 0; +BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02 "CAN_DET_CONFID_AZIMUTH_02"; +BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02 "CAN_DET_CONFID_AZIMUTH_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02 "CAN_DET_CONFID_AZIMUTH_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02 "CAN_DET_SUPER_RES_TARGET_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02 "CAN_DET_ND_TARGET_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02 "CAN_DET_HOST_VEH_CLUTTER_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02 "CAN_DET_VALID_LEVEL_02"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02 "CAN_DET_AZIMUTH_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02 "CAN_DET_RANGE_02"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02 "CAN_DET_RANGE_RATE_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02 "CAN_DET_AMPLITUDE_02"; +BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02 "CAN_SCAN_INDEX_2LSB_02"; +BA_ "GenMsgSendType" BO_ 256 1; +BA_ "GenMsgILSupport" BO_ 256 1; +BA_ "GenMsgNrOfRepetition" BO_ 256 0; +BA_ "NetworkInitialization" BO_ 256 0; +BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MINOR_MRR "CAN_PCAN_MINOR_MRR"; +BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MINOR_MRR 0; +BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MAJOR_MRR "CAN_PCAN_MAJOR_MRR"; +BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MAJOR_MRR 0; +BA_ "GenMsgCycleTime" BO_ 257 30; +BA_ "GenMsgSendType" BO_ 257 0; +BA_ "GenMsgILSupport" BO_ 257 1; +BA_ "GenMsgNrOfRepetition" BO_ 257 0; +BA_ "NetworkInitialization" BO_ 257 0; +BA_ "GenSigCmt" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtEn" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtName" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtName" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigCmt" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigStartValue" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE 0; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_MNR 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_EXT_COND_NOK 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_NOT_START 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_OVERHEAT_ERROR 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_NOT_OP 0; +BA_ "GenSigCmt" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigVtEn" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigVtName" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigSendType" SG_ 257 CAN_XCVR_OPERATIONAL 0; +BA_ "GenMsgSendType" BO_ 288 1; +BA_ "GenMsgILSupport" BO_ 288 1; +BA_ "GenMsgNrOfRepetition" BO_ 288 0; +BA_ "GenMsgCycleTime" BO_ 288 0; +BA_ "NetworkInitialization" BO_ 288 0; +BA_ "GenMsgDelayTime" BO_ 288 0; +BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01 "CAN_DET_CONFID_AZIMUTH_01"; +BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01 "CAN_DET_CONFID_AZIMUTH_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01 "CAN_DET_CONFID_AZIMUTH_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01 "CAN_DET_SUPER_RES_TARGET_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01 "CAN_DET_ND_TARGET_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01 "CAN_DET_HOST_VEH_CLUTTER_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01 "CAN_DET_VALID_LEVEL_01"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01 "CAN_DET_AZIMUTH_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01 "CAN_DET_RANGE_01"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01 "CAN_DET_RANGE_RATE_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01 "CAN_DET_AMPLITUDE_01"; +BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01 "CAN_SCAN_INDEX_2LSB_01"; +BA_DEF_DEF_ "CrossOver_InfoCAN" "No"; +BA_DEF_DEF_ "CrossOver_LIN" "No"; +BA_DEF_DEF_ "UsedOnPgmDBC" "Yes"; +BA_DEF_DEF_ "ContentDependant" "No"; +BA_DEF_DEF_ "GenSigTimeoutTime_RCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_GWM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_OCS" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_ABS_ESC" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_CCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_IPMA" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_TSTR" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_SCCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_PSCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime__delete" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_Generic_BCM" 0; +BA_DEF_DEF_ "NmMessage" "No"; +BA_DEF_DEF_ "DiagResponse" "No"; +BA_DEF_DEF_ "DiagRequest" "No"; +BA_DEF_DEF_ "TpTxIndex" 0; +BA_DEF_DEF_ "DiagState" "No"; +BA_DEF_DEF_ "TpApplType" ""; +BA_DEF_DEF_ "NmAsrMessage" "No"; +BA_DEF_DEF_ "Mulitplexer" "No"; +BA_DEF_DEF_ "ConfiguredTransmitter" "No"; +BA_DEF_DEF_ "EventRateOfChange" 10000; +BA_DEF_DEF_ "GenMsgHandlingTypeDoc" ""; +BA_DEF_DEF_ "GenMsgHandlingTypeCode" ""; +BA_DEF_DEF_ "GenMsgMarked" ""; +BA_DEF_DEF_ "GenSigMarked" ""; +BA_DEF_DEF_ "GenSigVtIndex" ""; +BA_DEF_DEF_ "GenSigVtName" ""; +BA_DEF_DEF_ "GenSigVtEn" ""; +BA_DEF_DEF_ "GenSigSNA" ""; +BA_DEF_DEF_ "GenSigCmt" ""; +BA_DEF_DEF_ "GenMsgCmt" ""; +BA_DEF_DEF_ "GenSigSendType" "NoSigSendType"; +BA_DEF_DEF_ "GenSigInactiveValue" 0; +BA_DEF_DEF_ "GenSigMissingSourceValue" 0; +BA_DEF_DEF_ "WakeupSignal" "No"; +BA_DEF_DEF_ "GenSigStartValue" 0; +BA_DEF_DEF_ "GenMsgILSupport" "Yes"; +BA_DEF_DEF_ "NetworkInitializationCommand" "No"; +BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType"; +BA_DEF_DEF_ "GenMsgCycleTime" 0; +BA_DEF_DEF_ "GenMsgCycleTimeFast" 0; +BA_DEF_DEF_ "GenMsgDelayTime" 0; +BA_DEF_DEF_ "GenMsgNrOfRepetition" 0; +BA_DEF_DEF_ "GenMsgStartDelayTime" 0; +BA_DEF_DEF_ "NetworkInitialization" "No"; +BA_DEF_DEF_ "MessageGateway" "No"; +BA_DEF_DEF_ "ILUsed" "Yes"; +BA_DEF_DEF_ "NetworkInitializationUsed" "No"; +BA_DEF_DEF_ "PowerType" "Switched"; +BA_DEF_DEF_ "NodeStartUpTime" 250; +BA_DEF_DEF_ "NodeWakeUpTime" 10; +BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff"; +BA_DEF_DEF_ "GenMsgForegroundColor" "#000000"; +VAL_ 34 IPMA_PCAN_DataRangeCheck 1 "Fault Present" 0 "No Fault"; +VAL_ 34 IPMA_PCAN_MissingMsg 1 "Fault Present" 0 "No Fault "; +VAL_ 34 VINSignalCompareFailure 1 "Fault Present" 0 "No Fault"; +VAL_ 34 ModuleNotConfiguredError 1 "Fault Present" 0 "No Fault"; +VAL_ 34 CarCfgNotConfiguredError 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ARMtoDSPChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 DSPtoArmChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 HostToArmChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ARMtoHostChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 LoopBWOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 DSPOverrunFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte6_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TuningSensitivityFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 SaturatedTuningFreqFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 LocalOscPowerFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterPowerFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte6_bit0 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 XCVRDeviceSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 FreqSynthesizerSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 AnalogConverterDevicSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 SidelobeBlockage 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit1 1 "Fault Present" 0 "No Fault"; +VAL_ 33 MNRBlocked 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ECUTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 AlignmentRoutineFailedFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 UnreasonableRadarData 1 "Fault Present" 0 "No Fault"; +VAL_ 33 MicroprocessorTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 VerticalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 HorizontalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 FactoryAlignmentMode 1 "Fault Present" 0 "No Fault"; +VAL_ 33 BatteryLowFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 BatteryHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_1p25SupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte3_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ThermistorOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_3p3DACSupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_3p3RAWSupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_5_SupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterIDFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit3 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit2 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PCANMissingMsgFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PCANBusOff 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 InstructionSetCheckFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 StackOverflowFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 WatchdogFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PLLLockFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit1 1 "Fault Present" 0 "No Fault"; +VAL_ 33 RAMMemoryTestFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 USCValidationFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit3 1 "Fault Present" 0 "No Fault"; +VAL_ 33 KeepAliveChecksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ProgramCalibrationFlashChecksum 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ApplicationFlashChecksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 371 CAN_AUTO_ALIGN_HANGLE_QF 3 "Accurate" 2 "Inaccurate" 1 "Temporarily undefined" 0 "Undefined"; +VAL_ 371 CAN_ALIGNMENT_STATUS 15 "Undefined_2" 14 "Undefined_1" 13 "Low Amplitude (Flat-plate only)" 12 "No Peak (Flat-plate only)" 11 "Fail Ver and Hor OutOfRange" 10 "Fail Vertical Align OutOfRange" 9 "Fail Horizontal Align OutOfRange" 8 "Fail Time Out" 7 "Fail Only Right Target Found" 6 "Fail Only Left Target Found" 5 "Fail Variance Too Large" 4 "Fail Deviation Too Large" 3 "Fail No Target" 2 "Success" 1 "Busy" 0 "Off"; +VAL_ 371 CAN_ALIGNMENT_STATE 6 "Static alignment flat-plate" 5 "Static alignment 2-target" 4 "Static alignment 1-target" 3 "Service alignment" 2 "Short track alignment" 1 "Auto alignment" 0 "Off"; +VAL_ 291 CAN_DET_CONFID_AZIMUTH_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 351 CAN_DET_CONFID_AZIMUTH_64 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 350 CAN_DET_CONFID_AZIMUTH_63 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 349 CAN_DET_CONFID_AZIMUTH_62 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 348 CAN_DET_CONFID_AZIMUTH_61 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 347 CAN_DET_CONFID_AZIMUTH_60 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 346 CAN_DET_CONFID_AZIMUTH_59 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 345 CAN_DET_CONFID_AZIMUTH_58 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 344 CAN_DET_CONFID_AZIMUTH_57 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 343 CAN_DET_CONFID_AZIMUTH_56 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 342 CAN_DET_CONFID_AZIMUTH_55 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 335 CAN_DET_CONFID_AZIMUTH_48 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 334 CAN_DET_CONFID_AZIMUTH_47 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 333 CAN_DET_CONFID_AZIMUTH_46 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 332 CAN_DET_CONFID_AZIMUTH_45 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 331 CAN_DET_CONFID_AZIMUTH_44 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 330 CAN_DET_CONFID_AZIMUTH_43 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 329 CAN_DET_CONFID_AZIMUTH_42 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 328 CAN_DET_CONFID_AZIMUTH_41 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 327 CAN_DET_CONFID_AZIMUTH_40 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 325 CAN_DET_CONFID_AZIMUTH_38 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 324 CAN_DET_CONFID_AZIMUTH_37 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 323 CAN_DET_CONFID_AZIMUTH_36 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 322 CAN_DET_CONFID_AZIMUTH_35 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 321 CAN_DET_CONFID_AZIMUTH_34 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 320 CAN_DET_CONFID_AZIMUTH_33 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 319 CAN_DET_CONFID_AZIMUTH_32 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 318 CAN_DET_CONFID_AZIMUTH_31 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 317 CAN_DET_CONFID_AZIMUTH_30 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 316 CAN_DET_CONFID_AZIMUTH_29 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 314 CAN_DET_CONFID_AZIMUTH_27 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 313 CAN_DET_CONFID_AZIMUTH_26 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 312 CAN_DET_CONFID_AZIMUTH_25 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 311 CAN_DET_CONFID_AZIMUTH_24 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 310 CAN_DET_CONFID_AZIMUTH_23 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 309 CAN_DET_CONFID_AZIMUTH_22 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 308 CAN_DET_CONFID_AZIMUTH_21 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 307 CAN_DET_CONFID_AZIMUTH_20 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 306 CAN_DET_CONFID_AZIMUTH_19 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 305 CAN_DET_CONFID_AZIMUTH_18 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 341 CAN_DET_CONFID_AZIMUTH_54 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 340 CAN_DET_CONFID_AZIMUTH_53 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 339 CAN_DET_CONFID_AZIMUTH_52 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 338 CAN_DET_CONFID_AZIMUTH_51 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 337 CAN_DET_CONFID_AZIMUTH_50 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 336 CAN_DET_CONFID_AZIMUTH_49 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 326 CAN_DET_CONFID_AZIMUTH_39 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 315 CAN_DET_CONFID_AZIMUTH_28 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 304 CAN_DET_CONFID_AZIMUTH_17 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 303 CAN_DET_CONFID_AZIMUTH_16 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 302 CAN_DET_CONFID_AZIMUTH_15 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 301 CAN_DET_CONFID_AZIMUTH_14 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 300 CAN_DET_CONFID_AZIMUTH_13 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 299 CAN_DET_CONFID_AZIMUTH_12 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 298 CAN_DET_CONFID_AZIMUTH_11 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 297 CAN_DET_CONFID_AZIMUTH_10 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 296 CAN_DET_CONFID_AZIMUTH_09 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 295 CAN_DET_CONFID_AZIMUTH_08 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 294 CAN_DET_CONFID_AZIMUTH_07 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 293 CAN_DET_CONFID_AZIMUTH_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 292 CAN_DET_CONFID_AZIMUTH_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 290 CAN_DET_CONFID_AZIMUTH_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 289 CAN_DET_CONFID_AZIMUTH_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 257 CAN_INTERFERENCE_TYPE 2 "Star PD-Like" 1 "Slow FMCW" 0 "No Interference"; +VAL_ 257 CAN_RECOMMEND_UNCONVERGE 1 "Recommended" 0 "Not Recommended"; +VAL_ 257 CAN_RADAR_ALIGN_INCOMPLETE 1 "Alignment Incomplete" 0 "Alignment Completed"; +VAL_ 257 CAN_BLOCKAGE_SIDELOBE 1 "Radar Blockage" 0 "No Radar Blockage"; +VAL_ 257 CAN_BLOCKAGE_MNR 1 "Radar Blockage" 0 "No Radar Blockage"; +VAL_ 257 CAN_RADAR_EXT_COND_NOK 1 "Too high temp or insufficient pw" 0 "External conditions OK"; +VAL_ 257 CAN_RADAR_ALIGN_OUT_RANGE 1 "Radar out of range" 0 "Radar within range"; +VAL_ 257 CAN_RADAR_ALIGN_NOT_START 1 "Radar align not started" 0 "Radar align started"; +VAL_ 257 CAN_RADAR_OVERHEAT_ERROR 1 "Radar overheat condition" 0 "No Overheat"; +VAL_ 257 CAN_RADAR_NOT_OP 1 "Radar not operational" 0 "Radar operational"; +VAL_ 257 CAN_XCVR_OPERATIONAL 1 "On" 0 "Off "; +VAL_ 288 CAN_DET_CONFID_AZIMUTH_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; diff --git a/artifacts/package_runtime/iqdbc/dbc/FORD_CADS_64.dbc b/artifacts/package_runtime/iqdbc/dbc/FORD_CADS_64.dbc new file mode 100644 index 000000000..2ae927a6f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/FORD_CADS_64.dbc @@ -0,0 +1,7289 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: +BU_: MRR +BO_ 1073741824 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX + SG_ New_Signal_943 : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ CAN_SENSOR_VANGLE_OFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX + SG_ CAN_SENSOR_FOV_VER : 0|8@0+ (1,0) [0|255] "deg" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE_QF : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE_REF : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_MMIC_Temp4 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_MMIC_Temp3 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_MMIC_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_Processor_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_CHECKSUM : 0|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_COUNTER : 0|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ CAN_VEHICLE_MODE : 0|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ CAN_USC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_USC_CAL_VER_MINOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_SMC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_HW_VERSION : 0|32@0+ (1,0) [0|4.29497e+09] "" Vector__XXX + SG_ CAN_FAC_TGT_MTG_SPACE_VER : 0|8@0+ (1,-128) [-128|127] "cm" Vector__XXX + SG_ CAN_ANGLE_MISALIGNMENT_VER : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_ANGLE_MOUNTING_VOFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX + SG_ CAN_LATCH_FAULTS : 0|64@0+ (1,0) [0|100] "" Vector__XXX + SG_ CAN_ACTIVE_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX + SG_ CAN_HISTORY_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX + SG_ CAN_SERV_ALIGN_ENABLE : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_LONG_MOUNTING_OFFSET : 0|8@0+ (0.015625,-2) [-2|1.98438] "" Vector__XXX + SG_ CAN_BEAMWIDTH_VERT : 0|7@0+ (0.125,0) [0|15.875] "deg" Vector__XXX + SG_ CAN_VEHICLE_SPEED_CALC_QF : 0|2@0+ (1,0) [0|3] "" Vector__XXX + +BO_ 34 Active_Fault_Latched_2: 8 MRR + SG_ IPMA_PCAN_DataRangeCheck : 4|1@1+ (1,0) [0|1] "" External_Tool + SG_ IPMA_PCAN_MissingMsg : 3|1@1+ (1,0) [0|1] "" External_Tool + SG_ VINSignalCompareFailure : 2|1@1+ (1,0) [0|1] "" External_Tool + SG_ ModuleNotConfiguredError : 1|1@1+ (1,0) [0|1] "" External_Tool + SG_ CarCfgNotConfiguredError : 0|1@1+ (1,0) [0|1] "" External_Tool + +BO_ 33 Active_Fault_Latched_1: 8 MRR + SG_ Active_Flt_Latched_byte7_bit7 : 63|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit6 : 62|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit5 : 61|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit4 : 60|1@1+ (1,0) [0|1] "" External_Tool + SG_ ARMtoDSPChksumFault : 59|1@1+ (1,0) [0|1] "" External_Tool + SG_ DSPtoArmChksumFault : 58|1@1+ (1,0) [0|1] "" External_Tool + SG_ HostToArmChksumFault : 57|1@1+ (1,0) [0|1] "" External_Tool + SG_ ARMtoHostChksumFault : 56|1@1+ (1,0) [0|1] "" External_Tool + SG_ LoopBWOutOfRange : 55|1@1+ (1,0) [0|1] "" External_Tool + SG_ DSPOverrunFault : 54|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte6_bit5 : 53|1@1+ (1,0) [0|1] "" External_Tool + SG_ TuningSensitivityFault : 52|1@1+ (1,0) [0|1] "" External_Tool + SG_ SaturatedTuningFreqFault : 51|1@1+ (1,0) [0|1] "" External_Tool + SG_ LocalOscPowerFault : 50|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterPowerFault : 49|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte6_bit0 : 48|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit7 : 47|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit6 : 46|1@1+ (1,0) [0|1] "" External_Tool + SG_ XCVRDeviceSPIFault : 45|1@1+ (1,0) [0|1] "" External_Tool + SG_ FreqSynthesizerSPIFault : 44|1@1+ (1,0) [0|1] "" External_Tool + SG_ AnalogConverterDevicSPIFault : 43|1@1+ (1,0) [0|1] "" External_Tool + SG_ SidelobeBlockage : 42|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit1 : 41|1@1+ (1,0) [0|1] "" External_Tool + SG_ MNRBlocked : 40|1@1+ (1,0) [0|1] "" External_Tool + SG_ ECUTempHighFault : 39|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterTempHighFault : 38|1@1+ (1,0) [0|1] "" External_Tool + SG_ AlignmentRoutineFailedFault : 37|1@1+ (1,0) [0|1] "" External_Tool + SG_ UnreasonableRadarData : 36|1@1+ (1,0) [0|1] "" External_Tool + SG_ MicroprocessorTempHighFault : 35|1@1+ (1,0) [0|1] "" External_Tool + SG_ VerticalAlignmentOutOfRange : 34|1@1+ (1,0) [0|1] "" External_Tool + SG_ HorizontalAlignmentOutOfRange : 33|1@1+ (1,0) [0|1] "" External_Tool + SG_ FactoryAlignmentMode : 32|1@1+ (1,0) [0|1] "" External_Tool + SG_ BatteryLowFault : 31|1@1+ (1,0) [0|1] "" External_Tool + SG_ BatteryHighFault : 30|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_1p25SupplyOutOfRange : 29|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte3_bit4 : 28|1@1+ (1,0) [0|1] "" External_Tool + SG_ ThermistorOutOfRange : 27|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_3p3DACSupplyOutOfRange : 26|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_3p3RAWSupplyOutOfRange : 25|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_5_SupplyOutOfRange : 24|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterIDFault : 23|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit6 : 22|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit5 : 21|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit4 : 20|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit3 : 19|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit2 : 18|1@1+ (1,0) [0|1] "" External_Tool + SG_ PCANMissingMsgFault : 17|1@1+ (1,0) [0|1] "" External_Tool + SG_ PCANBusOff : 16|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit7 : 15|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit6 : 14|1@1+ (1,0) [0|1] "" External_Tool + SG_ InstructionSetCheckFault : 13|1@1+ (1,0) [0|1] "" External_Tool + SG_ StackOverflowFault : 12|1@1+ (1,0) [0|1] "" External_Tool + SG_ WatchdogFault : 11|1@1+ (1,0) [0|1] "" External_Tool + SG_ PLLLockFault : 10|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit1 : 9|1@1+ (1,0) [0|1] "" External_Tool + SG_ RAMMemoryTestFault : 8|1@1+ (1,0) [0|1] "" External_Tool + SG_ USCValidationFault : 7|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit6 : 6|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit5 : 5|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit4 : 4|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit3 : 3|1@1+ (1,0) [0|1] "" External_Tool + SG_ KeepAliveChecksumFault : 2|1@1+ (1,0) [0|1] "" External_Tool + SG_ ProgramCalibrationFlashChecksum : 1|1@1+ (1,0) [0|1] "" External_Tool + SG_ ApplicationFlashChecksumFault : 0|1@1+ (1,0) [0|1] "" External_Tool + +BO_ 500 XCP_MRR_DAQ_RESP: 8 MRR + SG_ MRR_xcp_daq_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 499 XCP_MRR_DTO_RESP: 8 MRR + SG_ MRR_xcp_dto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 497 XCP_MRR_CTO_RESP: 8 MRR + SG_ MRR_xcp_cto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 1900 Ford_Diag_Resp_Phys: 8 MRR + SG_ TesterPhysicalResCCM : 7|64@0+ (1,0) [0|1.84467e+19] "" IFV_Host + +BO_ 261 MRR_Status_SerialNumber: 8 MRR + SG_ CAN_SEQUENCE_NUMBER : 55|16@0+ (1,0) [0|65535] "" External_Tool + SG_ CAN_SERIAL_NUMBER : 7|40@0+ (1,0) [0|1.09951e+12] "" External_Tool + +BO_ 264 MRR_Status_SwVersion: 8 MRR + SG_ CAN_PBL_Field_Revision : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_PBL_Promote_Revision : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Field_Revision : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Promote_Revision : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Release_Revision : 7|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_PBL_Release_Revision : 31|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 373 MRR_Header_SensorPosition: 8 MRR + SG_ CAN_SENSOR_POLARITY : 55|1@0+ (1,0) [0|1] "" External_Tool + SG_ CAN_SENSOR_LAT_OFFSET : 39|16@0+ (0.01,0) [0|655.35] "cm" External_Tool + SG_ CAN_SENSOR_LONG_OFFSET : 23|16@0+ (0.01,0) [0|655.35] "cm" External_Tool + SG_ CAN_SENSOR_HANGLE_OFFSET : 7|8@0+ (0.0625,-8) [-8|7.9375] "deg" External_Tool + +BO_ 372 MRR_Header_SensorCoverage: 8 MRR + SG_ CAN_SENSOR_FOV_HOR : 39|8@0+ (1,0) [0|255] "deg" IFV_VFP + SG_ CAN_DOPPLER_COVERAGE : 23|8@0+ (1,-128) [-128|127] "m/s" IFV_VFP + SG_ CAN_RANGE_COVERAGE : 7|8@0+ (1,0) [0|255] "m" IFV_VFP + +BO_ 371 MRR_Header_AlignmentState: 8 MRR + SG_ CAN_AUTO_ALIGN_HANGLE_QF : 13|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_ALIGNMENT_STATUS : 51|4@0+ (1,0) [0|11] "" IFV_VFP + SG_ CAN_ALIGNMENT_STATE : 55|3@0+ (1,0) [0|7] "" IFV_VFP + SG_ CAN_AUTO_ALIGN_HANGLE_REF : 11|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP + SG_ CAN_AUTO_ALIGN_HANGLE : 7|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP + +BO_ 369 MRR_Header_Timestamps: 8 MRR + SG_ CAN_DET_TIME_SINCE_MEAS : 39|11@0+ (0.1,0) [0|204.7] "ms" IFV_Host + SG_ CAN_SENSOR_TIME_STAMP : 7|32@0+ (0.1,0) [0|4.29497e+08] "ms" IFV_VFP + +BO_ 368 MRR_Header_InformationDetections: 8 MRR + SG_ CAN_ALIGN_UPDATES_DONE : 55|16@0+ (1,0) [0|65535] "" IFV_VFP + SG_ CAN_SCAN_INDEX : 31|16@0+ (1,0) [0|65535] "" IFV_VFP + SG_ CAN_NUMBER_OF_DET : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_LOOK_ID : 23|2@0+ (1,0) [0|3] "" External_Tool + SG_ CAN_LOOK_INDEX : 7|16@0+ (1,0) [0|65535] "" External_Tool + +BO_ 265 MRR_Status_Temp_Volt: 8 MRR + SG_ CAN_BATT_VOLTS : 63|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_1_25_V : 55|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_5_V : 47|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_3_3_V_RAW : 31|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_3_3_V_DAC : 15|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_MMIC_Temp1 : 39|8@0+ (1,-50) [-50|205] "C" External_Tool + SG_ CAN_Processor_Thermistor : 23|8@0+ (1,-50) [-50|205] "C" External_Tool + SG_ CAN_Processor_Temp1 : 7|8@0+ (1,-50) [-50|205] "C" External_Tool + +BO_ 291 MRR_Detection_004: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_04_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_04_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_04_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_04_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_04_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_04_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_04_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_04_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_04_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_04_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_04_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_04_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_04_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_04_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_04_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_04_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_04_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_04_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_04_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_04_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_04_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_04_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_04_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_04_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_04_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_04_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_04_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_04_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_04_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_04_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_04_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_04_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_04_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_04_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_04_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_04_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_04_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_04_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_04_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_04_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_04_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_04_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_04_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_04_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_04_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_04_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_04_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_04_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_04_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_04_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_04_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_04_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_04_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_04_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_04_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_04_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_04_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_04_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_04_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_04_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 351 MRR_Detection_064: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_64 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_64 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_64 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_64 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_64 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_64 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_64 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_64 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_64 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_64 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 350 MRR_Detection_063: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_63 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_63 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_63 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_63 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_63 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_63 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_63 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_63 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_63 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_63 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 349 MRR_Detection_062: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_62 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_62 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_62 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_62 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_62 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_62 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_62 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_62 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_62 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_62 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 348 MRR_Detection_061: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_61 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_61 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_61 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_61 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_61 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_61 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_61 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_61 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_61 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_61 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 347 MRR_Detection_060: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_60 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_60 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_60 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_60 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_60 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_60 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_60 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_60 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_60 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_60 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 346 MRR_Detection_059: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_59 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_59 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_59 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_59 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_59 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_59 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_59 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_59 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_59 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_59 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 345 MRR_Detection_058: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_58 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_58 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_58 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_58 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_58 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_58 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_58 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_58 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_58 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_58 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 344 MRR_Detection_057: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_57 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_57 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_57 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_57 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_57 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_57 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_57 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_57 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_57 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_57 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 343 MRR_Detection_056: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_56 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_56 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_56 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_56 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_56 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_56 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_56 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_56 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_56 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_56 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 342 MRR_Detection_055: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_55 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_55 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_55 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_55 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_55 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_55 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_55 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_55 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_55 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_55 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 335 MRR_Detection_048: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_48 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_48 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_48 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_48 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_48 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_48 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_48 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_48 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_48 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_48 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 334 MRR_Detection_047: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_47 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_47 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_47 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_47 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_47 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_47 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_47 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_47 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_47 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_47 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 333 MRR_Detection_046: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_46 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_46 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_46 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_46 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_46 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_46 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_46 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_46 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_46 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_46 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 332 MRR_Detection_045: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_45 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_45 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_45 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_45 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_45 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_45 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_45 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_45 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_45 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_45 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 331 MRR_Detection_044: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_44 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_44 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_44 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_44 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_44 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_44 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_44 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_44 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_44 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_44 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 330 MRR_Detection_043: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_43 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_43 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_43 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_43 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_43 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_43 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_43 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_43 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_43 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_43 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 329 MRR_Detection_042: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_42 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_42 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_42 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_42 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_42 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_42 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_42 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_42 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_42 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_42 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 328 MRR_Detection_041: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_41 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_41 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_41 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_41 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_41 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_41 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_41 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_41 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_41 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_41 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 327 MRR_Detection_040: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_40 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_40 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_40 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_40 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_40 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_40 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_40 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_40 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_40 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_40 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 325 MRR_Detection_038: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_38 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_38 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_38 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_38 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_38 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_38 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_38 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_38 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_38 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_38 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 324 MRR_Detection_037: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_37 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_37 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_37 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_37 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_37 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_37 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_37 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_37 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_37 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_37 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 323 MRR_Detection_036: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_36 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_36 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_36 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_36 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_36 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_36 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_36 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_36 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_36 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_36 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 322 MRR_Detection_035: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_35 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_35 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_35 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_35 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_35 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_35 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_35 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_35 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_35 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_35 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 321 MRR_Detection_034: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_34 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_34 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_34 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_34 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_34 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_34 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_34 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_34 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_34 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_34 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 320 MRR_Detection_033: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_33 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_33 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_33 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_33 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_33 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_33 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_33 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_33 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_33 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_33 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 319 MRR_Detection_032: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_32 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_32 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_32 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_32 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_32 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_32 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_32 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_32 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_32 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_32 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 318 MRR_Detection_031: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_31 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_31 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_31 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_31 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_31 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_31 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_31 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_31 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_31 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_31 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 317 MRR_Detection_030: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_30 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_30 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_30 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_30 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_30 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_30 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_30 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_30 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_30 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_30 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 316 MRR_Detection_029: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_29 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_29 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_29 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_29 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_29 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_29 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_29 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_29 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_29 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_29 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 314 MRR_Detection_027: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_27 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_27 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_27 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_27 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_27 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_27 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_27 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_27 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_27 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_27 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 313 MRR_Detection_026: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_26 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_26 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_26 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_26 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_26 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_26 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_26 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_26 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_26 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_26 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 312 MRR_Detection_025: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_25 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_25 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_25 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_25 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_25 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_25 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_25 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_25 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_25 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_25 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 311 MRR_Detection_024: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_24 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_24 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_24 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_24 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_24 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_24 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_24 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_24 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_24 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_24 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 310 MRR_Detection_023: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_23 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_23 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_23 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_23 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_23 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_23 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_23 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_23 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_23 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_23 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 309 MRR_Detection_022: 24 MRR + SG_ CAN_DET_CONFID_AZIMUTH_22_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_22_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_22_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_22_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_22_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_22_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_22_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_22_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_22_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_22_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_22_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_22_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_22_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_22_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_22_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_22_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_22_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_22_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_22_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_22_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_22_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_22_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_22_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_22_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_22_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_22_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_22_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_22_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_22_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_22_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 308 MRR_Detection_021: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_21_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_21_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_21_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_21_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_21_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_21_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_21_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_21_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_21_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_21_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_21_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_21_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_21_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_21_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_21_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_21_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_21_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_21_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_21_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_21_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_21_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_21_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_21_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_21_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_21_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_21_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_21_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_21_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_21_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_21_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_21_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_21_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_21_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_21_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_21_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_21_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_21_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_21_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_21_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_21_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_21_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_21_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_21_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_21_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_21_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_21_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_21_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_21_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_21_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_21_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_21_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_21_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_21_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_21_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_21_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_21_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_21_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_21_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_21_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_21_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 307 MRR_Detection_020: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_20_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_20_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_20_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_20_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_20_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_20_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_20_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_20_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_20_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_20_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_20_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_20_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_20_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_20_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_20_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_20_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_20_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_20_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_20_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_20_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_20_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_20_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_20_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_20_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_20_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_20_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_20_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_20_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_20_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_20_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_20_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_20_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_20_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_20_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_20_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_20_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_20_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_20_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_20_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_20_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_20_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_20_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_20_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_20_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_20_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_20_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_20_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_20_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_20_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_20_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_20_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_20_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_20_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_20_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_20_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_20_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_20_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_20_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_20_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_20_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 306 MRR_Detection_019: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_19_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_19_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_19_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_19_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_19_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_19_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_19_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_19_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_19_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_19_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_19_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_19_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_19_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_19_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_19_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_19_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_19_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_19_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_19_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_19_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_19_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_19_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_19_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_19_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_19_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_19_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_19_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_19_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_19_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_19_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_19_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_19_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_19_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_19_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_19_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_19_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_19_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_19_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_19_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_19_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_19_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_19_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_19_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_19_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_19_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_19_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_19_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_19_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_19_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_19_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_19_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_19_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_19_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_19_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_19_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_19_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_19_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_19_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_19_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_19_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 305 MRR_Detection_018: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_18_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_18_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_18_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_18_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_18_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_18_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_18_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_18_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_18_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_18_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_18_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_18_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_18_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_18_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_18_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_18_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_18_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_18_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_18_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_18_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_18_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_18_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_18_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_18_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_18_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_18_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_18_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_18_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_18_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_18_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_18_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_18_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_18_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_18_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_18_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_18_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_18_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_18_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_18_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_18_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_18_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_18_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_18_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_18_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_18_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_18_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_18_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_18_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_18_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_18_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_18_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_18_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_18_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_18_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_18_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_18_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_18_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_18_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_18_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_18_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 341 MRR_Detection_054: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_54 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_54 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_54 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_54 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_54 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_54 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_54 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_54 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_54 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_54 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 340 MRR_Detection_053: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_53 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_53 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_53 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_53 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_53 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_53 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_53 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_53 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_53 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_53 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 339 MRR_Detection_052: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_52 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_52 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_52 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_52 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_52 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_52 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_52 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_52 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_52 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_52 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 338 MRR_Detection_051: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_51 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_51 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_51 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_51 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_51 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_51 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_51 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_51 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_51 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_51 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 337 MRR_Detection_050: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_50 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_50 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_50 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_50 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_50 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_50 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_50 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_50 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_50 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_50 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 336 MRR_Detection_049: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_49 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_49 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_49 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_49 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_49 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_49 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_49 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_49 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_49 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_49 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 326 MRR_Detection_039: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_39 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_39 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_39 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_39 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_39 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_39 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_39 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_39 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_39 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_39 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 315 MRR_Detection_028: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_28 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_28 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_28 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_28 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_28 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_28 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_28 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_28 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_28 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_28 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 304 MRR_Detection_017: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_17_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_17_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_17_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_17_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_17_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_17_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_17_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_17_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_17_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_17_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_17_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_17_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_17_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_17_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_17_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_17_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_17_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_17_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_17_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_17_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_17_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_17_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_17_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_17_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_17_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_17_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_17_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_17_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_17_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_17_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_17_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_17_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_17_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_17_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_17_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_17_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_17_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_17_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_17_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_17_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_17_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_17_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_17_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_17_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_17_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_17_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_17_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_17_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_17_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_17_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_17_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_17_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_17_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_17_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_17_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_17_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_17_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_17_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_17_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_17_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 303 MRR_Detection_016: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_16_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_16_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_16_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_16_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_16_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_16_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_16_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_16_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_16_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_16_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_16_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_16_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_16_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_16_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_16_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_16_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_16_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_16_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_16_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_16_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_16_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_16_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_16_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_16_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_16_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_16_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_16_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_16_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_16_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_16_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_16_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_16_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_16_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_16_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_16_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_16_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_16_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_16_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_16_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_16_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_16_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_16_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_16_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_16_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_16_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_16_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_16_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_16_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_16_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_16_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_16_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_16_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_16_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_16_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_16_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_16_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_16_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_16_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_16_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_16_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 302 MRR_Detection_015: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_15_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_15_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_15_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_15_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_15_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_15_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_15_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_15_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_15_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_15_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_15_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_15_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_15_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_15_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_15_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_15_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_15_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_15_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_15_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_15_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_15_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_15_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_15_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_15_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_15_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_15_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_15_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_15_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_15_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_15_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_15_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_15_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_15_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_15_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_15_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_15_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_15_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_15_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_15_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_15_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_15_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_15_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_15_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_15_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_15_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_15_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_15_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_15_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_15_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_15_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_15_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_15_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_15_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_15_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_15_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_15_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_15_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_15_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_15_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_15_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 301 MRR_Detection_014: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_14_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_14_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_14_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_14_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_14_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_14_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_14_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_14_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_14_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_14_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_14_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_14_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_14_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_14_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_14_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_14_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_14_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_14_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_14_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_14_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_14_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_14_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_14_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_14_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_14_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_14_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_14_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_14_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_14_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_14_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_14_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_14_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_14_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_14_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_14_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_14_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_14_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_14_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_14_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_14_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_14_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_14_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_14_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_14_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_14_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_14_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_14_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_14_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_14_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_14_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_14_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_14_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_14_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_14_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_14_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_14_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_14_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_14_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_14_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_14_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 300 MRR_Detection_013: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_13_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_13_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_13_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_13_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_13_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_13_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_13_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_13_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_13_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_13_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_13_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_13_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_13_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_13_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_13_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_13_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_13_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_13_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_13_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_13_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_13_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_13_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_13_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_13_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_13_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_13_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_13_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_13_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_13_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_13_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_13_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_13_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_13_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_13_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_13_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_13_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_13_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_13_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_13_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_13_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_13_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_13_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_13_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_13_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_13_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_13_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_13_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_13_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_13_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_13_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_13_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_13_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_13_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_13_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_13_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_13_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_13_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_13_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_13_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_13_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 299 MRR_Detection_012: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_12_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_12_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_12_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_12_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_12_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_12_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_12_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_12_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_12_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_12_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_12_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_12_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_12_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_12_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_12_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_12_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_12_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_12_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_12_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_12_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_12_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_12_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_12_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_12_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_12_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_12_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_12_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_12_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_12_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_12_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_12_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_12_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_12_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_12_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_12_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_12_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_12_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_12_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_12_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_12_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_12_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_12_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_12_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_12_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_12_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_12_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_12_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_12_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_12_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_12_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_12_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_12_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_12_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_12_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_12_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_12_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_12_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_12_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_12_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_12_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 298 MRR_Detection_011: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_11_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_11_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_11_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_11_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_11_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_11_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_11_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_11_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_11_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_11_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_11_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_11_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_11_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_11_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_11_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_11_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_11_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_11_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_11_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_11_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_11_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_11_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_11_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_11_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_11_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_11_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_11_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_11_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_11_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_11_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_11_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_11_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_11_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_11_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_11_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_11_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_11_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_11_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_11_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_11_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_11_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_11_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_11_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_11_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_11_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_11_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_11_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_11_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_11_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_11_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_11_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_11_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_11_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_11_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_11_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_11_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_11_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_11_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_11_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_11_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 297 MRR_Detection_010: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_10_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_10_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_10_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_10_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_10_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_10_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_10_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_10_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_10_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_10_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_10_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_10_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_10_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_10_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_10_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_10_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_10_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_10_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_10_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_10_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_10_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_10_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_10_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_10_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_10_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_10_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_10_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_10_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_10_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_10_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_10_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_10_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_10_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_10_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_10_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_10_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_10_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_10_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_10_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_10_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_10_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_10_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_10_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_10_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_10_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_10_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_10_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_10_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_10_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_10_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_10_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_10_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_10_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_10_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_10_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_10_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_10_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_10_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_10_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_10_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 296 MRR_Detection_009: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_09_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_09_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_09_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_09_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_09_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_09_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_09_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_09_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_09_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_09_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_09_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_09_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_09_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_09_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_09_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_09_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_09_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_09_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_09_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_09_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_09_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_09_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_09_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_09_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_09_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_09_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_09_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_09_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_09_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_09_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_09_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_09_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_09_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_09_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_09_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_09_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_09_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_09_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_09_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_09_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_09_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_09_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_09_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_09_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_09_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_09_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_09_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_09_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_09_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_09_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_09_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_09_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_09_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_09_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_09_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_09_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_09_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_09_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_09_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_09_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 295 MRR_Detection_008: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_08_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_08_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_08_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_08_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_08_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_08_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_08_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_08_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_08_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_08_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_08_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_08_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_08_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_08_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_08_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_08_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_08_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_08_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_08_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_08_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_08_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_08_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_08_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_08_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_08_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_08_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_08_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_08_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_08_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_08_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_08_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_08_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_08_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_08_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_08_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_08_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_08_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_08_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_08_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_08_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_08_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_08_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_08_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_08_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_08_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_08_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_08_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_08_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_08_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_08_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_08_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_08_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_08_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_08_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_08_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_08_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_08_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_08_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_08_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_08_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 294 MRR_Detection_007: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_07_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_07_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_07_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_07_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_07_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_07_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_07_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_07_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_07_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_07_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_07_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_07_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_07_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_07_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_07_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_07_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_07_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_07_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_07_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_07_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_07_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_07_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_07_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_07_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_07_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_07_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_07_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_07_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_07_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_07_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_07_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_07_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_07_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_07_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_07_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_07_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_07_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_07_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_07_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_07_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_07_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_07_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_07_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_07_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_07_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_07_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_07_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_07_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_07_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_07_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_07_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_07_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_07_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_07_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_07_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_07_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_07_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_07_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_07_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_07_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 293 MRR_Detection_006: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_06_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_06_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_06_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_06_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_06_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_06_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_06_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_06_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_06_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_06_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_06_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_06_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_06_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_06_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_06_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_06_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_06_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_06_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_06_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_06_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_06_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_06_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_06_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_06_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_06_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_06_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_06_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_06_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_06_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_06_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_06_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_06_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_06_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_06_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_06_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_06_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_06_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_06_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_06_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_06_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_06_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_06_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_06_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_06_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_06_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_06_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_06_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_06_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_06_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_06_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_06_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_06_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_06_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_06_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_06_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_06_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_06_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_06_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_06_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_06_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 292 MRR_Detection_005: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_05_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_05_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_05_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_05_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_05_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_05_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_05_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_05_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_05_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_05_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_05_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_05_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_05_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_05_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_05_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_05_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_05_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_05_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_05_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_05_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_05_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_05_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_05_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_05_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_05_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_05_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_05_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_05_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_05_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_05_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_05_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_05_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_05_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_05_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_05_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_05_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_05_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_05_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_05_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_05_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_05_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_05_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_05_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_05_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_05_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_05_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_05_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_05_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_05_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_05_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_05_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_05_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_05_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_05_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_05_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_05_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_05_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_05_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_05_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_05_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 290 MRR_Detection_003: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_03_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_03_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_03_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_03_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_03_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_03_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_03_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_03_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_03_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_03_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_03_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_03_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_03_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_03_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_03_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_03_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_03_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_03_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_03_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_03_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_03_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_03_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_03_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_03_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_03_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_03_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_03_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_03_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_03_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_03_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_03_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_03_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_03_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_03_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_03_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_03_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_03_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_03_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_03_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_03_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_03_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_03_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_03_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_03_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_03_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_03_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_03_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_03_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_03_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_03_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_03_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_03_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_03_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_03_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_03_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_03_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_03_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_03_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_03_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_03_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 289 MRR_Detection_002: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_02_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_02_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_02_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_02_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_02_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_02_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_02_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_02_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_02_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_02_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_02_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_02_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_02_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_02_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_02_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_02_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_02_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_02_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_02_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_02_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_02_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_02_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_02_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_02_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_02_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_02_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_02_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_02_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_02_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_02_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_02_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_02_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_02_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_02_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_02_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_02_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_02_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_02_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_02_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_02_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_02_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_02_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_02_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_02_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_02_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_02_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_02_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_02_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_02_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_02_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_02_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_02_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_02_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_02_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_02_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_02_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_02_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_02_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_02_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_02_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 256 MRR_Status_CANVersion: 8 MRR + SG_ CAN_USC_SECTION_COMPATIBILITY : 23|16@0+ (1,0) [0|65535] "" External_Tool + SG_ CAN_PCAN_MINOR_MRR : 7|8@0+ (1,0) [0|255] "" IFV_VFP + SG_ CAN_PCAN_MAJOR_MRR : 15|8@0+ (1,0) [0|255] "" IFV_VFP + +BO_ 257 MRR_Status_Radar: 8 MRR + SG_ CAN_INTERFERENCE_TYPE : 11|2@0+ (1,0) [0|3] "" IFV_Host + SG_ CAN_RECOMMEND_UNCONVERGE : 9|1@0+ (1,0) [0|1] "" IFV_Host + SG_ CAN_BLOCKAGE_SIDELOBE_FILTER_VAL : 15|4@0+ (1,0) [0|15] "" IFV_Host + SG_ CAN_RADAR_ALIGN_INCOMPLETE : 8|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_BLOCKAGE_SIDELOBE : 4|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_BLOCKAGE_MNR : 5|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_EXT_COND_NOK : 1|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_ALIGN_OUT_RANGE : 2|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_ALIGN_NOT_START : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_OVERHEAT_ERROR : 3|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_NOT_OP : 6|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_XCVR_OPERATIONAL : 7|1@0+ (1,0) [0|1] "" IFV_VFP + +BO_ 288 MRR_Detection_001: 64 MRR + SG_ CAN_DET_CONFID_AZIMUTH_01_01 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_01_01 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_01_01 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_01_01 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_01_01 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_01_01 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_01_01 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_01_01 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_01_01 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_01_01 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_01_02 : 105|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_01_02 : 128|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_01_02 : 120|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_01_02 : 121|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_01_02 : 72|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_01_02 : 119|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_01_02 : 103|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_01_02 : 87|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_01_02 : 79|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_01_02 : 89|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_01_03 : 177|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_01_03 : 200|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_01_03 : 192|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_01_03 : 193|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_01_03 : 144|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_01_03 : 191|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_01_03 : 175|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_01_03 : 159|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_01_03 : 151|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_01_03 : 161|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_01_04 : 249|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_01_04 : 272|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_01_04 : 264|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_01_04 : 265|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_01_04 : 216|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_01_04 : 263|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_01_04 : 247|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_01_04 : 231|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_01_04 : 223|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_01_04 : 233|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_01_05 : 321|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_01_05 : 344|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_01_05 : 336|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_01_05 : 337|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_01_05 : 288|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_01_05 : 335|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_01_05 : 319|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_01_05 : 303|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_01_05 : 295|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_01_05 : 305|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_CONFID_AZIMUTH_01_06 : 393|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_01_06 : 416|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_01_06 : 408|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_01_06 : 409|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_01_06 : 360|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_01_06 : 407|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_01_06 : 391|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_01_06 : 375|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_01_06 : 367|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_01_06 : 377|2@0+ (1,0) [0|3] "" IFV_VFP + +BA_DEF_ SG_ "CrossOver_InfoCAN" ENUM "No","Yes"; +BA_DEF_ SG_ "CrossOver_LIN" ENUM "No","Yes","No","Yes"; +BA_DEF_ SG_ "UsedOnPgmDBC" ENUM "No","Yes","No","Yes","No","Yes"; +BA_DEF_ SG_ "ContentDependant" ENUM "No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ SG_ "GenSigTimeoutTime_RCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_GWM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_OCS" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_ABS_ESC" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_CCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_IPMA" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_TSTR" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_SCCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_PSCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime__delete" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_Generic_BCM" INT 0 100000; +BA_DEF_ BO_ "NmMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "DiagResponse" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "DiagRequest" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "TpTxIndex" INT 0 255; +BA_DEF_ BO_ "DiagState" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "TpApplType" STRING ; +BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "Mulitplexer" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "ConfiguredTransmitter" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "EventRateOfChange" INT 10 10000; +BA_DEF_ BO_ "GenMsgHandlingTypeDoc" STRING ; +BA_DEF_ BO_ "GenMsgHandlingTypeCode" STRING ; +BA_DEF_ BO_ "GenMsgMarked" STRING ; +BA_DEF_ SG_ "GenSigMarked" STRING ; +BA_DEF_ SG_ "GenSigVtIndex" STRING ; +BA_DEF_ SG_ "GenSigVtName" STRING ; +BA_DEF_ SG_ "GenSigVtEn" STRING ; +BA_DEF_ SG_ "GenSigSNA" STRING ; +BA_DEF_ SG_ "GenSigCmt" STRING ; +BA_DEF_ BO_ "GenMsgCmt" STRING ; +BA_DEF_ SG_ "GenSigSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType"; +BA_DEF_ SG_ "GenSigInactiveValue" INT 0 100000; +BA_DEF_ SG_ "GenSigMissingSourceValue" INT 0 1e+09; +BA_DEF_ SG_ "WakeupSignal" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes"; +BA_DEF_ SG_ "GenSigStartValue" INT 0 1e+09; +BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes"; +BA_DEF_ BO_ "NetworkInitializationCommand" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "GenMsgSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType"; +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 100000; +BA_DEF_ BO_ "GenMsgDelayTime" INT 0 1000; +BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100; +BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 10000; +BA_DEF_ BO_ "NetworkInitialization" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes"; +BA_DEF_ BO_ "MessageGateway" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes"; +BA_DEF_ BU_ "ILUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BU_ "NetworkInitializationUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BU_ "PowerType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes","Switched","Latched","Sleep","vector_leerstring","vector_leerstring"; +BA_DEF_ BU_ "NodeStartUpTime" INT 0 10000; +BA_DEF_ BU_ "NodeWakeUpTime" INT 0 10000; +BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ; +BA_DEF_ BO_ "GenMsgForegroundColor" STRING ; +BA_ "GenMsgCycleTime" BO_ 34 1000; +BA_ "GenMsgSendType" BO_ 34 0; +BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck"; +BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck"; +BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg"; +BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg"; +BA_ "GenSigVtEn" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure"; +BA_ "GenSigVtName" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure"; +BA_ "GenSigVtEn" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError"; +BA_ "GenSigVtName" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError"; +BA_ "GenSigVtEn" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError"; +BA_ "GenSigVtName" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError"; +BA_ "GenMsgCycleTime" BO_ 33 1000; +BA_ "GenMsgSendType" BO_ 33 0; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4"; +BA_ "GenSigVtEn" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault"; +BA_ "GenSigVtName" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault"; +BA_ "GenSigVtEn" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault"; +BA_ "GenSigVtName" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault"; +BA_ "GenSigVtEn" SG_ 33 HostToArmChksumFault "HostToArmChksumFault"; +BA_ "GenSigVtName" SG_ 33 HostToArmChksumFault "HostToArmChksumFault"; +BA_ "GenSigVtEn" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault"; +BA_ "GenSigVtName" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault"; +BA_ "GenSigVtEn" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange"; +BA_ "GenSigVtName" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 DSPOverrunFault "DSPOverrunFault"; +BA_ "GenSigVtName" SG_ 33 DSPOverrunFault "DSPOverrunFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5"; +BA_ "GenSigVtEn" SG_ 33 TuningSensitivityFault "TuningSensitivityFault"; +BA_ "GenSigVtName" SG_ 33 TuningSensitivityFault "TuningSensitivityFault"; +BA_ "GenSigVtEn" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault"; +BA_ "GenSigVtName" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault"; +BA_ "GenSigVtEn" SG_ 33 LocalOscPowerFault "LocalOscPowerFault"; +BA_ "GenSigVtName" SG_ 33 LocalOscPowerFault "LocalOscPowerFault"; +BA_ "GenSigVtEn" SG_ 33 TransmitterPowerFault "TransmitterPowerFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterPowerFault "TransmitterPowerFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6"; +BA_ "GenSigVtEn" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault"; +BA_ "GenSigVtName" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault"; +BA_ "GenSigVtEn" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault"; +BA_ "GenSigVtName" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault"; +BA_ "GenSigVtEn" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault"; +BA_ "GenSigVtName" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault"; +BA_ "GenSigVtEn" SG_ 33 SidelobeBlockage "SidelobeBlockage"; +BA_ "GenSigVtName" SG_ 33 SidelobeBlockage "SidelobeBlockage"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1"; +BA_ "GenSigVtEn" SG_ 33 MNRBlocked "MNRBlocked"; +BA_ "GenSigVtName" SG_ 33 MNRBlocked "MNRBlocked"; +BA_ "GenSigVtEn" SG_ 33 ECUTempHighFault "ECUTempHighFault"; +BA_ "GenSigVtName" SG_ 33 ECUTempHighFault "ECUTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault"; +BA_ "GenSigVtName" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault"; +BA_ "GenSigVtEn" SG_ 33 UnreasonableRadarData "UnreasonableRadarData"; +BA_ "GenSigVtName" SG_ 33 UnreasonableRadarData "UnreasonableRadarData"; +BA_ "GenSigVtEn" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault"; +BA_ "GenSigVtName" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange"; +BA_ "GenSigVtName" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange"; +BA_ "GenSigVtName" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode"; +BA_ "GenSigVtName" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode"; +BA_ "GenSigVtEn" SG_ 33 BatteryLowFault "BatteryLowFault"; +BA_ "GenSigVtName" SG_ 33 BatteryLowFault "BatteryLowFault"; +BA_ "GenSigVtEn" SG_ 33 BatteryHighFault "BatteryHighFault"; +BA_ "GenSigVtName" SG_ 33 BatteryHighFault "BatteryHighFault"; +BA_ "GenSigVtEn" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4"; +BA_ "GenSigVtEn" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange"; +BA_ "GenSigVtName" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 TransmitterIDFault "TransmitterIDFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterIDFault "TransmitterIDFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2"; +BA_ "GenSigVtEn" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault"; +BA_ "GenSigVtName" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault"; +BA_ "GenSigVtEn" SG_ 33 PCANBusOff "PCANBusOff"; +BA_ "GenSigVtName" SG_ 33 PCANBusOff "PCANBusOff"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6"; +BA_ "GenSigVtEn" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault"; +BA_ "GenSigVtName" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault"; +BA_ "GenSigVtEn" SG_ 33 StackOverflowFault "StackOverflowFault"; +BA_ "GenSigVtName" SG_ 33 StackOverflowFault "StackOverflowFault"; +BA_ "GenSigVtEn" SG_ 33 WatchdogFault "WatchdogFault"; +BA_ "GenSigVtName" SG_ 33 WatchdogFault "WatchdogFault"; +BA_ "GenSigVtEn" SG_ 33 PLLLockFault "PLLLockFault"; +BA_ "GenSigVtName" SG_ 33 PLLLockFault "PLLLockFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1"; +BA_ "GenSigVtEn" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault"; +BA_ "GenSigVtName" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault"; +BA_ "GenSigVtName" SG_ 33 USCValidationFault "USCValidationFault"; +BA_ "GenSigVtEn" SG_ 33 USCValidationFault "USCValidationFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3"; +BA_ "GenSigVtEn" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault"; +BA_ "GenSigVtName" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault"; +BA_ "GenSigVtEn" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum"; +BA_ "GenSigVtName" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum"; +BA_ "GenSigVtEn" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault"; +BA_ "GenSigVtName" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault"; +BA_ "GenMsgNrOfRepetition" BO_ 500 0; +BA_ "GenMsgSendType" BO_ 500 1; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte7 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte7 "MRR_xcp_daq_resp_byte7"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte6 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte6 "MRR_xcp_daq_resp_byte6"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte5 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte5 "MRR_xcp_daq_resp_byte5"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte4 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte4 "MRR_xcp_daq_resp_byte4"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte3 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte3 "MRR_xcp_daq_resp_byte3"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte2 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte2 "MRR_xcp_daq_resp_byte2"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte1 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte1 "MRR_xcp_daq_resp_byte1"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte0 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte0 "MRR_xcp_daq_resp_byte0"; +BA_ "GenMsgNrOfRepetition" BO_ 499 0; +BA_ "GenMsgSendType" BO_ 499 1; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte7 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte7 "MRR_xcp_dto_resp_byte7"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte6 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte6 "MRR_xcp_dto_resp_byte6"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte5 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte5 "MRR_xcp_dto_resp_byte5"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte4 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte4 "MRR_xcp_dto_resp_byte4"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte3 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte3 "MRR_xcp_dto_resp_byte3"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte2 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte2 "MRR_xcp_dto_resp_byte2"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte1 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte1 "MRR_xcp_dto_resp_byte1"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte0 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte0 "MRR_xcp_dto_resp_byte0"; +BA_ "GenMsgNrOfRepetition" BO_ 497 0; +BA_ "GenMsgSendType" BO_ 497 1; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte7 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte7 "MRR_xcp_cto_resp_byte7"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte6 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte6 "MRR_xcp_cto_resp_byte6"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte5 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte5 "MRR_xcp_cto_resp_byte5"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte4 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte4 "MRR_xcp_cto_resp_byte4"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte3 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte3 "MRR_xcp_cto_resp_byte3"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte2 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte2 "MRR_xcp_cto_resp_byte2"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte1 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte1 "MRR_xcp_cto_resp_byte1"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte0 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte0 "MRR_xcp_cto_resp_byte0"; +BA_ "GenMsgSendType" BO_ 1900 1; +BA_ "GenMsgNrOfRepetition" BO_ 1900 0; +BA_ "DiagResponse" BO_ 1900 1; +BA_ "GenSigCmt" SG_ 1900 TesterPhysicalResCCM "TesterPhysicalResCCM"; +BA_ "GenSigSendType" SG_ 1900 TesterPhysicalResCCM 0; +BA_ "GenMsgSendType" BO_ 261 0; +BA_ "GenMsgCycleTime" BO_ 261 1000; +BA_ "GenMsgNrOfRepetition" BO_ 261 0; +BA_ "GenSigCmt" SG_ 261 CAN_SEQUENCE_NUMBER "CAN_SEQUENCE_NUMBER"; +BA_ "GenSigCmt" SG_ 261 CAN_SERIAL_NUMBER "CAN_SERIAL_NUMBER"; +BA_ "GenSigSendType" SG_ 261 CAN_SERIAL_NUMBER 0; +BA_ "GenMsgSendType" BO_ 264 1; +BA_ "GenMsgNrOfRepetition" BO_ 264 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Field_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Promote_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Field_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Promote_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Release_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Release_Revision 0; +BA_ "GenMsgSendType" BO_ 373 1; +BA_ "NetworkInitialization" BO_ 373 0; +BA_ "GenMsgNrOfRepetition" BO_ 373 0; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_POLARITY 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_POLARITY "CAN_SENSOR_POLARITY"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LAT_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LAT_OFFSET "CAN_SENSOR_LAT_OFFSET"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LONG_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LONG_OFFSET "CAN_SENSOR_LONG_OFFSET"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_HANGLE_OFFSET "CAN_SENSOR_HANGLE_OFFSET"; +BA_ "GenSigStartValue" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0; +BA_ "GenMsgSendType" BO_ 372 1; +BA_ "NetworkInitialization" BO_ 372 0; +BA_ "GenMsgNrOfRepetition" BO_ 372 0; +BA_ "GenSigSendType" SG_ 372 CAN_SENSOR_FOV_HOR 0; +BA_ "GenSigCmt" SG_ 372 CAN_SENSOR_FOV_HOR "CAN_SENSOR_FOV_HOR"; +BA_ "GenSigStartValue" SG_ 372 CAN_SENSOR_FOV_HOR 0; +BA_ "GenSigSendType" SG_ 372 CAN_DOPPLER_COVERAGE 0; +BA_ "GenSigCmt" SG_ 372 CAN_DOPPLER_COVERAGE "CAN_DOPPLER_COVERAGE"; +BA_ "GenSigStartValue" SG_ 372 CAN_DOPPLER_COVERAGE 0; +BA_ "GenSigSendType" SG_ 372 CAN_RANGE_COVERAGE 0; +BA_ "GenSigCmt" SG_ 372 CAN_RANGE_COVERAGE "CAN_RANGE_COVERAGE"; +BA_ "GenMsgSendType" BO_ 371 1; +BA_ "NetworkInitialization" BO_ 371 0; +BA_ "GenMsgNrOfRepetition" BO_ 371 0; +BA_ "GenSigVtEn" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigVtName" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATUS 0; +BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATE 0; +BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0; +BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF "CAN_AUTO_ALIGN_HANGLE_REF"; +BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE "CAN_AUTO_ALIGN_HANGLE"; +BA_ "GenMsgSendType" BO_ 369 1; +BA_ "NetworkInitialization" BO_ 369 0; +BA_ "GenMsgNrOfRepetition" BO_ 369 0; +BA_ "GenSigCmt" SG_ 369 CAN_DET_TIME_SINCE_MEAS "CAN_DET_TIME_SINCE_MEAS"; +BA_ "GenSigSendType" SG_ 369 CAN_DET_TIME_SINCE_MEAS 0; +BA_ "GenSigSendType" SG_ 369 CAN_SENSOR_TIME_STAMP 0; +BA_ "GenSigCmt" SG_ 369 CAN_SENSOR_TIME_STAMP "CAN_SENSOR_TIME_STAMP"; +BA_ "GenMsgSendType" BO_ 368 1; +BA_ "NetworkInitialization" BO_ 368 0; +BA_ "GenMsgNrOfRepetition" BO_ 368 0; +BA_ "GenSigSendType" SG_ 368 CAN_ALIGN_UPDATES_DONE 0; +BA_ "GenSigCmt" SG_ 368 CAN_ALIGN_UPDATES_DONE "CAN_ALIGN_UPDATES_DONE"; +BA_ "GenSigSendType" SG_ 368 CAN_SCAN_INDEX 0; +BA_ "GenSigCmt" SG_ 368 CAN_SCAN_INDEX "CAN_SCAN_INDEX"; +BA_ "GenSigSendType" SG_ 368 CAN_NUMBER_OF_DET 0; +BA_ "GenSigCmt" SG_ 368 CAN_NUMBER_OF_DET "CAN_NUMBER_OF_DET"; +BA_ "GenSigSendType" SG_ 368 CAN_LOOK_ID 0; +BA_ "GenSigCmt" SG_ 368 CAN_LOOK_ID "CAN_LOOK_ID"; +BA_ "GenSigSendType" SG_ 368 CAN_LOOK_INDEX 0; +BA_ "GenSigCmt" SG_ 368 CAN_LOOK_INDEX "CAN_LOOK_INDEX"; +BA_ "GenMsgSendType" BO_ 265 1; +BA_ "NetworkInitialization" BO_ 265 0; +BA_ "GenMsgNrOfRepetition" BO_ 265 0; +BA_ "GenSigCmt" SG_ 265 CAN_BATT_VOLTS "CAN_BATT_VOLTS"; +BA_ "GenSigCmt" SG_ 265 CAN_1_25_V "CAN_1_25_V"; +BA_ "GenSigCmt" SG_ 265 CAN_5_V "CAN_5_V"; +BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_RAW "CAN_3_3_V_RAW"; +BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_DAC "CAN_3_3_V_DAC"; +BA_ "GenSigSendType" SG_ 265 CAN_MMIC_Temp1 0; +BA_ "GenSigCmt" SG_ 265 CAN_MMIC_Temp1 "CAN_MMIC_Temp1"; +BA_ "GenSigStartValue" SG_ 265 CAN_MMIC_Temp1 0; +BA_ "GenSigSendType" SG_ 265 CAN_Processor_Thermistor 0; +BA_ "GenSigCmt" SG_ 265 CAN_Processor_Thermistor "CAN_Processor_Thermistor"; +BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Thermistor 0; +BA_ "GenSigSendType" SG_ 265 CAN_Processor_Temp1 0; +BA_ "GenSigCmt" SG_ 265 CAN_Processor_Temp1 "CAN_Processor_Temp1"; +BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Temp1 0; +BA_ "GenMsgSendType" BO_ 291 1; +BA_ "GenMsgILSupport" BO_ 291 1; +BA_ "GenMsgNrOfRepetition" BO_ 291 0; +BA_ "GenMsgCycleTime" BO_ 291 0; +BA_ "NetworkInitialization" BO_ 291 0; +BA_ "GenMsgDelayTime" BO_ 291 0; +BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_01 "CAN_DET_CONFID_AZIMUTH_04_01"; +BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_01 "CAN_DET_CONFID_AZIMUTH_04_01"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_01 "CAN_DET_CONFID_AZIMUTH_04_01"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_01 "CAN_DET_SUPER_RES_TARGET_04_01"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_01 "CAN_DET_ND_TARGET_04_01"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_01 "CAN_DET_HOST_VEH_CLUTTER_04_01"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_01 "CAN_DET_VALID_LEVEL_04_01"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_01 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_01 "CAN_DET_AZIMUTH_04_01"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_01 "CAN_DET_RANGE_04_01"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_01 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_01 "CAN_DET_RANGE_RATE_04_01"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_01 "CAN_DET_AMPLITUDE_04_01"; +BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_01 0; +BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_01 "CAN_SCAN_INDEX_2LSB_04_01"; +BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_02 "CAN_DET_CONFID_AZIMUTH_04_02"; +BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_02 "CAN_DET_CONFID_AZIMUTH_04_02"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_02 "CAN_DET_CONFID_AZIMUTH_04_02"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_02 "CAN_DET_SUPER_RES_TARGET_04_02"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_02 "CAN_DET_ND_TARGET_04_02"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_02 "CAN_DET_HOST_VEH_CLUTTER_04_02"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_02 "CAN_DET_VALID_LEVEL_04_02"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_02 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_02 "CAN_DET_AZIMUTH_04_02"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_02 "CAN_DET_RANGE_04_02"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_02 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_02 "CAN_DET_RANGE_RATE_04_02"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_02 "CAN_DET_AMPLITUDE_04_02"; +BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_02 0; +BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_02 "CAN_SCAN_INDEX_2LSB_04_02"; +BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_03 "CAN_DET_CONFID_AZIMUTH_04_03"; +BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_03 "CAN_DET_CONFID_AZIMUTH_04_03"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_03 "CAN_DET_CONFID_AZIMUTH_04_03"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_03 "CAN_DET_SUPER_RES_TARGET_04_03"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_03 "CAN_DET_ND_TARGET_04_03"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_03 "CAN_DET_HOST_VEH_CLUTTER_04_03"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_03 "CAN_DET_VALID_LEVEL_04_03"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_03 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_03 "CAN_DET_AZIMUTH_04_03"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_03 "CAN_DET_RANGE_04_03"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_03 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_03 "CAN_DET_RANGE_RATE_04_03"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_03 "CAN_DET_AMPLITUDE_04_03"; +BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_03 0; +BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_03 "CAN_SCAN_INDEX_2LSB_04_03"; +BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_04 "CAN_DET_CONFID_AZIMUTH_04_04"; +BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_04 "CAN_DET_CONFID_AZIMUTH_04_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_04 "CAN_DET_CONFID_AZIMUTH_04_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_04 "CAN_DET_SUPER_RES_TARGET_04_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_04 "CAN_DET_ND_TARGET_04_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_04 "CAN_DET_HOST_VEH_CLUTTER_04_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_04 "CAN_DET_VALID_LEVEL_04_04"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_04 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_04 "CAN_DET_AZIMUTH_04_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_04 "CAN_DET_RANGE_04_04"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_04 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_04 "CAN_DET_RANGE_RATE_04_04"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_04 "CAN_DET_AMPLITUDE_04_04"; +BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_04 0; +BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_04 "CAN_SCAN_INDEX_2LSB_04_04"; +BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_05 "CAN_DET_CONFID_AZIMUTH_04_05"; +BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_05 "CAN_DET_CONFID_AZIMUTH_04_05"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_05 "CAN_DET_CONFID_AZIMUTH_04_05"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_05 "CAN_DET_SUPER_RES_TARGET_04_05"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_05 "CAN_DET_ND_TARGET_04_05"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_05 "CAN_DET_HOST_VEH_CLUTTER_04_05"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_05 "CAN_DET_VALID_LEVEL_04_05"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_05 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_05 "CAN_DET_AZIMUTH_04_05"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_05 "CAN_DET_RANGE_04_05"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_05 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_05 "CAN_DET_RANGE_RATE_04_05"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_05 "CAN_DET_AMPLITUDE_04_05"; +BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_05 0; +BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_05 "CAN_SCAN_INDEX_2LSB_04_05"; +BA_ "GenSigVtEn" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_06 "CAN_DET_CONFID_AZIMUTH_04_06"; +BA_ "GenSigVtName" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_06 "CAN_DET_CONFID_AZIMUTH_04_06"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_CONFID_AZIMUTH_04_06 "CAN_DET_CONFID_AZIMUTH_04_06"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_SUPER_RES_TARGET_04_06 "CAN_DET_SUPER_RES_TARGET_04_06"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_ND_TARGET_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_ND_TARGET_04_06 "CAN_DET_ND_TARGET_04_06"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_HOST_VEH_CLUTTER_04_06 "CAN_DET_HOST_VEH_CLUTTER_04_06"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_VALID_LEVEL_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_VALID_LEVEL_04_06 "CAN_DET_VALID_LEVEL_04_06"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_AZIMUTH_04_06 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AZIMUTH_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AZIMUTH_04_06 "CAN_DET_AZIMUTH_04_06"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_04_06 "CAN_DET_RANGE_04_06"; +BA_ "GenSigStartValue" SG_ 291 CAN_DET_RANGE_RATE_04_06 0; +BA_ "GenSigSendType" SG_ 291 CAN_DET_RANGE_RATE_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_RANGE_RATE_04_06 "CAN_DET_RANGE_RATE_04_06"; +BA_ "GenSigSendType" SG_ 291 CAN_DET_AMPLITUDE_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_DET_AMPLITUDE_04_06 "CAN_DET_AMPLITUDE_04_06"; +BA_ "GenSigSendType" SG_ 291 CAN_SCAN_INDEX_2LSB_04_06 0; +BA_ "GenSigCmt" SG_ 291 CAN_SCAN_INDEX_2LSB_04_06 "CAN_SCAN_INDEX_2LSB_04_06"; +BA_ "GenMsgSendType" BO_ 351 1; +BA_ "GenMsgILSupport" BO_ 351 1; +BA_ "GenMsgNrOfRepetition" BO_ 351 0; +BA_ "GenMsgCycleTime" BO_ 351 0; +BA_ "NetworkInitialization" BO_ 351 0; +BA_ "GenMsgDelayTime" BO_ 351 0; +BA_ "GenSigVtEn" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigVtName" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 "CAN_DET_SUPER_RES_TARGET_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_ND_TARGET_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_ND_TARGET_64 "CAN_DET_ND_TARGET_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 "CAN_DET_HOST_VEH_CLUTTER_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_VALID_LEVEL_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_VALID_LEVEL_64 "CAN_DET_VALID_LEVEL_64"; +BA_ "GenSigStartValue" SG_ 351 CAN_DET_AZIMUTH_64 0; +BA_ "GenSigSendType" SG_ 351 CAN_DET_AZIMUTH_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_AZIMUTH_64 "CAN_DET_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_64 "CAN_DET_RANGE_64"; +BA_ "GenSigStartValue" SG_ 351 CAN_DET_RANGE_RATE_64 0; +BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_RATE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_RATE_64 "CAN_DET_RANGE_RATE_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_AMPLITUDE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_AMPLITUDE_64 "CAN_DET_AMPLITUDE_64"; +BA_ "GenSigSendType" SG_ 351 CAN_SCAN_INDEX_2LSB_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_SCAN_INDEX_2LSB_64 "CAN_SCAN_INDEX_2LSB_64"; +BA_ "GenMsgSendType" BO_ 350 1; +BA_ "GenMsgILSupport" BO_ 350 1; +BA_ "GenMsgNrOfRepetition" BO_ 350 0; +BA_ "GenMsgCycleTime" BO_ 350 0; +BA_ "NetworkInitialization" BO_ 350 0; +BA_ "GenMsgDelayTime" BO_ 350 0; +BA_ "GenSigVtEn" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigVtName" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 "CAN_DET_SUPER_RES_TARGET_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_ND_TARGET_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_ND_TARGET_63 "CAN_DET_ND_TARGET_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 "CAN_DET_HOST_VEH_CLUTTER_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_VALID_LEVEL_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_VALID_LEVEL_63 "CAN_DET_VALID_LEVEL_63"; +BA_ "GenSigStartValue" SG_ 350 CAN_DET_AZIMUTH_63 0; +BA_ "GenSigSendType" SG_ 350 CAN_DET_AZIMUTH_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_AZIMUTH_63 "CAN_DET_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_63 "CAN_DET_RANGE_63"; +BA_ "GenSigStartValue" SG_ 350 CAN_DET_RANGE_RATE_63 0; +BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_RATE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_RATE_63 "CAN_DET_RANGE_RATE_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_AMPLITUDE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_AMPLITUDE_63 "CAN_DET_AMPLITUDE_63"; +BA_ "GenSigSendType" SG_ 350 CAN_SCAN_INDEX_2LSB_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_SCAN_INDEX_2LSB_63 "CAN_SCAN_INDEX_2LSB_63"; +BA_ "GenMsgSendType" BO_ 349 1; +BA_ "GenMsgILSupport" BO_ 349 1; +BA_ "GenMsgNrOfRepetition" BO_ 349 0; +BA_ "GenMsgCycleTime" BO_ 349 0; +BA_ "NetworkInitialization" BO_ 349 0; +BA_ "GenMsgDelayTime" BO_ 349 0; +BA_ "GenSigVtEn" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigVtName" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 "CAN_DET_SUPER_RES_TARGET_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_ND_TARGET_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_ND_TARGET_62 "CAN_DET_ND_TARGET_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 "CAN_DET_HOST_VEH_CLUTTER_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_VALID_LEVEL_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_VALID_LEVEL_62 "CAN_DET_VALID_LEVEL_62"; +BA_ "GenSigStartValue" SG_ 349 CAN_DET_AZIMUTH_62 0; +BA_ "GenSigSendType" SG_ 349 CAN_DET_AZIMUTH_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_AZIMUTH_62 "CAN_DET_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_62 "CAN_DET_RANGE_62"; +BA_ "GenSigStartValue" SG_ 349 CAN_DET_RANGE_RATE_62 0; +BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_RATE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_RATE_62 "CAN_DET_RANGE_RATE_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_AMPLITUDE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_AMPLITUDE_62 "CAN_DET_AMPLITUDE_62"; +BA_ "GenSigSendType" SG_ 349 CAN_SCAN_INDEX_2LSB_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_SCAN_INDEX_2LSB_62 "CAN_SCAN_INDEX_2LSB_62"; +BA_ "GenMsgSendType" BO_ 348 1; +BA_ "GenMsgILSupport" BO_ 348 1; +BA_ "GenMsgNrOfRepetition" BO_ 348 0; +BA_ "GenMsgCycleTime" BO_ 348 0; +BA_ "NetworkInitialization" BO_ 348 0; +BA_ "GenMsgDelayTime" BO_ 348 0; +BA_ "GenSigVtEn" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigVtName" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 "CAN_DET_SUPER_RES_TARGET_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_ND_TARGET_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_ND_TARGET_61 "CAN_DET_ND_TARGET_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 "CAN_DET_HOST_VEH_CLUTTER_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_VALID_LEVEL_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_VALID_LEVEL_61 "CAN_DET_VALID_LEVEL_61"; +BA_ "GenSigStartValue" SG_ 348 CAN_DET_AZIMUTH_61 0; +BA_ "GenSigSendType" SG_ 348 CAN_DET_AZIMUTH_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_AZIMUTH_61 "CAN_DET_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_61 "CAN_DET_RANGE_61"; +BA_ "GenSigStartValue" SG_ 348 CAN_DET_RANGE_RATE_61 0; +BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_RATE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_RATE_61 "CAN_DET_RANGE_RATE_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_AMPLITUDE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_AMPLITUDE_61 "CAN_DET_AMPLITUDE_61"; +BA_ "GenSigSendType" SG_ 348 CAN_SCAN_INDEX_2LSB_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_SCAN_INDEX_2LSB_61 "CAN_SCAN_INDEX_2LSB_61"; +BA_ "GenMsgSendType" BO_ 347 1; +BA_ "GenMsgILSupport" BO_ 347 1; +BA_ "GenMsgNrOfRepetition" BO_ 347 0; +BA_ "GenMsgCycleTime" BO_ 347 0; +BA_ "NetworkInitialization" BO_ 347 0; +BA_ "GenMsgDelayTime" BO_ 347 0; +BA_ "GenSigVtEn" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigVtName" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 "CAN_DET_SUPER_RES_TARGET_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_ND_TARGET_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_ND_TARGET_60 "CAN_DET_ND_TARGET_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 "CAN_DET_HOST_VEH_CLUTTER_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_VALID_LEVEL_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_VALID_LEVEL_60 "CAN_DET_VALID_LEVEL_60"; +BA_ "GenSigStartValue" SG_ 347 CAN_DET_AZIMUTH_60 0; +BA_ "GenSigSendType" SG_ 347 CAN_DET_AZIMUTH_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_AZIMUTH_60 "CAN_DET_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_60 "CAN_DET_RANGE_60"; +BA_ "GenSigStartValue" SG_ 347 CAN_DET_RANGE_RATE_60 0; +BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_RATE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_RATE_60 "CAN_DET_RANGE_RATE_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_AMPLITUDE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_AMPLITUDE_60 "CAN_DET_AMPLITUDE_60"; +BA_ "GenSigSendType" SG_ 347 CAN_SCAN_INDEX_2LSB_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_SCAN_INDEX_2LSB_60 "CAN_SCAN_INDEX_2LSB_60"; +BA_ "GenMsgSendType" BO_ 346 1; +BA_ "GenMsgILSupport" BO_ 346 1; +BA_ "GenMsgNrOfRepetition" BO_ 346 0; +BA_ "GenMsgCycleTime" BO_ 346 0; +BA_ "NetworkInitialization" BO_ 346 0; +BA_ "GenMsgDelayTime" BO_ 346 0; +BA_ "GenSigVtEn" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigVtName" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 "CAN_DET_SUPER_RES_TARGET_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_ND_TARGET_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_ND_TARGET_59 "CAN_DET_ND_TARGET_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 "CAN_DET_HOST_VEH_CLUTTER_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_VALID_LEVEL_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_VALID_LEVEL_59 "CAN_DET_VALID_LEVEL_59"; +BA_ "GenSigStartValue" SG_ 346 CAN_DET_AZIMUTH_59 0; +BA_ "GenSigSendType" SG_ 346 CAN_DET_AZIMUTH_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_AZIMUTH_59 "CAN_DET_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_59 "CAN_DET_RANGE_59"; +BA_ "GenSigStartValue" SG_ 346 CAN_DET_RANGE_RATE_59 0; +BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_RATE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_RATE_59 "CAN_DET_RANGE_RATE_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_AMPLITUDE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_AMPLITUDE_59 "CAN_DET_AMPLITUDE_59"; +BA_ "GenSigSendType" SG_ 346 CAN_SCAN_INDEX_2LSB_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_SCAN_INDEX_2LSB_59 "CAN_SCAN_INDEX_2LSB_59"; +BA_ "GenMsgSendType" BO_ 345 1; +BA_ "GenMsgILSupport" BO_ 345 1; +BA_ "GenMsgNrOfRepetition" BO_ 345 0; +BA_ "GenMsgCycleTime" BO_ 345 0; +BA_ "NetworkInitialization" BO_ 345 0; +BA_ "GenMsgDelayTime" BO_ 345 0; +BA_ "GenSigVtEn" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigVtName" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 "CAN_DET_SUPER_RES_TARGET_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_ND_TARGET_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_ND_TARGET_58 "CAN_DET_ND_TARGET_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 "CAN_DET_HOST_VEH_CLUTTER_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_VALID_LEVEL_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_VALID_LEVEL_58 "CAN_DET_VALID_LEVEL_58"; +BA_ "GenSigStartValue" SG_ 345 CAN_DET_AZIMUTH_58 0; +BA_ "GenSigSendType" SG_ 345 CAN_DET_AZIMUTH_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_AZIMUTH_58 "CAN_DET_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_58 "CAN_DET_RANGE_58"; +BA_ "GenSigStartValue" SG_ 345 CAN_DET_RANGE_RATE_58 0; +BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_RATE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_RATE_58 "CAN_DET_RANGE_RATE_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_AMPLITUDE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_AMPLITUDE_58 "CAN_DET_AMPLITUDE_58"; +BA_ "GenSigSendType" SG_ 345 CAN_SCAN_INDEX_2LSB_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_SCAN_INDEX_2LSB_58 "CAN_SCAN_INDEX_2LSB_58"; +BA_ "GenMsgSendType" BO_ 344 1; +BA_ "GenMsgILSupport" BO_ 344 1; +BA_ "GenMsgNrOfRepetition" BO_ 344 0; +BA_ "GenMsgCycleTime" BO_ 344 0; +BA_ "NetworkInitialization" BO_ 344 0; +BA_ "GenMsgDelayTime" BO_ 344 0; +BA_ "GenSigVtEn" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigVtName" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 "CAN_DET_SUPER_RES_TARGET_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_ND_TARGET_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_ND_TARGET_57 "CAN_DET_ND_TARGET_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 "CAN_DET_HOST_VEH_CLUTTER_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_VALID_LEVEL_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_VALID_LEVEL_57 "CAN_DET_VALID_LEVEL_57"; +BA_ "GenSigStartValue" SG_ 344 CAN_DET_AZIMUTH_57 0; +BA_ "GenSigSendType" SG_ 344 CAN_DET_AZIMUTH_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_AZIMUTH_57 "CAN_DET_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_57 "CAN_DET_RANGE_57"; +BA_ "GenSigStartValue" SG_ 344 CAN_DET_RANGE_RATE_57 0; +BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_RATE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_RATE_57 "CAN_DET_RANGE_RATE_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_AMPLITUDE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_AMPLITUDE_57 "CAN_DET_AMPLITUDE_57"; +BA_ "GenSigSendType" SG_ 344 CAN_SCAN_INDEX_2LSB_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_SCAN_INDEX_2LSB_57 "CAN_SCAN_INDEX_2LSB_57"; +BA_ "GenMsgSendType" BO_ 343 1; +BA_ "GenMsgILSupport" BO_ 343 1; +BA_ "GenMsgNrOfRepetition" BO_ 343 0; +BA_ "GenMsgCycleTime" BO_ 343 0; +BA_ "NetworkInitialization" BO_ 343 0; +BA_ "GenMsgDelayTime" BO_ 343 0; +BA_ "GenSigVtEn" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigVtName" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 "CAN_DET_SUPER_RES_TARGET_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_ND_TARGET_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_ND_TARGET_56 "CAN_DET_ND_TARGET_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 "CAN_DET_HOST_VEH_CLUTTER_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_VALID_LEVEL_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_VALID_LEVEL_56 "CAN_DET_VALID_LEVEL_56"; +BA_ "GenSigStartValue" SG_ 343 CAN_DET_AZIMUTH_56 0; +BA_ "GenSigSendType" SG_ 343 CAN_DET_AZIMUTH_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_AZIMUTH_56 "CAN_DET_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_56 "CAN_DET_RANGE_56"; +BA_ "GenSigStartValue" SG_ 343 CAN_DET_RANGE_RATE_56 0; +BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_RATE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_RATE_56 "CAN_DET_RANGE_RATE_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_AMPLITUDE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_AMPLITUDE_56 "CAN_DET_AMPLITUDE_56"; +BA_ "GenSigSendType" SG_ 343 CAN_SCAN_INDEX_2LSB_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_SCAN_INDEX_2LSB_56 "CAN_SCAN_INDEX_2LSB_56"; +BA_ "GenMsgSendType" BO_ 342 1; +BA_ "GenMsgILSupport" BO_ 342 1; +BA_ "GenMsgNrOfRepetition" BO_ 342 0; +BA_ "GenMsgCycleTime" BO_ 342 0; +BA_ "NetworkInitialization" BO_ 342 0; +BA_ "GenMsgDelayTime" BO_ 342 0; +BA_ "GenSigVtEn" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigVtName" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 "CAN_DET_SUPER_RES_TARGET_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_ND_TARGET_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_ND_TARGET_55 "CAN_DET_ND_TARGET_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 "CAN_DET_HOST_VEH_CLUTTER_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_VALID_LEVEL_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_VALID_LEVEL_55 "CAN_DET_VALID_LEVEL_55"; +BA_ "GenSigStartValue" SG_ 342 CAN_DET_AZIMUTH_55 0; +BA_ "GenSigSendType" SG_ 342 CAN_DET_AZIMUTH_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_AZIMUTH_55 "CAN_DET_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_55 "CAN_DET_RANGE_55"; +BA_ "GenSigStartValue" SG_ 342 CAN_DET_RANGE_RATE_55 0; +BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_RATE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_RATE_55 "CAN_DET_RANGE_RATE_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_AMPLITUDE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_AMPLITUDE_55 "CAN_DET_AMPLITUDE_55"; +BA_ "GenSigSendType" SG_ 342 CAN_SCAN_INDEX_2LSB_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_SCAN_INDEX_2LSB_55 "CAN_SCAN_INDEX_2LSB_55"; +BA_ "GenMsgSendType" BO_ 335 1; +BA_ "GenMsgILSupport" BO_ 335 1; +BA_ "GenMsgNrOfRepetition" BO_ 335 0; +BA_ "GenMsgCycleTime" BO_ 335 0; +BA_ "NetworkInitialization" BO_ 335 0; +BA_ "GenMsgDelayTime" BO_ 335 0; +BA_ "GenSigVtEn" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigVtName" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 "CAN_DET_SUPER_RES_TARGET_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_ND_TARGET_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_ND_TARGET_48 "CAN_DET_ND_TARGET_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 "CAN_DET_HOST_VEH_CLUTTER_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_VALID_LEVEL_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_VALID_LEVEL_48 "CAN_DET_VALID_LEVEL_48"; +BA_ "GenSigStartValue" SG_ 335 CAN_DET_AZIMUTH_48 0; +BA_ "GenSigSendType" SG_ 335 CAN_DET_AZIMUTH_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_AZIMUTH_48 "CAN_DET_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_48 "CAN_DET_RANGE_48"; +BA_ "GenSigStartValue" SG_ 335 CAN_DET_RANGE_RATE_48 0; +BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_RATE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_RATE_48 "CAN_DET_RANGE_RATE_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_AMPLITUDE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_AMPLITUDE_48 "CAN_DET_AMPLITUDE_48"; +BA_ "GenSigSendType" SG_ 335 CAN_SCAN_INDEX_2LSB_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_SCAN_INDEX_2LSB_48 "CAN_SCAN_INDEX_2LSB_48"; +BA_ "GenMsgSendType" BO_ 334 1; +BA_ "GenMsgILSupport" BO_ 334 1; +BA_ "GenMsgNrOfRepetition" BO_ 334 0; +BA_ "GenMsgCycleTime" BO_ 334 0; +BA_ "NetworkInitialization" BO_ 334 0; +BA_ "GenMsgDelayTime" BO_ 334 0; +BA_ "GenSigVtEn" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigVtName" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 "CAN_DET_SUPER_RES_TARGET_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_ND_TARGET_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_ND_TARGET_47 "CAN_DET_ND_TARGET_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 "CAN_DET_HOST_VEH_CLUTTER_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_VALID_LEVEL_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_VALID_LEVEL_47 "CAN_DET_VALID_LEVEL_47"; +BA_ "GenSigStartValue" SG_ 334 CAN_DET_AZIMUTH_47 0; +BA_ "GenSigSendType" SG_ 334 CAN_DET_AZIMUTH_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_AZIMUTH_47 "CAN_DET_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_47 "CAN_DET_RANGE_47"; +BA_ "GenSigStartValue" SG_ 334 CAN_DET_RANGE_RATE_47 0; +BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_RATE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_RATE_47 "CAN_DET_RANGE_RATE_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_AMPLITUDE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_AMPLITUDE_47 "CAN_DET_AMPLITUDE_47"; +BA_ "GenSigSendType" SG_ 334 CAN_SCAN_INDEX_2LSB_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_SCAN_INDEX_2LSB_47 "CAN_SCAN_INDEX_2LSB_47"; +BA_ "GenMsgSendType" BO_ 333 1; +BA_ "GenMsgILSupport" BO_ 333 1; +BA_ "GenMsgNrOfRepetition" BO_ 333 0; +BA_ "GenMsgCycleTime" BO_ 333 0; +BA_ "NetworkInitialization" BO_ 333 0; +BA_ "GenMsgDelayTime" BO_ 333 0; +BA_ "GenSigVtEn" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigVtName" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 "CAN_DET_SUPER_RES_TARGET_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_ND_TARGET_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_ND_TARGET_46 "CAN_DET_ND_TARGET_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 "CAN_DET_HOST_VEH_CLUTTER_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_VALID_LEVEL_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_VALID_LEVEL_46 "CAN_DET_VALID_LEVEL_46"; +BA_ "GenSigStartValue" SG_ 333 CAN_DET_AZIMUTH_46 0; +BA_ "GenSigSendType" SG_ 333 CAN_DET_AZIMUTH_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_AZIMUTH_46 "CAN_DET_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_46 "CAN_DET_RANGE_46"; +BA_ "GenSigStartValue" SG_ 333 CAN_DET_RANGE_RATE_46 0; +BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_RATE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_RATE_46 "CAN_DET_RANGE_RATE_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_AMPLITUDE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_AMPLITUDE_46 "CAN_DET_AMPLITUDE_46"; +BA_ "GenSigSendType" SG_ 333 CAN_SCAN_INDEX_2LSB_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_SCAN_INDEX_2LSB_46 "CAN_SCAN_INDEX_2LSB_46"; +BA_ "GenMsgSendType" BO_ 332 1; +BA_ "GenMsgILSupport" BO_ 332 1; +BA_ "GenMsgNrOfRepetition" BO_ 332 0; +BA_ "GenMsgCycleTime" BO_ 332 0; +BA_ "NetworkInitialization" BO_ 332 0; +BA_ "GenMsgDelayTime" BO_ 332 0; +BA_ "GenSigVtEn" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigVtName" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 "CAN_DET_SUPER_RES_TARGET_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_ND_TARGET_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_ND_TARGET_45 "CAN_DET_ND_TARGET_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 "CAN_DET_HOST_VEH_CLUTTER_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_VALID_LEVEL_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_VALID_LEVEL_45 "CAN_DET_VALID_LEVEL_45"; +BA_ "GenSigStartValue" SG_ 332 CAN_DET_AZIMUTH_45 0; +BA_ "GenSigSendType" SG_ 332 CAN_DET_AZIMUTH_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_AZIMUTH_45 "CAN_DET_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_45 "CAN_DET_RANGE_45"; +BA_ "GenSigStartValue" SG_ 332 CAN_DET_RANGE_RATE_45 0; +BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_RATE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_RATE_45 "CAN_DET_RANGE_RATE_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_AMPLITUDE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_AMPLITUDE_45 "CAN_DET_AMPLITUDE_45"; +BA_ "GenSigSendType" SG_ 332 CAN_SCAN_INDEX_2LSB_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_SCAN_INDEX_2LSB_45 "CAN_SCAN_INDEX_2LSB_45"; +BA_ "GenMsgSendType" BO_ 331 1; +BA_ "GenMsgILSupport" BO_ 331 1; +BA_ "GenMsgNrOfRepetition" BO_ 331 0; +BA_ "GenMsgCycleTime" BO_ 331 0; +BA_ "NetworkInitialization" BO_ 331 0; +BA_ "GenMsgDelayTime" BO_ 331 0; +BA_ "GenSigVtEn" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigVtName" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 "CAN_DET_SUPER_RES_TARGET_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_ND_TARGET_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_ND_TARGET_44 "CAN_DET_ND_TARGET_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 "CAN_DET_HOST_VEH_CLUTTER_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_VALID_LEVEL_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_VALID_LEVEL_44 "CAN_DET_VALID_LEVEL_44"; +BA_ "GenSigStartValue" SG_ 331 CAN_DET_AZIMUTH_44 0; +BA_ "GenSigSendType" SG_ 331 CAN_DET_AZIMUTH_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_AZIMUTH_44 "CAN_DET_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_44 "CAN_DET_RANGE_44"; +BA_ "GenSigStartValue" SG_ 331 CAN_DET_RANGE_RATE_44 0; +BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_RATE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_RATE_44 "CAN_DET_RANGE_RATE_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_AMPLITUDE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_AMPLITUDE_44 "CAN_DET_AMPLITUDE_44"; +BA_ "GenSigSendType" SG_ 331 CAN_SCAN_INDEX_2LSB_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_SCAN_INDEX_2LSB_44 "CAN_SCAN_INDEX_2LSB_44"; +BA_ "GenMsgSendType" BO_ 330 1; +BA_ "GenMsgILSupport" BO_ 330 1; +BA_ "GenMsgNrOfRepetition" BO_ 330 0; +BA_ "GenMsgCycleTime" BO_ 330 0; +BA_ "NetworkInitialization" BO_ 330 0; +BA_ "GenMsgDelayTime" BO_ 330 0; +BA_ "GenSigVtEn" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigVtName" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 "CAN_DET_SUPER_RES_TARGET_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_ND_TARGET_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_ND_TARGET_43 "CAN_DET_ND_TARGET_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 "CAN_DET_HOST_VEH_CLUTTER_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_VALID_LEVEL_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_VALID_LEVEL_43 "CAN_DET_VALID_LEVEL_43"; +BA_ "GenSigStartValue" SG_ 330 CAN_DET_AZIMUTH_43 0; +BA_ "GenSigSendType" SG_ 330 CAN_DET_AZIMUTH_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_AZIMUTH_43 "CAN_DET_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_43 "CAN_DET_RANGE_43"; +BA_ "GenSigStartValue" SG_ 330 CAN_DET_RANGE_RATE_43 0; +BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_RATE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_RATE_43 "CAN_DET_RANGE_RATE_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_AMPLITUDE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_AMPLITUDE_43 "CAN_DET_AMPLITUDE_43"; +BA_ "GenSigSendType" SG_ 330 CAN_SCAN_INDEX_2LSB_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_SCAN_INDEX_2LSB_43 "CAN_SCAN_INDEX_2LSB_43"; +BA_ "GenMsgSendType" BO_ 329 1; +BA_ "GenMsgILSupport" BO_ 329 1; +BA_ "GenMsgNrOfRepetition" BO_ 329 0; +BA_ "GenMsgCycleTime" BO_ 329 0; +BA_ "NetworkInitialization" BO_ 329 0; +BA_ "GenMsgDelayTime" BO_ 329 0; +BA_ "GenSigVtEn" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigVtName" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 "CAN_DET_SUPER_RES_TARGET_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_ND_TARGET_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_ND_TARGET_42 "CAN_DET_ND_TARGET_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 "CAN_DET_HOST_VEH_CLUTTER_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_VALID_LEVEL_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_VALID_LEVEL_42 "CAN_DET_VALID_LEVEL_42"; +BA_ "GenSigStartValue" SG_ 329 CAN_DET_AZIMUTH_42 0; +BA_ "GenSigSendType" SG_ 329 CAN_DET_AZIMUTH_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_AZIMUTH_42 "CAN_DET_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_42 "CAN_DET_RANGE_42"; +BA_ "GenSigStartValue" SG_ 329 CAN_DET_RANGE_RATE_42 0; +BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_RATE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_RATE_42 "CAN_DET_RANGE_RATE_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_AMPLITUDE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_AMPLITUDE_42 "CAN_DET_AMPLITUDE_42"; +BA_ "GenSigSendType" SG_ 329 CAN_SCAN_INDEX_2LSB_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_SCAN_INDEX_2LSB_42 "CAN_SCAN_INDEX_2LSB_42"; +BA_ "GenMsgSendType" BO_ 328 1; +BA_ "GenMsgILSupport" BO_ 328 1; +BA_ "GenMsgNrOfRepetition" BO_ 328 0; +BA_ "GenMsgCycleTime" BO_ 328 0; +BA_ "NetworkInitialization" BO_ 328 0; +BA_ "GenMsgDelayTime" BO_ 328 0; +BA_ "GenSigVtEn" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigVtName" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 "CAN_DET_SUPER_RES_TARGET_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_ND_TARGET_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_ND_TARGET_41 "CAN_DET_ND_TARGET_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 "CAN_DET_HOST_VEH_CLUTTER_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_VALID_LEVEL_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_VALID_LEVEL_41 "CAN_DET_VALID_LEVEL_41"; +BA_ "GenSigStartValue" SG_ 328 CAN_DET_AZIMUTH_41 0; +BA_ "GenSigSendType" SG_ 328 CAN_DET_AZIMUTH_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_AZIMUTH_41 "CAN_DET_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_41 "CAN_DET_RANGE_41"; +BA_ "GenSigStartValue" SG_ 328 CAN_DET_RANGE_RATE_41 0; +BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_RATE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_RATE_41 "CAN_DET_RANGE_RATE_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_AMPLITUDE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_AMPLITUDE_41 "CAN_DET_AMPLITUDE_41"; +BA_ "GenSigSendType" SG_ 328 CAN_SCAN_INDEX_2LSB_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_SCAN_INDEX_2LSB_41 "CAN_SCAN_INDEX_2LSB_41"; +BA_ "GenMsgSendType" BO_ 327 1; +BA_ "GenMsgILSupport" BO_ 327 1; +BA_ "GenMsgNrOfRepetition" BO_ 327 0; +BA_ "GenMsgCycleTime" BO_ 327 0; +BA_ "NetworkInitialization" BO_ 327 0; +BA_ "GenMsgDelayTime" BO_ 327 0; +BA_ "GenSigVtEn" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigVtName" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 "CAN_DET_SUPER_RES_TARGET_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_ND_TARGET_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_ND_TARGET_40 "CAN_DET_ND_TARGET_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 "CAN_DET_HOST_VEH_CLUTTER_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_VALID_LEVEL_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_VALID_LEVEL_40 "CAN_DET_VALID_LEVEL_40"; +BA_ "GenSigStartValue" SG_ 327 CAN_DET_AZIMUTH_40 0; +BA_ "GenSigSendType" SG_ 327 CAN_DET_AZIMUTH_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_AZIMUTH_40 "CAN_DET_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_40 "CAN_DET_RANGE_40"; +BA_ "GenSigStartValue" SG_ 327 CAN_DET_RANGE_RATE_40 0; +BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_RATE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_RATE_40 "CAN_DET_RANGE_RATE_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_AMPLITUDE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_AMPLITUDE_40 "CAN_DET_AMPLITUDE_40"; +BA_ "GenSigSendType" SG_ 327 CAN_SCAN_INDEX_2LSB_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_SCAN_INDEX_2LSB_40 "CAN_SCAN_INDEX_2LSB_40"; +BA_ "GenMsgSendType" BO_ 325 1; +BA_ "GenMsgILSupport" BO_ 325 1; +BA_ "GenMsgNrOfRepetition" BO_ 325 0; +BA_ "GenMsgCycleTime" BO_ 325 0; +BA_ "NetworkInitialization" BO_ 325 0; +BA_ "GenMsgDelayTime" BO_ 325 0; +BA_ "GenSigVtEn" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigVtName" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 "CAN_DET_SUPER_RES_TARGET_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_ND_TARGET_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_ND_TARGET_38 "CAN_DET_ND_TARGET_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 "CAN_DET_HOST_VEH_CLUTTER_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_VALID_LEVEL_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_VALID_LEVEL_38 "CAN_DET_VALID_LEVEL_38"; +BA_ "GenSigStartValue" SG_ 325 CAN_DET_AZIMUTH_38 0; +BA_ "GenSigSendType" SG_ 325 CAN_DET_AZIMUTH_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_AZIMUTH_38 "CAN_DET_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_38 "CAN_DET_RANGE_38"; +BA_ "GenSigStartValue" SG_ 325 CAN_DET_RANGE_RATE_38 0; +BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_RATE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_RATE_38 "CAN_DET_RANGE_RATE_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_AMPLITUDE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_AMPLITUDE_38 "CAN_DET_AMPLITUDE_38"; +BA_ "GenSigSendType" SG_ 325 CAN_SCAN_INDEX_2LSB_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_SCAN_INDEX_2LSB_38 "CAN_SCAN_INDEX_2LSB_38"; +BA_ "GenMsgSendType" BO_ 324 1; +BA_ "GenMsgILSupport" BO_ 324 1; +BA_ "GenMsgNrOfRepetition" BO_ 324 0; +BA_ "GenMsgCycleTime" BO_ 324 0; +BA_ "NetworkInitialization" BO_ 324 0; +BA_ "GenMsgDelayTime" BO_ 324 0; +BA_ "GenSigVtEn" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigVtName" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 "CAN_DET_SUPER_RES_TARGET_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_ND_TARGET_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_ND_TARGET_37 "CAN_DET_ND_TARGET_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 "CAN_DET_HOST_VEH_CLUTTER_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_VALID_LEVEL_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_VALID_LEVEL_37 "CAN_DET_VALID_LEVEL_37"; +BA_ "GenSigStartValue" SG_ 324 CAN_DET_AZIMUTH_37 0; +BA_ "GenSigSendType" SG_ 324 CAN_DET_AZIMUTH_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_AZIMUTH_37 "CAN_DET_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_37 "CAN_DET_RANGE_37"; +BA_ "GenSigStartValue" SG_ 324 CAN_DET_RANGE_RATE_37 0; +BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_RATE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_RATE_37 "CAN_DET_RANGE_RATE_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_AMPLITUDE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_AMPLITUDE_37 "CAN_DET_AMPLITUDE_37"; +BA_ "GenSigSendType" SG_ 324 CAN_SCAN_INDEX_2LSB_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_SCAN_INDEX_2LSB_37 "CAN_SCAN_INDEX_2LSB_37"; +BA_ "GenMsgSendType" BO_ 323 1; +BA_ "GenMsgILSupport" BO_ 323 1; +BA_ "GenMsgNrOfRepetition" BO_ 323 0; +BA_ "GenMsgCycleTime" BO_ 323 0; +BA_ "NetworkInitialization" BO_ 323 0; +BA_ "GenMsgDelayTime" BO_ 323 0; +BA_ "GenSigVtEn" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigVtName" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 "CAN_DET_SUPER_RES_TARGET_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_ND_TARGET_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_ND_TARGET_36 "CAN_DET_ND_TARGET_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 "CAN_DET_HOST_VEH_CLUTTER_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_VALID_LEVEL_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_VALID_LEVEL_36 "CAN_DET_VALID_LEVEL_36"; +BA_ "GenSigStartValue" SG_ 323 CAN_DET_AZIMUTH_36 0; +BA_ "GenSigSendType" SG_ 323 CAN_DET_AZIMUTH_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_AZIMUTH_36 "CAN_DET_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_36 "CAN_DET_RANGE_36"; +BA_ "GenSigStartValue" SG_ 323 CAN_DET_RANGE_RATE_36 0; +BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_RATE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_RATE_36 "CAN_DET_RANGE_RATE_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_AMPLITUDE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_AMPLITUDE_36 "CAN_DET_AMPLITUDE_36"; +BA_ "GenSigSendType" SG_ 323 CAN_SCAN_INDEX_2LSB_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_SCAN_INDEX_2LSB_36 "CAN_SCAN_INDEX_2LSB_36"; +BA_ "GenMsgSendType" BO_ 322 1; +BA_ "GenMsgILSupport" BO_ 322 1; +BA_ "GenMsgNrOfRepetition" BO_ 322 0; +BA_ "GenMsgCycleTime" BO_ 322 0; +BA_ "NetworkInitialization" BO_ 322 0; +BA_ "GenMsgDelayTime" BO_ 322 0; +BA_ "GenSigVtEn" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigVtName" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 "CAN_DET_SUPER_RES_TARGET_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_ND_TARGET_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_ND_TARGET_35 "CAN_DET_ND_TARGET_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 "CAN_DET_HOST_VEH_CLUTTER_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_VALID_LEVEL_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_VALID_LEVEL_35 "CAN_DET_VALID_LEVEL_35"; +BA_ "GenSigStartValue" SG_ 322 CAN_DET_AZIMUTH_35 0; +BA_ "GenSigSendType" SG_ 322 CAN_DET_AZIMUTH_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_AZIMUTH_35 "CAN_DET_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_35 "CAN_DET_RANGE_35"; +BA_ "GenSigStartValue" SG_ 322 CAN_DET_RANGE_RATE_35 0; +BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_RATE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_RATE_35 "CAN_DET_RANGE_RATE_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_AMPLITUDE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_AMPLITUDE_35 "CAN_DET_AMPLITUDE_35"; +BA_ "GenSigSendType" SG_ 322 CAN_SCAN_INDEX_2LSB_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_SCAN_INDEX_2LSB_35 "CAN_SCAN_INDEX_2LSB_35"; +BA_ "GenMsgSendType" BO_ 321 1; +BA_ "GenMsgILSupport" BO_ 321 1; +BA_ "GenMsgNrOfRepetition" BO_ 321 0; +BA_ "GenMsgCycleTime" BO_ 321 0; +BA_ "NetworkInitialization" BO_ 321 0; +BA_ "GenMsgDelayTime" BO_ 321 0; +BA_ "GenSigVtEn" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigVtName" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 "CAN_DET_SUPER_RES_TARGET_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_ND_TARGET_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_ND_TARGET_34 "CAN_DET_ND_TARGET_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 "CAN_DET_HOST_VEH_CLUTTER_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_VALID_LEVEL_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_VALID_LEVEL_34 "CAN_DET_VALID_LEVEL_34"; +BA_ "GenSigStartValue" SG_ 321 CAN_DET_AZIMUTH_34 0; +BA_ "GenSigSendType" SG_ 321 CAN_DET_AZIMUTH_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_AZIMUTH_34 "CAN_DET_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_34 "CAN_DET_RANGE_34"; +BA_ "GenSigStartValue" SG_ 321 CAN_DET_RANGE_RATE_34 0; +BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_RATE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_RATE_34 "CAN_DET_RANGE_RATE_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_AMPLITUDE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_AMPLITUDE_34 "CAN_DET_AMPLITUDE_34"; +BA_ "GenSigSendType" SG_ 321 CAN_SCAN_INDEX_2LSB_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_SCAN_INDEX_2LSB_34 "CAN_SCAN_INDEX_2LSB_34"; +BA_ "GenMsgSendType" BO_ 320 1; +BA_ "GenMsgILSupport" BO_ 320 1; +BA_ "GenMsgNrOfRepetition" BO_ 320 0; +BA_ "GenMsgCycleTime" BO_ 320 0; +BA_ "NetworkInitialization" BO_ 320 0; +BA_ "GenMsgDelayTime" BO_ 320 0; +BA_ "GenSigVtEn" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigVtName" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 "CAN_DET_SUPER_RES_TARGET_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_ND_TARGET_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_ND_TARGET_33 "CAN_DET_ND_TARGET_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 "CAN_DET_HOST_VEH_CLUTTER_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_VALID_LEVEL_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_VALID_LEVEL_33 "CAN_DET_VALID_LEVEL_33"; +BA_ "GenSigStartValue" SG_ 320 CAN_DET_AZIMUTH_33 0; +BA_ "GenSigSendType" SG_ 320 CAN_DET_AZIMUTH_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_AZIMUTH_33 "CAN_DET_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_33 "CAN_DET_RANGE_33"; +BA_ "GenSigStartValue" SG_ 320 CAN_DET_RANGE_RATE_33 0; +BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_RATE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_RATE_33 "CAN_DET_RANGE_RATE_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_AMPLITUDE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_AMPLITUDE_33 "CAN_DET_AMPLITUDE_33"; +BA_ "GenSigSendType" SG_ 320 CAN_SCAN_INDEX_2LSB_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_SCAN_INDEX_2LSB_33 "CAN_SCAN_INDEX_2LSB_33"; +BA_ "GenMsgSendType" BO_ 319 1; +BA_ "GenMsgILSupport" BO_ 319 1; +BA_ "GenMsgNrOfRepetition" BO_ 319 0; +BA_ "GenMsgCycleTime" BO_ 319 0; +BA_ "NetworkInitialization" BO_ 319 0; +BA_ "GenMsgDelayTime" BO_ 319 0; +BA_ "GenSigVtEn" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigVtName" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 "CAN_DET_SUPER_RES_TARGET_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_ND_TARGET_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_ND_TARGET_32 "CAN_DET_ND_TARGET_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 "CAN_DET_HOST_VEH_CLUTTER_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_VALID_LEVEL_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_VALID_LEVEL_32 "CAN_DET_VALID_LEVEL_32"; +BA_ "GenSigStartValue" SG_ 319 CAN_DET_AZIMUTH_32 0; +BA_ "GenSigSendType" SG_ 319 CAN_DET_AZIMUTH_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_AZIMUTH_32 "CAN_DET_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_32 "CAN_DET_RANGE_32"; +BA_ "GenSigStartValue" SG_ 319 CAN_DET_RANGE_RATE_32 0; +BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_RATE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_RATE_32 "CAN_DET_RANGE_RATE_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_AMPLITUDE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_AMPLITUDE_32 "CAN_DET_AMPLITUDE_32"; +BA_ "GenSigSendType" SG_ 319 CAN_SCAN_INDEX_2LSB_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_SCAN_INDEX_2LSB_32 "CAN_SCAN_INDEX_2LSB_32"; +BA_ "GenMsgSendType" BO_ 318 1; +BA_ "GenMsgILSupport" BO_ 318 1; +BA_ "GenMsgNrOfRepetition" BO_ 318 0; +BA_ "GenMsgCycleTime" BO_ 318 0; +BA_ "NetworkInitialization" BO_ 318 0; +BA_ "GenMsgDelayTime" BO_ 318 0; +BA_ "GenSigVtEn" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigVtName" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 "CAN_DET_SUPER_RES_TARGET_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_ND_TARGET_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_ND_TARGET_31 "CAN_DET_ND_TARGET_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 "CAN_DET_HOST_VEH_CLUTTER_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_VALID_LEVEL_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_VALID_LEVEL_31 "CAN_DET_VALID_LEVEL_31"; +BA_ "GenSigStartValue" SG_ 318 CAN_DET_AZIMUTH_31 0; +BA_ "GenSigSendType" SG_ 318 CAN_DET_AZIMUTH_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_AZIMUTH_31 "CAN_DET_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_31 "CAN_DET_RANGE_31"; +BA_ "GenSigStartValue" SG_ 318 CAN_DET_RANGE_RATE_31 0; +BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_RATE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_RATE_31 "CAN_DET_RANGE_RATE_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_AMPLITUDE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_AMPLITUDE_31 "CAN_DET_AMPLITUDE_31"; +BA_ "GenSigSendType" SG_ 318 CAN_SCAN_INDEX_2LSB_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_SCAN_INDEX_2LSB_31 "CAN_SCAN_INDEX_2LSB_31"; +BA_ "GenMsgSendType" BO_ 317 1; +BA_ "GenMsgILSupport" BO_ 317 1; +BA_ "GenMsgNrOfRepetition" BO_ 317 0; +BA_ "GenMsgCycleTime" BO_ 317 0; +BA_ "NetworkInitialization" BO_ 317 0; +BA_ "GenMsgDelayTime" BO_ 317 0; +BA_ "GenSigVtEn" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigVtName" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 "CAN_DET_SUPER_RES_TARGET_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_ND_TARGET_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_ND_TARGET_30 "CAN_DET_ND_TARGET_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 "CAN_DET_HOST_VEH_CLUTTER_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_VALID_LEVEL_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_VALID_LEVEL_30 "CAN_DET_VALID_LEVEL_30"; +BA_ "GenSigStartValue" SG_ 317 CAN_DET_AZIMUTH_30 0; +BA_ "GenSigSendType" SG_ 317 CAN_DET_AZIMUTH_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_AZIMUTH_30 "CAN_DET_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_30 "CAN_DET_RANGE_30"; +BA_ "GenSigStartValue" SG_ 317 CAN_DET_RANGE_RATE_30 0; +BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_RATE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_RATE_30 "CAN_DET_RANGE_RATE_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_AMPLITUDE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_AMPLITUDE_30 "CAN_DET_AMPLITUDE_30"; +BA_ "GenSigSendType" SG_ 317 CAN_SCAN_INDEX_2LSB_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_SCAN_INDEX_2LSB_30 "CAN_SCAN_INDEX_2LSB_30"; +BA_ "GenMsgSendType" BO_ 316 1; +BA_ "GenMsgILSupport" BO_ 316 1; +BA_ "GenMsgNrOfRepetition" BO_ 316 0; +BA_ "GenMsgCycleTime" BO_ 316 0; +BA_ "NetworkInitialization" BO_ 316 0; +BA_ "GenMsgDelayTime" BO_ 316 0; +BA_ "GenSigVtEn" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigVtName" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 "CAN_DET_SUPER_RES_TARGET_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_ND_TARGET_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_ND_TARGET_29 "CAN_DET_ND_TARGET_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 "CAN_DET_HOST_VEH_CLUTTER_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_VALID_LEVEL_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_VALID_LEVEL_29 "CAN_DET_VALID_LEVEL_29"; +BA_ "GenSigStartValue" SG_ 316 CAN_DET_AZIMUTH_29 0; +BA_ "GenSigSendType" SG_ 316 CAN_DET_AZIMUTH_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_AZIMUTH_29 "CAN_DET_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_29 "CAN_DET_RANGE_29"; +BA_ "GenSigStartValue" SG_ 316 CAN_DET_RANGE_RATE_29 0; +BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_RATE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_RATE_29 "CAN_DET_RANGE_RATE_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_AMPLITUDE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_AMPLITUDE_29 "CAN_DET_AMPLITUDE_29"; +BA_ "GenSigSendType" SG_ 316 CAN_SCAN_INDEX_2LSB_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_SCAN_INDEX_2LSB_29 "CAN_SCAN_INDEX_2LSB_29"; +BA_ "GenMsgSendType" BO_ 314 1; +BA_ "GenMsgILSupport" BO_ 314 1; +BA_ "GenMsgNrOfRepetition" BO_ 314 0; +BA_ "GenMsgCycleTime" BO_ 314 0; +BA_ "NetworkInitialization" BO_ 314 0; +BA_ "GenMsgDelayTime" BO_ 314 0; +BA_ "GenSigVtEn" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigVtName" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 "CAN_DET_SUPER_RES_TARGET_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_ND_TARGET_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_ND_TARGET_27 "CAN_DET_ND_TARGET_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 "CAN_DET_HOST_VEH_CLUTTER_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_VALID_LEVEL_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_VALID_LEVEL_27 "CAN_DET_VALID_LEVEL_27"; +BA_ "GenSigStartValue" SG_ 314 CAN_DET_AZIMUTH_27 0; +BA_ "GenSigSendType" SG_ 314 CAN_DET_AZIMUTH_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_AZIMUTH_27 "CAN_DET_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_27 "CAN_DET_RANGE_27"; +BA_ "GenSigStartValue" SG_ 314 CAN_DET_RANGE_RATE_27 0; +BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_RATE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_RATE_27 "CAN_DET_RANGE_RATE_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_AMPLITUDE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_AMPLITUDE_27 "CAN_DET_AMPLITUDE_27"; +BA_ "GenSigSendType" SG_ 314 CAN_SCAN_INDEX_2LSB_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_SCAN_INDEX_2LSB_27 "CAN_SCAN_INDEX_2LSB_27"; +BA_ "GenMsgSendType" BO_ 313 1; +BA_ "GenMsgILSupport" BO_ 313 1; +BA_ "GenMsgNrOfRepetition" BO_ 313 0; +BA_ "GenMsgCycleTime" BO_ 313 0; +BA_ "NetworkInitialization" BO_ 313 0; +BA_ "GenMsgDelayTime" BO_ 313 0; +BA_ "GenSigVtEn" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigVtName" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 "CAN_DET_SUPER_RES_TARGET_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_ND_TARGET_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_ND_TARGET_26 "CAN_DET_ND_TARGET_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 "CAN_DET_HOST_VEH_CLUTTER_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_VALID_LEVEL_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_VALID_LEVEL_26 "CAN_DET_VALID_LEVEL_26"; +BA_ "GenSigStartValue" SG_ 313 CAN_DET_AZIMUTH_26 0; +BA_ "GenSigSendType" SG_ 313 CAN_DET_AZIMUTH_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_AZIMUTH_26 "CAN_DET_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_26 "CAN_DET_RANGE_26"; +BA_ "GenSigStartValue" SG_ 313 CAN_DET_RANGE_RATE_26 0; +BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_RATE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_RATE_26 "CAN_DET_RANGE_RATE_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_AMPLITUDE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_AMPLITUDE_26 "CAN_DET_AMPLITUDE_26"; +BA_ "GenSigSendType" SG_ 313 CAN_SCAN_INDEX_2LSB_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_SCAN_INDEX_2LSB_26 "CAN_SCAN_INDEX_2LSB_26"; +BA_ "GenMsgSendType" BO_ 312 1; +BA_ "GenMsgILSupport" BO_ 312 1; +BA_ "GenMsgNrOfRepetition" BO_ 312 0; +BA_ "GenMsgCycleTime" BO_ 312 0; +BA_ "NetworkInitialization" BO_ 312 0; +BA_ "GenMsgDelayTime" BO_ 312 0; +BA_ "GenSigVtEn" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigVtName" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 "CAN_DET_SUPER_RES_TARGET_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_ND_TARGET_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_ND_TARGET_25 "CAN_DET_ND_TARGET_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 "CAN_DET_HOST_VEH_CLUTTER_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_VALID_LEVEL_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_VALID_LEVEL_25 "CAN_DET_VALID_LEVEL_25"; +BA_ "GenSigStartValue" SG_ 312 CAN_DET_AZIMUTH_25 0; +BA_ "GenSigSendType" SG_ 312 CAN_DET_AZIMUTH_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_AZIMUTH_25 "CAN_DET_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_25 "CAN_DET_RANGE_25"; +BA_ "GenSigStartValue" SG_ 312 CAN_DET_RANGE_RATE_25 0; +BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_RATE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_RATE_25 "CAN_DET_RANGE_RATE_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_AMPLITUDE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_AMPLITUDE_25 "CAN_DET_AMPLITUDE_25"; +BA_ "GenSigSendType" SG_ 312 CAN_SCAN_INDEX_2LSB_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_SCAN_INDEX_2LSB_25 "CAN_SCAN_INDEX_2LSB_25"; +BA_ "GenMsgSendType" BO_ 311 1; +BA_ "GenMsgILSupport" BO_ 311 1; +BA_ "GenMsgNrOfRepetition" BO_ 311 0; +BA_ "GenMsgCycleTime" BO_ 311 0; +BA_ "NetworkInitialization" BO_ 311 0; +BA_ "GenMsgDelayTime" BO_ 311 0; +BA_ "GenSigVtEn" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigVtName" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 "CAN_DET_SUPER_RES_TARGET_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_ND_TARGET_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_ND_TARGET_24 "CAN_DET_ND_TARGET_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 "CAN_DET_HOST_VEH_CLUTTER_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_VALID_LEVEL_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_VALID_LEVEL_24 "CAN_DET_VALID_LEVEL_24"; +BA_ "GenSigStartValue" SG_ 311 CAN_DET_AZIMUTH_24 0; +BA_ "GenSigSendType" SG_ 311 CAN_DET_AZIMUTH_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_AZIMUTH_24 "CAN_DET_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_24 "CAN_DET_RANGE_24"; +BA_ "GenSigStartValue" SG_ 311 CAN_DET_RANGE_RATE_24 0; +BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_RATE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_RATE_24 "CAN_DET_RANGE_RATE_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_AMPLITUDE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_AMPLITUDE_24 "CAN_DET_AMPLITUDE_24"; +BA_ "GenSigSendType" SG_ 311 CAN_SCAN_INDEX_2LSB_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_SCAN_INDEX_2LSB_24 "CAN_SCAN_INDEX_2LSB_24"; +BA_ "GenMsgSendType" BO_ 310 1; +BA_ "GenMsgILSupport" BO_ 310 1; +BA_ "GenMsgNrOfRepetition" BO_ 310 0; +BA_ "GenMsgCycleTime" BO_ 310 0; +BA_ "NetworkInitialization" BO_ 310 0; +BA_ "GenMsgDelayTime" BO_ 310 0; +BA_ "GenSigVtEn" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigVtName" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 "CAN_DET_SUPER_RES_TARGET_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_ND_TARGET_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_ND_TARGET_23 "CAN_DET_ND_TARGET_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 "CAN_DET_HOST_VEH_CLUTTER_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_VALID_LEVEL_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_VALID_LEVEL_23 "CAN_DET_VALID_LEVEL_23"; +BA_ "GenSigStartValue" SG_ 310 CAN_DET_AZIMUTH_23 0; +BA_ "GenSigSendType" SG_ 310 CAN_DET_AZIMUTH_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_AZIMUTH_23 "CAN_DET_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_23 "CAN_DET_RANGE_23"; +BA_ "GenSigStartValue" SG_ 310 CAN_DET_RANGE_RATE_23 0; +BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_RATE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_RATE_23 "CAN_DET_RANGE_RATE_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_AMPLITUDE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_AMPLITUDE_23 "CAN_DET_AMPLITUDE_23"; +BA_ "GenSigSendType" SG_ 310 CAN_SCAN_INDEX_2LSB_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_SCAN_INDEX_2LSB_23 "CAN_SCAN_INDEX_2LSB_23"; +BA_ "GenMsgSendType" BO_ 309 1; +BA_ "GenMsgILSupport" BO_ 309 1; +BA_ "GenMsgNrOfRepetition" BO_ 309 0; +BA_ "GenMsgCycleTime" BO_ 309 0; +BA_ "NetworkInitialization" BO_ 309 0; +BA_ "GenMsgDelayTime" BO_ 309 0; +BA_ "GenSigVtEn" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_01 "CAN_DET_CONFID_AZIMUTH_22_01"; +BA_ "GenSigVtName" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_01 "CAN_DET_CONFID_AZIMUTH_22_01"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_01 "CAN_DET_CONFID_AZIMUTH_22_01"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_01 "CAN_DET_SUPER_RES_TARGET_22_01"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_ND_TARGET_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_ND_TARGET_22_01 "CAN_DET_ND_TARGET_22_01"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_01 "CAN_DET_HOST_VEH_CLUTTER_22_01"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_VALID_LEVEL_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_VALID_LEVEL_22_01 "CAN_DET_VALID_LEVEL_22_01"; +BA_ "GenSigStartValue" SG_ 309 CAN_DET_AZIMUTH_22_01 0; +BA_ "GenSigSendType" SG_ 309 CAN_DET_AZIMUTH_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_AZIMUTH_22_01 "CAN_DET_AZIMUTH_22_01"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_22_01 "CAN_DET_RANGE_22_01"; +BA_ "GenSigStartValue" SG_ 309 CAN_DET_RANGE_RATE_22_01 0; +BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_RATE_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_RATE_22_01 "CAN_DET_RANGE_RATE_22_01"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_AMPLITUDE_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_AMPLITUDE_22_01 "CAN_DET_AMPLITUDE_22_01"; +BA_ "GenSigSendType" SG_ 309 CAN_SCAN_INDEX_2LSB_22_01 0; +BA_ "GenSigCmt" SG_ 309 CAN_SCAN_INDEX_2LSB_22_01 "CAN_SCAN_INDEX_2LSB_22_01"; +BA_ "GenSigVtEn" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_02 "CAN_DET_CONFID_AZIMUTH_22_02"; +BA_ "GenSigVtName" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_02 "CAN_DET_CONFID_AZIMUTH_22_02"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_02 "CAN_DET_CONFID_AZIMUTH_22_02"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_02 "CAN_DET_SUPER_RES_TARGET_22_02"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_ND_TARGET_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_ND_TARGET_22_02 "CAN_DET_ND_TARGET_22_02"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_02 "CAN_DET_HOST_VEH_CLUTTER_22_02"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_VALID_LEVEL_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_VALID_LEVEL_22_02 "CAN_DET_VALID_LEVEL_22_02"; +BA_ "GenSigStartValue" SG_ 309 CAN_DET_AZIMUTH_22_02 0; +BA_ "GenSigSendType" SG_ 309 CAN_DET_AZIMUTH_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_AZIMUTH_22_02 "CAN_DET_AZIMUTH_22_02"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_22_02 "CAN_DET_RANGE_22_02"; +BA_ "GenSigStartValue" SG_ 309 CAN_DET_RANGE_RATE_22_02 0; +BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_RATE_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_RATE_22_02 "CAN_DET_RANGE_RATE_22_02"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_AMPLITUDE_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_AMPLITUDE_22_02 "CAN_DET_AMPLITUDE_22_02"; +BA_ "GenSigSendType" SG_ 309 CAN_SCAN_INDEX_2LSB_22_02 0; +BA_ "GenSigCmt" SG_ 309 CAN_SCAN_INDEX_2LSB_22_02 "CAN_SCAN_INDEX_2LSB_22_02"; +BA_ "GenSigVtEn" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_03 "CAN_DET_CONFID_AZIMUTH_22_03"; +BA_ "GenSigVtName" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_03 "CAN_DET_CONFID_AZIMUTH_22_03"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_CONFID_AZIMUTH_22_03 "CAN_DET_CONFID_AZIMUTH_22_03"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_SUPER_RES_TARGET_22_03 "CAN_DET_SUPER_RES_TARGET_22_03"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_ND_TARGET_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_ND_TARGET_22_03 "CAN_DET_ND_TARGET_22_03"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_HOST_VEH_CLUTTER_22_03 "CAN_DET_HOST_VEH_CLUTTER_22_03"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_VALID_LEVEL_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_VALID_LEVEL_22_03 "CAN_DET_VALID_LEVEL_22_03"; +BA_ "GenSigStartValue" SG_ 309 CAN_DET_AZIMUTH_22_03 0; +BA_ "GenSigSendType" SG_ 309 CAN_DET_AZIMUTH_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_AZIMUTH_22_03 "CAN_DET_AZIMUTH_22_03"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_22_03 "CAN_DET_RANGE_22_03"; +BA_ "GenSigStartValue" SG_ 309 CAN_DET_RANGE_RATE_22_03 0; +BA_ "GenSigSendType" SG_ 309 CAN_DET_RANGE_RATE_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_RANGE_RATE_22_03 "CAN_DET_RANGE_RATE_22_03"; +BA_ "GenSigSendType" SG_ 309 CAN_DET_AMPLITUDE_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_DET_AMPLITUDE_22_03 "CAN_DET_AMPLITUDE_22_03"; +BA_ "GenSigSendType" SG_ 309 CAN_SCAN_INDEX_2LSB_22_03 0; +BA_ "GenSigCmt" SG_ 309 CAN_SCAN_INDEX_2LSB_22_03 "CAN_SCAN_INDEX_2LSB_22_03"; +BA_ "GenMsgSendType" BO_ 308 1; +BA_ "GenMsgILSupport" BO_ 308 1; +BA_ "GenMsgNrOfRepetition" BO_ 308 0; +BA_ "GenMsgCycleTime" BO_ 308 0; +BA_ "NetworkInitialization" BO_ 308 0; +BA_ "GenMsgDelayTime" BO_ 308 0; +BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_01 "CAN_DET_CONFID_AZIMUTH_21_01"; +BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_01 "CAN_DET_CONFID_AZIMUTH_21_01"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_01 "CAN_DET_CONFID_AZIMUTH_21_01"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_01 "CAN_DET_SUPER_RES_TARGET_21_01"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_01 "CAN_DET_ND_TARGET_21_01"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_01 "CAN_DET_HOST_VEH_CLUTTER_21_01"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_01 "CAN_DET_VALID_LEVEL_21_01"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_01 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_01 "CAN_DET_AZIMUTH_21_01"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_01 "CAN_DET_RANGE_21_01"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_01 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_01 "CAN_DET_RANGE_RATE_21_01"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_01 "CAN_DET_AMPLITUDE_21_01"; +BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_01 0; +BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_01 "CAN_SCAN_INDEX_2LSB_21_01"; +BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_02 "CAN_DET_CONFID_AZIMUTH_21_02"; +BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_02 "CAN_DET_CONFID_AZIMUTH_21_02"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_02 "CAN_DET_CONFID_AZIMUTH_21_02"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_02 "CAN_DET_SUPER_RES_TARGET_21_02"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_02 "CAN_DET_ND_TARGET_21_02"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_02 "CAN_DET_HOST_VEH_CLUTTER_21_02"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_02 "CAN_DET_VALID_LEVEL_21_02"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_02 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_02 "CAN_DET_AZIMUTH_21_02"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_02 "CAN_DET_RANGE_21_02"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_02 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_02 "CAN_DET_RANGE_RATE_21_02"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_02 "CAN_DET_AMPLITUDE_21_02"; +BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_02 0; +BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_02 "CAN_SCAN_INDEX_2LSB_21_02"; +BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_03 "CAN_DET_CONFID_AZIMUTH_21_03"; +BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_03 "CAN_DET_CONFID_AZIMUTH_21_03"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_03 "CAN_DET_CONFID_AZIMUTH_21_03"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_03 "CAN_DET_SUPER_RES_TARGET_21_03"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_03 "CAN_DET_ND_TARGET_21_03"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_03 "CAN_DET_HOST_VEH_CLUTTER_21_03"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_03 "CAN_DET_VALID_LEVEL_21_03"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_03 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_03 "CAN_DET_AZIMUTH_21_03"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_03 "CAN_DET_RANGE_21_03"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_03 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_03 "CAN_DET_RANGE_RATE_21_03"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_03 "CAN_DET_AMPLITUDE_21_03"; +BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_03 0; +BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_03 "CAN_SCAN_INDEX_2LSB_21_03"; +BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_04 "CAN_DET_CONFID_AZIMUTH_21_04"; +BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_04 "CAN_DET_CONFID_AZIMUTH_21_04"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_04 "CAN_DET_CONFID_AZIMUTH_21_04"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_04 "CAN_DET_SUPER_RES_TARGET_21_04"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_04 "CAN_DET_ND_TARGET_21_04"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_04 "CAN_DET_HOST_VEH_CLUTTER_21_04"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_04 "CAN_DET_VALID_LEVEL_21_04"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_04 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_04 "CAN_DET_AZIMUTH_21_04"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_04 "CAN_DET_RANGE_21_04"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_04 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_04 "CAN_DET_RANGE_RATE_21_04"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_04 "CAN_DET_AMPLITUDE_21_04"; +BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_04 0; +BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_04 "CAN_SCAN_INDEX_2LSB_21_04"; +BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_05 "CAN_DET_CONFID_AZIMUTH_21_05"; +BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_05 "CAN_DET_CONFID_AZIMUTH_21_05"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_05 "CAN_DET_CONFID_AZIMUTH_21_05"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_05 "CAN_DET_SUPER_RES_TARGET_21_05"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_05 "CAN_DET_ND_TARGET_21_05"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_05 "CAN_DET_HOST_VEH_CLUTTER_21_05"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_05 "CAN_DET_VALID_LEVEL_21_05"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_05 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_05 "CAN_DET_AZIMUTH_21_05"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_05 "CAN_DET_RANGE_21_05"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_05 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_05 "CAN_DET_RANGE_RATE_21_05"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_05 "CAN_DET_AMPLITUDE_21_05"; +BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_05 0; +BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_05 "CAN_SCAN_INDEX_2LSB_21_05"; +BA_ "GenSigVtEn" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_06 "CAN_DET_CONFID_AZIMUTH_21_06"; +BA_ "GenSigVtName" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_06 "CAN_DET_CONFID_AZIMUTH_21_06"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_CONFID_AZIMUTH_21_06 "CAN_DET_CONFID_AZIMUTH_21_06"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_SUPER_RES_TARGET_21_06 "CAN_DET_SUPER_RES_TARGET_21_06"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_ND_TARGET_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_ND_TARGET_21_06 "CAN_DET_ND_TARGET_21_06"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_HOST_VEH_CLUTTER_21_06 "CAN_DET_HOST_VEH_CLUTTER_21_06"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_VALID_LEVEL_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_VALID_LEVEL_21_06 "CAN_DET_VALID_LEVEL_21_06"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_AZIMUTH_21_06 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AZIMUTH_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AZIMUTH_21_06 "CAN_DET_AZIMUTH_21_06"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_21_06 "CAN_DET_RANGE_21_06"; +BA_ "GenSigStartValue" SG_ 308 CAN_DET_RANGE_RATE_21_06 0; +BA_ "GenSigSendType" SG_ 308 CAN_DET_RANGE_RATE_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_RANGE_RATE_21_06 "CAN_DET_RANGE_RATE_21_06"; +BA_ "GenSigSendType" SG_ 308 CAN_DET_AMPLITUDE_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_DET_AMPLITUDE_21_06 "CAN_DET_AMPLITUDE_21_06"; +BA_ "GenSigSendType" SG_ 308 CAN_SCAN_INDEX_2LSB_21_06 0; +BA_ "GenSigCmt" SG_ 308 CAN_SCAN_INDEX_2LSB_21_06 "CAN_SCAN_INDEX_2LSB_21_06"; +BA_ "GenMsgSendType" BO_ 307 1; +BA_ "GenMsgILSupport" BO_ 307 1; +BA_ "GenMsgNrOfRepetition" BO_ 307 0; +BA_ "GenMsgCycleTime" BO_ 307 0; +BA_ "NetworkInitialization" BO_ 307 0; +BA_ "GenMsgDelayTime" BO_ 307 0; +BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_01 "CAN_DET_CONFID_AZIMUTH_20_01"; +BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_01 "CAN_DET_CONFID_AZIMUTH_20_01"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_01 "CAN_DET_CONFID_AZIMUTH_20_01"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_01 "CAN_DET_SUPER_RES_TARGET_20_01"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_01 "CAN_DET_ND_TARGET_20_01"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_01 "CAN_DET_HOST_VEH_CLUTTER_20_01"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_01 "CAN_DET_VALID_LEVEL_20_01"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_01 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_01 "CAN_DET_AZIMUTH_20_01"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_01 "CAN_DET_RANGE_20_01"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_01 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_01 "CAN_DET_RANGE_RATE_20_01"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_01 "CAN_DET_AMPLITUDE_20_01"; +BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_01 0; +BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_01 "CAN_SCAN_INDEX_2LSB_20_01"; +BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_02 "CAN_DET_CONFID_AZIMUTH_20_02"; +BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_02 "CAN_DET_CONFID_AZIMUTH_20_02"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_02 "CAN_DET_CONFID_AZIMUTH_20_02"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_02 "CAN_DET_SUPER_RES_TARGET_20_02"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_02 "CAN_DET_ND_TARGET_20_02"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_02 "CAN_DET_HOST_VEH_CLUTTER_20_02"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_02 "CAN_DET_VALID_LEVEL_20_02"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_02 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_02 "CAN_DET_AZIMUTH_20_02"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_02 "CAN_DET_RANGE_20_02"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_02 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_02 "CAN_DET_RANGE_RATE_20_02"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_02 "CAN_DET_AMPLITUDE_20_02"; +BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_02 0; +BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_02 "CAN_SCAN_INDEX_2LSB_20_02"; +BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_03 "CAN_DET_CONFID_AZIMUTH_20_03"; +BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_03 "CAN_DET_CONFID_AZIMUTH_20_03"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_03 "CAN_DET_CONFID_AZIMUTH_20_03"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_03 "CAN_DET_SUPER_RES_TARGET_20_03"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_03 "CAN_DET_ND_TARGET_20_03"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_03 "CAN_DET_HOST_VEH_CLUTTER_20_03"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_03 "CAN_DET_VALID_LEVEL_20_03"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_03 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_03 "CAN_DET_AZIMUTH_20_03"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_03 "CAN_DET_RANGE_20_03"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_03 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_03 "CAN_DET_RANGE_RATE_20_03"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_03 "CAN_DET_AMPLITUDE_20_03"; +BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_03 0; +BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_03 "CAN_SCAN_INDEX_2LSB_20_03"; +BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_04 "CAN_DET_CONFID_AZIMUTH_20_04"; +BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_04 "CAN_DET_CONFID_AZIMUTH_20_04"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_04 "CAN_DET_CONFID_AZIMUTH_20_04"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_04 "CAN_DET_SUPER_RES_TARGET_20_04"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_04 "CAN_DET_ND_TARGET_20_04"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_04 "CAN_DET_HOST_VEH_CLUTTER_20_04"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_04 "CAN_DET_VALID_LEVEL_20_04"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_04 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_04 "CAN_DET_AZIMUTH_20_04"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_04 "CAN_DET_RANGE_20_04"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_04 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_04 "CAN_DET_RANGE_RATE_20_04"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_04 "CAN_DET_AMPLITUDE_20_04"; +BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_04 0; +BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_04 "CAN_SCAN_INDEX_2LSB_20_04"; +BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_05 "CAN_DET_CONFID_AZIMUTH_20_05"; +BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_05 "CAN_DET_CONFID_AZIMUTH_20_05"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_05 "CAN_DET_CONFID_AZIMUTH_20_05"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_05 "CAN_DET_SUPER_RES_TARGET_20_05"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_05 "CAN_DET_ND_TARGET_20_05"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_05 "CAN_DET_HOST_VEH_CLUTTER_20_05"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_05 "CAN_DET_VALID_LEVEL_20_05"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_05 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_05 "CAN_DET_AZIMUTH_20_05"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_05 "CAN_DET_RANGE_20_05"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_05 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_05 "CAN_DET_RANGE_RATE_20_05"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_05 "CAN_DET_AMPLITUDE_20_05"; +BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_05 0; +BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_05 "CAN_SCAN_INDEX_2LSB_20_05"; +BA_ "GenSigVtEn" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_06 "CAN_DET_CONFID_AZIMUTH_20_06"; +BA_ "GenSigVtName" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_06 "CAN_DET_CONFID_AZIMUTH_20_06"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_CONFID_AZIMUTH_20_06 "CAN_DET_CONFID_AZIMUTH_20_06"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_SUPER_RES_TARGET_20_06 "CAN_DET_SUPER_RES_TARGET_20_06"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_ND_TARGET_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_ND_TARGET_20_06 "CAN_DET_ND_TARGET_20_06"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_HOST_VEH_CLUTTER_20_06 "CAN_DET_HOST_VEH_CLUTTER_20_06"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_VALID_LEVEL_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_VALID_LEVEL_20_06 "CAN_DET_VALID_LEVEL_20_06"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_AZIMUTH_20_06 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AZIMUTH_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AZIMUTH_20_06 "CAN_DET_AZIMUTH_20_06"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_20_06 "CAN_DET_RANGE_20_06"; +BA_ "GenSigStartValue" SG_ 307 CAN_DET_RANGE_RATE_20_06 0; +BA_ "GenSigSendType" SG_ 307 CAN_DET_RANGE_RATE_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_RANGE_RATE_20_06 "CAN_DET_RANGE_RATE_20_06"; +BA_ "GenSigSendType" SG_ 307 CAN_DET_AMPLITUDE_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_DET_AMPLITUDE_20_06 "CAN_DET_AMPLITUDE_20_06"; +BA_ "GenSigSendType" SG_ 307 CAN_SCAN_INDEX_2LSB_20_06 0; +BA_ "GenSigCmt" SG_ 307 CAN_SCAN_INDEX_2LSB_20_06 "CAN_SCAN_INDEX_2LSB_20_06"; +BA_ "GenMsgSendType" BO_ 306 1; +BA_ "GenMsgILSupport" BO_ 306 1; +BA_ "GenMsgNrOfRepetition" BO_ 306 0; +BA_ "GenMsgCycleTime" BO_ 306 0; +BA_ "NetworkInitialization" BO_ 306 0; +BA_ "GenMsgDelayTime" BO_ 306 0; +BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_01 "CAN_DET_CONFID_AZIMUTH_19_01"; +BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_01 "CAN_DET_CONFID_AZIMUTH_19_01"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_01 "CAN_DET_CONFID_AZIMUTH_19_01"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_01 "CAN_DET_SUPER_RES_TARGET_19_01"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_01 "CAN_DET_ND_TARGET_19_01"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_01 "CAN_DET_HOST_VEH_CLUTTER_19_01"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_01 "CAN_DET_VALID_LEVEL_19_01"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_01 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_01 "CAN_DET_AZIMUTH_19_01"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_01 "CAN_DET_RANGE_19_01"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_01 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_01 "CAN_DET_RANGE_RATE_19_01"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_01 "CAN_DET_AMPLITUDE_19_01"; +BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_01 0; +BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_01 "CAN_SCAN_INDEX_2LSB_19_01"; +BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_02 "CAN_DET_CONFID_AZIMUTH_19_02"; +BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_02 "CAN_DET_CONFID_AZIMUTH_19_02"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_02 "CAN_DET_CONFID_AZIMUTH_19_02"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_02 "CAN_DET_SUPER_RES_TARGET_19_02"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_02 "CAN_DET_ND_TARGET_19_02"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_02 "CAN_DET_HOST_VEH_CLUTTER_19_02"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_02 "CAN_DET_VALID_LEVEL_19_02"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_02 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_02 "CAN_DET_AZIMUTH_19_02"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_02 "CAN_DET_RANGE_19_02"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_02 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_02 "CAN_DET_RANGE_RATE_19_02"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_02 "CAN_DET_AMPLITUDE_19_02"; +BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_02 0; +BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_02 "CAN_SCAN_INDEX_2LSB_19_02"; +BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_03 "CAN_DET_CONFID_AZIMUTH_19_03"; +BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_03 "CAN_DET_CONFID_AZIMUTH_19_03"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_03 "CAN_DET_CONFID_AZIMUTH_19_03"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_03 "CAN_DET_SUPER_RES_TARGET_19_03"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_03 "CAN_DET_ND_TARGET_19_03"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_03 "CAN_DET_HOST_VEH_CLUTTER_19_03"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_03 "CAN_DET_VALID_LEVEL_19_03"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_03 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_03 "CAN_DET_AZIMUTH_19_03"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_03 "CAN_DET_RANGE_19_03"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_03 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_03 "CAN_DET_RANGE_RATE_19_03"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_03 "CAN_DET_AMPLITUDE_19_03"; +BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_03 0; +BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_03 "CAN_SCAN_INDEX_2LSB_19_03"; +BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_04 "CAN_DET_CONFID_AZIMUTH_19_04"; +BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_04 "CAN_DET_CONFID_AZIMUTH_19_04"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_04 "CAN_DET_CONFID_AZIMUTH_19_04"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_04 "CAN_DET_SUPER_RES_TARGET_19_04"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_04 "CAN_DET_ND_TARGET_19_04"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_04 "CAN_DET_HOST_VEH_CLUTTER_19_04"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_04 "CAN_DET_VALID_LEVEL_19_04"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_04 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_04 "CAN_DET_AZIMUTH_19_04"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_04 "CAN_DET_RANGE_19_04"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_04 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_04 "CAN_DET_RANGE_RATE_19_04"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_04 "CAN_DET_AMPLITUDE_19_04"; +BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_04 0; +BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_04 "CAN_SCAN_INDEX_2LSB_19_04"; +BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_05 "CAN_DET_CONFID_AZIMUTH_19_05"; +BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_05 "CAN_DET_CONFID_AZIMUTH_19_05"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_05 "CAN_DET_CONFID_AZIMUTH_19_05"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_05 "CAN_DET_SUPER_RES_TARGET_19_05"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_05 "CAN_DET_ND_TARGET_19_05"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_05 "CAN_DET_HOST_VEH_CLUTTER_19_05"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_05 "CAN_DET_VALID_LEVEL_19_05"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_05 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_05 "CAN_DET_AZIMUTH_19_05"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_05 "CAN_DET_RANGE_19_05"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_05 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_05 "CAN_DET_RANGE_RATE_19_05"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_05 "CAN_DET_AMPLITUDE_19_05"; +BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_05 0; +BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_05 "CAN_SCAN_INDEX_2LSB_19_05"; +BA_ "GenSigVtEn" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_06 "CAN_DET_CONFID_AZIMUTH_19_06"; +BA_ "GenSigVtName" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_06 "CAN_DET_CONFID_AZIMUTH_19_06"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_CONFID_AZIMUTH_19_06 "CAN_DET_CONFID_AZIMUTH_19_06"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_SUPER_RES_TARGET_19_06 "CAN_DET_SUPER_RES_TARGET_19_06"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_ND_TARGET_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_ND_TARGET_19_06 "CAN_DET_ND_TARGET_19_06"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_HOST_VEH_CLUTTER_19_06 "CAN_DET_HOST_VEH_CLUTTER_19_06"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_VALID_LEVEL_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_VALID_LEVEL_19_06 "CAN_DET_VALID_LEVEL_19_06"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_AZIMUTH_19_06 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AZIMUTH_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AZIMUTH_19_06 "CAN_DET_AZIMUTH_19_06"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_19_06 "CAN_DET_RANGE_19_06"; +BA_ "GenSigStartValue" SG_ 306 CAN_DET_RANGE_RATE_19_06 0; +BA_ "GenSigSendType" SG_ 306 CAN_DET_RANGE_RATE_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_RANGE_RATE_19_06 "CAN_DET_RANGE_RATE_19_06"; +BA_ "GenSigSendType" SG_ 306 CAN_DET_AMPLITUDE_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_DET_AMPLITUDE_19_06 "CAN_DET_AMPLITUDE_19_06"; +BA_ "GenSigSendType" SG_ 306 CAN_SCAN_INDEX_2LSB_19_06 0; +BA_ "GenSigCmt" SG_ 306 CAN_SCAN_INDEX_2LSB_19_06 "CAN_SCAN_INDEX_2LSB_19_06"; +BA_ "GenMsgSendType" BO_ 305 1; +BA_ "GenMsgILSupport" BO_ 305 1; +BA_ "GenMsgNrOfRepetition" BO_ 305 0; +BA_ "GenMsgCycleTime" BO_ 305 0; +BA_ "NetworkInitialization" BO_ 305 0; +BA_ "GenMsgDelayTime" BO_ 305 0; +BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_01 "CAN_DET_CONFID_AZIMUTH_18_01"; +BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_01 "CAN_DET_CONFID_AZIMUTH_18_01"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_01 "CAN_DET_CONFID_AZIMUTH_18_01"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_01 "CAN_DET_SUPER_RES_TARGET_18_01"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_01 "CAN_DET_ND_TARGET_18_01"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_01 "CAN_DET_HOST_VEH_CLUTTER_18_01"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_01 "CAN_DET_VALID_LEVEL_18_01"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_01 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_01 "CAN_DET_AZIMUTH_18_01"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_01 "CAN_DET_RANGE_18_01"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_01 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_01 "CAN_DET_RANGE_RATE_18_01"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_01 "CAN_DET_AMPLITUDE_18_01"; +BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_01 0; +BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_01 "CAN_SCAN_INDEX_2LSB_18_01"; +BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_02 "CAN_DET_CONFID_AZIMUTH_18_02"; +BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_02 "CAN_DET_CONFID_AZIMUTH_18_02"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_02 "CAN_DET_CONFID_AZIMUTH_18_02"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_02 "CAN_DET_SUPER_RES_TARGET_18_02"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_02 "CAN_DET_ND_TARGET_18_02"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_02 "CAN_DET_HOST_VEH_CLUTTER_18_02"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_02 "CAN_DET_VALID_LEVEL_18_02"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_02 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_02 "CAN_DET_AZIMUTH_18_02"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_02 "CAN_DET_RANGE_18_02"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_02 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_02 "CAN_DET_RANGE_RATE_18_02"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_02 "CAN_DET_AMPLITUDE_18_02"; +BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_02 0; +BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_02 "CAN_SCAN_INDEX_2LSB_18_02"; +BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_03 "CAN_DET_CONFID_AZIMUTH_18_03"; +BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_03 "CAN_DET_CONFID_AZIMUTH_18_03"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_03 "CAN_DET_CONFID_AZIMUTH_18_03"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_03 "CAN_DET_SUPER_RES_TARGET_18_03"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_03 "CAN_DET_ND_TARGET_18_03"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_03 "CAN_DET_HOST_VEH_CLUTTER_18_03"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_03 "CAN_DET_VALID_LEVEL_18_03"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_03 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_03 "CAN_DET_AZIMUTH_18_03"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_03 "CAN_DET_RANGE_18_03"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_03 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_03 "CAN_DET_RANGE_RATE_18_03"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_03 "CAN_DET_AMPLITUDE_18_03"; +BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_03 0; +BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_03 "CAN_SCAN_INDEX_2LSB_18_03"; +BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_04 "CAN_DET_CONFID_AZIMUTH_18_04"; +BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_04 "CAN_DET_CONFID_AZIMUTH_18_04"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_04 "CAN_DET_CONFID_AZIMUTH_18_04"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_04 "CAN_DET_SUPER_RES_TARGET_18_04"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_04 "CAN_DET_ND_TARGET_18_04"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_04 "CAN_DET_HOST_VEH_CLUTTER_18_04"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_04 "CAN_DET_VALID_LEVEL_18_04"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_04 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_04 "CAN_DET_AZIMUTH_18_04"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_04 "CAN_DET_RANGE_18_04"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_04 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_04 "CAN_DET_RANGE_RATE_18_04"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_04 "CAN_DET_AMPLITUDE_18_04"; +BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_04 0; +BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_04 "CAN_SCAN_INDEX_2LSB_18_04"; +BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_05 "CAN_DET_CONFID_AZIMUTH_18_05"; +BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_05 "CAN_DET_CONFID_AZIMUTH_18_05"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_05 "CAN_DET_CONFID_AZIMUTH_18_05"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_05 "CAN_DET_SUPER_RES_TARGET_18_05"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_05 "CAN_DET_ND_TARGET_18_05"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_05 "CAN_DET_HOST_VEH_CLUTTER_18_05"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_05 "CAN_DET_VALID_LEVEL_18_05"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_05 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_05 "CAN_DET_AZIMUTH_18_05"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_05 "CAN_DET_RANGE_18_05"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_05 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_05 "CAN_DET_RANGE_RATE_18_05"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_05 "CAN_DET_AMPLITUDE_18_05"; +BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_05 0; +BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_05 "CAN_SCAN_INDEX_2LSB_18_05"; +BA_ "GenSigVtEn" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_06 "CAN_DET_CONFID_AZIMUTH_18_06"; +BA_ "GenSigVtName" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_06 "CAN_DET_CONFID_AZIMUTH_18_06"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_CONFID_AZIMUTH_18_06 "CAN_DET_CONFID_AZIMUTH_18_06"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_SUPER_RES_TARGET_18_06 "CAN_DET_SUPER_RES_TARGET_18_06"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_ND_TARGET_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_ND_TARGET_18_06 "CAN_DET_ND_TARGET_18_06"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_HOST_VEH_CLUTTER_18_06 "CAN_DET_HOST_VEH_CLUTTER_18_06"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_VALID_LEVEL_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_VALID_LEVEL_18_06 "CAN_DET_VALID_LEVEL_18_06"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_AZIMUTH_18_06 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AZIMUTH_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AZIMUTH_18_06 "CAN_DET_AZIMUTH_18_06"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_18_06 "CAN_DET_RANGE_18_06"; +BA_ "GenSigStartValue" SG_ 305 CAN_DET_RANGE_RATE_18_06 0; +BA_ "GenSigSendType" SG_ 305 CAN_DET_RANGE_RATE_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_RANGE_RATE_18_06 "CAN_DET_RANGE_RATE_18_06"; +BA_ "GenSigSendType" SG_ 305 CAN_DET_AMPLITUDE_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_DET_AMPLITUDE_18_06 "CAN_DET_AMPLITUDE_18_06"; +BA_ "GenSigSendType" SG_ 305 CAN_SCAN_INDEX_2LSB_18_06 0; +BA_ "GenSigCmt" SG_ 305 CAN_SCAN_INDEX_2LSB_18_06 "CAN_SCAN_INDEX_2LSB_18_06"; +BA_ "GenMsgSendType" BO_ 341 1; +BA_ "GenMsgILSupport" BO_ 341 1; +BA_ "GenMsgNrOfRepetition" BO_ 341 0; +BA_ "GenMsgCycleTime" BO_ 341 0; +BA_ "NetworkInitialization" BO_ 341 0; +BA_ "GenMsgDelayTime" BO_ 341 0; +BA_ "GenSigVtEn" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigVtName" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 "CAN_DET_SUPER_RES_TARGET_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_ND_TARGET_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_ND_TARGET_54 "CAN_DET_ND_TARGET_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 "CAN_DET_HOST_VEH_CLUTTER_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_VALID_LEVEL_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_VALID_LEVEL_54 "CAN_DET_VALID_LEVEL_54"; +BA_ "GenSigStartValue" SG_ 341 CAN_DET_AZIMUTH_54 0; +BA_ "GenSigSendType" SG_ 341 CAN_DET_AZIMUTH_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_AZIMUTH_54 "CAN_DET_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_54 "CAN_DET_RANGE_54"; +BA_ "GenSigStartValue" SG_ 341 CAN_DET_RANGE_RATE_54 0; +BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_RATE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_RATE_54 "CAN_DET_RANGE_RATE_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_AMPLITUDE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_AMPLITUDE_54 "CAN_DET_AMPLITUDE_54"; +BA_ "GenSigSendType" SG_ 341 CAN_SCAN_INDEX_2LSB_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_SCAN_INDEX_2LSB_54 "CAN_SCAN_INDEX_2LSB_54"; +BA_ "GenMsgSendType" BO_ 340 1; +BA_ "GenMsgILSupport" BO_ 340 1; +BA_ "GenMsgNrOfRepetition" BO_ 340 0; +BA_ "GenMsgCycleTime" BO_ 340 0; +BA_ "NetworkInitialization" BO_ 340 0; +BA_ "GenMsgDelayTime" BO_ 340 0; +BA_ "GenSigVtEn" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigVtName" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 "CAN_DET_SUPER_RES_TARGET_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_ND_TARGET_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_ND_TARGET_53 "CAN_DET_ND_TARGET_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 "CAN_DET_HOST_VEH_CLUTTER_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_VALID_LEVEL_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_VALID_LEVEL_53 "CAN_DET_VALID_LEVEL_53"; +BA_ "GenSigStartValue" SG_ 340 CAN_DET_AZIMUTH_53 0; +BA_ "GenSigSendType" SG_ 340 CAN_DET_AZIMUTH_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_AZIMUTH_53 "CAN_DET_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_53 "CAN_DET_RANGE_53"; +BA_ "GenSigStartValue" SG_ 340 CAN_DET_RANGE_RATE_53 0; +BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_RATE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_RATE_53 "CAN_DET_RANGE_RATE_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_AMPLITUDE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_AMPLITUDE_53 "CAN_DET_AMPLITUDE_53"; +BA_ "GenSigSendType" SG_ 340 CAN_SCAN_INDEX_2LSB_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_SCAN_INDEX_2LSB_53 "CAN_SCAN_INDEX_2LSB_53"; +BA_ "GenMsgSendType" BO_ 339 1; +BA_ "GenMsgILSupport" BO_ 339 1; +BA_ "GenMsgNrOfRepetition" BO_ 339 0; +BA_ "GenMsgCycleTime" BO_ 339 0; +BA_ "NetworkInitialization" BO_ 339 0; +BA_ "GenMsgDelayTime" BO_ 339 0; +BA_ "GenSigVtEn" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigVtName" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 "CAN_DET_SUPER_RES_TARGET_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_ND_TARGET_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_ND_TARGET_52 "CAN_DET_ND_TARGET_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 "CAN_DET_HOST_VEH_CLUTTER_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_VALID_LEVEL_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_VALID_LEVEL_52 "CAN_DET_VALID_LEVEL_52"; +BA_ "GenSigStartValue" SG_ 339 CAN_DET_AZIMUTH_52 0; +BA_ "GenSigSendType" SG_ 339 CAN_DET_AZIMUTH_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_AZIMUTH_52 "CAN_DET_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_52 "CAN_DET_RANGE_52"; +BA_ "GenSigStartValue" SG_ 339 CAN_DET_RANGE_RATE_52 0; +BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_RATE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_RATE_52 "CAN_DET_RANGE_RATE_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_AMPLITUDE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_AMPLITUDE_52 "CAN_DET_AMPLITUDE_52"; +BA_ "GenSigSendType" SG_ 339 CAN_SCAN_INDEX_2LSB_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_SCAN_INDEX_2LSB_52 "CAN_SCAN_INDEX_2LSB_52"; +BA_ "GenMsgSendType" BO_ 338 1; +BA_ "GenMsgILSupport" BO_ 338 1; +BA_ "GenMsgNrOfRepetition" BO_ 338 0; +BA_ "GenMsgCycleTime" BO_ 338 0; +BA_ "NetworkInitialization" BO_ 338 0; +BA_ "GenMsgDelayTime" BO_ 338 0; +BA_ "GenSigVtEn" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigVtName" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 "CAN_DET_SUPER_RES_TARGET_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_ND_TARGET_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_ND_TARGET_51 "CAN_DET_ND_TARGET_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 "CAN_DET_HOST_VEH_CLUTTER_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_VALID_LEVEL_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_VALID_LEVEL_51 "CAN_DET_VALID_LEVEL_51"; +BA_ "GenSigStartValue" SG_ 338 CAN_DET_AZIMUTH_51 0; +BA_ "GenSigSendType" SG_ 338 CAN_DET_AZIMUTH_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_AZIMUTH_51 "CAN_DET_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_51 "CAN_DET_RANGE_51"; +BA_ "GenSigStartValue" SG_ 338 CAN_DET_RANGE_RATE_51 0; +BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_RATE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_RATE_51 "CAN_DET_RANGE_RATE_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_AMPLITUDE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_AMPLITUDE_51 "CAN_DET_AMPLITUDE_51"; +BA_ "GenSigSendType" SG_ 338 CAN_SCAN_INDEX_2LSB_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_SCAN_INDEX_2LSB_51 "CAN_SCAN_INDEX_2LSB_51"; +BA_ "GenMsgSendType" BO_ 337 1; +BA_ "GenMsgILSupport" BO_ 337 1; +BA_ "GenMsgNrOfRepetition" BO_ 337 0; +BA_ "GenMsgCycleTime" BO_ 337 0; +BA_ "NetworkInitialization" BO_ 337 0; +BA_ "GenMsgDelayTime" BO_ 337 0; +BA_ "GenSigVtEn" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigVtName" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 "CAN_DET_SUPER_RES_TARGET_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_ND_TARGET_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_ND_TARGET_50 "CAN_DET_ND_TARGET_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 "CAN_DET_HOST_VEH_CLUTTER_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_VALID_LEVEL_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_VALID_LEVEL_50 "CAN_DET_VALID_LEVEL_50"; +BA_ "GenSigStartValue" SG_ 337 CAN_DET_AZIMUTH_50 0; +BA_ "GenSigSendType" SG_ 337 CAN_DET_AZIMUTH_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_AZIMUTH_50 "CAN_DET_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_50 "CAN_DET_RANGE_50"; +BA_ "GenSigStartValue" SG_ 337 CAN_DET_RANGE_RATE_50 0; +BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_RATE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_RATE_50 "CAN_DET_RANGE_RATE_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_AMPLITUDE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_AMPLITUDE_50 "CAN_DET_AMPLITUDE_50"; +BA_ "GenSigSendType" SG_ 337 CAN_SCAN_INDEX_2LSB_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_SCAN_INDEX_2LSB_50 "CAN_SCAN_INDEX_2LSB_50"; +BA_ "GenMsgSendType" BO_ 336 1; +BA_ "GenMsgILSupport" BO_ 336 1; +BA_ "GenMsgNrOfRepetition" BO_ 336 0; +BA_ "GenMsgCycleTime" BO_ 336 0; +BA_ "NetworkInitialization" BO_ 336 0; +BA_ "GenMsgDelayTime" BO_ 336 0; +BA_ "GenSigVtEn" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigVtName" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 "CAN_DET_SUPER_RES_TARGET_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_ND_TARGET_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_ND_TARGET_49 "CAN_DET_ND_TARGET_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 "CAN_DET_HOST_VEH_CLUTTER_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_VALID_LEVEL_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_VALID_LEVEL_49 "CAN_DET_VALID_LEVEL_49"; +BA_ "GenSigStartValue" SG_ 336 CAN_DET_AZIMUTH_49 0; +BA_ "GenSigSendType" SG_ 336 CAN_DET_AZIMUTH_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_AZIMUTH_49 "CAN_DET_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_49 "CAN_DET_RANGE_49"; +BA_ "GenSigStartValue" SG_ 336 CAN_DET_RANGE_RATE_49 0; +BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_RATE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_RATE_49 "CAN_DET_RANGE_RATE_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_AMPLITUDE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_AMPLITUDE_49 "CAN_DET_AMPLITUDE_49"; +BA_ "GenSigSendType" SG_ 336 CAN_SCAN_INDEX_2LSB_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_SCAN_INDEX_2LSB_49 "CAN_SCAN_INDEX_2LSB_49"; +BA_ "GenMsgSendType" BO_ 326 1; +BA_ "GenMsgILSupport" BO_ 326 1; +BA_ "GenMsgNrOfRepetition" BO_ 326 0; +BA_ "GenMsgCycleTime" BO_ 326 0; +BA_ "NetworkInitialization" BO_ 326 0; +BA_ "GenMsgDelayTime" BO_ 326 0; +BA_ "GenSigVtEn" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigVtName" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 "CAN_DET_SUPER_RES_TARGET_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_ND_TARGET_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_ND_TARGET_39 "CAN_DET_ND_TARGET_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 "CAN_DET_HOST_VEH_CLUTTER_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_VALID_LEVEL_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_VALID_LEVEL_39 "CAN_DET_VALID_LEVEL_39"; +BA_ "GenSigStartValue" SG_ 326 CAN_DET_AZIMUTH_39 0; +BA_ "GenSigSendType" SG_ 326 CAN_DET_AZIMUTH_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_AZIMUTH_39 "CAN_DET_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_39 "CAN_DET_RANGE_39"; +BA_ "GenSigStartValue" SG_ 326 CAN_DET_RANGE_RATE_39 0; +BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_RATE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_RATE_39 "CAN_DET_RANGE_RATE_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_AMPLITUDE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_AMPLITUDE_39 "CAN_DET_AMPLITUDE_39"; +BA_ "GenSigSendType" SG_ 326 CAN_SCAN_INDEX_2LSB_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_SCAN_INDEX_2LSB_39 "CAN_SCAN_INDEX_2LSB_39"; +BA_ "GenMsgSendType" BO_ 315 1; +BA_ "GenMsgILSupport" BO_ 315 1; +BA_ "GenMsgNrOfRepetition" BO_ 315 0; +BA_ "GenMsgCycleTime" BO_ 315 0; +BA_ "NetworkInitialization" BO_ 315 0; +BA_ "GenMsgDelayTime" BO_ 315 0; +BA_ "GenSigVtEn" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigVtName" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 "CAN_DET_SUPER_RES_TARGET_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_ND_TARGET_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_ND_TARGET_28 "CAN_DET_ND_TARGET_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 "CAN_DET_HOST_VEH_CLUTTER_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_VALID_LEVEL_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_VALID_LEVEL_28 "CAN_DET_VALID_LEVEL_28"; +BA_ "GenSigStartValue" SG_ 315 CAN_DET_AZIMUTH_28 0; +BA_ "GenSigSendType" SG_ 315 CAN_DET_AZIMUTH_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_AZIMUTH_28 "CAN_DET_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_28 "CAN_DET_RANGE_28"; +BA_ "GenSigStartValue" SG_ 315 CAN_DET_RANGE_RATE_28 0; +BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_RATE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_RATE_28 "CAN_DET_RANGE_RATE_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_AMPLITUDE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_AMPLITUDE_28 "CAN_DET_AMPLITUDE_28"; +BA_ "GenSigSendType" SG_ 315 CAN_SCAN_INDEX_2LSB_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_SCAN_INDEX_2LSB_28 "CAN_SCAN_INDEX_2LSB_28"; +BA_ "GenMsgSendType" BO_ 304 1; +BA_ "GenMsgILSupport" BO_ 304 1; +BA_ "GenMsgNrOfRepetition" BO_ 304 0; +BA_ "GenMsgCycleTime" BO_ 304 0; +BA_ "NetworkInitialization" BO_ 304 0; +BA_ "GenMsgDelayTime" BO_ 304 0; +BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_01 "CAN_DET_CONFID_AZIMUTH_17_01"; +BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_01 "CAN_DET_CONFID_AZIMUTH_17_01"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_01 "CAN_DET_CONFID_AZIMUTH_17_01"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_01 "CAN_DET_SUPER_RES_TARGET_17_01"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_01 "CAN_DET_ND_TARGET_17_01"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_01 "CAN_DET_HOST_VEH_CLUTTER_17_01"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_01 "CAN_DET_VALID_LEVEL_17_01"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_01 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_01 "CAN_DET_AZIMUTH_17_01"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_01 "CAN_DET_RANGE_17_01"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_01 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_01 "CAN_DET_RANGE_RATE_17_01"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_01 "CAN_DET_AMPLITUDE_17_01"; +BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_01 0; +BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_01 "CAN_SCAN_INDEX_2LSB_17_01"; +BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_02 "CAN_DET_CONFID_AZIMUTH_17_02"; +BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_02 "CAN_DET_CONFID_AZIMUTH_17_02"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_02 "CAN_DET_CONFID_AZIMUTH_17_02"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_02 "CAN_DET_SUPER_RES_TARGET_17_02"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_02 "CAN_DET_ND_TARGET_17_02"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_02 "CAN_DET_HOST_VEH_CLUTTER_17_02"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_02 "CAN_DET_VALID_LEVEL_17_02"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_02 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_02 "CAN_DET_AZIMUTH_17_02"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_02 "CAN_DET_RANGE_17_02"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_02 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_02 "CAN_DET_RANGE_RATE_17_02"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_02 "CAN_DET_AMPLITUDE_17_02"; +BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_02 0; +BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_02 "CAN_SCAN_INDEX_2LSB_17_02"; +BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_03 "CAN_DET_CONFID_AZIMUTH_17_03"; +BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_03 "CAN_DET_CONFID_AZIMUTH_17_03"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_03 "CAN_DET_CONFID_AZIMUTH_17_03"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_03 "CAN_DET_SUPER_RES_TARGET_17_03"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_03 "CAN_DET_ND_TARGET_17_03"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_03 "CAN_DET_HOST_VEH_CLUTTER_17_03"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_03 "CAN_DET_VALID_LEVEL_17_03"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_03 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_03 "CAN_DET_AZIMUTH_17_03"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_03 "CAN_DET_RANGE_17_03"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_03 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_03 "CAN_DET_RANGE_RATE_17_03"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_03 "CAN_DET_AMPLITUDE_17_03"; +BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_03 0; +BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_03 "CAN_SCAN_INDEX_2LSB_17_03"; +BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_04 "CAN_DET_CONFID_AZIMUTH_17_04"; +BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_04 "CAN_DET_CONFID_AZIMUTH_17_04"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_04 "CAN_DET_CONFID_AZIMUTH_17_04"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_04 "CAN_DET_SUPER_RES_TARGET_17_04"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_04 "CAN_DET_ND_TARGET_17_04"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_04 "CAN_DET_HOST_VEH_CLUTTER_17_04"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_04 "CAN_DET_VALID_LEVEL_17_04"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_04 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_04 "CAN_DET_AZIMUTH_17_04"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_04 "CAN_DET_RANGE_17_04"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_04 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_04 "CAN_DET_RANGE_RATE_17_04"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_04 "CAN_DET_AMPLITUDE_17_04"; +BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_04 0; +BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_04 "CAN_SCAN_INDEX_2LSB_17_04"; +BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_05 "CAN_DET_CONFID_AZIMUTH_17_05"; +BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_05 "CAN_DET_CONFID_AZIMUTH_17_05"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_05 "CAN_DET_CONFID_AZIMUTH_17_05"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_05 "CAN_DET_SUPER_RES_TARGET_17_05"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_05 "CAN_DET_ND_TARGET_17_05"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_05 "CAN_DET_HOST_VEH_CLUTTER_17_05"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_05 "CAN_DET_VALID_LEVEL_17_05"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_05 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_05 "CAN_DET_AZIMUTH_17_05"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_05 "CAN_DET_RANGE_17_05"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_05 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_05 "CAN_DET_RANGE_RATE_17_05"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_05 "CAN_DET_AMPLITUDE_17_05"; +BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_05 0; +BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_05 "CAN_SCAN_INDEX_2LSB_17_05"; +BA_ "GenSigVtEn" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_06 "CAN_DET_CONFID_AZIMUTH_17_06"; +BA_ "GenSigVtName" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_06 "CAN_DET_CONFID_AZIMUTH_17_06"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_CONFID_AZIMUTH_17_06 "CAN_DET_CONFID_AZIMUTH_17_06"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_SUPER_RES_TARGET_17_06 "CAN_DET_SUPER_RES_TARGET_17_06"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_ND_TARGET_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_ND_TARGET_17_06 "CAN_DET_ND_TARGET_17_06"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_HOST_VEH_CLUTTER_17_06 "CAN_DET_HOST_VEH_CLUTTER_17_06"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_VALID_LEVEL_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_VALID_LEVEL_17_06 "CAN_DET_VALID_LEVEL_17_06"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_AZIMUTH_17_06 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AZIMUTH_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AZIMUTH_17_06 "CAN_DET_AZIMUTH_17_06"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_17_06 "CAN_DET_RANGE_17_06"; +BA_ "GenSigStartValue" SG_ 304 CAN_DET_RANGE_RATE_17_06 0; +BA_ "GenSigSendType" SG_ 304 CAN_DET_RANGE_RATE_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_RANGE_RATE_17_06 "CAN_DET_RANGE_RATE_17_06"; +BA_ "GenSigSendType" SG_ 304 CAN_DET_AMPLITUDE_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_DET_AMPLITUDE_17_06 "CAN_DET_AMPLITUDE_17_06"; +BA_ "GenSigSendType" SG_ 304 CAN_SCAN_INDEX_2LSB_17_06 0; +BA_ "GenSigCmt" SG_ 304 CAN_SCAN_INDEX_2LSB_17_06 "CAN_SCAN_INDEX_2LSB_17_06"; +BA_ "GenMsgSendType" BO_ 303 1; +BA_ "GenMsgILSupport" BO_ 303 1; +BA_ "GenMsgNrOfRepetition" BO_ 303 0; +BA_ "GenMsgCycleTime" BO_ 303 0; +BA_ "NetworkInitialization" BO_ 303 0; +BA_ "GenMsgDelayTime" BO_ 303 0; +BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_01 "CAN_DET_CONFID_AZIMUTH_16_01"; +BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_01 "CAN_DET_CONFID_AZIMUTH_16_01"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_01 "CAN_DET_CONFID_AZIMUTH_16_01"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_01 "CAN_DET_SUPER_RES_TARGET_16_01"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_01 "CAN_DET_ND_TARGET_16_01"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_01 "CAN_DET_HOST_VEH_CLUTTER_16_01"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_01 "CAN_DET_VALID_LEVEL_16_01"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_01 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_01 "CAN_DET_AZIMUTH_16_01"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_01 "CAN_DET_RANGE_16_01"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_01 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_01 "CAN_DET_RANGE_RATE_16_01"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_01 "CAN_DET_AMPLITUDE_16_01"; +BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_01 0; +BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_01 "CAN_SCAN_INDEX_2LSB_16_01"; +BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_02 "CAN_DET_CONFID_AZIMUTH_16_02"; +BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_02 "CAN_DET_CONFID_AZIMUTH_16_02"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_02 "CAN_DET_CONFID_AZIMUTH_16_02"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_02 "CAN_DET_SUPER_RES_TARGET_16_02"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_02 "CAN_DET_ND_TARGET_16_02"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_02 "CAN_DET_HOST_VEH_CLUTTER_16_02"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_02 "CAN_DET_VALID_LEVEL_16_02"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_02 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_02 "CAN_DET_AZIMUTH_16_02"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_02 "CAN_DET_RANGE_16_02"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_02 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_02 "CAN_DET_RANGE_RATE_16_02"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_02 "CAN_DET_AMPLITUDE_16_02"; +BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_02 0; +BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_02 "CAN_SCAN_INDEX_2LSB_16_02"; +BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_03 "CAN_DET_CONFID_AZIMUTH_16_03"; +BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_03 "CAN_DET_CONFID_AZIMUTH_16_03"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_03 "CAN_DET_CONFID_AZIMUTH_16_03"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_03 "CAN_DET_SUPER_RES_TARGET_16_03"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_03 "CAN_DET_ND_TARGET_16_03"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_03 "CAN_DET_HOST_VEH_CLUTTER_16_03"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_03 "CAN_DET_VALID_LEVEL_16_03"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_03 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_03 "CAN_DET_AZIMUTH_16_03"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_03 "CAN_DET_RANGE_16_03"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_03 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_03 "CAN_DET_RANGE_RATE_16_03"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_03 "CAN_DET_AMPLITUDE_16_03"; +BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_03 0; +BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_03 "CAN_SCAN_INDEX_2LSB_16_03"; +BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_04 "CAN_DET_CONFID_AZIMUTH_16_04"; +BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_04 "CAN_DET_CONFID_AZIMUTH_16_04"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_04 "CAN_DET_CONFID_AZIMUTH_16_04"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_04 "CAN_DET_SUPER_RES_TARGET_16_04"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_04 "CAN_DET_ND_TARGET_16_04"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_04 "CAN_DET_HOST_VEH_CLUTTER_16_04"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_04 "CAN_DET_VALID_LEVEL_16_04"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_04 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_04 "CAN_DET_AZIMUTH_16_04"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_04 "CAN_DET_RANGE_16_04"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_04 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_04 "CAN_DET_RANGE_RATE_16_04"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_04 "CAN_DET_AMPLITUDE_16_04"; +BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_04 0; +BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_04 "CAN_SCAN_INDEX_2LSB_16_04"; +BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_05 "CAN_DET_CONFID_AZIMUTH_16_05"; +BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_05 "CAN_DET_CONFID_AZIMUTH_16_05"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_05 "CAN_DET_CONFID_AZIMUTH_16_05"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_05 "CAN_DET_SUPER_RES_TARGET_16_05"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_05 "CAN_DET_ND_TARGET_16_05"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_05 "CAN_DET_HOST_VEH_CLUTTER_16_05"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_05 "CAN_DET_VALID_LEVEL_16_05"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_05 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_05 "CAN_DET_AZIMUTH_16_05"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_05 "CAN_DET_RANGE_16_05"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_05 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_05 "CAN_DET_RANGE_RATE_16_05"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_05 "CAN_DET_AMPLITUDE_16_05"; +BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_05 0; +BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_05 "CAN_SCAN_INDEX_2LSB_16_05"; +BA_ "GenSigVtEn" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_06 "CAN_DET_CONFID_AZIMUTH_16_06"; +BA_ "GenSigVtName" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_06 "CAN_DET_CONFID_AZIMUTH_16_06"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_CONFID_AZIMUTH_16_06 "CAN_DET_CONFID_AZIMUTH_16_06"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_SUPER_RES_TARGET_16_06 "CAN_DET_SUPER_RES_TARGET_16_06"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_ND_TARGET_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_ND_TARGET_16_06 "CAN_DET_ND_TARGET_16_06"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_HOST_VEH_CLUTTER_16_06 "CAN_DET_HOST_VEH_CLUTTER_16_06"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_VALID_LEVEL_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_VALID_LEVEL_16_06 "CAN_DET_VALID_LEVEL_16_06"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_AZIMUTH_16_06 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AZIMUTH_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AZIMUTH_16_06 "CAN_DET_AZIMUTH_16_06"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_16_06 "CAN_DET_RANGE_16_06"; +BA_ "GenSigStartValue" SG_ 303 CAN_DET_RANGE_RATE_16_06 0; +BA_ "GenSigSendType" SG_ 303 CAN_DET_RANGE_RATE_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_RANGE_RATE_16_06 "CAN_DET_RANGE_RATE_16_06"; +BA_ "GenSigSendType" SG_ 303 CAN_DET_AMPLITUDE_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_DET_AMPLITUDE_16_06 "CAN_DET_AMPLITUDE_16_06"; +BA_ "GenSigSendType" SG_ 303 CAN_SCAN_INDEX_2LSB_16_06 0; +BA_ "GenSigCmt" SG_ 303 CAN_SCAN_INDEX_2LSB_16_06 "CAN_SCAN_INDEX_2LSB_16_06"; +BA_ "GenMsgSendType" BO_ 302 1; +BA_ "GenMsgILSupport" BO_ 302 1; +BA_ "GenMsgNrOfRepetition" BO_ 302 0; +BA_ "GenMsgCycleTime" BO_ 302 0; +BA_ "NetworkInitialization" BO_ 302 0; +BA_ "GenMsgDelayTime" BO_ 302 0; +BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_01 "CAN_DET_CONFID_AZIMUTH_15_01"; +BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_01 "CAN_DET_CONFID_AZIMUTH_15_01"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_01 "CAN_DET_CONFID_AZIMUTH_15_01"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_01 "CAN_DET_SUPER_RES_TARGET_15_01"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_01 "CAN_DET_ND_TARGET_15_01"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_01 "CAN_DET_HOST_VEH_CLUTTER_15_01"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_01 "CAN_DET_VALID_LEVEL_15_01"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_01 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_01 "CAN_DET_AZIMUTH_15_01"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_01 "CAN_DET_RANGE_15_01"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_01 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_01 "CAN_DET_RANGE_RATE_15_01"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_01 "CAN_DET_AMPLITUDE_15_01"; +BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_01 0; +BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_01 "CAN_SCAN_INDEX_2LSB_15_01"; +BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_02 "CAN_DET_CONFID_AZIMUTH_15_02"; +BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_02 "CAN_DET_CONFID_AZIMUTH_15_02"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_02 "CAN_DET_CONFID_AZIMUTH_15_02"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_02 "CAN_DET_SUPER_RES_TARGET_15_02"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_02 "CAN_DET_ND_TARGET_15_02"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_02 "CAN_DET_HOST_VEH_CLUTTER_15_02"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_02 "CAN_DET_VALID_LEVEL_15_02"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_02 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_02 "CAN_DET_AZIMUTH_15_02"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_02 "CAN_DET_RANGE_15_02"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_02 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_02 "CAN_DET_RANGE_RATE_15_02"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_02 "CAN_DET_AMPLITUDE_15_02"; +BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_02 0; +BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_02 "CAN_SCAN_INDEX_2LSB_15_02"; +BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_03 "CAN_DET_CONFID_AZIMUTH_15_03"; +BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_03 "CAN_DET_CONFID_AZIMUTH_15_03"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_03 "CAN_DET_CONFID_AZIMUTH_15_03"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_03 "CAN_DET_SUPER_RES_TARGET_15_03"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_03 "CAN_DET_ND_TARGET_15_03"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_03 "CAN_DET_HOST_VEH_CLUTTER_15_03"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_03 "CAN_DET_VALID_LEVEL_15_03"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_03 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_03 "CAN_DET_AZIMUTH_15_03"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_03 "CAN_DET_RANGE_15_03"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_03 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_03 "CAN_DET_RANGE_RATE_15_03"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_03 "CAN_DET_AMPLITUDE_15_03"; +BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_03 0; +BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_03 "CAN_SCAN_INDEX_2LSB_15_03"; +BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_04 "CAN_DET_CONFID_AZIMUTH_15_04"; +BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_04 "CAN_DET_CONFID_AZIMUTH_15_04"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_04 "CAN_DET_CONFID_AZIMUTH_15_04"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_04 "CAN_DET_SUPER_RES_TARGET_15_04"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_04 "CAN_DET_ND_TARGET_15_04"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_04 "CAN_DET_HOST_VEH_CLUTTER_15_04"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_04 "CAN_DET_VALID_LEVEL_15_04"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_04 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_04 "CAN_DET_AZIMUTH_15_04"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_04 "CAN_DET_RANGE_15_04"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_04 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_04 "CAN_DET_RANGE_RATE_15_04"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_04 "CAN_DET_AMPLITUDE_15_04"; +BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_04 0; +BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_04 "CAN_SCAN_INDEX_2LSB_15_04"; +BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_05 "CAN_DET_CONFID_AZIMUTH_15_05"; +BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_05 "CAN_DET_CONFID_AZIMUTH_15_05"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_05 "CAN_DET_CONFID_AZIMUTH_15_05"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_05 "CAN_DET_SUPER_RES_TARGET_15_05"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_05 "CAN_DET_ND_TARGET_15_05"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_05 "CAN_DET_HOST_VEH_CLUTTER_15_05"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_05 "CAN_DET_VALID_LEVEL_15_05"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_05 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_05 "CAN_DET_AZIMUTH_15_05"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_05 "CAN_DET_RANGE_15_05"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_05 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_05 "CAN_DET_RANGE_RATE_15_05"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_05 "CAN_DET_AMPLITUDE_15_05"; +BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_05 0; +BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_05 "CAN_SCAN_INDEX_2LSB_15_05"; +BA_ "GenSigVtEn" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_06 "CAN_DET_CONFID_AZIMUTH_15_06"; +BA_ "GenSigVtName" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_06 "CAN_DET_CONFID_AZIMUTH_15_06"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_CONFID_AZIMUTH_15_06 "CAN_DET_CONFID_AZIMUTH_15_06"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_SUPER_RES_TARGET_15_06 "CAN_DET_SUPER_RES_TARGET_15_06"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_ND_TARGET_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_ND_TARGET_15_06 "CAN_DET_ND_TARGET_15_06"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_HOST_VEH_CLUTTER_15_06 "CAN_DET_HOST_VEH_CLUTTER_15_06"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_VALID_LEVEL_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_VALID_LEVEL_15_06 "CAN_DET_VALID_LEVEL_15_06"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_AZIMUTH_15_06 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AZIMUTH_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AZIMUTH_15_06 "CAN_DET_AZIMUTH_15_06"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_15_06 "CAN_DET_RANGE_15_06"; +BA_ "GenSigStartValue" SG_ 302 CAN_DET_RANGE_RATE_15_06 0; +BA_ "GenSigSendType" SG_ 302 CAN_DET_RANGE_RATE_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_RANGE_RATE_15_06 "CAN_DET_RANGE_RATE_15_06"; +BA_ "GenSigSendType" SG_ 302 CAN_DET_AMPLITUDE_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_DET_AMPLITUDE_15_06 "CAN_DET_AMPLITUDE_15_06"; +BA_ "GenSigSendType" SG_ 302 CAN_SCAN_INDEX_2LSB_15_06 0; +BA_ "GenSigCmt" SG_ 302 CAN_SCAN_INDEX_2LSB_15_06 "CAN_SCAN_INDEX_2LSB_15_06"; +BA_ "GenMsgSendType" BO_ 301 1; +BA_ "GenMsgILSupport" BO_ 301 1; +BA_ "GenMsgNrOfRepetition" BO_ 301 0; +BA_ "GenMsgCycleTime" BO_ 301 0; +BA_ "NetworkInitialization" BO_ 301 0; +BA_ "GenMsgDelayTime" BO_ 301 0; +BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_01 "CAN_DET_CONFID_AZIMUTH_14_01"; +BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_01 "CAN_DET_CONFID_AZIMUTH_14_01"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_01 "CAN_DET_CONFID_AZIMUTH_14_01"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_01 "CAN_DET_SUPER_RES_TARGET_14_01"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_01 "CAN_DET_ND_TARGET_14_01"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_01 "CAN_DET_HOST_VEH_CLUTTER_14_01"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_01 "CAN_DET_VALID_LEVEL_14_01"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_01 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_01 "CAN_DET_AZIMUTH_14_01"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_01 "CAN_DET_RANGE_14_01"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_01 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_01 "CAN_DET_RANGE_RATE_14_01"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_01 "CAN_DET_AMPLITUDE_14_01"; +BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_01 0; +BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_01 "CAN_SCAN_INDEX_2LSB_14_01"; +BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_02 "CAN_DET_CONFID_AZIMUTH_14_02"; +BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_02 "CAN_DET_CONFID_AZIMUTH_14_02"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_02 "CAN_DET_CONFID_AZIMUTH_14_02"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_02 "CAN_DET_SUPER_RES_TARGET_14_02"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_02 "CAN_DET_ND_TARGET_14_02"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_02 "CAN_DET_HOST_VEH_CLUTTER_14_02"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_02 "CAN_DET_VALID_LEVEL_14_02"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_02 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_02 "CAN_DET_AZIMUTH_14_02"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_02 "CAN_DET_RANGE_14_02"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_02 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_02 "CAN_DET_RANGE_RATE_14_02"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_02 "CAN_DET_AMPLITUDE_14_02"; +BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_02 0; +BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_02 "CAN_SCAN_INDEX_2LSB_14_02"; +BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_03 "CAN_DET_CONFID_AZIMUTH_14_03"; +BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_03 "CAN_DET_CONFID_AZIMUTH_14_03"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_03 "CAN_DET_CONFID_AZIMUTH_14_03"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_03 "CAN_DET_SUPER_RES_TARGET_14_03"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_03 "CAN_DET_ND_TARGET_14_03"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_03 "CAN_DET_HOST_VEH_CLUTTER_14_03"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_03 "CAN_DET_VALID_LEVEL_14_03"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_03 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_03 "CAN_DET_AZIMUTH_14_03"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_03 "CAN_DET_RANGE_14_03"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_03 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_03 "CAN_DET_RANGE_RATE_14_03"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_03 "CAN_DET_AMPLITUDE_14_03"; +BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_03 0; +BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_03 "CAN_SCAN_INDEX_2LSB_14_03"; +BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_04 "CAN_DET_CONFID_AZIMUTH_14_04"; +BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_04 "CAN_DET_CONFID_AZIMUTH_14_04"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_04 "CAN_DET_CONFID_AZIMUTH_14_04"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_04 "CAN_DET_SUPER_RES_TARGET_14_04"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_04 "CAN_DET_ND_TARGET_14_04"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_04 "CAN_DET_HOST_VEH_CLUTTER_14_04"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_04 "CAN_DET_VALID_LEVEL_14_04"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_04 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_04 "CAN_DET_AZIMUTH_14_04"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_04 "CAN_DET_RANGE_14_04"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_04 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_04 "CAN_DET_RANGE_RATE_14_04"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_04 "CAN_DET_AMPLITUDE_14_04"; +BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_04 0; +BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_04 "CAN_SCAN_INDEX_2LSB_14_04"; +BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_05 "CAN_DET_CONFID_AZIMUTH_14_05"; +BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_05 "CAN_DET_CONFID_AZIMUTH_14_05"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_05 "CAN_DET_CONFID_AZIMUTH_14_05"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_05 "CAN_DET_SUPER_RES_TARGET_14_05"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_05 "CAN_DET_ND_TARGET_14_05"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_05 "CAN_DET_HOST_VEH_CLUTTER_14_05"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_05 "CAN_DET_VALID_LEVEL_14_05"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_05 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_05 "CAN_DET_AZIMUTH_14_05"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_05 "CAN_DET_RANGE_14_05"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_05 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_05 "CAN_DET_RANGE_RATE_14_05"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_05 "CAN_DET_AMPLITUDE_14_05"; +BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_05 0; +BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_05 "CAN_SCAN_INDEX_2LSB_14_05"; +BA_ "GenSigVtEn" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_06 "CAN_DET_CONFID_AZIMUTH_14_06"; +BA_ "GenSigVtName" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_06 "CAN_DET_CONFID_AZIMUTH_14_06"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_CONFID_AZIMUTH_14_06 "CAN_DET_CONFID_AZIMUTH_14_06"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_SUPER_RES_TARGET_14_06 "CAN_DET_SUPER_RES_TARGET_14_06"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_ND_TARGET_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_ND_TARGET_14_06 "CAN_DET_ND_TARGET_14_06"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_HOST_VEH_CLUTTER_14_06 "CAN_DET_HOST_VEH_CLUTTER_14_06"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_VALID_LEVEL_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_VALID_LEVEL_14_06 "CAN_DET_VALID_LEVEL_14_06"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_AZIMUTH_14_06 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AZIMUTH_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AZIMUTH_14_06 "CAN_DET_AZIMUTH_14_06"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_14_06 "CAN_DET_RANGE_14_06"; +BA_ "GenSigStartValue" SG_ 301 CAN_DET_RANGE_RATE_14_06 0; +BA_ "GenSigSendType" SG_ 301 CAN_DET_RANGE_RATE_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_RANGE_RATE_14_06 "CAN_DET_RANGE_RATE_14_06"; +BA_ "GenSigSendType" SG_ 301 CAN_DET_AMPLITUDE_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_DET_AMPLITUDE_14_06 "CAN_DET_AMPLITUDE_14_06"; +BA_ "GenSigSendType" SG_ 301 CAN_SCAN_INDEX_2LSB_14_06 0; +BA_ "GenSigCmt" SG_ 301 CAN_SCAN_INDEX_2LSB_14_06 "CAN_SCAN_INDEX_2LSB_14_06"; +BA_ "GenMsgSendType" BO_ 300 1; +BA_ "GenMsgILSupport" BO_ 300 1; +BA_ "GenMsgNrOfRepetition" BO_ 300 0; +BA_ "GenMsgCycleTime" BO_ 300 0; +BA_ "NetworkInitialization" BO_ 300 0; +BA_ "GenMsgDelayTime" BO_ 300 0; +BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_01 "CAN_DET_CONFID_AZIMUTH_13_01"; +BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_01 "CAN_DET_CONFID_AZIMUTH_13_01"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_01 "CAN_DET_CONFID_AZIMUTH_13_01"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_01 "CAN_DET_SUPER_RES_TARGET_13_01"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_01 "CAN_DET_ND_TARGET_13_01"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_01 "CAN_DET_HOST_VEH_CLUTTER_13_01"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_01 "CAN_DET_VALID_LEVEL_13_01"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_01 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_01 "CAN_DET_AZIMUTH_13_01"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_01 "CAN_DET_RANGE_13_01"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_01 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_01 "CAN_DET_RANGE_RATE_13_01"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_01 "CAN_DET_AMPLITUDE_13_01"; +BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_01 0; +BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_01 "CAN_SCAN_INDEX_2LSB_13_01"; +BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_02 "CAN_DET_CONFID_AZIMUTH_13_02"; +BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_02 "CAN_DET_CONFID_AZIMUTH_13_02"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_02 "CAN_DET_CONFID_AZIMUTH_13_02"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_02 "CAN_DET_SUPER_RES_TARGET_13_02"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_02 "CAN_DET_ND_TARGET_13_02"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_02 "CAN_DET_HOST_VEH_CLUTTER_13_02"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_02 "CAN_DET_VALID_LEVEL_13_02"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_02 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_02 "CAN_DET_AZIMUTH_13_02"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_02 "CAN_DET_RANGE_13_02"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_02 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_02 "CAN_DET_RANGE_RATE_13_02"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_02 "CAN_DET_AMPLITUDE_13_02"; +BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_02 0; +BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_02 "CAN_SCAN_INDEX_2LSB_13_02"; +BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_03 "CAN_DET_CONFID_AZIMUTH_13_03"; +BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_03 "CAN_DET_CONFID_AZIMUTH_13_03"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_03 "CAN_DET_CONFID_AZIMUTH_13_03"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_03 "CAN_DET_SUPER_RES_TARGET_13_03"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_03 "CAN_DET_ND_TARGET_13_03"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_03 "CAN_DET_HOST_VEH_CLUTTER_13_03"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_03 "CAN_DET_VALID_LEVEL_13_03"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_03 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_03 "CAN_DET_AZIMUTH_13_03"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_03 "CAN_DET_RANGE_13_03"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_03 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_03 "CAN_DET_RANGE_RATE_13_03"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_03 "CAN_DET_AMPLITUDE_13_03"; +BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_03 0; +BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_03 "CAN_SCAN_INDEX_2LSB_13_03"; +BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_04 "CAN_DET_CONFID_AZIMUTH_13_04"; +BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_04 "CAN_DET_CONFID_AZIMUTH_13_04"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_04 "CAN_DET_CONFID_AZIMUTH_13_04"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_04 "CAN_DET_SUPER_RES_TARGET_13_04"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_04 "CAN_DET_ND_TARGET_13_04"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_04 "CAN_DET_HOST_VEH_CLUTTER_13_04"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_04 "CAN_DET_VALID_LEVEL_13_04"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_04 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_04 "CAN_DET_AZIMUTH_13_04"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_04 "CAN_DET_RANGE_13_04"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_04 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_04 "CAN_DET_RANGE_RATE_13_04"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_04 "CAN_DET_AMPLITUDE_13_04"; +BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_04 0; +BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_04 "CAN_SCAN_INDEX_2LSB_13_04"; +BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_05 "CAN_DET_CONFID_AZIMUTH_13_05"; +BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_05 "CAN_DET_CONFID_AZIMUTH_13_05"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_05 "CAN_DET_CONFID_AZIMUTH_13_05"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_05 "CAN_DET_SUPER_RES_TARGET_13_05"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_05 "CAN_DET_ND_TARGET_13_05"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_05 "CAN_DET_HOST_VEH_CLUTTER_13_05"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_05 "CAN_DET_VALID_LEVEL_13_05"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_05 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_05 "CAN_DET_AZIMUTH_13_05"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_05 "CAN_DET_RANGE_13_05"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_05 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_05 "CAN_DET_RANGE_RATE_13_05"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_05 "CAN_DET_AMPLITUDE_13_05"; +BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_05 0; +BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_05 "CAN_SCAN_INDEX_2LSB_13_05"; +BA_ "GenSigVtEn" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_06 "CAN_DET_CONFID_AZIMUTH_13_06"; +BA_ "GenSigVtName" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_06 "CAN_DET_CONFID_AZIMUTH_13_06"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_CONFID_AZIMUTH_13_06 "CAN_DET_CONFID_AZIMUTH_13_06"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_SUPER_RES_TARGET_13_06 "CAN_DET_SUPER_RES_TARGET_13_06"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_ND_TARGET_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_ND_TARGET_13_06 "CAN_DET_ND_TARGET_13_06"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_HOST_VEH_CLUTTER_13_06 "CAN_DET_HOST_VEH_CLUTTER_13_06"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_VALID_LEVEL_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_VALID_LEVEL_13_06 "CAN_DET_VALID_LEVEL_13_06"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_AZIMUTH_13_06 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AZIMUTH_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AZIMUTH_13_06 "CAN_DET_AZIMUTH_13_06"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_13_06 "CAN_DET_RANGE_13_06"; +BA_ "GenSigStartValue" SG_ 300 CAN_DET_RANGE_RATE_13_06 0; +BA_ "GenSigSendType" SG_ 300 CAN_DET_RANGE_RATE_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_RANGE_RATE_13_06 "CAN_DET_RANGE_RATE_13_06"; +BA_ "GenSigSendType" SG_ 300 CAN_DET_AMPLITUDE_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_DET_AMPLITUDE_13_06 "CAN_DET_AMPLITUDE_13_06"; +BA_ "GenSigSendType" SG_ 300 CAN_SCAN_INDEX_2LSB_13_06 0; +BA_ "GenSigCmt" SG_ 300 CAN_SCAN_INDEX_2LSB_13_06 "CAN_SCAN_INDEX_2LSB_13_06"; +BA_ "GenMsgSendType" BO_ 299 1; +BA_ "GenMsgILSupport" BO_ 299 1; +BA_ "GenMsgNrOfRepetition" BO_ 299 0; +BA_ "GenMsgCycleTime" BO_ 299 0; +BA_ "NetworkInitialization" BO_ 299 0; +BA_ "GenMsgDelayTime" BO_ 299 0; +BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_01 "CAN_DET_CONFID_AZIMUTH_12_01"; +BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_01 "CAN_DET_CONFID_AZIMUTH_12_01"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_01 "CAN_DET_CONFID_AZIMUTH_12_01"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_01 "CAN_DET_SUPER_RES_TARGET_12_01"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_01 "CAN_DET_ND_TARGET_12_01"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_01 "CAN_DET_HOST_VEH_CLUTTER_12_01"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_01 "CAN_DET_VALID_LEVEL_12_01"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_01 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_01 "CAN_DET_AZIMUTH_12_01"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_01 "CAN_DET_RANGE_12_01"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_01 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_01 "CAN_DET_RANGE_RATE_12_01"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_01 "CAN_DET_AMPLITUDE_12_01"; +BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_01 0; +BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_01 "CAN_SCAN_INDEX_2LSB_12_01"; +BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_02 "CAN_DET_CONFID_AZIMUTH_12_02"; +BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_02 "CAN_DET_CONFID_AZIMUTH_12_02"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_02 "CAN_DET_CONFID_AZIMUTH_12_02"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_02 "CAN_DET_SUPER_RES_TARGET_12_02"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_02 "CAN_DET_ND_TARGET_12_02"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_02 "CAN_DET_HOST_VEH_CLUTTER_12_02"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_02 "CAN_DET_VALID_LEVEL_12_02"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_02 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_02 "CAN_DET_AZIMUTH_12_02"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_02 "CAN_DET_RANGE_12_02"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_02 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_02 "CAN_DET_RANGE_RATE_12_02"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_02 "CAN_DET_AMPLITUDE_12_02"; +BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_02 0; +BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_02 "CAN_SCAN_INDEX_2LSB_12_02"; +BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_03 "CAN_DET_CONFID_AZIMUTH_12_03"; +BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_03 "CAN_DET_CONFID_AZIMUTH_12_03"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_03 "CAN_DET_CONFID_AZIMUTH_12_03"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_03 "CAN_DET_SUPER_RES_TARGET_12_03"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_03 "CAN_DET_ND_TARGET_12_03"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_03 "CAN_DET_HOST_VEH_CLUTTER_12_03"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_03 "CAN_DET_VALID_LEVEL_12_03"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_03 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_03 "CAN_DET_AZIMUTH_12_03"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_03 "CAN_DET_RANGE_12_03"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_03 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_03 "CAN_DET_RANGE_RATE_12_03"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_03 "CAN_DET_AMPLITUDE_12_03"; +BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_03 0; +BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_03 "CAN_SCAN_INDEX_2LSB_12_03"; +BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_04 "CAN_DET_CONFID_AZIMUTH_12_04"; +BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_04 "CAN_DET_CONFID_AZIMUTH_12_04"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_04 "CAN_DET_CONFID_AZIMUTH_12_04"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_04 "CAN_DET_SUPER_RES_TARGET_12_04"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_04 "CAN_DET_ND_TARGET_12_04"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_04 "CAN_DET_HOST_VEH_CLUTTER_12_04"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_04 "CAN_DET_VALID_LEVEL_12_04"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_04 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_04 "CAN_DET_AZIMUTH_12_04"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_04 "CAN_DET_RANGE_12_04"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_04 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_04 "CAN_DET_RANGE_RATE_12_04"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_04 "CAN_DET_AMPLITUDE_12_04"; +BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_04 0; +BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_04 "CAN_SCAN_INDEX_2LSB_12_04"; +BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_05 "CAN_DET_CONFID_AZIMUTH_12_05"; +BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_05 "CAN_DET_CONFID_AZIMUTH_12_05"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_05 "CAN_DET_CONFID_AZIMUTH_12_05"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_05 "CAN_DET_SUPER_RES_TARGET_12_05"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_05 "CAN_DET_ND_TARGET_12_05"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_05 "CAN_DET_HOST_VEH_CLUTTER_12_05"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_05 "CAN_DET_VALID_LEVEL_12_05"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_05 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_05 "CAN_DET_AZIMUTH_12_05"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_05 "CAN_DET_RANGE_12_05"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_05 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_05 "CAN_DET_RANGE_RATE_12_05"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_05 "CAN_DET_AMPLITUDE_12_05"; +BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_05 0; +BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_05 "CAN_SCAN_INDEX_2LSB_12_05"; +BA_ "GenSigVtEn" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_06 "CAN_DET_CONFID_AZIMUTH_12_06"; +BA_ "GenSigVtName" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_06 "CAN_DET_CONFID_AZIMUTH_12_06"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_CONFID_AZIMUTH_12_06 "CAN_DET_CONFID_AZIMUTH_12_06"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_SUPER_RES_TARGET_12_06 "CAN_DET_SUPER_RES_TARGET_12_06"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_ND_TARGET_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_ND_TARGET_12_06 "CAN_DET_ND_TARGET_12_06"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_HOST_VEH_CLUTTER_12_06 "CAN_DET_HOST_VEH_CLUTTER_12_06"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_VALID_LEVEL_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_VALID_LEVEL_12_06 "CAN_DET_VALID_LEVEL_12_06"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_AZIMUTH_12_06 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AZIMUTH_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AZIMUTH_12_06 "CAN_DET_AZIMUTH_12_06"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_12_06 "CAN_DET_RANGE_12_06"; +BA_ "GenSigStartValue" SG_ 299 CAN_DET_RANGE_RATE_12_06 0; +BA_ "GenSigSendType" SG_ 299 CAN_DET_RANGE_RATE_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_RANGE_RATE_12_06 "CAN_DET_RANGE_RATE_12_06"; +BA_ "GenSigSendType" SG_ 299 CAN_DET_AMPLITUDE_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_DET_AMPLITUDE_12_06 "CAN_DET_AMPLITUDE_12_06"; +BA_ "GenSigSendType" SG_ 299 CAN_SCAN_INDEX_2LSB_12_06 0; +BA_ "GenSigCmt" SG_ 299 CAN_SCAN_INDEX_2LSB_12_06 "CAN_SCAN_INDEX_2LSB_12_06"; +BA_ "GenMsgSendType" BO_ 298 1; +BA_ "GenMsgILSupport" BO_ 298 1; +BA_ "GenMsgNrOfRepetition" BO_ 298 0; +BA_ "GenMsgCycleTime" BO_ 298 0; +BA_ "NetworkInitialization" BO_ 298 0; +BA_ "GenMsgDelayTime" BO_ 298 0; +BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_01 "CAN_DET_CONFID_AZIMUTH_11_01"; +BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_01 "CAN_DET_CONFID_AZIMUTH_11_01"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_01 "CAN_DET_CONFID_AZIMUTH_11_01"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_01 "CAN_DET_SUPER_RES_TARGET_11_01"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_01 "CAN_DET_ND_TARGET_11_01"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_01 "CAN_DET_HOST_VEH_CLUTTER_11_01"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_01 "CAN_DET_VALID_LEVEL_11_01"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_01 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_01 "CAN_DET_AZIMUTH_11_01"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_01 "CAN_DET_RANGE_11_01"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_01 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_01 "CAN_DET_RANGE_RATE_11_01"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_01 "CAN_DET_AMPLITUDE_11_01"; +BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_01 0; +BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_01 "CAN_SCAN_INDEX_2LSB_11_01"; +BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_02 "CAN_DET_CONFID_AZIMUTH_11_02"; +BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_02 "CAN_DET_CONFID_AZIMUTH_11_02"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_02 "CAN_DET_CONFID_AZIMUTH_11_02"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_02 "CAN_DET_SUPER_RES_TARGET_11_02"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_02 "CAN_DET_ND_TARGET_11_02"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_02 "CAN_DET_HOST_VEH_CLUTTER_11_02"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_02 "CAN_DET_VALID_LEVEL_11_02"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_02 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_02 "CAN_DET_AZIMUTH_11_02"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_02 "CAN_DET_RANGE_11_02"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_02 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_02 "CAN_DET_RANGE_RATE_11_02"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_02 "CAN_DET_AMPLITUDE_11_02"; +BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_02 0; +BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_02 "CAN_SCAN_INDEX_2LSB_11_02"; +BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_03 "CAN_DET_CONFID_AZIMUTH_11_03"; +BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_03 "CAN_DET_CONFID_AZIMUTH_11_03"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_03 "CAN_DET_CONFID_AZIMUTH_11_03"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_03 "CAN_DET_SUPER_RES_TARGET_11_03"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_03 "CAN_DET_ND_TARGET_11_03"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_03 "CAN_DET_HOST_VEH_CLUTTER_11_03"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_03 "CAN_DET_VALID_LEVEL_11_03"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_03 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_03 "CAN_DET_AZIMUTH_11_03"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_03 "CAN_DET_RANGE_11_03"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_03 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_03 "CAN_DET_RANGE_RATE_11_03"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_03 "CAN_DET_AMPLITUDE_11_03"; +BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_03 0; +BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_03 "CAN_SCAN_INDEX_2LSB_11_03"; +BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_04 "CAN_DET_CONFID_AZIMUTH_11_04"; +BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_04 "CAN_DET_CONFID_AZIMUTH_11_04"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_04 "CAN_DET_CONFID_AZIMUTH_11_04"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_04 "CAN_DET_SUPER_RES_TARGET_11_04"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_04 "CAN_DET_ND_TARGET_11_04"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_04 "CAN_DET_HOST_VEH_CLUTTER_11_04"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_04 "CAN_DET_VALID_LEVEL_11_04"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_04 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_04 "CAN_DET_AZIMUTH_11_04"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_04 "CAN_DET_RANGE_11_04"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_04 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_04 "CAN_DET_RANGE_RATE_11_04"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_04 "CAN_DET_AMPLITUDE_11_04"; +BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_04 0; +BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_04 "CAN_SCAN_INDEX_2LSB_11_04"; +BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_05 "CAN_DET_CONFID_AZIMUTH_11_05"; +BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_05 "CAN_DET_CONFID_AZIMUTH_11_05"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_05 "CAN_DET_CONFID_AZIMUTH_11_05"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_05 "CAN_DET_SUPER_RES_TARGET_11_05"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_05 "CAN_DET_ND_TARGET_11_05"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_05 "CAN_DET_HOST_VEH_CLUTTER_11_05"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_05 "CAN_DET_VALID_LEVEL_11_05"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_05 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_05 "CAN_DET_AZIMUTH_11_05"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_05 "CAN_DET_RANGE_11_05"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_05 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_05 "CAN_DET_RANGE_RATE_11_05"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_05 "CAN_DET_AMPLITUDE_11_05"; +BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_05 0; +BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_05 "CAN_SCAN_INDEX_2LSB_11_05"; +BA_ "GenSigVtEn" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_06 "CAN_DET_CONFID_AZIMUTH_11_06"; +BA_ "GenSigVtName" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_06 "CAN_DET_CONFID_AZIMUTH_11_06"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_CONFID_AZIMUTH_11_06 "CAN_DET_CONFID_AZIMUTH_11_06"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_SUPER_RES_TARGET_11_06 "CAN_DET_SUPER_RES_TARGET_11_06"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_ND_TARGET_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_ND_TARGET_11_06 "CAN_DET_ND_TARGET_11_06"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_HOST_VEH_CLUTTER_11_06 "CAN_DET_HOST_VEH_CLUTTER_11_06"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_VALID_LEVEL_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_VALID_LEVEL_11_06 "CAN_DET_VALID_LEVEL_11_06"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_AZIMUTH_11_06 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AZIMUTH_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AZIMUTH_11_06 "CAN_DET_AZIMUTH_11_06"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_11_06 "CAN_DET_RANGE_11_06"; +BA_ "GenSigStartValue" SG_ 298 CAN_DET_RANGE_RATE_11_06 0; +BA_ "GenSigSendType" SG_ 298 CAN_DET_RANGE_RATE_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_RANGE_RATE_11_06 "CAN_DET_RANGE_RATE_11_06"; +BA_ "GenSigSendType" SG_ 298 CAN_DET_AMPLITUDE_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_DET_AMPLITUDE_11_06 "CAN_DET_AMPLITUDE_11_06"; +BA_ "GenSigSendType" SG_ 298 CAN_SCAN_INDEX_2LSB_11_06 0; +BA_ "GenSigCmt" SG_ 298 CAN_SCAN_INDEX_2LSB_11_06 "CAN_SCAN_INDEX_2LSB_11_06"; +BA_ "GenMsgSendType" BO_ 297 1; +BA_ "GenMsgILSupport" BO_ 297 1; +BA_ "GenMsgNrOfRepetition" BO_ 297 0; +BA_ "GenMsgCycleTime" BO_ 297 0; +BA_ "NetworkInitialization" BO_ 297 0; +BA_ "GenMsgDelayTime" BO_ 297 0; +BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_01 "CAN_DET_CONFID_AZIMUTH_10_01"; +BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_01 "CAN_DET_CONFID_AZIMUTH_10_01"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_01 "CAN_DET_CONFID_AZIMUTH_10_01"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_01 "CAN_DET_SUPER_RES_TARGET_10_01"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_01 "CAN_DET_ND_TARGET_10_01"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_01 "CAN_DET_HOST_VEH_CLUTTER_10_01"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_01 "CAN_DET_VALID_LEVEL_10_01"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_01 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_01 "CAN_DET_AZIMUTH_10_01"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_01 "CAN_DET_RANGE_10_01"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_01 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_01 "CAN_DET_RANGE_RATE_10_01"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_01 "CAN_DET_AMPLITUDE_10_01"; +BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_01 0; +BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_01 "CAN_SCAN_INDEX_2LSB_10_01"; +BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_02 "CAN_DET_CONFID_AZIMUTH_10_02"; +BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_02 "CAN_DET_CONFID_AZIMUTH_10_02"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_02 "CAN_DET_CONFID_AZIMUTH_10_02"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_02 "CAN_DET_SUPER_RES_TARGET_10_02"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_02 "CAN_DET_ND_TARGET_10_02"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_02 "CAN_DET_HOST_VEH_CLUTTER_10_02"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_02 "CAN_DET_VALID_LEVEL_10_02"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_02 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_02 "CAN_DET_AZIMUTH_10_02"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_02 "CAN_DET_RANGE_10_02"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_02 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_02 "CAN_DET_RANGE_RATE_10_02"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_02 "CAN_DET_AMPLITUDE_10_02"; +BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_02 0; +BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_02 "CAN_SCAN_INDEX_2LSB_10_02"; +BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_03 "CAN_DET_CONFID_AZIMUTH_10_03"; +BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_03 "CAN_DET_CONFID_AZIMUTH_10_03"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_03 "CAN_DET_CONFID_AZIMUTH_10_03"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_03 "CAN_DET_SUPER_RES_TARGET_10_03"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_03 "CAN_DET_ND_TARGET_10_03"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_03 "CAN_DET_HOST_VEH_CLUTTER_10_03"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_03 "CAN_DET_VALID_LEVEL_10_03"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_03 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_03 "CAN_DET_AZIMUTH_10_03"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_03 "CAN_DET_RANGE_10_03"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_03 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_03 "CAN_DET_RANGE_RATE_10_03"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_03 "CAN_DET_AMPLITUDE_10_03"; +BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_03 0; +BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_03 "CAN_SCAN_INDEX_2LSB_10_03"; +BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_04 "CAN_DET_CONFID_AZIMUTH_10_04"; +BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_04 "CAN_DET_CONFID_AZIMUTH_10_04"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_04 "CAN_DET_CONFID_AZIMUTH_10_04"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_04 "CAN_DET_SUPER_RES_TARGET_10_04"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_04 "CAN_DET_ND_TARGET_10_04"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_04 "CAN_DET_HOST_VEH_CLUTTER_10_04"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_04 "CAN_DET_VALID_LEVEL_10_04"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_04 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_04 "CAN_DET_AZIMUTH_10_04"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_04 "CAN_DET_RANGE_10_04"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_04 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_04 "CAN_DET_RANGE_RATE_10_04"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_04 "CAN_DET_AMPLITUDE_10_04"; +BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_04 0; +BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_04 "CAN_SCAN_INDEX_2LSB_10_04"; +BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_05 "CAN_DET_CONFID_AZIMUTH_10_05"; +BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_05 "CAN_DET_CONFID_AZIMUTH_10_05"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_05 "CAN_DET_CONFID_AZIMUTH_10_05"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_05 "CAN_DET_SUPER_RES_TARGET_10_05"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_05 "CAN_DET_ND_TARGET_10_05"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_05 "CAN_DET_HOST_VEH_CLUTTER_10_05"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_05 "CAN_DET_VALID_LEVEL_10_05"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_05 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_05 "CAN_DET_AZIMUTH_10_05"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_05 "CAN_DET_RANGE_10_05"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_05 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_05 "CAN_DET_RANGE_RATE_10_05"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_05 "CAN_DET_AMPLITUDE_10_05"; +BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_05 0; +BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_05 "CAN_SCAN_INDEX_2LSB_10_05"; +BA_ "GenSigVtEn" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_06 "CAN_DET_CONFID_AZIMUTH_10_06"; +BA_ "GenSigVtName" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_06 "CAN_DET_CONFID_AZIMUTH_10_06"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_CONFID_AZIMUTH_10_06 "CAN_DET_CONFID_AZIMUTH_10_06"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_SUPER_RES_TARGET_10_06 "CAN_DET_SUPER_RES_TARGET_10_06"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_ND_TARGET_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_ND_TARGET_10_06 "CAN_DET_ND_TARGET_10_06"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_HOST_VEH_CLUTTER_10_06 "CAN_DET_HOST_VEH_CLUTTER_10_06"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_VALID_LEVEL_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_VALID_LEVEL_10_06 "CAN_DET_VALID_LEVEL_10_06"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_AZIMUTH_10_06 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AZIMUTH_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AZIMUTH_10_06 "CAN_DET_AZIMUTH_10_06"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_10_06 "CAN_DET_RANGE_10_06"; +BA_ "GenSigStartValue" SG_ 297 CAN_DET_RANGE_RATE_10_06 0; +BA_ "GenSigSendType" SG_ 297 CAN_DET_RANGE_RATE_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_RANGE_RATE_10_06 "CAN_DET_RANGE_RATE_10_06"; +BA_ "GenSigSendType" SG_ 297 CAN_DET_AMPLITUDE_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_DET_AMPLITUDE_10_06 "CAN_DET_AMPLITUDE_10_06"; +BA_ "GenSigSendType" SG_ 297 CAN_SCAN_INDEX_2LSB_10_06 0; +BA_ "GenSigCmt" SG_ 297 CAN_SCAN_INDEX_2LSB_10_06 "CAN_SCAN_INDEX_2LSB_10_06"; +BA_ "GenMsgSendType" BO_ 296 1; +BA_ "GenMsgILSupport" BO_ 296 1; +BA_ "GenMsgNrOfRepetition" BO_ 296 0; +BA_ "GenMsgCycleTime" BO_ 296 0; +BA_ "NetworkInitialization" BO_ 296 0; +BA_ "GenMsgDelayTime" BO_ 296 0; +BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_01 "CAN_DET_CONFID_AZIMUTH_09_01"; +BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_01 "CAN_DET_CONFID_AZIMUTH_09_01"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_01 "CAN_DET_CONFID_AZIMUTH_09_01"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_01 "CAN_DET_SUPER_RES_TARGET_09_01"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_01 "CAN_DET_ND_TARGET_09_01"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_01 "CAN_DET_HOST_VEH_CLUTTER_09_01"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_01 "CAN_DET_VALID_LEVEL_09_01"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_01 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_01 "CAN_DET_AZIMUTH_09_01"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_01 "CAN_DET_RANGE_09_01"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_01 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_01 "CAN_DET_RANGE_RATE_09_01"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_01 "CAN_DET_AMPLITUDE_09_01"; +BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_01 0; +BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_01 "CAN_SCAN_INDEX_2LSB_09_01"; +BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_02 "CAN_DET_CONFID_AZIMUTH_09_02"; +BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_02 "CAN_DET_CONFID_AZIMUTH_09_02"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_02 "CAN_DET_CONFID_AZIMUTH_09_02"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_02 "CAN_DET_SUPER_RES_TARGET_09_02"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_02 "CAN_DET_ND_TARGET_09_02"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_02 "CAN_DET_HOST_VEH_CLUTTER_09_02"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_02 "CAN_DET_VALID_LEVEL_09_02"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_02 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_02 "CAN_DET_AZIMUTH_09_02"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_02 "CAN_DET_RANGE_09_02"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_02 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_02 "CAN_DET_RANGE_RATE_09_02"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_02 "CAN_DET_AMPLITUDE_09_02"; +BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_02 0; +BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_02 "CAN_SCAN_INDEX_2LSB_09_02"; +BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_03 "CAN_DET_CONFID_AZIMUTH_09_03"; +BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_03 "CAN_DET_CONFID_AZIMUTH_09_03"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_03 "CAN_DET_CONFID_AZIMUTH_09_03"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_03 "CAN_DET_SUPER_RES_TARGET_09_03"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_03 "CAN_DET_ND_TARGET_09_03"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_03 "CAN_DET_HOST_VEH_CLUTTER_09_03"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_03 "CAN_DET_VALID_LEVEL_09_03"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_03 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_03 "CAN_DET_AZIMUTH_09_03"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_03 "CAN_DET_RANGE_09_03"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_03 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_03 "CAN_DET_RANGE_RATE_09_03"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_03 "CAN_DET_AMPLITUDE_09_03"; +BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_03 0; +BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_03 "CAN_SCAN_INDEX_2LSB_09_03"; +BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_04 "CAN_DET_CONFID_AZIMUTH_09_04"; +BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_04 "CAN_DET_CONFID_AZIMUTH_09_04"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_04 "CAN_DET_CONFID_AZIMUTH_09_04"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_04 "CAN_DET_SUPER_RES_TARGET_09_04"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_04 "CAN_DET_ND_TARGET_09_04"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_04 "CAN_DET_HOST_VEH_CLUTTER_09_04"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_04 "CAN_DET_VALID_LEVEL_09_04"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_04 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_04 "CAN_DET_AZIMUTH_09_04"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_04 "CAN_DET_RANGE_09_04"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_04 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_04 "CAN_DET_RANGE_RATE_09_04"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_04 "CAN_DET_AMPLITUDE_09_04"; +BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_04 0; +BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_04 "CAN_SCAN_INDEX_2LSB_09_04"; +BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_05 "CAN_DET_CONFID_AZIMUTH_09_05"; +BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_05 "CAN_DET_CONFID_AZIMUTH_09_05"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_05 "CAN_DET_CONFID_AZIMUTH_09_05"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_05 "CAN_DET_SUPER_RES_TARGET_09_05"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_05 "CAN_DET_ND_TARGET_09_05"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_05 "CAN_DET_HOST_VEH_CLUTTER_09_05"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_05 "CAN_DET_VALID_LEVEL_09_05"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_05 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_05 "CAN_DET_AZIMUTH_09_05"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_05 "CAN_DET_RANGE_09_05"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_05 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_05 "CAN_DET_RANGE_RATE_09_05"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_05 "CAN_DET_AMPLITUDE_09_05"; +BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_05 0; +BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_05 "CAN_SCAN_INDEX_2LSB_09_05"; +BA_ "GenSigVtEn" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_06 "CAN_DET_CONFID_AZIMUTH_09_06"; +BA_ "GenSigVtName" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_06 "CAN_DET_CONFID_AZIMUTH_09_06"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_CONFID_AZIMUTH_09_06 "CAN_DET_CONFID_AZIMUTH_09_06"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_SUPER_RES_TARGET_09_06 "CAN_DET_SUPER_RES_TARGET_09_06"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_ND_TARGET_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_ND_TARGET_09_06 "CAN_DET_ND_TARGET_09_06"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_HOST_VEH_CLUTTER_09_06 "CAN_DET_HOST_VEH_CLUTTER_09_06"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_VALID_LEVEL_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_VALID_LEVEL_09_06 "CAN_DET_VALID_LEVEL_09_06"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_AZIMUTH_09_06 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AZIMUTH_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AZIMUTH_09_06 "CAN_DET_AZIMUTH_09_06"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_09_06 "CAN_DET_RANGE_09_06"; +BA_ "GenSigStartValue" SG_ 296 CAN_DET_RANGE_RATE_09_06 0; +BA_ "GenSigSendType" SG_ 296 CAN_DET_RANGE_RATE_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_RANGE_RATE_09_06 "CAN_DET_RANGE_RATE_09_06"; +BA_ "GenSigSendType" SG_ 296 CAN_DET_AMPLITUDE_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_DET_AMPLITUDE_09_06 "CAN_DET_AMPLITUDE_09_06"; +BA_ "GenSigSendType" SG_ 296 CAN_SCAN_INDEX_2LSB_09_06 0; +BA_ "GenSigCmt" SG_ 296 CAN_SCAN_INDEX_2LSB_09_06 "CAN_SCAN_INDEX_2LSB_09_06"; +BA_ "GenMsgSendType" BO_ 295 1; +BA_ "GenMsgILSupport" BO_ 295 1; +BA_ "GenMsgNrOfRepetition" BO_ 295 0; +BA_ "GenMsgCycleTime" BO_ 295 0; +BA_ "NetworkInitialization" BO_ 295 0; +BA_ "GenMsgDelayTime" BO_ 295 0; +BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_01 "CAN_DET_CONFID_AZIMUTH_08_01"; +BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_01 "CAN_DET_CONFID_AZIMUTH_08_01"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_01 "CAN_DET_CONFID_AZIMUTH_08_01"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_01 "CAN_DET_SUPER_RES_TARGET_08_01"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_01 "CAN_DET_ND_TARGET_08_01"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_01 "CAN_DET_HOST_VEH_CLUTTER_08_01"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_01 "CAN_DET_VALID_LEVEL_08_01"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_01 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_01 "CAN_DET_AZIMUTH_08_01"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_01 "CAN_DET_RANGE_08_01"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_01 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_01 "CAN_DET_RANGE_RATE_08_01"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_01 "CAN_DET_AMPLITUDE_08_01"; +BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_01 0; +BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_01 "CAN_SCAN_INDEX_2LSB_08_01"; +BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_02 "CAN_DET_CONFID_AZIMUTH_08_02"; +BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_02 "CAN_DET_CONFID_AZIMUTH_08_02"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_02 "CAN_DET_CONFID_AZIMUTH_08_02"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_02 "CAN_DET_SUPER_RES_TARGET_08_02"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_02 "CAN_DET_ND_TARGET_08_02"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_02 "CAN_DET_HOST_VEH_CLUTTER_08_02"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_02 "CAN_DET_VALID_LEVEL_08_02"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_02 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_02 "CAN_DET_AZIMUTH_08_02"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_02 "CAN_DET_RANGE_08_02"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_02 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_02 "CAN_DET_RANGE_RATE_08_02"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_02 "CAN_DET_AMPLITUDE_08_02"; +BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_02 0; +BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_02 "CAN_SCAN_INDEX_2LSB_08_02"; +BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_03 "CAN_DET_CONFID_AZIMUTH_08_03"; +BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_03 "CAN_DET_CONFID_AZIMUTH_08_03"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_03 "CAN_DET_CONFID_AZIMUTH_08_03"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_03 "CAN_DET_SUPER_RES_TARGET_08_03"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_03 "CAN_DET_ND_TARGET_08_03"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_03 "CAN_DET_HOST_VEH_CLUTTER_08_03"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_03 "CAN_DET_VALID_LEVEL_08_03"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_03 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_03 "CAN_DET_AZIMUTH_08_03"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_03 "CAN_DET_RANGE_08_03"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_03 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_03 "CAN_DET_RANGE_RATE_08_03"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_03 "CAN_DET_AMPLITUDE_08_03"; +BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_03 0; +BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_03 "CAN_SCAN_INDEX_2LSB_08_03"; +BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_04 "CAN_DET_CONFID_AZIMUTH_08_04"; +BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_04 "CAN_DET_CONFID_AZIMUTH_08_04"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_04 "CAN_DET_CONFID_AZIMUTH_08_04"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_04 "CAN_DET_SUPER_RES_TARGET_08_04"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_04 "CAN_DET_ND_TARGET_08_04"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_04 "CAN_DET_HOST_VEH_CLUTTER_08_04"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_04 "CAN_DET_VALID_LEVEL_08_04"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_04 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_04 "CAN_DET_AZIMUTH_08_04"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_04 "CAN_DET_RANGE_08_04"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_04 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_04 "CAN_DET_RANGE_RATE_08_04"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_04 "CAN_DET_AMPLITUDE_08_04"; +BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_04 0; +BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_04 "CAN_SCAN_INDEX_2LSB_08_04"; +BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_05 "CAN_DET_CONFID_AZIMUTH_08_05"; +BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_05 "CAN_DET_CONFID_AZIMUTH_08_05"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_05 "CAN_DET_CONFID_AZIMUTH_08_05"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_05 "CAN_DET_SUPER_RES_TARGET_08_05"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_05 "CAN_DET_ND_TARGET_08_05"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_05 "CAN_DET_HOST_VEH_CLUTTER_08_05"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_05 "CAN_DET_VALID_LEVEL_08_05"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_05 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_05 "CAN_DET_AZIMUTH_08_05"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_05 "CAN_DET_RANGE_08_05"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_05 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_05 "CAN_DET_RANGE_RATE_08_05"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_05 "CAN_DET_AMPLITUDE_08_05"; +BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_05 0; +BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_05 "CAN_SCAN_INDEX_2LSB_08_05"; +BA_ "GenSigVtEn" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_06 "CAN_DET_CONFID_AZIMUTH_08_06"; +BA_ "GenSigVtName" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_06 "CAN_DET_CONFID_AZIMUTH_08_06"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_CONFID_AZIMUTH_08_06 "CAN_DET_CONFID_AZIMUTH_08_06"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_SUPER_RES_TARGET_08_06 "CAN_DET_SUPER_RES_TARGET_08_06"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_ND_TARGET_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_ND_TARGET_08_06 "CAN_DET_ND_TARGET_08_06"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_HOST_VEH_CLUTTER_08_06 "CAN_DET_HOST_VEH_CLUTTER_08_06"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_VALID_LEVEL_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_VALID_LEVEL_08_06 "CAN_DET_VALID_LEVEL_08_06"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_AZIMUTH_08_06 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AZIMUTH_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AZIMUTH_08_06 "CAN_DET_AZIMUTH_08_06"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_08_06 "CAN_DET_RANGE_08_06"; +BA_ "GenSigStartValue" SG_ 295 CAN_DET_RANGE_RATE_08_06 0; +BA_ "GenSigSendType" SG_ 295 CAN_DET_RANGE_RATE_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_RANGE_RATE_08_06 "CAN_DET_RANGE_RATE_08_06"; +BA_ "GenSigSendType" SG_ 295 CAN_DET_AMPLITUDE_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_DET_AMPLITUDE_08_06 "CAN_DET_AMPLITUDE_08_06"; +BA_ "GenSigSendType" SG_ 295 CAN_SCAN_INDEX_2LSB_08_06 0; +BA_ "GenSigCmt" SG_ 295 CAN_SCAN_INDEX_2LSB_08_06 "CAN_SCAN_INDEX_2LSB_08_06"; +BA_ "GenMsgSendType" BO_ 294 1; +BA_ "GenMsgILSupport" BO_ 294 1; +BA_ "GenMsgNrOfRepetition" BO_ 294 0; +BA_ "GenMsgCycleTime" BO_ 294 0; +BA_ "NetworkInitialization" BO_ 294 0; +BA_ "GenMsgDelayTime" BO_ 294 0; +BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_01 "CAN_DET_CONFID_AZIMUTH_07_01"; +BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_01 "CAN_DET_CONFID_AZIMUTH_07_01"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_01 "CAN_DET_CONFID_AZIMUTH_07_01"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_01 "CAN_DET_SUPER_RES_TARGET_07_01"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_01 "CAN_DET_ND_TARGET_07_01"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_01 "CAN_DET_HOST_VEH_CLUTTER_07_01"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_01 "CAN_DET_VALID_LEVEL_07_01"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_01 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_01 "CAN_DET_AZIMUTH_07_01"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_01 "CAN_DET_RANGE_07_01"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_01 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_01 "CAN_DET_RANGE_RATE_07_01"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_01 "CAN_DET_AMPLITUDE_07_01"; +BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_01 0; +BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_01 "CAN_SCAN_INDEX_2LSB_07_01"; +BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_02 "CAN_DET_CONFID_AZIMUTH_07_02"; +BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_02 "CAN_DET_CONFID_AZIMUTH_07_02"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_02 "CAN_DET_CONFID_AZIMUTH_07_02"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_02 "CAN_DET_SUPER_RES_TARGET_07_02"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_02 "CAN_DET_ND_TARGET_07_02"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_02 "CAN_DET_HOST_VEH_CLUTTER_07_02"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_02 "CAN_DET_VALID_LEVEL_07_02"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_02 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_02 "CAN_DET_AZIMUTH_07_02"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_02 "CAN_DET_RANGE_07_02"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_02 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_02 "CAN_DET_RANGE_RATE_07_02"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_02 "CAN_DET_AMPLITUDE_07_02"; +BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_02 0; +BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_02 "CAN_SCAN_INDEX_2LSB_07_02"; +BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_03 "CAN_DET_CONFID_AZIMUTH_07_03"; +BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_03 "CAN_DET_CONFID_AZIMUTH_07_03"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_03 "CAN_DET_CONFID_AZIMUTH_07_03"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_03 "CAN_DET_SUPER_RES_TARGET_07_03"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_03 "CAN_DET_ND_TARGET_07_03"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_03 "CAN_DET_HOST_VEH_CLUTTER_07_03"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_03 "CAN_DET_VALID_LEVEL_07_03"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_03 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_03 "CAN_DET_AZIMUTH_07_03"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_03 "CAN_DET_RANGE_07_03"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_03 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_03 "CAN_DET_RANGE_RATE_07_03"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_03 "CAN_DET_AMPLITUDE_07_03"; +BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_03 0; +BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_03 "CAN_SCAN_INDEX_2LSB_07_03"; +BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_04 "CAN_DET_CONFID_AZIMUTH_07_04"; +BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_04 "CAN_DET_CONFID_AZIMUTH_07_04"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_04 "CAN_DET_CONFID_AZIMUTH_07_04"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_04 "CAN_DET_SUPER_RES_TARGET_07_04"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_04 "CAN_DET_ND_TARGET_07_04"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_04 "CAN_DET_HOST_VEH_CLUTTER_07_04"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_04 "CAN_DET_VALID_LEVEL_07_04"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_04 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_04 "CAN_DET_AZIMUTH_07_04"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_04 "CAN_DET_RANGE_07_04"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_04 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_04 "CAN_DET_RANGE_RATE_07_04"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_04 "CAN_DET_AMPLITUDE_07_04"; +BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_04 0; +BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_04 "CAN_SCAN_INDEX_2LSB_07_04"; +BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_05 "CAN_DET_CONFID_AZIMUTH_07_05"; +BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_05 "CAN_DET_CONFID_AZIMUTH_07_05"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_05 "CAN_DET_CONFID_AZIMUTH_07_05"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_05 "CAN_DET_SUPER_RES_TARGET_07_05"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_05 "CAN_DET_ND_TARGET_07_05"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_05 "CAN_DET_HOST_VEH_CLUTTER_07_05"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_05 "CAN_DET_VALID_LEVEL_07_05"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_05 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_05 "CAN_DET_AZIMUTH_07_05"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_05 "CAN_DET_RANGE_07_05"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_05 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_05 "CAN_DET_RANGE_RATE_07_05"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_05 "CAN_DET_AMPLITUDE_07_05"; +BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_05 0; +BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_05 "CAN_SCAN_INDEX_2LSB_07_05"; +BA_ "GenSigVtEn" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_06 "CAN_DET_CONFID_AZIMUTH_07_06"; +BA_ "GenSigVtName" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_06 "CAN_DET_CONFID_AZIMUTH_07_06"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_CONFID_AZIMUTH_07_06 "CAN_DET_CONFID_AZIMUTH_07_06"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_SUPER_RES_TARGET_07_06 "CAN_DET_SUPER_RES_TARGET_07_06"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_ND_TARGET_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_ND_TARGET_07_06 "CAN_DET_ND_TARGET_07_06"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_HOST_VEH_CLUTTER_07_06 "CAN_DET_HOST_VEH_CLUTTER_07_06"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_VALID_LEVEL_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_VALID_LEVEL_07_06 "CAN_DET_VALID_LEVEL_07_06"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_AZIMUTH_07_06 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AZIMUTH_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AZIMUTH_07_06 "CAN_DET_AZIMUTH_07_06"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_07_06 "CAN_DET_RANGE_07_06"; +BA_ "GenSigStartValue" SG_ 294 CAN_DET_RANGE_RATE_07_06 0; +BA_ "GenSigSendType" SG_ 294 CAN_DET_RANGE_RATE_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_RANGE_RATE_07_06 "CAN_DET_RANGE_RATE_07_06"; +BA_ "GenSigSendType" SG_ 294 CAN_DET_AMPLITUDE_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_DET_AMPLITUDE_07_06 "CAN_DET_AMPLITUDE_07_06"; +BA_ "GenSigSendType" SG_ 294 CAN_SCAN_INDEX_2LSB_07_06 0; +BA_ "GenSigCmt" SG_ 294 CAN_SCAN_INDEX_2LSB_07_06 "CAN_SCAN_INDEX_2LSB_07_06"; +BA_ "GenMsgSendType" BO_ 293 1; +BA_ "GenMsgILSupport" BO_ 293 1; +BA_ "GenMsgNrOfRepetition" BO_ 293 0; +BA_ "GenMsgCycleTime" BO_ 293 0; +BA_ "NetworkInitialization" BO_ 293 0; +BA_ "GenMsgDelayTime" BO_ 293 0; +BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_01 "CAN_DET_CONFID_AZIMUTH_06_01"; +BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_01 "CAN_DET_CONFID_AZIMUTH_06_01"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_01 "CAN_DET_CONFID_AZIMUTH_06_01"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_01 "CAN_DET_SUPER_RES_TARGET_06_01"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_01 "CAN_DET_ND_TARGET_06_01"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_01 "CAN_DET_HOST_VEH_CLUTTER_06_01"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_01 "CAN_DET_VALID_LEVEL_06_01"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_01 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_01 "CAN_DET_AZIMUTH_06_01"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_01 "CAN_DET_RANGE_06_01"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_01 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_01 "CAN_DET_RANGE_RATE_06_01"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_01 "CAN_DET_AMPLITUDE_06_01"; +BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_01 0; +BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_01 "CAN_SCAN_INDEX_2LSB_06_01"; +BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_02 "CAN_DET_CONFID_AZIMUTH_06_02"; +BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_02 "CAN_DET_CONFID_AZIMUTH_06_02"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_02 "CAN_DET_CONFID_AZIMUTH_06_02"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_02 "CAN_DET_SUPER_RES_TARGET_06_02"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_02 "CAN_DET_ND_TARGET_06_02"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_02 "CAN_DET_HOST_VEH_CLUTTER_06_02"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_02 "CAN_DET_VALID_LEVEL_06_02"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_02 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_02 "CAN_DET_AZIMUTH_06_02"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_02 "CAN_DET_RANGE_06_02"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_02 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_02 "CAN_DET_RANGE_RATE_06_02"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_02 "CAN_DET_AMPLITUDE_06_02"; +BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_02 0; +BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_02 "CAN_SCAN_INDEX_2LSB_06_02"; +BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_03 "CAN_DET_CONFID_AZIMUTH_06_03"; +BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_03 "CAN_DET_CONFID_AZIMUTH_06_03"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_03 "CAN_DET_CONFID_AZIMUTH_06_03"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_03 "CAN_DET_SUPER_RES_TARGET_06_03"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_03 "CAN_DET_ND_TARGET_06_03"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_03 "CAN_DET_HOST_VEH_CLUTTER_06_03"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_03 "CAN_DET_VALID_LEVEL_06_03"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_03 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_03 "CAN_DET_AZIMUTH_06_03"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_03 "CAN_DET_RANGE_06_03"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_03 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_03 "CAN_DET_RANGE_RATE_06_03"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_03 "CAN_DET_AMPLITUDE_06_03"; +BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_03 0; +BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_03 "CAN_SCAN_INDEX_2LSB_06_03"; +BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_04 "CAN_DET_CONFID_AZIMUTH_06_04"; +BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_04 "CAN_DET_CONFID_AZIMUTH_06_04"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_04 "CAN_DET_CONFID_AZIMUTH_06_04"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_04 "CAN_DET_SUPER_RES_TARGET_06_04"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_04 "CAN_DET_ND_TARGET_06_04"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_04 "CAN_DET_HOST_VEH_CLUTTER_06_04"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_04 "CAN_DET_VALID_LEVEL_06_04"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_04 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_04 "CAN_DET_AZIMUTH_06_04"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_04 "CAN_DET_RANGE_06_04"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_04 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_04 "CAN_DET_RANGE_RATE_06_04"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_04 "CAN_DET_AMPLITUDE_06_04"; +BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_04 0; +BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_04 "CAN_SCAN_INDEX_2LSB_06_04"; +BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_05 "CAN_DET_CONFID_AZIMUTH_06_05"; +BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_05 "CAN_DET_CONFID_AZIMUTH_06_05"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_05 "CAN_DET_CONFID_AZIMUTH_06_05"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_05 "CAN_DET_SUPER_RES_TARGET_06_05"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_05 "CAN_DET_ND_TARGET_06_05"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_05 "CAN_DET_HOST_VEH_CLUTTER_06_05"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_05 "CAN_DET_VALID_LEVEL_06_05"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_05 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_05 "CAN_DET_AZIMUTH_06_05"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_05 "CAN_DET_RANGE_06_05"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_05 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_05 "CAN_DET_RANGE_RATE_06_05"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_05 "CAN_DET_AMPLITUDE_06_05"; +BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_05 0; +BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_05 "CAN_SCAN_INDEX_2LSB_06_05"; +BA_ "GenSigVtEn" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_06 "CAN_DET_CONFID_AZIMUTH_06_06"; +BA_ "GenSigVtName" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_06 "CAN_DET_CONFID_AZIMUTH_06_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_CONFID_AZIMUTH_06_06 "CAN_DET_CONFID_AZIMUTH_06_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_SUPER_RES_TARGET_06_06 "CAN_DET_SUPER_RES_TARGET_06_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_ND_TARGET_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_ND_TARGET_06_06 "CAN_DET_ND_TARGET_06_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_HOST_VEH_CLUTTER_06_06 "CAN_DET_HOST_VEH_CLUTTER_06_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_VALID_LEVEL_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_VALID_LEVEL_06_06 "CAN_DET_VALID_LEVEL_06_06"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_AZIMUTH_06_06 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AZIMUTH_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AZIMUTH_06_06 "CAN_DET_AZIMUTH_06_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_06_06 "CAN_DET_RANGE_06_06"; +BA_ "GenSigStartValue" SG_ 293 CAN_DET_RANGE_RATE_06_06 0; +BA_ "GenSigSendType" SG_ 293 CAN_DET_RANGE_RATE_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_RANGE_RATE_06_06 "CAN_DET_RANGE_RATE_06_06"; +BA_ "GenSigSendType" SG_ 293 CAN_DET_AMPLITUDE_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_DET_AMPLITUDE_06_06 "CAN_DET_AMPLITUDE_06_06"; +BA_ "GenSigSendType" SG_ 293 CAN_SCAN_INDEX_2LSB_06_06 0; +BA_ "GenSigCmt" SG_ 293 CAN_SCAN_INDEX_2LSB_06_06 "CAN_SCAN_INDEX_2LSB_06_06"; +BA_ "GenMsgSendType" BO_ 292 1; +BA_ "GenMsgILSupport" BO_ 292 1; +BA_ "GenMsgNrOfRepetition" BO_ 292 0; +BA_ "GenMsgCycleTime" BO_ 292 0; +BA_ "NetworkInitialization" BO_ 292 0; +BA_ "GenMsgDelayTime" BO_ 292 0; +BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_01 "CAN_DET_CONFID_AZIMUTH_05_01"; +BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_01 "CAN_DET_CONFID_AZIMUTH_05_01"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_01 "CAN_DET_CONFID_AZIMUTH_05_01"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_01 "CAN_DET_SUPER_RES_TARGET_05_01"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_01 "CAN_DET_ND_TARGET_05_01"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_01 "CAN_DET_HOST_VEH_CLUTTER_05_01"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_01 "CAN_DET_VALID_LEVEL_05_01"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_01 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_01 "CAN_DET_AZIMUTH_05_01"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_01 "CAN_DET_RANGE_05_01"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_01 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_01 "CAN_DET_RANGE_RATE_05_01"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_01 "CAN_DET_AMPLITUDE_05_01"; +BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_01 0; +BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_01 "CAN_SCAN_INDEX_2LSB_05_01"; +BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_02 "CAN_DET_CONFID_AZIMUTH_05_02"; +BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_02 "CAN_DET_CONFID_AZIMUTH_05_02"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_02 "CAN_DET_CONFID_AZIMUTH_05_02"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_02 "CAN_DET_SUPER_RES_TARGET_05_02"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_02 "CAN_DET_ND_TARGET_05_02"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_02 "CAN_DET_HOST_VEH_CLUTTER_05_02"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_02 "CAN_DET_VALID_LEVEL_05_02"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_02 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_02 "CAN_DET_AZIMUTH_05_02"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_02 "CAN_DET_RANGE_05_02"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_02 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_02 "CAN_DET_RANGE_RATE_05_02"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_02 "CAN_DET_AMPLITUDE_05_02"; +BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_02 0; +BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_02 "CAN_SCAN_INDEX_2LSB_05_02"; +BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_03 "CAN_DET_CONFID_AZIMUTH_05_03"; +BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_03 "CAN_DET_CONFID_AZIMUTH_05_03"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_03 "CAN_DET_CONFID_AZIMUTH_05_03"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_03 "CAN_DET_SUPER_RES_TARGET_05_03"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_03 "CAN_DET_ND_TARGET_05_03"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_03 "CAN_DET_HOST_VEH_CLUTTER_05_03"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_03 "CAN_DET_VALID_LEVEL_05_03"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_03 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_03 "CAN_DET_AZIMUTH_05_03"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_03 "CAN_DET_RANGE_05_03"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_03 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_03 "CAN_DET_RANGE_RATE_05_03"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_03 "CAN_DET_AMPLITUDE_05_03"; +BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_03 0; +BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_03 "CAN_SCAN_INDEX_2LSB_05_03"; +BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_04 "CAN_DET_CONFID_AZIMUTH_05_04"; +BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_04 "CAN_DET_CONFID_AZIMUTH_05_04"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_04 "CAN_DET_CONFID_AZIMUTH_05_04"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_04 "CAN_DET_SUPER_RES_TARGET_05_04"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_04 "CAN_DET_ND_TARGET_05_04"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_04 "CAN_DET_HOST_VEH_CLUTTER_05_04"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_04 "CAN_DET_VALID_LEVEL_05_04"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_04 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_04 "CAN_DET_AZIMUTH_05_04"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_04 "CAN_DET_RANGE_05_04"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_04 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_04 "CAN_DET_RANGE_RATE_05_04"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_04 "CAN_DET_AMPLITUDE_05_04"; +BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_04 0; +BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_04 "CAN_SCAN_INDEX_2LSB_05_04"; +BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_05 "CAN_DET_CONFID_AZIMUTH_05_05"; +BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_05 "CAN_DET_CONFID_AZIMUTH_05_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_05 "CAN_DET_CONFID_AZIMUTH_05_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_05 "CAN_DET_SUPER_RES_TARGET_05_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_05 "CAN_DET_ND_TARGET_05_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_05 "CAN_DET_HOST_VEH_CLUTTER_05_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_05 "CAN_DET_VALID_LEVEL_05_05"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_05 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_05 "CAN_DET_AZIMUTH_05_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_05 "CAN_DET_RANGE_05_05"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_05 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_05 "CAN_DET_RANGE_RATE_05_05"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_05 "CAN_DET_AMPLITUDE_05_05"; +BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_05 0; +BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_05 "CAN_SCAN_INDEX_2LSB_05_05"; +BA_ "GenSigVtEn" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_06 "CAN_DET_CONFID_AZIMUTH_05_06"; +BA_ "GenSigVtName" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_06 "CAN_DET_CONFID_AZIMUTH_05_06"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_CONFID_AZIMUTH_05_06 "CAN_DET_CONFID_AZIMUTH_05_06"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_SUPER_RES_TARGET_05_06 "CAN_DET_SUPER_RES_TARGET_05_06"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_ND_TARGET_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_ND_TARGET_05_06 "CAN_DET_ND_TARGET_05_06"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_HOST_VEH_CLUTTER_05_06 "CAN_DET_HOST_VEH_CLUTTER_05_06"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_VALID_LEVEL_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_VALID_LEVEL_05_06 "CAN_DET_VALID_LEVEL_05_06"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_AZIMUTH_05_06 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AZIMUTH_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AZIMUTH_05_06 "CAN_DET_AZIMUTH_05_06"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_05_06 "CAN_DET_RANGE_05_06"; +BA_ "GenSigStartValue" SG_ 292 CAN_DET_RANGE_RATE_05_06 0; +BA_ "GenSigSendType" SG_ 292 CAN_DET_RANGE_RATE_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_RANGE_RATE_05_06 "CAN_DET_RANGE_RATE_05_06"; +BA_ "GenSigSendType" SG_ 292 CAN_DET_AMPLITUDE_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_DET_AMPLITUDE_05_06 "CAN_DET_AMPLITUDE_05_06"; +BA_ "GenSigSendType" SG_ 292 CAN_SCAN_INDEX_2LSB_05_06 0; +BA_ "GenSigCmt" SG_ 292 CAN_SCAN_INDEX_2LSB_05_06 "CAN_SCAN_INDEX_2LSB_05_06"; +BA_ "GenMsgSendType" BO_ 290 1; +BA_ "GenMsgILSupport" BO_ 290 1; +BA_ "GenMsgNrOfRepetition" BO_ 290 0; +BA_ "GenMsgCycleTime" BO_ 290 0; +BA_ "NetworkInitialization" BO_ 290 0; +BA_ "GenMsgDelayTime" BO_ 290 0; +BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_01 "CAN_DET_CONFID_AZIMUTH_03_01"; +BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_01 "CAN_DET_CONFID_AZIMUTH_03_01"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_01 "CAN_DET_CONFID_AZIMUTH_03_01"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_01 "CAN_DET_SUPER_RES_TARGET_03_01"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_01 "CAN_DET_ND_TARGET_03_01"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_01 "CAN_DET_HOST_VEH_CLUTTER_03_01"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_01 "CAN_DET_VALID_LEVEL_03_01"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_01 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_01 "CAN_DET_AZIMUTH_03_01"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_01 "CAN_DET_RANGE_03_01"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_01 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_01 "CAN_DET_RANGE_RATE_03_01"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_01 "CAN_DET_AMPLITUDE_03_01"; +BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_01 0; +BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_01 "CAN_SCAN_INDEX_2LSB_03_01"; +BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_02 "CAN_DET_CONFID_AZIMUTH_03_02"; +BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_02 "CAN_DET_CONFID_AZIMUTH_03_02"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_02 "CAN_DET_CONFID_AZIMUTH_03_02"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_02 "CAN_DET_SUPER_RES_TARGET_03_02"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_02 "CAN_DET_ND_TARGET_03_02"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_02 "CAN_DET_HOST_VEH_CLUTTER_03_02"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_02 "CAN_DET_VALID_LEVEL_03_02"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_02 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_02 "CAN_DET_AZIMUTH_03_02"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_02 "CAN_DET_RANGE_03_02"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_02 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_02 "CAN_DET_RANGE_RATE_03_02"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_02 "CAN_DET_AMPLITUDE_03_02"; +BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_02 0; +BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_02 "CAN_SCAN_INDEX_2LSB_03_02"; +BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_03 "CAN_DET_CONFID_AZIMUTH_03_03"; +BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_03 "CAN_DET_CONFID_AZIMUTH_03_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_03 "CAN_DET_CONFID_AZIMUTH_03_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_03 "CAN_DET_SUPER_RES_TARGET_03_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_03 "CAN_DET_ND_TARGET_03_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_03 "CAN_DET_HOST_VEH_CLUTTER_03_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_03 "CAN_DET_VALID_LEVEL_03_03"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_03 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_03 "CAN_DET_AZIMUTH_03_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_03 "CAN_DET_RANGE_03_03"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_03 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_03 "CAN_DET_RANGE_RATE_03_03"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_03 "CAN_DET_AMPLITUDE_03_03"; +BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_03 0; +BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_03 "CAN_SCAN_INDEX_2LSB_03_03"; +BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_04 "CAN_DET_CONFID_AZIMUTH_03_04"; +BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_04 "CAN_DET_CONFID_AZIMUTH_03_04"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_04 "CAN_DET_CONFID_AZIMUTH_03_04"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_04 "CAN_DET_SUPER_RES_TARGET_03_04"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_04 "CAN_DET_ND_TARGET_03_04"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_04 "CAN_DET_HOST_VEH_CLUTTER_03_04"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_04 "CAN_DET_VALID_LEVEL_03_04"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_04 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_04 "CAN_DET_AZIMUTH_03_04"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_04 "CAN_DET_RANGE_03_04"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_04 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_04 "CAN_DET_RANGE_RATE_03_04"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_04 "CAN_DET_AMPLITUDE_03_04"; +BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_04 0; +BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_04 "CAN_SCAN_INDEX_2LSB_03_04"; +BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_05 "CAN_DET_CONFID_AZIMUTH_03_05"; +BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_05 "CAN_DET_CONFID_AZIMUTH_03_05"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_05 "CAN_DET_CONFID_AZIMUTH_03_05"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_05 "CAN_DET_SUPER_RES_TARGET_03_05"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_05 "CAN_DET_ND_TARGET_03_05"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_05 "CAN_DET_HOST_VEH_CLUTTER_03_05"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_05 "CAN_DET_VALID_LEVEL_03_05"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_05 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_05 "CAN_DET_AZIMUTH_03_05"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_05 "CAN_DET_RANGE_03_05"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_05 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_05 "CAN_DET_RANGE_RATE_03_05"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_05 "CAN_DET_AMPLITUDE_03_05"; +BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_05 0; +BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_05 "CAN_SCAN_INDEX_2LSB_03_05"; +BA_ "GenSigVtEn" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_06 "CAN_DET_CONFID_AZIMUTH_03_06"; +BA_ "GenSigVtName" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_06 "CAN_DET_CONFID_AZIMUTH_03_06"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_CONFID_AZIMUTH_03_06 "CAN_DET_CONFID_AZIMUTH_03_06"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_SUPER_RES_TARGET_03_06 "CAN_DET_SUPER_RES_TARGET_03_06"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_ND_TARGET_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_ND_TARGET_03_06 "CAN_DET_ND_TARGET_03_06"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_HOST_VEH_CLUTTER_03_06 "CAN_DET_HOST_VEH_CLUTTER_03_06"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_VALID_LEVEL_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_VALID_LEVEL_03_06 "CAN_DET_VALID_LEVEL_03_06"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_AZIMUTH_03_06 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AZIMUTH_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AZIMUTH_03_06 "CAN_DET_AZIMUTH_03_06"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_03_06 "CAN_DET_RANGE_03_06"; +BA_ "GenSigStartValue" SG_ 290 CAN_DET_RANGE_RATE_03_06 0; +BA_ "GenSigSendType" SG_ 290 CAN_DET_RANGE_RATE_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_RANGE_RATE_03_06 "CAN_DET_RANGE_RATE_03_06"; +BA_ "GenSigSendType" SG_ 290 CAN_DET_AMPLITUDE_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_DET_AMPLITUDE_03_06 "CAN_DET_AMPLITUDE_03_06"; +BA_ "GenSigSendType" SG_ 290 CAN_SCAN_INDEX_2LSB_03_06 0; +BA_ "GenSigCmt" SG_ 290 CAN_SCAN_INDEX_2LSB_03_06 "CAN_SCAN_INDEX_2LSB_03_06"; +BA_ "GenMsgSendType" BO_ 289 1; +BA_ "GenMsgILSupport" BO_ 289 1; +BA_ "GenMsgNrOfRepetition" BO_ 289 0; +BA_ "GenMsgCycleTime" BO_ 289 0; +BA_ "NetworkInitialization" BO_ 289 0; +BA_ "GenMsgDelayTime" BO_ 289 0; +BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_01 "CAN_DET_CONFID_AZIMUTH_02_01"; +BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_01 "CAN_DET_CONFID_AZIMUTH_02_01"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_01 "CAN_DET_CONFID_AZIMUTH_02_01"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_01 "CAN_DET_SUPER_RES_TARGET_02_01"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_01 "CAN_DET_ND_TARGET_02_01"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_01 "CAN_DET_HOST_VEH_CLUTTER_02_01"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_01 "CAN_DET_VALID_LEVEL_02_01"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_01 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_01 "CAN_DET_AZIMUTH_02_01"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_01 "CAN_DET_RANGE_02_01"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_01 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_01 "CAN_DET_RANGE_RATE_02_01"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_01 "CAN_DET_AMPLITUDE_02_01"; +BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_01 0; +BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_01 "CAN_SCAN_INDEX_2LSB_02_01"; +BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_02 "CAN_DET_CONFID_AZIMUTH_02_02"; +BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_02 "CAN_DET_CONFID_AZIMUTH_02_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_02 "CAN_DET_CONFID_AZIMUTH_02_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_02 "CAN_DET_SUPER_RES_TARGET_02_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_02 "CAN_DET_ND_TARGET_02_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_02 "CAN_DET_HOST_VEH_CLUTTER_02_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_02 "CAN_DET_VALID_LEVEL_02_02"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_02 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_02 "CAN_DET_AZIMUTH_02_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_02 "CAN_DET_RANGE_02_02"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_02 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_02 "CAN_DET_RANGE_RATE_02_02"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_02 "CAN_DET_AMPLITUDE_02_02"; +BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_02 0; +BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_02 "CAN_SCAN_INDEX_2LSB_02_02"; +BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_03 "CAN_DET_CONFID_AZIMUTH_02_03"; +BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_03 "CAN_DET_CONFID_AZIMUTH_02_03"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_03 "CAN_DET_CONFID_AZIMUTH_02_03"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_03 "CAN_DET_SUPER_RES_TARGET_02_03"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_03 "CAN_DET_ND_TARGET_02_03"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_03 "CAN_DET_HOST_VEH_CLUTTER_02_03"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_03 "CAN_DET_VALID_LEVEL_02_03"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_03 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_03 "CAN_DET_AZIMUTH_02_03"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_03 "CAN_DET_RANGE_02_03"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_03 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_03 "CAN_DET_RANGE_RATE_02_03"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_03 "CAN_DET_AMPLITUDE_02_03"; +BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_03 0; +BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_03 "CAN_SCAN_INDEX_2LSB_02_03"; +BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_04 "CAN_DET_CONFID_AZIMUTH_02_04"; +BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_04 "CAN_DET_CONFID_AZIMUTH_02_04"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_04 "CAN_DET_CONFID_AZIMUTH_02_04"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_04 "CAN_DET_SUPER_RES_TARGET_02_04"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_04 "CAN_DET_ND_TARGET_02_04"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_04 "CAN_DET_HOST_VEH_CLUTTER_02_04"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_04 "CAN_DET_VALID_LEVEL_02_04"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_04 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_04 "CAN_DET_AZIMUTH_02_04"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_04 "CAN_DET_RANGE_02_04"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_04 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_04 "CAN_DET_RANGE_RATE_02_04"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_04 "CAN_DET_AMPLITUDE_02_04"; +BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_04 0; +BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_04 "CAN_SCAN_INDEX_2LSB_02_04"; +BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_05 "CAN_DET_CONFID_AZIMUTH_02_05"; +BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_05 "CAN_DET_CONFID_AZIMUTH_02_05"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_05 "CAN_DET_CONFID_AZIMUTH_02_05"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_05 "CAN_DET_SUPER_RES_TARGET_02_05"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_05 "CAN_DET_ND_TARGET_02_05"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_05 "CAN_DET_HOST_VEH_CLUTTER_02_05"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_05 "CAN_DET_VALID_LEVEL_02_05"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_05 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_05 "CAN_DET_AZIMUTH_02_05"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_05 "CAN_DET_RANGE_02_05"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_05 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_05 "CAN_DET_RANGE_RATE_02_05"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_05 "CAN_DET_AMPLITUDE_02_05"; +BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_05 0; +BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_05 "CAN_SCAN_INDEX_2LSB_02_05"; +BA_ "GenSigVtEn" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_06 "CAN_DET_CONFID_AZIMUTH_02_06"; +BA_ "GenSigVtName" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_06 "CAN_DET_CONFID_AZIMUTH_02_06"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_CONFID_AZIMUTH_02_06 "CAN_DET_CONFID_AZIMUTH_02_06"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_SUPER_RES_TARGET_02_06 "CAN_DET_SUPER_RES_TARGET_02_06"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_ND_TARGET_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_ND_TARGET_02_06 "CAN_DET_ND_TARGET_02_06"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_HOST_VEH_CLUTTER_02_06 "CAN_DET_HOST_VEH_CLUTTER_02_06"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_VALID_LEVEL_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_VALID_LEVEL_02_06 "CAN_DET_VALID_LEVEL_02_06"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_AZIMUTH_02_06 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AZIMUTH_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AZIMUTH_02_06 "CAN_DET_AZIMUTH_02_06"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_02_06 "CAN_DET_RANGE_02_06"; +BA_ "GenSigStartValue" SG_ 289 CAN_DET_RANGE_RATE_02_06 0; +BA_ "GenSigSendType" SG_ 289 CAN_DET_RANGE_RATE_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_RANGE_RATE_02_06 "CAN_DET_RANGE_RATE_02_06"; +BA_ "GenSigSendType" SG_ 289 CAN_DET_AMPLITUDE_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_DET_AMPLITUDE_02_06 "CAN_DET_AMPLITUDE_02_06"; +BA_ "GenSigSendType" SG_ 289 CAN_SCAN_INDEX_2LSB_02_06 0; +BA_ "GenSigCmt" SG_ 289 CAN_SCAN_INDEX_2LSB_02_06 "CAN_SCAN_INDEX_2LSB_02_06"; +BA_ "GenMsgSendType" BO_ 256 1; +BA_ "GenMsgILSupport" BO_ 256 1; +BA_ "GenMsgNrOfRepetition" BO_ 256 0; +BA_ "NetworkInitialization" BO_ 256 0; +BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MINOR_MRR "CAN_PCAN_MINOR_MRR"; +BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MINOR_MRR 0; +BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MAJOR_MRR "CAN_PCAN_MAJOR_MRR"; +BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MAJOR_MRR 0; +BA_ "GenMsgCycleTime" BO_ 257 30; +BA_ "GenMsgSendType" BO_ 257 0; +BA_ "GenMsgILSupport" BO_ 257 1; +BA_ "GenMsgNrOfRepetition" BO_ 257 0; +BA_ "NetworkInitialization" BO_ 257 0; +BA_ "GenSigCmt" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtEn" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtName" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtName" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigCmt" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigStartValue" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE 0; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_MNR 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_EXT_COND_NOK 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_NOT_START 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_OVERHEAT_ERROR 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_NOT_OP 0; +BA_ "GenSigCmt" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigVtEn" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigVtName" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigSendType" SG_ 257 CAN_XCVR_OPERATIONAL 0; +BA_ "GenMsgSendType" BO_ 288 1; +BA_ "GenMsgILSupport" BO_ 288 1; +BA_ "GenMsgNrOfRepetition" BO_ 288 0; +BA_ "GenMsgCycleTime" BO_ 288 0; +BA_ "NetworkInitialization" BO_ 288 0; +BA_ "GenMsgDelayTime" BO_ 288 0; +BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_01 "CAN_DET_CONFID_AZIMUTH_01_01"; +BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_01 "CAN_DET_CONFID_AZIMUTH_01_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_01 "CAN_DET_CONFID_AZIMUTH_01_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_01 "CAN_DET_SUPER_RES_TARGET_01_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_01 "CAN_DET_ND_TARGET_01_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_01 "CAN_DET_HOST_VEH_CLUTTER_01_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_01 "CAN_DET_VALID_LEVEL_01_01"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_01 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_01 "CAN_DET_AZIMUTH_01_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_01 "CAN_DET_RANGE_01_01"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_01 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_01 "CAN_DET_RANGE_RATE_01_01"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_01 "CAN_DET_AMPLITUDE_01_01"; +BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_01 0; +BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_01 "CAN_SCAN_INDEX_2LSB_01_01"; +BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_02 "CAN_DET_CONFID_AZIMUTH_01_02"; +BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_02 "CAN_DET_CONFID_AZIMUTH_01_02"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_02 "CAN_DET_CONFID_AZIMUTH_01_02"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_02 "CAN_DET_SUPER_RES_TARGET_01_02"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_02 "CAN_DET_ND_TARGET_01_02"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_02 "CAN_DET_HOST_VEH_CLUTTER_01_02"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_02 "CAN_DET_VALID_LEVEL_01_02"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_02 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_02 "CAN_DET_AZIMUTH_01_02"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_02 "CAN_DET_RANGE_01_02"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_02 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_02 "CAN_DET_RANGE_RATE_01_02"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_02 "CAN_DET_AMPLITUDE_01_02"; +BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_02 0; +BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_02 "CAN_SCAN_INDEX_2LSB_01_02"; +BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_03 "CAN_DET_CONFID_AZIMUTH_01_03"; +BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_03 "CAN_DET_CONFID_AZIMUTH_01_03"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_03 "CAN_DET_CONFID_AZIMUTH_01_03"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_03 "CAN_DET_SUPER_RES_TARGET_01_03"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_03 "CAN_DET_ND_TARGET_01_03"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_03 "CAN_DET_HOST_VEH_CLUTTER_01_03"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_03 "CAN_DET_VALID_LEVEL_01_03"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_03 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_03 "CAN_DET_AZIMUTH_01_03"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_03 "CAN_DET_RANGE_01_03"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_03 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_03 "CAN_DET_RANGE_RATE_01_03"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_03 "CAN_DET_AMPLITUDE_01_03"; +BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_03 0; +BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_03 "CAN_SCAN_INDEX_2LSB_01_03"; +BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_04 "CAN_DET_CONFID_AZIMUTH_01_04"; +BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_04 "CAN_DET_CONFID_AZIMUTH_01_04"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_04 "CAN_DET_CONFID_AZIMUTH_01_04"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_04 "CAN_DET_SUPER_RES_TARGET_01_04"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_04 "CAN_DET_ND_TARGET_01_04"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_04 "CAN_DET_HOST_VEH_CLUTTER_01_04"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_04 "CAN_DET_VALID_LEVEL_01_04"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_04 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_04 "CAN_DET_AZIMUTH_01_04"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_04 "CAN_DET_RANGE_01_04"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_04 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_04 "CAN_DET_RANGE_RATE_01_04"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_04 "CAN_DET_AMPLITUDE_01_04"; +BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_04 0; +BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_04 "CAN_SCAN_INDEX_2LSB_01_04"; +BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_05 "CAN_DET_CONFID_AZIMUTH_01_05"; +BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_05 "CAN_DET_CONFID_AZIMUTH_01_05"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_05 "CAN_DET_CONFID_AZIMUTH_01_05"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_05 "CAN_DET_SUPER_RES_TARGET_01_05"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_05 "CAN_DET_ND_TARGET_01_05"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_05 "CAN_DET_HOST_VEH_CLUTTER_01_05"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_05 "CAN_DET_VALID_LEVEL_01_05"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_05 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_05 "CAN_DET_AZIMUTH_01_05"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_05 "CAN_DET_RANGE_01_05"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_05 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_05 "CAN_DET_RANGE_RATE_01_05"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_05 "CAN_DET_AMPLITUDE_01_05"; +BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_05 0; +BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_05 "CAN_SCAN_INDEX_2LSB_01_05"; +BA_ "GenSigVtEn" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_06 "CAN_DET_CONFID_AZIMUTH_01_06"; +BA_ "GenSigVtName" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_06 "CAN_DET_CONFID_AZIMUTH_01_06"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_CONFID_AZIMUTH_01_06 "CAN_DET_CONFID_AZIMUTH_01_06"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_SUPER_RES_TARGET_01_06 "CAN_DET_SUPER_RES_TARGET_01_06"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_ND_TARGET_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_ND_TARGET_01_06 "CAN_DET_ND_TARGET_01_06"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_HOST_VEH_CLUTTER_01_06 "CAN_DET_HOST_VEH_CLUTTER_01_06"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_VALID_LEVEL_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_VALID_LEVEL_01_06 "CAN_DET_VALID_LEVEL_01_06"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_AZIMUTH_01_06 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AZIMUTH_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AZIMUTH_01_06 "CAN_DET_AZIMUTH_01_06"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_01_06 "CAN_DET_RANGE_01_06"; +BA_ "GenSigStartValue" SG_ 288 CAN_DET_RANGE_RATE_01_06 0; +BA_ "GenSigSendType" SG_ 288 CAN_DET_RANGE_RATE_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_RANGE_RATE_01_06 "CAN_DET_RANGE_RATE_01_06"; +BA_ "GenSigSendType" SG_ 288 CAN_DET_AMPLITUDE_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_DET_AMPLITUDE_01_06 "CAN_DET_AMPLITUDE_01_06"; +BA_ "GenSigSendType" SG_ 288 CAN_SCAN_INDEX_2LSB_01_06 0; +BA_ "GenSigCmt" SG_ 288 CAN_SCAN_INDEX_2LSB_01_06 "CAN_SCAN_INDEX_2LSB_01_06"; +BA_DEF_DEF_ "CrossOver_InfoCAN" "No"; +BA_DEF_DEF_ "CrossOver_LIN" "No"; +BA_DEF_DEF_ "UsedOnPgmDBC" "Yes"; +BA_DEF_DEF_ "ContentDependant" "No"; +BA_DEF_DEF_ "GenSigTimeoutTime_RCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_GWM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_OCS" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_ABS_ESC" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_CCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_IPMA" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_TSTR" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_SCCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_PSCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime__delete" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_Generic_BCM" 0; +BA_DEF_DEF_ "NmMessage" "No"; +BA_DEF_DEF_ "DiagResponse" "No"; +BA_DEF_DEF_ "DiagRequest" "No"; +BA_DEF_DEF_ "TpTxIndex" 0; +BA_DEF_DEF_ "DiagState" "No"; +BA_DEF_DEF_ "TpApplType" ""; +BA_DEF_DEF_ "NmAsrMessage" "No"; +BA_DEF_DEF_ "Mulitplexer" "No"; +BA_DEF_DEF_ "ConfiguredTransmitter" "No"; +BA_DEF_DEF_ "EventRateOfChange" 10000; +BA_DEF_DEF_ "GenMsgHandlingTypeDoc" ""; +BA_DEF_DEF_ "GenMsgHandlingTypeCode" ""; +BA_DEF_DEF_ "GenMsgMarked" ""; +BA_DEF_DEF_ "GenSigMarked" ""; +BA_DEF_DEF_ "GenSigVtIndex" ""; +BA_DEF_DEF_ "GenSigVtName" ""; +BA_DEF_DEF_ "GenSigVtEn" ""; +BA_DEF_DEF_ "GenSigSNA" ""; +BA_DEF_DEF_ "GenSigCmt" ""; +BA_DEF_DEF_ "GenMsgCmt" ""; +BA_DEF_DEF_ "GenSigSendType" "NoSigSendType"; +BA_DEF_DEF_ "GenSigInactiveValue" 0; +BA_DEF_DEF_ "GenSigMissingSourceValue" 0; +BA_DEF_DEF_ "WakeupSignal" "No"; +BA_DEF_DEF_ "GenSigStartValue" 0; +BA_DEF_DEF_ "GenMsgILSupport" "Yes"; +BA_DEF_DEF_ "NetworkInitializationCommand" "No"; +BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType"; +BA_DEF_DEF_ "GenMsgCycleTime" 0; +BA_DEF_DEF_ "GenMsgCycleTimeFast" 0; +BA_DEF_DEF_ "GenMsgDelayTime" 0; +BA_DEF_DEF_ "GenMsgNrOfRepetition" 0; +BA_DEF_DEF_ "GenMsgStartDelayTime" 0; +BA_DEF_DEF_ "NetworkInitialization" "No"; +BA_DEF_DEF_ "MessageGateway" "No"; +BA_DEF_DEF_ "ILUsed" "Yes"; +BA_DEF_DEF_ "NetworkInitializationUsed" "No"; +BA_DEF_DEF_ "PowerType" "Switched"; +BA_DEF_DEF_ "NodeStartUpTime" 250; +BA_DEF_DEF_ "NodeWakeUpTime" 10; +BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff"; +BA_DEF_DEF_ "GenMsgForegroundColor" "#000000"; +VAL_ 34 IPMA_PCAN_DataRangeCheck 1 "Fault Present" 0 "No Fault"; +VAL_ 34 IPMA_PCAN_MissingMsg 1 "Fault Present" 0 "No Fault "; +VAL_ 34 VINSignalCompareFailure 1 "Fault Present" 0 "No Fault"; +VAL_ 34 ModuleNotConfiguredError 1 "Fault Present" 0 "No Fault"; +VAL_ 34 CarCfgNotConfiguredError 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ARMtoDSPChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 DSPtoArmChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 HostToArmChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ARMtoHostChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 LoopBWOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 DSPOverrunFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte6_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TuningSensitivityFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 SaturatedTuningFreqFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 LocalOscPowerFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterPowerFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte6_bit0 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 XCVRDeviceSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 FreqSynthesizerSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 AnalogConverterDevicSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 SidelobeBlockage 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit1 1 "Fault Present" 0 "No Fault"; +VAL_ 33 MNRBlocked 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ECUTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 AlignmentRoutineFailedFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 UnreasonableRadarData 1 "Fault Present" 0 "No Fault"; +VAL_ 33 MicroprocessorTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 VerticalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 HorizontalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 FactoryAlignmentMode 1 "Fault Present" 0 "No Fault"; +VAL_ 33 BatteryLowFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 BatteryHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_1p25SupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte3_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ThermistorOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_3p3DACSupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_3p3RAWSupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_5_SupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterIDFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit3 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit2 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PCANMissingMsgFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PCANBusOff 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 InstructionSetCheckFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 StackOverflowFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 WatchdogFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PLLLockFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit1 1 "Fault Present" 0 "No Fault"; +VAL_ 33 RAMMemoryTestFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 USCValidationFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit3 1 "Fault Present" 0 "No Fault"; +VAL_ 33 KeepAliveChecksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ProgramCalibrationFlashChecksum 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ApplicationFlashChecksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 371 CAN_AUTO_ALIGN_HANGLE_QF 3 "Accurate" 2 "Inaccurate" 1 "Temporarily undefined" 0 "Undefined"; +VAL_ 371 CAN_ALIGNMENT_STATUS 15 "Undefined_2" 14 "Undefined_1" 13 "Low Amplitude (Flat-plate only)" 12 "No Peak (Flat-plate only)" 11 "Fail Ver and Hor OutOfRange" 10 "Fail Vertical Align OutOfRange" 9 "Fail Horizontal Align OutOfRange" 8 "Fail Time Out" 7 "Fail Only Right Target Found" 6 "Fail Only Left Target Found" 5 "Fail Variance Too Large" 4 "Fail Deviation Too Large" 3 "Fail No Target" 2 "Success" 1 "Busy" 0 "Off"; +VAL_ 371 CAN_ALIGNMENT_STATE 6 "Static alignment flat-plate" 5 "Static alignment 2-target" 4 "Static alignment 1-target" 3 "Service alignment" 2 "Short track alignment" 1 "Auto alignment" 0 "Off"; +VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 291 CAN_DET_CONFID_AZIMUTH_04_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 351 CAN_DET_CONFID_AZIMUTH_64 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 350 CAN_DET_CONFID_AZIMUTH_63 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 349 CAN_DET_CONFID_AZIMUTH_62 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 348 CAN_DET_CONFID_AZIMUTH_61 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 347 CAN_DET_CONFID_AZIMUTH_60 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 346 CAN_DET_CONFID_AZIMUTH_59 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 345 CAN_DET_CONFID_AZIMUTH_58 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 344 CAN_DET_CONFID_AZIMUTH_57 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 343 CAN_DET_CONFID_AZIMUTH_56 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 342 CAN_DET_CONFID_AZIMUTH_55 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 335 CAN_DET_CONFID_AZIMUTH_48 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 334 CAN_DET_CONFID_AZIMUTH_47 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 333 CAN_DET_CONFID_AZIMUTH_46 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 332 CAN_DET_CONFID_AZIMUTH_45 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 331 CAN_DET_CONFID_AZIMUTH_44 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 330 CAN_DET_CONFID_AZIMUTH_43 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 329 CAN_DET_CONFID_AZIMUTH_42 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 328 CAN_DET_CONFID_AZIMUTH_41 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 327 CAN_DET_CONFID_AZIMUTH_40 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 325 CAN_DET_CONFID_AZIMUTH_38 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 324 CAN_DET_CONFID_AZIMUTH_37 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 323 CAN_DET_CONFID_AZIMUTH_36 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 322 CAN_DET_CONFID_AZIMUTH_35 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 321 CAN_DET_CONFID_AZIMUTH_34 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 320 CAN_DET_CONFID_AZIMUTH_33 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 319 CAN_DET_CONFID_AZIMUTH_32 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 318 CAN_DET_CONFID_AZIMUTH_31 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 317 CAN_DET_CONFID_AZIMUTH_30 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 316 CAN_DET_CONFID_AZIMUTH_29 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 314 CAN_DET_CONFID_AZIMUTH_27 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 313 CAN_DET_CONFID_AZIMUTH_26 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 312 CAN_DET_CONFID_AZIMUTH_25 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 311 CAN_DET_CONFID_AZIMUTH_24 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 310 CAN_DET_CONFID_AZIMUTH_23 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 309 CAN_DET_CONFID_AZIMUTH_22_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 309 CAN_DET_CONFID_AZIMUTH_22_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 309 CAN_DET_CONFID_AZIMUTH_22_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 308 CAN_DET_CONFID_AZIMUTH_21_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 307 CAN_DET_CONFID_AZIMUTH_20_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 306 CAN_DET_CONFID_AZIMUTH_19_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 305 CAN_DET_CONFID_AZIMUTH_18_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 341 CAN_DET_CONFID_AZIMUTH_54 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 340 CAN_DET_CONFID_AZIMUTH_53 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 339 CAN_DET_CONFID_AZIMUTH_52 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 338 CAN_DET_CONFID_AZIMUTH_51 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 337 CAN_DET_CONFID_AZIMUTH_50 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 336 CAN_DET_CONFID_AZIMUTH_49 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 326 CAN_DET_CONFID_AZIMUTH_39 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 315 CAN_DET_CONFID_AZIMUTH_28 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 304 CAN_DET_CONFID_AZIMUTH_17_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 303 CAN_DET_CONFID_AZIMUTH_16_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 302 CAN_DET_CONFID_AZIMUTH_15_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 301 CAN_DET_CONFID_AZIMUTH_14_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 300 CAN_DET_CONFID_AZIMUTH_13_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 299 CAN_DET_CONFID_AZIMUTH_12_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 298 CAN_DET_CONFID_AZIMUTH_11_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 297 CAN_DET_CONFID_AZIMUTH_10_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 296 CAN_DET_CONFID_AZIMUTH_09_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 295 CAN_DET_CONFID_AZIMUTH_08_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 294 CAN_DET_CONFID_AZIMUTH_07_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 293 CAN_DET_CONFID_AZIMUTH_06_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 292 CAN_DET_CONFID_AZIMUTH_05_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 290 CAN_DET_CONFID_AZIMUTH_03_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 289 CAN_DET_CONFID_AZIMUTH_02_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 257 CAN_INTERFERENCE_TYPE 2 "Star PD-Like" 1 "Slow FMCW" 0 "No Interference"; +VAL_ 257 CAN_RECOMMEND_UNCONVERGE 1 "Recommended" 0 "Not Recommended"; +VAL_ 257 CAN_RADAR_ALIGN_INCOMPLETE 1 "Alignment Incomplete" 0 "Alignment Completed"; +VAL_ 257 CAN_BLOCKAGE_SIDELOBE 1 "Radar Blockage" 0 "No Radar Blockage"; +VAL_ 257 CAN_BLOCKAGE_MNR 1 "Radar Blockage" 0 "No Radar Blockage"; +VAL_ 257 CAN_RADAR_EXT_COND_NOK 1 "Too high temp or insufficient pw" 0 "External conditions OK"; +VAL_ 257 CAN_RADAR_ALIGN_OUT_RANGE 1 "Radar out of range" 0 "Radar within range"; +VAL_ 257 CAN_RADAR_ALIGN_NOT_START 1 "Radar align not started" 0 "Radar align started"; +VAL_ 257 CAN_RADAR_OVERHEAT_ERROR 1 "Radar overheat condition" 0 "No Overheat"; +VAL_ 257 CAN_RADAR_NOT_OP 1 "Radar not operational" 0 "Radar operational"; +VAL_ 257 CAN_XCVR_OPERATIONAL 1 "On" 0 "Off "; +VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 288 CAN_DET_CONFID_AZIMUTH_01_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; diff --git a/artifacts/package_runtime/iqdbc/dbc/README.md b/artifacts/package_runtime/iqdbc/dbc/README.md new file mode 100644 index 000000000..39e71e9fa --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/README.md @@ -0,0 +1,49 @@ +## DBC file basics + +A DBC file encodes, in a humanly readable way, the information needed to understand a vehicle's CAN bus traffic. A vehicle might have multiple CAN buses and every CAN bus is represented by its own dbc file. +Wondering what's the DBC file format? [Here](http://www.socialledge.com/sjsu/index.php?title=DBC_Format) and [Here](https://github.com/stefanhoelzl/CANpy/blob/master/docs/DBC_Specification.md) a couple of good overviews. + +## How to start reverse engineering cars + +[iqdbc](https://github.com/commaai/iqdbc) is integrated with [cabana](https://github.com/commaai/openpilot/tree/master/tools/cabana). + +Use [panda](https://github.com/commaai/panda) to connect your car to a computer. + +## How to use reverse engineered DBC +To create custom CAN simulations or send reverse engineered signals back to the car you can use [CANdevStudio](https://github.com/GENIVI/CANdevStudio) project. + +## DBC file preprocessor + +DBC files for different models of the same brand have a lot of overlap. Therefore, we wrote a preprocessor to create DBC files from a brand DBC file and a model specific DBC file. The source DBC files can be found in the generator folder. After changing one of the files run the generator.py script to regenerate the output files. These output files will be placed in the root of the iqdbc repository and are suffixed by _generated. + +## Good practices for contributing to iqdbc + +- Comments: the best way to store comments is to add them directly to the DBC files. For example: + ``` + CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; + ``` + is a comment that refers to signal `LONG_ACCEL` in message `490`. Using comments is highly recommended, especially for doubts and uncertainties. [cabana](https://community.comma.ai/cabana/) can easily display/add/edit comments to signals and messages. + +- Units: when applicable, it's recommended to convert signals into physical units, by using a proper signal factor. Using a SI unit is preferred, unless a non-SI unit rounds the signal factor much better. +For example: + ``` + SG_ VEHICLE_SPEED : 7|15@0+ (0.00278,0) [0|70] "m/s" PCM + ``` + is better than: + ``` + SG_ VEHICLE_SPEED : 7|15@0+ (0.00620,0) [0|115] "mph" PCM + ``` + However, the cleanest option is really: + ``` + SG_ VEHICLE_SPEED : 7|15@0+ (0.01,0) [0|250] "kph" PCM + ``` + +- Signal size: always use the smallest amount of bits possible. For example, let's say I'm reverse engineering the gas pedal position and I've determined that it's in a 3 bytes message. For 0% pedal position I read a message value of `0x00 0x00 0x00`, while for 100% of pedal position I read `0x64 0x00 0x00`: clearly, the gas pedal position is within the first byte of the message and I might be tempted to define the signal `GAS_POS` as: + ``` + SG_ GAS_POS : 7|8@0+ (1,0) [0|100] "%" PCM + ``` + However, I can't be sure that the very first bit of the message is referred to the pedal position: I haven't seen it changing! Therefore, a safer way of defining the signal is: + ``` + SG_ GAS_POS : 6|7@0+ (1,0) [0|100] "%" PCM + ``` + which leaves the first bit unallocated. This prevents from very erroneous reading of the gas pedal position, in case the first bit is indeed used for something else. diff --git a/artifacts/package_runtime/iqdbc/dbc/__init__.py b/artifacts/package_runtime/iqdbc/dbc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/dbc/acura_ilx_2016_can_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/acura_ilx_2016_can_generated.dbc new file mode 100644 index 000000000..7f0e2db09 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/acura_ilx_2016_can_generated.dbc @@ -0,0 +1,439 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _nidec_common.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _nidec_scm_group_a.dbc starts here"; +BO_ 660 SCM_FEEDBACK: 8 SCM + SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON + SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 422 SCM_BUTTONS: 8 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON + SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON + SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON + +VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ; +VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; + + +CM_ "Imported file _steering_sensors_b.dbc starts here"; +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _steering_control_a.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 ADAS + SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "acura_ilx_2016_can.dbc starts here"; diff --git a/artifacts/package_runtime/iqdbc/dbc/acura_ilx_2016_nidec.dbc b/artifacts/package_runtime/iqdbc/dbc/acura_ilx_2016_nidec.dbc new file mode 100644 index 000000000..e73fcc422 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/acura_ilx_2016_nidec.dbc @@ -0,0 +1,185 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: ADAS RADAR NEO XXX + + +BO_ 768 VEHICLE_STATE: 8 ADAS + SG_ SET_ME_XF9 : 7|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ VEHICLE_SPEED : 15|8@0+ (1,0) [0|255] "kph" Vector__XXX + +BO_ 769 VEHICLE_STATE2: 8 ADAS + SG_ SET_ME_0F18510 : 7|28@0+ (1,0) [0|268435455] "" Vector__XXX + SG_ SET_ME_25A0000 : 27|28@0+ (1,0) [0|268435455] "" Vector__XXX + +BO_ 1024 RADAR_DIAGNOSTIC: 8 RADAR + SG_ RADAR_STATE : 7|8@0+ (1,0) [0|255] "" NEO + +BO_ 1040 XXX_101: 8 RADAR + +BO_ 1041 XXX_102: 8 RADAR + +BO_ 1042 XXX_103: 8 RADAR + +BO_ 1043 XXX_104: 8 RADAR + +BO_ 1044 XXX_105: 8 RADAR + +BO_ 1045 XXX_106: 8 RADAR + +BO_ 1046 XXX_107: 8 RADAR + +BO_ 1047 XXX_108: 8 RADAR + +BO_ 1056 XXX_109: 8 RADAR + +BO_ 1057 XXX_110: 8 RADAR + +BO_ 1058 XXX_111: 8 RADAR + +BO_ 1059 XXX_112: 8 RADAR + +BO_ 1060 XXX_113: 8 RADAR + +BO_ 1072 TRACK_0: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1073 TRACK_1: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1074 TRACK_2: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1075 TRACK_3: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1076 TRACK_4: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1077 TRACK_5: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1078 TRACK_6: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1079 TRACK_7: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1080 TRACK_8: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1081 TRACK_9: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1088 TRACK_10: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1089 TRACK_11: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1090 TRACK_12: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1091 TRACK_13: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1092 TRACK_14: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1093 TRACK_15: 8 RADAR + SG_ LONG_DIST : 7|12@0+ (0.0625,0) [0|255.5] "m" NEO + SG_ NEW_TRACK : 11|1@0+ (1,0) [0|1] "" NEO + SG_ LAT_DIST : 9|10@0- (0.0625,0) [0|63.5] "m" NEO + SG_ REL_SPEED : 31|12@0- (0.03125,0) [0|127.5] "m/s" NEO + +BO_ 1279 XXX_114: 8 RADAR + +BO_ 1280 XXX_115: 8 RADAR + +BO_ 1296 XXX_116: 8 RADAR + +BO_ 1297 XXX_117: 8 RADAR + +BO_TX_BU_ 768 : NEO,ADAS; +BO_TX_BU_ 769 : NEO,ADAS; + + +CM_ SG_ 1024 RADAR_STATE "need to find out more diagnostic values"; +VAL_ 1024 RADAR_STATE 121 "ok" 110 "faulted" 105 "wrong_config"; diff --git a/artifacts/package_runtime/iqdbc/dbc/acura_rdx_2018_can_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/acura_rdx_2018_can_generated.dbc new file mode 100644 index 000000000..0c8fe4be5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/acura_rdx_2018_can_generated.dbc @@ -0,0 +1,403 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _nidec_common.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _nidec_scm_group_a.dbc starts here"; +BO_ 660 SCM_FEEDBACK: 8 SCM + SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON + SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 422 SCM_BUTTONS: 8 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON + SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON + SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON + +VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ; +VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; + + +CM_ "Imported file _steering_sensors_b.dbc starts here"; +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _steering_control_b.dbc starts here"; +BO_ 404 STEERING_CONTROL: 4 EON + SG_ STEER_TORQUE : 7|12@0- (1,0) [-768|768] "" EPS + SG_ SET_ME_X00 : 11|4@0+ (1,0) [0|15] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00_2 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS + +BO_ 399 STEER_STATUS: 6 EPS + SG_ STEER_TORQUE_SENSOR : 7|12@0- (-1,0) [-2047.5|2047.5] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_CONTROL_ACTIVE : 36|1@0+ (1,0) [0|1] "" EON + SG_ STEER_STATUS : 35|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; + +CM_ "acura_rdx_2018_can.dbc starts here"; + +BO_ 392 GEARBOX_AUTO: 6 XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + SG_ GEAR_SHIFTER : 27|4@0+ (1,0) [0|15] "" EON + SG_ GEAR : 36|5@0+ (1,0) [0|31] "" EON + +VAL_ 392 GEAR_SHIFTER 0 "S" 1 "P" 2 "R" 4 "N" 8 "D" ; +VAL_ 392 GEAR 26 "S" 4 "D" 3 "N" 2 "R" 1 "P" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/acura_rdx_2020_can_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/acura_rdx_2020_can_generated.dbc new file mode 100644 index 000000000..6ad1d05c4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/acura_rdx_2020_can_generated.dbc @@ -0,0 +1,578 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _bosch_2018.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 EON + SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS + SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS + SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX + SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 232 BRAKE_HOLD: 7 XXX + SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX + SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX + SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + +BO_ 446 BRAKE_MODULE: 3 VSA + SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX + +BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS + SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 545 ECON_STATUS: 6 SCM + SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY + +BO_ 576 LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 577 LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 579 RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 580 RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ AMBIENT_LIGHT_MAYBE : 23|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 927 RADAR_HUD: 8 RADAR + SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY + SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY + SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY + SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX + SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 13274 LKAS_HUD_A: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + +BO_ 13275 LKAS_HUD_B: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + +CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1"; +CM_ SG_ 662 AMBIENT_LIGHT_MAYBE "Slow-moving sensor value (possibly the ambient light input for adaptive high beam), undecoded. The camera consumes SCM_BUTTONS content beyond the buttons, so frames sent in its place must echo this byte"; +CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded"; +CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded"; +CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded"; +CM_ SG_ 577 LINE_DASHED "1 = line is dashed"; +CM_ SG_ 577 LINE_SOLID "1 = line is solid"; + +VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active"; +VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal"; +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ; +VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN"; +VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN"; + + +CM_ "Imported file _bosch_radar_acc.dbc starts here"; +BO_ 479 ACC_CONTROL: 8 EON + SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX + SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX + SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX + SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX + SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 495 ACC_CONTROL_ON: 8 XXX + SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX + SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled"; +CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event"; +CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event"; +CM_ SG_ 479 AEB_PREPARE "set 1s before AEB"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _bosch_standstill.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + + +CM_ "Imported file _steering_sensors_b.dbc starts here"; +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "acura_rdx_2020_can.dbc starts here"; diff --git a/artifacts/package_runtime/iqdbc/dbc/bmw_e9x_e8x.dbc b/artifacts/package_runtime/iqdbc/dbc/bmw_e9x_e8x.dbc new file mode 100644 index 000000000..7ec95c0b1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/bmw_e9x_e8x.dbc @@ -0,0 +1,913 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: EON XXX RDC SZL VGSG JBBF RFK FLA RAD1 CAS CID AHM HKL HUD EKP DWA DSC SM_BF GWS VDM DDE1 ACI CCC DSC SM_FA CTM LDM RSE MRSZ VDA EDCK ZBE EGS ACC_Sensor Kombi IHKA ARS ACSM FZD PGS NVC AFS DME FRMFA EMF FKA VSW EPS PDC DKG EHC Diagnosetool_PT_CAN Diagnosetool_K_CAN_System Vector__XXX + + +BO_ 170 AccPedal: 8 DME + SG_ KickDownPressed : 53|1@0+ (1,0) [0|3] "" XXX + SG_ CruisePedalActive : 54|1@0+ (1,0) [0|1] "" XXX + SG_ CruisePedalInactive : 55|1@0+ (1,0) [0|1] "" XXX + SG_ ThrottlelPressed : 50|1@0+ (1,0) [0|1] "" XXX + SG_ AcceleratorPedalPressed : 52|1@0+ (1,0) [0|7] "" XXX + SG_ AcceleratorPedalPercentage : 16|16@1+ (0.04,0) [0|100] "" XXX + SG_ Counter_170 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EngineSpeed : 32|16@1+ (0.25,0) [0|8000] "rpm" XXX + SG_ Checksum_170 : 0|8@1- (1,0) [0|65535] "" XXX + +BO_ 404 CruiseControl: 4 SZL + SG_ plus1mph_request : 16|1@0+ (1,0) [0|1] "" XXX + SG_ minus1mph_request : 18|1@0+ (1,0) [0|1] "" XXX + SG_ Cancel_request_up_stalk : 23|1@0+ (1,0) [0|1] "" XXX + SG_ Cancel_request_up_or_down_stalk : 20|1@0+ (1,0) [0|1] "" XXX + SG_ Resume_request : 22|1@0+ (1,0) [0|1] "" XXX + SG_ setMe_0xFC : 31|8@0+ (1,0) [0|255] "" XXX + SG_ plus5mph_request : 17|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ minus5mph_request : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ requests_0xF : 15|4@0+ (1,0) [0|15] "" XXX + SG_ Counter_404 : 11|4@0+ (1,0) [0|15] "" XXX + SG_ Checksum_404 : 7|8@0+ (1,0) [0|15] "" XXX + +BO_ 512 CruiseControlStatus: 8 DME + SG_ CruiseControlInactiveFlag : 12|1@0+ (1,0) [0|1] "" XXX + SG_ CruiseCoontrolActiveFlag : 13|1@0+ (1,0) [0|1] "" XXX + SG_ CruiseControlSetpointSpeed : 7|8@0+ (0.25,0) [0|255] "mph" XXX + +BO_ 168 EngineAndBrake: 8 DME + SG_ Checksum_EngineAndBrake : 0|8@1+ (1,0) [0|0] "" XXX + SG_ BrakePressed : 61|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_active2 : 62|1@0+ (1,0) [0|1] "" XXX + SG_ ST_RCPT_ENG_DSC : 52|2@1+ (1,0) [0|0] "" XXX + SG_ ST_RCPT_ENG_ARS : 50|2@1+ (1,0) [0|0] "" XXX + SG_ ST_RCPT_ENG_ACC : 48|2@1+ (1,0) [0|0] "" XXX + SG_ ST_RCPT_ENG_EGS : 54|2@1+ (1,0) [0|0] "" XXX + SG_ ST_DMEA_SWO : 44|2@1+ (1,0) [0|0] "" XXX + SG_ EngineTorque : 12|12@1- (0.03125,0) [-1024|1023] "" XXX + SG_ ALIV_TORQ_1_DME : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EngineTorqueWoInterv : 24|16@1- (0.03125,0) [-1024|1023.96875] "" XXX + +BO_ 470 SteeringButtons: 2 SZL + SG_ Volume_DOWN : 2|1@0+ (1,0) [0|1] "" XXX + SG_ Volume_UP : 3|1@0+ (1,0) [0|1] "" XXX + SG_ VoiceControl : 8|1@0+ (1,0) [0|1] "" XXX + SG_ Telephone : 0|1@0+ (1,0) [0|1] "" XXX + SG_ Next_up : 5|1@0+ (1,0) [0|1] "" XXX + SG_ Previous_down : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 403 DynamicCruiseControlStatus: 8 DSC + SG_ Counter_403 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ CruiseActive : 43|1@0+ (1,0) [0|1] "" XXX + SG_ CruiseSpeedChangeRequest : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CruiseControlSetpointSpeed : 15|8@0+ (1,-2) [0|255] "kph/mph" XXX + +BO_ 201 SteeringWheelAngle_DSC: 8 SZL + SG_ Counter_201 : 20|4@1+ (1,0) [0|15] "" DSC + SG_ SteeringPositionComplementLow : 24|11@1- (1,0) [0|1] "" DSC + SG_ SteeringPosition : 0|16@1- (0.0428316886,0) [-600|600] "deg" DSC + +BO_ 206 WheelSpeeds: 8 DSC + SG_ Wheel_FL : 0|16@1- (0.0625,0) [0|255] "kph" XXX + SG_ Wheel_FR : 16|16@1- (0.0625,0) [0|255] "kph" XXX + SG_ Wheel_RL : 32|16@1- (0.0625,0) [0|255] "kph" XXX + SG_ Wheel_RR : 48|16@1- (0.0625,0) [0|255] "kph" XXX + +BO_ 884 WheelToleranceAdjustment: 8 DSC + +BO_ 678 WiperSwitch: 8 SZL + SG_ AutoWipersOn : 0|1@1+ (1,0) [0|3] "" XXX + +BO_ 304 TerminalStatus: 8 CAS + SG_ AccOn : 23|1@1+ (1,0) [0|255] "" XXX + SG_ IgnitionOff : 22|1@1+ (1,0) [0|3] "" XXX + SG_ Counter_304 : 32|4@1+ (1,0) [0|15] "" XXX + SG_ Checksum_304 : 36|4@1+ (1,0) [0|255] "" XXX + +BO_ 169 Torque2: 8 DME + SG_ TORQ_AVL_SPAR_POS : 52|12@1- (0.5,0) [-1023.5|1023.5] "Nm" XXX + SG_ TORQ_AVL_SPAR_NEG : 40|12@1- (0.5,0) [-1023.5|1023.5] "Nm" XXX + SG_ TORQ_AVL_MAX : 28|12@1- (0.5,0) [-1023.5|1023.5] "Nm" XXX + SG_ TORQ_AVL_MIN : 16|12@1- (0.5,0) [-1023.5|1023.5] "Nm" XXX + SG_ ST_INFS : 14|2@1+ (1,0) [0|0] "" XXX + SG_ ST_SW_LEV_RPM : 12|2@1+ (1,0) [0|0] "" XXX + SG_ ALIV_TORQ_2_DME : 8|4@1+ (1,0) [0|0] "" XXX + SG_ CHKSM_TORQ_2_DME : 0|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 184 TorqueTransmisionRequest: 8 LDM + SG_ Checksum_184 : 0|8@1+ (1,0) [0|15] "" XXX + SG_ Counter_184 : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 196 SteeringWheelAngle: 7 DSC + SG_ SteeringSpeed : 24|16@1- (0.0428316886,0) [0|255] "degree/s" XXX + SG_ SteeringPosition : 0|16@1- (0.0428316886,0) [-600|600] "degree" XXX + +BO_ 180 WheelTorqueDriveTrain1: 8 DME + +BO_ 182 DynamicCruiseControlTorqueDemand: 8 DSC + SG_ TORQ_TAR_DSC : 12|12@1- (0.5,0) [0|1000] "" XXX + SG_ Counter_182 : 8|4@1+ (1,0) [0|14] "" XXX + SG_ Checksum_182 : 0|8@1+ (1,0) [0|15] "" XXX + +BO_ 186 TransmissionData: 8 EGS + SG_ Counter_186 : 48|4@1+ (1,0) [0|14] "" XXX + SG_ Shifting : 4|1@1+ (1,0) [0|15] "" XXX + SG_ OutputShaftSpeed : 24|16@1- (0.125,0) [0|255] "rpm" XXX + SG_ GearRatio : 8|8@1+ (0.05,0) [0|255] "" XXX + SG_ GearTar : 0|4@1+ (1,-4) [0|255] "" XXX + SG_ Checksum_186 : 40|8@1+ (1,0) [0|15] "" XXX + +BO_ 191 RequestedWheelTorqueDriveTrain: 8 LDM + SG_ Checksum_191 : 0|8@1+ (1,0) [0|19] "" XXX + SG_ Counter_191 : 8|4@1- (1,0) [0|255] "" XXX + SG_ TorqueReq : 16|12@1- (0.5,350) [-1024|1023.96875] "" XXX + +BO_ 414 StatusDSC_KCAN: 8 DSC + SG_ BrakePressure : 48|8@1- (1,0) [0|255] "" XXX + SG_ BrakeStates : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Checksum_414 : 56|8@1+ (1,0) [0|15] "" XXX + SG_ Counter_414 : 20|4@1+ (1,0) [0|15] "" XXX + SG_ DTC_on : 12|1@1+ (1,0) [0|3] "" XXX + SG_ DSC_full_off : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 416 Speed: 8 DSC + SG_ AccX : 28|12@1- (1,0) [0|15] "" XXX + SG_ YawRate : 40|12@1- (1,0) [0|255] "" XXX + SG_ VehicleSpeed : 0|12@1- (0.103,0) [0|255] "kph" XXX + SG_ MovingReverse : 13|1@1+ (1,0) [0|3] "" XXX + SG_ AccY : 16|12@1- (1,0) [0|255] "" XXX + SG_ Counter_416 : 52|4@1+ (1,0) [0|14] "" XXX + SG_ Checksum_416 : 56|8@1+ (1,0) [0|15] "" XXX + SG_ MovingForward : 12|1@1+ (1,0) [0|15] "" XXX + +BO_ 418 TransimissionData2: 8 EGS + SG_ ManualMode : 50|1@0+ (1,0) [0|255] "" XXX + SG_ Counter_418 : 28|4@1+ (1,0) [0|14] "" XXX + SG_ Checksum_418 : 56|8@1+ (1,0) [0|15] "" XXX + +BO_ 690 WheelPressure_KCAN: 8 DSC + +BO_ 691 AccelerationData: 8 DSC + +BO_ 402 GearSelectorSwitch_1: 4 XXX + SG_ Counter_402 : 24|4@1+ (1,0) [0|14] "" XXX + +BO_ 408 GearSelectorSwitch: 8 GWS + SG_ ParkButtonSecond : 26|2@1+ (1,0) [0|3] "" XXX + SG_ SideButton : 28|2@1+ (1,0) [0|3] "" XXX + SG_ SportButtonPressed : 34|2@1+ (1,0) [0|255] "" XXX + SG_ M3_button : 36|2@1+ (1,0) [0|3] "" XXX + SG_ SideButtonXOR11 : 30|2@1+ (1,0) [0|3] "" XXX + SG_ param1XOR11 : 22|2@1+ (1,0) [0|3] "" XXX + SG_ m3ShifterPositionXOR1111 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ always11 : 38|2@1+ (1,0) [0|3] "" XXX + SG_ m3ShifterPosition : 4|4@1+ (1,0) [0|15] "" XXX + SG_ param1 : 20|2@1+ (1,0) [0|3] "" XXX + SG_ param5 : 32|2@1+ (1,0) [0|3] "" XXX + SG_ Counter_408 : 0|4@1+ (1,0) [0|14] "" XXX + SG_ ParkButtonFirst : 24|2@1+ (1,0) [0|3] "" XXX + SG_ ShifterPositionXOR1111 : 16|4@1+ (1,0) [0|15] "" XXX + SG_ ShifterPosition : 12|4@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 422 DistanceRoute: 8 DSC + +BO_ 436 InstrumentClusterStatus_KOMBI: 8 CCC + SG_ HandbrakeActive : 41|1@1+ (1,0) [0|3] "" XXX + +BO_ 464 EngineData: 8 DME + SG_ RPM_IDLG_TAR : 56|8@1+ (5,0) [0|1270] "1/min" XXX + SG_ CTR_SLCK : 48|2@1+ (1,0) [0|0] "" XXX + SG_ IJV_FU : 32|16@1+ (1,-48) [0|0] "C" XXX + SG_ AIP_ENG : 24|8@1+ (2,598) [600|1106] "hPa" XXX + SG_ ST_SW_WAUP : 22|2@1+ (1,0) [0|0] "" XXX + SG_ ST_ENG_RUN : 20|2@1+ (1,0) [0|0] "" XXX + SG_ Counter_464 : 16|4@1+ (1,0) [0|14] "" XXX + SG_ TEMP_EOI : 8|8@1+ (1,-48) [0|0] "C" XXX + SG_ TEMP_ENG : 0|8@1+ (1,-48) [0|0] "C" XXX + +BO_ 945 TransmissionData3: 8 DKG + SG_ Checksum_946 : 0|8@1+ (1,0) [0|19] "" XXX + SG_ Counter_945 : 8|4@1+ (1,0) [0|14] "" XXX + +BO_ 200 SteeringWheelAngle_slow: 6 SZL + SG_ SteeringPosition : 0|16@1- (0.0428316886,0) [-600|600] "degree" XXX + SG_ SteeringSpeed : 24|16@1- (0.0428316886,0) [-65535|65535] "degree/s" XXX + SG_ Counter_200 : 20|4@1+ (1,0) [0|15] "" XXX + +BO_ 466 TransmissionDataDisplay: 8 EGS + SG_ ShiftLeverMode : 32|2@1+ (1,0) [0|3] "" XXX + SG_ GearAct : 12|4@1+ (1,-4) [0|15] "" XXX + SG_ Counter_466 : 28|4@1+ (1,0) [0|14] "" XXX + SG_ ShiftLeverPosition : 0|4@1+ (1,0) [0|8] "" XXX + SG_ xFF : 40|8@1+ (1,0) [0|255] "" XXX + SG_ ShiftLeverPositionXOR : 4|4@1+ (1,0) [0|0] "" Vector__XXX + SG_ SportButtonState : 26|1@1+ (1,0) [0|1] "" XXX + +BO_ 437 HeatFlow_LoadTorqueClimate: 8 IHKA + +BO_ 1152 NetworkManagment1: 8 XXX + +BO_ 1170 NetworkManagment2: 8 XXX + +BO_ 1175 NetworkManagment3: 8 XXX + +BO_ 1176 NetworkManagment4: 8 XXX + +BO_ 1193 NetworkManagment5: 8 XXX + +BO_ 1246 GWS_ShiftLeverHeartbeat: 8 XXX + SG_ IgnOff : 12|1@0+ (1,0) [0|3] "" XXX + +BO_ 438 HeatFlowEngine: 8 DME + +BO_ 784 AmbientTemperature_RelativeTime: 8 Kombi + +BO_ 821 ElectricFuelPumpStatus: 8 EKP + +BO_ 1007 EngineOBD_data: 8 DME + +BO_ 1432 ServicesDKG: 8 XXX + +BO_ 309 CrashDisconnectControl: 8 ACSM + +BO_ 502 TurnSignals: 2 FRMFA + SG_ TurnSignalIdle : 9|1@0+ (1,0) [0|1] "" XXX + SG_ TurnSignalActive : 8|1@0+ (1,0) [0|1] "" XXX + SG_ RightTurn : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LeftTurn : 4|1@1+ (1,0) [0|1] "" XXX + SG_ HoldActivated : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 514 Dimming: 8 FRMFA + +BO_ 538 LampStatus: 8 FRMFA + +BO_ 550 RainSensorWiperSpeed: 8 FZD + +BO_ 578 ClimateFrontStatus: 8 IHKA + +BO_ 704 LCD_lighting: 8 Kombi + +BO_ 758 LightControl: 8 FRMFA + +BO_ 760 Time_Date: 8 Kombi + +BO_ 762 OccupancySeatBeltContact: 8 ACSM + SG_ NEW_SIGNAL_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 0|8@1+ (1,0) [0|15] "" XXX + +BO_ 764 TrunkStatus: 8 CAS + +BO_ 797 TirePressureStatus: 8 DSC + +BO_ 816 Range_Mileage: 8 Kombi + +BO_ 823 StatusFuelControl: 8 DME + +BO_ 897 EngineOilLevel: 8 DME + +BO_ 940 RunOnTimeTerminal30: 8 JBBF + +BO_ 947 PowerManagmentConsumptionControl: 8 DME + +BO_ 948 PowerBatteryVoltage: 8 DME + SG_ BatteryVoltage : 7|24@0+ (0.001,0) [0|65535] "" XXX + +BO_ 958 PowerRunningTime: 8 CAS + +BO_ 1408 ServicesKGM: 8 XXX + +BO_ 1426 ServicesDME: 8 XXX + +BO_ 1449 ServicesDSC: 8 XXX + +BO_ 1504 ServicesKOMBI: 8 XXX + +BO_ 1522 ServicesKBM: 8 XXX + +BO_ 209 Accelerometer1: 8 XXX + SG_ Counter_209 : 52|4@1+ (1,0) [0|255] "" XXX + SG_ Unknown : 16|16@1- (1,0) [0|65535] "" XXX + SG_ YawRate : 0|16@1- (1,0) [0|7] "" XXX + SG_ PitchRate : 32|16@1- (1,0) [0|65535] "" XXX + SG_ CRC8_209 : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 172 WheelTorqueDrivetrain2: 8 DME + +BO_ 128 SYNC: 5 XXX + SG_ State2 : 24|4@1+ (1,0) [0|15] "" XXX + SG_ State1 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ Counter_128 : 28|4@1+ (1,0) [0|15] "" XXX + +BO_ 320 Unknown140: 2 XXX + SG_ State : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 212 Unknown_d4: 8 XXX + SG_ State1 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Counter_212 : 52|4@1+ (1,0) [0|255] "" XXX + SG_ Checksum_212 : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 205 Accelerometer2: 8 XXX + SG_ Counter_205 : 52|4@1+ (1,0) [0|255] "" XXX + SG_ LateralAcceleration : 32|16@1- (1,0) [0|255] "" XXX + SG_ YawRate : 0|16@1- (1,0) [0|255] "" XXX + SG_ CRC8_205 : 16|16@1- (1,0) [0|65535] "" XXX + +BO_ 790 OperationPushButtonDTC: 2 JBBF + SG_ setMe_0x3FFF : 2|14@1+ (1,0) [0|63] "" DSC + SG_ DTC_pressed : 0|1@1+ (1,0) [0|3] "" DSC + +BO_ 1577 Unknown_629: 8 XXX + +BO_ 133 Synchronization_SC_VDA: 8 DSC + +BO_ 173 Delay_request_ACC: 8 LDM + +BO_ 177 Torque_request_steering: 8 DSC + +BO_ 181 Torque_request_EGS: 8 EGS + SG_ Checksum_Torque_request_EGS : 0|8@1+ (1,0) [0|0] "" XXX + SG_ Gearbox_temperature : 56|8@1+ (1,0) [0|0] "C" XXX + +BO_ 183 Torque_request_ACC: 8 LDM + +BO_ 187 Target_torque_request: 8 DSC + +BO_ 188 Status_target_torque_conversion: 8 VGSG + +BO_ 190 Alive_Counter: 8 ARS + +BO_ 192 Alive_Central_Gateway: 8 JBBF + +BO_ 193 Alive_counter_telephone: 8 CCC + +BO_ 213 Request_wheel_torque_brake: 8 DSC + +BO_ 215 Alive_Counter_Security: 8 ACSM + +BO_ 216 CLU1_VDA: 8 VDA + +BO_ 225 Wheel_torque_brake: 8 DSC + +BO_ 226 Status_central_locking_BFT: 8 JBBF + +BO_ 227 CLU2_VDA: 8 VDA + +BO_ 230 Status_central_locking_BFTH: 8 JBBF + +BO_ 234 Status_central_locking_FAT: 8 JBBF + +BO_ 238 Central_locking_status_FATH: 8 JBBF + +BO_ 242 Status_central_locking_HK: 8 JBBF + +BO_ 244 CLU3_VDA: 8 VDA + +BO_ 247 lateral_dynamics_ARS_VDM: 8 ARS + +BO_ 249 Vertical_dynamics_VDM_ARS: 8 VDM + +BO_ 250 Control_window_lifter_FAT: 8 FRMFA + +BO_ 251 Control_window_lifter_BFT: 8 JBBF + +BO_ 252 Control_window_lifter_FATH: 8 JBBF + +BO_ 253 Control_window_lifter_BFTH: 8 JBBF + +BO_ 254 Voltage_level_sensors: 8 VDM + +BO_ 280 Exchange_AFS_DSC: 8 AFS + +BO_ 286 Control_interventions_DSC_AFS: 8 DSC + +BO_ 288 Status_partial_setpoints_AFS_DSC_2: 8 AFS + +BO_ 298 Sensor_data_ROSE: 8 ASCM + +BO_ 300 input_data_ROSE: 8 DSC + +BO_ 336 Request_1_ACC: 8 LDM + +BO_ 339 Request_2_ACC: 8 LDM + +BO_ 345 Object_data_ACC: 8 ACC_Sensor + +BO_ 348 Status_ACC: 8 ACC_Sensor + +BO_ 351 Requirement_angle_FFP: 8 LDM + +BO_ 357 CLU_Status_VDA: 8 VDA + +BO_ 370 Acknowledgment_request_Kombination: 8 CCC + +BO_ 373 Display_motor_data: 8 DME + +BO_ 400 display_ACC: 8 LDM + +BO_ 405 Operation_push_button_MSA: 8 IHKA + +BO_ 419 Raw_data_longitudinal_acceleration: 8 DSC + +BO_ 423 actuation_request_EMF: 8 DSC + +BO_ 426 Effect_ErgoCommander: 8 CCC + +BO_ 428 Status_ARS_module: 8 ARS + +BO_ 440 Operation_ErgoCommander: 8 ZBE + +BO_ 450 Distance_message_PDC: 8 PDC + +BO_ 451 Distance_message_2_PDC: 8 PDC + +BO_ 454 Acoustic_message_PDC: 8 PDC + +BO_ 472 Operation_air_conditioning_air_distribution_FA: 8 CCC + +BO_ 473 Operation_pushbutton_MDrive: 8 SZL + +BO_ 474 Climate_control_remote_control: 8 CAS + +BO_ 476 Operation_stratification_seat_heating: 8 CCC + +BO_ 478 Air_conditioning_controls_rear: 8 CCC + +BO_ 480 Operation_air_conditioning_air_distribution_BF: 8 CCC + +BO_ 482 Operation_air_conditioning_front: 8 CCC + +BO_ 483 Operation_pushbutton_interior_lighting: 8 FZD + +BO_ 487 Operation_seat_heating_seat_climate_FA: 8 IHKA + +BO_ 488 Operation_seat_heating_seat_climate_BF: 8 IHKA + +BO_ 490 Steering_column_adjustment_control: 8 IHKA + +BO_ 491 Operation_active_seat_FA: 8 IHKA + +BO_ 492 Operation_active_seat_BF: 8 IHKA + +BO_ 494 Steering_column_switch_operation: 8 FRMFA + +BO_ 499 Operation_seat_memory_FA: 8 XXX + +BO_ 504 Operation_SHD_MDS: 8 FZD + +BO_ 507 Status_EPS: 8 EPS + +BO_ 508 Status_AFS: 8 AFS + +BO_ 509 Status_request_EMF_KCAN: 8 EMF + +BO_ 510 Crash: 8 ACSM + +BO_ 513 Status_EMF_KCAN: 8 EMF + +BO_ 517 Acoustic_request_Kombi: 8 Kombi + +BO_ 518 Control_Display_Shiftlights: 8 DME + +BO_ 523 Memory_adjustment: 8 SM_FA + +BO_ 524 Steering_column_control: 8 SM_FA + +BO_ 525 Position_steering_column: 8 IHKA + +BO_ 528 Operation_HUD: 8 CCC + +BO_ 529 Status_HUD: 8 HUD + +BO_ 530 Height_levels_air_spring: 8 EHC + +BO_ 540 Operation_NightVision: 8 CCC + +BO_ 542 Status_NightVision: 8 NVC + +BO_ 548 Operation_push_button_NSW: 8 FRMFA + +BO_ 552 Operation_special_function: 8 CCC + +BO_ 554 Status_BFS: 8 JBBF + +BO_ 556 Operation_push_button_NSL: 8 FRMFA + +BO_ 558 Status_BFSH: 8 XXX + +BO_ 562 Status_FAS: 8 JBBF + +BO_ 566 Status_FASH: 8 XXX + +BO_ 570 Status_radio_key: 8 CAS + +BO_ 571 Status_climate_front_extended: 8 IHKA + +BO_ 573 Request_display_climate: 8 IHKA + +BO_ 574 Status_Klima_Fond: 8 FKA + +BO_ 582 Status_air_conditioning_front_control_unit: 8 IHKA + +BO_ 584 Status_rear_view_camera: 8 RFK + +BO_ 585 Control_rear_view_camera: 8 CCC + +BO_ 586 Status_PDC: 8 PDC + +BO_ 587 Status_door_sensors: 8 FRMFA + +BO_ 594 Wiper_status: 8 JBBF + +BO_ 598 Challenge_Passive_Access: 8 CAS + +BO_ 600 Status_Transmission_Passive_Access: 8 PGS + +BO_ 604 Operation_of_climate_additional_programs: 8 CCC + +BO_ 621 Operation_blinds_MK: 8 IHKA + +BO_ 622 Control_FH_SHD_central_comfort: 8 CAS + +BO_ 635 Status_Shiftlights: 8 Kombi + +BO_ 637 Status_convertible_top_manual_convertible: 8 CAS + +BO_ 638 Status_convertible_top_convertible: 8 CTM + +BO_ 639 Status_central_locking_convertible_top: 8 JBBF + +BO_ 642 Control_security_vehicle_2: 8 XXX + +BO_ 644 Control_remote_start_safety_vehicle: 8 CAS + +BO_ 646 Electrochromic_control: 8 FZD + +BO_ 652 Pushbutton_vertical_dynamics: 8 GWS + +BO_ 653 Operation_pushbutton_sport: 8 GWS + +BO_ 656 Control_response_hydrogen_vehicle: 8 XXX + +BO_ 658 Control_high_beam_assistant: 8 FLA + +BO_ 670 Central_locking_control_for_security_vehicle: 8 XXX + +BO_ 671 Remote_control_FondCommander: 8 CAS + +BO_ 672 Central_locking_control: 8 CAS + +BO_ 674 Operation_of_climate_stand_functions: 8 CCC + +BO_ 676 Operation_personalization: 8 Kombi + +BO_ 692 DWA_Alarm: 8 DWA + +BO_ 694 Control_horn_DWA: 8 DWA + +BO_ 696 Operation_onboard_computer: 8 CCC + +BO_ 697 Operation_RSE: 8 CCC + +BO_ 698 Stopwatch: 8 Kombi + +BO_ 701 Request_switching_display: 8 CCC + +BO_ 702 Switch_status_display: 8 VSW + +BO_ 703 Water_valve_control: 8 IHKA + +BO_ 706 Temperatur_Ist_Fond: 8 FKA + +BO_ 711 Display_Kombination_extended: 8 DME + +BO_ 714 Outside_temperature: 8 Kombi + +BO_ 716 Control_monitor_rear: 8 RSE + +BO_ 718 Control_monitor: 8 CCC + +BO_ 719 Status_of_auxiliary_water_pump: 8 JBBF + +BO_ 720 Status_Sensor_AUC: 8 JBBF + +BO_ 721 Status_fitting_window_V: 8 FZD + +BO_ 722 Status_pressure_refrigeration_circuit: 8 JBBF + +BO_ 723 Status_stratification_rear: 8 JBBF + +BO_ 725 Status_heating_rear_window: 8 JBBF + +BO_ 726 Status_valve_air_conditioning_compressor: 8 JBBF + +BO_ 730 Status_tailgate_lift: 8 HKL + +BO_ 734 Switch_control_display: 8 VSW + +BO_ 738 Status_setting_video_night_vision: 8 NVC + +BO_ 739 Status_setting_video_rear_view_camera: 8 RFK + +BO_ 740 Status_trailer: 8 AHM + +BO_ 742 Status_of_air_distribution_FA: 8 IHKA + +BO_ 746 Status_air_distribution_BF: 8 IHKA + +BO_ 750 Status_climate_additional_programs: 8 IHKA + +BO_ 752 Status_air_condition_functions: 8 IHKA + +BO_ 753 Status_driver_detection: 8 MRSZ + +BO_ 755 Display_switching_instruction: 8 DME + +BO_ 756 Air_conditioning_control_SH_ZH_auxiliary_water_pump: 8 IHKA + +BO_ 759 Units: 8 Kombi + +BO_ 768 Status_RSE: 8 RSE + +BO_ 772 Status_Gang: 8 EGS + +BO_ 773 Operation_button_convertible_top: 8 IHKA + +BO_ 774 Vehicle_tilt: 8 FRMFA + +BO_ 775 Operation_button_flap_convertible_top: 8 IHKA + +BO_ 776 Status_MSA: 8 DME + +BO_ 785 Refill_quantity: 8 Kombi + +BO_ 786 Service_Call_Teleservice: 8 Kombi + +BO_ 787 Status_Service_Call_Teleservice: 8 CCC + +BO_ 788 Status_driving_light: 8 FZD + +BO_ 789 Vehicle_mode: 8 JBBF + +BO_ 791 Operation_button_parking_aids: 8 IHKA + +BO_ 792 Status_antennas_Passive_Access: 8 PGS + +BO_ 793 Operation_push_button_RDC: 8 JBBF + +BO_ 794 Operation_button_HDC: 8 IHKA + +BO_ 795 Operation_of_tailgate_interior_button: 8 IHKA + +BO_ 796 Status_tire_pressure: 8 RDC + +BO_ 801 Operation_button_camera_BF: 8 IHKA + +BO_ 802 Damper_current: 8 EDCK + +BO_ 806 Status_damper_program: 8 VDM + +BO_ 808 Relativzeit: 8 Kombi + +BO_ 813 Display_HDC: 8 DSC + +BO_ 814 Status_climate_internal_control_info: 8 IHKA + +BO_ 817 Programming_of_step_cruise_control: 8 CCC + +BO_ 818 Driver_display_speed_range: 8 DME + +BO_ 822 Display_check_control_message_role: 8 Kombi + +BO_ 824 Control_display_check_control_message: 8 Kombi + +BO_ 825 Status_display_climate: 8 CCC + +BO_ 826 Status_Monitor_Front: 8 CID + +BO_ 828 Status_Monitor_Fond_1: 8 CID + +BO_ 830 Status_Monitor_Fond_2: 8 CID + +BO_ 841 Raw_data_level_tank: 8 JBBF + +BO_ 843 Seat_back_lock_status_FA: 8 SM_FA + +BO_ 845 Status_seat_back_lock_BF: 8 SM_BF + +BO_ 847 Status_contact_handbrake: 8 JBBF + SG_ Handbrake_push : 0|2@1+ (1,0) [0|3] "" XXX + +BO_ 858 Appointment_Condition_Based_Service: 8 CCC + +BO_ 860 Status_onboard_computer: 8 Kombi + +BO_ 862 Onboard_computer_data_trip_data: 8 Kombi + +BO_ 864 Data_onboard_computer_start_of_journey: 8 Kombi + +BO_ 866 Data_onboard_computer_average_values: 8 Kombi + +BO_ 868 Data_onboard_computer_arrival: 8 Kombi + +BO_ 869 Status_terminal_request: 8 CAS + +BO_ 870 Display_Kombination_external_display: 8 Kombi + +BO_ 871 Control_display_of_demand_oriented_service: 8 Kombi + +BO_ 877 Setting_the_driving_dynamics_switch: 8 JBBF + +BO_ 886 Status_wear_lamella: 8 VGSG + +BO_ 893 Status_DKG: 8 DKG + +BO_ 894 Temperatur_Bremse: 8 DSC + +BO_ 895 Range_of_diesel_exhaust_gas_additive: 8 DDE1 + +BO_ 896 chassis_number: 8 CAS + +BO_ 898 Electronic_engine_oil_dipstick_M: 8 DME + +BO_ 899 Motor_data_2: 8 DME + +BO_ 904 Vehicle_type: 8 CAS + +BO_ 907 Status_battery: 8 DME + +BO_ 910 Start_speed: 8 DME + +BO_ 914 Status_System_AFS: 8 AFS + +BO_ 916 RDA_request_data_storage: 8 Kombi + +BO_ 917 Coding_power_management: 8 CAS + +BO_ 920 Operation_chassis: 8 CCC + +BO_ 921 Status_MDrive: 6 DME + +BO_ 926 Operation_time_date: 8 CCC + +BO_ 928 Vehicle_state: 8 JBBF + +BO_ 931 Request_Remote_Services: 8 CCC + +BO_ 937 Status_motor_control_CKM: 8 DME + +BO_ 939 Status_Shiftlights_CKM: 8 Kombi + +BO_ 944 Status_gear_reverse: 8 FRMFA + +BO_ 949 Status_water_valve: 8 JBBF + +BO_ 950 Position_window_lifter_FAT: 8 FRMFA + +BO_ 951 Position_window_lifter_FATH: 8 JBBF + +BO_ 952 Position_window_regulator_BFT: 8 FRMFA + +BO_ 953 Position_window_regulator_BFTH: 8 JBBF + +BO_ 954 Position_SHD: 8 FZD + +BO_ 956 Position_window_lifter_security_vehicle: 8 XXX + +BO_ 957 Status_consumer_shutdown: 8 FRMFA + +BO_ 959 Position_window_rear_window: 8 CTM + +BO_ 960 Configuration_FAS: 8 SM_FA + +BO_ 961 Configuration_BFS: 8 SM_BF + +BO_ 964 Status_EDCK_CKM: 8 JBBF + +BO_ 967 Access_radio: 8 RAD1 + +BO_ 968 Operation_push_button_radio: 8 RAD1 + +BO_ 974 Radio_audio_control_interface_display: 8 ACI + +BO_ 975 Acknowledgment_access_radio_audio_control_interface: 8 ACI + +BO_ 979 Status_solar_sensor: 8 FZD + +BO_ 980 Configuration_of_central_locking_CKM: 8 Kombi + +BO_ 981 Status_central_locking_CKM: 8 CAS + +BO_ 982 Configuration_DWA_CKM: 8 Kombi + +BO_ 983 Status_DWA_CKM: 8 FZD + +BO_ 984 Configuration_RLS_CKM: 8 Kombi + +BO_ 985 Status_RLS_CKM: 8 FZD + +BO_ 986 Configuration_of_memory_positions_CKM: 8 Kombi + +BO_ 987 Status_memory_positions_CKM: 8 SM_FA + +BO_ 988 Configuration_light_CKM: 8 Kombi + +BO_ 989 Status_light_CKM: 8 FRMFA + +BO_ 990 Configuration_Climate_CKM: 8 CCC + +BO_ 991 Status_Klima_CKM: 8 IHKA + +BO_ 994 Configuration_of_tailgate_CKM: 8 CCC + +BO_ 995 Status_tailgate_CKM: 8 HKL + +BO_ 996 Configuration_rear_view_camera_CKM: 8 CCC + + + + +CM_ SG_ 170 ThrottlelPressed "Active when accelerator pedal pressed or cruise control: drives"; +CM_ SG_ 170 AcceleratorPedalPressed "Active only when driver actually presses the pedal"; +CM_ SG_ 170 AcceleratorPedalPercentage "ToDo Factor to be adjusted"; +CM_ SG_ 404 plus1mph_request "Appears when +1mph/kph stalk is depressed"; +CM_ SG_ 404 minus1mph_request "Appears when -1mph/kph stalk is depressed"; +CM_ SG_ 404 Cancel_request_up_stalk "Appears when cancel stalk (up) is depressed"; +CM_ SG_ 404 Cancel_request_up_or_down_stalk "Appears when cancel stalk (up or down) is depressed"; +CM_ SG_ 404 Resume_request "It appears when resume stalk button is depressed"; +CM_ SG_ 404 Counter_404 "Message is sent at higher rate when cruise stalk is pressed"; + +CM_ SG_ 168 BrakePressed "Brake when driver presses the brake or hill hold"; +CM_ SG_ 168 EngineTorque "Engine torque without inertia - combustion torque"; +CM_ SG_ 168 EngineTorqueWoInterv "Engine torque without inertia and without shift intervention"; +CM_ SG_ 168 ALIV_TORQ_1_DME "Counter TORQ_1"; + +CM_ SG_ 169 ALIV_TORQ_2_DME "Counter TORQ_2"; + +CM_ SG_ 182 TORQ_TAR_DSC "torque target DSC"; + +CM_ SG_ 403 CruiseControlSetpointSpeed "Speed target - unit depends on locale"; +CM_ SG_ 186 GearTar "Values corresponds to forward gears. TBD Add enums for park, reverse"; +CM_ SG_ 466 GearAct "TransmissionDataDisplay"; +CM_ SG_ 414 DSC_full_off "0x4 enabling, 0xA enabled. TBD"; + +CM_ SG_ 416 YawRate "Lateral Acceleration"; + +CM_ SG_ 408 ParkButtonSecond "Redundant buton. 0x1 = pressed;"; +CM_ SG_ 408 SideButton "0x1 = pressed;"; +CM_ SG_ 408 SportButtonPressed "0x1 = pressed;"; +CM_ SG_ 408 M3_button "M3 POWER (?)"; +CM_ SG_ 408 SideButtonXOR11 "Complement value"; +CM_ SG_ 408 param1 "can not be 0x03. Always 0 in 135i."; +CM_ SG_ 408 param5 "Always 0 in 135i."; +CM_ SG_ 408 ParkButtonFirst "0x1 = pressed"; +CM_ SG_ 408 ShifterPosition "0001 = N|R, 0010 = R, 0011 = N|D, 0100 = D, 0101 = -1, 0110 = +1, 0111 = ManualMode, 1000 = inBetween,"; + +CM_ SG_ 466 ShiftLeverMode "On the dashboard, there are displayed: D1...D7 in Normal. S1...S6 in Sport. M1..M7 in Manual"; + +CM_ SG_ 502 TurnSignalIdle "Turn signal off"; +CM_ SG_ 502 TurnSignalActive "Turn signal on or transitioning"; +CM_ SG_ 502 RightTurn "Indicates right blinker or when steering returning right clears left blinker"; +CM_ SG_ 502 LeftTurn "Indicates left blinker or when steering returning left clears right blinker"; +CM_ SG_ 502 HoldActivated "Spikes down if blinker cleared with timeout or turn. Stays off if blinker cleared with stalk"; + +CM_ SG_ 790 setMe_0x3FFF "All ones"; +CM_ SG_ 790 DTC_pressed "Traction control off. Message transmitted when pressed. Few presses may be required followed by off."; + +VAL_ 408 ShifterPosition 1 "D" 2 "S" 3 "N" 4 "R" 5 "P" ; + +VAL_ 464 ST_SW_WAUP 3 "signal invalid" 2 "EGS forced switching active" 1 "engine warm" 0 "warming up" ; +VAL_ 464 ST_ENG_RUN 3 "signal invalid" 2 "engine running" 1 "engine starting" 0 "engine off" ; +VAL_ 464 CTR_SLCK 3 "signal invalid" 2 "requirement Shiftlock" 1 "no requirement Shiftlock" 0 "not allowed" ; + +VAL_ 466 ShiftLeverMode 0 "Normal" 1 "Sport" 2 "Manual" ; +VAL_ 466 ShiftLeverPosition 0 "Off" 1 "P" 2 "R" 4 "N" 8 "D" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_chassis.dbc b/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_chassis.dbc new file mode 100644 index 000000000..9de969d76 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_chassis.dbc @@ -0,0 +1,95 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: K182_PACM K43_PSCM K17_EBCM NEO K124_ASCM + + + +BO_ 823 PACMParkAssitCmd: 7 NEO + SG_ RollingCounter : 35|2@0+ (1,0) [0|0] "" NEO + SG_ SteeringWheelChecksum : 47|16@0+ (1,0) [0|0] "" NEO + SG_ SteeringWheelCmd : 23|16@0+ (1,0) [0|0] "" NEO + +BO_ 560 EBCMRegen: 6 K17_EBCM + SG_ Regen : 1|10@0+ (1,0) [0|0] "" NEO + +BO_ 338 ASCMLKASteeringCmd: 6 NEO + SG_ LKASteeringCmdActive : 7|1@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmd : 5|14@0- (1,0) [0|0] "" NEO + SG_ RollingCounter : 23|2@0+ (1,0) [0|0] "" NEO + SG_ SetMe1 : 21|1@0+ (1,0) [0|0] "" NEO + SG_ LKASVehicleSpeed : 20|13@0+ (0.22,0) [0|0] "kph" NEO + SG_ LKASMode : 36|2@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmdChecksum : 33|10@0+ (1,0) [0|0] "" NEO + +BO_ 340 ASCMBLKASteeringCmd: 6 NEO + SG_ LKASteeringCmdActive : 7|1@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmd : 5|14@0- (1,0) [0|0] "" NEO + SG_ RollingCounter : 23|2@0+ (1,0) [0|0] "" NEO + SG_ SetMe1 : 21|1@0+ (1,0) [0|0] "" NEO + SG_ LKASVehicleSpeed : 20|13@0+ (0.22,0) [0|0] "kph" NEO + SG_ LKASteeringCmdActive2 : 35|1@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmdChecksum : 33|10@0+ (1,0) [0|0] "" NEO + +BO_ 368 EBCMFrictionBrakeStatus: 8 K17_EBCM + SG_ FrictionBrakePressure : 23|16@0+ (1,0) [0|0] "" NEO + +BO_ 789 EBCMFrictionBrakeCmd: 5 K17_EBCM + SG_ RollingCounter : 37|6@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeMode : 7|4@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeChecksum : 23|16@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeCmd : 3|12@0- (1,0) [0|0] "" NEO + +BO_TX_BU_ 823 : K43_PSCM,NEO; +BO_TX_BU_ 789 : NEO,K17_EBCM; + + +CM_ BU_ K182_PACM "Parking Assist Control Module"; +CM_ BU_ K43_PSCM "Power Steering Control Module"; +CM_ BU_ K17_EBCM "Electronic Brake Control Module"; +CM_ BU_ NEO "Comma NEO"; +CM_ BU_ K124_ASCM "Active Safety Control Module"; +BA_DEF_ "UseGMParameterIDs" INT 0 0; +BA_DEF_ "ProtocolType" STRING ; +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "UseGMParameterIDs" 1; +BA_DEF_DEF_ "ProtocolType" "GMLAN"; +BA_DEF_DEF_ "BusType" ""; +BA_ "UseGMParameterIDs" 0; +BA_ "BusType" "CAN"; +BA_ "ProtocolType" "GMLAN"; + +VAL_ 338 LKASteeringCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 338 LKASMode 2 "supercruise" 1 "lkas" 0 "Inactive" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_object.dbc b/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_object.dbc new file mode 100644 index 000000000..3f7cf64cd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_object.dbc @@ -0,0 +1,3470 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: RRSRR_FO LRSRR_FO CIPM_FO _DOFIMU2_FO _DOFIMU1_FO DMS_FO AMM_FO EOCM2B_IMX6_FO EOCM2B_K2_FO EOCM2B_K1_FO EOCM2A_IMX6_FO EOCM2A_K2_FO EOCM2A_K1_FO NVS_FO Dummy_FO TestTool_FO LRR_FO RFSRR_FO LFSRR_FO RSRR_FO VIS_FO EOCM_F_FO VIS2_FO +VAL_TABLE_ vt_BooleanValues 1 "true" 0 "false" ; +VAL_TABLE_ FrntVsnInPthVehBrkNwSt 10 "Active" 5 "Inactive" ; +VAL_TABLE_ FrntVsnClostPedBrkNwSt 10 "Active" 5 "Inactive" ; +VAL_TABLE_ DrvrMonSysEngSt 7 "Unused and Reserved 1" 6 "Recovering" 5 "Tracking" 4 "Searching" 3 "Video test port only" 2 "Idle" 1 "Invalid state" 0 "Does not exist or DME" ; +VAL_TABLE_ DrvrMonEngUnrecvrFltCod 7 "Unused and Reserved 3" 6 "Unused and Reserved 2" 5 "Unused and Reserved 1" 4 "Vehicle power supply Errors" 3 "Problem with LED illuminators" 2 "Vehicle input signals Errors" 1 "Problem with imager" 0 "Ok" ; +VAL_TABLE_ DrvrMonEngRecvrFltCod 3 "Engine is unable to find a face" 2 "Input Images too dark" 1 "Input images too bright" 0 "Ok" ; +VAL_TABLE_ DrvrMntrSysVTP 1 "Video test port active" 0 "Video test port inactive" ; +VAL_TABLE_ DrvrAttnStatCnfdc 3 "High" 2 "Medium" 1 "Low" 0 "Lowest" ; +VAL_TABLE_ DrvrAttnStat 7 "Invalid" 6 "Driver is exhibiting sleep" 5 "Driver is exhibiting microsleep" 4 "Attention is Center Console" 3 "Attention is Drivers Lap" 2 "Attention is Off Road" 1 "Attention is On Road" 0 "Unknown" ; +VAL_TABLE_ PPSMd 7 "GNSS and RTX and DR and MM" 6 "DR ONLY" 5 "GNSS and RTX and DR" 4 "GNSS and SBAS and DR" 3 "GNSS and DR" 2 "GNSS and RTX" 1 "GNSS and SBAS" 0 "GNSS Standalone" ; +VAL_TABLE_ AdvDrvAstMpPrfShrtAcur 3 "Accuracy Is Unknown" 2 "Lowest Accuracy" 1 "Medium Accuracy" 0 "Highest Accuracy" ; +VAL_TABLE_ AdvDrAstMpStbRtOfWay 3 "Not Applicable" 2 "Unknown" 1 "Sub Path Has Right Of Way Over Path" 0 "Path Has Right Of Way Over Sub Path" ; +VAL_TABLE_ AdvDrAstMpStbPrtCalRut 3 "Not Applicable" 2 "Unknown" 1 "Path From This Point On Is Part Of Calculated Route" 0 "Path From This Point On Is Not Part Of Calculated Route" ; +VAL_TABLE_ AdvDrAstMpStbMsgTyp 7 "Unused and Reserved 2" 6 "Metadata" 5 "Profile Long" 4 "Profile Short" 3 "Stub" 2 "Segment" 1 "Position" 0 "Unused and Reserved 1" ; +VAL_TABLE_ AdvDrAstMpStbFmOfWay 15 "Not Applicable" 14 "Pedestrian Zone" 13 "Entrance To Or Exit To Service" 12 "Entrance To Or Exit Of A Car Park" 11 "Service Road Or Frontage Road" 10 "Slip Road per Ramp" 9 "Slip Road per Ramp On A Freeway Or Controlled Access Road" 8 "Parallel Road" 7 "Unused and Reserved 2" 6 "Unused and Reserved 1" 5 "Traffic Square per Special Traffic Figure" 4 "Roundabout Circle" 3 "Single Carriageway" 2 "Multiple Carriageway Or Multiply Digitized Road" 1 "Freeway Or Controlled Access Road That Is Not A Slip Road Or Ramp" 0 "Unknown" ; +VAL_TABLE_ AdvDrAstMpStbCmplxInsct 3 "Not Applicable" 2 "Unknown" 1 "Stub Is Part Of Complex Intersection" 0 "Stub Is Not Part Of Complex Intersection" ; +VAL_TABLE_ AdvDrAstMpSegTunl 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Tunnel" 0 "Segment Is Not A Part Of Tunnel" ; +VAL_TABLE_ AdvDrAstMpSegPrtCalRut 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Calculated Route" 0 "Segment Is Not Part Of Calculated Route" ; +VAL_TABLE_ AdvDrAstMpSegMsgTyp 7 "Unused and Reserved 2" 6 "Metadata" 5 "Profile Long" 4 "Profile Short" 3 "Stub" 2 "Segment" 1 "Position" 0 "Unused and Reserved 1" ; +VAL_TABLE_ AdvDrAstMpSegFrmOfWay 15 "Not Applicable" 14 "Pedestrian Zone" 13 "Entrance To Or Exit To Service" 12 "Entrance To Or Exit Of A Car Park" 11 "Service Road Or Frontage Road" 10 "Slip Road per Ramp" 9 "Slip Road per Ramp On A Freeway Or Controlled Access Road" 8 "Parallel Road" 7 "Unused and Reserved 2" 6 "Unused and Reserved 1" 5 "Traffic Square per Special Traffic Figure" 4 "Roundabout Circle" 3 "Single Carriageway" 2 "Multiple Carriageway Or Multiply Digitized Road" 1 "Freeway Or Controlled Access Road That Is Not A Slip Road or Ramp" 0 "Unknown" ; +VAL_TABLE_ AdvDrAstMpSegEffSdLmtTp 7 "Not Applicable" 6 "Explicit Snow" 5 "Explicit Rain" 4 "Explicit Time Of Day" 3 "Explicit By Day" 2 "Explicit By Night" 1 "Explicit On Traffic Sign" 0 "Implicit" ; +VAL_TABLE_ AdvDrAstMpSegDivdRd 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Divided Road" 0 "Segment Is Not Part Of Divided Road" ; +VAL_TABLE_ AdvDrAstMpSegCmplxInsct 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Complex Intersection" 0 "Segment Is Not Part Of Complex Intersection" ; +VAL_TABLE_ AdvDrAstMpSegBrdg 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Bridge" 0 "Segment Not Part Of Bridge" ; +VAL_TABLE_ AdvDrAstMpSegBldUpAra 3 "Not Applicable" 2 "Unknown" 1 "Segment Is Part Of Built Up Area" 0 "Segment Is Not Part Of Built Up Area" ; +VAL_TABLE_ AdvDrAstMpMtdtSpdUnt 1 "Miles Per Hour" 0 "Kilometers Per Hour" ; +VAL_TABLE_ AdvDrAstMpMtdtDrvSd 1 "Driving Side Right" 0 "Driving Side Left" ; +VAL_TABLE_ WSMR_WiFiAssnReq 3 "Unexpected Undefined Connection Behavior" 2 "Wi Fi association failed with available credentials" 1 "Failed to receive Wi Fi credentials after 255 attempts" 0 "SSID and Passphrase Request" ; +VAL_TABLE_ StrgColCommsFlt 2 "Disabled Communications DTC" 1 "No Communications Fault" 0 "Communications Fault" ; +VAL_TABLE_ CPMAPINFO4 1 "Hardware Or Software Error" 0 "No Hardware Or Software Error" ; +VAL_TABLE_ AdvDrvAstMpPrfShrt2Acur 3 "Accuracy Is Unknown" 2 "Lowest Accuracy" 1 "Medium Accuracy" 0 "Highest Accuracy" ; +VAL_TABLE_ InterLghtStat 1 "Interior Lights On" 0 "Interior Light Off" ; +VAL_TABLE_ VehLnStatConf 2 "High Confidence" 1 "Low Confidence" 0 "No Confidence" 3 "Very High Confidence" ; +VAL_TABLE_ VehLnStat 3 "Lane Change To Right" 2 "Lane Change To Left" 1 "Staying in Lane" 0 "Unknown" ; +VAL_TABLE_ HrznPrvdRstRq 1 "Reset Not Required" 0 "Reset Required" ; +VAL_TABLE_ ExptNxtTrnstnDirConf 3 "Very High Confidence" 2 "High Confidence" 1 "Low Confidence" 0 "No Confidence" ; +VAL_TABLE_ ExptNxtTrnstnDir 7 "Reserved4" 6 "Reserved3" 5 "Reserved2" 4 "Reserved1" 3 "Traversing Middle Transition" 2 "Traversing Next Transition Right" 1 "Traversing Next Transition Left" 0 "Unknown" ; +VAL_TABLE_ ADASISMsgTypRetrans 7 "GM System Specific" 6 "Meta Data" 5 "Profile Long" 4 "Profile Short" 3 "Stub" 2 "Segment" 1 "Position" 0 "Checksum" ; +VAL_TABLE_ NVSysStat 7 "Needs Headlights" 6 "Temporarily Unavailable" 5 "Not Dark" 4 "Needs Service" 3 "Active" 2 "Inactive" 1 "Initializing" 0 "Unknown" ; +VAL_TABLE_ NVSysPedWrnIndReq 3 "Unused & Reserved" 2 "Pedestrian Alert" 1 "Pedestrian Detected" 0 "None" ; +VAL_TABLE_ NVSysPedDetCstReq 2 "On" 1 "Off" 0 "No Value" ; +VAL_TABLE_ NVSysPedDetCsCrStVal 2 "On" 1 "Off" 0 "No Value" ; +VAL_TABLE_ FwVsnCinCoutPotT9Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT8Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT7Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT6Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT5Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT4Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT3Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT2Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT1Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT12Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT11Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT10Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ GFHBObjDirTrk8 1 "Ahead Traffic" 0 "Incoming Traffic" ; +VAL_TABLE_ GFHBObjDirTrk7 1 "Ahead Traffic" 0 "Incoming Traffic" ; +VAL_TABLE_ GFHBObjDirTrk6 1 "Ahead Traffic" 0 "Incoming Traffic" ; +VAL_TABLE_ GFHBObjDirTrk5 1 "Ahead Traffic" 0 "Incoming Traffic" ; +VAL_TABLE_ GFHBObjDirTrk4 1 "Ahead Traffic" 0 "Incoming Traffic" ; +VAL_TABLE_ GFHBObjDirTrk3 1 "Ahead Traffic" 0 "Incoming Traffic" ; +VAL_TABLE_ GFHBObjDirTrk2 1 "Ahead Traffic" 0 "Incoming Traffic" ; +VAL_TABLE_ GFHBObjDirTrk1 1 "Ahead Traffic" 0 "Incoming Traffic" ; +VAL_TABLE_ GFHBFwVsnRelLaneTrk8 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ GFHBFwVsnRelLaneTrk7 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ GFHBFwVsnRelLaneTrk6 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ GFHBFwVsnRelLaneTrk5 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ GFHBFwVsnRelLaneTrk4 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ GFHBFwVsnRelLaneTrk3 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ GFHBFwVsnRelLaneTrk2 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ GFHBFwVsnRelLaneTrk1 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ GFHBFwVsnMesStatTrk8 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ GFHBFwVsnMesStatTrk7 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ GFHBFwVsnMesStatTrk6 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ GFHBFwVsnMesStatTrk5 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ GFHBFwVsnMesStatTrk4 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ GFHBFwVsnMesStatTrk3 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ GFHBFwVsnMesStatTrk2 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ GFHBFwVsnMesStatTrk1 3 "Measured this cycle" 2 "Latent track not detected this cycle" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ GFHBFwVsnCnfdncTrk8 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ; +VAL_TABLE_ GFHBFwVsnCnfdncTrk7 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ; +VAL_TABLE_ GFHBFwVsnCnfdncTrk6 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ; +VAL_TABLE_ GFHBFwVsnCnfdncTrk5 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ; +VAL_TABLE_ GFHBFwVsnCnfdncTrk4 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ; +VAL_TABLE_ GFHBFwVsnCnfdncTrk3 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ; +VAL_TABLE_ GFHBFwVsnCnfdncTrk2 3 "Confident" 2 "Speculative" 1 "Highly Speculative" 0 "Invalid" ; +VAL_TABLE_ GFHBFwVsnCnfdncTrk1 0 "Invalid" 3 "Confident" 2 "Speculative" 1 "Highly Speculative" ; +VAL_TABLE_ GFHBFVsnObjTypTrkRev8 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ; +VAL_TABLE_ GFHBFVsnObjTypTrkRev7 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ; +VAL_TABLE_ GFHBFVsnObjTypTrkRev6 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ; +VAL_TABLE_ GFHBFVsnObjTypTrkRev5 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ; +VAL_TABLE_ GFHBFVsnObjTypTrkRev4 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ; +VAL_TABLE_ GFHBFVsnObjTypTrkRev3 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ; +VAL_TABLE_ GFHBFVsnObjTypTrkRev2 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car)" 0 "Unknown" ; +VAL_TABLE_ GFHBFVsnObjTypTrkRev1 12 "Cluster Object" 11 "Child Close to Danger Zone" 10 "Pedestrian Moving Out of Danger Zone" 9 "Pedestrian Moving Into Danger Zone" 8 "Pedestrian Standing Outside Danger Zone" 7 "No Object Present" 6 "Fixed Roadside Object" 5 "Fixed Overhead Object" 4 "Pedestrian" 3 "Motorcycle/ Bicycle" 2 "Large Vehicle (Semi)" 1 "4 Wheel Vehicle (Car" 0 "Unknown" ; +VAL_TABLE_ CRL_Cnfdnc 7 "Reserved4" 6 "Reserved3" 5 "Reserved2" 4 "Reserved1" 3 "Best" 2 "Marking Present" 1 "Weak Marking" 0 "No Lane" ; +VAL_TABLE_ CLL_Cnfdnc 7 "Reserved4" 6 "Reserved3" 5 "Reserved2" 4 "Reserved1" 3 "Best" 2 "Marking Present" 1 "Weak Marking" 0 "No Lane" ; +VAL_TABLE_ VBBrkCtrlSt 4 "Release Control" 3 "Hold Vehicle" 2 "Apply Brake" 1 "Decrease Torque" 0 "No Action" ; +VAL_TABLE_ ObstacleType 6 "NO_OBJECT" 5 "OBJ_GUARDRAIL" 4 "OBJ_TUNNEL " 3 "OBJ_TRAFFIC_SIGN" 2 "OBJ_VEHICLE" 1 "OBJ_BRIDGE " 0 "OBJ_UNKNOWN" ; +VAL_TABLE_ VpathMode 2 "Mid Hi Speed" 1 "Low Speed" 0 "Disabled" ; +VAL_TABLE_ LaneChngStatus 2 "Lane Change Right" 1 "Lane Change Left" 0 "Idle" ; +VAL_TABLE_ TravelDirection 3 "Other (excessive side slip)" 2 "reverse / stopped in rvrs gear" 1 "Forward / stopped in frwd gear" 0 "Unknown" ; +VAL_TABLE_ TrueOrFalse 1 "true" 0 "false" ; +VAL_TABLE_ ModeCommand 5 "Sensing with Reduced Power" 4 "Undefined" 3 "Radio Silent" 2 "Sensing" 1 "Not Sensing" 0 "Undefined" ; +VAL_TABLE_ LaneSnsLLnPosValid 1 "Invalid" 0 "Valid" ; +VAL_TABLE_ LnSnsRLnPosValid 1 "Invalid" 0 "Valid" ; +VAL_TABLE_ Elevation 3 "Low " 2 "mid (reserved)" 1 "high " 0 "Unknown" ; +VAL_TABLE_ ModeCommandFdbk 5 "Sensing with reduced power" 4 "Undefined" 3 "Radio Silent" 2 "Sensing" 1 "Not Sensing" 0 "Undefined" ; +VAL_TABLE_ relativeLane 3 "Left Lane" 2 "Right Lane" 1 "Host Lane" 0 "Unknown" ; +VAL_TABLE_ RoadTypeInfo 5 "Constiction Zone Exit" 4 "Construction Zone Entry" 3 "Highway" 2 "Secondary Road" 1 "City" 0 "Unknown" ; +VAL_TABLE_ ObjectLossInfo 2 "elevation conditions" 1 "tight curve" 0 "not lost" ; +VAL_TABLE_ MeasurementStatus 3 "Measured this cycle" 2 "Latent track not detctd this cyc" 1 "New Object" 0 "No Object" ; +VAL_TABLE_ ObjectType 7 "no object present" 6 "fixed roadside object" 5 "fixed overhead object" 4 "pedestrian" 3 "motocycle / bicycle" 2 "Large vehicle (semi)" 1 "4 Wheel Vehicle (car, small trk)" 0 "Unknown" ; +VAL_TABLE_ Confidence 3 "confident" 2 "speculative" 1 "highly speculative" 0 "invalid" ; +VAL_TABLE_ DynamicProp 4 "Moving in opposite direction" 3 "Moving in same direction as host" 2 "Has moved but currently stopped" 1 "Has never moved" 0 "Unknown" ; +VAL_TABLE_ DrvWndPosSt 6 "Fully Opened" 5 "Open More Than C" 4 "Position C" 3 "Position B" 2 "Position A" 1 "Open Less Than A" 0 "Fully Closed" ; +VAL_TABLE_ VehMovSta 4 "Invalid" 3 "Reverse" 2 "Forward" 1 "Neutral" 0 "Parked" ; +VAL_TABLE_ OtsdAmbtLtLvlStat 2 "Day" 1 "Night" 0 "Unknown" ; +VAL_TABLE_ RtTrnLmpAtv 2 "On with telltale" 1 "On without telltale" 0 "Off" ; +VAL_TABLE_ LftTrnLmpAtv 2 "On with telltale" 1 "On without telltale" 0 "Off" ; +VAL_TABLE_ HdlmpBmSelectStat 2 "High Beams" 1 "Low Beams" 0 "Unknown" ; +VAL_TABLE_ DTCI_DTCFaultType 3 "Type C" 2 "Type B" 1 "Type A" 0 "Not Supported" ; +VAL_TABLE_ TrnsShftLvrPos 13 "Forward Range J" 12 "Forward Range I" 15 "Lever Position Unknown" 11 "Forward Range H" 10 "Forward Range G" 9 "Forward Range F" 8 "Forward Range E" 7 "Forward Range D" 6 "Forward Range C" 5 "Forward Range B" 4 "Forward Range A" 3 "Neutral Range" 2 "Reverse Range" 1 "Park Range" 0 "Between Ranges" ; +VAL_TABLE_ SysPwrMd 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off" ; +VAL_TABLE_ ValidityStates 1 "Invalid" 0 "Valid" ; + + +BO_ 1548 ADAS_Profile_Short2_FO: 8 AMM_FO + SG_ AdvDrvAstMpPrfShrt2Val1 : 1|10@0+ (1,0) [0|1023] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2Val0 : 33|10@0+ (1,0) [0|1023] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2Updt : 39|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2RTrns : 3|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2Typ : 38|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2PthIdx : 23|6@0+ (1,0) [0|63] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2Ofst : 52|13@0+ (1,0) [0|8191] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2MsgTp : 55|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2Dist1 : 17|10@0+ (1,0) [0|1023] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2CycCnt : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2CtlPt : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpPrfShrt2Acur : 5|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 1547 ADAS_Profile_Long2_FO: 8 AMM_FO + SG_ AdvDrAstMpProfLng2Val : 39|32@0+ (1,0) [0|4294967295] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLng2Updt : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLng2RTrns : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLng2PrfTyp : 4|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLng2PthIdx : 13|6@0+ (1,0) [0|63] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLng2Ofst : 20|13@0+ (1,0) [0|8191] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLng2MgTyp : 23|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLng2CycCt : 15|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLng2CtrlPt : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 1630 USDT_Resp_From_EOCM2B_K2_FO: 8 EOCM2B_K2_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1374 UUDT_Resp_From_EOCM2B_K2_FO: 8 EOCM2B_K2_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 606 USDT_Req_to_EOCM2B_K2_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2B_K2_FO + +BO_ 328 Vehicle_Info_FO: 5 EOCM2A_K1_FO + SG_ StrWhAngGrd : 27|12@0- (1,0) [-2048|2047] "deg/sec" DMS_FO + SG_ TrnsShftLvrPos : 31|4@0+ (1,0) [0|15] "" DMS_FO + SG_ StrWhAng_148 : 15|16@0- (0.0625,0) [-2048|2047.9375] "deg" DMS_FO + SG_ TrnsShftLvrPosV : 3|1@0+ (1,0) [0|1] "" DMS_FO + SG_ StrWhAngV_148 : 4|1@0+ (1,0) [0|1] "" DMS_FO + SG_ StrWhAngMsk_148 : 5|1@0+ (1,0) [0|1] "" DMS_FO + SG_ StrWhAngGrdV : 6|1@0+ (1,0) [0|1] "" DMS_FO + SG_ StrWhAngGrdMsk : 7|1@0+ (1,0) [0|1] "" DMS_FO + +BO_ 1930 DTC_Triggered_78A_FO: 7 LRSRR_FO + SG_ DTCI_CodeSupported_78A : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CurrentStatus_78A : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCFailType_78A : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFaultType_78A : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_78A : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCSource_78A : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCTriggered_78A : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_78A : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_78A : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_78A : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_78A : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_78A : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_78A : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_78A : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_78A : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_78A : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_78A : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_78A : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_78A : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_78A : 47|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1624 USDT_Resp_From_LRSRR: 8 LRSRR_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1368 UUDT_Resp_From_LRSRR: 8 LRSRR_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 600 USDT_Req_to_LRSRR: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LRSRR_FO + +BO_ 613 PPS_QualMetrics_FO: 8 EOCM2A_K1_FO + SG_ PPSPstnDilPrcs : 47|10@0+ (0.1,0) [0|102.3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSMd : 53|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPS3DAbsPosErrEstmt : 9|10@0+ (0.1,0) [0|102.3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSAbsHdngErrEstmt : 0|7@0+ (0.5,0) [0|63.5] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSAbsVelErrEstmt : 30|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSPosQltyMtrcsChksm : 50|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPS2DAbsPosErrEstmt : 25|10@0+ (0.1,0) [0|102.3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSPosQltyMtcBrstID : 2|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPS2DAbsPosErrEstmtV : 5|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPS3DAbsPosErrEstmtV : 4|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSAbsHdngErrEstmtV : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSAbsVelErrEstmtV : 31|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSMdV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSPstnDilPrcsV : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + +BO_ 612 PPS_Time_FO: 8 EOCM2A_K1_FO + SG_ PPSTmdayV : 2|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSCldrDayV : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSCldrDay : 8|9@0+ (1,0) [0|511] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSTmBrstID : 52|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSTmday : 31|27@0+ (1,0) [0|134217727] "ms" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSTmChksm : 50|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSCldrYrV : 1|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSCldrYr : 15|7@0+ (1,2014) [2014|2141] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + +BO_ 611 PPS_SigAcqTime_FO: 6 EOCM2A_K1_FO + SG_ PPSSigAqTmBrstID : 38|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSSigAcqTmV : 39|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSSigAcqTm : 7|32@0+ (1,0) [0|4294967295] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSSigAqTmChksm : 34|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + +BO_ 610 PPS_PosLong_FO: 6 EOCM2A_K1_FO + SG_ PPSLongBrstID : 39|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSLong : 6|31@0- (1,0) [-1073741824|1073741823] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSLongV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSLongChksm : 34|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + +BO_ 609 PPS_PosLat_FO: 6 EOCM2A_K1_FO + SG_ PPSLatV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSLatChksm : 34|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSLatBrstID : 36|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSLat : 5|30@0- (1,0) [-536870912|536870911] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + +BO_ 1160 PassPhrase_3_AMM_FO: 8 EOCM2A_K1_FO + SG_ WiFiPssPhrsDgts17to24_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO + +BO_ 1159 PassPhrase_2_AMM_FO: 8 EOCM2A_K1_FO + SG_ WiFiPssPhrsDgts9to16_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO + +BO_ 1158 PassPhrase_1_AMM_FO: 8 EOCM2A_K1_FO + SG_ WiFiPssPhrsDgts1to8_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO + +BO_ 1546 ADAS_Protection_FO: 4 AMM_FO + SG_ AdvDrAstMpPrfLng2Avbl : 11|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPosAvbl : 15|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpHwFlt : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtAvbl : 8|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpProtChksm : 23|16@0+ (1,0) [0|65535] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpProtRTrns : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpProtCycCtMsg : 2|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbAvbl : 9|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpSegAvbl : 10|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfShrtAvbl : 14|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfShrt2Avbl : 13|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrAstMpPrfLngAvbl : 12|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ AdvDrvAstMpInpSigFld : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + +BO_ 1545 ADAS_Metadata_FO: 8 AMM_FO + SG_ AdvDrAstMpMtdtVerYrQtr : 60|2@0+ (1,1) [1|4] "Qtr" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtVerYr : 53|6@0+ (1,2000) [2000|2063] "Year" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtSpdUnt : 39|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtPrvdr : 7|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtMsgTyp : 58|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtMnrPrtVr : 23|4@0+ (1,0) [0|15] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtCycCnt : 18|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtRgnCd : 38|15@0+ (1,0) [0|32767] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtHwVer : 16|9@0+ (1,0) [0|511] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtMnrPrtSbVr : 4|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtMjrPrtVr : 55|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtDrvSd : 19|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpMtdtCntryCd : 1|10@0+ (1,0) [0|1023] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + +BO_ 1543 ADAS_Profile_Long_FO: 8 AMM_FO + SG_ AdvDrAstMpPrfLngUpdt : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPrfLngRTrns : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPrfLngCtlPt : 5|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPrfLngTyp : 4|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPrfLngCycCt : 15|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPrfLngPthIdx : 13|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPrfLngMsgTp : 23|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPrfLngOfst : 20|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPrfLngVal : 39|32@0+ (1,0) [0|4294967295] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + +BO_ 1544 ADAS_Profile_Short_FO: 8 AMM_FO + SG_ AdvDrvAstMpPrfShrtVal1 : 1|10@0+ (1,0) [0|1023] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtVal0 : 33|10@0+ (1,0) [0|1023] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtDist1 : 17|10@0+ (1,0) [0|1023] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtCycCnt : 7|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtAcur : 5|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtCtlPt : 2|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtRetr : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtTyp : 38|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtUpdt : 39|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtPthIdx : 23|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtMsgTp : 55|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrvAstMpPrfShrtOfst : 52|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + +BO_ 1542 ADAS_Stub_FO: 8 AMM_FO + SG_ AdvDrAstMpStbSubPthIdx : 63|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbUpdt : 55|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbPrtCalRut : 57|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbNmLnDrvDir : 54|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbCycCnt : 51|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbCmplxInsct : 49|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbTrnAngl : 47|8@0+ (1.417,0) [0|361.335] "deg" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbRtOfWay : 38|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbRelProb : 36|5@0+ (3.333,0) [0|103.323] "%" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbRetr : 39|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbNmLnOppDir : 31|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbPathIdx : 29|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbLstStbOfst : 23|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbMsgTyp : 22|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbFmOfWay : 19|4@0+ (1,0) [0|15] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbFuncRdCls : 7|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpStbOfst : 4|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + +BO_ 1541 ADAS_Segment_FO: 8 AMM_FO + SG_ AdvDrAstMpSegRelProb : 12|5@0+ (3.333,0) [0|103.323] "%" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegUpdt : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegTunl : 25|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegCycCnt : 39|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegCmplxInsct : 37|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegBldUpAra : 43|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegBrdg : 41|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegRTrns : 1|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegDivdRd : 31|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegPthIdx : 7|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegPrtCalRut : 27|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegNmLnOppDir : 29|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegNmLnDrvDir : 55|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegMsgTyp : 46|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegFunRdCls : 23|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegFrmOfWay : 35|4@0+ (1,0) [0|15] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegEffSpdLmt : 20|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegEffSdLmtTp : 15|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpSegOffset : 52|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + +BO_ 608 PPS_ElevHdSpd_FO: 8 EOCM2A_K1_FO + SG_ PPSVel : 31|8@0+ (1,0) [0|255] "km / h" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSVelV : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSElvHedngSpdBrstID : 5|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSElvHdengSpdChksm : 50|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSHedngV : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSHedng : 2|19@0+ (0.001,0) [0|524.287] "deg" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSElvtnV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + SG_ PPSElvtn : 39|21@0+ (1,-100000) [-100000|1997151] "cm" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,AMM_FO + +BO_ 1168 WiFi_Station_AMM_FO: 5 AMM_FO + SG_ WSMR_WiFiStnMpMACAddr : 15|32@0+ (1,0) [0|4294967295] "" EOCM2B_K1_FO,EOCM2A_K1_FO + SG_ WSMR_WiFiAssnReq : 1|2@0+ (1,0) [0|3] "" EOCM2B_K1_FO,EOCM2A_K1_FO + +BO_ 1161 WiFi_AP_Data_AMM_FO: 2 EOCM2A_K1_FO + SG_ WAPDM_SecurityType : 15|4@0+ (1,0) [0|15] "" EOCM2B_K1_FO,AMM_FO + SG_ WAPDM_WiFiEnStat : 0|1@0+ (1,0) [0|1] "" EOCM2B_K1_FO,AMM_FO + SG_ WAPDM_EncrptnType : 11|4@0+ (1,0) [0|15] "" EOCM2B_K1_FO,AMM_FO + +BO_ 1157 SSID_AMM_3_FO: 8 EOCM2A_K1_FO + SG_ WiFiSSIDDgts17to24_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO + +BO_ 326 DMS_Eye_AOI_Info_FO: 6 DMS_FO + SG_ DrvrMontSysInit : 1|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMontSysAvlbl : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMontMdlDatFlshProgrs : 2|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonEngRecvrFltCodARC : 36|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrAttnStatChksm : 34|11@0+ (1,0) [0|2047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrAttnStat : 39|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrAttnStatPrd : 22|15@0+ (0.025,0) [0|819.175] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonEngRecvrFltCodV : 23|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonEngUnrecvrFltCod : 10|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonEngUnrecvrFltCodV : 11|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrAttnStatCnfdc : 13|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonEngRecvrFltCod : 15|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrAttnStatV : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + +BO_ 324 DMS_RawMeasurement_Info2_FO: 8 DMS_FO + SG_ DrvrMonFrmNum : 47|8@0+ (1,0) [0|255] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMntrSysVTP : 29|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonSysEngStV : 2|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonSysEngSt : 28|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonFrmNumV : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrHeadRotAngZV : 4|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrHeadRotAngYV : 5|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrHeadRotAngXV : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrHeadRotAngARC : 52|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonLatV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrMonLat : 50|11@0+ (0.001,0) [0|2.047] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvHeadRotAngZ : 25|10@0- (0.00625,0) [-3.2|3.19375] "rad" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ DrvHeadRotAngY : 23|10@0- (0.00625,0) [-3.2|3.19375] "rad" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ DrvrHeadRotAngX : 1|10@0- (0.00625,0) [-3.2|3.19375] "rad" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 322 DMS_RawMeasurement_Info1_FO: 8 DMS_FO + SG_ DrvrEyeClosrRt : 47|8@0+ (0.005,0) [0|1.275] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrEyeClosrLft : 39|8@0+ (0.005,0) [0|1.275] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvHeadPosZV : 3|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvHeadPosYV : 4|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvHeadPosXV : 5|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrEyeClosrRtV : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrEyeClosrLftV : 7|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvrEyeClosrARC : 52|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ DrvHeadPosZ : 50|11@0- (0.005,0) [-5.12|5.115] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ DrvHeadPosY : 18|11@0- (0.005,0) [-5.12|5.115] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ DrvHeadPosX : 2|11@0- (0.005,0) [-5.12|5.115] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 320 Inertial2_Rates_FO: 8 _DOFIMU2_FO + SG_ MstrTgrSyncInrtl2Rte : 55|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2YawRteV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2YawRte : 36|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2RollRteV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2RollRte : 20|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2RteChksum : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2PitchRteV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2PitchRte : 4|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 308 Inertial1_Rates_FO: 8 _DOFIMU1_FO + SG_ MstrTrgrSyncInrtl1Rte : 55|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial1YawRteV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial1YawRte : 36|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial1RollRteV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial1RollRte : 20|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial1RteChksum : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial1PitchRteV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial1PitchRte : 4|13@0- (0.024,0) [-98.304|98.28] "deg/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 312 Inertial2_Accel2_FO: 8 _DOFIMU2_FO + SG_ MstrTrigSyncInrtl22 : 55|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSns2AccFrm2Chksm : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr2YawAccV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr2YawAcc : 36|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr2RollAccV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr2RollAcc : 20|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr2PtchAccV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr2PtchAcc : 4|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 306 Inertial1_Accel2_FO: 8 _DOFIMU1_FO + SG_ MstrTrigSyncInrtl12 : 55|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1AccelFrm2Chksm : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1YawAccV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1YawAcc : 36|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1RollAccV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1RollAcc : 20|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1PtchAccV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1PtchAcc : 4|13@0- (0.024,0) [-98.304|98.28] "deg/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 310 Inertial2_Accel1_FO: 8 _DOFIMU2_FO + SG_ MstrTrigSyncInrtl21 : 7|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2VertAccV : 34|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2VertAcc : 33|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2LonAccV : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2LonAcc : 1|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2LatAccV : 18|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ Inertial2LatAcc : 17|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ IntlSnsr2AcelFm1Chksm : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 304 Inertial1_Accel1_FO: 8 _DOFIMU1_FO + SG_ MstrTrigSyncInrtl11 : 7|5@0+ (1,0) [0|31] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1VertAccV : 34|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1VertAcc : 33|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1LonAccV : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1LonAcc : 1|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1LatAccV : 18|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InrtlSnsr1LatAcc : 17|10@0- (0.0625,0) [-32|31.9375] "m/s^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ IntlSnsr1AcelFm1Chksm : 50|11@0+ (1,0) [0|2047] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 356 Map_Pos_Correction_FO: 4 EOCM2A_K1_FO + SG_ LongErrPstn : 7|8@0- (0.5,0) [-64|63.5] "m" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ LatErrPstn : 15|8@0- (0.5,0) [-64|63.5] "m" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ PstnErrChcksm : 18|11@0+ (1,0) [0|2047] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ PstnErrARC : 20|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 354 Map_Retrans_Request_FO: 1 EOCM2A_K1_FO + SG_ HrznPrvdRstRq : 2|1@0+ (1,0) [0|1] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ ADASISRwDtMplxdCycCnt : 7|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ ADASISMsgTypRetrans : 5|3@0+ (1,0) [0|7] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 352 Map_Path_Correction_FO: 6 EOCM2A_K1_FO + SG_ ExptNxtTrnstnDir : 37|3@0+ (1,0) [0|7] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ MstProbLnV : 15|1@0+ (1,0) [0|1] "" AMM_FO + SG_ MstProbLn : 14|5@0+ (1,0) [0|31] "" AMM_FO + SG_ PathCrtnChcksm : 34|11@0+ (1,0) [0|2047] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ PathCrtnARC : 4|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ EgoLnCurvV : 2|1@0+ (1,0) [0|1] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ EgoLnCurv : 23|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m^2" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ VehLnStatV : 1|1@0+ (1,0) [0|1] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ VehLnStatConf : 6|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ VehLnStat : 9|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ ExptNxtTransDirV : 0|1@0+ (1,0) [0|1] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ ExptNxtTrnstnDirConf : 39|2@0+ (1,0) [0|3] "" AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 264 Inertial_Trigger_FO: 1 EOCM2A_K1_FO + SG_ InrtlSnsrMstrTrgrSync : 7|5@0+ (1,0) [0|31] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,_DOFIMU2_FO,_DOFIMU1_FO + +BO_ 1156 SSID_AMM_2_FO: 8 EOCM2A_K1_FO + SG_ WiFiSSIDDgts9to16_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO + +BO_ 1155 SSID_AMM_1_FO: 8 EOCM2A_K1_FO + SG_ WiFiSSIDDgts1to8_Mp : 7|64@0+ (1,0) [0|0] "" EOCM2B_K1_FO,AMM_FO + +BO_ 1927 DTC_Triggered_787_FO: 7 DMS_FO + SG_ DTCI_CodeSupported_787 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CurrentStatus_787 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCFailType_787 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFaultType_787 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_787 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCSource_787 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCTriggered_787 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_787 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_787 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_787 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_787 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_787 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_787 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_787 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_787 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_787 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_787 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_787 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_787 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_787 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1926 DTC_Triggered_786_FO: 7 AMM_FO + SG_ DTCI_CodeSupported_786 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CurrentStatus_786 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCFailType_786 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFaultType_786 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_786 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCSource_786 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCTriggered_786 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_786 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_786 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_786 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_786 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_786 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_786 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_786 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_786 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_786 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_786 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_786 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_786 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_786 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1928 DTC_Triggered_788_FO: 7 _DOFIMU1_FO + SG_ DTCI_CodeSupported_788 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CurrentStatus_788 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCFailType_788 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFaultType_788 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_788 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCSource_788 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCTriggered_788 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_788 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_788 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_788 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_788 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_788 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_788 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_788 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_788 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_788 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_788 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_788 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_788 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_788 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1929 DTC_Triggered_789_FO: 7 _DOFIMU2_FO + SG_ DTCI_CodeSupported_789 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CurrentStatus_789 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCFailType_789 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFaultType_789 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_789 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCSource_789 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCTriggered_789 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_789 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_789 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_789 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_789 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_789 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_789 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_789 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_789 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_789 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_789 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_789 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_789 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_789 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1352 UUDT_Resp_From_6DOFIMU2_FO: 8 _DOFIMU2_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 588 USDT_Req_to_EOCM2B_K1_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2B_K1_FO + +BO_ 1356 UUDT_Resp_From_EOCM2B_K1_FO: 8 EOCM2B_K1_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1612 USDT_Resp_From_EOCM2B_K1_FO: 8 EOCM2B_K1_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1616 USDT_Resp_From_EOCM2A_IMX6_FO: 8 EOCM2A_IMX6_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1360 UUDT_Resp_From_EOCM2A_IMX6_FO: 8 EOCM2A_IMX6_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 592 USDT_Req_to_EOCM2A_IMX6_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2A_IMX6_FO + +BO_ 1610 USDT_Resp_From_EOCM2A_K1_FO: 8 EOCM2A_K1_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1354 UUDT_Resp_From_EOCM2A_K1_FO: 8 EOCM2A_K1_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 586 USDT_Req_to_EOCM2A_K1_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2A_K1_FO + +BO_ 1925 DTC_Triggered_785_FO: 7 NVS_FO + SG_ DTCI_CodeSupported_785 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CurrentStatus_785 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCFailType_785 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFaultType_785 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_785 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCSource_785 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCTriggered_785 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_785 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_785 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_785 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_785 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_785 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_785 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_785 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_785 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_785 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_785 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_785 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_785 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_785 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1859 VIN_Digits_10_to_17_FO: 8 EOCM_F_FO + SG_ VehIdNmDig10_17 : 7|64@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO + +BO_ 1857 VIN_Digits_2_to_9_FO: 8 EOCM_F_FO + SG_ VehIdNmDig2_9 : 7|64@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO + +BO_ 771 Outside_Air_Temperature_FO: 2 EOCM_F_FO + SG_ OtsAirTmpCrValV : 0|1@0+ (1,0) [0|1] "" NVS_FO + SG_ OtsAirTmpCrVal : 15|8@0+ (0.5,-40) [-40|87.5] "deg C" NVS_FO + +BO_ 777 Night_Vision_System_Ped_FO: 1 NVS_FO + SG_ NVSysStat : 3|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ NVSysPedWrnIndReq : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ NVSysPedDetCsCrStVal : 5|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ NVSysPedDetCstStAvl : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 607 USDT_Req_to_NVS_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" NVS_FO + +BO_ 1631 USDT_Resp_From_NVS_FO: 8 NVS_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1375 UUDT_Resp_From_NVS_FO: 8 NVS_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1540 ADAS_Position_FO: 8 AMM_FO + SG_ AdvDrAstMpLatOffst : 40|9@0+ (1,-256) [-256|255] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnIndx : 63|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnCnf : 61|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPsnIdxCrLn : 58|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnPthIndx : 46|6@0+ (1,0) [0|63] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnProb : 31|5@0+ (3.333,0) [0|103.323] "%" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnCycCnt : 26|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnAge : 24|9@0+ (5,0) [0|2555] "ms" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnRelHd : 23|8@0+ (1.417,0) [0|361.335] "deg" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnMsgTyp : 7|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + SG_ AdvDrAstMpPstnOfst : 4|13@0+ (1,0) [0|8191] "m" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO + +BO_ 1608 USDT_Resp_From_6DOFIMU2_FO: 8 _DOFIMU2_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 871 LGT_ObjectDetect_Info_8_FO: 8 VIS2_FO + SG_ GFHBFwVsnWidthTrk8 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO + SG_ GFHBFwVsnVertPosTrk8 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO + SG_ GFHBFwVsnRelLaneTrk8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnAzmthRtTrk8 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ GFHBFwVsnCnfdncTrk8 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnRngTrkRev8 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO + SG_ GFHBFwVsnAzmthTrkRev8 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO + SG_ GFHBFVsnObjTypTrkRev8 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ GFHBObjDirTrk8 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ GFHBFwVsnMesStatTrk8 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnObjIDTrk8 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 870 LGT_ObjectDetect_Info_7_FO: 8 VIS2_FO + SG_ GFHBFwVsnWidthTrk7 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO + SG_ GFHBFwVsnVertPosTrk7 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO + SG_ GFHBFwVsnRelLaneTrk7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnAzmthRtTrk7 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ GFHBFwVsnCnfdncTrk7 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnRngTrkRev7 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO + SG_ GFHBFwVsnAzmthTrkRev7 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO + SG_ GFHBFVsnObjTypTrkRev7 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ GFHBObjDirTrk7 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ GFHBFwVsnMesStatTrk7 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnObjIDTrk7 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 869 LGT_ObjectDetect_Info_6_FO: 8 VIS2_FO + SG_ GFHBFwVsnWidthTrk6 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO + SG_ GFHBFwVsnVertPosTrk6 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO + SG_ GFHBFwVsnRelLaneTrk6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnAzmthRtTrk6 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ GFHBFwVsnCnfdncTrk6 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnRngTrkRev6 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO + SG_ GFHBFwVsnAzmthTrkRev6 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO + SG_ GFHBFVsnObjTypTrkRev6 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ GFHBObjDirTrk6 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ GFHBFwVsnMesStatTrk6 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnObjIDTrk6 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 868 LGT_ObjectDetect_Info_5_FO: 8 VIS2_FO + SG_ GFHBFwVsnWidthTrk5 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO + SG_ GFHBFwVsnVertPosTrk5 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO + SG_ GFHBFwVsnRelLaneTrk5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnAzmthRtTrk5 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ GFHBFwVsnCnfdncTrk5 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnRngTrkRev5 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO + SG_ GFHBFwVsnAzmthTrkRev5 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO + SG_ GFHBFVsnObjTypTrkRev5 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ GFHBObjDirTrk5 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ GFHBFwVsnMesStatTrk5 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnObjIDTrk5 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 867 LGT_ObjectDetect_Info_4_FO: 8 VIS2_FO + SG_ GFHBFwVsnWidthTrk4 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO + SG_ GFHBFwVsnVertPosTrk4 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO + SG_ GFHBFwVsnRelLaneTrk4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnAzmthRtTrk4 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ GFHBFwVsnCnfdncTrk4 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnRngTrkRev4 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO + SG_ GFHBFwVsnAzmthTrkRev4 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO + SG_ GFHBFVsnObjTypTrkRev4 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ GFHBObjDirTrk4 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ GFHBFwVsnMesStatTrk4 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnObjIDTrk4 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 866 LGT_ObjectDetect_Info_3_FO: 8 VIS2_FO + SG_ GFHBFwVsnWidthTrk3 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO + SG_ GFHBFwVsnVertPosTrk3 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO + SG_ GFHBFwVsnRelLaneTrk3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnAzmthRtTrk3 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ GFHBFwVsnCnfdncTrk3 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnRngTrkRev3 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO + SG_ GFHBFwVsnAzmthTrkRev3 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO + SG_ GFHBFVsnObjTypTrkRev3 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ GFHBObjDirTrk3 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ GFHBFwVsnMesStatTrk3 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnObjIDTrk3 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 865 LGT_ObjectDetect_Info_2_FO: 8 VIS2_FO + SG_ GFHBFwVsnWidthTrk2 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO + SG_ GFHBFwVsnVertPosTrk2 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO + SG_ GFHBFwVsnRelLaneTrk2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnAzmthRtTrk2 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ GFHBFwVsnCnfdncTrk2 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnRngTrkRev2 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO + SG_ GFHBFwVsnAzmthTrkRev2 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO + SG_ GFHBFVsnObjTypTrkRev2 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ GFHBFwVsnMesStatTrk2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBObjDirTrk2 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ GFHBFwVsnObjIDTrk2 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 864 LGT_ObjectDetect_Info_1_FO: 8 VIS2_FO + SG_ GFHBFwVsnWidthTrk1 : 62|7@0+ (0.1,0) [0|12.7] "deg" EOCM_F_FO + SG_ GFHBFwVsnVertPosTrk1 : 53|6@0+ (0.25,-3) [-3|12.75] "deg" EOCM_F_FO + SG_ GFHBFwVsnRelLaneTrk1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnAzmthRtTrk1 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ GFHBFwVsnCnfdncTrk1 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnRngTrkRev1 : 16|12@0+ (0.2,0) [0|819] "m" EOCM_F_FO + SG_ GFHBFwVsnAzmthTrkRev1 : 10|10@0- (0.05,0) [-25.6|25.55] "deg" EOCM_F_FO + SG_ GFHBFVsnObjTypTrkRev1 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ GFHBObjDirTrk1 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ GFHBFwVsnMesStatTrk1 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ GFHBFwVsnObjIDTrk1 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1915 DTC_Triggered_77B_FO: 7 VIS_FO + SG_ DTCI_DTCFaultType_77B : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_CodeSupported_77B : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CurrentStatus_77B : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_77B : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_77B : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_77B : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_77B : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_77B : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_77B : 47|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCFailType_77B : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_77B : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCSource_77B : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCTriggered_77B : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_77B : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_77B : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_77B : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_77B : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_77B : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_77B : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_77B : 7|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1923 DTC_Triggered_783_FO: 7 RSRR_FO + SG_ DTCI_WrnIndRqdSt_783 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_783 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_783 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_783 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_783 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_783 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCTriggered_783 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCSource_783 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_783 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCFaultType_783 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFailType_783 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_CurrentStatus_783 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CodeSupported_783 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_783 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_783 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_783 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_783 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_783 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_783 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_783 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1924 DTC_Triggered_784_FO: 7 RRSRR_FO + SG_ DTCI_HistStat_784 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_784 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_784 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_784 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_784 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_784 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_784 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_784 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_784 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_784 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_784 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_784 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_784 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CodeSupported_784 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CurrentStatus_784 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCFailType_784 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFaultType_784 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_784 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCSource_784 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCTriggered_784 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1922 DTC_Triggered_782_FO: 7 RFSRR_FO + SG_ DTCI_WrnIndRqdSt_782 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_782 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_782 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_782 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_782 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_782 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_782 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_782 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_782 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_782 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_782 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_782 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_782 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCTriggered_782 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCSource_782 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_782 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCFaultType_782 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFailType_782 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_CurrentStatus_782 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_CodeSupported_782 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1920 DTC_Triggered_780_FO: 7 LRR_FO + SG_ DTCI_CurrentStatus_780 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_780 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_780 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_780 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_780 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_780 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_780 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_780 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_780 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_780 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_780 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_780 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_780 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_780 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCTriggered_780 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCSource_780 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_780 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCFaultType_780 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFailType_780 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_CodeSupported_780 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1921 DTC_Triggered_781_FO: 7 LFSRR_FO + SG_ DTCI_CurrentStatus_781 : 41|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_WrnIndRqdSt_781 : 47|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused7_781 : 1|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused6_781 : 2|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused5_781 : 3|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused4_781 : 4|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused3_781 : 5|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused2_781 : 6|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCIUnused1_781 : 7|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdPwrUpSt_781 : 45|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstNPsdCdClrdSt_781 : 42|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldPwrUpSt_781 : 46|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_TstFldCdClrdStat_781 : 43|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_HistStat_781 : 44|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCTriggered_781 : 0|1@0+ (1,0) [0|1] "" TestTool_FO + SG_ DTCI_DTCSource_781 : 15|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCNumber_781 : 23|16@0+ (1,0) [0|65535] "" TestTool_FO + SG_ DTCI_DTCFaultType_781 : 55|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_DTCFailType_781 : 39|8@0+ (1,0) [0|255] "" TestTool_FO + SG_ DTCI_CodeSupported_781 : 40|1@0+ (1,0) [0|1] "" TestTool_FO + +BO_ 1034 Curvature_Right_Line_FO: 7 VIS2_FO + SG_ CRL_Cnfdnc : 50|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ CRL_ViewRng : 33|15@0+ (0.0039064,0) [0|128.0010088] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ CRL_CoefdA : 17|16@0- (3.6622E-009,0) [-0.0001200029696|0.0001199993074] "1/m^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ CRL_CoefA : 1|16@0- (6.1036E-007,0) [-0.02000027648|0.01999966612] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 1033 Curvature_Left_Line_FO: 7 VIS2_FO + SG_ CLL_Cnfdnc : 50|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ CLL_ViewRng : 33|15@0+ (0.0039064,0) [0|128.0010088] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ CLL_CoefdA : 17|16@0- (3.6622E-009,0) [-0.0001200029696|0.0001199993074] "1/m^2" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ CLL_CoefA : 1|16@0- (6.1036E-007,0) [-0.02000027648|0.01999966612] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + +BO_ 1365 UUDT_Resp_From_VIS2_FO: 8 VIS2_FO + SG_ DgnInf_OBJ555 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1621 USDT_Resp_From_VIS2_FO: 8 VIS2_FO + SG_ DgnInf_OBJ655 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1094 F_Vision_Obj_Track_12: 8 VIS2_FO + SG_ FwdVsnObjTypTr12Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnAzmthTrk12Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk12Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FVisionWidthTrk12 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FVisionMeasStatTrk12 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnVertPosTrk12 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FVisionRelLaneTrk12 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk12 : 34|11@0- (0.125,0) [-128|127.875] "deg/sec" EOCM_F_FO + SG_ FVisionConfTrk12 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ ObjDirTrk12 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk12 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk12 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1093 F_Vision_Obj_Track_11: 8 VIS2_FO + SG_ FwdVsnObjTypTr11Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnAzmthTrk11Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk11Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FVisionWidthTrk11 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FVisionMeasStatTrk11 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnVertPosTrk11 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FVisionRelLaneTrk11 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk11 : 34|11@0- (0.125,0) [-128|127.875] "deg/sec" EOCM_F_FO + SG_ FVisionConfTrk11 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ ObjDirTrk11 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk11 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk11 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1100 F_Vision_Obj_Track_12_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT12Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk12 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk12 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk12 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk12 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr12 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk12 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo12 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1099 F_Vision_Obj_Track_11_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT11Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk11 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk11 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk11 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk11 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr11 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk11 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo11 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1098 F_Vision_Obj_Track_10_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT10Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk10 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk10 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk10 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk10 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr10 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk10 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo10 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1097 F_Vision_Obj_Track_9_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT9Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk9 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk9 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk9 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk9 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr9 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk9 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo9 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1096 F_Vision_Obj_Track_8_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT8Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk8 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk8 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk8 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk8 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr8 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk8 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo8 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1095 F_Vision_Obj_Track_7_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT7Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk7 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk7 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk7 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk7 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr7 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk7 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo7 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 863 F_Vision_GFHB_Data_FO: 8 VIS2_FO + SG_ RgDtLgtSrcHrtAngl : 49|10@0- (0.04,0) [-20.48|20.44] "deg" EOCM_F_FO + SG_ RgDtLgtSrcHrtAngVcty : 55|6@0- (1,0) [-32|31] "deg/sec" EOCM_F_FO + SG_ LfDtLgtSrcHrtAngl : 33|10@0- (0.04,0) [-20.48|20.44] "deg" EOCM_F_FO + SG_ LfDtLgtSrcHrtAnVcty : 39|6@0- (1,0) [-32|31] "deg/sec" EOCM_F_FO + SG_ AdvWthrStat : 25|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ DtctdLghtSrcDstnc : 22|7@0+ (10,0) [0|1270] "m" EOCM_F_FO + SG_ DtctdLghtSrcVrtclAngl : 1|10@0- (0.04,0) [-20.48|20.44] "deg" EOCM_F_FO + SG_ IntLghtRngAct : 2|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ DtctdLghtSrcDstncV : 3|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ TwnDtctnSts : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ DtctdLghtSrcDrvngDrctn : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 862 LGT_ControlHighBeamGlare_FO: 2 VIS2_FO + SG_ FwdCamSysOpStat : 10|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ EnvIllum : 2|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RdTyp : 5|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ AutoHgBmSts : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1068 F_Vision_Obj_Track_6_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT6Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk6 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk6 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk6 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk6 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr6 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk6 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo6 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1067 F_Vision_Obj_Track_5_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT5Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk5 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk5 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk5 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk5 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr5 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk5 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo5 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1066 F_Vision_Obj_Track_4_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT4Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk4 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk4 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk4 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk4 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr4 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk4 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo4 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1065 F_Vision_Obj_Track_3_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT3Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk3 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk3 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk3 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk3 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr3 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk3 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo3 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1064 F_Vision_Obj_Track_2_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT2Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk2 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk2 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk2 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk2 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr2 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk2 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo2 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1063 F_Vision_Obj_Track_1_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT1Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk1 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FwdVsnObjAgeTrk1 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk1 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk1 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk1 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr1 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo1 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1151 Long_Range_Radar_add_Info_5_FO: 8 LRR_FO + SG_ FrtRdrRdEdgLtLatRdEdgDst : 63|8@0- (0.1,0) [-12.8|12.7] "m/m" EOCM_F_FO + SG_ FrtRdrRdEdgLtCrvtPrvDst : 5|4@0+ (10,0) [0|150] "" EOCM_F_FO + SG_ FrtRdrRdEdgLtTanHdgAng : 15|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM_F_FO + SG_ FrtRdrRdEdgLtCrvtV : 48|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtRdrRdEdgLtCrvtGradV : 0|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtRdrRdEdgLtCrvtGrad : 39|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM_F_FO + SG_ FrtRdrRdEdgLtCrvtConf : 55|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM_F_FO + SG_ FrtRdrRdEdgLtCrvt : 23|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM_F_FO + SG_ FrtRdrRdEdgLtTanHdgAngV : 1|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAddInfo5BurstID : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1150 Long_Range_Radar_add_Info_4_FO: 8 LRR_FO + SG_ FrtRdrRdEdgRtLatRdEdgDst : 63|8@0- (0.1,0) [-12.8|12.7] "m/m" EOCM_F_FO + SG_ FrtRdrRdEdgRtCrvtPrvDst : 5|4@0+ (10,0) [0|150] "" EOCM_F_FO + SG_ FrtRdrRdEdgRtTanHdgAngV : 1|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtRdrRdEdgRtTanHdgAng : 15|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM_F_FO + SG_ FrtRdrRdEdgRtCrvtV : 48|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtRdrRdEdgRtCrvtGradV : 0|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtRdrRdEdgRtCrvtGrad : 39|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM_F_FO + SG_ FrtRdrRdEdgRtCrvtConf : 55|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM_F_FO + SG_ FrtRdrRdEdgRtCrvt : 23|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM_F_FO + SG_ FLRRAddInfo4BurstID : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1088 F_Vision_Obj_Header_2: 8 VIS2_FO + SG_ FrntVsnInPthVehBrkNwSt : 35|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FrntVsnClostPedBrkNwSt : 39|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FrntVsnClostPedObjID : 29|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FrntVsnClostPedAlrtNwFlg : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrntVsnClostPedNotftnFlg : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrntVsnInPthVehAlrtNwFlg : 2|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnVldTgtNum2 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FrtVsnTmStmp2V : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnTmStmp2 : 10|11@0+ (1,0) [0|2047] "" EOCM_F_FO + SG_ FrtVsnRollCnt2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FrtVsnBrstChksum2 : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO + +BO_ 854 F_Vision_Environment_7: 3 VIS2_FO + SG_ FwdVsnCnstrctAreaDst : 13|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnCnstrctZnDet : 15|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnEgoVehLnPos : 17|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnRdTypDet : 9|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnTunnlDetd : 23|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnTunnlDst : 21|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBrstID5 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 853 F_Vision_Environment_6: 8 VIS2_FO + SG_ LnMrkg4LnSnsLnHdngTngtV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnHdngTngt : 23|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnDstV : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnDst : 15|8@0- (0.1,0) [-12.8|12.7] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnCrvtV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnCrvtGradV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnCrvtGrad : 47|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnCrvt : 31|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnQltyConfLvl : 63|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnMrkrTyp : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBrstID4 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 852 F_Vision_Environment_5: 8 VIS2_FO + SG_ LnMrkg3LnSnsLnHdngTngtV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnHdngTngt : 23|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnDstV : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnDst : 15|8@0- (0.1,0) [-12.8|12.7] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnCrvtV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnCrvtGradV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnCrvtGrad : 47|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnCrvt : 31|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnQltyConfLvl : 63|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnMrkrTyp : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBrstID3 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 602 USDT_Req_to_RRSRR: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RRSRR_FO + +BO_ 1626 USDT_Resp_From_RRSRR: 8 RRSRR_FO + SG_ DgnInf_OBJ65A : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1370 UUDT_Resp_From_RRSRR: 8 RRSRR_FO + SG_ DgnInf_OBJ55A : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1536 RR_SRR_Trace_data: 8 RRSRR_FO + SG_ RRSRRYear : 7|8@0+ (1,0) [0|0] "" EOCM_F_FO + SG_ RRSRRSerialNmbr : 39|32@0+ (1,0) [0|0] "" EOCM_F_FO + SG_ RRSRRJulianDate : 15|24@0+ (1,0) [0|0] "" EOCM_F_FO + +BO_ 1210 RR_SRR_Object_Track10: 8 RRSRR_FO + SG_ RRSrrTrkRawAzimuth10 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate10 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange10 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange10 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID10 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation10 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp10 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth10 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RRSrrBurstID10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1209 RR_SRR_Object_Track9: 8 RRSRR_FO + SG_ RRSrrTrkRawAzimuth9 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate9 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange9 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange9 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID9 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation9 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp9 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth9 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RRSrrBurstID9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1208 RR_SRR_Object_Track8: 8 RRSRR_FO + SG_ RRSrrTrkRawAzimuth8 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate8 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange8 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange8 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID8 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation8 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp8 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth8 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RRSrrBurstID8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1207 RR_SRR_Object_Track7: 8 RRSRR_FO + SG_ RRSrrTrkRawAzimuth7 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate7 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange7 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange7 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID7 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation7 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp7 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth7 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RRSrrBurstID7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1206 RR_SRR_Object_Track6: 8 RRSRR_FO + SG_ RRSrrTrkRawAzimuth6 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate6 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange6 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange6 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID6 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation6 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp6 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth6 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RRSrrBurstID6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1205 RR_SRR_Object_Track5: 8 RRSRR_FO + SG_ RRSrrTrkRawAzimuth5 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate5 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange5 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange5 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID5 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation5 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp5 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth5 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RRSrrBurstID5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 262 LHT_AutoHighBeamAssistStatus_FO: 5 EOCM_F_FO + SG_ NtVsnSysEnbld : 6|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO + SG_ VehMovState : 5|3@0+ (1,0) [0|7] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO + SG_ NVSysPedDetCstReq : 2|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO + SG_ StrWhAngV : 8|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO,VIS_FO + SG_ StrWhAngMsk : 9|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ StrWhAng : 23|16@0- (0.0625,0) [-2048|2047.9375] "deg" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO,VIS_FO + SG_ RtTrnLmpAtv : 13|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ MpDataAvlbl : 0|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ LftTrnLmpAtv : 11|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ HdlmpBmSelectStat : 33|2@0+ (1,0) [0|3] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ BldUpArDet : 14|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ FrFogLmpsAct : 15|1@0+ (1,0) [0|1] "" EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,NVS_FO,VIS_FO + +BO_ 309 LHT_CameraObjConfirmation_FO: 1 VIS_FO + SG_ HiBmRecmnd : 1|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ CtLghtDet : 0|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 2034 CCP_Data_Transmission_Object_FO: 8 VIS2_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 2032 CCP_Command_Receive_Object_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" VIS2_FO + +BO_ 1362 F_Vis_Obj_Conf_CPS_1B: 8 EOCM_F_FO + SG_ FObjConfCPSTrkObjectIDB : 7|6@0+ (1,0) [0|63] "" VIS_FO + SG_ CPSVisConfLonPos1 : 20|12@0- (0.125,0) [-256|255.875] "m" VIS_FO + SG_ CPSVisConfLatPos1 : 15|10@0- (0.125,0) [-64|63.875] "m" VIS_FO + SG_ CPSVisConfChecksum : 50|11@0+ (1,0) [0|2047] "" VIS_FO + SG_ FObjConfCPSTrkRangeRate : 45|11@0- (0.125,0) [-128|127.875] "m/s" VIS_FO + SG_ CPSConfTimeStamp : 24|11@0+ (1,0) [0|2047] "ms" VIS_FO + SG_ CPSConfTimeStampV : 21|1@0+ (1,0) [0|1] "" VIS_FO + SG_ FObjConfCPSRollingTrkCnt : 1|2@0+ (1,0) [0|3] "" VIS_FO + +BO_ 1413 TOS_ACC_IDS: 5 EOCM_F_FO + SG_ TOS_ACC_IDSRollCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ TOS_ACC_IDSFuncState : 5|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ TOS_ACC_ID1 : 3|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ TOS_ACC_ID2 : 13|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ TOS_ACC_ID3 : 23|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ TOS_ACC_ID4 : 17|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ TOS_ACC_ID5 : 27|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ TOS_ACC_ID6 : 37|6@0+ (1,0) [0|63] "" Dummy_FO + +BO_ 1412 F_ACC_Target: 8 EOCM_F_FO + SG_ FACCTOSRollCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FACCTOSFuncState : 5|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FACCTOSLongPos : 3|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FACCTOSLatPos : 23|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FACCTOSMeasStat : 28|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FACCTOSLongVel : 26|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FACCTOSTrgtDecelFlg : 47|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FACCTOSDynProp : 46|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FACCTOSLatVel : 42|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FACCTOSRelLane : 63|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FACCTOSHiThrtID : 61|6@0+ (1,0) [0|63] "" Dummy_FO + +BO_ 1409 F_CPS_TOS_B: 8 EOCM_F_FO + SG_ CPSTOSObjType : 7|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ CPSTOSHiThrtPriNo : 60|5@0+ (1,0) [0|31] "" Dummy_FO + SG_ CPSTOSRelLongAcc : 53|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ CPSTOSConfAsmt : 21|12@0+ (1,0) [0|4095] "" Dummy_FO + SG_ CPSTOSNumCycTrkd : 4|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ CPSTOSTimeToColl : 1|12@0+ (0.025,0) [0|102.375] "s" Dummy_FO + SG_ CPSTOSClosestInPthVehRng : 47|10@0+ (0.25,0) [0|255.75] "m" Dummy_FO + SG_ CPSTOSClosestInPthObID : 37|6@0+ (1,0) [0|63] "m" Dummy_FO + SG_ CPSTOSMeasStat : 39|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ CPSTOSFuncState : 25|2@0+ (1,0) [0|3] "" Dummy_FO + +BO_ 1408 F_CPS_TOS_A: 8 EOCM_F_FO + SG_ CPSTOSLongPos : 7|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ CPSTOSLatPos : 11|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ CPSTOSLongVel : 16|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ CPSTOSDynProp : 37|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ CPSTOSLatVel : 34|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ CPSTOSARelLane : 63|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ CPSTOSHiThrtID : 61|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ CPSTOSHighestThreatObAsmt : 55|8@0+ (1,0) [0|255] "" Dummy_FO + +BO_ 1344 FLPEstimate: 8 EOCM_F_FO + SG_ FLPRollCount : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ NewLaneIndex : 5|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ VehPathInOK : 3|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LaneSnsInOK : 2|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ MapInOK : 1|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FWDObjFusInOK : 0|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LngthFrstSeg : 15|4@0+ (10,0) [0|150] "m" Dummy_FO + SG_ LngthScndSeg : 11|4@0+ (10,0) [0|150] "m" Dummy_FO + SG_ CurvFrstSeg : 23|13@0- (5E-005,0) [-0.2048|0.20475] "1/m" Dummy_FO + SG_ CurvScndSeg : 26|3@0- (0.001,0) [-0.004|0.003] "1/m" Dummy_FO + SG_ OffstLaneCntr : 39|8@0- (0.05,0) [-6.4|6.35] "m" Dummy_FO + SG_ TngntLaneHead : 47|8@0- (0.002,0) [-0.256|0.254] "m/m" Dummy_FO + SG_ LaneWidth : 55|8@0+ (0.05,0) [0|12.75] "m" Dummy_FO + SG_ FLPDataTimeStampV : 63|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FLPDataTimeStamp : 62|7@0+ (16,0) [0|2032] "ms" Dummy_FO + +BO_ 770 F_Fwd_Collision_Alert: 8 EOCM_F_FO + SG_ Vpath_Accel : 51|11@0- (0.125,0) [-128|127.875] "m/s^2" NVS_FO,Dummy_FO + SG_ FCA_Ra : 7|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FCA_Range : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FCA_AlertLevel : 44|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FCA_Alert_Sup : 31|16@0+ (1,0) [0|65535] "" Dummy_FO + SG_ FCAStatus : 46|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FCA_VehAhead : 47|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FCA_CPS_Alert : 42|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FCAChime : 41|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FCADiagOK : 40|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ NBSMS_Alert : 55|1@0+ (1,0) [0|1] "" Dummy_FO + +BO_ 1601 USDT_Resp_From_VIS: 8 VIS_FO + SG_ DgnInf_OBJ641 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1606 USDT_Resp_From_RFSRR: 8 RFSRR_FO + SG_ DgnInf_OBJ646 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1603 USDT_Resp_From_LFSRR: 8 LFSRR_FO + SG_ DgnInf_OBJ643 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1602 USDT_Resp_From_LRR: 8 LRR_FO + SG_ DgnInf_OBJ642 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1625 USDT_Resp_From_RSRR: 8 RSRR_FO + SG_ DgnInf_OBJ644 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1611 USDT_Resp_From_FEOCM_FO: 8 EOCM_F_FO + SG_ DgnInf_OBJ64B : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 768 F_Smgr_Vehicle_Motion: 8 EOCM_F_FO + SG_ SmgrMotRollAngle : 44|10@0- (0.1,0) [-51.2|51.1] "deg" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotRollAngleV : 0|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotChecksum : 50|11@0+ (1,0) [0|2047] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotPitchAngle : 39|11@0- (0.1,0) [-102.4|102.3] "deg" CIPM_FO,NVS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotPitchAngleV : 1|1@0+ (1,0) [0|1] "" CIPM_FO,NVS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotLongSpeedV : 2|1@0+ (1,0) [0|1] " " CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotLongSpeed : 18|11@0- (0.1,0) [-102.4|102.3] "m/s" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotYawRate : 14|12@0- (0.05,0) [-102.4|102.35] "deg/s" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotYawRateV : 15|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + SG_ SmgrMotRollingCnt : 4|2@0+ (1,0) [0|3] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS_FO + +BO_ 1350 UUDT_Resp_From_RFSRR: 8 RFSRR_FO + SG_ DgnInf_OBJ546 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1369 UUDT_Resp_From_RSRR: 8 RSRR_FO + SG_ DgnInf_OBJ544 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1347 UUDT_Resp_From_LFSRR: 8 LFSRR_FO + SG_ DgnInf_OBJ543 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1346 UUDT_Resp_From_LRR: 8 LRR_FO + SG_ DgnInf_OBJ542 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1345 UUDT_Resp_From_VIS: 8 VIS_FO + SG_ DgnInf_OBJ541 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 579 USDT_Req_to_LFSRR: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LFSRR_FO + +BO_ 577 USDT_Req_to_VIS: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" VIS_FO + +BO_ 578 USDT_Req_to_LRR: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LRR_FO + +BO_ 582 USDT_Req_to_RFSRR: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RFSRR_FO + +BO_ 601 USDT_Req_to_RSRR: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RSRR_FO + +BO_ 1355 UUDT_Resp_From_FEOCM_FO: 8 EOCM_F_FO + SG_ DgnInf_OBJ54B : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 587 USDT_Req_to_FEOCM_obj: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2A_K2_FO,EOCM_F_FO + +BO_ 784 Body_Info_FOB: 6 EOCM_F_FO + SG_ StrgColUpDwnPos : 39|8@0+ (1,0) [0|255] "" DMS_FO + SG_ CPMAPINFO4 : 47|1@0+ (1,0) [0|1] "" DMS_FO + SG_ StrgColInOutPos : 31|8@0+ (1,0) [0|255] "" DMS_FO + SG_ StrgColCommsFlt : 19|2@0+ (1,0) [0|3] "" DMS_FO + SG_ DrDoorOpenSwActV : 16|1@0+ (1,0) [0|1] "" DMS_FO + SG_ DrDoorOpenSwAct : 17|1@0+ (1,0) [0|1] "" DMS_FO + SG_ DrvWndPosStat : 22|3@0+ (1,0) [0|7] "" CIPM_FO,DMS_FO,VIS2_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ InterLghtStat : 23|1@0+ (1,0) [0|1] "" CIPM_FO,DMS_FO,VIS2_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ DrvrHndsOnWhlZn3 : 13|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,DMS_FO,VIS2_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ DrvrHndsOnWhlZn2 : 14|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,VIS2_FO + SG_ DrvrHndsOnWhlZn1 : 15|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,VIS2_FO + SG_ WSWshSwAtv : 11|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,VIS_FO,VIS2_FO + SG_ SysPwrMdV : 8|1@0+ (1,0) [0|1] "" NVS_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO,LRSRR_FO,CIPM_FO,_DOFIMU2_FO,_DOFIMU1_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,VIS2_FO + SG_ SysPwrMd : 10|2@0+ (1,0) [0|3] "" NVS_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO,LRSRR_FO,CIPM_FO,_DOFIMU2_FO,_DOFIMU1_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,VIS2_FO + SG_ WSWprAct : 2|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO + SG_ RtLwBmFld : 4|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO + SG_ OtsdAmbtLtLvlStatV : 5|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO + SG_ OtsdAmbtLtLvlStat : 7|2@0+ (1,0) [0|3] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO + SG_ LowBmAct : 1|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO + SG_ LftLwBmFld : 3|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO + SG_ HighBmAct : 0|1@0+ (1,0) [0|1] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,DMS_FO,AMM_FO,NVS_FO,VIS_FO,VIS2_FO + SG_ TrStLgMdAtv : 12|1@0+ (1,0) [0|1] "" CIPM_FO,NVS_FO,RRSRR_FO,LRSRR_FO,_DOFIMU2_FO,_DOFIMU1_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,LRR_FO,RFSRR_FO,LFSRR_FO,RSRR_FO,VIS_FO,VIS2_FO + +BO_ 1539 RF_SRR_Trace_Data: 8 RFSRR_FO + SG_ RFSRRYear : 7|8@0+ (1,0) [0|0] "" EOCM_F_FO + SG_ RFSRRSerialNmbr : 39|32@0+ (1,0) [0|0] "" EOCM_F_FO + SG_ RFSRRJulianDate : 15|24@0+ (1,0) [0|0] "" EOCM_F_FO + +BO_ 776 F_Vehicle_Path_Data_2: 7 EOCM_F_FO + SG_ Vpath_Data2ModeInfo : 44|2@0+ (1,0) [0|3] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath2_Checksum : 42|11@0+ (1,0) [0|2047] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RFSRR_FO,LFSRR_FO,RSRR_FO,LRR_FO + SG_ Vpath_Data2RollCnt : 46|2@0+ (1,0) [0|3] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_Data2YawRateV : 2|1@0+ (1,0) [0|1] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,NVS_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_Data2LongVelV : 1|1@0+ (1,0) [0|1] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,NVS_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_Data2LatVelV : 47|1@0+ (1,0) [0|1] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_Data2TravlDirctn : 4|2@0+ (1,0) [0|3] "" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_Data2LongVel : 15|12@0- (0.0625,0) [-128|127.9375] "m/s" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,NVS_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_Data2YawRate : 19|12@0- (0.0625,0) [-128|127.9375] "deg/s" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,NVS_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_Data2LatVel : 39|8@0- (0.05,0) [-6.4|6.35] "m/s" CIPM_FO,DMS_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + +BO_ 161 F_Master_Time_Sync: 7 EOCM_F_FO + SG_ FTimeSyncMstrChksm : 35|12@0+ (1,0) [0|4095] "" AMM_FO,CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ FTimeSyncMstrClock : 7|32@0+ (1,0) [0|4294967295] "ms" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ SensorModeCmdLRR : 39|3@0+ (1,0) [0|7] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ SensorModeCmdSRR : 50|3@0+ (1,0) [0|7] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ SensorModeCmdFCamera : 53|3@0+ (1,0) [0|7] "" CIPM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ FTimeSyncMstrClockV : 36|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,LRR_FO,RFSRR_FO,LFSRR_FO + +BO_ 774 F_Vehicle_Path_Estimate: 8 EOCM_F_FO + SG_ Vpath_RollingCount : 7|2@0+ (1,0) [0|3] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_TrnCtrLngOfstV : 1|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,LRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LFSRR_FO + SG_ Vpath_Checksum : 50|11@0+ (1,0) [0|2047] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_TrnCtrLngOfst : 15|8@0- (0.1,0) [-12.8|12.7] "m" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,LRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LFSRR_FO + SG_ Vpath_TrnCtrLatOfst : 21|14@0- (1,0) [-8192|8191] "m" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,LRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LFSRR_FO + SG_ Vpath_Curvature : 39|16@0- (1E-005,0) [-0.32768|0.32767] "1/m" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,RSRR_FO,RFSRR_FO,LRR_FO,LFSRR_FO + SG_ Vpath_CurvatureV : 0|1@0+ (1,0) [0|1] "" CIPM_FO,AMM_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,VIS2_FO,RRSRR_FO,VIS_FO,LRR_FO,RSRR_FO,RFSRR_FO,LFSRR_FO + +BO_ 848 F_Vision_Environment: 8 VIS_FO + SG_ FwdVsnEnvIllum : 37|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTngtOfHdngLnRtV : 1|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTngtOfHdngLnRt : 31|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnChngStatus : 39|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseRollingCount : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseSystemOK : 4|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSnsLLnPosValid : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSenseDistToLLnEdge : 14|7@0+ (0.05,0) [0|6.35] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsRLnPosValid : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsDistToRLnEdge : 22|7@0+ (0.05,0) [0|6.35] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseTimeStampV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseTimeStamp : 34|11@0+ (1,0) [0|2047] "ms" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseSystemOKV : 3|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 849 F_Vision_Environment_2: 8 VIS_FO + SG_ LnSnsLatVRelToRgtMrkg : 23|8@0- (0.02,0) [-2.56|2.54] "m/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ LnSnsRtLnMrkgTypChgDst : 61|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsCrvtGrdntRtV : 63|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnMrkgWdthRt : 62|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsRtAnchrLn : 57|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLtAnchrLn : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnCrvtrRghtV : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnCrvtrRght : 47|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsCrvtGrdntRt : 31|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/rad/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBurstID : 2|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLatVRelToLftMrkg : 15|8@0- (0.02,0) [-2.56|2.54] "m/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 1184 R_SRR_Object_Header: 8 RSRR_FO + SG_ RSRRNumValidTargets : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ RSrrRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSRRModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTimeStampV : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSrrTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO + SG_ RSrrBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO + SG_ RSRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRMsalgnRllRt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRMsalgnRllLt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRCANIDAddrsUnsbl : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RSRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1185 R_SRR_Object_Track1: 8 RSRR_FO + SG_ RSrrBurstID1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange1 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate1 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth1 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID1 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation1 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp1 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange1 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth1 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1186 R_SRR_Object_Track2: 8 RSRR_FO + SG_ RSrrBurstID2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange2 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate2 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth2 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID2 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation2 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp2 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange2 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth2 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1187 R_SRR_Object_Track3: 8 RSRR_FO + SG_ RSrrBurstID3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange3 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate3 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth3 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID3 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation3 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp3 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange3 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth3 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1188 R_SRR_Object_Track4: 8 RSRR_FO + SG_ RSrrBurstID4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange4 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate4 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth4 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID4 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation4 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp4 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange4 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth4 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1189 R_SRR_Object_Track5: 8 RSRR_FO + SG_ RSrrBurstID5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange5 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate5 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth5 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID5 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation5 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp5 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange5 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth5 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1190 R_SRR_Object_Track6: 8 RSRR_FO + SG_ RSrrBurstID6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange6 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate6 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth6 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID6 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation6 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp6 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange6 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth6 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1191 R_SRR_Object_Track7: 8 RSRR_FO + SG_ RSrrBurstID7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange7 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate7 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth7 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID7 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation7 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp7 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange7 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth7 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1192 R_SRR_Object_Track8: 8 RSRR_FO + SG_ RSrrBurstID8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange8 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate8 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth8 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID8 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation8 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp8 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange8 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth8 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1193 R_SRR_Object_Track9: 8 RSRR_FO + SG_ RSrrBurstID9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange9 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate9 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth9 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID9 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation9 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp9 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange9 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth9 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1194 R_SRR_Object_Track10: 8 RSRR_FO + SG_ RSrrBurstID10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkRange10 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RSrrTrkRRate10 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RSrrTrkAzimuth10 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RSrrTrkObjID10 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RSrrTrkObjElevation10 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkDynamProp10 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RSrrTrkMeasStatus10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RSrrTrkObsRange10 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RSrrTrkRawAzimuth10 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1410 RVB_TVR_Debug: 6 EOCM_F_FO + SG_ VBBrkRqActv : 7|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ PATOSTTC : 37|12@0+ (0.025,0) [0|102.375] "s" Dummy_FO + SG_ BWTOSObjID : 27|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ BWTOSLonPstn : 23|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ VBSwInd : 10|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ VBBrkCtrlSt : 15|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ BrkPlsRqst : 6|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VBOpSt : 12|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ VBAccelOvrrd : 0|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VBUnavail : 1|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VBFld : 2|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VBDisbld : 3|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VBEnbl : 4|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VBBrkPrfReq : 5|1@0+ (1,0) [0|1] "" Dummy_FO + +BO_ 1216 LF_SRR_Object_Header: 8 LFSRR_FO + SG_ LFSRRNumValidTargets : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ LFSrrRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSRRModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTimeStampV : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSrrTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO + SG_ LFSrrBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO + SG_ LFSRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRMsalgnRllRt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRMsalgnRllLt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRCANIDAddrsUnsbl : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ LFSRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1217 LF_SRR_Object_Track1: 8 LFSRR_FO + SG_ LFSrrBurstID1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange1 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate1 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth1 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID1 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation1 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp1 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkObsRange1 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth1 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1218 LF_SRR_Object_Track2: 8 LFSRR_FO + SG_ LFSrrBurstID2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange2 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate2 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth2 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID2 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation2 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp2 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkObsRange2 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth2 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1219 LF_SRR_Object_Track3: 8 LFSRR_FO + SG_ LFSrrBurstID3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange3 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate3 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth3 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID3 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation3 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp3 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkObsRange3 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth3 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1220 LF_SRR_Object_Track4: 8 LFSRR_FO + SG_ LFSrrBurstID4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange4 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate4 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkObsRange4 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrTrkAzimuth4 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID4 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation4 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp4 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth4 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1221 LF_SRR_Object_Track5: 8 LFSRR_FO + SG_ LFSrrTrkObsRange5 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrBurstID5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange5 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate5 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth5 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID5 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation5 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp5 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth5 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1222 LF_SRR_Object_Track6: 8 LFSRR_FO + SG_ LFSrrTrkObsRange6 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrBurstID6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange6 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate6 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth6 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID6 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation6 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp6 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth6 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1223 LF_SRR_Object_Track7: 8 LFSRR_FO + SG_ LFSrrTrkObsRange7 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrBurstID7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange7 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate7 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth7 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID7 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation7 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp7 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth7 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1224 LF_SRR_Object_Track8: 8 LFSRR_FO + SG_ LFSrrTrkObsRange8 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrBurstID8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange8 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate8 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth8 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID8 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation8 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp8 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth8 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1225 LF_SRR_Object_Track9: 8 LFSRR_FO + SG_ LFSrrTrkObsRange9 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrBurstID9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange9 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate9 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth9 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID9 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation9 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp9 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth9 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1226 LF_SRR_Object_Track10: 8 LFSRR_FO + SG_ LFSrrTrkObsRange10 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ LFSrrBurstID10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRange10 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ LFSrrTrkRRate10 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ LFSrrTrkAzimuth10 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ LFSrrTrkObjID10 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ LFSrrTrkObjElevation10 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkDynamProp10 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ LFSrrTrkMeasStatus10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ LFSrrTrkRawAzimuth10 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + +BO_ 1232 RF_SRR_Object_Header: 8 RFSRR_FO + SG_ RFSRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRMsalgnRllRt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRMsalgnRllLt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRCANIDAddrsUnsbl : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RFSRRNumValidTargets : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ RFSrrRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSRRModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO + SG_ RFSrrBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO + SG_ RFSrrTimeStampV : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1233 RF_SRR_Object_Track1: 8 RFSRR_FO + SG_ RFSrrTrkObsRange1 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth1 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange1 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate1 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth1 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID1 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation1 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp1 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1234 RF_SRR_Object_Track2: 8 RFSRR_FO + SG_ RFSrrTrkObsRange2 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth2 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange2 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate2 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth2 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID2 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation2 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp2 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1235 RF_SRR_Object_Track3: 8 RFSRR_FO + SG_ RFSrrTrkObsRange3 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth3 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange3 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate3 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth3 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID3 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation3 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp3 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1236 RF_SRR_Object_Track4: 8 RFSRR_FO + SG_ RFSrrTrkObsRange4 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth4 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange4 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate4 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth4 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID4 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation4 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp4 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1237 RF_SRR_Object_Track5: 8 RFSRR_FO + SG_ RFSrrTrkObsRange5 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth5 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange5 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate5 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth5 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID5 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation5 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp5 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1238 RF_SRR_Object_Track6: 8 RFSRR_FO + SG_ RFSrrTrkObsRange6 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth6 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange6 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate6 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth6 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID6 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation6 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp6 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1239 RF_SRR_Object_Track7: 8 RFSRR_FO + SG_ RFSrrTrkObsRange7 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth7 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange7 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate7 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth7 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID7 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation7 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp7 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1240 RF_SRR_Object_Track8: 8 RFSRR_FO + SG_ RFSrrTrkObsRange8 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth8 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange8 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate8 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth8 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID8 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation8 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp8 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1241 RF_SRR_Object_Track9: 8 RFSRR_FO + SG_ RFSrrTrkObsRange9 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth9 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange9 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate9 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth9 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID9 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation9 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp9 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1242 RF_SRR_Object_Track10: 8 RFSRR_FO + SG_ RFSrrTrkObsRange10 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RFSrrTrkRawAzimuth10 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RFSrrBurstID10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkRange10 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RFSrrTrkRRate10 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RFSrrTrkAzimuth10 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RFSrrTrkObjID10 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RFSrrTrkObjElevation10 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RFSrrTrkDynamProp10 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RFSrrTrkMeasStatus10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1056 F_Vision_Obj_Header: 6 VIS_FO + SG_ FVsnSnsrBlckd : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ ClstInPathVehObjID : 30|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FrtVsnFld : 6|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnIniDiagSuccCmpt : 5|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnSrvAlgnInPrcs : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnUnvlbl : 7|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisionRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVISModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FVisionNumValidTrgts : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FVisionTimeStampV : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisionTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO + SG_ VISBurstChecksum : 39|16@0+ (1,0) [0|65535] "" EOCM_F_FO + +BO_ 1057 F_Vision_Obj_Track_1: 8 VIS_FO + SG_ FwdVsnRngTrk1Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk1Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr1Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnVertPosTrk1 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FVisBurstIDTrk1 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk1 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk1 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk1 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk1 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ ObjDirTrk1 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1058 F_Vision_Obj_Track_2: 8 VIS_FO + SG_ FwdVsnVertPosTrk2 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk2Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk2Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ ObjDirTrk2 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FwdVsnObjTypTr2Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FVisBurstIDTrk2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk2 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk2 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk2 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk2 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1059 F_Vision_Obj_Track_3: 8 VIS_FO + SG_ FwdVsnVertPosTrk3 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk3Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk3Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr3Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk3 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk3 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk3 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk3 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk3 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk3 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1060 F_Vision_Obj_Track_4: 8 VIS_FO + SG_ FwdVsnVertPosTrk4 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FVisionMeasStatTrk4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk4 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FwdVsnRngTrk4Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk4Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr4Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FVisBurstIDTrk4 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk4 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ ObjDirTrk4 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisionConfTrk4 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk4 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1061 F_Vision_Obj_Track_5: 8 VIS_FO + SG_ FwdVsnVertPosTrk5 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk5Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk5Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr5Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk5 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk5 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk5 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk5 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk5 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk5 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1062 F_Vision_Obj_Track_6: 8 VIS_FO + SG_ FwdVsnVertPosTrk6 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk6Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk6Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr6Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk6 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk6 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk6 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk6 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk6 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk6 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1538 LF_SRR_Trace_Data: 8 LFSRR_FO + SG_ LFSRRYear : 7|8@0+ (1,0) [0|0] "" EOCM_F_FO + SG_ LFSRRSerialNmbr : 39|32@0+ (1,0) [0|0] "" EOCM_F_FO + SG_ LFSRRJulianDate : 15|24@0+ (1,0) [0|0] "" EOCM_F_FO + +BO_ 1537 R_SRR_Trace_data: 8 RSRR_FO + SG_ RSRRYear : 7|8@0+ (1,0) [0|0] "" EOCM_F_FO + SG_ RSRRSerialNmbr : 39|32@0+ (1,0) [0|0] "" EOCM_F_FO + SG_ RSRRJulianDate : 15|24@0+ (1,0) [0|0] "" EOCM_F_FO + +BO_ 1089 F_Vision_Obj_Track_7: 8 VIS2_FO + SG_ FVisBurstIDTrk7 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk7 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk7 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk7 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk7 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FwdVsnRngTrk7Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnObjTypTr7Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnAzmthTrk7Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnVertPosTrk7 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ ObjDirTrk7 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1090 F_Vision_Obj_Track_8: 8 VIS2_FO + SG_ FVisBurstIDTrk8 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk8 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FwdVsnAzmthTrk8Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnVertPosTrk8 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk8Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnObjTypTr8Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk8 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisionConfTrk8 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk8 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk8 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1091 F_Vision_Obj_Track_9: 8 VIS2_FO + SG_ FwdVsnVertPosTrk9 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk9Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk9Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr9Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk9 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk9 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk9 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk9 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk9 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk9 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1092 F_Vision_Obj_Track_10: 8 VIS2_FO + SG_ FwdVsnRngTrk10Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk10Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr10Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnVertPosTrk10 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ ObjDirTrk10 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk10 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk10 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk10 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk10 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk10 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1120 F_LRR_Obj_Header: 8 LRR_FO + SG_ FLRRRollingCount : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRModeCmdFdbk : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRNumValidTargets : 20|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ FLRRTimeStampV : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRTimeStamp : 2|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO + SG_ FLRRRoadTypeInfo : 5|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO + SG_ FLRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRLonVelPlsblityFlt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRYawRtPlsblityFlt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRTunlDtctd : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1121 F_LRR_Obj_Track_1: 8 LRR_FO + SG_ FLRRTrk1BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk1Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk1RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk1RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk1DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk1Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk1Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk1MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk1ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FLRRTrk1Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1122 F_LRR_Obj_Track_2: 8 LRR_FO + SG_ FLRRTrk2BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk2Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk2RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk2RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk2DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk2Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk2Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk2MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk2ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FLRRTrk2Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1123 F_LRR_Obj_Track_3: 8 LRR_FO + SG_ FLRRTrk3BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk3Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk3RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk3RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk3DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk3Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk3Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk3MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk3ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FLRRTrk3Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1124 F_LRR_Obj_Track_4: 8 LRR_FO + SG_ FLRRTrk4BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk4Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk4RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk4RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk4DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk4Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk4Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk4MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk4ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FLRRTrk4Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1125 F_LRR_Obj_Track_5: 8 LRR_FO + SG_ FLRRTrk5BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk5Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk5RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk5RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk5DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk5Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk5Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk5MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk5ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FLRRTrk5Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1126 F_LRR_Obj_Track_6: 8 LRR_FO + SG_ FLRRTrk6BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk6Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk6RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk6Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk6RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk6DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk6Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk6Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk6MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk6ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1127 F_LRR_Obj_Track_7: 8 LRR_FO + SG_ FLRRTrk7Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk7BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk7Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk7RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk7RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk7DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk7Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk7Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk7MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk7ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1128 F_LRR_Obj_Track_8: 8 LRR_FO + SG_ FLRRTrk8Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk8BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk8Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk8RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk8RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk8DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk8Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk8Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk8MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk8ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1129 F_LRR_Obj_Track_9: 8 LRR_FO + SG_ FLRRTrk9Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk9BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk9Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk9RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk9RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk9DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk9Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk9Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk9MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk9ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1130 F_LRR_Obj_Track_10: 8 LRR_FO + SG_ FLRRTrk10Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk10BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk10Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk10RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk10RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk10DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk10Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk10Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk10MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk10ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1131 F_LRR_Obj_Track_11: 8 LRR_FO + SG_ FLRRTrk11Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk11BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk11Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk11RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk11RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk11DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk11Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk11Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk11MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk11ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1132 F_LRR_Obj_Track_12: 8 LRR_FO + SG_ FLRRTrk12Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk12BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk12Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk12RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk12RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk12DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk12Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk12Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk12MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk12ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1133 F_LRR_Obj_Track_13: 8 LRR_FO + SG_ FLRRTrk13Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk13BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk13Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk13RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk13RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk13DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk13Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk13Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk13MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk13ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1134 F_LRR_Obj_Track_14: 8 LRR_FO + SG_ FLRRTrk14Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk14BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk14Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk14RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk14RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk14DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk14Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk14Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk14MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk14ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1135 F_LRR_Obj_Track_15: 8 LRR_FO + SG_ FLRRTrk15Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk15MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk15Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk15ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FLRRTrk15BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk15Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk15RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk15RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk15DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk15Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + +BO_ 1136 F_LRR_Obj_Track_16: 8 LRR_FO + SG_ FLRRTrk16Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk16BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk16Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk16RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk16RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk16DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk16Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk16Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk16MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk16ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1137 F_LRR_Obj_Track_17: 8 LRR_FO + SG_ FLRRTrk17Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk17BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk17Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk17RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk17RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk17DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk17Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk17Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk17MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk17ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1138 F_LRR_Obj_Track_18: 8 LRR_FO + SG_ FLRRTrk18Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk18BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk18Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk18RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk18RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk18DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk18Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk18Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk18MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk18ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1139 F_LRR_Obj_Track_19: 8 LRR_FO + SG_ FLRRTrk19Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk19BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk19Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk19RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk19RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk19DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk19Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk19Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk19MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk19ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1140 F_LRR_Obj_Track_20: 8 LRR_FO + SG_ FLRRTrk20Conf : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk20BurstID : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk20Range : 5|11@0+ (0.125,0) [0|255.875] "m" EOCM_F_FO + SG_ FLRRTrk20RangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ FLRRTrk20RangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" EOCM_F_FO + SG_ FLRRTrk20DynProp : 38|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk20Azimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" EOCM_F_FO + SG_ FLRRTrk20Width : 55|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FLRRTrk20MeasStatus : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk20ObjectID : 61|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1141 Long_Range_Radar_add_Info_1: 8 LRR_FO + SG_ FLRRAddInfo1BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ Cut_In_Out_Pot_Objtrk1 : 15|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO + SG_ ObjLossInfoObjTrk1 : 9|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ Cut_In_Out_Pot_Objtrk2 : 23|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO + SG_ ObjLossInfoObjTrk2 : 17|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ Cut_In_Out_Pot_Objtrk3 : 31|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO + SG_ ObjLossInfoObjTrk3 : 25|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ Cut_In_Out_Pot_Objtrk4 : 39|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO + SG_ ObjLossInfoObjTrk4 : 33|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ Cut_In_Out_Pot_Objtrk5 : 47|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO + SG_ ObjLossInfoObjTrk5 : 41|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ Cut_In_Out_Pot_Objtrk6 : 55|6@0+ (0.02,0) [0|1.26] "" EOCM_F_FO + SG_ ObjLossInfoObjTrk6 : 49|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1321 F_Fwd_Fus_Obj_TrackB_9: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn9 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB9RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB9Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB9MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB9DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB9RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB9RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB9Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB9ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB9ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB9ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB9ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB9ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB9ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB9NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB9LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB9LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1320 F_Fwd_Fus_Obj_TrackB_8: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn8 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB8RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB8Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB8MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB8DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB8RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB8RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB8Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB8ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB8ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB8ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB8ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB8ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB8ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB8NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB8LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB8LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1319 F_Fwd_Fus_Obj_TrackB_7: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn7 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB7RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB7Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB7MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB7DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB7RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB7RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB7Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB7ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB7ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB7ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB7ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB7ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB7ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB7NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB7LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB7LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1318 F_Fwd_Fus_Obj_TrackB_6: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn6 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB6RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB6Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB6MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB6DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB6RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB6RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB6Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB6ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB6ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB6ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB6ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB6ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB6ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB6NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB6LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB6LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1317 F_Fwd_Fus_Obj_TrackB_5: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn5 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB5RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB5Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB5MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB5DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB5RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB5RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB5Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB5ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB5ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB5ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB5ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB5ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB5ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB5NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB5LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB5LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1316 F_Fwd_Fus_Obj_TrackB_4: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn4 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB4RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB4Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB4MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB4DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB4RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB4RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB4Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB4ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB4ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB4ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB4ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB4ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB4ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB4NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB4LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB4LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1315 F_Fwd_Fus_Obj_TrackB_3: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn3 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB3RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB3Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB3MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB3DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB3RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB3RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB3Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB3ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB3ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB3ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB3ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB3ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB3ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB3NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB3LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB3LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1314 F_Fwd_Fus_Obj_TrackB_2: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn2 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB2RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB2Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB2MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB2DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB2RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB2RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB2Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB2ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB2ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB2ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB2ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB2ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB2ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB2NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB2LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB2LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1327 F_Fwd_Fus_Obj_TrackB_15: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn15 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB15RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB15Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB15MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB15DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB15RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB15RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB15Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB15ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB15ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB15ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB15ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTkB15ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB15ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB15NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB15LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB15LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1326 F_Fwd_Fus_Obj_TrackB_14: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn14 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB14RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB14Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB14MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB14DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB14RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB14RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB14Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB14ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB14ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB14ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB14ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB14ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB14ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB14NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB14LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB14LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1325 F_Fwd_Fus_Obj_TrackB_13: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn13 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB13RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB13Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB13MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB13DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB13RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB13RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB13Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB13ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB13ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB13ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB13ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB13ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB13ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB13NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB13LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB13LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1324 F_Fwd_Fus_Obj_TrackB_12: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn12 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB12RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB12Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB12MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB12DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB12RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB12RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB12Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB12ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB12ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB12ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB12ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB12ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB12ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB12NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB12LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB12LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1323 F_Fwd_Fus_Obj_TrackB_11: 7 EOCM_F_FO + SG_ FwdFusTrkB11DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB11RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB11RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB11Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB11ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB11ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB11ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB11ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB11ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB11ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB11NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB11LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB11LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkBAnlgRlLn11 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB11RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB11Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB11MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + +BO_ 1322 F_Fwd_Fus_Obj_TrackB_10: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn10 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB10RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB10Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB10MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB10DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB10RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB10RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB10Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB10ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB10ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB10ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB10ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB10ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB10ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB10NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB10LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB10LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1313 F_Fwd_Fus_Obj_TrackB_1: 7 EOCM_F_FO + SG_ FwdFusTrkBAnlgRlLn1 : 46|8@0- (0.1,0) [-12.8|12.7] "" Dummy_FO + SG_ FwdFusTrkB1RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB1Width : 5|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FwdFusTrkB1MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkB1DynProp : 11|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB1RelLnAccl : 8|9@0- (0.125,0) [-32|31.875] "m/s^2" Dummy_FO + SG_ FwdFusTrkB1RelLane : 31|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkB1Height : 54|6@0+ (0.25,0) [0|15.75] "m" Dummy_FO + SG_ FFusTrkB1ObjSrcLFSrr : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB1ObjSrcLCSrr : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB1ObjSrcRCSrr : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB1ObjSrcRFSrr : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FFusTrkB1ObjSrcVIs : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB1ObjSrcLrr : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FwdFusTrkB1NmCycTrkd : 39|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB1LatPosDev : 36|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkB1LngPosDev : 33|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1305 F_Fwd_Fus_Obj_TrackA_9: 8 EOCM_F_FO + SG_ FwdFusTrkA9RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA9ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA9MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA9LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA9RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA9Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA9LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA9RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA9MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA9ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1304 F_Fwd_Fus_Obj_TrackA_8: 8 EOCM_F_FO + SG_ FwdFusTrkA8RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA8ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA8MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA8LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA8RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA8Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA8LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA8RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA8MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA8ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1303 F_Fwd_Fus_Obj_TrackA_7: 8 EOCM_F_FO + SG_ FwdFusTrkA7RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA7ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA7MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA7LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA7RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA7Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA7LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA7RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA7MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA7ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1302 F_Fwd_Fus_Obj_TrackA_6: 8 EOCM_F_FO + SG_ FwdFusTrkA6RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA6ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA6MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA6LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA6RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA6Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA6LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA6RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA6MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA6ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1301 F_Fwd_Fus_Obj_TrackA_5: 8 EOCM_F_FO + SG_ FwdFusTrkA5RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA5ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA5MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA5LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA5RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA5Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA5LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA5RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA5MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA5ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1300 F_Fwd_Fus_Obj_TrackA_4: 8 EOCM_F_FO + SG_ FwdFusTrkA4RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA4ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA4MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA4LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA4RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA4Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA4LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA4RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA4MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA4ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1299 F_Fwd_Fus_Obj_TrackA_3: 8 EOCM_F_FO + SG_ FwdFusTrkA3RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA3ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA3MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA3LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA3RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA3Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA3LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA3RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA3MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA3ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1298 F_Fwd_Fus_Obj_TrackA_2: 8 EOCM_F_FO + SG_ FwdFusTrkA2RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA2ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA2MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA2LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA2RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA2Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA2LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA2RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA2MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA2ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1311 F_Fwd_Fus_Obj_TrackA_15: 8 EOCM_F_FO + SG_ FwdFusTrkA15RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA15ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA15MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA15LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA15RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA15Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA15LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA15RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA15MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA15ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1310 F_Fwd_Fus_Obj_TrackA_14: 8 EOCM_F_FO + SG_ FwdFusTrkA14RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA14ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA14MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA14LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA14RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA14Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA14LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA14RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA14MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA14ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1309 F_Fwd_Fus_Obj_TrackA_13: 8 EOCM_F_FO + SG_ FwdFusTrkA13RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA13ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA13MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA13LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA13RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA13Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA13LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA13RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA13MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA13ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1308 F_Fwd_Fus_Obj_TrackA_12: 8 EOCM_F_FO + SG_ FwdFusTrkA12RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA12ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA12MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA12LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA12RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA12Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA12LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA12RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA12MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA12ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1307 F_Fwd_Fus_Obj_TrackA_11: 8 EOCM_F_FO + SG_ FwdFusTrkA11ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA11MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA11LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA11RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA11Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA11LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA11RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA11MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA11ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + SG_ FwdFusTrkA11RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + +BO_ 1306 F_Fwd_Fus_Obj_TrackA_10: 8 EOCM_F_FO + SG_ FwdFusTrkA10RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA10ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA10MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA10LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA10RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA10Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA10LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA10RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA10MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA10ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1297 F_Fwd_Fus_Obj_TrackA_1: 8 EOCM_F_FO + SG_ FwdFusTrkA1RollingCnt : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA1ObjectID : 5|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ FwdFusTrkA1MsgIndex : 15|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ FwdFusTrkA1LongPos : 11|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + SG_ FwdFusTrkA1RelLongVel : 31|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA1Confidence : 36|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA1LatPos : 34|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ FwdFusTrkA1RelLatVel : 55|11@0- (0.125,0) [-128|127.875] "m/s" Dummy_FO + SG_ FwdFusTrkA1MeasStatus : 60|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ FwdFusTrkA1ObjType : 58|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 1296 F_Fwd_Fus_Obj_Header: 7 EOCM_F_FO + SG_ F_FusHeadRollingCount : 7|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ F_FusHeadFuncState : 5|2@0+ (1,0) [0|3] "" Dummy_FO + SG_ F_FusHedNmValTargts : 3|4@0+ (1,0) [0|15] "" Dummy_FO + SG_ F_FusHead_LrrOK : 15|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ F_FusHead_LFSRROK : 14|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ F_FusHead_VIsOK : 13|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ F_FusHead_MapDataOK : 12|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ F_FusHeadTimStmpV : 11|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ F_FusHeadTimStmp : 10|11@0+ (1,0) [0|2047] "ms" Dummy_FO + SG_ F_FusHead_LCSRROK : 31|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ F_FusHead_RCSRROK : 30|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ F_FusHead_RFSRROK : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ F_FusHed_ObjClstrCurv : 28|13@0- (5E-005,0) [-0.2048|0.20475] "1/m" Dummy_FO + SG_ F_FusHdObjClstTanHdng : 47|8@0- (0.002,0) [-0.256|0.254] "m/m" Dummy_FO + SG_ RoadTypeInfo : 55|3@0+ (1,0) [0|7] "" Dummy_FO + +BO_ 257 USDT_Req_to_All_FO_ECUs: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LRSRR_FO,_DOFIMU2_FO,_DOFIMU1_FO,DMS_FO,AMM_FO,EOCM2A_K2_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM2A_IMX6_FO,EOCM2A_K1_FO,NVS_FO,CIPM_FO,VIS2_FO,RRSRR_FO,VIS_FO,RFSRR_FO,LRR_FO,LFSRR_FO,RSRR_FO,EOCM_F_FO + +BO_ 584 USDT_Req_to_6DOFIMU2_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" _DOFIMU2_FO + +BO_ 1348 UUDT_Resp_From_6DOFIMU1_FO: 8 _DOFIMU1_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1604 USDT_Resp_From_6DOFIMU1_FO: 8 _DOFIMU1_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 580 USDT_Req_to_6DOFIMU1_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" _DOFIMU1_FO + +BO_ 1349 UUDT_Resp_From_DMS_FO: 8 DMS_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1605 USDT_Resp_From_DMS_FO: 8 DMS_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 581 USDT_Req_to_DMS_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" DMS_FO + +BO_ 1372 UUDT_Resp_From_AMM_FO: 8 AMM_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1628 USDT_Resp_From_AMM_FO: 8 AMM_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 604 USDT_Req_to_AMM_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" AMM_FO + +BO_ 1622 USDT_Resp_From_EOCM2B_IMX6_FO: 8 EOCM2B_IMX6_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 1366 UUDT_Resp_From_EOCM2B_IMX6_FO: 8 EOCM2B_IMX6_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" TestTool_FO + +BO_ 598 USDT_Req_to_EOCM2B_IMX6_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" EOCM2B_IMX6_FO + +BO_ 590 USDT_Req_to_Free_4E_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" Vector__XXX + +BO_ 1338 VPDR_Debug: 8 EOCM_F_FO + SG_ FrtRWARateDiagFA : 43|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FrtRWABiasDiagFA : 42|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ HWAFrtVal : 41|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ HWADotValFrt : 40|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehAxRangeFA : 39|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehAxRateFA : 38|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehAxBiasFA : 37|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehAxCompFA : 36|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehAxVal : 35|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehAxVal : 34|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FrtRWACorrFA : 33|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FrtRWARangeDiagFA : 32|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehAyBiasFA : 31|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehAyCompFA : 30|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehAyVal : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehAyVal : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehAxCorrFA : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehAxRangeFA : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehAxRateFA : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehAxBiasFA : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehWzVal : 23|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehWzVal : 22|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehAyCorrDiagFA : 21|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehAyRangeFA : 20|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehAyRateFA : 19|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehAyBiasFA : 18|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehAyRangeFA : 17|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehAyRateFA : 16|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehWzCorrDiagFA : 15|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehWzRangeFA : 14|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehWzRateFA : 13|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S1VehWzBiasFA : 12|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehWzRangeFA : 11|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehWzRateFA : 10|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ S2VehWzBiasFA : 9|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehWzCompFA : 8|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ WhlVxLFCorrDiagFA : 7|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ WhlVxRFCorrDiagFA : 6|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ WhlVxLRCorrDiagFA : 5|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ WhlVxRRCorrDiagFA : 4|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ WhlLFVal : 3|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ WhlRFVal : 2|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ WhlLRVal : 1|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ WhlRRVal : 0|1@0+ (1,0) [0|1] "" Dummy_FO + +BO_ 1328 Diag_Debug1: 8 EOCM_F_FO + SG_ AlrtWrnIndReqFP : 1|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AlrtWrnIndReqFA : 0|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILRSRRSnsr_FP : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILRSRRSnsr_FA : 23|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILRSRRFrehns_FA : 22|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehPathEstCrvCSFP : 21|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehPathEstCrvCSFA : 20|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehPathWzEstCSFP : 19|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehPathWzEstCSFA : 18|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehPathVyEstCSFP : 17|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehPathVyEstCSFA : 16|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehPathVxEstCSFP : 15|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VehPathVxEstCSFA : 14|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTTCCSFP : 13|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTTCCSFA : 12|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLyCSFP : 11|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLyCSFA : 10|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThLxVxAxCSFP : 9|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThLxVxAxCSFA : 8|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ CurSetValDiagFP : 7|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ CurSetValDiagFA : 6|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ CrsAltDvrSlTpDiagFP : 5|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ CrsAltDvrSlTpDiagFA : 4|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FCAStatDiagFP : 3|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FCAStatDiagFA : 2|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ RVBBrkCtrlStFP : 62|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ RVBBrkCtrlStFA : 61|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ RVBOpStFP : 60|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ RVBOpStFA : 59|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ RVBBrkCtrlAccFP : 58|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ RVBBrkCtrlAccFA : 57|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ RVBAxlTrqRqFP : 56|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ RVBAxlTrqRqFA : 55|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRUPATTCFP : 54|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRUPATTCFA : 53|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRHiThrtObjIDFP : 52|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRHiThrtObjIDFA : 51|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRHiThrtTTCFP : 50|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRHiThrtTTCFA : 49|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRHiThrtLxFP : 48|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRHiThrtLxFA : 47|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRHiThrtLyFP : 46|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TVRHiThrtLyFA : 45|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFFuncStFP : 44|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFFuncStFA : 43|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFObjIDFP : 42|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFObjIDFA : 41|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFLatPstnVelRatFP : 40|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFLatPstnVelRatFA : 39|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFLonPstnVelFP : 38|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFLonPstnVelFA : 37|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFRltvLatVelDiagFP : 36|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFRltvLatVelDiagFA : 35|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFRltvLatPstnDiagFP : 34|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFRltvLatPstnDiagFA : 33|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFNrRltvLonPstnFP : 32|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFNrRltvLonPstnFA : 31|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFLonPstnVelRatFP : 30|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFLonPstnVelRatFA : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFConfDiagFP : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFConfDiagFA : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFRltvLnDiagFP : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ROFRltvLnDiagFA : 25|1@0+ (1,0) [0|1] "" Dummy_FO + +BO_ 1335 Diag_Debug3: 8 EOCM_F_FO + SG_ BrkSysCmdAxDiagFPQ : 63|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ BrkSysCmdAxDiagFAQ : 62|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AxleTorqReqDiagFPQ : 61|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AxleTorqReqDiagFAQ : 60|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AutoBrkTypeDiagFPQ : 59|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AutoBrkTypeDiagFAQ : 58|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTTCFPQ : 57|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTTCFAQ : 56|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTmpMemFPQ : 55|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTmpMemFAQ : 54|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLxVxAxFPQ : 53|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLxVxAxFAQ : 52|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtVyFPQ : 51|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtVyFAQ : 50|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLyFPQ : 49|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLyFAQ : 48|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtConPriFPQ : 47|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtConPriFAQ : 46|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtCJLFPQ : 45|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtCJLFAQ : 44|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPDynPropDiagFPQ : 43|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPDynPropDiagFAQ : 42|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFRdTypInfoFPQ : 41|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFRdTypInfoFAQ : 40|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFRltvLnDiagFPQ : 39|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFRltvLnDiagFAQ : 38|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNumCycDiagFPQ : 37|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNumCycDiagFAQ : 36|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNumFusCyclsFPQ : 35|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNumFusCyclsFAQ : 34|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNrRltvLonPstnFPQ : 33|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNrRltvLonPstnFAQ : 32|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonVelAccRatFPQ : 31|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonVelAccRatFAQ : 30|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonPstnVelRatFPQ : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonPstnVelRatFAQ : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonPosVelAccFPQ : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonPosVelAccFAQ : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLatVelDiagFPQ : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLatVelDiagFAQ : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLatPstnDiagFPQ : 23|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLatPstnDiagFAQ : 22|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFConfDiagFPQ : 21|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFConfDiagFAQ : 20|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFOvrlpRtlChk_FAQ : 19|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFOvrlpRtlChk_FAQ : 18|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRROvrlpRtlChk_FAQ : 17|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISOvrlpRtlChk_FAQ : 16|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISAlign_FAQ : 15|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISSnsr_FAQ : 14|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISSnsr_FPQ : 13|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISFrshns_FAQ : 12|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRRAlign_FAQ : 11|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRRFrshns_FAQ : 10|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRRSnsr_FAQ : 9|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRRSnsr_FPQ : 8|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFSRRAlign_FAQ : 7|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFSRRFrehns_FAQ : 6|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFSRRSnsr_FAQ : 5|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFSRRSnsr_FPQ : 4|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFSRRSnsr_FPQ : 3|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFSRRSnsr_FAQ : 2|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFSRRFrshns_FAQ : 1|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFSRRAlign_FAQ : 0|1@0+ (1,0) [0|1] "" Dummy_FO + +BO_ 1331 Diag_Debug2: 8 EOCM_F_FO + SG_ TCPHiThrtTmpMemFP : 63|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTmpMemFA : 62|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtConPriFP : 61|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtConPriFA : 60|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtCJLFP : 59|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTTCFP : 58|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtTTCFA : 57|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtVyFP : 56|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtVyFA : 55|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLyFP : 54|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLyFA : 53|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLxVxAxFP : 52|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtLxVxAxFA : 51|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFRdTypInfoFP : 50|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFRdTypInfoFA : 49|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AutoBrkTypeDiagFA : 48|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ BrkSysCmdAxDiagFP : 47|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ BrkSysCmdAxDiagFA : 46|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AxleTorqReqDiagFP : 45|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AxleTorqReqDiagFA : 44|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPDynPropDiagFP : 43|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPDynPropDiagFA : 42|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ TCPHiThrtCJLFA : 41|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNumFusCyclsFP : 40|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ AutoBrkTypeDiagFP : 39|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNumFusCyclsFA : 38|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLatVelDiagFP : 37|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLatVelDiagFA : 36|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLatPstnDiagFP : 35|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLatPstnDiagFA : 34|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNumCycDiagFP : 33|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNumCycDiagFA : 32|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFRltvLnDiagFP : 31|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFRltvLnDiagFA : 30|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFConfDiagFP : 29|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFConfDiagFA : 28|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonVelAccRatFP : 27|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonVelAccRatFA : 26|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonPstnVelRatFP : 25|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonPstnVelRatFA : 24|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNrRltvLonPstnFP : 23|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFNrRltvLonPstnFA : 22|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonPosVelAccFP : 21|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ FOFLonPosVelAccFA : 20|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISOvrlpRtlChk_FA : 19|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRROvrlpRtlChk_FA : 18|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFOvrlpRtlChk_FA : 17|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFOvrlpRtlChk_FA : 16|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISAlign_FA : 15|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISFrshns_FA : 14|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISSnsr_FP : 13|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ VISSnsr_FA : 12|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRRAlign_FA : 11|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRRFrshns_FA : 10|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRRSnsr_FP : 9|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ LRRSnsr_FA : 8|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFSRRAlign_FA : 7|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFSRRFrehns_FA : 6|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFSRRSnsr_FP : 5|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ IRFSRRSnsr_FA : 4|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFSRRAlign_FA : 3|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFSRRFrshns_FA : 2|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFSRRSnsr_FP : 1|1@0+ (1,0) [0|1] "" Dummy_FO + SG_ ILFSRRSnsr_FA : 0|1@0+ (1,0) [0|1] "" Dummy_FO + +BO_ 1787 AL_Test_Tool_Rsp_RFSRR: 8 RFSRR_FO + SG_ RFSRREngRspDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" Dummy_FO + +BO_ 1788 AL_Test_Tool_Rsp_LFSRR: 8 LFSRR_FO + SG_ LFSRREngRspDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" Dummy_FO + +BO_ 1790 AL_Test_Tool_Req_RFSRR: 8 Dummy_FO + SG_ RFSRREngCmdDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RFSRR_FO + +BO_ 1791 AL_Test_Tool_Req_LFSRR: 8 Dummy_FO + SG_ LFSRREngCmdDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" LFSRR_FO + +BO_ 1786 AL_Test_Tool_Rsp_RSRR: 8 RSRR_FO + SG_ RSRREngRspDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" Dummy_FO + +BO_ 1789 AL_Test_Tool_Req_RSRR: 8 Dummy_FO + SG_ RSRREngCmdDta : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" RSRR_FO + +BO_ 1149 F_LRR_Azmth_Rate_Info_4: 8 LRR_FO + SG_ FLRRTrk20AzmthRate : 50|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk19AzmthRate : 45|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk18AzmthRate : 24|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk17AzmthRate : 19|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk16AzmthRate : 14|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRAzRtInf4BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1148 F_LRR_Azmth_Rate_Info_3: 8 LRR_FO + SG_ FLRRTrk15AzmthRate : 50|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk14AzmthRate : 45|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk13AzmthRate : 24|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk12AzmthRate : 19|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk11AzmthRate : 14|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRAzRtInf3BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1147 F_LRR_Azmth_Rate_Info_2: 8 LRR_FO + SG_ FLRRTrk9AzmthRate : 45|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk8AzmthRate : 24|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk7AzmthRate : 19|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk6AzmthRate : 14|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk10AzmthRate : 50|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRAzRtInf2BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1146 F_LRR_Azmth_Rate_Info_1: 8 LRR_FO + SG_ FLRRTrk5AzmthRate : 50|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk4AzmthRate : 45|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk3AzmthRate : 24|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk2AzmthRate : 19|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRTrk1AzmthRate : 14|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FLRRAzRtInf1BurstID : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1143 Long_Range_Radar_add_Info_3: 8 LRR_FO + SG_ FLRRAddInfo3BurstID : 57|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk13ObstType : 60|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk20ObstTypeConf : 52|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk20ObstType : 55|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk19ObstTypeConf : 44|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk19ObstType : 47|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk18ObstTypeConf : 36|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk18ObstType : 39|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk17ObstTypeConf : 28|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk17ObstType : 31|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk16ObstTypeConf : 20|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk16ObstType : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk15ObstTypeConf : 12|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk15ObstType : 15|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk14ObstTypeConf : 4|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk14ObstType : 7|3@0+ (1,0) [0|7] "" EOCM_F_FO + +BO_ 1142 Long_Range_Radar_add_Info_2: 8 LRR_FO + SG_ FLRRAddInfo2BurstID : 62|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRTrk13ObstTypeConf : 60|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk12ObstTypeConf : 52|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk12ObstType : 55|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk11ObstTypeConf : 44|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk11ObstType : 47|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk10ObstTypeConf : 36|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk10ObstType : 39|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk9ObstTypeConf : 28|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk9ObstType : 31|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk8ObstTypeConf : 20|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk8ObstType : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk7ObstTypeConf : 12|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk7ObstType : 15|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRTrk1ObstTypeConf : 4|5@0+ (0.0323,0) [0|1.0013] "" EOCM_F_FO + SG_ FLRRTrk1ObstType : 7|3@0+ (1,0) [0|7] "" EOCM_F_FO + +BO_ 851 F_Vision_Environment_4: 8 VIS_FO + SG_ LnMrkg3LnPrvwDst : 45|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTtlNmLnMrkgDetRt : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsRtLinCrsTm : 25|5@0+ (0.1,0) [0|3.1] "s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsNumPrlLnsDetRt : 33|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsNumPrlLnsDetLt : 36|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsCrvtGrdntLftV : 31|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLtLinCrsTm : 30|5@0+ (0.1,0) [0|3.1] "s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnPrvwDst : 50|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnMrkgTypChgDst : 61|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnMrkgTypChgDst : 40|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnMrkgWdth : 62|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnMarkrElvtd : 51|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4AnchrLnLin : 57|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnMrkgWdth : 41|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnMarkrElvtd : 46|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3AnchrLnLin : 52|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBurstID2 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsCrvtGrdntLft : 15|16@0- (5.96E-008,0) [-0.0019529728|0.0019529132] "1/rad/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 597 USDT_Req_to_VIS2_FO: 8 TestTool_FO + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" CIPM_FO,VIS2_FO + +BO_ 1204 RR_SRR_Object_Track4: 8 RRSRR_FO + SG_ RRSrrTrkRawAzimuth4 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate4 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange4 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange4 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID4 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation4 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp4 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth4 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RRSrrBurstID4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1203 RR_SRR_Object_Track3: 8 RRSRR_FO + SG_ RRSrrTrkRawAzimuth3 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate3 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange3 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange3 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID3 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation3 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp3 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth3 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + SG_ RRSrrBurstID3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1202 RR_SRR_Object_Track2: 8 RRSRR_FO + SG_ RRSrrBurstID2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkRawAzimuth2 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate2 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange2 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange2 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID2 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation2 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp2 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth2 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + +BO_ 1201 RR_SRR_Object_Track1: 8 RRSRR_FO + SG_ RRSrrBurstID1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkRawAzimuth1 : 61|6@0- (1,0) [-32|31] "deg" EOCM_F_FO + SG_ RRSrrTrkRRate1 : 18|11@0- (0.125,0) [-128|127.875] "m/s" EOCM_F_FO + SG_ RRSrrTrkRange1 : 2|11@0+ (0.02,0) [0|40.94] "m" EOCM_F_FO + SG_ RRSrrTrkObsRange1 : 53|6@0- (0.02,0) [-0.64|0.62] "m" EOCM_F_FO + SG_ RRSrrTrkObjID1 : 39|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ RRSrrTrkObjElevation1 : 20|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkMeasStatus1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSrrTrkDynamProp1 : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSrrTrkAzimuth1 : 34|11@0- (0.125,0) [-128|127.875] "deg" EOCM_F_FO + +BO_ 1200 RR_SRR_Object_Header: 8 RRSRR_FO + SG_ RRSrrTimeStampV : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSrrTimeStamp : 10|11@0+ (1,0) [0|2047] "" EOCM_F_FO + SG_ RRSrrRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ RRSRRNumValidTargets : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ RRSRRModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ RRSRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRMsalgnRllRt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRMsalgnRllLt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRCANIDAddrsUnsbl : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ RRSrrBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO + +BO_ 850 F_Vision_Environment_3: 8 VIS_FO + SG_ LnSnsTtlNmLnMrkgDetLt : 58|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLtLnMrkgWdth : 63|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLtLnMrkgTypChgDst : 62|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTngtOfHdngLnLftV : 23|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTngtOfHdngLnLft : 31|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnCrvtrLftV : 15|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnCrvtrLft : 39|16@0- (9.53E-007,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkrTypRght : 50|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkrTypLft : 53|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkrElvtdRght : 54|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkrElvtdLft : 55|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBurstID1 : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnQltyCnfdncLvlRght : 22|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnQltyCnfdncLvlLft : 14|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnPrvwDstncRght : 2|3@0+ (10,0) [0|70] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnPrvwDstncLft : 5|3@0+ (10,0) [0|70] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 1414 RVB_TVR_Debug2_FO: 7 EOCM_F_FO + SG_ VBBrkCntlAccel : 45|12@0- (0.01,0) [-20.48|20.47] "m/s^2" Dummy_FO + SG_ VBTOSObjID : 35|6@0+ (1,0) [0|63] "" Dummy_FO + SG_ VBTOSTTC : 31|12@0+ (0.025,0) [0|102.375] "s" Dummy_FO + SG_ VBTOSLatPstn : 11|11@0- (0.125,0) [-128|127.875] "m" Dummy_FO + SG_ VBTOSLonPstn : 7|12@0- (0.125,0) [-256|255.875] "m" Dummy_FO + diff --git a/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_powertrain.dbc b/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_powertrain.dbc new file mode 100644 index 000000000..2d0bb1217 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/cadillac_ct6_powertrain.dbc @@ -0,0 +1,248 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: K16_BECM K73_TCIC K9_BCM K43_PSCM K17_EBCM K20_ECM K114B_HPCM NEO K124_ASCM +VAL_TABLE_ TurnSignals 2 "Right Turn" 1 "Left Turn" 0 "None" ; +VAL_TABLE_ ACCLeadCar 1 "Present" 0 "Not Present" ; +VAL_TABLE_ ACCCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ BrakePedalPressed 1 "Pressed" 0 "Depressed" ; +VAL_TABLE_ DistanceButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ LKAButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ; +VAL_TABLE_ PRNDL 3 "Reverse" 2 "Drive" 1 "Neutral" 0 "Park" ; +VAL_TABLE_ DoorStatus 1 "Opened" 0 "Closed" ; +VAL_TABLE_ SeatBeltStatus 1 "Latched" 0 "Unlatched" ; +VAL_TABLE_ LKASteeringCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ; +VAL_TABLE_ GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ; +VAL_TABLE_ GasRegenCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ; +VAL_TABLE_ HandsOffSWDetectionStatus 1 "Hands On" 0 "Hands Off" ; +VAL_TABLE_ HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ; + + +BO_ 717 ASCM_2CD: 5 K124_ASCM + +BO_ 869 ASCM_365: 4 K124_ASCM + +BO_ 1034 ASCM_40A: 7 K124_ASCM + +BO_ 1296 ASCM_510: 4 K124_ASCM + +BO_ 1930 ASCM_78A: 7 K124_ASCM + +BO_ 190 ECMAcceleratorPos: 6 K20_ECM + SG_ BrakePedalPos : 15|8@0+ (1,0) [0|0] "sticky" NEO + SG_ GasPedalAndAcc : 23|8@0+ (1,0) [0|0] "" NEO + +BO_ 201 ECMEngineStatus: 8 K20_ECM + SG_ EngineTPS : 39|8@0+ (0.392156863,0) [0|100.000000065] "%" NEO + SG_ EngineRPM : 15|16@0+ (0.25,0) [0|0] "RPM" NEO + +BO_ 209 EBCMBrakePedalSensors: 7 K17_EBCM + SG_ Counter1 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ Counter2 : 23|2@0+ (1,0) [0|3] "" XXX + SG_ BrakePedalPosition1 : 5|14@0+ (1,0) [0|16383] "" XXX + SG_ BrakePedalPosition2 : 21|14@0- (-1,0) [0|16383] "" XXX + SG_ BrakeNormalized1 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ BrakeNormalized2 : 47|8@0- (-1,0) [0|255] "" XXX + +BO_ 241 EBCMBrakePedalPosition: 6 K17_EBCM + SG_ BrakePedalPosition : 15|8@0+ (1,0) [0|255] "" NEO + +BO_ 298 BCMDoorBeltStatus: 8 K9_BCM + SG_ RearLeftDoor : 8|1@0+ (1,0) [0|0] "" NEO + SG_ FrontLeftDoor : 9|1@0+ (1,0) [0|0] "" NEO + SG_ FrontRightDoor : 10|1@0+ (1,0) [0|0] "" NEO + SG_ RearRightDoor : 23|1@0+ (1,0) [0|0] "" NEO + SG_ LeftSeatBelt : 12|1@0+ (1,0) [0|0] "" NEO + SG_ RightSeatBelt : 53|1@0+ (1,0) [0|0] "" NEO + +BO_ 309 ECMPRDNL: 8 K20_ECM + SG_ PRNDL : 2|3@0+ (1,0) [0|0] "" NEO + +BO_ 320 BCMTurnSignals: 3 K9_BCM + SG_ TurnSignals : 19|2@0+ (1,0) [0|0] "" NEO + +BO_ 336 ASCMLKASStatus: 1 NEO + SG_ Available : 7|1@0+ (1,0) [0|0] "" NEO + +BO_ 338 ASCMLKASteeringCmd: 6 NEO + SG_ LKASteeringCmdActive : 7|1@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmd : 5|14@0- (1,0) [0|0] "" NEO + SG_ RollingCounter : 23|2@0+ (1,0) [0|0] "" NEO + SG_ SetMe1 : 21|1@0+ (1,0) [0|0] "" NEO + SG_ LKASVehicleSpeed : 20|13@0+ (0.22,0) [0|0] "kph" NEO + SG_ LKASMode : 36|2@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmdChecksum : 33|10@0+ (1,0) [0|0] "" NEO + +BO_ 340 ASCMBLKASteeringCmd: 6 NEO + SG_ LKASteeringCmdActive : 7|1@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmd : 5|14@0- (1,0) [0|0] "" NEO + SG_ RollingCounter : 23|2@0+ (1,0) [0|0] "" NEO + SG_ SetMe1 : 21|1@0+ (1,0) [0|0] "" NEO + SG_ LKASVehicleSpeed : 20|13@0+ (0.22,0) [0|0] "kph" NEO + SG_ LKASMode : 36|2@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmdChecksum : 33|10@0+ (1,0) [0|0] "" NEO + +BO_ 381 MSG_17D: 8 K20_ECM + SG_ MSG17D_AccPower : 35|12@0- (1,0) [0|0] "" NEO + +BO_ 356 PSCMStatus: 8 K43_PSCM + SG_ LKATorqueDeliveredStatus : 7|3@0+ (1,0) [0|7] "" NEO + SG_ LKADriverAppldTrq : 2|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO + SG_ LKATBDTorque : 21|14@0- (-0.005,0) [-10.24|10.23] "Nm" NEO + SG_ RollingCounter : 39|2@0+ (1,0) [0|0] "" NEO + SG_ LKATotalTorqueDelivered : 37|14@0- (0.01,0) [-10.24|10.23] "Nm" NEO + +BO_ 417 AcceleratorPedal: 7 XXX + SG_ AcceleratorPedal : 55|8@0+ (1,0) [0|0] "" NEO + +BO_ 451 GasAndAcc: 8 XXX + SG_ GasPedalAndAcc2 : 55|8@0+ (1,0) [0|0] "" NEO + +BO_ 452 AcceleratorPedal2: 8 XXX + SG_ AcceleratorPedal2 : 47|8@0+ (1,0) [0|0] "" NEO + +BO_ 481 ASCMSteeringButton: 7 K124_ASCM + SG_ DistanceButton : 22|1@0+ (1,0) [0|0] "" NEO + SG_ LKAButton : 23|1@0+ (1,0) [0|0] "" NEO + SG_ ACCButtons : 46|3@0+ (1,0) [0|0] "" NEO + +BO_ 485 PSCMSteeringAngle: 8 K43_PSCM + SG_ SteeringWheelAngle : 15|16@0- (0.0625,0) [-2047|2047] "deg" NEO + SG_ SteeringWheelRate : 27|12@0- (1,0) [-2047|2047] "deg/s" NEO + +BO_ 489 EBCMVehicleDynamic: 8 K17_EBCM + SG_ YawRate : 51|12@0- (0.0625,0) [-2047|2047] "grad/s" NEO + SG_ LateralAcceleration : 3|12@0- (0.0161,0) [-2047|2047] "m/s2" NEO + SG_ BrakePedalPressed : 6|1@0+ (1,0) [0|0] "" NEO + +BO_ 711 BECMBatteryVoltageCurrent: 6 K17_EBCM + SG_ HVBatteryVoltage : 31|12@0+ (0.125,0) [0|511.875] "V" NEO + SG_ HVBatteryCurrent : 12|13@0- (0.15,0) [-614.4|614.25] "A" NEO + +BO_ 715 ASCMGasRegenCmd: 8 K124_ASCM + SG_ GasRegenAlwaysOne : 9|1@0+ (1,1) [1|1] "" NEO + SG_ GasRegenAlwaysThree : 15|2@0+ (1,1) [1|1] "" NEO + SG_ GasRegenChecksum : 47|24@0+ (1,0) [0|0] "" NEO + SG_ GasRegenCmdActiveInv : 32|1@0+ (1,0) [0|0] "" NEO + SG_ GasRegenFullStopActive : 13|1@0+ (1,0) [0|0] "" NEO + SG_ GasRegenCmdActive : 0|1@0+ (1,0) [0|0] "" NEO + SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" NEO + SG_ RollingCounter2 : 36|4@0+ (1,0) [0|0] "" NEO + SG_ GasRegenAlwaysOne2 : 23|1@0+ (1,0) [0|1] "" NEO + SG_ GasRegenCmd : 22|15@0+ (1,0) [0|0] "" NEO + +BO_ 810 TCICOnStarGPSPosition: 8 K73_TCIC + SG_ GPSLongitude : 39|32@0+ (1,-2147483648) [0|0] "milliarcsecond" NEO + SG_ GPSLatitude : 7|32@0+ (1,0) [0|0] "milliarcsecond" NEO + +BO_ 840 EBCMWheelSpdFront: 4 K17_EBCM + SG_ FLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO + SG_ FRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO + +BO_ 842 EBCMWheelSpdRear: 4 K17_EBCM + SG_ RLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO + SG_ RRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO + +BO_ 880 ASCMActiveCruiseControlStatus: 6 K124_ASCM + SG_ ACCLeadCar : 44|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCAlwaysOne2 : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCAlwaysOne : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCSpeedSetpoint : 19|12@0+ (0.0625,0) [0|255.9375] "km/h" NEO + SG_ ACCGapLevel : 21|2@0+ (1,0) [0|0] "" NEO + SG_ ACCResumeButton : 1|1@0+ (1,0) [0|0] "" NEO + SG_ ACCCmdActive : 23|1@0+ (1,0) [0|0] "" NEO + +BO_ 1001 ECMVehicleSpeed: 8 K20_ECM + SG_ VehicleSpeed : 7|16@0+ (0.01,0) [0|0] "mph" NEO + +BO_ 1033 ASCMKeepAlive: 7 NEO + SG_ ASCMKeepAliveAllZero : 7|56@0+ (1,0) [0|0] "" NEO + +BO_ 1217 ECMEngineCoolantTemp: 8 K20_ECM + SG_ EngineCoolantTemp : 23|8@0+ (1,-40) [0|0] "C" NEO + +BO_ 1249 VIN_Part2: 8 K20_ECM + SG_ VINPart2 : 7|64@0+ (1,0) [0|0] "" NEO + +BO_ 1300 VIN_Part1: 8 K20_ECM + SG_ VINPart1 : 7|64@0+ (1,0) [0|0] "" NEO + +BO_ 1912 PSCM_778: 8 K43_PSCM + +BO_TX_BU_ 338 : K124_ASCM,NEO; +BO_TX_BU_ 880 : NEO,K124_ASCM; +BO_TX_BU_ 1033 : K124_ASCM,NEO; +BO_TX_BU_ 715 : NEO,K124_ASCM; + + +CM_ BU_ K16_BECM "Battery Energy Control Module"; +CM_ BU_ K73_TCIC "Telematics Communication Control Module"; +CM_ BU_ K9_BCM "Body Control Module"; +CM_ BU_ K43_PSCM "Power Steering Control Module"; +CM_ BU_ K17_EBCM "Electronic Brake Control Module"; +CM_ BU_ K20_ECM "Engine Control Module"; +CM_ BU_ K114B_HPCM "Hybrid Powertrain Control Module"; +CM_ BU_ NEO "Comma NEO"; +CM_ BU_ K124_ASCM "Active Safety Control Module"; +CM_ SG_ 381 MSG17D_AccPower "Need to investigate"; +CM_ SG_ 190 GasPedalAndAcc "ACC baseline is 62"; +CM_ SG_ 451 GasPedalAndAcc2 "ACC baseline is 62"; +CM_ SG_ 715 RollingCounter2 "Values cycle between 0, 7, 10, 13"; +BA_DEF_ "UseGMParameterIDs" INT 0 0; +BA_DEF_ "ProtocolType" STRING ; +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "UseGMParameterIDs" 1; +BA_DEF_DEF_ "ProtocolType" "GMLAN"; +BA_DEF_DEF_ "BusType" ""; +BA_ "BusType" "CAN"; +BA_ "ProtocolType" "GMLAN"; +BA_ "UseGMParameterIDs" 0; +VAL_ 481 DistanceButton 1 "Active" 0 "Inactive" ; +VAL_ 481 LKAButton 1 "Active" 0 "Inactive" ; +VAL_ 481 ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ; +VAL_ 309 PRNDL 3 "Reverse" 2 "Drive" 1 "Neutral" 0 "Park" ; +VAL_ 338 LKASteeringCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 338 LKASMode 2 "supercruise" 1 "lkas" 0 "Inactive" ; +VAL_ 880 ACCLeadCar 1 "Present" 0 "Not Present" ; +VAL_ 880 ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ; +VAL_ 880 ACCResumeButton 1 "Pressed" 0 "Depressed" ; +VAL_ 880 ACCCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 356 LKATorqueDeliveredStatus 7 "Override Fault" 6 "LKAS Fault but Responsive" 5 "TBD but Responsive" 4 "TBD but Responsive" 3 "Fault" 1 "Active" 0 "Inactive" ; +VAL_ 489 BrakePedalPressed 1 "Pressed" 0 "Depressed" ; +VAL_ 715 GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ; +VAL_ 715 GasRegenCmdActive 1 "Active" 0 "Inactive" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/chrysler_cusw.dbc b/artifacts/package_runtime/iqdbc/dbc/chrysler_cusw.dbc new file mode 100644 index 000000000..880f6e725 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/chrysler_cusw.dbc @@ -0,0 +1,192 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 492 EPS_STATUS: 8 XXX + SG_ TORQUE_DRIVER : 3|12@0+ (1,-1024) [0|2048] "Nm" XXX + SG_ LKAS_STATE : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_FAULT : 17|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_HIGH_TORQUE : 19|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_MOTOR : 27|12@0+ (1,-2048) [0|1] "" XXX + SG_ LAT_TORQUE_REQUEST : 47|12@0+ (1,-2048) [0|4095] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1250 DOORS: 8 XXX + SG_ DOOR_OPEN_FL : 10|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 11|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 12|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 13|1@0+ (1,0) [0|1] "" XXX + SG_ TRUNK : 14|1@0+ (1,0) [0|1] "" XXX + +BO_ 1262 GEAR: 8 XXX + SG_ PRNDL : 11|4@0+ (1,0) [0|15] "" XXX + +BO_ 875 SEATBELT_STATUS: 8 XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 16|1@0+ (1,0) [0|1] "" XXX + +BO_ 1264 STEERING_LEVERS: 7 XXX + SG_ TURN_SIGNALS : 3|4@0+ (1,0) [0|15] "" XXX + SG_ HIGH_BEAM_FLASH : 15|1@0+ (1,0) [0|1] "" XXX + +BO_ 480 TRACTION_BUTTON: 8 XXX + SG_ TRACTION_OFF : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 740 WHEEL_SPEEDS_REAR: 8 XXX + SG_ WHEEL_SPEED_RL : 5|13@0+ (0.0087,0) [0|1] "" XXX + SG_ WHEEL_SPEED_RR : 20|13@0+ (0.0087,0) [0|1] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 520 EPS_STATUS_2: 7 XXX + SG_ NEW_SIGNAL_1 : 3|12@0+ (1,-2048) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 19|12@0+ (1,-2048) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 39|12@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 43|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|1] "" XXX + +BO_ 494 STEERING: 6 XXX + SG_ STEER_ANGLE : 5|14@0+ (0.1,-720) [0|1] "deg" XXX + SG_ STEERING_RATE : 19|12@0+ (1,-2000) [0|1] "" XXX + SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 738 BRAKE_2: 8 XXX + SG_ BRAKE_TORQUE : 7|12@0+ (1,0) [0|15] "" XXX + SG_ BRAKE_LIGHTS : 8|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HUMAN : 9|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 742 WHEEL_SPEEDS_FRONT: 8 XXX + SG_ WHEEL_SPEED_FL : 5|13@0+ (0.0087,0) [0|1] "" XXX + SG_ WHEEL_SPEED_FR : 20|13@0+ (0.0087,0) [0|1] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 502 LKAS_COMMAND: 4 XXX + SG_ STEERING_TORQUE : 7|11@0+ (1,-1024) [0|4087] "" XXX + SG_ LKAS_CONTROL_BIT : 12|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 19|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 31|8@0+ (1,0) [0|1] "" XXX + +BO_ 1498 LKAS_1: 2 XXX + +BO_ 1500 DAS_6: 4 XXX + SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0XAC : 15|8@0+ (1,0) [0|255] "" XXX + SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|15] "" XXX + +BO_ 1508 LKAS_HEARTBIT: 8 XXX + SG_ LKAS_STATUS_OK : 28|1@0+ (1,0) [0|1] "" XXX + +BO_ 762 CRUISE_BUTTONS: 3 XXX + SG_ ACC_Cancel : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Distance_Dec : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Accel : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Decel : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_OnOff : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_OnOff : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Distance_Inc : 8|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|1] "" XXX + +BO_ 484 BRAKE_1: 8 XXX + SG_ BRAKE_PSI : 7|12@0+ (1,0) [0|1] "" XXX + SG_ VEHICLE_SPEED : 35|12@0+ (0.0174,0) [0|4095] "m/s" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 500 GEARBOX_1: 7 XXX + SG_ DESIRED_GEAR : 35|4@0+ (1,0) [0|1] "" XXX + SG_ ACTUAL_GEAR : 39|4@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 43|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|1] "" XXX + +BO_ 510 ACCEL_GAS: 5 XXX + SG_ ACC_ACTIVE : 2|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_HUMAN : 15|8@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 27|4@0+ (1,0) [0|1] "" XXX + SG_ GAS_ACC : 28|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|1] "" XXX + +BO_ 490 DASHBOARD: 4 XXX + SG_ ACC_SPEED_CONFIG_KPH : 7|8@0+ (0.1625,0) [0|1] "m/s" XXX + +BO_ 1006 ACC_HUD: 7 XXX + SG_ ACC_STATE : 7|3@0+ (1,0) [0|15] "" XXX + SG_ ACC_SET_SPEED_KMH : 14|8@0+ (1,0) [0|255] "km/h" XXX + SG_ DISTANCE_SETTING : 33|2@0+ (1,0) [0|3] "" XXX + SG_ DISTANCE_TO_LEAD : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 748 ACC_CONTROL: 8 XXX + SG_ ACC_MAIN_ON : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ACTIVE : 7|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_VALUE : 13|10@0+ (1,0) [0|1023] "" XXX + SG_ GAS_VALID : 15|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_VALUE : 28|10@0+ (1,0) [0|1023] "" XXX + SG_ BRAKE_VALID : 30|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN_1 : 33|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN_2 : 46|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 496 CLUSTER_1: 8 XXX + SG_ TACHOMETER : 3|12@0+ (1.024,0) [0|3] "" XXX + SG_ SPEEDOMETER : 19|12@0+ (0.01065,0) [0|1] "m/s" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX + + +CM_ SG_ 1250 TRUNK "1 = open, 0 = closed"; +CM_ SG_ 1250 DOOR_OPEN_FL "1 = open, 0 = closed"; +CM_ SG_ 1250 DOOR_OPEN_FR "1 = open, 0 = closed"; +CM_ SG_ 1250 DOOR_OPEN_RL "1 = open, 0 = closed"; +CM_ SG_ 1250 DOOR_OPEN_RR "1 = open, 0 = closed"; +CM_ SG_ 1262 PRNDL "1 = park, 2 = reverse, 3 = neutral, 4 = drive, 5 = sport (snicker... sport)"; +CM_ SG_ 875 SEATBELT_DRIVER_UNLATCHED "1 = unlatched, 0 = safety first"; +CM_ SG_ 1264 TURN_SIGNALS "0 = off, 1 = left blinker, 2 = right blinker"; +CM_ SG_ 480 TRACTION_OFF "0 = TCS on, 1 = TCS off (light on dash ON)"; +CM_ SG_ 1500 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 1492 LEAD_CAR "lead car present = 4, no car = 2 "; +CM_ SG_ 498 ACC_STATUS_2 "1 no ACC, 3 icpno "; +CM_ SG_ 498 ACC_STATUS_1 "0x00 = acc off, 0x03 = acc on, green, 0x02 acc on, white"; +CM_ SG_ 1006 ACC_STATE "0 = ACC off, 6 = ACC active (white), 8 = ACC engaged (green)"; +CM_ SG_ 502 LKAS_STATE "2 = active (green), 1 = error"; +CM_ SG_ 1006 ACC_SET_SPEED_KMH "min set appears to be 68 km/h, errors below 59 km/h "; +VAL_ 1262 PRNDL 1 "P" 2 "R" 3 "N" 4 "D" 5 "S"; diff --git a/artifacts/package_runtime/iqdbc/dbc/chrysler_pacifica_2017_hybrid_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/chrysler_pacifica_2017_hybrid_generated.dbc new file mode 100644 index 000000000..3f035ddc2 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/chrysler_pacifica_2017_hybrid_generated.dbc @@ -0,0 +1,369 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _stellantis_common.dbc starts here"; +BO_ 258 STEERING: 8 XXX + SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX + SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX + SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 264 ECM_1: 8 XXX + SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 280 ECM_TRQ: 8 XXX + SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX + SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX + +BO_ 284 ESP_8: 8 XXX + SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 288 ECM_2: 7 XXX + SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX + SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX + SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX + +BO_ 320 ESP_1: 8 XXX + SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX + SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX + SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX + SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX + +BO_ 268 ESP_2: 8 ESC + SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX + SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX + SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 344 ESP_6: 8 XXX + SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 368 Transmission_Status: 8 XXX + SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 464 ORC_1: 8 XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 500 DAS_3: 8 XXX + SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX + SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX + SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX + SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX + SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX + SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX + SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 501 DAS_4: 8 XXX + SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX + SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX + SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX + SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX + SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX + SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX + SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX + SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX + +BO_ 544 EPS_2: 8 XXX + SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX + SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX + SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX + SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX + SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX + SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 559 ECM_5: 8 XXX + SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 571 CRUISE_BUTTONS: 3 XXX + SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 625 DAS_5: 8 XXX + SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX + SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX + SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX + SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX + SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX + SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 669 EPB_1: 3 XXX + SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 678 DAS_6: 8 XXX + SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX + SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX + SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX + SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX + +BO_ 720 BSM_1: 6 XXX + SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 792 STEERING_LEVERS: 8 XXX + SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX + SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX + +BO_ 820 BCM_1: 8 XXX + SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX + +VAL_ 320 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE" +VAL_ 368 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ; +VAL_ 669 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ; + +CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision"; +CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque"; +CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed"; +CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null"; +CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null"; + +CM_ "chrysler_pacifica_2017_hybrid.dbc starts here"; + +BO_ 514 SPEED_1: 8 XXX + SG_ SPEED_LEFT : 7|12@0+ (0.071028,0) [0|65535] "m/s" XXX + SG_ SPEED_RIGHT : 23|12@0+ (0.071028,0) [0|1023] "m/s" XXX + +BO_ 653 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 15|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|4] "" XXX + +BO_ 746 GEAR: 5 XXX + SG_ PRNDL : 2|3@0+ (1,0) [0|7] "" XXX + SG_ GEAR_CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 31|4@0+ (1,0) [0|15] "" XXX + +BO_ 736 TRIP: 8 XXX + SG_ COUNTER : 7|16@0+ (1,0) [0|65535] "Meters" XXX + SG_ COUNTER_2 : 23|16@0+ (1,0) [0|65535] "Meters" XXX + +BO_ 658 LKAS_COMMAND: 6 XXX + SG_ COUNTER : 39|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + SG_ STEERING_TORQUE : 2|11@0+ (1,-1024) [0|1] "" XXX + SG_ LKAS_CONTROL_BIT : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 705 AUTO_PARK_BUTTON: 8 XXX + SG_ AUTO_PARK_TOGGLE_2 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_PARK_TOGGLE_1 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ INCREASING_UNKNOWN : 38|7@0+ (1,0) [0|15] "" XXX + +BO_ 719 AUTO_PARK_SIGNALS_1: 8 XXX + SG_ AUTO_PARK_UNKNOWN_1 : 7|16@0+ (1,0) [0|31] "" XXX + +BO_ 671 AUTO_PARK_REQUEST: 8 XXX + SG_ AUTO_PARK_CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ AUTO_PARK_STATUS : 7|5@0+ (1,0) [0|15] "" XXX + SG_ AUTO_PARK_COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ AUTO_PARK_MODE : 22|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_PARK_CMD : 2|11@0+ (1,-1024) [0|1] "NM" XXX + +BO_ 784 AUTO_PARK_LESS_INTERESTING: 8 XXX + SG_ INCREASING_UNKNOWN : 55|8@0+ (1,0) [0|7] "" XXX + SG_ AUTO_PARK_PERPENDICULAR_2 : 61|1@0+ (1,0) [0|255] "" XXX + +BO_ 826 AUTO_PARK_SIGNALS_3: 8 XXX + SG_ AUTO_PARK_HAS_CONTROL_3 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ HUMAN_HAS_CONTROL : 2|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_PARK_GEAR_1 : 27|4@0+ (1,0) [0|255] "" XXX + SG_ AUTO_PARK_GEAR_2 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ AUTO_PARK_GEAR_3 : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 332 STEERING_2: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ ENERGY_RELATED : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ STEER_ANGLE_2 : 7|13@0+ (0.3187251,-1307.888) [-360|360] "deg" XXX + +BO_ 331 BRAKE_3: 8 XXX + SG_ BRAKE_RELATED_3 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 608 PARKSENSE_SIGNAL: 8 XXX + SG_ PARKSENSE_DISABLED : 34|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ IN_REVERSE : 10|1@0+ (1,0) [0|255] "" XXX + SG_ AUTO_PARK_HAS_CONTROL_1 : 16|1@0+ (1,0) [0|255] "" XXX + SG_ HUMAN_HAS_CONTROL : 17|1@0+ (1,0) [0|3] "" XXX + +BO_ 729 LKAS_HEARTBIT: 5 XXX + SG_ LKAS_DISABLED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGH_BEAM : 31|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_1 : 7|24@0+ (1,0) [0|255] "" XXX + SG_ FORWARD_2 : 30|6@0+ (1,0) [0|127] "" XXX + SG_ FORWARD_3 : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 257 ACCEL_RELATED_101: 5 XXX + SG_ ENERGY_OR_RPM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 825 AUDIBLE_BEEP_339: 2 XXX + SG_ BEEP_339 : 7|16@0+ (1,0) [0|65535] "" XXX + +BO_ 168 ACCEL_RELATED_a8: 8 XXX + SG_ ACCEL_RELATED : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 270 ACCEL_RELATED_10e: 8 XXX + SG_ ACCEL_OR_RPM : 7|16@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ ELECTRIC_MOTOR : 23|16@0+ (1,0) [0|65535] "" XXX + +BO_ 291 ENERGY_RELATED_123: 8 XXX + SG_ ENERGY_GAIN_LOSS : 18|11@0- (1,0) [0|255] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ ENERGY_SMOOTHER_CURVE : 35|12@0+ (1,0) [0|2047] "" XXX + +BO_ 294 ENERGY_RELATED_126: 8 XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_126_1 : 3|12@0+ (1,0) [0|4095] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_126_2 : 35|12@0+ (1,0) [0|4095] "" XXX + SG_ ENERGY_GAIN_LOSS_NOISY : 19|12@0+ (1,0) [0|2047] "" XXX + +BO_ 308 ACCEL_GAS_134: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ ACCEL_134 : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 532 ENERGY_RELATED_214: 8 XXX + SG_ NOISY_SLOWLY_DECREASING : 19|12@0+ (1,0) [0|255] "" XXX + SG_ ENERGY_RELATED : 0|9@0+ (1,0) [0|255] "" XXX + +BO_ 655 CHARGING_MAYBE_28F: 8 XXX + SG_ CHARGING : 1|2@0+ (1,0) [0|3] "" XXX + +BO_ 660 BRAKE_RELATED_294: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PERHAPS_294 : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 764 ACCEL_RELATED_2FC: 8 XXX + SG_ ACCEL_2FC : 13|6@0+ (1,0) [0|255] "" XXX + +BO_ 816 TRACTION_BUTTON: 8 XXX + SG_ TRACTION_OFF : 19|1@0+ (1,0) [0|3] "" XXX + SG_ TOGGLE_PARKSENSE : 52|1@0+ (1,0) [0|3] "" XXX + SG_ TOGGLE_LKAS : 53|1@0+ (1,0) [0|1] "" XXX + +BO_ 878 ACCEL_RELATED_36E: 8 XXX + SG_ ACCEL_OR_RPM_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ACCEL_OR_RPM_1 : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 324 SPEED_2: 8 XXX + SG_ SPEED_2 : 31|16@0+ (0.01,0) [0|255] "m/s" XXX + +BO_ 832 UNKNOWN_340: 8 XXX + SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX + +CM_ SG_ 653 BRAKE_PRESSURE "max seems to be 148"; +CM_ SG_ 746 PRNDL "5=L, 4=D, 3=N, 2=R, 1=P"; +CM_ SG_ 320 BRAKE_PRESSED_2 "Value is 5 when brake is pressed by human, 1 when ACC brake"; +CM_ SG_ 320 BRAKE_PRESSED_ACC "set when ACC brakes"; +CM_ SG_ 792 TURN_SIGNALS "1=Left, 2=Right"; +CM_ SG_ 264 ACCEL_PEDAL "not in ACC so seems to be actual pedal. Use for gasPressed"; +CM_ SG_ 544 LKAS_STATE "2 when autopark has control, 8 when is actuatable by lkas, 4 when there is a fault"; +CM_ SG_ 658 LKAS_STEERING_TORQUE "Most sent by stock system is 1024+-230. + is left. typically changes by 2 or 3 each 0.01s"; +CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null"; +CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 705 AUTO_PARK_TOGGLE_1 "set briefly when turning on or off self-parking"; +CM_ SG_ 671 AUTO_PARK_CMD "Request Appears to be in NM"; +CM_ SG_ 671 AUTO_PARK_STATUS "1 = IDLE / NO REQUEST 9 = START REQUEST 10 = REQUEST MODE 11 = REQUEST MODE"; +CM_ SG_ 826 AUTO_PARK_GEAR_1 "Reverse=0, Forward=f"; +CM_ SG_ 826 AUTO_PARK_GEAR_2 "Reverse=0, Forward=f"; +CM_ SG_ 826 AUTO_PARK_GEAR_3 "Reverse=0, Forward=f"; +CM_ SG_ 332 STEER_ANGLE_2 "slightly lags the other steer_angle signal. also more noisy."; +CM_ SG_ 608 PARKSENSE_DISABLED "set if parksense is disabled"; +CM_ SG_ 729 LKAS_STATUS_OK "Set to 0x0820 when LKAS system is plugged in."; +CM_ SG_ 825 BEEP_339 "sent every 0.5s. 0050 is no beep. To beep send 4355 or 4155. Used by ParkSense warning."; +CM_ SG_ 270 ELECTRIC_MOTOR "0x7fff indicates electric motor not in use"; +CM_ SG_ 291 ENERGY_GAIN_LOSS "unsure what this actually is"; +CM_ SG_ 291 ENERGY_SMOOTHER_CURVE "unsure what it is, but smoother"; +CM_ SG_ 308 ACCEL_134 "only set when human presses accel pedal"; +CM_ SG_ 532 NOISY_SLOWLY_DECREASING "perhaps battery but do not know"; +CM_ SG_ 816 TRACTION_OFF "set when traction off button is enabled"; +CM_ SG_ 816 TOGGLE_PARKSENSE "sending 3000071ec0ff9000 enables or disables parksense"; +CM_ SG_ 324 SPEED_2 "signal is approx half other speeds"; +CM_ SG_ 501 ACC_SPEED_CONFIG_KPH "speed configured for ACC"; +CM_ SG_ 501 ACC_SPEED_CONFIG_MPH "speed configured for ACC"; +CM_ SG_ 501 CRUISE_STATE "may just be an icon, but seems to indicate different cruise modes: ACC and Non-ACC and engaged state for both."; +CM_ SG_ 625 SPEED "zero on non-acc drives"; + +VAL_ 501 CRUISE_STATE 0 "Off" 1 "CC On" 2 "CC Engaged" 3 "ACC On" 4 "ACC Engaged"; +VAL_ 746 PRNDL 5 "L" 4 "D" 3 "N" 2 "R" 1 "P"; +VAL_ 792 TURN_SIGNALS 2 "Right" 1 "Left"; diff --git a/artifacts/package_runtime/iqdbc/dbc/chrysler_pacifica_2017_hybrid_private_fusion.dbc b/artifacts/package_runtime/iqdbc/dbc/chrysler_pacifica_2017_hybrid_private_fusion.dbc new file mode 100644 index 000000000..07c37e1fa --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/chrysler_pacifica_2017_hybrid_private_fusion.dbc @@ -0,0 +1,230 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 544 a_1: 8 XXX + SG_ track_id : 7|4@0+ (1,0) [0|15] "" XXX + SG_ REL_ACCEL : 3|12@0+ (1,0) [0|31] "" XXX + SG_ status1 : 23|4@0+ (1,0) [0|15] "" XXX + SG_ REL_SPEED : 19|12@0+ (1,0) [0|65535] "" XXX + SG_ status2 : 39|6@0+ (1,0) [0|15] "" XXX + SG_ sig2 : 33|10@0+ (1,0) [0|255] "" XXX + SG_ zeros : 55|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 576 b_1: 8 XXX + SG_ sig0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ sig1 : 15|16@0+ (1,0) [0|65535] "" XXX + SG_ sig2 : 31|16@0+ (1,0) [0|255] "" XXX + SG_ zeros : 47|12@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 608 a_2: 8 XXX + SG_ track_id : 7|4@0+ (1,0) [0|15] "" XXX + SG_ REL_ACCEL : 3|12@0+ (1,0) [0|31] "" XXX + SG_ status1 : 23|4@0+ (1,0) [0|15] "" XXX + SG_ REL_SPEED : 19|12@0+ (1,0) [0|65535] "" XXX + SG_ status2 : 39|6@0+ (1,0) [0|15] "" XXX + SG_ sig2 : 33|10@0+ (1,0) [0|255] "" XXX + SG_ zeros : 55|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 640 b_2: 8 XXX + SG_ sig0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ sig1 : 15|16@0+ (1,0) [0|65535] "" XXX + SG_ sig2 : 31|16@0+ (1,0) [0|255] "" XXX + SG_ zeros : 47|12@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 644 a_3: 8 XXX + SG_ track_id : 7|4@0+ (1,0) [0|15] "" XXX + SG_ REL_ACCEL : 3|12@0+ (1,0) [0|31] "" XXX + SG_ status1 : 23|4@0+ (1,0) [0|15] "" XXX + SG_ REL_SPEED : 19|12@0+ (1,0) [0|65535] "" XXX + SG_ status2 : 39|6@0+ (1,0) [0|15] "" XXX + SG_ sig2 : 33|10@0+ (1,0) [0|255] "" XXX + SG_ zeros : 55|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 648 b_3: 8 XXX + SG_ sig0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ sig1 : 15|16@0+ (1,0) [0|65535] "" XXX + SG_ sig2 : 31|16@0+ (1,0) [0|255] "" XXX + SG_ zeros : 47|12@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 652 a_4: 8 XXX + SG_ track_id : 7|4@0+ (1,0) [0|15] "" XXX + SG_ REL_ACCEL : 3|12@0+ (1,0) [0|31] "" XXX + SG_ status1 : 23|4@0+ (1,0) [0|15] "" XXX + SG_ REL_SPEED : 19|12@0+ (1,0) [0|65535] "" XXX + SG_ status2 : 39|6@0+ (1,0) [0|15] "" XXX + SG_ sig2 : 33|10@0+ (1,0) [0|255] "" XXX + SG_ zeros : 55|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 656 b_4: 8 XXX + SG_ sig0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ sig1 : 15|16@0+ (1,0) [0|65535] "" XXX + SG_ sig2 : 31|16@0+ (1,0) [0|255] "" XXX + SG_ zeros : 47|12@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 512 unknown_200: 8 XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ increasing : 31|16@0+ (1,0) [0|255] "" XXX + SG_ zeros_0 : 3|12@0+ (1,0) [0|63] "" XXX + SG_ zeros_1 : 47|12@0+ (1,0) [0|63] "" XXX + SG_ status0 : 7|4@0+ (1,0) [0|15] "" XXX + SG_ unknown_0 : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 514 unknown_202: 8 XXX + SG_ COUNTER : 43|4@0+ (1,0) [0|15] "" XXX + SG_ sig3 : 31|8@0+ (1,0) [0|65535] "" XXX + SG_ increasing : 39|12@0+ (1,0) [0|15] "" XXX + +BO_ 706 c_1: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + +BO_ 708 c_2: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 710 c_3: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 712 c_4: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 714 c_5: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 716 c_6: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 718 c_7: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 720 c_8: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 722 c_9: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 724 c_10: 8 XXX + SG_ LAT_DIST : 18|11@0+ (0.005,-1000) [0|2047] "m" XXX + SG_ LONG_DIST : 34|11@0+ (0.073,0) [0|255] "m" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 674 d_1: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 676 d_2: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 678 d_3: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 680 d_4: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 682 d_5: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 684 d_6: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 686 d_7: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 688 d_8: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 690 d_9: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 692 d_10: 8 XXX + SG_ REL_SPEED : 17|10@0+ (0.2857,-146.278) [0|1023] "m/s" XXX + +BO_ 672 NEW_MSG_5: 8 XXX + SG_ NEW_SIGNAL_1 : 9|10@0+ (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_2 : 45|10@0+ (1,0) [0|1023] "" XXX + + + + +CM_ SG_ 544 track_id "for message a_1 track_id is always 1, similar for other messages and track_id"; +CM_ SG_ 544 REL_ACCEL "perhaps REL_ACCEL because it responds faster and before REL_SPEED"; +CM_ SG_ 544 sig2 "perhaps distance to object. LONG_DIST or REL_ACCEL or REL_SPEED"; +CM_ SG_ 576 zeros "not always zero, sometimes has value when another car changes lanes"; +CM_ SG_ 706 LAT_DIST "positive is to the right, negative is to the left"; diff --git a/artifacts/package_runtime/iqdbc/dbc/chrysler_ram_dt_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/chrysler_ram_dt_generated.dbc new file mode 100644 index 000000000..b7761e4a2 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/chrysler_ram_dt_generated.dbc @@ -0,0 +1,251 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _stellantis_common_ram_dt_generated.dbc starts here"; +CM_ "Generated from _stellantis_common.dbc" + +BO_ 35 STEERING: 8 XXX + SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX + SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX + SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 37 ECM_1: 8 XXX + SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 181 ECM_TRQ: 8 XXX + SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX + SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX + +BO_ 121 ESP_8: 8 XXX + SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 123 ECM_2: 7 XXX + SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX + SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX + SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX + +BO_ 131 ESP_1: 8 XXX + SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX + SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX + SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX + SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX + +BO_ 113 ESP_2: 8 ESC + SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX + SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX + SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 139 ESP_6: 8 XXX + SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 147 Transmission_Status: 8 XXX + SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 464 ORC_1: 8 XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 153 DAS_3: 8 XXX + SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX + SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX + SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX + SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX + SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX + SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX + SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 232 DAS_4: 8 XXX + SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX + SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX + SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX + SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX + SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX + SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX + SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX + SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX + +BO_ 49 EPS_2: 8 XXX + SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX + SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX + SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX + SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX + SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX + SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 157 ECM_5: 8 XXX + SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 177 CRUISE_BUTTONS: 3 XXX + SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 163 DAS_5: 8 XXX + SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX + SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX + SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX + SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX + SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX + SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 213 EPB_1: 3 XXX + SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 250 DAS_6: 8 XXX + SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX + SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX + SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX + SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX + +BO_ 720 BSM_1: 6 XXX + SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 792 STEERING_LEVERS: 8 XXX + SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX + SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX + +BO_ 657 BCM_1: 8 XXX + SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX + +VAL_ 131 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE" +VAL_ 147 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ; +VAL_ 213 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ; + +CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision"; +CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque"; +CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed"; +CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null"; +CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null"; + +CM_ "chrysler_ram_dt.dbc starts here"; + +BO_ 53 PCM_2: 8 XXX + SG_ ENG_TORQUE_REQ : 3|12@0+ (1,0) [0|7] "" XXX + SG_ ENG_TORQUE_OUT : 19|12@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + +BO_ 133 TCM_1: 8 XXX + SG_ SHIFT_PENDING : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ACTUAL_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DESIRED_GEAR : 15|4@0+ (1,0) [0|1] "" XXX + SG_ TC_LOCKED : 17|1@1+ (1,0) [0|0] "" XXX + SG_ OUTPUT_SPEED : 31|16@0+ (1,0) [0|65534] "rpm" XXX + SG_ INPUT_SPEED : 47|16@0+ (1,0) [0|65534] "rpm" XXX + SG_ OUTPUT_SPEED_SIGN : 57|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|4@0+ (1,0) [0|15] "" XXX + +BO_ 135 ABS_2: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_BRAKE : 15|8@0+ (1,0) [0|1] "" XXX + +BO_ 137 ESP_4: 8 XXX + SG_ Yaw_Rate : 7|16@0+ (0.01,-327.68) [-327.68|327.66] "deg/s" XXX + SG_ Acceleration : 32|8@1+ (0.08,-10.24) [-10.24|10.08] "m/s2" XXX + +BO_ 164 EPS_3: 8 XXX + SG_ DASM_FAULT : 34|1@0+ (1,0) [0|1] "" XXX + SG_ Activation_Status : 48|3@1+ (1,0) [0|1] "" XXX + SG_ Driver_Override : 35|1@0+ (1,0) [0|1] "" XXX + SG_ Hands_on_Wheel : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 166 LKAS_COMMAND: 8 XXX + SG_ STEERING_TORQUE : 10|11@0+ (1,-1024) [0|1] "" XXX + SG_ LKAS_CONTROL_BIT : 24|3@1+ (1,0) [0|1] "" XXX + SG_ DASM_FAULT : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 221 Center_Stack_1: 8 XXX + SG_ LKAS_Button : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Traction_Button : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 650 Center_Stack_2: 8 XXX + SG_ LKAS_Button : 57|1@1+ (1,0) [0|0] "" XXX + + +CM_ SG_ 133 ACTUAL_GEAR "0xd = P, 0x1-8 = D (actual gear), 0xb = R or N?? TODO find R vs N"; +CM_ SG_ 153 ACC_Engaged "SENT BY FORWARD CAMERA 1 = ACTIVE, 3 = ENGAGED, 0 = DISENGAGED/OFF"; +CM_ SG_ 166 LKAS_CONTROL_BIT "0=IDLE, 1=HAS 2=LKAS 3=ABSD, 4=TJA, 7=SNA"; +CM_ SG_ 250 Auto_High_Beam "1 = HIGH BEAMS OK 0 = HIGH BEAMS OFF "; +CM_ SG_ 250 LKAS_LANE_LINES "9 = LEFT CAUTION, 11 = VERY LEFT CAUTION 10 = RIGHT CAUTION, 14 = VERY RIGHT, 4 = NO LINES DETECTED, 3 = LINES DETECTED, SYSTEM ACTIVE"; +CM_ SG_ 464 Driver_Seatbelt_Status "1 unbuckled 0 buckled"; +CM_ SG_ 792 High_Beam_Lever_Status "1 is high beam, 0 reg"; diff --git a/artifacts/package_runtime/iqdbc/dbc/chrysler_ram_hd_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/chrysler_ram_hd_generated.dbc new file mode 100644 index 000000000..c7d540c48 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/chrysler_ram_hd_generated.dbc @@ -0,0 +1,217 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _stellantis_common_ram_hd_generated.dbc starts here"; +CM_ "Generated from _stellantis_common.dbc" + +BO_ 258 STEERING: 8 XXX + SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX + SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX + SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 264 ECM_1: 8 XXX + SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 280 ECM_TRQ: 8 XXX + SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX + SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX + +BO_ 284 ESP_8: 8 XXX + SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 288 ECM_2: 7 XXX + SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX + SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX + SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX + +BO_ 320 ESP_1: 8 XXX + SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX + SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX + SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX + SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX + +BO_ 268 ESP_2: 8 ESC + SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX + SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX + SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 344 ESP_6: 8 XXX + SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 368 Transmission_Status: 8 XXX + SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 464 ORC_1: 8 XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 500 DAS_3: 8 XXX + SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX + SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX + SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX + SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX + SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX + SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX + SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 501 DAS_4: 8 XXX + SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX + SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX + SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX + SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX + SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX + SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX + SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX + SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX + +BO_ 544 EPS_2: 8 XXX + SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX + SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX + SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX + SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX + SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX + SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 559 ECM_5: 8 XXX + SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 570 CRUISE_BUTTONS: 3 XXX + SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 625 DAS_5: 8 XXX + SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX + SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX + SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX + SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX + SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX + SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 669 EPB_1: 3 XXX + SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 629 DAS_6: 8 XXX + SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX + SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX + SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX + SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX + +BO_ 720 BSM_1: 6 XXX + SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 792 STEERING_LEVERS: 8 XXX + SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX + SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX + +BO_ 820 BCM_1: 8 XXX + SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX + +VAL_ 320 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE" +VAL_ 368 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ; +VAL_ 669 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ; + +CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision"; +CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque"; +CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed"; +CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null"; +CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null"; + +CM_ "chrysler_ram_hd.dbc starts here"; + +BO_ 545 EPS_3: 8 XXX + SG_ DASM_FAULT : 34|1@0+ (1,0) [0|1] "" XXX + SG_ Activation_Status : 48|3@1+ (1,0) [0|1] "" XXX + SG_ Driver_Override : 35|1@0+ (1,0) [0|1] "" XXX + SG_ Hands_on_Wheel : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 630 LKAS_COMMAND: 8 XXX + SG_ STEERING_TORQUE : 10|11@0+ (1,-1024) [0|1] "" XXX + SG_ LKAS_CONTROL_BIT : 24|3@1+ (1,0) [0|1] "" XXX + SG_ DASM_FAULT : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 816 Center_Stack_1: 8 XXX + SG_ LKAS_Button : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Traction_Button : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 650 Center_Stack_2: 8 XXX + SG_ LKAS_Button : 57|1@1+ (1,0) [0|0] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/comma_body.dbc b/artifacts/package_runtime/iqdbc/dbc/comma_body.dbc new file mode 100644 index 000000000..2b89f3a74 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/comma_body.dbc @@ -0,0 +1,89 @@ +VERSION "0.0.02" + +BO_ 513 MOTORS_DATA: 8 XXX + SG_ SPEED_L : 7|16@0- (1,0) [-1000|1000] "" XXX + SG_ SPEED_R : 23|16@0- (1,0) [-1000|1000] "" XXX + SG_ ELEC_ANGLE_L : 39|8@0+ (1,0) [0|0] "deprecated" XXX + SG_ ELEC_ANGLE_R : 47|8@0+ (1,0) [0|0] "deprecated" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 514 VAR_VALUES: 3 XXX + SG_ IGNITION : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ENABLE_MOTORS : 1|1@0+ (1,0) [0|1] "" XXX + SG_ FAULT : 7|6@0+ (1,0) [0|63] "" XXX + SG_ MOTOR_ERR_L : 15|8@0+ (1,0) [0|255] "" XXX + SG_ MOTOR_ERR_R : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 515 BODY_DATA: 4 XXX + SG_ MCU_TEMP : 7|8@0+ (0.1,0) [0|125] "" XXX + SG_ BATT_VOLTAGE : 15|16@0+ (0.01,0) [0|60] "" XXX + SG_ BATT_PERCENTAGE : 31|7@0+ (1,0) [0|100] "" XXX + SG_ CHARGER_CONNECTED : 24|1@0+ (1,0) [0|1] "" XXX + +BO_ 516 MOTORS_CURRENT: 8 XXX + SG_ LEFT_PHA_AB : 7|16@0- (1,0) [-32768|32767] "" XXX + SG_ LEFT_PHA_BC : 23|16@0- (1,0) [-32768|32767] "" XXX + SG_ RIGHT_PHA_AB : 39|16@0- (1,0) [-32768|32767] "" XXX + SG_ RIGHT_PHA_BC : 55|16@0- (1,0) [-32768|32767] "" XXX + +BO_ 517 MOTORS_ANGLE: 8 XXX + SG_ LEFT_ANGLE_SENSOR : 7|16@0+ (1,0) [0|16384] "" XXX + SG_ RIGHT_ANGLE_SENSOR : 23|16@0+ (1,0) [0|16384] "" XXX + SG_ LEFT_HALL_SENSOR : 39|16@0+ (1,0) [0|360] "" XXX + SG_ RIGHT_HALL_SENSOR : 55|16@0+ (1,0) [0|360] "" XXX + +BO_ 592 TORQUE_CMD: 6 XXX + SG_ TORQUE_L : 7|16@0- (1,0) [-1000|1000] "" XXX + SG_ TORQUE_R : 23|16@0- (1,0) [-1000|1000] "" XXX + SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 593 MAX_MOTOR_RPM_CMD: 5 XXX + SG_ MAX_RPM_L : 7|16@0+ (1,0) [0|1000] "" XXX + SG_ MAX_RPM_R : 23|16@0+ (1,0) [0|1000] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 769 KNEE_MOTORS_DATA: 8 XXX + SG_ SPEED_L : 7|16@0- (1,0) [-1000|1000] "" XXX + SG_ SPEED_R : 23|16@0- (1,0) [-1000|1000] "" XXX + SG_ ELEC_ANGLE_L : 39|8@0+ (1,0) [0|0] "deprecated" XXX + SG_ ELEC_ANGLE_R : 47|8@0+ (1,0) [0|0] "deprecated" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 770 KNEE_VAR_VALUES: 3 XXX + SG_ IGNITION : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ENABLE_MOTORS : 1|1@0+ (1,0) [0|1] "" XXX + SG_ FAULT : 7|6@0+ (1,0) [0|63] "" XXX + SG_ MOTOR_ERR_L : 15|8@0+ (1,0) [0|255] "" XXX + SG_ MOTOR_ERR_R : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 771 KNEE_DATA: 4 XXX + SG_ MCU_TEMP : 7|8@0+ (0.1,0) [0|125] "" XXX + SG_ BATT_VOLTAGE : 15|16@0+ (0.01,0) [0|60] "" XXX + SG_ BATT_PERCENTAGE : 31|7@0+ (1,0) [0|100] "" XXX + SG_ CHARGER_CONNECTED : 24|1@0+ (1,0) [0|1] "" XXX + +BO_ 772 KNEE_MOTORS_CURRENT: 8 XXX + SG_ LEFT_PHA_AB : 7|16@0- (1,0) [-32768|32767] "" XXX + SG_ LEFT_PHA_BC : 23|16@0- (1,0) [-32768|32767] "" XXX + SG_ RIGHT_PHA_AB : 39|16@0- (1,0) [-32768|32767] "" XXX + SG_ RIGHT_PHA_BC : 55|16@0- (1,0) [-32768|32767] "" XXX + +BO_ 773 KNEE_MOTORS_ANGLE: 8 XXX + SG_ LEFT_ANGLE_SENSOR : 7|16@0+ (1,0) [0|16384] "" XXX + SG_ RIGHT_ANGLE_SENSOR : 23|16@0+ (1,0) [0|16384] "" XXX + SG_ LEFT_HALL_SENSOR : 39|16@0+ (1,0) [0|360] "" XXX + SG_ RIGHT_HALL_SENSOR : 55|16@0+ (1,0) [0|360] "" XXX + +BO_ 848 KNEE_TORQUE_CMD: 6 XXX + SG_ TORQUE_L : 7|16@0- (1,0) [-1000|1000] "" XXX + SG_ TORQUE_R : 23|16@0- (1,0) [-1000|1000] "" XXX + SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 849 KNEE_MAX_MOTOR_RPM_CMD: 5 XXX + SG_ MAX_RPM_L : 7|16@0+ (1,0) [0|1000] "" XXX + SG_ MAX_RPM_R : 23|16@0+ (1,0) [0|1000] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/fca_giorgio.dbc b/artifacts/package_runtime/iqdbc/dbc/fca_giorgio.dbc new file mode 100644 index 000000000..f3e22cf41 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/fca_giorgio.dbc @@ -0,0 +1,243 @@ +BO_ 171 NEW_MSG_AB: 8 XXX + SG_ NEW_SIGNAL_5 : 3|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_6 : 21|6@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_1 : 23|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 51|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_4 : 55|4@0+ (1,0) [0|15] "" XXX + +BO_ 222 EPS_1: 6 EPS + SG_ STEERING_ANGLE : 5|14@0+ (0.1,-716.8) [0|16383] "deg" XXX + SG_ STEERING_RATE : 19|12@0+ (0.5,-1000) [0|4095] "deg/s" XXX + SG_ UNKNOWN_1 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 228 NEW_MSG_E4: 6 XXX + SG_ NEW_SIGNAL_1 : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 238 ABS_1: 8 ABS + SG_ WHEEL_SPEED_FL : 7|13@0+ (0.017,0) [0|8191] "m/s" XXX + SG_ WHEEL_SPEED_FR : 10|13@0+ (0.017,0) [0|8191] "m/s" XXX + SG_ WHEEL_SPEED_RL : 29|13@0+ (0.017,0) [0|8191] "m/s" XXX + SG_ WHEEL_SPEED_RR : 32|13@0+ (0.017,0) [0|8191] "m/s" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 241 NEW_MSG_F1: 8 XXX + SG_ MAYBE_VOLTAGE : 18|10@0+ (0.02,0) [0|1023] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 249 NEW_MSG_F9: 4 XXX + SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 250 ABS_3: 8 ABS + SG_ BRAKE_PRESSURE_THRESHOLD : 2|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PEDAL_SWITCH : 3|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 9|2@0+ (1,0) [0|3] "" XXX + SG_ XCOUNTER : 38|4@0+ (1,0) [0|15] "" XXX + SG_ XCHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 252 ENGINE_1: 8 ENGINE + SG_ ENGINE_RPM : 7|14@0+ (1,0) [0|255] "rev/min" XXX + SG_ ACCEL_PEDAL : 20|8@0+ (0.4,0) [0|255] "percent" XXX + SG_ REVERSE : 26|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 46|2@1+ (1,0) [0|3] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 254 ABS_2: 8 ABS + SG_ LONG_ACCEL : 7|12@0+ (0.01,-20.48) [0|4095] "m/s2" XXX + SG_ LATERAL_ACCEL : 11|12@0+ (0.01,-20.48) [0|4095] "m/s2" XXX + SG_ YAW_RATE : 31|12@0+ (-0.0014,2.86) [0|4095] "rad/s" XXX + SG_ NEW_SIGNAL_1 : 47|9@0+ (1,0) [0|511] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 257 ABS_6: 8 ABS + SG_ MAYBE_ACC_BRAKE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ VEHICLE_SPEED : 15|11@0+ (0.017,0) [0|2047] "" XXX + SG_ BRAKE_PRESSURE_1 : 20|11@0+ (1,0) [0|2047] "" XXX + SG_ BRAKE_PRESSURE_2 : 43|12@0+ (1,0) [0|4095] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 262 EPS_2: 7 EPS + SG_ UNKNOWN_TORQUE : 7|12@0+ (1,-2000) [0|4095] "" XXX + SG_ UNKNOWN_1 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN_STATUS : 9|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_TORQUE : 23|11@0+ (1,-1024) [0|2047] "" XXX + SG_ UNKNOWN_2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_STATUS : 38|2@0+ (1,0) [0|3] "" XXX + SG_ LKA_FAULT : 39|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 43|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 263 ABS_4: 8 ABS + SG_ BRAKE_PRESSURE : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 265 NEW_MSG_109: 8 XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 270 ABS_7: 7 XXX + SG_ LONG_ACCEL_RAW : 7|12@0+ (0.01,-20.48) [0|4095] "" XXX + SG_ LATERAL_ACCEL_RAW : 11|12@0+ (0.01,-20.48) [0|4095] "" XXX + SG_ YAW_RATE_RAW : 31|12@0+ (-0.0014,2.86) [0|4095] "" XXX + SG_ COUNTER : 43|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 278 ABS_5: 8 ABS + SG_ WHEEL_IMPULSE_FL : 7|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_IMPULSE_FR : 15|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_IMPULSE_RL : 23|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_IMPULSE_RR : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ACTIVE_FL : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ACTIVE_FR : 33|1@0+ (1,0) [0|1] "" XXX + SG_ ACTIVE_RL : 34|1@0+ (1,0) [0|1] "" XXX + SG_ ACTIVE_RR : 35|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_1 : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_1 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_2 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_2 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 280 NEW_MSG_118: 6 XXX + SG_ COUNTER : 35|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 282 NEW_MSG_11A: 8 XXX + SG_ NEW_SIGNAL_1 : 7|11@0+ (1,-1000) [0|2047] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 284 NEW_MSG_11C: 8 XXX + SG_ NEW_SIGNAL_1 : 7|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_2 : 11|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_3 : 28|13@0+ (1,0) [0|8191] "" XXX + SG_ NEW_SIGNAL_4 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ VEHICLE_SPEED : 47|12@0+ (0.017,0) [0|4095] "m/s" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 288 NEW_MSG_120: 6 XXX + SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 290 EPS_3: 4 EPS + SG_ EPS_TORQUE : 7|12@0+ (1,-2048) [0|4095] "" XXX + SG_ COUNTER : 19|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 501 NEW_MSG_1F5: 5 XXX + SG_ NEW_SIGNAL_2 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 27|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 502 LKA_COMMAND: 8 CAMERA + SG_ LKA_TORQUE : 7|11@0+ (1,-1024) [0|2047] "" XXX + SG_ HAPTIC_WARN_1 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_ACTIVE : 11|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ HAPTIC_WARN_2 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 508 NEW_MSG_1FC: 8 XXX + SG_ NEW_SIGNAL_1 : 6|1@0+ (1,0) [0|1] "" XXX + +BO_ 601 NEW_MSG_259: 8 XXX + SG_ NEW_SIGNAL_1 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 762 NEW_MSG_2FA: 3 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 766 CAM_UNKNOWN_1: 4 CAMERA + +BO_ 900 NEW_MSG_384: 8 XXX + SG_ NEW_SIGNAL_1 : 19|3@0+ (1,0) [0|7] "" XXX + +BO_ 1040 NEW_MSG_410: 8 XXX + SG_ NEW_SIGNAL_3 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 49|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1046 NEW_MSG_416: 8 XXX + SG_ MUX M : 1|2@0+ (1,0) [0|3] "" XXX + SG_ UNKNOWN_M0_1 m0 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_2 m0 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_3 m0 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_4 m0 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_5 m0 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_6 m0 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M0_7 m0 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_1 m1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_2 m1 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_3 m1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_4 m1 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_5 m1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_6 m1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M1_7 m1 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_1 m2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_2 m2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_3 m2 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_4 m2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_5 m2 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_6 m2 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_M2_7 m2 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1194 CAM_UNKNOWN_2: 8 CAMERA + +BO_ 1198 LKA_HUD_1: 8 CAMERA + SG_ NEW_SIGNAL_1 : 4|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_3 : 12|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 38|3@0+ (1,0) [0|7] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1351 LKA_HUD_2: 8 CAMERA + SG_ NEW_SIGNAL_1 : 51|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 55|4@0+ (1,0) [0|15] "" XXX + +BO_ 1442 ACC_1: 8 RADAR + SG_ HUD_SPEED : 7|8@0+ (1,0) [0|255] "km/h" XXX + SG_ TARGET_SPEED : 15|8@0+ (0.433,0) [0|255] "m/s" XXX + SG_ NEW_SIGNAL_3 : 17|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_4 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_STATUS : 22|2@0+ (1,0) [0|3] "" XXX + SG_ MAYBE_TJA : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1458 CAM_UNKNOWN_5: 4 CAMERA + SG_ NEW_SIGNAL_1 : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 1854 BCM_1: 4 BCM + SG_ RIGHT_TURN_STALK : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_TURN_STALK : 17|1@0+ (1,0) [0|1] "" XXX + +BO_ 1865 NEW_MSG_749: 8 XXX + SG_ NEW_SIGNAL_1 : 23|2@0+ (1,0) [0|3] "" XXX + +BO_ 506855454 CAM_UNKNOWN_6: 1 CAMERA + +CM_ SG_ 254 LONG_ACCEL "scale TBD"; +CM_ SG_ 254 LATERAL_ACCEL "scale TBD"; +CM_ SG_ 254 YAW_RATE "scale estimated"; +CM_ SG_ 257 MAYBE_ACC_BRAKE "may correlate with ACC-actuated braking"; +CM_ SG_ 278 FORWARD_1 "probably per-axle"; +CM_ SG_ 278 REVERSE_1 "probably per-axle"; +CM_ SG_ 278 FORWARD_2 "probably per-axle"; +CM_ SG_ 278 REVERSE_2 "probably per-axle"; +CM_ SG_ 282 NEW_SIGNAL_1 "smoothed yaw rate with low speed cutoff, maybe active forward lighting target angle"; +CM_ SG_ 284 VEHICLE_SPEED "scale estimated"; +CM_ SG_ 502 HAPTIC_WARN_1 "correlates with steering wheel haptic"; +CM_ SG_ 502 HAPTIC_WARN_2 "correlates with steering wheel haptic"; +CM_ BO_ 1198 "Definite LKA activity, probably contains lane-line recognition and lane departure signals, indicator of LKA vs TJA, perhaps indicator of active assist in map-permitted areas"; +VAL_ 262 LKA_STATUS 0 "standby" 1 "lka_active"; diff --git a/artifacts/package_runtime/iqdbc/dbc/ford_cgea1_2_bodycan_2011.dbc b/artifacts/package_runtime/iqdbc/dbc/ford_cgea1_2_bodycan_2011.dbc new file mode 100644 index 000000000..49fcae19c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/ford_cgea1_2_bodycan_2011.dbc @@ -0,0 +1,1070 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 58 BCM_m_FrP01: 8 XXX + SG_ ChildLockCmd : 13|1@0+ (1,0) [0|0] "" XXX + SG_ ChildLockCmd_UB : 12|1@0+ (1,0) [0|0] "" XXX + SG_ CLockCmd : 31|8@0+ (1,0) [0|0] "" XXX + SG_ CLockCmd_UB : 14|1@0+ (1,0) [0|0] "" XXX + SG_ DDShortDrop : 3|2@0+ (1,0) [0|0] "" XXX + SG_ DDShortDrop_UB : 4|1@0+ (1,0) [0|0] "" XXX + SG_ DirectionIndication : 11|2@0+ (1,0) [0|0] "" XXX + SG_ DirectionIndication_UB : 0|1@0+ (1,0) [0|0] "" XXX + SG_ EpsDrvInfo_D_Dsply : 36|4@0+ (1,0) [0|0] "" XXX + SG_ EpsDrvInfo_D_Dsply_UB : 39|1@0+ (1,0) [0|0] "" XXX + SG_ GearRvrseActv_D_Actl : 38|2@0+ (1,0) [0|0] "" XXX + SG_ GearRvrseActv_D_Actl_UB : 15|1@0+ (1,0) [0|0] "" XXX + SG_ VehVActlEng_D_Qf_3A : 9|2@0+ (1,0) [0|0] "" XXX + SG_ Veh_V_ActlEng_UB_3A : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Veh_V_ActlEng_3A : 55|16@0+ (0.01,0) [0|0] "kph" XXX + SG_ Veh_V_DsplyCcSet : 23|8@0+ (1,0) [0|0] "" XXX + SG_ Veh_V_RqCcSet : 32|9@0+ (0.5,0) [0|0] "kph" XXX + SG_ WasherFluidLevelLow : 5|1@0+ (1,0) [0|0] "" XXX + +BO_ 64 BCM_m_FrP02: 8 XXX + SG_ FuelCutoffReq : 7|4@0+ (1,0) [0|0] "" XXX + SG_ FuelCutoffReq_UB : 8|1@0+ (1,0) [0|0] "" XXX + SG_ KVRFRSettings : 54|15@0+ (1,0) [0|0] "" XXX + SG_ KVRFRSettings_UB : 10|1@0+ (1,0) [0|0] "" XXX + SG_ PsngrFrntDetct_D_Actl : 23|2@0+ (1,0) [0|0] "" XXX + SG_ PsngrFrntDetct_D_Actl_UB : 3|1@0+ (1,0) [0|0] "" XXX + SG_ RILReq : 21|2@0+ (1,0) [0|0] "" XXX + SG_ RILReq_UB : 55|1@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBuckleDriver : 31|2@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBuckleDriver_UB : 0|1@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBuckleMid : 29|2@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBuckleMid_UB : 15|1@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBucklePsngr : 27|2@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBucklePsngr_UB : 14|1@0+ (1,0) [0|0] "" XXX + SG_ ThirdRowBuckleDriver : 25|2@0+ (1,0) [0|0] "" XXX + SG_ ThirdRowBuckleDriver_UB : 13|1@0+ (1,0) [0|0] "" XXX + SG_ ThirdRowBucklePsngr : 37|2@0+ (1,0) [0|0] "" XXX + SG_ ThirdRowBucklePsngr_UB : 11|1@0+ (1,0) [0|0] "" XXX + SG_ WheelRotationCnt : 47|8@0+ (1,0) [0|0] "" XXX + SG_ WheelRotationCnt_UB : 9|1@0+ (1,0) [0|0] "" XXX + SG_ WheelRotationCntQF : 35|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRr_D_Actl_UB_40 : 2|1@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRr_D_Actl_40 : 39|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRl_D_Actl_UB_40 : 1|1@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRl_D_Actl_40 : 33|2@0+ (1,0) [0|0] "" XXX + +BO_ 131 MS_Steering_Data: 8 XXX + SG_ SteColumn_Status_UB : 28|1@0+ (1,0) [0|0] "" XXX + SG_ SteColumn_Status : 31|3@0+ (1,0) [0|0] "" XXX + SG_ SteCol_Manual_Override_UB : 26|1@0+ (1,0) [0|0] "" XXX + SG_ SteCol_Manual_Override : 27|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Send_UB : 20|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Send : 6|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Phone_UB : 17|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Phone : 3|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_OK_UB : 16|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_OK : 2|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Volume_Up_UB : 23|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Volume_Down_UB : 22|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Voice_PTT_UB : 21|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Seek_Right_UB : 19|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Seek_Left_UB : 18|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Mode_UB : 11|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Mode : 13|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Media_UB : 9|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Volume_Up : 15|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Volume_Down : 14|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Voice_PTT : 7|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Seek_Right : 5|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Seek_Left : 4|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Media : 1|1@0+ (1,0) [0|0] "" XXX + SG_ VehYaw_W_Actl : 55|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX + SG_ SteWhlCtl_End_UB : 8|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_End : 0|1@0+ (1,0) [0|0] "" XXX + SG_ VehYaw_W_Actl_UB : 40|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Mute_UB : 10|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Mute : 12|1@0+ (1,0) [0|0] "" XXX + +BO_ 257 Driver_Seat_Information: 8 XXX + SG_ Reverse_Mirror_Stat : 3|2@0+ (1,0) [0|0] "" XXX + SG_ Memory_Feedback_Rqst : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Easy_Entry_Exit_Stat : 7|2@0+ (1,0) [0|0] "" XXX + +BO_ 260 Driver_Seat_Information_2: 8 XXX + SG_ Memory_Cmd : 15|4@0+ (1,0) [0|0] "" XXX + SG_ Easy_Entry_Rqst : 4|2@0+ (1,0) [0|0] "" XXX + SG_ DrvSeat_Stat : 7|3@0+ (1,0) [0|0] "" XXX + SG_ Cancel_Auto_Movement : 1|1@0+ (1,0) [0|0] "" XXX + +BO_ 269 IdleShutdown_Legacy: 8 XXX + SG_ IDLE_ENGINE_SHUTDOWN : 23|2@0+ (1,0) [0|0] "" XXX + +BO_ 272 Keyfob_Pad_Stat: 8 XXX + SG_ L_Pwr_Sliding_Dr_Rqst : 28|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Decklid_Rqst : 31|1@0+ (1,0) [0|0] "" XXX + SG_ R_Pwr_Sliding_Dr_Rqst : 29|1@0+ (1,0) [0|0] "" XXX + SG_ Keyfob_Pad_Msg_Count : 23|8@0+ (1,0) [0|0] "Counts" XXX + SG_ Keyfob_Pad_Id_Number : 15|8@0+ (1,0) [0|0] "" XXX + SG_ Keyfob_Pad_Button_Pressed : 7|8@0+ (1,0) [0|0] "" XXX + SG_ Power_Liftgate_Rqst : 30|1@0+ (1,0) [0|0] "" XXX + SG_ Keycode_Status : 27|20@0+ (1,0) [0|0] "" XXX + +BO_ 275 Power_Liftgate_Mode_StatM: 8 XXX + SG_ Power_Liftgate_Mode_Stat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ DrTgateChime_D_Rq : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 276 Running_Board_CmdM: 8 XXX + SG_ Running_Board_Cmd : 7|2@0+ (1,0) [0|0] "" XXX + +BO_ 277 Running_Board_StatM: 8 XXX + SG_ Running_Board_Stat : 7|2@0+ (1,0) [0|0] "" XXX + +BO_ 288 ClmtCtrlSeat_SetCmdlegacy1: 8 XXX + SG_ ClmtCtrlSeat_SetCmd_Dvr : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 289 ClmtCtrlSeat_SetStat_DvrM: 8 XXX + SG_ ClmtCtrlSeat_SetStat_Dvr : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 290 ClmtCtrlSeat_SetCmdlegacy2: 8 XXX + SG_ ClmtCtrlSeat_SetCmd_Psgr : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 291 ClmtCtrlSeat_SetStat_PsgrM: 8 XXX + SG_ ClmtCtrlSeat_SetStat_Psgr : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 292 ClmtCtrlSeatSet_Cmd_v2_MS: 8 XXX + SG_ ClmtCtrlSeat_SetCmd_Psgr : 15|8@0+ (1,0) [0|0] "" XXX + SG_ ClmtCtrlSeat_SetCmd_Dvr : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 293 ClmtCtrlSeatSet_Stat_v2: 8 XXX + SG_ ClmtCtrlSeat_SetStat_Psgr : 15|8@0+ (1,0) [0|0] "" XXX + SG_ ClmtCtrlSeat_SetStat_Dvr : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 304 Mirror_Manual_Override_M: 8 XXX + SG_ Mirror_Manual_Override : 7|1@0+ (1,0) [0|0] "Binary" XXX + +BO_ 305 Memory_Sw_StatM: 8 XXX + SG_ Memory_Sw_Message_Count : 15|8@0+ (1,0) [0|0] "Counts" XXX + SG_ Memory_Set_Sw_Stat : 7|1@0+ (1,0) [0|0] "Binary" XXX + SG_ Memory_Set_Cancel : 3|1@0+ (1,0) [0|0] "Binary" XXX + SG_ Memory_3_Sw_Stat : 4|1@0+ (1,0) [0|0] "Binary" XXX + SG_ Memory_2_Sw_Stat : 5|1@0+ (1,0) [0|0] "Binary" XXX + SG_ Memory_1_Sw_Stat : 6|1@0+ (1,0) [0|0] "Binary" XXX + +BO_ 306 Driver_Lock_Sw_StatM: 8 XXX + SG_ Driver_Door_Key_Unlock : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Driver_Door_Key_Lock : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Driver_Lock_Sw_Message_Cnt : 7|8@0+ (1,0) [0|0] "Counts" XXX + SG_ Driver_Lock_Sw_Stat : 15|2@0+ (1,0) [0|0] "" XXX + +BO_ 309 Memory_Cancel_Cmd_M: 8 XXX + SG_ Memory_Cancel_Cmd : 7|1@0+ (1,0) [0|0] "Binary" XXX + +BO_ 310 Driver_Door_Lock_CmdM: 8 XXX + SG_ Driver_Door_Lock_Msg_Cnt : 7|8@0+ (1,0) [0|0] "Counts" XXX + SG_ Driver_Door_Lock_Cmd : 15|4@0+ (1,0) [0|0] "" XXX + +BO_ 311 Pass_Mirror_Sw_StatM: 8 XXX + SG_ Pass_Mirror_Sw_UD_Stat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Pass_Mirror_Sw_LR_Stat : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 313 RPwrSlideDr_Unlock_RqstM: 8 XXX + SG_ RPwrSlideDr_Unlock_Rqst : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 320 LPwrSlideDr_Unlock_RqstM: 8 XXX + SG_ LPwrSlideDr_Unlock_Rqst : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 321 Passive_Entry_Ctrl_Data: 8 XXX + SG_ PE_Control_Data_1 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Control_Cmd : 7|3@0+ (1,0) [0|0] "" XXX + SG_ PK_SearchResults_Prog : 63|4@0+ (1,0) [0|0] "" XXX + SG_ PK_SearchResults_MyKey : 4|4@0+ (1,0) [0|0] "" XXX + SG_ PK_SearchResults_Found : 59|4@0+ (1,0) [0|0] "" XXX + SG_ PK_Search_EvNum : 15|8@0+ (1,0) [0|0] "Counts" XXX + SG_ PE_Control_Data_5 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Control_Data_4 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Control_Data_3 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Control_Data_2 : 31|8@0+ (1,0) [0|0] "" XXX + +BO_ 322 Passive_Entry_Target_Data: 8 XXX + SG_ PE_Target_Data_5 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Target_Cmd : 7|2@0+ (1,0) [0|0] "" XXX + SG_ PE_Target_Status : 5|1@0+ (1,0) [0|0] "" XXX + SG_ PE_Target_Data_1 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Search_Rqst : 4|2@0+ (1,0) [0|0] "" XXX + SG_ PE_Target_Data_4 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Target_Data_3 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Target_Data_2 : 23|8@0+ (1,0) [0|0] "" XXX + +BO_ 577 BCM_m_FrP28: 8 XXX + SG_ WheelRotToothCntFrL : 15|8@0+ (1,0) [0|0] "" XXX + SG_ WheelRotToothCntFrL_UB : 42|1@0+ (1,0) [0|0] "" XXX + SG_ WheelRotToothCntFrR : 23|8@0+ (1,0) [0|0] "" XXX + SG_ WheelRotToothCntFrR_UB : 41|1@0+ (1,0) [0|0] "" XXX + SG_ WheelRotToothCntReL : 31|8@0+ (1,0) [0|0] "" XXX + SG_ WheelRotToothCntReL_UB : 40|1@0+ (1,0) [0|0] "" XXX + SG_ WheelRotToothCntReR : 39|8@0+ (1,0) [0|0] "" XXX + SG_ WheelRotToothCntReR_UB : 43|1@0+ (1,0) [0|0] "" XXX + +BO_ 736 FCIM_Button_Press: 8 XXX + SG_ FCIM_Target_ID : 13|4@0+ (1,0) [0|0] "" XXX + SG_ FCIM_Button_Type : 7|8@0+ (1,0) [0|0] "" XXX + SG_ FCIM_Button_State : 15|2@0+ (1,0) [0|0] "" XXX + +BO_ 806 Compressor_Req: 8 XXX + SG_ HvacEvap_Te_Rq : 33|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + SG_ HvacEvap_Te_Actl : 17|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + SG_ HvacAirCond_B_Rq : 7|1@0+ (1,0) [0|0] "" XXX + SG_ HvacEvap_Te_Offst : 1|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + +BO_ 842 MassageSeat_Data1: 8 XXX + SG_ SeatLmbrUpDrv_Pc_Actl : 38|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatLmbrMidDrv_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatLmbrLoDrv_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatBlUpDrv_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatBlLoDrv_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX + +BO_ 843 MassageSeat_Data2: 8 XXX + SG_ SeatLmbrUpPsgr_Pc_Actl : 38|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatLmbrMidPsgr_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatLmbrLoPsgr_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatBlUpPsgr_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatBlLoPsgr_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX + +BO_ 844 MassageSeat_Stat1: 8 XXX + SG_ StmsLmbrDrv_D_Stat : 17|2@0+ (1,0) [0|0] "" XXX + SG_ StmsCshnDrv_D_Stat : 19|2@0+ (1,0) [0|0] "" XXX + SG_ SeatSwtchDrv_B_Stat : 31|1@0+ (1,0) [0|0] "" XXX + SG_ SeatFnDrv_D_Stat : 23|3@0+ (1,0) [0|0] "" XXX + SG_ SeatAirAmb_P_Actl : 7|16@0+ (0.01,0) [0|0] "KiloPascal" XXX + SG_ SeatPDrv_B_Stat : 20|1@0+ (1,0) [0|0] "" XXX + +BO_ 845 MassageSeat_Stat2: 8 XXX + SG_ StmsLmbrPsgr_D_Stat : 15|2@0+ (1,0) [0|0] "" XXX + SG_ StmsCshnPsgr_D_Stat : 13|2@0+ (1,0) [0|0] "" XXX + SG_ SeatSwtchPsgr_B_Stat : 11|1@0+ (1,0) [0|0] "" XXX + SG_ SeatPPsgr_B_Stat : 7|1@0+ (1,0) [0|0] "" XXX + SG_ SeatFnPsgr_D_Stat : 6|3@0+ (1,0) [0|0] "" XXX + SG_ PsgrMemFeedback_Rsp : 3|4@0+ (1,0) [0|0] "" XXX + +BO_ 846 MassageSeat_Req_MS: 8 XXX + SG_ SeatFnPsgr_D_Rq : 15|3@0+ (1,0) [0|0] "" XXX + SG_ SeatFnDrv_D_Rq : 12|3@0+ (1,0) [0|0] "" XXX + SG_ SeatFnDfaltPsgr_B_Rq : 9|1@0+ (1,0) [0|0] "" XXX + SG_ SeatFnDfaltDrv_B_Rq : 8|1@0+ (1,0) [0|0] "" XXX + SG_ SeatFnChngPsgr_D_Rq : 7|2@0+ (1,0) [0|0] "" XXX + SG_ SeatFnChngDrv_D_Rq : 5|2@0+ (1,0) [0|0] "" XXX + SG_ PsgrMemory_Rq : 3|4@0+ (1,0) [0|0] "" XXX + +BO_ 849 MassageSeat_Data3: 8 XXX + SG_ SeatCshnDrvRR_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnDrvRL_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnDrvFR_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnDrvFL_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX + +BO_ 850 MassageSeat_Data4: 8 XXX + SG_ SeatCshnPsgrRR_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnPsgrRL_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnPsgrFR_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnPsgrFL_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX + +BO_ 853 EFP_CC_Status_MS: 8 XXX + SG_ Save_My_Temp : 59|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Left_Temp_Setpt : 31|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RrDefrost_HtdMirrorReq : 60|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Control_Status : 16|1@0+ (1,0) [0|0] "" XXX + SG_ MultipleButtonPressReq : 63|3@0+ (1,0) [0|0] "" XXX + SG_ Rear_System_Mode_Req : 19|3@0+ (1,0) [0|0] "" XXX + SG_ Recirc_Request : 23|2@0+ (1,0) [0|0] "" XXX + SG_ Front_Rt_Temp_Setpt : 39|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ AC_Request : 21|2@0+ (1,0) [0|0] "" XXX + SG_ Windshield_ModeRequest : 15|4@0+ (8.33,0) [0|0] "%" XXX + SG_ Panel_Mode_Request : 7|4@0+ (8.33,0) [0|0] "%" XXX + SG_ Overriding_ModeReq : 10|3@0+ (1,0) [0|0] "" XXX + SG_ Floor_Mode_Request : 3|4@0+ (8.33,0) [0|0] "%" XXX + SG_ Rear_Right_Temp_Setpt : 55|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ Forced_Recirc_Req : 11|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Left_Temp_Setpt : 47|8@0+ (1,0) [0|0] "Mixed" XXX + +BO_ 854 EFP_CC_Seat_Req_Stat_MS: 8 XXX + SG_ Front_Rear_Blower_Req : 31|6@0+ (1,0) [0|0] "Detents" XXX + SG_ Pass_Rr_Cond_Seat_Req : 21|2@0+ (1,0) [0|0] "" XXX + SG_ Pass_Rr_Cond_Seat_Lvl : 8|3@0+ (1,0) [0|0] "" XXX + SG_ Pass_Fr_Cond_Seat_Req : 13|2@0+ (1,0) [0|0] "" XXX + SG_ Pass_Fr_Cond_Seat_Lvl : 11|3@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Rr_Cond_Seat_Req : 15|2@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Rr_Cond_Seat_Lvl : 2|3@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Fr_Cond_Seat_Req : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Fr_Cond_Seat_Lvl : 5|3@0+ (1,0) [0|0] "" XXX + +BO_ 855 RCCM_CC_Status: 8 XXX + SG_ RrBlwrCondStLdShedStat : 25|2@0+ (1,0) [0|0] "" XXX + SG_ FrBlwrCondStLdShedStat : 20|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_Rr_Rt_TempSetpt : 63|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RCCM_Rr_Left_TempSetpt : 55|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RCCM_Fr_Rt_TempSetpt : 47|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RCCM_Fr_Left_TempSetpt : 39|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RCCM_Fr_Rr_Blower_Req : 31|6@0+ (1,0) [0|0] "Detents" XXX + SG_ Panel_Mode_State : 7|4@0+ (8.33,0) [0|0] "%" XXX + SG_ RrDefHtdMirrLdShedStat : 18|2@0+ (1,0) [0|0] "" XXX + SG_ Windshield_Mode_State : 15|4@0+ (8.33,0) [0|0] "%" XXX + SG_ Recirc_Door_State : 11|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_System_Mode_State : 23|3@0+ (1,0) [0|0] "" XXX + SG_ Default_Defrost_State : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Auto_AC_Indicator_Temp : 16|1@0+ (1,0) [0|0] "" XXX + SG_ Floor_Mode_State : 3|4@0+ (8.33,0) [0|0] "%" XXX + SG_ RrDefrost_HtdMirrState : 8|1@0+ (1,0) [0|0] "" XXX + +BO_ 856 RCCM_CC_Seat_Status: 8 XXX + SG_ Active_My_Temp : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CC_HtdStrWhl_Req : 24|1@0+ (1,0) [0|0] "" XXX + SG_ RCCM_PR_Cond_Seat_Lvl : 31|3@0+ (1,0) [0|0] "" XXX + SG_ RCCM_PR_Cond_Seat_Req : 28|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_PF_Cond_Seat_Req : 20|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_PF_Cond_Seat_Lvl : 23|3@0+ (1,0) [0|0] "" XXX + SG_ RCCM_DR_Cond_Seat_Req : 12|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_DR_Cond_Seat_Lvl : 15|3@0+ (1,0) [0|0] "" XXX + SG_ RCCM_DF_Cond_Seat_Req : 4|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_DF_Cond_Seat_Lvl : 7|3@0+ (1,0) [0|0] "" XXX + SG_ PassRrCondStLdShedStat : 26|2@0+ (1,0) [0|0] "" XXX + SG_ PassFrCondStLdShedStat : 18|2@0+ (1,0) [0|0] "" XXX + SG_ DrvRrCondStLdShedStat : 10|2@0+ (1,0) [0|0] "" XXX + SG_ DrvFrCondStLdShedStat : 1|2@0+ (1,0) [0|0] "" XXX + +BO_ 857 RCCM_CC_MBP_Press_Stat: 8 XXX + SG_ Report_Active : 33|2@0+ (1,0) [0|0] "" XXX + SG_ Pass_Temp_Units : 35|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Fan_Bars_Disply : 39|3@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Temp_Units : 36|1@0+ (1,0) [0|0] "" XXX + SG_ MultBtnPushDsplyPass10 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ MultBtnPushDsplyPass1 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ MultBtnPushDsplyDrvr10 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ MultBtnPushDsplyDrvr1 : 15|8@0+ (1,0) [0|0] "" XXX + +BO_ 859 MFD_CC_Status_MS: 8 XXX + SG_ Rear_Mode_Bttn_Status : 38|1@0+ (1,0) [0|0] "" XXX + +BO_ 860 EFP_CC_Info_Status_MS: 8 XXX + SG_ Rear_Panel_Btn_State : 41|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Floor_Btn_State : 40|1@0+ (1,0) [0|0] "" XXX + SG_ HtdStrWhl_SftBtt_Stt : 39|2@0+ (1,0) [0|0] "" XXX + SG_ AC_Sft_Button_State : 23|2@0+ (1,0) [0|0] "" XXX + SG_ DrvRrCondSeatSftBttnSt : 47|3@0+ (1,0) [0|0] "" XXX + SG_ DrvFrCondSeatSftBtnStt : 37|3@0+ (1,0) [0|0] "" XXX + SG_ CC_RecircSBtn_St : 27|2@0+ (1,0) [0|0] "" XXX + SG_ CC_RrDefrSBtn_St : 24|1@0+ (1,0) [0|0] "" XXX + SG_ PasRrCondSeatSftBttnSt : 44|3@0+ (1,0) [0|0] "" XXX + SG_ PasFrCondSeatSftBtnStt : 34|3@0+ (1,0) [0|0] "" XXX + SG_ MyTemp_Soft_Bttn_State : 25|1@0+ (1,0) [0|0] "" XXX + SG_ CC_MaxACSBtn_St : 28|1@0+ (1,0) [0|0] "" XXX + SG_ RearPowerButtonState : 16|1@0+ (1,0) [0|0] "" XXX + SG_ RearCoolBarsDisplayed : 11|3@0+ (1,0) [0|0] "Bars_On" XXX + SG_ Rear_Sft_Control_Stat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ CC_RrNeutralBarDsp_St : 8|1@0+ (1,0) [0|0] "" XXX + SG_ CC_RrHeatBarsDsp_St : 31|3@0+ (1,0) [0|0] "Bars_On" XXX + SG_ Rear_Fan_Bars_Displayed : 19|3@0+ (1,0) [0|0] "" XXX + SG_ CC_RrCtrlBtn_St : 20|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Auto_Button_State : 21|1@0+ (1,0) [0|0] "" XXX + SG_ CC_FrPowerSBtn_St : 14|1@0+ (1,0) [0|0] "" XXX + SG_ CC_FrDefrostSBtn_St : 15|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_Soft_Btn_Stt : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_MODE_State : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_FAN_State : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Dual_Button_State : 12|1@0+ (1,0) [0|0] "" XXX + SG_ CC_BarPnlSBtn_St : 5|1@0+ (1,0) [0|0] "" XXX + SG_ CC_BarPnFlrSBtn_St : 4|1@0+ (1,0) [0|0] "" XXX + SG_ CC_BarFlrWsSBtn_St : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CC_BarDrvFlrSBtn_St : 3|1@0+ (1,0) [0|0] "" XXX + +BO_ 861 HSWheel_CC_Info_Stat: 8 XXX + SG_ HtdStrWhl_SftBtt_State : 57|2@0+ (1,0) [0|0] "" XXX + +BO_ 862 Climate_Control_Data_2: 8 XXX + SG_ HvacRec_Pc_Est : 31|7@0+ (1,0) [0|0] "%" XXX + SG_ HvacEngIdleInc_B_Rq : 24|1@0+ (1,0) [0|0] "" XXX + SG_ HvacAir_Flw_Est : 13|9@0+ (0.5,0) [0|0] "liter/second" XXX + SG_ AmbTempImpr : 7|10@0+ (0.25,-128.0) [0|0] "degreesC" XXX + +BO_ 900 Vehicle_Access_RqstM: 8 XXX + SG_ PE_AssocConfirm_D_Actl : 63|3@0+ (1,0) [0|0] "" XXX + SG_ DrTgateOpen_D_RqRfa : 51|2@0+ (1,0) [0|0] "" XXX + SG_ PE_Decklid_Inhibit_Rqst : 53|2@0+ (1,0) [0|0] "" XXX + SG_ PK_Program : 45|2@0+ (1,0) [0|0] "" XXX + SG_ PE_Packet_Cnt : 31|8@0+ (1,0) [0|0] "Counts" XXX + SG_ PE_Control_Status : 33|2@0+ (1,0) [0|0] "" XXX + SG_ PE_Control_Code : 7|8@0+ (1,0) [0|0] "" XXX + SG_ PE_Perimeter_Lighting_Stat : 15|2@0+ (1,0) [0|0] "" XXX + SG_ PE_RKE_Flash_Rqst : 34|1@0+ (1,0) [0|0] "" XXX + SG_ PE_Lock_EvNum : 23|8@0+ (1,0) [0|0] "Counts" XXX + SG_ PE_Lock_Requestor : 39|5@0+ (1,0) [0|0] "" XXX + SG_ PE_Lock_Sub_Id : 11|4@0+ (1,0) [0|0] "" XXX + SG_ PE_Lock_Status : 13|2@0+ (1,0) [0|0] "" XXX + SG_ PE_DrvCfg_Horn_Rqst : 47|2@0+ (1,0) [0|0] "" XXX + SG_ PEBackupSlot_Stats : 55|2@0+ (1,0) [0|0] "" XXX + SG_ PE_Fob_Number : 43|4@0+ (1,0) [0|0] "Number" XXX + SG_ PE_Keypad_LiftGlass_Rqst : 49|1@0+ (1,0) [0|0] "" XXX + +BO_ 901 Vehicle_Lock_Status: 8 XXX + SG_ CntrStkKeycodeActl : 55|16@0+ (1,0) [0|0] "" XXX + SG_ CntrStk_D_RqAssoc_UB : 40|1@0+ (1,0) [0|0] "" XXX + SG_ CntrStk_D_RqAssoc : 43|3@0+ (1,0) [0|0] "" XXX + SG_ KeyTypeChngMykey_D_Rq : 45|2@0+ (1,0) [0|0] "" XXX + SG_ Veh_Lock_Sub_Id : 21|4@0+ (1,0) [0|0] "" XXX + SG_ Veh_Lock_Status : 17|2@0+ (1,0) [0|0] "" XXX + SG_ Veh_Lock_Requestor : 39|5@0+ (1,0) [0|0] "" XXX + SG_ Veh_Lock_EvNum : 31|8@0+ (1,0) [0|0] "Counts" XXX + SG_ Trim_Switch_Status_Count : 15|8@0+ (1,0) [0|0] "Counts" XXX + SG_ Trim_Switch_Status : 23|2@0+ (1,0) [0|0] "" XXX + SG_ DF_KeyCyl_Switch_Stat_Cnt : 7|8@0+ (1,0) [0|0] "Counts" XXX + SG_ DF_KeyCyl_Switch_Stat : 34|2@0+ (1,0) [0|0] "" XXX + SG_ Perimeter_Alarm_Status : 47|2@0+ (1,0) [0|0] "" XXX + SG_ KeyTypeChngMykey_D_Rq_UB : 32|1@0+ (1,0) [0|0] "" XXX + +BO_ 902 Remote_Start: 8 XXX + SG_ Remote_Start_Req : 7|2@0+ (1,0) [0|0] "" XXX + +BO_ 903 CC_FCIM_Update: 8 XXX + SG_ Rr_Temp_M_H_Heat_Ind : 30|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Fan_7_Indicator : 45|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Fan_6_Indicator : 46|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Fan_5_Indicator : 47|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Fan_4_Indicator : 32|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Fan_3_Indicator : 33|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Fan_2_Indicator : 34|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Fan_Low_Indicator : 35|1@0+ (1,0) [0|0] "" XXX + SG_ AC_Indicator : 36|1@0+ (1,0) [0|0] "" XXX + SG_ Floor_Mode_Indicator : 37|1@0+ (1,0) [0|0] "" XXX + SG_ Panel_Mode_Indicator : 38|1@0+ (1,0) [0|0] "" XXX + SG_ Windshield_Mode_Indicator : 39|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Temp_High_Cool_Ind : 24|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Temp_M_H_Cool_Ind : 25|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Temp_M_L_Cool_Ind : 26|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Temp_Low_Cool_Ind : 27|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Temp_Center_Ind_On : 28|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Temp_High_Heat_Ind : 29|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Temp_M_L_Heat_Ind : 31|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Temp_Low_Heat_Ind : 16|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Control_Indicator : 17|1@0+ (1,0) [0|0] "" XXX + SG_ Auto_Indicator_Rear : 18|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Indicator_Rear : 19|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_U_R_Seat_Cool_Ind : 20|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_M_Seat_Cool_Ind : 21|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_L_L_Seat_Cool_Ind : 22|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_U_R_Seat_Heat_Ind : 23|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_M_Seat_Heat_Ind : 8|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_L_L_Seat_Heat_Ind : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_U_R_Seat_Cool_Ind : 10|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_M_Seat_Cool_Ind : 11|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_L_L_Seat_Cool_Ind : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_U_R_Seat_Heat_Ind : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_M_Seat_Heat_Ind : 14|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_L_L_Seat_Heat_Ind : 15|1@0+ (1,0) [0|0] "" XXX + SG_ Single_Mode_Indicator : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Auto_Indicator : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Recirc_Indicator : 2|1@0+ (1,0) [0|0] "" XXX + SG_ Max_AC_Econ_Indicator : 3|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_DefHtd_Mirr_Indicator : 4|1@0+ (1,0) [0|0] "" XXX + SG_ Defrost_Indicator : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Temp_Dual_Indicator : 6|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Indicator_Front : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 904 CC_NavChassis_Info_Status: 8 XXX + SG_ Rear_Defrost_Soft_Bttn_Stt : 52|1@0+ (1,0) [0|0] "" XXX + SG_ Recirc_Soft_Button_State : 54|2@0+ (1,0) [0|0] "" XXX + SG_ Max_AC_Soft_Button_State : 55|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_Soft_Btn_Stt : 24|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Power_Soft_Btn_State : 25|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Defrost_Soft_Btn_Stt : 26|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Power_Button_State : 33|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_FAN_Indicator : 27|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_MODE_Indicator : 28|1@0+ (1,0) [0|0] "" XXX + SG_ CC_Bar_Rear_Set_Temp_Display : 17|1@0+ (1,0) [0|0] "" XXX + SG_ CC_Bar_Rear_Set_Temp_Units : 19|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_Heat_Bars_Displayed : 42|3@0+ (1,0) [0|0] "Bars_On" XXX + SG_ CC_Bar_Rear_Set_Temp_Dig3 : 21|2@0+ (1,0) [0|0] "" XXX + SG_ CC_Bar_Rear_Set_Temp_Dig2 : 15|8@0+ (1,0) [0|0] "ASCII" XXX + SG_ CC_Bar_Rear_Set_Temp_Dig1 : 7|8@0+ (1,0) [0|0] "ASCII" XXX + SG_ Rear_Neutral_Bar_Displayed : 43|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Fan_Bars_Displayed : 46|3@0+ (1,0) [0|0] "" XXX + SG_ Rear_Control_Button_State : 47|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Auto_Button_State : 32|1@0+ (1,0) [0|0] "" XXX + SG_ AC_Sft_Button_State : 35|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_Cool_Bars_Displayed : 38|3@0+ (1,0) [0|0] "Bars_On" XXX + SG_ Dual_Button_State : 39|1@0+ (1,0) [0|0] "" XXX + SG_ CC_Bar_Sft_Btn_FlrWs_State : 29|1@0+ (1,0) [0|0] "" XXX + SG_ CC_Bar_Sft_Btn_Floor_State : 30|1@0+ (1,0) [0|0] "" XXX + SG_ CC_Bar_Sft_Btn_PnFlr_State : 31|1@0+ (1,0) [0|0] "" XXX + SG_ CC_Bar_Sft_Btn_Pnl_State : 16|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Sft_Control_Status : 23|2@0+ (1,0) [0|0] "" XXX + +BO_ 920 FCIM_CC_Status: 8 XXX + SG_ Manual_Temp_Knob_Pos : 8|9@0+ (1,0) [0|0] "Degrees CW" XXX + SG_ Manual_Blower_Knob_Pos : 24|9@0+ (1,0) [0|0] "Degrees CW" XXX + SG_ Rear_Blower_IncreaseButton : 40|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Blower_DecreaseButton : 55|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Temp_Decrease_Button : 41|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Temp_Increase_Button : 42|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Control_Button : 43|1@0+ (1,0) [0|0] "" XXX + SG_ Auto_Button_Rear : 44|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Button_Rear : 45|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_Heated_Seat_Btn : 47|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_Cooled_Seat_Btn : 46|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_Cooled_Seat_Btn : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_Heated_Seat_Btn : 10|1@0+ (1,0) [0|0] "" XXX + SG_ Blower_Decrease_Button : 25|1@0+ (1,0) [0|0] "" XXX + SG_ Blower_Increase_Button : 26|1@0+ (1,0) [0|0] "" XXX + SG_ Floor_Defrost_Mode_Button : 27|1@0+ (1,0) [0|0] "" XXX + SG_ Floor_Mode_Button : 28|1@0+ (1,0) [0|0] "" XXX + SG_ Panel_Floor_Mode_Button : 29|1@0+ (1,0) [0|0] "" XXX + SG_ Panel_Mode_Button : 30|1@0+ (1,0) [0|0] "" XXX + SG_ Mode_Change_Button : 31|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_Temp_Increase : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_Temp_Decrease : 11|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_Temp_Decrease : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Lft_Side_Temp_Increase : 14|1@0+ (1,0) [0|0] "" XXX + SG_ Auto_Button_Front : 15|1@0+ (1,0) [0|0] "" XXX + SG_ Recirc_Button : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Max_AC_Econ_Button : 1|1@0+ (1,0) [0|0] "" XXX + SG_ AC_Button : 2|1@0+ (1,0) [0|0] "" XXX + SG_ Rr_Def_Htd_Mirr_Button : 3|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Defrost_Button : 4|1@0+ (1,0) [0|0] "" XXX + SG_ Rt_Side_Temp_Dual_Button : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Button_Front : 6|1@0+ (1,0) [0|0] "" XXX + SG_ Climate_Button : 7|1@0+ (1,0) [0|0] "" XXX + SG_ CcdMde_D_Rq : 54|2@0+ (1,0) [0|0] "" XXX + +BO_ 921 Nav_CC_Status: 8 XXX + SG_ Front_System_Button_Status : 7|5@0+ (1,0) [0|0] "" XXX + SG_ Rear_Temp_Button_Status : 23|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_Man_Temp_Bar_Status : 11|4@0+ (1,0) [0|0] "" XXX + SG_ Rear_Fan_Button_Status : 13|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_Man_ATC_Button_Status : 15|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_Blower_Bar_Status : 2|3@0+ (1,0) [0|0] "# of Bars" XXX + +BO_ 922 VoiceRec_CC_Request: 8 XXX + SG_ Recirculate_On : 10|1@0+ (1,0) [0|0] "" XXX + SG_ Recirculate_Off : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Defrost_On : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Defrost_Off : 11|1@0+ (1,0) [0|0] "" XXX + SG_ Max_AC_On : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Max_AC_Off : 15|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Defrost_On : 14|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Defrost_Off : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Blower_Increment : 8|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Blower_Decrement : 23|1@0+ (1,0) [0|0] "" XXX + SG_ Dual_Zone_Off : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Driver_Temp_Increment : 22|1@0+ (1,0) [0|0] "" XXX + SG_ Driver_Temp_Decrement : 21|1@0+ (1,0) [0|0] "" XXX + SG_ Climate_On : 4|1@0+ (1,0) [0|0] "" XXX + SG_ Climate_Off : 3|1@0+ (1,0) [0|0] "" XXX + SG_ Automatic_Mode : 6|1@0+ (1,0) [0|0] "" XXX + SG_ AC_On : 2|1@0+ (1,0) [0|0] "" XXX + SG_ AC_Off : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Voice_Blower_Limit : 7|1@0+ (1,0) [0|0] "" XXX + SG_ Driver_Set_Temp : 31|8@0+ (0.5,0) [0|0] "Degrees" XXX + +BO_ 928 Ignition_Switch_PositionM: 8 XXX + SG_ AirAmb_Te_ActlFilt_UB : 14|1@0+ (1,0) [0|0] "" XXX + SG_ AirAmb_Te_ActlFilt : 49|10@0+ (0.25,-128.0) [0|0] "deg C" XXX + SG_ OdometerMasterValue_UB : 15|1@0+ (1,0) [0|0] "" XXX + SG_ OdometerMasterValue : 31|24@0+ (1,0) [0|0] "km" XXX + SG_ Remote_Start_Status : 13|2@0+ (1,0) [0|0] "" XXX + SG_ Key_In_Ignition_Stat : 3|2@0+ (1,0) [0|0] "" XXX + SG_ Ignition_Switch_Stable : 1|2@0+ (1,0) [0|0] "" XXX + SG_ Ignition_Status : 7|4@0+ (1,0) [0|0] "" XXX + SG_ BOO_Switch_Status : 9|2@0+ (1,0) [0|0] "" XXX + SG_ Remote_Device_Feedback : 23|3@0+ (1,0) [0|0] "" XXX + +BO_ 934 Side_Detect_L_StatusM: 8 XXX + SG_ Cross_Traffic_L_SnState : 23|2@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_L_SysOpState : 3|2@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_L_SnsrState : 1|2@0+ (1,0) [0|0] "" XXX + SG_ Side_Detect_L_Illum : 15|8@0+ (1,0) [0|0] "%" XXX + SG_ Side_Detect_L_Detect : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_L_Op_State : 21|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_L_Alert : 19|2@0+ (1,0) [0|0] "" XXX + SG_ Side_Detect_L_Alert : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 935 Side_Detect_R_StatusM: 8 XXX + SG_ Cross_Traffic_R_Alert : 23|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_R_SnState : 19|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_R_Op_State : 21|2@0+ (1,0) [0|0] "" XXX + SG_ Side_Detect_R_Detect : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Side_Detect_R_Illum : 15|8@0+ (1,0) [0|0] "%" XXX + SG_ SideDetect_R_SnsrState : 1|2@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_R_SysOpState : 3|2@0+ (1,0) [0|0] "" XXX + SG_ Side_Detect_R_Alert : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 944 Body_Information_6_MS: 8 XXX + SG_ DRV_SELECT_STAT : 3|4@0+ (1,0) [0|0] "" XXX + SG_ reserve_2bits : 7|2@0+ (1,0) [0|0] "" XXX + SG_ reserve_2 : 5|1@0+ (1,0) [0|0] "" XXX + SG_ reserve_3 : 4|1@0+ (1,0) [0|0] "" XXX + +BO_ 945 Ajar_Stat: 8 XXX + SG_ Decklid_Ajar_Status : 3|1@0+ (1,0) [0|0] "" XXX + SG_ Hood_Ajar_Status : 0|1@0+ (1,0) [0|0] "" XXX + SG_ LG_Glass_Ajar_Status : 2|1@0+ (1,0) [0|0] "" XXX + SG_ DF_Door_Ajar_Status : 7|1@0+ (1,0) [0|0] "" XXX + SG_ PF_Door_Ajar_Status : 6|1@0+ (1,0) [0|0] "" XXX + SG_ DR_Door_Ajar_Status : 5|1@0+ (1,0) [0|0] "" XXX + SG_ PR_Door_Ajar_Status : 4|1@0+ (1,0) [0|0] "" XXX + SG_ LG_Door_Ajar_Status : 1|1@0+ (1,0) [0|0] "" XXX + +BO_ 946 Body_Information_5_MS: 8 XXX + SG_ CoolantFanStepAct_UB : 8|1@0+ (1,0) [0|0] "" XXX + SG_ AirCondRec_B_Rq_UB : 38|1@0+ (1,0) [0|0] "" XXX + SG_ AirCondRec_B_Rq : 39|1@0+ (1,0) [0|0] "" XXX + SG_ AirCondEvdc_D_Stats_UB : 34|1@0+ (1,0) [0|0] "" XXX + SG_ AirCondEvdc_D_Stats : 37|3@0+ (1,0) [0|0] "" XXX + SG_ AirCondClutch_B_Stats_UB : 19|1@0+ (1,0) [0|0] "" XXX + SG_ AirCondClutch_B_Stats : 20|1@0+ (1,0) [0|0] "" XXX + SG_ CoolantFanStepAct : 47|5@0+ (1,0) [0|0] "Steps" XXX + SG_ AirCondFluidHi_P_Actl_UB : 18|1@0+ (1,0) [0|0] "" XXX + SG_ AirCondFluidHi_P_Actl : 31|8@0+ (0.125,0) [0|0] "bar" XXX + SG_ SECONDARY_HEATER_STAT_UB : 63|1@0+ (1,0) [0|0] "" XXX + SG_ CURRENT_DRAW_UB : 62|1@0+ (1,0) [0|0] "" XXX + SG_ SECONDARY_HEATER_STAT : 40|1@0+ (1,0) [0|0] "" XXX + SG_ CURRENT_DRAW : 55|8@0+ (0.5,0) [0|0] "Amps" XXX + +BO_ 947 BodyInformation_3_MS: 8 XXX + SG_ CamraDefog_B_Req_UB : 58|1@0+ (1,0) [0|0] "" XXX + SG_ TrStats_D_Actl_UB : 48|1@0+ (1,0) [0|0] "" XXX + SG_ RearFog_Lamp_Dbnce_UB : 49|1@0+ (1,0) [0|0] "" XXX + SG_ TrStats_D_Actl : 13|2@0+ (1,0) [0|0] "" XXX + SG_ CamraDefog_B_Req : 40|1@0+ (1,0) [0|0] "" XXX + SG_ RearFog_Lamp_Dbnce : 0|1@0+ (1,0) [0|0] "" XXX + SG_ CarMode : 53|4@0+ (1,0) [0|0] "" XXX + SG_ Day_Night_Status : 15|2@0+ (1,0) [0|0] "" XXX + SG_ Parklamp_Status : 3|2@0+ (1,0) [0|0] "" XXX + SG_ Dimming_Lvl : 31|8@0+ (1,0) [0|0] "" XXX + SG_ Litval : 23|8@0+ (1,0) [0|0] "" XXX + SG_ Mfs_Turn_Stalk_SW_Status : 11|2@0+ (1,0) [0|0] "" XXX + SG_ PwMdeExten_D_Actl : 63|5@0+ (1,0) [0|0] "" XXX + SG_ STR_WHL_ANGLE : 39|15@0+ (0.1,-1000.0) [0|0] "Degrees" XXX + SG_ Turn_Seq_Cmd_Right : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Turn_Seq_Cmd_Left : 5|2@0+ (1,0) [0|0] "" XXX + SG_ Smart_Wiper_Motor_Stat_UB : 8|1@0+ (1,0) [0|0] "" XXX + SG_ Smart_Wiper_Motor_Stat : 55|2@0+ (1,0) [0|0] "" XXX + SG_ Mfs_Turn_Stalk_SW_Status_UB : 9|1@0+ (1,0) [0|0] "" XXX + SG_ reserve : 1|1@0+ (1,0) [0|0] "" XXX + +BO_ 950 RKE_Packet: 8 XXX + SG_ RemoteKey_Packet_TIC : 7|32@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Packet_RollB : 55|8@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Packet_RollA : 47|8@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Packet_Ctrl : 39|8@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Packet_CkSum : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 951 TPM_Frame: 8 XXX + SG_ TirePress_Frame_Temp : 47|8@0+ (1,0) [0|0] "" XXX + SG_ TirePress_Frame_Status : 55|8@0+ (1,0) [0|0] "" XXX + SG_ TirePress_Frame_Press : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TirePress_Frame_ID : 7|32@0+ (1,0) [0|0] "" XXX + SG_ TirePress_Frame_CkSum : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 952 RKE_TPM_Info: 8 XXX + SG_ TirePress_HitRate_Ctrl : 15|1@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_HitRate_Ctrl : 14|1@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Antenna_Ctrl : 7|2@0+ (1,0) [0|0] "" XXX + SG_ TirePress_Filter_Ctrl : 5|2@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Filter_Ctrl : 3|2@0+ (1,0) [0|0] "" XXX + SG_ Modulation_Ctrl : 1|2@0+ (1,0) [0|0] "" XXX + +BO_ 953 RKE_Info: 8 XXX + SG_ RemoteKey_Info_TIC : 7|32@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Info_RollB : 55|8@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Info_RollA : 47|8@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Info_Ctrl : 39|8@0+ (1,0) [0|0] "" XXX + SG_ RemoteKey_Info_CkSum : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 954 Tire_Pressure_Info: 8 XXX + SG_ TirePress_Info_MaxInd : 47|8@0+ (1,0) [0|0] "" XXX + SG_ TirePress_Info_Index : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TirePress_Info_ID : 7|32@0+ (1,0) [0|0] "" XXX + +BO_ 956 Body_Information_7_MS: 8 XXX + SG_ GearLvrPos_D_Actl_UB : 21|1@0+ (1,0) [0|0] "" XXX + SG_ PrplWhlTot_Tq_Actl : 31|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + SG_ GearLvrPos_D_Actl : 7|4@0+ (1,0) [0|0] "" XXX + SG_ ApedPos_Pc_ActlArb : 15|10@0+ (0.1,0) [0|0] "%" XXX + SG_ PrplWhlTot_Tq_Actl_UB : 17|1@0+ (1,0) [0|0] "" XXX + SG_ EngOff_T_Actl : 47|16@0+ (1,0) [0|0] "seconds" XXX + SG_ ApedPos_Pc_ActlArb_UB : 20|1@0+ (1,0) [0|0] "" XXX + +BO_ 958 Rear_FoglampStat: 8 XXX + SG_ RearFog_Lamp_Ind : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 963 BCM_to_MS_Body: 8 XXX + SG_ LF_Low_Beam_CKT_CAN : 2|1@0+ (1,0) [0|0] "" XXX + SG_ IKT_Program_Status : 51|2@0+ (1,0) [0|0] "" XXX + SG_ Veh_Spd_Slow_Puddle_Status : 41|2@0+ (1,0) [0|0] "" XXX + SG_ Illuminated_Exit_Status : 43|2@0+ (1,0) [0|0] "" XXX + SG_ Illuminated_Entry_Status : 45|2@0+ (1,0) [0|0] "" XXX + SG_ Door_Courtesy_Light_Status : 47|2@0+ (1,0) [0|0] "" XXX + SG_ Courtesy_Demand_BSave_Stat : 33|2@0+ (1,0) [0|0] "" XXX + SG_ Alarm_Lights_Courtesy_Stat : 35|2@0+ (1,0) [0|0] "" XXX + SG_ Courtesy_Delay_Status : 37|2@0+ (1,0) [0|0] "" XXX + SG_ Courtesy_Mode_Status : 39|2@0+ (1,0) [0|0] "" XXX + SG_ Front_Fog_Light_SW_Status : 22|2@0+ (1,0) [0|0] "" XXX + SG_ Brake_Lamp_On_Status : 23|1@0+ (1,0) [0|0] "" XXX + SG_ ParkLamps_CKT_CAN : 8|1@0+ (1,0) [0|0] "" XXX + SG_ RF_Low_Beam_CKT_CAN : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Brk_Fluid_Lvl_Low : 15|2@0+ (1,0) [0|0] "" XXX + SG_ Park_Brake_Status : 4|1@0+ (1,0) [0|0] "" XXX + SG_ High_Beam_Indicator_Rqst : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Headlamp_On_Wrning_Cmd : 6|1@0+ (1,0) [0|0] "" XXX + SG_ Key_In_Ignition_Warn_Cmd : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Park_Brake_Chime_Rqst : 3|1@0+ (1,0) [0|0] "" XXX + SG_ Daytime_Running_Lamps : 0|1@0+ (1,0) [0|0] "" XXX + SG_ AutoHighBeam_Cmd : 18|2@0+ (1,0) [0|0] "" XXX + SG_ Perimeter_Alarm_Chime_Rqst : 20|2@0+ (1,0) [0|0] "" XXX + SG_ OCSSensrDataUpperLim_UB : 11|1@0+ (1,0) [0|0] "" XXX + SG_ OCSSensrDataLowerLim_UB : 12|1@0+ (1,0) [0|0] "" XXX + SG_ OCSSensrDataUpperLim : 63|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSensrDataLowerLim : 31|8@0+ (1,0) [0|0] "" XXX + SG_ AutoHighBeam_Cmd_UB : 16|1@0+ (1,0) [0|0] "" XXX + SG_ PrkBrkActv_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX + SG_ Headlamp_Switch_Stat : 49|2@0+ (1,0) [0|0] "" XXX + SG_ Perimeter_Alarm_Inclin_Cmd : 53|2@0+ (1,0) [0|0] "" XXX + SG_ Perimeter_Alarm_Intrus_Cmd : 55|2@0+ (1,0) [0|0] "" XXX + +BO_ 964 BodyInformation_2_MS: 8 XXX + SG_ LockInhibit : 41|1@0+ (1,0) [0|0] "" XXX + SG_ MetricActvTe_B_Actl_UB : 12|1@0+ (1,0) [0|0] "" XXX + SG_ MetricActvTe_B_Actl : 14|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Liftgate_Mode_Cmd : 42|1@0+ (1,0) [0|0] "" XXX + SG_ AirAmb_Te_Actl : 55|10@0+ (0.25,-128.0) [0|0] "degC" XXX + SG_ EngClntTe_D_Qf : 47|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_Cmd : 26|2@0+ (1,0) [0|0] "" XXX + SG_ Side_Detect_Cmd : 28|2@0+ (1,0) [0|0] "" XXX + SG_ SAPPStatusCoding : 39|8@0+ (1,0) [0|0] "" XXX + SG_ Delay_Accy : 31|1@0+ (1,0) [0|0] "" XXX + SG_ Volume_Cutback : 7|1@0+ (1,0) [0|0] "" XXX + SG_ MetricActv_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatTgate_B_Actl : 1|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatRr_B_Actl : 2|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatRl_B_Actl : 3|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatPsngr_B_Actl : 4|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatInnrTgate_B_Actl : 5|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatHood_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatDrv_B_Actl : 10|1@0+ (1,0) [0|0] "" XXX + SG_ EngClnt_Te_Actl : 23|8@0+ (1,-60.0) [0|0] "degC" XXX + SG_ AirAmbTe_D_Qf_UB : 59|1@0+ (1,0) [0|0] "" XXX + SG_ Volume_Cutback_UB : 58|1@0+ (1,0) [0|0] "" XXX + SG_ Side_Detect_Cmd_UB : 57|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPStatusCoding_UB : 56|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Liftgate_Mode_Cmd_UB : 15|1@0+ (1,0) [0|0] "" XXX + SG_ MetricActv_B_Actl_UB : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_Cmd_UB : 11|1@0+ (1,0) [0|0] "" XXX + SG_ AirAmbTe_D_Qf : 61|2@0+ (1,0) [0|0] "" XXX + SG_ AirAmb_Te_Actl_UB : 40|1@0+ (1,0) [0|0] "" XXX + SG_ EngClnt_Te_Actl_UB : 24|1@0+ (1,0) [0|0] "" XXX + +BO_ 966 Delay_AccyM_for_P473: 8 XXX + SG_ Delay_Accy : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 967 CMPS_FDM_Info_StatusMS: 8 XXX + SG_ Segment_MSD_UB : 37|1@0+ (1,0) [0|0] "" XXX + SG_ Segment_LSD_UB : 36|1@0+ (1,0) [0|0] "" XXX + SG_ Compass_Display_UB : 35|1@0+ (1,0) [0|0] "" XXX + SG_ Segment_LSD : 15|8@0+ (1,0) [0|0] "" XXX + SG_ Segment_MSD : 7|8@0+ (1,0) [0|0] "" XXX + SG_ Cal_Icon : 21|1@0+ (1,0) [0|0] "" XXX + SG_ Zone_Icon : 22|1@0+ (1,0) [0|0] "" XXX + SG_ Compass_Display : 23|1@0+ (1,0) [0|0] "" XXX + SG_ Zone_Icon_UB : 34|1@0+ (1,0) [0|0] "" XXX + SG_ Cal_Icon_UB : 33|1@0+ (1,0) [0|0] "" XXX + +BO_ 968 EATC_FDM_Info_Status: 8 XXX + SG_ Outside_Rear_Temp_Digit3 : 47|4@0+ (1,0) [0|0] "BCD" XXX + SG_ Outside_Rear_Temp_Digit2 : 35|4@0+ (1,0) [0|0] "BCD" XXX + SG_ Outside_Rear_Temp_Digit1 : 39|4@0+ (1,0) [0|0] "BCD" XXX + SG_ EATC_Out_Rear_Units : 58|2@0+ (1,0) [0|0] "" XXX + SG_ Outside_Rear_Temp_Digit4 : 55|2@0+ (1,0) [0|0] "" XXX + SG_ EATC_RHS_Units : 60|2@0+ (1,0) [0|0] "" XXX + SG_ EATC_Fan_Speed : 51|3@0+ (1,0) [0|0] "" XXX + SG_ EATC_Outside_Rear_Display : 62|2@0+ (1,0) [0|0] "" XXX + SG_ RHS_Temp_Display_Digit2 : 31|8@0+ (1,0) [0|0] "ASCII" XXX + SG_ RHS_Temp_Display_Digit3 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ RHS_Temp_Display_Digit1 : 23|8@0+ (1,0) [0|0] "ASCII" XXX + SG_ EATC_RHS_Display : 63|1@0+ (1,0) [0|0] "" XXX + SG_ LHS_Temp_Display_Digit3 : 43|2@0+ (1,0) [0|0] "" XXX + SG_ LHS_Temp_Display_Digit2 : 15|8@0+ (1,0) [0|0] "ASCII" XXX + SG_ LHS_Temp_Display_Digit1 : 7|8@0+ (1,0) [0|0] "ASCII" XXX + SG_ EATC_LHS_Display : 48|1@0+ (1,0) [0|0] "" XXX + SG_ EATC_LHS_Units : 53|2@0+ (1,0) [0|0] "" XXX + +BO_ 969 Aux_Body_Ctrl_Mod_Status: 8 XXX + SG_ Perimeter_Alrm_Intrus_Stat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Turn_Outage_Stat_Rt_Rear : 15|2@0+ (1,0) [0|0] "" XXX + SG_ Turn_Outage_Stat_Left_Rear : 1|2@0+ (1,0) [0|0] "" XXX + SG_ Perimeter_Alrm_Inclin_Stat : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 976 Veh_Characteristic_Set_2: 8 XXX + SG_ VehMykey_Vl_LimRq_UB : 8|1@0+ (1,0) [0|0] "" XXX + SG_ CamraFrntStat_D_Stat : 21|2@0+ (1,0) [0|0] "" XXX + SG_ CamraZoomMan_D_Actl : 12|3@0+ (1,0) [0|0] "" XXX + SG_ CamZoomActiveState : 17|2@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlStat_D_Actl : 19|2@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlDyn_D_Actl : 39|2@0+ (1,0) [0|0] "" XXX + SG_ CamPDCGuidStat : 31|2@0+ (1,0) [0|0] "" XXX + SG_ VehMykey_Vl_LimRq : 14|1@0+ (1,0) [0|0] "" XXX + SG_ IgnKeyType_D_Actl : 4|4@0+ (1,0) [0|0] "" XXX + SG_ New_Module_Attn_Event : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Beltminder_Warn_Stats : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Attn_Info_Audio : 7|3@0+ (1,0) [0|0] "" XXX + +BO_ 977 ClmtCtrlSeat_SetCmd_LRPM: 8 XXX + SG_ ClmtCtrlSeat_SetCmd_LRP : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 978 ClmtCtrlSeat_SetStat_LRPM: 8 XXX + SG_ ClmtCtrlSeat_SetStat_LRP : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 979 ClmtCtrlSeat_SetCmd_RRPM: 8 XXX + SG_ ClmtCtrlSeat_SetCmd_RRP : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 980 ClmtCtrlSeat_SetStat_RRPM: 8 XXX + SG_ ClmtCtrlSeat_SetStat_RRP : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 981 Rear_HVAC_Control_Status: 8 XXX + SG_ Temp_Knob_Position : 23|9@0+ (1,0) [0|0] "Degrees CW" XXX + SG_ Rear_Lock_Ind_State : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Blower_Knob_Position : 7|9@0+ (1,0) [0|0] "Degrees CW" XXX + SG_ AUTO_Ind_State : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Panel_Mode_Ind_State : 11|1@0+ (1,0) [0|0] "" XXX + SG_ Panel_Floor_Md_Ind_State : 10|2@0+ (1,0) [0|0] "" XXX + SG_ Floor_Mode_Ind_State : 8|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Status : 14|1@0+ (1,0) [0|0] "" XXX + +BO_ 982 Rear_HVAC_Control_Update: 8 XXX + SG_ Power_State_Commanded : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_Lock_Indicator : 15|1@0+ (1,0) [0|0] "" XXX + SG_ Panel_Floor_Mode_Indicator : 4|2@0+ (1,0) [0|0] "" XXX + SG_ R_Floor_Mode_Indicator : 2|1@0+ (1,0) [0|0] "" XXX + SG_ AUTO_Mode_Indicator : 1|2@0+ (1,0) [0|0] "" XXX + SG_ F_Panel_Mode_Indicator : 13|1@0+ (1,0) [0|0] "" XXX + SG_ R_Panel_Mode_Indicator : 12|2@0+ (1,0) [0|0] "" XXX + +BO_ 986 Personality_APIM_Data3_MS: 8 XXX + SG_ LightAmbIntSwtchInc_B : 22|1@0+ (1,0) [0|0] "" XXX + SG_ LightAmbIntSwtchDec_B : 21|1@0+ (1,0) [0|0] "" XXX + SG_ LightAmbIntsty_No_Rq : 15|8@0+ (1,0) [0|0] "% Intensity" XXX + SG_ LightAmbColor_No_Rq : 7|8@0+ (1,0) [0|0] "Color Index" XXX + SG_ LightAmbClrSwtchInc_B : 20|1@0+ (1,0) [0|0] "" XXX + SG_ LightAmbClrSwtchDec_B : 23|1@0+ (1,0) [0|0] "" XXX + +BO_ 987 RHVAC_Data: 8 XXX + SG_ CamraDefog_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 992 Personality_Data_MS: 8 XXX + SG_ PersSetupRestr_D_Actl : 45|2@0+ (1,0) [0|0] "" XXX + SG_ PersSetupAccessCtrl : 43|1@0+ (1,0) [0|0] "SES" XXX + SG_ PersSetup_No_Actl : 55|16@0+ (1,0) [0|0] "Number" XXX + SG_ MsgCntrPersIndex_D_Rq_UB : 47|1@0+ (1,0) [0|0] "" XXX + SG_ MsgCntrFeatNoRq_UB : 46|1@0+ (1,0) [0|0] "" XXX + SG_ MsgCntrFeatConfigRq_UB : 33|1@0+ (1,0) [0|0] "" XXX + SG_ MsgCntrDsplyOp_D_Rq_UB : 32|1@0+ (1,0) [0|0] "" XXX + SG_ MsgCntrPersIndex_D_Rq : 39|3@0+ (1,0) [0|0] "" XXX + SG_ MsgCntrFeatConfigRq : 23|16@0+ (1,0) [0|0] "" XXX + SG_ MsgCntrFeatNoRq : 7|16@0+ (1,0) [0|0] "Number" XXX + SG_ MsgCntrDsplyOp_D_Rq : 36|3@0+ (1,0) [0|0] "" XXX + +BO_ 993 Personality_DSM_Data: 8 XXX + SG_ PersIndexDsm_D_Actl : 47|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoDsmActl : 31|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigDsmActl : 15|16@0+ (1,0) [0|0] "" XXX + SG_ PersStore_D_Actl : 7|2@0+ (1,0) [0|0] "" XXX + SG_ MemSwtch_D_RqRecall : 5|3@0+ (1,0) [0|0] "" XXX + SG_ MemSwtch_D_RqAssoc : 2|3@0+ (1,0) [0|0] "" XXX + +BO_ 994 Personality_Data_MS_2: 8 XXX + SG_ RecallEvent_No_Cnt : 63|8@0+ (1,0) [0|0] "Counts" XXX + SG_ PersNo_D_Actl : 55|3@0+ (1,0) [0|0] "" XXX + SG_ PersNoPos_D_Actl : 44|3@0+ (1,0) [0|0] "" XXX + SG_ PersStore_D_Rq_UB : 41|1@0+ (1,0) [0|0] "" XXX + SG_ CtrStkPersIndex_D_Actl_UB : 40|1@0+ (1,0) [0|0] "" XXX + SG_ CtrStkFeatNoActl_UB : 52|1@0+ (1,0) [0|0] "" XXX + SG_ CtrStkFeatConfigActl_UB : 33|1@0+ (1,0) [0|0] "" XXX + SG_ CtrStkDsplyOp_D_Rq_UB : 32|1@0+ (1,0) [0|0] "" XXX + SG_ CtrStkPersIndex_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ CtrStkFeatNoActl : 23|16@0+ (1,0) [0|0] "" XXX + SG_ PersStore_D_Rq : 36|3@0+ (1,0) [0|0] "" XXX + SG_ CtrStkFeatConfigActl : 7|16@0+ (1,0) [0|0] "" XXX + SG_ CtrStkDsplyOp_D_Rq : 47|3@0+ (1,0) [0|0] "" XXX + +BO_ 996 Personality_HCMB_Data: 8 XXX + SG_ PersIndexHcmb_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoHcmbActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigHcmbActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 999 Personality_HVAC_Data: 8 XXX + SG_ LightAmbIntsty_No_Actl : 55|8@0+ (1,0) [0|0] "% Intensity" XXX + SG_ LightAmbColor_No_Actl : 47|8@0+ (1,0) [0|0] "Color Index" XXX + SG_ PersIndexHvac_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoHvacActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigHvacActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 1000 ACM_Status_Message: 8 XXX + SG_ Multimedia_System : 26|1@0+ (1,0) [0|0] "" XXX + +BO_ 1001 Personality_RFA_Data: 8 XXX + SG_ PersIndexRfa_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoRfaActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigRfaActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 1005 Personality_RHVAC_Data: 8 XXX + SG_ PersIndexRhvac_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoRhvacActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigRhvacActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 1006 Nav_HMI_Status: 8 XXX + SG_ Nav_Unit_Setting : 14|1@0+ (1,0) [0|0] "" XXX + SG_ Fuel_Econ_AFE_Reset_Req : 15|1@0+ (1,0) [0|0] "" XXX + SG_ DistanceBarSetting : 23|1@0+ (1,0) [0|0] "" XXX + SG_ CamraZoomMan_D_Rq : 22|3@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlStat_D_Rq : 19|1@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlDyn_D_Rq : 18|1@0+ (1,0) [0|0] "" XXX + SG_ CamAutoTowbarZoom : 17|1@0+ (1,0) [0|0] "" XXX + +BO_ 1023 Reserve_3FF_MKX_Audio: 8 XXX + SG_ reserve : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 1034 GGCC_Config_Mgmt_ID_1: 8 XXX + SG_ VehicleGGCCData : 7|64@0+ (1,0) [0|0] "mixed" XXX + +BO_ 1050 Climate_Control_Data: 8 XXX + SG_ SecondaryHeater_Rqst : 31|1@0+ (1,0) [0|0] "" XXX + SG_ Passenger_Sunload_Raw : 15|8@0+ (5.0,0) [0|0] "W/m^2" XXX + SG_ Driver_Sunload_Raw : 7|8@0+ (5.0,0) [0|0] "W/m^2" XXX + SG_ HvacEvap_Te_Rq : 43|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + SG_ HvacRemoteStrt_N_Rq : 47|4@0+ (100.0,450.0) [0|0] "RPM" XXX + SG_ Remote_Start_QuietMode : 28|1@0+ (1,0) [0|0] "" XXX + SG_ InCarTempQF : 30|2@0+ (1,0) [0|0] "" XXX + SG_ HvacAirCond_B_Rq : 27|1@0+ (1,0) [0|0] "" XXX + SG_ InCarTemp : 39|8@0+ (0.5,-57.0) [0|0] "degreesC" XXX + SG_ Outside_Air_Temp_Stat : 23|8@0+ (0.5,-40.0) [0|0] "Degrees C" XXX + SG_ HvacEvap_Te_Actl : 49|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + +BO_ 1059 Engine_Data_MS: 8 XXX + SG_ Res_UreaLvlLo_B_Dsply_UB : 35|1@0+ (1,0) [0|0] "" XXX + SG_ Res_UreaLvlLo_B_Dsply : 36|1@0+ (1,0) [0|0] "" XXX + SG_ Fuel_Level_State : 47|2@0+ (1,0) [0|0] "" XXX + SG_ AwdOffRoadMode_D_Stats_UB : 55|1@0+ (1,0) [0|0] "" XXX + SG_ AwdRnge_D_Actl_UB : 42|1@0+ (1,0) [0|0] "" XXX + SG_ RearDiffLckLamp_D_Rq_UB : 32|1@0+ (1,0) [0|0] "" XXX + SG_ AwdOffRoadMode_D_Stats : 41|2@0+ (1,0) [0|0] "" XXX + SG_ AwdRnge_D_Actl : 45|3@0+ (1,0) [0|0] "" XXX + SG_ RearDiffLckLamp_D_Rq : 34|2@0+ (1,0) [0|0] "" XXX + SG_ VEH_SPD : 7|16@0+ (0.01,-100.0) [0|0] "KPH" XXX + SG_ ENG_SPD : 23|16@0+ (0.25,0) [0|0] "RPM" XXX + SG_ Fuel_Level_State_UB : 37|1@0+ (1,0) [0|0] "" XXX + +BO_ 1061 Engine_Data_2_MS: 8 XXX + SG_ RstrnImpactEvntStatus_UB : 56|1@0+ (1,0) [0|0] "" XXX + SG_ EngAirIn_Te_Actl_UB : 60|1@0+ (1,0) [0|0] "" XXX + SG_ EngAirIn_Te_Actl : 55|10@0+ (0.25,-128.0) [0|0] "degC" XXX + SG_ ACCompressorDisp_UB : 61|1@0+ (1,0) [0|0] "" XXX + SG_ ACCompressorDisp : 46|7@0+ (1,0) [0|0] "%" XXX + SG_ RstrnImpactEvntStatus : 59|3@0+ (1,0) [0|0] "" XXX + SG_ EngAout_N_Actl_UB : 47|1@0+ (1,0) [0|0] "" XXX + SG_ EngAout_N_Actl : 28|13@0+ (2.0,0) [0|0] "rpm" XXX + SG_ VehVActlEng_D_Qf : 31|2@0+ (1,0) [0|0] "" XXX + SG_ Veh_V_ActlEng_UB : 29|1@0+ (1,0) [0|0] "" XXX + SG_ Veh_V_ActlEng : 15|16@0+ (0.01,0) [0|0] "kph" XXX + SG_ PwPck_D_Stat_UB : 3|1@0+ (1,0) [0|0] "" XXX + SG_ PwPck_D_Stat : 7|4@0+ (1,0) [0|0] "" XXX + +BO_ 1062 ACM_NAV_WHEEL_INFO: 8 XXX + SG_ WhlRotatRr_No_Cnt_UB : 63|1@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatRl_No_Cnt_UB : 40|1@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatFr_No_Cnt_UB : 41|1@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatFl_No_Cnt_UB : 42|1@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRr_D_Actl_UB : 44|1@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRl_D_Actl_UB : 45|1@0+ (1,0) [0|0] "" XXX + SG_ WhlDirFr_D_Actl_UB : 46|1@0+ (1,0) [0|0] "" XXX + SG_ WhlDirFl_D_Actl_UB : 47|1@0+ (1,0) [0|0] "" XXX + SG_ WHEEL_ROLLING_TIMESTAMP_UB : 62|1@0+ (1,0) [0|0] "" XXX + SG_ ACM_NAV_WHEEL_INFO_RESET : 43|1@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatRr_No_Cnt : 39|8@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatRl_No_Cnt : 31|8@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatFr_No_Cnt : 23|8@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatFl_No_Cnt : 15|8@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRr_D_Actl : 1|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRl_D_Actl : 3|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirFr_D_Actl : 5|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirFl_D_Actl : 7|2@0+ (1,0) [0|0] "" XXX + SG_ WHEEL_ROLLING_TIMESTAMP : 55|8@0+ (1,0) [0|0] "" XXX + +BO_ 1068 Battery_Mgmt_2_MS: 8 XXX + SG_ Shed_T_Eng_Off_B : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Shed_Level_Req : 15|3@0+ (1,0) [0|0] "" XXX + SG_ Shed_Feature_Group_ID : 7|5@0+ (1,0) [0|0] "" XXX + SG_ Shed_Drain_Eng_Off_B : 2|1@0+ (1,0) [0|0] "" XXX + SG_ Batt_Lo_SoC_B : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Batt_Crit_SoC_B : 0|1@0+ (1,0) [0|0] "" XXX + +BO_ 1125 GPS_Data_Nav_1: 8 XXX + SG_ GpsHsphLattSth_D_Actl : 25|2@0+ (1,0) [0|0] "" XXX + SG_ GpsHsphLongEast_D_Actl : 9|2@0+ (1,0) [0|0] "" XXX + SG_ GPS_Longitude_Minutes : 46|6@0+ (1,0) [0|0] "Minutes" XXX + SG_ GPS_Longitude_Min_dec : 55|14@0+ (0.0001,0) [0|0] "Minutes" XXX + SG_ GPS_Longitude_Degrees : 39|9@0+ (1,-179.0) [0|0] "Degrees" XXX + SG_ GPS_Latitude_Minutes : 15|6@0+ (1,0) [0|0] "Minutes" XXX + SG_ GPS_Latitude_Min_dec : 23|14@0+ (0.0001,0) [0|0] "Minutes" XXX + SG_ GPS_Latitude_Degrees : 7|8@0+ (1,-89.0) [0|0] "Degrees" XXX + +BO_ 1126 GPS_Data_Nav_2: 8 XXX + SG_ Gps_B_Falt : 2|1@0+ (1,0) [0|0] "" XXX + SG_ GpsUtcYr_No_Actl : 55|5@0+ (1,1.0) [0|0] "Year" XXX + SG_ GpsUtcMnth_No_Actl : 47|4@0+ (1,1.0) [0|0] "Month" XXX + SG_ GpsUtcDay_No_Actl : 37|5@0+ (1,1.0) [0|0] "Day" XXX + SG_ GPS_UTC_seconds : 23|6@0+ (1,0) [0|0] "seconds" XXX + SG_ GPS_UTC_minutes : 15|6@0+ (1,0) [0|0] "Minutes" XXX + SG_ GPS_UTC_hours : 7|5@0+ (1,0) [0|0] "Hours" XXX + SG_ GPS_Pdop : 31|5@0+ (0.2,0) [0|0] "" XXX + SG_ GPS_Compass_direction : 26|4@0+ (1,0) [0|0] "" XXX + SG_ GPS_Actual_vs_Infer_pos : 38|1@0+ (1,0) [0|0] "" XXX + +BO_ 1127 GPS_Data_Nav_3: 8 XXX + SG_ GPS_Vdop : 63|5@0+ (0.2,0) [0|0] "" XXX + SG_ GPS_Speed : 47|8@0+ (1,0) [0|0] "MPH" XXX + SG_ GPS_Sat_num_in_view : 7|5@0+ (1,0) [0|0] "" XXX + SG_ GPS_MSL_altitude : 15|12@0+ (10.0,-20460.0) [0|0] "feet" XXX + SG_ GPS_Heading : 31|16@0+ (0.01,0) [0|0] "Degrees" XXX + SG_ GPS_Hdop : 55|5@0+ (0.2,0) [0|0] "" XXX + SG_ GPS_dimension : 2|3@0+ (1,0) [0|0] "" XXX + +BO_ 1144 GPS_Data_Nav_4: 8 XXX + SG_ VehPos_L_Est : 39|32@0+ (0.01,0) [0|0] "meter" XXX + SG_ VehHead_W_Actl : 23|16@0+ (0.01,-327.68) [0|0] "degrees/second" XXX + SG_ VehHead_An_Est : 7|16@0+ (0.01,0) [0|0] "degrees" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/ford_cgea1_2_ptcan_2011.dbc b/artifacts/package_runtime/iqdbc/dbc/ford_cgea1_2_ptcan_2011.dbc new file mode 100644 index 000000000..128721cbb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/ford_cgea1_2_ptcan_2011.dbc @@ -0,0 +1,1487 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 65 Global_PATS_Control_Info: 8 XXX + SG_ immoControlData_T1 : 15|40@0+ (1,0) [0|0] "" XXX + SG_ immoControlCmd_T1 : 7|3@0+ (1,0) [0|0] "" XXX + +BO_ 66 Global_PATS_Control_Info2: 8 XXX + SG_ immoControlData_T2 : 15|40@0+ (1,0) [0|0] "" XXX + SG_ immoControlCmd_T2 : 7|3@0+ (1,0) [0|0] "" XXX + +BO_ 71 Global_PATS_Target_Info: 8 XXX + SG_ immoTarget1Status : 7|3@0+ (1,0) [0|0] "" XXX + SG_ immoTarget1Data : 15|40@0+ (1,0) [0|0] "" XXX + SG_ immoTarget1Cmd : 4|3@0+ (1,0) [0|0] "" XXX + +BO_ 72 Global_PATS_Target_Info_2: 8 XXX + SG_ immoTarget2Status : 7|3@0+ (1,0) [0|0] "" XXX + SG_ immoTarget2Data : 15|40@0+ (1,0) [0|0] "" XXX + SG_ immoTarget2Cmd : 4|3@0+ (1,0) [0|0] "" XXX + +BO_ 73 Global_PATS_SubTarget_FoE: 8 XXX + SG_ immoSubTarget1Data_T1 : 15|40@0+ (1,0) [0|0] "" XXX + SG_ immoSubTarget1Cmd_T1 : 7|3@0+ (1,0) [0|0] "" XXX + +BO_ 74 VehEmergencyData1: 8 XXX + SG_ VedsPasSideBag_D_Ltchd : 60|3@0+ (1,0) [0|0] "" XXX + SG_ VedsPasCrtnBag_D_Ltchd : 55|3@0+ (1,0) [0|0] "" XXX + SG_ VedsPasBelt_D_Ltchd : 52|3@0+ (1,0) [0|0] "" XXX + SG_ VedsPasBag_D_Ltchd : 47|3@0+ (1,0) [0|0] "" XXX + SG_ VedsMultiEvnt_D_Ltchd : 44|3@0+ (1,0) [0|0] "" XXX + SG_ VedsMaxDeltaV_D_Ltchd : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VedsKneeBag_D_Ltchd : 63|3@0+ (1,0) [0|0] "" XXX + SG_ VedsEvntType_D_Ltchd : 31|3@0+ (1,0) [0|0] "" XXX + SG_ VedsEvntRoll_D_Ltchd : 28|3@0+ (1,0) [0|0] "" XXX + SG_ VedsDrvSideBag_D_Ltchd : 23|3@0+ (1,0) [0|0] "" XXX + SG_ VedsDrvCrtnBag_D_Ltchd : 20|3@0+ (1,0) [0|0] "" XXX + SG_ VedsDrvBelt_D_Ltchd : 15|3@0+ (1,0) [0|0] "" XXX + SG_ VedsDrvBag_D_Ltchd : 12|3@0+ (1,0) [0|0] "" XXX + SG_ eCallNotification : 2|2@0+ (1,0) [0|0] "" XXX + +BO_ 75 VehEmergencyData2: 8 XXX + SG_ VedsRw3rBckl_D_Ltchd : 39|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw3mBckl_D_Ltchd : 31|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw3lBckl_D_Ltchd : 28|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw2rBckl_D_Ltchd : 23|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw2mBckl_D_Ltchd : 20|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw2lBckl_D_Ltchd : 15|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw1PasChld_D_Ltchd : 12|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw1PasBckl_D_Ltchd : 7|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw1DrvBckl_D_Ltchd : 4|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw2rRib_D_Ltchd : 47|3@0+ (1,0) [0|0] "" XXX + SG_ VedsRw2lRib_D_Ltchd : 36|3@0+ (1,0) [0|0] "" XXX + +BO_ 116 BrakeSnData_2_CG1: 8 XXX + SG_ VehDynamicsSOS : 55|1@0+ (1,0) [0|0] "" XXX + SG_ AwdLck_Tq_RqMx : 27|12@0+ (1,0) [0|0] "Nm" XXX + SG_ AwdLck_Tq_RqMn : 23|12@0+ (1,0) [0|0] "Nm" XXX + SG_ SteWhlComp_An_Est : 7|15@0+ (0.1,-1600.0) [0|0] "deg" XXX + SG_ StopLamp_B_RqBrk : 8|1@0+ (1,0) [0|0] "" XXX + SG_ BrkTerrMdeChng_D_Rdy : 45|3@0+ (1,0) [0|0] "" XXX + SG_ BrkTerrMde_D_Actl : 42|3@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCompAnEst_D_Qf : 47|2@0+ (1,0) [0|0] "" XXX + +BO_ 117 BrakeSnData_3_CG1: 8 XXX + SG_ HsaStat_D_Dsply : 35|3@0+ (1,0) [0|0] "" XXX + SG_ HsaTrnAout_Tq_Rq : 55|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + SG_ HsaStat_D_Actl : 38|3@0+ (1,0) [0|0] "" XXX + SG_ HsaRoad_Grad_Est : 32|9@0+ (0.5,-127.0) [0|0] "%" XXX + SG_ VehYawComp_W_Actl : 7|12@0+ (0.03663,-75.0) [0|0] "deg/s" XXX + SG_ VehYaw_W_Rq : 11|12@0+ (0.03663,-75.0) [0|0] "deg/s" XXX + SG_ VehSideSlip_An_Est : 31|9@0+ (0.002,-0.5) [0|0] "rad" XXX + +BO_ 124 BrakeSnData_4_CG1: 8 XXX + SG_ EngRun_D_ReqBrk : 10|2@0+ (1,0) [0|0] "" XXX + SG_ BrkTotTqRqArb_No_Cs : 23|8@0+ (1,0) [0|0] "" XXX + SG_ BrkTotTqRqArb_No_Cnt : 31|4@0+ (1,0) [0|0] "" XXX + SG_ BrkTot_Tq_RqArb : 7|13@0+ (4.0,0) [0|0] "Nm" XXX + SG_ BrkTot_Tq_Actl : 39|13@0+ (4.0,0) [0|0] "Nm" XXX + SG_ VehOverGnd_V_Est : 55|16@0+ (0.01,0) [0|0] "kph" XXX + +BO_ 129 Steering_Wheel_Data2: 8 XXX + SG_ SteWhlCtl_RSide_OK : 9|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_RSide_CursorUp : 8|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_RSide_CursorRt : 7|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_RSide_CursorLeft : 6|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_RSide_CursorDown : 5|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_LSide_OK : 4|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_LSide_CursorUp : 3|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_LSide_CursorRt : 2|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_LSide_CursorLeft : 1|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_LSide_CursorDown : 0|1@0+ (1,0) [0|0] "" XXX + +BO_ 130 EPAS_INFO: 8 XXX + SG_ SteMdule_U_Meas : 39|8@0+ (0.05,6.0) [0|0] "Volts" XXX + SG_ SteMdule_I_Est : 21|12@0+ (0.05,-64.0) [0|0] "Amps" XXX + SG_ EPAS_FAILURE : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SteeringColumnTorque : 7|8@0+ (0.0625,-8.0) [0|0] "Nm" XXX + SG_ SAPPAngleControlStat6 : 15|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat5 : 14|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat4 : 13|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat3 : 12|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat2 : 11|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat1 : 23|2@0+ (1,0) [0|0] "" XXX + +BO_ 131 Steering_Data: 8 XXX + SG_ SteWhlCtl_Mute : 38|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Mode : 24|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_OK : 23|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Phone : 22|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_End : 21|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Send : 20|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Voice_PTT : 19|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Seek_Left : 10|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Seek_Right : 9|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Media : 8|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Volume_Down : 6|1@0+ (1,0) [0|0] "" XXX + SG_ SteWhlCtl_Volume_Up : 7|1@0+ (1,0) [0|0] "" XXX + SG_ Smart_Wiper_Motor_Stat : 15|2@0+ (1,0) [0|0] "" XXX + SG_ Mfs_Turn_Stalk_SW_Status : 1|2@0+ (1,0) [0|0] "" XXX + SG_ HighBeam_FlashToPassSw : 3|2@0+ (1,0) [0|0] "" XXX + SG_ SteColumn_Status : 13|3@0+ (1,0) [0|0] "" XXX + SG_ SteCol_Manual_Override : 4|1@0+ (1,0) [0|0] "" XXX + SG_ CcButtnStat_D_Actl : 34|11@0+ (1,0) [0|0] "" XXX + SG_ HeatedWash_Mode_Stat : 55|3@0+ (1,0) [0|0] "" XXX + SG_ LaSwtchPos_D_Stat : 18|2@0+ (1,0) [0|0] "" XXX + +BO_ 132 Steering_Wheel_Data_CG1: 8 XXX + SG_ SteWhlRelInit_An_Sns : 7|15@0+ (0.1,-1600.0) [0|0] "deg" XXX + SG_ SteWhlRelCalib_An_Sns : 23|15@0+ (0.1,-1600.0) [0|0] "deg" XXX + SG_ SteWhlRelInit2_An_Sns : 55|16@0+ (0.1,-3200.0) [0|0] "deg" XXX + SG_ SteWhlAn_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX + SG_ SteWhlAn_No_Cnt : 47|4@0+ (1,0) [0|0] "Counts" XXX + +BO_ 145 Yaw_Data: 8 XXX + SG_ VehYaw_W_Actl : 39|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX + SG_ VehRol_W_Actl : 23|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX + SG_ VehPtch_W_Actl : 7|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX + +BO_ 146 Accel_Data: 8 XXX + SG_ VehVertAActl_D_Qf : 38|2@0+ (1,0) [0|0] "" XXX + SG_ VehLongAActl_D_Qf : 22|2@0+ (1,0) [0|0] "" XXX + SG_ VehLatAActl_D_Qf : 6|2@0+ (1,0) [0|0] "" XXX + SG_ VehVert_A_Actl : 36|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX + SG_ VehLong_A_Actl : 20|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX + SG_ VehLat_A_Actl : 4|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX + +BO_ 258 Cluster_Legacy: 8 XXX + SG_ Veh_V_CompLimMx : 27|12@0+ (0.1,0) [0|0] "km/h" XXX + SG_ DISPLAY_SPEED_SCALING : 20|4@0+ (0.5,100.0) [0|0] "%" XXX + SG_ DISPLAY_SPEED_OFFSET : 23|3@0+ (0.5,0) [0|0] "kph" XXX + SG_ Reverse_Mirror_Cmd : 10|1@0+ (1,0) [0|0] "" XXX + SG_ Autolamp_Delay_Cmd : 7|8@0+ (1,0) [0|0] "Seconds" XXX + SG_ Running_Board_Cmd : 13|2@0+ (1,0) [0|0] "" XXX + SG_ Power_Liftgate_Mode_Cmd : 11|1@0+ (1,0) [0|0] "" XXX + +BO_ 259 Body_MsgCntr_Stat_CG1: 8 XXX + SG_ PE_PEPS_System_Stat : 47|8@0+ (1,0) [0|0] "" XXX + SG_ Keycode_Status : 11|20@0+ (1,0) [0|0] "" XXX + SG_ Autolamp_Delay_Stat : 7|8@0+ (1,0) [0|0] "Seconds" XXX + SG_ HvacEvap_Te_Rq_UB : 61|1@0+ (1,0) [0|0] "" XXX + SG_ HvacEvap_Te_Rq : 55|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + SG_ Remote_Start_QuietMode_UB : 33|1@0+ (1,0) [0|0] "" XXX + SG_ Remote_Start_QuietMode : 32|1@0+ (1,0) [0|0] "" XXX + +BO_ 264 Side_Detect_CmdM: 8 XXX + SG_ Cross_Traffic_Cmd : 5|2@0+ (1,0) [0|0] "" XXX + SG_ Side_Detect_Cmd : 7|2@0+ (1,0) [0|0] "" XXX + +BO_ 266 ParkAid_Audible_Warn_CmdM: 8 XXX + SG_ AutoPark_Cancel_Request : 15|2@0+ (1,0) [0|0] "" XXX + SG_ ParkAid_Audible_Warn_Cmd : 7|2@0+ (1,0) [0|0] "" XXX + SG_ ParkAid_Aud_Frt_Warn_Cmd : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 267 ParkAid_Audible_Warn_Stat: 8 XXX + SG_ RpaChime_D_Rq : 31|4@0+ (1,0) [0|0] "" XXX + SG_ FpaChime_D_Rq : 12|4@0+ (1,0) [0|0] "" XXX + SG_ SAPPStatusCoding : 23|8@0+ (1,0) [0|0] "" XXX + SG_ Volume_Cutback : 1|1@0+ (1,0) [0|0] "" XXX + SG_ ParkAid_Fault_Condition : 15|3@0+ (1,0) [0|0] "" XXX + SG_ ParkAid_Audible_Warn_Stat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ ParkAid_Aud_Frt_Trgt_Warn : 3|2@0+ (1,0) [0|0] "" XXX + SG_ ParkAid_Aud_Frt_Warn_Stat : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 292 ClmtCtrlSeatSet_Cmd_v2: 8 XXX + SG_ ClmtCtrlSeat_SetCmd_Dvr : 7|8@0+ (1,0) [0|0] "" XXX + SG_ ClmtCtrlSeat_SetCmd_Psgr : 15|8@0+ (1,0) [0|0] "" XXX + +BO_ 293 ClmtCtrlSeatSetStat_v2_HS: 8 XXX + SG_ ClmtCtrlSeat_SetStat_Psgr : 15|8@0+ (1,0) [0|0] "" XXX + SG_ ClmtCtrlSeat_SetStat_Dvr : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 336 TransData_1_CG1: 8 XXX + SG_ TrnAinIdl_N_RqMn : 34|11@0+ (2.0,0) [0|0] "rpm" XXX + SG_ TrnAin_N_RqMxPrtct : 23|10@0+ (25.0,0) [0|0] "rpm" XXX + SG_ TrnAin_Tq_RqFstMx : 29|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAin_Tq_RqSlwMxPrs : 7|11@0+ (1,-500.0) [0|0] "Nm" XXX + +BO_ 337 EngineData_1_CG1: 8 XXX + SG_ TrnEngBrk_B_Allw : 24|1@0+ (1,0) [0|0] "" XXX + SG_ TrnAout_W_ActlUnfilt : 23|15@0+ (0.1,0) [0|0] "rad/s" XXX + SG_ TrnIpcDsplyGear_D_Actl : 7|4@0+ (1,0) [0|0] "" XXX + SG_ TrnIpcDsplyMde_D_Stat : 13|2@0+ (1,0) [0|0] "" XXX + SG_ TrnIpcDsplyMde_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ TrnIpcDsplyGear_D_Stat : 9|2@0+ (1,0) [0|0] "" XXX + SG_ TurboBoostPressure : 55|16@0+ (0.01,0) [0|0] "bar" XXX + +BO_ 338 TransData_2_CG1: 8 XXX + SG_ GearPos_D_Actl : 55|4@0+ (1,0) [0|0] "" XXX + SG_ TrnAout2_Tq_Actl : 39|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + SG_ TrnTotTq_Rt_Actl : 23|16@0+ (0.001,0) [0|0] "" XXX + SG_ TrnGbox_Rt_Pred : 7|16@0+ (0.001,0) [0|0] "" XXX + +BO_ 339 EngineData_2_CG1: 8 XXX + SG_ TrnAin_Tq_MxSpcPdlEngN : 55|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAin_Tq_MnSpcEngN : 31|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ EngPtoEngag_B_Actl : 60|1@0+ (1,0) [0|0] "" XXX + SG_ TrnAin_N_SpcEcho : 4|13@0+ (2.0,0) [0|0] "rpm" XXX + +BO_ 340 EngineData_3_CG1: 8 XXX + SG_ AirAmb_Te_ActlFilt : 33|10@0+ (0.25,-128.0) [0|0] "deg C" XXX + SG_ EngAout_N_RqMxPrtct : 12|13@0+ (2.0,0) [0|0] "rpm" XXX + SG_ TqmTerrMdeChng_D_Rdy : 39|3@0+ (1,0) [0|0] "" XXX + SG_ EngAoutIdl_N_RqVsc : 7|11@0+ (2.0,0) [0|0] "rpm" XXX + SG_ TqmTerrMde_D_Actl : 36|3@0+ (1,0) [0|0] "" XXX + SG_ PrplWhlTotVrt_Tq_RqArb : 55|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + +BO_ 341 EngineData_11_CG1: 8 XXX + SG_ DieslPrtc_D_RqDsply : 42|3@0+ (1,0) [0|0] "" XXX + SG_ EngPullUpPullDown_D_Rq : 20|4@0+ (1,0) [0|0] "" XXX + SG_ TrnAin_Tq_RqDrv : 15|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ DieslPrtcRgen_D_Actl : 4|2@0+ (1,0) [0|0] "" XXX + SG_ DieslPrtcRgen_D_Rq : 7|3@0+ (1,0) [0|0] "" XXX + SG_ EngAout_Aa_Actl : 39|10@0+ (0.05,-25.6) [0|0] "rpm/ms" XXX + SG_ EngIgnIndTq_Rt_MnEc : 31|8@0+ (0.005,0) [0|0] "" XXX + SG_ EngFuelCutFull_B_Allw : 45|1@0+ (1,0) [0|0] "" XXX + SG_ EngStrtStopDis_B_Rq : 0|1@0+ (1,0) [0|0] "" XXX + SG_ PrplTqSys_D_Stat : 2|2@0+ (1,0) [0|0] "" XXX + SG_ EngAoutTqDtrb_B_Actl : 16|1@0+ (1,0) [0|0] "" XXX + SG_ EngTurboMde_D_Actl : 44|2@0+ (1,0) [0|0] "" XXX + SG_ EngTeColdPrtct_D_Stats : 54|2@0+ (1,0) [0|0] "" XXX + SG_ EXHAUST_OVERTEMP_PROTECT : 63|1@0+ (1,0) [0|0] "" XXX + SG_ EngExhOvrTe_B_RqDsply : 55|1@0+ (1,0) [0|0] "" XXX + +BO_ 342 Engine_Data_6: 8 XXX + SG_ EngOvrhtMitgActv_D_Ind : 36|2@0+ (1,0) [0|0] "" XXX + SG_ Res_UreaLvlLo_B_Dsply : 34|1@0+ (1,0) [0|0] "" XXX + SG_ EngClntTe_D_Qf : 33|2@0+ (1,0) [0|0] "" XXX + SG_ EngAcsyArcPmp_Tq_Actl : 63|8@0+ (0.5,0) [0|0] "Nm" XXX + SG_ EngOilLvlDsply_D_Rq : 43|4@0+ (1,0) [0|0] "" XXX + SG_ EngCtlAlive_No_Cnt : 47|4@0+ (1,0) [0|0] "" XXX + SG_ EngCtl_No_Cs : 55|8@0+ (1,0) [0|0] "" XXX + SG_ EngOil_Te_Actl : 15|8@0+ (1,-60.0) [0|0] "degC" XXX + SG_ EngClnt_Te_Actl : 7|8@0+ (1,-60.0) [0|0] "degC" XXX + +BO_ 343 EngineData_13_CG1: 8 XXX + SG_ EngStrtFail_B_Actl : 40|1@0+ (1,0) [0|0] "" XXX + SG_ EngStrt_B_Complt : 24|1@0+ (1,0) [0|0] "" XXX + SG_ EngStrtSpin_B_Rdy : 58|1@0+ (1,0) [0|0] "" XXX + SG_ EngWarmUp_B_Complt : 41|1@0+ (1,0) [0|0] "" XXX + SG_ EngAoutTqCtl_B_Falt : 8|1@0+ (1,0) [0|0] "" XXX + SG_ EngAoutActl_No_Cs : 23|8@0+ (1,0) [0|0] "" XXX + SG_ EngAoutActl_No_Cnt : 45|4@0+ (1,0) [0|0] "" XXX + SG_ VehVLim_V_RqArb : 39|9@0+ (0.5,0) [0|0] "kph" XXX + +BO_ 344 EngineData_14: 8 XXX + SG_ ApedPosScal_Pc_Actl : 9|10@0+ (0.1,0) [0|0] "%" XXX + SG_ ApedPosPcActl_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX + SG_ ApedPosPcActl_No_Cnt : 13|4@0+ (1,0) [0|0] "" XXX + +BO_ 345 Engine_Data_7_CG1: 8 XXX + SG_ EngDecelFuelCut_B_Allw : 25|1@0+ (1,0) [0|0] "" XXX + SG_ FuelFlw_Vl_Dsply : 55|10@0+ (25.0,0) [0|0] "Micro_Liter" XXX + SG_ FuelFillInlet_B_Dsply : 32|1@0+ (1,0) [0|0] "" XXX + SG_ EngSrvcRqd_B_Rq : 24|1@0+ (1,0) [0|0] "" XXX + SG_ OdoCount : 47|8@0+ (0.2,0) [0|0] "Meters" XXX + SG_ EngOilLife_Pc_Actl : 39|7@0+ (1,0) [0|0] "%" XXX + SG_ AirAmbTe_D_Qf : 28|2@0+ (1,0) [0|0] "" XXX + SG_ EngTqSlwDly_T_Est : 23|11@0+ (1,0) [0|0] "ms" XXX + SG_ TrnKickDown_B_RqDrv : 26|1@0+ (1,0) [0|0] "" XXX + SG_ AirAmb_Te_Actl : 1|10@0+ (0.25,-128.0) [0|0] "degC" XXX + SG_ AirAmb_P_Actl : 7|6@0+ (10.0,500.0) [0|0] "mbar" XXX + SG_ FuelFilterLamp_B_Dsply : 56|1@0+ (1,0) [0|0] "" XXX + SG_ AirCondRec_B_Rq : 61|1@0+ (1,0) [0|0] "" XXX + SG_ AirCondEvdc_D_Stats : 60|3@0+ (1,0) [0|0] "" XXX + SG_ AirCondClutch_B_Stats : 57|1@0+ (1,0) [0|0] "" XXX + +BO_ 346 EngineData_4_CG1: 8 XXX + SG_ TrnAin_Tq_Rq : 12|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAin_Tq_RqWoMdfy : 55|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAin_Tq_ActlWoMdfy : 36|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAin_Tq_Actl : 7|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAinCtlN_B_Allw : 41|1@0+ (1,0) [0|0] "" XXX + SG_ TrnAinTq_D_Qf : 17|2@0+ (1,0) [0|0] "" XXX + +BO_ 348 EngineData_16_CG1: 8 XXX + SG_ EngOilLvlWarn_D_Rq1 : 50|3@0+ (1,0) [0|0] "" XXX + SG_ EngExhBrkOnLamp_B_Rq : 51|1@0+ (1,0) [0|0] "" XXX + SG_ EngExhBrkAutoLamp_B_Rq : 8|1@0+ (1,0) [0|0] "" XXX + SG_ EngAout_N_MxAllw : 36|13@0+ (2.0,0) [0|0] "rpm" XXX + SG_ EngAoutIdl_N_MnAllw : 31|11@0+ (1,0) [0|0] "rpm" XXX + SG_ EngAoutIdlRqEc_No_Cs : 23|8@0+ (1,0) [0|0] "" XXX + SG_ EngAoutIdlRqEc_No_Cnt : 12|4@0+ (1,0) [0|0] "" XXX + SG_ EngAoutIdl_N_RqEc : 7|11@0+ (2.0,0) [0|0] "rpm" XXX + SG_ EngExhBrkMde_D_Actl : 55|4@0+ (1,0) [0|0] "" XXX + +BO_ 349 EngineData_17_CG1: 8 XXX + SG_ EngResv_Tq_Actl : 52|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ EngAout_Tq_ActlSlw : 47|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ EngExhCat_Te_Est : 13|10@0+ (2.0,-60.0) [0|0] "degC" XXX + SG_ EngCylCutIndTq_Rt_Actl : 39|8@0+ (0.005,0) [0|0] "Nm" XXX + SG_ Eng_Aa_CalcEvntCyc : 7|10@0+ (0.05,-25.6) [0|0] "rpm/ms" XXX + SG_ Eng_Aa_CalcEvntCbust : 19|10@0+ (0.05,-25.6) [0|0] "rpm/ms" XXX + SG_ WaterInFuel : 25|1@0+ (1,0) [0|0] "" XXX + SG_ GlowIndication : 24|1@0+ (1,0) [0|0] "" XXX + +BO_ 350 EngineData_18_CG1: 8 XXX + SG_ EngAoutTqActl_D_Qf : 17|2@0+ (1,0) [0|0] "" XXX + SG_ EngAout_Tq_MnSpcNRtrd : 36|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ EngAout_Tq_Actl : 31|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ EngAoutLss_Tq_EstSpcN : 12|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ EngAout_Tq_MnSpcN : 7|11@0+ (1,-500.0) [0|0] "Nm" XXX + +BO_ 351 EngineData_19: 8 XXX + SG_ VehPreDelvr_V_LimMx : 15|16@0+ (0.01,0) [0|0] "kph" XXX + SG_ BattLo_U_MeasEngMdule : 7|8@0+ (0.1,0) [0|0] "V" XXX + SG_ EngStall_B_Actl : 47|1@0+ (1,0) [0|0] "" XXX + SG_ EngDashPotActv_B_Actl : 46|1@0+ (1,0) [0|0] "" XXX + SG_ EngAout_Tq_MnAllw : 42|11@0+ (1,-500.0) [0|0] "Nm" XXX + +BO_ 352 TransData_3_CG1: 8 XXX + SG_ TrnAinCtlN_N_RqMx : 7|13@0+ (2.0,0) [0|0] "rpm" XXX + SG_ TrnAin_Tq_RqSlwMxShif : 42|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAinCtlN_B_RqEnbl : 10|1@0+ (1,0) [0|0] "" XXX + SG_ TrnGboxIn_N_Actl : 23|13@0+ (2.0,0) [0|0] "rpm" XXX + +BO_ 353 Engine_Data_8: 8 XXX + SG_ TrnAinTqDtrb_B_Actl : 5|1@0+ (1,0) [0|0] "" XXX + SG_ TrnAin_Tq_MnSpcEngN : 34|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ EngAout_N_RqMnPrtct : 20|13@0+ (2.0,0) [0|0] "rpm" XXX + SG_ EngAout_N_MnAllw : 4|13@0+ (2.0,0) [0|0] "rpm" XXX + +BO_ 354 CGEA_Urea_Strategy_CG1: 8 XXX + SG_ UreaQltySys_D_RqDsply : 27|3@0+ (1,0) [0|0] "" XXX + SG_ UreaLvlTxt_D_RqDsply : 31|4@0+ (1,0) [0|0] "" XXX + SG_ VehUreaImmo_No_DsplyMx : 12|3@0+ (1,0) [0|0] "Counts" XXX + SG_ VehUreaWarn_V_DsplyMx : 23|7@0+ (1,0) [0|0] "km/h" XXX + SG_ VehUreaRnge_L_DsplyMx : 7|11@0+ (1,0) [0|0] "km" XXX + +BO_ 355 EngineData_10: 8 XXX + SG_ WhlRearDual_D_Stat : 57|2@0+ (1,0) [0|0] "" XXX + SG_ EngPtoMde_D_Actl : 60|3@0+ (1,0) [0|0] "" XXX + SG_ ManRgenVeh_V_MinAllw : 55|7@0+ (1,0) [0|0] "kilometer/hour" XXX + SG_ ManRgenTxt_D_RqDsply : 63|3@0+ (1,0) [0|0] "" XXX + SG_ ManRgenSoot_Pc_RqDsply : 39|7@0+ (1,0) [0|0] "%" XXX + SG_ ManRgenInhbt_T_RqDsply : 23|16@0+ (1,0) [0|0] "Minutes" XXX + SG_ ManRgenInhbt_Pc_Soot : 47|7@0+ (1,0) [0|0] "%" XXX + SG_ ManRgenInhbt_L_RqDsply : 7|16@0+ (1,0) [0|0] "kilometer" XXX + +BO_ 357 EngBrakeData: 8 XXX + SG_ CmbbDeny_B_ActlPrpl : 3|1@0+ (1,0) [0|0] "" XXX + SG_ BpedDrvAppl_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX + SG_ BpedDrvAppl_No_Cnt : 27|4@0+ (1,0) [0|0] "" XXX + SG_ BpedDrvAppl_D_Actl : 31|2@0+ (1,0) [0|0] "" XXX + SG_ CmbbEngTqMn_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX + SG_ Veh_V_DsplyCcSet : 23|8@0+ (1,0) [0|0] "" XXX + SG_ AccEngStat_D_Actl : 2|3@0+ (1,0) [0|0] "" XXX + SG_ CcMde_D_Actl : 13|3@0+ (1,0) [0|0] "" XXX + SG_ TrnAinTqDtrb_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX + SG_ CcStat_D_Actl : 10|3@0+ (1,0) [0|0] "" XXX + SG_ CcOvrrdActv_B_Actl : 15|1@0+ (1,0) [0|0] "" XXX + SG_ PwPck_D_Stat : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 389 ACCDATA_CG1: 8 XXX + SG_ AccPrpl_A_Pred : 14|10@0+ (0.01,-5.0) [0|0] "m/s^2" XXX + SG_ AccBrkPrkEl_B_Rq : 41|1@0+ (1,0) [0|0] "" XXX + SG_ Cmbb_B_Enbl : 56|1@0+ (1,0) [0|0] "" XXX + SG_ CmbbOvrrd_B_RqDrv : 57|1@0+ (1,0) [0|0] "" XXX + SG_ CmbbDeny_B_Actl : 40|1@0+ (1,0) [0|0] "" XXX + SG_ AccVeh_V_Trg : 7|9@0+ (0.5,0) [0|0] "kph" XXX + SG_ CmbbEngTqMn_B_Rq : 58|1@0+ (1,0) [0|0] "" XXX + SG_ AccPrpl_A_Rq : 55|10@0+ (0.01,-5.0) [0|0] "m/s^2" XXX + SG_ AccDeny_B_Rq : 59|1@0+ (1,0) [0|0] "" XXX + SG_ AccCancl_B_Rq : 42|1@0+ (1,0) [0|0] "" XXX + SG_ AccBrkTot_A_Rq : 39|13@0+ (0.0039,-20.0) [0|0] "m/s^2" XXX + SG_ AccBrkPrchg_B_Rq : 60|1@0+ (1,0) [0|0] "" XXX + SG_ AccBrkDecel_B_Rq : 61|1@0+ (1,0) [0|0] "" XXX + +BO_ 392 HeadUpDisplayStat: 8 XXX + SG_ Hud_B_Falt : 5|1@0+ (1,0) [0|0] "" XXX + SG_ HudActv_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX + SG_ Hud_B_Avail : 6|1@0+ (1,0) [0|0] "" XXX + +BO_ 393 ACCDATA_2_CG1: 8 XXX + SG_ ACC_AUTOBRAKE_CANCEL : 56|1@0+ (1,0) [0|0] "" XXX + SG_ ACC_RESUME_ACTIVE : 57|1@0+ (1,0) [0|0] "" XXX + SG_ FcwAudioWarn_B_Rq : 58|1@0+ (1,0) [0|0] "" XXX + SG_ CadsAudioMute_D_Rq : 61|2@0+ (1,0) [0|0] "" XXX + SG_ AccWarn_D_Dsply : 63|2@0+ (1,0) [0|0] "" XXX + SG_ HudDsplyIntns_No_Actl : 55|8@0+ (0.5,0) [0|0] "%" XXX + SG_ FcwVisblWarn_B_Rq : 40|1@0+ (1,0) [0|0] "" XXX + SG_ HudBlk3_B_Rq : 41|1@0+ (1,0) [0|0] "" XXX + SG_ HudBlk2_B_Rq : 43|1@0+ (1,0) [0|0] "" XXX + SG_ HudBlk1_B_Rq : 42|1@0+ (1,0) [0|0] "" XXX + SG_ HudFlashRate_D_Actl : 45|2@0+ (1,0) [0|0] "" XXX + SG_ CmbbBrkDecel_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX + SG_ CmbbBrkDecel_A_Rq : 23|13@0+ (0.0039,-20.0) [0|0] "m/s^2" XXX + SG_ CmbbBrkPrchg_D_Rq : 47|2@0+ (1,0) [0|0] "" XXX + SG_ CmbbBrkDecel_B_Rq : 26|1@0+ (1,0) [0|0] "" XXX + SG_ CmbbBaSens_D_Rq : 25|2@0+ (1,0) [0|0] "" XXX + SG_ AccPrpl_V_Rq : 7|16@0+ (0.01,0) [0|0] "kph" XXX + +BO_ 394 ACCDATA_3: 8 XXX + SG_ CadsMntr_No_Chk : 55|8@0+ (1,0) [0|0] "" XXX + SG_ FcwDeny_B_Dsply : 10|1@0+ (1,0) [0|0] "" XXX + SG_ FdaWarn_B_Rq : 21|1@0+ (1,0) [0|0] "" XXX + SG_ FcwMemStat_B_Actl : 30|1@0+ (1,0) [0|0] "" XXX + SG_ AccTGap_B_Dsply : 35|1@0+ (1,0) [0|0] "" XXX + SG_ AccMsgTxt_D_Rq : 39|4@0+ (1,0) [0|0] "" XXX + SG_ CadsAlignIncplt_B_Actl : 29|1@0+ (1,0) [0|0] "" XXX + SG_ AccLowVMde_B_Dsply : 16|1@0+ (1,0) [0|0] "" XXX + SG_ AccFllwMde_B_Dsply : 17|1@0+ (1,0) [0|0] "" XXX + SG_ CadsRadrBlck_B_Actl : 22|1@0+ (1,0) [0|0] "" XXX + SG_ FdaStat_D_Dsply : 3|3@0+ (1,0) [0|0] "" XXX + SG_ FdaDeny_B_Dsply : 4|1@0+ (1,0) [0|0] "" XXX + SG_ AccTrgDist_D_Dsply : 28|4@0+ (1,0) [0|0] "" XXX + SG_ CadsChime_B_Rq : 24|1@0+ (1,0) [0|0] "" XXX + SG_ CmbbPostEvnt_B_Dsply : 15|1@0+ (1,0) [0|0] "" XXX + SG_ FcwCmbbSrvcRqd_B_Rq : 12|1@0+ (1,0) [0|0] "" XXX + SG_ AccStopMde_B_Dsply : 0|1@0+ (1,0) [0|0] "" XXX + SG_ CadsCamraBlck_B_Actl : 23|1@0+ (1,0) [0|0] "" XXX + SG_ FcwMemSens_D_Actl : 20|2@0+ (1,0) [0|0] "" XXX + SG_ FcwMemDfaltOn_B_Actl : 18|1@0+ (1,0) [0|0] "" XXX + SG_ AccSrvcRqd_B_Rq : 14|1@0+ (1,0) [0|0] "" XXX + SG_ FcwMsgTxt_D_Rq : 7|3@0+ (1,0) [0|0] "" XXX + SG_ FcwMemAudioOn_B_Actl : 9|1@0+ (1,0) [0|0] "" XXX + SG_ AccTGap_D_Dsply : 34|3@0+ (1,0) [0|0] "" XXX + SG_ AccMemEnbl_B_RqDrv : 42|1@0+ (1,0) [0|0] "" XXX + SG_ FdaMem_B_Stat : 41|1@0+ (1,0) [0|0] "" XXX + +BO_ 512 TorqueDataEngFlags: 8 XXX + SG_ BrkOnOffSwtch_D_Actl : 54|2@0+ (1,0) [0|0] "" XXX + SG_ PrplTqMnSat_B_Actl : 55|1@0+ (1,0) [0|0] "" XXX + SG_ PrplWhlTot_Tq_Rq : 39|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + SG_ PrplWhlTot_Tq_LimMn : 23|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + SG_ PrplWhlTot_Tq_Actl : 7|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + SG_ ACCompressorDisp : 63|7@0+ (1,0) [0|0] "%" XXX + +BO_ 513 EngVehicleSpThrottle_CG1: 8 XXX + SG_ ApedPos_PcRate_ActlArb : 63|8@0+ (0.04,-5.0) [0|0] "%/ms" XXX + SG_ Veh_V_RqCcSet : 45|9@0+ (0.5,0) [0|0] "kph" XXX + SG_ VehVActlEng_D_Qf : 9|2@0+ (1,0) [0|0] "" XXX + SG_ reserve : 10|1@0+ (1,0) [0|0] "" XXX + SG_ EngAout_N_Actl : 7|13@0+ (2.0,0) [0|0] "rpm" XXX + SG_ Veh_V_ActlEng : 23|16@0+ (0.01,0) [0|0] "kph" XXX + SG_ ApedPos_Pc_ActlArb : 39|10@0+ (0.1,0) [0|0] "%" XXX + SG_ ApedPosPcActl_D_Qf : 52|2@0+ (1,0) [0|0] "" XXX + SG_ Autostart_B_Stat : 50|1@0+ (1,0) [0|0] "" XXX + +BO_ 529 DesiredTorqBrk_CG1: 8 XXX + SG_ CmbbBrkDis_B_Actl : 56|1@0+ (1,0) [0|0] "" XXX + SG_ CMbbDeny_B_ActlBrk : 60|1@0+ (1,0) [0|0] "" XXX + SG_ RgenTqLimActv_B_Actl : 32|1@0+ (1,0) [0|0] "" XXX + SG_ CcDis_B_Cmd : 53|1@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrk_Pc_Rq : 39|7@0+ (1,0) [0|0] "%" XXX + SG_ RearDiffLck_Tq_RqMx : 23|12@0+ (1,0) [0|0] "Nm" XXX + SG_ VehLongOvrGnd_A_Est : 47|10@0+ (0.035,-17.9) [0|0] "m/s^2" XXX + SG_ StabCtlBrkActv_B_Actl : 27|1@0+ (1,0) [0|0] "" XXX + SG_ CmbbBrkPrchg_B_Actl : 59|1@0+ (1,0) [0|0] "" XXX + SG_ CmbbBrkDecel_B_Actl : 58|1@0+ (1,0) [0|0] "" XXX + SG_ CmbbBaSensInc_B_Actl : 57|1@0+ (1,0) [0|0] "" XXX + SG_ AccBrkWarm_B_Actl : 63|1@0+ (1,0) [0|0] "" XXX + SG_ AccBrkTotTqMn_B_Actl : 62|1@0+ (1,0) [0|0] "" XXX + SG_ AccBrkPrchgActv_B_Actl : 61|1@0+ (1,0) [0|0] "" XXX + SG_ AccBrkDis_B_Actl : 50|1@0+ (1,0) [0|0] "" XXX + SG_ AccBrkDeny_B_Actl : 49|1@0+ (1,0) [0|0] "" XXX + SG_ AccBrkActv_B_Actl : 48|1@0+ (1,0) [0|0] "" XXX + SG_ PrplDrgCtlActv_B_Actl : 52|1@0+ (1,0) [0|0] "" XXX + SG_ PrplWhlTot_Tq_RqMx : 7|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + SG_ AbsActv_B_Actl : 51|1@0+ (1,0) [0|0] "" XXX + +BO_ 533 WheelSpeed_CG1: 8 XXX + SG_ WhlRr_W_Meas : 55|15@0+ (0.01,0) [0|0] "rad/s" XXX + SG_ WhlRl_W_Meas : 39|15@0+ (0.01,0) [0|0] "rad/s" XXX + SG_ WhlFr_W_Meas : 23|15@0+ (0.01,0) [0|0] "rad/s" XXX + SG_ WhlFl_W_Meas : 7|15@0+ (0.01,0) [0|0] "rad/s" XXX + +BO_ 534 WheelData: 8 XXX + SG_ WhlRotatRr_No_Cnt : 23|8@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRr_D_Actl : 33|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRl_D_Actl : 39|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirFr_D_Actl : 37|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirFl_D_Actl : 35|2@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatRl_No_Cnt : 31|8@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatFr_No_Cnt : 7|8@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatFl_No_Cnt : 15|8@0+ (1,0) [0|0] "" XXX + SG_ WHEEL_ROLLING_TIMESTAMP : 47|8@0+ (1,0) [0|0] "" XXX + +BO_ 557 InfoCAN_22D: 8 XXX + SG_ Multimedia_System : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 560 TransGearData: 8 XXX + SG_ TrnIpcDsplyRng_D_Actl : 14|3@0+ (1,0) [0|0] "" XXX + SG_ TrnGbox_Rt_Actl : 47|16@0+ (0.001,0) [0|0] "" XXX + SG_ TrnShifMde_D_RqDrv : 3|3@0+ (1,0) [0|0] "" XXX + SG_ TrnSrvcRqd_B_Rq : 63|1@0+ (1,0) [0|0] "" XXX + SG_ GearPos_D_Trg : 7|4@0+ (1,0) [0|0] "" XXX + SG_ TrnCnvtClu_D_Actl : 11|2@0+ (1,0) [0|0] "" XXX + SG_ TrnShifActv_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX + SG_ RtmTerrMdeChng_D_Rdy : 58|3@0+ (1,0) [0|0] "" XXX + SG_ RtmTerrMde_D_Actl : 61|3@0+ (1,0) [0|0] "" XXX + SG_ GearRvrseActv_B_Actl : 62|1@0+ (1,0) [0|0] "" XXX + SG_ GearLvrPos_D_Actl : 23|4@0+ (1,0) [0|0] "" XXX + SG_ GboxOil_Te_Actl : 31|8@0+ (1,-60.0) [0|0] "degC" XXX + +BO_ 561 TransGearData_2: 8 XXX + SG_ MtrGen1Aout_Tq_Rq : 53|14@0+ (0.1,-800.0) [0|0] "Nm" XXX + SG_ MtrGen1AoutTqRq_No_Cs : 7|8@0+ (1,0) [0|0] "" XXX + SG_ MtrGen1AoutTqRq_No_Cnt : 15|4@0+ (1,0) [0|0] "" XXX + SG_ CoolFanTrn_D_Rq : 31|5@0+ (1,0) [0|0] "" XXX + SG_ TrnMsgTxt_D_Rq : 39|4@0+ (1,0) [0|0] "" XXX + SG_ TrnMil_D_Rq : 26|2@0+ (1,0) [0|0] "" XXX + SG_ EngExhBrkTq_Pc_Rq : 23|7@0+ (1,0) [0|0] "%" XXX + +BO_ 562 TransGearData_3_CG1: 8 XXX + SG_ TrnPto_D_Rdy : 12|2@0+ (1,0) [0|0] "" XXX + SG_ TipInMgrInhbt_B_RqTrn : 41|1@0+ (1,0) [0|0] "" XXX + SG_ TrnAinIdl_Tq_Actl : 39|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAinLss_Tq_Est : 7|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAin_Tq_RqSlwMn : 23|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ GearEngag_D_Actl : 10|3@0+ (1,0) [0|0] "" XXX + SG_ TrnAinTqDtrb_B_Rq : 40|1@0+ (1,0) [0|0] "" XXX + SG_ TrnTotLss_Tq_Actl : 55|8@0+ (0.5,0) [0|0] "Nm" XXX + +BO_ 563 TransGearData_4_CG1: 8 XXX + SG_ TrnAinCtlN_N_RqMn : 20|13@0+ (2.0,0) [0|0] "rpm" XXX + SG_ TrnAinTqMn_No_Cs : 63|8@0+ (1,0) [0|0] "" XXX + SG_ TrnAinTqMn_No_Cnt : 11|4@0+ (1,0) [0|0] "" XXX + SG_ TrnAinRq_Pc_SpcPdl : 7|10@0+ (0.1,0) [0|0] "%" XXX + SG_ TrnAin_Tq_RqFstMn : 42|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ TrnAin_N_SpcEng : 39|13@0+ (2.0,0) [0|0] "rpm" XXX + +BO_ 570 Suspension_Stat: 8 XXX + SG_ CcdMsgTxt_D_RqDsply : 7|4@0+ (1,0) [0|0] "" XXX + SG_ SuspRear_L_Prev : 48|9@0+ (0.782779,-200.0) [0|0] "millimeter" XXX + SG_ SuspRear_L_Actl : 32|9@0+ (0.782779,-200.0) [0|0] "millimeter" XXX + SG_ SuspFrnt_L_Prev : 16|9@0+ (0.782779,-200.0) [0|0] "millimeter" XXX + SG_ SuspFrnt_L_Actl : 0|9@0+ (0.782779,-200.0) [0|0] "millimeter" XXX + +BO_ 571 ColumnLockData: 8 XXX + SG_ SteWhlLckMsgTxt_D_Rq : 7|2@0+ (1,0) [0|0] "" XXX + +BO_ 576 Body_Information_4_CG1: 8 XXX + SG_ HvacRec_Pc_Est_UB : 51|1@0+ (1,0) [0|0] "" XXX + SG_ HvacRec_Pc_Est : 38|7@0+ (1,0) [0|0] "%" XXX + SG_ HvacEngIdleInc_B_Rq_UB : 49|1@0+ (1,0) [0|0] "" XXX + SG_ HvacEngIdleInc_B_Rq : 53|1@0+ (1,0) [0|0] "" XXX + SG_ HvacAir_Flw_Est_UB : 52|1@0+ (1,0) [0|0] "" XXX + SG_ HvacAir_Flw_Est : 31|9@0+ (0.5,0) [0|0] "liter/second" XXX + SG_ AmbTempImpr_UB : 50|1@0+ (1,0) [0|0] "" XXX + SG_ AmbTempImpr : 47|10@0+ (0.25,-128.0) [0|0] "degreesC" XXX + SG_ DriverCrankingReq : 16|1@0+ (1,0) [0|0] "" XXX + SG_ Fcw_B_DenyMntr : 23|1@0+ (1,0) [0|0] "" XXX + SG_ EngOff_T_Actl : 7|16@0+ (1,0) [0|0] "seconds" XXX + SG_ CmbbMntr_B_Err : 22|1@0+ (1,0) [0|0] "" XXX + SG_ CmbbDeny_B_RqMntr : 21|1@0+ (1,0) [0|0] "" XXX + SG_ AccMntr_B_Err : 20|1@0+ (1,0) [0|0] "" XXX + SG_ AccDeny_B_RqMntr : 19|1@0+ (1,0) [0|0] "" XXX + +BO_ 592 EONV_Status: 8 XXX + SG_ EONV_FAULT : 59|1@0+ (1,0) [0|0] "" XXX + SG_ EONV_KAL_IC_RQST : 53|1@0+ (1,0) [0|0] "" XXX + SG_ EONV_T_STATUS : 61|2@0+ (1,0) [0|0] "" XXX + SG_ EONV_VREF_FLT : 62|1@0+ (1,0) [0|0] "" XXX + SG_ EONV_VBATT_FLT : 63|1@0+ (1,0) [0|0] "" XXX + SG_ EONV_CANISTER_VENT_FLT : 54|1@0+ (1,0) [0|0] "" XXX + SG_ EONV_CVS_CLOSED : 55|1@0+ (1,0) [0|0] "" XXX + SG_ EONV_BATT_VOLT : 23|16@0+ (0.0009765625,0) [0|0] "volts" XXX + SG_ EONV_TANK_FLT : 48|1@0+ (1,0) [0|0] "" XXX + SG_ EONV_TANK_PRESS : 7|16@0+ (0.001953125,-64.0) [0|0] "inches H2O" XXX + +BO_ 597 EONV_Control: 8 XXX + SG_ EONV_POS_DET_THRESHOLD : 23|16@0+ (0.001953125,-64.0) [0|0] "inches H2O" XXX + SG_ EONV_STAY_ALIVE : 15|1@0+ (1,0) [0|0] "" XXX + SG_ EONV_CVS_MODE : 7|3@0+ (1,0) [0|0] "" XXX + SG_ EONV_NEG_DET_THRESHOLD : 39|16@0+ (0.001953125,-64.0) [0|0] "inches H2O" XXX + SG_ EONV_MIL_ON : 14|1@0+ (1,0) [0|0] "" XXX + SG_ EonvMsgTxOff_B_Rq : 4|1@0+ (1,0) [0|0] "" XXX + +BO_ 608 Information4x4_CG1: 8 XXX + SG_ AwdRngeShifActv_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX + SG_ TrnAout_Tq_RqMx : 47|13@0+ (1,-1250.0) [0|0] "Nm" XXX + SG_ AwdRngeFalt_D_Stat : 4|2@0+ (1,0) [0|0] "" XXX + SG_ AwdLck_Tq_Actl : 15|12@0+ (1,0) [0|0] "Nm" XXX + SG_ AwdRnge_D_Actl : 7|3@0+ (1,0) [0|0] "" XXX + SG_ AwdTerrMdeChng_D_Rdy : 50|3@0+ (1,0) [0|0] "" XXX + SG_ AwdTerrMde_D_Actl : 58|3@0+ (1,0) [0|0] "" XXX + SG_ AwdOffRoadMode_D_Stats : 25|2@0+ (1,0) [0|0] "" XXX + SG_ AwdStat_D_RqDsply : 63|5@0+ (1,0) [0|0] "" XXX + SG_ AwdLoLamp_D_RqDsply : 35|2@0+ (1,0) [0|0] "" XXX + SG_ AwdHiLamp_D_RqDsply : 19|2@0+ (1,0) [0|0] "" XXX + SG_ AwdAutoLamp_D_RqDsply : 17|2@0+ (1,0) [0|0] "" XXX + SG_ AwdLckLamp_D_RqDsply : 27|2@0+ (1,0) [0|0] "" XXX + SG_ AwdLck_D_Stat : 31|4@0+ (1,0) [0|0] "" XXX + SG_ Awd2wdLamp_D_RqDsply : 2|2@0+ (1,0) [0|0] "" XXX + +BO_ 609 AWD_4x4_Data: 8 XXX + SG_ AwdLck_Tq_Rq : 27|12@0+ (1,0) [0|0] "Nm" XXX + SG_ AwdSrvcRqd_B_Rq : 44|1@0+ (1,0) [0|0] "" XXX + +BO_ 613 PassengerSeatOCSInfo: 8 XXX + SG_ VehicleMYCalibrationId : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VehicleCalibrationId : 31|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSensrDataUpperLim : 15|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSensrDataLowerLim : 23|8@0+ (1,0) [0|0] "" XXX + SG_ OCSLevel2Error : 0|1@0+ (1,0) [0|0] "" XXX + SG_ ObjectEntrapped : 2|1@0+ (1,0) [0|0] "" XXX + SG_ OCSLevel1Error : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 736 FCIM_Button_Press_HS: 8 XXX + SG_ FCIM_Target_ID : 13|4@0+ (1,0) [0|0] "" XXX + SG_ FCIM_Button_Type : 7|8@0+ (1,0) [0|0] "" XXX + SG_ FCIM_Button_State : 15|2@0+ (1,0) [0|0] "" XXX + SG_ FCIM_Target_ID_UB : 23|1@0+ (1,0) [0|0] "" XXX + SG_ FCIM_Button_Type_UB : 9|1@0+ (1,0) [0|0] "" XXX + SG_ FCIM_Button_State_UB : 8|1@0+ (1,0) [0|0] "" XXX + +BO_ 806 Compressor_Req_HS: 8 XXX + SG_ HvacEvap_Te_Rq : 33|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + SG_ HvacEvap_Te_Actl : 17|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + SG_ HvacAirCond_B_Rq : 7|1@0+ (1,0) [0|0] "" XXX + SG_ HvacEvap_Te_Offst : 1|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + +BO_ 832 RCMStatusMessage: 8 XXX + SG_ eCallNotification : 2|2@0+ (1,0) [0|0] "" XXX + SG_ CrashNotification : 5|1@0+ (1,0) [0|0] "" XXX + SG_ ThirdRowBucklePsngr : 57|2@0+ (1,0) [0|0] "" XXX + SG_ ThirdRowBuckleMid : 59|2@0+ (1,0) [0|0] "" XXX + SG_ ThirdRowBuckleDriver : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBucklePsngr : 63|2@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBuckleMid : 49|2@0+ (1,0) [0|0] "" XXX + SG_ SecondRowBuckleDriver : 51|2@0+ (1,0) [0|0] "" XXX + SG_ FirstRowBuckleDriver : 55|2@0+ (1,0) [0|0] "" XXX + SG_ RstrnTotalEvntCnt : 43|4@0+ (1,0) [0|0] "" XXX + SG_ RstrnCurrentEvntCnt : 39|8@0+ (1,0) [0|0] "" XXX + SG_ RILReq : 15|2@0+ (1,0) [0|0] "" XXX + SG_ FuelCutoffReq : 13|4@0+ (1,0) [0|0] "" XXX + SG_ SeatbeltIndicatorReq : 9|1@0+ (1,0) [0|0] "" XXX + SG_ SeatbeltChimeReq : 8|1@0+ (1,0) [0|0] "" XXX + SG_ BeltMinderProgConfReq : 21|2@0+ (1,0) [0|0] "" XXX + SG_ BeltMinderLevelReq : 19|4@0+ (1,0) [0|0] "" XXX + SG_ FirstRowBucklePsngr : 53|2@0+ (1,0) [0|0] "" XXX + SG_ InfoLampReq : 29|1@0+ (1,0) [0|0] "" XXX + SG_ GenRedLampReq : 28|1@0+ (1,0) [0|0] "" XXX + SG_ RstrnTextMsgReq : 27|2@0+ (1,0) [0|0] "" XXX + SG_ OCSSerialNumRcvd : 3|1@0+ (1,0) [0|0] "" XXX + SG_ RstrnStatDeployEnbld : 6|1@0+ (1,0) [0|0] "" XXX + SG_ RstrnImpactEvntStatus : 46|3@0+ (1,0) [0|0] "" XXX + SG_ PassRstrnInd_Req : 25|2@0+ (1,0) [0|0] "" XXX + SG_ RstrnStatTrigEvnt : 7|1@0+ (1,0) [0|0] "" XXX + SG_ PsngrFrntDetct_D_Actl : 31|2@0+ (1,0) [0|0] "" XXX + SG_ Beltminder_Warn_Stats : 22|1@0+ (1,0) [0|0] "" XXX + SG_ EDRTriggerEvntSync : 47|1@0+ (1,0) [0|0] "" XXX + +BO_ 842 MassageSeat_Data1_HS: 8 XXX + SG_ SeatLmbrUpDrv_Pc_Actl : 38|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatLmbrMidDrv_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatLmbrLoDrv_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatBlUpDrv_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatBlLoDrv_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX + +BO_ 843 MassageSeat_Data2_HS: 8 XXX + SG_ SeatLmbrUpPsgr_Pc_Actl : 38|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatLmbrMidPsgr_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatLmbrLoPsgr_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatBlUpPsgr_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatBlLoPsgr_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX + +BO_ 844 MassageSeat_Stat1_HS: 8 XXX + SG_ StmsLmbrDrv_D_Stat : 17|2@0+ (1,0) [0|0] "" XXX + SG_ StmsCshnDrv_D_Stat : 19|2@0+ (1,0) [0|0] "" XXX + SG_ SeatSwtchDrv_B_Stat : 31|1@0+ (1,0) [0|0] "" XXX + SG_ SeatFnDrv_D_Stat : 23|3@0+ (1,0) [0|0] "" XXX + SG_ SeatAirAmb_P_Actl : 7|16@0+ (0.01,0) [0|0] "KiloPascal" XXX + SG_ SeatPDrv_B_Stat : 20|1@0+ (1,0) [0|0] "" XXX + +BO_ 845 MassageSeat_Stat2_HS: 8 XXX + SG_ StmsLmbrPsgr_D_Stat : 15|2@0+ (1,0) [0|0] "" XXX + SG_ StmsCshnPsgr_D_Stat : 13|2@0+ (1,0) [0|0] "" XXX + SG_ SeatSwtchPsgr_B_Stat : 11|1@0+ (1,0) [0|0] "" XXX + SG_ SeatPPsgr_B_Stat : 7|1@0+ (1,0) [0|0] "" XXX + SG_ SeatFnPsgr_D_Stat : 6|3@0+ (1,0) [0|0] "" XXX + SG_ PsgrMemFeedback_Rsp : 3|4@0+ (1,0) [0|0] "" XXX + +BO_ 846 MassageSeat_Req: 8 XXX + SG_ SeatFnPsgr_D_Rq : 15|3@0+ (1,0) [0|0] "" XXX + SG_ SeatFnDrv_D_Rq : 12|3@0+ (1,0) [0|0] "" XXX + SG_ SeatFnDfaltPsgr_B_Rq : 9|1@0+ (1,0) [0|0] "" XXX + SG_ SeatFnDfaltDrv_B_Rq : 8|1@0+ (1,0) [0|0] "" XXX + SG_ SeatFnChngPsgr_D_Rq : 7|2@0+ (1,0) [0|0] "" XXX + SG_ SeatFnChngDrv_D_Rq : 5|2@0+ (1,0) [0|0] "" XXX + SG_ PsgrMemory_Rq : 3|4@0+ (1,0) [0|0] "" XXX + +BO_ 848 RestraintsData: 8 XXX + SG_ PassRstrnInd_Stat_UB : 9|1@0+ (1,0) [0|0] "" XXX + SG_ SeatBltWrnChmeStat : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Seatbelt_IndctrStat : 4|3@0+ (1,0) [0|0] "" XXX + SG_ RILStat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ PassRstrnInd_Stat : 15|4@0+ (1,0) [0|0] "" XXX + +BO_ 849 MassageSeat_Data3_HS: 8 XXX + SG_ SeatCshnDrvRR_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnDrvRL_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnDrvFR_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnDrvFL_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX + +BO_ 850 MassageSeat_Data4_HS: 8 XXX + SG_ SeatCshnPsgrRR_Pc_Actl : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnPsgrRL_Pc_Actl : 22|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnPsgrFR_Pc_Actl : 14|7@0+ (1,0) [0|0] "%" XXX + SG_ SeatCshnPsgrFL_Pc_Actl : 6|7@0+ (1,0) [0|0] "%" XXX + +BO_ 853 EFP_CC_Status: 8 XXX + SG_ Save_My_Temp : 59|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Left_Temp_Setpt : 31|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RrDefrost_HtdMirrorReq : 60|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Control_Status : 16|1@0+ (1,0) [0|0] "" XXX + SG_ MultipleButtonPressReq : 63|3@0+ (1,0) [0|0] "" XXX + SG_ Rear_System_Mode_Req : 19|3@0+ (1,0) [0|0] "" XXX + SG_ Rear_Left_Temp_Setpt : 47|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ Recirc_Request : 23|2@0+ (1,0) [0|0] "" XXX + SG_ Front_Rt_Temp_Setpt : 39|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ AC_Request : 21|2@0+ (1,0) [0|0] "" XXX + SG_ Windshield_ModeRequest : 15|4@0+ (8.33,0) [0|0] "%" XXX + SG_ Panel_Mode_Request : 7|4@0+ (8.33,0) [0|0] "%" XXX + SG_ Overriding_ModeReq : 10|3@0+ (1,0) [0|0] "" XXX + SG_ Forced_Recirc_Req : 11|1@0+ (1,0) [0|0] "" XXX + SG_ Floor_Mode_Request : 3|4@0+ (8.33,0) [0|0] "%" XXX + SG_ Rear_Right_Temp_Setpt : 55|8@0+ (1,0) [0|0] "Mixed" XXX + +BO_ 854 EFP_CC_Seat_Req_Stat: 8 XXX + SG_ Front_Rear_Blower_Req : 31|6@0+ (1,0) [0|0] "Detents" XXX + SG_ Pass_Rr_Cond_Seat_Req : 21|2@0+ (1,0) [0|0] "" XXX + SG_ Pass_Rr_Cond_Seat_Lvl : 8|3@0+ (1,0) [0|0] "" XXX + SG_ Pass_Fr_Cond_Seat_Req : 13|2@0+ (1,0) [0|0] "" XXX + SG_ Pass_Fr_Cond_Seat_Lvl : 11|3@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Rr_Cond_Seat_Req : 15|2@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Rr_Cond_Seat_Lvl : 2|3@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Fr_Cond_Seat_Req : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Fr_Cond_Seat_Lvl : 5|3@0+ (1,0) [0|0] "" XXX + +BO_ 855 RCCM_CC_Status_HS: 8 XXX + SG_ RrBlwrCondStLdShedStat : 25|2@0+ (1,0) [0|0] "" XXX + SG_ FrBlwrCondStLdShedStat : 20|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_Rr_Rt_TempSetpt : 63|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RCCM_Rr_Left_TempSetpt : 55|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RCCM_Fr_Rt_TempSetpt : 47|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RCCM_Fr_Rr_Blower_Req : 31|6@0+ (1,0) [0|0] "Detents" XXX + SG_ Panel_Mode_State : 7|4@0+ (8.33,0) [0|0] "%" XXX + SG_ RrDefHtdMirrLdShedStat : 18|2@0+ (1,0) [0|0] "" XXX + SG_ Windshield_Mode_State : 15|4@0+ (8.33,0) [0|0] "%" XXX + SG_ Recirc_Door_State : 11|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_System_Mode_State : 23|3@0+ (1,0) [0|0] "" XXX + SG_ Default_Defrost_State : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Auto_AC_Indicator_Temp : 16|1@0+ (1,0) [0|0] "" XXX + SG_ Floor_Mode_State : 3|4@0+ (8.33,0) [0|0] "%" XXX + SG_ RCCM_Fr_Left_TempSetpt : 39|8@0+ (1,0) [0|0] "Mixed" XXX + SG_ RrDefrost_HtdMirrState : 8|1@0+ (1,0) [0|0] "" XXX + +BO_ 856 RCCM_CC_Seat_Status_HS: 8 XXX + SG_ Active_My_Temp : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CC_HtdStrWhl_Req : 24|1@0+ (1,0) [0|0] "" XXX + SG_ RCCM_PR_Cond_Seat_Lvl : 31|3@0+ (1,0) [0|0] "" XXX + SG_ RCCM_PR_Cond_Seat_Req : 28|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_PF_Cond_Seat_Req : 20|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_PF_Cond_Seat_Lvl : 23|3@0+ (1,0) [0|0] "" XXX + SG_ RCCM_DR_Cond_Seat_Req : 12|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_DR_Cond_Seat_Lvl : 15|3@0+ (1,0) [0|0] "" XXX + SG_ RCCM_DF_Cond_Seat_Req : 4|2@0+ (1,0) [0|0] "" XXX + SG_ RCCM_DF_Cond_Seat_Lvl : 7|3@0+ (1,0) [0|0] "" XXX + SG_ PassRrCondStLdShedStat : 26|2@0+ (1,0) [0|0] "" XXX + SG_ PassFrCondStLdShedStat : 18|2@0+ (1,0) [0|0] "" XXX + SG_ DrvRrCondStLdShedStat : 10|2@0+ (1,0) [0|0] "" XXX + SG_ DrvFrCondStLdShedStat : 1|2@0+ (1,0) [0|0] "" XXX + +BO_ 857 RCCM_CC_MBP_Press_Stat_HS: 8 XXX + SG_ MultBtnPushDsplyPass10 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ MultBtnPushDsplyPass1 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ Report_Active : 33|2@0+ (1,0) [0|0] "" XXX + SG_ Pass_Temp_Units : 35|1@0+ (1,0) [0|0] "" XXX + SG_ Front_Fan_Bars_Disply : 39|3@0+ (1,0) [0|0] "" XXX + SG_ Drvr_Temp_Units : 36|1@0+ (1,0) [0|0] "" XXX + SG_ MultBtnPushDsplyDrvr10 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ MultBtnPushDsplyDrvr1 : 15|8@0+ (1,0) [0|0] "" XXX + +BO_ 859 MFD_CC_Status_HS: 8 XXX + SG_ Rear_Mode_Bttn_Status : 38|1@0+ (1,0) [0|0] "" XXX + SG_ ConditionSt_ButtonStat : 20|5@0+ (1,0) [0|0] "" XXX + SG_ Driver_Set_Temp : 31|8@0+ (0.5,0) [0|0] "Degrees" XXX + SG_ Frt_System_Button_Stat : 7|5@0+ (1,0) [0|0] "" XXX + SG_ Rear_Blower_Bar_Status : 2|3@0+ (1,0) [0|0] "# of Bars" XXX + SG_ Rear_Fan_Button_Status : 13|2@0+ (1,0) [0|0] "" XXX + SG_ Rear_Man_Temp_Bar_Stat : 11|4@0+ (1,0) [0|0] "" XXX + SG_ Rear_Temp_Button_Status : 23|2@0+ (1,0) [0|0] "" XXX + SG_ Voice_Blower_Limit : 21|1@0+ (1,0) [0|0] "" XXX + +BO_ 860 EFP_CC_Info_Status: 8 XXX + SG_ Rear_Panel_Btn_State : 41|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Floor_Btn_State : 40|1@0+ (1,0) [0|0] "" XXX + SG_ HtdStrWhl_SftBtt_Stt : 39|2@0+ (1,0) [0|0] "" XXX + SG_ AC_Sft_Button_State : 23|2@0+ (1,0) [0|0] "" XXX + SG_ DrvRrCondSeatSftBttnSt : 47|3@0+ (1,0) [0|0] "" XXX + SG_ DrvFrCondSeatSftBtnStt : 37|3@0+ (1,0) [0|0] "" XXX + SG_ CC_RecircSBtn_St : 27|2@0+ (1,0) [0|0] "" XXX + SG_ CC_RrDefrSBtn_St : 24|1@0+ (1,0) [0|0] "" XXX + SG_ PasRrCondSeatSftBttnSt : 44|3@0+ (1,0) [0|0] "" XXX + SG_ PasFrCondSeatSftBtnStt : 34|3@0+ (1,0) [0|0] "" XXX + SG_ MyTemp_Soft_Bttn_State : 25|1@0+ (1,0) [0|0] "" XXX + SG_ CC_MaxACSBtn_St : 28|1@0+ (1,0) [0|0] "" XXX + SG_ RearPowerButtonState : 16|1@0+ (1,0) [0|0] "" XXX + SG_ RearCoolBarsDisplayed : 11|3@0+ (1,0) [0|0] "Bars_On" XXX + SG_ Rear_Sft_Control_Stat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ CC_RrNeutralBarDsp_St : 8|1@0+ (1,0) [0|0] "" XXX + SG_ CC_RrHeatBarsDsp_St : 31|3@0+ (1,0) [0|0] "Bars_On" XXX + SG_ Rear_Fan_Bars_Displayed : 19|3@0+ (1,0) [0|0] "" XXX + SG_ CC_RrCtrlBtn_St : 20|1@0+ (1,0) [0|0] "" XXX + SG_ Rear_Auto_Button_State : 21|1@0+ (1,0) [0|0] "" XXX + SG_ CC_FrPowerSBtn_St : 14|1@0+ (1,0) [0|0] "" XXX + SG_ CC_FrDefrostSBtn_St : 15|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_Soft_Btn_Stt : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_MODE_State : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Front_AUTO_FAN_State : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Dual_Button_State : 12|1@0+ (1,0) [0|0] "" XXX + SG_ CC_BarPnlSBtn_St : 5|1@0+ (1,0) [0|0] "" XXX + SG_ CC_BarPnFlrSBtn_St : 4|1@0+ (1,0) [0|0] "" XXX + SG_ CC_BarFlrWsSBtn_St : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CC_BarDrvFlrSBtn_St : 3|1@0+ (1,0) [0|0] "" XXX + +BO_ 890 Active_Noise: 8 XXX + SG_ ANC_Chime_Supported : 4|2@0+ (1,0) [0|0] "" XXX + SG_ ActvNseAudio_D_Stat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ ActvNse_B_Actv : 5|1@0+ (1,0) [0|0] "" XXX + +BO_ 891 Active_Noise_Data: 8 XXX + SG_ CabnSndAmb_Db_Actl : 7|8@0+ (1,30.0) [0|0] "decibel" XXX + +BO_ 906 Body_Information_1: 8 XXX + SG_ CcdMde_D_Rq_UB : 0|1@0+ (1,0) [0|0] "" XXX + SG_ CcdMde_D_Rq : 7|2@0+ (1,0) [0|0] "" XXX + SG_ CarMode : 5|4@0+ (1,0) [0|0] "" XXX + SG_ SecondaryHeater_Rqst : 55|1@0+ (1,0) [0|0] "" XXX + SG_ Passenger_Sunload_Raw : 47|8@0+ (5.0,0) [0|0] "W/m^2" XXX + SG_ Driver_Sunload_Raw : 39|8@0+ (5.0,0) [0|0] "W/m^2" XXX + SG_ HvacEvap_Te_Actl_UB : 1|1@0+ (1,0) [0|0] "" XXX + SG_ HvacEvap_Te_Actl : 17|10@0+ (0.125,-50.0) [0|0] "Degrees C" XXX + SG_ SecondaryHeater_Rqst_UB : 18|1@0+ (1,0) [0|0] "" XXX + SG_ Outside_Air_Temp_Stat_UB : 23|1@0+ (1,0) [0|0] "" XXX + SG_ Outside_Air_Temp_Stat : 15|8@0+ (0.5,-40.0) [0|0] "Degrees C" XXX + SG_ Veh_Lock_Status : 54|2@0+ (1,0) [0|0] "" XXX + SG_ Veh_Lock_Requestor : 52|5@0+ (1,0) [0|0] "" XXX + SG_ Veh_Lock_EvNum : 63|8@0+ (1,0) [0|0] "Counts" XXX + SG_ immoIndicatorCmd : 22|4@0+ (1,0) [0|0] "" XXX + +BO_ 909 Body_Information_6: 8 XXX + SG_ PEBackupSlot_Stats_UB : 43|1@0+ (1,0) [0|0] "" XXX + SG_ PEBackupSlot_Stats : 25|2@0+ (1,0) [0|0] "" XXX + SG_ KeyMykeyTot_No_Cnt : 47|4@0+ (1,0) [0|0] "Counts" XXX + SG_ SideDetect_R_SysOpState_UB : 26|1@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_R_SysOpState : 28|2@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_R_SnsrState_UB : 29|1@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_R_SnsrState : 31|2@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_L_SysOpState_UB : 16|1@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_L_SysOpState : 18|2@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_L_SnsrState_UB : 19|1@0+ (1,0) [0|0] "" XXX + SG_ SideDetect_L_SnsrState : 21|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_R_SnState_UB : 8|1@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_R_SnState : 23|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_R_Op_State_UB : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_R_Op_State : 11|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_R_Alert_UB : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_R_Alert : 14|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_L_SnState_UB : 15|1@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_L_SnState : 1|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_L_Op_State_UB : 2|1@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_L_Op_State : 4|2@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_L_Alert_UB : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Cross_Traffic_L_Alert : 7|2@0+ (1,0) [0|0] "" XXX + SG_ IgnKeyType_D_Actl : 39|4@0+ (1,0) [0|0] "" XXX + SG_ KeyAdmnTot_No_Cnt : 35|4@0+ (1,0) [0|0] "Counts" XXX + +BO_ 936 ParkAid_Data: 8 XXX + SG_ SAPPErrorCoding : 23|8@0+ (1,0) [0|0] "" XXX + SG_ ExtSteeringAngleReq : 7|15@0+ (0.1,-1000.0) [0|0] "Degrees" XXX + SG_ EPASExtAngleStatReq : 8|1@0+ (1,0) [0|0] "" XXX + +BO_ 937 ParkAid_Range_to_Target: 8 XXX + SG_ RangeToClosestObstacle : 55|12@0+ (1,0) [0|0] "cm" XXX + SG_ RangeRearCornerRtSn : 35|12@0+ (1,0) [0|0] "cm" XXX + SG_ RangeRearCornerLeftSn : 31|12@0+ (1,0) [0|0] "cm" XXX + SG_ RangeRearCenterRtSn : 11|12@0+ (1,0) [0|0] "cm" XXX + SG_ RangeRearCenterLeftSn : 7|12@0+ (1,0) [0|0] "cm" XXX + +BO_ 939 ParkAid_Data_CG1: 8 XXX + SG_ EPASExtAngleStatReq : 7|1@0+ (1,0) [0|0] "" XXX + SG_ ExtSteeringAngleReq : 6|15@0+ (0.1,-1000.0) [0|0] "Degrees" XXX + SG_ SAPPErrorCoding : 23|8@0+ (1,0) [0|0] "" XXX + SG_ RangeToClosestObstacle : 27|12@0+ (1,0) [0|0] "cm" XXX + +BO_ 942 BodyInformation_2: 8 XXX + SG_ Easy_Entry_Exit_Stat : 14|2@0+ (1,0) [0|0] "" XXX + SG_ Memory_Feedback_Rqst : 15|1@0+ (1,0) [0|0] "" XXX + SG_ Delay_Accy : 41|1@0+ (1,0) [0|0] "" XXX + SG_ Fuel_Econ_AFE_Reset_Req_UB : 43|1@0+ (1,0) [0|0] "" XXX + SG_ Multimedia_System : 42|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatDrv_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatHood_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatInnrTgate_B_Actl : 5|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatPsngr_B_Actl : 4|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatRl_B_Actl : 3|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatRr_B_Actl : 2|1@0+ (1,0) [0|0] "" XXX + SG_ DrStatTgate_B_Actl : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Fuel_Econ_AFE_Reset_Req : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Nav_Unit_Setting : 11|1@0+ (1,0) [0|0] "" XXX + SG_ Cancel_Auto_Movement : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Cancel_Auto_Movement_UB : 8|1@0+ (1,0) [0|0] "" XXX + SG_ DrvSeat_Stat : 34|3@0+ (1,0) [0|0] "" XXX + SG_ DrvSeat_Stat_UB : 10|1@0+ (1,0) [0|0] "" XXX + SG_ Easy_Entry_Rqst : 47|2@0+ (1,0) [0|0] "" XXX + SG_ Easy_Entry_Rqst_UB : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Multimedia_System_UB : 40|1@0+ (1,0) [0|0] "" XXX + SG_ Memory_Cmd : 39|4@0+ (1,0) [0|0] "" XXX + SG_ Memory_Cmd_UB : 35|1@0+ (1,0) [0|0] "" XXX + SG_ Memory_Feedback_Rqst_UB : 45|1@0+ (1,0) [0|0] "" XXX + SG_ Decklid_Ajar_Status : 44|1@0+ (1,0) [0|0] "" XXX + +BO_ 947 BodyInformation_3: 8 XXX + SG_ RearFog_Lamp_Ind_UB : 49|1@0+ (1,0) [0|0] "" XXX + SG_ RearFog_Lamp_Ind : 50|1@0+ (1,0) [0|0] "" XXX + SG_ PwMdeExten_D_Actl : 63|5@0+ (1,0) [0|0] "" XXX + SG_ Turn_Ind_Cmd_Right : 8|1@0+ (1,0) [0|0] "" XXX + SG_ Turn_Ind_Cmd_Left : 9|1@0+ (1,0) [0|0] "" XXX + SG_ Ignition_Switch_Stable : 1|2@0+ (1,0) [0|0] "" XXX + SG_ Parklamp_Status : 3|2@0+ (1,0) [0|0] "" XXX + SG_ Litval : 47|8@0+ (1,0) [0|0] "" XXX + SG_ Key_In_Ignition_Stat : 11|2@0+ (1,0) [0|0] "" XXX + SG_ Ignition_Status : 7|4@0+ (1,0) [0|0] "" XXX + SG_ Dimming_Lvl : 31|8@0+ (1,0) [0|0] "" XXX + SG_ Day_Night_Status : 15|2@0+ (1,0) [0|0] "" XXX + SG_ Remote_Start_Status : 13|2@0+ (1,0) [0|0] "" XXX + SG_ DRV_SELECT_STAT : 19|4@0+ (1,0) [0|0] "" XXX + SG_ PrkBrkActv_B_Actl : 55|1@0+ (1,0) [0|0] "" XXX + SG_ HtdStrWhl_SftBtt_State_UB : 51|1@0+ (1,0) [0|0] "" XXX + SG_ HtdStrWhl_SftBtt_State : 53|2@0+ (1,0) [0|0] "" XXX + SG_ HvacRemoteStrt_N_Rq_UB : 56|1@0+ (1,0) [0|0] "" XXX + SG_ HvacRemoteStrt_N_Rq : 23|4@0+ (100.0,450.0) [0|0] "RPM" XXX + SG_ HvacAirCond_B_Rq_UB : 57|1@0+ (1,0) [0|0] "" XXX + SG_ Remote_Start_Warn_Req : 54|1@0+ (1,0) [0|0] "" XXX + SG_ HvacAirCond_B_Rq : 58|1@0+ (1,0) [0|0] "" XXX + +BO_ 948 Tire_Pressure_Status: 8 XXX + SG_ Tire_Press_ILR_Stat2 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ Tire_Press_IRR_Stat2 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ Tire_Press_LR_OLR_Stat2 : 19|4@0+ (1,0) [0|0] "" XXX + SG_ Tire_Press_RR_ORR_Stat2 : 23|4@0+ (1,0) [0|0] "" XXX + SG_ Tire_Press_RF_Stat2 : 11|4@0+ (1,0) [0|0] "" XXX + SG_ Tire_Press_LF_Stat2 : 15|4@0+ (1,0) [0|0] "" XXX + SG_ Tire_Press_System_Stat2 : 7|4@0+ (1,0) [0|0] "" XXX + SG_ Tire_Press_Telltale : 3|2@0+ (1,0) [0|0] "" XXX + +BO_ 949 Tire_Pressure_Data: 8 XXX + SG_ Tire_Press_RR_ORR_Data : 23|8@0+ (1,0) [0|0] "Psi" XXX + SG_ Tire_Press_RF_Data : 15|8@0+ (1,0) [0|0] "Psi" XXX + SG_ Tire_Press_LR_OLR_Data : 31|8@0+ (1,0) [0|0] "Psi" XXX + SG_ Tire_Press_IRR_Data : 39|8@0+ (1,0) [0|0] "Psi" XXX + SG_ Tire_Press_ILR_Data : 47|8@0+ (1,0) [0|0] "Psi" XXX + SG_ Tire_Press_LF_Data : 7|8@0+ (1,0) [0|0] "Psi" XXX + +BO_ 955 Smart_Headlamp_Stat: 8 XXX + SG_ Headlamp_Switch_Stat : 7|2@0+ (1,0) [0|0] "" XXX + SG_ Fog_Lamp_Dbnce : 5|2@0+ (1,0) [0|0] "" XXX + SG_ Digital_Dimmer_Sw_Stat : 3|3@0+ (1,0) [0|0] "" XXX + +BO_ 957 Rear_FogLamp: 8 XXX + SG_ RearFog_Lamp_Dbnce : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 963 BCM_to_HS_Body: 8 XXX + SG_ DrTgateChime_D_Rq_UB : 9|1@0+ (1,0) [0|0] "" XXX + SG_ DrTgateChime_D_Rq : 17|2@0+ (1,0) [0|0] "" XXX + SG_ CamraDefog_B_Actl : 4|1@0+ (1,0) [0|0] "" XXX + SG_ Reverse_Mirror_Stat : 61|2@0+ (1,0) [0|0] "" XXX + SG_ Power_Liftgate_Mode_Stat : 63|2@0+ (1,0) [0|0] "" XXX + SG_ IKT_Program_Status : 51|2@0+ (1,0) [0|0] "" XXX + SG_ Veh_Spd_Slow_Puddle_Status : 41|2@0+ (1,0) [0|0] "" XXX + SG_ Illuminated_Exit_Status : 43|2@0+ (1,0) [0|0] "" XXX + SG_ Illuminated_Entry_Status : 45|2@0+ (1,0) [0|0] "" XXX + SG_ Door_Courtesy_Light_Status : 47|2@0+ (1,0) [0|0] "" XXX + SG_ Courtesy_Demand_BSave_Stat : 33|2@0+ (1,0) [0|0] "" XXX + SG_ Alarm_Lights_Courtesy_Stat : 35|2@0+ (1,0) [0|0] "" XXX + SG_ Courtesy_Delay_Status : 37|2@0+ (1,0) [0|0] "" XXX + SG_ Courtesy_Mode_Status : 39|2@0+ (1,0) [0|0] "" XXX + SG_ Front_Fog_Light_SW_Status : 22|2@0+ (1,0) [0|0] "" XXX + SG_ Brake_Lamp_On_Status : 23|1@0+ (1,0) [0|0] "" XXX + SG_ LowBeam_CKT_CAN : 11|1@0+ (1,0) [0|0] "" XXX + SG_ ParkLamps_CKT_CAN : 8|1@0+ (1,0) [0|0] "" XXX + SG_ RF_Low_Beam_CKT_CAN : 13|1@0+ (1,0) [0|0] "" XXX + SG_ Brk_Fluid_Lvl_Low : 15|2@0+ (1,0) [0|0] "" XXX + SG_ LF_Low_Beam_CKT_CAN : 12|1@0+ (1,0) [0|0] "" XXX + SG_ High_Beam_Indicator_Rqst : 1|1@0+ (1,0) [0|0] "" XXX + SG_ Brake_Warn_Indicator_Rqst : 2|1@0+ (1,0) [0|0] "" XXX + SG_ Headlamp_On_Wrning_Cmd : 6|1@0+ (1,0) [0|0] "" XXX + SG_ Key_In_Ignition_Warn_Cmd : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Fog_Lamps_Rly_Ckt_CAN : 10|1@0+ (1,0) [0|0] "" XXX + SG_ Power_Liftgate_Mode_Stat_UB : 18|1@0+ (1,0) [0|0] "" XXX + SG_ Reverse_Mirror_Stat_UB : 7|1@0+ (1,0) [0|0] "" XXX + SG_ Park_Brake_Chime_Rqst : 3|1@0+ (1,0) [0|0] "" XXX + SG_ Daytime_Running_Lamps : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Running_Board_Stat_UB : 56|1@0+ (1,0) [0|0] "" XXX + SG_ Running_Board_Stat : 58|2@0+ (1,0) [0|0] "" XXX + SG_ Perimeter_Alarm_Chime_Rqst : 20|2@0+ (1,0) [0|0] "" XXX + +BO_ 967 CMPS_FDM_Info_Status: 8 XXX + SG_ CamraFrntStat_D_Stat : 41|2@0+ (1,0) [0|0] "" XXX + SG_ Zone_Icon_UB : 34|1@0+ (1,0) [0|0] "" XXX + SG_ GPS_Compass_direction : 47|4@0+ (1,0) [0|0] "" XXX + SG_ Segment_MSD_UB : 37|1@0+ (1,0) [0|0] "" XXX + SG_ Segment_LSD_UB : 36|1@0+ (1,0) [0|0] "" XXX + SG_ ExcessiveMagnetism : 32|1@0+ (1,0) [0|0] "" XXX + SG_ Compass_Display_UB : 35|1@0+ (1,0) [0|0] "" XXX + SG_ Segment_LSD : 15|8@0+ (1,0) [0|0] "" XXX + SG_ Segment_MSD : 7|8@0+ (1,0) [0|0] "" XXX + SG_ Cal_Icon : 21|1@0+ (1,0) [0|0] "" XXX + SG_ Zone_Icon : 22|1@0+ (1,0) [0|0] "" XXX + SG_ Compass_Display : 23|1@0+ (1,0) [0|0] "" XXX + SG_ Cal_Icon_UB : 33|1@0+ (1,0) [0|0] "" XXX + SG_ RearCameraDelayStat : 39|2@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlTow_D_Actl : 25|2@0+ (1,0) [0|0] "SE" XXX + SG_ CamZoomActiveState : 29|2@0+ (1,0) [0|0] "" XXX + SG_ CamraZoomMan_D_Actl : 18|3@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlStat_D_Actl : 27|2@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlDyn_D_Actl : 20|2@0+ (1,0) [0|0] "" XXX + SG_ CamPDCGuidStat : 31|2@0+ (1,0) [0|0] "" XXX + +BO_ 970 Lane_Assist_Data1: 8 XXX + SG_ LkaActvStats_D_Req : 7|3@0+ (1,0) [0|0] "" XXX + SG_ LdwActvStats_D_Req : 4|3@0+ (1,0) [0|0] "" XXX + SG_ LdwActvIntns_D_Req : 1|2@0+ (1,0) [0|0] "" XXX + +BO_ 971 Lane_Assist_Data2: 8 XXX + SG_ LaRefAng_No_Req : 19|12@0+ (0.05,-102.4) [0|0] "mrad" XXX + SG_ LaRampType_B_Req : 4|1@0+ (1,0) [0|0] "" XXX + SG_ LaCurvature_No_Calc : 3|12@0+ (5e-06,-0.01) [0|0] "1/m" XXX + +BO_ 972 Lane_Assist_Data3: 8 XXX + SG_ LaHandsOff_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX + SG_ LaActDeny_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX + SG_ LaActAvail_D_Actl : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 984 IPMA_Data: 8 XXX + SG_ LaSwtch_D_RqDrv : 45|1@0+ (1,0) [0|0] "" XXX + SG_ DasWarn_D_Dsply : 44|2@0+ (1,0) [0|0] "" XXX + SG_ DasStats_D_Dsply : 47|2@0+ (1,0) [0|0] "" XXX + SG_ DasAlrtLvl_D_Dsply : 55|3@0+ (1,0) [0|0] "" XXX + SG_ CamraStats_D_Dsply : 35|2@0+ (1,0) [0|0] "" XXX + SG_ CamraDefog_B_Req : 36|1@0+ (1,0) [0|0] "" XXX + SG_ LaSwtchStat_No_Actl : 63|1@0+ (1,0) [0|0] "" XXX + SG_ LaHandsOff_D_Dsply : 42|2@0+ (1,0) [0|0] "" XXX + SG_ LaDenyStats_B_Dsply : 40|1@0+ (1,0) [0|0] "" XXX + SG_ LaActvStats_D_Dsply : 52|5@0+ (1,0) [0|0] "" XXX + SG_ AhbcHiBeam_D_Rq : 33|2@0+ (1,0) [0|0] "" XXX + SG_ PersIndexIpma_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoIpmaActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigIpmaActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 986 Personality_APIM_Data3: 8 XXX + SG_ LightAmbIntSwtchInc_B : 22|1@0+ (1,0) [0|0] "" XXX + SG_ LightAmbIntSwtchDec_B : 21|1@0+ (1,0) [0|0] "" XXX + SG_ LightAmbIntsty_No_Rq : 15|8@0+ (1,0) [0|0] "% Intensity" XXX + SG_ LightAmbColor_No_Rq : 7|8@0+ (1,0) [0|0] "Color Index" XXX + SG_ LightAmbClrSwtchInc_B : 20|1@0+ (1,0) [0|0] "" XXX + SG_ LightAmbClrSwtchDec_B : 23|1@0+ (1,0) [0|0] "" XXX + +BO_ 991 Personality_VDM_Data: 8 XXX + SG_ PersIndexVdm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoVdmActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigVdmActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 992 Personality_IPC_Data: 8 XXX + SG_ MsgCntrPersIndex_D_Rq : 39|3@0+ (1,0) [0|0] "" XXX + SG_ MsgCntrFeatConfigRq : 23|16@0+ (1,0) [0|0] "" XXX + SG_ MsgCntrFeatNoRq : 7|16@0+ (1,0) [0|0] "Number" XXX + SG_ MsgCntrDsplyOp_D_Rq : 36|3@0+ (1,0) [0|0] "" XXX + +BO_ 993 Personality_Data_HS: 8 XXX + SG_ PersSetupRestr_D_Actl : 21|2@0+ (1,0) [0|0] "" XXX + SG_ PersSetupAccessCtrl : 19|1@0+ (1,0) [0|0] "SES" XXX + SG_ PersSetup_No_Actl : 31|16@0+ (1,0) [0|0] "Number" XXX + SG_ PersConflict_D_Actl : 22|1@0+ (1,0) [0|0] "" XXX + SG_ AssocConfirm_D_Actl : 15|3@0+ (1,0) [0|0] "" XXX + SG_ RecallEvent_No_Cnt : 7|8@0+ (1,0) [0|0] "Counts" XXX + SG_ PersNo_D_Actl : 10|3@0+ (1,0) [0|0] "" XXX + SG_ PersStore_D_Actl_UB : 23|1@0+ (1,0) [0|0] "" XXX + SG_ PersStore_D_Actl : 12|2@0+ (1,0) [0|0] "" XXX + +BO_ 994 Personality_APIM_Data: 8 XXX + SG_ CamraOvrlTow_D_Rq : 42|1@0+ (1,0) [0|0] "" XXX + SG_ Pers4OptIn_B_Stats : 43|1@0+ (1,0) [0|0] "" XXX + SG_ Pers3OptIn_B_Stats : 33|1@0+ (1,0) [0|0] "" XXX + SG_ Pers2OptIn_B_Stats : 32|1@0+ (1,0) [0|0] "" XXX + SG_ Pers1OptIn_B_Stats : 44|1@0+ (1,0) [0|0] "" XXX + SG_ CtrStkPersIndex_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ CtrStkFeatNoActl : 23|16@0+ (1,0) [0|0] "" XXX + SG_ PersStore_D_Rq : 36|3@0+ (1,0) [0|0] "" XXX + SG_ CtrStkFeatConfigActl : 7|16@0+ (1,0) [0|0] "" XXX + SG_ CtrStkDsplyOp_D_Rq : 47|3@0+ (1,0) [0|0] "" XXX + +BO_ 995 Personality_BCM_Data: 8 XXX + SG_ PersIndexBcm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoBcm_No_Actl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigBcmActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 996 Personality_HCMB_Data_HS: 8 XXX + SG_ PersIndexHcmb_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX + SG_ PersIndexHcmb_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoHcmbActl_UB : 35|1@0+ (1,0) [0|0] "" XXX + SG_ FeatNoHcmbActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigHcmbActl_UB : 36|1@0+ (1,0) [0|0] "" XXX + SG_ FeatConfigHcmbActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 997 Personality_CCM_Data: 8 XXX + SG_ PersIndexCcm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoCcmActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigCcmActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 998 Personality_SCCM_Data: 8 XXX + SG_ PersIndexSccm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoSccmActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigSccmActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 999 Personality_HVAC_Data_HS: 8 XXX + SG_ LightAmbIntsty_No_Actl_UB : 33|1@0+ (1,0) [0|0] "" XXX + SG_ LightAmbIntsty_No_Actl : 55|8@0+ (1,0) [0|0] "% Intensity" XXX + SG_ LightAmbColor_No_Actl_UB : 32|1@0+ (1,0) [0|0] "" XXX + SG_ LightAmbColor_No_Actl : 47|8@0+ (1,0) [0|0] "Color Index" XXX + SG_ PersIndexHvac_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX + SG_ FeatNoHvacActl_UB : 35|1@0+ (1,0) [0|0] "" XXX + SG_ FeatConfigHvacActl_UB : 36|1@0+ (1,0) [0|0] "" XXX + SG_ PersIndexHvac_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoHvacActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigHvacActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 1001 Personality_RFA_Data_HS: 8 XXX + SG_ PersIndexRfa_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX + SG_ FeatNoRfaActl_UB : 35|1@0+ (1,0) [0|0] "" XXX + SG_ FeatConfigRfaActl_UB : 36|1@0+ (1,0) [0|0] "" XXX + SG_ PersIndexRfa_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoRfaActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigRfaActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 1002 Personality_APIM_Data2: 8 XXX + SG_ PersIndexApim_D_Actl : 63|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoApimActl : 39|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigApimActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ CntrStkKeycodeActl : 7|16@0+ (1,0) [0|0] "" XXX + SG_ CntrStk_D_RqRecall : 52|3@0+ (1,0) [0|0] "" XXX + SG_ CntrStk_D_RqAssoc : 55|3@0+ (1,0) [0|0] "" XXX + +BO_ 1003 Personality_IPC_Data_2: 8 XXX + SG_ PersIndexIpc_D_Actl : 34|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoIpcActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigIpcActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 1004 Personality_DSM_Data_HS: 8 XXX + SG_ PersIndexDsm_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX + SG_ PersIndexDsm_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoDsmActl_UB : 35|1@0+ (1,0) [0|0] "" XXX + SG_ FeatNoDsmActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigDsmActl_UB : 36|1@0+ (1,0) [0|0] "" XXX + SG_ FeatConfigDsmActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 1005 Personality_RHVAC_Data_HS: 8 XXX + SG_ PersIndexRhvac_D_Actl_UB : 34|1@0+ (1,0) [0|0] "" XXX + SG_ FeatNoRhvacActl_UB : 33|1@0+ (1,0) [0|0] "" XXX + SG_ FeatConfigRhvacActl_UB : 32|1@0+ (1,0) [0|0] "" XXX + SG_ PersIndexRhvac_D_Actl : 39|3@0+ (1,0) [0|0] "" XXX + SG_ FeatNoRhvacActl : 23|16@0+ (1,0) [0|0] "Number" XXX + SG_ FeatConfigRhvacActl : 7|16@0+ (1,0) [0|0] "" XXX + +BO_ 1031 Diesel_Data_Legacy_1: 8 XXX + SG_ W2S_COMMAND : 7|1@0+ (1,0) [0|0] "" XXX + SG_ TURBO_BOOST : 1|10@0+ (0.1,-30.0) [0|0] "PSI" XXX + SG_ IDLE_ENGINE_SHUTDOWN : 42|2@0+ (1,0) [0|0] "" XXX + +BO_ 1034 GGCC_Config_Mgmt_ID_1: 8 XXX + SG_ VehicleGGCCData : 7|64@0+ (1,0) [0|0] "mixed" XXX + +BO_ 1036 Desired_Torq_BrkSys_Stat: 8 XXX + SG_ BRK_TC_TEMPORARILY_UNAVAIL : 47|1@0+ (1,0) [0|0] "" XXX + SG_ TRLR_SWAY_EVNT_IN_PROGRESS : 22|1@0+ (1,0) [0|0] "" XXX + +BO_ 1043 ADAPTIVE_HEADLAMP_STAT: 8 XXX + SG_ ADAPTIVE_HEADLAMP_FAILURE : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 1044 AccelerationData: 8 XXX + SG_ VehVertComp_A_Actl : 1|10@0+ (0.01,-0.4) [0|0] "m/s^2" XXX + SG_ VehRolComp_W_Actl : 19|12@0+ (0.0002,-0.82) [0|0] "rad/s" XXX + SG_ VehYawNonLin_W_Rq : 51|12@0+ (0.03663,-75.0) [0|0] "deg/s" XXX + SG_ VehYawLin_W_Rq : 35|12@0+ (0.03663,-75.0) [0|0] "deg/s" XXX + +BO_ 1045 BrakeSysFeatures: 8 XXX + SG_ TCMode : 34|1@0+ (1,0) [0|0] "" XXX + SG_ DrvSlipCtlLamp_D_Rq : 63|2@0+ (1,0) [0|0] "" XXX + SG_ RSCMode : 48|1@0+ (1,0) [0|0] "" XXX + SG_ EBAMode : 40|1@0+ (1,0) [0|0] "" XXX + SG_ DrvAntiLckLamp_D_Rq : 17|2@0+ (1,0) [0|0] "" XXX + SG_ ChimeBrk_B_Rq : 38|1@0+ (1,0) [0|0] "" XXX + SG_ BrkLamp_B_Rq : 39|1@0+ (1,0) [0|0] "" XXX + SG_ VehVActlBrk_No_Cs : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VehVActlBrk_No_Cnt : 23|4@0+ (1,0) [0|0] "" XXX + SG_ Veh_V_ActlBrk : 7|16@0+ (0.01,0) [0|0] "kph" XXX + SG_ DrvSlipCtlMde_D_Ind : 33|2@0+ (1,0) [0|0] "" XXX + SG_ VehRol_An_Dsply : 55|7@0+ (1,-64.0) [0|0] "Degrees" XXX + SG_ VehPtch_An_Dsply : 47|7@0+ (1,-64.0) [0|0] "Degrees" XXX + SG_ VehVActlBrk_D_Qf : 19|2@0+ (1,0) [0|0] "" XXX + SG_ HILL_DESC_MC : 37|3@0+ (1,0) [0|0] "" XXX + +BO_ 1046 BrakeSysFeatures_2: 8 XXX + SG_ BpedMove_No_Cs : 23|8@0+ (1,0) [0|0] "" XXX + SG_ BpedMove_No_Cnt : 3|4@0+ (1,0) [0|0] "" XXX + SG_ BpedMove_D_Actl : 7|2@0+ (1,0) [0|0] "" XXX + SG_ AbsMduleAlive_No_Cnt : 39|4@0+ (1,0) [0|0] "" XXX + SG_ Abs_No_Cs : 31|8@0+ (1,0) [0|0] "" XXX + SG_ BrkAsst_B_Actl : 33|1@0+ (1,0) [0|0] "" XXX + SG_ StabCtlBrk_B_Avail : 4|1@0+ (1,0) [0|0] "" XXX + SG_ DrvHdcWarnInfo_D_Rq : 35|2@0+ (1,0) [0|0] "" XXX + SG_ DrvHdcMsg_D_Rq : 10|3@0+ (1,0) [0|0] "" XXX + SG_ DrvHdcLampInfo_D_Rq : 12|2@0+ (1,0) [0|0] "" XXX + SG_ Abs_B_Falt : 5|1@0+ (1,0) [0|0] "" XXX + SG_ VehLongComp_A_Actl : 49|10@0+ (0.035,-17.9) [0|0] "m/s^2" XXX + SG_ TRAILER_SWAY_CONFIG_STAT : 32|1@0+ (1,0) [0|0] "" XXX + SG_ VehLatComp_A_Actl : 47|10@0+ (0.035,-17.9) [0|0] "m/s^2" XXX + +BO_ 1047 TractionCtrlStatus_CG1: 8 XXX + SG_ EngEotcCtlMde_B_Ind : 3|1@0+ (1,0) [0|0] "" XXX + SG_ YawStabilityIndex : 48|9@0+ (1,-256.0) [0|0] "%" XXX + SG_ TCS_ENG_FAILD : 0|1@0+ (1,0) [0|0] "" XXX + SG_ TCS_ENG_ONLY_PRESENT : 1|1@0+ (1,0) [0|0] "" XXX + SG_ TCS_BRK_FAILD : 2|1@0+ (1,0) [0|0] "" XXX + SG_ PrplWhlTqRqMn_No_Cnt : 47|4@0+ (1,0) [0|0] "" XXX + SG_ PrplWhlTot_Tq_RqMn : 23|16@0+ (4.0,-131072.0) [0|0] "Nm" XXX + SG_ EngEotcCtlLamp_D_Rq : 9|2@0+ (1,0) [0|0] "" XXX + SG_ PrplWhlTqRqMn_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX + SG_ HdcMde_D_Actl : 12|3@0+ (1,0) [0|0] "" XXX + SG_ VehicleDir_D_Est : 5|2@0+ (1,0) [0|0] "" XXX + SG_ TracCtlPtActv_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX + +BO_ 1056 PowertrainData_1_CG1: 8 XXX + SG_ FUEL_ALCOHOL_PERCNT : 63|8@0+ (0.3937008,0) [0|0] "%" XXX + SG_ TrnTotTq_Rt_Est : 39|16@0+ (0.001,0) [0|0] "" XXX + SG_ TrnTotLss_Tq_Est : 31|8@0+ (0.5,0) [0|0] "Nm" XXX + SG_ ECMMILRequest : 9|2@0+ (1,0) [0|0] "" XXX + SG_ AirCondFluidHi_P_Actl : 55|8@0+ (0.125,0) [0|0] "bar" XXX + SG_ OilPressureWarning : 18|1@0+ (1,0) [0|0] "" XXX + SG_ CluPdlPos_Pc_Meas : 7|10@0+ (0.1,0) [0|0] "%" XXX + SG_ VehVLimStat_D_Actl : 12|3@0+ (1,0) [0|0] "" XXX + SG_ VehVLimActv_B_Actl : 13|1@0+ (1,0) [0|0] "" XXX + SG_ CluPdlPosPcMeas_D_Qf : 17|2@0+ (1,0) [0|0] "" XXX + SG_ CoolantFanStepAct : 23|5@0+ (1,0) [0|0] "Steps" XXX + +BO_ 1058 PowertrainData_2_CG1: 8 XXX + SG_ EngIdlShutDown_D_Stat : 19|2@0+ (1,0) [0|0] "" XXX + SG_ EngAout2_Tq_Actl : 55|11@0+ (1,-500.0) [0|0] "Nm" XXX + SG_ EngMsgTxt_D_Rq : 21|2@0+ (1,0) [0|0] "" XXX + SG_ EngClnt_Te_ActlDiag : 39|8@0+ (1,-40.0) [0|0] "degC" XXX + SG_ ThrPos_Pc_CalcDiag : 7|8@0+ (0.392157,0) [0|0] "%" XXX + SG_ EngLoad_Pc_CalcDiag : 47|8@0+ (0.392157,0) [0|0] "%" XXX + SG_ EngAirIn_Te_Actl : 15|10@0+ (0.25,-128.0) [0|0] "degC" XXX + SG_ ApedPos_Pc_ActlDiag : 31|8@0+ (0.392157,0) [0|0] "%" XXX + +BO_ 1064 StrgWheel_PolicePkg: 8 XXX + SG_ PoliceAux4Lamp_B_Rq : 4|1@0+ (1,0) [0|0] "" XXX + SG_ PoliceAux3Lamp_B_Rq : 5|1@0+ (1,0) [0|0] "" XXX + SG_ PoliceAux2Lamp_B_Rq : 6|1@0+ (1,0) [0|0] "" XXX + SG_ PoliceAux1Lamp_B_Rq : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 1067 Battery_Mgmt_1: 8 XXX + SG_ AlternatorExcDutyCycle : 31|5@0+ (3.22581,0) [0|0] "%" XXX + SG_ EngineEffStatus : 39|2@0+ (1,0) [0|0] "" XXX + SG_ AvailableCurrentAtIdle : 23|8@0+ (1,0) [0|0] "Amps" XXX + SG_ AvailableCurrent : 15|8@0+ (1,0) [0|0] "Amps" XXX + SG_ ActualCurrent : 7|8@0+ (1,0) [0|0] "Amps" XXX + SG_ NoAlternatorResponse : 26|1@0+ (1,0) [0|0] "" XXX + SG_ AlternatorTempFault : 25|1@0+ (1,0) [0|0] "" XXX + SG_ AlternatorMechFault : 24|1@0+ (1,0) [0|0] "" XXX + SG_ AlternatorElFault : 37|1@0+ (1,0) [0|0] "" XXX + +BO_ 1068 Battery_Mgmt_2: 8 XXX + SG_ ChargeMode : 39|3@0+ (1,0) [0|0] "" XXX + SG_ ChargeVoltageReq : 7|6@0+ (0.1,10.6) [0|0] "Volts" XXX + SG_ ChargeVoltageReqMax : 23|6@0+ (0.1,10.6) [0|0] "Volts" XXX + SG_ FrontBatteryTemp : 47|8@0+ (1,-60.0) [0|0] "DegC" XXX + SG_ IBoost_Msg : 52|4@0+ (1,0) [0|0] "" XXX + SG_ IdleSpeedIncrease_El : 8|1@0+ (1,0) [0|0] "" XXX + SG_ MaxLashStep : 11|3@0+ (0.1,0) [0|0] "Volts" XXX + SG_ PowerSystemStatus : 15|4@0+ (1,0) [0|0] "" XXX + SG_ Shed_T_Eng_Off_B : 17|1@0+ (1,0) [0|0] "" XXX + SG_ Shed_Level_Req : 55|3@0+ (1,0) [0|0] "" XXX + SG_ Shed_Feature_Group_ID : 36|5@0+ (1,0) [0|0] "" XXX + SG_ Shed_Drain_Eng_Off_B : 16|1@0+ (1,0) [0|0] "" XXX + SG_ Batt_Lo_SoC_B : 25|1@0+ (1,0) [0|0] "" XXX + SG_ VoltageRampRateUpMax : 31|6@0+ (0.1,0) [0|0] "Volts/sec" XXX + SG_ Batt_Crit_SoC_B : 24|1@0+ (1,0) [0|0] "" XXX + +BO_ 1069 Battery_Mgmt_3: 8 XXX + SG_ BSFault : 23|1@0+ (1,0) [0|0] "" XXX + SG_ BSBattSOC : 30|7@0+ (1,0) [0|0] "%" XXX + SG_ BSBattQDeltaRideAh : 38|15@0+ (0.0078125,-100.0) [0|0] "Ah" XXX + SG_ BSBattQCapAh : 22|7@0+ (1,0) [0|0] "Ah" XXX + SG_ BSBattCurrent : 5|14@0+ (0.0625,-512.0) [0|0] "Amps" XXX + SG_ BattULoState_D_Qlty : 7|2@0+ (1,0) [0|0] "" XXX + +BO_ 1072 Cluster_Information: 8 XXX + SG_ ManRgen_D_Rq : 5|2@0+ (1,0) [0|0] "" XXX + SG_ Easy_Entry_Exit_Cmd : 49|1@0+ (1,0) [0|0] "" XXX + SG_ KeyTypeChngMykey_D_Rq : 53|2@0+ (1,0) [0|0] "" XXX + SG_ DrvSlipCtlMde_B_Rq : 19|1@0+ (1,0) [0|0] "" XXX + SG_ MetricActv_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX + SG_ LdwDfaltOn_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX + SG_ Fda_B_Stat : 9|1@0+ (1,0) [0|0] "" XXX + SG_ ePRNDL_MODE : 8|1@0+ (1,0) [0|0] "" XXX + SG_ AccDeny_B_RqIpc : 7|1@0+ (1,0) [0|0] "" XXX + SG_ MetricActvTe_B_Actl : 23|1@0+ (1,0) [0|0] "" XXX + SG_ EngOilLife_B_RqReset : 18|1@0+ (1,0) [0|0] "" XXX + SG_ OdometerMasterValue : 31|24@0+ (1,0) [0|0] "km" XXX + SG_ New_Module_Attn_Event : 56|1@0+ (1,0) [0|0] "" XXX + SG_ TRAILER_SWAY_CONFIG_CMD : 60|1@0+ (1,0) [0|0] "" XXX + SG_ ParkDetect_Stat : 62|1@0+ (1,0) [0|0] "" XXX + SG_ Attn_Info_Audio : 59|3@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrkMde_D_Rq : 61|1@0+ (1,0) [0|0] "" XXX + SG_ TRAILER_BRAKE_CONFIG : 48|1@0+ (1,0) [0|0] "" XXX + SG_ VehMykey_Vl_LimRq : 63|1@0+ (1,0) [0|0] "" XXX + SG_ VehMykey_V_LimRqMx : 51|1@0+ (1,0) [0|0] "" XXX + SG_ EmgcyCallAsstMykey_Rq : 50|1@0+ (1,0) [0|0] "" XXX + SG_ DrvSlipCtlMde_D_Rq : 17|2@0+ (1,0) [0|0] "" XXX + SG_ AccEnbl_B_RqDrv : 20|1@0+ (1,0) [0|0] "" XXX + SG_ AutoHighBeam_Cmd : 55|2@0+ (1,0) [0|0] "" XXX + +BO_ 1075 Cluster_Information_3_CG1: 8 XXX + SG_ CamraFrntStat_D_Rq : 58|1@0+ (1,0) [0|0] "" XXX + SG_ DieslFuelBio_B_ActlDrv : 56|1@0+ (1,0) [0|0] "" XXX + SG_ RearCameraDelayCmd : 59|1@0+ (1,0) [0|0] "" XXX + SG_ UreaWarnReset : 60|1@0+ (1,0) [0|0] "" XXX + SG_ DistanceBarSetting : 49|1@0+ (1,0) [0|0] "" XXX + SG_ CamraZoomMan_D_Rq : 63|3@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlStat_D_Rq : 48|1@0+ (1,0) [0|0] "" XXX + SG_ CamraOvrlDyn_D_Rq : 25|1@0+ (1,0) [0|0] "" XXX + SG_ CamAutoTowbarZoom : 24|1@0+ (1,0) [0|0] "" XXX + SG_ FuelSecndActv_B_Actl : 39|1@0+ (1,0) [0|0] "" XXX + SG_ HILL_DESC_SW : 38|1@0+ (1,0) [0|0] "" XXX + SG_ FuelLvlPssvSide_No_Raw : 19|10@0+ (1,0) [0|0] "" XXX + SG_ SPDJBCompassCMDDecalibrate : 50|1@0+ (1,0) [0|0] "" XXX + SG_ SPDJBCompassCMDChangeZone : 51|1@0+ (1,0) [0|0] "" XXX + SG_ SPDJBCompassCmdDesiredZone : 55|4@0+ (1,0) [0|0] "" XXX + SG_ FUEL_SENSOR_NUM : 35|1@0+ (1,0) [0|0] "" XXX + SG_ W2S_LAMP_OK : 37|1@0+ (1,0) [0|0] "" XXX + SG_ Beltminder_Warn_Stats_IPC : 32|1@0+ (1,0) [0|0] "" XXX + SG_ FuelLvlActvSide_No_Raw : 13|10@0+ (1,0) [0|0] "" XXX + SG_ FuelLvl_Pc_Dsply : 7|10@0+ (0.108696,-5.22) [0|0] "%" XXX + SG_ FUEL_LVL_PER_MEAN : 47|8@0+ (0.434783,-5.22) [0|0] "% Indication" XXX + SG_ Fuel_Level_State : 34|2@0+ (1,0) [0|0] "" XXX + SG_ H2O_IN_FUEL_LAMP_OK_OBD : 36|1@0+ (1,0) [0|0] "" XXX + +BO_ 1093 TrailerBrakeInfo: 8 XXX + SG_ TrlrLampCnnct_B_Actl : 22|1@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrkActCnnct_B_Actl : 16|1@0+ (1,0) [0|0] "" XXX + SG_ StopLamp_B_RqTrlrBrk : 7|1@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrkOut_No_Dsply : 3|4@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrkGain_No_Actl : 21|5@0+ (0.5,0) [0|0] "" XXX + SG_ TrlrBrkDsply_B_Rq : 6|1@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrkDcnnt_B_Actl : 5|1@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrkCtl_B_Falt : 4|1@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrkActCirct_B_Falt : 39|1@0+ (1,0) [0|0] "" XXX + SG_ TrlrBrkMde_D_Actl : 23|1@0+ (1,0) [0|0] "" XXX + +BO_ 1104 SHCM_Status: 8 XXX + SG_ CURRENT_DRAW : 15|8@0+ (0.5,0) [0|0] "Amps" XXX + SG_ SECONDARY_HEATER_STAT : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 1107 PassengerOCSSerialNum: 8 XXX + SG_ OCSSerialNoByte8 : 63|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSerialNoByte7 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSerialNoByte6 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSerialNoByte5 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSerialNoByte4 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSerialNoByte3 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSerialNoByte2 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ OCSSerialNoByte1 : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1108 RCMSerialNumber: 8 XXX + SG_ RCMSerialNoByte8 : 63|8@0+ (1,0) [0|0] "" XXX + SG_ RCMSerialNoByte7 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ RCMSerialNoByte6 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ RCMSerialNoByte5 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ RCMSerialNoByte4 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ RCMSerialNoByte3 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ RCMSerialNoByte2 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ RCMSerialNoByte1 : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1109 eCall_Info: 8 XXX + SG_ eCallConfirmation : 7|3@0+ (1,0) [0|0] "" XXX + +BO_ 1125 GPS_Data_Nav_1_HS: 8 XXX + SG_ GpsHsphLattSth_D_Actl : 25|2@0+ (1,0) [0|0] "" XXX + SG_ GpsHsphLongEast_D_Actl : 9|2@0+ (1,0) [0|0] "" XXX + SG_ GPS_Longitude_Minutes : 46|6@0+ (1,0) [0|0] "Minutes" XXX + SG_ GPS_Longitude_Min_dec : 55|14@0+ (0.0001,0) [0|0] "Minutes" XXX + SG_ GPS_Longitude_Degrees : 39|9@0+ (1,-179.0) [0|0] "Degrees" XXX + SG_ GPS_Latitude_Minutes : 15|6@0+ (1,0) [0|0] "Minutes" XXX + SG_ GPS_Latitude_Min_dec : 23|14@0+ (0.0001,0) [0|0] "Minutes" XXX + SG_ GPS_Latitude_Degrees : 7|8@0+ (1,-89.0) [0|0] "Degrees" XXX + +BO_ 1126 GPS_Data_Nav_2_HS: 8 XXX + SG_ Gps_B_Falt : 2|1@0+ (1,0) [0|0] "" XXX + SG_ GpsUtcYr_No_Actl : 55|5@0+ (1,1.0) [0|0] "Year" XXX + SG_ GpsUtcMnth_No_Actl : 47|4@0+ (1,1.0) [0|0] "Month" XXX + SG_ GpsUtcDay_No_Actl : 37|5@0+ (1,1.0) [0|0] "Day" XXX + SG_ GPS_UTC_seconds : 23|6@0+ (1,0) [0|0] "seconds" XXX + SG_ GPS_UTC_minutes : 15|6@0+ (1,0) [0|0] "Minutes" XXX + SG_ GPS_UTC_hours : 7|5@0+ (1,0) [0|0] "Hours" XXX + SG_ GPS_Pdop : 31|5@0+ (0.2,0) [0|0] "" XXX + SG_ GPS_Compass_direction : 26|4@0+ (1,0) [0|0] "" XXX + SG_ GPS_Actual_vs_Infer_pos : 38|1@0+ (1,0) [0|0] "" XXX + +BO_ 1127 GPS_Data_Nav_3_HS: 8 XXX + SG_ GPS_Vdop : 63|5@0+ (0.2,0) [0|0] "" XXX + SG_ GPS_Speed : 47|8@0+ (1,0) [0|0] "MPH" XXX + SG_ GPS_Sat_num_in_view : 7|5@0+ (1,0) [0|0] "" XXX + SG_ GPS_MSL_altitude : 15|12@0+ (10.0,-20460.0) [0|0] "feet" XXX + SG_ GPS_Heading : 31|16@0+ (0.01,0) [0|0] "Degrees" XXX + SG_ GPS_Hdop : 55|5@0+ (0.2,0) [0|0] "" XXX + SG_ GPS_dimension : 2|3@0+ (1,0) [0|0] "" XXX + +BO_ 1152 All_Terrain_Data: 8 XXX + SG_ HdcSwitchPos_B_Actl : 0|1@0+ (1,0) [0|0] "" XXX + SG_ TerrStat_D_RqDsply : 7|4@0+ (1,0) [0|0] "" XXX + SG_ TerrMde_D_RqDrv : 3|3@0+ (1,0) [0|0] "" XXX + +BO_ 1186 Information_4x4_2_CG1: 8 XXX + SG_ RearDiffFalt_D_Stat : 23|2@0+ (1,0) [0|0] "" XXX + SG_ RearDiffLck_Tq_Actl : 7|12@0+ (1,0) [0|0] "Nm" XXX + SG_ RearDiffLckMsg_D_Rq : 20|3@0+ (1,0) [0|0] "" XXX + SG_ AwdSrvcRqd_B_Rq : 21|1@0+ (1,0) [0|0] "" XXX + SG_ RearDiffLckLamp_D_Rq : 11|2@0+ (1,0) [0|0] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/ford_fusion_2018_adas.dbc b/artifacts/package_runtime/iqdbc/dbc/ford_fusion_2018_adas.dbc new file mode 100644 index 000000000..2e1647b3d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/ford_fusion_2018_adas.dbc @@ -0,0 +1,421 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 1280 Object_00: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1281 Object_01: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1282 Object_02: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1283 Object_03: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1284 Object_04: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1285 Object_05: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1286 Object_06: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1287 Object_07: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1288 Object_08: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1289 Object_09: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1290 Object_10: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1291 Object_11: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1292 Object_12: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1293 Object_13: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1294 Object_14: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1295 Object_15: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1296 Object_16: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1297 Object_17: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1298 Object_18: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1299 Object_19: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1300 Object_20: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1301 Object_21: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1302 Object_22: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1303 Object_23: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1304 Object_24: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1305 Object_25: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1306 Object_26: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1307 Object_27: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1308 Object_28: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1309 Object_29: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1310 Object_30: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1311 Object_31: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1312 Object_32: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1313 Object_33: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1314 Object_34: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1315 Object_35: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1316 Object_36: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1317 Object_37: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1318 Object_38: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1319 Object_39: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1320 Object_40: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1321 Object_41: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1322 Object_42: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1323 Object_43: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1324 Object_44: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1325 Object_45: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1326 Object_46: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1327 Object_47: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1328 Object_48: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1329 Object_49: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1330 Object_50: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1331 Object_51: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1332 Object_52: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1333 Object_53: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1334 Object_54: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1335 Object_55: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1336 Object_56: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1337 Object_57: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1338 Object_58: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1339 Object_59: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1340 Object_60: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1341 Object_61: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1342 Object_62: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + +BO_ 1343 Object_63: 8 XXX + SG_ X_Rel : 18|11@0+ (0.1,0) [0|0] "m" XXX + SG_ V_Rel : 52|13@0- (0.01,0) [0|0] "m/s" XXX + SG_ A_Rel : 33|10@0- (0.05,0) [0|0] "m/s2" XXX + SG_ Angle : 12|10@0- (-0.1,0) [0|0] "deg" XXX + diff --git a/artifacts/package_runtime/iqdbc/dbc/ford_fusion_2018_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/ford_fusion_2018_pt.dbc new file mode 100644 index 000000000..c4b706d06 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/ford_fusion_2018_pt.dbc @@ -0,0 +1,139 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 130 EPAS_INFO: 8 XXX + SG_ SteMdule_U_Meas : 39|8@0+ (0.05,6.0) [0|0] "Volts" XXX + SG_ SteMdule_I_Est : 21|12@0+ (0.05,-64.0) [0|0] "Amps" XXX + SG_ EPAS_FAILURE : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SteeringColumnTorque : 7|8@0+ (0.0625,-8.0) [0|0] "Nm" XXX + SG_ SAPPAngleControlStat6 : 15|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat5 : 14|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat4 : 13|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat3 : 12|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat2 : 11|1@0+ (1,0) [0|0] "" XXX + SG_ SAPPAngleControlStat1 : 23|2@0+ (1,0) [0|0] "" XXX + +BO_ 118 Steering_Wheel_Data_CG1: 8 XXX + SG_ SteWhlRelInit_An_Sns : 6|15@0+ (0.1,-1600.0) [0|0] "deg" XXX + SG_ SteWhlRelCalib_An_Sns : 23|15@0+ (0.1,-1600.0) [0|0] "deg" XXX + SG_ SteWhlRelInit2_An_Sns : 55|16@0+ (0.1,-3200.0) [0|0] "deg" XXX + SG_ SteWhlAn_No_Cs : 39|8@0+ (1,0) [0|0] "" XXX + SG_ SteWhlAn_No_Cnt : 47|4@0+ (1,0) [0|0] "Counts" XXX + +BO_ 131 Steering_Buttons: 8 XXX + SG_ Right_Turn_Light : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Left_Turn_Light : 4|1@0+ (1,0) [0|0] "" XXX + SG_ Dist_Decr : 12|1@0+ (1,0) [0|0] "" XXX + SG_ Dist_Incr : 11|1@0+ (1,0) [0|0] "" XXX + SG_ Cancel : 8|1@0+ (1,0) [0|0] "" XXX + SG_ Resume : 29|1@0+ (1,0) [0|0] "" XXX + SG_ Set : 28|1@0+ (1,0) [0|0] "" XXX + SG_ Main : 38|1@0+ (1,0) [0|0] "" XXX + +BO_ 145 Yaw_Data: 8 XXX + SG_ VehYaw_W_Actl : 39|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX + SG_ VehRol_W_Actl : 23|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX + SG_ VehPtch_W_Actl : 7|16@0+ (0.0002,-6.5) [0|0] "rad/s" XXX + +BO_ 146 Accel_Data: 8 XXX + SG_ VehVertAActl_D_Qf : 38|2@0+ (1,0) [0|0] "" XXX + SG_ VehLongAActl_D_Qf : 22|2@0+ (1,0) [0|0] "" XXX + SG_ VehLatAActl_D_Qf : 6|2@0+ (1,0) [0|0] "" XXX + SG_ VehVert_A_Actl : 36|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX + SG_ VehLong_A_Actl : 20|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX + SG_ VehLat_A_Actl : 4|13@0+ (0.01,-40.0) [0|0] "m/s^2" XXX + +BO_ 357 Cruise_Status: 8 XXX + SG_ Brake_Drv_Appl : 5|1@0+ (1,0) [0|0] "" XXX + SG_ Cruise_State : 11|4@0+ (1,0) [0|0] "" XXX + SG_ Set_Speed : 23|8@0+ (1,0) [0|0] "" XXX + +BO_ 516 EngineData_14: 8 XXX + SG_ ApedPosScal_Pc_Actl : 1|10@0+ (0.1,0) [0|0] "%" XXX + +BO_ 535 WheelSpeed_CG1: 8 XXX + SG_ WhlRr_W_Meas : 55|14@0+ (0.04,0) [0|0] "rad/s" XXX + SG_ WhlRl_W_Meas : 39|14@0+ (0.04,0) [0|0] "rad/s" XXX + SG_ WhlFr_W_Meas : 23|14@0+ (0.04,0) [0|0] "rad/s" XXX + SG_ WhlFl_W_Meas : 7|14@0+ (0.04,0) [0|0] "rad/s" XXX + +BO_ 534 WheelData: 8 XXX + SG_ WhlRotatRr_No_Cnt : 23|8@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRr_D_Actl : 33|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirRl_D_Actl : 39|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirFr_D_Actl : 37|2@0+ (1,0) [0|0] "" XXX + SG_ WhlDirFl_D_Actl : 35|2@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatRl_No_Cnt : 31|8@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatFr_No_Cnt : 7|8@0+ (1,0) [0|0] "" XXX + SG_ WhlRotatFl_No_Cnt : 15|8@0+ (1,0) [0|0] "" XXX + SG_ WHEEL_ROLLING_TIMESTAMP : 47|8@0+ (1,0) [0|0] "" XXX + +BO_ 947 Doors: 8 XXX + SG_ Door_FL_Open : 61|1@0+ (1,0) [0|0] "" XXX + SG_ Door_FR_Open : 60|1@0+ (1,0) [0|0] "" XXX + SG_ Door_RL_Open : 48|1@0+ (1,0) [0|0] "" XXX + SG_ Door_RR_Open : 49|1@0+ (1,0) [0|0] "" XXX + +BO_ 963 BCM_to_HS_Body: 8 XXX + SG_ Brake_Lights : 8|1@0+ (1,0) [0|0] "" XXX + +BO_ 970 Lane_Keep_Assist_Control: 8 XXX + SG_ Lkas_Action : 7|4@0+ (1,0) [0|15] "" XXX + SG_ Lkas_Alert : 3|4@0+ (1,0) [0|15] "" XXX + SG_ Lane_Curvature : 15|12@0+ (5e-06,-0.01) [0|0] "1/m" XXX + SG_ Steer_Angle_Req : 19|12@0+ (0.04297,-88.00445) [0|0] "deg" XXX + +BO_ 972 Lane_Keep_Assist_Status: 8 XXX + SG_ LaHandsOff_B_Actl : 7|1@0+ (1,0) [0|0] "" XXX + SG_ LaActDeny_B_Actl : 6|1@0+ (1,0) [0|0] "" XXX + SG_ LaActAvail_D_Actl : 5|2@0+ (1,0) [0|0] "" XXX + +BO_ 984 Lane_Keep_Assist_Ui: 8 XXX + SG_ Set_Me_X80 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ Set_Me_X45 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ Lines_Hud : 55|4@0+ (1,0) [0|15] "" XXX + SG_ Hands_Warning_W_Chime : 50|1@0+ (1,0) [0|1] "" XXX + SG_ Hands_Warning : 49|1@0+ (1,0) [0|1] "" XXX + SG_ Set_Me_X30 : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ SG_ 970 Lkas_Action "only vals 4, 5, 8, 9 seem to work. 4 and 5 are a bit smoother" ; + +VAL_ 357 Cruise_State 4 "active" 3 "standby" 0 "off" ; +VAL_ 970 Lkas_Action 15 "off" 9 "abrupt" 8 "abrupt2" 5 "smooth" 4 "smooth2" ; +VAL_ 970 Lkas_Alert 15 "no_alert" 3 "high_intensity" 2 "mid_intensity" 1 "low_intensity" ; +VAL_ 972 LaActAvail_D_Actl 3 "available" 2 "tbd" 1 "not_available" 0 "fault" ; +VAL_ 984 Lines_Hud 15 "none" 11 "grey_yellow" 8 "green_red" 7 "yellow_grey" 6 "grey_grey" 4 "red_green" 3 "green_green" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/ford_lincoln_base_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/ford_lincoln_base_pt.dbc new file mode 100644 index 000000000..828e4118e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/ford_lincoln_base_pt.dbc @@ -0,0 +1,12717 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: VDM CMR_DSMC SOBDMC_HPCM_FD1 IPMA_ADAS PSCM ABS_ESC TCCM TCM_DSL PCM_HEV PCM ECM_Diesel GENERIC_GWMWakeup GWM _delete TSTR + +VAL_TABLE_ DcacRdy_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "Faulted" 4 "ProtectionTempearture" 3 "ProtectionOverload" 2 "ProtectionGfci" 1 "Active" 0 "Idle"; +VAL_TABLE_ HvacCmprLim_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "CompressorHeadPressure" 4 "AvailableTorque" 3 "PedalPosition" 2 "RPM" 1 "ECT" 0 "NoLimit"; +VAL_TABLE_ AdvStrt_D_Stat 15 "NotUsed_15" 14 "NotUsed_14" 13 "NotUsed_13" 12 "NotUsed_12" 11 "NotUsed_11" 10 "NotUsed_10" 9 "NotUsed_9" 8 "NotUsed_8" 7 "NotUsed_7" 6 "NotUsed_6" 5 "NotUsed_5" 4 "NotUsed_4" 3 "NotUsed_3" 2 "NotUsed_2" 1 "NotUsed_1" 0 "NoAction"; +VAL_TABLE_ VehOnSrc_D_Stat 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "OverTheAir" 3 "RemoteParkAssist" 2 "RemoteStart" 1 "Manual" 0 "Off"; +VAL_TABLE_ NoMessage_Msg1_63 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ TrlrRvrseEnbl_D2_Stat 7 "NotUsed" 6 "TbaActiveExpertActive" 5 "TbaActiveExpertAvail" 4 "TbaOffTrgActive" 3 "TbaOffTrgSetup" 2 "TbaSetup" 1 "TbaActive" 0 "Inactive"; +VAL_TABLE_ Off_On_FlashChime 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "NotUsed_1" 2 "FlashChime" 1 "On" 0 "Off"; +VAL_TABLE_ DieslPrtcWarn_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "OCR_ExhFilterClean_Stopped" 10 "OCR_ExhFilterCleaned" 9 "RgnOff_AtLimit" 8 "RgnOff_OverLoaded" 7 "RgnOff_Loaded" 6 "Exhaust_Filter_Full" 5 "DPF_OverLimit" 4 "DPF_AtLimit" 3 "ExhFilter_Drive_Completed" 2 "Cleaning_Exhaust_Filter" 1 "DPF_OverLoaded" 0 "DPF_Normal_Operation"; +VAL_TABLE_ StrtrMtrCtlMsgTxt_D2_Rq 3 "NotUsed" 2 "ShiftToNeutralToStart" 1 "ShiftToParkToStart" 0 "NoRequest"; +VAL_TABLE_ PaakMyKey_D_Rq 3 "NotUsed" 2 "ConfirmNewPaakMyKey" 1 "RequestNewPaakMyKey" 0 "None"; +VAL_TABLE_ PaakMyKeySearch_D_Stat 7 "PhoneErased" 6 "LockButtonTimeOut" 5 "PressLockButton" 4 "ConfirmHmi" 3 "MyKeyPaakFound" 2 "StandardPaakFound" 1 "NoValidPaakFound" 0 "Null"; +VAL_TABLE_ TrlrIdType_D_Stat 3 "Gooseneck" 2 "FifthWheel" 1 "Conventional" 0 "Null"; +VAL_TABLE_ TrlrAidSetup_D2_Rq 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "CompleteSetup" 5 "ReturnToSetup" 4 "StickerNotCircled" 3 "ConfirmSetup" 2 "EndSetup" 1 "BeginSetup" 0 "Inactive"; +VAL_TABLE_ TrlrAidEnbl_D2_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Deactivate" 2 "ActivateTrg" 1 "ActivateTba" 0 "Inactive"; +VAL_TABLE_ BattChrgMde_D_Actl 3 "NotUsed" 2 "ConstantCurrent" 1 "ConstantVoltage" 0 "NotCharging"; +VAL_TABLE_ LcwaLeft_D_Stat 7 "Faulty" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Disabled" 2 "TemporaryUnavailable" 1 "SensorBlocked" 0 "Available"; +VAL_TABLE_ LcwaMsgTxt_D_Stat 3 "SodXFaulty" 2 "SodXBlocked" 1 "TrailerConnected" 0 "NoMessage"; +VAL_TABLE_ Level_0_3 3 "Level_3" 2 "Level_2" 1 "Level_1" 0 "Level_0"; +VAL_TABLE_ SteWhlSwtchMde_D_Stat 3 "NotUsed_2" 2 "NotUsed_1" 1 "Dialog" 0 "Domain"; +VAL_TABLE_ TrlrRvrse_D_Stat 3 "Faulty" 2 "TrailerReverseGuidanceLite" 1 "On" 0 "Off"; +VAL_TABLE_ TrlrAid_D2_Stat 15 "Faulty" 14 "NotUsed_4" 13 "NotUsed_3" 12 "NotUsed_2" 11 "NotUsed_1" 10 "DirtyCamera" 9 "IncorrectLighting" 8 "TrackingLost" 7 "TrackingUnknownConfidence" 6 "TrackingHighConfidence" 5 "TrackingMediumConfidence" 4 "TrackingLowConfidence" 3 "TurnRequested" 2 "DriveStraighRequested" 1 "Initializing" 0 "NotTracking"; +VAL_TABLE_ AwdDrvMde_D2 15 "Faulty" 14 "NotUsed_7" 13 "NotUsed_6" 12 "NotUsed_5" 11 "NotUsed_4" 10 "NotUsed_3" 9 "NotUsed_2" 8 "NotUsed_1" 7 "NotAvailable" 6 "TowHaul" 5 "RockCrawl" 4 "Baja" 3 "MudAndSand" 2 "Weather" 1 "Sport" 0 "Normal"; +VAL_TABLE_ TrlrAidSetup_D2_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "SetupAcquisitionSuccess" 4 "TbaTadMonitor" 3 "SetupStartAcquisition" 2 "SetupPrepForAcquisition" 1 "TbaActive" 0 "Null"; +VAL_TABLE_ CamraRearOn_D2_Stat2 7 "Faulty" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Decommission" 2 "Activate" 1 "Deactivate" 0 "Null"; +VAL_TABLE_ AirCondClu_D_Stat 7 "NotUsed" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad"; +VAL_TABLE_ BattChrgTrgtSoC_D_Rq 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100"; +VAL_TABLE_ OffNormalSoft 3 "NotUsed" 2 "Soft" 1 "Normal" 0 "Off"; +VAL_TABLE_ OffOnDisabledInhibited 3 "Inhibited" 2 "Disabled" 1 "On" 0 "Off"; +VAL_TABLE_ DgtlCommGtwyMde_D_Rq 15 "NotUsed_10" 14 "NotUsed_9" 13 "NotUsed_8" 12 "NotUsed_7" 11 "NotUsed_6" 10 "NotUsed_5" 9 "NotUsed_4" 8 "NotUsed_3" 7 "NotUsed_2" 6 "NotUsed_1" 5 "AcPnC" 4 "AcEIM" 3 "DcPnC" 2 "DcEIM" 1 "AttemptDgtlComm" 0 "NoDgtlComm"; +VAL_TABLE_ BattDcCnnct_D_Cmd 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "WeldCheck" 3 "OkToDischarge" 2 "Closed" 1 "Precharge" 0 "Open"; +VAL_TABLE_ Null_NoFault_Fault 3 "NotUsed" 2 "Fault" 1 "NoFault" 0 "Null"; +VAL_TABLE_ ModemReset_D_Rq 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "BrandConnectReset2" 5 "BrandConnectReset1" 4 "CcsReset" 3 "OnlineTrafficReset" 2 "PaakReset" 1 "WifiHotspotReset" 0 "Null"; +VAL_TABLE_ PrkAsstSlotId_D_Stat 7 "Faulty" 6 "Slot6" 5 "Slot5" 4 "Slot4" 3 "Slot3" 2 "Slot2" 1 "Slot1" 0 "NoSlotFound"; +VAL_TABLE_ RstrnOnPsngr_D_RqMnu 15 "Faulty" 14 "NotUsed_11" 13 "NotUsed_10" 12 "ConfiguredOff" 11 "NotUsed_9" 10 "On" 9 "NotUsed_8" 8 "NotUsed_7" 7 "NotUsed_6" 6 "NotUsed_5" 5 "Off" 4 "NotUsed_4" 3 "NotUsed_3" 2 "NotUsed_2" 1 "NotUsed_1" 0 "NoAction"; +VAL_TABLE_ BalrInnrLeft_D_Stat 3 "Reporting" 2 "NotReporting" 1 "SystemStandby" 0 "Initialization"; +VAL_TABLE_ Zero_1_2_4 3 "Four" 2 "Two" 1 "One" 0 "Zero"; +VAL_TABLE_ NoReq_AutoUp_Stop 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_TABLE_ BalrSnsLeft_D_Falt 3 "Invalid" 2 "SystemFailure" 1 "Blocked" 0 "Clear"; +VAL_TABLE_ Null_Low_Med_High 3 "High" 2 "Medium" 1 "Low" 0 "Null"; +VAL_TABLE_ Null_NotPressed_Pressed 3 "NotUsed" 2 "Pressed" 1 "NotPressed" 0 "Null"; +VAL_TABLE_ Low_Med_High 3 "NotUsed" 2 "High" 1 "Medium" 0 "Low"; +VAL_TABLE_ Null_NotAvail_Avail 3 "NotUsed" 2 "Available" 1 "NotAvailable" 0 "Null"; +VAL_TABLE_ ChrgGoTMnte_D_Stat 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0"; +VAL_TABLE_ NoData_Faulty_1E_1F 31 "Faulty" 30 "NoDataExists"; +VAL_TABLE_ PwFlwBatt_D_Dsply 15 "NotUsed_8" 14 "NotUsed_7" 13 "NotUsed_6" 12 "NotUsed_5" 11 "NotUsed_4" 10 "NotUsed_3" 9 "NotUsed_2" 8 "NotUsed_1" 7 "FlwFromWallToBatt" 6 "FlwFromAllWhlsToBatt" 5 "FlwFromBattToAllWhls" 4 "FlwFromFrontWhlsToBatt" 3 "FlwFromBattToFrontWhls" 2 "FlwFromRearWhlsToBatt" 1 "FlwFromBattToRearWhls" 0 "NoFlow"; +VAL_TABLE_ PwFlwFuelDrv_D_Dsply 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "FlwFromFuelToAllWhls" 2 "FlwFromFuelToFrontWhls" 1 "FlwFromFuelToRearWhls" 0 "NoFlow"; +VAL_TABLE_ TrlrAidMsgTxt_D2_Rq 63 "Message63" 62 "Message62" 61 "Message61" 60 "Message60" 55 "Message55" 50 "Message50" 45 "Message45" 40 "Message40" 35 "Message35" 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ TrlrAidEnbl_D2_Stat 7 "NotUsed_1" 6 "TbaActiveExpertActive" 5 "TbaActiveExpertAvail" 4 "TbaOffTrgActive" 3 "TbaOffTrgSetup" 2 "TbaSetup" 1 "TbaActive" 0 "Inactive"; +VAL_TABLE_ RbaCta_D_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off"; +VAL_TABLE_ NoRequest_Mode1_2_3 3 "Mode_3" 2 "Mode_2" 1 "Mode_1" 0 "NoRequest"; +VAL_TABLE_ RvltnMatchAllw_D_Stat 3 "RevolutionMatchDisabled" 2 "RevolutionMatchEnabled" 1 "ChangeWithDriveMode" 0 "NoSelection"; +VAL_TABLE_ BattTracCnnct_D_Cmd 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "WeldCheck" 3 "OkToDischarge" 2 "Closed" 1 "Precharge" 0 "Open"; +VAL_TABLE_ NotDiagnose_FailPass 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_TABLE_ Null_Off_UnavailFaulty 3 "Faulty" 2 "Unavailable" 1 "Off" 0 "Null"; +VAL_TABLE_ OffOnDisabledNotUsed 3 "NotUsed" 2 "Disabled" 1 "On" 0 "Off"; +VAL_TABLE_ OffGraphicTextBoth 3 "Both" 2 "Text" 1 "Graphic" 0 "Off"; +VAL_TABLE_ NoneInactiveActive_NotUsed 3 "NotUsed" 2 "Active" 1 "Inactive" 0 "None"; +VAL_TABLE_ Off_On_NotUsed 3 "NotUsed_2" 2 "NotUsed_1" 1 "On" 0 "Off"; +VAL_TABLE_ RbaSys_D_Stat 3 "Faulty" 2 "Available" 1 "Suspended" 0 "Disabled"; +VAL_TABLE_ BrkAppl_D_RqPt 3 "BrakesSlowRelease" 2 "BrakesFastRelease" 1 "BrakesEngage" 0 "NotActive"; +VAL_TABLE_ Mtr2State_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed_1" 4 "ReadinessState" 3 "DeactivationState" 2 "PowerGeneration" 1 "PowerConsumption" 0 "Null"; +VAL_TABLE_ HybVehMde_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Fuel" 2 "HybridElectric" 1 "AllElectric" 0 "Null"; +VAL_TABLE_ ChrgStat_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed" 4 "ChargingCompleted" 3 "NotCharging" 2 "ChargingInDrivingState" 1 "ChargingInParkingState" 0 "Null"; +VAL_TABLE_ Null_HiPower_Low_Med 3 "MediumPower" 2 "LowPower" 1 "HighPower" 0 "Null"; +VAL_TABLE_ Inactive_Enable_Disable_NotUsed 0 "Inactive" 2 "Disable" 1 "Enable"; +VAL_TABLE_ Inactive_OffOn_NotUsed 0 "Inactive" 1 "On" 2 "Off" 3 "NotUsed"; +VAL_TABLE_ Null_NotPressed_Faulty 3 "Faulty" 2 "Pressed" 1 "NotPressed" 0 "Null"; +VAL_TABLE_ TrailCtl_D_Stat 7 "Faulty" 6 "DescentOnly" 5 "EnabledDeny" 4 "StandbyOverThreshold" 3 "StandbyOverride" 2 "Active" 1 "EnabledDescent" 0 "Off"; +VAL_TABLE_ Faulty_3F 63 "Faulty"; +VAL_TABLE_ ChrgOvrdExitScrn_D_Rq 3 "NotUsed_1" 2 "Request_override" 1 "Do_not_request_override" 0 "Inactive"; +VAL_TABLE_ Quality_Data_Faulty 3 "OK" 2 "Not_Within_Specifications" 1 "Eval_In_Progress" 0 "Faulty"; +VAL_TABLE_ TrlrHitchYaw_D_Stat 15 "Faulty" 14 "NotUsed_4" 13 "NotUsed_3" 12 "NotUsed_2" 11 "NotUsed_1" 10 "FaultyYrsuConnection" 9 "FaultyYrsu" 8 "HiConfdLrndAngle" 7 "LowConfdLrndAngle" 6 "HiConfdAngleMem" 5 "LowConfdAngleMem" 4 "InitNoTadAngle" 3 "InitInputs" 2 "TadTrlrDataOutOfRange" 1 "TadNotWithinSpecification" 0 "NoConnectionWithYrsu"; +VAL_TABLE_ NoData_Faulty_FFFFFFFFFFFE_FF -1 "Faulty_FFFFFFFFFFFF" -2 "NoDataExists_FFFFFFFFFFFE"; +VAL_TABLE_ NoFault_Fault 1 "Fault" 0 "No_Fault"; +VAL_TABLE_ OtaTrg_D_Stat 3 "NotUsed_1" 2 "Accepted" 1 "NotAccepted" 0 "Null"; +VAL_TABLE_ EdmMsgTxt_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "OverallGoodScore" 10 "WorkOnCompliance" 9 "GoodCompliance" 8 "WorkOnGearShifting" 7 "GoodGearShifting" 6 "WorkOnEfficientSpeed" 5 "GoodEfficientSpeed" 4 "WorkOnDeceleration" 3 "GoodDeceleration" 2 "WorkOnAcceleration" 1 "GoodAcceleration" 0 "NoMessage"; +VAL_TABLE_ EdmLamp_D_Dsply 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "NotUsed_1" 8 "CoastingEngineBrake" 7 "CoastingShiftToNeutral" 6 "FreewayJunction" 5 "Curve2" 4 "Curve1" 3 "SpeedLimit" 2 "Crossing" 1 "FreewayExit" 0 "NoRecommendation"; +VAL_TABLE_ AwdCnnct_D_Stat 3 "Connecting" 2 "Disconnecting" 1 "Connected" 0 "Disconnected"; +VAL_TABLE_ EngAirFiltMsgTxt_D_Rq 7 "NotUsed_2" 6 "NotUsed_1" 5 "EngineAirFilterMonitorFalt" 4 "ResetComplete" 3 "Clogged" 2 "ReplaceNow" 1 "ReplaceSoon" 0 "NoMessage"; +VAL_TABLE_ ElPwPoint_D_Rq 3 "On" 2 "Off2" 1 "Off1" 0 "Null"; +VAL_TABLE_ EngExhMdeQuiet_D2_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Track" 3 "Sport" 2 "Normal" 1 "Stealth" 0 "Null"; +VAL_TABLE_ RearDiffThrml_D_Stat 3 "NotUsed_1" 2 "AboveThermalLimit" 1 "ThermalLimit" 0 "Normal"; +VAL_TABLE_ NoInhibit_Inhibit 1 "Inhibit" 0 "NoInhibit"; +VAL_TABLE_ PersRecallSrc_D_Actl 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "MemorySwitch" 3 "RemoteStart" 2 "KeyFob" 1 "CenterStack" 0 "Null"; +VAL_TABLE_ BattTracChiller_D_Stat 3 "NotUsed" 2 "ChillerNotAvailable" 1 "ChillerBrieflyAvailable" 0 "ChillerAvailable"; +VAL_TABLE_ SelDrvMdeChassis2_D_Rq 31 "Faulty" 30 "NotUsed17" 29 "NotUsed16" 28 "NotUsed15" 27 "NotUsed14" 26 "NotUsed13" 25 "NotUsed12" 24 "NotUsed11" 23 "NotUsed10" 22 "NotUsed9" 21 "NotUsed8" 20 "NotUsed7" 19 "NotUsed6" 18 "NotUsed5" 17 "NotUsed4" 16 "NotUsed3" 15 "NotUsed2" 14 "RoughRoadMode" 13 "TrackMode" 12 "HighSpeedDesertMode" 11 "TowHaulMode" 10 "RockCrawlMode" 9 "SandMode" 8 "MudAndRutsMode" 7 "LowMuMode" 6 "ComfortAdaptiveMode" 5 "ComfortMode" 4 "SportAdaptiveMode" 3 "SportMode" 2 "EconomyMode" 1 "NormalAdaptiveMode" 0 "NormalMode"; +VAL_TABLE_ TrnFaltOpenClu_B_Stat 1 "MayOpenClutch" 0 "Normal"; +VAL_TABLE_ UrbanAreaDetct_D_Stat 3 "NotUsed_1" 2 "City" 1 "Subdivision" 0 "None"; +VAL_TABLE_ Closed_Open 1 "Open" 0 "Closed"; +VAL_TABLE_ AdbBrdrDist 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m"; +VAL_TABLE_ TCU_ESN_D_Rq 3 "NotUsed" 2 "TCU_ESN_Request" 1 "NoRequest" 0 "Inactive"; +VAL_TABLE_ FactoryReset_Rq 1 "ResetFactoryDefaults" 0 "Inactive"; +VAL_TABLE_ TCU_Init_Actvtn_St 3 "NotUsed" 2 "InitialActivateDeny" 1 "InitialActivateAccept" 0 "Invalid"; +VAL_TABLE_ TCU_Final_Actvtn_St 3 "NotUsed" 2 "FinalActivateDeny" 1 "FinalActivateAccept" 0 "Invalid"; +VAL_TABLE_ WaitToStartLamp_D_Falt 3 "NotUsed" 2 "Wait_to_start_lamp_failed" 1 "Diagnosis_not_ready" 0 "Wait_to_start_lamp_OK"; +VAL_TABLE_ BattTracCoolLvl_D_Rq 7 "Faulty" 6 "NotUsed" 5 "ChillerCoolingBattFirst" 4 "ChillerCoolingCabinFirst" 3 "ForcedCoolingRadiator" 2 "OpportunisticCoolingRad" 1 "CoolantFlowBypassLine" 0 "Off"; +VAL_TABLE_ BattClntVlvOvrrd_D_Rq 3 "NotUsed" 2 "OverrideTbcvToChiller" 1 "OverrideTbcvToRadiator" 0 "NoOverrideToTbcvCLogic"; +VAL_TABLE_ NonMagnetic_Magnetic 1 "Magnetic" 0 "NonMagnetic"; +VAL_TABLE_ RideHghtMde_D_Stat 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "AdjUpAero" 8 "AdjUpOffRoad" 7 "AdjUpNormal" 6 "AdjDownKneel" 5 "AdjDownAero" 4 "AdjDownNormal" 3 "OffRoad" 2 "Kneel" 1 "Aero" 0 "Normal"; +VAL_TABLE_ AutoTowAllw_D_StatMnu 3 "TowHaulCommandedOn" 2 "AutoTowHaulEnabled" 1 "AutoTowHaulDisabled" 0 "NoSelection"; +VAL_TABLE_ SrpEventRight_D_Stat 3 "Faulty" 2 "Bump" 1 "Pothole" 0 "NoEvent"; +VAL_TABLE_ RearDiff_D_Stat 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "NotUsed_1" 8 "TorqueReqNotHonored" 7 "MissingSignal" 6 "ModuleFault" 5 "HydroTempSensorFault" 4 "ClutchPressSensorFault" 3 "AccumPressSensorFault" 2 "ControlValveFault" 1 "MotorFault" 0 "Normal"; +VAL_TABLE_ NotAllowed_Allowed 1 "Allowed" 0 "NotAllowed"; +VAL_TABLE_ EngTrlrCnnct_D_Stat 3 "NotUsed_1" 2 "UnverifiedTrailer" 1 "HeavyTrailer" 0 "NoTrailer"; +VAL_TABLE_ Faulty_FFFF 65535 "Faulty"; +VAL_TABLE_ NoData_Faulty_3FFE_3FFF 16383 "Faulty" 16382 "NoDataExists"; +VAL_TABLE_ Faulty_3FFF 16383 "Faulty"; +VAL_TABLE_ NotExceeded_Exceeded 1 "Exceeded" 0 "NotExceeded"; +VAL_TABLE_ EmgcyCall_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "ManualEmergencyCall" 3 "AutoEmergencyCall" 2 "NoEvent" 1 "EmergencyCallNotSupported" 0 "Null"; +VAL_TABLE_ NotAsserted_Asserted 1 "Asserted" 0 "NotAsserted"; +VAL_TABLE_ AirSprngRate_D_Stat 3 "Faulty" 2 "Firm" 1 "Medium" 0 "Soft"; +VAL_TABLE_ AirSprngRate_D_Rq 3 "NoRequest" 2 "Firm" 1 "Medium" 0 "Soft"; +VAL_TABLE_ GearLvr_D_ActlDrv 15 "Fault" 14 "Unknown_Position" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Range6" 10 "Range5" 9 "Range4" 8 "Range3_M3_L3" 7 "Range2_M2_L2" 6 "Range1_M1_L1" 5 "Low" 4 "Sport_DriveSport_Mposition" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_TABLE_ ChrgrInPwMde_D_Actl 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "EvseFault" 7 "EvseNotCompatible" 6 "IcCharging" 5 "DcCharging" 4 "AcDigital" 3 "AcBasic" 2 "DigitalCommDetected" 1 "EvsePaused" 0 "EvseNotDetected"; +VAL_TABLE_ ChrgCordLck_D_Stat 7 "Faulty" 6 "LockFail" 5 "UnlockFail" 4 "LockInProgress" 3 "UnlockInProgress" 2 "Lock" 1 "Unlock" 0 "Retain"; +VAL_TABLE_ LkaActvStats_D2_Req 7 "NotUsed" 6 "LkaIncrIntervRight" 5 "LkaSupprRight" 4 "LkaStandIntervRight" 3 "LkaSupprLeft" 2 "LkaStandIntervLeft" 1 "LkaIncrIntervLeft" 0 "LkaNoInterv"; +VAL_TABLE_ OffOnNoDataFaulty 3 "Faulty" 2 "No_Data_Exists" 1 "On" 0 "Off"; +VAL_TABLE_ NoMessage_Msg1_3 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ TrnRng_D_RqGsm 15 "Fault" 14 "UnknownPosition" 13 "Undefined_2" 12 "Undefined_1" 11 "_6" 10 "_5" 9 "_4" 8 "_3" 7 "_2" 6 "_1" 5 "Low" 4 "Sport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_TABLE_ PrkBrkActv_D_RqGsmGear 3 "NotUsed" 2 "RequestParkBrakeEngage" 1 "NoRequest" 0 "Null"; +VAL_TABLE_ TrnPrkSys_D_Actl 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "FrequencyError" 8 "OutOfRangeHigh" 7 "OutOfRangeLow" 6 "Override" 5 "OutOfPark" 4 "TransitionCloseToOutOfPark" 3 "AtNoSpring" 2 "TransitionCloseToPark" 1 "Park" 0 "NotKnown"; +VAL_TABLE_ OKLowUnknownInvalid 3 "Invalid" 2 "Unknown" 1 "Low" 0 "OK"; +VAL_TABLE_ Dsp_RotAddrBtnEv_St 15 "NotUsed_1" 14 "Pos_7Steps" 13 "Pos_6Steps" 12 "Pos_5Steps" 11 "Pos_4Steps" 10 "Pos_3Steps" 9 "Pos_2Steps" 8 "Pos_1Step" 7 "NotPressed" 6 "Neg_1Steps" 5 "Neg_2Steps" 4 "Neg_3Steps" 3 "Neg_4Steps" 2 "Neg_5Steps" 1 "Neg_6Steps" 0 "Neg_7Steps"; +VAL_TABLE_ PrkAidDrvDir_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "BackwardNegative" 4 "ForwardNegative" 3 "BackwardPositive" 2 "ForwardPositive" 1 "NoMotion" 0 "DirectionNotKnown"; +VAL_TABLE_ EngExhMdeQuiet_D2_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Track" 3 "Sport" 2 "Normal" 1 "Stealth" 0 "Null"; +VAL_TABLE_ GasPrtc_D_RqDsply 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "NotUsed_1" 2 "GpfOverLimit" 1 "GpfAtLimit" 0 "NormalOperation"; +VAL_TABLE_ TjaWarn_D_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "HardTakeOverLevel2" 2 "HardTakeOverLevel1" 1 "TrafficJamAssistCancel" 0 "NoWarning"; +VAL_TABLE_ Faulty_7FF 2047 "Faulty"; +VAL_TABLE_ Tja_D_Stat 7 "NotUsed_1" 6 "ActiveWarningRight" 5 "ActiveWarningLeft" 4 "ActiveInterventionRight" 3 "ActiveInterventionLeft" 2 "Active" 1 "Standby" 0 "Off"; +VAL_TABLE_ TjaMsgTxt_D_Dsply 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "TurnOnAdaptCruiseControl" 2 "TrafficJamAssistSelected" 1 "TrafficJamAssistUnavailabl" 0 "NoMessage"; +VAL_TABLE_ PwSrcULowMde_D_Actl 3 "NotUsed_1" 2 "ReverseBoost" 1 "ForwardBuck" 0 "Standby"; +VAL_TABLE_ ApaTrgtDist_D_Stat 15 "Step15" 14 "Step14" 13 "Step13" 12 "Step12" 11 "Step11" 10 "Step10" 9 "Step9" 8 "Step8" 7 "Step7" 6 "Step6" 5 "Step5" 4 "Step4" 3 "Step3" 2 "Step2" 1 "Step1" 0 "Off"; +VAL_TABLE_ Memory_2_SwPsngr_Stat 1 "Pressed" 0 "Null"; +VAL_TABLE_ Pers3Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null"; +VAL_TABLE_ PwSrcULoMde_D_Rq 3 "NotUsed_1" 2 "ReverseBoost" 1 "ForwardBuck" 0 "Standby"; +VAL_TABLE_ AccMsgTxt_D2_Rq 15 "NotUsed_1" 14 "NCC_Enabled_Warning" 13 "IACC_TJA_Selected" 12 "ACC_TJA_Selected" 11 "IACC_Selected" 10 "Press_Brake_To_Hold" 9 "Only_Following_In_Low_Spd" 8 "TJA_Unavailable" 7 "Shift_Down" 6 "IACC_Unavailable" 5 "ACC_Selected" 4 "ACC_Overridden" 3 "Brake_Capacity_Warning" 2 "ACC_Cancelled" 1 "ACC_Unavailable" 0 "No_Text"; +VAL_TABLE_ WakeAlarm0_B_Typ 1 "CanAndEcuDriveCircuit" 0 "CanOnly"; +VAL_TABLE_ WakeAlarm0_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff"; +VAL_TABLE_ EmPrflNo_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Pers4" 3 "Pers3" 2 "Pers2" 1 "Pers1" 0 "Null"; +VAL_TABLE_ EmPrflKeyAssoc_D_Rq 7 "NotUsed_3" 6 "DisassociatePhone" 5 "EnterPhoneAssociation" 4 "OverwriteKey" 3 "DisassociateKey" 2 "ExitKeyAssociation" 1 "EnterKeyAssociation" 0 "Null"; +VAL_TABLE_ Em_D_Stat 3 "NotSupported" 2 "ProfilesOff" 1 "ProfilesOn" 0 "Null"; +VAL_TABLE_ EmPrflButtnAssoc_D_Rq 3 "NotUsed" 2 "ExitButtonAssociation" 1 "EnterButtonAssociation" 0 "Null"; +VAL_TABLE_ EmPrflNo_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Pers4" 3 "Pers3" 2 "Pers2" 1 "Pers1" 0 "Null"; +VAL_TABLE_ EmPrflKeyAssoc_D_Stat 7 "WrongDevice" 6 "KeyAssociateFailed" 5 "KeyAssociateSuccess" 4 "KeyAlreadyInUse" 3 "KeyDisassociated" 2 "KeyAssociationExited" 1 "KeyAssociationEntered" 0 "Null"; +VAL_TABLE_ EsaEnbl_D2_Rq 3 "NotConfigured" 2 "Enabled" 1 "Pending" 0 "Disabled"; +VAL_TABLE_ PersNo_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "NotDetermined" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_TABLE_ WiprFront_D_Stat2 15 "NO_DATA_EXISTS" 14 "STALLED" 13 "NotUsed" 12 "AUTO_ADJUST" 11 "COURTESYWIPE" 10 "AUTO_HIGH" 9 "AUTO_LOW" 8 "WASH" 7 "MIST_FLICK" 6 "MAN_HIGH" 5 "MAN_LOW" 4 "MAN_INT_ON" 3 "MAN_INT_OFF" 2 "OFF_MOVING" 1 "AUTO_OFF" 0 "OFF"; +VAL_TABLE_ TurnLghtSwtch_D_Stat2 3 "NotUsed" 2 "Right" 1 "Left" 0 "Off"; +VAL_TABLE_ CcButtnOnOffCnclPress3 1 "Pressed" 0 "Not pressed"; +VAL_TABLE_ SelDrvMdePos01_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_TABLE_ SelDrvMdePos01_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_TABLE_ ImmedFastMediumSlow 3 "Slow" 2 "Medium" 1 "Fast" 0 "Immediately"; +VAL_TABLE_ AdbHiBeamKeepOff_D_Rq 3 "KeepBothOff" 2 "KeepLeftOff" 1 "KeepRightOff" 0 "BothFreeRunning"; +VAL_TABLE_ AdbLampOnOff_D_Rq 3 "BothOn" 2 "LeftOnRightOff" 1 "RightOnLeftOff" 0 "BothOff"; +VAL_TABLE_ AdbMde1_D_Rq 3 "MarkerLightFlashing" 2 "MarkerLightConstant" 1 "Spot" 0 "None"; +VAL_TABLE_ Closed_Open_Active_Denied 3 "Denied" 2 "Active" 1 "Open" 0 "Closed"; +VAL_TABLE_ OffLowMedMax 3 "Maximum" 2 "Medium" 1 "Low" 0 "Off"; +VAL_TABLE_ IaccLamp_D_Rq 3 "NotUsed_2" 2 "NotUsed_1" 1 "DisplayIaccIcon" 0 "DoNotDisplayIaccIcon"; +VAL_TABLE_ Low_High_Confidence 1 "High_Confidence" 0 "Low_Confidence"; +VAL_TABLE_ Fault_Occupied_Empty_Un 3 "Unknown" 2 "Empty" 1 "Occupied" 0 "Fault"; +VAL_TABLE_ Off_On_Flash_Triggered 3 "Triggered" 2 "Flash" 1 "On" 0 "Off"; +VAL_TABLE_ IaccVLim_D_Rq 252 "NotUsed_2" 250 "LimitSpeed_250" 240 "LimitSpeed_240" 230 "LimitSpeed_230" 220 "LimitSpeed_220" 210 "LimitSpeed_210" 200 "LimitSpeed_200" 190 "LimitSpeed_190" 150 "LimitSpeed_150" 140 "LimitSpeed_140" 130 "LimitSpeed_130" 120 "LimitSpeed_120" 110 "LimitSpeed_110" 100 "LimitSpeed_100" 90 "LimitSpeed_90" 80 "LimitSpeed_80" 70 "LimitSpeed_70" 60 "LimitSpeed_60" 50 "LimitSpeed_50" 40 "LimitSpeed_40" 30 "LimitSpeed_30" 20 "LimtSpeed_20" 251 "NotUsed_1" 255 "Faulty" 254 "NoDataExists" 253 "NotUsed_3" 180 "LimitSpeed_180" 179 "LimitSpeed_179" 178 "LimitSpeed_178" 177 "LimitSpeed_177" 176 "LimitSpeed_176" 175 "LimitSpeed_175" 174 "LimitSpeed_174" 173 "LimitSpeed_173" 172 "LimitSpeed_172" 171 "LimitSpeed_171" 170 "LimitSpeed_170" 169 "LimitSpeed_169" 168 "LimitSpeed_168" 167 "LimitSpeed_167" 166 "LimitSpeed_166" 165 "LimitSpeed_165" 164 "LimitSpeed_164" 163 "LimitSpeed_163" 162 "LimitSpeed_162" 161 "LimitSpeed_161" 160 "LimitSpeed_160" 15 "LimitSpeed_15" 14 "LimitSpeed_14" 13 "LimitSpeed_13" 12 "LimitSpeed_12" 11 "LimitSpeed_11" 10 "LimitSpeed_10" 9 "LimitSpeed_9" 8 "LimitSpeed_8" 7 "LimitSpeed_7" 6 "LimitSpeed_6" 5 "LimitSpeed_5" 4 "LimitSpeed_4" 3 "LimitSpeed_3" 2 "LimitSpeed_2" 1 "LimitSpeed_1" 0 "LimitSpeed_0"; +VAL_TABLE_ IaccVLimUnit_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null"; +VAL_TABLE_ SelDrvMdeAwd_D_Rq 31 "Faulty" 30 "NotUsed_17" 29 "NotUsed_16" 28 "NotUsed_15" 27 "NotUsed_14" 26 "NotUsed_13" 25 "NotUsed_12" 24 "NotUsed_11" 23 "NotUsed_10" 22 "NotUsed_9" 21 "NotUsed_8" 20 "NotUsed_7" 19 "NotUsed_6" 18 "NotUsed_5" 17 "EvLaterChargeMode" 16 "EvNowMode" 15 "TrackMode" 14 "RoughRoadMode" 13 "NotAvailable" 12 "HighSpeedDesertMode_Baja" 11 "SportAdaptiveMode" 10 "RockCrawlMode" 9 "MudRutsMode" 8 "SandMode" 7 "EconomyMode" 6 "GrassGravelSnow" 5 "TowHaulMode" 4 "SportMode" 3 "Normal_4L" 2 "Normal_4A" 1 "Normal_2H" 0 "NormalMode"; +VAL_TABLE_ SelDrvMdeAwd_D_Stat 0 "NotAvailable" 1 "Available" 2 "TemporarilyNotAvailable" 3 "Faulty"; +VAL_TABLE_ SelDrvMdeAwd2_D_Stat 31 "Faulty" 30 "NotUsed_17" 29 "NotUsed_16" 28 "NotUsed_15" 27 "NotUsed_14" 26 "NotUsed_13" 25 "NotUsed_12" 24 "NotUsed_11" 23 "NotUsed_10" 22 "NotUsed_9" 21 "NotUsed_8" 20 "NotUsed_7" 19 "NotUsed_6" 18 "NotUsed_5" 17 "EvLaterChargeMode" 16 "EvNowMode" 15 "TrackMode" 14 "RoughRoadMode" 13 "NotAvailable" 12 "HighSpeedDesertMode_Baja" 11 "SportAdaptiveMode" 10 "RockCrawlMode" 9 "MudRutsMode" 8 "SandMode" 7 "EconomyMode" 6 "GrassGravelSnow" 5 "TowHaulMode" 4 "SportMode" 3 "Normal_4L" 2 "Normal_4A" 1 "Normal_2H" 0 "NormalMode"; +VAL_TABLE_ RearDiffLckMsg2_D_Rq 15 "NotUsed_3" 14 "NotUsed_2" 13 "NotUsed_1" 12 "ElsdReduced" 11 "LockingFeatureNotAvailable" 10 "EsldOff" 9 "ElsdRestored" 8 "ElsdOverheated" 7 "Locker_Disabled" 6 "Locker_Enabled" 5 "LockerSpeed5" 4 "LockerSpeed4" 3 "LockerSpeed3" 2 "LockerSpeed2" 1 "LockerSpeed1" 0 "NormalNoMessage "; +VAL_TABLE_ Counts_ZeroToSeven 4 "FourCounts" 3 "ThreeCounts" 2 "TwoCounts" 1 "OneCount" 0 "ZeroCounts" 7 "SevenOrMoreCounts" 6 "SixCounts" 5 "FiveCounts"; +VAL_TABLE_ HeadLghtHiPrmsn_D_Stat 3 "CancelAndSuppress" 2 "Cancel" 1 "Hold" 0 "AllowChange"; +VAL_TABLE_ SelDrvMdeSwtch 3 "Faulty" 2 "SwitchState2" 1 "SwitchState1" 0 "NotPressed"; +VAL_TABLE_ NotAvail_Temp_Faulty 3 "Faulty" 2 "TemporarilyNotAvailable" 1 "Available" 0 "NotAvailable"; +VAL_TABLE_ AwdDrvMde 7 "Faulty" 6 "NotAvailable" 5 "RockCrawl" 4 "Baja" 3 "MudAndSand" 2 "Weather" 1 "Sport" 0 "Normal"; +VAL_TABLE_ SelDrvMdePt_D_Rq 31 "Faulty" 30 "NotUsed15" 29 "NotUsed14" 28 "NotUsed13" 27 "NotUsed12" 26 "NotUsed11" 25 "NotUsed10" 24 "NotUsed9" 23 "NotUsed8" 22 "NotUsed7" 21 "NotUsed6" 20 "NotUsed5" 19 "NotUsed4" 18 "EvLaterChargerMode" 17 "EvNowMode" 16 "DragMode" 15 "HighSpeedDesertMode_Baja" 14 "SportAdaptiveMode" 13 "NotAvailable_13" 12 "NotAvailable_12" 11 "NotAvailable_11" 10 "NotAvailable_10" 9 "RockCrawlMode" 8 "MudRutsMode" 7 "SandMode" 6 "EconomyMode" 5 "GrassGravelSnow" 4 "NotAvailable_04" 3 "TowHaulMode" 2 "NotAvailable_02" 1 "SportMode" 0 "NormalMode"; +VAL_TABLE_ SelDrvMde_D_Stat 3 "NotUsed" 2 "DriveModeChangeRequest" 1 "DriveModeChangeSelection" 0 "NoDriveModeChangeRequest"; +VAL_TABLE_ NoMessage_Msg1_15 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ SelDrvMdeChassis_D_Rq 31 "Faulty" 30 "NotUsed17" 29 "NotUsed16" 28 "NotUsed15" 27 "NotUsed14" 26 "NotUsed13" 25 "NotUsed12" 24 "NotUsed11" 23 "NotUsed10" 22 "NotUsed9" 21 "NotUsed8" 20 "NotUsed7" 19 "NotUsed6" 18 "NotUsed5" 17 "NotUsed4" 16 "NotUsed3" 15 "NotUsed2" 14 "NotUsed1" 13 "TrackMode" 12 "HighSpeedDesertMode" 11 "TowHaulMode" 10 "RockCrawlMode" 9 "SandMode" 8 "MudAndRutsMode" 7 "LowMuMode" 6 "ComfortAdaptiveMode" 5 "ComfortMode" 4 "SportAdaptiveMode" 3 "SportMode" 2 "EconomyMode" 1 "NormalAdaptiveMode" 0 "NormalMode"; +VAL_TABLE_ NotAvailable_Available 1 "Available" 0 "NotAvailable"; +VAL_TABLE_ PwStep_D_Stat 3 "PositionNotKnown" 2 "StepsNotStowed" 1 "StepsStowed" 0 "Off"; +VAL_TABLE_ PwStep_D_DrvInhbt 3 "NotUsed" 2 "DriveInhibitMalfunction" 1 "DriveInhibited" 0 "DriveNotInhibited"; +VAL_TABLE_ NoMessage_Msg1_31 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ VehTrvlDir_D_Stat 7 "Faulty" 6 "NoDataExists" 5 "NotUsed2" 4 "NotUsed1" 3 "Reverse" 2 "LikelyReverse" 1 "Forward" 0 "LikelyForward"; +VAL_TABLE_ TrnRng_D_RqFap 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Backwards" 3 "Forwards" 2 "NoMotion" 1 "Immobilize" 0 "NoRequest"; +VAL_TABLE_ SelDrvMdeSusp_D_Stat 3 "Faulty" 2 "TemporarilyNotAvailable" 1 "Available" 0 "NotAvailable"; +VAL_TABLE_ OffOnNoReqFaulty 3 "Faulty" 2 "NoRequest" 1 "On" 0 "Off"; +VAL_TABLE_ LatCtl_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "InterventionRight" 2 "InterventionLeft" 1 "ContinuousPathFollowing" 0 "NoLateralControl"; +VAL_TABLE_ LatCtlSte_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Denied" 3 "RampOut" 2 "ContLatControlInProgress" 1 "Available" 0 "Unavailable"; +VAL_TABLE_ SlowMedFastImmed 3 "Immediately" 2 "Fast" 1 "Medium" 0 "Slow"; +VAL_TABLE_ ComfortablePreciseNotUsed 3 "NotUsed2" 2 "NotUsed1" 1 "Precise" 0 "Comfortable"; +VAL_TABLE_ LatCtlLim_D_Stat 3 "LimitWithDriverActive" 2 "LimitReached" 1 "LimitClose" 0 "LimitNotReached"; +VAL_TABLE_ FuelLvlWarn_D_ActlEng 7 "DteLevel5Lowest" 6 "DteLevel4" 5 "DteLevel3" 4 "DteLevel2NonMyKey" 3 "DteLevel1MyKey" 2 "VeryLow" 1 "Low" 0 "OK"; +VAL_TABLE_ AwdMde_D_RqDrv 7 "Faulty" 6 "NotUsed2" 5 "NoRequest" 4 "Neutral" 3 "FourByFourLow" 2 "FourByFourHigh" 1 "FourByFourAuto" 0 "FourByTwo"; +VAL_TABLE_ ApaBrk_D_Stat 3 "Denied" 2 "Active" 1 "Open" 0 "Closed"; +VAL_TABLE_ AdptDrvMdePt_D_Rq 7 "Faulty" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Powertrain2Sport" 2 "Powertrain2Normal" 1 "Powertrain2Comfort" 0 "AdaptiveNotActive"; +VAL_TABLE_ AdptDrvMdeChassis_D_Rq 7 "Faulty" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Chassis2Sport" 2 "Chassis2Normal" 1 "Chassis2Comfort" 0 "AdaptiveNotActive"; +VAL_TABLE_ PwStepMsgTxt_D_Rq 1 "DriveInhibited" 0 "NoMessage" 3 "NotUsed" 2 "Malfunction"; +VAL_TABLE_ OffLowMedHigh 3 "High" 2 "Medium" 1 "Low" 0 "Off"; +VAL_TABLE_ NotDeterminedLowMedHigh 3 "High" 2 "Medium" 1 "Low" 0 "NotDetermined"; +VAL_TABLE_ CmbbObjClass_D_Stat 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "Unclassified_Vehicle" 5 "Bicycle" 4 "Pedestrian" 3 "Truck" 2 "Motorcycle" 1 "Vehicle" 0 "Undetermined"; +VAL_TABLE_ HeadLghtHiCtrl_D_RqAhb 7 "NotUsed2" 6 "NotUsed1" 5 "Auto_HiBeam" 4 "Auto_LoBeam" 3 "Flash" 2 "Man_HiBeam" 1 "Man_LoBeam" 0 "Null"; +VAL_TABLE_ AhbHiBeam_D_Rq 3 "NotUsed" 2 "HighBeamRecommended" 1 "LowBeamRecommended" 0 "DeactivatedUnavailable"; +VAL_TABLE_ AhbStatGfhbFdbk_D_Actl 3 "GfhbHighBeamFullyOn" 2 "GfhbHighBeamPartlyOn" 1 "GfhbHighBeamOff" 0 "GfhbUnavailable"; +VAL_TABLE_ AhbcRampingV_D_Rq 3 "Slow" 2 "Medium" 1 "Fast" 0 "Immediately"; +VAL_TABLE_ ApaGearShif_D_RqDrv 7 "NotUSed2" 6 "NotUsed1" 5 "ShiftToP" 4 "ShiftToN" 3 "ShiftToD" 2 "ShiftToR" 1 "NoRequest" 0 "Null"; +VAL_TABLE_ ApaLongCtl_D_RqDrv 7 "NotUsed3" 6 "NotUsed2" 5 "ReleaseBrake" 4 "DriveBackward" 3 "DriveForward" 2 "Stop" 1 "NoRequest" 0 "Null"; +VAL_TABLE_ ApaActvSide2_D_Stat 3 "NoSide" 2 "Right" 1 "Left" 0 "Null"; +VAL_TABLE_ ApaScan_D_Stat 3 "ParkSlotReady" 2 "ParkSlotFound" 1 "NoParkSlot" 0 "Null"; +VAL_TABLE_ ApaSelSapp_D_Stat 3 "NotConfigured" 2 "NotSelectable" 1 "Selectable" 0 "Null"; +VAL_TABLE_ ApaSys_D_Stat 7 "Faulty" 6 "Finished" 5 "NotAccessible" 4 "ApaCancelled" 3 "Overspeed" 2 "On" 1 "Off" 0 "Null"; +VAL_TABLE_ ApaSteScanMde_D_Stat 3 "Steering" 2 "Scanning" 1 "NotScanning" 0 "Null"; +VAL_TABLE_ ApaAcsy_D_RqDrv 7 "CloseDoor" 6 "SelectSideRight" 5 "SelectSideLeft" 4 "CheckForObject" 3 "PressApaButton" 2 "SelectSide" 1 "NoRequest" 0 "Null"; +VAL_TABLE_ ApaSteWhl_D_RqDrv 3 "TakeControl" 2 "RemoveHands" 1 "NoRequest" 0 "Null"; +VAL_TABLE_ WiprFrontSwtch_D_Stat 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "PositionNotDetermined" 8 "High" 7 "Low" 6 "Position6" 5 "Position5" 4 "Position4" 3 "Position3" 2 "Position2" 1 "Position1" 0 "Off"; +VAL_TABLE_ Off_On_Unknown_Invalid 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off"; +VAL_TABLE_ Unknown_7FFE_Invalid_7FFF 32767 "Invalid" 32766 "Unknown"; +VAL_TABLE_ OffOnNotUsedFaulty 3 "Faulty" 2 "NotUsed" 1 "On" 0 "Off"; +VAL_TABLE_ BrkBstrVac_D_Stat 3 "NotUsed" 2 "BoosterVacEstimator" 1 "BoosterVacSensor" 0 "NoBoosterVacuumMonitor"; +VAL_TABLE_ AwdMde_D_RqArb 7 "Faulty" 6 "NotUsed2" 5 "NoRequest" 4 "Neutral" 3 "FourByFourLow" 2 "FourByFourHigh" 1 "FourByFourAuto" 0 "FourByTwo"; +VAL_TABLE_ CtaAlrt2_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "AlertZone4" 3 "AlertZone3" 2 "AlertZone2" 1 "AlertZone1" 0 "Off"; +VAL_TABLE_ BttRightLeft_D_Stat 7 "NotUsed" 6 "Disabled" 5 "Off" 4 "OffTemp" 3 "NotConnected" 2 "Pending" 1 "Connected" 0 "NotDetermined"; +VAL_TABLE_ Null_NoRequest_Request 3 "NotUsed" 2 "Request" 1 "NoRequest" 0 "Null"; +VAL_TABLE_ PoliceIdlMde_D_Stat 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "PepsActive" 8 "Decommissioned" 7 "ActiveFault" 6 "ArmFault" 5 "PrearmedFault" 4 "OffFault" 3 "Active" 2 "Arm" 1 "Prearmed" 0 "Off"; +VAL_TABLE_ TripComputerMetricImperial 0 "TripComputer_metric" 1 "TripComputer_imperial"; +VAL_TABLE_ GrdAsstAllw_D_DsplyPt 3 "NotUsed" 2 "On" 1 "Off" 0 "NoModeSelected"; +VAL_TABLE_ PrkBrkMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "No_Message"; +VAL_TABLE_ AutoHoldMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ AutoHoldMde_D_Ind 3 "Indication_3" 2 "Indication_2" 1 "Indication_1" 0 "Off"; +VAL_TABLE_ AutoRgenTxt_B_RqDsply 1 "AutExhFilterCleanOFF" 0 "AutExhFilterCleanON"; +VAL_TABLE_ TrnMsgTxt2_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "TransTooHot_LoudChime" 3 "PressBrake_LoudChime" 2 "PressBrake_SoftChime" 1 "PressBrake_NoChime" 0 "NoText_NoChime"; +VAL_TABLE_ TrnGearMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage"; +VAL_TABLE_ ChargeProfIDPref_Rq 3 "NotUsed" 2 "Value" 1 "ChargeNow" 0 "Inactive"; +VAL_TABLE_ EngExhMdeQuiet_D_Stat 3 "Faulty" 2 "QuietExhaust" 1 "LoudExhaust" 0 "Null"; +VAL_TABLE_ ConsAvgTrip_No_Dsply 4095 "Faulty" 4094 "No_Data_Exists"; +VAL_TABLE_ ElTrip_L_Dsply 65535 "Fault" 65534 "No_Data_Exists"; +VAL_TABLE_ ElLongTerm_L_Dsply 16777215 "Fault" 16777214 "No_Data_Exists"; +VAL_TABLE_ GearSelLck_D_Rq 3 "PreventionBlocker" 2 "Unlock" 1 "Lock" 0 "Null"; +VAL_TABLE_ BrkPadMsgTxt_D_Rq 3 "Faulty" 2 "PadsOk" 1 "ReplacePads" 0 "Null"; +VAL_TABLE_ BrkAutoHold_D_Stat 7 "Faulty" 6 "NotUsed" 5 "Releasing" 4 "HeldSecondary" 3 "HeldSecure" 2 "Held" 1 "Inactive" 0 "Off"; +VAL_TABLE_ SuspDrvMde_D_Rq 7 "Faulty" 6 "NotUsed2" 5 "NotUsed1" 4 "Drag" 3 "Track" 2 "Snow_Wet" 1 "Sport" 0 "Normal"; +VAL_TABLE_ NotPressed_PressedNotUsed 3 "NotUsed2" 2 "NotUsed1" 1 "Pressed" 0 "Not_Pressed"; +VAL_TABLE_ WhlRearDual_D_Stat 3 "NotUsed" 2 "Dual" 1 "Single" 0 "NoDataExists"; +VAL_TABLE_ TracKeyMde_D_Stat 3 "NotUsed" 2 "NotActive" 1 "Active" 0 "ModeNotDetermined"; +VAL_TABLE_ HudMde_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Manual" 3 "Drag" 2 "RoadCourse" 1 "Tach" 0 "Off"; +VAL_TABLE_ TrnManShifGear_D_IndDrv 7 "Indicate_Reverse_Gear" 6 "Indicate_Gear6" 5 "Indicate_Gear5" 4 "Indicate_Gear4" 3 "Indicate_Gear3" 2 "Indicate_Gear2" 1 "Indicate_Gear1" 0 "No_Indication"; +VAL_TABLE_ TrnStrtStop_D_Stat 3 "NotUsed_2" 2 "NotUsed_1" 1 "LowTransmissionTemperature" 0 "NoDriverIndicationRequired"; +VAL_TABLE_ LsmcBrkDecel_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Denied" 3 "FaultDegraded" 2 "FaultExt" 1 "On" 0 "Off"; +VAL_TABLE_ StePinOffst_D_Stat 3 "FineOffset" 2 "CoarseOffset" 1 "StoredOffset" 0 "OffsetNotCalculated"; +VAL_TABLE_ NoMessage_Override_Faulty 3 "NotUsed" 2 "Faulty" 1 "Override" 0 "NoMessage"; +VAL_TABLE_ TrnIpcDsplyRng2_D_Actl 15 "No_Range_Selected" 14 "Range_14" 13 "Range_13" 12 "Range_12" 11 "Range_11" 10 "Range_10" 9 "Range_9" 8 "Range_8" 7 "Range_7" 6 "Range_6" 5 "Range_5" 4 "Range_4" 3 "Range_3" 2 "Range_2" 1 "Range_1" 0 "NotUsed"; +VAL_TABLE_ OffOn_RampUpDown 3 "Ramp_Down" 2 "Ramp_Up" 1 "On" 0 "Off"; +VAL_TABLE_ DieslMsgTxt_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "ReducedEnginePower" 0 "NoMessage"; +VAL_TABLE_ NoMessage_Msg1_7 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ TrnAltShifMde_D_Rdy 3 "Faulty" 2 "NotUsed" 1 "UnavailDueToDynCond" 0 "ModeChangeAvailable"; +VAL_TABLE_ LnchCtl 3 "NotUsed2" 2 "NotUsed1" 1 "LC_On" 0 "LC_Off"; +VAL_TABLE_ BrkLineLck_D_Rq 3 "Off" 2 "Engage" 1 "Initiate" 0 "NoRequest"; +VAL_TABLE_ BrkLineLck_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "NotAvailable" 3 "Off" 2 "Engaged" 1 "Initiated" 0 "Available"; +VAL_TABLE_ LnchCtlSys_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "On_LC_Unavailable_TC_On" 3 "On_LC_Unavailable" 2 "On_LC_Available" 1 "On_LC_Active" 0 "LC_OFF"; +VAL_TABLE_ ActvFrontSteLck_D_Stat 3 "Test_passed" 2 "Test_failed" 1 "Test_cannot_run" 0 "Test_incomplete"; +VAL_TABLE_ Rght_Lefthand_Traffic 1 "Left_Hand_Traffic" 0 "Right_Hand_Traffic"; +VAL_TABLE_ NotPressed_Pressed_Faulty 3 "Faulty" 2 "NotUsed" 1 "Pressed" 0 "Not_Pressed"; +VAL_TABLE_ TrlrTrgtAcquire_D_Rq 7 "NotUsed_2" 6 "NotUsed_1" 5 "ActivateRVCforTBA" 4 "CancelAcquisition" 3 "RetryAcquisition" 2 "AcquisitionSuccessful" 1 "StartAcquisition" 0 "Inactive"; +VAL_TABLE_ TrlrTrgtAcquire_D_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "RVCforTBA_Activated" 3 "Processing" 2 "TargetNotAcquired" 1 "TargetAcquired" 0 "Null"; +VAL_TABLE_ TrlrAidSetup_D_Rq 3 "ConfirmSetup" 2 "EndSetup" 1 "BeginSetup" 0 "Inactive"; +VAL_TABLE_ TrlBrkInitOut 3 "Heavy" 2 "Medium" 1 "Light" 0 "Null"; +VAL_TABLE_ IsaOffst_D_Stat 15 "Faulty" 14 "Null" 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero"; +VAL_TABLE_ IsaVLimUnit_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null"; +VAL_TABLE_ ApaChime_D_Rq 7 "NotUsed2" 6 "NotUsed1" 5 "Warning_Chime" 4 "Finish_Chime" 3 "Stop_Now_Chime" 2 "Spot_Ready_Chime" 1 "Spot_Found_Chime" 0 "No_Chime"; +VAL_TABLE_ SlMde_D_RqDsply 3 "NotUsed" 2 "ManualSpeed_LimiterSymbol" 1 "AutoSpeed_LimiterSymbol" 0 "NoSpeed_LimiterSymbol"; +VAL_TABLE_ SlMde_D_Rq 3 "IsaNotConfigured" 2 "Manual_Mode" 1 "Auto_Mode" 0 "Null"; +VAL_TABLE_ NotSupported_Supported 1 "Supported" 0 "NotSupported"; +VAL_TABLE_ OffOn_NotUsed_NoData 3 "No_Data_Present" 2 "NotUsed" 1 "On" 0 "Off"; +VAL_TABLE_ Faulty_FF 255 "Faulty"; +VAL_TABLE_ BrkDrvMde_D_Rq 7 "Faulty" 6 "RockCrawl" 5 "Baja" 4 "DragOrMudAndSand" 3 "Track" 2 "Snow_Wet" 1 "Sport" 0 "Normal"; +VAL_TABLE_ TrnIpcDsplyRng_D_Stat 3 "NotUsed" 2 "Flash" 1 "On" 0 "Blank_No_Display"; +VAL_TABLE_ NoYesNoDataFaulty 3 "Faulty" 2 "NoDataExists" 1 "Yes" 0 "No"; +VAL_TABLE_ SidePrkSnsR4_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_TABLE_ TsrVlPrmntMsgTxt_D_Rq 3 "NotUsed" 2 "ShowPermanentlyWithSupp" 1 "ShowPermanentlyWithoutSupp" 0 "DoNotShowSignPermanent"; +VAL_TABLE_ TsrVl1RstrcMsgTxt2_D_Rq 7 "NotUsed" 6 "Time" 5 "Trailer" 4 "Snow" 3 "RainWet" 2 "NoRecognizableRestrictn" 1 "NoSpeedLimitRestrictn" 0 "Null"; +VAL_TABLE_ PtDrvMde_D_Rq 15 "Faulty" 14 "NotUsed11" 13 "NotUsed10" 12 "NotUsed9" 11 "NotUsed8" 10 "NotUsed7" 9 "NotUsed6" 8 "NotUsed5" 7 "Drag" 6 "Rock" 5 "Baja" 4 "Sand" 3 "TowHaulGradeAssist" 2 "SnowWet" 1 "Sport" 0 "Normal"; +VAL_TABLE_ SteEffort_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "SpecialMode_2" 3 "SpecialMode_1" 2 "Comfort" 1 "Sport" 0 "Normal"; +VAL_TABLE_ TsrOvtkMsgTxt2_D_Rq 15 "NotUsed5" 14 "NotUsed4" 13 "NotUsed3" 12 "NotUsed2" 11 "NotUsed1" 10 "LimForTrucksCancelled" 9 "LimForTrucksWoQlfdRstrc" 8 "LimForTrucksWithoutRstrc" 7 "LimAllCancelled" 6 "LimAllWithRstrcTime" 5 "LimAllWithRstrcTrailer" 4 "LimAllWithRstrcSnow" 3 "LimAllWithRstrcRain" 2 "LimAllWithoutQlfdRstrc" 1 "LimAllWithoutRestriction" 0 "OvertakingAllowed"; +VAL_TABLE_ TrlrAnOffstDir 3 "NotUSed" 2 "Right" 1 "Left_or_Center" 0 "Null"; +VAL_TABLE_ Null_Off_On 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_TABLE_ TrlrBrkMde_D_Rq 1 "ElectricOverHydraulic" 0 "Electric"; +VAL_TABLE_ TrlrAidSetup_D_Stat 7 "Faulty" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "EnterParameters" 2 "EndSetup" 1 "BeginSetup" 0 "Null"; +VAL_TABLE_ TrlrAidMsgTxt_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ Invalid_7F 127 "Invalid"; +VAL_TABLE_ Faulty_1FFF 8191 "Faulty"; +VAL_TABLE_ VehStab_D_Stat 15 "Faulty" 14 "No_Data_Exists" 13 "NotUsed6" 12 "NotUsed5" 11 "NotUsed4" 10 "NotUsed3" 9 "NotUsed2" 8 "NotUsed1" 7 "High_SSRA_no_OS" 6 "Straight" 5 "Post_Oversteer" 4 "Post_Transition" 3 "Countersteer" 2 "Understeer" 1 "Oversteer" 0 "Linear"; +VAL_TABLE_ NoData_Faulty_1FF_1FE 511 "Faulty" 510 "NoDataExists"; +VAL_TABLE_ TrlrAidEnbl_D_Rq 3 "NotAvailable" 2 "DeactivateTba" 1 "ActivateTba" 0 "Inactive"; +VAL_TABLE_ FohEng_D_Rq 3 "AutoEnable_ParkEnable" 2 "AutoDisable_ParkEnable" 1 "AutoEnable_ParkDisable" 0 "Disable_Stop"; +VAL_TABLE_ Null_Hi_NotUsed_Low 3 "Low" 2 "Not_Used" 1 "High" 0 "Null"; +VAL_TABLE_ Current_Color 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "Null" 7 "Color7" 6 "Color6" 5 "Color5" 4 "Color4" 3 "Color3" 2 "Color2" 1 "Color1" 0 "Off"; +VAL_TABLE_ Blended_Color 15 "NotUsed10" 14 "NotUsed9" 13 "NotUsed8" 12 "NotUsed7" 11 "NotUsed6" 10 "NotUsed5" 9 "NotUsed4" 8 "NotUsed3" 7 "NotUsed2" 6 "NotUsed1" 5 "_5" 4 "_4" 3 "_3" 2 "_2" 1 "_1" 0 "Null"; +VAL_TABLE_ OffOn_Null_NotUsed 3 "NotUsed" 2 "Null" 1 "On" 0 "Off"; +VAL_TABLE_ DieslPrtc2_D_RqDsply 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "OCR_ExhFilterClean_Stopped" 10 "OCR_ExhFilterCleaned" 9 "RgnOff_AtLimit" 8 "RgnOff_Overloaded" 7 "RgnOff_Loaded" 6 "Exhaust_Filter_Full" 5 "DPF_Overlimit" 4 "DPF_AtLimit" 3 "ExhFilter_Drive_Completed" 2 "Cleaning_Exhaust_Filter" 1 "DPF_Overloaded" 0 "DPF_Normal_Operation"; +VAL_TABLE_ Null_Pers1_4_Vehicle 7 "Unused_2" 6 "Unused_1" 5 "Vehicle" 4 "PERS_4" 3 "PERS_3" 2 "PERS_2" 1 "PERS_1" 0 "Null"; +VAL_TABLE_ PrkLckCtlEnbl_D_RqIpc 3 "Rq_Towing" 2 "Rq_Enable" 1 "Rq_Disable" 0 "Null"; +VAL_TABLE_ PrkLckCtlUnlck_D_Stat 3 "Trans_And_Steer_Unlckd" 2 "Steering_Unlckd" 1 "Transmission_Unlckd" 0 "Null"; +VAL_TABLE_ VehKeyActv_D_Stat 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "Key8Active" 7 "Key7Active" 6 "Key6Active" 5 "Key5Active" 4 "Key4Active" 3 "Key3Active" 2 "Key2Active" 1 "Key1Active" 0 "NoKeyActive"; +VAL_TABLE_ VehLckInd_D_Rq 3 "NotUsed" 2 "On_Day" 1 "On_Night" 0 "Off"; +VAL_TABLE_ PrkBrkDynmc_D_Allw 3 "NotUsed" 2 "EPB_ECD_NotPossible" 1 "EPB_ECD_Possible" 0 "Used_at_Start_Up"; +VAL_TABLE_ TowBarMsgTxt_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "TowBar_Ext_No_Trlr" 3 "Error_Dealer_Fix" 2 "Start_Engine_Swivel" 1 "Check_Tow_Bar" 0 "Null"; +VAL_TABLE_ PrkBrk_D_Stat 7 "Gen_Faults_or_Maint_Mode" 6 "ECD_by_Brake_ECU_Active" 5 "EPB_Limphome_Active" 4 "Rear_Caliper_Open" 3 "RWU_by_EPB_Active" 2 "Rear_Caliper_Transition" 1 "Rear_Caliper_Closed" 0 "Not_Supported"; +VAL_TABLE_ NoData_Faulty_3E_3F 63 "Faulty" 62 "NoDataExists"; +VAL_TABLE_ Unknown_Invalid_1FE_1FF 511 "Invalid" 510 "Unknown"; +VAL_TABLE_ Invalid_0x0 0 "Invalid"; +VAL_TABLE_ Unknown_Invalid_3E_3F 63 "Invalid" 62 "Unknown"; +VAL_TABLE_ Faulty_1FF 511 "Faulty"; +VAL_TABLE_ NoData_Faulty_1FFF_1FFE 8191 "Faulty" 8190 "NoDataExists"; +VAL_TABLE_ Null_Off_On_Faulty 3 "Faulty" 2 "On" 1 "Off" 0 "Null"; +VAL_TABLE_ EngOilSrvcMsgTxt_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "ResetComplete" 3 "ResetInProgress" 2 "ChangeOilNow" 1 "ChangeOilSoon" 0 "NoText"; +VAL_TABLE_ AirSusp_D_RqDrv 3 "NotUsed" 2 "On" 1 "Off" 0 "NoModeSelected"; +VAL_TABLE_ AwdSys_D_Stat 3 "Faulty" 2 "NotUsed" 1 "_4x4_L_H_Active" 0 "_4x4_L_H_Inactive"; +VAL_TABLE_ EmotiveType_D_Dsply 3 "EmotiveDisplay_3" 2 "EmotiveDisplay_2" 1 "EmotiveDisplay_1" 0 "Null"; +VAL_TABLE_ AutoRgen_D_Rq 3 "NotUsed" 2 "AutExhFilterCleanOFF" 1 "AutExhFilterCleanON" 0 "No_Mode_Selected"; +VAL_TABLE_ TrnSrvcRqd_B_Rq 1 "On" 0 "Off"; +VAL_TABLE_ PlgOvrrdStrt_D_Cmd 3 "NotUsed" 2 "Override_Plug_Status" 1 "Dont_Override_Plug_Status" 0 "Null_State"; +VAL_TABLE_ immoSecureIdleMode 3 "NotUsed2" 2 "NotUsed1" 1 "Active" 0 "Inactive"; +VAL_TABLE_ SteWhlOffstRq_D_Stat 3 "Faulty" 2 "NoDataExists" 1 "Allow_External_Angle_Req" 0 "Deny_External_Angle_Req"; +VAL_TABLE_ SteMdule_D_Stat 7 "NotUsed" 6 "EPAS_Failure3" 5 "EPAS_Failure2" 4 "System_Failure" 3 "EPAS_Shutdown" 2 "Normal_Op_Full_Assist" 1 "Normal_Op_Limited_Assist" 0 "EPAS_Initialization"; +VAL_TABLE_ Faulty_FFF 4095 "Faulty"; +VAL_TABLE_ Faulty_3FF 1023 "Faulty"; +VAL_TABLE_ NoData_Faulty_FE_FF 255 "Faulty" 254 "NoDataExists"; +VAL_TABLE_ ChkPlgtoStrt_D_Dsply 3 "NotUsed" 2 "Is_VehicleUnplugged_Prompt" 1 "Check_Plug_to_Start" 0 "No_Message_Display"; +VAL_TABLE_ PwrFlowTxt_D_Dsply 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "Disply_Rgen_Chrg_Txt" 10 "Disp_Fast_Charge_Txt" 9 "Disp_Fast_Charge_Cmplt_Txt" 8 "Disp_Charge_Cmplt_Txt" 7 "Disp_Remote_Start_Txt" 6 "Disp_Eng_Drv_Txt" 5 "Disp_Elec_Drv_Txt" 4 "Disp_Idle_with_Chrg_Txt" 3 "Disp_Idle_Txt" 2 "Disp_Charg_HV_Batt_Txt" 1 "Disp_Hyb_Drive_Txt" 0 "No_Text"; +VAL_TABLE_ EngOnMsg_D_Dsply 14 "_0xE_to_1F_NotUsed" 12 "Battery_Temperature" 11 "Hill_Decent_Control" 10 "Fuel_Maintenance" 9 "Oil_Maintenance" 8 "Normal_Operation" 7 "Low_Gear" 6 "Batt_Charging" 5 "Engine_Cold" 4 "Neutral_Gear" 3 "Heater_Setting" 2 "High_Speed" 1 "Acceleration" 0 "No_Display" 13 "Drive_Mode_Selection"; +VAL_TABLE_ PtDataKeyId_D_Stat 15 "NotUsed5" 14 "NotUsed4" 13 "NotUsed3" 12 "NotUsed2" 11 "NotUsed1" 10 "Tot_Veh_NUT" 9 "Cust_4_NUT" 8 "Cust_3_NUT" 7 "Cust_2_NUT" 6 "Cust_1_NUT" 5 "Tot_Veh_Stat" 4 "Cust_4_Stat" 3 "Cust_3_Stat" 2 "Cust_2_Stat" 1 "Cust_1_Stat" 0 "Null"; +VAL_TABLE_ ChrgStat_D_Dsply 7 "NotUsed" 6 "Complete" 5 "Scheduled" 4 "In_Progress" 3 "Fault_Outside_Car" 2 "Fault_Inside_Car" 1 "Fault_Unknown_Location" 0 "Not_Ready"; +VAL_TABLE_ TrnLvrV_D_Rq 3 "Full_Speed" 2 "Aggressive" 1 "Normal" 0 "Quiet"; +VAL_TABLE_ EngStrtStop_B_SrcOil 1 "Eng_start_stop_for_oilmnt" 0 "Not_Requested"; +VAL_TABLE_ FuelMaintMde_D_Rq 3 "Feature_Not_Present" 2 "Fuel_Maint_Req_Now" 1 "Fuel_Maint_Req_Soon" 0 "NoRequest"; +VAL_TABLE_ FuelMaintMde_D_Dsply 3 "Feature_Not_Present" 2 "In_Fuel_Maint_Mode" 1 "Close_to_Fuel_Maint" 0 "OK"; +VAL_TABLE_ DynoMde_B_Cmd 1 "Two_Wheel_Dyno" 0 "Normal_Operation"; +VAL_TABLE_ HvacPrecondRecirc_D_Rq 3 "Last_User_Setting" 2 "Auto" 1 "Recirc" 0 "Outside"; +VAL_TABLE_ HvacPrecondAC_D_Rq 3 "Last_User_Setting" 2 "Auto" 1 "On" 0 "Off"; +VAL_TABLE_ HybMdeStat_D_Dsply 7 "NotUsed2" 6 "EV_Charge" 5 "EV_Override" 4 "Forced_EV_Mode" 3 "Forced_Charge_Sustain_Mode" 2 "Auto_Charge_Sustain_Mode" 1 "Auto_Charge_Deplete_Mode" 0 "Null_State"; +VAL_TABLE_ PwFlowPlgBatt_D_Dsply 3 "NotUsed" 2 "Flow_from_Plug_to_Batt" 1 "Flow_from_Batt_to_Plug" 0 "No_Flow"; +VAL_TABLE_ PwFlowEngMtr_D_Dsply 3 "NotUsed" 2 "Flow_from_Eng_to_Mtr" 1 "Flow_from_Mtr_to_Eng" 0 "No_Flow"; +VAL_TABLE_ PwFlowEngFuel_D_Dsply 3 "NotUsed" 2 "Flow_from_Eng_to_Fuel" 1 "Flow_from_Fuel_to_Eng" 0 "No_Flow"; +VAL_TABLE_ PwFlowMtrDrv_D_Dsply 3 "NotUsed" 2 "Flow_from_Mtr_to_Axle" 1 "Flow_from_Axle_to_Mtr" 0 "No_FLow"; +VAL_TABLE_ PwFlowEngDrv_D_Dsply 3 "NotUsed" 2 "Flow_from_Eng_to_Axle" 1 "Flow_from_Axle_to_Eng" 0 "No_Flow"; +VAL_TABLE_ PwFlowBattMtr_D_Dsply 3 "NotUsed" 2 "Flow_from_Batt_to_Mtr" 1 "Flow_from_Mtr_to_Batt" 0 "No_Flow"; +VAL_TABLE_ Null_Override_Invalid 3 "NotUsed" 2 "Invalid" 1 "Override" 0 "Null"; +VAL_TABLE_ HybMdeMsgTxt_D_Rq 7 "NotUsed2" 6 "NotUsed1" 5 "EV_Not_Avail_Message" 4 "EV_Mode_Message" 3 "Delayed_Discharge_Message" 2 "Override_Available_Message" 1 "AutoMode_Message" 0 "Null_NoMessage_Request"; +VAL_TABLE_ HybMdeLimMsgTxt_D_Rq 3 "Limited_Req_Full_Defrost" 2 "Limited_Climate_Defrost" 1 "Limited_System_Performance" 0 "Null"; +VAL_TABLE_ CenterStackRing_D_Actl 3 "LimitedOn" 2 "On" 1 "Off" 0 "Null"; +VAL_TABLE_ NoData_Faulty_FFFE_FFFF 65535 "Faulty" 65534 "NoDataExists"; +VAL_TABLE_ NoData_Faulty_FFE_FFF 4095 "Faulty" 4094 "NoDataExists"; +VAL_TABLE_ NoData_Faulty_7FFE_7FFF 32767 "Faulty" 32766 "NoDataExists"; +VAL_TABLE_ NoData_Faulty_3FE_3FF 1023 "Faulty" 1022 "NoDataExists"; +VAL_TABLE_ ReFuelSysStat_D_Dsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Refuel_Err" 3 "Close_Fuel_Door" 2 "Refuel_Ready" 1 "Wait_To_Fuel" 0 "Null"; +VAL_TABLE_ OffOn_NotUsed 3 "NotUsed2" 2 "NotUsed1" 1 "On" 0 "Off"; +VAL_TABLE_ DrQltyDrv_D_StatGsm 7 "Faulty" 6 "NoDataExists" 5 "NotUsed2" 4 "NotUsed1" 3 "ClosedDegraded" 2 "OpenDegraded" 1 "ClosedOkay" 0 "OpenOkay"; +VAL_TABLE_ ChrgrInPwType_D_Actl 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "DC_Fast_Charging" 2 "AC_Level2_240v" 1 "AC_Level1_120v" 0 "EVSE_Not_Detected"; +VAL_TABLE_ ChrgCrdLck_D_Falt 3 "NotUsed" 2 "HardwareFault" 1 "CsiFault" 0 "NoFault"; +VAL_TABLE_ ChrgStat_D2_Dsply 15 "NotUsed_2" 14 "NotUsed_1" 13 "ChargeTargetReached" 12 "DriveConditioning" 11 "CabinPreconditioning" 10 "ChargingSystemMaintain" 9 "ChargingInductive" 8 "ChargingDCFastChange" 7 "ChargingAC" 6 "ChargeScheduled" 5 "EvsePaused" 4 "EvseNotDetected" 3 "EvseNotCompatible" 2 "FaultOutsideCar" 1 "FaultInsideCar" 0 "NotReady"; +VAL_TABLE_ EngMdeMsgTxt_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Charge" 3 "GlowingCharge" 2 "Hybrid" 1 "Ev" 0 "NoMessage"; +VAL_TABLE_ BattRgenLoStat_D_Qlty 3 "OK" 2 "Not_Within_Spec" 1 "Eval_In_Progress" 0 "Faulty"; +VAL_TABLE_ OpenClosedRetainDisable 3 "Disable" 2 "Retain" 1 "Closed" 0 "Open"; +VAL_TABLE_ OpenClosedStuckOpenClosed 3 "StuckClosed" 2 "StuckOpen" 1 "Closed" 0 "Open"; +VAL_TABLE_ NoData_Faulty_7FE_7FF 2047 "Faulty" 2046 "NoDataExists"; +VAL_TABLE_ DrTgateChime2_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Long_Repeated" 3 "Fast" 2 "Short" 1 "Long" 0 "Off"; +VAL_TABLE_ EngIdlShutDwnTxt_D_Rq 3 "NotUsed" 2 "EngineShutdownOnPrevDrive" 1 "FeatureDisabledDueToFault" 0 "NoMessage"; +VAL_TABLE_ DrvPerfMde 3 "Sport" 2 "Normal" 1 "NotUsed" 0 "NoModeSelected"; +VAL_TABLE_ NoData_Fault_1FF_1FE 511 "Fault" 510 "NoDataExists"; +VAL_TABLE_ NoData_Fault_FFE_FFF 4095 "Fault" 4094 "NoDataExists"; +VAL_TABLE_ WeekdayEndHR_St 31 "Invalid" 30 "Unknown" 29 "Reserved_29" 28 "Reserved_28" 27 "Reserved_27" 26 "Reserved_26" 25 "Reserved_25" 24 "Reserved_24"; +VAL_TABLE_ WeekdayEndMin_St 63 "Faulty" 62 "No_data_exists" 61 "Reserverd" 60 "Reserverd"; +VAL_TABLE_ WeekdayStartHR_St 31 "Invalid" 30 "Unknown" 29 "Reserved_29" 28 "Reserved_28" 27 "Reserved_27" 26 "Reserved_26" 25 "Reserved_25" 24 "Reserved_24"; +VAL_TABLE_ WeekdayStartMin_St 63 "Faulty" 62 "No_data_exists" 61 "Reserverd" 60 "Reserverd"; +VAL_TABLE_ EngIdlShutDown_D_Stat 3 "Not_used" 2 "Engine_Shutdown" 1 "Initiated_Countdown" 0 "Normal_Operation"; +VAL_TABLE_ StopStrtDrvMde_D_Indic 3 "NotUsed" 2 "StartStop_IndirectDeselect" 1 "StopStart_Deselected" 0 "StopStart_Selected"; +VAL_TABLE_ StopStrtDrvMde_D_RqMnu 3 "NotUsed2" 2 "NotUsed1" 1 "StopStart_Deselected" 0 "StopStart_Selected"; +VAL_TABLE_ StopStrtStdby_D_Indic 6 "NotUsed2" 5 "Telltale_Struck_Out" 4 "Telltale_Flashing_Amber" 3 "Telltale_On_Amber" 2 "Telltale_Flashing_Green" 1 "Telltale_On_Green" 0 "Telltale_Off" 7 "NotUsed3"; +VAL_TABLE_ Quality_Faulty 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty"; +VAL_TABLE_ TrnDtpCmd_D_Actl 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "Relatch" 3 "Deploy" 2 "Self_Test" 1 "No_Command" 0 "NotUsed1"; +VAL_TABLE_ TrnGsmNtmState_D_Actl 3 "Faulty" 2 "Neutral_Tow_Mode" 1 "Car_Wash_Mode" 0 "None"; +VAL_TABLE_ TrnTrcmPwmSig_D_Actl 15 "Faulty" 14 "NoDataExists" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "Default_To_Park" 7 "Neutral_Tow" 6 "Car_Wash_Mode" 5 "Manual" 4 "Drive" 3 "Neutral" 2 "Reverse" 1 "Park" 0 "No_Gear"; +VAL_TABLE_ RgenBrkDynoMde_B_Actl 1 "TwoWheelDyno" 0 "NormalOperation"; +VAL_TABLE_ Fault_3FFF 16383 "Fault"; +VAL_TABLE_ CtaInnr_D_Stat 3 "Reporting" 2 "Not_Reporting" 1 "System_Standby" 0 "Initialization"; +VAL_TABLE_ PrkBrkActv_D_RqTrnGear 3 "NotUsed2" 2 "RequestParkBrakeEngage" 1 "NoRequest" 0 "NotUsed1"; +VAL_TABLE_ NoRequest_Request 1 "Request" 0 "NoRequest"; +VAL_TABLE_ Fault_FFF_NoData 4094 "NoDataExists" 4095 "Fault"; +VAL_TABLE_ Fault_3FF_NoData 1022 "NoDataExists" 1023 "Fault"; +VAL_TABLE_ Foh_D_Stat 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "Stopping" 3 "Running" 2 "Starting" 1 "Prestart" 0 "Off"; +VAL_TABLE_ OffOnNoDataUnused 3 "Unused" 2 "NoDataExists" 1 "On" 0 "Off"; +VAL_TABLE_ FohFalt_D_Stat 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "FuelTypeDoesNotMatchFOH" 10 "Lifecycle_ModeNotSet" 9 "AuxElectricCoolantPumpInop" 8 "TimeDelayAvoidExcessCycl" 7 "Fuel_Level_OutofRange" 6 "External_Fault" 5 "Internal_Fault" 4 "Voltage_limitation" 3 "Impact_Event" 2 "CoolantTemp_OutofRange" 1 "AmbientTemp_OutofRange" 0 "No_Disable"; +VAL_TABLE_ FohRqRun_B_Rq 1 "SubmitRequest_toRun" 0 "DoesNotSubmitRequest_toRun"; +VAL_TABLE_ OKLowVeryLow 3 "NotUsed" 2 "VeryLow" 1 "Low" 0 "OK"; +VAL_TABLE_ Fault_1FF 511 "Fault"; +VAL_TABLE_ SteWhlHeat 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Reserved_3" 8 "Reserved_2" 7 "Reserved_1" 6 "Level_3_Heating" 5 "Level_3_Heating_LS" 4 "Level_2_Heating" 3 "Level_2_Heating_LS" 2 "Level_1_Heating" 1 "Level_1_Heating_LS" 0 "Off"; +VAL_TABLE_ OffOnUnusedFault 3 "Fault" 2 "Unused" 1 "On" 0 "Off"; +VAL_TABLE_ NullKphMph 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null"; +VAL_TABLE_ TsrVLim1MsgTxt_D_Rq 255 "NoLimit" 254 "NotUsed2" 253 "NotUsed1" 252 "NotToBeDisplayed" 251 "LimitCancelled" 31 "1F_FA_Message31_250" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "Null"; +VAL_TABLE_ TsrVl1RstrcMsgTxt_D_Rq 3 "NotUsed" 2 "NoRecognizableRestriction" 1 "NoSpeedLimitRestriction" 0 "Null"; +VAL_TABLE_ TsrMsgTxt_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "RecgnzdSignNotUsblForDsply" 8 "LimitedSystemPerformance" 7 "OffRoad" 6 "RegionNotSupported" 5 "CountryNotSupported" 4 "WrngNavDatIncompDatCarrier" 3 "NoNavDataAvailable" 2 "NoNavAvailableSwitchedOff" 1 "NoInformationAllOK" 0 "Null"; +VAL_TABLE_ TsrOvtkTypeMsgTxt_D_Rq 3 "NotUsed" 2 "Explicit" 1 "Implicit" 0 "Null"; +VAL_TABLE_ TsrOvtkStatMsgTxt_D_Rq 3 "LimitOutdated" 2 "LimitReiable" 1 "LimitChanged" 0 "Null"; +VAL_TABLE_ TsrOvtkMsgTxt_D_Rq 7 "LimForTrucksCancelled" 6 "LimForTrucksWoQlfdRstrc" 5 "LimForTrucksWithoutRstrc" 4 "LimAllCancelled" 3 "LimAllWithoutQlfdRstrc" 2 "LimAllWithoutRestriction" 1 "OvertakingAllowed" 0 "Null"; +VAL_TABLE_ Null_False_True 3 "NotUsed" 2 "True" 1 "False" 0 "Null"; +VAL_TABLE_ TsrStatMsgTxt_D_Rq 7 "NotUsed" 6 "NoDataExists" 5 "TSR_Error" 4 "Available_NavigationOnly" 3 "Available_CameraOnly" 2 "Available_FusionMode" 1 "TSR_Off" 0 "Null"; +VAL_TABLE_ NoMessage_DisplayMessage 1 "DisplayMessage" 0 "NoMessage"; +VAL_TABLE_ FdsmTrgRight 1 "Object_in_Right_Lobe" 0 "No_Object"; +VAL_TABLE_ FdsmTrgCntr 1 "Object_in_Center_Lobe" 0 "No_Object"; +VAL_TABLE_ FdsmTrgLeft 1 "Object_in_Left_Lobe" 0 "No_Object"; +VAL_TABLE_ EngineBrakeOff_Active 1 "Engine_Braking_Activated" 0 "Engine_Braking_Off"; +VAL_TABLE_ NoEngineBrake_Brake 1 "Engine_Braking" 0 "No_Engine_Braking"; +VAL_TABLE_ PlgActv_D_ActlChrgr 3 "Faulty" 2 "Not used_2" 1 "On_Plug__Connected_" 0 "Off_Plug__Disconnected_"; +VAL_TABLE_ EngSrvcRqd_B_Rq 1 "Engine_Service_Required" 0 "No_engine_service_required"; +VAL_TABLE_ WeekendEndHR_St 31 "Invalid" 30 "Unknown" 29 "Reserved_29" 28 "Reserved_28" 27 "Reserved_27" 26 "Reserved_26" 25 "Reserved_25" 24 "Reserved_24"; +VAL_TABLE_ WeekendEndMin_St 63 "Faulty" 62 "No_data_exists" 61 "Reserverd" 60 "Reserverd"; +VAL_TABLE_ WeekendStartHR_St 31 "Invalid" 30 "Unknown" 29 "Reserved_29" 28 "Reserved_28" 27 "Reserved_27" 26 "Reserved_26" 25 "Reserved_25" 24 "Reserved_24"; +VAL_TABLE_ WeekendStartMin_St 63 "Faulty" 62 "No_data_exists" 61 "Reserverd" 60 "Reserverd"; +VAL_TABLE_ LscmbbBaSens_D_Rq 3 "Level3_EBA" 2 "Level2_EBA" 1 "Level1_EBA" 0 "Norman_EBA"; +VAL_TABLE_ Allowed_Denied 1 "Denied" 0 "Allowed"; +VAL_TABLE_ LscmbbBrkPrchg_D_Rq 3 "NotUsed" 2 "Level2_PreCharge" 1 "Level1_PreCharge" 0 "No_Precharge"; +VAL_TABLE_ LscmbbBrkDecel_B_Enabl 1 "ConductLSCMbBDecelReq" 0 "DoNotConductLSCMbBDecelReq"; +VAL_TABLE_ PrkAidMsgTxt_D_Rq 15 "All_Sns_Blk" 14 "R_Sns_ON_F_Sns_Blk" 13 "R_Sns_Blk_F_Sns_ON" 12 "R_Sns_Inactive_Trlr_atch" 11 "Not_Avail_Trlr_attchd" 10 "Fail_Mode_no_Chime" 9 "Fail_Mode_with_Chime" 8 "R_Sns_Trlr_F_Sns_Blk" 7 "NotUsed3" 6 "Park_Sys_Alternate_Mode" 5 "R_Snsrs_On_F_Snsrs_On" 4 "NotUsed2" 3 "Reset_Message_Warn" 2 "R_Snsrs_Off_F_Snsrs_On" 1 "R_Snsrs_On_F_Snsrs_Off" 0 "All_Park_Sensors_Off"; +VAL_TABLE_ PrkAidSns_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_TABLE_ PrkAid_D_Falt 7 "NotUsed2" 6 "NotUsed1" 5 "Failure_Front_PSM_Sensors" 4 "No_Data_Exists" 3 "Failure_Rear_Sensors" 2 "Speaker_Fault" 1 "ECU_Fault" 0 "No_Fault"; +VAL_TABLE_ OffOnNoDataFault 3 "Fault" 2 "No_Data_Exists" 1 "On" 0 "Off"; +VAL_TABLE_ ApaActvSd_D_Actl 3 "Dirver_Side" 2 "Passenger_Side" 1 "No_Side" 0 "Null"; +VAL_TABLE_ ApaMdeStat_D_RqDrv 7 "Faulty" 6 "Off" 5 "NotUsed2" 4 "NotUsed1" 3 "POA" 2 "PPA" 1 "SAPP" 0 "Inactive"; +VAL_TABLE_ ApaMde_D_Avail 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "PPA_POA" 7 "SAPP_POA" 6 "POA" 5 "PPA" 4 "SAPP" 3 "SAPP_PPA_POA" 2 "SAPP_PPA" 1 "None" 0 "Null"; +VAL_TABLE_ ApaMde_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "POA" 3 "PPA" 2 "SAPP" 1 "Off" 0 "Null"; +VAL_TABLE_ FrostWarn_D_Stat 3 "NotUsed" 2 "On_Amber" 1 "On_Red" 0 "Off"; +VAL_TABLE_ SteWhlLckMsgTxt_D_Rq 3 "NotUsed" 2 "Message_2" 1 "Message_1" 0 "No_Message"; +VAL_TABLE_ GearRvrse_D_Actl 7 "Fault" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Active_confirmed" 2 "Active_not_confirmed" 1 "Inactive_confirmed" 0 "Inactive_not_confirmed"; +VAL_TABLE_ SideDetect_SnStat_Invalid 3 "Invalid" 2 "System_Failure" 1 "Blocked" 0 "Clear"; +VAL_TABLE_ SideDetect_OpStat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off"; +VAL_TABLE_ SideDetect_Present 4 "Sensor_Blocked" 3 "Sensor_Fault" 2 "Flash_On" 1 "Alert_On" 0 "AlertOff_FlashOff_SensrClr"; +VAL_TABLE_ Off_On_Flash_BulbProveout 3 "Bulb_Proveout" 2 "Flash" 1 "On" 0 "Off"; +VAL_TABLE_ SideDetect_BLIS_Off_On 2 "BLIS_On_Second_Warning_ON" 1 "BLIS_On_Second_Warning_OFF" 0 "Off"; +VAL_TABLE_ SideDetect_report 3 "Reporting" 2 "Not_Reporting" 1 "System_Standby" 0 "Initialization"; +VAL_TABLE_ DrTGate_D_Rq 3 "NotUsed" 2 "Closing" 1 "Opening" 0 "Not_Moving"; +VAL_TABLE_ WndwSide_D_Stat 3 "BothWindow_Operating" 2 "RearWindow_Operating" 1 "FrontWindow_Operating" 0 "NoWindows_Operating"; +VAL_TABLE_ DcacElPw_D_Rq 3 "NotUsed" 2 "AC_HighPower_Requested" 1 "AC_LowPower_Requested" 0 "AC_Power_NotRequested"; +VAL_TABLE_ False_True 1 "True" 0 "False"; +VAL_TABLE_ Null_Reset 1 "Reset" 0 "Null"; +VAL_TABLE_ HvacBlwrFront_D_Stat 31 "Not_Used" 20 "Full_On" 19 "95_Percent" 18 "90_Percent" 17 "85_Percent" 16 "80_Percent" 15 "75_Percent" 14 "70_Percent" 13 "65_Percent" 12 "60_Percent" 11 "55_Percent" 10 "50_Percent" 9 "45_Percent" 8 "40_Percent" 7 "35_Percent" 6 "30_Percent" 5 "25_Percent" 4 "20_Percent" 3 "15_Percent" 2 "10_Percent" 1 "5_Percent" 0 "Off"; +VAL_TABLE_ immoMsgTxt_D_Rq 15 "Immo_Msg_15" 14 "Immo_Msg_14" 13 "Immo_Msg_13" 12 "Immo_Msg_12" 11 "Immo_Msg_11" 10 "Immo_Msg_10" 9 "Immo_Msg_9" 8 "Immo_Msg_8" 7 "Immo_Msg_7" 6 "Immo_Msg_6" 5 "Immo_Msg_5" 4 "Immo_Msg_4" 3 "Immo_Msg_3" 2 "Immo_Msg_2" 1 "Immo_Msg_1" 0 "Immo_Msg_0_Null"; +VAL_TABLE_ BattTracWarnLamp_B_Rq 1 "On" 0 "Off"; +VAL_TABLE_ BattTracSrvcRqd_B_Rq 1 "On" 0 "Off"; +VAL_TABLE_ HtrnWarnLamp_B_Dsply 1 "On" 0 "Off"; +VAL_TABLE_ HtrnSrvcRqd_B_Dsply 1 "On" 0 "Off"; +VAL_TABLE_ NoData_Faulty_7E_7F 127 "Faulty" 126 "NoDataExists"; +VAL_TABLE_ PreCondACSet_D_Actl 3 "Last_User_Setting" 2 "Auto" 1 "On" 0 "Off"; +VAL_TABLE_ PreCondFanSet_D_Actl 15 "Not_used" 14 "Not_used" 13 "Not_used" 12 "Not_used" 11 "Not_used" 10 "Not_used" 9 "Last_user_setting" 8 "Auto" 7 "Speed_7" 6 "Speed_6" 5 "Speed_5" 4 "Speed_4" 3 "Speed_3" 2 "Speed_2" 1 "Speed_1" 0 "OFF"; +VAL_TABLE_ PreCondID_No_Actl 0 "Invalid"; +VAL_TABLE_ PreCondRecrcSet_D_Actl 3 "Last_User_Setting" 2 "Auto" 1 "Recirc" 0 "Outside/Fresh"; +VAL_TABLE_ PreCondTeSet_Te_Actl 31 "HI" 1 "LO" 0 "Last_driver_setting"; +VAL_TABLE_ PreCondTPRDef_D_Actl 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_TABLE_ PreCondModeSet_D_Actl 15 "Not_used" 14 "Not_used" 13 "Not_used" 12 "Not_used" 11 "LastUserSetting" 10 "Auto" 9 "Max_Defrost" 8 "Windshield_Panel_Floor" 7 "Windshield_Panel" 6 "Windshield_(Defrost)" 5 "Windshield_Floor" 4 "Floor" 3 "Panel_Floor" 2 "Panel_(Vent)" 1 "Max_A/C" 0 "Off"; +VAL_TABLE_ ChargePortPwr_St 2 "LowPower" 1 "HighPower" 0 "Null"; +VAL_TABLE_ ChargeProfIDPref_St 3 "NotUsed" 2 "Value" 1 "ChargeNow" 0 "Null"; +VAL_TABLE_ ChrgGlobSched_D_Actl 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_TABLE_ ChrgLocEndHr_No_Actl 31 "Invalid" 30 "Unknown"; +VAL_TABLE_ ChrgLocEndMin_No_Actl 63 "Invalid" 62 "Unknown"; +VAL_TABLE_ ChrgLocProgram_D_Actl 7 "Not_used" 6 "Not_used" 5 "Not_used" 4 "Manual" 3 "TimeofUse" 2 "SmMet" 1 "ChargeImm" 0 "Null"; +VAL_TABLE_ ChrgLocSchedCat_D_Actl 11 "Reserved" 10 "Window_10" 9 "Window_9" 8 "Window_8" 7 "Window_7" 6 "Window_6" 5 "Window_5" 4 "Window_4" 3 "Window_3" 2 "Window_2" 1 "Window_1" 0 "Null"; +VAL_TABLE_ ChrgLocHsphs_D_Actl 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "SouthEast_Lat-_Long+" 3 "SouthWest_Lat-_Long-" 2 "NorthEast_Lat+_Long+" 1 "NorthWest_Lat+_Long-" 0 "NoDataExists"; +VAL_TABLE_ FuelPumpPwr_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Power_Off_Default" 3 "Power_Off_Command" 2 "Power_Off_Service" 1 "Power_Off_Impact" 0 "Power_On"; +VAL_TABLE_ ChrgrRdyStat_D_Actl 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Charging" 2 "ChargerFault" 1 "ChargerReady" 0 "NotReady"; +VAL_TABLE_ PrmtrAlrmEvnt_D_Stat 15 "Diag_Tamper" 14 "Trailer" 13 "Shock_Sensor" 12 "Post_Crash" 11 "Panic" 10 "Intrusion" 9 "Inclination" 8 "Ign_Tamper" 7 "LG_Door" 6 "Decklid" 5 "Hood" 4 "PR_Door" 3 "PF_Door" 2 "DR_Door" 1 "DF_Door" 0 "Null"; +VAL_TABLE_ SecurityMsgTxt_D_Rq 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ BattChrgRdyStat_D_Actl 7 "NotUsed2" 6 "NotUsed1" 5 "Faulted" 4 "ChargeComplete" 3 "Charging" 2 "BatteryChargeReady" 1 "ChargeWait" 0 "NotReady"; +VAL_TABLE_ BattChrgInhbt_D_Rq 3 "MaintainTargetSoc" 2 "NotUsed" 1 "InhibitChargingThermal" 0 "Enable_Charging"; +VAL_TABLE_ Fault_7FF_NoData 2047 "Fault" 2046 "NoDataExists"; +VAL_TABLE_ Deactivate_Activate 1 "Activate" 0 "Deactivate"; +VAL_TABLE_ PtcHtr_D_Stat 3 "Faulty" 2 "NotUsed" 1 "On" 0 "Off"; +VAL_TABLE_ PtcHtr_D_Cmd 3 "TurnOn" 2 "AutoMode" 1 "TurnOff" 0 "NoDecision_Initializing"; +VAL_TABLE_ Fault_FFFFFF 16777215 "Fault"; +VAL_TABLE_ NoData_Fault_FFFE_FFFF 65535 "Fault" 65534 "NoDataExists"; +VAL_TABLE_ EngOffTe_B_Dsply 1 "Eng_warm_engh_for_pd" 0 "Eng_not_warm_engh_for_pd"; +VAL_TABLE_ Fault_FFFF_NoData_FFFE 65535 "Fault" 65534 "NoDataExists"; +VAL_TABLE_ Fault_1FFF 8191 "Fault"; +VAL_TABLE_ TrlrBattChrg_D_Stat 3 "Reverse" 2 "Normal" 1 "Low" 0 "Null"; +VAL_TABLE_ TrlrLampCtl_D_Stat 3 "NotUsed" 2 "TrlrLampCnnctDrvFailure" 1 "TrlrLampNotCnnctDrvFailure" 0 "Null"; +VAL_TABLE_ ElPw_D_StatStrtStop 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Supported_Level_4" 8 "Supported_Level_3" 7 "Supported_Level_2" 6 "Supported_Level_1" 5 "Limited_Support" 4 "Fault_Limited" 3 "LV_Event_in_Progress" 2 "Not_Supported_Imminent" 1 "Supported_All" 0 "Not_Supported"; +VAL_TABLE_ ImpactEvntFdbck_D_Stat 3 "NotUsed" 2 "EventComplete" 1 "EventInProgress" 0 "Normal"; +VAL_TABLE_ StopStrtIODTxt_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_TABLE_ NoData_Fault_7FFE_7FFF 32767 "Fault" 32766 "NoDataExists"; +VAL_TABLE_ NoData_Fault_3E_3F 63 "Fault" 62 "NoDataExists"; +VAL_TABLE_ DrvSte_D_Stat 15 "NotUsed10" 14 "NotUsed9" 13 "NotUsed8" 12 "NotUsed7" 11 "NotUsed6" 10 "NotUsed5" 9 "NotUsed4" 8 "NotUsed3" 7 "NotUsed2" 6 "NotUsed1" 5 "Request_Active" 4 "Ignition_Off" 3 "DSR_in_Normal_Idle_Mode" 2 "EPAS_Comm_Disturbed" 1 "DSR_Request_Not_Applicable" 0 "DSR_Deactivated"; +VAL_TABLE_ StrtrMtrCtlMsgTxt_D_Rq 7 "Start_In_Gear_Allowed" 6 "Pending_Start_Cancelled" 5 "Start_Pending_Please_Wait" 4 "Cranking_Limit_Exceeded" 3 "Press_Brk_and_Shift_to_P_N" 2 "Press_Clutch_and_Brake" 1 "Press_Clutch_To_Start" 0 "No_Display"; +VAL_TABLE_ Null_Open 1 "Open" 0 "Null"; +VAL_TABLE_ Invalid_OffOn 0 "Invalid" 1 "Off" 2 "On"; +VAL_TABLE_ TempDegreesC_DegreesF 0 "Temperature_deg_c" 1 "Temperature_deg_f"; +VAL_TABLE_ BeltminderAudioMute 2 "On" 1 "Off" 0 "Invalid"; +VAL_TABLE_ Chime_Source 2 "Cluster" 1 "Infotainment_Sys" 0 "Invalid"; +VAL_TABLE_ Invalid_DayNight 2 "Night" 1 "Day" 0 "Invalid"; +VAL_TABLE_ Invalid_12h_24h 2 "24h_mode" 1 "12h_mode" 0 "Invalid"; +VAL_TABLE_ Invalid_Theme1_2 2 "Theme_2" 1 "Theme_1" 0 "Invalid"; +VAL_TABLE_ LanguageSelect_St 30 "Slovak" 29 "Arabic" 28 "Cantonese" 27 "Mandarin_Chinese" 26 "Korean" 25 "Japanese_Kanji" 24 "Japanese_Katakana" 23 "Braz_Portuguese" 22 "EU_Portuguese" 21 "Finish" 20 "Norwegian" 19 "Danish" 18 "Swedish" 17 "Hungarian" 16 "Greek" 15 "Czech" 14 "Polish" 13 "Flemish" 12 "Dutch" 11 "Russian" 10 "Turkish" 9 "Mex_Spanish" 8 "EU_Spanish" 7 "Cana_French" 6 "EU_French" 5 "Italian" 4 "German" 3 "NA_English" 2 "UK_English" 1 "Unknown" 0 "Invalid"; +VAL_TABLE_ Blower_Indicate 15 "Display_Blank" 14 "14_Indicators_On" 13 "13_Indicators_On" 12 "12_Indicators_On" 11 "11_Indicators_On" 10 "10_Indicators_On" 9 "9_Indicators_On" 8 "8_Indicators_On" 7 "7_Indicators_On" 6 "6_Indicators_On" 5 "5_Indicators_On" 4 "4_Indicators_On" 3 "3_Indicators_On" 2 "2_Indicators_On" 1 "1_Indicator_On" 0 "Indicators_Off"; +VAL_TABLE_ CC_Fr_Stat_User_Adj 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "Fr_Blwr_Spd_Selection" 2 "FRHS_SetPt_Selection" 1 "FLHS_SetPt_Selection" 0 "None"; +VAL_TABLE_ HeadLghtHiFdbck_D_Stat 3 "NotUsed" 2 "Cancel" 1 "Hold" 0 "Allow_Change"; +VAL_TABLE_ Backlit_LED_Status 15 "Unused3" 14 "Unused2" 13 "Unused1" 12 "Night_12" 11 "Night_11" 10 "Night_10" 9 "Night_9" 8 "Night_8" 7 "Night_7" 6 "Night_6" 5 "Night_5" 4 "Night_4" 3 "Night_3" 2 "Night_2" 1 "Night_1" 0 "Off"; +VAL_TABLE_ Veh_Lock_Status 3 "UNLOCK_DRV" 2 "UNLOCK_ALL" 1 "LOCK_ALL" 0 "LOCK_DBL"; +VAL_TABLE_ PrkLckCtlMsgTxt_D_Rq 3 "BTSI_DI_3" 2 "BTSI_DI_2" 1 "BTSI_DI_1" 0 "Null_BTSI_DI"; +VAL_TABLE_ NoShift_Shift 1 "Shift" 0 "NoShift"; +VAL_TABLE_ CcdMsgTxt_D_RqDsply 15 "Unused8" 14 "Unused7" 13 "Unused6" 12 "Unused5" 11 "Unused4" 10 "Unused3" 9 "Unused2" 8 "StationaryMode" 7 "Mode_Change_Unavailable" 6 "CCD_Temporarily_Off" 5 "CCD_Service_Required" 4 "Faulty" 3 "Sport" 2 "Normal" 1 "Comfort" 0 "No_Mode_Selected"; +VAL_TABLE_ CrashEvnt_D_Stat 3 "Invalid" 2 "Fuel_Cutoff_Event" 1 "Deploy_Event" 0 "No_Event"; +VAL_TABLE_ ReducedGuard_D_Stat 3 "NotUsed" 2 "Alarm_On" 1 "Alarm_Off_Previously_On" 0 "Alarm_Off"; +VAL_TABLE_ HvacPrecondBlwr_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Last_User_Setting" 8 "Auto" 7 "Speed7" 6 "Speed6" 5 "Speed5" 4 "Speed4" 3 "Speed3" 2 "Speed2" 1 "Speed1" 0 "Off"; +VAL_TABLE_ HvacPrecondMode_D_Rq 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "Last_User_Settings" 10 "Auto" 9 "Max_Defrost" 8 "Windshield_Panel_Floor" 7 "Windshield_Panel" 6 "Windshield" 5 "Windshield_Floor" 4 "Floor" 3 "Panel_Floor" 2 "Panel" 1 "MAX_AC" 0 "Off"; +VAL_TABLE_ ButtonNotPressed 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_TABLE_ Null_Pressed 1 "Pressed" 0 "Null"; +VAL_TABLE_ FobComm_D_Stat 3 "NotUsed" 2 "RemEngStartOK" 1 "RemEngStartFail" 0 "Null"; +VAL_TABLE_ PudLamp_D_Rq 3 "RAMP_DOWN" 2 "RAMP_UP" 1 "ON" 0 "OFF"; +VAL_TABLE_ WndwGlbl_D_Cmd 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "GLEARN" 3 "GCLOSE" 2 "GOPEN" 1 "GSTOP" 0 "Null"; +VAL_TABLE_ LockMsg 7 "MSG7" 6 "MSG6" 5 "MSG5" 4 "MSG4" 3 "MSG3" 2 "MSG2" 1 "MSG1" 0 "NO_WARNING"; +VAL_TABLE_ ChildLockDisplay 3 "NOT_SUPPORTED" 2 "ERROR" 1 "CHILD_UNLOCK" 0 "CHILD_LOCK"; +VAL_TABLE_ Null_Lock_Unlock 3 "NotUsed" 2 "Unlock" 1 "Lock" 0 "Null"; +VAL_TABLE_ Wiper 15 "NO_DATA_EXISTS" 14 "STALLED" 13 "RESERVED" 12 "AUTO_ADJUST" 11 "COURTESYWIPE" 10 "AUTO_HIGH" 9 "AUTO_LOW" 8 "WASH" 7 "MIST_FLICK" 6 "MAN_HIGH" 5 "MAN_LOW" 4 "MAN_INT_ON" 3 "MAN_INT_OFF" 2 "OFF_MOVING" 1 "AUTO_OFF" 0 "OFF"; +VAL_TABLE_ Turn_switch 3 "Unused_Treat_As_Off" 2 "Right" 1 "Left" 0 "Off"; +VAL_TABLE_ PrkLght_D_Stat 3 "Park_Both" 2 "Park_Right" 1 "Park_Left" 0 "Off"; +VAL_TABLE_ LghtAmb_D_Sns 7 "No_Data_Exists" 6 "Unused2" 5 "Unused1" 4 "Tunnel_Off" 3 "Tunnel_On" 2 "Twilight" 1 "Light" 0 "Dark"; +VAL_TABLE_ HeadLghtSwtch_D_Stat 3 "Autolamp" 2 "Headlamp" 1 "Parklamp" 0 "Off"; +VAL_TABLE_ EmgcyBrkLamp_D_Rq 3 "NotUsed" 2 "Active_at_standstill" 1 "Active_at_speed" 0 "Inactive"; +VAL_TABLE_ GearLvrPos_D_Unfilt 7 "Invalid" 6 "NotUsed" 5 "In_between" 4 "Low" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_TABLE_ EDrvTqMntrRconfg_D_Cmd 7 "OK" 6 "Disable_Cruise" 5 "NotUsed4" 4 "Supercreep" 3 "NotUsed3" 2 "NotUsed2" 1 "Engine_shutdown" 0 "NotUsed"; +VAL_TABLE_ OpenPressedFault 3 "Fault" 2 "Unused" 1 "Pressed" 0 "Open"; +VAL_TABLE_ LaHandsOff_D_Dsply 3 "Suppressed" 2 "Level2" 1 "Level1" 0 "HandsOn"; +VAL_TABLE_ Avail_Unavail 1 "Unavailable" 0 "Available"; +VAL_TABLE_ LaActvStats_D_Dsply 31 "Unused7" 30 "LA_Off" 29 "Unused5" 28 "Unused4" 27 "Unused3" 26 "Unused2" 25 "Unused1" 24 "InerveneLeft_InterveneRght" 23 "WarnLeft_InterveneRight" 22 "SuppressLeft_InterveneRght" 21 "AvailLeft_InterveneRhtt" 20 "NoLeft_InterveneRight" 19 "InterveneLeft_WarnRight" 18 "WarnLeft_WarnRight" 17 "SuppressLeft_WarnRight" 16 "AvailableLeft_WarnRight" 15 "NoLeft_WarnRight" 14 "InterveneLeft_SuppressRght" 13 "WarnLeft_SuppressRight" 12 "SuppressLeft_SuppressRight" 11 "AvailLeft_SuppressRight" 10 "NoLeft_SuppressRight" 9 "InterveneLeft_AvailRight" 8 "WarnLeft_AvailRight" 7 "SuppressLeft_AvailRight" 6 "AvailableLeft_AvailRight" 5 "NoLeft_AvailableRight" 4 "InterveneLeft_NoRight" 3 "WarnLeft_NoRight" 2 "SuppressLeft_NoRight" 1 "AvailableLeft_NoRight" 0 "NoLeft_NoRight"; +VAL_TABLE_ AhbcHiBeam_D_Rq 3 "Deactivated_Unavailabl" 2 "Unused" 1 "Main_HighBeamRecommend" 0 "Dipped_LowBeamRecommend"; +VAL_TABLE_ GrllShtrPos_D_Cmd 15 "Fully_Open" 14 "Position14" 13 "Position13" 12 "Position12" 11 "Position11" 10 "Position10" 9 "Position9" 8 "Position8" 7 "Position7" 6 "Position6" 5 "Position5" 4 "Position4" 3 "Position3" 2 "Position2" 1 "Position1" 0 "Fully_Closed"; +VAL_TABLE_ LifeCycMde_D_Actl 3 "Transport" 2 "NotUsed" 1 "Factory" 0 "Normal"; +VAL_TABLE_ TrnMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage"; +VAL_TABLE_ DieslPrtcRgen_D_Rq 7 "Unused_2" 6 "Unused_1" 5 "Full_Regen_2" 4 "Full_Regen_1" 3 "HeatUp_3" 2 "HeatUp_2" 1 "HeatUp_1" 0 "Normal_Mode_NoRegen"; +VAL_TABLE_ ClimtHeat_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "PtcHtrTestMde" 3 "Defrost_Defog" 2 "FastTempPullDownHeatingReq" 1 "OpportunisticHeatingReq" 0 "NoHeatingRequest"; +VAL_TABLE_ TrnCapHlth_Actl 3 "Capacitor_OK" 2 "Degraded_Capacitor" 1 "Capacitor_State_Unknown" 0 "Capacitor_Fault"; +VAL_TABLE_ TrnSecPrkStat_D_Actl 7 "Faulty" 6 "Fault_Released" 5 "Fault_Latched" 4 "Recouple_in_Progress" 3 "Mechanism_Released" 2 "RTP_in_Progress" 1 "Pending" 0 "Latched"; +VAL_TABLE_ TrnGear_D_Actl 7 "Fault" 6 "NotUsed" 5 "Manual" 4 "Drive" 3 "Neutral" 2 "Reverse" 1 "Park" 0 "Transition_State"; +VAL_TABLE_ TrnNtrlTowCmd_D_Actl 3 "NotUsed" 2 "Neutral_Tow_Entry" 1 "Car_Wash_Mode" 0 "Normal_Mode"; +VAL_TABLE_ TrnValidGear_D_Cnfm 3 "Accept" 2 "Reject" 1 "Internal_Request" 0 "No_Command"; +VAL_TABLE_ TrnGear_D_RqPt 7 "Fault" 6 "NotUsed" 5 "Manual" 4 "Drive" 3 "Neutral" 2 "Reverse" 1 "Park" 0 "No_Gear"; +VAL_TABLE_ TrnValidGearRq_D_Stat 3 "Valid_Request" 2 "Valid_Degraded_Request" 1 "Invalid_Request" 0 "No_Request"; +VAL_TABLE_ NoData_Fault_3FE_3FF 1023 "Fault" 1022 "NoDataExists"; +VAL_TABLE_ ClimtCool_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "ElACTestMde" 3 "Defrost_Defog" 2 "FastTempPullDownCoolReq" 1 "OpportunisticCoolingReq" 0 "NoCoolingRequest"; +VAL_TABLE_ HtrnHvilOpen_B_Actl 1 "HVIL_is_Open" 0 "Normal_Operation"; +VAL_TABLE_ EngTeHi_B_Actl 1 "EngineTempHigh" 0 "Normal"; +VAL_TABLE_ Eng_D_StatPwPck 7 "NotUsed3" 6 "NotUsed2" 5 "Engine_Start_Cold_Cat" 4 "Engine_Disabled" 3 "Engine_Running" 2 "Engine_Run_CSER" 1 "Engine_Start" 0 "Off"; +VAL_TABLE_ EngFuelCutFull_B_Inhbt 1 "Inhibit_DFSO" 0 "Normal"; +VAL_TABLE_ EngFuelCutFull_B_Rq 1 "FuelCutRequest" 0 "NormalOperation"; +VAL_TABLE_ Fault_7FF 2047 "Fault"; +VAL_TABLE_ EngStopFst_B_Rq 1 "FastEngineShutdown" 0 "NormalOperation"; +VAL_TABLE_ EngStrtCold_B_Rq 1 "ExtremeColdStart" 0 "NormalStart"; +VAL_TABLE_ EngStrtSmooth_D_Rq 7 "NotUsed" 6 "Smooth_NoPedal" 5 "Smooth_LightPedal" 4 "Smooth_MediumPedal" 3 "Smooth_HeavyPedal" 2 "Smooth_WOP" 1 "Smooth_Cold" 0 "Smooth_ExtremeCold"; +VAL_TABLE_ Fault_FFF 4095 "Fault"; +VAL_TABLE_ VehStrtStop_D_Rq 3 "NotUsed" 2 "Vehicle_Start_Request" 1 "Vehicle_Stop_Request" 0 "NoRequest"; +VAL_TABLE_ HvacRec_D_RqMxBatt 15 "NotUsed5" 14 "NotUsed4" 13 "NotUsed3" 12 "NotUsed2" 11 "NotUsed1" 10 "No_Override" 9 "90Percent_RecircMax" 8 "80Percent_RecircMax" 7 "70Percent_RecircMax" 6 "60Percent_RecircMax" 5 "50Percent_RecircMax" 4 "40Percent_RecircMax" 3 "30Percent_RecircMax" 2 "20Percent_RecircMax" 1 "10Percent_RecircMax" 0 "0Percent_RecircFullOpen"; +VAL_TABLE_ FuelCtlOpenLp_B_Inhbt 1 " Inhibit_FullPedal_Actions" 0 "Normal_Operation"; +VAL_TABLE_ EngStrtStop_B_SrcSrvc 1 "Eng_StartStop_for_Service" 0 "Not_Requested"; +VAL_TABLE_ EngStrtStop_B_SrcCat 1 "Eng_StartStop_for_Catalyst" 0 "Not_Requested"; +VAL_TABLE_ PrkBrkStatus 7 "GeneralFault_MaintenceMode" 6 "ECD_by_Brake_ECU_Active" 5 "EPB_Limphome_Active" 4 "Rear_Caliper_Open" 3 "RWU_By_EPB_Active" 2 "Rear_Caliper_Transition" 1 "Rear_Caliper_Closed" 0 "Not_Supported"; +VAL_TABLE_ ElLoadCtl_D_Rq 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "HoldAllDrvrInvisibleLoads" 3 "StdDriverInvisibleLoadsOn" 2 "AllDriverInvisibleLoadsOn" 1 "All_Possible_Loads_Off" 0 "No_Request"; +VAL_TABLE_ BattTracCool 3 "NotUsed" 2 "DCDC_Overtemperature" 1 "CoolingRequiredbyDCDC" 0 "NoCoolingRequiredbyDCDC"; +VAL_TABLE_ NotReady_Active_Fault 3 "Fault" 2 "Active" 1 "Ready" 0 "Not_Ready"; +VAL_TABLE_ Quality_Data 3 "OK" 2 "Not_Within_Specifications" 1 "Eval_In_Progress" 0 "Fault"; +VAL_TABLE_ PwSrcULoFalt_D_Stat 3 "Fault_No_Output" 2 "Fault_Reduced_Output" 1 "Fault_NonSpecific" 0 "No_Fault"; +VAL_TABLE_ Connect_Discon_Loose 1 "Loose_or_Disconnected" 0 "Connected"; +VAL_TABLE_ DontCare_StartInhibit 1 "Start_Inhibit" 0 "Dont_Care"; +VAL_TABLE_ BattULoChrg_D_Rq 3 "Low_Battery_Temperature" 2 "Charging_Requested" 1 "Chrg_Requested_HighCurrent" 0 "No_Request"; +VAL_TABLE_ PwSysULoFalt_D_Stat 15 "Not_Used_6" 14 "LowBatterySOC" 13 "PSS_Shed2_Contin" 12 "Not_Used_4" 11 "Not_Used_3" 10 "Not_Used_2" 9 "BattMonitoringSensorFault" 8 "LowBattVoltDuringPwSrcOn" 7 "LowBatt2_PowerSaveMode" 6 "LowBatt1_Warning" 5 "Overvoltage" 4 "Fault_NoOutput" 3 "Fault_ReducedOutput" 2 "Fault_Nonspecific" 1 "Cluster_Proveout" 0 "No_Fault"; +VAL_TABLE_ AccStopMde_D_Rq 3 "Stop_Mode_Active" 2 "EPBApplyOrBrakeReleaseWarn" 1 "Limit_Rolling_Speed" 0 "Stop_Mode_Not_Active"; +VAL_TABLE_ EngFuelCutFull_B_Sched 1 "DFSO_Event_Scheduled" 0 "Normal"; +VAL_TABLE_ Eng_D_Stat 3 "NotUsed" 2 "EngAutoStopped" 1 "EngOn" 0 "EngOff"; +VAL_TABLE_ ElPw_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Fault_Limited" 3 "LV_Event_In_Progress" 2 "Not_Supported_Imminent" 1 "Supported" 0 "Not_Supported"; +VAL_TABLE_ PwPckTq_D_Stat 3 "PwPckOn_TqAvailable" 2 "StartInPrgrss_TqNotAvail" 1 "PwPckOn_TqNotAvailable" 0 "PwPckOff_TqNotAvailable"; +VAL_TABLE_ BattTracCool_D_Falt 3 "NotUsed" 2 "CoolSysPartialyOperational" 1 "Cooling_System_Faulted" 0 "Cooling_System_Operational"; +VAL_TABLE_ Fault_FF 255 "Fault"; +VAL_TABLE_ ElCmprOverTe_D_Stat 3 "OverTempStop" 2 "OverTempWarning" 1 "Normal" 0 "Undefined"; +VAL_TABLE_ ElCmprUHi_D_Stat 3 "Overvoltage" 2 "Undervoltage" 1 "InRange" 0 "Undetermined"; +VAL_TABLE_ ElCmpr_D_Stat 7 "Signal_Invalid" 6 "Comp_Off_ActlSpd_Abnormal" 5 "Comp_Off_TrgtSpd_OutRange" 4 "Comp_Shutdown" 3 "Comp_Stopped_Self_Protect" 2 "Comp_Degraded" 1 "Comp_On" 0 "Comp_Off"; +VAL_TABLE_ Southern_Northern 3 "Fault" 2 "Northern" 1 "Southern" 0 "Invalid"; +VAL_TABLE_ PsngrFrntDetct_D_Actl 3 "Unknown" 2 "Empty" 0 "Faulty" 1 "Occupied"; +VAL_TABLE_ Normal_Mode1_2 3 "Undefined" 2 "Mode2" 1 "Mode1" 0 "Normal_Mode"; +VAL_TABLE_ LaActvAvail 3 "LKA_LCA_LDW_Avail" 2 "LCA_LKA_Avail_LDW_Suppress" 1 "LCA_LKA_Suppress_LDW_Avail" 0 "LCA_LKA_LDW_Suppress"; +VAL_TABLE_ LA_NotDenied 1 "LA_Denied" 0 "LA_Not_Denied"; +VAL_TABLE_ HandsOn_Off 1 "Hands_Off" 0 "Hands_On"; +VAL_TABLE_ Smooth_Quick 1 "Quick" 0 "Smooth"; +VAL_TABLE_ None_Low_Med_High 3 "High" 2 "Medium" 1 "Low" 0 "None"; +VAL_TABLE_ LdwActvStats 7 "LDW_Suppress_Right_Left" 6 "Not_Used2" 5 "LDW_Suppress_Right" 4 "LDW_Warning_Right" 3 "LDW_Suppress_Left" 2 "LDW_Warning_Left" 1 "LDW_DemoVibration" 0 "LDW_Idle"; +VAL_TABLE_ Fault_3FF 1023 "Fault"; +VAL_TABLE_ EngStrtStop 15 "Unused_7" 14 "Unused_6" 13 "Unused_5" 12 "Unused_4" 11 "Unused_3" 10 "Unused_2" 9 "Unused_1" 8 "Force_Pull_Down" 7 "Force_Pull_Up" 6 "Pull_Down_Inhibit_Pull_Up" 5 "Inhibit_Change" 4 "Inhibit_Pull_Up" 3 "Pull_Down" 2 "Inhibit_Pull_Down" 1 "Pull_Up" 0 "No_Request"; +VAL_TABLE_ TrnMde_D_Rq 15 "Unused_4" 14 "Unused_3" 13 "Unused_2" 12 "Unused_1" 11 "InOutLckedHydStandby" 10 "InputOutputLocked" 9 "OutputLockedHydStandby" 8 "OutputLocked" 7 "ReducedOutTqHydStandby" 6 "Reduced_Output_Torque" 5 "TransInTqHydStandby" 4 "Transmit_Input_Torque" 3 "ActNeutralHydStandby" 2 "Active_Neutral" 1 "NeutralHydraulicStdby" 0 "Neutral"; +VAL_TABLE_ Fault_F 15 "Fault"; +VAL_TABLE_ Fault_1F 31 "Fault"; +VAL_TABLE_ TmsStatRqDsply 15 "Reserved4" 14 "Reserved3" 13 "Reserved2" 12 "Crawl_Mode_4LOW_Reqd" 11 "Economy_Mode_Select" 10 "ModeChangeNotAvailable" 9 "Terrain_Sys_Not_Avail" 8 "Terrain_System_Fault" 7 "Mode_Change_InProgress" 6 "Dynamics_Mode_Select" 5 "Rock_Crawl_Mode_Select" 4 "Sand_Mode_Select" 3 "Mud_Ruts_Mode_Select" 2 "Low_Mu_Mode_Select" 1 "Special_Modes_Off" 0 "No_Message"; +VAL_TABLE_ LockInhibit 1 "Inhibit" 0 "No_Inhibit"; +VAL_TABLE_ DieslFuelBio_B_ActlDrv 1 "Biodiesel_User" 0 "Non_Biodiesel_User"; +VAL_TABLE_ Invalid_FFF 4095 "Invalid"; +VAL_TABLE_ ParkAid_Chime 15 "Zone15_Chime" 14 "Zone14_Chime" 13 "Zone13_Chime" 12 "Zone12_Chime" 11 "Zone11_Chime" 10 "Zone10_Chime" 9 "Zone9_Chime" 8 "Zone8_Chime" 7 "Zone7_Chime" 6 "Zone6_Chime" 5 "Zone5_Chime" 4 "Zone4_Chime" 3 "Zone3_Chime" 2 "Zone2_Chime" 1 "Zone1_Chime" 0 "No_Chime"; +VAL_TABLE_ Shed_Feature_Group_ID 16 "PtcHeater" 14 "HtdMirr" 13 "HvacRearBlwr_Third" 12 "HvacRearBlwr_Second" 11 "HvacRearBlwr_First" 31 "All LSHED1 Features" 10 "Htd_Windscrn" 9 "SpltHtdBcklight_HtdMirr" 8 "HtdBcklight_HtdMirr" 7 "HtdCoolSeat_FrtDriver" 6 "HtdCoolSeat_FrtPass" 5 "HtdCoolSeat_RearPass" 4 "HtdCoolSeat_RearDriver" 3 "SmartTrlrTowBattCharge" 2 "Htd_StrWhl" 1 "Htd_Washer_Fluid" 0 "No_LSHED1_Features" 15 "Engine_Coolant_Fan"; +VAL_TABLE_ CoolantFanStepAct 31 "Unused7" 30 "Unused6" 29 "Unused5" 28 "Unused4" 27 "Unused3" 26 "Unused2" 25 "Unused1" 23 "Step23" 22 "Step22" 21 "Step21" 20 "Step20" 19 "Step19" 18 "Step18" 17 "Step17" 16 "Step16" 15 "Step15" 14 "Step14" 13 "Step13" 12 "Step12" 11 "Step11" 10 "Step10" 9 "Step9" 8 "Step8" 7 "Step7" 6 "Step6" 5 "Step5" 4 "Step4" 3 "Step3" 2 "Step2" 1 "Step1" 24 "Max_Fan_Speed_Req" 0 "Fan_Cmd_Off"; +VAL_TABLE_ Null_Cancel 1 "Cancel" 0 "Null"; +VAL_TABLE_ Veh_Lock_Requestor 31 "Unused8" 30 "Unused7" 29 "Unused6" 28 "Rgtm_Shutlock_Switch" 27 "Boundary_Alert" 26 "Transit_Vehicle_Relock" 25 "Transit_Cargo_Relock" 24 "Transit_Ajar_Lock" 23 "Diagnostics" 22 "Console_Lock" 21 "Child_Lock" 20 "Double_Lock" 19 "Passive_Pasenger" 18 "Passive_Driver" 17 "Slam_Lock_Protect" 16 "SYNC" 15 "Passport" 14 "Passive_Smart_Unlock" 13 "Autorelock" 12 "RemoteStart" 0 "Null" 1 "Autolock" 11 "Smart_Unlock" 10 "Sliding_Door" 9 "Passive" 8 "Remote" 7 "Programming" 6 "Powerslide" 5 "Keypad" 4 "Key_Cylinder" 3 "Interior" 2 "Auto_Unlock"; +VAL_TABLE_ EPAS_FAILURE 3 "SERVICE_POWER_STEERING_NOW" 2 "SERVICE_POWER_STEERING" 1 "POWER_STRG_ASSIST_FAULT" 0 "EPAS_OK_NO_MESSAGE"; +VAL_TABLE_ Perimeter_Alarm_Mode 3 "Activated" 2 "Armed" 1 "Prearmed" 0 "Disarmed"; +VAL_TABLE_ Invalid_FFFF 65535 "Invalid"; +VAL_TABLE_ FdaStat_D_Dsply 7 "Undefined_3" 6 "Undefined_2" 5 "Undefined_1" 4 "Distance_Alert_Unavailable" 3 "DistanceAlertUnavail_Low" 2 "DistanceAlertUnavailActive" 1 "Distance_Alert_Available" 0 "Distance_Alert_Off"; +VAL_TABLE_ OilPressureWarning 1 "Low_Pressure_Lamp_On" 0 "Normal_Pressure_Lamp_Off"; +VAL_TABLE_ MyKey_KeyTypeChangeReq 3 "Search_PE_BackupSlot" 2 "Clear_All_MyKeys" 1 "Request_New_MyKey" 0 "None"; +VAL_TABLE_ MyKey_Key_Count 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero" 15 "Invalid" 14 "Unlimited"; +VAL_TABLE_ GearEngag_D_Actl 7 "Undefined" 6 "Fwd_Clutch_Fully_Engaged" 5 "Neutral_Idle" 4 "Disengaged_to_Neutral_Idle" 3 "Disengaged_to_Neutral_Park" 2 "Engagement_in_Progress" 1 "InitializeFwdClutchEngagmt" 0 "Park_Neutral"; +VAL_TABLE_ Shed_Level_Req 7 "Unused_2" 6 "Loads_On" 5 "SHED_ENG_OFF" 4 "SOON_ENG_OFF" 3 "SHED2_CONTIN" 2 "SHED2_TRANS" 1 "SHED1" 0 "NO_SHED"; +VAL_TABLE_ BpedMove_D_Actl 3 "Unknown" 2 "DriverApplyingBrakePedal" 1 "NoAutonomousBrkPdlMovement" 0 "AutonomousBrkPedalMove"; +VAL_TABLE_ Eastern_Western 0 "Invalid" 1 "Eastern" 2 "Western" 3 "Fault"; +VAL_TABLE_ EATC_Temp_Digit3 2 "_5" 1 "_0" 0 "OFF"; +VAL_TABLE_ EATC_Units 2 "Fahrenheit" 1 "Celsius" 0 "Off"; +VAL_TABLE_ BattTracOffFst_D_Actl 3 "Unexpected_Contactor_Open" 2 "Restraints_Impact_Event" 1 "Interlock_Open" 0 "Normal"; +VAL_TABLE_ Invalid_1FF 511 "Invalid"; +VAL_TABLE_ ChargeMode 7 "Undefined_2" 6 "Undefined_1" 5 "Battery_Identify" 4 "Battery_Refresh" 3 "SlowRegenAllowNoDischarge" 2 "Fast_Regen_Allowed" 1 "Slow_Regen_Allowed" 0 "Conventional_Charging"; +VAL_TABLE_ Unknown_FFFE_Invalid_FFFF 65535 "Invalid" 65534 "Unknown"; +VAL_TABLE_ SAPPAngleControlStat5 1 "StrgColTorqueExceed_EAROn" 0 "ExternalSigContentOKforEAC"; +VAL_TABLE_ Closed_Open_Active_Fault 3 "Fault" 2 "Active" 1 "Open" 0 "Closed"; +VAL_TABLE_ SAPPAngleControlStat2 1 "Rel_ExtSteeringAngleReqx" 0 "NoRel_ExtSteeringAngleReqx"; +VAL_TABLE_ SAPPAngleControlStat3 1 "EARactiveNoReverseEngage" 0 "ExternalSigContentOKforEAC"; +VAL_TABLE_ RstrnImpactEvntStatus 7 "Invalid" 6 "Not_Used_4" 5 "Threshold_2_Exceeded" 4 "Not_Used_3" 3 "Threshold_1_Exceeded" 2 "Not_Used_2" 1 "Not_Used_1" 0 "Normal"; +VAL_TABLE_ EDRTriggerEvntSync 1 "Threshold_Exceeded" 0 "Normal"; +VAL_TABLE_ EngTeColdPrtct_D_Stats 3 "Engine_Warm_RdcPwr" 2 "OK_to_Drive" 1 "Engine_Warm_PlsWait" 0 "Normal_Operation"; +VAL_TABLE_ HILL_DESC_MC 7 "Fault_Detected" 6 "Cooling_Down" 5 "Abort_Apply_Brakes" 4 "Active" 3 "Disabled" 2 "Enabled" 1 "Off_Road" 0 "Normal"; +VAL_TABLE_ Closed_Ajar 1 "Ajar" 0 "Closed"; +VAL_TABLE_ CADS_Autio_Mute 7 "Unknown" 6 "Attenuation_6" 5 "Attenuation_5" 4 "Attenuation_4" 3 "Attenuation_3" 2 "Attenuation_2" 1 "Attenuation_1" 0 "No_Attenuation_of_Audio"; +VAL_TABLE_ Quality_Factor 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_TABLE_ Null_Day_Night 3 "NotUsed" 2 "Night" 1 "Day" 0 "Null"; +VAL_TABLE_ Null_Flash_High 3 "NotUsed" 2 "High" 1 "Flash_to_Pass" 0 "Null"; +VAL_TABLE_ GearPos_D_Actl 15 "Unknown" 14 "Reverse" 13 "Undefined_5" 12 "Undefined_4" 11 "Undefined_3" 10 "Tenth" 9 "Ninth" 8 "Eighth" 7 "Seventh" 6 "Sixth" 5 "Fifth" 4 "Fourth" 3 "Third" 2 "Second" 1 "First" 0 "Neutral"; +VAL_TABLE_ OffOn_SlowFast_Flash 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off"; +VAL_TABLE_ AwdStat_D_RqDsply 31 "NotUsed9" 30 "NotUsed8" 29 "NotUsed7" 28 "To_Engage_4x4_Release_Aped" 27 "To_Engage_4x4_Slow_To_3MPH" 26 "Shift_To_Neutral" 25 "Lkr_Mode_Unavail_TMS" 24 " _4x4_Mode_Unavail_TMS" 23 "Out_of_4Low_Crawl" 22 "AWD_PTU_Oil_Changed" 21 "Change_AWD_PTU_Oil" 20 "Neutral_Tow_Disabled" 19 "Neutral_Tow_Enabled" 18 "AWD_OFF" 17 "_4x4_Off_Road_Speed" 16 "_4x4_Extreme_Off_Road_Mode" 15 "_4x4_Exiting_Off_Road" 14 "_4x4_Off_Road_Mode" 10 "_4x4_Locked_Temporarily" 9 "Shift_In_Progress" 13 "Blocked_Shift_Assist" 12 "_4x4_Auto_Restored" 11 "_4x4_Disabled_Temporarily" 7 "Out_of_4Low__Neutral" 6 "Out_of_4Low__Brake" 5 "Out_of_4Low__Speed" 4 "Into_4Low__Clutch" 3 "Into_4Low__Neutral" 2 "Into_4Low__Brake" 1 "Into_4Low__Speed" 0 "Normal__No_Message" 8 "Out_of_4Low__Clutch"; +VAL_TABLE_ AngleReached 1 "RequestedAngleNotReached" 0 "RequestedAngleCanBeReached"; +VAL_TABLE_ WhlDir 3 "Failed" 2 "Unknown" 1 "Backward" 0 "Forward"; +VAL_TABLE_ VehVLimStat_D_Actl 7 "Undefined_3" 6 "Undefined_2" 5 "Undefined_1" 4 "ASL_Fault_Condition" 3 "Active_and_Limiting" 2 "Active_but_Not_Limiting" 1 "Standby" 0 "Off"; +VAL_TABLE_ Unknown_Fault_1FE_1FF 511 "Fault" 510 "Unknown"; +VAL_TABLE_ Fault_NoFault 1 "Fault" 0 "No_Fault"; +VAL_TABLE_ TrnIpcDsplyMde_D_Actl 7 "Manual_3" 6 "Manual_2" 5 "Manual_1_Low" 4 "Sport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_TABLE_ TrnIpcDsplyMde_D_Stat 3 "Reserved_Blank_No_Display" 2 "Flash" 1 "On" 0 "Blank_No_Display"; +VAL_TABLE_ TrnIpcDsplyGear_D_Actl 15 "No_Gear_Selected" 14 "_14th_Gear" 13 "_13th_Gear" 12 "_12th_Gear" 11 "_11th_Gear" 10 "_10th_Gear" 9 "_9th_Gear" 8 "_8th_Gear" 7 "_7th_Gear" 6 "_6th_Gear" 5 "_5th_Gear" 4 "_4th_Gear" 3 "_3rd_Gear" 2 "_2nd_Gear" 1 "_1st_Gear" 0 "Neutral"; +VAL_TABLE_ TerrMde_D_Actl 7 "Fail_Safe_Default" 6 "Dynamic_Mode" 5 "Rock_Crawl_Mode" 4 "Mud_Ruts_Mode" 3 "Sand_Mode" 2 "Undefined" 1 "Low_Mu_Mode" 0 "Special_Operating_Mode_Off"; +VAL_TABLE_ TerrMdeChng_D_Rdy 7 "Fault" 6 "Undefined_2" 5 "Undefined_1" 4 "ModeUnavailDrInputRqd" 3 "SpOpModes_NotSupported" 2 "ModeUnavailDynamicCond" 1 "Module_In_Initialization" 0 "Mode_Change_Available"; +VAL_TABLE_ Unknown_Fault_FFFE_FFFF 65535 "Fault" 65534 "Unknown"; +VAL_TABLE_ Invalid_FFFFFF 16777215 "Invalid"; +VAL_TABLE_ AutoParkSpdExitCond 1 "SpeedLimitExceededEAROn" 0 "ExternalSigContentOKforEAC"; +VAL_TABLE_ EngOilLvlDsply_D_Rq 15 "EngOil_LevelSys_CheckFault" 14 "Reserved_2" 13 "Reserved_1" 12 "Conditions_Unsuitable" 11 "Dipstick_Below_Minimum" 10 "Dipstick_Above_Maximum" 9 "Dipstick_Minimum" 8 "Dipstick_12_5_MinMaxRange" 7 "Dipstick_25_MinMaxRange" 6 "Dipstick_37_5_MinMaxRange" 5 "Dipstick_50_MinMaxRange" 4 "Dipstick_62_5_MinMaxRange" 3 "Dipstick_75_MinMaxRange" 2 "Dipstick_87_5_MinMaxRange" 1 "Dipstick_Maximum_Displayed" 0 "No_Message"; +VAL_TABLE_ HdcMde_D_Actl 7 "Fault" 6 "Temporarily_Unavailable" 5 "NotEnabled_WrongGearSel" 4 "NotEnabled_SpdLimitExceed" 3 "Active_Braking" 2 "Not_Active_Braking" 1 "Off" 0 "Undefined"; +VAL_TABLE_ GearLvrPos_D_Actl 15 "Fault" 14 "Unknown_Position" 13 "Undefined_Treat_as__Fault" 12 "Undefined_Treat_as_Fault" 11 "sixth" 10 "fifth" 9 "fourth" 8 "third" 7 "second" 6 "first" 5 "Low" 4 "Sport_DriveSport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_TABLE_ FcwMsgTxt_D_Rq 7 "Undefined_3" 6 "Undefined_2" 5 "Low_Visibility" 4 "Unavailable_DueTo_LowSpeed" 3 "Available" 2 "Unavailable" 1 "Off" 0 "No_Text"; +VAL_TABLE_ FcwSens_B_Actl 3 "FCW_Sensitivity_3" 2 "FCW_Sensitivity_2" 1 "FCW_Sensitivity_1" 0 "Not_Used"; +VAL_TABLE_ LastSettind_DefaultOn 1 "Default_On" 0 "Last_Setting"; +VAL_TABLE_ EngTurboMde_D_Actl 3 "Fault" 2 "One_Turbo_Active" 1 "Two_Turbos_Active" 0 "Initializing"; +VAL_TABLE_ EngPullUpPullDown 15 "Undefined_7" 14 "Undefined_6" 13 "Undefined_5" 12 "Undefined_4" 8 "Force_Pull_Down" 7 "Force_Pull_Up" 6 "PullDown_Inhibit_PullUp" 5 "Inhibit_Change" 4 "Inhibit_Pull_Up" 3 "Pull_Down" 2 "Inhibit_Pull_Down" 1 "Pull_Up" 0 "No_Request" 11 "Undefined_3" 10 "Undefined_2" 9 "Undefined_1"; +VAL_TABLE_ EngMde_D_Rq 8 "VSC_Sets_Speed_Type_3" 7 "VSC_Sets_Speed_Type_2" 6 "VSC_Sets_Torque_Type_2" 5 "Dependability_Shutdown" 4 "Dependability_Follow" 3 "Start" 2 "VSC_Sets_Torque_Type_1" 1 "VSC_Sets_Speed_Type_1" 0 "Off" 15 "Undefined_7" 14 "Undefined_6" 13 "Undefined_5" 12 "Undefined_4" 11 "Undefined_3" 10 "Undefined_2" 9 "Undefined_1"; +VAL_TABLE_ DrvHdcMsg_D_Rq 7 "Undefined" 6 "Speed_too_High" 5 "Temporarily_Unavailable" 4 "System_Fault" 3 "Select_Gear" 2 "Off" 1 "On" 0 "No_Message"; +VAL_TABLE_ CmbbBrkPrchg_B_Rq 3 "Undefined" 2 "Level_2_PreCharge_Request" 1 "Level_1_PreCharge_Request" 0 "No_PreCharge_Request"; +VAL_TABLE_ CmbbBaSens_D_Rq 3 "Level_3" 2 "Level_2" 1 "Level_1" 0 "Normal"; +VAL_TABLE_ CcStat_D_Actl 7 "Undefined_2" 6 "Undefined_1" 5 "Active" 4 "Active_Que_Assist" 3 "Standby" 2 "Standby_Denied" 1 "Denied" 0 "Off"; +VAL_TABLE_ CadsAudioMute_D_Rq 3 "Reserved" 2 "Partial_Audio_Mute" 1 "Full_Audio_Mute" 0 "No_Audio_Mute"; +VAL_TABLE_ BpedDrvAppl_D_Actl 3 "_Not_Allowed" 2 "Driver_Braking" 1 "Driver_Not_Braking" 0 "Not_Allowed"; +VAL_TABLE_ AslIconDsply_D_Rq 3 "On_Passive_Overridden" 2 "On_Active" 1 "On_Passive" 0 "Off"; +VAL_TABLE_ Unknown_Fault_3E_3F 63 "Fault" 62 "Unknown"; +VAL_TABLE_ AccWarn_D_Dsply 3 "BrakeReleaseWarn_In_StopMd" 2 "Brake_Capacity_Warning" 1 "Cancel_Warning" 0 "No_Warning"; +VAL_TABLE_ AccTrgDist2_D_Dsply 15 "DIST_ACTIVE_13_Farthest" 14 "DIST_ACTIVE_12" 13 "DIST_ACTIVE_11" 12 "DIST_ACTIVE_10" 11 "DIST_ACTIVE_9" 10 "DIST_ACTIVE_8" 9 "DIST_ACTIVE_7" 8 "DIST_ACTIVE_6" 7 "DIST_ACTIVE_5" 6 "DIST_ACTIVE_4" 5 "DIST_ACTIVE_3" 4 "DIST_ACTIVE_2" 3 "DIST_ACTIVE_1_Closest" 2 "DIST_ACTIVE_No_Target" 1 "DIST_STANDBY" 0 "DIST_OFF"; +VAL_TABLE_ AccTGap_D_Dsply 7 "Undefined_2" 6 "Undefined_1" 5 "Time_Gap_5" 4 "Time_Gap_4" 3 "Time_Gap_3" 2 "Time_Gap_2" 1 "Time_Gap_1" 0 "Not_Used"; +VAL_TABLE_ AccEngStat_D_Actl 7 "Undefined_2" 6 "Undefined_1" 5 "ACCSoonCancel_due_Low_Spd" 4 "Shift_Down_Recommendation" 3 "Shift_Up_Recommendation" 2 "ACCNotAllowedToBeActivated" 1 "ACCStandby_due_Auto_Cancel" 0 "Normal_Operation"; +VAL_TABLE_ NotPressed_Pressed 1 "Pressed" 0 "Not_Pressed"; +VAL_TABLE_ TrnGear_D_RqDrv 31 "Fault" 30 "NotUsed_25" 29 "NotUsed_24" 28 "NotUsed_23" 27 "NotUsed_22" 26 "Return_to_Park" 25 "NotUsed_20" 24 "NotUsed_19" 23 "NotUsed_18" 22 "NotUsed_17" 21 "Return_To_Park" 20 "NotUsed_15" 19 "NotUsed_14" 18 "NotUsed_13" 17 "NotUsed_12" 16 "Manual" 15 "Not_Used11" 14 "Not_Used10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "Drive" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "Neutral" 3 "NotUsed_1" 2 "Reverse" 1 "Park" 0 "No_Gear"; +VAL_TABLE_ Open_Close 1 "Close" 0 "Open"; +VAL_TABLE_ OpenCloseRetainUndef 3 "Undefined" 2 "Retain" 1 "Close" 0 "Open"; +VAL_TABLE_ DasWarn 3 "Undefined" 2 "Warning_Level_2" 1 "Warning_Level_1" 0 "No_Warning"; +VAL_TABLE_ DasAlert 5 "Alertness_Level_5" 4 "Alertness_Level_4" 3 "Alertness_Level_3" 2 "Alertness_Level_2" 1 "Alertness_Level_1" 0 "Undefined"; +VAL_TABLE_ DasStat 3 "Available" 2 "Unavailable_Other" 1 "Feedback_due_to_Speed" 0 "Off"; +VAL_TABLE_ No_Crank_Req 1 "Crank_Request" 0 "No_Crank_Request"; +VAL_TABLE_ DrvSlipCtlMde_D_Rq 3 "App_Specific_Off_Mode_3" 2 "App_Specific_Off_Mode_2" 1 "App_Specific_Off_Mode_1" 0 "Default_Mode"; +VAL_TABLE_ AwdOffRoadMode 3 "Invalid" 2 "Extreme_Off_Road" 1 "Off_Road" 0 "Normal_Mode"; +VAL_TABLE_ NotQuiet_Quiet 1 "Quiet" 0 "Not_Quiet"; +VAL_TABLE_ Normal_AdaptiveCruise 1 "Adaptive_Cruise" 0 "Normal_Cruise"; +VAL_TABLE_ Remote_Device_Feedback 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "Shutdown" 3 "Running" 2 "Starting" 1 "Acknowledge" 0 "Null"; +VAL_TABLE_ TrnManShif_D_IndDrv 7 "Undefined_3" 6 "Undefined_2" 5 "Shift_to_Neutral" 4 "Downshift_Recommendation" 3 "Upshift_Warning" 2 "Upshift_Performance" 1 "Upshift_Fuel_Economy" 0 "No_Indication"; +VAL_TABLE_ Unlock_Lock 1 "Locked" 0 "Unlock"; +VAL_TABLE_ DieslPrtc_D_RqDsply 7 "Unused_2" 6 "Unused_1" 5 "DPF_SOOT_Level3_Blocked" 4 "DPFSootLvl2_SevereOverload" 3 "DPFRegen_ExhFilterComplete" 2 "DPFRegen_CleanExhFilter" 1 "DPF_Soot_Level1_Overloaded" 0 "DPF_OK_Normal_Operation"; +VAL_TABLE_ PE_BackupSlot_Status 3 "No_Valid_FOB_In_Slot" 2 "MyKey_FOB_In_Slot" 1 "Standard_FOB_In_Slot" 0 "Null"; +VAL_TABLE_ Unknown_Fault_FFE_FFF 4095 "Fault" 4094 "Unknown"; +VAL_TABLE_ Unknown_Fault_1FFE_1FFF 8191 "Fault" 8190 "Unknown"; +VAL_TABLE_ TrnCnvtClu_D_Actl 3 "Transition_or_Micro_Slip" 2 "Lock_Up_Fixed" 1 "Lock_Up_Slip" 0 "No_Lock_Up"; +VAL_TABLE_ InhibitNoinhibit 1 "Inhibit" 0 "No_Inibit"; +VAL_TABLE_ DisableEnable 1 "Enable" 0 "Disable"; +VAL_TABLE_ Unknown_Fault_7FFE_7FFF 32767 "Fault" 32766 "Unknown"; +VAL_TABLE_ Side_Detect_Sn_State 3 "Second_Warning_Audio" 2 "System_Failure" 1 "Blocked" 0 "Clear"; +VAL_TABLE_ Litval_values 255 "Invalid" 254 "Unknown" 5 "Day" 4 "Twilight_4" 3 "Twilight_3" 2 "Twilight_2" 1 "Twilight_1" 0 "Night"; +VAL_TABLE_ Dimming_Lvl 255 "Invalid" 254 "Unknown" 18 "Day_6" 17 "Day_5" 16 "Day_4" 15 "Day_3" 14 "Day_2" 13 "Day_1" 12 "Night_12" 11 "Night_11" 10 "Night_10" 9 "Night_9" 8 "Night_8" 7 "Night_7" 6 "Night_6" 5 "Night_5" 4 "Night_4" 3 "Night_3" 2 "Night_2" 1 "Night_1" 0 "Off"; +VAL_TABLE_ EngStrtStop_B_SrcChtLo 1 "Eng_StartStop_for_CHT_Low" 0 "Not_Requested"; +VAL_TABLE_ EngStrtStop_B_SrcChtHi 1 "Eng_StartStop_for_CHT_Hi" 0 "Not_Requested"; +VAL_TABLE_ EngDiag_D_RqHtrn 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NoUsed1" 3 "Eng_Diag_Cstdn" 2 "Eng_Diag_Run" 1 "Eng_Diag_Crank" 0 "Eng_Diag_Normal"; +VAL_TABLE_ NotOperating 1 "Operating" 0 "Not_Operating"; +VAL_TABLE_ CamraStat 3 "FrtCam_TempUnavailOther" 2 "FrtCam_TempUnavailVisibile" 1 "Front_Camera_Service_Reqd" 0 "Front_Camera_OK"; +VAL_TABLE_ EngPtoMde_D_Actl 7 "Undefined" 6 "Split_Shaft_Stationary" 5 "Not_Used_2" 4 "PTO_Mobile" 3 "Not_Used_1" 2 "PTO_Stationary" 1 "BCP" 0 "Off"; +VAL_TABLE_ ManRgen_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "CustInitManExhFilterClean" 0 "No_Customer_Request"; +VAL_TABLE_ Remote_Start_Status 3 "Invalid" 2 "Unknown" 1 "Remote" 0 "Null"; +VAL_TABLE_ Lock_Subld 15 "Unused7" 14 "Unused6" 13 "Unused5" 12 "Unused4" 11 "Unused3" 10 "Unused2" 9 "Unused1" 8 "Customer_8" 7 "Customer_7" 6 "Customer_6" 5 "Customer_5" 4 "Customer_4" 3 "Customer_3" 2 "Customer_2" 1 "Customer_1" 0 "Null"; +VAL_TABLE_ Brake_Fluid 3 "Invalid" 2 "Unknown" 1 "Low" 0 "OK"; +VAL_TABLE_ Unknown_Invalid_FE_FF 255 "Invalid" 254 "Unknown"; +VAL_TABLE_ Invalid_FF 255 "Invalid"; +VAL_TABLE_ NotLow_Low 1 "Low" 0 "Not_Low"; +VAL_TABLE_ Disabled_Enabled_Status 2 "Status" 3 "NotUsed" 1 "Enabled" 0 "Disabled"; +VAL_TABLE_ Key_In_Ignition_Status 1 "In" 0 "Out"; +VAL_TABLE_ Ignition_Status 0 "Unknown" 1 "Off" 15 "Invalid" 8 "Start" 4 "Run" 2 "Accessory"; +VAL_TABLE_ Disabled_Enabled_Faulted 3 "Faulted" 2 "Unused" 1 "Enabled" 0 "Disabled"; +VAL_TABLE_ Disabled_Enabled_NoSupport 2 "Unused" 3 "Not_Supported" 1 "Enabled" 0 "Disabled"; +VAL_TABLE_ Unknown_Fault_FE_FF 255 "Fault" 254 "Unknown"; +VAL_TABLE_ Null_Unlock 1 "Unlock" 0 "Null"; +VAL_TABLE_ Null_Active 1 "Active" 0 "Null"; +VAL_TABLE_ HsaStat_D_Actl 7 "Faulty" 6 "FaultyWithDriverIndication" 5 "SlowRelease" 4 "FastRelease" 3 "ActiveBrakePedalReleased" 2 "ActiveBrakePedalPressed" 1 "FindingGradient" 0 "Inactive"; +VAL_TABLE_ Off_Auto_Manual 3 "Undefined" 2 "Manual" 1 "Automatic" 0 "Off"; +VAL_TABLE_ HsaStat_D_Dsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "NotAvailable" 3 "SlowReleaseWithChime" 2 "SlowReleaseWithoutChime" 1 "Active" 0 "Inactive"; +VAL_TABLE_ EngMsgTxt_D_Rq 3 "Undefined_2" 2 "Undefined_1" 1 "Power_Reduced_to_LowerTemp" 0 "No_Message"; +VAL_TABLE_ PassRstrnInd_Req 3 "ABOnNotIllum_OffNotIllum" 2 "AirbagOnNot_Illum_OffIllum" 1 "AirbagOn_Illum_OffNotIllum" 0 "AirbagOn_Illum_Off_Illum"; +VAL_TABLE_ RearDiffLckMsg_D_Rq 7 "Locker_Disabled" 6 "Locker_Enabled" 5 "Locker_Accel_Pedal" 4 "Speed4" 3 "Speed3" 2 "Spee2" 1 "Speed1" 0 "Normal__No_Message "; +VAL_TABLE_ GPS_Compass_dirctn 7 "NorthWest" 6 "West" 5 "SouthWest" 4 "South" 3 "SouthEast" 2 "East" 1 "NorthEast" 0 "North"; +VAL_TABLE_ GPS_Actual_Infer 1 "Inferred_Position" 0 "Actual_Postition"; +VAL_TABLE_ DrvHdcWarnInfo_D_Rq 3 "Undefined" 2 "Lamp_On_Continuously" 1 "Lamp_Flashing" 0 "Lamp_Off_Continuously"; +VAL_TABLE_ DieslPrtcRgen_D_Actl 3 "Undefined" 2 "Regen_Level_2" 1 "Regen_Level_1" 0 "No_regen"; +VAL_TABLE_ Off_On 1 "On" 0 "Off"; +VAL_TABLE_ CcMde_D_Actl 7 "TapDownWaiting" 6 "TapUpWaiting" 5 "Resuming_Low" 4 "Resuming_High" 3 "Decelerating" 2 "Accelerating" 1 "Keeping_Speed" 0 "Not_Active"; +VAL_TABLE_ InactiveActive 1 "Active" 0 "Inactive"; +VAL_TABLE_ ManRgenTxt_D_RqDsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Cleaning_Aborted_Stopped" 3 "Cleaning_Completed" 2 "Cleaning_In_Progress" 1 "Cleaning_Allowed" 0 "Cleaning_Not_Allowed"; +VAL_TABLE_ Fault_FFFF 65535 "Fault"; +VAL_TABLE_ Fault_7F 127 "Fault"; +VAL_TABLE_ EngOilLvlWarn_D_Rq 7 "Undefined_3" 6 "Undefined_2" 5 "Engine_Oil_Monitor_Fault" 3 "Engine_Oil_High" 2 "Engine_Oil_Critical_Low" 1 "Engine_Oil_Low" 0 "No_Message" 4 "Engine_Oil_Critical_High"; +VAL_TABLE_ UreaQltySys_D_RqDsply 7 "Undefined" 6 "ZZ_Overrides" 5 "EngineIdled" 4 "Engine_Idle_Upon_Refuel" 3 "SPEED_LIMITED_to_YY_mph" 2 "YY_MPH_MAX_UPON_Restart" 1 "CONTAMINATED_ExhFluid" 0 "NoQualityProblem"; +VAL_TABLE_ Unknown_Invalid_1E_1F 31 "Invalid" 30 "Unknown"; +VAL_TABLE_ Unknown_Invalid_3FFE_3FFF 16383 "Invalid" 16382 "Unknown"; +VAL_TABLE_ NoYes 1 "Yes" 0 "No"; +VAL_TABLE_ AwdRnge_D_Actl 7 "Unknown" 6 "High_Range_2wd" 5 "High_Range_Auto" 4 "High_Range_Locked" 3 "Neutral" 2 "Low_Range_2wd" 1 "Low_Range_Auto" 0 "Low_Range_Locked"; +VAL_TABLE_ AwdLck_D_Stat 9 "Undefined" 8 "Under_External_Torque_Ctrl" 7 "Torque_Limited_by_Cmd" 6 "Fully_Locked_by_Cmd" 5 "Disabled" 4 "Warning" 3 "Fault" 2 "Inactive" 1 "Completely_Opened_by_Cmd" 0 "OK"; +VAL_TABLE_ Unknown_Fault_3FE_3FF 1023 "Fault" 1022 "Unknown"; +VAL_TABLE_ LockSwStat 3 "Invalid" 2 "Unlock" 1 "Lock" 0 "Null"; +VAL_TABLE_ Null_Override 1 "Override" 0 "Null"; +VAL_TABLE_ Off_On_Flash 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_TABLE_ immoTargetStatCoding 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "DISABLED_RESET " 2 "ENABLED_NONMOTIVE_START" 1 "ENABLED_MOTIVE_START" 0 "DISABLED"; +VAL_TABLE_ BeltBuckle 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty"; +VAL_TABLE_ RILReqCoding 3 "Not_Used" 2 "Plant_Mode" 1 "On" 0 "Off"; +VAL_TABLE_ Update_Bit 1 "Fresh_data" 0 "Unchanged_data"; +VAL_TABLE_ Running_Board 3 "Unused" 2 "Manually_Deployed" 1 "All_Enabled" 0 "All_Disabled"; +VAL_TABLE_ HudFlashRate 3 "Unused" 2 "Flash_4Hz_50Prct_DutyCycle" 1 "On" 0 "Off"; +VAL_TABLE_ Turn_Seq 3 "Seq" 2 "On" 1 "Off" 0 "Null"; +VAL_TABLE_ immoTargetCmdCoding 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "TARGET1_IDBLOCK2" 2 "TARGET1_IDBLOCK1" 1 "CHALLENGE" 0 "IDLE"; +VAL_TABLE_ immoSubTargetCmdCoding 7 "Unused3" 6 "Unused2" 5 "ECHO_TARGET1_IDBLOCK2" 4 "Unused1" 3 "RQST_TARGET1_IDBLOCK2" 2 "RQST_TARGET1_IDBLOCK1" 1 "RESPONSE" 0 "IDLE"; +VAL_TABLE_ immoCtrlCmdCoding 0 "IDLE" 1 "MOTIVE_START_RQST" 2 "NONMOTIVE_START_RQST" 3 "RQST_TARGET1_IDBLOCK1" 4 "RQST_TARGET1_IDBLOCK2" 5 "Unused" 6 "ECHO_TARGET1_IDBLOCK2" 7 "SHUTDOWN"; +VAL_TABLE_ Rvc_Zoom 7 "Unknown" 6 "Invalid" 5 "Zoom_Level_V" 4 "Zoom_Level_IV" 3 "Zoom_Level_III" 2 "Zoom_Level_II" 1 "Zoom_Level_I" 0 "Off"; +VAL_TABLE_ NotPark 1 "Park" 0 "Not_Park"; +VAL_TABLE_ Electric_EOH 1 "Electric_Over_Hydraulic" 0 "Electric"; +VAL_TABLE_ PersOptIn 1 "OPTED_IN" 0 "NOT_OPTED_IN"; +VAL_TABLE_ PersonalSetUp 3 "Non_Moveable_Person" 2 "Moveable_Person" 1 "Vehicle" 0 "Factory"; +VAL_TABLE_ Full_Limited 1 "Limited" 0 "Full"; +VAL_TABLE_ NoConflict_Conflict 1 "Conflict" 0 "No_Conflict"; +VAL_TABLE_ Assoc_Confirm 0 "None" 7 "Associate" 6 "Keycode_Rejected" 5 "Keycode_Accepted" 4 "In_Progress" 3 "Erase" 2 "Duplicate" 1 "Disassociate"; +VAL_TABLE_ Pers1_4 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_TABLE_ Null_Query 7 "Unused_2" 6 "Unused_1" 5 "Copy" 4 "Restore" 3 "Upload" 2 "Set" 1 "Query" 0 "Null"; +VAL_TABLE_ EngExhBrkMde_D_Actl 6 "ExhBrkDisable_NoError" 5 "ExhBrkActive_AUTO" 4 "ExhBrkActive_ON" 3 "ExhBrkRequest_AUTO" 2 "ExhBrkRequest_ON" 1 "ExhBrkNoRequest_OFF" 0 "ExhBrkUnavailable_Error"; +VAL_TABLE_ UreaLvlTxt_D_RqDsply 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "System_Error" 10 "Engine_Idled_See_Manual" 9 "Engine_Idled_Upon_Refuel" 8 "Speed_Limited_To_XX_mph" 7 "XXmph_Max_Upon_Restart" 6 "Speed_Limited_To_YY_mph" 5 "YYmph_Max_Upon_Restart" 4 "SpdLimtd_YYmph_In_XXmiles" 3 "ExFlRange_XXMiles_ScndWarn" 2 "Exh_Fluid_Range_XX_Miles" 1 "Exh_Fluid_Under_Half_Full" 0 "Exh_Fluid_Over_Half_Full"; +VAL_TABLE_ RearDiffFalt_D_Stat 3 "Diff_Failed_Closed" 2 "Diff_Failed_Open" 1 "Fault_Non_Specific" 0 "No_Fault"; +VAL_TABLE_ CCOverridden 1 "Cruise_Overridden" 0 "Cruise_Req_Not_Overridden"; +VAL_TABLE_ Ign_Key_Device_Type 15 "Invalid" 14 "Unknown" 3 "Key_Not_Prgrm_Read_Failure" 2 "Key_In_Ign_My_Key" 1 "Key_In_Ign_Standard_Key" 0 "Key_Read_In_Progress"; +VAL_TABLE_ Off_No_Eff_Unknown_Invalid 3 "Invalid" 2 "Unknown" 1 "No_Effect" 0 "Off"; +VAL_TABLE_ Null_Out 1 "Out" 0 "Null"; +VAL_TABLE_ FUEL_SENSORS 1 "Dual_Sensors" 0 "Single_Sensor"; + + +BO_ 823 DTE_HPCMtoECG: 8 Vector__XXX + SG_ DteVehPwId_No_Actl : 47|5@0+ (1,0) [0|31] "unitless" GWM + SG_ DteVehEId_No_Actl : 39|8@0+ (1,0) [0|255] "unitless" GWM + SG_ DteVehEffId_No_Actl : 6|7@0+ (1,0) [0|127] "unitless" GWM + SG_ DteVeh_Pw_Actl : 31|8@0+ (50,0) [0|12750] "watts" GWM + SG_ DteVeh_Eff_Actl : 23|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" GWM + SG_ DteVeh_E_Actl : 15|8@0+ (100,0) [0|25500] "watt*hour" GWM + SG_ DteAcceptNew_B_Rq : 7|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 824 DTE_ECGtoHPCM: 8 GWM + SG_ DteCldTrlrOn_B_Stat : 51|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DteCldTrlrOff_B_Stat : 52|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DteCldTrip_L_Actl : 47|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX + SG_ DteCldTraffic_B_Stat : 53|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DteCldTerrain_B_Stat : 54|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DteCldRoute_B_Stat : 55|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DteCldPayload_B_Stat : 16|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DteCldId_No_Actl : 21|5@0+ (1,0) [0|31] "unitless" Vector__XXX + SG_ DteCldExtTe_B_Stat : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DteCldExt_Eff_Actl : 39|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX + SG_ DteCldDrv_Eff_Actl : 31|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX + SG_ DteCldDcac_B_Stat : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DteCldClimt_Eff_Actl : 15|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX + SG_ DteCldBattULo_Eff_Actl : 7|8@0+ (10,-1000) [-1000|1550] "watt*hour/km" Vector__XXX + +BO_ 949 Tire_Pressure_Data_FD1: 8 GWM + SG_ Tire_Press_RR_ORR_Data : 39|16@0+ (1,0) [0|65533] "kilopascal" VDM + SG_ Tire_Press_LR_OLR_Data : 55|16@0+ (1,0) [0|65533] "kilopascal" VDM + SG_ Tire_Press_LF_Data : 7|16@0+ (1,0) [0|65533] "kilopascal" VDM + SG_ Tire_Press_RF_Data : 23|16@0+ (1,0) [0|65533] "kilopascal" VDM + +BO_ 1825 TesterPhysicalReqVDM_FD1: 64 GWM + SG_ TesterPhysicalReqVDM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" VDM + +BO_ 524 AWD_Torque_Data: 8 TCCM + SG_ PrplWhlTotTqRqMxAwd_No_Cs : 23|8@0+ (1,0) [0|255] "Unitless" ECM_Diesel + SG_ PrplWhlTot_Tq_RqMxAwd : 7|16@0+ (4,-131072) [-131072|131068] "Nm" ECM_Diesel + SG_ PrplWhlTotTqRqMxAwd_No_Cnt : 31|4@0+ (1,0) [0|15] "Unitless" ECM_Diesel + +BO_ 740 PHEV_Battery_Data1_FD1: 8 GWM + SG_ BattAuxCnnct_B_Cmd : 53|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + +BO_ 1160 ECG_Data2_FD1: 8 GWM + SG_ DgtlCommPncReset_B_Req : 62|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DataMntrSustn_B_Rq : 63|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PwSustnRdata_B_RqTelem : 60|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 776 SmartChargingData_ECG_3: 8 GWM + SG_ ScMnSoc_Pc_RqCld : 55|7@0+ (1,0) [0|127] "percent" Vector__XXX + SG_ ScChrgrPwMax_Pw_RqCld : 39|12@0+ (50,0) [0|204700] "watts" Vector__XXX + SG_ ScLocPwId_No_RqCld : 43|3@0+ (1,0) [0|7] "unitless" Vector__XXX + SG_ PrcondEdit_D_RqCld : 10|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ GoTEditMnte_T_RqCld : 29|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ GoTEditHr_T_RqCld : 15|5@0+ (1,0) [0|29] "SED" Vector__XXX + SG_ ChrgToPcEdit_Pc_RqCld : 7|7@0+ (1,0) [0|125] "percent" Vector__XXX + SG_ AirAmb_Te_ActlCld : 23|10@0+ (0.25,-128) [-128|127.75] "degC" Vector__XXX + SG_ ScFreshDataEnbl_B_Rq : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ScEnbl_D_RqCld : 25|2@0+ (1,0) [0|3] "SED" Vector__XXX + +BO_ 775 SmartChargingData_ECG_2: 8 GWM + SG_ ScDayOfWeekId_D_RqCld : 63|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ScLocSetId_No_RqCld : 10|3@0+ (1,0) [0|7] "unitless" Vector__XXX + SG_ ScLocRdius_L_RqCld : 55|7@0+ (100,0) [0|12700] "meter" Vector__XXX + SG_ ScChrgToPc_Pc_RqCld : 47|7@0+ (1,0) [0|127] "percent" Vector__XXX + SG_ ScChrgPrfl_No_RqCld : 23|24@0+ (1,0) [0|16777215] "unitless" Vector__XXX + SG_ ScChrgDurSet_D_RqCld : 12|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ ScChrgDur_T_RqCld : 7|11@0+ (1,0) [0|2045] "minute" Vector__XXX + +BO_ 774 SmartChargingData_ECG_1: 8 GWM + SG_ ScLocLongPostv_B_RqCld : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ScLocLongFrct_An_RqCld : 35|20@0+ (1E-006,0) [0|1.048575] "degrees" Vector__XXX + SG_ ScLocLongDeg_An_RqCld : 63|8@0+ (1,0) [0|255] "degrees" Vector__XXX + SG_ ScLocLattPostv_B_RqCld : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ScLocLattFrct_An_RqCld : 23|20@0+ (1E-006,0) [0|1.048575] "degrees" Vector__XXX + SG_ ScLocLattDeg_An_RqCld : 15|7@0+ (1,0) [0|127] "percent" Vector__XXX + SG_ ScLocId_No_RqCld : 6|3@0+ (1,0) [0|7] "unitless" Vector__XXX + SG_ ScLocDelete_B_RqCld : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 811 APIM_Data_FD1: 8 GWM + SG_ DistToStopover_L_Actl : 31|16@0+ (0.1,0) [0|6553.4] "kilometer" Vector__XXX + SG_ StopoverType_D_Stat : 47|3@0+ (1,0) [0|0] "SED" Vector__XXX + SG_ ExtLghtDsply_D_Stat : 7|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ExtLghtRight_D_RqMnu : 11|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ AutoLghtOvrrd_B_RqDrv : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ExtLghtRear_D_RqMnu : 14|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ExtLghtLeft_D_RqMnu : 1|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ExtLghtFront_D_RqMnu : 4|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ GoTEditMnte_T_RqMnu : 63|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ GoTEditHr_T_RqMnu : 44|5@0+ (1,0) [0|29] "SED" Vector__XXX + +BO_ 850 HEV_ChargeStat_FD1: 8 SOBDMC_HPCM_FD1 + SG_ VehElRngeNut_L_Dsply : 11|12@0+ (0.1,0) [0|409.3] "km" GWM + SG_ NxtUsgSocEst_Pc_Dsply : 7|8@0+ (0.5,0) [0|126.5] "unitless" GWM + SG_ EstmChrgTimeLP_St : 39|8@0+ (0.1,0) [0|25.4] "hour" GWM + SG_ EstmChrgTimeHP_St : 47|8@0+ (0.1,0) [0|25.4] "hour" GWM + SG_ ChargeNowDuration_St : 31|8@0+ (0.1,0) [0|25.4] "hour" GWM + +BO_ 563 MasterReset_HS3_ECGDat_FD1: 8 GWM + SG_ DrvBhavWarn_B_Rq : 12|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ OfbChrgSetSync_D_Rq : 1|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ KeyOffPwMde_D_Stat : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ModemReset_D_Stat : 5|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ FactoryReset_St : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX + +BO_ 1833 TesterPhysicalResVDM: 64 VDM + SG_ TesterPhysicalResVDM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 570 Suspension_Data: 8 VDM + SG_ SuspClkSync_No_Rq : 63|8@0+ (1,0) [0|253] "unitless" GWM + SG_ SuspRearRight_L_Actl : 42|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM + SG_ SuspFrntRight_L_Actl : 35|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM + SG_ SuspRear_L_Prev : 28|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM + SG_ SuspRear_L_Actl : 21|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM + SG_ SuspFrnt_L_Prev : 14|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM + SG_ SuspFrnt_L_Actl : 7|9@0+ (0.782779,-200) [-200|199.21729] "millimeter" GWM + +BO_ 837 VeyDynamics_Data: 8 VDM + SG_ Ccd_B_Falt : 24|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdeSusp_D_Stat : 20|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdptDrvMdePt_D_Rq : 23|3@0+ (1,0) [0|7] "SED" GWM + SG_ AdptDrvMdeChassis_D_Rq : 10|3@0+ (1,0) [0|7] "SED" GWM + SG_ CcdMsgTxt_D_RqDsply : 7|4@0+ (1,0) [0|15] "SED" ECM_Diesel,GWM + +BO_ 885 ECG_Data3_FD1: 8 GWM + SG_ BattULoChrg_D_RqOta : 55|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ VehStrtInhbt_T_Dsply : 39|16@0+ (1,0) [0|65535] "second" Vector__XXX + SG_ VehStrtInhbt_D_Dsply : 27|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ VehOnRqstr_D_Stat : 21|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ VehStrtInhbt_D_RqCld : 23|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ VehOn_D_RqCld : 17|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ CanMsg375_No_Cnt : 11|4@0+ (1,0) [0|15] "unitless" Vector__XXX + SG_ CanMsg375_No_Crc : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ OtaActv_D_Stat : 31|4@0+ (1,0) [0|15] "SED" Vector__XXX + +BO_ 1150 LocationServices_Data1_FD1: 8 GWM + SG_ LocationServices_1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" SOBDMC_HPCM_FD1,IPMA_ADAS + +BO_ 542 LocationServices_3_FD1: 8 GWM + SG_ LocationServices_3 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" Vector__XXX + +BO_ 2612224016 PARSEDPushPCMtoGWM_ECG: 8 PCM_HEV + SG_ PARSEDPushPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 810 ECG_Data_FD1: 8 GWM + SG_ OBCCSerial_D_Rq : 45|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TlghtTest_D_RqArb : 47|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ ChrgrPncSustn_B_Rq : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ NtfyDrvTrgtDist_L_Rq : 23|12@0+ (0.1,0) [0.1|409.4] "Km" SOBDMC_HPCM_FD1 + SG_ NtfyDrvSocLvl1_Pc_Rq : 39|7@0+ (1,0) [1|100] "%" SOBDMC_HPCM_FD1 + SG_ PtRmtRprt_D_Stat : 27|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ ChrgrPncEnbl_D_Rq : 9|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ ExtLghtDsply_B_StatArb : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ExtLghtRight_D_RqOta : 12|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ExtLghtRear_D_RqOta : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ExtLghtLeft_D_RqOta : 3|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ExtLghtFront_D_RqOta : 6|3@0+ (1,0) [0|7] "SED" Vector__XXX + +BO_ 550 ECG_Data4_FD1: 8 GWM + SG_ PtWakeupActv1_B_Rq : 7|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + +BO_ 639 OffBrdChrg_Signals2: 8 GWM + SG_ OfbChrgPrflUpdate_B_Rq : 31|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgClearAll_B_Rq : 7|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTTouch_D_Rq : 17|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTPrcond_D_Rq : 19|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTOn_D_Rq : 10|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTMnte_D_Rq : 23|4@0+ (1,0) [0|15] "minute" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTHr_T_Rq : 15|5@0+ (1,0) [0|29] "hour" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTExtHtr_D_Rq : 1|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTElement_D_Rq : 5|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTDelete_B_Rq : 6|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgGoTUpdate_B_Rq : 8|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + +BO_ 530 OffBrdChrg_Signals: 8 GWM + SG_ OfbChrgLocIdTrgt_No_Rq : 7|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1 + SG_ OfbChrgToPcWknd_D_Actl : 58|3@0+ (1,0) [0|7] "percent" SOBDMC_HPCM_FD1 + SG_ OfbChrgToPcWkdy_D_Actl : 61|3@0+ (1,0) [0|7] "percent" SOBDMC_HPCM_FD1 + SG_ OfbChrgSetNow_D_Rq : 63|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgSetDelete_B_Rq : 2|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ OfbChrgPrflWknd_No_Rq : 39|24@0+ (1,0) [0|16777215] "unitless" SOBDMC_HPCM_FD1 + SG_ OfbChrgPrflWkdy_No_Rq : 15|24@0+ (1,0) [0|16777215] "unitless" SOBDMC_HPCM_FD1 + SG_ OfbChrgLocIdUns_B_Rq : 3|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + +BO_ 1142 ConsTip_Data_FD1: 8 SOBDMC_HPCM_FD1 + SG_ ConsTipV_No_Dsply : 49|10@0+ (0.1,0) [0|102.1] "percent" GWM + +BO_ 817 Locking_Systems_2_FD1: 8 GWM + SG_ ChildLckMde_B_Stat : 56|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ VehLckInd_D_Rq : 58|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ DrTgateOpen_B_Rq : 59|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DrTgateExtSwMde_B_Stat : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Remote_Device_Feedback : 50|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ Veh_Lock_Requestor : 55|5@0+ (1,0) [0|31] "SED" Vector__XXX + SG_ R_Pwr_Sliding_Dr_Rqst : 36|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Power_Liftgate_Rqst : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Veh_Lock_EvNum : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ Power_Decklid_Rqst : 1|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ L_Pwr_Sliding_Dr_Rqst : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Keyfob_Pad_Msg_Count : 15|8@0+ (1,0) [0|255] "Counts" Vector__XXX + SG_ Veh_Lock_Sub_Id : 63|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ Veh_Lock_Status : 34|2@0+ (1,0) [0|3] "SED" CMR_DSMC + SG_ ChildLck_D_Dsply : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ WindowLockout_B_Stat : 35|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ RollCodeUnlock : 23|16@0+ (1,0) [0|65535] "Unitless" Vector__XXX + SG_ Lockmsgtxt_D_Rq : 39|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ FobComm_D_Stat : 5|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ LockInhibit : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 879 BCMC_Data_FD1: 8 GWM + SG_ WndwRearHeat_I_Actl : 7|11@0+ (0.1,0) [0|204.6] "ampere" ECM_Diesel + SG_ WndwRearHeat_D_Stat : 12|3@0+ (1,0) [0|7] "SED" ECM_Diesel + +BO_ 878 DCACA_Data4: 8 PCM_HEV + SG_ DcacGfciTest_B_Rq : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ DcacOut_Pw_DsplyMx : 23|10@0+ (10,0) [0|10220] "watts" GWM + SG_ DcacOut1_Pw_Dsply : 39|7@0+ (100,0) [0|12600] "watts" GWM + SG_ DcacOut2_Pw_Dsply : 47|7@0+ (100,0) [0|12600] "watts" GWM + SG_ DcacHw_D_Confg : 11|4@0+ (1,0) [0|15] "SED" GWM + SG_ DcacFaltMsgTxt_D_Rq : 15|4@0+ (1,0) [0|15] "SED" GWM + SG_ DcacLoFuelMsgTxt_D_Rq : 29|5@0+ (1,0) [0|31] "SED" GWM + SG_ DcacEngOnMsgTxt_D_Rq : 55|2@0+ (1,0) [0|3] "SED" GWM + SG_ DcacElPw_D_Stat : 2|2@0+ (1,0) [0|3] "SED" GWM + SG_ PwBedPnlEnbl_B_Rq : 3|1@0+ (1,0) [0|1] "SED" GWM + SG_ DcacOn_B_Rq : 4|1@0+ (1,0) [0|1] "SED" GWM + SG_ DcacSys_B_Falt : 5|1@0+ (1,0) [0|1] "SED" GWM + SG_ DcacLedCtl_D_Rq : 7|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 395 HeadUpDisplayReq_FD1: 8 GWM + SG_ SelDrvMdeCnfm_D_Stat : 35|2@0+ (1,0) [0|3] "SED" ABS_ESC + +BO_ 2611055832 PARSEDPhysGWM_ECGtoSODR: 8 GWM + SG_ PARSEDPhysGWM_ECGtoSODR : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2611054808 PARSEDPhysGWM_ECGtoSODL: 8 GWM + SG_ PARSEDPhysGWM_ECGtoSODL : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2611026136 PARSEDPhysGWM_ECGtoSODCMD: 8 GWM + SG_ PARSEDPhysGWM_ECGtoSODCMD : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2611025112 PARSEDPhysGWM_ECGtoSODCMC: 8 GWM + SG_ PARSEDPhysGWM_ECGtoSODCMC : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2610975960 PARSEDPhysGWM_ECGtoCCM: 8 GWM + SG_ PARSEDPhysGWM_ECGtoCCM : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2610007256 OTAPhysGWM_ECGtoSODR: 8 GWM + SG_ OTAPhysGWM_ECGtoSODR : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2610006232 OTAPhysGWM_ECGtoSODL: 8 GWM + SG_ OTAPhysGWM_ECGtoSODL : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2609977560 OTAPhysGWM_ECGtoSODCMD: 8 GWM + SG_ OTAPhysGWM_ECGtoSODCMD : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2609976536 OTAPhysGWM_ECGtoSODCMC: 8 GWM + SG_ OTAPhysGWM_ECGtoSODCMC : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2609927384 OTAPhysGWM_ECGtoCCM: 8 GWM + SG_ OTAPhysGWM_ECGtoCCM : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2611175523 PARSEDPhysSODRtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysSODRtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2612224099 PARSEDPushSODRtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysSODR2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2611175522 PARSEDPhysSODLtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysSODLtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2612224098 PARSEDPushSODLtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysSODL2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2611175494 PARSEDPhysSODCMDtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysSODCMDtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2612224070 PARSEDPushSODCMDtoGWM: 8 IPMA_ADAS + SG_ PARSEDPhysSODCMD2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2611175493 PARSEDPhysSODCMCtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysSODCMCtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2612224069 PARSEDPushSODCMCtoGWM: 8 IPMA_ADAS + SG_ PARSEDPhysSODCMC2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2611175445 PARSEDPhysCCMtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysCCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2612224021 PARSEDPushCCMtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysCCM2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126947 OTAPhysSODRtoGWM_ECG: 8 IPMA_ADAS + SG_ OTAPhysSODRtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126946 OTAPhysSODLtoGWM_ECG: 8 IPMA_ADAS + SG_ OTAPhysSODLtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126918 OTAPhysSODCMDtoGWM_ECG: 8 IPMA_ADAS + SG_ OTAPhysSODCMDtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126917 OTAPhysSODCMCtoGWM_ECG: 8 IPMA_ADAS + SG_ OTAPhysSODCMCtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126869 OTAPhysCCMtoGWM_ECG: 8 IPMA_ADAS + SG_ OTAPhysCCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 984 IPMA_Data: 8 IPMA_ADAS + SG_ FeatConfigIpmaActl : 7|16@0+ (1,0) [0|65535] "Undefined" GWM + SG_ FeatNoIpmaActl : 23|16@0+ (1,0) [0|65535] "Number" GWM + SG_ PersIndexIpma_D_Actl : 39|3@0+ (1,0) [0|7] "SED" GWM + SG_ AhbcRampingV_D_Rq : 57|2@0+ (1,0) [0|3] "SED" GWM + SG_ LaActvStats_D_Dsply : 55|5@0+ (1,0) [0|31] "SED" GWM + SG_ LaDenyStats_B_Dsply : 32|1@0+ (1,0) [0|1] "SED" GWM + SG_ LaHandsOff_D_Dsply : 50|2@0+ (1,0) [0|3] "SED" GWM + SG_ CamraDefog_B_Req : 36|1@0+ (1,0) [0|1] "SED" GWM + SG_ CamraStats_D_Dsply : 35|2@0+ (1,0) [0|3] "SED" GWM + SG_ DasAlrtLvl_D_Dsply : 42|3@0+ (1,0) [0|7] "SED" GWM + SG_ DasStats_D_Dsply : 47|2@0+ (1,0) [0|3] "SED" GWM + SG_ DasWarn_D_Dsply : 44|2@0+ (1,0) [0|3] "SED" GWM + SG_ AhbHiBeam_D_Rq : 59|2@0+ (1,0) [0|3] "SED" GWM + SG_ Passthru_63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ Passthru_48 : 48|1@0+ (1,0) [0|1] "" XXX + +BO_ 985 IPMA_Data2: 8 IPMA_ADAS + SG_ LdwChime_B_Rq : 34|1@0+ (1,0) [0|1] "SED" GWM + SG_ TsrRegionTxt_D_Stat : 47|5@0+ (1,0) [0|31] "SED" GWM + SG_ SblmPedCrossScnr_B_Stat : 33|1@0+ (1,0) [0|1] "SED" GWM + SG_ LongCtrlEnbl_D_Rq : 42|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ SblmRndAbtScnr_B_Stat : 9|1@0+ (1,0) [0|1] "SED" GWM + SG_ DasAlrtInfo_D_Dsply : 13|2@0+ (1,0) [0|3] "SED" GWM + SG_ IaccVLim_D_Rq : 23|8@0+ (1,0) [0|255] "SED" ECM_Diesel,GWM + SG_ IaccVLimUnit_D_Rq : 11|2@0+ (1,0) [0|3] "SED" ECM_Diesel,GWM + SG_ IsaVLim_D_Rq : 7|8@0+ (1,0) [0|255] "SED" ECM_Diesel,GWM + SG_ SblmStopScnr_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ SblmYieldScnr_B_Stat : 31|1@0+ (1,0) [0|1] "SED" GWM + SG_ IsaVLimUnit_D_Rq : 15|2@0+ (1,0) [0|3] "SED" ECM_Diesel,GWM + SG_ AdbDividedRoad_B_Stat : 30|1@0+ (1,0) [0|1] "SED" GWM + SG_ LcwaMsgTxt_D_Stat : 37|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdbDrvSide_B_Stat : 35|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 992 Personality_Data_FD1: 8 GWM + SG_ MsgCntrDsplyOp_D_Rq : 36|3@0+ (1,0) [0|7] "SED" IPMA_ADAS + SG_ MsgCntrFeatNoRq : 7|16@0+ (1,0) [0|65535] "Number" IPMA_ADAS + SG_ MsgCntrFeatConfigRq : 23|16@0+ (1,0) [0|65535] "unitless" IPMA_ADAS + SG_ MsgCntrPersIndex_D_Rq : 39|3@0+ (1,0) [0|7] "SED" IPMA_ADAS + +BO_ 2612019416 PARSEDPushFcGWM_ECGtoPCM: 8 GWM + SG_ PARSEDPhysGWM_ECG2toPCM : 7|29@0+ (1,0) [0|536870911] "unitless" PCM,PCM_HEV,ECM_Diesel + +BO_ 943 IPMA_Data4: 8 IPMA_ADAS + SG_ VehVActlAdas_D_Qf : 9|2@0+ (1,0) [0|3] "SED" PCM,PCM_HEV,ECM_Diesel + SG_ Veh_V_RqLsc : 23|14@0+ (0.01,0) [0|163.83] "kph" PCM,PCM_HEV,ECM_Diesel + SG_ Veh_V_ActlAdas : 7|14@0+ (0.01,0) [0|163.83] "kph" PCM,PCM_HEV,ECM_Diesel + SG_ AdasLcDistToObj_L_Actl : 39|12@0+ (0.002,0) [0|8.186] "meter" PCM,PCM_HEV,ECM_Diesel + +BO_ 515 PowertrainData_12: 8 ECM_Diesel + SG_ PtIgnSwtch_No_Cs : 15|8@0+ (1,0) [0|255] "Unitless" GWM + SG_ PtIgnSwtch_No_Cnt : 5|4@0+ (1,0) [0|15] "Unitless" GWM + SG_ PtIgnSwtch_D_Stat : 7|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 1111 TrailerAid_Stat2_FD1: 8 GWM + SG_ TrlrYawWActl_D_Qf : 43|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,PSCM + SG_ TrlrYaw_W_Actl : 7|16@0+ (0.0002,-6.5) [-6.5|6.6066] "radians/second" IPMA_ADAS,PSCM + SG_ TrlrHitYaw_AnRate_Actl : 27|12@0+ (0.1,-50) [-50|359.3] "degrees/second" IPMA_ADAS,PSCM + SG_ TrlrHitchYaw_D_Stat : 47|4@0+ (1,0) [0|15] "SED" IPMA_ADAS,PSCM + SG_ TrlrHitchYaw_An_Actl : 23|12@0+ (0.1,-90) [-90|319.3] "degrees" IPMA_ADAS,PSCM + +BO_ 1106 TrailerAid_Stat1_FD1: 8 GWM + SG_ TrlrSnsId_No_Actl : 7|48@0+ (1,0) [0|281474976710653] "unitless" IPMA_ADAS,PSCM + +BO_ 1985 TesterPhysicalReqCMR_DSMC: 64 TSTR + SG_ TesterPhysicalReqCMR_DSMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" CMR_DSMC + +BO_ 1993 TesterPhysicalResCMR_DSMC: 64 CMR_DSMC + SG_ TesterPhysicalResCMR_DSMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1104 DrvStatMonData: 8 CMR_DSMC + SG_ DrvEngageLevel_No_Cs : 31|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS + SG_ DrvEngageLevel_No_Cnt : 19|4@0+ (1,0) [0|15] "Unitless" IPMA_ADAS + SG_ DrvEngageLevel_D_Stat : 13|3@0+ (1,0) [0|7] "SED" IPMA_ADAS + SG_ DrvImpLvlConfid_D_Stat : 39|3@0+ (1,0) [0|7] "SED" IPMA_ADAS + SG_ DrvImpairLvl_D_Stat : 23|4@0+ (1,0) [0|15] "SED" IPMA_ADAS + SG_ DrvEngLvlConfid_D_Stat : 10|3@0+ (1,0) [0|7] "SED" IPMA_ADAS + SG_ DrvCamPassIR_D_Stat : 36|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ DrvCamera_D_Stat : 15|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ DrvCamDrvIR_D_Stat : 1|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ DrvAttentZone_D_Stat : 5|4@0+ (1,0) [0|15] "SED" IPMA_ADAS + SG_ DrvAlertSt_D_Stat : 7|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + +BO_ 1503 CMR_DSMC_AutoSar_NetwrkMgt: 8 CMR_DSMC + SG_ CMR_DSMC_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ CMR_DSMC_GWNMProxY : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ CMR_DSMC_AutoSarNMReserved : 63|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ CMR_DSMC_AutoSarNMReserve4 : 55|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ CMR_DSMC_AutoSarNMReserve3 : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ CMR_DSMC_AutoSarNMReserve2 : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ CMR_DSMC_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ CMR_DSMC_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX + +BO_ 2610995416 PARSEDPhysGWM_ECGtoABS: 8 GWM + SG_ PARSEDPhysGWM_ECGtoABS : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC + +BO_ 2612043992 PARSEDPushFcGWM_ECGtoABS: 8 GWM + SG_ PARSEDPhysGWM_ECG2toABS : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC + +BO_ 2609946840 OTAPhysGWM_ECGtoABS: 8 GWM + SG_ OTAPhysGWM_ECGtoABS : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC + +BO_ 2611175464 PARSEDPhysABStoGWM_ECG: 8 ABS_ESC + SG_ PARSEDPhysABStoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "Unitless" GWM + +BO_ 2612224040 PARSEDPushABStoGWM_ECG: 8 ABS_ESC + SG_ PARSEDPhysABS2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126888 OTAPhysABStoGWM_ECG: 8 ABS_ESC + SG_ OTAPhysABStoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610988248 PARSEDPhysGWM_ECGtoIPMA: 8 GWM + SG_ PARSEDPhysGWM_ECGtoIPMA : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 2609939672 OTAPhysGWM_ECGtoIPMA: 8 GWM + SG_ OTAPhysGWM_ECGtoIPMA : 7|29@0+ (1,0) [0|536870911] "unitless" IPMA_ADAS + +BO_ 1114 TrailerAid_Data_FD1: 8 GWM + SG_ TrailCtlSwtch_B_Stat2 : 16|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ TrlBrkInitOut_D_Rq : 60|2@0+ (1,0) [0|3] "SED" Vector__XXX + +BO_ 1116 TrailerAid_Data3_FD1: 8 GWM + SG_ TrlrAidSetup_D2_Rq : 4|4@0+ (1,0) [0|15] "SED" IPMA_ADAS,PSCM + SG_ TrlrAidEnbl_D2_Rq : 7|3@0+ (1,0) [0|7] "SED" IPMA_ADAS,PSCM + SG_ TrlrTrgtToBmpr_L_Actl : 38|7@0+ (0.0127,0) [0|1.6129] "meter" IPMA_ADAS + SG_ TrlrTrgtPtrnId_No_Mem : 45|6@0+ (1,0) [0|63] "unitless" IPMA_ADAS + SG_ TrlrRvrseCancl_B_Rq : 0|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PSCM + SG_ TrlrIdType_D_Stat : 51|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,PSCM + SG_ TrlrId_No_Actl : 55|4@0+ (1,0) [0|15] "unitless" IPMA_ADAS,PSCM + SG_ TrlrBallToBmpr_L_Actl : 22|7@0+ (0.0127,0) [0|1.6129] "meter" IPMA_ADAS,PSCM + SG_ TrlrAxleToBmpr_L_Actl : 31|9@0+ (0.0254,0) [0|12.9794] "meter" IPMA_ADAS,PSCM + SG_ TrlrAnOffstDir_D_Mem : 47|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,PSCM + SG_ TrlrAnOffst_An_Mem : 15|9@0+ (0.1,0) [0|51.1] "degrees" IPMA_ADAS + SG_ TrlrTrgtOffst_L_Actl : 63|7@0+ (0.0127,0) [0|1.6129] "meter" IPMA_ADAS + +BO_ 2611175457 PARSEDPhysIPMAtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysIPMAtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2612224033 PARSEDPushIPMAtoGWM_ECG: 8 IPMA_ADAS + SG_ PARSEDPhysIPMA2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126881 OTAPhysIPMAtoGWM_ECG: 8 IPMA_ADAS + SG_ OTAPhysIPMAtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 1085 Low_Voltage_Power_Data_FD1: 8 PCM + SG_ ULoRgenTestMde_B_Stat : 50|1@0+ (1,0) [0|1] "SED" GWM + SG_ PwSrcULoOvrTe_B_Actl : 7|1@0+ (1,0) [0|1] "SED" GWM + SG_ PwSrcULoFalt_D_Stat : 5|2@0+ (1,0) [0|3] "SED" GWM + SG_ PwSrcULoDcnnt_B_Stat : 3|1@0+ (1,0) [0|1] "SED" GWM + SG_ PwSrcULo_Pc_Mx : 31|8@0+ (0.4,0) [0|101.6] "%" GWM + SG_ PwSrcULoComm_B_Falt : 2|1@0+ (1,0) [0|1] "SED" GWM + SG_ PwSrcULo_I_Mx : 23|8@0+ (1,0) [0|254] "ampere" PCM_HEV,GWM + SG_ PwSrcULo_I_Actl : 15|8@0+ (1,0) [0|254] "ampere" PCM_HEV,GWM + +BO_ 791 Cluster_HEV_Data8_FD1: 8 GWM + SG_ EngAirFilt_B_RqReset : 48|1@0+ (1,0) [0|1] "SED" ECM_Diesel + SG_ GpsElMdeSel_B_Rq : 50|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ LongTermReset_B_Rq : 49|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DrvEffLvl_No_Stat : 61|6@0+ (1,0) [0|61] "unitless" Vector__XXX + SG_ ConsAvgTrip_Fe_Dsply : 31|24@0+ (0.0001,0) [0|1677.7215] "litre/100km" Vector__XXX + +BO_ 2610970840 PARSEDPhysGWM_ECGtoPCM: 8 GWM + SG_ PARSEDPhysGWM_ECGtoPCM : 7|29@0+ (1,0) [0|536870911] "unitless" ECM_Diesel,PCM_HEV,PCM + +BO_ 2609922264 OTAPhysGWM_ECGtoPCM: 8 GWM + SG_ OTAPhysGWM_ECGtoPCM : 7|29@0+ (1,0) [0|536870911] "unitless" ECM_Diesel,PCM_HEV,PCM + +BO_ 868 BattRgenLo_4_FD1: 8 GWM + SG_ BattRgenLoStat_D_Qlty : 25|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM + SG_ BattRgenLoSoc_Pc_Actl : 23|7@0+ (1,0) [0|100] "percent" PCM_HEV,PCM + SG_ BattRgenLoPulse_U_Pred : 15|8@0+ (0.0625,0) [0|15.9375] "volt" PCM_HEV,PCM + SG_ BattRgenLoPrtct_B_Stat : 39|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM + SG_ BattRgenLoDChrg_D_Stat : 27|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM + SG_ BattRgenLoDchrg_B_Rq : 28|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM + SG_ BattRgenLoChrg_D_Stat : 30|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM + SG_ BattRgenLoChrg_B_Rq : 31|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM + SG_ BattRgenLo_T_Est : 7|8@0+ (8,0) [0|2040] "second" PCM_HEV,PCM + SG_ BattRgenLo_B_Falt : 16|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM + +BO_ 867 BattRgenLo_3_FD1: 8 GWM + SG_ BattRgenLoBalnc_B_Rq : 16|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM + SG_ BattRgenLo_Te_Hi : 55|8@0+ (1,-20) [-20|235] "degC" PCM_HEV,PCM + SG_ BattRgenLo_Te_Actl : 47|8@0+ (1,-60) [-60|194] "degC" PCM_HEV,PCM + SG_ BattRgenLo_R_Actl : 31|9@0+ (0.0625,0) [0|31.9375] "milliohm" PCM_HEV,PCM + SG_ BattRgenLo_AhRide_Actl : 15|15@0+ (0.0078125,-100) [-100|155.9921875] "amperehour" PCM_HEV,PCM + SG_ BattRgenLo_Ah_Actl : 7|8@0+ (0.1,0) [0|25.5] "amperehour" PCM_HEV,PCM + +BO_ 866 BattRgenLo_2_FD1: 8 GWM + SG_ BattRgenLoOpen_U_Actl : 55|9@0+ (0.025,8.5) [8.5|21.275] "volt" PCM_HEV,PCM + SG_ BattRgenLoDchrg_U_Mn : 39|9@0+ (0.025,4) [4|16.775] "volt" PCM_HEV,PCM + SG_ BattRgenLoDchrg_I_Mx : 31|8@0+ (2,0) [0|510] "ampere" PCM_HEV,PCM + SG_ BattRgenLoChrg_U_Mx : 15|9@0+ (0.025,10.6) [10.6|23.375] "volt" PCM_HEV,PCM + SG_ BattRgenLoChrg_I_Mx : 7|8@0+ (2,0) [0|510] "ampere" PCM_HEV,PCM + +BO_ 865 BattRgenLo_1_FD1: 8 GWM + SG_ BattRgenLo_U_Actl : 23|11@0+ (0.015625,0) [0|31.96875] "volt" PCM_HEV,PCM + SG_ BattRgenLo_I_Actl : 7|16@0+ (0.015625,-512) [-512|511.96875] "ampere" PCM_HEV,PCM + +BO_ 2611175440 PARSEDPhysPCMtoGWM_ECG: 8 PCM + SG_ PARSEDPhysPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126864 OTAPhysPCMtoGWM_ECG: 8 PCM + SG_ OTAPhysPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2611175441 PARSEDHPCMtoGWM_ECG_FD1: 8 SOBDMC_HPCM_FD1 + SG_ PARSEDPhysHPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2612224017 PARSEDPushSOBDMCtoGWM_FD1: 8 SOBDMC_HPCM_FD1 + SG_ PARSEDPhysHPCM2toGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 2610126865 OTAPhysSOBDMCtoGWM_FD1: 8 SOBDMC_HPCM_FD1 + SG_ OTAPhysHPCMtoGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" GWM + +BO_ 1679 SOBDMC_RapidData_Resp4_FD1: 8 SOBDMC_HPCM_FD1 + SG_ UUDTSOBDMCResponse4 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1678 SOBDMC_RapidData_Resp3_FD1: 8 SOBDMC_HPCM_FD1 + SG_ UUDTSOBDMCResponse3 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1677 SOBDMC_RapidData_Resp2_FD1: 8 SOBDMC_HPCM_FD1 + SG_ UUDTSOBDMCResponse2 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1676 SOBDMC_RapidData_Resp1_FD1: 8 SOBDMC_HPCM_FD1 + SG_ UUDTSOBDMCResponse1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1445 SOBDMC_AutoSar_NetMgmt_FD1: 8 SOBDMC_HPCM_FD1 + SG_ SOBDMC_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ SOBDMC_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ SOBDMC_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ SOBDMC_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ SOBDMC_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ SOBDMC_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ SOBDMC_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ SOBDMC_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX + +BO_ 1144 MHT_EV_Wakeup_FD1: 8 SOBDMC_HPCM_FD1 + SG_ WakeAlarm0_T_Rq : 7|15@0+ (1,0) [0|32767] "minute" GWM + SG_ WakeAlarm0_B_Typ : 21|1@0+ (1,0) [0|1] "SED" GWM + SG_ PreCondBatt_B_Actl : 32|1@0+ (1,0) [0|1] "SED" GWM + SG_ HtrnDcdcDis_B_Rq : 26|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgNowEvnt_B_Stat : 22|1@0+ (1,0) [0|1] "SED" GWM + SG_ CabinDrvSustn_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM + SG_ BattChrgTrgtSoC_D_Rq : 35|3@0+ (1,0) [0|7] "Percent" GWM + SG_ CabnEvapSovFront_B_Rq : 38|1@0+ (1,0) [0|1] "SED" GWM + SG_ HeatCoreSovRear_B_Rq : 36|1@0+ (1,0) [0|1] "SED" GWM + SG_ BattChlrSov_B_Rq : 39|1@0+ (1,0) [0|1] "SED" GWM + SG_ CabnEvapSovRear_B_Rq : 37|1@0+ (1,0) [0|1] "SED" GWM + SG_ BrkAppl_D_RqPt : 25|2@0+ (1,0) [0|3] "SED" GWM + SG_ HtrnCnnctPwr_B_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ PtcHtr_D_Stat : 18|2@0+ (1,0) [0|3] "SED" GWM,PCM_HEV + SG_ HtrnClntFlw_D_Rq : 20|2@0+ (1,0) [0|3] "SED" GWM + SG_ BattTracDrvSustn_B_Rq : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BattTracClntVlv_B_Rq : 47|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 1141 Cluster_HEV_Data9_FD1: 8 SOBDMC_HPCM_FD1 + SG_ OfbChrgSetSync_D_Stat : 31|2@0+ (1,0) [0|3] "SED" GWM + SG_ PtRmtRprt_D_Rq : 59|4@0+ (1,0) [0|15] "SED" GWM + SG_ MtrTrac2_Tq_Actl : 29|12@0+ (1,-2047) [-2047|2048] "Nm" GWM + SG_ NtfctnConflict1_D_Rq : 53|3@0+ (1,0) [0|7] "SED" GWM + +BO_ 1140 Cluster_HEV_Data7_FD1: 8 SOBDMC_HPCM_FD1 + SG_ RgenEvntLvl_Pc_Dsply : 9|10@0+ (0.1,0) [0|102.1] "percent" GWM + SG_ BrkEvntComplt_B_Dsply : 31|1@0+ (1,0) [0|1] "SED" GWM + SG_ PreCondStat_D_Dsply : 12|3@0+ (1,0) [0|7] "SED" GWM + +BO_ 1139 GWM_HPCM_i_FrP11_FD1: 8 SOBDMC_HPCM_FD1 + SG_ ActChrgStrtYr_No2_Actl : 7|7@0+ (1,2017) [2017|2144] "year" GWM + SG_ BattChrgTrgtLMax_T_Est : 10|11@0+ (1,0) [0|2045] "minute" GWM + SG_ ActChrgStrtYr_No_Actl : 60|5@0+ (1,2010) [2010|2040] "year" GWM + SG_ ActChrgStrtMin_No_Actl : 29|6@0+ (1,0) [0|61] "minute" GWM + SG_ ActChrgStrtHr_No_Actl : 36|5@0+ (1,0) [0|29] "hour" GWM + SG_ ActChrgStrtDay_No_Actl : 44|5@0+ (1,1) [1|31] "days" GWM + SG_ ActChrgStrMnth_No_Actl : 51|4@0+ (1,1) [1|15] "month" GWM + +BO_ 1138 GWM_HPCM_i_FrP10_FD1: 8 SOBDMC_HPCM_FD1 + SG_ ActChrgEndYr_No2_Actl : 7|7@0+ (1,2017) [2017|2144] "year" GWM + SG_ BattChrgTrgtLMin_T_Est : 10|11@0+ (1,0) [0|2045] "minute" GWM + SG_ ActChrgEndYr_No_Actl : 60|5@0+ (1,2010) [2010|2040] "year" GWM + SG_ ActChrgEndMnth_No_Actl : 51|4@0+ (1,1) [1|15] "month" GWM + SG_ ActChrgEndMin_No_Actl : 29|6@0+ (1,0) [0|61] "minute" GWM + SG_ ActChrgEndHr_No_Actl : 36|5@0+ (1,0) [0|29] "hour" GWM + SG_ ActChrgEndDay_No_Actl : 44|5@0+ (1,1) [1|31] "days" GWM + +BO_ 1089 MtrTracData_1_FD1: 8 SOBDMC_HPCM_FD1 + SG_ Mtr2Aout_W_ActlMntr : 45|10@0+ (6.28,-3209) [-3209|3209.16] "radians/sec" GWM + SG_ Inv1_Te_Actl : 63|8@0+ (1,-40) [-40|213] "degC" GWM + SG_ MtrTrac2Coil_Te_Actl : 23|8@0+ (1,-40) [-40|213] "degC" GWM + SG_ MtrTrac2_U_Actl : 39|10@0+ (1,0) [0|1023] "volt" GWM + SG_ MtrTrac2Falt_B_Stat : 50|1@0+ (1,0) [0|1] "SED" GWM + SG_ MtrTrac2TeAlrm_B_Stat : 49|1@0+ (1,0) [0|1] "SED" GWM + SG_ Mtr2CntlTeAlrm_B_Stat : 51|1@0+ (1,0) [0|1] "SED" GWM + SG_ MtrTrac2Inv_Te_Actl : 31|8@0+ (1,-40) [-40|213] "degC" GWM + SG_ MtrTrac2_I_Actl : 7|16@0+ (0.1,-1000) [-1000|5553.4] "ampere" GWM + +BO_ 1088 PreCond_Hev_Data1_FD1: 8 SOBDMC_HPCM_FD1 + SG_ ChrgTMatch_B_Stat : 55|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgStat_D2_Dsply : 7|4@0+ (1,0) [0|15] "SED" GWM + SG_ HvacPrecondRecirc_D_Rq : 63|2@0+ (1,0) [0|3] "SED" GWM + SG_ HvacPrecondMode2_D_Rq : 51|4@0+ (1,0) [0|15] "SED" GWM + SG_ HvacPrecondBlwr2_D_Rq : 61|4@0+ (1,0) [0|15] "SED" GWM + SG_ HvacPrecondAC_D_Rq : 57|2@0+ (1,0) [0|3] "SED" GWM + SG_ HvacPrecond_Te_Rq : 44|5@0+ (0.5,14.5) [14.5|30] "deg C" GWM + SG_ BattChrgInhbt_D_Rq : 53|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 1040 AC_Compressor_Req_FD1: 8 SOBDMC_HPCM_FD1 + SG_ ElCmprEnbl_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM,PCM_HEV + SG_ ElCmpr_N_Rq : 15|8@0+ (50,0) [0|12750] "RPM" GWM + +BO_ 1016 GoTimeSettings_FD1: 8 SOBDMC_HPCM_FD1 + SG_ ChrgGoTElement_B_Dsply : 27|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocIdCurnt_D_Uns : 31|4@0+ (1,0) [0|15] "unitless" GWM + SG_ ChrgGoTTouchEnbl_B_Rq : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgGoTTouch_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgGoTPrcond_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ ChrgGoTNext_D_Stat : 19|4@0+ (1,0) [0|15] "Unitless" GWM + SG_ ChrgGoTMnte_D_Stat : 23|4@0+ (1,0) [0|15] "SED" GWM + SG_ ChrgGoTHr_T_Stat : 15|5@0+ (1,0) [0|29] "hour" GWM + SG_ ChrgGoTExtHtrEnbl_B_Rq : 1|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgGoTExtHtr_B_Stat : 2|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgGoTElement_D_Stat : 6|4@0+ (1,0) [0|15] "Unitless" GWM + SG_ ChrgGoTAllOn_B_Stat : 7|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 1013 ChargeSettings_FD1: 8 SOBDMC_HPCM_FD1 + SG_ ChrgToPcWkndSav_D_Stat : 60|3@0+ (1,0) [0|7] "SED" GWM + SG_ ChrgToPcWkdySav_D_Stat : 63|3@0+ (1,0) [0|7] "SED" GWM + SG_ ChrgProgIdSaved_D_Stat : 51|4@0+ (1,0) [0|15] "Unitless" GWM + SG_ ChrgNowEnbl_B_Saved : 56|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocIdUnsAck_B_Stat : 57|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocIdCurnt_D_Sav : 55|4@0+ (1,0) [0|15] "unitless" GWM + SG_ ChrgPrflWknd_No_Actl : 31|24@0+ (1,0) [0|16777215] "unitless" GWM + SG_ ChrgPrflWkdy_No_Actl : 7|24@0+ (1,0) [0|16777215] "unitless" GWM + +BO_ 1012 Saved_Charge_Location_FD1: 8 SOBDMC_HPCM_FD1 + SG_ ChrgNowCurnt_B_Dsply : 58|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocSaved_B_Dsply : 57|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocLongPostv_B_Sav : 59|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocLongFrct_An_Sav : 47|20@0+ (1E-006,0) [0|1.048575] "degrees" GWM + SG_ ChrgLocLongDeg_An_Sav : 39|8@0+ (1,0) [0|255] "degrees" GWM + SG_ ChrgLocLattPostv_B_Sav : 24|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocLattFrct_An_Sav : 7|20@0+ (1E-006,0) [0|1.048575] "degrees" GWM + SG_ ChrgLocLattDeg_An_Sav : 31|7@0+ (1,0) [0|127] "unitless" GWM + SG_ ChrgLocId_D_Sav : 19|4@0+ (1,0) [0|15] "unitless" GWM + +BO_ 1011 Unsaved_Charge_LocationFD1: 8 SOBDMC_HPCM_FD1 + SG_ ChrgLocLongPostv_B_Uns : 59|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocLongFrct_An_Uns : 47|20@0+ (1E-006,0) [0|1.048575] "degrees" GWM + SG_ ChrgLocLongDeg_An_Uns : 39|8@0+ (1,0) [0|255] "degrees" GWM + SG_ ChrgLocLattPostv_B_Uns : 24|1@0+ (1,0) [0|1] "SED" GWM + SG_ ChrgLocLattFrct_An_Uns : 7|20@0+ (1E-006,0) [0|1.048575] "degrees" GWM + SG_ ChrgLocLattDeg_An_Uns : 31|7@0+ (1,0) [0|127] "unitless" GWM + SG_ ChrgLocId_D_Uns : 19|4@0+ (1,0) [0|15] "unitless" GWM + +BO_ 871 Cluster_HEV_Data4_FD1: 8 SOBDMC_HPCM_FD1 + SG_ BattElecPerf_D_Actl : 55|3@0+ (1,0) [0|7] "SED" GWM + SG_ BattChrgTrgtLPt_T_Est : 2|11@0+ (1,0) [0|2045] "minute" GWM + SG_ BattChrgTrgSocPt_T_Est : 18|11@0+ (1,0) [0|2045] "minute" GWM + SG_ BattChrgCmpltPt_T_Est : 34|11@0+ (1,0) [0|2045] "minute" GWM + +BO_ 786 Cluster_HEV_Data1_FD1: 8 SOBDMC_HPCM_FD1 + SG_ RgenTrip_Pc_Dsply : 33|10@0+ (0.1,0) [0|102.3] "percent" GWM + SG_ RgenTrip_L_Dsply : 55|16@0+ (0.1,0) [0|6553.3] "kilometer" GWM + SG_ ChrgStat_D_Dsply : 36|3@0+ (1,0) [0|7] "SED" GWM + +BO_ 72 Global_PATS_Target2_FD1: 8 SOBDMC_HPCM_FD1 + SG_ immoTarget2Status : 7|3@0+ (1,0) [0|7] "SED" GWM + SG_ immoTarget2Data : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" GWM + SG_ immoTarget2Cmd : 4|3@0+ (1,0) [0|7] "SED" GWM + +BO_ 912 PowerDist_Data1_FD1: 8 GWM + SG_ CabnEvapSovFront_D_Stat : 15|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1 + SG_ BattChlrSov_D_Stat : 7|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1 + SG_ BattTracClntVlv_D_Stat : 28|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1 + +BO_ 874 PowerDistData_2_FD1: 8 GWM + SG_ AirCondCluOpen_D_Falt : 17|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ AirCondCluLife_D_Falt : 19|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ AirCondCluGnd_D_Falt : 21|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ AirCondClu_D_Stat : 31|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ AirCondCluBatt_D_Falt : 23|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ BattTracShrtGrnd_D_Falt : 9|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattTracShrtBatt_D_Falt : 11|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattTracOpnCirct_D_Falt : 13|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattTracLifeLim_D_Falt : 15|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattChlrShrtGrnd_D_Falt : 1|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattChlrShrtBatt_D_Falt : 3|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattChlrOpnCirct_D_Falt : 5|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattChlrLifeLim_D_Falt : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattTracLow_D_Falt : 28|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + +BO_ 651 TCU_Send_Signals_FD1: 8 GWM + SG_ TelematicsSrvc_D_St : 47|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1 + SG_ EmgcyCallMute_D_Stat : 39|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ OfbChrgSetSync_D_Rq : 3|2@0+ (1,0) [0|3] "SED" Vector__XXX + +BO_ 529 APIM_Request_Signals_5_FD1: 8 GWM + SG_ OnbChrgToPcWknd_D_Actl : 2|3@0+ (1,0) [0|7] "percent" SOBDMC_HPCM_FD1 + SG_ OnbChrgToPcWkdy_D_Actl : 60|3@0+ (1,0) [0|7] "percent" SOBDMC_HPCM_FD1 + SG_ OnbChrgSetNow_D_Rq : 63|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgSetDelete_B_Rq : 3|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgPrflWknd_No_Rq : 39|24@0+ (1,0) [0|16777215] "unitless" SOBDMC_HPCM_FD1 + SG_ OnbChrgPrflWkdy_No_Rq : 15|24@0+ (1,0) [0|16777215] "unitless" SOBDMC_HPCM_FD1 + SG_ OnbChrgPrflUpdate_B_Rq : 56|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgLocIdUns_B_Rq : 57|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgLocIdTrgt_No_Rq : 7|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1 + +BO_ 66 Global_PATS_Ctrl_Info2_FD1: 8 GWM + SG_ immoControlData_T2 : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" SOBDMC_HPCM_FD1 + SG_ immoControlCmd_T2 : 7|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1 + +BO_ 2610971864 PARSEDPhysGWMtoSOBDMC_FD1: 8 GWM + SG_ PARSEDPhysGWM_ECGtoHPCM : 7|29@0+ (1,0) [0|536870911] "unitless" SOBDMC_HPCM_FD1 + +BO_ 2612002008 PARSEDFuncGWM_ECG_FD1: 8 GWM + SG_ PARSEDFuncGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC,IPMA_ADAS,ECM_Diesel,PCM_HEV,PCM,SOBDMC_HPCM_FD1 + +BO_ 2609923288 OTAPhysGWM_ECGtoSOBDMC_FD1: 8 GWM + SG_ OTAPhysGWM_ECGtoHPCM : 7|29@0+ (1,0) [0|536870911] "unitless" SOBDMC_HPCM_FD1 + +BO_ 2610953432 OTAFuncGWM_ECG_FD1: 8 GWM + SG_ OTAFuncGWM_ECG : 7|29@0+ (1,0) [0|536870911] "unitless" ABS_ESC,IPMA_ADAS,ECM_Diesel,PCM_HEV,PCM,SOBDMC_HPCM_FD1 + +BO_ 2022 TesterPhysicalReqSOBDMC_FD: 64 TSTR + SG_ TesterPhysicalReqSOBDMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" SOBDMC_HPCM_FD1 + +BO_ 1124 APIMGPS_Data_Nav_3_FD1: 8 GWM + SG_ GPS_Vdop : 63|5@0+ (0.2,0) [0|5.8] "unitless" IPMA_ADAS + SG_ GPS_Speed : 47|8@0+ (1,0) [0|253] "MPH" Vector__XXX + SG_ GPS_Sat_num_in_view : 7|5@0+ (1,0) [0|29] "unitless" SOBDMC_HPCM_FD1 + SG_ GPS_MSL_altitude : 15|12@0+ (10,-20460) [-20460|20470] "feet" Vector__XXX + SG_ GPS_Heading : 31|16@0+ (0.01,0) [0|655.33] "Degrees" IPMA_ADAS + SG_ GPS_Hdop : 55|5@0+ (0.2,0) [0|5.8] "unitless" IPMA_ADAS + SG_ GPS_dimension : 2|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1 + +BO_ 1119 Voltage_Power_Data2_FD1: 8 GWM + SG_ CoolFanDcdc_D_Rq : 5|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ DcdcClntFlw_D_Rq : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + +BO_ 132 GlobalClock_Data_FD1: 8 GWM + SG_ GlblClkYr_No_Actl : 7|8@0+ (1,2000) [2000|2255] "year" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GlblClkScnd_No_Actl : 47|8@0+ (1,0) [0|255] "second" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GlblClkMnte_No_Actl : 39|8@0+ (1,0) [0|255] "minute" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GlblClkHr_No_Actl : 55|8@0+ (1,0) [0|255] "hour" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GlblClkDay_No_Actl : 23|16@0+ (1,0) [0|65535] "julian day" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS + +BO_ 1990 TesterPhysicalReqSODR: 64 TSTR + SG_ TesterPhysicalReqSODR : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS + +BO_ 1892 TesterPhysicalReqCCM: 64 TSTR + SG_ TesterPhysicalReqCCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS + +BO_ 1798 TesterPhysicalReqIPMA: 64 TSTR + SG_ TesterPhysicalReqIPMA : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS + +BO_ 1123 APIMGPS_Data_Nav_2_FD1: 8 GWM + SG_ GpsUtcYr_No_Actl : 55|5@0+ (1,2010) [2010|2040] "Year" IPMA_ADAS + SG_ GpsUtcMnth_No_Actl : 47|4@0+ (1,1) [1|15] "Month" IPMA_ADAS + SG_ GpsUtcDay_No_Actl : 37|5@0+ (1,1) [1|32] "Day" IPMA_ADAS + SG_ GPS_UTC_seconds : 23|6@0+ (1,0) [0|59] "seconds" SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GPS_UTC_minutes : 15|6@0+ (1,0) [0|59] "Minutes" IPMA_ADAS + SG_ GPS_UTC_hours : 7|5@0+ (1,0) [0|23] "Hours" IPMA_ADAS + SG_ GPS_Pdop : 31|5@0+ (0.2,0) [0|5.8] "unitless" IPMA_ADAS + SG_ GPS_Compass_direction : 26|4@0+ (1,0) [0|15] "SED" IPMA_ADAS + SG_ GPS_Actual_vs_Infer_pos : 38|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ Gps_B_Falt : 2|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,IPMA_ADAS + +BO_ 1122 APIMGPS_Data_Nav_1_FD1: 8 GWM + SG_ GpsHsphLongEast_D_Actl : 9|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,SOBDMC_HPCM_FD1 + SG_ GpsHsphLattSth_D_Actl : 25|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,SOBDMC_HPCM_FD1 + SG_ GPS_Longitude_Minutes : 46|6@0+ (1,0) [0|61] "Minutes" SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GPS_Longitude_Min_dec : 55|14@0+ (0.0001,0) [0|1.6381] "Minutes" SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GPS_Longitude_Degrees : 39|9@0+ (1,-179) [-179|330] "Degrees" SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GPS_Latitude_Minutes : 15|6@0+ (1,0) [0|61] "Minutes" SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GPS_Latitude_Min_dec : 23|14@0+ (0.0001,0) [0|1.6381] "Minutes" SOBDMC_HPCM_FD1,IPMA_ADAS + SG_ GPS_Latitude_Degrees : 7|8@0+ (1,-89) [-89|164] "Degrees" SOBDMC_HPCM_FD1,IPMA_ADAS + +BO_ 1003 Personality_BCM2_Data_FD1: 8 GWM + SG_ PersRecallSrc_D_Actl : 63|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ Pers4Key_D_Stat : 49|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Pers3Key_D_Stat : 41|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Pers2Key_D_Stat : 43|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Pers1Key_D_Stat : 12|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ EmPrflNo_D_Stat : 52|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ EmPrflKeyAssoc_D_Stat : 55|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ VehKeyActv_D_Stat : 47|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ PersNoPos_D_Actl : 18|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ PersSetupRestr_D_Actl : 21|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PersSetupAccessCtrl : 19|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PersSetup_No_Actl : 31|16@0+ (1,0) [0|65535] "Number" Vector__XXX + SG_ PersConflict_D_Actl : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ AssocConfirm_D_Actl : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ RecallEvent_No_Cnt : 7|8@0+ (1,0) [0|255] "Counts" IPMA_ADAS + SG_ PersNo_D_Actl : 10|3@0+ (1,0) [0|7] "SED" ABS_ESC,IPMA_ADAS + +BO_ 994 Personality_APIM_Data_FD1: 8 GWM + SG_ PersStore_D_Rq : 36|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ Pers4OptIn_B_Stats : 43|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Pers3OptIn_B_Stats : 33|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Pers2OptIn_B_Stats : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Pers1OptIn_B_Stats : 44|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CtrStkPersIndex_D_Actl : 39|3@0+ (1,0) [0|7] "SED" ABS_ESC,IPMA_ADAS + SG_ CtrStkFeatNoActl : 23|16@0+ (1,0) [0|65535] "Undefined" ABS_ESC,IPMA_ADAS + SG_ CtrStkFeatConfigActl : 7|16@0+ (1,0) [0|65535] "Undefined" ABS_ESC,IPMA_ADAS + SG_ CtrStkDsplyOp_D_Rq : 47|3@0+ (1,0) [0|7] "SED" ABS_ESC,IPMA_ADAS + +BO_ 778 ParkAid_Aud_Warn_CmdM_FD1: 8 GWM + SG_ PrkAidFront_D_RqDrv : 5|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ PrkAidAcsyRear_D_RqDrv : 13|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ PrkAidAcsyFront_D_RqDrv : 15|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ Cta_D_Rq : 1|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ PrkAidRear_D_RqDrv : 3|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ SteEffort_D_Rq : 10|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ Sod_D_Rq : 7|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + +BO_ 549 IPC_Infotainment_FD1: 8 GWM + SG_ Veh_V2_Dsply : 39|9@0+ (1,0) [0|511] "unitless" IPMA_ADAS + SG_ IPC_MyKeyVolLimit_St : 9|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ HdcOn_B_Rq : 19|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ IPC_Attn_Info_Audio : 4|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ BeltminderAudioMute : 6|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Power_Up_Chime_Modules : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Chime_Source : 15|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ IPC_New_Attn_Event : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 551 APIM_Request_Signals_1_FD1: 8 GWM + SG_ PmCabnLvl_D_Stat : 36|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ PmCabn_D_Stat : 38|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Cntr_Plg_Mode_Cmd : 39|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ChrgCrdLckEnbl_B_Stat : 47|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PwRnngBoardT_D_Rq : 25|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PwRnngBoardSwtch_D_Rq : 27|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PwRnngBoardMde_D_Rq : 29|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Btt_L_Actl2 : 55|7@0+ (0.1,0) [0|12.5] "meter" IPMA_ADAS + SG_ Rba_D_Rq : 31|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ EmPrflNo_D_Rq : 61|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ EmPrflButtnAssoc_D_Rq : 33|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ EmPrflKeyAssoc_D_Rq : 46|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ Em_D_Stat : 63|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ ChrgOvrdExitScrn_D_Rq : 58|2@0+ (1,0) [0|3] "SED" Vector__XXX + +BO_ 1010 IPMA_Data3: 8 IPMA_ADAS + SG_ MbdblActv_B_RqAdas : 48|1@0+ (1,0) [0|1] "SED" GWM + SG_ CbdblActv_B_RqAdas : 49|1@0+ (1,0) [0|1] "SED" GWM + SG_ AdbUrbanArea_B_Stat : 40|1@0+ (1,0) [0|1] "SED" GWM + SG_ LightRng_L_Max : 55|6@0+ (2,0) [0|126] "meter" GWM + SG_ LightPathOffst_L_Actl : 31|10@0+ (0.01,-5.12) [-5.12|5.11] "meter" GWM + SG_ LightPath_An_Actl : 12|11@0+ (0.0005,-0.5) [-0.5|0.5235] "radians" GWM + SG_ LightCurv_NoRate_Actl : 37|13@0+ (2.5E-007,-0.001024) [-0.001024|0.00102375] "1/meter" GWM + SG_ LightCurv_No_Actl : 7|11@0+ (2E-005,-0.02) [-0.02|0.02094] "1/meter" GWM + +BO_ 1070 Battery_Mgmt_24V_FD1: 8 GWM + SG_ BattULo24_D_Falt : 55|2@0+ (1,0) [0|3] "SED" PCM + SG_ BattULo24_Te_Actl : 47|7@0+ (1,-40) [-40|86] "degC" PCM + SG_ BattULo24State_D_Qlty : 25|2@0+ (1,0) [0|3] "SED" PCM + SG_ BattULo24Soc_Pc_Actl : 39|7@0+ (1,0) [0|127] "percent" PCM + SG_ BattULo24_I_Actl : 23|14@0+ (0.0625,-512) [-512|511.875] "ampere" PCM + SG_ BattULo24_B_Falt : 8|1@0+ (1,0) [0|1] "SED" PCM + SG_ BattULo24_Ah_DeltaRide : 7|15@0+ (0.0078125,-100) [-100|155.9921875] "amperehour" PCM + +BO_ 1186 Driveline_Data_2: 8 TCCM + SG_ SelDrvMdeAwd2_D_Stat : 31|5@0+ (1,0) [0|31] "SED" ABS_ESC,GWM + SG_ RearDiffLckMsg_D_Rq : 20|3@0+ (1,0) [0|7] "SED" GWM + SG_ RearDiffLckLamp_D_Rq : 11|2@0+ (1,0) [0|3] "SED" VDM,GWM,ABS_ESC + SG_ RearDiffLck_Tq_Actl : 7|12@0+ (1,0) [0|4093] "Nm" ABS_ESC,ECM_Diesel,PCM,PCM_HEV,GWM + SG_ RearDiffFalt_D_Stat : 23|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + SG_ LsdSrvcRqd_B_Rq : 21|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 611 Driveline_Data_1: 8 TCCM + SG_ AwdSys_D_Stat : 27|2@0+ (1,0) [0|3] "SED" GWM,ECM_Diesel,PCM,PCM_HEV + SG_ AwdStat_D_RqDsply : 63|5@0+ (1,0) [0|31] "SED" TCM_DSL,ABS_ESC,GWM + SG_ AwdLck_D_Stat : 31|4@0+ (1,0) [0|15] "SED" TCM_DSL,GWM,ABS_ESC + SG_ AwdSrvcRqd_B_Rq : 0|1@0+ (1,0) [0|1] "SED" GWM,PCM,PCM_HEV,TCM_DSL,ABS_ESC + SG_ NtrlTowAvail_B_Stat : 4|1@0+ (1,0) [0|1] "SED" GWM + SG_ AwdLck_Tq_Rq : 15|12@0+ (1,0) [0|4093] "Nm" PCM_HEV,GWM,ABS_ESC + SG_ TrnAout_Tq_RqMx : 47|13@0+ (1,-1250) [-1250|6941] "Nm" GWM,ECM_Diesel,PCM,PCM_HEV + SG_ AwdOffRoadMode_D_Stats : 25|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM + SG_ AwdLoLamp_D_RqDsply : 35|2@0+ (1,0) [0|3] "SED" GWM + SG_ AwdHiLamp_D_RqDsply : 19|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC + SG_ AwdAutoLamp_D_RqDsply : 17|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC + SG_ Awd2wdLamp_D_RqDsply : 2|2@0+ (1,0) [0|3] "SED" GWM + SG_ AwdRnge_D_Actl : 7|3@0+ (1,0) [0|7] "SED" VDM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,ABS_ESC,GWM,IPMA_ADAS + +BO_ 1461 PSCM_AutoSar_NetwrkMgmt: 8 PSCM + SG_ PSCM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC + SG_ PSCM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC + SG_ PSCM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC + SG_ PSCM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC + SG_ PSCM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC + SG_ PSCM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC + SG_ PSCM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC + SG_ PSCM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" GWM,ABS_ESC + +BO_ 1047 TrailerAid_Data2: 8 PSCM + SG_ TrlrAnOffst_An2_Calc : 39|8@0+ (0.5,-64) [-64|63.5] "degrees" IPMA_ADAS + SG_ TrlrAn_An_WarnCalc : 28|5@0+ (1,0) [0|31] "degrees" IPMA_ADAS + SG_ TrlrAn_An_MxCalc : 55|7@0+ (1,0) [0|127] "degrees" IPMA_ADAS + SG_ TrlrAidTrlrId_No_Rq : 63|4@0+ (1,0) [0|15] "unitless" GWM + SG_ TrlrAidTrgtId_No_Rq : 44|5@0+ (1,0) [0|31] "unitless" IPMA_ADAS + SG_ TrlrAidSetup_D2_Stat : 47|3@0+ (1,0) [0|7] "SED" IPMA_ADAS + SG_ TrlrAidEnbl_D2_Stat : 31|3@0+ (1,0) [0|7] "SED" ABS_ESC,IPMA_ADAS,GWM,PCM,ECM_Diesel + SG_ TrlrAidMsgTxt_D2_Rq : 14|6@0+ (1,0) [0|63] "SED" IPMA_ADAS,GWM,ABS_ESC + SG_ EsaOn_B_Stat : 23|1@0+ (1,0) [0|1] "SED" GWM + SG_ HitchToTrlrAxle_L_Calc : 7|9@0+ (0.0254,0) [0|12.9794] "meter" IPMA_ADAS + SG_ SelDrvMdeSte_D_Stat : 17|2@0+ (1,0) [0|3] "SED" ABS_ESC + +BO_ 972 Lane_Assist_Data3_FD1: 8 PSCM + SG_ LatCtlSte_D_Stat : 18|3@0+ (1,0) [0|7] "SED" IPMA_ADAS,GWM + SG_ LatCtlLim_D_Stat : 33|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM + SG_ LatCtlCpblty_D_Stat : 39|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM + SG_ LatCtlCpbltyDStat_No_Cnt : 37|4@0+ (1,0) [0|15] "Unitless" IPMA_ADAS,GWM + SG_ LatCtlCpbltyDStat_No_Cs : 47|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM + SG_ TrlrAn_An_TrgtCalc : 31|8@0+ (1,-128) [-128|127] "degrees" IPMA_ADAS + SG_ LsmcBrkDecelEnbl_D_Rq : 1|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ TjaHandsOnCnfdnc_B_Est : 3|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ LaHandsOff_B_Actl : 7|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ LaActDeny_B_Actl : 6|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ LaActAvail_D_Actl : 5|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM + SG_ LsmcBrk_Tq_Rq : 15|13@0+ (4,0) [0|32764] "Nm" ABS_ESC + +BO_ 130 EPAS_INFO: 8 PSCM + SG_ TrlrHitchLamp_D_Rqst : 24|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ VehVTrlrAid_B_Rq : 25|1@0+ (1,0) [0|1] "SED" PCM_HEV,GWM,ECM_Diesel,PCM + SG_ Veh_V_RqMxTrlrAid : 63|8@0+ (0.1,0) [0|25.5] "km/h" PCM_HEV,GWM,ECM_Diesel,PCM + SG_ DrvSteActv_B_Stat : 10|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ DrvSte_Tq_Actl : 47|8@0+ (0.0625,-8) [-8|7.8125] "Nm" GWM,ABS_ESC + SG_ SteMdule_D_Stat : 55|3@0+ (1,0) [0|7] "SED" GWM + SG_ SteMdule_U_Meas : 39|8@0+ (0.05,6) [6|18.7] "Volts" GWM + SG_ SteMdule_I_Est : 21|12@0+ (0.05,-64) [-64|140.7] "Amps" GWM + SG_ EPAS_Failure : 9|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM + SG_ SteeringColumnTorque : 7|8@0+ (0.0625,-8) [-8|7.8125] "Nm" GWM,IPMA_ADAS,ABS_ESC + SG_ SAPPAngleControlStat6 : 15|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + SG_ SAPPAngleControlStat5 : 14|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + SG_ SAPPAngleControlStat4 : 13|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + SG_ SAPPAngleControlStat3 : 12|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + SG_ SAPPAngleControlStat2 : 11|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + SG_ SAPPAngleControlStat1 : 23|2@0+ (1,0) [0|3] "SED" GWM,IPMA_ADAS + +BO_ 126 SteeringPinion_Data: 8 PSCM + SG_ StePw_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM + SG_ StePinRelInit_An_Sns : 7|16@0+ (0.1,-3200) [-3200|3353.3] "degrees" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM + SG_ StePinCompAnEst_D_Qf : 43|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM + SG_ StePinComp_An_Est : 22|15@0+ (0.1,-1600) [-1600|1676.7] "degrees" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM + SG_ StePinAn_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" VDM,ABS_ESC,TCCM,GWM + SG_ StePinAn_No_Cnt : 47|4@0+ (1,0) [0|15] "unitless" VDM,TCCM,GWM,ABS_ESC + +BO_ 133 SteeringPinion_Data_Alt: 8 PSCM + SG_ StePw_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM + SG_ StePinRelInit_An_Sns : 7|16@0+ (0.1,-3200) [-3200|3353.3] "degrees" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM + SG_ StePinCompAnEst_D_Qf : 43|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM + SG_ StePinComp_An_Est : 22|15@0+ (0.1,-1600) [-1600|1676.7] "degrees" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM + SG_ StePinAn_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" VDM,ABS_ESC,TCCM,GWM + SG_ StePinAn_No_Cnt : 47|4@0+ (1,0) [0|15] "unitless" VDM,TCCM,GWM,ABS_ESC + +BO_ 1430 ABS_AutoSar_NetworkMgt: 8 ABS_ESC + SG_ ABS_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" GWM + SG_ ABS_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" GWM + SG_ ABS_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" GWM + SG_ ABS_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" GWM + SG_ ABS_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" GWM + SG_ ABS_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" GWM + SG_ ABS_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" GWM + SG_ ABS_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" GWM + +BO_ 1200 ABS_BrkBst_Data: 8 ABS_ESC + SG_ BrkHold_D_Stat : 34|3@0+ (1,0) [0|7] "SED" ECM_Diesel,GWM,IPMA_ADAS,PCM,PCM_HEV + SG_ HsaTrnAout_Tq_Rq : 23|16@0+ (4,-131072) [-131072|131060] "Nm" GWM + SG_ BrkBstrVac_P_Actl : 7|7@0+ (8,0) [0|1008] "Millibar" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ YawStabilityIndex : 0|9@0+ (1,-256) [-256|255] "%" VDM,IPMA_ADAS,PSCM,GWM + SG_ BrkTot_Tq_RqDrv : 47|13@0+ (4,0) [0|32760] "Nm" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM,TCCM,PSCM + SG_ BrkTotTqRqDrv_No_Cnt : 39|4@0+ (1,0) [0|15] "unitless" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ BrkTotTqRqDrv_No_Cs : 63|8@0+ (1,0) [0|255] "unitless" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ HsaStat_D_Dsply : 50|3@0+ (1,0) [0|7] "SED" GWM + +BO_ 1102 SelectDriveModeData2: 8 ABS_ESC + SG_ SelDrvMdePos12_D_Stat : 34|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos11_D_Stat : 45|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos10_D_Stat : 55|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos09_D_Stat : 50|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos08_D_Stat : 61|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos07_D_Stat : 39|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos06_D_Stat : 29|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos05_D_Stat : 18|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos04_D_Stat : 23|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos03_D_Stat : 13|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos02_D_Stat : 2|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePos01_D_Stat : 7|5@0+ (1,0) [0|31] "SED" GWM + +BO_ 1056 SelectDriveModeData: 8 ABS_ESC + SG_ AutoEpbMsgTxt_D_Rq : 58|3@0+ (1,0) [0|7] "SED" GWM + SG_ AutoEpbDsply_D_Stat : 37|2@0+ (1,0) [0|3] "SED" GWM + SG_ AutoEpbButtnOn_B_Stat : 48|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos12_B_Avail : 54|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos11_B_Avail : 55|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos10_B_Avail : 40|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos09_B_Avail : 41|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos08_B_Avail : 42|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos07_B_Avail : 43|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos06_B_Avail : 44|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos05_B_Avail : 45|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos04_B_Avail : 46|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos03_B_Avail : 47|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos02_B_Avail : 32|1@0+ (1,0) [0|1] "SED" GWM + SG_ SelDrvMdePos01_B_Avail : 24|1@0+ (1,0) [0|1] "SED" GWM + SG_ ActvDrvMde_D2_Stat : 53|5@0+ (1,0) [0|31] "SED" IPMA_ADAS,GWM + SG_ SelDrvMde_D2_Rq : 63|5@0+ (1,0) [0|31] "SED" GWM + SG_ SelDrvMdePt_D_Rq : 31|5@0+ (1,0) [0|31] "SED" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ SelDrvMdeMsgTxt_D_Rq : 19|4@0+ (1,0) [0|15] "SED" GWM + SG_ SelDrvMde_D_Stat : 26|2@0+ (1,0) [0|3] "SED" GWM + SG_ AwdMde_D_RqBrk : 35|3@0+ (1,0) [0|7] "SED" GWM + +BO_ 1054 BrakeSysFeatures_3: 8 ABS_ESC + SG_ AirDamUp_B_RqBrk : 32|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM_HEV,PCM + SG_ RbaBrk_D_Stat : 63|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM + SG_ SelDrvMdeChassis2_D_Rq : 45|5@0+ (1,0) [0|31] "SED" PSCM,GWM + SG_ TrailCtl_D_Stat : 55|3@0+ (1,0) [0|7] "SED" TCCM,PCM,GWM + SG_ TrailCtlMsgTxt_D_Rq : 52|4@0+ (1,0) [0|15] "SED" GWM + SG_ BrkBstrVac_D_Stat : 18|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ DrvSlipCtlOffLamp_D_Rq : 23|2@0+ (1,0) [0|3] "SED" GWM + SG_ DrvSlipCtlMdeMsg_D_Rq : 13|5@0+ (1,0) [0|31] "SED" GWM + SG_ AutoHoldMsgTxt_D_Rq : 4|4@0+ (1,0) [0|15] "SED" GWM + SG_ CtaBrk_D_Stat : 47|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM + SG_ SelDrvMdeAwd_D_Rq : 29|5@0+ (1,0) [0|31] "SED" TCCM,GWM + SG_ AutoHoldSwMde_B_Ind : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ AutoHoldMde_D_Ind : 15|2@0+ (1,0) [0|3] "SED" GWM + SG_ SelDrvMdeChassis_D_Rq : 39|5@0+ (1,0) [0|31] "SED" VDM,GWM + SG_ ApaBrk_D_Stat : 34|2@0+ (1,0) [0|3] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,GWM + +BO_ 1046 BrakeSysFeatures_2: 8 ABS_ESC + SG_ HsaMde_D_Mem : 33|2@0+ (1,0) [0|3] "SED" GWM + SG_ BrkBstrVac_B_Rq : 27|1@0+ (1,0) [0|1] "Discrete" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ HdcMde_D_Actl : 31|3@0+ (1,0) [0|7] "SED" GWM + SG_ RearDiffLck_Tq2_RqMx : 51|12@0+ (4,0) [0|16376] "Nm" GWM + SG_ TRLR_SWAY_EVNT_IN_PROG : 25|1@0+ (1,0) [0|1] "SED" GWM + SG_ TRLR_SWAY_CONFIG_STAT : 26|1@0+ (1,0) [0|1] "SED" GWM + SG_ TCMode : 15|1@0+ (1,0) [0|1] "SED" VDM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM + SG_ DrvSlipCtlLamp_D_Rq : 42|2@0+ (1,0) [0|3] "SED" VDM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM + SG_ Abs_B_Falt : 5|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ DrvSlipCtlMde_D_Ind : 44|2@0+ (1,0) [0|3] "SED" TCCM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM + SG_ DrvAntiLckLamp_D_Rq : 55|2@0+ (1,0) [0|3] "SED" ECM_Diesel,GWM,IPMA_ADAS + SG_ BpedMove_No_Cnt : 3|4@0+ (1,0) [0|15] "Unitless" ECM_Diesel,GWM + SG_ StabCtlBrk_B_Avail : 4|1@0+ (1,0) [0|1] "SED" VDM,TCCM,GWM + SG_ DrvHdcWarnInfo_D_Rq : 35|2@0+ (1,0) [0|3] "SED" GWM + SG_ DrvHdcMsg_D_Rq : 10|3@0+ (1,0) [0|7] "SED" GWM + SG_ DrvHdcLampInfo_D_Rq : 12|2@0+ (1,0) [0|3] "SED" GWM + SG_ BpedMove_D_Actl : 7|2@0+ (1,0) [0|3] "SED" ECM_Diesel,GWM + SG_ ChimeBrk_B_Rq : 14|1@0+ (1,0) [0|1] "SED" GWM + SG_ BrkLamp_B_Rq : 13|1@0+ (1,0) [0|1] "SED" GWM + SG_ HILL_DESC_MC : 47|3@0+ (1,0) [0|7] "SED" GWM + SG_ RearDiffElckrOpen_B_Rq : 40|1@0+ (1,0) [0|1] "SED" GWM,TCCM + +BO_ 1045 BrakeSysFeatures: 8 ABS_ESC + SG_ VehStab_D_Stat : 55|4@0+ (1,0) [0|15] "SED" TCCM,PCM_HEV,PCM,GWM + SG_ BrkFluidLvl_D_Stat : 17|2@0+ (1,0) [0|3] "SED" GWM + SG_ LsmcBrkDecel_D_Stat : 39|3@0+ (1,0) [0|7] "SED" PSCM,GWM + SG_ VehYawNonLin_W_Rq : 51|12@0+ (0.03663,-75) [-75|74.92659] "deg/s" ECM_Diesel,GWM + SG_ VehYawLin_W_Rq : 35|12@0+ (0.03663,-75) [-75|74.92659] "deg/s" ECM_Diesel,GWM + SG_ VehVActlBrk_No_Cs : 31|8@0+ (1,0) [0|255] "Unitless" TCCM,CMR_DSMC,SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV,PSCM,TCM_DSL,GWM,IPMA_ADAS + SG_ Veh_V_ActlBrk : 7|16@0+ (0.01,0) [0|655.35] "kph" TCCM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,PSCM,TCM_DSL,GWM + SG_ VehVActlBrk_No_Cnt : 21|4@0+ (1,0) [0|15] "Unitless" TCCM,CMR_DSMC,SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV,PSCM,TCM_DSL,GWM,IPMA_ADAS + SG_ VehVActlBrk_D_Qf : 23|2@0+ (1,0) [0|3] "SED" TCCM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,PSCM,TCM_DSL,GWM + +BO_ 1044 BrakeSnData_6: 8 ABS_ESC + SG_ StePinOffst_An_Est : 7|16@0+ (0.1,-3200) [-3200|3353.3] "degrees" GWM,PSCM + SG_ StePinOffst_No_Cs : 31|8@0+ (1,0) [0|255] "Unitless" GWM,PSCM + SG_ StePinOffst_No_Cnt : 21|4@0+ (1,0) [0|15] "unitless" GWM,PSCM + SG_ StePinOffst_D_Stat : 23|2@0+ (1,0) [0|3] "SED" GWM,PSCM + +BO_ 1042 TrailerBrakeData: 8 ABS_ESC + SG_ VehRol_An_Dsply : 31|7@0+ (1,-64) [-64|61] "degrees" GWM + SG_ VehPtch_An_Dsply : 23|7@0+ (1,-64) [-64|61] "degrees" GWM,TCCM + SG_ TrlrBrk_Pc_Rq : 14|7@0+ (1,0) [0|127] "percent" GWM + +BO_ 535 WheelSpeed: 8 ABS_ESC + SG_ WhlRr_W_Meas : 54|15@0+ (0.01,0) [0|327.65] "rad/s" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL + SG_ WhlRl_W_Meas : 38|15@0+ (0.01,0) [0|327.65] "rad/s" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL + SG_ WhlFr_W_Meas : 22|15@0+ (0.01,0) [0|327.65] "rad/s" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL + SG_ WhlFl_W_Meas : 6|15@0+ (0.01,0) [0|327.65] "rad/s" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL + +BO_ 534 WheelData: 8 ABS_ESC + SG_ BrkObdData_No_Actl : 63|8@0+ (1,0) [0|255] "unitless" SOBDMC_HPCM_FD1,GWM + SG_ BrkObdIndex_No_Actl : 53|6@0+ (1,0) [0|63] "unitless" SOBDMC_HPCM_FD1,GWM + SG_ WhlRotatRr_No_Cnt : 23|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM,PSCM + SG_ WhlDirRr_D_Actl : 33|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,ECM_Diesel,PCM_HEV,PSCM + SG_ WhlDirRl_D_Actl : 39|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,PSCM,ECM_Diesel,PCM_HEV + SG_ WhlDirFr_D_Actl : 37|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,ECM_Diesel,PCM_HEV,PSCM + SG_ WhlDirFl_D_Actl : 35|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,ECM_Diesel,PCM_HEV,PSCM + SG_ WhlRotatRl_No_Cnt : 31|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM,PSCM + SG_ WhlRotatFr_No_Cnt : 7|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM,PSCM + SG_ WhlRotatFl_No_Cnt : 15|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,GWM,PSCM + +BO_ 532 DesiredTorqBrk_2: 8 ABS_ESC + SG_ RgenTqFalt_B_Actl : 59|1@0+ (1,0) [0|1] "SED" GWM,PCM_HEV + SG_ RgenBrkDynoMde_B_Actl : 58|1@0+ (1,0) [0|1] "SED" GWM,PCM_HEV + SG_ PrplWhlTqRqMn_No_Cs : 55|8@0+ (1,0) [0|255] "Unitless" GWM,ECM_Diesel,PCM,PCM_HEV + SG_ PrplWhlTot_Tq_RqMn : 7|16@0+ (4,-131072) [-131072|131068] "Nm" GWM,ECM_Diesel,PCM,PCM_HEV + SG_ PrplWhlTqRqMn_No_Cnt : 63|4@0+ (1,0) [0|15] "Unitless" GWM,ECM_Diesel,PCM,PCM_HEV + +BO_ 531 DesiredTorqBrk: 8 ABS_ESC + SG_ VehStop_D_Stat : 28|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM + SG_ TracCtlPtActv_B_Actl : 31|1@0+ (1,0) [0|1] "SED" VDM,IPMA_ADAS,TCCM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM + SG_ LscmbbMntr_B_Err : 17|1@0+ (1,0) [0|1] "SED" GWM + SG_ LscmbbBrkDis_B_Actl : 19|1@0+ (1,0) [0|1] "SED" GWM + SG_ LscmbbDeny_B_ActlBrk : 18|1@0+ (1,0) [0|1] "SED" GWM + SG_ PrkBrkYwLamp_D_Rq : 38|2@0+ (1,0) [0|3] "SED" GWM + SG_ PrkBrkRedLamp_D_Rq : 30|2@0+ (1,0) [0|3] "SED" GWM + SG_ LscmbbBrkDecel_B_Actl : 20|1@0+ (1,0) [0|1] "SED" GWM + SG_ AbsActv_B_Actl : 45|1@0+ (1,0) [0|1] "SED" VDM,SOBDMC_HPCM_FD1,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,GWM + SG_ StabCtlBrkActv_B_Actl : 23|1@0+ (1,0) [0|1] "SED" VDM,IPMA_ADAS,PCM,PCM_HEV,TCM_DSL,PSCM,TCCM,ECM_Diesel,GWM + SG_ CmbbBrkPrchg_B_Actl : 59|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ CmbbBrkDecel_B_Actl : 58|1@0+ (1,0) [0|1] "SED" CMR_DSMC,IPMA_ADAS,GWM + SG_ CmbbBaSensInc_B_Actl : 57|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ AccBrkWarm_B_Actl : 63|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ AccBrkTotTqMn_B_Actl : 62|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ AccBrkPrchgActv_B_Actl : 61|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ AccBrkDis_B_Actl : 44|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ AccBrkDeny_B_Actl : 42|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM + SG_ AccBrkActv_B_Actl : 43|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,ECM_Diesel,GWM + SG_ PrplDrgCtlActv_B_Actl : 46|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM + SG_ PrplWhlTot_Tq_RqMx : 7|16@0+ (4,-131072) [-131072|131068] "Nm" ECM_Diesel,PCM,PCM_HEV,TCCM,GWM + SG_ LscmbbBaSensInc_B_Actl : 21|1@0+ (1,0) [0|1] "SED" GWM + SG_ CmbbBrkDis_B_Actl : 56|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PSCM,GWM + SG_ CmbbDeny_B_ActlBrk : 60|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PSCM,ECM_Diesel,PCM,PCM_HEV,GWM + SG_ CcDis_B_Cmd : 47|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,GWM + SG_ VehLongOvrGnd_A_Est : 41|10@0+ (0.035,-17.9) [-17.9|17.835] "m/s^2" VDM,IPMA_ADAS,TCCM,GWM + SG_ LscmbBrkPrchg_B_Actl : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ AccStopActv_B_ActlBrk : 22|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,GWM + SG_ AccDis_B_ActlEpb : 32|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ PrkBrkMsgTxt_D_Rq : 36|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkBrkStatus : 26|3@0+ (1,0) [0|7] "SED" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM + +BO_ 136 ActiveFronSteering_Req: 8 ABS_ESC + SG_ SteWhlBrkOffst_An_Rq : 7|15@0+ (0.1,-1600) [-1600|1676.5] "degrees" GWM + SG_ SteWhlBrkAnRq_No_Cs : 23|8@0+ (1,0) [0|255] "Unitless" GWM + SG_ SteWhlBrkAnRq_No_Cnt : 31|4@0+ (1,0) [0|15] "Unitless" GWM + +BO_ 125 BrakeSnData_4: 8 ABS_ESC + SG_ VehRolComp_W_Actl : 51|12@0+ (0.03663,-75) [-75|74.92659] "degrees/sec" VDM,GWM + SG_ VehVertComp_A_Actl : 45|10@0+ (0.035,-17.9) [-17.9|17.835] "m/s^2" VDM,PSCM,GWM + SG_ BrkTotTqRqArb_No_Cs : 23|8@0+ (1,0) [0|255] "Unitless" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ BrkTotTqRqArb_No_Cnt : 31|4@0+ (1,0) [0|15] "Unitless" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ BrkTot_Tq_RqArb : 4|13@0+ (4,0) [0|32756] "Nm" VDM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,GWM + SG_ BrkTot_Tq_Actl : 27|13@0+ (4,0) [0|32756] "Nm" ECM_Diesel,PCM,PCM_HEV,PSCM,GWM,TCCM + SG_ HsaStat_D_Actl : 7|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM + +BO_ 119 BrakeSnData_3: 8 ABS_ESC + SG_ VehTrvlDir_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM + SG_ VehOverGnd_V_Est : 7|16@0+ (0.01,0) [0|655.33] "kph" VDM,IPMA_ADAS,TCCM,PSCM,GWM + SG_ VehLongComp_A_Actl : 49|10@0+ (0.035,-17.9) [-17.9|17.835] "m/s^2" VDM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,GWM + SG_ VehLatComp_A_Actl : 43|10@0+ (0.035,-17.9) [-17.9|17.835] "m/s^2" VDM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,TCCM,GWM + SG_ VehYawComp_W_Actl : 19|12@0+ (0.03663,-75) [-75|74.92659] "deg/s" VDM,TCCM,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,PSCM,GWM + +BO_ 118 BrakeSnData_5: 8 ABS_ESC + SG_ BrkCtrFnd_B_Stat : 39|1@0+ (1,0) [0|1] "SED" GWM + SG_ AwdLck_Tq_RqMx : 35|12@0+ (1,0) [0|4095] "Nm" GWM,TCCM + SG_ AwdLck_Tq_RqMn : 51|12@0+ (1,0) [0|4095] "Nm" GWM,TCCM + SG_ DrvSte_D_Stat : 19|4@0+ (1,0) [0|15] "SED" PSCM,GWM + SG_ DrvSte_Tq_Rq : 31|8@0+ (0.0625,-8) [-8|7.8125] "Nm" PSCM,GWM + SG_ EmgcyBrkLamp_D_Rq : 21|2@0+ (1,0) [0|3] "SED" GWM + SG_ StopLamp_B_RqBrk : 7|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 73 Global_PATS_SubTarget: 8 ABS_ESC + SG_ immoSubTarget1Data_T1 : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" ECM_Diesel,GWM,PCM,PCM_HEV + SG_ immoSubTarget1Cmd_T1 : 7|3@0+ (1,0) [0|7] "SED" ECM_Diesel,GWM,PCM,PCM_HEV + +BO_ 1034 GGCC_Config_Mgmt_ID_1_FD1: 8 GWM + SG_ VehicleGGCCData : 7|64@0+ (1,0) [0|1.84467E+019] "mixed" VDM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,ECM_Diesel,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL + +BO_ 1440 TCM_AutoSar_NetworkMgt: 8 TCM_DSL + SG_ TCM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX + +BO_ 561 TransGearData_2: 8 TCM_DSL + SG_ TrnMsgTxt2_D_Rq : 39|3@0+ (1,0) [0|7] "SED" GWM + SG_ TrnMsgTxt_D_Rq : 23|4@0+ (1,0) [0|15] "SED" GWM + +BO_ 330 TransData_3: 8 TCM_DSL + SG_ TrnAout_W_ActlUnfilt : 22|15@0+ (0.1,0) [0|3276.5] "rad/s" ECM_Diesel,GWM + +BO_ 1090 MtrTrac_Data2_FD1: 8 PCM_HEV + SG_ Mtr2State_D_ActlMntr : 31|3@0+ (1,0) [0|7] "SED" GWM + SG_ Inv1Ain_I_ActlMntr : 7|15@0+ (0.1,-1000) [-1000|2276.5] "ampere" GWM + SG_ HybVehMde_D_ActlMntr : 20|3@0+ (1,0) [0|7] "SED" GWM + SG_ ChrgStat_D_ActlMntr : 23|3@0+ (1,0) [0|7] "SED" GWM + SG_ VehElRnge_L_Dsply : 28|12@0+ (0.1,0) [0|409.3] "kilometer" GWM + +BO_ 870 Cluster_HEV_Data3_FD1: 8 PCM_HEV + SG_ EngMdeMsgTxt_D_Rq : 12|3@0+ (1,0) [0|7] "SED" GWM + SG_ EffRgenThres_Pc_Dsply : 9|10@0+ (0.1,-102.3) [-102.3|0] "percent" GWM + SG_ RngPerChrgInst_L_Dsply : 45|12@0+ (0.1,0) [0|409.3] "km" GWM + +BO_ 869 Cluster_HEV_Data2: 8 PCM_HEV + SG_ PwrFlowTxt_D_Dsply : 21|4@0+ (1,0) [0|15] "SED" GWM + SG_ EngOnMsg2_D_Dsply : 54|5@0+ (1,0) [0|31] "SED" GWM + SG_ EngOnMsg1_D_Dsply : 38|5@0+ (1,0) [0|31] "SED" GWM + SG_ FuelMaintMde_D_Dsply : 23|2@0+ (1,0) [0|3] "SED" GWM + SG_ EffWhlLvl2_Pc_Dsply : 17|10@0+ (0.2,-102.2) [-102.2|102.4] "percent" GWM + SG_ EffWhlThres_Pc_Dsply : 49|10@0+ (0.1,0) [0|102.3] "percent" GWM + SG_ EngPwLvl_Pc_Dsply : 1|10@0+ (0.1,0) [0|102.3] "percent" GWM + SG_ EngActv_B_Dsply : 2|1@0+ (1,0) [0|1] "SED" GWM + SG_ EffWhlThresOn_B_Dsply : 3|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 606 HEV_Powertrain_Data8_FD1: 8 PCM_HEV + SG_ ElVehLaterMde_D_Stat : 7|2@0+ (1,0) [0|3] "SED" GWM + SG_ ElVehNowMde_D_Stat : 5|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 374 PowertrainData_10: 8 PCM + SG_ GearEngag_D_Actl : 47|3@0+ (1,0) [0|7] "SED" GWM + SG_ TrnRng_D_Rq : 27|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,PSCM,ECM_Diesel,GWM + SG_ TrnPrkSys_D_Actl : 31|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,ECM_Diesel,GWM + SG_ GearLvr_D_ActlDrv : 7|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,TCCM,ECM_Diesel,GWM + SG_ GearPos_No_Cs : 23|8@0+ (1,0) [0|255] "unitless" SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,ECM_Diesel,GWM + SG_ GearPos_D_Trg : 15|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,TCCM,ECM_Diesel,GWM + SG_ GearPos_No_Cnt : 11|4@0+ (1,0) [0|15] "unitless" SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,ECM_Diesel,GWM + SG_ TrnIgnOffDly_T_Rq : 39|8@0+ (4,0) [0|1020] "ms" GWM + SG_ GearPos_D_Actl : 3|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1,PSCM,IPMA_ADAS,ABS_ESC,ECM_Diesel,GWM + +BO_ 603 HEV_Powertrain_Data2: 8 PCM_HEV + SG_ WhlDirAvgDrv_D_Actl : 6|2@0+ (1,0) [0|3] "SED" ABS_ESC,IPMA_ADAS,GWM + SG_ PrplTqMnRgen_B_Actl : 7|1@0+ (1,0) [0|1] "SED" ABS_ESC,GWM + SG_ BattTracCnnct_D_Rq : 20|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 602 HEV_Powertrain_Data: 8 PCM_HEV + SG_ HtrnWarnLamp_B_Dsply : 3|1@0+ (1,0) [0|1] "SED" GWM + SG_ HybPwLimOn_B_Stat : 7|1@0+ (1,0) [0|1] "SED" GWM + SG_ PwPckTqRdy_B_Dsply : 31|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 1152 HEV_Powertrain_Data6: 8 PCM_HEV + SG_ BattTracDiagClr_B_Stat : 2|1@0+ (1,0) [0|1] "SED" GWM + SG_ EngTeHi_B_Actl : 5|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,GWM + SG_ DcdcOn_B_Rq : 6|1@0+ (1,0) [0|1] "SED" GWM + SG_ ULoBattSpprtSustn_B_Rq : 7|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,GWM + SG_ VehElEff_No_Avg : 15|7@0+ (10,-100) [-100|1150] "watt*hr/km" SOBDMC_HPCM_FD1,GWM + +BO_ 872 Cluster_HEV_Data5: 8 PCM_HEV + SG_ PlgActvArb_B_Dsply : 51|1@0+ (1,0) [0|1] "SED" GWM + SG_ HybMdeStat_D_Dsply : 39|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1,GWM + +BO_ 560 TransGearData: 8 TCM_DSL + SG_ SelDrvMdeSwtch_D_Stat3 : 15|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC + SG_ TrnSrvcRqd_B_Rq : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ TrnShifActv_B_Actl : 0|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC,ECM_Diesel + SG_ GearLvrPos_D_Actl : 12|4@0+ (1,0) [0|15] "SED" VDM,IPMA_ADAS,GWM,ABS_ESC,PSCM,TCCM,ECM_Diesel + SG_ GboxOil_Te_Actl : 39|8@0+ (1,-60) [-60|193] "degC" SOBDMC_HPCM_FD1,GWM,TCCM,ECM_Diesel + +BO_ 369 EngineData_1: 8 PCM + SG_ SeatWorkSrfc_B_Falt : 12|1@0+ (1,0) [0|1] "SED" GWM + SG_ TrnIpcDsplyRng2_D_Actl : 23|4@0+ (1,0) [0|15] "SED" GWM + SG_ TrnIpcDsplyRng_D_Stat : 9|2@0+ (1,0) [0|3] "SED" GWM + SG_ TrnIpcDsplyGear_D_Actl : 7|4@0+ (1,0) [0|15] "SED" GWM + SG_ TrnIpcDsplyMde_D_Stat : 3|2@0+ (1,0) [0|3] "SED" GWM + SG_ TrnIpcDsplyMde_D_Actl : 15|3@0+ (1,0) [0|7] "SED" GWM + SG_ TrnIpcDsplyGear_D_Stat : 1|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 92 Gear_Shift_by_Wire_3: 8 PCM_HEV + SG_ TrnLvrV_D_Rq : 43|2@0+ (1,0) [0|3] "SED" GWM + SG_ TrnSbwSysHlth_D_Actl : 1|2@0+ (1,0) [0|3] "SED" GWM + SG_ TrnGearNtmAllow_B_Stat : 47|1@0+ (1,0) [0|1] "SED" GWM + SG_ TrnDtpCmd_D_Actl : 46|3@0+ (1,0) [0|7] "SED" GWM + SG_ GearSelLck_D_Rq : 41|2@0+ (1,0) [0|3] "SED" GWM + SG_ TrnGearCmd_No_Cs : 31|8@0+ (1,0) [0|255] "Unitless" GWM + SG_ TrnValidGear_D_Cnfm : 11|2@0+ (1,0) [0|3] "SED" GWM + SG_ TrnNtrlTowCmd_D_Actl : 6|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,GWM,ABS_ESC + SG_ TrnGearCmd_Pc_ActlPt : 9|10@0+ (0.1,0) [0|102.2] "percent duty cycle" GWM + SG_ TrnGear_D_RqPt : 4|3@0+ (1,0) [0|7] "SED" GWM + SG_ TrnCmdState_B_Actl : 39|1@0+ (1,0) [0|1] "SED" GWM + SG_ TrnCmdCnt_B_Actl : 7|1@0+ (1,0) [0|1] "unitless" GWM + SG_ PrkBrkActv_D_RqTrnGear : 38|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC + SG_ TrnGearMsgTxt_D_Rq : 36|5@0+ (1,0) [0|31] "SED" GWM + SG_ TrnGearCmd_No_Cnt : 15|4@0+ (1,0) [0|15] "Unitless" GWM + +BO_ 2030 TesterPhysicalResSOBDMCFD1: 64 ECM_Diesel + SG_ TesterPhysicalResSOBDMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1087 Powertrain_Data_5: 8 PCM_HEV + SG_ BattRgenLoChrg_D_RqEng : 15|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdasLcObtclAbrt_B_Stat : 0|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ BattRgenLoDChrg_D_RqEng : 13|2@0+ (1,0) [0|3] "SED" GWM + SG_ AirDamPos_D_Stat : 11|2@0+ (1,0) [0|3] "SED" GWM,ABS_ESC + SG_ FapLcInhbt_B_Rq : 1|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ FapLcStopHold_B_Rq : 2|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ FapLcPrchgBrk_B_Rq : 3|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ FapLcObstcl_B_Stat : 4|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + SG_ FapLcMaxGrdInhbt_B_Stat : 5|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + SG_ FapLcMaxGrdAbrt_B_Stat : 6|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + SG_ FapLcActv_B_Stat : 7|1@0+ (1,0) [0|1] "SED" GWM,IPMA_ADAS + +BO_ 332 CGEA_Urea_Strategy: 8 ECM_Diesel + SG_ UreaLvlQlty_D_RqDsply : 51|3@0+ (1,0) [0|7] "SED" GWM + SG_ UreaLvlTxtWarn_D_Rq : 63|4@0+ (1,0) [0|15] "SED" GWM + SG_ UreaQltySysWarn_D_Rq : 59|3@0+ (1,0) [0|7] "SED" GWM + SG_ DieslPrtcWarn_D_Rq : 55|4@0+ (1,0) [0|15] "SED" GWM + SG_ UreaQltyFlg_B_RqDsply : 24|1@0+ (1,0) [0|1] "SED" GWM + SG_ UreaLvl_Pc_Actl : 47|8@0+ (0.4,0) [0|102] "percent" GWM + SG_ VehUreaRnge2_L_DsplyMx : 3|12@0+ (1,0) [0|4095] "kilometer" GWM + SG_ UreaQltySys_D_RqDsply : 27|3@0+ (1,0) [0|7] "SED" GWM + SG_ UreaLvlTxt_D_RqDsply : 31|4@0+ (1,0) [0|15] "SED" GWM + SG_ VehUreaWarn_V_DsplyMx : 23|7@0+ (1,0) [0|127] "km/h" GWM + +BO_ 1896 TesterPhysicalResABS: 64 ABS_ESC + SG_ TesterPhysicalResABS : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1889 TesterPhysicalReqTCCM: 64 TSTR + SG_ TesterPhysicalReqTCCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TCCM + +BO_ 1888 TesterPhysicalReqABS: 64 TSTR + SG_ TesterPhysicalReqABS : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" ABS_ESC + +BO_ 1848 TesterPhysicalResPSCM: 64 PSCM + SG_ TesterPhysicalResPSCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1840 TesterPhysicalReqPSCM: 64 TSTR + SG_ TesterPhysicalReqPSCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" PSCM + +BO_ 1713 ABS_Rapid_Data_Response_2: 8 ABS_ESC + SG_ UUDTABSResponse2 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1712 ABS_Rapid_Data_Response_1: 8 ABS_ESC + SG_ UUDTABSResponse1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 2025 TesterPhysicalResTCM: 64 TCM_DSL + SG_ TesterPhysicalResTCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 2024 TesterPhysicalResPCM: 64 PCM_HEV + SG_ TesterPhysicalResPCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 2017 TesterPhysicalReqTCM: 64 TSTR + SG_ TesterPhysicalReqTCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TCM_DSL + +BO_ 2016 TesterPhysicalReqPCM: 64 TSTR + SG_ TesterPhysicalReqPCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" ECM_Diesel,PCM,PCM_HEV + +BO_ 2015 TesterFunctionalReq_FD1: 64 TSTR + SG_ TesterFunctionalReq : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" VDM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCCM,TCM_DSL,PSCM,ABS_ESC,GWM + +BO_ 1897 TesterPhysicalResTCCM: 64 TCCM + SG_ TesterPhysicalResTCCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1814 TesterPhysicalReqGWM_FD1: 64 TSTR + SG_ TesterPhysicalReqGWM_F1 : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" GWM + +BO_ 1701 TCM_Rapid_Data_Response_2: 8 TCM_DSL + SG_ UUDTTCMResponse2 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1700 TCM_Rapid_Data_Response_1: 8 TCM_DSL + SG_ UUDTTCMResponse1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1697 PCM_Rapid_Data_Response_2: 8 PCM_HEV + SG_ UUDTPCMResponse2 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1696 PCM_Rapid_Data_Response_1: 8 PCM_HEV + SG_ UUDTPCMResponse1 : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" TSTR + +BO_ 1429 PCM_AutoSar_NetworkMgmt: 8 PCM_HEV + SG_ PCM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" TCM_DSL + SG_ PCM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" TCM_DSL + SG_ PCM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" TCM_DSL + SG_ PCM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" TCM_DSL + SG_ PCM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" TCM_DSL + SG_ PCM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" TCM_DSL + SG_ PCM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" TCM_DSL + SG_ PCM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" TCM_DSL + +BO_ 1100 PowertrainData_9: 8 PCM_HEV + SG_ EngExhMdeQuiet_D2_Stat : 28|3@0+ (1,0) [0|7] "SED" GWM + SG_ HvacCmprLim_D_Stat : 34|3@0+ (1,0) [0|7] "SED" GWM + SG_ WakeAlarm1_T_Rq : 55|15@0+ (1,0) [0|32767] "minute" GWM + SG_ WakeAlarm1_B_Typ : 56|1@0+ (1,0) [0|1] "SED" GWM + SG_ Veh_V_DsplyTrailCtlSet : 47|6@0+ (0.5,0) [0|31] "unitless" GWM + SG_ TrailCtlPt_B_Falt : 36|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + SG_ AutoTowAllw_D_StatMnu : 25|2@0+ (1,0) [0|3] "SED" GWM + SG_ AutoTowActv_B_Stat : 39|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ GrossTrainWeight_M_Est : 7|8@0+ (100,0) [0|25300] "kilogram" VDM,ABS_ESC,PSCM,IPMA_ADAS,TCCM,TCM_DSL,GWM + +BO_ 1098 EffDrvModeData: 8 ECM_Diesel + SG_ EdmVeh_V_Dsply : 31|5@0+ (5,0) [0|155] "km/h" GWM + SG_ EdmSailMdeOn_B_Stat : 25|1@0+ (1,0) [0|1] "SED" GWM + SG_ EdmPrev_Fe_Dsply : 23|8@0+ (0.1,0) [0|25.5] "litre/100km" GWM + SG_ EdmMsgTxt_D_Rq : 11|4@0+ (1,0) [0|15] "SED" GWM + SG_ EdmLamp_D_Dsply : 15|4@0+ (1,0) [0|15] "SED" GWM + SG_ EdmCurrent_Fe_Dsply : 7|8@0+ (0.1,0) [0|25.5] "litre/100km" GWM + SG_ EdmCmplnc_B_Dsply : 26|1@0+ (1,0) [0|1] "SED" GWM + SG_ EdmCmplnc_Pc_Dsply : 24|8@0+ (0.392157,0) [0|100.000035] "percent" GWM + +BO_ 1086 PowertrainData_3: 8 PCM_HEV + SG_ EngMnfld_P_Actl : 47|13@0+ (0.1,-206.8) [-206.8|612.3] "kilopascal" GWM + SG_ FuelPumpPwr_B_Rq : 20|1@0+ (1,0) [0|1] "SED" GWM + SG_ BattULoChrg_U_Cmd : 15|8@0+ (0.025,10.6) [10.6|16.975] "volt" GWM + SG_ ElLoadCtl_D_Rq : 23|3@0+ (1,0) [0|7] "SED" GWM + +BO_ 1071 Engine_Clutch_Data: 8 PCM_HEV + SG_ EngAout_N_Dsply : 52|13@0+ (2,0) [0|16382] "rpm" GWM + SG_ CluPdl_PcRate_Actl : 7|8@0+ (0.04,-5) [-5|5.2] "%/ms" GWM + SG_ CluPdlPosPcMeas_D_Qf : 11|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + SG_ CluPdlPos_Pc_Meas : 9|10@0+ (0.1,0) [0|102.3] "%" ABS_ESC,GWM + SG_ EngAoutIdl_N_Ntrl : 31|11@0+ (2,0) [0|4094] "rpm" ABS_ESC,GWM + +BO_ 1069 PowertrainData_2: 8 PCM_HEV + SG_ SlMde_D_Stat : 57|2@0+ (1,0) [0|3] "SED" GWM + SG_ SlMde_D_RqDsply : 59|2@0+ (1,0) [0|3] "SED" GWM + SG_ IsaOffst_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM + SG_ GrllShtrPos_D_Cmd : 55|4@0+ (1,0) [0|15] "SED" GWM + SG_ GrllShtrPos_B_Falt : 51|1@0+ (1,0) [0|1] "SED" GWM + SG_ ObdWarmUp_B_Complt : 12|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,GWM + SG_ EngMsgTxt_D_Rq : 11|2@0+ (1,0) [0|3] "SED" GWM + SG_ EngClnt_Te_ActlDiag : 39|8@0+ (1,-40) [-40|215] "degC" SOBDMC_HPCM_FD1,TCM_DSL,GWM + SG_ EngLoad_Pc_CalcDiag : 47|8@0+ (0.392157,0) [0|100.000035] "%" SOBDMC_HPCM_FD1,TCM_DSL,GWM + SG_ EngAirIn_Te_Actl : 9|10@0+ (0.25,-128) [-128|127.25] "degC" GWM,TCM_DSL + SG_ ApedPos_Pc_ActlDiag : 31|8@0+ (0.392157,0) [0|100.000035] "%" SOBDMC_HPCM_FD1,TCM_DSL,GWM + +BO_ 1060 Powertrain_Data_4: 8 PCM_HEV + SG_ RearDiffOilTeWarn_B_Rq : 20|1@0+ (1,0) [0|1] "SED" GWM + SG_ RearDiffOil_Te_Actl : 15|9@0+ (1,-40) [-40|470] "degC" GWM + SG_ BpedDrvMsgTxt_B_Dsply : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ FuelLvl_Pc_DsplyEng : 41|10@0+ (0.108696,-5.217408) [-5.217408|105.9786] "percent" GWM + SG_ FuelLvlWarn_D_ActlEng : 19|3@0+ (1,0) [0|7] "SED" GWM + SG_ FuelRange_L_DsplyEng : 39|14@0+ (0.1,0) [0|1638.3] "kilometer" GWM + SG_ SelDrvMdePt_D_Stat : 25|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + +BO_ 1057 PowertrainData_1: 8 PCM_HEV + SG_ FohEng_D_Rq : 1|2@0+ (1,0) [0|3] "SED" GWM + SG_ EngIdlShutDwnTxt_D_Rq : 17|2@0+ (1,0) [0|3] "SED" GWM + SG_ EngIdlShutDown_D_Stat : 9|2@0+ (1,0) [0|3] "SED" GWM + SG_ FUEL_ALCOHOL_PERCNT : 63|8@0+ (0.393700787,0) [0|99.999899898] "Percent" GWM + SG_ TrnTotTq_Rt_Est : 39|16@0+ (0.001,0) [0|65.533] "Unitless" GWM + SG_ TrnTotLss_Tq_Est : 31|8@0+ (0.5,0) [0|126.5] "Nm" GWM + SG_ ECMMILRequest : 3|2@0+ (1,0) [0|3] "SED" GWM + SG_ AirCondFluidHi_P_Actl : 55|8@0+ (0.125,0) [0|31.625] "bar" SOBDMC_HPCM_FD1,GWM + SG_ OilPressureWarning : 18|1@0+ (1,0) [0|1] "SED" GWM + SG_ VehVLimStat_D_Actl : 6|3@0+ (1,0) [0|7] "SED" GWM,TCM_DSL + SG_ VehVLimActv_B_Actl : 7|1@0+ (1,0) [0|1] "SED" GWM,TCM_DSL + SG_ CoolantFanStepAct : 23|5@0+ (1,0) [0|31] "Steps" GWM + +BO_ 1055 PowertrainData_7: 8 PCM_HEV + SG_ EcoCochInstNeg_B_Dsply : 53|1@0+ (1,0) [0|1] "SED" GWM + SG_ EcoCochShif_Pc_Dsply : 39|8@0+ (0.392157,0) [0|100.000035] "percent" GWM + SG_ EcoCochInst_Pc_Dsply : 47|10@0+ (0.1,0) [0|102.3] "percent" GWM + SG_ EcoCochIdlFuel_Pc_Dsply : 31|8@0+ (0.392157,0) [0|100.000035] "percent" GWM + SG_ EcoCochDecel_Pc_Dsply : 23|8@0+ (0.392157,0) [0|100.000035] "percent" GWM + SG_ EcoCochCrus_Pc_Dsply : 15|8@0+ (0.392157,0) [0|100.000035] "percent" GWM + SG_ EcoCochA_Pc_Dsply : 7|8@0+ (0.392157,0) [0|100.000035] "percent" GWM + +BO_ 562 PowertrainData_11: 8 ECM_Diesel + SG_ GearNtrl_No_Cs : 15|8@0+ (1,0) [0|255] "unitless" GWM + SG_ GearNtrl_No_Cnt : 5|4@0+ (1,0) [0|15] "unitless" GWM + SG_ GearNtrl_D_Stat : 7|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + +BO_ 523 Engine_Data_18: 8 ECM_Diesel + SG_ EngAirFiltMsgTxt_D_Rq : 2|3@0+ (1,0) [0|7] "SED" GWM + SG_ WaterInFuel_B_Falt : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ UreaMnAdd_L2_Actl : 23|8@0+ (0.1,0) [0|25.4] "litre" GWM + SG_ VehUreaRnge3_L_DsplyMx : 31|16@0+ (1,0) [0|65535] "unitless" GWM + SG_ UreaMxAdd_L2_Actl : 47|9@0+ (0.1,0) [0|51] "litre" GWM + +BO_ 517 PowertrainData_6: 8 PCM_HEV + SG_ FapLc_B_Err : 10|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ BrkTot_Tq_RqFapLc : 7|13@0+ (4,0) [0|32764] "Nm" ABS_ESC,GWM + SG_ TrnAin_Pc_RqDrv : 9|10@0+ (0.1,0) [0|102.3] "percent" TCCM,GWM + +BO_ 516 EngVehicleSpThrottle: 8 PCM_HEV + SG_ EngAoutNActl_D_QF : 31|2@0+ (1,0) [0|3] "SED" TCM_DSL,GWM + SG_ EngAout3_N_Actl : 55|16@0+ (0.25,0) [0|16383.5] "RPM" SOBDMC_HPCM_FD1,GWM + SG_ ApedPos_PcRate_ActlArb : 23|8@0+ (0.04,-5) [-5|5.12] "%/ms" TCM_DSL,GWM + SG_ ApedPos_Pc_ActlArb : 1|10@0+ (0.1,0) [0|102.3] "%" VDM,CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,TCCM,ABS_ESC,PSCM,TCM_DSL,GWM + SG_ ApedPosPcActl_D_Qf : 7|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,SOBDMC_HPCM_FD1,ABS_ESC,PSCM,TCM_DSL,GWM + SG_ EngAout_N_Actl : 28|13@0+ (2,0) [0|16382] "rpm" VDM,ABS_ESC,PSCM,TCCM,TCM_DSL,GWM + SG_ ApedPosPcActl_No_Cnt : 5|4@0+ (1,0) [0|15] "Unitless" ABS_ESC,SOBDMC_HPCM_FD1,GWM + SG_ ApedPosPcActl_No_Cs : 47|8@0+ (1,0) [0|255] "Unitless" ABS_ESC,SOBDMC_HPCM_FD1,GWM + +BO_ 514 EngVehicleSpThrottle2: 8 PCM_HEV + SG_ StrtrMtrDlyStrt_B_Stat : 39|1@0+ (1,0) [0|1] "SED" GWM + SG_ VehVTrlrAid_B_Avail : 23|1@0+ (1,0) [0|1] "SED" PSCM,GWM + SG_ StrtrMtrCtlMsgTxt_D_Rq : 7|3@0+ (1,0) [0|7] "SED" GWM + SG_ VehVActlEng_No_Cs : 15|8@0+ (1,0) [0|255] "Unitless" PSCM,GWM + SG_ VehVActlEng_No_Cnt : 22|4@0+ (1,0) [0|15] "Unitless" PSCM,GWM + SG_ Veh_V_RqCcSet : 32|9@0+ (0.5,0) [0|255.5] "kph" IPMA_ADAS,ABS_ESC,TCM_DSL,GWM + SG_ VehVActlEng_D_Qf : 38|2@0+ (1,0) [0|3] "SED" VDM,IPMA_ADAS,ABS_ESC,PSCM,TCM_DSL,GWM + SG_ Veh_V_ActlEng : 55|16@0+ (0.01,0) [0|655.35] "kph" VDM,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,PSCM,TCM_DSL,GWM + SG_ GearRvrse_D_Actl : 4|3@0+ (1,0) [0|7] "SED" CMR_DSMC,IPMA_ADAS,ABS_ESC,PSCM,GWM + SG_ StrtrMtrCtlMsgTxt_D2_Rq : 1|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 512 TorqueDataEngFlags: 8 PCM_HEV + SG_ PrplWhlTotTqRq_No_Cs : 63|8@0+ (1,0) [0|255] "Unitless" ABS_ESC,GWM + SG_ PrplWhlTotTqRq_No_Cnt : 51|4@0+ (1,0) [0|15] "Unitless" ABS_ESC,GWM + SG_ PrplWhlTot_Tq_Rq : 39|16@0+ (4,-131072) [-131072|131068] "Nm" VDM,TCCM,ABS_ESC,GWM + SG_ PrplWhlTot_Tq_LimMn : 23|16@0+ (4,-131072) [-131072|131068] "Nm" ABS_ESC,GWM + SG_ PtDrvMde_D_Stat : 55|4@0+ (1,0) [0|15] "SED" IPMA_ADAS,GWM + +BO_ 381 EngineData_17: 8 ECM_Diesel + SG_ EngOilLife_T_Actl : 23|11@0+ (1,0) [0|2047] "days" GWM + SG_ EngOilSrvcMsgTxt_D_Rq : 55|3@0+ (1,0) [0|7] "SED" GWM + SG_ DistToNextOilChange : 7|16@0+ (1,0) [0|65535] "unitless" GWM + SG_ RunDryPrevent_B_Stat : 28|1@0+ (1,0) [0|1] "SED" GWM + SG_ WaterInFuel : 52|1@0+ (1,0) [0|1] "SED" GWM + SG_ GlowIndication : 51|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 380 EngineData_16: 8 PCM + SG_ EngOilLvlWarn_D_Rq1 : 55|3@0+ (1,0) [0|7] "SED" GWM + SG_ EngExhBrkOnLamp_B_Rq : 27|1@0+ (1,0) [0|1] "SED" GWM + SG_ EngExhBrkAutoLamp_B_Rq : 3|1@0+ (1,0) [0|1] "SED" GWM + SG_ EngAout_N_MxAllw : 52|13@0+ (2,0) [0|16382] "rpm" SOBDMC_HPCM_FD1,GWM + SG_ EngExhBrkMde_D_Actl : 31|4@0+ (1,0) [0|15] "SED" TCM_DSL,GWM + +BO_ 377 EngineData_7: 8 PCM_HEV + SG_ HvacAirFullOut_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM + SG_ FuelFlw_Vl_Dsply : 49|10@0+ (25,0) [0|25575] "Micro_Liter" GWM + SG_ FuelFillInlet_B_Dsply : 32|1@0+ (1,0) [0|1] "SED" GWM + SG_ EngSrvcRqd_B_Rq : 19|1@0+ (1,0) [0|1] "SED" GWM + SG_ OdoCount : 47|8@0+ (0.2,0) [0|50.8] "Meters" GWM + SG_ EngOilLife_Pc_Actl : 39|7@0+ (1,0) [0|100] "Percent" GWM + SG_ FuelFilterLamp_B_Dsply : 50|1@0+ (1,0) [0|1] "SED" GWM + SG_ AirCondRec_B_Rq : 55|1@0+ (1,0) [0|1] "SED" GWM + SG_ AirCondClutch_B_Stats : 51|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 376 EngineClimateData: 8 PCM_HEV + SG_ GasPrtc_D_RqDsply : 22|3@0+ (1,0) [0|7] "SED" GWM + SG_ EngAout_Aa_Actl : 17|10@0+ (0.05,-25.6) [-25.6|25.55] "rpm/ms" ABS_ESC,GWM + SG_ DynoMde_B_Cmd : 4|1@0+ (1,0) [0|1] "SED" TCM_DSL,ABS_ESC,GWM + SG_ AslIconDsply_D_Rq : 3|2@0+ (1,0) [0|3] "SED" GWM + SG_ AslChime_B_Rq : 39|1@0+ (1,0) [0|1] "SED" GWM + SG_ HvacHtrCore2_Te_Actl : 1|10@0+ (0.25,-50) [-50|205.5] "degC" SOBDMC_HPCM_FD1,GWM + SG_ EcssLamp_D_RqDsply : 19|2@0+ (1,0) [0|3] "SED" GWM + SG_ AirAmbTe_D_Qf : 35|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,TCCM,GWM + SG_ AirAmb_Te_ActlFilt : 49|10@0+ (0.25,-128) [-128|127.75] "deg C" SOBDMC_HPCM_FD1,IPMA_ADAS,GWM + SG_ AirAmb_Te_Actl : 33|10@0+ (0.25,-128) [-128|127.75] "degC" ABS_ESC,TCCM,GWM + SG_ AirAmb_P_Actl : 55|6@0+ (10,500) [500|1110] "mbar" ABS_ESC,TCM_DSL,GWM + +BO_ 373 EngineData_11: 8 ECM_Diesel + SG_ DieslPrtc2_D_RqDsply : 47|4@0+ (1,0) [0|15] "SED" GWM + SG_ DieslPrtcRgen_D_Actl : 38|2@0+ (1,0) [0|3] "SED" TCM_DSL,GWM + SG_ EngTeColdPrtct_D_Stats : 4|2@0+ (1,0) [0|3] "SED" GWM + SG_ EngExhOvrTe_B_RqDsply : 39|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 359 VehicleOperatingModes: 8 PCM_HEV + SG_ PrplWhlRgenMn_Tq_Actl : 25|13@0+ (4,-16380) [-16380|16380] "Nm" ABS_ESC,GWM + SG_ ElPw_D_StatStrtStop : 31|4@0+ (1,0) [0|15] "SED" ABS_ESC,PSCM,GWM + SG_ TrnAin_Tq_Actl : 42|11@0+ (1,-500) [-500|1547] "Nm" ABS_ESC,GWM + SG_ PrplWhlTot2_Tq_Actl : 15|16@0+ (4,-131072) [-131072|131060] "Nm" ABS_ESC,PSCM,TCCM,GWM + SG_ PwPckTq_D_Stat : 5|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,ABS_ESC,PSCM,TCCM,TCM_DSL,GWM + SG_ Eng_D_Stat : 7|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + SG_ PlgActvArb_B_Actl : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ ElPw_D_Stat : 3|3@0+ (1,0) [0|7] "SED" VDM,CMR_DSMC,IPMA_ADAS,ABS_ESC,PSCM,TCCM,TCM_DSL,GWM + SG_ TrnAinTq_D_Qf : 44|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + +BO_ 358 Stop_Start: 8 PCM_HEV + SG_ StopStrtStdby_D_Indic : 55|3@0+ (1,0) [0|7] "SED" GWM + SG_ StopStrtIODTxt_D_Rq : 52|5@0+ (1,0) [0|31] "SED" GWM + SG_ StopStrtDrvMde_D_Indic : 13|2@0+ (1,0) [0|3] "SED" GWM + SG_ StopStrtMsgTxt_D_Rq : 11|4@0+ (1,0) [0|15] "SED" GWM + SG_ OdoTripVerify_L_Actl : 31|24@0+ (0.1,0) [0|1677721.4] "km" GWM + SG_ HiElPwInhbt_B_Stat : 15|1@0+ (1,0) [0|1] "SED" GWM + SG_ AutoStopPtDelta_I_Est : 7|8@0+ (1,-127) [-127|127] "Amps" GWM + +BO_ 357 EngBrakeData: 8 PCM_HEV + SG_ BPedDrvAppl_D_QF : 15|2@0+ (1,0) [0|3] "SED" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,PSCM,TCM_DSL,GWM + SG_ CmbbDeny_B_ActlPrpl : 3|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ PrplTqMnSat_B_Actl : 41|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ BpedDrvAppl_D_Actl : 5|2@0+ (1,0) [0|3] "SED" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,PSCM,TCCM,TCM_DSL,GWM + SG_ CmbbEngTqMn_B_Actl : 7|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,GWM + SG_ Veh_V_DsplyCcSet : 23|8@0+ (1,0) [0|253] "Unitless" GWM,IPMA_ADAS + SG_ AccEngStat_D_Actl : 2|3@0+ (1,0) [0|7] "SED" IPMA_ADAS,GWM + SG_ CcMde_D_Actl : 13|3@0+ (1,0) [0|7] "SED" VDM,TCM_DSL,ABS_ESC,GWM + SG_ CcStat_D_Actl : 10|3@0+ (1,0) [0|7] "SED" CMR_DSMC,SOBDMC_HPCM_FD1,IPMA_ADAS,ABS_ESC,TCCM,TCM_DSL,GWM + SG_ EngAout_N_MnAllw : 52|13@0+ (2,0) [0|16382] "rpm" SOBDMC_HPCM_FD1,GWM + SG_ CcOvrrdActv_B_Actl : 6|1@0+ (1,0) [0|1] "SED" VDM,IPMA_ADAS,ABS_ESC,TCCM,TCM_DSL,GWM + SG_ AccStopMde_D_Rq : 39|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,ABS_ESC,GWM + +BO_ 355 EngineData_10: 8 ECM_Diesel + SG_ AutoRgenTxt_B_RqDsply : 48|1@0+ (1,0) [0|1] "SED" GWM + SG_ AccFllwMdeActv_B_Actl : 32|1@0+ (1,0) [0|1] "SED" GWM + SG_ EngPtoMde_D_Actl : 60|3@0+ (1,0) [0|7] "SED" GWM + SG_ ManRgenTxt_D_RqDsply : 63|3@0+ (1,0) [0|7] "SED" GWM + SG_ ManRgenSoot_Pc_RqDsply : 39|7@0+ (1,0) [0|126] "%" GWM + SG_ DieslMsgTxt_D_Rq : 57|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 342 EngineData_6: 8 PCM_HEV + SG_ EngOvrhtMitgActv_D_Ind : 36|2@0+ (1,0) [0|3] "SED" GWM + SG_ EngClntTe_D_Qf : 33|2@0+ (1,0) [0|3] "SED" VDM,SOBDMC_HPCM_FD1,TCM_DSL,GWM + SG_ EngGoutLss_Tq_Est : 31|8@0+ (1,0) [0|255] "Nm" SOBDMC_HPCM_FD1,GWM + SG_ EngOil_Te_Actl : 15|8@0+ (1,-60) [-60|193] "degC" GWM + SG_ EngClnt_Te_Actl : 7|8@0+ (1,-60) [-60|195] "degC" VDM,SOBDMC_HPCM_FD1,TCM_DSL,GWM + +BO_ 71 Global_PATS_TargetInfo: 8 PCM_HEV + SG_ immoTarget1Status : 7|3@0+ (1,0) [0|7] "SED" ABS_ESC,TCM_DSL,GWM + SG_ immoTarget1Data : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" ABS_ESC,GWM + SG_ immoTarget1Cmd : 4|3@0+ (1,0) [0|7] "SED" ABS_ESC,GWM + +BO_ 1822 TesterPhysicalResGWM_FD1: 64 GWM + SG_ TesterPhysicalResGWM_F1 : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1438 GWM_AutoSar_NetMgmt_FD1: 8 GWM + SG_ GWM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC + SG_ GWM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC + SG_ GWM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC + SG_ GWM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC + SG_ GWM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC + SG_ GWM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC + SG_ GWM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC + SG_ GWM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" PCM_HEV,PCM,SOBDMC_HPCM_FD1,PSCM,ABS_ESC + +BO_ 954 Body_Info_10_FD1: 8 GWM + SG_ GenericSwtch3_No_Actl : 15|3@0+ (1,0) [0|7] "unitless" Vector__XXX + SG_ GenericSwtch2_No_Actl : 4|3@0+ (1,0) [0|7] "unitless" Vector__XXX + SG_ GenericSwtch1_No_Actl : 7|3@0+ (1,0) [0|7] "unitless" Vector__XXX + +BO_ 1006 Personality_IPMB_Data: 8 IPMA_ADAS + SG_ PersIndexIpmb_D_Actl : 39|3@0+ (1,0) [0|7] "SED" GWM + SG_ FeatNoIpmbActl : 23|16@0+ (1,0) [0|65535] "Number" GWM + SG_ FeatConfigIpmbActl : 7|16@0+ (1,0) [0|65535] "Undefined" GWM + +BO_ 820 Adaptive_Headlamp_Stat: 8 GWM + SG_ AhbStatGfhbFdbk_D_Actl : 53|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ HeadLghtDrvSide_B_Stat : 33|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ HeadLghtHiOn_B_StatHcm : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Adaptive_Hdlmp_Fault : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 137 ActiveFrontStrg_Stat_FD1: 8 GWM + SG_ SteWhlOffstRq_D_Stat : 43|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ SteWhlOffst_An_TotActl : 23|15@0+ (0.1,-1600) [-1600|1676.5] "degrees" ABS_ESC + SG_ SteWhlBrkOffst_An_Actl : 7|15@0+ (0.1,-1600) [-1600|1676.5] "degrees" ABS_ESC + SG_ SteWhlBrkAnActl_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" ABS_ESC + SG_ SteWhlBrkAnActl_No_Cnt : 47|4@0+ (1,0) [0|15] "Unitless" ABS_ESC + +BO_ 129 Steering_Wheel_Data2_FD1: 8 GWM + SG_ SelDrvMdeSwtch_D_Stat4 : 21|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ SteWhlSwtchView_B_Stat : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchSet_B_Stat : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchPhon_B_Stat : 9|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchNav_B_Stat : 10|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchMed_B_Stat : 11|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchIod_B_Stat : 12|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchHud_B_Stat : 13|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchBack_B_Stat : 14|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchMenu_B_Stat : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteEffortInc_B_RqDrv : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SelDrvMdeInc_B_RqDrv : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SelDrvMdeDec_B_RqDrv : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SuspDampInc_B_RqDrv : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchUp_B_Stat : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchRght_B_Stat : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchOk_B_Stat : 4|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchLeft_B_Stat : 1|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchDown_B_Stat : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchHome_B_Stat : 19|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ SteWhlSwtchInfo_B_Stat : 18|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 935 Side_Detect_R_Stat: 8 IPMA_ADAS + SG_ SodRight_D_Stat : 15|3@0+ (1,0) [0|7] "SED" GWM + SG_ CtaAlrtRight2_D_Stat : 30|3@0+ (1,0) [0|7] "SED" GWM + SG_ BttRight_D_Stat : 45|3@0+ (1,0) [0|7] "SED" GWM + SG_ BttRight_D_RqDrv : 47|2@0+ (1,0) [0|3] "SED" GWM + SG_ CtaBrkRightMsgTxt_B_Rq : 42|1@0+ (1,0) [0|1] "SED" GWM + SG_ CtaRightBrkEnbl_B_Rq : 31|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ CtaRightBrkDecel_B_Rq : 7|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ Side_Detect_R_Illum : 39|8@0+ (1,0) [0|255] "Percent" GWM + SG_ CtaSnsRight_D_Stat : 25|2@0+ (1,0) [0|3] "SED" GWM + SG_ CtaAlrtRight_D_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ CtaRight_D_Stat : 18|3@0+ (1,0) [0|7] "SED" GWM + SG_ SodSnsRight_D_Stat : 12|2@0+ (1,0) [0|3] "SED" GWM + SG_ SodAlrtRight_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ SodDetctRight_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM + SG_ SodWarnRight_Prd_Rq : 6|7@0+ (1,0) [0|127] "millisecond" GWM + +BO_ 1108 RCMSerialNumber_FD1: 8 GWM + SG_ RCMSerialNoByte8 : 63|8@0+ (1,0) [0|253] "Unitless" ABS_ESC + SG_ RCMSerialNoByte7 : 55|8@0+ (1,0) [0|253] "Unitless" ABS_ESC + SG_ RCMSerialNoByte6 : 47|8@0+ (1,0) [0|253] "Unitless" ABS_ESC + SG_ RCMSerialNoByte5 : 39|8@0+ (1,0) [0|253] "Unitless" ABS_ESC + SG_ RCMSerialNoByte4 : 31|8@0+ (1,0) [0|253] "Unitless" ABS_ESC + SG_ RCMSerialNoByte3 : 23|8@0+ (1,0) [0|253] "Unitless" ABS_ESC + SG_ RCMSerialNoByte2 : 15|8@0+ (1,0) [0|253] "Unitless" ABS_ESC + SG_ RCMSerialNoByte1 : 7|8@0+ (1,0) [0|253] "Unitless" ABS_ESC + +BO_ 261 APIM_Request_Signals_FD1: 8 GWM + SG_ ChrgStatDsply_D_Rq : 47|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ OffPeakTimeSetMin_Rq : 13|6@0+ (1,0) [0|63] "unitless" Vector__XXX + SG_ OffPeakTimeSetHR_Rq : 7|5@0+ (1,0) [0|31] "unitless" Vector__XXX + SG_ NextUsageTimeToggle_Rq : 15|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ LongTermParking_Rq : 17|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ CbnCmrtPrefLstNmItm_Rq : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ CbnCmrtPrefListIndx_Rq : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ ModemReset_D_Rq : 45|4@0+ (1,0) [0|15] "SED" SOBDMC_HPCM_FD1 + SG_ StopStrtDrvMde_B_RqBtn3 : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TCU_ESN_D_Rq : 22|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ FactoryReset_Rq : 18|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + +BO_ 1146 TrailerInfo_2_FD1: 8 GWM + SG_ TrlrAidSwtch_D_RqDrv : 35|2@0+ (1,0) [0|3] "SED" PSCM,IPMA_ADAS + SG_ TrlrAidCtl_U_RqDrv : 31|12@0+ (0.00125,0) [0|5.11625] "volt" PSCM + +BO_ 533 APIM_Send_Signals_2_FD1: 8 GWM + SG_ DcacGfciTestBttn_B_Stat : 9|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ TrlrBrkGain_No_Rq : 55|5@0+ (0.5,0) [0|15.5] "unitless" Vector__XXX + SG_ DcacPwResetButtn_B_Stat : 11|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacPwOffButtn_B_Stat : 12|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacPwLoButtn_B_Stat : 13|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacPwHiButtn_B_Stat : 14|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacPwButtn_B_Falt : 15|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ TrlrHitch_D_RqMnu : 23|4@0+ (1,0) [0|15] "SED" IPMA_ADAS + SG_ AutoEpbZoomView_B_Stat : 32|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ AutoEpbButtn_B_Stat : 19|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ TrlrAidMde_D_Rq : 5|2@0+ (1,0) [0|3] "SED" PSCM + SG_ TCU_Init_Actvtn_St : 1|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TCU_Final_Actvtn_St : 3|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ OtaTrg_D_Stat : 41|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ OnbChrgGoTTouch_D_Rq : 43|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgGoTPrcond_D_Rq : 34|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgGoTOn_D_Rq : 25|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgGoTMnte_D_Rq : 47|4@0+ (1,0) [0|15] "minute" SOBDMC_HPCM_FD1 + SG_ OnbChrgGoTHr_T_Rq : 39|5@0+ (1,0) [0|29] "hour" SOBDMC_HPCM_FD1 + SG_ OnbChrgGoTExtHtr_D_Rq : 27|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgGoTElement_D_Rq : 31|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1 + SG_ OnbChrgGoTDelete_B_Rq : 17|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ OnbChrgClearAll_B_Rq : 18|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ PaakMyKey_D_Rq : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ OnbChrgGoTUpdate_B_Rq : 16|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + +BO_ 1041 AC_Compressor_Data_FD1: 8 GWM + SG_ ElCmprUHi_U_Actl : 31|8@0+ (2,0) [0|510] "volt" SOBDMC_HPCM_FD1 + SG_ ElCmprUHi_D_Stat : 23|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprOverTe_D_Stat : 21|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmpr_N_Actl : 15|8@0+ (50,0) [0|12700] "RPM" SOBDMC_HPCM_FD1 + SG_ ElCmpr_Pw_Actl : 7|8@0+ (40,0) [0|10160] "watts" SOBDMC_HPCM_FD1,PCM_HEV + SG_ ElCmpr_D_Stat : 19|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprPerfErr_D_Falt : 43|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprInnrErr_D_Falt : 35|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprLostComm_D_Falt : 33|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprOverLoad_D_Falt : 47|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprOverTe_D_Falt : 45|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprBattURng_D_Falt : 37|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprBattSysU_D_Falt : 39|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ ElCmprSysU_D_Falt : 41|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + +BO_ 1067 Battery_Mgmt_4_FD1: 8 GWM + SG_ BattULoAuxIsol_D_Rq : 25|2@0+ (1,0) [0|3] "SED" PCM_HEV + SG_ BattULoAux_U_Rq : 55|12@0+ (0.00390625,0) [0|15.9921875] "volt" PCM_HEV + SG_ BattULoAuxSoc_Pc_Actl : 15|7@0+ (1,0) [0|127] "percent" PCM_HEV + SG_ BattULoAux_I_Actl : 23|12@0+ (0.0625,-128) [-128|127.875] "ampere" PCM_HEV + SG_ BattULoAux_D_Qlty : 27|2@0+ (1,0) [0|3] "SED" PCM_HEV + SG_ BattULoCrnkStrt_U_Pred : 47|7@0+ (0.1,0) [0|12.7] "volt" PCM_HEV + SG_ BattULoCrnkBelt_U_Pred : 39|7@0+ (0.1,0) [0|12.7] "volt" PCM_HEV + SG_ BattULoAux_U_Actl : 7|8@0+ (0.0625,0) [0|15.875] "volt" PCM_HEV + SG_ BattULoAux_B_Falt : 8|1@0+ (1,0) [0|1] "SED" PCM_HEV + +BO_ 1112 Battery_Traction_6_FD1: 8 GWM + SG_ BattTracChrgSustn_B_Rq : 4|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1 + SG_ BattTracCnnct_D_Cmd : 18|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTracHvilOpen_B_Stat : 8|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTracDcdcDis_B_Rq : 7|1@0+ (1,0) [0|1] "SED" PCM_HEV + SG_ HtrnClntPump_D_Stat : 6|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ BattTracDelta_Te_Actl : 63|8@0+ (0.5,-60) [-60|67.5] "degC" SOBDMC_HPCM_FD1 + SG_ BattTracClntPmp_D_Stat : 33|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + +BO_ 139 CruiseCtrl_Strg_Data_FD1: 8 GWM + SG_ AfsPw_B_Rq : 24|1@0+ (1,0) [0|1] "SED" PCM + SG_ AccButtnGpTogglePress2 : 25|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TjaButtnOnOffPress2 : 26|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ActvFrontSteMsgTxt_D_Rq : 31|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ ActvFrontSteLck_D_Stat : 17|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ SelDrvMdeAdptSte_D_Stat : 28|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ AslButtnOnOffPress2 : 4|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ AslButtnOnOffCnclPres2 : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcButtnOnPress2 : 18|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcButtnOnOffPress2 : 19|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcButtnOnOffCnclPress2 : 20|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcButtnOffPress2 : 21|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAsllButtnResPress2 : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnSetPress2 : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnSetIncPress2 : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnSetDecPress2 : 9|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnResIncPress2 : 10|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnResDecPress2 : 11|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnOnPress2 : 12|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnOnOffCncl2 : 13|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnOffCnclPres2 : 14|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnIndxIncPres2 : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnIndxDecPres2 : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnDeny_B_Actl2 : 1|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnCnclResPres2 : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnCnclPress2 : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ AccButtnGapIncPress2 : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ AccButtnGapDecPress2 : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 1121 AllTerrainControlData_FD1: 8 GWM + SG_ SelDrvMdeSwtch_No_Actl : 2|2@0+ (1,0) [0|3] "unitless" ABS_ESC + SG_ SelDrvMdeSwtch_D_Stat : 4|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ SelDrvMdeCnt_D_Stat : 7|3@0+ (1,0) [0|7] "Counts" ABS_ESC + +BO_ 1120 FourByFourSwitchData_FD1: 8 GWM + SG_ DrvSlipCtlMde_B_Rq3 : 14|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ HybMdeSwtch_B_Rq : 13|1@0+ (1,0) [0|1] "SED" PCM_HEV + SG_ TrailCtlSwtch_B_Stat3 : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ RearDiffLck_D_RqDrv : 4|2@0+ (1,0) [0|3] "SED" PCM,TCCM + SG_ AwdMde_D_RqDrv : 7|3@0+ (1,0) [0|7] "SED" TCCM + SG_ HdcSwtchPos_B_Actl : 0|1@0+ (1,0) [0|1] "SED" ABS_ESC + +BO_ 1050 Climate_Control_Data_FD1: 8 GWM + SG_ AutoHoldSwtch_D_Stat : 20|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ LpdbPtc3_B_Rq : 36|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ LpdbPtc2_B_Rq : 37|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ LpdbPtc1_B_Rq : 38|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ LpdbHeatWiprPrk_B_Rq : 39|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ LpdbDfrstRearOn_B_Rq : 24|1@0+ (1,0) [0|1] "SED" ECM_Diesel + SG_ SteWhlHeat_D_Rq : 13|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ MirrorHeatOn_B_Rq : 14|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Remote_Start_QuietMode : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Outside_Air_Temp_Stat : 7|8@0+ (0.5,-40) [-40|86.5] "Degrees C" VDM,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,PSCM + +BO_ 1137 Cluster_HEV_Data10_FD1: 8 PCM_HEV + SG_ RngPerChrgAvg_L_Dsply : 7|12@0+ (0.1,0) [0|409.3] "km" GWM + +BO_ 1255 BoundaryAlert_Right_4: 8 IPMA_ADAS + SG_ BalrRight4Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight4Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight4Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight4Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight4Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight4Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight4Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight4Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight4Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight4CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight4CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + +BO_ 1254 BoundaryAlert_Right_3: 8 IPMA_ADAS + SG_ BalrRight3Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight3Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight3Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight3Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight3Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight3Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight3Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight3Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight3Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight3CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight3CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + +BO_ 1253 BoundaryAlert_Right_2: 8 IPMA_ADAS + SG_ BalrRight2Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight2Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight2Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight2Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight2Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight2Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight2Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight2Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight2Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight2CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight2CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + +BO_ 1252 BoundaryAlert_Right_1: 8 IPMA_ADAS + SG_ BalrRight1Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight1Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight1Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight1Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight1Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight1Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight1Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight1Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight1Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrRight1CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrRight1CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + +BO_ 1251 BoundaryAlert_Left_4: 8 IPMA_ADAS + SG_ BalrLeft4Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft4Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft4Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft4Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft4Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft4Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft4Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft4Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft4Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft4CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft4CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + +BO_ 1250 BoundaryAlert_Left_3: 8 IPMA_ADAS + SG_ BalrLeft3Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft3Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft3Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft3Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft3Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft3Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft3Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft3Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft3Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft3CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft3CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + +BO_ 1249 BoundaryAlert_Left_2: 8 IPMA_ADAS + SG_ BalrLeft2Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft2Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft2Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft2Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft2Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft2Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft2Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft2Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft2Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft2CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft2CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + +BO_ 1248 BoundaryAlert_Left_1: 8 IPMA_ADAS + SG_ BalrLeft1Threat_D_Stat : 16|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft1Prev3Y_L_Actl : 51|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft1Prev3X_L_Actl : 42|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft1Prev2Y_L_Actl : 33|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft1Prev2X_L_Actl : 24|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft1Prev1Y_L_Actl : 31|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft1Prev1X_L_Actl : 23|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft1Fast_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft1Dsply_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrLeft1CurntY_L_Actl : 15|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + SG_ BalrLeft1CurntX_L_Actl : 7|7@0+ (0.5,-32) [-32|31.5] "meter" GWM + +BO_ 1113 TrailerAid_Stat3: 8 IPMA_ADAS + SG_ TrlrTrgtAcquire_D_Stat : 51|3@0+ (1,0) [0|7] "SED" PSCM,GWM + SG_ TrlrAnOffst_An_Calc : 48|9@0+ (0.1,0) [0|51.1] "degrees" GWM + SG_ TrlrAnOffstDir_D_Calc : 33|2@0+ (1,0) [0|3] "SED" GWM + SG_ TrlrAnCalib_B_Complt : 40|1@0+ (1,0) [0|1] "SED" GWM + SG_ TrlrRvrse_D_Stat : 42|2@0+ (1,0) [0|3] "SED" GWM,PSCM + SG_ TrlrAid_D2_Stat : 55|4@0+ (1,0) [0|15] "SED" GWM,PSCM + SG_ TrlrAidTrgtId_No_Actl : 47|5@0+ (1,0) [0|31] "unitless" GWM,PSCM + SG_ TrlrAid_An3_Actl : 28|11@0+ (0.125,-90) [-90|165.75] "degrees" PSCM,GWM + SG_ TrlrAid_AnRate2_Actl : 22|10@0+ (0.125,-50) [-50|77.75] "degrees/second" PSCM,GWM + SG_ HitchToVehAxle_L_Calc : 7|8@0+ (0.0127,-0.508) [-0.508|2.7178] "meter" PSCM,GWM + SG_ HitchToTrlrAxle_L_Calc2 : 15|9@0+ (0.0254,0) [0|12.9794] "meter" GWM + +BO_ 1105 Image_Processing_Data: 8 IPMA_ADAS + SG_ TrlrAidSwtchLamp_B_Rq : 32|1@0+ (1,0) [0|1] "SED" GWM + SG_ TrlrHitchMsgTxt_D_Rq : 47|6@0+ (1,0) [0|63] "SED" GWM + SG_ TrlrHitchIcon_D_Rq : 36|4@0+ (1,0) [0|15] "SED" GWM + SG_ TrlrHitchChime_D_Rq : 39|3@0+ (1,0) [0|7] "SED" GWM + SG_ TrlrAidEnbl_D_RqAdas : 5|3@0+ (1,0) [0|7] "SED" GWM,PSCM + SG_ TrlrRvrseMsgTxt_D2_Rq : 31|6@0+ (1,0) [0|63] "SED" PSCM,GWM + SG_ TrlrRvrseEnbl_D2_Stat : 18|3@0+ (1,0) [0|7] "SED" PSCM,GWM + SG_ RbaMsg_D_Rq : 22|2@0+ (1,0) [0|3] "SED" GWM + SG_ BrkDecel_B_RqRba : 8|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ BrkEnbl_B_RqRba : 23|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ Rba_D_Stat : 14|2@0+ (1,0) [0|3] "SED" GWM + SG_ RbaAlrt_D_Dsply : 12|2@0+ (1,0) [0|3] "SED" GWM + SG_ RbaMnu_D_Rq : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ CamraFrntStat_D_Stat : 7|2@0+ (1,0) [0|3] "SED" GWM + SG_ TrlrHitchLamp_D_Rq2 : 15|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 938 ParkAid_Aud_Warn_Stat: 8 IPMA_ADAS + SG_ SidePrkSnsR2_D_Stat : 59|4@0+ (1,0) [0|15] "SED" GWM + SG_ SidePrkSnsR1_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM + SG_ SidePrkSnsL2_D_Stat : 51|4@0+ (1,0) [0|15] "SED" GWM + SG_ ApaMde_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM + SG_ ApaActvSd_D_Actl : 14|2@0+ (1,0) [0|3] "SED" GWM + SG_ PrkAidSwtch_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ ApaMde_D_Avail : 12|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidSnsFrCrnr_D_Stat : 47|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidSnsFrCntr_D_Stat : 35|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidSnsFlCrnr_D_Stat : 27|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidSnsFlCntr_D_Stat : 31|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkBrkEl_B_RqFap : 20|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ RpaChime_D_Rq : 7|4@0+ (1,0) [0|15] "SED" GWM + SG_ FpaChime_D_Rq : 3|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidMsgTxt_D_Rq : 19|4@0+ (1,0) [0|15] "SED" GWM,PSCM + SG_ SidePrkSnsL1_D_Stat : 55|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidAudioMute_B_Rq : 15|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 939 ParkAid_Aud_Warn_Stat2: 8 IPMA_ADAS + SG_ ApaBrk_D_Rq : 51|2@0+ (1,0) [0|3] "SED" GWM + SG_ SidePrkSnsR4_D_Stat : 55|4@0+ (1,0) [0|15] "SED" GWM + SG_ SidePrkSnsR3_D_Stat : 47|4@0+ (1,0) [0|15] "SED" GWM + SG_ SidePrkSnsL4_D_Stat : 43|4@0+ (1,0) [0|15] "SED" GWM + SG_ SidePrkSnsL3_D_Stat : 37|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidChime_D_Stat : 4|2@0+ (1,0) [0|3] "SED" GWM + SG_ PrkAidSnsRlCntr_D_Stat : 15|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidSnsRrCrnr_D_Stat : 31|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidSnsRrCntr_D_Stat : 19|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidSnsRlCrnr_D_Stat : 11|4@0+ (1,0) [0|15] "SED" GWM + SG_ PrkAidRear_D_Stat : 39|2@0+ (1,0) [0|3] "SED" GWM + SG_ PrkAidFront_D_Stat : 2|2@0+ (1,0) [0|3] "SED" GWM + SG_ PrkAid_D_Falt : 7|3@0+ (1,0) [0|7] "SED" GWM + SG_ ApaLongCtrlEnbl_D_Rq : 0|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM + SG_ ApaBrk_A_Rq : 63|8@0+ (0.05,-12.75) [-12.75|0] "m/sec^2" ABS_ESC,ECM_Diesel,PCM,PCM_HEV,GWM + SG_ PrkAidLamp_D_Rq : 33|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 937 ParkAid_Data_2: 8 IPMA_ADAS + SG_ Veh_V_RqFap : 31|8@0+ (0.1,0) [0|25.5] "km/h" ECM_Diesel,PCM,PCM_HEV + SG_ TrnRngDRqFap_No_Cs : 23|8@0+ (1,0) [0|255] "unitless" PCM,PCM_HEV,TCM_DSL + SG_ TrnRngDRqFap_No_Cnt : 15|4@0+ (1,0) [0|15] "unitless" PCM,PCM_HEV,TCM_DSL + SG_ TrnRng_D_RqFap : 11|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV,TCM_DSL,GWM + SG_ FapLcDistToObj_L_Actl : 7|8@0+ (0.01,0) [0|2.53] "meter" ECM_Diesel,PCM,PCM_HEV + +BO_ 936 ParkAid_Data: 8 IPMA_ADAS + SG_ ApaButtnPrssd_B_Stat : 58|1@0+ (1,0) [0|1] "SED" PSCM + SG_ SAPPStatusCoding : 7|8@0+ (1,0) [0|255] "unitless" GWM + SG_ ApaSys_D_Stat : 61|3@0+ (1,0) [0|7] "SED" PSCM,GWM,ECM_Diesel,PCM,PCM_HEV + SG_ ApaSteWhl_D_RqDrv : 63|2@0+ (1,0) [0|3] "SED" GWM + SG_ ApaSteScanMde_D_Stat : 49|2@0+ (1,0) [0|3] "SED" GWM + SG_ ApaSelSapp_D_Stat : 51|2@0+ (1,0) [0|3] "SED" GWM + SG_ ApaSelPpa_D_Stat : 53|2@0+ (1,0) [0|3] "SED" GWM + SG_ ApaSelPoa_D_Stat : 55|2@0+ (1,0) [0|3] "SED" GWM + SG_ ApaScan_D_Stat : 41|2@0+ (1,0) [0|3] "SED" GWM + SG_ ApaLongCtl_D_RqDrv : 44|3@0+ (1,0) [0|7] "SED" GWM + SG_ ApaGearShif_D_RqDrv : 47|3@0+ (1,0) [0|7] "SED" GWM + SG_ ApaActvSide2_D_Stat : 33|2@0+ (1,0) [0|3] "SED" GWM + SG_ ApaAcsy_D_RqDrv : 36|3@0+ (1,0) [0|7] "SED" GWM + SG_ ApaTrgtDist_D_Stat : 11|4@0+ (1,0) [0|15] "SED" GWM + SG_ ApaMsgTxt_D_Rq : 15|4@0+ (1,0) [0|15] "SED" GWM + SG_ ApaChime_D_Rq : 39|3@0+ (1,0) [0|7] "SED" GWM + SG_ EPASExtAngleStatReq : 23|1@0+ (1,0) [0|1] "SED" PSCM,GWM,ABS_ESC + SG_ ExtSteeringAngleReq2 : 22|15@0+ (0.1,-1000) [-1000|2276.5] "Degrees" GWM,PSCM + +BO_ 877 HEV_Powertrain_Data7_FD1: 8 PCM_HEV + SG_ RngImpctDrv_L_Dsply : 39|9@0+ (1,-255) [-255|256] "km" GWM + SG_ RngImpctClim_L_Dsply : 16|9@0+ (1,-255) [-255|256] "km" GWM + SG_ VehElEffAvg_No_Dsply : 23|7@0+ (10,-100) [-100|1150] "wattHr/km" GWM + SG_ PwFlwFuelDrv_D_Dsply : 15|3@0+ (1,0) [0|7] "SED" GWM + SG_ PwFlwFuelClimt_B_Dsply : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ PwFlwFuelBatt_B_Dsply : 1|1@0+ (1,0) [0|1] "SED" GWM + SG_ PwFlwBattClimt_B_Dsply : 3|1@0+ (1,0) [0|1] "SED" GWM + SG_ PwFlwBatt_D_Dsply : 7|4@0+ (1,0) [0|15] "SED" GWM + +BO_ 589 Battery_Traction_5_FD1: 8 GWM + SG_ BattTrac2_Pw_LimChrg : 31|13@0+ (50,0) [0|409550] "watts" PCM_HEV + SG_ BattTrac2_Pw_LimDchrg : 34|13@0+ (50,0) [0|409550] "watts" PCM_HEV + SG_ BattTrac2_Pw_DchrgInst : 53|13@0+ (50,0) [0|409550] "watts" PCM_HEV + SG_ BattTrac2_Pw_ChrgInst : 7|13@0+ (50,0) [0|409550] "watts" PCM_HEV + +BO_ 588 Battery_Traction_4_FD1: 8 GWM + SG_ BattTracSoc2_Pc_Actl : 29|14@0+ (0.01,0) [0|163.81] "%" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTrac_Te_Actl : 9|10@0+ (0.5,-50) [-50|460.5] "degC" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTracDiagClr_B_Rq : 30|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 587 Battery_Traction_3_FD1: 8 GWM + SG_ BattTracClnt_Te_Actl : 41|8@0+ (0.5,-60) [-60|67.5] "degC" SOBDMC_HPCM_FD1 + SG_ BattTracWarnLamp_B_Rq : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ BattTracSrvcRqd_B_Rq : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ BattTracSoc_Pc_MxPrtct : 35|10@0+ (0.1,0) [0|100] "%" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTracSoc_Pc_MnPrtct : 29|10@0+ (0.1,0) [0|100] "%" PCM_HEV + SG_ BattTracSoc_Pc_LimLo : 23|10@0+ (0.1,0) [0|100] "%" PCM_HEV + SG_ BattTracSoc_Pc_LimHi : 1|10@0+ (0.1,0) [0|100] "%" PCM_HEV + +BO_ 389 PreCond_Hev_Data2_FD1: 8 SOBDMC_HPCM_FD1 + SG_ BattTracClntFlw_Pc_Rq : 63|7@0+ (1,0) [0|127] "percent" GWM + SG_ HtrnOvrTeLamp_B_Dsply : 5|1@0+ (1,0) [0|1] "SED" GWM + SG_ HtrnMil_D_Rq : 7|2@0+ (1,0) [0|3] "SED" GWM + SG_ HtrnAin_UHi_Actl : 39|10@0+ (0.5,0) [0|510.5] "volt" GWM,PCM_HEV + SG_ HtrnSrvcRqd_B_Dsply : 3|1@0+ (1,0) [0|1] "SED" GWM + SG_ HtrnHvilOpen_B_Actl : 24|1@0+ (1,0) [0|1] "SED" GWM,PCM_HEV + SG_ PtWakeupDeltaT_T_Rq : 2|11@0+ (1,0) [0|2045] "minute" GWM + SG_ PreCondActv_B_Actl : 50|1@0+ (1,0) [0|1] "SED" GWM + SG_ DrvCondTpRrDefrs_B_Rq : 49|1@0+ (1,0) [0|1] "SED" GWM + SG_ BattTrac_I_EstVsc : 23|15@0+ (0.05,-750) [-750|888.25] "Amps" GWM + +BO_ 1009 APIM_Send_Signals1_FD1: 8 GWM + SG_ ChrgCordUnlock_B_Rq : 60|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ AutoHoldSwtch_D_Stat3 : 50|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ TrlrTrgtAcquire_D_Rq : 63|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ TrlrAidCancl_B_Rq : 48|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PSCM + SG_ CenterStackRing_D_Actl : 59|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ APIM_NumberofTracks_St : 39|16@0+ (1,0) [0|65535] "unitless" Vector__XXX + SG_ APIM_ActiveTrackNum_St : 7|32@0+ (1,0) [0|4294967295] "unitless" Vector__XXX + SG_ ValetMode_D_Stat : 57|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TrlrAidSetup_D_Stat : 55|3@0+ (1,0) [0|7] "SED" Vector__XXX + +BO_ 360 Gear_Shift_by_Wire_2_FD1: 8 GWM + SG_ GsmSrvcRqd_B_Rq : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TrnGearPwmFalt_B_Actl : 15|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ GearButtnStuck_B_Actl : 14|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + +BO_ 122 Battery_Traction_1_FD1: 8 GWM + SG_ BattTrac_U_LimLo : 47|8@0+ (2,0) [0|510] "volt" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTrac_U_LimHi : 39|8@0+ (2,0) [0|510] "volt" SOBDMC_HPCM_FD1,PCM_HEV + SG_ VehStrtInhbt_B_RqBatt : 23|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTracOffFst_D_Actl : 22|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTracOff_B_Actl : 20|1@0+ (1,0) [0|1] "SED" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTracMil_D_Rq : 19|2@0+ (1,0) [0|3] "SED" PCM_HEV + SG_ BattTrac_U_Actl : 17|10@0+ (0.5,0) [0|510.5] "Volts" SOBDMC_HPCM_FD1,PCM_HEV + SG_ BattTrac_I_Actl : 6|15@0+ (0.05,-750) [-750|888.25] "Amps" SOBDMC_HPCM_FD1,PCM_HEV + +BO_ 90 Gear_Shift_by_Wire_FD1: 8 GWM + SG_ TrnGsmNtmState_D_Actl : 55|2@0+ (1,0) [0|3] "SED" ABS_ESC,PCM,PCM_HEV,TCM_DSL + SG_ DrQltyDrv_D_StatGsm : 42|3@0+ (1,0) [0|7] "SED" ABS_ESC,PCM,PCM_HEV,TCM_DSL,IPMA_ADAS + SG_ TrnBtsiOvrrd_B_Stat : 43|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ GsmGearMsgTxt_D_Rq : 63|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TrnRng_D_RqGsm : 51|4@0+ (1,0) [0|15] "SED" PCM,TCM_DSL + SG_ PrkBrkActv_D_RqGsmGear : 53|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ TrnValidGearRq_D_Stat : 25|2@0+ (1,0) [0|3] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearRqCnt_B_Actl : 26|1@0+ (1,0) [0|1] "unitless" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_U_Actl : 23|8@0+ (0.05,0) [0|12.7] "VOLT" TCM_DSL + SG_ TrnGearButtn_B_ActlR2 : 8|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlR1 : 9|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlR0 : 10|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlP2 : 11|1@0+ (1,0) [0|1] "SED" TCM_DSL,PCM,PCM_HEV + SG_ TrnGearButtn_B_ActlP1 : 12|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlP0 : 13|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlN2 : 14|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlN1 : 15|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlN0 : 0|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlM2 : 1|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlM1 : 2|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlM0 : 3|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlD2 : 4|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlD1 : 5|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGearButtn_B_ActlD0 : 6|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ TrnGear_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" SOBDMC_HPCM_FD1,PCM,PCM_HEV,TCM_DSL + SG_ TrnGear_No_Cnt : 47|4@0+ (1,0) [0|15] "Unitless" SOBDMC_HPCM_FD1,PCM,PCM_HEV,TCM_DSL + SG_ TrnGear_D_RqDrv : 31|5@0+ (1,0) [0|31] "SED" SOBDMC_HPCM_FD1,PCM,PCM_HEV,TCM_DSL + SG_ BrkSwtchPos_B_ActlGsm : 7|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + +BO_ 1091 TrailerInfo_FD1: 8 GWM + SG_ ParkLampTrlrOut_B_Stat : 15|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TrlrLampCtl_D_Stat : 4|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TrlrBattChrg_D_Stat : 2|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ StopLampTrlrOut_B_Stat : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TurnLampTrlrRr_B_Stat : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TurnLampTrlrRl_B_Stat : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TrlrLampCnnct_B_Actl : 7|1@0+ (1,0) [0|1] "SED" VDM,PCM_HEV,ECM_Diesel,PCM,TCM_DSL,ABS_ESC,IPMA_ADAS,PSCM + +BO_ 138 ActiveFrontStrg_Stat2_FD1: 8 GWM + SG_ SteWhlRelCalib_T_Actl : 7|8@0+ (1,0) [0|255] "ms" ABS_ESC + SG_ SteWhlRelCalib_An_Sns : 15|15@0+ (0.1,-1600) [-1600|1676.5] "deg" CMR_DSMC,PSCM,TCCM + +BO_ 131 Steering_Data_FD1: 8 GWM + SG_ HeadLghtHiFlash_D_Stat : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TurnLghtSwtch_D_Stat : 5|2@0+ (1,0) [0|3] "SED" IPMA_ADAS,PSCM + SG_ WiprFront_D_Stat : 3|4@0+ (1,0) [0|15] "SED" ABS_ESC,IPMA_ADAS,PCM,PCM_HEV + SG_ LghtAmb_D_Sns : 15|3@0+ (1,0) [0|7] "SED" IPMA_ADAS + SG_ AccButtnGapDecPress : 12|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ AccButtnGapIncPress : 11|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ AslButtnOnOffCnclPress : 10|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ AslButtnOnOffPress : 9|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ CcAslButtnCnclPress : 8|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ LaSwtchPos_D_Stat : 23|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ CcAslButtnCnclResPress : 21|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcAslButtnDeny_B_Actl : 20|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcAslButtnIndxDecPress : 19|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ CcAslButtnIndxIncPress : 18|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ CcAslButtnOffCnclPress : 17|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnOnOffCncl : 16|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnOnPress : 31|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcAslButtnResDecPress : 30|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAslButtnResIncPress : 29|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcAslButtnSetDecPress : 28|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcAslButtnSetIncPress : 27|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcAslButtnSetPress : 26|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CcAsllButtnResPress : 25|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcButtnOffPress : 24|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcButtnOnOffCnclPress : 39|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcButtnOnOffPress : 38|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ CcButtnOnPress : 37|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ HeadLghtHiFlash_D_Actl : 36|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ HeadLghtHiOn_B_StatAhb : 34|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ AhbStat_B_Dsply : 33|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ AccButtnGapTogglePress : 32|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ WiprFrontSwtch_D_Stat : 47|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ HeadLghtHiCtrl_D_RqAhb : 43|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ TjaButtnOnOffPress : 40|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + +BO_ 787 Power_Liftgate_Stat_FD1: 8 GWM + SG_ DrLckCnt_No_ActlTgate : 12|4@0+ (1,0) [0|15] "unitless" Vector__XXX + SG_ DrTgateChime2_D_Rq : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ DrTGate_D_Rq : 2|2@0+ (1,0) [0|3] "SED" ECM_Diesel + SG_ PwLftgtIntSw_B_Stat : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Power_Liftgate_Mode_Stt : 4|2@0+ (1,0) [0|3] "SED" Vector__XXX + +BO_ 953 Body_Info_8_FD1: 8 GWM + SG_ BattRgenLoDChrg_D_Rq : 27|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM + SG_ BattRgenLoChrg_D_Rq : 25|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM + SG_ ChrgCordLck_B_Stat : 31|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ChrgCordResp2_No_Actl : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ ChrgCordResp1_No_Actl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ WakeAlarm3_D_Stat : 1|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ WakeAlarm2_D_Stat : 3|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ WakeAlarm1_D_Stat : 5|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM_HEV + SG_ WakeAlarm0_D_Stat : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + +BO_ 1093 TrailerBrakeInfo_FD1: 8 GWM + SG_ TrlBrkInitOut_D_Stat : 10|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TrlrBrkOut_No_Dsply : 23|4@0+ (1,0) [0|15] "unitless" Vector__XXX + SG_ TrlrBrkMde_D_Actl : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TrlrBrkGain_No_Actl : 15|5@0+ (0.5,0) [0|15.5] "unitless" Vector__XXX + SG_ TrlrBrkDsply_B_Rq : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TrlrBrkDcnnt_B_Actl : 5|1@0+ (1,0) [0|1] "SED" VDM + SG_ TrlrBrkActCnnct_B_Actl : 6|1@0+ (1,0) [0|1] "SED" VDM,ECM_Diesel,PCM,TCM_DSL,ABS_ESC,PSCM,TCCM,IPMA_ADAS + SG_ StopLamp_B_RqTrlrBrk : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TrlrBrkCtl_B_Falt : 4|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ TrlrBrkActCirct_B_Falt : 1|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + +BO_ 792 IPC_Send_Signals_2_FD1: 8 GWM + SG_ FuelRange_L_Dsply : 45|14@0+ (0.1,0) [0|1638.3] "km" ECM_Diesel + SG_ ElTrip_L_Dsply : 31|16@0+ (0.1,0) [0|6553.3] "unitless" Vector__XXX + SG_ ElLongTerm_L_Dsply : 7|24@0+ (0.1,0) [0|1677721.3] "unitless" Vector__XXX + +BO_ 968 Cluster_Lighting_Rq_FD1: 8 GWM + SG_ SlMde_D_Rq : 27|2@0+ (1,0) [0|3] "SED" ECM_Diesel + SG_ IsaOffst_D_Rq : 31|4@0+ (1,0) [0|15] "SED" ECM_Diesel + +BO_ 819 Pass_Dr_Stat_FD1: 8 GWM + SG_ RollCode_No_ActlPdm : 31|16@0+ (1,0) [0|65535] "Unitless" Vector__XXX + SG_ Memory_3_SwPsngr_Stat : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Memory_2_SwPsngr_Stat : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Memory_1_SwPsngr_Stat : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ BLISLEDStatPassSide : 2|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ WndwPsngrSide_D_Stat : 4|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM + SG_ Pasngr_Lock_Sw_Stat : 6|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Pasngr_Lock_Sw_Cnt : 15|8@0+ (1,0) [0|255] "Cnt" Vector__XXX + SG_ ChildLckFdbckRp_B_Stat : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 818 Driver_Dr_Stat_FD1: 8 GWM + SG_ BLISLEDStatDriverSide : 47|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ ChildLckPw_N_Cnt : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ WndwDrvSide_D_Stat : 1|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM + SG_ RollCodeDrvDrKeyCyl : 23|16@0+ (1,0) [0|65535] "Unitless" Vector__XXX + SG_ KeyCylSwDrvDr_D_Stat : 3|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Driver_Lock_Sw_Stat : 5|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Driver_Lock_Sw_Cnt : 15|8@0+ (1,0) [0|255] "Cnt" Vector__XXX + SG_ ChildLckPw_D_Rq : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ChildLckFdbckRd_B_Stat : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ RvrseMirrorChime_B_Rq : 45|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 806 Compressor_Req_FD1: 8 GWM + SG_ SnowPlowMde_B_Enbl : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ StopStrtDrvMde_B_RqBtn : 3|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM + SG_ HvacHtrCore_Te_Rq : 49|10@0+ (0.25,-50) [-50|205.75] "degC" PCM_HEV,SOBDMC_HPCM_FD1,ECM_Diesel + SG_ ClimtHeat_D_Rq : 20|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV + SG_ ClimtCool_D_Rq : 23|3@0+ (1,0) [0|7] "SED" SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV + SG_ HvacEvap_Te_Rq : 33|10@0+ (0.125,-50) [-50|77.875] "Degrees C" SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV + SG_ HvacEvap_Te_Actl : 17|10@0+ (0.125,-50) [-50|77.75] "Degrees C" SOBDMC_HPCM_FD1,ECM_Diesel,PCM,PCM_HEV + SG_ HvacAirCond_B_Rq : 7|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ HvacEvap_Te_Offst : 1|10@0+ (0.125,-50) [-50|77.875] "Degrees C" ECM_Diesel,PCM,PCM_HEV + SG_ ClimtPw_B_Rq : 5|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM + +BO_ 765 Mc_Send_Signals_2_FD1: 8 GWM + SG_ Mc_VehTimeFrmtUsrSel_St : 1|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Running_Board_Cmd : 21|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ EngExhMdeQuiet_D2_Rq : 55|3@0+ (1,0) [0|7] "SED" PCM + SG_ EdmSailMde_B_RqDrv : 48|1@0+ (1,0) [0|1] "SED" ECM_Diesel + SG_ DrvInputRequired_B_Rq : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ AwdRnge_D_ActlIpc : 29|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ BalrSwtch_D_Stat : 57|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ BalrMde_D_Rq : 59|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ WaitToStartLamp_D_Falt : 50|2@0+ (1,0) [0|3] "SED" ECM_Diesel + SG_ EsaOn_B_Rq : 15|1@0+ (1,0) [0|1] "SED" PSCM + SG_ BttOn_B_Rq : 26|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ Btt_L_Actl : 39|7@0+ (0.1,0) [0|12.5] "meter" IPMA_ADAS + SG_ SelDrvMdeTxtReset_B_Rq : 40|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ SelDrvMdeDsply_B_Avail : 41|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ Mc_VehUntTrpCoUsrSel_St : 23|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Mc_VehUnitTempUsrSel_St : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Mc_VehLangUsrSel_St : 7|6@0+ (1,0) [0|63] "SED" Vector__XXX + +BO_ 559 ElecHorizon_Data2_FD1: 8 GWM + SG_ EhData2_No_Actl : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" IPMA_ADAS,ECM_Diesel + +BO_ 558 ElecHorizon_Data1_FD1: 8 GWM + SG_ EhData1_No_Actl : 7|64@0+ (1,0) [0|1.84467440737096E+019] "unitless" IPMA_ADAS,ECM_Diesel + +BO_ 934 Side_Detect_L_Stat: 8 IPMA_ADAS + SG_ CtaAlrtLeft2_D_Stat : 30|3@0+ (1,0) [0|7] "SED" GWM + SG_ CtaBrkLeftMsgTxt_B_Rq : 42|1@0+ (1,0) [0|1] "SED" GWM + SG_ CtaLeftBrkDecel_B_Rq : 7|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ CtaLeftBrkEnbl_B_Rq : 31|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ Side_Detect_L_Illum : 39|8@0+ (1,0) [0|255] "Percent" GWM + SG_ BttLeft_D_Stat : 45|3@0+ (1,0) [0|7] "SED" GWM + SG_ BttLeft_D_RqDrv : 47|2@0+ (1,0) [0|3] "SED" GWM + SG_ CtaSnsLeft_D_Stat : 25|2@0+ (1,0) [0|3] "SED" GWM + SG_ SodDetctLeft_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM + SG_ CtaLeft_D_Stat : 18|3@0+ (1,0) [0|7] "SED" GWM + SG_ CtaAlrtLeft_D_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ SodLeft_D_Stat : 15|3@0+ (1,0) [0|7] "SED" GWM + SG_ SodSnsLeft_D_Stat : 12|2@0+ (1,0) [0|3] "SED" GWM + SG_ SodAlrtLeft_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ SodWarnLeft_Prd_Rq : 6|7@0+ (1,0) [0|127] "millisecond" GWM + +BO_ 1072 Cluster_Info1_FD1: 8 GWM + SG_ LscmbbStat_B_Actl : 2|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ HaDsplyCpblty_B_Stat : 42|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ AccDeny_B_RqIpc : 7|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ DrvSlipCtlMde_D_Rq : 33|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ EngIdlShutDown_B_RqDrv : 3|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ HsaMde_D_Rq : 54|2@0+ (1,0) [0|3] "SED" ABS_ESC + SG_ NtrlTowMdeEnbl_B_RqDrv : 1|1@0+ (1,0) [0|1] "SED" TCCM,TCM_DSL,PCM_HEV,PCM + SG_ BulbChkActv_B_Stat : 55|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ParkDetect_Stat : 52|1@0+ (1,0) [0|1] "SED" PCM_HEV,PCM + SG_ ReducedGuard_D_Rq : 51|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TrlrBrkMde_D_Rq : 57|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TRLR_SWAY_CONFIG_CMD : 56|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ TRAILER_BRAKE_CONFIG : 37|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Power_Liftgate_Mode_Cmd : 39|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ AccEnbl_B_RqDrv : 35|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ OdometerMasterValue : 15|24@0+ (1,0) [0|16777214] "km" VDM,SOBDMC_HPCM_FD1,TCCM,CMR_DSMC,ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,PSCM,TCM_DSL + SG_ EngOilLife_B_RqReset : 43|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ ePRNDL_MODE : 0|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ DrvSlipCtlMde_B_Rq2 : 34|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ MetricActv_B_Actl : 6|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ KeyTypeChngMykey_D_Rq : 41|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ ManRgen_D_Rq : 5|2@0+ (1,0) [0|3] "SED" ECM_Diesel + +BO_ 909 Body_Info_6_FD1: 8 GWM + SG_ IgnPsswrdDsply_B_Rq : 57|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ ElPwPoint_D_Rq : 59|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PoliceIdlMde_D_Stat : 55|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ DrLatchMsgTxt_D_Rq : 43|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ SecurityMsgTxt_D_Rq : 47|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PrmtrAlrmEvnt_D_Stat : 35|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ HeadLghtHiPrmsn_D_Stat : 51|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ SteWhlLckMsgTxt_D_Rq : 25|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ immoMsgTxt_D_Rq : 39|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ PrsnlDevcChrgEnbl_B_Rq : 40|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TracKeyMde_D_Stat : 45|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PEBackupSlot_Stats : 27|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ KeyMykeyTot_No_Cnt : 3|4@0+ (1,0) [0|15] "Counts" Vector__XXX + SG_ Keycode_Status : 15|20@0+ (1,0) [0|1048575] "unitless" Vector__XXX + SG_ KeyAdmnTot_No_Cnt : 7|4@0+ (1,0) [0|15] "Counts" Vector__XXX + +BO_ 963 BCM_Lamp_Stat_FD1: 8 GWM + SG_ Illuminated_Entry_Stat : 63|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Dr_Courtesy_Light_Stat : 49|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Courtesy_Delay_Status : 51|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ ImpactEvntFdbck_D_Stat : 53|2@0+ (1,0) [0|3] "SED" CMR_DSMC + SG_ WrlssAcsyChrgInhbt_B_Rq : 40|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PudLampPsngr_D_Rq : 57|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ HeadLampLoOut_B_Stat : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CrnrLghtRight_Pc_Rq : 47|7@0+ (1,0) [0|100] "percent" Vector__XXX + SG_ CrnrLghtLeft_Pc_Rq : 39|7@0+ (1,0) [0|100] "percent" Vector__XXX + SG_ HeadLghtHiFdbck_D_Stat : 55|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PudLampDrv_D_Rq : 59|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ TrnNotInPrkChime_B_Rq : 24|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PrkLightChime_B_Rq : 25|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ KeyInIgnWarn_B_Cmd : 27|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ HomeSafeLtChime_B_Rq : 28|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ StopLghtOn_B_Stat : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ RvrseLghtOn_B_Stat : 9|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PrkLght_D_Stat : 13|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ HeadLghtSwtch_D_Stat : 15|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ HeadLampLoFrOn_B_Stat : 2|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ HeadLampLoFlOn_B_Stat : 3|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ HeadLampLoActv_B_Stat : 4|1@0+ (1,0) [0|1] "SED" IPMA_ADAS,PCM,ECM_Diesel + SG_ Headlamp_On_Wrning_Cmd : 29|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Park_Brake_Chime_Rqst : 26|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ HeadLghtHiOn_B_Stat : 1|1@0+ (1,0) [0|1] "SED" ECM_Diesel,IPMA_ADAS,PCM + SG_ BrkWarnInd_B_Rq : 20|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Brk_Fluid_Lvl_Low : 31|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ ReducedGuard_D_Stat : 19|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Perimeter_Alarm_Status : 17|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ Courtesy_BSave_Stat : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ DrTgateLck_D_Stat : 61|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ WndwGlbl_D_Cmd : 23|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ PudLamp_D_Rq : 11|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ DayRnngLampOn_B_Stat : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PerimeterAlarmChimeRq : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 145 Yaw_Data_FD1: 8 GWM + SG_ VehYawWActl_D_Qf : 53|2@0+ (1,0) [0|3] "SED" VDM,IPMA_ADAS,ABS_ESC + SG_ VehRolWActl_D_Qf : 55|2@0+ (1,0) [0|3] "SED" VDM,IPMA_ADAS,ABS_ESC + SG_ VehRollYawW_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" IPMA_ADAS,ABS_ESC + SG_ VehRollYaw_No_Cnt : 47|8@0+ (1,0) [0|255] "Unitless" VDM,IPMA_ADAS,ABS_ESC + SG_ VehYaw_W_Actl : 23|16@0+ (0.0002,-6.5) [-6.5|6.6066] "rad/s" VDM,ABS_ESC,PSCM,IPMA_ADAS + SG_ VehRol_W_Actl : 7|16@0+ (0.0002,-6.5) [-6.5|6.6066] "rad/s" VDM,ABS_ESC,IPMA_ADAS + +BO_ 76 RCMStatusMessage2_FD1: 8 GWM + SG_ FirstRowBuckleMid : 28|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ SecondRowBucklePsngr : 23|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ SecondRowBuckleMid : 9|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ SecondRowBuckleDriver : 11|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ FirstRowBuckleDriver : 15|2@0+ (1,0) [0|3] "SED" CMR_DSMC,ABS_ESC,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL + SG_ RILReq : 7|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ FirstRowBucklePsngr : 13|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ RstrnImpactEvntStatus : 3|3@0+ (1,0) [0|7] "SED" CMR_DSMC,SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV,TCM_DSL + SG_ PsngrFrntDetct_D_Actl : 5|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ EDRTriggerEvntSync : 29|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ PassRstrnInd_Req : 31|2@0+ (1,0) [0|3] "SED" Vector__XXX + +BO_ 65 Global_PATS_Cntrl_Info_FD1: 8 GWM + SG_ immoControlData_T1 : 15|40@0+ (1,0) [0|1099511627775] "Encrypted" ECM_Diesel,PCM,PCM_HEV + SG_ immoControlCmd_T1 : 7|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV + +BO_ 1076 Cluster_Info_3_FD1: 8 GWM + SG_ HILL_DESC_SW : 32|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ AutoRgen_D_Rq : 34|2@0+ (1,0) [0|3] "SED" ECM_Diesel + SG_ W2S_LAMP_OK : 37|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ OdoTripRx_B_Actl : 2|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ Veh_V_CompLimMx : 47|12@0+ (0.1,0) [0|409.5] "km/h" ECM_Diesel,PCM,PCM_HEV + SG_ DrvSlipCtlMde_B_RqMyKey : 38|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ FuelLvlWarn_D_Actl : 51|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ FuelSecndActv_B_Actl : 39|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ FuelLvlPssvSide_No_Raw : 17|10@0+ (1,0) [0|1023] "Unitless" ECM_Diesel,PCM,PCM_HEV + SG_ FUEL_SENSOR_NUM : 35|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ FuelLvlActvSide_No_Raw : 49|10@0+ (1,0) [0|1023] "Unitless" ECM_Diesel,PCM,PCM_HEV + SG_ FuelLvl_Pc_Dsply : 1|10@0+ (0.108696,-5.217408) [-5.217408|105.9786] "Percent" VDM,ECM_Diesel + SG_ DISPLAY_SPEED_SCALING : 23|4@0+ (0.5,100) [100|107.5] "%" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV + SG_ DISPLAY_SPEED_OFFSET : 7|3@0+ (0.5,0) [0|3.5] "kph" IPMA_ADAS,ECM_Diesel,PCM,PCM_HEV + +BO_ 862 Climate_Cntrl_Data_2_FD1: 8 GWM + SG_ AutoStpHvacDelta_I_Est : 15|8@0+ (1,-192) [-192|62] "ampere" Vector__XXX + SG_ HvacBlwrFront_D_Stat : 55|5@0+ (1,0) [0|31] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ CabnAmb_Te_Actl : 39|8@0+ (0.5,-57) [-57|70] "degreesC" SOBDMC_HPCM_FD1,PCM_HEV + SG_ HvacRemoteStrt_N_Rq : 7|4@0+ (100,450) [450|1950] "RPM" ECM_Diesel,PCM,PCM_HEV + SG_ ClimtThrmlLoad_No_Actl : 47|8@0+ (1,0) [0|254] "unitless" SOBDMC_HPCM_FD1,PCM_HEV + SG_ HvacRec_Pc_Est : 23|7@0+ (1,0) [0|127] "Percent" PCM_HEV,SOBDMC_HPCM_FD1 + SG_ HvacAir_Flw_Est : 16|9@0+ (0.5,0) [0|255.5] "liter/second" SOBDMC_HPCM_FD1 + +BO_ 931 Body_Info_9_FD1: 8 GWM + SG_ PtWakeReas_D_Stat : 38|4@0+ (1,0) [0|15] "SED" PCM_HEV + SG_ VehOnSrc_D_Stat : 19|4@0+ (1,0) [0|15] "SED" ABS_ESC,PCM_HEV,ECM_Diesel,PCM + SG_ StrtrMtrCtlDStat_No_Cs : 31|8@0+ (1,0) [0|255] "unitless" PCM_HEV,ECM_Diesel,PCM + SG_ EngStrtActv_B_Stat : 39|1@0+ (1,0) [0|1] "SED" PCM_HEV,ECM_Diesel,PCM + SG_ EngStrt_B_Rq : 0|1@0+ (1,0) [0|1] "SED" PCM_HEV,ECM_Diesel,PCM + SG_ DrvInCtl_B_Stat : 1|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ AdvStrt_D_Stat : 23|4@0+ (1,0) [0|15] "SED" PCM_HEV,ECM_Diesel,PCM + SG_ CrnkInhbt_No_Cs : 15|8@0+ (1,0) [0|255] "Unitless" ECM_Diesel,PCM,PCM_HEV + SG_ CrnkInhbt_No_Cnt : 6|4@0+ (1,0) [0|15] "Unitless" ECM_Diesel,PCM,PCM_HEV + SG_ CrnkInhbt_B_Stat : 7|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ IgnPreOffActv_B_Stat : 2|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + +BO_ 578 Body_Info_4_FD1: 8 GWM + SG_ PtLatchActv_B_RqBcm : 56|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV,TCM_DSL + SG_ immoSecureIdleMode : 61|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ ReFuelSwtchStat_D_Actl : 63|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ FuelPumpPwr_D_Stat : 50|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ BattULo_U_Actl : 39|8@0+ (0.0625,0) [0|15.875] "volt" CMR_DSMC,SOBDMC_HPCM_FD1,ABS_ESC,IPMA_ADAS,PSCM,ECM_Diesel,PCM,PCM_HEV + SG_ PrkLckCtl_B_Enbl : 22|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PrkLckCtlMsgTxt_D_Rq : 55|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PrkLckCtlAvail_T_Stat : 47|8@0+ (1,0) [0|255] "second" Vector__XXX + SG_ BrkTrnShifLck_B_Stat : 23|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV,TCM_DSL + SG_ PrkLckCtlUnlck_D_Stat : 58|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ PrkLckCtlTow_B_Enbl : 59|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DriverCrankingReq : 51|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ EngOff_T_Actl : 7|16@0+ (1,0) [0|65534] "second^0.5" ABS_ESC,IPMA_ADAS,TCCM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL + SG_ DcacElPw_D_Rq : 53|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM + SG_ BattULo_I_Actl : 21|14@0+ (0.0625,-512) [-512|511.875] "ampere" ECM_Diesel,PCM,PCM_HEV + +BO_ 947 BodyInfo_3_FD1: 8 GWM + SG_ ValetMode_D_Mem : 16|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DimmingLvlEvnt_No_Actl : 18|2@0+ (1,0) [0|3] "unitless" Vector__XXX + SG_ DrStatDrvErrCnt_B_Stat : 19|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ TurnLghtRight_D_Rq : 63|2@0+ (1,0) [0|3] "SED" CMR_DSMC,IPMA_ADAS + SG_ TurnLghtRightOn_B_Stat : 35|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ TurnLghtLeftOn_B_Stat : 54|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ FogLghtRearOn_B_Stat : 1|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ Backlit_LED_Status : 23|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ TurnLghtLeft_D_Rq : 9|2@0+ (1,0) [0|3] "SED" CMR_DSMC,IPMA_ADAS + SG_ FogLghtFrontOn_B_Stat : 56|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ IgnKeyType_D_Actl : 39|4@0+ (1,0) [0|15] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV + SG_ Parklamp_Status : 3|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ Litval : 47|8@0+ (1,0) [0|253] "SED" IPMA_ADAS + SG_ Key_In_Ignition_Stat : 11|1@0+ (1,0) [0|1] "SED" ABS_ESC + SG_ Ignition_Status : 7|4@0+ (1,0) [0|15] "SED" VDM,CMR_DSMC,SOBDMC_HPCM_FD1,ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,PSCM,TCCM,TCM_DSL + SG_ Dimming_Lvl : 31|8@0+ (1,0) [0|253] "SED" IPMA_ADAS + SG_ Day_Night_Status : 15|2@0+ (1,0) [0|3] "SED" CMR_DSMC,ECM_Diesel,IPMA_ADAS,PCM + SG_ Remote_Start_Status : 13|2@0+ (1,0) [0|3] "SED" CMR_DSMC,IPMA_ADAS + SG_ DrStatTgate_B_Actl : 0|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ DrStatRr_B_Actl : 49|1@0+ (1,0) [0|1] "SED" ABS_ESC,IPMA_ADAS + SG_ DrStatRl_B_Actl : 48|1@0+ (1,0) [0|1] "SED" ABS_ESC,IPMA_ADAS + SG_ DrStatPsngr_B_Actl : 60|1@0+ (1,0) [0|1] "SED" CMR_DSMC,ABS_ESC,IPMA_ADAS + SG_ DrStatInnrTgate_B_Actl : 58|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ DrStatHood_B_Actl : 59|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DrStatDrv_B_Actl : 61|1@0+ (1,0) [0|1] "SED" CMR_DSMC,ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,TCCM + SG_ PrkBrkActv_B_Actl : 55|1@0+ (1,0) [0|1] "SED" ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,TCCM,TCM_DSL + SG_ LifeCycMde_D_Actl : 53|4@0+ (1,0) [0|15] "SED" VDM,SOBDMC_HPCM_FD1,ABS_ESC,ECM_Diesel,IPMA_ADAS,PCM,PCM_HEV,PSCM,TCM_DSL + SG_ Delay_Accy : 57|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CrashEvnt_D_Stat : 34|2@0+ (1,0) [0|3] "SED" Vector__XXX + SG_ FuelPmpInhbt_B_Stat : 32|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ BodySrvcRqd_B_Rq : 10|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 1084 Battery_Mgmt_3_FD1: 8 GWM + SG_ BattULoChrg_URate_RqMx : 63|6@0+ (0.1,0) [0|6.3] "volts/second" ECM_Diesel,PCM,PCM_HEV + SG_ BattULoChrg_U_RqMx : 55|6@0+ (0.1,10.6) [10.6|16.9] "volt" ECM_Diesel,PCM,PCM_HEV + SG_ BattULoChrg_U_RqMn : 45|6@0+ (0.1,10.6) [10.6|16.9] "volt" ECM_Diesel,PCM,PCM_HEV + SG_ BattULoState_D_Qlty : 47|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ BSFault : 7|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV + SG_ BattULo2_Te_Actl : 30|7@0+ (1,-40) [-40|86] "degC" ECM_Diesel,PCM,PCM_HEV + SG_ BSBattSOC : 22|7@0+ (1,0) [0|127] "%" ECM_Diesel,PCM,PCM_HEV + SG_ BSBattQDeltaRideAh : 6|15@0+ (0.0078125,-100) [-100|155.9921875] "ampere*hour" ECM_Diesel,PCM,PCM_HEV + SG_ BSBattQCapAh : 38|7@0+ (1,0) [0|127] "ampere*hour" ECM_Diesel,PCM,PCM_HEV + +BO_ 1068 Battery_Mgmt_2_FD1: 8 GWM + SG_ EngStrtInhbt_B_RqBatt : 2|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM + SG_ BattULoChrg_D_Rq : 7|2@0+ (1,0) [0|3] "SED" ECM_Diesel,PCM + SG_ PwSysULoFalt_D_Stat : 12|4@0+ (1,0) [0|15] "SED" Vector__XXX + SG_ Shed_T_Eng_Off_B : 8|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Shed_Feature_Group_ID : 20|5@0+ (1,0) [0|31] "SED" ECM_Diesel,PCM,PCM_HEV,IPMA_ADAS + SG_ Shed_Drain_Eng_Off_B : 0|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Shed_Level_Req : 23|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM,PCM_HEV,IPMA_ADAS + SG_ BattULoSrvc_T_Actl : 39|12@0+ (1,0) [0|4095] "days" Vector__XXX + SG_ ULoRgenTestMde_B_Rq : 31|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM + SG_ ChargeMode : 15|3@0+ (1,0) [0|7] "SED" ECM_Diesel,PCM + SG_ IdleSpeedIncrease_El : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ Batt_Lo_SoC_B : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ PeriodicElLoad_B_Stat : 1|1@0+ (1,0) [0|1] "SED" ECM_Diesel + SG_ Batt_Crit_SoC_B : 4|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 146 Accel_Data_FD1: 8 GWM + SG_ VehVert2_A_Actl : 36|13@0+ (0.01,-40) [-40|41.89] "m/s^2" VDM,TCCM,IPMA_ADAS,ABS_ESC,ECM_Diesel + SG_ VehLatLongVertA_No_Cs : 55|8@0+ (1,0) [0|255] "Unitless" TCCM,IPMA_ADAS,ABS_ESC + SG_ VehLatLongVert_No_Cnt : 63|8@0+ (1,0) [0|255] "Unitless" VDM,TCCM,IPMA_ADAS,ABS_ESC + SG_ VehLong2_A_Actl : 20|13@0+ (0.01,-40) [-40|41.89] "m/s^2" VDM,TCCM,ABS_ESC,ECM_Diesel,IPMA_ADAS + SG_ VehLat2_A_Actl : 4|13@0+ (0.01,-40) [-40|41.89] "m/s^2" VDM,TCCM,ABS_ESC,ECM_Diesel,IPMA_ADAS + SG_ VehVertAActl_D_Qf : 38|2@0+ (1,0) [0|3] "SED" VDM,TCCM,IPMA_ADAS,ABS_ESC + SG_ VehLongAActl_D_Qf : 22|2@0+ (1,0) [0|3] "SED" VDM,TCCM,ABS_ESC,ECM_Diesel + SG_ VehLatAActl_D_Qf : 6|2@0+ (1,0) [0|3] "SED" VDM,TCCM,ABS_ESC + +BO_ 1900 TesterPhysicalResCCM: 64 IPMA_ADAS + SG_ TesterPhysicalResCCM : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1806 TesterPhysicalResIPMA: 64 IPMA_ADAS + SG_ TesterPhysicalResIPMA : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 997 Personality_CCM_Data: 8 IPMA_ADAS + SG_ PersIndexCcm_D_Actl : 39|3@0+ (1,0) [0|7] "SED" GWM + SG_ FeatNoCcmActl : 23|16@0+ (1,0) [0|65535] "Number" GWM + SG_ FeatConfigCcmActl : 7|16@0+ (1,0) [0|65535] "Undefined" GWM + +BO_ 983 Steer_Assist_Data: 8 IPMA_ADAS + SG_ CmbbObjRelLong_V_Actl : 39|10@0+ (0.1,-102.1) [-102.1|0] "meters/sec" PSCM + SG_ CmbbObjRelLat_V_Actl : 23|9@0+ (0.1,-25.5) [-25.5|25.4] "meters/sec" PSCM + SG_ CmbbObjDistLong_L_Actl : 7|10@0+ (0.1,0) [0|102.1] "meter" PSCM + SG_ CmbbObjDistLat_L_Actl : 45|9@0+ (0.1,-25.5) [-25.5|25.4] "meter" PSCM + SG_ CmbbObjConfdnc_D_Stat : 9|2@0+ (1,0) [0|3] "SED" PSCM + SG_ CmbbObjColl_T_Actl : 30|7@0+ (0.05,0) [0|6.25] "second" PSCM + SG_ CmbbObjClass_D_Stat : 13|4@0+ (1,0) [0|15] "SED" PSCM + SG_ EsaEnbl_D2_Rq : 52|2@0+ (1,0) [0|3] "SED" PSCM + +BO_ 982 LateralMotionControl2: 8 IPMA_ADAS + SG_ LatCtlCrv_NoRate2_Actl : 55|11@0+ (1E-006,-0.001024) [-0.001024|0.001023] "meter^2" PSCM + SG_ LatCtlPath_No_Cnt : 60|4@0+ (1,0) [0|15] "Unitless" PSCM + SG_ LatCtlPath_No_Cs : 15|8@0+ (1,0) [0|255] "Unitless" PSCM + SG_ LatCtl_D2_Rq : 6|3@0+ (1,0) [0|7] "SED" PSCM + SG_ HandsOffCnfm_B_Rq : 7|1@0+ (1,0) [0|1] "SED" PSCM + SG_ LatCtlRampType_D_Rq : 1|2@0+ (1,0) [0|3] "SED" PSCM + SG_ LatCtlPrecision_D_Rq : 3|2@0+ (1,0) [0|3] "SED" PSCM + SG_ LatCtlPathOffst_L_Actl : 33|10@0+ (0.01,-5.12) [-5.12|5.11] "meter" PSCM + SG_ LatCtlPath_An_Actl : 28|11@0+ (0.0005,-0.5) [-0.5|0.5235] "radians" PSCM + SG_ LatCtlCurv_No_Actl : 23|11@0+ (2E-005,-0.02) [-0.02|0.02094] "1/meter" PSCM + +BO_ 981 GlareFreeBeam: 8 IPMA_ADAS + SG_ AdbRamping_T_Rq : 44|4@0+ (200,0) [0|3000] "millisecond" GWM + SG_ AdbBrdrTop_An_Rq : 7|8@0+ (0.04,-9.54) [-9.54|0.58] "degrees" GWM + SG_ AdbBrdrRight_L_Stat : 37|9@0+ (2,0) [0|1018] "meter" GWM + SG_ AdbBrdrRight_An_Rq : 31|10@0+ (0.04,-20.4) [-20.4|20.44] "degrees" GWM + SG_ AdbBrdrLeft_L_Stat : 40|9@0+ (2,0) [0|1018] "meter" GWM + SG_ AdbBrdrLeft_An_Rq : 9|10@0+ (0.04,-20.4) [-20.4|20.44] "degrees" GWM + SG_ AdbBrdrBottom_An_Rq : 15|6@0+ (0.04,-1.86) [-1.86|0.58] "degrees" GWM + SG_ AdbBeam_D_Rq : 63|3@0+ (1,0) [0|7] "SED" GWM + +BO_ 980 AutoDriveBeam_Data1: 8 IPMA_ADAS + SG_ AdbBrdr1DistRigh_D_Stat : 59|4@0+ (1,0) [0|15] "SED" GWM + SG_ AdbBrdr1DistLeft_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM + SG_ AdbMde1_D_Rq : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdbIntns1_D_Rq : 12|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdbBrdr1Up_An_Rq : 36|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM + SG_ AdbBrdr1Right_An_Rq : 31|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM + SG_ AdbBrdr1Low_An_Rq : 8|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM + SG_ AdbBrdr1Left_An_Rq : 7|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM + SG_ AdbBrdr1CritRigh_T_Stat : 43|4@0+ (100,0) [0|1500] "millisecond" GWM + SG_ AdbBrdr1CritLeft_T_Stat : 55|4@0+ (100,0) [0|1500] "millisecond" GWM + +BO_ 979 LateralMotionControl: 8 IPMA_ADAS + SG_ LatCtlRng_L_Max : 63|6@0+ (2,0) [0|126] "meter" GWM + SG_ HandsOffCnfm_B_Rq : 51|1@0+ (1,0) [0|1] "SED" GWM + SG_ LatCtl_D_Rq : 36|3@0+ (1,0) [0|7] "SED" GWM + SG_ LatCtlRampType_D_Rq : 53|2@0+ (1,0) [0|3] "SED" GWM + SG_ LatCtlPrecision_D_Rq : 33|2@0+ (1,0) [0|3] "SED" GWM + SG_ LatCtlPathOffst_L_Actl : 47|10@0+ (0.01,-5.12) [-5.12|5.11] "meter" GWM + SG_ LatCtlPath_An_Actl : 31|11@0+ (0.0005,-0.5) [-0.5|0.5235] "radians" GWM + SG_ LatCtlCurv_NoRate_Actl : 12|13@0+ (2.5E-007,-0.001024) [-0.001024|0.00102375] "1/meter" GWM + SG_ LatCtlCurv_No_Actl : 7|11@0+ (2E-005,-0.02) [-0.02|0.02094] "1/meter" GWM + +BO_ 976 SuspensionRoad_Data: 8 IPMA_ADAS + SG_ SuspClkSync_No_Actl : 55|8@0+ (1,0) [0|253] "unitless" GWM + SG_ SrpSigValid_B_Stat : 47|1@0+ (1,0) [0|1] "SED" GWM + SG_ SrpHghtRight_L_Actl : 24|9@0+ (0.000625,-0.16) [-0.16|0.158125] "meter" GWM + SG_ SrpHghtLeft_L_Actl : 17|9@0+ (0.000625,-0.16) [-0.16|0.158125] "meter" GWM + SG_ SrpEventRight_D_Stat : 19|2@0+ (1,0) [0|3] "SED" GWM + SG_ SrpEventLeft_D_Stat : 21|2@0+ (1,0) [0|3] "SED" GWM + SG_ SrpDistRight_L_Actl : 14|9@0+ (0.02,0) [0|10.18] "meter" GWM + SG_ SrpDistLeft_L_Actl : 7|9@0+ (0.02,0) [0|10.18] "meter" GWM + +BO_ 973 Traffic_RecognitnData: 8 IPMA_ADAS + SG_ TsrVl2PrmntMsgTxt_D_Rq : 60|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrVl1PrmntMsgTxt_D_Rq : 41|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrVl2RstrcMsgTxt2_D_Rq : 63|3@0+ (1,0) [0|7] "SED" GWM + SG_ TsrVl1RstrcMsgTxt2_D_Rq : 51|3@0+ (1,0) [0|7] "SED" GWM + SG_ TsrOvtkMsgTxt2_D_Rq : 55|4@0+ (1,0) [0|15] "SED" GWM + SG_ WwaWarn_B_Rq : 48|1@0+ (1,0) [0|1] "SED" GWM + SG_ TsrVlUnitMsgTxt_D_Rq : 43|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrVLim2MsgTxt_D_Rq : 39|8@0+ (1,0) [0|255] "SED" GWM + SG_ TsrVLim1MsgTxt_D_Rq : 31|8@0+ (1,0) [0|255] "SED" GWM + SG_ TsrVl2StatMsgTxt_D_Rq : 47|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrVl2RstrcMsgTxt_D_Rq : 17|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrVl1StatMsgTxt_D_Rq : 21|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrVl1RstrcMsgTxt_D_Rq : 23|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrStatMsgTxt_D_Rq : 10|3@0+ (1,0) [0|7] "SED" GWM + SG_ TsrOvtkStatMsgTxt_D_Rq : 1|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrOvtkMsgTxt_D_Rq : 15|3@0+ (1,0) [0|7] "SED" GWM + SG_ TsrOswWarnMsgTxt_D_Rq : 3|2@0+ (1,0) [0|3] "SED" GWM + SG_ TsrMsgTxt_D_Rq : 7|4@0+ (1,0) [0|15] "SED" GWM + +BO_ 970 Lane_Assist_Data1: 8 IPMA_ADAS + SG_ LkaDrvOvrrd_D_Rq : 38|2@0+ (1,0) [0|3] "SED" PSCM + SG_ LkaActvStats_D2_Req : 7|3@0+ (1,0) [0|7] "SED" PSCM + SG_ LaRefAng_No_Req : 19|12@0+ (0.05,-102.4) [-102.4|102.3] "mrad" PSCM + SG_ LaRampType_B_Req : 39|1@0+ (1,0) [0|1] "SED" PSCM + SG_ LaCurvature_No_Calc : 15|12@0+ (5E-006,-0.01024) [-0.01024|0.01023] "1/m" PSCM + SG_ LdwActvStats_D_Req : 4|3@0+ (1,0) [0|7] "SED" PSCM + SG_ LdwActvIntns_D_Req : 1|2@0+ (1,0) [0|3] "SED" PSCM + +BO_ 962 AutoDriveBeam_Data3: 8 IPMA_ADAS + SG_ AdbBrdr3DistRigh_D_Stat : 59|4@0+ (1,0) [0|15] "SED" GWM + SG_ AdbBrdr3DistLeft_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM + SG_ AdbMde3_D_Rq : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdbIntns3_D_Rq : 12|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdbBrdr3Up_An_Rq : 36|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM + SG_ AdbBrdr3Right_An_Rq : 31|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM + SG_ AdbBrdr3Low_An_Rq : 8|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM + SG_ AdbBrdr3Left_An_Rq : 7|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM + SG_ AdbBrdr3CritRigh_T_Stat : 43|4@0+ (100,0) [0|1500] "millisecond" GWM + SG_ AdbBrdr3CritLeft_T_Stat : 55|4@0+ (100,0) [0|1500] "millisecond" GWM + +BO_ 961 AutoDriveBeam_Data2: 8 IPMA_ADAS + SG_ AdbBrdr2DistRigh_D_Stat : 59|4@0+ (1,0) [0|15] "SED" GWM + SG_ AdbBrdr2DistLeft_D_Stat : 63|4@0+ (1,0) [0|15] "SED" GWM + SG_ AdbMde2_D_Rq : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdbIntns2_D_Rq : 12|2@0+ (1,0) [0|3] "SED" GWM + SG_ AdbBrdr2Up_An_Rq : 36|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM + SG_ AdbBrdr2Right_An_Rq : 31|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM + SG_ AdbBrdr2Low_An_Rq : 8|9@0+ (0.02,-8) [-8|2.18] "degrees" GWM + SG_ AdbBrdr2Left_An_Rq : 7|11@0+ (0.02,-20) [-20|20.9] "degrees" GWM + SG_ AdbBrdr2CritRigh_T_Stat : 43|4@0+ (100,0) [0|1500] "millisecond" GWM + SG_ AdbBrdr2CritLeft_T_Stat : 55|4@0+ (100,0) [0|1500] "millisecond" GWM + +BO_ 394 ACCDATA_3: 8 IPMA_ADAS + SG_ HaDsply_No_Cs : 63|8@0+ (1,0) [0|255] "Unitless" GWM + SG_ HaDsply_No_Cnt : 4|4@0+ (1,0) [0|15] "Unitless" GWM + SG_ AccStopStat_D_Dsply : 41|2@0+ (1,0) [0|3] "SED" GWM + SG_ AccTrgDist2_D_Dsply : 27|4@0+ (1,0) [0|15] "SED" GWM + SG_ AccStopRes_B_Dsply : 54|1@0+ (1,0) [0|1] "SED" GWM + SG_ TjaWarn_D_Rq : 50|3@0+ (1,0) [0|7] "SED" GWM + SG_ Tja_D_Stat : 44|3@0+ (1,0) [0|7] "SED" GWM + SG_ TjaMsgTxt_D_Dsply : 53|3@0+ (1,0) [0|7] "SED" GWM + SG_ IaccLamp_D_Rq : 46|2@0+ (1,0) [0|3] "SED" GWM + SG_ AccMsgTxt_D2_Rq : 31|4@0+ (1,0) [0|15] "SED" GWM + SG_ FcwDeny_B_Dsply : 10|1@0+ (1,0) [0|1] "SED" GWM + SG_ FcwMemStat_B_Actl : 13|1@0+ (1,0) [0|1] "SED" GWM + SG_ AccTGap_B_Dsply : 35|1@0+ (1,0) [0|1] "SED" GWM + SG_ CadsAlignIncplt_B_Actl : 11|1@0+ (1,0) [0|1] "SED" GWM + SG_ AccFllwMde_B_Dsply : 17|1@0+ (1,0) [0|1] "SED" GWM + SG_ CadsRadrBlck_B_Actl : 22|1@0+ (1,0) [0|1] "SED" GWM + SG_ CmbbPostEvnt_B_Dsply : 15|1@0+ (1,0) [0|1] "SED" GWM + SG_ AccStopMde_B_Dsply : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ FcwMemSens_D_Actl : 20|2@0+ (1,0) [0|3] "SED" GWM + SG_ FcwMsgTxt_D_Rq : 7|3@0+ (1,0) [0|7] "SED" GWM + SG_ AccWarn_D_Dsply : 39|2@0+ (1,0) [0|3] "SED" GWM + SG_ FcwVisblWarn_B_Rq : 47|1@0+ (1,0) [0|1] "SED" GWM + SG_ FcwAudioWarn_B_Rq : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ AccTGap_D_Dsply : 34|3@0+ (1,0) [0|7] "SED" GWM + SG_ AccMemEnbl_B_RqDrv : 36|1@0+ (1,0) [0|1] "SED" GWM + SG_ FdaMem_B_Stat : 37|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 391 ACCDATA_2: 8 IPMA_ADAS + SG_ CmbbBrkDecel_No_Cnt : 47|4@0+ (1,0) [0|15] "Unitless" GWM,ABS_ESC + SG_ HudDsplyIntns_No_Actl : 31|8@0+ (0.5,0) [0|100] "%" GWM + SG_ HudBlk3_B_Rq : 37|1@0+ (1,0) [0|1] "SED" GWM + SG_ HudBlk2_B_Rq : 51|1@0+ (1,0) [0|1] "SED" GWM + SG_ HudBlk1_B_Rq : 50|1@0+ (1,0) [0|1] "SED" GWM + SG_ HudFlashRate_D_Actl : 53|2@0+ (1,0) [0|3] "SED" GWM + SG_ CmbbBrkDecel_No_Cs : 7|8@0+ (1,0) [0|255] "Unitless" GWM,ABS_ESC + SG_ CmbbBrkDecel_A_Rq : 12|13@0+ (0.0039,-20) [-20|11.9449] "m/s^2" ABS_ESC,GWM + SG_ CmbbBrkPrchg_D_Rq : 55|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + SG_ CmbbBrkDecel_B_Rq : 15|1@0+ (1,0) [0|1] "SED" ABS_ESC,GWM + SG_ CmbbBaSens_D_Rq : 14|2@0+ (1,0) [0|3] "SED" ABS_ESC,GWM + +BO_ 390 ACCDATA: 8 IPMA_ADAS + SG_ AccBrkPulse_B_Rq : 36|1@0+ (1,0) [0|1] "SED" ABS_ESC,GWM + SG_ AccAutoResum_D_Rq : 7|2@0+ (1,0) [0|3] "SED" PCM_HEV,PCM,ECM_Diesel + SG_ AccBrkTot_A_Rq : 4|13@0+ (0.0039,-20) [-20|11.9449] "m/s^2" GWM,ABS_ESC + SG_ AccPrpl_A_Pred : 17|10@0+ (0.01,-5) [-5|5.23] "m/s^2" GWM,ECM_Diesel,PCM,PCM_HEV + SG_ AccVeh_V_Trg : 32|9@0+ (0.5,0) [0|255.5] "kph" GWM,ECM_Diesel,PCM,PCM_HEV,TCM_DSL + SG_ AccBrkPrkEl_B_Rq : 38|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ Cmbb_B_Enbl : 50|1@0+ (1,0) [0|1] "SED" GWM + SG_ CmbbOvrrd_B_RqDrv : 51|1@0+ (1,0) [0|1] "SED" GWM + SG_ CmbbDeny_B_Actl : 37|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ CmbbEngTqMn_B_Rq : 52|1@0+ (1,0) [0|1] "SED" ECM_Diesel,PCM,PCM_HEV,GWM + SG_ AccPrpl_A_Rq : 49|10@0+ (0.01,-5) [-5|5.23] "m/s^2" GWM,ECM_Diesel,PCM,PCM_HEV + SG_ AccDeny_B_Rq : 53|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM,PCM_HEV + SG_ AccResumEnbl_B_Rq : 33|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM,PCM_HEV + SG_ AccCancl_B_Rq : 39|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC,ECM_Diesel,PCM,PCM_HEV + SG_ AccBrkPrchg_B_Rq : 54|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ AccBrkDecel_B_Rq : 55|1@0+ (1,0) [0|1] "SED" GWM,ABS_ESC + SG_ AccStopStat_B_Rq : 34|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM,PCM_HEV,ABS_ESC + +BO_ 1441 TCCM_AutoSar_NetwkMgmt: 8 TCCM + SG_ TCCM_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCCM_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCCM_AutoSarNMReserved4 : 63|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCCM_AutoSarNMReserved3 : 55|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCCM_AutoSarNMReserved2 : 31|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCCM_AutoSarNMReserved1 : 23|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCCM_AutoSarNMNodeId : 7|8@0+ (1,0) [0|255] "unitless" Vector__XXX + SG_ TCCM_AutoSarNMControl : 15|8@0+ (1,0) [0|255] "unitless" Vector__XXX + +BO_ 1787 TesterPhysicalResSODCMD: 64 IPMA_ADAS + SG_ TesterPhysicalResSODCMD : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1779 TesterPhysicalReqSODCMD: 64 TSTR + SG_ TesterPhysicalReqSODCMD : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS + +BO_ 1786 TesterPhysicalResSODCMC: 64 IPMA_ADAS + SG_ TesterPhysicalResSODCMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1778 TesterPhysicalReqSODCMC: 64 TSTR + SG_ TesterPhysicalReqSODCMC : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS + +BO_ 1153 All_Terrain_Data_FD1: 8 GWM + SG_ TerrMde_D_RqDrv : 3|3@0+ (1,0) [0|7] "SED" Vector__XXX + +BO_ 942 ParkAid_Data2: 8 IPMA_ADAS + SG_ PrkAidRdiusRight_L_Dsply : 15|8@0+ (1,0) [0|255] "unitless" GWM + SG_ PrkAidRdiusLeft_L_Dsply : 7|8@0+ (1,0) [0|255] "unitless" GWM + SG_ PrkAidDrvDir_D_Stat : 23|3@0+ (1,0) [0|7] "SED" GWM + SG_ PrkAidAcsyRear_D_Stat : 18|2@0+ (1,0) [0|3] "SED" GWM + SG_ PrkAidAcsyFront_D_Stat : 20|2@0+ (1,0) [0|3] "SED" GWM + +BO_ 930 Bndry_Alert_R_Data: 8 IPMA_ADAS + SG_ BalrWndwRight_B_Stat : 19|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrSnsRight_D_Falt : 21|2@0+ (1,0) [0|3] "SED" GWM + SG_ WndwPsngrRear_D_RqBalrr : 25|2@0+ (1,0) [0|3] "SED" GWM + SG_ WndwPsngr_D_RqBalrr : 27|2@0+ (1,0) [0|3] "SED" GWM + SG_ WndwDrvRear_D_RqBalrr : 29|2@0+ (1,0) [0|3] "SED" GWM + SG_ WndwDrv_D_RqBalrr : 31|2@0+ (1,0) [0|3] "SED" GWM + SG_ BalrRight_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ BalrMdeSelRight_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrMdeRight_D_Stat : 23|2@0+ (1,0) [0|3] "SED" GWM + SG_ BalrLckRight_B_Stat : 11|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrChimeRight_D_Rq : 2|2@0+ (1,0) [0|3] "SED" GWM + SG_ CamraRearOn_B_RqBalrr : 7|1@0+ (1,0) [0|1] "SED" GWM + SG_ DrLckCnt_No_ActlBalrr : 5|3@0+ (1,0) [0|7] "unitless" GWM + SG_ DrLckActv_B_RqBalrr : 6|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 929 Bndry_Alert_L_Data: 8 IPMA_ADAS + SG_ BalrChimeLeft_D_Rq : 2|2@0+ (1,0) [0|3] "SED" GWM + SG_ BalrLeft_D_Stat : 10|2@0+ (1,0) [0|3] "SED" GWM + SG_ BalrWndwLeft_B_Stat : 0|1@0+ (1,0) [0|1] "SED" GWM + SG_ WndwPsngrRear_D_RqBalrl : 25|2@0+ (1,0) [0|3] "SED" GWM + SG_ WndwPsngr_D_RqBalrl : 27|2@0+ (1,0) [0|3] "SED" GWM + SG_ WndwDrvRear_D_RqBalrl : 29|2@0+ (1,0) [0|3] "SED" GWM + SG_ WndwDrv_D_RqBalrl : 31|2@0+ (1,0) [0|3] "SED" GWM + SG_ BalrSnsLeft_D_Falt : 21|2@0+ (1,0) [0|3] "SED" GWM + SG_ BalrMdeSelLeft_B_Stat : 8|1@0+ (1,0) [0|1] "SED" GWM + SG_ BalrMdeLeft_D_Stat : 23|2@0+ (1,0) [0|3] "SED" GWM + SG_ BalrLckLeft_B_Stat : 11|1@0+ (1,0) [0|1] "SED" GWM + SG_ CamraRearOn_B_RqBalrl : 7|1@0+ (1,0) [0|1] "SED" GWM + SG_ DrLckCnt_No_ActlBalrl : 5|3@0+ (1,0) [0|7] "unitless" GWM + SG_ DrLckActv_B_RqBalrl : 6|1@0+ (1,0) [0|1] "SED" GWM + +BO_ 402 Dsp_Request_Signals11_FD1: 8 GWM + SG_ PrkAidSwtch_D_RqMnu : 11|1@0+ (1,0) [0|1] "SED" IPMA_ADAS + SG_ ApaSwtch_D_RqMnu : 10|2@0+ (1,0) [0|3] "SED" IPMA_ADAS + SG_ ApaMdeStat_D_RqDrv : 2|3@0+ (1,0) [0|7] "SED" IPMA_ADAS + SG_ CamraViewSplit_B_Rq : 3|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CamraZoomMan_D_Rq : 15|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ CamraOvrlStat_D_Rq : 4|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CamraOvrlDyn_D_Rq : 7|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ CamAutoTowbarZoom : 6|1@0+ (1,0) [0|1] "SED" Vector__XXX + SG_ DistanceBarSetting : 5|1@0+ (1,0) [0|1] "SED" Vector__XXX + +BO_ 924 DCACA_Data3_FD1: 8 GWM + SG_ DcacOut_Pw_Mx : 34|11@0+ (5,0) [0|10225] "watts" PCM,PCM_HEV + SG_ DcacOut2_Pw_Actl : 31|13@0+ (1,0) [0|8189] "watts" PCM_HEV + SG_ DcacOut1_Pw_Actl : 12|13@0+ (1,0) [0|8189] "watts" PCM,PCM_HEV + SG_ DcacIn_Pw_Mx : 7|11@0+ (5,0) [0|10225] "watts" PCM,PCM_HEV + +BO_ 923 DCACA_Data2_FD1: 8 GWM + SG_ DcacIn_U2_Actl : 39|12@0+ (0.01,0) [0|40.93] "volt" PCM + SG_ DcacIn_U_Actl : 19|12@0+ (0.1,0) [0|409.3] "volt" PCM,PCM_HEV + SG_ DcacIn_I_Actl : 15|11@0+ (0.1,0) [0|204.5] "Amps" PCM,PCM_HEV + SG_ Dcac_Te_Actl : 7|8@0+ (1,-60) [-60|193] "degC" PCM + +BO_ 1998 TesterPhysicalResSODR: 64 IPMA_ADAS + SG_ TesterPhysicalResSODR : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1996 TesterPhysicalResSODL: 64 IPMA_ADAS + SG_ TesterPhysicalResSODL : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" TSTR + +BO_ 1988 TesterPhysicalReqSODL: 64 TSTR + SG_ TesterPhysicalReqSODL : 7|64@0+ (1,0) [0|1.84467E+019] "unitless" IPMA_ADAS + +BO_ 922 DCACA_Data1_FD1: 8 GWM + SG_ DcacBp2BrkrOpn_B_Falt : 13|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacBp1BrkrOpn_B_Falt : 14|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacIpRcBrkrOpn_B_Falt : 10|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacRdy_D2_Stat : 23|2@0+ (1,0) [0|3] "SED" PCM,PCM_HEV + SG_ DcacOvrld_B_Falt : 8|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacOverTe_B_Falt : 9|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacGfci_B_Falt : 11|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacErr_B_Stat : 12|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacAcUDetct_B_Falt : 15|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacRdy_D_Stat : 2|3@0+ (1,0) [0|7] "SED" Vector__XXX + SG_ DcacPlugPrsnt_B_Stat : 3|1@0+ (1,0) [0|1] "SED" PCM,PCM_HEV + SG_ DcacClntFlw_D_Rq : 5|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + SG_ CoolFanDcac_D_Rq : 7|2@0+ (1,0) [0|3] "SED" SOBDMC_HPCM_FD1 + +BO_ 1082 INSTRUMENT_PANEL: 8 GWM + SG_ METRIC_UNITS : 54|1@0+ (1,0) [0|1] "SED" IPMA,PCM,PCM_HEV + +BO_TX_BU_ 2612224016 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 878 : PCM,PCM_HEV; +BO_TX_BU_ 1085 : ECM_Diesel,PCM; +BO_TX_BU_ 2611175440 : ECM_Diesel,PCM_HEV,PCM; +BO_TX_BU_ 2610126864 : ECM_Diesel,PCM_HEV,PCM; +BO_TX_BU_ 786 : PCM_HEV,SOBDMC_HPCM_FD1; +BO_TX_BU_ 1090 : SOBDMC_HPCM_FD1,PCM_HEV; +BO_TX_BU_ 374 : PCM_HEV,TCM_DSL,PCM; +BO_TX_BU_ 872 : SOBDMC_HPCM_FD1,PCM_HEV; +BO_TX_BU_ 560 : PCM,PCM_HEV,TCM_DSL; +BO_TX_BU_ 369 : PCM_HEV,TCM_DSL,PCM; +BO_TX_BU_ 92 : PCM,TCM_DSL,PCM_HEV; +BO_TX_BU_ 2030 : SOBDMC_HPCM_FD1,ECM_Diesel; +BO_TX_BU_ 1087 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 2024 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1697 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1696 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1429 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1100 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1086 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1071 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1069 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1060 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1057 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 1055 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 517 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 516 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 514 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 512 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 380 : ECM_Diesel,PCM; +BO_TX_BU_ 377 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 376 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 359 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 358 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 357 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 342 : ECM_Diesel,PCM,PCM_HEV; +BO_TX_BU_ 71 : ECM_Diesel,PCM,PCM_HEV; + +CM_ "New CAN FD network"; +CM_ BU_ CMR_DSMC "Driver Status Monitor Camera"; +CM_ BU_ IPMA_ADAS "Assist Driving Alert System"; +CM_ BU_ PSCM "Passenger Front Climate Control Seat Module"; +CM_ BU_ ABS_ESC "Anti-lock Brake / Traction Control Module"; +CM_ BU_ TCCM "Transfer Case Control Module, 4x4 Control Module"; +CM_ BU_ TCM_DSL "Transmission Control Module"; +CM_ BU_ PCM "Powertrain Control Module"; +CM_ BU_ ECM_Diesel "Diesel"; +CM_ BU_ GWM "Gateway Module CGEA1.3(Star Architecture)"; +CM_ BU_ TSTR "Diagnostic Tester"; + +CM_ SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs "Signal not transmitted on gas variants."; +CM_ SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt "Signal not transmitted on gas variants."; +CM_ SG_ 1150 LocationServices_1 "Tx by HS3 APIM"; +CM_ SG_ 542 LocationServices_3 "Tx by HS3 APIM"; +CM_ SG_ 810 NtfyDrvTrgtDist_L_Rq "Object.SetTripRangeAlert_Rq This signal is meant to provide the customer settings for the target distance remote notification"; +CM_ SG_ 810 NtfyDrvSocLvl1_Pc_Rq "Object.SetCustomerLevelAlert_Rq This signal is meant to provide the customer settings for the SOC remote notification."; +CM_ SG_ 810 PtRmtRprt_D_Stat "Object.RemoteDataReport_St"; +CM_ SG_ 550 PtWakeupActv1_B_Rq "ECG Application signal"; +CM_ SG_ 982 LatCtlPath_No_Cnt "Signal not transmitted on gas variants."; +CM_ SG_ 982 LatCtlPath_No_Cs "Signal not transmitted on gas variants."; +CM_ SG_ 1104 DrvEngageLevel_No_Cs "Signal not transmitted on gas variants."; +CM_ SG_ 1104 DrvEngageLevel_No_Cnt "Signal not transmitted on gas variants."; +CM_ SG_ 1085 ULoRgenTestMde_B_Stat "Signal not transmitted on HEV variants."; +CM_ SG_ 1085 PwSrcULoComm_B_Falt "Signal not transmitted on HEV variants."; +CM_ SG_ 1445 SOBDMC_AutoSarNMReserved4 "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 1445 SOBDMC_AutoSarNMReserved3 "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 1445 SOBDMC_AutoSarNMReserved2 "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 1445 SOBDMC_AutoSarNMReserved1 "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 1445 SOBDMC_AutoSarNMNodeId "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 1445 SOBDMC_AutoSarNMControl "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 1088 HvacPrecondMode2_D_Rq "Signal not transmitted on vehicles that do not have the Fuel operated heater feature."; +CM_ SG_ 1088 HvacPrecondBlwr2_D_Rq "Signal not transmitted on vehicles that do not have the Fuel operated heater feature."; +CM_ SG_ 786 ChrgStat_D_Dsply "Signal not transmitted by PCM_HEV"; +CM_ SG_ 66 immoControlData_T2 "Not transmitted on all vehicle variants"; +CM_ SG_ 66 immoControlCmd_T2 "Not transmitted on all vehicle variants"; +CM_ SG_ 549 BeltminderAudioMute "Object.MyKey.BeltMinderAudioMute.St"; +CM_ SG_ 549 Power_Up_Chime_Modules "Object.AlertMethod.IPC _Infotainment"; +CM_ SG_ 549 Chime_Source "Object.AlertMethod.IPC_infotainment"; +CM_ SG_ 611 AwdStat_D_RqDsply "Signal not transmitted on programs that do not have AWD."; +CM_ SG_ 611 AwdSrvcRqd_B_Rq "Signal not transmitted on programs that do not have AWD."; +CM_ SG_ 611 AwdLck_Tq_Rq "Signal not transmitted on programs that do not have AWD."; +CM_ SG_ 130 VehVTrlrAid_B_Rq "VR session start- req. limit blower speed no more than X volts. CC restriction on time msg. will be honored.Double Event msg1st event to request limit, 2nd event to release limit, No msg. CC Grammar v7.xls"; +CM_ SG_ 130 SteMdule_U_Meas "DCR 1745 to update Tx from GWM to EP100ms. SteMdule_I_Est & SteMdule_U_Meas are used by BMS system & filtered. The filter uses standard periodic rate & changing to EP would adversely affect the filter.(jweinfur)"; +CM_ SG_ 130 SteMdule_I_Est "DCR 1745 to update Tx from GWM to EP100ms. SteMdule_I_Est & SteMdule_U_Meas are used by BMS system & filtered. The filter uses standard periodic rate & changing to EP would adversely affect the filter.(jweinfur)"; +CM_ SG_ 126 StePinRelInit_An_Sns "SASM will transmit these signals on vehicles with SASM and without PSCM. SCCM will not Tx this signal when SASM is present."; +CM_ SG_ 126 StePinAn_No_Cs "Signal not transmitted on gas variants."; +CM_ BO_ 133 "Seen on Ford Edge MK2"; +CM_ SG_ 133 StePinRelInit_An_Sns "SASM will transmit these signals on vehicles with SASM and without PSCM. SCCM will not Tx this signal when SASM is present."; +CM_ SG_ 133 StePinAn_No_Cs "Signal not transmitted on gas variants."; +CM_ SG_ 1200 BrkTot_Tq_RqDrv "DCR 1836 to update Tx from GWM to EP100ms rejected due MPS6 TCM requires BrkTot_Tq_RqDrv at 20ms (bshu1)."; +CM_ SG_ 1046 TCMode "Signal data set to 0x0 for ABS only vehicle option content"; +CM_ SG_ 1046 DrvAntiLckLamp_D_Rq "update value table v8.34, not align w/GSDB, need etracker. ABS & IPC implemented as updated."; +CM_ SG_ 1046 BpedMove_D_Actl "CCMGenSigTimeoutTime=1000"; +CM_ SG_ 1044 StePinOffst_An_Est "SASM will transmit these signals on vehicles with SASM and without PSCM. SCCM will not Tx this signal when SASM is present."; +CM_ SG_ 1044 StePinOffst_No_Cs "Signal not transmitted on gas variants."; +CM_ SG_ 534 BrkObdData_No_Actl "Signal not transmitted on gas, diesel and HEV. Only supported on PHEV."; +CM_ SG_ 534 BrkObdIndex_No_Actl "Signal not transmitted on gas, diesel and HEV. Only supported on PHEV."; +CM_ SG_ 534 WhlRotatRr_No_Cnt "DCR 1833 to update Tx from GWM to EP100ms. Wheel Count signals are used by complex algorithm to determine Tire Pressure by Location & can't change from 20msec. (jweinfur)"; +CM_ SG_ 534 WhlRotatRl_No_Cnt "DCR 1833 to update Tx from GWM to EP100ms. Wheel Count signals are used by complex algorithm to determine Tire Pressure by Location & can't change from 20msec. (jweinfur)"; +CM_ SG_ 534 WhlRotatFr_No_Cnt "DCR 1833 to update Tx from GWM to EP100ms. Wheel Count signals are used by complex algorithm to determine Tire Pressure by Location & can't change from 20msec. (jweinfur)"; +CM_ SG_ 534 WhlRotatFl_No_Cnt "DCR 1833 to update Tx from GWM to EP100ms. Wheel Count signals are used by complex algorithm to determine Tire Pressure by Location & can't change from 20msec. (jweinfur)"; +CM_ SG_ 531 VehLongOvrGnd_A_Est "CCMGenSigTimeoutTime=1000"; +CM_ SG_ 1034 VehicleGGCCData "RCMGenSigTimeout=6000"; +CM_ SG_ 1090 Mtr2State_D_ActlMntr "Signal Not transmitted on PCM_HEV variant"; +CM_ SG_ 1090 Inv1Ain_I_ActlMntr "Signal Not transmitted on PCM_HEV variant"; +CM_ SG_ 1090 VehElRnge_L_Dsply "Signal Not transmitted on HPCM variant"; +CM_ SG_ 374 TrnRng_D_Rq "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 374 TrnPrkSys_D_Actl "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 374 GearLvr_D_ActlDrv "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 374 GearPos_No_Cs "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 374 GearPos_D_Trg "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 374 GearPos_No_Cnt "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 374 GearPos_D_Actl "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 603 WhlDirAvgDrv_D_Actl "48V mHEV: ECM_HEVDSL is Tx, MHT HEV: PCM_HEV is Tx, Powersplit HEV: SOBDMC_HPCM is Tx"; +CM_ SG_ 603 PrplTqMnRgen_B_Actl "48V mHEV: ECM_HEVDSL is Tx, MHT HEV: PCM_HEV is Tx, Powersplit HEV: SOBDMC_HPCM is Tx"; +CM_ SG_ 603 BattTracCnnct_D_Rq "48V mHEV: ECM_HEVDSL is Tx, MHT HEV: PCM_HEV is Tx, Powersplit HEV: SOBDMC_HPCM is Tx"; +CM_ SG_ 872 HybMdeStat_D_Dsply "Signal not transmitted by HPCM"; +CM_ SG_ 560 SelDrvMdeSwtch_D_Stat3 "ECM_HEV, PCM & PCM_HEV do not support or Transmit signal."; +CM_ SG_ 560 TrnSrvcRqd_B_Rq "Signal not transmitted on Diesel & HEV variants. MHT(U611/625) HPCM Rx 0x230 from PCM_HEV. Powersplit FWD HEVs(Cx482/3 430) HPCM Tx 0x230."; +CM_ SG_ 560 TrnShifActv_B_Actl "Signal not transmitted on HEV variants. MHT(U611/625) HPCM Rx 0x230 from PCM_HEV. Powersplit FWD HEVs(Cx482/3 430) HPCM Tx 0x230."; +CM_ SG_ 560 GboxOil_Te_Actl "Signal not transmitted on HEV variants. MHT(U611/625) HPCM Rx 0x230 from PCM_HEV. Powersplit FWD HEVs(Cx482/3 430) HPCM Tx 0x230."; +CM_ SG_ 369 SeatWorkSrfc_B_Falt "Signal Not transmitted by TCM_DSL"; +CM_ SG_ 369 TrnIpcDsplyRng2_D_Actl "Signal not transmitted on HEV variants."; +CM_ SG_ 369 TrnIpcDsplyRng_D_Stat "Signal not transmitted on HEV variants."; +CM_ SG_ 92 TrnLvrV_D_Rq "Signal not transmitted on vehicles with PCM_HEV"; +CM_ SG_ 92 TrnSbwSysHlth_D_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnGearNtmAllow_B_Stat "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnDtpCmd_D_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnGearCmd_No_Cs "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnValidGear_D_Cnfm "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnNtrlTowCmd_D_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnGearCmd_Pc_ActlPt "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnGear_D_RqPt "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnCmdState_B_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnCmdCnt_B_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 PrkBrkActv_D_RqTrnGear "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnGearMsgTxt_D_Rq "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 92 TrnGearCmd_No_Cnt "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 1087 BattRgenLoChrg_D_RqEng "Signal not transmitted on diesel variant"; +CM_ SG_ 1087 BattRgenLoDChrg_D_RqEng "Signal not transmitted on diesel variant"; +CM_ SG_ 1087 FapLcInhbt_B_Rq "Signal not transmitted on diesel variant"; +CM_ SG_ 1100 EngExhMdeQuiet_D2_Stat "Signal not transmitted on HEV & Diesel programs"; +CM_ SG_ 1100 HvacCmprLim_D_Stat "Signal not transmitted on Diesel variants"; +CM_ SG_ 1100 WakeAlarm1_T_Rq "Signal not transmitted on Gas variants"; +CM_ SG_ 1100 WakeAlarm1_B_Typ "Signal not transmitted on Gas variants"; +CM_ SG_ 1100 Veh_V_DsplyTrailCtlSet "Signal not transmitted on HEV & Diesel programs"; +CM_ SG_ 1100 TrailCtlPt_B_Falt "Signal not transmitted on HEV & Diesel programs"; +CM_ SG_ 1100 AutoTowAllw_D_StatMnu "Signal not transmitted on Gas & Diesel variants"; +CM_ SG_ 1100 AutoTowActv_B_Stat "Signal not transmitted on Gas & Diesel variants"; +CM_ SG_ 1086 EngMnfld_P_Actl "Signal not transmitted on HEV & Diesel programs"; +CM_ SG_ 1086 ElLoadCtl_D_Rq "Signal not transmitted on HEV variants."; +CM_ SG_ 1071 CluPdl_PcRate_Actl "Signal not transmitted on HEV and Gas variants."; +CM_ SG_ 1071 CluPdlPosPcMeas_D_Qf "Signal not transmitted on HEV and Gas variants."; +CM_ SG_ 1071 CluPdlPos_Pc_Meas "Signal not transmitted on HEV and Gas variants."; +CM_ SG_ 1071 EngAoutIdl_N_Ntrl "Signal not transmitted on HEV variants and diesel."; +CM_ SG_ 1069 SlMde_D_Stat "IPC and HUD_ADV Receve from HS3 FGW 0x42D, not HS3 0x38A, MSG DCR 506. Signal not transmitted on Gas & HEV variants"; +CM_ SG_ 1069 SlMde_D_RqDsply "IPC and HUD_ADV Receve from HS3 FGW 0x42D, not HS3 0x38A, MSG DCR 506. Signal not transmitted on Gas & HEV variants"; +CM_ SG_ 1069 IsaOffst_D_Stat "Signal not transmitted on Gas & HEV variants"; +CM_ SG_ 1069 ObdWarmUp_B_Complt "Signal not transmitted on diesel variants."; +CM_ SG_ 1069 EngMsgTxt_D_Rq "Signal not transmitted on diesel variants."; +CM_ SG_ 1069 EngClnt_Te_ActlDiag "Signal not transmitted on gas variants."; +CM_ SG_ 1069 EngLoad_Pc_CalcDiag "Signal not transmitted on gas variants."; +CM_ SG_ 1069 ApedPos_Pc_ActlDiag "Signal not transmitted on gas variants."; +CM_ SG_ 1060 RearDiffOilTeWarn_B_Rq "Signal not transmitted on HEV & Diesel programs"; +CM_ SG_ 1060 RearDiffOil_Te_Actl "Signal not transmitted on HEV & Diesel programs"; +CM_ SG_ 1057 FohEng_D_Rq "Signal not transmitted on vehicles that do not have the fuel operated heater feature. Signal not transmitted on HEV programs"; +CM_ SG_ 1057 EngIdlShutDown_D_Stat "Signal not transmitted on diesel variants."; +CM_ SG_ 1057 FUEL_ALCOHOL_PERCNT "signal not transmitted on diesel and HEV variants."; +CM_ SG_ 1057 TrnTotTq_Rt_Est "Signal not transmitted on gas and HEV variants."; +CM_ SG_ 1057 TrnTotLss_Tq_Est "Signal not transmitted on gas and HEV variants."; +CM_ SG_ 1057 VehVLimStat_D_Actl "Signal not transmitted on gas and HEV variants."; +CM_ SG_ 1057 VehVLimActv_B_Actl "Signal not transmitted on gas and HEV variants."; +CM_ SG_ 562 GearNtrl_No_Cs "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 562 GearNtrl_No_Cnt "Powersplit HEVs with HF45, HPCM will Tx this message. For all other programs it will be Tx by PCM or TCM. "; +CM_ SG_ 516 EngAoutNActl_D_QF "Signal not transmitted on Gas & HEV variants"; +CM_ SG_ 516 EngAout3_N_Actl "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 516 ApedPos_Pc_ActlArb "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 516 ApedPosPcActl_No_Cnt "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 516 ApedPosPcActl_No_Cs "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 514 VehVTrlrAid_B_Avail "Signal not transmitted on HEV variants."; +CM_ SG_ 514 GearRvrse_D_Actl "Do not implement GearRvrse_D_Actl until eTracker 8804151 is approved, 11/24/09"; +CM_ SG_ 512 PrplWhlTotTqRq_No_Cs "Signal not transmitted on gas & Diesel variants."; +CM_ SG_ 512 PrplWhlTotTqRq_No_Cnt "Signal not transmitted on gas & Diesel variants."; +CM_ SG_ 512 PtDrvMde_D_Stat "Signal not transmitted on Gas & HEV variants."; +CM_ SG_ 380 EngExhBrkOnLamp_B_Rq "Signal not transmitted on Gas variants"; +CM_ SG_ 380 EngExhBrkAutoLamp_B_Rq "Signal not transmitted on Gas variants"; +CM_ SG_ 380 EngAout_N_MxAllw "Signal not transmitted on Gas variants"; +CM_ SG_ 380 EngExhBrkMde_D_Actl "Signal not transmitted on Gas variants"; +CM_ SG_ 377 HvacAirFullOut_B_Rq "Signal not transmitted on diesel variant"; +CM_ SG_ 377 FuelFlw_Vl_Dsply "Signal not transmitted on diesel variants."; +CM_ SG_ 377 FuelFillInlet_B_Dsply "Signal not transmitted on diesel variants."; +CM_ SG_ 377 OdoCount "Signal not transmitted on diesel variants."; +CM_ SG_ 377 EngOilLife_Pc_Actl "Signal not transmitted on diesel variants."; +CM_ SG_ 377 FuelFilterLamp_B_Dsply "Signal not transmitted on Gas & HEV variants"; +CM_ SG_ 377 AirCondRec_B_Rq "Signal not transmitted on diesel variants."; +CM_ SG_ 377 AirCondClutch_B_Stats "Signal not transmitted on diesel variants."; +CM_ SG_ 376 GasPrtc_D_RqDsply "Signal not transmitted on HEV & Diesel variants."; +CM_ SG_ 376 EngAout_Aa_Actl "Signal not transmitted on HEV variants."; +CM_ SG_ 376 AslIconDsply_D_Rq "Signal not transmitted on HEV variants."; +CM_ SG_ 376 AslChime_B_Rq "Signal not transmitted on HEV variants."; +CM_ SG_ 376 HvacHtrCore2_Te_Actl "Signal not transmitted on Gas & Diesel variants"; +CM_ SG_ 376 EcssLamp_D_RqDsply "Signal not transmitted on Gas & HEV variants"; +CM_ SG_ 376 AirAmb_Te_Actl "Signal not transmitted on Gas variants"; +CM_ SG_ 359 PrplWhlRgenMn_Tq_Actl "Signal not transmitted on Gas & Diesel variants"; +CM_ SG_ 359 ElPw_D_StatStrtStop "Signal not transmitted on HEV variants."; +CM_ SG_ 359 TrnAin_Tq_Actl "Signal not transmitted on HEV variances."; +CM_ SG_ 359 PlgActvArb_B_Actl "Only supported on PHEV programs. PlgActvArb_B_Actl HPCM will Tx on Powersplit PHEVs, On MHT PHEVs the PCM_HEV will Tx and HPCM will Rx."; +CM_ SG_ 359 TrnAinTq_D_Qf "Signal not transmitted on HEV variances."; +CM_ SG_ 358 StopStrtStdby_D_Indic "Signal not transmitted on HEV variants."; +CM_ SG_ 358 StopStrtIODTxt_D_Rq "Signal not transmitted on HEV variants."; +CM_ SG_ 358 StopStrtDrvMde_D_Indic "Signal not transmitted on HEV variants."; +CM_ SG_ 358 StopStrtMsgTxt_D_Rq "Signal not transmitted on HEV variants."; +CM_ SG_ 358 HiElPwInhbt_B_Stat "Signal not transmitted on HEV programs"; +CM_ SG_ 358 AutoStopPtDelta_I_Est "Signal not transmitted on HEV variants. "; +CM_ SG_ 357 BpedDrvAppl_D_Actl "CCMGenSigTimeoutTime=1000"; +CM_ SG_ 357 CcStat_D_Actl "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 357 EngAout_N_MnAllw "Signal not transmitted on Gas & Diesel variants."; +CM_ SG_ 357 AccStopMde_D_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 342 EngOvrhtMitgActv_D_Ind "Signal not transmitted on diesel."; +CM_ SG_ 342 EngGoutLss_Tq_Est "Signal not transmitted on gas and diesel variants."; +CM_ SG_ 342 EngOil_Te_Actl "Signal not transmitted on Gas & HEV variants. "; +CM_ SG_ 954 GenericSwtch2_No_Actl "U625 Police Wig Wag feature"; +CM_ SG_ 935 SodRight_D_Stat "IPCGenSigTimeoutTime=1600"; +CM_ SG_ 935 Side_Detect_R_Illum "DDMGenSigTimeoutTime=2000"; +CM_ SG_ 935 SodSnsRight_D_Stat "IPCGenSigTimeoutTime=1600"; +CM_ SG_ 935 SodAlrtRight_D_Stat "DDMGenSigTimeoutTime=2000"; +CM_ SG_ 1112 BattTracClntPmp_D_Stat "48V mHEV: ECM_HEVDSL is Tx, MHT HEV: PCM_HEV is Tx, Powersplit HEV: SOBDMC_HPCM is Tx"; +CM_ SG_ 1050 Outside_Air_Temp_Stat "Filtered value, i.e. same as disply for customer"; +CM_ SG_ 1009 CenterStackRing_D_Actl "The Center Stack sends the CPLR a signal to turn On or Off the light Ring, This is a customer selectable preference switch"; +CM_ SG_ 1009 APIM_NumberofTracks_St "Object NumberofTracks"; +CM_ SG_ 1009 APIM_ActiveTrackNum_St "Object.ActiveTrackNum"; +CM_ SG_ 360 GsmSrvcRqd_B_Rq "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 360 TrnGearPwmFalt_B_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 360 GearButtnStuck_B_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGsmNtmState_D_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 DrQltyDrv_D_StatGsm "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnBtsiOvrrd_B_Stat "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnValidGearRq_D_Stat "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearRqCnt_B_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_U_Actl "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlR2 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlR1 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlR0 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlP2 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlP1 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlP0 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlN2 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlN1 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlN0 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlM2 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlM1 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlM0 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlD2 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlD1 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGearButtn_B_ActlD0 "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGear_No_Cs "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGear_No_Cnt "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 TrnGear_D_RqDrv "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 90 BrkSwtchPos_B_ActlGsm "Signal not transmitted on vehicles that do not have shift by wire."; +CM_ SG_ 138 SteWhlRelCalib_An_Sns "Signal is not transmitted on vehicles where PSCM is transmitting the message that contains this signal. Signal data set to 0x0 for ABS only vehicle option content"; +CM_ SG_ 1093 StopLamp_B_RqTrlrBrk "Signal not transmitted on all variants."; +CM_ SG_ 792 ElTrip_L_Dsply "Key cycle trip distance driven with the engine off (Trip EV Miles)"; +CM_ SG_ 792 ElLongTerm_L_Dsply "Long term distance distance driven with the engine off since the last long term reset (Long Term EV Miles)."; +CM_ SG_ 765 Mc_VehTimeFrmtUsrSel_St "Object.BodyInterface.Settings.VehicleTimeFormatUserSelection"; +CM_ SG_ 765 Mc_VehUntTrpCoUsrSel_St "Object.VehicleSettings.Disp_Miles_Kilometers.Rq"; +CM_ SG_ 765 Mc_VehUnitTempUsrSel_St "Object.VehicleSettings.Disp_Temperature.Rq"; +CM_ SG_ 765 Mc_VehLangUsrSel_St "Object.BodyInterface.Settings.VehicleLanguageUserSelection Object Vehicle Settings.Disp_LangSel"; +CM_ SG_ 934 Side_Detect_L_Illum "DDMGenSigTimeoutTime=2000"; +CM_ SG_ 934 SodLeft_D_Stat "IPCGenSigTimeoutTime=1600"; +CM_ SG_ 934 SodSnsLeft_D_Stat "IPCGenSigTimeoutTime=1600"; +CM_ SG_ 934 SodAlrtLeft_D_Stat "DDMGenSigTimeoutTime=2000"; +CM_ SG_ 1072 MetricActv_B_Actl "0 =Inactive(English), 1=Active(Metric)"; +CM_ SG_ 145 VehYaw_W_Actl "CCMGenSigTimeoutTime=1000"; +CM_ SG_ 931 CrnkInhbt_No_Cs "Signal not transmitted on gas and HEV variants."; +CM_ SG_ 931 CrnkInhbt_No_Cnt "Signal not transmitted on gas and HEV variants."; +CM_ SG_ 947 Dimming_Lvl "Refer to Vehicle Interior Illum Dimming Ctrl Sys Eng Spec, Table 2"; +CM_ SG_ 947 PrkBrkActv_B_Actl "Signal not transmitted on vehicles with electric park brake. "; +CM_ SG_ 394 HaDsply_No_Cs "Signal not transmitted on gas variants."; +CM_ SG_ 394 HaDsply_No_Cnt "Signal not transmitted on gas variants."; +CM_ SG_ 391 CmbbBrkDecel_A_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 391 CmbbBrkPrchg_D_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 391 CmbbBrkDecel_B_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 391 CmbbBaSens_D_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 390 AccBrkTot_A_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 390 AccBrkPrkEl_B_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 390 AccPrpl_A_Rq "PCMGenSigTimeoutTime=1000"; +CM_ SG_ 390 AccBrkPrchg_B_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 390 AccBrkDecel_B_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 390 AccStopStat_B_Rq "ABSGenSigTimeoutTime=1000"; +CM_ SG_ 942 PrkAidRdiusRight_L_Dsply "MSGDCR 679, set all signals to OnChange"; +CM_ SG_ 942 PrkAidRdiusLeft_L_Dsply "MSGDCR 679, set all signals to OnChange"; +CM_ SG_ 942 PrkAidDrvDir_D_Stat "MSGDCR 679, set all signals to OnChange"; + +BA_DEF_ BO_ "OvtpPushApplication" ENUM "FALSE","TRUE"; +BA_DEF_ BU_ "OvtpOperationMode" ENUM "SERVER","CLIENT"; +BA_DEF_ BU_ "OvtpEcuAddress" INT 0 1022; +BA_DEF_ SG_ "ECGUsedRxSignal" ENUM "No","Yes"; +BA_DEF_ SG_ "U_S650_MY2022_Rx" ENUM "No","Yes"; +BA_DEF_ SG_ "ECGUsedTxSignal" ENUM "No","Yes"; +BA_DEF_ SG_ "U_S650_MY2022_Tx" ENUM "No","Yes"; +BA_DEF_ SG_ "GenSigTimeoutTime_CHCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_SOBDMC_HPCM_F" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_CMR_DSMC" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_ECM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_TCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_ECM_HEVDSL" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_AWD_DLCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_ECM_HEV" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_GENERIC" INT 0 100000; +BA_DEF_ BO_ "VFrameFormat" ENUM "StandardCAN","ExtendedCAN","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","reserved","StandardCAN_FD","ExtendedCAN_FD"; +BA_DEF_ SG_ "GenSigTimeoutTime_PSCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_HCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_ABS_ESC" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_ECM_Diesel" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_TCCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime__delete" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_TCM_DSL" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_TSTR" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_IPMA_ADAS" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_GWM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_PCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_PCM_HEV" INT 0 100000; +BA_DEF_ "BusType" STRING; +BA_DEF_ BO_ "FrameRouting" STRING; +BA_DEF_ BO_ "FrameGatewayNetwork" STRING; +BA_DEF_ BO_ "FrameGateway_LC1" HEX 0 1407; +BA_DEF_ BO_ "FrameGatewayLC1_HS3" HEX 0 1407; +BA_DEF_ BO_ "FrameGatewayMS1" HEX 0 1407; +BA_DEF_ BO_ "FrameGatewayHS3" HEX 0 1407; +BA_DEF_ BO_ "FrameGatewayHS2" HEX 0 1407; +BA_DEF_ BO_ "FrameGatewayHS1" HEX 0 1407; +BA_DEF_ BO_ "NetworkInitialization" ENUM "No","Yes"; +BA_DEF_ BO_ "FrameGatewayId" HEX 0 1407; +BA_DEF_ BO_ "EventRateOfChange" INT 10 10000; +BA_DEF_ BO_ "ConfiguredTransmitter" ENUM "No","Yes"; +BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 10000; +BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100; +BA_DEF_ BO_ "GenMsgDelayTime" INT 0 1000; +BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 100000; +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_ BO_ "GenMsgSendType" ENUM "FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType"; +BA_DEF_ SG_ "U_T6_MCA_MY2020_Tx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_P702_MY2021_Tx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_CX727_MY2021_Tx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_F5X_MY20_Tx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_Commodity_MYXX_Tx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_T6_MCA_MY2020_Rx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_P702_MY2021_Rx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_CX727_MY2021_Rx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_F5X_MY20_Rx" ENUM "No","Yes"; +BA_DEF_ SG_ "U_Commodity_MYXX_Rx" ENUM "No","Yes"; +BA_DEF_ SG_ "GenSigStartValue" HEX 0 268435455; +BA_DEF_ SG_ "MetaData" ENUM "No","Yes"; +BA_DEF_ SG_ "ApprovedOrphan" ENUM "No","Yes"; +BA_DEF_ SG_ "ContentDependant" ENUM "No","Yes"; +BA_DEF_ SG_ "GenSigStartValueInteger" INT 0 1000000000; +BA_DEF_ SG_ "UsedOnPgmDBC" ENUM "No","Yes"; +BA_DEF_ SG_ "CrossOver_InfoCAN" ENUM "No","Yes"; +BA_DEF_ SG_ "WakeupSignal" ENUM "No","Yes"; +BA_DEF_ SG_ "GenSigInactiveValue" INT 0 100000; +BA_DEF_ SG_ "GenSigSendType" ENUM "Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType"; +BA_DEF_ BO_ "SCP_FreshnessValueLength" INT 0 512; +BA_DEF_ BO_ "AuthFreshnessCounterSyncAttempt" INT 0 512; +BA_DEF_ BO_ "SCP_DataID" INT 0 65535; +BA_DEF_ BO_ "SCP_FreshnessValueTxLength" INT 0 512; +BA_DEF_ BO_ "SCP_AuthInfoTxLength" INT 0 512; +BA_DEF_ BO_ "SC_Message" ENUM "No","Yes"; +BA_DEF_ BO_ "ProgBWConditional" STRING; +BA_DEF_ BO_ "GenMsgRoutingTimeoutTime" INT 0 5000; +BA_DEF_ BO_ "MessageGateway" ENUM "No","Yes"; +BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes"; +BA_DEF_ BO_ "TpApplType" STRING; +BA_DEF_ BO_ "DiagState" ENUM "No","Yes"; +BA_DEF_ BO_ "TpTxIndex" INT 0 536870911; +BA_DEF_ BO_ "NetworkInitializationCommand" ENUM "No","Yes"; +BA_DEF_ BO_ "DiagRequest" ENUM "No","Yes"; +BA_DEF_ BO_ "DiagResponse" ENUM "No","Yes"; +BA_DEF_ BO_ "NmMessage" ENUM "No","Yes"; +BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes"; +BA_DEF_ BU_ "Terminator" ENUM "No","Yes"; +BA_DEF_ BU_ "NodeWakeUpTime" INT 0 10000; +BA_DEF_ BU_ "NodeStartUpTime" INT 0 10000; +BA_DEF_ BU_ "NmAsrNodeIdentifier" HEX 128 255; +BA_DEF_ BU_ "NmAsrNode" ENUM "No","Yes"; +BA_DEF_ BU_ "PowerType" ENUM "Switched","Latched","Sleep","vector_leerstring","vector_leerstring"; +BA_DEF_ BU_ "DiagNode" ENUM "GGDS","GDS","NONE"; +BA_DEF_ BU_ "EOL_SB_Flash" ENUM "GGDS","GDS","NONE","vector_leerstring"; +BA_DEF_ BU_ "NetworkInitializationUsed" ENUM "No","Yes"; +BA_DEF_ BU_ "NmNode" ENUM "No","Yes"; +BA_DEF_ BU_ "NmStationAddress" INT 0 255; +BA_DEF_ BU_ "ILUsed" ENUM "No","Yes"; +BA_DEF_ BU_ "NosPackage" ENUM "None","I3_1","I3_2","1.0.1","RP","EuCD","Volcano","I3_3","FNOS_Autosar"; +BA_DEF_ BU_ "LIN_Master" ENUM "No","Yes"; +BA_DEF_ BU_ "PackageID" STRING; +BA_DEF_ BU_ "GatewayECU" ENUM "No","Yes"; +BA_DEF_ "NetworkSpeed" ENUM "500kBits/s","125kBit/s"; +BA_DEF_ "VersionNumber" INT 0 10000; +BA_DEF_ "StarNetworkGwType" ENUM "0=NotDefined","1=HS1","2=HS2","3=HS3","4=HS4","5=HS5","6=MS1","7=HS6","8=HS7","9=MS2","10=FD1","11=FD2","12=FD3","13=FD4","14=FD5","15=FD6","16=FD7","17=FD8"; +BA_DEF_ "CMDB_Version" STRING; +BA_DEF_ "NmType" STRING; +BA_DEF_ "NmAsrMessageCount" INT 128 128; +BA_DEF_ "NmAsrBaseAddress" HEX 1408 1408; +BA_DEF_ "DBName" STRING; +BA_DEF_ "VersionDay" INT 1 31; +BA_DEF_ "Manufacturer" STRING; +BA_DEF_ "VersionMonth" INT 1 12; +BA_DEF_ "VersionYear" INT 2000 3000; +BA_DEF_ "NmBaseAddress" HEX 1280 1280; +BA_DEF_ "NmMessageCount" INT 0 128; +BA_DEF_DEF_ "OvtpPushApplication" "FALSE"; +BA_DEF_DEF_ "OvtpOperationMode" "SERVER"; +BA_DEF_DEF_ "OvtpEcuAddress" 0; +BA_DEF_DEF_ "ECGUsedRxSignal" "No"; +BA_DEF_DEF_ "U_S650_MY2022_Rx" "No"; +BA_DEF_DEF_ "ECGUsedTxSignal" "No"; +BA_DEF_DEF_ "U_S650_MY2022_Tx" "No"; +BA_DEF_DEF_ "GenSigTimeoutTime_CHCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_SOBDMC_HPCM_F" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_CMR_DSMC" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_ECM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_TCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_ECM_HEVDSL" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_AWD_DLCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_ECM_HEV" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_GENERIC" 0; +BA_DEF_DEF_ "VFrameFormat" "ExtendedCAN_FD"; +BA_DEF_DEF_ "GenSigTimeoutTime_PSCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_HCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_ABS_ESC" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_ECM_Diesel" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_TCCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime__delete" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_TCM_DSL" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_TSTR" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_IPMA_ADAS" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_GWM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_PCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_PCM_HEV" 0; +BA_DEF_DEF_ "BusType" ""; +BA_DEF_DEF_ "FrameRouting" "NONE"; +BA_DEF_DEF_ "FrameGatewayNetwork" "NONE"; +BA_DEF_DEF_ "FrameGateway_LC1" 0; +BA_DEF_DEF_ "FrameGatewayLC1_HS3" 0; +BA_DEF_DEF_ "FrameGatewayMS1" 0; +BA_DEF_DEF_ "FrameGatewayHS3" 0; +BA_DEF_DEF_ "FrameGatewayHS2" 0; +BA_DEF_DEF_ "FrameGatewayHS1" 0; +BA_DEF_DEF_ "NetworkInitialization" "Yes"; +BA_DEF_DEF_ "FrameGatewayId" 0; +BA_DEF_DEF_ "EventRateOfChange" 10000; +BA_DEF_DEF_ "ConfiguredTransmitter" "No"; +BA_DEF_DEF_ "GenMsgStartDelayTime" 0; +BA_DEF_DEF_ "GenMsgNrOfRepetition" 1; +BA_DEF_DEF_ "GenMsgDelayTime" 20; +BA_DEF_DEF_ "GenMsgCycleTimeFast" 0; +BA_DEF_DEF_ "GenMsgCycleTime" 0; +BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType"; +BA_DEF_DEF_ "U_T6_MCA_MY2020_Tx" "No"; +BA_DEF_DEF_ "U_P702_MY2021_Tx" "No"; +BA_DEF_DEF_ "U_CX727_MY2021_Tx" "No"; +BA_DEF_DEF_ "U_F5X_MY20_Tx" "No"; +BA_DEF_DEF_ "U_Commodity_MYXX_Tx" "No"; +BA_DEF_DEF_ "U_T6_MCA_MY2020_Rx" "No"; +BA_DEF_DEF_ "U_P702_MY2021_Rx" "No"; +BA_DEF_DEF_ "U_CX727_MY2021_Rx" "No"; +BA_DEF_DEF_ "U_F5X_MY20_Rx" "No"; +BA_DEF_DEF_ "U_Commodity_MYXX_Rx" "No"; +BA_DEF_DEF_ "GenSigStartValue" 0; +BA_DEF_DEF_ "MetaData" "No"; +BA_DEF_DEF_ "ApprovedOrphan" "No"; +BA_DEF_DEF_ "ContentDependant" "No"; +BA_DEF_DEF_ "GenSigStartValueInteger" 0; +BA_DEF_DEF_ "UsedOnPgmDBC" "Yes"; +BA_DEF_DEF_ "CrossOver_InfoCAN" "No"; +BA_DEF_DEF_ "WakeupSignal" "No"; +BA_DEF_DEF_ "GenSigInactiveValue" 0; +BA_DEF_DEF_ "GenSigSendType" "NoSigSendType"; +BA_DEF_DEF_ "SCP_FreshnessValueLength" 64; +BA_DEF_DEF_ "AuthFreshnessCounterSyncAttempt" 2; +BA_DEF_DEF_ "SCP_DataID" 0; +BA_DEF_DEF_ "SCP_FreshnessValueTxLength" 8; +BA_DEF_DEF_ "SCP_AuthInfoTxLength" 56; +BA_DEF_DEF_ "SC_Message" "No"; +BA_DEF_DEF_ "ProgBWConditional" "NONE"; +BA_DEF_DEF_ "GenMsgRoutingTimeoutTime" 0; +BA_DEF_DEF_ "MessageGateway" "No"; +BA_DEF_DEF_ "NmAsrMessage" "No"; +BA_DEF_DEF_ "TpApplType" ""; +BA_DEF_DEF_ "DiagState" "No"; +BA_DEF_DEF_ "TpTxIndex" 0; +BA_DEF_DEF_ "NetworkInitializationCommand" "No"; +BA_DEF_DEF_ "DiagRequest" "No"; +BA_DEF_DEF_ "DiagResponse" "No"; +BA_DEF_DEF_ "NmMessage" "No"; +BA_DEF_DEF_ "GenMsgILSupport" "Yes"; +BA_DEF_DEF_ "Terminator" "No"; +BA_DEF_DEF_ "NodeWakeUpTime" 10; +BA_DEF_DEF_ "NodeStartUpTime" 250; +BA_DEF_DEF_ "NmAsrNodeIdentifier" 128; +BA_DEF_DEF_ "NmAsrNode" "No"; +BA_DEF_DEF_ "PowerType" "Switched"; +BA_DEF_DEF_ "DiagNode" "GGDS"; +BA_DEF_DEF_ "EOL_SB_Flash" "GGDS"; +BA_DEF_DEF_ "NetworkInitializationUsed" "No"; +BA_DEF_DEF_ "NmNode" "No"; +BA_DEF_DEF_ "NmStationAddress" 0; +BA_DEF_DEF_ "ILUsed" "Yes"; +BA_DEF_DEF_ "NosPackage" "I3_3"; +BA_DEF_DEF_ "LIN_Master" "No"; +BA_DEF_DEF_ "PackageID" "08.05.00.00.71.xx.xx.rr.00.00"; +BA_DEF_DEF_ "GatewayECU" "No"; +BA_DEF_DEF_ "NetworkSpeed" "500kBits/s"; +BA_DEF_DEF_ "VersionNumber" 1; +BA_DEF_DEF_ "StarNetworkGwType" "0=NotDefined"; +BA_DEF_DEF_ "CMDB_Version" "v11.01"; +BA_DEF_DEF_ "NmType" "Ford-OSEK"; +BA_DEF_DEF_ "NmAsrMessageCount" 128; +BA_DEF_DEF_ "NmAsrBaseAddress" 1408; +BA_DEF_DEF_ "DBName" ""; +BA_DEF_DEF_ "VersionDay" 1; +BA_DEF_DEF_ "Manufacturer" "Ford"; +BA_DEF_DEF_ "VersionMonth" 1; +BA_DEF_DEF_ "VersionYear" 2011; +BA_DEF_DEF_ "NmBaseAddress" 1280; +BA_DEF_DEF_ "NmMessageCount" 128; +BA_ "BusType" "CAN FD"; +BA_ "VersionYear" 2019; +BA_ "VersionMonth" 4; +BA_ "Manufacturer" "Ford"; +BA_ "VersionDay" 11; +BA_ "CMDB_Version" "FNV2_v18.07"; +BA_ "StarNetworkGwType" 10; +BA_ "VersionNumber" 6; +BA_ "NmType" "Ford-OSEK"; +BA_ "DBName" "FD1_CAN"; +BA_ "NmStationAddress" BU_ VDM 48; +BA_ "OvtpEcuAddress" BU_ VDM 32; +BA_ "OvtpEcuAddress" BU_ CMR_DSMC 187; +BA_ "NmStationAddress" BU_ CMR_DSMC 95; +BA_ "PowerType" BU_ CMR_DSMC 2; +BA_ "NmAsrNode" BU_ CMR_DSMC 1; +BA_ "NmAsrNodeIdentifier" BU_ CMR_DSMC 223; +BA_ "OvtpEcuAddress" BU_ SOBDMC_HPCM_FD1 17; +BA_ "NmStationAddress" BU_ SOBDMC_HPCM_FD1 37; +BA_ "OvtpEcuAddress" BU_ IPMA_ADAS 33; +BA_ "NmStationAddress" BU_ IPMA_ADAS 28; +BA_ "NodeStartUpTime" BU_ IPMA_ADAS 300; +BA_ "OvtpEcuAddress" BU_ PSCM 48; +BA_ "NmStationAddress" BU_ PSCM 53; +BA_ "PowerType" BU_ PSCM 1; +BA_ "NmAsrNode" BU_ PSCM 1; +BA_ "NmAsrNodeIdentifier" BU_ PSCM 181; +BA_ "Terminator" BU_ PSCM 1; +BA_ "OvtpEcuAddress" BU_ ABS_ESC 40; +BA_ "NmStationAddress" BU_ ABS_ESC 22; +BA_ "PowerType" BU_ ABS_ESC 2; +BA_ "NmAsrNode" BU_ ABS_ESC 1; +BA_ "NmAsrNodeIdentifier" BU_ ABS_ESC 150; +BA_ "NodeStartUpTime" BU_ ABS_ESC 1000; +BA_ "NodeWakeUpTime" BU_ ABS_ESC 300; +BA_ "OvtpEcuAddress" BU_ TCCM 25; +BA_ "NmStationAddress" BU_ TCCM 33; +BA_ "NmAsrNode" BU_ TCCM 1; +BA_ "NmAsrNodeIdentifier" BU_ TCCM 161; +BA_ "NodeStartUpTime" BU_ TCCM 1000; +BA_ "NodeWakeUpTime" BU_ TCCM 25; +BA_ "OvtpEcuAddress" BU_ TCM_DSL 24; +BA_ "NmStationAddress" BU_ TCM_DSL 32; +BA_ "PowerType" BU_ TCM_DSL 1; +BA_ "NmAsrNode" BU_ TCM_DSL 1; +BA_ "NmAsrNodeIdentifier" BU_ TCM_DSL 160; +BA_ "NodeWakeUpTime" BU_ TCM_DSL 200; +BA_ "NosPackage" BU_ TCM_DSL 4; +BA_ "OvtpEcuAddress" BU_ PCM_HEV 16; +BA_ "NmStationAddress" BU_ PCM_HEV 21; +BA_ "PowerType" BU_ PCM_HEV 1; +BA_ "NmAsrNode" BU_ PCM_HEV 1; +BA_ "NmAsrNodeIdentifier" BU_ PCM_HEV 149; +BA_ "NodeStartUpTime" BU_ PCM_HEV 350; +BA_ "OvtpEcuAddress" BU_ PCM 16; +BA_ "NmStationAddress" BU_ PCM 21; +BA_ "PowerType" BU_ PCM 1; +BA_ "NmAsrNode" BU_ PCM 1; +BA_ "NmAsrNodeIdentifier" BU_ PCM 149; +BA_ "NodeStartUpTime" BU_ PCM 350; +BA_ "OvtpEcuAddress" BU_ ECM_Diesel 16; +BA_ "NmStationAddress" BU_ ECM_Diesel 21; +BA_ "PowerType" BU_ ECM_Diesel 1; +BA_ "NmAsrNode" BU_ ECM_Diesel 1; +BA_ "NmAsrNodeIdentifier" BU_ ECM_Diesel 149; +BA_ "OvtpEcuAddress" BU_ GWM 216; +BA_ "OvtpOperationMode" BU_ GWM 1; +BA_ "NmStationAddress" BU_ GWM 30; +BA_ "PowerType" BU_ GWM 2; +BA_ "NmAsrNode" BU_ GWM 1; +BA_ "NmAsrNodeIdentifier" BU_ GWM 158; +BA_ "NodeStartUpTime" BU_ GWM 100; +BA_ "Terminator" BU_ GWM 1; +BA_ "GatewayECU" BU_ GWM 1; +BA_ "NosPackage" BU_ GWM 4; +BA_ "GenMsgSendType" BO_ 823 5; +BA_ "GenMsgCycleTime" BO_ 823 1000; +BA_ "VFrameFormat" BO_ 823 14; +BA_ "GenMsgSendType" BO_ 824 5; +BA_ "GenMsgCycleTime" BO_ 824 1000; +BA_ "VFrameFormat" BO_ 824 14; +BA_ "FrameGatewayId" BO_ 949 949; +BA_ "FrameGatewayNetwork" BO_ 949 "HS1_CAN"; +BA_ "FrameRouting" BO_ 949 ""; +BA_ "VFrameFormat" BO_ 949 14; +BA_ "GenMsgILSupport" BO_ 1825 0; +BA_ "DiagRequest" BO_ 1825 1; +BA_ "GenMsgSendType" BO_ 1825 1; +BA_ "GenMsgDelayTime" BO_ 1825 0; +BA_ "NetworkInitialization" BO_ 1825 0; +BA_ "VFrameFormat" BO_ 1825 14; +BA_ "GenMsgDelayTime" BO_ 524 0; +BA_ "GenMsgCycleTime" BO_ 524 10; +BA_ "GenMsgSendType" BO_ 524 0; +BA_ "ProgBWConditional" BO_ 524 "MSGDCR1008_CX48X_V03_HS1D_56.84_mHEV_54.89"; +BA_ "VFrameFormat" BO_ 524 14; +BA_ "FrameRouting" BO_ 740 ""; +BA_ "FrameGatewayNetwork" BO_ 740 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 740 740; +BA_ "VFrameFormat" BO_ 740 14; +BA_ "GenMsgCycleTime" BO_ 1160 1000; +BA_ "GenMsgSendType" BO_ 1160 5; +BA_ "VFrameFormat" BO_ 1160 14; +BA_ "GenMsgCycleTime" BO_ 776 1000; +BA_ "GenMsgSendType" BO_ 776 5; +BA_ "VFrameFormat" BO_ 776 14; +BA_ "GenMsgCycleTime" BO_ 775 1000; +BA_ "GenMsgSendType" BO_ 775 5; +BA_ "VFrameFormat" BO_ 775 14; +BA_ "GenMsgCycleTime" BO_ 774 1000; +BA_ "GenMsgSendType" BO_ 774 5; +BA_ "VFrameFormat" BO_ 774 14; +BA_ "FrameGatewayId" BO_ 811 811; +BA_ "FrameGatewayNetwork" BO_ 811 "HS3_CAN"; +BA_ "FrameRouting" BO_ 811 ""; +BA_ "VFrameFormat" BO_ 811 14; +BA_ "GenMsgSendType" BO_ 850 0; +BA_ "GenMsgCycleTime" BO_ 850 150; +BA_ "VFrameFormat" BO_ 850 14; +BA_ "GenMsgCycleTime" BO_ 563 1000; +BA_ "GenMsgSendType" BO_ 563 5; +BA_ "VFrameFormat" BO_ 563 14; +BA_ "GenMsgILSupport" BO_ 1833 0; +BA_ "DiagResponse" BO_ 1833 1; +BA_ "GenMsgSendType" BO_ 1833 1; +BA_ "GenMsgDelayTime" BO_ 1833 0; +BA_ "NetworkInitialization" BO_ 1833 0; +BA_ "VFrameFormat" BO_ 1833 14; +BA_ "FrameRouting" BO_ 570 ""; +BA_ "GenMsgSendType" BO_ 570 0; +BA_ "GenMsgCycleTime" BO_ 570 20; +BA_ "GenMsgDelayTime" BO_ 570 10; +BA_ "VFrameFormat" BO_ 570 14; +BA_ "FrameRouting" BO_ 837 ""; +BA_ "GenMsgSendType" BO_ 837 5; +BA_ "GenMsgCycleTime" BO_ 837 1000; +BA_ "VFrameFormat" BO_ 837 14; +BA_ "FrameRouting" BO_ 885 ""; +BA_ "GenMsgSendType" BO_ 885 0; +BA_ "GenMsgCycleTime" BO_ 885 200; +BA_ "VFrameFormat" BO_ 885 14; +BA_ "FrameRouting" BO_ 1150 ""; +BA_ "FrameGatewayNetwork" BO_ 1150 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 1150 1118; +BA_ "VFrameFormat" BO_ 1150 14; +BA_ "FrameRouting" BO_ 542 ""; +BA_ "FrameGatewayNetwork" BO_ 542 "HS4_CAN"; +BA_ "FrameGatewayId" BO_ 542 542; +BA_ "VFrameFormat" BO_ 542 14; +BA_ "FrameRouting" BO_ 2612224016 ""; +BA_ "TpTxIndex" BO_ 2612224016 464535768; +BA_ "GenMsgSendType" BO_ 2612224016 1; +BA_ "GenMsgCycleTime" BO_ 2612224016 0; +BA_ "GenMsgDelayTime" BO_ 2612224016 0; +BA_ "NetworkInitialization" BO_ 2612224016 0; +BA_ "OvtpPushApplication" BO_ 2612224016 1; +BA_ "VFrameFormat" BO_ 2612224016 15; +BA_ "FrameRouting" BO_ 810 ""; +BA_ "GenMsgCycleTime" BO_ 810 1000; +BA_ "GenMsgSendType" BO_ 810 5; +BA_ "VFrameFormat" BO_ 810 14; +BA_ "FrameRouting" BO_ 550 ""; +BA_ "GenMsgCycleTime" BO_ 550 1000; +BA_ "GenMsgSendType" BO_ 550 5; +BA_ "VFrameFormat" BO_ 550 14; +BA_ "FrameRouting" BO_ 639 ""; +BA_ "GenMsgCycleTime" BO_ 639 1000; +BA_ "GenMsgSendType" BO_ 639 5; +BA_ "VFrameFormat" BO_ 639 14; +BA_ "FrameRouting" BO_ 530 ""; +BA_ "GenMsgCycleTime" BO_ 530 1000; +BA_ "GenMsgSendType" BO_ 530 5; +BA_ "VFrameFormat" BO_ 530 14; +BA_ "FrameRouting" BO_ 1142 ""; +BA_ "GenMsgSendType" BO_ 1142 0; +BA_ "GenMsgCycleTime" BO_ 1142 500; +BA_ "VFrameFormat" BO_ 1142 14; +BA_ "FrameRouting" BO_ 817 ""; +BA_ "FrameGatewayId" BO_ 817 817; +BA_ "FrameGatewayNetwork" BO_ 817 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 817 14; +BA_ "FrameRouting" BO_ 879 ""; +BA_ "FrameGatewayNetwork" BO_ 879 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 879 879; +BA_ "VFrameFormat" BO_ 879 14; +BA_ "FrameRouting" BO_ 878 ""; +BA_ "GenMsgSendType" BO_ 878 5; +BA_ "GenMsgCycleTime" BO_ 878 1000; +BA_ "VFrameFormat" BO_ 878 14; +BA_ "FrameRouting" BO_ 395 ""; +BA_ "FrameGatewayNetwork" BO_ 395 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 395 395; +BA_ "VFrameFormat" BO_ 395 14; +BA_ "TpTxIndex" BO_ 2611055832 463572184; +BA_ "FrameRouting" BO_ 2611055832 ""; +BA_ "NetworkInitialization" BO_ 2611055832 0; +BA_ "GenMsgDelayTime" BO_ 2611055832 0; +BA_ "GenMsgSendType" BO_ 2611055832 1; +BA_ "VFrameFormat" BO_ 2611055832 15; +BA_ "TpTxIndex" BO_ 2611054808 463571160; +BA_ "FrameRouting" BO_ 2611054808 ""; +BA_ "NetworkInitialization" BO_ 2611054808 0; +BA_ "GenMsgDelayTime" BO_ 2611054808 0; +BA_ "GenMsgSendType" BO_ 2611054808 1; +BA_ "VFrameFormat" BO_ 2611054808 15; +BA_ "TpTxIndex" BO_ 2611026136 463542488; +BA_ "FrameRouting" BO_ 2611026136 ""; +BA_ "NetworkInitialization" BO_ 2611026136 0; +BA_ "GenMsgDelayTime" BO_ 2611026136 0; +BA_ "GenMsgSendType" BO_ 2611026136 1; +BA_ "VFrameFormat" BO_ 2611026136 15; +BA_ "TpTxIndex" BO_ 2611025112 463541464; +BA_ "FrameRouting" BO_ 2611025112 ""; +BA_ "NetworkInitialization" BO_ 2611025112 0; +BA_ "GenMsgDelayTime" BO_ 2611025112 0; +BA_ "GenMsgSendType" BO_ 2611025112 1; +BA_ "VFrameFormat" BO_ 2611025112 15; +BA_ "TpTxIndex" BO_ 2610975960 463492312; +BA_ "FrameRouting" BO_ 2610975960 ""; +BA_ "NetworkInitialization" BO_ 2610975960 0; +BA_ "GenMsgDelayTime" BO_ 2610975960 0; +BA_ "GenMsgSendType" BO_ 2610975960 1; +BA_ "VFrameFormat" BO_ 2610975960 15; +BA_ "FrameRouting" BO_ 2610007256 ""; +BA_ "NetworkInitialization" BO_ 2610007256 0; +BA_ "GenMsgDelayTime" BO_ 2610007256 0; +BA_ "GenMsgSendType" BO_ 2610007256 1; +BA_ "TpTxIndex" BO_ 2610007256 462523608; +BA_ "VFrameFormat" BO_ 2610007256 15; +BA_ "FrameRouting" BO_ 2610006232 ""; +BA_ "NetworkInitialization" BO_ 2610006232 0; +BA_ "GenMsgDelayTime" BO_ 2610006232 0; +BA_ "GenMsgSendType" BO_ 2610006232 1; +BA_ "TpTxIndex" BO_ 2610006232 462522584; +BA_ "VFrameFormat" BO_ 2610006232 15; +BA_ "FrameRouting" BO_ 2609977560 ""; +BA_ "NetworkInitialization" BO_ 2609977560 0; +BA_ "GenMsgDelayTime" BO_ 2609977560 0; +BA_ "GenMsgSendType" BO_ 2609977560 1; +BA_ "TpTxIndex" BO_ 2609977560 462493912; +BA_ "VFrameFormat" BO_ 2609977560 15; +BA_ "FrameRouting" BO_ 2609976536 ""; +BA_ "NetworkInitialization" BO_ 2609976536 0; +BA_ "GenMsgDelayTime" BO_ 2609976536 0; +BA_ "GenMsgSendType" BO_ 2609976536 1; +BA_ "TpTxIndex" BO_ 2609976536 462492888; +BA_ "VFrameFormat" BO_ 2609976536 15; +BA_ "FrameRouting" BO_ 2609927384 ""; +BA_ "NetworkInitialization" BO_ 2609927384 0; +BA_ "GenMsgDelayTime" BO_ 2609927384 0; +BA_ "GenMsgSendType" BO_ 2609927384 1; +BA_ "TpTxIndex" BO_ 2609927384 462443736; +BA_ "VFrameFormat" BO_ 2609927384 15; +BA_ "TpTxIndex" BO_ 2611175523 463572184; +BA_ "FrameRouting" BO_ 2611175523 ""; +BA_ "NetworkInitialization" BO_ 2611175523 0; +BA_ "GenMsgDelayTime" BO_ 2611175523 0; +BA_ "GenMsgSendType" BO_ 2611175523 1; +BA_ "VFrameFormat" BO_ 2611175523 15; +BA_ "TpTxIndex" BO_ 2612224099 464620760; +BA_ "OvtpPushApplication" BO_ 2612224099 1; +BA_ "FrameRouting" BO_ 2612224099 ""; +BA_ "NetworkInitialization" BO_ 2612224099 0; +BA_ "GenMsgDelayTime" BO_ 2612224099 0; +BA_ "GenMsgSendType" BO_ 2612224099 1; +BA_ "VFrameFormat" BO_ 2612224099 15; +BA_ "TpTxIndex" BO_ 2611175522 463571160; +BA_ "FrameRouting" BO_ 2611175522 ""; +BA_ "NetworkInitialization" BO_ 2611175522 0; +BA_ "GenMsgDelayTime" BO_ 2611175522 0; +BA_ "GenMsgSendType" BO_ 2611175522 1; +BA_ "VFrameFormat" BO_ 2611175522 15; +BA_ "TpTxIndex" BO_ 2612224098 464619736; +BA_ "OvtpPushApplication" BO_ 2612224098 1; +BA_ "FrameRouting" BO_ 2612224098 ""; +BA_ "NetworkInitialization" BO_ 2612224098 0; +BA_ "GenMsgDelayTime" BO_ 2612224098 0; +BA_ "GenMsgSendType" BO_ 2612224098 1; +BA_ "VFrameFormat" BO_ 2612224098 15; +BA_ "TpTxIndex" BO_ 2611175494 463542488; +BA_ "FrameRouting" BO_ 2611175494 ""; +BA_ "NetworkInitialization" BO_ 2611175494 0; +BA_ "GenMsgDelayTime" BO_ 2611175494 0; +BA_ "GenMsgSendType" BO_ 2611175494 1; +BA_ "VFrameFormat" BO_ 2611175494 15; +BA_ "TpTxIndex" BO_ 2612224070 464591064; +BA_ "OvtpPushApplication" BO_ 2612224070 1; +BA_ "FrameRouting" BO_ 2612224070 ""; +BA_ "NetworkInitialization" BO_ 2612224070 0; +BA_ "GenMsgDelayTime" BO_ 2612224070 0; +BA_ "GenMsgSendType" BO_ 2612224070 1; +BA_ "VFrameFormat" BO_ 2612224070 15; +BA_ "TpTxIndex" BO_ 2611175493 463541464; +BA_ "FrameRouting" BO_ 2611175493 ""; +BA_ "NetworkInitialization" BO_ 2611175493 0; +BA_ "GenMsgDelayTime" BO_ 2611175493 0; +BA_ "GenMsgSendType" BO_ 2611175493 1; +BA_ "VFrameFormat" BO_ 2611175493 15; +BA_ "TpTxIndex" BO_ 2612224069 464590040; +BA_ "OvtpPushApplication" BO_ 2612224069 1; +BA_ "FrameRouting" BO_ 2612224069 ""; +BA_ "NetworkInitialization" BO_ 2612224069 0; +BA_ "GenMsgDelayTime" BO_ 2612224069 0; +BA_ "GenMsgSendType" BO_ 2612224069 1; +BA_ "VFrameFormat" BO_ 2612224069 15; +BA_ "TpTxIndex" BO_ 2611175445 463492312; +BA_ "FrameRouting" BO_ 2611175445 ""; +BA_ "NetworkInitialization" BO_ 2611175445 0; +BA_ "GenMsgDelayTime" BO_ 2611175445 0; +BA_ "GenMsgSendType" BO_ 2611175445 1; +BA_ "VFrameFormat" BO_ 2611175445 15; +BA_ "TpTxIndex" BO_ 2612224021 464540888; +BA_ "OvtpPushApplication" BO_ 2612224021 1; +BA_ "FrameRouting" BO_ 2612224021 ""; +BA_ "NetworkInitialization" BO_ 2612224021 0; +BA_ "GenMsgDelayTime" BO_ 2612224021 0; +BA_ "GenMsgSendType" BO_ 2612224021 1; +BA_ "VFrameFormat" BO_ 2612224021 15; +BA_ "TpTxIndex" BO_ 2610126947 462523608; +BA_ "FrameRouting" BO_ 2610126947 ""; +BA_ "NetworkInitialization" BO_ 2610126947 0; +BA_ "GenMsgDelayTime" BO_ 2610126947 0; +BA_ "GenMsgSendType" BO_ 2610126947 1; +BA_ "VFrameFormat" BO_ 2610126947 15; +BA_ "TpTxIndex" BO_ 2610126946 462522584; +BA_ "FrameRouting" BO_ 2610126946 ""; +BA_ "NetworkInitialization" BO_ 2610126946 0; +BA_ "GenMsgDelayTime" BO_ 2610126946 0; +BA_ "GenMsgSendType" BO_ 2610126946 1; +BA_ "VFrameFormat" BO_ 2610126946 15; +BA_ "TpTxIndex" BO_ 2610126918 462493912; +BA_ "FrameRouting" BO_ 2610126918 ""; +BA_ "NetworkInitialization" BO_ 2610126918 0; +BA_ "GenMsgDelayTime" BO_ 2610126918 0; +BA_ "GenMsgSendType" BO_ 2610126918 1; +BA_ "VFrameFormat" BO_ 2610126918 15; +BA_ "TpTxIndex" BO_ 2610126917 462492888; +BA_ "FrameRouting" BO_ 2610126917 ""; +BA_ "NetworkInitialization" BO_ 2610126917 0; +BA_ "GenMsgDelayTime" BO_ 2610126917 0; +BA_ "GenMsgSendType" BO_ 2610126917 1; +BA_ "VFrameFormat" BO_ 2610126917 15; +BA_ "FrameRouting" BO_ 2610126869 ""; +BA_ "NetworkInitialization" BO_ 2610126869 0; +BA_ "GenMsgDelayTime" BO_ 2610126869 0; +BA_ "GenMsgSendType" BO_ 2610126869 1; +BA_ "TpTxIndex" BO_ 2610126869 462443736; +BA_ "VFrameFormat" BO_ 2610126869 15; +BA_ "FrameRouting" BO_ 984 ""; +BA_ "GenMsgCycleTime" BO_ 984 1000; +BA_ "GenMsgSendType" BO_ 984 5; +BA_ "VFrameFormat" BO_ 984 14; +BA_ "FrameRouting" BO_ 985 ""; +BA_ "GenMsgSendType" BO_ 985 5; +BA_ "GenMsgCycleTime" BO_ 985 1000; +BA_ "VFrameFormat" BO_ 985 14; +BA_ "FrameRouting" BO_ 992 ""; +BA_ "FrameGatewayNetwork" BO_ 992 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 992 992; +BA_ "VFrameFormat" BO_ 992 14; +BA_ "OvtpPushApplication" BO_ 2612019416 1; +BA_ "FrameRouting" BO_ 2612019416 ""; +BA_ "TpTxIndex" BO_ 2612019416 464535768; +BA_ "NetworkInitialization" BO_ 2612019416 0; +BA_ "GenMsgDelayTime" BO_ 2612019416 0; +BA_ "GenMsgSendType" BO_ 2612019416 1; +BA_ "VFrameFormat" BO_ 2612019416 15; +BA_ "FrameRouting" BO_ 943 ""; +BA_ "GenMsgSendType" BO_ 943 0; +BA_ "GenMsgCycleTime" BO_ 943 20; +BA_ "GenMsgDelayTime" BO_ 943 10; +BA_ "VFrameFormat" BO_ 943 14; +BA_ "FrameRouting" BO_ 515 ""; +BA_ "GenMsgSendType" BO_ 515 5; +BA_ "GenMsgCycleTime" BO_ 515 100; +BA_ "VFrameFormat" BO_ 515 14; +BA_ "FrameRouting" BO_ 1111 ""; +BA_ "FrameGatewayId" BO_ 1111 1111; +BA_ "FrameGatewayNetwork" BO_ 1111 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 1111 14; +BA_ "FrameRouting" BO_ 1106 ""; +BA_ "FrameGatewayId" BO_ 1106 1106; +BA_ "FrameGatewayNetwork" BO_ 1106 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 1106 14; +BA_ "FrameRouting" BO_ 982 ""; +BA_ "GenMsgSendType" BO_ 982 0; +BA_ "GenMsgCycleTime" BO_ 982 50; +BA_ "VFrameFormat" BO_ 982 14; +BA_ "FrameRouting" BO_ 1985 ""; +BA_ "NetworkInitialization" BO_ 1985 0; +BA_ "GenMsgDelayTime" BO_ 1985 0; +BA_ "GenMsgSendType" BO_ 1985 1; +BA_ "DiagRequest" BO_ 1985 1; +BA_ "GenMsgILSupport" BO_ 1985 0; +BA_ "VFrameFormat" BO_ 1985 14; +BA_ "FrameRouting" BO_ 1993 ""; +BA_ "NetworkInitialization" BO_ 1993 0; +BA_ "GenMsgDelayTime" BO_ 1993 0; +BA_ "GenMsgSendType" BO_ 1993 1; +BA_ "DiagResponse" BO_ 1993 1; +BA_ "GenMsgILSupport" BO_ 1993 0; +BA_ "VFrameFormat" BO_ 1993 14; +BA_ "FrameRouting" BO_ 1104 ""; +BA_ "GenMsgCycleTime" BO_ 1104 200; +BA_ "GenMsgSendType" BO_ 1104 0; +BA_ "VFrameFormat" BO_ 1104 14; +BA_ "FrameRouting" BO_ 1503 ""; +BA_ "NetworkInitialization" BO_ 1503 0; +BA_ "GenMsgCycleTime" BO_ 1503 1000; +BA_ "GenMsgSendType" BO_ 1503 0; +BA_ "NmAsrMessage" BO_ 1503 1; +BA_ "GenMsgILSupport" BO_ 1503 0; +BA_ "VFrameFormat" BO_ 1503 14; +BA_ "TpTxIndex" BO_ 2610995416 463511768; +BA_ "FrameRouting" BO_ 2610995416 ""; +BA_ "NetworkInitialization" BO_ 2610995416 0; +BA_ "GenMsgDelayTime" BO_ 2610995416 0; +BA_ "GenMsgSendType" BO_ 2610995416 1; +BA_ "VFrameFormat" BO_ 2610995416 15; +BA_ "TpTxIndex" BO_ 2612043992 464560344; +BA_ "OvtpPushApplication" BO_ 2612043992 1; +BA_ "FrameRouting" BO_ 2612043992 ""; +BA_ "NetworkInitialization" BO_ 2612043992 0; +BA_ "GenMsgDelayTime" BO_ 2612043992 0; +BA_ "GenMsgSendType" BO_ 2612043992 1; +BA_ "VFrameFormat" BO_ 2612043992 15; +BA_ "FrameRouting" BO_ 2609946840 ""; +BA_ "NetworkInitialization" BO_ 2609946840 0; +BA_ "GenMsgDelayTime" BO_ 2609946840 0; +BA_ "GenMsgSendType" BO_ 2609946840 1; +BA_ "TpTxIndex" BO_ 2609946840 462463192; +BA_ "VFrameFormat" BO_ 2609946840 15; +BA_ "TpTxIndex" BO_ 2611175464 463511768; +BA_ "FrameRouting" BO_ 2611175464 ""; +BA_ "NetworkInitialization" BO_ 2611175464 0; +BA_ "GenMsgDelayTime" BO_ 2611175464 0; +BA_ "GenMsgSendType" BO_ 2611175464 1; +BA_ "VFrameFormat" BO_ 2611175464 15; +BA_ "TpTxIndex" BO_ 2612224040 464560344; +BA_ "OvtpPushApplication" BO_ 2612224040 1; +BA_ "FrameRouting" BO_ 2612224040 ""; +BA_ "NetworkInitialization" BO_ 2612224040 0; +BA_ "GenMsgDelayTime" BO_ 2612224040 0; +BA_ "GenMsgSendType" BO_ 2612224040 1; +BA_ "VFrameFormat" BO_ 2612224040 15; +BA_ "TpTxIndex" BO_ 2610126888 462463192; +BA_ "FrameRouting" BO_ 2610126888 ""; +BA_ "NetworkInitialization" BO_ 2610126888 0; +BA_ "GenMsgDelayTime" BO_ 2610126888 0; +BA_ "GenMsgSendType" BO_ 2610126888 1; +BA_ "VFrameFormat" BO_ 2610126888 15; +BA_ "TpTxIndex" BO_ 2610988248 463504600; +BA_ "FrameRouting" BO_ 2610988248 ""; +BA_ "NetworkInitialization" BO_ 2610988248 0; +BA_ "GenMsgDelayTime" BO_ 2610988248 0; +BA_ "GenMsgSendType" BO_ 2610988248 1; +BA_ "VFrameFormat" BO_ 2610988248 15; +BA_ "FrameRouting" BO_ 2609939672 ""; +BA_ "NetworkInitialization" BO_ 2609939672 0; +BA_ "GenMsgDelayTime" BO_ 2609939672 0; +BA_ "GenMsgSendType" BO_ 2609939672 1; +BA_ "TpTxIndex" BO_ 2609939672 462456024; +BA_ "VFrameFormat" BO_ 2609939672 15; +BA_ "FrameRouting" BO_ 1114 ""; +BA_ "FrameGatewayNetwork" BO_ 1114 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 1114 1114; +BA_ "VFrameFormat" BO_ 1114 14; +BA_ "FrameRouting" BO_ 1116 ""; +BA_ "FrameGatewayNetwork" BO_ 1116 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 1116 1116; +BA_ "VFrameFormat" BO_ 1116 14; +BA_ "TpTxIndex" BO_ 2611175457 463504600; +BA_ "FrameRouting" BO_ 2611175457 ""; +BA_ "NetworkInitialization" BO_ 2611175457 0; +BA_ "GenMsgDelayTime" BO_ 2611175457 0; +BA_ "GenMsgSendType" BO_ 2611175457 1; +BA_ "VFrameFormat" BO_ 2611175457 15; +BA_ "TpTxIndex" BO_ 2612224033 464553176; +BA_ "OvtpPushApplication" BO_ 2612224033 1; +BA_ "FrameRouting" BO_ 2612224033 ""; +BA_ "NetworkInitialization" BO_ 2612224033 0; +BA_ "GenMsgDelayTime" BO_ 2612224033 0; +BA_ "GenMsgSendType" BO_ 2612224033 1; +BA_ "VFrameFormat" BO_ 2612224033 15; +BA_ "TpTxIndex" BO_ 2610126881 462456024; +BA_ "FrameRouting" BO_ 2610126881 ""; +BA_ "NetworkInitialization" BO_ 2610126881 0; +BA_ "GenMsgDelayTime" BO_ 2610126881 0; +BA_ "GenMsgSendType" BO_ 2610126881 1; +BA_ "VFrameFormat" BO_ 2610126881 15; +BA_ "FrameRouting" BO_ 1085 ""; +BA_ "GenMsgSendType" BO_ 1085 0; +BA_ "GenMsgCycleTime" BO_ 1085 50; +BA_ "VFrameFormat" BO_ 1085 14; +BA_ "FrameRouting" BO_ 981 ""; +BA_ "GenMsgSendType" BO_ 981 0; +BA_ "GenMsgCycleTime" BO_ 981 30; +BA_ "VFrameFormat" BO_ 981 14; +BA_ "FrameRouting" BO_ 791 ""; +BA_ "FrameGatewayId" BO_ 791 791; +BA_ "FrameGatewayNetwork" BO_ 791 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 791 14; +BA_ "TpTxIndex" BO_ 2610970840 463487192; +BA_ "FrameRouting" BO_ 2610970840 ""; +BA_ "NetworkInitialization" BO_ 2610970840 0; +BA_ "GenMsgDelayTime" BO_ 2610970840 0; +BA_ "GenMsgSendType" BO_ 2610970840 1; +BA_ "VFrameFormat" BO_ 2610970840 15; +BA_ "TpTxIndex" BO_ 2609922264 462438616; +BA_ "FrameRouting" BO_ 2609922264 ""; +BA_ "NetworkInitialization" BO_ 2609922264 0; +BA_ "GenMsgDelayTime" BO_ 2609922264 0; +BA_ "GenMsgSendType" BO_ 2609922264 1; +BA_ "VFrameFormat" BO_ 2609922264 15; +BA_ "FrameRouting" BO_ 868 ""; +BA_ "FrameGatewayNetwork" BO_ 868 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 868 868; +BA_ "VFrameFormat" BO_ 868 14; +BA_ "FrameRouting" BO_ 867 ""; +BA_ "FrameGatewayNetwork" BO_ 867 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 867 867; +BA_ "VFrameFormat" BO_ 867 14; +BA_ "FrameRouting" BO_ 866 ""; +BA_ "FrameGatewayNetwork" BO_ 866 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 866 866; +BA_ "VFrameFormat" BO_ 866 14; +BA_ "FrameRouting" BO_ 865 ""; +BA_ "FrameGatewayNetwork" BO_ 865 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 865 865; +BA_ "VFrameFormat" BO_ 865 14; +BA_ "TpTxIndex" BO_ 2611175440 463487192; +BA_ "FrameRouting" BO_ 2611175440 ""; +BA_ "NetworkInitialization" BO_ 2611175440 0; +BA_ "GenMsgDelayTime" BO_ 2611175440 0; +BA_ "GenMsgCycleTime" BO_ 2611175440 0; +BA_ "GenMsgSendType" BO_ 2611175440 1; +BA_ "VFrameFormat" BO_ 2611175440 15; +BA_ "TpTxIndex" BO_ 2610126864 462438616; +BA_ "FrameRouting" BO_ 2610126864 ""; +BA_ "NetworkInitialization" BO_ 2610126864 0; +BA_ "GenMsgDelayTime" BO_ 2610126864 0; +BA_ "GenMsgSendType" BO_ 2610126864 1; +BA_ "VFrameFormat" BO_ 2610126864 15; +BA_ "TpTxIndex" BO_ 2611175441 463488216; +BA_ "FrameRouting" BO_ 2611175441 ""; +BA_ "NetworkInitialization" BO_ 2611175441 0; +BA_ "GenMsgDelayTime" BO_ 2611175441 0; +BA_ "GenMsgSendType" BO_ 2611175441 1; +BA_ "VFrameFormat" BO_ 2611175441 15; +BA_ "TpTxIndex" BO_ 2612224017 463488216; +BA_ "OvtpPushApplication" BO_ 2612224017 1; +BA_ "FrameRouting" BO_ 2612224017 ""; +BA_ "NetworkInitialization" BO_ 2612224017 0; +BA_ "GenMsgDelayTime" BO_ 2612224017 0; +BA_ "GenMsgSendType" BO_ 2612224017 1; +BA_ "VFrameFormat" BO_ 2612224017 15; +BA_ "FrameRouting" BO_ 2610126865 ""; +BA_ "NetworkInitialization" BO_ 2610126865 0; +BA_ "GenMsgDelayTime" BO_ 2610126865 0; +BA_ "GenMsgSendType" BO_ 2610126865 1; +BA_ "TpTxIndex" BO_ 2610126865 462439640; +BA_ "VFrameFormat" BO_ 2610126865 15; +BA_ "FrameRouting" BO_ 1679 ""; +BA_ "GenMsgCycleTime" BO_ 1679 0; +BA_ "GenMsgSendType" BO_ 1679 1; +BA_ "TpApplType" BO_ 1679 "DiagUUDTResponse"; +BA_ "GenMsgILSupport" BO_ 1679 0; +BA_ "VFrameFormat" BO_ 1679 14; +BA_ "FrameRouting" BO_ 1678 ""; +BA_ "GenMsgCycleTime" BO_ 1678 0; +BA_ "GenMsgSendType" BO_ 1678 1; +BA_ "TpApplType" BO_ 1678 "DiagUUDTResponse"; +BA_ "GenMsgILSupport" BO_ 1678 0; +BA_ "VFrameFormat" BO_ 1678 14; +BA_ "FrameRouting" BO_ 1677 ""; +BA_ "GenMsgCycleTime" BO_ 1677 0; +BA_ "GenMsgSendType" BO_ 1677 1; +BA_ "TpApplType" BO_ 1677 "DiagUUDTResponse"; +BA_ "GenMsgILSupport" BO_ 1677 0; +BA_ "VFrameFormat" BO_ 1677 14; +BA_ "FrameRouting" BO_ 1676 ""; +BA_ "GenMsgCycleTime" BO_ 1676 0; +BA_ "GenMsgSendType" BO_ 1676 1; +BA_ "TpApplType" BO_ 1676 "DiagUUDTResponse"; +BA_ "GenMsgILSupport" BO_ 1676 0; +BA_ "VFrameFormat" BO_ 1676 14; +BA_ "FrameRouting" BO_ 1445 ""; +BA_ "GenMsgILSupport" BO_ 1445 0; +BA_ "NmAsrMessage" BO_ 1445 1; +BA_ "GenMsgSendType" BO_ 1445 0; +BA_ "GenMsgCycleTime" BO_ 1445 1000; +BA_ "NetworkInitialization" BO_ 1445 0; +BA_ "VFrameFormat" BO_ 1445 14; +BA_ "FrameRouting" BO_ 1144 ""; +BA_ "GenMsgSendType" BO_ 1144 5; +BA_ "GenMsgCycleTime" BO_ 1144 1000; +BA_ "VFrameFormat" BO_ 1144 14; +BA_ "FrameRouting" BO_ 1141 ""; +BA_ "GenMsgSendType" BO_ 1141 0; +BA_ "GenMsgCycleTime" BO_ 1141 500; +BA_ "VFrameFormat" BO_ 1141 14; +BA_ "FrameRouting" BO_ 1140 ""; +BA_ "GenMsgSendType" BO_ 1140 0; +BA_ "GenMsgCycleTime" BO_ 1140 1000; +BA_ "VFrameFormat" BO_ 1140 14; +BA_ "FrameRouting" BO_ 1139 ""; +BA_ "GenMsgCycleTime" BO_ 1139 1500; +BA_ "GenMsgSendType" BO_ 1139 0; +BA_ "VFrameFormat" BO_ 1139 14; +BA_ "FrameRouting" BO_ 1138 ""; +BA_ "GenMsgCycleTime" BO_ 1138 1500; +BA_ "GenMsgSendType" BO_ 1138 0; +BA_ "VFrameFormat" BO_ 1138 14; +BA_ "FrameRouting" BO_ 1089 ""; +BA_ "GenMsgCycleTime" BO_ 1089 1000; +BA_ "GenMsgSendType" BO_ 1089 0; +BA_ "VFrameFormat" BO_ 1089 14; +BA_ "FrameRouting" BO_ 1088 ""; +BA_ "GenMsgCycleTime" BO_ 1088 1000; +BA_ "GenMsgSendType" BO_ 1088 0; +BA_ "VFrameFormat" BO_ 1088 14; +BA_ "FrameRouting" BO_ 1040 ""; +BA_ "GenMsgCycleTime" BO_ 1040 100; +BA_ "GenMsgSendType" BO_ 1040 0; +BA_ "VFrameFormat" BO_ 1040 14; +BA_ "FrameRouting" BO_ 1016 ""; +BA_ "GenMsgCycleTime" BO_ 1016 1000; +BA_ "GenMsgSendType" BO_ 1016 5; +BA_ "VFrameFormat" BO_ 1016 14; +BA_ "FrameRouting" BO_ 1013 ""; +BA_ "GenMsgCycleTime" BO_ 1013 1000; +BA_ "GenMsgSendType" BO_ 1013 5; +BA_ "VFrameFormat" BO_ 1013 14; +BA_ "FrameRouting" BO_ 1012 ""; +BA_ "GenMsgCycleTime" BO_ 1012 1000; +BA_ "GenMsgSendType" BO_ 1012 5; +BA_ "VFrameFormat" BO_ 1012 14; +BA_ "FrameRouting" BO_ 1011 ""; +BA_ "GenMsgCycleTime" BO_ 1011 1000; +BA_ "GenMsgSendType" BO_ 1011 5; +BA_ "VFrameFormat" BO_ 1011 14; +BA_ "FrameRouting" BO_ 871 ""; +BA_ "GenMsgCycleTime" BO_ 871 100; +BA_ "GenMsgSendType" BO_ 871 0; +BA_ "VFrameFormat" BO_ 871 14; +BA_ "FrameRouting" BO_ 786 ""; +BA_ "GenMsgCycleTime" BO_ 786 100; +BA_ "GenMsgSendType" BO_ 786 0; +BA_ "VFrameFormat" BO_ 786 14; +BA_ "FrameRouting" BO_ 72 ""; +BA_ "GenMsgDelayTime" BO_ 72 10; +BA_ "GenMsgCycleTime" BO_ 72 20; +BA_ "GenMsgSendType" BO_ 72 0; +BA_ "VFrameFormat" BO_ 72 14; +BA_ "FrameRouting" BO_ 912 ""; +BA_ "FrameGatewayNetwork" BO_ 912 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 912 912; +BA_ "VFrameFormat" BO_ 912 14; +BA_ "FrameRouting" BO_ 874 ""; +BA_ "FrameGatewayNetwork" BO_ 874 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 874 874; +BA_ "VFrameFormat" BO_ 874 14; +BA_ "FrameRouting" BO_ 651 ""; +BA_ "FrameGatewayNetwork" BO_ 651 "HS4_CAN"; +BA_ "FrameGatewayId" BO_ 651 651; +BA_ "VFrameFormat" BO_ 651 14; +BA_ "FrameRouting" BO_ 529 ""; +BA_ "FrameGatewayNetwork" BO_ 529 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 529 529; +BA_ "VFrameFormat" BO_ 529 14; +BA_ "FrameRouting" BO_ 66 ""; +BA_ "FrameGatewayNetwork" BO_ 66 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 66 66; +BA_ "DiagResponse" BO_ 66 0; +BA_ "VFrameFormat" BO_ 66 14; +BA_ "TpTxIndex" BO_ 2610971864 463488216; +BA_ "FrameRouting" BO_ 2610971864 ""; +BA_ "NetworkInitialization" BO_ 2610971864 0; +BA_ "GenMsgDelayTime" BO_ 2610971864 0; +BA_ "GenMsgSendType" BO_ 2610971864 1; +BA_ "VFrameFormat" BO_ 2610971864 15; +BA_ "TpTxIndex" BO_ 2612002008 464518360; +BA_ "FrameRouting" BO_ 2612002008 ""; +BA_ "NetworkInitialization" BO_ 2612002008 0; +BA_ "GenMsgDelayTime" BO_ 2612002008 0; +BA_ "GenMsgSendType" BO_ 2612002008 1; +BA_ "VFrameFormat" BO_ 2612002008 15; +BA_ "FrameRouting" BO_ 2609923288 ""; +BA_ "NetworkInitialization" BO_ 2609923288 0; +BA_ "GenMsgDelayTime" BO_ 2609923288 0; +BA_ "GenMsgSendType" BO_ 2609923288 1; +BA_ "TpTxIndex" BO_ 2609923288 462439640; +BA_ "VFrameFormat" BO_ 2609923288 15; +BA_ "TpTxIndex" BO_ 2610953432 463469784; +BA_ "FrameRouting" BO_ 2610953432 ""; +BA_ "NetworkInitialization" BO_ 2610953432 0; +BA_ "GenMsgDelayTime" BO_ 2610953432 0; +BA_ "GenMsgSendType" BO_ 2610953432 1; +BA_ "VFrameFormat" BO_ 2610953432 15; +BA_ "FrameRouting" BO_ 2022 ""; +BA_ "GenMsgILSupport" BO_ 2022 0; +BA_ "DiagRequest" BO_ 2022 1; +BA_ "GenMsgSendType" BO_ 2022 1; +BA_ "GenMsgDelayTime" BO_ 2022 0; +BA_ "VFrameFormat" BO_ 2022 14; +BA_ "FrameRouting" BO_ 1124 ""; +BA_ "FrameGatewayId" BO_ 1124 1124; +BA_ "FrameGatewayNetwork" BO_ 1124 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 1124 14; +BA_ "FrameRouting" BO_ 1119 ""; +BA_ "FrameGatewayId" BO_ 1119 1119; +BA_ "FrameGatewayNetwork" BO_ 1119 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 1119 14; +BA_ "FrameRouting" BO_ 132 ""; +BA_ "FrameGatewayNetwork" BO_ 132 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 132 132; +BA_ "VFrameFormat" BO_ 132 14; +BA_ "FrameRouting" BO_ 1990 ""; +BA_ "NetworkInitialization" BO_ 1990 0; +BA_ "GenMsgDelayTime" BO_ 1990 0; +BA_ "GenMsgSendType" BO_ 1990 1; +BA_ "DiagRequest" BO_ 1990 1; +BA_ "GenMsgILSupport" BO_ 1990 0; +BA_ "VFrameFormat" BO_ 1990 14; +BA_ "FrameRouting" BO_ 1892 ""; +BA_ "NetworkInitialization" BO_ 1892 0; +BA_ "GenMsgDelayTime" BO_ 1892 0; +BA_ "GenMsgSendType" BO_ 1892 1; +BA_ "DiagRequest" BO_ 1892 1; +BA_ "GenMsgILSupport" BO_ 1892 0; +BA_ "VFrameFormat" BO_ 1892 14; +BA_ "FrameRouting" BO_ 1798 ""; +BA_ "NetworkInitialization" BO_ 1798 0; +BA_ "GenMsgDelayTime" BO_ 1798 0; +BA_ "GenMsgSendType" BO_ 1798 1; +BA_ "DiagRequest" BO_ 1798 1; +BA_ "GenMsgILSupport" BO_ 1798 0; +BA_ "VFrameFormat" BO_ 1798 14; +BA_ "FrameRouting" BO_ 1123 ""; +BA_ "FrameGatewayNetwork" BO_ 1123 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 1123 1123; +BA_ "VFrameFormat" BO_ 1123 14; +BA_ "FrameRouting" BO_ 1122 ""; +BA_ "FrameGatewayNetwork" BO_ 1122 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 1122 1122; +BA_ "VFrameFormat" BO_ 1122 14; +BA_ "FrameRouting" BO_ 1003 ""; +BA_ "FrameGatewayNetwork" BO_ 1003 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 1003 1003; +BA_ "VFrameFormat" BO_ 1003 14; +BA_ "FrameRouting" BO_ 994 ""; +BA_ "FrameGatewayNetwork" BO_ 994 "HS3_CAN"; +BA_ "FrameGatewayId" BO_ 994 994; +BA_ "VFrameFormat" BO_ 994 14; +BA_ "FrameRouting" BO_ 778 ""; +BA_ "FrameGatewayId" BO_ 778 778; +BA_ "FrameGatewayNetwork" BO_ 778 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 778 14; +BA_ "FrameRouting" BO_ 549 ""; +BA_ "FrameGatewayId" BO_ 549 549; +BA_ "FrameGatewayNetwork" BO_ 549 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 549 14; +BA_ "FrameRouting" BO_ 551 ""; +BA_ "FrameGatewayId" BO_ 551 551; +BA_ "FrameGatewayNetwork" BO_ 551 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 551 14; +BA_ "FrameRouting" BO_ 1010 ""; +BA_ "GenMsgCycleTime" BO_ 1010 50; +BA_ "GenMsgSendType" BO_ 1010 0; +BA_ "VFrameFormat" BO_ 1010 14; +BA_ "FrameRouting" BO_ 1070 ""; +BA_ "FrameGatewayNetwork" BO_ 1070 "HS1_CAN"; +BA_ "FrameGatewayId" BO_ 1070 1070; +BA_ "VFrameFormat" BO_ 1070 14; +BA_ "FrameRouting" BO_ 1186 ""; +BA_ "GenMsgSendType" BO_ 1186 0; +BA_ "GenMsgCycleTime" BO_ 1186 100; +BA_ "VFrameFormat" BO_ 1186 14; +BA_ "FrameRouting" BO_ 611 ""; +BA_ "GenMsgSendType" BO_ 611 0; +BA_ "GenMsgCycleTime" BO_ 611 100; +BA_ "VFrameFormat" BO_ 611 14; +BA_ "FrameRouting" BO_ 1461 ""; +BA_ "GenMsgILSupport" BO_ 1461 0; +BA_ "NmAsrMessage" BO_ 1461 1; +BA_ "GenMsgSendType" BO_ 1461 0; +BA_ "GenMsgCycleTime" BO_ 1461 1000; +BA_ "NetworkInitialization" BO_ 1461 0; +BA_ "VFrameFormat" BO_ 1461 14; +BA_ "FrameRouting" BO_ 1047 ""; +BA_ "GenMsgSendType" BO_ 1047 5; +BA_ "GenMsgCycleTime" BO_ 1047 1000; +BA_ "VFrameFormat" BO_ 1047 14; +BA_ "FrameRouting" BO_ 972 ""; +BA_ "GenMsgSendType" BO_ 972 0; +BA_ "GenMsgCycleTime" BO_ 972 30; +BA_ "GenMsgDelayTime" BO_ 972 10; +BA_ "VFrameFormat" BO_ 972 14; +BA_ "FrameRouting" BO_ 130 ""; +BA_ "GenMsgSendType" BO_ 130 0; +BA_ "GenMsgCycleTime" BO_ 130 20; +BA_ "GenMsgDelayTime" BO_ 130 10; +BA_ "VFrameFormat" BO_ 130 14; +BA_ "FrameRouting" BO_ 126 ""; +BA_ "GenMsgSendType" BO_ 126 0; +BA_ "GenMsgCycleTime" BO_ 126 10; +BA_ "GenMsgDelayTime" BO_ 126 0; +BA_ "VFrameFormat" BO_ 126 14; +BA_ "FrameRouting" BO_ 133 ""; +BA_ "GenMsgSendType" BO_ 133 0; +BA_ "GenMsgCycleTime" BO_ 133 10; +BA_ "GenMsgDelayTime" BO_ 133 0; +BA_ "VFrameFormat" BO_ 133 14; +BA_ "FrameRouting" BO_ 1430 ""; +BA_ "GenMsgILSupport" BO_ 1430 0; +BA_ "NmAsrMessage" BO_ 1430 1; +BA_ "GenMsgSendType" BO_ 1430 0; +BA_ "GenMsgCycleTime" BO_ 1430 1000; +BA_ "NetworkInitialization" BO_ 1430 0; +BA_ "VFrameFormat" BO_ 1430 14; +BA_ "FrameRouting" BO_ 1200 ""; +BA_ "GenMsgSendType" BO_ 1200 0; +BA_ "GenMsgCycleTime" BO_ 1200 20; +BA_ "GenMsgDelayTime" BO_ 1200 10; +BA_ "VFrameFormat" BO_ 1200 14; +BA_ "FrameRouting" BO_ 1102 ""; +BA_ "GenMsgSendType" BO_ 1102 5; +BA_ "GenMsgCycleTime" BO_ 1102 100000; +BA_ "GenMsgStartDelayTime" BO_ 1102 1130; +BA_ "VFrameFormat" BO_ 1102 14; +BA_ "FrameRouting" BO_ 1056 ""; +BA_ "GenMsgSendType" BO_ 1056 5; +BA_ "GenMsgCycleTime" BO_ 1056 1000; +BA_ "VFrameFormat" BO_ 1056 14; +BA_ "FrameRouting" BO_ 1054 ""; +BA_ "GenMsgSendType" BO_ 1054 5; +BA_ "GenMsgCycleTime" BO_ 1054 1000; +BA_ "VFrameFormat" BO_ 1054 14; +BA_ "FrameRouting" BO_ 1046 ""; +BA_ "GenMsgSendType" BO_ 1046 0; +BA_ "GenMsgCycleTime" BO_ 1046 100; +BA_ "VFrameFormat" BO_ 1046 14; +BA_ "FrameRouting" BO_ 1045 ""; +BA_ "GenMsgSendType" BO_ 1045 0; +BA_ "GenMsgCycleTime" BO_ 1045 20; +BA_ "GenMsgDelayTime" BO_ 1045 10; +BA_ "VFrameFormat" BO_ 1045 14; +BA_ "FrameRouting" BO_ 1044 ""; +BA_ "GenMsgSendType" BO_ 1044 0; +BA_ "GenMsgCycleTime" BO_ 1044 100; +BA_ "VFrameFormat" BO_ 1044 14; +BA_ "FrameRouting" BO_ 1042 ""; +BA_ "GenMsgSendType" BO_ 1042 0; +BA_ "GenMsgCycleTime" BO_ 1042 50; +BA_ "VFrameFormat" BO_ 1042 14; +BA_ "FrameRouting" BO_ 535 ""; +BA_ "GenMsgSendType" BO_ 535 0; +BA_ "GenMsgCycleTime" BO_ 535 10; +BA_ "GenMsgDelayTime" BO_ 535 0; +BA_ "VFrameFormat" BO_ 535 14; +BA_ "FrameRouting" BO_ 534 ""; +BA_ "GenMsgSendType" BO_ 534 0; +BA_ "GenMsgCycleTime" BO_ 534 20; +BA_ "GenMsgDelayTime" BO_ 534 10; +BA_ "VFrameFormat" BO_ 534 14; +BA_ "FrameRouting" BO_ 532 ""; +BA_ "GenMsgSendType" BO_ 532 0; +BA_ "GenMsgCycleTime" BO_ 532 20; +BA_ "GenMsgDelayTime" BO_ 532 10; +BA_ "VFrameFormat" BO_ 532 14; +BA_ "FrameRouting" BO_ 531 ""; +BA_ "GenMsgSendType" BO_ 531 0; +BA_ "GenMsgCycleTime" BO_ 531 20; +BA_ "GenMsgDelayTime" BO_ 531 10; +BA_ "VFrameFormat" BO_ 531 14; +BA_ "FrameRouting" BO_ 136 ""; +BA_ "GenMsgSendType" BO_ 136 0; +BA_ "GenMsgCycleTime" BO_ 136 10; +BA_ "GenMsgDelayTime" BO_ 136 0; +BA_ "VFrameFormat" BO_ 136 14; +BA_ "FrameRouting" BO_ 125 ""; +BA_ "GenMsgSendType" BO_ 125 0; +BA_ "GenMsgCycleTime" BO_ 125 20; +BA_ "GenMsgDelayTime" BO_ 125 10; +BA_ "VFrameFormat" BO_ 125 14; +BA_ "FrameRouting" BO_ 119 ""; +BA_ "GenMsgSendType" BO_ 119 0; +BA_ "GenMsgCycleTime" BO_ 119 20; +BA_ "GenMsgDelayTime" BO_ 119 10; +BA_ "VFrameFormat" BO_ 119 14; +BA_ "FrameRouting" BO_ 118 ""; +BA_ "GenMsgSendType" BO_ 118 5; +BA_ "GenMsgCycleTime" BO_ 118 500; +BA_ "VFrameFormat" BO_ 118 14; +BA_ "FrameRouting" BO_ 73 ""; +BA_ "GenMsgSendType" BO_ 73 0; +BA_ "GenMsgCycleTime" BO_ 73 20; +BA_ "GenMsgDelayTime" BO_ 73 10; +BA_ "VFrameFormat" BO_ 73 14; +BA_ "FrameRouting" BO_ 1034 ""; +BA_ "FrameGatewayId" BO_ 1034 1034; +BA_ "FrameGatewayNetwork" BO_ 1034 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 1034 14; +BA_ "FrameRouting" BO_ 1440 ""; +BA_ "GenMsgILSupport" BO_ 1440 0; +BA_ "NmAsrMessage" BO_ 1440 1; +BA_ "GenMsgSendType" BO_ 1440 0; +BA_ "GenMsgCycleTime" BO_ 1440 1000; +BA_ "NetworkInitialization" BO_ 1440 0; +BA_ "VFrameFormat" BO_ 1440 14; +BA_ "FrameRouting" BO_ 561 ""; +BA_ "GenMsgSendType" BO_ 561 0; +BA_ "GenMsgCycleTime" BO_ 561 100; +BA_ "VFrameFormat" BO_ 561 14; +BA_ "FrameRouting" BO_ 330 ""; +BA_ "GenMsgSendType" BO_ 330 0; +BA_ "GenMsgCycleTime" BO_ 330 10; +BA_ "GenMsgDelayTime" BO_ 330 0; +BA_ "VFrameFormat" BO_ 330 14; +BA_ "FrameRouting" BO_ 1090 ""; +BA_ "GenMsgSendType" BO_ 1090 0; +BA_ "GenMsgCycleTime" BO_ 1090 1000; +BA_ "VFrameFormat" BO_ 1090 14; +BA_ "FrameRouting" BO_ 870 ""; +BA_ "GenMsgSendType" BO_ 870 0; +BA_ "GenMsgCycleTime" BO_ 870 100; +BA_ "VFrameFormat" BO_ 870 14; +BA_ "FrameRouting" BO_ 869 ""; +BA_ "GenMsgSendType" BO_ 869 0; +BA_ "GenMsgCycleTime" BO_ 869 100; +BA_ "VFrameFormat" BO_ 869 14; +BA_ "FrameRouting" BO_ 606 ""; +BA_ "GenMsgSendType" BO_ 606 5; +BA_ "GenMsgCycleTime" BO_ 606 1000; +BA_ "VFrameFormat" BO_ 606 14; +BA_ "FrameRouting" BO_ 374 ""; +BA_ "GenMsgSendType" BO_ 374 5; +BA_ "GenMsgCycleTime" BO_ 374 100; +BA_ "VFrameFormat" BO_ 374 14; +BA_ "FrameRouting" BO_ 603 ""; +BA_ "GenMsgSendType" BO_ 603 0; +BA_ "GenMsgCycleTime" BO_ 603 20; +BA_ "GenMsgDelayTime" BO_ 603 10; +BA_ "VFrameFormat" BO_ 603 14; +BA_ "FrameRouting" BO_ 602 ""; +BA_ "GenMsgSendType" BO_ 602 0; +BA_ "GenMsgCycleTime" BO_ 602 100; +BA_ "VFrameFormat" BO_ 602 14; +BA_ "FrameRouting" BO_ 1152 ""; +BA_ "GenMsgSendType" BO_ 1152 5; +BA_ "GenMsgCycleTime" BO_ 1152 1000; +BA_ "VFrameFormat" BO_ 1152 14; +BA_ "FrameRouting" BO_ 872 ""; +BA_ "GenMsgSendType" BO_ 872 0; +BA_ "GenMsgCycleTime" BO_ 872 100; +BA_ "VFrameFormat" BO_ 872 14; +BA_ "FrameRouting" BO_ 560 ""; +BA_ "GenMsgSendType" BO_ 560 0; +BA_ "GenMsgCycleTime" BO_ 560 20; +BA_ "GenMsgDelayTime" BO_ 560 10; +BA_ "VFrameFormat" BO_ 560 14; +BA_ "FrameRouting" BO_ 369 ""; +BA_ "GenMsgSendType" BO_ 369 0; +BA_ "GenMsgCycleTime" BO_ 369 30; +BA_ "GenMsgDelayTime" BO_ 369 10; +BA_ "VFrameFormat" BO_ 369 14; +BA_ "FrameRouting" BO_ 92 ""; +BA_ "GenMsgSendType" BO_ 92 5; +BA_ "GenMsgCycleTime" BO_ 92 100; +BA_ "VFrameFormat" BO_ 92 14; +BA_ "FrameRouting" BO_ 2030 ""; +BA_ "GenMsgILSupport" BO_ 2030 0; +BA_ "DiagResponse" BO_ 2030 1; +BA_ "GenMsgSendType" BO_ 2030 1; +BA_ "GenMsgDelayTime" BO_ 2030 0; +BA_ "NetworkInitialization" BO_ 2030 0; +BA_ "VFrameFormat" BO_ 2030 14; +BA_ "FrameRouting" BO_ 1087 ""; +BA_ "GenMsgSendType" BO_ 1087 0; +BA_ "GenMsgCycleTime" BO_ 1087 100; +BA_ "VFrameFormat" BO_ 1087 14; +BA_ "FrameRouting" BO_ 332 ""; +BA_ "GenMsgSendType" BO_ 332 0; +BA_ "GenMsgCycleTime" BO_ 332 200; +BA_ "VFrameFormat" BO_ 332 14; +BA_ "FrameRouting" BO_ 1896 ""; +BA_ "GenMsgILSupport" BO_ 1896 0; +BA_ "DiagResponse" BO_ 1896 1; +BA_ "GenMsgSendType" BO_ 1896 1; +BA_ "GenMsgDelayTime" BO_ 1896 0; +BA_ "NetworkInitialization" BO_ 1896 0; +BA_ "VFrameFormat" BO_ 1896 14; +BA_ "FrameRouting" BO_ 1889 ""; +BA_ "GenMsgILSupport" BO_ 1889 0; +BA_ "DiagRequest" BO_ 1889 1; +BA_ "GenMsgSendType" BO_ 1889 1; +BA_ "GenMsgDelayTime" BO_ 1889 0; +BA_ "NetworkInitialization" BO_ 1889 0; +BA_ "VFrameFormat" BO_ 1889 14; +BA_ "FrameRouting" BO_ 1888 ""; +BA_ "GenMsgILSupport" BO_ 1888 0; +BA_ "DiagRequest" BO_ 1888 1; +BA_ "GenMsgSendType" BO_ 1888 1; +BA_ "GenMsgDelayTime" BO_ 1888 0; +BA_ "NetworkInitialization" BO_ 1888 0; +BA_ "VFrameFormat" BO_ 1888 14; +BA_ "FrameRouting" BO_ 1848 ""; +BA_ "GenMsgILSupport" BO_ 1848 0; +BA_ "DiagResponse" BO_ 1848 1; +BA_ "GenMsgSendType" BO_ 1848 1; +BA_ "GenMsgDelayTime" BO_ 1848 0; +BA_ "NetworkInitialization" BO_ 1848 0; +BA_ "VFrameFormat" BO_ 1848 14; +BA_ "FrameRouting" BO_ 1840 ""; +BA_ "GenMsgILSupport" BO_ 1840 0; +BA_ "DiagRequest" BO_ 1840 1; +BA_ "GenMsgSendType" BO_ 1840 1; +BA_ "GenMsgDelayTime" BO_ 1840 0; +BA_ "NetworkInitialization" BO_ 1840 0; +BA_ "VFrameFormat" BO_ 1840 14; +BA_ "FrameRouting" BO_ 1713 ""; +BA_ "GenMsgILSupport" BO_ 1713 0; +BA_ "TpApplType" BO_ 1713 "DiagUUDTResponse"; +BA_ "GenMsgSendType" BO_ 1713 1; +BA_ "NetworkInitialization" BO_ 1713 0; +BA_ "VFrameFormat" BO_ 1713 14; +BA_ "FrameRouting" BO_ 1712 ""; +BA_ "GenMsgILSupport" BO_ 1712 0; +BA_ "TpApplType" BO_ 1712 "DiagUUDTResponse"; +BA_ "GenMsgSendType" BO_ 1712 1; +BA_ "NetworkInitialization" BO_ 1712 0; +BA_ "VFrameFormat" BO_ 1712 14; +BA_ "FrameRouting" BO_ 2025 ""; +BA_ "GenMsgILSupport" BO_ 2025 0; +BA_ "DiagResponse" BO_ 2025 1; +BA_ "GenMsgSendType" BO_ 2025 1; +BA_ "GenMsgDelayTime" BO_ 2025 0; +BA_ "NetworkInitialization" BO_ 2025 0; +BA_ "VFrameFormat" BO_ 2025 14; +BA_ "FrameRouting" BO_ 2024 ""; +BA_ "GenMsgILSupport" BO_ 2024 0; +BA_ "DiagResponse" BO_ 2024 1; +BA_ "GenMsgSendType" BO_ 2024 1; +BA_ "GenMsgDelayTime" BO_ 2024 0; +BA_ "NetworkInitialization" BO_ 2024 0; +BA_ "VFrameFormat" BO_ 2024 14; +BA_ "FrameRouting" BO_ 2017 ""; +BA_ "GenMsgILSupport" BO_ 2017 0; +BA_ "DiagRequest" BO_ 2017 1; +BA_ "GenMsgSendType" BO_ 2017 1; +BA_ "GenMsgDelayTime" BO_ 2017 0; +BA_ "NetworkInitialization" BO_ 2017 0; +BA_ "VFrameFormat" BO_ 2017 14; +BA_ "FrameRouting" BO_ 2016 ""; +BA_ "GenMsgILSupport" BO_ 2016 0; +BA_ "DiagRequest" BO_ 2016 1; +BA_ "GenMsgSendType" BO_ 2016 1; +BA_ "GenMsgDelayTime" BO_ 2016 0; +BA_ "NetworkInitialization" BO_ 2016 0; +BA_ "VFrameFormat" BO_ 2016 14; +BA_ "FrameRouting" BO_ 2015 ""; +BA_ "GenMsgILSupport" BO_ 2015 0; +BA_ "DiagState" BO_ 2015 1; +BA_ "GenMsgSendType" BO_ 2015 1; +BA_ "GenMsgDelayTime" BO_ 2015 0; +BA_ "NetworkInitialization" BO_ 2015 0; +BA_ "VFrameFormat" BO_ 2015 14; +BA_ "FrameRouting" BO_ 1897 ""; +BA_ "GenMsgILSupport" BO_ 1897 0; +BA_ "DiagResponse" BO_ 1897 1; +BA_ "GenMsgSendType" BO_ 1897 1; +BA_ "GenMsgDelayTime" BO_ 1897 0; +BA_ "NetworkInitialization" BO_ 1897 0; +BA_ "VFrameFormat" BO_ 1897 14; +BA_ "FrameRouting" BO_ 1814 ""; +BA_ "GenMsgILSupport" BO_ 1814 0; +BA_ "DiagRequest" BO_ 1814 1; +BA_ "GenMsgSendType" BO_ 1814 1; +BA_ "GenMsgDelayTime" BO_ 1814 0; +BA_ "NetworkInitialization" BO_ 1814 0; +BA_ "VFrameFormat" BO_ 1814 14; +BA_ "FrameRouting" BO_ 1701 ""; +BA_ "GenMsgILSupport" BO_ 1701 0; +BA_ "TpApplType" BO_ 1701 "DiagUUDTResponse"; +BA_ "GenMsgSendType" BO_ 1701 1; +BA_ "NetworkInitialization" BO_ 1701 0; +BA_ "VFrameFormat" BO_ 1701 14; +BA_ "FrameRouting" BO_ 1700 ""; +BA_ "GenMsgILSupport" BO_ 1700 0; +BA_ "TpApplType" BO_ 1700 "DiagUUDTResponse"; +BA_ "GenMsgSendType" BO_ 1700 1; +BA_ "NetworkInitialization" BO_ 1700 0; +BA_ "VFrameFormat" BO_ 1700 14; +BA_ "FrameRouting" BO_ 1697 ""; +BA_ "GenMsgILSupport" BO_ 1697 0; +BA_ "TpApplType" BO_ 1697 "DiagUUDTResponse"; +BA_ "GenMsgSendType" BO_ 1697 1; +BA_ "NetworkInitialization" BO_ 1697 0; +BA_ "VFrameFormat" BO_ 1697 14; +BA_ "FrameRouting" BO_ 1696 ""; +BA_ "GenMsgILSupport" BO_ 1696 0; +BA_ "TpApplType" BO_ 1696 "DiagUUDTResponse"; +BA_ "GenMsgSendType" BO_ 1696 1; +BA_ "NetworkInitialization" BO_ 1696 0; +BA_ "VFrameFormat" BO_ 1696 14; +BA_ "FrameRouting" BO_ 1429 ""; +BA_ "GenMsgILSupport" BO_ 1429 0; +BA_ "NmAsrMessage" BO_ 1429 1; +BA_ "GenMsgSendType" BO_ 1429 0; +BA_ "GenMsgCycleTime" BO_ 1429 1000; +BA_ "NetworkInitialization" BO_ 1429 0; +BA_ "VFrameFormat" BO_ 1429 14; +BA_ "FrameRouting" BO_ 1100 ""; +BA_ "GenMsgSendType" BO_ 1100 0; +BA_ "GenMsgCycleTime" BO_ 1100 100; +BA_ "VFrameFormat" BO_ 1100 14; +BA_ "FrameRouting" BO_ 1098 ""; +BA_ "GenMsgSendType" BO_ 1098 5; +BA_ "GenMsgCycleTime" BO_ 1098 500; +BA_ "VFrameFormat" BO_ 1098 14; +BA_ "FrameRouting" BO_ 1086 ""; +BA_ "GenMsgSendType" BO_ 1086 0; +BA_ "GenMsgCycleTime" BO_ 1086 100; +BA_ "VFrameFormat" BO_ 1086 14; +BA_ "FrameRouting" BO_ 1071 ""; +BA_ "GenMsgSendType" BO_ 1071 0; +BA_ "GenMsgCycleTime" BO_ 1071 100; +BA_ "VFrameFormat" BO_ 1071 14; +BA_ "FrameRouting" BO_ 1069 ""; +BA_ "GenMsgSendType" BO_ 1069 0; +BA_ "GenMsgCycleTime" BO_ 1069 100; +BA_ "VFrameFormat" BO_ 1069 14; +BA_ "FrameRouting" BO_ 1060 ""; +BA_ "GenMsgSendType" BO_ 1060 0; +BA_ "GenMsgCycleTime" BO_ 1060 100; +BA_ "VFrameFormat" BO_ 1060 14; +BA_ "FrameRouting" BO_ 1057 ""; +BA_ "GenMsgSendType" BO_ 1057 0; +BA_ "GenMsgCycleTime" BO_ 1057 100; +BA_ "VFrameFormat" BO_ 1057 14; +BA_ "FrameRouting" BO_ 1055 ""; +BA_ "GenMsgSendType" BO_ 1055 0; +BA_ "GenMsgCycleTime" BO_ 1055 100; +BA_ "VFrameFormat" BO_ 1055 14; +BA_ "FrameRouting" BO_ 562 ""; +BA_ "GenMsgSendType" BO_ 562 0; +BA_ "GenMsgCycleTime" BO_ 562 100; +BA_ "VFrameFormat" BO_ 562 14; +BA_ "FrameRouting" BO_ 523 ""; +BA_ "GenMsgSendType" BO_ 523 0; +BA_ "GenMsgCycleTime" BO_ 523 1000; +BA_ "VFrameFormat" BO_ 523 14; +BA_ "FrameRouting" BO_ 517 ""; +BA_ "GenMsgSendType" BO_ 517 0; +BA_ "GenMsgCycleTime" BO_ 517 20; +BA_ "GenMsgDelayTime" BO_ 517 10; +BA_ "VFrameFormat" BO_ 517 14; +BA_ "FrameRouting" BO_ 516 ""; +BA_ "GenMsgSendType" BO_ 516 0; +BA_ "GenMsgCycleTime" BO_ 516 10; +BA_ "GenMsgDelayTime" BO_ 516 0; +BA_ "VFrameFormat" BO_ 516 14; +BA_ "FrameRouting" BO_ 514 ""; +BA_ "GenMsgSendType" BO_ 514 0; +BA_ "GenMsgCycleTime" BO_ 514 20; +BA_ "GenMsgDelayTime" BO_ 514 10; +BA_ "VFrameFormat" BO_ 514 14; +BA_ "FrameRouting" BO_ 512 ""; +BA_ "GenMsgSendType" BO_ 512 0; +BA_ "GenMsgCycleTime" BO_ 512 20; +BA_ "GenMsgDelayTime" BO_ 512 10; +BA_ "VFrameFormat" BO_ 512 14; +BA_ "FrameRouting" BO_ 381 ""; +BA_ "GenMsgSendType" BO_ 381 0; +BA_ "GenMsgCycleTime" BO_ 381 100; +BA_ "VFrameFormat" BO_ 381 14; +BA_ "FrameRouting" BO_ 380 ""; +BA_ "GenMsgSendType" BO_ 380 0; +BA_ "GenMsgCycleTime" BO_ 380 100; +BA_ "VFrameFormat" BO_ 380 14; +BA_ "FrameRouting" BO_ 377 ""; +BA_ "GenMsgSendType" BO_ 377 0; +BA_ "GenMsgCycleTime" BO_ 377 100; +BA_ "VFrameFormat" BO_ 377 14; +BA_ "FrameRouting" BO_ 376 ""; +BA_ "GenMsgSendType" BO_ 376 0; +BA_ "GenMsgCycleTime" BO_ 376 100; +BA_ "VFrameFormat" BO_ 376 14; +BA_ "FrameRouting" BO_ 373 ""; +BA_ "GenMsgSendType" BO_ 373 0; +BA_ "GenMsgCycleTime" BO_ 373 20; +BA_ "GenMsgDelayTime" BO_ 373 10; +BA_ "VFrameFormat" BO_ 373 14; +BA_ "FrameRouting" BO_ 359 ""; +BA_ "GenMsgSendType" BO_ 359 0; +BA_ "GenMsgCycleTime" BO_ 359 10; +BA_ "GenMsgDelayTime" BO_ 359 0; +BA_ "VFrameFormat" BO_ 359 14; +BA_ "FrameRouting" BO_ 358 ""; +BA_ "GenMsgSendType" BO_ 358 0; +BA_ "GenMsgCycleTime" BO_ 358 100; +BA_ "VFrameFormat" BO_ 358 14; +BA_ "FrameRouting" BO_ 357 ""; +BA_ "GenMsgSendType" BO_ 357 0; +BA_ "GenMsgCycleTime" BO_ 357 20; +BA_ "GenMsgDelayTime" BO_ 357 10; +BA_ "VFrameFormat" BO_ 357 14; +BA_ "FrameRouting" BO_ 355 ""; +BA_ "GenMsgSendType" BO_ 355 0; +BA_ "GenMsgCycleTime" BO_ 355 100; +BA_ "VFrameFormat" BO_ 355 14; +BA_ "FrameRouting" BO_ 342 ""; +BA_ "GenMsgSendType" BO_ 342 0; +BA_ "GenMsgCycleTime" BO_ 342 100; +BA_ "VFrameFormat" BO_ 342 14; +BA_ "FrameRouting" BO_ 71 ""; +BA_ "GenMsgSendType" BO_ 71 0; +BA_ "GenMsgCycleTime" BO_ 71 20; +BA_ "GenMsgDelayTime" BO_ 71 10; +BA_ "VFrameFormat" BO_ 71 14; +BA_ "FrameRouting" BO_ 1822 ""; +BA_ "GenMsgILSupport" BO_ 1822 0; +BA_ "DiagResponse" BO_ 1822 1; +BA_ "GenMsgSendType" BO_ 1822 1; +BA_ "GenMsgDelayTime" BO_ 1822 0; +BA_ "NetworkInitialization" BO_ 1822 0; +BA_ "VFrameFormat" BO_ 1822 14; +BA_ "FrameRouting" BO_ 1438 ""; +BA_ "GenMsgILSupport" BO_ 1438 0; +BA_ "NmAsrMessage" BO_ 1438 1; +BA_ "GenMsgSendType" BO_ 1438 0; +BA_ "GenMsgCycleTime" BO_ 1438 1000; +BA_ "NetworkInitialization" BO_ 1438 0; +BA_ "VFrameFormat" BO_ 1438 14; +BA_ "FrameRouting" BO_ 954 ""; +BA_ "FrameGatewayId" BO_ 954 954; +BA_ "FrameGatewayNetwork" BO_ 954 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 954 14; +BA_ "FrameRouting" BO_ 1006 ""; +BA_ "GenMsgSendType" BO_ 1006 5; +BA_ "GenMsgCycleTime" BO_ 1006 1000; +BA_ "VFrameFormat" BO_ 1006 14; +BA_ "FrameRouting" BO_ 820 ""; +BA_ "FrameGatewayNetwork" BO_ 820 "HS2_CAN"; +BA_ "FrameGatewayId" BO_ 820 820; +BA_ "VFrameFormat" BO_ 820 14; +BA_ "FrameRouting" BO_ 137 ""; +BA_ "FrameGatewayId" BO_ 137 137; +BA_ "FrameGatewayNetwork" BO_ 137 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 137 14; +BA_ "FrameRouting" BO_ 129 ""; +BA_ "FrameGatewayId" BO_ 129 129; +BA_ "FrameGatewayNetwork" BO_ 129 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 129 14; +BA_ "FrameRouting" BO_ 935 ""; +BA_ "GenMsgSendType" BO_ 935 5; +BA_ "GenMsgCycleTime" BO_ 935 200; +BA_ "VFrameFormat" BO_ 935 14; +BA_ "FrameRouting" BO_ 1108 ""; +BA_ "FrameGatewayId" BO_ 1108 1108; +BA_ "FrameGatewayNetwork" BO_ 1108 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 1108 14; +BA_ "FrameRouting" BO_ 261 ""; +BA_ "FrameGatewayId" BO_ 261 261; +BA_ "FrameGatewayNetwork" BO_ 261 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 261 14; +BA_ "FrameRouting" BO_ 1146 ""; +BA_ "FrameGatewayId" BO_ 1146 1146; +BA_ "FrameGatewayNetwork" BO_ 1146 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 1146 14; +BA_ "FrameRouting" BO_ 533 ""; +BA_ "FrameGatewayId" BO_ 533 533; +BA_ "FrameGatewayNetwork" BO_ 533 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 533 14; +BA_ "FrameRouting" BO_ 1041 ""; +BA_ "FrameGatewayId" BO_ 1041 1041; +BA_ "FrameGatewayNetwork" BO_ 1041 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 1041 14; +BA_ "FrameRouting" BO_ 1067 ""; +BA_ "FrameGatewayId" BO_ 1067 1067; +BA_ "FrameGatewayNetwork" BO_ 1067 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 1067 14; +BA_ "FrameRouting" BO_ 1112 ""; +BA_ "FrameGatewayId" BO_ 1112 1112; +BA_ "FrameGatewayNetwork" BO_ 1112 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 1112 14; +BA_ "FrameRouting" BO_ 139 ""; +BA_ "FrameGatewayId" BO_ 139 139; +BA_ "FrameGatewayNetwork" BO_ 139 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 139 14; +BA_ "FrameRouting" BO_ 1121 ""; +BA_ "FrameGatewayId" BO_ 1121 1121; +BA_ "FrameGatewayNetwork" BO_ 1121 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 1121 14; +BA_ "FrameRouting" BO_ 1120 ""; +BA_ "FrameGatewayId" BO_ 1120 1120; +BA_ "FrameGatewayNetwork" BO_ 1120 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 1120 14; +BA_ "FrameRouting" BO_ 1050 ""; +BA_ "FrameGatewayId" BO_ 1050 1050; +BA_ "FrameGatewayNetwork" BO_ 1050 "MS1_CAN"; +BA_ "VFrameFormat" BO_ 1050 14; +BA_ "FrameRouting" BO_ 1137 ""; +BA_ "GenMsgSendType" BO_ 1137 0; +BA_ "GenMsgCycleTime" BO_ 1137 1000; +BA_ "VFrameFormat" BO_ 1137 14; +BA_ "FrameRouting" BO_ 1255 ""; +BA_ "GenMsgSendType" BO_ 1255 0; +BA_ "GenMsgCycleTime" BO_ 1255 1000; +BA_ "VFrameFormat" BO_ 1255 14; +BA_ "FrameRouting" BO_ 1254 ""; +BA_ "GenMsgSendType" BO_ 1254 0; +BA_ "GenMsgCycleTime" BO_ 1254 1000; +BA_ "VFrameFormat" BO_ 1254 14; +BA_ "FrameRouting" BO_ 1253 ""; +BA_ "GenMsgSendType" BO_ 1253 0; +BA_ "GenMsgCycleTime" BO_ 1253 1000; +BA_ "VFrameFormat" BO_ 1253 14; +BA_ "FrameRouting" BO_ 1252 ""; +BA_ "GenMsgSendType" BO_ 1252 0; +BA_ "GenMsgCycleTime" BO_ 1252 1000; +BA_ "VFrameFormat" BO_ 1252 14; +BA_ "FrameRouting" BO_ 1251 ""; +BA_ "GenMsgSendType" BO_ 1251 0; +BA_ "GenMsgCycleTime" BO_ 1251 1000; +BA_ "VFrameFormat" BO_ 1251 14; +BA_ "FrameRouting" BO_ 1250 ""; +BA_ "GenMsgSendType" BO_ 1250 0; +BA_ "GenMsgCycleTime" BO_ 1250 1000; +BA_ "VFrameFormat" BO_ 1250 14; +BA_ "FrameRouting" BO_ 1249 ""; +BA_ "GenMsgSendType" BO_ 1249 0; +BA_ "GenMsgCycleTime" BO_ 1249 1000; +BA_ "VFrameFormat" BO_ 1249 14; +BA_ "FrameRouting" BO_ 1248 ""; +BA_ "GenMsgSendType" BO_ 1248 0; +BA_ "GenMsgCycleTime" BO_ 1248 1000; +BA_ "VFrameFormat" BO_ 1248 14; +BA_ "FrameRouting" BO_ 1113 ""; +BA_ "GenMsgSendType" BO_ 1113 0; +BA_ "GenMsgCycleTime" BO_ 1113 50; +BA_ "VFrameFormat" BO_ 1113 14; +BA_ "FrameRouting" BO_ 1105 ""; +BA_ "GenMsgSendType" BO_ 1105 5; +BA_ "GenMsgCycleTime" BO_ 1105 1000; +BA_ "VFrameFormat" BO_ 1105 14; +BA_ "FrameRouting" BO_ 938 ""; +BA_ "GenMsgSendType" BO_ 938 5; +BA_ "GenMsgCycleTime" BO_ 938 200; +BA_ "VFrameFormat" BO_ 938 14; +BA_ "FrameRouting" BO_ 939 ""; +BA_ "GenMsgSendType" BO_ 939 5; +BA_ "GenMsgCycleTime" BO_ 939 200; +BA_ "VFrameFormat" BO_ 939 14; +BA_ "FrameRouting" BO_ 937 ""; +BA_ "GenMsgSendType" BO_ 937 0; +BA_ "GenMsgCycleTime" BO_ 937 20; +BA_ "GenMsgDelayTime" BO_ 937 10; +BA_ "VFrameFormat" BO_ 937 14; +BA_ "FrameRouting" BO_ 936 ""; +BA_ "GenMsgSendType" BO_ 936 0; +BA_ "GenMsgCycleTime" BO_ 936 20; +BA_ "GenMsgDelayTime" BO_ 936 10; +BA_ "VFrameFormat" BO_ 936 14; +BA_ "FrameRouting" BO_ 877 ""; +BA_ "GenMsgSendType" BO_ 877 5; +BA_ "GenMsgCycleTime" BO_ 877 1000; +BA_ "VFrameFormat" BO_ 877 14; +BA_ "FrameRouting" BO_ 589 ""; +BA_ "FrameGatewayId" BO_ 589 589; +BA_ "FrameGatewayNetwork" BO_ 589 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 589 14; +BA_ "FrameRouting" BO_ 588 ""; +BA_ "FrameGatewayId" BO_ 588 588; +BA_ "FrameGatewayNetwork" BO_ 588 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 588 14; +BA_ "FrameRouting" BO_ 587 ""; +BA_ "FrameGatewayId" BO_ 587 587; +BA_ "FrameGatewayNetwork" BO_ 587 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 587 14; +BA_ "FrameRouting" BO_ 389 ""; +BA_ "GenMsgSendType" BO_ 389 0; +BA_ "GenMsgCycleTime" BO_ 389 100; +BA_ "VFrameFormat" BO_ 389 14; +BA_ "FrameRouting" BO_ 1009 ""; +BA_ "FrameGatewayId" BO_ 1009 1009; +BA_ "FrameGatewayNetwork" BO_ 1009 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 1009 14; +BA_ "FrameRouting" BO_ 360 ""; +BA_ "FrameGatewayId" BO_ 360 360; +BA_ "FrameGatewayNetwork" BO_ 360 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 360 14; +BA_ "FrameRouting" BO_ 122 ""; +BA_ "FrameGatewayId" BO_ 122 122; +BA_ "FrameGatewayNetwork" BO_ 122 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 122 14; +BA_ "FrameRouting" BO_ 90 ""; +BA_ "FrameGatewayId" BO_ 90 90; +BA_ "FrameGatewayNetwork" BO_ 90 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 90 14; +BA_ "FrameRouting" BO_ 1091 ""; +BA_ "FrameGatewayId" BO_ 1091 1091; +BA_ "FrameGatewayNetwork" BO_ 1091 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 1091 14; +BA_ "FrameRouting" BO_ 138 ""; +BA_ "FrameGatewayId" BO_ 138 138; +BA_ "FrameGatewayNetwork" BO_ 138 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 138 14; +BA_ "FrameRouting" BO_ 131 ""; +BA_ "FrameGatewayId" BO_ 131 131; +BA_ "FrameGatewayNetwork" BO_ 131 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 131 14; +BA_ "FrameRouting" BO_ 787 ""; +BA_ "FrameGatewayId" BO_ 787 787; +BA_ "FrameGatewayNetwork" BO_ 787 "MS2_CAN"; +BA_ "VFrameFormat" BO_ 787 14; +BA_ "FrameRouting" BO_ 953 ""; +BA_ "FrameGatewayId" BO_ 953 953; +BA_ "FrameGatewayNetwork" BO_ 953 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 953 14; +BA_ "FrameRouting" BO_ 1093 ""; +BA_ "FrameGatewayId" BO_ 1093 1093; +BA_ "FrameGatewayNetwork" BO_ 1093 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 1093 14; +BA_ "FrameRouting" BO_ 792 ""; +BA_ "FrameGatewayId" BO_ 792 792; +BA_ "FrameGatewayNetwork" BO_ 792 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 792 14; +BA_ "FrameRouting" BO_ 968 ""; +BA_ "FrameGatewayId" BO_ 968 968; +BA_ "FrameGatewayNetwork" BO_ 968 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 968 14; +BA_ "FrameRouting" BO_ 819 ""; +BA_ "FrameGatewayId" BO_ 819 819; +BA_ "FrameGatewayNetwork" BO_ 819 "MS1_CAN"; +BA_ "VFrameFormat" BO_ 819 14; +BA_ "FrameRouting" BO_ 818 ""; +BA_ "FrameGatewayId" BO_ 818 818; +BA_ "FrameGatewayNetwork" BO_ 818 "MS1_CAN"; +BA_ "VFrameFormat" BO_ 818 14; +BA_ "FrameRouting" BO_ 806 ""; +BA_ "FrameGatewayId" BO_ 806 806; +BA_ "FrameGatewayNetwork" BO_ 806 "MS1_CAN"; +BA_ "VFrameFormat" BO_ 806 14; +BA_ "FrameRouting" BO_ 765 ""; +BA_ "FrameGatewayId" BO_ 765 765; +BA_ "FrameGatewayNetwork" BO_ 765 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 765 14; +BA_ "FrameRouting" BO_ 559 ""; +BA_ "FrameGatewayId" BO_ 559 559; +BA_ "FrameGatewayNetwork" BO_ 559 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 559 14; +BA_ "FrameRouting" BO_ 558 ""; +BA_ "FrameGatewayId" BO_ 558 558; +BA_ "FrameGatewayNetwork" BO_ 558 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 558 14; +BA_ "FrameRouting" BO_ 934 ""; +BA_ "GenMsgSendType" BO_ 934 5; +BA_ "GenMsgCycleTime" BO_ 934 200; +BA_ "VFrameFormat" BO_ 934 14; +BA_ "FrameRouting" BO_ 1072 ""; +BA_ "FrameGatewayId" BO_ 1072 1072; +BA_ "FrameGatewayNetwork" BO_ 1072 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 1072 14; +BA_ "FrameRouting" BO_ 909 ""; +BA_ "FrameGatewayId" BO_ 909 909; +BA_ "FrameGatewayNetwork" BO_ 909 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 909 14; +BA_ "FrameRouting" BO_ 963 ""; +BA_ "FrameGatewayId" BO_ 963 963; +BA_ "FrameGatewayNetwork" BO_ 963 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 963 14; +BA_ "FrameRouting" BO_ 145 ""; +BA_ "FrameGatewayId" BO_ 145 145; +BA_ "FrameGatewayNetwork" BO_ 145 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 145 14; +BA_ "FrameRouting" BO_ 76 ""; +BA_ "FrameGatewayId" BO_ 76 76; +BA_ "FrameGatewayNetwork" BO_ 76 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 76 14; +BA_ "FrameRouting" BO_ 65 ""; +BA_ "DiagResponse" BO_ 65 0; +BA_ "FrameGatewayId" BO_ 65 65; +BA_ "FrameGatewayNetwork" BO_ 65 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 65 14; +BA_ "FrameRouting" BO_ 1076 ""; +BA_ "FrameGatewayId" BO_ 1076 1076; +BA_ "FrameGatewayNetwork" BO_ 1076 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 1076 14; +BA_ "FrameRouting" BO_ 862 ""; +BA_ "FrameGatewayId" BO_ 862 862; +BA_ "FrameGatewayNetwork" BO_ 862 "MS1_CAN"; +BA_ "VFrameFormat" BO_ 862 14; +BA_ "FrameRouting" BO_ 931 ""; +BA_ "FrameGatewayId" BO_ 931 931; +BA_ "FrameGatewayNetwork" BO_ 931 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 931 14; +BA_ "FrameRouting" BO_ 578 ""; +BA_ "FrameGatewayId" BO_ 578 578; +BA_ "FrameGatewayNetwork" BO_ 578 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 578 14; +BA_ "FrameRouting" BO_ 947 ""; +BA_ "FrameGatewayId" BO_ 947 947; +BA_ "FrameGatewayNetwork" BO_ 947 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 947 14; +BA_ "FrameRouting" BO_ 1084 ""; +BA_ "FrameGatewayId" BO_ 1084 1084; +BA_ "FrameGatewayNetwork" BO_ 1084 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 1084 14; +BA_ "FrameRouting" BO_ 1068 ""; +BA_ "FrameGatewayId" BO_ 1068 1068; +BA_ "FrameGatewayNetwork" BO_ 1068 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 1068 14; +BA_ "FrameRouting" BO_ 146 ""; +BA_ "FrameGatewayId" BO_ 146 146; +BA_ "FrameGatewayNetwork" BO_ 146 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 146 14; +BA_ "FrameRouting" BO_ 1900 ""; +BA_ "GenMsgILSupport" BO_ 1900 0; +BA_ "DiagResponse" BO_ 1900 1; +BA_ "GenMsgSendType" BO_ 1900 1; +BA_ "GenMsgDelayTime" BO_ 1900 0; +BA_ "NetworkInitialization" BO_ 1900 0; +BA_ "VFrameFormat" BO_ 1900 14; +BA_ "FrameRouting" BO_ 1806 ""; +BA_ "GenMsgILSupport" BO_ 1806 0; +BA_ "DiagResponse" BO_ 1806 1; +BA_ "GenMsgSendType" BO_ 1806 1; +BA_ "GenMsgDelayTime" BO_ 1806 0; +BA_ "NetworkInitialization" BO_ 1806 0; +BA_ "VFrameFormat" BO_ 1806 14; +BA_ "FrameRouting" BO_ 997 ""; +BA_ "GenMsgSendType" BO_ 997 5; +BA_ "GenMsgCycleTime" BO_ 997 1000; +BA_ "VFrameFormat" BO_ 997 14; +BA_ "FrameRouting" BO_ 983 ""; +BA_ "GenMsgSendType" BO_ 983 0; +BA_ "GenMsgCycleTime" BO_ 983 50; +BA_ "VFrameFormat" BO_ 983 14; +BA_ "FrameRouting" BO_ 980 ""; +BA_ "GenMsgSendType" BO_ 980 0; +BA_ "GenMsgCycleTime" BO_ 980 30; +BA_ "GenMsgDelayTime" BO_ 980 10; +BA_ "VFrameFormat" BO_ 980 14; +BA_ "FrameRouting" BO_ 979 ""; +BA_ "GenMsgSendType" BO_ 979 0; +BA_ "GenMsgCycleTime" BO_ 979 50; +BA_ "VFrameFormat" BO_ 979 14; +BA_ "FrameRouting" BO_ 976 ""; +BA_ "GenMsgSendType" BO_ 976 0; +BA_ "GenMsgCycleTime" BO_ 976 100; +BA_ "VFrameFormat" BO_ 976 14; +BA_ "FrameRouting" BO_ 973 ""; +BA_ "GenMsgSendType" BO_ 973 5; +BA_ "GenMsgCycleTime" BO_ 973 1000; +BA_ "VFrameFormat" BO_ 973 14; +BA_ "FrameRouting" BO_ 970 ""; +BA_ "GenMsgSendType" BO_ 970 0; +BA_ "GenMsgCycleTime" BO_ 970 30; +BA_ "GenMsgDelayTime" BO_ 970 10; +BA_ "VFrameFormat" BO_ 970 14; +BA_ "FrameRouting" BO_ 962 ""; +BA_ "GenMsgSendType" BO_ 962 5; +BA_ "GenMsgCycleTime" BO_ 962 1000; +BA_ "VFrameFormat" BO_ 962 14; +BA_ "FrameRouting" BO_ 961 ""; +BA_ "GenMsgSendType" BO_ 961 5; +BA_ "GenMsgCycleTime" BO_ 961 1000; +BA_ "VFrameFormat" BO_ 961 14; +BA_ "FrameRouting" BO_ 394 ""; +BA_ "GenMsgSendType" BO_ 394 5; +BA_ "GenMsgCycleTime" BO_ 394 200; +BA_ "VFrameFormat" BO_ 394 14; +BA_ "FrameRouting" BO_ 391 ""; +BA_ "GenMsgSendType" BO_ 391 0; +BA_ "GenMsgCycleTime" BO_ 391 20; +BA_ "GenMsgDelayTime" BO_ 391 10; +BA_ "VFrameFormat" BO_ 391 14; +BA_ "FrameRouting" BO_ 390 ""; +BA_ "GenMsgSendType" BO_ 390 0; +BA_ "GenMsgCycleTime" BO_ 390 20; +BA_ "GenMsgDelayTime" BO_ 390 10; +BA_ "VFrameFormat" BO_ 390 14; +BA_ "FrameRouting" BO_ 1441 ""; +BA_ "GenMsgILSupport" BO_ 1441 0; +BA_ "NmAsrMessage" BO_ 1441 1; +BA_ "GenMsgSendType" BO_ 1441 0; +BA_ "GenMsgCycleTime" BO_ 1441 1000; +BA_ "NetworkInitialization" BO_ 1441 0; +BA_ "VFrameFormat" BO_ 1441 14; +BA_ "FrameRouting" BO_ 1787 ""; +BA_ "GenMsgILSupport" BO_ 1787 0; +BA_ "DiagResponse" BO_ 1787 1; +BA_ "GenMsgSendType" BO_ 1787 1; +BA_ "GenMsgDelayTime" BO_ 1787 0; +BA_ "VFrameFormat" BO_ 1787 14; +BA_ "FrameRouting" BO_ 1779 ""; +BA_ "GenMsgILSupport" BO_ 1779 0; +BA_ "DiagRequest" BO_ 1779 1; +BA_ "GenMsgSendType" BO_ 1779 1; +BA_ "GenMsgDelayTime" BO_ 1779 0; +BA_ "VFrameFormat" BO_ 1779 14; +BA_ "FrameRouting" BO_ 1786 ""; +BA_ "GenMsgILSupport" BO_ 1786 0; +BA_ "DiagResponse" BO_ 1786 1; +BA_ "GenMsgSendType" BO_ 1786 1; +BA_ "GenMsgDelayTime" BO_ 1786 0; +BA_ "VFrameFormat" BO_ 1786 14; +BA_ "FrameRouting" BO_ 1778 ""; +BA_ "GenMsgILSupport" BO_ 1778 0; +BA_ "DiagRequest" BO_ 1778 1; +BA_ "GenMsgSendType" BO_ 1778 1; +BA_ "GenMsgDelayTime" BO_ 1778 0; +BA_ "VFrameFormat" BO_ 1778 14; +BA_ "FrameRouting" BO_ 1153 ""; +BA_ "FrameGatewayId" BO_ 1153 1152; +BA_ "FrameGatewayNetwork" BO_ 1153 "HS2_CAN"; +BA_ "VFrameFormat" BO_ 1153 14; +BA_ "FrameRouting" BO_ 942 ""; +BA_ "GenMsgSendType" BO_ 942 5; +BA_ "GenMsgCycleTime" BO_ 942 1000; +BA_ "VFrameFormat" BO_ 942 14; +BA_ "FrameRouting" BO_ 930 ""; +BA_ "GenMsgSendType" BO_ 930 5; +BA_ "GenMsgCycleTime" BO_ 930 1000; +BA_ "VFrameFormat" BO_ 930 14; +BA_ "FrameRouting" BO_ 929 ""; +BA_ "GenMsgSendType" BO_ 929 5; +BA_ "GenMsgCycleTime" BO_ 929 1000; +BA_ "VFrameFormat" BO_ 929 14; +BA_ "FrameRouting" BO_ 402 ""; +BA_ "FrameGatewayId" BO_ 402 402; +BA_ "FrameGatewayNetwork" BO_ 402 "HS3_CAN"; +BA_ "VFrameFormat" BO_ 402 14; +BA_ "FrameRouting" BO_ 924 ""; +BA_ "FrameGatewayId" BO_ 924 924; +BA_ "FrameGatewayNetwork" BO_ 924 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 924 14; +BA_ "FrameRouting" BO_ 923 ""; +BA_ "FrameGatewayId" BO_ 923 923; +BA_ "FrameGatewayNetwork" BO_ 923 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 923 14; +BA_ "FrameRouting" BO_ 1998 ""; +BA_ "GenMsgILSupport" BO_ 1998 0; +BA_ "DiagResponse" BO_ 1998 1; +BA_ "GenMsgSendType" BO_ 1998 1; +BA_ "GenMsgDelayTime" BO_ 1998 0; +BA_ "NetworkInitialization" BO_ 1998 0; +BA_ "VFrameFormat" BO_ 1998 14; +BA_ "FrameRouting" BO_ 1996 ""; +BA_ "GenMsgILSupport" BO_ 1996 0; +BA_ "DiagResponse" BO_ 1996 1; +BA_ "GenMsgSendType" BO_ 1996 1; +BA_ "GenMsgDelayTime" BO_ 1996 0; +BA_ "NetworkInitialization" BO_ 1996 0; +BA_ "VFrameFormat" BO_ 1996 14; +BA_ "FrameRouting" BO_ 1988 ""; +BA_ "GenMsgILSupport" BO_ 1988 0; +BA_ "DiagRequest" BO_ 1988 1; +BA_ "GenMsgSendType" BO_ 1988 1; +BA_ "GenMsgDelayTime" BO_ 1988 0; +BA_ "NetworkInitialization" BO_ 1988 0; +BA_ "VFrameFormat" BO_ 1988 14; +BA_ "FrameRouting" BO_ 922 ""; +BA_ "FrameGatewayId" BO_ 922 922; +BA_ "FrameGatewayNetwork" BO_ 922 "HS1_CAN"; +BA_ "VFrameFormat" BO_ 922 14; +BA_ "GenSigSendType" SG_ 823 DteVehPwId_No_Actl 3; +BA_ "ECGUsedRxSignal" SG_ 823 DteVehPwId_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 823 DteVehEId_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 823 DteVehEffId_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 823 DteVeh_Pw_Actl 1; +BA_ "GenSigStartValue" SG_ 823 DteVeh_Eff_Actl 100; +BA_ "ECGUsedRxSignal" SG_ 823 DteVeh_Eff_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 823 DteVeh_E_Actl 1; +BA_ "GenSigSendType" SG_ 823 DteAcceptNew_B_Rq 3; +BA_ "ECGUsedRxSignal" SG_ 823 DteAcceptNew_B_Rq 1; +BA_ "GenSigSendType" SG_ 824 DteCldTrlrOn_B_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldTrlrOn_B_Stat 1; +BA_ "GenSigSendType" SG_ 824 DteCldTrlrOff_B_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldTrlrOff_B_Stat 1; +BA_ "GenSigStartValue" SG_ 824 DteCldTrip_L_Actl 100; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldTrip_L_Actl 1; +BA_ "GenSigSendType" SG_ 824 DteCldTraffic_B_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldTraffic_B_Stat 1; +BA_ "GenSigSendType" SG_ 824 DteCldTerrain_B_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldTerrain_B_Stat 1; +BA_ "GenSigSendType" SG_ 824 DteCldRoute_B_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldRoute_B_Stat 1; +BA_ "GenSigSendType" SG_ 824 DteCldPayload_B_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldPayload_B_Stat 1; +BA_ "GenSigSendType" SG_ 824 DteCldId_No_Actl 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldId_No_Actl 1; +BA_ "GenSigSendType" SG_ 824 DteCldExtTe_B_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldExtTe_B_Stat 1; +BA_ "GenSigStartValue" SG_ 824 DteCldExt_Eff_Actl 100; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldExt_Eff_Actl 1; +BA_ "GenSigStartValue" SG_ 824 DteCldDrv_Eff_Actl 100; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldDrv_Eff_Actl 1; +BA_ "GenSigSendType" SG_ 824 DteCldDcac_B_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldDcac_B_Stat 1; +BA_ "GenSigStartValue" SG_ 824 DteCldClimt_Eff_Actl 100; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldClimt_Eff_Actl 1; +BA_ "GenSigStartValue" SG_ 824 DteCldBattULo_Eff_Actl 100; +BA_ "ECGUsedTxSignal" SG_ 824 DteCldBattULo_Eff_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 949 Tire_Press_RR_ORR_Data 65533; +BA_ "GenSigStartValue" SG_ 949 Tire_Press_RR_ORR_Data 65533; +BA_ "GenSigStartValueInteger" SG_ 949 Tire_Press_LR_OLR_Data 65533; +BA_ "GenSigStartValue" SG_ 949 Tire_Press_LR_OLR_Data 65533; +BA_ "GenSigStartValueInteger" SG_ 949 Tire_Press_LF_Data 65533; +BA_ "GenSigStartValue" SG_ 949 Tire_Press_LF_Data 65533; +BA_ "GenSigStartValueInteger" SG_ 949 Tire_Press_RF_Data 65533; +BA_ "GenSigStartValue" SG_ 949 Tire_Press_RF_Data 65533; +BA_ "GenSigSendType" SG_ 1825 TesterPhysicalReqVDM 3; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1; +BA_ "MetaData" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1; +BA_ "ContentDependant" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 524 PrplWhlTot_Tq_RqMxAwd 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 524 PrplWhlTot_Tq_RqMxAwd 1; +BA_ "GenSigStartValue" SG_ 524 PrplWhlTot_Tq_RqMxAwd 65535; +BA_ "GenSigStartValueInteger" SG_ 524 PrplWhlTot_Tq_RqMxAwd 65535; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1; +BA_ "MetaData" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1; +BA_ "ContentDependant" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 524 PrplWhlTotTqRqMxAwd_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 740 BattAuxCnnct_B_Cmd 1; +BA_ "GenSigSendType" SG_ 1160 DgtlCommPncReset_B_Req 3; +BA_ "ECGUsedTxSignal" SG_ 1160 DgtlCommPncReset_B_Req 1; +BA_ "ECGUsedTxSignal" SG_ 1160 DataMntrSustn_B_Rq 1; +BA_ "GenSigSendType" SG_ 1160 DataMntrSustn_B_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 1160 PwSustnRdata_B_RqTelem 1; +BA_ "GenSigSendType" SG_ 1160 PwSustnRdata_B_RqTelem 3; +BA_ "ECGUsedTxSignal" SG_ 776 ScMnSoc_Pc_RqCld 1; +BA_ "GenSigStartValue" SG_ 776 ScMnSoc_Pc_RqCld 100; +BA_ "GenSigSendType" SG_ 776 ScMnSoc_Pc_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 776 ScChrgrPwMax_Pw_RqCld 1; +BA_ "GenSigSendType" SG_ 776 ScChrgrPwMax_Pw_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 776 ScLocPwId_No_RqCld 1; +BA_ "GenSigSendType" SG_ 776 ScLocPwId_No_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 776 PrcondEdit_D_RqCld 1; +BA_ "GenSigSendType" SG_ 776 PrcondEdit_D_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 776 GoTEditMnte_T_RqCld 1; +BA_ "GenSigStartValue" SG_ 776 GoTEditMnte_T_RqCld 14; +BA_ "GenSigSendType" SG_ 776 GoTEditMnte_T_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 776 GoTEditHr_T_RqCld 1; +BA_ "GenSigStartValue" SG_ 776 GoTEditHr_T_RqCld 30; +BA_ "GenSigSendType" SG_ 776 GoTEditHr_T_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 776 ChrgToPcEdit_Pc_RqCld 1; +BA_ "GenSigStartValue" SG_ 776 ChrgToPcEdit_Pc_RqCld 126; +BA_ "GenSigSendType" SG_ 776 ChrgToPcEdit_Pc_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 776 AirAmb_Te_ActlCld 1; +BA_ "GenSigStartValueInteger" SG_ 776 AirAmb_Te_ActlCld 512; +BA_ "UsedOnPgmDBC" SG_ 776 AirAmb_Te_ActlCld 1; +BA_ "GenSigSendType" SG_ 776 AirAmb_Te_ActlCld 3; +BA_ "ECGUsedTxSignal" SG_ 776 ScFreshDataEnbl_B_Rq 1; +BA_ "GenSigSendType" SG_ 776 ScFreshDataEnbl_B_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 776 ScEnbl_D_RqCld 1; +BA_ "GenSigStartValue" SG_ 776 ScEnbl_D_RqCld 1; +BA_ "GenSigSendType" SG_ 776 ScEnbl_D_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 775 ScDayOfWeekId_D_RqCld 1; +BA_ "GenSigStartValue" SG_ 775 ScDayOfWeekId_D_RqCld 1; +BA_ "GenSigSendType" SG_ 775 ScDayOfWeekId_D_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 775 ScLocSetId_No_RqCld 1; +BA_ "GenSigSendType" SG_ 775 ScLocSetId_No_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 775 ScLocRdius_L_RqCld 1; +BA_ "GenSigStartValue" SG_ 775 ScLocRdius_L_RqCld 1; +BA_ "GenSigSendType" SG_ 775 ScLocRdius_L_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 775 ScChrgToPc_Pc_RqCld 1; +BA_ "GenSigStartValue" SG_ 775 ScChrgToPc_Pc_RqCld 100; +BA_ "GenSigSendType" SG_ 775 ScChrgToPc_Pc_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 775 ScChrgPrfl_No_RqCld 1; +BA_ "GenSigSendType" SG_ 775 ScChrgPrfl_No_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 775 ScChrgDurSet_D_RqCld 1; +BA_ "GenSigStartValue" SG_ 775 ScChrgDurSet_D_RqCld 1; +BA_ "GenSigSendType" SG_ 775 ScChrgDurSet_D_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 775 ScChrgDur_T_RqCld 1; +BA_ "GenSigSendType" SG_ 775 ScChrgDur_T_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 774 ScLocLongPostv_B_RqCld 1; +BA_ "GenSigSendType" SG_ 774 ScLocLongPostv_B_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 774 ScLocLongFrct_An_RqCld 1; +BA_ "GenSigStartValue" SG_ 774 ScLocLongFrct_An_RqCld 1048575; +BA_ "GenSigSendType" SG_ 774 ScLocLongFrct_An_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 774 ScLocLongDeg_An_RqCld 1; +BA_ "GenSigSendType" SG_ 774 ScLocLongDeg_An_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 774 ScLocLattPostv_B_RqCld 1; +BA_ "GenSigSendType" SG_ 774 ScLocLattPostv_B_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 774 ScLocLattFrct_An_RqCld 1; +BA_ "GenSigStartValue" SG_ 774 ScLocLattFrct_An_RqCld 1048575; +BA_ "GenSigSendType" SG_ 774 ScLocLattFrct_An_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 774 ScLocLattDeg_An_RqCld 1; +BA_ "GenSigSendType" SG_ 774 ScLocLattDeg_An_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 774 ScLocId_No_RqCld 1; +BA_ "GenSigSendType" SG_ 774 ScLocId_No_RqCld 3; +BA_ "ECGUsedTxSignal" SG_ 774 ScLocDelete_B_RqCld 1; +BA_ "GenSigSendType" SG_ 774 ScLocDelete_B_RqCld 3; +BA_ "GenSigStartValue" SG_ 811 DistToStopover_L_Actl 65535; +BA_ "WakeupSignal" SG_ 811 ExtLghtRight_D_RqMnu 1; +BA_ "WakeupSignal" SG_ 811 AutoLghtOvrrd_B_RqDrv 1; +BA_ "WakeupSignal" SG_ 811 ExtLghtRear_D_RqMnu 1; +BA_ "WakeupSignal" SG_ 811 ExtLghtLeft_D_RqMnu 1; +BA_ "WakeupSignal" SG_ 811 ExtLghtFront_D_RqMnu 1; +BA_ "GenSigStartValue" SG_ 811 GoTEditMnte_T_RqMnu 14; +BA_ "GenSigStartValue" SG_ 811 GoTEditHr_T_RqMnu 30; +BA_ "U_CX727_MY2021_Tx" SG_ 850 VehElRngeNut_L_Dsply 1; +BA_ "U_CX727_MY2021_Tx" SG_ 850 NxtUsgSocEst_Pc_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 850 EstmChrgTimeLP_St 1; +BA_ "U_CX727_MY2021_Tx" SG_ 850 EstmChrgTimeLP_St 1; +BA_ "ECGUsedRxSignal" SG_ 850 EstmChrgTimeHP_St 1; +BA_ "U_CX727_MY2021_Tx" SG_ 850 EstmChrgTimeHP_St 1; +BA_ "ECGUsedRxSignal" SG_ 850 ChargeNowDuration_St 1; +BA_ "U_CX727_MY2021_Tx" SG_ 850 ChargeNowDuration_St 1; +BA_ "ECGUsedTxSignal" SG_ 563 DrvBhavWarn_B_Rq 1; +BA_ "GenSigSendType" SG_ 563 DrvBhavWarn_B_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 563 OfbChrgSetSync_D_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 563 KeyOffPwMde_D_Stat 1; +BA_ "GenSigSendType" SG_ 563 KeyOffPwMde_D_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 563 ModemReset_D_Stat 1; +BA_ "GenSigSendType" SG_ 563 ModemReset_D_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 563 FactoryReset_St 1; +BA_ "GenSigSendType" SG_ 563 FactoryReset_St 3; +BA_ "GenSigSendType" SG_ 1833 TesterPhysicalResVDM 3; +BA_ "GenSigStartValueInteger" SG_ 570 SuspRearRight_L_Actl 511; +BA_ "GenSigStartValue" SG_ 570 SuspRearRight_L_Actl 511; +BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspRearRight_L_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 570 SuspFrntRight_L_Actl 511; +BA_ "GenSigStartValue" SG_ 570 SuspFrntRight_L_Actl 511; +BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspFrntRight_L_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 570 SuspRear_L_Prev 511; +BA_ "GenSigStartValue" SG_ 570 SuspRear_L_Prev 511; +BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspRear_L_Prev 1; +BA_ "U_P702_MY2021_Rx" SG_ 570 SuspRear_L_Prev 1; +BA_ "GenSigStartValueInteger" SG_ 570 SuspRear_L_Actl 511; +BA_ "GenSigStartValue" SG_ 570 SuspRear_L_Actl 511; +BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspRear_L_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 570 SuspRear_L_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 570 SuspFrnt_L_Prev 511; +BA_ "GenSigStartValue" SG_ 570 SuspFrnt_L_Prev 511; +BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspFrnt_L_Prev 1; +BA_ "U_P702_MY2021_Rx" SG_ 570 SuspFrnt_L_Prev 1; +BA_ "GenSigStartValueInteger" SG_ 570 SuspFrnt_L_Actl 511; +BA_ "GenSigStartValue" SG_ 570 SuspFrnt_L_Actl 511; +BA_ "U_CX727_MY2021_Rx" SG_ 570 SuspFrnt_L_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 570 SuspFrnt_L_Actl 1; +BA_ "GenSigSendType" SG_ 837 Ccd_B_Falt 3; +BA_ "GenSigInactiveValue" SG_ 837 Ccd_B_Falt 0; +BA_ "GenSigSendType" SG_ 837 SelDrvMdeSusp_D_Stat 3; +BA_ "GenSigInactiveValue" SG_ 837 SelDrvMdeSusp_D_Stat 0; +BA_ "U_CX727_MY2021_Rx" SG_ 837 SelDrvMdeSusp_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 837 SelDrvMdeSusp_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 837 SelDrvMdeSusp_D_Stat 1; +BA_ "GenSigSendType" SG_ 837 AdptDrvMdePt_D_Rq 3; +BA_ "GenSigInactiveValue" SG_ 837 AdptDrvMdePt_D_Rq 0; +BA_ "U_CX727_MY2021_Rx" SG_ 837 AdptDrvMdePt_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 837 AdptDrvMdePt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 837 AdptDrvMdePt_D_Rq 1; +BA_ "GenSigSendType" SG_ 837 AdptDrvMdeChassis_D_Rq 3; +BA_ "GenSigInactiveValue" SG_ 837 AdptDrvMdeChassis_D_Rq 0; +BA_ "U_CX727_MY2021_Rx" SG_ 837 AdptDrvMdeChassis_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 837 AdptDrvMdeChassis_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 837 AdptDrvMdeChassis_D_Rq 1; +BA_ "GenSigSendType" SG_ 837 CcdMsgTxt_D_RqDsply 3; +BA_ "GenSigInactiveValue" SG_ 837 CcdMsgTxt_D_RqDsply 0; +BA_ "UsedOnPgmDBC" SG_ 837 CcdMsgTxt_D_RqDsply 1; +BA_ "U_P702_MY2021_Rx" SG_ 837 CcdMsgTxt_D_RqDsply 1; +BA_ "ECGUsedTxSignal" SG_ 885 BattULoChrg_D_RqOta 1; +BA_ "ECGUsedTxSignal" SG_ 885 VehStrtInhbt_T_Dsply 1; +BA_ "ECGUsedTxSignal" SG_ 885 VehStrtInhbt_D_Dsply 1; +BA_ "ECGUsedTxSignal" SG_ 885 VehOnRqstr_D_Stat 1; +BA_ "ECGUsedTxSignal" SG_ 885 VehStrtInhbt_D_RqCld 1; +BA_ "ECGUsedTxSignal" SG_ 885 VehOn_D_RqCld 1; +BA_ "ECGUsedTxSignal" SG_ 885 CanMsg375_No_Cnt 1; +BA_ "ECGUsedTxSignal" SG_ 885 CanMsg375_No_Crc 1; +BA_ "ECGUsedTxSignal" SG_ 885 OtaActv_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1150 LocationServices_1 1; +BA_ "GenSigSendType" SG_ 2612224016 PARSEDPushPCMtoGWM_ECG 3; +BA_ "U_P702_MY2021_Tx" SG_ 2612224016 PARSEDPushPCMtoGWM_ECG 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 2612224016 PARSEDPushPCMtoGWM_ECG 1; +BA_ "ECGUsedRxSignal" SG_ 2612224016 PARSEDPushPCMtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 810 OBCCSerial_D_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 810 OBCCSerial_D_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 810 TlghtTest_D_RqArb 1; +BA_ "GenSigSendType" SG_ 810 TlghtTest_D_RqArb 3; +BA_ "ECGUsedTxSignal" SG_ 810 ChrgrPncSustn_B_Rq 1; +BA_ "GenSigStartValue" SG_ 810 ChrgrPncSustn_B_Rq 0; +BA_ "GenSigStartValueInteger" SG_ 810 ChrgrPncSustn_B_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 810 NtfyDrvTrgtDist_L_Rq 1; +BA_ "GenSigStartValue" SG_ 810 NtfyDrvTrgtDist_L_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 810 NtfyDrvTrgtDist_L_Rq 1; +BA_ "WakeupSignal" SG_ 810 NtfyDrvTrgtDist_L_Rq 1; +BA_ "GenSigSendType" SG_ 810 NtfyDrvTrgtDist_L_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 1; +BA_ "GenSigStartValue" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 1; +BA_ "WakeupSignal" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 1; +BA_ "GenSigSendType" SG_ 810 NtfyDrvSocLvl1_Pc_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 810 PtRmtRprt_D_Stat 1; +BA_ "WakeupSignal" SG_ 810 PtRmtRprt_D_Stat 1; +BA_ "GenSigSendType" SG_ 810 PtRmtRprt_D_Stat 3; +BA_ "ECGUsedTxSignal" SG_ 810 ChrgrPncEnbl_D_Rq 1; +BA_ "GenSigStartValue" SG_ 810 ChrgrPncEnbl_D_Rq 3; +BA_ "GenSigStartValueInteger" SG_ 810 ChrgrPncEnbl_D_Rq 3; +BA_ "GenSigSendType" SG_ 810 ChrgrPncEnbl_D_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtDsply_B_StatArb 1; +BA_ "WakeupSignal" SG_ 810 ExtLghtDsply_B_StatArb 1; +BA_ "GenSigSendType" SG_ 810 ExtLghtDsply_B_StatArb 3; +BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtRight_D_RqOta 1; +BA_ "WakeupSignal" SG_ 810 ExtLghtRight_D_RqOta 1; +BA_ "GenSigSendType" SG_ 810 ExtLghtRight_D_RqOta 3; +BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtRear_D_RqOta 1; +BA_ "WakeupSignal" SG_ 810 ExtLghtRear_D_RqOta 1; +BA_ "GenSigSendType" SG_ 810 ExtLghtRear_D_RqOta 3; +BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtLeft_D_RqOta 1; +BA_ "WakeupSignal" SG_ 810 ExtLghtLeft_D_RqOta 1; +BA_ "GenSigSendType" SG_ 810 ExtLghtLeft_D_RqOta 3; +BA_ "ECGUsedTxSignal" SG_ 810 ExtLghtFront_D_RqOta 1; +BA_ "WakeupSignal" SG_ 810 ExtLghtFront_D_RqOta 1; +BA_ "GenSigSendType" SG_ 810 ExtLghtFront_D_RqOta 3; +BA_ "ECGUsedTxSignal" SG_ 550 PtWakeupActv1_B_Rq 1; +BA_ "WakeupSignal" SG_ 550 PtWakeupActv1_B_Rq 1; +BA_ "GenSigSendType" SG_ 550 PtWakeupActv1_B_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgPrflUpdate_B_Rq 1; +BA_ "GenSigSendType" SG_ 639 OfbChrgPrflUpdate_B_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgClearAll_B_Rq 1; +BA_ "GenSigSendType" SG_ 639 OfbChrgClearAll_B_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTTouch_D_Rq 1; +BA_ "GenSigSendType" SG_ 639 OfbChrgGoTTouch_D_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTPrcond_D_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTOn_D_Rq 1; +BA_ "GenSigStartValue" SG_ 639 OfbChrgGoTOn_D_Rq 2; +BA_ "GenSigStartValueInteger" SG_ 639 OfbChrgGoTOn_D_Rq 2; +BA_ "GenSigSendType" SG_ 639 OfbChrgGoTOn_D_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTMnte_D_Rq 1; +BA_ "MetaData" SG_ 639 OfbChrgGoTMnte_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 639 OfbChrgGoTMnte_D_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTHr_T_Rq 1; +BA_ "GenSigStartValue" SG_ 639 OfbChrgGoTHr_T_Rq 30; +BA_ "GenSigStartValueInteger" SG_ 639 OfbChrgGoTHr_T_Rq 30; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTExtHtr_D_Rq 1; +BA_ "GenSigSendType" SG_ 639 OfbChrgGoTExtHtr_D_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTElement_D_Rq 1; +BA_ "MetaData" SG_ 639 OfbChrgGoTElement_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 639 OfbChrgGoTElement_D_Rq 1; +BA_ "GenSigSendType" SG_ 639 OfbChrgGoTElement_D_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTDelete_B_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 639 OfbChrgGoTUpdate_B_Rq 1; +BA_ "GenSigSendType" SG_ 639 OfbChrgGoTUpdate_B_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgLocIdTrgt_No_Rq 1; +BA_ "MetaData" SG_ 530 OfbChrgLocIdTrgt_No_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 530 OfbChrgLocIdTrgt_No_Rq 1; +BA_ "GenSigSendType" SG_ 530 OfbChrgLocIdTrgt_No_Rq 3; +BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgToPcWknd_D_Actl 1; +BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgToPcWkdy_D_Actl 1; +BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgSetNow_D_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgSetDelete_B_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgPrflWknd_No_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgPrflWkdy_No_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 530 OfbChrgLocIdUns_B_Rq 1; +BA_ "ECGUsedRxSignal" SG_ 1142 ConsTipV_No_Dsply 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1142 ConsTipV_No_Dsply 1; +BA_ "WakeupSignal" SG_ 817 DrTgateOpen_B_Rq 1; +BA_ "WakeupSignal" SG_ 817 DrTgateExtSwMde_B_Stat 1; +BA_ "WakeupSignal" SG_ 817 Remote_Device_Feedback 1; +BA_ "WakeupSignal" SG_ 817 Veh_Lock_Requestor 1; +BA_ "WakeupSignal" SG_ 817 R_Pwr_Sliding_Dr_Rqst 1; +BA_ "WakeupSignal" SG_ 817 Power_Liftgate_Rqst 1; +BA_ "WakeupSignal" SG_ 817 Veh_Lock_EvNum 1; +BA_ "WakeupSignal" SG_ 817 Power_Decklid_Rqst 1; +BA_ "WakeupSignal" SG_ 817 L_Pwr_Sliding_Dr_Rqst 1; +BA_ "WakeupSignal" SG_ 817 Keyfob_Pad_Msg_Count 1; +BA_ "WakeupSignal" SG_ 817 Veh_Lock_Status 1; +BA_ "GenSigStartValueInteger" SG_ 817 Veh_Lock_Status 1; +BA_ "GenSigStartValue" SG_ 817 Veh_Lock_Status 1; +BA_ "WakeupSignal" SG_ 817 ChildLck_D_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 817 ChildLck_D_Dsply 1; +BA_ "GenSigStartValue" SG_ 817 ChildLck_D_Dsply 1; +BA_ "WakeupSignal" SG_ 817 Lockmsgtxt_D_Rq 1; +BA_ "WakeupSignal" SG_ 817 LockInhibit 1; +BA_ "GenSigSendType" SG_ 878 DcacGfciTest_B_Rq 3; +BA_ "GenSigStartValue" SG_ 878 DcacOut_Pw_DsplyMx 0; +BA_ "GenSigStartValue" SG_ 878 DcacOut1_Pw_Dsply 0; +BA_ "GenSigStartValue" SG_ 878 DcacOut2_Pw_Dsply 0; +BA_ "GenSigSendType" SG_ 878 DcacHw_D_Confg 3; +BA_ "UsedOnPgmDBC" SG_ 878 DcacHw_D_Confg 1; +BA_ "GenSigStartValueInteger" SG_ 878 DcacHw_D_Confg 1; +BA_ "GenSigStartValue" SG_ 878 DcacHw_D_Confg 1; +BA_ "GenSigSendType" SG_ 878 DcacFaltMsgTxt_D_Rq 3; +BA_ "UsedOnPgmDBC" SG_ 878 DcacFaltMsgTxt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 878 DcacFaltMsgTxt_D_Rq 1; +BA_ "GenSigStartValue" SG_ 878 DcacFaltMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 878 DcacLoFuelMsgTxt_D_Rq 3; +BA_ "GenSigSendType" SG_ 878 DcacEngOnMsgTxt_D_Rq 3; +BA_ "GenSigSendType" SG_ 878 DcacElPw_D_Stat 3; +BA_ "UsedOnPgmDBC" SG_ 878 DcacElPw_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 878 DcacElPw_D_Stat 1; +BA_ "GenSigStartValue" SG_ 878 DcacElPw_D_Stat 1; +BA_ "GenSigSendType" SG_ 878 PwBedPnlEnbl_B_Rq 3; +BA_ "GenSigSendType" SG_ 878 DcacOn_B_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 878 DcacOn_B_Rq 1; +BA_ "GenSigSendType" SG_ 878 DcacSys_B_Falt 3; +BA_ "U_P702_MY2021_Tx" SG_ 878 DcacSys_B_Falt 1; +BA_ "GenSigSendType" SG_ 878 DcacLedCtl_D_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 878 DcacLedCtl_D_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 2611055832 PARSEDPhysGWM_ECGtoSODR 1; +BA_ "GenSigSendType" SG_ 2611055832 PARSEDPhysGWM_ECGtoSODR 3; +BA_ "ECGUsedTxSignal" SG_ 2611054808 PARSEDPhysGWM_ECGtoSODL 1; +BA_ "GenSigSendType" SG_ 2611054808 PARSEDPhysGWM_ECGtoSODL 3; +BA_ "ECGUsedTxSignal" SG_ 2611026136 PARSEDPhysGWM_ECGtoSODCMD 1; +BA_ "GenSigSendType" SG_ 2611026136 PARSEDPhysGWM_ECGtoSODCMD 3; +BA_ "ECGUsedTxSignal" SG_ 2611025112 PARSEDPhysGWM_ECGtoSODCMC 1; +BA_ "GenSigSendType" SG_ 2611025112 PARSEDPhysGWM_ECGtoSODCMC 3; +BA_ "ECGUsedTxSignal" SG_ 2610975960 PARSEDPhysGWM_ECGtoCCM 1; +BA_ "GenSigSendType" SG_ 2610975960 PARSEDPhysGWM_ECGtoCCM 3; +BA_ "ECGUsedTxSignal" SG_ 2610007256 OTAPhysGWM_ECGtoSODR 1; +BA_ "GenSigSendType" SG_ 2610007256 OTAPhysGWM_ECGtoSODR 3; +BA_ "ECGUsedTxSignal" SG_ 2610006232 OTAPhysGWM_ECGtoSODL 1; +BA_ "GenSigSendType" SG_ 2610006232 OTAPhysGWM_ECGtoSODL 3; +BA_ "ECGUsedTxSignal" SG_ 2609977560 OTAPhysGWM_ECGtoSODCMD 1; +BA_ "GenSigSendType" SG_ 2609977560 OTAPhysGWM_ECGtoSODCMD 3; +BA_ "ECGUsedTxSignal" SG_ 2609976536 OTAPhysGWM_ECGtoSODCMC 1; +BA_ "GenSigSendType" SG_ 2609976536 OTAPhysGWM_ECGtoSODCMC 3; +BA_ "ECGUsedTxSignal" SG_ 2609927384 OTAPhysGWM_ECGtoCCM 1; +BA_ "GenSigSendType" SG_ 2609927384 OTAPhysGWM_ECGtoCCM 3; +BA_ "ECGUsedRxSignal" SG_ 2611175523 PARSEDPhysSODRtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2611175523 PARSEDPhysSODRtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2612224099 PARSEDPhysSODR2toGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2612224099 PARSEDPhysSODR2toGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2611175522 PARSEDPhysSODLtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2611175522 PARSEDPhysSODLtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2612224098 PARSEDPhysSODL2toGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2612224098 PARSEDPhysSODL2toGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2611175494 PARSEDPhysSODCMDtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2611175494 PARSEDPhysSODCMDtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2612224070 PARSEDPhysSODCMD2toGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2612224070 PARSEDPhysSODCMD2toGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2611175493 PARSEDPhysSODCMCtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2611175493 PARSEDPhysSODCMCtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2612224069 PARSEDPhysSODCMC2toGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2612224069 PARSEDPhysSODCMC2toGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2611175445 PARSEDPhysCCMtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2611175445 PARSEDPhysCCMtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2612224021 PARSEDPhysCCM2toGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2612224021 PARSEDPhysCCM2toGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2610126947 OTAPhysSODRtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126947 OTAPhysSODRtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2610126946 OTAPhysSODLtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126946 OTAPhysSODLtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2610126918 OTAPhysSODCMDtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126918 OTAPhysSODCMDtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2610126917 OTAPhysSODCMCtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126917 OTAPhysSODCMCtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2610126869 OTAPhysCCMtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126869 OTAPhysCCMtoGWM_ECG 3; +BA_ "CrossOver_InfoCAN" SG_ 984 FeatConfigIpmaActl 1; +BA_ "CrossOver_InfoCAN" SG_ 984 FeatNoIpmaActl 1; +BA_ "GenSigStartValue" SG_ 984 PersIndexIpma_D_Actl 4; +BA_ "GenSigStartValueInteger" SG_ 984 PersIndexIpma_D_Actl 4; +BA_ "CrossOver_InfoCAN" SG_ 984 PersIndexIpma_D_Actl 1; +BA_ "GenSigSendType" SG_ 984 PersIndexIpma_D_Actl 3; +BA_ "U_P702_MY2021_Rx" SG_ 984 AhbcRampingV_D_Rq 1; +BA_ "GenSigSendType" SG_ 984 AhbcRampingV_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 984 LaActvStats_D_Dsply 1; +BA_ "GenSigSendType" SG_ 984 LaActvStats_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 984 LaDenyStats_B_Dsply 1; +BA_ "GenSigSendType" SG_ 984 LaDenyStats_B_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 984 LaHandsOff_D_Dsply 1; +BA_ "GenSigSendType" SG_ 984 LaHandsOff_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 984 CamraDefog_B_Req 1; +BA_ "GenSigSendType" SG_ 984 CamraDefog_B_Req 3; +BA_ "CrossOver_InfoCAN" SG_ 984 CamraStats_D_Dsply 1; +BA_ "GenSigSendType" SG_ 984 CamraStats_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 984 DasAlrtLvl_D_Dsply 1; +BA_ "GenSigSendType" SG_ 984 DasAlrtLvl_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 984 DasStats_D_Dsply 1; +BA_ "GenSigSendType" SG_ 984 DasStats_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 984 DasWarn_D_Dsply 1; +BA_ "GenSigSendType" SG_ 984 DasWarn_D_Dsply 3; +BA_ "GenSigSendType" SG_ 984 AhbHiBeam_D_Rq 3; +BA_ "GenSigSendType" SG_ 985 LdwChime_B_Rq 3; +BA_ "GenSigSendType" SG_ 985 TsrRegionTxt_D_Stat 3; +BA_ "GenSigSendType" SG_ 985 SblmPedCrossScnr_B_Stat 3; +BA_ "GenSigSendType" SG_ 985 LongCtrlEnbl_D_Rq 3; +BA_ "GenSigSendType" SG_ 985 SblmRndAbtScnr_B_Stat 3; +BA_ "GenSigSendType" SG_ 985 DasAlrtInfo_D_Dsply 3; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 985 IaccVLim_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 985 IaccVLim_D_Rq 1; +BA_ "GenSigStartValue" SG_ 985 IaccVLim_D_Rq 254; +BA_ "GenSigStartValueInteger" SG_ 985 IaccVLim_D_Rq 254; +BA_ "GenSigSendType" SG_ 985 IaccVLim_D_Rq 3; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 985 IaccVLimUnit_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 985 IaccVLimUnit_D_Rq 1; +BA_ "GenSigStartValue" SG_ 985 IaccVLimUnit_D_Rq 3; +BA_ "GenSigStartValueInteger" SG_ 985 IaccVLimUnit_D_Rq 3; +BA_ "GenSigSendType" SG_ 985 IaccVLimUnit_D_Rq 3; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 985 IsaVLim_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 985 IsaVLim_D_Rq 1; +BA_ "GenSigStartValue" SG_ 985 IsaVLim_D_Rq 254; +BA_ "GenSigStartValueInteger" SG_ 985 IsaVLim_D_Rq 254; +BA_ "GenSigSendType" SG_ 985 IsaVLim_D_Rq 3; +BA_ "GenSigSendType" SG_ 985 SblmStopScnr_B_Stat 3; +BA_ "GenSigSendType" SG_ 985 SblmYieldScnr_B_Stat 3; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 985 IsaVLimUnit_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 985 IsaVLimUnit_D_Rq 1; +BA_ "GenSigSendType" SG_ 985 IsaVLimUnit_D_Rq 3; +BA_ "GenSigSendType" SG_ 985 AdbDividedRoad_B_Stat 3; +BA_ "GenSigSendType" SG_ 985 LcwaMsgTxt_D_Stat 3; +BA_ "GenSigSendType" SG_ 985 AdbDrvSide_B_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 992 MsgCntrDsplyOp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 992 MsgCntrDsplyOp_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 992 MsgCntrFeatNoRq 1; +BA_ "CrossOver_InfoCAN" SG_ 992 MsgCntrFeatNoRq 1; +BA_ "U_P702_MY2021_Rx" SG_ 992 MsgCntrFeatConfigRq 1; +BA_ "CrossOver_InfoCAN" SG_ 992 MsgCntrFeatConfigRq 1; +BA_ "U_P702_MY2021_Rx" SG_ 992 MsgCntrPersIndex_D_Rq 1; +BA_ "GenSigStartValue" SG_ 992 MsgCntrPersIndex_D_Rq 4; +BA_ "GenSigStartValueInteger" SG_ 992 MsgCntrPersIndex_D_Rq 4; +BA_ "CrossOver_InfoCAN" SG_ 992 MsgCntrPersIndex_D_Rq 1; +BA_ "GenSigSendType" SG_ 2612019416 PARSEDPhysGWM_ECG2toPCM 3; +BA_ "ECGUsedTxSignal" SG_ 2612019416 PARSEDPhysGWM_ECG2toPCM 1; +BA_ "UsedOnPgmDBC" SG_ 943 VehVActlAdas_D_Qf 1; +BA_ "MetaData" SG_ 943 VehVActlAdas_D_Qf 1; +BA_ "GenSigStartValue" SG_ 943 VehVActlAdas_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 943 Veh_V_RqLsc 1; +BA_ "UsedOnPgmDBC" SG_ 943 Veh_V_ActlAdas 1; +BA_ "GenSigStartValue" SG_ 943 AdasLcDistToObj_L_Actl 4094; +BA_ "UsedOnPgmDBC" SG_ 515 PtIgnSwtch_No_Cs 1; +BA_ "MetaData" SG_ 515 PtIgnSwtch_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 515 PtIgnSwtch_No_Cnt 1; +BA_ "MetaData" SG_ 515 PtIgnSwtch_No_Cnt 1; +BA_ "GenSigSendType" SG_ 515 PtIgnSwtch_D_Stat 3; +BA_ "GenSigStartValue" SG_ 515 PtIgnSwtch_D_Stat 2; +BA_ "GenSigStartValueInteger" SG_ 1111 TrlrYawWActl_D_Qf 1; +BA_ "GenSigStartValue" SG_ 1111 TrlrYawWActl_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrYawWActl_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrYawWActl_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 1111 TrlrYaw_W_Actl 65534; +BA_ "GenSigStartValue" SG_ 1111 TrlrYaw_W_Actl 65534; +BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrYaw_W_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrYaw_W_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1111 TrlrHitYaw_AnRate_Actl 4094; +BA_ "GenSigStartValue" SG_ 1111 TrlrHitYaw_AnRate_Actl 4093; +BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrHitYaw_AnRate_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrHitYaw_AnRate_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrHitchYaw_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrHitchYaw_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1111 TrlrHitchYaw_An_Actl 4094; +BA_ "GenSigStartValue" SG_ 1111 TrlrHitchYaw_An_Actl 4093; +BA_ "U_P702_MY2021_Rx" SG_ 1111 TrlrHitchYaw_An_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1111 TrlrHitchYaw_An_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1106 TrlrSnsId_No_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1106 TrlrSnsId_No_Actl 1; +BA_ "GenSigStartValue" SG_ 982 LatCtlCrv_NoRate2_Actl 1024; +BA_ "UsedOnPgmDBC" SG_ 982 LatCtlPath_No_Cnt 1; +BA_ "ContentDependant" SG_ 982 LatCtlPath_No_Cnt 1; +BA_ "MetaData" SG_ 982 LatCtlPath_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 982 LatCtlPath_No_Cs 1; +BA_ "ContentDependant" SG_ 982 LatCtlPath_No_Cs 1; +BA_ "MetaData" SG_ 982 LatCtlPath_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 982 HandsOffCnfm_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 982 HandsOffCnfm_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlRampType_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlRampType_D_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlPrecision_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlPrecision_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 982 LatCtlPathOffst_L_Actl 512; +BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlPathOffst_L_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlPathOffst_L_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 982 LatCtlPath_An_Actl 1000; +BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlPath_An_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlPath_An_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 982 LatCtlCurv_No_Actl 1000; +BA_ "U_CX727_MY2021_Rx" SG_ 982 LatCtlCurv_No_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 982 LatCtlCurv_No_Actl 1; +BA_ "GenSigSendType" SG_ 1985 TesterPhysicalReqCMR_DSMC 3; +BA_ "GenSigSendType" SG_ 1993 TesterPhysicalResCMR_DSMC 3; +BA_ "MetaData" SG_ 1104 DrvEngageLevel_No_Cs 1; +BA_ "ContentDependant" SG_ 1104 DrvEngageLevel_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 1104 DrvEngageLevel_No_Cs 1; +BA_ "MetaData" SG_ 1104 DrvEngageLevel_No_Cnt 1; +BA_ "ContentDependant" SG_ 1104 DrvEngageLevel_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 1104 DrvEngageLevel_No_Cnt 1; +BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_GWOnBoardTester 255; +BA_ "ContentDependant" SG_ 1503 CMR_DSMC_GWOnBoardTester 1; +BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_GWOnBoardTester 255; +BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_GWNMProxY 255; +BA_ "ContentDependant" SG_ 1503 CMR_DSMC_GWNMProxY 1; +BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_GWNMProxY 255; +BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMReserved 255; +BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMReserved 1; +BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMReserved 255; +BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMReserve4 255; +BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMReserve4 1; +BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMReserve4 255; +BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMReserve3 255; +BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMReserve3 1; +BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMReserve3 255; +BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMReserve2 255; +BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMReserve2 1; +BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMReserve2 255; +BA_ "GenSigStartValue" SG_ 1503 CMR_DSMC_AutoSarNMNodeId 223; +BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMNodeId 1; +BA_ "GenSigStartValueInteger" SG_ 1503 CMR_DSMC_AutoSarNMNodeId 222; +BA_ "ContentDependant" SG_ 1503 CMR_DSMC_AutoSarNMControl 1; +BA_ "ECGUsedTxSignal" SG_ 2610995416 PARSEDPhysGWM_ECGtoABS 1; +BA_ "GenSigSendType" SG_ 2610995416 PARSEDPhysGWM_ECGtoABS 3; +BA_ "ECGUsedTxSignal" SG_ 2612043992 PARSEDPhysGWM_ECG2toABS 1; +BA_ "GenSigSendType" SG_ 2612043992 PARSEDPhysGWM_ECG2toABS 3; +BA_ "ECGUsedTxSignal" SG_ 2609946840 OTAPhysGWM_ECGtoABS 1; +BA_ "GenSigSendType" SG_ 2609946840 OTAPhysGWM_ECGtoABS 3; +BA_ "ECGUsedRxSignal" SG_ 2611175464 PARSEDPhysABStoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2611175464 PARSEDPhysABStoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2612224040 PARSEDPhysABS2toGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2612224040 PARSEDPhysABS2toGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2610126888 OTAPhysABStoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126888 OTAPhysABStoGWM_ECG 3; +BA_ "ECGUsedTxSignal" SG_ 2610988248 PARSEDPhysGWM_ECGtoIPMA 1; +BA_ "ECGUsedTxSignal" SG_ 2609939672 OTAPhysGWM_ECGtoIPMA 1; +BA_ "GenSigSendType" SG_ 2609939672 OTAPhysGWM_ECGtoIPMA 3; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1114 TrailCtlSwtch_B_Stat2 1; +BA_ "U_P702_MY2021_Rx" SG_ 1114 TrailCtlSwtch_B_Stat2 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1116 TrlrAidSetup_D2_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1116 TrlrAidSetup_D2_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1116 TrlrAidEnbl_D2_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1116 TrlrAidEnbl_D2_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1116 TrlrTrgtToBmpr_L_Actl 0; +BA_ "U_P702_MY2021_Rx" SG_ 1116 TrlrIdType_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1116 TrlrIdType_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1116 TrlrBallToBmpr_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1116 TrlrAxleToBmpr_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1116 TrlrAnOffst_An_Mem 0; +BA_ "GenSigStartValueInteger" SG_ 1116 TrlrTrgtOffst_L_Actl 0; +BA_ "ECGUsedRxSignal" SG_ 2611175457 PARSEDPhysIPMAtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2611175457 PARSEDPhysIPMAtoGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2612224033 PARSEDPhysIPMA2toGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2612224033 PARSEDPhysIPMA2toGWM_ECG 3; +BA_ "ECGUsedRxSignal" SG_ 2610126881 OTAPhysIPMAtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126881 OTAPhysIPMAtoGWM_ECG 3; +BA_ "UsedOnPgmDBC" SG_ 1085 ULoRgenTestMde_B_Stat 1; +BA_ "ContentDependant" SG_ 1085 ULoRgenTestMde_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1085 ULoRgenTestMde_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 ULoRgenTestMde_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1085 PwSrcULoOvrTe_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULoOvrTe_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULoOvrTe_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1085 PwSrcULoFalt_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULoFalt_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULoFalt_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1085 PwSrcULoDcnnt_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULoDcnnt_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULoDcnnt_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULo_Pc_Mx 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULo_Pc_Mx 1; +BA_ "UsedOnPgmDBC" SG_ 1085 PwSrcULoComm_B_Falt 1; +BA_ "ContentDependant" SG_ 1085 PwSrcULoComm_B_Falt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULoComm_B_Falt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULoComm_B_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 1085 PwSrcULo_I_Mx 1; +BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULo_I_Mx 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULo_I_Mx 1; +BA_ "U_P702_MY2021_Rx" SG_ 1085 PwSrcULo_I_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1085 PwSrcULo_I_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1085 PwSrcULo_I_Actl 1; +BA_ "GenSigStartValue" SG_ 981 AdbBrdrTop_An_Rq 254; +BA_ "GenSigStartValue" SG_ 981 AdbBrdrRight_L_Stat 510; +BA_ "GenSigStartValue" SG_ 981 AdbBrdrRight_An_Rq 1022; +BA_ "GenSigStartValue" SG_ 981 AdbBrdrLeft_L_Stat 510; +BA_ "GenSigStartValue" SG_ 981 AdbBrdrLeft_An_Rq 1022; +BA_ "GenSigStartValue" SG_ 981 AdbBrdrBottom_An_Rq 62; +BA_ "U_P702_MY2021_Rx" SG_ 791 EngAirFilt_B_RqReset 1; +BA_ "CrossOver_InfoCAN" SG_ 791 GpsElMdeSel_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 791 LongTermReset_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 791 DrvEffLvl_No_Stat 1; +BA_ "ECGUsedTxSignal" SG_ 2610970840 PARSEDPhysGWM_ECGtoPCM 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 2610970840 PARSEDPhysGWM_ECGtoPCM 1; +BA_ "U_P702_MY2021_Rx" SG_ 2610970840 PARSEDPhysGWM_ECGtoPCM 1; +BA_ "GenSigSendType" SG_ 2610970840 PARSEDPhysGWM_ECGtoPCM 3; +BA_ "ECGUsedTxSignal" SG_ 2609922264 OTAPhysGWM_ECGtoPCM 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 2609922264 OTAPhysGWM_ECGtoPCM 1; +BA_ "U_P702_MY2021_Rx" SG_ 2609922264 OTAPhysGWM_ECGtoPCM 1; +BA_ "GenSigSendType" SG_ 2609922264 OTAPhysGWM_ECGtoPCM 3; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoStat_D_Qlty 1; +BA_ "GenSigStartValue" SG_ 868 BattRgenLoStat_D_Qlty 1; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoSoc_Pc_Actl 1; +BA_ "GenSigStartValue" SG_ 868 BattRgenLoSoc_Pc_Actl 50; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoPulse_U_Pred 1; +BA_ "GenSigStartValue" SG_ 868 BattRgenLoPulse_U_Pred 216; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoPrtct_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoDChrg_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoDchrg_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoChrg_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLoChrg_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLo_T_Est 1; +BA_ "U_P702_MY2021_Rx" SG_ 868 BattRgenLo_B_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLoBalnc_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_Te_Hi 1; +BA_ "GenSigStartValue" SG_ 867 BattRgenLo_Te_Hi 45; +BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_Te_Actl 1; +BA_ "GenSigStartValue" SG_ 867 BattRgenLo_Te_Actl 85; +BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_R_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_AhRide_Actl 1; +BA_ "GenSigStartValue" SG_ 867 BattRgenLo_AhRide_Actl 12800; +BA_ "U_P702_MY2021_Rx" SG_ 867 BattRgenLo_Ah_Actl 1; +BA_ "GenSigStartValue" SG_ 867 BattRgenLo_Ah_Actl 50; +BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoOpen_U_Actl 1; +BA_ "GenSigStartValue" SG_ 866 BattRgenLoOpen_U_Actl 180; +BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoDchrg_U_Mn 1; +BA_ "GenSigStartValue" SG_ 866 BattRgenLoDchrg_U_Mn 280; +BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoDchrg_I_Mx 1; +BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoChrg_U_Mx 1; +BA_ "GenSigStartValue" SG_ 866 BattRgenLoChrg_U_Mx 96; +BA_ "U_P702_MY2021_Rx" SG_ 866 BattRgenLoChrg_I_Mx 1; +BA_ "U_P702_MY2021_Rx" SG_ 865 BattRgenLo_U_Actl 1; +BA_ "GenSigStartValue" SG_ 865 BattRgenLo_U_Actl 768; +BA_ "U_P702_MY2021_Rx" SG_ 865 BattRgenLo_I_Actl 1; +BA_ "GenSigStartValue" SG_ 865 BattRgenLo_I_Actl 32768; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 2611175440 PARSEDPhysPCMtoGWM_ECG 1; +BA_ "U_P702_MY2021_Tx" SG_ 2611175440 PARSEDPhysPCMtoGWM_ECG 1; +BA_ "ECGUsedRxSignal" SG_ 2611175440 PARSEDPhysPCMtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2611175440 PARSEDPhysPCMtoGWM_ECG 3; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 2610126864 OTAPhysPCMtoGWM_ECG 1; +BA_ "U_P702_MY2021_Tx" SG_ 2610126864 OTAPhysPCMtoGWM_ECG 1; +BA_ "ECGUsedRxSignal" SG_ 2610126864 OTAPhysPCMtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126864 OTAPhysPCMtoGWM_ECG 3; +BA_ "GenSigSendType" SG_ 2611175441 PARSEDPhysHPCMtoGWM_ECG 3; +BA_ "GenSigSendType" SG_ 2612224017 PARSEDPhysHPCM2toGWM_ECG 3; +BA_ "U_P702_MY2021_Tx" SG_ 2610126865 OTAPhysHPCMtoGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610126865 OTAPhysHPCMtoGWM_ECG 3; +BA_ "U_P702_MY2021_Tx" SG_ 1679 UUDTSOBDMCResponse4 1; +BA_ "UsedOnPgmDBC" SG_ 1679 UUDTSOBDMCResponse4 1; +BA_ "GenSigSendType" SG_ 1679 UUDTSOBDMCResponse4 3; +BA_ "U_P702_MY2021_Tx" SG_ 1678 UUDTSOBDMCResponse3 1; +BA_ "UsedOnPgmDBC" SG_ 1678 UUDTSOBDMCResponse3 1; +BA_ "GenSigSendType" SG_ 1678 UUDTSOBDMCResponse3 3; +BA_ "U_P702_MY2021_Tx" SG_ 1677 UUDTSOBDMCResponse2 1; +BA_ "UsedOnPgmDBC" SG_ 1677 UUDTSOBDMCResponse2 1; +BA_ "GenSigSendType" SG_ 1677 UUDTSOBDMCResponse2 3; +BA_ "U_P702_MY2021_Tx" SG_ 1676 UUDTSOBDMCResponse1 1; +BA_ "UsedOnPgmDBC" SG_ 1676 UUDTSOBDMCResponse1 1; +BA_ "GenSigSendType" SG_ 1676 UUDTSOBDMCResponse1 3; +BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMReserved4 255; +BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMReserved4 1; +BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMReserved4 255; +BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMReserved4 1; +BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMReserved3 255; +BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMReserved3 1; +BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMReserved3 255; +BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMReserved3 1; +BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMReserved2 255; +BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMReserved2 1; +BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMReserved2 255; +BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMReserved2 1; +BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMReserved1 255; +BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMReserved1 1; +BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMReserved1 255; +BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMReserved1 1; +BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_AutoSarNMNodeId 165; +BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMNodeId 1; +BA_ "GenSigStartValue" SG_ 1445 SOBDMC_AutoSarNMNodeId 165; +BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMNodeId 1; +BA_ "ContentDependant" SG_ 1445 SOBDMC_AutoSarNMControl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_AutoSarNMControl 1; +BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_GWOnBoardTester 255; +BA_ "ContentDependant" SG_ 1445 SOBDMC_GWOnBoardTester 1; +BA_ "GenSigStartValue" SG_ 1445 SOBDMC_GWOnBoardTester 255; +BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_GWOnBoardTester 1; +BA_ "GenSigStartValueInteger" SG_ 1445 SOBDMC_GWNMProxy 255; +BA_ "ContentDependant" SG_ 1445 SOBDMC_GWNMProxy 1; +BA_ "GenSigStartValue" SG_ 1445 SOBDMC_GWNMProxy 255; +BA_ "U_P702_MY2021_Tx" SG_ 1445 SOBDMC_GWNMProxy 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1144 WakeAlarm0_T_Rq 1; +BA_ "GenSigStartValue" SG_ 1144 WakeAlarm0_T_Rq 32767; +BA_ "GenSigStartValueInteger" SG_ 1144 WakeAlarm0_T_Rq 32767; +BA_ "U_CX727_MY2021_Tx" SG_ 1144 WakeAlarm0_B_Typ 1; +BA_ "GenSigSendType" SG_ 1144 WakeAlarm0_B_Typ 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1144 PreCondBatt_B_Actl 1; +BA_ "GenSigSendType" SG_ 1144 PreCondBatt_B_Actl 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1144 HtrnDcdcDis_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1144 HtrnDcdcDis_B_Rq 1; +BA_ "GenSigSendType" SG_ 1144 HtrnDcdcDis_B_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1144 ChrgNowEvnt_B_Stat 1; +BA_ "GenSigSendType" SG_ 1144 ChrgNowEvnt_B_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1144 CabinDrvSustn_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1144 CabinDrvSustn_B_Rq 1; +BA_ "GenSigSendType" SG_ 1144 CabinDrvSustn_B_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1144 BattChrgTrgtSoC_D_Rq 1; +BA_ "GenSigSendType" SG_ 1144 CabnEvapSovFront_B_Rq 3; +BA_ "WakeupSignal" SG_ 1144 CabnEvapSovFront_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1144 CabnEvapSovFront_B_Rq 1; +BA_ "GenSigSendType" SG_ 1144 HeatCoreSovRear_B_Rq 3; +BA_ "WakeupSignal" SG_ 1144 HeatCoreSovRear_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1144 HeatCoreSovRear_B_Rq 1; +BA_ "GenSigSendType" SG_ 1144 BattChlrSov_B_Rq 3; +BA_ "WakeupSignal" SG_ 1144 BattChlrSov_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1144 BattChlrSov_B_Rq 1; +BA_ "GenSigSendType" SG_ 1144 CabnEvapSovRear_B_Rq 3; +BA_ "WakeupSignal" SG_ 1144 CabnEvapSovRear_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1144 CabnEvapSovRear_B_Rq 1; +BA_ "GenSigSendType" SG_ 1144 BrkAppl_D_RqPt 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1144 BrkAppl_D_RqPt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1144 BrkAppl_D_RqPt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1144 BrkAppl_D_RqPt 1; +BA_ "GenSigSendType" SG_ 1144 HtrnCnnctPwr_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 1144 HtrnCnnctPwr_B_Stat 1; +BA_ "GenSigSendType" SG_ 1144 PtcHtr_D_Stat 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1144 PtcHtr_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1144 PtcHtr_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1144 PtcHtr_D_Stat 1; +BA_ "GenSigSendType" SG_ 1144 HtrnClntFlw_D_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1144 HtrnClntFlw_D_Rq 1; +BA_ "GenSigSendType" SG_ 1144 BattTracDrvSustn_B_Rq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1144 BattTracDrvSustn_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1144 BattTracDrvSustn_B_Rq 1; +BA_ "GenSigSendType" SG_ 1144 BattTracClntVlv_B_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1144 BattTracClntVlv_B_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1141 OfbChrgSetSync_D_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 1141 OfbChrgSetSync_D_Stat 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1141 PtRmtRprt_D_Rq 1; +BA_ "ECGUsedRxSignal" SG_ 1141 PtRmtRprt_D_Rq 1; +BA_ "WakeupSignal" SG_ 1141 PtRmtRprt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1141 MtrTrac2_Tq_Actl 4095; +BA_ "GenSigStartValue" SG_ 1141 MtrTrac2_Tq_Actl 4095; +BA_ "U_P702_MY2021_Tx" SG_ 1141 MtrTrac2_Tq_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1141 MtrTrac2_Tq_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1141 NtfctnConflict1_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1141 NtfctnConflict1_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1140 RgenEvntLvl_Pc_Dsply 1; +BA_ "GenSigStartValue" SG_ 1140 RgenEvntLvl_Pc_Dsply 1022; +BA_ "GenSigStartValueInteger" SG_ 1140 RgenEvntLvl_Pc_Dsply 1023; +BA_ "U_CX727_MY2021_Tx" SG_ 1140 BrkEvntComplt_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1140 PreCondStat_D_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1140 PreCondStat_D_Dsply 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1139 ActChrgStrtYr_No2_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtYr_No2_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1139 ActChrgStrtYr_No2_Actl 0; +BA_ "U_P702_MY2021_Tx" SG_ 1139 BattChrgTrgtLMax_T_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrtYr_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1139 ActChrgStrtYr_No_Actl 0; +BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtYr_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrtMin_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtMin_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrtHr_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtHr_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrtDay_No_Actl 1; +BA_ "GenSigStartValue" SG_ 1139 ActChrgStrtDay_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1139 ActChrgStrtDay_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrtDay_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1139 ActChrgStrMnth_No_Actl 1; +BA_ "GenSigStartValue" SG_ 1139 ActChrgStrMnth_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1139 ActChrgStrMnth_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1139 ActChrgStrMnth_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1138 ActChrgEndYr_No2_Actl 0; +BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndYr_No2_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1138 ActChrgEndYr_No2_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1138 BattChrgTrgtLMin_T_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndYr_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1138 ActChrgEndYr_No_Actl 0; +BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndYr_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndMnth_No_Actl 1; +BA_ "GenSigStartValue" SG_ 1138 ActChrgEndMnth_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1138 ActChrgEndMnth_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndMnth_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndMin_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndMin_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndHr_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndHr_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1138 ActChrgEndDay_No_Actl 1; +BA_ "GenSigStartValue" SG_ 1138 ActChrgEndDay_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1138 ActChrgEndDay_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1138 ActChrgEndDay_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1089 Mtr2Aout_W_ActlMntr 1; +BA_ "GenSigStartValue" SG_ 1089 Mtr2Aout_W_ActlMntr 1023; +BA_ "GenSigStartValueInteger" SG_ 1089 Mtr2Aout_W_ActlMntr 1023; +BA_ "ECGUsedRxSignal" SG_ 1089 Mtr2Aout_W_ActlMntr 1; +BA_ "U_P702_MY2021_Tx" SG_ 1089 Inv1_Te_Actl 1; +BA_ "GenSigStartValue" SG_ 1089 Inv1_Te_Actl 254; +BA_ "GenSigStartValueInteger" SG_ 1089 Inv1_Te_Actl 254; +BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2Coil_Te_Actl 1; +BA_ "GenSigStartValue" SG_ 1089 MtrTrac2Coil_Te_Actl 254; +BA_ "GenSigStartValueInteger" SG_ 1089 MtrTrac2Coil_Te_Actl 254; +BA_ "ECGUsedRxSignal" SG_ 1089 MtrTrac2Coil_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2_U_Actl 1; +BA_ "GenSigStartValue" SG_ 1089 MtrTrac2_U_Actl 1023; +BA_ "GenSigStartValueInteger" SG_ 1089 MtrTrac2_U_Actl 1023; +BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2Falt_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2TeAlrm_B_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 1089 MtrTrac2TeAlrm_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1089 Mtr2CntlTeAlrm_B_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 1089 Mtr2CntlTeAlrm_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2Inv_Te_Actl 1; +BA_ "GenSigStartValue" SG_ 1089 MtrTrac2Inv_Te_Actl 214; +BA_ "GenSigStartValueInteger" SG_ 1089 MtrTrac2Inv_Te_Actl 214; +BA_ "ECGUsedRxSignal" SG_ 1089 MtrTrac2Inv_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1089 MtrTrac2_I_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1089 MtrTrac2_I_Actl 10000; +BA_ "U_CX727_MY2021_Tx" SG_ 1088 ChrgTMatch_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1088 ChrgStat_D2_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1088 ChrgStat_D2_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecondRecirc_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecondMode2_D_Rq 1; +BA_ "ContentDependant" SG_ 1088 HvacPrecondMode2_D_Rq 1; +BA_ "WakeupSignal" SG_ 1088 HvacPrecondMode2_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecondBlwr2_D_Rq 1; +BA_ "ContentDependant" SG_ 1088 HvacPrecondBlwr2_D_Rq 1; +BA_ "WakeupSignal" SG_ 1088 HvacPrecondBlwr2_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecondAC_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1088 HvacPrecond_Te_Rq 1; +BA_ "GenSigStartValue" SG_ 1088 HvacPrecond_Te_Rq 2; +BA_ "GenSigStartValueInteger" SG_ 1088 HvacPrecond_Te_Rq 2; +BA_ "U_P702_MY2021_Tx" SG_ 1088 BattChrgInhbt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1040 ElCmprEnbl_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1040 ElCmprEnbl_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1040 ElCmprEnbl_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1040 ElCmpr_N_Rq 1; +BA_ "GenSigSendType" SG_ 1016 ChrgGoTElement_B_Dsply 3; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTElement_B_Dsply 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1016 ChrgGoTElement_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgLocIdCurnt_D_Uns 1; +BA_ "GenSigSendType" SG_ 1016 ChrgLocIdCurnt_D_Uns 3; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgLocIdCurnt_D_Uns 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTTouchEnbl_B_Rq 1; +BA_ "GenSigSendType" SG_ 1016 ChrgGoTTouchEnbl_B_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTTouch_B_Stat 1; +BA_ "GenSigSendType" SG_ 1016 ChrgGoTTouch_B_Stat 3; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTTouch_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTPrcond_D_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTPrcond_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTNext_D_Stat 1; +BA_ "MetaData" SG_ 1016 ChrgGoTNext_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1016 ChrgGoTNext_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1016 ChrgGoTNext_D_Stat 1; +BA_ "GenSigSendType" SG_ 1016 ChrgGoTNext_D_Stat 3; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTNext_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTMnte_D_Stat 1; +BA_ "MetaData" SG_ 1016 ChrgGoTMnte_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1016 ChrgGoTMnte_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1016 ChrgGoTMnte_D_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTMnte_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTHr_T_Stat 1; +BA_ "GenSigStartValue" SG_ 1016 ChrgGoTHr_T_Stat 30; +BA_ "GenSigStartValueInteger" SG_ 1016 ChrgGoTHr_T_Stat 30; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTHr_T_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTExtHtrEnbl_B_Rq 1; +BA_ "GenSigSendType" SG_ 1016 ChrgGoTExtHtrEnbl_B_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTExtHtr_B_Stat 1; +BA_ "GenSigSendType" SG_ 1016 ChrgGoTExtHtr_B_Stat 3; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTExtHtr_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTElement_D_Stat 1; +BA_ "MetaData" SG_ 1016 ChrgGoTElement_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1016 ChrgGoTElement_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1016 ChrgGoTElement_D_Stat 1; +BA_ "GenSigSendType" SG_ 1016 ChrgGoTElement_D_Stat 3; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTElement_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1016 ChrgGoTAllOn_B_Stat 1; +BA_ "GenSigSendType" SG_ 1016 ChrgGoTAllOn_B_Stat 3; +BA_ "ECGUsedRxSignal" SG_ 1016 ChrgGoTAllOn_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgToPcWkndSav_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1013 ChrgToPcWkndSav_D_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 1013 ChrgToPcWkndSav_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgToPcWkdySav_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1013 ChrgToPcWkdySav_D_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 1013 ChrgToPcWkdySav_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgProgIdSaved_D_Stat 1; +BA_ "MetaData" SG_ 1013 ChrgProgIdSaved_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1013 ChrgProgIdSaved_D_Stat 1; +BA_ "GenSigSendType" SG_ 1013 ChrgProgIdSaved_D_Stat 3; +BA_ "ECGUsedRxSignal" SG_ 1013 ChrgProgIdSaved_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgNowEnbl_B_Saved 1; +BA_ "ECGUsedRxSignal" SG_ 1013 ChrgNowEnbl_B_Saved 1; +BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgLocIdUnsAck_B_Stat 1; +BA_ "GenSigSendType" SG_ 1013 ChrgLocIdUnsAck_B_Stat 3; +BA_ "ECGUsedRxSignal" SG_ 1013 ChrgLocIdUnsAck_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgLocIdCurnt_D_Sav 1; +BA_ "MetaData" SG_ 1013 ChrgLocIdCurnt_D_Sav 1; +BA_ "GenSigSendType" SG_ 1013 ChrgLocIdCurnt_D_Sav 3; +BA_ "ECGUsedRxSignal" SG_ 1013 ChrgLocIdCurnt_D_Sav 1; +BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgPrflWknd_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1013 ChrgPrflWknd_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1013 ChrgPrflWkdy_No_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 1013 ChrgPrflWkdy_No_Actl 1; +BA_ "GenSigSendType" SG_ 1012 ChrgNowCurnt_B_Dsply 3; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgNowCurnt_B_Dsply 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1012 ChrgNowCurnt_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgNowCurnt_B_Dsply 1; +BA_ "GenSigSendType" SG_ 1012 ChrgLocSaved_B_Dsply 3; +BA_ "UsedOnPgmDBC" SG_ 1012 ChrgLocSaved_B_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocSaved_B_Dsply 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1012 ChrgLocSaved_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocSaved_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLongPostv_B_Sav 1; +BA_ "UsedOnPgmDBC" SG_ 1012 ChrgLocLongPostv_B_Sav 1; +BA_ "CrossOver_InfoCAN" SG_ 1012 ChrgLocLongPostv_B_Sav 1; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLongPostv_B_Sav 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLongFrct_An_Sav 1; +BA_ "GenSigStartValue" SG_ 1012 ChrgLocLongFrct_An_Sav 1048575; +BA_ "GenSigStartValueInteger" SG_ 1012 ChrgLocLongFrct_An_Sav 1048575; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLongFrct_An_Sav 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLongDeg_An_Sav 1; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLongDeg_An_Sav 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLattPostv_B_Sav 1; +BA_ "UsedOnPgmDBC" SG_ 1012 ChrgLocLattPostv_B_Sav 1; +BA_ "CrossOver_InfoCAN" SG_ 1012 ChrgLocLattPostv_B_Sav 1; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLattPostv_B_Sav 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLattFrct_An_Sav 1; +BA_ "GenSigStartValue" SG_ 1012 ChrgLocLattFrct_An_Sav 1048575; +BA_ "GenSigStartValueInteger" SG_ 1012 ChrgLocLattFrct_An_Sav 1048575; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLattFrct_An_Sav 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocLattDeg_An_Sav 1; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocLattDeg_An_Sav 1; +BA_ "U_P702_MY2021_Tx" SG_ 1012 ChrgLocId_D_Sav 1; +BA_ "GenSigSendType" SG_ 1012 ChrgLocId_D_Sav 3; +BA_ "ECGUsedRxSignal" SG_ 1012 ChrgLocId_D_Sav 1; +BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLongPostv_B_Uns 1; +BA_ "UsedOnPgmDBC" SG_ 1011 ChrgLocLongPostv_B_Uns 1; +BA_ "CrossOver_InfoCAN" SG_ 1011 ChrgLocLongPostv_B_Uns 1; +BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLongPostv_B_Uns 1; +BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLongFrct_An_Uns 1; +BA_ "GenSigStartValue" SG_ 1011 ChrgLocLongFrct_An_Uns 1048575; +BA_ "GenSigStartValueInteger" SG_ 1011 ChrgLocLongFrct_An_Uns 1048575; +BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLongFrct_An_Uns 1; +BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLongDeg_An_Uns 1; +BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLongDeg_An_Uns 1; +BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLattPostv_B_Uns 1; +BA_ "UsedOnPgmDBC" SG_ 1011 ChrgLocLattPostv_B_Uns 1; +BA_ "CrossOver_InfoCAN" SG_ 1011 ChrgLocLattPostv_B_Uns 1; +BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLattPostv_B_Uns 1; +BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLattFrct_An_Uns 1; +BA_ "GenSigStartValue" SG_ 1011 ChrgLocLattFrct_An_Uns 1048575; +BA_ "GenSigStartValueInteger" SG_ 1011 ChrgLocLattFrct_An_Uns 1048575; +BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLattFrct_An_Uns 1; +BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocLattDeg_An_Uns 1; +BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocLattDeg_An_Uns 1; +BA_ "U_P702_MY2021_Tx" SG_ 1011 ChrgLocId_D_Uns 1; +BA_ "GenSigSendType" SG_ 1011 ChrgLocId_D_Uns 3; +BA_ "ECGUsedRxSignal" SG_ 1011 ChrgLocId_D_Uns 1; +BA_ "U_P702_MY2021_Tx" SG_ 871 BattElecPerf_D_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 871 BattElecPerf_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 871 BattChrgTrgtLPt_T_Est 1; +BA_ "ECGUsedRxSignal" SG_ 871 BattChrgTrgtLPt_T_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 871 BattChrgTrgSocPt_T_Est 1; +BA_ "ECGUsedRxSignal" SG_ 871 BattChrgTrgSocPt_T_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 871 BattChrgCmpltPt_T_Est 1; +BA_ "ECGUsedRxSignal" SG_ 871 BattChrgCmpltPt_T_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 786 RgenTrip_Pc_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 786 RgenTrip_Pc_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 786 RgenTrip_Pc_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 786 RgenTrip_L_Dsply 1; +BA_ "GenSigStartValue" SG_ 786 RgenTrip_L_Dsply 65535; +BA_ "GenSigStartValueInteger" SG_ 786 RgenTrip_L_Dsply 65535; +BA_ "CrossOver_InfoCAN" SG_ 786 RgenTrip_L_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 786 RgenTrip_L_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 786 ChrgStat_D_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 786 ChrgStat_D_Dsply 1; +BA_ "UsedOnPgmDBC" SG_ 72 immoTarget2Status 1; +BA_ "UsedOnPgmDBC" SG_ 72 immoTarget2Data 1; +BA_ "UsedOnPgmDBC" SG_ 72 immoTarget2Cmd 1; +BA_ "U_P702_MY2021_Rx" SG_ 912 CabnEvapSovFront_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 912 BattChlrSov_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 912 BattTracClntVlv_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 874 BattTracShrtGrnd_D_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 874 BattTracShrtBatt_D_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 874 BattTracOpnCirct_D_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 874 BattChlrShrtGrnd_D_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 874 BattChlrShrtBatt_D_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 874 BattChlrOpnCirct_D_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 651 TelematicsSrvc_D_St 1; +BA_ "ECGUsedTxSignal" SG_ 651 OfbChrgSetSync_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgToPcWknd_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgToPcWknd_D_Actl 1; +BA_ "ECGUsedTxSignal" SG_ 529 OnbChrgToPcWknd_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgToPcWkdy_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgToPcWkdy_D_Actl 1; +BA_ "ECGUsedTxSignal" SG_ 529 OnbChrgToPcWkdy_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgSetNow_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgSetDelete_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgSetDelete_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgPrflWknd_No_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgPrflWkdy_No_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgPrflUpdate_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgPrflUpdate_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgLocIdUns_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgLocIdUns_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 529 OnbChrgLocIdTrgt_No_Rq 1; +BA_ "MetaData" SG_ 529 OnbChrgLocIdTrgt_No_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 529 OnbChrgLocIdTrgt_No_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 529 OnbChrgLocIdTrgt_No_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 66 immoControlData_T2 1; +BA_ "ContentDependant" SG_ 66 immoControlData_T2 1; +BA_ "U_P702_MY2021_Rx" SG_ 66 immoControlCmd_T2 1; +BA_ "ContentDependant" SG_ 66 immoControlCmd_T2 1; +BA_ "U_P702_MY2021_Rx" SG_ 2610971864 PARSEDPhysGWM_ECGtoHPCM 1; +BA_ "GenSigSendType" SG_ 2610971864 PARSEDPhysGWM_ECGtoHPCM 3; +BA_ "ECGUsedTxSignal" SG_ 2610971864 PARSEDPhysGWM_ECGtoHPCM 1; +BA_ "ECGUsedTxSignal" SG_ 2612002008 PARSEDFuncGWM_ECG 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 2612002008 PARSEDFuncGWM_ECG 1; +BA_ "U_P702_MY2021_Rx" SG_ 2612002008 PARSEDFuncGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2612002008 PARSEDFuncGWM_ECG 3; +BA_ "U_P702_MY2021_Rx" SG_ 2609923288 OTAPhysGWM_ECGtoHPCM 1; +BA_ "GenSigSendType" SG_ 2609923288 OTAPhysGWM_ECGtoHPCM 3; +BA_ "ECGUsedTxSignal" SG_ 2609923288 OTAPhysGWM_ECGtoHPCM 1; +BA_ "ECGUsedTxSignal" SG_ 2610953432 OTAFuncGWM_ECG 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 2610953432 OTAFuncGWM_ECG 1; +BA_ "U_P702_MY2021_Rx" SG_ 2610953432 OTAFuncGWM_ECG 1; +BA_ "GenSigSendType" SG_ 2610953432 OTAFuncGWM_ECG 3; +BA_ "GenSigSendType" SG_ 2022 TesterPhysicalReqSOBDMC 3; +BA_ "U_P702_MY2021_Rx" SG_ 2022 TesterPhysicalReqSOBDMC 1; +BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Vdop 1; +BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Speed 1; +BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Sat_num_in_view 1; +BA_ "U_P702_MY2021_Rx" SG_ 1124 GPS_Sat_num_in_view 1; +BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_MSL_altitude 1; +BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Heading 1; +BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_Hdop 1; +BA_ "CrossOver_InfoCAN" SG_ 1124 GPS_dimension 1; +BA_ "U_P702_MY2021_Rx" SG_ 1124 GPS_dimension 1; +BA_ "U_P702_MY2021_Rx" SG_ 1119 CoolFanDcdc_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1119 DcdcClntFlw_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkYr_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkScnd_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkMnte_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkHr_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 132 GlblClkDay_No_Actl 1; +BA_ "GenSigSendType" SG_ 1990 TesterPhysicalReqSODR 3; +BA_ "GenSigSendType" SG_ 1892 TesterPhysicalReqCCM 3; +BA_ "GenSigSendType" SG_ 1798 TesterPhysicalReqIPMA 3; +BA_ "GenSigStartValueInteger" SG_ 1123 GpsUtcYr_No_Actl 0; +BA_ "CrossOver_InfoCAN" SG_ 1123 GpsUtcYr_No_Actl 1; +BA_ "GenSigStartValue" SG_ 1123 GpsUtcMnth_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1123 GpsUtcMnth_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 GpsUtcMnth_No_Actl 1; +BA_ "GenSigStartValue" SG_ 1123 GpsUtcDay_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1123 GpsUtcDay_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 GpsUtcDay_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_UTC_seconds 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_UTC_minutes 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_UTC_hours 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_Pdop 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_Compass_direction 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 GPS_Actual_vs_Infer_pos 1; +BA_ "CrossOver_InfoCAN" SG_ 1123 Gps_B_Falt 1; +BA_ "CrossOver_InfoCAN" SG_ 1122 GpsHsphLongEast_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1122 GpsHsphLattSth_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Longitude_Minutes 1; +BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Longitude_Min_dec 1; +BA_ "GenSigStartValueInteger" SG_ 1122 GPS_Longitude_Degrees 179; +BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Longitude_Degrees 1; +BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Latitude_Minutes 1; +BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Latitude_Min_dec 1; +BA_ "CrossOver_InfoCAN" SG_ 1122 GPS_Latitude_Degrees 1; +BA_ "GenSigStartValue" SG_ 1003 PersNoPos_D_Actl 4; +BA_ "GenSigStartValueInteger" SG_ 1003 PersNoPos_D_Actl 4; +BA_ "CrossOver_InfoCAN" SG_ 1003 PersNoPos_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1003 PersSetupRestr_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1003 PersSetupAccessCtrl 1; +BA_ "CrossOver_InfoCAN" SG_ 1003 PersSetup_No_Actl 1; +BA_ "GenSigStartValue" SG_ 1003 PersConflict_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1003 PersConflict_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1003 PersConflict_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1003 AssocConfirm_D_Actl 1; +BA_ "MetaData" SG_ 1003 RecallEvent_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 1003 RecallEvent_No_Cnt 1; +BA_ "GenSigStartValue" SG_ 1003 PersNo_D_Actl 4; +BA_ "GenSigStartValueInteger" SG_ 1003 PersNo_D_Actl 4; +BA_ "CrossOver_InfoCAN" SG_ 1003 PersNo_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 994 PersStore_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 994 Pers4OptIn_B_Stats 1; +BA_ "WakeupSignal" SG_ 994 Pers4OptIn_B_Stats 1; +BA_ "CrossOver_InfoCAN" SG_ 994 Pers3OptIn_B_Stats 1; +BA_ "WakeupSignal" SG_ 994 Pers3OptIn_B_Stats 1; +BA_ "CrossOver_InfoCAN" SG_ 994 Pers2OptIn_B_Stats 1; +BA_ "WakeupSignal" SG_ 994 Pers2OptIn_B_Stats 1; +BA_ "CrossOver_InfoCAN" SG_ 994 Pers1OptIn_B_Stats 1; +BA_ "WakeupSignal" SG_ 994 Pers1OptIn_B_Stats 1; +BA_ "GenSigStartValue" SG_ 994 CtrStkPersIndex_D_Actl 4; +BA_ "GenSigStartValueInteger" SG_ 994 CtrStkPersIndex_D_Actl 4; +BA_ "CrossOver_InfoCAN" SG_ 994 CtrStkPersIndex_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 994 CtrStkFeatNoActl 1; +BA_ "CrossOver_InfoCAN" SG_ 994 CtrStkFeatConfigActl 1; +BA_ "CrossOver_InfoCAN" SG_ 994 CtrStkDsplyOp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 778 PrkAidFront_D_RqDrv 1; +BA_ "CrossOver_InfoCAN" SG_ 778 Cta_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 778 Cta_D_Rq 1; +BA_ "GenSigStartValue" SG_ 778 Cta_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 778 PrkAidRear_D_RqDrv 1; +BA_ "CrossOver_InfoCAN" SG_ 778 Sod_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 778 Sod_D_Rq 2; +BA_ "GenSigStartValue" SG_ 778 Sod_D_Rq 2; +BA_ "WakeupSignal" SG_ 549 Power_Up_Chime_Modules 1; +BA_ "WakeupSignal" SG_ 551 Cntr_Plg_Mode_Cmd 1; +BA_ "GenSigStartValue" SG_ 551 Btt_L_Actl2 30; +BA_ "GenSigStartValueInteger" SG_ 551 Btt_L_Actl2 126; +BA_ "WakeupSignal" SG_ 551 Em_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1010 CbdblActv_B_RqAdas 1; +BA_ "UsedOnPgmDBC" SG_ 1010 CbdblActv_B_RqAdas 1; +BA_ "U_P702_MY2021_Rx" SG_ 1010 LightRng_L_Max 1; +BA_ "U_P702_MY2021_Rx" SG_ 1010 LightPathOffst_L_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1010 LightPathOffst_L_Actl 512; +BA_ "U_P702_MY2021_Rx" SG_ 1010 LightPath_An_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1010 LightPath_An_Actl 1000; +BA_ "U_P702_MY2021_Rx" SG_ 1010 LightCurv_NoRate_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1010 LightCurv_NoRate_Actl 4096; +BA_ "U_P702_MY2021_Rx" SG_ 1010 LightCurv_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1010 LightCurv_No_Actl 1000; +BA_ "GenSigStartValue" SG_ 1070 BattULo24_Te_Actl 127; +BA_ "GenSigStartValueInteger" SG_ 1070 BattULo24_Te_Actl 127; +BA_ "UsedOnPgmDBC" SG_ 1070 BattULo24_Te_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24State_D_Qlty 1; +BA_ "GenSigStartValue" SG_ 1070 BattULo24State_D_Qlty 1; +BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24Soc_Pc_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1070 BattULo24Soc_Pc_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24_I_Actl 1; +BA_ "GenSigStartValue" SG_ 1070 BattULo24_I_Actl 8192; +BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24_B_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 1070 BattULo24_Ah_DeltaRide 1; +BA_ "GenSigStartValue" SG_ 1070 BattULo24_Ah_DeltaRide 12800; +BA_ "GenSigStartValueInteger" SG_ 1186 SelDrvMdeAwd2_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1186 SelDrvMdeAwd2_D_Stat 31; +BA_ "U_CX727_MY2021_Rx" SG_ 1186 SelDrvMdeAwd2_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1186 SelDrvMdeAwd2_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1186 SelDrvMdeAwd2_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1186 RearDiffLckMsg_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1186 RearDiffLckLamp_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1186 RearDiffLckLamp_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1186 RearDiffLck_Tq_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1186 RearDiffLck_Tq_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1186 RearDiffLck_Tq_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1186 RearDiffFalt_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1186 RearDiffFalt_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1186 LsdSrvcRqd_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1186 LsdSrvcRqd_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 611 AwdSys_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdSys_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdSys_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdStat_D_RqDsply 1; +BA_ "ContentDependant" SG_ 611 AwdStat_D_RqDsply 1; +BA_ "U_P702_MY2021_Rx" SG_ 611 AwdStat_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdStat_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdStat_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdLck_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 611 AwdLck_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 611 AwdLck_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdLck_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdLck_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdSrvcRqd_B_Rq 1; +BA_ "ContentDependant" SG_ 611 AwdSrvcRqd_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 611 AwdSrvcRqd_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdSrvcRqd_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdSrvcRqd_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 NtrlTowAvail_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdLck_Tq_Rq 1; +BA_ "ContentDependant" SG_ 611 AwdLck_Tq_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 611 AwdLck_Tq_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdLck_Tq_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 611 TrnAout_Tq_RqMx 1; +BA_ "GenSigStartValueInteger" SG_ 611 TrnAout_Tq_RqMx 8191; +BA_ "GenSigStartValue" SG_ 611 TrnAout_Tq_RqMx 8191; +BA_ "U_P702_MY2021_Rx" SG_ 611 TrnAout_Tq_RqMx 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 TrnAout_Tq_RqMx 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 TrnAout_Tq_RqMx 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdOffRoadMode_D_Stats 1; +BA_ "UsedOnPgmDBC" SG_ 611 AwdOffRoadMode_D_Stats 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdOffRoadMode_D_Stats 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdLoLamp_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdLoLamp_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdHiLamp_D_RqDsply 1; +BA_ "U_P702_MY2021_Rx" SG_ 611 AwdHiLamp_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdHiLamp_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdAutoLamp_D_RqDsply 1; +BA_ "U_P702_MY2021_Rx" SG_ 611 AwdAutoLamp_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdAutoLamp_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 611 Awd2wdLamp_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 Awd2wdLamp_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 611 AwdRnge_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 611 AwdRnge_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 611 AwdRnge_D_Actl 7; +BA_ "GenSigStartValue" SG_ 611 AwdRnge_D_Actl 7; +BA_ "U_P702_MY2021_Rx" SG_ 611 AwdRnge_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 611 AwdRnge_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 611 AwdRnge_D_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 611 AwdRnge_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_GWOnBoardTester 255; +BA_ "ContentDependant" SG_ 1461 PSCM_GWOnBoardTester 1; +BA_ "GenSigStartValue" SG_ 1461 PSCM_GWOnBoardTester 255; +BA_ "U_P702_MY2021_Rx" SG_ 1461 PSCM_GWOnBoardTester 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_GWOnBoardTester 1; +BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_GWOnBoardTester 1; +BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_GWNMProxy 255; +BA_ "ContentDependant" SG_ 1461 PSCM_GWNMProxy 1; +BA_ "GenSigStartValue" SG_ 1461 PSCM_GWNMProxy 255; +BA_ "U_P702_MY2021_Rx" SG_ 1461 PSCM_GWNMProxy 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_GWNMProxy 1; +BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_GWNMProxy 1; +BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMReserved4 255; +BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMReserved4 1; +BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMReserved4 255; +BA_ "U_P702_MY2021_Rx" SG_ 1461 PSCM_AutoSarNMReserved4 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved4 1; +BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved4 1; +BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMReserved3 255; +BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMReserved3 1; +BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMReserved3 255; +BA_ "U_P702_MY2021_Rx" SG_ 1461 PSCM_AutoSarNMReserved3 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved3 1; +BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved3 1; +BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMReserved2 255; +BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMReserved2 1; +BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMReserved2 255; +BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved2 1; +BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved2 1; +BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMReserved1 255; +BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMReserved1 1; +BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMReserved1 255; +BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved1 1; +BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMReserved1 1; +BA_ "GenSigStartValueInteger" SG_ 1461 PSCM_AutoSarNMNodeId 181; +BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMNodeId 1; +BA_ "GenSigStartValue" SG_ 1461 PSCM_AutoSarNMNodeId 181; +BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMNodeId 1; +BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMNodeId 1; +BA_ "ContentDependant" SG_ 1461 PSCM_AutoSarNMControl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMControl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1461 PSCM_AutoSarNMControl 1; +BA_ "GenSigStartValueInteger" SG_ 1047 TrlrAnOffst_An2_Calc 128; +BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAnOffst_An2_Calc 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAn_An_WarnCalc 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAn_An_MxCalc 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidTrlrId_No_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidTrgtId_No_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidSetup_D2_Stat 1; +BA_ "GenSigSendType" SG_ 1047 TrlrAidEnbl_D2_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 1047 TrlrAidEnbl_D2_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1047 TrlrAidEnbl_D2_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidEnbl_D2_Stat 1; +BA_ "GenSigSendType" SG_ 1047 TrlrAidMsgTxt_D2_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 1047 TrlrAidMsgTxt_D2_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 TrlrAidMsgTxt_D2_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1047 EsaOn_B_Stat 1; +BA_ "GenSigStartValue" SG_ 1047 EsaOn_B_Stat 1; +BA_ "GenSigSendType" SG_ 1047 EsaOn_B_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1047 EsaOn_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 EsaOn_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 HitchToTrlrAxle_L_Calc 1; +BA_ "GenSigSendType" SG_ 1047 SelDrvMdeSte_D_Stat 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1047 SelDrvMdeSte_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1047 SelDrvMdeSte_D_Stat 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1047 SelDrvMdeSte_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1047 SelDrvMdeSte_D_Stat 1; +BA_ "GenSigSendType" SG_ 972 LatCtlSte_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 972 LatCtlSte_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 972 LatCtlSte_D_Stat 1; +BA_ "GenSigSendType" SG_ 972 LatCtlLim_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 972 LatCtlLim_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 972 LatCtlLim_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 972 LatCtlCpbltyDStat_No_Cnt 1; +BA_ "MetaData" SG_ 972 LatCtlCpbltyDStat_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 972 LatCtlCpbltyDStat_No_Cs 1; +BA_ "MetaData" SG_ 972 LatCtlCpbltyDStat_No_Cs 1; +BA_ "GenSigStartValueInteger" SG_ 972 TrlrAn_An_TrgtCalc 128; +BA_ "U_P702_MY2021_Tx" SG_ 972 TrlrAn_An_TrgtCalc 1; +BA_ "U_P702_MY2021_Rx" SG_ 972 LsmcBrkDecelEnbl_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 972 LsmcBrkDecelEnbl_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 972 TjaHandsOnCnfdnc_B_Est 1; +BA_ "GenSigStartValue" SG_ 972 TjaHandsOnCnfdnc_B_Est 1; +BA_ "U_CX727_MY2021_Tx" SG_ 972 TjaHandsOnCnfdnc_B_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 972 TjaHandsOnCnfdnc_B_Est 1; +BA_ "CrossOver_InfoCAN" SG_ 972 LaHandsOff_B_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 972 LaHandsOff_B_Actl 1; +BA_ "GenSigStartValue" SG_ 972 LaHandsOff_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 972 LaHandsOff_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 972 LaHandsOff_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 972 LaActDeny_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 972 LaActDeny_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 972 LaActDeny_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 972 LaActAvail_D_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 972 LaActAvail_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 972 LaActAvail_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 972 LsmcBrk_Tq_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 972 LsmcBrk_Tq_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 130 TrlrHitchLamp_D_Rqst 1; +BA_ "UsedOnPgmDBC" SG_ 130 TrlrHitchLamp_D_Rqst 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 TrlrHitchLamp_D_Rqst 1; +BA_ "CrossOver_InfoCAN" SG_ 130 VehVTrlrAid_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 130 VehVTrlrAid_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 130 VehVTrlrAid_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 VehVTrlrAid_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 130 Veh_V_RqMxTrlrAid 255; +BA_ "GenSigStartValue" SG_ 130 Veh_V_RqMxTrlrAid 255; +BA_ "U_P702_MY2021_Rx" SG_ 130 Veh_V_RqMxTrlrAid 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 130 Veh_V_RqMxTrlrAid 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 Veh_V_RqMxTrlrAid 1; +BA_ "UsedOnPgmDBC" SG_ 130 DrvSteActv_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 130 DrvSteActv_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 DrvSteActv_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 130 DrvSte_Tq_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 130 DrvSte_Tq_Actl 128; +BA_ "U_P702_MY2021_Rx" SG_ 130 DrvSte_Tq_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 DrvSte_Tq_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SteMdule_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SteMdule_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 130 SteMdule_U_Meas 1; +BA_ "GenSigStartValueInteger" SG_ 130 SteMdule_U_Meas 255; +BA_ "GenSigStartValue" SG_ 130 SteMdule_U_Meas 255; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SteMdule_U_Meas 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SteMdule_U_Meas 1; +BA_ "UsedOnPgmDBC" SG_ 130 SteMdule_I_Est 1; +BA_ "GenSigStartValueInteger" SG_ 130 SteMdule_I_Est 4095; +BA_ "GenSigStartValue" SG_ 130 SteMdule_I_Est 4095; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SteMdule_I_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SteMdule_I_Est 1; +BA_ "CrossOver_InfoCAN" SG_ 130 EPAS_Failure 1; +BA_ "UsedOnPgmDBC" SG_ 130 EPAS_Failure 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 EPAS_Failure 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 EPAS_Failure 1; +BA_ "UsedOnPgmDBC" SG_ 130 SteeringColumnTorque 1; +BA_ "GenSigStartValueInteger" SG_ 130 SteeringColumnTorque 254; +BA_ "GenSigStartValue" SG_ 130 SteeringColumnTorque 254; +BA_ "U_CX727_MY2021_Rx" SG_ 130 SteeringColumnTorque 1; +BA_ "U_P702_MY2021_Rx" SG_ 130 SteeringColumnTorque 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SteeringColumnTorque 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SteeringColumnTorque 1; +BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat6 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat6 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat6 1; +BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat5 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat5 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat5 1; +BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat4 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat4 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat4 1; +BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat3 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat3 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat3 1; +BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat2 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat2 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat2 1; +BA_ "UsedOnPgmDBC" SG_ 130 SAPPAngleControlStat1 1; +BA_ "U_CX727_MY2021_Tx" SG_ 130 SAPPAngleControlStat1 1; +BA_ "U_P702_MY2021_Tx" SG_ 130 SAPPAngleControlStat1 1; +BA_ "UsedOnPgmDBC" SG_ 126 StePw_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 126 StePw_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 126 StePw_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 126 StePw_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 126 StePinRelInit_An_Sns 1; +BA_ "GenSigStartValueInteger" SG_ 126 StePinRelInit_An_Sns 65535; +BA_ "ContentDependant" SG_ 126 StePinRelInit_An_Sns 1; +BA_ "GenSigStartValue" SG_ 126 StePinRelInit_An_Sns 65535; +BA_ "U_P702_MY2021_Rx" SG_ 126 StePinRelInit_An_Sns 1; +BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinRelInit_An_Sns 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 126 StePinRelInit_An_Sns 1; +BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinRelInit_An_Sns 1; +BA_ "U_P702_MY2021_Tx" SG_ 126 StePinRelInit_An_Sns 1; +BA_ "CrossOver_InfoCAN" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "GenSigStartValue" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "U_P702_MY2021_Tx" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "ECGUsedRxSignal" SG_ 126 StePinCompAnEst_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 126 StePinComp_An_Est 16000; +BA_ "U_P702_MY2021_Rx" SG_ 126 StePinComp_An_Est 1; +BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinComp_An_Est 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 126 StePinComp_An_Est 1; +BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinComp_An_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 126 StePinComp_An_Est 1; +BA_ "ECGUsedRxSignal" SG_ 126 StePinComp_An_Est 1; +BA_ "UsedOnPgmDBC" SG_ 126 StePinAn_No_Cs 1; +BA_ "ContentDependant" SG_ 126 StePinAn_No_Cs 1; +BA_ "MetaData" SG_ 126 StePinAn_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 126 StePinAn_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinAn_No_Cs 1; +BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinAn_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 126 StePinAn_No_Cs 1; +BA_ "CrossOver_InfoCAN" SG_ 126 StePinAn_No_Cnt 1; +BA_ "MetaData" SG_ 126 StePinAn_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 126 StePinAn_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 126 StePinAn_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 126 StePinAn_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 126 StePinAn_No_Cnt 1; +BA_ "GenSigStartValueInteger" SG_ 1430 ABS_GWOnBoardTester 255; +BA_ "ContentDependant" SG_ 1430 ABS_GWOnBoardTester 1; +BA_ "GenSigStartValue" SG_ 1430 ABS_GWOnBoardTester 255; +BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_GWOnBoardTester 1; +BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_GWOnBoardTester 1; +BA_ "GenSigStartValueInteger" SG_ 1430 ABS_GWNMProxy 255; +BA_ "ContentDependant" SG_ 1430 ABS_GWNMProxy 1; +BA_ "GenSigStartValue" SG_ 1430 ABS_GWNMProxy 255; +BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_GWNMProxy 1; +BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_GWNMProxy 1; +BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMReserved4 255; +BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMReserved4 1; +BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMReserved4 255; +BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved4 1; +BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved4 1; +BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMReserved3 255; +BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMReserved3 1; +BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMReserved3 255; +BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved3 1; +BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved3 1; +BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMReserved2 255; +BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMReserved2 1; +BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMReserved2 255; +BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved2 1; +BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved2 1; +BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMReserved1 255; +BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMReserved1 1; +BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMReserved1 255; +BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved1 1; +BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMReserved1 1; +BA_ "GenSigStartValueInteger" SG_ 1430 ABS_AutoSarNMNodeId 150; +BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMNodeId 1; +BA_ "GenSigStartValue" SG_ 1430 ABS_AutoSarNMNodeId 150; +BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMNodeId 1; +BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMNodeId 1; +BA_ "ContentDependant" SG_ 1430 ABS_AutoSarNMControl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1430 ABS_AutoSarNMControl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1430 ABS_AutoSarNMControl 1; +BA_ "GenSigStartValueInteger" SG_ 1200 HsaTrnAout_Tq_Rq 32768; +BA_ "U_CX727_MY2021_Tx" SG_ 1200 HsaTrnAout_Tq_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1200 HsaTrnAout_Tq_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1200 BrkBstrVac_P_Actl 127; +BA_ "GenSigStartValue" SG_ 1200 BrkBstrVac_P_Actl 127; +BA_ "U_P702_MY2021_Rx" SG_ 1200 BrkBstrVac_P_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1200 BrkBstrVac_P_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1200 BrkBstrVac_P_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1200 BrkBstrVac_P_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1200 YawStabilityIndex 256; +BA_ "U_CX727_MY2021_Rx" SG_ 1200 YawStabilityIndex 1; +BA_ "U_P702_MY2021_Rx" SG_ 1200 YawStabilityIndex 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1200 YawStabilityIndex 1; +BA_ "U_P702_MY2021_Tx" SG_ 1200 YawStabilityIndex 1; +BA_ "U_P702_MY2021_Rx" SG_ 1200 BrkTot_Tq_RqDrv 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1200 BrkTot_Tq_RqDrv 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1200 BrkTot_Tq_RqDrv 1; +BA_ "U_P702_MY2021_Tx" SG_ 1200 BrkTot_Tq_RqDrv 1; +BA_ "MetaData" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1200 BrkTotTqRqDrv_No_Cnt 1; +BA_ "MetaData" SG_ 1200 BrkTotTqRqDrv_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 1200 BrkTotTqRqDrv_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1200 BrkTotTqRqDrv_No_Cs 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1200 BrkTotTqRqDrv_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 1200 BrkTotTqRqDrv_No_Cs 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1200 HsaStat_D_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1200 HsaStat_D_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos12_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos12_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos12_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos12_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos12_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos11_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos11_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos11_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos11_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos11_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos10_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos10_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos10_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos10_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos10_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos09_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos09_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos09_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos09_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos09_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos08_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos08_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos08_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos08_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos08_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos07_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos07_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos07_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos07_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos07_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos06_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos06_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos06_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos06_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos06_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos05_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos05_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos05_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos05_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos05_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos04_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos04_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos04_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos04_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos04_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos03_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos03_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos03_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos03_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos03_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos02_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos02_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos02_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos02_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos02_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1102 SelDrvMdePos01_D_Stat 31; +BA_ "GenSigStartValue" SG_ 1102 SelDrvMdePos01_D_Stat 31; +BA_ "GenSigSendType" SG_ 1102 SelDrvMdePos01_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1102 SelDrvMdePos01_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1102 SelDrvMdePos01_D_Stat 1; +BA_ "GenSigSendType" SG_ 1056 AutoEpbMsgTxt_D_Rq 3; +BA_ "GenSigSendType" SG_ 1056 AutoEpbDsply_D_Stat 3; +BA_ "GenSigSendType" SG_ 1056 AutoEpbButtnOn_B_Stat 3; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos12_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos12_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos12_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos11_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos11_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos11_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos10_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos10_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos10_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos09_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos09_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos09_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos08_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos08_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos08_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos07_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos07_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos07_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos06_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos06_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos06_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos05_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos05_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos05_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos04_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos04_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos04_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos03_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos03_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos03_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos02_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos02_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos02_B_Avail 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePos01_B_Avail 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePos01_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePos01_B_Avail 1; +BA_ "GenSigStartValueInteger" SG_ 1056 ActvDrvMde_D2_Stat 31; +BA_ "GenSigStartValue" SG_ 1056 ActvDrvMde_D2_Stat 31; +BA_ "GenSigSendType" SG_ 1056 ActvDrvMde_D2_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 ActvDrvMde_D2_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 ActvDrvMde_D2_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1056 SelDrvMde_D2_Rq 31; +BA_ "GenSigStartValue" SG_ 1056 SelDrvMde_D2_Rq 31; +BA_ "GenSigSendType" SG_ 1056 SelDrvMde_D2_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMde_D2_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMde_D2_Rq 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdePt_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 1056 SelDrvMdePt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1056 SelDrvMdePt_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdePt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdePt_D_Rq 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMdeMsgTxt_D_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMdeMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMdeMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 1056 SelDrvMde_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 SelDrvMde_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 SelDrvMde_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1056 AwdMde_D_RqBrk 5; +BA_ "GenSigStartValue" SG_ 1056 AwdMde_D_RqBrk 5; +BA_ "GenSigSendType" SG_ 1056 AwdMde_D_RqBrk 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1056 AwdMde_D_RqBrk 1; +BA_ "U_P702_MY2021_Tx" SG_ 1056 AwdMde_D_RqBrk 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 AirDamUp_B_RqBrk 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1054 AirDamUp_B_RqBrk 1; +BA_ "U_P702_MY2021_Rx" SG_ 1054 AirDamUp_B_RqBrk 1; +BA_ "GenSigSendType" SG_ 1054 AirDamUp_B_RqBrk 3; +BA_ "GenSigSendType" SG_ 1054 RbaBrk_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 RbaBrk_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 RbaBrk_D_Stat 1; +BA_ "GenSigSendType" SG_ 1054 SelDrvMdeChassis2_D_Rq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1054 SelDrvMdeChassis2_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1054 SelDrvMdeChassis2_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 SelDrvMdeChassis2_D_Rq 1; +BA_ "GenSigSendType" SG_ 1054 TrailCtl_D_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 1054 TrailCtl_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1054 TrailCtl_D_Stat 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 TrailCtl_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 TrailCtl_D_Stat 1; +BA_ "GenSigSendType" SG_ 1054 TrailCtlMsgTxt_D_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 TrailCtlMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 TrailCtlMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 1054 BrkBstrVac_D_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 1054 BrkBstrVac_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1054 BrkBstrVac_D_Stat 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 BrkBstrVac_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 BrkBstrVac_D_Stat 1; +BA_ "GenSigSendType" SG_ 1054 DrvSlipCtlOffLamp_D_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 DrvSlipCtlOffLamp_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 DrvSlipCtlOffLamp_D_Rq 1; +BA_ "GenSigSendType" SG_ 1054 DrvSlipCtlMdeMsg_D_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 DrvSlipCtlMdeMsg_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 DrvSlipCtlMdeMsg_D_Rq 1; +BA_ "ECGUsedRxSignal" SG_ 1054 DrvSlipCtlMdeMsg_D_Rq 1; +BA_ "GenSigSendType" SG_ 1054 AutoHoldMsgTxt_D_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 AutoHoldMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 AutoHoldMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 1054 CtaBrk_D_Stat 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 CtaBrk_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 CtaBrk_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1054 SelDrvMdeAwd_D_Rq 31; +BA_ "GenSigStartValue" SG_ 1054 SelDrvMdeAwd_D_Rq 31; +BA_ "GenSigSendType" SG_ 1054 SelDrvMdeAwd_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 1054 SelDrvMdeAwd_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 SelDrvMdeAwd_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1054 AutoHoldSwMde_B_Ind 1; +BA_ "ContentDependant" SG_ 1054 AutoHoldSwMde_B_Ind 1; +BA_ "GenSigSendType" SG_ 1054 AutoHoldSwMde_B_Ind 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 AutoHoldSwMde_B_Ind 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 AutoHoldSwMde_B_Ind 1; +BA_ "GenSigSendType" SG_ 1054 AutoHoldMde_D_Ind 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 AutoHoldMde_D_Ind 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 AutoHoldMde_D_Ind 1; +BA_ "GenSigSendType" SG_ 1054 SelDrvMdeChassis_D_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 SelDrvMdeChassis_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 SelDrvMdeChassis_D_Rq 1; +BA_ "GenSigSendType" SG_ 1054 ApaBrk_D_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 1054 ApaBrk_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1054 ApaBrk_D_Stat 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1054 ApaBrk_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1054 ApaBrk_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 HsaMde_D_Mem 1; +BA_ "UsedOnPgmDBC" SG_ 1046 HsaMde_D_Mem 1; +BA_ "GenSigStartValueInteger" SG_ 1046 HsaMde_D_Mem 1; +BA_ "GenSigStartValue" SG_ 1046 HsaMde_D_Mem 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 HsaMde_D_Mem 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 HsaMde_D_Mem 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 BrkBstrVac_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1046 BrkBstrVac_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1046 BrkBstrVac_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 BrkBstrVac_B_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 BrkBstrVac_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 BrkBstrVac_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 HdcMde_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1046 HdcMde_D_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 HdcMde_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 HdcMde_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1046 RearDiffLck_Tq2_RqMx 4094; +BA_ "GenSigStartValue" SG_ 1046 RearDiffLck_Tq2_RqMx 4094; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 RearDiffLck_Tq2_RqMx 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 RearDiffLck_Tq2_RqMx 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 TRLR_SWAY_EVNT_IN_PROG 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 TRLR_SWAY_EVNT_IN_PROG 1; +BA_ "ECGUsedRxSignal" SG_ 1046 TRLR_SWAY_EVNT_IN_PROG 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 TRLR_SWAY_CONFIG_STAT 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 TRLR_SWAY_CONFIG_STAT 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 TCMode 1; +BA_ "UsedOnPgmDBC" SG_ 1046 TCMode 1; +BA_ "ContentDependant" SG_ 1046 TCMode 1; +BA_ "U_P702_MY2021_Rx" SG_ 1046 TCMode 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 TCMode 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 TCMode 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 TCMode 1; +BA_ "ECGUsedRxSignal" SG_ 1046 TCMode 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 DrvSlipCtlLamp_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1046 DrvSlipCtlLamp_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1046 DrvSlipCtlLamp_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 DrvSlipCtlLamp_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvSlipCtlLamp_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvSlipCtlLamp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 Abs_B_Falt 1; +BA_ "UsedOnPgmDBC" SG_ 1046 Abs_B_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 1046 Abs_B_Falt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 Abs_B_Falt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 Abs_B_Falt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 Abs_B_Falt 1; +BA_ "ECGUsedRxSignal" SG_ 1046 Abs_B_Falt 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 DrvSlipCtlMde_D_Ind 1; +BA_ "UsedOnPgmDBC" SG_ 1046 DrvSlipCtlMde_D_Ind 1; +BA_ "U_P702_MY2021_Rx" SG_ 1046 DrvSlipCtlMde_D_Ind 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 DrvSlipCtlMde_D_Ind 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvSlipCtlMde_D_Ind 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvSlipCtlMde_D_Ind 1; +BA_ "ECGUsedRxSignal" SG_ 1046 DrvSlipCtlMde_D_Ind 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 DrvAntiLckLamp_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1046 DrvAntiLckLamp_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1046 DrvAntiLckLamp_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1046 DrvAntiLckLamp_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvAntiLckLamp_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvAntiLckLamp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 BpedMove_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 1046 BpedMove_No_Cnt 1; +BA_ "MetaData" SG_ 1046 BpedMove_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 1046 BpedMove_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 BpedMove_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 BpedMove_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 StabCtlBrk_B_Avail 1; +BA_ "UsedOnPgmDBC" SG_ 1046 StabCtlBrk_B_Avail 1; +BA_ "GenSigStartValueInteger" SG_ 1046 StabCtlBrk_B_Avail 1; +BA_ "GenSigStartValue" SG_ 1046 StabCtlBrk_B_Avail 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 StabCtlBrk_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 StabCtlBrk_B_Avail 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 DrvHdcWarnInfo_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1046 DrvHdcWarnInfo_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvHdcWarnInfo_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvHdcWarnInfo_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 DrvHdcMsg_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1046 DrvHdcMsg_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvHdcMsg_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvHdcMsg_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 DrvHdcLampInfo_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1046 DrvHdcLampInfo_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 DrvHdcLampInfo_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 DrvHdcLampInfo_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 BpedMove_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1046 BpedMove_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1046 BpedMove_D_Actl 3; +BA_ "GenSigStartValue" SG_ 1046 BpedMove_D_Actl 3; +BA_ "U_P702_MY2021_Rx" SG_ 1046 BpedMove_D_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 BpedMove_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 BpedMove_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 ChimeBrk_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1046 ChimeBrk_B_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 ChimeBrk_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 ChimeBrk_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 BrkLamp_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1046 BrkLamp_B_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 BrkLamp_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 BrkLamp_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1046 HILL_DESC_MC 1; +BA_ "UsedOnPgmDBC" SG_ 1046 HILL_DESC_MC 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1046 HILL_DESC_MC 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 HILL_DESC_MC 1; +BA_ "U_P702_MY2021_Tx" SG_ 1046 RearDiffElckrOpen_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1045 VehStab_D_Stat 14; +BA_ "GenSigStartValue" SG_ 1045 VehStab_D_Stat 14; +BA_ "U_P702_MY2021_Rx" SG_ 1045 VehStab_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehStab_D_Stat 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehStab_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 VehStab_D_Stat 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1045 BrkFluidLvl_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 BrkFluidLvl_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1045 LsmcBrkDecel_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 LsmcBrkDecel_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1045 VehYawNonLin_W_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1045 VehYawNonLin_W_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1045 VehYawNonLin_W_Rq 4094; +BA_ "GenSigStartValue" SG_ 1045 VehYawNonLin_W_Rq 4094; +BA_ "U_P702_MY2021_Rx" SG_ 1045 VehYawNonLin_W_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehYawNonLin_W_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehYawNonLin_W_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 VehYawNonLin_W_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1045 VehYawLin_W_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1045 VehYawLin_W_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1045 VehYawLin_W_Rq 4094; +BA_ "GenSigStartValue" SG_ 1045 VehYawLin_W_Rq 4094; +BA_ "U_P702_MY2021_Rx" SG_ 1045 VehYawLin_W_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehYawLin_W_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehYawLin_W_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 VehYawLin_W_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1045 VehVActlBrk_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 1045 VehVActlBrk_No_Cs 1; +BA_ "MetaData" SG_ 1045 VehVActlBrk_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 1045 VehVActlBrk_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehVActlBrk_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1045 VehVActlBrk_No_Cs 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehVActlBrk_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 VehVActlBrk_No_Cs 1; +BA_ "CrossOver_InfoCAN" SG_ 1045 Veh_V_ActlBrk 1; +BA_ "UsedOnPgmDBC" SG_ 1045 Veh_V_ActlBrk 1; +BA_ "U_P702_MY2021_Rx" SG_ 1045 Veh_V_ActlBrk 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 Veh_V_ActlBrk 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1045 Veh_V_ActlBrk 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1045 Veh_V_ActlBrk 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 Veh_V_ActlBrk 1; +BA_ "CrossOver_InfoCAN" SG_ 1045 VehVActlBrk_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 1045 VehVActlBrk_No_Cnt 1; +BA_ "MetaData" SG_ 1045 VehVActlBrk_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 1045 VehVActlBrk_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehVActlBrk_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1045 VehVActlBrk_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehVActlBrk_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 VehVActlBrk_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 1045 VehVActlBrk_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 1045 VehVActlBrk_D_Qf 1; +BA_ "MetaData" SG_ 1045 VehVActlBrk_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 1045 VehVActlBrk_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1045 VehVActlBrk_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1045 VehVActlBrk_D_Qf 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1045 VehVActlBrk_D_Qf 1; +BA_ "U_P702_MY2021_Tx" SG_ 1045 VehVActlBrk_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 1044 StePinOffst_An_Est 1; +BA_ "GenSigStartValueInteger" SG_ 1044 StePinOffst_An_Est 65534; +BA_ "ContentDependant" SG_ 1044 StePinOffst_An_Est 1; +BA_ "GenSigStartValue" SG_ 1044 StePinOffst_An_Est 65533; +BA_ "U_CX727_MY2021_Rx" SG_ 1044 StePinOffst_An_Est 1; +BA_ "U_P702_MY2021_Rx" SG_ 1044 StePinOffst_An_Est 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1044 StePinOffst_An_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 1044 StePinOffst_An_Est 1; +BA_ "UsedOnPgmDBC" SG_ 1044 StePinOffst_No_Cs 1; +BA_ "ContentDependant" SG_ 1044 StePinOffst_No_Cs 1; +BA_ "MetaData" SG_ 1044 StePinOffst_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1044 StePinOffst_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 1044 StePinOffst_No_Cs 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1044 StePinOffst_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 1044 StePinOffst_No_Cs 1; +BA_ "CrossOver_InfoCAN" SG_ 1044 StePinOffst_No_Cnt 1; +BA_ "MetaData" SG_ 1044 StePinOffst_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1044 StePinOffst_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 1044 StePinOffst_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1044 StePinOffst_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1044 StePinOffst_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1044 StePinOffst_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1044 StePinOffst_D_Stat 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1044 StePinOffst_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1044 StePinOffst_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1042 VehRol_An_Dsply 64; +BA_ "GenSigStartValue" SG_ 1042 VehRol_An_Dsply 0; +BA_ "U_P702_MY2021_Tx" SG_ 1042 VehRol_An_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1042 VehPtch_An_Dsply 64; +BA_ "GenSigStartValue" SG_ 1042 VehPtch_An_Dsply 0; +BA_ "U_P702_MY2021_Rx" SG_ 1042 VehPtch_An_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1042 VehPtch_An_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1042 TrlrBrk_Pc_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 535 WhlRr_W_Meas 1; +BA_ "U_P702_MY2021_Rx" SG_ 535 WhlRr_W_Meas 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 535 WhlRr_W_Meas 1; +BA_ "U_CX727_MY2021_Rx" SG_ 535 WhlRr_W_Meas 1; +BA_ "U_CX727_MY2021_Tx" SG_ 535 WhlRr_W_Meas 1; +BA_ "U_P702_MY2021_Tx" SG_ 535 WhlRr_W_Meas 1; +BA_ "UsedOnPgmDBC" SG_ 535 WhlRl_W_Meas 1; +BA_ "U_P702_MY2021_Rx" SG_ 535 WhlRl_W_Meas 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 535 WhlRl_W_Meas 1; +BA_ "U_CX727_MY2021_Rx" SG_ 535 WhlRl_W_Meas 1; +BA_ "U_CX727_MY2021_Tx" SG_ 535 WhlRl_W_Meas 1; +BA_ "U_P702_MY2021_Tx" SG_ 535 WhlRl_W_Meas 1; +BA_ "UsedOnPgmDBC" SG_ 535 WhlFr_W_Meas 1; +BA_ "U_P702_MY2021_Rx" SG_ 535 WhlFr_W_Meas 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 535 WhlFr_W_Meas 1; +BA_ "U_CX727_MY2021_Rx" SG_ 535 WhlFr_W_Meas 1; +BA_ "U_CX727_MY2021_Tx" SG_ 535 WhlFr_W_Meas 1; +BA_ "U_P702_MY2021_Tx" SG_ 535 WhlFr_W_Meas 1; +BA_ "UsedOnPgmDBC" SG_ 535 WhlFl_W_Meas 1; +BA_ "U_P702_MY2021_Rx" SG_ 535 WhlFl_W_Meas 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 535 WhlFl_W_Meas 1; +BA_ "U_CX727_MY2021_Rx" SG_ 535 WhlFl_W_Meas 1; +BA_ "U_CX727_MY2021_Tx" SG_ 535 WhlFl_W_Meas 1; +BA_ "U_P702_MY2021_Tx" SG_ 535 WhlFl_W_Meas 1; +BA_ "ContentDependant" SG_ 534 BrkObdData_No_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 BrkObdData_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 BrkObdData_No_Actl 1; +BA_ "ContentDependant" SG_ 534 BrkObdIndex_No_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 BrkObdIndex_No_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 BrkObdIndex_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 534 WhlRotatRr_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 534 WhlRotatRr_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 534 WhlRotatRr_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlRotatRr_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 WhlRotatRr_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 534 WhlDirRr_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 534 WhlDirRr_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 534 WhlDirRr_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 534 WhlDirRr_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 534 WhlDirRr_D_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlDirRr_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 WhlDirRr_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 534 WhlDirRl_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 534 WhlDirRl_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 534 WhlDirRl_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 534 WhlDirRl_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 534 WhlDirRl_D_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlDirRl_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 WhlDirRl_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 534 WhlDirFr_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 534 WhlDirFr_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 534 WhlDirFr_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 534 WhlDirFr_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 534 WhlDirFr_D_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlDirFr_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 WhlDirFr_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 534 WhlDirFl_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 534 WhlDirFl_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 534 WhlDirFl_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 534 WhlDirFl_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 534 WhlDirFl_D_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlDirFl_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 WhlDirFl_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 534 WhlRotatRl_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 534 WhlRotatRl_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 534 WhlRotatRl_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlRotatRl_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 WhlRotatRl_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 534 WhlRotatFr_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 534 WhlRotatFr_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 534 WhlRotatFr_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlRotatFr_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 WhlRotatFr_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 534 WhlRotatFl_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 534 WhlRotatFl_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 534 WhlRotatFl_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 534 WhlRotatFl_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 534 WhlRotatFl_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 532 RgenTqFalt_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 532 RgenTqFalt_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 532 RgenTqFalt_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 532 RgenTqFalt_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 532 RgenBrkDynoMde_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 532 RgenBrkDynoMde_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 532 RgenBrkDynoMde_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 532 RgenBrkDynoMde_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 532 PrplWhlTqRqMn_No_Cs 1; +BA_ "MetaData" SG_ 532 PrplWhlTqRqMn_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 532 PrplWhlTqRqMn_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 532 PrplWhlTqRqMn_No_Cs 1; +BA_ "U_CX727_MY2021_Tx" SG_ 532 PrplWhlTqRqMn_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 532 PrplWhlTqRqMn_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 532 PrplWhlTot_Tq_RqMn 1; +BA_ "U_P702_MY2021_Rx" SG_ 532 PrplWhlTot_Tq_RqMn 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 532 PrplWhlTot_Tq_RqMn 1; +BA_ "U_CX727_MY2021_Tx" SG_ 532 PrplWhlTot_Tq_RqMn 1; +BA_ "U_P702_MY2021_Tx" SG_ 532 PrplWhlTot_Tq_RqMn 1; +BA_ "UsedOnPgmDBC" SG_ 532 PrplWhlTqRqMn_No_Cnt 1; +BA_ "MetaData" SG_ 532 PrplWhlTqRqMn_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 532 PrplWhlTqRqMn_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 532 PrplWhlTqRqMn_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 532 PrplWhlTqRqMn_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 532 PrplWhlTqRqMn_No_Cnt 1; +BA_ "GenSigStartValueInteger" SG_ 531 VehStop_D_Stat 2; +BA_ "GenSigStartValue" SG_ 531 VehStop_D_Stat 2; +BA_ "U_CX727_MY2021_Tx" SG_ 531 VehStop_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 VehStop_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 531 TracCtlPtActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 TracCtlPtActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 TracCtlPtActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 TracCtlPtActv_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 TracCtlPtActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 TracCtlPtActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbMntr_B_Err 1; +BA_ "UsedOnPgmDBC" SG_ 531 LscmbbMntr_B_Err 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbMntr_B_Err 1; +BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbBrkDis_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 LscmbbBrkDis_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbBrkDis_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbDeny_B_ActlBrk 1; +BA_ "UsedOnPgmDBC" SG_ 531 LscmbbDeny_B_ActlBrk 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbDeny_B_ActlBrk 1; +BA_ "WakeupSignal" SG_ 531 PrkBrkYwLamp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 531 PrkBrkYwLamp_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 531 PrkBrkYwLamp_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 PrkBrkYwLamp_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 PrkBrkYwLamp_D_Rq 1; +BA_ "WakeupSignal" SG_ 531 PrkBrkRedLamp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 531 PrkBrkRedLamp_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 531 PrkBrkRedLamp_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 PrkBrkRedLamp_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 PrkBrkRedLamp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbBrkDecel_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 LscmbbBrkDecel_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbBrkDecel_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AbsActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 AbsActv_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 531 AbsActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 AbsActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 AbsActv_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AbsActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AbsActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 StabCtlBrkActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 StabCtlBrkActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 StabCtlBrkActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 StabCtlBrkActv_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 531 StabCtlBrkActv_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 StabCtlBrkActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 StabCtlBrkActv_B_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 531 StabCtlBrkActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 CmbbBrkPrchg_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 CmbbBrkPrchg_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbBrkPrchg_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbBrkPrchg_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 CmbbBrkDecel_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 CmbbBrkDecel_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbBrkDecel_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbBrkDecel_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 CmbbBaSensInc_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 CmbbBaSensInc_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbBaSensInc_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbBaSensInc_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkWarm_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 AccBrkWarm_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkWarm_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkWarm_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkTotTqMn_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 AccBrkTotTqMn_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkTotTqMn_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkTotTqMn_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkPrchgActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 AccBrkPrchgActv_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkPrchgActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkPrchgActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkDis_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 AccBrkDis_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkDis_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkDis_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkDeny_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 AccBrkDeny_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 AccBrkDeny_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 AccBrkDeny_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkDeny_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkDeny_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AccBrkActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 AccBrkActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 AccBrkActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 AccBrkActv_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AccBrkActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AccBrkActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 PrplDrgCtlActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 PrplDrgCtlActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 PrplDrgCtlActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 PrplDrgCtlActv_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 PrplDrgCtlActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 PrplDrgCtlActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 PrplWhlTot_Tq_RqMx 1; +BA_ "UsedOnPgmDBC" SG_ 531 PrplWhlTot_Tq_RqMx 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 PrplWhlTot_Tq_RqMx 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 PrplWhlTot_Tq_RqMx 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 PrplWhlTot_Tq_RqMx 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 PrplWhlTot_Tq_RqMx 1; +BA_ "CrossOver_InfoCAN" SG_ 531 LscmbbBaSensInc_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 LscmbbBaSensInc_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbbBaSensInc_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 CmbbBrkDis_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 CmbbBrkDis_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 531 CmbbBrkDis_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 CmbbBrkDis_B_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbBrkDis_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbBrkDis_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 CmbbDeny_B_ActlBrk 1; +BA_ "UsedOnPgmDBC" SG_ 531 CmbbDeny_B_ActlBrk 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 CmbbDeny_B_ActlBrk 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 CmbbDeny_B_ActlBrk 1; +BA_ "U_CX727_MY2021_Rx" SG_ 531 CmbbDeny_B_ActlBrk 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 CmbbDeny_B_ActlBrk 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 CmbbDeny_B_ActlBrk 1; +BA_ "CrossOver_InfoCAN" SG_ 531 CcDis_B_Cmd 1; +BA_ "UsedOnPgmDBC" SG_ 531 CcDis_B_Cmd 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 CcDis_B_Cmd 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 CcDis_B_Cmd 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 CcDis_B_Cmd 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 CcDis_B_Cmd 1; +BA_ "CrossOver_InfoCAN" SG_ 531 VehLongOvrGnd_A_Est 1; +BA_ "UsedOnPgmDBC" SG_ 531 VehLongOvrGnd_A_Est 1; +BA_ "GenSigStartValueInteger" SG_ 531 VehLongOvrGnd_A_Est 511; +BA_ "U_P702_MY2021_Rx" SG_ 531 VehLongOvrGnd_A_Est 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 VehLongOvrGnd_A_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 VehLongOvrGnd_A_Est 1; +BA_ "CrossOver_InfoCAN" SG_ 531 LscmbBrkPrchg_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 531 LscmbBrkPrchg_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 LscmbBrkPrchg_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AccStopActv_B_ActlBrk 1; +BA_ "UsedOnPgmDBC" SG_ 531 AccStopActv_B_ActlBrk 1; +BA_ "U_P702_MY2021_Rx" SG_ 531 AccStopActv_B_ActlBrk 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 AccStopActv_B_ActlBrk 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AccStopActv_B_ActlBrk 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AccStopActv_B_ActlBrk 1; +BA_ "CrossOver_InfoCAN" SG_ 531 AccDis_B_ActlEpb 1; +BA_ "UsedOnPgmDBC" SG_ 531 AccDis_B_ActlEpb 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 AccDis_B_ActlEpb 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 AccDis_B_ActlEpb 1; +BA_ "WakeupSignal" SG_ 531 PrkBrkMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 531 PrkBrkMsgTxt_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 531 PrkBrkMsgTxt_D_Rq 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 PrkBrkMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 PrkBrkMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 531 PrkBrkStatus 1; +BA_ "UsedOnPgmDBC" SG_ 531 PrkBrkStatus 1; +BA_ "GenSigStartValueInteger" SG_ 531 PrkBrkStatus 7; +BA_ "GenSigStartValue" SG_ 531 PrkBrkStatus 7; +BA_ "U_P702_MY2021_Rx" SG_ 531 PrkBrkStatus 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 531 PrkBrkStatus 1; +BA_ "U_CX727_MY2021_Tx" SG_ 531 PrkBrkStatus 1; +BA_ "U_P702_MY2021_Tx" SG_ 531 PrkBrkStatus 1; +BA_ "ECGUsedRxSignal" SG_ 531 PrkBrkStatus 1; +BA_ "GenSigStartValueInteger" SG_ 136 SteWhlBrkOffst_An_Rq 32766; +BA_ "GenSigStartValue" SG_ 136 SteWhlBrkOffst_An_Rq 32765; +BA_ "U_P702_MY2021_Tx" SG_ 136 SteWhlBrkOffst_An_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 136 SteWhlBrkAnRq_No_Cs 1; +BA_ "MetaData" SG_ 136 SteWhlBrkAnRq_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 136 SteWhlBrkAnRq_No_Cs 1; +BA_ "CrossOver_InfoCAN" SG_ 136 SteWhlBrkAnRq_No_Cnt 1; +BA_ "MetaData" SG_ 136 SteWhlBrkAnRq_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 136 SteWhlBrkAnRq_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 125 VehRolComp_W_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 125 VehRolComp_W_Actl 4094; +BA_ "GenSigStartValue" SG_ 125 VehRolComp_W_Actl 4094; +BA_ "U_CX727_MY2021_Tx" SG_ 125 VehRolComp_W_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 125 VehRolComp_W_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 125 VehVertComp_A_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 125 VehVertComp_A_Actl 1022; +BA_ "GenSigStartValue" SG_ 125 VehVertComp_A_Actl 1022; +BA_ "U_P702_MY2021_Rx" SG_ 125 VehVertComp_A_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 125 VehVertComp_A_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 125 VehVertComp_A_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 125 BrkTotTqRqArb_No_Cs 1; +BA_ "MetaData" SG_ 125 BrkTotTqRqArb_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 125 BrkTotTqRqArb_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 BrkTotTqRqArb_No_Cs 1; +BA_ "U_CX727_MY2021_Tx" SG_ 125 BrkTotTqRqArb_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 125 BrkTotTqRqArb_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 125 BrkTotTqRqArb_No_Cnt 1; +BA_ "MetaData" SG_ 125 BrkTotTqRqArb_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 125 BrkTotTqRqArb_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 BrkTotTqRqArb_No_Cnt 1; +BA_ "U_CX727_MY2021_Tx" SG_ 125 BrkTotTqRqArb_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 125 BrkTotTqRqArb_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 125 BrkTot_Tq_RqArb 1; +BA_ "U_P702_MY2021_Rx" SG_ 125 BrkTot_Tq_RqArb 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 BrkTot_Tq_RqArb 1; +BA_ "U_CX727_MY2021_Tx" SG_ 125 BrkTot_Tq_RqArb 1; +BA_ "U_P702_MY2021_Tx" SG_ 125 BrkTot_Tq_RqArb 1; +BA_ "ECGUsedRxSignal" SG_ 125 BrkTot_Tq_RqArb 1; +BA_ "UsedOnPgmDBC" SG_ 125 BrkTot_Tq_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 125 BrkTot_Tq_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 125 BrkTot_Tq_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 BrkTot_Tq_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 125 BrkTot_Tq_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 125 BrkTot_Tq_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 125 HsaStat_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 125 HsaStat_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 125 HsaStat_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 125 HsaStat_D_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 125 HsaStat_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 125 HsaStat_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 119 VehTrvlDir_D_Stat 6; +BA_ "GenSigStartValue" SG_ 119 VehTrvlDir_D_Stat 6; +BA_ "U_P702_MY2021_Tx" SG_ 119 VehTrvlDir_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 119 VehOverGnd_V_Est 1; +BA_ "U_CX727_MY2021_Rx" SG_ 119 VehOverGnd_V_Est 1; +BA_ "U_P702_MY2021_Rx" SG_ 119 VehOverGnd_V_Est 1; +BA_ "U_CX727_MY2021_Tx" SG_ 119 VehOverGnd_V_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 119 VehOverGnd_V_Est 1; +BA_ "UsedOnPgmDBC" SG_ 119 VehLongComp_A_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 119 VehLongComp_A_Actl 1022; +BA_ "GenSigStartValue" SG_ 119 VehLongComp_A_Actl 1022; +BA_ "U_P702_MY2021_Rx" SG_ 119 VehLongComp_A_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 119 VehLongComp_A_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 119 VehLongComp_A_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 119 VehLongComp_A_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 119 VehLongComp_A_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 119 VehLatComp_A_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 119 VehLatComp_A_Actl 1022; +BA_ "GenSigStartValue" SG_ 119 VehLatComp_A_Actl 1022; +BA_ "U_P702_MY2021_Rx" SG_ 119 VehLatComp_A_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 119 VehLatComp_A_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 119 VehLatComp_A_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 119 VehLatComp_A_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 119 VehLatComp_A_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 119 VehLatComp_A_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 119 VehYawComp_W_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 119 VehYawComp_W_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 119 VehYawComp_W_Actl 4094; +BA_ "GenSigStartValue" SG_ 119 VehYawComp_W_Actl 4094; +BA_ "U_CX727_MY2021_Rx" SG_ 119 VehYawComp_W_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 119 VehYawComp_W_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 119 VehYawComp_W_Actl 1; +BA_ "U_CX727_MY2021_Tx" SG_ 119 VehYawComp_W_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 119 VehYawComp_W_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 119 VehYawComp_W_Actl 1; +BA_ "GenSigSendType" SG_ 118 BrkCtrFnd_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 118 BrkCtrFnd_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 118 AwdLck_Tq_RqMx 1; +BA_ "U_P702_MY2021_Rx" SG_ 118 AwdLck_Tq_RqMx 1; +BA_ "U_P702_MY2021_Tx" SG_ 118 AwdLck_Tq_RqMx 1; +BA_ "UsedOnPgmDBC" SG_ 118 AwdLck_Tq_RqMn 1; +BA_ "U_P702_MY2021_Rx" SG_ 118 AwdLck_Tq_RqMn 1; +BA_ "U_P702_MY2021_Tx" SG_ 118 AwdLck_Tq_RqMn 1; +BA_ "UsedOnPgmDBC" SG_ 118 DrvSte_D_Stat 1; +BA_ "GenSigSendType" SG_ 118 DrvSte_D_Stat 3; +BA_ "U_CX727_MY2021_Rx" SG_ 118 DrvSte_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 118 DrvSte_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 118 DrvSte_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 118 DrvSte_Tq_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 118 DrvSte_Tq_Rq 128; +BA_ "U_CX727_MY2021_Rx" SG_ 118 DrvSte_Tq_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 118 DrvSte_Tq_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 118 DrvSte_Tq_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 118 EmgcyBrkLamp_D_Rq 1; +BA_ "GenSigSendType" SG_ 118 EmgcyBrkLamp_D_Rq 3; +BA_ "U_CX727_MY2021_Tx" SG_ 118 EmgcyBrkLamp_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 118 EmgcyBrkLamp_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 118 StopLamp_B_RqBrk 1; +BA_ "GenSigSendType" SG_ 118 StopLamp_B_RqBrk 3; +BA_ "U_CX727_MY2021_Tx" SG_ 118 StopLamp_B_RqBrk 1; +BA_ "U_P702_MY2021_Tx" SG_ 118 StopLamp_B_RqBrk 1; +BA_ "UsedOnPgmDBC" SG_ 73 immoSubTarget1Data_T1 1; +BA_ "U_P702_MY2021_Rx" SG_ 73 immoSubTarget1Data_T1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 73 immoSubTarget1Data_T1 1; +BA_ "U_CX727_MY2021_Tx" SG_ 73 immoSubTarget1Data_T1 1; +BA_ "U_P702_MY2021_Tx" SG_ 73 immoSubTarget1Data_T1 1; +BA_ "UsedOnPgmDBC" SG_ 73 immoSubTarget1Cmd_T1 1; +BA_ "U_P702_MY2021_Rx" SG_ 73 immoSubTarget1Cmd_T1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 73 immoSubTarget1Cmd_T1 1; +BA_ "U_CX727_MY2021_Tx" SG_ 73 immoSubTarget1Cmd_T1 1; +BA_ "U_P702_MY2021_Tx" SG_ 73 immoSubTarget1Cmd_T1 1; +BA_ "CrossOver_InfoCAN" SG_ 1034 VehicleGGCCData 1; +BA_ "UsedOnPgmDBC" SG_ 1034 VehicleGGCCData 1; +BA_ "U_P702_MY2021_Rx" SG_ 1034 VehicleGGCCData 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1034 VehicleGGCCData 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1034 VehicleGGCCData 1; +BA_ "GenSigStartValueInteger" SG_ 1440 TCM_GWOnBoardTester 255; +BA_ "ContentDependant" SG_ 1440 TCM_GWOnBoardTester 1; +BA_ "GenSigStartValue" SG_ 1440 TCM_GWOnBoardTester 255; +BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_GWOnBoardTester 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_GWOnBoardTester 1; +BA_ "GenSigStartValueInteger" SG_ 1440 TCM_GWNMProxy 255; +BA_ "ContentDependant" SG_ 1440 TCM_GWNMProxy 1; +BA_ "GenSigStartValue" SG_ 1440 TCM_GWNMProxy 255; +BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_GWNMProxy 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_GWNMProxy 1; +BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMReserved4 255; +BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMReserved4 1; +BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMReserved4 255; +BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMReserved4 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMReserved4 1; +BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMReserved3 255; +BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMReserved3 1; +BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMReserved3 255; +BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMReserved3 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMReserved3 1; +BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMReserved2 255; +BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMReserved2 1; +BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMReserved2 255; +BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMReserved2 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMReserved2 1; +BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMReserved1 255; +BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMReserved1 1; +BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMReserved1 255; +BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMReserved1 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMReserved1 1; +BA_ "GenSigStartValueInteger" SG_ 1440 TCM_AutoSarNMNodeId 160; +BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMNodeId 1; +BA_ "GenSigStartValue" SG_ 1440 TCM_AutoSarNMNodeId 160; +BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMNodeId 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMNodeId 1; +BA_ "ContentDependant" SG_ 1440 TCM_AutoSarNMControl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1440 TCM_AutoSarNMControl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1440 TCM_AutoSarNMControl 1; +BA_ "CrossOver_InfoCAN" SG_ 561 TrnMsgTxt2_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 561 TrnMsgTxt2_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 561 TrnMsgTxt2_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 561 TrnMsgTxt_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 561 TrnMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 561 TrnMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 561 TrnMsgTxt_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 330 TrnAout_W_ActlUnfilt 1; +BA_ "U_P702_MY2021_Rx" SG_ 330 TrnAout_W_ActlUnfilt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 330 TrnAout_W_ActlUnfilt 1; +BA_ "U_P702_MY2021_Tx" SG_ 330 TrnAout_W_ActlUnfilt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 330 TrnAout_W_ActlUnfilt 1; +BA_ "ECGUsedRxSignal" SG_ 1090 Mtr2State_D_ActlMntr 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1090 Mtr2State_D_ActlMntr 1; +BA_ "GenSigStartValueInteger" SG_ 1090 Inv1Ain_I_ActlMntr 32766; +BA_ "GenSigStartValue" SG_ 1090 Inv1Ain_I_ActlMntr 32765; +BA_ "ECGUsedRxSignal" SG_ 1090 Inv1Ain_I_ActlMntr 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1090 Inv1Ain_I_ActlMntr 1; +BA_ "ECGUsedRxSignal" SG_ 1090 HybVehMde_D_ActlMntr 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1090 HybVehMde_D_ActlMntr 1; +BA_ "ECGUsedRxSignal" SG_ 1090 ChrgStat_D_ActlMntr 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1090 ChrgStat_D_ActlMntr 1; +BA_ "CrossOver_InfoCAN" SG_ 1090 VehElRnge_L_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1090 VehElRnge_L_Dsply 4095; +BA_ "GenSigStartValue" SG_ 1090 VehElRnge_L_Dsply 4093; +BA_ "U_P702_MY2021_Tx" SG_ 1090 VehElRnge_L_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1090 VehElRnge_L_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 870 EngMdeMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 870 EffRgenThres_Pc_Dsply 1; +BA_ "GenSigStartValue" SG_ 870 EffRgenThres_Pc_Dsply 1023; +BA_ "CrossOver_InfoCAN" SG_ 870 EffRgenThres_Pc_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 870 RngPerChrgInst_L_Dsply 4094; +BA_ "GenSigStartValue" SG_ 870 RngPerChrgInst_L_Dsply 4093; +BA_ "U_P702_MY2021_Tx" SG_ 870 RngPerChrgInst_L_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 869 PwrFlowTxt_D_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 869 EngOnMsg2_D_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 869 EngOnMsg1_D_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 869 FuelMaintMde_D_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 869 EffWhlLvl2_Pc_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 869 EffWhlLvl2_Pc_Dsply 511; +BA_ "U_P702_MY2021_Tx" SG_ 869 EffWhlLvl2_Pc_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 869 EffWhlThres_Pc_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 869 EffWhlThres_Pc_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 869 EngPwLvl_Pc_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 869 EngPwLvl_Pc_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 869 EngActv_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 869 EngActv_B_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 869 EffWhlThresOn_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 869 EffWhlThresOn_B_Dsply 1; +BA_ "GenSigSendType" SG_ 606 ElVehLaterMde_D_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 606 ElVehLaterMde_D_Stat 1; +BA_ "GenSigSendType" SG_ 606 ElVehNowMde_D_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 606 ElVehNowMde_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 374 GearEngag_D_Actl 1; +BA_ "GenSigSendType" SG_ 374 GearEngag_D_Actl 3; +BA_ "U_P702_MY2021_Tx" SG_ 374 GearEngag_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 374 TrnRng_D_Rq 14; +BA_ "ContentDependant" SG_ 374 TrnRng_D_Rq 1; +BA_ "GenSigStartValue" SG_ 374 TrnRng_D_Rq 14; +BA_ "GenSigSendType" SG_ 374 TrnRng_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 374 TrnRng_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 TrnRng_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 374 TrnRng_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 TrnRng_D_Rq 1; +BA_ "ContentDependant" SG_ 374 TrnPrkSys_D_Actl 1; +BA_ "GenSigSendType" SG_ 374 TrnPrkSys_D_Actl 3; +BA_ "U_P702_MY2021_Rx" SG_ 374 TrnPrkSys_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 TrnPrkSys_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 374 TrnPrkSys_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 TrnPrkSys_D_Actl 1; +BA_ "ContentDependant" SG_ 374 GearLvr_D_ActlDrv 1; +BA_ "GenSigSendType" SG_ 374 GearLvr_D_ActlDrv 3; +BA_ "U_P702_MY2021_Rx" SG_ 374 GearLvr_D_ActlDrv 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearLvr_D_ActlDrv 1; +BA_ "U_P702_MY2021_Tx" SG_ 374 GearLvr_D_ActlDrv 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearLvr_D_ActlDrv 1; +BA_ "ContentDependant" SG_ 374 GearPos_No_Cs 1; +BA_ "MetaData" SG_ 374 GearPos_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 374 GearPos_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearPos_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 374 GearPos_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 374 GearPos_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearPos_No_Cs 1; +BA_ "CrossOver_InfoCAN" SG_ 374 GearPos_D_Trg 1; +BA_ "UsedOnPgmDBC" SG_ 374 GearPos_D_Trg 1; +BA_ "GenSigStartValueInteger" SG_ 374 GearPos_D_Trg 15; +BA_ "ContentDependant" SG_ 374 GearPos_D_Trg 1; +BA_ "GenSigStartValue" SG_ 374 GearPos_D_Trg 15; +BA_ "GenSigSendType" SG_ 374 GearPos_D_Trg 3; +BA_ "U_P702_MY2021_Rx" SG_ 374 GearPos_D_Trg 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearPos_D_Trg 1; +BA_ "U_CX727_MY2021_Rx" SG_ 374 GearPos_D_Trg 1; +BA_ "U_P702_MY2021_Tx" SG_ 374 GearPos_D_Trg 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearPos_D_Trg 1; +BA_ "ContentDependant" SG_ 374 GearPos_No_Cnt 1; +BA_ "MetaData" SG_ 374 GearPos_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 374 GearPos_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearPos_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 374 GearPos_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 374 GearPos_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearPos_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 374 TrnIgnOffDly_T_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 TrnIgnOffDly_T_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 374 GearPos_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 374 GearPos_D_Actl 15; +BA_ "ContentDependant" SG_ 374 GearPos_D_Actl 1; +BA_ "GenSigStartValue" SG_ 374 GearPos_D_Actl 15; +BA_ "GenSigSendType" SG_ 374 GearPos_D_Actl 3; +BA_ "U_P702_MY2021_Rx" SG_ 374 GearPos_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 374 GearPos_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 374 GearPos_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 374 GearPos_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 374 GearPos_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 603 WhlDirAvgDrv_D_Actl 1; +BA_ "ContentDependant" SG_ 603 WhlDirAvgDrv_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 603 WhlDirAvgDrv_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 603 PrplTqMnRgen_B_Actl 1; +BA_ "ContentDependant" SG_ 603 PrplTqMnRgen_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 603 PrplTqMnRgen_B_Actl 1; +BA_ "ContentDependant" SG_ 603 BattTracCnnct_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 603 BattTracCnnct_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 602 HtrnWarnLamp_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 602 HtrnWarnLamp_B_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 602 HtrnWarnLamp_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 602 HybPwLimOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 602 PwPckTqRdy_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 602 PwPckTqRdy_B_Dsply 1; +BA_ "GenSigSendType" SG_ 1152 BattTracDiagClr_B_Stat 3; +BA_ "GenSigSendType" SG_ 1152 EngTeHi_B_Actl 3; +BA_ "U_P702_MY2021_Tx" SG_ 1152 EngTeHi_B_Actl 1; +BA_ "GenSigSendType" SG_ 1152 DcdcOn_B_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1152 DcdcOn_B_Rq 1; +BA_ "GenSigSendType" SG_ 1152 ULoBattSpprtSustn_B_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1152 ULoBattSpprtSustn_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1152 VehElEff_No_Avg 126; +BA_ "GenSigStartValue" SG_ 1152 VehElEff_No_Avg 126; +BA_ "U_P702_MY2021_Tx" SG_ 1152 VehElEff_No_Avg 1; +BA_ "CrossOver_InfoCAN" SG_ 872 PlgActvArb_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 872 PlgActvArb_B_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 872 PlgActvArb_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 872 HybMdeStat_D_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 872 HybMdeStat_D_Dsply 1; +BA_ "ContentDependant" SG_ 560 SelDrvMdeSwtch_D_Stat3 1; +BA_ "U_P702_MY2021_Rx" SG_ 560 SelDrvMdeSwtch_D_Stat3 1; +BA_ "U_P702_MY2021_Tx" SG_ 560 SelDrvMdeSwtch_D_Stat3 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 SelDrvMdeSwtch_D_Stat3 1; +BA_ "CrossOver_InfoCAN" SG_ 560 TrnSrvcRqd_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 560 TrnSrvcRqd_B_Rq 1; +BA_ "ContentDependant" SG_ 560 TrnSrvcRqd_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 560 TrnSrvcRqd_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 TrnSrvcRqd_B_Rq 1; +BA_ "ECGUsedRxSignal" SG_ 560 TrnSrvcRqd_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 560 TrnShifActv_B_Actl 1; +BA_ "ContentDependant" SG_ 560 TrnShifActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 560 TrnShifActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 560 TrnShifActv_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 560 TrnShifActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 560 TrnShifActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 TrnShifActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 560 GearLvrPos_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 560 GearLvrPos_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 560 GearLvrPos_D_Actl 14; +BA_ "GenSigStartValue" SG_ 560 GearLvrPos_D_Actl 14; +BA_ "U_P702_MY2021_Rx" SG_ 560 GearLvrPos_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 560 GearLvrPos_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 560 GearLvrPos_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 560 GearLvrPos_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 GearLvrPos_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 560 GboxOil_Te_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 560 GboxOil_Te_Actl 254; +BA_ "ContentDependant" SG_ 560 GboxOil_Te_Actl 1; +BA_ "GenSigStartValue" SG_ 560 GboxOil_Te_Actl 254; +BA_ "U_P702_MY2021_Rx" SG_ 560 GboxOil_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 560 GboxOil_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 560 GboxOil_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 560 GboxOil_Te_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyRng2_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 369 TrnIpcDsplyRng2_D_Actl 15; +BA_ "GenSigStartValue" SG_ 369 TrnIpcDsplyRng2_D_Actl 15; +BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyRng2_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyRng2_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyRng_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyRng_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 369 TrnIpcDsplyGear_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyGear_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 369 TrnIpcDsplyGear_D_Actl 15; +BA_ "GenSigStartValue" SG_ 369 TrnIpcDsplyGear_D_Actl 15; +BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyGear_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyGear_D_Actl 1; +BA_ "WakeupSignal" SG_ 369 TrnIpcDsplyMde_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 369 TrnIpcDsplyMde_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyMde_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyMde_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyMde_D_Stat 1; +BA_ "WakeupSignal" SG_ 369 TrnIpcDsplyMde_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 369 TrnIpcDsplyMde_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyMde_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyMde_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyMde_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 369 TrnIpcDsplyGear_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 369 TrnIpcDsplyGear_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 369 TrnIpcDsplyGear_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 369 TrnIpcDsplyGear_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 92 TrnLvrV_D_Rq 1; +BA_ "GenSigStartValue" SG_ 92 TrnLvrV_D_Rq 1; +BA_ "GenSigSendType" SG_ 92 TrnLvrV_D_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnLvrV_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnLvrV_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 92 TrnSbwSysHlth_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 92 TrnSbwSysHlth_D_Actl 1; +BA_ "ContentDependant" SG_ 92 TrnSbwSysHlth_D_Actl 1; +BA_ "GenSigStartValue" SG_ 92 TrnSbwSysHlth_D_Actl 1; +BA_ "GenSigSendType" SG_ 92 TrnSbwSysHlth_D_Actl 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnSbwSysHlth_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnSbwSysHlth_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 92 TrnGearNtmAllow_B_Stat 1; +BA_ "ContentDependant" SG_ 92 TrnGearNtmAllow_B_Stat 1; +BA_ "GenSigSendType" SG_ 92 TrnGearNtmAllow_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearNtmAllow_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearNtmAllow_B_Stat 1; +BA_ "WakeupSignal" SG_ 92 TrnDtpCmd_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 92 TrnDtpCmd_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 92 TrnDtpCmd_D_Actl 1; +BA_ "ContentDependant" SG_ 92 TrnDtpCmd_D_Actl 1; +BA_ "GenSigStartValue" SG_ 92 TrnDtpCmd_D_Actl 1; +BA_ "GenSigSendType" SG_ 92 TrnDtpCmd_D_Actl 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnDtpCmd_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnDtpCmd_D_Actl 1; +BA_ "GenSigSendType" SG_ 92 GearSelLck_D_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 GearSelLck_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 GearSelLck_D_Rq 1; +BA_ "ContentDependant" SG_ 92 TrnGearCmd_No_Cs 1; +BA_ "MetaData" SG_ 92 TrnGearCmd_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearCmd_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearCmd_No_Cs 1; +BA_ "ContentDependant" SG_ 92 TrnValidGear_D_Cnfm 1; +BA_ "GenSigSendType" SG_ 92 TrnValidGear_D_Cnfm 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnValidGear_D_Cnfm 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnValidGear_D_Cnfm 1; +BA_ "ContentDependant" SG_ 92 TrnNtrlTowCmd_D_Actl 1; +BA_ "GenSigSendType" SG_ 92 TrnNtrlTowCmd_D_Actl 3; +BA_ "U_CX727_MY2021_Rx" SG_ 92 TrnNtrlTowCmd_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 92 TrnNtrlTowCmd_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnNtrlTowCmd_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnNtrlTowCmd_D_Actl 1; +BA_ "ContentDependant" SG_ 92 TrnGearCmd_Pc_ActlPt 1; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearCmd_Pc_ActlPt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearCmd_Pc_ActlPt 1; +BA_ "ContentDependant" SG_ 92 TrnGear_D_RqPt 1; +BA_ "GenSigSendType" SG_ 92 TrnGear_D_RqPt 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGear_D_RqPt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGear_D_RqPt 1; +BA_ "ContentDependant" SG_ 92 TrnCmdState_B_Actl 1; +BA_ "GenSigSendType" SG_ 92 TrnCmdState_B_Actl 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnCmdState_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnCmdState_B_Actl 1; +BA_ "ContentDependant" SG_ 92 TrnCmdCnt_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnCmdCnt_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnCmdCnt_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 92 PrkBrkActv_D_RqTrnGear 1; +BA_ "GenSigStartValueInteger" SG_ 92 PrkBrkActv_D_RqTrnGear 1; +BA_ "ContentDependant" SG_ 92 PrkBrkActv_D_RqTrnGear 1; +BA_ "GenSigStartValue" SG_ 92 PrkBrkActv_D_RqTrnGear 1; +BA_ "GenSigSendType" SG_ 92 PrkBrkActv_D_RqTrnGear 3; +BA_ "U_CX727_MY2021_Rx" SG_ 92 PrkBrkActv_D_RqTrnGear 1; +BA_ "U_P702_MY2021_Rx" SG_ 92 PrkBrkActv_D_RqTrnGear 1; +BA_ "U_P702_MY2021_Tx" SG_ 92 PrkBrkActv_D_RqTrnGear 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 PrkBrkActv_D_RqTrnGear 1; +BA_ "CrossOver_InfoCAN" SG_ 92 TrnGearMsgTxt_D_Rq 1; +BA_ "ContentDependant" SG_ 92 TrnGearMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 92 TrnGearMsgTxt_D_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearMsgTxt_D_Rq 1; +BA_ "ContentDependant" SG_ 92 TrnGearCmd_No_Cnt 1; +BA_ "MetaData" SG_ 92 TrnGearCmd_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 92 TrnGearCmd_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 92 TrnGearCmd_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 2030 TesterPhysicalResSOBDMC 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 2030 TesterPhysicalResSOBDMC 1; +BA_ "U_P702_MY2021_Tx" SG_ 1087 BattRgenLoChrg_D_RqEng 1; +BA_ "GenSigSendType" SG_ 1087 BattRgenLoChrg_D_RqEng 3; +BA_ "GenSigSendType" SG_ 1087 AdasLcObtclAbrt_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 1087 BattRgenLoDChrg_D_RqEng 1; +BA_ "GenSigSendType" SG_ 1087 BattRgenLoDChrg_D_RqEng 3; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 AirDamPos_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1087 AirDamPos_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1087 AirDamPos_D_Stat 1; +BA_ "GenSigSendType" SG_ 1087 FapLcInhbt_B_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcInhbt_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcInhbt_B_Rq 1; +BA_ "GenSigSendType" SG_ 1087 FapLcStopHold_B_Rq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1087 FapLcStopHold_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1087 FapLcStopHold_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcStopHold_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcStopHold_B_Rq 1; +BA_ "GenSigSendType" SG_ 1087 FapLcPrchgBrk_B_Rq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1087 FapLcPrchgBrk_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1087 FapLcPrchgBrk_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcPrchgBrk_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcPrchgBrk_B_Rq 1; +BA_ "GenSigSendType" SG_ 1087 FapLcObstcl_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcObstcl_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcObstcl_B_Stat 1; +BA_ "GenSigSendType" SG_ 1087 FapLcMaxGrdInhbt_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcMaxGrdInhbt_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcMaxGrdInhbt_B_Stat 1; +BA_ "GenSigSendType" SG_ 1087 FapLcMaxGrdAbrt_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcMaxGrdAbrt_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcMaxGrdAbrt_B_Stat 1; +BA_ "GenSigSendType" SG_ 1087 FapLcActv_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 1087 FapLcActv_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1087 FapLcActv_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 332 UreaLvlQlty_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 UreaLvlQlty_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaLvlQlty_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 332 UreaLvlTxtWarn_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 UreaLvlTxtWarn_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaLvlTxtWarn_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 332 UreaQltySysWarn_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 UreaQltySysWarn_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaQltySysWarn_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 DieslPrtcWarn_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 DieslPrtcWarn_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 UreaQltyFlg_B_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaQltyFlg_B_RqDsply 1; +BA_ "ECGUsedRxSignal" SG_ 332 UreaQltyFlg_B_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 UreaLvl_Pc_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaLvl_Pc_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 332 UreaLvl_Pc_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 VehUreaRnge2_L_DsplyMx 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 VehUreaRnge2_L_DsplyMx 1; +BA_ "ECGUsedRxSignal" SG_ 332 VehUreaRnge2_L_DsplyMx 1; +BA_ "CrossOver_InfoCAN" SG_ 332 UreaQltySys_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 UreaQltySys_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaQltySys_D_RqDsply 1; +BA_ "ECGUsedRxSignal" SG_ 332 UreaQltySys_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 332 UreaLvlTxt_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 UreaLvlTxt_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 UreaLvlTxt_D_RqDsply 1; +BA_ "ECGUsedRxSignal" SG_ 332 UreaLvlTxt_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 332 VehUreaWarn_V_DsplyMx 1; +BA_ "U_P702_MY2021_Tx" SG_ 332 VehUreaWarn_V_DsplyMx 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 332 VehUreaWarn_V_DsplyMx 1; +BA_ "ECGUsedRxSignal" SG_ 332 VehUreaWarn_V_DsplyMx 1; +BA_ "UsedOnPgmDBC" SG_ 1896 TesterPhysicalResABS 1; +BA_ "GenSigSendType" SG_ 1896 TesterPhysicalResABS 3; +BA_ "U_CX727_MY2021_Tx" SG_ 1896 TesterPhysicalResABS 1; +BA_ "U_P702_MY2021_Tx" SG_ 1896 TesterPhysicalResABS 1; +BA_ "GenSigSendType" SG_ 1889 TesterPhysicalReqTCCM 3; +BA_ "U_P702_MY2021_Rx" SG_ 1889 TesterPhysicalReqTCCM 1; +BA_ "UsedOnPgmDBC" SG_ 1888 TesterPhysicalReqABS 1; +BA_ "GenSigSendType" SG_ 1888 TesterPhysicalReqABS 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1888 TesterPhysicalReqABS 1; +BA_ "U_P702_MY2021_Rx" SG_ 1888 TesterPhysicalReqABS 1; +BA_ "UsedOnPgmDBC" SG_ 1848 TesterPhysicalResPSCM 1; +BA_ "U_CX727_MY2021_Tx" SG_ 1848 TesterPhysicalResPSCM 1; +BA_ "U_P702_MY2021_Tx" SG_ 1848 TesterPhysicalResPSCM 1; +BA_ "UsedOnPgmDBC" SG_ 1840 TesterPhysicalReqPSCM 1; +BA_ "GenSigSendType" SG_ 1840 TesterPhysicalReqPSCM 3; +BA_ "U_CX727_MY2021_Rx" SG_ 1840 TesterPhysicalReqPSCM 1; +BA_ "U_P702_MY2021_Rx" SG_ 1840 TesterPhysicalReqPSCM 1; +BA_ "UsedOnPgmDBC" SG_ 1713 UUDTABSResponse2 1; +BA_ "U_P702_MY2021_Tx" SG_ 1713 UUDTABSResponse2 1; +BA_ "UsedOnPgmDBC" SG_ 1712 UUDTABSResponse1 1; +BA_ "U_P702_MY2021_Tx" SG_ 1712 UUDTABSResponse1 1; +BA_ "UsedOnPgmDBC" SG_ 2025 TesterPhysicalResTCM 1; +BA_ "U_P702_MY2021_Tx" SG_ 2025 TesterPhysicalResTCM 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 2025 TesterPhysicalResTCM 1; +BA_ "UsedOnPgmDBC" SG_ 2024 TesterPhysicalResPCM 1; +BA_ "U_P702_MY2021_Tx" SG_ 2024 TesterPhysicalResPCM 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 2024 TesterPhysicalResPCM 1; +BA_ "UsedOnPgmDBC" SG_ 2017 TesterPhysicalReqTCM 1; +BA_ "GenSigSendType" SG_ 2017 TesterPhysicalReqTCM 3; +BA_ "U_P702_MY2021_Rx" SG_ 2017 TesterPhysicalReqTCM 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 2017 TesterPhysicalReqTCM 1; +BA_ "UsedOnPgmDBC" SG_ 2016 TesterPhysicalReqPCM 1; +BA_ "GenSigSendType" SG_ 2016 TesterPhysicalReqPCM 3; +BA_ "U_P702_MY2021_Rx" SG_ 2016 TesterPhysicalReqPCM 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 2016 TesterPhysicalReqPCM 1; +BA_ "CrossOver_InfoCAN" SG_ 2015 TesterFunctionalReq 1; +BA_ "UsedOnPgmDBC" SG_ 2015 TesterFunctionalReq 1; +BA_ "GenSigSendType" SG_ 2015 TesterFunctionalReq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 2015 TesterFunctionalReq 1; +BA_ "U_P702_MY2021_Rx" SG_ 2015 TesterFunctionalReq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 2015 TesterFunctionalReq 1; +BA_ "ECGUsedRxSignal" SG_ 2015 TesterFunctionalReq 1; +BA_ "GenSigSendType" SG_ 1897 TesterPhysicalResTCCM 3; +BA_ "U_P702_MY2021_Tx" SG_ 1897 TesterPhysicalResTCCM 1; +BA_ "GenSigSendType" SG_ 1814 TesterPhysicalReqGWM_F1 3; +BA_ "ECGUsedRxSignal" SG_ 1814 TesterPhysicalReqGWM_F1 1; +BA_ "UsedOnPgmDBC" SG_ 1701 UUDTTCMResponse2 1; +BA_ "U_P702_MY2021_Tx" SG_ 1701 UUDTTCMResponse2 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1701 UUDTTCMResponse2 1; +BA_ "UsedOnPgmDBC" SG_ 1700 UUDTTCMResponse1 1; +BA_ "U_P702_MY2021_Tx" SG_ 1700 UUDTTCMResponse1 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1700 UUDTTCMResponse1 1; +BA_ "UsedOnPgmDBC" SG_ 1697 UUDTPCMResponse2 1; +BA_ "U_P702_MY2021_Tx" SG_ 1697 UUDTPCMResponse2 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1697 UUDTPCMResponse2 1; +BA_ "UsedOnPgmDBC" SG_ 1696 UUDTPCMResponse1 1; +BA_ "U_P702_MY2021_Tx" SG_ 1696 UUDTPCMResponse1 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1696 UUDTPCMResponse1 1; +BA_ "GenSigStartValueInteger" SG_ 1429 PCM_GWOnBoardTester 255; +BA_ "ContentDependant" SG_ 1429 PCM_GWOnBoardTester 1; +BA_ "GenSigStartValue" SG_ 1429 PCM_GWOnBoardTester 255; +BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_GWOnBoardTester 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_GWOnBoardTester 1; +BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_GWOnBoardTester 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_GWOnBoardTester 1; +BA_ "GenSigStartValueInteger" SG_ 1429 PCM_GWNMProxy 255; +BA_ "ContentDependant" SG_ 1429 PCM_GWNMProxy 1; +BA_ "GenSigStartValue" SG_ 1429 PCM_GWNMProxy 255; +BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_GWNMProxy 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_GWNMProxy 1; +BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_GWNMProxy 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_GWNMProxy 1; +BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMReserved4 255; +BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMReserved4 1; +BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMReserved4 255; +BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMReserved4 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMReserved4 1; +BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMReserved4 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMReserved4 1; +BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMReserved3 255; +BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMReserved3 1; +BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMReserved3 255; +BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMReserved3 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMReserved3 1; +BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMReserved3 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMReserved3 1; +BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMReserved2 255; +BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMReserved2 1; +BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMReserved2 255; +BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMReserved2 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMReserved2 1; +BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMReserved2 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMReserved2 1; +BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMReserved1 255; +BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMReserved1 1; +BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMReserved1 255; +BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMReserved1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMReserved1 1; +BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMReserved1 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMReserved1 1; +BA_ "GenSigStartValueInteger" SG_ 1429 PCM_AutoSarNMNodeId 149; +BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMNodeId 1; +BA_ "GenSigStartValue" SG_ 1429 PCM_AutoSarNMNodeId 149; +BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMNodeId 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMNodeId 1; +BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMNodeId 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMNodeId 1; +BA_ "ContentDependant" SG_ 1429 PCM_AutoSarNMControl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1429 PCM_AutoSarNMControl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1429 PCM_AutoSarNMControl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1429 PCM_AutoSarNMControl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1429 PCM_AutoSarNMControl 1; +BA_ "GenSigStartValueInteger" SG_ 1100 EngExhMdeQuiet_D2_Stat 0; +BA_ "GenSigSendType" SG_ 1100 EngExhMdeQuiet_D2_Stat 3; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 HvacCmprLim_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1100 HvacCmprLim_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1100 WakeAlarm1_T_Rq 32767; +BA_ "GenSigStartValue" SG_ 1100 WakeAlarm1_T_Rq 32767; +BA_ "U_P702_MY2021_Tx" SG_ 1100 WakeAlarm1_T_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 WakeAlarm1_T_Rq 1; +BA_ "WakeupSignal" SG_ 1100 WakeAlarm1_B_Typ 1; +BA_ "GenSigSendType" SG_ 1100 WakeAlarm1_B_Typ 3; +BA_ "U_P702_MY2021_Tx" SG_ 1100 WakeAlarm1_B_Typ 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 WakeAlarm1_B_Typ 1; +BA_ "GenSigSendType" SG_ 1100 Veh_V_DsplyTrailCtlSet 3; +BA_ "U_P702_MY2021_Tx" SG_ 1100 Veh_V_DsplyTrailCtlSet 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 Veh_V_DsplyTrailCtlSet 1; +BA_ "GenSigSendType" SG_ 1100 TrailCtlPt_B_Falt 3; +BA_ "U_P702_MY2021_Rx" SG_ 1100 TrailCtlPt_B_Falt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1100 TrailCtlPt_B_Falt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 TrailCtlPt_B_Falt 1; +BA_ "GenSigSendType" SG_ 1100 AutoTowAllw_D_StatMnu 3; +BA_ "U_P702_MY2021_Tx" SG_ 1100 AutoTowAllw_D_StatMnu 1; +BA_ "GenSigSendType" SG_ 1100 AutoTowActv_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 1100 AutoTowActv_B_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1100 GrossTrainWeight_M_Est 254; +BA_ "GenSigStartValue" SG_ 1100 GrossTrainWeight_M_Est 254; +BA_ "U_P702_MY2021_Rx" SG_ 1100 GrossTrainWeight_M_Est 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1100 GrossTrainWeight_M_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 1100 GrossTrainWeight_M_Est 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1100 GrossTrainWeight_M_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmVeh_V_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmVeh_V_Dsply 1; +BA_ "GenSigSendType" SG_ 1098 EdmSailMdeOn_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmSailMdeOn_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmSailMdeOn_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmPrev_Fe_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmPrev_Fe_Dsply 1; +BA_ "GenSigSendType" SG_ 1098 EdmMsgTxt_D_Rq 3; +BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 1098 EdmLamp_D_Dsply 3; +BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmLamp_D_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmLamp_D_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmCurrent_Fe_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmCurrent_Fe_Dsply 1; +BA_ "GenSigSendType" SG_ 1098 EdmCmplnc_B_Dsply 3; +BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmCmplnc_B_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmCmplnc_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1098 EdmCmplnc_Pc_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1098 EdmCmplnc_Pc_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1086 EngMnfld_P_Actl 2068; +BA_ "U_P702_MY2021_Tx" SG_ 1086 EngMnfld_P_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1086 EngMnfld_P_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1086 FuelPumpPwr_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1086 FuelPumpPwr_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1086 BattULoChrg_U_Cmd 1; +BA_ "U_P702_MY2021_Tx" SG_ 1086 BattULoChrg_U_Cmd 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1086 BattULoChrg_U_Cmd 1; +BA_ "UsedOnPgmDBC" SG_ 1086 ElLoadCtl_D_Rq 1; +BA_ "ContentDependant" SG_ 1086 ElLoadCtl_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1086 ElLoadCtl_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1086 ElLoadCtl_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1071 EngAout_N_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 EngAout_N_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 1071 CluPdl_PcRate_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1071 CluPdl_PcRate_Actl 1; +BA_ "ContentDependant" SG_ 1071 CluPdl_PcRate_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1071 CluPdl_PcRate_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 CluPdl_PcRate_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "ContentDependant" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "MetaData" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "GenSigStartValue" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "U_P702_MY2021_Tx" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 CluPdlPosPcMeas_D_Qf 1; +BA_ "CrossOver_InfoCAN" SG_ 1071 CluPdlPos_Pc_Meas 1; +BA_ "UsedOnPgmDBC" SG_ 1071 CluPdlPos_Pc_Meas 1; +BA_ "ContentDependant" SG_ 1071 CluPdlPos_Pc_Meas 1; +BA_ "U_P702_MY2021_Rx" SG_ 1071 CluPdlPos_Pc_Meas 1; +BA_ "U_P702_MY2021_Tx" SG_ 1071 CluPdlPos_Pc_Meas 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 CluPdlPos_Pc_Meas 1; +BA_ "CrossOver_InfoCAN" SG_ 1071 EngAoutIdl_N_Ntrl 1; +BA_ "UsedOnPgmDBC" SG_ 1071 EngAoutIdl_N_Ntrl 1; +BA_ "ContentDependant" SG_ 1071 EngAoutIdl_N_Ntrl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1071 EngAoutIdl_N_Ntrl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1071 EngAoutIdl_N_Ntrl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1071 EngAoutIdl_N_Ntrl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1071 EngAoutIdl_N_Ntrl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 SlMde_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 SlMde_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 SlMde_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 SlMde_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 IsaOffst_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 IsaOffst_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1069 GrllShtrPos_D_Cmd 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 GrllShtrPos_D_Cmd 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 GrllShtrPos_D_Cmd 1; +BA_ "CrossOver_InfoCAN" SG_ 1069 GrllShtrPos_B_Falt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 GrllShtrPos_B_Falt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 GrllShtrPos_B_Falt 1; +BA_ "CrossOver_InfoCAN" SG_ 1069 ObdWarmUp_B_Complt 1; +BA_ "ContentDependant" SG_ 1069 ObdWarmUp_B_Complt 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 ObdWarmUp_B_Complt 1; +BA_ "CrossOver_InfoCAN" SG_ 1069 EngMsgTxt_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1069 EngMsgTxt_D_Rq 1; +BA_ "ContentDependant" SG_ 1069 EngMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 EngMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 EngMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1069 EngClnt_Te_ActlDiag 1; +BA_ "ContentDependant" SG_ 1069 EngClnt_Te_ActlDiag 1; +BA_ "U_P702_MY2021_Rx" SG_ 1069 EngClnt_Te_ActlDiag 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1069 EngClnt_Te_ActlDiag 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 EngClnt_Te_ActlDiag 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 EngClnt_Te_ActlDiag 1; +BA_ "CrossOver_InfoCAN" SG_ 1069 EngLoad_Pc_CalcDiag 1; +BA_ "ContentDependant" SG_ 1069 EngLoad_Pc_CalcDiag 1; +BA_ "U_P702_MY2021_Rx" SG_ 1069 EngLoad_Pc_CalcDiag 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1069 EngLoad_Pc_CalcDiag 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 EngLoad_Pc_CalcDiag 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 EngLoad_Pc_CalcDiag 1; +BA_ "CrossOver_InfoCAN" SG_ 1069 EngAirIn_Te_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1069 EngAirIn_Te_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1069 EngAirIn_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1069 EngAirIn_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 EngAirIn_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 EngAirIn_Te_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1069 ApedPos_Pc_ActlDiag 1; +BA_ "ContentDependant" SG_ 1069 ApedPos_Pc_ActlDiag 1; +BA_ "U_P702_MY2021_Rx" SG_ 1069 ApedPos_Pc_ActlDiag 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1069 ApedPos_Pc_ActlDiag 1; +BA_ "U_P702_MY2021_Tx" SG_ 1069 ApedPos_Pc_ActlDiag 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1069 ApedPos_Pc_ActlDiag 1; +BA_ "U_P702_MY2021_Tx" SG_ 1060 RearDiffOilTeWarn_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 RearDiffOilTeWarn_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1060 RearDiffOil_Te_Actl 77; +BA_ "GenSigStartValue" SG_ 1060 RearDiffOil_Te_Actl 77; +BA_ "U_P702_MY2021_Tx" SG_ 1060 RearDiffOil_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 RearDiffOil_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1060 BpedDrvMsgTxt_B_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 BpedDrvMsgTxt_B_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1060 FuelLvl_Pc_DsplyEng 48; +BA_ "GenSigStartValue" SG_ 1060 FuelLvl_Pc_DsplyEng 0; +BA_ "U_P702_MY2021_Tx" SG_ 1060 FuelLvl_Pc_DsplyEng 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 FuelLvl_Pc_DsplyEng 1; +BA_ "U_P702_MY2021_Tx" SG_ 1060 FuelLvlWarn_D_ActlEng 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 FuelLvlWarn_D_ActlEng 1; +BA_ "U_P702_MY2021_Tx" SG_ 1060 FuelRange_L_DsplyEng 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 FuelRange_L_DsplyEng 1; +BA_ "U_P702_MY2021_Rx" SG_ 1060 SelDrvMdePt_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1060 SelDrvMdePt_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1060 SelDrvMdePt_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 FohEng_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1057 FohEng_D_Rq 2; +BA_ "ContentDependant" SG_ 1057 FohEng_D_Rq 1; +BA_ "GenSigStartValue" SG_ 1057 FohEng_D_Rq 2; +BA_ "U_P702_MY2021_Tx" SG_ 1057 FohEng_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 FohEng_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 EngIdlShutDwnTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 EngIdlShutDwnTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 EngIdlShutDown_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1057 EngIdlShutDown_D_Stat 1; +BA_ "ContentDependant" SG_ 1057 EngIdlShutDown_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 EngIdlShutDown_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 EngIdlShutDown_D_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 1057 EngIdlShutDown_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 FUEL_ALCOHOL_PERCNT 1; +BA_ "GenSigStartValueInteger" SG_ 1057 FUEL_ALCOHOL_PERCNT 255; +BA_ "ContentDependant" SG_ 1057 FUEL_ALCOHOL_PERCNT 1; +BA_ "GenSigStartValue" SG_ 1057 FUEL_ALCOHOL_PERCNT 255; +BA_ "U_P702_MY2021_Tx" SG_ 1057 FUEL_ALCOHOL_PERCNT 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 FUEL_ALCOHOL_PERCNT 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 TrnTotTq_Rt_Est 1; +BA_ "UsedOnPgmDBC" SG_ 1057 TrnTotTq_Rt_Est 1; +BA_ "ContentDependant" SG_ 1057 TrnTotTq_Rt_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 TrnTotTq_Rt_Est 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 TrnTotTq_Rt_Est 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 TrnTotLss_Tq_Est 1; +BA_ "UsedOnPgmDBC" SG_ 1057 TrnTotLss_Tq_Est 1; +BA_ "ContentDependant" SG_ 1057 TrnTotLss_Tq_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 TrnTotLss_Tq_Est 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 TrnTotLss_Tq_Est 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 ECMMILRequest 1; +BA_ "UsedOnPgmDBC" SG_ 1057 ECMMILRequest 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 ECMMILRequest 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 ECMMILRequest 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 AirCondFluidHi_P_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1057 AirCondFluidHi_P_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 AirCondFluidHi_P_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 AirCondFluidHi_P_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 OilPressureWarning 1; +BA_ "UsedOnPgmDBC" SG_ 1057 OilPressureWarning 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 OilPressureWarning 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 OilPressureWarning 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 VehVLimStat_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1057 VehVLimStat_D_Actl 1; +BA_ "ContentDependant" SG_ 1057 VehVLimStat_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1057 VehVLimStat_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1057 VehVLimStat_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 VehVLimStat_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 VehVLimStat_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 VehVLimActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1057 VehVLimActv_B_Actl 1; +BA_ "ContentDependant" SG_ 1057 VehVLimActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1057 VehVLimActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1057 VehVLimActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 VehVLimActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 VehVLimActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1057 CoolantFanStepAct 1; +BA_ "UsedOnPgmDBC" SG_ 1057 CoolantFanStepAct 1; +BA_ "U_P702_MY2021_Tx" SG_ 1057 CoolantFanStepAct 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1057 CoolantFanStepAct 1; +BA_ "CrossOver_InfoCAN" SG_ 1055 EcoCochInstNeg_B_Dsply 1; +BA_ "UsedOnPgmDBC" SG_ 1055 EcoCochInstNeg_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochInstNeg_B_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochInstNeg_B_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochInstNeg_B_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochShif_Pc_Dsply 255; +BA_ "GenSigStartValue" SG_ 1055 EcoCochShif_Pc_Dsply 255; +BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochShif_Pc_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochShif_Pc_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochShif_Pc_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochInst_Pc_Dsply 1000; +BA_ "GenSigStartValue" SG_ 1055 EcoCochInst_Pc_Dsply 100; +BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochInst_Pc_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochInst_Pc_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochInst_Pc_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 255; +BA_ "GenSigStartValue" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 255; +BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochIdlFuel_Pc_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochDecel_Pc_Dsply 255; +BA_ "GenSigStartValue" SG_ 1055 EcoCochDecel_Pc_Dsply 255; +BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochDecel_Pc_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochDecel_Pc_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochDecel_Pc_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochCrus_Pc_Dsply 255; +BA_ "GenSigStartValue" SG_ 1055 EcoCochCrus_Pc_Dsply 255; +BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochCrus_Pc_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochCrus_Pc_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochCrus_Pc_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1055 EcoCochA_Pc_Dsply 255; +BA_ "GenSigStartValue" SG_ 1055 EcoCochA_Pc_Dsply 255; +BA_ "U_P702_MY2021_Tx" SG_ 1055 EcoCochA_Pc_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 1055 EcoCochA_Pc_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 1055 EcoCochA_Pc_Dsply 1; +BA_ "ContentDependant" SG_ 562 GearNtrl_No_Cs 1; +BA_ "MetaData" SG_ 562 GearNtrl_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 562 GearNtrl_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 562 GearNtrl_No_Cs 1; +BA_ "ContentDependant" SG_ 562 GearNtrl_No_Cnt 1; +BA_ "MetaData" SG_ 562 GearNtrl_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 562 GearNtrl_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 562 GearNtrl_No_Cnt 1; +BA_ "GenSigStartValueInteger" SG_ 562 GearNtrl_D_Stat 2; +BA_ "GenSigStartValue" SG_ 562 GearNtrl_D_Stat 2; +BA_ "GenSigSendType" SG_ 562 GearNtrl_D_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 562 GearNtrl_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 562 GearNtrl_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 523 EngAirFiltMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 EngAirFiltMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 523 WaterInFuel_B_Falt 1; +BA_ "UsedOnPgmDBC" SG_ 523 WaterInFuel_B_Falt 1; +BA_ "U_P702_MY2021_Tx" SG_ 523 WaterInFuel_B_Falt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 WaterInFuel_B_Falt 1; +BA_ "U_P702_MY2021_Tx" SG_ 523 UreaMnAdd_L2_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 UreaMnAdd_L2_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 523 VehUreaRnge3_L_DsplyMx 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 VehUreaRnge3_L_DsplyMx 1; +BA_ "ECGUsedRxSignal" SG_ 523 VehUreaRnge3_L_DsplyMx 1; +BA_ "GenSigStartValueInteger" SG_ 523 UreaMxAdd_L2_Actl 510; +BA_ "GenSigStartValue" SG_ 523 UreaMxAdd_L2_Actl 510; +BA_ "U_P702_MY2021_Tx" SG_ 523 UreaMxAdd_L2_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 523 UreaMxAdd_L2_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 517 FapLc_B_Err 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 517 FapLc_B_Err 1; +BA_ "U_CX727_MY2021_Rx" SG_ 517 BrkTot_Tq_RqFapLc 1; +BA_ "U_P702_MY2021_Rx" SG_ 517 BrkTot_Tq_RqFapLc 1; +BA_ "U_P702_MY2021_Tx" SG_ 517 BrkTot_Tq_RqFapLc 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 517 BrkTot_Tq_RqFapLc 1; +BA_ "U_P702_MY2021_Tx" SG_ 517 TrnAin_Pc_RqDrv 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 517 TrnAin_Pc_RqDrv 1; +BA_ "CrossOver_InfoCAN" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "UsedOnPgmDBC" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "GenSigStartValueInteger" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "MetaData" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "GenSigStartValue" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "U_P702_MY2021_Rx" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "U_P702_MY2021_Tx" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 EngAoutNActl_D_QF 1; +BA_ "CrossOver_InfoCAN" SG_ 516 EngAout3_N_Actl 1; +BA_ "ContentDependant" SG_ 516 EngAout3_N_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 516 EngAout3_N_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 516 ApedPos_PcRate_ActlArb 1; +BA_ "UsedOnPgmDBC" SG_ 516 ApedPos_PcRate_ActlArb 1; +BA_ "U_P702_MY2021_Rx" SG_ 516 ApedPos_PcRate_ActlArb 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 ApedPos_PcRate_ActlArb 1; +BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPos_PcRate_ActlArb 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPos_PcRate_ActlArb 1; +BA_ "CrossOver_InfoCAN" SG_ 516 ApedPos_Pc_ActlArb 1; +BA_ "UsedOnPgmDBC" SG_ 516 ApedPos_Pc_ActlArb 1; +BA_ "U_P702_MY2021_Rx" SG_ 516 ApedPos_Pc_ActlArb 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 ApedPos_Pc_ActlArb 1; +BA_ "U_CX727_MY2021_Rx" SG_ 516 ApedPos_Pc_ActlArb 1; +BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPos_Pc_ActlArb 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPos_Pc_ActlArb 1; +BA_ "ECGUsedRxSignal" SG_ 516 ApedPos_Pc_ActlArb 1; +BA_ "CrossOver_InfoCAN" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "MetaData" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "GenSigStartValue" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPosPcActl_D_Qf 1; +BA_ "CrossOver_InfoCAN" SG_ 516 EngAout_N_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 516 EngAout_N_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 516 EngAout_N_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 516 EngAout_N_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 516 EngAout_N_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 516 EngAout_N_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 EngAout_N_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 516 EngAout_N_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 516 ApedPosPcActl_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 516 ApedPosPcActl_No_Cnt 1; +BA_ "ContentDependant" SG_ 516 ApedPosPcActl_No_Cnt 1; +BA_ "MetaData" SG_ 516 ApedPosPcActl_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPosPcActl_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPosPcActl_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 516 ApedPosPcActl_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 516 ApedPosPcActl_No_Cs 1; +BA_ "ContentDependant" SG_ 516 ApedPosPcActl_No_Cs 1; +BA_ "MetaData" SG_ 516 ApedPosPcActl_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 516 ApedPosPcActl_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 516 ApedPosPcActl_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 StrtrMtrDlyStrt_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 StrtrMtrDlyStrt_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 514 VehVTrlrAid_B_Avail 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 VehVTrlrAid_B_Avail 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 VehVTrlrAid_B_Avail 1; +BA_ "CrossOver_InfoCAN" SG_ 514 StrtrMtrCtlMsgTxt_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 514 StrtrMtrCtlMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 StrtrMtrCtlMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 StrtrMtrCtlMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 514 VehVActlEng_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 514 VehVActlEng_No_Cs 1; +BA_ "MetaData" SG_ 514 VehVActlEng_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 514 VehVActlEng_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 514 VehVActlEng_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 VehVActlEng_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 VehVActlEng_No_Cs 1; +BA_ "CrossOver_InfoCAN" SG_ 514 VehVActlEng_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 514 VehVActlEng_No_Cnt 1; +BA_ "MetaData" SG_ 514 VehVActlEng_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 514 VehVActlEng_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 514 VehVActlEng_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 VehVActlEng_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 VehVActlEng_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 514 Veh_V_RqCcSet 1; +BA_ "UsedOnPgmDBC" SG_ 514 Veh_V_RqCcSet 1; +BA_ "U_P702_MY2021_Rx" SG_ 514 Veh_V_RqCcSet 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 514 Veh_V_RqCcSet 1; +BA_ "U_CX727_MY2021_Rx" SG_ 514 Veh_V_RqCcSet 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 Veh_V_RqCcSet 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 Veh_V_RqCcSet 1; +BA_ "CrossOver_InfoCAN" SG_ 514 VehVActlEng_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 514 VehVActlEng_D_Qf 1; +BA_ "MetaData" SG_ 514 VehVActlEng_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 514 VehVActlEng_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 514 VehVActlEng_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 514 VehVActlEng_D_Qf 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 VehVActlEng_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 VehVActlEng_D_Qf 1; +BA_ "CrossOver_InfoCAN" SG_ 514 Veh_V_ActlEng 1; +BA_ "UsedOnPgmDBC" SG_ 514 Veh_V_ActlEng 1; +BA_ "U_P702_MY2021_Rx" SG_ 514 Veh_V_ActlEng 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 514 Veh_V_ActlEng 1; +BA_ "U_CX727_MY2021_Rx" SG_ 514 Veh_V_ActlEng 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 Veh_V_ActlEng 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 Veh_V_ActlEng 1; +BA_ "ECGUsedRxSignal" SG_ 514 Veh_V_ActlEng 1; +BA_ "CrossOver_InfoCAN" SG_ 514 GearRvrse_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 514 GearRvrse_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 514 GearRvrse_D_Actl 7; +BA_ "GenSigStartValue" SG_ 514 GearRvrse_D_Actl 7; +BA_ "U_CX727_MY2021_Rx" SG_ 514 GearRvrse_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 514 GearRvrse_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 GearRvrse_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 GearRvrse_D_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 514 GearRvrse_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 514 StrtrMtrCtlMsgTxt_D2_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 514 StrtrMtrCtlMsgTxt_D2_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 512 PrplWhlTotTqRq_No_Cs 1; +BA_ "ContentDependant" SG_ 512 PrplWhlTotTqRq_No_Cs 1; +BA_ "MetaData" SG_ 512 PrplWhlTotTqRq_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 512 PrplWhlTotTqRq_No_Cs 1; +BA_ "U_P702_MY2021_Tx" SG_ 512 PrplWhlTotTqRq_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 512 PrplWhlTotTqRq_No_Cnt 1; +BA_ "ContentDependant" SG_ 512 PrplWhlTotTqRq_No_Cnt 1; +BA_ "MetaData" SG_ 512 PrplWhlTotTqRq_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 512 PrplWhlTotTqRq_No_Cnt 1; +BA_ "U_P702_MY2021_Tx" SG_ 512 PrplWhlTotTqRq_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 512 PrplWhlTot_Tq_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 512 PrplWhlTot_Tq_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 512 PrplWhlTot_Tq_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 512 PrplWhlTot_Tq_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 512 PrplWhlTot_Tq_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 512 PrplWhlTot_Tq_LimMn 1; +BA_ "U_CX727_MY2021_Rx" SG_ 512 PrplWhlTot_Tq_LimMn 1; +BA_ "U_P702_MY2021_Rx" SG_ 512 PrplWhlTot_Tq_LimMn 1; +BA_ "U_P702_MY2021_Tx" SG_ 512 PrplWhlTot_Tq_LimMn 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 512 PrplWhlTot_Tq_LimMn 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 512 PtDrvMde_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 512 PtDrvMde_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 381 EngOilLife_T_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 EngOilLife_T_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 381 EngOilSrvcMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 EngOilSrvcMsgTxt_D_Rq 1; +BA_ "ECGUsedRxSignal" SG_ 381 EngOilSrvcMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 381 DistToNextOilChange 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 DistToNextOilChange 1; +BA_ "U_P702_MY2021_Tx" SG_ 381 RunDryPrevent_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 RunDryPrevent_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 381 WaterInFuel 1; +BA_ "UsedOnPgmDBC" SG_ 381 WaterInFuel 1; +BA_ "U_P702_MY2021_Tx" SG_ 381 WaterInFuel 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 WaterInFuel 1; +BA_ "ECGUsedRxSignal" SG_ 381 WaterInFuel 1; +BA_ "CrossOver_InfoCAN" SG_ 381 GlowIndication 1; +BA_ "UsedOnPgmDBC" SG_ 381 GlowIndication 1; +BA_ "U_P702_MY2021_Tx" SG_ 381 GlowIndication 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 381 GlowIndication 1; +BA_ "WakeupSignal" SG_ 380 EngOilLvlWarn_D_Rq1 1; +BA_ "CrossOver_InfoCAN" SG_ 380 EngOilLvlWarn_D_Rq1 1; +BA_ "U_P702_MY2021_Tx" SG_ 380 EngOilLvlWarn_D_Rq1 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngOilLvlWarn_D_Rq1 1; +BA_ "CrossOver_InfoCAN" SG_ 380 EngExhBrkOnLamp_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 380 EngExhBrkOnLamp_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngExhBrkOnLamp_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 380 EngExhBrkAutoLamp_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 380 EngExhBrkAutoLamp_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngExhBrkAutoLamp_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 380 EngAout_N_MxAllw 1; +BA_ "UsedOnPgmDBC" SG_ 380 EngAout_N_MxAllw 1; +BA_ "U_P702_MY2021_Tx" SG_ 380 EngAout_N_MxAllw 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngAout_N_MxAllw 1; +BA_ "CrossOver_InfoCAN" SG_ 380 EngExhBrkMde_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 380 EngExhBrkMde_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 380 EngExhBrkMde_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 380 EngExhBrkMde_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 380 EngExhBrkMde_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 377 HvacAirFullOut_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 HvacAirFullOut_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 377 FuelFlw_Vl_Dsply 1; +BA_ "UsedOnPgmDBC" SG_ 377 FuelFlw_Vl_Dsply 1; +BA_ "ContentDependant" SG_ 377 FuelFlw_Vl_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 FuelFlw_Vl_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 FuelFlw_Vl_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 377 FuelFlw_Vl_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 377 FuelFillInlet_B_Dsply 1; +BA_ "UsedOnPgmDBC" SG_ 377 FuelFillInlet_B_Dsply 1; +BA_ "ContentDependant" SG_ 377 FuelFillInlet_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 FuelFillInlet_B_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 FuelFillInlet_B_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 377 EngSrvcRqd_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 377 EngSrvcRqd_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 EngSrvcRqd_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 EngSrvcRqd_B_Rq 1; +BA_ "ECGUsedRxSignal" SG_ 377 EngSrvcRqd_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 377 OdoCount 1; +BA_ "UsedOnPgmDBC" SG_ 377 OdoCount 1; +BA_ "ContentDependant" SG_ 377 OdoCount 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 OdoCount 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 OdoCount 1; +BA_ "CrossOver_InfoCAN" SG_ 377 EngOilLife_Pc_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 377 EngOilLife_Pc_Actl 1; +BA_ "ContentDependant" SG_ 377 EngOilLife_Pc_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 EngOilLife_Pc_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 EngOilLife_Pc_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 377 EngOilLife_Pc_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 377 FuelFilterLamp_B_Dsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 FuelFilterLamp_B_Dsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 FuelFilterLamp_B_Dsply 1; +BA_ "ECGUsedRxSignal" SG_ 377 FuelFilterLamp_B_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 377 AirCondRec_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 377 AirCondRec_B_Rq 1; +BA_ "ContentDependant" SG_ 377 AirCondRec_B_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 AirCondRec_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 AirCondRec_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 377 AirCondClutch_B_Stats 1; +BA_ "UsedOnPgmDBC" SG_ 377 AirCondClutch_B_Stats 1; +BA_ "ContentDependant" SG_ 377 AirCondClutch_B_Stats 1; +BA_ "U_P702_MY2021_Tx" SG_ 377 AirCondClutch_B_Stats 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 377 AirCondClutch_B_Stats 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 GasPrtc_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 GasPrtc_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 376 EngAout_Aa_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 376 EngAout_Aa_Actl 1; +BA_ "ContentDependant" SG_ 376 EngAout_Aa_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 376 EngAout_Aa_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 376 EngAout_Aa_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 EngAout_Aa_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 EngAout_Aa_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 376 DynoMde_B_Cmd 1; +BA_ "U_P702_MY2021_Rx" SG_ 376 DynoMde_B_Cmd 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 376 DynoMde_B_Cmd 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 DynoMde_B_Cmd 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 DynoMde_B_Cmd 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 AslIconDsply_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AslIconDsply_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 AslChime_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AslChime_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 376 HvacHtrCore2_Te_Actl 200; +BA_ "U_P702_MY2021_Tx" SG_ 376 HvacHtrCore2_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 EcssLamp_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 EcssLamp_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "MetaData" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "GenSigStartValue" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AirAmbTe_D_Qf 1; +BA_ "CrossOver_InfoCAN" SG_ 376 AirAmb_Te_ActlFilt 1; +BA_ "UsedOnPgmDBC" SG_ 376 AirAmb_Te_ActlFilt 1; +BA_ "GenSigStartValueInteger" SG_ 376 AirAmb_Te_ActlFilt 512; +BA_ "U_P702_MY2021_Tx" SG_ 376 AirAmb_Te_ActlFilt 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AirAmb_Te_ActlFilt 1; +BA_ "ECGUsedRxSignal" SG_ 376 AirAmb_Te_ActlFilt 1; +BA_ "CrossOver_InfoCAN" SG_ 376 AirAmb_Te_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 376 AirAmb_Te_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 376 AirAmb_Te_Actl 512; +BA_ "U_P702_MY2021_Rx" SG_ 376 AirAmb_Te_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 376 AirAmb_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 AirAmb_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AirAmb_Te_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 376 AirAmb_P_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 376 AirAmb_P_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 376 AirAmb_P_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 376 AirAmb_P_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 376 AirAmb_P_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 373 DieslPrtc2_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 373 DieslPrtc2_D_RqDsply 1; +BA_ "ECGUsedRxSignal" SG_ 373 DieslPrtc2_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 373 DieslPrtcRgen_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 373 DieslPrtcRgen_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 373 DieslPrtcRgen_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 373 DieslPrtcRgen_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 373 DieslPrtcRgen_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 373 DieslPrtcRgen_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 373 EngTeColdPrtct_D_Stats 1; +BA_ "UsedOnPgmDBC" SG_ 373 EngTeColdPrtct_D_Stats 1; +BA_ "U_P702_MY2021_Tx" SG_ 373 EngTeColdPrtct_D_Stats 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 373 EngTeColdPrtct_D_Stats 1; +BA_ "CrossOver_InfoCAN" SG_ 373 EngExhOvrTe_B_RqDsply 1; +BA_ "UsedOnPgmDBC" SG_ 373 EngExhOvrTe_B_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 373 EngExhOvrTe_B_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 373 EngExhOvrTe_B_RqDsply 1; +BA_ "ECGUsedRxSignal" SG_ 373 EngExhOvrTe_B_RqDsply 1; +BA_ "GenSigStartValueInteger" SG_ 359 PrplWhlRgenMn_Tq_Actl 4095; +BA_ "U_CX727_MY2021_Rx" SG_ 359 PrplWhlRgenMn_Tq_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 359 PrplWhlRgenMn_Tq_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 359 PrplWhlRgenMn_Tq_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 359 ElPw_D_StatStrtStop 1; +BA_ "U_P702_MY2021_Rx" SG_ 359 ElPw_D_StatStrtStop 1; +BA_ "U_P702_MY2021_Tx" SG_ 359 ElPw_D_StatStrtStop 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 ElPw_D_StatStrtStop 1; +BA_ "CrossOver_InfoCAN" SG_ 359 TrnAin_Tq_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 359 TrnAin_Tq_Actl 1; +BA_ "ContentDependant" SG_ 359 TrnAin_Tq_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 359 TrnAin_Tq_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 359 TrnAin_Tq_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 359 TrnAin_Tq_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 TrnAin_Tq_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 359 PrplWhlTot2_Tq_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 359 PrplWhlTot2_Tq_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 359 PrplWhlTot2_Tq_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 359 PrplWhlTot2_Tq_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 359 PrplWhlTot2_Tq_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 PrplWhlTot2_Tq_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 359 PrplWhlTot2_Tq_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 359 PwPckTq_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 359 PwPckTq_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 359 PwPckTq_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 359 PwPckTq_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 359 PwPckTq_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 359 PwPckTq_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 PwPckTq_D_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 359 PwPckTq_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 359 Eng_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 359 Eng_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 359 Eng_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 359 Eng_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 359 Eng_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 Eng_D_Stat 1; +BA_ "ECGUsedRxSignal" SG_ 359 Eng_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 359 PlgActvArb_B_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 359 PlgActvArb_B_Actl 1; +BA_ "ContentDependant" SG_ 359 PlgActvArb_B_Actl 1; +BA_ "GenSigStartValue" SG_ 359 PlgActvArb_B_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 359 PlgActvArb_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 359 ElPw_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 359 ElPw_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 359 ElPw_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 359 ElPw_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 359 ElPw_D_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 359 ElPw_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 ElPw_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 359 TrnAinTq_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 359 TrnAinTq_D_Qf 1; +BA_ "ContentDependant" SG_ 359 TrnAinTq_D_Qf 1; +BA_ "MetaData" SG_ 359 TrnAinTq_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 359 TrnAinTq_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 359 TrnAinTq_D_Qf 1; +BA_ "U_P702_MY2021_Tx" SG_ 359 TrnAinTq_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 359 TrnAinTq_D_Qf 1; +BA_ "CrossOver_InfoCAN" SG_ 358 StopStrtStdby_D_Indic 1; +BA_ "GenSigStartValueInteger" SG_ 358 StopStrtStdby_D_Indic 0; +BA_ "U_P702_MY2021_Tx" SG_ 358 StopStrtStdby_D_Indic 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 StopStrtStdby_D_Indic 1; +BA_ "CrossOver_InfoCAN" SG_ 358 StopStrtIODTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 358 StopStrtIODTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 StopStrtIODTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 358 StopStrtDrvMde_D_Indic 1; +BA_ "U_P702_MY2021_Tx" SG_ 358 StopStrtDrvMde_D_Indic 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 StopStrtDrvMde_D_Indic 1; +BA_ "CrossOver_InfoCAN" SG_ 358 StopStrtMsgTxt_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 358 StopStrtMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 StopStrtMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 358 OdoTripVerify_L_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 358 OdoTripVerify_L_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 OdoTripVerify_L_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 358 HiElPwInhbt_B_Stat 1; +BA_ "ContentDependant" SG_ 358 HiElPwInhbt_B_Stat 1; +BA_ "U_P702_MY2021_Tx" SG_ 358 HiElPwInhbt_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 HiElPwInhbt_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 358 AutoStopPtDelta_I_Est 1; +BA_ "GenSigStartValueInteger" SG_ 358 AutoStopPtDelta_I_Est 127; +BA_ "ContentDependant" SG_ 358 AutoStopPtDelta_I_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 358 AutoStopPtDelta_I_Est 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 358 AutoStopPtDelta_I_Est 1; +BA_ "UsedOnPgmDBC" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "GenSigStartValueInteger" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "MetaData" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "GenSigStartValue" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "U_P702_MY2021_Rx" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "U_CX727_MY2021_Rx" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 BPedDrvAppl_D_QF 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 CmbbDeny_B_ActlPrpl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CmbbDeny_B_ActlPrpl 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 PrplTqMnSat_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 PrplTqMnSat_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "GenSigStartValue" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 357 BpedDrvAppl_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 CmbbEngTqMn_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CmbbEngTqMn_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 357 Veh_V_DsplyCcSet 1; +BA_ "UsedOnPgmDBC" SG_ 357 Veh_V_DsplyCcSet 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 Veh_V_DsplyCcSet 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 Veh_V_DsplyCcSet 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 AccEngStat_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 AccEngStat_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 357 CcMde_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 357 CcMde_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 357 CcMde_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 CcMde_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 CcMde_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CcMde_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 357 CcStat_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 357 CcStat_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 357 CcStat_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 CcStat_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 357 CcStat_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 CcStat_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CcStat_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 EngAout_N_MnAllw 1; +BA_ "CrossOver_InfoCAN" SG_ 357 CcOvrrdActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 357 CcOvrrdActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 357 CcOvrrdActv_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 357 CcOvrrdActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 CcOvrrdActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 CcOvrrdActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 357 AccStopMde_D_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 357 AccStopMde_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 357 AccStopMde_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 357 AccStopMde_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 357 AccStopMde_D_Rq 1; +BA_ "U_P702_MY2021_Tx" SG_ 355 AutoRgenTxt_B_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 AutoRgenTxt_B_RqDsply 1; +BA_ "ECGUsedRxSignal" SG_ 355 AutoRgenTxt_B_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 355 AccFllwMdeActv_B_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 355 AccFllwMdeActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 AccFllwMdeActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 355 EngPtoMde_D_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 355 EngPtoMde_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 EngPtoMde_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 355 ManRgenTxt_D_RqDsply 1; +BA_ "UsedOnPgmDBC" SG_ 355 ManRgenTxt_D_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 355 ManRgenTxt_D_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 ManRgenTxt_D_RqDsply 1; +BA_ "ECGUsedRxSignal" SG_ 355 ManRgenTxt_D_RqDsply 1; +BA_ "CrossOver_InfoCAN" SG_ 355 ManRgenSoot_Pc_RqDsply 1; +BA_ "UsedOnPgmDBC" SG_ 355 ManRgenSoot_Pc_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 355 ManRgenSoot_Pc_RqDsply 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 ManRgenSoot_Pc_RqDsply 1; +BA_ "ECGUsedRxSignal" SG_ 355 ManRgenSoot_Pc_RqDsply 1; +BA_ "U_P702_MY2021_Tx" SG_ 355 DieslMsgTxt_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 355 DieslMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 342 EngOvrhtMitgActv_D_Ind 1; +BA_ "UsedOnPgmDBC" SG_ 342 EngOvrhtMitgActv_D_Ind 1; +BA_ "ContentDependant" SG_ 342 EngOvrhtMitgActv_D_Ind 1; +BA_ "U_P702_MY2021_Tx" SG_ 342 EngOvrhtMitgActv_D_Ind 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 342 EngOvrhtMitgActv_D_Ind 1; +BA_ "CrossOver_InfoCAN" SG_ 342 EngClntTe_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 342 EngClntTe_D_Qf 1; +BA_ "MetaData" SG_ 342 EngClntTe_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 342 EngClntTe_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 342 EngClntTe_D_Qf 1; +BA_ "U_P702_MY2021_Tx" SG_ 342 EngClntTe_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 342 EngClntTe_D_Qf 1; +BA_ "CrossOver_InfoCAN" SG_ 342 EngGoutLss_Tq_Est 1; +BA_ "ContentDependant" SG_ 342 EngGoutLss_Tq_Est 1; +BA_ "U_P702_MY2021_Tx" SG_ 342 EngGoutLss_Tq_Est 1; +BA_ "CrossOver_InfoCAN" SG_ 342 EngOil_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 342 EngOil_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 342 EngOil_Te_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 342 EngClnt_Te_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 342 EngClnt_Te_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 342 EngClnt_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 342 EngClnt_Te_Actl 1; +BA_ "U_P702_MY2021_Tx" SG_ 342 EngClnt_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 342 EngClnt_Te_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 342 EngClnt_Te_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 71 immoTarget1Status 1; +BA_ "U_P702_MY2021_Rx" SG_ 71 immoTarget1Status 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 71 immoTarget1Status 1; +BA_ "U_CX727_MY2021_Rx" SG_ 71 immoTarget1Status 1; +BA_ "U_P702_MY2021_Tx" SG_ 71 immoTarget1Status 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 71 immoTarget1Status 1; +BA_ "UsedOnPgmDBC" SG_ 71 immoTarget1Data 1; +BA_ "U_CX727_MY2021_Rx" SG_ 71 immoTarget1Data 1; +BA_ "U_P702_MY2021_Rx" SG_ 71 immoTarget1Data 1; +BA_ "U_P702_MY2021_Tx" SG_ 71 immoTarget1Data 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 71 immoTarget1Data 1; +BA_ "UsedOnPgmDBC" SG_ 71 immoTarget1Cmd 1; +BA_ "U_CX727_MY2021_Rx" SG_ 71 immoTarget1Cmd 1; +BA_ "U_P702_MY2021_Rx" SG_ 71 immoTarget1Cmd 1; +BA_ "U_P702_MY2021_Tx" SG_ 71 immoTarget1Cmd 1; +BA_ "U_T6_MCA_MY2020_Tx" SG_ 71 immoTarget1Cmd 1; +BA_ "GenSigSendType" SG_ 1822 TesterPhysicalResGWM_F1 3; +BA_ "ECGUsedTxSignal" SG_ 1822 TesterPhysicalResGWM_F1 1; +BA_ "GenSigStartValueInteger" SG_ 1438 GWM_GWOnBoardTester 255; +BA_ "ContentDependant" SG_ 1438 GWM_GWOnBoardTester 1; +BA_ "GenSigStartValue" SG_ 1438 GWM_GWOnBoardTester 255; +BA_ "ECGUsedTxSignal" SG_ 1438 GWM_GWOnBoardTester 1; +BA_ "GenSigStartValueInteger" SG_ 1438 GWM_GWNMProxy 255; +BA_ "ContentDependant" SG_ 1438 GWM_GWNMProxy 1; +BA_ "GenSigStartValue" SG_ 1438 GWM_GWNMProxy 255; +BA_ "ECGUsedTxSignal" SG_ 1438 GWM_GWNMProxy 1; +BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMReserved4 255; +BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMReserved4 1; +BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMReserved4 255; +BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMReserved4 1; +BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMReserved3 255; +BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMReserved3 1; +BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMReserved3 255; +BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMReserved3 1; +BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMReserved2 255; +BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMReserved2 1; +BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMReserved2 255; +BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMReserved2 1; +BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMReserved1 255; +BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMReserved1 1; +BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMReserved1 255; +BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMReserved1 1; +BA_ "GenSigStartValueInteger" SG_ 1438 GWM_AutoSarNMNodeId 158; +BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMNodeId 1; +BA_ "GenSigStartValue" SG_ 1438 GWM_AutoSarNMNodeId 158; +BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMNodeId 1; +BA_ "ContentDependant" SG_ 1438 GWM_AutoSarNMControl 1; +BA_ "ECGUsedTxSignal" SG_ 1438 GWM_AutoSarNMControl 1; +BA_ "U_P702_MY2021_Rx" SG_ 954 GenericSwtch3_No_Actl 1; +BA_ "ContentDependant" SG_ 954 GenericSwtch2_No_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 954 GenericSwtch2_No_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 954 GenericSwtch1_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1006 PersIndexIpmb_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1006 PersIndexIpmb_D_Actl 4; +BA_ "GenSigStartValue" SG_ 1006 PersIndexIpmb_D_Actl 4; +BA_ "GenSigSendType" SG_ 1006 PersIndexIpmb_D_Actl 3; +BA_ "CrossOver_InfoCAN" SG_ 1006 FeatNoIpmbActl 1; +BA_ "GenSigSendType" SG_ 1006 FeatNoIpmbActl 3; +BA_ "CrossOver_InfoCAN" SG_ 1006 FeatConfigIpmbActl 1; +BA_ "GenSigSendType" SG_ 1006 FeatConfigIpmbActl 3; +BA_ "GenSigSendType" SG_ 820 AhbStatGfhbFdbk_D_Actl 3; +BA_ "U_P702_MY2021_Tx" SG_ 820 AhbStatGfhbFdbk_D_Actl 1; +BA_ "GenSigSendType" SG_ 820 HeadLghtDrvSide_B_Stat 3; +BA_ "U_P702_MY2021_Tx" SG_ 820 HeadLghtDrvSide_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 820 HeadLghtHiOn_B_StatHcm 1; +BA_ "GenSigSendType" SG_ 820 HeadLghtHiOn_B_StatHcm 3; +BA_ "U_P702_MY2021_Tx" SG_ 820 HeadLghtHiOn_B_StatHcm 1; +BA_ "CrossOver_InfoCAN" SG_ 820 Adaptive_Hdlmp_Fault 1; +BA_ "GenSigSendType" SG_ 820 Adaptive_Hdlmp_Fault 3; +BA_ "U_P702_MY2021_Tx" SG_ 820 Adaptive_Hdlmp_Fault 1; +BA_ "GenSigStartValueInteger" SG_ 137 SteWhlOffstRq_D_Stat 2; +BA_ "GenSigStartValue" SG_ 137 SteWhlOffstRq_D_Stat 2; +BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlOffstRq_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 137 SteWhlOffst_An_TotActl 32766; +BA_ "GenSigStartValue" SG_ 137 SteWhlOffst_An_TotActl 32765; +BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlOffst_An_TotActl 1; +BA_ "GenSigStartValueInteger" SG_ 137 SteWhlBrkOffst_An_Actl 32766; +BA_ "GenSigStartValue" SG_ 137 SteWhlBrkOffst_An_Actl 32765; +BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlBrkOffst_An_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 137 SteWhlBrkAnActl_No_Cs 1; +BA_ "MetaData" SG_ 137 SteWhlBrkAnActl_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlBrkAnActl_No_Cs 1; +BA_ "CrossOver_InfoCAN" SG_ 137 SteWhlBrkAnActl_No_Cnt 1; +BA_ "MetaData" SG_ 137 SteWhlBrkAnActl_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 137 SteWhlBrkAnActl_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 129 SelDrvMdeSwtch_D_Stat4 1; +BA_ "U_P702_MY2021_Rx" SG_ 129 SelDrvMdeSwtch_D_Stat4 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchView_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchSet_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchPhon_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchNav_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchMed_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchIod_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchHud_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchBack_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchMenu_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchUp_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchRght_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchOk_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchLeft_B_Stat 1; +BA_ "WakeupSignal" SG_ 129 SteWhlSwtchDown_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 935 SodRight_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 935 SodRight_D_Stat 2; +BA_ "GenSigStartValue" SG_ 935 SodRight_D_Stat 2; +BA_ "GenSigSendType" SG_ 935 SodRight_D_Stat 3; +BA_ "GenSigSendType" SG_ 935 CtaAlrtRight2_D_Stat 3; +BA_ "GenSigSendType" SG_ 935 BttRight_D_Stat 3; +BA_ "GenSigSendType" SG_ 935 BttRight_D_RqDrv 3; +BA_ "GenSigSendType" SG_ 935 CtaBrkRightMsgTxt_B_Rq 3; +BA_ "GenSigSendType" SG_ 935 CtaRightBrkEnbl_B_Rq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 935 CtaRightBrkEnbl_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 935 CtaRightBrkEnbl_B_Rq 1; +BA_ "GenSigSendType" SG_ 935 CtaRightBrkDecel_B_Rq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 935 CtaRightBrkDecel_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 935 CtaRightBrkDecel_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 935 Side_Detect_R_Illum 1; +BA_ "GenSigStartValueInteger" SG_ 935 Side_Detect_R_Illum 100; +BA_ "GenSigStartValue" SG_ 935 Side_Detect_R_Illum 100; +BA_ "CrossOver_InfoCAN" SG_ 935 CtaSnsRight_D_Stat 1; +BA_ "GenSigSendType" SG_ 935 CtaSnsRight_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 935 CtaAlrtRight_D_Stat 1; +BA_ "GenSigSendType" SG_ 935 CtaAlrtRight_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 935 CtaRight_D_Stat 1; +BA_ "GenSigSendType" SG_ 935 CtaRight_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 935 SodSnsRight_D_Stat 1; +BA_ "GenSigSendType" SG_ 935 SodSnsRight_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 935 SodAlrtRight_D_Stat 1; +BA_ "GenSigSendType" SG_ 935 SodAlrtRight_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 935 SodDetctRight_D_Stat 1; +BA_ "GenSigSendType" SG_ 935 SodDetctRight_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 935 SodWarnRight_Prd_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 935 SodWarnRight_Prd_Rq 14; +BA_ "GenSigStartValue" SG_ 935 SodWarnRight_Prd_Rq 14; +BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte8 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte8 1; +BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte8 1; +BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte7 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte7 1; +BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte7 1; +BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte6 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte6 1; +BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte6 1; +BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte5 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte5 1; +BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte5 1; +BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte4 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte4 1; +BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte4 1; +BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte3 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte3 1; +BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte3 1; +BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte2 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte2 1; +BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte2 1; +BA_ "UsedOnPgmDBC" SG_ 1108 RCMSerialNoByte1 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1108 RCMSerialNoByte1 1; +BA_ "U_P702_MY2021_Rx" SG_ 1108 RCMSerialNoByte1 1; +BA_ "GenSigStartValueInteger" SG_ 261 ChrgStatDsply_D_Rq 1; +BA_ "GenSigStartValue" SG_ 261 ChrgStatDsply_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1146 TrlrAidSwtch_D_RqDrv 1; +BA_ "GenSigStartValueInteger" SG_ 1146 TrlrAidCtl_U_RqDrv 4094; +BA_ "GenSigStartValue" SG_ 1146 TrlrAidCtl_U_RqDrv 4093; +BA_ "U_P702_MY2021_Rx" SG_ 1146 TrlrAidCtl_U_RqDrv 1; +BA_ "U_P702_MY2021_Rx" SG_ 533 TrlrAidMde_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTOn_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 533 OnbChrgGoTOn_D_Rq 2; +BA_ "GenSigStartValue" SG_ 533 OnbChrgGoTOn_D_Rq 2; +BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTMnte_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 533 OnbChrgGoTMnte_D_Rq 1; +BA_ "MetaData" SG_ 533 OnbChrgGoTMnte_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 533 OnbChrgGoTHr_T_Rq 30; +BA_ "GenSigStartValue" SG_ 533 OnbChrgGoTHr_T_Rq 30; +BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTElement_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 533 OnbChrgGoTElement_D_Rq 1; +BA_ "MetaData" SG_ 533 OnbChrgGoTElement_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTDelete_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgClearAll_B_Rq 1; +BA_ "ECGUsedTxSignal" SG_ 533 OnbChrgClearAll_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 533 OnbChrgGoTUpdate_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1041 ElCmpr_Pw_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAuxIsol_D_Rq 1; +BA_ "GenSigStartValue" SG_ 1067 BattULoAuxIsol_D_Rq 2; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_U_Rq 1; +BA_ "GenSigStartValue" SG_ 1067 BattULoAux_U_Rq 3296; +BA_ "GenSigStartValueInteger" SG_ 1067 BattULoAuxSoc_Pc_Actl 95; +BA_ "GenSigStartValue" SG_ 1067 BattULoAuxSoc_Pc_Actl 95; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAuxSoc_Pc_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1067 BattULoAux_I_Actl 2048; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_I_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_D_Qlty 1; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoCrnkStrt_U_Pred 1; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoCrnkBelt_U_Pred 1; +BA_ "GenSigStartValueInteger" SG_ 1067 BattULoAux_U_Actl 203; +BA_ "GenSigStartValue" SG_ 1067 BattULoAux_U_Actl 203; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_U_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1067 BattULoAux_B_Falt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1112 BattTracChrgSustn_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1112 BattTracCnnct_D_Cmd 1; +BA_ "U_P702_MY2021_Rx" SG_ 1112 BattTracHvilOpen_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1112 BattTracDcdcDis_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1112 BattTracDelta_Te_Actl 164; +BA_ "GenSigStartValue" SG_ 1112 BattTracDelta_Te_Actl 120; +BA_ "ContentDependant" SG_ 1112 BattTracClntPmp_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 139 AfsPw_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 139 AfsPw_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 139 ActvFrontSteLck_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 139 ActvFrontSteLck_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 139 SelDrvMdeAdptSte_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1121 SelDrvMdeSwtch_No_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1121 SelDrvMdeSwtch_No_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1121 SelDrvMdeSwtch_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1121 SelDrvMdeSwtch_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1121 SelDrvMdeCnt_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1121 SelDrvMdeCnt_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1120 DrvSlipCtlMde_B_Rq3 1; +BA_ "UsedOnPgmDBC" SG_ 1120 DrvSlipCtlMde_B_Rq3 1; +BA_ "U_P702_MY2021_Rx" SG_ 1120 DrvSlipCtlMde_B_Rq3 1; +BA_ "U_P702_MY2021_Rx" SG_ 1120 HybMdeSwtch_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1120 RearDiffLck_D_RqDrv 2; +BA_ "GenSigStartValue" SG_ 1120 RearDiffLck_D_RqDrv 2; +BA_ "U_P702_MY2021_Rx" SG_ 1120 RearDiffLck_D_RqDrv 1; +BA_ "GenSigStartValueInteger" SG_ 1120 AwdMde_D_RqDrv 5; +BA_ "GenSigStartValue" SG_ 1120 AwdMde_D_RqDrv 5; +BA_ "U_P702_MY2021_Rx" SG_ 1120 AwdMde_D_RqDrv 1; +BA_ "UsedOnPgmDBC" SG_ 1120 HdcSwtchPos_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1120 HdcSwtchPos_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1050 Outside_Air_Temp_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1050 Outside_Air_Temp_Stat 254; +BA_ "GenSigStartValue" SG_ 1050 Outside_Air_Temp_Stat 254; +BA_ "U_P702_MY2021_Rx" SG_ 1050 Outside_Air_Temp_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1050 Outside_Air_Temp_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 1137 RngPerChrgAvg_L_Dsply 4094; +BA_ "GenSigStartValue" SG_ 1137 RngPerChrgAvg_L_Dsply 4093; +BA_ "U_P702_MY2021_Tx" SG_ 1137 RngPerChrgAvg_L_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev3Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev3Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev3X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev3X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev2Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev2Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev2X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev2X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev1Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev1Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4Prev1X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1255 BalrRight4Prev1X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4CurntY_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1255 BalrRight4CurntY_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1255 BalrRight4CurntX_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1255 BalrRight4CurntX_L_Actl 0; +BA_ "GenSigSendType" SG_ 1254 BalrRight3Threat_D_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev3Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev3Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev3X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev3X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev2Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev2Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev2X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev2X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev1Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev1Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3Prev1X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1254 BalrRight3Prev1X_L_Actl 0; +BA_ "GenSigSendType" SG_ 1254 BalrRight3Fast_B_Stat 3; +BA_ "GenSigSendType" SG_ 1254 BalrRight3Dsply_B_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3CurntY_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1254 BalrRight3CurntY_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1254 BalrRight3CurntX_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1254 BalrRight3CurntX_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev3Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev3Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev3X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev3X_L_Actl 0; +BA_ "GenSigSendType" SG_ 1253 BalrRight2Threat_D_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev2Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev2Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev2X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev2X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev1Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev1Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2Prev1X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1253 BalrRight2Prev1X_L_Actl 0; +BA_ "GenSigSendType" SG_ 1253 BalrRight2Fast_B_Stat 3; +BA_ "GenSigSendType" SG_ 1253 BalrRight2Dsply_B_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2CurntY_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1253 BalrRight2CurntY_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1253 BalrRight2CurntX_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1253 BalrRight2CurntX_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev3Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev3Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev3X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev3X_L_Actl 0; +BA_ "GenSigSendType" SG_ 1252 BalrRight1Threat_D_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev2Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev2Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev2X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev2X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev1Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev1Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1Prev1X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1252 BalrRight1Prev1X_L_Actl 0; +BA_ "GenSigSendType" SG_ 1252 BalrRight1Fast_B_Stat 3; +BA_ "GenSigSendType" SG_ 1252 BalrRight1Dsply_B_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1CurntY_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1252 BalrRight1CurntY_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1252 BalrRight1CurntX_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1252 BalrRight1CurntX_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev3Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev3Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev3X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev3X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev2Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev2Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev2X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev2X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev1Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev1Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4Prev1X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1251 BalrLeft4Prev1X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4CurntY_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1251 BalrLeft4CurntY_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1251 BalrLeft4CurntX_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1251 BalrLeft4CurntX_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev3Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev3Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev3X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev3X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev2Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev2Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev2X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev2X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev1Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev1Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3Prev1X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1250 BalrLeft3Prev1X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3CurntY_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1250 BalrLeft3CurntY_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1250 BalrLeft3CurntX_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1250 BalrLeft3CurntX_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev3Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev3Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev3X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev3X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev2Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev2Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev2X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev2X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev1Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev1Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2Prev1X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1249 BalrLeft2Prev1X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2CurntY_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1249 BalrLeft2CurntY_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1249 BalrLeft2CurntX_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1249 BalrLeft2CurntX_L_Actl 0; +BA_ "GenSigSendType" SG_ 1248 BalrLeft1Threat_D_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev3Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev3Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev3X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev3X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev2Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev2Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev2X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev2X_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev1Y_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev1Y_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1Prev1X_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1248 BalrLeft1Prev1X_L_Actl 0; +BA_ "GenSigSendType" SG_ 1248 BalrLeft1Fast_B_Stat 3; +BA_ "GenSigSendType" SG_ 1248 BalrLeft1Dsply_B_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1CurntY_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1248 BalrLeft1CurntY_L_Actl 0; +BA_ "GenSigStartValueInteger" SG_ 1248 BalrLeft1CurntX_L_Actl 64; +BA_ "GenSigStartValue" SG_ 1248 BalrLeft1CurntX_L_Actl 0; +BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrTrgtAcquire_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrRvrse_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrAid_D2_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrAidTrgtId_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1113 TrlrAid_An3_Actl 720; +BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrAid_An3_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1113 TrlrAid_AnRate2_Actl 400; +BA_ "U_P702_MY2021_Rx" SG_ 1113 TrlrAid_AnRate2_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1113 HitchToVehAxle_L_Calc 255; +BA_ "GenSigStartValue" SG_ 1113 HitchToVehAxle_L_Calc 255; +BA_ "U_P702_MY2021_Rx" SG_ 1113 HitchToVehAxle_L_Calc 1; +BA_ "GenSigSendType" SG_ 1105 TrlrAidSwtchLamp_B_Rq 3; +BA_ "GenSigSendType" SG_ 1105 TrlrHitchMsgTxt_D_Rq 3; +BA_ "GenSigSendType" SG_ 1105 TrlrHitchIcon_D_Rq 3; +BA_ "GenSigSendType" SG_ 1105 TrlrHitchChime_D_Rq 3; +BA_ "GenSigSendType" SG_ 1105 TrlrAidEnbl_D_RqAdas 3; +BA_ "U_P702_MY2021_Rx" SG_ 1105 TrlrAidEnbl_D_RqAdas 1; +BA_ "GenSigSendType" SG_ 1105 TrlrRvrseMsgTxt_D2_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 1105 TrlrRvrseMsgTxt_D2_Rq 1; +BA_ "GenSigSendType" SG_ 1105 TrlrRvrseEnbl_D2_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 1105 TrlrRvrseEnbl_D2_Stat 1; +BA_ "GenSigSendType" SG_ 1105 RbaMsg_D_Rq 3; +BA_ "WakeupSignal" SG_ 1105 BrkDecel_B_RqRba 1; +BA_ "CrossOver_InfoCAN" SG_ 1105 BrkDecel_B_RqRba 1; +BA_ "UsedOnPgmDBC" SG_ 1105 BrkDecel_B_RqRba 1; +BA_ "GenSigSendType" SG_ 1105 BrkDecel_B_RqRba 3; +BA_ "U_P702_MY2021_Rx" SG_ 1105 BrkDecel_B_RqRba 1; +BA_ "WakeupSignal" SG_ 1105 BrkEnbl_B_RqRba 1; +BA_ "CrossOver_InfoCAN" SG_ 1105 BrkEnbl_B_RqRba 1; +BA_ "UsedOnPgmDBC" SG_ 1105 BrkEnbl_B_RqRba 1; +BA_ "GenSigSendType" SG_ 1105 BrkEnbl_B_RqRba 3; +BA_ "U_P702_MY2021_Rx" SG_ 1105 BrkEnbl_B_RqRba 1; +BA_ "GenSigStartValueInteger" SG_ 1105 Rba_D_Stat 1; +BA_ "GenSigStartValue" SG_ 1105 Rba_D_Stat 1; +BA_ "GenSigSendType" SG_ 1105 Rba_D_Stat 3; +BA_ "GenSigSendType" SG_ 1105 RbaAlrt_D_Dsply 3; +BA_ "GenSigSendType" SG_ 1105 RbaMnu_D_Rq 3; +BA_ "GenSigSendType" SG_ 1105 CamraFrntStat_D_Stat 3; +BA_ "GenSigSendType" SG_ 1105 TrlrHitchLamp_D_Rq2 3; +BA_ "GenSigSendType" SG_ 938 SidePrkSnsR2_D_Stat 3; +BA_ "GenSigSendType" SG_ 938 SidePrkSnsR1_D_Stat 3; +BA_ "GenSigSendType" SG_ 938 SidePrkSnsL2_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 938 ApaMde_D_Stat 1; +BA_ "GenSigSendType" SG_ 938 ApaMde_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 938 ApaActvSd_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 938 ApaActvSd_D_Actl 1; +BA_ "GenSigStartValue" SG_ 938 ApaActvSd_D_Actl 1; +BA_ "GenSigSendType" SG_ 938 ApaActvSd_D_Actl 3; +BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSwtch_B_Stat 1; +BA_ "GenSigSendType" SG_ 938 PrkAidSwtch_B_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 938 ApaMde_D_Avail 1; +BA_ "GenSigSendType" SG_ 938 ApaMde_D_Avail 3; +BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSnsFrCrnr_D_Stat 1; +BA_ "GenSigSendType" SG_ 938 PrkAidSnsFrCrnr_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSnsFrCntr_D_Stat 1; +BA_ "GenSigSendType" SG_ 938 PrkAidSnsFrCntr_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSnsFlCrnr_D_Stat 1; +BA_ "GenSigSendType" SG_ 938 PrkAidSnsFlCrnr_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidSnsFlCntr_D_Stat 1; +BA_ "GenSigSendType" SG_ 938 PrkAidSnsFlCntr_D_Stat 3; +BA_ "GenSigSendType" SG_ 938 PrkBrkEl_B_RqFap 3; +BA_ "U_CX727_MY2021_Rx" SG_ 938 PrkBrkEl_B_RqFap 1; +BA_ "U_P702_MY2021_Rx" SG_ 938 PrkBrkEl_B_RqFap 1; +BA_ "CrossOver_InfoCAN" SG_ 938 RpaChime_D_Rq 1; +BA_ "GenSigSendType" SG_ 938 RpaChime_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 938 FpaChime_D_Rq 1; +BA_ "GenSigSendType" SG_ 938 FpaChime_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 938 PrkAidMsgTxt_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 938 PrkAidMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 938 SidePrkSnsL1_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 938 PrkAidAudioMute_B_Rq 1; +BA_ "GenSigSendType" SG_ 938 PrkAidAudioMute_B_Rq 3; +BA_ "GenSigSendType" SG_ 939 ApaBrk_D_Rq 3; +BA_ "GenSigSendType" SG_ 939 SidePrkSnsR4_D_Stat 3; +BA_ "GenSigSendType" SG_ 939 SidePrkSnsR3_D_Stat 3; +BA_ "GenSigSendType" SG_ 939 SidePrkSnsL4_D_Stat 3; +BA_ "GenSigSendType" SG_ 939 SidePrkSnsL3_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidChime_D_Stat 1; +BA_ "GenSigSendType" SG_ 939 PrkAidChime_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidSnsRlCntr_D_Stat 1; +BA_ "GenSigSendType" SG_ 939 PrkAidSnsRlCntr_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidSnsRrCrnr_D_Stat 1; +BA_ "GenSigSendType" SG_ 939 PrkAidSnsRrCrnr_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidSnsRrCntr_D_Stat 1; +BA_ "GenSigSendType" SG_ 939 PrkAidSnsRrCntr_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidSnsRlCrnr_D_Stat 1; +BA_ "GenSigSendType" SG_ 939 PrkAidSnsRlCrnr_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidRear_D_Stat 1; +BA_ "GenSigSendType" SG_ 939 PrkAidRear_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 939 PrkAidFront_D_Stat 1; +BA_ "GenSigSendType" SG_ 939 PrkAidFront_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 939 PrkAid_D_Falt 1; +BA_ "GenSigSendType" SG_ 939 PrkAid_D_Falt 3; +BA_ "GenSigSendType" SG_ 939 ApaLongCtrlEnbl_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 939 ApaLongCtrlEnbl_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 939 ApaLongCtrlEnbl_D_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 939 ApaLongCtrlEnbl_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 939 ApaBrk_A_Rq 255; +BA_ "U_P702_MY2021_Rx" SG_ 939 ApaBrk_A_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 939 ApaBrk_A_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 939 ApaBrk_A_Rq 1; +BA_ "GenSigSendType" SG_ 939 PrkAidLamp_D_Rq 3; +BA_ "GenSigStartValueInteger" SG_ 937 Veh_V_RqFap 0; +BA_ "U_P702_MY2021_Rx" SG_ 937 Veh_V_RqFap 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 Veh_V_RqFap 1; +BA_ "MetaData" SG_ 937 TrnRngDRqFap_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 937 TrnRngDRqFap_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 TrnRngDRqFap_No_Cs 1; +BA_ "MetaData" SG_ 937 TrnRngDRqFap_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 937 TrnRngDRqFap_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 TrnRngDRqFap_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 937 TrnRng_D_RqFap 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 TrnRng_D_RqFap 1; +BA_ "GenSigStartValueInteger" SG_ 937 FapLcDistToObj_L_Actl 254; +BA_ "GenSigStartValue" SG_ 937 FapLcDistToObj_L_Actl 254; +BA_ "U_P702_MY2021_Rx" SG_ 937 FapLcDistToObj_L_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 937 FapLcDistToObj_L_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 936 ApaSys_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 936 ApaSys_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 936 EPASExtAngleStatReq 1; +BA_ "U_P702_MY2021_Rx" SG_ 936 EPASExtAngleStatReq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 936 ExtSteeringAngleReq2 1; +BA_ "U_P702_MY2021_Rx" SG_ 936 ExtSteeringAngleReq2 1; +BA_ "GenSigStartValueInteger" SG_ 877 RngImpctDrv_L_Dsply 255; +BA_ "U_P702_MY2021_Tx" SG_ 877 RngImpctDrv_L_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 877 RngImpctClim_L_Dsply 255; +BA_ "U_P702_MY2021_Tx" SG_ 877 RngImpctClim_L_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 877 VehElEffAvg_No_Dsply 126; +BA_ "GenSigStartValue" SG_ 877 VehElEffAvg_No_Dsply 126; +BA_ "U_P702_MY2021_Tx" SG_ 877 VehElEffAvg_No_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwFuelDrv_D_Dsply 1; +BA_ "GenSigSendType" SG_ 877 PwFlwFuelDrv_D_Dsply 3; +BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwFuelDrv_D_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwFuelClimt_B_Dsply 1; +BA_ "GenSigSendType" SG_ 877 PwFlwFuelClimt_B_Dsply 3; +BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwFuelClimt_B_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwFuelBatt_B_Dsply 1; +BA_ "GenSigSendType" SG_ 877 PwFlwFuelBatt_B_Dsply 3; +BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwFuelBatt_B_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwBattClimt_B_Dsply 1; +BA_ "GenSigSendType" SG_ 877 PwFlwBattClimt_B_Dsply 3; +BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwBattClimt_B_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 877 PwFlwBatt_D_Dsply 1; +BA_ "GenSigSendType" SG_ 877 PwFlwBatt_D_Dsply 3; +BA_ "U_P702_MY2021_Tx" SG_ 877 PwFlwBatt_D_Dsply 1; +BA_ "U_P702_MY2021_Rx" SG_ 589 BattTrac2_Pw_LimChrg 1; +BA_ "U_P702_MY2021_Rx" SG_ 589 BattTrac2_Pw_LimDchrg 1; +BA_ "U_P702_MY2021_Rx" SG_ 589 BattTrac2_Pw_DchrgInst 1; +BA_ "U_P702_MY2021_Rx" SG_ 589 BattTrac2_Pw_ChrgInst 1; +BA_ "GenSigStartValueInteger" SG_ 588 BattTracSoc2_Pc_Actl 16382; +BA_ "GenSigStartValue" SG_ 588 BattTracSoc2_Pc_Actl 16382; +BA_ "U_P702_MY2021_Rx" SG_ 588 BattTracSoc2_Pc_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 588 BattTrac_Te_Actl 150; +BA_ "GenSigStartValue" SG_ 588 BattTrac_Te_Actl 150; +BA_ "U_P702_MY2021_Rx" SG_ 588 BattTrac_Te_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 588 BattTracDiagClr_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 588 BattTracDiagClr_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 587 BattTracClnt_Te_Actl 164; +BA_ "GenSigStartValue" SG_ 587 BattTracClnt_Te_Actl 164; +BA_ "CrossOver_InfoCAN" SG_ 587 BattTracWarnLamp_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 587 BattTracSrvcRqd_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 587 BattTracSoc_Pc_MxPrtct 700; +BA_ "GenSigStartValue" SG_ 587 BattTracSoc_Pc_MxPrtct 700; +BA_ "U_P702_MY2021_Rx" SG_ 587 BattTracSoc_Pc_MxPrtct 1; +BA_ "GenSigStartValueInteger" SG_ 587 BattTracSoc_Pc_MnPrtct 300; +BA_ "GenSigStartValue" SG_ 587 BattTracSoc_Pc_MnPrtct 30; +BA_ "U_P702_MY2021_Rx" SG_ 587 BattTracSoc_Pc_MnPrtct 1; +BA_ "GenSigStartValueInteger" SG_ 587 BattTracSoc_Pc_LimLo 400; +BA_ "GenSigStartValue" SG_ 587 BattTracSoc_Pc_LimLo 400; +BA_ "U_P702_MY2021_Rx" SG_ 587 BattTracSoc_Pc_LimLo 1; +BA_ "GenSigStartValueInteger" SG_ 587 BattTracSoc_Pc_LimHi 600; +BA_ "GenSigStartValue" SG_ 587 BattTracSoc_Pc_LimHi 600; +BA_ "U_P702_MY2021_Rx" SG_ 587 BattTracSoc_Pc_LimHi 1; +BA_ "CrossOver_InfoCAN" SG_ 389 HtrnOvrTeLamp_B_Dsply 1; +BA_ "U_P702_MY2021_Rx" SG_ 389 HtrnAin_UHi_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 389 HtrnAin_UHi_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 389 HtrnSrvcRqd_B_Dsply 1; +BA_ "U_P702_MY2021_Rx" SG_ 389 HtrnHvilOpen_B_Actl 1; +BA_ "ECGUsedRxSignal" SG_ 389 HtrnHvilOpen_B_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 389 BattTrac_I_EstVsc 15000; +BA_ "U_P702_MY2021_Rx" SG_ 1009 TrlrAidCancl_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1009 CenterStackRing_D_Actl 2; +BA_ "GenSigStartValue" SG_ 1009 CenterStackRing_D_Actl 2; +BA_ "CrossOver_InfoCAN" SG_ 1009 ValetMode_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 360 GsmSrvcRqd_B_Rq 1; +BA_ "ContentDependant" SG_ 360 GsmSrvcRqd_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 360 TrnGearPwmFalt_B_Actl 1; +BA_ "ContentDependant" SG_ 360 TrnGearPwmFalt_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 360 TrnGearPwmFalt_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 360 TrnGearPwmFalt_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 360 GearButtnStuck_B_Actl 1; +BA_ "ContentDependant" SG_ 360 GearButtnStuck_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 360 GearButtnStuck_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 360 GearButtnStuck_B_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 122 BattTrac_U_LimLo 88; +BA_ "GenSigStartValue" SG_ 122 BattTrac_U_LimLo 88; +BA_ "U_P702_MY2021_Rx" SG_ 122 BattTrac_U_LimLo 1; +BA_ "GenSigStartValueInteger" SG_ 122 BattTrac_U_LimHi 163; +BA_ "GenSigStartValue" SG_ 122 BattTrac_U_LimHi 163; +BA_ "U_P702_MY2021_Rx" SG_ 122 BattTrac_U_LimHi 1; +BA_ "CrossOver_InfoCAN" SG_ 122 VehStrtInhbt_B_RqBatt 1; +BA_ "U_P702_MY2021_Rx" SG_ 122 VehStrtInhbt_B_RqBatt 1; +BA_ "U_P702_MY2021_Rx" SG_ 122 BattTracOffFst_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 122 BattTracOff_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 122 BattTracOff_B_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 122 BattTrac_U_Actl 1022; +BA_ "GenSigStartValue" SG_ 122 BattTrac_U_Actl 1022; +BA_ "U_P702_MY2021_Rx" SG_ 122 BattTrac_U_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 122 BattTrac_I_Actl 15000; +BA_ "U_P702_MY2021_Rx" SG_ 122 BattTrac_I_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 90 TrnGsmNtmState_D_Actl 1; +BA_ "ContentDependant" SG_ 90 TrnGsmNtmState_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGsmNtmState_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGsmNtmState_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 90 TrnGsmNtmState_D_Actl 1; +BA_ "ContentDependant" SG_ 90 DrQltyDrv_D_StatGsm 1; +BA_ "GenSigStartValue" SG_ 90 DrQltyDrv_D_StatGsm 6; +BA_ "U_P702_MY2021_Rx" SG_ 90 DrQltyDrv_D_StatGsm 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 DrQltyDrv_D_StatGsm 1; +BA_ "U_CX727_MY2021_Rx" SG_ 90 DrQltyDrv_D_StatGsm 1; +BA_ "ContentDependant" SG_ 90 TrnBtsiOvrrd_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnBtsiOvrrd_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnBtsiOvrrd_B_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 90 TrnRng_D_RqGsm 14; +BA_ "GenSigStartValue" SG_ 90 TrnRng_D_RqGsm 14; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnRng_D_RqGsm 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnRng_D_RqGsm 1; +BA_ "U_CX727_MY2021_Rx" SG_ 90 PrkBrkActv_D_RqGsmGear 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 PrkBrkActv_D_RqGsmGear 1; +BA_ "ContentDependant" SG_ 90 TrnValidGearRq_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnValidGearRq_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnValidGearRq_D_Stat 1; +BA_ "ContentDependant" SG_ 90 TrnGearRqCnt_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearRqCnt_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearRqCnt_B_Actl 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_U_Actl 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_U_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_U_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_U_Actl 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlR2 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlR2 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlR2 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlR2 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlR1 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlR1 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlR1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlR1 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlR0 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlR0 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlR0 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlR0 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlP2 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlP2 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlP2 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlP2 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlP1 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlP1 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlP1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlP1 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlP0 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlP0 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlP0 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlP0 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlN2 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlN2 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlN2 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlN2 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlN1 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlN1 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlN1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlN1 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlN0 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlN0 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlN0 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlN0 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlM2 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlM2 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlM2 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlM2 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlM1 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlM1 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlM1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlM1 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlM0 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlM0 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlM0 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlM0 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlD2 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlD2 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlD2 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlD2 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlD1 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlD1 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlD1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlD1 1; +BA_ "WakeupSignal" SG_ 90 TrnGearButtn_B_ActlD0 1; +BA_ "ContentDependant" SG_ 90 TrnGearButtn_B_ActlD0 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGearButtn_B_ActlD0 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGearButtn_B_ActlD0 1; +BA_ "ContentDependant" SG_ 90 TrnGear_No_Cs 1; +BA_ "MetaData" SG_ 90 TrnGear_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGear_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGear_No_Cs 1; +BA_ "ContentDependant" SG_ 90 TrnGear_No_Cnt 1; +BA_ "MetaData" SG_ 90 TrnGear_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGear_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGear_No_Cnt 1; +BA_ "WakeupSignal" SG_ 90 TrnGear_D_RqDrv 1; +BA_ "ContentDependant" SG_ 90 TrnGear_D_RqDrv 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 TrnGear_D_RqDrv 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 TrnGear_D_RqDrv 1; +BA_ "ContentDependant" SG_ 90 BrkSwtchPos_B_ActlGsm 1; +BA_ "U_P702_MY2021_Rx" SG_ 90 BrkSwtchPos_B_ActlGsm 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 90 BrkSwtchPos_B_ActlGsm 1; +BA_ "CrossOver_InfoCAN" SG_ 1091 ParkLampTrlrOut_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1091 TrlrLampCtl_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1091 TrlrBattChrg_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1091 StopLampTrlrOut_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1091 TurnLampTrlrRr_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1091 TurnLampTrlrRl_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1091 TrlrLampCnnct_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1091 TrlrLampCnnct_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1091 TrlrLampCnnct_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1091 TrlrLampCnnct_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1091 TrlrLampCnnct_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 138 SteWhlRelCalib_T_Actl 1; +BA_ "ContentDependant" SG_ 138 SteWhlRelCalib_An_Sns 1; +BA_ "U_P702_MY2021_Rx" SG_ 138 SteWhlRelCalib_An_Sns 1; +BA_ "U_CX727_MY2021_Rx" SG_ 138 SteWhlRelCalib_An_Sns 1; +BA_ "WakeupSignal" SG_ 131 HeadLghtHiCtrl_D_RqAhb 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 HeadLghtHiCtrl_D_RqAhb 1; +BA_ "GenSigStartValueInteger" SG_ 131 WiprFrontSwtch_D_Stat 9; +BA_ "GenSigStartValue" SG_ 131 WiprFrontSwtch_D_Stat 9; +BA_ "WakeupSignal" SG_ 131 HeadLghtHiOn_B_StatAhb 1; +BA_ "CrossOver_InfoCAN" SG_ 131 HeadLghtHiOn_B_StatAhb 1; +BA_ "WakeupSignal" SG_ 131 HeadLghtHiFlash_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 131 WiprFront_D_Stat 15; +BA_ "GenSigStartValue" SG_ 131 WiprFront_D_Stat 15; +BA_ "U_P702_MY2021_Rx" SG_ 131 WiprFront_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 WiprFront_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 131 WiprFront_D_Stat 1; +BA_ "WakeupSignal" SG_ 131 TurnLghtSwtch_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 131 TurnLghtSwtch_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 131 TurnLghtSwtch_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 TurnLghtSwtch_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 131 LghtAmb_D_Sns 7; +BA_ "GenSigStartValue" SG_ 131 LghtAmb_D_Sns 7; +BA_ "U_P702_MY2021_Rx" SG_ 131 LghtAmb_D_Sns 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 AslButtnOnOffPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 AslButtnOnOffPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 AslButtnOnOffCnclPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 AslButtnOnOffCnclPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcButtnOnPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcButtnOnPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcButtnOnOffPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcButtnOnOffPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcButtnOnOffCnclPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcButtnOnOffCnclPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcButtnOffPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcButtnOffPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAsllButtnResPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAsllButtnResPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnSetIncPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnSetIncPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnSetDecPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnSetDecPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnResIncPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnResIncPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnOnPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnOnPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnIndxIncPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnIndxIncPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnIndxDecPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnIndxDecPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnDeny_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnDeny_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnCnclResPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnCnclResPress 1; +BA_ "U_P702_MY2021_Rx" SG_ 131 CcAslButtnCnclPress 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 131 CcAslButtnCnclPress 1; +BA_ "WakeupSignal" SG_ 787 DrLckCnt_No_ActlTgate 1; +BA_ "WakeupSignal" SG_ 787 DrTgateChime2_D_Rq 1; +BA_ "WakeupSignal" SG_ 787 DrTGate_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 787 DrTGate_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 787 DrTGate_D_Rq 1; +BA_ "WakeupSignal" SG_ 787 PwLftgtIntSw_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 787 Power_Liftgate_Mode_Stt 1; +BA_ "U_P702_MY2021_Rx" SG_ 953 BattRgenLoDChrg_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 953 BattRgenLoChrg_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 953 WakeAlarm3_D_Stat 3; +BA_ "GenSigStartValue" SG_ 953 WakeAlarm3_D_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 953 WakeAlarm2_D_Stat 3; +BA_ "GenSigStartValue" SG_ 953 WakeAlarm2_D_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 953 WakeAlarm1_D_Stat 3; +BA_ "GenSigStartValue" SG_ 953 WakeAlarm1_D_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 953 WakeAlarm1_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 953 WakeAlarm1_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 953 WakeAlarm0_D_Stat 3; +BA_ "GenSigStartValue" SG_ 953 WakeAlarm0_D_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 1093 TrlrBrkActCnnct_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1093 TrlrBrkActCnnct_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1093 TrlrBrkActCnnct_B_Actl 1; +BA_ "ContentDependant" SG_ 1093 StopLamp_B_RqTrlrBrk 1; +BA_ "U_P702_MY2021_Rx" SG_ 792 FuelRange_L_Dsply 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 792 FuelRange_L_Dsply 1; +BA_ "ContentDependant" SG_ 792 ElTrip_L_Dsply 1; +BA_ "ContentDependant" SG_ 792 ElLongTerm_L_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 968 SlMde_D_Rq 2; +BA_ "GenSigStartValue" SG_ 968 SlMde_D_Rq 2; +BA_ "U_P702_MY2021_Rx" SG_ 968 SlMde_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 968 SlMde_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 968 IsaOffst_D_Rq 14; +BA_ "GenSigStartValue" SG_ 968 IsaOffst_D_Rq 14; +BA_ "U_P702_MY2021_Rx" SG_ 968 IsaOffst_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 968 IsaOffst_D_Rq 1; +BA_ "WakeupSignal" SG_ 819 Memory_3_SwPsngr_Stat 1; +BA_ "WakeupSignal" SG_ 819 Memory_2_SwPsngr_Stat 1; +BA_ "WakeupSignal" SG_ 819 Memory_1_SwPsngr_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 819 WndwPsngrSide_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 819 WndwPsngrSide_D_Stat 1; +BA_ "WakeupSignal" SG_ 819 Pasngr_Lock_Sw_Stat 1; +BA_ "WakeupSignal" SG_ 819 Pasngr_Lock_Sw_Cnt 1; +BA_ "MetaData" SG_ 819 Pasngr_Lock_Sw_Cnt 1; +BA_ "WakeupSignal" SG_ 819 ChildLckFdbckRp_B_Stat 1; +BA_ "WakeupSignal" SG_ 818 ChildLckPw_N_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 818 WndwDrvSide_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 818 WndwDrvSide_D_Stat 1; +BA_ "WakeupSignal" SG_ 818 KeyCylSwDrvDr_D_Stat 1; +BA_ "GenSigInactiveValue" SG_ 818 Driver_Lock_Sw_Stat 0; +BA_ "WakeupSignal" SG_ 818 Driver_Lock_Sw_Stat 1; +BA_ "WakeupSignal" SG_ 818 Driver_Lock_Sw_Cnt 1; +BA_ "MetaData" SG_ 818 Driver_Lock_Sw_Cnt 1; +BA_ "WakeupSignal" SG_ 818 ChildLckPw_D_Rq 1; +BA_ "WakeupSignal" SG_ 818 ChildLckFdbckRd_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 818 RvrseMirrorChime_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 806 StopStrtDrvMde_B_RqBtn 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 StopStrtDrvMde_B_RqBtn 1; +BA_ "GenSigStartValueInteger" SG_ 806 HvacHtrCore_Te_Rq 0; +BA_ "U_P702_MY2021_Rx" SG_ 806 HvacHtrCore_Te_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacHtrCore_Te_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 806 ClimtHeat_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 ClimtHeat_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 806 ClimtCool_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 ClimtCool_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 806 HvacEvap_Te_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 806 HvacEvap_Te_Rq 400; +BA_ "U_P702_MY2021_Rx" SG_ 806 HvacEvap_Te_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacEvap_Te_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 806 HvacEvap_Te_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 806 HvacEvap_Te_Actl 400; +BA_ "U_P702_MY2021_Rx" SG_ 806 HvacEvap_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacEvap_Te_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 806 HvacAirCond_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 806 HvacAirCond_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacAirCond_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 806 HvacEvap_Te_Offst 1; +BA_ "GenSigStartValueInteger" SG_ 806 HvacEvap_Te_Offst 400; +BA_ "U_P702_MY2021_Rx" SG_ 806 HvacEvap_Te_Offst 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 HvacEvap_Te_Offst 1; +BA_ "U_P702_MY2021_Rx" SG_ 806 ClimtPw_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 806 ClimtPw_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 765 EngExhMdeQuiet_D2_Rq 0; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 765 EdmSailMde_B_RqDrv 1; +BA_ "WakeupSignal" SG_ 765 DrvInputRequired_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 765 AwdRnge_D_ActlIpc 1; +BA_ "UsedOnPgmDBC" SG_ 765 AwdRnge_D_ActlIpc 1; +BA_ "GenSigStartValueInteger" SG_ 765 AwdRnge_D_ActlIpc 7; +BA_ "GenSigStartValue" SG_ 765 AwdRnge_D_ActlIpc 7; +BA_ "U_P702_MY2021_Rx" SG_ 765 AwdRnge_D_ActlIpc 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 765 AwdRnge_D_ActlIpc 1; +BA_ "GenSigStartValueInteger" SG_ 765 BalrSwtch_D_Stat 1; +BA_ "GenSigStartValue" SG_ 765 BalrSwtch_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 765 BalrMde_D_Rq 0; +BA_ "GenSigStartValueInteger" SG_ 765 WaitToStartLamp_D_Falt 1; +BA_ "GenSigStartValue" SG_ 765 WaitToStartLamp_D_Falt 1; +BA_ "U_P702_MY2021_Rx" SG_ 765 WaitToStartLamp_D_Falt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 765 WaitToStartLamp_D_Falt 1; +BA_ "GenSigStartValueInteger" SG_ 765 EsaOn_B_Rq 1; +BA_ "GenSigStartValue" SG_ 765 EsaOn_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 765 EsaOn_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 765 Btt_L_Actl 126; +BA_ "GenSigStartValue" SG_ 765 Btt_L_Actl 126; +BA_ "U_P702_MY2021_Rx" SG_ 765 SelDrvMdeTxtReset_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 765 SelDrvMdeDsply_B_Avail 1; +BA_ "CrossOver_InfoCAN" SG_ 765 Mc_VehUnitTempUsrSel_St 1; +BA_ "CrossOver_InfoCAN" SG_ 559 EhData2_No_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 559 EhData2_No_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 559 EhData2_No_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 558 EhData1_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 558 EhData1_No_Actl 0; +BA_ "U_P702_MY2021_Rx" SG_ 558 EhData1_No_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 558 EhData1_No_Actl 1; +BA_ "GenSigSendType" SG_ 934 CtaAlrtLeft2_D_Stat 3; +BA_ "GenSigSendType" SG_ 934 CtaBrkLeftMsgTxt_B_Rq 3; +BA_ "GenSigSendType" SG_ 934 CtaLeftBrkDecel_B_Rq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 934 CtaLeftBrkDecel_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 934 CtaLeftBrkDecel_B_Rq 1; +BA_ "GenSigSendType" SG_ 934 CtaLeftBrkEnbl_B_Rq 3; +BA_ "U_CX727_MY2021_Rx" SG_ 934 CtaLeftBrkEnbl_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 934 CtaLeftBrkEnbl_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 934 Side_Detect_L_Illum 1; +BA_ "GenSigStartValueInteger" SG_ 934 Side_Detect_L_Illum 100; +BA_ "GenSigStartValue" SG_ 934 Side_Detect_L_Illum 100; +BA_ "GenSigSendType" SG_ 934 BttLeft_D_Stat 3; +BA_ "GenSigSendType" SG_ 934 BttLeft_D_RqDrv 3; +BA_ "CrossOver_InfoCAN" SG_ 934 CtaSnsLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 934 CtaSnsLeft_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 934 SodDetctLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 934 SodDetctLeft_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 934 CtaLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 934 CtaLeft_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 934 CtaAlrtLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 934 CtaAlrtLeft_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 934 SodLeft_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 934 SodLeft_D_Stat 2; +BA_ "GenSigStartValue" SG_ 934 SodLeft_D_Stat 2; +BA_ "GenSigSendType" SG_ 934 SodLeft_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 934 SodSnsLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 934 SodSnsLeft_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 934 SodAlrtLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 934 SodAlrtLeft_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 934 SodWarnLeft_Prd_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 934 SodWarnLeft_Prd_Rq 14; +BA_ "GenSigStartValue" SG_ 934 SodWarnLeft_Prd_Rq 14; +BA_ "CrossOver_InfoCAN" SG_ 1072 DrvSlipCtlMde_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1072 DrvSlipCtlMde_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 DrvSlipCtlMde_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 EngIdlShutDown_B_RqDrv 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 EngIdlShutDown_B_RqDrv 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 HsaMde_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1072 HsaMde_D_Rq 1; +BA_ "GenSigStartValue" SG_ 1072 HsaMde_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 NtrlTowMdeEnbl_B_RqDrv 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 NtrlTowMdeEnbl_B_RqDrv 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 NtrlTowMdeEnbl_B_RqDrv 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 BulbChkActv_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 ParkDetect_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1072 ParkDetect_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 ReducedGuard_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 TRLR_SWAY_CONFIG_CMD 1; +BA_ "WakeupSignal" SG_ 1072 Power_Liftgate_Mode_Cmd 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 Power_Liftgate_Mode_Cmd 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 AccEnbl_B_RqDrv 1; +BA_ "GenSigStartValueInteger" SG_ 1072 AccEnbl_B_RqDrv 1; +BA_ "GenSigStartValue" SG_ 1072 AccEnbl_B_RqDrv 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 OdometerMasterValue 1; +BA_ "UsedOnPgmDBC" SG_ 1072 OdometerMasterValue 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 OdometerMasterValue 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 OdometerMasterValue 1; +BA_ "U_CX727_MY2021_Rx" SG_ 1072 OdometerMasterValue 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 EngOilLife_B_RqReset 1; +BA_ "UsedOnPgmDBC" SG_ 1072 EngOilLife_B_RqReset 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 EngOilLife_B_RqReset 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 EngOilLife_B_RqReset 1; +BA_ "WakeupSignal" SG_ 1072 ePRNDL_MODE 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 ePRNDL_MODE 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 ePRNDL_MODE 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 ePRNDL_MODE 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 DrvSlipCtlMde_B_Rq2 1; +BA_ "UsedOnPgmDBC" SG_ 1072 DrvSlipCtlMde_B_Rq2 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 DrvSlipCtlMde_B_Rq2 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 MetricActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1072 MetricActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 MetricActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 MetricActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 KeyTypeChngMykey_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 1072 ManRgen_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1072 ManRgen_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1072 ManRgen_D_Rq 1; +BA_ "WakeupSignal" SG_ 909 IgnPsswrdDsply_B_Rq 1; +BA_ "WakeupSignal" SG_ 909 ElPwPoint_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 909 SecurityMsgTxt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 909 HeadLghtHiPrmsn_D_Stat 3; +BA_ "GenSigStartValue" SG_ 909 HeadLghtHiPrmsn_D_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 909 HeadLghtHiPrmsn_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 909 SteWhlLckMsgTxt_D_Rq 1; +BA_ "WakeupSignal" SG_ 909 immoMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 909 immoMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 909 PEBackupSlot_Stats 1; +BA_ "CrossOver_InfoCAN" SG_ 909 KeyMykeyTot_No_Cnt 1; +BA_ "MetaData" SG_ 909 KeyMykeyTot_No_Cnt 1; +BA_ "CrossOver_InfoCAN" SG_ 909 Keycode_Status 1; +BA_ "CrossOver_InfoCAN" SG_ 909 KeyAdmnTot_No_Cnt 1; +BA_ "MetaData" SG_ 909 KeyAdmnTot_No_Cnt 1; +BA_ "WakeupSignal" SG_ 963 ImpactEvntFdbck_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 ImpactEvntFdbck_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 963 ImpactEvntFdbck_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 HeadLampLoOut_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 963 HeadLampLoOut_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 CrnrLghtRight_Pc_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 963 CrnrLghtRight_Pc_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 963 CrnrLghtLeft_Pc_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 963 CrnrLghtLeft_Pc_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 963 HeadLghtHiFdbck_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 TrnNotInPrkChime_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 963 TrnNotInPrkChime_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 963 PrkLightChime_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 963 PrkLightChime_B_Rq 1; +BA_ "WakeupSignal" SG_ 963 KeyInIgnWarn_B_Cmd 1; +BA_ "CrossOver_InfoCAN" SG_ 963 KeyInIgnWarn_B_Cmd 1; +BA_ "UsedOnPgmDBC" SG_ 963 KeyInIgnWarn_B_Cmd 1; +BA_ "WakeupSignal" SG_ 963 HomeSafeLtChime_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 963 HomeSafeLtChime_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 963 HomeSafeLtChime_B_Rq 1; +BA_ "WakeupSignal" SG_ 963 StopLghtOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 StopLghtOn_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 963 StopLghtOn_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 963 StopLghtOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 RvrseLghtOn_B_Stat 1; +BA_ "WakeupSignal" SG_ 963 PrkLght_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 PrkLght_D_Stat 1; +BA_ "WakeupSignal" SG_ 963 HeadLghtSwtch_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 HeadLghtSwtch_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 963 HeadLghtSwtch_D_Stat 2; +BA_ "GenSigStartValue" SG_ 963 HeadLghtSwtch_D_Stat 2; +BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLghtSwtch_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 HeadLampLoFrOn_B_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 963 HeadLampLoFrOn_B_Stat 1; +BA_ "GenSigStartValue" SG_ 963 HeadLampLoFrOn_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLampLoFrOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 HeadLampLoFlOn_B_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 963 HeadLampLoFlOn_B_Stat 1; +BA_ "GenSigStartValue" SG_ 963 HeadLampLoFlOn_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLampLoFlOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 HeadLampLoActv_B_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 963 HeadLampLoActv_B_Stat 1; +BA_ "GenSigStartValue" SG_ 963 HeadLampLoActv_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLampLoActv_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 963 HeadLampLoActv_B_Stat 1; +BA_ "WakeupSignal" SG_ 963 Headlamp_On_Wrning_Cmd 1; +BA_ "CrossOver_InfoCAN" SG_ 963 Headlamp_On_Wrning_Cmd 1; +BA_ "UsedOnPgmDBC" SG_ 963 Headlamp_On_Wrning_Cmd 1; +BA_ "CrossOver_InfoCAN" SG_ 963 Park_Brake_Chime_Rqst 1; +BA_ "UsedOnPgmDBC" SG_ 963 Park_Brake_Chime_Rqst 1; +BA_ "WakeupSignal" SG_ 963 HeadLghtHiOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 HeadLghtHiOn_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 963 HeadLghtHiOn_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 963 HeadLghtHiOn_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 963 HeadLghtHiOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 BrkWarnInd_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 963 BrkWarnInd_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 963 Brk_Fluid_Lvl_Low 1; +BA_ "UsedOnPgmDBC" SG_ 963 Brk_Fluid_Lvl_Low 1; +BA_ "CrossOver_InfoCAN" SG_ 963 ReducedGuard_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 963 ReducedGuard_D_Stat 1; +BA_ "WakeupSignal" SG_ 963 Perimeter_Alarm_Status 1; +BA_ "CrossOver_InfoCAN" SG_ 963 Perimeter_Alarm_Status 1; +BA_ "WakeupSignal" SG_ 963 Courtesy_BSave_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 963 Courtesy_BSave_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 963 Courtesy_BSave_Stat 1; +BA_ "GenSigStartValue" SG_ 963 Courtesy_BSave_Stat 1; +BA_ "WakeupSignal" SG_ 963 WndwGlbl_D_Cmd 1; +BA_ "CrossOver_InfoCAN" SG_ 963 WndwGlbl_D_Cmd 1; +BA_ "WakeupSignal" SG_ 963 PudLamp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 963 PudLamp_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 963 DayRnngLampOn_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 963 DayRnngLampOn_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 963 DayRnngLampOn_B_Stat 1; +BA_ "WakeupSignal" SG_ 963 PerimeterAlarmChimeRq 1; +BA_ "CrossOver_InfoCAN" SG_ 963 PerimeterAlarmChimeRq 1; +BA_ "UsedOnPgmDBC" SG_ 963 PerimeterAlarmChimeRq 1; +BA_ "UsedOnPgmDBC" SG_ 145 VehYawWActl_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 145 VehYawWActl_D_Qf 1; +BA_ "MetaData" SG_ 145 VehYawWActl_D_Qf 1; +BA_ "GenSigStartValue" SG_ 145 VehYawWActl_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 145 VehYawWActl_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 145 VehYawWActl_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 145 VehRolWActl_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 145 VehRolWActl_D_Qf 1; +BA_ "MetaData" SG_ 145 VehRolWActl_D_Qf 1; +BA_ "GenSigStartValue" SG_ 145 VehRolWActl_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 145 VehRolWActl_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 145 VehRolWActl_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 145 VehRollYawW_No_Cs 1; +BA_ "MetaData" SG_ 145 VehRollYawW_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 145 VehRollYawW_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 145 VehRollYawW_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 145 VehRollYaw_No_Cnt 1; +BA_ "MetaData" SG_ 145 VehRollYaw_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 145 VehRollYaw_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 145 VehRollYaw_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 145 VehYaw_W_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 145 VehYaw_W_Actl 65534; +BA_ "GenSigStartValue" SG_ 145 VehYaw_W_Actl 65534; +BA_ "U_CX727_MY2021_Rx" SG_ 145 VehYaw_W_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 145 VehYaw_W_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 145 VehRol_W_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 145 VehRol_W_Actl 65534; +BA_ "GenSigStartValue" SG_ 145 VehRol_W_Actl 65534; +BA_ "U_CX727_MY2021_Rx" SG_ 145 VehRol_W_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 145 VehRol_W_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 76 FirstRowBuckleMid 1; +BA_ "UsedOnPgmDBC" SG_ 76 FirstRowBuckleMid 1; +BA_ "GenSigStartValueInteger" SG_ 76 FirstRowBuckleMid 3; +BA_ "GenSigStartValue" SG_ 76 FirstRowBuckleMid 3; +BA_ "CrossOver_InfoCAN" SG_ 76 SecondRowBucklePsngr 1; +BA_ "GenSigStartValueInteger" SG_ 76 SecondRowBucklePsngr 3; +BA_ "GenSigStartValue" SG_ 76 SecondRowBucklePsngr 3; +BA_ "CrossOver_InfoCAN" SG_ 76 SecondRowBuckleMid 1; +BA_ "GenSigStartValueInteger" SG_ 76 SecondRowBuckleMid 3; +BA_ "GenSigStartValue" SG_ 76 SecondRowBuckleMid 3; +BA_ "CrossOver_InfoCAN" SG_ 76 SecondRowBuckleDriver 1; +BA_ "GenSigStartValueInteger" SG_ 76 SecondRowBuckleDriver 3; +BA_ "GenSigStartValue" SG_ 76 SecondRowBuckleDriver 3; +BA_ "CrossOver_InfoCAN" SG_ 76 FirstRowBuckleDriver 1; +BA_ "UsedOnPgmDBC" SG_ 76 FirstRowBuckleDriver 1; +BA_ "GenSigStartValueInteger" SG_ 76 FirstRowBuckleDriver 3; +BA_ "GenSigStartValue" SG_ 76 FirstRowBuckleDriver 3; +BA_ "U_P702_MY2021_Rx" SG_ 76 FirstRowBuckleDriver 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 76 FirstRowBuckleDriver 1; +BA_ "U_CX727_MY2021_Rx" SG_ 76 FirstRowBuckleDriver 1; +BA_ "CrossOver_InfoCAN" SG_ 76 RILReq 1; +BA_ "UsedOnPgmDBC" SG_ 76 RILReq 1; +BA_ "CrossOver_InfoCAN" SG_ 76 FirstRowBucklePsngr 1; +BA_ "UsedOnPgmDBC" SG_ 76 FirstRowBucklePsngr 1; +BA_ "GenSigStartValueInteger" SG_ 76 FirstRowBucklePsngr 3; +BA_ "GenSigStartValue" SG_ 76 FirstRowBucklePsngr 3; +BA_ "WakeupSignal" SG_ 76 RstrnImpactEvntStatus 1; +BA_ "CrossOver_InfoCAN" SG_ 76 RstrnImpactEvntStatus 1; +BA_ "UsedOnPgmDBC" SG_ 76 RstrnImpactEvntStatus 1; +BA_ "U_P702_MY2021_Rx" SG_ 76 RstrnImpactEvntStatus 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 76 RstrnImpactEvntStatus 1; +BA_ "U_CX727_MY2021_Rx" SG_ 76 RstrnImpactEvntStatus 1; +BA_ "CrossOver_InfoCAN" SG_ 76 PsngrFrntDetct_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 76 PsngrFrntDetct_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 76 PsngrFrntDetct_D_Actl 3; +BA_ "GenSigStartValue" SG_ 76 PsngrFrntDetct_D_Actl 3; +BA_ "CrossOver_InfoCAN" SG_ 76 EDRTriggerEvntSync 1; +BA_ "CrossOver_InfoCAN" SG_ 76 PassRstrnInd_Req 1; +BA_ "GenSigStartValueInteger" SG_ 76 PassRstrnInd_Req 3; +BA_ "GenSigStartValue" SG_ 76 PassRstrnInd_Req 3; +BA_ "UsedOnPgmDBC" SG_ 65 immoControlData_T1 1; +BA_ "U_P702_MY2021_Rx" SG_ 65 immoControlData_T1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 65 immoControlData_T1 1; +BA_ "UsedOnPgmDBC" SG_ 65 immoControlCmd_T1 1; +BA_ "U_P702_MY2021_Rx" SG_ 65 immoControlCmd_T1 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 65 immoControlCmd_T1 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 HILL_DESC_SW 1; +BA_ "UsedOnPgmDBC" SG_ 1076 HILL_DESC_SW 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 HILL_DESC_SW 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 HILL_DESC_SW 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 AutoRgen_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 AutoRgen_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1076 W2S_LAMP_OK 1; +BA_ "GenSigStartValue" SG_ 1076 W2S_LAMP_OK 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 OdoTripRx_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 OdoTripRx_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 OdoTripRx_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 Veh_V_CompLimMx 1; +BA_ "GenSigStartValueInteger" SG_ 1076 Veh_V_CompLimMx 4095; +BA_ "GenSigStartValue" SG_ 1076 Veh_V_CompLimMx 4093; +BA_ "U_P702_MY2021_Rx" SG_ 1076 Veh_V_CompLimMx 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 Veh_V_CompLimMx 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 DrvSlipCtlMde_B_RqMyKey 1; +BA_ "UsedOnPgmDBC" SG_ 1076 DrvSlipCtlMde_B_RqMyKey 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 FuelLvlWarn_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 FuelSecndActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 FuelLvlPssvSide_No_Raw 1; +BA_ "UsedOnPgmDBC" SG_ 1076 FuelLvlPssvSide_No_Raw 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 FuelLvlPssvSide_No_Raw 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 FuelLvlPssvSide_No_Raw 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 FUEL_SENSOR_NUM 1; +BA_ "UsedOnPgmDBC" SG_ 1076 FUEL_SENSOR_NUM 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 FUEL_SENSOR_NUM 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 FUEL_SENSOR_NUM 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 FuelLvlActvSide_No_Raw 1; +BA_ "UsedOnPgmDBC" SG_ 1076 FuelLvlActvSide_No_Raw 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 FuelLvlActvSide_No_Raw 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 FuelLvlActvSide_No_Raw 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 FuelLvl_Pc_Dsply 1; +BA_ "UsedOnPgmDBC" SG_ 1076 FuelLvl_Pc_Dsply 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 FuelLvl_Pc_Dsply 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 FuelLvl_Pc_Dsply 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 DISPLAY_SPEED_SCALING 1; +BA_ "UsedOnPgmDBC" SG_ 1076 DISPLAY_SPEED_SCALING 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 DISPLAY_SPEED_SCALING 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 DISPLAY_SPEED_SCALING 1; +BA_ "CrossOver_InfoCAN" SG_ 1076 DISPLAY_SPEED_OFFSET 1; +BA_ "UsedOnPgmDBC" SG_ 1076 DISPLAY_SPEED_OFFSET 1; +BA_ "U_P702_MY2021_Rx" SG_ 1076 DISPLAY_SPEED_OFFSET 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1076 DISPLAY_SPEED_OFFSET 1; +BA_ "GenSigStartValueInteger" SG_ 862 AutoStpHvacDelta_I_Est 192; +BA_ "U_P702_MY2021_Rx" SG_ 862 HvacBlwrFront_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 862 HvacBlwrFront_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 862 CabnAmb_Te_Actl 114; +BA_ "GenSigStartValue" SG_ 862 CabnAmb_Te_Actl 0; +BA_ "U_P702_MY2021_Rx" SG_ 862 CabnAmb_Te_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 862 HvacRemoteStrt_N_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 862 HvacRemoteStrt_N_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 862 HvacRemoteStrt_N_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 862 ClimtThrmlLoad_No_Actl 255; +BA_ "GenSigStartValue" SG_ 862 ClimtThrmlLoad_No_Actl 255; +BA_ "U_P702_MY2021_Rx" SG_ 862 ClimtThrmlLoad_No_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 PtWakeReas_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 VehOnSrc_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 VehOnSrc_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 StrtrMtrCtlDStat_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 StrtrMtrCtlDStat_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 EngStrtActv_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 EngStrtActv_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 EngStrt_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 EngStrt_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 DrvInCtl_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 DrvInCtl_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 AdvStrt_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 AdvStrt_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 931 CrnkInhbt_No_Cs 1; +BA_ "ContentDependant" SG_ 931 CrnkInhbt_No_Cs 1; +BA_ "MetaData" SG_ 931 CrnkInhbt_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 CrnkInhbt_No_Cs 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 CrnkInhbt_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 931 CrnkInhbt_No_Cnt 1; +BA_ "ContentDependant" SG_ 931 CrnkInhbt_No_Cnt 1; +BA_ "MetaData" SG_ 931 CrnkInhbt_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 CrnkInhbt_No_Cnt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 CrnkInhbt_No_Cnt 1; +BA_ "GenSigStartValueInteger" SG_ 931 CrnkInhbt_B_Stat 1; +BA_ "GenSigStartValue" SG_ 931 CrnkInhbt_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 CrnkInhbt_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 CrnkInhbt_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 931 IgnPreOffActv_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 931 IgnPreOffActv_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 578 PtLatchActv_B_RqBcm 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 PtLatchActv_B_RqBcm 1; +BA_ "U_P702_MY2021_Rx" SG_ 578 immoSecureIdleMode 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 immoSecureIdleMode 1; +BA_ "WakeupSignal" SG_ 578 ReFuelSwtchStat_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 578 FuelPumpPwr_D_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 FuelPumpPwr_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 578 BattULo_U_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 578 BattULo_U_Actl 255; +BA_ "GenSigStartValue" SG_ 578 BattULo_U_Actl 255; +BA_ "U_P702_MY2021_Rx" SG_ 578 BattULo_U_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 BattULo_U_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 578 BattULo_U_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 578 PrkLckCtl_B_Enbl 1; +BA_ "WakeupSignal" SG_ 578 PrkLckCtlMsgTxt_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 578 PrkLckCtlMsgTxt_D_Rq 1; +BA_ "WakeupSignal" SG_ 578 PrkLckCtlAvail_T_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 578 PrkLckCtlAvail_T_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 578 BrkTrnShifLck_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 BrkTrnShifLck_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 578 DriverCrankingReq 1; +BA_ "U_P702_MY2021_Rx" SG_ 578 DriverCrankingReq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 DriverCrankingReq 1; +BA_ "UsedOnPgmDBC" SG_ 578 EngOff_T_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 578 EngOff_T_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 EngOff_T_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 578 EngOff_T_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 578 DcacElPw_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 578 DcacElPw_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 DcacElPw_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 578 BattULo_I_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 578 BattULo_I_Actl 16383; +BA_ "GenSigStartValue" SG_ 578 BattULo_I_Actl 16383; +BA_ "U_P702_MY2021_Rx" SG_ 578 BattULo_I_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 578 BattULo_I_Actl 1; +BA_ "WakeupSignal" SG_ 947 DimmingLvlEvnt_No_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatDrvErrCnt_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 DrStatDrvErrCnt_B_Stat 1; +BA_ "WakeupSignal" SG_ 947 TurnLghtRight_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 947 TurnLghtRight_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 TurnLghtRight_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 947 TurnLghtRightOn_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 947 TurnLghtRightOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 947 TurnLghtLeftOn_B_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 947 TurnLghtLeftOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 947 FogLghtRearOn_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 FogLghtRearOn_B_Stat 1; +BA_ "WakeupSignal" SG_ 947 Backlit_LED_Status 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Backlit_LED_Status 1; +BA_ "WakeupSignal" SG_ 947 TurnLghtLeft_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 947 TurnLghtLeft_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 TurnLghtLeft_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 947 FogLghtFrontOn_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 FogLghtFrontOn_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 947 IgnKeyType_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 947 IgnKeyType_D_Actl 14; +BA_ "GenSigStartValue" SG_ 947 IgnKeyType_D_Actl 14; +BA_ "U_P702_MY2021_Rx" SG_ 947 IgnKeyType_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 IgnKeyType_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 947 IgnKeyType_D_Actl 1; +BA_ "WakeupSignal" SG_ 947 Parklamp_Status 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Parklamp_Status 1; +BA_ "UsedOnPgmDBC" SG_ 947 Parklamp_Status 1; +BA_ "GenSigStartValueInteger" SG_ 947 Parklamp_Status 1; +BA_ "GenSigStartValue" SG_ 947 Parklamp_Status 1; +BA_ "WakeupSignal" SG_ 947 Litval 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Litval 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 Litval 1; +BA_ "WakeupSignal" SG_ 947 Key_In_Ignition_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Key_In_Ignition_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 947 Key_In_Ignition_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 947 Key_In_Ignition_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 Key_In_Ignition_Stat 1; +BA_ "WakeupSignal" SG_ 947 Ignition_Status 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Ignition_Status 1; +BA_ "UsedOnPgmDBC" SG_ 947 Ignition_Status 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 Ignition_Status 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 Ignition_Status 1; +BA_ "U_CX727_MY2021_Rx" SG_ 947 Ignition_Status 1; +BA_ "WakeupSignal" SG_ 947 Dimming_Lvl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Dimming_Lvl 1; +BA_ "GenSigStartValueInteger" SG_ 947 Dimming_Lvl 12; +BA_ "GenSigStartValue" SG_ 947 Dimming_Lvl 12; +BA_ "WakeupSignal" SG_ 947 Day_Night_Status 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Day_Night_Status 1; +BA_ "UsedOnPgmDBC" SG_ 947 Day_Night_Status 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 Day_Night_Status 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 Day_Night_Status 1; +BA_ "WakeupSignal" SG_ 947 Remote_Start_Status 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Remote_Start_Status 1; +BA_ "WakeupSignal" SG_ 947 DrStatTgate_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 DrStatTgate_B_Actl 1; +BA_ "WakeupSignal" SG_ 947 DrStatRr_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 DrStatRr_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatRr_B_Actl 1; +BA_ "WakeupSignal" SG_ 947 DrStatRl_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 DrStatRl_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatRl_B_Actl 1; +BA_ "WakeupSignal" SG_ 947 DrStatPsngr_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 DrStatPsngr_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatPsngr_B_Actl 1; +BA_ "WakeupSignal" SG_ 947 DrStatInnrTgate_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 DrStatInnrTgate_B_Actl 1; +BA_ "WakeupSignal" SG_ 947 DrStatHood_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 DrStatHood_B_Actl 1; +BA_ "WakeupSignal" SG_ 947 DrStatDrv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 DrStatDrv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 947 DrStatDrv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 DrStatDrv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 DrStatDrv_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 947 DrStatDrv_B_Actl 1; +BA_ "WakeupSignal" SG_ 947 PrkBrkActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 PrkBrkActv_B_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 947 PrkBrkActv_B_Actl 1; +BA_ "ContentDependant" SG_ 947 PrkBrkActv_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 PrkBrkActv_B_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 PrkBrkActv_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 947 PrkBrkActv_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 947 LifeCycMde_D_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 947 LifeCycMde_D_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 947 LifeCycMde_D_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 947 LifeCycMde_D_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 947 LifeCycMde_D_Actl 1; +BA_ "WakeupSignal" SG_ 947 Delay_Accy 1; +BA_ "CrossOver_InfoCAN" SG_ 947 Delay_Accy 1; +BA_ "WakeupSignal" SG_ 947 CrashEvnt_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 947 CrashEvnt_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 947 CrashEvnt_D_Stat 3; +BA_ "GenSigStartValue" SG_ 947 CrashEvnt_D_Stat 3; +BA_ "CrossOver_InfoCAN" SG_ 947 FuelPmpInhbt_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 947 BodySrvcRqd_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BattULoChrg_URate_RqMx 1; +BA_ "GenSigStartValueInteger" SG_ 1084 BattULoChrg_URate_RqMx 5; +BA_ "GenSigStartValue" SG_ 1084 BattULoChrg_URate_RqMx 5; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULoChrg_URate_RqMx 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULoChrg_URate_RqMx 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BattULoChrg_U_RqMx 1; +BA_ "GenSigStartValueInteger" SG_ 1084 BattULoChrg_U_RqMx 34; +BA_ "GenSigStartValue" SG_ 1084 BattULoChrg_U_RqMx 34; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULoChrg_U_RqMx 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULoChrg_U_RqMx 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BattULoChrg_U_RqMn 1; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULoChrg_U_RqMn 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULoChrg_U_RqMn 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BattULoState_D_Qlty 1; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULoState_D_Qlty 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULoState_D_Qlty 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BSFault 1; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BSFault 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BSFault 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BattULo2_Te_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 1084 BattULo2_Te_Actl 127; +BA_ "GenSigStartValue" SG_ 1084 BattULo2_Te_Actl 127; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BattULo2_Te_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BattULo2_Te_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BSBattSOC 1; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BSBattSOC 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BSBattSOC 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BSBattQDeltaRideAh 1; +BA_ "GenSigStartValueInteger" SG_ 1084 BSBattQDeltaRideAh 12800; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BSBattQDeltaRideAh 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BSBattQDeltaRideAh 1; +BA_ "UsedOnPgmDBC" SG_ 1084 BSBattQCapAh 1; +BA_ "U_P702_MY2021_Rx" SG_ 1084 BSBattQCapAh 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1084 BSBattQCapAh 1; +BA_ "U_P702_MY2021_Rx" SG_ 1068 EngStrtInhbt_B_RqBatt 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 EngStrtInhbt_B_RqBatt 1; +BA_ "U_P702_MY2021_Rx" SG_ 1068 BattULoChrg_D_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 BattULoChrg_D_Rq 1; +BA_ "WakeupSignal" SG_ 1068 PwSysULoFalt_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1068 PwSysULoFalt_D_Stat 1; +BA_ "UsedOnPgmDBC" SG_ 1068 PwSysULoFalt_D_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1068 Shed_T_Eng_Off_B 1; +BA_ "WakeupSignal" SG_ 1068 Shed_Feature_Group_ID 1; +BA_ "U_P702_MY2021_Rx" SG_ 1068 Shed_Feature_Group_ID 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 Shed_Feature_Group_ID 1; +BA_ "CrossOver_InfoCAN" SG_ 1068 Shed_Drain_Eng_Off_B 1; +BA_ "WakeupSignal" SG_ 1068 Shed_Level_Req 1; +BA_ "CrossOver_InfoCAN" SG_ 1068 Shed_Level_Req 1; +BA_ "UsedOnPgmDBC" SG_ 1068 Shed_Level_Req 1; +BA_ "U_P702_MY2021_Rx" SG_ 1068 Shed_Level_Req 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 Shed_Level_Req 1; +BA_ "UsedOnPgmDBC" SG_ 1068 ULoRgenTestMde_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1068 ULoRgenTestMde_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 ULoRgenTestMde_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 1068 ChargeMode 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 ChargeMode 1; +BA_ "CrossOver_InfoCAN" SG_ 1068 Batt_Lo_SoC_B 1; +BA_ "UsedOnPgmDBC" SG_ 1068 PeriodicElLoad_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 1068 PeriodicElLoad_B_Stat 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 1068 PeriodicElLoad_B_Stat 1; +BA_ "CrossOver_InfoCAN" SG_ 1068 Batt_Crit_SoC_B 1; +BA_ "UsedOnPgmDBC" SG_ 146 VehVert2_A_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 146 VehVert2_A_Actl 8190; +BA_ "GenSigStartValue" SG_ 146 VehVert2_A_Actl 8190; +BA_ "U_P702_MY2021_Rx" SG_ 146 VehVert2_A_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 146 VehVert2_A_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 146 VehVert2_A_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 146 VehLatLongVertA_No_Cs 1; +BA_ "MetaData" SG_ 146 VehLatLongVertA_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLatLongVertA_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 146 VehLatLongVertA_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 146 VehLatLongVert_No_Cnt 1; +BA_ "MetaData" SG_ 146 VehLatLongVert_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLatLongVert_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 146 VehLatLongVert_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 146 VehLong2_A_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 146 VehLong2_A_Actl 8190; +BA_ "GenSigStartValue" SG_ 146 VehLong2_A_Actl 8190; +BA_ "U_P702_MY2021_Rx" SG_ 146 VehLong2_A_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 146 VehLong2_A_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLong2_A_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 146 VehLat2_A_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 146 VehLat2_A_Actl 8190; +BA_ "GenSigStartValue" SG_ 146 VehLat2_A_Actl 8190; +BA_ "U_P702_MY2021_Rx" SG_ 146 VehLat2_A_Actl 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 146 VehLat2_A_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLat2_A_Actl 1; +BA_ "UsedOnPgmDBC" SG_ 146 VehVertAActl_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 146 VehVertAActl_D_Qf 1; +BA_ "MetaData" SG_ 146 VehVertAActl_D_Qf 1; +BA_ "GenSigStartValue" SG_ 146 VehVertAActl_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 146 VehVertAActl_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 146 VehVertAActl_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 146 VehLongAActl_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 146 VehLongAActl_D_Qf 1; +BA_ "MetaData" SG_ 146 VehLongAActl_D_Qf 1; +BA_ "GenSigStartValue" SG_ 146 VehLongAActl_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 146 VehLongAActl_D_Qf 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 146 VehLongAActl_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLongAActl_D_Qf 1; +BA_ "UsedOnPgmDBC" SG_ 146 VehLatAActl_D_Qf 1; +BA_ "GenSigStartValueInteger" SG_ 146 VehLatAActl_D_Qf 1; +BA_ "MetaData" SG_ 146 VehLatAActl_D_Qf 1; +BA_ "GenSigStartValue" SG_ 146 VehLatAActl_D_Qf 1; +BA_ "U_CX727_MY2021_Rx" SG_ 146 VehLatAActl_D_Qf 1; +BA_ "U_P702_MY2021_Rx" SG_ 146 VehLatAActl_D_Qf 1; +BA_ "GenSigSendType" SG_ 1900 TesterPhysicalResCCM 3; +BA_ "GenSigSendType" SG_ 1806 TesterPhysicalResIPMA 3; +BA_ "CrossOver_InfoCAN" SG_ 997 PersIndexCcm_D_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 997 PersIndexCcm_D_Actl 4; +BA_ "GenSigStartValue" SG_ 997 PersIndexCcm_D_Actl 4; +BA_ "GenSigSendType" SG_ 997 PersIndexCcm_D_Actl 3; +BA_ "CrossOver_InfoCAN" SG_ 997 FeatNoCcmActl 1; +BA_ "GenSigSendType" SG_ 997 FeatNoCcmActl 3; +BA_ "CrossOver_InfoCAN" SG_ 997 FeatConfigCcmActl 1; +BA_ "GenSigSendType" SG_ 997 FeatConfigCcmActl 3; +BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjRelLong_V_Actl 1022; +BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjRelLong_V_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjRelLong_V_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjRelLat_V_Actl 510; +BA_ "GenSigStartValue" SG_ 983 CmbbObjRelLat_V_Actl 510; +BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjRelLat_V_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjRelLat_V_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjDistLong_L_Actl 1022; +BA_ "GenSigStartValue" SG_ 983 CmbbObjDistLong_L_Actl 1022; +BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjDistLong_L_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjDistLong_L_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjDistLat_L_Actl 510; +BA_ "GenSigStartValue" SG_ 983 CmbbObjDistLat_L_Actl 510; +BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjDistLat_L_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjDistLat_L_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjConfdnc_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjConfdnc_D_Stat 1; +BA_ "GenSigStartValueInteger" SG_ 983 CmbbObjColl_T_Actl 126; +BA_ "GenSigStartValue" SG_ 983 CmbbObjColl_T_Actl 125; +BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjColl_T_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjColl_T_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 983 CmbbObjClass_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 983 CmbbObjClass_D_Stat 1; +BA_ "U_CX727_MY2021_Rx" SG_ 983 EsaEnbl_D2_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 983 EsaEnbl_D2_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1DistRigh_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1DistLeft_D_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbMde1_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbIntns1_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 980 AdbBrdr1Up_An_Rq 510; +BA_ "GenSigStartValue" SG_ 980 AdbBrdr1Up_An_Rq 509; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1Up_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 980 AdbBrdr1Right_An_Rq 2046; +BA_ "GenSigStartValue" SG_ 980 AdbBrdr1Right_An_Rq 2046; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1Right_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 980 AdbBrdr1Low_An_Rq 510; +BA_ "GenSigStartValue" SG_ 980 AdbBrdr1Low_An_Rq 509; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1Low_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 980 AdbBrdr1Left_An_Rq 2046; +BA_ "GenSigStartValue" SG_ 980 AdbBrdr1Left_An_Rq 2046; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1Left_An_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1CritRigh_T_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 980 AdbBrdr1CritLeft_T_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlRng_L_Max 1; +BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlRng_L_Max 1; +BA_ "U_CX727_MY2021_Rx" SG_ 979 HandsOffCnfm_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 HandsOffCnfm_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtl_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtl_D_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlRampType_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlRampType_D_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlPrecision_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlPrecision_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 979 LatCtlPathOffst_L_Actl 512; +BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlPathOffst_L_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlPathOffst_L_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 979 LatCtlPath_An_Actl 1000; +BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlPath_An_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlPath_An_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 979 LatCtlCurv_NoRate_Actl 4096; +BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlCurv_NoRate_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlCurv_NoRate_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 979 LatCtlCurv_No_Actl 1000; +BA_ "U_CX727_MY2021_Rx" SG_ 979 LatCtlCurv_No_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 979 LatCtlCurv_No_Actl 1; +BA_ "GenSigStartValueInteger" SG_ 976 SrpHghtRight_L_Actl 256; +BA_ "GenSigStartValueInteger" SG_ 976 SrpHghtLeft_L_Actl 256; +BA_ "GenSigSendType" SG_ 973 TsrVl2PrmntMsgTxt_D_Rq 3; +BA_ "GenSigSendType" SG_ 973 TsrVl1PrmntMsgTxt_D_Rq 3; +BA_ "GenSigStartValueInteger" SG_ 973 TsrVl2RstrcMsgTxt2_D_Rq 1; +BA_ "GenSigStartValue" SG_ 973 TsrVl2RstrcMsgTxt2_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrVl2RstrcMsgTxt2_D_Rq 3; +BA_ "GenSigStartValueInteger" SG_ 973 TsrVl1RstrcMsgTxt2_D_Rq 1; +BA_ "GenSigStartValue" SG_ 973 TsrVl1RstrcMsgTxt2_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrVl1RstrcMsgTxt2_D_Rq 3; +BA_ "GenSigSendType" SG_ 973 TsrOvtkMsgTxt2_D_Rq 3; +BA_ "GenSigSendType" SG_ 973 WwaWarn_B_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrVlUnitMsgTxt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 973 TsrVlUnitMsgTxt_D_Rq 2; +BA_ "GenSigStartValue" SG_ 973 TsrVlUnitMsgTxt_D_Rq 2; +BA_ "GenSigSendType" SG_ 973 TsrVlUnitMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrVLim2MsgTxt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 973 TsrVLim2MsgTxt_D_Rq 255; +BA_ "GenSigStartValue" SG_ 973 TsrVLim2MsgTxt_D_Rq 255; +BA_ "GenSigSendType" SG_ 973 TsrVLim2MsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrVLim1MsgTxt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 973 TsrVLim1MsgTxt_D_Rq 255; +BA_ "GenSigStartValue" SG_ 973 TsrVLim1MsgTxt_D_Rq 255; +BA_ "GenSigSendType" SG_ 973 TsrVLim1MsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrVl2StatMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrVl2StatMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrVl2RstrcMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrVl2RstrcMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrVl1StatMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrVl1StatMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrVl1RstrcMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrVl1RstrcMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrStatMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrStatMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrOvtkStatMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrOvtkStatMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrOvtkMsgTxt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 973 TsrOvtkMsgTxt_D_Rq 1; +BA_ "GenSigStartValue" SG_ 973 TsrOvtkMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrOvtkMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrOswWarnMsgTxt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 973 TsrOswWarnMsgTxt_D_Rq 1; +BA_ "GenSigStartValue" SG_ 973 TsrOswWarnMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrOswWarnMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 973 TsrMsgTxt_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 973 TsrMsgTxt_D_Rq 1; +BA_ "GenSigStartValue" SG_ 973 TsrMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 973 TsrMsgTxt_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 970 LkaDrvOvrrd_D_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 970 LkaActvStats_D2_Req 1; +BA_ "U_P702_MY2021_Rx" SG_ 970 LkaActvStats_D2_Req 1; +BA_ "GenSigStartValueInteger" SG_ 970 LaRefAng_No_Req 2048; +BA_ "U_CX727_MY2021_Rx" SG_ 970 LaRefAng_No_Req 1; +BA_ "U_P702_MY2021_Rx" SG_ 970 LaRefAng_No_Req 1; +BA_ "U_CX727_MY2021_Rx" SG_ 970 LaRampType_B_Req 1; +BA_ "U_P702_MY2021_Rx" SG_ 970 LaRampType_B_Req 1; +BA_ "GenSigStartValueInteger" SG_ 970 LaCurvature_No_Calc 2048; +BA_ "U_CX727_MY2021_Rx" SG_ 970 LaCurvature_No_Calc 1; +BA_ "U_P702_MY2021_Rx" SG_ 970 LaCurvature_No_Calc 1; +BA_ "U_CX727_MY2021_Rx" SG_ 970 LdwActvStats_D_Req 1; +BA_ "U_P702_MY2021_Rx" SG_ 970 LdwActvStats_D_Req 1; +BA_ "CrossOver_InfoCAN" SG_ 970 LdwActvIntns_D_Req 1; +BA_ "U_CX727_MY2021_Rx" SG_ 970 LdwActvIntns_D_Req 1; +BA_ "U_P702_MY2021_Rx" SG_ 970 LdwActvIntns_D_Req 1; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3DistRigh_D_Stat 1; +BA_ "GenSigSendType" SG_ 962 AdbBrdr3DistRigh_D_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3DistLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 962 AdbBrdr3DistLeft_D_Stat 3; +BA_ "GenSigSendType" SG_ 962 AdbMde3_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbMde3_D_Rq 1; +BA_ "GenSigSendType" SG_ 962 AdbIntns3_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbIntns3_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 962 AdbBrdr3Up_An_Rq 510; +BA_ "GenSigStartValue" SG_ 962 AdbBrdr3Up_An_Rq 509; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3Up_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 962 AdbBrdr3Right_An_Rq 2046; +BA_ "GenSigStartValue" SG_ 962 AdbBrdr3Right_An_Rq 2046; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3Right_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 962 AdbBrdr3Low_An_Rq 510; +BA_ "GenSigStartValue" SG_ 962 AdbBrdr3Low_An_Rq 509; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3Low_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 962 AdbBrdr3Left_An_Rq 2046; +BA_ "GenSigStartValue" SG_ 962 AdbBrdr3Left_An_Rq 2046; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3Left_An_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3CritRigh_T_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 962 AdbBrdr3CritLeft_T_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2DistRigh_D_Stat 1; +BA_ "GenSigSendType" SG_ 961 AdbBrdr2DistRigh_D_Stat 3; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2DistLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 961 AdbBrdr2DistLeft_D_Stat 3; +BA_ "GenSigSendType" SG_ 961 AdbMde2_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbMde2_D_Rq 1; +BA_ "GenSigSendType" SG_ 961 AdbIntns2_D_Rq 3; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbIntns2_D_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 961 AdbBrdr2Up_An_Rq 510; +BA_ "GenSigStartValue" SG_ 961 AdbBrdr2Up_An_Rq 509; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2Up_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 961 AdbBrdr2Right_An_Rq 2046; +BA_ "GenSigStartValue" SG_ 961 AdbBrdr2Right_An_Rq 2046; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2Right_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 961 AdbBrdr2Low_An_Rq 510; +BA_ "GenSigStartValue" SG_ 961 AdbBrdr2Low_An_Rq 509; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2Low_An_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 961 AdbBrdr2Left_An_Rq 2046; +BA_ "GenSigStartValue" SG_ 961 AdbBrdr2Left_An_Rq 2046; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2Left_An_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2CritRigh_T_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 961 AdbBrdr2CritLeft_T_Stat 1; +BA_ "MetaData" SG_ 394 HaDsply_No_Cs 1; +BA_ "ContentDependant" SG_ 394 HaDsply_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 394 HaDsply_No_Cs 1; +BA_ "GenSigSendType" SG_ 394 HaDsply_No_Cs 3; +BA_ "MetaData" SG_ 394 HaDsply_No_Cnt 1; +BA_ "ContentDependant" SG_ 394 HaDsply_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 394 HaDsply_No_Cnt 1; +BA_ "GenSigSendType" SG_ 394 HaDsply_No_Cnt 3; +BA_ "GenSigSendType" SG_ 394 AccStopStat_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 AccTrgDist2_D_Dsply 1; +BA_ "GenSigSendType" SG_ 394 AccTrgDist2_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 AccStopRes_B_Dsply 1; +BA_ "GenSigSendType" SG_ 394 AccStopRes_B_Dsply 3; +BA_ "GenSigSendType" SG_ 394 TjaWarn_D_Rq 3; +BA_ "GenSigSendType" SG_ 394 Tja_D_Stat 3; +BA_ "GenSigSendType" SG_ 394 TjaMsgTxt_D_Dsply 3; +BA_ "GenSigSendType" SG_ 394 IaccLamp_D_Rq 3; +BA_ "GenSigSendType" SG_ 394 AccMsgTxt_D2_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 394 FcwDeny_B_Dsply 1; +BA_ "GenSigSendType" SG_ 394 FcwDeny_B_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 FcwMemStat_B_Actl 1; +BA_ "GenSigSendType" SG_ 394 FcwMemStat_B_Actl 3; +BA_ "ECGUsedRxSignal" SG_ 394 FcwMemStat_B_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 394 AccTGap_B_Dsply 1; +BA_ "GenSigSendType" SG_ 394 AccTGap_B_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 CadsAlignIncplt_B_Actl 1; +BA_ "GenSigSendType" SG_ 394 CadsAlignIncplt_B_Actl 3; +BA_ "CrossOver_InfoCAN" SG_ 394 AccFllwMde_B_Dsply 1; +BA_ "GenSigSendType" SG_ 394 AccFllwMde_B_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 CadsRadrBlck_B_Actl 1; +BA_ "GenSigSendType" SG_ 394 CadsRadrBlck_B_Actl 3; +BA_ "CrossOver_InfoCAN" SG_ 394 CmbbPostEvnt_B_Dsply 1; +BA_ "GenSigSendType" SG_ 394 CmbbPostEvnt_B_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 AccStopMde_B_Dsply 1; +BA_ "GenSigSendType" SG_ 394 AccStopMde_B_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 FcwMemSens_D_Actl 1; +BA_ "GenSigSendType" SG_ 394 FcwMemSens_D_Actl 3; +BA_ "ECGUsedRxSignal" SG_ 394 FcwMemSens_D_Actl 1; +BA_ "CrossOver_InfoCAN" SG_ 394 FcwMsgTxt_D_Rq 1; +BA_ "GenSigSendType" SG_ 394 FcwMsgTxt_D_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 394 AccWarn_D_Dsply 1; +BA_ "GenSigSendType" SG_ 394 AccWarn_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 FcwVisblWarn_B_Rq 1; +BA_ "GenSigSendType" SG_ 394 FcwVisblWarn_B_Rq 3; +BA_ "CrossOver_InfoCAN" SG_ 394 FcwAudioWarn_B_Rq 1; +BA_ "GenSigSendType" SG_ 394 FcwAudioWarn_B_Rq 3; +BA_ "ECGUsedRxSignal" SG_ 394 FcwAudioWarn_B_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 394 AccTGap_D_Dsply 1; +BA_ "GenSigStartValueInteger" SG_ 394 AccTGap_D_Dsply 3; +BA_ "GenSigStartValue" SG_ 394 AccTGap_D_Dsply 3; +BA_ "GenSigSendType" SG_ 394 AccTGap_D_Dsply 3; +BA_ "CrossOver_InfoCAN" SG_ 394 AccMemEnbl_B_RqDrv 1; +BA_ "GenSigStartValueInteger" SG_ 394 AccMemEnbl_B_RqDrv 1; +BA_ "GenSigStartValue" SG_ 394 AccMemEnbl_B_RqDrv 1; +BA_ "GenSigSendType" SG_ 394 AccMemEnbl_B_RqDrv 3; +BA_ "CrossOver_InfoCAN" SG_ 394 FdaMem_B_Stat 1; +BA_ "GenSigSendType" SG_ 394 FdaMem_B_Stat 3; +BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkDecel_No_Cnt 1; +BA_ "MetaData" SG_ 391 CmbbBrkDecel_No_Cnt 1; +BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkDecel_No_Cnt 1; +BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkDecel_No_Cnt 1; +BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkDecel_No_Cs 1; +BA_ "MetaData" SG_ 391 CmbbBrkDecel_No_Cs 1; +BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkDecel_No_Cs 1; +BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkDecel_No_Cs 1; +BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkDecel_A_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 391 CmbbBrkDecel_A_Rq 5129; +BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkDecel_A_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkDecel_A_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkPrchg_D_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkPrchg_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkPrchg_D_Rq 1; +BA_ "ECGUsedRxSignal" SG_ 391 CmbbBrkPrchg_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 391 CmbbBrkDecel_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBrkDecel_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBrkDecel_B_Rq 1; +BA_ "ECGUsedRxSignal" SG_ 391 CmbbBrkDecel_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 391 CmbbBaSens_D_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 391 CmbbBaSens_D_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 391 CmbbBaSens_D_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 390 AccBrkTot_A_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 390 AccBrkTot_A_Rq 5129; +BA_ "U_CX727_MY2021_Rx" SG_ 390 AccBrkTot_A_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccBrkTot_A_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccPrpl_A_Pred 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccPrpl_A_Pred 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccVeh_V_Trg 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccVeh_V_Trg 1; +BA_ "UsedOnPgmDBC" SG_ 390 AccBrkPrkEl_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 390 AccBrkPrkEl_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccBrkPrkEl_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 390 CmbbDeny_B_Actl 1; +BA_ "U_CX727_MY2021_Rx" SG_ 390 CmbbDeny_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 CmbbDeny_B_Actl 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 CmbbEngTqMn_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 CmbbEngTqMn_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccPrpl_A_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccPrpl_A_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccDeny_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccDeny_B_Rq 1; +BA_ "WakeupSignal" SG_ 390 AccResumEnbl_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccResumEnbl_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccResumEnbl_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 390 AccCancl_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccCancl_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccCancl_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 390 AccBrkPrchg_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 390 AccBrkPrchg_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccBrkPrchg_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 390 AccBrkDecel_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 390 AccBrkDecel_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccBrkDecel_B_Rq 1; +BA_ "UsedOnPgmDBC" SG_ 390 AccStopStat_B_Rq 1; +BA_ "U_CX727_MY2021_Rx" SG_ 390 AccStopStat_B_Rq 1; +BA_ "U_P702_MY2021_Rx" SG_ 390 AccStopStat_B_Rq 1; +BA_ "U_T6_MCA_MY2020_Rx" SG_ 390 AccStopStat_B_Rq 1; +BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_GWOnBoardTester 255; +BA_ "ContentDependant" SG_ 1441 TCCM_GWOnBoardTester 1; +BA_ "GenSigStartValue" SG_ 1441 TCCM_GWOnBoardTester 255; +BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_GWOnBoardTester 1; +BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_GWNMProxy 255; +BA_ "ContentDependant" SG_ 1441 TCCM_GWNMProxy 1; +BA_ "GenSigStartValue" SG_ 1441 TCCM_GWNMProxy 255; +BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_GWNMProxy 1; +BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMReserved4 255; +BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMReserved4 1; +BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMReserved4 255; +BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMReserved4 1; +BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMReserved3 255; +BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMReserved3 1; +BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMReserved3 255; +BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMReserved3 1; +BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMReserved2 255; +BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMReserved2 1; +BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMReserved2 255; +BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMReserved2 1; +BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMReserved1 255; +BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMReserved1 1; +BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMReserved1 255; +BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMReserved1 1; +BA_ "GenSigStartValueInteger" SG_ 1441 TCCM_AutoSarNMNodeId 161; +BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMNodeId 1; +BA_ "GenSigStartValue" SG_ 1441 TCCM_AutoSarNMNodeId 161; +BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMNodeId 1; +BA_ "ContentDependant" SG_ 1441 TCCM_AutoSarNMControl 1; +BA_ "U_P702_MY2021_Tx" SG_ 1441 TCCM_AutoSarNMControl 1; +BA_ "GenSigSendType" SG_ 1787 TesterPhysicalResSODCMD 3; +BA_ "GenSigSendType" SG_ 1779 TesterPhysicalReqSODCMD 3; +BA_ "GenSigSendType" SG_ 1786 TesterPhysicalResSODCMC 3; +BA_ "GenSigSendType" SG_ 1778 TesterPhysicalReqSODCMC 3; +BA_ "CrossOver_InfoCAN" SG_ 1153 TerrMde_D_RqDrv 1; +BA_ "UsedOnPgmDBC" SG_ 1153 TerrMde_D_RqDrv 1; +BA_ "GenSigSendType" SG_ 942 PrkAidRdiusRight_L_Dsply 3; +BA_ "GenSigSendType" SG_ 942 PrkAidRdiusLeft_L_Dsply 3; +BA_ "GenSigSendType" SG_ 942 PrkAidDrvDir_D_Stat 3; +BA_ "GenSigSendType" SG_ 942 PrkAidAcsyRear_D_Stat 3; +BA_ "GenSigSendType" SG_ 942 PrkAidAcsyFront_D_Stat 3; +BA_ "GenSigSendType" SG_ 930 BalrWndwRight_B_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 930 BalrSnsRight_D_Falt 0; +BA_ "GenSigSendType" SG_ 930 BalrSnsRight_D_Falt 3; +BA_ "GenSigStartValueInteger" SG_ 930 WndwPsngrRear_D_RqBalrr 0; +BA_ "GenSigSendType" SG_ 930 WndwPsngrRear_D_RqBalrr 3; +BA_ "GenSigStartValueInteger" SG_ 930 WndwPsngr_D_RqBalrr 0; +BA_ "GenSigSendType" SG_ 930 WndwPsngr_D_RqBalrr 3; +BA_ "GenSigStartValueInteger" SG_ 930 WndwDrvRear_D_RqBalrr 0; +BA_ "GenSigSendType" SG_ 930 WndwDrvRear_D_RqBalrr 3; +BA_ "GenSigStartValueInteger" SG_ 930 WndwDrv_D_RqBalrr 0; +BA_ "GenSigSendType" SG_ 930 WndwDrv_D_RqBalrr 3; +BA_ "GenSigStartValueInteger" SG_ 930 BalrRight_D_Stat 2; +BA_ "GenSigStartValue" SG_ 930 BalrRight_D_Stat 2; +BA_ "GenSigSendType" SG_ 930 BalrRight_D_Stat 3; +BA_ "GenSigSendType" SG_ 930 BalrMdeSelRight_B_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 930 BalrMdeRight_D_Stat 1; +BA_ "GenSigStartValue" SG_ 930 BalrMdeRight_D_Stat 1; +BA_ "GenSigSendType" SG_ 930 BalrMdeRight_D_Stat 3; +BA_ "GenSigSendType" SG_ 930 BalrLckRight_B_Stat 3; +BA_ "GenSigSendType" SG_ 930 BalrChimeRight_D_Rq 3; +BA_ "GenSigSendType" SG_ 930 CamraRearOn_B_RqBalrr 3; +BA_ "GenSigSendType" SG_ 930 DrLckCnt_No_ActlBalrr 3; +BA_ "GenSigSendType" SG_ 930 DrLckActv_B_RqBalrr 3; +BA_ "GenSigSendType" SG_ 929 BalrChimeLeft_D_Rq 3; +BA_ "GenSigStartValueInteger" SG_ 929 BalrLeft_D_Stat 2; +BA_ "GenSigStartValue" SG_ 929 BalrLeft_D_Stat 2; +BA_ "GenSigSendType" SG_ 929 BalrLeft_D_Stat 3; +BA_ "GenSigSendType" SG_ 929 BalrWndwLeft_B_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 929 WndwPsngrRear_D_RqBalrl 0; +BA_ "GenSigSendType" SG_ 929 WndwPsngrRear_D_RqBalrl 3; +BA_ "GenSigStartValueInteger" SG_ 929 WndwPsngr_D_RqBalrl 0; +BA_ "GenSigSendType" SG_ 929 WndwPsngr_D_RqBalrl 3; +BA_ "GenSigStartValueInteger" SG_ 929 WndwDrvRear_D_RqBalrl 0; +BA_ "GenSigSendType" SG_ 929 WndwDrvRear_D_RqBalrl 3; +BA_ "GenSigStartValueInteger" SG_ 929 WndwDrv_D_RqBalrl 0; +BA_ "GenSigSendType" SG_ 929 WndwDrv_D_RqBalrl 3; +BA_ "GenSigStartValueInteger" SG_ 929 BalrSnsLeft_D_Falt 0; +BA_ "GenSigSendType" SG_ 929 BalrSnsLeft_D_Falt 3; +BA_ "GenSigSendType" SG_ 929 BalrMdeSelLeft_B_Stat 3; +BA_ "GenSigStartValueInteger" SG_ 929 BalrMdeLeft_D_Stat 1; +BA_ "GenSigStartValue" SG_ 929 BalrMdeLeft_D_Stat 1; +BA_ "GenSigSendType" SG_ 929 BalrMdeLeft_D_Stat 3; +BA_ "GenSigSendType" SG_ 929 BalrLckLeft_B_Stat 3; +BA_ "GenSigSendType" SG_ 929 CamraRearOn_B_RqBalrl 3; +BA_ "GenSigSendType" SG_ 929 DrLckCnt_No_ActlBalrl 3; +BA_ "GenSigSendType" SG_ 929 DrLckActv_B_RqBalrl 3; +BA_ "CrossOver_InfoCAN" SG_ 402 ApaMdeStat_D_RqDrv 1; +BA_ "CrossOver_InfoCAN" SG_ 402 CamraZoomMan_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 402 CamraOvrlStat_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 402 CamraOvrlDyn_D_Rq 1; +BA_ "CrossOver_InfoCAN" SG_ 402 CamAutoTowbarZoom 1; +BA_ "CrossOver_InfoCAN" SG_ 402 DistanceBarSetting 1; +BA_ "GenSigStartValue" SG_ 924 DcacOut_Pw_Mx 2046; +BA_ "U_P702_MY2021_Rx" SG_ 924 DcacOut_Pw_Mx 1; +BA_ "GenSigStartValue" SG_ 924 DcacOut2_Pw_Actl 8190; +BA_ "U_P702_MY2021_Rx" SG_ 924 DcacOut2_Pw_Actl 1; +BA_ "GenSigStartValue" SG_ 924 DcacOut1_Pw_Actl 8190; +BA_ "U_P702_MY2021_Rx" SG_ 924 DcacOut1_Pw_Actl 1; +BA_ "GenSigStartValue" SG_ 924 DcacIn_Pw_Mx 2046; +BA_ "U_P702_MY2021_Rx" SG_ 924 DcacIn_Pw_Mx 1; +BA_ "GenSigStartValue" SG_ 923 DcacIn_U2_Actl 4094; +BA_ "GenSigStartValue" SG_ 923 DcacIn_U_Actl 4094; +BA_ "U_P702_MY2021_Rx" SG_ 923 DcacIn_U_Actl 1; +BA_ "GenSigStartValue" SG_ 923 DcacIn_I_Actl 2046; +BA_ "U_P702_MY2021_Rx" SG_ 923 DcacIn_I_Actl 1; +BA_ "GenSigStartValue" SG_ 923 Dcac_Te_Actl 254; +BA_ "U_P702_MY2021_Rx" SG_ 923 Dcac_Te_Actl 1; +BA_ "GenSigSendType" SG_ 1998 TesterPhysicalResSODR 3; +BA_ "GenSigSendType" SG_ 1996 TesterPhysicalResSODL 3; +BA_ "GenSigSendType" SG_ 1988 TesterPhysicalReqSODL 3; +BA_ "U_P702_MY2021_Rx" SG_ 922 DcacRdy_D_Stat 1; +BA_ "GenSigStartValue" SG_ 922 DcacPlugPrsnt_B_Stat 1; +BA_ "U_P702_MY2021_Rx" SG_ 922 DcacPlugPrsnt_B_Stat 1; +VAL_ 823 DteAcceptNew_B_Rq 1 "Yes" 0 "No"; +VAL_ 824 DteCldTrlrOn_B_Stat 1 "Yes" 0 "No"; +VAL_ 824 DteCldTrlrOff_B_Stat 1 "Yes" 0 "No"; +VAL_ 824 DteCldTraffic_B_Stat 1 "Yes" 0 "No"; +VAL_ 824 DteCldTerrain_B_Stat 1 "Yes" 0 "No"; +VAL_ 824 DteCldRoute_B_Stat 1 "Yes" 0 "No"; +VAL_ 824 DteCldPayload_B_Stat 1 "Yes" 0 "No"; +VAL_ 824 DteCldExtTe_B_Stat 1 "Yes" 0 "No"; +VAL_ 824 DteCldDcac_B_Stat 1 "Yes" 0 "No"; +VAL_ 949 Tire_Press_RR_ORR_Data 65535 "Not_Supported" 65534 "Invalid" 65533 "Unknown"; +VAL_ 949 Tire_Press_LR_OLR_Data 65535 "Not_Supported" 65534 "Invalid" 65533 "Unknown"; +VAL_ 949 Tire_Press_LF_Data 65535 "Not_Supported" 65534 "Invalid" 65533 "Unknown"; +VAL_ 949 Tire_Press_RF_Data 65535 "Not_Supported" 65534 "Invalid" 65533 "Unknown"; +VAL_ 740 BattAuxCnnct_B_Cmd 1 "Close" 0 "Open"; +VAL_ 1160 DgtlCommPncReset_B_Req 1 "Yes" 0 "No"; +VAL_ 1160 DataMntrSustn_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 1160 PwSustnRdata_B_RqTelem 1 "Active" 0 "Inactive"; +VAL_ 776 ScChrgrPwMax_Pw_RqCld 4095 "Faulty"; +VAL_ 776 PrcondEdit_D_RqCld 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "High" 3 "Medium" 2 "Low" 1 "Off" 0 "Null"; +VAL_ 776 GoTEditMnte_T_RqCld 15 "Faulty" 14 "NoDataExists" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0"; +VAL_ 776 GoTEditHr_T_RqCld 31 "Faulty" 30 "NoDataExists"; +VAL_ 776 ChrgToPcEdit_Pc_RqCld 127 "Faulty" 126 "NoDataExists"; +VAL_ 776 ScFreshDataEnbl_B_Rq 1 "Yes" 0 "No"; +VAL_ 776 ScEnbl_D_RqCld 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 775 ScDayOfWeekId_D_RqCld 7 "Sunday" 6 "Saturday" 5 "Friday" 4 "Thursday" 3 "Wednesday" 2 "Tuesday" 1 "Monday" 0 "NotUsed"; +VAL_ 775 ScChrgDurSet_D_RqCld 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 775 ScChrgDur_T_RqCld 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 774 ScLocLongPostv_B_RqCld 1 "Yes" 0 "No"; +VAL_ 774 ScLocLattPostv_B_RqCld 1 "Yes" 0 "No"; +VAL_ 774 ScLocDelete_B_RqCld 1 "Request" 0 "NoRequest"; +VAL_ 811 DistToStopover_L_Actl 65535 "Faulty"; +VAL_ 811 ExtLghtDsply_D_Stat 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 811 ExtLghtRight_D_RqMnu 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 811 AutoLghtOvrrd_B_RqDrv 1 "Allowed" 0 "NotAllowed"; +VAL_ 811 ExtLghtRear_D_RqMnu 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 811 ExtLghtLeft_D_RqMnu 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 811 ExtLghtFront_D_RqMnu 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 811 GoTEditMnte_T_RqMnu 15 "Faulty" 14 "NoDataExists" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0"; +VAL_ 811 GoTEditHr_T_RqMnu 31 "Faulty" 30 "NoDataExists"; +VAL_ 850 VehElRngeNut_L_Dsply 4095 "Faulty" 4094 "NoDataExists"; +VAL_ 850 NxtUsgSocEst_Pc_Dsply 255 "Faulty" 254 "NoDataExists"; +VAL_ 850 EstmChrgTimeLP_St 255 "Invalid"; +VAL_ 850 EstmChrgTimeHP_St 255 "Invalid"; +VAL_ 850 ChargeNowDuration_St 255 "Invalid"; +VAL_ 563 DrvBhavWarn_B_Rq 1 "On" 0 "Off"; +VAL_ 563 OfbChrgSetSync_D_Rq 3 "Fail" 2 "Success" 1 "InProgress" 0 "NoSyncInProgress"; +VAL_ 563 KeyOffPwMde_D_Stat 7 "NotUsed_6" 6 "NotUsed_5" 5 "NotUsed_4" 4 "NotUsed_3" 0 "Inactive" 1 "On" 2 "NotUsed_1" 3 "NotUsed_2"; +VAL_ 563 ModemReset_D_Stat 15 "NotUsed_10" 14 "NotUsed_9" 13 "NotUsed_8" 12 "NotUsed_7" 11 "NotUsed_6" 10 "NotUsed_5" 9 "NotUsed_4" 8 "NotUsed_3" 7 "NotUsed_2" 6 "NotUsed_1" 5 "WifiHotSpotResetComplete" 4 "CcsResetComplete" 3 "OnlineTrafficResetComplete" 2 "PaakResetComplete" 1 "ResetNotComplete" 0 "Null"; +VAL_ 563 FactoryReset_St 3 "NotUsed_2" 2 "NotUsed_1" 1 "FactoryDefaultsRestored" 0 "Null"; +VAL_ 570 SuspClkSync_No_Rq 255 "Faulty" 254 "NoDataExists"; +VAL_ 570 SuspRearRight_L_Actl 511 "Faulty"; +VAL_ 570 SuspFrntRight_L_Actl 511 "Faulty"; +VAL_ 570 SuspRear_L_Prev 511 "Fault"; +VAL_ 570 SuspRear_L_Actl 511 "Fault"; +VAL_ 570 SuspFrnt_L_Prev 511 "Fault"; +VAL_ 570 SuspFrnt_L_Actl 511 "Fault"; +VAL_ 837 Ccd_B_Falt 1 "Yes" 0 "No"; +VAL_ 837 SelDrvMdeSusp_D_Stat 3 "Faulty" 2 "TemporarilyNotAvailable" 1 "Available" 0 "NotAvailable"; +VAL_ 837 AdptDrvMdePt_D_Rq 7 "Faulty" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Powertrain2Sport" 2 "Powertrain2Normal" 1 "Powertrain2Comfort" 0 "AdaptiveNotActive"; +VAL_ 837 AdptDrvMdeChassis_D_Rq 7 "Faulty" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "Chassis2Sport" 2 "Chassis2Normal" 1 "Chassis2Comfort" 0 "AdaptiveNotActive"; +VAL_ 837 CcdMsgTxt_D_RqDsply 15 "Unused8" 14 "Unused7" 13 "Unused6" 12 "Unused5" 11 "Unused4" 10 "Unused3" 9 "Unused2" 8 "StationaryMode" 7 "Mode_Change_Unavailable" 6 "CCD_Temporarily_Off" 5 "CCD_Service_Required" 4 "Faulty" 3 "Sport" 2 "Normal" 1 "Comfort" 0 "No_Mode_Selected"; +VAL_ 885 BattULoChrg_D_RqOta 1 "Yes" 0 "No"; +VAL_ 885 VehStrtInhbt_T_Dsply 15 "NotUsed_12" 14 "NotUsed_11" 13 "NotUsed_10" 12 "NotUsed_9" 11 "NotUsed_8" 10 "NotUsed_7" 9 "NotUsed_6" 8 "NotUsed_5" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "PostOtaActivatePermFail" 2 "PostOtaActivateWarning" 1 "DuringOtaActivate" 0 "NoMessage"; +VAL_ 885 VehStrtInhbt_D_Dsply 15 "NotUsed_12" 14 "NotUsed_11" 13 "NotUsed_10" 12 "NotUsed_9" 11 "NotUsed_8" 10 "NotUsed_7" 9 "NotUsed_6" 8 "NotUsed_5" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "PostOtaActivatePermFail" 2 "PostOtaActivateWarning" 1 "DuringOtaActivate" 0 "NoMessage"; +VAL_ 885 VehOnRqstr_D_Stat 11 "NotUsed_8" 10 "NotUsed_7" 9 "NotUsed_6" 8 "NotUsed_5" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "FleetVehInhbt" 2 "StolenVehInhbt" 1 "OverTheAir" 0 "NoRequestor" 15 "NotUsed_12" 14 "NotUsed_11" 13 "NotUsed_10" 12 "NotUsed_9"; +VAL_ 885 VehStrtInhbt_D_RqCld 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 885 VehOn_D_RqCld 3 "NoControl" 2 "On" 1 "Off" 0 "Null"; +VAL_ 885 OtaActv_D_Stat 15 "NotUsed_10" 14 "NotUsed_9" 13 "NotUsed_8" 12 "NotUsed_7" 11 "NotUsed_6" 10 "NotUsed_5" 9 "NotUsed_4" 8 "NotUsed_3" 7 "NotUsed_2" 6 "NotUsed_1" 5 "NonInterruptible_Pending" 4 "NonInterruptible_Config" 3 "NonInterruptible_ER" 2 "NonInterruptible_AB" 1 "Interruptible_AB" 0 "NoInVehicleOta"; +VAL_ 810 OBCCSerial_D_Rq 3 "PresentAndProvisioned" 2 "PresentAndProvAlertAck" 1 "PresentAndUnprovisioned" 0 "NotPresent"; +VAL_ 810 TlghtTest_D_RqArb 3 "TestEndAcknowledge" 2 "StartTest" 1 "StopTest" 0 "Null"; +VAL_ 810 ChrgrPncSustn_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 810 NtfyDrvTrgtDist_L_Rq 4095 "Trip_dist_alert_disabled" 0 "Inactive"; +VAL_ 810 NtfyDrvSocLvl1_Pc_Rq 127 "TargetSOCNotificationAlert" 0 "Inactive"; +VAL_ 810 PtRmtRprt_D_Stat 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "SettingUpdated" 10 "FastChargeComplete" 9 "ChargeNotOccurring" 8 "OneTimeSocReached" 7 "BatteryTemperatureRemind" 6 "ReducedPerformance" 5 "LimitedPerformance" 4 "ChargeFault" 3 "ChargeComplete" 2 "VehiclePreconditioned" 1 "TripDistanceAchieved" 0 "NoReportRequest"; +VAL_ 810 ChrgrPncEnbl_D_Rq 3 "NotUsed" 2 "Enable" 1 "Disable" 0 "Null"; +VAL_ 810 ExtLghtDsply_B_StatArb 1 "On" 0 "Off"; +VAL_ 810 ExtLghtRight_D_RqOta 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 810 ExtLghtRear_D_RqOta 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 810 ExtLghtLeft_D_RqOta 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 810 ExtLghtFront_D_RqOta 7 "NotUsed" 6 "PressToOn3" 5 "PressToOff3" 4 "PressToOn2" 3 "PressToOff2" 2 "PressToOn1" 1 "PressToOff1" 0 "Reset"; +VAL_ 550 PtWakeupActv1_B_Rq 1 "Wake_up_Powertrain_via_HW" 0 "Don_t_Wake_Up_Powertrain"; +VAL_ 639 OfbChrgPrflUpdate_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 639 OfbChrgClearAll_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 639 OfbChrgGoTTouch_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 639 OfbChrgGoTPrcond_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 639 OfbChrgGoTOn_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 639 OfbChrgGoTMnte_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0"; +VAL_ 639 OfbChrgGoTHr_T_Rq 31 "Faulty" 30 "NoDataExists"; +VAL_ 639 OfbChrgGoTExtHtr_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 639 OfbChrgGoTDelete_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 639 OfbChrgGoTUpdate_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 530 OfbChrgToPcWknd_D_Actl 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100"; +VAL_ 530 OfbChrgToPcWkdy_D_Actl 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100"; +VAL_ 530 OfbChrgSetNow_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 530 OfbChrgSetDelete_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 530 OfbChrgLocIdUns_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 1142 ConsTipV_No_Dsply 1023 "Faulty" 1022 "NoDataExists"; +VAL_ 817 ChildLckMde_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 817 VehLckInd_D_Rq 3 "NotUsed" 2 "On_Day" 1 "On_Night" 0 "Off"; +VAL_ 817 DrTgateOpen_B_Rq 1 "Open" 0 "Null"; +VAL_ 817 DrTgateExtSwMde_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 817 Remote_Device_Feedback 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "Shutdown" 3 "Running" 2 "Starting" 1 "Acknowledge" 0 "Null"; +VAL_ 817 Veh_Lock_Requestor 31 "Unused8" 30 "Unused7" 29 "Unused6" 28 "Rgtm_Shutlock_Switch" 27 "Boundary_Alert" 26 "Transit_Vehicle_Relock" 25 "Transit_Cargo_Relock" 24 "Transit_Ajar_Lock" 23 "Diagnostics" 22 "Console_Lock" 21 "Child_Lock" 20 "Double_Lock" 19 "Passive_Pasenger" 18 "Passive_Driver" 17 "Slam_Lock_Protect" 16 "SYNC" 15 "Passport" 14 "Passive_Smart_Unlock" 13 "Autorelock" 12 "RemoteStart" 0 "Null" 1 "Autolock" 11 "Smart_Unlock" 10 "Sliding_Door" 9 "Passive" 8 "Remote" 7 "Programming" 6 "Powerslide" 5 "Keypad" 4 "Key_Cylinder" 3 "Interior" 2 "Auto_Unlock"; +VAL_ 817 R_Pwr_Sliding_Dr_Rqst 1 "Active" 0 "Null"; +VAL_ 817 Power_Liftgate_Rqst 1 "Active" 0 "Null"; +VAL_ 817 Power_Decklid_Rqst 1 "Active" 0 "Null"; +VAL_ 817 L_Pwr_Sliding_Dr_Rqst 1 "Active" 0 "Null"; +VAL_ 817 Veh_Lock_Sub_Id 15 "Unused7" 14 "Unused6" 13 "Unused5" 12 "Unused4" 11 "Unused3" 10 "Unused2" 9 "Unused1" 8 "Customer_8" 7 "Customer_7" 6 "Customer_6" 5 "Customer_5" 4 "Customer_4" 3 "Customer_3" 2 "Customer_2" 1 "Customer_1" 0 "Null"; +VAL_ 817 Veh_Lock_Status 3 "UNLOCK_DRV" 2 "UNLOCK_ALL" 1 "LOCK_ALL" 0 "LOCK_DBL"; +VAL_ 817 ChildLck_D_Dsply 3 "NOT_SUPPORTED" 2 "ERROR" 1 "CHILD_UNLOCK" 0 "CHILD_LOCK"; +VAL_ 817 WindowLockout_B_Stat 1 "Locked" 0 "Unlock"; +VAL_ 817 Lockmsgtxt_D_Rq 7 "MSG7" 6 "MSG6" 5 "MSG5" 4 "MSG4" 3 "MSG3" 2 "MSG2" 1 "MSG1" 0 "NO_WARNING"; +VAL_ 817 FobComm_D_Stat 3 "NotUsed" 2 "RemEngStartOK" 1 "RemEngStartFail" 0 "Null"; +VAL_ 817 LockInhibit 1 "Inhibit" 0 "No_Inhibit"; +VAL_ 879 WndwRearHeat_I_Actl 2047 "Faulty"; +VAL_ 879 WndwRearHeat_D_Stat 7 "NotUsed" 6 "FetLiftLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad"; +VAL_ 878 DcacGfciTest_B_Rq 1 "Pressed" 0 "Not_Pressed"; +VAL_ 878 DcacOut_Pw_DsplyMx 1023 "Faulty"; +VAL_ 878 DcacOut1_Pw_Dsply 63 "Faulty"; +VAL_ 878 DcacOut2_Pw_Dsply 63 "Faulty"; +VAL_ 878 DcacHw_D_Confg 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Power_2300W" 3 "Power_7200W" 2 "Power_2400W" 1 "Power_2000W" 0 "NoDcacHardware"; +VAL_ 878 DcacFaltMsgTxt_D_Rq 15 "NotUsed" 14 "OvercurrentLP" 13 "EngineRun" 12 "Service" 11 "NotAvailable" 10 "PlugWarn" 9 "PlugWarnDrive" 8 "BreakerC" 7 "BreakerB" 6 "BreakerA" 5 "FuelLow" 4 "AcOnOutput" 3 "Temperature" 2 "Gfci" 1 "Overcurrent" 0 "Ok"; +VAL_ 878 DcacLoFuelMsgTxt_D_Rq 31 "Minute_31" 30 "Minute_30" 29 "Minute_29" 28 "Minute_28" 27 "Minute_27" 26 "Minute_26" 25 "Minute_25" 24 "Minute_24" 23 "Minute_23" 22 "Minute_22" 21 "Minute_21" 20 "Minute_20" 19 "Minute_19" 18 "Minute_18" 17 "Minute_17" 16 "Minute_16" 15 "Minute_15" 14 "Minute_14" 13 "Minute_13" 12 "Minute_12" 11 "Minute_11" 10 "Minute_10" 9 "Minute_9" 8 "Minute_8" 7 "Minute_7" 6 "Minute_6" 5 "Minute_5" 4 "Minute_4" 3 "Minute_3" 2 "Minute_2" 1 "Minute_1" 0 "Ok"; +VAL_ 878 DcacEngOnMsgTxt_D_Rq 3 "NotUsed" 2 "DisplayQuestion" 1 "DisplayWarning" 0 "Ok"; +VAL_ 878 DcacElPw_D_Stat 3 "NotUsed" 2 "High" 1 "Low" 0 "Off"; +VAL_ 878 PwBedPnlEnbl_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 878 DcacOn_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 878 DcacSys_B_Falt 1 "Yes" 0 "No"; +VAL_ 878 DcacLedCtl_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off"; +VAL_ 395 SelDrvMdeCnfm_D_Stat 3 "NotUsed" 2 "Accepted" 1 "NotAccepted" 0 "Null"; +VAL_ 984 PersIndexIpma_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_ 984 AhbcRampingV_D_Rq 3 "Slow" 2 "Medium" 1 "Fast" 0 "Immediately"; +VAL_ 984 LaActvStats_D_Dsply 31 "Unused7" 30 "LA_Off" 29 "Unused5" 28 "Unused4" 27 "Unused3" 26 "Unused2" 25 "Unused1" 24 "InerveneLeft_InterveneRght" 23 "WarnLeft_InterveneRight" 22 "SuppressLeft_InterveneRght" 21 "AvailLeft_InterveneRhtt" 20 "NoLeft_InterveneRight" 19 "InterveneLeft_WarnRight" 18 "WarnLeft_WarnRight" 17 "SuppressLeft_WarnRight" 16 "AvailableLeft_WarnRight" 15 "NoLeft_WarnRight" 14 "InterveneLeft_SuppressRght" 13 "WarnLeft_SuppressRight" 12 "SuppressLeft_SuppressRight" 11 "AvailLeft_SuppressRight" 10 "NoLeft_SuppressRight" 9 "InterveneLeft_AvailRight" 8 "WarnLeft_AvailRight" 7 "SuppressLeft_AvailRight" 6 "AvailableLeft_AvailRight" 5 "NoLeft_AvailableRight" 4 "InterveneLeft_NoRight" 3 "WarnLeft_NoRight" 2 "SuppressLeft_NoRight" 1 "AvailableLeft_NoRight" 0 "NoLeft_NoRight"; +VAL_ 984 LaDenyStats_B_Dsply 1 "Unavailable" 0 "Available"; +VAL_ 984 LaHandsOff_D_Dsply 3 "Suppressed" 2 "Level2" 1 "Level1" 0 "HandsOn"; +VAL_ 984 CamraDefog_B_Req 1 "On" 0 "Off"; +VAL_ 984 CamraStats_D_Dsply 3 "FrtCam_TempUnavailOther" 2 "FrtCam_TempUnavailVisibile" 1 "Front_Camera_Service_Reqd" 0 "Front_Camera_OK"; +VAL_ 984 DasAlrtLvl_D_Dsply 5 "Alertness_Level_5" 4 "Alertness_Level_4" 3 "Alertness_Level_3" 2 "Alertness_Level_2" 1 "Alertness_Level_1" 0 "Undefined"; +VAL_ 984 DasStats_D_Dsply 3 "Available" 2 "Unavailable_Other" 1 "Feedback_due_to_Speed" 0 "Off"; +VAL_ 984 DasWarn_D_Dsply 3 "Undefined" 2 "Warning_Level_2" 1 "Warning_Level_1" 0 "No_Warning"; +VAL_ 984 AhbHiBeam_D_Rq 3 "NotUsed" 2 "HighBeamRecommended" 1 "LowBeamRecommended" 0 "DeactivatedUnavailable"; +VAL_ 985 LdwChime_B_Rq 1 "On" 0 "Off"; +VAL_ 985 TsrRegionTxt_D_Stat 31 "Faulty" 30 "NotUsed_8" 29 "NotUsed_7" 28 "NotUsed_6" 27 "NotUsed_5" 26 "NotUsed_4" 25 "NotUsed_3" 24 "NotUsed_2" 23 "NotUsed_1" 22 "Region_22" 21 "Region_21" 20 "Region_20" 19 "Region_19" 18 "Region_18" 17 "Region_17" 16 "Region_16" 15 "Region_15" 14 "Region_14" 13 "Region_13" 12 "Region_12" 11 "Region_11" 10 "Region_10" 9 "Region_09" 8 "Region_08" 7 "Region_07" 6 "Region_06" 5 "Region_05" 4 "Region_04" 3 "Region_03" 2 "Region_02" 1 "Region_01" 0 "NotDetermined"; +VAL_ 985 SblmPedCrossScnr_B_Stat 1 "Yes" 0 "No"; +VAL_ 985 LongCtrlEnbl_D_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "RemoteParking" 2 "Autohitch" 1 "AutomaticParking" 0 "None"; +VAL_ 985 SblmRndAbtScnr_B_Stat 1 "Yes" 0 "No"; +VAL_ 985 DasAlrtInfo_D_Dsply 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 985 IaccVLim_D_Rq 252 "NotUsed_2" 250 "LimitSpeed_250" 240 "LimitSpeed_240" 230 "LimitSpeed_230" 220 "LimitSpeed_220" 210 "LimitSpeed_210" 200 "LimitSpeed_200" 190 "LimitSpeed_190" 150 "LimitSpeed_150" 140 "LimitSpeed_140" 130 "LimitSpeed_130" 120 "LimitSpeed_120" 110 "LimitSpeed_110" 100 "LimitSpeed_100" 90 "LimitSpeed_90" 80 "LimitSpeed_80" 70 "LimitSpeed_70" 60 "LimitSpeed_60" 50 "LimitSpeed_50" 40 "LimitSpeed_40" 30 "LimitSpeed_30" 20 "LimtSpeed_20" 251 "NotUsed_1" 255 "Faulty" 254 "NoDataExists" 253 "NotUsed_3" 180 "LimitSpeed_180" 179 "LimitSpeed_179" 178 "LimitSpeed_178" 177 "LimitSpeed_177" 176 "LimitSpeed_176" 175 "LimitSpeed_175" 174 "LimitSpeed_174" 173 "LimitSpeed_173" 172 "LimitSpeed_172" 171 "LimitSpeed_171" 170 "LimitSpeed_170" 169 "LimitSpeed_169" 168 "LimitSpeed_168" 167 "LimitSpeed_167" 166 "LimitSpeed_166" 165 "LimitSpeed_165" 164 "LimitSpeed_164" 163 "LimitSpeed_163" 162 "LimitSpeed_162" 161 "LimitSpeed_161" 160 "LimitSpeed_160" 15 "LimitSpeed_15" 14 "LimitSpeed_14" 13 "LimitSpeed_13" 12 "LimitSpeed_12" 11 "LimitSpeed_11" 10 "LimitSpeed_10" 9 "LimitSpeed_9" 8 "LimitSpeed_8" 7 "LimitSpeed_7" 6 "LimitSpeed_6" 5 "LimitSpeed_5" 4 "LimitSpeed_4" 3 "LimitSpeed_3" 2 "LimitSpeed_2" 1 "LimitSpeed_1" 0 "LimitSpeed_0"; +VAL_ 985 IaccVLimUnit_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null"; +VAL_ 985 IsaVLim_D_Rq 252 "NotUsed_2" 250 "LimitSpeed_250" 240 "LimitSpeed_240" 230 "LimitSpeed_230" 220 "LimitSpeed_220" 210 "LimitSpeed_210" 200 "LimitSpeed_200" 190 "LimitSpeed_190" 150 "LimitSpeed_150" 140 "LimitSpeed_140" 130 "LimitSpeed_130" 120 "LimitSpeed_120" 110 "LimitSpeed_110" 100 "LimitSpeed_100" 90 "LimitSpeed_90" 80 "LimitSpeed_80" 70 "LimitSpeed_70" 60 "LimitSpeed_60" 50 "LimitSpeed_50" 40 "LimitSpeed_40" 30 "LimitSpeed_30" 20 "LimtSpeed_20" 251 "NotUsed_1" 255 "Faulty" 254 "NoDataExists" 253 "NotUsed_3" 180 "LimitSpeed_180" 179 "LimitSpeed_179" 178 "LimitSpeed_178" 177 "LimitSpeed_177" 176 "LimitSpeed_176" 175 "LimitSpeed_175" 174 "LimitSpeed_174" 173 "LimitSpeed_173" 172 "LimitSpeed_172" 171 "LimitSpeed_171" 170 "LimitSpeed_170" 169 "LimitSpeed_169" 168 "LimitSpeed_168" 167 "LimitSpeed_167" 166 "LimitSpeed_166" 165 "LimitSpeed_165" 164 "LimitSpeed_164" 163 "LimitSpeed_163" 162 "LimitSpeed_162" 161 "LimitSpeed_161" 160 "LimitSpeed_160" 15 "LimitSpeed_15" 14 "LimitSpeed_14" 13 "LimitSpeed_13" 12 "LimitSpeed_12" 11 "LimitSpeed_11" 10 "LimitSpeed_10" 9 "LimitSpeed_9" 8 "LimitSpeed_8" 7 "LimitSpeed_7" 6 "LimitSpeed_6" 5 "LimitSpeed_5" 4 "LimitSpeed_4" 3 "LimitSpeed_3" 2 "LimitSpeed_2" 1 "LimitSpeed_1" 0 "LimitSpeed_0"; +VAL_ 985 SblmStopScnr_B_Stat 1 "Yes" 0 "No"; +VAL_ 985 SblmYieldScnr_B_Stat 1 "Yes" 0 "No"; +VAL_ 985 IsaVLimUnit_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null"; +VAL_ 985 AdbDividedRoad_B_Stat 1 "Yes" 0 "No"; +VAL_ 985 LcwaMsgTxt_D_Stat 3 "SodXFaulty" 2 "SodXBlocked" 1 "TrailerConnected" 0 "NoMessage"; +VAL_ 985 AdbDrvSide_B_Stat 1 "Left_Hand_Traffic" 0 "Right_Hand_Traffic"; +VAL_ 992 MsgCntrDsplyOp_D_Rq 7 "Unused_2" 6 "Unused_1" 5 "Copy" 4 "Restore" 3 "Upload" 2 "Set" 1 "Query" 0 "Null"; +VAL_ 992 MsgCntrPersIndex_D_Rq 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_ 943 VehVActlAdas_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 943 AdasLcDistToObj_L_Actl 4095 "Faulty" 4094 "NoDataExists"; +VAL_ 515 PtIgnSwtch_D_Stat 3 "Faulty" 2 "No_Data_Exists" 1 "On" 0 "Off"; +VAL_ 1111 TrlrYawWActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 1111 TrlrYaw_W_Actl 65535 "Faulty" 65534 "NoDataExists"; +VAL_ 1111 TrlrHitYaw_AnRate_Actl 4095 "Fault" 4094 "NoDataExists"; +VAL_ 1111 TrlrHitchYaw_D_Stat 15 "Faulty" 14 "NotUsed_4" 13 "NotUsed_3" 12 "NotUsed_2" 11 "NotUsed_1" 10 "FaultyYrsuConnection" 9 "FaultyYrsu" 8 "HiConfdLrndAngle" 7 "LowConfdLrndAngle" 6 "HiConfdAngleMem" 5 "LowConfdAngleMem" 4 "InitNoTadAngle" 3 "InitInputs" 2 "TadTrlrDataOutOfRange" 1 "TadNotWithinSpecification" 0 "NoConnectionWithYrsu"; +VAL_ 1111 TrlrHitchYaw_An_Actl 4095 "Faulty" 4094 "NoDataExists"; +VAL_ 1106 TrlrSnsId_No_Actl -1 "Faulty_FFFFFFFFFFFF" -2 "NoDataExists_FFFFFFFFFFFE"; +VAL_ 982 LatCtl_D2_Rq 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "SafeRampOut" 2 "PathFollowingExtendedMode" 1 "PathFollowingLimitedMode" 0 "NoLateralControl"; +VAL_ 982 HandsOffCnfm_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 982 LatCtlRampType_D_Rq 3 "Immediately" 2 "Fast" 1 "Medium" 0 "Slow"; +VAL_ 982 LatCtlPrecision_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "Precise" 0 "Comfortable"; +VAL_ 1104 DrvEngageLevel_D_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Disengaged" 3 "Distracted" 2 "Attentive" 1 "Invalid" 0 "NotDetermined"; +VAL_ 1104 DrvImpLvlConfid_D_Stat 7 "Faulty" 6 "NotUsed" 5 "High" 4 "MediumHigh" 3 "Medium" 2 "LowMedium" 1 "Low" 0 "NotDetermined"; +VAL_ 1104 DrvImpairLvl_D_Stat 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "Incapacitated" 8 "Asleep" 7 "Microsleep" 6 "MostDrowsy" 5 "Drowsy_4" 4 "Drowsy_3" 3 "Drowsy_2" 2 "LeastDrowsy" 1 "Alert" 0 "NotDetermined"; +VAL_ 1104 DrvEngLvlConfid_D_Stat 7 "Faulty" 6 "NotUsed" 5 "High" 4 "MediumHigh" 3 "Medium" 2 "LowMedium" 1 "Low" 0 "NotDetermined"; +VAL_ 1104 DrvCamPassIR_D_Stat 3 "Faulty" 2 "Blocked" 1 "Ok" 0 "TemporaryUnavailable"; +VAL_ 1104 DrvCamera_D_Stat 3 "Faulty" 2 "Blocked" 1 "Ok" 0 "TemporaryUnavailable"; +VAL_ 1104 DrvCamDrvIR_D_Stat 3 "Faulty" 2 "Blocked" 1 "Ok" 0 "TemporaryUnavailable"; +VAL_ 1104 DrvAttentZone_D_Stat 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "PassengerSideWindow" 8 "DriverSideWindow" 7 "DriverSideMirror" 6 "RearviewMirror" 5 "PassengerSideMirror" 4 "Infotainment" 3 "Cluster" 2 "FrontWindshield" 1 "Other" 0 "NotDetermined"; +VAL_ 1104 DrvAlertSt_D_Stat 3 "Faulty" 2 "EyesOffRoad" 1 "EyesOnRoad" 0 "NotDetermined"; +VAL_ 1114 TrailCtlSwtch_B_Stat2 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1114 TrlBrkInitOut_D_Rq 3 "Heavy" 2 "Medium" 1 "Light" 0 "Null"; +VAL_ 1116 TrlrAidSetup_D2_Rq 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "CompleteSetup" 5 "ReturnToSetup" 4 "StickerNotCircled" 3 "ConfirmSetup" 2 "EndSetup" 1 "BeginSetup" 0 "Inactive"; +VAL_ 1116 TrlrAidEnbl_D2_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Deactivate" 2 "ActivateTrg" 1 "ActivateTba" 0 "Inactive"; +VAL_ 1116 TrlrRvrseCancl_B_Rq 1 "Cancel" 0 "Null"; +VAL_ 1116 TrlrIdType_D_Stat 3 "Gooseneck" 2 "FifthWheel" 1 "Conventional" 0 "Null"; +VAL_ 1116 TrlrAnOffstDir_D_Mem 3 "NotUSed" 2 "Right" 1 "Left_or_Center" 0 "Null"; +VAL_ 1085 ULoRgenTestMde_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 1085 PwSrcULoOvrTe_B_Actl 1 "Yes" 0 "No"; +VAL_ 1085 PwSrcULoFalt_D_Stat 3 "Fault_No_Output" 2 "Fault_Reduced_Output" 1 "Fault_NonSpecific" 0 "No_Fault"; +VAL_ 1085 PwSrcULoDcnnt_B_Stat 1 "Loose_or_Disconnected" 0 "Connected"; +VAL_ 1085 PwSrcULo_Pc_Mx 255 "Fault"; +VAL_ 1085 PwSrcULoComm_B_Falt 1 "Fault" 0 "No_Fault"; +VAL_ 1085 PwSrcULo_I_Mx 255 "Fault"; +VAL_ 1085 PwSrcULo_I_Actl 255 "Fault"; +VAL_ 981 AdbBrdrTop_An_Rq 255 "Faulty" 254 "NoDataExists"; +VAL_ 981 AdbBrdrRight_L_Stat 511 "Faulty" 510 "NoDataExists"; +VAL_ 981 AdbBrdrRight_An_Rq 1023 "Faulty" 1022 "NoDataExists"; +VAL_ 981 AdbBrdrLeft_L_Stat 511 "Faulty" 510 "NoDataExists"; +VAL_ 981 AdbBrdrLeft_An_Rq 1023 "Faulty" 1022 "NoDataExists"; +VAL_ 981 AdbBrdrBottom_An_Rq 63 "Faulty" 62 "NoDataExists"; +VAL_ 981 AdbBeam_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "FullHighBeam" 3 "Spot_BothSide" 2 "Spot_OnlyRightSide" 1 "Spot_OnlyLeftSide" 0 "NoHighBeam"; +VAL_ 791 EngAirFilt_B_RqReset 1 "Yes" 0 "No"; +VAL_ 791 GpsElMdeSel_B_Rq 1 "On" 0 "Off"; +VAL_ 791 LongTermReset_B_Rq 1 "On" 0 "Off"; +VAL_ 791 DrvEffLvl_No_Stat 63 "Fault" 62 "NoDataExists"; +VAL_ 868 BattRgenLoStat_D_Qlty 3 "OK" 2 "Not_Within_Spec" 1 "Eval_In_Progress" 0 "Faulty"; +VAL_ 868 BattRgenLoPrtct_B_Stat 1 "Yes" 0 "No"; +VAL_ 868 BattRgenLoDChrg_D_Stat 3 "StuckClosed" 2 "StuckOpen" 1 "Closed" 0 "Open"; +VAL_ 868 BattRgenLoDchrg_B_Rq 1 "Yes" 0 "No"; +VAL_ 868 BattRgenLoChrg_D_Stat 3 "StuckClosed" 2 "StuckOpen" 1 "Closed" 0 "Open"; +VAL_ 868 BattRgenLoChrg_B_Rq 1 "Yes" 0 "No"; +VAL_ 868 BattRgenLo_B_Falt 1 "Yes" 0 "No"; +VAL_ 867 BattRgenLoBalnc_B_Rq 1 "Yes" 0 "No"; +VAL_ 867 BattRgenLo_Te_Actl 255 "Fault"; +VAL_ 865 BattRgenLo_U_Actl 2047 "Faulty"; +VAL_ 865 BattRgenLo_I_Actl 65535 "Faulty"; +VAL_ 1144 WakeAlarm0_B_Typ 1 "CanAndEcuDriveCircuit" 0 "CanOnly"; +VAL_ 1144 PreCondBatt_B_Actl 1 "On" 0 "Off"; +VAL_ 1144 HtrnDcdcDis_B_Rq 1 "Yes" 0 "No"; +VAL_ 1144 ChrgNowEvnt_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 1144 CabinDrvSustn_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 1144 BattChrgTrgtSoC_D_Rq 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100"; +VAL_ 1144 CabnEvapSovFront_B_Rq 1 "On" 0 "Off"; +VAL_ 1144 HeatCoreSovRear_B_Rq 1 "On" 0 "Off"; +VAL_ 1144 BattChlrSov_B_Rq 1 "On" 0 "Off"; +VAL_ 1144 CabnEvapSovRear_B_Rq 1 "On" 0 "Off"; +VAL_ 1144 BrkAppl_D_RqPt 3 "BrakesSlowRelease" 2 "BrakesFastRelease" 1 "BrakesEngage" 0 "NotActive"; +VAL_ 1144 HtrnCnnctPwr_B_Stat 1 "Asserted" 0 "NotAsserted"; +VAL_ 1144 PtcHtr_D_Stat 3 "Faulty" 2 "NotUsed" 1 "On" 0 "Off"; +VAL_ 1144 HtrnClntFlw_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 1144 BattTracDrvSustn_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 1144 BattTracClntVlv_B_Rq 1 "On" 0 "Off"; +VAL_ 1141 OfbChrgSetSync_D_Stat 3 "Fail" 2 "Success" 1 "InProgress" 0 "NoSyncInProgress"; +VAL_ 1141 PtRmtRprt_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "PlugInToMaintain12vBattery" 11 "SettingUpdated" 10 "FastChargeComplete" 9 "ChargeNotOccurring" 8 "OneTimeSocReached" 7 "BatteryTemperatureReminder" 6 "ReducedPerformance" 5 "LimitedPerformance" 4 "ChargeFault" 3 "ChargeComplete" 2 "VehiclePreconditioned" 1 "TripDistanceAchieved" 0 "NoReportRequest"; +VAL_ 1141 NtfctnConflict1_D_Rq 7 "NotUsed5" 6 "NotUsed4" 5 "NotUsed3" 4 "NotUsed2" 3 "NotUsed1" 2 "Clonflict_Exists" 1 "No_Conflict" 0 "Invalid"; +VAL_ 1140 RgenEvntLvl_Pc_Dsply 1023 "Fault" 1022 "NoDataExists"; +VAL_ 1140 BrkEvntComplt_B_Dsply 1 "On" 0 "Off"; +VAL_ 1140 PreCondStat_D_Dsply 7 "Reserved3" 6 "Reserved2" 5 "Reserved1" 4 "Faulted" 3 "Complete" 2 "In_Progress" 1 "Scheduled" 0 "Not_Scheduled"; +VAL_ 1139 BattChrgTrgtLMax_T_Est 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 1139 ActChrgStrtYr_No_Actl 31 "Invalid"; +VAL_ 1139 ActChrgStrtMin_No_Actl 63 "Invalid" 62 "Unknown"; +VAL_ 1139 ActChrgStrtHr_No_Actl 31 "Invalid" 30 "Unknown"; +VAL_ 1139 ActChrgStrtDay_No_Actl 31 "Invalid"; +VAL_ 1139 ActChrgStrMnth_No_Actl 15 "Invalid"; +VAL_ 1138 BattChrgTrgtLMin_T_Est 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 1138 ActChrgEndYr_No_Actl 31 "Invalid"; +VAL_ 1138 ActChrgEndMnth_No_Actl 15 "Invalid"; +VAL_ 1138 ActChrgEndMin_No_Actl 63 "Invalid" 62 "Unknown"; +VAL_ 1138 ActChrgEndHr_No_Actl 31 "Invalid" 30 "Unknown"; +VAL_ 1138 ActChrgEndDay_No_Actl 31 "Invalid"; +VAL_ 1089 Mtr2Aout_W_ActlMntr 1023 "Faulty"; +VAL_ 1089 Inv1_Te_Actl 255 "Faulty" 254 "NoDataExists"; +VAL_ 1089 MtrTrac2Coil_Te_Actl 255 "Faulty" 254 "NoDataExists"; +VAL_ 1089 MtrTrac2Falt_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 1089 MtrTrac2TeAlrm_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 1089 Mtr2CntlTeAlrm_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 1089 MtrTrac2Inv_Te_Actl 255 "Faulty" 254 "NoDataExists"; +VAL_ 1089 MtrTrac2_I_Actl 65535 "Faulty"; +VAL_ 1088 ChrgTMatch_B_Stat 1 "True" 0 "False"; +VAL_ 1088 ChrgStat_D2_Dsply 15 "NotUsed_2" 14 "NotUsed_1" 13 "ChargeTargetReached" 12 "DriveConditioning" 11 "CabinPreconditioning" 10 "ChargingSystemMaintain" 9 "ChargingInductive" 8 "ChargingDCFastChange" 7 "ChargingAC" 6 "ChargeScheduled" 5 "EvsePaused" 4 "EvseNotDetected" 3 "EvseNotCompatible" 2 "FaultOutsideCar" 1 "FaultInsideCar" 0 "NotReady"; +VAL_ 1088 HvacPrecondRecirc_D_Rq 3 "Last_User_Setting" 2 "Auto" 1 "Recirc" 0 "Outside"; +VAL_ 1088 HvacPrecondMode2_D_Rq 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "Last_User_Settings" 10 "Auto" 9 "Max_Defrost" 8 "Windshield_Panel_Floor" 7 "Windshield_Panel" 6 "Windshield" 5 "Windshield_Floor" 4 "Floor" 3 "Panel_Floor" 2 "Panel" 1 "MAX_AC" 0 "Off"; +VAL_ 1088 HvacPrecondBlwr2_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Last_User_Setting" 8 "Auto" 7 "Speed7" 6 "Speed6" 5 "Speed5" 4 "Speed4" 3 "Speed3" 2 "Speed2" 1 "Speed1" 0 "Off"; +VAL_ 1088 HvacPrecondAC_D_Rq 3 "Last_User_Setting" 2 "Auto" 1 "On" 0 "Off"; +VAL_ 1088 BattChrgInhbt_D_Rq 3 "MaintainTargetSoc" 2 "NotUsed" 1 "InhibitChargingThermal" 0 "Enable_Charging"; +VAL_ 1040 ElCmprEnbl_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 1016 ChrgGoTElement_B_Dsply 1 "Yes" 0 "No"; +VAL_ 1016 ChrgGoTTouchEnbl_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 1016 ChrgGoTTouch_B_Stat 1 "On" 0 "Off"; +VAL_ 1016 ChrgGoTPrcond_D_Stat 3 "High" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 1016 ChrgGoTMnte_D_Stat 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0"; +VAL_ 1016 ChrgGoTHr_T_Stat 31 "Faulty" 30 "NoDataExists"; +VAL_ 1016 ChrgGoTExtHtrEnbl_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 1016 ChrgGoTExtHtr_B_Stat 1 "On" 0 "Off"; +VAL_ 1016 ChrgGoTAllOn_B_Stat 1 "On" 0 "Off"; +VAL_ 1013 ChrgToPcWkndSav_D_Stat 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100"; +VAL_ 1013 ChrgToPcWkdySav_D_Stat 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100"; +VAL_ 1013 ChrgNowEnbl_B_Saved 1 "On" 0 "Off"; +VAL_ 1013 ChrgLocIdUnsAck_B_Stat 1 "Yes" 0 "No"; +VAL_ 1012 ChrgNowCurnt_B_Dsply 1 "On" 0 "Off"; +VAL_ 1012 ChrgLocSaved_B_Dsply 1 "Yes" 0 "No"; +VAL_ 1012 ChrgLocLongPostv_B_Sav 1 "Yes" 0 "No"; +VAL_ 1012 ChrgLocLattPostv_B_Sav 1 "Yes" 0 "No"; +VAL_ 1011 ChrgLocLongPostv_B_Uns 1 "Yes" 0 "No"; +VAL_ 1011 ChrgLocLattPostv_B_Uns 1 "Yes" 0 "No"; +VAL_ 871 BattElecPerf_D_Actl 7 "NotUsed" 6 "Hot_Batt_Severe_Lim_Perf" 5 "Hot_Batt_Reduced_Perf" 4 "Hot_Batt_Close_to_lim_Per" 3 "Cold_Batt_Severe_Lim_Perf" 2 "Cold_Batt_Reduced_Perf" 1 "Cold_Batt_Close_to_lim_Pe" 0 "Ok_no_message_displayed"; +VAL_ 871 BattChrgTrgtLPt_T_Est 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 871 BattChrgTrgSocPt_T_Est 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 871 BattChrgCmpltPt_T_Est 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 786 RgenTrip_L_Dsply 65535 "Fault" 65534 "NoDataExists"; +VAL_ 786 ChrgStat_D_Dsply 7 "NotUsed" 6 "Complete" 5 "Scheduled" 4 "In_Progress" 3 "Fault_Outside_Car" 2 "Fault_Inside_Car" 1 "Fault_Unknown_Location" 0 "Not_Ready"; +VAL_ 72 immoTarget2Status 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "DISABLED_RESET " 2 "ENABLED_NONMOTIVE_START" 1 "ENABLED_MOTIVE_START" 0 "DISABLED"; +VAL_ 72 immoTarget2Cmd 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "TARGET1_IDBLOCK2" 2 "TARGET1_IDBLOCK1" 1 "CHALLENGE" 0 "IDLE"; +VAL_ 912 CabnEvapSovFront_D_Stat 7 "NotUsed_1" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad"; +VAL_ 912 BattChlrSov_D_Stat 7 "NotUsed_1" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad"; +VAL_ 912 BattTracClntVlv_D_Stat 7 "NotUsed" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad"; +VAL_ 874 AirCondCluOpen_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 AirCondCluLife_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 AirCondCluGnd_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 AirCondClu_D_Stat 7 "NotUsed" 6 "FetLifeLimitReached" 5 "FetOpenCircuit" 4 "FetOutputShortToPower" 3 "FetOutputShortToGround" 2 "FetNotControlled" 1 "OnPowerToLoad" 0 "OffNoPowerToLoad"; +VAL_ 874 AirCondCluBatt_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattTracShrtGrnd_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattTracShrtBatt_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattTracOpnCirct_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattTracLifeLim_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattChlrShrtGrnd_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattChlrShrtBatt_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattChlrOpnCirct_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattChlrLifeLim_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 874 BattTracLow_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 651 TelematicsSrvc_D_St 7 "NotUsed" 6 "NotifyNotActivatedYet" 5 "NotActivatedYet" 4 "NotifyExpired" 3 "Expired" 2 "ExpiringSoon" 1 "Active" 0 "Null"; +VAL_ 651 EmgcyCallMute_D_Stat 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "ManualEmergencyCallMute" 2 "AutomaticEmergencyCallMute" 1 "EmergencyCallUnmute" 0 "Null"; +VAL_ 651 OfbChrgSetSync_D_Rq 3 "Fail" 2 "Success" 1 "InProgress" 0 "NoSyncInProgress"; +VAL_ 529 OnbChrgToPcWknd_D_Actl 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100"; +VAL_ 529 OnbChrgToPcWkdy_D_Actl 7 "Percent_50" 6 "Percent_60" 5 "Percent_70" 4 "Percent_80" 3 "Percent_85" 2 "Percent_90" 1 "Percent_95" 0 "Percent_100"; +VAL_ 529 OnbChrgSetNow_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 529 OnbChrgSetDelete_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 529 OnbChrgPrflUpdate_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 529 OnbChrgLocIdUns_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 66 immoControlCmd_T2 0 "IDLE" 1 "MOTIVE_START_RQST" 2 "NONMOTIVE_START_RQST" 3 "RQST_TARGET2_IDBLOCK1" 4 "RQST_TARGET2_IDBLOCK2" 5 "Unused" 6 "ECHO_TARGET2_IDBLOCK2" 7 "SHUTDOWN"; +VAL_ 1124 GPS_Vdop 31 "Invalid" 30 "Unknown"; +VAL_ 1124 GPS_Speed 255 "Invalid" 254 "Unknown"; +VAL_ 1124 GPS_Sat_num_in_view 31 "Invalid" 30 "Unknown"; +VAL_ 1124 GPS_MSL_altitude 4095 "Fault" 4094 "Unknown"; +VAL_ 1124 GPS_Heading 65535 "Fault" 65534 "Unknown"; +VAL_ 1124 GPS_Hdop 31 "Invalid" 30 "Unknown"; +VAL_ 1124 GPS_dimension 2 "_3D" 1 "_2D" 0 "No_Fix"; +VAL_ 1119 CoolFanDcdc_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 1119 DcdcClntFlw_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 1123 GpsUtcYr_No_Actl 31 "Fault"; +VAL_ 1123 GpsUtcMnth_No_Actl 15 "Fault"; +VAL_ 1123 GPS_UTC_seconds 63 "Fault" 62 "Unknown"; +VAL_ 1123 GPS_UTC_minutes 63 "Fault" 62 "Unknown"; +VAL_ 1123 GPS_UTC_hours 31 "Invalid" 30 "Unknown"; +VAL_ 1123 GPS_Pdop 31 "Invalid" 30 "Unknown"; +VAL_ 1123 GPS_Compass_direction 7 "NorthWest" 6 "West" 5 "SouthWest" 4 "South" 3 "SouthEast" 2 "East" 1 "NorthEast" 0 "North"; +VAL_ 1123 GPS_Actual_vs_Infer_pos 1 "Inferred_Position" 0 "Actual_Postition"; +VAL_ 1123 Gps_B_Falt 1 "Yes" 0 "No"; +VAL_ 1122 GpsHsphLongEast_D_Actl 0 "Invalid" 1 "Eastern" 2 "Western" 3 "Fault"; +VAL_ 1122 GpsHsphLattSth_D_Actl 3 "Fault" 2 "Northern" 1 "Southern" 0 "Invalid"; +VAL_ 1122 GPS_Longitude_Minutes 63 "Fault" 62 "Unknown"; +VAL_ 1122 GPS_Longitude_Min_dec 16383 "Invalid" 16382 "Unknown"; +VAL_ 1122 GPS_Longitude_Degrees 511 "Fault" 510 "Unknown"; +VAL_ 1122 GPS_Latitude_Minutes 63 "Fault" 62 "Unknown"; +VAL_ 1122 GPS_Latitude_Min_dec 16383 "Invalid" 16382 "Unknown"; +VAL_ 1122 GPS_Latitude_Degrees 255 "Invalid" 254 "Unknown"; +VAL_ 1003 PersRecallSrc_D_Actl 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "MemorySwitch" 3 "RemoteStart" 2 "KeyFob" 1 "CenterStack" 0 "Null"; +VAL_ 1003 Pers4Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null"; +VAL_ 1003 Pers3Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null"; +VAL_ 1003 Pers2Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null"; +VAL_ 1003 Pers1Key_D_Stat 3 "NotUsed_1" 2 "KeyUnAssociated" 1 "KeyAssociated" 0 "Null"; +VAL_ 1003 EmPrflNo_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Pers4" 3 "Pers3" 2 "Pers2" 1 "Pers1" 0 "Null"; +VAL_ 1003 EmPrflKeyAssoc_D_Stat 7 "WrongDevice" 6 "KeyAssociateFailed" 5 "KeyAssociateSuccess" 4 "KeyAlreadyInUse" 3 "KeyDisassociated" 2 "KeyAssociationExited" 1 "KeyAssociationEntered" 0 "Null"; +VAL_ 1003 VehKeyActv_D_Stat 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "Key8Active" 7 "Key7Active" 6 "Key6Active" 5 "Key5Active" 4 "Key4Active" 3 "Key3Active" 2 "Key2Active" 1 "Key1Active" 0 "NoKeyActive"; +VAL_ 1003 PersNoPos_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_ 1003 PersSetupRestr_D_Actl 3 "Non_Moveable_Person" 2 "Moveable_Person" 1 "Vehicle" 0 "Factory"; +VAL_ 1003 PersSetupAccessCtrl 1 "Limited" 0 "Full"; +VAL_ 1003 PersConflict_D_Actl 1 "Conflict" 0 "No_Conflict"; +VAL_ 1003 AssocConfirm_D_Actl 0 "None" 7 "Associate" 6 "Keycode_Rejected" 5 "Keycode_Accepted" 4 "In_Progress" 3 "Erase" 2 "Duplicate" 1 "Disassociate"; +VAL_ 1003 PersNo_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "NotDetermined" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_ 994 PersStore_D_Rq 7 "Unused_2" 6 "Unused_1" 5 "Vehicle" 4 "PERS_4" 3 "PERS_3" 2 "PERS_2" 1 "PERS_1" 0 "Null"; +VAL_ 994 Pers4OptIn_B_Stats 1 "OPTED_IN" 0 "NOT_OPTED_IN"; +VAL_ 994 Pers3OptIn_B_Stats 1 "OPTED_IN" 0 "NOT_OPTED_IN"; +VAL_ 994 Pers2OptIn_B_Stats 1 "OPTED_IN" 0 "NOT_OPTED_IN"; +VAL_ 994 Pers1OptIn_B_Stats 1 "OPTED_IN" 0 "NOT_OPTED_IN"; +VAL_ 994 CtrStkPersIndex_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_ 994 CtrStkDsplyOp_D_Rq 7 "Unused_2" 6 "Unused_1" 5 "Copy" 4 "Restore" 3 "Upload" 2 "Set" 1 "Query" 0 "Null"; +VAL_ 778 PrkAidFront_D_RqDrv 2 "Status" 3 "NotUsed" 1 "Enabled" 0 "Disabled"; +VAL_ 778 PrkAidAcsyRear_D_RqDrv 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 778 PrkAidAcsyFront_D_RqDrv 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 778 Cta_D_Rq 3 "Unused" 2 "NoDataExists" 1 "On" 0 "Off"; +VAL_ 778 PrkAidRear_D_RqDrv 2 "Status" 3 "NotUsed" 1 "Enabled" 0 "Disabled"; +VAL_ 778 SteEffort_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "SpecialMode_2" 3 "SpecialMode_1" 2 "Comfort" 1 "Sport" 0 "Normal"; +VAL_ 778 Sod_D_Rq 2 "BLIS_On_Second_Warning_ON" 1 "BLIS_On_Second_Warning_OFF" 0 "Off"; +VAL_ 549 IPC_MyKeyVolLimit_St 0 "Invalid" 1 "Off" 2 "On"; +VAL_ 549 HdcOn_B_Rq 1 "On" 0 "Off"; +VAL_ 549 IPC_Attn_Info_Audio 7 "Unknown" 6 "Attenuation_6" 5 "Attenuation_5" 4 "Attenuation_4" 3 "Attenuation_3" 2 "Attenuation_2" 1 "Attenuation_1" 0 "No_Attenuation_of_Audio"; +VAL_ 549 BeltminderAudioMute 2 "On" 1 "Off" 0 "Invalid"; +VAL_ 549 Power_Up_Chime_Modules 1 "Active" 0 "Inactive"; +VAL_ 549 Chime_Source 2 "Cluster" 1 "Infotainment_Sys" 0 "Invalid"; +VAL_ 549 IPC_New_Attn_Event 1 "Active" 0 "Inactive"; +VAL_ 551 PmCabnLvl_D_Stat 7 "NotUsed_1" 6 "Level_6_Worst" 5 "Level_5" 4 "Level_4" 3 "Level_3" 2 "Level_2" 1 "Level_1_Best" 0 "NotKnown"; +VAL_ 551 PmCabn_D_Stat 3 "FilteringComplete" 2 "FilteringOn" 1 "FilteringOff" 0 "NotKnown"; +VAL_ 551 Cntr_Plg_Mode_Cmd 1 "Enable" 0 "Disable"; +VAL_ 551 ChrgCrdLckEnbl_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 551 PwRnngBoardT_D_Rq 3 "NotUsed" 2 "Timer2" 1 "Timer1" 0 "Inactive"; +VAL_ 551 PwRnngBoardSwtch_D_Rq 3 "NotUsed" 2 "DeployUnlocked" 1 "AlwaysActive" 0 "Inactive"; +VAL_ 551 PwRnngBoardMde_D_Rq 0 "Inactive" 1 "Off" 2 "Out" 3 "Auto"; +VAL_ 551 Btt_L_Actl2 127 "Faulty" 126 "NoDataExists"; +VAL_ 551 Rba_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 551 EmPrflNo_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Pers4" 3 "Pers3" 2 "Pers2" 1 "Pers1" 0 "Null"; +VAL_ 551 EmPrflButtnAssoc_D_Rq 3 "NotUsed" 2 "ExitButtonAssociation" 1 "EnterButtonAssociation" 0 "Null"; +VAL_ 551 EmPrflKeyAssoc_D_Rq 7 "NotUsed_3" 6 "DisassociatePhone" 5 "EnterPhoneAssociation" 4 "OverwriteKey" 3 "DisassociateKey" 2 "ExitKeyAssociation" 1 "EnterKeyAssociation" 0 "Null"; +VAL_ 551 Em_D_Stat 3 "NotSupported" 2 "ProfilesOff" 1 "ProfilesOn" 0 "Null"; +VAL_ 551 ChrgOvrdExitScrn_D_Rq 3 "NotUsed_1" 2 "Request_override" 1 "Do_not_request_override" 0 "Inactive"; +VAL_ 1010 MbdblActv_B_RqAdas 1 "Yes" 0 "No"; +VAL_ 1010 CbdblActv_B_RqAdas 1 "Yes" 0 "No"; +VAL_ 1010 AdbUrbanArea_B_Stat 1 "Yes" 0 "No"; +VAL_ 1070 BattULo24_D_Falt 3 "NotUsed" 2 "TemporaryFault" 1 "Fault" 0 "NoFault"; +VAL_ 1070 BattULo24_Te_Actl 127 "Fault"; +VAL_ 1070 BattULo24State_D_Qlty 3 "OK" 2 "Not_Within_Spec" 1 "Eval_In_Progress" 0 "Faulty"; +VAL_ 1070 BattULo24_I_Actl 16383 "Faulty"; +VAL_ 1070 BattULo24_B_Falt 1 "Yes" 0 "No"; +VAL_ 1186 SelDrvMdeAwd2_D_Stat 31 "Faulty" 30 "NotUsed_17" 29 "NotUsed_16" 28 "NotUsed_15" 27 "NotUsed_14" 26 "NotUsed_13" 25 "NotUsed_12" 24 "NotUsed_11" 23 "NotUsed_10" 22 "NotUsed_9" 21 "NotUsed_8" 20 "NotUsed_7" 19 "NotUsed_6" 18 "NotUsed_5" 17 "EvLaterChargeMode" 16 "EvNowMode" 15 "TrackMode" 14 "RoughRoadMode" 13 "NotAvailable" 12 "HighSpeedDesertMode_Baja" 11 "SportAdaptiveMode" 10 "RockCrawlMode" 9 "MudRutsMode" 8 "SandMode" 7 "EconomyMode" 6 "GrassGravelSnow" 5 "TowHaulMode" 4 "SportMode" 3 "Normal_4L" 2 "Normal_4A" 1 "Normal_2H" 0 "NormalMode"; +VAL_ 1186 RearDiffLckMsg_D_Rq 7 "Locker_Disabled" 6 "Locker_Enabled" 5 "Locker_Accel_Pedal" 4 "Speed4" 3 "Speed3" 2 "Spee2" 1 "Speed1" 0 "Normal__No_Message "; +VAL_ 1186 RearDiffLckLamp_D_Rq 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 1186 RearDiffLck_Tq_Actl 4095 "Fault" 4094 "Unknown"; +VAL_ 1186 RearDiffFalt_D_Stat 3 "Diff_Failed_Closed" 2 "Diff_Failed_Open" 1 "Fault_Non_Specific" 0 "No_Fault"; +VAL_ 1186 LsdSrvcRqd_B_Rq 1 "On" 0 "Off"; +VAL_ 611 AwdSys_D_Stat 3 "Faulty" 2 "NotUsed" 1 "_4x4_L_H_Active" 0 "_4x4_L_H_Inactive"; +VAL_ 611 AwdStat_D_RqDsply 31 "NotUsed9" 30 "NotUsed8" 29 "NotUsed7" 28 "To_Engage_4x4_Release_Aped" 27 "To_Engage_4x4_Slow_To_3MPH" 26 "Shift_To_Neutral" 25 "Lkr_Mode_Unavail_TMS" 24 " _4x4_Mode_Unavail_TMS" 23 "Out_of_4Low_Crawl" 22 "AWD_PTU_Oil_Changed" 21 "Change_AWD_PTU_Oil" 20 "Neutral_Tow_Disabled" 19 "Neutral_Tow_Enabled" 18 "AWD_OFF" 17 "_4x4_Off_Road_Speed" 16 "_4x4_Extreme_Off_Road_Mode" 15 "_4x4_Exiting_Off_Road" 14 "_4x4_Off_Road_Mode" 10 "_4x4_Locked_Temporarily" 9 "Shift_In_Progress" 13 "Blocked_Shift_Assist" 12 "_4x4_Auto_Restored" 11 "_4x4_Disabled_Temporarily" 7 "Out_of_4Low__Neutral" 6 "Out_of_4Low__Brake" 5 "Out_of_4Low__Speed" 4 "Into_4Low__Clutch" 3 "Into_4Low__Neutral" 2 "Into_4Low__Brake" 1 "Into_4Low__Speed" 0 "Normal__No_Message" 8 "Out_of_4Low__Clutch"; +VAL_ 611 AwdLck_D_Stat 9 "Undefined" 8 "Under_External_Torque_Ctrl" 7 "Torque_Limited_by_Cmd" 6 "Fully_Locked_by_Cmd" 5 "Disabled" 4 "Warning" 3 "Fault" 2 "Inactive" 1 "Completely_Opened_by_Cmd" 0 "OK"; +VAL_ 611 AwdSrvcRqd_B_Rq 1 "On" 0 "Off"; +VAL_ 611 NtrlTowAvail_B_Stat 1 "Available" 0 "NotAvailable"; +VAL_ 611 AwdLck_Tq_Rq 4095 "Fault" 4094 "Unknown"; +VAL_ 611 AwdOffRoadMode_D_Stats 3 "Invalid" 2 "Extreme_Off_Road" 1 "Off_Road" 0 "Normal_Mode"; +VAL_ 611 AwdLoLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 611 AwdHiLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 611 AwdAutoLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 611 Awd2wdLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 611 AwdRnge_D_Actl 7 "Unknown" 6 "High_Range_2wd" 5 "High_Range_Auto" 4 "High_Range_Locked" 3 "Neutral" 2 "Low_Range_2wd" 1 "Low_Range_Auto" 0 "Low_Range_Locked"; +VAL_ 1047 TrlrAidSetup_D2_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "SetupAcquisitionSuccess" 4 "TbaTadMonitor" 3 "SetupStartAcquisition" 2 "SetupPrepForAcquisition" 1 "TbaActive" 0 "Null"; +VAL_ 1047 TrlrAidEnbl_D2_Stat 7 "NotUsed_1" 6 "TbaActiveExpertActive" 5 "TbaActiveExpertAvail" 4 "TbaOffTrgActive" 3 "TbaOffTrgSetup" 2 "TbaSetup" 1 "TbaActive" 0 "Inactive"; +VAL_ 1047 TrlrAidMsgTxt_D2_Rq 63 "Message63" 62 "Message62" 61 "Message61" 60 "Message60" 55 "Message55" 50 "Message50" 45 "Message45" 40 "Message40" 35 "Message35" 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 1047 EsaOn_B_Stat 1 "On" 0 "Off"; +VAL_ 1047 SelDrvMdeSte_D_Stat 0 "NotAvailable" 1 "Available" 2 "TemporarilyNotAvailable" 3 "Faulty"; +VAL_ 972 LatCtlSte_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Denied" 3 "RampOut" 2 "ContLatControlInProgress" 1 "Available" 0 "Unavailable"; +VAL_ 972 LatCtlLim_D_Stat 3 "LimitWithDriverActive" 2 "LimitReached" 1 "LimitClose" 0 "LimitNotReached"; +VAL_ 972 LatCtlCpblty_D_Stat 3 "Faulty" 2 "ExtendedModeAvailable" 1 "LimitedModeAvailable" 0 "NoModeAvailable"; +VAL_ 972 LsmcBrkDecelEnbl_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "On" 0 "Off"; +VAL_ 972 TjaHandsOnCnfdnc_B_Est 1 "High_Confidence" 0 "Low_Confidence"; +VAL_ 972 LaHandsOff_B_Actl 1 "Hands_Off" 0 "Hands_On"; +VAL_ 972 LaActDeny_B_Actl 1 "LA_Denied" 0 "LA_Not_Denied"; +VAL_ 972 LaActAvail_D_Actl 3 "LKA_LCA_LDW_Avail" 2 "LCA_LKA_Avail_LDW_Suppress" 1 "LCA_LKA_Suppress_LDW_Avail" 0 "LCA_LKA_LDW_Suppress"; +VAL_ 130 TrlrHitchLamp_D_Rqst 1 "On" 0 "Off"; +VAL_ 130 VehVTrlrAid_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 130 DrvSteActv_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 130 DrvSte_Tq_Actl 255 "Invalid" 254 "Unknown"; +VAL_ 130 SteMdule_D_Stat 7 "NotUsed" 6 "EPAS_Failure3" 5 "EPAS_Failure2" 4 "System_Failure" 3 "EPAS_Shutdown" 2 "Normal_Op_Full_Assist" 1 "Normal_Op_Limited_Assist" 0 "EPAS_Initialization"; +VAL_ 130 SteMdule_U_Meas 255 "Invalid"; +VAL_ 130 SteMdule_I_Est 4095 "Invalid"; +VAL_ 130 EPAS_Failure 3 "SERVICE_POWER_STEERING_NOW" 2 "SERVICE_POWER_STEERING" 1 "POWER_STRG_ASSIST_FAULT" 0 "EPAS_OK_NO_MESSAGE"; +VAL_ 130 SteeringColumnTorque 255 "Invalid" 254 "Unknown"; +VAL_ 130 SAPPAngleControlStat6 1 "RequestedAngleNotReached" 0 "RequestedAngleCanBeReached"; +VAL_ 130 SAPPAngleControlStat5 1 "StrgColTorqueExceed_EAROn" 0 "ExternalSigContentOKforEAC"; +VAL_ 130 SAPPAngleControlStat4 1 "SpeedLimitExceededEAROn" 0 "ExternalSigContentOKforEAC"; +VAL_ 130 SAPPAngleControlStat3 1 "EARactiveNoReverseEngage" 0 "ExternalSigContentOKforEAC"; +VAL_ 130 SAPPAngleControlStat2 1 "Rel_ExtSteeringAngleReqx" 0 "NoRel_ExtSteeringAngleReqx"; +VAL_ 130 SAPPAngleControlStat1 3 "Fault" 2 "Active" 1 "Open" 0 "Closed"; +VAL_ 126 StePw_B_Rq 1 "Yes" 0 "No"; +VAL_ 126 StePinRelInit_An_Sns 65535 "Faulty" 65534 "NoDataExists"; +VAL_ 126 StePinCompAnEst_D_Qf 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 133 StePw_B_Rq 1 "Yes" 0 "No"; +VAL_ 133 StePinRelInit_An_Sns 65535 "Faulty" 65534 "NoDataExists"; +VAL_ 133 StePinCompAnEst_D_Qf 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 1200 BrkHold_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "HeldSecondary" 3 "HeldSecure" 2 "Held" 1 "Inactive" 0 "Off"; +VAL_ 1200 HsaTrnAout_Tq_Rq 65535 "Fault" 65534 "Unknown"; +VAL_ 1200 BrkBstrVac_P_Actl 127 "Invalid"; +VAL_ 1200 YawStabilityIndex 511 "Fault" 510 "NoDataExists"; +VAL_ 1200 BrkTot_Tq_RqDrv 8191 "Fault"; +VAL_ 1200 HsaStat_D_Dsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "NotAvailable" 3 "SlowReleaseWithChime" 2 "SlowReleaseWithoutChime" 1 "Active" 0 "Inactive"; +VAL_ 1102 SelDrvMdePos12_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos11_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos10_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos09_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos08_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos07_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos06_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos05_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos04_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos03_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos02_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1102 SelDrvMdePos01_D_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1056 AutoEpbMsgTxt_D_Rq 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 1056 AutoEpbDsply_D_Stat 1 "Available" 0 "NotAvailable"; +VAL_ 1056 AutoEpbButtnOn_B_Stat 1 "On" 0 "Off"; +VAL_ 1056 SelDrvMdePos12_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos11_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos10_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos09_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos08_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos07_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos06_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos05_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos04_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos03_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos02_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 SelDrvMdePos01_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 1056 ActvDrvMde_D2_Stat 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1056 SelDrvMde_D2_Rq 31 "Faulty" 30 "SelDrvMde31" 29 "SelDrvMde30" 28 "SelDrvMde29" 27 "SelDrvMde28" 26 "SelDrvMde27" 25 "SelDrvMde26" 24 "SelDrvMde25" 23 "SelDrvMde24" 22 "SelDrvMde23" 21 "SelDrvMde22" 20 "SelDrvMde21" 19 "SelDrvMde20" 18 "SelDrvMde19" 17 "SelDrvMde18" 16 "SelDrvMde17" 15 "SelDrvMde16" 14 "SelDrvMde15" 13 "SelDrvMde14" 12 "SelDrvMde13" 11 "SelDrvMde12" 10 "SelDrvMde11" 9 "SelDrvMde10" 8 "SelDrvMde09" 7 "SelDrvMde08" 6 "SelDrvMde07" 5 "SelDrvMde06" 4 "SelDrvMde05" 3 "SelDrvMde04" 2 "SelDrvMde03" 1 "SelDrvMde02" 0 "SelDrvMde01"; +VAL_ 1056 SelDrvMdePt_D_Rq 31 "Faulty" 30 "NotUsed15" 29 "NotUsed14" 28 "NotUsed13" 27 "NotUsed12" 26 "NotUsed11" 25 "NotUsed10" 24 "NotUsed9" 23 "NotUsed8" 22 "NotUsed7" 21 "NotUsed6" 20 "NotUsed5" 19 "NotUsed4" 18 "EvLaterChargerMode" 17 "EvNowMode" 16 "DragMode" 15 "HighSpeedDesertMode_Baja" 14 "SportAdaptiveMode" 13 "NotAvailable_13" 12 "NotAvailable_12" 11 "NotAvailable_11" 10 "NotAvailable_10" 9 "RockCrawlMode" 8 "MudRutsMode" 7 "SandMode" 6 "EconomyMode" 5 "GrassGravelSnow" 4 "NotAvailable_04" 3 "TowHaulMode" 2 "NotAvailable_02" 1 "SportMode" 0 "NormalMode"; +VAL_ 1056 SelDrvMdeMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 1056 SelDrvMde_D_Stat 3 "NotUsed" 2 "DriveModeChangeRequest" 1 "DriveModeChangeSelection" 0 "NoDriveModeChangeRequest"; +VAL_ 1056 AwdMde_D_RqBrk 7 "Faulty" 6 "NotUsed2" 5 "NoRequest" 4 "Neutral" 3 "FourByFourLow" 2 "FourByFourHigh" 1 "FourByFourAuto" 0 "FourByTwo"; +VAL_ 1054 AirDamUp_B_RqBrk 1 "Up" 0 "NoRequest"; +VAL_ 1054 RbaBrk_D_Stat 3 "Denied" 2 "Active" 1 "Open" 0 "Closed"; +VAL_ 1054 SelDrvMdeChassis2_D_Rq 31 "Faulty" 30 "NotUsed17" 29 "NotUsed16" 28 "NotUsed15" 27 "NotUsed14" 26 "NotUsed13" 25 "NotUsed12" 24 "NotUsed11" 23 "NotUsed10" 22 "NotUsed9" 21 "NotUsed8" 20 "NotUsed7" 19 "NotUsed6" 18 "NotUsed5" 17 "NotUsed4" 16 "NotUsed3" 15 "NotUsed2" 14 "RoughRoadMode" 13 "TrackMode" 12 "HighSpeedDesertMode" 11 "TowHaulMode" 10 "RockCrawlMode" 9 "SandMode" 8 "MudAndRutsMode" 7 "LowMuMode" 6 "ComfortAdaptiveMode" 5 "ComfortMode" 4 "SportAdaptiveMode" 3 "SportMode" 2 "EconomyMode" 1 "NormalAdaptiveMode" 0 "NormalMode"; +VAL_ 1054 TrailCtl_D_Stat 7 "Faulty" 6 "DescentOnly" 5 "EnabledDeny" 4 "StandbyOverThreshold" 3 "StandbyOverride" 2 "Active" 1 "EnabledDescent" 0 "Off"; +VAL_ 1054 TrailCtlMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 1054 BrkBstrVac_D_Stat 3 "NotUsed" 2 "BoosterVacEstimator" 1 "BoosterVacSensor" 0 "NoBoosterVacuumMonitor"; +VAL_ 1054 DrvSlipCtlOffLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off"; +VAL_ 1054 DrvSlipCtlMdeMsg_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 1054 AutoHoldMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 1054 CtaBrk_D_Stat 3 "Denied" 2 "Active" 1 "Open" 0 "Closed"; +VAL_ 1054 SelDrvMdeAwd_D_Rq 31 "Faulty" 30 "NotUsed_17" 29 "NotUsed_16" 28 "NotUsed_15" 27 "NotUsed_14" 26 "NotUsed_13" 25 "NotUsed_12" 24 "NotUsed_11" 23 "NotUsed_10" 22 "NotUsed_9" 21 "NotUsed_8" 20 "NotUsed_7" 19 "NotUsed_6" 18 "NotUsed_5" 17 "EvLaterChargeMode" 16 "EvNowMode" 15 "TrackMode" 14 "RoughRoadMode" 13 "NotAvailable" 12 "HighSpeedDesertMode_Baja" 11 "SportAdaptiveMode" 10 "RockCrawlMode" 9 "MudRutsMode" 8 "SandMode" 7 "EconomyMode" 6 "GrassGravelSnow" 5 "TowHaulMode" 4 "SportMode" 3 "Normal_4L" 2 "Normal_4A" 1 "Normal_2H" 0 "NormalMode"; +VAL_ 1054 AutoHoldSwMde_B_Ind 1 "On" 0 "Off"; +VAL_ 1054 AutoHoldMde_D_Ind 3 "Indication_3" 2 "Indication_2" 1 "Indication_1" 0 "Off"; +VAL_ 1054 SelDrvMdeChassis_D_Rq 31 "Faulty" 30 "NotUsed17" 29 "NotUsed16" 28 "NotUsed15" 27 "NotUsed14" 26 "NotUsed13" 25 "NotUsed12" 24 "NotUsed11" 23 "NotUsed10" 22 "NotUsed9" 21 "NotUsed8" 20 "NotUsed7" 19 "NotUsed6" 18 "NotUsed5" 17 "NotUsed4" 16 "NotUsed3" 15 "NotUsed2" 14 "NotUsed1" 13 "TrackMode" 12 "HighSpeedDesertMode" 11 "TowHaulMode" 10 "RockCrawlMode" 9 "SandMode" 8 "MudAndRutsMode" 7 "LowMuMode" 6 "ComfortAdaptiveMode" 5 "ComfortMode" 4 "SportAdaptiveMode" 3 "SportMode" 2 "EconomyMode" 1 "NormalAdaptiveMode" 0 "NormalMode"; +VAL_ 1054 ApaBrk_D_Stat 3 "Denied" 2 "Active" 1 "Open" 0 "Closed"; +VAL_ 1046 HsaMde_D_Mem 3 "Undefined" 2 "Manual" 1 "Automatic" 0 "Off"; +VAL_ 1046 BrkBstrVac_B_Rq 1 "Yes" 0 "No"; +VAL_ 1046 HdcMde_D_Actl 7 "Fault" 6 "Temporarily_Unavailable" 5 "NotEnabled_WrongGearSel" 4 "NotEnabled_SpdLimitExceed" 3 "Active_Braking" 2 "Not_Active_Braking" 1 "Off" 0 "Undefined"; +VAL_ 1046 RearDiffLck_Tq2_RqMx 4095 "Faulty"; +VAL_ 1046 TRLR_SWAY_EVNT_IN_PROG 1 "Yes" 0 "No"; +VAL_ 1046 TRLR_SWAY_CONFIG_STAT 1 "On" 0 "Off"; +VAL_ 1046 TCMode 1 "Active" 0 "Inactive"; +VAL_ 1046 DrvSlipCtlLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off"; +VAL_ 1046 Abs_B_Falt 1 "Yes" 0 "No"; +VAL_ 1046 DrvSlipCtlMde_D_Ind 3 "App_Specific_Off_Mode_3" 2 "App_Specific_Off_Mode_2" 1 "App_Specific_Off_Mode_1" 0 "Default_Mode"; +VAL_ 1046 DrvAntiLckLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off"; +VAL_ 1046 StabCtlBrk_B_Avail 1 "Yes" 0 "No"; +VAL_ 1046 DrvHdcWarnInfo_D_Rq 3 "Undefined" 2 "Lamp_On_Continuously" 1 "Lamp_Flashing" 0 "Lamp_Off_Continuously"; +VAL_ 1046 DrvHdcMsg_D_Rq 7 "Undefined" 6 "Speed_too_High" 5 "Temporarily_Unavailable" 4 "System_Fault" 3 "Select_Gear" 2 "Off" 1 "On" 0 "No_Message"; +VAL_ 1046 DrvHdcLampInfo_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off"; +VAL_ 1046 BpedMove_D_Actl 3 "Unknown" 2 "DriverApplyingBrakePedal" 1 "NoAutonomousBrkPdlMovement" 0 "AutonomousBrkPedalMove"; +VAL_ 1046 ChimeBrk_B_Rq 1 "Yes" 0 "No"; +VAL_ 1046 BrkLamp_B_Rq 1 "Yes" 0 "No"; +VAL_ 1046 HILL_DESC_MC 7 "Fault_Detected" 6 "Cooling_Down" 5 "Abort_Apply_Brakes" 4 "Active" 3 "Disabled" 2 "Enabled" 1 "Off_Road" 0 "Normal"; +VAL_ 1046 RearDiffElckrOpen_B_Rq 1 "Yes" 0 "No"; +VAL_ 1045 VehStab_D_Stat 15 "Faulty" 14 "No_Data_Exists" 13 "NotUsed6" 12 "NotUsed5" 11 "NotUsed4" 10 "NotUsed3" 9 "NotUsed2" 8 "NotUsed1" 7 "High_SSRA_no_OS" 6 "Straight" 5 "Post_Oversteer" 4 "Post_Transition" 3 "Countersteer" 2 "Understeer" 1 "Oversteer" 0 "Linear"; +VAL_ 1045 BrkFluidLvl_D_Stat 3 "Invalid" 2 "Unknown" 1 "Low" 0 "OK"; +VAL_ 1045 LsmcBrkDecel_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Denied" 3 "FaultDegraded" 2 "FaultExt" 1 "On" 0 "Off"; +VAL_ 1045 VehYawNonLin_W_Rq 4095 "Fault" 4094 "Unknown"; +VAL_ 1045 VehYawLin_W_Rq 4095 "Fault" 4094 "Unknown"; +VAL_ 1045 VehVActlBrk_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 1044 StePinOffst_An_Est 65535 "Faulty" 65534 "NoDataExists"; +VAL_ 1044 StePinOffst_D_Stat 3 "FineOffset" 2 "CoarseOffset" 1 "StoredOffset" 0 "OffsetNotCalculated"; +VAL_ 1042 VehRol_An_Dsply 127 "Faulty" 126 "NoDataExists"; +VAL_ 1042 VehPtch_An_Dsply 127 "Faulty" 126 "NoDataExists"; +VAL_ 535 WhlRr_W_Meas 32767 "Fault" 32766 "Unknown"; +VAL_ 535 WhlRl_W_Meas 32767 "Fault" 32766 "Unknown"; +VAL_ 535 WhlFr_W_Meas 32767 "Fault" 32766 "Unknown"; +VAL_ 535 WhlFl_W_Meas 32767 "Fault" 32766 "Unknown"; +VAL_ 534 WhlDirRr_D_Actl 3 "Faulty" 2 "NoDataExists" 1 "Backward" 0 "Forward"; +VAL_ 534 WhlDirRl_D_Actl 3 "Faulty" 2 "NoDataExists" 1 "Backward" 0 "Forward"; +VAL_ 534 WhlDirFr_D_Actl 3 "Faulty" 2 "NoDataExists" 1 "Backward" 0 "Forward"; +VAL_ 534 WhlDirFl_D_Actl 3 "Faulty" 2 "NoDataExists" 1 "Backward" 0 "Forward"; +VAL_ 532 RgenTqFalt_B_Actl 1 "Fault" 0 "No_Fault"; +VAL_ 532 RgenBrkDynoMde_B_Actl 1 "TwoWheelDyno" 0 "NormalOperation"; +VAL_ 531 VehStop_D_Stat 3 "Faulty" 2 "NoDataExists" 1 "Yes" 0 "No"; +VAL_ 531 TracCtlPtActv_B_Actl 1 "Active" 0 "Inactive"; +VAL_ 531 LscmbbMntr_B_Err 1 "DisplayMessage" 0 "NoMessage"; +VAL_ 531 LscmbbBrkDis_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 LscmbbDeny_B_ActlBrk 1 "Yes" 0 "No"; +VAL_ 531 PrkBrkYwLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off"; +VAL_ 531 PrkBrkRedLamp_D_Rq 3 "Fast_Flash" 2 "Slow_Flash" 1 "On" 0 "Off"; +VAL_ 531 LscmbbBrkDecel_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 AbsActv_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 StabCtlBrkActv_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 CmbbBrkPrchg_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 CmbbBrkDecel_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 CmbbBaSensInc_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 AccBrkWarm_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 AccBrkTotTqMn_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 AccBrkPrchgActv_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 AccBrkDis_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 AccBrkDeny_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 AccBrkActv_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 PrplDrgCtlActv_B_Actl 1 "Active" 0 "Inactive"; +VAL_ 531 LscmbbBaSensInc_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 CmbbBrkDis_B_Actl 1 "Yes" 0 "No"; +VAL_ 531 CmbbDeny_B_ActlBrk 1 "Yes" 0 "No"; +VAL_ 531 CcDis_B_Cmd 1 "Yes" 0 "No"; +VAL_ 531 VehLongOvrGnd_A_Est 1023 "Fault" 1022 "Unknown"; +VAL_ 531 LscmbBrkPrchg_B_Actl 1 "Active" 0 "Inactive"; +VAL_ 531 AccStopActv_B_ActlBrk 1 "Yes" 0 "No"; +VAL_ 531 AccDis_B_ActlEpb 1 "Yes" 0 "No"; +VAL_ 531 PrkBrkMsgTxt_D_Rq 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "No_Message"; +VAL_ 531 PrkBrkStatus 7 "GeneralFault_MaintenceMode" 6 "ECD_by_Brake_ECU_Active" 5 "EPB_Limphome_Active" 4 "Rear_Caliper_Open" 3 "RWU_By_EPB_Active" 2 "Rear_Caliper_Transition" 1 "Rear_Caliper_Closed" 0 "Not_Supported"; +VAL_ 136 SteWhlBrkOffst_An_Rq 32767 "Faulty" 32766 "NoDataExists"; +VAL_ 125 VehRolComp_W_Actl 4094 "NoDataExists" 4095 "Fault"; +VAL_ 125 VehVertComp_A_Actl 1022 "NoDataExists" 1023 "Fault"; +VAL_ 125 BrkTot_Tq_RqArb 8191 "Fault" 8190 "Unknown"; +VAL_ 125 BrkTot_Tq_Actl 8191 "Fault" 8190 "Unknown"; +VAL_ 125 HsaStat_D_Actl 7 "Faulty" 6 "FaultyWithDriverIndication" 5 "SlowRelease" 4 "FastRelease" 3 "ActiveBrakePedalReleased" 2 "ActiveBrakePedalPressed" 1 "FindingGradient" 0 "Inactive"; +VAL_ 119 VehTrvlDir_D_Stat 7 "Faulty" 6 "NoDataExists" 5 "NotUsed2" 4 "NotUsed1" 3 "Reverse" 2 "LikelyReverse" 1 "Forward" 0 "LikelyForward"; +VAL_ 119 VehOverGnd_V_Est 65535 "Invalid" 65534 "Unknown"; +VAL_ 119 VehLongComp_A_Actl 1023 "Fault" 1022 "NoDataExists"; +VAL_ 119 VehLatComp_A_Actl 1023 "Fault" 1022 "NoDataExists"; +VAL_ 119 VehYawComp_W_Actl 4095 "Fault" 4094 "NoDataExists"; +VAL_ 118 BrkCtrFnd_B_Stat 1 "Yes" 0 "No"; +VAL_ 118 DrvSte_D_Stat 15 "NotUsed10" 14 "NotUsed9" 13 "NotUsed8" 12 "NotUsed7" 11 "NotUsed6" 10 "NotUsed5" 9 "NotUsed4" 8 "NotUsed3" 7 "NotUsed2" 6 "NotUsed1" 5 "Request_Active" 4 "Ignition_Off" 3 "DSR_in_Normal_Idle_Mode" 2 "EPAS_Comm_Disturbed" 1 "DSR_Request_Not_Applicable" 0 "DSR_Deactivated"; +VAL_ 118 DrvSte_Tq_Rq 255 "Invalid" 254 "Unknown"; +VAL_ 118 EmgcyBrkLamp_D_Rq 3 "NotUsed" 2 "Active_at_standstill" 1 "Active_at_speed" 0 "Inactive"; +VAL_ 118 StopLamp_B_RqBrk 1 "Active" 0 "Inactive"; +VAL_ 73 immoSubTarget1Cmd_T1 7 "Unused3" 6 "Unused2" 5 "ECHO_TARGET1_IDBLOCK2" 4 "Unused1" 3 "RQST_TARGET1_IDBLOCK2" 2 "RQST_TARGET1_IDBLOCK1" 1 "RESPONSE" 0 "IDLE"; +VAL_ 561 TrnMsgTxt2_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "TransTooHot_LoudChime" 3 "PressBrake_LoudChime" 2 "PressBrake_SoftChime" 1 "PressBrake_NoChime" 0 "NoText_NoChime"; +VAL_ 561 TrnMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage"; +VAL_ 330 TrnAout_W_ActlUnfilt 32767 "Fault" 32766 "Unknown"; +VAL_ 1090 Mtr2State_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed_1" 4 "ReadinessState" 3 "DeactivationState" 2 "PowerGeneration" 1 "PowerConsumption" 0 "Null"; +VAL_ 1090 Inv1Ain_I_ActlMntr 32767 "Faulty" 32766 "NoDataExists"; +VAL_ 1090 HybVehMde_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Fuel" 2 "HybridElectric" 1 "AllElectric" 0 "Null"; +VAL_ 1090 ChrgStat_D_ActlMntr 7 "Faulty" 6 "NoDataExists" 5 "NotUsed" 4 "ChargingCompleted" 3 "NotCharging" 2 "ChargingInDrivingState" 1 "ChargingInParkingState" 0 "Null"; +VAL_ 1090 VehElRnge_L_Dsply 4094 "NoDataExists" 4095 "Fault"; +VAL_ 870 EngMdeMsgTxt_D_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Charge" 3 "GlowingCharge" 2 "Hybrid" 1 "Ev" 0 "NoMessage"; +VAL_ 870 RngPerChrgInst_L_Dsply 4095 "Faulty" 4094 "NoDataExists"; +VAL_ 869 PwrFlowTxt_D_Dsply 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "Disply_Rgen_Chrg_Txt" 10 "Disp_Fast_Charge_Txt" 9 "Disp_Fast_Charge_Cmplt_Txt" 8 "Disp_Charge_Cmplt_Txt" 7 "Disp_Remote_Start_Txt" 6 "Disp_Eng_Drv_Txt" 5 "Disp_Elec_Drv_Txt" 4 "Disp_Idle_with_Chrg_Txt" 3 "Disp_Idle_Txt" 2 "Disp_Charg_HV_Batt_Txt" 1 "Disp_Hyb_Drive_Txt" 0 "No_Text"; +VAL_ 869 EngOnMsg2_D_Dsply 14 "_0xE_to_1F_NotUsed" 12 "Battery_Temperature" 11 "Hill_Decent_Control" 10 "Fuel_Maintenance" 9 "Oil_Maintenance" 8 "Normal_Operation" 7 "Low_Gear" 6 "Batt_Charging" 5 "Engine_Cold" 4 "Neutral_Gear" 3 "Heater_Setting" 2 "High_Speed" 1 "Acceleration" 0 "No_Display" 13 "Drive_Mode_Selection"; +VAL_ 869 EngOnMsg1_D_Dsply 14 "_0xE_to_1F_NotUsed" 12 "Battery_Temperature" 11 "Hill_Decent_Control" 10 "Fuel_Maintenance" 9 "Oil_Maintenance" 8 "Normal_Operation" 7 "Low_Gear" 6 "Batt_Charging" 5 "Engine_Cold" 4 "Neutral_Gear" 3 "Heater_Setting" 2 "High_Speed" 1 "Acceleration" 0 "No_Display" 13 "Drive_Mode_Selection"; +VAL_ 869 FuelMaintMde_D_Dsply 3 "Feature_Not_Present" 2 "In_Fuel_Maint_Mode" 1 "Close_to_Fuel_Maint" 0 "OK"; +VAL_ 869 EngActv_B_Dsply 1 "On" 0 "Off"; +VAL_ 869 EffWhlThresOn_B_Dsply 1 "On" 0 "Off"; +VAL_ 606 ElVehLaterMde_D_Stat 3 "NotUsed" 2 "Available" 1 "NotAvailable" 0 "Null"; +VAL_ 606 ElVehNowMde_D_Stat 3 "NotUsed" 2 "Available" 1 "NotAvailable" 0 "Null"; +VAL_ 374 GearEngag_D_Actl 7 "Undefined" 6 "Fwd_Clutch_Fully_Engaged" 5 "Neutral_Idle" 4 "Disengaged_to_Neutral_Idle" 3 "Disengaged_to_Neutral_Park" 2 "Engagement_in_Progress" 1 "InitializeFwdClutchEngagmt" 0 "Park_Neutral"; +VAL_ 374 TrnRng_D_Rq 15 "Fault" 14 "Unknown_Position" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Range6" 10 "Range5" 9 "Range4" 8 "Range3_M3_L3" 7 "Range2_M2_L2" 6 "Range1_M1_L1" 5 "Low" 4 "Sport_DriveSport_Mposition" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_ 374 TrnPrkSys_D_Actl 15 "Faulty" 14 "NotUsed_5" 13 "NotUsed_4" 12 "NotUsed_3" 11 "NotUsed_2" 10 "NotUsed_1" 9 "FrequencyError" 8 "OutOfRangeHigh" 7 "OutOfRangeLow" 6 "Override" 5 "OutOfPark" 4 "TransitionCloseToOutOfPark" 3 "AtNoSpring" 2 "TransitionCloseToPark" 1 "Park" 0 "NotKnown"; +VAL_ 374 GearLvr_D_ActlDrv 15 "Fault" 14 "Unknown_Position" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Range6" 10 "Range5" 9 "Range4" 8 "Range3_M3_L3" 7 "Range2_M2_L2" 6 "Range1_M1_L1" 5 "Low" 4 "Sport_DriveSport_Mposition" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_ 374 GearPos_D_Trg 15 "Unknown" 14 "Reverse" 13 "Undefined_5" 12 "Undefined_4" 11 "Undefined_3" 10 "Tenth" 9 "Ninth" 8 "Eighth" 7 "Seventh" 6 "Sixth" 5 "Fifth" 4 "Fourth" 3 "Third" 2 "Second" 1 "First" 0 "Neutral"; +VAL_ 374 GearPos_D_Actl 15 "Unknown" 14 "Reverse" 13 "Undefined_5" 12 "Undefined_4" 11 "Undefined_3" 10 "Tenth" 9 "Ninth" 8 "Eighth" 7 "Seventh" 6 "Sixth" 5 "Fifth" 4 "Fourth" 3 "Third" 2 "Second" 1 "First" 0 "Neutral"; +VAL_ 603 WhlDirAvgDrv_D_Actl 3 "Failed" 2 "Unknown" 1 "Backward" 0 "Forward"; +VAL_ 603 PrplTqMnRgen_B_Actl 1 "Yes" 0 "No"; +VAL_ 603 BattTracCnnct_D_Rq 3 "Undefined" 2 "Retain" 1 "Close" 0 "Open"; +VAL_ 602 HtrnWarnLamp_B_Dsply 1 "On" 0 "Off"; +VAL_ 602 HybPwLimOn_B_Stat 1 "Yes" 0 "No"; +VAL_ 602 PwPckTqRdy_B_Dsply 1 "On" 0 "Off"; +VAL_ 1152 BattTracDiagClr_B_Stat 1 "On" 0 "Off"; +VAL_ 1152 EngTeHi_B_Actl 1 "EngineTempHigh" 0 "Normal"; +VAL_ 1152 DcdcOn_B_Rq 1 "On" 0 "Off"; +VAL_ 1152 ULoBattSpprtSustn_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 1152 VehElEff_No_Avg 127 "Faulty" 126 "NoDataExists"; +VAL_ 872 PlgActvArb_B_Dsply 1 "On" 0 "Off"; +VAL_ 872 HybMdeStat_D_Dsply 7 "NotUsed2" 6 "EV_Charge" 5 "EV_Override" 4 "Forced_EV_Mode" 3 "Forced_Charge_Sustain_Mode" 2 "Auto_Charge_Sustain_Mode" 1 "Auto_Charge_Deplete_Mode" 0 "Null_State"; +VAL_ 560 SelDrvMdeSwtch_D_Stat3 3 "Faulty" 2 "SwitchState2" 1 "SwitchState1" 0 "NotPressed"; +VAL_ 560 TrnSrvcRqd_B_Rq 1 "On" 0 "Off"; +VAL_ 560 TrnShifActv_B_Actl 1 "Active" 0 "Inactive"; +VAL_ 560 GearLvrPos_D_Actl 15 "Fault" 14 "Unknown_Position" 13 "Undefined_Treat_as__Fault" 12 "Undefined_Treat_as_Fault" 11 "sixth" 10 "fifth" 9 "fourth" 8 "third" 7 "second" 6 "first" 5 "Low" 4 "Sport_DriveSport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_ 560 GboxOil_Te_Actl 255 "Faulty" 254 "NoDataExists"; +VAL_ 369 SeatWorkSrfc_B_Falt 1 "Active" 0 "Inactive"; +VAL_ 369 TrnIpcDsplyRng2_D_Actl 15 "No_Range_Selected" 14 "Range_14" 13 "Range_13" 12 "Range_12" 11 "Range_11" 10 "Range_10" 9 "Range_9" 8 "Range_8" 7 "Range_7" 6 "Range_6" 5 "Range_5" 4 "Range_4" 3 "Range_3" 2 "Range_2" 1 "Range_1" 0 "NotUsed"; +VAL_ 369 TrnIpcDsplyRng_D_Stat 3 "NotUsed" 2 "Flash" 1 "On" 0 "Blank_No_Display"; +VAL_ 369 TrnIpcDsplyGear_D_Actl 15 "No_Gear_Selected" 14 "_14th_Gear" 13 "_13th_Gear" 12 "_12th_Gear" 11 "_11th_Gear" 10 "_10th_Gear" 9 "_9th_Gear" 8 "_8th_Gear" 7 "_7th_Gear" 6 "_6th_Gear" 5 "_5th_Gear" 4 "_4th_Gear" 3 "_3rd_Gear" 2 "_2nd_Gear" 1 "_1st_Gear" 0 "Neutral"; +VAL_ 369 TrnIpcDsplyMde_D_Stat 3 "Reserved_Blank_No_Display" 2 "Flash" 1 "On" 0 "Blank_No_Display"; +VAL_ 369 TrnIpcDsplyMde_D_Actl 7 "Manual_3" 6 "Manual_2" 5 "Manual_1_Low" 4 "Sport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_ 369 TrnIpcDsplyGear_D_Stat 3 "Reserved_Blank_No_Display" 2 "Flash" 1 "On" 0 "Blank_No_Display"; +VAL_ 92 TrnLvrV_D_Rq 3 "Full_Speed" 2 "Aggressive" 1 "Normal" 0 "Quiet"; +VAL_ 92 TrnSbwSysHlth_D_Actl 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 92 TrnGearNtmAllow_B_Stat 1 "Yes" 0 "No"; +VAL_ 92 TrnDtpCmd_D_Actl 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "Relatch" 3 "Deploy" 2 "Self_Test" 1 "No_Command" 0 "NotUsed1"; +VAL_ 92 GearSelLck_D_Rq 3 "PreventionBlocker" 2 "Unlock" 1 "Lock" 0 "Null"; +VAL_ 92 TrnValidGear_D_Cnfm 3 "Accept" 2 "Reject" 1 "Internal_Request" 0 "No_Command"; +VAL_ 92 TrnNtrlTowCmd_D_Actl 3 "NotUsed" 2 "Neutral_Tow_Entry" 1 "Car_Wash_Mode" 0 "Normal_Mode"; +VAL_ 92 TrnGearCmd_Pc_ActlPt 1023 "Fault"; +VAL_ 92 TrnGear_D_RqPt 7 "Fault" 6 "NotUsed" 5 "Manual" 4 "Drive" 3 "Neutral" 2 "Reverse" 1 "Park" 0 "No_Gear"; +VAL_ 92 TrnCmdState_B_Actl 1 "Yes" 0 "No"; +VAL_ 92 PrkBrkActv_D_RqTrnGear 3 "NotUsed2" 2 "RequestParkBrakeEngage" 1 "NoRequest" 0 "NotUsed1"; +VAL_ 92 TrnGearMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage"; +VAL_ 1087 BattRgenLoChrg_D_RqEng 3 "Disable" 2 "Retain" 1 "Closed" 0 "Open"; +VAL_ 1087 AdasLcObtclAbrt_B_Stat 1 "Yes" 0 "No"; +VAL_ 1087 BattRgenLoDChrg_D_RqEng 3 "Disable" 2 "Retain" 1 "Closed" 0 "Open"; +VAL_ 1087 AirDamPos_D_Stat 3 "Faulty" 2 "NotUsed" 1 "Down" 0 "Up"; +VAL_ 1087 FapLcInhbt_B_Rq 1 "Yes" 0 "No"; +VAL_ 1087 FapLcStopHold_B_Rq 1 "Yes" 0 "No"; +VAL_ 1087 FapLcPrchgBrk_B_Rq 1 "Yes" 0 "No"; +VAL_ 1087 FapLcObstcl_B_Stat 1 "Yes" 0 "No"; +VAL_ 1087 FapLcMaxGrdInhbt_B_Stat 1 "Yes" 0 "No"; +VAL_ 1087 FapLcMaxGrdAbrt_B_Stat 1 "Yes" 0 "No"; +VAL_ 1087 FapLcActv_B_Stat 1 "Yes" 0 "No"; +VAL_ 332 UreaLvlQlty_D_RqDsply 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "NotUsed_1" 2 "FlashChime" 1 "On" 0 "Off"; +VAL_ 332 UreaLvlTxtWarn_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "System_Error" 10 "Engine_Idled_See_Manual" 9 "Engine_Idled_Upon_Refuel" 8 "Speed_Limited_To_XX_mph" 7 "XXmph_Max_Upon_Restart" 6 "Speed_Limited_To_YY_mph" 5 "YYmph_Max_Upon_Restart" 4 "SpdLimtd_YYmph_In_XXmiles" 3 "ExFlRange_XXMiles_ScndWarn" 2 "Exh_Fluid_Range_XX_Miles" 1 "Exh_Fluid_Under_Half_Full" 0 "Exh_Fluid_Over_Half_Full"; +VAL_ 332 UreaQltySysWarn_D_Rq 7 "Undefined" 6 "ZZ_Overrides" 5 "EngineIdled" 4 "Engine_Idle_Upon_Refuel" 3 "SPEED_LIMITED_to_YY_mph" 2 "YY_MPH_MAX_UPON_Restart" 1 "CONTAMINATED_ExhFluid" 0 "NoQualityProblem"; +VAL_ 332 DieslPrtcWarn_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "OCR_ExhFilterClean_Stopped" 10 "OCR_ExhFilterCleaned" 9 "RgnOff_AtLimit" 8 "RgnOff_OverLoaded" 7 "RgnOff_Loaded" 6 "Exhaust_Filter_Full" 5 "DPF_OverLimit" 4 "DPF_AtLimit" 3 "ExhFilter_Drive_Completed" 2 "Cleaning_Exhaust_Filter" 1 "DPF_OverLoaded" 0 "DPF_Normal_Operation"; +VAL_ 332 UreaQltyFlg_B_RqDsply 1 "True" 0 "False"; +VAL_ 332 UreaQltySys_D_RqDsply 7 "Undefined" 6 "ZZ_Overrides" 5 "EngineIdled" 4 "Engine_Idle_Upon_Refuel" 3 "SPEED_LIMITED_to_YY_mph" 2 "YY_MPH_MAX_UPON_Restart" 1 "CONTAMINATED_ExhFluid" 0 "NoQualityProblem"; +VAL_ 332 UreaLvlTxt_D_RqDsply 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "System_Error" 10 "Engine_Idled_See_Manual" 9 "Engine_Idled_Upon_Refuel" 8 "Speed_Limited_To_XX_mph" 7 "XXmph_Max_Upon_Restart" 6 "Speed_Limited_To_YY_mph" 5 "YYmph_Max_Upon_Restart" 4 "SpdLimtd_YYmph_In_XXmiles" 3 "ExFlRange_XXMiles_ScndWarn" 2 "Exh_Fluid_Range_XX_Miles" 1 "Exh_Fluid_Under_Half_Full" 0 "Exh_Fluid_Over_Half_Full"; +VAL_ 1100 EngExhMdeQuiet_D2_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Track" 3 "Sport" 2 "Normal" 1 "Stealth" 0 "Null"; +VAL_ 1100 HvacCmprLim_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "CompressorHeadPressure" 4 "AvailableTorque" 3 "PedalPosition" 2 "RPM" 1 "ECT" 0 "NoLimit"; +VAL_ 1100 WakeAlarm1_B_Typ 1 "CanAndEcuDriveCircuit" 0 "CanOnly"; +VAL_ 1100 Veh_V_DsplyTrailCtlSet 63 "Faulty"; +VAL_ 1100 TrailCtlPt_B_Falt 1 "Fault" 0 "No_Fault"; +VAL_ 1100 AutoTowAllw_D_StatMnu 3 "TowHaulCommandedOn" 2 "AutoTowHaulEnabled" 1 "AutoTowHaulDisabled" 0 "NoSelection"; +VAL_ 1100 AutoTowActv_B_Stat 1 "Yes" 0 "No"; +VAL_ 1100 GrossTrainWeight_M_Est 255 "Faulty" 254 "NoDataExists"; +VAL_ 1098 EdmSailMdeOn_B_Stat 1 "On" 0 "Off"; +VAL_ 1098 EdmMsgTxt_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "OverallGoodScore" 10 "WorkOnCompliance" 9 "GoodCompliance" 8 "WorkOnGearShifting" 7 "GoodGearShifting" 6 "WorkOnEfficientSpeed" 5 "GoodEfficientSpeed" 4 "WorkOnDeceleration" 3 "GoodDeceleration" 2 "WorkOnAcceleration" 1 "GoodAcceleration" 0 "NoMessage"; +VAL_ 1098 EdmLamp_D_Dsply 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "NotUsed_1" 8 "CoastingEngineBrake" 7 "CoastingShiftToNeutral" 6 "FreewayJunction" 5 "Curve2" 4 "Curve1" 3 "SpeedLimit" 2 "Crossing" 1 "FreewayExit" 0 "NoRecommendation"; +VAL_ 1098 EdmCmplnc_B_Dsply 1 "Yes" 0 "No"; +VAL_ 1086 FuelPumpPwr_B_Rq 1 "On" 0 "Off"; +VAL_ 1086 ElLoadCtl_D_Rq 7 "Unused3" 6 "Unused2" 5 "Unused1" 4 "HoldAllDrvrInvisibleLoads" 3 "StdDriverInvisibleLoadsOn" 2 "AllDriverInvisibleLoadsOn" 1 "All_Possible_Loads_Off" 0 "No_Request"; +VAL_ 1071 CluPdlPosPcMeas_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 1069 SlMde_D_Stat 3 "IsaNotConfigured" 2 "Manual_Mode" 1 "Auto_Mode" 0 "Null"; +VAL_ 1069 SlMde_D_RqDsply 3 "NotUsed" 2 "ManualSpeed_LimiterSymbol" 1 "AutoSpeed_LimiterSymbol" 0 "NoSpeed_LimiterSymbol"; +VAL_ 1069 IsaOffst_D_Stat 15 "Faulty" 14 "Null" 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero"; +VAL_ 1069 GrllShtrPos_D_Cmd 15 "Fully_Open" 14 "Position14" 13 "Position13" 12 "Position12" 11 "Position11" 10 "Position10" 9 "Position9" 8 "Position8" 7 "Position7" 6 "Position6" 5 "Position5" 4 "Position4" 3 "Position3" 2 "Position2" 1 "Position1" 0 "Fully_Closed"; +VAL_ 1069 GrllShtrPos_B_Falt 1 "Fault" 0 "No_Fault"; +VAL_ 1069 ObdWarmUp_B_Complt 1 "Yes" 0 "No"; +VAL_ 1069 EngMsgTxt_D_Rq 3 "Undefined_2" 2 "Undefined_1" 1 "Power_Reduced_to_LowerTemp" 0 "No_Message"; +VAL_ 1069 EngAirIn_Te_Actl 1023 "Fault" 1022 "Unknown"; +VAL_ 1060 RearDiffOilTeWarn_B_Rq 1 "On" 0 "Off"; +VAL_ 1060 RearDiffOil_Te_Actl 511 "Faulty"; +VAL_ 1060 BpedDrvMsgTxt_B_Dsply 1 "On" 0 "Off"; +VAL_ 1060 FuelLvlWarn_D_ActlEng 7 "DteLevel5Lowest" 6 "DteLevel4" 5 "DteLevel3" 4 "DteLevel2NonMyKey" 3 "DteLevel1MyKey" 2 "VeryLow" 1 "Low" 0 "OK"; +VAL_ 1060 SelDrvMdePt_D_Stat 0 "NotAvailable" 1 "Available" 2 "TemporarilyNotAvailable" 3 "Faulty"; +VAL_ 1057 FohEng_D_Rq 3 "AutoEnable_ParkEnable" 2 "AutoDisable_ParkEnable" 1 "AutoEnable_ParkDisable" 0 "Disable_Stop"; +VAL_ 1057 EngIdlShutDwnTxt_D_Rq 3 "NotUsed" 2 "EngineShutdownOnPrevDrive" 1 "FeatureDisabledDueToFault" 0 "NoMessage"; +VAL_ 1057 EngIdlShutDown_D_Stat 3 "Not_used" 2 "Engine_Shutdown" 1 "Initiated_Countdown" 0 "Normal_Operation"; +VAL_ 1057 FUEL_ALCOHOL_PERCNT 255 "Invalid"; +VAL_ 1057 TrnTotTq_Rt_Est 65535 "Fault" 65534 "Unknown"; +VAL_ 1057 TrnTotLss_Tq_Est 255 "Fault" 254 "Unknown"; +VAL_ 1057 ECMMILRequest 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 1057 AirCondFluidHi_P_Actl 255 "Fault" 254 "Unknown"; +VAL_ 1057 OilPressureWarning 1 "Low_Pressure_Lamp_On" 0 "Normal_Pressure_Lamp_Off"; +VAL_ 1057 VehVLimStat_D_Actl 7 "Undefined_3" 6 "Undefined_2" 5 "Undefined_1" 4 "ASL_Fault_Condition" 3 "Active_and_Limiting" 2 "Active_but_Not_Limiting" 1 "Standby" 0 "Off"; +VAL_ 1057 VehVLimActv_B_Actl 1 "Active" 0 "Inactive"; +VAL_ 1057 CoolantFanStepAct 31 "Unused7" 30 "Unused6" 29 "Unused5" 28 "Unused4" 27 "Unused3" 26 "Unused2" 25 "Unused1" 23 "Step23" 22 "Step22" 21 "Step21" 20 "Step20" 19 "Step19" 18 "Step18" 17 "Step17" 16 "Step16" 15 "Step15" 14 "Step14" 13 "Step13" 12 "Step12" 11 "Step11" 10 "Step10" 9 "Step9" 8 "Step8" 7 "Step7" 6 "Step6" 5 "Step5" 4 "Step4" 3 "Step3" 2 "Step2" 1 "Step1" 24 "Max_Fan_Speed_Req" 0 "Fan_Cmd_Off"; +VAL_ 1055 EcoCochInstNeg_B_Dsply 1 "True" 0 "False"; +VAL_ 562 GearNtrl_D_Stat 3 "Faulty" 2 "NoDataExists" 1 "Yes" 0 "No"; +VAL_ 523 EngAirFiltMsgTxt_D_Rq 7 "NotUsed_2" 6 "NotUsed_1" 5 "EngineAirFilterMonitorFalt" 4 "ResetComplete" 3 "Clogged" 2 "ReplaceNow" 1 "ReplaceSoon" 0 "NoMessage"; +VAL_ 523 WaterInFuel_B_Falt 1 "Fault" 0 "No_Fault"; +VAL_ 523 UreaMnAdd_L2_Actl 255 "Faulty"; +VAL_ 523 UreaMxAdd_L2_Actl 511 "Faulty"; +VAL_ 517 FapLc_B_Err 1 "Yes" 0 "No"; +VAL_ 516 EngAoutNActl_D_QF 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 516 EngAout3_N_Actl 65535 "Invalid"; +VAL_ 516 ApedPos_PcRate_ActlArb 255 "Fault" 254 "Unknown"; +VAL_ 516 ApedPosPcActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 514 StrtrMtrDlyStrt_B_Stat 1 "Yes" 0 "No"; +VAL_ 514 VehVTrlrAid_B_Avail 1 "Yes" 0 "No"; +VAL_ 514 StrtrMtrCtlMsgTxt_D_Rq 7 "Start_In_Gear_Allowed" 6 "Pending_Start_Cancelled" 5 "Start_Pending_Please_Wait" 4 "Cranking_Limit_Exceeded" 3 "Press_Brk_and_Shift_to_P_N" 2 "Press_Clutch_and_Brake" 1 "Press_Clutch_To_Start" 0 "No_Display"; +VAL_ 514 VehVActlEng_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 514 GearRvrse_D_Actl 7 "Fault" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Active_confirmed" 2 "Active_not_confirmed" 1 "Inactive_confirmed" 0 "Inactive_not_confirmed"; +VAL_ 514 StrtrMtrCtlMsgTxt_D2_Rq 3 "NoRequestPcmStartingMsgCtl" 2 "ShiftToNeutralToStart" 1 "ShiftToParkToStart" 0 "NoRequestBcmStartingMsgCtl"; +VAL_ 512 PtDrvMde_D_Stat 15 "Faulty" 14 "NotUsed11" 13 "NotUsed10" 12 "NotUsed9" 11 "NotUsed8" 10 "NotUsed7" 9 "NotUsed6" 8 "NotUsed5" 7 "Drag" 6 "Rock" 5 "Baja" 4 "Sand" 3 "TowHaulGradeAssist" 2 "SnowWet" 1 "Sport" 0 "Normal"; +VAL_ 381 EngOilSrvcMsgTxt_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "ResetComplete" 3 "ResetInProgress" 2 "ChangeOilNow" 1 "ChangeOilSoon" 0 "NoText"; +VAL_ 381 RunDryPrevent_B_Stat 1 "True" 0 "False"; +VAL_ 381 WaterInFuel 1 "On" 0 "Off"; +VAL_ 381 GlowIndication 1 "On" 0 "Off"; +VAL_ 380 EngOilLvlWarn_D_Rq1 7 "Undefined_3" 6 "Undefined_2" 5 "Engine_Oil_Monitor_Fault" 3 "Engine_Oil_High" 2 "Engine_Oil_Critical_Low" 1 "Engine_Oil_Low" 0 "No_Message" 4 "Engine_Oil_Critical_High"; +VAL_ 380 EngExhBrkOnLamp_B_Rq 1 "On" 0 "Off"; +VAL_ 380 EngExhBrkAutoLamp_B_Rq 1 "On" 0 "Off"; +VAL_ 380 EngExhBrkMde_D_Actl 6 "ExhBrkDisable_NoError" 5 "ExhBrkActive_AUTO" 4 "ExhBrkActive_ON" 3 "ExhBrkRequest_AUTO" 2 "ExhBrkRequest_ON" 1 "ExhBrkNoRequest_OFF" 0 "ExhBrkUnavailable_Error"; +VAL_ 377 HvacAirFullOut_B_Rq 1 "Yes" 0 "No"; +VAL_ 377 FuelFillInlet_B_Dsply 1 "Yes" 0 "No"; +VAL_ 377 EngSrvcRqd_B_Rq 1 "Engine_Service_Required" 0 "No_engine_service_required"; +VAL_ 377 OdoCount 255 "Invalid"; +VAL_ 377 FuelFilterLamp_B_Dsply 1 "On" 0 "Off"; +VAL_ 377 AirCondRec_B_Rq 1 "Yes" 0 "No"; +VAL_ 377 AirCondClutch_B_Stats 1 "Yes" 0 "No"; +VAL_ 376 GasPrtc_D_RqDsply 7 "NotUsed_5" 6 "NotUsed_4" 5 "NotUsed_3" 4 "NotUsed_2" 3 "NotUsed_1" 2 "GpfOverLimit" 1 "GpfAtLimit" 0 "NormalOperation"; +VAL_ 376 DynoMde_B_Cmd 1 "Two_Wheel_Dyno" 0 "Normal_Operation"; +VAL_ 376 AslIconDsply_D_Rq 3 "On_Passive_Overridden" 2 "On_Active" 1 "On_Passive" 0 "Off"; +VAL_ 376 AslChime_B_Rq 1 "Yes" 0 "No"; +VAL_ 376 HvacHtrCore2_Te_Actl 1023 "Faulty"; +VAL_ 376 EcssLamp_D_RqDsply 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 376 AirAmbTe_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 376 AirAmb_P_Actl 63 "Fault" 62 "NoDataExists"; +VAL_ 373 DieslPrtc2_D_RqDsply 15 "NotUsed4" 14 "NotUsed3" 13 "NotUsed2" 12 "NotUsed1" 11 "OCR_ExhFilterClean_Stopped" 10 "OCR_ExhFilterCleaned" 9 "RgnOff_AtLimit" 8 "RgnOff_Overloaded" 7 "RgnOff_Loaded" 6 "Exhaust_Filter_Full" 5 "DPF_Overlimit" 4 "DPF_AtLimit" 3 "ExhFilter_Drive_Completed" 2 "Cleaning_Exhaust_Filter" 1 "DPF_Overloaded" 0 "DPF_Normal_Operation"; +VAL_ 373 DieslPrtcRgen_D_Actl 3 "Undefined" 2 "Regen_Level_2" 1 "Regen_Level_1" 0 "No_regen"; +VAL_ 373 EngTeColdPrtct_D_Stats 3 "Engine_Warm_RdcPwr" 2 "OK_to_Drive" 1 "Engine_Warm_PlsWait" 0 "Normal_Operation"; +VAL_ 373 EngExhOvrTe_B_RqDsply 1 "Active" 0 "Inactive"; +VAL_ 359 PrplWhlRgenMn_Tq_Actl 8191 "Faulty"; +VAL_ 359 ElPw_D_StatStrtStop 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Supported_Level_4" 8 "Supported_Level_3" 7 "Supported_Level_2" 6 "Supported_Level_1" 5 "Limited_Support" 4 "Fault_Limited" 3 "LV_Event_in_Progress" 2 "Not_Supported_Imminent" 1 "Supported_All" 0 "Not_Supported"; +VAL_ 359 PrplWhlTot2_Tq_Actl 65535 "Fault" 65534 "NoDataExists"; +VAL_ 359 PwPckTq_D_Stat 3 "PwPckOn_TqAvailable" 2 "StartInPrgrss_TqNotAvail" 1 "PwPckOn_TqNotAvailable" 0 "PwPckOff_TqNotAvailable"; +VAL_ 359 Eng_D_Stat 3 "NotUsed" 2 "EngAutoStopped" 1 "EngOn" 0 "EngOff"; +VAL_ 359 PlgActvArb_B_Actl 1 "On" 0 "Off"; +VAL_ 359 ElPw_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Fault_Limited" 3 "LV_Event_In_Progress" 2 "Not_Supported_Imminent" 1 "Supported" 0 "Not_Supported"; +VAL_ 359 TrnAinTq_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 358 StopStrtStdby_D_Indic 6 "NotUsed2" 5 "Telltale_Struck_Out" 4 "Telltale_Flashing_Amber" 3 "Telltale_On_Amber" 2 "Telltale_Flashing_Green" 1 "Telltale_On_Green" 0 "Telltale_Off" 7 "NotUsed3"; +VAL_ 358 StopStrtIODTxt_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 358 StopStrtDrvMde_D_Indic 3 "NotUsed" 2 "StartStop_IndirectDeselect" 1 "StopStart_Deselected" 0 "StopStart_Selected"; +VAL_ 358 StopStrtMsgTxt_D_Rq 15 "Message_15" 14 "Message_14" 13 "Message_13" 12 "Message_12" 11 "Message_11" 10 "Message_10" 9 "Message_9" 8 "Message_8" 7 "Message_7" 6 "Message_6" 5 "Message_5" 4 "Message_4" 3 "Message_3" 2 "Message_2" 1 "Message_1" 0 "NoMessage"; +VAL_ 358 OdoTripVerify_L_Actl 16777215 "Fault"; +VAL_ 358 HiElPwInhbt_B_Stat 1 "Inhibit" 0 "No_Inibit"; +VAL_ 358 AutoStopPtDelta_I_Est 255 "Fault"; +VAL_ 357 BPedDrvAppl_D_QF 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 357 CmbbDeny_B_ActlPrpl 1 "Yes" 0 "No"; +VAL_ 357 PrplTqMnSat_B_Actl 1 "Yes" 0 "No"; +VAL_ 357 BpedDrvAppl_D_Actl 3 "_Not_Allowed" 2 "Driver_Braking" 1 "Driver_Not_Braking" 0 "Not_Allowed"; +VAL_ 357 CmbbEngTqMn_B_Actl 1 "Yes" 0 "No"; +VAL_ 357 Veh_V_DsplyCcSet 255 "Fault" 254 "Unknown"; +VAL_ 357 AccEngStat_D_Actl 7 "Undefined_2" 6 "Undefined_1" 5 "ACCSoonCancel_due_Low_Spd" 4 "Shift_Down_Recommendation" 3 "Shift_Up_Recommendation" 2 "ACCNotAllowedToBeActivated" 1 "ACCStandby_due_Auto_Cancel" 0 "Normal_Operation"; +VAL_ 357 CcMde_D_Actl 7 "TapDownWaiting" 6 "TapUpWaiting" 5 "Resuming_Low" 4 "Resuming_High" 3 "Decelerating" 2 "Accelerating" 1 "Keeping_Speed" 0 "Not_Active"; +VAL_ 357 CcStat_D_Actl 7 "Undefined_2" 6 "Undefined_1" 5 "Active" 4 "Active_Que_Assist" 3 "Standby" 2 "Standby_Denied" 1 "Denied" 0 "Off"; +VAL_ 357 CcOvrrdActv_B_Actl 1 "Cruise_Overridden" 0 "Cruise_Req_Not_Overridden"; +VAL_ 357 AccStopMde_D_Rq 3 "Stop_Mode_Active" 2 "EPBApplyOrBrakeReleaseWarn" 1 "Limit_Rolling_Speed" 0 "Stop_Mode_Not_Active"; +VAL_ 355 AutoRgenTxt_B_RqDsply 1 "AutExhFilterCleanOFF" 0 "AutExhFilterCleanON"; +VAL_ 355 AccFllwMdeActv_B_Actl 1 "Active" 0 "Inactive"; +VAL_ 355 EngPtoMde_D_Actl 7 "Undefined" 6 "Split_Shaft_Stationary" 5 "Not_Used_2" 4 "PTO_Mobile" 3 "Not_Used_1" 2 "PTO_Stationary" 1 "BCP" 0 "Off"; +VAL_ 355 ManRgenTxt_D_RqDsply 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Cleaning_Aborted_Stopped" 3 "Cleaning_Completed" 2 "Cleaning_In_Progress" 1 "Cleaning_Allowed" 0 "Cleaning_Not_Allowed"; +VAL_ 355 ManRgenSoot_Pc_RqDsply 127 "Fault"; +VAL_ 355 DieslMsgTxt_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "ReducedEnginePower" 0 "NoMessage"; +VAL_ 342 EngOvrhtMitgActv_D_Ind 3 "Undefined" 2 "Mode2" 1 "Mode1" 0 "Normal_Mode"; +VAL_ 342 EngClntTe_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 342 EngOil_Te_Actl 255 "Fault" 254 "Unknown"; +VAL_ 71 immoTarget1Status 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "DISABLED_RESET " 2 "ENABLED_NONMOTIVE_START" 1 "ENABLED_MOTIVE_START" 0 "DISABLED"; +VAL_ 71 immoTarget1Cmd 7 "Unused4" 6 "Unused3" 5 "Unused2" 4 "Unused1" 3 "TARGET1_IDBLOCK2" 2 "TARGET1_IDBLOCK1" 1 "CHALLENGE" 0 "IDLE"; +VAL_ 1006 PersIndexIpmb_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_ 820 AhbStatGfhbFdbk_D_Actl 3 "GfhbHighBeamFullyOn" 2 "GfhbHighBeamPartlyOn" 1 "GfhbHighBeamOff" 0 "GfhbUnavailable"; +VAL_ 820 HeadLghtDrvSide_B_Stat 1 "Left_Hand_Traffic" 0 "Right_Hand_Traffic"; +VAL_ 820 HeadLghtHiOn_B_StatHcm 1 "On" 0 "Off"; +VAL_ 820 Adaptive_Hdlmp_Fault 1 "Yes" 0 "No"; +VAL_ 137 SteWhlOffstRq_D_Stat 3 "Faulty" 2 "NoDataExists" 1 "Allow_External_Angle_Req" 0 "Deny_External_Angle_Req"; +VAL_ 137 SteWhlOffst_An_TotActl 32767 "Faulty" 32766 "NoDataExists"; +VAL_ 137 SteWhlBrkOffst_An_Actl 32767 "Faulty" 32766 "NoDataExists"; +VAL_ 129 SelDrvMdeSwtch_D_Stat4 3 "Faulty" 2 "SwitchState2" 1 "SwitchState1" 0 "NotPressed"; +VAL_ 129 SteWhlSwtchView_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchSet_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchPhon_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchNav_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchMed_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchIod_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchHud_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchBack_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchMenu_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteEffortInc_B_RqDrv 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SelDrvMdeInc_B_RqDrv 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SelDrvMdeDec_B_RqDrv 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SuspDampInc_B_RqDrv 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchUp_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchRght_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchOk_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchLeft_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchDown_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchHome_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 129 SteWhlSwtchInfo_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 935 SodRight_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off"; +VAL_ 935 CtaAlrtRight2_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "AlertZone4" 3 "AlertZone3" 2 "AlertZone2" 1 "AlertZone1" 0 "Off"; +VAL_ 935 BttRight_D_Stat 7 "NotUsed" 6 "Disabled" 5 "Off" 4 "OffTemp" 3 "NotConnected" 2 "Pending" 1 "Connected" 0 "NotDetermined"; +VAL_ 935 BttRight_D_RqDrv 3 "NotUsed" 2 "Request" 1 "NoRequest" 0 "Null"; +VAL_ 935 CtaBrkRightMsgTxt_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 935 CtaRightBrkEnbl_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 935 CtaRightBrkDecel_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 935 CtaSnsRight_D_Stat 3 "Invalid" 2 "System_Failure" 1 "Blocked" 0 "Clear"; +VAL_ 935 CtaAlrtRight_D_Stat 1 "On" 0 "Off"; +VAL_ 935 CtaRight_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off"; +VAL_ 935 SodSnsRight_D_Stat 3 "Second_Warning_Audio" 2 "System_Failure" 1 "Blocked" 0 "Clear"; +VAL_ 935 SodAlrtRight_D_Stat 3 "Bulb_Proveout" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 935 SodDetctRight_D_Stat 4 "Sensor_Blocked" 3 "Sensor_Fault" 2 "Flash_On" 1 "Alert_On" 0 "AlertOff_FlashOff_SensrClr"; +VAL_ 1108 RCMSerialNoByte8 255 "Invalid" 254 "Unknown"; +VAL_ 1108 RCMSerialNoByte7 255 "Invalid" 254 "Unknown"; +VAL_ 1108 RCMSerialNoByte6 255 "Invalid" 254 "Unknown"; +VAL_ 1108 RCMSerialNoByte5 255 "Invalid" 254 "Unknown"; +VAL_ 1108 RCMSerialNoByte4 255 "Invalid" 254 "Unknown"; +VAL_ 1108 RCMSerialNoByte3 255 "Invalid" 254 "Unknown"; +VAL_ 1108 RCMSerialNoByte2 255 "Invalid" 254 "Unknown"; +VAL_ 1108 RCMSerialNoByte1 255 "Invalid" 254 "Unknown"; +VAL_ 261 ChrgStatDsply_D_Rq 3 "NotUsed_2" 2 "NotUsed_1" 1 "On" 0 "Off"; +VAL_ 261 NextUsageTimeToggle_Rq 0 "Inactive" 2 "Disable" 1 "Enable"; +VAL_ 261 LongTermParking_Rq 0 "Inactive" 1 "On" 2 "Off" 3 "NotUsed"; +VAL_ 261 ModemReset_D_Rq 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "BrandConnectReset2" 5 "BrandConnectReset1" 4 "CcsReset" 3 "OnlineTrafficReset" 2 "PaakReset" 1 "WifiHotspotReset" 0 "Null"; +VAL_ 261 StopStrtDrvMde_B_RqBtn3 1 "Pressed" 0 "Not_Pressed"; +VAL_ 261 TCU_ESN_D_Rq 3 "NotUsed" 2 "TCU_ESN_Request" 1 "NoRequest" 0 "Inactive"; +VAL_ 261 FactoryReset_Rq 1 "ResetFactoryDefaults" 0 "Inactive"; +VAL_ 1146 TrlrAidSwtch_D_RqDrv 3 "Faulty" 2 "NotUsed" 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1146 TrlrAidCtl_U_RqDrv 4095 "Faulty" 4094 "NoDataExists"; +VAL_ 533 DcacGfciTestBttn_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 533 DcacPwResetButtn_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 533 DcacPwOffButtn_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 533 DcacPwLoButtn_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 533 DcacPwHiButtn_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 533 DcacPwButtn_B_Falt 1 "Faulted" 0 "NotFaulted"; +VAL_ 533 TrlrHitch_D_RqMnu 15 "NotUsed_10" 14 "NotUsed_9" 13 "NotUsed_8" 12 "NotUsed_7" 11 "NotUsed_6" 10 "NotUsed_5" 9 "NotUsed_4" 8 "NotUsed_3" 7 "NotUsed_2" 6 "NotUsed_1" 5 "GoToTraileringDomain" 4 "Confirm" 3 "TurnOnTba" 2 "TurnOnAutohitch" 1 "CancelAutohitch" 0 "NoRequest"; +VAL_ 533 AutoEpbZoomView_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 533 AutoEpbButtn_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 533 TrlrAidMde_D_Rq 3 "Mode_3" 2 "Mode_2" 1 "Mode_1" 0 "NoRequest"; +VAL_ 533 TCU_Init_Actvtn_St 3 "NotUsed" 2 "InitialActivateDeny" 1 "InitialActivateAccept" 0 "Invalid"; +VAL_ 533 TCU_Final_Actvtn_St 3 "NotUsed" 2 "FinalActivateDeny" 1 "FinalActivateAccept" 0 "Invalid"; +VAL_ 533 OtaTrg_D_Stat 3 "NotUsed_1" 2 "Accepted" 1 "NotAccepted" 0 "Null"; +VAL_ 533 OnbChrgGoTTouch_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 533 OnbChrgGoTPrcond_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 533 OnbChrgGoTOn_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 533 OnbChrgGoTMnte_D_Rq 15 "NotUsed_4" 14 "NotUsed_3" 13 "NotUsed_2" 12 "NotUsed_1" 11 "Minute_55" 10 "Minute_50" 9 "Minute_45" 8 "Minute_40" 7 "Minute_35" 6 "Minute_30" 5 "Minute_25" 4 "Minute_20" 3 "Minute_15" 2 "Minute_10" 1 "Minute_5" 0 "Minute_0"; +VAL_ 533 OnbChrgGoTHr_T_Rq 31 "Faulty" 30 "NoDataExists"; +VAL_ 533 OnbChrgGoTExtHtr_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 533 OnbChrgGoTDelete_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 533 OnbChrgClearAll_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 533 PaakMyKey_D_Rq 3 "NotUsed" 2 "ConfirmNewPaakMyKey" 1 "RequestNewPaakMyKey" 0 "None"; +VAL_ 533 OnbChrgGoTUpdate_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 1041 ElCmprUHi_D_Stat 3 "Overvoltage" 2 "Undervoltage" 1 "InRange" 0 "Undetermined"; +VAL_ 1041 ElCmprOverTe_D_Stat 3 "OverTempStop" 2 "OverTempWarning" 1 "Normal" 0 "Undefined"; +VAL_ 1041 ElCmpr_N_Actl 255 "Invalid"; +VAL_ 1041 ElCmpr_Pw_Actl 255 "Invalid"; +VAL_ 1041 ElCmpr_D_Stat 7 "Signal_Invalid" 6 "Comp_Off_ActlSpd_Abnormal" 5 "Comp_Off_TrgtSpd_OutRange" 4 "Comp_Shutdown" 3 "Comp_Stopped_Self_Protect" 2 "Comp_Degraded" 1 "Comp_On" 0 "Comp_Off"; +VAL_ 1041 ElCmprPerfErr_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 1041 ElCmprInnrErr_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 1041 ElCmprLostComm_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 1041 ElCmprOverLoad_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 1041 ElCmprOverTe_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 1041 ElCmprBattURng_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 1041 ElCmprBattSysU_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 1041 ElCmprSysU_D_Falt 3 "NotUsed" 2 "Pass" 1 "Fail" 0 "Not_Diagnose_Yet"; +VAL_ 1067 BattULoAuxIsol_D_Rq 3 "Undefined" 2 "Retain" 1 "Close" 0 "Open"; +VAL_ 1067 BattULoAux_U_Rq 4095 "Faulty"; +VAL_ 1067 BattULoAux_I_Actl 4095 "Faulty"; +VAL_ 1067 BattULoAux_D_Qlty 3 "OK" 2 "Not_Within_Specifications" 1 "Eval_In_Progress" 0 "Faulty"; +VAL_ 1067 BattULoAux_U_Actl 255 "Faulty"; +VAL_ 1067 BattULoAux_B_Falt 1 "Fault" 0 "No_Fault"; +VAL_ 1112 BattTracChrgSustn_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 1112 BattTracCnnct_D_Cmd 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "WeldCheck" 3 "OkToDischarge" 2 "Closed" 1 "Precharge" 0 "Open"; +VAL_ 1112 BattTracHvilOpen_B_Stat 1 "Open" 0 "Closed"; +VAL_ 1112 BattTracDcdcDis_B_Rq 1 "Yes" 0 "No"; +VAL_ 1112 HtrnClntPump_D_Stat 3 "Faulty" 2 "No_Data_Exists" 1 "On" 0 "Off"; +VAL_ 1112 BattTracClntPmp_D_Stat 3 "Faulty" 2 "No_Data_Exists" 1 "On" 0 "Off"; +VAL_ 139 AfsPw_B_Rq 1 "Yes" 0 "No"; +VAL_ 139 AccButtnGpTogglePress2 1 "Pressed" 0 "Not_Pressed"; +VAL_ 139 TjaButtnOnOffPress2 1 "Pressed" 0 "Not_Pressed"; +VAL_ 139 ActvFrontSteMsgTxt_D_Rq 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 139 ActvFrontSteLck_D_Stat 3 "Test_passed" 2 "Test_failed" 1 "Test_cannot_run" 0 "Test_incomplete"; +VAL_ 139 SelDrvMdeAdptSte_D_Stat 3 "Faulty" 2 "TemporarilyNotAvailable" 1 "Available" 0 "NotAvailable"; +VAL_ 139 AslButtnOnOffPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 AslButtnOnOffCnclPres2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcButtnOnPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcButtnOnOffPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcButtnOnOffCnclPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcButtnOffPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAsllButtnResPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnSetPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnSetIncPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnSetDecPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnResIncPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnResDecPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnOnPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnOnOffCncl2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnOffCnclPres2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnIndxIncPres2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnIndxDecPres2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnDeny_B_Actl2 1 "Yes" 0 "No"; +VAL_ 139 CcAslButtnCnclResPres2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 CcAslButtnCnclPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 AccButtnGapIncPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 139 AccButtnGapDecPress2 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 1121 SelDrvMdeSwtch_D_Stat 3 "Faulty" 2 "SwitchState2" 1 "SwitchState1" 0 "NotPressed"; +VAL_ 1121 SelDrvMdeCnt_D_Stat 4 "FourCounts" 3 "ThreeCounts" 2 "TwoCounts" 1 "OneCount" 0 "ZeroCounts" 7 "SevenOrMoreCounts" 6 "SixCounts" 5 "FiveCounts"; +VAL_ 1120 DrvSlipCtlMde_B_Rq3 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1120 HybMdeSwtch_B_Rq 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1120 TrailCtlSwtch_B_Stat3 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1120 RearDiffLck_D_RqDrv 3 "Faulty" 2 "NoRequest" 1 "On" 0 "Off"; +VAL_ 1120 AwdMde_D_RqDrv 7 "Faulty" 6 "NotUsed2" 5 "NoRequest" 4 "Neutral" 3 "FourByFourLow" 2 "FourByFourHigh" 1 "FourByFourAuto" 0 "FourByTwo"; +VAL_ 1120 HdcSwtchPos_B_Actl 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1050 AutoHoldSwtch_D_Stat 3 "Faulty" 2 "NotUsed" 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1050 LpdbPtc3_B_Rq 1 "On" 0 "Off"; +VAL_ 1050 LpdbPtc2_B_Rq 1 "On" 0 "Off"; +VAL_ 1050 LpdbPtc1_B_Rq 1 "On" 0 "Off"; +VAL_ 1050 LpdbHeatWiprPrk_B_Rq 1 "On" 0 "Off"; +VAL_ 1050 LpdbDfrstRearOn_B_Rq 1 "On" 0 "Off"; +VAL_ 1050 SteWhlHeat_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "Reserved_3" 8 "Reserved_2" 7 "Reserved_1" 6 "Level_3_Heating" 5 "Level_3_Heating_LS" 4 "Level_2_Heating" 3 "Level_2_Heating_LS" 2 "Level_1_Heating" 1 "Level_1_Heating_LS" 0 "Off"; +VAL_ 1050 MirrorHeatOn_B_Rq 1 "True" 0 "False"; +VAL_ 1050 Remote_Start_QuietMode 1 "Quiet" 0 "Not_Quiet"; +VAL_ 1050 Outside_Air_Temp_Stat 255 "Invalid" 254 "Unknown"; +VAL_ 1137 RngPerChrgAvg_L_Dsply 4095 "Faulty" 4094 "NoDataExists"; +VAL_ 1255 BalrRight4Threat_D_Stat 1 "Yes" 0 "No"; +VAL_ 1255 BalrRight4Fast_B_Stat 1 "Yes" 0 "No"; +VAL_ 1255 BalrRight4Dsply_B_Stat 1 "Yes" 0 "No"; +VAL_ 1254 BalrRight3Threat_D_Stat 1 "Yes" 0 "No"; +VAL_ 1254 BalrRight3Fast_B_Stat 1 "Yes" 0 "No"; +VAL_ 1254 BalrRight3Dsply_B_Stat 1 "Yes" 0 "No"; +VAL_ 1253 BalrRight2Threat_D_Stat 1 "Yes" 0 "No"; +VAL_ 1253 BalrRight2Fast_B_Stat 1 "Yes" 0 "No"; +VAL_ 1253 BalrRight2Dsply_B_Stat 1 "Yes" 0 "No"; +VAL_ 1252 BalrRight1Threat_D_Stat 1 "Yes" 0 "No"; +VAL_ 1252 BalrRight1Fast_B_Stat 1 "Yes" 0 "No"; +VAL_ 1252 BalrRight1Dsply_B_Stat 1 "Yes" 0 "No"; +VAL_ 1251 BalrLeft4Threat_D_Stat 1 "Yes" 0 "No"; +VAL_ 1251 BalrLeft4Fast_B_Stat 1 "Yes" 0 "No"; +VAL_ 1251 BalrLeft4Dsply_B_Stat 1 "Yes" 0 "No"; +VAL_ 1250 BalrLeft3Threat_D_Stat 1 "Yes" 0 "No"; +VAL_ 1250 BalrLeft3Fast_B_Stat 1 "Yes" 0 "No"; +VAL_ 1250 BalrLeft3Dsply_B_Stat 1 "Yes" 0 "No"; +VAL_ 1249 BalrLeft2Threat_D_Stat 1 "Yes" 0 "No"; +VAL_ 1249 BalrLeft2Fast_B_Stat 1 "Yes" 0 "No"; +VAL_ 1249 BalrLeft2Dsply_B_Stat 1 "Yes" 0 "No"; +VAL_ 1248 BalrLeft1Threat_D_Stat 1 "Yes" 0 "No"; +VAL_ 1248 BalrLeft1Fast_B_Stat 1 "Yes" 0 "No"; +VAL_ 1248 BalrLeft1Dsply_B_Stat 1 "Yes" 0 "No"; +VAL_ 1113 TrlrTrgtAcquire_D_Stat 7 "Faulty" 6 "NotUsed_2" 5 "NotUsed_1" 4 "RVCforTBA_Activated" 3 "Processing" 2 "TargetNotAcquired" 1 "TargetAcquired" 0 "Null"; +VAL_ 1113 TrlrAnOffstDir_D_Calc 3 "NotUSed" 2 "Right" 1 "Left_or_Center" 0 "Null"; +VAL_ 1113 TrlrAnCalib_B_Complt 1 "Yes" 0 "No"; +VAL_ 1113 TrlrRvrse_D_Stat 3 "Faulty" 2 "TrailerReverseGuidanceLite" 1 "On" 0 "Off"; +VAL_ 1113 TrlrAid_D2_Stat 15 "Faulty" 14 "NotUsed_4" 13 "NotUsed_3" 12 "NotUsed_2" 11 "NotUsed_1" 10 "DirtyCamera" 9 "IncorrectLighting" 8 "TrackingLost" 7 "TrackingUnknownConfidence" 6 "TrackingHighConfidence" 5 "TrackingMediumConfidence" 4 "TrackingLowConfidence" 3 "TurnRequested" 2 "DriveStraighRequested" 1 "Initializing" 0 "NotTracking"; +VAL_ 1113 TrlrAid_An3_Actl 2047 "Faulty"; +VAL_ 1113 TrlrAid_AnRate2_Actl 1023 "Faulty"; +VAL_ 1113 HitchToVehAxle_L_Calc 255 "Faulty"; +VAL_ 1105 TrlrAidSwtchLamp_B_Rq 1 "On" 0 "Off"; +VAL_ 1105 TrlrHitchMsgTxt_D_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage" 63 "Message63" 47 "Message47"; +VAL_ 1105 TrlrHitchIcon_D_Rq 15 "Icon15" 14 "Icon14" 13 "Icon13" 12 "Icon12" 11 "Icon11" 10 "Icon10" 9 "Icon9" 8 "Icon8" 7 "Icon7" 6 "Icon6" 5 "Icon5" 4 "Icon4" 3 "Icon3" 2 "Icon2" 1 "Icon1" 0 "NoIcon"; +VAL_ 1105 TrlrHitchChime_D_Rq 7 "NotUsed_1" 6 "NotUsed_1" 5 "WarningChime" 4 "NonCriticalAlertChime" 3 "StopNowChime" 2 "ManeuveringReadyChime" 1 "TrailerFoundChime" 0 "NoChime"; +VAL_ 1105 TrlrAidEnbl_D_RqAdas 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "Deactivate" 2 "NotAvailable" 1 "ActiveTba" 0 "Inactive"; +VAL_ 1105 TrlrRvrseMsgTxt_D2_Rq 31 "Message31" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 1105 TrlrRvrseEnbl_D2_Stat 7 "NotUsed" 6 "TbaActiveExpertActive" 5 "TbaActiveExpertAvail" 4 "TbaOffTrgActive" 3 "TbaOffTrgSetup" 2 "TbaSetup" 1 "TbaActive" 0 "Inactive"; +VAL_ 1105 RbaMsg_D_Rq 3 "Faulty" 2 "Unavailable" 1 "Off" 0 "Null"; +VAL_ 1105 BrkDecel_B_RqRba 1 "Enable" 0 "Disable"; +VAL_ 1105 BrkEnbl_B_RqRba 1 "Enable" 0 "Disable"; +VAL_ 1105 Rba_D_Stat 3 "NotUsed" 2 "Disabled" 1 "On" 0 "Off"; +VAL_ 1105 RbaAlrt_D_Dsply 3 "Both" 2 "Text" 1 "Graphic" 0 "Off"; +VAL_ 1105 RbaMnu_D_Rq 3 "NotUsed" 2 "Active" 1 "Inactive" 0 "None"; +VAL_ 1105 CamraFrntStat_D_Stat 3 "No_Data_Present" 2 "NotUsed" 1 "On" 0 "Off"; +VAL_ 1105 TrlrHitchLamp_D_Rq2 1 "On" 0 "Off"; +VAL_ 938 SidePrkSnsR2_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_ 938 SidePrkSnsR1_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_ 938 SidePrkSnsL2_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_ 938 ApaMde_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "POA" 3 "PPA" 2 "SAPP" 1 "Off" 0 "Null"; +VAL_ 938 ApaActvSd_D_Actl 3 "Dirver_Side" 2 "Passenger_Side" 1 "No_Side" 0 "Null"; +VAL_ 938 PrkAidSwtch_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 938 ApaMde_D_Avail 15 "NotUsed7" 14 "NotUsed6" 13 "NotUsed5" 12 "NotUsed4" 11 "NotUsed3" 10 "NotUsed2" 9 "NotUsed1" 8 "PPA_POA" 7 "SAPP_POA" 6 "POA" 5 "PPA" 4 "SAPP" 3 "SAPP_PPA_POA" 2 "SAPP_PPA" 1 "None" 0 "Null"; +VAL_ 938 PrkAidSnsFrCrnr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_ 938 PrkAidSnsFrCntr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_ 938 PrkAidSnsFlCrnr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_ 938 PrkAidSnsFlCntr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_ 938 PrkBrkEl_B_RqFap 1 "Yes" 0 "No"; +VAL_ 938 RpaChime_D_Rq 15 "Zone15_Chime" 14 "Zone14_Chime" 13 "Zone13_Chime" 12 "Zone12_Chime" 11 "Zone11_Chime" 10 "Zone10_Chime" 9 "Zone9_Chime" 8 "Zone8_Chime" 7 "Zone7_Chime" 6 "Zone6_Chime" 5 "Zone5_Chime" 4 "Zone4_Chime" 3 "Zone3_Chime" 2 "Zone2_Chime" 1 "Zone1_Chime" 0 "No_Chime"; +VAL_ 938 FpaChime_D_Rq 15 "Zone15_Chime" 14 "Zone14_Chime" 13 "Zone13_Chime" 12 "Zone12_Chime" 11 "Zone11_Chime" 10 "Zone10_Chime" 9 "Zone9_Chime" 8 "Zone8_Chime" 7 "Zone7_Chime" 6 "Zone6_Chime" 5 "Zone5_Chime" 4 "Zone4_Chime" 3 "Zone3_Chime" 2 "Zone2_Chime" 1 "Zone1_Chime" 0 "No_Chime"; +VAL_ 938 PrkAidMsgTxt_D_Rq 15 "All_Sns_Blk" 14 "R_Sns_ON_F_Sns_Blk" 13 "R_Sns_Blk_F_Sns_ON" 12 "R_Sns_Inactive_Trlr_atch" 11 "Not_Avail_Trlr_attchd" 10 "Fail_Mode_no_Chime" 9 "Fail_Mode_with_Chime" 8 "R_Sns_Trlr_F_Sns_Blk" 7 "NotUsed3" 6 "Park_Sys_Alternate_Mode" 5 "R_Snsrs_On_F_Snsrs_On" 4 "NotUsed2" 3 "Reset_Message_Warn" 2 "R_Snsrs_Off_F_Snsrs_On" 1 "R_Snsrs_On_F_Snsrs_Off" 0 "All_Park_Sensors_Off"; +VAL_ 938 SidePrkSnsL1_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_ 938 PrkAidAudioMute_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 939 ApaBrk_D_Rq 3 "NotUsed" 2 "LowDecel" 1 "HighDecel" 0 "NoRequest"; +VAL_ 939 SidePrkSnsR4_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_ 939 SidePrkSnsR3_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_ 939 SidePrkSnsL4_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_ 939 SidePrkSnsL3_D_Stat 15 "NotUsed" 14 "NotFullyScannedYet" 13 "NoObjectInSector" 12 "Zone12" 11 "Zone11" 10 "Zone10" 9 "Zone9" 8 "Zone8" 7 "Zone7" 6 "Zone6" 5 "Zone5" 4 "Zone4" 3 "Zone3" 2 "Zone2" 1 "Zone1" 0 "Off"; +VAL_ 939 PrkAidChime_D_Stat 3 "Fault" 2 "No_Data_Exists" 1 "On" 0 "Off"; +VAL_ 939 PrkAidSnsRlCntr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_ 939 PrkAidSnsRrCrnr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_ 939 PrkAidSnsRrCntr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_ 939 PrkAidSnsRlCrnr_D_Stat 15 "Zone_15" 14 "Zone_14" 13 "Zone_13" 12 "Zone_12" 11 "Zone_11" 10 "Zone_10" 9 "Zone_9" 8 "Zone_8" 7 "Zone_7" 6 "Zone_6" 5 "Zone_5" 4 "Zone_4" 3 "Zone_3" 2 "Zone_2" 1 "Zone_1" 0 "Off"; +VAL_ 939 PrkAidRear_D_Stat 3 "Faulted" 2 "Unused" 1 "Enabled" 0 "Disabled"; +VAL_ 939 PrkAidFront_D_Stat 3 "Faulted" 2 "Unused" 1 "Enabled" 0 "Disabled"; +VAL_ 939 PrkAid_D_Falt 7 "NotUsed2" 6 "NotUsed1" 5 "Failure_Front_PSM_Sensors" 4 "No_Data_Exists" 3 "Failure_Rear_Sensors" 2 "Speaker_Fault" 1 "ECU_Fault" 0 "No_Fault"; +VAL_ 939 ApaLongCtrlEnbl_D_Rq 1 "Enable" 0 "Disable"; +VAL_ 939 PrkAidLamp_D_Rq 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 937 TrnRng_D_RqFap 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Backwards" 3 "Forwards" 2 "NoMotion" 1 "Immobilize" 0 "NoRequest"; +VAL_ 937 FapLcDistToObj_L_Actl 255 "Faulty" 254 "NoDataExists"; +VAL_ 936 ApaButtnPrssd_B_Stat 1 "Pressed" 0 "Not_Pressed"; +VAL_ 936 ApaSys_D_Stat 7 "Faulty" 6 "Finished" 5 "NotAccessible" 4 "ApaCancelled" 3 "Overspeed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 936 ApaSteWhl_D_RqDrv 3 "TakeControl" 2 "RemoveHands" 1 "NoRequest" 0 "Null"; +VAL_ 936 ApaSteScanMde_D_Stat 3 "Steering" 2 "Scanning" 1 "NotScanning" 0 "Null"; +VAL_ 936 ApaSelSapp_D_Stat 3 "NotConfigured" 2 "NotSelectable" 1 "Selectable" 0 "Null"; +VAL_ 936 ApaSelPpa_D_Stat 3 "NotConfigured" 2 "NotSelectable" 1 "Selectable" 0 "Null"; +VAL_ 936 ApaSelPoa_D_Stat 3 "NotConfigured" 2 "NotSelectable" 1 "Selectable" 0 "Null"; +VAL_ 936 ApaScan_D_Stat 3 "ParkSlotReady" 2 "ParkSlotFound" 1 "NoParkSlot" 0 "Null"; +VAL_ 936 ApaLongCtl_D_RqDrv 7 "NotUsed3" 6 "NotUsed2" 5 "ReleaseBrake" 4 "DriveBackward" 3 "DriveForward" 2 "Stop" 1 "NoRequest" 0 "Null"; +VAL_ 936 ApaGearShif_D_RqDrv 7 "NotUSed2" 6 "NotUsed1" 5 "ShiftToP" 4 "ShiftToN" 3 "ShiftToD" 2 "ShiftToR" 1 "NoRequest" 0 "Null"; +VAL_ 936 ApaActvSide2_D_Stat 3 "NoSide" 2 "Right" 1 "Left" 0 "Null"; +VAL_ 936 ApaAcsy_D_RqDrv 7 "CloseDoor" 6 "SelectSideRight" 5 "SelectSideLeft" 4 "CheckForObject" 3 "PressApaButton" 2 "SelectSide" 1 "NoRequest" 0 "Null"; +VAL_ 936 ApaTrgtDist_D_Stat 15 "Step15" 14 "Step14" 13 "Step13" 12 "Step12" 11 "Step11" 10 "Step10" 9 "Step9" 8 "Step8" 7 "Step7" 6 "Step6" 5 "Step5" 4 "Step4" 3 "Step3" 2 "Step2" 1 "Step1" 0 "Off"; +VAL_ 936 ApaChime_D_Rq 7 "NotUsed2" 6 "NotUsed1" 5 "Warning_Chime" 4 "Finish_Chime" 3 "Stop_Now_Chime" 2 "Spot_Ready_Chime" 1 "Spot_Found_Chime" 0 "No_Chime"; +VAL_ 936 EPASExtAngleStatReq 1 "Request" 0 "NoRequest"; +VAL_ 936 ExtSteeringAngleReq2 32767 "Invalid" 32766 "Unknown"; +VAL_ 877 VehElEffAvg_No_Dsply 127 "Faulty" 126 "NoDataExists"; +VAL_ 877 PwFlwFuelDrv_D_Dsply 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "FlwFromFuelToAllWhls" 2 "FlwFromFuelToFrontWhls" 1 "FlwFromFuelToRearWhls" 0 "NoFlow"; +VAL_ 877 PwFlwFuelClimt_B_Dsply 1 "On" 0 "Off"; +VAL_ 877 PwFlwFuelBatt_B_Dsply 1 "On" 0 "Off"; +VAL_ 877 PwFlwBattClimt_B_Dsply 1 "On" 0 "Off"; +VAL_ 877 PwFlwBatt_D_Dsply 15 "NotUsed_8" 14 "NotUsed_7" 13 "NotUsed_6" 12 "NotUsed_5" 11 "NotUsed_4" 10 "NotUsed_3" 9 "NotUsed_2" 8 "NotUsed_1" 7 "FlwFromWallToBatt" 6 "FlwFromAllWhlsToBatt" 5 "FlwFromBattToAllWhls" 4 "FlwFromFrontWhlsToBatt" 3 "FlwFromBattToFrontWhls" 2 "FlwFromRearWhlsToBatt" 1 "FlwFromBattToRearWhls" 0 "NoFlow"; +VAL_ 588 BattTracSoc2_Pc_Actl 16383 "Faulty" 16382 "NoDataExists"; +VAL_ 588 BattTrac_Te_Actl 1023 "Fault" 1022 "Unknown"; +VAL_ 588 BattTracDiagClr_B_Rq 1 "On" 0 "Off"; +VAL_ 587 BattTracWarnLamp_B_Rq 1 "On" 0 "Off"; +VAL_ 587 BattTracSrvcRqd_B_Rq 1 "On" 0 "Off"; +VAL_ 389 HtrnOvrTeLamp_B_Dsply 1 "On" 0 "Off"; +VAL_ 389 HtrnMil_D_Rq 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 389 HtrnAin_UHi_Actl 1023 "Fault" 1022 "Unknown"; +VAL_ 389 HtrnSrvcRqd_B_Dsply 1 "On" 0 "Off"; +VAL_ 389 HtrnHvilOpen_B_Actl 1 "HVIL_is_Open" 0 "Normal_Operation"; +VAL_ 389 PtWakeupDeltaT_T_Rq 2047 "Fault" 2046 "NoDataExists"; +VAL_ 389 PreCondActv_B_Actl 1 "On" 0 "Off"; +VAL_ 389 DrvCondTpRrDefrs_B_Rq 1 "On" 0 "Off"; +VAL_ 389 BattTrac_I_EstVsc 32767 "Fault" 32766 "NoDataExists"; +VAL_ 1009 ChrgCordUnlock_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 1009 AutoHoldSwtch_D_Stat3 3 "Faulty" 2 "NotUsed" 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1009 TrlrTrgtAcquire_D_Rq 7 "NotUsed_2" 6 "NotUsed_1" 5 "ActivateRVCforTBA" 4 "CancelAcquisition" 3 "RetryAcquisition" 2 "AcquisitionSuccessful" 1 "StartAcquisition" 0 "Inactive"; +VAL_ 1009 TrlrAidCancl_B_Rq 1 "Cancel" 0 "Null"; +VAL_ 1009 CenterStackRing_D_Actl 3 "LimitedOn" 2 "On" 1 "Off" 0 "Null"; +VAL_ 1009 ValetMode_D_Stat 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 1009 TrlrAidSetup_D_Stat 7 "Faulty" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "EnterParameters" 2 "EndSetup" 1 "BeginSetup" 0 "Null"; +VAL_ 360 GsmSrvcRqd_B_Rq 1 "Yes" 0 "No"; +VAL_ 360 TrnGearPwmFalt_B_Actl 1 "Yes" 0 "No"; +VAL_ 360 GearButtnStuck_B_Actl 1 "Yes" 0 "No"; +VAL_ 122 VehStrtInhbt_B_RqBatt 1 "Yes" 0 "No"; +VAL_ 122 BattTracOffFst_D_Actl 3 "Unexpected_Contactor_Open" 2 "Restraints_Impact_Event" 1 "Interlock_Open" 0 "Normal"; +VAL_ 122 BattTracOff_B_Actl 1 "Yes" 0 "No"; +VAL_ 122 BattTracMil_D_Rq 3 "Not_Used" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 122 BattTrac_U_Actl 1023 "Fault" 1022 "Unknown"; +VAL_ 122 BattTrac_I_Actl 32767 "Fault" 32766 "Unknown"; +VAL_ 90 TrnGsmNtmState_D_Actl 3 "Faulty" 2 "Neutral_Tow_Mode" 1 "Car_Wash_Mode" 0 "None"; +VAL_ 90 DrQltyDrv_D_StatGsm 7 "Faulty" 6 "NoDataExists" 5 "NotUsed2" 4 "NotUsed1" 3 "ClosedDegraded" 2 "OpenDegraded" 1 "ClosedOkay" 0 "OpenOkay"; +VAL_ 90 TrnBtsiOvrrd_B_Stat 1 "Override" 0 "Null"; +VAL_ 90 GsmGearMsgTxt_D_Rq 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 90 TrnRng_D_RqGsm 15 "Fault" 14 "UnknownPosition" 13 "Undefined_2" 12 "Undefined_1" 11 "_6" 10 "_5" 9 "_4" 8 "_3" 7 "_2" 6 "_1" 5 "Low" 4 "Sport_DriveSport" 3 "Drive" 2 "Neutral" 1 "Reverse" 0 "Park"; +VAL_ 90 PrkBrkActv_D_RqGsmGear 3 "NotUsed" 2 "RequestParkBrakeEngage" 1 "NoRequest" 0 "Null"; +VAL_ 90 TrnValidGearRq_D_Stat 3 "Valid_Request" 2 "Valid_Degraded_Request" 1 "Invalid_Request" 0 "No_Request"; +VAL_ 90 TrnGearButtn_U_Actl 255 "Fault"; +VAL_ 90 TrnGearButtn_B_ActlR2 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlR1 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlR0 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlP2 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlP1 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlP0 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlN2 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlN1 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlN0 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlM2 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlM1 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlM0 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlD2 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlD1 1 "Yes" 0 "No"; +VAL_ 90 TrnGearButtn_B_ActlD0 1 "Yes" 0 "No"; +VAL_ 90 TrnGear_D_RqDrv 31 "Fault" 30 "NotUsed_25" 29 "NotUsed_24" 28 "NotUsed_23" 27 "NotUsed_22" 26 "Return_to_Park" 25 "NotUsed_20" 24 "NotUsed_19" 23 "NotUsed_18" 22 "NotUsed_17" 21 "Return_To_Park" 20 "NotUsed_15" 19 "NotUsed_14" 18 "NotUsed_13" 17 "NotUsed_12" 16 "Manual" 15 "Not_Used11" 14 "Not_Used10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "Drive" 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "Neutral" 3 "NotUsed_1" 2 "Reverse" 1 "Park" 0 "No_Gear"; +VAL_ 90 BrkSwtchPos_B_ActlGsm 1 "Yes" 0 "No"; +VAL_ 1091 ParkLampTrlrOut_B_Stat 1 "Out" 0 "Null"; +VAL_ 1091 TrlrLampCtl_D_Stat 3 "NotUsed" 2 "TrlrLampCnnctDrvFailure" 1 "TrlrLampNotCnnctDrvFailure" 0 "Null"; +VAL_ 1091 TrlrBattChrg_D_Stat 3 "Reverse" 2 "Normal" 1 "Low" 0 "Null"; +VAL_ 1091 StopLampTrlrOut_B_Stat 1 "Out" 0 "Null"; +VAL_ 1091 TurnLampTrlrRr_B_Stat 1 "Out" 0 "Null"; +VAL_ 1091 TurnLampTrlrRl_B_Stat 1 "Out" 0 "Null"; +VAL_ 1091 TrlrLampCnnct_B_Actl 1 "Yes" 0 "No"; +VAL_ 138 SteWhlRelCalib_An_Sns 32767 "Fault" 32766 "NoDataExists"; +VAL_ 131 AccButtnGapDecPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 HeadLghtHiCtrl_D_RqAhb 7 "NotUsed2" 6 "NotUsed1" 5 "Auto_HiBeam" 4 "Auto_LoBeam" 3 "Flash" 2 "Man_HiBeam" 1 "Man_LoBeam" 0 "Null"; +VAL_ 131 AhbStat_B_Dsply 1 "On" 0 "Off"; +VAL_ 131 WiprFrontSwtch_D_Stat 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "PositionNotDetermined" 8 "High" 7 "Low" 6 "Position6" 5 "Position5" 4 "Position4" 3 "Position3" 2 "Position2" 1 "Position1" 0 "Off"; +VAL_ 131 HeadLghtHiOn_B_StatAhb 1 "On" 0 "Off"; +VAL_ 131 HeadLghtHiFlash_D_Actl 3 "NotUsed" 2 "High" 1 "Flash_to_Pass" 0 "Null"; +VAL_ 131 TjaButtnOnOffPress 1 "Pressed" 0 "Not_Pressed"; +VAL_ 131 AccButtnGapTogglePress 1 "Pressed" 0 "Not_Pressed"; +VAL_ 131 HeadLghtHiFlash_D_Stat 3 "NotUsed" 2 "High" 1 "Flash_to_Pass" 0 "Null"; +VAL_ 131 WiprFront_D_Stat 15 "NO_DATA_EXISTS" 14 "STALLED" 13 "RESERVED" 12 "AUTO_ADJUST" 11 "COURTESYWIPE" 10 "AUTO_HIGH" 9 "AUTO_LOW" 8 "WASH" 7 "MIST_FLICK" 6 "MAN_HIGH" 5 "MAN_LOW" 4 "MAN_INT_ON" 3 "MAN_INT_OFF" 2 "OFF_MOVING" 1 "AUTO_OFF" 0 "OFF"; +VAL_ 131 TurnLghtSwtch_D_Stat 3 "Unused_Treat_As_Off" 2 "Right" 1 "Left" 0 "Off"; +VAL_ 131 LghtAmb_D_Sns 7 "No_Data_Exists" 6 "Unused2" 5 "Unused1" 4 "Tunnel_Off" 3 "Tunnel_On" 2 "Twilight" 1 "Light" 0 "Dark"; +VAL_ 131 AccButtnGapIncPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 AslButtnOnOffPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 AslButtnOnOffCnclPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcButtnOnPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcButtnOnOffPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcButtnOnOffCnclPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcButtnOffPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAsllButtnResPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnSetPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnSetIncPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnSetDecPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnResIncPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnResDecPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnOnPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnOnOffCncl 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnOffCnclPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnIndxIncPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnIndxDecPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnDeny_B_Actl 1 "Yes" 0 "No"; +VAL_ 131 CcAslButtnCnclResPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 CcAslButtnCnclPress 1 "Button_Pressed" 0 "Button_Not_Pressed"; +VAL_ 131 LaSwtchPos_D_Stat 3 "Fault" 2 "Unused" 1 "Pressed" 0 "Open"; +VAL_ 787 DrTgateChime2_D_Rq 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Long_Repeated" 3 "Fast" 2 "Short" 1 "Long" 0 "Off"; +VAL_ 787 DrTGate_D_Rq 3 "NotUsed" 2 "Closing" 1 "Opening" 0 "Not_Moving"; +VAL_ 787 PwLftgtIntSw_B_Stat 1 "Pressed" 0 "Null"; +VAL_ 787 Power_Liftgate_Mode_Stt 2 "Unused" 3 "Not_Supported" 1 "Enabled" 0 "Disabled"; +VAL_ 953 BattRgenLoDChrg_D_Rq 3 "DoNotCare" 2 "Retain" 1 "Closed" 0 "Open"; +VAL_ 953 BattRgenLoChrg_D_Rq 3 "DoNotCare" 2 "Retain" 1 "Closed" 0 "Open"; +VAL_ 953 ChrgCordLck_B_Stat 1 "Unlock" 0 "Null"; +VAL_ 953 WakeAlarm3_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff"; +VAL_ 953 WakeAlarm2_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff"; +VAL_ 953 WakeAlarm1_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff"; +VAL_ 953 WakeAlarm0_D_Stat 3 "PublisherReset" 2 "Wake" 1 "AlarmRunning" 0 "AlarmOff"; +VAL_ 1093 TrlBrkInitOut_D_Stat 3 "Heavy" 2 "Medium" 1 "Light" 0 "Null"; +VAL_ 1093 TrlrBrkMde_D_Actl 1 "Electric_Over_Hydraulic" 0 "Electric"; +VAL_ 1093 TrlrBrkDsply_B_Rq 1 "Yes" 0 "No"; +VAL_ 1093 TrlrBrkDcnnt_B_Actl 1 "Yes" 0 "No"; +VAL_ 1093 TrlrBrkActCnnct_B_Actl 1 "Yes" 0 "No"; +VAL_ 1093 StopLamp_B_RqTrlrBrk 1 "Yes" 0 "No"; +VAL_ 1093 TrlrBrkCtl_B_Falt 1 "Yes" 0 "No"; +VAL_ 1093 TrlrBrkActCirct_B_Falt 1 "Yes" 0 "No"; +VAL_ 792 ElTrip_L_Dsply 65535 "Fault" 65534 "No_Data_Exists"; +VAL_ 792 ElLongTerm_L_Dsply 16777215 "Fault" 16777214 "No_Data_Exists"; +VAL_ 968 SlMde_D_Rq 3 "IsaNotConfigured" 2 "Manual_Mode" 1 "Auto_Mode" 0 "Null"; +VAL_ 968 IsaOffst_D_Rq 15 "Faulty" 14 "Null" 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero"; +VAL_ 819 Memory_3_SwPsngr_Stat 1 "Pressed" 0 "Null"; +VAL_ 819 Memory_2_SwPsngr_Stat 1 "Pressed" 0 "Null"; +VAL_ 819 Memory_1_SwPsngr_Stat 1 "Pressed" 0 "Null"; +VAL_ 819 BLISLEDStatPassSide 3 "Fault" 2 "Unused" 1 "On" 0 "Off"; +VAL_ 819 WndwPsngrSide_D_Stat 3 "BothWindow_Operating" 2 "RearWindow_Operating" 1 "FrontWindow_Operating" 0 "NoWindows_Operating"; +VAL_ 819 Pasngr_Lock_Sw_Stat 3 "Invalid" 2 "Unlock" 1 "Lock" 0 "Null"; +VAL_ 819 ChildLckFdbckRp_B_Stat 1 "Locked" 0 "Unlock"; +VAL_ 818 BLISLEDStatDriverSide 3 "Fault" 2 "Unused" 1 "On" 0 "Off"; +VAL_ 818 WndwDrvSide_D_Stat 3 "BothWindow_Operating" 2 "RearWindow_Operating" 1 "FrontWindow_Operating" 0 "NoWindows_Operating"; +VAL_ 818 KeyCylSwDrvDr_D_Stat 3 "NotUsed" 2 "Unlock" 1 "Lock" 0 "Null"; +VAL_ 818 Driver_Lock_Sw_Stat 3 "Invalid" 2 "Unlock" 1 "Lock" 0 "Null"; +VAL_ 818 ChildLckPw_D_Rq 1 "Active" 0 "Null"; +VAL_ 818 ChildLckFdbckRd_B_Stat 1 "Locked" 0 "Unlock"; +VAL_ 818 RvrseMirrorChime_B_Rq 1 "Yes" 0 "No"; +VAL_ 806 SnowPlowMde_B_Enbl 1 "Enable" 0 "Disable"; +VAL_ 806 StopStrtDrvMde_B_RqBtn 1 "Pressed" 0 "Not_Pressed"; +VAL_ 806 ClimtHeat_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "PtcHtrTestMde" 3 "Defrost_Defog" 2 "FastTempPullDownHeatingReq" 1 "OpportunisticHeatingReq" 0 "NoHeatingRequest"; +VAL_ 806 ClimtCool_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "ElACTestMde" 3 "Defrost_Defog" 2 "FastTempPullDownCoolReq" 1 "OpportunisticCoolingReq" 0 "NoCoolingRequest"; +VAL_ 806 HvacEvap_Te_Actl 1023 "Fault"; +VAL_ 806 HvacAirCond_B_Rq 1 "Yes" 0 "No"; +VAL_ 806 ClimtPw_B_Rq 1 "Yes" 0 "No"; +VAL_ 765 Mc_VehTimeFrmtUsrSel_St 2 "24h_mode" 1 "12h_mode" 0 "Invalid"; +VAL_ 765 Running_Board_Cmd 3 "Unused" 2 "Manually_Deployed" 1 "All_Enabled" 0 "All_Disabled"; +VAL_ 765 EngExhMdeQuiet_D2_Rq 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Track" 3 "Sport" 2 "Normal" 1 "Stealth" 0 "Null"; +VAL_ 765 EdmSailMde_B_RqDrv 1 "On" 0 "Off"; +VAL_ 765 DrvInputRequired_B_Rq 1 "Yes" 0 "No"; +VAL_ 765 AwdRnge_D_ActlIpc 7 "Unknown" 6 "High_Range_2wd" 5 "High_Range_Auto" 4 "High_Range_Locked" 3 "Neutral" 2 "Low_Range_2wd" 1 "Low_Range_Auto" 0 "Low_Range_Locked"; +VAL_ 765 BalrSwtch_D_Stat 3 "NotUsed" 2 "Pressed" 1 "NotPressed" 0 "Null"; +VAL_ 765 BalrMde_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Null"; +VAL_ 765 WaitToStartLamp_D_Falt 3 "NotUsed" 2 "Wait_to_start_lamp_failed" 1 "Diagnosis_not_ready" 0 "Wait_to_start_lamp_OK"; +VAL_ 765 EsaOn_B_Rq 1 "On" 0 "Off"; +VAL_ 765 BttOn_B_Rq 1 "On" 0 "Off"; +VAL_ 765 Btt_L_Actl 127 "Faulty" 126 "NoDataExists"; +VAL_ 765 SelDrvMdeTxtReset_B_Rq 1 "Yes" 0 "No"; +VAL_ 765 SelDrvMdeDsply_B_Avail 1 "Available" 0 "NotAvailable"; +VAL_ 765 Mc_VehUntTrpCoUsrSel_St 0 "TripComputer_metric" 1 "TripComputer_imperial"; +VAL_ 765 Mc_VehUnitTempUsrSel_St 0 "Temperature_deg_c" 1 "Temperature_deg_f"; +VAL_ 765 Mc_VehLangUsrSel_St 30 "Slovak" 29 "Arabic" 28 "Cantonese" 27 "Mandarin_Chinese" 26 "Korean" 25 "Japanese_Kanji" 24 "Japanese_Katakana" 23 "Braz_Portuguese" 22 "EU_Portuguese" 21 "Finish" 20 "Norwegian" 19 "Danish" 18 "Swedish" 17 "Hungarian" 16 "Greek" 15 "Czech" 14 "Polish" 13 "Flemish" 12 "Dutch" 11 "Russian" 10 "Turkish" 9 "Mex_Spanish" 8 "EU_Spanish" 7 "Cana_French" 6 "EU_French" 5 "Italian" 4 "German" 3 "NA_English" 2 "UK_English" 1 "Unknown" 0 "Invalid"; +VAL_ 934 CtaAlrtLeft2_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "AlertZone4" 3 "AlertZone3" 2 "AlertZone2" 1 "AlertZone1" 0 "Off"; +VAL_ 934 CtaBrkLeftMsgTxt_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 934 CtaLeftBrkDecel_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 934 CtaLeftBrkEnbl_B_Rq 1 "Enable" 0 "Disable"; +VAL_ 934 BttLeft_D_Stat 7 "NotUsed" 6 "Disabled" 5 "Off" 4 "OffTemp" 3 "NotConnected" 2 "Pending" 1 "Connected" 0 "NotDetermined"; +VAL_ 934 BttLeft_D_RqDrv 3 "NotUsed" 2 "Request" 1 "NoRequest" 0 "Null"; +VAL_ 934 CtaSnsLeft_D_Stat 3 "Invalid" 2 "System_Failure" 1 "Blocked" 0 "Clear"; +VAL_ 934 SodDetctLeft_D_Stat 4 "Sensor_Blocked" 3 "Sensor_Fault" 2 "Flash_On" 1 "Alert_On" 0 "AlertOff_FlashOff_SensrClr"; +VAL_ 934 CtaLeft_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off"; +VAL_ 934 CtaAlrtLeft_D_Stat 1 "On" 0 "Off"; +VAL_ 934 SodLeft_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "Invalid" 3 "Disabled" 2 "On" 1 "Trailer_Tow_Off" 0 "Off"; +VAL_ 934 SodSnsLeft_D_Stat 3 "Second_Warning_Audio" 2 "System_Failure" 1 "Blocked" 0 "Clear"; +VAL_ 934 SodAlrtLeft_D_Stat 3 "Bulb_Proveout" 2 "Flash" 1 "On" 0 "Off"; +VAL_ 1072 LscmbbStat_B_Actl 1 "On" 0 "Off"; +VAL_ 1072 HaDsplyCpblty_B_Stat 1 "Available" 0 "NotAvailable"; +VAL_ 1072 AccDeny_B_RqIpc 1 "Yes" 0 "No"; +VAL_ 1072 DrvSlipCtlMde_D_Rq 3 "App_Specific_Off_Mode_3" 2 "App_Specific_Off_Mode_2" 1 "App_Specific_Off_Mode_1" 0 "Default_Mode"; +VAL_ 1072 EngIdlShutDown_B_RqDrv 1 "Inhibit" 0 "No_Inibit"; +VAL_ 1072 HsaMde_D_Rq 3 "Undefined" 2 "Manual" 1 "Automatic" 0 "Off"; +VAL_ 1072 NtrlTowMdeEnbl_B_RqDrv 1 "Yes" 0 "No"; +VAL_ 1072 BulbChkActv_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 1072 ParkDetect_Stat 1 "Park" 0 "Not_Park"; +VAL_ 1072 ReducedGuard_D_Rq 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 1072 TrlrBrkMde_D_Rq 1 "ElectricOverHydraulic" 0 "Electric"; +VAL_ 1072 TRLR_SWAY_CONFIG_CMD 1 "On" 0 "Off"; +VAL_ 1072 TRAILER_BRAKE_CONFIG 1 "Yes" 0 "No"; +VAL_ 1072 Power_Liftgate_Mode_Cmd 1 "Enable" 0 "Disable"; +VAL_ 1072 AccEnbl_B_RqDrv 1 "Adaptive_Cruise" 0 "Normal_Cruise"; +VAL_ 1072 OdometerMasterValue 16777215 "Invalid"; +VAL_ 1072 EngOilLife_B_RqReset 1 "Yes" 0 "No"; +VAL_ 1072 ePRNDL_MODE 1 "On" 0 "Off"; +VAL_ 1072 DrvSlipCtlMde_B_Rq2 1 "Pressed" 0 "Not_Pressed"; +VAL_ 1072 MetricActv_B_Actl 1 "Active" 0 "Inactive"; +VAL_ 1072 KeyTypeChngMykey_D_Rq 3 "Search_PE_BackupSlot" 2 "Clear_All_MyKeys" 1 "Request_New_MyKey" 0 "None"; +VAL_ 1072 ManRgen_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "CustInitManExhFilterClean" 0 "No_Customer_Request"; +VAL_ 909 IgnPsswrdDsply_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 909 ElPwPoint_D_Rq 3 "On" 2 "Off2" 1 "Off1" 0 "Null"; +VAL_ 909 PoliceIdlMde_D_Stat 15 "NotUsed_7" 14 "NotUsed_6" 13 "NotUsed_5" 12 "NotUsed_4" 11 "NotUsed_3" 10 "NotUsed_2" 9 "PepsActive" 8 "Decommissioned" 7 "ActiveFault" 6 "ArmFault" 5 "PrearmedFault" 4 "OffFault" 3 "Active" 2 "Arm" 1 "Prearmed" 0 "Off"; +VAL_ 909 DrLatchMsgTxt_D_Rq 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 909 SecurityMsgTxt_D_Rq 3 "Message3" 2 "Message2" 1 "Message1" 0 "NoMessage"; +VAL_ 909 PrmtrAlrmEvnt_D_Stat 15 "Diag_Tamper" 14 "Trailer" 13 "Shock_Sensor" 12 "Post_Crash" 11 "Panic" 10 "Intrusion" 9 "Inclination" 8 "Ign_Tamper" 7 "LG_Door" 6 "Decklid" 5 "Hood" 4 "PR_Door" 3 "PF_Door" 2 "DR_Door" 1 "DF_Door" 0 "Null"; +VAL_ 909 HeadLghtHiPrmsn_D_Stat 3 "CancelAndSuppress" 2 "Cancel" 1 "Hold" 0 "AllowChange"; +VAL_ 909 SteWhlLckMsgTxt_D_Rq 3 "NotUsed" 2 "Message_2" 1 "Message_1" 0 "No_Message"; +VAL_ 909 immoMsgTxt_D_Rq 15 "Immo_Msg_15" 14 "Immo_Msg_14" 13 "Immo_Msg_13" 12 "Immo_Msg_12" 11 "Immo_Msg_11" 10 "Immo_Msg_10" 9 "Immo_Msg_9" 8 "Immo_Msg_8" 7 "Immo_Msg_7" 6 "Immo_Msg_6" 5 "Immo_Msg_5" 4 "Immo_Msg_4" 3 "Immo_Msg_3" 2 "Immo_Msg_2" 1 "Immo_Msg_1" 0 "Immo_Msg_0_Null"; +VAL_ 909 PrsnlDevcChrgEnbl_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 909 TracKeyMde_D_Stat 3 "NotUsed" 2 "NotActive" 1 "Active" 0 "ModeNotDetermined"; +VAL_ 909 PEBackupSlot_Stats 3 "No_Valid_FOB_In_Slot" 2 "MyKey_FOB_In_Slot" 1 "Standard_FOB_In_Slot" 0 "Null"; +VAL_ 909 KeyMykeyTot_No_Cnt 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero" 15 "Invalid" 14 "Unlimited"; +VAL_ 909 KeyAdmnTot_No_Cnt 13 "Thirteen" 12 "Twelve" 11 "Eleven" 10 "Ten" 9 "Nine" 8 "Eight" 7 "Seven" 6 "Six" 5 "Five" 4 "Four" 3 "Three" 2 "Two" 1 "One" 0 "Zero" 15 "Invalid" 14 "Unlimited"; +VAL_ 963 Illuminated_Entry_Stat 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off"; +VAL_ 963 Dr_Courtesy_Light_Stat 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off"; +VAL_ 963 Courtesy_Delay_Status 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off"; +VAL_ 963 ImpactEvntFdbck_D_Stat 3 "NotUsed" 2 "EventComplete" 1 "EventInProgress" 0 "Normal"; +VAL_ 963 WrlssAcsyChrgInhbt_B_Rq 1 "Yes" 0 "No"; +VAL_ 963 PudLampPsngr_D_Rq 3 "Ramp_Down" 2 "Ramp_Up" 1 "On" 0 "Off"; +VAL_ 963 HeadLampLoOut_B_Stat 1 "Out" 0 "Null"; +VAL_ 963 HeadLghtHiFdbck_D_Stat 3 "NotUsed" 2 "Cancel" 1 "Hold" 0 "Allow_Change"; +VAL_ 963 PudLampDrv_D_Rq 3 "Ramp_Down" 2 "Ramp_Up" 1 "On" 0 "Off"; +VAL_ 963 TrnNotInPrkChime_B_Rq 1 "On" 0 "Off"; +VAL_ 963 PrkLightChime_B_Rq 1 "On" 0 "Off"; +VAL_ 963 KeyInIgnWarn_B_Cmd 1 "On" 0 "Off"; +VAL_ 963 HomeSafeLtChime_B_Rq 1 "On" 0 "Off"; +VAL_ 963 StopLghtOn_B_Stat 1 "On" 0 "Off"; +VAL_ 963 RvrseLghtOn_B_Stat 1 "On" 0 "Off"; +VAL_ 963 PrkLght_D_Stat 3 "Park_Both" 2 "Park_Right" 1 "Park_Left" 0 "Off"; +VAL_ 963 HeadLghtSwtch_D_Stat 3 "Autolamp" 2 "Headlamp" 1 "Parklamp" 0 "Off"; +VAL_ 963 HeadLampLoFrOn_B_Stat 1 "Low" 0 "Not_Low"; +VAL_ 963 HeadLampLoFlOn_B_Stat 1 "Low" 0 "Not_Low"; +VAL_ 963 HeadLampLoActv_B_Stat 1 "On" 0 "Off"; +VAL_ 963 Headlamp_On_Wrning_Cmd 1 "On" 0 "Off"; +VAL_ 963 Park_Brake_Chime_Rqst 1 "On" 0 "Off"; +VAL_ 963 HeadLghtHiOn_B_Stat 1 "On" 0 "Off"; +VAL_ 963 BrkWarnInd_B_Rq 1 "On" 0 "Off"; +VAL_ 963 Brk_Fluid_Lvl_Low 3 "Invalid" 2 "Unknown" 1 "Low" 0 "OK"; +VAL_ 963 ReducedGuard_D_Stat 3 "NotUsed" 2 "Alarm_On" 1 "Alarm_Off_Previously_On" 0 "Alarm_Off"; +VAL_ 963 Perimeter_Alarm_Status 3 "Activated" 2 "Armed" 1 "Prearmed" 0 "Disarmed"; +VAL_ 963 Courtesy_BSave_Stat 3 "Invalid" 2 "Unknown" 1 "No_Effect" 0 "Off"; +VAL_ 963 DrTgateLck_D_Stat 3 "NotUsed" 2 "Unlock" 1 "Lock" 0 "Null"; +VAL_ 963 WndwGlbl_D_Cmd 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "GLEARN" 3 "GCLOSE" 2 "GOPEN" 1 "GSTOP" 0 "Null"; +VAL_ 963 PudLamp_D_Rq 3 "RAMP_DOWN" 2 "RAMP_UP" 1 "ON" 0 "OFF"; +VAL_ 963 DayRnngLampOn_B_Stat 1 "On" 0 "Off"; +VAL_ 963 PerimeterAlarmChimeRq 1 "On" 0 "Off"; +VAL_ 145 VehYawWActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 145 VehRolWActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 145 VehYaw_W_Actl 65535 "Faulty" 65534 "NoDataExists"; +VAL_ 145 VehRol_W_Actl 65535 "Faulty" 65534 "NoDataExists"; +VAL_ 76 FirstRowBuckleMid 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty"; +VAL_ 76 SecondRowBucklePsngr 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty"; +VAL_ 76 SecondRowBuckleMid 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty"; +VAL_ 76 SecondRowBuckleDriver 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty"; +VAL_ 76 FirstRowBuckleDriver 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty"; +VAL_ 76 RILReq 3 "Not_Used" 2 "Plant_Mode" 1 "On" 0 "Off"; +VAL_ 76 FirstRowBucklePsngr 3 "Unknown" 2 "Unbelted" 1 "Belted" 0 "Faulty"; +VAL_ 76 RstrnImpactEvntStatus 7 "Invalid" 6 "Not_Used_4" 5 "Threshold_2_Exceeded" 4 "Not_Used_3" 3 "Threshold_1_Exceeded" 2 "Not_Used_2" 1 "Not_Used_1" 0 "Normal"; +VAL_ 76 PsngrFrntDetct_D_Actl 3 "Unknown" 2 "Empty" 0 "Faulty" 1 "Occupied"; +VAL_ 76 EDRTriggerEvntSync 1 "Threshold_Exceeded" 0 "Normal"; +VAL_ 76 PassRstrnInd_Req 3 "ABOnNotIllum_OffNotIllum" 2 "AirbagOnNot_Illum_OffIllum" 1 "AirbagOn_Illum_OffNotIllum" 0 "AirbagOn_Illum_Off_Illum"; +VAL_ 65 immoControlCmd_T1 0 "IDLE" 1 "MOTIVE_START_RQST" 2 "NONMOTIVE_START_RQST" 3 "RQST_TARGET1_IDBLOCK1" 4 "RQST_TARGET1_IDBLOCK2" 5 "Unused" 6 "ECHO_TARGET1_IDBLOCK2" 7 "SHUTDOWN"; +VAL_ 1076 HILL_DESC_SW 1 "On" 0 "Off"; +VAL_ 1076 AutoRgen_D_Rq 3 "NotUsed" 2 "AutExhFilterCleanOFF" 1 "AutExhFilterCleanON" 0 "No_Mode_Selected"; +VAL_ 1076 W2S_LAMP_OK 1 "Yes" 0 "No"; +VAL_ 1076 OdoTripRx_B_Actl 1 "Yes" 0 "No"; +VAL_ 1076 DrvSlipCtlMde_B_RqMyKey 1 "On" 0 "Off"; +VAL_ 1076 FuelLvlWarn_D_Actl 3 "NotUsed" 2 "VeryLow" 1 "Low" 0 "OK"; +VAL_ 1076 FuelSecndActv_B_Actl 1 "Yes" 0 "No"; +VAL_ 1076 FUEL_SENSOR_NUM 1 "Dual_Sensors" 0 "Single_Sensor"; +VAL_ 862 AutoStpHvacDelta_I_Est 255 "Fault"; +VAL_ 862 HvacBlwrFront_D_Stat 31 "Not_Used" 20 "Full_On" 19 "95_Percent" 18 "90_Percent" 17 "85_Percent" 16 "80_Percent" 15 "75_Percent" 14 "70_Percent" 13 "65_Percent" 12 "60_Percent" 11 "55_Percent" 10 "50_Percent" 9 "45_Percent" 8 "40_Percent" 7 "35_Percent" 6 "30_Percent" 5 "25_Percent" 4 "20_Percent" 3 "15_Percent" 2 "10_Percent" 1 "5_Percent" 0 "Off"; +VAL_ 862 CabnAmb_Te_Actl 255 "Fault"; +VAL_ 862 ClimtThrmlLoad_No_Actl 255 "Fault"; +VAL_ 931 PtWakeReas_D_Stat 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "ElapsedTime" 5 "ThirdPartyWakeup" 4 "DoorAjar" 3 "EarlyWake" 2 "NonMotiveStart" 1 "MotiveStart" 0 "Null"; +VAL_ 931 VehOnSrc_D_Stat 15 "NotUsed_11" 14 "NotUsed_10" 13 "NotUsed_9" 12 "NotUsed_8" 11 "NotUsed_7" 10 "NotUsed_6" 9 "NotUsed_5" 8 "NotUsed_4" 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "OverTheAir" 3 "RemoteParkAssist" 2 "RemoteStart" 1 "Manual" 0 "Off"; +VAL_ 931 EngStrtActv_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 931 EngStrt_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 931 DrvInCtl_B_Stat 1 "Yes" 0 "No"; +VAL_ 931 AdvStrt_D_Stat 15 "NotUsed_15" 14 "NotUsed_14" 13 "NotUsed_13" 12 "NotUsed_12" 11 "NotUsed_11" 10 "NotUsed_10" 9 "NotUsed_9" 8 "NotUsed_8" 7 "NotUsed_7" 6 "NotUsed_6" 5 "NotUsed_5" 4 "NotUsed_4" 3 "NotUsed_3" 2 "NotUsed_2" 1 "NotUsed_1" 0 "NoAction"; +VAL_ 931 CrnkInhbt_B_Stat 1 "Inhibit" 0 "NoInhibit"; +VAL_ 931 IgnPreOffActv_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 578 PtLatchActv_B_RqBcm 1 "On" 0 "Off"; +VAL_ 578 immoSecureIdleMode 3 "NotUsed2" 2 "NotUsed1" 1 "Active" 0 "Inactive"; +VAL_ 578 ReFuelSwtchStat_D_Actl 3 "NotUsed2" 2 "NotUsed1" 1 "On" 0 "Off"; +VAL_ 578 FuelPumpPwr_D_Stat 7 "NotUsed3" 6 "NotUsed2" 5 "NotUsed1" 4 "Power_Off_Default" 3 "Power_Off_Command" 2 "Power_Off_Service" 1 "Power_Off_Impact" 0 "Power_On"; +VAL_ 578 BattULo_U_Actl 255 "Fault"; +VAL_ 578 PrkLckCtl_B_Enbl 1 "Enable" 0 "Disable"; +VAL_ 578 PrkLckCtlMsgTxt_D_Rq 3 "BTSI_DI_3" 2 "BTSI_DI_2" 1 "BTSI_DI_1" 0 "Null_BTSI_DI"; +VAL_ 578 BrkTrnShifLck_B_Stat 1 "Shift" 0 "NoShift"; +VAL_ 578 PrkLckCtlUnlck_D_Stat 3 "Trans_And_Steer_Unlckd" 2 "Steering_Unlckd" 1 "Transmission_Unlckd" 0 "Null"; +VAL_ 578 PrkLckCtlTow_B_Enbl 1 "Enable" 0 "Disable"; +VAL_ 578 DriverCrankingReq 1 "Crank_Request" 0 "No_Crank_Request"; +VAL_ 578 EngOff_T_Actl 65535 "Invalid"; +VAL_ 578 DcacElPw_D_Rq 3 "NotUsed" 2 "AC_HighPower_Requested" 1 "AC_LowPower_Requested" 0 "AC_Power_NotRequested"; +VAL_ 578 BattULo_I_Actl 16383 "Fault"; +VAL_ 947 ValetMode_D_Mem 1 "On" 0 "Off"; +VAL_ 947 DrStatDrvErrCnt_B_Stat 1 "Yes" 0 "No"; +VAL_ 947 TurnLghtRight_D_Rq 3 "Seq" 2 "On" 1 "Off" 0 "Null"; +VAL_ 947 TurnLghtRightOn_B_Stat 1 "On" 0 "Off"; +VAL_ 947 TurnLghtLeftOn_B_Stat 1 "On" 0 "Off"; +VAL_ 947 FogLghtRearOn_B_Stat 1 "On" 0 "Off"; +VAL_ 947 Backlit_LED_Status 15 "Unused3" 14 "Unused2" 13 "Unused1" 12 "Night_12" 11 "Night_11" 10 "Night_10" 9 "Night_9" 8 "Night_8" 7 "Night_7" 6 "Night_6" 5 "Night_5" 4 "Night_4" 3 "Night_3" 2 "Night_2" 1 "Night_1" 0 "Off"; +VAL_ 947 TurnLghtLeft_D_Rq 3 "Seq" 2 "On" 1 "Off" 0 "Null"; +VAL_ 947 FogLghtFrontOn_B_Stat 1 "On" 0 "Off"; +VAL_ 947 IgnKeyType_D_Actl 15 "Invalid" 14 "Unknown" 3 "Key_Not_Prgrm_Read_Failure" 2 "Key_In_Ign_My_Key" 1 "Key_In_Ign_Standard_Key" 0 "Key_Read_In_Progress"; +VAL_ 947 Parklamp_Status 3 "Invalid" 2 "Unknown" 1 "On" 0 "Off"; +VAL_ 947 Litval 255 "Invalid" 254 "Unknown" 5 "Day" 4 "Twilight_4" 3 "Twilight_3" 2 "Twilight_2" 1 "Twilight_1" 0 "Night"; +VAL_ 947 Key_In_Ignition_Stat 1 "In" 0 "Out"; +VAL_ 947 Ignition_Status 0 "Unknown" 1 "Off" 15 "Invalid" 8 "Start" 4 "Run" 2 "Accessory"; +VAL_ 947 Dimming_Lvl 255 "Invalid" 254 "Unknown" 18 "Day_6" 17 "Day_5" 16 "Day_4" 15 "Day_3" 14 "Day_2" 13 "Day_1" 12 "Night_12" 11 "Night_11" 10 "Night_10" 9 "Night_9" 8 "Night_8" 7 "Night_7" 6 "Night_6" 5 "Night_5" 4 "Night_4" 3 "Night_3" 2 "Night_2" 1 "Night_1" 0 "Off"; +VAL_ 947 Day_Night_Status 3 "NotUsed" 2 "Night" 1 "Day" 0 "Null"; +VAL_ 947 Remote_Start_Status 3 "Invalid" 2 "Unknown" 1 "Remote" 0 "Null"; +VAL_ 947 DrStatTgate_B_Actl 1 "Ajar" 0 "Closed"; +VAL_ 947 DrStatRr_B_Actl 1 "Ajar" 0 "Closed"; +VAL_ 947 DrStatRl_B_Actl 1 "Ajar" 0 "Closed"; +VAL_ 947 DrStatPsngr_B_Actl 1 "Ajar" 0 "Closed"; +VAL_ 947 DrStatInnrTgate_B_Actl 1 "Ajar" 0 "Closed"; +VAL_ 947 DrStatHood_B_Actl 1 "Ajar" 0 "Closed"; +VAL_ 947 DrStatDrv_B_Actl 1 "Ajar" 0 "Closed"; +VAL_ 947 PrkBrkActv_B_Actl 1 "Active" 0 "Inactive"; +VAL_ 947 LifeCycMde_D_Actl 3 "Transport" 2 "NotUsed" 1 "Factory" 0 "Normal"; +VAL_ 947 Delay_Accy 1 "On" 0 "Off"; +VAL_ 947 CrashEvnt_D_Stat 3 "Invalid" 2 "Fuel_Cutoff_Event" 1 "Deploy_Event" 0 "No_Event"; +VAL_ 947 FuelPmpInhbt_B_Stat 1 "Inhibit" 0 "No_Inibit"; +VAL_ 947 BodySrvcRqd_B_Rq 1 "Yes" 0 "No"; +VAL_ 1084 BattULoState_D_Qlty 3 "OK" 2 "Not_Within_Specifications" 1 "Eval_In_Progress" 0 "Fault"; +VAL_ 1084 BSFault 1 "Fault" 0 "No_Fault"; +VAL_ 1084 BattULo2_Te_Actl 127 "Fault"; +VAL_ 1068 EngStrtInhbt_B_RqBatt 1 "Start_Inhibit" 0 "Dont_Care"; +VAL_ 1068 BattULoChrg_D_Rq 3 "Low_Battery_Temperature" 2 "Charging_Requested" 1 "Chrg_Requested_HighCurrent" 0 "No_Request"; +VAL_ 1068 PwSysULoFalt_D_Stat 15 "Not_Used_6" 14 "LowBatterySOC" 13 "PSS_Shed2_Contin" 12 "Not_Used_4" 11 "Not_Used_3" 10 "Not_Used_2" 9 "BattMonitoringSensorFault" 8 "LowBattVoltDuringPwSrcOn" 7 "LowBatt2_PowerSaveMode" 6 "LowBatt1_Warning" 5 "Overvoltage" 4 "Fault_NoOutput" 3 "Fault_ReducedOutput" 2 "Fault_Nonspecific" 1 "Cluster_Proveout" 0 "No_Fault"; +VAL_ 1068 Shed_T_Eng_Off_B 1 "Active" 0 "Inactive"; +VAL_ 1068 Shed_Feature_Group_ID 16 "PtcHeater" 14 "HtdMirr" 13 "HvacRearBlwr_Third" 12 "HvacRearBlwr_Second" 11 "HvacRearBlwr_First" 31 "All LSHED1 Features" 10 "Htd_Windscrn" 9 "SpltHtdBcklight_HtdMirr" 8 "HtdBcklight_HtdMirr" 7 "HtdCoolSeat_FrtDriver" 6 "HtdCoolSeat_FrtPass" 5 "HtdCoolSeat_RearPass" 4 "HtdCoolSeat_RearDriver" 3 "SmartTrlrTowBattCharge" 2 "Htd_StrWhl" 1 "Htd_Washer_Fluid" 0 "No_LSHED1_Features" 15 "Engine_Coolant_Fan"; +VAL_ 1068 Shed_Drain_Eng_Off_B 1 "Active" 0 "Inactive"; +VAL_ 1068 Shed_Level_Req 7 "Unused_2" 6 "Loads_On" 5 "SHED_ENG_OFF" 4 "SOON_ENG_OFF" 3 "SHED2_CONTIN" 2 "SHED2_TRANS" 1 "SHED1" 0 "NO_SHED"; +VAL_ 1068 ULoRgenTestMde_B_Rq 1 "Request" 0 "NoRequest"; +VAL_ 1068 ChargeMode 7 "Undefined_2" 6 "Undefined_1" 5 "Battery_Identify" 4 "Battery_Refresh" 3 "SlowRegenAllowNoDischarge" 2 "Fast_Regen_Allowed" 1 "Slow_Regen_Allowed" 0 "Conventional_Charging"; +VAL_ 1068 IdleSpeedIncrease_El 1 "Yes" 0 "No"; +VAL_ 1068 Batt_Lo_SoC_B 1 "Active" 0 "Inactive"; +VAL_ 1068 PeriodicElLoad_B_Stat 1 "Active" 0 "Inactive"; +VAL_ 1068 Batt_Crit_SoC_B 1 "Active" 0 "Inactive"; +VAL_ 146 VehVert2_A_Actl 8191 "Faulty" 8190 "NoDataExists"; +VAL_ 146 VehLong2_A_Actl 8191 "Faulty" 8190 "NoDataExists"; +VAL_ 146 VehLat2_A_Actl 8191 "Faulty" 8190 "NoDataExists"; +VAL_ 146 VehVertAActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 146 VehLongAActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 146 VehLatAActl_D_Qf 3 "OK" 2 "Not_Within_Specifications" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 997 PersIndexCcm_D_Actl 7 "Unused_3" 6 "Unused_2" 5 "Unused_1" 4 "Vehicle" 3 "PERS_4" 2 "PERS_3" 1 "PERS_2" 0 "PERS_1"; +VAL_ 983 CmbbObjRelLong_V_Actl 1023 "Faulty" 1022 "NoDataExists"; +VAL_ 983 CmbbObjRelLat_V_Actl 511 "Faulty" 510 "NoDataExists"; +VAL_ 983 CmbbObjDistLong_L_Actl 1023 "Faulty" 1022 "NoDataExists"; +VAL_ 983 CmbbObjDistLat_L_Actl 511 "Faulty" 510 "NoDataExists"; +VAL_ 983 CmbbObjConfdnc_D_Stat 3 "High" 2 "Medium" 1 "Low" 0 "NotDetermined"; +VAL_ 983 CmbbObjColl_T_Actl 127 "Faulty" 126 "NoDataExists"; +VAL_ 983 CmbbObjClass_D_Stat 15 "NotUsed_9" 14 "NotUsed_8" 13 "NotUsed_7" 12 "NotUsed_6" 11 "NotUsed_5" 10 "NotUsed_4" 9 "NotUsed_3" 8 "NotUsed_2" 7 "NotUsed_1" 6 "Unclassified_Vehicle" 5 "Bicycle" 4 "Pedestrian" 3 "Truck" 2 "Motorcycle" 1 "Vehicle" 0 "Undetermined"; +VAL_ 983 EsaEnbl_D2_Rq 3 "NotConfigured" 2 "Enabled" 1 "Pending" 0 "Disabled"; +VAL_ 980 AdbBrdr1DistRigh_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m"; +VAL_ 980 AdbBrdr1DistLeft_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m"; +VAL_ 980 AdbMde1_D_Rq 3 "MarkerLightFlashing" 2 "MarkerLightConstant" 1 "Spot" 0 "None"; +VAL_ 980 AdbIntns1_D_Rq 3 "Maximum" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 980 AdbBrdr1Up_An_Rq 511 "Faulty" 510 "NoDataExists"; +VAL_ 980 AdbBrdr1Right_An_Rq 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 980 AdbBrdr1Low_An_Rq 511 "Faulty" 510 "NoDataExists"; +VAL_ 980 AdbBrdr1Left_An_Rq 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 979 HandsOffCnfm_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 979 LatCtl_D_Rq 7 "NotUsed4" 6 "NotUsed3" 5 "NotUsed2" 4 "NotUsed1" 3 "InterventionRight" 2 "InterventionLeft" 1 "ContinuousPathFollowing" 0 "NoLateralControl"; +VAL_ 979 LatCtlRampType_D_Rq 3 "Immediately" 2 "Fast" 1 "Medium" 0 "Slow"; +VAL_ 979 LatCtlPrecision_D_Rq 3 "NotUsed2" 2 "NotUsed1" 1 "Precise" 0 "Comfortable"; +VAL_ 976 SuspClkSync_No_Actl 255 "Faulty" 254 "NoDataExists"; +VAL_ 976 SrpSigValid_B_Stat 1 "True" 0 "False"; +VAL_ 976 SrpHghtRight_L_Actl 511 "Faulty" 510 "NoDataExists"; +VAL_ 976 SrpHghtLeft_L_Actl 511 "Faulty" 510 "NoDataExists"; +VAL_ 976 SrpEventRight_D_Stat 3 "Faulty" 2 "Bump" 1 "Pothole" 0 "NoEvent"; +VAL_ 976 SrpEventLeft_D_Stat 3 "Faulty" 2 "Bump" 1 "Pothole" 0 "NoEvent"; +VAL_ 976 SrpDistRight_L_Actl 511 "Faulty" 510 "NoDataExists"; +VAL_ 976 SrpDistLeft_L_Actl 511 "Faulty" 510 "NoDataExists"; +VAL_ 973 TsrVl2PrmntMsgTxt_D_Rq 3 "NotUsed" 2 "ShowPermanentlyWithSupp" 1 "ShowPermanentlyWithoutSupp" 0 "DoNotShowSignPermanent"; +VAL_ 973 TsrVl1PrmntMsgTxt_D_Rq 3 "NotUsed" 2 "ShowPermanentlyWithSupp" 1 "ShowPermanentlyWithoutSupp" 0 "DoNotShowSignPermanent"; +VAL_ 973 TsrVl2RstrcMsgTxt2_D_Rq 7 "NotUsed" 6 "Time" 5 "Trailer" 4 "Snow" 3 "RainWet" 2 "NoRecognizableRestrictn" 1 "NoSpeedLimitRestrictn" 0 "Null"; +VAL_ 973 TsrVl1RstrcMsgTxt2_D_Rq 7 "NotUsed" 6 "Time" 5 "Trailer" 4 "Snow" 3 "RainWet" 2 "NoRecognizableRestrictn" 1 "NoSpeedLimitRestrictn" 0 "Null"; +VAL_ 973 TsrOvtkMsgTxt2_D_Rq 15 "NotUsed5" 14 "NotUsed4" 13 "NotUsed3" 12 "NotUsed2" 11 "NotUsed1" 10 "LimForTrucksCancelled" 9 "LimForTrucksWoQlfdRstrc" 8 "LimForTrucksWithoutRstrc" 7 "LimAllCancelled" 6 "LimAllWithRstrcTime" 5 "LimAllWithRstrcTrailer" 4 "LimAllWithRstrcSnow" 3 "LimAllWithRstrcRain" 2 "LimAllWithoutQlfdRstrc" 1 "LimAllWithoutRestriction" 0 "OvertakingAllowed"; +VAL_ 973 WwaWarn_B_Rq 1 "On" 0 "Off"; +VAL_ 973 TsrVlUnitMsgTxt_D_Rq 3 "NoDataExists" 2 "Mph" 1 "Kph" 0 "Null"; +VAL_ 973 TsrVLim2MsgTxt_D_Rq 255 "NoLimit" 254 "NotUsed2" 253 "NotUsed1" 252 "NotToBeDisplayed" 251 "LimitCancelled" 31 "1F_FA_Message31_250" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "Null"; +VAL_ 973 TsrVLim1MsgTxt_D_Rq 255 "NoLimit" 254 "NotUsed2" 253 "NotUsed1" 252 "NotToBeDisplayed" 251 "LimitCancelled" 31 "1F_FA_Message31_250" 30 "Message30" 29 "Message29" 28 "Message28" 27 "Message27" 26 "Message26" 25 "Message25" 24 "Message24" 23 "Message23" 22 "Message22" 21 "Message21" 20 "Message20" 19 "Message19" 18 "Message18" 17 "Message17" 16 "Message16" 15 "Message15" 14 "Message14" 13 "Message13" 12 "Message12" 11 "Message11" 10 "Message10" 9 "Message9" 8 "Message8" 7 "Message7" 6 "Message6" 5 "Message5" 4 "Message4" 3 "Message3" 2 "Message2" 1 "Message1" 0 "Null"; +VAL_ 973 TsrVl2StatMsgTxt_D_Rq 3 "LimitOutdated" 2 "LimitReiable" 1 "LimitChanged" 0 "Null"; +VAL_ 973 TsrVl2RstrcMsgTxt_D_Rq 3 "NotUsed" 2 "NoRecognizableRestriction" 1 "NoSpeedLimitRestriction" 0 "Null"; +VAL_ 973 TsrVl1StatMsgTxt_D_Rq 3 "LimitOutdated" 2 "LimitReiable" 1 "LimitChanged" 0 "Null"; +VAL_ 973 TsrVl1RstrcMsgTxt_D_Rq 3 "NotUsed" 2 "NoRecognizableRestriction" 1 "NoSpeedLimitRestriction" 0 "Null"; +VAL_ 973 TsrStatMsgTxt_D_Rq 7 "NotUsed" 6 "NoDataExists" 5 "TSR_Error" 4 "Available_NavigationOnly" 3 "Available_CameraOnly" 2 "Available_FusionMode" 1 "TSR_Off" 0 "Null"; +VAL_ 973 TsrOvtkStatMsgTxt_D_Rq 3 "LimitOutdated" 2 "LimitReiable" 1 "LimitChanged" 0 "Null"; +VAL_ 973 TsrOvtkMsgTxt_D_Rq 7 "LimForTrucksCancelled" 6 "LimForTrucksWoQlfdRstrc" 5 "LimForTrucksWithoutRstrc" 4 "LimAllCancelled" 3 "LimAllWithoutQlfdRstrc" 2 "LimAllWithoutRestriction" 1 "OvertakingAllowed" 0 "Null"; +VAL_ 973 TsrOswWarnMsgTxt_D_Rq 3 "NotUsed" 2 "True" 1 "False" 0 "Null"; +VAL_ 973 TsrMsgTxt_D_Rq 15 "NotUsed6" 14 "NotUsed5" 13 "NotUsed4" 12 "NotUsed3" 11 "NotUsed2" 10 "NotUsed1" 9 "RecgnzdSignNotUsblForDsply" 8 "LimitedSystemPerformance" 7 "OffRoad" 6 "RegionNotSupported" 5 "CountryNotSupported" 4 "WrngNavDatIncompDatCarrier" 3 "NoNavDataAvailable" 2 "NoNavAvailableSwitchedOff" 1 "NoInformationAllOK" 0 "Null"; +VAL_ 970 LkaDrvOvrrd_D_Rq 3 "Level_3" 2 "Level_2" 1 "Level_1" 0 "Level_0"; +VAL_ 970 LkaActvStats_D2_Req 7 "NotUsed" 6 "LkaIncrIntervRight" 5 "LkaSupprRight" 4 "LkaStandIntervRight" 3 "LkaSupprLeft" 2 "LkaStandIntervLeft" 1 "LkaIncrIntervLeft" 0 "LkaNoInterv"; +VAL_ 970 LaRefAng_No_Req 4095 "Fault"; +VAL_ 970 LaRampType_B_Req 1 "Quick" 0 "Smooth"; +VAL_ 970 LaCurvature_No_Calc 4095 "Fault"; +VAL_ 970 LdwActvStats_D_Req 7 "LDW_Suppress_Right_Left" 6 "Not_Used2" 5 "LDW_Suppress_Right" 4 "LDW_Warning_Right" 3 "LDW_Suppress_Left" 2 "LDW_Warning_Left" 1 "LDW_DemoVibration" 0 "LDW_Idle"; +VAL_ 970 LdwActvIntns_D_Req 3 "High" 2 "Medium" 1 "Low" 0 "None"; +VAL_ 962 AdbBrdr3DistRigh_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m"; +VAL_ 962 AdbBrdr3DistLeft_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m"; +VAL_ 962 AdbMde3_D_Rq 3 "MarkerLightFlashing" 2 "MarkerLightConstant" 1 "Spot" 0 "None"; +VAL_ 962 AdbIntns3_D_Rq 3 "Maximum" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 962 AdbBrdr3Up_An_Rq 511 "Faulty" 510 "NoDataExists"; +VAL_ 962 AdbBrdr3Right_An_Rq 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 962 AdbBrdr3Low_An_Rq 511 "Faulty" 510 "NoDataExists"; +VAL_ 962 AdbBrdr3Left_An_Rq 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 961 AdbBrdr2DistRigh_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m"; +VAL_ 961 AdbBrdr2DistLeft_D_Stat 15 "DistGreater800m" 14 "Dist700mTo800m" 13 "Dist600mTo700m" 12 "Dist500mTo600m" 11 "Dist400mTo500m" 10 "Dist300mTo400m" 9 "Dist200mTo300m" 8 "Dist175mTo200m" 7 "Dist150mTo175m" 6 "Dist125mTo150m" 5 "Dist100mTo125m" 4 "Dist75mTo100m" 3 "Dist50mTo75m" 2 "Dist25mTo50m" 1 "Dist15mTo25m" 0 "Dist0mTo15m"; +VAL_ 961 AdbMde2_D_Rq 3 "MarkerLightFlashing" 2 "MarkerLightConstant" 1 "Spot" 0 "None"; +VAL_ 961 AdbIntns2_D_Rq 3 "Maximum" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 961 AdbBrdr2Up_An_Rq 511 "Faulty" 510 "NoDataExists"; +VAL_ 961 AdbBrdr2Right_An_Rq 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 961 AdbBrdr2Low_An_Rq 511 "Faulty" 510 "NoDataExists"; +VAL_ 961 AdbBrdr2Left_An_Rq 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 394 AccStopStat_D_Dsply 3 "PressResume" 2 "Stopped" 1 "ResumeReady" 0 "NoDisplay"; +VAL_ 394 AccTrgDist2_D_Dsply 15 "DIST_ACTIVE_13_Farthest" 14 "DIST_ACTIVE_12" 13 "DIST_ACTIVE_11" 12 "DIST_ACTIVE_10" 11 "DIST_ACTIVE_9" 10 "DIST_ACTIVE_8" 9 "DIST_ACTIVE_7" 8 "DIST_ACTIVE_6" 7 "DIST_ACTIVE_5" 6 "DIST_ACTIVE_4" 5 "DIST_ACTIVE_3" 4 "DIST_ACTIVE_2" 3 "DIST_ACTIVE_1_Closest" 2 "DIST_ACTIVE_No_Target" 1 "DIST_STANDBY" 0 "DIST_OFF"; +VAL_ 394 AccStopRes_B_Dsply 1 "Yes" 0 "No"; +VAL_ 394 TjaWarn_D_Rq 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "HardTakeOverLevel2" 2 "HardTakeOverLevel1" 1 "TrafficJamAssistCancel" 0 "NoWarning"; +VAL_ 394 Tja_D_Stat 7 "NotUsed_1" 6 "ActiveWarningRight" 5 "ActiveWarningLeft" 4 "ActiveInterventionRight" 3 "ActiveInterventionLeft" 2 "Active" 1 "Standby" 0 "Off"; +VAL_ 394 TjaMsgTxt_D_Dsply 7 "NotUsed_4" 6 "NotUsed_3" 5 "NotUsed_2" 4 "NotUsed_1" 3 "TurnOnAdaptCruiseControl" 2 "TrafficJamAssistSelected" 1 "TrafficJamAssistUnavailabl" 0 "NoMessage"; +VAL_ 394 IaccLamp_D_Rq 3 "NotUsed_2" 2 "NotUsed_1" 1 "DisplayIaccIcon" 0 "DoNotDisplayIaccIcon"; +VAL_ 394 AccMsgTxt_D2_Rq 15 "NotUsed_1" 14 "NCC_Enabled_Warning" 13 "IACC_TJA_Selected" 12 "ACC_TJA_Selected" 11 "IACC_Selected" 10 "Press_Brake_To_Hold" 9 "Only_Following_In_Low_Spd" 8 "TJA_Unavailable" 7 "Shift_Down" 6 "IACC_Unavailable" 5 "ACC_Selected" 4 "ACC_Overridden" 3 "Brake_Capacity_Warning" 2 "ACC_Cancelled" 1 "ACC_Unavailable" 0 "No_Text"; +VAL_ 394 FcwDeny_B_Dsply 1 "Yes" 0 "No"; +VAL_ 394 FcwMemStat_B_Actl 1 "On" 0 "Off"; +VAL_ 394 AccTGap_B_Dsply 1 "Yes" 0 "No"; +VAL_ 394 CadsAlignIncplt_B_Actl 1 "Yes" 0 "No"; +VAL_ 394 AccFllwMde_B_Dsply 1 "Yes" 0 "No"; +VAL_ 394 CadsRadrBlck_B_Actl 1 "Yes" 0 "No"; +VAL_ 394 CmbbPostEvnt_B_Dsply 1 "Yes" 0 "No"; +VAL_ 394 AccStopMde_B_Dsply 1 "Yes" 0 "No"; +VAL_ 394 FcwMemSens_D_Actl 3 "FCW_Sensitivity_3" 2 "FCW_Sensitivity_2" 1 "FCW_Sensitivity_1" 0 "Not_Used"; +VAL_ 394 FcwMsgTxt_D_Rq 7 "Undefined_3" 6 "Undefined_2" 5 "Low_Visibility" 4 "Unavailable_DueTo_LowSpeed" 3 "Available" 2 "Unavailable" 1 "Off" 0 "No_Text"; +VAL_ 394 AccWarn_D_Dsply 3 "BrakeReleaseWarn_In_StopMd" 2 "Brake_Capacity_Warning" 1 "Cancel_Warning" 0 "No_Warning"; +VAL_ 394 FcwVisblWarn_B_Rq 1 "On" 0 "Off"; +VAL_ 394 FcwAudioWarn_B_Rq 1 "On" 0 "Off"; +VAL_ 394 AccTGap_D_Dsply 7 "Undefined_2" 6 "Undefined_1" 5 "Time_Gap_5" 4 "Time_Gap_4" 3 "Time_Gap_3" 2 "Time_Gap_2" 1 "Time_Gap_1" 0 "Not_Used"; +VAL_ 394 AccMemEnbl_B_RqDrv 1 "Adaptive_Cruise" 0 "Normal_Cruise"; +VAL_ 394 FdaMem_B_Stat 1 "On" 0 "Off"; +VAL_ 391 HudBlk3_B_Rq 1 "Yes" 0 "No"; +VAL_ 391 HudBlk2_B_Rq 1 "Yes" 0 "No"; +VAL_ 391 HudBlk1_B_Rq 1 "Yes" 0 "No"; +VAL_ 391 HudFlashRate_D_Actl 3 "Unused" 2 "Flash_4Hz_50Prct_DutyCycle" 1 "On" 0 "Off"; +VAL_ 391 CmbbBrkPrchg_D_Rq 3 "Undefined" 2 "Level_2_PreCharge_Request" 1 "Level_1_PreCharge_Request" 0 "No_PreCharge_Request"; +VAL_ 391 CmbbBrkDecel_B_Rq 1 "Yes" 0 "No"; +VAL_ 391 CmbbBaSens_D_Rq 3 "Level_3" 2 "Level_2" 1 "Level_1" 0 "Normal"; +VAL_ 390 AccBrkPulse_B_Rq 1 "True" 0 "False"; +VAL_ 390 AccAutoResum_D_Rq 3 "NotUsed" 2 "Active" 1 "Pending" 0 "Off"; +VAL_ 390 AccBrkPrkEl_B_Rq 1 "Yes" 0 "No"; +VAL_ 390 Cmbb_B_Enbl 1 "Yes" 0 "No"; +VAL_ 390 CmbbOvrrd_B_RqDrv 1 "Yes" 0 "No"; +VAL_ 390 CmbbDeny_B_Actl 1 "Yes" 0 "No"; +VAL_ 390 CmbbEngTqMn_B_Rq 1 "Yes" 0 "No"; +VAL_ 390 AccDeny_B_Rq 1 "Yes" 0 "No"; +VAL_ 390 AccResumEnbl_B_Rq 1 "Yes" 0 "No"; +VAL_ 390 AccCancl_B_Rq 1 "Yes" 0 "No"; +VAL_ 390 AccBrkPrchg_B_Rq 1 "Yes" 0 "No"; +VAL_ 390 AccBrkDecel_B_Rq 1 "Active" 0 "Inactive"; +VAL_ 390 AccStopStat_B_Rq 1 "Yes" 0 "No"; +VAL_ 1153 TerrMde_D_RqDrv 7 "Fail_Safe_Default" 6 "Dynamic_Mode" 5 "Rock_Crawl_Mode" 4 "Mud_Ruts_Mode" 3 "Sand_Mode" 2 "Undefined" 1 "Low_Mu_Mode" 0 "Special_Operating_Mode_Off"; +VAL_ 942 PrkAidDrvDir_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "BackwardNegative" 4 "ForwardNegative" 3 "BackwardPositive" 2 "ForwardPositive" 1 "NoMotion" 0 "DirectionNotKnown"; +VAL_ 942 PrkAidAcsyRear_D_Stat 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 942 PrkAidAcsyFront_D_Stat 3 "NotUsed" 2 "On" 1 "Off" 0 "Null"; +VAL_ 930 BalrWndwRight_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 930 BalrSnsRight_D_Falt 3 "Invalid" 2 "SystemFailure" 1 "Blocked" 0 "Clear"; +VAL_ 930 WndwPsngrRear_D_RqBalrr 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_ 930 WndwPsngr_D_RqBalrr 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_ 930 WndwDrvRear_D_RqBalrr 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_ 930 WndwDrv_D_RqBalrr 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_ 930 BalrRight_D_Stat 3 "Inhibited" 2 "Disabled" 1 "On" 0 "Off"; +VAL_ 930 BalrMdeSelRight_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 930 BalrMdeRight_D_Stat 3 "NotUsed" 2 "High" 1 "Medium" 0 "Low"; +VAL_ 930 BalrLckRight_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 930 BalrChimeRight_D_Rq 3 "NotUsed" 2 "Soft" 1 "Normal" 0 "Off"; +VAL_ 930 CamraRearOn_B_RqBalrr 1 "Active" 0 "Inactive"; +VAL_ 930 DrLckActv_B_RqBalrr 1 "Active" 0 "Null"; +VAL_ 929 BalrChimeLeft_D_Rq 3 "NotUsed" 2 "Soft" 1 "Normal" 0 "Off"; +VAL_ 929 BalrLeft_D_Stat 3 "Inhibited" 2 "Disabled" 1 "On" 0 "Off"; +VAL_ 929 BalrWndwLeft_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 929 WndwPsngrRear_D_RqBalrl 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_ 929 WndwPsngr_D_RqBalrl 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_ 929 WndwDrvRear_D_RqBalrl 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_ 929 WndwDrv_D_RqBalrl 3 "NotUsed" 2 "Stop" 1 "AutoUp" 0 "NoRequest"; +VAL_ 929 BalrSnsLeft_D_Falt 3 "Invalid" 2 "SystemFailure" 1 "Blocked" 0 "Clear"; +VAL_ 929 BalrMdeSelLeft_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 929 BalrMdeLeft_D_Stat 3 "NotUsed" 2 "High" 1 "Medium" 0 "Low"; +VAL_ 929 BalrLckLeft_B_Stat 1 "Enable" 0 "Disable"; +VAL_ 929 CamraRearOn_B_RqBalrl 1 "Active" 0 "Inactive"; +VAL_ 929 DrLckActv_B_RqBalrl 1 "Active" 0 "Null"; +VAL_ 402 PrkAidSwtch_D_RqMnu 1 "Pressed" 0 "Not_Pressed"; +VAL_ 402 ApaSwtch_D_RqMnu 3 "NotUsed2" 2 "NotUsed1" 1 "Pressed" 0 "Not_Pressed"; +VAL_ 402 ApaMdeStat_D_RqDrv 7 "Faulty" 6 "Off" 5 "NotUsed2" 4 "NotUsed1" 3 "POA" 2 "PPA" 1 "SAPP" 0 "Inactive"; +VAL_ 402 CamraViewSplit_B_Rq 1 "On" 0 "Off"; +VAL_ 402 CamraZoomMan_D_Rq 7 "Unknown" 6 "Invalid" 5 "Zoom_Level_V" 4 "Zoom_Level_IV" 3 "Zoom_Level_III" 2 "Zoom_Level_II" 1 "Zoom_Level_I" 0 "Off"; +VAL_ 402 CamraOvrlStat_D_Rq 1 "On" 0 "Off"; +VAL_ 402 CamraOvrlDyn_D_Rq 1 "On" 0 "Off"; +VAL_ 402 CamAutoTowbarZoom 1 "On" 0 "Off"; +VAL_ 402 DistanceBarSetting 1 "On" 0 "Off"; +VAL_ 924 DcacOut_Pw_Mx 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 924 DcacOut2_Pw_Actl 8191 "Faulty" 8190 "NoDataExists"; +VAL_ 924 DcacOut1_Pw_Actl 8191 "Faulty" 8190 "NoDataExists"; +VAL_ 924 DcacIn_Pw_Mx 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 923 DcacIn_U2_Actl 4095 "Faulty" 4094 "NoDataExists"; +VAL_ 923 DcacIn_U_Actl 4095 "Fault" 4094 "NoDataExists"; +VAL_ 923 DcacIn_I_Actl 2047 "Faulty" 2046 "NoDataExists"; +VAL_ 923 Dcac_Te_Actl 255 "Faulty" 254 "NoDataExists"; +VAL_ 922 DcacBp2BrkrOpn_B_Falt 1 "Faulted" 0 "NotFaulted"; +VAL_ 922 DcacBp1BrkrOpn_B_Falt 1 "Faulted" 0 "NotFaulted"; +VAL_ 922 DcacIpRcBrkrOpn_B_Falt 1 "Faulted" 0 "NotFaulted"; +VAL_ 922 DcacRdy_D2_Stat 3 "Faulted" 2 "RecoverableFault" 1 "Active" 0 "Idle"; +VAL_ 922 DcacOvrld_B_Falt 1 "Faulted" 0 "NotFaulted"; +VAL_ 922 DcacOverTe_B_Falt 1 "Faulted" 0 "NotFaulted"; +VAL_ 922 DcacGfci_B_Falt 1 "Faulted" 0 "NotFaulted"; +VAL_ 922 DcacErr_B_Stat 1 "Faulted" 0 "NotFaulted"; +VAL_ 922 DcacAcUDetct_B_Falt 1 "Faulted" 0 "NotFaulted"; +VAL_ 922 DcacRdy_D_Stat 7 "NotUsed_2" 6 "NotUsed_1" 5 "Faulted" 4 "ProtectionTempearture" 3 "ProtectionOverload" 2 "ProtectionGfci" 1 "Active" 0 "Idle"; +VAL_ 922 DcacPlugPrsnt_B_Stat 1 "Yes" 0 "No"; +VAL_ 922 DcacClntFlw_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off"; +VAL_ 922 CoolFanDcac_D_Rq 3 "High" 2 "Medium" 1 "Low" 0 "Off"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/.gitignore b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/.gitignore new file mode 100644 index 000000000..46fc4e0d8 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/.gitignore @@ -0,0 +1 @@ +_*generated.dbc diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/_stellantis_common.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/_stellantis_common.dbc new file mode 100644 index 000000000..8a200e532 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/_stellantis_common.dbc @@ -0,0 +1,187 @@ +BO_ 258 STEERING: 8 XXX + SG_ STEERING_ANGLE : 5|14@0+ (0.5,-2048) [-2048|2047] "deg" XXX + SG_ STEERING_RATE : 21|14@0+ (0.5,-2048) [-2048|2047] "deg/s" XXX + SG_ STEERING_ANGLE_HP : 48|4@1+ (0.1,-0.4) [-0.4|0.4] "deg" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 264 ECM_1: 8 XXX + SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ ENGINE_TORQUE : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ EXPECTED_ENGINE_TORQUE : 36|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 280 ECM_TRQ: 8 XXX + SG_ ENGINE_TORQ_MAX : 4|13@0+ (.25,-500) [-500|1547.5] "NM" XXX + SG_ ENGINE_TORQ_MIN : 20|13@0+ (.25,-500) [-500|1547.5] "NM" XXX + +BO_ 284 ESP_8: 8 XXX + SG_ BRK_PRESSURE : 3|12@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Stopped : 7|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PEDAL : 19|12@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Speed : 39|16@0+ (0.0078125,0) [0|511.984375] "km/h" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 288 ECM_2: 7 XXX + SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_ENABLE : 6|1@1+ (1,0) [0|0] "" XXX + SG_ TCM_TORQUE_REQ_ENABLE : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Accelerator_Position : 16|8@1+ (0.4,0) [0|100] "%" XXX + SG_ CRUISE_OVERRIDE : 31|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|0] "" XXX + +BO_ 320 ESP_1: 8 XXX + SG_ Brake_State : 0|2@1+ (1,0) [0|0] "" XXX + SG_ Brake_Pedal_State : 2|2@1+ (1,0) [0|0] "" XXX + SG_ ACC_Engaged : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Enabled : 23|1@0+ (1,0) [0|1] "" XXX + SG_ Vehicle_Speed : 33|10@0+ (0.5,0) [0|511] "km/h" XXX + SG_ ACC_OFF_REQ : 39|2@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED_ACC : 6|1@0+ (1,0) [0|3] "" XXX + +BO_ 268 ESP_2: 8 ESC + SG_ ESC_TORQUE_REQ : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ ACC_TORQUE_REQ_ENABLE : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_MAX : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_TORQUE_REQ_MIN : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_TORQUE_REQ : 20|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ TCS_ACTIVE : 21|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_TORQUE_REQ_MAX : 22|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_BRK_PREP : 40|1@1+ (1,0) [0|0] "" XXX + SG_ DISABLE_FUEL_SHUTOFF : 47|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_REQ_ACTIVE : 48|3@1+ (1,0) [0|0] "" XXX + SG_ COLLISION_BRK_PREP : 51|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 344 ESP_6: 8 XXX + SG_ WHEEL_SPEED_FL : 5|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_SPEED_FR : 21|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_SPEED_RL : 37|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_MOVING_1 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_SPEED_RR : 53|14@0+ (0.5,0) [0|8191] "rpm" XXX + SG_ WHEEL_MOVING_2 : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 368 Transmission_Status: 8 XXX + SG_ Gear_State : 2|3@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 464 ORC_1: 8 XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 500 DAS_3: 8 XXX + SG_ ENGINE_TORQUE_REQUEST : 4|13@0+ (0.25,-500) [-500|1547.5] "Nm" XXX + SG_ ENGINE_TORQUE_REQUEST_MAX : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_STANDSTILL : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_GO : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_DECEL : 19|12@0+ (0.004885,-16) [-16|4] "m/s2" XXX + SG_ ACC_AVAILABLE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ACTIVE : 21|1@0+ (1,0) [0|1] "" XXX + SG_ DISABLE_FUEL_SHUTOFF : 23|1@1+ (1,0) [0|0] "" XXX + SG_ GR_MAX_REQ : 32|4@1+ (1,0) [0|0] "" XXX + SG_ ACC_DECEL_REQ : 36|3@1+ (1,0) [0|0] "" XXX + SG_ ACC_FAULTED : 46|2@1+ (1,0) [0|0] "" XXX + SG_ COLLISION_BRK_PREP : 48|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_BRK_PREP : 49|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 501 DAS_4: 8 XXX + SG_ ACC_SET_SPEED_KPH : 15|8@0+ (1,0) [0|3] "km/h" XXX + SG_ ACC_SET_SPEED_MPH : 23|8@0+ (1,0) [0|3] "mph" XXX + SG_ ACC_DISTANCE_CONFIG_1 : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ACC_DISTANCE_CONFIG_2 : 41|2@0+ (1,0) [0|3] "" XXX + SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX + SG_ ACC_STATE : 38|3@0+ (1,0) [0|7] "" XXX + SG_ FCW_OFF : 25|2@0+ (1,0) [0|3] "" XXX + SG_ FCW_ERROR : 27|2@0+ (1,0) [0|3] "" XXX + SG_ FCW_BRAKE_ENABLED : 29|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_BRAKE_DISABLED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_FAULTED : 50|1@0+ (1,0) [0|1] "" XXX + +BO_ 544 EPS_2: 8 XXX + SG_ LKAS_STATE : 23|4@0+ (1,0) [0|15] "" XXX + SG_ COLUMN_TORQUE : 2|11@0+ (1,-1024) [-1024|1023] "" XXX + SG_ TORQUE_OVERLAY_STATUS : 6|4@0+ (1,0) [0|15] "" XXX + SG_ EPS_TORQUE_MOTOR_RAW : 19|12@0+ (1,-2048) [-2048|2047] "" XXX + SG_ EPS_TORQUE_MOTOR : 34|11@0+ (1,-1024) [-1024|1023] "" XXX + SG_ LKAS_TEMPORARY_FAULT : 38|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_PARK_HAS_CONTROL_2 : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 559 ECM_5: 8 XXX + SG_ Accelerator_Position : 0|8@1+ (0.4,0) [0|100] "%" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 571 CRUISE_BUTTONS: 3 XXX + SG_ ACC_Cancel : 0|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Dec : 1|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Accel : 2|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Decel : 3|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Resume : 4|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_OnOff : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_OnOff : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_Distance_Inc : 8|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 625 DAS_5: 8 XXX + SG_ FCW_STATE : 2|1@1+ (1,0) [0|0] "" XXX + SG_ FCW_DISTANCE : 3|2@1+ (1,0) [0|0] "" XXX + SG_ ACCFCW_MESSAGE : 12|4@1+ (1,0) [0|0] "" XXX + SG_ SET_SPEED_KPH : 24|8@1+ (1,0) [0|250] "km/h" XXX + SG_ WHEEL_TORQUE_REQUEST : 38|15@0+ (1,-7767) [-7767|24999] "Nm" XXX + SG_ WHEEL_TORQUE_REQUEST_ACTIVE : 39|1@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 669 EPB_1: 3 XXX + SG_ PARKING_BRAKE_STATUS : 11|3@0+ (1,0) [0|7] "" XXX + SG_ COUNTER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 678 DAS_6: 8 XXX + SG_ LKAS_ICON_COLOR : 1|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_LANE_LINES : 19|4@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ALERTS : 27|4@0+ (1,0) [0|1] "" XXX + SG_ CAR_MODEL : 15|8@0+ (1,0) [0|255] "" XXX + SG_ AUTO_HIGH_BEAM_ON : 47|1@1+ (1,0) [0|0] "" XXX + SG_ LKAS_DISABLED : 56|1@1+ (1,0) [0|0] "" XXX + +BO_ 720 BSM_1: 6 XXX + SG_ RIGHT_STATUS : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_STATUS : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 792 STEERING_LEVERS: 8 XXX + SG_ TURN_SIGNALS : 0|2@1+ (1,0) [0|3] "" XXX + SG_ HIGH_BEAM_PRESSED : 2|1@0+ (1,0) [0|3] "" XXX + +BO_ 820 BCM_1: 8 XXX + SG_ DOOR_OPEN_FL : 17|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 18|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 20|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_TRUNK : 22|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE_SWITCH : 23|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_LIGHT_LEFT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_LIGHT_RIGHT : 30|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM_DISPLAY : 58|1@0+ (1,0) [0|1] "" XXX + +VAL_ 320 ACC_OFF_REQ 2 "PERMANENT" 1 "TEMPORARY" 0 "NONE" +VAL_ 368 Gear_State 4 "D" 2 "N" 1 "R" 0 "P" ; +VAL_ 669 PARKING_BRAKE_STATUS 3 "RELEASING" 2 "APPLYING" 1 "APPLIED" 0 "OFF" ; + +CM_ SG_ 258 STEERING_ANGLE_HP "Steering angle high precision"; +CM_ SG_ 264 ENGINE_TORQUE "Effective engine torque"; +CM_ SG_ 264 EXPECTED_ENGINE_TORQUE "Expected Engine Torque based on target engine speed"; +CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null"; +CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/_stellantis_common_ram.py b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/_stellantis_common_ram.py new file mode 100644 index 000000000..fa408f131 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/_stellantis_common_ram.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +import os + +chrysler_to_ram = { + "_stellantis_common_ram_dt_generated.dbc": { + 258: 35, + 264: 37, + 268: 113, + 280: 181, + 284: 121, + 288: 123, + 320: 131, + 344: 139, + 368: 147, + 464: 464, + 500: 153, + 501: 232, + 544: 49, + 571: 177, + 559: 157, + 625: 163, + 669: 213, + 678: 250, + 720: 720, + 792: 792, + 820: 657, + }, + "_stellantis_common_ram_hd_generated.dbc": { + 571: 570, + 678: 629, + }, +} + +if __name__ == "__main__": + src = '_stellantis_common.dbc' + chrysler_path = os.path.dirname(os.path.realpath(__file__)) + + for out, addr_lookup in chrysler_to_ram.items(): + with open(os.path.join(chrysler_path, src), encoding='utf-8') as in_f, open(os.path.join(chrysler_path, out), 'w', encoding='utf-8') as out_f: + out_f.write(f'CM_ "Generated from {src}"\n\n') + + wrote_addrs = set() + for line in in_f.readlines(): + if line.startswith(('BO_', 'VAL_')): + sl = line.split(' ') + addr = int(sl[1]) + wrote_addrs.add(addr) + + sl[1] = str(addr_lookup.get(addr, addr)) + line = ' '.join(sl) + out_f.write(line) + + missing_addrs = set(addr_lookup.keys()) - wrote_addrs + assert len(missing_addrs) == 0, f"Missing addrs from {src}: {missing_addrs}" diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_pacifica_2017_hybrid.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_pacifica_2017_hybrid.dbc new file mode 100644 index 000000000..961c58403 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_pacifica_2017_hybrid.dbc @@ -0,0 +1,177 @@ +CM_ "IMPORT _stellantis_common.dbc"; + +BO_ 514 SPEED_1: 8 XXX + SG_ SPEED_LEFT : 7|12@0+ (0.071028,0) [0|65535] "m/s" XXX + SG_ SPEED_RIGHT : 23|12@0+ (0.071028,0) [0|1023] "m/s" XXX + +BO_ 653 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 15|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|4] "" XXX + +BO_ 746 GEAR: 5 XXX + SG_ PRNDL : 2|3@0+ (1,0) [0|7] "" XXX + SG_ GEAR_CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 31|4@0+ (1,0) [0|15] "" XXX + +BO_ 736 TRIP: 8 XXX + SG_ COUNTER : 7|16@0+ (1,0) [0|65535] "Meters" XXX + SG_ COUNTER_2 : 23|16@0+ (1,0) [0|65535] "Meters" XXX + +BO_ 658 LKAS_COMMAND: 6 XXX + SG_ COUNTER : 39|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + SG_ STEERING_TORQUE : 2|11@0+ (1,-1024) [0|1] "" XXX + SG_ LKAS_CONTROL_BIT : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 705 AUTO_PARK_BUTTON: 8 XXX + SG_ AUTO_PARK_TOGGLE_2 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_PARK_TOGGLE_1 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ INCREASING_UNKNOWN : 38|7@0+ (1,0) [0|15] "" XXX + +BO_ 719 AUTO_PARK_SIGNALS_1: 8 XXX + SG_ AUTO_PARK_UNKNOWN_1 : 7|16@0+ (1,0) [0|31] "" XXX + +BO_ 671 AUTO_PARK_REQUEST: 8 XXX + SG_ AUTO_PARK_CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ AUTO_PARK_STATUS : 7|5@0+ (1,0) [0|15] "" XXX + SG_ AUTO_PARK_COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ AUTO_PARK_MODE : 22|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_PARK_CMD : 2|11@0+ (1,-1024) [0|1] "NM" XXX + +BO_ 784 AUTO_PARK_LESS_INTERESTING: 8 XXX + SG_ INCREASING_UNKNOWN : 55|8@0+ (1,0) [0|7] "" XXX + SG_ AUTO_PARK_PERPENDICULAR_2 : 61|1@0+ (1,0) [0|255] "" XXX + +BO_ 826 AUTO_PARK_SIGNALS_3: 8 XXX + SG_ AUTO_PARK_HAS_CONTROL_3 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ HUMAN_HAS_CONTROL : 2|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_PARK_GEAR_1 : 27|4@0+ (1,0) [0|255] "" XXX + SG_ AUTO_PARK_GEAR_2 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ AUTO_PARK_GEAR_3 : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 332 STEERING_2: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ ENERGY_RELATED : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ STEER_ANGLE_2 : 7|13@0+ (0.3187251,-1307.888) [-360|360] "deg" XXX + +BO_ 331 BRAKE_3: 8 XXX + SG_ BRAKE_RELATED_3 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 608 PARKSENSE_SIGNAL: 8 XXX + SG_ PARKSENSE_DISABLED : 34|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ IN_REVERSE : 10|1@0+ (1,0) [0|255] "" XXX + SG_ AUTO_PARK_HAS_CONTROL_1 : 16|1@0+ (1,0) [0|255] "" XXX + SG_ HUMAN_HAS_CONTROL : 17|1@0+ (1,0) [0|3] "" XXX + +BO_ 729 LKAS_HEARTBIT: 5 XXX + SG_ LKAS_DISABLED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGH_BEAM : 31|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_1 : 7|24@0+ (1,0) [0|255] "" XXX + SG_ FORWARD_2 : 30|6@0+ (1,0) [0|127] "" XXX + SG_ FORWARD_3 : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 257 ACCEL_RELATED_101: 5 XXX + SG_ ENERGY_OR_RPM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 825 AUDIBLE_BEEP_339: 2 XXX + SG_ BEEP_339 : 7|16@0+ (1,0) [0|65535] "" XXX + +BO_ 168 ACCEL_RELATED_a8: 8 XXX + SG_ ACCEL_RELATED : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 270 ACCEL_RELATED_10e: 8 XXX + SG_ ACCEL_OR_RPM : 7|16@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ ELECTRIC_MOTOR : 23|16@0+ (1,0) [0|65535] "" XXX + +BO_ 291 ENERGY_RELATED_123: 8 XXX + SG_ ENERGY_GAIN_LOSS : 18|11@0- (1,0) [0|255] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ ENERGY_SMOOTHER_CURVE : 35|12@0+ (1,0) [0|2047] "" XXX + +BO_ 294 ENERGY_RELATED_126: 8 XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_126_1 : 3|12@0+ (1,0) [0|4095] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_126_2 : 35|12@0+ (1,0) [0|4095] "" XXX + SG_ ENERGY_GAIN_LOSS_NOISY : 19|12@0+ (1,0) [0|2047] "" XXX + +BO_ 308 ACCEL_GAS_134: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ ACCEL_134 : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 532 ENERGY_RELATED_214: 8 XXX + SG_ NOISY_SLOWLY_DECREASING : 19|12@0+ (1,0) [0|255] "" XXX + SG_ ENERGY_RELATED : 0|9@0+ (1,0) [0|255] "" XXX + +BO_ 655 CHARGING_MAYBE_28F: 8 XXX + SG_ CHARGING : 1|2@0+ (1,0) [0|3] "" XXX + +BO_ 660 BRAKE_RELATED_294: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PERHAPS_294 : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 764 ACCEL_RELATED_2FC: 8 XXX + SG_ ACCEL_2FC : 13|6@0+ (1,0) [0|255] "" XXX + +BO_ 816 TRACTION_BUTTON: 8 XXX + SG_ TRACTION_OFF : 19|1@0+ (1,0) [0|3] "" XXX + SG_ TOGGLE_PARKSENSE : 52|1@0+ (1,0) [0|3] "" XXX + SG_ TOGGLE_LKAS : 53|1@0+ (1,0) [0|1] "" XXX + +BO_ 878 ACCEL_RELATED_36E: 8 XXX + SG_ ACCEL_OR_RPM_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ACCEL_OR_RPM_1 : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 324 SPEED_2: 8 XXX + SG_ SPEED_2 : 31|16@0+ (0.01,0) [0|255] "m/s" XXX + +BO_ 832 UNKNOWN_340: 8 XXX + SG_ SPEED_DIGITAL : 63|8@0+ (1,0) [0|255] "mph" XXX + +CM_ SG_ 653 BRAKE_PRESSURE "max seems to be 148"; +CM_ SG_ 746 PRNDL "5=L, 4=D, 3=N, 2=R, 1=P"; +CM_ SG_ 320 BRAKE_PRESSED_2 "Value is 5 when brake is pressed by human, 1 when ACC brake"; +CM_ SG_ 320 BRAKE_PRESSED_ACC "set when ACC brakes"; +CM_ SG_ 792 TURN_SIGNALS "1=Left, 2=Right"; +CM_ SG_ 264 ACCEL_PEDAL "not in ACC so seems to be actual pedal. Use for gasPressed"; +CM_ SG_ 544 LKAS_STATE "2 when autopark has control, 8 when is actuatable by lkas, 4 when there is a fault"; +CM_ SG_ 658 LKAS_STEERING_TORQUE "Most sent by stock system is 1024+-230. + is left. typically changes by 2 or 3 each 0.01s"; +CM_ SG_ 678 LKAS_ICON_COLOR "3 is yellow, 2 is green, 1 is white, 0 is null"; +CM_ SG_ 678 LKAS_LANE_LINES "0x01 transparent lines, 0x02 left white, 0x03 right white, 0x04 left yellow with car on top, 0x05 left yellow with car on top, 0x06 both white, 0x07 left yellow, 0x08 left yellow right white, 0x09 right yellow, 0x0a right yellow left white, 0x0b left yellow with car on top right white, 0x0c right yellow with car on top left white, (0x00, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 678 LKAS_ALERTS "(0x01, 0x02) lane sense off, (0x03, 0x04, 0x06) place hands on steering wheel, 0x07 lane departure detected + place hands on steering wheel, (0x08, 0x09) lane sense unavailable + clean front windshield, 0x0b lane sense and auto high beam unavailable + clean front windshield, 0x0c lane sense unavailable + service required, (0x00, 0x05, 0x0a, 0x0d, 0x0e, 0x0f) null"; +CM_ SG_ 705 AUTO_PARK_TOGGLE_1 "set briefly when turning on or off self-parking"; +CM_ SG_ 671 AUTO_PARK_CMD "Request Appears to be in NM"; +CM_ SG_ 671 AUTO_PARK_STATUS "1 = IDLE / NO REQUEST 9 = START REQUEST 10 = REQUEST MODE 11 = REQUEST MODE"; +CM_ SG_ 826 AUTO_PARK_GEAR_1 "Reverse=0, Forward=f"; +CM_ SG_ 826 AUTO_PARK_GEAR_2 "Reverse=0, Forward=f"; +CM_ SG_ 826 AUTO_PARK_GEAR_3 "Reverse=0, Forward=f"; +CM_ SG_ 332 STEER_ANGLE_2 "slightly lags the other steer_angle signal. also more noisy."; +CM_ SG_ 608 PARKSENSE_DISABLED "set if parksense is disabled"; +CM_ SG_ 729 LKAS_STATUS_OK "Set to 0x0820 when LKAS system is plugged in."; +CM_ SG_ 825 BEEP_339 "sent every 0.5s. 0050 is no beep. To beep send 4355 or 4155. Used by ParkSense warning."; +CM_ SG_ 270 ELECTRIC_MOTOR "0x7fff indicates electric motor not in use"; +CM_ SG_ 291 ENERGY_GAIN_LOSS "unsure what this actually is"; +CM_ SG_ 291 ENERGY_SMOOTHER_CURVE "unsure what it is, but smoother"; +CM_ SG_ 308 ACCEL_134 "only set when human presses accel pedal"; +CM_ SG_ 532 NOISY_SLOWLY_DECREASING "perhaps battery but do not know"; +CM_ SG_ 816 TRACTION_OFF "set when traction off button is enabled"; +CM_ SG_ 816 TOGGLE_PARKSENSE "sending 3000071ec0ff9000 enables or disables parksense"; +CM_ SG_ 324 SPEED_2 "signal is approx half other speeds"; +CM_ SG_ 501 ACC_SPEED_CONFIG_KPH "speed configured for ACC"; +CM_ SG_ 501 ACC_SPEED_CONFIG_MPH "speed configured for ACC"; +CM_ SG_ 501 CRUISE_STATE "may just be an icon, but seems to indicate different cruise modes: ACC and Non-ACC and engaged state for both."; +CM_ SG_ 625 SPEED "zero on non-acc drives"; + +VAL_ 501 CRUISE_STATE 0 "Off" 1 "CC On" 2 "CC Engaged" 3 "ACC On" 4 "ACC Engaged"; +VAL_ 746 PRNDL 5 "L" 4 "D" 3 "N" 2 "R" 1 "P"; +VAL_ 792 TURN_SIGNALS 2 "Right" 1 "Left"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_ram_dt.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_ram_dt.dbc new file mode 100644 index 000000000..c9be635e1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_ram_dt.dbc @@ -0,0 +1,57 @@ +CM_ "IMPORT _stellantis_common_ram_dt_generated.dbc"; + +BO_ 53 PCM_2: 8 XXX + SG_ ENG_TORQUE_REQ : 3|12@0+ (1,0) [0|7] "" XXX + SG_ ENG_TORQUE_OUT : 19|12@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + +BO_ 133 TCM_1: 8 XXX + SG_ SHIFT_PENDING : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ACTUAL_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DESIRED_GEAR : 15|4@0+ (1,0) [0|1] "" XXX + SG_ TC_LOCKED : 17|1@1+ (1,0) [0|0] "" XXX + SG_ OUTPUT_SPEED : 31|16@0+ (1,0) [0|65534] "rpm" XXX + SG_ INPUT_SPEED : 47|16@0+ (1,0) [0|65534] "rpm" XXX + SG_ OUTPUT_SPEED_SIGN : 57|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|4@0+ (1,0) [0|15] "" XXX + +BO_ 135 ABS_2: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_BRAKE : 15|8@0+ (1,0) [0|1] "" XXX + +BO_ 137 ESP_4: 8 XXX + SG_ Yaw_Rate : 7|16@0+ (0.01,-327.68) [-327.68|327.66] "deg/s" XXX + SG_ Acceleration : 32|8@1+ (0.08,-10.24) [-10.24|10.08] "m/s2" XXX + +BO_ 164 EPS_3: 8 XXX + SG_ DASM_FAULT : 34|1@0+ (1,0) [0|1] "" XXX + SG_ Activation_Status : 48|3@1+ (1,0) [0|1] "" XXX + SG_ Driver_Override : 35|1@0+ (1,0) [0|1] "" XXX + SG_ Hands_on_Wheel : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 166 LKAS_COMMAND: 8 XXX + SG_ STEERING_TORQUE : 10|11@0+ (1,-1024) [0|1] "" XXX + SG_ LKAS_CONTROL_BIT : 24|3@1+ (1,0) [0|1] "" XXX + SG_ DASM_FAULT : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 221 Center_Stack_1: 8 XXX + SG_ LKAS_Button : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Traction_Button : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 650 Center_Stack_2: 8 XXX + SG_ LKAS_Button : 57|1@1+ (1,0) [0|0] "" XXX + + +CM_ SG_ 133 ACTUAL_GEAR "0xd = P, 0x1-8 = D (actual gear), 0xb = R or N?? TODO find R vs N"; +CM_ SG_ 153 ACC_Engaged "SENT BY FORWARD CAMERA 1 = ACTIVE, 3 = ENGAGED, 0 = DISENGAGED/OFF"; +CM_ SG_ 166 LKAS_CONTROL_BIT "0=IDLE, 1=HAS 2=LKAS 3=ABSD, 4=TJA, 7=SNA"; +CM_ SG_ 250 Auto_High_Beam "1 = HIGH BEAMS OK 0 = HIGH BEAMS OFF "; +CM_ SG_ 250 LKAS_LANE_LINES "9 = LEFT CAUTION, 11 = VERY LEFT CAUTION 10 = RIGHT CAUTION, 14 = VERY RIGHT, 4 = NO LINES DETECTED, 3 = LINES DETECTED, SYSTEM ACTIVE"; +CM_ SG_ 464 Driver_Seatbelt_Status "1 unbuckled 0 buckled"; +CM_ SG_ 792 High_Beam_Lever_Status "1 is high beam, 0 reg"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_ram_hd.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_ram_hd.dbc new file mode 100644 index 000000000..5f5feee65 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/chrysler/chrysler_ram_hd.dbc @@ -0,0 +1,23 @@ +CM_ "IMPORT _stellantis_common_ram_hd_generated.dbc"; + +BO_ 545 EPS_3: 8 XXX + SG_ DASM_FAULT : 34|1@0+ (1,0) [0|1] "" XXX + SG_ Activation_Status : 48|3@1+ (1,0) [0|1] "" XXX + SG_ Driver_Override : 35|1@0+ (1,0) [0|1] "" XXX + SG_ Hands_on_Wheel : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 630 LKAS_COMMAND: 8 XXX + SG_ STEERING_TORQUE : 10|11@0+ (1,-1024) [0|1] "" XXX + SG_ LKAS_CONTROL_BIT : 24|3@1+ (1,0) [0|1] "" XXX + SG_ DASM_FAULT : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 816 Center_Stack_1: 8 XXX + SG_ LKAS_Button : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Traction_Button : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 650 Center_Stack_2: 8 XXX + SG_ LKAS_Button : 57|1@1+ (1,0) [0|0] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/ford/FORD_CADS_64.sh b/artifacts/package_runtime/iqdbc/dbc/generator/ford/FORD_CADS_64.sh new file mode 100755 index 000000000..4732a854e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/ford/FORD_CADS_64.sh @@ -0,0 +1,2845 @@ +#!/bin/bash + +OUT_FILENAME="../../FORD_CADS_64.dbc" + + +build_bo(){ +id=$1 +# bo=$(($id + 287)) +bo=$(expr $id + 287) + +len=64 +if [ "$id" = "22" ]; then + len=24 +fi + +cat <> ${OUT_FILENAME} +BO_ ${bo} MRR_Detection_0${id}: ${len} MRR +EOF + +build_bo_segment $id "01" +build_bo_segment $id "02" +build_bo_segment $id "03" +if [ "$id" != "22" ]; then + build_bo_segment $id "04" + build_bo_segment $id "05" + build_bo_segment $id "06" +fi +echo "" >> ${OUT_FILENAME} + +} + +build_bo_segment(){ + id=$1 + seg=$2 + base=$((($2 - 1)*72)) +cat <> ${OUT_FILENAME} + SG_ CAN_DET_CONFID_AZIMUTH_${id}_${seg} : $(expr $base + 33)|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_${id}_${seg} : $(expr $base + 56)|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_${id}_${seg} : $(expr $base + 48)|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_${id}_${seg} : $(expr $base + 49)|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_${id}_${seg} : $(expr $base + 0)|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_${id}_${seg} : $(expr $base + 47)|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_${id}_${seg} : $(expr $base + 31)|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_${id}_${seg} : $(expr $base + 15)|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_${id}_${seg} : $(expr $base + 7)|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_${id}_${seg} : $(expr $base + 17)|2@0+ (1,0) [0|3] "" IFV_VFP +EOF +} + + +build_ba(){ +id=$1 +# bo=$(($id + 287)) +ba=$(expr $id + 287) + +len=64 +if [ "$id" = "22" ]; then + len=24 +fi + +cat <> ${OUT_FILENAME} +BA_ "GenMsgSendType" BO_ ${ba} 1; +BA_ "GenMsgILSupport" BO_ ${ba} 1; +BA_ "GenMsgNrOfRepetition" BO_ ${ba} 0; +BA_ "GenMsgCycleTime" BO_ ${ba} 0; +BA_ "NetworkInitialization" BO_ ${ba} 0; +BA_ "GenMsgDelayTime" BO_ ${ba} 0; +EOF + +build_ba_segment $ba $id "01" +build_ba_segment $ba $id "02" +build_ba_segment $ba $id "03" +if [ "$id" != "22" ]; then + build_ba_segment $ba $id "04" + build_ba_segment $ba $id "05" + build_ba_segment $ba $id "06" +fi + +} + +build_ba_segment(){ + ba=$1 + id=$2 + seg=$3 + +cat <> ${OUT_FILENAME} +BA_ "GenSigVtEn" SG_ ${ba} CAN_DET_CONFID_AZIMUTH_${id}_${seg} "CAN_DET_CONFID_AZIMUTH_${id}_${seg}"; +BA_ "GenSigVtName" SG_ ${ba} CAN_DET_CONFID_AZIMUTH_${id}_${seg} "CAN_DET_CONFID_AZIMUTH_${id}_${seg}"; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_CONFID_AZIMUTH_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_CONFID_AZIMUTH_${id}_${seg} "CAN_DET_CONFID_AZIMUTH_${id}_${seg}"; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_SUPER_RES_TARGET_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_SUPER_RES_TARGET_${id}_${seg} "CAN_DET_SUPER_RES_TARGET_${id}_${seg}"; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_ND_TARGET_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_ND_TARGET_${id}_${seg} "CAN_DET_ND_TARGET_${id}_${seg}"; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_HOST_VEH_CLUTTER_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_HOST_VEH_CLUTTER_${id}_${seg} "CAN_DET_HOST_VEH_CLUTTER_${id}_${seg}"; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_VALID_LEVEL_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_VALID_LEVEL_${id}_${seg} "CAN_DET_VALID_LEVEL_${id}_${seg}"; +BA_ "GenSigStartValue" SG_ ${ba} CAN_DET_AZIMUTH_${id}_${seg} 0; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_AZIMUTH_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_AZIMUTH_${id}_${seg} "CAN_DET_AZIMUTH_${id}_${seg}"; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_RANGE_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_RANGE_${id}_${seg} "CAN_DET_RANGE_${id}_${seg}"; +BA_ "GenSigStartValue" SG_ ${ba} CAN_DET_RANGE_RATE_${id}_${seg} 0; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_RANGE_RATE_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_RANGE_RATE_${id}_${seg} "CAN_DET_RANGE_RATE_${id}_${seg}"; +BA_ "GenSigSendType" SG_ ${ba} CAN_DET_AMPLITUDE_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_DET_AMPLITUDE_${id}_${seg} "CAN_DET_AMPLITUDE_${id}_${seg}"; +BA_ "GenSigSendType" SG_ ${ba} CAN_SCAN_INDEX_2LSB_${id}_${seg} 0; +BA_ "GenSigCmt" SG_ ${ba} CAN_SCAN_INDEX_2LSB_${id}_${seg} "CAN_SCAN_INDEX_2LSB_${id}_${seg}"; +EOF +} + +build_val(){ +id=$1 +# bo=$(($id + 287)) +val=$(expr $id + 287) + +cat <> ${OUT_FILENAME} +VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_01 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_02 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_03 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +EOF +if [ "$id" != "22" ]; then +cat <> ${OUT_FILENAME} +VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_04 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_05 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ ${val} CAN_DET_CONFID_AZIMUTH_${id}_06 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +EOF +fi + +} + + +cat < ${OUT_FILENAME} +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: +BU_: MRR +BO_ 1073741824 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX + SG_ New_Signal_943 : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ CAN_SENSOR_VANGLE_OFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX + SG_ CAN_SENSOR_FOV_VER : 0|8@0+ (1,0) [0|255] "deg" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE_QF : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE_REF : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_AUTO_ALIGN_VANGLE : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_MMIC_Temp4 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_MMIC_Temp3 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_MMIC_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_Processor_Temp2 : 0|8@0+ (1,-50) [-50|205] "C" Vector__XXX + SG_ CAN_CHECKSUM : 0|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ CAN_COUNTER : 0|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ CAN_VEHICLE_MODE : 0|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ CAN_USC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_USC_CAL_VER_MINOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_SMC_CAL_VER_MAJOR : 0|16@0+ (1,0) [0|65535] "" Vector__XXX + SG_ CAN_HW_VERSION : 0|32@0+ (1,0) [0|4.29497e+09] "" Vector__XXX + SG_ CAN_FAC_TGT_MTG_SPACE_VER : 0|8@0+ (1,-128) [-128|127] "cm" Vector__XXX + SG_ CAN_ANGLE_MISALIGNMENT_VER : 0|10@0+ (0.03125,-10) [-10|21.9688] "deg" Vector__XXX + SG_ CAN_ANGLE_MOUNTING_VOFFSET : 0|8@0+ (0.0625,-8) [-8|7.9375] "deg" Vector__XXX + SG_ CAN_LATCH_FAULTS : 0|64@0+ (1,0) [0|100] "" Vector__XXX + SG_ CAN_ACTIVE_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX + SG_ CAN_HISTORY_FAULTS : 0|64@0+ (1,0) [0|1.84467e+19] "" Vector__XXX + SG_ CAN_SERV_ALIGN_ENABLE : 0|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ CAN_LONG_MOUNTING_OFFSET : 0|8@0+ (0.015625,-2) [-2|1.98438] "" Vector__XXX + SG_ CAN_BEAMWIDTH_VERT : 0|7@0+ (0.125,0) [0|15.875] "deg" Vector__XXX + SG_ CAN_VEHICLE_SPEED_CALC_QF : 0|2@0+ (1,0) [0|3] "" Vector__XXX + +BO_ 34 Active_Fault_Latched_2: 8 MRR + SG_ IPMA_PCAN_DataRangeCheck : 4|1@1+ (1,0) [0|1] "" External_Tool + SG_ IPMA_PCAN_MissingMsg : 3|1@1+ (1,0) [0|1] "" External_Tool + SG_ VINSignalCompareFailure : 2|1@1+ (1,0) [0|1] "" External_Tool + SG_ ModuleNotConfiguredError : 1|1@1+ (1,0) [0|1] "" External_Tool + SG_ CarCfgNotConfiguredError : 0|1@1+ (1,0) [0|1] "" External_Tool + +BO_ 33 Active_Fault_Latched_1: 8 MRR + SG_ Active_Flt_Latched_byte7_bit7 : 63|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit6 : 62|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit5 : 61|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte7_bit4 : 60|1@1+ (1,0) [0|1] "" External_Tool + SG_ ARMtoDSPChksumFault : 59|1@1+ (1,0) [0|1] "" External_Tool + SG_ DSPtoArmChksumFault : 58|1@1+ (1,0) [0|1] "" External_Tool + SG_ HostToArmChksumFault : 57|1@1+ (1,0) [0|1] "" External_Tool + SG_ ARMtoHostChksumFault : 56|1@1+ (1,0) [0|1] "" External_Tool + SG_ LoopBWOutOfRange : 55|1@1+ (1,0) [0|1] "" External_Tool + SG_ DSPOverrunFault : 54|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte6_bit5 : 53|1@1+ (1,0) [0|1] "" External_Tool + SG_ TuningSensitivityFault : 52|1@1+ (1,0) [0|1] "" External_Tool + SG_ SaturatedTuningFreqFault : 51|1@1+ (1,0) [0|1] "" External_Tool + SG_ LocalOscPowerFault : 50|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterPowerFault : 49|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte6_bit0 : 48|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit7 : 47|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit6 : 46|1@1+ (1,0) [0|1] "" External_Tool + SG_ XCVRDeviceSPIFault : 45|1@1+ (1,0) [0|1] "" External_Tool + SG_ FreqSynthesizerSPIFault : 44|1@1+ (1,0) [0|1] "" External_Tool + SG_ AnalogConverterDevicSPIFault : 43|1@1+ (1,0) [0|1] "" External_Tool + SG_ SidelobeBlockage : 42|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte5_bit1 : 41|1@1+ (1,0) [0|1] "" External_Tool + SG_ MNRBlocked : 40|1@1+ (1,0) [0|1] "" External_Tool + SG_ ECUTempHighFault : 39|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterTempHighFault : 38|1@1+ (1,0) [0|1] "" External_Tool + SG_ AlignmentRoutineFailedFault : 37|1@1+ (1,0) [0|1] "" External_Tool + SG_ UnreasonableRadarData : 36|1@1+ (1,0) [0|1] "" External_Tool + SG_ MicroprocessorTempHighFault : 35|1@1+ (1,0) [0|1] "" External_Tool + SG_ VerticalAlignmentOutOfRange : 34|1@1+ (1,0) [0|1] "" External_Tool + SG_ HorizontalAlignmentOutOfRange : 33|1@1+ (1,0) [0|1] "" External_Tool + SG_ FactoryAlignmentMode : 32|1@1+ (1,0) [0|1] "" External_Tool + SG_ BatteryLowFault : 31|1@1+ (1,0) [0|1] "" External_Tool + SG_ BatteryHighFault : 30|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_1p25SupplyOutOfRange : 29|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte3_bit4 : 28|1@1+ (1,0) [0|1] "" External_Tool + SG_ ThermistorOutOfRange : 27|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_3p3DACSupplyOutOfRange : 26|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_3p3RAWSupplyOutOfRange : 25|1@1+ (1,0) [0|1] "" External_Tool + SG_ v_5_SupplyOutOfRange : 24|1@1+ (1,0) [0|1] "" External_Tool + SG_ TransmitterIDFault : 23|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit6 : 22|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit5 : 21|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit4 : 20|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit3 : 19|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte2_bit2 : 18|1@1+ (1,0) [0|1] "" External_Tool + SG_ PCANMissingMsgFault : 17|1@1+ (1,0) [0|1] "" External_Tool + SG_ PCANBusOff : 16|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit7 : 15|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit6 : 14|1@1+ (1,0) [0|1] "" External_Tool + SG_ InstructionSetCheckFault : 13|1@1+ (1,0) [0|1] "" External_Tool + SG_ StackOverflowFault : 12|1@1+ (1,0) [0|1] "" External_Tool + SG_ WatchdogFault : 11|1@1+ (1,0) [0|1] "" External_Tool + SG_ PLLLockFault : 10|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte1_bit1 : 9|1@1+ (1,0) [0|1] "" External_Tool + SG_ RAMMemoryTestFault : 8|1@1+ (1,0) [0|1] "" External_Tool + SG_ USCValidationFault : 7|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit6 : 6|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit5 : 5|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit4 : 4|1@1+ (1,0) [0|1] "" External_Tool + SG_ Active_Flt_Latched_byte0_bit3 : 3|1@1+ (1,0) [0|1] "" External_Tool + SG_ KeepAliveChecksumFault : 2|1@1+ (1,0) [0|1] "" External_Tool + SG_ ProgramCalibrationFlashChecksum : 1|1@1+ (1,0) [0|1] "" External_Tool + SG_ ApplicationFlashChecksumFault : 0|1@1+ (1,0) [0|1] "" External_Tool + +BO_ 500 XCP_MRR_DAQ_RESP: 8 MRR + SG_ MRR_xcp_daq_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_daq_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 499 XCP_MRR_DTO_RESP: 8 MRR + SG_ MRR_xcp_dto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_dto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 497 XCP_MRR_CTO_RESP: 8 MRR + SG_ MRR_xcp_cto_resp_byte7 : 63|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte6 : 55|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte5 : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte4 : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte3 : 31|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte2 : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte1 : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ MRR_xcp_cto_resp_byte0 : 7|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 1900 Ford_Diag_Resp_Phys: 8 MRR + SG_ TesterPhysicalResCCM : 7|64@0+ (1,0) [0|1.84467e+19] "" IFV_Host + +BO_ 261 MRR_Status_SerialNumber: 8 MRR + SG_ CAN_SEQUENCE_NUMBER : 55|16@0+ (1,0) [0|65535] "" External_Tool + SG_ CAN_SERIAL_NUMBER : 7|40@0+ (1,0) [0|1.09951e+12] "" External_Tool + +BO_ 264 MRR_Status_SwVersion: 8 MRR + SG_ CAN_PBL_Field_Revision : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_PBL_Promote_Revision : 39|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Field_Revision : 23|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Promote_Revision : 15|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_SW_Release_Revision : 7|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_PBL_Release_Revision : 31|8@0+ (1,0) [0|255] "" External_Tool + +BO_ 373 MRR_Header_SensorPosition: 8 MRR + SG_ CAN_SENSOR_POLARITY : 55|1@0+ (1,0) [0|1] "" External_Tool + SG_ CAN_SENSOR_LAT_OFFSET : 39|16@0+ (0.01,0) [0|655.35] "cm" External_Tool + SG_ CAN_SENSOR_LONG_OFFSET : 23|16@0+ (0.01,0) [0|655.35] "cm" External_Tool + SG_ CAN_SENSOR_HANGLE_OFFSET : 7|8@0+ (0.0625,-8) [-8|7.9375] "deg" External_Tool + +BO_ 372 MRR_Header_SensorCoverage: 8 MRR + SG_ CAN_SENSOR_FOV_HOR : 39|8@0+ (1,0) [0|255] "deg" IFV_VFP + SG_ CAN_DOPPLER_COVERAGE : 23|8@0+ (1,-128) [-128|127] "m/s" IFV_VFP + SG_ CAN_RANGE_COVERAGE : 7|8@0+ (1,0) [0|255] "m" IFV_VFP + +BO_ 371 MRR_Header_AlignmentState: 8 MRR + SG_ CAN_AUTO_ALIGN_HANGLE_QF : 13|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_ALIGNMENT_STATUS : 51|4@0+ (1,0) [0|11] "" IFV_VFP + SG_ CAN_ALIGNMENT_STATE : 55|3@0+ (1,0) [0|7] "" IFV_VFP + SG_ CAN_AUTO_ALIGN_HANGLE_REF : 11|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP + SG_ CAN_AUTO_ALIGN_HANGLE : 7|10@0+ (0.000341218,-0.174533) [-0.174533|0.174533] "rad" IFV_VFP + +BO_ 369 MRR_Header_Timestamps: 8 MRR + SG_ CAN_DET_TIME_SINCE_MEAS : 39|11@0+ (0.1,0) [0|204.7] "ms" IFV_Host + SG_ CAN_SENSOR_TIME_STAMP : 7|32@0+ (0.1,0) [0|4.29497e+08] "ms" IFV_VFP + +BO_ 368 MRR_Header_InformationDetections: 8 MRR + SG_ CAN_ALIGN_UPDATES_DONE : 55|16@0+ (1,0) [0|65535] "" IFV_VFP + SG_ CAN_SCAN_INDEX : 31|16@0+ (1,0) [0|65535] "" IFV_VFP + SG_ CAN_NUMBER_OF_DET : 47|8@0+ (1,0) [0|255] "" External_Tool + SG_ CAN_LOOK_ID : 23|2@0+ (1,0) [0|3] "" External_Tool + SG_ CAN_LOOK_INDEX : 7|16@0+ (1,0) [0|65535] "" External_Tool + +BO_ 265 MRR_Status_Temp_Volt: 8 MRR + SG_ CAN_BATT_VOLTS : 63|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_1_25_V : 55|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_5_V : 47|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_3_3_V_RAW : 31|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_3_3_V_DAC : 15|8@0+ (0.08,0) [0|20.4] "V" External_Tool + SG_ CAN_MMIC_Temp1 : 39|8@0+ (1,-50) [-50|205] "C" External_Tool + SG_ CAN_Processor_Thermistor : 23|8@0+ (1,-50) [-50|205] "C" External_Tool + SG_ CAN_Processor_Temp1 : 7|8@0+ (1,-50) [-50|205] "C" External_Tool + +EOF + +build_bo "04" + +cat <> ${OUT_FILENAME} +BO_ 351 MRR_Detection_064: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_64 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_64 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_64 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_64 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_64 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_64 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_64 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_64 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_64 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_64 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 350 MRR_Detection_063: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_63 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_63 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_63 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_63 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_63 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_63 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_63 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_63 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_63 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_63 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 349 MRR_Detection_062: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_62 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_62 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_62 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_62 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_62 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_62 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_62 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_62 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_62 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_62 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 348 MRR_Detection_061: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_61 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_61 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_61 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_61 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_61 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_61 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_61 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_61 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_61 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_61 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 347 MRR_Detection_060: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_60 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_60 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_60 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_60 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_60 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_60 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_60 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_60 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_60 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_60 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 346 MRR_Detection_059: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_59 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_59 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_59 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_59 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_59 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_59 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_59 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_59 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_59 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_59 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 345 MRR_Detection_058: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_58 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_58 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_58 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_58 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_58 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_58 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_58 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_58 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_58 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_58 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 344 MRR_Detection_057: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_57 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_57 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_57 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_57 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_57 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_57 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_57 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_57 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_57 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_57 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 343 MRR_Detection_056: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_56 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_56 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_56 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_56 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_56 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_56 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_56 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_56 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_56 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_56 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 342 MRR_Detection_055: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_55 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_55 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_55 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_55 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_55 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_55 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_55 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_55 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_55 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_55 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 335 MRR_Detection_048: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_48 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_48 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_48 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_48 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_48 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_48 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_48 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_48 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_48 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_48 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 334 MRR_Detection_047: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_47 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_47 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_47 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_47 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_47 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_47 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_47 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_47 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_47 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_47 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 333 MRR_Detection_046: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_46 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_46 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_46 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_46 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_46 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_46 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_46 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_46 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_46 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_46 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 332 MRR_Detection_045: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_45 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_45 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_45 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_45 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_45 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_45 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_45 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_45 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_45 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_45 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 331 MRR_Detection_044: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_44 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_44 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_44 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_44 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_44 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_44 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_44 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_44 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_44 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_44 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 330 MRR_Detection_043: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_43 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_43 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_43 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_43 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_43 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_43 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_43 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_43 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_43 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_43 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 329 MRR_Detection_042: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_42 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_42 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_42 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_42 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_42 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_42 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_42 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_42 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_42 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_42 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 328 MRR_Detection_041: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_41 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_41 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_41 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_41 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_41 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_41 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_41 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_41 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_41 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_41 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 327 MRR_Detection_040: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_40 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_40 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_40 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_40 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_40 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_40 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_40 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_40 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_40 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_40 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 325 MRR_Detection_038: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_38 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_38 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_38 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_38 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_38 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_38 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_38 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_38 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_38 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_38 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 324 MRR_Detection_037: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_37 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_37 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_37 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_37 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_37 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_37 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_37 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_37 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_37 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_37 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 323 MRR_Detection_036: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_36 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_36 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_36 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_36 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_36 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_36 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_36 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_36 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_36 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_36 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 322 MRR_Detection_035: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_35 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_35 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_35 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_35 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_35 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_35 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_35 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_35 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_35 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_35 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 321 MRR_Detection_034: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_34 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_34 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_34 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_34 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_34 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_34 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_34 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_34 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_34 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_34 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 320 MRR_Detection_033: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_33 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_33 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_33 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_33 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_33 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_33 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_33 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_33 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_33 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_33 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 319 MRR_Detection_032: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_32 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_32 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_32 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_32 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_32 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_32 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_32 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_32 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_32 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_32 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 318 MRR_Detection_031: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_31 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_31 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_31 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_31 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_31 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_31 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_31 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_31 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_31 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_31 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 317 MRR_Detection_030: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_30 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_30 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_30 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_30 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_30 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_30 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_30 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_30 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_30 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_30 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 316 MRR_Detection_029: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_29 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_29 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_29 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_29 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_29 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_29 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_29 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_29 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_29 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_29 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 314 MRR_Detection_027: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_27 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_27 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_27 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_27 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_27 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_27 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_27 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_27 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_27 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_27 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 313 MRR_Detection_026: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_26 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_26 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_26 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_26 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_26 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_26 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_26 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_26 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_26 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_26 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 312 MRR_Detection_025: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_25 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_25 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_25 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_25 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_25 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_25 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_25 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_25 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_25 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_25 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 311 MRR_Detection_024: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_24 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_24 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_24 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_24 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_24 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_24 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_24 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_24 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_24 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_24 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 310 MRR_Detection_023: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_23 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_23 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_23 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_23 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_23 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_23 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_23 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_23 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_23 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_23 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +EOF + +build_bo "22" +build_bo "21" +build_bo "20" +build_bo "19" +build_bo "18" + +cat <> ${OUT_FILENAME} +BO_ 341 MRR_Detection_054: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_54 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_54 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_54 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_54 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_54 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_54 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_54 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_54 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_54 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_54 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 340 MRR_Detection_053: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_53 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_53 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_53 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_53 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_53 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_53 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_53 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_53 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_53 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_53 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 339 MRR_Detection_052: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_52 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_52 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_52 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_52 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_52 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_52 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_52 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_52 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_52 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_52 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 338 MRR_Detection_051: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_51 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_51 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_51 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_51 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_51 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_51 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_51 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_51 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_51 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_51 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 337 MRR_Detection_050: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_50 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_50 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_50 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_50 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_50 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_50 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_50 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_50 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_50 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_50 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 336 MRR_Detection_049: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_49 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_49 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_49 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_49 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_49 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_49 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_49 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_49 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_49 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_49 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 326 MRR_Detection_039: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_39 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_39 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_39 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_39 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_39 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_39 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_39 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_39 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_39 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_39 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +BO_ 315 MRR_Detection_028: 8 MRR + SG_ CAN_DET_CONFID_AZIMUTH_28 : 33|2@0+ (1,0) [0|3] "" IFV_VFP + SG_ CAN_DET_SUPER_RES_TARGET_28 : 56|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_ND_TARGET_28 : 48|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_HOST_VEH_CLUTTER_28 : 49|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_VALID_LEVEL_28 : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_DET_AZIMUTH_28 : 47|14@0+ (0.0003834,-3.1416) [-3.1416|3.13964] "rad" IFV_VFP + SG_ CAN_DET_RANGE_28 : 31|14@0+ (0.015625,0) [0|255.984] "m" IFV_VFP + SG_ CAN_DET_RANGE_RATE_28 : 15|14@0+ (0.015625,-128) [-128|127.984] "m/s" IFV_VFP + SG_ CAN_DET_AMPLITUDE_28 : 7|7@0+ (1,-64) [-64|63] "dBsm" IFV_VFP + SG_ CAN_SCAN_INDEX_2LSB_28 : 17|2@0+ (1,0) [0|3] "" IFV_VFP + +EOF + +build_bo "17" +build_bo "16" +build_bo "15" +build_bo "14" +build_bo "13" +build_bo "12" +build_bo "11" +build_bo "10" +build_bo "09" +build_bo "08" +build_bo "07" +build_bo "06" +build_bo "05" +build_bo "03" +build_bo "02" + +cat <> ${OUT_FILENAME} +BO_ 256 MRR_Status_CANVersion: 8 MRR + SG_ CAN_USC_SECTION_COMPATIBILITY : 23|16@0+ (1,0) [0|65535] "" External_Tool + SG_ CAN_PCAN_MINOR_MRR : 7|8@0+ (1,0) [0|255] "" IFV_VFP + SG_ CAN_PCAN_MAJOR_MRR : 15|8@0+ (1,0) [0|255] "" IFV_VFP + +BO_ 257 MRR_Status_Radar: 8 MRR + SG_ CAN_INTERFERENCE_TYPE : 11|2@0+ (1,0) [0|3] "" IFV_Host + SG_ CAN_RECOMMEND_UNCONVERGE : 9|1@0+ (1,0) [0|1] "" IFV_Host + SG_ CAN_BLOCKAGE_SIDELOBE_FILTER_VAL : 15|4@0+ (1,0) [0|15] "" IFV_Host + SG_ CAN_RADAR_ALIGN_INCOMPLETE : 8|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_BLOCKAGE_SIDELOBE : 4|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_BLOCKAGE_MNR : 5|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_EXT_COND_NOK : 1|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_ALIGN_OUT_RANGE : 2|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_ALIGN_NOT_START : 0|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_OVERHEAT_ERROR : 3|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_RADAR_NOT_OP : 6|1@0+ (1,0) [0|1] "" IFV_VFP + SG_ CAN_XCVR_OPERATIONAL : 7|1@0+ (1,0) [0|1] "" IFV_VFP + +EOF + +build_bo "01" + +cat <> ${OUT_FILENAME} +BA_DEF_ SG_ "CrossOver_InfoCAN" ENUM "No","Yes"; +BA_DEF_ SG_ "CrossOver_LIN" ENUM "No","Yes","No","Yes"; +BA_DEF_ SG_ "UsedOnPgmDBC" ENUM "No","Yes","No","Yes","No","Yes"; +BA_DEF_ SG_ "ContentDependant" ENUM "No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ SG_ "GenSigTimeoutTime_RCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_GWM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_OCS" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_ABS_ESC" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_CCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_IPMA" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_TSTR" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_SCCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_PSCM" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime__delete" INT 0 100000; +BA_DEF_ SG_ "GenSigTimeoutTime_Generic_BCM" INT 0 100000; +BA_DEF_ BO_ "NmMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "DiagResponse" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "DiagRequest" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "TpTxIndex" INT 0 255; +BA_DEF_ BO_ "DiagState" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "TpApplType" STRING ; +BA_DEF_ BO_ "NmAsrMessage" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "Mulitplexer" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "ConfiguredTransmitter" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "EventRateOfChange" INT 10 10000; +BA_DEF_ BO_ "GenMsgHandlingTypeDoc" STRING ; +BA_DEF_ BO_ "GenMsgHandlingTypeCode" STRING ; +BA_DEF_ BO_ "GenMsgMarked" STRING ; +BA_DEF_ SG_ "GenSigMarked" STRING ; +BA_DEF_ SG_ "GenSigVtIndex" STRING ; +BA_DEF_ SG_ "GenSigVtName" STRING ; +BA_DEF_ SG_ "GenSigVtEn" STRING ; +BA_DEF_ SG_ "GenSigSNA" STRING ; +BA_DEF_ SG_ "GenSigCmt" STRING ; +BA_DEF_ BO_ "GenMsgCmt" STRING ; +BA_DEF_ SG_ "GenSigSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType"; +BA_DEF_ SG_ "GenSigInactiveValue" INT 0 100000; +BA_DEF_ SG_ "GenSigMissingSourceValue" INT 0 1e+09; +BA_DEF_ SG_ "WakeupSignal" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes"; +BA_DEF_ SG_ "GenSigStartValue" INT 0 1e+09; +BA_DEF_ BO_ "GenMsgILSupport" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes"; +BA_DEF_ BO_ "NetworkInitializationCommand" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BO_ "GenMsgSendType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType"; +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_ BO_ "GenMsgCycleTimeFast" INT 0 100000; +BA_DEF_ BO_ "GenMsgDelayTime" INT 0 1000; +BA_DEF_ BO_ "GenMsgNrOfRepetition" INT 0 100; +BA_DEF_ BO_ "GenMsgStartDelayTime" INT 0 10000; +BA_DEF_ BO_ "NetworkInitialization" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes"; +BA_DEF_ BO_ "MessageGateway" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes"; +BA_DEF_ BU_ "ILUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BU_ "NetworkInitializationUsed" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes"; +BA_DEF_ BU_ "PowerType" ENUM "No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","Cyclic","OnWrite","vector_leerstring","OnChange","vector_leerstring","IfActive","vector_leerstring","NoSigSendType","No","Yes","No","Yes","No","Yes","FixedPeriodic","Event","EnabledPeriodic","NotUsed","NotUsed","EventPeriodic","NotUsed","NotUsed","NoMsgSendType","No","Yes","No","Yes","No","Yes","No","Yes","Switched","Latched","Sleep","vector_leerstring","vector_leerstring"; +BA_DEF_ BU_ "NodeStartUpTime" INT 0 10000; +BA_DEF_ BU_ "NodeWakeUpTime" INT 0 10000; +BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ; +BA_DEF_ BO_ "GenMsgForegroundColor" STRING ; +BA_ "GenMsgCycleTime" BO_ 34 1000; +BA_ "GenMsgSendType" BO_ 34 0; +BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck"; +BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_DataRangeCheck "IPMA_PCAN_DataRangeCheck"; +BA_ "GenSigVtEn" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg"; +BA_ "GenSigVtName" SG_ 34 IPMA_PCAN_MissingMsg "IPMA_PCAN_MissingMsg"; +BA_ "GenSigVtEn" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure"; +BA_ "GenSigVtName" SG_ 34 VINSignalCompareFailure "VINSignalCompareFailure"; +BA_ "GenSigVtEn" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError"; +BA_ "GenSigVtName" SG_ 34 ModuleNotConfiguredError "ModuleNotConfiguredError"; +BA_ "GenSigVtEn" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError"; +BA_ "GenSigVtName" SG_ 34 CarCfgNotConfiguredError "CarCfgNotConfiguredError"; +BA_ "GenMsgCycleTime" BO_ 33 1000; +BA_ "GenMsgSendType" BO_ 33 0; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit7 "Active_Flt_Latched_byte7_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit6 "Active_Flt_Latched_byte7_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit5 "Active_Flt_Latched_byte7_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte7_bit4 "Active_Flt_Latched_byte7_bit4"; +BA_ "GenSigVtEn" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault"; +BA_ "GenSigVtName" SG_ 33 ARMtoDSPChksumFault "ARMtoDSPChksumFault"; +BA_ "GenSigVtEn" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault"; +BA_ "GenSigVtName" SG_ 33 DSPtoArmChksumFault "DSPtoArmChksumFault"; +BA_ "GenSigVtEn" SG_ 33 HostToArmChksumFault "HostToArmChksumFault"; +BA_ "GenSigVtName" SG_ 33 HostToArmChksumFault "HostToArmChksumFault"; +BA_ "GenSigVtEn" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault"; +BA_ "GenSigVtName" SG_ 33 ARMtoHostChksumFault "ARMtoHostChksumFault"; +BA_ "GenSigVtEn" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange"; +BA_ "GenSigVtName" SG_ 33 LoopBWOutOfRange "LoopBWOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 DSPOverrunFault "DSPOverrunFault"; +BA_ "GenSigVtName" SG_ 33 DSPOverrunFault "DSPOverrunFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit5 "Active_Flt_Latched_byte6_bit5"; +BA_ "GenSigVtEn" SG_ 33 TuningSensitivityFault "TuningSensitivityFault"; +BA_ "GenSigVtName" SG_ 33 TuningSensitivityFault "TuningSensitivityFault"; +BA_ "GenSigVtEn" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault"; +BA_ "GenSigVtName" SG_ 33 SaturatedTuningFreqFault "SaturatedTuningFreqFault"; +BA_ "GenSigVtEn" SG_ 33 LocalOscPowerFault "LocalOscPowerFault"; +BA_ "GenSigVtName" SG_ 33 LocalOscPowerFault "LocalOscPowerFault"; +BA_ "GenSigVtEn" SG_ 33 TransmitterPowerFault "TransmitterPowerFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterPowerFault "TransmitterPowerFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte6_bit0 "Active_Flt_Latched_byte6_bit0"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit7 "Active_Flt_Latched_byte5_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit6 "Active_Flt_Latched_byte5_bit6"; +BA_ "GenSigVtEn" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault"; +BA_ "GenSigVtName" SG_ 33 XCVRDeviceSPIFault "XCVRDeviceSPIFault"; +BA_ "GenSigVtEn" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault"; +BA_ "GenSigVtName" SG_ 33 FreqSynthesizerSPIFault "FreqSynthesizerSPIFault"; +BA_ "GenSigVtEn" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault"; +BA_ "GenSigVtName" SG_ 33 AnalogConverterDevicSPIFault "AnalogConverterDevicSPIFault"; +BA_ "GenSigVtEn" SG_ 33 SidelobeBlockage "SidelobeBlockage"; +BA_ "GenSigVtName" SG_ 33 SidelobeBlockage "SidelobeBlockage"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte5_bit1 "Active_Flt_Latched_byte5_bit1"; +BA_ "GenSigVtEn" SG_ 33 MNRBlocked "MNRBlocked"; +BA_ "GenSigVtName" SG_ 33 MNRBlocked "MNRBlocked"; +BA_ "GenSigVtEn" SG_ 33 ECUTempHighFault "ECUTempHighFault"; +BA_ "GenSigVtName" SG_ 33 ECUTempHighFault "ECUTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterTempHighFault "TransmitterTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault"; +BA_ "GenSigVtName" SG_ 33 AlignmentRoutineFailedFault "AlignmentRoutineFailedFault"; +BA_ "GenSigVtEn" SG_ 33 UnreasonableRadarData "UnreasonableRadarData"; +BA_ "GenSigVtName" SG_ 33 UnreasonableRadarData "UnreasonableRadarData"; +BA_ "GenSigVtEn" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault"; +BA_ "GenSigVtName" SG_ 33 MicroprocessorTempHighFault "MicroprocessorTempHighFault"; +BA_ "GenSigVtEn" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange"; +BA_ "GenSigVtName" SG_ 33 VerticalAlignmentOutOfRange "VerticalAlignmentOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange"; +BA_ "GenSigVtName" SG_ 33 HorizontalAlignmentOutOfRange "HorizontalAlignmentOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode"; +BA_ "GenSigVtName" SG_ 33 FactoryAlignmentMode "FactoryAlignmentMode"; +BA_ "GenSigVtEn" SG_ 33 BatteryLowFault "BatteryLowFault"; +BA_ "GenSigVtName" SG_ 33 BatteryLowFault "BatteryLowFault"; +BA_ "GenSigVtEn" SG_ 33 BatteryHighFault "BatteryHighFault"; +BA_ "GenSigVtName" SG_ 33 BatteryHighFault "BatteryHighFault"; +BA_ "GenSigVtEn" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_1p25SupplyOutOfRange "v_1p25SupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte3_bit4 "Active_Flt_Latched_byte3_bit4"; +BA_ "GenSigVtEn" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange"; +BA_ "GenSigVtName" SG_ 33 ThermistorOutOfRange "ThermistorOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_3p3DACSupplyOutOfRange "v_3p3DACSupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_3p3RAWSupplyOutOfRange "v_3p3RAWSupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange"; +BA_ "GenSigVtName" SG_ 33 v_5_SupplyOutOfRange "v_5_SupplyOutOfRange"; +BA_ "GenSigVtEn" SG_ 33 TransmitterIDFault "TransmitterIDFault"; +BA_ "GenSigVtName" SG_ 33 TransmitterIDFault "TransmitterIDFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit6 "Active_Flt_Latched_byte2_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit5 "Active_Flt_Latched_byte2_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit4 "Active_Flt_Latched_byte2_bit4"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit3 "Active_Flt_Latched_byte2_bit3"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte2_bit2 "Active_Flt_Latched_byte2_bit2"; +BA_ "GenSigVtEn" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault"; +BA_ "GenSigVtName" SG_ 33 PCANMissingMsgFault "PCANMissingMsgFault"; +BA_ "GenSigVtEn" SG_ 33 PCANBusOff "PCANBusOff"; +BA_ "GenSigVtName" SG_ 33 PCANBusOff "PCANBusOff"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit7 "Active_Flt_Latched_byte1_bit7"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit6 "Active_Flt_Latched_byte1_bit6"; +BA_ "GenSigVtEn" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault"; +BA_ "GenSigVtName" SG_ 33 InstructionSetCheckFault "InstructionSetCheckFault"; +BA_ "GenSigVtEn" SG_ 33 StackOverflowFault "StackOverflowFault"; +BA_ "GenSigVtName" SG_ 33 StackOverflowFault "StackOverflowFault"; +BA_ "GenSigVtEn" SG_ 33 WatchdogFault "WatchdogFault"; +BA_ "GenSigVtName" SG_ 33 WatchdogFault "WatchdogFault"; +BA_ "GenSigVtEn" SG_ 33 PLLLockFault "PLLLockFault"; +BA_ "GenSigVtName" SG_ 33 PLLLockFault "PLLLockFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte1_bit1 "Active_Flt_Latched_byte1_bit1"; +BA_ "GenSigVtEn" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault"; +BA_ "GenSigVtName" SG_ 33 RAMMemoryTestFault "RAMMemoryTestFault"; +BA_ "GenSigVtName" SG_ 33 USCValidationFault "USCValidationFault"; +BA_ "GenSigVtEn" SG_ 33 USCValidationFault "USCValidationFault"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit6 "Active_Flt_Latched_byte0_bit6"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit5 "Active_Flt_Latched_byte0_bit5"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit4 "Active_Flt_Latched_byte0_bit4"; +BA_ "GenSigVtEn" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3"; +BA_ "GenSigVtName" SG_ 33 Active_Flt_Latched_byte0_bit3 "Active_Flt_Latched_byte0_bit3"; +BA_ "GenSigVtEn" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault"; +BA_ "GenSigVtName" SG_ 33 KeepAliveChecksumFault "KeepAliveChecksumFault"; +BA_ "GenSigVtEn" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum"; +BA_ "GenSigVtName" SG_ 33 ProgramCalibrationFlashChecksum "ProgramCalibrationFlashChecksum"; +BA_ "GenSigVtEn" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault"; +BA_ "GenSigVtName" SG_ 33 ApplicationFlashChecksumFault "ApplicationFlashChecksumFault"; +BA_ "GenMsgNrOfRepetition" BO_ 500 0; +BA_ "GenMsgSendType" BO_ 500 1; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte7 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte7 "MRR_xcp_daq_resp_byte7"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte6 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte6 "MRR_xcp_daq_resp_byte6"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte5 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte5 "MRR_xcp_daq_resp_byte5"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte4 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte4 "MRR_xcp_daq_resp_byte4"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte3 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte3 "MRR_xcp_daq_resp_byte3"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte2 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte2 "MRR_xcp_daq_resp_byte2"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte1 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte1 "MRR_xcp_daq_resp_byte1"; +BA_ "GenSigSendType" SG_ 500 MRR_xcp_daq_resp_byte0 0; +BA_ "GenSigCmt" SG_ 500 MRR_xcp_daq_resp_byte0 "MRR_xcp_daq_resp_byte0"; +BA_ "GenMsgNrOfRepetition" BO_ 499 0; +BA_ "GenMsgSendType" BO_ 499 1; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte7 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte7 "MRR_xcp_dto_resp_byte7"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte6 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte6 "MRR_xcp_dto_resp_byte6"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte5 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte5 "MRR_xcp_dto_resp_byte5"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte4 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte4 "MRR_xcp_dto_resp_byte4"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte3 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte3 "MRR_xcp_dto_resp_byte3"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte2 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte2 "MRR_xcp_dto_resp_byte2"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte1 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte1 "MRR_xcp_dto_resp_byte1"; +BA_ "GenSigSendType" SG_ 499 MRR_xcp_dto_resp_byte0 0; +BA_ "GenSigCmt" SG_ 499 MRR_xcp_dto_resp_byte0 "MRR_xcp_dto_resp_byte0"; +BA_ "GenMsgNrOfRepetition" BO_ 497 0; +BA_ "GenMsgSendType" BO_ 497 1; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte7 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte7 "MRR_xcp_cto_resp_byte7"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte6 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte6 "MRR_xcp_cto_resp_byte6"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte5 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte5 "MRR_xcp_cto_resp_byte5"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte4 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte4 "MRR_xcp_cto_resp_byte4"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte3 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte3 "MRR_xcp_cto_resp_byte3"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte2 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte2 "MRR_xcp_cto_resp_byte2"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte1 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte1 "MRR_xcp_cto_resp_byte1"; +BA_ "GenSigSendType" SG_ 497 MRR_xcp_cto_resp_byte0 0; +BA_ "GenSigCmt" SG_ 497 MRR_xcp_cto_resp_byte0 "MRR_xcp_cto_resp_byte0"; +BA_ "GenMsgSendType" BO_ 1900 1; +BA_ "GenMsgNrOfRepetition" BO_ 1900 0; +BA_ "DiagResponse" BO_ 1900 1; +BA_ "GenSigCmt" SG_ 1900 TesterPhysicalResCCM "TesterPhysicalResCCM"; +BA_ "GenSigSendType" SG_ 1900 TesterPhysicalResCCM 0; +BA_ "GenMsgSendType" BO_ 261 0; +BA_ "GenMsgCycleTime" BO_ 261 1000; +BA_ "GenMsgNrOfRepetition" BO_ 261 0; +BA_ "GenSigCmt" SG_ 261 CAN_SEQUENCE_NUMBER "CAN_SEQUENCE_NUMBER"; +BA_ "GenSigCmt" SG_ 261 CAN_SERIAL_NUMBER "CAN_SERIAL_NUMBER"; +BA_ "GenSigSendType" SG_ 261 CAN_SERIAL_NUMBER 0; +BA_ "GenMsgSendType" BO_ 264 1; +BA_ "GenMsgNrOfRepetition" BO_ 264 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Field_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Promote_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Field_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Promote_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_SW_Release_Revision 0; +BA_ "GenSigSendType" SG_ 264 CAN_PBL_Release_Revision 0; +BA_ "GenMsgSendType" BO_ 373 1; +BA_ "NetworkInitialization" BO_ 373 0; +BA_ "GenMsgNrOfRepetition" BO_ 373 0; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_POLARITY 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_POLARITY "CAN_SENSOR_POLARITY"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LAT_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LAT_OFFSET "CAN_SENSOR_LAT_OFFSET"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_LONG_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_LONG_OFFSET "CAN_SENSOR_LONG_OFFSET"; +BA_ "GenSigSendType" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0; +BA_ "GenSigCmt" SG_ 373 CAN_SENSOR_HANGLE_OFFSET "CAN_SENSOR_HANGLE_OFFSET"; +BA_ "GenSigStartValue" SG_ 373 CAN_SENSOR_HANGLE_OFFSET 0; +BA_ "GenMsgSendType" BO_ 372 1; +BA_ "NetworkInitialization" BO_ 372 0; +BA_ "GenMsgNrOfRepetition" BO_ 372 0; +BA_ "GenSigSendType" SG_ 372 CAN_SENSOR_FOV_HOR 0; +BA_ "GenSigCmt" SG_ 372 CAN_SENSOR_FOV_HOR "CAN_SENSOR_FOV_HOR"; +BA_ "GenSigStartValue" SG_ 372 CAN_SENSOR_FOV_HOR 0; +BA_ "GenSigSendType" SG_ 372 CAN_DOPPLER_COVERAGE 0; +BA_ "GenSigCmt" SG_ 372 CAN_DOPPLER_COVERAGE "CAN_DOPPLER_COVERAGE"; +BA_ "GenSigStartValue" SG_ 372 CAN_DOPPLER_COVERAGE 0; +BA_ "GenSigSendType" SG_ 372 CAN_RANGE_COVERAGE 0; +BA_ "GenSigCmt" SG_ 372 CAN_RANGE_COVERAGE "CAN_RANGE_COVERAGE"; +BA_ "GenMsgSendType" BO_ 371 1; +BA_ "NetworkInitialization" BO_ 371 0; +BA_ "GenMsgNrOfRepetition" BO_ 371 0; +BA_ "GenSigVtEn" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigVtName" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_QF "CAN_AUTO_ALIGN_HANGLE_QF"; +BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATUS 0; +BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATUS "CAN_ALIGNMENT_STATUS"; +BA_ "GenSigVtEn" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigVtName" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigSendType" SG_ 371 CAN_ALIGNMENT_STATE 0; +BA_ "GenSigCmt" SG_ 371 CAN_ALIGNMENT_STATE "CAN_ALIGNMENT_STATE"; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0; +BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE_REF "CAN_AUTO_ALIGN_HANGLE_REF"; +BA_ "GenSigStartValue" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0; +BA_ "GenSigSendType" SG_ 371 CAN_AUTO_ALIGN_HANGLE 0; +BA_ "GenSigCmt" SG_ 371 CAN_AUTO_ALIGN_HANGLE "CAN_AUTO_ALIGN_HANGLE"; +BA_ "GenMsgSendType" BO_ 369 1; +BA_ "NetworkInitialization" BO_ 369 0; +BA_ "GenMsgNrOfRepetition" BO_ 369 0; +BA_ "GenSigCmt" SG_ 369 CAN_DET_TIME_SINCE_MEAS "CAN_DET_TIME_SINCE_MEAS"; +BA_ "GenSigSendType" SG_ 369 CAN_DET_TIME_SINCE_MEAS 0; +BA_ "GenSigSendType" SG_ 369 CAN_SENSOR_TIME_STAMP 0; +BA_ "GenSigCmt" SG_ 369 CAN_SENSOR_TIME_STAMP "CAN_SENSOR_TIME_STAMP"; +BA_ "GenMsgSendType" BO_ 368 1; +BA_ "NetworkInitialization" BO_ 368 0; +BA_ "GenMsgNrOfRepetition" BO_ 368 0; +BA_ "GenSigSendType" SG_ 368 CAN_ALIGN_UPDATES_DONE 0; +BA_ "GenSigCmt" SG_ 368 CAN_ALIGN_UPDATES_DONE "CAN_ALIGN_UPDATES_DONE"; +BA_ "GenSigSendType" SG_ 368 CAN_SCAN_INDEX 0; +BA_ "GenSigCmt" SG_ 368 CAN_SCAN_INDEX "CAN_SCAN_INDEX"; +BA_ "GenSigSendType" SG_ 368 CAN_NUMBER_OF_DET 0; +BA_ "GenSigCmt" SG_ 368 CAN_NUMBER_OF_DET "CAN_NUMBER_OF_DET"; +BA_ "GenSigSendType" SG_ 368 CAN_LOOK_ID 0; +BA_ "GenSigCmt" SG_ 368 CAN_LOOK_ID "CAN_LOOK_ID"; +BA_ "GenSigSendType" SG_ 368 CAN_LOOK_INDEX 0; +BA_ "GenSigCmt" SG_ 368 CAN_LOOK_INDEX "CAN_LOOK_INDEX"; +BA_ "GenMsgSendType" BO_ 265 1; +BA_ "NetworkInitialization" BO_ 265 0; +BA_ "GenMsgNrOfRepetition" BO_ 265 0; +BA_ "GenSigCmt" SG_ 265 CAN_BATT_VOLTS "CAN_BATT_VOLTS"; +BA_ "GenSigCmt" SG_ 265 CAN_1_25_V "CAN_1_25_V"; +BA_ "GenSigCmt" SG_ 265 CAN_5_V "CAN_5_V"; +BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_RAW "CAN_3_3_V_RAW"; +BA_ "GenSigCmt" SG_ 265 CAN_3_3_V_DAC "CAN_3_3_V_DAC"; +BA_ "GenSigSendType" SG_ 265 CAN_MMIC_Temp1 0; +BA_ "GenSigCmt" SG_ 265 CAN_MMIC_Temp1 "CAN_MMIC_Temp1"; +BA_ "GenSigStartValue" SG_ 265 CAN_MMIC_Temp1 0; +BA_ "GenSigSendType" SG_ 265 CAN_Processor_Thermistor 0; +BA_ "GenSigCmt" SG_ 265 CAN_Processor_Thermistor "CAN_Processor_Thermistor"; +BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Thermistor 0; +BA_ "GenSigSendType" SG_ 265 CAN_Processor_Temp1 0; +BA_ "GenSigCmt" SG_ 265 CAN_Processor_Temp1 "CAN_Processor_Temp1"; +BA_ "GenSigStartValue" SG_ 265 CAN_Processor_Temp1 0; +EOF + +build_ba "04" + +cat <> ${OUT_FILENAME} +BA_ "GenMsgSendType" BO_ 351 1; +BA_ "GenMsgILSupport" BO_ 351 1; +BA_ "GenMsgNrOfRepetition" BO_ 351 0; +BA_ "GenMsgCycleTime" BO_ 351 0; +BA_ "NetworkInitialization" BO_ 351 0; +BA_ "GenMsgDelayTime" BO_ 351 0; +BA_ "GenSigVtEn" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigVtName" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_CONFID_AZIMUTH_64 "CAN_DET_CONFID_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_SUPER_RES_TARGET_64 "CAN_DET_SUPER_RES_TARGET_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_ND_TARGET_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_ND_TARGET_64 "CAN_DET_ND_TARGET_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_HOST_VEH_CLUTTER_64 "CAN_DET_HOST_VEH_CLUTTER_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_VALID_LEVEL_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_VALID_LEVEL_64 "CAN_DET_VALID_LEVEL_64"; +BA_ "GenSigStartValue" SG_ 351 CAN_DET_AZIMUTH_64 0; +BA_ "GenSigSendType" SG_ 351 CAN_DET_AZIMUTH_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_AZIMUTH_64 "CAN_DET_AZIMUTH_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_64 "CAN_DET_RANGE_64"; +BA_ "GenSigStartValue" SG_ 351 CAN_DET_RANGE_RATE_64 0; +BA_ "GenSigSendType" SG_ 351 CAN_DET_RANGE_RATE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_RANGE_RATE_64 "CAN_DET_RANGE_RATE_64"; +BA_ "GenSigSendType" SG_ 351 CAN_DET_AMPLITUDE_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_DET_AMPLITUDE_64 "CAN_DET_AMPLITUDE_64"; +BA_ "GenSigSendType" SG_ 351 CAN_SCAN_INDEX_2LSB_64 0; +BA_ "GenSigCmt" SG_ 351 CAN_SCAN_INDEX_2LSB_64 "CAN_SCAN_INDEX_2LSB_64"; +BA_ "GenMsgSendType" BO_ 350 1; +BA_ "GenMsgILSupport" BO_ 350 1; +BA_ "GenMsgNrOfRepetition" BO_ 350 0; +BA_ "GenMsgCycleTime" BO_ 350 0; +BA_ "NetworkInitialization" BO_ 350 0; +BA_ "GenMsgDelayTime" BO_ 350 0; +BA_ "GenSigVtEn" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigVtName" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_CONFID_AZIMUTH_63 "CAN_DET_CONFID_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_SUPER_RES_TARGET_63 "CAN_DET_SUPER_RES_TARGET_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_ND_TARGET_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_ND_TARGET_63 "CAN_DET_ND_TARGET_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_HOST_VEH_CLUTTER_63 "CAN_DET_HOST_VEH_CLUTTER_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_VALID_LEVEL_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_VALID_LEVEL_63 "CAN_DET_VALID_LEVEL_63"; +BA_ "GenSigStartValue" SG_ 350 CAN_DET_AZIMUTH_63 0; +BA_ "GenSigSendType" SG_ 350 CAN_DET_AZIMUTH_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_AZIMUTH_63 "CAN_DET_AZIMUTH_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_63 "CAN_DET_RANGE_63"; +BA_ "GenSigStartValue" SG_ 350 CAN_DET_RANGE_RATE_63 0; +BA_ "GenSigSendType" SG_ 350 CAN_DET_RANGE_RATE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_RANGE_RATE_63 "CAN_DET_RANGE_RATE_63"; +BA_ "GenSigSendType" SG_ 350 CAN_DET_AMPLITUDE_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_DET_AMPLITUDE_63 "CAN_DET_AMPLITUDE_63"; +BA_ "GenSigSendType" SG_ 350 CAN_SCAN_INDEX_2LSB_63 0; +BA_ "GenSigCmt" SG_ 350 CAN_SCAN_INDEX_2LSB_63 "CAN_SCAN_INDEX_2LSB_63"; +BA_ "GenMsgSendType" BO_ 349 1; +BA_ "GenMsgILSupport" BO_ 349 1; +BA_ "GenMsgNrOfRepetition" BO_ 349 0; +BA_ "GenMsgCycleTime" BO_ 349 0; +BA_ "NetworkInitialization" BO_ 349 0; +BA_ "GenMsgDelayTime" BO_ 349 0; +BA_ "GenSigVtEn" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigVtName" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_CONFID_AZIMUTH_62 "CAN_DET_CONFID_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_SUPER_RES_TARGET_62 "CAN_DET_SUPER_RES_TARGET_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_ND_TARGET_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_ND_TARGET_62 "CAN_DET_ND_TARGET_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_HOST_VEH_CLUTTER_62 "CAN_DET_HOST_VEH_CLUTTER_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_VALID_LEVEL_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_VALID_LEVEL_62 "CAN_DET_VALID_LEVEL_62"; +BA_ "GenSigStartValue" SG_ 349 CAN_DET_AZIMUTH_62 0; +BA_ "GenSigSendType" SG_ 349 CAN_DET_AZIMUTH_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_AZIMUTH_62 "CAN_DET_AZIMUTH_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_62 "CAN_DET_RANGE_62"; +BA_ "GenSigStartValue" SG_ 349 CAN_DET_RANGE_RATE_62 0; +BA_ "GenSigSendType" SG_ 349 CAN_DET_RANGE_RATE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_RANGE_RATE_62 "CAN_DET_RANGE_RATE_62"; +BA_ "GenSigSendType" SG_ 349 CAN_DET_AMPLITUDE_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_DET_AMPLITUDE_62 "CAN_DET_AMPLITUDE_62"; +BA_ "GenSigSendType" SG_ 349 CAN_SCAN_INDEX_2LSB_62 0; +BA_ "GenSigCmt" SG_ 349 CAN_SCAN_INDEX_2LSB_62 "CAN_SCAN_INDEX_2LSB_62"; +BA_ "GenMsgSendType" BO_ 348 1; +BA_ "GenMsgILSupport" BO_ 348 1; +BA_ "GenMsgNrOfRepetition" BO_ 348 0; +BA_ "GenMsgCycleTime" BO_ 348 0; +BA_ "NetworkInitialization" BO_ 348 0; +BA_ "GenMsgDelayTime" BO_ 348 0; +BA_ "GenSigVtEn" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigVtName" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_CONFID_AZIMUTH_61 "CAN_DET_CONFID_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_SUPER_RES_TARGET_61 "CAN_DET_SUPER_RES_TARGET_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_ND_TARGET_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_ND_TARGET_61 "CAN_DET_ND_TARGET_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_HOST_VEH_CLUTTER_61 "CAN_DET_HOST_VEH_CLUTTER_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_VALID_LEVEL_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_VALID_LEVEL_61 "CAN_DET_VALID_LEVEL_61"; +BA_ "GenSigStartValue" SG_ 348 CAN_DET_AZIMUTH_61 0; +BA_ "GenSigSendType" SG_ 348 CAN_DET_AZIMUTH_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_AZIMUTH_61 "CAN_DET_AZIMUTH_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_61 "CAN_DET_RANGE_61"; +BA_ "GenSigStartValue" SG_ 348 CAN_DET_RANGE_RATE_61 0; +BA_ "GenSigSendType" SG_ 348 CAN_DET_RANGE_RATE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_RANGE_RATE_61 "CAN_DET_RANGE_RATE_61"; +BA_ "GenSigSendType" SG_ 348 CAN_DET_AMPLITUDE_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_DET_AMPLITUDE_61 "CAN_DET_AMPLITUDE_61"; +BA_ "GenSigSendType" SG_ 348 CAN_SCAN_INDEX_2LSB_61 0; +BA_ "GenSigCmt" SG_ 348 CAN_SCAN_INDEX_2LSB_61 "CAN_SCAN_INDEX_2LSB_61"; +BA_ "GenMsgSendType" BO_ 347 1; +BA_ "GenMsgILSupport" BO_ 347 1; +BA_ "GenMsgNrOfRepetition" BO_ 347 0; +BA_ "GenMsgCycleTime" BO_ 347 0; +BA_ "NetworkInitialization" BO_ 347 0; +BA_ "GenMsgDelayTime" BO_ 347 0; +BA_ "GenSigVtEn" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigVtName" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_CONFID_AZIMUTH_60 "CAN_DET_CONFID_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_SUPER_RES_TARGET_60 "CAN_DET_SUPER_RES_TARGET_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_ND_TARGET_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_ND_TARGET_60 "CAN_DET_ND_TARGET_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_HOST_VEH_CLUTTER_60 "CAN_DET_HOST_VEH_CLUTTER_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_VALID_LEVEL_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_VALID_LEVEL_60 "CAN_DET_VALID_LEVEL_60"; +BA_ "GenSigStartValue" SG_ 347 CAN_DET_AZIMUTH_60 0; +BA_ "GenSigSendType" SG_ 347 CAN_DET_AZIMUTH_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_AZIMUTH_60 "CAN_DET_AZIMUTH_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_60 "CAN_DET_RANGE_60"; +BA_ "GenSigStartValue" SG_ 347 CAN_DET_RANGE_RATE_60 0; +BA_ "GenSigSendType" SG_ 347 CAN_DET_RANGE_RATE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_RANGE_RATE_60 "CAN_DET_RANGE_RATE_60"; +BA_ "GenSigSendType" SG_ 347 CAN_DET_AMPLITUDE_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_DET_AMPLITUDE_60 "CAN_DET_AMPLITUDE_60"; +BA_ "GenSigSendType" SG_ 347 CAN_SCAN_INDEX_2LSB_60 0; +BA_ "GenSigCmt" SG_ 347 CAN_SCAN_INDEX_2LSB_60 "CAN_SCAN_INDEX_2LSB_60"; +BA_ "GenMsgSendType" BO_ 346 1; +BA_ "GenMsgILSupport" BO_ 346 1; +BA_ "GenMsgNrOfRepetition" BO_ 346 0; +BA_ "GenMsgCycleTime" BO_ 346 0; +BA_ "NetworkInitialization" BO_ 346 0; +BA_ "GenMsgDelayTime" BO_ 346 0; +BA_ "GenSigVtEn" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigVtName" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_CONFID_AZIMUTH_59 "CAN_DET_CONFID_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_SUPER_RES_TARGET_59 "CAN_DET_SUPER_RES_TARGET_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_ND_TARGET_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_ND_TARGET_59 "CAN_DET_ND_TARGET_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_HOST_VEH_CLUTTER_59 "CAN_DET_HOST_VEH_CLUTTER_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_VALID_LEVEL_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_VALID_LEVEL_59 "CAN_DET_VALID_LEVEL_59"; +BA_ "GenSigStartValue" SG_ 346 CAN_DET_AZIMUTH_59 0; +BA_ "GenSigSendType" SG_ 346 CAN_DET_AZIMUTH_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_AZIMUTH_59 "CAN_DET_AZIMUTH_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_59 "CAN_DET_RANGE_59"; +BA_ "GenSigStartValue" SG_ 346 CAN_DET_RANGE_RATE_59 0; +BA_ "GenSigSendType" SG_ 346 CAN_DET_RANGE_RATE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_RANGE_RATE_59 "CAN_DET_RANGE_RATE_59"; +BA_ "GenSigSendType" SG_ 346 CAN_DET_AMPLITUDE_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_DET_AMPLITUDE_59 "CAN_DET_AMPLITUDE_59"; +BA_ "GenSigSendType" SG_ 346 CAN_SCAN_INDEX_2LSB_59 0; +BA_ "GenSigCmt" SG_ 346 CAN_SCAN_INDEX_2LSB_59 "CAN_SCAN_INDEX_2LSB_59"; +BA_ "GenMsgSendType" BO_ 345 1; +BA_ "GenMsgILSupport" BO_ 345 1; +BA_ "GenMsgNrOfRepetition" BO_ 345 0; +BA_ "GenMsgCycleTime" BO_ 345 0; +BA_ "NetworkInitialization" BO_ 345 0; +BA_ "GenMsgDelayTime" BO_ 345 0; +BA_ "GenSigVtEn" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigVtName" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_CONFID_AZIMUTH_58 "CAN_DET_CONFID_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_SUPER_RES_TARGET_58 "CAN_DET_SUPER_RES_TARGET_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_ND_TARGET_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_ND_TARGET_58 "CAN_DET_ND_TARGET_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_HOST_VEH_CLUTTER_58 "CAN_DET_HOST_VEH_CLUTTER_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_VALID_LEVEL_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_VALID_LEVEL_58 "CAN_DET_VALID_LEVEL_58"; +BA_ "GenSigStartValue" SG_ 345 CAN_DET_AZIMUTH_58 0; +BA_ "GenSigSendType" SG_ 345 CAN_DET_AZIMUTH_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_AZIMUTH_58 "CAN_DET_AZIMUTH_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_58 "CAN_DET_RANGE_58"; +BA_ "GenSigStartValue" SG_ 345 CAN_DET_RANGE_RATE_58 0; +BA_ "GenSigSendType" SG_ 345 CAN_DET_RANGE_RATE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_RANGE_RATE_58 "CAN_DET_RANGE_RATE_58"; +BA_ "GenSigSendType" SG_ 345 CAN_DET_AMPLITUDE_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_DET_AMPLITUDE_58 "CAN_DET_AMPLITUDE_58"; +BA_ "GenSigSendType" SG_ 345 CAN_SCAN_INDEX_2LSB_58 0; +BA_ "GenSigCmt" SG_ 345 CAN_SCAN_INDEX_2LSB_58 "CAN_SCAN_INDEX_2LSB_58"; +BA_ "GenMsgSendType" BO_ 344 1; +BA_ "GenMsgILSupport" BO_ 344 1; +BA_ "GenMsgNrOfRepetition" BO_ 344 0; +BA_ "GenMsgCycleTime" BO_ 344 0; +BA_ "NetworkInitialization" BO_ 344 0; +BA_ "GenMsgDelayTime" BO_ 344 0; +BA_ "GenSigVtEn" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigVtName" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_CONFID_AZIMUTH_57 "CAN_DET_CONFID_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_SUPER_RES_TARGET_57 "CAN_DET_SUPER_RES_TARGET_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_ND_TARGET_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_ND_TARGET_57 "CAN_DET_ND_TARGET_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_HOST_VEH_CLUTTER_57 "CAN_DET_HOST_VEH_CLUTTER_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_VALID_LEVEL_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_VALID_LEVEL_57 "CAN_DET_VALID_LEVEL_57"; +BA_ "GenSigStartValue" SG_ 344 CAN_DET_AZIMUTH_57 0; +BA_ "GenSigSendType" SG_ 344 CAN_DET_AZIMUTH_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_AZIMUTH_57 "CAN_DET_AZIMUTH_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_57 "CAN_DET_RANGE_57"; +BA_ "GenSigStartValue" SG_ 344 CAN_DET_RANGE_RATE_57 0; +BA_ "GenSigSendType" SG_ 344 CAN_DET_RANGE_RATE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_RANGE_RATE_57 "CAN_DET_RANGE_RATE_57"; +BA_ "GenSigSendType" SG_ 344 CAN_DET_AMPLITUDE_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_DET_AMPLITUDE_57 "CAN_DET_AMPLITUDE_57"; +BA_ "GenSigSendType" SG_ 344 CAN_SCAN_INDEX_2LSB_57 0; +BA_ "GenSigCmt" SG_ 344 CAN_SCAN_INDEX_2LSB_57 "CAN_SCAN_INDEX_2LSB_57"; +BA_ "GenMsgSendType" BO_ 343 1; +BA_ "GenMsgILSupport" BO_ 343 1; +BA_ "GenMsgNrOfRepetition" BO_ 343 0; +BA_ "GenMsgCycleTime" BO_ 343 0; +BA_ "NetworkInitialization" BO_ 343 0; +BA_ "GenMsgDelayTime" BO_ 343 0; +BA_ "GenSigVtEn" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigVtName" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_CONFID_AZIMUTH_56 "CAN_DET_CONFID_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_SUPER_RES_TARGET_56 "CAN_DET_SUPER_RES_TARGET_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_ND_TARGET_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_ND_TARGET_56 "CAN_DET_ND_TARGET_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_HOST_VEH_CLUTTER_56 "CAN_DET_HOST_VEH_CLUTTER_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_VALID_LEVEL_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_VALID_LEVEL_56 "CAN_DET_VALID_LEVEL_56"; +BA_ "GenSigStartValue" SG_ 343 CAN_DET_AZIMUTH_56 0; +BA_ "GenSigSendType" SG_ 343 CAN_DET_AZIMUTH_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_AZIMUTH_56 "CAN_DET_AZIMUTH_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_56 "CAN_DET_RANGE_56"; +BA_ "GenSigStartValue" SG_ 343 CAN_DET_RANGE_RATE_56 0; +BA_ "GenSigSendType" SG_ 343 CAN_DET_RANGE_RATE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_RANGE_RATE_56 "CAN_DET_RANGE_RATE_56"; +BA_ "GenSigSendType" SG_ 343 CAN_DET_AMPLITUDE_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_DET_AMPLITUDE_56 "CAN_DET_AMPLITUDE_56"; +BA_ "GenSigSendType" SG_ 343 CAN_SCAN_INDEX_2LSB_56 0; +BA_ "GenSigCmt" SG_ 343 CAN_SCAN_INDEX_2LSB_56 "CAN_SCAN_INDEX_2LSB_56"; +BA_ "GenMsgSendType" BO_ 342 1; +BA_ "GenMsgILSupport" BO_ 342 1; +BA_ "GenMsgNrOfRepetition" BO_ 342 0; +BA_ "GenMsgCycleTime" BO_ 342 0; +BA_ "NetworkInitialization" BO_ 342 0; +BA_ "GenMsgDelayTime" BO_ 342 0; +BA_ "GenSigVtEn" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigVtName" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_CONFID_AZIMUTH_55 "CAN_DET_CONFID_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_SUPER_RES_TARGET_55 "CAN_DET_SUPER_RES_TARGET_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_ND_TARGET_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_ND_TARGET_55 "CAN_DET_ND_TARGET_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_HOST_VEH_CLUTTER_55 "CAN_DET_HOST_VEH_CLUTTER_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_VALID_LEVEL_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_VALID_LEVEL_55 "CAN_DET_VALID_LEVEL_55"; +BA_ "GenSigStartValue" SG_ 342 CAN_DET_AZIMUTH_55 0; +BA_ "GenSigSendType" SG_ 342 CAN_DET_AZIMUTH_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_AZIMUTH_55 "CAN_DET_AZIMUTH_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_55 "CAN_DET_RANGE_55"; +BA_ "GenSigStartValue" SG_ 342 CAN_DET_RANGE_RATE_55 0; +BA_ "GenSigSendType" SG_ 342 CAN_DET_RANGE_RATE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_RANGE_RATE_55 "CAN_DET_RANGE_RATE_55"; +BA_ "GenSigSendType" SG_ 342 CAN_DET_AMPLITUDE_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_DET_AMPLITUDE_55 "CAN_DET_AMPLITUDE_55"; +BA_ "GenSigSendType" SG_ 342 CAN_SCAN_INDEX_2LSB_55 0; +BA_ "GenSigCmt" SG_ 342 CAN_SCAN_INDEX_2LSB_55 "CAN_SCAN_INDEX_2LSB_55"; +BA_ "GenMsgSendType" BO_ 335 1; +BA_ "GenMsgILSupport" BO_ 335 1; +BA_ "GenMsgNrOfRepetition" BO_ 335 0; +BA_ "GenMsgCycleTime" BO_ 335 0; +BA_ "NetworkInitialization" BO_ 335 0; +BA_ "GenMsgDelayTime" BO_ 335 0; +BA_ "GenSigVtEn" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigVtName" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_CONFID_AZIMUTH_48 "CAN_DET_CONFID_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_SUPER_RES_TARGET_48 "CAN_DET_SUPER_RES_TARGET_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_ND_TARGET_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_ND_TARGET_48 "CAN_DET_ND_TARGET_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_HOST_VEH_CLUTTER_48 "CAN_DET_HOST_VEH_CLUTTER_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_VALID_LEVEL_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_VALID_LEVEL_48 "CAN_DET_VALID_LEVEL_48"; +BA_ "GenSigStartValue" SG_ 335 CAN_DET_AZIMUTH_48 0; +BA_ "GenSigSendType" SG_ 335 CAN_DET_AZIMUTH_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_AZIMUTH_48 "CAN_DET_AZIMUTH_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_48 "CAN_DET_RANGE_48"; +BA_ "GenSigStartValue" SG_ 335 CAN_DET_RANGE_RATE_48 0; +BA_ "GenSigSendType" SG_ 335 CAN_DET_RANGE_RATE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_RANGE_RATE_48 "CAN_DET_RANGE_RATE_48"; +BA_ "GenSigSendType" SG_ 335 CAN_DET_AMPLITUDE_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_DET_AMPLITUDE_48 "CAN_DET_AMPLITUDE_48"; +BA_ "GenSigSendType" SG_ 335 CAN_SCAN_INDEX_2LSB_48 0; +BA_ "GenSigCmt" SG_ 335 CAN_SCAN_INDEX_2LSB_48 "CAN_SCAN_INDEX_2LSB_48"; +BA_ "GenMsgSendType" BO_ 334 1; +BA_ "GenMsgILSupport" BO_ 334 1; +BA_ "GenMsgNrOfRepetition" BO_ 334 0; +BA_ "GenMsgCycleTime" BO_ 334 0; +BA_ "NetworkInitialization" BO_ 334 0; +BA_ "GenMsgDelayTime" BO_ 334 0; +BA_ "GenSigVtEn" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigVtName" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_CONFID_AZIMUTH_47 "CAN_DET_CONFID_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_SUPER_RES_TARGET_47 "CAN_DET_SUPER_RES_TARGET_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_ND_TARGET_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_ND_TARGET_47 "CAN_DET_ND_TARGET_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_HOST_VEH_CLUTTER_47 "CAN_DET_HOST_VEH_CLUTTER_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_VALID_LEVEL_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_VALID_LEVEL_47 "CAN_DET_VALID_LEVEL_47"; +BA_ "GenSigStartValue" SG_ 334 CAN_DET_AZIMUTH_47 0; +BA_ "GenSigSendType" SG_ 334 CAN_DET_AZIMUTH_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_AZIMUTH_47 "CAN_DET_AZIMUTH_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_47 "CAN_DET_RANGE_47"; +BA_ "GenSigStartValue" SG_ 334 CAN_DET_RANGE_RATE_47 0; +BA_ "GenSigSendType" SG_ 334 CAN_DET_RANGE_RATE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_RANGE_RATE_47 "CAN_DET_RANGE_RATE_47"; +BA_ "GenSigSendType" SG_ 334 CAN_DET_AMPLITUDE_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_DET_AMPLITUDE_47 "CAN_DET_AMPLITUDE_47"; +BA_ "GenSigSendType" SG_ 334 CAN_SCAN_INDEX_2LSB_47 0; +BA_ "GenSigCmt" SG_ 334 CAN_SCAN_INDEX_2LSB_47 "CAN_SCAN_INDEX_2LSB_47"; +BA_ "GenMsgSendType" BO_ 333 1; +BA_ "GenMsgILSupport" BO_ 333 1; +BA_ "GenMsgNrOfRepetition" BO_ 333 0; +BA_ "GenMsgCycleTime" BO_ 333 0; +BA_ "NetworkInitialization" BO_ 333 0; +BA_ "GenMsgDelayTime" BO_ 333 0; +BA_ "GenSigVtEn" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigVtName" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_CONFID_AZIMUTH_46 "CAN_DET_CONFID_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_SUPER_RES_TARGET_46 "CAN_DET_SUPER_RES_TARGET_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_ND_TARGET_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_ND_TARGET_46 "CAN_DET_ND_TARGET_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_HOST_VEH_CLUTTER_46 "CAN_DET_HOST_VEH_CLUTTER_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_VALID_LEVEL_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_VALID_LEVEL_46 "CAN_DET_VALID_LEVEL_46"; +BA_ "GenSigStartValue" SG_ 333 CAN_DET_AZIMUTH_46 0; +BA_ "GenSigSendType" SG_ 333 CAN_DET_AZIMUTH_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_AZIMUTH_46 "CAN_DET_AZIMUTH_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_46 "CAN_DET_RANGE_46"; +BA_ "GenSigStartValue" SG_ 333 CAN_DET_RANGE_RATE_46 0; +BA_ "GenSigSendType" SG_ 333 CAN_DET_RANGE_RATE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_RANGE_RATE_46 "CAN_DET_RANGE_RATE_46"; +BA_ "GenSigSendType" SG_ 333 CAN_DET_AMPLITUDE_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_DET_AMPLITUDE_46 "CAN_DET_AMPLITUDE_46"; +BA_ "GenSigSendType" SG_ 333 CAN_SCAN_INDEX_2LSB_46 0; +BA_ "GenSigCmt" SG_ 333 CAN_SCAN_INDEX_2LSB_46 "CAN_SCAN_INDEX_2LSB_46"; +BA_ "GenMsgSendType" BO_ 332 1; +BA_ "GenMsgILSupport" BO_ 332 1; +BA_ "GenMsgNrOfRepetition" BO_ 332 0; +BA_ "GenMsgCycleTime" BO_ 332 0; +BA_ "NetworkInitialization" BO_ 332 0; +BA_ "GenMsgDelayTime" BO_ 332 0; +BA_ "GenSigVtEn" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigVtName" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_CONFID_AZIMUTH_45 "CAN_DET_CONFID_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_SUPER_RES_TARGET_45 "CAN_DET_SUPER_RES_TARGET_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_ND_TARGET_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_ND_TARGET_45 "CAN_DET_ND_TARGET_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_HOST_VEH_CLUTTER_45 "CAN_DET_HOST_VEH_CLUTTER_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_VALID_LEVEL_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_VALID_LEVEL_45 "CAN_DET_VALID_LEVEL_45"; +BA_ "GenSigStartValue" SG_ 332 CAN_DET_AZIMUTH_45 0; +BA_ "GenSigSendType" SG_ 332 CAN_DET_AZIMUTH_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_AZIMUTH_45 "CAN_DET_AZIMUTH_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_45 "CAN_DET_RANGE_45"; +BA_ "GenSigStartValue" SG_ 332 CAN_DET_RANGE_RATE_45 0; +BA_ "GenSigSendType" SG_ 332 CAN_DET_RANGE_RATE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_RANGE_RATE_45 "CAN_DET_RANGE_RATE_45"; +BA_ "GenSigSendType" SG_ 332 CAN_DET_AMPLITUDE_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_DET_AMPLITUDE_45 "CAN_DET_AMPLITUDE_45"; +BA_ "GenSigSendType" SG_ 332 CAN_SCAN_INDEX_2LSB_45 0; +BA_ "GenSigCmt" SG_ 332 CAN_SCAN_INDEX_2LSB_45 "CAN_SCAN_INDEX_2LSB_45"; +BA_ "GenMsgSendType" BO_ 331 1; +BA_ "GenMsgILSupport" BO_ 331 1; +BA_ "GenMsgNrOfRepetition" BO_ 331 0; +BA_ "GenMsgCycleTime" BO_ 331 0; +BA_ "NetworkInitialization" BO_ 331 0; +BA_ "GenMsgDelayTime" BO_ 331 0; +BA_ "GenSigVtEn" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigVtName" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_CONFID_AZIMUTH_44 "CAN_DET_CONFID_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_SUPER_RES_TARGET_44 "CAN_DET_SUPER_RES_TARGET_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_ND_TARGET_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_ND_TARGET_44 "CAN_DET_ND_TARGET_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_HOST_VEH_CLUTTER_44 "CAN_DET_HOST_VEH_CLUTTER_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_VALID_LEVEL_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_VALID_LEVEL_44 "CAN_DET_VALID_LEVEL_44"; +BA_ "GenSigStartValue" SG_ 331 CAN_DET_AZIMUTH_44 0; +BA_ "GenSigSendType" SG_ 331 CAN_DET_AZIMUTH_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_AZIMUTH_44 "CAN_DET_AZIMUTH_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_44 "CAN_DET_RANGE_44"; +BA_ "GenSigStartValue" SG_ 331 CAN_DET_RANGE_RATE_44 0; +BA_ "GenSigSendType" SG_ 331 CAN_DET_RANGE_RATE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_RANGE_RATE_44 "CAN_DET_RANGE_RATE_44"; +BA_ "GenSigSendType" SG_ 331 CAN_DET_AMPLITUDE_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_DET_AMPLITUDE_44 "CAN_DET_AMPLITUDE_44"; +BA_ "GenSigSendType" SG_ 331 CAN_SCAN_INDEX_2LSB_44 0; +BA_ "GenSigCmt" SG_ 331 CAN_SCAN_INDEX_2LSB_44 "CAN_SCAN_INDEX_2LSB_44"; +BA_ "GenMsgSendType" BO_ 330 1; +BA_ "GenMsgILSupport" BO_ 330 1; +BA_ "GenMsgNrOfRepetition" BO_ 330 0; +BA_ "GenMsgCycleTime" BO_ 330 0; +BA_ "NetworkInitialization" BO_ 330 0; +BA_ "GenMsgDelayTime" BO_ 330 0; +BA_ "GenSigVtEn" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigVtName" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_CONFID_AZIMUTH_43 "CAN_DET_CONFID_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_SUPER_RES_TARGET_43 "CAN_DET_SUPER_RES_TARGET_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_ND_TARGET_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_ND_TARGET_43 "CAN_DET_ND_TARGET_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_HOST_VEH_CLUTTER_43 "CAN_DET_HOST_VEH_CLUTTER_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_VALID_LEVEL_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_VALID_LEVEL_43 "CAN_DET_VALID_LEVEL_43"; +BA_ "GenSigStartValue" SG_ 330 CAN_DET_AZIMUTH_43 0; +BA_ "GenSigSendType" SG_ 330 CAN_DET_AZIMUTH_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_AZIMUTH_43 "CAN_DET_AZIMUTH_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_43 "CAN_DET_RANGE_43"; +BA_ "GenSigStartValue" SG_ 330 CAN_DET_RANGE_RATE_43 0; +BA_ "GenSigSendType" SG_ 330 CAN_DET_RANGE_RATE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_RANGE_RATE_43 "CAN_DET_RANGE_RATE_43"; +BA_ "GenSigSendType" SG_ 330 CAN_DET_AMPLITUDE_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_DET_AMPLITUDE_43 "CAN_DET_AMPLITUDE_43"; +BA_ "GenSigSendType" SG_ 330 CAN_SCAN_INDEX_2LSB_43 0; +BA_ "GenSigCmt" SG_ 330 CAN_SCAN_INDEX_2LSB_43 "CAN_SCAN_INDEX_2LSB_43"; +BA_ "GenMsgSendType" BO_ 329 1; +BA_ "GenMsgILSupport" BO_ 329 1; +BA_ "GenMsgNrOfRepetition" BO_ 329 0; +BA_ "GenMsgCycleTime" BO_ 329 0; +BA_ "NetworkInitialization" BO_ 329 0; +BA_ "GenMsgDelayTime" BO_ 329 0; +BA_ "GenSigVtEn" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigVtName" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_CONFID_AZIMUTH_42 "CAN_DET_CONFID_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_SUPER_RES_TARGET_42 "CAN_DET_SUPER_RES_TARGET_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_ND_TARGET_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_ND_TARGET_42 "CAN_DET_ND_TARGET_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_HOST_VEH_CLUTTER_42 "CAN_DET_HOST_VEH_CLUTTER_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_VALID_LEVEL_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_VALID_LEVEL_42 "CAN_DET_VALID_LEVEL_42"; +BA_ "GenSigStartValue" SG_ 329 CAN_DET_AZIMUTH_42 0; +BA_ "GenSigSendType" SG_ 329 CAN_DET_AZIMUTH_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_AZIMUTH_42 "CAN_DET_AZIMUTH_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_42 "CAN_DET_RANGE_42"; +BA_ "GenSigStartValue" SG_ 329 CAN_DET_RANGE_RATE_42 0; +BA_ "GenSigSendType" SG_ 329 CAN_DET_RANGE_RATE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_RANGE_RATE_42 "CAN_DET_RANGE_RATE_42"; +BA_ "GenSigSendType" SG_ 329 CAN_DET_AMPLITUDE_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_DET_AMPLITUDE_42 "CAN_DET_AMPLITUDE_42"; +BA_ "GenSigSendType" SG_ 329 CAN_SCAN_INDEX_2LSB_42 0; +BA_ "GenSigCmt" SG_ 329 CAN_SCAN_INDEX_2LSB_42 "CAN_SCAN_INDEX_2LSB_42"; +BA_ "GenMsgSendType" BO_ 328 1; +BA_ "GenMsgILSupport" BO_ 328 1; +BA_ "GenMsgNrOfRepetition" BO_ 328 0; +BA_ "GenMsgCycleTime" BO_ 328 0; +BA_ "NetworkInitialization" BO_ 328 0; +BA_ "GenMsgDelayTime" BO_ 328 0; +BA_ "GenSigVtEn" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigVtName" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_CONFID_AZIMUTH_41 "CAN_DET_CONFID_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_SUPER_RES_TARGET_41 "CAN_DET_SUPER_RES_TARGET_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_ND_TARGET_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_ND_TARGET_41 "CAN_DET_ND_TARGET_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_HOST_VEH_CLUTTER_41 "CAN_DET_HOST_VEH_CLUTTER_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_VALID_LEVEL_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_VALID_LEVEL_41 "CAN_DET_VALID_LEVEL_41"; +BA_ "GenSigStartValue" SG_ 328 CAN_DET_AZIMUTH_41 0; +BA_ "GenSigSendType" SG_ 328 CAN_DET_AZIMUTH_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_AZIMUTH_41 "CAN_DET_AZIMUTH_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_41 "CAN_DET_RANGE_41"; +BA_ "GenSigStartValue" SG_ 328 CAN_DET_RANGE_RATE_41 0; +BA_ "GenSigSendType" SG_ 328 CAN_DET_RANGE_RATE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_RANGE_RATE_41 "CAN_DET_RANGE_RATE_41"; +BA_ "GenSigSendType" SG_ 328 CAN_DET_AMPLITUDE_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_DET_AMPLITUDE_41 "CAN_DET_AMPLITUDE_41"; +BA_ "GenSigSendType" SG_ 328 CAN_SCAN_INDEX_2LSB_41 0; +BA_ "GenSigCmt" SG_ 328 CAN_SCAN_INDEX_2LSB_41 "CAN_SCAN_INDEX_2LSB_41"; +BA_ "GenMsgSendType" BO_ 327 1; +BA_ "GenMsgILSupport" BO_ 327 1; +BA_ "GenMsgNrOfRepetition" BO_ 327 0; +BA_ "GenMsgCycleTime" BO_ 327 0; +BA_ "NetworkInitialization" BO_ 327 0; +BA_ "GenMsgDelayTime" BO_ 327 0; +BA_ "GenSigVtEn" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigVtName" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_CONFID_AZIMUTH_40 "CAN_DET_CONFID_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_SUPER_RES_TARGET_40 "CAN_DET_SUPER_RES_TARGET_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_ND_TARGET_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_ND_TARGET_40 "CAN_DET_ND_TARGET_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_HOST_VEH_CLUTTER_40 "CAN_DET_HOST_VEH_CLUTTER_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_VALID_LEVEL_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_VALID_LEVEL_40 "CAN_DET_VALID_LEVEL_40"; +BA_ "GenSigStartValue" SG_ 327 CAN_DET_AZIMUTH_40 0; +BA_ "GenSigSendType" SG_ 327 CAN_DET_AZIMUTH_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_AZIMUTH_40 "CAN_DET_AZIMUTH_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_40 "CAN_DET_RANGE_40"; +BA_ "GenSigStartValue" SG_ 327 CAN_DET_RANGE_RATE_40 0; +BA_ "GenSigSendType" SG_ 327 CAN_DET_RANGE_RATE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_RANGE_RATE_40 "CAN_DET_RANGE_RATE_40"; +BA_ "GenSigSendType" SG_ 327 CAN_DET_AMPLITUDE_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_DET_AMPLITUDE_40 "CAN_DET_AMPLITUDE_40"; +BA_ "GenSigSendType" SG_ 327 CAN_SCAN_INDEX_2LSB_40 0; +BA_ "GenSigCmt" SG_ 327 CAN_SCAN_INDEX_2LSB_40 "CAN_SCAN_INDEX_2LSB_40"; +BA_ "GenMsgSendType" BO_ 325 1; +BA_ "GenMsgILSupport" BO_ 325 1; +BA_ "GenMsgNrOfRepetition" BO_ 325 0; +BA_ "GenMsgCycleTime" BO_ 325 0; +BA_ "NetworkInitialization" BO_ 325 0; +BA_ "GenMsgDelayTime" BO_ 325 0; +BA_ "GenSigVtEn" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigVtName" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_CONFID_AZIMUTH_38 "CAN_DET_CONFID_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_SUPER_RES_TARGET_38 "CAN_DET_SUPER_RES_TARGET_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_ND_TARGET_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_ND_TARGET_38 "CAN_DET_ND_TARGET_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_HOST_VEH_CLUTTER_38 "CAN_DET_HOST_VEH_CLUTTER_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_VALID_LEVEL_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_VALID_LEVEL_38 "CAN_DET_VALID_LEVEL_38"; +BA_ "GenSigStartValue" SG_ 325 CAN_DET_AZIMUTH_38 0; +BA_ "GenSigSendType" SG_ 325 CAN_DET_AZIMUTH_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_AZIMUTH_38 "CAN_DET_AZIMUTH_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_38 "CAN_DET_RANGE_38"; +BA_ "GenSigStartValue" SG_ 325 CAN_DET_RANGE_RATE_38 0; +BA_ "GenSigSendType" SG_ 325 CAN_DET_RANGE_RATE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_RANGE_RATE_38 "CAN_DET_RANGE_RATE_38"; +BA_ "GenSigSendType" SG_ 325 CAN_DET_AMPLITUDE_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_DET_AMPLITUDE_38 "CAN_DET_AMPLITUDE_38"; +BA_ "GenSigSendType" SG_ 325 CAN_SCAN_INDEX_2LSB_38 0; +BA_ "GenSigCmt" SG_ 325 CAN_SCAN_INDEX_2LSB_38 "CAN_SCAN_INDEX_2LSB_38"; +BA_ "GenMsgSendType" BO_ 324 1; +BA_ "GenMsgILSupport" BO_ 324 1; +BA_ "GenMsgNrOfRepetition" BO_ 324 0; +BA_ "GenMsgCycleTime" BO_ 324 0; +BA_ "NetworkInitialization" BO_ 324 0; +BA_ "GenMsgDelayTime" BO_ 324 0; +BA_ "GenSigVtEn" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigVtName" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_CONFID_AZIMUTH_37 "CAN_DET_CONFID_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_SUPER_RES_TARGET_37 "CAN_DET_SUPER_RES_TARGET_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_ND_TARGET_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_ND_TARGET_37 "CAN_DET_ND_TARGET_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_HOST_VEH_CLUTTER_37 "CAN_DET_HOST_VEH_CLUTTER_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_VALID_LEVEL_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_VALID_LEVEL_37 "CAN_DET_VALID_LEVEL_37"; +BA_ "GenSigStartValue" SG_ 324 CAN_DET_AZIMUTH_37 0; +BA_ "GenSigSendType" SG_ 324 CAN_DET_AZIMUTH_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_AZIMUTH_37 "CAN_DET_AZIMUTH_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_37 "CAN_DET_RANGE_37"; +BA_ "GenSigStartValue" SG_ 324 CAN_DET_RANGE_RATE_37 0; +BA_ "GenSigSendType" SG_ 324 CAN_DET_RANGE_RATE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_RANGE_RATE_37 "CAN_DET_RANGE_RATE_37"; +BA_ "GenSigSendType" SG_ 324 CAN_DET_AMPLITUDE_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_DET_AMPLITUDE_37 "CAN_DET_AMPLITUDE_37"; +BA_ "GenSigSendType" SG_ 324 CAN_SCAN_INDEX_2LSB_37 0; +BA_ "GenSigCmt" SG_ 324 CAN_SCAN_INDEX_2LSB_37 "CAN_SCAN_INDEX_2LSB_37"; +BA_ "GenMsgSendType" BO_ 323 1; +BA_ "GenMsgILSupport" BO_ 323 1; +BA_ "GenMsgNrOfRepetition" BO_ 323 0; +BA_ "GenMsgCycleTime" BO_ 323 0; +BA_ "NetworkInitialization" BO_ 323 0; +BA_ "GenMsgDelayTime" BO_ 323 0; +BA_ "GenSigVtEn" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigVtName" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_CONFID_AZIMUTH_36 "CAN_DET_CONFID_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_SUPER_RES_TARGET_36 "CAN_DET_SUPER_RES_TARGET_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_ND_TARGET_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_ND_TARGET_36 "CAN_DET_ND_TARGET_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_HOST_VEH_CLUTTER_36 "CAN_DET_HOST_VEH_CLUTTER_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_VALID_LEVEL_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_VALID_LEVEL_36 "CAN_DET_VALID_LEVEL_36"; +BA_ "GenSigStartValue" SG_ 323 CAN_DET_AZIMUTH_36 0; +BA_ "GenSigSendType" SG_ 323 CAN_DET_AZIMUTH_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_AZIMUTH_36 "CAN_DET_AZIMUTH_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_36 "CAN_DET_RANGE_36"; +BA_ "GenSigStartValue" SG_ 323 CAN_DET_RANGE_RATE_36 0; +BA_ "GenSigSendType" SG_ 323 CAN_DET_RANGE_RATE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_RANGE_RATE_36 "CAN_DET_RANGE_RATE_36"; +BA_ "GenSigSendType" SG_ 323 CAN_DET_AMPLITUDE_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_DET_AMPLITUDE_36 "CAN_DET_AMPLITUDE_36"; +BA_ "GenSigSendType" SG_ 323 CAN_SCAN_INDEX_2LSB_36 0; +BA_ "GenSigCmt" SG_ 323 CAN_SCAN_INDEX_2LSB_36 "CAN_SCAN_INDEX_2LSB_36"; +BA_ "GenMsgSendType" BO_ 322 1; +BA_ "GenMsgILSupport" BO_ 322 1; +BA_ "GenMsgNrOfRepetition" BO_ 322 0; +BA_ "GenMsgCycleTime" BO_ 322 0; +BA_ "NetworkInitialization" BO_ 322 0; +BA_ "GenMsgDelayTime" BO_ 322 0; +BA_ "GenSigVtEn" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigVtName" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_CONFID_AZIMUTH_35 "CAN_DET_CONFID_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_SUPER_RES_TARGET_35 "CAN_DET_SUPER_RES_TARGET_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_ND_TARGET_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_ND_TARGET_35 "CAN_DET_ND_TARGET_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_HOST_VEH_CLUTTER_35 "CAN_DET_HOST_VEH_CLUTTER_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_VALID_LEVEL_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_VALID_LEVEL_35 "CAN_DET_VALID_LEVEL_35"; +BA_ "GenSigStartValue" SG_ 322 CAN_DET_AZIMUTH_35 0; +BA_ "GenSigSendType" SG_ 322 CAN_DET_AZIMUTH_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_AZIMUTH_35 "CAN_DET_AZIMUTH_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_35 "CAN_DET_RANGE_35"; +BA_ "GenSigStartValue" SG_ 322 CAN_DET_RANGE_RATE_35 0; +BA_ "GenSigSendType" SG_ 322 CAN_DET_RANGE_RATE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_RANGE_RATE_35 "CAN_DET_RANGE_RATE_35"; +BA_ "GenSigSendType" SG_ 322 CAN_DET_AMPLITUDE_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_DET_AMPLITUDE_35 "CAN_DET_AMPLITUDE_35"; +BA_ "GenSigSendType" SG_ 322 CAN_SCAN_INDEX_2LSB_35 0; +BA_ "GenSigCmt" SG_ 322 CAN_SCAN_INDEX_2LSB_35 "CAN_SCAN_INDEX_2LSB_35"; +BA_ "GenMsgSendType" BO_ 321 1; +BA_ "GenMsgILSupport" BO_ 321 1; +BA_ "GenMsgNrOfRepetition" BO_ 321 0; +BA_ "GenMsgCycleTime" BO_ 321 0; +BA_ "NetworkInitialization" BO_ 321 0; +BA_ "GenMsgDelayTime" BO_ 321 0; +BA_ "GenSigVtEn" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigVtName" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_CONFID_AZIMUTH_34 "CAN_DET_CONFID_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_SUPER_RES_TARGET_34 "CAN_DET_SUPER_RES_TARGET_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_ND_TARGET_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_ND_TARGET_34 "CAN_DET_ND_TARGET_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_HOST_VEH_CLUTTER_34 "CAN_DET_HOST_VEH_CLUTTER_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_VALID_LEVEL_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_VALID_LEVEL_34 "CAN_DET_VALID_LEVEL_34"; +BA_ "GenSigStartValue" SG_ 321 CAN_DET_AZIMUTH_34 0; +BA_ "GenSigSendType" SG_ 321 CAN_DET_AZIMUTH_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_AZIMUTH_34 "CAN_DET_AZIMUTH_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_34 "CAN_DET_RANGE_34"; +BA_ "GenSigStartValue" SG_ 321 CAN_DET_RANGE_RATE_34 0; +BA_ "GenSigSendType" SG_ 321 CAN_DET_RANGE_RATE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_RANGE_RATE_34 "CAN_DET_RANGE_RATE_34"; +BA_ "GenSigSendType" SG_ 321 CAN_DET_AMPLITUDE_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_DET_AMPLITUDE_34 "CAN_DET_AMPLITUDE_34"; +BA_ "GenSigSendType" SG_ 321 CAN_SCAN_INDEX_2LSB_34 0; +BA_ "GenSigCmt" SG_ 321 CAN_SCAN_INDEX_2LSB_34 "CAN_SCAN_INDEX_2LSB_34"; +BA_ "GenMsgSendType" BO_ 320 1; +BA_ "GenMsgILSupport" BO_ 320 1; +BA_ "GenMsgNrOfRepetition" BO_ 320 0; +BA_ "GenMsgCycleTime" BO_ 320 0; +BA_ "NetworkInitialization" BO_ 320 0; +BA_ "GenMsgDelayTime" BO_ 320 0; +BA_ "GenSigVtEn" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigVtName" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_CONFID_AZIMUTH_33 "CAN_DET_CONFID_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_SUPER_RES_TARGET_33 "CAN_DET_SUPER_RES_TARGET_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_ND_TARGET_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_ND_TARGET_33 "CAN_DET_ND_TARGET_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_HOST_VEH_CLUTTER_33 "CAN_DET_HOST_VEH_CLUTTER_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_VALID_LEVEL_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_VALID_LEVEL_33 "CAN_DET_VALID_LEVEL_33"; +BA_ "GenSigStartValue" SG_ 320 CAN_DET_AZIMUTH_33 0; +BA_ "GenSigSendType" SG_ 320 CAN_DET_AZIMUTH_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_AZIMUTH_33 "CAN_DET_AZIMUTH_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_33 "CAN_DET_RANGE_33"; +BA_ "GenSigStartValue" SG_ 320 CAN_DET_RANGE_RATE_33 0; +BA_ "GenSigSendType" SG_ 320 CAN_DET_RANGE_RATE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_RANGE_RATE_33 "CAN_DET_RANGE_RATE_33"; +BA_ "GenSigSendType" SG_ 320 CAN_DET_AMPLITUDE_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_DET_AMPLITUDE_33 "CAN_DET_AMPLITUDE_33"; +BA_ "GenSigSendType" SG_ 320 CAN_SCAN_INDEX_2LSB_33 0; +BA_ "GenSigCmt" SG_ 320 CAN_SCAN_INDEX_2LSB_33 "CAN_SCAN_INDEX_2LSB_33"; +BA_ "GenMsgSendType" BO_ 319 1; +BA_ "GenMsgILSupport" BO_ 319 1; +BA_ "GenMsgNrOfRepetition" BO_ 319 0; +BA_ "GenMsgCycleTime" BO_ 319 0; +BA_ "NetworkInitialization" BO_ 319 0; +BA_ "GenMsgDelayTime" BO_ 319 0; +BA_ "GenSigVtEn" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigVtName" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_CONFID_AZIMUTH_32 "CAN_DET_CONFID_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_SUPER_RES_TARGET_32 "CAN_DET_SUPER_RES_TARGET_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_ND_TARGET_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_ND_TARGET_32 "CAN_DET_ND_TARGET_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_HOST_VEH_CLUTTER_32 "CAN_DET_HOST_VEH_CLUTTER_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_VALID_LEVEL_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_VALID_LEVEL_32 "CAN_DET_VALID_LEVEL_32"; +BA_ "GenSigStartValue" SG_ 319 CAN_DET_AZIMUTH_32 0; +BA_ "GenSigSendType" SG_ 319 CAN_DET_AZIMUTH_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_AZIMUTH_32 "CAN_DET_AZIMUTH_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_32 "CAN_DET_RANGE_32"; +BA_ "GenSigStartValue" SG_ 319 CAN_DET_RANGE_RATE_32 0; +BA_ "GenSigSendType" SG_ 319 CAN_DET_RANGE_RATE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_RANGE_RATE_32 "CAN_DET_RANGE_RATE_32"; +BA_ "GenSigSendType" SG_ 319 CAN_DET_AMPLITUDE_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_DET_AMPLITUDE_32 "CAN_DET_AMPLITUDE_32"; +BA_ "GenSigSendType" SG_ 319 CAN_SCAN_INDEX_2LSB_32 0; +BA_ "GenSigCmt" SG_ 319 CAN_SCAN_INDEX_2LSB_32 "CAN_SCAN_INDEX_2LSB_32"; +BA_ "GenMsgSendType" BO_ 318 1; +BA_ "GenMsgILSupport" BO_ 318 1; +BA_ "GenMsgNrOfRepetition" BO_ 318 0; +BA_ "GenMsgCycleTime" BO_ 318 0; +BA_ "NetworkInitialization" BO_ 318 0; +BA_ "GenMsgDelayTime" BO_ 318 0; +BA_ "GenSigVtEn" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigVtName" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_CONFID_AZIMUTH_31 "CAN_DET_CONFID_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_SUPER_RES_TARGET_31 "CAN_DET_SUPER_RES_TARGET_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_ND_TARGET_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_ND_TARGET_31 "CAN_DET_ND_TARGET_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_HOST_VEH_CLUTTER_31 "CAN_DET_HOST_VEH_CLUTTER_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_VALID_LEVEL_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_VALID_LEVEL_31 "CAN_DET_VALID_LEVEL_31"; +BA_ "GenSigStartValue" SG_ 318 CAN_DET_AZIMUTH_31 0; +BA_ "GenSigSendType" SG_ 318 CAN_DET_AZIMUTH_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_AZIMUTH_31 "CAN_DET_AZIMUTH_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_31 "CAN_DET_RANGE_31"; +BA_ "GenSigStartValue" SG_ 318 CAN_DET_RANGE_RATE_31 0; +BA_ "GenSigSendType" SG_ 318 CAN_DET_RANGE_RATE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_RANGE_RATE_31 "CAN_DET_RANGE_RATE_31"; +BA_ "GenSigSendType" SG_ 318 CAN_DET_AMPLITUDE_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_DET_AMPLITUDE_31 "CAN_DET_AMPLITUDE_31"; +BA_ "GenSigSendType" SG_ 318 CAN_SCAN_INDEX_2LSB_31 0; +BA_ "GenSigCmt" SG_ 318 CAN_SCAN_INDEX_2LSB_31 "CAN_SCAN_INDEX_2LSB_31"; +BA_ "GenMsgSendType" BO_ 317 1; +BA_ "GenMsgILSupport" BO_ 317 1; +BA_ "GenMsgNrOfRepetition" BO_ 317 0; +BA_ "GenMsgCycleTime" BO_ 317 0; +BA_ "NetworkInitialization" BO_ 317 0; +BA_ "GenMsgDelayTime" BO_ 317 0; +BA_ "GenSigVtEn" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigVtName" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_CONFID_AZIMUTH_30 "CAN_DET_CONFID_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_SUPER_RES_TARGET_30 "CAN_DET_SUPER_RES_TARGET_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_ND_TARGET_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_ND_TARGET_30 "CAN_DET_ND_TARGET_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_HOST_VEH_CLUTTER_30 "CAN_DET_HOST_VEH_CLUTTER_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_VALID_LEVEL_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_VALID_LEVEL_30 "CAN_DET_VALID_LEVEL_30"; +BA_ "GenSigStartValue" SG_ 317 CAN_DET_AZIMUTH_30 0; +BA_ "GenSigSendType" SG_ 317 CAN_DET_AZIMUTH_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_AZIMUTH_30 "CAN_DET_AZIMUTH_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_30 "CAN_DET_RANGE_30"; +BA_ "GenSigStartValue" SG_ 317 CAN_DET_RANGE_RATE_30 0; +BA_ "GenSigSendType" SG_ 317 CAN_DET_RANGE_RATE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_RANGE_RATE_30 "CAN_DET_RANGE_RATE_30"; +BA_ "GenSigSendType" SG_ 317 CAN_DET_AMPLITUDE_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_DET_AMPLITUDE_30 "CAN_DET_AMPLITUDE_30"; +BA_ "GenSigSendType" SG_ 317 CAN_SCAN_INDEX_2LSB_30 0; +BA_ "GenSigCmt" SG_ 317 CAN_SCAN_INDEX_2LSB_30 "CAN_SCAN_INDEX_2LSB_30"; +BA_ "GenMsgSendType" BO_ 316 1; +BA_ "GenMsgILSupport" BO_ 316 1; +BA_ "GenMsgNrOfRepetition" BO_ 316 0; +BA_ "GenMsgCycleTime" BO_ 316 0; +BA_ "NetworkInitialization" BO_ 316 0; +BA_ "GenMsgDelayTime" BO_ 316 0; +BA_ "GenSigVtEn" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigVtName" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_CONFID_AZIMUTH_29 "CAN_DET_CONFID_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_SUPER_RES_TARGET_29 "CAN_DET_SUPER_RES_TARGET_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_ND_TARGET_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_ND_TARGET_29 "CAN_DET_ND_TARGET_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_HOST_VEH_CLUTTER_29 "CAN_DET_HOST_VEH_CLUTTER_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_VALID_LEVEL_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_VALID_LEVEL_29 "CAN_DET_VALID_LEVEL_29"; +BA_ "GenSigStartValue" SG_ 316 CAN_DET_AZIMUTH_29 0; +BA_ "GenSigSendType" SG_ 316 CAN_DET_AZIMUTH_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_AZIMUTH_29 "CAN_DET_AZIMUTH_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_29 "CAN_DET_RANGE_29"; +BA_ "GenSigStartValue" SG_ 316 CAN_DET_RANGE_RATE_29 0; +BA_ "GenSigSendType" SG_ 316 CAN_DET_RANGE_RATE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_RANGE_RATE_29 "CAN_DET_RANGE_RATE_29"; +BA_ "GenSigSendType" SG_ 316 CAN_DET_AMPLITUDE_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_DET_AMPLITUDE_29 "CAN_DET_AMPLITUDE_29"; +BA_ "GenSigSendType" SG_ 316 CAN_SCAN_INDEX_2LSB_29 0; +BA_ "GenSigCmt" SG_ 316 CAN_SCAN_INDEX_2LSB_29 "CAN_SCAN_INDEX_2LSB_29"; +BA_ "GenMsgSendType" BO_ 314 1; +BA_ "GenMsgILSupport" BO_ 314 1; +BA_ "GenMsgNrOfRepetition" BO_ 314 0; +BA_ "GenMsgCycleTime" BO_ 314 0; +BA_ "NetworkInitialization" BO_ 314 0; +BA_ "GenMsgDelayTime" BO_ 314 0; +BA_ "GenSigVtEn" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigVtName" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_CONFID_AZIMUTH_27 "CAN_DET_CONFID_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_SUPER_RES_TARGET_27 "CAN_DET_SUPER_RES_TARGET_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_ND_TARGET_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_ND_TARGET_27 "CAN_DET_ND_TARGET_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_HOST_VEH_CLUTTER_27 "CAN_DET_HOST_VEH_CLUTTER_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_VALID_LEVEL_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_VALID_LEVEL_27 "CAN_DET_VALID_LEVEL_27"; +BA_ "GenSigStartValue" SG_ 314 CAN_DET_AZIMUTH_27 0; +BA_ "GenSigSendType" SG_ 314 CAN_DET_AZIMUTH_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_AZIMUTH_27 "CAN_DET_AZIMUTH_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_27 "CAN_DET_RANGE_27"; +BA_ "GenSigStartValue" SG_ 314 CAN_DET_RANGE_RATE_27 0; +BA_ "GenSigSendType" SG_ 314 CAN_DET_RANGE_RATE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_RANGE_RATE_27 "CAN_DET_RANGE_RATE_27"; +BA_ "GenSigSendType" SG_ 314 CAN_DET_AMPLITUDE_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_DET_AMPLITUDE_27 "CAN_DET_AMPLITUDE_27"; +BA_ "GenSigSendType" SG_ 314 CAN_SCAN_INDEX_2LSB_27 0; +BA_ "GenSigCmt" SG_ 314 CAN_SCAN_INDEX_2LSB_27 "CAN_SCAN_INDEX_2LSB_27"; +BA_ "GenMsgSendType" BO_ 313 1; +BA_ "GenMsgILSupport" BO_ 313 1; +BA_ "GenMsgNrOfRepetition" BO_ 313 0; +BA_ "GenMsgCycleTime" BO_ 313 0; +BA_ "NetworkInitialization" BO_ 313 0; +BA_ "GenMsgDelayTime" BO_ 313 0; +BA_ "GenSigVtEn" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigVtName" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_CONFID_AZIMUTH_26 "CAN_DET_CONFID_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_SUPER_RES_TARGET_26 "CAN_DET_SUPER_RES_TARGET_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_ND_TARGET_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_ND_TARGET_26 "CAN_DET_ND_TARGET_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_HOST_VEH_CLUTTER_26 "CAN_DET_HOST_VEH_CLUTTER_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_VALID_LEVEL_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_VALID_LEVEL_26 "CAN_DET_VALID_LEVEL_26"; +BA_ "GenSigStartValue" SG_ 313 CAN_DET_AZIMUTH_26 0; +BA_ "GenSigSendType" SG_ 313 CAN_DET_AZIMUTH_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_AZIMUTH_26 "CAN_DET_AZIMUTH_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_26 "CAN_DET_RANGE_26"; +BA_ "GenSigStartValue" SG_ 313 CAN_DET_RANGE_RATE_26 0; +BA_ "GenSigSendType" SG_ 313 CAN_DET_RANGE_RATE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_RANGE_RATE_26 "CAN_DET_RANGE_RATE_26"; +BA_ "GenSigSendType" SG_ 313 CAN_DET_AMPLITUDE_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_DET_AMPLITUDE_26 "CAN_DET_AMPLITUDE_26"; +BA_ "GenSigSendType" SG_ 313 CAN_SCAN_INDEX_2LSB_26 0; +BA_ "GenSigCmt" SG_ 313 CAN_SCAN_INDEX_2LSB_26 "CAN_SCAN_INDEX_2LSB_26"; +BA_ "GenMsgSendType" BO_ 312 1; +BA_ "GenMsgILSupport" BO_ 312 1; +BA_ "GenMsgNrOfRepetition" BO_ 312 0; +BA_ "GenMsgCycleTime" BO_ 312 0; +BA_ "NetworkInitialization" BO_ 312 0; +BA_ "GenMsgDelayTime" BO_ 312 0; +BA_ "GenSigVtEn" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigVtName" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_CONFID_AZIMUTH_25 "CAN_DET_CONFID_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_SUPER_RES_TARGET_25 "CAN_DET_SUPER_RES_TARGET_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_ND_TARGET_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_ND_TARGET_25 "CAN_DET_ND_TARGET_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_HOST_VEH_CLUTTER_25 "CAN_DET_HOST_VEH_CLUTTER_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_VALID_LEVEL_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_VALID_LEVEL_25 "CAN_DET_VALID_LEVEL_25"; +BA_ "GenSigStartValue" SG_ 312 CAN_DET_AZIMUTH_25 0; +BA_ "GenSigSendType" SG_ 312 CAN_DET_AZIMUTH_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_AZIMUTH_25 "CAN_DET_AZIMUTH_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_25 "CAN_DET_RANGE_25"; +BA_ "GenSigStartValue" SG_ 312 CAN_DET_RANGE_RATE_25 0; +BA_ "GenSigSendType" SG_ 312 CAN_DET_RANGE_RATE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_RANGE_RATE_25 "CAN_DET_RANGE_RATE_25"; +BA_ "GenSigSendType" SG_ 312 CAN_DET_AMPLITUDE_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_DET_AMPLITUDE_25 "CAN_DET_AMPLITUDE_25"; +BA_ "GenSigSendType" SG_ 312 CAN_SCAN_INDEX_2LSB_25 0; +BA_ "GenSigCmt" SG_ 312 CAN_SCAN_INDEX_2LSB_25 "CAN_SCAN_INDEX_2LSB_25"; +BA_ "GenMsgSendType" BO_ 311 1; +BA_ "GenMsgILSupport" BO_ 311 1; +BA_ "GenMsgNrOfRepetition" BO_ 311 0; +BA_ "GenMsgCycleTime" BO_ 311 0; +BA_ "NetworkInitialization" BO_ 311 0; +BA_ "GenMsgDelayTime" BO_ 311 0; +BA_ "GenSigVtEn" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigVtName" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_CONFID_AZIMUTH_24 "CAN_DET_CONFID_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_SUPER_RES_TARGET_24 "CAN_DET_SUPER_RES_TARGET_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_ND_TARGET_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_ND_TARGET_24 "CAN_DET_ND_TARGET_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_HOST_VEH_CLUTTER_24 "CAN_DET_HOST_VEH_CLUTTER_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_VALID_LEVEL_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_VALID_LEVEL_24 "CAN_DET_VALID_LEVEL_24"; +BA_ "GenSigStartValue" SG_ 311 CAN_DET_AZIMUTH_24 0; +BA_ "GenSigSendType" SG_ 311 CAN_DET_AZIMUTH_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_AZIMUTH_24 "CAN_DET_AZIMUTH_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_24 "CAN_DET_RANGE_24"; +BA_ "GenSigStartValue" SG_ 311 CAN_DET_RANGE_RATE_24 0; +BA_ "GenSigSendType" SG_ 311 CAN_DET_RANGE_RATE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_RANGE_RATE_24 "CAN_DET_RANGE_RATE_24"; +BA_ "GenSigSendType" SG_ 311 CAN_DET_AMPLITUDE_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_DET_AMPLITUDE_24 "CAN_DET_AMPLITUDE_24"; +BA_ "GenSigSendType" SG_ 311 CAN_SCAN_INDEX_2LSB_24 0; +BA_ "GenSigCmt" SG_ 311 CAN_SCAN_INDEX_2LSB_24 "CAN_SCAN_INDEX_2LSB_24"; +BA_ "GenMsgSendType" BO_ 310 1; +BA_ "GenMsgILSupport" BO_ 310 1; +BA_ "GenMsgNrOfRepetition" BO_ 310 0; +BA_ "GenMsgCycleTime" BO_ 310 0; +BA_ "NetworkInitialization" BO_ 310 0; +BA_ "GenMsgDelayTime" BO_ 310 0; +BA_ "GenSigVtEn" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigVtName" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_CONFID_AZIMUTH_23 "CAN_DET_CONFID_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_SUPER_RES_TARGET_23 "CAN_DET_SUPER_RES_TARGET_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_ND_TARGET_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_ND_TARGET_23 "CAN_DET_ND_TARGET_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_HOST_VEH_CLUTTER_23 "CAN_DET_HOST_VEH_CLUTTER_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_VALID_LEVEL_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_VALID_LEVEL_23 "CAN_DET_VALID_LEVEL_23"; +BA_ "GenSigStartValue" SG_ 310 CAN_DET_AZIMUTH_23 0; +BA_ "GenSigSendType" SG_ 310 CAN_DET_AZIMUTH_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_AZIMUTH_23 "CAN_DET_AZIMUTH_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_23 "CAN_DET_RANGE_23"; +BA_ "GenSigStartValue" SG_ 310 CAN_DET_RANGE_RATE_23 0; +BA_ "GenSigSendType" SG_ 310 CAN_DET_RANGE_RATE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_RANGE_RATE_23 "CAN_DET_RANGE_RATE_23"; +BA_ "GenSigSendType" SG_ 310 CAN_DET_AMPLITUDE_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_DET_AMPLITUDE_23 "CAN_DET_AMPLITUDE_23"; +BA_ "GenSigSendType" SG_ 310 CAN_SCAN_INDEX_2LSB_23 0; +BA_ "GenSigCmt" SG_ 310 CAN_SCAN_INDEX_2LSB_23 "CAN_SCAN_INDEX_2LSB_23"; +EOF + +build_ba "22" +build_ba "21" +build_ba "20" +build_ba "19" +build_ba "18" + +cat <> ${OUT_FILENAME} +BA_ "GenMsgSendType" BO_ 341 1; +BA_ "GenMsgILSupport" BO_ 341 1; +BA_ "GenMsgNrOfRepetition" BO_ 341 0; +BA_ "GenMsgCycleTime" BO_ 341 0; +BA_ "NetworkInitialization" BO_ 341 0; +BA_ "GenMsgDelayTime" BO_ 341 0; +BA_ "GenSigVtEn" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigVtName" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_CONFID_AZIMUTH_54 "CAN_DET_CONFID_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_SUPER_RES_TARGET_54 "CAN_DET_SUPER_RES_TARGET_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_ND_TARGET_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_ND_TARGET_54 "CAN_DET_ND_TARGET_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_HOST_VEH_CLUTTER_54 "CAN_DET_HOST_VEH_CLUTTER_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_VALID_LEVEL_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_VALID_LEVEL_54 "CAN_DET_VALID_LEVEL_54"; +BA_ "GenSigStartValue" SG_ 341 CAN_DET_AZIMUTH_54 0; +BA_ "GenSigSendType" SG_ 341 CAN_DET_AZIMUTH_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_AZIMUTH_54 "CAN_DET_AZIMUTH_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_54 "CAN_DET_RANGE_54"; +BA_ "GenSigStartValue" SG_ 341 CAN_DET_RANGE_RATE_54 0; +BA_ "GenSigSendType" SG_ 341 CAN_DET_RANGE_RATE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_RANGE_RATE_54 "CAN_DET_RANGE_RATE_54"; +BA_ "GenSigSendType" SG_ 341 CAN_DET_AMPLITUDE_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_DET_AMPLITUDE_54 "CAN_DET_AMPLITUDE_54"; +BA_ "GenSigSendType" SG_ 341 CAN_SCAN_INDEX_2LSB_54 0; +BA_ "GenSigCmt" SG_ 341 CAN_SCAN_INDEX_2LSB_54 "CAN_SCAN_INDEX_2LSB_54"; +BA_ "GenMsgSendType" BO_ 340 1; +BA_ "GenMsgILSupport" BO_ 340 1; +BA_ "GenMsgNrOfRepetition" BO_ 340 0; +BA_ "GenMsgCycleTime" BO_ 340 0; +BA_ "NetworkInitialization" BO_ 340 0; +BA_ "GenMsgDelayTime" BO_ 340 0; +BA_ "GenSigVtEn" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigVtName" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_CONFID_AZIMUTH_53 "CAN_DET_CONFID_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_SUPER_RES_TARGET_53 "CAN_DET_SUPER_RES_TARGET_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_ND_TARGET_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_ND_TARGET_53 "CAN_DET_ND_TARGET_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_HOST_VEH_CLUTTER_53 "CAN_DET_HOST_VEH_CLUTTER_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_VALID_LEVEL_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_VALID_LEVEL_53 "CAN_DET_VALID_LEVEL_53"; +BA_ "GenSigStartValue" SG_ 340 CAN_DET_AZIMUTH_53 0; +BA_ "GenSigSendType" SG_ 340 CAN_DET_AZIMUTH_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_AZIMUTH_53 "CAN_DET_AZIMUTH_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_53 "CAN_DET_RANGE_53"; +BA_ "GenSigStartValue" SG_ 340 CAN_DET_RANGE_RATE_53 0; +BA_ "GenSigSendType" SG_ 340 CAN_DET_RANGE_RATE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_RANGE_RATE_53 "CAN_DET_RANGE_RATE_53"; +BA_ "GenSigSendType" SG_ 340 CAN_DET_AMPLITUDE_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_DET_AMPLITUDE_53 "CAN_DET_AMPLITUDE_53"; +BA_ "GenSigSendType" SG_ 340 CAN_SCAN_INDEX_2LSB_53 0; +BA_ "GenSigCmt" SG_ 340 CAN_SCAN_INDEX_2LSB_53 "CAN_SCAN_INDEX_2LSB_53"; +BA_ "GenMsgSendType" BO_ 339 1; +BA_ "GenMsgILSupport" BO_ 339 1; +BA_ "GenMsgNrOfRepetition" BO_ 339 0; +BA_ "GenMsgCycleTime" BO_ 339 0; +BA_ "NetworkInitialization" BO_ 339 0; +BA_ "GenMsgDelayTime" BO_ 339 0; +BA_ "GenSigVtEn" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigVtName" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_CONFID_AZIMUTH_52 "CAN_DET_CONFID_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_SUPER_RES_TARGET_52 "CAN_DET_SUPER_RES_TARGET_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_ND_TARGET_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_ND_TARGET_52 "CAN_DET_ND_TARGET_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_HOST_VEH_CLUTTER_52 "CAN_DET_HOST_VEH_CLUTTER_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_VALID_LEVEL_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_VALID_LEVEL_52 "CAN_DET_VALID_LEVEL_52"; +BA_ "GenSigStartValue" SG_ 339 CAN_DET_AZIMUTH_52 0; +BA_ "GenSigSendType" SG_ 339 CAN_DET_AZIMUTH_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_AZIMUTH_52 "CAN_DET_AZIMUTH_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_52 "CAN_DET_RANGE_52"; +BA_ "GenSigStartValue" SG_ 339 CAN_DET_RANGE_RATE_52 0; +BA_ "GenSigSendType" SG_ 339 CAN_DET_RANGE_RATE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_RANGE_RATE_52 "CAN_DET_RANGE_RATE_52"; +BA_ "GenSigSendType" SG_ 339 CAN_DET_AMPLITUDE_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_DET_AMPLITUDE_52 "CAN_DET_AMPLITUDE_52"; +BA_ "GenSigSendType" SG_ 339 CAN_SCAN_INDEX_2LSB_52 0; +BA_ "GenSigCmt" SG_ 339 CAN_SCAN_INDEX_2LSB_52 "CAN_SCAN_INDEX_2LSB_52"; +BA_ "GenMsgSendType" BO_ 338 1; +BA_ "GenMsgILSupport" BO_ 338 1; +BA_ "GenMsgNrOfRepetition" BO_ 338 0; +BA_ "GenMsgCycleTime" BO_ 338 0; +BA_ "NetworkInitialization" BO_ 338 0; +BA_ "GenMsgDelayTime" BO_ 338 0; +BA_ "GenSigVtEn" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigVtName" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_CONFID_AZIMUTH_51 "CAN_DET_CONFID_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_SUPER_RES_TARGET_51 "CAN_DET_SUPER_RES_TARGET_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_ND_TARGET_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_ND_TARGET_51 "CAN_DET_ND_TARGET_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_HOST_VEH_CLUTTER_51 "CAN_DET_HOST_VEH_CLUTTER_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_VALID_LEVEL_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_VALID_LEVEL_51 "CAN_DET_VALID_LEVEL_51"; +BA_ "GenSigStartValue" SG_ 338 CAN_DET_AZIMUTH_51 0; +BA_ "GenSigSendType" SG_ 338 CAN_DET_AZIMUTH_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_AZIMUTH_51 "CAN_DET_AZIMUTH_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_51 "CAN_DET_RANGE_51"; +BA_ "GenSigStartValue" SG_ 338 CAN_DET_RANGE_RATE_51 0; +BA_ "GenSigSendType" SG_ 338 CAN_DET_RANGE_RATE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_RANGE_RATE_51 "CAN_DET_RANGE_RATE_51"; +BA_ "GenSigSendType" SG_ 338 CAN_DET_AMPLITUDE_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_DET_AMPLITUDE_51 "CAN_DET_AMPLITUDE_51"; +BA_ "GenSigSendType" SG_ 338 CAN_SCAN_INDEX_2LSB_51 0; +BA_ "GenSigCmt" SG_ 338 CAN_SCAN_INDEX_2LSB_51 "CAN_SCAN_INDEX_2LSB_51"; +BA_ "GenMsgSendType" BO_ 337 1; +BA_ "GenMsgILSupport" BO_ 337 1; +BA_ "GenMsgNrOfRepetition" BO_ 337 0; +BA_ "GenMsgCycleTime" BO_ 337 0; +BA_ "NetworkInitialization" BO_ 337 0; +BA_ "GenMsgDelayTime" BO_ 337 0; +BA_ "GenSigVtEn" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigVtName" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_CONFID_AZIMUTH_50 "CAN_DET_CONFID_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_SUPER_RES_TARGET_50 "CAN_DET_SUPER_RES_TARGET_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_ND_TARGET_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_ND_TARGET_50 "CAN_DET_ND_TARGET_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_HOST_VEH_CLUTTER_50 "CAN_DET_HOST_VEH_CLUTTER_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_VALID_LEVEL_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_VALID_LEVEL_50 "CAN_DET_VALID_LEVEL_50"; +BA_ "GenSigStartValue" SG_ 337 CAN_DET_AZIMUTH_50 0; +BA_ "GenSigSendType" SG_ 337 CAN_DET_AZIMUTH_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_AZIMUTH_50 "CAN_DET_AZIMUTH_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_50 "CAN_DET_RANGE_50"; +BA_ "GenSigStartValue" SG_ 337 CAN_DET_RANGE_RATE_50 0; +BA_ "GenSigSendType" SG_ 337 CAN_DET_RANGE_RATE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_RANGE_RATE_50 "CAN_DET_RANGE_RATE_50"; +BA_ "GenSigSendType" SG_ 337 CAN_DET_AMPLITUDE_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_DET_AMPLITUDE_50 "CAN_DET_AMPLITUDE_50"; +BA_ "GenSigSendType" SG_ 337 CAN_SCAN_INDEX_2LSB_50 0; +BA_ "GenSigCmt" SG_ 337 CAN_SCAN_INDEX_2LSB_50 "CAN_SCAN_INDEX_2LSB_50"; +BA_ "GenMsgSendType" BO_ 336 1; +BA_ "GenMsgILSupport" BO_ 336 1; +BA_ "GenMsgNrOfRepetition" BO_ 336 0; +BA_ "GenMsgCycleTime" BO_ 336 0; +BA_ "NetworkInitialization" BO_ 336 0; +BA_ "GenMsgDelayTime" BO_ 336 0; +BA_ "GenSigVtEn" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigVtName" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_CONFID_AZIMUTH_49 "CAN_DET_CONFID_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_SUPER_RES_TARGET_49 "CAN_DET_SUPER_RES_TARGET_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_ND_TARGET_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_ND_TARGET_49 "CAN_DET_ND_TARGET_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_HOST_VEH_CLUTTER_49 "CAN_DET_HOST_VEH_CLUTTER_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_VALID_LEVEL_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_VALID_LEVEL_49 "CAN_DET_VALID_LEVEL_49"; +BA_ "GenSigStartValue" SG_ 336 CAN_DET_AZIMUTH_49 0; +BA_ "GenSigSendType" SG_ 336 CAN_DET_AZIMUTH_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_AZIMUTH_49 "CAN_DET_AZIMUTH_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_49 "CAN_DET_RANGE_49"; +BA_ "GenSigStartValue" SG_ 336 CAN_DET_RANGE_RATE_49 0; +BA_ "GenSigSendType" SG_ 336 CAN_DET_RANGE_RATE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_RANGE_RATE_49 "CAN_DET_RANGE_RATE_49"; +BA_ "GenSigSendType" SG_ 336 CAN_DET_AMPLITUDE_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_DET_AMPLITUDE_49 "CAN_DET_AMPLITUDE_49"; +BA_ "GenSigSendType" SG_ 336 CAN_SCAN_INDEX_2LSB_49 0; +BA_ "GenSigCmt" SG_ 336 CAN_SCAN_INDEX_2LSB_49 "CAN_SCAN_INDEX_2LSB_49"; +BA_ "GenMsgSendType" BO_ 326 1; +BA_ "GenMsgILSupport" BO_ 326 1; +BA_ "GenMsgNrOfRepetition" BO_ 326 0; +BA_ "GenMsgCycleTime" BO_ 326 0; +BA_ "NetworkInitialization" BO_ 326 0; +BA_ "GenMsgDelayTime" BO_ 326 0; +BA_ "GenSigVtEn" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigVtName" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_CONFID_AZIMUTH_39 "CAN_DET_CONFID_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_SUPER_RES_TARGET_39 "CAN_DET_SUPER_RES_TARGET_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_ND_TARGET_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_ND_TARGET_39 "CAN_DET_ND_TARGET_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_HOST_VEH_CLUTTER_39 "CAN_DET_HOST_VEH_CLUTTER_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_VALID_LEVEL_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_VALID_LEVEL_39 "CAN_DET_VALID_LEVEL_39"; +BA_ "GenSigStartValue" SG_ 326 CAN_DET_AZIMUTH_39 0; +BA_ "GenSigSendType" SG_ 326 CAN_DET_AZIMUTH_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_AZIMUTH_39 "CAN_DET_AZIMUTH_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_39 "CAN_DET_RANGE_39"; +BA_ "GenSigStartValue" SG_ 326 CAN_DET_RANGE_RATE_39 0; +BA_ "GenSigSendType" SG_ 326 CAN_DET_RANGE_RATE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_RANGE_RATE_39 "CAN_DET_RANGE_RATE_39"; +BA_ "GenSigSendType" SG_ 326 CAN_DET_AMPLITUDE_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_DET_AMPLITUDE_39 "CAN_DET_AMPLITUDE_39"; +BA_ "GenSigSendType" SG_ 326 CAN_SCAN_INDEX_2LSB_39 0; +BA_ "GenSigCmt" SG_ 326 CAN_SCAN_INDEX_2LSB_39 "CAN_SCAN_INDEX_2LSB_39"; +BA_ "GenMsgSendType" BO_ 315 1; +BA_ "GenMsgILSupport" BO_ 315 1; +BA_ "GenMsgNrOfRepetition" BO_ 315 0; +BA_ "GenMsgCycleTime" BO_ 315 0; +BA_ "NetworkInitialization" BO_ 315 0; +BA_ "GenMsgDelayTime" BO_ 315 0; +BA_ "GenSigVtEn" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigVtName" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_CONFID_AZIMUTH_28 "CAN_DET_CONFID_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_SUPER_RES_TARGET_28 "CAN_DET_SUPER_RES_TARGET_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_ND_TARGET_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_ND_TARGET_28 "CAN_DET_ND_TARGET_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_HOST_VEH_CLUTTER_28 "CAN_DET_HOST_VEH_CLUTTER_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_VALID_LEVEL_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_VALID_LEVEL_28 "CAN_DET_VALID_LEVEL_28"; +BA_ "GenSigStartValue" SG_ 315 CAN_DET_AZIMUTH_28 0; +BA_ "GenSigSendType" SG_ 315 CAN_DET_AZIMUTH_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_AZIMUTH_28 "CAN_DET_AZIMUTH_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_28 "CAN_DET_RANGE_28"; +BA_ "GenSigStartValue" SG_ 315 CAN_DET_RANGE_RATE_28 0; +BA_ "GenSigSendType" SG_ 315 CAN_DET_RANGE_RATE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_RANGE_RATE_28 "CAN_DET_RANGE_RATE_28"; +BA_ "GenSigSendType" SG_ 315 CAN_DET_AMPLITUDE_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_DET_AMPLITUDE_28 "CAN_DET_AMPLITUDE_28"; +BA_ "GenSigSendType" SG_ 315 CAN_SCAN_INDEX_2LSB_28 0; +BA_ "GenSigCmt" SG_ 315 CAN_SCAN_INDEX_2LSB_28 "CAN_SCAN_INDEX_2LSB_28"; +EOF + +build_ba "17" +build_ba "16" +build_ba "15" +build_ba "14" +build_ba "13" +build_ba "12" +build_ba "11" +build_ba "10" +build_ba "09" +build_ba "08" +build_ba "07" +build_ba "06" +build_ba "05" +build_ba "03" +build_ba "02" + +cat <> ${OUT_FILENAME} +BA_ "GenMsgSendType" BO_ 256 1; +BA_ "GenMsgILSupport" BO_ 256 1; +BA_ "GenMsgNrOfRepetition" BO_ 256 0; +BA_ "NetworkInitialization" BO_ 256 0; +BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MINOR_MRR "CAN_PCAN_MINOR_MRR"; +BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MINOR_MRR 0; +BA_ "GenSigCmt" SG_ 256 CAN_PCAN_MAJOR_MRR "CAN_PCAN_MAJOR_MRR"; +BA_ "GenSigSendType" SG_ 256 CAN_PCAN_MAJOR_MRR 0; +BA_ "GenMsgCycleTime" BO_ 257 30; +BA_ "GenMsgSendType" BO_ 257 0; +BA_ "GenMsgILSupport" BO_ 257 1; +BA_ "GenMsgNrOfRepetition" BO_ 257 0; +BA_ "NetworkInitialization" BO_ 257 0; +BA_ "GenSigCmt" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtEn" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtName" SG_ 257 CAN_INTERFERENCE_TYPE "CAN_INTERFERENCE_TYPE"; +BA_ "GenSigVtName" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigCmt" SG_ 257 CAN_RECOMMEND_UNCONVERGE "CAN_RECOMMEND_UNCONVERGE"; +BA_ "GenSigStartValue" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL 0; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE_FILTER_VAL "CAN_BLOCKAGE_SIDELOBE_FILTER_VAL"; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_INCOMPLETE "CAN_RADAR_ALIGN_INCOMPLETE"; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_SIDELOBE "CAN_BLOCKAGE_SIDELOBE"; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_SIDELOBE 0; +BA_ "GenSigCmt" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigVtEn" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigVtName" SG_ 257 CAN_BLOCKAGE_MNR "CAN_BLOCKAGE_MNR"; +BA_ "GenSigSendType" SG_ 257 CAN_BLOCKAGE_MNR 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_EXT_COND_NOK "CAN_RADAR_EXT_COND_NOK"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_EXT_COND_NOK 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE "CAN_RADAR_ALIGN_OUT_RANGE"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_OUT_RANGE 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_ALIGN_NOT_START "CAN_RADAR_ALIGN_NOT_START"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_ALIGN_NOT_START 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_OVERHEAT_ERROR "CAN_RADAR_OVERHEAT_ERROR"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_OVERHEAT_ERROR 0; +BA_ "GenSigCmt" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigVtEn" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigVtName" SG_ 257 CAN_RADAR_NOT_OP "CAN_RADAR_NOT_OP"; +BA_ "GenSigSendType" SG_ 257 CAN_RADAR_NOT_OP 0; +BA_ "GenSigCmt" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigVtEn" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigVtName" SG_ 257 CAN_XCVR_OPERATIONAL "CAN_XCVR_OPERATIONAL"; +BA_ "GenSigSendType" SG_ 257 CAN_XCVR_OPERATIONAL 0; +EOF + +build_ba "01" + +cat <> ${OUT_FILENAME} +BA_DEF_DEF_ "CrossOver_InfoCAN" "No"; +BA_DEF_DEF_ "CrossOver_LIN" "No"; +BA_DEF_DEF_ "UsedOnPgmDBC" "Yes"; +BA_DEF_DEF_ "ContentDependant" "No"; +BA_DEF_DEF_ "GenSigTimeoutTime_RCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_GWM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_OCS" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_ABS_ESC" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_CCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_IPMA" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_TSTR" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_SCCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_PSCM" 0; +BA_DEF_DEF_ "GenSigTimeoutTime__delete" 0; +BA_DEF_DEF_ "GenSigTimeoutTime_Generic_BCM" 0; +BA_DEF_DEF_ "NmMessage" "No"; +BA_DEF_DEF_ "DiagResponse" "No"; +BA_DEF_DEF_ "DiagRequest" "No"; +BA_DEF_DEF_ "TpTxIndex" 0; +BA_DEF_DEF_ "DiagState" "No"; +BA_DEF_DEF_ "TpApplType" ""; +BA_DEF_DEF_ "NmAsrMessage" "No"; +BA_DEF_DEF_ "Mulitplexer" "No"; +BA_DEF_DEF_ "ConfiguredTransmitter" "No"; +BA_DEF_DEF_ "EventRateOfChange" 10000; +BA_DEF_DEF_ "GenMsgHandlingTypeDoc" ""; +BA_DEF_DEF_ "GenMsgHandlingTypeCode" ""; +BA_DEF_DEF_ "GenMsgMarked" ""; +BA_DEF_DEF_ "GenSigMarked" ""; +BA_DEF_DEF_ "GenSigVtIndex" ""; +BA_DEF_DEF_ "GenSigVtName" ""; +BA_DEF_DEF_ "GenSigVtEn" ""; +BA_DEF_DEF_ "GenSigSNA" ""; +BA_DEF_DEF_ "GenSigCmt" ""; +BA_DEF_DEF_ "GenMsgCmt" ""; +BA_DEF_DEF_ "GenSigSendType" "NoSigSendType"; +BA_DEF_DEF_ "GenSigInactiveValue" 0; +BA_DEF_DEF_ "GenSigMissingSourceValue" 0; +BA_DEF_DEF_ "WakeupSignal" "No"; +BA_DEF_DEF_ "GenSigStartValue" 0; +BA_DEF_DEF_ "GenMsgILSupport" "Yes"; +BA_DEF_DEF_ "NetworkInitializationCommand" "No"; +BA_DEF_DEF_ "GenMsgSendType" "NoMsgSendType"; +BA_DEF_DEF_ "GenMsgCycleTime" 0; +BA_DEF_DEF_ "GenMsgCycleTimeFast" 0; +BA_DEF_DEF_ "GenMsgDelayTime" 0; +BA_DEF_DEF_ "GenMsgNrOfRepetition" 0; +BA_DEF_DEF_ "GenMsgStartDelayTime" 0; +BA_DEF_DEF_ "NetworkInitialization" "No"; +BA_DEF_DEF_ "MessageGateway" "No"; +BA_DEF_DEF_ "ILUsed" "Yes"; +BA_DEF_DEF_ "NetworkInitializationUsed" "No"; +BA_DEF_DEF_ "PowerType" "Switched"; +BA_DEF_DEF_ "NodeStartUpTime" 250; +BA_DEF_DEF_ "NodeWakeUpTime" 10; +BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff"; +BA_DEF_DEF_ "GenMsgForegroundColor" "#000000"; +VAL_ 34 IPMA_PCAN_DataRangeCheck 1 "Fault Present" 0 "No Fault"; +VAL_ 34 IPMA_PCAN_MissingMsg 1 "Fault Present" 0 "No Fault "; +VAL_ 34 VINSignalCompareFailure 1 "Fault Present" 0 "No Fault"; +VAL_ 34 ModuleNotConfiguredError 1 "Fault Present" 0 "No Fault"; +VAL_ 34 CarCfgNotConfiguredError 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte7_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ARMtoDSPChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 DSPtoArmChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 HostToArmChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ARMtoHostChksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 LoopBWOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 DSPOverrunFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte6_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TuningSensitivityFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 SaturatedTuningFreqFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 LocalOscPowerFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterPowerFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte6_bit0 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 XCVRDeviceSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 FreqSynthesizerSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 AnalogConverterDevicSPIFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 SidelobeBlockage 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte5_bit1 1 "Fault Present" 0 "No Fault"; +VAL_ 33 MNRBlocked 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ECUTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 AlignmentRoutineFailedFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 UnreasonableRadarData 1 "Fault Present" 0 "No Fault"; +VAL_ 33 MicroprocessorTempHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 VerticalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 HorizontalAlignmentOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 FactoryAlignmentMode 1 "Fault Present" 0 "No Fault"; +VAL_ 33 BatteryLowFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 BatteryHighFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_1p25SupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte3_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ThermistorOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_3p3DACSupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_3p3RAWSupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 v_5_SupplyOutOfRange 1 "Fault Present" 0 "No Fault"; +VAL_ 33 TransmitterIDFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit3 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte2_bit2 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PCANMissingMsgFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PCANBusOff 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit7 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 InstructionSetCheckFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 StackOverflowFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 WatchdogFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 PLLLockFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte1_bit1 1 "Fault Present" 0 "No Fault"; +VAL_ 33 RAMMemoryTestFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 USCValidationFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit6 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit5 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit4 1 "Fault Present" 0 "No Fault"; +VAL_ 33 Active_Flt_Latched_byte0_bit3 1 "Fault Present" 0 "No Fault"; +VAL_ 33 KeepAliveChecksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ProgramCalibrationFlashChecksum 1 "Fault Present" 0 "No Fault"; +VAL_ 33 ApplicationFlashChecksumFault 1 "Fault Present" 0 "No Fault"; +VAL_ 371 CAN_AUTO_ALIGN_HANGLE_QF 3 "Accurate" 2 "Inaccurate" 1 "Temporarily undefined" 0 "Undefined"; +VAL_ 371 CAN_ALIGNMENT_STATUS 15 "Undefined_2" 14 "Undefined_1" 13 "Low Amplitude (Flat-plate only)" 12 "No Peak (Flat-plate only)" 11 "Fail Ver and Hor OutOfRange" 10 "Fail Vertical Align OutOfRange" 9 "Fail Horizontal Align OutOfRange" 8 "Fail Time Out" 7 "Fail Only Right Target Found" 6 "Fail Only Left Target Found" 5 "Fail Variance Too Large" 4 "Fail Deviation Too Large" 3 "Fail No Target" 2 "Success" 1 "Busy" 0 "Off"; +VAL_ 371 CAN_ALIGNMENT_STATE 6 "Static alignment flat-plate" 5 "Static alignment 2-target" 4 "Static alignment 1-target" 3 "Service alignment" 2 "Short track alignment" 1 "Auto alignment" 0 "Off"; +EOF + +build_val "04" + +cat <> ${OUT_FILENAME} +VAL_ 351 CAN_DET_CONFID_AZIMUTH_64 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 350 CAN_DET_CONFID_AZIMUTH_63 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 349 CAN_DET_CONFID_AZIMUTH_62 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 348 CAN_DET_CONFID_AZIMUTH_61 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 347 CAN_DET_CONFID_AZIMUTH_60 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 346 CAN_DET_CONFID_AZIMUTH_59 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 345 CAN_DET_CONFID_AZIMUTH_58 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 344 CAN_DET_CONFID_AZIMUTH_57 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 343 CAN_DET_CONFID_AZIMUTH_56 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 342 CAN_DET_CONFID_AZIMUTH_55 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 335 CAN_DET_CONFID_AZIMUTH_48 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 334 CAN_DET_CONFID_AZIMUTH_47 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 333 CAN_DET_CONFID_AZIMUTH_46 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 332 CAN_DET_CONFID_AZIMUTH_45 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 331 CAN_DET_CONFID_AZIMUTH_44 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 330 CAN_DET_CONFID_AZIMUTH_43 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 329 CAN_DET_CONFID_AZIMUTH_42 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 328 CAN_DET_CONFID_AZIMUTH_41 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 327 CAN_DET_CONFID_AZIMUTH_40 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 325 CAN_DET_CONFID_AZIMUTH_38 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 324 CAN_DET_CONFID_AZIMUTH_37 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 323 CAN_DET_CONFID_AZIMUTH_36 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 322 CAN_DET_CONFID_AZIMUTH_35 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 321 CAN_DET_CONFID_AZIMUTH_34 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 320 CAN_DET_CONFID_AZIMUTH_33 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 319 CAN_DET_CONFID_AZIMUTH_32 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 318 CAN_DET_CONFID_AZIMUTH_31 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 317 CAN_DET_CONFID_AZIMUTH_30 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 316 CAN_DET_CONFID_AZIMUTH_29 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 314 CAN_DET_CONFID_AZIMUTH_27 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 313 CAN_DET_CONFID_AZIMUTH_26 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 312 CAN_DET_CONFID_AZIMUTH_25 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 311 CAN_DET_CONFID_AZIMUTH_24 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 310 CAN_DET_CONFID_AZIMUTH_23 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +EOF + +build_val "22" +build_val "21" +build_val "20" +build_val "19" +build_val "18" + +cat <> ${OUT_FILENAME} +VAL_ 341 CAN_DET_CONFID_AZIMUTH_54 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 340 CAN_DET_CONFID_AZIMUTH_53 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 339 CAN_DET_CONFID_AZIMUTH_52 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 338 CAN_DET_CONFID_AZIMUTH_51 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 337 CAN_DET_CONFID_AZIMUTH_50 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 336 CAN_DET_CONFID_AZIMUTH_49 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 326 CAN_DET_CONFID_AZIMUTH_39 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +VAL_ 315 CAN_DET_CONFID_AZIMUTH_28 3 "Low" 2 "Medium_Low" 1 "Medium_High" 0 "High"; +EOF + +build_val "17" +build_val "16" +build_val "15" +build_val "14" +build_val "13" +build_val "12" +build_val "11" +build_val "10" +build_val "09" +build_val "08" +build_val "07" +build_val "06" +build_val "05" +build_val "03" +build_val "02" + +cat <> ${OUT_FILENAME} +VAL_ 257 CAN_INTERFERENCE_TYPE 2 "Star PD-Like" 1 "Slow FMCW" 0 "No Interference"; +VAL_ 257 CAN_RECOMMEND_UNCONVERGE 1 "Recommended" 0 "Not Recommended"; +VAL_ 257 CAN_RADAR_ALIGN_INCOMPLETE 1 "Alignment Incomplete" 0 "Alignment Completed"; +VAL_ 257 CAN_BLOCKAGE_SIDELOBE 1 "Radar Blockage" 0 "No Radar Blockage"; +VAL_ 257 CAN_BLOCKAGE_MNR 1 "Radar Blockage" 0 "No Radar Blockage"; +VAL_ 257 CAN_RADAR_EXT_COND_NOK 1 "Too high temp or insufficient pw" 0 "External conditions OK"; +VAL_ 257 CAN_RADAR_ALIGN_OUT_RANGE 1 "Radar out of range" 0 "Radar within range"; +VAL_ 257 CAN_RADAR_ALIGN_NOT_START 1 "Radar align not started" 0 "Radar align started"; +VAL_ 257 CAN_RADAR_OVERHEAT_ERROR 1 "Radar overheat condition" 0 "No Overheat"; +VAL_ 257 CAN_RADAR_NOT_OP 1 "Radar not operational" 0 "Radar operational"; +VAL_ 257 CAN_XCVR_OPERATIONAL 1 "On" 0 "Off "; +EOF + +build_val "01" \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/generator.py b/artifacts/package_runtime/iqdbc/dbc/generator/generator.py new file mode 100644 index 000000000..93b630576 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/generator.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +import os +import re +import glob +import subprocess +import sys + +generator_path = os.path.dirname(os.path.realpath(__file__)) +iqdbc_root = os.path.join(generator_path, '../') +include_pattern = re.compile(r'CM_ "IMPORT (.*?)";\n') +generated_suffix = '_generated.dbc' + + +def read_dbc(src_dir: str, filename: str) -> str: + with open(os.path.join(src_dir, filename), encoding='utf-8') as file_in: + return file_in.read() + + +def create_dbc(src_dir: str, filename: str, output_path: str): + dbc_file_in = read_dbc(src_dir, filename) + + includes = include_pattern.findall(dbc_file_in) + + output_filename = filename.replace('.dbc', generated_suffix) + output_file_location = os.path.join(output_path, output_filename) + + with open(output_file_location, 'w', encoding='utf-8') as dbc_file_out: + dbc_file_out.write('CM_ "AUTOGENERATED FILE, DO NOT EDIT";\n') + + for include_filename in includes: + include_file_header = f'\n\nCM_ "Imported file {include_filename} starts here";\n' + dbc_file_out.write(include_file_header) + + include_file = read_dbc(src_dir, include_filename) + dbc_file_out.write(include_file) + + dbc_file_out.write(f'\nCM_ "{filename} starts here";\n') + + core_dbc = include_pattern.sub('', dbc_file_in) + dbc_file_out.write(core_dbc) + + +def create_all(output_path: str): + # clear out old DBCs + for f in glob.glob(f"{output_path}/*{generated_suffix}"): + os.remove(f) + + # run python generator scripts first + for f in glob.glob(f"{generator_path}/*/*.py"): + subprocess.check_call([sys.executable, f]) + + for src_dir, _, filenames in os.walk(generator_path): + if src_dir == generator_path: + continue + + #print(src_dir) + for filename in filenames: + if filename.startswith('_') or not filename.endswith('.dbc'): + continue + + #print(filename) + create_dbc(src_dir, filename, output_path) + + +if __name__ == "__main__": + create_all(iqdbc_root) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/gm/_community.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/gm/_community.dbc new file mode 100644 index 000000000..f9544e261 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/gm/_community.dbc @@ -0,0 +1,15 @@ +BO_ 512 GAS_COMMAND: 6 NEO + SG_ GAS_COMMAND : 7|16@0+ (0.125677,-75.909) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.251976,-76.601) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (0.125677,-75.909) [0|1] "" NEO + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.251976,-76.601) [0|1] "" NEO + SG_ STATE : 39|4@0+ (1,0) [0|15] "" NEO + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" NEO + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" NEO + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/gm/gm_global_a_powertrain.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/gm/gm_global_a_powertrain.dbc new file mode 100644 index 000000000..5b1ae6a1e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/gm/gm_global_a_powertrain.dbc @@ -0,0 +1,353 @@ +CM_ "IMPORT _community.dbc"; + +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: K16_BECM K73_TCIC K9_BCM K43_PSCM K17_EBCM K20_ECM K114B_HPCM NEO K124_ASCM EPB +VAL_TABLE_ TurnSignals 2 "Right Turn" 1 "Left Turn" 0 "None" ; +VAL_TABLE_ Intellibeam 1 "Active" 0 "Inactive" ; +VAL_TABLE_ HighBeamsActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ HighBeamsTemporary 1 "Active" 0 "Inactive" ; +VAL_TABLE_ ACCLeadCar 1 "Present" 0 "Not Present" ; +VAL_TABLE_ ACCCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ BrakePedalPressed 1 "Pressed" 0 "Depressed" ; +VAL_TABLE_ DistanceButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ LKAButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ; +VAL_TABLE_ DriveModeButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ PRNDL 3 "Reverse" 2 "Drive" 1 "Neutral" 0 "Park" ; +VAL_TABLE_ ESPButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ DoorStatus 1 "Opened" 0 "Closed" ; +VAL_TABLE_ SeatBeltStatus 1 "Latched" 0 "Unlatched" ; +VAL_TABLE_ LKASteeringCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ; +VAL_TABLE_ GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ; +VAL_TABLE_ GasRegenCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ; +VAL_TABLE_ HandsOffSWDetectionStatus 1 "Hands On" 0 "Hands Off" ; +VAL_TABLE_ HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ; + + +BO_ 189 EBCMRegenPaddle: 7 K17_EBCM + SG_ RegenPaddle : 7|4@0+ (1,0) [0|0] "" NEO + +BO_ 190 ECMAcceleratorPos: 6 K20_ECM + SG_ BrakePedalPos : 15|8@0+ (1,0) [0|0] "sticky" NEO + SG_ GasPedalAndAcc : 23|8@0+ (1,0) [0|0] "" NEO + +BO_ 201 ECMEngineStatus: 8 K20_ECM + SG_ EngineTPS : 39|8@0+ (0.392156863,0) [0|100.000000065] "%" NEO + SG_ EngineRPM : 15|16@0+ (0.25,0) [0|0] "RPM" NEO + SG_ CruiseMainOn : 29|1@0+ (1,0) [0|1] "" NEO + SG_ BrakePressed : 40|1@0+ (1,0) [0|1] "" NEO + SG_ Standstill : 2|1@0+ (1,0) [0|1] "" NEO + SG_ CruiseActive : 31|2@0+ (1,0) [0|3] "" NEO + +BO_ 209 EBCMBrakePedalSensors: 7 K17_EBCM + SG_ Counter1 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ Counter2 : 23|2@0+ (1,0) [0|3] "" XXX + SG_ BrakePedalPosition1 : 5|14@0+ (1,0) [0|16383] "" XXX + SG_ BrakePedalPosition2 : 21|14@0- (-1,0) [0|16383] "" XXX + SG_ BrakeNormalized1 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ BrakeNormalized2 : 47|8@0- (-1,0) [0|255] "" XXX + +BO_ 241 EBCMBrakePedalPosition: 6 K17_EBCM + SG_ BrakePressed : 1|1@0+ (1,0) [0|1] "" XXX + SG_ BrakePedalPosition : 15|8@0+ (1,0) [0|255] "" NEO + +BO_ 298 BCMDoorBeltStatus: 8 K9_BCM + SG_ RearLeftDoor : 8|1@0+ (1,0) [0|0] "" NEO + SG_ FrontLeftDoor : 9|1@0+ (1,0) [0|0] "" NEO + SG_ FrontRightDoor : 10|1@0+ (1,0) [0|0] "" NEO + SG_ RearRightDoor : 23|1@0+ (1,0) [0|0] "" NEO + SG_ LeftSeatBelt : 12|1@0+ (1,0) [0|0] "" NEO + SG_ RightSeatBelt : 53|1@0+ (1,0) [0|0] "" NEO + +BO_ 309 ECMPRDNL: 8 K20_ECM + SG_ PRNDL : 2|3@0+ (1,0) [0|0] "" NEO + SG_ ESPButton : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 320 BCMTurnSignals: 3 K9_BCM + SG_ TurnSignals : 19|2@0+ (1,0) [0|0] "" NEO + SG_ Intellibeam : 13|1@0+ (1,0) [0|1] "" XXX + SG_ HighBeamsActive : 7|1@0+ (1,0) [0|1] "" XXX + SG_ HighBeamsTemporary : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 322 BCMBlindSpotMonitor: 7 K9_BCM + SG_ LeftBSM : 6|1@0+ (1,0) [0|1] "" XXX + SG_ RightBSM : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 328 PSCM_148: 1 K43_PSCM + +BO_ 381 ESPStatus: 6 K20_ECM + SG_ TractionControlOn : 5|1@0+ (1,0) [0|0] "" NEO + SG_ MSG17D_AccPower : 35|12@0- (1,0) [0|0] "" NEO + +BO_ 384 ASCMLKASteeringCmd: 4 NEO + SG_ RollingCounter : 5|2@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmdChecksum : 19|12@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmdActive : 3|1@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmd : 2|11@0- (1,0) [0|0] "" NEO + +BO_ 388 PSCMStatus: 8 K43_PSCM + SG_ HandsOffSWDetectionMode : 20|2@0+ (1,0) [0|3] "" NEO + SG_ HandsOffSWlDetectionStatus : 21|1@0+ (1,0) [0|1] "" NEO + SG_ LKATorqueDeliveredStatus : 5|3@0+ (1,0) [0|7] "" NEO + SG_ LKADriverAppldTrq : 50|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO + SG_ LKATorqueDelivered : 18|11@0- (0.01,0) [0|1] "" NEO + SG_ LKATotalTorqueDelivered : 2|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO + SG_ RollingCounter : 38|4@0+ (1,0) [0|15] "" XXX + SG_ PSCMStatusChecksum : 33|10@0+ (1,0) [0|1023] "" XXX + +BO_ 417 AcceleratorPedal: 7 XXX + SG_ AcceleratorPedal : 55|8@0+ (1,0) [0|0] "" NEO + +BO_ 451 GasAndAcc: 8 XXX + SG_ GasPedalAndAcc2 : 55|8@0+ (1,0) [0|0] "" NEO + +BO_ 452 AcceleratorPedal2: 8 XXX + SG_ CruiseState : 15|3@0+ (1,0) [0|7] "" NEO + SG_ AcceleratorPedal2 : 47|8@0+ (1,0) [0|0] "" NEO + +BO_ 481 ASCMSteeringButton: 7 K124_ASCM + SG_ DistanceButton : 22|1@0+ (1,0) [0|0] "" NEO + SG_ LKAButton : 23|1@0+ (1,0) [0|0] "" NEO + SG_ ACCAlwaysOne : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ACCButtons : 46|3@0+ (1,0) [0|0] "" NEO + SG_ DriveModeButton : 39|1@0+ (1,0) [0|1] "" XXX + SG_ RollingCounter : 33|2@0+ (1,0) [0|3] "" NEO + SG_ SteeringButtonChecksum : 43|12@0+ (1,0) [0|255] "" NEO + +BO_ 485 PSCMSteeringAngle: 8 K43_PSCM + SG_ SteeringWheelAngle : 15|16@0- (0.0625,0) [-2047|2047] "deg" NEO + SG_ SteeringWheelRate : 27|12@0- (1,0) [-2047|2047] "deg/s" NEO + +BO_ 489 EBCMVehicleDynamic: 8 K17_EBCM + SG_ BrakePedalPressed : 6|1@0+ (1,0) [0|0] "" NEO + SG_ LateralAcceleration : 3|10@0- (0.161,0) [-2047|2047] "m/s2" NEO + SG_ YawRate : 35|12@0- (0.625,0) [0|1] "" NEO + SG_ YawRate2 : 51|12@0- (0.0625,0) [-2047|2047] "grad/s" NEO + +BO_ 352 BCMImmobilizer: 5 K9_BCM + SG_ ImmobilizerInfo : 7|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 497 BCMGeneralPlatformStatus: 8 K9_BCM + SG_ SystemPowerMode : 1|2@0+ (1,0) [0|3] "" XXX + SG_ SystemBackUpPowerMode : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ParkBrakeSwActive : 36|1@0+ (1,0) [0|3] "" XXX + +BO_ 500 SportMode: 6 XXX + SG_ SnowIceMode : 9|1@0+ (1,0) [0|1] "" XXX + SG_ SportMode : 15|1@0+ (1,0) [0|1] "" XXX + +BO_ 501 ECMPRDNL2: 8 K20_ECM + SG_ TransmissionState : 48|4@1+ (1,0) [0|7] "" NEO + SG_ PRNDL2 : 27|4@0+ (1,0) [0|255] "" NEO + SG_ ManualMode : 41|1@0+ (1,0) [0|1] "" NEO + +BO_ 532 BRAKE_RELATED: 6 XXX + SG_ UserBrakePressure : 0|9@0+ (1,0) [0|511] "" XXX + +BO_ 560 EPBStatus: 8 EPB + SG_ EPBClosed : 12|1@0+ (1,0) [0|1] "" NEO + +BO_ 562 EBCMFrictionBrakeStatus: 8 K17_EBCM + SG_ FrictionBrakeUnavailable : 46|1@0+ (1,0) [0|1] "" XXX + +BO_ 608 SPEED_RELATED: 8 XXX + SG_ RollingCounter : 5|2@0+ (1,0) [0|0] "" XXX + SG_ ClusterSpeed : 31|8@0+ (1,0) [0|0] "" XXX + +BO_ 711 BECMBatteryVoltageCurrent: 6 K17_EBCM + SG_ HVBatteryVoltage : 31|12@0+ (0.125,0) [0|511.875] "V" NEO + SG_ HVBatteryCurrent : 12|13@0- (0.15,0) [-614.4|614.25] "A" NEO + +BO_ 715 ASCMGasRegenCmd: 8 K124_ASCM + SG_ GasRegenAccType : 15|2@0+ (1,0) [0|3] "" NEO + SG_ GasRegenChecksum : 32|25@0+ (1,0) [0|0] "" NEO + SG_ GasRegenFullStopActive : 13|1@0+ (1,0) [0|0] "" NEO + SG_ GasRegenCmdActive : 0|1@0+ (1,0) [0|0] "" NEO + SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" NEO + SG_ GasRegenCmd : 10|19@0+ (0.125,-22534) [-22534|43001.875] "Nm" NEO + +BO_ 717 ASCM_2CD: 5 K124_ASCM + +BO_ 761 BRAKE_RELATED_2: 7 XXX + SG_ UserBrakePressure2 : 47|9@0+ (1,0) [0|511] "" XXX + +BO_ 789 EBCMFrictionBrakeCmd: 5 K124_ASCM + SG_ RollingCounter : 33|2@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeMode : 7|4@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeChecksum : 23|16@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeCmd : 3|12@0- (1,0) [0|0] "" NEO + +BO_ 800 AEBCmd: 6 K124_ASCM + SG_ RollingCounter : 5|2@0+ (1,0) [0|3] "" NEO + SG_ AEBChecksum : 27|20@0+ (1,0) [0|0] "" NEO + SG_ AEBCmdActive : 3|1@1+ (1,0) [0|1] "" NEO + SG_ AEBCmd : 2|11@0+ (1,0) [0|0] "" NEO + SG_ AEBCmd2 : 23|8@0+ (1,0) [0|0] "" NEO + +BO_ 810 TCICOnStarGPSPosition: 8 K73_TCIC + SG_ GPSLongitude : 39|32@0+ (1,-2147483648) [0|0] "milliarcsecond" NEO + SG_ GPSLatitude : 7|32@0+ (1,0) [0|0] "milliarcsecond" NEO + +BO_ 840 EBCMWheelSpdFront: 5 K17_EBCM + SG_ FLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO + SG_ FRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO + +BO_ 842 EBCMWheelSpdRear: 5 K17_EBCM + SG_ RLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO + SG_ RRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO + SG_ RRWheelDir : 34|3@0+ (1,0) [0|7] "" NEO + SG_ RLWheelDir : 37|3@0+ (1,0) [0|7] "" NEO + +BO_ 869 ASCM_365: 4 K124_ASCM + +BO_ 880 ASCMActiveCruiseControlStatus: 6 K124_ASCM + SG_ ACCCruiseState : 8|3@1+ (1,0) [0|7] "" XXX + SG_ ACCLeadCar : 44|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCAlwaysOne2 : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCAlwaysOne : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCSpeedSetpoint : 19|12@0+ (0.0625,0) [0|255.9375] "km/h" NEO + SG_ ACCGapLevel : 21|2@0+ (1,0) [0|0] "" NEO + SG_ ACCResumeButton : 1|1@0+ (1,0) [0|0] "" NEO + SG_ ACCCmdActive : 23|1@0+ (1,0) [0|0] "" NEO + SG_ FCWAlert : 41|2@0+ (1,0) [0|3] "" XXX + +BO_ 967 EVDriveMode: 4 XXX + SG_ SinglePedalModeActive : 7|1@0+ (1,0) [0|1] "" XXX + SG_ SinglePedalModeRisingEdge : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SinglePedalModeFallingEdge : 22|1@0+ (1,0) [0|1] "" XXX + +BO_ 977 ECMCruiseControl: 8 K20_ECM + SG_ CruiseActive : 39|1@0+ (1,0) [0|3] "" NEO + SG_ CruiseSetSpeed : 19|12@0+ (0.0625,0) [0|0] "km/h" NEO + +BO_ 1001 ECMVehicleSpeed: 8 K20_ECM + SG_ VehicleSpeed : 7|16@0+ (0.01,0) [0|0] "mph" NEO + SG_ VehicleSpeedLeft : 39|16@0+ (0.01,0) [0|0] "mph" NEO + +BO_ 1033 ASCMKeepAlive: 7 NEO + SG_ ASCMKeepAliveAllZero : 7|56@0+ (1,0) [0|0] "" NEO + +BO_ 1034 ASCM_40A: 7 K124_ASCM + +BO_ 1217 ECMEngineCoolantTemp: 8 K20_ECM + SG_ EngineCoolantTemp : 23|8@0+ (1,-40) [0|0] "C" NEO + +BO_ 1249 VIN_Part2: 8 K20_ECM + SG_ VINPart2 : 7|64@0+ (1,0) [0|0] "" NEO + +BO_ 1296 ASCM_510: 4 K124_ASCM + +BO_ 1300 VIN_Part1: 8 K20_ECM + SG_ VINPart1 : 7|64@0+ (1,0) [0|0] "" NEO + +BO_ 1912 PSCM_778: 8 K43_PSCM + +BO_ 1930 ASCM_78A: 7 K124_ASCM + +BO_TX_BU_ 384 : K124_ASCM,NEO; +BO_TX_BU_ 880 : NEO,K124_ASCM; +BO_TX_BU_ 1033 : K124_ASCM,NEO; +BO_TX_BU_ 715 : NEO,K124_ASCM; +BO_TX_BU_ 789 : NEO,K124_ASCM; +BO_TX_BU_ 800 : NEO,K124_ASCM; + + +CM_ BU_ K16_BECM "Battery Energy Control Module"; +CM_ BU_ K73_TCIC "Telematics Communication Control Module"; +CM_ BU_ K9_BCM "Body Control Module"; +CM_ BU_ K43_PSCM "Power Steering Control Module"; +CM_ BU_ K17_EBCM "Electronic Brake Control Module"; +CM_ BU_ K20_ECM "Engine Control Module"; +CM_ BU_ K114B_HPCM "Hybrid Powertrain Control Module"; +CM_ BU_ NEO "Comma NEO"; +CM_ BU_ K124_ASCM "Active Safety Control Module"; +CM_ SG_ 381 MSG17D_AccPower "Need to investigate"; +CM_ BO_ 190 "Length varies from 6 to 8 bytes by car"; +CM_ SG_ 190 GasPedalAndAcc "ACC baseline is 62"; +CM_ SG_ 322 LeftBSM "For some cars, this can only be when the blinker is also active"; +CM_ SG_ 322 RightBSM "For some cars, this can only be when the blinker is also active"; +CM_ SG_ 352 ImmobilizerInfo "Non-zero when ignition or accessory mode"; +CM_ SG_ 451 GasPedalAndAcc2 "ACC baseline is 62"; +CM_ SG_ 481 ACCAlwaysOne "Usually 1 if the car is equipped with ACC"; +CM_ SG_ 562 FrictionBrakeUnavailable "1 when ACC brake control is unavailable. Stays high if brake command messages are blocked for a period of time"; +CM_ SG_ 497 SystemPowerMode "Describes ignition"; +CM_ SG_ 497 SystemBackUpPowerMode "Describes ignition + preconditioning mode, noisy"; +CM_ SG_ 501 PRNDL2 "When ManualMode is Active, Value is 13=L1 12=L2 11=L3 ... 5=Full 70kW Paddle Regen Unlocked for Gen2 Bolts 4=L10"; +CM_ SG_ 532 UserBrakePressure "can be lower than other brake position signals when the brakes are pre-filled from ACC braking and the user presses on the brakes. user-only pressure?"; +CM_ SG_ 608 ClusterSpeed "Cluster speed signal seems to match dash on newer cars, but is a lower rate and can be noisier."; +CM_ SG_ 761 UserBrakePressure2 "Similar to BRAKE_RELATED->UserBrakePressure"; +CM_ SG_ 1001 VehicleSpeed "Spinouts show here on 2wd. Speed derived from right front wheel (drive tire)"; +BA_DEF_ "UseGMParameterIDs" INT 0 0; +BA_DEF_ "ProtocolType" STRING ; +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "UseGMParameterIDs" 1; +BA_DEF_DEF_ "ProtocolType" "GMLAN"; +BA_DEF_DEF_ "BusType" ""; +BA_ "BusType" "CAN"; +BA_ "ProtocolType" "GMLAN"; +BA_ "UseGMParameterIDs" 0; +VAL_ 497 SystemPowerMode 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off"; +VAL_ 497 SystemBackUpPowerMode 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off"; +VAL_ 481 DistanceButton 1 "Active" 0 "Inactive" ; +VAL_ 481 LKAButton 1 "Active" 0 "Inactive" ; +VAL_ 481 ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ; +VAL_ 481 DriveModeButton 1 "Active" 0 "Inactive" ; +VAL_ 452 CruiseState 4 "Standstill" 3 "Faulted" 1 "Active" 0 "Off" ; +VAL_ 309 PRNDL 3 "R" 2 "D" 1 "N" 0 "P" ; +VAL_ 309 ESPButton 1 "Active" 0 "Inactive" ; +VAL_ 384 LKASteeringCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 842 RRWheelDir 0 "Stationary" 1 "Forward" 2 "Reverse" 3 "Unsupported" 4 "Fault"; +VAL_ 842 RLWheelDir 0 "Stationary" 1 "Forward" 2 "Reverse" 3 "Unsupported" 4 "Fault"; +VAL_ 880 ACCCruiseState 2 "Adaptive" 3 "Adaptive" 4 "Non-adaptive" 5 "Non-adaptive" ; +VAL_ 880 ACCLeadCar 1 "Present" 0 "Not Present" ; +VAL_ 880 ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ; +VAL_ 880 ACCResumeButton 1 "Pressed" 0 "Depressed" ; +VAL_ 880 ACCCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 388 HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ; +VAL_ 388 HandsOffSWlDetectionStatus 1 "Hands On" 0 "Hands Off" ; +VAL_ 388 LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ; +VAL_ 489 BrakePedalPressed 1 "Pressed" 0 "Depressed" ; +VAL_ 715 GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ; +VAL_ 715 GasRegenCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 320 Intellibeam 1 "Active" 0 "Inactive" ; +VAL_ 320 HighBeamsActive 1 "Active" 0 "Inactive" ; +VAL_ 320 HighBeamsTemporary 1 "Active" 0 "Inactive" ; +VAL_ 501 PRNDL2 7 "L3" 6 "L" 5 "L2" 4 "D" 3 "N" 2 "R" 1 "P" 0 "Shifting"; +VAL_ 501 TransmissionState 11 "Shifting" 10 "Reverse" 9 "Forward" 8 "Disengaged"; +VAL_ 501 ManualMode 1 "Active" 0 "Inactive" diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_2018.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_2018.dbc new file mode 100644 index 000000000..ad2f61afc --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_2018.dbc @@ -0,0 +1,222 @@ +BO_ 228 STEERING_CONTROL: 5 EON + SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS + SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS + SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX + SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 232 BRAKE_HOLD: 7 XXX + SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX + SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX + SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + +BO_ 446 BRAKE_MODULE: 3 VSA + SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX + +BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS + SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 545 ECON_STATUS: 6 SCM + SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY + +BO_ 576 LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 577 LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 579 RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 580 RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ AMBIENT_LIGHT_MAYBE : 23|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 927 RADAR_HUD: 8 RADAR + SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY + SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY + SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY + SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX + SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 13274 LKAS_HUD_A: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + +BO_ 13275 LKAS_HUD_B: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + +CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1"; +CM_ SG_ 662 AMBIENT_LIGHT_MAYBE "Slow-moving sensor value (possibly the ambient light input for adaptive high beam), undecoded. The camera consumes SCM_BUTTONS content beyond the buttons, so frames sent in its place must echo this byte"; +CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded"; +CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded"; +CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded"; +CM_ SG_ 577 LINE_DASHED "1 = line is dashed"; +CM_ SG_ 577 LINE_SOLID "1 = line is solid"; + +VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active"; +VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal"; +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ; +VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN"; +VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_radar_acc.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_radar_acc.dbc new file mode 100644 index 000000000..0a7f75f79 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_radar_acc.dbc @@ -0,0 +1,30 @@ +BO_ 479 ACC_CONTROL: 8 EON + SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX + SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX + SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX + SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX + SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 495 ACC_CONTROL_ON: 8 XXX + SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX + SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled"; +CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event"; +CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event"; +CM_ SG_ 479 AEB_PREPARE "set 1s before AEB"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_standstill.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_standstill.dbc new file mode 100644 index 000000000..298009793 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_bosch_standstill.dbc @@ -0,0 +1,7 @@ +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_community.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_community.dbc new file mode 100644 index 000000000..49a3742b5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_community.dbc @@ -0,0 +1,15 @@ +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_gearbox_common.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_gearbox_common.dbc new file mode 100644 index 000000000..6cd9ccb62 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_gearbox_common.dbc @@ -0,0 +1,41 @@ +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_honda_common.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_honda_common.dbc new file mode 100644 index 000000000..fdf86ec7d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_honda_common.dbc @@ -0,0 +1,221 @@ +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_lkas_hud_5byte.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_lkas_hud_5byte.dbc new file mode 100644 index 000000000..12c3a48c9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_lkas_hud_5byte.dbc @@ -0,0 +1,28 @@ +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_lkas_hud_8byte.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_lkas_hud_8byte.dbc new file mode 100644 index 000000000..bbbc85f26 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_lkas_hud_8byte.dbc @@ -0,0 +1,91 @@ +BO_ 829 LKAS_HUD: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 254913108 LKAS_HUD_2: 8 ADAS + SG_ COUNTER_2 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X01 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_WIDTH : 15|6@0+ (1,0) [0|63] "" XXX + SG_ LEFT_LANE : 23|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE : 21|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LANE_CROSSED : 25|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_CROSSED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LENGTH : 31|6@0+ (1,0) [0|63] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 114120023 HUD_OBJECTS: 8 CAM + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ OBJECT_ID m1 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ IS_LEAD_CAR m1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_TYPE m1 : 23|4@0- (1,0) [-8|7] "" XXX + SG_ ROTATION m1 : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LONG_DIST m1 : 39|10@0+ (0.209,-16.9) [-16.9|196.9] "m" XXX + SG_ LAT_DIST m1 : 43|12@0- (0.1,0) [-204.8|204.7] "m" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120025 HUD_OBJECTS_B: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ OBJECT_ID m1 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ IS_LEAD_CAR m1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_TYPE m1 : 23|4@0- (1,0) [-8|7] "" XXX + SG_ ROTATION m1 : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LONG_DIST m1 : 39|10@0+ (0.209,-16.9) [-16.9|196.9] "m" XXX + SG_ LAT_DIST m1 : 43|12@0- (0.1,0) [-204.8|204.7] "m" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120020 LANE_PATH: 8 CAM + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ PATH_OFFSET_1 m1 : 15|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_2 m1 : 19|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_3 m1 : 39|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_4 m1 : 43|12@0- (1,0) [-2048|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120024 LANE_PATH_B: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ PATH_OFFSET_1 m1 : 15|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_2 m1 : 19|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_3 m1 : 39|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_4 m1 : 43|12@0- (1,0) [-2048|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; +CM_ SG_ 114120023 MUX "1-10, 17-26, 33-42, 49-58 map to the same 10 slots for 5Hz frequency each"; +CM_ SG_ 114120023 IS_LEAD_CAR "1 when this track is the lead car; the lead, when present, is always track index 1"; +CM_ SG_ 114120023 LAT_DIST "positive = left of ego, 204.7 (max value) when inactive"; +CM_ SG_ 114120023 ROTATION "0 straight, negative left, positive right. Range of -3 to 3 seen so far. -128 when inactive."; +CM_ SG_ 114120025 MUX "1-10, 17-26, 33-42, 49-58 map to the same 10 slots for 5Hz frequency each"; +CM_ SG_ 114120025 IS_LEAD_CAR "1 when this track is the lead car; the lead, when present, is always track index 1"; +CM_ SG_ 114120025 LAT_DIST "positive = left of ego, 204.7 (max value) when inactive"; +CM_ SG_ 114120025 ROTATION "0 straight, negative left, positive right. Range of -3 to 3 seen so far. -128 when inactive."; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; +VAL_ 829 LANE_LINES 7 "both_lines_green" 6 "both_lines_white" 2 "left_line_white" 0 "no_lines"; +VAL_ 114120023 CAR_TYPE 7 "CAR" 6 "MOTORCYCLE" -7 "TRUCK" -1 "INACTIVE" 0 "UNKNOWN"; +VAL_ 114120025 CAR_TYPE 7 "CAR" 6 "MOTORCYCLE" -7 "TRUCK" -1 "INACTIVE" 0 "UNKNOWN"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_common.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_common.dbc new file mode 100644 index 000000000..12896d8f6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_common.dbc @@ -0,0 +1,64 @@ +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_scm_group_a.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_scm_group_a.dbc new file mode 100644 index 000000000..7b25e2406 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_scm_group_a.dbc @@ -0,0 +1,20 @@ +BO_ 660 SCM_FEEDBACK: 8 SCM + SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON + SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 422 SCM_BUTTONS: 8 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON + SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON + SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON + +VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ; +VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_scm_group_b.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_scm_group_b.dbc new file mode 100644 index 000000000..ce8d2c482 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_nidec_scm_group_b.dbc @@ -0,0 +1,20 @@ +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_BUTTON : 22|2@0+ (1,0) [0|3] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_a.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_a.dbc new file mode 100644 index 000000000..87bd96948 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_a.dbc @@ -0,0 +1,18 @@ +BO_ 228 STEERING_CONTROL: 5 ADAS + SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_b.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_b.dbc new file mode 100644 index 000000000..0b39c15eb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_b.dbc @@ -0,0 +1,17 @@ +BO_ 404 STEERING_CONTROL: 4 EON + SG_ STEER_TORQUE : 7|12@0- (1,0) [-768|768] "" EPS + SG_ SET_ME_X00 : 11|4@0+ (1,0) [0|15] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00_2 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS + +BO_ 399 STEER_STATUS: 6 EPS + SG_ STEER_TORQUE_SENSOR : 7|12@0- (-1,0) [-2047.5|2047.5] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_CONTROL_ACTIVE : 36|1@0+ (1,0) [0|1] "" EON + SG_ STEER_STATUS : 35|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_c.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_c.dbc new file mode 100644 index 000000000..6dc4b6dcb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_c.dbc @@ -0,0 +1,17 @@ +BO_ 404 STEERING_CONTROL: 4 EON + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS + SG_ STEER_TORQUE : 7|16@0- (-1,0) [-32767|32767] "" EPS + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-2985|2985] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 43|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_d_ext.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_d_ext.dbc new file mode 100644 index 000000000..855a00e04 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_control_d_ext.dbc @@ -0,0 +1,19 @@ +BO_ 228 STEERING_CONTROL: 5 ADAS + SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + +BO_ 400 STEER_STATUS: 5 EPS + SG_ STEER_TORQUE_SENSOR : 0|9@1- (1,0) [-256|256] "" XXX + SG_ LIN_INTERFACE_FATAL_ERROR : 10|1@0+ (1,0) [0|1] "" XXX + SG_ LATE_MESSAGE : 11|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_STATUS : 12|4@1+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ALLOWED : 9|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_APPLIED : 23|16@0- (1,0) [0|511] "" XXX + +VAL_ 400 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_a.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_a.dbc new file mode 100644 index 000000000..52805d622 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_a.dbc @@ -0,0 +1,9 @@ +BO_ 330 STEERING_SENSORS: 8 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON + SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_b.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_b.dbc new file mode 100644 index 000000000..35e9b2752 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_b.dbc @@ -0,0 +1,5 @@ +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_c.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_c.dbc new file mode 100644 index 000000000..8d70ac936 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/_steering_sensors_c.dbc @@ -0,0 +1,7 @@ +CM_ "steer_angle_rate is negative vs _steering_sensors_b.dbc"; + +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_ilx_2016_can.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_ilx_2016_can.dbc new file mode 100644 index 000000000..d39ac8f72 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_ilx_2016_can.dbc @@ -0,0 +1,8 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _nidec_common.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _nidec_scm_group_a.dbc"; +CM_ "IMPORT _steering_sensors_b.dbc"; +CM_ "IMPORT _steering_control_a.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_rdx_2018_can.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_rdx_2018_can.dbc new file mode 100644 index 000000000..aff97788c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_rdx_2018_can.dbc @@ -0,0 +1,16 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _nidec_common.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _nidec_scm_group_a.dbc"; +CM_ "IMPORT _steering_sensors_b.dbc"; +CM_ "IMPORT _steering_control_b.dbc"; + +BO_ 392 GEARBOX_AUTO: 6 XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + SG_ GEAR_SHIFTER : 27|4@0+ (1,0) [0|15] "" EON + SG_ GEAR : 36|5@0+ (1,0) [0|31] "" EON + +VAL_ 392 GEAR_SHIFTER 0 "S" 1 "P" 2 "R" 4 "N" 8 "D" ; +VAL_ 392 GEAR 26 "S" 4 "D" 3 "N" 2 "R" 1 "P" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_rdx_2020_can.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_rdx_2020_can.dbc new file mode 100644 index 000000000..9c469e3e6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/acura_rdx_2020_can.dbc @@ -0,0 +1,7 @@ +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _bosch_2018.dbc"; +CM_ "IMPORT _bosch_radar_acc.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _bosch_standstill.dbc"; +CM_ "IMPORT _steering_sensors_b.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_accord_2017_can_ext.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_accord_2017_can_ext.dbc new file mode 100644 index 000000000..ee3490877 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_accord_2017_can_ext.dbc @@ -0,0 +1,34 @@ +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _nidec_common.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _nidec_scm_group_a.dbc"; +CM_ "IMPORT _steering_sensors_b.dbc"; +CM_ "IMPORT _steering_control_d_ext.dbc"; + +BO_ 392 GEARBOX_AUTO: 6 XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + SG_ GEAR_SHIFTER : 27|4@0+ (1,0) [0|15] "" EON + SG_ GEAR : 36|5@0+ (1,0) [0|31] "" EON + +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +VAL_ 392 GEAR_SHIFTER 0 "S" 1 "P" 2 "R" 4 "N" 8 "D" ; +VAL_ 392 GEAR 26 "S" 4 "D" 3 "N" 2 "R" 1 "P" ; +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_bosch_radarless.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_bosch_radarless.dbc new file mode 100644 index 000000000..5af9d5903 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_bosch_radarless.dbc @@ -0,0 +1,41 @@ +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _bosch_2018.dbc"; +CM_ "IMPORT _lkas_hud_8byte.dbc"; +CM_ "IMPORT _bosch_standstill.dbc"; +CM_ "IMPORT _steering_sensors_a.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; + +BO_ 456 ACC_CONTROL: 8 XXX + SG_ ACCEL_COMMAND : 7|12@0- (0.01,0) [0|0] "m/s^2" XXX + SG_ COMPUTER_BRAKE_ASSIST : 8|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL : 9|1@0+ (1,0) [0|1] "" XXX + SG_ CONTROL_ON : 10|1@0+ (1,0) [0|1] "" XXX + SG_ BOH : 23|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_STATUS : 33|1@1+ (1,0) [0|7] "" XXX + SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_1 : 24|1@1+ (1,0) [0|3] "" XXX + SG_ FCW_2 : 54|1@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 467 CRUISE_FAULT_STATUS: 8 XXX + SG_ CRUISE_FAULT : 3|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 477 GEARBOX_ALT_2: 8 XXX + SG_ GEAR_MT : 39|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 495 SPEED_LIMIT_DASH_DISPLAY: 8 ADAS + SG_ SPEED_LIMIT : 47|8@0+ (1,0) [0|255] "mph" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 456 COMPUTER_BRAKE_ASSIST "on hybrid and alt-brake cars set whenever braking; otherwise allows engine idle stop at a standstill"; +CM_ SG_ 456 STANDSTILL "set to 1 when camera requests -4.0 m/s^2"; +CM_ SG_ 495 SPEED_LIMIT "Defaults to 0xFF if no speed limit found"; + +VAL_ 477 GEAR_MT 14 "reverse" 6 "6th" 5 "5th" 4 "4th" 3 "3rd" 2 "2nd" 1 "1st" 0 "Clutch"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_civic_hatchback_ex_2017_can.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_civic_hatchback_ex_2017_can.dbc new file mode 100644 index 000000000..b6be281bb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_civic_hatchback_ex_2017_can.dbc @@ -0,0 +1,7 @@ +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _bosch_2018.dbc"; +CM_ "IMPORT _bosch_radar_acc.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _bosch_standstill.dbc"; +CM_ "IMPORT _steering_sensors_a.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_civic_touring_2016_can.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_civic_touring_2016_can.dbc new file mode 100644 index 000000000..f79f42f66 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_civic_touring_2016_can.dbc @@ -0,0 +1,19 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _nidec_common.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _nidec_scm_group_b.dbc"; +CM_ "IMPORT _steering_sensors_a.dbc"; +CM_ "IMPORT _steering_control_a.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; + +BO_ 493 HUD_SETTING: 5 XXX + SG_ IMPERIAL_UNIT : 5|1@0+ (1,0) [0|1] "" EON + +BO_ 545 ECON_STATUS: 6 XXX + SG_ ECON_ON_2 : 37|2@0+ (1,0) [0|3] "" EON + SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + +VAL_ 545 ECON_ON_2 0 "off" 3 "on" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_clarity_hybrid_2018_can.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_clarity_hybrid_2018_can.dbc new file mode 100644 index 000000000..c65fa1f7b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_clarity_hybrid_2018_can.dbc @@ -0,0 +1,24 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _nidec_common.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _nidec_scm_group_b.dbc"; +CM_ "IMPORT _steering_sensors_a.dbc"; +CM_ "IMPORT _steering_control_a.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; + +BO_ 768 VEHICLE_STATE: 8 ADAS + SG_ SET_ME_XF9 : 7|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ VEHICLE_SPEED : 15|8@0+ (1,0) [0|255] "kph" Vector__XXX + SG_ SET_ME_X8A : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_XD0 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SALTED_WITH_IDX : 39|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 769 VEHICLE_STATE2: 8 ADAS + SG_ SET_ME_X5D : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X02 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X5F : 39|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_common_canfd.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_common_canfd.dbc new file mode 100644 index 000000000..4c19ed968 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_common_canfd.dbc @@ -0,0 +1,75 @@ +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _bosch_2018.dbc"; +CM_ "IMPORT _bosch_radar_acc.dbc"; +CM_ "IMPORT _lkas_hud_8byte.dbc"; +CM_ "IMPORT _bosch_standstill.dbc"; +CM_ "IMPORT _steering_sensors_a.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; + +BO_ 929 RADAR_REFERENCE: 8 XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 784 RADAR_HUD_CANFD: 8 XXX + SG_ SET_ME_X01 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X01_2 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CMBS_ENABLED_MAYBE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ON : 55|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 114120024 LANE_PATH: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ PATH_OFFSET_1 m1 : 15|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_2 m1 : 19|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_3 m1 : 39|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_4 m1 : 43|12@0- (1,0) [-2048|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120025 HUD_OBJECTS: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ OBJECT_ID m1 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ IS_LEAD_CAR m1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_TYPE m1 : 23|4@0- (1,0) [-8|7] "" XXX + SG_ ROTATION m1 : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LONG_DIST m1 : 39|10@0+ (0.209,-16.9) [-16.9|196.9] "m" XXX + SG_ LAT_DIST m1 : 43|12@0- (0.1,0) [-204.8|204.7] "m" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 254913106 RADAR_LEAD2: 8 XXX + SG_ SET_ME_X88 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X78 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DISTANCE_MAYBE : 23|11@0+ (1,0) [0|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 254913116 RADAR_LEAD: 8 XXX + SG_ SET_ME_X01 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ CNTR_REF : 7|2@0+ (1,0) [0|3] "" XXX + SG_ TARGET_SPEED_MAYBE : 15|8@0+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE : 23|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE : 21|2@0+ (1,0) [0|3] "" XXX + SG_ LANE_PATH_LENGTH : 31|6@0+ (1,0) [0|63] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 440773198 BOSCH_SUPPLEMENTAL_CANFD: 8 XXX + SG_ SET_ME_X01 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X41 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 1808 RADAR_SUPP_TICK_REFERENCE: 32 XXX + SG_ IGNORE : 11|1@0+ (1,0) [0|1] "" XXX + +BO_ 1840 RADAR_HUD_TICK_REFERENCE: 6 XXX + SG_ IGNORE : 11|1@0+ (1,0) [0|1] "" XXX + +BO_ 1872 RADAR_50HZ_TICK_REFERENCE: 16 XXX + SG_ IGNORE : 11|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 254913116 LANE_PATH_LENGTH "number of valid LANE_PATH points in the current sweep (6 = idle/no lane, up to 23-24); the dash needs this to match the in-band 2047 terminator to draw the lane lines"; +CM_ SG_ 254913116 LEFT_LANE "3 = left lane line detected, 0 = none; tracks the camera's LKAS_HUD LANE_LINES bit 1 exactly in factory logs. The CAN FD equivalent of radarless LKAS_HUD_2 LEFT_LANE; the dash won't draw the lane lines while both are 0"; +CM_ SG_ 254913116 RIGHT_LANE "3 = right lane line detected, 0 = none; tracks the camera's LKAS_HUD LANE_LINES bit 0 exactly in factory logs. The CAN FD equivalent of radarless LKAS_HUD_2 RIGHT_LANE; the dash won't draw the lane lines while both are 0"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_crv_ex_2017_body.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_crv_ex_2017_body.dbc new file mode 100644 index 000000000..363b59581 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_crv_ex_2017_body.dbc @@ -0,0 +1,10 @@ +BO_ 318291879 BSM_STATUS_RIGHT: 8 XXX + SG_ BSM_ALERT : 4|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_MODE : 6|2@0+ (1,0) [0|3] "" XXX + +BO_ 318291615 BSM_STATUS_LEFT: 8 XXX + SG_ BSM_ALERT : 4|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_MODE : 6|2@0+ (1,0) [0|3] "" XXX + +VAL_ 318291879 BSM_MODE 2 "blind_spot" 1 "cross_traffic" 0 "off"; +VAL_ 318291615 BSM_MODE 2 "blind_spot" 1 "cross_traffic" 0 "off"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_crv_touring_2016_can.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_crv_touring_2016_can.dbc new file mode 100644 index 000000000..0ecc665e9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_crv_touring_2016_can.dbc @@ -0,0 +1,8 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _nidec_common.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _nidec_scm_group_a.dbc"; +CM_ "IMPORT _steering_sensors_b.dbc"; +CM_ "IMPORT _steering_control_b.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_insight_ex_2019_can.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_insight_ex_2019_can.dbc new file mode 100644 index 000000000..4da20adea --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_insight_ex_2019_can.dbc @@ -0,0 +1,14 @@ +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _bosch_2018.dbc"; +CM_ "IMPORT _bosch_radar_acc.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _steering_sensors_a.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; + +BO_ 432 STANDSTILL: 7 VSA + SG_ BRAKE_ERROR_1 : 13|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 12|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + +CM_ BO_ 432 "Slightly conflicting definition with common Bosch standstill message, this one could be broken"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_odyssey_exl_2018.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_odyssey_exl_2018.dbc new file mode 100644 index 000000000..377c6650e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_odyssey_exl_2018.dbc @@ -0,0 +1,8 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _nidec_common.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _nidec_scm_group_b.dbc"; +CM_ "IMPORT _steering_sensors_b.dbc"; +CM_ "IMPORT _steering_control_a.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_odyssey_twn_2018.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_odyssey_twn_2018.dbc new file mode 100644 index 000000000..b382ce5b3 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_odyssey_twn_2018.dbc @@ -0,0 +1,8 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _honda_common.dbc"; +CM_ "IMPORT _nidec_common.dbc"; +CM_ "IMPORT _lkas_hud_5byte.dbc"; +CM_ "IMPORT _nidec_scm_group_a.dbc"; +CM_ "IMPORT _steering_sensors_c.dbc"; +CM_ "IMPORT _steering_control_c.dbc"; +CM_ "IMPORT _gearbox_common.dbc"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_radar_scan.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_radar_scan.dbc new file mode 100644 index 000000000..e49279cc3 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_radar_scan.dbc @@ -0,0 +1,436 @@ +VERSION "honda_radar_scan -- Honda Bosch radar object scan: 16 object slots, each a POS/SHAPE/LIFE/IDENT frame quartet plus a synchronized MOTION companion. Raw counts only; physical conversion lives in iqdbc/car/honda/radar_scan.py" + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: SCANNER XXX + + +BO_ 640 RADAR_SCAN_00_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 641 RADAR_SCAN_00_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 642 RADAR_SCAN_00_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 643 RADAR_SCAN_00_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 712 RADAR_SCAN_00_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 644 RADAR_SCAN_01_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 645 RADAR_SCAN_01_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 646 RADAR_SCAN_01_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 647 RADAR_SCAN_01_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 713 RADAR_SCAN_01_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 648 RADAR_SCAN_02_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 649 RADAR_SCAN_02_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 650 RADAR_SCAN_02_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 651 RADAR_SCAN_02_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 714 RADAR_SCAN_02_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 652 RADAR_SCAN_03_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 653 RADAR_SCAN_03_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 654 RADAR_SCAN_03_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 655 RADAR_SCAN_03_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 715 RADAR_SCAN_03_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 720 RADAR_SCAN_04_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 721 RADAR_SCAN_04_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 722 RADAR_SCAN_04_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 723 RADAR_SCAN_04_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 716 RADAR_SCAN_04_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 724 RADAR_SCAN_05_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 725 RADAR_SCAN_05_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 726 RADAR_SCAN_05_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 727 RADAR_SCAN_05_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 717 RADAR_SCAN_05_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 728 RADAR_SCAN_06_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 729 RADAR_SCAN_06_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 730 RADAR_SCAN_06_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 731 RADAR_SCAN_06_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 718 RADAR_SCAN_06_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 732 RADAR_SCAN_07_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 733 RADAR_SCAN_07_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 734 RADAR_SCAN_07_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 735 RADAR_SCAN_07_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 719 RADAR_SCAN_07_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 736 RADAR_SCAN_08_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 737 RADAR_SCAN_08_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 738 RADAR_SCAN_08_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 739 RADAR_SCAN_08_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 656 RADAR_SCAN_08_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 740 RADAR_SCAN_09_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 741 RADAR_SCAN_09_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 742 RADAR_SCAN_09_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 743 RADAR_SCAN_09_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 657 RADAR_SCAN_09_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 744 RADAR_SCAN_10_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 745 RADAR_SCAN_10_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 746 RADAR_SCAN_10_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 747 RADAR_SCAN_10_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 658 RADAR_SCAN_10_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 748 RADAR_SCAN_11_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 749 RADAR_SCAN_11_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 750 RADAR_SCAN_11_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 751 RADAR_SCAN_11_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 659 RADAR_SCAN_11_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 752 RADAR_SCAN_12_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 753 RADAR_SCAN_12_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 754 RADAR_SCAN_12_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 755 RADAR_SCAN_12_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 660 RADAR_SCAN_12_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 756 RADAR_SCAN_13_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 757 RADAR_SCAN_13_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 758 RADAR_SCAN_13_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 759 RADAR_SCAN_13_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 661 RADAR_SCAN_13_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 760 RADAR_SCAN_14_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 761 RADAR_SCAN_14_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 762 RADAR_SCAN_14_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 763 RADAR_SCAN_14_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 662 RADAR_SCAN_14_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 764 RADAR_SCAN_15_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 765 RADAR_SCAN_15_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 766 RADAR_SCAN_15_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 767 RADAR_SCAN_15_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 663 RADAR_SCAN_15_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_radar_scan.py b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_radar_scan.py new file mode 100644 index 000000000..5a9dbc906 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/honda/honda_radar_scan.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import os + +SCAN_SLOTS = 16 + +FRAME_SIGNALS = { + "POS": [ + ("SCAN_STATE", 15, 4), + ("CYCLE", 27, 4), + ("DIST_RAW", 23, 12), + ("BEARING_RAW", 39, 11), + ("DIST_SIGMA_RAW", 7, 7), + ], + "SHAPE": [ + ("CYCLE", 28, 4), + ("PRESENCE_RAW", 46, 7), + ], + "LIFE": [ + ("CYCLE", 11, 4), + ("AGE_RAW", 7, 12), + ], + "IDENT": [ + ("CYCLE", 12, 4), + ("OBJECT_HANDLE", 55, 8), + ], + "MOTION": [ + ("CYCLE", 12, 4), + ("CLOSING_SPEED_RAW", 7, 11), + ("CLOSING_SPEED_SIGMA_RAW", 23, 10), + ("DIST_RATIO_RAW", 55, 10), + ], +} + +QUARTET_KINDS = ("POS", "SHAPE", "LIFE", "IDENT") + + +def quartet_base_address(slot: int) -> int: + return 0x280 + 4 * slot if slot < 4 else 0x2D0 + 4 * (slot - 4) + + +def motion_address(slot: int) -> int: + return 0x2C8 + slot if slot < 8 else 0x290 + (slot - 8) + + +def frame_address(slot: int, kind: str) -> int: + if kind == "MOTION": + return motion_address(slot) + return quartet_base_address(slot) + QUARTET_KINDS.index(kind) + + +HEADER = """VERSION "honda_radar_scan -- Honda Bosch radar object scan: 16 object slots, each a POS/SHAPE/LIFE/IDENT \ +frame quartet plus a synchronized MOTION companion. Raw counts only; physical conversion lives in \ +iqdbc/car/honda/radar_scan.py" + +NS_ : +\tNS_DESC_ +\tCM_ +\tBA_DEF_ +\tBA_ +\tVAL_ +\tCAT_DEF_ +\tCAT_ +\tFILTER +\tBA_DEF_DEF_ +\tEV_DATA_ +\tENVVAR_DATA_ +\tSGTYPE_ +\tSGTYPE_VAL_ +\tBA_DEF_SGTYPE_ +\tBA_SGTYPE_ +\tSIG_TYPE_REF_ +\tVAL_TABLE_ +\tSIG_GROUP_ +\tSIG_VALTYPE_ +\tSIGTYPE_VALTYPE_ +\tBO_TX_BU_ +\tBA_DEF_REL_ +\tBA_REL_ +\tBA_DEF_DEF_REL_ +\tBU_SG_REL_ +\tBU_EV_REL_ +\tBU_BO_REL_ +\tSG_MUL_VAL_ + +BS_: + +BU_: SCANNER XXX + +""" + + +def render() -> str: + parts = [HEADER] + for slot in range(SCAN_SLOTS): + for kind in (*QUARTET_KINDS, "MOTION"): + addr = frame_address(slot, kind) + parts.append(f"\nBO_ {addr} RADAR_SCAN_{slot:02d}_{kind}: 8 SCANNER\n") + for name, start_bit, size in FRAME_SIGNALS[kind]: + parts.append(f" SG_ {name} : {start_bit}|{size}@0+ (1,0) [0|{(1 << size) - 1}] \"\" XXX\n") + return "".join(parts) + + +if __name__ == "__main__": + out_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "honda_radar_scan.dbc") + with open(out_path, "w", encoding="utf-8") as f: + f.write(render()) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/.gitignore b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/.gitignore new file mode 100644 index 000000000..9f93c9250 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/.gitignore @@ -0,0 +1,3 @@ +hyundai_kia_mando_front_radar.dbc +hyundai_kia_denso_front_radar.dbc +hyundai_kia_mando_corner_radar.dbc diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/_hyundai_common.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/_hyundai_common.dbc new file mode 100644 index 000000000..52a06931f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/_hyundai_common.dbc @@ -0,0 +1,235 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX CAMERA FRONT_RADAR ADRV APRK + + +BO_ 80 LKAS: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ACTIVE : 27|2@1+ (1,0) [0|255] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX + SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ANGLE_CMD : 82|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX + SG_ VALUE104 : 104|8@1+ (1,0) [0|255] "" XXX + +BO_ 81 ADRV_0x51: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 384 CAM_0x180: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 385 CAM_0x181: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 386 CAM_0x182: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 387 CAM_0x183: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 388 CAM_0x184: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 389 CAM_0x185: 8 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 438 CAM_0x1b6: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 439 CAM_0x1b7: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 440 CAM_0x1b8: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 441 CAM_0x1b9: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 513 RADAR_0x201: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 528 RADAR_0x210: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 529 RADAR_0x211: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 530 RADAR_0x212: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 531 RADAR_0x213: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 532 RADAR_0x214: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 533 RADAR_0x215: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 534 RADAR_0x216: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 535 RADAR_0x217: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 536 RADAR_0x218: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 537 RADAR_0x219: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 538 RADAR_0x21a: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 539 RADAR_0x21b: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 540 RADAR_0x21c: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 541 RADAR_0x21d: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 542 RADAR_0x21e: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 543 RADAR_0x21f: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 576 RADAR_0x240: 16 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 674 CAM_0x2a2: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 675 CAM_0x2a3: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 676 CAM_0x2a4: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX + SG_ BYTE8 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE16 : 128|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE17 : 136|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE18 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE19 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE20 : 160|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE21 : 168|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE22 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE23 : 184|8@1+ (1,0) [0|255] "" XXX + +BO_ 699 CAM_0x2bb: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 700 CAM_0x2bc: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 701 CAM_0x2bd: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 702 CAM_0x2be: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +CM_ BO_ 676 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA."; + +CM_ SG_ 80 HAS_LANE_SAFETY "If 0, hides LKAS 'Lane Safety' menu from vehicle settings"; +CM_ SG_ 676 LEFT_LANE_LINE "Left lane line confidence"; +CM_ SG_ 676 RIGHT_LANE_LINE "Right lane line confidence"; +VAL_ 80 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green" ; +VAL_ 80 LKA_MODE 1 "warning only" 2 "assist" 6 "off" ; +VAL_ 676 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 676 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd.dbc new file mode 100644 index 000000000..26aa743d4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd.dbc @@ -0,0 +1,1107 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX CAMERA FRONT_RADAR ADRV APRK + + +BO_ 53 ACCELERATOR: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ ACCELERATOR_PEDAL : 40|8@1+ (1,0) [0|255] "" XXX + SG_ GEAR : 192|3@1+ (1,0) [0|7] "" XXX + +BO_ 64 GEAR_ALT: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ GEAR : 32|3@1+ (1,0) [0|7] "" XXX + SG_ GEAR_STEP : 67|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 76|4@1+ (1,0) [0|15] "" XXX + +BO_ 69 GEAR: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ GEAR : 44|3@1+ (1,0) [0|7] "" XXX + SG_ RIGHT_PADDLE : 57|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_PADDLE : 58|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_STEP : 146|5@1+ (1,0) [0|31] "" XXX + SG_ GEAR_STEP1 : 154|5@1+ (1,0) [0|31] "" XXX + +BO_ 80 LKAS: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ACTIVE : 27|2@1+ (1,0) [0|255] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX + SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ANGLE_CMD : 82|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX + SG_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX + +BO_ 81 ADRV_0x51: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 96 ESP_STATUS: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ TRACTION_AND_STABILITY_CONTROL : 42|3@1+ (1,0) [0|63] "" XXX + SG_ BRAKE_PRESSURE : 128|11@1+ (1,0) [0|2047] "" XXX + SG_ BRAKE_PRESSED : 148|1@1+ (1,0) [0|3] "" XXX + SG_ AUTO_HOLD : 192|1@0+ (1,0) [0|1] "" XXX + +BO_ 101 BRAKE: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BRAKE_LIGHT : 29|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_POSITION : 40|16@1- (1,0) [0|65535] "" XXX + SG_ BRAKE_PRESSED : 57|1@1+ (1,0) [0|3] "" XXX + +BO_ 112 GEAR_ALT_2: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ GEAR : 60|3@1+ (1,0) [0|7] "" XXX + +BO_ 160 WHEEL_SPEEDS: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ MOVING_FORWARD : 56|1@0+ (1,0) [0|1] "" XXX + SG_ MOVING_BACKWARD : 57|1@0+ (1,0) [0|1] "" XXX + SG_ MOVING_FORWARD2 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ MOVING_BACKWARD2 : 59|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_SPEED_1 : 64|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_2 : 80|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_3 : 96|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_4 : 112|16@1+ (0.03125,0) [0|65535] "kph" XXX + +BO_ 203 LFA_ALT: 24 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 29|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ANGLE_CMD : 32|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 234 MDPS: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ LKA_ACTIVE : 48|1@0+ (1,0) [0|16777215] "" XXX + SG_ LKA_FAULT : 54|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_OUT_TORQUE : 64|12@1+ (0.1,-204.8) [0|65535] "" XXX + SG_ STEERING_COL_TORQUE : 80|13@1+ (1,-4095) [0|4095] "" XXX + SG_ STEERING_ANGLE : 96|16@1- (-0.1,0) [0|255] "deg" XXX + SG_ STEERING_ANGLE_2 : 128|16@1- (-0.1,0) [0|65535] "deg" XXX + SG_ LFA2_ACTIVE : 145|2@0+ (1,0) [0|3] "" XXX + SG_ LFA2_FAULT : 149|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 159|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 167|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 175|8@0+ (1,0) [0|255] "" XXX + +BO_ 256 ACCELERATOR_BRAKE_ALT: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED : 32|1@1+ (1,0) [0|1] "" XXX + SG_ ACCELERATOR_PEDAL_PRESSED : 176|1@1+ (1,0) [0|1] "" XXX + +BO_ 261 ACCELERATOR_ALT: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ ACCELERATOR_PEDAL : 103|10@1+ (0.25,0) [0|1022] "" XXX + +BO_ 267 CRUISE_BUTTONS_ALT2: 16 XXX + SG_ CRUISE_BUTTONS : 83|4@0+ (1,0) [0|15] "" XXX + SG_ LFA_BTN : 87|1@0+ (1,0) [0|1] "" XXX + +BO_ 272 LKAS_ALT: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ACTIVE : 27|2@1+ (1,0) [0|3] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|3] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|1] "" XXX + SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ANGLE_CMD : 82|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX + SG_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX + SG_ VALUE231 : 231|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE239 : 239|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE247 : 247|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE255 : 255|8@0+ (1,0) [0|255] "" XXX + +BO_ 293 STEERING_SENSORS: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ STEERING_ANGLE : 24|16@1- (-0.1,0) [0|255] "deg" XXX + SG_ STEERING_RATE : 40|8@1+ (4,0) [0|1016] "deg/s" XXX + +BO_ 298 LFA: 16 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ACTIVE : 27|2@1+ (1,0) [0|3] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|3] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|1] "" XXX + SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ANGLE_CMD : 82|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX + SG_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX + SG_ VALUE231 : 231|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE239 : 239|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE247 : 247|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE255 : 255|8@0+ (1,0) [0|255] "" XXX + +BO_ 304 GEAR_SHIFTER: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ PARK_BUTTON : 32|2@1+ (1,0) [0|3] "" XXX + SG_ KNOB_POSITION : 40|3@1+ (1,0) [0|3] "" XXX + SG_ GEAR : 64|3@1+ (1,0) [0|7] "" XXX + +BO_ 1079 TRAILER_STATUS: 8 XXX + SG_ TRAILER_CONNECTED : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 352 ADRV_0x160: 16 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ AEB_SETTING : 24|2@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_2 : 56|8@1+ (1,0) [0|1] "" XXX + SG_ SET_ME_FF : 64|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_FC : 72|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_9 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 95|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 102|1@0+ (1,0) [0|1] "" XXX + +BO_ 353 ADRV_0x161: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ FCA_ICON : 24|3@1+ (1,0) [0|7] "" XXX + SG_ FCA_ALT_ICON : 27|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ICON : 30|3@1+ (1,0) [0|3] "" XXX + SG_ HBA_ICON : 33|3@1+ (1,0) [0|7] "" XXX + SG_ FCA_IMAGE : 42|3@1+ (1,0) [0|7] "" XXX + SG_ BCA_LEFT : 51|3@1+ (1,0) [0|7] "" XXX + SG_ BCA_RIGHT : 54|3@1+ (1,0) [0|7] "" XXX + SG_ LCA_LEFT_ARROW : 57|3@1+ (1,0) [0|7] "" XXX + SG_ LCA_RIGHT_ARROW : 60|3@1+ (1,0) [0|7] "" XXX + SG_ CENTERLINE : 64|2@1+ (1,0) [0|3] "" XXX + SG_ TARGET : 66|3@1+ (1,0) [0|7] "" XXX + SG_ TARGET_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LANELINE_LEFT : 80|4@1+ (1,0) [0|15] "" XXX + SG_ LANELINE_LEFT_POSITION : 84|6@1+ (1,0) [0|15] "" XXX + SG_ LANELINE_RIGHT : 90|4@1+ (1,0) [0|15] "" XXX + SG_ LANELINE_RIGHT_POSITION : 94|6@1+ (1,0) [0|15] "" XXX + SG_ LANELINE_CURVATURE : 100|4@1+ (1,0) [0|31] "" XXX + SG_ LANELINE_CURVATURE_DIRECTION : 104|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_HIGHLIGHT : 105|4@1+ (1,0) [0|15] "" XXX + SG_ LANE_HIGHLIGHT_DISTANCE : 109|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LANE_LEFT : 120|3@1+ (1,0) [0|7] "" XXX + SG_ LANE_RIGHT : 123|3@1+ (1,0) [0|7] "" XXX + SG_ LANE_ZOOM : 126|2@1+ (1,0) [0|3] "" XXX + SG_ ALERTS_1 : 128|6@1+ (1,0) [0|63] "" XXX + SG_ ALERTS_2 : 134|5@1+ (1,0) [0|31] "" XXX + SG_ ALERTS_3 : 139|5@1+ (1,0) [0|31] "" XXX + SG_ ALERTS_4 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ ALERTS_5 : 152|5@1+ (1,0) [0|31] "" XXX + SG_ MUTE : 157|3@1+ (1,0) [0|7] "" XXX + SG_ SOUNDS_1 : 160|4@1+ (1,0) [0|3] "" XXX + SG_ SOUNDS_2 : 164|4@1+ (1,0) [0|3] "" XXX + SG_ SOUNDS_3 : 168|4@1+ (1,0) [0|15] "" XXX + SG_ SOUNDS_4 : 172|3@1+ (1,0) [0|7] "" XXX + SG_ SETSPEED_HUD : 181|3@1+ (1,0) [0|7] "" XXX + SG_ DISTANCE_LEAD : 184|5@1+ (1,0) [0|31] "" XXX + SG_ DISTANCE_CAR : 189|3@1+ (1,0) [0|7] "" XXX + SG_ DISTANCE_SPACING : 192|4@1+ (1,0) [0|15] "" XXX + SG_ DISTANCE : 196|4@1+ (1,0) [0|7] "" XXX + SG_ vSetDis : 200|8@1+ (1,0) [0|255] "" XXX + SG_ SETSPEED : 208|4@1+ (1,0) [0|7] "" XXX + SG_ HDA_ICON : 212|3@1+ (1,0) [0|7] "" XXX + SG_ SLA_ICON : 216|4@1+ (1,0) [0|15] "" XXX + SG_ NAV_ICON : 220|3@1+ (1,0) [0|7] "" XXX + SG_ LFA_ICON : 224|3@1+ (1,0) [0|7] "" XXX + SG_ LCA_LEFT_ICON : 228|3@1+ (1,0) [0|7] "" XXX + SG_ LCA_RIGHT_ICON : 232|3@1+ (1,0) [0|7] "" XXX + SG_ BACKGROUND : 236|4@1+ (1,0) [0|15] "" XXX + SG_ DAW_ICON : 240|3@1+ (1,0) [0|7] "" XXX + SG_ CAR_CIRCLE : 243|3@1+ (1,0) [0|7] "" XXX + +BO_ 354 CCNC_0x162: 32 CCNC + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTRY : 24|4@1+ (1,0) [0|7] "" XXX + SG_ SPEEDLIMIT_FLASH : 28|4@1+ (1,0) [0|15] "" XXX + SG_ SPEEDLIMIT : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SIGNS : 40|8@1+ (1,0) [0|15] "" XXX + SG_ SPEEDLIMIT_WEATHER : 48|4@1+ (1,0) [0|15] "" XXX + SG_ VIBRATE : 52|1@0+ (1,0) [0|1] "" XXX + SG_ FF_DETECT : 64|5@1+ (1,0) [0|31] "" XXX + SG_ FF_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ FF_LATERAL : 80|7@1+ (0.1,0) [0|127] "m" XXX + SG_ FF_DETECT_ALT : 88|5@1+ (1,0) [0|31] "" XXX + SG_ FF_DISTANCE_ALT : 93|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ FF_LATERAL_ALT : 104|7@1+ (0.1,0) [0|127] "m" XXX + SG_ LF_DETECT : 112|5@1+ (1,0) [0|31] "" XXX + SG_ LF_DETECT_DISTANCE : 117|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LF_DETECT_LATERAL : 128|7@1+ (0.1,0) [0|127] "m" XXX + SG_ RF_DETECT : 136|5@1+ (1,0) [0|31] "" XXX + SG_ RF_DETECT_DISTANCE : 141|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ RF_DETECT_LATERAL : 152|7@1+ (0.1,0) [0|127] "m" XXX + SG_ LR_DETECT : 163|5@1+ (1,0) [0|31] "" XXX + SG_ LR_DETECT_DISTANCE : 175|8@0+ (0.1,0) [0|255] "" XXX + SG_ LR_DETECT_LATERAL : 176|7@1+ (0.1,0) [0|127] "" XXX + SG_ RR_DETECT : 192|5@1+ (1,0) [0|31] "" XXX + SG_ RR_DETECT_DISTANCE : 197|8@1+ (0.1,0) [0|255] "" XXX + SG_ RR_DETECT_LATERAL : 205|7@1+ (0.1,0) [0|127] "" XXX + SG_ FAULT_FSS : 213|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_FCA : 216|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_LSS : 219|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_SLA : 222|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_DAW : 225|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_HBA : 228|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_SCC : 231|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_LFA : 234|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_HDA : 237|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_LCA : 240|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_HDP : 243|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_DAS : 246|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_ESS : 249|3@1+ (1,0) [0|7] "" XXX + +BO_ 357 SPAS1: 24 APRK + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_2 : 90|3@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 96|16@1- (0.1,0) [0|0] "" XXX + +BO_ 362 SPAS2: 32 APRK + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BLINKER_CONTROL : 133|3@1+ (1,0) [0|0] "" XXX + +BO_ 373 TCS: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 24|7@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_9 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ aBasis : 32|11@1+ (0.01,-10.23) [0|7] "m/s^2" XXX + SG_ NEW_SIGNAL_1 : 47|5@0+ (1,0) [0|31] "" XXX + SG_ ACCEL_REF_ACC : 48|11@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_2 : 63|5@0+ (1,0) [0|31] "" XXX + SG_ SCC_OptTyp : 64|2@1+ (1,0) [0|0] "" AWD,EMS,FR_CMR,HCU,H_U_MM,TCU,VCU,vBDM + SG_ ACCEnable : 67|2@0+ (1,0) [0|3] "" XXX + SG_ ACC_REQ : 68|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 69|1@0+ (1,0) [0|1] "" XXX + SG_ SCC_ReqLimSta : 70|2@1+ (1,0) [0|0] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM + SG_ ESC_StdStillVal : 72|2@1+ (1,0) [0|3] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM + SG_ BrakeLight : 74|2@1+ (1,0) [0|3] "" XXX + SG_ ESC_DclEnblReq : 76|2@1+ (1,0) [0|3] "" AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM + SG_ NEW_SIGNAL_5 : 79|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 80|1@0+ (1,0) [0|1] "" XXX + SG_ DriverBraking : 81|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_20 : 82|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_11 : 83|1@0+ (1,0) [0|1] "" XXX + SG_ DriverBrakingLowSens : 84|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_10 : 85|1@0+ (1,0) [0|1] "" XXX + SG_ ESC_PrkBrkActvSta : 86|2@1+ (1,0) [0|3] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,RR_C_RDR,TCU,vBDM + SG_ NEW_SIGNAL_12 : 95|8@0+ (1,0) [0|255] "" XXX + SG_ FCA_EquipSta : 96|2@1+ (1,0) [0|3] "" ADAS_DRV,FR_CMR,H_U_MM,vBDM + SG_ FCA_AvlblSta : 98|2@1+ (1,0) [0|3] "" ADAS_DRV,AFCU_DRV,CLU,Dummy,FR_CMR,H_U_MM,vBDM + SG_ NEW_SIGNAL_13 : 103|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 111|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 119|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_16 : 127|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 128|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_7 : 135|2@0+ (1,0) [0|3] "" XXX + SG_ PROBABLY_EQUIP : 136|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_18 : 143|6@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_19 : 151|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 183|16@0+ (1,0) [0|65535] "" XXX + +BO_ 384 CAM_0x180: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 385 CAM_0x181: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 386 CAM_0x182: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 387 CAM_0x183: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 388 CAM_0x184: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 389 CAM_0x185: 8 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 416 SCC_CONTROL: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ ACC_ObjDist : 24|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ ACC_ObjRelSpd : 35|12@1+ (0.1,-170) [-16.4|34.7] "m/s" XXX + SG_ ACC_ObjLatPos : 47|9@1- (0.1,-20) [0|511] "" XXX + SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ SysFailState : 64|2@1+ (1,0) [0|3] "" XXX + SG_ MainMode_ACC : 66|1@1+ (1,0) [0|1] "" XXX + SG_ ACCMode : 68|3@1+ (1,0) [0|7] "" XXX + SG_ TakeOverReq : 73|2@0+ (1,0) [0|3] "" XXX + SG_ InfoDisplay : 74|3@1+ (1,0) [0|7] "" XXX + SG_ DriverAlert : 77|2@1+ (1,0) [0|3] "" XXX + SG_ ObjDistLevel : 80|8@1+ (1,0) [0|255] "" XXX + SG_ DISTANCE_SETTING : 88|4@1+ (1,0) [0|15] "" XXX + SG_ VSetDis : 103|8@0+ (1,0) [0|255] "km/h or mph" XXX + SG_ NSCCOper : 104|2@1+ (1,0) [0|3] "" XXX + SG_ NSCCOnOff : 106|2@1+ (1,0) [0|3] "" XXX + SG_ HUD_LEAD_INFO : 108|3@1+ (1,0) [0|7] "" XXX + SG_ DriveMode : 112|3@1+ (1,0) [0|7] "" XXX + SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX + SG_ aReqRaw : 140|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX + SG_ JerkUpperLimit : 158|7@0+ (0.1,0) [0|0] "" XXX + SG_ JerkLowerLimit : 166|7@0+ (0.1,0) [0|12.7] "m/s^3" XXX + SG_ AccelLimitBandUpper : 173|6@0+ (0.02,0) [0|63] "" XXX + SG_ AccelLimitBandLower : 181|6@0+ (0.02,0) [0|63] "" XXX + SG_ StopReq : 185|2@0+ (1,0) [0|3] "" XXX + SG_ CRUSE_INFO_SET_2 : 189|2@0+ (1,0) [0|3] "" XXX + SG_ TARGET_DISTANCE : 192|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ ZEROS_2 : 207|5@0+ (1,0) [0|63] "" XXX + SG_ ZEROS : 215|48@0+ (1,0) [0|281474976710655] "" XXX + +BO_ 426 CRUISE_BUTTONS_ALT: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 24|4@1+ (1,0) [0|15] "" XXX + SG_ SET_ME_1 : 28|2@1+ (1,0) [0|3] "" XXX + SG_ DISTANCE_UNIT : 30|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 31|3@1+ (1,0) [0|7] "" XXX + SG_ ADAPTIVE_CRUISE_MAIN_BTN : 34|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ CRUISE_BUTTONS : 36|3@1+ (1,0) [0|4] "" XXX + SG_ LFA_BTN : 39|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 40|1@1+ (1,0) [0|1] "" XXX + SG_ NORMAL_CRUISE_MAIN_BTN : 41|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 42|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_2 : 44|3@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_6 : 47|1@1+ (1,0) [0|1] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ CLU_SPEED : 64|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX + +BO_ 437 CCNC_0x1B5: 32 CCNC + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_QUAL : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LEFT_LDW : 27|2@1+ (1,0) [0|3] "" XXX + SG_ LEFT_POSITION : 29|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" XXX + SG_ LEFT_HEADING : 43|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" XXX + SG_ LEFT_CURVATURE : 64|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" XXX + SG_ LEFT_CURVATURE_DERIVATIVE : 80|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" XXX + SG_ RIGHT_QUAL : 96|3@1+ (1,0) [0|7] "" XXX + SG_ RIGHT_LDW : 99|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_POSITION : 101|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" XXX + SG_ RIGHT_HEADING : 115|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" XXX + SG_ RIGHT_CURVATURE : 128|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" XXX + SG_ RIGHT_CURVATURE_DERIVATIVE : 144|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" XXX + SG_ LEAD : 192|7@1+ (1,0) [0|127] "" XXX + SG_ LEAD_SPEED : 200|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ LEAD_DISTANCE : 212|12@1+ (0.05,0) [0|204.75] "m" XXX + +BO_ 438 CAM_0x1b6: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 439 CAM_0x1b7: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 440 CAM_0x1b8: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 441 CAM_0x1b9: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 442 BLINDSPOTS_REAR_CORNERS: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_BLOCKED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_LEFT_TWO : 30|1@0+ (1,0) [0|3] "" XXX + SG_ INDICATOR_RIGHT_TWO : 32|1@1+ (1,0) [0|3] "" XXX + SG_ FL_INDICATOR : 46|6@0+ (1,0) [0|1] "" XXX + SG_ FR_INDICATOR : 54|6@0+ (1,0) [0|63] "" XXX + SG_ RIGHT_BLOCKED : 64|1@0+ (1,0) [0|1] "" XXX + SG_ COLLISION_AVOIDANCE_ACTIVE : 68|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_LEFT_THREE : 128|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_RIGHT_THREE : 130|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_LEFT_FOUR : 138|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_RIGHT_FOUR : 141|1@0+ (1,0) [0|1] "" XXX + +BO_ 463 CRUISE_BUTTONS: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|255] "" XXX + SG_ CRUISE_BUTTONS : 16|3@1+ (1,0) [0|3] "" XXX + SG_ ADAPTIVE_CRUISE_MAIN_BTN : 19|1@1+ (1,0) [0|1] "" XXX + SG_ NORMAL_CRUISE_MAIN_BTN : 21|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BTN : 23|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_PADDLE : 25|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_PADDLE : 27|1@1+ (1,0) [0|1] "" XXX + SG_ SET_ME_1 : 29|1@1+ (1,0) [0|1] "" XXX + SG_ SET_ME_1_ : 40|1@0+ (1,0) [0|1] "" XXX + +BO_ 474 ADRV_0x1da: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_22 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_41 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 480 LFAHDA_CLUSTER: 16 FR_CMR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HDA_OptUsmSta : 24|3@1+ (1,0) [0|0] "" CGW + SG_ LFA_OptUsmSta : 27|3@1+ (1,0) [0|0] "" CGW + SG_ HDA_CntrlModSta : 30|2@1+ (1,0) [0|0] "" CGW + SG_ HDA_InfoPUDis : 32|3@1+ (1,0) [0|0] "" CGW + SG_ HDA_AutoSetSpdSta : 35|2@1+ (1,0) [0|0] "" CGW + SG_ HDA_AutoSetSpdUpdtSta : 37|2@1+ (1,0) [0|0] "" CGW + SG_ HDA_AutoSetSpdVal : 39|8@1+ (1,0) [0|0] "km/h" CGW + SG_ HDA_LFA_SymSta : 47|2@1+ (1,0) [0|0] "" CGW + SG_ HDA_LFA_WrnSnd : 49|2@1+ (1,0) [0|0] "" Dummy + SG_ HDA_InfoPUDis1 : 51|3@1+ (1,0) [0|7] "" CLU,CGW + SG_ HDA_TDMRMDclReq : 54|2@1+ (1,0) [0|3] "" Dummy + +BO_ 485 BLINDSPOTS_FRONT_CORNER_1: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ REVERSING : 24|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_7 : 32|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_8 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_9 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 80|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 88|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 108|2@0+ (1,0) [0|3] "" XXX + +BO_ 490 ADRV_0x1ea: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 25|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_3 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINK_HOLD : 29|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINK_HOLD : 30|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ HDA_MODE2 : 32|3@1+ (1,0) [0|3] "" XXX + SG_ LANE_LEFT : 36|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_6 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ LANE_RIGHT : 41|2@0+ (1,0) [0|3] "" XXX + SG_ LANE_CHANGING : 45|3@0+ (1,0) [0|1] "" XXX + SG_ LF_DETECT_DISTANCE : 46|11@1+ (0.1,0) [0|2047] "" XXX + SG_ LF_DETECT_LATERAL : 70|7@0+ (0.1,0) [0|127] "" XXX + SG_ LF_DETECT : 74|3@0+ (1,0) [0|7] "" XXX + SG_ RF_DETECT_DISTANCE : 75|11@1+ (0.1,0) [0|2047] "" XXX + SG_ RF_DETECT_LATERAL : 94|7@0+ (0.1,0) [0|127] "" XXX + SG_ RF_DETECT : 98|3@0+ (1,0) [0|7] "" XXX + SG_ SET_ME_FF : 120|8@1+ (1,0) [0|255] "" XXX + SG_ LR_DETECT_DISTANCE : 139|8@1+ (0.1,0) [0|511] "m" XXX + SG_ LR_DETECT_LATERAL : 152|6@1+ (0.1,0) [0|63] "" XXX + SG_ LR_DETECT : 162|3@0+ (1,0) [0|1] "" XXX + SG_ RR_DETECT_DISTANCE : 163|8@1+ (0.1,0) [0|511] "m" XXX + SG_ RR_DETECT_LATERAL : 172|6@1+ (0.1,0) [0|63] "" XXX + SG_ RR_DETECT : 186|3@0+ (1,0) [0|1] "" XXX + SG_ AUTOLANECHANGE_MSG : 207|4@0+ (1,0) [0|3] "" XXX + SG_ LANELINE_CURVATURE : 208|4@1+ (1,0) [0|31] "" XXX + SG_ LANELINE_CURVATURE_DIRECTION : 212|1@0+ (1,0) [0|1] "" XXX + SG_ LANELINE_LEFT_POSITION : 239|8@0+ (1,0) [0|255] "" XXX + SG_ LANELINE_RIGHT_POSITION : 247|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 248|1@0+ (1,0) [0|1] "" XXX + +BO_ 506 CLUSTER_SPEED_LIMIT: 32 CAM + SG_ SPEED_LIMIT_1 : 39|7@0+ (1,0) [0|255] "" XXX + SG_ SPEED_LIMIT_2 : 47|7@0+ (1,0) [0|255] "" XXX + SG_ SECONDARY_LIMIT_1 : 79|8@0+ (1,0) [0|127] "" XXX + SG_ SECONDARY_LIMIT_2 : 103|8@0+ (1,0) [0|127] "" XXX + SG_ SPEED_LIMIT_3 : 119|8@0+ (1,0) [0|255] "" XXX + SG_ ARROW_DOWN : 120|1@0+ (1,0) [0|1] "" XXX + SG_ ARROW_UP : 121|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 122|3@1+ (1,0) [0|7] "" XXX + SG_ SPEED_CHANGE_BLINKING : 129|1@1+ (1,0) [0|3] "" XXX + SG_ CHIME_1 : 133|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 143|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 146|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_1 : 147|7@1+ (1,0) [0|127] "" XXX + SG_ SCHOOL_ZONE : 155|1@0+ (1,0) [0|1] "" XXX + SG_ SPEED_LIMIT_4 : 215|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 223|8@0+ (1,0) [0|255] "" XXX + +BO_ 507 CAM_0x1fb: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 512 ADRV_0x200: 8 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_E1 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ TauGapSet : 32|3@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 35|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_1 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ TauGapSet_ : 42|3@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_3 : 47|5@0+ (1,0) [0|31] "" XXX + +BO_ 513 RADAR_0x201: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 528 RADAR_0x210: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 529 RADAR_0x211: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 530 RADAR_0x212: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 531 RADAR_0x213: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 532 RADAR_0x214: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 533 RADAR_0x215: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 534 RADAR_0x216: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 535 RADAR_0x217: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 536 RADAR_0x218: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 537 RADAR_0x219: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 538 RADAR_0x21a: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 539 RADAR_0x21b: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 540 RADAR_0x21c: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 541 RADAR_0x21d: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 542 RADAR_0x21e: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 543 RADAR_0x21f: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 560 HCU_STATUS_230: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HYBRID_POWER_FLOW_MODE : 170|4@1+ (1,0) [0|15] "" XXX + +CM_ BO_ 560 "Hyundai/Kia CAN-FD hybrid power-flow status observed on ECAN at 10 Hz; ACAN 0x230/DLC16 is an unrelated radar frame."; +CM_ SG_ 560 HYBRID_POWER_FLOW_MODE "Reverse-engineered enum; observed values 1, 2, and 6 correspond to the OEM EV indicator being on."; + +BO_ 576 RADAR_0x240: 16 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 593 RADAR_0x251: 16 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 674 CAM_0x2a2: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 675 CAM_0x2a3: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 676 CAM_0x2a4: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_PROB : 31|8@0+ (1,0) [0|255] "" XXX + SG_ RIGHT_LANE_PROB : 39|8@0+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_TYPE : 43|4@0+ (1,0) [0|15] "" XXX + SG_ RIGHT_LANE_TYPE : 47|4@0+ (1,0) [0|15] "" XXX + SG_ LEFT_LANE_COLOR : 48|4@1+ (1,0) [0|15] "" XXX + SG_ RIGHT_LANE_COLOR : 52|4@1+ (1,0) [0|15] "" XXX + SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 67|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 71|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 79|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 80|10@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_6 : 96|10@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_7 : 112|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_8 : 128|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_9 : 144|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_10 : 160|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_11 : 176|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_12 : 192|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_13 : 208|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_14 : 224|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_15 : 240|16@1+ (1,0) [0|65535] "" XXX + +BO_ 687 STEER_TOUCH_2AF: 8 XXX + SG_ CHECKSUM_ : 7|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER_ : 8|8@1+ (1,0) [0|255] "" XXX + SG_ TOUCH_DETECT : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ TOUCH1 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ TOUCH2 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 699 CAM_0x2bb: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 700 CAM_0x2bc: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 701 CAM_0x2bd: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 702 CAM_0x2be: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 736 MANUAL_SPEED_LIMIT_ASSIST: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ MSLA_STATUS : 26|2@1+ (1,0) [0|3] "" XXX + SG_ MSLA_ENABLED : 38|1@1+ (1,0) [0|1] "" XXX + SG_ MAX_SPEED : 55|8@0+ (1,0) [0|255] "" XXX + SG_ MAX_SPEED_COPY : 144|8@1+ (1,0) [0|255] "" XXX + +BO_ 837 ADRV_0x345: 8 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_15 : 24|8@1+ (1,0) [0|255] "" XXX + +BO_ 866 CAM_0x362: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_PROB : 31|8@0+ (1,0) [0|255] "" XXX + SG_ RIGHT_LANE_PROB : 39|8@0+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_TYPE : 43|4@0+ (1,0) [0|15] "" XXX + SG_ RIGHT_LANE_TYPE : 47|4@0+ (1,0) [0|15] "" XXX + SG_ LEFT_LANE_COLOR : 48|4@1+ (1,0) [0|15] "" XXX + SG_ RIGHT_LANE_COLOR : 52|4@1+ (1,0) [0|15] "" XXX + SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 67|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 71|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 79|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 80|10@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_6 : 96|10@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_7 : 112|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_8 : 128|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_9 : 144|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_10 : 160|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_11 : 176|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_12 : 192|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_13 : 208|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_14 : 224|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_15 : 240|16@1+ (1,0) [0|65535] "" XXX + +BO_ 874 BLINDSPOTS_FRONT_CORNER_2: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ RIGHT_BSD : 27|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BSD : 28|1@0+ (1,0) [0|1] "" XXX + +BO_ 928 TPMS: 16 XXX + SG_ PRESSURE_FL : 39|8@0+ (1,0) [0|255] "" XXX + SG_ PRESSURE_FR : 47|8@0+ (1,0) [0|255] "" XXX + SG_ PRESSURE_RL : 55|8@0+ (1,0) [0|255] "" XXX + SG_ PRESSURE_RR : 63|8@0+ (1,0) [0|255] "" XXX + SG_ STATUS_TPMS : 66|3@0+ (1,0) [0|3] "" XXX + SG_ UNIT : 68|2@0+ (1,0) [0|3] "" XXX + +BO_ 961 BLINKER_STALKS: 8 XXX + SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAM_FORWARD : 18|1@0+ (1,0) [0|1] "" XXX + SG_ LIGHT_KNOB_POSITION : 21|2@0+ (1,0) [0|3] "" XXX + SG_ HIGHBEAM_BACKWARD : 26|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 30|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 32|1@0+ (1,0) [0|1] "" XXX + +BO_ 995 BLINKERS_ALT: 16 XXX + SG_ LEFT_BLINKER : 74|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 76|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LAMP_ALT : 89|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LAMP : 90|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LAMP_ALT : 91|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LAMP : 92|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 95|1@0+ (1,0) [0|1] "" XXX + SG_ BLINKER_ACTIVE : 97|1@0+ (1,0) [0|1] "" XXX + +BO_ 1041 DOORS_SEATBELTS: 8 XXX + SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|65535] "" XXX + SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ DRIVER_DOOR : 24|1@1+ (1,0) [0|1] "" XXX + SG_ PASSENGER_DOOR : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PASSENGER_SEATBELT : 36|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_SEATBELT : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_REAR_DOOR : 52|1@0+ (1,0) [0|1] "" XXX + SG_ PASSENGER_REAR_DOOR : 56|1@0+ (1,0) [0|1] "" XXX + +BO_ 1043 BLINKERS: 8 XXX + SG_ LEFT_STALK : 8|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_STALK : 10|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ LEFT_LAMP : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LAMP : 22|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LAMP_ALT : 59|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LAMP_ALT : 61|1@0+ (1,0) [0|1] "" XXX + SG_ USE_ALT_LAMP : 62|1@0+ (1,0) [0|1] "" XXX + +BO_ 1052 LIGHT_SENSOR: 8 XXX + SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ IS_DARK : 19|1@0+ (1,0) [0|1] "" XXX + SG_ LIGHT_LEVEL : 24|10@1+ (1,0) [0|1023] "" XXX + +BO_ 1144 DRIVE_MODE: 8 XXX + SG_ DRIVE_MODE : 0|16@1+ (1,-61611) [0|61611] "" XXX + SG_ DRIVE_MODE2 : 28|3@1+ (1,0) [1|3] "" XXX + +BO_ 1151 HVAC_TOUCH_BUTTONS: 8 XXX + SG_ AUTO_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX + SG_ SYNC_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX + SG_ FR_DEFROST_BUTTON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RR_DEFROST_BUTTON : 22|1@0+ (1,0) [0|1] "" XXX + SG_ FAN_SPEED_UP_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX + SG_ FAN_SPEED_DOWN_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX + SG_ AIR_DIRECTION_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX + SG_ AC_BUTTON : 40|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_ONLY_BUTTON : 44|1@0+ (1,0) [0|1] "" XXX + SG_ RECIRC_BUTTON : 48|1@0+ (1,0) [0|1] "" XXX + SG_ HEAT_BUTTON : 52|1@0+ (1,0) [0|1] "" XXX + +BO_ 1187 HDA_INFO_4A3: 8 XXX + SG_ LinkClass : 0|3@1+ (1,0) [0|7] "" XXX + SG_ Frwinfo : 3|3@1+ (1,0) [0|7] "" XXX + SG_ SpeedUnit : 6|2@1+ (1,0) [0|3] "" XXX + SG_ SPEED_LIMIT : 15|8@0+ (1,0) [0|255] "" XXX + SG_ CountryCode : 16|10@1+ (1,0) [0|1023] "" XXX + SG_ MapSource : 27|3@1+ (1,0) [0|7] "" XXX + SG_ TollExist : 30|2@1+ (1,0) [0|3] "" XXX + SG_ TunnelExist : 38|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_6 : 47|24@0+ (1,0) [0|16777215] "" XXX + +BO_ 1204 NEW_MSG_4B4: 8 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_7 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 39|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1209 NEW_MSG_4B9: 8 XXX + SG_ BYTE_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_3 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_4 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_5 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_6 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_7 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_8 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1214 NEW_MSG_4BE: 8 XXX + SG_ BYTE_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_3 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_4 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_5 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_6 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_7 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_8 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1240 CLUSTER_INFO: 8 XXX + SG_ DISTANCE_UNIT : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 1259 LOCAL_TIME2: 8 XXX + SG_ HOURS : 15|5@0+ (1,0) [0|31] "" XXX + SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX + SG_ SECONDS : 24|6@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_3 : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 1264 LOCAL_TIME: 8 XXX + SG_ HOURS : 12|5@0+ (1,0) [0|31] "" XXX + SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX + SG_ SECONDS : 31|8@0+ (1,0) [0|59] "" XXX + SG_ MONTH : 37|4@0+ (1,0) [0|15] "" XXX + SG_ YEAR : 47|8@0+ (1,0) [0|255] "" XXX + SG_ DATE : 48|5@1+ (1,0) [0|31] "" XXX + +CM_ SG_ 80 HAS_LANE_SAFETY "If 0, hides LKAS 'Lane Safety' menu from vehicle settings"; +CM_ SG_ 96 BRAKE_PRESSURE "User applied brake pedal pressure. Ramps from computer applied pressure on falling edge of cruise. Cruise cancels if !=0"; +CM_ SG_ 101 BRAKE_POSITION "User applied brake pedal position, max is ~700. Signed on some vehicles"; +CM_ SG_ 272 LKAS_ANGLE_CMD "tracks MDPS->STEERING_ANGLE when not engaged, not STEERING_SENSORS->STEERING_ANGLE"; +CM_ SG_ 352 SET_ME_9 "has something to do with AEB settings"; +CM_ SG_ 373 ACCEnable "Likely a copy of CAN's TCS13->ACCEnable"; +CM_ SG_ 373 DriverBraking "Likely derived from BRAKE->BRAKE_POSITION"; +CM_ SG_ 373 DriverBrakingLowSens "Higher threshold version of DriverBraking"; +CM_ SG_ 373 PROBABLY_EQUIP "aeb equip?"; +CM_ SG_ 416 VSetDis "set speed in display units"; +CM_ SG_ 676 LEFT_LANE_LINE "Left lane line confidence"; +CM_ SG_ 676 RIGHT_LANE_LINE "Right lane line confidence"; +CM_ SG_ 736 MAX_SPEED "Display units. Restricts car from driving above this speed unless accelerator pedal is depressed beyond pressure point"; +CM_ SG_ 866 LEFT_LANE_LINE "Left lane line confidence"; +CM_ SG_ 866 RIGHT_LANE_LINE "Right lane line confidence"; +CM_ SG_ 961 COUNTER_ALT "only increments on change"; +CM_ SG_ 1041 COUNTER_ALT "only increments on change"; +CM_ SG_ 1043 COUNTER_ALT "only increments on change"; +CM_ SG_ 1043 USE_ALT_LAMP "likely 1 on cars that use alt lamp signals"; +VAL_ 53 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; +VAL_ 64 GEAR 0 "P" 5 "D" 6 "N" 7 "R" 4 "T"; +VAL_ 69 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; +VAL_ 80 LKA_MODE 1 "warning only" 2 "assist" 6 "off"; +VAL_ 80 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green"; +VAL_ 96 TRACTION_AND_STABILITY_CONTROL 0 "On" 5 "Limited" 1 "Off"; +VAL_ 112 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; +VAL_ 234 LKA_FAULT 0 "ok" 1 "lka fault"; +VAL_ 267 CRUISE_BUTTONS 8 "CRUISE_MAIN" 4 "CANCEL" 1 "RES" 2 "SET" 3 "GAP"; +VAL_ 272 LKA_MODE 1 "warning only" 2 "assist" 6 "off"; +VAL_ 272 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green"; +VAL_ 272 LKAS_ANGLE_ACTIVE 1 "not active" 2 "active"; +VAL_ 298 LKA_MODE 1 "warning only" 2 "assist" 6 "off"; +VAL_ 298 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green"; +VAL_ 304 PARK_BUTTON 1 "Pressed" 2 "Not Pressed"; +VAL_ 304 KNOB_POSITION 1 "R" 2 "N (on R side)" 3 "Centered" 4 "N (on D side)" 5 "D"; +VAL_ 304 GEAR 1 "P" 2 "R" 3 "N" 4 "D"; +VAL_ 352 AEB_SETTING 1 "off" 2 "warning only" 3 "active assist"; +VAL_ 353 FCA_ICON 0 "HIDDEN" 1 "ORANGE" 2 "RED"; +VAL_ 353 FCA_ALT_ICON 0 "HIDDEN" 1 "ORANGE" 3 "RED"; +VAL_ 353 LKA_ICON 0 "HIDDEN" 1 "ORANGE" 3 "GRAY" 4 "GREEN"; +VAL_ 353 HBA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN"; +VAL_ 353 FCA_IMAGE 0 "HIDDEN" 2 "VISIBLE"; +VAL_ 353 BCA_LEFT 0 "HIDDEN" 1 "VISIBLE" 2 "VISIBLE+ICON"; +VAL_ 353 BCA_RIGHT 0 "HIDDEN" 1 "VISIBLE" 2 "VISIBLE+ICON"; +VAL_ 353 LCA_LEFT_ARROW 0 "HIDDEN" 1 "VISIBLE"; +VAL_ 353 LCA_RIGHT_ARROW 0 "HIDDEN" 1 "VISIBLE"; +VAL_ 353 CENTERLINE 0 "HIDDEN" 1 "GREEN"; +VAL_ 353 TARGET 0 "HIDDEN" 1 "BLUE" 3 "WHITE"; +VAL_ 353 LANELINE_LEFT 0 "GRAY" 1 "HIDDEN" 2 "WHITE" 4 "ORANGE" 6 "GREEN"; +VAL_ 353 LANELINE_RIGHT 0 "GRAY" 1 "HIDDEN" 2 "WHITE" 4 "ORANGE" 6 "GREEN"; +VAL_ 353 LANE_HIGHLIGHT 0 "HIDDEN" 1 "GREEN" 2 "WHITE" 3 "BLUE" 4 "ORANGE" 5 "RED"; +VAL_ 353 LANE_LEFT 0 "HIDDEN" 1 "GREEN"; +VAL_ 353 LANE_RIGHT 0 "HIDDEN" 1 "GREEN"; +VAL_ 353 LANE_ZOOM 0 "ZOOM" 1 "HIDDEN"; +VAL_ 353 ALERTS_1 0 "HIDDEN" 1 "WARNING_ONLY_CAR_CENTER" 2 "WARNING_ONLY_CAR_LEFT" 3 "WARNING_ONLY_CAR_RIGHT" 4 "WARNING_ONLY_LEFT" 5 "WARNING_ONLY_RIGHT" 11 "EMERGENCY_BRAKING_CAR_CENTER" 12 "EMERGENCY_BRAKING_CAR_LEFT" 13 "EMERGENCY_BRAKING_CAR_RIGHT" 14 "EMERGENCY_BRAKING_LEFT" 15 "EMERGENCY_BRAKING_RIGHT" 21 "EMERGENCY_STEERING_CAR_LEFT" 22 "EMERGENCY_STEERING_CAR_RIGHT" 23 "EMERGENCY_STEERING_CAR_LEFT_AWAY" 24 "EMERGENCY_STEERING_CAR_RIGHT_AWAY" 25 "EMERGENCY_STEERING_REAR_LEFT" 26 "EMERGENCY_STEERING_REAR_RIGHT" 33 "DRIVE_CAREFULLY"; +VAL_ 353 ALERTS_2 0 "HIDDEN" 1 "KEEP_HANDS_ON_STEERING_WHEEL" 2 "KEEP_HANDS_ON_STEERING_WHEEL_RED" 3 "LANE_FOLLOWING_ASSIST_DEACTIVATED" 4 "HIGHWAY_DRIVING_ASSIST_DEACTIVATED" 5 "CONSIDER_TAKING_A_BREAK" 6 "PRESS_OK_BUTTON_TO_ENABLE_LANE_CHANGE_ASSIST" 7 "COLLISION_RISK_VEHICLE_TAKING_EMERGENCY_CONTROL" 8 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY_VEHICLE_IS_STOPPING" 9 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY" 11 "HIGHWAY_DRIVING_PILOT_SYSTEM_DEACTIVATED_AUDIBLE" 12 "KEEP_YOUR_EYES_ON_THE_ROAD" 13 "HIGHWAY_DRIVING_PILOT_CONDITIONS_NOT_MET_AUDIBLE" 14 "COLLISION_RISK_VEHICLE_TAKING_EMERGENCY_CONTROL" 15 "SET_THE_WIPER_AND_LIGHT_CONTROLS_TO_AUTO" 16 "BE_PREPARED_TO_TAKE_CONTROL_OF_THE_VEHICLE_AT_ANY_TIME" 21 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY_VEHICLE_IS_STOPPING" 10 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY"; +VAL_ 353 ALERTS_3 0 "HIDDEN" 1 "AUTOMATICALLY_ADJUSTING_TO_THE_POSTED_SPEED_LIMIT" 2 "SET_SPEED_CHANGED" 3 "AUTOMATICALLY_ADJUSTING_TO_THE_POSTED_SPEED_LIMIT" 4 "SET_SPEED_CHANGED" 7 "DISTANCE_1" 8 "DISTANCE_2" 9 "DISTANCE_3" 10 "DISTANCE_4" 17 "DRIVE_CAREFULLY" 18 "CHECK_SURROUNDINGS" 19 "CONDITIONS_NOT_MET" 20 "LANES_NOT_DETECTED" 21 "CURVE_TOO_SHARP" 22 "LANE_TOO_NARROW" 23 "ROAD_TYPE_NOT_SUPPORTED" 24 "UNAVAILABLE_WITH_HAZARD_LIGHTS_ON" 25 "VEHICLE_SPEED_IS_TOO_LOW" 26 "KEEP_HANDS_ON_STEERING_WHEEL" 27 "LANE_TYPE_NOT_SUPPORTED" 28 "LANE_ASSIST_CANCELED_STEERING_INPUT_DETECTED"; +VAL_ 353 ALERTS_4 0 "HIDDEN" 1 "TAKE_FOOT_OFF_THE_ACCELERATOR_PEDAL" 2 "TAKE_FOOT_OFF_THE_BRAKE_PEDAL" 3 "UNAVAILABLE_WHILE_HIGHWAY_DRIVING_PILOT_SYSTEM_IS_ACTIVE" 4 "TO_EXIT_HDP_GRASP_THE_STEERING_WHEEL_THEN_PRESS_AND_HOLD_THE_HDP_BUTTON" 5 "ACCELERATOR_PEDAL_OPERATION_LIMITED_FOR_SAFETY" 6 "TURN_OFF_HAZARD_WARNING_LIGHTS_AND_TURN_SIGNAL" 7 "KEEP_THE_DRIVERS_SEAT_IN_A_SAFE_DRIVING_POSITION" 16 "SET_SPEED_CHANGED" 17 "ACTIVATING_WINDSHIELD_DEFOG_TO_MAINTAIN_THE_DRIVERS_VIEW" 18 "SET_THE_WIPER_AND_LIGHT_CONTROLS_TO_AUTO" 19 "VEHICLE_SPEED_REDUCED_FOR_SAFETY_MERGING_LANES_AHEAD" 20 "SPEED_REDUCED_FOR_SAFETY_CONSTRUCTION_ZONE_DETECTED" 21 "VEHICLE_SPEED_LIMITED_SENSOR_DETECTION_RANGE_LIMITED" 22 "PREPARE_TO_TAKE_CONTROL_UNSUPPORTED_ROAD_TYPE_AHEAD" 23 "PREPARE_TO_TAKE_CONTROL_ENTRANCE_AND_EXIT_RAMPS_AHEAD" 24 "PREPARE_TO_TAKE_CONTROL_TOLLGATE_AHEAD" 25 "PREPARE_TO_TAKE_CONTROL_ROAD_EVENT_AHEAD" 26 "CLEARING_PATH_FOR_EMERGENCY_VEHICLE" 27 "VEHICLE_IS_TOO_SLOW_COMPARED_TO_TRAFFIC_FLOW" 28 "AFTER_SUNSET_HDP_IS_AVAILABLE_IN_AN_INSIDE_LANE_BEHIND_A_LEADING_VEHICLE" 29 "VEHICLE_SPEED_LIMITED_MERGING_LANES_AHEAD" 30 "VEHICLE_SPEED_LIMITED_CONSTRUCTION_ZONE_DETECTED" 31 "VEHICLE_SPEED_TEMPORARILY_LIMITED_FOR_SAFETY" 32 "PRESS_AND_HOLD_THE_BUTTON_TO_ACTIVATE_HIGHWAY_DRIVING_PILOT" 40 "HIGHWAY_DRIVING_PILOT_SYSTEM_IS_AVAILABLE" 64 "RESTART_VEHICLE_AFTER_EMERGENCY_STOP" 65 "CONNECTED_SERVICES_UNAVAILABLE" 66 "AVAILABLE_AFTER_VEHICLE_SOFTWARE_IS_UPDATED" 67 "ROAD_TYPE_NOT_SUPPORTED" 68 "ONLY_AVAILABLE_WHILE_DRIVING_ON_HIGHWAY_LANES" 69 "UNAVAILABLE_WHILE_OTHER_WARNINGS_ARE_ACTIVE" 70 "CANNOT_ACTIVATE_AT_ENTRANCE_EXIT_RAMPS" 71 "LANE_UNSUPPORTED" 72 "NOT_AVAILABLE_IN_THIS_COUNTRY" 79 "CHECKING_THE_DETECTION_RANGE_OF_THE_SENSOR" 80 "SHIFT_TO_D" 81 "ENGINE_STOPPED_BY_AUTO_STOP" 82 "INCREASE_DISTANCE_FROM_VEHICLE_AHEAD" 83 "VEHICLE_SPEED_IS_TOO_HIGH" 84 "CENTER_VEHICLE_IN_THE_LANE" 85 "PARKING_ASSIST_IS_ACTIVE" 86 "ESC_ACTIVIATION_REQUIRED" 87 "UNFOLD_SIDE_VIEW_MIRRORS" 88 "UNAVAILABLE_IN_THE_OUTER_LANE_AFTER_SUNSET" 89 "VEHICLE_SPEED_LIMITED_AFTER_SUNSET_FOR_SAFETY" 90 "LEADING_VEHICLE_NOT_DETECTED" 104 "AGGRESSIVE_BRAKING_OR_STEERING_DETECTED" 110 "SENSOR_AUTO_CALIBRATION_IN_PROGRESS_THIS_MAY_TAKE_SEVERAL_MINUTES" 111 "HIGHWAY_DRIVING_PILOT_WILL_BE_AVAILABLE_SHORTLY" 112 "IF_STEERING_WHEEL_IS_USED_HDP_WILL_BE_DEACTIVATED" 120 "IMPACT_DETECTED" 128 "UNSUITABLE_USE_OF_ACCELERATOR_PEDAL_DETECTED" 129 "GEAR_SHIFTER_USE_DETECTED" 130 "UNSUITABLE_BRAKE_PEDAL_USE_DETECTED" 131 "VEHICLE_START_BUTTON_PRESSED" 132 "VEHICLE_HAS_BEEN_STOPPED_FOR_TOO_LONG" 141 "TRAFFIC_CONGESTION_HAS_CLEARED" 142 "ENTRANCE_AND_EXIT_RAMPS_AHEAD" 143 "UNSUPPORTED_LANE_AHEAD" 144 "UNSUPPORTED_ROAD_TYPE_AHEAD" 145 "LANE_DEPARTURE_DETECTED" 146 "MAXIMUM_SPEED_EXCEEDED" 147 "HIGHWAY_DRIVING_PILOT_LIMITED_ABNORMAL_VEHICLE_CONTROLLER_STATUS" 148 "WIPER_LIGHT_CONTROL_SETTINGS_ARE_UNSUITABLE_FOR_USE_WITH_HDP" 149 "WINDSHIELD_DEFOG_SYSTEM_STATUS_IS_UNSUITABLE_FOR_USE_WITH_HDP" 150 "HAZARD_WARNING_LIGHTS_OR_TURN_SIGNAL_OPERATION_DETECTED" 151 "PERFORMING_EVASIVE_STEERING_OBSTACLES_DETECTED_AHEAD" 152 "HIGHWAY_DRIVING_PILOT_LIMITED_SENSOR_DETECTION_RANGE_LIMITED" 160 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 161 "SAFETY_FUNCTION_ACTIVATED" 176 "CAMERA_OBSCURED" 177 "RADAR_BLOCKED" 178 "LIDAR_BLOCKED" 179 "AIRBAG_WARNING_LIGHT_IS_ON" 180 "ATTACHED_TRAILED_DETECTED" 181 "HIGH_OUTSIDE_TEMPERATURE" 182 "LOW_OUTSIDE_TEMPERATURE" 190 "UNAVAILABLE_DUE_TO_THE_ROAD_EVENT_INFORMATION_RECEIVED" 191 "UNAVAILABLE_NEAR_TOLLGATES" 192 "DRIVERS_SEAT_IS_NOT_IN_A_SAFE_DRIVING_POSITION" 193 "VEHICLE_DRIVING_THE_WRONG_WAY_DETECTED_AHEAD" 194 "EMERGENCY_VEHICLE_DETECTED" 195 "OBSTACLE_DETECTED_AHEAD" 196 "SENSOR_BLOCKED_DUE_TO_RAIN_SNOW_OR_ROAD_DEBRIS" 197 "SLIPPERY_ROAD_SURFACE_DETECTED" 198 "CONSTRUCTION_ZONE_DETECTED_AHEAD" 199 "PEDESTRIAN_DETECTED_AHEAD" 200 "UNSUITABLE_DRIVERS_SEAT_POSITION_DETECTED" 201 "FOLDED_SIDE_VIEW_MIRRORS_DETECTED" 208 "VEHICLE_POSITION_NOT_DETECTED" 209 "LANE_NOT_DETECTED" 210 "DRIVER_NOT_DETECTED" 211 "KEEP_YOUR_EYES_ON_THE_ROAD" 212 "LEADING_VEHICLE_REQUIRED_AFTER_SUNSET" 213 "TBD" 240 "LOW_FUEL" 241 "LOW_TIRE_PRESSURE" 242 "DOOR_OPEN" 243 "TRUNK_OPEN" 244 "HOOD_OPEN" 245 "SEAT_BELT_NOT_FASTENED" 246 "PARKING_BRAKE_ACTIVATED" 247 "LOW_EV_BATTERY" 248 "HDP_DEACTIVATION_DELAYED_RISK_OF_COLLISION_DETECTED" 249 "LIFTGATE_OPENED"; +VAL_ 353 ALERTS_5 0 "HIDDEN" 1 "DRIVERS_GRASP_NOT_DETECTED_DRIVING_SPEED_WILL_BE_LIMITED" 2 "WATCH_FOR_SURROUNDING_VEHICLES" 3 "SMART_CRUISE_CONTROL_DEACTIVATED" 4 "SMART_CRUISE_CONTROL_CONDITIONS_NOT_MET" 5 "USE_SWITCH_OR_PEDAL_TO_ACCELERATE" 6 "DRIVER_ASSISTNCE_SYSTEM_LIMITED_TRAILER_ATTACHED" 7 "DRIVER_ASSISTNCE_SYSTEM_LIMITED_DRIVER_FULL_FACE_NOT_VISIBLE" 11 "LEADING_VEHICLE_IS_DRIVING_AWAY" 12 "STOP_VEHICLE_THEN_TRY_AGAIN" 19 "ACTIVATING_HIGHWAY_DRIVING_PILOT_SYSTEM" 20 "CONTINUING_USE_OF_HIGHWAY_DRIVING_PILOT_WILL_RESULT_IN_DEVIATION_FROM_THE_NAVIGATION_ROUTE" 21 "HIGHWAY_DRIVING_PILOT_SYSTEM_DEACTIVATED_SILENT" 22 "HIGHWAY_DRIVING_PILOT_SYSTEM_NOT_APPLIED" 23 "HIGHWAY_DRIVING_PILOT_CONDITIONS_NOT_MET_SILENT"; +VAL_ 353 MUTE 0 "NONE" 1 "MUTED"; +VAL_ 353 SOUNDS_1 0 "NONE" 3 "FAST BEEP" 6 "CONSTANT BEEP"; +VAL_ 353 SOUNDS_2 0 "NONE" 2 "SINGLE CHIME" 3 "CONSTANT CHIME" 6 "FAST BEEP"; +VAL_ 353 SOUNDS_3 0 "NONE" 3 "SOFT CHIME" 5 "SINGLE CHIME"; +VAL_ 353 SOUNDS_4 0 "NONE" 2 "DOUBLE CHIME"; +VAL_ 353 SETSPEED_HUD 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN"; +VAL_ 353 DISTANCE_LEAD 0 "HIDDEN" 1 "GRAY" 2 "WHITE"; +VAL_ 353 DISTANCE_CAR 0 "HIDDEN" 1 "GRAY" 2 "WHITE" 3 "CYAN"; +VAL_ 353 DISTANCE_SPACING 0 "HIDDEN" 1 "BLUE" 3 "WHITE" 5 "CYAN"; +VAL_ 353 SETSPEED 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 6 "CYAN"; +VAL_ 353 HDA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN HDP"; +VAL_ 353 SLA_ICON 0 "HIDDEN" 1 "WHITE UP" 2 "WHITE DOWN" 3 "GREEN UP" 4 "GREEN DOWN"; +VAL_ 353 NAV_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; +VAL_ 353 LFA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN"; +VAL_ 353 LCA_LEFT_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; +VAL_ 353 LCA_RIGHT_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; +VAL_ 353 BACKGROUND 0 "HIDDEN" 1 "BLUE" 3 "ORANGE" 4 "FLASHING ORANGE" 6 "FLASHING RED" 7 "GRAY"; +VAL_ 353 DAW_ICON 0 "HIDDEN" 1 "ORANGE"; +VAL_ 353 CAR_CIRCLE 0 "HIDDEN" 1 "GRAY" 2 "CYAN"; +VAL_ 354 COUNTRY 0 "HIDDEN" 1 "SOUTH_KOREA" 4 "INTL" 5 "JAPAN" 6 "CANADA" 7 "USA" 8 "CHINA" 9 "INTL"; +VAL_ 354 SPEEDLIMIT_FLASH 0 "HIDDEN" 1 "ERROR" 2 "NORMAL" 4 "RED"; +VAL_ 354 SIGNS 0 "HIDDEN" 1 "PEDESTRIAN_CROSSING" 2 "SCHOOL_CROSSWALK" 8 "STOP" 9 "YIELD" 16 "DO_NOT_PASS" 19 "DO_NOT_ENTER" 24 "ROUNDABOUT" 26 "RIGHT_CURVE_AHEAD" 27 "LEFT_CURVE_AHEAD" 28 "SLIGHT_RIGHT_CURVE_AHEAD" 29 "SLIGHT_LEFT_CURVE_AHEAD"; +VAL_ 354 SPEEDLIMIT_WEATHER 0 "HIDDEN" 1 "RAIN" 2 "SNOW" 3 "RAIN+SNOW" 4 "TRAILER"; +VAL_ 354 VIBRATE 0 "NONE" 1 "VIBRATE"; +VAL_ 354 FF_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 FF_DETECT_ALT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "DIM CONE" 4 "ORANGE CONE"; +VAL_ 354 LF_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 RF_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 LR_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 RR_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 FAULT_FSS 0 "HIDDEN" 1 "CHECK_FORWARD_SAFETY_SYSTEM" 2 "FORWARD_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED"; +VAL_ 354 FAULT_FCA 0 "HIDDEN" 1 "CHECK_FORWARD_SIDE_SAFETY_SYSTEM" 2 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED"; +VAL_ 354 FAULT_LSS 0 "HIDDEN" 1 "CHECK_LANE_SAFETY_SYSTEM" 2 "LANE_SAFETY_SYSTEM_DISABLED_CAMERA_OBSCURED"; +VAL_ 354 FAULT_SLA 0 "HIDDEN" 1 "CHECK_SPEED_LIMIT_SYSTEM" 2 "SPEED_LIMIT_SYSTEM_DISABLED_CAMERA_OBSCURED"; +VAL_ 354 FAULT_DAW 0 "HIDDEN" 1 "CHECK_INATTENTIVE_DRIVING_WARNING_SYSTEM" 2 "INATTENTIVE_DRIVING_WARNING_SYSTEM_DISABLED_CAMERA_OBSCURED"; +VAL_ 354 FAULT_HBA 0 "HIDDEN" 1 "CHECK_HIGH_BEAM_ASSIST_SYSTEM"; +VAL_ 354 FAULT_SCC 0 "HIDDEN" 1 "CHECK_SMART_CRUISE_CONTROL_SYSTEM" 2 "SMART_CRUISE_CONTROL_DISABLED_RADAR_BLOCKED"; +VAL_ 354 FAULT_LFA 0 "HIDDEN" 1 "CHECK_LANE_FOLLOWING_SYSTEM_ASSIST_SYSTEM"; +VAL_ 354 FAULT_HDA 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_ASSIST_SYSTEM"; +VAL_ 354 FAULT_LCA 0 "HIDDEN" 1 "CHECK_LANE_CHANGE_ASSIST_FUNCTION" 2 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_RADAR_BLOCKED"; +VAL_ 354 FAULT_HDP 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 2 "HIGHWAY_DRIVING_PILOT_DISABLED_CAMERA_OBSCURED" 3 "HIGHWAY_DRIVING_PILOT_DISABLED_RADAR_BLOCKED" 4 "HIGHWAY_DRIVING_PILOT_DISABLED_LIDAR_BLOCKED"; +VAL_ 354 FAULT_DAS 0 "HIDDEN" 1 "CHECK_DRIVER_ASSISTANCE_SYSTEM" 2 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_RADAR_BLOCKED" 4 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED_AND_RADAR_BLOCKED"; +VAL_ 354 FAULT_ESS 0 "HIDDEN" 1 "CHECK_EMERGENCY_STOPPING_FUNCTION" 2 "EMERGENCY_STOPPING_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "EMERGENCY_STOPPING_FUNCTION_DISABLED_RADAR_BLOCKED"; +VAL_ 362 BLINKER_CONTROL 1 "hazards" 2 "hazards button backlight" 3 "left blinkers" 4 "right blinkers"; +VAL_ 373 SCC_OptTyp 0 "SCC is not equipped" 1 "SCC is equipped" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; +VAL_ 373 SCC_ReqLimSta 0 "No request" 1 "Limited No Limitation" 2 "Acceleration Limited" 3 "Deceleration Limited"; +VAL_ 373 ESC_StdStillVal 0 "No stand still detected" 1 "stand still detected" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 ESC_DclEnblReq 0 "Disable deceleration control" 1 "Enable deceleration control" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 ESC_PrkBrkActvSta 0 "Parking brake is not activated" 1 "Parking brake is activated" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 FCA_EquipSta 0 "FCA is not equipped" 1 "FCA is equipped" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 FCA_AvlblSta 0 "Available" 1 "Temporarily not available" 2 "Permanently not available" 3 "FCA Communication Error"; +VAL_ 416 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; +VAL_ 426 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume"; +VAL_ 463 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume"; +VAL_ 463 RIGHT_PADDLE 0 "Not Pulled" 1 "Pulled"; +VAL_ 463 LEFT_PADDLE 0 "Not Pulled" 1 "Pulled"; +VAL_ 480 HDA_OptUsmSta 0 "Not Applied" 1 "Function Off" 2 "Function On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Fail)"; +VAL_ 480 LFA_OptUsmSta 0 "Not Applied" 1 "Function Off" 2 "Function On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Fail)"; +VAL_ 480 HDA_CntrlModSta 0 "System Deactive (Default)" 1 "System Ready" 2 "System Active" 3 "Reserved"; +VAL_ 480 HDA_InfoPUDis 0 "No pop-up" 1 "system start pop-up" 2 "system auto disengaged pop-up by highway off" 3 "system auto disengaged pop-up" 4 "system Fail pop-up" 5 "Hands-off pop up" 6 "Hands-off pop up w/ sound" 7 "System Automatic off"; +VAL_ 480 HDA_AutoSetSpdSta 0 "Auto Set Speed Off" 1 "Auto Set Speed On" 2 "Reserved" 3 "Error indicator"; +VAL_ 480 HDA_AutoSetSpdUpdtSta 0 "Auto Set Speed Update Off" 1 "Auto Set Speed Update On" 2 "Reserved" 3 "Error indicator"; +VAL_ 480 HDA_LFA_SymSta 0 "Off" 1 "Gray" 2 "Green" 3 "Green blink"; +VAL_ 480 HDA_LFA_WrnSnd 0 "Off" 1 "Additional Warning Sound" 2 "Reserved" 3 "Error indicator"; +VAL_ 480 HDA_InfoPUDis1 0 "No Pop-up" 1 "System Automatic off (LFA)" 2 "System Automatic off (HDA)" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Not Used" 7 "Error Indicator"; +VAL_ 480 HDA_TDMRMDclReq 0 "Not automatically deactivated state of LFA (default)" 1 "Automatically deactivated state of LFA" 2 "Reserved" 3 "Reserved"; +VAL_ 490 HDA_MODE2 1 "Lane change icon gray" 2 "lane green + lane change icon green" 3 "lane green + lane change icon green (both blinking)" 4 "lane white + lane change icon white (both blinking rapidly)" 5 "Lane Change Assist system check warning"; +VAL_ 490 LANE_LEFT 0 "IDLE" 1 "ON_SOURCE" 2 "ON_TARGET"; +VAL_ 490 LANE_RIGHT 0 "IDLE" 1 "ON_SOURCE" 2 "ON_TARGET"; +VAL_ 490 LANE_CHANGING 0 "IDLE" 1 "LEFT_CHECK" 3 "LEFT_CHANGING" 2 "RIGHT_CHECK" 4 "RIGHT_CHANGING"; +VAL_ 490 LF_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide"; +VAL_ 490 RF_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide"; +VAL_ 490 LR_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide"; +VAL_ 490 RR_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide"; +VAL_ 490 AUTOLANECHANGE_MSG 1 "Check surrounding conditions" 2 "Operating conditions not met" 3 "Analyzing driving lane" 4 "Sharp curve ahead" 5 "Current lane is too narrow" 6 "Not an operational section" 7 "Hazard lights are on" 8 "Vehicle speed is too low" 9 "Please hold the steering wheel" 10 "Not an operable lane" 11 "Steering input detected" 12 "Press the OK button to activate lane change assist"; +VAL_ 490 LANELINE_CURVATURE_DIRECTION 0 "LEFT" 1 "RIGHT"; +VAL_ 676 LEFT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue"; +VAL_ 676 RIGHT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue"; +VAL_ 676 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 676 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 736 MSLA_STATUS 0 "disabled" 1 "active" 2 "paused"; +VAL_ 866 LEFT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue"; +VAL_ 866 RIGHT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue"; +VAL_ 866 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 866 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 1041 DRIVER_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1041 PASSENGER_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1041 PASSENGER_SEATBELT 0 "Unlatched" 1 "Latched"; +VAL_ 1041 DRIVER_SEATBELT 0 "Unlatched" 1 "Latched"; +VAL_ 1041 DRIVER_REAR_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1041 PASSENGER_REAR_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1079 TRAILER_CONNECTED 1 "CONNECTED" 0 "DISCONNECTED"; + +VAL_ 1144 DRIVE_MODE2 3 "Set Sport" 1 "Set Normal" 2 "Set Eco"; +VAL_ 1240 DISTANCE_UNIT 1 "Miles" 0 "Kilometers"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.dbc new file mode 100644 index 000000000..a78803a8c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.dbc @@ -0,0 +1,140 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + ENVVAR_TYPE_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_DEF_ "GenMsgCycleTime" 0; + +BO_ 384 CORNER_RADAR_180_OBJECTS_180: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 384 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 384 30; + +BO_ 385 CORNER_RADAR_180_OBJECTS_181: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 385 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 385 30; + +BO_ 386 CORNER_RADAR_180_OBJECTS_182: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 386 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 386 30; + +BO_ 387 CORNER_RADAR_180_OBJECTS_183: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 387 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 387 30; + +BO_ 388 CORNER_RADAR_180_OBJECTS_184: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 388 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 388 30; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.py b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.py new file mode 100644 index 000000000..d7bf6505c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_180.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +import os + + +HEADER = """VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + ENVVAR_TYPE_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +""" + + +def write_object_msg(f, addr): + name = f"CORNER_RADAR_180_OBJECTS_{addr:x}" + f.write(f""" +BO_ {addr} {name}: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +""") + + f.write(f"""CM_ BO_ {addr} "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ {addr} 30; +""") + + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + out_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), dbc_name) + with open(out_path, "w", encoding="ascii") as f: + f.write(HEADER) + f.write('BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;\n') + f.write('BA_DEF_DEF_ "GenMsgCycleTime" 0;\n') + for addr in range(0x180, 0x185): + write_object_msg(f, addr) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.dbc new file mode 100644 index 000000000..f622a7644 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.dbc @@ -0,0 +1,278 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_DEF_ "GenMsgCycleTime" 0; + +BO_ 565 CORNER_RADAR_235_OBJECTS_235: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 565 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 565 30; + +BO_ 566 CORNER_RADAR_235_OBJECTS_236: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 566 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 566 30; + +BO_ 567 CORNER_RADAR_235_OBJECTS_237: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 567 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 567 30; + +BO_ 568 CORNER_RADAR_235_OBJECTS_238: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 568 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 568 30; + +BO_ 569 CORNER_RADAR_235_OBJECTS_239: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 569 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 569 30; + +BO_ 570 CORNER_RADAR_235_OBJECTS_23a: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 570 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 570 30; + +BO_ 571 CORNER_RADAR_235_OBJECTS_23b: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 571 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 571 30; + +BO_ 572 CORNER_RADAR_235_OBJECTS_23c: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 572 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 572 30; + +BO_ 573 CORNER_RADAR_235_OBJECTS_23d: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 573 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 573 30; + +BO_ 574 CORNER_RADAR_235_OBJECTS_23e: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 574 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 574 30; + +BO_ 575 CORNER_RADAR_235_OBJECTS_23f: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 575 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 575 30; + +BO_ 576 CORNER_RADAR_235_OBJECTS_240: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 576 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 576 30; + +BO_ 577 CORNER_RADAR_235_OBJECTS_241: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 577 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 577 30; + +BO_ 578 CORNER_RADAR_235_OBJECTS_242: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 578 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 578 30; + +BO_ 579 CORNER_RADAR_235_OBJECTS_243: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 579 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 579 30; + +BO_ 580 CORNER_RADAR_235_OBJECTS_244: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 580 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 580 30; + +BO_ 581 CORNER_RADAR_235_OBJECTS_245: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 581 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 581 30; + +BO_ 582 CORNER_RADAR_235_OBJECTS_246: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 582 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 582 30; + +BO_ 583 CORNER_RADAR_235_OBJECTS_247: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 583 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 583 30; + +BO_ 584 CORNER_RADAR_235_OBJECTS_248: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 584 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 584 30; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.py b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.py new file mode 100644 index 000000000..6092d0d44 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_235.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +import os + + +HEADER = """VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +""" + + +def write_object_msg(f, addr): + name = f"CORNER_RADAR_235_OBJECTS_{addr:x}" + f.write(f""" +BO_ {addr} {name}: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +""") + + f.write(f"""CM_ BO_ {addr} "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ {addr} 30; +""") + + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + out_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), dbc_name) + with open(out_path, "w", encoding="ascii") as f: + f.write(HEADER) + f.write('BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;\n') + f.write('BA_DEF_DEF_ "GenMsgCycleTime" 0;\n') + for addr in range(0x235, 0x249): + write_object_msg(f, addr) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.dbc new file mode 100644 index 000000000..528b741d8 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.dbc @@ -0,0 +1,614 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_DEF_ "GenMsgCycleTime" 0; + +BO_ 1072 CORNER_RADAR_430_OBJECTS_430: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1072 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1072 30; + +BO_ 1073 CORNER_RADAR_430_OBJECTS_431: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1073 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1073 30; + +BO_ 1074 CORNER_RADAR_430_OBJECTS_432: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1074 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1074 30; + +BO_ 1075 CORNER_RADAR_430_OBJECTS_433: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1075 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1075 30; + +BO_ 1076 CORNER_RADAR_430_OBJECTS_434: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1076 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1076 30; + +BO_ 1077 CORNER_RADAR_430_OBJECTS_435: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1077 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1077 30; + +BO_ 1078 CORNER_RADAR_430_OBJECTS_436: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1078 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1078 30; + +BO_ 1079 CORNER_RADAR_430_OBJECTS_437: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1079 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1079 30; + +BO_ 1088 CORNER_RADAR_430_OBJECTS_440: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1088 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1088 30; + +BO_ 1089 CORNER_RADAR_430_OBJECTS_441: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1089 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1089 30; + +BO_ 1090 CORNER_RADAR_430_OBJECTS_442: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1090 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1090 30; + +BO_ 1091 CORNER_RADAR_430_OBJECTS_443: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1091 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1091 30; + +BO_ 1092 CORNER_RADAR_430_OBJECTS_444: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1092 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1092 30; + +BO_ 1093 CORNER_RADAR_430_OBJECTS_445: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1093 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1093 30; + +BO_ 1094 CORNER_RADAR_430_OBJECTS_446: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1094 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1094 30; + +BO_ 1095 CORNER_RADAR_430_OBJECTS_447: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1095 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1095 30; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.py b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.py new file mode 100644 index 000000000..d663db747 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_corner_radar_430.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +import os + + +HEADER = """VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +""" + + +def write_object_msg(f, addr): + name = f"CORNER_RADAR_430_OBJECTS_{addr:x}" + f.write(f""" +BO_ {addr} {name}: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX +""") + for slot in range(7): + bit = 32 + slot * 32 + prefix = f"SLOT{slot + 1}" + f.write(f""" SG_ {prefix}_DISTANCE_RAW : {bit}|13@1+ (1,0) [0|8191] "" XXX + SG_ {prefix}_META_13_15 : {bit + 13}|3@1+ (1,0) [0|7] "" XXX + SG_ {prefix}_META_BYTE_2 : {bit + 16}|8@1+ (1,0) [0|255] "" XXX + SG_ {prefix}_META_BYTE_3 : {bit + 24}|8@1+ (1,0) [0|255] "" XXX +""") + f.write(f"""CM_ BO_ {addr} "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ {addr} 30; +""") + + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + out_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), dbc_name) + with open(out_path, "w", encoding="ascii") as f: + f.write(HEADER) + f.write('BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000;\n') + f.write('BA_DEF_DEF_ "GenMsgCycleTime" 0;\n') + for addr in range(0x430, 0x438): + write_object_msg(f, addr) + for addr in range(0x440, 0x448): + write_object_msg(f, addr) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.dbc new file mode 100644 index 000000000..46c3032c2 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.dbc @@ -0,0 +1,1178 @@ + +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 528 RADAR_TRACK_210: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 529 RADAR_TRACK_211: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 530 RADAR_TRACK_212: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 531 RADAR_TRACK_213: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 532 RADAR_TRACK_214: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 533 RADAR_TRACK_215: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 534 RADAR_TRACK_216: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 535 RADAR_TRACK_217: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 536 RADAR_TRACK_218: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 537 RADAR_TRACK_219: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 538 RADAR_TRACK_21a: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 539 RADAR_TRACK_21b: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 540 RADAR_TRACK_21c: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 541 RADAR_TRACK_21d: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 542 RADAR_TRACK_21e: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 543 RADAR_TRACK_21f: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 933 RADAR_TRACK_3a5: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 934 RADAR_TRACK_3a6: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 935 RADAR_TRACK_3a7: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 936 RADAR_TRACK_3a8: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 937 RADAR_TRACK_3a9: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 938 RADAR_TRACK_3aa: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 939 RADAR_TRACK_3ab: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 940 RADAR_TRACK_3ac: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 941 RADAR_TRACK_3ad: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 942 RADAR_TRACK_3ae: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 943 RADAR_TRACK_3af: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 944 RADAR_TRACK_3b0: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 945 RADAR_TRACK_3b1: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 946 RADAR_TRACK_3b2: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 947 RADAR_TRACK_3b3: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 948 RADAR_TRACK_3b4: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 949 RADAR_TRACK_3b5: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 950 RADAR_TRACK_3b6: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 951 RADAR_TRACK_3b7: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 952 RADAR_TRACK_3b8: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 953 RADAR_TRACK_3b9: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 954 RADAR_TRACK_3ba: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 955 RADAR_TRACK_3bb: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 956 RADAR_TRACK_3bc: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 957 RADAR_TRACK_3bd: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 958 RADAR_TRACK_3be: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 959 RADAR_TRACK_3bf: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 960 RADAR_TRACK_3c0: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 961 RADAR_TRACK_3c1: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 962 RADAR_TRACK_3c2: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 963 RADAR_TRACK_3c3: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 964 RADAR_TRACK_3c4: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 1024 RADAR_TRACK_400: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1025 RADAR_TRACK_401: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1026 RADAR_TRACK_402: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1027 RADAR_TRACK_403: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1028 RADAR_TRACK_404: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1029 RADAR_TRACK_405: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1030 RADAR_TRACK_406: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1031 RADAR_TRACK_407: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1032 RADAR_TRACK_408: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1033 RADAR_TRACK_409: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1034 RADAR_TRACK_40a: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1035 RADAR_TRACK_40b: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1036 RADAR_TRACK_40c: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1037 RADAR_TRACK_40d: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1038 RADAR_TRACK_40e: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1039 RADAR_TRACK_40f: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1040 RADAR_TRACK_410: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1041 RADAR_TRACK_411: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1042 RADAR_TRACK_412: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1043 RADAR_TRACK_413: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1044 RADAR_TRACK_414: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1045 RADAR_TRACK_415: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1046 RADAR_TRACK_416: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1047 RADAR_TRACK_417: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1048 RADAR_TRACK_418: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1049 RADAR_TRACK_419: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1050 RADAR_TRACK_41a: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1051 RADAR_TRACK_41b: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1052 RADAR_TRACK_41c: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1053 RADAR_TRACK_41d: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.py b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.py new file mode 100644 index 000000000..f3abf2eac --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_canfd_radar.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +import os + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + hyundai_path = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(hyundai_path, dbc_name), "w", encoding='utf-8') as f: + f.write(""" +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + """) + + for a in range(0x210, 0x210 + 16): + f.write(f""" +BO_ {a} RADAR_TRACK_{a:x}: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + """) + for a in range(0x3a5, 0x3a5 + 32): + f.write(f""" +BO_ {a} RADAR_TRACK_{a:x}: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + """) + + # Group 3 radar object list: + # 30 one-object messages at 20 Hz, with an empty distance sentinel of 0x7ff. + for a in range(0x400, 0x400 + 30): + f.write(f""" +BO_ {a} RADAR_TRACK_{a:x}: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + """) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.py b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.py new file mode 100644 index 000000000..d00e5d355 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_denso_front_radar.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +import os + + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + hyundai_path = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(hyundai_path, dbc_name), "w", encoding="utf-8") as f: + f.write(""" +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX +""") + + # EN: The Denso DNMWR006 radar in the 2018-2019 Kia Sorento UM publishes + # eight stable tracked objects at 20 Hz from 0x500 through 0x507. + # Do not decode 0x508+ distance-sorted raw detections as stable tracks. + # KO: 2018-2019 Kia Sorento UMė˜ Denso DNMWR006 ë ˆė´ë”ëŠ” 0x500~0x507ė—ė„œ + # ė•ˆė •ė ė¸ ėļ”렁 ę°ė˛´ 8氜ëĨŧ 20Hz로 ė „ė†Ąí•¨. 0x508 ė´í›„ė˜ ęą°ëĻŦ눜 raw + # detectionė€ ė•ˆė •ė ė¸ 트랙ėœŧ로 디ėŊ”ë”Ší•˜ė§€ ė•ŠėŒ. + for address in range(0x500, 0x508): + f.write(f""" +BO_ {address} RADAR_TRACK_{address:x}: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX +""") diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.py b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.py new file mode 100644 index 000000000..aad417e32 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 +from collections import namedtuple +import os + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + hyundai_path = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(hyundai_path, dbc_name), "w", encoding='utf-8') as f: + f.write(""" +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX +""") + + for a in [0x100, 0x200]: + f.write(f""" +BO_ {a} RADAR_POINTS_METADATA_0x{a:x}: 64 RADAR + SG_ SIGNAL_1 : 0|32@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_2 : 32|32@1+ (1,0) [0|65535] "" XXX + SG_ SIGNAL_3 : 64|4@1+ (1,0) [0|15] "" XXX + SG_ SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX + SG_ RADAR_POINT_COUNT : 72|8@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_6 : 80|7@1+ (0.015625,0) [0|3] "" XXX + SG_ SIGNAL_7 : 87|1@1+ (1,0) [0|1] "" XXX + SG_ SIGNAL_8 : 88|3@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_9 : 91|5@1+ (0.0625,0) [0|31] "" XXX + SG_ SIGNAL_10 : 96|8@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_11 : 104|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_12 : 111|2@1+ (1,0) [0|65535] "" XXX + SG_ SIGNAL_13 : 113|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_14 : 120|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_15 : 127|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_16 : 130|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_18 : 134|1@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_19 : 135|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_20 : 138|8@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_21 : 146|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_22 : 148|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_23 : 149|4@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_24 : 153|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_25 : 154|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_26 : 157|2@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_27 : 158|7@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_28 : 165|7@1+ (0.015625,0) [0|31] "" XXX + SG_ SIGNAL_29 : 172|7@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_30 : 179|7@1+ (0.015625,0) [0|1] "" XXX + SG_ SIGNAL_31 : 186|4@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_32 : 190|14@1+ (0.015625,0) [0|15] "" XXX + SG_ SIGNAL_33 : 204|11@1+ (0.03125,0) [0|8191] "" XXX + SG_ SIGNAL_34 : 215|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_35 : 217|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_36 : 224|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_37 : 230|6@1+ (0.2,0) [0|31] "" XXX + SG_ SIGNAL_38 : 236|6@1+ (0.2,0) [0|7] "" XXX + SG_ SIGNAL_39 : 242|8@1+ (1,-90) [0|255] "" XXX + SG_ SIGNAL_40 : 250|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_41 : 256|8@1+ (0.25,0) [0|255] "" XXX + SG_ SIGNAL_42 : 264|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_43 : 267|12@1+ (0.01,0) [0|31] "" XXX + SG_ SIGNAL_44 : 279|32@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_45 : 311|1@1+ (1,0) [0|1] "" XXX + SG_ SIGNAL_46 : 312|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_47 : 314|32@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_48 : 346|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_49 : 352|7@1+ (0.25,0) [0|127] "" XXX + SG_ SIGNAL_50 : 359|6@1+ (0.03125,0) [0|31] "" XXX + SG_ SIGNAL_51 : 365|10@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_52 : 375|10@1+ (0.125,0) [0|63] "" XXX + SG_ SIGNAL_53 : 385|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_54 : 392|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_55 : 399|8@1+ (0.00390625,0) [0|31] "" XXX + SG_ SIGNAL_56 : 407|10@1+ (0.125,0) [0|63] "" XXX + SG_ SIGNAL_57 : 417|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_58 : 418|1@1+ (1,0) [0|3] "" XXX +""") + + # radar points are sent at 20 Hz in groups of 1 to 13 messages + # each message has 5 radar points for a total of 65 points max + # each radar point is 101 bits so the alignment is not consistent + RadarPointSignal = namedtuple("RadarPointSignal", ["name", "start", "length", "scale", "offset"]) + radar_point_signals = ( + RadarPointSignal("DISTANCE", 7, 14, 1/64, 0), + RadarPointSignal("", 21, 2, 1, 0), + RadarPointSignal("", 23, 8, 1/512, -127/512), + RadarPointSignal("REL_VELOCITY", 31, 13, 1/32, -66), + RadarPointSignal("", 44, 2, 1, 0), + RadarPointSignal("", 46, 2, 1, 0), + RadarPointSignal("AZIMUTH", 48, 12, 1/512, -2047/512), + RadarPointSignal("", 60, 2, 1, 0), + RadarPointSignal("", 62, 1, 1, 0), + RadarPointSignal("", 63, 7, 1, 0), + RadarPointSignal("", 70, 1, 1, 0), + RadarPointSignal("", 71, 6, 1, 0), + RadarPointSignal("", 77, 2, 1, 0), + RadarPointSignal("", 79, 8, 1/512, -127/512), + RadarPointSignal("", 87, 1, 1, 0), + RadarPointSignal("", 88, 2, 1, 0), + RadarPointSignal("", 90, 3, 1, 0), + # last 15 bits are controlled by LAYOUT_ID (seems to always zero, so below is layout 0) + RadarPointSignal("", 93, 6, 1, 0), + RadarPointSignal("", 99, 8, 1, 0), + RadarPointSignal("", 107, 1, 1, 0), + ) + radar_point_bit_count = sum([s.length for s in radar_point_signals]) + + for a in [0x101, 0x201]: + f.write(f""" +BO_ {a} RADAR_POINTS_0x{a:x}: 64 RADAR + SG_ MESSAGE_ID : 0|5@1+ (1,0) [0|31] "" XXX + SG_ LAYOUT_ID : 5|2@1+ (1,0) [0|3] "" XXX +""") + bit_idx = radar_point_signals[0].start + for i in range(5): + signal_idx = 1 + for sig in radar_point_signals: + if sig.name: + sig_name = f"POINT_{i+1}_{sig.name}" + else: + sig_name = f"POINT_{i+1}_SIGNAL_{signal_idx}" + signal_idx += 1 + + sig_start_idx = i * radar_point_bit_count + sig.start + assert bit_idx == sig_start_idx, f"signal overlap or gap!!! {bit_idx} != {sig_start_idx}" + min_val = round(sig.offset, 10) + max_val = round((2**sig.length - 1) * sig.scale + sig.offset, 10) + + f.write(f" SG_ {sig_name} : {sig_start_idx}|{sig.length}@1+ ({sig.scale},{sig.offset}) [{min_val}|{max_val}] \"\" XXX\n") + bit_idx += sig.length + + # checksum is across a group of 0x100/200 and 0x101/201 messages (no checksums inside the other messages) + # ccitt_crc16 = mkCrcFun(0x11021, initCrc=0xffff, xorOut=0x0000, rev=False) + for a in [0x104, 0x204]: + f.write(f""" +BO_ {a} RADAR_POINTS_CHECKSUM_0x{a:x}: 3 RADAR + SG_ CRC16 : 0|16@1+ (1,0) [0|65535] "" XXX +""") diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.py b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.py new file mode 100644 index 000000000..ee8dde64d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +import os + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + hyundai_path = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(hyundai_path, dbc_name), "w", encoding='utf-8') as f: + f.write(""" +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + """) + + # note: 0x501/0x502 seem to be special in 0x5XX range + for a in range(0x500, 0x500 + 32): + f.write(f""" +BO_ {a} RADAR_TRACK_{a:x}: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + """) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc new file mode 100644 index 000000000..b8ecca766 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc @@ -0,0 +1,865 @@ +CM_ "IMPORT _hyundai_common.dbc"; + +BO_ 67 DATC13: 8 XXX + SG_ CF_Datc_AcDisp : 22|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_AqsDisp : 20|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_AutoDefogBlink : 16|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_AutoDisp : 12|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_ChgReqDisp : 8|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_ClmScanDisp : 18|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_DualDisp : 30|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_FrDefLed : 14|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_FrontBlwDisp : 60|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_IntakeDisp : 10|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_IonClean : 6|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_ModDisp : 2|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_OpSts : 25|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_PSModDisp : 56|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_PwrInf : 32|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearAutoDisp : 40|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearBlwDisp : 52|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearChgReqDisp : 46|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearClimateScnDisp : 44|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearManual : 38|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearModDisp : 48|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearOffDisp : 42|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_TempDispUnit : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Mtc_MaxAcDisp : 28|2@1+ (1,0) [0|0] "" XXX + +BO_ 127 CGW5: 8 XXX + SG_ C_DRLLampLhOpenSts : 7|1@1+ (1,0) [0|0] "" XXX + SG_ C_DRLLampRhOpenSts : 8|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontEXTTailLhOpenSts : 15|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontEXTTailRhOpenSts : 16|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontFOGLhOpenSts : 11|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontFOGRhOpenSts : 12|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontTSIGLhOpenSts : 19|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontTSIGRhOpenSts : 20|1@1+ (1,0) [0|0] "" XXX + SG_ C_HLampHighLhOpenSts : 5|1@1+ (1,0) [0|0] "" XXX + SG_ C_HLampHighRhOpenSts : 6|1@1+ (1,0) [0|0] "" XXX + SG_ C_HLampLowLhOpenSts : 3|1@1+ (1,0) [0|0] "" XXX + SG_ C_HLampLowRhOpenSts : 4|1@1+ (1,0) [0|0] "" XXX + SG_ C_HMSLOpenSts : 2|1@1+ (1,0) [0|0] "" XXX + SG_ C_LicensePlateLhOpenSts : 23|1@1+ (1,0) [0|0] "" XXX + SG_ C_LicensePlateRhOpenSts : 24|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearEXTTailLhOpenSts : 13|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearEXTTailRhOpenSts : 14|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearFOGLhOpenSts : 9|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearFOGRhOpenSts : 10|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearTSIGLhOpenSts : 17|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearTSIGRhOpenSts : 18|1@1+ (1,0) [0|0] "" XXX + SG_ C_SBendingLhOpenSts : 21|1@1+ (1,0) [0|0] "" XXX + SG_ C_SBendingRhOpenSts : 22|1@1+ (1,0) [0|0] "" XXX + SG_ C_StopLampLhOpenSts : 0|1@1+ (1,0) [0|0] "" XXX + SG_ C_StopLampRhOpenSts : 1|1@1+ (1,0) [0|0] "" XXX + +BO_ 304 YRS11: 8 XXX + SG_ CF_Yrs_LatAcStat : 36|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Yrs_MCUStat : 40|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Yrs_YrStat : 32|4@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_Crc1 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_LatAc : 16|16@1+ (0.000127465,-4.17677312) [0|0] "" XXX + SG_ CR_Yrs_MsgCnt1 : 48|4@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [0|0] "" XXX + +BO_ 320 YRS12: 8 XXX + SG_ CF_IMU_ResetStat : 20|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Yrs_LongAcStat : 16|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Yrs_Type : 36|4@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_Crc2 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_LongAc : 0|16@1+ (0.000127465,-4.17677312) [0|0] "" XXX + SG_ CR_Yrs_MsgCnt2 : 48|4@1+ (1,0) [0|0] "" XXX + SG_ YRS_Temp : 24|8@1+ (1,-68) [0|0] "" XXX + SG_ YRS_TempStat : 32|4@1+ (1,0) [0|0] "" XXX + +BO_ 339 TCS11: 8 XXX + SG_ ABS_ACT : 10|1@1+ (1,0) [0|0] "" XXX + SG_ ABS_DEF : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ABS_DIAG : 6|1@1+ (1,0) [0|0] "" XXX + SG_ AliveCounter_TCS1 : 52|4@1+ (1,0) [0|0] "" XXX + SG_ BLA_CTL : 49|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_BrkCtl : 48|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_LimoInfo : 4|2@1+ (1,0) [0|0] "" XXX + SG_ CheckSum_TCS1 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ DBC_CTL : 16|1@1+ (1,0) [0|0] "" XXX + SG_ DBC_DEF : 18|1@1+ (1,0) [0|0] "" XXX + SG_ DBC_PAS : 17|1@1+ (1,0) [0|0] "" XXX + SG_ EBD_DEF : 11|1@1+ (1,0) [0|0] "" XXX + SG_ ESP_CTL : 14|1@1+ (1,0) [0|0] "" XXX + SG_ ESP_DEF : 13|1@1+ (1,0) [0|0] "" XXX + SG_ ESP_PAS : 12|1@1+ (1,0) [0|0] "" XXX + SG_ ESS_STAT : 22|2@1+ (1,0) [0|0] "" XXX + SG_ HAC_CTL : 19|1@1+ (1,0) [0|0] "" XXX + SG_ HAC_DEF : 21|1@1+ (1,0) [0|0] "" XXX + SG_ HAC_PAS : 20|1@1+ (1,0) [0|0] "" XXX + SG_ MSR_C_REQ : 1|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_CTL : 9|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_DEF : 8|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_GSC : 3|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_MFRN : 15|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_PAS : 2|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_REQ : 0|1@1+ (1,0) [0|0] "" XXX + SG_ TQI_MSR : 32|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_TCS : 24|8@1+ (0.390625,0) [0|0] "" XXX + +BO_ 356 VSM11: 4 XXX + SG_ CF_Esc_Act : 12|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_AliveCnt : 17|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_Chksum : 24|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_CtrMode : 13|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_Def : 16|1@1+ (1,0) [0|0] "" XXX + SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [0|0] "" XXX + +BO_ 544 ESP12: 8 XXX + SG_ CYL_PRES : 26|12@1+ (0.1,0) [0|0] "" XXX + SG_ CYL_PRESS_DIAG : 39|1@1+ (1,0) [0|0] "" XXX + SG_ CYL_PRES_STAT : 38|1@1+ (1,0) [0|0] "" XXX + SG_ ESP12_AliveCounter : 60|4@1+ (1,0) [0|0] "" XXX + SG_ ESP12_Checksum : 56|4@1+ (1,0) [0|0] "" XXX + SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [0|0] "" XXX + SG_ LAT_ACCEL_DIAG : 12|1@1+ (1,0) [0|0] "" XXX + SG_ LAT_ACCEL_STAT : 11|1@1+ (1,0) [0|0] "" XXX + SG_ LONG_ACCEL : 13|11@1+ (0.01,-10.23) [0|0] "" XXX + SG_ LONG_ACCEL_DIAG : 25|1@1+ (1,0) [0|0] "" XXX + SG_ LONG_ACCEL_STAT : 24|1@1+ (1,0) [0|0] "" XXX + SG_ YAW_RATE : 40|13@1+ (0.01,-40.95) [0|0] "" XXX + SG_ YAW_RATE_DIAG : 54|1@1+ (1,0) [0|0] "" XXX + SG_ YAW_RATE_STAT : 53|1@1+ (1,0) [0|0] "" XXX + +BO_ 593 MDPS12: 8 XXX + SG_ CF_Mdps_Chksum2 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Def : 11|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_FailStat : 15|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_MsgCount2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_SErr : 37|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_ToiActive : 13|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_ToiFlt : 14|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_ToiUnavail : 12|1@1+ (1,0) [0|0] "" XXX + SG_ CR_Mdps_OutTq : 52|12@1+ (0.1,-204.8) [0|0] "" XXX + SG_ CR_Mdps_StrColTq : 0|11@1+ (1,-1024) [0|0] "" XXX + SG_ CR_Mdps_StrTq : 40|12@1+ (0.01,-20.48) [0|0] "" XXX + +BO_ 608 EMS16: 8 XXX + SG_ AliveCounter : 60|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_AclAct : 62|2@1+ (1,0) [0|0] "" XXX + SG_ CRUISE_LAMP_M : 25|1@1+ (1,0) [0|0] "" XXX + SG_ CRUISE_LAMP_S : 26|1@1+ (1,0) [0|0] "" XXX + SG_ Checksum : 56|4@1+ (1,0) [0|0] "" XXX + SG_ ENG_STAT : 28|3@1+ (1,0) [0|0] "" XXX + SG_ GLOW_STAT : 24|1@1+ (1,0) [0|0] "" XXX + SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1,0) [0|0] "" XXX + SG_ SOAK_TIME : 32|8@1+ (1,0) [0|0] "" XXX + SG_ SOAK_TIME_ERROR : 31|1@1+ (1,0) [0|0] "" XXX + SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [0|0] "" XXX + SG_ TQI : 8|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_MAX : 40|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_MIN : 0|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_TARGET : 16|8@1+ (0.390625,0) [0|0] "" XXX + +BO_ 625 LPI11: 8 XXX + SG_ BFS_CYL : 48|8@1+ (1,0) [0|0] "" XXX + SG_ ERR_GAS : 16|8@1+ (1,0) [0|0] "" XXX + SG_ FAC_TI_GAS_COR : 24|16@1+ (3.05e-05,0) [0|0] "" XXX + SG_ FTL_AFU : 40|8@1+ (0.392,0) [0|0] "" XXX + SG_ FUP_LPG_MMV : 0|8@1+ (128,0) [0|0] "" XXX + SG_ LPI_OBD : 12|4@1+ (1,0) [0|0] "" XXX + SG_ LV_BFS_IN_PROGRESS : 9|1@1+ (1,0) [0|0] "" XXX + SG_ LV_CONF_INJECTION_DELAY : 57|1@1+ (1,0) [0|0] "" XXX + SG_ LV_FUEL_TYPE_BOX : 8|1@1+ (1,0) [0|0] "" XXX + SG_ LV_FUP_ENA_THD : 11|1@1+ (1,0) [0|0] "" XXX + SG_ LV_GAS_OK : 10|1@1+ (1,0) [0|0] "" XXX + SG_ LV_LPG_SW_DRIVER_REQ : 58|1@1+ (1,0) [0|0] "" XXX + SG_ LV_PRE_CDN_LEAK : 56|1@1+ (1,0) [0|0] "" XXX + +BO_ 640 EMS13: 8 XXX + SG_ AMP : 56|8@1+ (21.22,0) [0|0] "" XXX + SG_ EOS : 16|8@1+ (1,0) [0|0] "" XXX + SG_ ERR_FUEL : 8|8@1+ (1,0) [0|0] "" XXX + SG_ LV_BFS_CFIRM : 1|1@1+ (1,0) [0|0] "" XXX + SG_ LV_CRASH : 2|1@1+ (1,0) [0|0] "" XXX + SG_ LV_ENG_TURN : 5|1@1+ (1,0) [0|0] "" XXX + SG_ LV_FUEL_TYPE_ECU : 0|1@1+ (1,0) [0|0] "" XXX + SG_ LV_GSL_MAP : 4|1@1+ (1,0) [0|0] "" XXX + SG_ LV_VB_OFF_ACT : 3|1@1+ (1,0) [0|0] "" XXX + SG_ MAF : 40|8@1+ (5.447,0) [0|0] "" XXX + SG_ MAP : 56|8@1+ (0.47058,0) [0|0] "" XXX + SG_ N_32 : 32|8@1+ (32,0) [0|0] "" XXX + SG_ TCO : 24|8@1+ (0.75,-48) [0|0] "" XXX + SG_ TIA : 48|8@1+ (0.75,-48) [0|0] "" XXX + +BO_ 688 SAS11: 5 XXX + SG_ CheckSum : 36|4@1+ (1,0) [0|0] "" XXX + SG_ MsgCount : 32|4@1+ (1,0) [0|0] "" XXX + SG_ SAS_Angle : 0|16@1- (0.1,0) [0|0] "" XXX + SG_ SAS_Speed : 16|8@1+ (4,0) [0|0] "" XXX + SG_ SAS_Stat : 24|8@1+ (1,0) [0|0] "" XXX + +BO_ 790 EMS11: 8 XXX + SG_ ACK_TCS : 2|1@1+ (1,0) [0|0] "" XXX + SG_ F_N_ENG : 1|1@1+ (1,0) [0|0] "" XXX + SG_ F_SUB_TQI : 7|1@1+ (1,0) [0|0] "" XXX + SG_ N : 16|16@1+ (0.25,0) [0|0] "" XXX + SG_ PUC_STAT : 3|1@1+ (1,0) [0|0] "" XXX + SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0) [0|0] "" XXX + SG_ RLY_AC : 6|1@1+ (1,0) [0|0] "" XXX + SG_ SWI_IGK : 0|1@1+ (1,0) [0|0] "" XXX + SG_ TQFR : 40|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI : 32|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_ACOR : 8|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQ_COR_STAT : 4|2@1+ (1,0) [0|0] "" XXX + SG_ VS : 48|8@1+ (1,0) [0|0] "" XXX + +BO_ 809 EMS12: 8 XXX + SG_ ACC_ACT : 30|1@1+ (1,0) [0|0] "" XXX + SG_ ACK_ES : 25|1@1+ (1,0) [0|0] "" XXX + SG_ BRAKE_ACT : 32|2@1+ (1,0) [0|0] "" XXX + SG_ CAN_VERS : 0|6@1+ (1,0) [0|0] "" XXX + SG_ CLU_ACK : 31|1@1+ (1,0) [0|0] "" XXX + SG_ CONF_MIL_FMY : 26|3@1+ (1,0) [0|0] "" XXX + SG_ CONF_TCU : 0|6@1+ (1,0) [0|0] "" XXX + SG_ ENG_CHR : 34|4@1+ (1,0) [0|0] "" XXX + SG_ ENG_VOL : 56|8@1+ (0.1,0) [0|0] "" XXX + SG_ GP_CTL : 38|2@1+ (1,0) [0|0] "" XXX + SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0) [0|0] "" XXX + SG_ MUL_CODE : 6|2@1+ (1,0) [0|0] "" XXX + SG_ OBD_FRF_ACK : 0|6@1+ (1,0) [0|0] "" XXX + SG_ OD_OFF_REQ : 29|1@1+ (1,0) [0|0] "" XXX + SG_ PV_AV_CAN : 48|8@1+ (0.3906,0) [0|0] "" XXX + SG_ TEMP_ENG : 8|8@1+ (0.75,-48) [0|0] "" XXX + SG_ TPS : 40|8@1+ (0.4694836,-15.0234742) [0|0] "" XXX + SG_ TQ_STND : 0|6@1+ (10,0) [0|0] "" XXX + SG_ VB_OFF_ACT : 24|1@1+ (1,0) [0|0] "" XXX + +BO_ 832 LKAS11: 8 XXX + SG_ CF_Lkas_ActToi : 27|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Lkas_Chksum : 0|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS + SG_ CF_Lkas_FcwOpt_USM : 32|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Lkas_LdwsActivemode : 30|2@1+ (1,0) [0|3] "" CLU,IBOX,PSB + SG_ CF_Lkas_LdwsLHWarning : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB + SG_ CF_Lkas_LdwsRHWarning : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB + SG_ CF_Lkas_MsgCount : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,MDPS + SG_ CF_Lkas_ToiFlt : 28|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CR_Lkas_StrToqReq : 16|11@1+ (1.0,-1024.0) [-1024.0|1024.0] "" MDPS + SG_ NEW_SIGNAL_1 : 8|2@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_2 : 14|2@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_3 : 29|1@0+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_4 : 35|1@0+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 854 M_356: 8 XXX + SG_ PAINT1 : 32|1@0+ (1,0) [0|0] "" XXX + SG_ PAINT2 : 34|2@0+ (1,0) [0|0] "" XXX + SG_ PAINT3 : 36|2@0+ (1,0) [0|0] "" XXX + SG_ PAINT4 : 38|1@0+ (1,0) [0|0] "" XXX + +BO_ 867 RADAR_0x363: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ FCA_ESA : 8|2@1+ (1,0) [0|3] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 870 EMS_366: 8 XXX + SG_ N : 8|16@1+ (0.25,0) [0|0] "" XXX + SG_ SWI_IGK : 48|1@0+ (1,0) [0|0] "" XXX + SG_ TQI_1 : 0|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_2 : 24|8@1+ (0.390625,0) [0|0] "" XXX + SG_ VS : 40|8@1+ (1,0) [0|0] "" XXX + +BO_ 871 LVR12: 8 XXX + SG_ CF_Lvr_CruiseSet : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_Gear : 32|4@1+ (1,0) [0|0] "" XXX + +BO_ 872 LVR11: 8 XXX + SG_ CF_Lvr_AC : 48|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_BkeAct : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_CS : 52|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_GearInf : 0|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_NFnStat : 6|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_PNStat : 20|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_PRelStat : 4|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_PosCpl : 12|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_PosInf : 8|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_ShfErrInf : 28|20@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_ShtLkStat : 24|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_UlkButStat : 18|2@1+ (1,0) [0|0] "" XXX + +BO_ 897 MDPS11: 8 XXX + SG_ CF_MDPS_VSM_FUNC : 56|1@0+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_ALTRequest : 23|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_AliveCnt : 40|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Chksum : 48|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_CurrMode : 59|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Flex : 2|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_FlexDisp : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_LKAS_FUNC : 58|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_SPAS_FUNC : 57|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Stat : 7|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Type : 61|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_WLmp : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CR_Mdps_DrvTq : 11|12@1+ (1,-2048) [0|0] "" XXX + SG_ CR_Mdps_StrAng : 24|16@1- (0.1,0) [0|0] "" XXX + +BO_ 902 WHL_SPD11: 8 XXX + SG_ WHL_SPD_AliveCounter_LSB : 14|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_SPD_AliveCounter_MSB : 30|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_SPD_Checksum_LSB : 46|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_SPD_Checksum_MSB : 62|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0) [0|0] "" XXX + SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0) [0|0] "" XXX + SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0) [0|0] "" XXX + SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0) [0|0] "" XXX + +BO_ 903 WHL_PUL11: 6 XXX + SG_ WHL_DIR_FL : 32|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_DIR_FR : 34|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_DIR_RL : 36|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_DIR_RR : 38|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_PUL_Chksum : 40|8@1+ (1,0) [0|0] "" XXX + SG_ WHL_PUL_FL : 0|8@1+ (0.5,0) [0|0] "" XXX + SG_ WHL_PUL_FR : 8|8@1+ (0.5,0) [0|0] "" XXX + SG_ WHL_PUL_RL : 16|8@1+ (0.5,0) [0|0] "" XXX + SG_ WHL_PUL_RR : 24|8@1+ (0.5,0) [0|0] "" XXX + +BO_ 905 SCC14: 8 XXX + SG_ ACC_ObjLatPos : 16|9@1+ (0.1,-20) [-20|31.1] "m" ABS,ESC + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ ObjGap : 51|3@1+ (1,0) [0|255] "" CLU,HUD,ESC + +BO_ 909 FCA11: 8 XXX + SG_ CR_FCA_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ CR_FCA_Alive : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 913 BCM_PO_11: 8 XXX + SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|0] "" XXX + SG_ BCM_Shift_R_MT_SW_Status : 39|2@0+ (1,0) [0|0] "" XXX + SG_ LFA_Pressed : 4|1@0+ (1,0) [0|0] "" XXX + +BO_ 916 TCS13: 8 XXX + SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [0|0] "" XXX + SG_ ACCEnable : 43|2@1+ (1,0) [0|0] "" XXX + SG_ ACC_EQUIP : 52|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_REQ : 54|1@1+ (1,0) [0|0] "" XXX + SG_ AEB_EQUIP : 63|1@1+ (1,0) [0|0] "" XXX + SG_ AliveCounterTCS : 13|3@1+ (1,0) [0|0] "" XXX + SG_ BrakeLight : 11|1@1+ (1,0) [0|0] "" XXX + SG_ CF_DriBkeStat : 60|1@1+ (1,0) [0|0] "" XXX + SG_ CF_VSM_Avail : 57|2@1+ (1,0) [0|0] "" XXX + SG_ CF_VSM_Coded : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_VSM_ConfSwi : 61|2@1+ (1,0) [0|0] "" XXX + SG_ CF_VSM_Handshake : 59|1@1+ (1,0) [0|0] "" XXX + SG_ CheckSum_TCS3 : 48|4@1+ (1,0) [0|0] "" XXX + SG_ DCEnable : 12|1@1+ (1,0) [0|0] "" XXX + SG_ DF_BF_STAT : 19|2@1+ (1,0) [0|0] "" XXX + SG_ DriverBraking : 55|1@1+ (1,0) [0|0] "" XXX + SG_ DriverOverride : 45|2@1+ (1,0) [0|0] "" XXX + SG_ EBA_ACK : 17|1@1+ (1,0) [0|0] "" XXX + SG_ FCA_ACK : 18|1@1+ (1,0) [0|0] "" XXX + SG_ PBRAKE_ACT : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Pre_TCS_CTL : 16|1@1+ (1,0) [0|0] "" XXX + SG_ SCCReqLim : 22|2@1+ (1,0) [0|0] "" XXX + SG_ StandStill : 47|1@1+ (1,0) [0|0] "" XXX + SG_ TQI_SCC : 24|8@1+ (0.390625,0) [0|0] "" XXX + SG_ aBasis : 0|11@1+ (0.01,-10.23) [0|0] "" XXX + +BO_ 920 RADAR_0x398: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 921 RADAR_0x399: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 922 RADAR_0x39a: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 923 RADAR_0x39b: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 924 RADAR_0x39c: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 1040 CGW_USM1: 8 XXX + SG_ CF_Gway_ADrLRValue : 8|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ADrURValue : 11|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ATTurnRValue : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AutoLightRValue : 35|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrLockSoundRValue : 24|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_EscortHLRValue : 4|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HAnBRValue : 27|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HfreeTrunkRValue : 32|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_MoodLpRValue : 30|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_OTTurnRValue : 21|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PSMRValue : 18|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PTGMRValue : 2|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PasSpkrLvRValue : 40|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RearWiperRValue : 38|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SCMRValue : 14|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TTUnlockRValue : 6|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WlightRValue : 16|2@1+ (1,0) [0|0] "" XXX + +BO_ 1042 ICM_412h: 8 XXX + SG_ PopupMessageOutput_1Level : 48|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_2Level : 49|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_3Level : 50|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_4Level : 51|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_5Level : 52|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_6Level : 53|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_7Level : 54|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_8Level : 55|1@0+ (1,0) [0|0] "" XXX + SG_ TRIP_A_DT_Display_clock : 22|7@0+ (1,0) [0|0] "" XXX + SG_ TRIP_A_DT_Display_minute : 29|6@0+ (1,0) [0|0] "" XXX + SG_ TRIP_B_DT_Display_clock : 38|7@0+ (1,0) [0|0] "" XXX + SG_ TRIP_B_DT_Display_minute : 45|6@0+ (1,0) [0|0] "" XXX + SG_ T_Outside_input : 0|9@0+ (0.01,0) [0|0] "" XXX + SG_ WarningSoundOutput_1Group : 5|1@0+ (1,0) [0|0] "" XXX + SG_ WarningSoundOutput_2Group : 6|1@0+ (1,0) [0|0] "" XXX + SG_ WarningSoundOutput_3Group : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 1056 SCC11: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ AliveCounterACC : 12|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU + SG_ JerkLowerLimit : 50|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ JerkUpperLimit : 43|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ ObjValid : 59|1@1+ (1,0) [0|1] "" CLU,ESC,TCU + SG_ aReqRaw : 27|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ aReqValue : 16|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + +BO_ 1057 SCC12: 8 XXX + SG_ ACCMode : 28|2@1+ (1,0) [0|3] "" CLU,HUD,LDWS_LKAS,ESC + SG_ ACCMode_Inactive : 30|1@1+ (1,0) [0|1] "" CLU,HUD,LDWS_LKAS,ESC + SG_ ACC_ObjDist : 16|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC + SG_ CR_VSM_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CR_VSM_Alive : 12|4@1+ (1,0) [0|15] "" ESC,PSB + SG_ MainMode_ACC : 27|1@1+ (1,0) [0|1] "" CLU,EMS,ESC + SG_ SCCInfoDisplay : 32|3@1+ (1,0) [0|7] "" CLU,ESC + SG_ TauGapSet : 37|3@1+ (1,0) [0|7] "" CLU,ESC,TCU + SG_ VSetDis : 41|8@1+ (1,0) [0|255] "km/h or MPH" CLU,ESC,TCU + SG_ StopReq : 49|1@1+ (1,0) [0|1] "" EPB,ESC + +BO_ 1064 _4WD11: 8 XXX + SG_ AUTO_ACT : 43|1@1+ (1,0) [0|0] "" XXX + SG_ CLU_DUTY : 16|8@1+ (1,0) [0|0] "" XXX + SG_ LOCK_ACT : 44|1@1+ (1,0) [0|0] "" XXX + SG_ LOW_ACT : 42|1@1+ (1,0) [0|0] "" XXX + SG_ R_TIRE : 24|8@1+ (1,200) [0|0] "" XXX + SG_ _2H_ACT : 40|1@1+ (1,0) [0|0] "" XXX + SG_ _4H_ACT : 41|1@1+ (1,0) [0|0] "" XXX + SG_ _4WD_ERR : 8|8@1+ (1,0) [0|0] "" XXX + SG_ _4WD_SUPPORT : 2|2@1+ (1,0) [0|0] "" XXX + SG_ _4WD_SW : 32|8@1+ (1,0) [0|0] "" XXX + SG_ _4WD_TQC_CUR : 48|16@1+ (1,0) [0|0] "" XXX + SG_ _4WD_TYPE : 0|2@1+ (1,0) [0|0] "" XXX + +BO_ 1078 PAS11: 4 XXX + SG_ CF_Gway_PASCheckSound : 22|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayFCTR : 8|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayFLH : 0|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayFRH : 3|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayRCTR : 11|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayRLH : 16|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayRRH : 19|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDistance : 28|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASFsound : 14|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASOption : 26|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASRsound : 6|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASSystemOn : 24|2@1+ (1,0) [0|0] "" XXX + +BO_ 1082 RADAR_0x43a: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 1136 P_STS: 8 XXX + SG_ Checksum : 62|2@1+ (1,0) [0|0] "" XXX + SG_ Counter : 58|4@1+ (1,0) [0|0] "" XXX + SG_ HCU1_STS : 6|2@1+ (1,0) [0|0] "" XXX + SG_ HCU5_STS : 8|2@1+ (1,0) [0|0] "" XXX + +BO_ 1151 ESP11: 6 XXX + SG_ AVH_STAT : 0|2@1+ (1,0) [0|0] "" XXX + SG_ ECD_ACT : 6|1@1+ (1,0) [0|0] "" XXX + SG_ LDM_STAT : 2|1@1+ (1,0) [0|0] "" XXX + SG_ REQ_EPB_ACT : 3|2@1+ (1,0) [0|0] "" XXX + SG_ REQ_EPB_STAT : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ROL_CNT_ESP : 8|8@1+ (1,0) [0|0] "" XXX + SG_ _4WD_CLU_LIM : 32|8@1+ (0.390625,0) [0|0] "" XXX + SG_ _4WD_LIM_MODE : 42|1@1+ (1,0) [0|0] "" XXX + SG_ _4WD_LIM_REQ : 7|1@1+ (1,0) [0|0] "" XXX + SG_ _4WD_OPEN : 40|2@1+ (1,0) [0|0] "" XXX + SG_ _4WD_TQC_LIM : 16|16@1+ (1,0) [0|0] "" XXX + +BO_ 1157 LFAHDA_MFC: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_2 : 16|1@0+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_3 : 17|1@0+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_4 : 18|1@0+ (1,0) [0|0] "" XXX + SG_ HDA_Icon_State : 19|2@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_5 : 21|3@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_6 : 24|1@0+ (1,0) [0|0] "" XXX + SG_ LFA_Icon_State : 25|2@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_7 : 27|37@1+ (1,0) [0|0] "" XXX + +BO_ 1162 BCA11: 8 XXX + SG_ AliveCounter : 21|4@1+ (1,0) [0|0] "" XXX + SG_ CF_BCA_State : 16|3@1+ (1,0) [0|0] "" XXX + SG_ CF_BCA_Warning : 19|2@1+ (1,0) [0|0] "" XXX + SG_ Check_Sum : 56|8@1+ (1,0) [0|0] "" XXX + SG_ RCCA_Brake_Command : 29|1@1+ (1,0) [0|0] "" XXX + +BO_ 1168 EPB11: 7 XXX + SG_ EPB_ALARM : 6|2@1+ (1,0) [0|0] "" XXX + SG_ EPB_CLU : 8|8@1+ (1,0) [0|0] "" XXX + SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0) [0|0] "" XXX + SG_ EPB_DBF_REQ : 26|1@1+ (1,0) [0|0] "" XXX + SG_ EPB_DBF_STAT : 24|1@1+ (1,0) [0|0] "" XXX + SG_ EPB_FAIL : 29|3@1+ (1,0) [0|0] "" XXX + SG_ EPB_FORCE : 32|12@1+ (1,-1000) [0|0] "" XXX + SG_ EPB_FRC_ERR : 22|2@1+ (1,0) [0|0] "" XXX + SG_ EPB_F_LAMP : 4|2@1+ (1,0) [0|0] "" XXX + SG_ EPB_I_LAMP : 0|4@1+ (1,0) [0|0] "" XXX + SG_ EPB_RBL : 18|1@1+ (1,0) [0|0] "" XXX + SG_ EPB_STATUS : 19|3@1+ (1,0) [0|0] "" XXX + SG_ EPB_SWITCH : 16|2@1+ (1,0) [0|0] "" XXX + SG_ ESP_ACK : 25|1@1+ (1,0) [0|0] "" XXX + +BO_ 1170 EMS19: 8 XXX + SG_ BAT_LAMP_STAT : 42|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_BrkReq : 0|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_DecelReq : 8|12@1+ (0.001,-4.094) [0|0] "" XXX + SG_ CF_Ems_DnShftReq : 1|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41) [0|0] "" XXX + SG_ CF_Ems_OPSFail : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_RepModChk : 5|2@1+ (1,0) [0|0] "" XXX + SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0) [0|0] "" XXX + SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40) [0|0] "" XXX + SG_ DPF_LAMP_STAT : 40|2@1+ (1,0) [0|0] "" XXX + +BO_ 1173 YRS13: 8 XXX + SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|0] "" XXX + +BO_ 1186 FRT_RADAR11: 2 XXX + SG_ BYTE0 : 0|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE1 : 8|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 1265 CLU11: 4 XXX + SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AmpInfo : 25|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_CluInfo : 24|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_CruiseSwMain : 3|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_CruiseSwState : 0|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_DetentOut : 18|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_ParityBit1 : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_RheostatLevel : 19|5@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_SPEED_UNIT : 17|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_SldMainSW : 4|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0) [0|0] "" XXX + SG_ CF_Clu_VanzDecimal : 6|2@1+ (0.125,0) [0|0] "" XXX + +BO_ 1280 ACU14: 1 XXX + SG_ CF_SBR_Ind : 4|2@1+ (1,0) [0|0] "" XXX + SG_ CF_SWL_Ind : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CF_TTL_Ind : 2|2@1+ (1,0) [0|0] "" XXX + +BO_ 1287 TCS15: 4 XXX + SG_ ABS_W_LAMP : 0|1@1+ (1,0) [0|0] "" XXX + SG_ AVH_ALARM : 27|2@1+ (1,0) [0|0] "" XXX + SG_ AVH_CLU : 16|8@1+ (1,0) [0|0] "" XXX + SG_ AVH_I_LAMP : 24|2@1+ (1,0) [0|0] "" XXX + SG_ AVH_LAMP : 29|3@1+ (1,0) [0|0] "" XXX + SG_ DBC_F_LAMP : 6|2@1+ (1,0) [0|0] "" XXX + SG_ DBC_W_LAMP : 5|1@1+ (1,0) [0|0] "" XXX + SG_ EBD_W_LAMP : 26|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_Off_Step : 8|2@1+ (1,0) [0|0] "" XXX + SG_ TCS_LAMP : 3|2@1+ (1,0) [0|0] "" XXX + SG_ TCS_OFF_LAMP : 1|2@1+ (1,0) [0|0] "" XXX + +BO_ 1292 CLU13: 8 XXX + SG_ CF_Clu_ActiveEcoSW : 39|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AliveCnt2 : 60|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AltLStatus : 59|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AvgFCI : 6|10@1+ (0.1,0) [0|0] "" XXX + SG_ CF_Clu_AvgFCU : 3|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AvsmCur : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_DTE : 24|10@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_DrivingModeSwi : 16|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_FlexSteerSW : 23|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_FuelDispLvl : 18|5@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_IsaMainSW : 43|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_LdwsLkasSW : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_LowfuelWarn : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_RefDetMod : 2|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_SWL_Stat : 36|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_TripUnit : 34|2@1+ (1,0) [0|0] "" XXX + +BO_ 1312 CGW3: 8 XXX + SG_ CF_Hoodsw_memory : 22|2@1+ (1,0) [0|0] "" XXX + SG_ CR_Photosensor_LH : 0|8@1+ (78.125,0) [0|0] "" XXX + SG_ CR_Photosensor_RH : 10|8@1+ (78.125,0) [0|0] "" XXX + SG_ C_MirOutTempSns : 24|8@1+ (0.5,-40.5) [0|0] "" XXX + +BO_ 1322 CLU15: 8 XXX + SG_ CF_Clu_ClusterSound : 38|1@1- (1,0) [0|0] "" XXX + SG_ CF_Clu_Gear : 9|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudBrightDnSW : 24|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudBrightUpSW : 22|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudFontColorSet : 20|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudFontSizeSet : 31|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudHeightDnSW : 28|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudHeightUpSW : 26|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudInfoSet : 13|7@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudSet : 30|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_LanguageInfo : 33|5@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_VehicleSpeed : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_VehicleSpeed2 : 48|8@1+ (1,0) [0|0] "" XXX + +BO_ 1342 LKAS12: 8 XXX + SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|0] "" XXX + SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_Daw_USM : 37|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1,0) [0|0] "" XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + +BO_ 1345 CGW1: 8 XXX + SG_ CF_Gway_ALightStat : 37|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AstDrSw : 35|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AstSeatBeltSw : 14|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DefoggerRly : 36|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DriveTypeOption : 43|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvDrSw : 8|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvKeyLockSw : 6|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvKeyUnlockSw : 7|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvSeatBeltSw : 10|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_Frt_Fog_Act : 40|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HBAControlMode : 52|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HLpHighSw : 53|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HazardSw : 33|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HeadLampHigh : 32|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HeadLampLow : 31|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HoodSw : 17|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IGNSw : 0|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_Ign1 : 58|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_Ign2 : 59|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_InhibitRMT : 54|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_LightSwState : 38|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ParkBrakeSw : 60|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PassingSW : 51|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PassiveAccessLock : 45|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PassiveAccessUnlock : 48|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RKECmd : 3|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RainSnsOption : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RainSnsState : 28|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RrSunRoofOpenState : 50|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SMKOption : 16|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_StarterRlyState : 44|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TSigLHSw : 42|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TSigRHSw : 41|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TrunkTgSw : 12|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TurnSigLh : 19|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TurnSigRh : 62|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperAutoSw : 27|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperHighSw : 26|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperIntSw : 24|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperIntT : 21|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperLowSw : 25|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperMistSw : 47|1@1+ (1,0) [0|0] "" XXX + SG_ C_SunRoofOpenState : 57|1@1+ (1,0) [0|0] "" XXX + +BO_ 1348 Navi_HU: 8 XXX + SG_ SpeedLim_Nav_Clu : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1363 CGW2: 8 XXX + SG_ CF_Gway_AutoLightOption : 54|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AutoLightValue : 16|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AvTail : 20|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_BCMRKEID : 41|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_BrakeFluidSw : 17|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CLUSwEnter : 15|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CLUSwGroup : 13|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CLUSwGuiCtrl : 10|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CLUSwMode : 14|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CountryCfg : 26|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DDMDiagState : 1|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DeactivationWarn : 45|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvSeatBeltInd : 18|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ESCLFailWarn : 35|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ESCLNotLockedWarn : 36|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ESCLNotUnlockWarn : 37|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ExtTailAct : 22|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_GwayDiagState : 0|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HLLowLHFail : 33|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HLLowRHFail : 34|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IDoutWarn : 38|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IPMDiagState : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ImmoLp : 40|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IntTailAct : 25|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_KeyBATDischargeWarn : 46|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_KeyoutLp : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_LDMFail : 6|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PSMDiagState : 3|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RLDrSw : 24|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RRDrSw : 23|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RearFogAct : 21|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SCMDiagState : 2|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SJBDeliveryMode : 55|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SJBDiagState : 4|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SMKDispWarn : 57|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SMKFobID : 48|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SMKRKECmd : 51|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SSBWarn : 47|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_VehicleNotPWarn : 44|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperParkPosition : 32|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WngBuz : 61|3@1+ (1,0) [0|0] "" XXX + +BO_ 1369 CGW4: 8 XXX + SG_ CF_Gway_AstSeatBeltInd : 38|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AstWdwStat : 11|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvSeatBeltInd : 36|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvWdwStat : 8|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IMSBuzzer : 15|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_MemoryEnable : 12|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_MemoryP1Cmd : 0|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_MemoryP2Cmd : 1|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBACKStop : 14|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBACKStopCmd : 13|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBackP1Cmd : 2|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBackP2Cmd : 3|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBackStopCmd : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RCSeatBeltInd : 40|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RLSeatBeltInd : 42|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RLWdwState : 9|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RRSeatBeltInd : 44|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RRWdwState : 10|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RrWiperHighSw : 46|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RrWiperLowSw : 47|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_StaticBendLhAct : 6|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_StaticBendRhAct : 7|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_StrgWhlHeatedState : 4|1@1+ (1,0) [0|0] "" XXX + +BO_ 1370 HU_AVM_PE_00: 8 XXX + SG_ HU_AVM_Status : 0|2@1+ (1,0) [0|0] "" XXX + +BO_ 1371 AVM_HU_PE_00: 8 XXX + SG_ AVM_Display_Message : 8|8@1+ (1,0) [0|0] "" XXX + SG_ AVM_FrontBtn_Type : 28|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_HU_FrontViewPointOpt : 36|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_HU_FrontView_Option : 44|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_HU_RearView_Option : 40|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_Option : 32|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_ParkingAssist_BtnSts : 5|3@1+ (1,0) [0|0] "" XXX + SG_ AVM_ParkingAssist_Step : 24|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_Popup_Msg : 16|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_Ready : 20|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_Version : 48|16@1+ (1,0) [0|0] "" XXX + SG_ AVM_View : 0|5@1+ (1,0) [0|0] "" XXX + +BO_ 1407 HU_MON_PE_01: 8 XXX + SG_ HU_Type : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 1419 LCA11: 8 XXX + SG_ CF_Lca_IndLeft : 29|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Lca_IndRight : 37|1@1+ (1,0) [0|0] "" XXX + +BO_ 1427 TPMS11: 6 XXX + SG_ POS_FL_W_LAMP : 4|1@1+ (1,0) [0|0] "" XXX + SG_ POS_FR_W_LAMP : 5|1@1+ (1,0) [0|0] "" XXX + SG_ POS_RL_W_LAMP : 6|1@1+ (1,0) [0|0] "" XXX + SG_ POS_RR_W_LAMP : 7|1@1+ (1,0) [0|0] "" XXX + SG_ PRESSURE_FL : 16|8@1+ (1,0) [0|0] "" XXX + SG_ PRESSURE_FR : 24|8@1+ (1,0) [0|0] "" XXX + SG_ PRESSURE_RL : 32|8@1+ (1,0) [0|0] "" XXX + SG_ PRESSURE_RR : 40|8@1+ (1,0) [0|0] "" XXX + SG_ STATUS_TPMS : 8|3@1+ (1,0) [0|0] "" XXX + SG_ TPMS_W_LAMP : 0|2@1+ (1,0) [0|0] "" XXX + SG_ TREAD_W_LAMP : 2|2@1+ (1,0) [0|0] "" XXX + SG_ UNIT : 11|2@1+ (1,0) [0|0] "" XXX + +BO_ 1456 CLU12: 4 XXX + SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0) [0|0] "" XXX + + +CM_ SG_ 1348 SpeedLim_Nav_Clu "Speed limit displayed on Nav, Cluster and HUD"; + +VAL_ 871 CF_Lvr_Gear 12 "T" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P"; +VAL_ 909 CF_VSM_Warn 2 "FCW" 3 "AEB"; +VAL_ 916 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; +VAL_ 1057 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; +VAL_ 1157 HDA_Icon_State 0 "no_hda" 1 "white_hda" 2 "green_hda"; +VAL_ 1157 LFA_SysWarning 0 "no_message" 1 "switching_to_hda" 2 "switching_to_scc" 3 "lfa_error" 4 "check_hda" 5 "keep_hands_on_wheel_orange" 6 "keep_hands_on_wheel_red"; +VAL_ 1157 LFA_Icon_State 0 "no_wheel" 1 "white_wheel" 2 "green_wheel" 3 "green_wheel_blink"; +VAL_ 1157 HDA_SysWarning 0 "no_message" 1 "driving_convenience_systems_cancelled" 2 "highway_drive_assist_system_cancelled"; +VAL_ 1322 CF_Clu_Gear 1 "P" 2 "R" 4 "N" 8 "D"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/nissan/_nissan_common.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/nissan/_nissan_common.dbc new file mode 100644 index 000000000..46a65a7b7 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/nissan/_nissan_common.dbc @@ -0,0 +1,117 @@ +BO_ 2 STEER_ANGLE_SENSOR: 5 XXX + SG_ STEER_ANGLE_RATE : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X07 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ STEER_ANGLE : 0|16@1- (-0.1,0) [0|65535] "" XXX + SG_ COUNTER : 32|4@1+ (1,0) [0|15] "" XXX + +BO_ 361 LKAS: 8 XXX + SG_ MAX_TORQUE : 39|8@0+ (0.01,0) [0|255] "Nm" XXX + SG_ SET_0x80 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ LKA_ACTIVE : 52|1@0+ (1,0) [0|15] "" XXX + SG_ SET_0x80_2 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [-1311.43|1310] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 389 STEER_TORQUE_SENSOR: 8 XXX + SG_ LKAS_ACTIVE : 37|1@0+ (1,0) [0|3] "" XXX + SG_ STEER_TORQUE_LKAS : 47|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_ANGLE : 23|18@0+ (-0.01,1310) [0|262143] "" XXX + SG_ STEER_TORQUE_DRIVER : 7|12@0+ (-0.01,20.47) [0|4095] "Nm" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|127] "" XXX + +BO_ 645 WHEEL_SPEEDS_REAR: 8 XXX + SG_ WHEEL_SPEED_RR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX + SG_ WHEEL_SPEED_RL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX + +BO_ 689 PROPILOT_HUD: 8 XXX + SG_ LARGE_WARNING_FLASHING : 9|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING1 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING2 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_YELLOW_FLASH : 12|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_YELLOW_FLASH : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_CAR : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_CAR_ERROR : 15|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_ERROR : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_ERROR_FLASHING : 17|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_GREEN : 24|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_GREEN : 25|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING3 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ERROR_FLASHING : 29|1@0+ (1,0) [0|1] "" XXX + SG_ SAFETY_SHIELD_ACTIVE : 44|1@0+ (1,0) [0|1] "" XXX + SG_ LARGE_STEERING_WHEEL_ICON : 61|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_GREEN_FLASH : 62|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_GREEN_FLASH : 63|1@0+ (1,0) [0|1] "" XXX + SG_ FOLLOW_DISTANCE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ AUDIBLE_TONE : 47|3@0+ (1,0) [0|8] "" XXX + SG_ SPEED_SET_ICON : 7|2@0+ (1,0) [0|3] "" XXX + SG_ SMALL_STEERING_WHEEL_ICON : 42|3@0+ (1,0) [0|7] "" XXX + SG_ SET_SPEED : 39|8@0+ (1,0) [0|255] "" XXX + SG_ unknown02 : 1|2@0+ (1,0) [0|3] "" XXX + SG_ unknown05 : 5|2@0+ (1,0) [0|3] "" XXX + SG_ unknown08 : 8|7@0+ (1,0) [0|63] "" XXX + SG_ unknown26 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ unknown28 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ unknown31 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ unknown43 : 43|1@0+ (1,0) [0|1] "" XXX + SG_ unknown55 : 55|8@0+ (1,0) [0|63] "" XXX + SG_ unknown59 : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 451 PROPILOT_BRAKE: 8 XXX + SG_ BRAKE_PRESSURE : 5|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_ACTIVE : 47|1@0+ (1,0) [0|1] "" XXX + +BO_ 783 CRUISE_STATE: 3 XXX + SG_ CRUISE_ENABLED : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 1228 PROPILOT_HUD_INFO_MSG: 8 XXX + SG_ NA_HIGH_ACCEL_TEMP : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_NA_HIGH_CABIN_TEMP : 8|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_MALFUNCTION : 11|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_MALFUNCTION : 12|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_MALFUNCTION : 13|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_NA_CLEAN_REAR_CAMERA : 14|1@0+ (1,0) [0|1] "" XXX + SG_ NA_POOR_ROAD_CONDITIONS : 16|1@0+ (1,0) [0|1] "" XXX + SG_ CURRENTLY_UNAVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ SAFETY_SHIELD_OFF : 18|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_COLLISION_NA_FRONT_RADAR_OBSTRUCTION : 20|1@0+ (1,0) [0|1] "" XXX + SG_ PEDAL_MISSAPPLICATION_SYSTEM_ACTIVATED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_NA_RADAR_OBSTRUCTION : 25|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_DO_NOT_ENTER : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_SYSTEM_OFF : 34|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_MALFUNCTION : 35|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_COLLISION_MALFUNCTION : 36|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_MALFUNCTION2 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_MALFUNCTION2 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_MALFUNCTION2 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_MSGS : 42|3@0+ (1,0) [0|7] "" XXX + SG_ BOTTOM_MSG : 45|3@0+ (1,0) [0|7] "" XXX + SG_ HANDS_ON_WHEEL_WARNING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_STEP_ON_BRAKE_NOW : 51|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_FRONT_CAMERA_OBSTRUCTED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_HIGH_CABIN_TEMP : 53|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_PROPILOT_MALFUNCTION : 54|1@0+ (1,0) [0|3] "" XXX + SG_ ACC_UNAVAILABLE_HIGH_CABIN_TEMP : 62|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_NA_FRONT_CAMERA_IMPARED : 63|1@0+ (1,0) [0|1] "" XXX + SG_ unknown07 : 7|7@0+ (1,0) [0|127] "" XXX + SG_ unknown10 : 10|2@0+ (1,0) [0|3] "" XXX + SG_ unknown15 : 15|1@0+ (1,0) [0|1] "" XXX + SG_ unknown23 : 23|3@0+ (1,0) [0|7] "" XXX + SG_ unknown19 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ unknown31 : 31|6@0+ (1,0) [0|63] "" XXX + SG_ unknown32 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ unknown46 : 46|1@0+ (1,0) [0|1] "" XXX + SG_ unknown50 : 50|3@0+ (1,0) [0|7] "" XXX + SG_ unknown55 : 55|1@0+ (1,0) [0|1] "" XXX + SG_ unknown61 : 61|6@0+ (1,0) [0|63] "" XXX + +BO_ 1227 LKAS_SETTINGS: 8 XXX + SG_ LKAS_ENABLED : 51|1@0+ (1,0) [0|1] "" XXX + +VAL_ 1228 PROPILOT_NA_MSGS 0 "NO_MSG" 1 "NA_FRONT_CAMERA_IMPARED" 2 "STEERING_ASSIST_ON_STANDBY" 3 "NA_PARKING_ASSIST_ENABLED" 4 "STEER_ASSIST_CURRENTLY_NA" 5 "NA_BAD_WEATHER" 6 "NA_PARK_BRAKE_ON" 7 "NA_SEATBELT_NOT_FASTENED" ; +VAL_ 1228 BOTTOM_MSG 0 "OK_STEER_ASSIST_SETTINGS" 1 "NO_MSG" 2 "PRESS_SET_TO_SET_SPEED" 3 "PRESS_RES_SET_TO_CHANGE_SPEED" 4 "PRESS_RES_TO_RESTART" 5 "NO_MSG" 6 "CRUISE_NOT_AVAIL" 7 "NO_MSG" ; +VAL_ 689 FOLLOW_DISTANCE 0 "NO_FOLLOW_DISTANCE" 1 "FOLLOW_DISTANCE_1" 2 "FOLLOW_DISTANCE_2" 3 "FOLLOW_DISTANCE_3" ; +VAL_ 689 AUDIBLE_TONE 0 "NO_TONE" 1 "CONT" 2 "FAST_BEEP_CONT" 3 "TRIPLE_FAST_BEEP_CONT" 4 "SLOW_BEEP_CONT" 5 "QUAD_SLOW_BEEP_CONT" 6 "SINGLE_BEEP_ONCE" 7 "DOUBLE_BEEP_ONCE" ; +VAL_ 689 SMALL_STEERING_WHEEL_ICON 0 "NO_ICON" 1 "GRAY_ICON" 2 "GRAY_ICON_FLASHING" 3 "GREEN_ICON" 4 "GREEN_ICON_FLASHING" 5 "RED_ICON" 6 "RED_ICON_FLASHING" 7 "YELLOW_ICON" ; +VAL_ 689 LARGE_STEERING_WHEEL_ICON 0 "NO_STEERINGWHEEL" 1 "GRAY_STEERINGWHEEL" 2 "GREEN_STEERINGWHEEL" 3 "GREEN_STEERINGWHEEL_FLASHING" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/nissan/nissan_leaf_2018.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/nissan/nissan_leaf_2018.dbc new file mode 100644 index 000000000..3376c3784 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/nissan/nissan_leaf_2018.dbc @@ -0,0 +1,62 @@ +CM_ "IMPORT _nissan_common.dbc"; + +BO_ 42 SEATBELT: 8 XXX + SG_ SEATBELT_DRIVER_LATCHED : 27|1@1+ (1,0) [0|3] "" XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 26|1@0+ (1,0) [0|1] "" XXX + SG_ unknown2 : 31|4@0+ (1,0) [0|15] "" XXX + SG_ unknown3 : 24|2@1+ (1,0) [0|3] "" XXX + SG_ unknown1 : 7|24@0+ (1,0) [0|16777215] "" XXX + SG_ unknown4 : 39|16@0+ (1,0) [0|65535] "" XXX + +BO_ 460 BRAKE_PEDAL: 8 XXX + SG_ BRAKE_PEDAL : 7|8@0+ (1,0) [0|256] "" XXX + +BO_ 569 CRUISE_THROTTLE: 8 XXX + SG_ GAS_PEDAL_INVERTED : 15|8@0+ (1,0) [0|255] "" XXX + SG_ GAS_PEDAL : 7|8@0+ (1,0) [0|255] "" XXX + SG_ CRUISE_AVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ unsure1 : 23|6@0+ (1,0) [0|63] "" XXX + SG_ unsure2 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ unsure3 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ NO_BUTTON_PRESSED : 29|1@0+ (1,0) [0|1] "" XXX + SG_ RES_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX + SG_ SET_BUTTON : 27|1@0+ (1,0) [0|1] "" XXX + SG_ FOLLOW_DISTANCE_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX + SG_ CANCEL_BUTTON : 25|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX + SG_ USER_BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 32|2@1+ (1,0) [0|3] "" XXX + SG_ unsure5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ unsure6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ unsure7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 640 CANCEL_MSG: 8 XXX + SG_ CANCEL_SEATBELT : 1|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 7|6@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 15|56@0+ (1,0) [0|72057594037927940] "" XXX + +BO_ 644 WHEEL_SPEEDS_FRONT: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX + +BO_ 852 ESP: 8 XXX + SG_ ESP_DISABLED : 38|1@0+ (1,0) [0|1] "" XXX + +BO_ 853 HUD_SETTINGS: 8 XXX + SG_ SPEED_MPH : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 856 LIGHTS: 8 XXX + SG_ LEFT_BLINKER : 17|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 18|1@0+ (1,0) [0|1] "" XXX + +BO_ 1057 GEARBOX: 3 XXX + SG_ GEAR_SHIFTER : 5|3@0+ (1,0) [0|255] "" XXX + +BO_ 1549 DOORS_LIGHTS: 8 XXX + SG_ DOOR_OPEN_FL : 3|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 5|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 6|1@0+ (1,0) [0|1] "" XXX + +VAL_ 1057 GEAR_SHIFTER 7 "B" 4 "D" 3 "N" 2 "R" 1 "P" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/nissan/nissan_x_trail_2017.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/nissan/nissan_x_trail_2017.dbc new file mode 100644 index 000000000..46e6f9c99 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/nissan/nissan_x_trail_2017.dbc @@ -0,0 +1,69 @@ +CM_ "IMPORT _nissan_common.dbc"; + +BO_ 348 GAS_PEDAL: 8 XXX + SG_ GAS_PEDAL_RAW : 26|11@0+ (1,0) [0|2047] "" XXX + SG_ GAS_PEDAL : 47|10@0+ (1,0) [0|1023] "" XXX + +BO_ 438 PRO_PILOT: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X03 : 33|2@0+ (1,0) [0|15] "" XXX + SG_ CRUISE_ACTIVATED : 38|1@0+ (1,0) [0|3] "" XXX + SG_ CRUISE_ON : 36|1@0+ (1,0) [0|255] "" XXX + SG_ STEER_STATUS : 51|1@0+ (1,0) [0|3] "" XXX + +BO_ 523 CRUISE_THROTTLE: 6 XXX + SG_ PROPILOT_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX + SG_ CANCEL_BUTTON : 9|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL_INVERTED : 37|10@0+ (1,0) [0|1023] "" XXX + SG_ SET_BUTTON : 11|1@0+ (1,0) [0|1] "" XXX + SG_ RES_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX + SG_ FOLLOW_DISTANCE_BUTTON : 10|1@0+ (1,0) [0|1] "" XXX + SG_ NO_BUTTON_PRESSED : 13|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL : 31|10@0+ (1,0) [0|255] "" XXX + SG_ USER_BRAKE_PRESSED : 21|1@0+ (1,0) [0|1] "" XXX + SG_ USER_BRAKE_PRESSED_INVERTED : 22|1@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PRESSED_INVERTED : 20|1@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 17|2@0+ (1,0) [0|3] "" XXX + SG_ unsure1 : 7|10@0+ (1,0) [0|1023] "" XXX + SG_ unsure2 : 43|4@0+ (1,0) [0|1] "" XXX + SG_ unsure3 : 19|2@0+ (1,0) [0|3] "" XXX + +BO_ 665 ESP: 8 XXX + SG_ ESP_DISABLED : 24|1@0+ (1,0) [0|1] "" XXX + +BO_ 666 WHEEL_SPEEDS_FRONT: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX + +BO_ 768 STEER_TORQUE_SENSOR2: 2 XXX + SG_ STEERING_TORQUE : 6|7@0+ (1,0) [0|127] "" XXX + SG_ STEERING_PRESSED : 15|1@0+ (-1,1) [0|7] "" XXX + +BO_ 1055 GEARBOX: 2 XXX + SG_ SPORTS_MODE : 13|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 5|3@0+ (1,0) [0|255] "" XXX + +BO_ 1107 LIGHTS: 8 XXX + SG_ RIGHT_BLINKER : 12|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 11|1@0+ (1,0) [0|1] "" XXX + SG_ HEADLIGHTS : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 1108 DOORS_LIGHTS: 8 XXX + SG_ DOOR_CLOSED_RR : 40|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 41|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_RL : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_FL : 44|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_FR : 46|1@0+ (1,0) [0|3] "" XXX + SG_ DOOR_OPEN_FR : 47|1@0+ (1,0) [0|3] "" XXX + SG_ BOOT_OPEN : 55|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_LIGHT : 54|1@0+ (1,0) [0|1] "" XXX + SG_ USER_BRAKE_PRESSED : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1273 HUD: 7 XXX + SG_ SEATBELT_DRIVER_LATCHED : 25|1@0+ (1,0) [0|1] "" XXX + SG_ SPEED_MPH : 5|1@0+ (1,0) [0|1] "" XXX + +VAL_ 1055 GEAR_SHIFTER 6 "L" 4 "D" 3 "N" 2 "R" 1 "P" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/rivian/.gitignore b/artifacts/package_runtime/iqdbc/dbc/generator/rivian/.gitignore new file mode 100644 index 000000000..c6687b3e5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/rivian/.gitignore @@ -0,0 +1 @@ +rivian_mando_front_radar.dbc \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.py b/artifacts/package_runtime/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.py new file mode 100644 index 000000000..d9a89752f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/rivian/rivian_mando_front_radar.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +import os + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + rivian_path = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(rivian_path, dbc_name), "w", encoding='utf-8') as f: + f.write(""" +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + """) + + for a in range(0x500, 0x500 + 32): + f.write(f""" +BO_ {a} RADAR_TRACK_{a:x}: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + """) + + for a in range(0x500, 0x500 + 32): + f.write(f""" +VAL_ {a} STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ {a} MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + """) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/subaru/_subaru_global.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/_subaru_global.dbc new file mode 100644 index 000000000..67f63216a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/_subaru_global.dbc @@ -0,0 +1,305 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX X + + +BO_ 2 Steering: 8 XXX + SG_ Steering_Angle : 7|16@0- (0.1,0) [0|65535] "" XXX + SG_ COUNTER : 25|3@1+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 32|8@1+ (1,0) [0|255] "" XXX + +BO_ 64 Throttle: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Engine_RPM : 16|13@1+ (1,0) [0|8191] "" XXX + SG_ Neutral : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Cruise : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Combo : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Signal3 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ Off_Accel : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 316 Brake_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|46@1+ (1,0) [0|1] "" XXX + SG_ ES_Brake : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 59|3@1+ (1,0) [0|1] "" XXX + SG_ Brake : 62|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 326 Cruise_Buttons: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|30@1+ (1,0) [0|1073741823] "" XXX + SG_ Main : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Set : 43|1@1+ (1,0) [0|1] "" XXX + SG_ Resume : 44|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 45|19@1+ (1,0) [0|524287] "" XXX + +BO_ 315 G_Sensor: 8 XXX + SG_ Lateral : 48|8@1- (-0.1,0) [0|255] "m/s2" XXX + SG_ Longitudinal : 56|8@1- (-0.1,0) [0|255] "m/s2" XXX + +BO_ 314 Wheel_Speeds: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ FR : 12|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ RR : 25|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ FL : 51|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ RL : 38|13@1+ (0.057,0) [0|255] "kph" XXX + +BO_ 280 Steering_Torque_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steer_Torque_Output : 13|11@1- (-10,0) [0|255] "" XXX + SG_ Signal1 : 24|8@1+ (1,0) [0|511] "" XXX + SG_ Steer_Torque_Sensor : 45|11@1- (-1,0) [0|255] "" XXX + SG_ Steering_Active : 61|1@0+ (1,0) [0|1] "" XXX + SG_ Steering_Disabled : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 281 Steering_Torque: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steer_Error_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 16|11@1- (-1,0) [-1000|1000] "" XXX + SG_ Steer_Error_2 : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Warning : 29|1@1+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 32|16@1- (-0.0217,0) [-600|600] "" X + SG_ Steer_Torque_Output : 48|11@1- (-10,0) [-1000|1000] "" XXX + +BO_ 282 Steering_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 24|17@1- (-0.01,0) [0|1] "" XXX + +BO_ 312 Brake_Pressure_L_R: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steering_Angle : 16|16@1- (-0.1,0) [-3276.8|3276.7] "" XXX + SG_ Brake_1 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_2 : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 313 Brake_Pedal: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Speed : 16|12@1+ (0.05625,0) [0|255] "kph" XXX + SG_ Signal2 : 28|6@1+ (1,0) [0|63] "" XXX + SG_ Brake_Lights : 34|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal : 36|12@1+ (1,0) [0|4095] "" XXX + SG_ Signal4 : 48|16@1+ (1,0) [0|65535] "" XXX + +BO_ 372 Engine_Stop_Start: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX + SG_ STOP_START_STATE : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 290 ES_LKAS: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_Output : 16|13@1- (-1,0) [-8191|8191] "" XXX + SG_ LKAS_Request : 29|1@0+ (1,0) [0|1] "" XXX + +BO_ 292 ES_LKAS_ANGLE: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Request : 12|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Output : 40|17@1- (-0.01,0) [0|1] "deg" XXX + SG_ SET_3 : 60|2@1+ (1,0) [0|1] "" XXX + +BO_ 544 ES_Brake: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Pressure : 16|16@1+ (1,0) [0|65535] "" XXX + SG_ AEB_Status : 32|4@1+ (1,0) [0|15] "" XXX + SG_ Cruise_Brake_Lights : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Fault : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 38|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 39|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 40|24@1+ (1,0) [0|16777215] "" XXX + +BO_ 577 Cruise_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Clutch_Depressed : 47|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_Set_Speed : 51|12@0+ (1,0) [0|120] "" XXX + SG_ Cruise_On : 54|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 55|1@1+ (1,0) [0|1] "" XXX + +BO_ 552 BSD_RCTA: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ R_ADJACENT : 48|1@1+ (1,0) [0|1] "" XXX + SG_ L_ADJACENT : 49|1@1+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 58|1@1+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 59|1@1+ (1,0) [0|1] "" XXX + +BO_ 912 Dashlights: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ UNITS : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ICY_ROAD : 32|2@1+ (1,0) [0|3] "" XXX + SG_ SEATBELT_FL : 48|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 50|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 51|1@1+ (1,0) [0|1] "" XXX + SG_ STOP_START : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 940 BodyInfo: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ DOOR_OPEN_FL : 32|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 33|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 34|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 35|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_TRUNK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE : 54|1@1+ (1,0) [0|1] "" XXX + SG_ DASH_BTN_LIGHTS : 56|1@0+ (1,0) [0|1] "" XXX + SG_ LOWBEAM : 57|1@1+ (1,0) [0|1] "" XXX + SG_ HIGHBEAM : 58|1@1+ (1,0) [0|1] "" XXX + SG_ FOG_LIGHTS : 60|1@1+ (1,0) [0|1] "" XXX + SG_ WIPERS : 62|1@0+ (1,0) [0|1] "" XXX + +BO_ 801 ES_DashStatus: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ PCB_Off : 12|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Off : 13|1@1+ (1,0) [0|1] "" XXX + SG_ Signal1 : 14|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_State_Msg : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_State_Msg : 20|3@1+ (1,0) [0|7] "" XXX + SG_ Signal2 : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Soft_Disable : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Status_Msg : 25|2@1+ (1,0) [0|3] "" XXX + SG_ Signal3 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Distance : 28|3@1+ (1,0) [0|7] "" XXX + SG_ Signal4 : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Conventional_Cruise : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Signal5 : 33|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_Disengaged_Dash : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Signal6 : 37|3@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Set_Speed : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Fault : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Display_Own_Car : 50|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Lights : 51|1@1+ (1,0) [0|1] "" XXX + SG_ Car_Follow : 52|1@1+ (1,0) [0|1] "" XXX + SG_ Signal7 : 53|3@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX + SG_ Cruise_State : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 802 ES_LKAS_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_Alert_Msg : 12|3@1+ (1,0) [0|7] "" XXX + SG_ Signal1 : 15|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_ACTIVE : 17|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Dash_State : 18|2@1+ (1,0) [0|2] "" XXX + SG_ Signal2 : 20|3@1+ (1,0) [0|7] "" XXX + SG_ Backward_Speed_Limit_Menu : 23|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Enable : 24|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Light_Blink : 25|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Right_Line_Enable : 26|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Right_Line_Light_Blink : 27|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Visible : 28|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_Right_Line_Visible : 30|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_Alert : 32|5@1+ (1,0) [0|31] "" XXX + SG_ Signal3 : 37|27@1+ (1,0) [0|1] "" XXX + +BO_ 803 ES_Infotainment: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_Blue_Lines : 15|4@0+ (1,0) [0|15] "" XXX + SG_ Signal1 : 19|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_State_Infotainment : 22|3@0+ (1,0) [0|7] "" XXX + SG_ Signal2 : 24|1@0+ (1,0) [0|1] "" XXX + +BO_ 722 AC_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ AC_Mode : 37|3@1+ (1,0) [0|1] "" XXX + SG_ AC_ON : 24|2@1+ (1,0) [0|1] "" XXX + +BO_ 1677 Dash_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Units : 29|3@1+ (1,0) [0|7] "" XXX + +BO_ 554 ES_HighBeamAssist: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ HBA_Available : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 805 ES_STATIC_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_3 : 23|2@0+ (1,0) [0|3] "" XXX + +BO_ 289 ES_STATIC_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_3 : 15|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_Fault : 18|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 64 Throttle_Combo "Throttle Cruise + Pedal"; +CM_ SG_ 313 Brake_Lights "Driver or Cruise Brake on"; +CM_ SG_ 544 Cruise_Brake_Lights "1 = switch on brake lights"; +CM_ SG_ 544 Brake_Pressure "Winds down after cruise disabled. Also can be non-zero when likely preparing for AEB"; +CM_ SG_ 544 Signal3 "Usually goes to 2 if AEB_Status is 4"; +CM_ SG_ 544 AEB_Status "Occasionally is 4 instead of 8 while Brake_Pressure is non-zero, unsure why"; +CM_ SG_ 801 Cruise_Activated_Dash "Falls during user gas or standstill. This is likely only a UI signal to the dash to show if ACC is actually actuating"; +CM_ SG_ 801 PCB_Off "Pre-Collision Braking off"; +CM_ SG_ 801 Brake_Lights "Driver or Cruise brake on"; +CM_ SG_ 801 Cruise_State "0 = Normal, 1 = Hold+User Brake, 2 = Ready, 3 = Hold"; +CM_ SG_ 801 Far_Distance "1=0-5m, 2=5-10m, 3=10-15m, 4=15-20m, 5=20-25m, 6=25-30m, 7=30-35m, 8=35-40m, 9=40-45m, 10=45-50m, 11=50-55m, 12=55-60m, 13=60-65m, 14=65-70m, 15=75m+"; +CM_ SG_ 801 LKAS_State_Msg "1 = LKAS_Off_Sharp_Curve, 2 = Keep_Hands_On_Steering_wheel_disabled, 3 = LKAS_Off, 4 = LKAS_Off_Too_Slow, 5 = LKAS_Off_Too_Fast"; +CM_ SG_ 801 Cruise_State_Msg "1 = Cruise_Off_Steep_Slope, 2 = Cruise_lvl1_eco, 3 = Cruise_lvl2_comfort, 4 = Cruise_off_empty_reason, 5 = Cruise_off, 6 = Cruise_Unable_to_set, 7 = Cruise_Unable_to_set_brakes_applied, 8 = Eyesight_not_ready, 9 = Cruise_lvl3_standard, 10 = Cruise_lvl4_dynamic, 11 = Cruise_Unable_to_set_steep_slope"; +CM_ SG_ 801 Cruise_Soft_Disable "Eyesight soft disable (eg direct sunlight)"; +CM_ SG_ 801 Cruise_Status_Msg "1 = Disabled_Bad_Visibility, 2 = Disabled_Check_Manual"; +CM_ SG_ 802 LKAS_ACTIVE "Turns on the full LKAS dash display"; +CM_ SG_ 802 LKAS_Alert_Msg "1 = Keep_Hands_On_Wheel, 6 = Pre_Collision_Braking, 7 = Keep_Hands_On_Wheel_Off"; +CM_ SG_ 802 LKAS_Alert "1 = FCW_Cont_Beep, 2 = FCW_Repeated_Beep, 3 = Throttle_Management_Activated_Warning, 4 = Throttle_Management_Activated_Alert, 5 = Pre_Collision_Activated_Alert, 8 = Traffic_Light_Ahead, 9 = Apply_Brake_to_Hold Position, 11 = LDW_Right, 12 = LDW_Left, 13 = Stay_Alert, 14 = Lead_Vehicle_Start_Alert, 18 = Keep_Hands_On_Steering_Alert, 24 = Audio_Beep, 25 = Audio_Lead_Car_Change, 26 = Audio_ACC_Disengaged, 27 = Audio_LKAS_disabled, 28 = Audio_Ding_Ding, 30 = Audio_Repeated_Beep"; +CM_ SG_ 802 LKAS_Left_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange"; +CM_ SG_ 802 LKAS_Dash_State "0 = Off, 1 = Ready, 2 = Active"; +CM_ SG_ 802 LKAS_Right_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange"; +CM_ SG_ 912 UNITS "0 = Metric, 1 = Imperial"; +CM_ SG_ 912 ICY_ROAD "1 = DASHLIGHT ON, 2 = WARNING, 3 = OFF"; +VAL_ 544 AEB_Status 12 "AEB related" 8 "AEB actuation" 4 "AEB related" 0 "No AEB actuation"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/subaru/_subaru_preglobal_2015.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/_subaru_preglobal_2015.dbc new file mode 100644 index 000000000..cbeff8096 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/_subaru_preglobal_2015.dbc @@ -0,0 +1,246 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX X + + +BO_ 2 Steering: 8 XXX + SG_ Steering_Angle : 7|16@0- (0.1,0) [-500|500] "degree" XXX + SG_ COUNTER : 27|3@0+ (1,0) [0|7] "" XXX + SG_ Checksum : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 208 G_Sensor: 8 XXX + SG_ Steering_Angle : 0|16@1- (-0.1,0) [-500|500] "" XXX + SG_ Lateral : 16|16@1- (-0.0035,1) [-255|255] "" XXX + SG_ Longitudinal : 48|16@1- (-0.00035,0) [-255|255] "" XXX + +BO_ 209 Brake_Pedal: 4 XXX + SG_ Speed : 0|16@1+ (0.05625,0) [0|255] "KPH" XXX + SG_ Brake_Pedal : 16|8@1+ (1,0) [0|255] "" XXX + SG_ Signal1 : 24|8@1+ (1,0) [0|255] "" XXX + +BO_ 210 Brake_2: 8 XXX + SG_ Brake_Light : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Related : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Brake : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Left_Brake : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 211 Brake_Type: 8 XXX + SG_ Brake_Light : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Speed_Counter : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_Cruise_On : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal_On : 46|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 48|8@1+ (1,0) [0|255] "" XXX + +BO_ 212 Wheel_Speeds: 8 XXX + SG_ FL : 0|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ FR : 16|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ RL : 32|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ RR : 48|16@1+ (0.0592,0) [0|255] "KPH" XXX + +BO_ 320 Throttle: 8 XXX + SG_ Throttle_Pedal : 0|8@1+ (0.392157,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|2@1+ (1,0) [0|7] "" XXX + SG_ Not_Full_Throttle : 14|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Engine_RPM : 16|14@1+ (1,0) [0|32767] "" XXX + SG_ Off_Throttle : 30|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Throttle_Cruise : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Combo : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Body : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Off_Throttle_2 : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Signal4 : 57|7@1+ (1,0) [0|127] "" XXX + +BO_ 321 Engine: 8 XXX + SG_ Engine_Torque : 0|15@1+ (1,0) [0|255] "" XXX + SG_ Engine_Stop : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Wheel_Torque : 16|12@1+ (1,0) [0|4095] "" XXX + SG_ Engine_RPM : 32|12@1+ (1,0) [0|8191] "" XXX + +BO_ 324 CruiseControl: 8 XXX + SG_ OnOffButton : 2|1@1+ (1,0) [0|1] "" XXX + SG_ SET_BUTTON : 3|1@1+ (1,0) [0|1] "" XXX + SG_ RES_BUTTON : 4|1@1+ (1,0) [0|1] "" XXX + SG_ Button : 13|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal_On : 51|1@1+ (1,0) [0|1] "" XXX + +BO_ 328 Transmission: 8 XXX + SG_ Manual_Gear : 4|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Transmission_Engine : 16|15@1+ (1,0) [0|65535] "" XXX + SG_ Gear : 48|4@1+ (1,0) [0|15] "" XXX + SG_ Gear_2 : 52|4@1+ (1,0) [0|15] "" XXX + SG_ Paddle_Shift : 60|2@1+ (1,0) [0|3] "" XXX + +BO_ 329 CVT_Ratio: 8 XXX + +BO_ 336 Brake_Pressure: 8 XXX + SG_ Brake_Pressure_Right : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_Pressure_Left : 8|8@1+ (1,0) [0|255] "" XXX + +BO_ 338 Stalk: 8 XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Light : 52|1@1+ (1,0) [0|1] "" XXX + SG_ Runlights : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Headlights : 59|1@1+ (1,0) [0|1] "" XXX + SG_ Highbeam : 60|1@1+ (1,0) [0|1] "" XXX + SG_ Wiper : 62|1@1+ (1,0) [0|1] "" XXX + +BO_ 352 ES_Brake: 8 XXX + SG_ Brake_Pressure : 0|16@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Brake_Lights : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 22|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 23|1@1+ (1,0) [0|1] "" XXX + SG_ SET_1 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 353 ES_Distance: 8 XXX + SG_ Cruise_Throttle : 0|12@1+ (1,0) [0|4095] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Car_Follow : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 17|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Brake_Active : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Distance_Swap : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Standstill : 22|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Close_Distance : 24|8@1+ (0.019607,0) [0|5] "m" XXX + SG_ Signal4 : 32|9@1+ (1,0) [0|255] "" XXX + SG_ Standstill_2 : 41|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Signal5 : 43|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 44|3@1+ (1,0) [0|7] "" XXX + SG_ Signal6 : 47|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Button : 48|3@1+ (1,0) [0|7] "" XXX + SG_ Signal7 : 51|5@1+ (1,0) [0|31] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 354 ES_Status: 8 XXX + SG_ Brake : 8|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 9|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_RPM : 16|16@1+ (1,0) [0|65535] "" XXX + SG_ Checksum : 32|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX + +BO_ 356 ES_LKAS: 8 XXX + SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX + SG_ LKAS_Command : 8|13@1- (-1,0) [-4096|4096] "" XXX + SG_ LKAS_Active : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 359 ES_LDW: 8 XXX + SG_ All_depart_2015 : 0|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1All_Depart : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Sig2All_Depart : 31|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Active : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Depart_Front : 51|1@1+ (1,0) [0|1] "" XXX + SG_ Sig3All_Depart : 52|1@1+ (1,0) [0|1] "" XXX + +BO_ 604 BSD_RCTA: 8 XXX + SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX + SG_ State : 5|1@1+ (1,0) [0|1] "" XXX + SG_ R_ADJACENT : 32|1@1+ (1,0) [0|1] "" XXX + SG_ L_ADJACENT : 33|1@1+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 42|1@1+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 43|1@1+ (1,0) [0|1] "" XXX + SG_ R_RCTA : 46|1@1+ (1,0) [0|1] "" XXX + SG_ L_RCTA : 47|1@1+ (1,0) [0|1] "" XXX + +BO_ 642 Dashlights: 8 XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ SEATBELT_FL : 40|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 44|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 45|1@1+ (1,0) [0|1] "" XXX + +BO_ 880 Steering_Torque_2: 8 XXX + SG_ Steering_Voltage_Flat : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX + SG_ COUNTER : 40|4@1+ (1,0) [0|15] "" XXX + +BO_ 884 BodyInfo: 8 XXX + SG_ DOOR_OPEN_FR : 24|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 25|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 26|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 27|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_Hatch : 28|1@1+ (1,0) [0|1] "" XXX + +BO_ 864 Engine_Temp: 8 XXX + SG_ Oil_Temp : 16|8@1+ (1,-40) [0|255] "" XXX + SG_ Coolant_Temp : 24|8@1+ (1,-40) [0|255] "" XXX + SG_ Cruise_Activated : 45|1@1+ (1,0) [0|1] "" XXX + SG_ Saved_Speed : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 866 Fuel: 8 XXX + +BO_ 977 Dash_State2: 8 XXX + SG_ UNITS : 15|1@1+ (1,0) [0|1] "" XXX + +BO_ 1745 Dash_State: 8 XXX + SG_ Units : 15|1@1+ (1,0) [0|1] "" XXX + +CM_ SG_ 320 Off_Throttle_2 "Less sensitive"; +CM_ SG_ 320 Throttle_Body "Throttle related"; +CM_ SG_ 328 Gear "15 = P, 14 = R, 0 = N, 1-6=gear"; +CM_ SG_ 328 Gear_2 "15 = P, 14 = R, 0 = N, 1-6=gear"; +CM_ SG_ 353 Cruise_Button "1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 resume deep"; +CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission"; +CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage"; +CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering"; +CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert "; +CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart"; +CM_ SG_ 359 Sig1All_Depart "Left and right depart"; +CM_ SG_ 359 Sig2All_Depart "Left and right depart"; +CM_ SG_ 359 All_depart_2015 "always 1 on 2017"; +CM_ SG_ 604 R_APPROACHING "Faster car approaching in far right lane"; +CM_ SG_ 604 L_APPROACHING "Faster car approaching in far left lane"; +CM_ SG_ 604 R_RCTA "Rear cross traffic alert, only when in R gear"; +CM_ SG_ 604 L_RCTA "Rear cross traffic alert, only when in R gear"; +CM_ SG_ 642 COUNTER "Affected by signals"; +CM_ SG_ 642 SEATBELT_FL "Driver seatbelt"; +CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371"; +CM_ SG_ 977 UNITS "0 = Metric, 1 = Imperial"; + +VAL_ 328 Gear 0 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 14 "R" 15 "P"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_forester_2017.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_forester_2017.dbc new file mode 100644 index 000000000..34dc730a5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_forester_2017.dbc @@ -0,0 +1,18 @@ +CM_ "IMPORT _subaru_preglobal_2015.dbc"; + +BO_ 355 ES_DashStatus: 8 XXX + SG_ Not_Ready_Startup : 4|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 17|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 40|3@1+ (1,0) [0|7] "" XXX + SG_ Brake : 43|1@1+ (1,0) [0|1] "" XXX + SG_ Car_Follow : 54|1@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX + +BO_ 881 Steering_Torque: 8 XXX + SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX + SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX + SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX + SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_global_2017.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_global_2017.dbc new file mode 100644 index 000000000..83a36ff8f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_global_2017.dbc @@ -0,0 +1,65 @@ +CM_ "IMPORT _subaru_global.dbc"; + +BO_ 72 Transmission: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Gear : 24|8@1+ (1,0) [0|255] "" XXX + SG_ RPM : 40|15@1+ (1,0) [0|65535] "" XXX + +BO_ 73 CVT: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ CVT_Gear : 24|8@1+ (1,0) [0|255] "" XXX + +BO_ 545 ES_Distance: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Fault : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Throttle : 16|13@1+ (1,0) [0|4095] "" XXX + SG_ Signal2 : 29|3@1+ (1,0) [0|15] "" XXX + SG_ Car_Follow : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Low_Speed_Follow : 33|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Soft_Disable : 34|1@1+ (1,0) [0|1] "" XXX + SG_ Signal7 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Distance_Swap : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_EPB : 38|1@1+ (1,0) [0|1] "" XXX + SG_ Signal4 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ Close_Distance : 40|8@1+ (0.019607,0) [0|5] "m" XXX + SG_ Signal5 : 48|8@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Cancel : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Set : 57|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Resume : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Signal6 : 59|5@1+ (1,0) [0|1] "" XXX + +BO_ 546 ES_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|3@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_RPM : 16|13@1+ (1,0) [0|4095] "" XXX + SG_ Cruise_Activated : 29|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Lights : 30|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Hold : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 32|32@1+ (1,0) [0|1] "" XXX + +BO_ 576 CruiseControl: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|28@1+ (1,0) [0|268435455] "" XXX + SG_ Cruise_On : 40|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 41|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 42|22@1+ (1,0) [0|4194303] "" XXX + +CM_ SG_ 545 Cruise_Throttle "RPM-like output signal"; +CM_ SG_ 545 Cruise_EPB "1 = Electric Parking Brake set"; +CM_ SG_ 545 Distance_Swap "Switch from Close to Far distance"; +CM_ SG_ 545 Cruise_Soft_Disable "Eyesight Temporary disable, sets CruiseControl Activated = 0"; +CM_ SG_ 546 Cruise_RPM "ES RPM output for ECM and TCM"; +CM_ SG_ 546 Signal3 "0 when cruise_activated = 1"; +CM_ SG_ 803 Signal1 "Seems to be static, set only on some cars"; +CM_ SG_ 803 Signal2 "Seems to be static, set only on some cars"; +VAL_ 803 LKAS_Blue_Lines 0 "no modifier" 2 "changes lines to blue"; +VAL_ 803 LKAS_State_Infotainment 0 "none" 2 "Obstacle Detected" 3 "Keep Hands On Wheel" 4 "Keep Hands On Wheel Off"; +VAL_ 72 Gear 2 "N" 3 "R" 4 "P" 121 "D" 137 "1" 145 "2" 153 "3" 161 "4" 169 "5" 177 "6"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_global_2020_hybrid.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_global_2020_hybrid.dbc new file mode 100644 index 000000000..a4dbe9c37 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_global_2020_hybrid.dbc @@ -0,0 +1,18 @@ +CM_ "IMPORT _subaru_global.dbc"; + +BO_ 39 Cruise_Status_2: 8 XXX + SG_ Cruise_Activated : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 295 Transmission: 8 XXX + SG_ Gear : 44|4@1+ (1,0) [0|15] "" XXX + +BO_ 360 Throttle_Hybrid: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX + +BO_ 550 Brake_Hybrid: 8 XXX + SG_ Brake_Pedal : 24|8@1+ (1,0) [0|1] "" XXX + SG_ Brake : 37|1@1+ (1,0) [0|1] "" XXX + +VAL_ 295 Gear 0 "P" 1 "R" 3 "D"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_outback_2015.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_outback_2015.dbc new file mode 100644 index 000000000..8134dd420 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_outback_2015.dbc @@ -0,0 +1,30 @@ +CM_ "IMPORT _subaru_preglobal_2015.dbc"; + +BO_ 358 ES_DashStatus: 8 XXX + SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX + SG_ Seatbelt_Disengage : 12|2@1+ (1,0) [0|3] "" XXX + SG_ Disengage_Alert : 14|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 17|1@1+ (1,0) [0|1] "" XXX + SG_ Signal1 : 18|1@1+ (1,0) [0|1] "" XXX + SG_ WHEELS_MOVING_2015 : 19|1@1+ (1,0) [0|1] "" XXX + SG_ Driver_Input : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Distance : 21|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Fault : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On_2 : 34|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 37|3@1+ (1,0) [0|7] "" XXX + SG_ Steep_Hill_Disengage : 44|1@1+ (1,0) [0|3] "" XXX + SG_ Car_Follow : 46|1@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 48|4@1+ (5,0) [0|75] "m" XXX + +BO_ 881 Steering_Torque: 8 XXX + SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX + SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX + SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (1,0) [-1000|1000] "" XXX + SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX + +CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage"; +CM_ SG_ 358 Cruise_Fault "No engagement until restart"; +CM_ SG_ 358 Car_Follow "lead car detected"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_outback_2019.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_outback_2019.dbc new file mode 100644 index 000000000..b04142fbc --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/subaru/subaru_outback_2019.dbc @@ -0,0 +1,30 @@ +CM_ "IMPORT _subaru_preglobal_2015.dbc"; + +BO_ 358 ES_DashStatus: 8 XXX + SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX + SG_ Seatbelt_Disengage : 12|2@1+ (1,0) [0|3] "" XXX + SG_ Disengage_Alert : 14|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 17|1@1+ (1,0) [0|1] "" XXX + SG_ Signal1 : 18|1@1+ (1,0) [0|1] "" XXX + SG_ WHEELS_MOVING_2015 : 19|1@1+ (1,0) [0|1] "" XXX + SG_ Driver_Input : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Distance : 21|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Fault : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On_2 : 34|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 37|3@1+ (1,0) [0|7] "" XXX + SG_ Steep_Hill_Disengage : 44|1@1+ (1,0) [0|3] "" XXX + SG_ Car_Follow : 46|1@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 48|4@1+ (5,0) [0|75] "m" XXX + +BO_ 881 Steering_Torque: 8 XXX + SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX + SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX + SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX + SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX + +CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage"; +CM_ SG_ 358 Cruise_Fault "No engagement until restart"; +CM_ SG_ 358 Car_Follow "lead car detected"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/tesla/.gitignore b/artifacts/package_runtime/iqdbc/dbc/generator/tesla/.gitignore new file mode 100644 index 000000000..554aeeaf2 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/tesla/.gitignore @@ -0,0 +1 @@ +*.dbc \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/tesla/_radar_common.py b/artifacts/package_runtime/iqdbc/dbc/generator/tesla/_radar_common.py new file mode 100644 index 000000000..c25f57d3e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/tesla/_radar_common.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +def get_radar_point_definition(base_id, base_name): + return f""" +BO_ {base_id} {base_name}_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ {base_id+1} {base_name}_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot +""" + + +def get_val_definition(base_id): + return f""" +VAL_ {base_id+1} MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ {base_id+1} Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 \ +"RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ;""" \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/tesla/tesla_radar_bosch.py b/artifacts/package_runtime/iqdbc/dbc/generator/tesla/tesla_radar_bosch.py new file mode 100644 index 000000000..adfd2d84f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/tesla/tesla_radar_bosch.py @@ -0,0 +1,282 @@ +#!/usr/bin/env python3 + +import os +from iqdbc.dbc.generator.tesla._radar_common import get_radar_point_definition, get_val_definition + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + tesla_path = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(tesla_path, dbc_name), "w", encoding='utf-8') as f: + f.write(""" +VERSION "" + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: Autopilot Radar Diag + + +BO_ 769 TeslaRadarSguInfo: 8 Radar + SG_ RADC_VerticalMisalignment : 0|8@1+ (1,0) [0|255] "" Autopilot + SG_ RADC_SCUTemperature : 8|8@1+ (1,-128) [-128|127] "" Autopilot + SG_ RADC_VMA_Plaus : 16|8@1+ (1,0) [0|255] "" Autopilot + SG_ RADC_SGU_ITC : 24|8@1+ (1,0) [0|255] "" Autopilot + SG_ RADC_HorizontMisalignment : 32|12@1+ (1,0) [0|4096] "" Autopilot + SG_ RADC_SensorDirty : 44|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_HWFail : 45|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_SGUFail : 46|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_SGUInfoConsistBit : 47|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 770 TeslaRadarTguInfo: 8 Radar + SG_ RADC_ACCTargObj1_sguIndex : 0|6@1+ (1,0) [0|63] "" Autopilot + SG_ RADC_ACCTargObj2_sguIndex : 6|6@1+ (1,0) [0|63] "" Autopilot + SG_ RADC_ACCTargObj3_sguIndex : 12|6@1+ (1,0) [0|63] "" Autopilot + SG_ RADC_ACCTargObj4_sguIndex : 18|6@1+ (1,0) [0|63] "" Autopilot + SG_ RADC_ACCTargObj5_sguIndex : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ unused30 : 30|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_TGUInfoConsistBit : 31|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_ACCTargObj1_dBPower : 32|16@1+ (1,0) [0|65535] "" Autopilot + SG_ RADC_ACCTargObj5_dBPower : 48|16@1+ (1,0) [0|65535] "" Autopilot + +BO_ 1281 TeslaRadarAlertMatrix: 8 Radar + SG_ RADC_a001_ecuInternalPerf : 0|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a002_flashPerformance : 1|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a003_vBatHigh : 2|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a004_adjustmentNotDone : 3|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a005_adjustmentReq : 4|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a006_adjustmentNotOk : 5|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a007_sensorBlinded : 6|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a008_plantModeActive : 7|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a009_configMismatch : 8|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a010_canBusOff : 9|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a011_bdyMIA : 10|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a012_espMIA : 11|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a013_gtwMIA : 12|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a014_sccmMIA : 13|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a015_adasMIA : 14|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a016_bdyInvalidCount : 15|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a017_adasInvalidCount : 16|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a018_espInvalidCount : 17|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a019_sccmInvalidCount : 18|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a020_bdyInvalidChkSm : 19|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a021_espInvalidChkSm : 20|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a022_sccmInvalidChkSm : 21|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a023_sccmInvalidChkSm : 22|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a024_absValidity : 23|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a025_ambTValidity : 24|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a026_brakeValidity : 25|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a027_CntryCdValidity : 26|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a028_espValidity : 27|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a029_longAccOffValidity : 28|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a030_longAccValidity : 29|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a031_odoValidity : 30|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a032_gearValidity : 31|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a033_steerAngValidity : 32|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a034_steerAngSpdValidity : 33|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a035_indctrValidity : 34|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a036_vehStandStillValidity : 35|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a037_vinValidity : 36|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a038_whlRotValidity : 37|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a039_whlSpdValidity : 38|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a040_whlStandStillValidity : 39|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a041_wiperValidity : 40|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a042_xwdValidity : 41|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a043_yawOffValidity : 42|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a044_yawValidity : 43|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a045_bsdSanity : 44|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a046_rctaSanity : 45|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a047_lcwSanity : 46|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a048_steerAngOffSanity : 47|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a049_tireSizeSanity : 48|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a050_velocitySanity : 49|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a051_yawSanity : 50|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a052_radomeHtrInop : 51|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a053_espmodValidity : 52|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a054_gtwmodValidity : 53|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a055_stwmodValidity : 54|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a056_bcmodValidity : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a057_dimodValidity : 56|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a058_opmodValidity : 57|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a059_drmiInvalidChkSm : 58|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a060_drmiInvalidCount : 59|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a061_radPositionMismatch : 60|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a062_strRackMismatch : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ unused62 : 62|2@1+ (1,0) [0|3] "" Autopilot +""") + + M_RANGE = range(0x310, 0x36D + 1, 3) + for i, base_id in enumerate(M_RANGE): + f.write(get_radar_point_definition(base_id, f"RadarPoint{i}")) + + L_RANGE = range(0x371, 0x37D + 1, 3) + for i, base_id in enumerate(L_RANGE): + f.write(get_radar_point_definition(base_id, f"ProcessedRadarPoint{i+1}")) + + f.write(""" +BO_ 697 VIN_VIP_405HS: 8 Autopilot + SG_ VIN_MuxID M : 0|8@1+ (1,0) [0|0] "" Radar + SG_ VIN_Part1 m16 : 47|24@0+ (1,0) [0|16777215] "" Radar + SG_ VIN_Part2 m17 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar + SG_ VIN_Part3 m18 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar + +BO_ 681 Msg2A9_GTW_carConfig: 8 Autopilot + SG_ Msg2A9_Always0x02 : 48|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Always0x10 : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Always0x16 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Always0x41 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Value1_0x02 : 0|3@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_FourWheelDrive : 3|2@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Value2_0x02 : 5|3@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Always0x43 : 16|8@1+ (1,0) [0|0] "" Radar + +BO_ 409 Msg199_STW_ANGLHP_STAT: 8 Autopilot + SG_ Msg199Always0x04 : 32|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Always0x20 : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Always0x2F : 0|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Always0x67 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Always0xFF : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Checksum : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Counter : 52|4@1+ (1,0) [0|0] "" Radar + +BO_ 361 Msg169_ESP_wheelSpeeds: 8 Autopilot + SG_ ESP_wheelSpeedFrL_HS : 0|13@1+ (0.04,0) [0|327.64] "km/h" Radar + SG_ ESP_wheelSpeedFrR_HS : 13|13@1+ (0.04,0) [0|327.64] "km/h" Radar + SG_ ESP_wheelSpeedReL_HS : 26|13@1+ (0.04,0) [0|327.64] "km/h" Radar + SG_ ESP_wheelSpeedReR_HS : 39|13@1+ (0.04,0) [0|327.64] "km/h" Radar + SG_ Msg169Checksum : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg169Counter : 52|4@1+ (1,0) [0|0] "" Radar + +BO_ 345 Msg159_ESP_C: 8 Autopilot + SG_ Msg159Always0x3A : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg159Always0xA5 : 0|8@1+ (1,0) [0|0] "" Radar + SG_ Msg159Always0xCF : 32|8@1+ (1,0) [0|0] "" Radar + SG_ Msg159Always0xF4 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg159Counter : 44|4@1+ (1,0) [0|0] "" Radar + SG_ Msg159Checksum : 24|8@1+ (1,0) [0|0] "" Radar + +BO_ 329 Msg149_ESP_145h: 8 Autopilot + SG_ Msg149Always0x02 : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0x04 : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0x26 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0x6A : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0xAA : 32|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0xF : 48|4@1+ (1,0) [0|0] "" Radar + SG_ Msg149Checksum : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Counter : 52|4@1+ (1,0) [0|0] "" Radar + +BO_ 297 Msg129_ESP_115h: 6 Autopilot + SG_ Msg129Always0x20 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg129Checksum : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg129Counter : 36|4@1+ (1,0) [0|0] "" Radar + +BO_ 281 Msg119_DI_torque2: 6 Autopilot + SG_ Msg119Always0x11 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Always0x1F : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Always0x8 : 36|4@1+ (1,0) [0|0] "" Radar + SG_ Msg119Always0xF4 : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Always0xFF : 0|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Checksum : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Counter : 32|4@1+ (1,0) [0|0] "" Radar + +BO_ 265 Msg109_DI_torque1: 8 Autopilot + SG_ Msg109Always0x80 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg109Checksum : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg109Counter : 13|3@1+ (1,0) [0|0] "" Radar + +BO_ 521 Msg209_GTW_odo: 8 Autopilot + SG_ Msg209Always0x61 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x94 : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x52 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x13 : 32|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x03 : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x80 : 48|8@1+ (1,0) [0|0] "" Radar + +BO_ 537 Msg219_STW_ACTN_RQ: 8 Autopilot + SG_ Msg219Counter : 52|4@1+ (1,0) [0|15] "" Radar + SG_ Msg219CRC : 56|8@1+ (1,0) [0|0] "" Radar + +BO_ 425 Msg1A9_DI_espControl: 5 Autopilot + SG_ Msg1A9Always0x0C : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg1A9Counter : 28|4@1+ (1,0) [0|0] "" Radar + SG_ Msg1A9Checksum : 32|8@1+ (1,0) [0|0] "" Radar + +BO_ 729 Msg2D9_BC_status : 8 Autopilot + SG_ Msg2D9Always0x80 : 0|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2D9Always0x40 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2D9Always0x83 : 16|8@1+ (1,0) [0|0] "" Radar + +BO_ 1601 UDS_radarRequest: 8 Diag + SG_ UDS_radarRequestData : 7|64@0+ (1,0) [0|0] "" Radar + +BO_ 1617 Radar_udsResponse: 8 Radar + SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|0] "" Diag + +CM_ BO_ 697 "Start with MuxID 0x12, then 0x11 and finally 0x10 (VIN is then transmitted in the reverse order)"; +CM_ BO_ 681 "Message sent every 1000 ms. All fixed bytes, no checksum, the byte for RWD or AWD needs to match VIN config"; +CM_ BO_ 409 "Message sent every 10ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo"; +CM_ BO_ 361 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x76"; +CM_ BO_ 345 "Message sent every 20ms. Checksum : Sum of all first bytes + 0xc; place checksum in 4th octet"; +CM_ BO_ 329 "Message sent every 20ms. Checksum : Sum of all first 7 bytes + 0x46"; +CM_ BO_ 297 "Message sent every 20ms. Checksum : Sum of all first 5 bytes + 0x16"; +CM_ BO_ 281 "Message sent every 10ms. Checksum : Sum of all first 5 bytes + 0x17"; +CM_ BO_ 265 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x7"; +CM_ BO_ 521 "Message sent every 100ms. All fixed bytes, no checksum."; +CM_ BO_ 537 "Message sent every 100ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo"; +CM_ BO_ 425 "Message sent every 20ms. Checksum : Sum of all first 4 bytes + 0x38"; +CM_ BO_ 729 "Message sent every 1000ms. All fixed bytes, no checksum."; + +BA_DEF_ "BusType" STRING ; +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0; +BA_DEF_ SG_ "FieldType" STRING ; + +BA_DEF_DEF_ "BusType" "CAN"; +BA_DEF_DEF_ "FieldType" ""; +BA_DEF_DEF_ "GenMsgCycleTime" 0; + +BA_ "GenMsgCycleTime" BO_ 697 250; +BA_ "GenMsgCycleTime" BO_ 681 1000; +BA_ "GenMsgCycleTime" BO_ 409 10; +BA_ "GenMsgCycleTime" BO_ 361 10; +BA_ "GenMsgCycleTime" BO_ 345 20; +BA_ "GenMsgCycleTime" BO_ 329 20; +BA_ "GenMsgCycleTime" BO_ 297 20; +BA_ "GenMsgCycleTime" BO_ 281 10; +BA_ "GenMsgCycleTime" BO_ 265 10; +BA_ "GenMsgCycleTime" BO_ 521 100; +BA_ "GenMsgCycleTime" BO_ 537 100; +BA_ "GenMsgCycleTime" BO_ 425 20; +BA_ "GenMsgCycleTime" BO_ 729 1000; + +VAL_ 681 Msg2A9_FourWheelDrive 3 "SNA" 2 "UNUSED" 1 "4WD" 0 "2WD" ;""") + + for base_id in list(M_RANGE) + list(L_RANGE): + f.write(get_val_definition(base_id)) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/tesla/tesla_radar_continental.py b/artifacts/package_runtime/iqdbc/dbc/generator/tesla/tesla_radar_continental.py new file mode 100644 index 000000000..c3e325c26 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/tesla/tesla_radar_continental.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 + +import os +from iqdbc.dbc.generator.tesla._radar_common import get_radar_point_definition, get_val_definition + +if __name__ == "__main__": + dbc_name = os.path.basename(__file__).replace(".py", ".dbc") + tesla_path = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(tesla_path, dbc_name), "w", encoding='utf-8') as f: + f.write(""" +VERSION "" + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: Autopilot Radar Diag + +BO_ 1025 RadarStatus: 8 Radar + SG_ carparkDetected : 29|1@1+ (1,0) [0|1] "" Autopilot + SG_ decreaseBlockage : 25|1@1+ (1,0) [0|1] "" Autopilot + SG_ horizontMisalignment : 8|12@1+ (0.00012207,-0.25) [-0.25|0.249878] "rad" Autopilot + SG_ increaseBlockage : 24|1@1+ (1,0) [0|1] "" Autopilot + SG_ lowPowerMode : 20|2@1+ (1,0) [0|3] "" Autopilot + SG_ powerOnSelfTest : 22|1@1+ (1,0) [0|1] "" Autopilot + SG_ sensorBlocked : 26|1@1+ (1,0) [0|1] "" Autopilot + SG_ sensorInfoConsistBit : 30|1@1+ (1,0) [0|1] "" Autopilot + SG_ sensorReplace : 31|1@1+ (1,0) [0|1] "" Autopilot + SG_ shortTermUnavailable : 23|1@1+ (1,0) [0|1] "" Autopilot + SG_ tunnelDetected : 28|1@1+ (1,0) [0|1] "" Autopilot + SG_ vehDynamicsError : 27|1@1+ (1,0) [0|1] "" Autopilot + SG_ verticalMisalignment : 0|8@1+ (0.00195313,-0.25) [-0.25|0.248047] "rad" Autopilot + +BO_ 1617 Radar_udsResponse: 8 Radar + SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|1.84467e+19] "" Diag + +BO_ 1601 UDS_radcRequest: 8 Diag + SG_ UDS_radcRequestData : 7|64@0+ (1,0) [0|1.84467e+19] "" Radar +""") + + POINT_RANGE = range(0x410, 0x45E + 1, 2) + for i, base_id in enumerate(POINT_RANGE): + f.write(get_radar_point_definition(base_id, f"RadarPoint{i}")) + + f.write(""" +VAL_ 1025 lowPowerMode 1 "COMMANDED_LOW_POWER" 0 "DEFAULT_LOW_POWER" 2 "NORMAL_POWER" 3 "SNA";""") + + for base_id in list(POINT_RANGE): + f.write(get_val_definition(base_id)) diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_community.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_community.dbc new file mode 100644 index 000000000..61ab55534 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_community.dbc @@ -0,0 +1,41 @@ +BO_ 359 STEERING_IPAS_COMMA: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "BO_ STEERING_IPAS_COMMA: Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant"; + +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + +BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX + SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX + +CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor that can replace the lower resolution sensor in most TSS1 Toyotas. Learn more: https://github.com/commaai/openpilot/wiki/Toyota-Lexus#zorro-steering-sensor-zss"; + +BO_ 767 SDSU: 8 XXX + SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX + +CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu"; +CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu"; + +VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_toyota_2017.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_toyota_2017.dbc new file mode 100644 index 000000000..4524b1ea6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_toyota_2017.dbc @@ -0,0 +1,560 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX DSU HCU EPS IPAS CGW BGM + +BO_ 36 KINEMATICS: 8 XXX + SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX + SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + +BO_ 37 STEER_ANGLE_SENSOR: 8 XXX + SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX + SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX + SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX + +BO_ 119 ENG2F41: 6 CGW + SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX + SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 120 ENG2F42: 4 CGW + SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X + SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 166 BRAKE: 8 XXX + SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX + +BO_ 170 WHEEL_SPEEDS: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + +BO_ 180 SPEED: 8 XXX + SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 295 GEAR_PACKET_HYBRID: 8 XXX + SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX + SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX + +BO_ 353 DSU_SPEED: 7 XXX + SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX + +BO_ 452 ENGINE_RPM: 8 CGW + SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS + SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX + +BO_ 467 PCM_CRUISE_2: 8 XXX + SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX + SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX + SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX + SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 552 VSC1S29: 4 CGW + SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1 + SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1 + SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1 + +BO_ 560 BRAKE_2: 7 XXX + SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX + +BO_ 581 GAS_PEDAL_HYBRID: 8 XXX + SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX + +BO_ 608 STEER_TORQUE_SENSOR: 8 XXX + SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX + SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 614 STEERING_IPAS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 742 LEAD_INFO: 8 DSU + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU + SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU + SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU + +BO_ 800 VSC1S07: 8 CGW + SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1 + SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1 + SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1 + SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1 + SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1 + SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1 + SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1 + SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1 + SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1 + SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 835 ACC_CONTROL: 8 DSU + SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU + SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX + SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX + SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU + SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU + SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU + SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU + SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU + SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX + SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 865 CLUTCH: 8 XXX + SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX + SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX + +BO_ 869 DSU_CRUISE : 7 DSU + SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX + SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX + SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX + SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX + SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX + +BO_ 898 AIR_CONDITIONER: 8 XXX + SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX + SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX + +BO_ 921 PCM_CRUISE_SM: 8 XXX + SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX + SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 944 AIR_CONDITIONER_2: 8 XXX + SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX + +BO_ 951 ESP_CONTROL: 8 ESP + SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX + SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX + +BO_ 956 GEAR_PACKET: 8 XXX + SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX + SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX + SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX + SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX + +BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM + SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX + +BO_ 1009 PCM_CRUISE_ALT: 8 XXX + SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX + SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + +BO_ 1020 SOLAR_SENSOR: 8 XXX + SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX + +BO_ 1041 PCS_HUD: 8 DSU + SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX + SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX + SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX + SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX + SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX + +BO_ 1042 LKAS_HUD: 8 DSU + SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX + SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX + SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX + SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX + SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX + SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX + SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 1043 TIME : 8 CGW + SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX + SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX + SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX + SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX + SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX + SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX + SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX + SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX + SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX + +BO_ 1044 AUTO_HIGH_BEAM: 8 FCM + SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX + SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1056 VSC1S08: 8 CGW + SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS + SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 1083 AUTOPARK_STATUS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 1161 RSA1: 8 FCM + SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX + SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1162 RSA2: 8 FCM + SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX + SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX + SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1163 RSA3: 8 FCM + SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX + SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX + SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX + SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX + SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX + +BO_ 1408 VIN_PART_1: 8 CGW + SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1409 VIN_PART_2: 8 CGW + SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1410 VIN_PART_3: 8 CGW + SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX + SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX + SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX + SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX + SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX + +BO_ 1553 UI_SETTING: 8 XXX + SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX + SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX + +BO_ 1556 BLINKERS_STATE: 8 XXX + SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX + +BO_ 1568 BODY_CONTROL_STATE: 8 XXX + SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX + +BO_ 1570 LIGHT_STALK: 8 SCM + SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX + SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX + SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX + SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 1571 CERTIFICATION_ECU: 8 CGW + SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX + +BO_ 1592 DOOR_LOCKS: 8 XXX + SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX + SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX + SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM + SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 36 YAW_RATE "verify"; +CM_ SG_ 36 ACCEL_X "x-axis accel"; +CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set"; +CM_ SG_ 37 STEER_RATE "factor is tbd"; +CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking"; +CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command"; +CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking"; +CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement"; +CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect"; +CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph"; +CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?"; +CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered"; +CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque"; +CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value"; +CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active"; +CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok"; +CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD"; +CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1"; +CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1"; +CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1"; +CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect"; +CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles"; +CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars"; +CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG."; +CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file."; +CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals."; +CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT."; +CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force"; +CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set."; +CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs"; +CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit"; +CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on."; +CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel"; +CM_ SG_ 956 GEAR "on 6MT, only R shows."; +CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to"; +CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator"; +CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity"; +CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual"; +CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor"; +CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature"; +CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual"; +CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM"; +CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle"; +CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0"; +CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity"; +CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message"; +CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning"; +CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1"; +CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages"; +CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1"; +CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning"; +CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch"; +CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered"; +CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled"; +CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS"; +CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations"; +CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations"; +CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero"; +CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit."; +CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1161 SPDVAL2 "conditional speed value 70"; +CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0"; +CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1163 TSREQPD "always 1"; +CM_ SG_ 1163 TSRMSW "always 1"; +CM_ SG_ 1163 OTSGNNTM "always 3"; +CM_ SG_ 1163 NTLVLSPD "always 3"; +CM_ SG_ 1163 OVSPNTM "always 3"; +CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds"; +CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds"; +CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds"; +CM_ SG_ 1163 TSRSPU "always 1"; +CM_ SG_ 1552 UI_SPEED "Does not appear to match dash"; +CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting"; +CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal"; +CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking"; +CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal."; +CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch"; + +VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B"; +VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok"; +VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 614 STATE 3 "enabled" 1 "disabled"; +VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left"; +VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok"; +VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok"; +VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear"; +VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press"; +VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released"; +VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF"; +VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF"; +VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted"; +VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far"; +VAL_ 956 SPORT_ON 0 "off" 1 "on"; +VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P"; +VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on"; +VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6"; +VAL_ 956 ECON_ON 0 "off" 1 "on"; +VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on"; +VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on"; +VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines"; +VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled"; +VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off"; +VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none"; +VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none"; +VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LKAS_STATUS 1 "on" 0 "off"; +VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear"; +VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on"; +VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined"; +VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok"; +VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok"; +VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok"; +VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok"; +VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok"; +VAL_ 1161 TSGN1 1 "speed sign" 0 "none"; +VAL_ 1161 TSGN2 1 "speed sign" 0 "none"; +VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter"; +VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on"; +VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed"; +VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)"; +VAL_ 1553 UNITS 1 "km" 2 "miles"; +VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left"; +VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed"; +VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights"; +VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_toyota_adas_standard.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_toyota_adas_standard.dbc new file mode 100644 index 000000000..20680225a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/_toyota_adas_standard.dbc @@ -0,0 +1,56 @@ +BO_ 466 PCM_CRUISE: 8 XXX + SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_BRAKING : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 23|16@0- (0.0009765625,0) [-20|20] "m/s^2" XXX + SG_ NEUTRAL_FORCE : 39|16@0- (2,0) [-65536|65534] "N" XXX + SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 643 PRE_COLLISION: 7 DSU + SG_ _COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX + SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX + SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX + SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 705 GAS_PEDAL: 8 XXX + SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" XXX + SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS + SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" XXX + SG_ GAS_PEDAL : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 740 STEERING_LKA: 5 XXX + SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX + SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 836 PRE_COLLISION_2: 8 DSU + SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX + SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM + SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM + SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX + +CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input"; +CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command"; +CM_ SG_ 466 ACCEL_NET "net negative acceleration (braking) applied by the system if on flat ground"; +CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10"; +CM_ SG_ 643 _COUNTER "only used on cars that use this msg for cruise control"; +CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control"; +CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking"; + +VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off"; +VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_new_mc_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_new_mc_pt.dbc new file mode 100644 index 000000000..4ff3f2e21 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_new_mc_pt.dbc @@ -0,0 +1,22 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _toyota_2017.dbc"; +CM_ "IMPORT _toyota_adas_standard.dbc"; + +BO_ 548 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 43|12@0+ (1,0) [0|4047] "" XXX + SG_ BRAKE_PRESSED : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 610 EPS_STATUS: 5 EPS + SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX + SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 1178 BRAKE_RELATED: 8 XXX + SG_ BRAKE_PRESSED : 48|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 548 BRAKE_PRESSURE "seems prop to pedal force"; +CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others"; + +VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled"; +VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_nodsu_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_nodsu_pt.dbc new file mode 100644 index 000000000..109e85498 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_nodsu_pt.dbc @@ -0,0 +1,79 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _toyota_2017.dbc"; +CM_ "IMPORT _toyota_adas_standard.dbc"; + +BO_ 401 STEERING_LTA: 8 XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ SETME_X3 : 29|2@0+ (1,0) [0|3] "" XXX + SG_ PERCENTAGE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ TORQUE_WIND_DOWN : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ANGLE : 55|8@0- (0.5,0) [0|255] "" XXX + SG_ STEER_ANGLE_CMD : 15|16@0- (0.0573,0) [-540|540] "" XXX + SG_ STEER_REQUEST_2 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_ACTIVE : 26|1@0+ (1,0) [0|1] "" XXX + SG_ CLEAR_HOLD_STEERING_ALERT : 30|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|255] "" XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SETME_X1 : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 550 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 610 EPS_STATUS: 8 EPS + SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX + SG_ LTA_STATE : 15|5@0+ (1,0) [0|31] "" XXX + SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 881 LTA_RELATED: 8 FCM + SG_ GAS_PEDAL : 15|8@0+ (0.005,0) [0|1] "" XXX + SG_ STEER_ANGLE : 23|16@0- (0.0573,0) [-500|500] "" XXX + SG_ TURN_SIGNALS : 35|2@0+ (1,0) [0|3] "" XXX + SG_ UNKNOWN_2 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SA_TOGGLE : 59|1@0+ (1,0) [0|1] "" XXX + SG_ LTA_STEER_REQUEST : 60|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN : 61|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_PRESSED : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 1014 BSM: 8 XXX + SG_ L_ADJACENT : 0|1@0+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 8|1@0+ (1,0) [0|1] "" XXX + SG_ R_ADJACENT : 1|1@0+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ADJACENT_ENABLED : 7|1@0+ (1,0) [0|1] "" XXX + SG_ APPROACHING_ENABLED : 15|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 PERCENTAGE "driver override percentage (0-100), very close to steeringPressed in OP"; +CM_ SG_ 401 TORQUE_WIND_DOWN "used to wind down torque on user override"; +CM_ SG_ 401 ANGLE "angle of car relative to lane center on LTA camera"; +CM_ SG_ 401 STEER_ANGLE_CMD "desired angle, OEM steers up to 95 degrees, no angle limit but torque will bottom out"; +CM_ SG_ 401 CLEAR_HOLD_STEERING_ALERT "set to 1 when user clears LKAS_HUD->LDA_ALERT ('Hold Steering') by applying torque to steering wheel"; +CM_ SG_ 401 STEER_REQUEST "enable bit for steering, 1 to steer, 0 to not"; +CM_ SG_ 401 STEER_REQUEST_2 "enable bit for steering, 1 to steer, 0 to not"; +CM_ SG_ 401 LKA_ACTIVE "1 when using LTA for LKA"; +CM_ SG_ 401 SETME_X1 "usually 1, seen at 0 on some South American Corollas indicating lack of stock Lane Tracing Assist"; +CM_ SG_ 401 SETME_X3 "almost completely correlates with Toyota Safety Sense version, but may instead describe max torque when using LTA. if TSS 2.5 or 2022 RAV4, this is always 1. if TSS 2.0 this is always 3 (or 0 on Alphard, Highlander, NX)"; +CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force"; +CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8"; +CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others"; +CM_ SG_ 881 GAS_PEDAL "not set on all cars, only seen on TSS 2.5 Camry Hybrid so far"; +CM_ SG_ 881 STEER_ANGLE "matches STEER_TORQUE_SENSOR->STEER_ANGLE"; +CM_ SG_ 881 TURN_SIGNALS "flipped on some cars"; +CM_ SG_ 881 LDA_SA_TOGGLE "not applicable for all cars"; +CM_ SG_ 881 LTA_STEER_REQUEST "only applicable for TSS 2.5: matches STEERING_LTA->STEER_REQUEST"; +CM_ SG_ 881 UNKNOWN "related to steering wheel angle"; +CM_ SG_ 881 STEERING_PRESSED "only applicable for TSS 2.5: low sensitivity steering wheel pressed by driver signal"; +CM_ SG_ 1014 L_ADJACENT "vehicle adjacent left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 L_APPROACHING "vehicle approaching from left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 R_ADJACENT "vehicle adjacent right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 R_APPROACHING "vehicle approaching from right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 ADJACENT_ENABLED "when BSM is enabled in settings, this is on along with APPROACHING_ENABLED. this controls bsm alert visibility"; +CM_ SG_ 1014 APPROACHING_ENABLED "when BSM is enabled in settings, this is on along with ADJACENT_ENABLED. this controls bsm alert visibility"; + +VAL_ 401 SETME_X3 3 "TSS 2.0" 1 "TSS 2.5 or 2022 RAV4" 0 "TSS 2.0 on Alphard, Highlander, NX"; +VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled"; +VAL_ 610 LKA_STATE 25 "temporary_fault" 17 "permanent_fault" 11 "lka_missing_unavailable2" 9 "temporary_fault2" 5 "active" 3 "lka_missing_unavailable" 1 "standby"; +VAL_ 610 LTA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 3 "lta_missing_unavailable" 1 "standby"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_secoc_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_secoc_pt.dbc new file mode 100644 index 000000000..eefe99066 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_secoc_pt.dbc @@ -0,0 +1,156 @@ +CM_ "IMPORT _toyota_2017.dbc"; + +BO_ 15 SECOC_SYNCHRONIZATION: 8 XXX + SG_ TRIP_CNT : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ RESET_CNT : 23|20@0+ (1,0) [0|65535] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + +BO_ 257 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PRESSURE_1 : 31|8@0+ (1,0) [0|15] "" XXX + SG_ BRAKE_PRESSURE_2 : 61|6@0+ (1,0) [0|63] "" XXX + +BO_ 278 GAS_PEDAL: 8 XXX + SG_ GAS_PEDAL_ACC : 7|8@0+ (0.005,0) [0|255] "" XXX + SG_ GAS_PEDAL_USER : 15|8@0+ (0.005,0) [0|255] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 305 STEERING_LTA_2: 8 XXX + SG_ STEER_REQUEST_2 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_REQUEST : 3|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 13|6@0+ (1,0) [0|63] "" XXX + SG_ STEER_ANGLE_CMD : 23|16@0- (0.0573,0) [0|65535] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 374 PCM_CRUISE: 8 XXX + SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_STATE : 31|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 375 PCM_CRUISE_3: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0- (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 21|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_RELEASED : 30|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 387 ACC_CONTROL_2: 8 XXX + SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 401 STEERING_LTA: 8 XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|255] "" XXX + SG_ SETME_X1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_ANGLE_CMD : 15|16@0- (0.0573,0) [-540|540] "" XXX + SG_ STEER_REQUEST_2 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_ACTIVE : 26|1@0+ (1,0) [0|1] "" XXX + SG_ SETME_X3 : 29|2@0+ (1,0) [0|3] "" XXX + SG_ CLEAR_HOLD_STEERING_ALERT : 30|1@0+ (1,0) [0|1] "" XXX + SG_ PERCENTAGE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ TORQUE_WIND_DOWN : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ANGLE : 55|8@0- (0.5,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 418 CRUISE_RELATED: 8 XXX + SG_ CRUISE_ACTIVE : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 589 PCM_CRUISE_4: 8 PCM + SG_ DISTANCE : 2|1@0+ (1,0) [0|1] "" XXX + SG_ CANCEL : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DECREASE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ENABLE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ INCREASE : 7|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 27|4@0+ (1,0) [0|15] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 610 EPS_STATUS: 8 EPS + SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LTA_STATE : 15|5@0+ (1,0) [0|31] "" XXX + SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 643 PRE_COLLISION: 8 DSU + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 740 STEERING_LKA: 8 XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX + SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX + SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 836 PRE_COLLISION_2: 8 DSU + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 881 LTA_RELATED: 8 FCM + SG_ GAS_PEDAL : 15|8@0+ (0.005,0) [0|1] "" XXX + SG_ STEER_ANGLE : 23|16@0- (0.0573,0) [-500|500] "" XXX + SG_ TURN_SIGNALS : 35|2@0+ (1,0) [0|3] "" XXX + SG_ UNKNOWN_2 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SA_TOGGLE : 59|1@0+ (1,0) [0|1] "" XXX + SG_ LTA_STEER_REQUEST : 60|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN : 61|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_PRESSED : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 1014 BSM: 8 XXX + SG_ L_ADJACENT : 0|1@0+ (1,0) [0|1] "" XXX + SG_ R_ADJACENT : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ADJACENT_ENABLED : 7|1@0+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 8|1@0+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 10|1@0+ (1,0) [0|1] "" XXX + SG_ APPROACHING_ENABLED : 15|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 305 STEER_ANGLE_CMD "Used in place of STEERING_LTA.STEER_ANGLE_CMD on SecOC cars"; +CM_ SG_ 387 ACCEL_CMD "Used in place of ACC_CONTROL.ACCEL_CMD on SecOC cars"; +CM_ SG_ 401 STEER_REQUEST "enable bit for steering, 1 to steer, 0 to not"; +CM_ SG_ 401 SETME_X1 "usually 1, seen at 0 on some South American Corollas indicating lack of stock Lane Tracing Assist"; +CM_ SG_ 401 STEER_ANGLE_CMD "desired angle, OEM steers up to 95 degrees, no angle limit but torque will bottom out"; +CM_ SG_ 401 STEER_REQUEST_2 "enable bit for steering, 1 to steer, 0 to not"; +CM_ SG_ 401 LKA_ACTIVE "1 when using LTA for LKA"; +CM_ SG_ 401 SETME_X3 "almost completely correlates with Toyota Safety Sense version, but may instead describe max torque when using LTA. if TSS 2.5 or 2022 RAV4, this is always 1. if TSS 2.0 this is always 3 (or 0 on Alphard, Highlander, NX)"; +CM_ SG_ 401 CLEAR_HOLD_STEERING_ALERT "set to 1 when user clears LKAS_HUD->LDA_ALERT ('Hold Steering') by applying torque to steering wheel"; +CM_ SG_ 401 PERCENTAGE "driver override percentage (0-100), very close to steeringPressed in OP"; +CM_ SG_ 401 TORQUE_WIND_DOWN "used to wind down torque on user override"; +CM_ SG_ 401 ANGLE "angle of car relative to lane center on LTA camera"; +CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others"; +CM_ SG_ 881 GAS_PEDAL "not set on all cars, only seen on TSS 2.5 Camry Hybrid so far"; +CM_ SG_ 881 STEER_ANGLE "matches STEER_TORQUE_SENSOR->STEER_ANGLE"; +CM_ SG_ 881 TURN_SIGNALS "flipped on some cars"; +CM_ SG_ 881 LDA_SA_TOGGLE "not applicable for all cars"; +CM_ SG_ 881 LTA_STEER_REQUEST "only applicable for TSS 2.5: matches STEERING_LTA->STEER_REQUEST"; +CM_ SG_ 881 UNKNOWN "related to steering wheel angle"; +CM_ SG_ 881 STEERING_PRESSED "only applicable for TSS 2.5: low sensitivity steering wheel pressed by driver signal"; +CM_ SG_ 1014 L_ADJACENT "vehicle adjacent left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 R_ADJACENT "vehicle adjacent right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 ADJACENT_ENABLED "when BSM is enabled in settings, this is on along with APPROACHING_ENABLED. this controls bsm alert visibility"; +CM_ SG_ 1014 L_APPROACHING "vehicle approaching from left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 R_APPROACHING "vehicle approaching from right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 APPROACHING_ENABLED "when BSM is enabled in settings, this is on along with ADJACENT_ENABLED. this controls bsm alert visibility"; + +VAL_ 401 SETME_X3 3 "TSS 2.0" 1 "TSS 2.5 or 2022 RAV4" 0 "TSS 2.0 on Alphard, Highlander, NX"; +VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled"; +VAL_ 610 LTA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 3 "lta_missing_unavailable" 1 "standby"; +VAL_ 610 LKA_STATE 25 "temporary_fault" 17 "permanent_fault" 11 "lka_missing_unavailable2" 9 "temporary_fault2" 5 "active" 3 "lka_missing_unavailable" 1 "standby"; diff --git a/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_tnga_k_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_tnga_k_pt.dbc new file mode 100644 index 000000000..d0ce72699 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/generator/toyota/toyota_tnga_k_pt.dbc @@ -0,0 +1,21 @@ +CM_ "IMPORT _community.dbc"; +CM_ "IMPORT _toyota_2017.dbc"; +CM_ "IMPORT _toyota_adas_standard.dbc"; + +BO_ 550 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 610 EPS_STATUS: 5 EPS + SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX + SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force"; +CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8"; +CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others"; + +VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled"; +VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby"; diff --git a/artifacts/package_runtime/iqdbc/dbc/gm_global_a_chassis.dbc b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_chassis.dbc new file mode 100644 index 000000000..e1fc1ccbf --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_chassis.dbc @@ -0,0 +1,75 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: K182_PACM K43_PSCM K17_EBCM NEO K124_ASCM + + + +BO_ 823 PACMParkAssitCmd: 7 NEO + SG_ RollingCounter : 35|2@0+ (1,0) [0|0] "" NEO + SG_ SteeringWheelChecksum : 47|16@0+ (1,0) [0|0] "" NEO + SG_ SteeringWheelCmd : 23|16@0+ (1,0) [0|0] "" NEO + +BO_ 560 EBCMRegen: 6 K17_EBCM + SG_ Regen : 1|10@0+ (1,0) [0|0] "" NEO + +BO_ 368 EBCMFrictionBrakeStatus: 8 K17_EBCM + SG_ FrictionBrakePressure : 23|16@0+ (1,0) [0|0] "" NEO + +BO_ 789 EBCMFrictionBrakeCmd: 5 K17_EBCM + SG_ RollingCounter : 33|2@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeMode : 7|4@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeChecksum : 23|16@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeCmd : 3|12@0- (1,0) [0|0] "" NEO + +BO_TX_BU_ 823 : K43_PSCM,NEO; +BO_TX_BU_ 789 : NEO,K17_EBCM; + + +CM_ BU_ K182_PACM "Parking Assist Control Module"; +CM_ BU_ K43_PSCM "Power Steering Control Module"; +CM_ BU_ K17_EBCM "Electronic Brake Control Module"; +CM_ BU_ NEO "Comma NEO"; +CM_ BU_ K124_ASCM "Active Safety Control Module"; +BA_DEF_ "UseGMParameterIDs" INT 0 0; +BA_DEF_ "ProtocolType" STRING ; +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "UseGMParameterIDs" 1; +BA_DEF_DEF_ "ProtocolType" "GMLAN"; +BA_DEF_DEF_ "BusType" ""; +BA_ "UseGMParameterIDs" 0; +BA_ "BusType" "CAN"; +BA_ "ProtocolType" "GMLAN"; + diff --git a/artifacts/package_runtime/iqdbc/dbc/gm_global_a_high_voltage_management.dbc b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_high_voltage_management.dbc new file mode 100644 index 000000000..60729e569 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_high_voltage_management.dbc @@ -0,0 +1,196 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: +BU_: K16_BECM K114B_HPCM T18_BatteryCharger +BO_ 512 Battery_Module_1: 8 K16_BECM + SG_ Voltage_1_0_A m0 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_0_B m0 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_0_C m0 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_1_A m1 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_1_B m1 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_1_C m1 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_2_A m2 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_2_B m2 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_2_C m2 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_3_A m3 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_3_B m3 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_3_C m3 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_4_A m4 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_4_B m4 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_4_C m4 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_5_A m5 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_5_B m5 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_5_C m5 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_6_A m6 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_6_B m6 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_6_C m6 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_7_A m7 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_7_B m7 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_1_7_C m7 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Cell_Bank_Number_1 M : 55|3@0+ (1,0) [0|0] "" K16_BECM + +BO_ 514 Battery_Module_2: 8 K16_BECM + SG_ Voltage_2_0_A m0 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_0_B m0 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_0_C m0 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_1_A m1 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_1_B m1 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_1_C m1 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_2_A m2 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_2_B m2 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_2_C m2 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_3_A m3 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_3_B m3 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_3_C m3 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_4_A m4 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_4_B m4 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_4_C m4 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_5_A m5 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_5_B m5 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_5_C m5 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_6_A m6 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_6_B m6 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_6_C m6 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_7_A m7 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_7_B m7 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_2_7_C m7 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Cell_Bank_Number_2 M : 55|3@0+ (1,0) [0|0] "" K16_BECM + +BO_ 516 Battery_Module_3: 8 K16_BECM + SG_ Voltage_3_0_A m0 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_0_B m0 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_0_C m0 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_1_A m1 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_1_B m1 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_1_C m1 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_2_A m2 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_2_B m2 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_2_C m2 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_3_A m3 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_3_B m3 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_3_C m3 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_4_A m4 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_4_B m4 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_4_C m4 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_5_A m5 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_5_B m5 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_5_C m5 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_6_A m6 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_6_B m6 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_6_C m6 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_7_A m7 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_7_B m7 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_3_7_C m7 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Cell_Bank_Number_3 M : 55|3@0+ (1,0) [0|0] "" K16_BECM + +BO_ 518 Battery_Module_4: 8 K16_BECM + SG_ Voltage_4_0_A m0 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_0_B m0 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_0_C m0 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_1_A m1 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_1_B m1 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_1_C m1 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_2_A m2 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_2_B m2 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_2_C m2 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_3_A m3 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_3_B m3 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_3_C m3 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_4_A m4 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_4_B m4 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_4_C m4 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_5_A m5 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_5_B m5 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_5_C m5 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_6_A m6 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_6_B m6 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_6_C m6 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_7_A m7 : 4|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_7_B m7 : 20|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Voltage_4_7_C m7 : 39|12@0+ (0.00125,0) [0|0] "V" K16_BECM + SG_ Cell_Bank_Number_4 M : 55|3@0+ (1,0) [0|0] "" K16_BECM + +BO_ 528 Pack_Stats: 8 K16_BECM + SG_ Pack_Voltage : 7|12@0+ (0.125,0) [0|0] "V" K16_BECM + SG_ Pack_Current : 23|8@0- (0.1,-0.1) [0|0] "A" K16_BECM + +BO_ 530 Charger_stats: 6 T18_BatteryCharger + SG_ Charger_HV_Current : 7|13@0+ (0.05,0) [0|0] "A" K16_BECM + SG_ HV_Voltage : 10|10@0+ (0.5,0) [0|0] "V" K16_BECM + SG_ LV_Current : 16|8@0+ (0.2,0) [0|0] "A" K16_BECM + SG_ LV_Voltage : 24|8@0+ (0.1,0) [0|0] "V" K16_BECM + +BO_ 770 Battery_temp: 8 K16_BECM + SG_ Temp_A m0 : 8|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Temp_B m0 : 16|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Temp_C m0 : 24|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Temp_D m0 : 32|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Temp_E m0 : 40|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Temp_F m0 : 48|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Temp_G m1 : 8|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Temp_H m1 : 16|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Temp_I m1 : 24|8@1+ (0.5,-40) [0|0] "C" K16_BECM + SG_ Switch M : 2|1@1+ (1,0) [0|0] "" K16_BECM + +BO_ 782 Charger_Command: 1 T18_BatteryCharger + SG_ Command : 0|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 772 Charger_parameters: 4 T18_BatteryCharger + SG_ Unknown : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ Current : 8|8@1+ (0.05,0) [0|0] "A" Vector__XXX + SG_ Voltage : 23|16@0+ (0.5,0) [0|0] "V" Vector__XXX + +BO_ 1120 Coolant_Temp: 4 K16_BECM + SG_ Inlet_Coolant_Temp : 1|10@0+ (0.125,-40) [0|0] "" Vector__XXX + SG_ Outlet_Coolant_Temp : 17|10@0+ (0.125,-40) [0|0] "" Vector__XXX + +BO_ 778 AC_Stats: 7 T18_BatteryCharger + SG_ Mains_Voltage : 10|2@0+ (1,0) [0|0] "V" Vector__XXX + SG_ Total_Charge : 19|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 776 Charger_status: 5 T18_BatteryCharger + SG_ Status : 20|3@1+ (1,0) [0|0] "" Vector__XXX + +BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ; +BA_DEF_ BO_ "GenMsgForegroundColor" STRING ; +BA_DEF_ BO_ "isj1939dbc" INT 0 0; +BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff"; +BA_DEF_DEF_ "GenMsgForegroundColor" "#000000"; +BA_DEF_DEF_ "isj1939dbc" 0; +CM_ BU_ K16_BECM "Battery Energy Control Module"; +CM_ BU_ K114B_HPCM "Hybrid Powertrain Control Module"; +CM_ BU_ T18_BatteryCharger "Battery Charger"; +VAL_ 782 Command 1 "12V_Only" 2 "HV_Only" 3 "12V_and_HV"; +VAL_ 778 Mains_Voltage 0 "Unplugged" 1 "110V" 3 "220V"; +VAL_ 776 Status 0 "Off" 5 "LV_Only" 7 "HV_and_LV" 3 "HV_Only"; diff --git a/artifacts/package_runtime/iqdbc/dbc/gm_global_a_lowspeed.dbc b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_lowspeed.dbc new file mode 100644 index 000000000..524eeed8b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_lowspeed.dbc @@ -0,0 +1,118 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: GMLAN NEO +VAL_TABLE_ GearShifter 3 "Park" 0 "Drive/Low" ; +VAL_TABLE_ DriverDoorStatus 1 "Opened" 0 "Closed" ; +VAL_TABLE_ LKAGapButton 2 "???" 1 "??" 0 "None" ; +VAL_TABLE_ CruiseButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ; +VAL_TABLE_ CruiseControlActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ BlinkerStatus 1 "Active" 0 "Inactive" ; + + +BO_ 274923520 DriverDoorStatus: 1 GMLAN + SG_ DriverDoorOpened : 0|1@0+ (1,0) [0|0] "" NEO + +BO_ 272629760 Chime: 5 NEO + SG_ ChimeType : 7|8@0+ (1,0) [0|0] "" GMLAN + SG_ ChimeRepeat : 23|8@0+ (1,0) [0|0] "" GMLAN + SG_ ChimeDuration : 15|8@0+ (1,0) [0|0] "" GMLAN + SG_ ChimeByte5 : 39|8@0+ (1,0) [0|0] "" GMLAN + SG_ ChimeByte4 : 31|8@0+ (1,0) [0|0] "" GMLAN + +BO_ 270581760 BlinkerStatus: 5 GMLAN + SG_ RightBlinker : 6|1@0+ (1,0) [0|0] "" NEO + SG_ LeftBlinker : 7|1@0+ (1,0) [0|0] "" NEO + SG_ BlinkerLight : 25|1@0+ (1,0) [0|0] "" NEO + +BO_ 270794752 SteeringWheelAngle: 8 GMLAN + SG_ SteeringWheelAngle : 39|16@0- (0.0625,0) [-540|540] "deg" NEO + +BO_ 271368192 GearShifter: 8 GMLAN + SG_ GearShifter : 17|2@0+ (1,0) [0|3] "" NEO + +BO_ 271360000 GasPedalRegenCruise: 8 GMLAN + SG_ CruiseControlActive : 56|1@0+ (1,0) [0|0] "" GMLAN + SG_ MaxRegen : 12|1@0+ (1,0) [0|1] "" GMLAN,NEO + SG_ GasPedal : 47|8@0+ (1,0) [0|254] "" GMLAN,NEO + SG_ GearShifter2NotUsed : 55|8@0+ (1,0) [0|255] "" GMLAN,NEO + +BO_ 270860288 BrakePedal: 2 GMLAN + SG_ BrakeLevel : 2|2@0+ (1,0) [0|3] "" NEO + SG_ BrakeSensor : 15|8@0+ (1,0) [0|255] "" NEO + +BO_ 275480576 WheelSpeed: 8 GMLAN + SG_ WheelSpeedFL : 7|16@0+ (0.01,0) [0|70] "yd/s" NEO + SG_ WheelSpeedFR : 39|16@0+ (0.01,0) [0|70] "yd/s" NEO + SG_ WheelSpeedRL : 23|16@0+ (0.01,0) [0|70] "yd/s" NEO + SG_ WheelSpeedRR : 55|16@0+ (0.01,0) [0|70] "yd/s" NEO + +BO_ 270598144 VehicleSpeed: 8 GMLAN + SG_ VehicleSpeed1 : 7|16@0+ (0.01,0) [0|100] "mph" NEO + SG_ VehicleSpeed2 : 39|16@0+ (0.01,0) [0|100] "mph" NEO + +BO_ 276135936 CruiseButtons: 3 GMLAN + SG_ CruiseButtons : 3|3@0+ (1,0) [0|12] "" NEO + +BO_ 276127744 CruiseButtons2: 1 GMLAN + SG_ LKAGapButton : 1|2@0+ (1,0) [0|2] "" NEO + +BO_ 275955897 LeftRadar: 2 GMLAN + SG_ BSM_Indicator_Light : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 275980379 RightRadar: 2 GMLAN + SG_ BSM_Indicator_Light : 0|1@0+ (1,0) [0|1] "" XXX + + + +BA_DEF_ "UseGMParameterIDs" INT 0 0; +BA_DEF_ "ProtocolType" STRING ; +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "UseGMParameterIDs" 1; +BA_DEF_DEF_ "ProtocolType" "GMLAN"; +BA_DEF_DEF_ "BusType" ""; +BA_ "BusType" "CAN"; +BA_ "ProtocolType" "GMLAN"; +VAL_ 274923520 DriverDoorOpened 1 "Opened" 0 "Closed" ; +VAL_ 270581760 RightBlinker 1 "Active" 0 "Inactive" ; +VAL_ 270581760 LeftBlinker 1 "Active" 0 "Inactive" ; +VAL_ 270581760 BlinkerLight 1 "Active" 0 "Inactive" ; +VAL_ 271368192 GearShifter 3 "Park" 0 "Drive/Low" ; +VAL_ 271360000 CruiseControlActive 1 "Active" 0 "Inactive" ; +VAL_ 276135936 CruiseButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ; +VAL_ 276127744 LKAGapButton 2 "???" 1 "??" 0 "None" ; +VAL_ 275955897 BSM_Indicator_Light 0 "Disabled" 1 "Enabled"; +VAL_ 275980379 BSM_Indicator_Right 0 "Disabled" 1 "Enabled"; + diff --git a/artifacts/package_runtime/iqdbc/dbc/gm_global_a_lowspeed_1818125.dbc b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_lowspeed_1818125.dbc new file mode 100644 index 000000000..3f5b15e6f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_lowspeed_1818125.dbc @@ -0,0 +1,3993 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 2152177664 OTA_Electric_Pwr_Readiness_LS: 1 XXX + SG_ RmtRflshElecPwrRdness : 7|8@0+ (0.025,0) [0|6.375] "AmpHour" XXX + +BO_ 2152013824 Smart_High_Beam_Cust_LS: 1 XXX + SG_ SmrtHgBmAstCstSetAvail : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SmrtHgBmAstCstCurrSetVal : 7|3@0+ (1,0) [0|7] "" XXX + +BO_ 2159255552 ODI_CenterStack_2_BCM_LS: 8 XXX + SG_ ODI_CntrStck2BCM : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159247360 ODI_BCM_2_CenterStack_LS: 8 XXX + SG_ ODI_BCM2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2152046592 Remote_Climate_Control_Req_LS: 5 XXX + SG_ RmClmCtrlHMIActIndReq : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RmClmCtrlRcrcSetReq : 3|3@0+ (1,0) [0|7] "" XXX + SG_ RmClmCtrlACSetReq : 10|3@0+ (1,0) [0|7] "" XXX + SG_ RmClmCtrlFrntFanStReq : 15|5@0+ (1,0) [0|31] "" XXX + SG_ RmClmCtrlFLAirDtStReq : 19|4@0+ (1,0) [0|15] "" XXX + SG_ RmClmCtrlClmModSetReq : 23|4@0+ (1,0) [0|15] "" XXX + SG_ RmClmCtrlLtSTempStReq : 29|6@0+ (1,0) [0|63] "" XXX + SG_ RmClmCtrlRrDfgSetReq : 31|2@0+ (1,0) [0|3] "" XXX + SG_ RmClmCtrlRtSTempStReq : 37|6@0+ (1,0) [0|63] "" XXX + SG_ RmClmCtrlSyncSetReq : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 2152030208 Tuner_Frequency_Request_LS: 8 XXX + SG_ TnrFrqBndReq : 3|4@0+ (1,0) [0|15] "" XXX + SG_ TnrFrqChnlReq : 15|56@0+ (1,0) [0|1] "" XXX + +BO_ 2150531072 Regen_Power_Ind_LS: 4 XXX + SG_ RegPwrLmtdDspPrcnt : 0|9@0- (0.392157,0) [-100.392192|100.000035] "%" XXX + SG_ RegPwrLmtdDspPrcntVs : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RegPwrLmtdIO : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151833600 Heated_Wndshild_CstmrIhbt_Req_LS: 1 XXX + SG_ HtdFrntWSCustRqIhbt : 5|1@0+ (1,0) [0|1] "" XXX + SG_ HtdFrntWSDispReq : 7|2@0+ (1,0) [0|3] "" XXX + +BO_ 2151817216 Heated_Wndshild_Cstmr_Req_LS: 1 XXX + SG_ HtdFrntWSCustRq : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151849984 Seat_Level_Setting_Request_LS: 2 XXX + SG_ AutoThrmlStPasLvlStRq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ AutoThrmlStDrvLvStRq : 5|3@0+ (1,0) [0|7] "" XXX + SG_ AutoThrmlStPassMdStRq : 7|2@0+ (1,0) [0|3] "" XXX + SG_ AutoThrmlStDrvMdStRq : 15|2@0+ (1,0) [0|3] "" XXX + +BO_ 2153897984 ARB_OpMode_Customization_LS: 1 XXX + SG_ RunBrdExtdFtrAvail : 3|1@0+ (1,0) [0|1] "" XXX + SG_ RunBrdOpMdCstCurrStVal : 6|3@0+ (1,0) [0|7] "" XXX + SG_ RunBrdOpMdCstStAvail : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151702528 Lane_Keeping_Assist_LS: 2 XXX + SG_ LnKpngAstRecfblIndRq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ LnMrkngIndLft : 4|2@0+ (1,0) [0|3] "" XXX + SG_ LnKepAsstStIndLft : 7|3@0+ (1,0) [0|7] "" XXX + SG_ LnMrkngIndRgt : 12|2@0+ (1,0) [0|3] "" XXX + SG_ LnKepAsstStIndRgt : 15|3@0+ (1,0) [0|7] "" XXX + +BO_ 2156986368 PassPhrase_3_AMM_LS: 8 XXX + SG_ WiFiPssPhrsDgts17to24_Mp : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2156978176 PassPhrase_2_AMM_LS: 8 XXX + SG_ WiFiPssPhrsDgts9to16_Mp : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2156969984 PassPhrase_1_AMM_LS: 8 XXX + SG_ WiFiPssPhrsDgts1to8_Mp : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2150236160 Unlock_Key_Store_Crypt_2_LS: 8 XXX + SG_ UlckKyStrCrptoDt2Group : 4|61@0+ (1,0) [0|0] "" XXX + SG_ UlckKyStrCrptoDt2 : 3|60@0+ (1,0) [0|1.15292150460685E+018] "" XXX + SG_ UlckKyStrCrptoDt2M : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150170624 Unlock_Key_Store_Crypt_1_LS: 8 XXX + SG_ UlckKyStrCrptoDt1Group : 4|61@0+ (1,0) [0|0] "" XXX + SG_ UlckKyStrCrptoDt1 : 3|60@0+ (1,0) [0|1.15292150460685E+018] "" XXX + SG_ UlckKyStrCrptoDt1M : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155126784 Drvr_Seat_Rearward_Movmnt_LS: 1 XXX + SG_ DrvrSetRrwrdMvmnt : 7|3@0+ (1,0) [0|7] "" XXX + +BO_ 2154725376 Auxiliary_Heater_LS: 1 XXX + SG_ AuxHtrAtv378 : 6|1@0+ (1,0) [0|1] "" XXX + SG_ AuxHtrRq : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2157051904 WiFi_Station_AMM_LS: 5 XXX + SG_ WiFiStatnMpReq : 1|34@0+ (1,0) [0|0] "" XXX + SG_ WSMR_WiFiAssnReq : 1|2@0+ (1,0) [0|3] "" XXX + SG_ WSMR_WiFiStnMpMACAddr : 15|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2156994560 WiFi_AP_Data_AMM_LS: 2 XXX + SG_ WiFiAccsPntData_Mp : 0|9@0+ (1,0) [0|0] "" XXX + SG_ WAPDM_WiFiEnStat : 0|1@0+ (1,0) [0|1] "" XXX + SG_ WAPDM_EncrptnType : 11|4@0+ (1,0) [0|15] "" XXX + SG_ WAPDM_SecurityType : 15|4@0+ (1,0) [0|15] "" XXX + +BO_ 2158133248 Hill_Top_Customization_LS: 6 XXX + SG_ HTRCsStAvail : 0|1@0+ (1,0) [0|1] "" XXX + SG_ HTRCsAvail : 7|7@0+ (1,0) [0|0] "" XXX + SG_ HTRCA_Res3Avail : 1|1@0+ (1,0) [0|1] "" XXX + SG_ HTRCA_Res2Avail : 2|1@0+ (1,0) [0|1] "" XXX + SG_ HTRCA_Res1Avail : 3|1@0+ (1,0) [0|1] "" XXX + SG_ HTRCA_OnAwAvail : 4|1@0+ (1,0) [0|1] "" XXX + SG_ HTRCA_OnHmAvail : 5|1@0+ (1,0) [0|1] "" XXX + SG_ HTRCA_OnAvail : 6|1@0+ (1,0) [0|1] "" XXX + SG_ HTRCA_OffAvail : 7|1@0+ (1,0) [0|1] "" XXX + SG_ HTRCsCrStVal : 10|3@0+ (1,0) [0|7] "" XXX + SG_ HVDpltnMdMxCnfdcRgExt : 21|14@0+ (0.1,0) [0|1638.3] "km" XXX + SG_ HVDpltnMdMiCnfdcRgExt : 37|14@0+ (0.1,0) [0|1638.3] "km" XXX + +BO_ 2154651648 Telematics_Audio_Control_LS: 1 XXX + SG_ TeleAudCtl : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TAC_AudConctOutcm : 3|4@0+ (1,0) [0|15] "" XXX + SG_ TAC_AudChConctStat : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 2154635264 Telematics_Audio_Request_LS: 1 XXX + SG_ TeleAudReq : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TAR_AudSrcStat : 3|4@0+ (1,0) [0|15] "" XXX + SG_ TAR_AudConctReq : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 2152529920 LVM_Audio_Video_Command_LS: 2 XXX + SG_ LowVolModAudVidCmd : 5|14@0+ (1,0) [0|0] "" XXX + SG_ LVMAVC_StreoAudRsp : 0|2@0+ (1,0) [0|3] "" XXX + SG_ LVMAVC_PrmtAudRsp : 2|2@0+ (1,0) [0|3] "" XXX + SG_ LVMAVC_RemtEnbl : 5|3@0+ (1,0) [0|7] "" XXX + SG_ LVMAVC_SpchRcgnAval : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LVMAVC_RemSpchRcgnActn : 11|2@0+ (1,0) [0|3] "" XXX + SG_ LVMAVC_RemSpchRcgnID : 14|3@0+ (1,0) [0|7] "" XXX + +BO_ 2152513536 LVM_Audio_Video_Req_LS: 2 XXX + SG_ LowVolModAudVidReq : 0|9@0+ (1,0) [0|0] "" XXX + SG_ LVMAVR_DispReq : 0|3@0+ (1,0) [0|7] "" XXX + SG_ LVMAVR_SpchRcgnAct : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LVMAVR_PrmtAudReq : 11|2@0+ (1,0) [0|3] "" XXX + SG_ LVMAVR_StreoAudReq : 13|2@0+ (1,0) [0|3] "" XXX + +BO_ 2154889216 Cluster_HMI_Animation_Req_LS: 1 XXX + SG_ ClstrHMIAnmReq : 7|3@0+ (1,0) [0|7] "" XXX + +BO_ 2154872832 Infotainment_Activation_Req_LS: 1 XXX + SG_ RmRflshUpdtAvail : 6|1@0+ (1,0) [0|1] "" XXX + SG_ InfoActvnReq : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2156961792 SSID_AMM_3_LS: 8 XXX + SG_ WiFiSSIDDgts17to24_Mp : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2154569728 Infotainment_System_State_LS: 1 XXX + SG_ InfotnmntSysSt : 7|5@0+ (1,0) [0|31] "" XXX + +BO_ 2151931904 Custom_Launch_Ctrl_LS: 8 XXX + SG_ LnchCtrlMdStat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ LnchCtrlWhlSlpStat : 7|5@0+ (1,0) [0|31] "" XXX + SG_ PTExPrtclFltWrng3IO : 8|1@0+ (1,0) [0|1] "" XXX + SG_ AWDRecmndIO : 9|1@0+ (1,0) [0|1] "" XXX + SG_ LnchCtrlEngRPMStat : 15|6@0+ (1,0) [0|63] "" XXX + SG_ ACCSysSltdMd : 17|2@0+ (1,0) [0|3] "" XXX + SG_ VehSpdCntlSystmType : 20|3@0+ (1,0) [0|7] "" XXX + SG_ PTExPartFltManRegStat : 23|3@0+ (1,0) [0|7] "" XXX + SG_ TCSTempDsblReqIO : 24|1@0+ (1,0) [0|1] "" XXX + SG_ VehStbCmptvMdCstAvl : 25|1@0+ (1,0) [0|1] "" XXX + SG_ VehStbEnmntCstAvl : 26|1@0+ (1,0) [0|1] "" XXX + SG_ TCSysCstAvl : 27|1@0+ (1,0) [0|1] "" XXX + SG_ VehStbCmptvMdCurSt : 28|1@0+ (1,0) [0|1] "" XXX + SG_ ElctShfPriLtdPerfMdIO : 29|1@0+ (1,0) [0|1] "" XXX + SG_ RegVltCtlEngyRcvryAct : 30|1@0+ (1,0) [0|1] "" XXX + SG_ ACCSysSltdMdDispIO : 31|1@0+ (1,0) [0|1] "" XXX + SG_ LnchCtrlTmrVal : 35|4@0+ (1,0) [0|15] "" XXX + SG_ VehStbEnhmntCurSt : 36|1@0+ (1,0) [0|1] "" XXX + SG_ TCSysCurSt : 37|1@0+ (1,0) [0|1] "" XXX + SG_ TracAndStbScrnCnfg : 39|2@0+ (1,0) [0|3] "" XXX + SG_ BiFuelRflGaslinIndReq : 42|3@0+ (1,0) [0|7] "" XXX + SG_ AutoShtdwnIO : 43|1@0+ (1,0) [0|1] "" XXX + SG_ LnchCtrlBrkPresVal : 47|4@0+ (10,0) [0|150] "%" XXX + SG_ AutoShtdwnTmr : 55|8@0+ (1,0) [0|255] "min" XXX + SG_ FuelMdTrnstnIndReq : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2150244352 HMI_EngyConsmpHistGrph_1_LS: 8 XXX + SG_ EngyCnsHsGrphDspDtVal : 7|55@0+ (1,0) [0|0] "" XXX + SG_ ECHGDDV_Col1 : 2|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_EngyConsAvg : 7|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col3 : 8|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col2 : 13|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col4 : 19|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col6 : 25|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col5 : 30|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col7 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col9 : 42|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col8 : 47|5@0+ (1,0) [0|31] "" XXX + SG_ ECHGDDV_Col10 : 53|5@0+ (1,0) [0|31] "" XXX + +BO_ 2156953600 SSID_AMM_2_LS: 8 XXX + SG_ WiFiSSIDDgts9to16_Mp : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2151686144 SD_Card_LS: 2 XXX + SG_ SDCrdFullIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SDCrdErrIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ NoSDCrdPrIO : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155028480 Lane_Change_Threat_LS: 2 XXX + SG_ RgtLnChgThrt : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RtLnChngThrtAprchSpd : 15|8@0- (1,0) [-128|127] "km/h" XXX + +BO_ 2151915520 HMI_Display_LS: 8 XXX + SG_ AHDisbldDrOpnIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ AHDisbldStbltIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ AHAppBrkPedlIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ AHServcIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ShfToPrkBfExtngIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ AHEnbld : 5|1@0+ (1,0) [0|1] "" XXX + SG_ AHAct : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ESPDrvrIlkShfAtdIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ESPTransMalfIO : 9|1@0+ (1,0) [0|1] "" XXX + SG_ ESPRngInvldReqIO : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ESPPrkInvldReqIO : 11|1@0+ (1,0) [0|1] "" XXX + SG_ ESPHldShfLvrToEngRgIO : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ESPDrvrPrkIlkSftAtdIO : 13|1@0+ (1,0) [0|1] "" XXX + SG_ EngIntkArBstPrExtRngGroup : 14|15@0+ (1,0) [0|0] "" XXX + SG_ EngIntkArBstPrExtRng : 8|9@0+ (1,-110) [-110|401] "kPa" XXX + SG_ EngIntkArBstPrExtRngV : 14|1@0+ (1,0) [0|1] "" XXX + SG_ ElcTransRngSlctVDA : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ElecShfRngDispRCExtd : 27|4@0+ (1,0) [0|15] "" XXX + SG_ ElecShfRngDisp : 31|4@0+ (1,0) [0|15] "" XXX + SG_ DrvEffInd : 39|8@0- (0.78125,0) [-100|99.21875] "%" XXX + SG_ ESPShfToDrvTryAgnIO : 43|1@0+ (1,0) [0|1] "" XXX + SG_ ESPTrnVehOffFrPrkIO : 44|1@0+ (1,0) [0|1] "" XXX + SG_ ESPTrnsCtlrMalfIO : 45|1@0+ (1,0) [0|1] "" XXX + SG_ ElcShfPriTwoGrsSlInRq : 47|2@0+ (1,0) [0|3] "" XXX + +BO_ 2152153088 Right_Rear_Seat_Display_Stats_LS: 6 XXX + SG_ RRStCtlDispStat : 3|44@0+ (1,0) [0|0] "" XXX + SG_ RRSCDS_MassgTyp : 1|4@0+ (1,0) [0|15] "" XXX + SG_ RRSCDS_Massg : 3|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_HdrstFwdRrwd : 8|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_HdrstUpDn : 10|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_MassgIntsty : 13|3@0+ (1,0) [0|7] "" XXX + SG_ RRSCDS_HdrstTltFwdRr : 17|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_HdrstWngInOt : 19|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_HdrstFdRrUDn : 22|3@0+ (1,0) [0|7] "" XXX + SG_ RRSCDS_LmbrUDnFdRr : 25|3@0+ (1,0) [0|7] "" XXX + SG_ RRSCDS_LmbrFwdRr : 27|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_LmbrUpDwn : 29|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_UprShldrFdRr : 31|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_BkCshBlstInOt : 34|3@0+ (1,0) [0|7] "" XXX + SG_ RRSCDS_CshBlstrInOut : 36|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_BkBlstrInOut : 38|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_UnsdRsrvd : 42|3@0+ (1,0) [0|7] "" XXX + SG_ RRSCDS_DispReq : 43|1@0+ (1,0) [0|1] "" XXX + SG_ RRSCDS_DispSz : 45|2@0+ (1,0) [0|3] "" XXX + SG_ RRSCDS_CshLgAdjFdRr : 47|2@0+ (1,0) [0|3] "" XXX + +BO_ 2152136704 Right_Rear_Seat_Massage_LS: 8 XXX + SG_ RRStMassgPrty : 7|64@0+ (1,0) [0|0] "" XXX + SG_ RRSMP_Type2 : 3|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type1 : 7|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type4 : 11|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type3 : 15|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type6 : 19|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type5 : 23|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type8 : 27|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type7 : 31|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type10 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type9 : 39|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type12 : 43|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type11 : 47|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type14 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_Type13 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ RRSMP_UnsdRsrvd : 56|1@0+ (1,0) [0|1] "" XXX + SG_ RRSMP_MaxDispVal : 59|3@0+ (1,0) [0|7] "" XXX + SG_ RRSMP_Type15 : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2152120320 Right_Rear_Seat_Actuator_LS: 8 XXX + SG_ RRStActPrty : 7|64@0+ (1,0) [0|0] "" XXX + SG_ RRSAP_HdrstUpDn : 3|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_Massg : 7|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_HdrstUpDnFdRr : 11|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_HdrstFwdRrwd : 15|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_HdrstTltFwdRr : 19|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_HdrstWngsInOut : 23|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_LmbrUpDwn : 27|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_UprShldrFwdRr : 31|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_LmbrUpDnFdRr : 35|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_LmbrFwdRr : 39|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_CshBlstrInOut : 43|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_BkBlstrInOut : 47|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_CshLgthAdjFdRr : 51|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_BkCshBlstrInOut : 55|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_UnsdRsrvd : 59|4@0+ (1,0) [0|15] "" XXX + SG_ RRSAP_DispSz : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2152103936 Left_Rear_Seat_Display_Status_LS: 6 XXX + SG_ LRStCtlDispStat : 3|44@0+ (1,0) [0|0] "" XXX + SG_ LRSCDS_MassgTyp : 1|4@0+ (1,0) [0|15] "" XXX + SG_ LRSCDS_Massg : 3|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_HdrstFwdRrwd : 8|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_HdrstUpDn : 10|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_MassgIntsty : 13|3@0+ (1,0) [0|7] "" XXX + SG_ LRSCDS_HdrstTltFwdRr : 17|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_HdrstWngInOt : 19|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_HdrstFdRrUDn : 22|3@0+ (1,0) [0|7] "" XXX + SG_ LRSCDS_LmbrUDnFdRr : 25|3@0+ (1,0) [0|7] "" XXX + SG_ LRSCDS_LmbrFwdRr : 27|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_LmbrUpDwn : 29|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_UprShldrFdRr : 31|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_BkCshBlstInOt : 34|3@0+ (1,0) [0|7] "" XXX + SG_ LRSCDS_CshBlstrInOut : 36|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_BkBlstrInOut : 38|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_UnsdRsrvd : 42|3@0+ (1,0) [0|7] "" XXX + SG_ LRSCDS_DispReq : 43|1@0+ (1,0) [0|1] "" XXX + SG_ LRSCDS_DispSz : 45|2@0+ (1,0) [0|3] "" XXX + SG_ LRSCDS_CshLgAdjFdRr : 47|2@0+ (1,0) [0|3] "" XXX + +BO_ 2152087552 Left_Rear_Seat_Massage_LS: 8 XXX + SG_ LRStMassgPrty : 7|64@0+ (1,0) [0|0] "" XXX + SG_ LRSMP_Type2 : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type1 : 7|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type4 : 11|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type3 : 15|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type6 : 19|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type5 : 23|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type8 : 27|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type7 : 31|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type10 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type9 : 39|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type12 : 43|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type11 : 47|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type14 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_Type13 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ LRSMP_UnsdRsrvd : 56|1@0+ (1,0) [0|1] "" XXX + SG_ LRSMP_MaxDispVal : 59|3@0+ (1,0) [0|7] "" XXX + SG_ LRSMP_Type15 : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2152071168 Left_Rear_Seat_Actuator_LS: 8 XXX + SG_ LRStActPrty : 7|64@0+ (1,0) [0|0] "" XXX + SG_ LRSAP_HdrstUpDn : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_Massg : 7|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_HdrstUpDnFdRr : 11|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_HdrstFwdRrwd : 15|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_HdrstTltFwdRr : 19|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_HdrstWngsInOut : 23|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_LmbrUpDwn : 27|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_UprShldrFwdRr : 31|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_LmbrUpDnFdRr : 35|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_LmbrFwdRr : 39|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_CshBlstrInOut : 43|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_BkBlstrInOut : 47|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_CshLgthAdjFdRr : 51|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_BkCshBlstrInOut : 55|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_UnsdRsrvd : 59|4@0+ (1,0) [0|15] "" XXX + SG_ LRSAP_DispSz : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2153947136 Remote_Reflash_Stat_LS: 1 XXX + SG_ RmtRflshMdAct : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2152628224 OnBoard_Tester_Response_LS: 2 XXX + SG_ OBTCResp : 2|11@0+ (1,0) [0|0] "" XXX + SG_ OBTCR_Stat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ OBTCR_ReqstrID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ OBTCMstrStat : 5|3@0+ (1,0) [0|7] "" XXX + +BO_ 2152112128 Performanc_Mode_Vis_Scrn_Stat_LS: 5 XXX + SG_ PerfMdVislztnScrnStat : 0|33@0+ (1,0) [0|0] "" XXX + SG_ PMVSS_Snd : 0|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_Trans : 10|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_Eng : 13|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_Drvln : 17|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_Susp : 20|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_Strng : 23|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_PsngrSeat : 24|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_DrvrSeat : 27|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_AdptCrsCnt : 30|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_Disps : 34|3@0+ (1,0) [0|7] "" XXX + SG_ PMVSS_Exhst : 37|3@0+ (1,0) [0|7] "" XXX + SG_ PerfMdMainMenuType : 3|3@0+ (1,0) [0|7] "" XXX + +BO_ 2152775680 Front_360_Camera_On_LS: 3 XXX + SG_ DispFrt360CamOn : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RrPedDetCstStAvl : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RrPedDetCstStVal : 4|3@0+ (1,0) [0|7] "" XXX + SG_ RrPdDetHptcStVbRqSeqN : 6|2@0+ (1,0) [0|3] "" XXX + SG_ TrgdVidRecFetrPrsnt : 7|1@0+ (1,0) [0|1] "" XXX + SG_ RrPdDetHptcStVbRq : 13|6@0+ (1,0) [0|63] "Pulse" XXX + SG_ DispTrgdVidOn : 14|1@0+ (1,0) [0|1] "" XXX + SG_ a_360DegVidFetrPrsnt : 15|1@0+ (1,0) [0|1] "" XXX + SG_ DispSmrtTwVidOn : 16|1@0+ (1,0) [0|1] "" XXX + SG_ RrPedDetCstAvail : 23|7@0+ (1,0) [0|0] "" XXX + SG_ RPDCA_Resrv3Avail : 17|1@0+ (1,0) [0|1] "" XXX + SG_ RPDCA_Resrv2Avail : 18|1@0+ (1,0) [0|1] "" XXX + SG_ RPDCA_Resrv1Avail : 19|1@0+ (1,0) [0|1] "" XXX + SG_ RPDCA_AlrtBrkAvail : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RPDCA_AlrtAvail : 21|1@0+ (1,0) [0|1] "" XXX + SG_ RPDCA_OnAvail : 22|1@0+ (1,0) [0|1] "" XXX + SG_ RPDCA_OfAvail : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 2153857024 Teen_Driver_Event_Report_2_LS: 8 XXX + SG_ TnDrvRptCrdAvlDspDat : 6|13@0+ (1,0) [0|0] "" XXX + SG_ TDRCADD_FCHdwyAlrt : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_ABSAtvEvt : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_StCtrlEvnts : 2|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_TrCtrlEvnts : 3|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_OvSpdEvnt : 4|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_DistDrvn : 5|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_MaxSpd : 6|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_LDWEvnts : 10|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_WOTEvnts : 11|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_DrwDrvAlrt : 12|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_FCMBrEvts : 13|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_RCMBrEvts : 14|1@0+ (1,0) [0|1] "" XXX + SG_ TDRCADD_FCImntAlrts : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TeenDrvWOTEvntsRpt : 9|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TnDrvABSAtvEvntsRpt : 31|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TnDrvStblCtrlEvntsRpt : 37|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TnDrvDrowDrvAlrtsRpt : 43|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TnDrvTrCtrlEvntsRpt : 49|10@0+ (1,0) [0|1023] "counts" XXX + +BO_ 2153865216 Teen_Driver_Customization_Req_LS: 4 XXX + SG_ TeenDrvReq : 3|4@0+ (1,0) [0|15] "" XXX + SG_ TDOvSpdWrnCstStReq : 12|5@0+ (1,0) [0|0] "" XXX + SG_ TDOWCSR_DecSwAct : 8|1@0+ (1,0) [0|1] "" XXX + SG_ TDOWCSR_IncSwAct : 9|1@0+ (1,0) [0|1] "" XXX + SG_ TDOWCSR_StatReq : 12|3@0+ (1,0) [0|7] "" XXX + SG_ TnDrvSpdLmtCstStReq : 15|3@0+ (1,0) [0|7] "" XXX + SG_ TeenDrvPinCd : 23|16@0+ (1,0) [0|39321] "" XXX + +BO_ 2153840640 Teen_Driver_Event_Report_1_LS: 8 XXX + SG_ TDFwdClnHdwyAlrtsRpt : 5|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TnDrvDRLOffUnbIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvALCOffUnbIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ TDFwdClnImntAlrtsRpt : 11|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TDFwdClnMtgnBrEvRpt : 17|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TDRevClnMtgnBrEvRpt : 39|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TeenDrvMaxSpdRpt : 45|12@0+ (0.0625,0) [0|255.9375] "km/h" XXX + SG_ TeenDrvLDWEvntsRpt : 49|10@0+ (1,0) [0|1023] "counts" XXX + +BO_ 2153824256 Teen_Driver_Control_Info_LS: 8 XXX + SG_ TnDrvSpdLmtCstCrStVl : 2|11@0+ (1,0) [0|0] "" XXX + SG_ TDSLCCSV_SpLmtStat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ TDSLCCSV_SpLmDisVl : 15|8@0+ (2,0) [0|510] "km/h" XXX + SG_ TnDrvSpdLmtCstStAvl : 3|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvOvrSpdIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvGapAdjUnbIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ TeenDrvPINStrd : 6|1@0+ (1,0) [0|1] "" XXX + SG_ TeenDrvFtrAvl : 7|1@0+ (1,0) [0|1] "" XXX + SG_ TDOvSpdWrnCstCrStVl : 22|15@0+ (1,0) [0|0] "" XXX + SG_ TDOWCCSV_CrStVl : 19|12@0+ (0.0625,0) [0|255.9375] "km/h" XXX + SG_ TDOWCCSV_CrStat : 22|3@0+ (1,0) [0|7] "" XXX + SG_ TDOvSpdWrnCstStAvl : 23|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvOvSpdEvntsRpt : 33|10@0+ (1,0) [0|1023] "counts" XXX + SG_ TeenDrvRsp : 37|4@0+ (1,0) [0|15] "" XXX + SG_ TeenDrvAct : 38|1@0+ (1,0) [0|1] "" XXX + SG_ TeenDrvAccelLimIO : 39|1@0+ (1,0) [0|1] "" XXX + SG_ TeenDrvDistDrvnRpt : 55|16@0+ (1,0) [0|65535] "km" XXX + +BO_ 2155151360 Psngr_Seat_Massage_Priority_LS: 8 XXX + SG_ PsngrStMassgPrty : 7|64@0+ (1,0) [0|0] "" XXX + SG_ PSMP_Type2 : 3|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type1 : 7|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type4 : 11|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type3 : 15|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type6 : 19|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type5 : 23|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type8 : 27|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type7 : 31|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type10 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type9 : 39|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type12 : 43|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type11 : 47|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type14 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_Type13 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ PSMP_UnsdRsrvd : 56|1@0+ (1,0) [0|1] "" XXX + SG_ PSMP_MaxDispVal : 59|3@0+ (1,0) [0|7] "" XXX + SG_ PSMP_Type15 : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2155134976 Psngr_Seat_Control_Disp_Stat_LS: 6 XXX + SG_ PsngrStCtlDispStat : 3|44@0+ (1,0) [0|0] "" XXX + SG_ PSCDS_MassgTyp : 1|4@0+ (1,0) [0|15] "" XXX + SG_ PSCDS_Massg : 3|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_HdrstFwdRrwd : 8|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_HdrstUpDn : 10|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_MassgIntsty : 13|3@0+ (1,0) [0|7] "" XXX + SG_ PSCDS_HdrstTltFwdRr : 17|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_HdrstWngInOt : 19|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_HdrstUDnFdRr : 22|3@0+ (1,0) [0|7] "" XXX + SG_ PSCDS_LmbrUDnFdRr : 25|3@0+ (1,0) [0|7] "" XXX + SG_ PSCDS_LmbrFwdRr : 27|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_LmbrUpDwn : 29|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_UprShldrFdRr : 31|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_BkCshBlstInOt : 34|3@0+ (1,0) [0|7] "" XXX + SG_ PSCDS_CshBlstrInOut : 36|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_BkBlstrInOut : 38|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_UnsdRsrvd : 42|3@0+ (1,0) [0|7] "" XXX + SG_ PSCDS_DispReq : 43|1@0+ (1,0) [0|1] "" XXX + SG_ PSCDS_DispSz : 45|2@0+ (1,0) [0|3] "" XXX + SG_ PSCDS_CshLgAdjFdRr : 47|2@0+ (1,0) [0|3] "" XXX + SG_ PsngrSetRrwdMvmnt : 6|3@0+ (1,0) [0|7] "" XXX + +BO_ 2155118592 Psngr_Seat_Actuator_Priority_LS: 8 XXX + SG_ PsngrStActPrty : 7|64@0+ (1,0) [0|0] "" XXX + SG_ PSAP_HdrstUpDn : 3|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_Massg : 7|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_HdrstUpDnFdRr : 11|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_HdrstFwdRrwd : 15|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_HdrstTltFwdRr : 19|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_HdrstWngsInOut : 23|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_LmbrUpDwn : 27|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_UprShldrFwdRr : 31|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_LmbrUpDnFdRr : 35|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_LmbrFwdRr : 39|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_CshBlstrInOut : 43|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_BkBlstrInOut : 47|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_CshLgthAdjFdRr : 51|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_BkCshBlstrInOut : 55|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_UnsdRsrvd : 59|4@0+ (1,0) [0|15] "" XXX + SG_ PSAP_DispSz : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2155102208 Driver_Seat_Massage_Priority_LS: 8 XXX + SG_ DrvStMassgPrty : 7|64@0+ (1,0) [0|0] "" XXX + SG_ DSMP_Type2 : 3|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type1 : 7|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type4 : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type3 : 15|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type6 : 19|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type5 : 23|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type8 : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type7 : 31|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type10 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type9 : 39|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type12 : 43|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type11 : 47|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type14 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_Type13 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ DSMP_UnsdRsrvd : 56|1@0+ (1,0) [0|1] "" XXX + SG_ DSMP_MaxDispVal : 59|3@0+ (1,0) [0|7] "" XXX + SG_ DSMP_Type15 : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2155085824 Driver_Seat_Control_Disp_Stat_LS: 8 XXX + SG_ DrvStCtlDispStat : 3|44@0+ (1,0) [0|0] "" XXX + SG_ DSCDS_MassgTyp : 1|4@0+ (1,0) [0|15] "" XXX + SG_ DSCDS_Massg : 3|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_HdrstFwdRrwd : 8|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_HdrstUpDn : 10|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_MassgIntsty : 13|3@0+ (1,0) [0|7] "" XXX + SG_ DSCDS_HdrstTltFwdRr : 17|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_HdrstWngInOt : 19|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_HdrstUDnFdRr : 22|3@0+ (1,0) [0|7] "" XXX + SG_ DSCDS_LmbrUDnFdRr : 25|3@0+ (1,0) [0|7] "" XXX + SG_ DSCDS_LmbrFwdRr : 27|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_LmbrUpDwn : 29|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_UprShldrFdRr : 31|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_BkCshBlstInOt : 34|3@0+ (1,0) [0|7] "" XXX + SG_ DSCDS_CshBlstrInOut : 36|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_BkBlstrInOut : 38|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_UnsdRsrvd : 42|3@0+ (1,0) [0|7] "" XXX + SG_ DSCDS_DispReq : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DSCDS_DispSz : 45|2@0+ (1,0) [0|3] "" XXX + SG_ DSCDS_CshLgAdjFdRr : 47|2@0+ (1,0) [0|3] "" XXX + SG_ CPMAPINFO4 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ StrgColCommsFlt : 7|2@0+ (1,0) [0|3] "" XXX + SG_ StrgColInOutPos : 55|8@0+ (1,0) [0|255] "" XXX + SG_ StrgColUpDwnPos : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2155069440 Driver_Seat_Actuator_Priority_LS: 8 XXX + SG_ DrvStActPrty : 7|64@0+ (1,0) [0|0] "" XXX + SG_ DSAP_HdrstUpDn : 3|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_Massg : 7|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_HdrstUpDnFdRr : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_HdrstFwdRrwd : 15|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_HdrstTltFwdRr : 19|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_HdrstWngsInOut : 23|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_LmbrUpDwn : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_UprShldrFwdRr : 31|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_LmbrUpDnFdRr : 35|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_LmbrFwdRr : 39|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_CshBlstrInOut : 43|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_BkBlstrInOut : 47|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_CshLgthAdjFdRr : 51|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_BkCshBlstrInOut : 55|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_UnsdRsrvd : 59|4@0+ (1,0) [0|15] "" XXX + SG_ DSAP_DispSz : 63|4@0+ (1,0) [0|15] "" XXX + +BO_ 2156937216 PassPhrase_Digits_17_to_24_LS: 8 XXX + SG_ WiFiPssPhrsDgts17to24 : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2156929024 PassPhrase_Digits_9_to_16_LS: 8 XXX + SG_ WiFiPssPhrsDgts9to16 : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2156920832 PassPhrase_Digits_1_to_8_LS: 8 XXX + SG_ WiFiPssPhrsDgts1to8 : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2156871680 SSID_Digits_17_to_24_LS: 8 XXX + SG_ WiFiSSIDDgts17to24 : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2156863488 SSID_Digits_9_to_16_LS: 8 XXX + SG_ WiFiSSIDDgts9to16 : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2156855296 SSID_Digits_1_to_8_LS: 8 XXX + SG_ WiFiSSIDDgts1to8 : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2152480768 Perfr_Data_Recorder_Lap_Info_LS: 6 XXX + SG_ PerfDatRecBstLpInfo : 2|19@0+ (1,0) [0|0] "" XXX + SG_ PDRBLI_BstLpTmMins : 2|6@0+ (1,0) [0|63] "min" XXX + SG_ PDRBLI_BstLpTmSecs : 12|6@0+ (1,0) [0|63] "sec" XXX + SG_ PDRBLI_BstLpTm100s : 22|7@0+ (0.01,0) [0|1.27] "sec" XXX + SG_ PerfDatRecLstLpInfo : 26|19@0+ (1,0) [0|0] "" XXX + SG_ PDRLLI_LstLpTmMins : 26|6@0+ (1,0) [0|63] "min" XXX + SG_ PDRLLI_LstLpTmSecs : 36|6@0+ (1,0) [0|63] "sec" XXX + SG_ PDRLLI_LstLpTm100s : 46|7@0+ (0.01,0) [0|1.27] "sec" XXX + +BO_ 2152497152 Perf_Data_Recroder_RT_Info_LS: 4 XXX + SG_ PerfDatRecRltmInfo : 1|26@0+ (1,0) [0|0] "" XXX + SG_ PDRRI_CrLpTmMins : 1|6@0+ (1,0) [0|63] "min" XXX + SG_ PDRRI_CrLpTmSecs : 11|6@0+ (1,0) [0|63] "" XXX + SG_ PDRRI_LpDiffTmSecs : 17|6@0+ (1,0) [0|63] "sec" XXX + SG_ PDRRI_CrLpTm10sSec : 21|4@0+ (0.1,0) [0|1.5] "sec" XXX + SG_ PDRRI_LpDiffTm10s : 27|4@0+ (0.1,0) [0|1.5] "sec" XXX + +BO_ 2153791488 ARB_State_LS: 1 XXX + SG_ ArtcldRngBrdSt : 2|3@0+ (1,0) [0|7] "" XXX + +BO_ 2149883904 BluetoothTetheringPairingRsp_LS: 7 XXX + SG_ BTTethrngPrngRsp : 4|53@0+ (1,0) [0|0] "" XXX + SG_ BTPR_RspInfoAvail : 0|1@0+ (1,0) [0|1] "" XXX + SG_ BTPR_RspStat : 4|4@0+ (1,0) [0|15] "" XXX + SG_ BTPR_RspVal : 15|48@0+ (1,0) [0|281474976710655] "" XXX + +BO_ 2150252544 HMI_EngyConsmpHistGrph_LS: 8 XXX + SG_ EngyConsmpHistGrph : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ECHG_EngyCnsmdAvg : 4|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_MeasUnit : 7|3@0+ (1,0) [0|7] "" XXX + SG_ ECHG_Column02 : 10|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column01 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column04 : 16|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column03 : 21|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column05 : 27|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column07 : 33|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column06 : 38|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column08 : 44|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column10 : 50|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_Column09 : 55|5@0+ (1,0) [0|31] "" XXX + SG_ ECHG_YAxisMaxVal : 58|3@0+ (1,0) [0|7] "" XXX + SG_ ECHG_XAxisTkMrkIntvl : 61|3@0+ (1,0) [0|7] "" XXX + +BO_ 2150391808 HMI_Hourmeter_Data_LS: 6 XXX + SG_ EngIdlAtvTm : 7|24@0+ (1,0) [0|16777215] "min" XXX + SG_ EngRunAtvTm : 31|24@0+ (1,0) [0|16777215] "min" XXX + +BO_ 2155913216 Diesel_Information_2_LS: 7 XXX + SG_ DslExhFldRmngDstHRsGroup : 7|16@0+ (1,0) [0|0] "" XXX + SG_ DslExhFldRmngDstHRs : 6|15@0+ (2,0) [0|65534] "km" XXX + SG_ DslExhFldRmngDstHRsV : 7|1@0+ (1,0) [0|1] "" XXX + SG_ DslExhFluidLvlPrcntGroup : 16|9@0+ (1,0) [0|0] "" XXX + SG_ DslExhFluidLvlPrcntV : 16|1@0+ (1,0) [0|1] "" XXX + SG_ DslExhFluidLvlPrcnt : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ DslEmnsOBDMrkt : 18|2@0+ (1,0) [0|3] "" XXX + SG_ PedFrndlyAlrtCsCrStVal : 21|3@0+ (1,0) [0|7] "" XXX + SG_ PedFrndlyAlrtCsSetAvl : 22|1@0+ (1,0) [0|1] "" XXX + SG_ PedFrndlyAlrtStat : 39|24@0+ (1,0) [0|0] "" XXX + SG_ PFAS_PFACrsOvrSpd : 34|8@0+ (1,0) [0|255] "km/h" XXX + SG_ PFAS_PFARevSnd : 36|2@0+ (1,0) [0|3] "" XXX + SG_ PFAS_PFAFwdSnd : 38|2@0+ (1,0) [0|3] "" XXX + SG_ PFAS_PFASndGenEn : 39|1@0+ (1,0) [0|1] "" XXX + SG_ PFAS_PFASndVolCtrl : 42|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ PFAS_SrvPedAlrtIO : 48|1@0+ (1,0) [0|1] "" XXX + SG_ PFAS_PFASysStat : 50|2@0+ (1,0) [0|3] "" XXX + +BO_ 2034 CCP_Data_Transmission_Object_LS: 8 XXX + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2032 CCP_Command_Receive_Object_LS: 8 XXX + SG_ DgnInf : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2152095744 HSGMLAN_Customization_Setings_LS: 5 XXX + SG_ DrvlnPerfMdCustAvl : 5|6@0+ (1,0) [0|0] "" XXX + SG_ DPMCA_DrvlPrfMd6Avl : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DrvlPrfMd5Avl : 1|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DrvlPrfMd4Avl : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DrvlPrfMd3Avl : 3|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DrvlPrfMd2Avl : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DrvlPrfMd1Avl : 5|1@0+ (1,0) [0|1] "" XXX + SG_ DispPerfCustMdAvl : 13|6@0+ (1,0) [0|0] "" XXX + SG_ DPMCA_DispPrfMd6Avl : 8|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DispPrfMd5Avl : 9|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DispPrfMd4Avl : 10|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DispPrfMd3Avl : 11|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DispPrfMd2Avl : 12|1@0+ (1,0) [0|1] "" XXX + SG_ DPMCA_DispPrfMd1Avl : 13|1@0+ (1,0) [0|1] "" XXX + SG_ SndPerfMdCustAvl : 21|6@0+ (1,0) [0|0] "" XXX + SG_ SPMCA_SndPrfMd6Avl : 16|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SndPrfMd5Avl : 17|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SndPrfMd4Avl : 18|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SndPrfMd3Avl : 19|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SndPrfMd2Avl : 20|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SndPrfMd1Avl : 21|1@0+ (1,0) [0|1] "" XXX + SG_ StrPerfMdCustAvl : 29|6@0+ (1,0) [0|0] "" XXX + SG_ SPMCA_StrPrfMd6Avl : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_StrPrfMd5Avl : 25|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_StrPrfMd4Avl : 26|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_StrPrfMd3Avl : 27|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_StrPrfMd2Avl : 28|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_StrPrfMd1Avl : 29|1@0+ (1,0) [0|1] "" XXX + SG_ SusPerfMdCustAvl : 37|6@0+ (1,0) [0|0] "" XXX + SG_ SPMCA_SusPrfMd6Avl : 32|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SusPrfMd5Avl : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SusPrfMd4Avl : 34|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SusPrfMd3Avl : 35|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SusPrfMd2Avl : 36|1@0+ (1,0) [0|1] "" XXX + SG_ SPMCA_SusPrfMd1Avl : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 2156945408 SSID_AMM_1_LS: 8 XXX + SG_ WiFiSSIDDgts1to8_Mp : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2152611840 OnBoard_Tester_Request_LS: 2 XXX + SG_ OBTCReq : 4|5@0+ (1,0) [0|0] "" XXX + SG_ OBTCR_Prty : 3|4@0+ (1,0) [0|15] "" XXX + SG_ OBTCR_Actv : 4|1@0+ (1,0) [0|1] "" XXX + SG_ OBTCReqstrStat : 7|3@0+ (1,0) [0|7] "" XXX + SG_ OBTCReqstrID : 15|8@0+ (1,0) [0|255] "" XXX + +BO_ 2153308160 Hyb_Redundant_Batt_Data2_LS: 4 XXX + SG_ RdHVltBatPckCrntGroup : 6|15@0+ (1,0) [0|0] "" XXX + SG_ RdHVltBatPckCrnt : 4|13@0- (0.15,0) [-614.4|614.25] "A" XXX + SG_ RdHVltBatPckCrntV : 5|1@0+ (1,0) [0|1] "" XXX + SG_ RdHVltBatPckCrntM : 6|1@0+ (1,0) [0|1] "" XXX + SG_ RdHVltBatPckVltGroup : 21|14@0+ (1,0) [0|0] "" XXX + SG_ RdHVltBatPckVlt : 19|12@0+ (0.125,0) [0|511.875] "V" XXX + SG_ RdHVltBatPckVltV : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RdHVltBatPckVltM : 21|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155970560 HVAC_PowerManager_Status_LS: 1 XXX + SG_ ClmCntLdShdLvlRq : 3|4@0+ (1,0) [0|15] "" XXX + SG_ ClmCntBatSaverIO : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151178240 Lighting_Customization_Rqst_1_LS: 4 XXX + SG_ LtRtHnTrGPSCstStRq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ LtRtHnTrCstStReq : 5|3@0+ (1,0) [0|7] "" XXX + SG_ AutHgBmAsSnCsStRq : 10|3@0+ (1,0) [0|7] "" XXX + SG_ AutHgBmAstCstStRq : 13|3@0+ (1,0) [0|7] "" XXX + SG_ AdpHgBmAsSnCsStRq : 18|3@0+ (1,0) [0|7] "" XXX + SG_ AdpHgBmAstCstStRq : 21|3@0+ (1,0) [0|7] "" XXX + SG_ AFLGPSCstStReq : 26|3@0+ (1,0) [0|7] "" XXX + SG_ AFLCstStReq : 29|3@0+ (1,0) [0|7] "" XXX + +BO_ 2154790912 Lighting_Customization_Info_2_LS: 2 XXX + SG_ AutHgBmAsCsCrStVal : 2|3@0+ (1,0) [0|7] "" XXX + SG_ AutHgBmAsSnCsCrStVa : 5|3@0+ (1,0) [0|7] "" XXX + SG_ AutHgBmAsCsStAvl : 6|1@0+ (1,0) [0|1] "" XXX + SG_ AutHgBmAsSnCsStAvl : 7|1@0+ (1,0) [0|1] "" XXX + SG_ AdpHgBmAsCsCrStVal : 10|3@0+ (1,0) [0|7] "" XXX + SG_ AdpHgBmAsSnCsCrStVal : 13|3@0+ (1,0) [0|7] "" XXX + SG_ AdpHgBmAsCsStAvl : 14|1@0+ (1,0) [0|1] "" XXX + SG_ AdpHgBmAsSnCsStAvl : 15|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151292928 V2V_Customization_Menu_LS: 5 XXX + SG_ TrfRdsdInfCsStAvail : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CntdVehBrkAltCsStAvl : 1|1@0+ (1,0) [0|1] "" XXX + SG_ IntrStopAlrtCsSetAvl : 2|1@0+ (1,0) [0|1] "" XXX + SG_ IntrStAlrtCsCrSetVal : 5|3@0+ (1,0) [0|7] "" XXX + SG_ TrfRdsdInfCsCrStVal : 10|3@0+ (1,0) [0|7] "" XXX + SG_ CntdVehBrAltCsCrStVal : 13|3@0+ (1,0) [0|7] "" XXX + SG_ IntrStAlrtCsAvail : 22|7@0+ (1,0) [0|0] "" XXX + SG_ ISACA_Resrv4Avail : 16|1@0+ (1,0) [0|1] "" XXX + SG_ ISACA_Resrv3Avail : 17|1@0+ (1,0) [0|1] "" XXX + SG_ ISACA_Resrv2Avail : 18|1@0+ (1,0) [0|1] "" XXX + SG_ ISACA_Resrv1Avail : 19|1@0+ (1,0) [0|1] "" XXX + SG_ ISACA_AlrtBrkAvail : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ISACA_AlrtAvail : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ISACA_OfAvail : 22|1@0+ (1,0) [0|1] "" XXX + SG_ CntdVehBrkAlrtCsAvail : 30|7@0+ (1,0) [0|0] "" XXX + SG_ CVBACA_Resrv5Avail : 24|1@0+ (1,0) [0|1] "" XXX + SG_ CVBACA_Resrv4Avail : 25|1@0+ (1,0) [0|1] "" XXX + SG_ CVBACA_Resrv3Avail : 26|1@0+ (1,0) [0|1] "" XXX + SG_ CVBACA_Resrv2Avail : 27|1@0+ (1,0) [0|1] "" XXX + SG_ CVBACA_Resrv1Avail : 28|1@0+ (1,0) [0|1] "" XXX + SG_ CVBACA_OnAvail : 29|1@0+ (1,0) [0|1] "" XXX + SG_ CVBACA_OfAvail : 30|1@0+ (1,0) [0|1] "" XXX + SG_ TrfRdsdInfCsAvail : 38|7@0+ (1,0) [0|0] "" XXX + SG_ TRICA_Resrv5Avail : 32|1@0+ (1,0) [0|1] "" XXX + SG_ TRICA_Resrv4Avail : 33|1@0+ (1,0) [0|1] "" XXX + SG_ TRICA_Resrv3Avail : 34|1@0+ (1,0) [0|1] "" XXX + SG_ TRICA_Resrv2Avail : 35|1@0+ (1,0) [0|1] "" XXX + SG_ TRICA_Resrv1Avail : 36|1@0+ (1,0) [0|1] "" XXX + SG_ TRICA_OnAvail : 37|1@0+ (1,0) [0|1] "" XXX + SG_ TRICA_OfAvail : 38|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151464960 V2V_Warnings_LS: 5 XXX + SG_ V2VWrngIndReq : 4|5@0+ (1,0) [0|31] "" XXX + SG_ V2VWrngDirctn : 7|3@0+ (1,0) [0|7] "" XXX + SG_ V2VWrngDistRemng : 9|10@0+ (1,0) [0|1023] "" XXX + SG_ V2VTrfLghtInfo : 28|13@0+ (1,0) [0|0] "" XXX + SG_ V2VTLI_TrfLghtTmPhsSw : 28|6@0+ (1,0) [0|63] "" XXX + SG_ V2VTLI_TrfLghtMntngDirctn : 32|1@0+ (1,0) [0|1] "" XXX + SG_ V2VTLI_TrfLghtValDirctn : 34|2@0+ (1,0) [0|3] "" XXX + SG_ V2VTLI_TrfLghtPhsArivl : 36|2@0+ (1,0) [0|3] "" XXX + SG_ V2VTLI_TrfLghtActlPhs : 38|2@0+ (1,0) [0|3] "" XXX + SG_ V2VSrvIndReq : 30|2@0+ (1,0) [0|3] "" XXX + +BO_ 2151448576 V2V_Seat_Vib_Request_LS: 3 XXX + SG_ V2VSysHptcStVibReq : 5|6@0+ (1,0) [0|63] "" XXX + SG_ V2VSysHptStVibRqSN : 7|2@0+ (1,0) [0|3] "" XXX + SG_ V2VSyLftHptStVbRq : 13|6@0+ (1,0) [0|63] "" XXX + SG_ V2VSyLftHptStVbRqSN : 15|2@0+ (1,0) [0|3] "" XXX + SG_ V2VSyRghtHptStVbRq : 21|6@0+ (1,0) [0|63] "" XXX + SG_ V2VSyRghtHptStVbRqSN : 23|2@0+ (1,0) [0|3] "" XXX + +BO_ 2153930752 Lane_Centering_Convenience_LS: 3 XXX + SG_ LCWrnIndReq : 4|5@0+ (1,0) [0|31] "" XXX + SG_ LCCDrvrAwrnsIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LnCntrVhlStpd : 6|1@0+ (1,0) [0|1] "" XXX + SG_ LnCntrNonRspDrvrCnd : 7|1@0+ (1,0) [0|1] "" XXX + SG_ LCConvMsgIndreq : 12|5@0+ (1,0) [0|31] "" XXX + SG_ LCCIndReq : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LnCntrEsclnStat : 17|2@0+ (1,0) [0|3] "" XXX + SG_ LnCntrSpchPrmtReq : 19|2@0+ (1,0) [0|3] "" XXX + SG_ LnCntrngCtlIcnLoctn : 23|4@0- (1,0) [-8|7] "" XXX + +BO_ 2153889792 Lane_Centering_Arrow_LS: 5 XXX + SG_ LCArrwBlk1Act : 0|1@0+ (1,0) [0|1] "" XXX + SG_ LCArrwBlk2Act : 1|1@0+ (1,0) [0|1] "" XXX + SG_ LCArrwBlk3Act : 2|1@0+ (1,0) [0|1] "" XXX + SG_ LCArrwBlk4Act : 3|1@0+ (1,0) [0|1] "" XXX + SG_ LCArrwBlk5Act : 4|1@0+ (1,0) [0|1] "" XXX + SG_ LCArrwBlk2Offst : 15|8@0- (1,0) [-128|127] "" XXX + SG_ LCArrwBlk3Offst : 23|8@0- (1,0) [-128|127] "" XXX + SG_ LCArrwBlk4Offst : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LCArrwBlk5Offst : 39|8@0- (1,0) [-128|127] "" XXX + +BO_ 2153914368 Energy_Usage_LS: 7 XXX + SG_ EngyUsgScrScal : 7|56@0+ (1,0) [0|0] "" XXX + SG_ EUSS_OTEgUgScrMxScVal : 0|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUSS_OTEgUgScrMnScVal : 7|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUSS_ITEgUgScrMnScVal : 9|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUSS_ITEgUgScrMxScVal : 18|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUSS_TcEgUgScrMnScVal : 27|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUSS_TcEgUgScrMxScVal : 36|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUSS_TrEgUgScrMnScVal : 45|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUSS_TrEgUgScrMxScVal : 54|7@0- (0.1,0) [-5|5] "" XXX + +BO_ 2151882752 PTO_Customization_Request_LS: 3 XXX + SG_ PTOTpStpSpdCsStReq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ PTOEngRnTmrCsStRq : 11|4@0+ (1,0) [0|15] "" XXX + SG_ PTOStdbySpdCsStReq : 14|3@0+ (1,0) [0|7] "" XXX + SG_ PTOSet1SpdCsStReq : 19|4@0+ (1,0) [0|15] "" XXX + SG_ PTOSet2SpdCsStReq : 23|4@0+ (1,0) [0|15] "" XXX + +BO_ 2151899136 PTO_Status_LS: 5 XXX + SG_ PTORelBrkPedIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ PTORelAccPedIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PTORedEngSpdIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PTOPrsRelCltPedIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PTOPrsRelBrkPedIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ PTOEngmntStatInd : 6|2@0+ (1,0) [0|3] "" XXX + SG_ PTODisengCrsCntlIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ PTOSet1SpdCsStAvl : 8|1@0+ (1,0) [0|1] "" XXX + SG_ PTOSet2SpdCsStAvl : 9|1@0+ (1,0) [0|1] "" XXX + SG_ PTOTpStpSpdCsStAvl : 10|1@0+ (1,0) [0|1] "" XXX + SG_ PTOEngRnTmrCsStAvl : 11|1@0+ (1,0) [0|1] "" XXX + SG_ PTOStdbySpdCsStAvl : 12|1@0+ (1,0) [0|1] "" XXX + SG_ PTOTransInGearIO : 13|1@0+ (1,0) [0|1] "" XXX + SG_ PTOSetPrkBrkIO : 14|1@0+ (1,0) [0|1] "" XXX + SG_ PTORelCltPedIO : 15|1@0+ (1,0) [0|1] "" XXX + SG_ PTOStdbSpdCsCrStVal : 18|3@0+ (1,0) [0|7] "" XXX + SG_ PTOGroup : 20|2@0+ (1,0) [0|0] "" XXX + SG_ PTOVDA : 19|1@0+ (1,0) [0|1] "" XXX + SG_ PTOVDM : 20|1@0+ (1,0) [0|1] "" XXX + SG_ PTOManTransInGrIO : 21|1@0+ (1,0) [0|1] "" XXX + SG_ PTOAccelUpnBrkRelIO : 22|1@0+ (1,0) [0|1] "" XXX + SG_ PTOEngUpnBrkRelIO : 23|1@0+ (1,0) [0|1] "" XXX + SG_ PTOTpStSpdCsCrStVal : 26|3@0+ (1,0) [0|7] "" XXX + SG_ PTOEnRnTmCsCrStVal : 30|4@0+ (1,0) [0|15] "" XXX + SG_ PTOServIndOn : 31|1@0+ (1,0) [0|1] "" XXX + SG_ PTOSet1SpdCsCrStVal : 35|4@0+ (1,0) [0|15] "" XXX + SG_ PTOSet2SpdCsCrStVal : 39|4@0+ (1,0) [0|15] "" XXX + +BO_ 2150580224 HMI_UtlChrgIntrfr_Indication_LS: 5 XXX + SG_ CstmrNonUsblSOCGroup : 1|10@0+ (1,0) [0|0] "" XXX + SG_ CstmrNonUsblSOCV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ CstmrNonUsblSOC : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ CstNonUsbSOCDspLvl : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ PrpDspTtlPwrLvlPct : 24|9@0- (0.392157,0) [-100.392192|100.000035] "%" XXX + +BO_ 2151735296 Rear_Cross_Traffic_Alert_Ind_LS: 1 XXX + SG_ RrCrsTrfcAlrtOffIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ LnChgAlrtOffIndOn : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RtRrCrsTrfcAlrtEnbld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RtSBZAlrtEnbld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ RtLnChgAlrtEnbld : 4|1@0+ (1,0) [0|1] "" XXX + SG_ RtSdDetSysTmpDsbld : 5|1@0+ (1,0) [0|1] "" XXX + SG_ RtSdDetSysServDsbld : 6|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151792640 Rear_Cross_Traffic_Alert_Rght_LS: 5 XXX + SG_ RrCTfcRHptcStRqSqN : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RrCTfcRHptcStReq : 7|6@0+ (1,0) [0|63] "" XXX + SG_ RrCrsTrfAltRgtIndCtrl : 34|3@0+ (1,0) [0|0] "" XXX + SG_ RCTARIC_IndReq : 33|2@0+ (1,0) [0|3] "" XXX + SG_ RCTARIC_Indctr1Act : 34|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149826560 FCA_VisionBased_Info_2_LS: 4 XXX + SG_ FCAGpStng : 2|3@0+ (1,0) [0|7] "" XXX + SG_ FCAHdwyStngIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FCACrusCtrlCnclReqd : 4|1@0+ (1,0) [0|1] "" XXX + SG_ FCABrkPrflReq : 5|1@0+ (1,0) [0|1] "" XXX + SG_ FwdClnAlrtOffIO11E : 6|1@0+ (1,0) [0|1] "" XXX + SG_ FwdClnAlrtPr11E : 7|1@0+ (1,0) [0|1] "" XXX + SG_ SpdLmtVsnFsdSpdGroup : 15|15@0+ (1,0) [0|0] "" XXX + SG_ SpdLmtVsnFsdSpd : 15|8@0+ (1,0) [0|255] "" XXX + SG_ SpdLmtVsnFsdSpdM : 17|1@0+ (1,0) [0|1] "" XXX + SG_ FwdObjAlrtInd11E : 16|9@0+ (1,0) [0|0] "" XXX + SG_ FOAI_AlrtChmIhbRq11E : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FOAI_VehAhdIndRq11E : 27|4@0+ (1,0) [0|15] "" XXX + SG_ FOAI_AlrtWrnIndRq11E : 31|4@0+ (1,0) [0|15] "" XXX + SG_ SpdLmtVnFsSpdNwDet : 18|1@0+ (1,0) [0|1] "" XXX + SG_ SpdLmtVsnFsdSpdUnt : 19|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149957632 Park_Assist_ESSprocess_Info_LS: 1 XXX + SG_ ClsnMtgtnInhbtd : 0|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstInhbtReq : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstRrObjSnsngRqAct : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstOprtrDsrdStat : 4|2@0+ (1,0) [0|3] "" XXX + +BO_ 2149941248 Park_Assist_ESSbased_Info_LS: 5 XXX + SG_ PrkAstRrExtdDstUnfltd : 3|12@0+ (0.01,0) [0|40.95] "m" XXX + SG_ PrkAstRrSysStatUnfltd : 5|2@0+ (1,0) [0|3] "" XXX + SG_ PrkAstFntnSnsDstrbdIO : 16|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstFntnSnrsBlkd : 17|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstFntnFld : 18|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstFntnDsbldIO : 19|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstFntnClnPrkAstIO : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ClsnMtgtnInhbtReqtd : 21|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstRrObjSnsngAct : 22|1@0+ (1,0) [0|1] "" XXX + SG_ PARrRgn3ObjStatUnfltd : 27|4@0+ (1,0) [0|15] "" XXX + SG_ PARrRgn4ObjStatUnfltd : 31|4@0+ (1,0) [0|15] "" XXX + SG_ PARrRgn1ObjStatUnfltd : 35|4@0+ (1,0) [0|15] "" XXX + SG_ PARrRgn2ObjStatUnfltd : 39|4@0+ (1,0) [0|15] "" XXX + +BO_ 2156314624 High_Volt_Time_Based_Chrg_LS: 8 XXX + SG_ TODCNxtPlnndDprtrTm : 5|14@0+ (1,0) [0|0] "" XXX + SG_ TODCNPDT_Hr : 2|5@0+ (1,0) [0|31] "Hour" XXX + SG_ TODCNPDT_DyOfWk : 5|3@0+ (1,0) [0|7] "" XXX + SG_ TODCNPDT_Min : 13|6@0+ (1,0) [0|63] "Minute" XXX + SG_ OffBrdCSFltDtctd : 6|1@0+ (1,0) [0|1] "" XXX + SG_ OBVhCsACChgRqBnVs : 7|1@0+ (1,0) [0|1] "" XXX + SG_ HVChgSyChgLvlPrfDt : 16|25@0+ (1,0) [0|0] "" XXX + SG_ HVCSCLPD_UsrIntTyp : 16|2@0+ (1,0) [0|3] "" XXX + SG_ HVCSCLPD_NrmChrgC : 27|5@0+ (1,0) [0|31] "A" XXX + SG_ HVCSCLPD_ChgLvlPfS : 30|3@0+ (1,0) [0|7] "" XXX + SG_ HVCSCLPD_RdCrntLv2 : 33|5@0+ (1,0) [0|31] "A" XXX + SG_ HVCSCLPD_RdCrntLv1 : 38|5@0+ (1,0) [0|31] "A" XXX + SG_ HVCSCLPD_RdCrntLv3 : 44|5@0+ (1,0) [0|31] "A" XXX + SG_ HVChrgAbrtRsn : 19|3@0+ (1,0) [0|7] "" XXX + SG_ TODCOpMd : 22|3@0+ (1,0) [0|7] "" XXX + SG_ HVChrgSysSplyFltIO : 23|1@0+ (1,0) [0|1] "" XXX + SG_ TODCDspMnPgTmpOr : 52|5@0+ (1,0) [0|0] "" XXX + SG_ TODCDMPTO_TpOvR : 51|4@0+ (1,0) [0|15] "" XXX + SG_ TODCDMPTO_CmPgR : 52|1@0+ (1,0) [0|1] "" XXX + SG_ HVChrgSysStNot : 55|3@0+ (1,0) [0|7] "" XXX + SG_ HVBatBlkSOC : 63|8@0+ (0.392157,0) [0|100.000035] "%" XXX + +BO_ 2150449152 Engine_Information_5_LS: 4 XXX + SG_ SrvcFlSysPrkInOpnArIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvTrCtrlOffUnbIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvStblCtrlOffUnbIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ InActFuelMdFuelLvlIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FuelSysNEmsRltMalfAct : 4|1@0+ (1,0) [0|1] "" XXX + SG_ EngInltSpcfcHmdtyGroup : 7|16@0+ (1,0) [0|0] "" XXX + SG_ EngInltSpcfcHmdtyM : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EngInltSpcfcHmdtyV : 7|1@0+ (1,0) [0|1] "" XXX + SG_ EngInltSpcfcHmdty : 15|8@0+ (0.0196078,0) [0|4.999989] "% water" XXX + SG_ AutoStpInhbtRsnInd : 23|8@0+ (1,0) [0|0] "" XXX + SG_ ASIRI_Indication08 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ ASIRI_Indication07 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ ASIRI_Indication06 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ ASIRI_Indication05 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ ASIRI_Indication04 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ASIRI_Indication03 : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ASIRI_Indication02 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ ASIRI_Indication01 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ SpdLmtrSttngTypAct : 25|2@0+ (1,0) [0|3] "" XXX + SG_ ManTransIndReq : 28|3@0+ (1,0) [0|7] "" XXX + SG_ ESPDrvrExtIO : 29|1@0+ (1,0) [0|1] "" XXX + SG_ ESPDrvrDrStIndtrmntIO : 30|1@0+ (1,0) [0|1] "" XXX + SG_ ESPAutoPrkIO : 31|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149810176 FCA_VisionBased_Info_1_LS: 1 XXX + SG_ FCAHptcStVbnRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX + SG_ FCAHptcStVbnReq : 7|6@0+ (1,0) [0|63] "" XXX + +BO_ 2149793792 FCA_VisionBased_Info_LS: 6 XXX + SG_ FwdClnAlrtCustCrntSetngVal : 3|3@0+ (1,0) [0|7] "" XXX + SG_ FCACustStngAvlbl : 6|1@0+ (1,0) [0|1] "" XXX + SG_ VhlAhdDstIndReq : 26|19@0+ (1,0) [0|0] "" XXX + SG_ VADIR_IndLvl : 26|4@0+ (1,0) [0|15] "" XXX + SG_ VADIR_FlwTme : 38|7@0+ (0.1,0) [0|12.7] "s" XXX + SG_ VADIR_FlwDst : 47|8@0+ (1,0) [0|255] "m" XXX + +BO_ 2150080512 Aux_Coolant_Heater_Status_LS: 8 XXX + SG_ EngAstHtDfrdHtMdAct : 0|1@0+ (1,0) [0|1] "" XXX + SG_ LBCCsCrStVal : 2|2@0+ (1,0) [0|3] "" XXX + SG_ AuxClntHtrVlvStat : 5|3@0+ (1,0) [0|7] "" XXX + SG_ LBCChrgLvlPrfExpIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ LBCCsStAvl : 7|1@0+ (1,0) [0|1] "" XXX + SG_ LBCCstmrDaRstResp : 12|5@0+ (1,0) [0|0] "" XXX + SG_ LBCCDRR_PosNumbr : 10|3@0+ (1,0) [0|7] "" XXX + SG_ LBCCDRR_ClrStrdPosResp : 12|2@0+ (1,0) [0|3] "" XXX + SG_ LBCPosStgStat : 20|5@0+ (1,0) [0|0] "" XXX + SG_ LBCPSS_PosUpdtLct : 18|3@0+ (1,0) [0|7] "" XXX + SG_ LBCPSS_PosUpdtStat : 20|2@0+ (1,0) [0|3] "" XXX + SG_ LBCVehLctStat : 27|4@0+ (1,0) [0|0] "" XXX + SG_ LBCVLS_VehGPSLct : 26|3@0+ (1,0) [0|7] "" XXX + SG_ LBCVLS_VehGPSLctV : 27|1@0+ (1,0) [0|1] "" XXX + SG_ LBCCstmrFdbk : 31|4@0+ (1,0) [0|0] "" XXX + SG_ LBCCF_Lct4PosStrdIO : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LBCCF_Lct3PosStrdIO : 29|1@0+ (1,0) [0|1] "" XXX + SG_ LBCCF_Lct2PosStrdIO : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LBCCF_Lct1PosStrdIO : 31|1@0+ (1,0) [0|1] "" XXX + SG_ ChrgCyclElecEngyEcnEq : 35|12@0+ (0.1,0) [0|409.5] "km/l" XXX + SG_ ChrgCyclOvrlEngyEcnEq : 51|12@0+ (0.1,0) [0|409.5] "km/l" XXX + +BO_ 2153873408 Heated_Steering_Whl_Rqsted_LS: 1 XXX + SG_ MnlHtdStWhlRqstd : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2152128512 Performance_Mode_Cust_Setings_LS: 4 XXX + SG_ ACCPerfMdCustAvl : 5|6@0+ (1,0) [0|0] "" XXX + SG_ ACCPMCA_ACCPrfMd6Avl : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ACCPMCA_ACCPrfMd5Avl : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ACCPMCA_ACCPrfMd4Avl : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ACCPMCA_ACCPrfMd3Avl : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ACCPMCA_ACCPrfMd2Avl : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ACCPMCA_ACCPrfMd1Avl : 5|1@0+ (1,0) [0|1] "" XXX + SG_ DrvrStPerfMdCustAvl : 13|6@0+ (1,0) [0|0] "" XXX + SG_ DSPMCA_DrvrStPrfMd6Avl : 8|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvrStPrfMd5Avl : 9|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvrStPrfMd4Avl : 10|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvrStPrfMd3Avl : 11|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvrStPrfMd2Avl : 12|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvrStPrfMd1Avl : 13|1@0+ (1,0) [0|1] "" XXX + SG_ PsngStPerfMdCustAvl : 21|6@0+ (1,0) [0|0] "" XXX + SG_ PSPMCA_PsngStPrfMd6Avl : 16|1@0+ (1,0) [0|1] "" XXX + SG_ PSPMCA_PsngStPrfMd5Avl : 17|1@0+ (1,0) [0|1] "" XXX + SG_ PSPMCA_PsngStPrfMd4Avl : 18|1@0+ (1,0) [0|1] "" XXX + SG_ PSPMCA_PsngStPrfMd3Avl : 19|1@0+ (1,0) [0|1] "" XXX + SG_ PSPMCA_PsngStPrfMd2Avl : 20|1@0+ (1,0) [0|1] "" XXX + SG_ PSPMCA_PsngStPrfMd1Avl : 21|1@0+ (1,0) [0|1] "" XXX + SG_ DrvStyPerfMdCustAvl : 30|7@0+ (1,0) [0|0] "" XXX + SG_ DSPMCA_DrvStyPrfMd7Avl : 24|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvStyPrfMd6Avl : 25|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvStyPrfMd5Avl : 26|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvStyPrfMd4Avl : 27|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvStyPrfMd3Avl : 28|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvStyPrfMd2Avl : 29|1@0+ (1,0) [0|1] "" XXX + SG_ DSPMCA_DrvStyPrfMd1Avl : 30|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151997440 Driver_Drowsiness_Dtctn_Stat_LS: 5 XXX + SG_ DrvDrowSysIndRq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ DrvDrwDetCsCrStVal : 5|3@0+ (1,0) [0|7] "" XXX + SG_ DrvDrowDetCstStAvl : 6|1@0+ (1,0) [0|1] "" XXX + SG_ DrvDrsnHptcStRqSeqN : 9|2@0+ (1,0) [0|3] "" XXX + SG_ DrDrwSysHptcStVbnRq : 15|6@0+ (1,0) [0|63] "" XXX + +BO_ 2156331008 High_Voltage_EnergyMgmt_Ctrl_LS: 7 XXX + SG_ LwRngLVLdShdRq : 1|2@0+ (1,0) [0|3] "" XXX + SG_ HVDpltnMdMxCnfdcRg : 11|12@0+ (0.1,0) [0|409.5] "km" XXX + SG_ HVDpltnMdMiCnfdcRg : 27|12@0+ (0.1,0) [0|409.5] "km" XXX + SG_ HVDpltnMdMxGugRg : 43|12@0+ (0.1,0) [0|409.5] "km" XXX + +BO_ 2151776256 Rear_Cross_Traffic_Alert_Left_LS: 5 XXX + SG_ RrCTfcLHptcStRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RrCTfcLHptcStReq : 7|6@0+ (1,0) [0|63] "" XXX + SG_ RrCrsTrfAltLftIndCtrl : 34|3@0+ (1,0) [0|0] "" XXX + SG_ RCTALIC_IndReq : 33|2@0+ (1,0) [0|3] "" XXX + SG_ RCTALIC_Indctr1Act : 34|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154774528 Lighting_Customization_Info_1_LS: 1 XXX + SG_ LtRtHnTrCstStVal : 2|3@0+ (1,0) [0|7] "" XXX + SG_ LtRtHnTrGPCsCrStVal : 5|3@0+ (1,0) [0|7] "" XXX + SG_ LtRtHnTrCstStAvail : 6|1@0+ (1,0) [0|1] "" XXX + SG_ LtRtHnTrGPSCsStAvl : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150375424 Eng_Maintenance_Mode_Strt_Req_LS: 3 XXX + SG_ MntnceMdStEngRq : 0|1@0+ (1,0) [0|1] "" XXX + SG_ EngAstHtCstStRq : 3|3@0+ (1,0) [0|7] "" XXX + SG_ EngAstHtPlgInCstStRq : 6|3@0+ (1,0) [0|7] "" XXX + SG_ DsplTrnsShftLvrLckRqd : 7|1@0+ (1,0) [0|1] "" XXX + SG_ EngyCnsHistGrphRstRq : 8|1@0+ (1,0) [0|1] "" XXX + SG_ USBProgInPrgrs : 9|1@0+ (1,0) [0|1] "" XXX + SG_ LBCPosMdfcReq : 12|3@0+ (1,0) [0|7] "" XXX + SG_ LBCCsStReq : 14|2@0+ (1,0) [0|3] "" XXX + SG_ LBCCstmrDaRstReq : 20|5@0+ (1,0) [0|0] "" XXX + SG_ LBCCDRR_PosNum : 18|3@0+ (1,0) [0|7] "" XXX + SG_ LBCCDRR_ClrStrdPosReq : 20|2@0+ (1,0) [0|3] "" XXX + +BO_ 2150383616 Engine_Maintenance_Mode_Req_LS: 8 XXX + SG_ MntnceMdDsplyRq : 3|4@0+ (1,0) [0|15] "" XXX + SG_ EngMntnceMdAct : 4|1@0+ (1,0) [0|1] "" XXX + SG_ EngMntncePrcntCpl : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ EngPrpDspPwrLvlPct : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ EstElecPrpCap : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ PrpCapDspOpPs : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ PrpDspTtlPwr : 45|13@0+ (0.5,-326.6) [-326.6|3768.9] "kW" XXX + SG_ BatPrpDspPwrLvlPct : 48|9@0- (0.392157,0) [-100.392192|100.000035] "%" XXX + +BO_ 2151981056 Drive_Cycle_Efficiency_LS: 8 XXX + SG_ DstTrvldDt : 7|51@0+ (1,0) [0|0] "" XXX + SG_ DTD_BattPrpDstTrvld : 7|17@0+ (0.015625,0) [0|2047.984375] "km" XXX + SG_ DTD_FuelPrpDstTrvld : 22|17@0+ (0.015625,0) [0|2047.984375] "km" XXX + SG_ DTD_DrvCyclDstTrvld : 37|17@0+ (0.015625,0) [0|2047.984375] "km" XXX + SG_ DrvCyclBatPropRat : 50|11@0+ (0.048852,0) [0|100.000044] "%" XXX + +BO_ 2151964672 Drive_Cycle_Energy_Efficiency_LS: 8 XXX + SG_ DrvCyclBatCondEnrgEfncy : 7|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ DrvCyclCbnCondEnrgEfncy : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ DrvCyclDrvStEnrgEfncy : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ DrvCyclTtlEnrgEfncy : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ DrvCyclFuelEnmy : 47|12@0+ (0.1,0) [0|409.5] "km/liters" XXX + SG_ DrvCyclFuelUsd : 51|12@0+ (0.125,0) [0|511.875] "liters" XXX + +BO_ 2156298240 High_Volt_Batt_Time_Pwr_Chrg_LS: 8 XXX + SG_ HVBatCmpltTmHghPwrChrg : 7|14@0+ (1,0) [0|0] "" XXX + SG_ HVBCTHPC_HrOfDy : 4|5@0+ (1,0) [0|31] "Hour" XXX + SG_ HVBCTHPC_DyOfWk : 7|3@0+ (1,0) [0|7] "" XXX + SG_ HVBCTHPC_MntOfHr : 15|6@0+ (1,0) [0|63] "Minute" XXX + SG_ HVBatCmpltTmLwPwrChrg : 9|14@0+ (1,0) [0|0] "" XXX + SG_ HVBCTLPC_DyOfWk : 9|3@0+ (1,0) [0|7] "" XXX + SG_ HVBCTLPC_MntOfHr : 17|6@0+ (1,0) [0|63] "Minute" XXX + SG_ HVBCTLPC_HrOfDy : 22|5@0+ (1,0) [0|31] "Hour" XXX + SG_ HVBatStrTmHghPwrChrg : 27|14@0+ (1,0) [0|0] "" XXX + SG_ HVBSTHPC_HrOfDy : 24|5@0+ (1,0) [0|31] "Hour" XXX + SG_ HVBSTHPC_DyOfWk : 27|3@0+ (1,0) [0|7] "" XXX + SG_ HVBSTHPC_MntOfHr : 35|6@0+ (1,0) [0|63] "Minute" XXX + SG_ HVBatStrTmLwPwrChrg : 45|14@0+ (1,0) [0|0] "" XXX + SG_ HVBSTLPC_HrOfDy : 42|5@0+ (1,0) [0|31] "Hour" XXX + SG_ HVBSTLPC_DyOfWk : 45|3@0+ (1,0) [0|7] "" XXX + SG_ HVBSTLPC_MntOfHr : 53|6@0+ (1,0) [0|63] "Minute" XXX + SG_ HVChrgSysDpTmExdSt : 58|3@0+ (1,0) [0|0] "" XXX + SG_ HVCSDTES_NPDTIO : 56|1@0+ (1,0) [0|1] "" XXX + SG_ HVCSDTES_HiPwrCIO : 57|1@0+ (1,0) [0|1] "" XXX + SG_ HVCSDTES_LoPwrCIO : 58|1@0+ (1,0) [0|1] "" XXX + SG_ HTRActvIndOn : 59|1@0+ (1,0) [0|1] "" XXX + SG_ InsfcntTmTFlChrgIO : 60|1@0+ (1,0) [0|1] "" XXX + SG_ InvldHMIEtrIO : 61|1@0+ (1,0) [0|1] "" XXX + SG_ HVBatChrgCrdAlrtReq : 63|2@0+ (1,0) [0|3] "" XXX + +BO_ 2149924864 Drv_Pref_Mode_Switch_Status_LS: 8 XXX + SG_ DrvSelMd1Stat : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd1ReqDnd : 1|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd2Stat : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd2ReqDnd : 3|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd3Stat : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd3ReqDnd : 5|1@0+ (1,0) [0|1] "" XXX + SG_ HilRlbkCtrlActIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ FwdClnMtgnBrkReqAct : 7|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMdSelnStat : 8|17@0+ (1,0) [0|0] "" XXX + SG_ DSMSS_DrvSelMd1Un : 8|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd1Pn : 16|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd8Un : 17|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd7Un : 18|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd6Un : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd5Un : 20|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd4Un : 21|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd3Un : 22|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd2Un : 23|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd0Pn : 24|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd8Pn : 25|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd7Pn : 26|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd6Pn : 27|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd5Pn : 28|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd4Pn : 29|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd3Pn : 30|1@0+ (1,0) [0|1] "" XXX + SG_ DSMSS_DrvSelMd2Pn : 31|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd4Stat : 9|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd4ReqDnd : 10|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd5Stat : 11|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd5ReqDnd : 12|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd6Stat : 13|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd6ReqDnd : 14|1@0+ (1,0) [0|1] "" XXX + SG_ PTOMobModTrnsInGrIO : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ECODrvAsstDsplyStat : 34|11@0+ (1,0) [0|0] "" XXX + SG_ EDADS_ShftIndStat : 33|2@0+ (1,0) [0|3] "" XXX + SG_ EDADS_EcoDrvShftIO : 34|1@0+ (1,0) [0|1] "" XXX + SG_ EDADS_RcmndtFwdGr : 43|4@0+ (1,0) [0|15] "" XXX + SG_ EDADS_CrntFwdMsdG : 47|4@0+ (1,0) [0|15] "" XXX + SG_ DrvSelMd7Stat : 35|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd7ReqDnd : 36|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd8Stat : 37|1@0+ (1,0) [0|1] "" XXX + SG_ DrvSelMd8ReqDnd : 38|1@0+ (1,0) [0|1] "" XXX + SG_ FstIdlMdAct : 39|1@0+ (1,0) [0|1] "" XXX + SG_ DsplyPerfMdRq : 50|3@0+ (1,0) [0|7] "" XXX + SG_ TireLFLowTracIO : 51|1@0+ (1,0) [0|1] "" XXX + SG_ TireLRLowTracIO : 52|1@0+ (1,0) [0|1] "" XXX + SG_ TireRFLowTracIO : 53|1@0+ (1,0) [0|1] "" XXX + SG_ TireRRLowTracIO : 54|1@0+ (1,0) [0|1] "" XXX + SG_ a_12VBatSysUnstab : 55|1@0+ (1,0) [0|1] "" XXX + SG_ ColPrepSysCustAvail : 62|7@0+ (1,0) [0|0] "" XXX + SG_ CPSCA_Resrv3Avail : 56|1@0+ (1,0) [0|1] "" XXX + SG_ CPSCA_Resrv2Avail : 57|1@0+ (1,0) [0|1] "" XXX + SG_ CPSCA_Resrv1Avail : 58|1@0+ (1,0) [0|1] "" XXX + SG_ CPSCA_AlrtBrkStrAvail : 59|1@0+ (1,0) [0|1] "" XXX + SG_ CPSCA_AlrtBrkAvail : 60|1@0+ (1,0) [0|1] "" XXX + SG_ CPSCA_AlrtAvail : 61|1@0+ (1,0) [0|1] "" XXX + SG_ CPSCA_OffAvail : 62|1@0+ (1,0) [0|1] "" XXX + +BO_ 2152054784 HMI_Disp_Hyb_Animation_Status_LS: 1 XXX + SG_ AnmStrtReq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ IntPnlClstrAnmtStat : 5|3@0+ (1,0) [0|7] "" XXX + SG_ FuelEconMetDispUnts : 6|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150301696 HMI_Animation_Initiator_LS: 1 XXX + SG_ WlcAnmReq : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150563840 HMI_AnimationHybridRadio_LS: 3 XXX + SG_ RadAnmtStat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ RadAudQueStat : 5|3@0+ (1,0) [0|7] "" XXX + SG_ DrStStatDispAct : 6|1@0+ (1,0) [0|1] "" XXX + SG_ PsStStatDispAct : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154758144 Auxiliary_Heater_Active_LS: 1 XXX + SG_ ChldLckOtSwAct : 1|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154577920 Amp_Sink_Stat_LS: 2 XXX + SG_ AmpSnkStat : 4|13@0+ (1,0) [0|0] "" XXX + SG_ ASS_SurndAvail : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPAvail : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_VehNoisCmpnAvail : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_PhLckdLpLckd : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_MtxSnkMutStat : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPMd7Prsnt : 8|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPMd6Prsnt : 9|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPMd5Prsnt : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPMd4Prsnt : 11|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPMd3Prsnt : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPMd2Prsnt : 13|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPMd1Prsnt : 14|1@0+ (1,0) [0|1] "" XXX + SG_ ASS_DSPMd0Prsnt : 15|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154594304 Amp_Settings_Tone_Ctrl_LS: 5 XXX + SG_ AmpSetTonCtrl : 1|34@0+ (1,0) [0|0] "" XXX + SG_ ASTC_ChimSnkLvl : 1|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX + SG_ ASTC_ChimSnkSpkrPos : 9|4@0+ (1,0) [0|15] "" XXX + SG_ ASTC_SurndLvl : 21|6@0- (1,0) [-32|31] "" XXX + SG_ ASTC_MtxSnkMutRmpTm : 25|8@0+ (5,0) [0|1275] "ms" XXX + SG_ ASTC_MtxSnkMut : 26|1@0+ (1,0) [0|1] "" XXX + SG_ ASTC_DSPMd : 30|4@0+ (1,0) [0|15] "" XXX + SG_ ASTC_VehNoisCmpnAct : 31|1@0+ (1,0) [0|1] "" XXX + SG_ ASTC_GblAudSnkMut : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ASTC_AmpLwPwrSt : 33|1@0+ (1,0) [0|1] "" XXX + SG_ InfotnBkltngConfigSt : 3|2@0+ (1,0) [0|3] "" XXX + +BO_ 2154586112 Amp_Settings_Sink_Lvl_Ctrl_LS: 8 XXX + SG_ AmpSetSnkLvlCtrl : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ASSLC_MtxSnkLvl : 7|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX + SG_ ASSLC_MxPrmtSnkLvl : 15|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX + SG_ ASSLC_AudFdbkSnkLvl : 23|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX + SG_ ASSLC_FvSnkLvl : 31|8@0+ (0.5,-127.5) [-127.5|0] "dB" XXX + SG_ ASSLC_MtxSnkFd : 33|6@0- (1,0) [-32|31] "" XXX + SG_ ASSLC_MtxSnkBal : 39|6@0- (1,0) [-32|31] "" XXX + SG_ ASSLC_MtxSnkBass : 43|6@0- (1,0) [-32|31] "" XXX + SG_ ASSLC_MtxSnkMdrng : 53|6@0- (1,0) [-32|31] "" XXX + SG_ ASSLC_AutoLdnsCmpnAct : 56|1@0+ (1,0) [0|1] "" XXX + SG_ ASSLC_VcSrcActOnMtx : 57|1@0+ (1,0) [0|1] "" XXX + SG_ ASSLC_MtxSnkTrbl : 63|6@0- (1,0) [-32|31] "" XXX + +BO_ 2152857600 ACC_TrafficJam_RouteSpd_Stat_LS: 3 XXX + SG_ ACCRteSpdDrvIntvReq : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ACCTrfcJamAstActStat : 10|3@0+ (1,0) [0|7] "" XXX + SG_ ACCRteSpdAdaptStat : 12|2@0+ (1,0) [0|3] "" XXX + SG_ ACCGrnMdStat : 14|2@0+ (1,0) [0|3] "" XXX + SG_ ACCTrfcJamAstRmnTm : 23|8@0+ (1,0) [0|255] "sec" XXX + +BO_ 2158149632 High_Volt_Bat_Time_Bsd_Rsp_1_LS: 7 XXX + SG_ HVBatTmBsSsnChRsp : 0|14@0+ (1,0) [0|0] "" XXX + SG_ HVBTBSCR_SsnStat : 0|2@0+ (1,0) [0|3] "" XXX + SG_ HVBTBSCR_SsnMthStat : 11|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBSCR_SsnSlctStat : 14|3@0+ (1,0) [0|7] "" XXX + SG_ HVBTBSCR_SsnDyStat : 23|5@0+ (1,0) [0|31] "day" XXX + SG_ HVBatTmBsChrgStRsp : 3|3@0+ (1,0) [0|7] "" XXX + SG_ HVBatCrgDspStat : 6|3@0+ (1,0) [0|7] "" XXX + SG_ HVBatTmBsChrgRtRsp : 17|10@0+ (1,0) [0|0] "" XXX + SG_ HVBTBCRS_ChRtEnblStat : 17|2@0+ (1,0) [0|3] "" XXX + SG_ HVBTBCRS_ChRtSlctStat : 27|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBCRS_ChRtDStat : 31|4@0+ (1,0) [0|15] "" XXX + SG_ EngyCnsHsGrphCnfgDt : 36|13@0+ (1,0) [0|0] "" XXX + SG_ ECHGCD_YAxMaxVal : 32|6@0+ (4,0) [0|252] "" XXX + SG_ ECHGCD_MeasUt : 36|4@0+ (1,0) [0|15] "" XXX + SG_ ECHGCD_XAxTkMrkInterv : 42|3@0+ (1,0) [0|7] "" XXX + SG_ EgyCnsHstGphInsEgyCns : 55|5@0+ (1,0) [0|31] "" XXX + +BO_ 2158116864 High_Volt_Bat_Time_Bsd_Rsp_LS: 8 XXX + SG_ OBHVBCMinsRmng : 5|6@0+ (1,0) [0|63] "" XXX + SG_ OBHVBCCompTmDispFrmt : 7|2@0+ (1,0) [0|3] "" XXX + SG_ HVBatTmBsDelChrgRsp : 12|21@0+ (1,0) [0|0] "" XXX + SG_ HVBTBDCRS_DlChHRsp : 12|5@0+ (1,0) [0|31] "hr" XXX + SG_ HVBTBDCRS_DlChSlctStat : 19|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBDCRS_DlChDStat : 23|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBDCRS_DlChMHRsp : 29|6@0+ (1,0) [0|63] "min" XXX + SG_ HVBTBDCRS_DlChSsnStat : 31|2@0+ (1,0) [0|3] "" XXX + SG_ HVBatTmBsRtChrgRsp : 34|27@0+ (1,0) [0|0] "" XXX + SG_ HVBTBRCR_RtChMHRsp : 32|6@0+ (1,0) [0|63] "min" XXX + SG_ HVBTBRCR_RtChSsnStat : 34|2@0+ (1,0) [0|3] "" XXX + SG_ HVBTBRCR_RtChSlctStat : 42|3@0+ (1,0) [0|7] "" XXX + SG_ HVBTBRCR_RtChDStat : 50|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBRCR_RtChHRsp : 55|5@0+ (1,0) [0|31] "hr" XXX + SG_ HVBTBRCR_RtCHSlctTblRwStat : 58|3@0+ (1,0) [0|7] "rows" XXX + SG_ HVBTBRCR_RtChSlRtStat : 62|4@0+ (1,0) [0|15] "" XXX + +BO_ 2156281856 High_Volt_Bat_Time_Bsd_Req_1_LS: 7 XXX + SG_ HVBatTmBsSsnChStReq : 0|14@0+ (1,0) [0|0] "" XXX + SG_ HVBTBSCSR_SsnStReq : 0|2@0+ (1,0) [0|3] "" XXX + SG_ HVBTBSCSR_SsnMthStReq : 11|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBSCSR_SsnSlStReq : 14|3@0+ (1,0) [0|7] "" XXX + SG_ HVBTBSCSR_SsnDayStReq : 23|5@0+ (1,0) [0|31] "day" XXX + SG_ HVBatTmBsChrgMdReq : 3|3@0+ (1,0) [0|7] "" XXX + SG_ HVChgSyChgLvlPrfSt : 6|3@0+ (1,0) [0|7] "" XXX + SG_ StTODChrgTmpOvrd : 7|1@0+ (1,0) [0|1] "" XXX + SG_ HVBatTmBsChrgRtStReq : 17|10@0+ (1,0) [0|0] "" XXX + SG_ HVBTBCRSR_ChRtEnblStReq : 17|2@0+ (1,0) [0|3] "" XXX + SG_ HVBTBCRSR_ChRtSlStReq : 27|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBCRSR_ChRtDStReq : 31|4@0+ (1,0) [0|15] "" XXX + SG_ TmpOvdNxtPlnDptTmRq : 32|17@0+ (1,0) [0|0] "" XXX + SG_ TONPDTR_StTmpOvrAtv : 32|2@0+ (1,0) [0|3] "" XXX + SG_ TONPDTR_HrOfDy : 42|5@0+ (1,0) [0|31] "Hour" XXX + SG_ TONPDTR_DyOfWk : 46|4@0+ (1,0) [0|15] "" XXX + SG_ TONPDTR_MntOfHr : 53|6@0+ (1,0) [0|63] "Minute" XXX + SG_ RtBsChrgCmplnTmPrfReq : 34|2@0+ (1,0) [0|3] "" XXX + SG_ HTRCsStReq : 37|3@0+ (1,0) [0|7] "" XXX + +BO_ 2156265472 High_Volt_Bat_Time_Bsd_Req_LS: 8 XXX + SG_ ChgCdTfAlCzStRq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ ChgPwLsAlCzStRq : 5|3@0+ (1,0) [0|7] "" XXX + SG_ PrtyChrgRq : 7|2@0+ (1,0) [0|3] "" XXX + SG_ HVBatTmBsDlChStReq : 12|21@0+ (1,0) [0|0] "" XXX + SG_ HVBTBDCSRQ_DlChHStReq : 12|5@0+ (1,0) [0|31] "hr" XXX + SG_ HVBTBDCSRQ_DlChSlStReq : 19|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBDCSRQ_DlChDStReq : 23|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBDCSRQ_DlChMHStReq : 29|6@0+ (1,0) [0|63] "min" XXX + SG_ HVBTBDCSRQ_DlChSsnStReq : 31|2@0+ (1,0) [0|3] "" XXX + SG_ ChgSysAudInCsStReq : 15|3@0+ (1,0) [0|7] "" XXX + SG_ HVBatTmBsRtChrgStReq : 34|27@0+ (1,0) [0|0] "" XXX + SG_ HVBTBRCSR_RtChDStReq : 34|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBRCSR_RtChSlStReq : 42|3@0+ (1,0) [0|7] "" XXX + SG_ HVBTBRCSR_RtChSlRtStReq : 46|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBRCSR_RtChMHStReq : 48|6@0+ (1,0) [0|63] "min" XXX + SG_ HVBTBRCSR_RtChSsnStReq : 50|2@0+ (1,0) [0|3] "" XXX + SG_ HVBTBRCSR_RtChHStReq : 55|5@0+ (1,0) [0|31] "hr" XXX + SG_ HVBTBRCSR_RtChSlTbRwReq : 58|3@0+ (1,0) [0|7] "rows" XXX + SG_ OffBrdHVCVehCsChRq : 35|1@0+ (1,0) [0|1] "" XXX + SG_ EngyUsgScrnMeasUtStat : 39|4@0+ (1,0) [0|15] "" XXX + +BO_ 2150113280 Energy_Storage_System_LS: 8 XXX + SG_ EngyStgSysActCoolEnb : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DrvCycElEnrgUsd : 21|14@0+ (0.36,0) [0|5897.88] "MJ" XXX + SG_ DrvCyclElecEngyEcon : 32|9@0+ (0.1,0) [0|51.1] "" XXX + SG_ HVChrgInhbRsn : 36|4@0+ (1,0) [0|15] "" XXX + SG_ DrvCyclTrpDstTrvld : 54|15@0+ (0.1,0) [0|3276.7] "km" XXX + +BO_ 2150055936 Climate_Control_Status_LS: 5 XXX + SG_ ClmtCtrlUpprPwrLmt : 7|8@0+ (0.1,0) [0|25.5] "kW" XXX + SG_ ClmtCtrlLwrPwrLmt : 15|8@0+ (0.1,0) [0|25.5] "kW" XXX + SG_ ClimCtrlHVDvcShtdwnCmd : 16|1@0+ (1,0) [0|1] "" XXX + SG_ ClmCntCmpPwrUsdClc : 39|8@0+ (0.04,0) [0|10.2] "kW" XXX + +BO_ 2150039552 Thrml_Ref_Compressor_Status_LS: 5 XXX + SG_ ThrmlRefCompStat : 3|4@0+ (1,0) [0|15] "" XXX + SG_ EvpCorOtltAirTmpCalcdGroup : 4|13@0+ (1,0) [0|0] "" XXX + SG_ EvpCorOtltAirTmpCalcdV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ EvpCorOtltAirTmpCalcd : 15|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX + SG_ ThrmlRefCompSpdGroup : 22|15@0+ (1,0) [0|0] "" XXX + SG_ ThrmlRefCompSpd : 21|14@0+ (1,0) [0|16383] "rpm" XXX + SG_ ThrmlRefCompSpdV : 22|1@0+ (1,0) [0|1] "" XXX + SG_ ThrmlRfCmpOvTmpFltPr : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154856448 Humidity_Sensor_Status_LS: 5 XXX + SG_ HmdtySnsrGlssTemp : 1|10@0+ (0.146628,-50) [-50|100.000444] "deg C" XXX + SG_ HmdtySnsrTemp : 17|10@0+ (0.146628,-50) [-50|100.000444] "deg C" XXX + SG_ HmdtySnsrRltvHmdty : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + +BO_ 2151342080 Park_Assistant_Right_Status_LS: 2 XXX + SG_ PARtRgn1ObjStat : 3|4@0+ (1,0) [0|15] "" XXX + SG_ PrkAstRtSysStat : 5|2@0+ (1,0) [0|3] "" XXX + SG_ PARtRgn3ObjStat : 11|4@0+ (1,0) [0|15] "" XXX + SG_ PARtRgn2ObjStat : 15|4@0+ (1,0) [0|15] "" XXX + +BO_ 2151325696 Park_Assistant_Left_Status_LS: 2 XXX + SG_ PALtRgn1ObjStat : 3|4@0+ (1,0) [0|15] "" XXX + SG_ PrkAstLtSysStat : 5|2@0+ (1,0) [0|3] "" XXX + SG_ PALtRgn3ObjStat : 11|4@0+ (1,0) [0|15] "" XXX + SG_ PALtRgn2ObjStat : 15|4@0+ (1,0) [0|15] "" XXX + +BO_ 2151809024 Drv_Cycl_Elec_Enrgy_Consumd_LS: 8 XXX + SG_ DrvCycElecEngySt5 : 5|14@0+ (0.36,0) [0|5897.88] "MJ" XXX + SG_ DrvCycElecEngyCnsmd : 23|32@0+ (1,0) [0|0] "" XXX + SG_ DCEEC_EngyPct1 : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ DCEEC_EngyPct2 : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ DCEEC_EngyPct3 : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ DCEEC_EngyPct4 : 47|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ ElecEngyEconAvg : 48|9@0+ (0.1,0) [0|51.1] "" XXX + +BO_ 2151858176 Drv_Cycl_Elec_Enrgy_States_LS: 8 XXX + SG_ DrvCycElecEngySt1 : 5|14@0+ (0.36,0) [0|5897.88] "MJ" XXX + SG_ DrvCycElecEngySt2 : 21|14@0+ (0.36,0) [0|5897.88] "MJ" XXX + SG_ DrvCycElecEngySt3 : 37|14@0+ (0.36,0) [0|5897.88] "MJ" XXX + SG_ DrvCycElecEngySt4 : 53|14@0+ (0.36,0) [0|5897.88] "MJ" XXX + +BO_ 2150547456 HMI_Hybrid_Vehicle_Status_LS: 8 XXX + SG_ HVDpltnMdRng : 0|16@0+ (0.015625,0) [0|1023.984375] "km" XXX + SG_ VehChrgMdSt : 3|3@0+ (1,0) [0|7] "" XXX + SG_ GrnAudQueReq : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SvcHybChrgSysIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ HVBatChrgCrdConnIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CntrsOpnUndrTmpIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ OffBrdHVCVehCplrLkd : 16|1@0+ (1,0) [0|1] "" XXX + SG_ HVBatLimDTmpInd : 25|2@0+ (1,0) [0|3] "" XXX + SG_ OffBrdHVCVehPwrDrtd : 26|1@0+ (1,0) [0|1] "" XXX + SG_ HVChrgrSysStat : 29|3@0+ (1,0) [0|7] "" XXX + SG_ HVChrgrCplrStat : 31|2@0+ (1,0) [0|3] "" XXX + SG_ ChgrSysAdblIndReq : 33|2@0+ (1,0) [0|3] "" XXX + SG_ HVBatOutOfEnrgyInd : 36|3@0+ (1,0) [0|7] "" XXX + SG_ OffBrdHVBlkChrgCmp : 37|1@0+ (1,0) [0|1] "" XXX + SG_ ElecPrplsnMtrOvrSpdIO : 38|1@0+ (1,0) [0|1] "" XXX + SG_ HVBatCntctrsOpnIO : 39|1@0+ (1,0) [0|1] "" XXX + SG_ HVDpltnMdCnfdcTrndg : 47|8@0- (0.787402,0) [-100.787456|100.000054] "%" XXX + SG_ OffBrdHVBlkChgCpltTm : 53|14@0+ (1,0) [0|0] "" XXX + SG_ OBHVBCCT_HrofDay : 50|5@0+ (1,0) [0|31] "" XXX + SG_ OBHVBCCT_DayofWk : 53|3@0+ (1,0) [0|7] "" XXX + SG_ OBHVBCCT_MinofHr : 61|6@0+ (1,0) [0|63] "" XXX + SG_ OffBrdHVCVehPwrLvl : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 2151489536 CSV_EOCM_R_Indications_LS: 1 XXX + SG_ RVBShtToPrkBfExtngVehIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RVBAutoBrkRlsIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ NVSysStat : 4|3@0+ (1,0) [0|7] "" XXX + +BO_ 2149761024 Chassis_Information_2_LS: 6 XXX + SG_ PerfTrcCrnExStngVal : 4|5@0+ (1,0) [0|31] "" XXX + SG_ ActVehAccelGroup : 5|22@0+ (1,0) [0|0] "" XXX + SG_ ActVehAccelV : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ActVehAccel : 11|12@0- (0.01,0) [-20.48|20.47] "m/s^2" XXX + SG_ TrlrStabAstActIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ElvtdIdlCstStAvl : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ElvtdIdlCstCrStVal : 13|2@0+ (1,0) [0|3] "" XXX + SG_ TrnsCltchThrmlProtIndR : 27|20@0+ (1,0) [0|0] "" XXX + SG_ TCTPIR_DrvNotfn : 27|4@0+ (1,0) [0|15] "" XXX + SG_ TCTPIR_TnsEsClTmpD : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ TCTPIR_TnsEsClCDwT : 47|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ PsngStPerfMdCsCrStVal : 30|3@0+ (1,0) [0|7] "" XXX + SG_ PsngStPerfMdCsStAvl : 31|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155012096 SBZA_Right_Status_LS: 1 XXX + SG_ SODTmpUnavlbleIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SODSnsClnRqdIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SODRtIndCntl : 6|5@0+ (1,0) [0|0] "" XXX + SG_ SODRIC_Ind3 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SODRIC_Ind2 : 3|1@0+ (1,0) [0|1] "" XXX + SG_ SODRIC_Ind1 : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SODRIC_IndReq : 6|2@0+ (1,0) [0|3] "" XXX + SG_ SrvSODSysIO : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150514688 Power_Slidining_Door_Status_LS: 1 XXX + SG_ SldngDrRgtStat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ SldngDrLftStat : 5|3@0+ (1,0) [0|7] "" XXX + SG_ PwrSldngDrUnavlblIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ SdClsrObstclDtctdStat : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2158067712 Video_Master_Info_2_LS: 5 XXX + SG_ TchScnDsplUsrActnExt : 1|34@0+ (1,0) [0|0] "" XXX + SG_ TSDUAE_RotBtnPsh : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TSDUAE_ScrnPrsdRq : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TSDUAE_GrphStrkInfRq : 15|8@0+ (1,0) [0|255] "" XXX + SG_ TSDUAE_XCoOdntRq : 23|8@0+ (1,0) [0|255] "" XXX + SG_ TSDUAE_YCoOdntRq : 31|8@0+ (1,0) [0|255] "" XXX + SG_ TSDUAE_RotEnc : 39|8@0- (1,0) [-128|127] "Detentions" XXX + +BO_ 2158051328 Video_Master_Info_1_LS: 5 XXX + SG_ RemRcvrSrcInpCmd : 3|4@0+ (1,0) [0|15] "" XXX + SG_ VidMstrDsplyMd : 5|2@0+ (1,0) [0|3] "" XXX + SG_ VidSrcUICntrlStat : 6|1@0+ (1,0) [0|1] "" XXX + SG_ RmtRcvrTunCmnd : 12|5@0+ (1,0) [0|31] "" XXX + SG_ VidMstrArbCmd : 15|3@0+ (1,0) [0|7] "" XXX + SG_ RmtRcvrTunVal : 23|16@0- (1,0) [-32768|32767] "" XXX + SG_ VidMstrSrcType : 36|5@0+ (1,0) [0|31] "" XXX + SG_ TVDspCmd : 39|3@0+ (1,0) [0|7] "" XXX + +BO_ 2158034944 TV_Tuner_Info_LS: 6 XXX + SG_ VidSrcCompFormatER : 3|4@0+ (1,0) [0|15] "" XXX + SG_ CurntTVStnServc : 6|3@0+ (1,0) [0|7] "" XXX + SG_ CurntTVStnQual : 7|1@0+ (1,0) [0|1] "" XXX + SG_ RmtRcvrCmndStat : 10|3@0+ (1,0) [0|7] "" XXX + SG_ RmtRecvtDataTyp : 13|3@0+ (1,0) [0|7] "" XXX + SG_ RmtRcvrTunStat : 14|1@0+ (1,0) [0|1] "" XXX + SG_ TVTunerPres : 15|1@0+ (1,0) [0|1] "" XXX + SG_ RmtRcvrPrgrmServID : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ VidSrcStatCode : 35|4@0+ (1,0) [0|15] "" XXX + SG_ RemRcvrSrcInpStat : 39|4@0+ (1,0) [0|15] "" XXX + SG_ VidSrcType : 44|5@0+ (1,0) [0|31] "" XXX + +BO_ 2158018560 TV_Station_Name_LS: 8 XXX + SG_ TVStatNmeChar1_8 : 7|64@0+ (1,0) [0|0] "" XXX + +BO_ 2156838912 WiFi_Station_LS: 7 XXX + SG_ WiFiStationResp : 3|52@0+ (1,0) [0|0] "" XXX + SG_ WSR_WiFiAssnStat : 3|4@0+ (1,0) [0|15] "" XXX + SG_ WSR_WiFiStnMACAddr : 15|48@0+ (1,0) [0|281474976710655] "" XXX + +BO_ 2156822528 WiFi_AP_Data_LS: 2 XXX + SG_ WiFiAccsPntData : 0|9@0+ (1,0) [0|0] "" XXX + SG_ WAPD_IHUWiFiEnStat : 0|1@0+ (1,0) [0|1] "" XXX + SG_ WAPD_EncrptnType : 11|4@0+ (1,0) [0|15] "" XXX + SG_ WAPD_SecurityType : 15|4@0+ (1,0) [0|15] "" XXX + +BO_ 2151948288 Driver_Drow_Det_Cst_Rqst_LS: 1 XXX + SG_ DrvDrowDetCstStRq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ RunBrdOpMdCstStReq : 7|3@0+ (1,0) [0|7] "" XXX + +BO_ 2158002176 XM_Radio_Service_LS: 1 XXX + SG_ CurntStnServc : 2|3@0+ (1,0) [0|7] "" XXX + SG_ SrvcPrvdr : 5|3@0+ (1,0) [0|7] "" XXX + +BO_ 2149728256 Charging_Sys_Trans_Shift_Lock_LS: 5 XXX + SG_ ChrgSysTrnsShftLckRq : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ChrgPrtDrStat : 2|2@0+ (1,0) [0|3] "" XXX + SG_ PrtyChrgActIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PrtyChrgAct : 4|1@0+ (1,0) [0|1] "" XXX + SG_ HghVltgPropState : 7|3@0+ (1,0) [0|7] "" XXX + SG_ ChgCdTfAlCzCrStVal : 10|3@0+ (1,0) [0|7] "" XXX + SG_ ChgCdTfAlCzStAvbl : 11|1@0+ (1,0) [0|1] "" XXX + SG_ ChgPwLsAlCzCrStVal : 14|3@0+ (1,0) [0|7] "" XXX + SG_ ChgPwLsAlCzStAvbl : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ChgSyAudInCsCrStVa : 18|3@0+ (1,0) [0|7] "" XXX + SG_ ChgSysAudInCsStAvl : 19|1@0+ (1,0) [0|1] "" XXX + SG_ HVChrgPwrLvl : 22|3@0+ (1,0) [0|7] "" XXX + SG_ EngAstHtCsCrStVal : 26|3@0+ (1,0) [0|7] "" XXX + SG_ EngAstHtCsStAvl : 27|1@0+ (1,0) [0|1] "" XXX + SG_ EngAstHtPlgInCsCrStVl : 30|3@0+ (1,0) [0|7] "" XXX + SG_ EngAstHtPlgInCsStAvl : 31|1@0+ (1,0) [0|1] "" XXX + SG_ PrtyChrgStPnt : 38|7@0+ (1,0) [0|127] "" XXX + +BO_ 2150023168 Hybrid_Information_LS: 5 XXX + SG_ HybChrgMdStat : 1|2@0+ (1,0) [0|3] "" XXX + SG_ HVInvRatVltGroup : 2|19@0+ (1,0) [0|0] "" XXX + SG_ HVInvRatVltV : 2|1@0+ (1,0) [0|1] "" XXX + SG_ HVInvRatVlt : 8|9@0+ (1,0) [0|511] "volts" XXX + SG_ OffBrdVehImmbNot : 5|3@0+ (1,0) [0|7] "" XXX + SG_ ElecPrplsnMtrTach : 28|13@0+ (1,0) [0|8191] "rpm" XXX + +BO_ 2153988096 Power_Elec_Info_LS: 7 XXX + SG_ PwrElecCoolLpTempGroup : 1|10@0+ (1,0) [0|0] "" XXX + SG_ PwrElecCoolLpTempV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ PwrElecCoolLpTempM : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PwrElecCoolLpTemp : 15|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ EngyUsgScr : 20|37@0+ (1,0) [0|0] "" XXX + SG_ EUS_TcEngyUsgScrAvVal : 20|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUS_TrEngyUsgScrAvVal : 29|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUS_OTEngyUsgScrAvVal : 38|7@0- (0.1,0) [-5|5] "" XXX + SG_ EUS_TtEngyUsgScrAvVal : 40|9@0- (0.1,0) [-20|20] "" XXX + SG_ EUS_ITEngyUsgScrAvVal : 47|7@0- (0.1,0) [-5|5] "" XXX + +BO_ 2155945984 Jump_Start_Req_LS: 1 XXX + SG_ JmpStrtReq : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TCSysCurStReq : 2|2@0+ (1,0) [0|3] "" XXX + SG_ VehStbEnhmntCurStRq : 4|2@0+ (1,0) [0|3] "" XXX + SG_ VehStbCmptvMdCurStRq : 6|2@0+ (1,0) [0|3] "" XXX + +BO_ 2155585536 MSB_Customization_Setting_Req_LS: 1 XXX + SG_ StBltTgtCSRq : 2|3@0+ (1,0) [0|7] "" XXX + +BO_ 2155569152 CPS_Customization_Setting_Req_LS: 3 XXX + SG_ ColPrSysCustReq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ ExtHlStrAssCsStRq : 5|3@0+ (1,0) [0|7] "" XXX + SG_ IntDimSeldClrTypStReq : 12|5@0+ (1,0) [0|31] "" XXX + SG_ HLOCCstSetReq : 15|3@0+ (1,0) [0|7] "" XXX + SG_ IntDimSeldAnmTypStReq : 19|4@0+ (1,0) [0|15] "" XXX + SG_ SmPhRmFunCstStReq : 22|3@0+ (1,0) [0|7] "" XXX + +BO_ 2155233280 VICM_Info_LS: 8 XXX + SG_ VehRefuelSt : 2|3@0+ (1,0) [0|7] "" XXX + SG_ FlDrOpenIndOn : 3|1@0+ (1,0) [0|1] "" XXX + SG_ UtlChrgPopUpAct : 4|1@0+ (1,0) [0|1] "" XXX + SG_ UtlChrgIntrfrIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ShftPrkIO_3B2 : 6|1@0+ (1,0) [0|1] "" XXX + SG_ NtrlCstdwnCrtMdActvIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ RtBsChrgCmplnTmPrfRsp : 9|2@0+ (1,0) [0|3] "" XXX + SG_ EngRnngDutoVehSpdIO : 10|1@0+ (1,0) [0|1] "" XXX + SG_ NtrlGrWrngIO : 11|1@0+ (1,0) [0|1] "" XXX + SG_ LftmFuelEcon : 19|12@0+ (0.1,0) [0|409.5] "kilometers/liter" XXX + SG_ LiftimeFuelEcnEquiv : 35|12@0+ (0.1,0) [0|409.5] "km/l" XXX + SG_ ChrgCyclFuelEcn : 51|12@0+ (0.1,0) [0|409.5] "km/l" XXX + +BO_ 2152169472 Coolant_Heater_Status_LS: 3 XXX + SG_ ClntHtrSt : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ClntHtrPCBOvTmpFlt : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ClntHtrHtSnkOvTmpFlt : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ClntHtrElecPwrGroup : 4|13@0+ (1,0) [0|0] "" XXX + SG_ ClntHtrElecPwrV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ClntHtrElecPwr : 15|8@0+ (0.04,0) [0|10.2] "kW" XXX + SG_ ClntHtrFlt : 7|3@0+ (1,0) [0|7] "" XXX + SG_ ClntHtrInltClntTmp : 23|8@0+ (1,-40) [-40|215] "deg C" XXX + +BO_ 2152759296 SITM_Front_Sensor_IO_LS: 1 XXX + SG_ FrtCmrBlckdIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ FrtEOCMMdlFldIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ FrtCmrFldIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ FrtRdrFldIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PedWrnIndReq : 5|2@0+ (1,0) [0|3] "" XXX + +BO_ 2152742912 SITM_Rear_Sensor_IO_LS: 1 XXX + SG_ RrEOCMMdlFldIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RrRdrBlckdIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RrRdrFldIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ShrtRngRdrOffIO : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150891520 Go_Notifier_Req_LS: 5 XXX + SG_ DgtlMapSpdCat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ FwdClnAlrtCustStngReq : 5|3@0+ (1,0) [0|7] "" XXX + SG_ GNCustStngReq : 7|2@0+ (1,0) [0|3] "" XXX + SG_ DgtlMapDrvngSd : 8|1@0+ (1,0) [0|1] "" XXX + SG_ DgtlMapPsgRstrctn : 11|3@0+ (1,0) [0|7] "" XXX + SG_ RrStRmndrCstSetReq : 14|3@0+ (1,0) [0|7] "" XXX + SG_ DgtlMapEffSpdLmt : 20|5@0+ (1,0) [0|31] "" XXX + SG_ DgtlMapEffSpdLmtTyp : 23|3@0+ (1,0) [0|7] "" XXX + SG_ DgtlMapVerYr : 29|6@0+ (1,0) [0|63] "" XXX + SG_ DgtlMapVerQtr : 31|2@0+ (1,0) [0|3] "" XXX + SG_ DgtlMapCndlSpdLmt : 36|5@0+ (1,0) [0|31] "" XXX + SG_ DgtlMapCndlSpdLmtTyp : 39|3@0+ (1,0) [0|7] "" XXX + +BO_ 2151751680 Haptic_Seat_Status_LS: 3 XXX + SG_ CrshAlrtDrvrSlctdType : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CrshAlrtStPrsnt : 1|1@0+ (1,0) [0|1] "" XXX + SG_ HptcStVbnStat : 3|2@0+ (1,0) [0|3] "" XXX + SG_ HptcStFldIO : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155536384 Rear_Virtual_Bmper_Indication_LS: 1 XXX + SG_ RVBDsbldIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RVBEnbldIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RVBFldIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RVBUnblIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvRIMOffUnbIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ RevClnMtgnBrkReqAct : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151481344 CSV_FSRACC_Indications_LS: 1 XXX + SG_ AutoBrkRlsIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ShtToPrkBfExtngVehIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ HdUpDsplyUnblIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ FSRACCFrstRsmPrssIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FrtRdrBlckdIO : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151432192 ACC_Drv_Seat_Vib_Req_IO_LS: 1 XXX + SG_ ACCHptcStVbnRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ACCHptcStVbnReq : 7|6@0+ (1,0) [0|63] "" XXX + +BO_ 2151415808 Ln_Dep_Wrn_Drv_Seat_Vib_Req_LS: 5 XXX + SG_ LDWLftHptcStRqSN : 1|2@0+ (1,0) [0|3] "" XXX + SG_ LDWLftHptcStRq : 7|6@0+ (1,0) [0|63] "" XXX + SG_ LDWRghtHptcStRqSN : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LDWRghtHptcStRq : 15|6@0+ (1,0) [0|63] "" XXX + SG_ LftLnChgThrtHptStRqSN : 17|2@0+ (1,0) [0|3] "" XXX + SG_ LftLnChgThrtHptStRq : 23|6@0+ (1,0) [0|63] "Pulse" XXX + SG_ RgtLnChgThrtHptStRqSN : 25|2@0+ (1,0) [0|3] "" XXX + SG_ RgtLnChgThrtHptStRq : 31|6@0+ (1,0) [0|63] "Pulse" XXX + SG_ FrPedDetCsStAvl : 32|1@0+ (1,0) [0|1] "" XXX + SG_ FrPedDetCsCrStVal : 35|3@0+ (1,0) [0|7] "" XXX + +BO_ 2151350272 Frnt_Prk_Ast_Drv_Seat_Vib_Req_LS: 3 XXX + SG_ FPAHptcStVbnRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX + SG_ FPAHptcStVbnReq : 7|6@0+ (1,0) [0|63] "" XXX + SG_ APAIconDispRq : 10|3@0+ (1,0) [0|7] "" XXX + SG_ APAIconFilPctRq : 22|7@0+ (1,0) [0|127] "" XXX + +BO_ 2151333888 Rear_Prk_Ast_Drv_Seat_Vib_Req_LS: 1 XXX + SG_ RPAHptcStVbRqSeqN : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RPAHptcStVbnReq : 7|6@0+ (1,0) [0|63] "" XXX + +BO_ 2151522304 Reset_FuelLife_Request_LS: 1 XXX + SG_ FuelFltLfRstRqd : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ElEngyEconAvgRstRq : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TCSTmpDsblReqConf : 3|2@0+ (1,0) [0|3] "" XXX + SG_ LnchCtrlRelLnLockReqd : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150629376 CV_System_Failure_LS: 1 XXX + SG_ CVSysFlrIO : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155929600 Diesel_Information_LS: 8 XXX + SG_ DslExFldTpWrngIndRq : 3|4@0+ (1,0) [0|15] "" XXX + SG_ DslExhFldDiagWrnIdRq : 6|3@0+ (1,0) [0|7] "" XXX + SG_ DslExhFldQlyWrngIReq : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DslExhFldWrngIdRqER : 15|4@0+ (1,0) [0|15] "" XXX + SG_ DslExhFluidDistTIndcmt : 22|15@0+ (2,0) [0|65534] "km" XXX + SG_ DslExNxEmWrngIndRq : 35|4@0+ (1,0) [0|15] "" XXX + SG_ DslExFldCnWrngIndRq : 39|4@0+ (1,0) [0|15] "" XXX + SG_ DslExFldWrngVSpdLmt : 47|24@0+ (1,0) [0|0] "" XXX + SG_ DEFWVSL_S1SpdLmt : 47|8@0+ (1,0) [0|255] "km / h" XXX + SG_ DEFWVSL_S2SpdLmt : 55|8@0+ (1,0) [0|255] "km / h" XXX + SG_ DEFWVSL_S3SpdLmt : 63|8@0+ (1,0) [0|255] "km / h" XXX + +BO_ 2154741760 RSA_Status_LS: 1 XXX + SG_ RSAPrsnt : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154807296 Lighting_Customization_Info_3_LS: 4 XXX + SG_ AFLGPSCstCrStVal : 2|3@0+ (1,0) [0|7] "" XXX + SG_ AFLCstCrStVal : 5|3@0+ (1,0) [0|7] "" XXX + SG_ AFLGPSCstStAvl : 6|1@0+ (1,0) [0|1] "" XXX + SG_ AFLCstStAvl : 7|1@0+ (1,0) [0|1] "" XXX + SG_ AFLGPSMnu2CstStAvl : 8|1@0+ (1,0) [0|1] "" XXX + SG_ AFLMnu2CstStAvl : 9|1@0+ (1,0) [0|1] "" XXX + SG_ AFLMnu3CstStAvl : 10|1@0+ (1,0) [0|1] "" XXX + SG_ EngAutoStpNotProb : 11|1@0+ (1,0) [0|1] "" XXX + SG_ ESCMHiEleclLdReqAct : 12|1@0+ (1,0) [0|1] "" XXX + SG_ EngAutoStrtStpInfo : 17|10@0+ (1,0) [0|0] "" XXX + SG_ EASSI_StrtStpSt : 17|2@0+ (1,0) [0|3] "" XXX + SG_ EASSI_UnsdRsrvd2 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ EASSI_TorqDetdIndet : 25|1@0+ (1,0) [0|1] "" XXX + SG_ EASSI_StlDetd : 26|1@0+ (1,0) [0|1] "" XXX + SG_ EASSI_TrqDetd : 27|1@0+ (1,0) [0|1] "" XXX + SG_ EASSI_FuelReqOn : 28|1@0+ (1,0) [0|1] "" XXX + SG_ EASSI_StrtTyp : 31|3@0+ (1,0) [0|7] "" XXX + +BO_ 2151079936 PDIM_Status_LS: 1 XXX + SG_ PDIMPrsnt : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155364352 Hybrid_Information_SuperSlow_LS: 5 XXX + SG_ SvcHybridSysIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ JmpStrtStat : 3|3@0+ (1,0) [0|7] "" XXX + SG_ HybMdDisp : 7|4@0+ (1,0) [0|15] "" XXX + SG_ CstmrUsblSOCGroup : 15|15@0+ (1,0) [0|0] "" XXX + SG_ CstmrUsblSOC : 15|8@0+ (0.39216,0) [0|100.0008] "%" XXX + SG_ CstmrUsblSOCV : 17|1@0+ (1,0) [0|1] "" XXX + SG_ BattCntrlPrcssrVDA : 16|1@0+ (1,0) [0|1] "" XXX + SG_ InstDrvEff : 31|8@0- (0.78125,0) [-100|99.21875] "%" XXX + SG_ ClntCrcFlwRtEst : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + +BO_ 2154979328 Front_Seat_Heat_Cool_Req_LS: 1 XXX + SG_ FrntStVoltBstModReq : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155282432 RearSeat_HeatVent_Cool_LS: 1 XXX + SG_ RrStVoltBstModReq : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151505920 VehInfoTripComputer_LS: 7 XXX + SG_ SpdCurvAdvSysEnbld : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrBrkDsplyAct : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ACCSettingType : 3|2@0+ (1,0) [0|3] "" XXX + SG_ AutoMdSpdLmtCnfrmd : 4|1@0+ (1,0) [0|1] "" XXX + SG_ PTExPrtclFltManRgnRqd : 5|1@0+ (1,0) [0|1] "" XXX + SG_ Trp2OdomtrGroup : 6|55@0+ (1,0) [0|0] "" XXX + SG_ Trp2OdomtrV : 6|1@0+ (1,0) [0|1] "" XXX + SG_ Trp2Odomtr : 38|23@0+ (0.015625,0) [0|131071.984375] "km" XXX + SG_ Trp1OdomtrGroup : 7|32@0+ (1,0) [0|0] "" XXX + SG_ Trp1OdomtrV : 7|1@0+ (1,0) [0|1] "" XXX + SG_ Trp1Odomtr : 14|23@0+ (0.015625,0) [0|131071.984375] "km" XXX + +BO_ 2155896832 Alternative_Fuel_Information_LS: 5 XXX + SG_ FuelMdStat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ AltFuelMdReqDndIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FlLvlTank2PctGroup : 4|13@0+ (1,0) [0|0] "" XXX + SG_ FlLvlTank2PctV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ FlLvlTank2Pct : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ AltFuelAccWrnngAct : 5|1@0+ (1,0) [0|1] "" XXX + SG_ AltFuelLvlLo : 6|1@0+ (1,0) [0|1] "" XXX + SG_ AltFuelPHeatAct : 7|1@0+ (1,0) [0|1] "" XXX + SG_ FuelTotCapTnk2 : 19|12@0+ (0.125,0) [0|511.875] "liters" XXX + SG_ FuelAlchlCompAdptnPrg : 20|1@0+ (1,0) [0|1] "" XXX + SG_ FuelAlcoholCompGroup : 21|22@0+ (1,0) [0|0] "" XXX + SG_ FuelAlcoholCompV : 21|1@0+ (1,0) [0|1] "" XXX + SG_ FuelAlcoholComp : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + +BO_ 2155552768 Exterior_Lock_Switch_Req_LS: 1 XXX + SG_ PsvEntCmftWndRq : 1|2@0+ (1,0) [0|3] "" XXX + +BO_ 2154496000 Rear_Closure_Soft_Top_Info_LS: 1 XXX + SG_ CmpSftTopMotBfrOpTrnkIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TargaTopStateGroup : 2|2@0+ (1,0) [0|0] "" XXX + SG_ TargaTopState : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TargaTopStateV : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155208704 Power_Conv_Top_Info_LS: 3 XXX + SG_ SftTpAbvWrngSpdIndOn : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpFlrIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpLtcIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpMnlLtchIndOn : 3|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpMchnOvhtIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpRmCrgCrrIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpStrIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpTmpLwIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpTneuCvrIO : 8|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpVehOvSpdIndOn : 9|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpVltLwIO : 10|1@0+ (1,0) [0|1] "" XXX + SG_ CkSoftTpIO : 11|1@0+ (1,0) [0|1] "" XXX + SG_ ClsTrnkLidIO : 12|1@0+ (1,0) [0|1] "" XXX + SG_ FTUpdWndPsLmtEnbld : 13|1@0+ (1,0) [0|1] "" XXX + SG_ VltSwAtvIndOn : 14|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpTrnLmpsRqd : 15|1@0+ (1,0) [0|1] "" XXX + SG_ FldngTpSt : 18|3@0+ (1,0) [0|7] "" XXX + SG_ FldngTpWndCmftRq : 20|2@0+ (1,0) [0|3] "" XXX + SG_ SftTpPlsDnSrtdIndOn : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SftTpPlsDnWrngIndOn : 22|1@0+ (1,0) [0|1] "" XXX + +BO_ 2153390080 Manual_Liftgate_Control_LS: 1 XXX + SG_ RrClosOpenSwAct_2D1Group : 3|3@0+ (1,0) [0|0] "" XXX + SG_ RrClosOpenSwAct_2D1 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RrClosOpenSwAct_2D1V : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155175936 CruiseControlGapSwitch_LS: 1 XXX + SG_ AdptCrsGapSwAct : 1|2@0+ (1,0) [0|3] "" XXX + SG_ AdptCrsLKALDWSwAct : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 2156806144 Cellular_Network_Date_and_Time: 6 XXX + SG_ CldrDayCmpstdVal : 4|5@0+ (1,0) [0|31] "days" XXX + SG_ HrsCmpstdValGroup : 5|30@0+ (1,0) [0|0] "" XXX + SG_ HrsCmpstdValV : 5|1@0+ (1,0) [0|1] "" XXX + SG_ HrsCmpstdVal : 28|5@0+ (1,0) [0|31] "h" XXX + SG_ MinsCmpstdValGroup : 6|39@0+ (1,0) [0|0] "" XXX + SG_ MinsCmpstdValV : 6|1@0+ (1,0) [0|1] "" XXX + SG_ MinsCmpstdVal : 37|6@0+ (1,0) [0|63] "min" XXX + SG_ SecCmpstdValGroup : 7|48@0+ (1,0) [0|0] "" XXX + SG_ SecCmpstdValV : 7|1@0+ (1,0) [0|1] "" XXX + SG_ SecCmpstdVal : 45|6@0+ (1,0) [0|63] "secs" XXX + SG_ CldrMthCmpstdVal : 11|4@0+ (1,0) [0|15] "" XXX + SG_ CellNtwrkDtTmAvl : 12|1@0+ (1,0) [0|1] "" XXX + SG_ CldrYrCmpstdVal : 23|8@0+ (1,2000) [2000|2255] "year" XXX + +BO_ 2154078208 Window_Position_Status_LS: 2 XXX + SG_ DrvWndPosStat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ LRWndPosStat : 5|3@0+ (1,0) [0|7] "" XXX + SG_ PsWndPosStat : 10|3@0+ (1,0) [0|7] "" XXX + SG_ RRWndPosStat : 13|3@0+ (1,0) [0|7] "" XXX + +BO_ 2159058944 ODIEvent_IPC_LS: 3 XXX + SG_ ODIEvntPkt_IPC : 5|22@0+ (1,0) [0|0] "" XXX + SG_ ODIEI_EvID : 5|6@0+ (1,0) [0|63] "" XXX + SG_ ODIEI_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODIEI_MultiFrRetCh : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 2159042560 ODI_DynData_IPC_LS: 8 XXX + SG_ ODIDynData_IPC : 14|55@0+ (1,0) [0|0] "" XXX + SG_ ODDI_InvldData : 8|1@0+ (1,0) [0|1] "" XXX + SG_ ODDI_DataType : 14|6@0+ (1,0) [0|63] "" XXX + SG_ ODDI_FUCID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDI_DataId : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODDI_DataVal : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2150006784 System_Power_Mode_Pushbutton_LS: 1 XXX + SG_ SysPwrMdPshbtnActGroup : 1|2@0+ (1,0) [0|0] "" XXX + SG_ SysPwrMdPshbtnAct : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SysPwrMdPshbtnActV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PEPSRunCrnkRlyDctd : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155216896 Road_Type_Information_LS: 6 XXX + SG_ MpDataAvlbl : 0|1@0+ (1,0) [0|1] "" XXX + SG_ BldUpArDet : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SprtLnRd : 2|1@0+ (1,0) [0|1] "" XXX + SG_ CntrldAccRd : 3|1@0+ (1,0) [0|1] "" XXX + SG_ CurvAdvInd : 5|2@0+ (1,0) [0|3] "" XXX + SG_ SpdLmtPstdSpdGroup : 6|23@0+ (1,0) [0|0] "" XXX + SG_ SpdLmtPstdSpdM : 6|1@0+ (1,0) [0|1] "" XXX + SG_ SpdLmtPstdSpd : 23|8@0+ (1,0) [0|255] "" XXX + SG_ DgtlMapPstdSpdLimAsrd : 7|1@0+ (1,0) [0|1] "" XXX + SG_ FncRdClass : 10|3@0+ (1,0) [0|7] "" XXX + SG_ RdSpdCatType : 12|2@0+ (1,0) [0|3] "" XXX + SG_ LnCat : 14|2@0+ (1,0) [0|3] "" XXX + SG_ SpdLmtUnits : 15|1@0+ (1,0) [0|1] "" XXX + SG_ SpdLmtRecmndSpd : 31|8@0+ (1,0) [0|255] "" XXX + SG_ IntlStdAlph2CddCntryCd : 33|10@0+ (1,0) [0|0] "" XXX + SG_ ISA2CCC_FrstCdChr : 33|5@0+ (1,0) [0|31] "" XXX + SG_ ISA2CCC_ScndCdChr : 44|5@0+ (1,0) [0|31] "" XXX + +BO_ 2156216320 TTY_Status_LS: 1 XXX + SG_ TxtTelephoneDevPr : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2158813184 ODIIndication_IPC_LS: 8 XXX + SG_ ODIInd_IPC : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ODIIIPC_FUCID : 7|8@0+ (1,0) [0|255] "" XXX + SG_ ODIIIPC_ODIInd8 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd7 : 9|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd6 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd5 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd4 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd3 : 13|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd2 : 14|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd1 : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd16 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd15 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd14 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd13 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd12 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd11 : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd10 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd9 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd24 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd23 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd22 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd21 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd20 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd19 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd18 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd17 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd32 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd31 : 33|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd30 : 34|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd29 : 35|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd28 : 36|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd27 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd26 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd25 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd40 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd39 : 41|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd38 : 42|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd37 : 43|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd36 : 44|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd35 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd34 : 46|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd33 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd48 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd47 : 49|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd46 : 50|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd45 : 51|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd44 : 52|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd43 : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd42 : 54|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd41 : 55|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd56 : 56|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd55 : 57|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd54 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd53 : 59|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd52 : 60|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd51 : 61|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd50 : 62|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIIPC_ODIInd49 : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150277120 GPS_Geographical_Position_LS: 8 XXX + SG_ PsngSysLatGroup : 6|31@0+ (1,0) [0|0] "" XXX + SG_ PsngSysLat : 5|30@0- (1,0) [-536870912|536870911] "mas" XXX + SG_ PsngSysLatV : 6|1@0+ (1,0) [0|1] "" XXX + SG_ PsngSysLongGroup : 39|32@0+ (1,0) [0|0] "" XXX + SG_ PsngSysLong : 38|31@0- (1,0) [-1073741824|1073741823] "mas" XXX + SG_ PsngSysLongV : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150285312 GPS_Elevation_and_Heading_LS: 8 XXX + SG_ PsngSysHdingGroup : 3|37@0+ (1,0) [0|0] "" XXX + SG_ PsngSysHding : 3|12@0+ (0.1,0) [0|409.5] "deg" XXX + SG_ PsngSysHdingV : 47|1@0+ (1,0) [0|1] "" XXX + SG_ PsngSysDilPrcsGroup : 4|29@0+ (1,0) [0|0] "" XXX + SG_ PsngSysDilPrcsV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ PsngSysDilPrcs : 17|10@0+ (0.1,0) [0|102.3] "" XXX + SG_ PsngSysCalcSpdGroup : 39|10@0+ (1,0) [0|0] "" XXX + SG_ PsngSysCalcSpd : 39|8@0+ (1,0) [0|255] "km / h" XXX + SG_ PsngSysCalcSpdV : 46|1@0+ (1,0) [0|1] "" XXX + SG_ PsngSysElvtnGroup : 45|22@0+ (1,0) [0|0] "" XXX + SG_ PsngSysElvtn : 44|21@0+ (1,-100000) [-100000|1997151] "cm" XXX + SG_ PsngSysElvtnV : 45|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151890944 Telematics_Indication_Request_LS: 4 XXX + SG_ TlmtcsIndCntrlReq : 15|24@0+ (1,0) [0|0] "" XXX + SG_ TICR_Ind1Cnt : 11|4@0+ (1,0) [0|15] "" XXX + SG_ TICR_Ind1 : 13|2@0+ (1,0) [0|3] "" XXX + SG_ TICR_Ind1Req : 15|2@0+ (1,0) [0|3] "" XXX + SG_ TICR_Ind1FlshRtOff : 23|8@0+ (10,0) [0|2550] "ms" XXX + SG_ TICR_Ind1FlshRtOn : 31|8@0+ (10,0) [0|2550] "ms" XXX + +BO_ 2151251968 Telematics_Indication_Control_LS: 4 XXX + SG_ TlmtcsIndCntrlStat : 12|21@0+ (1,0) [0|0] "" XXX + SG_ TICS_Ind1V : 8|1@0+ (1,0) [0|1] "" XXX + SG_ TICS_Ind1 : 10|2@0+ (1,0) [0|3] "" XXX + SG_ TICS_Ind1Stat : 12|2@0+ (1,0) [0|3] "" XXX + SG_ TICS_Ind1FlshRtOffSt : 23|8@0+ (10,0) [0|2550] "ms" XXX + SG_ TICS_Ind1FlshRtOnSt : 31|8@0+ (10,0) [0|2550] "ms" XXX + +BO_ 2155495424 Remote_Start_Seat_Request_LS: 1 XXX + SG_ RmStrCldStEnReq : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RmStrHtdStEnRq : 1|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149990400 HS_Indications_Fast_LS: 8 XXX + SG_ ABSIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ StpOnBrkToRelPBIndOn : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrBrkngVDA : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DrvThrtlOvrdIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ TreInfMonSysRstPrfmd : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ACCHdwayStngIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACCDrvrSeltdSpdIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrWiringFltIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ AdvHlmpsVDA : 9|1@0+ (1,0) [0|1] "" XXX + SG_ SADmpVDA : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ScndryAxleVDA : 11|1@0+ (1,0) [0|1] "" XXX + SG_ SrvTrlrBrkngSysIO : 12|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrBrkngGainSetIO : 13|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrCnctdIO : 14|1@0+ (1,0) [0|1] "" XXX + SG_ ChkTrlrIO : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrBrkngFrcOtpt : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ TrlrBrkngGainSet : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ TrlrHtchSwAtv_ITBC : 32|1@0+ (1,0) [0|1] "" XXX + SG_ TransNtrlCntrlMdStat : 34|2@0+ (1,0) [0|3] "" XXX + SG_ MotStBltFldIO : 35|1@0+ (1,0) [0|1] "" XXX + SG_ MotStBltUnblIO : 36|1@0+ (1,0) [0|1] "" XXX + SG_ TrnsfrCsRngShfSpdLmt : 47|8@0+ (1,0) [0|255] "km / h" XXX + SG_ InstFuelConsmpRate : 51|12@0+ (0.025,0) [0|102.375] "liters/hr" XXX + SG_ SecAxlOperMod : 55|4@0+ (1,0) [0|15] "" XXX + +BO_ 2155380736 HS_Indications_SuperSlow_LS: 6 XXX + SG_ VehOvrLdIndOn : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SrvLevSysIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ HdLtLvlFlrIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RrLevVDA : 3|1@0+ (1,0) [0|1] "" XXX + SG_ AirCndOffIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ EngOilHotIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ PTExPrtclFltrWrnIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ DslGlwPlgIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ EngHotFuelEnrchmntIO : 8|1@0+ (1,0) [0|1] "" XXX + SG_ EngOilChngIO : 9|1@0+ (1,0) [0|1] "" XXX + SG_ EngOilLvlLwIO : 10|1@0+ (1,0) [0|1] "" XXX + SG_ EngOilPrsLwIO : 11|1@0+ (1,0) [0|1] "" XXX + SG_ EngWtrInFlIO : 12|1@0+ (1,0) [0|1] "" XXX + SG_ RdcdPwrIO : 13|1@0+ (1,0) [0|1] "" XXX + SG_ CkFlFilrCapIO : 14|1@0+ (1,0) [0|1] "" XXX + SG_ EngHt_StpEngIO : 15|1@0+ (1,0) [0|1] "" XXX + SG_ StrAsstRdcdLvl2IO : 16|1@0+ (1,0) [0|1] "" XXX + SG_ PwrStrIO : 17|1@0+ (1,0) [0|1] "" XXX + SG_ PTExPrtclFltrWrn2IO : 18|1@0+ (1,0) [0|1] "" XXX + SG_ AdvFrntLghtSysIndRq : 21|3@0+ (1,0) [0|7] "" XXX + SG_ StrngAsstRdcdIO : 22|1@0+ (1,0) [0|1] "" XXX + SG_ StrAsstRdcdLvl3IO : 23|1@0+ (1,0) [0|1] "" XXX + SG_ PwrPckAirInTempFlt : 31|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ PwrPkFnSpd : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ ARSFlrIO : 40|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150498304 Analog_Values_Slow_LS: 8 XXX + SG_ EngCltTmpGroup : 0|57@0+ (1,0) [0|0] "" XXX + SG_ EngCltTmpV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ EngCltTmp : 63|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ EngIntAirTmpGroup : 1|50@0+ (1,0) [0|0] "" XXX + SG_ EngIntAirTmpV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ EngIntAirTmp : 55|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ EngOilTmpGroup : 2|43@0+ (1,0) [0|0] "" XXX + SG_ EngOilTmpV : 2|1@0+ (1,0) [0|1] "" XXX + SG_ EngOilTmp : 47|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ OAT_PT_EstGroup : 4|37@0+ (1,0) [0|0] "" XXX + SG_ OAT_PT_EstV : 3|1@0+ (1,0) [0|1] "" XXX + SG_ OAT_PT_EstM : 4|1@0+ (1,0) [0|1] "" XXX + SG_ OAT_PT_Est : 39|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX + SG_ TrnOilTmpGroup : 5|30@0+ (1,0) [0|0] "" XXX + SG_ TrnOilTmpV : 5|1@0+ (1,0) [0|1] "" XXX + SG_ TrnOilTmp : 31|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ BarPrsAbsGroup : 6|23@0+ (1,0) [0|0] "" XXX + SG_ BarPrsAbsV : 6|1@0+ (1,0) [0|1] "" XXX + SG_ BarPrsAbs : 23|8@0+ (0.5,0) [0|127.5] "kPa" XXX + SG_ EngOilPrsGroup : 7|16@0+ (1,0) [0|0] "" XXX + SG_ EngOilPrsV : 7|1@0+ (1,0) [0|1] "" XXX + SG_ EngOilPrs : 15|8@0+ (4,0) [0|1020] "kPa" XXX + +BO_ 2151047168 HUD_Status_LS: 1 XXX + SG_ HUDActv : 0|1@0+ (1,0) [0|1] "" XXX + SG_ HdUpDspAnmtStat : 3|3@0+ (1,0) [0|7] "" XXX + +BO_ 2155331584 Wheel_Pulses_LS: 4 XXX + SG_ WhlPlsPerRevDrvn : 6|7@0+ (1,0) [0|127] "" XXX + SG_ WhlPlsPerRevNonDrvn : 14|7@0+ (1,0) [0|127] "" XXX + SG_ WhlRotStatTmstmpRes : 18|11@0+ (0.002,0) [0|4.094] "uSec" XXX + +BO_ 2154225664 Door_Handle_Switch_Status_LS: 1 XXX + SG_ DrvDrHndleSwAtv : 0|1@0+ (1,0) [0|1] "" XXX + SG_ PasDrHndleSwAtv : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RCHndleSwAtv : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RRDrHndleSwAtv : 3|1@0+ (1,0) [0|1] "" XXX + SG_ RLDrHndleSwAtv : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149900288 Telematics_Contol_LS: 3 XXX + SG_ EnhSrvRClsRlsRq : 1|1@0+ (1,0) [0|1] "" XXX + SG_ EnhSrvVisAlRq : 3|2@0+ (1,0) [0|3] "" XXX + SG_ EnhSrvAudAlRq : 5|2@0+ (1,0) [0|3] "" XXX + SG_ EnhSrvRmStrtRq : 7|2@0+ (1,0) [0|3] "" XXX + SG_ EnhSrvLckRq : 10|3@0+ (1,0) [0|7] "" XXX + SG_ BTTethrngPrngReq : 14|4@0+ (1,0) [0|15] "" XXX + SG_ EnhSvVehTopSpdLim : 23|8@0+ (2,0) [0|510] "km / h" XXX + +BO_ 2159001600 ODIEnumDynamicData_IPC_LS: 8 XXX + SG_ ODIEnmDynData_IPC : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODIEDDIPC_Data2Value : 2|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data1Value : 5|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data5Value : 9|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data4Value : 12|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data3Value : 15|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data8Value : 16|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data7Value : 19|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data6Value : 22|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data10Value : 26|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data9Value : 29|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data13Value : 33|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data12Value : 36|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data11Value : 39|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data16Value : 40|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data15Value : 43|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data14Value : 46|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data18Value : 50|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_Data17Value : 53|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDIPC_FUCID : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2158993408 ODIEnumDynamicData_CntrStack_LS: 8 XXX + SG_ ODIEnmDynData_CenterStack : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODIEDDCS_Data2Value : 2|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data1Value : 5|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data5Value : 9|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data4Value : 12|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data3Value : 15|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data8Value : 16|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data7Value : 19|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data6Value : 22|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data10Value : 26|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data9Value : 29|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data13Value : 33|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data12Value : 36|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data11Value : 39|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data16Value : 40|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data15Value : 43|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data14Value : 46|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data18Value : 50|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_Data17Value : 53|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDDCS_FUCID : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2154708992 Audio_Master_Source_Status_LS: 2 XXX + SG_ AudSrcStat2 : 3|12@0+ (1,0) [0|0] "" XXX + SG_ ASS2AudSrcType : 3|5@0+ (1,0) [0|31] "" XXX + SG_ ASS2AudSrcStatCode : 11|4@0+ (1,0) [0|15] "" XXX + SG_ ASS2AudSrcChType : 14|3@0+ (1,0) [0|7] "" XXX + +BO_ 2158985216 ODIDynDataMultiReq_OTIM_LS: 8 XXX + SG_ ODIDynDataMltRq_OTIM : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODDMO_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMO_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMO_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMO_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMO_ReqType : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ODDMO_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMO_DispMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMO_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMO_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMO_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMO_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMO_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2154471424 Rear_Closure_Ajar_Switch_Status: 1 XXX + SG_ RrClosAjarSwAct : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RrClsrSnwLdIO : 1|1@0+ (1,0) [0|1] "" XXX + +BO_ 2159149056 ODI_TEL_2_CenterStack_LS: 8 XXX + SG_ ODI_TEL2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159116288 ODI_TEL_2_AuxIP_LS: 8 XXX + SG_ ODI_TEL2AxIP : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2158796800 ODIIndication_LS: 8 XXX + SG_ ODIInd : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ODII_FUCID : 7|8@0+ (1,0) [0|255] "" XXX + SG_ ODII_ODIInd8 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd7 : 9|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd6 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd5 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd4 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd3 : 13|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd2 : 14|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd1 : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd16 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd15 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd14 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd13 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd12 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd11 : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd10 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd9 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd24 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd23 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd22 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd21 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd20 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd19 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd18 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd17 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd32 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd31 : 33|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd30 : 34|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd29 : 35|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd28 : 36|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd27 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd26 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd25 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd40 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd39 : 41|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd38 : 42|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd37 : 43|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd36 : 44|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd35 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd34 : 46|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd33 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd48 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd47 : 49|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd46 : 50|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd45 : 51|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd44 : 52|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd43 : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd42 : 54|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd41 : 55|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd56 : 56|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd55 : 57|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd54 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd53 : 59|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd52 : 60|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd51 : 61|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd50 : 62|1@0+ (1,0) [0|1] "" XXX + SG_ ODII_ODIInd49 : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 2158755840 ODIEvent_LS: 4 XXX + SG_ ODIEvntPkt : 13|22@0+ (1,0) [0|0] "" XXX + SG_ ODIE_EvID : 13|6@0+ (1,0) [0|63] "" XXX + SG_ ODIE_FUCID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODIE_MultiFrRetCh : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 2159157248 ODI_CenterStack_2_TEL_LS: 8 XXX + SG_ ODI_CntrStck2TEL : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2153955328 Infrastructure_Timer_Status_LS: 5 XXX + SG_ EngOffTmExtRngGroup : 0|33@0+ (1,0) [0|0] "" XXX + SG_ EngOffTmExtRngV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ EngOffTmExtRng : 39|8@0+ (4,0) [0|1020] "min" XXX + SG_ ElpsdTimeCntRstOcc : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ElpsdTimeCnt : 15|24@0+ (1,0) [0|16777215] "min" XXX + +BO_ 2151063552 Infotainment_Operation_LS: 7 XXX + SG_ InftnOprAlwd : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ValetMdAct : 1|1@0+ (1,0) [0|1] "" XXX + SG_ Frnt360CamSwAct : 2|1@0+ (1,0) [0|1] "" XXX + SG_ CamVideoICSDispAct : 3|1@0+ (1,0) [0|1] "" XXX + SG_ LRStStatDispAct : 4|1@0+ (1,0) [0|1] "" XXX + SG_ RRStStatDispAct : 5|1@0+ (1,0) [0|1] "" XXX + SG_ TrgdVidRecSwAct : 6|1@0+ (1,0) [0|1] "" XXX + SG_ RrPedDetCstStReq : 10|3@0+ (1,0) [0|7] "" XXX + SG_ IntrStopAlrtCsSetReq : 13|3@0+ (1,0) [0|7] "" XXX + SG_ ICSTchStat : 17|34@0+ (1,0) [0|0] "" XXX + SG_ ICSTS_TchPrxmty : 17|2@0+ (1,0) [0|3] "" XXX + SG_ ICSTS_X1TchCrdnt : 31|16@0+ (0.001526,0) [0|100] "" XXX + SG_ ICSTS_Y1TchCrdnt : 47|16@0+ (0.001526,0) [0|100] "" XXX + SG_ TrfRdsdInfCsStReq : 20|3@0+ (1,0) [0|7] "" XXX + SG_ CntdVehBrAltCsStReq : 23|3@0+ (1,0) [0|7] "" XXX + +BO_ 2157985792 Fob_Programming_Request_LS: 1 XXX + SG_ FobProgEvntRqd : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151284736 Park_Assistant_General_Status: 1 XXX + SG_ PrkAsstClnPrkAstIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAsstDisablIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstFld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstSnrsBlk : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstSnsDistrbdIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvPrkAstOffUnbIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAstOprtrDsrdStat_1D0 : 7|2@0+ (1,0) [0|3] "" XXX + +BO_ 2159099904 ODI_DAB_2_AuxIP_LS: 8 XXX + SG_ ODI_DAB2AxIP : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159067136 ODI_DAB_2_IPC_LS: 8 XXX + SG_ ODI_DAB2IPC : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159206400 ODI_AuxIP_2_IPC_LS: 8 XXX + SG_ ODI_AxIP2IPC : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159198208 ODI_IPC_2_AuxIP_LS: 8 XXX + SG_ ODI_IPC2AxIP : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159190016 ODI_AuxIP_2_CenterStack_LS: 8 XXX + SG_ ODI_AxIP2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159181824 ODI_CenterStack_2_AuxIP_LS: 8 XXX + SG_ ODI_CntrStck2AxIP : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159173632 ODI_IPC_2_CenterStack_LS: 8 XXX + SG_ ODI_IPC2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159165440 ODI_CenterStack_2_IPC_LS: 8 XXX + SG_ ODI_CntrStck2IPC : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159108096 ODI_AuxIP_2_DAB_LS: 8 XXX + SG_ ODI_AxIP2DAB : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159075328 ODI_IPC_2_DAB_LS: 8 XXX + SG_ ODI_IPC2DAB : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2151718912 Chime_Active: 1 XXX + SG_ ChmAct : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ChmVolSt : 2|2@0+ (1,0) [0|3] "" XXX + +BO_ 2155479040 Customization_Setting_Request_LS: 5 XXX + SG_ DrvlnCustStngReq : 2|3@0+ (1,0) [0|7] "" XXX + SG_ RstrCustFctrDef : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PedFrndlyAlrtCsStReq : 6|3@0+ (1,0) [0|7] "" XXX + SG_ SusCustStngReq : 10|3@0+ (1,0) [0|7] "" XXX + SG_ StrCustStngReq : 13|3@0+ (1,0) [0|7] "" XXX + SG_ ElvtdIdlCstStReq : 15|2@0+ (1,0) [0|3] "" XXX + SG_ SndPerfMdCsStRq : 18|3@0+ (1,0) [0|7] "" XXX + SG_ DispPerfMdCsStRq : 21|3@0+ (1,0) [0|7] "" XXX + SG_ ACCPerfMdCsStReq : 26|3@0+ (1,0) [0|7] "" XXX + SG_ DrvrStPerfMdCsStReq : 29|3@0+ (1,0) [0|7] "" XXX + SG_ PsngStPerfMdCsStReq : 34|3@0+ (1,0) [0|7] "" XXX + SG_ DrvStyPerfMdCsStReq : 37|3@0+ (1,0) [0|7] "" XXX + +BO_ 2151383040 Reset_TP_request_LS: 1 XXX + SG_ TreInfMonSysRstReq : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155421696 Passive_Entry_Challenge_LS: 5 XXX + SG_ PsvEntChlng : 7|32@0+ (1,0) [0|4294967295] "passwrd" XXX + SG_ ServKylsStSysIO : 32|1@0+ (1,0) [0|1] "" XXX + SG_ PsvEntApprchDtcd : 33|1@0+ (1,0) [0|1] "" XXX + SG_ PsvEntAprchDrctn : 36|3@0+ (1,0) [0|7] "" XXX + SG_ PsvEntApprchCnfgReq : 39|3@0+ (1,0) [0|7] "" XXX + +BO_ 2155413504 Drv_Dr_Key_Cyl_Status_LS: 3 XXX + SG_ DrvrDrKeyCylUlkSwActGroup : 1|2@0+ (1,0) [0|0] "" XXX + SG_ DrvrDrKeyCylUlkSwAct : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DrvrDrKeyCylUlkSwActV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PsvLckngReqd : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PsvApprchVehId : 15|16@0+ (1,0) [0|65535] "" XXX + +BO_ 2159026176 ODIDynamicData_LS: 8 XXX + SG_ ODIDynData : 14|55@0+ (1,0) [0|0] "" XXX + SG_ ODD_InvldData : 8|1@0+ (1,0) [0|1] "" XXX + SG_ ODD_DataType : 14|6@0+ (1,0) [0|63] "" XXX + SG_ ODD_FUCID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODD_DataId : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODD_DataVal : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2158936064 ODIEnumDynamicData_LS: 8 XXX + SG_ ODIEnmDynData : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODIEDD_Data2Value : 2|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data1Value : 5|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data5Value : 9|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data4Value : 12|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data3Value : 15|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data8Value : 16|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data7Value : 19|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data6Value : 22|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data10Value : 26|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data9Value : 29|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data13Value : 33|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data12Value : 36|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data11Value : 39|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data16Value : 40|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data15Value : 43|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data14Value : 46|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data18Value : 50|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_Data17Value : 53|3@0+ (1,0) [0|7] "" XXX + SG_ ODIEDD_FUCID : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2158845952 ODIAction_CntrStack_LS: 8 XXX + SG_ ODIActn_CntrStck : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODIAC_DaTy : 5|6@0+ (1,0) [0|63] "" XXX + SG_ ODIAC_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAC_ActnID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAC_DspMID : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAC_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2158886912 ODIDynDataListRequest_IPC_LS: 8 XXX + SG_ ODIDynDataLstRq_IPC : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ODDLI_FUCID : 7|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLI_DataId : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLI_DspMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLI_ReqDir : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLI_NmEntries : 31|7@0+ (1,0) [0|127] "" XXX + SG_ ODDLI_Idx : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ ODDLI_SubIdReqM : 51|12@0+ (1,0) [0|4095] "" XXX + SG_ ODDLI_WrpArnd : 52|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLI_BckgndFlag : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLI_ReqType : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 2151366656 Man_Prk_Brk_LS: 1 XXX + SG_ RrAxlLckIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ FrntAxlLckIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PrkBrkSwAtv : 2|1@0+ (1,0) [0|1] "" XXX + SG_ AxlLcksServIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ AxlLckUnavailIndReq : 6|3@0+ (1,0) [0|7] "" XXX + SG_ AxlLcksVDA : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149842944 Vehicle_Stability_LS: 8 XXX + SG_ IMUProtLonAccGroup : 2|11@0+ (1,0) [0|0] "" XXX + SG_ IMUProtLonAcc : 1|10@0- (0.03,0) [-15.36|15.33] "m/s^2" XXX + SG_ IMUProtLonAccV : 2|1@0+ (1,0) [0|1] "" XXX + SG_ TCSysAtv : 3|1@0+ (1,0) [0|1] "" XXX + SG_ BrkSysAutBrkFld : 4|1@0+ (1,0) [0|1] "" XXX + SG_ VSEAct : 5|1@0+ (1,0) [0|1] "" XXX + SG_ StrWhAngGroup : 6|47@0+ (1,0) [0|0] "" XXX + SG_ StrWhAngV : 6|1@0+ (1,0) [0|1] "" XXX + SG_ StrWhAng : 39|16@0- (0.0625,0) [-2048|2047.9375] "deg" XXX + SG_ StWhAnVDA : 7|1@0+ (1,0) [0|1] "" XXX + SG_ VehStabEnhmntStat : 18|3@0+ (1,0) [0|7] "" XXX + SG_ VehStabEnhmntMd : 21|3@0+ (1,0) [0|7] "" XXX + SG_ StrWhlAngSenCalStat : 23|2@0+ (1,0) [0|3] "" XXX + SG_ TCSysOpMd : 26|3@0+ (1,0) [0|7] "" XXX + SG_ TCSysOpStat : 29|3@0+ (1,0) [0|7] "" XXX + SG_ VSELatAccGroup : 52|13@0+ (1,0) [0|0] "" XXX + SG_ VSELatAcc : 51|12@0- (0.015625,0) [-32|31.984375] "m/s^2" XXX + SG_ VSELatAccV : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AdptDrvrSeatStng : 55|3@0+ (1,0) [0|7] "" XXX + +BO_ 2159132672 ODIAction_RearSeat_LS: 8 XXX + SG_ ODIActn_RSD : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODIAR_DaTy : 5|6@0+ (1,0) [0|63] "" XXX + SG_ ODIAR_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAR_ActnID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAR_DspMID : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAR_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2158968832 ODI_RearSeat_2_Centerstack_LS: 8 XXX + SG_ ODI_RSD2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2158960640 ODIIndication_Centerstack_LS: 8 XXX + SG_ ODIInd_CntrStck : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ODIIC_FUCID : 7|8@0+ (1,0) [0|255] "" XXX + SG_ ODIIC_ODIInd8 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd7 : 9|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd6 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd5 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd4 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd3 : 13|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd2 : 14|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd1 : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd16 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd15 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd14 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd13 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd12 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd11 : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd10 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd9 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd24 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd23 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd22 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd21 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd20 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd19 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd18 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd17 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd32 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd31 : 33|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd30 : 34|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd29 : 35|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd28 : 36|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd27 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd26 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd25 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd40 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd39 : 41|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd38 : 42|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd37 : 43|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd36 : 44|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd35 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd34 : 46|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd33 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd48 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd47 : 49|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd46 : 50|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd45 : 51|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd44 : 52|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd43 : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd42 : 54|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd41 : 55|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd56 : 56|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd55 : 57|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd54 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd53 : 59|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd52 : 60|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd51 : 61|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd50 : 62|1@0+ (1,0) [0|1] "" XXX + SG_ ODIIC_ODIInd49 : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 2158977024 ODIEvent_Centerstack_LS: 4 XXX + SG_ ODIEvntPkt_CntrStck : 13|22@0+ (1,0) [0|0] "" XXX + SG_ ODIEC_EvID : 13|6@0+ (1,0) [0|63] "" XXX + SG_ ODIEC_FUCID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODIEC_MultiFrRetCh : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 2158952448 ODIDynDataMultiReq_RearSeat_LS: 8 XXX + SG_ ODIDynDataMltRq_RSD : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODDMR_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMR_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMR_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMR_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMR_ReqType : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ODDMR_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMR_DispMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMR_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMR_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMR_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMR_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMR_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2158944256 ODIDynDataListReq_RearSeat_LS: 8 XXX + SG_ ODIDynDataLstRq_RSD : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ODDLR_FUCID : 7|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLR_DataId : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLR_DspMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLR_ReqDir : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLR_NmEntries : 31|7@0+ (1,0) [0|127] "" XXX + SG_ ODDLR_Idx : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ ODDLR_SubIdReqM : 51|12@0+ (1,0) [0|4095] "" XXX + SG_ ODDLR_WrpArnd : 52|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLR_BckgndFlag : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLR_ReqType : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 2158927872 ODI_DynData_CenterStack_LS: 8 XXX + SG_ ODIDynData_CntrStck : 14|55@0+ (1,0) [0|0] "" XXX + SG_ ODDC_InvldData : 8|1@0+ (1,0) [0|1] "" XXX + SG_ ODDC_DataType : 14|6@0+ (1,0) [0|63] "" XXX + SG_ ODDC_FUCID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDC_DataId : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODDC_DataVal : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2158895104 ODI_CenterStack_2_RearSeat_LS: 8 XXX + SG_ ODI_CntrStck2RSD : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2152038400 Infomatics_Response_Payload_LS: 8 XXX + SG_ InfMdRspPld : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2152022016 Infomatics_Metadata_Response_LS: 7 XXX + SG_ InfMdRspCmplt : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ InfMdRspInf : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ InfMdStRsp : 35|4@0+ (1,0) [0|15] "" XXX + SG_ AudSelctdSrcReq : 44|5@0+ (1,0) [0|31] "" XXX + SG_ AudSysVolSetCtrl : 55|8@0+ (1,0) [0|0] "" XXX + SG_ ASVSC_ReqEnbld : 48|1@0+ (1,0) [0|1] "" XXX + SG_ ASVSC_VolReq : 55|7@0+ (0.787402,0) [0|100.000054] "" XXX + +BO_ 2152005632 Infomatics_Request_Payload_LS: 8 XXX + SG_ InfMdRqstPld : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2151989248 Infomatics_Metadata_Request_LS: 5 XXX + SG_ InfMdRqstCmplt : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ InfMdRqstInt : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ InfMdStReq : 35|4@0+ (1,0) [0|15] "" XXX + +BO_ 2151972864 Fuel_Level_Status_LS: 4 XXX + SG_ FuelLvlLwIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ LnchCtrlMdReq : 2|2@0+ (1,0) [0|3] "" XXX + SG_ LnchCtrlWhlSlpReq : 7|5@0+ (1,0) [0|31] "" XXX + SG_ VehFuelRngCalcGroup : 9|18@0+ (1,0) [0|0] "" XXX + SG_ VehFuelRngCalc : 8|17@0+ (0.015625,0) [0|2047.984375] "km" XXX + SG_ VehFuelRngCalcV : 9|1@0+ (1,0) [0|1] "" XXX + SG_ LnchCtrlEngRPMReq : 15|6@0+ (1,0) [0|63] "" XXX + +BO_ 2154528768 Wheel_Grnd_Velocity_LS: 8 XXX + SG_ WhlGrndVlctyLftDrvnGroup : 6|15@0+ (1,0) [0|0] "" XXX + SG_ WhlGrndVlctyLftDrvn : 5|14@0+ (0.03125,0) [0|511.96875] "km / h" XXX + SG_ WhlGrndVlctyLftDrvnV : 6|1@0+ (1,0) [0|1] "" XXX + SG_ WhlGrndVlctyLftNnDrvnGroup : 22|15@0+ (1,0) [0|0] "" XXX + SG_ WhlGrndVlctyLftNnDrvn : 21|14@0+ (0.03125,0) [0|511.96875] "km / h" XXX + SG_ WhlGrndVlctyLftNnDrvnV : 22|1@0+ (1,0) [0|1] "" XXX + SG_ WhlGrndVlctyRtDrvnGroup : 38|15@0+ (1,0) [0|0] "" XXX + SG_ WhlGrndVlctyRtDrvn : 37|14@0+ (0.03125,0) [0|511.96875] "km / h" XXX + SG_ WhlGrndVlctyRtDrvnV : 38|1@0+ (1,0) [0|1] "" XXX + SG_ WhlGrndVlctyRtNnDrvnGroup : 54|15@0+ (1,0) [0|0] "" XXX + SG_ WhlGrndVlctyRtNnDrvn : 53|14@0+ (0.03125,0) [0|511.96875] "km / h" XXX + SG_ WhlGrndVlctyRtNnDrvnV : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150916096 Park_Heater_Info_LS: 4 XXX + SG_ PrkHtrAtv : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ClntCircPmpAct : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PrkHtrCoolntTempGroup : 2|11@0+ (1,0) [0|0] "" XXX + SG_ PrkHtrCoolntTempV : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PrkHtrCoolntTemp : 15|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ PrkHtrFlCsmdRlCntRsOc : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PrkHtrFlCnsmdRolCntGroup : 4|29@0+ (1,0) [0|0] "" XXX + SG_ PrkHtrFlCnsmdRolCntV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ PrkHtrFlCnsmdRolCnt : 23|16@0+ (3.05176E-006,0) [0|0.1999970916] "liters" XXX + SG_ PrkHtrPrhtAch : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150367232 Immobilizer_Identifier_LS: 5 XXX + SG_ ImoId : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ LrnEnvId : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ LrnEnvIdSt : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ImoIdSt : 33|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150621184 Keyless_Start_Auth_LS: 1 XXX + SG_ KylsStrAuthRslt : 7|8@0+ (1,0) [0|0] "" XXX + SG_ KSARUID8 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ KSARUID7 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ KSARUID6 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ KSARUID5 : 3|1@0+ (1,0) [0|1] "" XXX + SG_ KSARUID4 : 4|1@0+ (1,0) [0|1] "" XXX + SG_ KSARUID3 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ KSARUID2 : 6|1@0+ (1,0) [0|1] "" XXX + SG_ KSARUID1 : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151309312 Inflatable_Restraints_Key_Id_LS: 2 XXX + SG_ InflRestId : 7|16@0+ (1,0) [0|39321] "" XXX + +BO_ 2154061824 Window_Normalized_Indication_LS: 1 XXX + SG_ PsWndNtNrmIndOn : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DrWndNtNrmIndOn : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RLWndNtNrmIndOn : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RRWndNtNrmIndOn : 3|1@0+ (1,0) [0|1] "" XXX + SG_ RmtWndMvmntAtv : 4|1@0+ (1,0) [0|1] "" XXX + SG_ WndOprAlwd : 5|1@0+ (1,0) [0|1] "" XXX + SG_ RrDrUnlckIO : 6|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154512384 Rear_Closure_Rel_Sw_Sta_LS: 1 XXX + SG_ RrClosRelSwActGroup : 1|2@0+ (1,0) [0|0] "" XXX + SG_ RrClosRelSwAct : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RrClosRelSwActV : 1|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155347968 HS_Indications_Slow_LS: 8 XXX + SG_ ActVbnCtrlMlfIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ PedtrnProtSysDpl : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TirePrsLowIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ACCUnavlbleDTWthrIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EngOilStrvtnIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ SecAxlNonEmMalfIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ BrkFldLvlLwGroup : 7|4@0+ (1,0) [0|0] "" XXX + SG_ BrkFldLvlLwV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ BrkFldLvlLw : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ACCSnsClnRqdIO : 8|1@0+ (1,0) [0|1] "" XXX + SG_ ACCTmpUnavlbleIO : 9|1@0+ (1,0) [0|1] "" XXX + SG_ EngRecmndUpshftIO : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ServAdpCrsCtrlIndOn : 11|1@0+ (1,0) [0|1] "" XXX + SG_ SrvSuspSysIO : 12|1@0+ (1,0) [0|1] "" XXX + SG_ BrkPadWrnIO : 13|1@0+ (1,0) [0|1] "" XXX + SG_ BrkSysMalFuncIndOn : 15|1@0+ (1,0) [0|1] "" XXX + SG_ EngEmsRelMalfIndReq : 18|3@0+ (1,0) [0|7] "" XXX + SG_ RrAxlMalfIO : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DrShftCntrlReqDndIO : 20|1@0+ (1,0) [0|1] "" XXX + SG_ CompOvrhtIndOn : 21|1@0+ (1,0) [0|1] "" XXX + SG_ TrnsSkpShftIO : 22|1@0+ (1,0) [0|1] "" XXX + SG_ RrAxlTmpInhIO : 23|1@0+ (1,0) [0|1] "" XXX + SG_ SecAxlTmpInhIO : 24|1@0+ (1,0) [0|1] "" XXX + SG_ CPSAlrtOnlIO : 25|1@0+ (1,0) [0|1] "" XXX + SG_ EPBSysStatIndReq : 27|2@0+ (1,0) [0|3] "" XXX + SG_ EPBSysWrnIndReq : 29|2@0+ (1,0) [0|3] "" XXX + SG_ CPSFldIO : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CPSOffIO : 31|1@0+ (1,0) [0|1] "" XXX + SG_ CPSUnblIO : 32|1@0+ (1,0) [0|1] "" XXX + SG_ SrvPedtrnProtSysIO : 33|1@0+ (1,0) [0|1] "" XXX + SG_ PedtrnProtSysDisbld : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PedtrnProtVDA : 35|1@0+ (1,0) [0|1] "" XXX + SG_ AppCltchAutSrtIO : 36|1@0+ (1,0) [0|1] "" XXX + SG_ StBltTgtSetAvl : 37|1@0+ (1,0) [0|1] "" XXX + SG_ FourWhlDrvIndReq : 42|3@0+ (1,0) [0|7] "" XXX + SG_ EngRecDwnshftIO : 43|1@0+ (1,0) [0|1] "" XXX + SG_ StBltTgtCrtSetVal : 46|3@0+ (1,0) [0|7] "" XXX + SG_ HillDesCtrlRedVehSpIO : 47|1@0+ (1,0) [0|1] "" XXX + SG_ VehRollAngleGroup : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VehRollAngle : 54|7@0+ (0.703125,-45) [-45|44.296875] "deg" XXX + SG_ VehRollAngleV : 55|1@0+ (1,0) [0|1] "" XXX + SG_ ACCPerfMdCsCrStVal : 58|3@0+ (1,0) [0|7] "" XXX + SG_ ACCPerfMdCsStAvl : 59|1@0+ (1,0) [0|1] "" XXX + SG_ DrvrStPerfMdCsCrStVal : 62|3@0+ (1,0) [0|7] "" XXX + SG_ DrvrStPerfMdCsStAvl : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149777408 Non_Drvn_Whl_Rot_Status_LS: 8 XXX + SG_ WhlRotStatLftNDrvn : 7|32@0+ (1,0) [0|0] "" XXX + SG_ WRSLNDWhlDistPCntr : 1|10@0+ (1,0) [0|1023] "counts" XXX + SG_ WRSLNDWhlDistVal : 2|1@0+ (1,0) [0|1] "" XXX + SG_ WRSLNDWhlRotStRst : 3|1@0+ (1,0) [0|1] "" XXX + SG_ WRSLNDSeqNum : 5|2@0+ (1,0) [0|3] "counts" XXX + SG_ WRSLNDWhlDisTpRC : 7|2@0+ (1,0) [0|3] "counts" XXX + SG_ WRSLNDWhlDistTstm : 23|16@0+ (1,0) [0|65535] "counts" XXX + SG_ WhlRotStatRghtNDrvn : 39|32@0+ (1,0) [0|0] "" XXX + SG_ WRSRNDWhlDistPCntr : 33|10@0+ (1,0) [0|1023] "counts" XXX + SG_ WRSRNDWhlDistVal : 34|1@0+ (1,0) [0|1] "" XXX + SG_ WRSRNDWhlRotStRst : 35|1@0+ (1,0) [0|1] "" XXX + SG_ WRSRNDSeqNum : 37|2@0+ (1,0) [0|3] "counts" XXX + SG_ WRSRNDWhlDisTpRC : 39|2@0+ (1,0) [0|3] "counts" XXX + SG_ WRSRNDWhlDistTstm : 55|16@0+ (1,0) [0|65535] "counts" XXX + +BO_ 2149769216 Driven_Whl_Rotational_Stat_LS: 8 XXX + SG_ WhlRotatStatLftDrvn : 7|32@0+ (1,0) [0|0] "" XXX + SG_ WRSLDWhlDistPlsCntr : 1|10@0+ (1,0) [0|1023] "counts" XXX + SG_ WRSLDWhlDistVal : 2|1@0+ (1,0) [0|1] "" XXX + SG_ WRSLDWhlRotStatRst : 3|1@0+ (1,0) [0|1] "" XXX + SG_ WRSLDSeqNum : 5|2@0+ (1,0) [0|3] "counts" XXX + SG_ WRSLDWhlDisTpRC : 7|2@0+ (1,0) [0|3] "counts" XXX + SG_ WRSLDWhlDistTmstm : 23|16@0+ (1,0) [0|65535] "counts" XXX + SG_ WhlRotatStatRtDrvn : 39|32@0+ (1,0) [0|0] "" XXX + SG_ WRSRDWhlDistPlsCntr : 33|10@0+ (1,0) [0|1023] "counts" XXX + SG_ WRSRDWhlDistVal : 34|1@0+ (1,0) [0|1] "" XXX + SG_ WRSRDWhlRotStatRst : 35|1@0+ (1,0) [0|1] "" XXX + SG_ WRSRDSeqNum : 37|2@0+ (1,0) [0|3] "counts" XXX + SG_ WRSRDWhlDisTpRC : 39|2@0+ (1,0) [0|3] "counts" XXX + SG_ WRSRDWhlDistTmstm : 55|16@0+ (1,0) [0|65535] "counts" XXX + +BO_ 2156789760 Time_of_Day_LS: 6 XXX + SG_ CldrYr : 7|8@0+ (1,2000) [2000|2255] "year" XXX + SG_ CldrMth : 11|4@0+ (1,0) [0|15] "" XXX + SG_ FrPedDetCsStReq : 14|3@0+ (1,0) [0|7] "" XXX + SG_ CldrDay : 20|5@0+ (1,0) [0|31] "days" XXX + SG_ SmrtHgBmAstCstSetReq : 23|3@0+ (1,0) [0|7] "" XXX + SG_ TmofDay : 24|17@0+ (1,0) [0|0] "" XXX + SG_ TOD_HrofDay : 24|5@0+ (1,0) [0|31] "hr" XXX + SG_ TOD_MinofHr : 35|6@0+ (1,0) [0|63] "min" XXX + SG_ TOD_SecofMin : 45|6@0+ (1,0) [0|63] "s" XXX + SG_ TimeDispFormat : 25|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155020288 Language_Selection_LS: 1 XXX + SG_ LngSelExt : 5|6@0+ (1,0) [0|63] "" XXX + SG_ ChVolRq2 : 7|2@0+ (1,0) [0|3] "" XXX + +BO_ 2150432768 Engine_Information_4_LS: 8 XXX + SG_ TransOilTempSensPres : 0|1@0+ (1,0) [0|1] "" XXX + SG_ GenFldDutCycGroup : 1|42@0+ (1,0) [0|0] "" XXX + SG_ GenFldDutCycV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ GenFldDutCyc : 47|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ FuelFltLifRstPerf : 2|1@0+ (1,0) [0|1] "" XXX + SG_ TrnEmsMlfAtv : 3|1@0+ (1,0) [0|1] "" XXX + SG_ GrdBrkgAct : 4|1@0+ (1,0) [0|1] "" XXX + SG_ TrnsNEmsRltMalfActv : 5|1@0+ (1,0) [0|1] "" XXX + SG_ EngShtdwnPndgIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EngManfldAirTempCrtdGroup : 7|16@0+ (1,0) [0|0] "" XXX + SG_ EngManfldAirTempCrtdV : 7|1@0+ (1,0) [0|1] "" XXX + SG_ EngManfldAirTempCrtd : 15|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ FuelTotCap : 19|12@0+ (0.125,0) [0|511.875] "liters" XXX + SG_ TrnsThrmlMngmntStat : 21|2@0+ (1,0) [0|3] "" XXX + SG_ PTHiElecLdReqd : 22|1@0+ (1,0) [0|1] "" XXX + SG_ EngOilRmnLf : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ FuelFltRmnLf : 63|8@0+ (0.392157,0) [0|100.000035] "%" XXX + +BO_ 2155298816 Tire_Pressure_Sensor_Prog_Req_LS: 1 XXX + SG_ TrPrsSnsProgEvntRqd : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TrPrsMntrTrLdRstRqstd : 2|2@0+ (1,0) [0|3] "" XXX + +BO_ 2158878720 ODIDynDataListReq_CntrStack_LS: 8 XXX + SG_ ODIDynDataLstRq_CntrStck : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ODDLC_FUCID : 7|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLC_DataId : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLC_DspMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLC_ReqDir : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLC_NmEntries : 31|7@0+ (1,0) [0|127] "" XXX + SG_ ODDLC_Idx : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ ODDLC_SubIdReqM : 51|12@0+ (1,0) [0|4095] "" XXX + SG_ ODDLC_WrpArnd : 52|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLC_BckgndFlag : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLC_ReqType : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 2158870528 ODIDynDataListRequest_AuxIP_LS: 8 XXX + SG_ ODIDynDataLstRq_AxIP : 7|64@0+ (1,0) [0|0] "" XXX + SG_ ODDLA_FUCID : 7|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLA_DataId : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLA_DspMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDLA_ReqDir : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLA_NmEntries : 31|7@0+ (1,0) [0|127] "" XXX + SG_ ODDLA_Idx : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ ODDLA_SubIdReqM : 51|12@0+ (1,0) [0|4095] "" XXX + SG_ ODDLA_WrpArnd : 52|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLA_BckgndFlag : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ODDLA_ReqType : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 2154692608 Audio_Source_Status_LS: 2 XXX + SG_ AudSrcStat : 3|12@0+ (1,0) [0|0] "" XXX + SG_ ASSAudSrcType : 3|5@0+ (1,0) [0|31] "" XXX + SG_ ASSAudSrcStatCode : 11|4@0+ (1,0) [0|15] "" XXX + SG_ ASSAudSrcChType : 14|3@0+ (1,0) [0|7] "" XXX + SG_ LgclAVChnl : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 2154627072 Audio_Master_Arbitration_Command: 2 XXX + SG_ AudMstrArbCom : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LgclAVChnl_368 : 7|4@0+ (1,0) [0|15] "" XXX + SG_ AudMstrSrcTyp : 12|5@0+ (1,0) [0|31] "" XXX + SG_ AudMstrChnnlTyp : 15|3@0+ (1,0) [0|7] "" XXX + +BO_ 2151112704 Occupant_Sensning_Status_LS: 2 XXX + SG_ FrntPassClass : 2|3@0+ (1,0) [0|7] "" XXX + SG_ FrPsSeatOccSnsOpMd : 5|3@0+ (1,0) [0|7] "N/A" XXX + SG_ FrPasSeatResCtrlOccStGroup : 7|14@0+ (1,0) [0|0] "" XXX + SG_ FrPasSeatResCtrlOccSt : 7|2@0+ (1,0) [0|3] "" XXX + SG_ FrPasSeatResCtrlOccStV : 10|1@0+ (1,0) [0|1] "" XXX + SG_ FrPsSeatOccFltSt : 9|2@0+ (1,0) [0|3] "N/A" XXX + SG_ FrPasSeatbltRemOccSt : 11|1@0+ (1,0) [0|1] "" XXX + +BO_ 2153938944 Remote_Reflash_Req_LS: 1 XXX + SG_ RmtRflshMdReqtd : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2159239168 ODI_TEL_2_OTIM_LS: 8 XXX + SG_ ODI_TEL2OTIM : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159230976 ODI_OTIM_2_TEL_LS: 8 XXX + SG_ ODI_OTIM2TEL : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159222784 ODI_PDIM_2_CenterStack_LS: 8 XXX + SG_ ODI_PDIM2CntrStck : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2159214592 ODI_CenterStack_2_PDIM_LS: 8 XXX + SG_ ODI_CntrStck2PDIM : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2158862336 ODIAction_OTIM_LS: 8 XXX + SG_ ODIActn_OTIM : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODIAOT_DaTy : 5|6@0+ (1,0) [0|63] "" XXX + SG_ ODIAOT_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAOT_ActnID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAOT_DspMID : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAOT_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2150662144 Environment_Id_Resp_3_LS: 3 XXX + SG_ EnvIdRsp3 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ EnvIdRspSt3 : 17|2@0+ (1,0) [0|3] "" XXX + +BO_ 2150653952 Environment_Id_Resp_2_LS: 3 XXX + SG_ EnvIdRsp2 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ EnvIdRspSt2 : 17|2@0+ (1,0) [0|3] "" XXX + +BO_ 2150850560 Seatbelt_Information_LS: 1 XXX + SG_ DrSbltAtcGroup : 1|2@0+ (1,0) [0|0] "" XXX + SG_ DrSbltAtc : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DrSbltAtcV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PsSbltAtcGroup : 3|2@0+ (1,0) [0|0] "" XXX + SG_ PsSbltAtc : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PsSbltAtcV : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154659840 Column_Lock_Status_2: 2 XXX + SG_ UnlckRtryRotIndOn : 2|1@0+ (1,0) [0|1] "" XXX + SG_ UnlockRtryPshIndOn : 3|1@0+ (1,0) [0|1] "" XXX + SG_ StrgClmnLckVisNot : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ClmnLckStatGroup : 5|6@0+ (1,0) [0|0] "" XXX + SG_ ClmnLckStat : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ClmnLckStatV : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ClmSysFlrIndOn : 7|1@0+ (1,0) [0|1] "" XXX + SG_ StrngClmnLckTT : 9|2@0+ (1,0) [0|3] "" XXX + +BO_ 2154938368 Fob_Programming_Mode_Status_LS: 1 XXX + SG_ FobProgMdStat : 1|2@0+ (1,0) [0|3] "" XXX + +BO_ 2155266048 Rear_Seat_Heat_Cool_Switches_LS: 1 XXX + SG_ RLHCSeatSw1Act : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSeatSw2Act : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSeatSw3Act : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSeatSw1Act : 3|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSeatSw2Act : 4|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSeatSw3Act : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155249664 Rear_Seat_Heat_Cool_Control_LS: 4 XXX + SG_ RLHCSModeIndCtrl : 4|5@0+ (1,0) [0|0] "" XXX + SG_ RLHCSMInd3 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSMInd2 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSMInd1 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSMIndReq : 4|2@0+ (1,0) [0|3] "" XXX + SG_ RRHCSModeIndCtrl : 12|5@0+ (1,0) [0|0] "" XXX + SG_ RRHCSMInd3 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSMInd2 : 9|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSMInd1 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSMIndReq : 12|2@0+ (1,0) [0|3] "" XXX + SG_ RLHCSeatLevIndCtrl : 22|7@0+ (1,0) [0|0] "" XXX + SG_ RLHCSLSeatLev5 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSLSeatLev4 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSLSeatLev3 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSLSeatLev2 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSLSeatLev1 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RLHCSLIndReq : 22|2@0+ (1,0) [0|3] "" XXX + SG_ RRHCSeatLevIndCtrl : 30|7@0+ (1,0) [0|0] "" XXX + SG_ RRHCSLSeatLev5 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSLSeatLev4 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSLSeatLev3 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSLSeatLev2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSLSeatLev1 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ RRHCSLIndReq : 30|2@0+ (1,0) [0|3] "" XXX + +BO_ 2155184128 CruiseControl_LS: 3 XXX + SG_ CrsCntAtv : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CrsSpdLmtrSwStat : 4|4@0+ (1,0) [0|15] "" XXX + SG_ TrnsShftLvrLckStat : 5|1@0+ (1,0) [0|1] "" XXX + SG_ RrStRmndrIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ RrStRmndrCstSetAvail : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CrsCntrlSwStat : 15|8@0+ (1,0) [0|0] "" XXX + SG_ CrsCntrlSwStSwDataIntgty : 9|2@0+ (1,0) [0|3] "" XXX + SG_ CrsCntrlSwStSpDcSwAct : 10|1@0+ (1,0) [0|1] "" XXX + SG_ CrsCntrlSwStSpdInSwAct : 11|1@0+ (1,0) [0|1] "" XXX + SG_ CrsCntrlSwStSetSwAct : 12|1@0+ (1,0) [0|1] "" XXX + SG_ CrsCntrlSwStResSwAct : 13|1@0+ (1,0) [0|1] "" XXX + SG_ CrsCntrlSwStOnSwAct : 14|1@0+ (1,0) [0|1] "" XXX + SG_ CrsCntrlSwStCanSwAct : 15|1@0+ (1,0) [0|1] "" XXX + SG_ SmPhRmFunCstCurStVal : 18|3@0+ (1,0) [0|7] "" XXX + SG_ SmPhRmFunCstStAval : 19|1@0+ (1,0) [0|1] "" XXX + SG_ IdlRecmndToClEngIO : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RrStRmndrCstCurrSetVal : 23|3@0+ (1,0) [0|7] "" XXX + +BO_ 2155167744 Power_Mode_Info_LS: 3 XXX + SG_ ShftPrkIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ShftToNtrlIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ Ky_IdDevPr : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SecPwrMdPshBtnAtv : 3|1@0+ (1,0) [0|1] "" XXX + SG_ TransModActIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ TransModInactIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ KylsStrtUseTxPckIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ TrStLgMdAtv : 7|1@0+ (1,0) [0|1] "" XXX + SG_ VehMovState : 10|3@0+ (1,0) [0|7] "" XXX + SG_ AutoShtdwnDsblIO : 11|1@0+ (1,0) [0|1] "" XXX + SG_ AppPrkBrkIO : 12|1@0+ (1,0) [0|1] "" XXX + SG_ NRmtDtdPsCluRstIO : 13|1@0+ (1,0) [0|1] "" XXX + SG_ ApplyBrkPdlIO : 14|1@0+ (1,0) [0|1] "" XXX + SG_ ApplyCltPdlIO : 15|1@0+ (1,0) [0|1] "" XXX + SG_ NoReDetInOn : 16|1@0+ (1,0) [0|1] "" XXX + SG_ NRmtDtdPsBrkRstIO : 17|1@0+ (1,0) [0|1] "" XXX + SG_ PrsBtnAgnTTrnEngOffIO : 18|1@0+ (1,0) [0|1] "" XXX + SG_ TSLgMdPwrCtOWAtv : 19|1@0+ (1,0) [0|1] "" XXX + SG_ NRmtDtctdRstrtAllwd : 20|1@0+ (1,0) [0|1] "" XXX + SG_ PrsStrtAgnIO : 21|1@0+ (1,0) [0|1] "" XXX + SG_ PrsCltchPrsStrtAgnIO : 22|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154921984 Fob_Status_LS: 2 XXX + SG_ RFAFnc : 1|10@0+ (1,0) [0|0] "" XXX + SG_ RFRmtCntFobNm : 1|3@0+ (1,0) [0|7] "" XXX + SG_ RFRmtCntFobBatLw : 8|1@0+ (1,0) [0|1] "" XXX + SG_ RFRmtCntrlFobFnc : 14|6@0+ (1,0) [0|63] "" XXX + SG_ FobPogLimRchdIndOn : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151317504 Park_Assistant_Rear_Status: 4 XXX + SG_ PrkAsstRrExtdDist : 3|12@0+ (0.01,0) [0|40.95] "m" XXX + SG_ PrkAstRrSysStat : 5|2@0+ (1,0) [0|3] "" XXX + SG_ PARrRgn1ObjStat : 19|4@0+ (1,0) [0|15] "" XXX + SG_ PARrRgn2ObjStat : 23|4@0+ (1,0) [0|15] "" XXX + SG_ PARrRgn3ObjStat : 27|4@0+ (1,0) [0|15] "" XXX + SG_ PARrRgn4ObjStat : 31|4@0+ (1,0) [0|15] "" XXX + +BO_ 2151301120 Park_Assistant_Front_Status: 4 XXX + SG_ PrkAsstFrtExtdDist : 3|12@0+ (0.01,0) [0|40.95] "m" XXX + SG_ PrkAstFrSysStat : 5|2@0+ (1,0) [0|3] "" XXX + SG_ PrkAstAdvSysAct : 6|1@0+ (1,0) [0|1] "" XXX + SG_ PrkAsstRrOffIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ PAFrtRgn1ObjStat : 19|4@0+ (1,0) [0|15] "" XXX + SG_ PAFrtRgn2ObjStat : 23|4@0+ (1,0) [0|15] "" XXX + SG_ PAFrtRgn3ObjStat : 27|4@0+ (1,0) [0|15] "" XXX + SG_ PAFrtRgn4ObjStat : 31|4@0+ (1,0) [0|15] "" XXX + +BO_ 2159083520 ODI_TEL_2_IPC_LS: 8 XXX + SG_ ODI_TEL2IPC : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2153922560 Climate_Control_Voltage_LS: 3 XXX + SG_ ClimCtrlVoltBstModReq : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ClmtCtrlHtrEngRunRq : 1|1@0+ (1,0) [0|1] "" XXX + SG_ HtrVlvRqstdPstn : 3|2@0+ (1,0) [0|3] "" XXX + SG_ ClntHtrElecPwrRatGroup : 4|13@0+ (1,0) [0|0] "" XXX + SG_ ClntHtrElecPwrRatV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ClntHtrElecPwrRat : 15|8@0+ (0.04,0) [0|10.2] "kW" XXX + SG_ ClmCtrHiVltPwrRqtd : 23|8@0+ (0.1,0) [0|25.5] "kW" XXX + +BO_ 2153807872 Door_Open_Switch_Status_LS: 1 XXX + SG_ DrDoorOpenSwActGroup : 1|2@0+ (1,0) [0|0] "" XXX + SG_ DrDoorOpenSwAct : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DrDoorOpenSwActV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ PsDoorOpenSwActGroup : 3|2@0+ (1,0) [0|0] "" XXX + SG_ PsDoorOpenSwAct : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PsDoorOpenSwActV : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ClmSysAuxFlrIndOn : 4|1@0+ (1,0) [0|1] "" XXX + SG_ PsvStrtStrngClmnLckTT : 6|2@0+ (1,0) [0|3] "" XXX + +BO_ 2150703104 Audio_Amplifier_Status: 1 XXX + SG_ AudSysDigSigProcPres : 0|1@0+ (1,0) [0|1] "" XXX + SG_ AudSysSurSndSysPres : 1|1@0+ (1,0) [0|1] "" XXX + SG_ AudSysVNoisCompPres : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151399424 Wash_Level_LS: 1 XXX + SG_ WshFldLw : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151956480 Driver_Workload_LS: 2 XXX + SG_ DrvWrkldLvl : 3|4@0+ (1,0) [0|15] "" XXX + SG_ ClstrHMIAnmSt : 6|3@0+ (1,0) [0|7] "" XXX + SG_ ClstrHMIRdy : 7|1@0+ (1,0) [0|1] "" XXX + SG_ StrWhlThbwhlCnts : 13|6@0- (1,0) [-32|31] "counts" XXX + +BO_ 2151940096 Alarm_2_Request_LS: 7 XXX + SG_ Alrm2ExtRngReq : 1|26@0+ (1,0) [0|0] "" XXX + SG_ A2ERRAlrmReq : 1|2@0+ (1,0) [0|3] "" XXX + SG_ A2ERRAlrmTime : 15|24@0+ (1,0) [0|16777215] "min" XXX + SG_ EstBulkIntAirTmpGroup : 2|35@0+ (1,0) [0|0] "" XXX + SG_ EstBulkIntAirTmpV : 2|1@0+ (1,0) [0|1] "" XXX + SG_ EstBulkIntAirTmp : 39|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX + SG_ EstIntRfSrfcTmpGroup : 3|44@0+ (1,0) [0|0] "" XXX + SG_ EstIntRfSrfcTmpV : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EstIntRfSrfcTmp : 47|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX + SG_ EstIntHorzDshSrfTmpGroup : 4|53@0+ (1,0) [0|0] "" XXX + SG_ EstIntHorzDshSrfTmpM : 4|1@0+ (1,0) [0|1] "" XXX + SG_ EstIntHorzDshSrfTmp : 55|8@0+ (1,-40) [-40|215] "deg C" XXX + +BO_ 2151923712 Alarm_1_Request_LS: 5 XXX + SG_ Alrm1ExtRngReq : 1|26@0+ (1,0) [0|0] "" XXX + SG_ A1ERRAlrmReq : 1|2@0+ (1,0) [0|3] "" XXX + SG_ A1ERRAlrmTime : 15|24@0+ (1,0) [0|16777215] "min" XXX + SG_ HLOCCstCurrSetVal : 6|3@0+ (1,0) [0|7] "" XXX + SG_ HLOCCstSetAvail : 7|1@0+ (1,0) [0|1] "" XXX + SG_ HLOCCstAvail : 39|7@0+ (1,0) [0|0] "" XXX + SG_ HLOCCA_Res4Avail : 33|1@0+ (1,0) [0|1] "" XXX + SG_ HLOCCA_Res3Avail : 34|1@0+ (1,0) [0|1] "" XXX + SG_ HLOCCA_Res2Avail : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HLOCCA_Res1Avail : 36|1@0+ (1,0) [0|1] "" XXX + SG_ HLOCCA_OnOpnOnlyAvail : 37|1@0+ (1,0) [0|1] "" XXX + SG_ HLOCCA_OnAvail : 38|1@0+ (1,0) [0|1] "" XXX + SG_ HLOCCA_OffAvail : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150645760 Environment_Id_Resp_1_LS: 3 XXX + SG_ EnvIdRsp1 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ EnvIdRspSt1 : 17|2@0+ (1,0) [0|3] "" XXX + +BO_ 2152464384 Lane_Departure_Warning_LS: 3 XXX + SG_ LaneDepWrnDisbldIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ LnKpAstDisbldIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SrvcLaneDepWrnSysIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SrvcLnKpAstSysIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ HndsOffStrWhlDtIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ TnDrvLDWOffUnbIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LftLnDepWrnSt : 7|2@0+ (1,0) [0|3] "" XXX + SG_ LaneDepWrnIndCntrl : 13|6@0+ (1,0) [0|0] "" XXX + SG_ LDWIC_LnDepWAWLn : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LDWIC_Ind2 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ LDWIC_Ind1 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ LDWIC_IndReq : 13|2@0+ (1,0) [0|3] "" XXX + SG_ RtLnDepWrnSt : 15|2@0+ (1,0) [0|3] "" XXX + SG_ LnKpAstIndCntrl : 21|6@0+ (1,0) [0|0] "" XXX + SG_ LKAIC_AdbWngLn : 17|2@0+ (1,0) [0|3] "" XXX + SG_ LKAIC_Ind2 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ LKAIC_Ind1 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ LKAIC_IndReq : 21|2@0+ (1,0) [0|3] "" XXX + +BO_ 2154971136 Front_Seat_Heat_Cool_Switches_LS: 1 XXX + SG_ DrvHCSeatSw1Act : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSeatSw2Act : 1|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSeatSw3Act : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSeatSw1Act : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSeatSw2Act : 4|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSeatSw3Act : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154962944 Front_Seat_Heat_Cool_Control_LS: 4 XXX + SG_ DrvHCSModeIndCtrl : 4|5@0+ (1,0) [0|0] "" XXX + SG_ DrvHCSMInd3 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSMInd2 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSMInd1 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSMIndReq : 4|2@0+ (1,0) [0|3] "" XXX + SG_ PassHCSModeIndCtrl : 12|5@0+ (1,0) [0|0] "" XXX + SG_ PassHCSMInd3 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSMInd2 : 9|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSMInd1 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSMIndReq : 12|2@0+ (1,0) [0|3] "" XXX + SG_ DrvHCSLevIndCtrl : 22|7@0+ (1,0) [0|0] "" XXX + SG_ DrvHCSLSeatLev5 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSLSeatLev4 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSLSeatLev3 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSLSeatLev2 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSLSeatLev1 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ DrvHCSLIndReq : 22|2@0+ (1,0) [0|3] "" XXX + SG_ PassHCSeatLevIndCtrl : 30|7@0+ (1,0) [0|0] "" XXX + SG_ PassHCSLSeatLev5 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSLSeatLev4 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSLSeatLev3 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSLSeatLev2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSLSeatLev1 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ PassHCSLIndReq : 30|2@0+ (1,0) [0|3] "" XXX + +BO_ 2156232704 Alarm_Clock_Status_LS: 4 XXX + SG_ AlrmClkStat : 7|32@0+ (1,0) [0|0] "" XXX + SG_ ACSAlarm3 : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm2 : 3|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm1 : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm0 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm7 : 9|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm6 : 11|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm5 : 13|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm4 : 15|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm11 : 17|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm10 : 19|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm9 : 21|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm8 : 23|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm15 : 25|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm14 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm13 : 29|2@0+ (1,0) [0|3] "" XXX + SG_ ACSAlarm12 : 31|2@0+ (1,0) [0|3] "" XXX + +BO_ 2154987520 Hood_Status_LS: 1 XXX + SG_ HdStGroup : 2|3@0+ (1,0) [0|0] "" XXX + SG_ HdSt : 1|2@0+ (1,0) [0|3] "" XXX + SG_ HdStV : 2|1@0+ (1,0) [0|1] "" XXX + SG_ WrlsChrgSysChrgStat : 5|3@0+ (1,0) [0|7] "" XXX + +BO_ 2154840064 Compass_Status_LS: 4 XXX + SG_ CmpsOctHdingDataSrc : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CmpsModFltPrs : 1|1@0+ (1,0) [0|1] "" XXX + SG_ CmpsModManCalInPrc : 2|1@0+ (1,0) [0|1] "" XXX + SG_ CmpsZnNvrSet : 3|1@0+ (1,0) [0|1] "" XXX + SG_ CmpsDecZone : 11|4@0+ (1,0) [0|15] "" XXX + SG_ CmpsOctHding : 14|3@0+ (1,0) [0|7] "" XXX + SG_ CmpsSatrtd : 15|1@0+ (1,0) [0|1] "" XXX + SG_ CmpsCrHding : 23|16@0+ (0.0054932,0) [0|359.996862] "deg" XXX + +BO_ 2154676224 Compass_Request_LS: 1 XXX + SG_ CmpsDecZonCmndVal : 3|4@0+ (1,0) [0|15] "" XXX + SG_ CmpsDecZonSetReq : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CmpsModManCalReq : 5|1@0+ (1,0) [0|1] "" XXX + SG_ CmpsModSlfTstReq : 6|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154643456 Auxiliary_Heater_Status_LS: 3 XXX + SG_ AuxHtrAtv : 0|1@0+ (1,0) [0|1] "" XXX + SG_ HtrCoreInltClntTmpCalcGroup : 4|21@0+ (1,0) [0|0] "" XXX + SG_ HtrCoreInltClntTmpCalcV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ HtrCoreInltClntTmpCalc : 23|8@0+ (1,-40) [-40|215] "deg C" XXX + SG_ CCClntCrcFlwRtReq : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX + +BO_ 2154905600 Driver_Identifier_LS: 1 XXX + SG_ DrId : 2|3@0+ (1,0) [0|7] "" XXX + SG_ DrvSeatPrsMemID : 5|3@0+ (1,0) [0|7] "" XXX + +BO_ 2154954752 High_Volt_Climate_Pwr_Status_LS: 5 XXX + SG_ ClmtHtPwrRqd : 0|1@0+ (1,0) [0|1] "" XXX + SG_ HtdStWhlCmd : 2|2@0+ (1,0) [0|3] "" XXX + SG_ HtdStWhlInd : 4|2@0+ (1,0) [0|3] "" XXX + SG_ HtdStWhlCtrlSrc : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ClntHtrElecPwrReq : 15|8@0+ (0.04,0) [0|10.2] "kW" XXX + SG_ EstACCompPwrRchCbnCmf : 23|8@0+ (0.04,0) [0|10.2] "kw" XXX + SG_ EstACCompPwrMtnCbnCmf : 31|8@0+ (0.04,0) [0|10.2] "kW" XXX + +BO_ 2153381888 Control_Power_Liftgate_LS: 4 XXX + SG_ FnshRrClsrMtnBfrDrvIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RrClsrObstclDtctd : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RrClsrInMtn : 3|1@0+ (1,0) [0|1] "" XXX + SG_ RrClosOpenSwActGroup : 4|3@0+ (1,0) [0|0] "" XXX + SG_ RrClosOpenSwAct : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RrClosOpenSwActV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ RrWprInhbRq : 5|1@0+ (1,0) [0|1] "" XXX + SG_ GrgPrgMdCmpl : 6|1@0+ (1,0) [0|1] "" XXX + SG_ PwrLftgtInclAngGroup : 7|16@0+ (1,0) [0|0] "" XXX + SG_ PwrLftgtInclAngV : 7|1@0+ (1,0) [0|1] "" XXX + SG_ PwrLftgtInclAng : 15|8@0+ (1,0) [0|255] "" XXX + SG_ VehIncAngEst : 23|8@0+ (1,0) [0|255] "deg" XXX + SG_ PwrLftgtMotStat : 26|3@0+ (1,0) [0|7] "" XXX + SG_ VltActRrAccUnavlIO : 27|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149752832 Chassis_Information_LS: 8 XXX + SG_ VehHghtStatGroup : 0|9@0+ (1,0) [0|0] "" XXX + SG_ VehHghtStatV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ VehHghtStat : 11|4@0+ (1,0) [0|15] "" XXX + SG_ IntBrkAssPreFilReq : 1|1@0+ (1,0) [0|1] "N/A" XXX + SG_ BksOvht : 2|1@0+ (1,0) [0|1] "" XXX + SG_ HalfSysFail : 3|1@0+ (1,0) [0|1] "" XXX + SG_ BrkSysRedBrkTlltlReq : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ABSAtv : 5|1@0+ (1,0) [0|1] "" XXX + SG_ DrvlnCustStngAvlbl : 6|1@0+ (1,0) [0|1] "" XXX + SG_ StrCustStngAvlbl : 7|1@0+ (1,0) [0|1] "" XXX + SG_ PrkBrkVDA : 12|1@0+ (1,0) [0|1] "" XXX + SG_ PowStVDA : 13|1@0+ (1,0) [0|1] "" XXX + SG_ RrDrCntVDA : 14|1@0+ (1,0) [0|1] "" XXX + SG_ BrkSysVDA : 15|1@0+ (1,0) [0|1] "" XXX + SG_ SprTireSt : 18|3@0+ (1,0) [0|7] "" XXX + SG_ EPBSysAudWarnReq : 20|2@0+ (1,0) [0|3] "" XXX + SG_ EPBSysDspMsgReq : 23|3@0+ (1,0) [0|7] "" XXX + SG_ DrvlnCustCurrStngVal : 26|3@0+ (1,0) [0|7] "" XXX + SG_ StrCustCurrStngVal : 29|3@0+ (1,0) [0|7] "" XXX + SG_ SusCustStngAvlbl : 30|1@0+ (1,0) [0|1] "" XXX + SG_ EBDFailed : 31|1@0+ (1,0) [0|1] "" XXX + SG_ SusCustCurrStngVal : 34|3@0+ (1,0) [0|7] "" XXX + SG_ HillDscntCntlSysStat : 37|3@0+ (1,0) [0|7] "" XXX + SG_ ElecPrkBrkStat : 39|2@0+ (1,0) [0|3] "" XXX + SG_ HlStrAssActIO : 41|1@0+ (1,0) [0|1] "" XXX + SG_ ColPrSysStngAvl : 42|1@0+ (1,0) [0|1] "" XXX + SG_ GNCustSetngAvlbl : 44|1@0+ (1,0) [0|1] "" XXX + SG_ GNCustCrntStngVal : 47|3@0+ (1,0) [0|7] "" XXX + SG_ CPSInfotmntMtReq : 49|2@0+ (1,0) [0|3] "" XXX + SG_ ColPrSysCrntStng : 52|3@0+ (1,0) [0|7] "" XXX + SG_ SndEnhcmtPerfMdRq : 55|3@0+ (1,0) [0|7] "" XXX + SG_ DispPerfMdCsCrStVal : 58|3@0+ (1,0) [0|7] "" XXX + SG_ DispPerfMdCsStAvl : 59|1@0+ (1,0) [0|1] "" XXX + SG_ SndPerfMdCsCrStVal : 62|3@0+ (1,0) [0|7] "" XXX + SG_ SndPerfMdCsStAvl : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151514112 Reset_OilLife_Request_LS: 1 XXX + SG_ EngOilLfRstRq : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2158903296 ODIDynDataMultiRequest_AuxIP_LS: 8 XXX + SG_ ODIDynDataMltRq_AuxIP : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODDMA_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMA_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMA_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMA_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMA_ReqType : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ODDMA_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMA_DispMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMA_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMA_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMA_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMA_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMA_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2158911488 ODIDynDataMultiReq_CntrStack_LS: 8 XXX + SG_ ODIDynDataMltRq_CntrStck : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODDMC_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMC_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMC_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMC_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMC_ReqType : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ODDMC_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMC_DispMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMC_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMC_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMC_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMC_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMC_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2158919680 ODIDynDataMultiRequest_IPC_LS: 8 XXX + SG_ ODIDynDataMltRq_IPC : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODDMI_DataID2Vld : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMI_DataID3Vld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMI_DataID4Vld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMI_DataID5Vld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ODDMI_ReqType : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ODDMI_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMI_DispMID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMI_DataID1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMI_DataID2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMI_DataID3 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMI_DataID4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ ODDMI_DataID5 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2151825408 Outside_Air_Temperature_LS: 3 XXX + SG_ OtsAirTmpCrValGroup : 0|9@0+ (1,0) [0|0] "" XXX + SG_ OtsAirTmpCrValV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ OtsAirTmpCrVal : 15|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX + SG_ OtsAirTmpGroup : 1|18@0+ (1,0) [0|0] "" XXX + SG_ OtsAirTmpV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ OtsAirTmp : 23|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX + SG_ OtsAirTmpCrValMsk : 2|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151153664 Rear_Window_Defog_Status_LS: 1 XXX + SG_ RrWndDfgOn : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151170048 Trailer_Status_LS: 2 XXX + SG_ TrlrHtchSwAtv : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrBrkLtFld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrFgLtFld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrRvsLtFld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrTlLtFld : 4|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrFgLtPrs : 5|1@0+ (1,0) [0|1] "" XXX + SG_ TrlrRtTrInLtFld : 6|1@0+ (1,0) [0|1] "" XXX + SG_ TrlLfTrInLtFld : 7|1@0+ (1,0) [0|1] "" XXX + SG_ LftSecTrnIndFld : 8|1@0+ (1,0) [0|1] "" XXX + SG_ RtSecTrnIndFld : 9|1@0+ (1,0) [0|1] "" XXX + SG_ DisRrPrmryLmps : 10|1@0+ (1,0) [0|1] "" XXX + SG_ RLftPrkLmpFld : 11|1@0+ (1,0) [0|1] "" XXX + SG_ RRPrkLmpFld : 12|1@0+ (1,0) [0|1] "" XXX + SG_ RrEndCrrStat : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151841792 Wipe_Wash_Status_LS: 1 XXX + SG_ TurnWprIntIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RnSnsActIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RnSnsOffIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ WSWprAct : 3|1@0+ (1,0) [0|1] "" XXX + SG_ HtdFrntWSSt : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154995712 Air_Conditioning_Comp_Type_LS: 1 XXX + SG_ HVHtrOvrTmpIndOn : 3|1@0+ (1,0) [0|1] "" XXX + SG_ HVHtrFldIO : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154094592 Adjustable_Pedal_Motion_Inh_LS: 8 XXX + SG_ AdjPdlMotInhbtd : 0|1@0+ (1,0) [0|1] "" XXX + SG_ IntDimSeldAnmTypStVal : 4|4@0+ (1,0) [0|15] "" XXX + SG_ IntDimSeldClrTypStVal : 12|5@0+ (1,0) [0|31] "" XXX + SG_ IntDimAnmTypAvl : 22|15@0+ (1,0) [0|0] "" XXX + SG_ IDATA_AnmTyp6Avl : 16|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp5Avl : 17|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp4Avl : 18|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp3Avl : 19|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp2Avl : 20|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp1Avl : 21|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_OffAvl : 22|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp14Avl : 24|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp13Avl : 25|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp12Avl : 26|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp11Avl : 27|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp10Avl : 28|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp9Avl : 29|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp8Avl : 30|1@0+ (1,0) [0|1] "" XXX + SG_ IDATA_AnmTyp7Avl : 31|1@0+ (1,0) [0|1] "" XXX + SG_ IntDimClrTypAvl : 38|31@0+ (1,0) [0|0] "" XXX + SG_ IDCTA_ClrTyp6Avl : 32|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp5Avl : 33|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp4Avl : 34|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp3Avl : 35|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp2Avl : 36|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp1Avl : 37|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_OffAvl : 38|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp14Avl : 40|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp13Avl : 41|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp12Avl : 42|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp11Avl : 43|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp10Avl : 44|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp9Avl : 45|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp8Avl : 46|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp7Avl : 47|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp22Avl : 48|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp21Avl : 49|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp20Avl : 50|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp19Avl : 51|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp18Avl : 52|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp17Avl : 53|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp16Avl : 54|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp15Avl : 55|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp30Avl : 56|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp29Avl : 57|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp28Avl : 58|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp27Avl : 59|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp26Avl : 60|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp25Avl : 61|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp24Avl : 62|1@0+ (1,0) [0|1] "" XXX + SG_ IDCTA_ClrTyp23Avl : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149711872 ACC_YawRate_Information_LS: 8 XXX + SG_ ACCDrvrSeltdSpd : 3|12@0+ (0.0625,0) [0|255.9375] "km / h" XXX + SG_ AdapCrsCntVDA : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ACCAct370 : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CrsCntlDrSelSpdAct : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CrsSpdLmtrDrvSelSpd : 19|12@0+ (0.0625,0) [0|255.9375] "km / h" XXX + SG_ ACCHdwyStg : 22|3@0+ (1,0) [0|7] "" XXX + SG_ FwdClnAlrtPr : 23|1@0+ (1,0) [0|1] "" XXX + SG_ VehDynYawRateGroup : 36|13@0+ (1,0) [0|0] "" XXX + SG_ VehDynYawRate : 35|12@0- (0.0625,0) [-128|127.9375] "deg/sec" XXX + SG_ VehDynYawRateV : 36|1@0+ (1,0) [0|1] "" XXX + SG_ SpdLmtrSpdWrngEnbld : 37|1@0+ (1,0) [0|1] "" XXX + SG_ SpdLmtrSpdWrngAct : 38|1@0+ (1,0) [0|1] "" XXX + SG_ FwdClnAlrtOffIO : 39|1@0+ (1,0) [0|1] "" XXX + SG_ FwdObjAlrtInd : 48|9@0+ (1,0) [0|0] "" XXX + SG_ FOAI_AlrtChmIhbRq : 48|1@0+ (1,0) [0|1] "" XXX + SG_ FOAI_AlrtWrnIndRq : 59|4@0+ (1,0) [0|15] "" XXX + SG_ FOAI_VehAhdIndRq : 63|4@0+ (1,0) [0|15] "" XXX + SG_ AutoMdSpdLmtStat : 50|2@0+ (1,0) [0|3] "" XXX + SG_ ACCAutoSetSpdStat : 52|2@0+ (1,0) [0|3] "" XXX + SG_ SetSpdLmtRchd : 54|2@0+ (1,0) [0|3] "" XXX + +BO_ 2153979904 BulbOutage_LS: 2 XXX + SG_ CHMSLFld : 0|1@0+ (1,0) [0|1] "" XXX + SG_ FLTrnIndLtFld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ FRTrnIndLtFld : 2|1@0+ (1,0) [0|1] "" XXX + SG_ LftBrkLtFld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ LftLwBmFld : 4|1@0+ (1,0) [0|1] "" XXX + SG_ LftPrkLtFld : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LicPltLtFld : 6|1@0+ (1,0) [0|1] "" XXX + SG_ RLTrnIndLtFld : 7|1@0+ (1,0) [0|1] "" XXX + SG_ RRTrnIndLtFld : 8|1@0+ (1,0) [0|1] "" XXX + SG_ RtBrkLtFld : 9|1@0+ (1,0) [0|1] "" XXX + SG_ RtLwBmFld : 10|1@0+ (1,0) [0|1] "" XXX + SG_ RtPrkLtFld : 11|1@0+ (1,0) [0|1] "" XXX + SG_ RFgLtFld : 12|1@0+ (1,0) [0|1] "" XXX + SG_ RvsLtFld : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LftDytmRunLmpFld : 14|1@0+ (1,0) [0|1] "" XXX + SG_ RtDytmRunLmpFld : 15|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150154240 Passive_Entry_Reply_LS: 8 XXX + SG_ PsvEntVehIdExt : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ PsvEntChlngRply : 39|32@0+ (1,0) [0|4294967295] "passwrd" XXX + +BO_ 2155003904 Side_Blind_Zone_Alert_Status: 2 XXX + SG_ SBZASysClnIndOn : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SBZASysOffIndOn : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SBZASysSrvIndOn : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SBZATmpUnvIndOn : 3|1@0+ (1,0) [0|1] "" XXX + SG_ LftLnChgThrt : 4|1@0+ (1,0) [0|1] "" XXX + SG_ LfLnChngThrtAprchSpd : 15|8@0- (1,0) [-128|127] "km/h" XXX + +BO_ 2150817792 Airbag_Impact_Data_5: 3 XXX + SG_ ImpMaxLateralDeltaVel : 7|8@0- (1,0) [-128|127] "" XXX + SG_ ImpMaxLongDeltaVel : 15|8@0- (1,0) [-128|127] "" XXX + SG_ ImpTimeToMaxDeltaVel : 23|8@0+ (10,0) [0|2550] "ms" XXX + +BO_ 2150227968 Phone_Speech_Rec_Status_LS: 1 XXX + SG_ PhnSpRcgnApSt : 1|2@0+ (1,0) [0|3] "" XXX + +BO_ 2162982912 VIN_Digits_10_to_17: 8 XXX + SG_ VehIdNmDig10_17 : 7|64@0+ (1,0) [0|1] "" XXX + +BO_ 2162966528 VIN_Digits_2_to_9: 8 XXX + SG_ VehIdNmDig2_9 : 7|64@0+ (1,0) [0|1] "" XXX + +BO_ 2151497728 Tire_Pressure_Sensors_LS: 6 XXX + SG_ TireLFPrsGroup : 0|17@0+ (1,0) [0|0] "" XXX + SG_ TireLFPrsV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TireLFPrs : 23|8@0+ (4,0) [0|1020] "kPaG" XXX + SG_ TireRFPrsGroup : 1|34@0+ (1,0) [0|0] "" XXX + SG_ TireRFPrsV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TireRFPrs : 39|8@0+ (4,0) [0|1020] "kPaG" XXX + SG_ TireLFPrsStat : 4|3@0+ (1,0) [0|7] "" XXX + SG_ TireRFPrsStat : 7|3@0+ (1,0) [0|7] "" XXX + SG_ TireLRPrsGroup : 8|17@0+ (1,0) [0|0] "" XXX + SG_ TireLRPrsV : 8|1@0+ (1,0) [0|1] "" XXX + SG_ TireLRPrs : 31|8@0+ (4,0) [0|1020] "kPaG" XXX + SG_ TireRRPrsGroup : 9|34@0+ (1,0) [0|0] "" XXX + SG_ TireRRPrsV : 9|1@0+ (1,0) [0|1] "" XXX + SG_ TireRRPrs : 47|8@0+ (4,0) [0|1020] "kPaG" XXX + SG_ TireLRPrsStat : 12|3@0+ (1,0) [0|7] "" XXX + SG_ TireRRPrsStat : 15|3@0+ (1,0) [0|7] "" XXX + +BO_ 2151219200 Remote_Start_Status: 1 XXX + SG_ RemStrtSt : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RmVehStrRq : 1|1@0+ (1,0) [0|1] "" XXX + +BO_ 2153775104 DTC_Triggered: 7 XXX + SG_ DTCInfo : 7|56@0+ (1,0) [0|0] "" XXX + SG_ DTCI_DTCTriggered : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DTCIUnused1 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ DTCIUnused2 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DTCIUnused3 : 3|1@0+ (1,0) [0|1] "" XXX + SG_ DTCIUnused4 : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DTCIUnused5 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ DTCIUnused6 : 6|1@0+ (1,0) [0|1] "" XXX + SG_ DTCIUnused7 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_DTCSource : 15|8@0+ (1,0) [0|255] "" XXX + SG_ DTCI_DTCNumber : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ DTCI_DTCFailType : 39|8@0+ (1,0) [0|255] "" XXX + SG_ DTCI_CodeSupported : 40|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_CurrentStatus : 41|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_TstNPsdCdClrdSt : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_TstFldCdClrdStat : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_HistStat : 44|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_TstNPsdPwrUpSt : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_TstFldPwrUpSt : 46|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_WrnIndRqdSt : 47|1@0+ (1,0) [0|1] "" XXX + SG_ DTCI_DTCFaultType : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 2151235584 Vehicle_Theft_Notification_Stat: 5 XXX + SG_ DrIdDevLrnd : 0|1@0+ (1,0) [0|1] "" XXX + SG_ VehSecSysFldIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ VTDTmprDetected : 2|1@0+ (1,0) [0|1] "" XXX + SG_ EhnSrvEngImmStat : 3|1@0+ (1,0) [0|1] "" XXX + SG_ IllDrIdDevDtctd : 4|1@0+ (1,0) [0|1] "" XXX + SG_ AlcKyIIncmIndOn : 5|1@0+ (1,0) [0|1] "" XXX + SG_ VehSecStrgColLckPwdGroup : 6|31@0+ (1,0) [0|0] "" XXX + SG_ VehSecStrgColLckPwdV : 6|1@0+ (1,0) [0|1] "" XXX + SG_ VehSecStrgColLckPwd : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ VehSecAuthnSesComp : 7|1@0+ (1,0) [0|1] "" XXX + SG_ VhSecNImmoIndRq : 9|2@0+ (1,0) [0|3] "" XXX + SG_ StrgColLckCmd : 11|2@0+ (1,0) [0|3] "" XXX + SG_ NmofPrgKFbExtd : 15|4@0+ (1,0) [0|15] "" XXX + SG_ VehStatStAtv : 32|1@0+ (1,0) [0|1] "" XXX + SG_ EhnSrvImmbComRst : 33|1@0+ (1,0) [0|1] "" XXX + SG_ ClmSysBkupFlrIndOn : 34|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150809600 Airbag_Impact_Data_4: 8 XXX + SG_ ImpDltVlcSamp12 : 7|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS12_Axis1 : 7|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS12_Axis2 : 15|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp13 : 23|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS13_Axis1 : 23|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS13_Axis2 : 31|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp14 : 39|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS14_Axis1 : 39|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS14_Axis2 : 47|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp15 : 55|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS15_Axis1 : 55|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS15_Axis2 : 63|8@0- (1,0) [-128|127] "counts" XXX + +BO_ 2150793216 Airbag_Impact_Data_2: 8 XXX + SG_ ImpDltVlcSamp4 : 7|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS4_Axis1 : 7|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS4_Axis2 : 15|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp5 : 23|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS5_Axis1 : 23|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS5_Axis2 : 31|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp6 : 39|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS6_Axis1 : 39|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS6_Axis2 : 47|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp7 : 55|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS7_Axis1 : 55|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS7_Axis2 : 63|8@0- (1,0) [-128|127] "counts" XXX + +BO_ 2150801408 Airbag_Impact_Data_3: 8 XXX + SG_ ImpDltVlcSamp8 : 7|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS8_Axis1 : 7|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS8_Axis2 : 15|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp9 : 23|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS9_Axis1 : 23|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS9_Axis2 : 31|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp10 : 39|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS10_Axis1 : 39|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS10_Axis2 : 47|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp11 : 55|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS11_Axis1 : 55|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS11_Axis2 : 63|8@0- (1,0) [-128|127] "counts" XXX + +BO_ 2150785024 Airbag_Impact_Data_1: 8 XXX + SG_ ImpDltVlcScal : 7|8@0+ (0.00245,0.706) [0.706|1.33075] "kph/cnt" XXX + SG_ AirbgAccelOrien : 10|3@0+ (45,0) [0|315] "deg" XXX + SG_ ImpDltVlcSamp1 : 23|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS1_Axis1 : 23|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS1_Axis2 : 31|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp2 : 39|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS2_Axis1 : 39|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS2_Axis2 : 47|8@0- (1,0) [-128|127] "counts" XXX + SG_ ImpDltVlcSamp3 : 55|16@0+ (1,0) [0|0] "" XXX + SG_ IDVS3_Axis1 : 55|8@0- (1,0) [-128|127] "counts" XXX + SG_ IDVS3_Axis2 : 63|8@0- (1,0) [-128|127] "counts" XXX + +BO_ 2151202816 Rear_Window_Defog_Inhibit: 5 XXX + SG_ RrWndDfgInhRq : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RrWndDfgSwAtv : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ILSSCommErr : 2|1@0+ (1,0) [0|1] "" XXX + SG_ IPSnsrRwSolrIntFltd : 3|1@0+ (1,0) [0|1] "" XXX + SG_ IPSnsrSolrAnglFltd : 4|1@0+ (1,0) [0|1] "" XXX + SG_ IPSnsrTpCvrTempFltd : 5|1@0+ (1,0) [0|1] "" XXX + SG_ AuxHtrAlwd : 6|1@0+ (1,0) [0|1] "" XXX + SG_ IPSnsrRwSolrInt : 15|8@0+ (3,0) [0|765] "W/m2" XXX + SG_ IPSnsrSolrAzmthAngl : 23|8@0+ (2,-180) [-180|330] "deg" XXX + SG_ IPSnsrSolrElvtnAngl : 31|8@0+ (1,0) [0|255] "deg" XXX + SG_ IPSnsrTpCvrTemp : 39|8@0+ (0.5,-40) [-40|87.5] "deg C" XXX + +BO_ 2150825984 Airbag_Indications: 6 XXX + SG_ FsnDrvStbltIC : 7|8@0+ (1,0) [0|0] "" XXX + SG_ FDSIC_IndPer : 3|4@0+ (1,0) [0|15] "" XXX + SG_ FDSIC_IndDC : 6|3@0+ (12.5,12.5) [12.5|100] "%" XXX + SG_ FDSIC_IO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ FsnPsngStbltIC : 15|8@0+ (1,0) [0|0] "" XXX + SG_ FPSIC_IndPer : 11|4@0+ (1,0) [0|15] "" XXX + SG_ FPSIC_IndDtCyc : 14|3@0+ (12.5,12.5) [12.5|100] "%" XXX + SG_ FPSIC_IO : 15|1@0+ (1,0) [0|1] "" XXX + SG_ AirbgIC : 23|8@0+ (1,0) [0|0] "" XXX + SG_ AirbgICIndPer : 19|4@0+ (1,0) [0|15] "" XXX + SG_ AirbgICDutCyc : 22|3@0+ (12.5,12.5) [12.5|100] "%" XXX + SG_ AirbgICIO : 23|1@0+ (1,0) [0|1] "" XXX + SG_ FstnSndRwLtPsStbtInR : 25|2@0+ (1,0) [0|3] "" XXX + SG_ FstnSndRwCtPsStbtInR : 27|2@0+ (1,0) [0|3] "" XXX + SG_ FstnSndRwRtPsStbtInR : 29|2@0+ (1,0) [0|3] "" XXX + SG_ FsnDrStbAuxIR : 31|2@0+ (1,0) [0|3] "" XXX + SG_ FsnPsStbAuxIR : 34|3@0+ (1,0) [0|7] "" XXX + SG_ AirbgFldIO : 35|1@0+ (1,0) [0|1] "" XXX + SG_ SndRwStbltRdIndMd : 37|2@0+ (1,0) [0|3] "" XXX + SG_ FstnThrdRwCtPsStbtInR : 39|2@0+ (1,0) [0|3] "" XXX + SG_ FstnThrdRwRtPsStbtInR : 41|2@0+ (1,0) [0|3] "" XXX + SG_ FstnThrdRwLtPsStbtInR : 43|2@0+ (1,0) [0|3] "" XXX + SG_ SrvIntdPdstProtSysIO : 44|1@0+ (1,0) [0|1] "" XXX + SG_ PdstIntdProtSysDsbld : 45|1@0+ (1,0) [0|1] "" XXX + SG_ PdstIntdProtSysDplyd : 46|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151759872 Door_Lock_Command: 4 XXX + SG_ CntrlLckRqwExtActFun : 9|18@0+ (1,0) [0|0] "" XXX + SG_ CLRAF_Unl_Lk : 9|3@0+ (1,0) [0|7] "" XXX + SG_ CLRAF_FuelD : 16|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_RrCls : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_Hd : 18|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_RLD : 19|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_RRD : 20|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_PD : 21|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_DD : 22|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_ActFunc : 28|5@0+ (1,0) [0|31] "" XXX + SG_ CLRAF_UnandRsv3 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_UnandRsv2 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CLRAF_UnandRsv1 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ RrClsRelRq : 10|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149974016 Content_Theft_Sensor_Status: 3 XXX + SG_ SrvAlrmSysIO : 0|1@0+ (1,0) [0|1] "" XXX + SG_ IntrSnsDisbld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgDrvDr : 3|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgPsngDr : 4|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgRrRtDr : 5|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgRrLftDr : 6|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrigTonn : 7|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgTrnk : 8|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgTltSns : 9|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgIntMvmntSns : 10|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrggrdBattRcnctd : 11|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgGlsBrkSns : 12|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgNonOffPM : 13|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrigMidClsr : 14|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmTrgdIO : 15|1@0+ (1,0) [0|1] "" XXX + SG_ AlrmStat : 18|3@0+ (1,0) [0|7] "" XXX + SG_ AlrmTrgHd : 21|1@0+ (1,0) [0|1] "" XXX + +BO_ 2151907328 Steering_Wheel_Control_Switches: 1 XXX + SG_ StrgWhlUnit1SwStat : 3|4@0+ (1,0) [0|15] "" XXX + SG_ StrgWhlUnit2SwStat : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 2150219776 Voice_Recognition_Status: 1 XXX + SG_ PhnSpRcgnRq : 1|2@0+ (1,0) [0|3] "" XXX + SG_ VcRecVcFdbckSt : 3|2@0+ (1,0) [0|3] "" XXX + +BO_ 2152685568 Radiomarks_Response: 8 XXX + SG_ RadBrdcstSrc : 3|4@0+ (1,0) [0|15] "" XXX + SG_ RadConInfReqSrc : 7|4@0+ (1,0) [0|15] "" XXX + SG_ RadConInfCmd : 11|4@0+ (1,0) [0|15] "" XXX + SG_ RadConInfID : 31|40@0+ (1,0) [0|1099511627775] "" XXX + +BO_ 2151874560 Vehicle_Theft_Notify_Reset_Req: 8 XXX + SG_ EhnSrvEngImmbCom : 0|57@0+ (1,0) [0|0] "" XXX + SG_ ESEIC_EngImmbRq : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ESEIC_EngImRqPsw : 15|56@0+ (1,0) [0|1] "" XXX + SG_ RstVTDTmprDtctd : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RstIllDrIdDevDtctd : 2|1@0+ (1,0) [0|1] "" XXX + SG_ RstDrIdDevLrnd : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150268928 GPS_Date_and_Time_LS: 6 XXX + SG_ CldrYr_154 : 7|8@0+ (1,2000) [2000|2255] "year" XXX + SG_ CldrMth_154 : 11|4@0+ (1,0) [0|15] "" XXX + SG_ CldrDay_154 : 20|5@0+ (1,0) [0|31] "days" XXX + SG_ HrsGroup : 29|6@0+ (1,0) [0|0] "" XXX + SG_ Hrs : 28|5@0+ (1,0) [0|31] "h" XXX + SG_ HrsV : 29|1@0+ (1,0) [0|1] "" XXX + SG_ MinsGroup : 38|7@0+ (1,0) [0|0] "" XXX + SG_ Mins : 37|6@0+ (1,0) [0|63] "min" XXX + SG_ MinsV : 38|1@0+ (1,0) [0|1] "" XXX + SG_ SecGroup : 46|7@0+ (1,0) [0|0] "" XXX + SG_ Sec : 45|6@0+ (1,0) [0|63] "s" XXX + SG_ SecV : 46|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150137856 RFA_Status_LS: 3 XXX + SG_ FobPrevLrndIndOn : 0|1@0+ (1,0) [0|1] "" XXX + SG_ Ky_IdDevNotPrIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ FbProgCustActRqd : 2|1@0+ (1,0) [0|1] "" XXX + SG_ KeyInWrnIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ VehSecAtoLrnAtv : 4|1@0+ (1,0) [0|1] "" XXX + SG_ Ky_IdDevPrgmAuthReq : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LMTTCPrsnOffStat : 6|1@0+ (1,0) [0|1] "" XXX + SG_ VehSecAtoLrnDlyTmr : 12|5@0+ (1,0) [0|31] "min" XXX + SG_ FldTpMotReq : 15|3@0+ (1,0) [0|7] "" XXX + SG_ RemCtrlFobNumForProgER : 19|4@0+ (1,0) [0|15] "" XXX + +BO_ 2151677952 Chime_Command: 5 XXX + SG_ SndChrs : 3|28@0+ (1,0) [0|0] "" XXX + SG_ SC_SndTne : 3|4@0+ (1,0) [0|15] "" XXX + SG_ SC_SndCdnPrd : 15|8@0+ (10,0) [0|2550] "ms" XXX + SG_ SC_NmofRp : 23|8@0+ (1,0) [0|255] "reps" XXX + SG_ SC_SndDutCyc : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ SndLoc : 7|4@0+ (1,0) [0|0] "" XXX + SG_ SndLocRtRr : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SndLocLftRr : 5|1@0+ (1,0) [0|1] "" XXX + SG_ SndLocPasFr : 6|1@0+ (1,0) [0|1] "" XXX + SG_ SndLocDrFr : 7|1@0+ (1,0) [0|1] "" XXX + SG_ SndPriority : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 2150776832 Airbag_Status: 6 XXX + SG_ ShfUlkBrToShftIndCtrl : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ShftLkdBuStbltIndCtrl : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SbItlkTrnsShftLvLkRd : 2|1@0+ (1,0) [0|1] "" XXX + SG_ MmryRclImpctDisRq : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EvntEnbld : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SftyMuteRd : 5|1@0+ (1,0) [0|1] "" XXX + SG_ HybVehHiVltInvDisRqd : 6|1@0+ (1,0) [0|1] "" XXX + SG_ HybImpSnsDsbld : 7|1@0+ (1,0) [0|1] "" XXX + SG_ SIREvntSychCntr : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ FrPsngrStOccSnsngPriDat : 39|16@0+ (1,0) [0|39321] "" XXX + +BO_ 2150760448 Airbag_Impact_Data: 8 XXX + SG_ SIRDpl : 1|1@0+ (1,0) [0|1] "" XXX + SG_ NotPsSeatStat : 5|2@0+ (1,0) [0|3] "" XXX + SG_ NotDrvSeatStat : 7|2@0+ (1,0) [0|3] "" XXX + SG_ NotSecRowRtSeaOccStat : 9|2@0+ (1,0) [0|3] "" XXX + SG_ NotSndRwMdlSeatStat : 11|2@0+ (1,0) [0|3] "" XXX + SG_ NotSndRwRtSeatStat : 13|2@0+ (1,0) [0|3] "" XXX + SG_ NotSndRwLtSeatStat : 15|2@0+ (1,0) [0|3] "" XXX + SG_ NotEventStat : 17|2@0+ (1,0) [0|3] "" XXX + SG_ NotSecRowLeSeaOccStat : 25|2@0+ (1,0) [0|3] "" XXX + SG_ NotSecRowCtSeaOccStat : 27|2@0+ (1,0) [0|3] "" XXX + SG_ NotiFrntPasSeatOccSta : 34|3@0+ (1,0) [0|7] "" XXX + SG_ NoEvDeLoSt : 46|7@0+ (1,0) [0|0] "" XXX + SG_ NEDLSSdCrtnArbgDpld : 40|1@0+ (1,0) [0|1] "" XXX + SG_ NEDLSRtSdArbgDld : 41|1@0+ (1,0) [0|1] "" XXX + SG_ NEDLSLtSdArbgDld : 42|1@0+ (1,0) [0|1] "" XXX + SG_ NEDLSPaFrSt2De : 43|1@0+ (1,0) [0|1] "" XXX + SG_ NEDLSPaFrSt1De : 44|1@0+ (1,0) [0|1] "" XXX + SG_ NEDLSDrFrSt2De : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NEDLSDrFrSt1De : 46|1@0+ (1,0) [0|1] "" XXX + SG_ NoEvSevSt : 54|7@0+ (1,0) [0|0] "" XXX + SG_ NESSRoSevSt : 48|1@0+ (1,0) [0|1] "" XXX + SG_ NESSRiSiSevSt : 49|1@0+ (1,0) [0|1] "" XXX + SG_ NESSReImpSevSt : 50|1@0+ (1,0) [0|1] "" XXX + SG_ NESSLeSiSevSt : 51|1@0+ (1,0) [0|1] "" XXX + SG_ NESSFrImpSt2SevSt : 52|1@0+ (1,0) [0|1] "" XXX + SG_ NESSFrImpSt1SevSt : 53|1@0+ (1,0) [0|1] "" XXX + SG_ NESSFrImpPreSevSt : 54|1@0+ (1,0) [0|1] "" XXX + SG_ NotiEventCount : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 2155872256 Fuel_Information: 6 XXX + SG_ FlLvlPctGroup : 0|9@0+ (1,0) [0|0] "" XXX + SG_ FlLvlPctV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ FlLvlPct : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ FlInjRlCtRstOcc : 1|1@0+ (1,0) [0|1] "" XXX + SG_ FuelFltChgNwIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DrvStyPerfMdCsCrStVal : 5|3@0+ (1,0) [0|7] "" XXX + SG_ DrvStyPerfMdCsStAvl : 6|1@0+ (1,0) [0|1] "" XXX + SG_ RdWhlAngGroup : 23|8@0+ (1,0) [0|0] "" XXX + SG_ RdWhlAng : 22|7@0+ (0.703125,-45) [-45|44.296875] "deg" XXX + SG_ RdWhlAngV : 23|1@0+ (1,0) [0|1] "" XXX + SG_ VehPitchAngleGroup : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VehPitchAngle : 30|7@0+ (0.703125,-45) [-45|44.296875] "deg" XXX + SG_ VehPitchAngleV : 31|1@0+ (1,0) [0|1] "" XXX + SG_ FlInjRlCt : 39|16@0+ (3.05176E-005,0) [0|1.999970916] "liters" XXX + +BO_ 2156175360 Display_Measurement_System_LS: 1 XXX + SG_ DispMeasSysExt : 1|2@0+ (1,0) [0|3] "" XXX + SG_ DispMeasSys : 2|1@0+ (1,0) [0|1] "" XXX + SG_ NtVsnSysEnbld : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149859328 System_Power_Mode_Backup_LS: 1 XXX + SG_ SysBkupPwrMdEn : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SysBkUpPwrMdGroup : 3|4@0+ (1,0) [0|0] "" XXX + SG_ SysBkUpPwrMd : 1|2@0+ (1,0) [0|3] "" XXX + SG_ SysBkUpPwrMdV : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 2158854144 ODIAction_IPC_LS: 8 XXX + SG_ ODIActn_IPC : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODIAI_DaTy : 5|6@0+ (1,0) [0|63] "" XXX + SG_ ODIAI_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAI_ActnID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAI_DspMID : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAI_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2158837760 ODIAction_AuxIP_LS: 8 XXX + SG_ ODIActn_AxIP : 5|62@0+ (1,0) [0|0] "" XXX + SG_ ODIAA_DaTy : 5|6@0+ (1,0) [0|63] "" XXX + SG_ ODIAA_FUCID : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAA_ActnID : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAA_DspMID : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ODIAA_ActnVal : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2159091712 ODI_IPC_2_TEL_LS: 8 XXX + SG_ ODI_IPC2TEL : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2154561536 Vehicle_Odo_LS: 5 XXX + SG_ VehOdoGroup : 7|40@0+ (1,0) [0|0] "" XXX + SG_ VehOdo : 7|32@0+ (0.015625,0) [0|67108863.984375] "km" XXX + SG_ VehOdoV : 32|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149908480 Brake_Pedal_Status_LS: 2 XXX + SG_ BrkPedInitTrvlAchvdStat : 1|2@0+ (1,0) [0|0] "" XXX + SG_ BrkPedTrvlAchvdV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ BrkPedTrvlAchvd : 1|1@0+ (1,0) [0|1] "" XXX + SG_ BrkPdlModTrvlGroup : 3|2@0+ (1,0) [0|0] "" XXX + SG_ BrkPdlModTrvl : 2|1@0+ (1,0) [0|1] "" XXX + SG_ BrkPdlModTrvlV : 3|1@0+ (1,0) [0|1] "" XXX + SG_ BrkPdlPos : 15|8@0+ (0.392157,0) [0|100.000035] "% full" XXX + +BO_ 2151268352 Column_Lock_Status: 1 XXX + SG_ ClmnLckTT : 1|2@0+ (1,0) [0|3] "" XXX + +BO_ 2150604800 Right_Rear_Door_Status: 1 XXX + SG_ RRDoorAjarSwAct : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150588416 Passenger_Door_Status_LS: 1 XXX + SG_ PDAjrSwAtv : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150596608 Left_Rear_Door_Status: 1 XXX + SG_ RLDoorAjarSwAct : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 2155036672 Climate_Control_General_Status: 6 XXX + SG_ ACCompNormLdGroup : 0|9@0+ (1,0) [0|0] "" XXX + SG_ ACCompNormLdV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ACCompNormLd : 15|8@0+ (0.1,0) [0|25.5] "l/min" XXX + SG_ ACCmEngRunReq : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ACCmpsrFldOn : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ACCompModReq : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ClmtCtrlTrgtTemp : 17|10@0+ (0.1,-10) [-10|92.3] "deg C" XXX + +BO_ 2150424576 Engine_Information_3_LS: 8 XXX + SG_ TrnsEngdStateGroup : 2|3@0+ (1,0) [0|0] "" XXX + SG_ TrnsEngdState : 1|2@0+ (1,0) [0|3] "" XXX + SG_ TrnsEngdStateV : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ACRfHiSdFldPrsGroup : 3|20@0+ (1,0) [0|0] "" XXX + SG_ ACRfHiSdFldPrsV : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ACRfHiSdFldPrs : 23|8@0+ (14,0) [0|3570] "kPaG" XXX + SG_ ACCompCmnd : 4|1@0+ (1,0) [0|1] "" XXX + SG_ RrAxlELSDCplLwResGroup : 5|46@0+ (1,0) [0|0] "" XXX + SG_ RrAxlELSDCplLwResV : 5|1@0+ (1,0) [0|1] "" XXX + SG_ RrAxlELSDCplLwRes : 47|8@0+ (10,0) [0|2550] "Nm" XXX + SG_ EngAirIntBstPrGroup : 6|39@0+ (1,0) [0|0] "" XXX + SG_ EngAirIntBstPrV : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EngAirIntBstPr : 39|8@0- (1,0) [-128|127] "kPaG" XXX + SG_ ExtHlStrAssCsStAvl : 7|1@0+ (1,0) [0|1] "" XXX + SG_ TrnsRngInhbtStat : 10|3@0+ (1,0) [0|7] "" XXX + SG_ DrvtShftCntrlTrgtGear : 14|4@0+ (1,0) [0|15] "" XXX + SG_ ACCmpNrmLdGrdAld : 31|8@0+ (0.1,0) [0|25.5] "dm3/m/s" XXX + SG_ EngTrqDrRqdExtRngGroup : 52|13@0+ (1,0) [0|0] "" XXX + SG_ EngTrqDrRqdExtRng : 51|12@0+ (0.5,-848) [-848|1199.5] "Nm" XXX + SG_ EngTrqDrRqdExtRngV : 52|1@0+ (1,0) [0|1] "" XXX + SG_ ExtHlStrAssCsCrStVal : 55|3@0+ (1,0) [0|7] "" XXX + +BO_ 2150416384 Engine_Information_2_LS: 8 XXX + SG_ EngBstPrsIndGroup : 0|33@0+ (1,0) [0|0] "" XXX + SG_ EngBstPrsIndV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ EngBstPrsInd : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ VaccBoostFailure : 2|1@0+ (1,0) [0|1] "" XXX + SG_ GenFld : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EngSpdLmtnMdAct : 4|1@0+ (1,0) [0|1] "" XXX + SG_ PTWrmgWtToShftIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ EngNEmsnsRelMalfAct : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EngCstFlCutAct : 7|1@0+ (1,0) [0|1] "" XXX + SG_ EngRunAtv : 8|1@0+ (1,0) [0|1] "" XXX + SG_ EngIdlAtv : 11|1@0+ (1,0) [0|1] "" XXX + SG_ VehTopSpdLmtMdAct : 13|1@0+ (1,0) [0|1] "" XXX + SG_ EngCylDeactMd : 15|2@0+ (1,0) [0|3] "" XXX + SG_ TransEstGearGroup : 20|5@0+ (1,0) [0|0] "" XXX + SG_ TransEstGear : 19|4@0+ (1,0) [0|15] "" XXX + SG_ TransEstGearV : 20|1@0+ (1,0) [0|1] "" XXX + SG_ EngTrqActExtRngGroup : 21|46@0+ (1,0) [0|0] "" XXX + SG_ EngTrqActExtRngV : 21|1@0+ (1,0) [0|1] "" XXX + SG_ EngTrqActExtRng : 51|12@0+ (0.5,-848) [-848|1199.5] "Nm" XXX + SG_ EngVDA : 22|1@0+ (1,0) [0|1] "" XXX + SG_ TrnsVDA : 23|1@0+ (1,0) [0|1] "" XXX + SG_ EngCoolFanSpd : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ VehTopSpdLmtArbVal : 47|8@0+ (2,0) [0|510] "km / h" XXX + SG_ EngSpdStat : 53|2@0+ (1,0) [0|3] "" XXX + SG_ RmVhStrtEngRng : 54|1@0+ (1,0) [0|1] "" XXX + SG_ TrnCrpMdAtv : 55|1@0+ (1,0) [0|1] "" XXX + +BO_ 2150408192 Engine_Information_1_LS: 8 XXX + SG_ TrnsSftMdStat : 2|3@0+ (1,0) [0|7] "" XXX + SG_ ThrPosGroup : 3|36@0+ (1,0) [0|0] "" XXX + SG_ ThrPosV : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ThrPos : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ AccActPosGroup : 4|45@0+ (1,0) [0|0] "" XXX + SG_ AccActPosV : 4|1@0+ (1,0) [0|1] "" XXX + SG_ AccActPos : 47|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ ElcRngSelDrvAct : 5|1@0+ (1,0) [0|1] "" XXX + SG_ TmpDrvrShftCtlAct : 6|1@0+ (1,0) [0|1] "" XXX + SG_ AccPdlOvrrdAtv : 7|1@0+ (1,0) [0|1] "" XXX + SG_ TrnShftPtrnActStat : 10|3@0+ (1,0) [0|7] "" XXX + SG_ TransTUDMdStat : 12|2@0+ (1,0) [0|3] "" XXX + SG_ Eng12vStrtrMtrCmmdOn : 13|1@0+ (1,0) [0|1] "" XXX + SG_ EngRunng : 14|1@0+ (1,0) [0|1] "" XXX + SG_ TrnsShftLvrPosGroup : 15|48@0+ (1,0) [0|0] "" XXX + SG_ TrnsShftLvrPosV : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TrnsShftLvrPos : 51|4@0+ (1,0) [0|15] "" XXX + SG_ EngSpd : 23|16@0+ (0.25,0) [0|16383.75] "rpm" XXX + SG_ AutoTransComndGear : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CrsCntEnbld : 56|1@0+ (1,0) [0|1] "" XXX + SG_ CltStartSwAtvGroup : 58|2@0+ (1,0) [0|0] "" XXX + SG_ CltStartSwAtv : 57|1@0+ (1,0) [0|1] "" XXX + SG_ CltStartSwAtvV : 58|1@0+ (1,0) [0|1] "" XXX + SG_ TopTrvlCltchSwActGroup : 60|2@0+ (1,0) [0|0] "" XXX + SG_ TopTrvlCltchSwAct : 59|1@0+ (1,0) [0|1] "" XXX + SG_ TopTrvlCltchSwActV : 60|1@0+ (1,0) [0|1] "" XXX + SG_ AdptPsngrSeatStng : 63|3@0+ (1,0) [0|7] "" XXX + +BO_ 2155954176 Climate_Control_Basic_Status_LS: 4 XXX + SG_ ACHtIdleBstLevReq : 1|2@0+ (1,0) [0|3] "" XXX + SG_ ClimCtrlAftBlowModActv : 2|1@0+ (1,0) [0|1] "" XXX + SG_ AirCndActIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ClmCntlExtDefActIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ClntCircPmpRq : 7|1@0+ (1,0) [0|1] "" XXX + SG_ ClmCntFrBlwFnSp : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ AirCndCmptLdEst : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ ClmCntRrBlwFnSp : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + +BO_ 2153971712 Driver_Door_Status: 1 XXX + SG_ LftglsAjrSwAct : 1|1@0+ (1,0) [0|1] "" XXX + SG_ LftglsRelSwAct : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DDAjrSwAtvGroup : 7|8@0+ (1,0) [0|0] "" XXX + SG_ DDAjrSwAtv : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DDAjrSwAtvM : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149875712 Battery_Voltage: 7 XXX + SG_ BatVltGroup : 0|17@0+ (1,0) [0|0] "" XXX + SG_ BatVltV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ BatVlt : 23|8@0+ (0.1,3) [3|28.5] "volts" XXX + SG_ BatSaverIO : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SrvBattChrgSysIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ BatSOCGroup : 3|28@0+ (1,0) [0|0] "" XXX + SG_ BatSOCV : 3|1@0+ (1,0) [0|1] "" XXX + SG_ BatSOC : 31|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ BattStOfChrgCrtyLow : 4|1@0+ (1,0) [0|1] "" XXX + SG_ IntlgntBattSnsFldIO : 5|1@0+ (1,0) [0|1] "" XXX + SG_ BattStOfChrgLowIO : 6|1@0+ (1,0) [0|1] "" XXX + SG_ DCCnvStblznErrIO : 7|1@0+ (1,0) [0|1] "" XXX + SG_ EnrgMgtLdShdRq : 11|4@0+ (1,0) [0|15] "" XXX + SG_ BattVltIRq : 13|2@0+ (1,0) [0|3] "" XXX + SG_ PwrMdOffBattSOC : 39|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ BattCrntFltrd : 47|8@0- (0.5,0) [-64|63.5] "A" XXX + SG_ BatSvrMdSevLvl : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 2151186432 Auto_High_Beam_Status: 1 XXX + SG_ AutoBmSlctStat : 1|2@0+ (1,0) [0|3] "" XXX + SG_ CtLghtDet : 2|1@0+ (1,0) [0|1] "" XXX + SG_ AutoHgBmCtrlInOn : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 2149629952 Lighting_Status_LS: 5 XXX + SG_ OtsdAmbtLtLvlStatGroup : 0|23@0+ (1,0) [0|0] "" XXX + SG_ OtsdAmbtLtLvlStatV : 0|1@0+ (1,0) [0|1] "" XXX + SG_ OtsdAmbtLtLvlStat : 27|2@0+ (1,0) [0|3] "" XXX + SG_ DRLAct : 1|1@0+ (1,0) [0|1] "" XXX + SG_ HazSwAtv : 2|1@0+ (1,0) [0|1] "" XXX + SG_ PrkLtLeftIO : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PrkLtRightIO : 4|1@0+ (1,0) [0|1] "" XXX + SG_ TrnSwAct : 6|2@0+ (1,0) [0|3] "" XXX + SG_ FrFogLmpsAct : 7|1@0+ (1,0) [0|1] "" XXX + SG_ PrkLtLeftOn : 8|1@0+ (1,0) [0|1] "" XXX + SG_ FrFgLtIO : 9|1@0+ (1,0) [0|1] "" XXX + SG_ AutoLtsInactIO : 10|1@0+ (1,0) [0|1] "" XXX + SG_ AutoLtsActIO : 11|1@0+ (1,0) [0|1] "" XXX + SG_ RrFgLtIO : 12|1@0+ (1,0) [0|1] "" XXX + SG_ HiBmIO : 13|1@0+ (1,0) [0|1] "" XXX + SG_ PrkLtIO : 14|1@0+ (1,0) [0|1] "" XXX + SG_ BrkLtsAtv : 15|1@0+ (1,0) [0|1] "" XXX + SG_ FlToPsSwAtv : 16|1@0+ (1,0) [0|1] "" XXX + SG_ RevLmpAtv : 17|1@0+ (1,0) [0|1] "N/A" XXX + SG_ PrkngLtsAct : 18|1@0+ (1,0) [0|1] "" XXX + SG_ RrFogLmpsAct : 19|1@0+ (1,0) [0|1] "" XXX + SG_ HiBmReqd : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AutoBmSlctAllwd : 21|1@0+ (1,0) [0|1] "" XXX + SG_ PrkLtRightOn : 22|1@0+ (1,0) [0|1] "" XXX + SG_ SrvlnceMdAct : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RtTrnLmpAtv : 25|2@0+ (1,0) [0|3] "" XXX + SG_ LftTrnLmpAtv : 29|2@0+ (1,0) [0|3] "" XXX + SG_ MainLghtSw : 31|2@0+ (1,0) [0|3] "N/A" XXX + SG_ HdlmpBmSelectStat : 33|2@0+ (1,0) [0|3] "" XXX + +BO_ 2149646336 Vehicle_Speed_Information: 8 XXX + SG_ VehSpdAvgDrvnGroup : 7|16@0+ (1,0) [0|0] "" XXX + SG_ VehSpdAvgDrvn : 6|15@0+ (0.015625,0) [0|511.984375] "km / h" XXX + SG_ VehSpdAvgDrvnV : 7|1@0+ (1,0) [0|1] "" XXX + SG_ DstRolCntAvgDrnRstOc : 21|1@0+ (1,0) [0|1] "" XXX + SG_ DistRollCntAvgDrvnGroup : 22|15@0+ (1,0) [0|0] "" XXX + SG_ DistRollCntAvgDrvn : 20|13@0+ (0.125,0) [0|1023.875] "m" XXX + SG_ DistRollCntAvgDrvnV : 22|1@0+ (1,0) [0|1] "" XXX + SG_ VehSpdAvgDrvnSrc : 23|1@0+ (1,0) [0|1] "" XXX + SG_ VehSpdAvgNDrvnGroup : 38|17@0+ (1,0) [0|0] "" XXX + SG_ VehSpdAvgNDrvn : 38|15@0+ (0.015625,0) [0|511.984375] "km / h" XXX + SG_ VehSpdAvgNDrvnV : 54|1@0+ (1,0) [0|1] "" XXX + SG_ DstRolCntAvgNonDrvnGroup : 39|32@0+ (1,0) [0|0] "" XXX + SG_ DstRolCntAvgNonDrvnV : 39|1@0+ (1,0) [0|1] "" XXX + SG_ DstRolCntAvgNonDrvn : 52|13@0+ (0.125,0) [0|1023.875] "m" XXX + SG_ DstRolCntAvNDrRstOc : 53|1@0+ (1,0) [0|1] "" XXX + SG_ DistRollCntAvgDrvnSrc : 55|1@0+ (1,0) [0|1] "" XXX + +BO_ 2154053632 Dimming_Information_LS: 3 XXX + SG_ IntDimNtPnlAtv : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DispNtSchmAtv : 1|1@0+ (1,0) [0|1] "" XXX + SG_ CargoLmpActIO : 2|1@0+ (1,0) [0|1] "" XXX + SG_ IntDimLvl : 15|8@0+ (0.392157,0) [0|100.000035] "%" XXX + SG_ IntDimDspLvl : 23|8@0+ (0.392157,0) [0|100.000035] "%" XXX + +BO_ 2149851136 System_Power_Mode_LS: 1 XXX + SG_ SysPwrMdGroup : 2|3@0+ (1,0) [0|0] "" XXX + SG_ SysPwrMd : 1|2@0+ (1,0) [0|3] "" XXX + SG_ SysPwrMdV : 2|1@0+ (1,0) [0|1] "" XXX + SG_ KylsStrtAuthRq : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 2159124480 ODI_AuxIP_2_TEL_LS: 8 XXX + SG_ ODI_AxIP2TEL : 7|64@0+ (1,0) [0|1.84467440737096E+019] "" XXX + +BO_ 2151530496 TPM_Display_Commands: 6 XXX + SG_ TPMTrLrnMdCmplt : 0|1@0+ (1,0) [0|1] "" XXX + SG_ TrPrsMntrAtLocFld : 1|1@0+ (1,0) [0|1] "" XXX + SG_ TrPrsMntrTrLdStat : 3|2@0+ (1,0) [0|3] "" XXX + SG_ TireTrdTmpStat : 6|3@0+ (1,0) [0|7] "" XXX + SG_ TrFrntAxlPresStat : 9|2@0+ (1,0) [0|3] "" XXX + SG_ TrRrAxlPresStat : 11|2@0+ (1,0) [0|3] "" XXX + SG_ WintTrRecIndOn : 12|1@0+ (1,0) [0|1] "" XXX + SG_ TrPrsMntrFld : 13|1@0+ (1,0) [0|1] "" XXX + SG_ TireLocatnWarnEn : 15|1@0+ (1,0) [0|1] "" XXX + SG_ HVChgSyChgLvPfStRmt1 : 18|3@0+ (1,0) [0|7] "" XXX + SG_ StTODChrgTmpOvrdRmt1 : 20|2@0+ (1,0) [0|3] "" XXX + SG_ PrtyChrgRqRmt1 : 22|2@0+ (1,0) [0|3] "" XXX + SG_ OfBrdHVCVhCsChRqRmt1 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ HVBatTmBsDlChStRqRmt1 : 28|21@0+ (1,0) [0|0] "" XXX + SG_ HVBTBDCSRR1_DChHStRq : 28|5@0+ (1,0) [0|31] "hr" XXX + SG_ HVBTBDCSRR1_DChSlSRq : 35|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBDCSRR1_DChDStRq : 39|4@0+ (1,0) [0|15] "" XXX + SG_ HVBTBDCSRR1_DChMHSRq : 45|6@0+ (1,0) [0|63] "min" XXX + SG_ HVBTBDCSRR1_DChSnSRq : 47|2@0+ (1,0) [0|3] "" XXX + SG_ HVBatTmBsChgMdRqRmt1 : 31|3@0+ (1,0) [0|7] "" XXX + + + +BA_DEF_ "UseGMParameterIDs" INT 0 0; +BA_DEF_ "ProtocolType" STRING ; +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "UseGMParameterIDs" 1; +BA_DEF_DEF_ "ProtocolType" "GMLAN"; +BA_DEF_DEF_ "BusType" ""; +BA_ "ProtocolType" "GMLAN"; +BA_ "BusType" "CAN"; + diff --git a/artifacts/package_runtime/iqdbc/dbc/gm_global_a_object.dbc b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_object.dbc new file mode 100644 index 000000000..4643a640a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_object.dbc @@ -0,0 +1,724 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: K109_FCM B233B_LRR NEO VIS_FO VIS2_FO K124_ASCM Vector__XXX EOCM_F_FO EOCM2A_IMX6_FO EOCM2A_K2_FO EOCM2A_K1_FO EOCM2B_IMX6_FO EOCM2B_K2_FO EOCM2B_K1_FO +VAL_TABLE_ RangeMode 1 "Active" 0 "Inactive" ; +VAL_TABLE_ TrkConf 3 "Confident" 2 "Speculative" 1 "Highly speculative" 0 "Invalid" ; +VAL_TABLE_ TrkMeasStatus 3 "Measured current cycle" 2 "Latent track not detected" 1 "New object" 0 "No object" ; +VAL_TABLE_ TrkDynProp 4 "Moving in opposite direction" 3 "Moving in same direction" 2 "Has moved but currently stopped" 1 "Has never moved," 0 "Unknown" ; +VAL_TABLE_ FrntVsnInPthVehBrkNwSt 10 "Active" 5 "Inactive" ; +VAL_TABLE_ FrntVsnClostPedBrkNwSt 10 "Active" 5 "Inactive" ; +VAL_TABLE_ LaneSnsLLnPosValid 1 "Invalid" 0 "Valid" ; +VAL_TABLE_ LnSnsRLnPosValid 1 "Invalid" 0 "Valid" ; +VAL_TABLE_ ObjectType 7 "no object present" 6 "fixed roadside object" 5 "fixed overhead object" 4 "pedestrian" 3 "motocycle / bicycle" 2 "Large vehicle (semi)" 1 "4 Wheel Vehicle (car, small trk)" 0 "Unknown" ; +VAL_TABLE_ FwVsnCinCoutPotT9Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT8Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT7Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT6Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT5Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT4Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT3Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT2Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT1Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT12Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT11Rev 2 "Right" 1 "Left" 0 "None" ; +VAL_TABLE_ FwVsnCinCoutPotT10Rev 2 "Right" 1 "Left" 0 "None" ; + + +BO_ 3221225472 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX + SG_ Always12 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TimeStatusChecksum : 0|12@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 161 ASCMTimeStatus: 7 NEO + SG_ TimeStatus : 7|28@0+ (1,0) [0|0] "" B233B_LRR + SG_ RollingCounter : 27|2@0+ (1,0) [0|0] "" B233B_LRR + +BO_ 774 ASCMSteeringStatus: 8 NEO + SG_ ASCMSterringStatusChecksum : 55|16@0+ (1,0) [0|0] "" B233B_LRR + SG_ AlwaysF0 : 15|8@0+ (1,0) [0|0] "" B233B_LRR + SG_ Always20 : 23|8@0+ (1,0) [0|0] "" B233B_LRR + SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" B233B_LRR + +BO_ 784 ASCMHeadlight: 2 NEO + SG_ Always42 : 7|8@0+ (1,0) [0|0] "" B233B_LRR + SG_ Always4 : 15|8@0+ (1,0) [0|0] "" B233B_LRR + +BO_ 776 ASCMAccSpeedStatus: 7 NEO + SG_ AccSpeedChecksum : 42|11@0+ (1,0) [0|0] "" B233B_LRR + SG_ RollingCounter : 46|2@0+ (1,0) [0|0] "" B233B_LRR + SG_ NearRangeMode : 43|1@0+ (1,0) [0|0] "" B233B_LRR + SG_ FarRangeMode : 44|1@0+ (1,0) [0|0] "" B233B_LRR + SG_ VehicleAcceleration : 19|12@0+ (1,0) [0|0] "" B233B_LRR + SG_ VehicleSpeed : 15|12@0+ (1,0) [0|0] "" B233B_LRR + SG_ AlwaysOne : 3|1@0+ (1,0) [0|0] "" B233B_LRR + +BO_ 1120 F_LRR_Obj_Header: 8 LRR_FO + SG_ FLRRRollingCount : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FLRRModeCmdFdbk : 23|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRNumValidTargets : 20|5@0+ (1,0) [0|31] "" EOCM_F_FO + SG_ FLRRTimeStampV : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRTimeStamp : 2|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO + SG_ FLRRRoadTypeInfo : 5|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FLRRBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO + SG_ FLRRDiagSpare : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRVltgOutRngLo : 44|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRVltgOutRngHi : 43|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRSvcAlgnInPrcs : 38|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRSnsrBlckd : 45|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRSnstvFltPrsntInt : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRPlntAlgnInProc : 37|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRMsalgnYawRt : 47|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRMsalgnYawLt : 46|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRLonVelPlsblityFlt : 35|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRYawRtPlsblityFlt : 34|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRMsalgnPtchUp : 32|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRMsalgnPtchDn : 33|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRInitDiagCmplt : 40|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRHWFltPrsntInt : 25|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRExtIntrfrnc : 36|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRCANSgnlSpvFld : 29|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRCANRxErr : 28|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRTunlDtctd : 27|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAmbTmpOutRngLw : 42|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAmbTmpOutRngHi : 41|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAntTngFltPrsnt : 26|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FLRRAlgnFltPrsnt : 39|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1134 LRRObject14: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1132 LRRObject12: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1131 LRRObject11: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1130 LRRObject10: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1129 LRRObject09: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1128 LRRObject08: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1127 LRRObject07: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1126 LRRObject06: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1125 LRRObject05: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1124 LRRObject04: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1123 LRRObject03: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1140 LRRObject20: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1139 LRRObject19: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1138 LRRObject18: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1137 LRRObject17: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1136 LRRObject16: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1135 LRRObject15: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1133 LRRObject13: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1122 LRRObject02: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + +BO_ 1121 LRRObject01: 8 B233B_LRR + SG_ TrkRange : 5|11@0+ (0.125,0) [0|255.875] "m" NEO + SG_ TrkRangeRate : 10|11@0- (0.125,0) [-128|127.875] "m/s" NEO + SG_ TrkRangeAccel : 31|9@0- (0.125,0) [-32|31.875] "m/s^2" NEO + SG_ TrkAzimuth : 35|12@0- (0.125,0) [-256|255.875] "deg" NEO + SG_ TrkWidth : 55|6@0+ (0.25,0) [0|15.75] "m" NEO + SG_ TrkObjectID : 61|6@0+ (1,0) [0|63] "" NEO + + BO_ 1094 F_Vision_Obj_Track_12: 8 VIS2_FO + SG_ FwdVsnObjTypTr12Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnAzmthTrk12Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk12Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FVisionWidthTrk12 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FVisionMeasStatTrk12 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnVertPosTrk12 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FVisionRelLaneTrk12 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk12 : 34|11@0- (0.125,0) [-128|127.875] "deg/sec" EOCM_F_FO + SG_ FVisionConfTrk12 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ ObjDirTrk12 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk12 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk12 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1093 F_Vision_Obj_Track_11: 8 VIS2_FO + SG_ FwdVsnObjTypTr11Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnAzmthTrk11Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk11Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FVisionWidthTrk11 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FVisionMeasStatTrk11 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnVertPosTrk11 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FVisionRelLaneTrk11 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk11 : 34|11@0- (0.125,0) [-128|127.875] "deg/sec" EOCM_F_FO + SG_ FVisionConfTrk11 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ ObjDirTrk11 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk11 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk11 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + +BO_ 1100 F_Vision_Obj_Track_12_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT12Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk12 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk12 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk12 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk12 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr12 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk12 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo12 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1099 F_Vision_Obj_Track_11_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT11Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk11 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk11 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk11 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk11 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr11 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk11 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo11 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1098 F_Vision_Obj_Track_10_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT10Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk10 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk10 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk10 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk10 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr10 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk10 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo10 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1097 F_Vision_Obj_Track_9_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT9Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk9 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk9 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk9 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk9 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr9 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk9 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo9 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1096 F_Vision_Obj_Track_8_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT8Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk8 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk8 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk8 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk8 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr8 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk8 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo8 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1095 F_Vision_Obj_Track_7_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT7Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk7 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk7 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk7 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk7 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr7 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk7 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo7 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1068 F_Vision_Obj_Track_6_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT6Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk6 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk6 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk6 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk6 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr6 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk6 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo6 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1067 F_Vision_Obj_Track_5_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT5Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk5 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk5 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk5 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk5 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr5 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk5 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo5 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1066 F_Vision_Obj_Track_4_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT4Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk4 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk4 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk4 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk4 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr4 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk4 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo4 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1065 F_Vision_Obj_Track_3_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT3Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk3 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk3 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk3 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk3 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr3 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk3 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo3 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1064 F_Vision_Obj_Track_2_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT2Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjAgeTrk2 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk2 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk2 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk2 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr2 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk2 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo2 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1063 F_Vision_Obj_Track_1_B: 8 VIS2_FO + SG_ FwVsnCinCoutPotT1Rev : 5|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnObjSclChgTrk1 : 15|16@0- (0.0002,0) [-6.5536|6.5534] "pix/sec" EOCM_F_FO + SG_ FwdVsnObjAgeTrk1 : 62|7@0+ (1,0) [0|127] "" EOCM_F_FO + SG_ FwdVsnLongVlctyTrk1 : 42|12@0- (0.0625,0) [-128|127.9375] "m/sec" EOCM_F_FO + SG_ FwdVsnLatOfstTrk1 : 36|10@0- (0.125,0) [-64|63.875] "m" EOCM_F_FO + SG_ FwdVsnBrkLtStatTrk1 : 38|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FwdVsnTrnSigStatTr1 : 25|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FrtVsnBrstIDAddInfo1 : 7|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1088 F_Vision_Obj_Header_2: 8 VIS2_FO + SG_ FrntVsnInPthVehBrkNwSt : 35|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FrntVsnClostPedBrkNwSt : 39|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FrntVsnClostPedObjID : 29|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FrntVsnClostPedAlrtNwFlg : 30|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrntVsnClostPedNotftnFlg : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrntVsnInPthVehAlrtNwFlg : 2|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnVldTgtNum2 : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FrtVsnTmStmp2V : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnTmStmp2 : 10|11@0+ (1,0) [0|2047] "" EOCM_F_FO + SG_ FrtVsnRollCnt2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FrtVsnBrstChksum2 : 55|16@0+ (1,0) [0|65535] "" EOCM_F_FO + +BO_ 854 F_Vision_Environment_7: 3 VIS2_FO + SG_ FwdVsnCnstrctAreaDst : 13|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnCnstrctZnDet : 15|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnEgoVehLnPos : 17|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnRdTypDet : 9|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnTunnlDetd : 23|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ FwdVsnTunnlDst : 21|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBrstID5 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 853 F_Vision_Environment_6: 8 VIS2_FO + SG_ LnMrkg4LnSnsLnHdngTngtV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnHdngTngt : 23|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnDstV : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnDst : 15|8@0- (0.1,0) [-12.8|12.7] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnCrvtV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnCrvtGradV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnCrvtGrad : 47|16@0- (5.96e-8,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnSnsLnCrvt : 31|16@0- (9.53e-7,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnQltyConfLvl : 63|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnMrkrTyp : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBrstID4 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 852 F_Vision_Environment_5: 8 VIS2_FO + SG_ LnMrkg3LnSnsLnHdngTngtV : 7|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnHdngTngt : 23|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnDstV : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnDst : 15|8@0- (0.1,0) [-12.8|12.7] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnCrvtV : 6|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnCrvtGradV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnCrvtGrad : 47|16@0- (5.96e-8,0) [-0.0019529728|0.0019529132] "1/(m*sec)" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnSnsLnCrvt : 31|16@0- (9.53e-7,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnQltyConfLvl : 63|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnMrkrTyp : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBrstID3 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 309 LHT_CameraObjConfirmation_FO: 1 VIS_FO + SG_ HiBmRecmnd : 1|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ CtLghtDet : 0|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 848 F_Vision_Environment: 8 VIS_FO + SG_ FwdVsnEnvIllum : 37|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTngtOfHdngLnRtV : 1|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTngtOfHdngLnRt : 31|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnChngStatus : 39|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBurstChecksum : 55|16@0+ (1,0) [0|65535] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseRollingCount : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseSystemOK : 4|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSnsLLnPosValid : 2|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSenseDistToLLnEdge : 14|7@0+ (0.05,0) [0|6.35] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsRLnPosValid : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsDistToRLnEdge : 22|7@0+ (0.05,0) [0|6.35] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseTimeStampV : 5|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseTimeStamp : 34|11@0+ (1,0) [0|2047] "ms" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LaneSenseSystemOKV : 3|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 849 F_Vision_Environment_2: 8 VIS_FO + SG_ LnSnsLatVRelToRgtMrkg : 23|8@0- (0.02,0) [-2.56|2.54] "m/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM_F_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO + SG_ LnSnsRtLnMrkgTypChgDst : 61|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsCrvtGrdntRtV : 63|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnMrkgWdthRt : 62|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsRtAnchrLn : 57|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLtAnchrLn : 56|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnCrvtrRghtV : 0|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnCrvtrRght : 47|16@0- (9.53e-7,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsCrvtGrdntRt : 31|16@0- (5.96e-8,0) [-0.0019529728|0.0019529132] "1/rad/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBurstID : 2|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLatVRelToLftMrkg : 15|8@0- (0.02,0) [-2.56|2.54] "m/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + +BO_ 1056 F_Vision_Obj_Header: 6 VIS_FO + SG_ FVsnSnsrBlckd : 24|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ ClstInPathVehObjID : 30|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FrtVsnFld : 6|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnIniDiagSuccCmpt : 5|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnSrvAlgnInPrcs : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FrtVsnUnvlbl : 7|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisionRollingCnt : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVISModeCmdFdbk : 4|3@0+ (1,0) [0|7] "" EOCM_F_FO + SG_ FVisionNumValidTrgts : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FVisionTimeStampV : 31|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisionTimeStamp : 10|11@0+ (1,0) [0|2047] "ms" EOCM_F_FO + SG_ VISBurstChecksum : 39|16@0+ (1,0) [0|65535] "" EOCM_F_FO + +BO_ 1057 F_Vision_Obj_Track_1: 8 VIS_FO + SG_ FwdVsnRngTrk1Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk1Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr1Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnVertPosTrk1 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FVisBurstIDTrk1 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk1 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk1 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk1 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk1 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk1 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk1 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ ObjDirTrk1 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1058 F_Vision_Obj_Track_2: 8 VIS_FO + SG_ FwdVsnVertPosTrk2 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk2Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk2Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ ObjDirTrk2 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FwdVsnObjTypTr2Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FVisBurstIDTrk2 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk2 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk2 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk2 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk2 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk2 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk2 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1059 F_Vision_Obj_Track_3: 8 VIS_FO + SG_ FwdVsnVertPosTrk3 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk3Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk3Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr3Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk3 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk3 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk3 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk3 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk3 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk3 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk3 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk3 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1060 F_Vision_Obj_Track_4: 8 VIS_FO + SG_ FwdVsnVertPosTrk4 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FVisionMeasStatTrk4 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk4 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FwdVsnRngTrk4Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk4Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr4Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FVisBurstIDTrk4 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk4 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ ObjDirTrk4 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisionConfTrk4 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk4 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk4 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + +BO_ 1061 F_Vision_Obj_Track_5: 8 VIS_FO + SG_ FwdVsnVertPosTrk5 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk5Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk5Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr5Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk5 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk5 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk5 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk5 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk5 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk5 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk5 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk5 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1062 F_Vision_Obj_Track_6: 8 VIS_FO + SG_ FwdVsnVertPosTrk6 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk6Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk6Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr6Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk6 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk6 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk6 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk6 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk6 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk6 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk6 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk6 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1089 F_Vision_Obj_Track_7: 8 VIS2_FO + SG_ FVisBurstIDTrk7 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk7 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk7 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk7 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk7 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk7 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk7 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + SG_ FwdVsnRngTrk7Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnObjTypTr7Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnAzmthTrk7Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnVertPosTrk7 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ ObjDirTrk7 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + +BO_ 1090 F_Vision_Obj_Track_8: 8 VIS2_FO + SG_ FVisBurstIDTrk8 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk8 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FwdVsnAzmthTrk8Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnVertPosTrk8 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk8Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnObjTypTr8Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk8 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisionConfTrk8 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk8 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk8 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk8 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk8 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1091 F_Vision_Obj_Track_9: 8 VIS2_FO + SG_ FwdVsnVertPosTrk9 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ FwdVsnRngTrk9Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk9Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr9Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ ObjDirTrk9 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk9 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk9 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk9 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk9 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk9 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk9 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk9 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 1092 F_Vision_Obj_Track_10: 8 VIS2_FO + SG_ FwdVsnRngTrk10Rev : 16|12@0+ (0.1,0) [0|409.5] "m" EOCM_F_FO + SG_ FwdVsnAzmthTrk10Rev : 10|10@0- (0.1,0) [-51.2|51.1] "deg" EOCM_F_FO + SG_ FwdVsnObjTypTr10Rev : 14|4@0+ (1,0) [0|15] "" EOCM_F_FO + SG_ FwdVsnVertPosTrk10 : 53|6@0+ (0.25,-2) [-2|13.75] "deg" EOCM_F_FO + SG_ ObjDirTrk10 : 15|1@0+ (1,0) [0|1] "" EOCM_F_FO + SG_ FVisBurstIDTrk10 : 1|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionObjectIDTrk10 : 7|6@0+ (1,0) [0|63] "" EOCM_F_FO + SG_ FVisionConfTrk10 : 36|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionAzRateTrk10 : 34|11@0- (0.125,0) [-128|127.875] "deg/s" EOCM_F_FO + SG_ FVisionRelLaneTrk10 : 55|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionMeasStatTrk10 : 63|2@0+ (1,0) [0|3] "" EOCM_F_FO + SG_ FVisionWidthTrk10 : 61|6@0+ (0.25,0) [0|15.75] "m" EOCM_F_FO + +BO_ 851 F_Vision_Environment_4: 8 VIS_FO + SG_ LnMrkg3LnPrvwDst : 45|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTtlNmLnMrkgDetRt : 4|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsRtLinCrsTm : 25|5@0+ (0.1,0) [0|3.1] "s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsNumPrlLnsDetRt : 33|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsNumPrlLnsDetLt : 36|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsCrvtGrdntLftV : 31|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLtLinCrsTm : 30|5@0+ (0.1,0) [0|3.1] "s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnPrvwDst : 50|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnMrkgTypChgDst : 61|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnMrkgTypChgDst : 40|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnMrkgWdth : 62|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4LnMarkrElvtd : 51|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg4AnchrLnLin : 57|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnMrkgWdth : 41|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3LnMarkrElvtd : 46|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkg3AnchrLnLin : 52|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBurstID2 : 1|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsCrvtGrdntLft : 15|16@0- (5.96e-8,0) [-0.0019529728|0.0019529132] "1/rad/s" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + + BO_ 850 F_Vision_Environment_3: 8 VIS_FO + SG_ LnSnsTtlNmLnMrkgDetLt : 58|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLtLnMrkgWdth : 63|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLtLnMrkgTypChgDst : 62|4@0+ (10,0) [0|150] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTngtOfHdngLnLftV : 23|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsTngtOfHdngLnLft : 31|8@0- (0.002,0) [-0.256|0.254] "m/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnCrvtrLftV : 15|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsLnCrvtrLft : 39|16@0- (9.53e-7,0) [-0.031227904|0.031226951] "1/m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkrTypRght : 50|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkrTypLft : 53|3@0+ (1,0) [0|7] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkrElvtdRght : 54|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnMrkrElvtdLft : 55|1@0+ (1,0) [0|1] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnSnsBurstID1 : 7|2@0+ (1,0) [0|3] "" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnQltyCnfdncLvlRght : 22|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnQltyCnfdncLvlLft : 14|7@0+ (0.7874016,0) [0|100.0000032] "%" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnPrvwDstncRght : 2|3@0+ (10,0) [0|70] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + SG_ LnPrvwDstncLft : 5|3@0+ (10,0) [0|70] "m" EOCM2A_IMX6_FO,EOCM2A_K2_FO,EOCM2A_K1_FO,EOCM2B_IMX6_FO,EOCM2B_K2_FO,EOCM2B_K1_FO,EOCM_F_FO + + +BO_TX_BU_ 161 : K124_ASCM,NEO; +BO_TX_BU_ 774 : K124_ASCM,NEO; +BO_TX_BU_ 784 : K124_ASCM,NEO; +BO_TX_BU_ 776 : K124_ASCM,NEO; + + +CM_ BU_ K109_FCM "Frontview Camera Module"; +CM_ BU_ B233B_LRR "Radar Sensor Module Long Range"; +CM_ BU_ NEO "Comma NEO"; +CM_ BU_ VIS_FO "Front Camera Data"; +CM_ BU_ VIS2_FO "Front Camera Data2"; +CM_ BU_ K124_ASCM "Active Safety Control Module"; +CM_ BO_ 3221225472 "This is a message for not used signals, created by Vector CANdb++ DBC OLE DB Provider."; +BA_DEF_ "UseGMParameterIDs" INT 0 0; +BA_DEF_ "ProtocolType" STRING ; +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "UseGMParameterIDs" 1; +BA_DEF_DEF_ "ProtocolType" "GMLAN"; +BA_DEF_DEF_ "BusType" ""; +BA_ "BusType" "CAN"; +BA_ "ProtocolType" "GMLAN"; +BA_ "UseGMParameterIDs" 0; +VAL_ 776 NearRangeMode 1 "Active" 0 "Inactive"; +VAL_ 776 FarRangeMode 1 "Active" 0 "Inactive"; diff --git a/artifacts/package_runtime/iqdbc/dbc/gm_global_a_powertrain_expansion.dbc b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_powertrain_expansion.dbc new file mode 100644 index 000000000..b18ac6974 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_powertrain_expansion.dbc @@ -0,0 +1,56 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: +BU_: K1_APM +BO_ 470 APM_Stats: 7 K1_APM + SG_ APM_Low_Voltage_Sensed : 16|8@1+ (0.0787402,0) [0|0] "V" Vector__XXX + SG_ APM_Temperature_1 : 24|8@1+ (1,-40) [0|0] "C" Vector__XXX + SG_ APM_Temperature_2 : 32|8@1+ (1,-40) [0|0] "C" Vector__XXX + SG_ APM_Low_Voltage_Current_Output : 40|8@1- (1,0) [0|0] "A" Vector__XXX + SG_ APM_Status : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ APM_High_Voltage_Input_Current : 8|8@1- (0.15,-7) [0|0] "A" Vector__XXX + SG_ APM_Counter : 48|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 468 APM_Command: 2 K1_APM + SG_ APM_Status : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ APM_Voltage_Requested : 8|8@1+ (0.0787402,0) [0|0] "V" Vector__XXX + +BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ; +BA_DEF_ BO_ "GenMsgForegroundColor" STRING ; +BA_DEF_ BO_ "isj1939dbc" INT 0 0; +BA_DEF_DEF_ "GenMsgBackgroundColor" "#ffffff"; +BA_DEF_DEF_ "GenMsgForegroundColor" "#000000"; +BA_DEF_DEF_ "isj1939dbc" 0; +CM_ BU_ K1_APM "14V Power Module"; +VAL_ 468 APM_Status 0 "Off" 160 "On"; diff --git a/artifacts/package_runtime/iqdbc/dbc/gm_global_a_powertrain_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_powertrain_generated.dbc new file mode 100644 index 000000000..de0550134 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/gm_global_a_powertrain_generated.dbc @@ -0,0 +1,373 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 512 GAS_COMMAND: 6 NEO + SG_ GAS_COMMAND : 7|16@0+ (0.125677,-75.909) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.251976,-76.601) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (0.125677,-75.909) [0|1] "" NEO + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.251976,-76.601) [0|1] "" NEO + SG_ STATE : 39|4@0+ (1,0) [0|15] "" NEO + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" NEO + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" NEO + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + +CM_ "gm_global_a_powertrain.dbc starts here"; + +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: K16_BECM K73_TCIC K9_BCM K43_PSCM K17_EBCM K20_ECM K114B_HPCM NEO K124_ASCM EPB +VAL_TABLE_ TurnSignals 2 "Right Turn" 1 "Left Turn" 0 "None" ; +VAL_TABLE_ Intellibeam 1 "Active" 0 "Inactive" ; +VAL_TABLE_ HighBeamsActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ HighBeamsTemporary 1 "Active" 0 "Inactive" ; +VAL_TABLE_ ACCLeadCar 1 "Present" 0 "Not Present" ; +VAL_TABLE_ ACCCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ BrakePedalPressed 1 "Pressed" 0 "Depressed" ; +VAL_TABLE_ DistanceButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ LKAButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ; +VAL_TABLE_ DriveModeButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ PRNDL 3 "Reverse" 2 "Drive" 1 "Neutral" 0 "Park" ; +VAL_TABLE_ ESPButton 1 "Active" 0 "Inactive" ; +VAL_TABLE_ DoorStatus 1 "Opened" 0 "Closed" ; +VAL_TABLE_ SeatBeltStatus 1 "Latched" 0 "Unlatched" ; +VAL_TABLE_ LKASteeringCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ; +VAL_TABLE_ GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ; +VAL_TABLE_ GasRegenCmdActive 1 "Active" 0 "Inactive" ; +VAL_TABLE_ LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ; +VAL_TABLE_ HandsOffSWDetectionStatus 1 "Hands On" 0 "Hands Off" ; +VAL_TABLE_ HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ; + + +BO_ 189 EBCMRegenPaddle: 7 K17_EBCM + SG_ RegenPaddle : 7|4@0+ (1,0) [0|0] "" NEO + +BO_ 190 ECMAcceleratorPos: 6 K20_ECM + SG_ BrakePedalPos : 15|8@0+ (1,0) [0|0] "sticky" NEO + SG_ GasPedalAndAcc : 23|8@0+ (1,0) [0|0] "" NEO + +BO_ 201 ECMEngineStatus: 8 K20_ECM + SG_ EngineTPS : 39|8@0+ (0.392156863,0) [0|100.000000065] "%" NEO + SG_ EngineRPM : 15|16@0+ (0.25,0) [0|0] "RPM" NEO + SG_ CruiseMainOn : 29|1@0+ (1,0) [0|1] "" NEO + SG_ BrakePressed : 40|1@0+ (1,0) [0|1] "" NEO + SG_ Standstill : 2|1@0+ (1,0) [0|1] "" NEO + SG_ CruiseActive : 31|2@0+ (1,0) [0|3] "" NEO + +BO_ 209 EBCMBrakePedalSensors: 7 K17_EBCM + SG_ Counter1 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ Counter2 : 23|2@0+ (1,0) [0|3] "" XXX + SG_ BrakePedalPosition1 : 5|14@0+ (1,0) [0|16383] "" XXX + SG_ BrakePedalPosition2 : 21|14@0- (-1,0) [0|16383] "" XXX + SG_ BrakeNormalized1 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ BrakeNormalized2 : 47|8@0- (-1,0) [0|255] "" XXX + +BO_ 241 EBCMBrakePedalPosition: 6 K17_EBCM + SG_ BrakePressed : 1|1@0+ (1,0) [0|1] "" XXX + SG_ BrakePedalPosition : 15|8@0+ (1,0) [0|255] "" NEO + +BO_ 298 BCMDoorBeltStatus: 8 K9_BCM + SG_ RearLeftDoor : 8|1@0+ (1,0) [0|0] "" NEO + SG_ FrontLeftDoor : 9|1@0+ (1,0) [0|0] "" NEO + SG_ FrontRightDoor : 10|1@0+ (1,0) [0|0] "" NEO + SG_ RearRightDoor : 23|1@0+ (1,0) [0|0] "" NEO + SG_ LeftSeatBelt : 12|1@0+ (1,0) [0|0] "" NEO + SG_ RightSeatBelt : 53|1@0+ (1,0) [0|0] "" NEO + +BO_ 309 ECMPRDNL: 8 K20_ECM + SG_ PRNDL : 2|3@0+ (1,0) [0|0] "" NEO + SG_ ESPButton : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 320 BCMTurnSignals: 3 K9_BCM + SG_ TurnSignals : 19|2@0+ (1,0) [0|0] "" NEO + SG_ Intellibeam : 13|1@0+ (1,0) [0|1] "" XXX + SG_ HighBeamsActive : 7|1@0+ (1,0) [0|1] "" XXX + SG_ HighBeamsTemporary : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 322 BCMBlindSpotMonitor: 7 K9_BCM + SG_ LeftBSM : 6|1@0+ (1,0) [0|1] "" XXX + SG_ RightBSM : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 328 PSCM_148: 1 K43_PSCM + +BO_ 381 ESPStatus: 6 K20_ECM + SG_ TractionControlOn : 5|1@0+ (1,0) [0|0] "" NEO + SG_ MSG17D_AccPower : 35|12@0- (1,0) [0|0] "" NEO + +BO_ 384 ASCMLKASteeringCmd: 4 NEO + SG_ RollingCounter : 5|2@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmdChecksum : 19|12@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmdActive : 3|1@0+ (1,0) [0|0] "" NEO + SG_ LKASteeringCmd : 2|11@0- (1,0) [0|0] "" NEO + +BO_ 388 PSCMStatus: 8 K43_PSCM + SG_ HandsOffSWDetectionMode : 20|2@0+ (1,0) [0|3] "" NEO + SG_ HandsOffSWlDetectionStatus : 21|1@0+ (1,0) [0|1] "" NEO + SG_ LKATorqueDeliveredStatus : 5|3@0+ (1,0) [0|7] "" NEO + SG_ LKADriverAppldTrq : 50|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO + SG_ LKATorqueDelivered : 18|11@0- (0.01,0) [0|1] "" NEO + SG_ LKATotalTorqueDelivered : 2|11@0- (0.01,0) [-10.24|10.23] "Nm" NEO + SG_ RollingCounter : 38|4@0+ (1,0) [0|15] "" XXX + SG_ PSCMStatusChecksum : 33|10@0+ (1,0) [0|1023] "" XXX + +BO_ 417 AcceleratorPedal: 7 XXX + SG_ AcceleratorPedal : 55|8@0+ (1,0) [0|0] "" NEO + +BO_ 451 GasAndAcc: 8 XXX + SG_ GasPedalAndAcc2 : 55|8@0+ (1,0) [0|0] "" NEO + +BO_ 452 AcceleratorPedal2: 8 XXX + SG_ CruiseState : 15|3@0+ (1,0) [0|7] "" NEO + SG_ AcceleratorPedal2 : 47|8@0+ (1,0) [0|0] "" NEO + +BO_ 481 ASCMSteeringButton: 7 K124_ASCM + SG_ DistanceButton : 22|1@0+ (1,0) [0|0] "" NEO + SG_ LKAButton : 23|1@0+ (1,0) [0|0] "" NEO + SG_ ACCAlwaysOne : 24|1@0+ (1,0) [0|1] "" XXX + SG_ ACCButtons : 46|3@0+ (1,0) [0|0] "" NEO + SG_ DriveModeButton : 39|1@0+ (1,0) [0|1] "" XXX + SG_ RollingCounter : 33|2@0+ (1,0) [0|3] "" NEO + SG_ SteeringButtonChecksum : 43|12@0+ (1,0) [0|255] "" NEO + +BO_ 485 PSCMSteeringAngle: 8 K43_PSCM + SG_ SteeringWheelAngle : 15|16@0- (0.0625,0) [-2047|2047] "deg" NEO + SG_ SteeringWheelRate : 27|12@0- (1,0) [-2047|2047] "deg/s" NEO + +BO_ 489 EBCMVehicleDynamic: 8 K17_EBCM + SG_ BrakePedalPressed : 6|1@0+ (1,0) [0|0] "" NEO + SG_ LateralAcceleration : 3|10@0- (0.161,0) [-2047|2047] "m/s2" NEO + SG_ YawRate : 35|12@0- (0.625,0) [0|1] "" NEO + SG_ YawRate2 : 51|12@0- (0.0625,0) [-2047|2047] "grad/s" NEO + +BO_ 352 BCMImmobilizer: 5 K9_BCM + SG_ ImmobilizerInfo : 7|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 497 BCMGeneralPlatformStatus: 8 K9_BCM + SG_ SystemPowerMode : 1|2@0+ (1,0) [0|3] "" XXX + SG_ SystemBackUpPowerMode : 5|2@0+ (1,0) [0|3] "" XXX + SG_ ParkBrakeSwActive : 36|1@0+ (1,0) [0|3] "" XXX + +BO_ 500 SportMode: 6 XXX + SG_ SnowIceMode : 9|1@0+ (1,0) [0|1] "" XXX + SG_ SportMode : 15|1@0+ (1,0) [0|1] "" XXX + +BO_ 501 ECMPRDNL2: 8 K20_ECM + SG_ TransmissionState : 48|4@1+ (1,0) [0|7] "" NEO + SG_ PRNDL2 : 27|4@0+ (1,0) [0|255] "" NEO + SG_ ManualMode : 41|1@0+ (1,0) [0|1] "" NEO + +BO_ 532 BRAKE_RELATED: 6 XXX + SG_ UserBrakePressure : 0|9@0+ (1,0) [0|511] "" XXX + +BO_ 560 EPBStatus: 8 EPB + SG_ EPBClosed : 12|1@0+ (1,0) [0|1] "" NEO + +BO_ 562 EBCMFrictionBrakeStatus: 8 K17_EBCM + SG_ FrictionBrakeUnavailable : 46|1@0+ (1,0) [0|1] "" XXX + +BO_ 608 SPEED_RELATED: 8 XXX + SG_ RollingCounter : 5|2@0+ (1,0) [0|0] "" XXX + SG_ ClusterSpeed : 31|8@0+ (1,0) [0|0] "" XXX + +BO_ 711 BECMBatteryVoltageCurrent: 6 K17_EBCM + SG_ HVBatteryVoltage : 31|12@0+ (0.125,0) [0|511.875] "V" NEO + SG_ HVBatteryCurrent : 12|13@0- (0.15,0) [-614.4|614.25] "A" NEO + +BO_ 715 ASCMGasRegenCmd: 8 K124_ASCM + SG_ GasRegenAccType : 15|2@0+ (1,0) [0|3] "" NEO + SG_ GasRegenChecksum : 32|25@0+ (1,0) [0|0] "" NEO + SG_ GasRegenFullStopActive : 13|1@0+ (1,0) [0|0] "" NEO + SG_ GasRegenCmdActive : 0|1@0+ (1,0) [0|0] "" NEO + SG_ RollingCounter : 7|2@0+ (1,0) [0|0] "" NEO + SG_ GasRegenCmd : 10|19@0+ (0.125,-22534) [-22534|43001.875] "Nm" NEO + +BO_ 717 ASCM_2CD: 5 K124_ASCM + +BO_ 761 BRAKE_RELATED_2: 7 XXX + SG_ UserBrakePressure2 : 47|9@0+ (1,0) [0|511] "" XXX + +BO_ 789 EBCMFrictionBrakeCmd: 5 K124_ASCM + SG_ RollingCounter : 33|2@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeMode : 7|4@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeChecksum : 23|16@0+ (1,0) [0|0] "" NEO + SG_ FrictionBrakeCmd : 3|12@0- (1,0) [0|0] "" NEO + +BO_ 800 AEBCmd: 6 K124_ASCM + SG_ RollingCounter : 5|2@0+ (1,0) [0|3] "" NEO + SG_ AEBChecksum : 27|20@0+ (1,0) [0|0] "" NEO + SG_ AEBCmdActive : 3|1@1+ (1,0) [0|1] "" NEO + SG_ AEBCmd : 2|11@0+ (1,0) [0|0] "" NEO + SG_ AEBCmd2 : 23|8@0+ (1,0) [0|0] "" NEO + +BO_ 810 TCICOnStarGPSPosition: 8 K73_TCIC + SG_ GPSLongitude : 39|32@0+ (1,-2147483648) [0|0] "milliarcsecond" NEO + SG_ GPSLatitude : 7|32@0+ (1,0) [0|0] "milliarcsecond" NEO + +BO_ 840 EBCMWheelSpdFront: 5 K17_EBCM + SG_ FLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO + SG_ FRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO + +BO_ 842 EBCMWheelSpdRear: 5 K17_EBCM + SG_ RLWheelSpd : 7|16@0+ (0.0311,0) [0|255] "km/h" NEO + SG_ RRWheelSpd : 23|16@0+ (0.0311,0) [0|255] "km/h" NEO + SG_ RRWheelDir : 34|3@0+ (1,0) [0|7] "" NEO + SG_ RLWheelDir : 37|3@0+ (1,0) [0|7] "" NEO + +BO_ 869 ASCM_365: 4 K124_ASCM + +BO_ 880 ASCMActiveCruiseControlStatus: 6 K124_ASCM + SG_ ACCCruiseState : 8|3@1+ (1,0) [0|7] "" XXX + SG_ ACCLeadCar : 44|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCAlwaysOne2 : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCAlwaysOne : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCSpeedSetpoint : 19|12@0+ (0.0625,0) [0|255.9375] "km/h" NEO + SG_ ACCGapLevel : 21|2@0+ (1,0) [0|0] "" NEO + SG_ ACCResumeButton : 1|1@0+ (1,0) [0|0] "" NEO + SG_ ACCCmdActive : 23|1@0+ (1,0) [0|0] "" NEO + SG_ FCWAlert : 41|2@0+ (1,0) [0|3] "" XXX + +BO_ 967 EVDriveMode: 4 XXX + SG_ SinglePedalModeActive : 7|1@0+ (1,0) [0|1] "" XXX + SG_ SinglePedalModeRisingEdge : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SinglePedalModeFallingEdge : 22|1@0+ (1,0) [0|1] "" XXX + +BO_ 977 ECMCruiseControl: 8 K20_ECM + SG_ CruiseActive : 39|1@0+ (1,0) [0|3] "" NEO + SG_ CruiseSetSpeed : 19|12@0+ (0.0625,0) [0|0] "km/h" NEO + +BO_ 1001 ECMVehicleSpeed: 8 K20_ECM + SG_ VehicleSpeed : 7|16@0+ (0.01,0) [0|0] "mph" NEO + SG_ VehicleSpeedLeft : 39|16@0+ (0.01,0) [0|0] "mph" NEO + +BO_ 1033 ASCMKeepAlive: 7 NEO + SG_ ASCMKeepAliveAllZero : 7|56@0+ (1,0) [0|0] "" NEO + +BO_ 1034 ASCM_40A: 7 K124_ASCM + +BO_ 1217 ECMEngineCoolantTemp: 8 K20_ECM + SG_ EngineCoolantTemp : 23|8@0+ (1,-40) [0|0] "C" NEO + +BO_ 1249 VIN_Part2: 8 K20_ECM + SG_ VINPart2 : 7|64@0+ (1,0) [0|0] "" NEO + +BO_ 1296 ASCM_510: 4 K124_ASCM + +BO_ 1300 VIN_Part1: 8 K20_ECM + SG_ VINPart1 : 7|64@0+ (1,0) [0|0] "" NEO + +BO_ 1912 PSCM_778: 8 K43_PSCM + +BO_ 1930 ASCM_78A: 7 K124_ASCM + +BO_TX_BU_ 384 : K124_ASCM,NEO; +BO_TX_BU_ 880 : NEO,K124_ASCM; +BO_TX_BU_ 1033 : K124_ASCM,NEO; +BO_TX_BU_ 715 : NEO,K124_ASCM; +BO_TX_BU_ 789 : NEO,K124_ASCM; +BO_TX_BU_ 800 : NEO,K124_ASCM; + + +CM_ BU_ K16_BECM "Battery Energy Control Module"; +CM_ BU_ K73_TCIC "Telematics Communication Control Module"; +CM_ BU_ K9_BCM "Body Control Module"; +CM_ BU_ K43_PSCM "Power Steering Control Module"; +CM_ BU_ K17_EBCM "Electronic Brake Control Module"; +CM_ BU_ K20_ECM "Engine Control Module"; +CM_ BU_ K114B_HPCM "Hybrid Powertrain Control Module"; +CM_ BU_ NEO "Comma NEO"; +CM_ BU_ K124_ASCM "Active Safety Control Module"; +CM_ SG_ 381 MSG17D_AccPower "Need to investigate"; +CM_ BO_ 190 "Length varies from 6 to 8 bytes by car"; +CM_ SG_ 190 GasPedalAndAcc "ACC baseline is 62"; +CM_ SG_ 322 LeftBSM "For some cars, this can only be when the blinker is also active"; +CM_ SG_ 322 RightBSM "For some cars, this can only be when the blinker is also active"; +CM_ SG_ 352 ImmobilizerInfo "Non-zero when ignition or accessory mode"; +CM_ SG_ 451 GasPedalAndAcc2 "ACC baseline is 62"; +CM_ SG_ 481 ACCAlwaysOne "Usually 1 if the car is equipped with ACC"; +CM_ SG_ 562 FrictionBrakeUnavailable "1 when ACC brake control is unavailable. Stays high if brake command messages are blocked for a period of time"; +CM_ SG_ 497 SystemPowerMode "Describes ignition"; +CM_ SG_ 497 SystemBackUpPowerMode "Describes ignition + preconditioning mode, noisy"; +CM_ SG_ 501 PRNDL2 "When ManualMode is Active, Value is 13=L1 12=L2 11=L3 ... 5=Full 70kW Paddle Regen Unlocked for Gen2 Bolts 4=L10"; +CM_ SG_ 532 UserBrakePressure "can be lower than other brake position signals when the brakes are pre-filled from ACC braking and the user presses on the brakes. user-only pressure?"; +CM_ SG_ 608 ClusterSpeed "Cluster speed signal seems to match dash on newer cars, but is a lower rate and can be noisier."; +CM_ SG_ 761 UserBrakePressure2 "Similar to BRAKE_RELATED->UserBrakePressure"; +CM_ SG_ 1001 VehicleSpeed "Spinouts show here on 2wd. Speed derived from right front wheel (drive tire)"; +BA_DEF_ "UseGMParameterIDs" INT 0 0; +BA_DEF_ "ProtocolType" STRING ; +BA_DEF_ "BusType" STRING ; +BA_DEF_DEF_ "UseGMParameterIDs" 1; +BA_DEF_DEF_ "ProtocolType" "GMLAN"; +BA_DEF_DEF_ "BusType" ""; +BA_ "BusType" "CAN"; +BA_ "ProtocolType" "GMLAN"; +BA_ "UseGMParameterIDs" 0; +VAL_ 497 SystemPowerMode 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off"; +VAL_ 497 SystemBackUpPowerMode 3 "Crank Request" 2 "Run" 1 "Accessory" 0 "Off"; +VAL_ 481 DistanceButton 1 "Active" 0 "Inactive" ; +VAL_ 481 LKAButton 1 "Active" 0 "Inactive" ; +VAL_ 481 ACCButtons 6 "Cancel" 5 "Main" 3 "Set" 2 "Resume" 1 "None" ; +VAL_ 481 DriveModeButton 1 "Active" 0 "Inactive" ; +VAL_ 452 CruiseState 4 "Standstill" 3 "Faulted" 1 "Active" 0 "Off" ; +VAL_ 309 PRNDL 3 "R" 2 "D" 1 "N" 0 "P" ; +VAL_ 309 ESPButton 1 "Active" 0 "Inactive" ; +VAL_ 384 LKASteeringCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 842 RRWheelDir 0 "Stationary" 1 "Forward" 2 "Reverse" 3 "Unsupported" 4 "Fault"; +VAL_ 842 RLWheelDir 0 "Stationary" 1 "Forward" 2 "Reverse" 3 "Unsupported" 4 "Fault"; +VAL_ 880 ACCCruiseState 2 "Adaptive" 3 "Adaptive" 4 "Non-adaptive" 5 "Non-adaptive" ; +VAL_ 880 ACCLeadCar 1 "Present" 0 "Not Present" ; +VAL_ 880 ACCGapLevel 3 "Far" 2 "Med" 1 "Near" 0 "Inactive" ; +VAL_ 880 ACCResumeButton 1 "Pressed" 0 "Depressed" ; +VAL_ 880 ACCCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 388 HandsOffSWDetectionMode 2 "Failed" 1 "Enabled" 0 "Disabled" ; +VAL_ 388 HandsOffSWlDetectionStatus 1 "Hands On" 0 "Hands Off" ; +VAL_ 388 LKATorqueDeliveredStatus 3 "Failed" 2 "Temp. Limited" 1 "Active" 0 "Inactive" ; +VAL_ 489 BrakePedalPressed 1 "Pressed" 0 "Depressed" ; +VAL_ 715 GasRegenCmdActiveInv 1 "Inactive" 0 "Active" ; +VAL_ 715 GasRegenCmdActive 1 "Active" 0 "Inactive" ; +VAL_ 320 Intellibeam 1 "Active" 0 "Inactive" ; +VAL_ 320 HighBeamsActive 1 "Active" 0 "Inactive" ; +VAL_ 320 HighBeamsTemporary 1 "Active" 0 "Inactive" ; +VAL_ 501 PRNDL2 7 "L3" 6 "L" 5 "L2" 4 "D" 3 "N" 2 "R" 1 "P" 0 "Shifting"; +VAL_ 501 TransmissionState 11 "Shifting" 10 "Reverse" 9 "Forward" 8 "Disengaged"; +VAL_ 501 ManualMode 1 "Active" 0 "Inactive" diff --git a/artifacts/package_runtime/iqdbc/dbc/gwm_haval_h6_phev_2024.dbc b/artifacts/package_runtime/iqdbc/dbc/gwm_haval_h6_phev_2024.dbc new file mode 100644 index 000000000..b9f85d7a5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/gwm_haval_h6_phev_2024.dbc @@ -0,0 +1,252 @@ +BO_ 96 CAR_OVERALL_SIGNALS2: 64 XXX + SG_ CRC1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER1 : 59|4@0+ (1,0) [0|15] "" XXX + SG_ CRC2 : 71|8@0+ (1,0) [0|255] "" XXX + SG_ GAS_POSITION : 79|8@0+ (0.393700787,0) [0|255] "%" XXX + SG_ BRAKE_SIGNAL : 86|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_GAS_POSITION : 103|8@0+ (0.393700787,0) [0|255] "%" XXX + SG_ COUNTER2 : 123|4@0+ (1,0) [0|15] "" XXX + SG_ CRC3 : 135|8@0+ (1,0) [0|255] "" XXX + SG_ REQ_REVIEW_UND_SIGNAL : 143|10@0+ (1,0) [0|255] "" XXX + SG_ REQ_REVIEW_POWER_CONSUMPTION : 144|9@0+ (1,-175) [0|511] "" XXX + SG_ REQ_REVIEW_POWER_CONSUMPTION2 : 180|9@0+ (1,-176) [0|511] "" XXX + SG_ COUNTER3 : 187|4@0+ (1,0) [0|15] "" XXX + SG_ REQ_REVIEW_POWER_STATE_SIGNAL : 302|4@0+ (1,0) [0|15] "" XXX + SG_ REQ_REVIEW_POWER_STATE_SIGNAL2 : 370|1@0+ (1,0) [0|1] "" XXX + +BO_ 147 IMPRECISE_SPEED_INFORMATION: 8 XXX + SG_ IMPRECISE_SPEED : 15|8@0+ (3.5,0) [0|255] "kph" XXX + SG_ REQ_REVIEW_SPEED : 31|8@0+ (0.430107526,0) [0|255] "Kph" XXX + SG_ REQ_REVIEW_SPEED2 : 39|8@0+ (0.430107526,0) [0|255] "Kph" XXX + SG_ REQ_REVIEW_POWER_CONSUMPTION : 52|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 161 STEER_AND_AP_STALK: 8 XXX + SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX + SG_ STEERING_ANGLE : 13|13@0+ (0.05,0) [0|65535] "degs" XXX + SG_ STEERING_DIRECTION : 16|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_TORQUE : 29|14@0+ (1,0) [0|65535] "??" XXX + SG_ AP_REDUCE_DISTANCE_COMMAND : 44|1@0+ (1,0) [0|1] "" XXX + SG_ AP_INCREASE_DISTANCE_COMMAND : 45|1@0+ (1,0) [0|1] "AUTOPILOT_STALK" XXX + SG_ AP_CANCEL_COMMAND : 46|1@0+ (1,0) [0|1] "" XXX + SG_ AP_ENABLE_COMMAND : 47|1@0+ (1,0) [0|1] "" XXX + SG_ AP_DECREASE_SPEED_COMMAND : 50|1@0+ (1,0) [0|1] "" XXX + SG_ AP_INCREASE_SPEED_COMMAND : 51|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 59|4@0+ (1,0) [0|255] "" XXX + +BO_ 259 SPEED: 64 XXX + SG_ CRC : 199|8@0+ (1,0) [0|255] "" XXX + SG_ UNDEFINED_ACCUMULATOR : 207|8@0+ (1,0) [0|255] "" XXX + SG_ UNDEFINED_COUNTER : 215|8@0+ (1,0) [0|255] "" XXX + SG_ ODD_GAS_POSITION : 231|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED : 239|8@0+ (1,0) [0|255] "Khp" XXX + SG_ COUNTER2 : 251|4@0+ (1,0) [0|15] "" XXX + +BO_ 273 UNDEFINED_2: 8 XXX + SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX + SG_ UNDEFINED_SIGNAL_RELATED_ACC : 46|13@0+ (1,0) [0|8191] "" XXX + SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 288 BRAKE2: 64 XXX + SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REVIEW_REQ_BRAKE_SIGNAL1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ REQ_REVIEW_MOVING : 22|1@0+ (1,0) [0|1] "" XXX + SG_ ODD_BRAKE_PRESSURE : 39|8@0+ (1,-27) [0|255] "" XXX + SG_ REVIEW_REQ_BRAKE_SIGNAL2 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 299 AUTOPILOT: 64 XXX + SG_ REQ_REVIEW_CRC : 71|8@0+ (1,0) [0|255] "" XXX + SG_ AP_UNDEFINED_SIGNAL2 : 73|2@0+ (1,0) [0|3] "" XXX + SG_ REQ_REVIEW_COUNTER : 78|5@0+ (1,0) [0|31] "" XXX + SG_ AP_UNDEFINED_SIGNAL : 87|6@0+ (1,0) [0|63] "" XXX + SG_ AP_STEERING_UNDEFINED_SIGNAL1 : 102|10@0- (1,0) [0|2047] "" XXX + SG_ AP_UNDEFINED_SIGNAL3 : 103|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 123|4@0+ (1,0) [0|15] "" XXX + SG_ AP_STATE : 125|1@0+ (1,0) [0|1] "" XXX + SG_ CRC : 135|8@0+ (1,0) [0|255] "" XXX + +BO_ 303 CAR_OVERALL_SIGNALS: 64 XXX + SG_ CRC1 : 71|8@0+ (1,0) [0|255] "" XXX + SG_ DRIVE_MODE_SIGNAL : 73|1@0+ (1,0) [0|1] "" XXX + SG_ REQ_REVIEW_POWER_STATE : 80|1@0+ (1,0) [0|1] "" XXX + SG_ REQ_REVIEW_POWER_STATE2 : 83|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_SIGNAL : 86|1@0+ (1,0) [0|1] "" XXX + SG_ REQ_REVIEW_POWER_STATE3 : 113|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER1 : 123|4@0+ (1,0) [0|15] "" XXX + SG_ CRC2 : 135|8@0+ (1,0) [0|255] "" XXX + SG_ DRIVER_MODE_SIGNAL2 : 161|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE_P : 162|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE_D : 163|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE_SIGNAL3 : 165|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE : 166|2@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_SIGNAL : 176|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER2 : 187|4@0+ (1,0) [0|15] "" XXX + +BO_ 311 BRAKE: 64 XXX + SG_ CRC1 : 71|8@0+ (1,0) [0|255] "" XXX + SG_ REQ_REVIEW_DRIVE_MODE : 77|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER1 : 123|4@0+ (1,0) [0|15] "" XXX + SG_ CRC2 : 135|8@0+ (1,0) [0|255] "" XXX + SG_ REQ_REVIEW_HANDBRAKE_ENABLED : 143|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_SIGNAL1 : 152|1@0+ (1,0) [0|1] "" XXX + SG_ REVIEW_REQ_HANDBRAKE_RELEASED : 153|1@0+ (1,0) [0|1] "" XXX + SG_ REVIEW_REQ_HANDBRAKE_ENABLED : 154|1@0+ (1,0) [0|1] "DURING POWER BRAKE IS FALSE" XXX + SG_ BRAKE_SIGNAL2 : 155|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER2 : 187|4@0+ (1,0) [0|15] "" XXX + SG_ CRC3 : 199|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSURE : 207|13@0+ (1,0) [0|8191] "" XXX + SG_ REQ_REVIEW_BRAKE_PRESSURE : 207|14@0+ (1,0) [0|1] "" XXX + SG_ COUNTER3 : 251|4@0+ (1,0) [0|15] "" XXX + SG_ CRC4 : 263|8@0+ (1,0) [0|255] "" XXX + +BO_ 315 WHEEL_SPEEDS: 64 XXX + SG_ FRONT_CRC : 7|8@0+ (1,0) [0|255] "" XXX + SG_ FRONT_LEFT_WHEEL_SPEED : 12|13@0+ (0.05924739,0) [0|8191] "Kph" XXX + SG_ FRONT_RIGHT_WHEEL_SPEED : 28|13@0+ (0.05924739,0) [0|8191] "Kph" XXX + SG_ FRONT_DISTANCE_ACCUMULATOR : 47|16@0+ (1,0) [0|65535] "??" XXX + SG_ FRONT_COUNTER : 59|4@0+ (1,0) [0|15] "" XXX + SG_ REAR_CRC : 327|8@0+ (1,0) [0|255] "" XXX + SG_ REAR_LEFT_WHEEL_SPEED : 332|13@0+ (0.05924739,0) [0|8191] "Kph" XXX + SG_ REAR_RIGHT_WHEEL_SPEED : 348|13@0+ (0.05924739,0) [0|8191] "Kph" XXX + SG_ REAR_DISTANCE_ACCUMULATOR : 367|16@0+ (1,0) [0|65535] "" XXX + SG_ REAR_COUNTER : 379|4@0+ (1,0) [0|15] "" XXX + +BO_ 323 SPEED2: 64 XXX + SG_ NEW_SIGNAL_1 : 71|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED_REAL : 119|8@0+ (1,0) [0|255] "Kph" XXX + SG_ COUNTER : 123|4@0+ (1,0) [0|15] "" XXX + SG_ CRC2 : 135|8@0+ (1,0) [0|255] "" XXX + +BO_ 327 NEW_MSG_147: 64 XXX + +BO_ 347 NEW_MSG_15B: 64 XXX + +BO_ 357 NEW_MSG_165: 8 XXX + +BO_ 367 NEW_MSG_16F: 64 XXX + +BO_ 412 LIGHTS: 16 XXX + SG_ BRAKE_LIGHTS : 24|3@0+ (1,0) [0|7] "" XXX + SG_ RIGHT_TURN_SIGNAL : 30|1@0+ (1,0) [0|1] "ON/OFF ACCORDINGLY LIGHT" XXX + SG_ LEFT_TURN_SIGNAL : 31|1@0+ (1,0) [0|1] "ON/OFF ACCORDINGLY LIGHT" XXX + +BO_ 415 NEW_MSG_19F: 64 XXX + +BO_ 573 UNDEFINED_RELATIONSHIP_WITH_CAR_RUNNING: 64 XXX + SG_ COUNTER1 : 123|4@0+ (1,0) [0|15] "" XXX + SG_ CRC2 : 135|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER2 : 187|12@0+ (1,0) [0|4095] "" XXX + SG_ COUNTER3 : 251|4@0+ (1,0) [0|15] "" XXX + SG_ CRC3 : 263|8@0+ (1,0) [0|255] "" XXX + +BO_ 581 NEW_MSG_245: 8 XXX + +BO_ 639 NEW_MSG_27F: 16 XXX + SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REQ_REVIEW_ODOMETER : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 649 DRIVE_MODE: 64 XXX + SG_ DRIVE_MODE_ENABLED : 382|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE_DISABLED : 383|1@0+ (1,0) [0|1] "" XXX + +BO_ 683 ACC: 64 XXX + SG_ COUNTER1 : 123|4@0+ (1,0) [0|15] "" XXX + SG_ CRC1 : 135|8@0+ (1,0) [0|255] "" XXX + SG_ CAR_DISTANCE_SELECTION : 170|3@0+ (1,0) [0|7] "" XXX + SG_ ACC_SPEED_SELECTION : 183|8@0+ (1,0) [0|255] "Kph" XXX + SG_ COUNTER2 : 187|4@0+ (1,0) [0|15] "" XXX + +BO_ 696 UNDEFINED_INTERESTING_SIGNALS: 64 XXX + SG_ UNDEFINED_SIGNAL2 : 20|9@0+ (1,0) [0|511] "" XXX + SG_ UNDEFINED_SIGNAL1 : 27|12@0+ (1,0) [0|4095] "" XXX + SG_ UNDEFINED_ACCUMULATOR : 47|8@0+ (1,0) [0|255] "" XXX + SG_ UNDEFINED_ACCUMULATOR2 : 47|12@0+ (1,0) [0|15] "" XXX + SG_ UNDEFINED_SIGNAL3 : 51|12@0+ (1,0) [0|4095] "" XXX + SG_ UNDEFINED_SIGNAL4 : 265|10@0+ (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_1 : 354|7@0+ (1,0) [0|127] "" XXX + +BO_ 714 BUTTONS: 8 XXX + SG_ LOCK_DOORS_BUTTON : 16|1@0+ (1,0) [0|1] "" XXX + +BO_ 793 DOOR_DRIVER: 16 XXX + SG_ REQ_REVIEW_CAR_STATE : 16|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_REAR_RIGHT_OPEN : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_FRONT_RIGHT_OPEN : 20|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_REAR_LEFT_OPEN : 21|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_DRIVER_OPEN : 22|1@0+ (1,0) [0|1] "" XXX + +BO_ 837 DOOR_LOCK_STATES: 16 XXX + SG_ DOOR_LOCK_STATE : 13|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_LOCK_STATE2 : 34|1@0+ (1,0) [0|1] "" XXX + +BO_ 849 SEATBELT: 16 XXX + SG_ CRC : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SEAT_BELT_DRIVER_STATE : 11|1@0+ (1,0) [0|1] "" XXX + SG_ SEAT_BELT_DRIVER_STATE2 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 59|4@0+ (1,0) [0|15] "" XXX + +CM_ SG_ 96 GAS_POSITION "0 - 100%"; +CM_ SG_ 96 BRAKE_SIGNAL "1 = BRAKE PRESSED"; +CM_ SG_ 96 ACC_GAS_POSITION "0 - 100% | WHEN ACC REMAINS INFORMATION"; +CM_ SG_ 96 REQ_REVIEW_POWER_CONSUMPTION2 "REQ FACTOR CONVERTER"; +CM_ SG_ 96 REQ_REVIEW_POWER_STATE_SIGNAL "1 = OFF | 12 WARM-UP | 5 = ON"; +CM_ SG_ 96 REQ_REVIEW_POWER_STATE_SIGNAL2 "1 = OFF | 0 = ON"; +CM_ SG_ 147 IMPRECISE_SPEED "lower precision, reverse is positive as well"; +CM_ SG_ 147 REQ_REVIEW_SPEED "INITIALLY ADJUSTED TO KPH BUT ITS NOT"; +CM_ SG_ 147 REQ_REVIEW_SPEED2 "INITIALLY ADJUSTED TO KPH BUT ITS NOT"; +CM_ SG_ 161 STEERING_ANGLE "0 CENTER, NO LEFT / RIGHT SIGNAL"; +CM_ SG_ 161 STEERING_TORQUE "Peak identified 3680, 0 = stopped"; +CM_ SG_ 161 AP_REDUCE_DISTANCE_COMMAND "AUTOPILOT STALK"; +CM_ SG_ 161 AP_CANCEL_COMMAND "AUTOPILOT STALK - FRONT MOVEMENT = CANCEL COMMAND"; +CM_ SG_ 161 AP_ENABLE_COMMAND "AUTOPILOT STALK - REAR MOVEMENT = ENABLE COMMAND"; +CM_ SG_ 161 AP_DECREASE_SPEED_COMMAND "AUTOPILOT STALK - MOVEMENT"; +CM_ SG_ 161 AP_INCREASE_SPEED_COMMAND "AUTOPILOT STALK - DOWN MOVEMENT]"; +CM_ SG_ 259 UNDEFINED_ACCUMULATOR "WHEN ELETRIC MODE = 0, PERHAPS COMBUSTION ENGINE"; +CM_ SG_ 259 UNDEFINED_COUNTER "0 WHEN ELECTRIC, PERHAPS COMBUSTION ENGINE"; +CM_ SG_ 259 ODD_GAS_POSITION "17 = 0, 253 = FULL, SOMETIMES 4"; +CM_ SG_ 259 SPEED "PRECISE, KPH, DASHBOARD SPEED, BIT LOWER THAN GPS SPEED"; +CM_ SG_ 288 REVIEW_REQ_BRAKE_SIGNAL1 "0 | 128 SIMILAR TO BRAKE SIGNAL BUT ADDITIONAL DELAY"; +CM_ SG_ 288 REQ_REVIEW_MOVING "1 = CAR IS MOVING"; +CM_ SG_ 288 ODD_BRAKE_PRESSURE "ODD BRAKE PRESSURE, NEGATIVE/OFFSET"; +CM_ SG_ 288 REVIEW_REQ_BRAKE_SIGNAL2 "0 | 128 BRAKE PRESSED"; +CM_ SG_ 299 REQ_REVIEW_COUNTER "COUNTER NOT STABLE"; +CM_ SG_ 299 AP_UNDEFINED_SIGNAL3 "PERHAPS HANDS ON SENSOR"; +CM_ SG_ 299 AP_STATE "1 = ON | 0 = OFF"; +CM_ SG_ 303 DRIVE_MODE_SIGNAL "D/R = 0 | N/P = 1"; +CM_ SG_ 303 REQ_REVIEW_POWER_STATE "1 = ON | 0 = IDLE"; +CM_ SG_ 303 REQ_REVIEW_POWER_STATE2 "1 = ON | 0 = IDLE"; +CM_ SG_ 303 GAS_SIGNAL "1 = GAS PRESSED"; +CM_ SG_ 303 REQ_REVIEW_POWER_STATE3 "0 = OFF / 1 = ON"; +CM_ SG_ 303 DRIVER_MODE_SIGNAL2 "D/R = 1 | N/P=0"; +CM_ SG_ 303 DRIVE_MODE_SIGNAL3 "P/R = 1 | P/N = 0"; +CM_ SG_ 303 DRIVE_MODE "0 = P | 1 = D | 2 = N | 3 = R (GOOD SIGNAL)"; +CM_ SG_ 303 BRAKE_SIGNAL "1 BRAKE PRESSED"; +CM_ SG_ 311 REQ_REVIEW_DRIVE_MODE "1 = P | 0 = D"; +CM_ SG_ 311 BRAKE_SIGNAL1 "0 = NO | 1 = BRAKE PRESSED"; +CM_ SG_ 311 REVIEW_REQ_HANDBRAKE_RELEASED "DURING POWER BRAKE IS TRUE"; +CM_ SG_ 311 BRAKE_SIGNAL2 "0 NO | 1 = BRAKE PRESSED"; +CM_ SG_ 311 BRAKE_PRESSURE "MAX PRESSURE IDENTIFIED = 4184 | 0 = NO PRESSURE"; +CM_ SG_ 311 REQ_REVIEW_BRAKE_PRESSURE "ADDITIONAL BIT"; +CM_ SG_ 315 FRONT_LEFT_WHEEL_SPEED "Based on the car's dashboard speed"; +CM_ SG_ 315 FRONT_RIGHT_WHEEL_SPEED "Based on the car's dashboard speed"; +CM_ SG_ 315 FRONT_DISTANCE_ACCUMULATOR "?? doubts"; +CM_ SG_ 315 REAR_LEFT_WHEEL_SPEED "Based on the car's dashboard speed"; +CM_ SG_ 315 REAR_RIGHT_WHEEL_SPEED "Based on the car's dashboard speed"; +CM_ SG_ 315 REAR_DISTANCE_ACCUMULATOR "PULSES"; +CM_ SG_ 323 SPEED_REAL "PRECISE, EQUAL GPS SPEED"; +CM_ SG_ 412 BRAKE_LIGHTS "POSSIBLE 3 DIFFERENT LIGHTS"; +CM_ SG_ 412 LEFT_TURN_SIGNAL "ON/OFF ACCORDINGLY LIGHT"; +CM_ BO_ 573 "APPEARS TO HAVE GOOD MOVING INFORMATION"; +CM_ BO_ 649 "FRONT"; +CM_ SG_ 649 DRIVE_MODE_ENABLED "DRIVE = 1 | OTHER MODES = 0"; +CM_ SG_ 649 DRIVE_MODE_DISABLED "D = 0 | OTHER MODES = 0"; +CM_ SG_ 683 CAR_DISTANCE_SELECTION "AUTOPILOT CAR DISTANCE SELECTED BY DRIVER, OPTIONS 1, 2, 3, 4"; +CM_ BO_ 696 "POSSIBLE RELATED TO ACC OR ENGINE"; +CM_ SG_ 714 LOCK_DOORS_BUTTON "1 = PRESSED"; +CM_ SG_ 793 REQ_REVIEW_CAR_STATE "1 = STOPPED | 0 = MOVING"; +CM_ SG_ 837 DOOR_LOCK_STATE "0 = LOCKED / 1 = UNLOCKED"; +CM_ SG_ 837 DOOR_LOCK_STATE2 "0 = LOCKED / 1 = UNLOCKED"; +CM_ SG_ 849 SEAT_BELT_DRIVER_STATE "0 = Fastened / 1 = Released"; +CM_ SG_ 849 SEAT_BELT_DRIVER_STATE2 "0 = Fastened / 1 = Released"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_accord_2017_can_ext_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_accord_2017_can_ext_generated.dbc new file mode 100644 index 000000000..09972fbc9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_accord_2017_can_ext_generated.dbc @@ -0,0 +1,406 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _nidec_common.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _nidec_scm_group_a.dbc starts here"; +BO_ 660 SCM_FEEDBACK: 8 SCM + SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON + SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 422 SCM_BUTTONS: 8 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON + SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON + SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON + +VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ; +VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; + + +CM_ "Imported file _steering_sensors_b.dbc starts here"; +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _steering_control_d_ext.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 ADAS + SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + +BO_ 400 STEER_STATUS: 5 EPS + SG_ STEER_TORQUE_SENSOR : 0|9@1- (1,0) [-256|256] "" XXX + SG_ LIN_INTERFACE_FATAL_ERROR : 10|1@0+ (1,0) [0|1] "" XXX + SG_ LATE_MESSAGE : 11|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_STATUS : 12|4@1+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ALLOWED : 9|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_APPLIED : 23|16@0- (1,0) [0|511] "" XXX + +VAL_ 400 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; + +CM_ "honda_accord_2017_can_ext.dbc starts here"; + +BO_ 392 GEARBOX_AUTO: 6 XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + SG_ GEAR_SHIFTER : 27|4@0+ (1,0) [0|15] "" EON + SG_ GEAR : 36|5@0+ (1,0) [0|31] "" EON + +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +VAL_ 392 GEAR_SHIFTER 0 "S" 1 "P" 2 "R" 4 "N" 8 "D" ; +VAL_ 392 GEAR 26 "S" 4 "D" 3 "N" 2 "R" 1 "P" ; +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_bosch_radarless_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_bosch_radarless_generated.dbc new file mode 100644 index 000000000..87e53365e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_bosch_radarless_generated.dbc @@ -0,0 +1,647 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _bosch_2018.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 EON + SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS + SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS + SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX + SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 232 BRAKE_HOLD: 7 XXX + SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX + SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX + SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + +BO_ 446 BRAKE_MODULE: 3 VSA + SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX + +BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS + SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 545 ECON_STATUS: 6 SCM + SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY + +BO_ 576 LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 577 LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 579 RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 580 RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ AMBIENT_LIGHT_MAYBE : 23|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 927 RADAR_HUD: 8 RADAR + SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY + SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY + SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY + SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX + SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 13274 LKAS_HUD_A: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + +BO_ 13275 LKAS_HUD_B: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + +CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1"; +CM_ SG_ 662 AMBIENT_LIGHT_MAYBE "Slow-moving sensor value (possibly the ambient light input for adaptive high beam), undecoded. The camera consumes SCM_BUTTONS content beyond the buttons, so frames sent in its place must echo this byte"; +CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded"; +CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded"; +CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded"; +CM_ SG_ 577 LINE_DASHED "1 = line is dashed"; +CM_ SG_ 577 LINE_SOLID "1 = line is solid"; + +VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active"; +VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal"; +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ; +VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN"; +VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN"; + + +CM_ "Imported file _lkas_hud_8byte.dbc starts here"; +BO_ 829 LKAS_HUD: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 254913108 LKAS_HUD_2: 8 ADAS + SG_ COUNTER_2 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X01 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_WIDTH : 15|6@0+ (1,0) [0|63] "" XXX + SG_ LEFT_LANE : 23|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE : 21|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LANE_CROSSED : 25|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_CROSSED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LENGTH : 31|6@0+ (1,0) [0|63] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 114120023 HUD_OBJECTS: 8 CAM + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ OBJECT_ID m1 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ IS_LEAD_CAR m1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_TYPE m1 : 23|4@0- (1,0) [-8|7] "" XXX + SG_ ROTATION m1 : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LONG_DIST m1 : 39|10@0+ (0.209,-16.9) [-16.9|196.9] "m" XXX + SG_ LAT_DIST m1 : 43|12@0- (0.1,0) [-204.8|204.7] "m" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120025 HUD_OBJECTS_B: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ OBJECT_ID m1 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ IS_LEAD_CAR m1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_TYPE m1 : 23|4@0- (1,0) [-8|7] "" XXX + SG_ ROTATION m1 : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LONG_DIST m1 : 39|10@0+ (0.209,-16.9) [-16.9|196.9] "m" XXX + SG_ LAT_DIST m1 : 43|12@0- (0.1,0) [-204.8|204.7] "m" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120020 LANE_PATH: 8 CAM + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ PATH_OFFSET_1 m1 : 15|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_2 m1 : 19|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_3 m1 : 39|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_4 m1 : 43|12@0- (1,0) [-2048|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120024 LANE_PATH_B: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ PATH_OFFSET_1 m1 : 15|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_2 m1 : 19|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_3 m1 : 39|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_4 m1 : 43|12@0- (1,0) [-2048|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; +CM_ SG_ 114120023 MUX "1-10, 17-26, 33-42, 49-58 map to the same 10 slots for 5Hz frequency each"; +CM_ SG_ 114120023 IS_LEAD_CAR "1 when this track is the lead car; the lead, when present, is always track index 1"; +CM_ SG_ 114120023 LAT_DIST "positive = left of ego, 204.7 (max value) when inactive"; +CM_ SG_ 114120023 ROTATION "0 straight, negative left, positive right. Range of -3 to 3 seen so far. -128 when inactive."; +CM_ SG_ 114120025 MUX "1-10, 17-26, 33-42, 49-58 map to the same 10 slots for 5Hz frequency each"; +CM_ SG_ 114120025 IS_LEAD_CAR "1 when this track is the lead car; the lead, when present, is always track index 1"; +CM_ SG_ 114120025 LAT_DIST "positive = left of ego, 204.7 (max value) when inactive"; +CM_ SG_ 114120025 ROTATION "0 straight, negative left, positive right. Range of -3 to 3 seen so far. -128 when inactive."; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; +VAL_ 829 LANE_LINES 7 "both_lines_green" 6 "both_lines_white" 2 "left_line_white" 0 "no_lines"; +VAL_ 114120023 CAR_TYPE 7 "CAR" 6 "MOTORCYCLE" -7 "TRUCK" -1 "INACTIVE" 0 "UNKNOWN"; +VAL_ 114120025 CAR_TYPE 7 "CAR" 6 "MOTORCYCLE" -7 "TRUCK" -1 "INACTIVE" 0 "UNKNOWN"; + + +CM_ "Imported file _bosch_standstill.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + + +CM_ "Imported file _steering_sensors_a.dbc starts here"; +BO_ 330 STEERING_SENSORS: 8 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON + SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_bosch_radarless.dbc starts here"; + +BO_ 456 ACC_CONTROL: 8 XXX + SG_ ACCEL_COMMAND : 7|12@0- (0.01,0) [0|0] "m/s^2" XXX + SG_ COMPUTER_BRAKE_ASSIST : 8|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL : 9|1@0+ (1,0) [0|1] "" XXX + SG_ CONTROL_ON : 10|1@0+ (1,0) [0|1] "" XXX + SG_ BOH : 23|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_STATUS : 33|1@1+ (1,0) [0|7] "" XXX + SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_1 : 24|1@1+ (1,0) [0|3] "" XXX + SG_ FCW_2 : 54|1@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 467 CRUISE_FAULT_STATUS: 8 XXX + SG_ CRUISE_FAULT : 3|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 477 GEARBOX_ALT_2: 8 XXX + SG_ GEAR_MT : 39|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 495 SPEED_LIMIT_DASH_DISPLAY: 8 ADAS + SG_ SPEED_LIMIT : 47|8@0+ (1,0) [0|255] "mph" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 456 COMPUTER_BRAKE_ASSIST "on hybrid and alt-brake cars set whenever braking; otherwise allows engine idle stop at a standstill"; +CM_ SG_ 456 STANDSTILL "set to 1 when camera requests -4.0 m/s^2"; +CM_ SG_ 495 SPEED_LIMIT "Defaults to 0xFF if no speed limit found"; + +VAL_ 477 GEAR_MT 14 "reverse" 6 "6th" 5 "5th" 4 "4th" 3 "3rd" 2 "2nd" 1 "1st" 0 "Clutch"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_civic_hatchback_ex_2017_can_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_civic_hatchback_ex_2017_can_generated.dbc new file mode 100644 index 000000000..e4913b274 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_civic_hatchback_ex_2017_can_generated.dbc @@ -0,0 +1,582 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _bosch_2018.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 EON + SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS + SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS + SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX + SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 232 BRAKE_HOLD: 7 XXX + SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX + SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX + SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + +BO_ 446 BRAKE_MODULE: 3 VSA + SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX + +BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS + SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 545 ECON_STATUS: 6 SCM + SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY + +BO_ 576 LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 577 LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 579 RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 580 RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ AMBIENT_LIGHT_MAYBE : 23|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 927 RADAR_HUD: 8 RADAR + SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY + SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY + SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY + SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX + SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 13274 LKAS_HUD_A: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + +BO_ 13275 LKAS_HUD_B: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + +CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1"; +CM_ SG_ 662 AMBIENT_LIGHT_MAYBE "Slow-moving sensor value (possibly the ambient light input for adaptive high beam), undecoded. The camera consumes SCM_BUTTONS content beyond the buttons, so frames sent in its place must echo this byte"; +CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded"; +CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded"; +CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded"; +CM_ SG_ 577 LINE_DASHED "1 = line is dashed"; +CM_ SG_ 577 LINE_SOLID "1 = line is solid"; + +VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active"; +VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal"; +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ; +VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN"; +VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN"; + + +CM_ "Imported file _bosch_radar_acc.dbc starts here"; +BO_ 479 ACC_CONTROL: 8 EON + SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX + SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX + SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX + SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX + SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 495 ACC_CONTROL_ON: 8 XXX + SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX + SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled"; +CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event"; +CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event"; +CM_ SG_ 479 AEB_PREPARE "set 1s before AEB"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _bosch_standstill.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + + +CM_ "Imported file _steering_sensors_a.dbc starts here"; +BO_ 330 STEERING_SENSORS: 8 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON + SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_civic_hatchback_ex_2017_can.dbc starts here"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_civic_touring_2016_can_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_civic_touring_2016_can_generated.dbc new file mode 100644 index 000000000..019ede054 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_civic_touring_2016_can_generated.dbc @@ -0,0 +1,454 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _nidec_common.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _nidec_scm_group_b.dbc starts here"; +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_BUTTON : 22|2@0+ (1,0) [0|3] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ; + + +CM_ "Imported file _steering_sensors_a.dbc starts here"; +BO_ 330 STEERING_SENSORS: 8 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON + SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _steering_control_a.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 ADAS + SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_civic_touring_2016_can.dbc starts here"; + +BO_ 493 HUD_SETTING: 5 XXX + SG_ IMPERIAL_UNIT : 5|1@0+ (1,0) [0|1] "" EON + +BO_ 545 ECON_STATUS: 6 XXX + SG_ ECON_ON_2 : 37|2@0+ (1,0) [0|3] "" EON + SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + +VAL_ 545 ECON_ON_2 0 "off" 3 "on" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_clarity_hybrid_2018_can_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_clarity_hybrid_2018_can_generated.dbc new file mode 100644 index 000000000..421ce4718 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_clarity_hybrid_2018_can_generated.dbc @@ -0,0 +1,459 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _nidec_common.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _nidec_scm_group_b.dbc starts here"; +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_BUTTON : 22|2@0+ (1,0) [0|3] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ; + + +CM_ "Imported file _steering_sensors_a.dbc starts here"; +BO_ 330 STEERING_SENSORS: 8 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON + SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _steering_control_a.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 ADAS + SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_clarity_hybrid_2018_can.dbc starts here"; + +BO_ 768 VEHICLE_STATE: 8 ADAS + SG_ SET_ME_XF9 : 7|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ VEHICLE_SPEED : 15|8@0+ (1,0) [0|255] "kph" Vector__XXX + SG_ SET_ME_X8A : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_XD0 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SALTED_WITH_IDX : 39|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 769 VEHICLE_STATE2: 8 ADAS + SG_ SET_ME_X5D : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X02 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X5F : 39|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_common_canfd_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_common_canfd_generated.dbc new file mode 100644 index 000000000..2fd7628ea --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_common_canfd_generated.dbc @@ -0,0 +1,713 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _bosch_2018.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 EON + SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS + SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS + SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX + SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 232 BRAKE_HOLD: 7 XXX + SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX + SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX + SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + +BO_ 446 BRAKE_MODULE: 3 VSA + SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX + +BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS + SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 545 ECON_STATUS: 6 SCM + SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY + +BO_ 576 LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 577 LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 579 RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 580 RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ AMBIENT_LIGHT_MAYBE : 23|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 927 RADAR_HUD: 8 RADAR + SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY + SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY + SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY + SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX + SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 13274 LKAS_HUD_A: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + +BO_ 13275 LKAS_HUD_B: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + +CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1"; +CM_ SG_ 662 AMBIENT_LIGHT_MAYBE "Slow-moving sensor value (possibly the ambient light input for adaptive high beam), undecoded. The camera consumes SCM_BUTTONS content beyond the buttons, so frames sent in its place must echo this byte"; +CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded"; +CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded"; +CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded"; +CM_ SG_ 577 LINE_DASHED "1 = line is dashed"; +CM_ SG_ 577 LINE_SOLID "1 = line is solid"; + +VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active"; +VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal"; +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ; +VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN"; +VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN"; + + +CM_ "Imported file _bosch_radar_acc.dbc starts here"; +BO_ 479 ACC_CONTROL: 8 EON + SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX + SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX + SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX + SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX + SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 495 ACC_CONTROL_ON: 8 XXX + SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX + SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled"; +CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event"; +CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event"; +CM_ SG_ 479 AEB_PREPARE "set 1s before AEB"; + + +CM_ "Imported file _lkas_hud_8byte.dbc starts here"; +BO_ 829 LKAS_HUD: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 254913108 LKAS_HUD_2: 8 ADAS + SG_ COUNTER_2 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X01 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_WIDTH : 15|6@0+ (1,0) [0|63] "" XXX + SG_ LEFT_LANE : 23|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE : 21|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LANE_CROSSED : 25|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_CROSSED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LENGTH : 31|6@0+ (1,0) [0|63] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 114120023 HUD_OBJECTS: 8 CAM + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ OBJECT_ID m1 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ IS_LEAD_CAR m1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_TYPE m1 : 23|4@0- (1,0) [-8|7] "" XXX + SG_ ROTATION m1 : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LONG_DIST m1 : 39|10@0+ (0.209,-16.9) [-16.9|196.9] "m" XXX + SG_ LAT_DIST m1 : 43|12@0- (0.1,0) [-204.8|204.7] "m" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120025 HUD_OBJECTS_B: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ OBJECT_ID m1 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ IS_LEAD_CAR m1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_TYPE m1 : 23|4@0- (1,0) [-8|7] "" XXX + SG_ ROTATION m1 : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LONG_DIST m1 : 39|10@0+ (0.209,-16.9) [-16.9|196.9] "m" XXX + SG_ LAT_DIST m1 : 43|12@0- (0.1,0) [-204.8|204.7] "m" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120020 LANE_PATH: 8 CAM + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ PATH_OFFSET_1 m1 : 15|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_2 m1 : 19|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_3 m1 : 39|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_4 m1 : 43|12@0- (1,0) [-2048|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120024 LANE_PATH_B: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ PATH_OFFSET_1 m1 : 15|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_2 m1 : 19|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_3 m1 : 39|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_4 m1 : 43|12@0- (1,0) [-2048|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; +CM_ SG_ 114120023 MUX "1-10, 17-26, 33-42, 49-58 map to the same 10 slots for 5Hz frequency each"; +CM_ SG_ 114120023 IS_LEAD_CAR "1 when this track is the lead car; the lead, when present, is always track index 1"; +CM_ SG_ 114120023 LAT_DIST "positive = left of ego, 204.7 (max value) when inactive"; +CM_ SG_ 114120023 ROTATION "0 straight, negative left, positive right. Range of -3 to 3 seen so far. -128 when inactive."; +CM_ SG_ 114120025 MUX "1-10, 17-26, 33-42, 49-58 map to the same 10 slots for 5Hz frequency each"; +CM_ SG_ 114120025 IS_LEAD_CAR "1 when this track is the lead car; the lead, when present, is always track index 1"; +CM_ SG_ 114120025 LAT_DIST "positive = left of ego, 204.7 (max value) when inactive"; +CM_ SG_ 114120025 ROTATION "0 straight, negative left, positive right. Range of -3 to 3 seen so far. -128 when inactive."; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; +VAL_ 829 LANE_LINES 7 "both_lines_green" 6 "both_lines_white" 2 "left_line_white" 0 "no_lines"; +VAL_ 114120023 CAR_TYPE 7 "CAR" 6 "MOTORCYCLE" -7 "TRUCK" -1 "INACTIVE" 0 "UNKNOWN"; +VAL_ 114120025 CAR_TYPE 7 "CAR" 6 "MOTORCYCLE" -7 "TRUCK" -1 "INACTIVE" 0 "UNKNOWN"; + + +CM_ "Imported file _bosch_standstill.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + + +CM_ "Imported file _steering_sensors_a.dbc starts here"; +BO_ 330 STEERING_SENSORS: 8 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON + SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_common_canfd.dbc starts here"; + +BO_ 929 RADAR_REFERENCE: 8 XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 784 RADAR_HUD_CANFD: 8 XXX + SG_ SET_ME_X01 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X01_2 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CMBS_ENABLED_MAYBE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ON : 55|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 114120024 LANE_PATH: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ PATH_OFFSET_1 m1 : 15|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_2 m1 : 19|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_3 m1 : 39|12@0- (1,0) [-2048|2047] "" XXX + SG_ PATH_OFFSET_4 m1 : 43|12@0- (1,0) [-2048|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 114120025 HUD_OBJECTS: 8 XXX + SG_ MUX M : 7|6@0+ (1,0) [0|63] "" XXX + SG_ OBJECT_ID m1 : 15|5@0+ (1,0) [0|31] "" XXX + SG_ IS_LEAD_CAR m1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_TYPE m1 : 23|4@0- (1,0) [-8|7] "" XXX + SG_ ROTATION m1 : 31|8@0- (1,0) [-128|127] "" XXX + SG_ LONG_DIST m1 : 39|10@0+ (0.209,-16.9) [-16.9|196.9] "m" XXX + SG_ LAT_DIST m1 : 43|12@0- (0.1,0) [-204.8|204.7] "m" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 254913106 RADAR_LEAD2: 8 XXX + SG_ SET_ME_X88 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X78 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DISTANCE_MAYBE : 23|11@0+ (1,0) [0|2047] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 254913116 RADAR_LEAD: 8 XXX + SG_ SET_ME_X01 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ CNTR_REF : 7|2@0+ (1,0) [0|3] "" XXX + SG_ TARGET_SPEED_MAYBE : 15|8@0+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE : 23|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE : 21|2@0+ (1,0) [0|3] "" XXX + SG_ LANE_PATH_LENGTH : 31|6@0+ (1,0) [0|63] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 440773198 BOSCH_SUPPLEMENTAL_CANFD: 8 XXX + SG_ SET_ME_X01 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X41 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 1808 RADAR_SUPP_TICK_REFERENCE: 32 XXX + SG_ IGNORE : 11|1@0+ (1,0) [0|1] "" XXX + +BO_ 1840 RADAR_HUD_TICK_REFERENCE: 6 XXX + SG_ IGNORE : 11|1@0+ (1,0) [0|1] "" XXX + +BO_ 1872 RADAR_50HZ_TICK_REFERENCE: 16 XXX + SG_ IGNORE : 11|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 254913116 LANE_PATH_LENGTH "number of valid LANE_PATH points in the current sweep (6 = idle/no lane, up to 23-24); the dash needs this to match the in-band 2047 terminator to draw the lane lines"; +CM_ SG_ 254913116 LEFT_LANE "3 = left lane line detected, 0 = none; tracks the camera's LKAS_HUD LANE_LINES bit 1 exactly in factory logs. The CAN FD equivalent of radarless LKAS_HUD_2 LEFT_LANE; the dash won't draw the lane lines while both are 0"; +CM_ SG_ 254913116 RIGHT_LANE "3 = right lane line detected, 0 = none; tracks the camera's LKAS_HUD LANE_LINES bit 0 exactly in factory logs. The CAN FD equivalent of radarless LKAS_HUD_2 RIGHT_LANE; the dash won't draw the lane lines while both are 0"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_crv_ex_2017_body_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_crv_ex_2017_body_generated.dbc new file mode 100644 index 000000000..4d154e53f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_crv_ex_2017_body_generated.dbc @@ -0,0 +1,13 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "honda_crv_ex_2017_body.dbc starts here"; +BO_ 318291879 BSM_STATUS_RIGHT: 8 XXX + SG_ BSM_ALERT : 4|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_MODE : 6|2@0+ (1,0) [0|3] "" XXX + +BO_ 318291615 BSM_STATUS_LEFT: 8 XXX + SG_ BSM_ALERT : 4|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_MODE : 6|2@0+ (1,0) [0|3] "" XXX + +VAL_ 318291879 BSM_MODE 2 "blind_spot" 1 "cross_traffic" 0 "off"; +VAL_ 318291615 BSM_MODE 2 "blind_spot" 1 "cross_traffic" 0 "off"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_crv_touring_2016_can_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_crv_touring_2016_can_generated.dbc new file mode 100644 index 000000000..9599556dd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_crv_touring_2016_can_generated.dbc @@ -0,0 +1,438 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _nidec_common.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _nidec_scm_group_a.dbc starts here"; +BO_ 660 SCM_FEEDBACK: 8 SCM + SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON + SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 422 SCM_BUTTONS: 8 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON + SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON + SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON + +VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ; +VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; + + +CM_ "Imported file _steering_sensors_b.dbc starts here"; +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _steering_control_b.dbc starts here"; +BO_ 404 STEERING_CONTROL: 4 EON + SG_ STEER_TORQUE : 7|12@0- (1,0) [-768|768] "" EPS + SG_ SET_ME_X00 : 11|4@0+ (1,0) [0|15] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00_2 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS + +BO_ 399 STEER_STATUS: 6 EPS + SG_ STEER_TORQUE_SENSOR : 7|12@0- (-1,0) [-2047.5|2047.5] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_CONTROL_ACTIVE : 36|1@0+ (1,0) [0|1] "" EON + SG_ STEER_STATUS : 35|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_crv_touring_2016_can.dbc starts here"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_insight_ex_2019_can_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_insight_ex_2019_can_generated.dbc new file mode 100644 index 000000000..2ac232b39 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_insight_ex_2019_can_generated.dbc @@ -0,0 +1,580 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _bosch_2018.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 EON + SG_ STEER_TORQUE : 7|16@0- (1,0) [-4096|4096] "" EPS + SG_ DRIVER_OVERRIDE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ CONTROL_STATE : 26|3@0+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ STEER_DOWN_TO_ZERO : 38|1@0+ (1,0) [0|1] "" EPS + SG_ HAPTIC_WARNING : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 229 BOSCH_SUPPLEMENTAL_1: 8 XXX + SG_ SET_ME_X04 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X80 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X10 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 232 BRAKE_HOLD: 7 XXX + SG_ XMISSION_SPEED : 7|14@0- (1,0) [1|0] "" XXX + SG_ COMPUTER_BRAKE : 39|16@0+ (1,0) [0|0] "" XXX + SG_ COMPUTER_BRAKE_REQUEST : 29|1@0+ (1,0) [0|0] "" XXX + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + +BO_ 446 BRAKE_MODULE: 3 VSA + SG_ BRAKE_PRESSED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_FAULT : 22|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" XXX + +BO_ 506 LEGACY_BRAKE_COMMAND: 8 ADAS + SG_ CHIME : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 545 ECON_STATUS: 6 SCM + SG_ ECON_ON : 23|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_MODE : 37|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" BDY + +BO_ 576 LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 577 LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 579 RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 580 RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 582 ADJACENT_LEFT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 583 ADJACENT_LEFT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 585 ADJACENT_RIGHT_LANE_LINE_1: 8 CAM + SG_ LINE_DISTANCE_VISIBLE : 39|9@0+ (1,0) [0|1] "" XXX + SG_ LINE_PROBABILITY : 46|6@0+ (0.015625,0) [0|1] "" XXX + SG_ LINE_OFFSET : 23|12@0+ (0.004,-8.192) [0|1] "Meters" XXX + SG_ LINE_ANGLE : 7|12@0+ (0.0005,-1.024) [0|1] "" XXX + SG_ FRAME_INDEX : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 586 ADJACENT_RIGHT_LANE_LINE_2: 8 CAM + SG_ LINE_FAR_EDGE_POSITION : 55|8@0+ (1,-128) [0|1] "" XXX + SG_ LINE_SOLID : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_DASHED : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_CURVATURE : 23|12@0+ (0.00001,-0.02048) [0|1] "" XXX + SG_ LINE_PARAMETER : 39|12@0+ (1,0) [0|1] "" XXX + SG_ FRAME_INDEX : 7|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|1] "" XXX + +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ AMBIENT_LIGHT_MAYBE : 23|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_STATES : 22|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 927 RADAR_HUD: 8 RADAR + SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY + SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY + SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY + SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ HUD_LEAD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_TO_64 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH3 : 47|7@0+ (1,0) [0|127] "" XXX + SG_ ZEROS_BOH4 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 13274 LKAS_HUD_A: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + +BO_ 13275 LKAS_HUD_B: 8 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_LINES : 36|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + +CM_ SG_ 228 DRIVER_OVERRIDE "Appears to acknowledge STEER_STATUS.NO_TORQUE_ALERT_1"; +CM_ SG_ 662 AMBIENT_LIGHT_MAYBE "Slow-moving sensor value (possibly the ambient light input for adaptive high beam), undecoded. The camera consumes SCM_BUTTONS content beyond the buttons, so frames sent in its place must echo this byte"; +CM_ SG_ 576 LINE_DISTANCE_VISIBLE "Length of line visible, undecoded"; +CM_ SG_ 577 LINE_FAR_EDGE_POSITION "Appears to be a measure of line thickness, indicates location of the portion of the line furthest from the car, undecoded"; +CM_ SG_ 577 LINE_PARAMETER "Unclear if this is low quality line curvature rate or if this is something else, but it is correlated with line curvature, undecoded"; +CM_ SG_ 577 LINE_DASHED "1 = line is dashed"; +CM_ SG_ 577 LINE_SOLID "1 = line is solid"; + +VAL_ 228 CONTROL_STATE 0 "init" 1 "standby" 2 "lka_active" 3 "driver_override" 5 "rdm_active"; +VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 0 "normal"; +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_STATES 3 "pressed" 0 "released" ; +VAL_ 862 SPEED_LIMIT_SIGN 97 "SPEED_LIMIT_5" 98 "SPEED_LIMIT_10" 99 "SPEED_LIMIT_15" 100 "SPEED_LIMIT_20" 101 "SPEED_LIMIT_25" 102 "SPEED_LIMIT_30" 103 "SPEED_LIMIT_35" 104 "SPEED_LIMIT_40" 105 "SPEED_LIMIT_45" 106 "SPEED_LIMIT_50" 107 "SPEED_LIMIT_55" 108 "SPEED_LIMIT_60" 109 "SPEED_LIMIT_65" 110 "SPEED_LIMIT_70" 111 "SPEED_LIMIT_75" 112 "SPEED_LIMIT_80" 113 "SPEED_LIMIT_85" 125 "SPEED_LIMIT_NA" 0 "STOP_SIGN"; +VAL_ 862 ROAD_SIGN 0 "NO_SIGN" 89 "STOP_SIGN"; + + +CM_ "Imported file _bosch_radar_acc.dbc starts here"; +BO_ 479 ACC_CONTROL: 8 EON + SG_ SET_TO_0 : 20|5@0+ (1,0) [0|1] "" XXX + SG_ CONTROL_ON : 23|3@0+ (1,0) [0|5] "" XXX + SG_ GAS_COMMAND : 7|16@0- (1,0) [0|0] "" XXX + SG_ ACCEL_COMMAND : 31|11@0- (0.01,0) [0|0] "m/s2" XXX + SG_ BRAKE_LIGHTS : 62|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_REQUEST : 34|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL : 35|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL_RELEASE : 36|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_STATUS : 33|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_BRAKING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_PREPARE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 495 ACC_CONTROL_ON: 8 XXX + SG_ SET_TO_75 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_30 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH2 : 47|16@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_FF : 15|8@0+ (1,0) [0|255] "" XXX + SG_ SET_TO_3 : 6|7@0+ (1,0) [0|4095] "" XXX + SG_ CONTROL_ON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +CM_ SG_ 479 CONTROL_ON "Set to 5 when car is being controlled"; +CM_ SG_ 479 AEB_STATUS "set for the duration of AEB event"; +CM_ SG_ 479 AEB_BRAKING "set when braking is commanded during AEB event"; +CM_ SG_ 479 AEB_PREPARE "set 1s before AEB"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _steering_sensors_a.dbc starts here"; +BO_ 330 STEERING_SENSORS: 8 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ STEER_SENSOR_STATUS_1 : 34|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_2 : 33|1@0+ (1,0) [0|1] "" EON + SG_ STEER_SENSOR_STATUS_3 : 32|1@0+ (1,0) [0|1] "" EON + SG_ STEER_WHEEL_ANGLE : 47|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_insight_ex_2019_can.dbc starts here"; + +BO_ 432 STANDSTILL: 7 VSA + SG_ BRAKE_ERROR_1 : 13|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 12|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + +CM_ BO_ 432 "Slightly conflicting definition with common Bosch standstill message, this one could be broken"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_odyssey_exl_2018_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_odyssey_exl_2018_generated.dbc new file mode 100644 index 000000000..0d7e297b8 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_odyssey_exl_2018_generated.dbc @@ -0,0 +1,439 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _nidec_common.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _nidec_scm_group_b.dbc starts here"; +BO_ 662 SCM_BUTTONS: 4 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ CRUISE_SETTING : 3|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 806 SCM_FEEDBACK: 8 SCM + SG_ DRIVERS_DOOR_OPEN : 17|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE_LIGHT : 18|1@0+ (1,0) [0|1] "" EON + SG_ CMBS_BUTTON : 22|2@0+ (1,0) [0|3] "" EON + SG_ LEFT_BLINKER : 26|1@0+ (1,0) [0|1] "" EON + SG_ RIGHT_BLINKER : 27|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 28|1@0+ (1,0) [0|1] "" EON + SG_ PARKING_BRAKE_ON : 29|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; +VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ; + + +CM_ "Imported file _steering_sensors_b.dbc starts here"; +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _steering_control_a.dbc starts here"; +BO_ 228 STEERING_CONTROL: 5 ADAS + SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ SET_ME_X00_2 : 31|8@0+ (1,0) [0|0] "" EPS + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" EPS + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" EPS + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-31000|31000] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 39|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; + + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_odyssey_exl_2018.dbc starts here"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_odyssey_twn_2018_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_odyssey_twn_2018_generated.dbc new file mode 100644 index 000000000..0efd0a4e9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_odyssey_twn_2018_generated.dbc @@ -0,0 +1,439 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.253984064,-83.3) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.126992032,-83.3) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _honda_common.dbc starts here"; +BO_ 145 KINEMATICS_ALT: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 148 KINEMATICS: 8 XXX + SG_ LAT_ACCEL : 7|10@0+ (0.02,-512) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 24|9@0- (-0.02,0) [-20|20] "m/s2" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 304 GAS_PEDAL_2: 8 PCM + SG_ ENGINE_TORQUE_ESTIMATE : 7|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ ENGINE_TORQUE_REQUEST : 23|16@0- (1,0) [-1000|1000] "Nm" EON + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 316 GAS_PEDAL: 8 PCM + SG_ CAR_GAS : 39|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 344 ENGINE_DATA: 8 PCM + SG_ XMISSION_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ XMISSION_SPEED2 : 39|16@0+ (0.01,0) [0|250] "kph" EON + SG_ ODOMETER : 55|8@0+ (10,0) [0|2550] "m" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 380 POWERTRAIN_DATA: 8 PCM + SG_ PEDAL_GAS : 7|8@0+ (1,0) [0|255] "" EON + SG_ ENGINE_RPM : 23|16@0+ (1,0) [0|15000] "rpm" EON + SG_ GAS_PRESSED : 39|1@0+ (1,0) [0|1] "" EON + SG_ ACC_STATUS : 38|1@0+ (1,0) [0|1] "" EON + SG_ BOH_17C : 37|5@0+ (1,0) [0|1] "" EON + SG_ BRAKE_SWITCH : 32|1@0+ (1,0) [0|1] "" EON + SG_ BOH2_17C : 47|10@0+ (1,0) [0|1] "" EON + SG_ BRAKE_PRESSED : 53|1@0+ (1,0) [0|1] "" EON + SG_ BOH3_17C : 52|5@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 388 HYBRID_BRAKE_ERROR: 8 XXX + SG_ BRAKE_ERROR_1 : 32|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 34|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 420 VSA_STATUS: 8 VSA + SG_ USER_BRAKE : 7|16@0+ (0.015625,-1.609375) [0|1000] "" EON + SG_ COMPUTER_BRAKING : 23|1@0+ (1,0) [0|1] "" EON + SG_ ESP_DISABLED : 28|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_RELATED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 46|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_HOLD_ENABLED : 45|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 427 STEER_MOTOR_TORQUE: 3 EPS + SG_ CONFIG_VALID : 7|1@0+ (1,0) [0|1] "" EON + SG_ MOTOR_TORQUE : 1|10@0+ (1,0) [0|256] "" EON + SG_ OUTPUT_DISABLED : 22|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 21|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 19|4@0+ (1,0) [0|15] "" EON + +BO_ 450 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE_AND_PULL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_STATE : 29|2@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 464 WHEEL_SPEEDS: 8 VSA + SG_ WHEEL_SPEED_FL : 7|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_FR : 8|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RL : 25|15@0+ (0.01,0) [0|250] "kph" EON + SG_ WHEEL_SPEED_RR : 42|15@0+ (0.01,0) [0|250] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 490 VEHICLE_DYNAMICS: 8 VSA + SG_ LAT_ACCEL : 7|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ LONG_ACCEL : 23|16@0- (0.0015,0) [-20|20] "m/s2" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +BO_ 547 BRAKE_HOLD_HYBRID_ALT: 6 XXX + SG_ BRAKE_HOLD_FAULT_BIT : 33|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 37|2@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" XXX + +BO_ 597 ROUGH_WHEEL_SPEED: 8 VSA + SG_ WHEEL_SPEED_FL : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_FR : 15|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RL : 23|8@0+ (1,0) [0|255] "kph" EON + SG_ WHEEL_SPEED_RR : 31|8@0+ (1,0) [0|255] "kph" EON + SG_ SET_TO_X55 : 39|8@0+ (1,0) [0|255] "" EON + SG_ SET_TO_X55_2 : 47|8@0+ (1,0) [0|255] "" EON + SG_ LONG_COUNTER : 55|8@0+ (1,0) [0|255] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 773 SEATBELT_STATUS: 7 BDY + SG_ SEATBELT_DRIVER_LAMP : 7|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_UNLATCHED : 10|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_PASS_LATCHED : 11|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_UNLATCHED : 12|1@0+ (1,0) [0|1] "" EON + SG_ SEATBELT_DRIVER_LATCHED : 13|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_OFF : 14|1@0+ (1,0) [0|1] "" EON + SG_ PASS_AIRBAG_ON : 15|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 777 CAR_SPEED: 8 PCM + SG_ ROUGH_CAR_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + SG_ CAR_SPEED : 7|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_3 : 39|16@0+ (0.01,0) [0|65535] "kph" XXX + SG_ ROUGH_CAR_SPEED_2 : 31|8@0+ (1,0) [0|255] "mph" XXX + SG_ LOCK_STATUS : 55|2@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ IMPERIAL_UNIT : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_HUD: 8 ADAS + SG_ PCM_SPEED : 7|16@0+ (0.01,0) [0|250] "kph" BDY + SG_ PCM_GAS : 23|8@0+ (1,0) [0|127] "" BDY + SG_ CRUISE_SPEED : 31|8@0+ (1,0) [0|255] "kph" BDY + SG_ DTC_MODE : 39|1@0+ (1,0) [0|1] "" BDY + SG_ BRAKE_SYSTEM_ICON : 38|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_PROBLEM : 37|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF : 35|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_OFF_2 : 36|1@0+ (1,0) [0|1] "" BDY + SG_ FCM_PROBLEM : 34|1@0+ (1,0) [0|1] "" BDY + SG_ RADAR_OBSTRUCTED : 33|1@0+ (1,0) [0|1] "" BDY + SG_ ENABLE_MINI_CAR : 32|1@0+ (1,0) [0|1] "" BDY + SG_ HUD_DISTANCE : 47|2@0+ (1,0) [0|3] "" BDY + SG_ HUD_LEAD : 45|2@0+ (1,0) [0|3] "" BDY + SG_ BOH_3 : 43|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_4 : 42|1@0+ (1,0) [0|3] "" BDY + SG_ BOH_5 : 41|1@0+ (1,0) [0|3] "" BDY + SG_ CRUISE_CONTROL_LABEL : 40|1@0+ (1,0) [0|3] "" BDY + SG_ SET_ME_X01_2 : 55|1@0+ (1,0) [0|1] "" BDY + SG_ IMPERIAL_UNIT : 54|1@0+ (1,0) [0|1] "" BDY + SG_ ACC_ON : 52|1@0+ (1,0) [0|1] "" BDY + SG_ CHIME : 51|3@0+ (1,0) [0|1] "" BDY + SG_ SET_ME_X01 : 48|1@0+ (1,0) [0|1] "" BDY + SG_ ICONS : 63|2@0+ (1,0) [0|1] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" BDY + +BO_ 804 CRUISE: 8 PCM + SG_ HUD_SPEED_KPH : 7|8@0+ (1,0) [0|255] "kph" EON + SG_ HUD_SPEED_MPH : 15|8@0+ (1,0) [0|255] "mph" EON + SG_ TRIP_FUEL_CONSUMED : 23|16@0+ (1,0) [0|255] "" EON + SG_ CRUISE_SPEED_PCM : 39|8@0+ (1,0) [0|255] "" EON + SG_ BOH2 : 47|8@0- (1,0) [0|255] "" EON + SG_ BOH3 : 55|8@0+ (1,0) [0|255] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 862 CAMERA_MESSAGES: 8 CAM + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ SPEED_LIMIT_SIGN : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ROAD_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + SG_ ZEROS_BOH_2 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAMS_ON : 52|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGHBEAMS_ACTIVE : 53|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 884 STALK_STATUS: 8 XXX + SG_ DASHBOARD_ALERT : 39|8@0+ (1,0) [0|255] "" EON + SG_ AUTO_HEADLIGHTS : 46|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_HOLD : 47|1@0+ (1,0) [0|1] "" EON + SG_ HIGH_BEAM_FLASH : 45|1@0+ (1,0) [0|1] "" EON + SG_ HEADLIGHTS_ON : 54|1@0+ (1,0) [0|1] "" EON + SG_ WIPER_SWITCH : 53|2@0+ (1,0) [0|3] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 891 STALK_STATUS_2: 8 XXX + SG_ WIPERS : 17|2@0+ (1,0) [0|3] "" EON + SG_ LOW_BEAMS : 35|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAMS : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PARK_LIGHTS : 36|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1029 DOORS_STATUS: 8 BDY + SG_ DOOR_OPEN_FL : 37|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_FR : 38|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RL : 39|1@0+ (1,0) [0|1] "" EON + SG_ DOOR_OPEN_RR : 40|1@0+ (1,0) [0|1] "" EON + SG_ TRUNK_OPEN : 41|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 1302 ODOMETER: 8 XXX + SG_ ODOMETER : 7|24@0+ (1,0) [0|16777215] "km" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + +CM_ SG_ 304 "Seems to be platform-agnostic"; +CM_ SG_ 316 "Should exist on Nidec"; +CM_ SG_ 420 BRAKE_HOLD_RELATED "On when Brake Hold engaged"; +CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping"; +CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light"; +CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light"; +CM_ SG_ 780 CRUISE_SPEED "255 = no speed"; +CM_ SG_ 780 PCM_SPEED "Used by Nidec"; +CM_ SG_ 780 PCM_GAS "Used by Nidec"; +CM_ SG_ 804 CRUISE_SPEED_PCM "255 = no speed"; + +VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ; +VAL_ 780 CRUISE_SPEED 255 "no_speed" 252 "stopped"; +VAL_ 780 HUD_LEAD 3 "acc_off" 2 "solid_car" 1 "dashed_car" 0 "no_car"; +VAL_ 884 DASHBOARD_ALERT 0 "none" 51 "acc_problem" 55 "cmbs_problem" 75 "key_not_detected" 79 "fasten_seatbelt" 111 "lkas_problem" 131 "brake_system_problem" 132 "brake_hold_problem" 139 "tbd" 161 "door_open"; +VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off"; + + +CM_ "Imported file _nidec_common.dbc starts here"; +BO_ 432 STANDSTILL: 7 VSA + SG_ CONTROLLED_STANDSTILL : 0|1@0+ (1,0) [0|1] "" EON + SG_ WHEELS_MOVING : 12|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_1 : 11|1@0+ (1,0) [0|1] "" EON + SG_ BRAKE_ERROR_2 : 9|1@0+ (1,0) [0|1] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|3] "" EON + +BO_ 487 BRAKE_PRESSURE: 4 VSA + SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON + SG_ CHECKSUM : 27|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 29|2@0+ (1,0) [0|3] "" EON + +BO_ 506 BRAKE_COMMAND: 8 ADAS + SG_ COMPUTER_BRAKE : 7|10@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST : 8|1@0+ (1,0) [0|1] "" EBCM + SG_ BRAKE_PUMP_REQUEST_HYBRID : 11|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00 : 23|3@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_OVERRIDE : 20|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_X00_2 : 19|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_FAULT_CMD : 18|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_CANCEL_CMD : 17|1@0+ (1,0) [0|1] "" EBCM + SG_ COMPUTER_BRAKE_REQUEST : 16|1@0+ (1,0) [0|1] "" EBCM + SG_ SET_ME_1 : 31|1@0+ (1,0) [0|1] "" EBCM + SG_ AEB_REQ_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_REQ_2 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_LIGHTS : 39|1@0+ (1,0) [0|1] "" EBCM + SG_ CRUISE_STATES : 38|7@0+ (1,0) [0|1] "" EBCM + SG_ CHIME : 47|3@0+ (1,0) [0|7] "" EBCM + SG_ SET_ME_X00_3 : 44|1@0+ (1,0) [0|1] "" EBCM + SG_ FCW : 43|2@0+ (1,0) [0|3] "" EBCM + SG_ AEB_STATUS : 41|2@0+ (1,0) [0|3] "" XXX + SG_ COMPUTER_BRAKE_HYBRID : 55|10@0+ (1,0) [0|0] "" EBCM + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EBCM + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EBCM + +BO_ 892 CRUISE_PARAMS: 8 PCM + SG_ CRUISE_SPEED_OFFSET : 31|8@0- (0.1,0) [-128|127] "kph" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 927 RADAR_HUD: 8 ADAS + SG_ ZEROS_BOH : 7|16@0+ (1,0) [0|127] "" BDY + SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|15] "" BDY + SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|15] "" BDY + SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|15] "" BDY + SG_ ZEROS_BOH2 : 31|8@0+ (1,0) [0|127] "" BDY + SG_ LEAD_SPEED : 39|9@0+ (1,0) [0|127] "" BDY + SG_ LEAD_DISTANCE : 46|8@0+ (1,0) [0|31] "" BDY + SG_ ZEROS_BOH3 : 54|7@0+ (1,0) [0|127] "" BDY + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" BDY + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" BDY + +CM_ SG_ 506 AEB_REQ_1 "set for duration of suspected AEB event"; +CM_ SG_ 506 COMPUTER_BRAKE_HYBRID "Used by Hybrid Nidec"; +CM_ SG_ 506 BRAKE_PUMP_REQUEST_HYBRID "Used by Hybrid Nidec"; + +VAL_ 506 FCW 3 "fcw" 2 "fcw" 1 "fcw" 0 "no_fcw"; +VAL_ 506 CHIME 4 "double_chime" 3 "single_chime" 2 "continuous_chime" 1 "repeating_chime" 0 "no_chime"; +VAL_ 506 AEB_STATUS 3 "aeb_prepare" 2 "aeb_ready" 1 "aeb_braking" 0 "no_aeb"; +VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ; +VAL_ 927 LEAD_DISTANCE 254 "no lead"; +VAL_ 927 LEAD_SPEED 510 "no lead"; + + +CM_ "Imported file _lkas_hud_5byte.dbc starts here"; +BO_ 829 LKAS_HUD: 5 ADAS + SG_ LKAS_READY : 0|1@0+ (1,0) [0|127] "" BDY + SG_ LKAS_STATE_CHANGE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ CAM_TEMP_HIGH : 7|1@0+ (1,0) [0|255] "" BDY + SG_ DASHED_LANES : 14|1@0+ (1,0) [0|1] "" BDY + SG_ DTC : 13|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_PROBLEM : 12|1@0+ (1,0) [0|1] "" BDY + SG_ LKAS_OFF : 11|1@0+ (1,0) [0|1] "" BDY + SG_ SOLID_LANES : 10|1@0+ (1,0) [0|1] "" BDY + SG_ CLEAN_WINDSHIELD : 26|1@0+ (1,0) [0|1] "" BDY + SG_ STEERING_REQUIRED : 8|1@0+ (1,0) [0|1] "" BDY + SG_ BEEP : 17|2@0+ (1,0) [0|1] "" BDY + SG_ RDM_PROBLEM : 21|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD : 9|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_HUD_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_OFF : 27|1@0+ (1,0) [0|1] "" BDY + SG_ RDM_ON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RDM_ON_2 : 28|1@0+ (1,0) [0|1] "" BDY + SG_ LANE_ASSIST_BEEP_OFF : 30|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 35|4@0+ (1,0) [0|15] "" BDY + SG_ COUNTER : 37|2@0+ (1,0) [0|3] "" BDY + + +CM_ SG_ 829 BEEP "beeps are pleasant, chimes are for warnings etc..."; +CM_ SG_ 829 CAM_TEMP_HIGH "Some Driver Assist Systems Cannot Operate: Camera Temperature Too High"; +CM_ SG_ 829 CAMERA_OVERHEAT "Lane Keeping Assist Cannot Operate: Camera Too Hot"; + +VAL_ 829 BEEP 5 "solid_beep" 4 "double_beep" 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep"; + + +CM_ "Imported file _nidec_scm_group_a.dbc starts here"; +BO_ 660 SCM_FEEDBACK: 8 SCM + SG_ RIGHT_BLINKER : 6|1@0+ (1,0) [0|1] "" EON + SG_ LEFT_BLINKER : 5|1@0+ (1,0) [0|1] "" EON + SG_ WIPERS_SPEED : 4|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + +BO_ 422 SCM_BUTTONS: 8 SCM + SG_ CRUISE_BUTTONS : 7|3@0+ (1,0) [0|7] "" EON + SG_ LIGHTS_SETTING : 1|2@0+ (1,0) [0|3] "" EON + SG_ PARKING_BRAKE_ON : 2|1@0+ (1,0) [0|1] "" EON + SG_ MAIN_ON : 47|1@0+ (1,0) [0|1] "" EON + SG_ CRUISE_SETTING : 43|2@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ DRIVERS_DOOR_OPEN : 63|1@0+ (1,0) [0|1] "" EON + +VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ; +VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ; +VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ; + + +CM_ "Imported file _steering_sensors_c.dbc starts here"; +CM_ "steer_angle_rate is negative vs _steering_sensors_b.dbc"; + +BO_ 342 STEERING_SENSORS: 6 EPS + SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (1,0) [-3000|3000] "deg/s" EON + SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON + + +CM_ "Imported file _steering_control_c.dbc starts here"; +BO_ 404 STEERING_CONTROL: 4 EON + SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS + SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS + SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS + SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS + SG_ STEER_TORQUE : 7|16@0- (-1,0) [-32767|32767] "" EPS + +BO_ 399 STEER_STATUS: 7 EPS + SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-2985|2985] "tbd" EON + SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON + SG_ STEER_STATUS : 43|4@0+ (1,0) [0|15] "" EON + SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON + SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON + SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON + +VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ; + +CM_ "Imported file _gearbox_common.dbc starts here"; +BO_ 401 GEARBOX_CVT: 8 PCM + SG_ SELECTED_P : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_R : 1|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_N : 2|1@0+ (1,0) [0|1] "" XXX + SG_ SELECTED_D : 3|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CVT_UNKNOWN_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR_SHIFTER : 44|5@0+ (1,0) [0|31] "" XXX + SG_ SHIFTER_POSITION_VALID : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_FORWARD_GEAR : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CVT_UNKNOWN_3 : 53|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + +BO_ 419 GEARBOX_AUTO: 8 PCM + SG_ TRANS_SHIFT_ACTIVITY : 7|8@0+ (1,0) [0|256] "" EON + SG_ TRANS_TARGET_GEAR : 11|4@0+ (1,0) [0|15] "" XXX + SG_ REGEN_STAGE_SELECTION : 14|3@0+ (1,0) [0|7] "Stage" XXX + SG_ REGEN_MEMORY : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FORWARD_DRIVING_MODE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_UNKNOWN_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ AUTO_UNKNOWN_2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ REGEN_UNKNOWN : 50|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON + SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON + SG_ AUTO_UNKNOWN_3 : 62|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 CVT_UNKNOWN_1 "Probably measured/actual CVT ratio"; +CM_ SG_ 401 CVT_UNKNOWN_2 "Probably target/commanded CVT ratio"; +CM_ SG_ 419 TRANS_SHIFT_ACTIVITY "Tracks but trails TRANS_TARGET_GEAR with extra activity, probable solenoid activations or TC lockup"; +CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshold"; +CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster"; +CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero"; + +VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S"; +VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse"; +VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6"; +VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent"; + +CM_ "honda_odyssey_twn_2018.dbc starts here"; diff --git a/artifacts/package_runtime/iqdbc/dbc/honda_radar_scan_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/honda_radar_scan_generated.dbc new file mode 100644 index 000000000..b921631fa --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/honda_radar_scan_generated.dbc @@ -0,0 +1,439 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "honda_radar_scan.dbc starts here"; +VERSION "honda_radar_scan -- Honda Bosch radar object scan: 16 object slots, each a POS/SHAPE/LIFE/IDENT frame quartet plus a synchronized MOTION companion. Raw counts only; physical conversion lives in iqdbc/car/honda/radar_scan.py" + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: SCANNER XXX + + +BO_ 640 RADAR_SCAN_00_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 641 RADAR_SCAN_00_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 642 RADAR_SCAN_00_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 643 RADAR_SCAN_00_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 712 RADAR_SCAN_00_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 644 RADAR_SCAN_01_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 645 RADAR_SCAN_01_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 646 RADAR_SCAN_01_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 647 RADAR_SCAN_01_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 713 RADAR_SCAN_01_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 648 RADAR_SCAN_02_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 649 RADAR_SCAN_02_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 650 RADAR_SCAN_02_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 651 RADAR_SCAN_02_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 714 RADAR_SCAN_02_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 652 RADAR_SCAN_03_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 653 RADAR_SCAN_03_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 654 RADAR_SCAN_03_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 655 RADAR_SCAN_03_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 715 RADAR_SCAN_03_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 720 RADAR_SCAN_04_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 721 RADAR_SCAN_04_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 722 RADAR_SCAN_04_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 723 RADAR_SCAN_04_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 716 RADAR_SCAN_04_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 724 RADAR_SCAN_05_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 725 RADAR_SCAN_05_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 726 RADAR_SCAN_05_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 727 RADAR_SCAN_05_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 717 RADAR_SCAN_05_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 728 RADAR_SCAN_06_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 729 RADAR_SCAN_06_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 730 RADAR_SCAN_06_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 731 RADAR_SCAN_06_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 718 RADAR_SCAN_06_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 732 RADAR_SCAN_07_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 733 RADAR_SCAN_07_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 734 RADAR_SCAN_07_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 735 RADAR_SCAN_07_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 719 RADAR_SCAN_07_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 736 RADAR_SCAN_08_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 737 RADAR_SCAN_08_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 738 RADAR_SCAN_08_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 739 RADAR_SCAN_08_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 656 RADAR_SCAN_08_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 740 RADAR_SCAN_09_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 741 RADAR_SCAN_09_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 742 RADAR_SCAN_09_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 743 RADAR_SCAN_09_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 657 RADAR_SCAN_09_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 744 RADAR_SCAN_10_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 745 RADAR_SCAN_10_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 746 RADAR_SCAN_10_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 747 RADAR_SCAN_10_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 658 RADAR_SCAN_10_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 748 RADAR_SCAN_11_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 749 RADAR_SCAN_11_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 750 RADAR_SCAN_11_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 751 RADAR_SCAN_11_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 659 RADAR_SCAN_11_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 752 RADAR_SCAN_12_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 753 RADAR_SCAN_12_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 754 RADAR_SCAN_12_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 755 RADAR_SCAN_12_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 660 RADAR_SCAN_12_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 756 RADAR_SCAN_13_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 757 RADAR_SCAN_13_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 758 RADAR_SCAN_13_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 759 RADAR_SCAN_13_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 661 RADAR_SCAN_13_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 760 RADAR_SCAN_14_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 761 RADAR_SCAN_14_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 762 RADAR_SCAN_14_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 763 RADAR_SCAN_14_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 662 RADAR_SCAN_14_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX + +BO_ 764 RADAR_SCAN_15_POS: 8 SCANNER + SG_ SCAN_STATE : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CYCLE : 27|4@0+ (1,0) [0|15] "" XXX + SG_ DIST_RAW : 23|12@0+ (1,0) [0|4095] "" XXX + SG_ BEARING_RAW : 39|11@0+ (1,0) [0|2047] "" XXX + SG_ DIST_SIGMA_RAW : 7|7@0+ (1,0) [0|127] "" XXX + +BO_ 765 RADAR_SCAN_15_SHAPE: 8 SCANNER + SG_ CYCLE : 28|4@0+ (1,0) [0|15] "" XXX + SG_ PRESENCE_RAW : 46|7@0+ (1,0) [0|127] "" XXX + +BO_ 766 RADAR_SCAN_15_LIFE: 8 SCANNER + SG_ CYCLE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ AGE_RAW : 7|12@0+ (1,0) [0|4095] "" XXX + +BO_ 767 RADAR_SCAN_15_IDENT: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ OBJECT_HANDLE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 663 RADAR_SCAN_15_MOTION: 8 SCANNER + SG_ CYCLE : 12|4@0+ (1,0) [0|15] "" XXX + SG_ CLOSING_SPEED_RAW : 7|11@0+ (1,0) [0|2047] "" XXX + SG_ CLOSING_SPEED_SIGMA_RAW : 23|10@0+ (1,0) [0|1023] "" XXX + SG_ DIST_RATIO_RAW : 55|10@0+ (1,0) [0|1023] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/hongqi_hs5.dbc b/artifacts/package_runtime/iqdbc/dbc/hongqi_hs5.dbc new file mode 100644 index 000000000..76b41d873 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hongqi_hs5.dbc @@ -0,0 +1,160 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 146 ECM_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ THROTTLE_1 : 8|12@1+ (1,0) [0|255] "" XXX + SG_ THROTTLE_2 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ THROTTLE_3 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ DRIVER_THROTTLE : 40|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 192 ABS_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX + SG_ FRONT_LEFT : 8|16@1+ (0.01,0) [0|65535] "km/h" XXX + SG_ FRONT_RIGHT : 24|16@1+ (0.01,0) [0|65535] "km/h" XXX + SG_ VEHICLE_SPEED : 40|16@1+ (0.01,0) [0|65535] "km/h" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 194 ABS_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX + SG_ REAR_LEFT : 8|16@1+ (0.01,0) [0|65535] "km/h" XXX + SG_ REAR_RIGHT : 24|16@1+ (0.01,0) [0|65535] "km/h" XXX + SG_ BRAKE_PRESSURE : 40|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 208 EPS_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX + SG_ STEER_ANGLE : 8|15@1+ (0.0225,0) [0|65535] "" XXX + SG_ STEER_ANGLE_DIRECTION : 23|1@1+ (1,0) [0|1] "direction" XXX + SG_ STEER_RATE : 24|15@1+ (0.0225,0) [0|65535] "" XXX + SG_ STEER_RATE_DIRECTION : 39|1@1+ (1,0) [0|1] "direction" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 336 EPS_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ EPS_TORQUE : 8|10@1- (1,0) [0|255] "" XXX + SG_ EPS_TORQUE_DIRECTION : 18|1@1+ (1,0) [0|1] "direction" XXX + SG_ UNKNOWN : 22|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_STATUS : 24|4@1+ (1,0) [0|15] "" XXX + SG_ DRIVER_INPUT_TORQUE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ LKAS_TORQUE : 40|10@1+ (1,0) [0|1023] "" XXX + SG_ LKAS_TORQUE_DIRECTION : 50|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 272 ACC: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_1 : 8|12@1+ (1,0) [0|4095] "" XXX + SG_ UNKNOWN_2 : 20|4@1+ (1,0) [0|15] "" XXX + SG_ ACCELERATION : 24|12@1+ (1,-300) [0|255] "" XXX + SG_ STATUS : 36|4@1+ (1,0) [0|31] "x" XXX + SG_ UNKNOWN_3 : 46|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 274 LKAS: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ LKAS_TORQUE : 8|10@1+ (1,0) [0|2047] "x" XXX + SG_ LKAS_TORQUE_DIRECTION : 18|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_TORQUE_ACTIVE : 19|1@1+ (1,0) [0|1] "" XXX + SG_ UNKNOWN_ACTIVE_STATE : 26|1@1+ (1,0) [0|1] "" XXX + SG_ MAYBE_HUD_LANE_STATES : 28|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_ACTIVE : 32|1@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 148 MAYBE_ABS: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ UNKNOWN_1 : 8|16@1+ (1,0) [0|15] "x" XXX + SG_ UNKNOWN_2 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED : 35|1@1+ (1,0) [0|1] "x" XXX + SG_ UNKNOWN_3 : 46|2@1+ (1,0) [0|3] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 304 ABS_3: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 15|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 23|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 31|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 39|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 47|8@1+ (1,0) [0|255] "" XXX + SG_ DRIVER_BRAKE_PRESSURE : 48|12@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 144 MAYBE_ENGINE: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 8|12@1+ (1,0) [0|255] "" XXX + SG_ MAYBE_RPM : 20|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 46|14@1+ (1,0) [0|4095] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 422 MAYBE_ACC_BUTTONS: 8 XXX + SG_ NEW_SIGNAL_1 : 18|1@0+ (1,0) [0|1] "" XXX + +BO_ 560 TURN_SIGNALS: 8 XXX + SG_ RIGHT_TURN_SIGNALING : 45|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_TURN_SIGNALING : 44|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_TURN_BULB_3 : 21|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_TURN_BULB_3 : 20|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_TURN_BULB_2 : 19|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_TURN_BULB_2 : 18|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_TURN_BULB_1 : 16|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_TURN_BULB_1 : 17|1@1+ (1,0) [0|1] "" XXX + +BO_ 586 DOOR_FL: 8 XXX + SG_ OPEN : 2|1@1+ (1,0) [0|1] "" XXX + +BO_ 588 DOOR_FR: 8 XXX + SG_ OPEN : 2|1@1+ (1,0) [0|1] "" XXX + +BO_ 590 DOOR_RL: 8 XXX + SG_ OPEN : 2|1@1+ (1,0) [0|1] "" XXX + +BO_ 591 DOOR_RR: 8 XXX + SG_ OPEN : 2|1@1+ (1,0) [0|1] "" XXX + + + + +CM_ SG_ 274 UNKNOWN_ACTIVE_STATE "Triggers changes from 8 to 9 in EPS_2.LKAS_STATUS"; +CM_ SG_ 560 RIGHT_TURN_SIGNALING "Includes 2.5 second convenience lane change interval"; +CM_ SG_ 560 LEFT_TURN_SIGNALING "Includes 2.5 second convenience lane change interval"; +VAL_ 336 LKAS_STATUS 1 "INITIALIZING" 5 "READY" 8 "ACTIVE_1" 9 "ACTIVE_2" 13 "FAULT" ; +VAL_ 586 OPEN 0 "CLOSED" 1 "OPEN" ; +VAL_ 588 OPEN 0 "CLOSED" 1 "OPEN" ; +VAL_ 590 OPEN 0 "CLOSED" 1 "OPEN" ; +VAL_ 591 OPEN 0 "CLOSED" 1 "OPEN" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_2015_ccan.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_2015_ccan.dbc new file mode 100644 index 000000000..fc1e17390 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_2015_ccan.dbc @@ -0,0 +1,1416 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: IAP ODS _4WD BCM HUD DATC MDPS AAF_Tester AEMC SMK _4WD EPB CUBIS MTS TMU EVP CGW TPMS LPI DI_BOX SPAS EMS LCA TCU IBOX FATC AFLS FPCM SCC AHLS AVM ABS SNV OPI PGS SAS AAF Dummy LDWS_LKAS LVR ESC PSB CLU ECS ACU REA + +BO_ 1532 ODS13: 5 ODS + SG_ CR_Ods_ID : 0|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_Chksum_H : 8|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy + SG_ CR_Ods_Chksum_L : 16|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy + SG_ CR_Ods_RomID_H : 24|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy + SG_ CR_Ods_RomID_L : 32|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy + +BO_ 1531 ODS12: 8 ODS + SG_ CR_Ods_SerNum0 : 0|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum3 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum4 : 32|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum5 : 40|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum6 : 48|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum7 : 56|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + +BO_ 1530 ODS11: 8 ODS + SG_ CF_Ods_PrcCmd : 1|1@1+ (1.0,0.0) [0.0|1.0] "" Dummy + SG_ CF_Ods_BtsFail : 3|1@1+ (1.0,0.0) [0.0|1.0] "" Dummy + SG_ CF_Ods_AcuRcvSN : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_EolCal : 5|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_PsFail : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_EcuFail : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_WgtStat : 8|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_OccStat : 16|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CR_Wcs_ErrStat : 32|8@1+ (1.0,0.0) [0.0|63.0] "" ACU + SG_ CR_Wcs_ClassStat : 40|8@1+ (1.0,0.0) [0.0|4.0] "" ACU,BCM + +BO_ 1017 ECS12: 4 ECS + SG_ Height_FL : 0|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS + SG_ Height_FR : 8|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS + SG_ Height_RL : 16|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS + SG_ Height_RR : 24|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS + +BO_ 1268 SPAS12: 8 SPAS + SG_ CF_Spas_HMI_Stat : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CF_Spas_Disp : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS + SG_ CF_Spas_FIL_Ind : 10|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FIR_Ind : 13|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FOL_Ind : 16|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FOR_Ind : 19|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_VolDown : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_RIL_Ind : 24|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_RIR_Ind : 27|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FLS_Alarm : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_ROL_Ind : 32|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_ROR_Ind : 35|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FCS_Alarm : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_FI_Ind : 40|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_RI_Ind : 43|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FRS_Alarm : 46|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_FR_Alarm : 48|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Spas_RR_Alarm : 50|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Spas_BEEP_Alarm : 52|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_Spas_StatAlarm : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Spas_RLS_Alarm : 57|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_RCS_Alarm : 59|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_RRS_Alarm : 61|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1265 CLU11: 4 CLU + SG_ CF_Clu_CruiseSwState : 0|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,LDWS_LKAS,SCC + SG_ CF_Clu_CruiseSwMain : 3|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,LDWS_LKAS,SCC + SG_ CF_Clu_SldMainSW : 4|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Clu_ParityBit1 : 5|1@1+ (1.0,0.0) [0.0|1.0] "pulse count" EMS + SG_ CF_Clu_VanzDecimal : 6|2@1+ (0.125,0.0) [0.0|0.375] "" EMS + SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0.0) [0.0|255.5] "km/h or MPH" BCM,CUBIS,EMS,IBOX,LDWS_LKAS,MDPS,SCC + SG_ CF_Clu_SPEED_UNIT : 17|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CUBIS,EMS,IBOX,LDWS_LKAS,MDPS,SCC + SG_ CF_Clu_DetentOut : 18|1@1+ (1.0,0.0) [0.0|1.0] "" AVM,BCM,LCA,PGS,SPAS + SG_ CF_Clu_RheostatLevel : 19|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,BCM,LCA,PGS,SPAS + SG_ CF_Clu_CluInfo : 24|1@1+ (1.0,0.0) [0.0|1.0] "" BCM + SG_ CF_Clu_AmpInfo : 25|1@1+ (1.0,0.0) [0.0|1.0] "" BCM + SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1.0,0.0) [0.0|15.0] "" AHLS,EMS,EPB,LDWS_LKAS,MDPS,SCC + +BO_ 1492 TMU_GW_PE_01: 8 CLU + SG_ TMU_IVRActivity : 0|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ TMU_PhoneActivity : 2|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + +BO_ 1491 HU_DATC_PE_00: 8 CLU + SG_ HU_VRActivity : 0|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ HU_PhoneActivity : 2|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ BlowerNoiseControl : 4|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + +BO_ 1490 HU_DATC_E_02: 8 CLU + SG_ HU_DATC_RearOnOffSet : 6|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ HU_DATC_ADSOnOffSet : 8|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + +BO_ 1479 EMS21: 8 EMS + SG_ SCR_LEVEL_WARN_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ SCR_LEVEL_WARN : 1|3@1+ (1.0,0.0) [0.0|4.0] "" CLU + SG_ SCR_SYS_ERROR_WARN : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ SCR_SYSTEM_WARN_LAMP : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ SCR_INDUCEMENT_EXIT_COND : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ SCR_UREA_LEVEL : 16|8@1+ (0.5,0.0) [0.0|100.0] "%" CLU + SG_ SCR_NO_REMAINING_RESTARTS : 24|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ SCR_REMAINING_DISTANCE : 32|16@1+ (1.0,0.0) [0.0|25000.0] "km" CLU + +BO_ 1472 GW_Warning_PE: 8 BCM + SG_ Audio_VolumeDown : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Flh_Alarm : 48|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Fcnt_Alarm : 50|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Frh_Alarm : 52|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Rlh_Alarm : 56|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,PGS + SG_ Pas_Spkr_Rcnt_Alarm : 58|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Rrh_Alarm : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,PGS + +BO_ 1984 CAL_SAS11: 2 ESC + SG_ CCW : 0|4@1+ (1.0,0.0) [0.0|15.0] "" SAS + SG_ SAS_CID : 4|11@1+ (1.0,0.0) [0.0|2047.0] "" SAS + +BO_ 1456 CLU12: 4 CLU + SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0.0) [0.0|1677721.4] "km" _4WD,AAF,BCM,CUBIS,EMS,EPB,IBOX,LDWS_LKAS,SCC,TPMS + +BO_ 688 SAS11: 5 MDPS + SG_ SAS_Angle : 0|16@1- (0.1,0.0) [-3276.8|3276.7] "Deg" _4WD,ACU,AFLS,AVM,CLU,ECS,EMS,ESC,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SPAS,TCU,_4WD,ACU,AFLS,AVM,BCM,CLU,ECS,EMS,ESC,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SPAS,TCU + SG_ SAS_Speed : 16|8@1+ (4.0,0.0) [0.0|1016.0] "" AFLS,ECS,ESC,IBOX,LDWS_LKAS,SCC,SPAS,TCU,AFLS,ECS,ESC,IBOX,LDWS_LKAS,SCC,SPAS,TCU + SG_ SAS_Stat : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU,ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU + SG_ MsgCount : 32|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS + SG_ CheckSum : 36|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,EMS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,ECS,EMS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS + +BO_ 1441 ACU12: 8 ACU + SG_ CR_Acu_SN : 0|64@1+ (1.0,0.0) [0.0|0.0] "" ODS + +BO_ 1440 ACU11: 8 ACU + SG_ CF_Ods_SNRcv : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_Ods_IDRcv : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_Ods_RZReq : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_Abg_DepInhEnt : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_Abg_DepEnt : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_PasBkl_FltStat : 28|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB + SG_ CF_DriBkl_FltStat : 29|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB + SG_ CF_PasBkl_Stat : 30|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,ODS,PSB,TMU + SG_ CF_DriBkl_Stat : 31|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB + SG_ CF_SWL_Ind : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CUBIS,IBOX + SG_ CF_Acu_FltStat : 34|2@1+ (1.0,0.0) [0.0|3.0] "" CUBIS,IBOX + SG_ CF_Acu_ExtOfSab : 36|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,CUBIS,IBOX + SG_ CF_Acu_Dtc : 40|16@1+ (1.0,0.0) [0.0|65535.0] "" CUBIS,IBOX + SG_ CF_Acu_NumOfFlt : 56|8@1+ (1.0,0.0) [0.0|255.0] "" CUBIS,IBOX + +BO_ 1437 AHLS11: 8 AHLS + SG_ CF_Ahls_WarnLamp : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Ahls_WarnMsg : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1434 PSB11: 2 PSB + SG_ PSB_LH_FAIL : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ PSB_LH_TGL : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ PSB_LH_ACT : 3|4@1+ (1.0,0.0) [0.0|4.0] "" Dummy + SG_ PSB_RH_FAIL : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ PSB_RH_TGL : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ PSB_RH_ACT : 11|4@1+ (1.0,0.0) [0.0|4.0] "" Dummy + +BO_ 916 TCS13: 8 ESC + SG_ aBasis : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,SCC + SG_ BrakeLight : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,SCC + SG_ DCEnable : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ AliveCounterTCS : 13|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,SCC + SG_ ACCReqLim : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC + SG_ TQI_ACC : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS + SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,SCC + SG_ ACCEnable : 43|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC + SG_ DriverOverride : 45|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC + SG_ StandStill : 47|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ CheckSum_TCS3 : 48|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,SCC + SG_ ACC_EQUIP : 52|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ PBRAKE_ACT : 53|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ ACC_REQ : 54|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ DriverBraking : 55|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ CF_VSM_Coded : 56|1@1+ (1.0,0.0) [0.0|1.0] "" SCC + SG_ CF_VSM_Avail : 57|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,SCC + SG_ CF_VSM_Handshake : 59|1@1+ (1.0,0.0) [0.0|1.0] "" SCC + SG_ CF_DriBkeStat : 60|1@1+ (1.0,0.0) [0.0|1.0] "" SCC + SG_ CF_VSM_ConfSwi : 61|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ AEB_EQUIP : 63|1@1+ (1.0,0.0) [0.0|1.0] "" SCC + +BO_ 1427 TPMS11: 6 BCM + SG_ TPMS_W_LAMP : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,HUD,IBOX,CLU,CUBIS,HUD,IBOX + SG_ TREAD_W_LAMP : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,HUD,IBOX,CLU,CUBIS,HUD,IBOX + SG_ POS_FL_W_LAMP : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX + SG_ POS_FR_W_LAMP : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX + SG_ POS_RL_W_LAMP : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX + SG_ POS_RR_W_LAMP : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX + SG_ STATUS_TPMS : 8|3@1+ (1.0,0.0) [0.0|0.0] "" CLU + SG_ UNIT : 11|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ PRESSURE_FL : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ PRESSURE_FR : 24|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ PRESSURE_RL : 32|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ PRESSURE_RR : 40|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + +BO_ 915 TCS12: 4 ESC + SG_ SA_COUNT : 0|16@1+ (2.0,-32768.0) [-32768.0|98302.0] "" _4WD,ACU,MDPS + SG_ SA_Z_COUNT : 16|15@1+ (2.0,-32768.0) [-32768.0|32766.0] "" _4WD,ACU,MDPS + SG_ SA_Z_FLAG : 31|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,MDPS + +BO_ 1170 EMS19: 8 EMS + SG_ CF_Ems_BrkReq : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX,TCU + SG_ CF_Ems_DnShftReq : 1|4@1+ (1.0,0.0) [0.0|14.0] "" IBOX,TCU + SG_ CF_Ems_RepModChk : 5|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX + SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1.0,0.0) [0.0|1.0] "" AAF,IBOX + SG_ CF_Ems_DecelReq : 8|12@1+ (0.0010,-4.094) [-4.094|0.0] "m/s^2" ESC,IBOX,TCU + SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0.0) [0.0|4094.0] "hPa" CLU,IBOX + SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40.0) [0.0|254.0] "deg" CLU,IBOX + SG_ DPF_LAMP_STAT : 40|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX + SG_ BAT_LAMP_STAT : 42|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41.0) [-41.0|85.5] "deg" AAF,IBOX + SG_ CF_Ems_OPSFail : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" AAF,ABS,CUBIS,ECS,EPB,IBOX,MDPS,REA,SCC,SMK,TCU + SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AAF,ABS,CUBIS,ECS,EPB,IBOX,MDPS,REA,SCC,SMK,TCU + +BO_ 1425 AFLS11: 2 AFLS + SG_ AFLS_STAT : 1|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Afls_TrfChgStat : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Afls_LedHLStat : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 912 SPAS11: 7 SPAS + SG_ CF_Spas_Stat : 0|4@1+ (1.0,0.0) [0.0|15.0] "" ESC,MDPS + SG_ CF_Spas_TestMode : 4|2@1+ (1.0,0.0) [0.0|3.0] "" MDPS + SG_ CR_Spas_StrAngCmd : 8|16@1- (0.1,0.0) [-3276.8|3276.7] "" MDPS + SG_ CF_Spas_BeepAlarm : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Spas_Mode_Seq : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_AliveCnt : 32|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS + SG_ CF_Spas_Chksum : 40|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS + SG_ CF_Spas_PasVol : 48|3@1+ (1.0,0.0) [0.0|7.0] "" CGW,CLU + +BO_ 1168 EPB11: 7 EPB + SG_ EPB_I_LAMP : 0|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU,CUBIS,ESC,IBOX + SG_ EPB_F_LAMP : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,ESC,IBOX + SG_ EPB_ALARM : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC + SG_ EPB_CLU : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,ESC + SG_ EPB_SWITCH : 16|2@1+ (1.0,0.0) [0.0|3.0] "" ESC,SCC + SG_ EPB_RBL : 18|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,ESC + SG_ EPB_STATUS : 19|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,ESC,SCC,TCU + SG_ EPB_FRC_ERR : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,SCC,TCU + SG_ EPB_DBF_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ ESP_ACK : 25|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ EPB_DBF_REQ : 26|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ EPB_FAIL : 29|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,SCC + SG_ EPB_FORCE : 32|12@1+ (1.0,-1000.0) [-1000.0|3000.0] "" ESC + SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0.0) [0.0|2.54] "g" ESC + +BO_ 399 EMS_H12: 8 EMS + SG_ R_TqAcnApvC : 0|8@1+ (0.2,0.0) [0.0|51.0] "Nm" DATC,IBOX + SG_ R_PAcnC : 8|8@1+ (125.0,0.0) [0.0|31875.0] "hPa" DATC,IBOX + SG_ TQI_B : 16|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ABS,ESC,IBOX + SG_ SLD_VS : 24|8@1+ (1.0,0.0) [0.0|255.0] "km/h" CLU,IBOX + SG_ CF_CdaStat : 32|3@1+ (1.0,0.0) [0.0|7.0] "" AEMC,IBOX,TCU + SG_ CF_Ems_IsgStat : 35|3@1+ (1.0,0.0) [0.0|7.0] "" ABS,BCM,CLU,DATC,EPB,ESC,IBOX,LDWS_LKAS,MDPS,SMK,TCU + SG_ CF_Ems_OilChg : 38|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_EtcLimpMod : 39|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ R_NEngIdlTgC : 40|8@1+ (10.0,0.0) [0.0|2550.0] "rpm" DATC,IBOX,TCU + SG_ CF_Ems_UpTarGr : 48|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_DownTarGr : 49|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_DesCurGr : 50|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX + SG_ CF_Ems_SldAct : 54|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_SldPosAct : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_HPresStat : 56|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ CF_Ems_IsgBuz : 57|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_IdlStpFCO : 58|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_FCopen : 59|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_ActEcoAct : 60|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU + SG_ CF_Ems_EngRunNorm : 61|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,IBOX,TCU + SG_ CF_Ems_IsgStat2 : 62|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX,TCU + +BO_ 1419 LCA11: 8 LCA + SG_ CF_Lca_Stat : 0|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_Rcta_Stat : 4|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_Lca_IndLeft : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Rcw_Stat : 10|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_RCW_Warning : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Lca_IndRight : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Lca_SndWan_Stat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_FR_SndWan : 20|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU + SG_ CF_FL_SndWan : 21|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU + SG_ CF_RR_SndWan : 22|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU + SG_ CF_RL_SndWan : 23|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU + SG_ CF_Lca_IndBriLeft : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_Lca_IndBriRight : 32|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_RCTA_IndBriLeft : 40|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_RCTA_IndBriRight : 48|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_RCTA_IndLeft : 56|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_RCTA_IndRight : 58|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_SndWarnForClu : 60|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 906 ABS11: 8 ABS + SG_ ABS_DEF : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,EMS,SPAS,TCU + SG_ EBD_DEF : 1|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,SPAS,TCU + SG_ ABS_ACT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,EPB,SPAS,TCU + SG_ ABS_W_LAMP : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,CUBIS,MTS,TMU + SG_ EBD_W_LAMP : 4|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU + SG_ ABS_DIAG : 5|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU + SG_ ESS_STAT : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,BCM,CLU,EMS + +BO_ 903 WHL_PUL11: 6 ABS + SG_ WHL_PUL_FL : 0|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS + SG_ WHL_PUL_FR : 8|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS + SG_ WHL_PUL_RL : 16|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS + SG_ WHL_PUL_RR : 24|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS + SG_ WHL_DIR_FL : 32|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS + SG_ WHL_DIR_FR : 34|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS + SG_ WHL_DIR_RL : 36|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS + SG_ WHL_DIR_RR : 38|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS + SG_ WHL_PUL_Chksum : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EPB,SPAS,TPMS,EPB,LCA,LDWS_LKAS,SPAS,TPMS + +BO_ 1415 TMU11: 8 IBOX + SG_ CF_Tmu_VehSld : 0|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Tmu_VehImmo : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Tmu_ReqRepCnd : 2|2@1+ (1.0,0.0) [0.0|3.0] "" EMS + SG_ CF_Tmu_AirconCtr : 4|1@1+ (1.0,0.0) [0.0|1.0] "" DATC + SG_ CF_Tmu_TempMd : 5|1@1+ (1.0,0.0) [0.0|1.0] "" DATC + SG_ CF_Tmu_TempSet : 6|16@1+ (1.0,0.0) [0.0|20.0] "" DATC + SG_ CF_Tmu_DefrostCtr : 22|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,FATC + SG_ CF_Tmu_AliveCnt1 : 56|4@1+ (1.0,0.0) [0.0|15.0] "" EMS + +BO_ 902 WHL_SPD11: 8 ABS + SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS + SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,ACU,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS + SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,BCM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,BCM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS + SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS + SG_ WHL_SPD_AliveCounter_LSB : 14|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + SG_ WHL_SPD_AliveCounter_MSB : 30|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + SG_ WHL_SPD_Checksum_LSB : 46|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + SG_ WHL_SPD_Checksum_MSB : 62|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + +BO_ 1414 EVP11: 3 EVP + SG_ CF_Evp_Stat : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 1412 AAF11: 8 AAF + SG_ CF_Aaf_ActFlapStatus : 0|2@1+ (1.0,0.0) [0.0|3.0] "" AAF_Tester + SG_ CF_Aaf_ModeStatus : 2|3@1+ (1.0,0.0) [0.0|7.0] "" AAF_Tester + SG_ CF_Aaf_WrnLamp : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Aaf_ErrStatus : 6|10@1+ (1.0,0.0) [0.0|1023.0] "" AAF_Tester,EMS + SG_ CF_Aaf_OpenRqSysAct : 16|8@1+ (1.0,0.0) [0.0|255.0] "" AAF_Tester + SG_ CF_Aaf_PStatus : 24|8@1+ (1.0,0.0) [0.0|100.0] "%" AAF_Tester + SG_ CF_Aaf_OpenRqSysSol : 32|8@1+ (1.0,0.0) [0.0|255.0] "" AAF_Tester + SG_ CF_Aaf_SolFlapStatus : 40|2@1+ (1.0,0.0) [0.0|3.0] "" AAF_Tester + SG_ CF_Aaf_MilOnReq : 42|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 900 EMS17: 8 EMS + SG_ CF_Ems_PkpCurMSV : 0|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_HolCurMSV : 8|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_InjVBnkAct : 16|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_InjVActSet : 24|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_DiagFulHDEV : 32|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX + SG_ CF_Ems_SwiOffIC1 : 33|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX + SG_ CF_Ems_SwiOffIC2 : 34|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX + SG_ CF_Ems_DiagReqHDEV : 38|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX + SG_ CR_Ems_DutyCycMSV : 40|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" DI_BOX + SG_ CR_Ems_BatVolRly : 48|8@1+ (0.1,0.0) [0.0|25.5] "V" DI_BOX + +BO_ 387 REA11: 8 REA + SG_ CF_EndBst_PwmDuH : 0|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_PwmDuL : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_PwmFqOutRng : 2|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_HbriOverCur : 3|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_HbriOverTemp : 4|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_PosSnsKOR : 6|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_PosSnsOSOR : 7|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_EepFlt : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_RomFlt : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_RamFlt : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_CanFlt : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_AgH : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_AgL : 13|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_ORVol : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CR_EndBst_ActPos : 16|16@1+ (0.117,0.0) [1.989|118.053] "" EMS + SG_ CR_EndBst_DemPos : 32|16@1+ (0.117,0.0) [0.0|119.691] "" EMS + SG_ CR_EndBst_HbriPwr : 48|16@1+ (0.045,0.0) [0.0|99.99] "%" EMS + +BO_ 1411 CUBIS11: 8 CUBIS + SG_ CF_Cubis_HUDisp : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + +BO_ 899 FATC11: 8 DATC + SG_ CR_Fatc_TqAcnOut : 0|8@1+ (0.2,0.0) [0.0|50.8] "Nm" EMS,IBOX + SG_ CF_Fatc_AcnRqSwi : 8|1@1+ (1.0,0.0) [0.0|1.0] "" AAF,EMS,IBOX + SG_ CF_Fatc_AcnCltEnRq : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_EcvFlt : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_BlwrOn : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_FATC_Iden : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Fatc_BlwrMax : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX + SG_ CF_Fatc_EngStartReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_IsgStopReq : 16|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_CtrInf : 17|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,IBOX + SG_ CF_Fatc_MsgCnt : 20|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX + SG_ CR_Fatc_OutTemp : 24|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" BCM,CLU,EMS,IBOX,SPAS,TCU,TPMS + SG_ CR_Fatc_OutTempSns : 32|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" AAF,AHLS,CLU,EMS,IBOX,SPAS,TCU + SG_ CF_Fatc_Compload : 40|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,IBOX + SG_ CF_Fatc_ActiveEco : 43|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Fatc_AutoActivation : 44|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX + SG_ CF_Fatc_DefSw : 45|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,IBOX + SG_ CF_Fatc_PtcRlyStat : 46|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_ChkSum : 56|8@1+ (1.0,0.0) [0.0|255.0] "" EMS,IBOX,SPAS + +BO_ 129 EMS_DCT12: 8 EMS + SG_ CR_Ems_SoakTimeExt : 0|6@1+ (5.0,0.0) [0.0|315.0] "Min" TCU + SG_ BRAKE_ACT : 6|2@1+ (1.0,0.0) [0.0|3.0] "" TCU + SG_ CF_Ems_EngOperStat : 8|8@1+ (1.0,0.0) [0.0|255.0] "" TCU + SG_ CR_Ems_IndAirTemp : 16|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" TCU + SG_ CF_Ems_Alive2 : 56|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Ems_ChkSum2 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + +BO_ 897 MDPS11: 8 MDPS + SG_ CF_Mdps_WLmp : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,EMS,IBOX,SPAS + SG_ CF_Mdps_Flex : 2|3@1+ (1.0,0.0) [0.0|3.0] "" CLU,LDWS_LKAS + SG_ CF_Mdps_FlexDisp : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Mdps_Stat : 7|4@1+ (1.0,0.0) [0.0|15.0] "" SPAS + SG_ CR_Mdps_DrvTq : 11|12@1+ (0.01,-20.48) [-20.48|20.46] "" SPAS + SG_ CF_Mdps_ALTRequest : 23|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CR_Mdps_StrAng : 24|16@1- (0.1,0.0) [-3276.8|3276.7] "Deg" SPAS + SG_ CF_Mdps_AliveCnt : 40|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,SPAS + SG_ CF_Mdps_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,SPAS + SG_ CF_Mdps_SPAS_FUNC : 57|1@1+ (1.0,0.0) [0.0|1.0] "flag" SPAS + SG_ CF_Mdps_LKAS_FUNC : 58|1@1+ (1.0,0.0) [0.0|1.0] "flag" LDWS_LKAS + SG_ CF_Mdps_CurrMode : 59|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS + SG_ CF_Mdps_Type : 61|2@1+ (1.0,0.0) [0.0|2.0] "" LDWS_LKAS,SPAS + +BO_ 896 DI_BOX13: 8 DI_BOX + SG_ CF_DiBox_HPreInjVConfStat : 0|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_HPreInjVStat1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_HPreInjVStat2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_HPreInjVPkp : 24|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_HPreInjVBpt : 32|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_ErrRegFrtMSV : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_ErrRegSedMSV : 48|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_SPIErrSedMSV : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_SPIErrFrtMSV : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_IDErrSedMSV : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_IDErrFrtMSV : 59|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_IniStatMSV : 60|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 640 EMS13: 8 EMS + SG_ LV_FUEL_TYPE_ECU : 0|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,LPI,SMK + SG_ LV_BFS_CFIRM : 1|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ LV_CRASH : 2|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ LV_VB_OFF_ACT : 3|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ LV_GSL_MAP M : 4|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ LV_ENG_TURN : 5|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ ERR_FUEL : 8|8@1+ (1.0,0.0) [0.0|255.0] "" LPI + SG_ EOS : 16|8@1+ (1.0,0.0) [0.0|255.0] "" LPI + SG_ TCO : 24|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" LPI + SG_ N_32 : 32|8@1+ (32.0,0.0) [0.0|8160.0] "rpm" LPI + SG_ MAF : 40|8@1+ (5.447,0.0) [0.0|1388.985] "mg/TDC" LPI + SG_ TIA : 48|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" LPI + SG_ MAP m1 : 56|8@1+ (0.47058,0.0) [0.0|119.9979] "kPa" LPI + SG_ AMP m0 : 56|8@1+ (21.22,0.0) [0.0|5411.1] "hPa" LPI + +BO_ 128 EMS_DCT11: 8 EMS + SG_ PV_AV_CAN : 0|8@1+ (0.3906,0.0) [0.0|99.603] "%" TCU + SG_ TQ_STND : 8|6@1+ (10.0,0.0) [0.0|630.0] "Nm" TCU + SG_ F_N_ENG : 14|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ F_SUB_TQI : 15|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ N : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" TCU + SG_ TQI_ACOR : 32|8@1+ (0.390625,0.0) [0.0|99.6094] "%" IBOX,TCU + SG_ TQFR : 40|8@1+ (0.390625,0.0) [0.0|99.6094] "%" TCU + SG_ TQI : 48|8@1+ (0.390625,0.0) [0.0|99.609375] "%" TCU + SG_ CF_Ems_Alive : 56|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Ems_ChkSum : 60|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + +BO_ 1407 HU_MON_PE_01: 8 CLU + SG_ HU_Type : 0|8@1+ (1.0,0.0) [0.0|255.0] "" AVM,PGS + +BO_ 127 CGW5: 8 BCM + SG_ C_StopLampLhOpenSts : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_StopLampRhOpenSts : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HMSLOpenSts : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HLampLowLhOpenSts : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HLampLowRhOpenSts : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HLampHighLhOpenSts : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HLampHighRhOpenSts : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_DRLLampLhOpenSts : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_DRLLampRhOpenSts : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearFOGLhOpenSts : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearFOGRhOpenSts : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontFOGLhOpenSts : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontFOGRhOpenSts : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearEXTTailLhOpenSts : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearEXTTailRhOpenSts : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontEXTTailLhOpenSts : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontEXTTailRhOpenSts : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearTSIGLhOpenSts : 17|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearTSIGRhOpenSts : 18|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontTSIGLhOpenSts : 19|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontTSIGRhOpenSts : 20|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_SBendingLhOpenSts : 21|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_SBendingRhOpenSts : 22|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_LicensePlateLhOpenSts : 23|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_LicensePlateRhOpenSts : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 1151 ESP11: 6 ESC + SG_ AVH_STAT : 0|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,TCU + SG_ LDM_STAT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" EPB,TCU + SG_ REQ_EPB_ACT : 3|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,TCU + SG_ REQ_EPB_STAT : 5|1@1+ (1.0,0.0) [0.0|1.0] "" EPB + SG_ ECD_ACT : 6|1@1+ (1.0,0.0) [0.0|1.0] "" EPB + SG_ _4WD_LIM_REQ : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS + SG_ ROL_CNT_ESP : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EPB,TCU + SG_ _4WD_TQC_LIM : 16|16@1+ (1.0,0.0) [0.0|65535.0] "Nm" _4WD,EMS + SG_ _4WD_CLU_LIM : 32|8@1+ (0.390625,0.0) [0.0|99.609375] "%" _4WD,EMS + SG_ _4WD_OPEN : 40|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,EMS + SG_ _4WD_LIM_MODE : 42|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD + +BO_ 1397 HU_AVM_E_00: 8 CLU + SG_ HU_AVM_Cal_Cmd : 0|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_Cal_Method : 4|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS + SG_ HU_AVM_Save_Controlpoint : 6|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS + SG_ HU_AVM_PT_X : 8|12@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_RearViewPointOpt : 20|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_PT_Y : 24|12@1+ (1.0,0.0) [0.0|4095.0] "" AVM,PGS + SG_ HU_AVM_FrontViewPointOpt : 36|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_SelectedMenu : 40|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,PGS + SG_ HU_AVM_CameraOff : 45|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS + SG_ HU_AVM_Option : 48|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_CrossLineMove_Cmd : 52|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_RearView_Option : 56|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_FrontView_Option : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + +BO_ 1395 HU_AVM_E_01: 8 CLU + SG_ HU_PGSSelectedMenu : 0|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_PGSOption : 8|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,PGS + SG_ HU_AVM_ParkingAssistMenu : 56|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_ParkingAssistSB : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + +BO_ 1393 OPI11: 5 OPI + SG_ CR_Opi_Spd_Rpm : 0|8@1+ (20.0,0.0) [0.0|3500.0] "rpm" TCU + SG_ CF_Opi_Over_Temp : 8|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ CF_Opi_Over_Cur : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU + SG_ CF_Opi_Over_Vol : 10|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ CF_Opi_Hall_Fail : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU + SG_ CF_Opi_Flt : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU + SG_ CF_Opi_Motor_Dir : 15|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ CF_Opi_Romver : 16|8@1+ (1.0,0.0) [0.0|255.0] "" TCU + SG_ CF_Opi_PWM_Rate : 24|12@1+ (1.0,0.0) [0.0|100.0] "%" TCU + +BO_ 625 LPI11: 8 LPI + SG_ FUP_LPG_MMV : 0|8@1+ (128.0,0.0) [0.0|32640.0] "hPa" EMS + SG_ LV_FUEL_TYPE_BOX : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_BFS_IN_PROGRESS : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_GAS_OK : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_FUP_ENA_THD : 11|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,EMS,SMK + SG_ LPI_OBD : 12|4@1+ (1.0,0.0) [0.0|15.0] "" EMS + SG_ ERR_GAS : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ FAC_TI_GAS_COR : 24|16@1+ (3.05E-5,0.0) [0.0|1.9988175] "" EMS + SG_ FTL_AFU : 40|8@1+ (0.392,0.0) [0.0|99.96] "%" EMS + SG_ BFS_CYL : 48|8@1+ (1.0,0.0) [0.0|6.0] "Cyl Nr." EMS + SG_ LV_PRE_CDN_LEAK : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_CONF_INJECTION_DELAY : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_LPG_SW_DRIVER_REQ : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 356 VSM11: 4 ESC + SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" MDPS + SG_ CF_Esc_Act : 12|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,MDPS + SG_ CF_Esc_CtrMode : 13|3@1+ (1.0,0.0) [0.0|7.0] "" MDPS + SG_ CF_Esc_Def : 16|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Esc_AliveCnt : 17|4@1+ (1.0,0.0) [0.0|15.0] "" LDWS_LKAS,MDPS + SG_ CF_Esc_Chksum : 24|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,MDPS + +BO_ 1379 PGS_HU_PE_01: 8 PGS + SG_ PGS_State : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ PGS_ParkGuideState : 8|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + SG_ PGS_Option : 16|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + SG_ PGS_Version : 32|16@1+ (1.0,0.0) [0.0|65535.0] "" CLU + +BO_ 354 TCU_DCT13: 3 TCU + SG_ Clutch_Driving_Tq : 0|10@1+ (1.0,-512.0) [0.0|0.0] "Nm" ESC + SG_ Cluster_Engine_RPM : 10|13@1+ (0.9766,0.0) [0.0|0.0] "" CLU + SG_ Cluster_Engine_RPM_Flag : 23|1@1+ (1.0,0.0) [0.0|0.0] "" CLU + +BO_ 1378 HUD11: 4 HUD + SG_ CF_Hud_HeightStaus : 0|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + SG_ CF_Hud_PBackStatus : 6|2@1+ (1.0,0.0) [0.0|0.0] "" BCM,CLU + SG_ CF_Hud_Brightness : 8|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + +BO_ 608 EMS16: 8 EMS + SG_ TQI_MIN : 0|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU + SG_ TQI : 8|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU + SG_ TQI_TARGET : 16|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EPB,ESC,IBOX,TCU + SG_ GLOW_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,IBOX,SMK + SG_ CRUISE_LAMP_M : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU + SG_ CRUISE_LAMP_S : 26|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU + SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ ENG_STAT : 28|3@1+ (1.0,0.0) [0.0|7.0] "" ABS,AHLS,AVM,BCM,CLU,EPB,ESC,EVP,FPCM,IBOX,LCA,LDWS_LKAS,MDPS,SCC,SMK,TCU + SG_ SOAK_TIME_ERROR : 31|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,EPB,IBOX,TCU + SG_ SOAK_TIME : 32|8@1+ (1.0,0.0) [0.0|255.0] "Min" _4WD,DATC,EPB,IBOX,TCU + SG_ TQI_MAX : 40|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU + SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [-35.625|60.0] "" IBOX,TCU + SG_ Checksum : 56|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,IBOX,LDWS_LKAS,MDPS,SCC + SG_ AliveCounter : 60|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,LDWS_LKAS,MDPS,SCC + SG_ CF_Ems_AclAct : 62|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,SCC + +BO_ 1371 AVM_HU_PE_00: 8 AVM + SG_ AVM_View : 0|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + SG_ AVM_ParkingAssist_BtnSts : 5|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ AVM_Display_Message : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ AVM_Popup_Msg : 16|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_Ready : 20|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_ParkingAssist_Step : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_FrontBtn_Type : 28|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_Option : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_HU_FrontViewPointOpt : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_HU_RearView_Option : 40|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_HU_FrontView_Option : 44|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_Version : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" CLU + +BO_ 1370 HU_AVM_PE_00: 8 CLU + SG_ HU_AVM_Status : 0|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS + +BO_ 1369 CGW4: 8 BCM + SG_ CF_Gway_MemoryP1Cmd : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_MemoryP2Cmd : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBackP1Cmd : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBackP2Cmd : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_StrgWhlHeatedState : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBackStopCmd : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,HUD + SG_ CF_Gway_StaticBendLhAct : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_StaticBendRhAct : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_DrvWdwStat : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_RLWdwState : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_RRWdwState : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_AstWdwStat : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_MemoryEnable : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBACKStopCmd : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBACKStop : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,HUD + SG_ CF_Gway_IMSBuzzer : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_DrvSeatBeltInd : 36|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_AstSeatBeltInd : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_RCSeatBeltInd : 40|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_RLSeatBeltInd : 42|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_RRSeatBeltInd : 44|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_RrWiperHighSw : 46|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_RrWiperLowSw : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 1367 EngFrzFrm12: 8 EMS + SG_ PID_06h : 0|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU + SG_ PID_07h : 8|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU + SG_ PID_08h : 16|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU + SG_ PID_09h : 24|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU + SG_ PID_0Bh : 32|8@1+ (1.0,0.0) [0.0|255.0] "kPa" AAF,IBOX,TCU + SG_ PID_23h : 40|16@1+ (10.0,0.0) [0.0|655350.0] "kPa" AAF,IBOX,TCU + +BO_ 1366 EngFrzFrm11: 8 EMS + SG_ PID_04h : 0|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" AAF,TCU + SG_ PID_05h : 8|8@1+ (1.0,-40.0) [-40.0|215.0] "deg" AAF,TCU + SG_ PID_0Ch : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" AAF,TCU + SG_ PID_0Dh : 32|8@1+ (1.0,0.0) [0.0|255.0] "km/h" AAF,TCU + SG_ PID_11h : 40|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" AAF,TCU + SG_ PID_03h : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" AAF,TCU + +BO_ 1365 FPCM11: 8 FPCM + SG_ CR_Fpcm_LPActPre : 0|8@1+ (3.137254902,0.0) [0.0|800.0] "kPa" EMS + SG_ CF_Fpcm_LPPumpOverCur : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_PreSnrHi : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_PreSnrDisc : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_PreSnrShort : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_LPPumpDiscShort : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_LP_System_Error : 13|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_PreSnrSigErr : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_LPCtrCirFlt : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 852 LVR11: 7 LVR + SG_ CF_Lvr_GearInf : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,TCU + SG_ CF_Lvr_PRelStat : 4|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,SMK,TCU + SG_ CF_Lvr_BkeAct : 5|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ CF_Lvr_NFnStat : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Lvr_PosInf : 8|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Lvr_PosCpl : 12|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Lvr_UlkButStat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" TCU + SG_ CF_Lvr_PNStat : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Lvr_ShtLkStat : 24|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Lvr_ShfErrInf : 28|20@1+ (1.0,0.0) [0.0|8191.0] "" CLU,TCU + SG_ CF_Lvr_AC : 48|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Lvr_CS : 52|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + +BO_ 1363 CGW2: 8 BCM + SG_ CF_Gway_GwayDiagState : 0|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_DDMDiagState : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SCMDiagState : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_PSMDiagState : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SJBDiagState : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_IPMDiagState : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_LDMFail : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,LDWS_LKAS,LDWS_LKAS + SG_ CF_Gway_CLUSwGuiCtrl : 10|3@1+ (1.0,0.0) [0.0|63.0] "" CLU,Dummy + SG_ CF_Gway_CLUSwGroup : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_CLUSwMode : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_CLUSwEnter : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_AutoLightValue : 16|1@1+ (1.0,0.0) [0.0|1.0] "" LCA,LCA + SG_ CF_Gway_BrakeFluidSw : 17|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_DrvSeatBeltInd : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_AvTail : 20|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,SNV,SNV + SG_ CF_Gway_RearFogAct : 21|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_ExtTailAct : 22|1@1+ (1.0,0.0) [0.0|1.0] "" AVM,CLU,LCA,PGS,SPAS,AVM,LCA,PGS,SPAS + SG_ CF_Gway_RRDrSw : 23|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_RLDrSw : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_IntTailAct : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_CountryCfg : 26|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,Dummy + SG_ CF_Gway_WiperParkPosition : 32|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,EMS,LDWS_LKAS,AFLS,EMS,LDWS_LKAS + SG_ CF_Gway_HLLowLHFail : 33|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,SNV,LDWS_LKAS,SNV + SG_ CF_Gway_HLLowRHFail : 34|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,SNV,LDWS_LKAS,SNV + SG_ CF_Gway_ESCLFailWarn : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_ESCLNotLockedWarn : 36|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_ESCLNotUnlockWarn : 37|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_IDoutWarn : 38|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_ImmoLp : 40|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_BCMRKEID : 41|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy + SG_ CF_Gway_VehicleNotPWarn : 44|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_DeactivationWarn : 45|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_KeyBATDischargeWarn : 46|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SSBWarn : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SMKFobID : 48|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy + SG_ CF_Gway_SMKRKECmd : 51|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy + SG_ CF_Gway_AutoLightOption : 54|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_SJBDeliveryMode : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_KeyoutLp : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SMKDispWarn : 57|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,Dummy + SG_ CF_Gway_WngBuz : 61|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy + +BO_ 339 TCS11: 8 ESC + SG_ TCS_REQ : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,TCU + SG_ MSR_C_REQ : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,EPB,SCC,TCU + SG_ TCS_PAS : 2|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,SCC,SPAS,TCU + SG_ TCS_GSC : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,TCU + SG_ CF_Esc_LimoInfo : 4|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,SCC + SG_ ABS_DIAG : 6|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB + SG_ ABS_DEF : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,SCC,SPAS,TCU + SG_ TCS_DEF : 8|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SCC,SPAS,TCU + SG_ TCS_CTL : 9|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SCC,SPAS,TCU + SG_ ABS_ACT : 10|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,SPAS,TCU + SG_ EBD_DEF : 11|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SPAS,TCU + SG_ ESP_PAS : 12|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,CLU,EMS,EPB,LDWS_LKAS,SCC,TCU + SG_ ESP_DEF : 13|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,TCU + SG_ ESP_CTL : 14|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,SPAS,TCU + SG_ TCS_MFRN : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,EPB,TCU + SG_ DBC_CTL : 16|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB + SG_ DBC_PAS : 17|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB + SG_ DBC_DEF : 18|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB + SG_ HAC_CTL : 19|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU + SG_ HAC_PAS : 20|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU + SG_ HAC_DEF : 21|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU + SG_ ESS_STAT : 22|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,BCM,CLU,EMS,EPB + SG_ TQI_TCS : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU + SG_ TQI_MSR : 32|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU + SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU + SG_ CF_Esc_BrkCtl : 48|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ BLA_CTL : 49|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CGW,CLU + SG_ AliveCounter_TCS1 : 52|4@1+ (1.0,0.0) [0.0|14.0] "" EMS,EPB,LDWS_LKAS + SG_ CheckSum_TCS1 : 56|8@1+ (1.0,0.0) [0.0|255.0] "" EMS,EPB,LDWS_LKAS + +BO_ 1362 SNV11: 4 SNV + SG_ CF_SNV_DisplayControl : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,HUD + SG_ CF_Snv_BeepWarning : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,HUD + SG_ CF_Snv_WarningMessage : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,HUD + SG_ CF_Snv_DetectionEnable : 7|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,HUD + SG_ CF_Snv_PedestrianDetect : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,HUD + SG_ CF_Snv_IRLampControl : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,HUD + +BO_ 593 MDPS12: 8 MDPS + SG_ CR_Mdps_StrColTq : 0|11@1+ (0.0078125,-8.0) [-8.0|7.9921875] "Nm" LDWS_LKAS + SG_ CF_Mdps_Def : 11|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ CF_Mdps_ToiUnavail : 12|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Mdps_ToiActive : 13|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Mdps_ToiFlt : 14|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Mdps_FailStat : 15|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Mdps_MsgCount2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" ESC,LDWS_LKAS + SG_ CF_Mdps_Chksum2 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ESC,LDWS_LKAS + SG_ CF_Mdps_SErr : 37|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ CR_Mdps_StrTq : 40|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" ESC + SG_ CR_Mdps_OutTq : 52|12@1+ (0.1,-204.8) [-204.8|204.7] "" ESC,LDWS_LKAS + +BO_ 1360 IAP11: 3 IAP + SG_ CF_Iap_EcoPmodSwi : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Iap_EcoPmodAct : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Iap_ReqWarn : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1356 TCU_DCT14: 8 TCU + SG_ Vehicle_Stop_Time : 0|5@1+ (1.0,0.0) [0.0|0.0] "" CLU + SG_ HILL_HOLD_WARNING : 5|1@1+ (1.0,0.0) [0.0|0.0] "" CLU + +BO_ 1353 BAT11: 8 EMS + SG_ BAT_SNSR_I : 0|16@1+ (0.01,-327.0) [-327.0|328.0] "A" CGW,CUBIS,IBOX,TMU + SG_ BAT_SOC : 16|8@1+ (1.0,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_V : 24|14@1+ (0.0010,6.0) [6.0|18.0] "V" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_Temp : 38|9@1- (0.5,-40.0) [-40.0|125.0] "deg" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_State : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU + SG_ BAT_SOH : 48|7@1+ (1.0,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_Invalid : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU + SG_ BAT_SOF : 56|7@1+ (0.1,0.0) [0.0|12.0] "V" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_Error : 63|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU + +BO_ 1351 EMS15: 8 EMS + SG_ ECGPOvrd : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX,SCC + SG_ QECACC : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ ECFail : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ SwitchOffCondExt : 3|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ BLECFail : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ CF_Ems_IsaAct : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ FA_PV_CAN : 8|8@1+ (0.3906,0.0) [0.0|99.2] "%" IBOX,LDWS_LKAS,TCU + SG_ IntAirTemp : 16|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" _4WD,ECS,EPB,IBOX,TCU + SG_ STATE_DC_OBD : 24|7@1+ (1.0,0.0) [0.0|127.0] "" IBOX,TCU + SG_ INH_DC_OBD : 31|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ CTR_IG_CYC_OBD : 32|16@1+ (1.0,0.0) [0.0|65535.0] "" ACU,IBOX,TCU + SG_ CTR_CDN_OBD : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" IBOX,TCU + +BO_ 1350 DI_BOX12: 8 DI_BOX + SG_ CF_DiBox_FrtInjVDiagReg0 : 0|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_FrtInjVDiagReg1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_FrtInjVDiagReg2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_SedInjVDiagReg0 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_SedInjVDiagReg1 : 32|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_SedInjVDiagReg2 : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CR_DiBox_BatVol : 48|8@1+ (0.1,0.0) [0.0|25.5] "V" EMS + SG_ CF_DiBox_SedInjVChg : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_FrtInjVChg : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_SedInjVErrSPI : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_FrtInjVErrSPI : 59|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 1349 EMS14: 8 EMS + SG_ IMMO_LAMP_STAT : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ L_MIL : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,IBOX + SG_ IM_STAT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ AMP_CAN : 3|5@1+ (10.731613,458.98) [458.98|791.660003] "mmHg" CLU,IBOX,TCU,TPMS + SG_ BAT_Alt_FR_Duty : 8|8@1+ (0.4,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU + SG_ VB : 24|8@1+ (0.1015625,0.0) [0.0|25.8984375] "V" CLU,CUBIS,DATC,EPB,FPCM,IBOX + SG_ EMS_VS : 32|12@1+ (0.0625,0.0) [0.0|255.875] "km/h" CLU + SG_ TEMP_FUEL : 56|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" FPCM + +BO_ 68 DATC11: 8 DATC + SG_ CF_Datc_Type : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CF_Datc_VerMaj : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CF_Datc_VerMin : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CR_Datc_OutTempC : 24|8@1+ (0.5,-41.0) [-41.0|86.5] "deg" CLU,FPCM + SG_ CR_Datc_OutTempF : 32|8@1+ (1.0,-42.0) [-42.0|213.0] "deg" CLU + SG_ CF_Datc_IncarTemp : 40|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" BCM,CLU + +BO_ 67 DATC13: 8 DATC + SG_ CF_Datc_TempDispUnit : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX + SG_ CF_Datc_ModDisp : 2|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_IonClean : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_ChgReqDisp : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_IntakeDisp : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_AutoDisp : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_FrDefLed : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX + SG_ CF_Datc_AutoDefogBlink : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_ClmScanDisp : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_AqsDisp : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_AcDisp : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_OpSts : 25|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Mtc_MaxAcDisp : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_DualDisp : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_PwrInf : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_RearManual : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_RearAutoDisp : 40|2@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Datc_RearOffDisp : 42|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_RearClimateScnDisp : 44|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_RearChgReqDisp : 46|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_RearModDisp : 48|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_RearBlwDisp : 52|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_PSModDisp : 56|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_FrontBlwDisp : 60|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX + +BO_ 66 DATC12: 8 DATC + SG_ CR_Datc_DrTempDispC : 0|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX + SG_ CR_Datc_DrTempDispF : 8|8@1+ (1.0,56.0) [58.0|90.0] "" CLU,IBOX + SG_ CR_Datc_PsTempDispC : 16|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX + SG_ CR_Datc_PsTempDispF : 24|8@1+ (1.0,56.0) [58.0|90.0] "" CLU,IBOX + SG_ CR_Datc_RearDrTempDispC : 40|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU + SG_ CR_Datc_RearDrTempDispF : 48|8@1+ (1.0,58.0) [58.0|90.0] "" CLU + SG_ CF_Datc_CO2_Warning : 56|8@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1345 CGW1: 8 BCM + SG_ CF_Gway_IGNSw : 0|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,ECS,EMS,EPB,ESC,IBOX,LVR,MDPS,SAS,SCC,ECS,EMS,EPB,ESC,IBOX,LVR,MDPS,SAS,SCC + SG_ CF_Gway_RKECmd : 3|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX + SG_ CF_Gway_DrvKeyLockSw : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ECS,EMS,IBOX,ECS,EMS,IBOX + SG_ CF_Gway_DrvKeyUnlockSw : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ECS,EMS,IBOX,ECS,EMS,IBOX + SG_ CF_Gway_DrvDrSw : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ECS,EMS,EPB,ESC,IBOX,SCC,TCU,ECS,EMS,EPB,ESC,IBOX,SCC,TCU + SG_ CF_Gway_DrvSeatBeltSw : 10|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,ESC,IBOX,PSB,TCU,EMS,EPB,ESC,IBOX,PSB,TCU + SG_ CF_Gway_TrunkTgSw : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ECS,EMS,EPB,ESC,IBOX,ECS,EMS,EPB,ESC,IBOX + SG_ CF_Gway_AstSeatBeltSw : 14|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,PSB,IBOX,PSB + SG_ CF_Gway_SMKOption : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,EMS,IBOX,SMK + SG_ CF_Gway_HoodSw : 17|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,EPB,ESC,IBOX,EMS,EPB,ESC,IBOX + SG_ CF_Gway_TurnSigLh : 19|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,IBOX,LCA,LDWS_LKAS,SCC,EMS,IBOX,LCA,LDWS_LKAS,SCC + SG_ CF_Gway_WiperIntT : 21|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_WiperIntSw : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_WiperLowSw : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_WiperHighSw : 26|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_WiperAutoSw : 27|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_RainSnsState : 28|3@1+ (1.0,0.0) [0.0|7.0] "" AFLS,EMS,IBOX,LDWS_LKAS,AFLS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_HeadLampLow : 31|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,EMS,IBOX,LDWS_LKAS,SNV,AFLS,EMS,IBOX,LDWS_LKAS,SNV + SG_ CF_Gway_HeadLampHigh : 32|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,EMS,IBOX,LDWS_LKAS,AFLS,EMS,IBOX,LDWS_LKAS + SG_ CF_Gway_HazardSw : 33|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,EMS,ESC,IBOX,LCA,LDWS_LKAS,ABS,EMS,ESC,IBOX,LCA,LDWS_LKAS + SG_ CF_Gway_AstDrSw : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,IBOX + SG_ CF_Gway_DefoggerRly : 36|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX,EMS,IBOX + SG_ CF_Gway_ALightStat : 37|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS + SG_ CF_Gway_LightSwState : 38|2@1+ (1.0,0.0) [0.0|3.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS + SG_ CF_Gway_Frt_Fog_Act : 40|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS + SG_ CF_Gway_TSigRHSw : 41|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_TSigLHSw : 42|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_DriveTypeOption : 43|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_StarterRlyState : 44|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX,EMS,IBOX,SMK + SG_ CF_Gway_PassiveAccessLock : 45|2@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX,SMK + SG_ CF_Gway_WiperMistSw : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS + SG_ CF_Gway_PassiveAccessUnlock : 48|2@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX,SMK + SG_ CF_Gway_RrSunRoofOpenState : 50|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,DATC,IBOX + SG_ CF_Gway_PassingSW : 51|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS + SG_ CF_Gway_HBAControlMode : 52|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_HLpHighSw : 53|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_InhibitRMT : 54|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,ESC,IBOX,LCA,LDWS_LKAS,MDPS,PGS,SCC,SPAS,TPMS,EPB,ESC,IBOX,LCA,LDWS_LKAS,PGS,SCC,SPAS,TPMS + SG_ CF_Gway_RainSnsOption : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_SunRoofOpenState : 57|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,DATC,IBOX,DATC,IBOX + SG_ CF_Gway_Ign1 : 58|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_Ign2 : 59|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_ParkBrakeSw : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,IBOX,SCC,ESC,IBOX,SCC + SG_ CF_Gway_TurnSigRh : 62|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,IBOX,LCA,LDWS_LKAS,SCC,EMS,IBOX,LCA,LDWS_LKAS,SCC + +BO_ 64 DATC14: 8 DATC + SG_ CF_Datc_AqsLevelOut : 0|4@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_DiagMode : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CR_Datc_SelfDiagCode : 8|8@1+ (1.0,-1.0) [0.0|254.0] "" CLU + SG_ DATC_SyncDisp : 16|4@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_OffDisp : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_SmartVentDisp : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_SmartVentOnOffStatus : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_AutoDefogSysOff_Disp : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_ADSDisp : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 832 LKAS11: 8 LDWS_LKAS + SG_ CF_Lkas_LdwsSysState : 2|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX,PSB + SG_ CF_Lkas_SysWarning : 6|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_Lkas_LdwsLHWarning : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB + SG_ CF_Lkas_LdwsRHWarning : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB + SG_ CF_Lkas_HbaLamp : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Lkas_FcwBasReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC + SG_ CR_Lkas_StrToqReq : 16|11@1+ (0.0078125,-8.0) [-8.0|8.0] "Nm" MDPS + SG_ CF_Lkas_ActToi : 27|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Lkas_ToiFlt : 28|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Lkas_HbaSysState : 29|3@1+ (1.0,0.0) [0.0|7.0] "" BCM,CLU + SG_ CF_Lkas_FcwOpt : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Lkas_HbaOpt : 34|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CGW + SG_ CF_Lkas_MsgCount : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,MDPS + SG_ CF_Lkas_FcwSysState : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Lkas_FcwCollisionWarning : 43|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Lkas_FusionState : 45|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ CF_Lkas_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS + SG_ CF_Lkas_FcwOpt_USM : 56|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Lkas_LdwsOpt_USM : 59|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,MDPS + +BO_ 1342 LKAS12: 6 LDWS_LKAS + SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_LkasTsrStatus : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1338 TMU_GW_E_01: 8 CLU + SG_ CF_Gway_TeleReqDrLock : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Gway_TeleReqDrUnlock : 2|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Gway_TeleReqHazard : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Gway_TeleReqHorn : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Gway_TeleReqEngineOperate : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + +BO_ 1078 PAS11: 4 BCM + SG_ CF_Gway_PASDisplayFLH : 0|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM + SG_ CF_Gway_PASDisplayFRH : 3|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM + SG_ CF_Gway_PASRsound : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_PASDisplayFCTR : 8|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM + SG_ CF_Gway_PASDisplayRCTR : 11|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM + SG_ CF_Gway_PASFsound : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_PASDisplayRLH : 16|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM + SG_ CF_Gway_PASDisplayRRH : 19|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM + SG_ CF_Gway_PASCheckSound : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_PASSystemOn : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_PASOption : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_PASDistance : 28|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 48 EMS18: 6 EMS + SG_ CF_Ems_DC1NumPerMSV : 0|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_DC2NumPerMSV : 8|16@1+ (1.0,0.0) [0.0|65535.0] "" DI_BOX + SG_ CR_Ems_DutyCyc1MSV : 24|8@1+ (0.1953,0.0) [0.0|49.8] "%" DI_BOX + SG_ CR_Ems_DutyCyc2MSV : 32|8@1+ (0.13725,0.0) [0.0|35.0] "%" DI_BOX + SG_ CR_Ems_DutyCyc3MSV : 40|8@1+ (0.392,0.0) [0.0|100.0] "%" DI_BOX + +BO_ 1322 CLU15: 8 CLU + SG_ CF_Clu_VehicleSpeed : 0|8@1+ (1.0,0.0) [0.0|255.0] "" BCM + SG_ CF_Clu_InhibitP : 9|1@1+ (1.0,0.0) [0.0|1.0] "" BCM + SG_ CF_Clu_InhibitR : 10|1@1+ (1.0,0.0) [0.0|1.0] "" BCM + SG_ CF_Clu_InhibitN : 11|1@1+ (1.0,0.0) [0.0|1.0] "" BCM + SG_ CF_Clu_InhibitD : 12|1@1+ (1.0,0.0) [0.0|1.0] "" BCM + SG_ CF_Clu_HudInfoSet : 13|7@1+ (1.0,0.0) [0.0|127.0] "" HUD + SG_ CF_Clu_HudFontColorSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudBrightUpSW : 22|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudBrightDnSW : 24|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudHeightUpSW : 26|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudHeightDnSW : 28|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudSet : 30|1@1+ (1.0,0.0) [0.0|1.0] "" HUD + SG_ CF_Clu_HudFontSizeSet : 31|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_LanguageInfo : 33|5@1+ (1.0,0.0) [0.0|31.0] "" BCM,PGS + SG_ CF_Clu_ClusterSound : 38|1@1- (1.0,0.0) [0.0|0.0] "" BCM,CGW,FATC + +BO_ 1066 _4WD13: 6 _4WD + SG_ _4WD_CURRENT : 0|8@1+ (0.390625,0.0) [-50.0|50.0] "A" TCU + SG_ _4WD_POSITION : 8|16@1+ (0.015625,0.0) [-180.0|180.0] "Deg" TCU + SG_ _4WD_CLU_THERM_STR : 24|8@1+ (1.0,0.0) [0.0|100.0] "%" TCU + SG_ _4WD_STATUS : 32|8@1+ (1.0,0.0) [0.0|15.0] "" ESC,TCU + +BO_ 1065 _4WD12: 8 _4WD + SG_ Ster_Pos : 0|16@1+ (1.0,-600.0) [-600.0|600.0] "Deg" ESC + SG_ FRSS : 16|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC + SG_ FLSS : 24|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC + SG_ RRSS : 32|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC + SG_ RLSS : 40|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC + SG_ CLU_PRES : 48|16@1+ (0.0625,-50.0) [-50.0|50.0] "Bar" ESC + +BO_ 809 EMS12: 8 EMS + SG_ CONF_TCU m1 : 0|6@1+ (1.0,0.0) [0.0|63.0] "" _4WD,ACU,BCM,CLU,DATC,EPB,ESC,IBOX,LCA,SMK + SG_ CAN_VERS m0 : 0|6@1+ (1.0,0.0) [0.0|7.7] "" _4WD,ABS,ESC,IBOX + SG_ TQ_STND m3 : 0|6@1+ (10.0,0.0) [0.0|630.0] "Nm" _4WD,DATC,ECS,EPB,ESC,FATC,IBOX + SG_ OBD_FRF_ACK m2 : 0|6@1+ (1.0,0.0) [0.0|63.0] "" _4WD,ESC,IBOX + SG_ MUL_CODE M : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ABS,ACU,BCM,CLU,DATC,ECS,EPB,ESC,IBOX,LCA,SMK,TCU + SG_ TEMP_ENG : 8|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" _4WD,BCM,CLU,DATC,EPB,ESC,IBOX,SMK,TCU + SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0.0) [0.0|1.99155] "" IBOX,TCU + SG_ VB_OFF_ACT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ ACK_ES : 25|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,IBOX + SG_ CONF_MIL_FMY : 26|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,IBOX,TCU + SG_ OD_OFF_REQ : 29|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ ACC_ACT : 30|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ABS,CLU,ESC,IAP,IBOX,SCC,TCU + SG_ CLU_ACK : 31|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EPB,ESC,IBOX + SG_ BRAKE_ACT : 32|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ABS,ACU,AFLS,CLU,DATC,ECS,EPB,ESC,IBOX,LDWS_LKAS,TCU + SG_ ENG_CHR : 34|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,ABS,ACU,CLU,DATC,EPB,ESC,FATC,IBOX,SCC,SMK,TCU + SG_ GP_CTL : 38|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX + SG_ TPS : 40|8@1+ (0.4694836,-15.0234742) [-15.0234742|104.6948357] "%" _4WD,ABS,ACU,CLU,DATC,ECS,EPB,ESC,IBOX,TCU + SG_ PV_AV_CAN : 48|8@1+ (0.3906,0.0) [0.0|99.603] "%" _4WD,AAF,ABS,ACU,AFLS,CLU,DATC,EPB,ESC,IAP,IBOX,LDWS_LKAS,SCC,TCU + SG_ ENG_VOL : 56|8@1+ (0.1,0.0) [0.0|25.5] "liter" _4WD,ABS,ACU,BCM,CLU,DATC,EPB,ESC,IBOX,LDWS_LKAS,SCC,SMK + +BO_ 1064 _4WD11: 8 _4WD + SG_ _4WD_TYPE : 0|2@1+ (1.0,0.0) [0.0|3.0] "" ACU,ESC,TPMS + SG_ _4WD_SUPPORT : 2|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,ESC,TPMS + SG_ _4WD_ERR : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,ESC + SG_ CLU_DUTY : 16|8@1+ (1.0,0.0) [0.0|64.0] "%" ABS,ESC + SG_ R_TIRE : 24|8@1+ (1.0,200.0) [200.0|455.0] "mm" ABS,ESC,TPMS + SG_ _4WD_SW : 32|8@1+ (1.0,0.0) [0.0|9.9] "" ESC + SG_ _2H_ACT : 40|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC + SG_ _4H_ACT : 41|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,CLU,ESC,TPMS + SG_ LOW_ACT : 42|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,TCU,TPMS + SG_ AUTO_ACT : 43|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,TPMS + SG_ LOCK_ACT : 44|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,CLU,ESC,TPMS + SG_ _4WD_TQC_CUR : 48|16@1+ (1.0,0.0) [0.0|65535.0] "Nm" ABS,ESC + +BO_ 1319 HU_GW_E_01: 8 CLU + SG_ C_ADrLNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ C_ADrUNValueSet : 4|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ C_TwUnNValueSet : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_ABuzzerNValueSet : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_ArmWKeyNValueSet : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_PSMNValueSet : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_SCMNValueSet : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_HLEscortNValueSet : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_WELNValueSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_TriTurnLNValueSet : 22|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_SNVWarnNValueSet : 24|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_LkasWarnNValueSet : 26|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + +BO_ 1318 HU_GW_E_00: 8 CLU + SG_ C_ADrLURValueReq : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_TwUnRValueReq : 2|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_AlarmRValueReq : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_IMSRValueReq : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_HLEscortRValueReq : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_WELRValueReq : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_TriTurnLRValueReq : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_SNVWarnRValueReq : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_LkasWarnRValueReq : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + +BO_ 1317 GW_HU_E_01: 8 BCM + SG_ C_ADrLRValue : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ C_ADrURValue : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ C_TwUnRValue : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_ABuzzerRValue : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_ArmWKeyRValue : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_PSMRValue : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SCMRValue : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_HLEscortRValue : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_WELRValue : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_TriTurnLRValue : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1316 GW_HU_E_00: 8 BCM + SG_ C_ADrLUNValueConf : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_TwUnNValueConf : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_AlarmNValueConf : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_PSMNValueConf : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SCMNValueConf : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_HLEscortNValueConf : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_WELNValueConf : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_TriTurnLNValueConf : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1315 GW_SWRC_PE: 8 BCM + SG_ C_ModeSW : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_MuteSW : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SeekDnSW : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SeekUpSW : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_BTPhoneCallSW : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_BTPhoneHangUpSW : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_DISCDownSW : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_DISCUpSW : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SdsSW : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_MTSSW : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_VolDnSW : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_VolUpSW : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1314 GW_IPM_PE_1: 8 BCM + SG_ C_AV_Tail : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_ParkingBrakeSW : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_RKECMD : 4|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ C_BAState : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_IGNSW : 12|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ C_CountryCfg : 16|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ C_TailLampActivity : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ RearSW_RSELockOnOff : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SMKTeleCrankingState : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SMKTeleCrankingFailRes : 34|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1057 SCC12: 8 SCC + SG_ CF_VSM_Prefill : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ CF_VSM_DecCmdAct : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ CF_VSM_HBACmd : 2|2@1+ (1.0,0.0) [0.0|3.0] "" ESC + SG_ CF_VSM_Warn : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,IAP + SG_ CF_VSM_Stat : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,PSB + SG_ CF_VSM_BeltCmd : 8|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,PSB + SG_ ACCFailInfo : 11|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,ESC,IBOX + SG_ ACCMode : 13|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,IBOX,TCU + SG_ StopReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EPB,ESC + SG_ CR_VSM_DecCmd : 16|8@1+ (0.01,0.0) [0.0|2.55] "g" ESC + SG_ aReqMax : 24|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,ESC,TCU + SG_ TakeOverReq : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,ESC,TCU + SG_ PreFill : 36|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,TCU + SG_ aReqMin : 37|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,ESC,TCU + SG_ CF_VSM_ConfMode : 48|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC + SG_ AEB_Failinfo : 50|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC + SG_ AEB_Status : 52|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC + SG_ AEB_CmdAct : 54|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ AEB_StopReq : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,ESC + SG_ CR_VSM_Alive : 56|4@1+ (1.0,0.0) [0.0|15.0] "" ESC,PSB + SG_ CR_VSM_ChkSum : 60|4@1+ (1.0,0.0) [0.0|15.0] "" ESC,PSB + +BO_ 1313 GW_DDM_PE: 8 BCM + SG_ C_DRVDoorStatus : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_ASTDoorStatus : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_RLDoorStatus : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_RRDoorStatus : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_TrunkStatus : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_OSMirrorStatus : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1056 SCC11: 8 SCC + SG_ MainMode_ACC : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,ESC + SG_ SCCInfoDisplay : 1|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ESC + SG_ AliveCounterACC : 4|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,EMS,ESC,TCU + SG_ VSetDis : 8|8@1+ (1.0,0.0) [0.0|255.0] "km/h or MPH" CLU,ESC,TCU + SG_ ObjValid : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,ESC,TCU + SG_ DriverAlertDisplay : 17|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC + SG_ TauGapSet : 19|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ESC,TCU + SG_ ACC_ObjStatus : 22|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,ESC + SG_ ACC_ObjLatPos : 24|9@1+ (0.1,-20.0) [-20.0|31.1] "m" ABS,ESC + SG_ ACC_ObjDist : 33|11@1+ (0.1,0.0) [0.0|204.7] "m" ABS,ESC + SG_ ACC_ObjRelSpd : 44|12@1+ (0.1,-170.0) [-170.0|239.5] "m/s" ABS,ESC + SG_ Navi_SCC_Curve_Status : 56|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Navi_SCC_Curve_Act : 58|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Navi_SCC_Camera_Act : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Navi_SCC_Camera_Status : 62|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1312 CGW3: 8 BCM + SG_ CR_Photosensor_LH : 0|8@1+ (78.125,0.0) [0.0|20000.0] "" DATC,DATC + SG_ CR_Photosensor_RH : 10|8@1+ (78.125,0.0) [0.0|20000.0] "" DATC,DATC + SG_ CF_Hoodsw_memory : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EMS + SG_ C_MirOutTempSns : 24|8@1+ (0.5,-40.5) [-40.0|60.0] "deg" AAF,CLU,DATC,EMS,SPAS,AAF,DATC,EMS,SPAS + +BO_ 544 ESP12: 8 ESC + SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" _4WD,ECS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,TCU + SG_ LAT_ACCEL_STAT : 11|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,IBOX,LDWS_LKAS,MDPS,PSB,SCC,TCU + SG_ LAT_ACCEL_DIAG : 12|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,IBOX,LDWS_LKAS,MDPS,PSB,SCC,TCU + SG_ LONG_ACCEL : 13|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" _4WD,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PSB,SCC,SPAS,TCU + SG_ LONG_ACCEL_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU + SG_ LONG_ACCEL_DIAG : 25|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU + SG_ CYL_PRES : 26|12@1+ (0.1,0.0) [0.0|409.5] "Bar" _4WD,ECS,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,TCU + SG_ CYL_PRES_STAT : 38|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,TCU + SG_ CYL_PRESS_DIAG : 39|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EMS,EPB,IBOX,PSB,SCC,TCU + SG_ YAW_RATE : 40|13@1+ (0.01,-40.95) [-40.95|40.96] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU + SG_ YAW_RATE_STAT : 53|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU + SG_ YAW_RATE_DIAG : 54|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU + SG_ ESP12_AliveCounter : 56|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + SG_ ESP12_Checksum : 60|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + +BO_ 1307 CLU16: 8 CLU + SG_ CF_Clu_TirePressUnitNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" TPMS + SG_ CF_Clu_SlifNValueSet : 3|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS + SG_ CF_Clu_RearWiperNValueSet : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + +BO_ 790 EMS11: 8 EMS + SG_ SWI_IGK : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ABS,ACU,AHLS,CUBIS,DI_BOX,ECS,EPB,ESC,IBOX,LDWS_LKAS,MDPS,REA,SAS,SCC,TCU + SG_ F_N_ENG : 1|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,AFLS,CLU,CUBIS,DATC,ECS,EPB,ESC,IBOX,MDPS,SCC,TCU + SG_ ACK_TCS : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ PUC_STAT : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,DATC,IBOX,TCU + SG_ TQ_COR_STAT : 4|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ESC,IBOX,TCU + SG_ RLY_AC : 6|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,IBOX,TCU + SG_ F_SUB_TQI : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EPB,ESC,IBOX,TCU + SG_ TQI_ACOR : 8|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,EPB,ESC,IBOX,TCU + SG_ N : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" _4WD,ACU,AFLS,CLU,CUBIS,DATC,ECS,EPB,ESC,FPCM,IBOX,MDPS,SCC,TCU + SG_ TQI : 32|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,ECS,EPB,ESC,IBOX,TCU + SG_ TQFR : 40|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,EPB,ESC,IBOX,TCU + SG_ VS : 48|8@1+ (1.0,0.0) [0.0|254.0] "km/h" _4WD,AAF,ACU,AHLS,BCM,CLU,DATC,ECS,EPB,IBOX,LCA,LDWS_LKAS,LVR,MDPS,ODS,SCC,SMK,SPAS,TCU,TPMS + SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0.0) [0.0|2.0] "" _4WD,IBOX,TCU + +BO_ 1301 CLU14: 8 CLU + SG_ CF_Clu_ADrUNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_ADrLNValueSet : 3|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_EscortHLNValueSet : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_DoorLSNValueSet : 8|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_PSMNValueSet : 11|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_TTUnlockNValueSet : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_PTGMNValueSet : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_SCMNValueSet : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_WlightNValueSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_TempUnitNValueSet : 22|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,DATC + SG_ CF_Clu_MoodLpNValueSet : 24|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_TrfChgSet : 27|2@1+ (1.0,0.0) [0.0|3.0] "" AFLS + SG_ CF_Clu_OTTurnNValueSet : 29|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_LcaNValueSet : 32|2@1+ (1.0,0.0) [0.0|3.0] "" LCA + SG_ CF_Clu_RctaNValueSet : 34|2@1+ (1.0,0.0) [0.0|3.0] "" LCA + SG_ CF_Clu_RcwNValueSet : 36|2@1+ (1.0,0.0) [0.0|3.0] "" LCA + SG_ CF_Clu_EscOffNValueSet : 38|3@1+ (1.0,0.0) [0.0|7.0] "" ESC + SG_ CF_Clu_SccNaviCrvNValueSet : 41|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ CF_Clu_SccNaviCamNValueSet : 43|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ CF_Clu_SccAebNValueSet : 45|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ CF_Clu_LkasModeNValueSet : 47|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS + SG_ CF_Clu_FcwNValueSet : 51|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS + SG_ CF_Clu_PasSpkrLvNValueSet : 53|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_SccDrvModeNValueSet : 56|3@1+ (1.0,0.0) [0.0|7.0] "" SCC + SG_ CF_Clu_HAnBNValueSet : 59|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_HfreeTrunkTgNValueSet : 61|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + +BO_ 275 TCU13: 8 TCU + SG_ N_TGT_LUP : 0|8@1+ (10.0,500.0) [500.0|3040.0] "rpm" EMS,IBOX + SG_ SLOPE_TCU : 8|6@1+ (0.5,-16.0) [-16.0|15.5] "%" CLU,CUBIS,EMS,IBOX + SG_ CF_Tcu_InhCda : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_IsgInhib : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_BkeOnReq : 16|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Tcu_NCStat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Tcu_TarGr : 20|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,CLU,DATC,EMS,EPB,ESC,IBOX,SCC + SG_ CF_Tcu_ShfPatt : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,CUBIS,EMS,IBOX + SG_ CF_Tcu_InhVis : 28|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_PRelReq : 29|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LVR + SG_ CF_Tcu_ITPhase : 30|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_ActEcoRdy : 31|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_TqGrdLim : 32|8@1+ (10.0,0.0) [0.0|2540.0] "Nm/s" EMS,IBOX + SG_ CR_Tcu_IsgTgtRPM : 40|8@1+ (20.0,0.0) [0.0|3500.0] "rpm" EMS,IBOX + SG_ CF_Tcu_SptRdy : 48|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Tcu_SbwPInfo : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_Alive3 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Tcu_ChkSum3 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX + +BO_ 274 TCU12: 8 TCU + SG_ ETL_TCU : 0|8@1+ (2.0,0.0) [0.0|508.0] "Nm" EMS,IBOX + SG_ CUR_GR : 8|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,ESC,IBOX,SCC,TPMS + SG_ CF_Tcu_Alive : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX,SCC + SG_ CF_Tcu_ChkSum : 14|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX,SCC + SG_ VS_TCU : 16|8@1+ (1.0,0.0) [0.0|254.0] "km/h" BCM,CLU,DATC,EMS,IBOX,LCA,LVR,PGS,SMK,SNV + SG_ FUEL_CUT_TCU : 28|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ INH_FUEL_CUT : 29|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ IDLE_UP_TCU : 30|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ N_INC_TCU : 31|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ SPK_RTD_TCU : 32|8@1+ (0.375,-23.625) [-15.0|15.0] "" EMS,IBOX + SG_ N_TC_RAW : 40|16@1+ (0.25,0.0) [0.0|16383.5] "rpm" EMS,IBOX + SG_ VS_TCU_DECIMAL : 56|8@1+ (0.0078125,0.0) [0.0|0.9921875] "km/h" CLU,EMS,IBOX,LCA + +BO_ 273 TCU11: 8 TCU + SG_ TQI_TCU_INC : 0|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,ESC,IBOX + SG_ G_SEL_DISP : 8|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,AFLS,AVM,BCM,CGW,CLU,CUBIS,ECS,EMS,EPB,ESC,IAP,IBOX,LCA,LDWS_LKAS,LVR,MDPS,PGS,SCC,SMK,SNV,SPAS,TPMS + SG_ F_TCU : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX + SG_ TCU_TYPE : 14|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,EMS,ESC,IBOX + SG_ TCU_OBD : 16|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,ESC,IBOX + SG_ SWI_GS : 19|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,ESC,IBOX,SCC + SG_ GEAR_TYPE : 20|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,CLU,EMS,ESC,IBOX,SCC + SG_ TQI_TCU : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,ESC,IBOX + SG_ TEMP_AT : 32|8@1+ (1.0,-40.0) [-40.0|214.0] "deg" AAF,CLU,CUBIS,EMS,ESC,IBOX + SG_ N_TC : 40|16@1+ (0.25,0.0) [0.0|16383.5] "rpm" _4WD,EMS,EPB,ESC,IBOX + SG_ SWI_CC : 56|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,CLU,EMS,ESC,IBOX + SG_ CF_Tcu_Alive1 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Tcu_ChkSum1 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX + +BO_ 16 ACU13: 8 ACU + SG_ CF_Acu_CshAct : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CUBIS,IBOX,ODS + +BO_ 1040 CGW_USM1: 8 BCM + SG_ CF_Gway_ATTurnRValue : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_PTGMRValue : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_EscortHLRValue : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_TTUnlockRValue : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_ADrLRValue : 8|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_ADrURValue : 11|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_SCMRValue : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_WlightRValue : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_PSMRValue : 18|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_OTTurnRValue : 21|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_DrLockSoundRValue : 24|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_HAnBRValue : 27|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_MoodLpRValue : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_HfreeTrunkRValue : 32|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_AutoLightRValue : 35|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_RearWiperRValue : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_PasSpkrLvRValue : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + +BO_ 1292 CLU13: 8 CLU + SG_ CF_Clu_LowfuelWarn : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,FPCM,IBOX + SG_ CF_Clu_RefDetMod : 2|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX + SG_ CF_Clu_AvgFCU : 3|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX + SG_ CF_Clu_AvsmCur : 5|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,SCC + SG_ CF_Clu_AvgFCI : 6|10@1+ (0.1,0.0) [0.0|102.2] "" IBOX + SG_ CF_Clu_DrivingModeSwi : 16|2@1+ (1.0,0.0) [0.0|3.0] "" DATC,ECS,EMS,ESC,IAP,MDPS,TCU + SG_ CF_Clu_FuelDispLvl : 18|5@1+ (1.0,0.0) [0.0|31.0] "" CGW,IBOX + SG_ CF_Clu_FlexSteerSW : 23|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Clu_DTE : 24|10@1+ (1.0,0.0) [0.0|1023.0] "" DATC + SG_ CF_Clu_TripUnit : 34|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ CF_Clu_SWL_Stat : 36|3@1+ (1.0,0.0) [0.0|7.0] "" ACU,EMS + SG_ CF_Clu_ActiveEcoSW : 39|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,EMS,TCU + SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CUBIS,EMS,IAP,IBOX + SG_ CF_Clu_IsaMainSW : 43|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Clu_LdwsLkasSW : 56|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Clu_AltLStatus : 59|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,DATC,EMS + SG_ CF_Clu_AliveCnt2 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,LDWS_LKAS + +BO_ 1290 SCC13: 8 SCC + SG_ SCCDrvModeRValue : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ SCC_Equip : 3|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ AebDrvSetStatus : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ESC + +BO_ 1287 TCS15: 4 ESC + SG_ ABS_W_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,CUBIS,IBOX + SG_ TCS_OFF_LAMP : 1|2@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,CLU + SG_ TCS_LAMP : 3|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ACU,CLU,CUBIS,IBOX,SCC + SG_ DBC_W_LAMP : 5|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU + SG_ DBC_F_LAMP : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,CLU + SG_ ESC_Off_Step : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ AVH_CLU : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,EPB + SG_ AVH_I_LAMP : 24|2@1+ (1.0,0.0) [0.0|3.0] "" EPB + SG_ EBD_W_LAMP : 26|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU + SG_ AVH_ALARM : 27|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ AVH_LAMP : 29|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EPB,SPAS + +BO_ 1282 TCU14: 4 TCU + SG_ CF_TCU_WarnMsg : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_TCU_WarnImg : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_TCU_WarnSnd : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Tcu_GSel_BlinkReq : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,LVR + SG_ CF_Tcu_StRelStat : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,ESC + SG_ CF_Tcu_DriWarn1 : 13|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,ESC + SG_ CF_Tcu_DriWarn2 : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,ESC + +BO_ 1281 ECS11: 3 ECS + SG_ ECS_W_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,IBOX + SG_ SYS_NA : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ ECS_DEF : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ ECS_DIAG : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ L_CHG_NA : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ Leveling_Off : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ LC_overheat : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ Lifting : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ Lowering : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ Damping_Mode : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ REQ_Damping : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ REQ_Height : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ REQ_level : 16|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ ACT_Height : 20|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + +BO_ 1024 CLU_CFG11: 2 CLU + SG_ Vehicle_Type : 0|16@1+ (1.0,0.0) [0.0|65536.0] "" _4WD + +BO_ 1280 ACU14: 1 ACU + SG_ CF_SWL_Ind : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_TTL_Ind : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_SBR_Ind : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + +BO_ 512 EMS20: 6 EMS + SG_ FCO : 0|16@1+ (0.128,0.0) [0.0|8388.48] "ul" CLU,CUBIS,FPCM,IBOX + SG_ CF_Ems_PumpTPres : 16|8@1+ (3.137254902,0.0) [0.0|800.0] "kPa" FPCM,IBOX + SG_ Split_Stat : 32|1@1+ (1.0,0.0) [0.0|1.0] "" FPCM diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_2015_mcan.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_2015_mcan.dbc new file mode 100644 index 000000000..6bcd771e5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_2015_mcan.dbc @@ -0,0 +1,1564 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: CLOCK HUD H_U DATC CCP KMA_TMU CUBIS TMU IPM RSE_R RRC CGW RSE_L AMP EDT SWRC IBOX CLU FHCU ASD MON AVM KBD + + +BO_ 3221225472 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX + SG_ C_WHEEL_FL : 0|12@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_WHEEL_FR : 0|12@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_WHEEL_RL : 0|12@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_WHEEL_RR : 0|12@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 2046 TP_EDT_AMP: 8 EDT + SG_ Byte0_TCP_7FE : 7|8@0+ (1,0) [0|0] "" AMP + SG_ Byte1_Data_7FE : 15|8@0+ (1,0) [0|0] "" AMP + SG_ Byte2_Data_7FE : 23|8@0+ (1,0) [0|0] "" AMP + SG_ Byte3_Data_7FE : 31|8@0+ (1,0) [0|0] "" AMP + SG_ Byte4_Data_7FE : 39|8@0+ (1,0) [0|0] "" AMP + SG_ Byte5_Data_7FE : 47|8@0+ (1,0) [0|0] "" AMP + SG_ Byte6_Data_7FE : 55|8@0+ (1,0) [0|0] "" AMP + SG_ Byte7_Data_7FE : 63|8@0+ (1,0) [0|0] "" AMP + +BO_ 251 HU_TMU_E_02: 8 H_U + SG_ HU_GPS_Year : 7|8@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ HU_GPS_Month : 15|8@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ HU_GPS_Day : 23|8@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ HU_GPS_Hour : 31|8@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ HU_GPS_Minute : 39|8@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ HU_GPS_Second : 47|8@0+ (1,0) [0|0] "" CUBIS,TMU + +BO_ 250 HU_TMU_E_01: 8 H_U + SG_ HU_VoiceRecCom : 2|3@0+ (1,0) [0|0] "" TMU + SG_ HU_LangChgCom : 5|3@0+ (1,0) [0|0] "" TMU + SG_ HU_CallEndCmd : 9|2@0+ (1,0) [0|0] "" TMU + SG_ HU_ServiceReqtID : 13|4@0+ (1,0) [0|0] "" TMU + SG_ HU_MicReqCmd : 15|2@0+ (1,0) [0|0] "" TMU + SG_ HU_SeviceAction : 18|3@0+ (1,0) [0|0] "" TMU + SG_ HU_eCallStatus : 20|2@0+ (1,0) [0|0] "" TMU + +BO_ 1269 TP_CLU_ANDAUTO_HU: 8 CLU + SG_ Byte0_TCP_4F5 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4F5 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4F5 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4F5 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4F5 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4F5 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4F5 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4F5 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1268 TP_HU_ANDAUTO_CLU: 8 H_U + SG_ Byte0_TCP_4F4 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4F4 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4F4 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4F4 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4F4 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4F4 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4F4 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4F4 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1267 TP_CLU_CARPLAY_HU: 8 CLU + SG_ Byte0_TCP_4F3 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4F3 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4F3 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4F3 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4F3 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4F3 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4F3 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4F3 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1266 TP_HU_CARPLAY_CLU: 8 H_U + SG_ Byte0_TCP_4F2 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4F2 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4F2 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4F2 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4F2 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4F2 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4F2 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4F2 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1263 TP_CLU_IBOX_HU: 8 CLU + SG_ Byte0_TCP_4EF : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4EF : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4EF : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4EF : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4EF : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4EF : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4EF : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4EF : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1262 TP_HU_IBOX_CLU: 8 H_U + SG_ Byte0_TCP_4EE : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4EE : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4EE : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4EE : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4EE : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4EE : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4EE : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4EE : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1261 TP_CLU_DLNA_HU: 8 CLU + SG_ Byte0_TCP_4ED : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4ED : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4ED : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4ED : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4ED : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4ED : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4ED : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4ED : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1260 TP_HU_DLNA_CLU: 8 H_U + SG_ Byte0_TCP_4EC : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4EC : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4EC : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4EC : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4EC : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4EC : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4EC : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4EC : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 491 GW_DDM_PE: 8 CLU + SG_ C_DRVDoorStatus : 1|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ C_ASTDoorStatus : 3|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ C_RLDoorStatus : 5|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ C_RRDoorStatus : 7|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ C_TrunkStatus : 9|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ C_OSMirrorStatus : 11|2@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CUBIS,DATC,EDT,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + +BO_ 1259 TP_CLU_MP_HU: 8 CLU + SG_ Byte0_TCP_4EB : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4EB : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4EB : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4EB : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4EB : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4EB : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4EB : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4EB : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1258 TP_HU_MP_CLU: 8 H_U + SG_ Byte0_TCP_4EA : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4EA : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4EA : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4EA : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4EA : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4EA : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4EA : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4EA : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1257 TP_CLU_FM_HU: 8 CLU + SG_ Byte0_TCP_4E9 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4E9 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4E9 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4E9 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4E9 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4E9 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4E9 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4E9 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1256 TP_HU_FM_CLU: 8 H_U + SG_ Byte0_TCP_4E8 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4E8 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4E8 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4E8 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4E8 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4E8 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4E8 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4E8 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1255 TP_CLU_MLT_HU: 8 CLU + SG_ Byte0_TCP_4E7 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4E7 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4E7 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4E7 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4E7 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4E7 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4E7 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4E7 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 487 HU_CLU_PE_13: 8 H_U + SG_ Navi_DistToPoint1_F : 11|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToPoint1_I : 7|12@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToPoint1_U : 23|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToPoint2_I : 19|12@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToPoint2_F : 35|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToPoint2_U : 39|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToPoint3_F : 51|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToPoint3_I : 47|12@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToPoint3_U : 63|4@0+ (1,0) [0|0] "" CLU,HUD + +BO_ 1254 TP_HU_MLT_CLU: 8 H_U + SG_ Byte0_TCP_4E6 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4E6 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4E6 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4E6 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4E6 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4E6 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4E6 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4E6 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 486 HU_CLU_PE_12: 8 H_U + SG_ Navi_DistToDest_I : 7|16@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToDest_F : 19|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_DistToDest_U : 23|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_EstimHour : 31|8@0+ (1,0) [0|254] "hh" CLU,HUD + SG_ Navi_EstimMin : 37|6@0+ (1,0) [0|59] "mm" CLU,HUD + SG_ Navi_EstimTimeType : 39|2@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_Compass : 45|6@0+ (7.5,-7.5) [0|352.5] "Degree" CLU,HUD + +BO_ 229 HU_SYS_E_00: 8 H_U + SG_ SYS_SW_Ver_Req : 1|2@0+ (1,0) [0|0] "" AMP,CCP,CGW,CLOCK,CLU,HUD,IBOX,RRC,RSE_L + SG_ SYS_CAN_Ver_Req : 3|2@0+ (1,0) [0|0] "" AMP,CCP,CGW,CLOCK,CLU,HUD,IBOX,RRC,RSE_L + SG_ SYS_HW_Ver_Req : 5|2@0+ (1,0) [0|0] "" AMP,CCP,CGW,CLOCK,CLU,IBOX,RRC + SG_ SYS_RBD_Req : 9|2@0+ (1,0) [0|0] "" AMP,IBOX + SG_ SYS_MOSTErrorDiag_Req : 11|2@0+ (1,0) [0|0] "" AMP,IBOX + SG_ SYS_Reset_Req : 17|2@0+ (1,0) [0|0] "" AMP,IBOX + +BO_ 1253 TP_CLU_VCDC_HU: 8 CLU + SG_ Byte0_TCP_4E5 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4E5 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4E5 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4E5 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4E5 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4E5 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4E5 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4E5 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 485 HU_CLU_PE_11: 8 H_U + SG_ Navi_FixedSpdTrap : 3|4@0+ (10,0) [10|110] "Km/h" CLU,HUD + SG_ Navi_MobileSpdTrap : 7|4@0+ (10,0) [10|110] "Km/h" CLU,HUD + SG_ Navi_OverSpdAlarm : 11|2@0+ (1,0) [0|0] "" CGW,CLU,HUD + SG_ Navi_SpdRedlightTrap : 15|4@0+ (10,0) [10|110] "Km/h" CLU,HUD + SG_ Navi_NonSpdTrap : 20|5@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_WarningZone : 27|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_MergeWarning : 33|2@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_CurveWarning : 39|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_BusSpdTrap : 43|4@0+ (10,0) [10|110] "Km/h" CLU,HUD + SG_ Navi_SpdLimit_Type : 49|2@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_SpdLimit_Unit : 51|2@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_SpdInfo_Type : 55|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ Navi_SpdLimit : 63|8@0+ (1,0) [1|254] "" CLU,HUD + +BO_ 1252 TP_HU_VCDC_CLU: 8 H_U + SG_ Byte0_TCP_4E4 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4E4 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4E4 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4E4 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4E4 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4E4 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4E4 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4E4 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1251 TP_CLU_JB_HU: 8 CLU + SG_ Byte0_TCP_4E3 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4E3 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4E3 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4E3 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4E3 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4E3 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4E3 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4E3 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1250 TP_HU_JB_CLU: 8 H_U + SG_ Byte0_TCP_4E2 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4E2 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4E2 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4E2 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4E2 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4E2 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4E2 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4E2 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1248 TP_TMU_HU: 8 TMU + SG_ Byte0_TCP_4E0 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4E0 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4E0 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4E0 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4E0 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4E0 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4E0 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4E0 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 479 CLU_HU_PE_01: 8 CLU + SG_ CLU_Type : 7|8@0+ (1,0) [0|0] "" H_U + SG_ CLU_Region : 15|8@0+ (1,0) [0|0] "" H_U + SG_ CLU_VersionMinor : 23|8@0+ (1,0) [0|0] "" H_U + SG_ CLU_VersionMajor : 31|8@0+ (1,0) [0|0] "" H_U + SG_ CLU_CurrentDispState : 39|8@0+ (1,0) [0|0] "" H_U + SG_ C_DRVDRSW : 41|2@0+ (1,0) [0|0] "" H_U + SG_ CF_Clu_LowfuelWarning : 44|2@0+ (1,0) [0|0] "" H_U + SG_ CLU_PowerInfo : 46|2@0+ (1,0) [0|0] "" H_U + SG_ C_DrivingModeState : 50|3@0+ (1,0) [0|0] "" H_U + SG_ Clu_RheostatLvl : 55|5@0+ (1,0) [0|0] "" H_U,MON,SWRC + SG_ C_Clu_ActiveEcoSW : 57|2@0+ (1,0) [0|0] "" H_U + SG_ C_Detent : 59|2@0+ (1,0) [0|0] "" CCP,CLOCK,H_U,KBD,MON,RRC,RSE_L,RSE_R + SG_ C_DrivingModeOn : 61|2@0+ (1,0) [0|0] "" H_U + +BO_ 2015 TP_EDT_All_Req: 8 EDT + SG_ Byte0_TCP_7DF : 7|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + SG_ Byte1_Data_7DF : 15|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + SG_ Byte2_Data_7DF : 23|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + SG_ Byte3_Data_7DF : 31|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + SG_ Byte4_Data_7DF : 39|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + SG_ Byte5_Data_7DF : 47|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + SG_ Byte6_Data_7DF : 55|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + SG_ Byte7_Data_7DF : 63|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,FHCU,HUD,H_U,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + +BO_ 474 CLU_HU_PE_02: 8 CLU + SG_ CF_Clu_AvgFCU : 1|2@0+ (1,0) [0|0] "" H_U + SG_ CF_Clu_AvgFCL : 9|10@0+ (1,0) [0|0] "" H_U + SG_ CF_Clu_TermAvgSync : 25|2@0+ (1,0) [0|0] "" H_U + SG_ CF_Clu_EcoDriveInf : 36|3@0+ (1,0) [0|0] "" H_U + SG_ CR_Clu_TermAvgFCI : 33|10@0+ (1,0) [0|0] "" H_U + SG_ CF_CLU_EcoScore : 55|16@0+ (1,0) [0|0] "" H_U + +BO_ 1495 CLU_HU_P_05: 8 CLU + SG_ Clu_TripUnit : 9|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ Clu_DTEWarn : 11|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ Clu_DTE : 7|12@0+ (1,0) [0|1500] "km" H_U,IBOX + SG_ Clu_AFC : 23|10@0+ (0.1,0) [0|99.9] "" H_U,IBOX + SG_ Clu_IFC : 29|10@0+ (0.1,0) [0|99.9] "" H_U,IBOX + SG_ Clu_Odometer : 47|24@0+ (1,0) [0|999999] "" H_U,IBOX + +BO_ 1494 CLU_HU_P_01: 8 CLU + SG_ CF_TripUnit : 13|2@0+ (1,0) [0|0] "" H_U + SG_ CF_DTE : 7|10@0+ (1,0) [0|0] "" H_U + +BO_ 214 AMP_HU_E_SYS: 8 AMP + SG_ AMP_SWVerMajor : 7|8@0+ (1,0) [0|254] "" H_U,IBOX + SG_ AMP_SWVerMinor : 15|8@0+ (1,0) [0|254] "" H_U,IBOX + SG_ AMP_CANVerMajor : 23|8@0+ (1,0) [0|254] "" H_U,IBOX + SG_ AMP_CANVerMinor : 31|8@0+ (1,0) [0|254] "" H_U,IBOX + SG_ AMP_RBDResult : 34|3@0+ (1,0) [0|0] "" H_U + SG_ AMP_MOSTErrorDiagResult : 38|3@0+ (1,0) [0|0] "" H_U + SG_ AMP_HWVerMajor : 55|8@0+ (1,0) [0|254] "" H_U,IBOX + SG_ AMP_HWVerMinor : 63|8@0+ (1,0) [0|254] "" H_U,IBOX + +BO_ 1492 CLU_HU_P_04: 8 CLU + SG_ MM_CR_Fatc_AcnComCst_W : 7|10@0+ (10,0) [0|8000] "W" H_U + SG_ MM_CR_Ldc_PwrMon_W : 12|8@0+ (10,0) [0|2550] "W" H_U + SG_ MM_CR_Fatc_PTCPwrCon_W : 17|10@0+ (10,0) [0|10000] "W" H_U + SG_ MM_CR_BmsChgExp_T_Fast : 39|16@0+ (1,0) [0|0] "minute" H_U + SG_ MM_CR_BmsChgExp_T_Slow : 55|16@0+ (1,0) [0|0] "minute" H_U + +BO_ 1491 CLU_HU_P_03: 8 CLU + SG_ MM_CF_Vcu_EvMod : 3|4@0+ (1,0) [0|0] "" H_U + SG_ MM_CF_Vcu_GarSelDisp : 7|4@0+ (999,0) [0|0] "" H_U + SG_ MM_CF_Vcu_ThiBatTir : 8|1@0+ (1,0) [0|0] "" H_U + SG_ CR_Mcu_MotEstTqPc : 23|10@0+ (0.2,-100) [-100|99.8] "%" H_U + SG_ CR_Mcu_MotActRotSpd_rpm : 39|16@0+ (1,-32768) [-32768|32767] "rpm" H_U + +BO_ 1490 CLU_HU_P_02: 8 CLU + SG_ MM_CR_Vcu_EcoSco : 3|4@0+ (1,0) [0|0] "" H_U + SG_ MM_CF_Vcu_PgmRun5 : 5|2@0+ (1,0) [0|0] "" H_U + SG_ MM_CR_Clu_Odometer_kph : 15|24@0+ (0.1,0) [0|0] "km" H_U + +BO_ 1489 DATC_P_B_01: 8 CLU + SG_ C_InhibitR_DATC : 51|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_InhibitP_DATC : 50|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_InhibitN_DATC : 49|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_InhibitD_DATC : 48|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 465 CLU_HU_PE_03: 8 CLU + SG_ CF_Clu_EVDTEDisp : 0|9@0+ (1,0) [0|0] "" H_U,IBOX + SG_ CF_Clu_GasDTEDisp : 17|10@0+ (1,0) [0|0] "" H_U,IBOX + SG_ MM_CR_Clu_TotalDTEDisp : 34|11@0+ (1,0) [0|0] "" H_U,IBOX + SG_ CF_Clu_TripUnit : 49|2@0+ (1,0) [0|0] "" H_U,IBOX + +BO_ 1232 TP_HU_TMU: 8 H_U + SG_ Byte0_TCP_4D0 : 7|8@0+ (1,0) [0|0] "" TMU + SG_ Byte1_Data_4D0 : 15|8@0+ (1,0) [0|0] "" TMU + SG_ Byte2_Data_4D0 : 23|8@0+ (1,0) [0|0] "" TMU + SG_ Byte3_Data_4D0 : 31|8@0+ (1,0) [0|0] "" TMU + SG_ Byte4_Data_4D0 : 39|8@0+ (1,0) [0|0] "" TMU + SG_ Byte5_Data_4D0 : 47|8@0+ (1,0) [0|0] "" TMU + SG_ Byte6_Data_4D0 : 55|8@0+ (1,0) [0|0] "" TMU + SG_ Byte7_Data_4D0 : 63|8@0+ (1,0) [0|0] "" TMU + +BO_ 1488 CLU_HU_P_00: 8 CLU + SG_ MM_CR_Mcu_VehSpd_Kph : 7|8@0+ (1,0) [0|0] "" H_U + SG_ MM_CR_Mcu_VehSpdDec_Kph : 15|8@0+ (1,0) [0|0] "" H_U + SG_ MM_CR_Bms_Soc_Pc : 23|8@0+ (1,0) [0|0] "" H_U + SG_ MM_CR_Vcu_TqMotClu_Pc : 31|8@0+ (1,-127) [0|0] "" H_U + SG_ MM_CR_Bms_DrvEnaDist : 39|8@0+ (1,0) [0|0] "" H_U + SG_ MM_CR_Clu_Soc_Seg : 44|5@0+ (1,0) [0|0] "" H_U,IBOX + +BO_ 208 CLU_HU_E_SYS: 8 CLU + SG_ CLU_SWVerMajor : 7|8@0+ (1,0) [0|254] "" H_U + SG_ CLU_SWVerMinor : 15|8@0+ (1,0) [0|254] "" H_U + SG_ CLU_CANVerMajor : 23|8@0+ (1,0) [0|254] "" H_U + SG_ CLU_CANVerMinor : 31|8@0+ (1,0) [0|254] "" H_U + SG_ CLU_HWVerMajor : 55|8@0+ (1,0) [0|254] "" H_U + SG_ CLU_HWVerMinor : 63|8@0+ (1,0) [0|254] "" H_U + +BO_ 448 HU_DATC_PE_00: 8 H_U + SG_ DATC_AqsLevelChg : 3|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ RSELockOnOff : 7|2@0+ (1,0) [0|0] "" CGW,DATC,IPM,RRC + SG_ DATC_AqsMode : 9|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_Graphreset_Info : 17|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_VRActivity : 33|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_PhoneActivity : 35|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ BlowerNoiseControl : 37|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + +BO_ 1211 TP_HU_TBT_CLU: 8 H_U + SG_ Byte0_TCP_4BB : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4BB : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4BB : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4BB : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4BB : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4BB : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4BB : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4BB : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1207 TP_HU_DAB_CLU: 8 H_U + SG_ Byte0_TCP_4B7 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4B7 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4B7 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4B7 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4B7 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4B7 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4B7 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4B7 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1206 TP_HU_XM_CLU: 8 H_U + SG_ Byte0_TCP_4B6 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4B6 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4B6 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4B6 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4B6 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4B6 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4B6 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4B6 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1204 TP_HU_DMB_CLU: 8 H_U + SG_ Byte0_TCP_4B4 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_4B4 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_4B4 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_4B4 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_4B4 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_4B4 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_4B4 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_4B4 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 432 TMU_GW_PE_01: 8 TMU + SG_ C_DATCOnOffReq : 1|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM + SG_ C_DATCTempUnit : 3|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM + SG_ C_DATCTempSet : 15|8@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM + SG_ TMU_IVRActivity : 33|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM + SG_ TMU_PhoneActivity : 35|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM + +BO_ 1195 TP_CLU_TBT_HU: 8 CLU + SG_ Byte0_TCP_4AB : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4AB : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4AB : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4AB : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4AB : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4AB : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4AB : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4AB : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1191 TP_CLU_DAB_HU: 8 CLU + SG_ Byte0_TCP_4A7 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4A7 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4A7 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4A7 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4A7 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4A7 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4A7 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4A7 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1190 TP_CLU_XM_HU: 8 CLU + SG_ Byte0_TCP_4A6 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4A6 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4A6 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4A6 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4A6 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4A6 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4A6 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4A6 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1188 TP_CLU_DMB_HU: 8 CLU + SG_ Byte0_TCP_4A4 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_4A4 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_4A4 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_4A4 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_4A4 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_4A4 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_4A4 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_4A4 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1179 TP_HU_NAVI_CLU: 8 H_U + SG_ Byte0_TCP_49B : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_49B : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_49B : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_49B : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_49B : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_49B : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_49B : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_49B : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1178 TP_CLU_Ipod_HU: 8 CLU + SG_ Byte0_TCP_49A : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_49A : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_49A : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_49A : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_49A : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_49A : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_49A : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_49A : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 410 HU_CLU_PE_08: 8 H_U + SG_ VCDC_SelDiscNo : 11|4@0+ (1,0) [0|0] "" CLU + SG_ VCDC_TrackChapterNo : 7|10@0+ (1,0) [0|0] "" CLU + SG_ VCDC_PlayTime : 23|24@0+ (1,0) [0|0] "" CLU + SG_ MLT_PlayTime : 47|24@0+ (1,0) [0|0] "" CLU + +BO_ 1176 TP_CLU_DVD_HU: 8 CLU + SG_ Byte0_TCP_498 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_498 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_498 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_498 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_498 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_498 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_498 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_498 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 1175 TP_CLU_USB_HU: 8 CLU + SG_ Byte0_TCP_497 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_497 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_497 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_497 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_497 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_497 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_497 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_497 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 407 HU_CLU_PE_05: 8 H_U + SG_ HU_LanguageInfo : 7|8@0+ (1,0) [0|0] "" CLU,HUD + SG_ HU_MuteStatus : 9|2@0+ (1,0) [0|0] "" CLU,HUD + SG_ HU_VolumeStatus : 15|6@0+ (1,0) [0|0] "" CLU,HUD + SG_ HU_NaviDisp : 17|2@0+ (1,0) [0|0] "" CLU,HUD + SG_ HU_NaviStatus : 19|2@0+ (1,0) [0|0] "" CGW,CLU,HUD,IPM + SG_ HU_DistanceUnit : 21|2@0+ (1,0) [0|0] "" CLU,HUD + SG_ HU_Navigation_On_Off : 23|2@0+ (1,0) [0|0] "" AVM,CGW,CLU,DATC,HUD,IPM + +BO_ 1942 TP_AMP_HU_DiagRes: 8 AMP + SG_ Byte0_TCP_796 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_796 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_796 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_796 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_796 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_796 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_796 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_796 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 406 HU_CLU_PE_04: 8 H_U + SG_ C_SDARS_ChannelNo : 7|8@0+ (1,0) [0|0] "" CLU + SG_ C_NaviRouteGuidance : 11|2@0+ (1,0) [0|0] "" CLU + SG_ HD_SPS_ChannelNo : 15|4@0+ (1,0) [0|0] "" CLU + SG_ C_SDARS_PresetNo : 19|4@0+ (1,0) [0|0] "" CLU + SG_ DAB_ServiceFollowing : 21|2@0+ (1,0) [0|0] "" CLU + SG_ SXM_ChannelNo : 25|10@0+ (1,0) [0|999] "" AMP,CLU,HUD + +BO_ 1941 TP_HU_AMP_DiagReq: 8 H_U + SG_ Byte0_TCP_795 : 7|8@0+ (1,0) [0|0] "" AMP + SG_ Byte1_Data_795 : 15|8@0+ (1,0) [0|0] "" AMP + SG_ Byte2_Data_795 : 23|8@0+ (1,0) [0|0] "" AMP + SG_ Byte3_Data_795 : 31|8@0+ (1,0) [0|0] "" AMP + SG_ Byte4_Data_795 : 39|8@0+ (1,0) [0|0] "" AMP + SG_ Byte5_Data_795 : 47|8@0+ (1,0) [0|0] "" AMP + SG_ Byte6_Data_795 : 55|8@0+ (1,0) [0|0] "" AMP + SG_ Byte7_Data_795 : 63|8@0+ (1,0) [0|0] "" AMP + +BO_ 1173 TP_CLU_CD_HU: 8 CLU + SG_ Byte0_TCP_495 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_495 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_495 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_495 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_495 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_495 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_495 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_495 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 405 HU_CLU_PE_03: 8 H_U + SG_ HU_IntegPresetNum : 7|8@0+ (1,0) [0|0] "" AMP,CLU,HUD + SG_ Radio_Area : 10|8@0+ (1,0) [0|0] "" CLU + SG_ DMB_PresetNo : 29|5@0+ (1,0) [0|0] "" CLU + SG_ RADIO_PresetNo : 18|5@0+ (1,0) [0|0] "" CLU + SG_ HU_Opstate_DIS2 : 38|7@0+ (1,0) [0|0] "" AMP,CLU,HUD + +BO_ 1168 TP_HU_USB_CLU: 8 H_U + SG_ Byte0_TCP_490 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_490 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_490 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_490 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_490 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_490 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_490 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_490 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1936 TP_HU_All_Req: 8 H_U + SG_ Byte0_TCP_790 : 7|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ Byte1_Data_790 : 15|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ Byte2_Data_790 : 23|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ Byte3_Data_790 : 31|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ Byte4_Data_790 : 39|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ Byte5_Data_790 : 47|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ Byte6_Data_790 : 55|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + SG_ Byte7_Data_790 : 63|8@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CGW,CLOCK,CLU,CUBIS,DATC,EDT,FHCU,HUD,IBOX,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,SWRC,TMU + +BO_ 1167 TP_HU_Ipod_CLU: 8 H_U + SG_ Byte0_TCP_48F : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_48F : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_48F : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_48F : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_48F : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_48F : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_48F : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_48F : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1166 TP_HU_DVD_CLU: 8 H_U + SG_ Byte0_TCP_48E : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_48E : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_48E : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_48E : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_48E : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_48E : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_48E : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_48E : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1165 TP_HU_CD_CLU: 8 H_U + SG_ Byte0_TCP_48D : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_48D : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_48D : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_48D : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_48D : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_48D : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_48D : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_48D : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 1164 TP_CLU_NAVI_HU: 8 CLU + SG_ Byte0_TCP_48C : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_48C : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_48C : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_48C : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_48C : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_48C : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_48C : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_48C : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 139 AMP_HU_E_12: 8 AMP + SG_ AMP_Beep2VolumeState : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep2FrequencyState : 15|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep2OutputMaskState : 31|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep2DOnState : 47|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep2DOffState : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep2NOfCycleState : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 138 AMP_HU_E_11: 8 AMP + SG_ AMP_Beep1VolumeState : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep1FrequencyState : 15|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep1OutputMaskState : 31|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep1DOnState : 47|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep1DOffState : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep1NOfCycleState : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 137 AMP_HU_E_10: 8 AMP + SG_ AMP_MTSOutputMaskSupport : 1|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_MTSMuteMaskSupport : 5|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_HFOutputMaskSupport : 9|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_HFMuteMaskSupport : 13|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_NaviOutputMaskSupport : 17|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_NaviMuteMaskSupport : 21|2@0+ (1,0) [0|0] "" H_U + +BO_ 1928 TP_HU_PhyRes: 8 H_U + SG_ Byte0_TCP_788 : 7|8@0+ (1,0) [0|0] "" EDT + SG_ Byte1_Data_788 : 15|8@0+ (1,0) [0|0] "" EDT + SG_ Byte2_Data_788 : 23|8@0+ (1,0) [0|0] "" EDT + SG_ Byte3_Data_788 : 31|8@0+ (1,0) [0|0] "" EDT + SG_ Byte4_Data_788 : 39|8@0+ (1,0) [0|0] "" EDT + SG_ Byte5_Data_788 : 47|8@0+ (1,0) [0|0] "" EDT + SG_ Byte6_Data_788 : 55|8@0+ (1,0) [0|0] "" EDT + SG_ Byte7_Data_788 : 63|8@0+ (1,0) [0|0] "" EDT + +BO_ 136 AMP_HU_E_09: 8 AMP + SG_ AMP_MaxBeep2VolumeState : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBeep2Freq_State : 15|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep2OutputMaskSup : 33|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBeep2DOnState : 47|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBeep2DOffState : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBeep2NOfCycleState : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 135 AMP_HU_E_08: 8 AMP + SG_ AMP_MaxBeep1VolumeState : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBeep1Freq_State : 15|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_Beep1OutputMaskSup : 33|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBeep1DOnState : 47|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBeep1DOffState : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBeep1NOfCycleState : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 134 AMP_HU_E_07: 8 AMP + SG_ ASD_SetValue : 2|3@0+ (1,0) [0|0] "" H_U,IBOX + SG_ ASD_Version : 15|8@0+ (1,0) [0|0] "" H_U,IBOX + +BO_ 1157 TP_HU_CLU_HF: 8 H_U + SG_ Byte0_TCP_485 : 7|8@0+ (1,0) [0|0] "" CLU + SG_ Byte1_Data_485 : 15|8@0+ (1,0) [0|0] "" CLU + SG_ Byte2_Data_485 : 23|8@0+ (1,0) [0|0] "" CLU + SG_ Byte3_Data_485 : 31|8@0+ (1,0) [0|0] "" CLU + SG_ Byte4_Data_485 : 39|8@0+ (1,0) [0|0] "" CLU + SG_ Byte5_Data_485 : 47|8@0+ (1,0) [0|0] "" CLU + SG_ Byte6_Data_485 : 55|8@0+ (1,0) [0|0] "" CLU + SG_ Byte7_Data_485 : 63|8@0+ (1,0) [0|0] "" CLU + +BO_ 133 AMP_HU_E_06: 8 AMP + SG_ AMP_MaxVolumeStep : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBalanceStep : 15|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxFadeStep : 23|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxBassStep : 31|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxMidStep : 39|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxTrebleStep : 47|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_ASDMajorVer : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_ASDMinorVer : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 389 AMP_HU_PE_05: 8 AMP + SG_ AMP_EngOrderC2Setting : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_EngOrderC4Setting : 15|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_EngOrderC6Setting : 23|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_APSBand0Setting : 31|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_APSBand1Setting : 39|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_APSBand2Setting : 47|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_APSBand3Setting : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_APSBand4Setting : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 132 AMP_HU_E_05: 8 AMP + SG_ AMP_HFVolumeState : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_HFAudioCutState : 15|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_HFOutputMaskState : 23|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_HFMuteMaskState : 39|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxHFVolumeState : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxHFAudioCutState : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 388 AMP_HU_PE_04: 8 AMP + SG_ AMP_PESSModeState : 1|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_PESSDesignSetting : 4|3@0+ (1,0) [0|0] "" H_U + SG_ AMP_PESSAPSSetting : 7|3@0+ (1,0) [0|0] "" H_U + SG_ AMP_PESSVolumeSetting : 15|8@0+ (1,0) [0|0] "" H_U + +BO_ 1156 TP_CLU_HF_HU: 8 CLU + SG_ Byte0_TCP_484 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_484 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_484 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_484 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_484 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_484 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_484 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_484 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 131 AMP_HU_E_04: 8 AMP + SG_ AMP_MTSVolumeState : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MTSAudioCutState : 15|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MTSOutputMaskState : 23|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_MTSMuteMaskState : 39|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxMTSVolumeState : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxMTSAudioCutState : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 387 AMP_HU_PE_03: 8 AMP + SG_ AMP_MainVolumeSetting : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_BalanceSetting : 15|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_FadeSetting : 23|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_BassSetting : 31|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MidSetting : 39|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_TrebleSetting : 47|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_VehicleSpeedamp : 55|8@0+ (1,0) [0|0] "" H_U + +BO_ 130 AMP_HU_E_03: 8 AMP + SG_ AMP_NaviVolumeState : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_NaviAudioCutState : 15|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_NaviOutputMaskState : 23|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_NaviMuteMaskState : 39|16@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxNaviVolumeState : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_MaxNaviAudioCutState : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 129 AMP_HU_E_02: 8 AMP + SG_ AMP_DriveState : 1|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_ConvertibleTopState : 5|2@0+ (1,0) [0|0] "" H_U + +BO_ 385 AMP_HU_PE_02: 8 AMP + SG_ AMP_MuteState : 1|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_RearSpMuteState : 3|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SurroundModeState : 9|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_EQState : 13|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SPDIFMuteSt : 17|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_BeatsModeState : 21|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_DefaultBeep1St : 25|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_DefaultBeep2St : 29|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_AudioSource : 39|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_VIPModeState : 41|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_QLSModeState : 43|2@0+ (1,0) [0|0] "" H_U + +BO_ 128 AMP_HU_E_01: 8 AMP + SG_ AMP_CurrentVehicleID : 7|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_SPDIFModeState : 11|4@0+ (1,0) [0|0] "" H_U + SG_ AMP_MajorVer : 23|8@0+ (1,0) [0|0] "" H_U,MON + SG_ AMP_MinorVer : 31|8@0+ (1,0) [0|0] "" H_U,MON + SG_ AMP_UpdateStartResp : 33|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_UpdateEndResp : 41|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_TuningMajorVer : 55|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_TuningMinorVer : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 384 AMP_HU_PE_01: 8 AMP + SG_ AMP_HFModeState : 1|2@0+ (1,0) [0|0] "" CLU,H_U + SG_ HU_InitInfo : 3|2@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_ASDModeState : 6|3@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_NaviModeState : 9|2@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_SPDIFInfo : 12|3@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_MTSModeState : 17|2@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_VSCModeState : 25|2@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_SDVCStepState : 29|3@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_Beep1ModeState : 33|2@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_Beep2ModeState : 41|2@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_DistrInfoState : 55|8@0+ (1,0) [0|0] "" CLU,H_U + SG_ AMP_INFORM_TO_IPM : 57|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,H_U,IPM + SG_ AMP_SignalDoctorState : 59|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_AutoVolumeState : 61|2@0+ (1,0) [0|0] "" H_U + +BO_ 1408 AMP_HU_P_01: 8 AMP + SG_ AMP_SupportMute : 1|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportHFMode : 3|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportCfgBeep1 : 5|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportCfgBeep2 : 7|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportSpeedAdjust : 9|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportSurroundMode : 11|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportNaviMode : 13|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportMTSMode : 15|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportTopState : 17|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportBothLHDandRHD : 19|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportEQState : 21|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportVehicleID : 23|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportAudioSource : 25|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportSPDIFModeState : 27|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportRearSpMute : 29|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportVEQMode : 31|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_MakerID : 39|8@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportASDMode : 41|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportBeatsMode : 43|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportVIPMode : 45|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportQLS : 47|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportSignalDoctor : 49|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportAutoVolume : 51|2@0+ (1,0) [0|0] "" H_U + SG_ AMP_SupportPESSMode : 53|2@0+ (1,0) [0|0] "" H_U + +BO_ 1920 TP_HU_PhyReq: 8 EDT + SG_ Byte0_TCP_780 : 7|8@0+ (1,0) [0|0] "" H_U + SG_ Byte1_Data_780 : 15|8@0+ (1,0) [0|0] "" H_U + SG_ Byte2_Data_780 : 23|8@0+ (1,0) [0|0] "" H_U + SG_ Byte3_Data_780 : 31|8@0+ (1,0) [0|0] "" H_U + SG_ Byte4_Data_780 : 39|8@0+ (1,0) [0|0] "" H_U + SG_ Byte5_Data_780 : 47|8@0+ (1,0) [0|0] "" H_U + SG_ Byte6_Data_780 : 55|8@0+ (1,0) [0|0] "" H_U + SG_ Byte7_Data_780 : 63|8@0+ (1,0) [0|0] "" H_U + +BO_ 371 HU_TMU_PE_01: 8 H_U + SG_ HU_AliveStatus : 1|2@0+ (1,0) [0|0] "" CLU,CGW,TMU + SG_ HU_DeviceType : 5|4@0+ (1,0) [0|0] "" TMU + SG_ HU_DistanceUnit : 7|2@0+ (1,0) [0|0] "" TMU + SG_ HU_AudAllocStatus : 9|2@0+ (1,0) [0|0] "" TMU + SG_ HU_PowerStatus : 12|3@0+ (1,0) [0|0] "" TMU + SG_ HU_BTCallStatus : 15|3@0+ (1,0) [0|0] "" TMU + SG_ HU_VoiceRecStatus : 17|2@0+ (1,0) [0|0] "" TMU + SG_ HU_LangStatus : 20|3@0+ (1,0) [0|0] "" TMU + +BO_ 369 HU_Car_PE_01: 8 H_U + SG_ HU_VehiclePwr : 3|4@0+ (1,0) [0|0] "" AMP,ASD,AVM,CCP,CLOCK,CLU,CUBIS,DATC,FHCU,IPM,KBD,KMA_TMU,MON,RRC,RSE_L,RSE_R,TMU + +BO_ 1392 HU_TMU_P_01: 8 H_U + SG_ HU_GPS_Signal : 7|64@0+ (1,0) [0|0] "" TMU + +BO_ 112 HU_AMP_E_09: 8 H_U + SG_ AMP_Beep1VolumeStep : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep1Frequency : 15|16@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep1Ch_OutputMask : 31|16@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep1DurationOn : 47|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep1DurationOff : 55|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep1NumberOfCycles : 63|8@0+ (1,0) [0|0] "" AMP + +BO_ 1390 GW_CLU_P: 8 CLU + SG_ C_VehicleSpeed : 7|8@0+ (1,0) [0|254] "" H_U,IBOX + SG_ C_Odometer : 15|24@0+ (1,0) [0|999999] "" H_U,IBOX + +BO_ 363 GW_IPM_PE_2: 8 CLU + SG_ C_DRVUnlockState : 1|2@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ C_ASTUnlockState : 3|2@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ C_RLUnlockstate : 5|2@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ C_RRUnlockState : 7|2@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ C_VehicleInfoTMU : 9|2@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ C_Engine_Status : 11|2@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ C_TMULockFeedBack : 23|2@0+ (1,0) [0|0] "" CUBIS,TMU + +BO_ 362 GW_IPM_PE_1: 8 CLU + SG_ C_AV_Tail : 1|2@0+ (1,0) [0|0] "" AMP,CCP,CLOCK,CLU,HUD,H_U,IBOX,RRC,RSE_L + SG_ C_ParkingBrakeSW : 3|2@0+ (1,0) [0|0] "" H_U + SG_ C_RKECMD : 7|4@0+ (1,0) [0|0] "" H_U + SG_ C_BAState : 9|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_IGNSW : 14|3@0+ (1,0) [0|0] "" AMP,AVM,CUBIS,EDT,H_U,MON,RRC,SWRC + SG_ C_CountryCfg : 18|3@0+ (1,0) [0|0] "" AVM,H_U + SG_ C_AltL : 25|2@0+ (1,0) [0|0] "" H_U + SG_ C_TailLampActivity : 27|2@0+ (1,0) [0|0] "" AMP,CCP,CLOCK,HUD,H_U,IBOX,RRC,RSE_L,SWRC + SG_ RearSW_RSELockOnOff : 29|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_TMULockFeedBack : 31|2@0+ (1,0) [0|0] "" CUBIS,TMU + SG_ C_SMKTeleCrankingState : 33|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_SMKTeleCrankingFailRes : 35|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_RKECMD_GEN2 : 39|3@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_Acu_CshAct : 41|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_IntTailAct : 43|2@0+ (1,0) [0|0] "" AMP,CCP,CLOCK,CLU,HUD,H_U,IBOX,RRC,RSE_L + SG_ C_PassiveAccessUnlock : 47|3@0+ (1,0) [0|0] "" H_U,IBOX + SG_ Lca_IndLeft : 49|2@0+ (1,0) [0|0] "" H_U + SG_ FL_SndWarn : 51|2@0+ (1,0) [0|0] "" AMP + SG_ FR_SndWarn : 53|2@0+ (1,0) [0|0] "" AMP + SG_ Lca_IndRight : 55|2@0+ (1,0) [0|0] "" H_U + SG_ RCTA_IndLeft : 57|2@0+ (1,0) [0|0] "" H_U + SG_ RL_SndWarn : 59|2@0+ (1,0) [0|0] "" AMP + SG_ RR_SndWarn : 61|2@0+ (1,0) [0|0] "" AMP + SG_ RCTA_IndRight : 63|2@0+ (1,0) [0|0] "" H_U + +BO_ 361 GW_CHASSIS_PE_1: 8 CLU + SG_ C_Inhibit_State : 3|4@0+ (1,0) [0|0] "" AVM,H_U + SG_ C_P_BrakeStatus : 5|2@0+ (1,0) [0|0] "" AVM,H_U + SG_ C_Clu_AltLStatus : 7|2@0+ (1,0) [0|0] "" AVM,H_U + +BO_ 359 GW_WARNING_PE_01: 8 CLU + SG_ Spas_BEEP_Alarm : 3|4@0+ (1,0) [0|0] "" AMP + SG_ Spas_Audio_VolumeDown : 5|2@0+ (1,0) [0|0] "" AMP + SG_ Spas_Spkr_Flh_Alarm : 9|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Spas_Spkr_Fcnt_Alarm : 11|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Spas_Spkr_Frh_Alarm : 13|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Spas_Spkr_Rlh_Alarm : 17|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Spas_Spkr_Rcnt_Alarm : 19|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Spas_Spkr_Rrh_Alarm : 21|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Lkas_SysStatus : 27|4@0+ (1,0) [0|0] "" AMP,H_U + SG_ Lkas_LH_Warning : 29|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Lkas_RH_Warning : 31|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Spas_Spkr_Level : 35|3@0+ (1,0) [0|0] "" AMP + SG_ Lkas_Audio_VolumeDown : 37|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Audio_VolumeDown : 39|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Pas_BEEP_Alarm : 43|4@0+ (1,0) [0|0] "" AMP + SG_ Pas_Audio_VolumeDown : 45|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Pas_Spkr_Level : 32|3@0+ (1,0) [0|0] "" AMP + SG_ Pas_Spkr_Flh_Alarm : 49|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Pas_Spkr_Fcnt_Alarm : 51|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Pas_Spkr_Frh_Alarm : 53|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Pas_Spkr_Rlh_Alarm : 57|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Pas_Spkr_Rcnt_Alarm : 59|2@0+ (1,0) [0|0] "" AMP,H_U + SG_ Pas_Spkr_Rrh_Alarm : 61|2@0+ (1,0) [0|0] "" AMP,H_U + +BO_ 1376 HU_TMU_P_02: 8 H_U + SG_ HU_GPS_Signal2 : 7|8@0+ (2,0) [0|0] "Degree" TMU + SG_ HU_GPS_Signal3 : 9|2@0+ (1,0) [0|0] "" TMU + SG_ HU_GPS_Signal4 : 12|3@0+ (1,0) [0|0] "" TMU + +BO_ 93 DATC_HU_E_SYS: 8 CLU + SG_ DATC_SWVerMajor : 7|8@0+ (1,0) [0|254] "" H_U + SG_ DATC_SWVerMinor : 15|8@0+ (1,0) [0|254] "" H_U + SG_ DATC_CANVerMajor : 23|8@0+ (1,0) [0|254] "" H_U + SG_ DATC_CANVerMinor : 31|8@0+ (1,0) [0|254] "" H_U + +BO_ 344 GW_CLU_PE: 8 CLU + SG_ C_InhibitP : 1|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_InhibitR : 3|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_InhibitN : 5|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_InhibitD : 7|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_P_BrakeStatus : 9|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_Clu_AltLStatus : 11|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ CF_Clu_LowfuelWarning : 13|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ C_InhibitRMT : 15|2@0+ (1,0) [0|0] "" H_U + SG_ CF_SMKRKECmd : 18|3@0+ (1,0) [0|0] "" H_U + +BO_ 87 HU_E_02: 8 H_U + SG_ NaviValidity : 1|2@0+ (1,0) [0|0] "" CGW,CLU + +BO_ 343 GW_WARNING_PE_02: 8 CLU + SG_ CF_Lkas_TsrSlifOpt : 1|2@0+ (1,0) [0|3] "" H_U + SG_ CF_Lkas_TsrStatus : 3|2@0+ (1,0) [0|3] "" H_U + SG_ CF_Lkas_TsrAddinfo_Disp : 7|2@0+ (1,0) [0|3] "" H_U + SG_ CF_Lkas_TsrSpeed_Display : 15|8@0+ (1,0) [0|255] "" H_U + +BO_ 75 HU_AMP_E_12: 8 H_U + SG_ AMP_EngOrderC2GainSet : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_EngOrderC4GainSet : 15|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_EngOrderC6GainSet : 23|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_APSBand0GainSet : 31|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_APSBand1GainSet : 39|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_APSBand2GainSet : 47|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_APSBand3GainSet : 55|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_APSBand4GainSet : 63|8@0+ (1,0) [0|0] "" AMP + +BO_ 74 HU_AMP_E_11: 8 H_U + SG_ AMP_PESSMode : 1|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_PESSDesignSet : 4|3@0+ (1,0) [0|0] "" AMP + SG_ AMP_PESSAPSSet : 7|3@0+ (1,0) [0|0] "" AMP + SG_ AMP_PESSVolumeSet : 15|8@0+ (1,0) [0|0] "" AMP + +BO_ 1864 TP_AMP_EDT: 8 AMP + SG_ Byte0_TCP_748 : 7|8@0+ (1,0) [0|0] "" EDT + SG_ Byte1_Data_748 : 15|8@0+ (1,0) [0|0] "" EDT + SG_ Byte2_Data_748 : 23|8@0+ (1,0) [0|0] "" EDT + SG_ Byte3_Data_748 : 31|8@0+ (1,0) [0|0] "" EDT + SG_ Byte4_Data_748 : 39|8@0+ (1,0) [0|0] "" EDT + SG_ Byte5_Data_748 : 47|8@0+ (1,0) [0|0] "" EDT + SG_ Byte6_Data_748 : 55|8@0+ (1,0) [0|0] "" EDT + SG_ Byte7_Data_748 : 63|8@0+ (1,0) [0|0] "" EDT + +BO_ 327 TMU_HU_PE_03: 8 TMU + SG_ TMU_TbT_TurnIcon : 7|8@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_CountDownBar : 11|4@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_Distance_Unit : 13|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_DestDistance_Unit : 15|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_DistanceLo : 27|4@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_DistanceHi : 23|12@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_DestDistanceLo : 43|4@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_DestDistanceHi : 39|12@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_ExpectRemainHour : 55|8@0+ (1,0) [0|0] "" H_U + SG_ TMU_TbT_ExpectRemainMin : 61|6@0+ (1,0) [0|0] "" H_U + +BO_ 326 TMU_HU_PE_02: 8 TMU + SG_ TMU_CallStatus : 3|4@0+ (1,0) [0|0] "" H_U + SG_ TMU_CallType : 6|3@0+ (1,0) [0|0] "" H_U + SG_ TMU_CDMA_Streng : 11|4@0+ (1,0) [0|0] "" H_U + SG_ TMU_PacketStatus : 13|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_TalkTimeHour : 20|5@0+ (1,0) [0|0] "" H_U + SG_ TMU_TalkTimeMinute : 29|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_TalkTimeSecond : 37|6@0+ (1,0) [0|0] "" H_U + +BO_ 325 TMU_HU_PE_01: 8 TMU + SG_ TMU_AliveStatus : 2|3@0+ (1,0) [0|0] "" H_U + SG_ TMU_AudioStatus : 4|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_UpdateStatus : 7|3@0+ (1,0) [0|0] "" H_U + SG_ TMU_LangStatus : 10|3@0+ (1,0) [0|0] "" H_U + SG_ TMU_VoiceRecStatus : 12|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_MicStatus : 14|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_ServCommuStatus : 19|4@0+ (1,0) [0|0] "" H_U + SG_ TMU_PowerStatus : 21|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_EngineStatus : 23|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_DownProgress : 31|8@0+ (1,0) [0|0] "" H_U + +BO_ 69 TMU_HU_E_04: 8 TMU + SG_ TMU_eCall : 1|2@0+ (1,0) [0|0] "" H_U + +BO_ 67 TMU_GW_E_01: 8 TMU + SG_ C_ReqDrLock : 1|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ C_ReqDrUnlock : 3|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ C_ReqHazard : 5|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ C_ReqHorn : 7|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ C_ReqEngineOperate : 9|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + +BO_ 66 TMU_HU_E_03: 8 TMU + SG_ CDMA_SelfDiag : 1|2@0+ (1,0) [0|0] "" H_U + SG_ CDMA_Antena_SelfDiag : 3|2@0+ (1,0) [0|0] "" H_U + +BO_ 1345 TMU_HU_P_02: 8 TMU + SG_ TMU_SupVoiceTextService : 1|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_SupEcoCoachService : 3|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_SupSongTagService : 5|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_SupContentService : 7|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_MajorVersion : 15|8@0+ (1,0) [0|0] "" H_U + SG_ TMU_MinorVersion : 23|8@0+ (1,0) [0|0] "" H_U + SG_ TMU_DistributeInfo : 27|4@0+ (1,0) [0|0] "" H_U + +BO_ 65 TMU_HU_E_02: 8 TMU + SG_ TMU_BarLevel1 : 7|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel2 : 1|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel4 : 21|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel3 : 11|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel5 : 31|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel6 : 25|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel8 : 45|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel7 : 35|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel9 : 55|6@0+ (1,0) [0|0] "" H_U + SG_ TMU_BarLevel10 : 63|6@0+ (1,0) [0|0] "" H_U + +BO_ 1344 TMU_HU_P_01: 8 TMU + SG_ TMU_Arrow : 3|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_ReFill_Info : 5|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_AverageMPG : 1|10@0+ (1,0) [0|0] "" H_U + SG_ TMU_TotalMPG : 23|10@0+ (1,0) [0|0] "" H_U + SG_ TMU_RewardStar : 37|14@0+ (1,0) [0|0] "" H_U + +BO_ 64 TMU_HU_E_01: 8 TMU + SG_ TMU_DisMode : 3|4@0+ (1,0) [0|0] "" H_U + SG_ TMU_AudSrcType : 7|4@0+ (1,0) [0|0] "" CLU,DATC,H_U + SG_ TMU_AudReqCmd : 9|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_LangCmd : 12|3@0+ (1,0) [0|0] "" H_U + SG_ TMU_ServReq : 15|3@0+ (1,0) [0|0] "" H_U + SG_ TMU_ErrorEvent : 23|8@0+ (1,0) [0|0] "" H_U + SG_ TMU_BeepCmd : 25|2@0+ (1,0) [0|0] "" H_U + SG_ TMU_eCall : 28|3@0+ (1,0) [0|0] "" H_U + +BO_ 62 HU_Navi_E_00: 8 H_U + SG_ Navi_SLIF_SpdUnit : 1|2@0+ (1,0) [0|0] "" CGW,CLU,HUD + SG_ Navi_SLIF_Frwinfo : 4|3@0+ (1,0) [0|0] "" CGW,CLU,HUD + SG_ Navi_SLIF_LinkClass : 7|3@0+ (1,0) [0|0] "" CGW,CLU,HUD + SG_ Navi_SLIF_SpdLimit : 15|8@0+ (1,0) [1|254] "" CGW,CLU,HUD + SG_ Navi_SLIFMapSource : 29|4@0+ (1,0) [0|8] "" CGW,CLU,HUD + SG_ Navi_SLIF_CountryCode : 23|10@0+ (1,0) [0|0] "" CGW,CLU,HUD + +BO_ 52 HU_DATC_E_02: 8 H_U + SG_ HU_DATC_DrTempUpDn : 1|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_PsTempUpDn : 3|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_RlTempUpDn : 5|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_RrTempUpDn : 7|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_MainBlower : 11|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_SubBlower : 15|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_RearBlower : 19|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATCRearPsModeSet : 23|4@0+ (1,0) [0|0] "" CGW,CLU + SG_ HU_DATC_FrontModeSet : 27|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_RearModeSet : 31|4@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_AutoSet : 33|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_OffReq : 35|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_IntakeSet : 37|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_RearOnOffSet : 39|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_AcSet : 41|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_AqsSet : 43|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_FrontDefog : 45|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_RearDefog : 47|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_ZoneControl : 49|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ HU_DATC_CO2Set : 51|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ DATC_SmartVentOnOffSet : 53|2@0+ (1,0) [0|0] "" CGW,CLU,DATC,IPM + SG_ DATC_ADSOnOffSet : 55|2@0+ (1,0) [0|0] "" CGW,CLU + SG_ HU_DATC_RearAutoDisp : 57|2@0+ (1,0) [0|0] "" CGW,CLU + SG_ HU_DATC_RearOffDisp : 59|2@0+ (1,0) [0|0] "" CGW,CLU + +BO_ 308 DATC_PE_05: 8 CLU + SG_ DATC_PwrInfo : 3|4@0+ (1,0) [0|0] "" AMP,AVM,CUBIS,H_U,MON + SG_ DATC_AltL : 5|2@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_CarInfo : 7|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_ParkingBrake : 9|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_LowFuelWarn : 11|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_Rear_Off_Disp : 13|2@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_Rear_AutoDisp : 15|2@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_Rear_BlowerDisp : 19|4@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_DrSeatWarmerDisp : 22|3@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_SyncDisp : 27|4@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_RearDispCtrl : 31|4@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_RearDrModeDisp : 35|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_PsSeatWarmerDisp : 38|3@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_DrVentSeatDisp : 42|3@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_PSVentSeatDisp : 46|3@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_RrDefLed : 49|2@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_SmartVentOnOffStatus : 51|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_ADSOnOffStatus : 53|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_AcDisp_OSD : 55|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_PsModeDisp_OSD : 59|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_ModeDisp_OSD : 63|4@0+ (1,0) [0|0] "" H_U + +BO_ 307 DATC_PE_04: 8 CLU + SG_ DATC_DiagMode : 1|2@0+ (1,0) [0|0] "" H_U,IBOX,MON + SG_ DATC_Rear_ChangeReqDisp : 3|2@0+ (1,0) [0|0] "" H_U,IBOX,MON + SG_ DATC_Rear_ClimateScnDisp : 5|2@0+ (1,0) [0|0] "" H_U,IBOX,MON + SG_ DATC_CO2OnOffStatus : 7|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_SelfDiagDisp : 15|8@0+ (1,0) [0|0] "" H_U,IBOX,MON + SG_ DATC_RearBlwDisp_OSD : 19|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_AqsLevelOut : 23|4@0+ (1,0) [0|0] "" H_U,IBOX,MON + SG_ DATC_RearModeDisp : 27|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_RearPsModeDisp : 31|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_FrontBlwDisp_Ps : 35|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_AutoDisp_Ps : 39|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_RearModeDisp_OSD : 43|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_RearPSModeDisp_OSD : 47|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_FrontBlwDisp_OSD : 51|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_FrontBlwDispPs_OSD : 55|4@0+ (1,0) [0|0] "" H_U + SG_ DATC_Variant : 63|8@0+ (1,0) [0|0] "" H_U,IBOX,MON + +BO_ 306 DATC_PE_03: 8 CLU + SG_ DATC_ModeDisp : 3|4@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_TempUnit : 5|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_AutoDisp : 9|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_IntakeDisp : 11|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_ChangeReqDisp : 13|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_AcDisp : 17|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_AqsDisp : 19|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_ClimateScnDisp : 21|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_DualDisp : 25|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_OffDisp : 27|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_OpSts : 30|3@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_RearManual : 33|2@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_FrDefLed : 37|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_SmartVentDisp : 39|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_AutoDefogBlink : 41|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_ADSDisp : 43|2@0+ (1,0) [0|0] "" H_U + SG_ DATC_IonClean : 45|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_CO2Warning : 47|2@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_SubBlowerDisp : 51|4@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_BeepReq : 55|4@0+ (1,0) [0|0] "" H_U,KBD,MON + SG_ DATC_MainBlowerDisp : 59|4@0+ (1,0) [0|0] "" H_U,IBOX + SG_ DATC_PsModeDisp : 63|4@0+ (1,0) [0|0] "" H_U,IBOX + +BO_ 1329 DATC_P_02: 8 CLU + SG_ DATC_AmbientTemp_C : 7|8@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_AmbientTemp_F : 23|8@0+ (1,0) [0|0] "" H_U,MON + +BO_ 305 DATC_PE_02: 8 CLU + SG_ DATC_DrTempDispC : 7|8@0+ (0.5,14) [15|32] "C" H_U,IBOX,MON + SG_ DATC_Rear_DrTempDispC : 15|8@0+ (0.5,14) [15|32] "C" H_U,IBOX,MON + SG_ DATC_DrTempDispF : 23|8@0+ (1,56) [58|90] "F" H_U,IBOX,MON + SG_ DATC_Rear_DrTempDispF : 31|8@0+ (1,56) [58|90] "F" H_U,IBOX,MON + SG_ DATC_PsTempDispC : 39|8@0+ (0.5,14) [15|32] "C" H_U,IBOX,MON + SG_ Datc_RearPsTempDispC : 47|8@0+ (0.5,14) [15|32] "C" H_U,IBOX,MON + SG_ DATC_PsTempDispF : 55|8@0+ (1,56) [58|90] "F" H_U,IBOX,MON + SG_ DATC_RearPsTempDispF : 63|8@0+ (1,56) [58|90] "F" H_U,IBOX,MON + +BO_ 304 DATC_PE_01: 8 CLU + SG_ DATC_Type : 7|8@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_VerMMMajor : 15|8@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_VerMMMinor : 23|8@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_VerBDFMajor : 31|8@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_VerBDMinor : 39|8@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_VerCSMajor : 47|8@0+ (1,0) [0|0] "" H_U,MON + SG_ DATC_VerCSMinor : 55|8@0+ (1,0) [0|0] "" H_U,MON + +BO_ 291 HU_CLU_PE_07: 8 H_U + SG_ NV_DS_Curve : 3|4@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_Merge : 7|4@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_RailCross : 9|2@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_FallingRocks : 11|2@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_SchoolZone : 13|2@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_AccidentBlack : 15|2@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_SpeedBump : 17|2@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_RoadKill : 19|2@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_Downhill : 21|2@0+ (1,0) [0|0] "" CLU + SG_ NV_DS_Fog : 23|2@0+ (1,0) [0|0] "" CLU + SG_ NV_Display_TG : 31|2@0+ (1,0) [0|0] "" CLU,HUD + SG_ NV_Charge : 39|16@0+ (1,0) [0|0] "" CLU,HUD + SG_ NV_Charge_Unit : 55|8@0+ (1,0) [0|0] "" CLU,HUD + SG_ TBT_BarGraph100Level : 63|8@0+ (1,0) [0|100] "%" CLU,HUD + +BO_ 290 HU_CLU_PE_06: 8 H_U + SG_ NV_SD_SpdLimit2 : 3|4@0+ (10,0) [0|0] "km/h" CLU + SG_ NV_SD_SpdLimit1 : 7|4@0+ (10,0) [0|0] "km/h" CLU + SG_ NV_SD_EtcCam : 11|4@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_SpdLimit3 : 15|4@0+ (10,0) [0|0] "km/h" CLU + SG_ NV_SD_SignCam : 17|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_SignOverCam : 19|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_MobileCam : 21|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_FixedCam : 23|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_OverLoadCam : 25|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_ParkCam : 27|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_CutInCam : 29|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_BusOnlyCam : 31|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_ShoulderCam : 35|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_TrafficCam : 37|2@0+ (1,0) [0|0] "" CLU + SG_ NV_SD_PlateRcgCam : 39|2@0+ (1,0) [0|0] "" CLU + +BO_ 286 HU_CLU_PE_10: 8 H_U + SG_ Navi_TBTInfo : 63|8@0+ (1,0) [0|0] "" CGW,CLU + +BO_ 29 CLU_HU_E_00: 8 CLU + SG_ SYS_CLUVer : 7|16@0+ (1,0) [0|0] "" CUBIS,H_U + SG_ CLU_ClockInfoReq : 17|2@0+ (1,0) [0|0] "" H_U + SG_ CLU_DateInfoReq : 19|2@0+ (1,0) [0|0] "" H_U + +BO_ 27 AMP_HU_E_00: 8 AMP + SG_ SYS_AMPVer : 7|16@0+ (1,0) [0|0] "" H_U + +BO_ 23 HU_IPM_E_00: 8 H_U + SG_ C_ADrLNValueSet : 2|3@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_ADrUNValueSet : 5|3@0+ (1,0) [0|0] "" DATC,IPM + SG_ SYS_Ver_Req : 7|2@0+ (1,0) [0|0] "" AMP,AVM,CLU,CUBIS,DATC,IPM + SG_ C_IMSRValueReq : 9|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_PSMNValueSet : 11|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_SCMNValueSet : 13|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_ADrLURValueReq : 15|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_ABuzzerNValueSet : 17|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_AlarmRValueReq : 19|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_ArmWKeyNValueSet : 21|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_TwUnRValueReq : 23|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_TwUnNValueSet : 25|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_AutoMRFoldRValueReq : 27|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_AutoMRFoldNValueSet : 29|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_ADrLRValueReq : 31|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_ArmWKeyRValueReq : 33|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_ABuzzerRValueReq : 35|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_ADrURValueReq : 37|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_PSMRValueReq : 39|2@0+ (1,0) [0|0] "" DATC,IPM + SG_ C_SCMRValueReq : 47|2@0+ (1,0) [0|0] "" DATC,IPM + +BO_ 277 HU_CLU_PE_02: 8 H_U + SG_ TBT_Display_Type : 7|8@0+ (1,0) [0|0] "" CLU,HUD + SG_ TBT_Side_Street : 15|16@0+ (1,0) [0|0] "" CLU,HUD + SG_ TBT_Direction : 31|8@0+ (1,0) [0|0] "" CLU,HUD + SG_ TBT_Distance_Turn_Point : 39|16@0+ (1,0) [0|0] "m" CLU,HUD + SG_ TBT_Combined_Side_Street : 51|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ TBT_Scale : 55|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ TBT_DistancetoTurnPoint : 59|4@0+ (1,0) [0|0] "times" CLU,HUD + SG_ TBT_Bar_Graph_Level : 63|4@0+ (10,0) [0|100] "" CLU,HUD + +BO_ 276 HU_CLU_PE_01: 8 H_U + SG_ HU_OpState : 6|7@0+ (1,0) [0|0] "" AMP,CLU + SG_ HU_Navi_On_Off : 7|1@0+ (1,0) [0|0] "" CLU,HUD + SG_ HU_Preset_Number : 12|5@0+ (1,1) [1|30] "" AMP,CLU + SG_ HU_Tuner_Area : 15|3@0+ (1,0) [0|0] "" AMP,CLU + SG_ HU_Track_Number : 23|16@0+ (1,0) [0|0] "" CLU + SG_ HU_Play_time_Sec : 39|6@0+ (1,0) [0|0] "" CLU + SG_ HU_Play_time_Min : 33|7@0+ (1,0) [0|0] "" CLU + SG_ HU_Play_time_Hour : 42|6@0+ (1,0) [0|0] "" CLU + SG_ HU_Disc_select_No : 59|4@0+ (1,0) [0|0] "" CLU + SG_ HU_Frequency : 52|9@0+ (1,0) [0|0] "" AMP,CLU + +BO_ 17 HU_AMP_E_10: 8 H_U + SG_ AMP_Beep2VolumeStep : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep2Frequency : 15|16@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep2Ch_OutputMask : 31|16@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep2DurationOn : 47|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep2DurationOff : 55|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep2NumberOfCycles : 63|8@0+ (1,0) [0|0] "" AMP + +BO_ 15 HU_AMP_E_08: 8 H_U + SG_ AMP_MainVolumeSet : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_BalanceSet : 15|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_FadeSet : 23|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_BassSet : 31|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_MidSet : 39|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_TrebleSet : 47|8@0+ (1,0) [0|0] "" AMP + +BO_ 14 HU_AMP_E_07: 8 H_U + SG_ AMP_HFVolumeStep : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_HFMainAudioCut : 15|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_HFChannelOutputMask : 23|16@0+ (1,0) [0|0] "" AMP + SG_ AMP_HFChannelMuteMask : 39|16@0+ (1,0) [0|0] "" AMP + +BO_ 13 HU_AMP_E_06: 8 H_U + SG_ AMP_MTSVolumeStep : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_MTSMainAudioCut : 15|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_MTSChannelOutputMask : 23|16@0+ (1,0) [0|0] "" AMP + SG_ AMP_MTSChannelMuteMask : 39|16@0+ (1,0) [0|0] "" AMP + +BO_ 12 HU_AMP_E_05: 8 H_U + SG_ AMP_NaviVolumeStep : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_NaviMainAudioCut : 15|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_NaviChannelOutputMask : 23|16@0+ (1,0) [0|0] "" AMP + SG_ AMP_NaviChannelMuteMask : 39|16@0+ (1,0) [0|0] "" AMP + +BO_ 11 HU_AMP_E_04: 8 H_U + SG_ AMP_Drive : 1|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_ConvertibleTop : 5|2@0+ (1,0) [0|0] "" AMP + +BO_ 10 HU_AMP_E_03: 8 H_U + SG_ AMP_CrtVehicleID : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_SPDIFMode : 11|4@0+ (1,0) [0|0] "" AMP + SG_ AMP_VersionReq : 17|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_UpdateStart : 25|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_UpdateEnd : 33|2@0+ (1,0) [0|0] "" AMP + +BO_ 9 HU_AMP_E_02: 8 H_U + SG_ AMP_Mute : 1|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_RearSpMute : 3|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_SurroundMode : 5|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_VEQMode : 7|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_AudioMode : 15|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_EQ : 17|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_Reset : 19|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_SPDIFMute : 21|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_DefaultBeep1 : 25|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_DefaultBeep2 : 29|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_BeatsMode : 33|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_VIPMode : 35|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_QLSMode : 37|2@0+ (1,0) [0|0] "" AMP + +BO_ 1288 HU_CLU_P_02: 8 H_U + SG_ NV_TIME_TYPE : 3|4@0+ (1,0) [0|0] "" CLU + SG_ NV_Hour : 15|8@0+ (1,0) [0|0] "" CLU + SG_ NV_Min : 23|8@0+ (1,0) [0|0] "" CLU + +BO_ 8 HU_AMP_E_01: 8 H_U + SG_ AMP_HFMode : 1|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_NaviMode : 3|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_MTSMode : 5|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_VSCMode : 7|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep1Mode : 9|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_Beep2Mode : 11|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_SDVCStep : 14|3@0+ (1,0) [0|0] "" AMP + SG_ AMP_ASDMode : 18|3@0+ (1,0) [0|0] "" AMP + SG_ AMP_SignalDoctor : 20|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_AutoVolume : 22|2@0+ (1,0) [0|0] "" AMP + +BO_ 1287 HU_CLU_P_01: 8 H_U + SG_ NV_DistToTurn_F1 : 3|4@0+ (1,0) [0|0] "" CLU + SG_ NV_DistToTurn_Unit : 7|4@0+ (1,0) [0|0] "" CLU + SG_ NV_DistToTurn_F3 : 11|4@0+ (1,0) [0|0] "" CLU + SG_ NV_DistToTurn_F2 : 15|4@0+ (1,0) [0|0] "" CLU + SG_ NV_DistToTurn_I1 : 23|16@0+ (1,0) [0|0] "" CLU + SG_ NV_DistToTurn_I2 : 39|16@0+ (1,0) [0|0] "" CLU + SG_ NV_DistToTurn_I3 : 55|16@0+ (1,0) [0|0] "" CLU + +BO_ 1286 HU_CLU_P_00: 8 H_U + SG_ NV_EstDist_F : 3|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ NV_EstDist_Unit : 7|4@0+ (1,0) [0|0] "" CLU,HUD + SG_ NV_EstHour : 15|8@0+ (1,0) [0|0] "" CLU,HUD + SG_ NV_EstMin : 23|8@0+ (1,0) [0|0] "" CLU,HUD + SG_ NV_Azimuth : 31|8@0+ (1,0) [0|0] "" CLU,HUD + SG_ NV_EstDist_I : 39|16@0+ (1,0) [0|0] "" CLU,HUD + SG_ NV_EstimTimeType : 49|2@0+ (1,0) [0|0] "" CGW,CLU,HUD + SG_ NV_EstimTimeFormat : 51|2@0+ (1,0) [0|0] "" CGW,CLU,HUD + +BO_ 1284 HU_AMP_P_01: 8 H_U + SG_ HU_VehicleSpeed : 7|8@0+ (1,0) [0|0] "" AMP + SG_ AMP_SetMaxMainVolStep : 9|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_LKASWarningOn : 21|2@0+ (1,0) [0|0] "" AMP + SG_ AMP_BSDWarningOn : 23|2@0+ (1,0) [0|0] "" AMP + +BO_ 256 HU_MON_PE_01: 8 H_U + SG_ HU_Type : 7|8@0+ (1,0) [0|0] "" AMP,CGW,CLU,HUD,KMA_TMU + SG_ HU_VerMajor : 15|8@0+ (1,0) [0|0] "" AMP,CLU,KMA_TMU,MON + SG_ HU_VerMinor : 23|8@0+ (1,0) [0|0] "" AMP,CLU,KMA_TMU,MON + SG_ HU_DistributeInfo : 31|8@0+ (1,0) [0|0] "" AMP,CGW,CLU,KMA_TMU,MON,RRC + SG_ HU_SubVerMajor : 39|8@0+ (1,0) [0|0] "" AMP,MON + SG_ HU_SubVerMinor : 47|8@0+ (1,0) [0|0] "" AMP,MON + SG_ HU_SDARSVersion : 55|8@0+ (1,0) [0|0] "" AMP,MON + SG_ HU_AdasSupport : 58|3@0+ (1,0) [0|0] "" CGW,CLU + +BO_ 1092 NM_CLOCK: 8 CLOCK + SG_ Destination_CLOCK : 7|8@0+ (1,0) [0|0] "" HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_CLOCK : 13|2@0+ (1,0) [0|0] "" HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_CLOCK : 10|3@0+ (1,0) [0|0] "" HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1108 NM_HUD: 8 HUD + SG_ Destination_HUD : 7|8@0+ (1,0) [0|0] "" CLOCK,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_HUD : 13|2@0+ (1,0) [0|0] "" CLOCK,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_HUD : 10|3@0+ (1,0) [0|0] "" CLOCK,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1088 NM_H_U: 8 H_U + SG_ Destination_H_U : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_H_U : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_H_U : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1091 NM_DATC: 8 DATC + SG_ Destination_DATC : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_DATC : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_DATC : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1105 NM_CCP: 8 CCP + SG_ Destination_CCP : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_CCP : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_CCP : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1100 NM_KMA_TMU: 8 KMA_TMU + SG_ Destination_KMA_TMU : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_KMA_TMU : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_KMA_TMU : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1098 NM_CUBIS: 8 CUBIS + SG_ Destination_CUBIS : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_CUBIS : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_CUBIS : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1099 NM_TMU: 8 TMU + SG_ Destination_TMU : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_TMU : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_TMU : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1095 NM_IPM: 8 IPM + SG_ Destination_IPM : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_IPM : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_IPM : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1107 NM_RSE_R: 8 RSE_R + SG_ Destination_RSE_R : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_RSE_R : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_RSE_R : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1093 NM_RRC: 8 RRC + SG_ Destination_RRC : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_RRC : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_RRC : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1109 NM_CGW: 8 CGW + SG_ Destination_CGW : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_CGW : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_CGW : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1106 NM_RSE_L: 8 RSE_L + SG_ Destination_RSE_L : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_RSE_L : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_RSE_L : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1096 NM_AMP: 8 AMP + SG_ Destination_AMP : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_AMP : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_AMP : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1103 NM_EDT: 8 EDT + SG_ Destination_EDT : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_EDT : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_EDT : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1110 NM_SWRC: 8 SWRC + SG_ Destination_SWRC : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_SWRC : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_SWRC : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,IBOX,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1102 NM_IBOX: 8 IBOX + SG_ Destination_IBOX : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_IBOX : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,CLU,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_IBOX : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,CLU,FHCU,ASD,MON,AVM,KBD + +BO_ 1101 NM_CLU: 8 CLU + SG_ Destination_CLU : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,FHCU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_CLU : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,FHCU,ASD,MON,AVM,KBD + SG_ NMCommandCode_CLU : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,FHCU,ASD,MON,AVM,KBD + +BO_ 1097 NM_FHCU: 8 FHCU + SG_ Destination_FHCU : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,ASD,MON,AVM,KBD + SG_ NMSleepFlag_FHCU : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,ASD,MON,AVM,KBD + SG_ NMCommandCode_FHCU : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,ASD,MON,AVM,KBD + +BO_ 1094 NM_ASD: 8 ASD + SG_ Destination_ASD : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,MON,AVM,KBD + SG_ NMSleepFlag_ASD : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,MON,AVM,KBD + SG_ NMCommandCode_ASD : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,MON,AVM,KBD + +BO_ 1089 NM_MON: 8 MON + SG_ Destination_MON : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,AVM,KBD + SG_ NMSleepFlag_MON : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,AVM,KBD + SG_ NMCommandCode_MON : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,AVM,KBD + +BO_ 1104 NM_AVM: 8 AVM + SG_ Destination_AVM : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,KBD + SG_ NMSleepFlag_AVM : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,KBD + SG_ NMCommandCode_AVM : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,KBD + +BO_ 1090 NM_KBD: 8 KBD + SG_ Destination_KBD : 7|8@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM + SG_ NMSleepFlag_KBD : 13|2@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM + SG_ NMCommandCode_KBD : 10|3@0+ (1,0) [0|0] "" CLOCK,HUD,H_U,DATC,CCP,KMA_TMU,CUBIS,TMU,IPM,RSE_R,RRC,CGW,RSE_L,AMP,EDT,SWRC,IBOX,CLU,FHCU,ASD,MON,AVM + diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_180_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_180_generated.dbc new file mode 100644 index 000000000..ab1d24719 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_180_generated.dbc @@ -0,0 +1,143 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "hyundai_canfd_corner_radar_180.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + ENVVAR_TYPE_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_DEF_ "GenMsgCycleTime" 0; + +BO_ 384 CORNER_RADAR_180_OBJECTS_180: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 384 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 384 30; + +BO_ 385 CORNER_RADAR_180_OBJECTS_181: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 385 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 385 30; + +BO_ 386 CORNER_RADAR_180_OBJECTS_182: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 386 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 386 30; + +BO_ 387 CORNER_RADAR_180_OBJECTS_183: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 387 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 387 30; + +BO_ 388 CORNER_RADAR_180_OBJECTS_184: 32 RADAR + SG_ SLOT1_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT1_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT1_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT1_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT1_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT1_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT1_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX + SG_ SLOT2_QUAL_LEVEL : 152|7@1+ (1,0) [0|100] "%" XXX + SG_ SLOT2_AGE : 160|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_OBJECT_ID : 172|7@1+ (1,0) [0|127] "" XXX + SG_ SLOT2_REL_POS_X : 192|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ SLOT2_REL_POS_Y : 206|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ SLOT2_REL_VEL_X : 219|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ SLOT2_REL_VEL_Y : 232|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ SLOT2_REL_ACCEL_X : 243|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 388 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 388 30; diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_235_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_235_generated.dbc new file mode 100644 index 000000000..91eb79bdd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_235_generated.dbc @@ -0,0 +1,281 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "hyundai_canfd_corner_radar_235.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_DEF_ "GenMsgCycleTime" 0; + +BO_ 565 CORNER_RADAR_235_OBJECTS_235: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 565 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 565 30; + +BO_ 566 CORNER_RADAR_235_OBJECTS_236: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 566 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 566 30; + +BO_ 567 CORNER_RADAR_235_OBJECTS_237: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 567 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 567 30; + +BO_ 568 CORNER_RADAR_235_OBJECTS_238: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 568 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 568 30; + +BO_ 569 CORNER_RADAR_235_OBJECTS_239: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 569 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 569 30; + +BO_ 570 CORNER_RADAR_235_OBJECTS_23a: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 570 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 570 30; + +BO_ 571 CORNER_RADAR_235_OBJECTS_23b: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 571 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 571 30; + +BO_ 572 CORNER_RADAR_235_OBJECTS_23c: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 572 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 572 30; + +BO_ 573 CORNER_RADAR_235_OBJECTS_23d: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 573 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 573 30; + +BO_ 574 CORNER_RADAR_235_OBJECTS_23e: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 574 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 574 30; + +BO_ 575 CORNER_RADAR_235_OBJECTS_23f: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 575 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 575 30; + +BO_ 576 CORNER_RADAR_235_OBJECTS_240: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 576 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 576 30; + +BO_ 577 CORNER_RADAR_235_OBJECTS_241: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 577 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 577 30; + +BO_ 578 CORNER_RADAR_235_OBJECTS_242: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 578 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 578 30; + +BO_ 579 CORNER_RADAR_235_OBJECTS_243: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 579 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 579 30; + +BO_ 580 CORNER_RADAR_235_OBJECTS_244: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 580 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 580 30; + +BO_ 581 CORNER_RADAR_235_OBJECTS_245: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 581 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 581 30; + +BO_ 582 CORNER_RADAR_235_OBJECTS_246: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 582 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 582 30; + +BO_ 583 CORNER_RADAR_235_OBJECTS_247: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 583 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 583 30; + +BO_ 584 CORNER_RADAR_235_OBJECTS_248: 32 RADAR + SG_ OBJ_QUAL_LEVEL : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ OBJ_AGE : 32|8@1+ (1,0) [0|255] "" XXX + SG_ OBJ_OBJECT_ID : 44|7@1+ (1,0) [0|127] "" XXX + SG_ OBJ_REL_POS_X : 64|13@1+ (0.05,0) [0|409.55] "m" XXX + SG_ OBJ_REL_POS_Y : 78|12@1+ (0.05,-102.4) [-102.4|102.35] "m" XXX + SG_ OBJ_REL_VEL_X : 91|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ OBJ_REL_VEL_Y : 104|10@1+ (0.05,-25) [-25|26.15] "m/s" XXX + SG_ OBJ_REL_ACCEL_X : 115|9@1- (0.05,0) [-12.8|12.75] "m/s^2" XXX +CM_ BO_ 584 "Corner radar object payload on bus 1. Only signals consumed by Hyundai radar_interface are defined."; +BA_ "GenMsgCycleTime" BO_ 584 30; diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_430_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_430_generated.dbc new file mode 100644 index 000000000..e704037c0 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_corner_radar_430_generated.dbc @@ -0,0 +1,617 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "hyundai_canfd_corner_radar_430.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 100000; +BA_DEF_DEF_ "GenMsgCycleTime" 0; + +BO_ 1072 CORNER_RADAR_430_OBJECTS_430: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1072 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1072 30; + +BO_ 1073 CORNER_RADAR_430_OBJECTS_431: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1073 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1073 30; + +BO_ 1074 CORNER_RADAR_430_OBJECTS_432: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1074 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1074 30; + +BO_ 1075 CORNER_RADAR_430_OBJECTS_433: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1075 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1075 30; + +BO_ 1076 CORNER_RADAR_430_OBJECTS_434: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1076 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1076 30; + +BO_ 1077 CORNER_RADAR_430_OBJECTS_435: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1077 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1077 30; + +BO_ 1078 CORNER_RADAR_430_OBJECTS_436: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1078 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1078 30; + +BO_ 1079 CORNER_RADAR_430_OBJECTS_437: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1079 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1079 30; + +BO_ 1088 CORNER_RADAR_430_OBJECTS_440: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1088 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1088 30; + +BO_ 1089 CORNER_RADAR_430_OBJECTS_441: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1089 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1089 30; + +BO_ 1090 CORNER_RADAR_430_OBJECTS_442: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1090 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1090 30; + +BO_ 1091 CORNER_RADAR_430_OBJECTS_443: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1091 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1091 30; + +BO_ 1092 CORNER_RADAR_430_OBJECTS_444: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1092 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1092 30; + +BO_ 1093 CORNER_RADAR_430_OBJECTS_445: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1093 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1093 30; + +BO_ 1094 CORNER_RADAR_430_OBJECTS_446: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1094 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1094 30; + +BO_ 1095 CORNER_RADAR_430_OBJECTS_447: 32 RADAR + SG_ HEADER_BYTE_0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HEADER_BYTE_3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_DISTANCE_RAW : 32|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT1_META_13_15 : 45|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT1_META_BYTE_2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT1_META_BYTE_3 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_DISTANCE_RAW : 64|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT2_META_13_15 : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT2_META_BYTE_2 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT2_META_BYTE_3 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_DISTANCE_RAW : 96|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT3_META_13_15 : 109|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT3_META_BYTE_2 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT3_META_BYTE_3 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_DISTANCE_RAW : 128|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT4_META_13_15 : 141|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT4_META_BYTE_2 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT4_META_BYTE_3 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_DISTANCE_RAW : 160|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT5_META_13_15 : 173|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT5_META_BYTE_2 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT5_META_BYTE_3 : 184|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_DISTANCE_RAW : 192|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT6_META_13_15 : 205|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT6_META_BYTE_2 : 208|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT6_META_BYTE_3 : 216|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_DISTANCE_RAW : 224|13@1+ (1,0) [0|8191] "" XXX + SG_ SLOT7_META_13_15 : 237|3@1+ (1,0) [0|7] "" XXX + SG_ SLOT7_META_BYTE_2 : 240|8@1+ (1,0) [0|255] "" XXX + SG_ SLOT7_META_BYTE_3 : 248|8@1+ (1,0) [0|255] "" XXX +CM_ BO_ 1095 "IONIQ 9 candidate corner radar bin container. 0x430-0x437 correlate with left side and 0x440-0x447 with right side. Bytes 4-31 appear as seven 4-byte slots; lower 13 bits are a distance candidate at 0.05 m scale. This DBC intentionally exposes only raw candidate fields until lateral and velocity fields are validated."; +BA_ "GenMsgCycleTime" BO_ 1095 30; diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_generated.dbc new file mode 100644 index 000000000..0a3fdc117 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_generated.dbc @@ -0,0 +1,1110 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "hyundai_canfd.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX CAMERA FRONT_RADAR ADRV APRK + + +BO_ 53 ACCELERATOR: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ ACCELERATOR_PEDAL : 40|8@1+ (1,0) [0|255] "" XXX + SG_ GEAR : 192|3@1+ (1,0) [0|7] "" XXX + +BO_ 64 GEAR_ALT: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ GEAR : 32|3@1+ (1,0) [0|7] "" XXX + SG_ GEAR_STEP : 67|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 76|4@1+ (1,0) [0|15] "" XXX + +BO_ 69 GEAR: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ GEAR : 44|3@1+ (1,0) [0|7] "" XXX + SG_ RIGHT_PADDLE : 57|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_PADDLE : 58|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_STEP : 146|5@1+ (1,0) [0|31] "" XXX + SG_ GEAR_STEP1 : 154|5@1+ (1,0) [0|31] "" XXX + +BO_ 80 LKAS: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ACTIVE : 27|2@1+ (1,0) [0|255] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX + SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ANGLE_CMD : 82|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX + SG_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX + +BO_ 81 ADRV_0x51: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 96 ESP_STATUS: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ TRACTION_AND_STABILITY_CONTROL : 42|3@1+ (1,0) [0|63] "" XXX + SG_ BRAKE_PRESSURE : 128|11@1+ (1,0) [0|2047] "" XXX + SG_ BRAKE_PRESSED : 148|1@1+ (1,0) [0|3] "" XXX + SG_ AUTO_HOLD : 192|1@0+ (1,0) [0|1] "" XXX + +BO_ 101 BRAKE: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BRAKE_LIGHT : 29|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_POSITION : 40|16@1- (1,0) [0|65535] "" XXX + SG_ BRAKE_PRESSED : 57|1@1+ (1,0) [0|3] "" XXX + +BO_ 112 GEAR_ALT_2: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ GEAR : 60|3@1+ (1,0) [0|7] "" XXX + +BO_ 160 WHEEL_SPEEDS: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ MOVING_FORWARD : 56|1@0+ (1,0) [0|1] "" XXX + SG_ MOVING_BACKWARD : 57|1@0+ (1,0) [0|1] "" XXX + SG_ MOVING_FORWARD2 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ MOVING_BACKWARD2 : 59|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_SPEED_1 : 64|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_2 : 80|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_3 : 96|16@1+ (0.03125,0) [0|65535] "kph" XXX + SG_ WHEEL_SPEED_4 : 112|16@1+ (0.03125,0) [0|65535] "kph" XXX + +BO_ 203 LFA_ALT: 24 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 29|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ANGLE_CMD : 32|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 234 MDPS: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ LKA_ACTIVE : 48|1@0+ (1,0) [0|16777215] "" XXX + SG_ LKA_FAULT : 54|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_OUT_TORQUE : 64|12@1+ (0.1,-204.8) [0|65535] "" XXX + SG_ STEERING_COL_TORQUE : 80|13@1+ (1,-4095) [0|4095] "" XXX + SG_ STEERING_ANGLE : 96|16@1- (-0.1,0) [0|255] "deg" XXX + SG_ STEERING_ANGLE_2 : 128|16@1- (-0.1,0) [0|65535] "deg" XXX + SG_ LFA2_ACTIVE : 145|2@0+ (1,0) [0|3] "" XXX + SG_ LFA2_FAULT : 149|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 159|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 167|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 175|8@0+ (1,0) [0|255] "" XXX + +BO_ 256 ACCELERATOR_BRAKE_ALT: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSED : 32|1@1+ (1,0) [0|1] "" XXX + SG_ ACCELERATOR_PEDAL_PRESSED : 176|1@1+ (1,0) [0|1] "" XXX + +BO_ 261 ACCELERATOR_ALT: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ ACCELERATOR_PEDAL : 103|10@1+ (0.25,0) [0|1022] "" XXX + +BO_ 267 CRUISE_BUTTONS_ALT2: 16 XXX + SG_ CRUISE_BUTTONS : 83|4@0+ (1,0) [0|15] "" XXX + SG_ LFA_BTN : 87|1@0+ (1,0) [0|1] "" XXX + +BO_ 272 LKAS_ALT: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ACTIVE : 27|2@1+ (1,0) [0|3] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|3] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|1] "" XXX + SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ANGLE_CMD : 82|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX + SG_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX + SG_ VALUE231 : 231|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE239 : 239|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE247 : 247|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE255 : 255|8@0+ (1,0) [0|255] "" XXX + +BO_ 293 STEERING_SENSORS: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ STEERING_ANGLE : 24|16@1- (-0.1,0) [0|255] "deg" XXX + SG_ STEERING_RATE : 40|8@1+ (4,0) [0|1016] "deg/s" XXX + +BO_ 298 LFA: 16 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ACTIVE : 27|2@1+ (1,0) [0|3] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|3] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|1] "" XXX + SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ANGLE_CMD : 82|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX + SG_ DampingGain : 104|8@1+ (1,0) [0|255] "" XXX + SG_ VALUE231 : 231|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE239 : 239|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE247 : 247|8@0+ (1,0) [0|255] "" XXX + SG_ VALUE255 : 255|8@0+ (1,0) [0|255] "" XXX + +BO_ 304 GEAR_SHIFTER: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ PARK_BUTTON : 32|2@1+ (1,0) [0|3] "" XXX + SG_ KNOB_POSITION : 40|3@1+ (1,0) [0|3] "" XXX + SG_ GEAR : 64|3@1+ (1,0) [0|7] "" XXX + +BO_ 1079 TRAILER_STATUS: 8 XXX + SG_ TRAILER_CONNECTED : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 352 ADRV_0x160: 16 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ AEB_SETTING : 24|2@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_2 : 56|8@1+ (1,0) [0|1] "" XXX + SG_ SET_ME_FF : 64|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_FC : 72|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_9 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 95|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 102|1@0+ (1,0) [0|1] "" XXX + +BO_ 353 ADRV_0x161: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ FCA_ICON : 24|3@1+ (1,0) [0|7] "" XXX + SG_ FCA_ALT_ICON : 27|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ICON : 30|3@1+ (1,0) [0|3] "" XXX + SG_ HBA_ICON : 33|3@1+ (1,0) [0|7] "" XXX + SG_ FCA_IMAGE : 42|3@1+ (1,0) [0|7] "" XXX + SG_ BCA_LEFT : 51|3@1+ (1,0) [0|7] "" XXX + SG_ BCA_RIGHT : 54|3@1+ (1,0) [0|7] "" XXX + SG_ LCA_LEFT_ARROW : 57|3@1+ (1,0) [0|7] "" XXX + SG_ LCA_RIGHT_ARROW : 60|3@1+ (1,0) [0|7] "" XXX + SG_ CENTERLINE : 64|2@1+ (1,0) [0|3] "" XXX + SG_ TARGET : 66|3@1+ (1,0) [0|7] "" XXX + SG_ TARGET_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LANELINE_LEFT : 80|4@1+ (1,0) [0|15] "" XXX + SG_ LANELINE_LEFT_POSITION : 84|6@1+ (1,0) [0|15] "" XXX + SG_ LANELINE_RIGHT : 90|4@1+ (1,0) [0|15] "" XXX + SG_ LANELINE_RIGHT_POSITION : 94|6@1+ (1,0) [0|15] "" XXX + SG_ LANELINE_CURVATURE : 100|4@1+ (1,0) [0|31] "" XXX + SG_ LANELINE_CURVATURE_DIRECTION : 104|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_HIGHLIGHT : 105|4@1+ (1,0) [0|15] "" XXX + SG_ LANE_HIGHLIGHT_DISTANCE : 109|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LANE_LEFT : 120|3@1+ (1,0) [0|7] "" XXX + SG_ LANE_RIGHT : 123|3@1+ (1,0) [0|7] "" XXX + SG_ LANE_ZOOM : 126|2@1+ (1,0) [0|3] "" XXX + SG_ ALERTS_1 : 128|6@1+ (1,0) [0|63] "" XXX + SG_ ALERTS_2 : 134|5@1+ (1,0) [0|31] "" XXX + SG_ ALERTS_3 : 139|5@1+ (1,0) [0|31] "" XXX + SG_ ALERTS_4 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ ALERTS_5 : 152|5@1+ (1,0) [0|31] "" XXX + SG_ MUTE : 157|3@1+ (1,0) [0|7] "" XXX + SG_ SOUNDS_1 : 160|4@1+ (1,0) [0|3] "" XXX + SG_ SOUNDS_2 : 164|4@1+ (1,0) [0|3] "" XXX + SG_ SOUNDS_3 : 168|4@1+ (1,0) [0|15] "" XXX + SG_ SOUNDS_4 : 172|3@1+ (1,0) [0|7] "" XXX + SG_ SETSPEED_HUD : 181|3@1+ (1,0) [0|7] "" XXX + SG_ DISTANCE_LEAD : 184|5@1+ (1,0) [0|31] "" XXX + SG_ DISTANCE_CAR : 189|3@1+ (1,0) [0|7] "" XXX + SG_ DISTANCE_SPACING : 192|4@1+ (1,0) [0|15] "" XXX + SG_ DISTANCE : 196|4@1+ (1,0) [0|7] "" XXX + SG_ vSetDis : 200|8@1+ (1,0) [0|255] "" XXX + SG_ SETSPEED : 208|4@1+ (1,0) [0|7] "" XXX + SG_ HDA_ICON : 212|3@1+ (1,0) [0|7] "" XXX + SG_ SLA_ICON : 216|4@1+ (1,0) [0|15] "" XXX + SG_ NAV_ICON : 220|3@1+ (1,0) [0|7] "" XXX + SG_ LFA_ICON : 224|3@1+ (1,0) [0|7] "" XXX + SG_ LCA_LEFT_ICON : 228|3@1+ (1,0) [0|7] "" XXX + SG_ LCA_RIGHT_ICON : 232|3@1+ (1,0) [0|7] "" XXX + SG_ BACKGROUND : 236|4@1+ (1,0) [0|15] "" XXX + SG_ DAW_ICON : 240|3@1+ (1,0) [0|7] "" XXX + SG_ CAR_CIRCLE : 243|3@1+ (1,0) [0|7] "" XXX + +BO_ 354 CCNC_0x162: 32 CCNC + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTRY : 24|4@1+ (1,0) [0|7] "" XXX + SG_ SPEEDLIMIT_FLASH : 28|4@1+ (1,0) [0|15] "" XXX + SG_ SPEEDLIMIT : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SIGNS : 40|8@1+ (1,0) [0|15] "" XXX + SG_ SPEEDLIMIT_WEATHER : 48|4@1+ (1,0) [0|15] "" XXX + SG_ VIBRATE : 52|1@0+ (1,0) [0|1] "" XXX + SG_ FF_DETECT : 64|5@1+ (1,0) [0|31] "" XXX + SG_ FF_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ FF_LATERAL : 80|7@1+ (0.1,0) [0|127] "m" XXX + SG_ FF_DETECT_ALT : 88|5@1+ (1,0) [0|31] "" XXX + SG_ FF_DISTANCE_ALT : 93|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ FF_LATERAL_ALT : 104|7@1+ (0.1,0) [0|127] "m" XXX + SG_ LF_DETECT : 112|5@1+ (1,0) [0|31] "" XXX + SG_ LF_DETECT_DISTANCE : 117|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LF_DETECT_LATERAL : 128|7@1+ (0.1,0) [0|127] "m" XXX + SG_ RF_DETECT : 136|5@1+ (1,0) [0|31] "" XXX + SG_ RF_DETECT_DISTANCE : 141|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ RF_DETECT_LATERAL : 152|7@1+ (0.1,0) [0|127] "m" XXX + SG_ LR_DETECT : 163|5@1+ (1,0) [0|31] "" XXX + SG_ LR_DETECT_DISTANCE : 175|8@0+ (0.1,0) [0|255] "" XXX + SG_ LR_DETECT_LATERAL : 176|7@1+ (0.1,0) [0|127] "" XXX + SG_ RR_DETECT : 192|5@1+ (1,0) [0|31] "" XXX + SG_ RR_DETECT_DISTANCE : 197|8@1+ (0.1,0) [0|255] "" XXX + SG_ RR_DETECT_LATERAL : 205|7@1+ (0.1,0) [0|127] "" XXX + SG_ FAULT_FSS : 213|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_FCA : 216|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_LSS : 219|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_SLA : 222|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_DAW : 225|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_HBA : 228|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_SCC : 231|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_LFA : 234|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_HDA : 237|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_LCA : 240|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_HDP : 243|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_DAS : 246|3@1+ (1,0) [0|7] "" XXX + SG_ FAULT_ESS : 249|3@1+ (1,0) [0|7] "" XXX + +BO_ 357 SPAS1: 24 APRK + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_2 : 90|3@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 96|16@1- (0.1,0) [0|0] "" XXX + +BO_ 362 SPAS2: 32 APRK + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BLINKER_CONTROL : 133|3@1+ (1,0) [0|0] "" XXX + +BO_ 373 TCS: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 24|7@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_9 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ aBasis : 32|11@1+ (0.01,-10.23) [0|7] "m/s^2" XXX + SG_ NEW_SIGNAL_1 : 47|5@0+ (1,0) [0|31] "" XXX + SG_ ACCEL_REF_ACC : 48|11@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_2 : 63|5@0+ (1,0) [0|31] "" XXX + SG_ SCC_OptTyp : 64|2@1+ (1,0) [0|0] "" AWD,EMS,FR_CMR,HCU,H_U_MM,TCU,VCU,vBDM + SG_ ACCEnable : 67|2@0+ (1,0) [0|3] "" XXX + SG_ ACC_REQ : 68|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 69|1@0+ (1,0) [0|1] "" XXX + SG_ SCC_ReqLimSta : 70|2@1+ (1,0) [0|0] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM + SG_ ESC_StdStillVal : 72|2@1+ (1,0) [0|3] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM + SG_ BrakeLight : 74|2@1+ (1,0) [0|3] "" XXX + SG_ ESC_DclEnblReq : 76|2@1+ (1,0) [0|3] "" AWD,Dummy,EMS,FR_CMR,H_U_MM,TCU,vBDM + SG_ NEW_SIGNAL_5 : 79|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 80|1@0+ (1,0) [0|1] "" XXX + SG_ DriverBraking : 81|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_20 : 82|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_11 : 83|1@0+ (1,0) [0|1] "" XXX + SG_ DriverBrakingLowSens : 84|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_10 : 85|1@0+ (1,0) [0|1] "" XXX + SG_ ESC_PrkBrkActvSta : 86|2@1+ (1,0) [0|3] "" ADAS_DRV,AWD,Dummy,EMS,FR_CMR,H_U_MM,RR_C_RDR,TCU,vBDM + SG_ NEW_SIGNAL_12 : 95|8@0+ (1,0) [0|255] "" XXX + SG_ FCA_EquipSta : 96|2@1+ (1,0) [0|3] "" ADAS_DRV,FR_CMR,H_U_MM,vBDM + SG_ FCA_AvlblSta : 98|2@1+ (1,0) [0|3] "" ADAS_DRV,AFCU_DRV,CLU,Dummy,FR_CMR,H_U_MM,vBDM + SG_ NEW_SIGNAL_13 : 103|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 111|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 119|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_16 : 127|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 128|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_7 : 135|2@0+ (1,0) [0|3] "" XXX + SG_ PROBABLY_EQUIP : 136|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_18 : 143|6@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_19 : 151|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 183|16@0+ (1,0) [0|65535] "" XXX + +BO_ 384 CAM_0x180: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 385 CAM_0x181: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 386 CAM_0x182: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 387 CAM_0x183: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 388 CAM_0x184: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 389 CAM_0x185: 8 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 416 SCC_CONTROL: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ ACC_ObjDist : 24|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ ACC_ObjRelSpd : 35|12@1+ (0.1,-170) [-16.4|34.7] "m/s" XXX + SG_ ACC_ObjLatPos : 47|9@1- (0.1,-20) [0|511] "" XXX + SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ SysFailState : 64|2@1+ (1,0) [0|3] "" XXX + SG_ MainMode_ACC : 66|1@1+ (1,0) [0|1] "" XXX + SG_ ACCMode : 68|3@1+ (1,0) [0|7] "" XXX + SG_ TakeOverReq : 73|2@0+ (1,0) [0|3] "" XXX + SG_ InfoDisplay : 74|3@1+ (1,0) [0|7] "" XXX + SG_ DriverAlert : 77|2@1+ (1,0) [0|3] "" XXX + SG_ ObjDistLevel : 80|8@1+ (1,0) [0|255] "" XXX + SG_ DISTANCE_SETTING : 88|4@1+ (1,0) [0|15] "" XXX + SG_ VSetDis : 103|8@0+ (1,0) [0|255] "km/h or mph" XXX + SG_ NSCCOper : 104|2@1+ (1,0) [0|3] "" XXX + SG_ NSCCOnOff : 106|2@1+ (1,0) [0|3] "" XXX + SG_ HUD_LEAD_INFO : 108|3@1+ (1,0) [0|7] "" XXX + SG_ DriveMode : 112|3@1+ (1,0) [0|7] "" XXX + SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX + SG_ aReqRaw : 140|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX + SG_ JerkUpperLimit : 158|7@0+ (0.1,0) [0|0] "" XXX + SG_ JerkLowerLimit : 166|7@0+ (0.1,0) [0|12.7] "m/s^3" XXX + SG_ AccelLimitBandUpper : 173|6@0+ (0.02,0) [0|63] "" XXX + SG_ AccelLimitBandLower : 181|6@0+ (0.02,0) [0|63] "" XXX + SG_ StopReq : 185|2@0+ (1,0) [0|3] "" XXX + SG_ CRUSE_INFO_SET_2 : 189|2@0+ (1,0) [0|3] "" XXX + SG_ TARGET_DISTANCE : 192|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ ZEROS_2 : 207|5@0+ (1,0) [0|63] "" XXX + SG_ ZEROS : 215|48@0+ (1,0) [0|281474976710655] "" XXX + +BO_ 426 CRUISE_BUTTONS_ALT: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 24|4@1+ (1,0) [0|15] "" XXX + SG_ SET_ME_1 : 28|2@1+ (1,0) [0|3] "" XXX + SG_ DISTANCE_UNIT : 30|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 31|3@1+ (1,0) [0|7] "" XXX + SG_ ADAPTIVE_CRUISE_MAIN_BTN : 34|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ CRUISE_BUTTONS : 36|3@1+ (1,0) [0|4] "" XXX + SG_ LFA_BTN : 39|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 40|1@1+ (1,0) [0|1] "" XXX + SG_ NORMAL_CRUISE_MAIN_BTN : 41|1@1+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 42|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_2 : 44|3@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_6 : 47|1@1+ (1,0) [0|1] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ CLU_SPEED : 64|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX + +BO_ 437 CCNC_0x1B5: 32 CCNC + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_QUAL : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LEFT_LDW : 27|2@1+ (1,0) [0|3] "" XXX + SG_ LEFT_POSITION : 29|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" XXX + SG_ LEFT_HEADING : 43|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" XXX + SG_ LEFT_CURVATURE : 64|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" XXX + SG_ LEFT_CURVATURE_DERIVATIVE : 80|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" XXX + SG_ RIGHT_QUAL : 96|3@1+ (1,0) [0|7] "" XXX + SG_ RIGHT_LDW : 99|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_POSITION : 101|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" XXX + SG_ RIGHT_HEADING : 115|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" XXX + SG_ RIGHT_CURVATURE : 128|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" XXX + SG_ RIGHT_CURVATURE_DERIVATIVE : 144|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" XXX + SG_ LEAD : 192|7@1+ (1,0) [0|127] "" XXX + SG_ LEAD_SPEED : 200|12@1+ (0.05,-100) [-100|104.75] "m/s" XXX + SG_ LEAD_DISTANCE : 212|12@1+ (0.05,0) [0|204.75] "m" XXX + +BO_ 438 CAM_0x1b6: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 439 CAM_0x1b7: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 440 CAM_0x1b8: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 441 CAM_0x1b9: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 442 BLINDSPOTS_REAR_CORNERS: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_BLOCKED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_LEFT_TWO : 30|1@0+ (1,0) [0|3] "" XXX + SG_ INDICATOR_RIGHT_TWO : 32|1@1+ (1,0) [0|3] "" XXX + SG_ FL_INDICATOR : 46|6@0+ (1,0) [0|1] "" XXX + SG_ FR_INDICATOR : 54|6@0+ (1,0) [0|63] "" XXX + SG_ RIGHT_BLOCKED : 64|1@0+ (1,0) [0|1] "" XXX + SG_ COLLISION_AVOIDANCE_ACTIVE : 68|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_LEFT_THREE : 128|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_RIGHT_THREE : 130|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_LEFT_FOUR : 138|1@0+ (1,0) [0|1] "" XXX + SG_ INDICATOR_RIGHT_FOUR : 141|1@0+ (1,0) [0|1] "" XXX + +BO_ 463 CRUISE_BUTTONS: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|255] "" XXX + SG_ CRUISE_BUTTONS : 16|3@1+ (1,0) [0|3] "" XXX + SG_ ADAPTIVE_CRUISE_MAIN_BTN : 19|1@1+ (1,0) [0|1] "" XXX + SG_ NORMAL_CRUISE_MAIN_BTN : 21|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BTN : 23|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_PADDLE : 25|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_PADDLE : 27|1@1+ (1,0) [0|1] "" XXX + SG_ SET_ME_1 : 29|1@1+ (1,0) [0|1] "" XXX + SG_ SET_ME_1_ : 40|1@0+ (1,0) [0|1] "" XXX + +BO_ 474 ADRV_0x1da: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_22 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_41 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 480 LFAHDA_CLUSTER: 16 FR_CMR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HDA_OptUsmSta : 24|3@1+ (1,0) [0|0] "" CGW + SG_ LFA_OptUsmSta : 27|3@1+ (1,0) [0|0] "" CGW + SG_ HDA_CntrlModSta : 30|2@1+ (1,0) [0|0] "" CGW + SG_ HDA_InfoPUDis : 32|3@1+ (1,0) [0|0] "" CGW + SG_ HDA_AutoSetSpdSta : 35|2@1+ (1,0) [0|0] "" CGW + SG_ HDA_AutoSetSpdUpdtSta : 37|2@1+ (1,0) [0|0] "" CGW + SG_ HDA_AutoSetSpdVal : 39|8@1+ (1,0) [0|0] "km/h" CGW + SG_ HDA_LFA_SymSta : 47|2@1+ (1,0) [0|0] "" CGW + SG_ HDA_LFA_WrnSnd : 49|2@1+ (1,0) [0|0] "" Dummy + SG_ HDA_InfoPUDis1 : 51|3@1+ (1,0) [0|7] "" CLU,CGW + SG_ HDA_TDMRMDclReq : 54|2@1+ (1,0) [0|3] "" Dummy + +BO_ 485 BLINDSPOTS_FRONT_CORNER_1: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ REVERSING : 24|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_7 : 32|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_8 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_9 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 80|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 88|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 108|2@0+ (1,0) [0|3] "" XXX + +BO_ 490 ADRV_0x1ea: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 25|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_3 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINK_HOLD : 29|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINK_HOLD : 30|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ HDA_MODE2 : 32|3@1+ (1,0) [0|3] "" XXX + SG_ LANE_LEFT : 36|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_6 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ LANE_RIGHT : 41|2@0+ (1,0) [0|3] "" XXX + SG_ LANE_CHANGING : 45|3@0+ (1,0) [0|1] "" XXX + SG_ LF_DETECT_DISTANCE : 46|11@1+ (0.1,0) [0|2047] "" XXX + SG_ LF_DETECT_LATERAL : 70|7@0+ (0.1,0) [0|127] "" XXX + SG_ LF_DETECT : 74|3@0+ (1,0) [0|7] "" XXX + SG_ RF_DETECT_DISTANCE : 75|11@1+ (0.1,0) [0|2047] "" XXX + SG_ RF_DETECT_LATERAL : 94|7@0+ (0.1,0) [0|127] "" XXX + SG_ RF_DETECT : 98|3@0+ (1,0) [0|7] "" XXX + SG_ SET_ME_FF : 120|8@1+ (1,0) [0|255] "" XXX + SG_ LR_DETECT_DISTANCE : 139|8@1+ (0.1,0) [0|511] "m" XXX + SG_ LR_DETECT_LATERAL : 152|6@1+ (0.1,0) [0|63] "" XXX + SG_ LR_DETECT : 162|3@0+ (1,0) [0|1] "" XXX + SG_ RR_DETECT_DISTANCE : 163|8@1+ (0.1,0) [0|511] "m" XXX + SG_ RR_DETECT_LATERAL : 172|6@1+ (0.1,0) [0|63] "" XXX + SG_ RR_DETECT : 186|3@0+ (1,0) [0|1] "" XXX + SG_ AUTOLANECHANGE_MSG : 207|4@0+ (1,0) [0|3] "" XXX + SG_ LANELINE_CURVATURE : 208|4@1+ (1,0) [0|31] "" XXX + SG_ LANELINE_CURVATURE_DIRECTION : 212|1@0+ (1,0) [0|1] "" XXX + SG_ LANELINE_LEFT_POSITION : 239|8@0+ (1,0) [0|255] "" XXX + SG_ LANELINE_RIGHT_POSITION : 247|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 248|1@0+ (1,0) [0|1] "" XXX + +BO_ 506 CLUSTER_SPEED_LIMIT: 32 CAM + SG_ SPEED_LIMIT_1 : 39|7@0+ (1,0) [0|255] "" XXX + SG_ SPEED_LIMIT_2 : 47|7@0+ (1,0) [0|255] "" XXX + SG_ SECONDARY_LIMIT_1 : 79|8@0+ (1,0) [0|127] "" XXX + SG_ SECONDARY_LIMIT_2 : 103|8@0+ (1,0) [0|127] "" XXX + SG_ SPEED_LIMIT_3 : 119|8@0+ (1,0) [0|255] "" XXX + SG_ ARROW_DOWN : 120|1@0+ (1,0) [0|1] "" XXX + SG_ ARROW_UP : 121|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 122|3@1+ (1,0) [0|7] "" XXX + SG_ SPEED_CHANGE_BLINKING : 129|1@1+ (1,0) [0|3] "" XXX + SG_ CHIME_1 : 133|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 143|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 146|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_1 : 147|7@1+ (1,0) [0|127] "" XXX + SG_ SCHOOL_ZONE : 155|1@0+ (1,0) [0|1] "" XXX + SG_ SPEED_LIMIT_4 : 215|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 223|8@0+ (1,0) [0|255] "" XXX + +BO_ 507 CAM_0x1fb: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 512 ADRV_0x200: 8 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_E1 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ TauGapSet : 32|3@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 35|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_1 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ TauGapSet_ : 42|3@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_3 : 47|5@0+ (1,0) [0|31] "" XXX + +BO_ 513 RADAR_0x201: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 528 RADAR_0x210: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 529 RADAR_0x211: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 530 RADAR_0x212: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 531 RADAR_0x213: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 532 RADAR_0x214: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 533 RADAR_0x215: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 534 RADAR_0x216: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 535 RADAR_0x217: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 536 RADAR_0x218: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 537 RADAR_0x219: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 538 RADAR_0x21a: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 539 RADAR_0x21b: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 540 RADAR_0x21c: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 541 RADAR_0x21d: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 542 RADAR_0x21e: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 543 RADAR_0x21f: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 560 HCU_STATUS_230: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ HYBRID_POWER_FLOW_MODE : 170|4@1+ (1,0) [0|15] "" XXX + +CM_ BO_ 560 "Hyundai/Kia CAN-FD hybrid power-flow status observed on ECAN at 10 Hz; ACAN 0x230/DLC16 is an unrelated radar frame."; +CM_ SG_ 560 HYBRID_POWER_FLOW_MODE "Reverse-engineered enum; observed values 1, 2, and 6 correspond to the OEM EV indicator being on."; + +BO_ 576 RADAR_0x240: 16 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 593 RADAR_0x251: 16 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 674 CAM_0x2a2: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 675 CAM_0x2a3: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 676 CAM_0x2a4: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_PROB : 31|8@0+ (1,0) [0|255] "" XXX + SG_ RIGHT_LANE_PROB : 39|8@0+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_TYPE : 43|4@0+ (1,0) [0|15] "" XXX + SG_ RIGHT_LANE_TYPE : 47|4@0+ (1,0) [0|15] "" XXX + SG_ LEFT_LANE_COLOR : 48|4@1+ (1,0) [0|15] "" XXX + SG_ RIGHT_LANE_COLOR : 52|4@1+ (1,0) [0|15] "" XXX + SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 67|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 71|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 79|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 80|10@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_6 : 96|10@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_7 : 112|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_8 : 128|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_9 : 144|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_10 : 160|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_11 : 176|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_12 : 192|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_13 : 208|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_14 : 224|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_15 : 240|16@1+ (1,0) [0|65535] "" XXX + +BO_ 687 STEER_TOUCH_2AF: 8 XXX + SG_ CHECKSUM_ : 7|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER_ : 8|8@1+ (1,0) [0|255] "" XXX + SG_ TOUCH_DETECT : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ TOUCH1 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ TOUCH2 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 699 CAM_0x2bb: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 700 CAM_0x2bc: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 701 CAM_0x2bd: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 702 CAM_0x2be: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 736 MANUAL_SPEED_LIMIT_ASSIST: 32 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ MSLA_STATUS : 26|2@1+ (1,0) [0|3] "" XXX + SG_ MSLA_ENABLED : 38|1@1+ (1,0) [0|1] "" XXX + SG_ MAX_SPEED : 55|8@0+ (1,0) [0|255] "" XXX + SG_ MAX_SPEED_COPY : 144|8@1+ (1,0) [0|255] "" XXX + +BO_ 837 ADRV_0x345: 8 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_15 : 24|8@1+ (1,0) [0|255] "" XXX + +BO_ 866 CAM_0x362: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_PROB : 31|8@0+ (1,0) [0|255] "" XXX + SG_ RIGHT_LANE_PROB : 39|8@0+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_TYPE : 43|4@0+ (1,0) [0|15] "" XXX + SG_ RIGHT_LANE_TYPE : 47|4@0+ (1,0) [0|15] "" XXX + SG_ LEFT_LANE_COLOR : 48|4@1+ (1,0) [0|15] "" XXX + SG_ RIGHT_LANE_COLOR : 52|4@1+ (1,0) [0|15] "" XXX + SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 67|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 71|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 79|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 80|10@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_6 : 96|10@1- (1,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_7 : 112|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_8 : 128|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_9 : 144|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_10 : 160|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_11 : 176|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_12 : 192|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_13 : 208|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_14 : 224|16@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_15 : 240|16@1+ (1,0) [0|65535] "" XXX + +BO_ 874 BLINDSPOTS_FRONT_CORNER_2: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ RIGHT_BSD : 27|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BSD : 28|1@0+ (1,0) [0|1] "" XXX + +BO_ 928 TPMS: 16 XXX + SG_ PRESSURE_FL : 39|8@0+ (1,0) [0|255] "" XXX + SG_ PRESSURE_FR : 47|8@0+ (1,0) [0|255] "" XXX + SG_ PRESSURE_RL : 55|8@0+ (1,0) [0|255] "" XXX + SG_ PRESSURE_RR : 63|8@0+ (1,0) [0|255] "" XXX + SG_ STATUS_TPMS : 66|3@0+ (1,0) [0|3] "" XXX + SG_ UNIT : 68|2@0+ (1,0) [0|3] "" XXX + +BO_ 961 BLINKER_STALKS: 8 XXX + SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ HIGHBEAM_FORWARD : 18|1@0+ (1,0) [0|1] "" XXX + SG_ LIGHT_KNOB_POSITION : 21|2@0+ (1,0) [0|3] "" XXX + SG_ HIGHBEAM_BACKWARD : 26|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 30|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 32|1@0+ (1,0) [0|1] "" XXX + +BO_ 995 BLINKERS_ALT: 16 XXX + SG_ LEFT_BLINKER : 74|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 76|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LAMP_ALT : 89|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LAMP : 90|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LAMP_ALT : 91|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LAMP : 92|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 95|1@0+ (1,0) [0|1] "" XXX + SG_ BLINKER_ACTIVE : 97|1@0+ (1,0) [0|1] "" XXX + +BO_ 1041 DOORS_SEATBELTS: 8 XXX + SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|65535] "" XXX + SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ DRIVER_DOOR : 24|1@1+ (1,0) [0|1] "" XXX + SG_ PASSENGER_DOOR : 34|1@0+ (1,0) [0|1] "" XXX + SG_ PASSENGER_SEATBELT : 36|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_SEATBELT : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_REAR_DOOR : 52|1@0+ (1,0) [0|1] "" XXX + SG_ PASSENGER_REAR_DOOR : 56|1@0+ (1,0) [0|1] "" XXX + +BO_ 1043 BLINKERS: 8 XXX + SG_ LEFT_STALK : 8|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_STALK : 10|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ LEFT_LAMP : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LAMP : 22|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LAMP_ALT : 59|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LAMP_ALT : 61|1@0+ (1,0) [0|1] "" XXX + SG_ USE_ALT_LAMP : 62|1@0+ (1,0) [0|1] "" XXX + +BO_ 1052 LIGHT_SENSOR: 8 XXX + SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX + SG_ IS_DARK : 19|1@0+ (1,0) [0|1] "" XXX + SG_ LIGHT_LEVEL : 24|10@1+ (1,0) [0|1023] "" XXX + +BO_ 1144 DRIVE_MODE: 8 XXX + SG_ DRIVE_MODE : 0|16@1+ (1,-61611) [0|61611] "" XXX + SG_ DRIVE_MODE2 : 28|3@1+ (1,0) [1|3] "" XXX + +BO_ 1151 HVAC_TOUCH_BUTTONS: 8 XXX + SG_ AUTO_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX + SG_ SYNC_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX + SG_ FR_DEFROST_BUTTON : 20|1@0+ (1,0) [0|1] "" XXX + SG_ RR_DEFROST_BUTTON : 22|1@0+ (1,0) [0|1] "" XXX + SG_ FAN_SPEED_UP_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX + SG_ FAN_SPEED_DOWN_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX + SG_ AIR_DIRECTION_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX + SG_ AC_BUTTON : 40|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_ONLY_BUTTON : 44|1@0+ (1,0) [0|1] "" XXX + SG_ RECIRC_BUTTON : 48|1@0+ (1,0) [0|1] "" XXX + SG_ HEAT_BUTTON : 52|1@0+ (1,0) [0|1] "" XXX + +BO_ 1187 HDA_INFO_4A3: 8 XXX + SG_ LinkClass : 0|3@1+ (1,0) [0|7] "" XXX + SG_ Frwinfo : 3|3@1+ (1,0) [0|7] "" XXX + SG_ SpeedUnit : 6|2@1+ (1,0) [0|3] "" XXX + SG_ SPEED_LIMIT : 15|8@0+ (1,0) [0|255] "" XXX + SG_ CountryCode : 16|10@1+ (1,0) [0|1023] "" XXX + SG_ MapSource : 27|3@1+ (1,0) [0|7] "" XXX + SG_ TollExist : 30|2@1+ (1,0) [0|3] "" XXX + SG_ TunnelExist : 38|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_6 : 47|24@0+ (1,0) [0|16777215] "" XXX + +BO_ 1204 NEW_MSG_4B4: 8 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_7 : 35|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 39|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1209 NEW_MSG_4B9: 8 XXX + SG_ BYTE_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_3 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_4 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_5 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_6 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_7 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_8 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1214 NEW_MSG_4BE: 8 XXX + SG_ BYTE_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_3 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_4 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_5 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_6 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_7 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ BYTE_8 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1240 CLUSTER_INFO: 8 XXX + SG_ DISTANCE_UNIT : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 1259 LOCAL_TIME2: 8 XXX + SG_ HOURS : 15|5@0+ (1,0) [0|31] "" XXX + SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX + SG_ SECONDS : 24|6@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_3 : 39|1@0+ (1,0) [0|1] "" XXX + +BO_ 1264 LOCAL_TIME: 8 XXX + SG_ HOURS : 12|5@0+ (1,0) [0|31] "" XXX + SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX + SG_ SECONDS : 31|8@0+ (1,0) [0|59] "" XXX + SG_ MONTH : 37|4@0+ (1,0) [0|15] "" XXX + SG_ YEAR : 47|8@0+ (1,0) [0|255] "" XXX + SG_ DATE : 48|5@1+ (1,0) [0|31] "" XXX + +CM_ SG_ 80 HAS_LANE_SAFETY "If 0, hides LKAS 'Lane Safety' menu from vehicle settings"; +CM_ SG_ 96 BRAKE_PRESSURE "User applied brake pedal pressure. Ramps from computer applied pressure on falling edge of cruise. Cruise cancels if !=0"; +CM_ SG_ 101 BRAKE_POSITION "User applied brake pedal position, max is ~700. Signed on some vehicles"; +CM_ SG_ 272 LKAS_ANGLE_CMD "tracks MDPS->STEERING_ANGLE when not engaged, not STEERING_SENSORS->STEERING_ANGLE"; +CM_ SG_ 352 SET_ME_9 "has something to do with AEB settings"; +CM_ SG_ 373 ACCEnable "Likely a copy of CAN's TCS13->ACCEnable"; +CM_ SG_ 373 DriverBraking "Likely derived from BRAKE->BRAKE_POSITION"; +CM_ SG_ 373 DriverBrakingLowSens "Higher threshold version of DriverBraking"; +CM_ SG_ 373 PROBABLY_EQUIP "aeb equip?"; +CM_ SG_ 416 VSetDis "set speed in display units"; +CM_ SG_ 676 LEFT_LANE_LINE "Left lane line confidence"; +CM_ SG_ 676 RIGHT_LANE_LINE "Right lane line confidence"; +CM_ SG_ 736 MAX_SPEED "Display units. Restricts car from driving above this speed unless accelerator pedal is depressed beyond pressure point"; +CM_ SG_ 866 LEFT_LANE_LINE "Left lane line confidence"; +CM_ SG_ 866 RIGHT_LANE_LINE "Right lane line confidence"; +CM_ SG_ 961 COUNTER_ALT "only increments on change"; +CM_ SG_ 1041 COUNTER_ALT "only increments on change"; +CM_ SG_ 1043 COUNTER_ALT "only increments on change"; +CM_ SG_ 1043 USE_ALT_LAMP "likely 1 on cars that use alt lamp signals"; +VAL_ 53 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; +VAL_ 64 GEAR 0 "P" 5 "D" 6 "N" 7 "R" 4 "T"; +VAL_ 69 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; +VAL_ 80 LKA_MODE 1 "warning only" 2 "assist" 6 "off"; +VAL_ 80 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green"; +VAL_ 96 TRACTION_AND_STABILITY_CONTROL 0 "On" 5 "Limited" 1 "Off"; +VAL_ 112 GEAR 0 "P" 5 "D" 6 "N" 7 "R"; +VAL_ 234 LKA_FAULT 0 "ok" 1 "lka fault"; +VAL_ 267 CRUISE_BUTTONS 8 "CRUISE_MAIN" 4 "CANCEL" 1 "RES" 2 "SET" 3 "GAP"; +VAL_ 272 LKA_MODE 1 "warning only" 2 "assist" 6 "off"; +VAL_ 272 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green"; +VAL_ 272 LKAS_ANGLE_ACTIVE 1 "not active" 2 "active"; +VAL_ 298 LKA_MODE 1 "warning only" 2 "assist" 6 "off"; +VAL_ 298 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green"; +VAL_ 304 PARK_BUTTON 1 "Pressed" 2 "Not Pressed"; +VAL_ 304 KNOB_POSITION 1 "R" 2 "N (on R side)" 3 "Centered" 4 "N (on D side)" 5 "D"; +VAL_ 304 GEAR 1 "P" 2 "R" 3 "N" 4 "D"; +VAL_ 352 AEB_SETTING 1 "off" 2 "warning only" 3 "active assist"; +VAL_ 353 FCA_ICON 0 "HIDDEN" 1 "ORANGE" 2 "RED"; +VAL_ 353 FCA_ALT_ICON 0 "HIDDEN" 1 "ORANGE" 3 "RED"; +VAL_ 353 LKA_ICON 0 "HIDDEN" 1 "ORANGE" 3 "GRAY" 4 "GREEN"; +VAL_ 353 HBA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN"; +VAL_ 353 FCA_IMAGE 0 "HIDDEN" 2 "VISIBLE"; +VAL_ 353 BCA_LEFT 0 "HIDDEN" 1 "VISIBLE" 2 "VISIBLE+ICON"; +VAL_ 353 BCA_RIGHT 0 "HIDDEN" 1 "VISIBLE" 2 "VISIBLE+ICON"; +VAL_ 353 LCA_LEFT_ARROW 0 "HIDDEN" 1 "VISIBLE"; +VAL_ 353 LCA_RIGHT_ARROW 0 "HIDDEN" 1 "VISIBLE"; +VAL_ 353 CENTERLINE 0 "HIDDEN" 1 "GREEN"; +VAL_ 353 TARGET 0 "HIDDEN" 1 "BLUE" 3 "WHITE"; +VAL_ 353 LANELINE_LEFT 0 "GRAY" 1 "HIDDEN" 2 "WHITE" 4 "ORANGE" 6 "GREEN"; +VAL_ 353 LANELINE_RIGHT 0 "GRAY" 1 "HIDDEN" 2 "WHITE" 4 "ORANGE" 6 "GREEN"; +VAL_ 353 LANE_HIGHLIGHT 0 "HIDDEN" 1 "GREEN" 2 "WHITE" 3 "BLUE" 4 "ORANGE" 5 "RED"; +VAL_ 353 LANE_LEFT 0 "HIDDEN" 1 "GREEN"; +VAL_ 353 LANE_RIGHT 0 "HIDDEN" 1 "GREEN"; +VAL_ 353 LANE_ZOOM 0 "ZOOM" 1 "HIDDEN"; +VAL_ 353 ALERTS_1 0 "HIDDEN" 1 "WARNING_ONLY_CAR_CENTER" 2 "WARNING_ONLY_CAR_LEFT" 3 "WARNING_ONLY_CAR_RIGHT" 4 "WARNING_ONLY_LEFT" 5 "WARNING_ONLY_RIGHT" 11 "EMERGENCY_BRAKING_CAR_CENTER" 12 "EMERGENCY_BRAKING_CAR_LEFT" 13 "EMERGENCY_BRAKING_CAR_RIGHT" 14 "EMERGENCY_BRAKING_LEFT" 15 "EMERGENCY_BRAKING_RIGHT" 21 "EMERGENCY_STEERING_CAR_LEFT" 22 "EMERGENCY_STEERING_CAR_RIGHT" 23 "EMERGENCY_STEERING_CAR_LEFT_AWAY" 24 "EMERGENCY_STEERING_CAR_RIGHT_AWAY" 25 "EMERGENCY_STEERING_REAR_LEFT" 26 "EMERGENCY_STEERING_REAR_RIGHT" 33 "DRIVE_CAREFULLY"; +VAL_ 353 ALERTS_2 0 "HIDDEN" 1 "KEEP_HANDS_ON_STEERING_WHEEL" 2 "KEEP_HANDS_ON_STEERING_WHEEL_RED" 3 "LANE_FOLLOWING_ASSIST_DEACTIVATED" 4 "HIGHWAY_DRIVING_ASSIST_DEACTIVATED" 5 "CONSIDER_TAKING_A_BREAK" 6 "PRESS_OK_BUTTON_TO_ENABLE_LANE_CHANGE_ASSIST" 7 "COLLISION_RISK_VEHICLE_TAKING_EMERGENCY_CONTROL" 8 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY_VEHICLE_IS_STOPPING" 9 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY" 11 "HIGHWAY_DRIVING_PILOT_SYSTEM_DEACTIVATED_AUDIBLE" 12 "KEEP_YOUR_EYES_ON_THE_ROAD" 13 "HIGHWAY_DRIVING_PILOT_CONDITIONS_NOT_MET_AUDIBLE" 14 "COLLISION_RISK_VEHICLE_TAKING_EMERGENCY_CONTROL" 15 "SET_THE_WIPER_AND_LIGHT_CONTROLS_TO_AUTO" 16 "BE_PREPARED_TO_TAKE_CONTROL_OF_THE_VEHICLE_AT_ANY_TIME" 21 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY_VEHICLE_IS_STOPPING" 10 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY"; +VAL_ 353 ALERTS_3 0 "HIDDEN" 1 "AUTOMATICALLY_ADJUSTING_TO_THE_POSTED_SPEED_LIMIT" 2 "SET_SPEED_CHANGED" 3 "AUTOMATICALLY_ADJUSTING_TO_THE_POSTED_SPEED_LIMIT" 4 "SET_SPEED_CHANGED" 7 "DISTANCE_1" 8 "DISTANCE_2" 9 "DISTANCE_3" 10 "DISTANCE_4" 17 "DRIVE_CAREFULLY" 18 "CHECK_SURROUNDINGS" 19 "CONDITIONS_NOT_MET" 20 "LANES_NOT_DETECTED" 21 "CURVE_TOO_SHARP" 22 "LANE_TOO_NARROW" 23 "ROAD_TYPE_NOT_SUPPORTED" 24 "UNAVAILABLE_WITH_HAZARD_LIGHTS_ON" 25 "VEHICLE_SPEED_IS_TOO_LOW" 26 "KEEP_HANDS_ON_STEERING_WHEEL" 27 "LANE_TYPE_NOT_SUPPORTED" 28 "LANE_ASSIST_CANCELED_STEERING_INPUT_DETECTED"; +VAL_ 353 ALERTS_4 0 "HIDDEN" 1 "TAKE_FOOT_OFF_THE_ACCELERATOR_PEDAL" 2 "TAKE_FOOT_OFF_THE_BRAKE_PEDAL" 3 "UNAVAILABLE_WHILE_HIGHWAY_DRIVING_PILOT_SYSTEM_IS_ACTIVE" 4 "TO_EXIT_HDP_GRASP_THE_STEERING_WHEEL_THEN_PRESS_AND_HOLD_THE_HDP_BUTTON" 5 "ACCELERATOR_PEDAL_OPERATION_LIMITED_FOR_SAFETY" 6 "TURN_OFF_HAZARD_WARNING_LIGHTS_AND_TURN_SIGNAL" 7 "KEEP_THE_DRIVERS_SEAT_IN_A_SAFE_DRIVING_POSITION" 16 "SET_SPEED_CHANGED" 17 "ACTIVATING_WINDSHIELD_DEFOG_TO_MAINTAIN_THE_DRIVERS_VIEW" 18 "SET_THE_WIPER_AND_LIGHT_CONTROLS_TO_AUTO" 19 "VEHICLE_SPEED_REDUCED_FOR_SAFETY_MERGING_LANES_AHEAD" 20 "SPEED_REDUCED_FOR_SAFETY_CONSTRUCTION_ZONE_DETECTED" 21 "VEHICLE_SPEED_LIMITED_SENSOR_DETECTION_RANGE_LIMITED" 22 "PREPARE_TO_TAKE_CONTROL_UNSUPPORTED_ROAD_TYPE_AHEAD" 23 "PREPARE_TO_TAKE_CONTROL_ENTRANCE_AND_EXIT_RAMPS_AHEAD" 24 "PREPARE_TO_TAKE_CONTROL_TOLLGATE_AHEAD" 25 "PREPARE_TO_TAKE_CONTROL_ROAD_EVENT_AHEAD" 26 "CLEARING_PATH_FOR_EMERGENCY_VEHICLE" 27 "VEHICLE_IS_TOO_SLOW_COMPARED_TO_TRAFFIC_FLOW" 28 "AFTER_SUNSET_HDP_IS_AVAILABLE_IN_AN_INSIDE_LANE_BEHIND_A_LEADING_VEHICLE" 29 "VEHICLE_SPEED_LIMITED_MERGING_LANES_AHEAD" 30 "VEHICLE_SPEED_LIMITED_CONSTRUCTION_ZONE_DETECTED" 31 "VEHICLE_SPEED_TEMPORARILY_LIMITED_FOR_SAFETY" 32 "PRESS_AND_HOLD_THE_BUTTON_TO_ACTIVATE_HIGHWAY_DRIVING_PILOT" 40 "HIGHWAY_DRIVING_PILOT_SYSTEM_IS_AVAILABLE" 64 "RESTART_VEHICLE_AFTER_EMERGENCY_STOP" 65 "CONNECTED_SERVICES_UNAVAILABLE" 66 "AVAILABLE_AFTER_VEHICLE_SOFTWARE_IS_UPDATED" 67 "ROAD_TYPE_NOT_SUPPORTED" 68 "ONLY_AVAILABLE_WHILE_DRIVING_ON_HIGHWAY_LANES" 69 "UNAVAILABLE_WHILE_OTHER_WARNINGS_ARE_ACTIVE" 70 "CANNOT_ACTIVATE_AT_ENTRANCE_EXIT_RAMPS" 71 "LANE_UNSUPPORTED" 72 "NOT_AVAILABLE_IN_THIS_COUNTRY" 79 "CHECKING_THE_DETECTION_RANGE_OF_THE_SENSOR" 80 "SHIFT_TO_D" 81 "ENGINE_STOPPED_BY_AUTO_STOP" 82 "INCREASE_DISTANCE_FROM_VEHICLE_AHEAD" 83 "VEHICLE_SPEED_IS_TOO_HIGH" 84 "CENTER_VEHICLE_IN_THE_LANE" 85 "PARKING_ASSIST_IS_ACTIVE" 86 "ESC_ACTIVIATION_REQUIRED" 87 "UNFOLD_SIDE_VIEW_MIRRORS" 88 "UNAVAILABLE_IN_THE_OUTER_LANE_AFTER_SUNSET" 89 "VEHICLE_SPEED_LIMITED_AFTER_SUNSET_FOR_SAFETY" 90 "LEADING_VEHICLE_NOT_DETECTED" 104 "AGGRESSIVE_BRAKING_OR_STEERING_DETECTED" 110 "SENSOR_AUTO_CALIBRATION_IN_PROGRESS_THIS_MAY_TAKE_SEVERAL_MINUTES" 111 "HIGHWAY_DRIVING_PILOT_WILL_BE_AVAILABLE_SHORTLY" 112 "IF_STEERING_WHEEL_IS_USED_HDP_WILL_BE_DEACTIVATED" 120 "IMPACT_DETECTED" 128 "UNSUITABLE_USE_OF_ACCELERATOR_PEDAL_DETECTED" 129 "GEAR_SHIFTER_USE_DETECTED" 130 "UNSUITABLE_BRAKE_PEDAL_USE_DETECTED" 131 "VEHICLE_START_BUTTON_PRESSED" 132 "VEHICLE_HAS_BEEN_STOPPED_FOR_TOO_LONG" 141 "TRAFFIC_CONGESTION_HAS_CLEARED" 142 "ENTRANCE_AND_EXIT_RAMPS_AHEAD" 143 "UNSUPPORTED_LANE_AHEAD" 144 "UNSUPPORTED_ROAD_TYPE_AHEAD" 145 "LANE_DEPARTURE_DETECTED" 146 "MAXIMUM_SPEED_EXCEEDED" 147 "HIGHWAY_DRIVING_PILOT_LIMITED_ABNORMAL_VEHICLE_CONTROLLER_STATUS" 148 "WIPER_LIGHT_CONTROL_SETTINGS_ARE_UNSUITABLE_FOR_USE_WITH_HDP" 149 "WINDSHIELD_DEFOG_SYSTEM_STATUS_IS_UNSUITABLE_FOR_USE_WITH_HDP" 150 "HAZARD_WARNING_LIGHTS_OR_TURN_SIGNAL_OPERATION_DETECTED" 151 "PERFORMING_EVASIVE_STEERING_OBSTACLES_DETECTED_AHEAD" 152 "HIGHWAY_DRIVING_PILOT_LIMITED_SENSOR_DETECTION_RANGE_LIMITED" 160 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 161 "SAFETY_FUNCTION_ACTIVATED" 176 "CAMERA_OBSCURED" 177 "RADAR_BLOCKED" 178 "LIDAR_BLOCKED" 179 "AIRBAG_WARNING_LIGHT_IS_ON" 180 "ATTACHED_TRAILED_DETECTED" 181 "HIGH_OUTSIDE_TEMPERATURE" 182 "LOW_OUTSIDE_TEMPERATURE" 190 "UNAVAILABLE_DUE_TO_THE_ROAD_EVENT_INFORMATION_RECEIVED" 191 "UNAVAILABLE_NEAR_TOLLGATES" 192 "DRIVERS_SEAT_IS_NOT_IN_A_SAFE_DRIVING_POSITION" 193 "VEHICLE_DRIVING_THE_WRONG_WAY_DETECTED_AHEAD" 194 "EMERGENCY_VEHICLE_DETECTED" 195 "OBSTACLE_DETECTED_AHEAD" 196 "SENSOR_BLOCKED_DUE_TO_RAIN_SNOW_OR_ROAD_DEBRIS" 197 "SLIPPERY_ROAD_SURFACE_DETECTED" 198 "CONSTRUCTION_ZONE_DETECTED_AHEAD" 199 "PEDESTRIAN_DETECTED_AHEAD" 200 "UNSUITABLE_DRIVERS_SEAT_POSITION_DETECTED" 201 "FOLDED_SIDE_VIEW_MIRRORS_DETECTED" 208 "VEHICLE_POSITION_NOT_DETECTED" 209 "LANE_NOT_DETECTED" 210 "DRIVER_NOT_DETECTED" 211 "KEEP_YOUR_EYES_ON_THE_ROAD" 212 "LEADING_VEHICLE_REQUIRED_AFTER_SUNSET" 213 "TBD" 240 "LOW_FUEL" 241 "LOW_TIRE_PRESSURE" 242 "DOOR_OPEN" 243 "TRUNK_OPEN" 244 "HOOD_OPEN" 245 "SEAT_BELT_NOT_FASTENED" 246 "PARKING_BRAKE_ACTIVATED" 247 "LOW_EV_BATTERY" 248 "HDP_DEACTIVATION_DELAYED_RISK_OF_COLLISION_DETECTED" 249 "LIFTGATE_OPENED"; +VAL_ 353 ALERTS_5 0 "HIDDEN" 1 "DRIVERS_GRASP_NOT_DETECTED_DRIVING_SPEED_WILL_BE_LIMITED" 2 "WATCH_FOR_SURROUNDING_VEHICLES" 3 "SMART_CRUISE_CONTROL_DEACTIVATED" 4 "SMART_CRUISE_CONTROL_CONDITIONS_NOT_MET" 5 "USE_SWITCH_OR_PEDAL_TO_ACCELERATE" 6 "DRIVER_ASSISTNCE_SYSTEM_LIMITED_TRAILER_ATTACHED" 7 "DRIVER_ASSISTNCE_SYSTEM_LIMITED_DRIVER_FULL_FACE_NOT_VISIBLE" 11 "LEADING_VEHICLE_IS_DRIVING_AWAY" 12 "STOP_VEHICLE_THEN_TRY_AGAIN" 19 "ACTIVATING_HIGHWAY_DRIVING_PILOT_SYSTEM" 20 "CONTINUING_USE_OF_HIGHWAY_DRIVING_PILOT_WILL_RESULT_IN_DEVIATION_FROM_THE_NAVIGATION_ROUTE" 21 "HIGHWAY_DRIVING_PILOT_SYSTEM_DEACTIVATED_SILENT" 22 "HIGHWAY_DRIVING_PILOT_SYSTEM_NOT_APPLIED" 23 "HIGHWAY_DRIVING_PILOT_CONDITIONS_NOT_MET_SILENT"; +VAL_ 353 MUTE 0 "NONE" 1 "MUTED"; +VAL_ 353 SOUNDS_1 0 "NONE" 3 "FAST BEEP" 6 "CONSTANT BEEP"; +VAL_ 353 SOUNDS_2 0 "NONE" 2 "SINGLE CHIME" 3 "CONSTANT CHIME" 6 "FAST BEEP"; +VAL_ 353 SOUNDS_3 0 "NONE" 3 "SOFT CHIME" 5 "SINGLE CHIME"; +VAL_ 353 SOUNDS_4 0 "NONE" 2 "DOUBLE CHIME"; +VAL_ 353 SETSPEED_HUD 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN"; +VAL_ 353 DISTANCE_LEAD 0 "HIDDEN" 1 "GRAY" 2 "WHITE"; +VAL_ 353 DISTANCE_CAR 0 "HIDDEN" 1 "GRAY" 2 "WHITE" 3 "CYAN"; +VAL_ 353 DISTANCE_SPACING 0 "HIDDEN" 1 "BLUE" 3 "WHITE" 5 "CYAN"; +VAL_ 353 SETSPEED 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 6 "CYAN"; +VAL_ 353 HDA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN HDP"; +VAL_ 353 SLA_ICON 0 "HIDDEN" 1 "WHITE UP" 2 "WHITE DOWN" 3 "GREEN UP" 4 "GREEN DOWN"; +VAL_ 353 NAV_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; +VAL_ 353 LFA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN"; +VAL_ 353 LCA_LEFT_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; +VAL_ 353 LCA_RIGHT_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE"; +VAL_ 353 BACKGROUND 0 "HIDDEN" 1 "BLUE" 3 "ORANGE" 4 "FLASHING ORANGE" 6 "FLASHING RED" 7 "GRAY"; +VAL_ 353 DAW_ICON 0 "HIDDEN" 1 "ORANGE"; +VAL_ 353 CAR_CIRCLE 0 "HIDDEN" 1 "GRAY" 2 "CYAN"; +VAL_ 354 COUNTRY 0 "HIDDEN" 1 "SOUTH_KOREA" 4 "INTL" 5 "JAPAN" 6 "CANADA" 7 "USA" 8 "CHINA" 9 "INTL"; +VAL_ 354 SPEEDLIMIT_FLASH 0 "HIDDEN" 1 "ERROR" 2 "NORMAL" 4 "RED"; +VAL_ 354 SIGNS 0 "HIDDEN" 1 "PEDESTRIAN_CROSSING" 2 "SCHOOL_CROSSWALK" 8 "STOP" 9 "YIELD" 16 "DO_NOT_PASS" 19 "DO_NOT_ENTER" 24 "ROUNDABOUT" 26 "RIGHT_CURVE_AHEAD" 27 "LEFT_CURVE_AHEAD" 28 "SLIGHT_RIGHT_CURVE_AHEAD" 29 "SLIGHT_LEFT_CURVE_AHEAD"; +VAL_ 354 SPEEDLIMIT_WEATHER 0 "HIDDEN" 1 "RAIN" 2 "SNOW" 3 "RAIN+SNOW" 4 "TRAILER"; +VAL_ 354 VIBRATE 0 "NONE" 1 "VIBRATE"; +VAL_ 354 FF_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 FF_DETECT_ALT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "DIM CONE" 4 "ORANGE CONE"; +VAL_ 354 LF_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 RF_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 LR_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 RR_DETECT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE"; +VAL_ 354 FAULT_FSS 0 "HIDDEN" 1 "CHECK_FORWARD_SAFETY_SYSTEM" 2 "FORWARD_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED"; +VAL_ 354 FAULT_FCA 0 "HIDDEN" 1 "CHECK_FORWARD_SIDE_SAFETY_SYSTEM" 2 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED"; +VAL_ 354 FAULT_LSS 0 "HIDDEN" 1 "CHECK_LANE_SAFETY_SYSTEM" 2 "LANE_SAFETY_SYSTEM_DISABLED_CAMERA_OBSCURED"; +VAL_ 354 FAULT_SLA 0 "HIDDEN" 1 "CHECK_SPEED_LIMIT_SYSTEM" 2 "SPEED_LIMIT_SYSTEM_DISABLED_CAMERA_OBSCURED"; +VAL_ 354 FAULT_DAW 0 "HIDDEN" 1 "CHECK_INATTENTIVE_DRIVING_WARNING_SYSTEM" 2 "INATTENTIVE_DRIVING_WARNING_SYSTEM_DISABLED_CAMERA_OBSCURED"; +VAL_ 354 FAULT_HBA 0 "HIDDEN" 1 "CHECK_HIGH_BEAM_ASSIST_SYSTEM"; +VAL_ 354 FAULT_SCC 0 "HIDDEN" 1 "CHECK_SMART_CRUISE_CONTROL_SYSTEM" 2 "SMART_CRUISE_CONTROL_DISABLED_RADAR_BLOCKED"; +VAL_ 354 FAULT_LFA 0 "HIDDEN" 1 "CHECK_LANE_FOLLOWING_SYSTEM_ASSIST_SYSTEM"; +VAL_ 354 FAULT_HDA 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_ASSIST_SYSTEM"; +VAL_ 354 FAULT_LCA 0 "HIDDEN" 1 "CHECK_LANE_CHANGE_ASSIST_FUNCTION" 2 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_RADAR_BLOCKED"; +VAL_ 354 FAULT_HDP 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 2 "HIGHWAY_DRIVING_PILOT_DISABLED_CAMERA_OBSCURED" 3 "HIGHWAY_DRIVING_PILOT_DISABLED_RADAR_BLOCKED" 4 "HIGHWAY_DRIVING_PILOT_DISABLED_LIDAR_BLOCKED"; +VAL_ 354 FAULT_DAS 0 "HIDDEN" 1 "CHECK_DRIVER_ASSISTANCE_SYSTEM" 2 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_RADAR_BLOCKED" 4 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED_AND_RADAR_BLOCKED"; +VAL_ 354 FAULT_ESS 0 "HIDDEN" 1 "CHECK_EMERGENCY_STOPPING_FUNCTION" 2 "EMERGENCY_STOPPING_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "EMERGENCY_STOPPING_FUNCTION_DISABLED_RADAR_BLOCKED"; +VAL_ 362 BLINKER_CONTROL 1 "hazards" 2 "hazards button backlight" 3 "left blinkers" 4 "right blinkers"; +VAL_ 373 SCC_OptTyp 0 "SCC is not equipped" 1 "SCC is equipped" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; +VAL_ 373 SCC_ReqLimSta 0 "No request" 1 "Limited No Limitation" 2 "Acceleration Limited" 3 "Deceleration Limited"; +VAL_ 373 ESC_StdStillVal 0 "No stand still detected" 1 "stand still detected" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 ESC_DclEnblReq 0 "Disable deceleration control" 1 "Enable deceleration control" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 ESC_PrkBrkActvSta 0 "Parking brake is not activated" 1 "Parking brake is activated" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 FCA_EquipSta 0 "FCA is not equipped" 1 "FCA is equipped" 2 "Not used" 3 "Error Indicator"; +VAL_ 373 FCA_AvlblSta 0 "Available" 1 "Temporarily not available" 2 "Permanently not available" 3 "FCA Communication Error"; +VAL_ 416 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; +VAL_ 426 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume"; +VAL_ 463 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume"; +VAL_ 463 RIGHT_PADDLE 0 "Not Pulled" 1 "Pulled"; +VAL_ 463 LEFT_PADDLE 0 "Not Pulled" 1 "Pulled"; +VAL_ 480 HDA_OptUsmSta 0 "Not Applied" 1 "Function Off" 2 "Function On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Fail)"; +VAL_ 480 LFA_OptUsmSta 0 "Not Applied" 1 "Function Off" 2 "Function On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Fail)"; +VAL_ 480 HDA_CntrlModSta 0 "System Deactive (Default)" 1 "System Ready" 2 "System Active" 3 "Reserved"; +VAL_ 480 HDA_InfoPUDis 0 "No pop-up" 1 "system start pop-up" 2 "system auto disengaged pop-up by highway off" 3 "system auto disengaged pop-up" 4 "system Fail pop-up" 5 "Hands-off pop up" 6 "Hands-off pop up w/ sound" 7 "System Automatic off"; +VAL_ 480 HDA_AutoSetSpdSta 0 "Auto Set Speed Off" 1 "Auto Set Speed On" 2 "Reserved" 3 "Error indicator"; +VAL_ 480 HDA_AutoSetSpdUpdtSta 0 "Auto Set Speed Update Off" 1 "Auto Set Speed Update On" 2 "Reserved" 3 "Error indicator"; +VAL_ 480 HDA_LFA_SymSta 0 "Off" 1 "Gray" 2 "Green" 3 "Green blink"; +VAL_ 480 HDA_LFA_WrnSnd 0 "Off" 1 "Additional Warning Sound" 2 "Reserved" 3 "Error indicator"; +VAL_ 480 HDA_InfoPUDis1 0 "No Pop-up" 1 "System Automatic off (LFA)" 2 "System Automatic off (HDA)" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Not Used" 7 "Error Indicator"; +VAL_ 480 HDA_TDMRMDclReq 0 "Not automatically deactivated state of LFA (default)" 1 "Automatically deactivated state of LFA" 2 "Reserved" 3 "Reserved"; +VAL_ 490 HDA_MODE2 1 "Lane change icon gray" 2 "lane green + lane change icon green" 3 "lane green + lane change icon green (both blinking)" 4 "lane white + lane change icon white (both blinking rapidly)" 5 "Lane Change Assist system check warning"; +VAL_ 490 LANE_LEFT 0 "IDLE" 1 "ON_SOURCE" 2 "ON_TARGET"; +VAL_ 490 LANE_RIGHT 0 "IDLE" 1 "ON_SOURCE" 2 "ON_TARGET"; +VAL_ 490 LANE_CHANGING 0 "IDLE" 1 "LEFT_CHECK" 3 "LEFT_CHANGING" 2 "RIGHT_CHECK" 4 "RIGHT_CHANGING"; +VAL_ 490 LF_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide"; +VAL_ 490 RF_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide"; +VAL_ 490 LR_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide"; +VAL_ 490 RR_DETECT 0 "none" 1 "gray" 2 "white" 3 "white" 4 "hide"; +VAL_ 490 AUTOLANECHANGE_MSG 1 "Check surrounding conditions" 2 "Operating conditions not met" 3 "Analyzing driving lane" 4 "Sharp curve ahead" 5 "Current lane is too narrow" 6 "Not an operational section" 7 "Hazard lights are on" 8 "Vehicle speed is too low" 9 "Please hold the steering wheel" 10 "Not an operable lane" 11 "Steering input detected" 12 "Press the OK button to activate lane change assist"; +VAL_ 490 LANELINE_CURVATURE_DIRECTION 0 "LEFT" 1 "RIGHT"; +VAL_ 676 LEFT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue"; +VAL_ 676 RIGHT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue"; +VAL_ 676 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 676 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 736 MSLA_STATUS 0 "disabled" 1 "active" 2 "paused"; +VAL_ 866 LEFT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue"; +VAL_ 866 RIGHT_LANE_COLOR 0 "Not Detected" 1 "White" 2 "Yellow" 3 "Blue"; +VAL_ 866 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 866 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 1041 DRIVER_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1041 PASSENGER_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1041 PASSENGER_SEATBELT 0 "Unlatched" 1 "Latched"; +VAL_ 1041 DRIVER_SEATBELT 0 "Unlatched" 1 "Latched"; +VAL_ 1041 DRIVER_REAR_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1041 PASSENGER_REAR_DOOR 0 "Closed" 1 "Opened"; +VAL_ 1079 TRAILER_CONNECTED 1 "CONNECTED" 0 "DISCONNECTED"; + +VAL_ 1144 DRIVE_MODE2 3 "Set Sport" 1 "Set Normal" 2 "Set Eco"; +VAL_ 1240 DISTANCE_UNIT 1 "Miles" 0 "Kilometers"; diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_radar_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_radar_generated.dbc new file mode 100644 index 000000000..c80080b43 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_canfd_radar_generated.dbc @@ -0,0 +1,1181 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "hyundai_canfd_radar.dbc starts here"; + +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 528 RADAR_TRACK_210: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 529 RADAR_TRACK_211: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 530 RADAR_TRACK_212: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 531 RADAR_TRACK_213: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 532 RADAR_TRACK_214: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 533 RADAR_TRACK_215: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 534 RADAR_TRACK_216: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 535 RADAR_TRACK_217: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 536 RADAR_TRACK_218: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 537 RADAR_TRACK_219: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 538 RADAR_TRACK_21a: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 539 RADAR_TRACK_21b: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 540 RADAR_TRACK_21c: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 541 RADAR_TRACK_21d: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 542 RADAR_TRACK_21e: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 543 RADAR_TRACK_21f: 32 RADAR + SG_ NEW_SIGNAL_25 : 26|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_24 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_21 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_20 : 39|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT1 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_15 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_14 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 63|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST1 : 64|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST1 : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED1 : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_16 : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED1 : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL1 : 118|10@1- (0.05,0) [0|1023] "" XXX + SG_ NEW_SIGNAL_27 : 154|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_26 : 156|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_23 : 164|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_22 : 167|3@0+ (1,0) [0|7] "" XXX + SG_ VALID_CNT2 : 175|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 179|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 183|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_11 : 191|8@0- (1,0) [0|255] "" XXX + SG_ LONG_DIST2 : 192|12@1+ (0.05,0) [0|4095] "" XXX + SG_ LAT_DIST2 : 204|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED2 : 216|14@1- (0.01,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_17 : 231|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED2 : 232|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL2 : 246|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 933 RADAR_TRACK_3a5: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 934 RADAR_TRACK_3a6: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 935 RADAR_TRACK_3a7: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 936 RADAR_TRACK_3a8: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 937 RADAR_TRACK_3a9: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 938 RADAR_TRACK_3aa: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 939 RADAR_TRACK_3ab: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 940 RADAR_TRACK_3ac: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 941 RADAR_TRACK_3ad: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 942 RADAR_TRACK_3ae: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 943 RADAR_TRACK_3af: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 944 RADAR_TRACK_3b0: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 945 RADAR_TRACK_3b1: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 946 RADAR_TRACK_3b2: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 947 RADAR_TRACK_3b3: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 948 RADAR_TRACK_3b4: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 949 RADAR_TRACK_3b5: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 950 RADAR_TRACK_3b6: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 951 RADAR_TRACK_3b7: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 952 RADAR_TRACK_3b8: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 953 RADAR_TRACK_3b9: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 954 RADAR_TRACK_3ba: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 955 RADAR_TRACK_3bb: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 956 RADAR_TRACK_3bc: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 957 RADAR_TRACK_3bd: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 958 RADAR_TRACK_3be: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 959 RADAR_TRACK_3bf: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 960 RADAR_TRACK_3c0: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 961 RADAR_TRACK_3c1: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 962 RADAR_TRACK_3c2: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 963 RADAR_TRACK_3c3: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 964 RADAR_TRACK_3c4: 24 RADAR + SG_ VALID : 25|2@0+ (1,0) [0|3] "" XXX + SG_ VALID2 : 28|2@0+ (1,0) [0|3] "" XXX + SG_ PROB : 30|10@1+ (1,0) [0|1023] "" XXX + SG_ VALID_CNT : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 62|7@0- (1,0) [0|127] "" XXX + SG_ LONG_DIST : 63|13@1+ (0.05,0) [0|8191] "" XXX + SG_ LAT_DIST : 76|12@1- (0.05,0) [0|4095] "" XXX + SG_ REL_SPEED : 88|14@1- (0.01,0) [0|16383] "" XXX + SG_ IN_MYLANE : 103|2@0+ (1,0) [0|3] "" XXX + SG_ LAT_SPEED : 104|13@1- (0.01,0) [0|8191] "" XXX + SG_ REL_ACCEL : 118|10@1- (0.05,0) [0|1023] "" XXX + +BO_ 1024 RADAR_TRACK_400: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1025 RADAR_TRACK_401: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1026 RADAR_TRACK_402: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1027 RADAR_TRACK_403: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1028 RADAR_TRACK_404: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1029 RADAR_TRACK_405: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1030 RADAR_TRACK_406: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1031 RADAR_TRACK_407: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1032 RADAR_TRACK_408: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1033 RADAR_TRACK_409: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1034 RADAR_TRACK_40a: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1035 RADAR_TRACK_40b: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1036 RADAR_TRACK_40c: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1037 RADAR_TRACK_40d: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1038 RADAR_TRACK_40e: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1039 RADAR_TRACK_40f: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1040 RADAR_TRACK_410: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1041 RADAR_TRACK_411: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1042 RADAR_TRACK_412: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1043 RADAR_TRACK_413: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1044 RADAR_TRACK_414: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1045 RADAR_TRACK_415: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1046 RADAR_TRACK_416: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1047 RADAR_TRACK_417: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1048 RADAR_TRACK_418: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1049 RADAR_TRACK_419: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1050 RADAR_TRACK_41a: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1051 RADAR_TRACK_41b: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1052 RADAR_TRACK_41c: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + +BO_ 1053 RADAR_TRACK_41d: 24 RADAR + SG_ OBJECT_LENGTH : 41|7@1+ (0.1,0) [0|12.7] "m" XXX + SG_ LONG_DIST : 64|11@1+ (0.1,0) [0|204.7] "m" XXX + SG_ LAT_DIST : 75|12@1- (0.05,0) [-102.4|102.35] "m" XXX + SG_ REL_SPEED : 87|11@1- (0.1,0) [-102.4|102.3] "m/s" XXX + \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_i30_2014.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_i30_2014.dbc new file mode 100644 index 000000000..3524f9b21 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_i30_2014.dbc @@ -0,0 +1,549 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 128 EMS_DCT1: 8 XXX + SG_ PV_AV_CAN : 0|8@1+ (0.3906,0) [0|99.603] "%" XXX + SG_ TQ_STND : 8|6@1+ (10,0) [0|630] "Nm" XXX + SG_ F_N_ENG : 14|1@1+ (1,0) [0|1] "" XXX + SG_ F_SUB_TQI : 15|1@1+ (1,0) [0|1] "" XXX + SG_ N : 16|16@1+ (0.25,0) [0|16383.8] "rpm" XXX + SG_ TQI_ACOR : 32|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ TQFR : 40|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ TQI : 48|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ CF_Ems_Alive : 56|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Ems_ChkSum : 60|4@1+ (1,0) [0|15] "" XXX + + +BO_ 129 EMS_DCT2: 8 XXX + SG_ CR_Ems_SoakTimeExt : 0|6@1+ (5,0) [0|315] "Min" XXX + SG_ BRAKE_ACT : 6|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Ems_EngOperStat : 8|8@1+ (1,0) [0|255] "" XXX + SG_ CR_Ems_IndAirTemp : 16|8@1+ (0.75,-48) [-48|143.25] "" XXX + SG_ CF_Ems_Alive2 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Ems_ChkSum2 : 60|4@1+ (1,0) [0|15] "" XXX + + +BO_ 160 EngFrzFrm1: 8 XXX + SG_ PID_04h : 0|8@1+ (0.392157,0) [0|100] "%" XXX + SG_ PID_05h : 8|8@1+ (1,-40) [-40|215] "" XXX + SG_ PID_0Ch : 16|16@1+ (0.25,0) [0|16383.8] "rpm" XXX + SG_ PID_0Dh : 32|8@1+ (1,0) [0|255] "km/h" XXX + SG_ PID_11h : 40|8@1+ (0.392157,0) [0|100] "%" XXX + SG_ PID_03h : 48|16@1+ (1,0) [0|65535] "" XXX + + +BO_ 161 EngFrzFrm2: 8 XXX + SG_ PID_06h : 0|8@1+ (0.78125,-100) [-100|99.22] "%" XXX + SG_ PID_07h : 8|8@1+ (0.78125,-100) [-100|99.22] "%" XXX + SG_ PID_08h : 16|8@1+ (0.78125,-100) [-100|99.22] "%" XXX + SG_ PID_09h : 24|8@1+ (0.78125,-100) [-100|99.22] "%" XXX + SG_ PID_0Bh : 32|8@1+ (1,0) [0|255] "kPa" XXX + SG_ PID_23h : 40|16@1+ (10,0) [0|655350] "kPa" XXX + + +BO_ 304 YRS1: 8 XXX + SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [-163.84|163.83] "" XXX + SG_ CF_Yrs_SnsStat1 : 16|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Yrs_YrStat : 20|4@1+ (1,0) [0|15] "" XXX + SG_ CR_Yrs_LatAc : 32|16@1+ (0.000127465,-4.17677) [-4.17677|4.17652] "g" XXX + SG_ CR_Yrs_MsgCnt1 : 48|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Yrs_LatAcStat1 : 52|4@1+ (1,0) [0|15] "" XXX + SG_ CR_Yrs_Crc1 : 56|8@1+ (1,0) [0|255] "" XXX + + +BO_ 305 YRS3: 8 XXX + SG_ CR_Yrs_YawAcc : 0|16@1+ (0.125,-4096) [-4096|4095.75] "" XXX + SG_ CF_Yrs_YawAccStat : 20|4@1+ (1,0) [0|15] "" XXX + SG_ CR_Yrs_Ax : 32|16@1+ (0.000127465,-4.17677) [-4.17677|4.17652] "g" XXX + SG_ CR_Yrs_MsgCnt3 : 48|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Yrs_AxStat : 52|4@1+ (1,0) [0|15] "" XXX + SG_ CR_Yrs_Crc3 : 56|8@1+ (1,0) [0|255] "" XXX + + +BO_ 320 YRS2: 8 XXX + SG_ CF_Yrs_McuStat : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CF_Yrs_SnsStat2 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ CF_Yrs_ExtSysStat : 32|8@1+ (1,0) [0|255] "" XXX + SG_ CR_Yrs_Diag : 40|8@1+ (1,0) [0|255] "" XXX + SG_ CR_Yrs_MsgCnt2 : 48|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Yrs_Type : 52|4@1+ (1,0) [0|15] "" XXX + SG_ CR_Yrs_Crc2 : 56|8@1+ (1,0) [0|255] "" XXX + + +BO_ 339 TCS1: 8 XXX + SG_ TCS_REQ : 0|1@1+ (1,0) [0|1] "" XXX + SG_ MSR_C_REQ : 1|1@1+ (1,0) [0|1] "" XXX + SG_ TCS_PAS : 2|1@1+ (1,0) [0|1] "" XXX + SG_ TCS_GSC : 3|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Esc_LimoInfo : 4|2@1+ (1,0) [0|3] "" XXX + SG_ ABS_DIAG : 6|1@1+ (1,0) [0|1] "" XXX + SG_ ABS_DEF : 7|1@1+ (1,0) [0|1] "" XXX + SG_ TCS_DEF : 8|1@1+ (1,0) [0|1] "" XXX + SG_ TCS_CTL : 9|1@1+ (1,0) [0|1] "" XXX + SG_ ABS_ACT : 10|1@1+ (1,0) [0|1] "" XXX + SG_ EBD_DEF : 11|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_PAS : 12|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_DEF : 13|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_CTL : 14|1@1+ (1,0) [0|1] "" XXX + SG_ TCS_MFRN : 15|1@1+ (1,0) [0|1] "" XXX + SG_ DBC_CTL : 16|1@1+ (1,0) [0|1] "" XXX + SG_ DBC_PAS : 17|1@1+ (1,0) [0|1] "" XXX + SG_ DBC_DEF : 18|1@1+ (1,0) [0|1] "" XXX + SG_ HAC_CTL : 19|1@1+ (1,0) [0|1] "" XXX + SG_ HAC_PAS : 20|1@1+ (1,0) [0|1] "" XXX + SG_ HAC_DEF : 21|1@1+ (1,0) [0|1] "" XXX + SG_ ESS_STAT : 22|2@1+ (1,0) [0|3] "" XXX + SG_ TQI_TCS : 24|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ TQI_MSR : 32|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ CF_Esc_BrkCtl : 48|1@1+ (1,0) [0|1] "" XXX + SG_ ESC_OFF_STEP : 49|2@1+ (1,0) [0|3] "" XXX + SG_ _4WD_Status : 51|1@1+ (1,0) [0|1] "" XXX + SG_ AliveCounter_TCS1 : 52|4@1+ (1,0) [0|1] "" XXX + SG_ CheckSum_TCS1 : 56|8@1+ (1,0) [0|1] "" XXX + + +BO_ 356 VSM1: 8 XXX + SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" XXX + SG_ CF_Esc_Act : 12|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Esc_CtrMode : 13|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Esc_Def : 16|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Esc_AliveCnt : 48|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Esc_Chksum : 56|8@1+ (1,0) [0|255] "" XXX + + +BO_ 357 VSM2: 8 XXX + SG_ CR_Mdps_StrTq : 0|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" XXX + SG_ CR_Mdps_OutTq : 12|12@1+ (0.1,-204.8) [-204.8|204.7] "" XXX + SG_ CF_Mdps_Def : 24|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Mdps_SErr : 25|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Mdps_AliveCnt : 48|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Mdps_Chksum : 56|8@1+ (1,0) [0|255] "" XXX + + +BO_ 399 EMS_H2: 8 XXX + SG_ R_TqAcnApvC : 0|8@1+ (0.2,0) [0|51] "Nm" XXX + SG_ R_PAcnC : 8|8@1+ (125,0) [0|31875] "hPa" XXX + SG_ TQI_B : 16|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ SLD_VS : 24|8@1+ (1,0) [0|255] "km/h" XXX + SG_ CF_CdaStat : 32|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Ems_IsgStat : 35|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Ems_OilChg : 38|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_EtcLimpMod : 39|1@1+ (1,0) [0|1] "" XXX + SG_ R_NEngIdlTgC : 40|8@1+ (10,0) [0|2550] "rpm" XXX + SG_ CF_Ems_UpTarGr : 48|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_DownTarGr : 49|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_DesCurGr : 50|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Ems_SldAct : 54|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_SldPosAct : 55|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_HPresStat : 56|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_IsgBuz : 57|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_IdlStpFCO : 58|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_FCopen : 59|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_ActEcoAct : 60|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_EngRunNorm : 61|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_IsgStat2 : 62|2@1+ (2,0) [0|3] "" XXX + + +BO_ 497 TCS5: 8 XXX + SG_ ABS_W_LAMP : 0|1@1+ (1,0) [0|1] "" XXX + SG_ EBD_W_LAMP : 1|1@1+ (1,0) [0|1] "" XXX + SG_ TCS_OFF_LAMP : 2|1@1+ (1,0) [0|1] "" XXX + SG_ TCS_LAMP : 3|2@1+ (1,0) [0|3] "" XXX + SG_ DBC_W_LAMP : 5|1@1+ (1,0) [0|1] "" XXX + SG_ DBC_F_LAMP : 6|2@1+ (1,0) [0|3] "" XXX + SG_ ODOMETER_LEFT : 8|4@1+ (1,0) [0|15] "m" XXX + SG_ ODOMETER_RIGHT : 12|4@1+ (1,0) [0|15] "m" XXX + SG_ WHEEL_FL : 16|12@1+ (0.125,0) [0|511.875] "km/h" XXX + SG_ WHEEL_FR : 28|12@1+ (0.125,0) [0|511.875] "km/h" XXX + SG_ WHEEL_RL : 40|12@1+ (0.125,0) [0|511.875] "km/h" XXX + SG_ WHEEL_RR : 52|12@1+ (0.125,0) [0|511.875] "km/h" XXX + + +BO_ 544 ESP2: 8 XXX + SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX + SG_ ESP2_AliveCounter_LSB : 11|3@1+ (1,0) [0|7] "" XXX + SG_ LAT_ACCEL_STAT : 14|1@1+ (1,0) [0|1] "" XXX + SG_ LAT_ACCEL_DIAG : 15|1@1+ (1,0) [0|1] "" XXX + SG_ LONG_ACCEL : 16|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX + SG_ ESP2_AliveCounter_MSB : 27|1@1+ (1,0) [0|1] "" XXX + SG_ ESP2_Checksum_LSB : 28|2@1+ (1,0) [0|3] "" XXX + SG_ LONG_ACCEL_STAT : 30|1@1+ (1,0) [0|1] "" XXX + SG_ LONG_ACCEL_DIAG : 31|1@1+ (1,0) [0|1] "" XXX + SG_ CYL_PRES : 32|12@1+ (0.1,0) [0|409.5] "Bar" XXX + SG_ ESP12_Checksum_MSB : 44|2@1+ (1,0) [0|3] "" XXX + SG_ CYL_PRES_STAT : 46|1@1+ (1,0) [0|1] "" XXX + SG_ CYL_PRESS_DIAG : 47|1@1+ (1,0) [0|1] "" XXX + SG_ YAW_RATE : 48|13@1+ (0.01,-40.95) [-40.95|40.96] "" XXX + SG_ CYL_PRES_FLAG : 61|1@1+ (1,0) [0|1] "" XXX + SG_ YAW_RATE_STAT : 62|1@1+ (1,0) [0|1] "" XXX + SG_ YAW_RATE_DIAG : 63|1@1+ (1,0) [0|1] "" XXX + + +BO_ 608 EMS6: 8 XXX + SG_ TQI_MIN : 0|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ TQI : 8|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ TQI_TARGET : 16|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ GLOW_STAT : 24|1@1+ (1,0) [0|1] "" XXX + SG_ CRUISE_LAMP_M : 25|1@1+ (1,0) [0|1] "" XXX + SG_ CRUISE_LAMP_S : 26|1@1+ (1,0) [0|1] "" XXX + SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1,0) [0|1] "" XXX + SG_ ENG_STAT : 28|3@1+ (1,0) [0|7] "" XXX + SG_ SOAK_TIME_ERROR : 31|1@1+ (1,0) [0|1] "" XXX + SG_ SOAK_TIME : 32|8@1+ (1,0) [0|255] "Min" XXX + SG_ TQI_MAX : 40|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [-35.625|60] "" XXX + SG_ Checksum : 56|4@1+ (1,0) [0|15] "" XXX + SG_ AliveCounter : 60|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Ems_AclAct : 62|2@1+ (1,0) [0|3] "" XXX + + +BO_ 672 EMS5: 8 XXX + SG_ ECGPOvrd : 0|1@1+ (1,0) [0|1] "" XXX + SG_ QECACC : 1|1@1+ (1,0) [0|1] "" XXX + SG_ ECFail : 2|1@1+ (1,0) [0|1] "" XXX + SG_ SwitchOffCondExt : 3|1@1+ (1,0) [0|1] "" XXX + SG_ BLECFail : 4|1@1+ (1,0) [0|1] "" XXX + SG_ AliveCounter : 5|2@1+ (1,0) [0|3] "" XXX + SG_ Byte0Parity : 7|1@1+ (1,0) [0|1] "" XXX + SG_ FA_PV_CAN : 8|8@1+ (0.3906,0) [0|99.2] "%" XXX + SG_ IntAirTemp : 16|8@1+ (0.75,-48) [-48|143.25] "" XXX + SG_ STATE_DC_OBD : 24|7@1+ (1,0) [0|127] "" XXX + SG_ INH_DC_OBD : 31|1@1+ (1,0) [0|1] "" XXX + SG_ CTR_IG_CYC_OBD : 32|16@1+ (1,0) [0|65535] "" XXX + SG_ CTR_CDN_OBD : 48|16@1+ (1,0) [0|65535] "" XXX + + +BO_ 688 SAS1: 8 XXX + SG_ SAS_Angle : 0|16@1+ (0.1,0) [-3276.8|3276.7] "Deg" XXX + SG_ SAS_Speed : 16|8@1+ (4,0) [0|1016] "" XXX + SG_ SAS_Stat : 24|8@1+ (1,0) [0|255] "" XXX + SG_ MsgCount : 32|4@1+ (1,0) [0|15] "" XXX + SG_ CheckSum : 36|4@1+ (1,0) [0|15] "" XXX + + +BO_ 790 EMS1: 8 XXX + SG_ SWI_IGK : 0|1@1+ (1,0) [0|1] "" XXX + SG_ F_N_ENG : 1|1@1+ (1,0) [0|1] "" XXX + SG_ ACK_TCS : 2|1@1+ (1,0) [0|1] "" XXX + SG_ PUC_STAT : 3|1@1+ (1,0) [0|1] "" XXX + SG_ TQ_COR_STAT : 4|2@1+ (1,0) [0|3] "" XXX + SG_ RLY_AC : 6|1@1+ (1,0) [0|1] "" XXX + SG_ F_SUB_TQI : 7|1@1+ (1,0) [0|1] "" XXX + SG_ TQI_ACOR : 8|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ N : 16|16@1+ (0.25,0) [0|16383.8] "rpm" XXX + SG_ TQI : 32|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ TQFR : 40|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ VS : 48|8@1+ (1,0) [0|254] "km/h" XXX + SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0) [0|2] "" XXX + + +BO_ 809 EMS2: 8 XXX + SG_ TQ_STND : 0|6@1+ (10,0) [0|630] "Nm" XXX + SG_ CAN_VERS : 0|6@1+ (1,0) [0|7.7] "" XXX + SG_ CONF_TCU : 0|6@1+ (1,0) [0|63] "" XXX + SG_ OBD_FRF_ACK : 0|6@1+ (1,0) [0|63] "" XXX + SG_ MUL_CODE : 6|2@1+ (1,0) [0|3] "" XXX + SG_ TEMP_ENG : 8|8@1+ (0.75,-48) [-48|143.25] "" XXX + SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0) [0|1.99155] "" XXX + SG_ VB_OFF_ACT : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ACK_ES : 25|1@1+ (1,0) [0|1] "" XXX + SG_ CONF_MIL_FMY : 26|3@1+ (1,0) [0|7] "" XXX + SG_ OD_OFF_REQ : 29|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_ACT : 30|1@1+ (1,0) [0|1] "" XXX + SG_ CLU_ACK : 31|1@1+ (1,0) [0|1] "" XXX + SG_ BRAKE_ACT : 32|2@1+ (1,0) [0|3] "" XXX + SG_ ENG_CHR : 34|4@1+ (1,0) [0|15] "" XXX + SG_ GP_CTL : 38|2@1+ (1,0) [0|3] "" XXX + SG_ TPS : 40|8@1+ (0.469484,-15.0235) [-15.0235|104.695] "%" XXX + SG_ PV_AV_CAN : 48|8@1+ (0.3906,0) [0|99.603] "%" XXX + SG_ ENG_VOL : 56|8@1+ (0.1,0) [0|25.5] "liter" XXX + + +BO_ 848 FATC: 8 XXX + SG_ CR_Fatc_TqAcnOut : 0|8@1+ (0.2,0) [0|50.8] "Nm" XXX + SG_ CF_Fatc_AcnRqSwi : 8|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_AcnCltEnRq : 9|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_EcvFlt : 10|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_BlwrOn : 11|1@1+ (1,0) [0|1] "" XXX + SG_ CF_FATC_Iden : 12|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Fatc_BlwrMax : 14|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_EngStartReq : 15|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_IsgStopReq : 16|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_CtrInf : 17|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Fatc_MsgCnt : 20|4@1+ (1,0) [0|15] "" XXX + SG_ CR_Fatc_OutTemp : 24|8@1+ (0.5,-40) [-40|60] "" XXX + SG_ CR_Fatc_OutTempSns : 32|8@1+ (0.5,-40) [-40|60] "" XXX + SG_ CF_Fatc_Compload : 40|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Fatc_ActiveEco : 43|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_AutoActivation : 44|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_DefSw : 45|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_PtcRlyStat : 46|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Fatc_ChkSum : 56|8@1+ (1,0) [0|255] "" XXX + + +BO_ 880 TCU3: 8 XXX + SG_ N_TGT_LUP : 0|8@1+ (10,500) [500|3040] "rpm" XXX + SG_ SLOPE_TCU : 8|6@1+ (0.5,-16) [-16|15.5] "%" XXX + SG_ CF_Tcu_InhCda : 14|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_IsgInhib : 15|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_BkeOnReq : 16|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Tcu_NCStat : 18|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Tcu_TarGr : 20|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Tcu_ShfPatt : 24|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Tcu_InhVis : 28|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_PRelReq : 29|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_ITPhase : 30|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_ActEcoRdy : 31|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_TqGrdLim : 32|8@1+ (10,0) [0|2540] "Nm/s" XXX + SG_ CR_Tcu_IsgTgtRPM : 40|8@1+ (20,0) [0|3500] "rpm" XXX + SG_ TQI_TCU_INC : 48|8@1+ (0.390625,0) [0|99.6094] "%" XXX + SG_ CF_Tcu_SbwPInfo : 56|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_SptRdy : 57|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_Alive3 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Tcu_ChkSum3 : 60|4@1+ (1,0) [0|15] "" XXX + + +BO_ 898 EMS9: 8 XXX + SG_ CF_Ems_BrkReq : 0|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_DnShftReq : 1|4@1+ (1,0) [0|14] "" XXX + SG_ CF_Ems_RepModChk : 5|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_DecelReq : 8|12@1+ (0.001,-4.094) [-4.094|0] "m/s^2" XXX + SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0) [0|4094] "hPa" XXX + SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40) [0|254] "" XXX + SG_ CF_Ems_PumpTPres : 40|8@1+ (3.13725,0) [0|800] "kPa" XXX + SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41) [-40|60] "" XXX + SG_ CF_Ems_OPSFail : 56|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_ECTTRQLIM : 57|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1,0) [0|15] "" XXX + + +BO_ 1075 EPB1: 8 XXX + SG_ EPB_I_LAMP : 0|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_F_LAMP : 4|2@1+ (1,0) [0|3] "" XXX + SG_ EPB_ALARM : 6|2@1+ (1,0) [0|3] "" XXX + SG_ EPB_CLU : 8|8@1+ (1,0) [0|255] "" XXX + SG_ EPB_SWITCH : 16|2@1+ (1,0) [0|3] "" XXX + SG_ EPB_RBL : 18|1@1+ (1,0) [0|1] "" XXX + SG_ EPB_STATUS : 19|3@1+ (1,0) [0|7] "" XXX + SG_ EPB_FRC_ERR : 22|2@1+ (1,0) [0|3] "" XXX + SG_ EPB_DBF_STAT : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_ACK : 25|1@1+ (1,0) [0|1] "" XXX + SG_ EPB_DBF_REQ : 26|1@1+ (1,0) [0|1] "" XXX + SG_ EPB_FAIL : 29|3@1+ (1,0) [0|7] "" XXX + SG_ EPB_FORCE : 32|12@1+ (1,-1000) [-1000|3000] "" XXX + SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0) [0|2.54] "g" XXX + + +BO_ 1087 TCU1: 8 XXX + SG_ ETL_TCU : 0|8@1+ (2,0) [0|508] "Nm" XXX + SG_ CUR_GR : 8|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Tcu_Alive : 12|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Tcu_ChkSum : 14|2@1+ (1,0) [0|3] "" XXX + SG_ VS_TCU : 16|8@1+ (1,0) [0|254] "km/h" XXX + SG_ FAN_CTRL_TCU : 24|2@1+ (1,0) [0|3] "" XXX + SG_ BRAKE_ACT_TCU : 26|2@1+ (1,0) [0|3] "" XXX + SG_ FUEL_CUT_TCU : 28|1@1+ (1,0) [0|1] "" XXX + SG_ INH_FUEL_CUT : 29|1@1+ (1,0) [0|1] "" XXX + SG_ IDLE_UP_TCU : 30|1@1+ (1,0) [0|1] "" XXX + SG_ N_INC_TCU : 31|1@1+ (1,0) [0|1] "" XXX + SG_ SPK_RTD_TCU : 32|8@1+ (0.375,-23.625) [-15|15] "" XXX + SG_ N_TC_RAW : 40|16@1+ (0.25,0) [0|16383.5] "rpm" XXX + SG_ VS_TCU_DECIMAL : 56|8@1+ (0.0078125,0) [0|0.992188] "km/h" XXX + + +BO_ 1088 TCU2: 8 XXX + SG_ ETL_TCU : 0|8@1+ (2,0) [0|508] "Nm" XXX + SG_ CUR_GR : 8|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Tcu_Alive : 12|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Tcu_ChkSum : 14|2@1+ (1,0) [0|3] "" XXX + SG_ VS_TCU : 16|8@1+ (1,0) [0|254] "km/h" XXX + SG_ FAN_CTRL_TCU : 24|2@1+ (1,0) [0|3] "" XXX + SG_ BRAKE_ACT_TCU : 26|2@1+ (1,0) [0|3] "" XXX + SG_ FUEL_CUT_TCU : 28|1@1+ (1,0) [0|1] "" XXX + SG_ INH_FUEL_CUT : 29|1@1+ (1,0) [0|1] "" XXX + SG_ IDLE_UP_TCU : 30|1@1+ (1,0) [0|1] "" XXX + SG_ N_INC_TCU : 31|1@1+ (1,0) [0|1] "" XXX + SG_ SPK_RTD_TCU : 32|8@1+ (0.375,-23.625) [-15|15] "" XXX + SG_ N_TC_RAW : 40|16@1+ (0.25,0) [0|16383.5] "rpm" XXX + SG_ VS_TCU_DECIMAL : 56|8@1+ (0.0078125,0) [0|0.992188] "km/h" XXX + + +BO_ 1200 WHL_SPD: 8 XXX + SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0) [0|511.969] "km/h" XXX + SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0) [0|511.969] "km/h" XXX + SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0) [0|511.969] "km/h" XXX + SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0) [0|511.969] "km/h" XXX + + +BO_ 1201 WHL_PUL: 8 XXX + SG_ WHL_PUL_FL : 0|8@1+ (0.5,0) [0|127.5] "pulse count" XXX + SG_ WHL_PUL_FR : 8|8@1+ (0.5,0) [0|127.5] "pulse count" XXX + SG_ WHL_PUL_RL : 16|8@1+ (0.5,0) [0|127.5] "pulse count" XXX + SG_ WHL_PUL_RR : 24|8@1+ (0.5,0) [0|127.5] "pulse count" XXX + SG_ WHL_DIR_FL : 32|2@1+ (1,0) [0|3] "" XXX + SG_ WHL_DIR_FR : 34|2@1+ (1,0) [0|3] "" XXX + SG_ WHL_DIR_RL : 36|2@1+ (1,0) [0|3] "" XXX + SG_ WHL_DIR_RR : 38|2@1+ (1,0) [0|3] "" XXX + SG_ WHL_PUL_Chksum : 56|8@1+ (1,0) [0|255] "" XXX + + +BO_ 1264 CLU1: 8 XXX + SG_ CF_Clu_CruiseSwState : 0|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Blr_MaxStat : 3|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_SldMainSW : 4|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_ParityBit1 : 5|1@1+ (1,0) [0|1] "pulse count" XXX + SG_ CF_Clu_SPEED_UNIT : 6|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_ParkBrakeSw : 7|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0) [0|255.5] "km/h or MPH" XXX + SG_ CF_Clu_AliveCounter : 17|7@1+ (1,0) [0|127] "" XXX + SG_ CF_Clu_CruiseSwMain : 24|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_VanzDecimal : 25|2@1+ (1,0) [0|0.375] "" XXX + SG_ VEHICLE_INFO : 27|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Clu_StrRlyState : 30|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_SMKOption : 31|1@1+ (1,0) [0|1] "" XXX + SG_ R_TqAcnOutC : 32|8@1+ (1,0) [0|51] "Nm" XXX + SG_ CF_Clu_Odometer : 40|24@1+ (0.1,0) [0|1.67772e+006] "km" XXX + + +BO_ 1265 CLU3: 8 XXX + SG_ CF_Clu_AcnRqSwi : 0|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_AcnCltEnRq : 1|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_RefDetMod : 2|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_DefoggerRly : 5|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_LowfuelWarn : 16|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_SportsModeSwi : 18|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_ALightStat : 20|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_FrtFog : 21|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_DetentOut : 22|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HeadLampTail : 23|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_TrailerMode : 24|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_DTE : 25|10@1+ (1,0) [0|1023] "" XXX + SG_ CF_Clu_TripUnit : 35|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_IsaMainSW : 37|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_FlexSteerSW : 40|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_AvsmCur : 41|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HudSpeedset : 42|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HudTbtSet : 43|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HudSccSet : 44|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HudLdwsSet : 45|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HudDisSet : 46|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HudFontSizeSet : 47|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_HudFontColorSet : 49|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_HudBrightSet : 51|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_HudHeightSet : 53|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_CluInfo : 55|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_RheostatLevel : 56|5@1+ (1,0) [0|31] "" XXX + SG_ CF_Clu_DrivinglampStat : 61|3@1+ (1,0) [0|7] "" XXX + + +BO_ 1349 EMS4: 8 XXX + SG_ IMMO_LAMP_STAT : 0|1@1+ (1,0) [0|1] "" XXX + SG_ L_MIL : 1|1@1+ (1,0) [0|1] "" XXX + SG_ IM_STAT : 2|1@1+ (1,0) [0|1] "" XXX + SG_ AMP_CAN : 3|5@1+ (10.7316,458.98) [458.98|791.66] "mmHg" XXX + SG_ FCO : 8|16@1+ (0.128,0) [0|8388.48] "ul" XXX + SG_ VB : 24|8@1+ (0.101563,0) [0|25.8984] "V" XXX + SG_ TEMP_FUEL : 48|8@1+ (0.75,-48) [-48|143.25] "" XXX + SG_ Split_Stat : 56|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Ems_IsaAct : 57|1@1+ (1,0) [0|1] "" XXX + + +BO_ 1435 TCU4: 8 XXX + SG_ CF_TCU_WarnMsg : 0|3@1+ (1,0) [0|7] "" XXX + SG_ CF_TCU_WarnImg : 3|1@1+ (1,0) [0|1] "" XXX + SG_ CF_TCU_WarnSnd : 4|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_EolStat : 5|1@1+ (1,0) [0|1] "" XXX + SG_ CR_Tcu_GearSelDisp2 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Tcu_StRelStat : 12|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_DriWarn1 : 13|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Tcu_DriWarn2 : 16|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Tcu_DrivingModeReq : 18|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Tcu_DrivingModeDisp : 22|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Tcu_SiCluster : 26|5@1+ (1,0) [0|0] "" XXX + SG_ CF_Tcu_DSmode_Inf : 31|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Tcu_Alive4 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Tcu_ChkSum4 : 60|4@1+ (1,0) [0|15] "" XXX + + +BO_ 1508 MDPS1: 8 XXX + SG_ CF_Mdps_WLmp : 1|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Mdps_ALTRequest : 5|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Mdps_Flex : 8|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Mdps_FlexDisp : 11|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Mdps_CurrMode : 12|2@1+ (1,0) [0|3] "" XXX + + +BO_ 1680 CLU2: 8 XXX + SG_ CF_Clu_IGNSw : 0|3@1+ (1,0) [0|7] "" XXX + SG_ RKE_CMD : 3|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Clu_DrvDrSw : 6|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_DrvKeyLockSw : 8|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_DrvKeyUnlockSw : 9|1@1+ (1,0) [0|1] "" XXX + SG_ PIC_Lock : 10|3@1+ (1,0) [0|7] "" XXX + SG_ PIC_Unlock : 13|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Clu_DrvSeatBeltSw : 16|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_TrunkTgSw : 18|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_AstSeatBeltSw : 20|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_HoodSw : 22|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_TurnSigLh : 24|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_TurnSigRh : 25|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_LdwsLkasSW : 26|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_WiperIntT : 27|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Clu_WiperIntSW : 30|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_WiperLow : 31|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_WiperHigh : 32|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_WiperAuto : 33|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_RainSnsStat : 34|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Clu_HeadLampLow : 37|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HeadLampHigh : 38|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_AltLStatus : 39|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Clu_SwiGearR : 43|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_SWL_Stat : 45|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Clu_ActiveEcoSW : 48|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_HazardSW : 49|1@1+ (1,0) [0|1] "" XXX + SG_ CF_Clu_AliveCnt2 : 50|4@1+ (1,0) [0|15] "" XXX + SG_ CF_Clu_AstDrSw : 54|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_LkasDispMode : 56|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_AutoLightLevel : 58|2@1+ (1,0) [0|3] "" XXX + SG_ CF_Clu_SunRoofOpenState : 60|1@1+ (1,0) [0|1] "" XXX + + diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_denso_front_radar_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_denso_front_radar_generated.dbc new file mode 100644 index 000000000..e491c89e8 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_denso_front_radar_generated.dbc @@ -0,0 +1,120 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "hyundai_kia_denso_front_radar.dbc starts here"; + +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 1280 RADAR_TRACK_500: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1281 RADAR_TRACK_501: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1282 RADAR_TRACK_502: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1283 RADAR_TRACK_503: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1284 RADAR_TRACK_504: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1285 RADAR_TRACK_505: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1286 RADAR_TRACK_506: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1287 RADAR_TRACK_507: 8 RADAR + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 15|16@0+ (0.00625,0) [0|409.59375] "m" XXX + SG_ LAT_DIST : 31|11@0- (0.0625,0) [-64|63.9375] "m" XXX + SG_ OBJECT_FLAGS_1 : 36|5@0+ (1,0) [0|31] "" XXX + SG_ OBJECT_FLAG_2 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 46|12@0- (0.015625,0) [-32|31.984375] "m/s" XXX + SG_ OBJECT_STATE : 50|3@0+ (1,0) [0|7] "" XXX + SG_ OBJECT_DETAIL : 63|8@0+ (1,0) [0|255] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_generic.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_generic.dbc new file mode 100644 index 000000000..b3bde5fd6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_generic.dbc @@ -0,0 +1,1703 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: IAP ODS _4WD BCM HUD DATC MDPS AAF_Tester AEMC SMK _4WD EPB CUBIS MTS TMU EVP CGW TPMS LPI DI_BOX SPAS EMS LCA TCU IBOX FATC AFLS FPCM SCC AHLS AVM ABS SNV OPI PGS SAS AAF Dummy LDWS_LKAS LVR ESC PSB CLU ECS ACU REA + +BO_ 1532 ODS13: 5 ODS + SG_ CR_Ods_ID : 0|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_Chksum_H : 8|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy + SG_ CR_Ods_Chksum_L : 16|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy + SG_ CR_Ods_RomID_H : 24|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy + SG_ CR_Ods_RomID_L : 32|8@1+ (1.0,0.0) [0.0|255.0] "" Dummy + +BO_ 1531 ODS12: 8 ODS + SG_ CR_Ods_SerNum0 : 0|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum3 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum4 : 32|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum5 : 40|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum6 : 48|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + SG_ CR_Ods_SerNum7 : 56|8@1+ (1.0,0.0) [0.0|255.0] "" ACU + +BO_ 1530 ODS11: 8 ODS + SG_ CF_Ods_PrcCmd : 1|1@1+ (1.0,0.0) [0.0|1.0] "" Dummy + SG_ CF_Ods_BtsFail : 3|1@1+ (1.0,0.0) [0.0|1.0] "" Dummy + SG_ CF_Ods_AcuRcvSN : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_EolCal : 5|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_PsFail : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_EcuFail : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_WgtStat : 8|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CF_Ods_OccStat : 16|1@1+ (1.0,0.0) [0.0|1.0] "" ACU + SG_ CR_Wcs_ErrStat : 32|8@1+ (1.0,0.0) [0.0|63.0] "" ACU + SG_ CR_Wcs_ClassStat : 40|8@1+ (1.0,0.0) [0.0|4.0] "" ACU,BCM + +BO_ 1017 ECS12: 4 ECS + SG_ Height_FL : 0|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS + SG_ Height_FR : 8|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS + SG_ Height_RL : 16|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS + SG_ Height_RR : 24|8@1+ (1.0,-128.0) [-128.0|127.0] "mm" AFLS + +BO_ 1268 SPAS12: 8 SPAS + SG_ CF_Spas_HMI_Stat : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CF_Spas_Disp : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS + SG_ CF_Spas_FIL_Ind : 10|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FIR_Ind : 13|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FOL_Ind : 16|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FOR_Ind : 19|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_VolDown : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_RIL_Ind : 24|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_RIR_Ind : 27|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FLS_Alarm : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_ROL_Ind : 32|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_ROR_Ind : 35|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FCS_Alarm : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_FI_Ind : 40|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_RI_Ind : 43|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU + SG_ CF_Spas_FRS_Alarm : 46|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_FR_Alarm : 48|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Spas_RR_Alarm : 50|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Spas_BEEP_Alarm : 52|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_Spas_StatAlarm : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Spas_RLS_Alarm : 57|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_RCS_Alarm : 59|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_RRS_Alarm : 61|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1265 CLU11: 4 CLU + SG_ CF_Clu_CruiseSwState : 0|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,LDWS_LKAS,SCC + SG_ CF_Clu_CruiseSwMain : 3|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,LDWS_LKAS,SCC + SG_ CF_Clu_SldMainSW : 4|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Clu_ParityBit1 : 5|1@1+ (1.0,0.0) [0.0|1.0] "pulse count" EMS + SG_ CF_Clu_VanzDecimal : 6|2@1+ (0.125,0.0) [0.0|0.375] "" EMS + SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0.0) [0.0|255.5] "km/h or MPH" BCM,CUBIS,EMS,IBOX,LDWS_LKAS,MDPS,SCC + SG_ CF_Clu_SPEED_UNIT : 17|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CUBIS,EMS,IBOX,LDWS_LKAS,MDPS,SCC + SG_ CF_Clu_DetentOut : 18|1@1+ (1.0,0.0) [0.0|1.0] "" AVM,BCM,LCA,PGS,SPAS + SG_ CF_Clu_RheostatLevel : 19|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,BCM,LCA,PGS,SPAS + SG_ CF_Clu_CluInfo : 24|1@1+ (1.0,0.0) [0.0|1.0] "" BCM + SG_ CF_Clu_AmpInfo : 25|1@1+ (1.0,0.0) [0.0|1.0] "" BCM + SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1.0,0.0) [0.0|15.0] "" AHLS,EMS,EPB,LDWS_LKAS,MDPS,SCC + +BO_ 1260 Sign_Detection: 8 XXX + SG_ SpeedLim_Nav_Cam : 40|8@1+ (1,0) [0|255] "km/h / mph" XXX + SG_ SpeedLim_Nav_Cam2 : 48|8@1+ (1,0) [0|255] "km/h / mph" XXX + +BO_ 1492 TMU_GW_PE_01: 8 CLU + SG_ TMU_IVRActivity : 0|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ TMU_PhoneActivity : 2|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + +BO_ 1491 HU_DATC_PE_00: 8 CLU + SG_ HU_VRActivity : 0|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ HU_PhoneActivity : 2|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ BlowerNoiseControl : 4|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + +BO_ 1490 HU_DATC_E_02: 8 CLU + SG_ HU_DATC_RearOnOffSet : 6|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ HU_DATC_ADSOnOffSet : 8|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + +BO_ 1479 EMS21: 8 EMS + SG_ SCR_LEVEL_WARN_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ SCR_LEVEL_WARN : 1|3@1+ (1.0,0.0) [0.0|4.0] "" CLU + SG_ SCR_SYS_ERROR_WARN : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ SCR_SYSTEM_WARN_LAMP : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ SCR_INDUCEMENT_EXIT_COND : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ SCR_UREA_LEVEL : 16|8@1+ (0.5,0.0) [0.0|100.0] "%" CLU + SG_ SCR_NO_REMAINING_RESTARTS : 24|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ SCR_REMAINING_DISTANCE : 32|16@1+ (1.0,0.0) [0.0|25000.0] "km" CLU + +BO_ 1472 GW_Warning_PE: 8 BCM + SG_ Audio_VolumeDown : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Flh_Alarm : 48|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Fcnt_Alarm : 50|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Frh_Alarm : 52|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Rlh_Alarm : 56|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,PGS + SG_ Pas_Spkr_Rcnt_Alarm : 58|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ Pas_Spkr_Rrh_Alarm : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,PGS + +BO_ 1984 CAL_SAS11: 2 ESC + SG_ CCW : 0|4@1+ (1.0,0.0) [0.0|15.0] "" SAS + SG_ SAS_CID : 4|11@1+ (1.0,0.0) [0.0|2047.0] "" SAS + +BO_ 1456 CLU12: 4 CLU + SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0.0) [0.0|1677721.4] "km" _4WD,AAF,BCM,CUBIS,EMS,EPB,IBOX,LDWS_LKAS,SCC,TPMS + +BO_ 688 SAS11: 5 MDPS + SG_ SAS_Angle : 0|16@1- (0.1,0.0) [-3276.8|3276.7] "Deg" _4WD,ACU,AFLS,AVM,CLU,ECS,EMS,ESC,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SPAS,TCU,_4WD,ACU,AFLS,AVM,BCM,CLU,ECS,EMS,ESC,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SPAS,TCU + SG_ SAS_Speed : 16|8@1+ (4.0,0.0) [0.0|1016.0] "" AFLS,ECS,ESC,IBOX,LDWS_LKAS,SCC,SPAS,TCU,AFLS,ECS,ESC,IBOX,LDWS_LKAS,SCC,SPAS,TCU + SG_ SAS_Stat : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU,ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU + SG_ MsgCount : 32|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,ECS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS + SG_ CheckSum : 36|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,EMS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS,ECS,EMS,ESC,IBOX,LDWS_LKAS,PSB,SCC,SPAS + +BO_ 1441 ACU12: 8 ACU + SG_ CR_Acu_SN : 0|64@1+ (1.0,0.0) [0.0|0.0] "" ODS + +BO_ 1440 ACU11: 8 ACU + SG_ CF_Ods_SNRcv : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_Ods_IDRcv : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_Ods_RZReq : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_Abg_DepInhEnt : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_Abg_DepEnt : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ODS + SG_ CF_PasBkl_FltStat : 28|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB + SG_ CF_DriBkl_FltStat : 29|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB + SG_ CF_PasBkl_Stat : 30|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,ODS,PSB,TMU + SG_ CF_DriBkl_Stat : 31|1@1+ (1.0,0.0) [0.0|1.0] "" ODS,PSB + SG_ CF_SWL_Ind : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CUBIS,IBOX + SG_ CF_Acu_FltStat : 34|2@1+ (1.0,0.0) [0.0|3.0] "" CUBIS,IBOX + SG_ CF_Acu_ExtOfSab : 36|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,CUBIS,IBOX + SG_ CF_Acu_Dtc : 40|16@1+ (1.0,0.0) [0.0|65535.0] "" CUBIS,IBOX + SG_ CF_Acu_NumOfFlt : 56|8@1+ (1.0,0.0) [0.0|255.0] "" CUBIS,IBOX + +BO_ 1437 AHLS11: 8 AHLS + SG_ CF_Ahls_WarnLamp : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Ahls_WarnMsg : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1434 PSB11: 2 PSB + SG_ PSB_LH_FAIL : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ PSB_LH_TGL : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ PSB_LH_ACT : 3|4@1+ (1.0,0.0) [0.0|4.0] "" Dummy + SG_ PSB_RH_FAIL : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ PSB_RH_TGL : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ PSB_RH_ACT : 11|4@1+ (1.0,0.0) [0.0|4.0] "" Dummy + +BO_ 916 TCS13: 8 ESC + SG_ aBasis : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,SCC + SG_ BrakeLight : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,SCC + SG_ DCEnable : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ AliveCounterTCS : 13|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,SCC + SG_ Pre_TCS_CTL : 16|1@1+ (1.0,0.0) [0.0|1.0] "" Vector__XXX + SG_ EBA_ACK : 17|1@1+ (1.0,0.0) [0.0|1.0] "" Vector__XXX + SG_ FCA_ACK : 18|1@1+ (1.0,0.0) [0.0|1.0] "" Vector__XXX + SG_ DF_BF_STAT : 19|2@1+ (1.0,0.0) [0.0|3.0] "" BCW + SG_ SCCReqLim : 22|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ TQI_SCC : 24|8@1+ (0.390625,0.0) [0.0|199.609375] "%" Vector__XXX + SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" EMS,SCC + SG_ ACCEnable : 43|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC + SG_ DriverOverride : 45|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,SCC + SG_ StandStill : 47|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ CheckSum_TCS3 : 48|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,SCC + SG_ ACC_EQUIP : 52|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ PBRAKE_ACT : 53|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ ACC_REQ : 54|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ DriverBraking : 55|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,SCC + SG_ CF_VSM_Coded : 56|1@1+ (1.0,0.0) [0.0|1.0] "" SCC + SG_ CF_VSM_Avail : 57|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,SCC + SG_ CF_VSM_Handshake : 59|1@1+ (1.0,0.0) [0.0|1.0] "" SCC + SG_ CF_DriBkeStat : 60|1@1+ (1.0,0.0) [0.0|1.0] "" SCC + SG_ CF_VSM_ConfSwi : 61|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ AEB_EQUIP : 63|1@1+ (1.0,0.0) [0.0|1.0] "" SCC + +BO_ 1427 TPMS11: 6 BCM + SG_ TPMS_W_LAMP : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,HUD,IBOX,CLU,CUBIS,HUD,IBOX + SG_ TREAD_W_LAMP : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,HUD,IBOX,CLU,CUBIS,HUD,IBOX + SG_ POS_FL_W_LAMP : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX + SG_ POS_FR_W_LAMP : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX + SG_ POS_RL_W_LAMP : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX + SG_ POS_RR_W_LAMP : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,HUD,IBOX + SG_ STATUS_TPMS : 8|3@1+ (1.0,0.0) [0.0|0.0] "" CLU + SG_ UNIT : 11|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ PRESSURE_FL : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ PRESSURE_FR : 24|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ PRESSURE_RL : 32|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ PRESSURE_RR : 40|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + +BO_ 915 TCS12: 4 ESC + SG_ SA_COUNT : 0|16@1+ (2.0,-32768.0) [-32768.0|98302.0] "" _4WD,ACU,MDPS + SG_ SA_Z_COUNT : 16|15@1+ (2.0,-32768.0) [-32768.0|32766.0] "" _4WD,ACU,MDPS + SG_ SA_Z_FLAG : 31|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,MDPS + +BO_ 1170 EMS19: 8 EMS + SG_ CF_Ems_BrkReq : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX,TCU + SG_ CF_Ems_DnShftReq : 1|4@1+ (1.0,0.0) [0.0|14.0] "" IBOX,TCU + SG_ CF_Ems_RepModChk : 5|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX + SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1.0,0.0) [0.0|1.0] "" AAF,IBOX + SG_ CF_Ems_DecelReq : 8|12@1+ (0.0010,-4.094) [-4.094|0.0] "m/s^2" ESC,IBOX,TCU + SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0.0) [0.0|4094.0] "hPa" CLU,IBOX + SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40.0) [0.0|254.0] "deg" CLU,IBOX + SG_ DPF_LAMP_STAT : 40|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX + SG_ BAT_LAMP_STAT : 42|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41.0) [-41.0|85.5] "deg" AAF,IBOX + SG_ CF_Ems_OPSFail : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" AAF,ABS,CUBIS,ECS,EPB,IBOX,MDPS,REA,SCC,SMK,TCU + SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AAF,ABS,CUBIS,ECS,EPB,IBOX,MDPS,REA,SCC,SMK,TCU + +BO_ 1425 AFLS11: 2 AFLS + SG_ AFLS_STAT : 1|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Afls_TrfChgStat : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Afls_LedHLStat : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 912 SPAS11: 7 SPAS + SG_ CF_Spas_Stat : 0|4@1+ (1.0,0.0) [0.0|15.0] "" ESC,MDPS + SG_ CF_Spas_TestMode : 4|2@1+ (1.0,0.0) [0.0|3.0] "" MDPS + SG_ CR_Spas_StrAngCmd : 8|16@1- (0.1,0.0) [-3276.8|3276.7] "" MDPS + SG_ CF_Spas_BeepAlarm : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Spas_Mode_Seq : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Spas_AliveCnt : 32|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS + SG_ CF_Spas_Chksum : 40|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS + SG_ CF_Spas_PasVol : 48|3@1+ (1.0,0.0) [0.0|7.0] "" CGW,CLU + +BO_ 1168 EPB11: 7 EPB + SG_ EPB_I_LAMP : 0|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU,CUBIS,ESC,IBOX + SG_ EPB_F_LAMP : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,ESC,IBOX + SG_ EPB_ALARM : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC + SG_ EPB_CLU : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,ESC + SG_ EPB_SWITCH : 16|2@1+ (1.0,0.0) [0.0|3.0] "" ESC,SCC + SG_ EPB_RBL : 18|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,ESC + SG_ EPB_STATUS : 19|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,ESC,SCC,TCU + SG_ EPB_FRC_ERR : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,SCC,TCU + SG_ EPB_DBF_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ ESP_ACK : 25|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ EPB_DBF_REQ : 26|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ EPB_FAIL : 29|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,SCC + SG_ EPB_FORCE : 32|12@1+ (1.0,-1000.0) [-1000.0|3000.0] "" ESC + SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0.0) [0.0|2.54] "g" ESC + +BO_ 399 EMS_H12: 8 EMS + SG_ R_TqAcnApvC : 0|8@1+ (0.2,0.0) [0.0|51.0] "Nm" DATC,IBOX + SG_ R_PAcnC : 8|8@1+ (125.0,0.0) [0.0|31875.0] "hPa" DATC,IBOX + SG_ TQI_B : 16|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ABS,ESC,IBOX + SG_ SLD_VS : 24|8@1+ (1.0,0.0) [0.0|255.0] "km/h" CLU,IBOX + SG_ CF_CdaStat : 32|3@1+ (1.0,0.0) [0.0|7.0] "" AEMC,IBOX,TCU + SG_ CF_Ems_IsgStat : 35|3@1+ (1.0,0.0) [0.0|7.0] "" ABS,BCM,CLU,DATC,EPB,ESC,IBOX,LDWS_LKAS,MDPS,SMK,TCU + SG_ CF_Ems_OilChg : 38|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_EtcLimpMod : 39|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ R_NEngIdlTgC : 40|8@1+ (10.0,0.0) [0.0|2550.0] "rpm" DATC,IBOX,TCU + SG_ CF_Ems_UpTarGr : 48|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_DownTarGr : 49|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_DesCurGr : 50|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX + SG_ CF_Ems_SldAct : 54|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_SldPosAct : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_HPresStat : 56|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ CF_Ems_IsgBuz : 57|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_IdlStpFCO : 58|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_FCopen : 59|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Ems_ActEcoAct : 60|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU + SG_ CF_Ems_EngRunNorm : 61|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,IBOX,TCU + SG_ CF_Ems_IsgStat2 : 62|2@1+ (2.0,0.0) [0.0|3.0] "" CLU,IBOX,TCU + +BO_ 1419 LCA11: 8 LCA + SG_ CF_Lca_Stat : 0|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_Rcta_Stat : 4|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_Lca_IndLeft : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Rcw_Stat : 10|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_RCW_Warning : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Lca_IndRight : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_Lca_SndWan_Stat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_FR_SndWan : 20|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU + SG_ CF_FL_SndWan : 21|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU + SG_ CF_RR_SndWan : 22|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU + SG_ CF_RL_SndWan : 23|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU + SG_ CF_Lca_IndBriLeft : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_Lca_IndBriRight : 32|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_RCTA_IndBriLeft : 40|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_RCTA_IndBriRight : 48|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_RCTA_IndLeft : 56|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_RCTA_IndRight : 58|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + SG_ CF_SndWarnForClu : 60|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 906 ABS11: 8 ABS + SG_ ABS_DEF : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,EMS,SPAS,TCU + SG_ EBD_DEF : 1|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,SPAS,TCU + SG_ ABS_ACT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,EPB,SPAS,TCU + SG_ ABS_W_LAMP : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,CUBIS,MTS,TMU + SG_ EBD_W_LAMP : 4|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU + SG_ ABS_DIAG : 5|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU + SG_ ESS_STAT : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,BCM,CLU,EMS + +BO_ 903 WHL_PUL11: 6 ABS + SG_ WHL_PUL_FL : 0|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS + SG_ WHL_PUL_FR : 8|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS + SG_ WHL_PUL_RL : 16|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS + SG_ WHL_PUL_RR : 24|8@1+ (0.5,0.0) [0.0|127.5] "pulse count" CUBIS,EPB,IBOX,SPAS,TMU,TPMS,CUBIS,EPB,IBOX,LDWS_LKAS,SPAS,TMU,TPMS + SG_ WHL_DIR_FL : 32|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS + SG_ WHL_DIR_FR : 34|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS + SG_ WHL_DIR_RL : 36|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS + SG_ WHL_DIR_RR : 38|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,SPAS,TPMS,EPB,LCA,SPAS,TPMS + SG_ WHL_PUL_Chksum : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EPB,SPAS,TPMS,EPB,LCA,LDWS_LKAS,SPAS,TPMS + +BO_ 1415 TMU11: 8 IBOX + SG_ CF_Tmu_VehSld : 0|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Tmu_VehImmo : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Tmu_ReqRepCnd : 2|2@1+ (1.0,0.0) [0.0|3.0] "" EMS + SG_ CF_Tmu_AirconCtr : 4|1@1+ (1.0,0.0) [0.0|1.0] "" DATC + SG_ CF_Tmu_TempMd : 5|1@1+ (1.0,0.0) [0.0|1.0] "" DATC + SG_ CF_Tmu_TempSet : 6|16@1+ (1.0,0.0) [0.0|20.0] "" DATC + SG_ CF_Tmu_DefrostCtr : 22|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,FATC + SG_ CF_Tmu_AliveCnt1 : 56|4@1+ (1.0,0.0) [0.0|15.0] "" EMS + +BO_ 902 WHL_SPD11: 8 ABS + SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS + SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,ACU,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS + SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,BCM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,BCM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS + SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0.0) [0.0|511.96875] "km/h" _4WD,AFLS,AHLS,AVM,CLU,CUBIS,ECS,EMS,EPB,IBOX,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS,_4WD,ACU,AFLS,AHLS,AVM,CLU,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PGS,PSB,SCC,SMK,SPAS,TCU,TPMS + SG_ WHL_SPD_AliveCounter_LSB : 14|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + SG_ WHL_SPD_AliveCounter_MSB : 30|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + SG_ WHL_SPD_Checksum_LSB : 46|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + SG_ WHL_SPD_Checksum_MSB : 62|2@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + +BO_ 1414 EVP11: 3 EVP + SG_ CF_Evp_Stat : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 1412 AAF11: 8 AAF + SG_ CF_Aaf_ActFlapStatus : 0|2@1+ (1.0,0.0) [0.0|3.0] "" AAF_Tester + SG_ CF_Aaf_ModeStatus : 2|3@1+ (1.0,0.0) [0.0|7.0] "" AAF_Tester + SG_ CF_Aaf_WrnLamp : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Aaf_ErrStatus : 6|10@1+ (1.0,0.0) [0.0|1023.0] "" AAF_Tester,EMS + SG_ CF_Aaf_OpenRqSysAct : 16|8@1+ (1.0,0.0) [0.0|255.0] "" AAF_Tester + SG_ CF_Aaf_PStatus : 24|8@1+ (1.0,0.0) [0.0|100.0] "%" AAF_Tester + SG_ CF_Aaf_OpenRqSysSol : 32|8@1+ (1.0,0.0) [0.0|255.0] "" AAF_Tester + SG_ CF_Aaf_SolFlapStatus : 40|2@1+ (1.0,0.0) [0.0|3.0] "" AAF_Tester + SG_ CF_Aaf_MilOnReq : 42|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 900 EMS17: 8 EMS + SG_ CF_Ems_PkpCurMSV : 0|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_HolCurMSV : 8|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_InjVBnkAct : 16|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_InjVActSet : 24|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_DiagFulHDEV : 32|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX + SG_ CF_Ems_SwiOffIC1 : 33|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX + SG_ CF_Ems_SwiOffIC2 : 34|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX + SG_ CF_Ems_DiagReqHDEV : 38|1@1+ (1.0,0.0) [0.0|1.0] "" DI_BOX + SG_ CR_Ems_DutyCycMSV : 40|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" DI_BOX + SG_ CR_Ems_BatVolRly : 48|8@1+ (0.1,0.0) [0.0|25.5] "V" DI_BOX + +BO_ 387 REA11: 8 REA + SG_ CF_EndBst_PwmDuH : 0|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_PwmDuL : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_PwmFqOutRng : 2|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_HbriOverCur : 3|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_HbriOverTemp : 4|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_PosSnsKOR : 6|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_PosSnsOSOR : 7|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_EepFlt : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_RomFlt : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_RamFlt : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_CanFlt : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_AgH : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_AgL : 13|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_EndBst_ORVol : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CR_EndBst_ActPos : 16|16@1+ (0.117,0.0) [1.989|118.053] "" EMS + SG_ CR_EndBst_DemPos : 32|16@1+ (0.117,0.0) [0.0|119.691] "" EMS + SG_ CR_EndBst_HbriPwr : 48|16@1+ (0.045,0.0) [0.0|99.99] "%" EMS + +BO_ 1411 CUBIS11: 8 CUBIS + SG_ CF_Cubis_HUDisp : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + +BO_ 899 FATC11: 8 DATC + SG_ CR_Fatc_TqAcnOut : 0|8@1+ (0.2,0.0) [0.0|50.8] "Nm" EMS,IBOX + SG_ CF_Fatc_AcnRqSwi : 8|1@1+ (1.0,0.0) [0.0|1.0] "" AAF,EMS,IBOX + SG_ CF_Fatc_AcnCltEnRq : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_EcvFlt : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_BlwrOn : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_FATC_Iden : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Fatc_BlwrMax : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX + SG_ CF_Fatc_EngStartReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_IsgStopReq : 16|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_CtrInf : 17|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,IBOX + SG_ CF_Fatc_MsgCnt : 20|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX + SG_ CR_Fatc_OutTemp : 24|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" BCM,CLU,EMS,IBOX,SPAS,TCU,TPMS + SG_ CR_Fatc_OutTempSns : 32|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" AAF,AHLS,CLU,EMS,IBOX,SPAS,TCU + SG_ CF_Fatc_Compload : 40|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,IBOX + SG_ CF_Fatc_ActiveEco : 43|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Fatc_AutoActivation : 44|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX + SG_ CF_Fatc_DefSw : 45|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,IBOX + SG_ CF_Fatc_PtcRlyStat : 46|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Fatc_ChkSum : 56|8@1+ (1.0,0.0) [0.0|255.0] "" EMS,IBOX,SPAS + +BO_ 129 EMS_DCT12: 8 EMS + SG_ CR_Ems_SoakTimeExt : 0|6@1+ (5.0,0.0) [0.0|315.0] "Min" TCU + SG_ BRAKE_ACT : 6|2@1+ (1.0,0.0) [0.0|3.0] "" TCU + SG_ CF_Ems_EngOperStat : 8|8@1+ (1.0,0.0) [0.0|255.0] "" TCU + SG_ CR_Ems_IndAirTemp : 16|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" TCU + SG_ CF_Ems_Alive2 : 56|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Ems_ChkSum2 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + +BO_ 145 FCEV_ACCELERATOR: 8 XXX + SG_ ACCELERATOR_PEDAL : 48|8@1+ (1,0) [0|255] "" XXX + +BO_ 897 MDPS11: 8 MDPS + SG_ CF_Mdps_WLmp : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,CUBIS,EMS,IBOX,SPAS + SG_ CF_Mdps_Flex : 2|3@1+ (1.0,0.0) [0.0|3.0] "" CLU,LDWS_LKAS + SG_ CF_Mdps_FlexDisp : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Mdps_Stat : 7|4@1+ (1.0,0.0) [0.0|15.0] "" SPAS + SG_ CR_Mdps_DrvTq : 11|12@1+ (1.0,-2048.0) [-2048.0|2046.0] "" SPAS + SG_ CF_Mdps_ALTRequest : 23|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CR_Mdps_StrAng : 24|16@1- (0.1,0.0) [-3276.8|3276.7] "Deg" SPAS + SG_ CF_Mdps_AliveCnt : 40|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,SPAS + SG_ CF_Mdps_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,SPAS + SG_ CF_Mdps_SPAS_FUNC : 57|1@1+ (1.0,0.0) [0.0|1.0] "flag" SPAS + SG_ CF_Mdps_LKAS_FUNC : 58|1@1+ (1.0,0.0) [0.0|1.0] "flag" LDWS_LKAS + SG_ CF_Mdps_CurrMode : 59|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS + SG_ CF_Mdps_Type : 61|2@1+ (1.0,0.0) [0.0|2.0] "" LDWS_LKAS,SPAS + SG_ CF_MDPS_VSM_FUNC : 56|1@0+ (1.0,0.0) [0.0|1.0] "" XXX + +BO_ 896 DI_BOX13: 8 DI_BOX + SG_ CF_DiBox_HPreInjVConfStat : 0|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_HPreInjVStat1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_HPreInjVStat2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_HPreInjVPkp : 24|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_HPreInjVBpt : 32|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_ErrRegFrtMSV : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_ErrRegSedMSV : 48|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_SPIErrSedMSV : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_SPIErrFrtMSV : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_IDErrSedMSV : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_IDErrFrtMSV : 59|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_IniStatMSV : 60|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 640 EMS13: 8 EMS + SG_ LV_FUEL_TYPE_ECU : 0|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,LPI,SMK + SG_ LV_BFS_CFIRM : 1|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ LV_CRASH : 2|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ LV_VB_OFF_ACT : 3|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ LV_GSL_MAP M : 4|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ LV_ENG_TURN : 5|1@1+ (1.0,0.0) [0.0|1.0] "" LPI + SG_ ERR_FUEL : 8|8@1+ (1.0,0.0) [0.0|255.0] "" LPI + SG_ EOS : 16|8@1+ (1.0,0.0) [0.0|255.0] "" LPI + SG_ TCO : 24|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" LPI + SG_ N_32 : 32|8@1+ (32.0,0.0) [0.0|8160.0] "rpm" LPI + SG_ MAF : 40|8@1+ (5.447,0.0) [0.0|1388.985] "mg/TDC" LPI + SG_ TIA : 48|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" LPI + SG_ MAP m1 : 56|8@1+ (0.47058,0.0) [0.0|119.9979] "kPa" LPI + SG_ AMP m0 : 56|8@1+ (21.22,0.0) [0.0|5411.1] "hPa" LPI + +BO_ 128 EMS_DCT11: 8 EMS + SG_ PV_AV_CAN : 0|8@1+ (0.3906,0.0) [0.0|99.603] "%" TCU + SG_ TQ_STND : 8|6@1+ (10.0,0.0) [0.0|630.0] "Nm" TCU + SG_ F_N_ENG : 14|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ F_SUB_TQI : 15|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ N : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" TCU + SG_ TQI_ACOR : 32|8@1+ (0.390625,0.0) [0.0|99.6094] "%" IBOX,TCU + SG_ TQFR : 40|8@1+ (0.390625,0.0) [0.0|99.6094] "%" TCU + SG_ TQI : 48|8@1+ (0.390625,0.0) [0.0|99.609375] "%" TCU + SG_ CF_Ems_Alive : 56|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Ems_ChkSum : 60|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + +BO_ 1407 HU_MON_PE_01: 8 CLU + SG_ HU_Type : 0|8@1+ (1.0,0.0) [0.0|255.0] "" AVM,PGS + +BO_ 127 CGW5: 8 BCM + SG_ C_StopLampLhOpenSts : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_StopLampRhOpenSts : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HMSLOpenSts : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HLampLowLhOpenSts : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HLampLowRhOpenSts : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HLampHighLhOpenSts : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_HLampHighRhOpenSts : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_DRLLampLhOpenSts : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_DRLLampRhOpenSts : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearFOGLhOpenSts : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearFOGRhOpenSts : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontFOGLhOpenSts : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontFOGRhOpenSts : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearEXTTailLhOpenSts : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearEXTTailRhOpenSts : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontEXTTailLhOpenSts : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontEXTTailRhOpenSts : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearTSIGLhOpenSts : 17|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_RearTSIGRhOpenSts : 18|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontTSIGLhOpenSts : 19|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_FrontTSIGRhOpenSts : 20|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_SBendingLhOpenSts : 21|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_SBendingRhOpenSts : 22|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_LicensePlateLhOpenSts : 23|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_LicensePlateRhOpenSts : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 1151 ESP11: 6 ESC + SG_ AVH_STAT : 0|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,TCU + SG_ LDM_STAT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" EPB,TCU + SG_ REQ_EPB_ACT : 3|2@1+ (1.0,0.0) [0.0|3.0] "" EPB,TCU + SG_ REQ_EPB_STAT : 5|1@1+ (1.0,0.0) [0.0|1.0] "" EPB + SG_ ECD_ACT : 6|1@1+ (1.0,0.0) [0.0|1.0] "" EPB + SG_ _4WD_LIM_REQ : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS + SG_ ROL_CNT_ESP : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EPB,TCU + SG_ _4WD_TQC_LIM : 16|16@1+ (1.0,0.0) [0.0|65535.0] "Nm" _4WD,EMS + SG_ _4WD_CLU_LIM : 32|8@1+ (0.390625,0.0) [0.0|99.609375] "%" _4WD,EMS + SG_ _4WD_OPEN : 40|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,EMS + SG_ _4WD_LIM_MODE : 42|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD + +BO_ 1397 HU_AVM_E_00: 8 CLU + SG_ HU_AVM_Cal_Cmd : 0|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_Cal_Method : 4|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS + SG_ HU_AVM_Save_Controlpoint : 6|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS + SG_ HU_AVM_PT_X : 8|12@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_RearViewPointOpt : 20|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_PT_Y : 24|12@1+ (1.0,0.0) [0.0|4095.0] "" AVM,PGS + SG_ HU_AVM_FrontViewPointOpt : 36|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_SelectedMenu : 40|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,PGS + SG_ HU_AVM_CameraOff : 45|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS + SG_ HU_AVM_Option : 48|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_CrossLineMove_Cmd : 52|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_RearView_Option : 56|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_FrontView_Option : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + +BO_ 1395 HU_AVM_E_01: 8 CLU + SG_ HU_PGSSelectedMenu : 0|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_PGSOption : 8|5@1+ (1.0,0.0) [0.0|31.0] "" AVM,PGS + SG_ HU_AVM_ParkingAssistMenu : 56|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + SG_ HU_AVM_ParkingAssistSB : 60|4@1+ (1.0,0.0) [0.0|15.0] "" AVM,PGS + +BO_ 1393 OPI11: 5 OPI + SG_ CR_Opi_Spd_Rpm : 0|8@1+ (20.0,0.0) [0.0|3500.0] "rpm" TCU + SG_ CF_Opi_Over_Temp : 8|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ CF_Opi_Over_Cur : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU + SG_ CF_Opi_Over_Vol : 10|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ CF_Opi_Hall_Fail : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU + SG_ CF_Opi_Flt : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,TCU + SG_ CF_Opi_Motor_Dir : 15|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ CF_Opi_Romver : 16|8@1+ (1.0,0.0) [0.0|255.0] "" TCU + SG_ CF_Opi_PWM_Rate : 24|12@1+ (1.0,0.0) [0.0|100.0] "%" TCU + +BO_ 625 LPI11: 8 LPI + SG_ FUP_LPG_MMV : 0|8@1+ (128.0,0.0) [0.0|32640.0] "hPa" EMS + SG_ LV_FUEL_TYPE_BOX : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_BFS_IN_PROGRESS : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_GAS_OK : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_FUP_ENA_THD : 11|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,EMS,SMK + SG_ LPI_OBD : 12|4@1+ (1.0,0.0) [0.0|15.0] "" EMS + SG_ ERR_GAS : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ FAC_TI_GAS_COR : 24|16@1+ (3.05E-5,0.0) [0.0|1.9988175] "" EMS + SG_ FTL_AFU : 40|8@1+ (0.392,0.0) [0.0|99.96] "%" EMS + SG_ BFS_CYL : 48|8@1+ (1.0,0.0) [0.0|6.0] "Cyl Nr." EMS + SG_ LV_PRE_CDN_LEAK : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_CONF_INJECTION_DELAY : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ LV_LPG_SW_DRIVER_REQ : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 356 VSM11: 4 ESC + SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" MDPS + SG_ CF_Esc_Act : 12|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,MDPS + SG_ CF_Esc_CtrMode : 13|3@1+ (1.0,0.0) [0.0|7.0] "" MDPS + SG_ CF_Esc_Def : 16|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Esc_AliveCnt : 17|4@1+ (1.0,0.0) [0.0|15.0] "" LDWS_LKAS,MDPS + SG_ CF_Esc_Chksum : 24|8@1+ (1.0,0.0) [0.0|255.0] "" LDWS_LKAS,MDPS + +BO_ 1379 PGS_HU_PE_01: 8 PGS + SG_ PGS_State : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ PGS_ParkGuideState : 8|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + SG_ PGS_Option : 16|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + SG_ PGS_Version : 32|16@1+ (1.0,0.0) [0.0|65535.0] "" CLU + +BO_ 354 TCU_DCT13: 3 TCU + SG_ Clutch_Driving_Tq : 0|10@1+ (1.0,-512.0) [0.0|0.0] "Nm" ESC + SG_ Cluster_Engine_RPM : 10|13@1+ (0.9766,0.0) [0.0|0.0] "" CLU + SG_ Cluster_Engine_RPM_Flag : 23|1@1+ (1.0,0.0) [0.0|0.0] "" CLU + +BO_ 1378 HUD11: 4 HUD + SG_ CF_Hud_HeightStaus : 0|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + SG_ CF_Hud_PBackStatus : 6|2@1+ (1.0,0.0) [0.0|0.0] "" BCM,CLU + SG_ CF_Hud_Brightness : 8|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + +BO_ 608 EMS16: 8 EMS + SG_ TQI_MIN : 0|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU + SG_ TQI : 8|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU + SG_ TQI_TARGET : 16|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EPB,ESC,IBOX,TCU + SG_ GLOW_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,IBOX,SMK + SG_ CRUISE_LAMP_M : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU + SG_ CRUISE_LAMP_S : 26|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,TCU + SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ ENG_STAT : 28|3@1+ (1.0,0.0) [0.0|7.0] "" ABS,AHLS,AVM,BCM,CLU,EPB,ESC,EVP,FPCM,IBOX,LCA,LDWS_LKAS,MDPS,SCC,SMK,TCU + SG_ SOAK_TIME_ERROR : 31|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,EPB,IBOX,TCU + SG_ SOAK_TIME : 32|8@1+ (1.0,0.0) [0.0|255.0] "Min" _4WD,DATC,EPB,IBOX,TCU + SG_ TQI_MAX : 40|8@1+ (0.390625,0.0) [0.0|99.609375] "%" ESC,IBOX,TCU + SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [-35.625|60.0] "" IBOX,TCU + SG_ Checksum : 56|4@1+ (1.0,0.0) [0.0|15.0] "" ECS,IBOX,LDWS_LKAS,MDPS,SCC + SG_ AliveCounter : 60|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,LDWS_LKAS,MDPS,SCC + SG_ CF_Ems_AclAct : 62|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,SCC + +BO_ 1371 AVM_HU_PE_00: 8 AVM + SG_ AVM_View : 0|5@1+ (1.0,0.0) [0.0|31.0] "" CLU + SG_ AVM_ParkingAssist_BtnSts : 5|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ AVM_Display_Message : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ AVM_Popup_Msg : 16|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_Ready : 20|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_ParkingAssist_Step : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_FrontBtn_Type : 28|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_Option : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_HU_FrontViewPointOpt : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_HU_RearView_Option : 40|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_HU_FrontView_Option : 44|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ AVM_Version : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" CLU + +BO_ 1370 HU_AVM_PE_00: 8 CLU + SG_ HU_AVM_Status : 0|2@1+ (1.0,0.0) [0.0|3.0] "" AVM,PGS + +BO_ 1369 CGW4: 8 BCM + SG_ CF_Gway_MemoryP1Cmd : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_MemoryP2Cmd : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBackP1Cmd : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBackP2Cmd : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_StrgWhlHeatedState : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBackStopCmd : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,HUD + SG_ CF_Gway_StaticBendLhAct : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_StaticBendRhAct : 7|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_DrvWdwStat : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_RLWdwState : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_RRWdwState : 10|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_AstWdwStat : 11|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_MemoryEnable : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBACKStopCmd : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_PBACKStop : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,HUD + SG_ CF_Gway_IMSBuzzer : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_DrvSeatBeltInd : 36|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_AstSeatBeltInd : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_RCSeatBeltInd : 40|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_RLSeatBeltInd : 42|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_RRSeatBeltInd : 44|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_RrWiperHighSw : 46|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_RrWiperLowSw : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 1367 EngFrzFrm12: 8 EMS + SG_ PID_06h : 0|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU + SG_ PID_07h : 8|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU + SG_ PID_08h : 16|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU + SG_ PID_09h : 24|8@1+ (0.78125,-100.0) [-100.0|99.22] "%" AAF,IBOX,TCU + SG_ PID_0Bh : 32|8@1+ (1.0,0.0) [0.0|255.0] "kPa" AAF,IBOX,TCU + SG_ PID_23h : 40|16@1+ (10.0,0.0) [0.0|655350.0] "kPa" AAF,IBOX,TCU + +BO_ 1366 EngFrzFrm11: 8 EMS + SG_ PID_04h : 0|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" AAF,TCU + SG_ PID_05h : 8|8@1+ (1.0,-40.0) [-40.0|215.0] "deg" AAF,TCU + SG_ PID_0Ch : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" AAF,TCU + SG_ PID_0Dh : 32|8@1+ (1.0,0.0) [0.0|255.0] "km/h" AAF,TCU + SG_ PID_11h : 40|8@1+ (0.3921568627,0.0) [0.0|100.0] "%" AAF,TCU + SG_ PID_03h : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" AAF,TCU + +BO_ 1365 FPCM11: 8 FPCM + SG_ CR_Fpcm_LPActPre : 0|8@1+ (3.137254902,0.0) [0.0|800.0] "kPa" EMS + SG_ CF_Fpcm_LPPumpOverCur : 8|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_PreSnrHi : 9|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_PreSnrDisc : 10|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_PreSnrShort : 11|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_LPPumpDiscShort : 12|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_LP_System_Error : 13|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_PreSnrSigErr : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Fpcm_LPCtrCirFlt : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 871 LVR12: 8 LVR + SG_ CF_Lvr_CruiseSet : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,TCU + SG_ CF_Lvr_IsgState : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,TCU + SG_ CF_Lvr_Gear : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,TCU + +BO_ 872 LVR11: 8 LVR + SG_ CF_Lvr_GearInf : 0|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,TCU + SG_ CF_Lvr_PRelStat : 4|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,SMK,TCU + SG_ CF_Lvr_BkeAct : 5|1@1+ (1.0,0.0) [0.0|1.0] "" TCU + SG_ CF_Lvr_NFnStat : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Lvr_PosInf : 8|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Lvr_PosCpl : 12|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Lvr_UlkButStat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" TCU + SG_ CF_Lvr_PNStat : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Lvr_ShtLkStat : 24|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Lvr_ShfErrInf : 28|20@1+ (1.0,0.0) [0.0|8191.0] "" CLU,TCU + SG_ CF_Lvr_AC : 48|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + SG_ CF_Lvr_CS : 52|4@1+ (1.0,0.0) [0.0|15.0] "" TCU + +BO_ 1363 CGW2: 8 BCM + SG_ CF_Gway_GwayDiagState : 0|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_DDMDiagState : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SCMDiagState : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_PSMDiagState : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SJBDiagState : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_IPMDiagState : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_LDMFail : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,LDWS_LKAS,LDWS_LKAS + SG_ CF_Gway_CLUSwGuiCtrl : 10|3@1+ (1.0,0.0) [0.0|63.0] "" CLU,Dummy + SG_ CF_Gway_CLUSwGroup : 13|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_CLUSwMode : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_CLUSwEnter : 15|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_AutoLightValue : 16|1@1+ (1.0,0.0) [0.0|1.0] "" LCA,LCA + SG_ CF_Gway_BrakeFluidSw : 17|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_DrvSeatBeltInd : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_AvTail : 20|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,SNV,SNV + SG_ CF_Gway_RearFogAct : 21|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_ExtTailAct : 22|1@1+ (1.0,0.0) [0.0|1.0] "" AVM,CLU,LCA,PGS,SPAS,AVM,LCA,PGS,SPAS + SG_ CF_Gway_RRDrSw : 23|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_RLDrSw : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_IntTailAct : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_CountryCfg : 26|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,Dummy + SG_ CF_Gway_WiperParkPosition : 32|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,EMS,LDWS_LKAS,AFLS,EMS,LDWS_LKAS + SG_ CF_Gway_HLLowLHFail : 33|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,SNV,LDWS_LKAS,SNV + SG_ CF_Gway_HLLowRHFail : 34|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS,SNV,LDWS_LKAS,SNV + SG_ CF_Gway_ESCLFailWarn : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_ESCLNotLockedWarn : 36|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_ESCLNotUnlockWarn : 37|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_IDoutWarn : 38|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_ImmoLp : 40|1@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_BCMRKEID : 41|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy + SG_ CF_Gway_VehicleNotPWarn : 44|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_DeactivationWarn : 45|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_KeyBATDischargeWarn : 46|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SSBWarn : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SMKFobID : 48|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy + SG_ CF_Gway_SMKRKECmd : 51|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy + SG_ CF_Gway_AutoLightOption : 54|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_SJBDeliveryMode : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_KeyoutLp : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,Dummy + SG_ CF_Gway_SMKDispWarn : 57|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,Dummy + SG_ CF_Gway_WngBuz : 61|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,Dummy + +BO_ 339 TCS11: 8 ESC + SG_ TCS_REQ : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,TCU + SG_ MSR_C_REQ : 1|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,EPB,SCC,TCU + SG_ TCS_PAS : 2|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,SCC,SPAS,TCU + SG_ TCS_GSC : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,TCU + SG_ CF_Esc_LimoInfo : 4|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,SCC + SG_ ABS_DIAG : 6|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB + SG_ ABS_DEF : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,SCC,SPAS,TCU + SG_ TCS_DEF : 8|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SCC,SPAS,TCU + SG_ TCS_CTL : 9|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SCC,SPAS,TCU + SG_ ABS_ACT : 10|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,SPAS,TCU + SG_ EBD_DEF : 11|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,SPAS,TCU + SG_ ESP_PAS : 12|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,CLU,EMS,EPB,LDWS_LKAS,SCC,TCU + SG_ ESP_DEF : 13|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,TCU + SG_ ESP_CTL : 14|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,ECS,EMS,EPB,LDWS_LKAS,SCC,SPAS,TCU + SG_ TCS_MFRN : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,EPB,TCU + SG_ DBC_CTL : 16|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB + SG_ DBC_PAS : 17|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB + SG_ DBC_DEF : 18|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB + SG_ HAC_CTL : 19|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU + SG_ HAC_PAS : 20|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU + SG_ HAC_DEF : 21|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,EMS,EPB,TCU + SG_ ESS_STAT : 22|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,BCM,CLU,EMS,EPB + SG_ TQI_TCS : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU + SG_ TQI_MSR : 32|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU + SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,EPB,TCU + SG_ CF_Esc_BrkCtl : 48|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ BLA_CTL : 49|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CGW,CLU + SG_ AliveCounter_TCS1 : 52|4@1+ (1.0,0.0) [0.0|14.0] "" EMS,EPB,LDWS_LKAS + SG_ CheckSum_TCS1 : 56|8@1+ (1.0,0.0) [0.0|255.0] "" EMS,EPB,LDWS_LKAS + +BO_ 1362 SNV11: 4 SNV + SG_ CF_SNV_DisplayControl : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,HUD + SG_ CF_Snv_BeepWarning : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,HUD + SG_ CF_Snv_WarningMessage : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,HUD + SG_ CF_Snv_DetectionEnable : 7|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,CLU,HUD + SG_ CF_Snv_PedestrianDetect : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,HUD + SG_ CF_Snv_IRLampControl : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,HUD + +BO_ 593 MDPS12: 8 MDPS + SG_ CR_Mdps_StrColTq : 0|11@1+ (1.0,-1024.0) [-1024.0|1024.0] "" LDWS_LKAS + SG_ CF_Mdps_Def : 11|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ CF_Mdps_ToiUnavail : 12|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Mdps_ToiActive : 13|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Mdps_ToiFlt : 14|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Mdps_FailStat : 15|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Mdps_MsgCount2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" ESC,LDWS_LKAS + SG_ CF_Mdps_Chksum2 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" ESC,LDWS_LKAS + SG_ CF_Mdps_SErr : 37|1@1+ (1.0,0.0) [0.0|1.0] "" ESC + SG_ CR_Mdps_StrTq : 40|12@1+ (0.01,-20.48) [-20.48|20.47] "Nm" ESC + SG_ CR_Mdps_OutTq : 52|12@1+ (0.1,-204.8) [-204.8|204.7] "" ESC,LDWS_LKAS + +BO_ 1360 IAP11: 3 IAP + SG_ CF_Iap_EcoPmodSwi : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Iap_EcoPmodAct : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Iap_ReqWarn : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1356 TCU_DCT14: 8 TCU + SG_ Vehicle_Stop_Time : 0|5@1+ (1.0,0.0) [0.0|0.0] "" CLU + SG_ HILL_HOLD_WARNING : 5|1@1+ (1.0,0.0) [0.0|0.0] "" CLU + +BO_ 1353 BAT11: 8 EMS + SG_ BAT_SNSR_I : 0|16@1+ (0.01,-327.0) [-327.0|328.0] "A" CGW,CUBIS,IBOX,TMU + SG_ BAT_SOC : 16|8@1+ (1.0,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_V : 24|14@1+ (0.0010,6.0) [6.0|18.0] "V" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_Temp : 38|9@1- (0.5,-40.0) [-40.0|125.0] "deg" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_State : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU + SG_ BAT_SOH : 48|7@1+ (1.0,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_Invalid : 55|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU + SG_ BAT_SOF : 56|7@1+ (0.1,0.0) [0.0|12.0] "V" CGW,CUBIS,IBOX,TMU + SG_ BAT_SNSR_Error : 63|1@1+ (1.0,0.0) [0.0|1.0] "" CGW,CUBIS,IBOX,TMU + +BO_ 1351 EMS15: 8 EMS + SG_ ECGPOvrd : 0|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX,SCC + SG_ QECACC : 1|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ ECFail : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ SwitchOffCondExt : 3|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ BLECFail : 4|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ CF_Ems_IsaAct : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ FA_PV_CAN : 8|8@1+ (0.3906,0.0) [0.0|99.2] "%" IBOX,LDWS_LKAS,TCU + SG_ IntAirTemp : 16|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" _4WD,ECS,EPB,IBOX,TCU + SG_ STATE_DC_OBD : 24|7@1+ (1.0,0.0) [0.0|127.0] "" IBOX,TCU + SG_ INH_DC_OBD : 31|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ CTR_IG_CYC_OBD : 32|16@1+ (1.0,0.0) [0.0|65535.0] "" ACU,IBOX,TCU + SG_ CTR_CDN_OBD : 48|16@1+ (1.0,0.0) [0.0|65535.0] "" IBOX,TCU + +BO_ 1350 DI_BOX12: 8 DI_BOX + SG_ CF_DiBox_FrtInjVDiagReg0 : 0|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_FrtInjVDiagReg1 : 8|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_FrtInjVDiagReg2 : 16|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_SedInjVDiagReg0 : 24|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_SedInjVDiagReg1 : 32|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CF_DiBox_SedInjVDiagReg2 : 40|8@1+ (1.0,0.0) [0.0|255.0] "" EMS + SG_ CR_DiBox_BatVol : 48|8@1+ (0.1,0.0) [0.0|25.5] "V" EMS + SG_ CF_DiBox_SedInjVChg : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_FrtInjVChg : 57|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_SedInjVErrSPI : 58|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_DiBox_FrtInjVErrSPI : 59|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + +BO_ 1349 EMS14: 8 EMS + SG_ IMMO_LAMP_STAT : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ L_MIL : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,IBOX + SG_ IM_STAT : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ AMP_CAN : 3|5@1+ (10.731613,458.98) [458.98|791.660003] "mmHg" CLU,IBOX,TCU,TPMS + SG_ BAT_Alt_FR_Duty : 8|8@1+ (0.4,0.0) [0.0|100.0] "%" CGW,CUBIS,IBOX,TMU + SG_ VB : 24|8@1+ (0.1015625,0.0) [0.0|25.8984375] "V" CLU,CUBIS,DATC,EPB,FPCM,IBOX + SG_ EMS_VS : 32|12@1+ (0.0625,0.0) [0.0|255.875] "km/h" CLU + SG_ TEMP_FUEL : 56|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" FPCM + +BO_ 68 DATC11: 8 DATC + SG_ CF_Datc_Type : 0|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CF_Datc_VerMaj : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CF_Datc_VerMin : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CR_Datc_OutTempC : 24|8@1+ (0.5,-41.0) [-41.0|86.5] "deg" CLU,FPCM + SG_ CR_Datc_OutTempF : 32|8@1+ (1.0,-42.0) [-42.0|213.0] "deg" CLU + SG_ CF_Datc_IncarTemp : 40|8@1+ (0.5,-40.0) [-40.0|60.0] "deg" BCM,CLU + +BO_ 67 DATC13: 8 DATC + SG_ CF_Datc_TempDispUnit : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX + SG_ CF_Datc_ModDisp : 2|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_IonClean : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_ChgReqDisp : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_IntakeDisp : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_AutoDisp : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_FrDefLed : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,IBOX + SG_ CF_Datc_AutoDefogBlink : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_ClmScanDisp : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_AqsDisp : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_AcDisp : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_OpSts : 25|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Mtc_MaxAcDisp : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_DualDisp : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_PwrInf : 32|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_RearManual : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_RearAutoDisp : 40|2@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Datc_RearOffDisp : 42|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_RearClimateScnDisp : 44|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_RearChgReqDisp : 46|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_RearModDisp : 48|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_RearBlwDisp : 52|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_PSModDisp : 56|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ CF_Datc_FrontBlwDisp : 60|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX + +BO_ 66 DATC12: 8 DATC + SG_ CR_Datc_DrTempDispC : 0|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX + SG_ CR_Datc_DrTempDispF : 8|8@1+ (1.0,56.0) [58.0|90.0] "deg" CLU,IBOX + SG_ CR_Datc_PsTempDispC : 16|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU,IBOX + SG_ CR_Datc_PsTempDispF : 24|8@1+ (1.0,56.0) [58.0|90.0] "deg" CLU,IBOX + SG_ CR_Datc_RearDrTempDispC : 40|8@1+ (0.5,14.0) [15.0|32.0] "deg" CLU + SG_ CR_Datc_RearDrTempDispF : 48|8@1+ (1.0,58.0) [58.0|90.0] "deg" CLU + SG_ CF_Datc_CO2_Warning : 56|8@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1345 CGW1: 8 BCM + SG_ CF_Gway_IGNSw : 0|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,ECS,EMS,EPB,ESC,IBOX,LVR,MDPS,SAS,SCC,ECS,EMS,EPB,ESC,IBOX,LVR,MDPS,SAS,SCC + SG_ CF_Gway_RKECmd : 3|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX + SG_ CF_Gway_DrvKeyLockSw : 6|1@1+ (1.0,0.0) [0.0|1.0] "" ECS,EMS,IBOX,ECS,EMS,IBOX + SG_ CF_Gway_DrvKeyUnlockSw : 7|1@1+ (1.0,0.0) [0.0|1.0] "" ECS,EMS,IBOX,ECS,EMS,IBOX + SG_ CF_Gway_DrvDrSw : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ECS,EMS,EPB,ESC,IBOX,SCC,TCU,ECS,EMS,EPB,ESC,IBOX,SCC,TCU + SG_ CF_Gway_DrvSeatBeltSw : 10|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,ESC,IBOX,PSB,TCU,EMS,EPB,ESC,IBOX,PSB,TCU + SG_ CF_Gway_TrunkTgSw : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ECS,EMS,EPB,ESC,IBOX,ECS,EMS,EPB,ESC,IBOX + SG_ CF_Gway_AstSeatBeltSw : 14|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX,PSB,IBOX,PSB + SG_ CF_Gway_SMKOption : 16|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,EMS,IBOX,SMK + SG_ CF_Gway_HoodSw : 17|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,EPB,ESC,IBOX,EMS,EPB,ESC,IBOX + SG_ CF_Gway_TurnSigLh : 19|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,IBOX,LCA,LDWS_LKAS,SCC,EMS,IBOX,LCA,LDWS_LKAS,SCC + SG_ CF_Gway_WiperIntT : 21|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_WiperIntSw : 24|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_WiperLowSw : 25|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_WiperHighSw : 26|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_WiperAutoSw : 27|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_RainSnsState : 28|3@1+ (1.0,0.0) [0.0|7.0] "" AFLS,EMS,IBOX,LDWS_LKAS,AFLS,EMS,ESC,IBOX,LDWS_LKAS + SG_ CF_Gway_HeadLampLow : 31|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,EMS,IBOX,LDWS_LKAS,SNV,AFLS,EMS,IBOX,LDWS_LKAS,SNV + SG_ CF_Gway_HeadLampHigh : 32|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,EMS,IBOX,LDWS_LKAS,AFLS,EMS,IBOX,LDWS_LKAS + SG_ CF_Gway_HazardSw : 33|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,EMS,ESC,IBOX,LCA,LDWS_LKAS,ABS,EMS,ESC,IBOX,LCA,LDWS_LKAS + SG_ CF_Gway_AstDrSw : 35|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,IBOX + SG_ CF_Gway_DefoggerRly : 36|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX,EMS,IBOX + SG_ CF_Gway_ALightStat : 37|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS + SG_ CF_Gway_LightSwState : 38|2@1+ (1.0,0.0) [0.0|3.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS + SG_ CF_Gway_Frt_Fog_Act : 40|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,CLU,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS + SG_ CF_Gway_TSigRHSw : 41|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_TSigLHSw : 42|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_DriveTypeOption : 43|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_StarterRlyState : 44|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX,EMS,IBOX,SMK + SG_ CF_Gway_PassiveAccessLock : 45|2@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX,SMK + SG_ CF_Gway_WiperMistSw : 47|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,IBOX,LDWS_LKAS + SG_ CF_Gway_PassiveAccessUnlock : 48|2@1+ (1.0,0.0) [0.0|7.0] "" CLU,ECS,EMS,IBOX,ECS,EMS,IBOX,SMK + SG_ CF_Gway_RrSunRoofOpenState : 50|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,DATC,IBOX + SG_ CF_Gway_PassingSW : 51|1@1+ (1.0,0.0) [0.0|1.0] "" AFLS,IBOX,LDWS_LKAS,AFLS,IBOX,LDWS_LKAS + SG_ CF_Gway_HBAControlMode : 52|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_HLpHighSw : 53|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LDWS_LKAS,IBOX,LDWS_LKAS + SG_ CF_Gway_InhibitRMT : 54|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EPB,ESC,IBOX,LCA,LDWS_LKAS,MDPS,PGS,SCC,SPAS,TPMS,EPB,ESC,IBOX,LCA,LDWS_LKAS,PGS,SCC,SPAS,TPMS + SG_ CF_Gway_RainSnsOption : 56|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ C_SunRoofOpenState : 57|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,DATC,IBOX,DATC,IBOX + SG_ CF_Gway_Ign1 : 58|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_Ign2 : 59|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Gway_ParkBrakeSw : 60|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,ESC,IBOX,SCC,ESC,IBOX,SCC + SG_ CF_Gway_TurnSigRh : 62|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,IBOX,LCA,LDWS_LKAS,SCC,EMS,IBOX,LCA,LDWS_LKAS,SCC + +BO_ 64 DATC14: 8 DATC + SG_ CF_Datc_AqsLevelOut : 0|4@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Datc_DiagMode : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CR_Datc_SelfDiagCode : 8|8@1+ (1.0,-1.0) [0.0|254.0] "" CLU + SG_ DATC_SyncDisp : 16|4@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_OffDisp : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_SmartVentDisp : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_SmartVentOnOffStatus : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_AutoDefogSysOff_Disp : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ DATC_ADSDisp : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 832 LKAS11: 8 LDWS_LKAS + SG_ CF_Lkas_LdwsActivemode : 0|2@1+ (1,0) [0|3] "" CLU,IBOX,PSB + SG_ CF_Lkas_LdwsSysState : 2|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,IBOX,PSB + SG_ CF_Lkas_SysWarning : 6|4@1+ (1.0,0.0) [0.0|15.0] "" BCM,CLU + SG_ CF_Lkas_LdwsLHWarning : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB + SG_ CF_Lkas_LdwsRHWarning : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB + SG_ CF_Lkas_HbaLamp : 14|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Lkas_FcwBasReq : 15|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC + SG_ CR_Lkas_StrToqReq : 16|11@1+ (1.0,-1024.0) [-1024.0|1024.0] "" MDPS + SG_ CF_Lkas_ActToi : 27|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Lkas_ToiFlt : 28|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Lkas_HbaSysState : 29|3@1+ (1.0,0.0) [0.0|7.0] "" BCM,CLU + SG_ CF_Lkas_FcwOpt : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Lkas_HbaOpt : 34|2@1+ (1.0,0.0) [0.0|1.0] "" BCM,CGW + SG_ CF_Lkas_MsgCount : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,MDPS + SG_ CF_Lkas_FcwSysState : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Lkas_FcwCollisionWarning : 43|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Lkas_FusionState : 45|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ CF_Lkas_Unknown1 : 47|1@1+ (1.0,0.0) [0.0|1.0] "" XXX + SG_ CF_Lkas_Chksum : 48|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS + SG_ CF_Lkas_FcwOpt_USM : 56|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Lkas_LdwsOpt_USM : 59|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,MDPS + SG_ CF_Lkas_Unknown2 : 62|2@1+ (1.0,0.0) [0.0|1.0] "" XXX + +BO_ 1342 LKAS12: 6 LDWS_LKAS + SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_LkasTsrStatus : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU + SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1.0,0.0) [0.0|255.0] "" BCM,CLU + SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|7] "" CLU + SG_ CF_Lkas_Daw_USM : 37|3@1+ (1,0) [0|7] "" CLU + +BO_ 1338 TMU_GW_E_01: 8 CLU + SG_ CF_Gway_TeleReqDrLock : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Gway_TeleReqDrUnlock : 2|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Gway_TeleReqHazard : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Gway_TeleReqHorn : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Gway_TeleReqEngineOperate : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + +BO_ 1078 PAS11: 4 BCM + SG_ CF_Gway_PASDisplayFLH : 0|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM + SG_ CF_Gway_PASDisplayFRH : 3|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM + SG_ CF_Gway_PASRsound : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_PASDisplayFCTR : 8|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,AVM + SG_ CF_Gway_PASDisplayRCTR : 11|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM + SG_ CF_Gway_PASFsound : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_PASDisplayRLH : 16|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM + SG_ CF_Gway_PASDisplayRRH : 19|3@1+ (1.0,0.0) [0.0|7.0] "" AVM,CLU,PGS,AVM + SG_ CF_Gway_PASCheckSound : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_PASSystemOn : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,Dummy + SG_ CF_Gway_PASOption : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_PASDistance : 28|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + +BO_ 48 EMS18: 6 EMS + SG_ CF_Ems_DC1NumPerMSV : 0|8@1+ (1.0,0.0) [0.0|255.0] "" DI_BOX + SG_ CF_Ems_DC2NumPerMSV : 8|16@1+ (1.0,0.0) [0.0|65535.0] "" DI_BOX + SG_ CR_Ems_DutyCyc1MSV : 24|8@1+ (0.1953,0.0) [0.0|49.8] "%" DI_BOX + SG_ CR_Ems_DutyCyc2MSV : 32|8@1+ (0.13725,0.0) [0.0|35.0] "%" DI_BOX + SG_ CR_Ems_DutyCyc3MSV : 40|8@1+ (0.392,0.0) [0.0|100.0] "%" DI_BOX + +BO_ 1322 CLU15: 8 CLU + SG_ CF_Clu_VehicleSpeed : 0|8@1+ (1.0,0.0) [0.0|255.0] "" BCM + SG_ CF_Clu_Gear : 9|4@1+ (1,0) [0|15] "" BCM + SG_ CF_Clu_HudInfoSet : 13|7@1+ (1.0,0.0) [0.0|127.0] "" HUD + SG_ CF_Clu_HudFontColorSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudBrightUpSW : 22|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudBrightDnSW : 24|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudHeightUpSW : 26|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudHeightDnSW : 28|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_HudSet : 30|1@1+ (1.0,0.0) [0.0|1.0] "" HUD + SG_ CF_Clu_HudFontSizeSet : 31|2@1+ (1.0,0.0) [0.0|3.0] "" HUD + SG_ CF_Clu_LanguageInfo : 33|5@1+ (1.0,0.0) [0.0|31.0] "" BCM,PGS + SG_ CF_Clu_ClusterSound : 38|1@1- (1.0,0.0) [0.0|0.0] "" BCM,CGW,FATC + SG_ CF_Clu_VehicleSpeed2 : 48|8@1+ (1,0) [0|255] "" XXX + +BO_ 1066 _4WD13: 6 _4WD + SG_ _4WD_CURRENT : 0|8@1+ (0.390625,0.0) [-50.0|50.0] "A" TCU + SG_ _4WD_POSITION : 8|16@1+ (0.015625,0.0) [-180.0|180.0] "Deg" TCU + SG_ _4WD_CLU_THERM_STR : 24|8@1+ (1.0,0.0) [0.0|100.0] "%" TCU + SG_ _4WD_STATUS : 32|8@1+ (1.0,0.0) [0.0|15.0] "" ESC,TCU + +BO_ 1065 _4WD12: 8 _4WD + SG_ Ster_Pos : 0|16@1+ (1.0,-600.0) [-600.0|600.0] "Deg" ESC + SG_ FRSS : 16|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC + SG_ FLSS : 24|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC + SG_ RRSS : 32|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC + SG_ RLSS : 40|8@1+ (1.0,0.0) [0.0|254.0] "km/h" ESC + SG_ CLU_PRES : 48|16@1+ (0.0625,-50.0) [-50.0|50.0] "Bar" ESC + +BO_ 809 EMS12: 8 EMS + SG_ CONF_TCU m1 : 0|6@1+ (1.0,0.0) [0.0|63.0] "" _4WD,ACU,BCM,CLU,DATC,EPB,ESC,IBOX,LCA,SMK + SG_ CAN_VERS m0 : 0|6@1+ (1.0,0.0) [0.0|7.7] "" _4WD,ABS,ESC,IBOX + SG_ TQ_STND m3 : 0|6@1+ (10.0,0.0) [0.0|630.0] "Nm" _4WD,DATC,ECS,EPB,ESC,FATC,IBOX + SG_ OBD_FRF_ACK m2 : 0|6@1+ (1.0,0.0) [0.0|63.0] "" _4WD,ESC,IBOX + SG_ MUL_CODE M : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ABS,ACU,BCM,CLU,DATC,ECS,EPB,ESC,IBOX,LCA,SMK,TCU + SG_ TEMP_ENG : 8|8@1+ (0.75,-48.0) [-48.0|143.25] "deg" _4WD,BCM,CLU,DATC,EPB,ESC,IBOX,SMK,TCU + SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0.0) [0.0|1.99155] "" IBOX,TCU + SG_ VB_OFF_ACT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ ACK_ES : 25|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,IBOX + SG_ CONF_MIL_FMY : 26|3@1+ (1.0,0.0) [0.0|7.0] "" ESC,IBOX,TCU + SG_ OD_OFF_REQ : 29|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,TCU + SG_ ACC_ACT : 30|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ABS,CLU,ESC,IAP,IBOX,SCC,TCU + SG_ CLU_ACK : 31|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EPB,ESC,IBOX + SG_ BRAKE_ACT : 32|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ABS,ACU,AFLS,CLU,DATC,ECS,EPB,ESC,IBOX,LDWS_LKAS,TCU + SG_ ENG_CHR : 34|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,ABS,ACU,CLU,DATC,EPB,ESC,FATC,IBOX,SCC,SMK,TCU + SG_ GP_CTL : 38|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX + SG_ TPS : 40|8@1+ (0.4694836,-15.0234742) [-15.0234742|104.6948357] "%" _4WD,ABS,ACU,CLU,DATC,ECS,EPB,ESC,IBOX,TCU + SG_ PV_AV_CAN : 48|8@1+ (0.3906,0.0) [0.0|99.603] "%" _4WD,AAF,ABS,ACU,AFLS,CLU,DATC,EPB,ESC,IAP,IBOX,LDWS_LKAS,SCC,TCU + SG_ ENG_VOL : 56|8@1+ (0.1,0.0) [0.0|25.5] "liter" _4WD,ABS,ACU,BCM,CLU,DATC,EPB,ESC,IBOX,LDWS_LKAS,SCC,SMK + +BO_ 1064 _4WD11: 8 _4WD + SG_ _4WD_TYPE : 0|2@1+ (1.0,0.0) [0.0|3.0] "" ACU,ESC,TPMS + SG_ _4WD_SUPPORT : 2|2@1+ (1.0,0.0) [0.0|3.0] "" ABS,ESC,TPMS + SG_ _4WD_ERR : 8|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,ESC + SG_ CLU_DUTY : 16|8@1+ (1.0,0.0) [0.0|64.0] "%" ABS,ESC + SG_ R_TIRE : 24|8@1+ (1.0,200.0) [200.0|455.0] "mm" ABS,ESC,TPMS + SG_ _4WD_SW : 32|8@1+ (1.0,0.0) [0.0|9.9] "" ESC + SG_ _2H_ACT : 40|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC + SG_ _4H_ACT : 41|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,CLU,ESC,TPMS + SG_ LOW_ACT : 42|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,TCU,TPMS + SG_ AUTO_ACT : 43|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,ESC,TPMS + SG_ LOCK_ACT : 44|1@1+ (1.0,0.0) [0.0|1.0] "" ABS,CLU,ESC,TPMS + SG_ _4WD_TQC_CUR : 48|16@1+ (1.0,0.0) [0.0|65535.0] "Nm" ABS,ESC + +BO_ 1319 HU_GW_E_01: 8 CLU + SG_ C_ADrLNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ C_ADrUNValueSet : 4|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ C_TwUnNValueSet : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_ABuzzerNValueSet : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_ArmWKeyNValueSet : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_PSMNValueSet : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_SCMNValueSet : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_HLEscortNValueSet : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_WELNValueSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_TriTurnLNValueSet : 22|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_SNVWarnNValueSet : 24|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_LkasWarnNValueSet : 26|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + +BO_ 1318 HU_GW_E_00: 8 CLU + SG_ C_ADrLURValueReq : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_TwUnRValueReq : 2|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_AlarmRValueReq : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_IMSRValueReq : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_HLEscortRValueReq : 8|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_WELRValueReq : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_TriTurnLRValueReq : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_SNVWarnRValueReq : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ C_LkasWarnRValueReq : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + +BO_ 1317 GW_HU_E_01: 8 BCM + SG_ C_ADrLRValue : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ C_ADrURValue : 4|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ C_TwUnRValue : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_ABuzzerRValue : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_ArmWKeyRValue : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_PSMRValue : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SCMRValue : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_HLEscortRValue : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_WELRValue : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_TriTurnLRValue : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1316 GW_HU_E_00: 8 BCM + SG_ C_ADrLUNValueConf : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_TwUnNValueConf : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_AlarmNValueConf : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_PSMNValueConf : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SCMNValueConf : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_HLEscortNValueConf : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_WELNValueConf : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_TriTurnLNValueConf : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1315 GW_SWRC_PE: 8 BCM + SG_ C_ModeSW : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_MuteSW : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SeekDnSW : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SeekUpSW : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_BTPhoneCallSW : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_BTPhoneHangUpSW : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_DISCDownSW : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_DISCUpSW : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SdsSW : 18|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_MTSSW : 20|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_VolDnSW : 22|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_VolUpSW : 24|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1314 GW_IPM_PE_1: 8 BCM + SG_ C_AV_Tail : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_ParkingBrakeSW : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_RKECMD : 4|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ C_BAState : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_IGNSW : 12|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ C_CountryCfg : 16|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ C_TailLampActivity : 26|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ RearSW_RSELockOnOff : 28|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SMKTeleCrankingState : 32|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_SMKTeleCrankingFailRes : 34|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1057 SCC12: 8 SCC + SG_ CF_VSM_Prefill : 0|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_DecCmdAct : 1|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_HBACmd : 2|2@1+ (1,0) [0|3] "" ESC + SG_ CF_VSM_Warn : 4|2@1+ (1,0) [0|3] "" CLU,ESC,IAP + SG_ CF_VSM_Stat : 6|2@1+ (1,0) [0|3] "" CLU,ESC,PSB + SG_ CF_VSM_BeltCmd : 8|3@1+ (1,0) [0|7] "" ESC,PSB + SG_ ACCFailInfo : 11|2@1+ (1,0) [0|3] "" CLU,CUBIS,ESC,IBOX + SG_ ACCMode : 13|2@1+ (1,0) [0|3] "" CLU,ESC,IBOX,TCU + SG_ StopReq : 15|1@1+ (1,0) [0|1] "" EPB,ESC + SG_ CR_VSM_DecCmd : 16|8@1+ (0.01,0) [0|2.55] "g" ESC + SG_ TakeOverReq : 35|1@1+ (1,0) [0|1] "" CLU,ESC,TCU + SG_ PreFill : 36|1@1+ (1,0) [0|1] "" ESC,TCU + SG_ CF_VSM_ConfMode : 48|2@1+ (1,0) [0|3] "" CLU,ESC + SG_ AEB_Failinfo : 50|2@1+ (1,0) [0|3] "" CLU,ESC + SG_ AEB_Status : 52|2@1+ (1,0) [0|3] "" CLU,ESC + SG_ AEB_CmdAct : 54|1@1+ (1,0) [0|1] "" ESC + SG_ AEB_StopReq : 55|1@1+ (1,0) [0|1] "" CLU,ESC + SG_ CR_VSM_Alive : 56|4@1+ (1,0) [0|15] "" ESC,PSB + SG_ CR_VSM_ChkSum : 60|4@1+ (1,0) [0|15] "" ESC,PSB + SG_ aReqValue : 37|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ aReqRaw : 24|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + +BO_ 1313 GW_DDM_PE: 8 BCM + SG_ C_DRVDoorStatus : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_ASTDoorStatus : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_RLDoorStatus : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_RRDoorStatus : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_TrunkStatus : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ C_OSMirrorStatus : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + +BO_ 1056 SCC11: 8 SCC + SG_ MainMode_ACC : 0|1@1+ (1,0) [0|1] "" CLU,EMS,ESC + SG_ SCCInfoDisplay : 1|3@1+ (1,0) [0|7] "" CLU,ESC + SG_ AliveCounterACC : 4|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU + SG_ VSetDis : 8|8@1+ (1,0) [0|255] "km/h or MPH" CLU,ESC,TCU + SG_ ObjValid : 16|1@1+ (1,0) [0|1] "" CLU,ESC,TCU + SG_ DriverAlertDisplay : 17|2@1+ (1,0) [0|3] "" CLU,ESC + SG_ TauGapSet : 19|3@1+ (1,0) [0|7] "" CLU,ESC,TCU + SG_ Navi_SCC_Curve_Status : 56|2@1+ (1,0) [0|3] "" CLU + SG_ Navi_SCC_Curve_Act : 58|2@1+ (1,0) [0|3] "" CLU + SG_ Navi_SCC_Camera_Act : 60|2@1+ (1,0) [0|3] "" CLU + SG_ Navi_SCC_Camera_Status : 62|2@1+ (1,0) [0|3] "" CLU + SG_ ACC_ObjStatus : 22|2@1+ (1,0) [0|3] "" ABS,ESC + SG_ ACC_ObjLatPos : 24|9@1+ (0.1,-20) [-20|31.1] "m" ABS,ESC + SG_ ACC_ObjRelSpd : 44|12@1+ (0.1,-170) [-170|239.5] "m/s" ABS,ESC + SG_ ACC_ObjDist : 33|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC + +BO_ 1312 CGW3: 8 BCM + SG_ CR_Photosensor_LH : 0|8@1+ (78.125,0.0) [0.0|20000.0] "" DATC,DATC + SG_ CR_Photosensor_RH : 10|8@1+ (78.125,0.0) [0.0|20000.0] "" DATC,DATC + SG_ CF_Hoodsw_memory : 22|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,EMS + SG_ C_MirOutTempSns : 24|8@1+ (0.5,-40.5) [-40.0|60.0] "deg" AAF,CLU,DATC,EMS,SPAS,AAF,DATC,EMS,SPAS + +BO_ 544 ESP12: 8 ESC + SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" _4WD,ECS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,TCU + SG_ LAT_ACCEL_STAT : 11|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,IBOX,LDWS_LKAS,MDPS,PSB,SCC,TCU + SG_ LAT_ACCEL_DIAG : 12|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,IBOX,LDWS_LKAS,MDPS,PSB,SCC,TCU + SG_ LONG_ACCEL : 13|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" _4WD,ECS,EMS,EPB,IBOX,LCA,LDWS_LKAS,PSB,SCC,SPAS,TCU + SG_ LONG_ACCEL_STAT : 24|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU + SG_ LONG_ACCEL_DIAG : 25|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,SPAS,TCU + SG_ CYL_PRES : 26|12@1+ (0.1,0.0) [0.0|409.5] "Bar" _4WD,ECS,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,TCU + SG_ CYL_PRES_STAT : 38|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EMS,EPB,IBOX,LDWS_LKAS,PSB,SCC,TCU + SG_ CYL_PRESS_DIAG : 39|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EMS,EPB,IBOX,PSB,SCC,TCU + SG_ YAW_RATE : 40|13@1+ (0.01,-40.95) [-40.95|40.96] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU + SG_ YAW_RATE_STAT : 53|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU + SG_ YAW_RATE_DIAG : 54|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,AFLS,IBOX,LCA,LDWS_LKAS,MDPS,PSB,SCC,SPAS,TCU + SG_ ESP12_Checksum : 56|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + SG_ ESP12_AliveCounter : 60|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,LPI,TCU,TMU + +BO_ 1307 CLU16: 8 CLU + SG_ CF_Clu_TirePressUnitNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" TPMS + SG_ CF_Clu_SlifNValueSet : 3|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS + SG_ CF_Clu_RearWiperNValueSet : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + +BO_ 790 EMS11: 8 EMS + SG_ SWI_IGK : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ABS,ACU,AHLS,CUBIS,DI_BOX,ECS,EPB,ESC,IBOX,LDWS_LKAS,MDPS,REA,SAS,SCC,TCU + SG_ F_N_ENG : 1|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,AFLS,CLU,CUBIS,DATC,ECS,EPB,ESC,IBOX,MDPS,SCC,TCU + SG_ ACK_TCS : 2|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,IBOX + SG_ PUC_STAT : 3|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,DATC,IBOX,TCU + SG_ TQ_COR_STAT : 4|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ESC,IBOX,TCU + SG_ RLY_AC : 6|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,IBOX,TCU + SG_ F_SUB_TQI : 7|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ECS,EPB,ESC,IBOX,TCU + SG_ TQI_ACOR : 8|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,EPB,ESC,IBOX,TCU + SG_ N : 16|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" _4WD,ACU,AFLS,CLU,CUBIS,DATC,ECS,EPB,ESC,FPCM,IBOX,MDPS,SCC,TCU + SG_ TQI : 32|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,ECS,EPB,ESC,IBOX,TCU + SG_ TQFR : 40|8@1+ (0.390625,0.0) [0.0|99.6094] "%" _4WD,EPB,ESC,IBOX,TCU + SG_ VS : 48|8@1+ (1.0,0.0) [0.0|254.0] "km/h" _4WD,AAF,ACU,AHLS,BCM,CLU,DATC,ECS,EPB,IBOX,LCA,LDWS_LKAS,LVR,MDPS,ODS,SCC,SMK,SPAS,TCU,TPMS + SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0.0) [0.0|2.0] "" _4WD,IBOX,TCU + +BO_ 1301 CLU14: 8 CLU + SG_ CF_Clu_ADrUNValueSet : 0|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_ADrLNValueSet : 3|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_EscortHLNValueSet : 6|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_DoorLSNValueSet : 8|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_PSMNValueSet : 11|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_TTUnlockNValueSet : 14|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_PTGMNValueSet : 16|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_SCMNValueSet : 18|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_WlightNValueSet : 20|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_TempUnitNValueSet : 22|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,DATC + SG_ CF_Clu_MoodLpNValueSet : 24|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_TrfChgSet : 27|2@1+ (1.0,0.0) [0.0|3.0] "" AFLS + SG_ CF_Clu_OTTurnNValueSet : 29|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_LcaNValueSet : 32|2@1+ (1.0,0.0) [0.0|3.0] "" LCA + SG_ CF_Clu_RctaNValueSet : 34|2@1+ (1.0,0.0) [0.0|3.0] "" LCA + SG_ CF_Clu_RcwNValueSet : 36|2@1+ (1.0,0.0) [0.0|3.0] "" LCA + SG_ CF_Clu_EscOffNValueSet : 38|3@1+ (1.0,0.0) [0.0|7.0] "" ESC + SG_ CF_Clu_SccNaviCrvNValueSet : 41|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ CF_Clu_SccNaviCamNValueSet : 43|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ CF_Clu_SccAebNValueSet : 45|2@1+ (1.0,0.0) [0.0|3.0] "" SCC + SG_ CF_Clu_LkasModeNValueSet : 47|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS + SG_ CF_Clu_FcwNValueSet : 51|2@1+ (1.0,0.0) [0.0|3.0] "" LDWS_LKAS + SG_ CF_Clu_PasSpkrLvNValueSet : 53|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + SG_ CF_Clu_SccDrvModeNValueSet : 56|3@1+ (1.0,0.0) [0.0|7.0] "" SCC + SG_ CF_Clu_HAnBNValueSet : 59|2@1+ (1.0,0.0) [0.0|3.0] "" BCM + SG_ CF_Clu_HfreeTrunkTgNValueSet : 61|3@1+ (1.0,0.0) [0.0|7.0] "" BCM + +BO_ 275 TCU13: 8 TCU + SG_ N_TGT_LUP : 0|8@1+ (10.0,500.0) [500.0|3040.0] "rpm" EMS,IBOX + SG_ SLOPE_TCU : 8|6@1+ (0.5,-16.0) [-16.0|15.5] "%" CLU,CUBIS,EMS,IBOX + SG_ CF_Tcu_InhCda : 14|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_IsgInhib : 15|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_BkeOnReq : 16|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Tcu_NCStat : 18|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Tcu_TarGr : 20|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,CLU,DATC,EMS,EPB,ESC,IBOX,SCC + SG_ CF_Tcu_ShfPatt : 24|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,CUBIS,EMS,IBOX + SG_ CF_Tcu_InhVis : 28|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_PRelReq : 29|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX,LVR + SG_ CF_Tcu_ITPhase : 30|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_ActEcoRdy : 31|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_TqGrdLim : 32|8@1+ (10.0,0.0) [0.0|2540.0] "Nm/s" EMS,IBOX + SG_ CR_Tcu_IsgTgtRPM : 40|8@1+ (20.0,0.0) [0.0|3500.0] "rpm" EMS,IBOX + SG_ CF_Tcu_SptRdy : 48|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,IBOX + SG_ CF_Tcu_SbwPInfo : 56|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ CF_Tcu_Alive3 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Tcu_ChkSum3 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX + +BO_ 274 TCU12: 8 TCU + SG_ ETL_TCU : 0|8@1+ (2.0,0.0) [0.0|508.0] "Nm" EMS,IBOX + SG_ CUR_GR : 8|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,EMS,ESC,IBOX,SCC,TPMS + SG_ CF_Tcu_Alive : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX,SCC + SG_ CF_Tcu_ChkSum : 14|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX,SCC + SG_ VS_TCU : 16|8@1+ (1.0,0.0) [0.0|254.0] "km/h" BCM,CLU,DATC,EMS,IBOX,LCA,LVR,PGS,SMK,SNV + SG_ FUEL_CUT_TCU : 28|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ INH_FUEL_CUT : 29|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ IDLE_UP_TCU : 30|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ N_INC_TCU : 31|1@1+ (1.0,0.0) [0.0|1.0] "" EMS,IBOX + SG_ SPK_RTD_TCU : 32|8@1+ (0.375,-23.625) [-15.0|15.0] "" EMS,IBOX + SG_ N_TC_RAW : 40|16@1+ (0.25,0.0) [0.0|16383.5] "rpm" EMS,IBOX + SG_ VS_TCU_DECIMAL : 56|8@1+ (0.0078125,0.0) [0.0|0.9921875] "km/h" CLU,EMS,IBOX,LCA + +BO_ 273 TCU11: 8 TCU + SG_ TQI_TCU_INC : 0|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,ESC,IBOX + SG_ G_SEL_DISP : 8|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,AFLS,AVM,BCM,CGW,CLU,CUBIS,ECS,EMS,EPB,ESC,IAP,IBOX,LCA,LDWS_LKAS,LVR,MDPS,PGS,SCC,SMK,SNV,SPAS,TPMS + SG_ F_TCU : 12|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,ESC,IBOX + SG_ TCU_TYPE : 14|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,EMS,ESC,IBOX + SG_ TCU_OBD : 16|3@1+ (1.0,0.0) [0.0|7.0] "" EMS,ESC,IBOX + SG_ SWI_GS : 19|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,EMS,EPB,ESC,IBOX,SCC + SG_ GEAR_TYPE : 20|4@1+ (1.0,0.0) [0.0|15.0] "" _4WD,CLU,EMS,ESC,IBOX,SCC + SG_ TQI_TCU : 24|8@1+ (0.390625,0.0) [0.0|99.609375] "%" EMS,ESC,IBOX + SG_ TEMP_AT : 32|8@1+ (1.0,-40.0) [-40.0|214.0] "deg" AAF,CLU,CUBIS,EMS,ESC,IBOX + SG_ N_TC : 40|16@1+ (0.25,0.0) [0.0|16383.5] "rpm" _4WD,EMS,EPB,ESC,IBOX + SG_ SWI_CC : 56|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,CLU,EMS,ESC,IBOX + SG_ CF_Tcu_Alive1 : 58|2@1+ (1.0,0.0) [0.0|3.0] "" EMS,IBOX + SG_ CF_Tcu_ChkSum1 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,IBOX + +BO_ 16 ACU13: 8 ACU + SG_ CF_Acu_CshAct : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CUBIS,IBOX,ODS + +BO_ 1007 CRUISE_BUTTON_ALT: 8 XXX + SG_ SET_ME_1 : 52|1@0+ (1,0) [0|1] "" XXX + SG_ CruiseSwMain : 58|1@0+ (1,0) [0|1] "" XXX + SG_ CruiseSwState : 60|3@1+ (1,0) [0|7] "" XXX + +BO_ 1046 CRUISE_BUTTON_LFA: 8 XXX + SG_ NEW_SIGNAL_2 : 49|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 54|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 57|1@0+ (1,0) [0|1] "" XXX + SG_ CruiseSwLfa : 58|1@0+ (1,0) [0|1] "" XXX + +BO_ 1040 CGW_USM1: 8 BCM + SG_ CF_Gway_ATTurnRValue : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_PTGMRValue : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_EscortHLRValue : 4|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_TTUnlockRValue : 6|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_ADrLRValue : 8|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_ADrURValue : 11|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_SCMRValue : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_WlightRValue : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_PSMRValue : 18|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_OTTurnRValue : 21|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_DrLockSoundRValue : 24|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_HAnBRValue : 27|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_MoodLpRValue : 30|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_HfreeTrunkRValue : 32|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_AutoLightRValue : 35|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Gway_RearWiperRValue : 38|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_Gway_PasSpkrLvRValue : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + +BO_ 1292 CLU13: 8 CLU + SG_ CF_Clu_LowfuelWarn : 0|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,FPCM,IBOX + SG_ CF_Clu_RefDetMod : 2|1@1+ (1.0,0.0) [0.0|1.0] "" IBOX + SG_ CF_Clu_AvgFCU : 3|2@1+ (1.0,0.0) [0.0|3.0] "" IBOX + SG_ CF_Clu_AvsmCur : 5|1@1+ (1.0,0.0) [0.0|1.0] "" ESC,SCC + SG_ CF_Clu_AvgFCI : 6|10@1+ (0.1,0.0) [0.0|102.2] "" IBOX + SG_ CF_Clu_DrivingModeSwi : 16|2@1+ (1.0,0.0) [0.0|3.0] "" DATC,ECS,EMS,ESC,IAP,MDPS,TCU + SG_ CF_Clu_FuelDispLvl : 18|5@1+ (1.0,0.0) [0.0|31.0] "" CGW,IBOX + SG_ CF_Clu_FlexSteerSW : 23|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Clu_DTE : 24|10@1+ (1.0,0.0) [0.0|1023.0] "" DATC + SG_ CF_Clu_TripUnit : 34|2@1+ (1.0,0.0) [0.0|3.0] "" DATC + SG_ CF_Clu_SWL_Stat : 36|3@1+ (1.0,0.0) [0.0|7.0] "" ACU,EMS + SG_ CF_Clu_ActiveEcoSW : 39|1@1+ (1.0,0.0) [0.0|1.0] "" DATC,EMS,TCU + SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1.0,0.0) [0.0|7.0] "" CUBIS,EMS,IAP,IBOX + SG_ CF_Clu_IsaMainSW : 43|1@1+ (1.0,0.0) [0.0|1.0] "" EMS + SG_ CF_Clu_LdwsLkasSW : 56|1@1+ (1.0,0.0) [0.0|1.0] "" LDWS_LKAS + SG_ CF_Clu_AltLStatus : 59|1@1+ (1.0,0.0) [0.0|1.0] "" BCM,DATC,EMS + SG_ CF_Clu_AliveCnt2 : 60|4@1+ (1.0,0.0) [0.0|15.0] "" EMS,LDWS_LKAS + +BO_ 1290 SCC13: 8 SCC + SG_ SCCDrvModeRValue : 0|3@1+ (1,0) [0|7] "" CLU + SG_ SCC_Equip : 3|1@1+ (1,0) [0|1] "" ESC + SG_ AebDrvSetStatus : 4|3@1+ (1,0) [0|7] "" CLU,ESC + SG_ Lead_Veh_Dep_Alert_USM : 13|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 1287 TCS15: 4 ESC + SG_ ABS_W_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU,CUBIS,IBOX + SG_ TCS_OFF_LAMP : 1|2@1+ (1.0,0.0) [0.0|1.0] "" _4WD,ACU,CLU + SG_ TCS_LAMP : 3|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,ACU,CLU,CUBIS,IBOX,SCC + SG_ DBC_W_LAMP : 5|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU + SG_ DBC_F_LAMP : 6|2@1+ (1.0,0.0) [0.0|3.0] "" _4WD,CLU + SG_ ESC_Off_Step : 8|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ AVH_CLU : 16|8@1+ (1.0,0.0) [0.0|255.0] "" CLU,EPB + SG_ AVH_I_LAMP : 24|2@1+ (1.0,0.0) [0.0|3.0] "" EPB + SG_ EBD_W_LAMP : 26|1@1+ (1.0,0.0) [0.0|1.0] "" _4WD,CLU + SG_ AVH_ALARM : 27|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ AVH_LAMP : 29|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EPB,SPAS + +BO_ 1282 TCU14: 4 TCU + SG_ CF_TCU_WarnMsg : 0|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_TCU_WarnImg : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_TCU_WarnSnd : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ CF_Tcu_GSel_BlinkReq : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,LVR + SG_ CF_Tcu_StRelStat : 12|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,EMS,ESC + SG_ CF_Tcu_DriWarn1 : 13|3@1+ (1.0,0.0) [0.0|7.0] "" CLU,EMS,ESC + SG_ CF_Tcu_DriWarn2 : 16|2@1+ (1.0,0.0) [0.0|3.0] "" CLU,EMS,ESC + +BO_ 1281 ECS11: 3 ECS + SG_ ECS_W_LAMP : 0|1@1+ (1.0,0.0) [0.0|1.0] "" CLU,CUBIS,IBOX + SG_ SYS_NA : 1|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ ECS_DEF : 2|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ ECS_DIAG : 3|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ L_CHG_NA : 4|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ Leveling_Off : 5|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ LC_overheat : 6|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ Lifting : 8|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ Lowering : 9|1@1+ (1.0,0.0) [0.0|1.0] "" CLU + SG_ Damping_Mode : 10|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ REQ_Damping : 12|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ REQ_Height : 14|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ REQ_level : 16|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + SG_ ACT_Height : 20|4@1+ (1.0,0.0) [0.0|15.0] "" CLU + +BO_ 1024 CLU_CFG11: 2 CLU + SG_ Vehicle_Type : 0|16@1+ (1.0,0.0) [0.0|65536.0] "" _4WD + +BO_ 1280 ACU14: 1 ACU + SG_ CF_SWL_Ind : 0|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_TTL_Ind : 2|2@1+ (1.0,0.0) [0.0|3.0] "" CLU + SG_ CF_SBR_Ind : 4|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU + +BO_ 512 EMS20: 6 EMS + SG_ HYDROGEN_GEAR_SHIFTER : 11|3@1+ (1,0) [0|7] "" XXX + SG_ CF_Ems_PumpTPres : 16|8@1+ (3.137254902,0.0) [0.0|800.0] "kPa" FPCM,IBOX + SG_ Split_Stat : 32|1@1+ (1.0,0.0) [0.0|1.0] "" FPCM + +BO_ 909 FCA11: 8 FCA + SG_ CF_VSM_Prefill : 0|1@1+ (1,0) [0|1] "" ESC + SG_ CF_VSM_HBACmd : 1|2@1+ (1,0) [0|3] "" ESC + SG_ CF_VSM_Warn : 3|2@1+ (1,0) [0|3] "" ACU,CLU,ESC + SG_ CF_VSM_BeltCmd : 5|3@1+ (1,0) [0|7] "" ESC + SG_ CR_VSM_DecCmd : 8|8@1+ (0.01,0) [0|2.55] "g" ESC + SG_ FCA_Status : 18|2@1+ (1,0) [0|3] "" ACU,CLU,ESC + SG_ FCA_CmdAct : 20|1@1+ (1,0) [0|1] "" ESC + SG_ FCA_StopReq : 21|1@1+ (1,0) [0|1] "" CLU,ESC + SG_ FCA_DrvSetStatus : 22|3@1+ (1,0) [0|7] "" CLU,ESC + SG_ CF_VSM_DecCmdAct : 31|1@1+ (1,0) [0|1] "" ESC + SG_ FCA_Failinfo : 32|3@1+ (1,0) [0|7] "" ACU,CLU,ESC + SG_ CR_FCA_Alive : 35|4@1+ (1,0) [0|15] "" ESC + SG_ FCA_RelativeVelocity : 39|9@1+ (0.1,-25.5) [-25.5|25.5] "m/s" iBAU + SG_ FCA_TimetoCollision : 48|8@1+ (10,0) [0|2540] "ms" iBAU + SG_ CR_FCA_ChkSum : 56|8@1+ (1,0) [0|255] "" ESC + SG_ PAINT1_Status : 16|2@1+ (1,0) [0|1] "" XXX + +BO_ 1156 HDA11_MFC: 8 XXX + SG_ Counter : 5|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 1|2@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_3 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 16|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_5 : 18|14@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_6 : 33|2@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 34|14@1+ (1,0) [0|16383] "" XXX + SG_ NEW_SIGNAL_8 : 49|2@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_9 : 50|14@1- (1,-4095) [0|16383] "" XXX + +BO_ 1155 FCA12: 8 FCA + SG_ FCA_USM : 0|3@1+ (1,0) [0|7] "" CGW,CLU,ESC + SG_ FCA_DrvSetState : 3|3@1+ (1,0) [0|7] "" CGW + +BO_ 1186 FRT_RADAR11: 2 FCA + SG_ CF_FCA_Equip_Front_Radar : 0|3@1+ (1,0) [0|7] "" LDWS_LKAS,LDW_LKA,ESC + +BO_ 905 SCC14: 8 SCC + SG_ ComfortBandUpper : 0|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC + SG_ ComfortBandLower : 6|6@1+ (0.02,0) [0|1.26] "m/s^2" ESC + SG_ JerkUpperLimit : 12|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ JerkLowerLimit : 19|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ NEW_SIGNAL_1 : 26|6@1+ (1,0) [0|63] "" XXX + SG_ ACCMode : 32|3@1+ (1,0) [0|7] "" CLU,HUD,LDWS_LKAS,ESC + SG_ ObjDistStat : 42|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ ObjGap : 56|8@1+ (1,0) [0|255] "" CLU,HUD,ESC + +BO_ 1157 LFAHDA_MFC: 8 XXX + SG_ HDA_USM : 0|2@1+ (1,0) [0|3] "" XXX + SG_ HDA_Active : 2|1@1+ (1,0) [0|1] "" XXX + SG_ HDA_Icon_State : 3|2@1+ (1,0) [0|3] "" XXX + SG_ HDA_Chime : 7|1@1+ (1,0) [0|1] "" XXX + SG_ HDA_VSetReq : 8|8@1+ (1,0) [0|255] "km/h" XXX + SG_ LFA_SysWarning : 16|3@1+ (1,0) [0|7] "" XXX + SG_ HDA_Icon_Wheel : 20|1@1+ (1,0) [0|1] "" XXX + SG_ HDA_LdwSysState : 21|2@1+ (1,0) [0|3] "" XXX + SG_ LFA_Icon_State : 24|2@1+ (1,0) [0|3] "" XXX + SG_ LFA_USM : 27|2@1+ (1,0) [0|3] "" XXX + SG_ HDA_SysWarning : 29|2@1+ (1,0) [0|3] "" XXX + +BO_ 913 BCM_PO_11: 8 Vector__XXX + SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|1] "" PT_ESC_ABS + SG_ BCM_Shift_R_MT_SW_Status : 39|2@0+ (1,0) [0|3] "" PT_ESC_ABS + SG_ LFA_Pressed : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 1426 LABEL11: 8 XXX + SG_ CC_React : 34|1@1+ (1,0) [0|1] "" XXX + +BO_ 910 WHL_SPD12_FS: 5 iBAU + SG_ CRC : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ WHL_SPD12_AliveCounter : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ WHL_SPD_FL : 12|14@1+ (0.03125,0) [0|511.96875] "km/h" Vector__XXX + SG_ WHL_SPD_FR : 26|14@1+ (0.03125,0) [0|511.96875] "km/h" Vector__XXX + +BO_ 911 WHL_SPD13_FS: 5 iBAU + SG_ CRC : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ WHL_SPD13_AliveCounter : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ WHL_SPD_RL : 12|14@1+ (0.03125,0) [0|511.96875] "km/h" Vector__XXX + SG_ WHL_SPD_RR : 26|14@1+ (0.03125,0) [0|511.96875] "km/h" Vector__XXX + +BO_ 865 ADAS_PRK_11: 8 ADAS_PRK + SG_ CF_PCA_BrkReq : 24|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ CF_PCA_DclTrgtVal : 28|4@1+ (0.04,0) [0|0] "g" Vector__XXX + SG_ PCA_ALIVE_CNT : 40|4@1+ (1,0) [0|0] "" Vector__XXX + SG_ PCA_CHECK_SUM : 48|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 882 ELECT_GEAR: 8 XXX + SG_ Elect_Gear_Shifter : 16|4@1+ (1,0) [0|7] "" CLU + SG_ Elect_Gear_Shifter_NEXO : 16|16@1+ (1,0) [0|65535] "" CLU + SG_ Elect_Gear_Step : 22|3@0+ (1,0) [0|7] "" XXX + SG_ Elect_Motor_Speed : 0|8@1+ (1,0) [0|255] "" XXX + SG_ SLC_ON : 31|1@0+ (1,0) [0|1] "" CLU + SG_ SLC_SET_SPEED : 32|8@1+ (1,0) [0|255] "" CLU + +BO_ 881 E_EMS11: 8 XXX + SG_ Brake_Pedal_Pos : 0|8@1+ (1,0) [0|127] "" XXX + SG_ IG_Reactive_Stat : 8|3@1+ (1,0) [0|3] "" XXX + SG_ Gear_Change : 12|1@0+ (1,0) [0|31] "" XXX + SG_ Cruise_Limit_Status : 13|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Limit_Target : 23|8@1+ (1,0) [0|15] "" XXX + SG_ Accel_Pedal_Pos : 31|8@1+ (1,0) [0|254] "" XXX + SG_ CR_Vcu_AccPedDep_Pos : 56|8@1+ (1,0) [0|254] "" XXX + SG_ Engine_Run : 14|1@0+ (1,0) [0|1] "" XXX + SG_ N : 18|13@1+ (1,0) [0|15] "" XXX + +BO_ 1355 EV_PC6: 8 CGW + SG_ CF_Vcu_SbwWarnMsg : 16|3@1+ (1,0) [0|7] "" Vector__XXX + +BO_ 1430 EV_PC2: 8 CGW + SG_ CR_Ldc_ActVol_LS_V : 32|8@1+ (0.1,0) [0|0] "V" Vector__XXX + +BO_ 1535 EV_PC10: 8 CGW + SG_ CF_Vcu_EpbRequest : 37|1@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 908 RSPA11: 8 RSPA + SG_ CF_RSPA_State : 0|4@1+ (1,0) [0|15] "" XXX + SG_ CF_RSPA_Act : 4|2@1+ (1,0) [0|3] "" XXX + SG_ CF_RSPA_DecCmd : 6|2@1+ (1,0) [0|3] "" XXX + SG_ CF_RSPA_Trgt_Spd : 8|10@1+ (0.01,0) [0|10.23] "km/h" XXX + SG_ CF_RSPA_StopReq : 18|1@1+ (1,0) [0|2] "" XXX + SG_ CR_RSPA_EPB_Req : 22|2@1+ (1,0) [0|3] "" XXX + SG_ CF_RSPA_ACC_ACT : 50|1@1+ (1,0) [0|2] "" XXX + SG_ CF_RSPA_AliveCounter : 52|4@1+ (1,0) [0|15] "" XXX + SG_ CF_RSPA_CRC : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 914 S_MDPS11: 8 XXX + SG_ CF_Mdps_Stat : 0|4@1+ (1,0) [0|15] "" XXX + SG_ CR_Mdps_DrvTq : 8|12@1+ (1,0) [0|15] "" XXX + SG_ CR_Mdps_StrAng : 24|16@1- (1,0) [0|65535] "" XXX + SG_ CF_Mdps_AliveCnt : 47|8@0+ (1,0) [0|255] "" XXX + SG_ CF_Mdps_Chksum : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 357 S_MDPS12: 8 XXX + SG_ NEW_SIGNAL_1 : 0|12@1+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_2 : 12|12@1+ (1,0) [0|4095] "" XXX + SG_ Counter : 48|4@1+ (1,0) [0|15] "" XXX + SG_ Checksum : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 352 AHB1: 8 iBAU + SG_ CF_Ahb_SLmp : 0|2@1+ (1,0) [0|3] "" CLU + SG_ CF_Ahb_Def : 2|2@1+ (1,0) [0|3] "" CGW + SG_ CF_Ahb_Act : 4|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ CF_Ahb_Diag : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ CF_Ahb_WLmp : 7|1@1+ (1,0) [0|1] "" CLU + SG_ CR_Ahb_StDep_mm : 8|16@1- (0.1,0) [-3276.8|3276.7] "mm" Vector__XXX + SG_ CF_Ahb_SnsFail : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ CF_Ahb_PedalCalStat : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ CF_Ahb_Bzzr : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ CF_Ahb_ChkSum : 56|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 1191 MFC_4a7: 2 XXX + SG_ PAINT1 : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 1162 BCA11: 8 BCW + SG_ CF_BCA_State : 16|3@1+ (1,0) [0|7] "" CLU,iBAU + SG_ CF_BCA_Warning : 19|2@1+ (1,0) [0|3] "" CLU,iBAU + SG_ AliveCounter : 21|4@1+ (1,0) [0|15] "" CLU,iBAU + SG_ RCCA_Brake_Command : 29|1@1+ (1,0) [0|1] "" iBAU + SG_ Check_Sum : 56|8@1+ (1,0) [0|16] "" iBAU + +BO_ 1136 P_STS: 8 CGW + SG_ HCU1_STS : 6|2@1+ (1,0) [0|3] "" BCW,EPB,FCA,MDPS,SCC,iBAU + SG_ HCU5_STS : 8|2@1+ (1,0) [0|3] "" EPB,FCA,MDPS,iBAU + SG_ Counter : 58|4@1+ (1,0) [0|15] "" MDPS + SG_ Checksum : 62|2@1+ (1,0) [0|3] "" MDPS + +BO_ 304 YRS11: 8 ACU + SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [-163.84|163.83] "deg/s" CGW,iBAU + SG_ CR_Yrs_LatAc : 16|16@1+ (0.000127465,-4.17677312) [-4.17677312|4.17651819] "g" iBAU + SG_ CF_Yrs_YrStat : 32|4@1+ (1,0) [0|15] "" iBAU + SG_ CF_Yrs_LatAcStat : 36|4@1+ (1,0) [0|15] "" iBAU + SG_ CF_Yrs_MCUStat : 40|4@1+ (1,0) [0|15] "" iBAU + SG_ CR_Yrs_MsgCnt1 : 48|4@1+ (1,0) [0|15] "" iBAU + SG_ CR_Yrs_Crc1 : 56|8@1+ (1,0) [0|255] "" iBAU + +BO_ 320 YRS12: 8 ACU + SG_ CF_Yrs_LongAcStat : 16|4@1+ (1,0) [0|15] "" iBAU + SG_ CF_IMU_ResetStat : 20|4@1+ (1,0) [0|15] "" iBAU + SG_ YRS_Temp : 24|8@1+ (1,-68) [-68|187] "" iBAU + SG_ YRS_TempStat : 32|4@1+ (1,0) [0|15] "" iBAU + SG_ CF_Yrs_Type : 36|4@1+ (1,0) [0|15] "" iBAU + SG_ CR_Yrs_MsgCnt2 : 48|4@1+ (1,0) [0|15] "" iBAU + SG_ CR_Yrs_Crc2 : 56|8@1+ (1,0) [0|255] "" iBAU + SG_ CR_Yrs_LongAc : 0|16@1+ (0.000127465,-4.17677312) [-4.17677312|4.17651819] "g" CGW,iBAU + +BO_ 1173 YRS13: 8 ACU + SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|281474976710655] "" iBAU + +BO_ 870 EMS_366: 8 EMS + SG_ TQI_1 : 0|8@1+ (0.390625,0) [0|99.6094] "%" MDPS + SG_ N : 8|16@1+ (0.25,0.0) [0.0|16383.75] "rpm" MDPS + SG_ TQI_2 : 24|8@1+ (0.390625,0) [0|99.6094] "%" MDPS + SG_ VS : 40|8@1+ (1,0) [0|255] "km/h" MDPS + SG_ SWI_IGK : 48|1@0+ (1,0) [0|1] "" XXX + +BO_ 854 M_356: 8 XXX + SG_ PAINT1 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ PAINT2 : 34|2@0+ (1,0) [0|1] "" XXX + SG_ PAINT3 : 36|2@0+ (1,0) [0|3] "" XXX + SG_ PAINT4 : 38|1@0+ (1,0) [0|1] "" XXX + +BO_ 1042 ICM_412h: 8 ICM + SG_ T_Outside_input : 0|9@0+ (0.01,0) [0|5] "V" Vector__XXX + SG_ WarningSoundOutput_1Group : 5|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ WarningSoundOutput_2Group : 6|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ WarningSoundOutput_3Group : 7|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ TRIP_A_DT_Display_clock : 22|7@0+ (1,0) [0|99] "clock" Vector__XXX + SG_ TRIP_A_DT_Display_minute : 29|6@0+ (1,0) [0|59] "minute" Vector__XXX + SG_ TRIP_B_DT_Display_clock : 38|7@0+ (1,0) [0|99] "clock" Vector__XXX + SG_ TRIP_B_DT_Display_minute : 45|6@0+ (1,0) [0|59] "minute" Vector__XXX + SG_ PopupMessageOutput_1Level : 48|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ PopupMessageOutput_2Level : 49|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ PopupMessageOutput_3Level : 50|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ PopupMessageOutput_4Level : 51|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ PopupMessageOutput_5Level : 52|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ PopupMessageOutput_6Level : 53|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ PopupMessageOutput_7Level : 54|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ PopupMessageOutput_8Level : 55|1@0+ (1,0) [0|1] "" Vector__XXX + +BO_ 1348 Navi_HU: 8 XXX + SG_ SpeedLim_Nav_Clu : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SpeedLim_Nav_General : 29|1@0+ (1,0) [0|1] "" XXX + SG_ SpeedLim_Nav_Cam : 30|1@0+ (1,0) [0|1] "" XXX + +BO_ 1291 EV_Info: 8 XXX + SG_ OPKR_EV_Charge_Level : 17|7@1+ (1,0) [0|100] "%" XXX +CM_ "BO_ E_EMS11: All (plug-in) hybrids use this gas signal: CR_Vcu_AccPedDep_Pos, and all EVs use the Accel_Pedal_Pos signal. See hyundai/values.py for a specific car list"; +CM_ 145 "Contains signal with accelerator pedal press. Used by fuel cell hydrogen-powered (FCEV) cars such as the 2021 Hyundai Nexo."; +CM_ 512 "Contains signal with gear shifter. Used by fuel cell hydrogen-powered (FCEV) cars such as the 2021 Hyundai Nexo."; +CM_ SG_ 871 CF_Lvr_IsgState "Idle Stop and Go"; +CM_ SG_ 1056 SCCInfoDisplay "Goes to 1 for a second while transitioning from Cruise Control to No Message"; +CM_ SG_ 1348 SpeedLim_Nav_Clu "Speed limit displayed on Nav, Cluster and HUD"; +CM_ SG_ 1348 SpeedLim_Nav_Cam "Speed limit if speed cam exist"; +VAL_ 882 Elect_Gear_Shifter_NEXO 1546 "D" 2314 "N" 2566 "R" 2569 "P"; + +VAL_ 274 CUR_GR 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 7 "D" 8 "D" 14 "R" 0 "P"; +VAL_ 512 HYDROGEN_GEAR_SHIFTER 5 "D" 8 "S" 6 "N" 7 "R" 0 "P"; +VAL_ 871 CF_Lvr_IsgState 0 "enabled" 1 "activated" 2 "unknown" 3 "disabled"; +VAL_ 871 CF_Lvr_Gear 12 "T" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P"; +VAL_ 882 Elect_Gear_Shifter 4 "S" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P" 12 "T"; +VAL_ 905 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; +VAL_ 905 ObjDistStat 0 "no_object" 1 "receding" 2 "approaching"; +VAL_ 909 CF_VSM_Warn 2 "FCW" 3 "AEB"; +VAL_ 916 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; +VAL_ 1056 SCCInfoDisplay 0 "No Message" 2 "Cruise Control" 3 "Lost Lead" 4 "Standstill"; +VAL_ 1057 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault"; +VAL_ 1157 HDA_Icon_State 0 "no_hda" 1 "white_hda" 2 "green_hda"; +VAL_ 1157 LFA_SysWarning 0 "no_message" 1 "switching_to_hda" 2 "switching_to_scc" 3 "lfa_error" 4 "check_hda" 5 "keep_hands_on_wheel_orange" 6 "keep_hands_on_wheel_red"; +VAL_ 1157 LFA_Icon_State 0 "no_wheel" 1 "white_wheel" 2 "green_wheel" 3 "green_wheel_blink"; +VAL_ 1157 HDA_SysWarning 0 "no_message" 1 "driving_convenience_systems_cancelled" 2 "highway_drive_assist_system_cancelled"; +VAL_ 1322 CF_Clu_Gear 1 "P" 2 "R" 4 "N" 8 "D"; diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_mando_corner_radar_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_mando_corner_radar_generated.dbc new file mode 100644 index 000000000..80627f9ae --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_mando_corner_radar_generated.dbc @@ -0,0 +1,374 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "hyundai_kia_mando_corner_radar.dbc starts here"; + +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 256 RADAR_POINTS_METADATA_0x100: 64 RADAR + SG_ SIGNAL_1 : 0|32@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_2 : 32|32@1+ (1,0) [0|65535] "" XXX + SG_ SIGNAL_3 : 64|4@1+ (1,0) [0|15] "" XXX + SG_ SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX + SG_ RADAR_POINT_COUNT : 72|8@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_6 : 80|7@1+ (0.015625,0) [0|3] "" XXX + SG_ SIGNAL_7 : 87|1@1+ (1,0) [0|1] "" XXX + SG_ SIGNAL_8 : 88|3@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_9 : 91|5@1+ (0.0625,0) [0|31] "" XXX + SG_ SIGNAL_10 : 96|8@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_11 : 104|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_12 : 111|2@1+ (1,0) [0|65535] "" XXX + SG_ SIGNAL_13 : 113|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_14 : 120|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_15 : 127|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_16 : 130|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_18 : 134|1@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_19 : 135|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_20 : 138|8@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_21 : 146|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_22 : 148|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_23 : 149|4@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_24 : 153|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_25 : 154|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_26 : 157|2@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_27 : 158|7@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_28 : 165|7@1+ (0.015625,0) [0|31] "" XXX + SG_ SIGNAL_29 : 172|7@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_30 : 179|7@1+ (0.015625,0) [0|1] "" XXX + SG_ SIGNAL_31 : 186|4@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_32 : 190|14@1+ (0.015625,0) [0|15] "" XXX + SG_ SIGNAL_33 : 204|11@1+ (0.03125,0) [0|8191] "" XXX + SG_ SIGNAL_34 : 215|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_35 : 217|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_36 : 224|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_37 : 230|6@1+ (0.2,0) [0|31] "" XXX + SG_ SIGNAL_38 : 236|6@1+ (0.2,0) [0|7] "" XXX + SG_ SIGNAL_39 : 242|8@1+ (1,-90) [0|255] "" XXX + SG_ SIGNAL_40 : 250|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_41 : 256|8@1+ (0.25,0) [0|255] "" XXX + SG_ SIGNAL_42 : 264|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_43 : 267|12@1+ (0.01,0) [0|31] "" XXX + SG_ SIGNAL_44 : 279|32@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_45 : 311|1@1+ (1,0) [0|1] "" XXX + SG_ SIGNAL_46 : 312|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_47 : 314|32@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_48 : 346|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_49 : 352|7@1+ (0.25,0) [0|127] "" XXX + SG_ SIGNAL_50 : 359|6@1+ (0.03125,0) [0|31] "" XXX + SG_ SIGNAL_51 : 365|10@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_52 : 375|10@1+ (0.125,0) [0|63] "" XXX + SG_ SIGNAL_53 : 385|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_54 : 392|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_55 : 399|8@1+ (0.00390625,0) [0|31] "" XXX + SG_ SIGNAL_56 : 407|10@1+ (0.125,0) [0|63] "" XXX + SG_ SIGNAL_57 : 417|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_58 : 418|1@1+ (1,0) [0|3] "" XXX + +BO_ 512 RADAR_POINTS_METADATA_0x200: 64 RADAR + SG_ SIGNAL_1 : 0|32@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_2 : 32|32@1+ (1,0) [0|65535] "" XXX + SG_ SIGNAL_3 : 64|4@1+ (1,0) [0|15] "" XXX + SG_ SIGNAL_4 : 68|4@1+ (1,0) [0|15] "" XXX + SG_ RADAR_POINT_COUNT : 72|8@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_6 : 80|7@1+ (0.015625,0) [0|3] "" XXX + SG_ SIGNAL_7 : 87|1@1+ (1,0) [0|1] "" XXX + SG_ SIGNAL_8 : 88|3@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_9 : 91|5@1+ (0.0625,0) [0|31] "" XXX + SG_ SIGNAL_10 : 96|8@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_11 : 104|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_12 : 111|2@1+ (1,0) [0|65535] "" XXX + SG_ SIGNAL_13 : 113|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_14 : 120|7@1+ (0.015625,0) [0|127] "" XXX + SG_ SIGNAL_15 : 127|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_16 : 130|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_17 : 133|2@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_18 : 134|1@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_19 : 135|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_20 : 138|8@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_21 : 146|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_22 : 148|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_23 : 149|4@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_24 : 153|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_25 : 154|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_26 : 157|2@0+ (1,0) [0|3] "" XXX + SG_ SIGNAL_27 : 158|7@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_28 : 165|7@1+ (0.015625,0) [0|31] "" XXX + SG_ SIGNAL_29 : 172|7@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_30 : 179|7@1+ (0.015625,0) [0|1] "" XXX + SG_ SIGNAL_31 : 186|4@1+ (1,0) [0|7] "" XXX + SG_ SIGNAL_32 : 190|14@1+ (0.015625,0) [0|15] "" XXX + SG_ SIGNAL_33 : 204|11@1+ (0.03125,0) [0|8191] "" XXX + SG_ SIGNAL_34 : 215|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_35 : 217|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_36 : 224|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_37 : 230|6@1+ (0.2,0) [0|31] "" XXX + SG_ SIGNAL_38 : 236|6@1+ (0.2,0) [0|7] "" XXX + SG_ SIGNAL_39 : 242|8@1+ (1,-90) [0|255] "" XXX + SG_ SIGNAL_40 : 250|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_41 : 256|8@1+ (0.25,0) [0|255] "" XXX + SG_ SIGNAL_42 : 264|3@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_43 : 267|12@1+ (0.01,0) [0|31] "" XXX + SG_ SIGNAL_44 : 279|32@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_45 : 311|1@1+ (1,0) [0|1] "" XXX + SG_ SIGNAL_46 : 312|2@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_47 : 314|32@1+ (1,0) [0|255] "" XXX + SG_ SIGNAL_48 : 346|6@1+ (1,0) [0|63] "" XXX + SG_ SIGNAL_49 : 352|7@1+ (0.25,0) [0|127] "" XXX + SG_ SIGNAL_50 : 359|6@1+ (0.03125,0) [0|31] "" XXX + SG_ SIGNAL_51 : 365|10@1+ (0.125,0) [0|3] "" XXX + SG_ SIGNAL_52 : 375|10@1+ (0.125,0) [0|63] "" XXX + SG_ SIGNAL_53 : 385|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_54 : 392|7@1+ (1,0) [0|127] "" XXX + SG_ SIGNAL_55 : 399|8@1+ (0.00390625,0) [0|31] "" XXX + SG_ SIGNAL_56 : 407|10@1+ (0.125,0) [0|63] "" XXX + SG_ SIGNAL_57 : 417|1@1+ (1,0) [0|3] "" XXX + SG_ SIGNAL_58 : 418|1@1+ (1,0) [0|3] "" XXX + +BO_ 257 RADAR_POINTS_0x101: 64 RADAR + SG_ MESSAGE_ID : 0|5@1+ (1,0) [0|31] "" XXX + SG_ LAYOUT_ID : 5|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_DISTANCE : 7|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_1_SIGNAL_2 : 21|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_3 : 23|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_1_REL_VELOCITY : 31|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_1_SIGNAL_5 : 44|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_6 : 46|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_AZIMUTH : 48|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_1_SIGNAL_8 : 60|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_9 : 62|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_1_SIGNAL_10 : 63|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_1_SIGNAL_11 : 70|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_1_SIGNAL_12 : 71|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_1_SIGNAL_13 : 77|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_14 : 79|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_1_SIGNAL_15 : 87|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_1_SIGNAL_16 : 88|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_17 : 90|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_1_SIGNAL_18 : 93|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_1_SIGNAL_19 : 99|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_1_SIGNAL_20 : 107|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_2_DISTANCE : 108|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_2_SIGNAL_2 : 122|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_3 : 124|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_2_REL_VELOCITY : 132|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_2_SIGNAL_5 : 145|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_6 : 147|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_AZIMUTH : 149|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_2_SIGNAL_8 : 161|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_9 : 163|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_2_SIGNAL_10 : 164|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_2_SIGNAL_11 : 171|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_2_SIGNAL_12 : 172|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_2_SIGNAL_13 : 178|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_14 : 180|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_2_SIGNAL_15 : 188|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_2_SIGNAL_16 : 189|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_17 : 191|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_2_SIGNAL_18 : 194|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_2_SIGNAL_19 : 200|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_2_SIGNAL_20 : 208|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_3_DISTANCE : 209|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_3_SIGNAL_2 : 223|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_3 : 225|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_3_REL_VELOCITY : 233|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_3_SIGNAL_5 : 246|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_6 : 248|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_AZIMUTH : 250|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_3_SIGNAL_8 : 262|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_9 : 264|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_3_SIGNAL_10 : 265|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_3_SIGNAL_11 : 272|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_3_SIGNAL_12 : 273|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_3_SIGNAL_13 : 279|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_14 : 281|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_3_SIGNAL_15 : 289|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_3_SIGNAL_16 : 290|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_17 : 292|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_3_SIGNAL_18 : 295|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_3_SIGNAL_19 : 301|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_3_SIGNAL_20 : 309|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_4_DISTANCE : 310|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_4_SIGNAL_2 : 324|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_3 : 326|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_4_REL_VELOCITY : 334|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_4_SIGNAL_5 : 347|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_6 : 349|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_AZIMUTH : 351|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_4_SIGNAL_8 : 363|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_9 : 365|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_4_SIGNAL_10 : 366|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_4_SIGNAL_11 : 373|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_4_SIGNAL_12 : 374|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_4_SIGNAL_13 : 380|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_14 : 382|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_4_SIGNAL_15 : 390|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_4_SIGNAL_16 : 391|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_17 : 393|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_4_SIGNAL_18 : 396|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_4_SIGNAL_19 : 402|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_4_SIGNAL_20 : 410|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_5_DISTANCE : 411|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_5_SIGNAL_2 : 425|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_3 : 427|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_5_REL_VELOCITY : 435|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_5_SIGNAL_5 : 448|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_6 : 450|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_AZIMUTH : 452|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_5_SIGNAL_8 : 464|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_9 : 466|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_5_SIGNAL_10 : 467|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_5_SIGNAL_11 : 474|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_5_SIGNAL_12 : 475|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_5_SIGNAL_13 : 481|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_14 : 483|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_5_SIGNAL_15 : 491|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_5_SIGNAL_16 : 492|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_17 : 494|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_5_SIGNAL_18 : 497|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_5_SIGNAL_19 : 503|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_5_SIGNAL_20 : 511|1@1+ (1,0) [0|1] "" XXX + +BO_ 513 RADAR_POINTS_0x201: 64 RADAR + SG_ MESSAGE_ID : 0|5@1+ (1,0) [0|31] "" XXX + SG_ LAYOUT_ID : 5|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_DISTANCE : 7|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_1_SIGNAL_2 : 21|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_3 : 23|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_1_REL_VELOCITY : 31|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_1_SIGNAL_5 : 44|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_6 : 46|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_AZIMUTH : 48|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_1_SIGNAL_8 : 60|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_9 : 62|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_1_SIGNAL_10 : 63|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_1_SIGNAL_11 : 70|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_1_SIGNAL_12 : 71|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_1_SIGNAL_13 : 77|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_14 : 79|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_1_SIGNAL_15 : 87|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_1_SIGNAL_16 : 88|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_1_SIGNAL_17 : 90|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_1_SIGNAL_18 : 93|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_1_SIGNAL_19 : 99|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_1_SIGNAL_20 : 107|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_2_DISTANCE : 108|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_2_SIGNAL_2 : 122|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_3 : 124|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_2_REL_VELOCITY : 132|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_2_SIGNAL_5 : 145|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_6 : 147|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_AZIMUTH : 149|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_2_SIGNAL_8 : 161|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_9 : 163|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_2_SIGNAL_10 : 164|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_2_SIGNAL_11 : 171|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_2_SIGNAL_12 : 172|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_2_SIGNAL_13 : 178|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_14 : 180|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_2_SIGNAL_15 : 188|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_2_SIGNAL_16 : 189|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_2_SIGNAL_17 : 191|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_2_SIGNAL_18 : 194|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_2_SIGNAL_19 : 200|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_2_SIGNAL_20 : 208|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_3_DISTANCE : 209|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_3_SIGNAL_2 : 223|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_3 : 225|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_3_REL_VELOCITY : 233|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_3_SIGNAL_5 : 246|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_6 : 248|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_AZIMUTH : 250|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_3_SIGNAL_8 : 262|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_9 : 264|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_3_SIGNAL_10 : 265|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_3_SIGNAL_11 : 272|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_3_SIGNAL_12 : 273|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_3_SIGNAL_13 : 279|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_14 : 281|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_3_SIGNAL_15 : 289|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_3_SIGNAL_16 : 290|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_3_SIGNAL_17 : 292|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_3_SIGNAL_18 : 295|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_3_SIGNAL_19 : 301|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_3_SIGNAL_20 : 309|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_4_DISTANCE : 310|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_4_SIGNAL_2 : 324|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_3 : 326|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_4_REL_VELOCITY : 334|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_4_SIGNAL_5 : 347|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_6 : 349|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_AZIMUTH : 351|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_4_SIGNAL_8 : 363|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_9 : 365|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_4_SIGNAL_10 : 366|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_4_SIGNAL_11 : 373|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_4_SIGNAL_12 : 374|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_4_SIGNAL_13 : 380|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_14 : 382|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_4_SIGNAL_15 : 390|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_4_SIGNAL_16 : 391|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_4_SIGNAL_17 : 393|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_4_SIGNAL_18 : 396|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_4_SIGNAL_19 : 402|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_4_SIGNAL_20 : 410|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_5_DISTANCE : 411|14@1+ (0.015625,0) [0|255.984375] "" XXX + SG_ POINT_5_SIGNAL_2 : 425|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_3 : 427|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_5_REL_VELOCITY : 435|13@1+ (0.03125,-66) [-66|189.96875] "" XXX + SG_ POINT_5_SIGNAL_5 : 448|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_6 : 450|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_AZIMUTH : 452|12@1+ (0.001953125,-3.998046875) [-3.998046875|4.0] "" XXX + SG_ POINT_5_SIGNAL_8 : 464|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_9 : 466|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_5_SIGNAL_10 : 467|7@1+ (1,0) [0|127] "" XXX + SG_ POINT_5_SIGNAL_11 : 474|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_5_SIGNAL_12 : 475|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_5_SIGNAL_13 : 481|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_14 : 483|8@1+ (0.001953125,-0.248046875) [-0.248046875|0.25] "" XXX + SG_ POINT_5_SIGNAL_15 : 491|1@1+ (1,0) [0|1] "" XXX + SG_ POINT_5_SIGNAL_16 : 492|2@1+ (1,0) [0|3] "" XXX + SG_ POINT_5_SIGNAL_17 : 494|3@1+ (1,0) [0|7] "" XXX + SG_ POINT_5_SIGNAL_18 : 497|6@1+ (1,0) [0|63] "" XXX + SG_ POINT_5_SIGNAL_19 : 503|8@1+ (1,0) [0|255] "" XXX + SG_ POINT_5_SIGNAL_20 : 511|1@1+ (1,0) [0|1] "" XXX + +BO_ 260 RADAR_POINTS_CHECKSUM_0x104: 3 RADAR + SG_ CRC16 : 0|16@1+ (1,0) [0|65535] "" XXX + +BO_ 516 RADAR_POINTS_CHECKSUM_0x204: 3 RADAR + SG_ CRC16 : 0|16@1+ (1,0) [0|65535] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_mando_front_radar_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_mando_front_radar_generated.dbc new file mode 100644 index 000000000..4abd25331 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_kia_mando_front_radar_generated.dbc @@ -0,0 +1,425 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "hyundai_kia_mando_front_radar.dbc starts here"; + +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 1280 RADAR_TRACK_500: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1281 RADAR_TRACK_501: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1282 RADAR_TRACK_502: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1283 RADAR_TRACK_503: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1284 RADAR_TRACK_504: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1285 RADAR_TRACK_505: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1286 RADAR_TRACK_506: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1287 RADAR_TRACK_507: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1288 RADAR_TRACK_508: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1289 RADAR_TRACK_509: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1290 RADAR_TRACK_50a: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1291 RADAR_TRACK_50b: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1292 RADAR_TRACK_50c: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1293 RADAR_TRACK_50d: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1294 RADAR_TRACK_50e: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1295 RADAR_TRACK_50f: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1296 RADAR_TRACK_510: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1297 RADAR_TRACK_511: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1298 RADAR_TRACK_512: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1299 RADAR_TRACK_513: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1300 RADAR_TRACK_514: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1301 RADAR_TRACK_515: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1302 RADAR_TRACK_516: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1303 RADAR_TRACK_517: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1304 RADAR_TRACK_518: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1305 RADAR_TRACK_519: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1306 RADAR_TRACK_51a: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1307 RADAR_TRACK_51b: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1308 RADAR_TRACK_51c: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1309 RADAR_TRACK_51d: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1310 RADAR_TRACK_51e: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + +BO_ 1311 RADAR_TRACK_51f: 8 RADAR + SG_ UNKNOWN_1 : 7|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 12|10@0- (0.2,0) [-102.4|102.2] "" XXX + SG_ STATE : 15|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 18|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ REL_ACCEL : 33|10@0- (0.02,0) [-10.24|10.22] "" XXX + SG_ ZEROS : 37|4@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 38|1@0+ (1,0) [0|1] "" XXX + SG_ STATE_3 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "" XXX + SG_ STATE_2 : 55|2@0+ (1,0) [0|3] "" XXX + \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_palisade_2023_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_palisade_2023_generated.dbc new file mode 100644 index 000000000..b930b5e03 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_palisade_2023_generated.dbc @@ -0,0 +1,1105 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _hyundai_common.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX CAMERA FRONT_RADAR ADRV APRK + + +BO_ 80 LKAS: 16 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ LKA_MODE : 24|3@1+ (1,0) [0|7] "" XXX + SG_ LKA_ACTIVE : 27|2@1+ (1,0) [0|255] "" XXX + SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX + SG_ LKA_ICON : 38|2@1+ (1,0) [0|255] "" XXX + SG_ FCA_SYSWARN : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_REQUEST : 41|11@1+ (1,-1024) [0|4095] "" XXX + SG_ STEER_REQ : 52|1@1+ (1,0) [0|1] "" XXX + SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX + SG_ VALUE63 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ VALUE64 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 75|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX + SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ANGLE_CMD : 82|14@1- (-0.1,0) [0|511] "" XXX + SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX + SG_ VALUE104 : 104|8@1+ (1,0) [0|255] "" XXX + +BO_ 81 ADRV_0x51: 32 ADRV + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 384 CAM_0x180: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 385 CAM_0x181: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 386 CAM_0x182: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 387 CAM_0x183: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 388 CAM_0x184: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 389 CAM_0x185: 8 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 438 CAM_0x1b6: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 439 CAM_0x1b7: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 440 CAM_0x1b8: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 441 CAM_0x1b9: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 513 RADAR_0x201: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 528 RADAR_0x210: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 529 RADAR_0x211: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 530 RADAR_0x212: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 531 RADAR_0x213: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 532 RADAR_0x214: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 533 RADAR_0x215: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 534 RADAR_0x216: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 535 RADAR_0x217: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 536 RADAR_0x218: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 537 RADAR_0x219: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 538 RADAR_0x21a: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 539 RADAR_0x21b: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 540 RADAR_0x21c: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 541 RADAR_0x21d: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 542 RADAR_0x21e: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 543 RADAR_0x21f: 32 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 576 RADAR_0x240: 16 FRONT_RADAR + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 674 CAM_0x2a2: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 675 CAM_0x2a3: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 676 CAM_0x2a4: 24 XXX + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX + SG_ BYTE8 : 64|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE16 : 128|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE17 : 136|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE18 : 144|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE19 : 152|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE20 : 160|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE21 : 168|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE22 : 176|8@1+ (1,0) [0|255] "" XXX + SG_ BYTE23 : 184|8@1+ (1,0) [0|255] "" XXX + +BO_ 699 CAM_0x2bb: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 700 CAM_0x2bc: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 701 CAM_0x2bd: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +BO_ 702 CAM_0x2be: 32 CAMERA + SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX + SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX + +CM_ BO_ 676 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA."; + +CM_ SG_ 80 HAS_LANE_SAFETY "If 0, hides LKAS 'Lane Safety' menu from vehicle settings"; +CM_ SG_ 676 LEFT_LANE_LINE "Left lane line confidence"; +CM_ SG_ 676 RIGHT_LANE_LINE "Right lane line confidence"; +VAL_ 80 LKA_ICON 0 "hidden" 1 "grey" 2 "green" 3 "flashing green" ; +VAL_ 80 LKA_MODE 1 "warning only" 2 "assist" 6 "off" ; +VAL_ 676 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; +VAL_ 676 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence"; + +CM_ "hyundai_palisade_2023.dbc starts here"; + +BO_ 67 DATC13: 8 XXX + SG_ CF_Datc_AcDisp : 22|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_AqsDisp : 20|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_AutoDefogBlink : 16|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_AutoDisp : 12|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_ChgReqDisp : 8|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_ClmScanDisp : 18|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_DualDisp : 30|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_FrDefLed : 14|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_FrontBlwDisp : 60|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_IntakeDisp : 10|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_IonClean : 6|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_ModDisp : 2|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_OpSts : 25|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_PSModDisp : 56|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_PwrInf : 32|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearAutoDisp : 40|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearBlwDisp : 52|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearChgReqDisp : 46|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearClimateScnDisp : 44|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearManual : 38|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearModDisp : 48|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_RearOffDisp : 42|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Datc_TempDispUnit : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Mtc_MaxAcDisp : 28|2@1+ (1,0) [0|0] "" XXX + +BO_ 127 CGW5: 8 XXX + SG_ C_DRLLampLhOpenSts : 7|1@1+ (1,0) [0|0] "" XXX + SG_ C_DRLLampRhOpenSts : 8|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontEXTTailLhOpenSts : 15|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontEXTTailRhOpenSts : 16|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontFOGLhOpenSts : 11|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontFOGRhOpenSts : 12|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontTSIGLhOpenSts : 19|1@1+ (1,0) [0|0] "" XXX + SG_ C_FrontTSIGRhOpenSts : 20|1@1+ (1,0) [0|0] "" XXX + SG_ C_HLampHighLhOpenSts : 5|1@1+ (1,0) [0|0] "" XXX + SG_ C_HLampHighRhOpenSts : 6|1@1+ (1,0) [0|0] "" XXX + SG_ C_HLampLowLhOpenSts : 3|1@1+ (1,0) [0|0] "" XXX + SG_ C_HLampLowRhOpenSts : 4|1@1+ (1,0) [0|0] "" XXX + SG_ C_HMSLOpenSts : 2|1@1+ (1,0) [0|0] "" XXX + SG_ C_LicensePlateLhOpenSts : 23|1@1+ (1,0) [0|0] "" XXX + SG_ C_LicensePlateRhOpenSts : 24|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearEXTTailLhOpenSts : 13|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearEXTTailRhOpenSts : 14|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearFOGLhOpenSts : 9|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearFOGRhOpenSts : 10|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearTSIGLhOpenSts : 17|1@1+ (1,0) [0|0] "" XXX + SG_ C_RearTSIGRhOpenSts : 18|1@1+ (1,0) [0|0] "" XXX + SG_ C_SBendingLhOpenSts : 21|1@1+ (1,0) [0|0] "" XXX + SG_ C_SBendingRhOpenSts : 22|1@1+ (1,0) [0|0] "" XXX + SG_ C_StopLampLhOpenSts : 0|1@1+ (1,0) [0|0] "" XXX + SG_ C_StopLampRhOpenSts : 1|1@1+ (1,0) [0|0] "" XXX + +BO_ 304 YRS11: 8 XXX + SG_ CF_Yrs_LatAcStat : 36|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Yrs_MCUStat : 40|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Yrs_YrStat : 32|4@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_Crc1 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_LatAc : 16|16@1+ (0.000127465,-4.17677312) [0|0] "" XXX + SG_ CR_Yrs_MsgCnt1 : 48|4@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_Yr : 0|16@1+ (0.005,-163.84) [0|0] "" XXX + +BO_ 320 YRS12: 8 XXX + SG_ CF_IMU_ResetStat : 20|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Yrs_LongAcStat : 16|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Yrs_Type : 36|4@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_Crc2 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ CR_Yrs_LongAc : 0|16@1+ (0.000127465,-4.17677312) [0|0] "" XXX + SG_ CR_Yrs_MsgCnt2 : 48|4@1+ (1,0) [0|0] "" XXX + SG_ YRS_Temp : 24|8@1+ (1,-68) [0|0] "" XXX + SG_ YRS_TempStat : 32|4@1+ (1,0) [0|0] "" XXX + +BO_ 339 TCS11: 8 XXX + SG_ ABS_ACT : 10|1@1+ (1,0) [0|0] "" XXX + SG_ ABS_DEF : 7|1@1+ (1,0) [0|0] "" XXX + SG_ ABS_DIAG : 6|1@1+ (1,0) [0|0] "" XXX + SG_ AliveCounter_TCS1 : 52|4@1+ (1,0) [0|0] "" XXX + SG_ BLA_CTL : 49|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_BrkCtl : 48|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_LimoInfo : 4|2@1+ (1,0) [0|0] "" XXX + SG_ CheckSum_TCS1 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ DBC_CTL : 16|1@1+ (1,0) [0|0] "" XXX + SG_ DBC_DEF : 18|1@1+ (1,0) [0|0] "" XXX + SG_ DBC_PAS : 17|1@1+ (1,0) [0|0] "" XXX + SG_ EBD_DEF : 11|1@1+ (1,0) [0|0] "" XXX + SG_ ESP_CTL : 14|1@1+ (1,0) [0|0] "" XXX + SG_ ESP_DEF : 13|1@1+ (1,0) [0|0] "" XXX + SG_ ESP_PAS : 12|1@1+ (1,0) [0|0] "" XXX + SG_ ESS_STAT : 22|2@1+ (1,0) [0|0] "" XXX + SG_ HAC_CTL : 19|1@1+ (1,0) [0|0] "" XXX + SG_ HAC_DEF : 21|1@1+ (1,0) [0|0] "" XXX + SG_ HAC_PAS : 20|1@1+ (1,0) [0|0] "" XXX + SG_ MSR_C_REQ : 1|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_CTL : 9|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_DEF : 8|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_GSC : 3|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_MFRN : 15|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_PAS : 2|1@1+ (1,0) [0|0] "" XXX + SG_ TCS_REQ : 0|1@1+ (1,0) [0|0] "" XXX + SG_ TQI_MSR : 32|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_SLW_TCS : 40|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_TCS : 24|8@1+ (0.390625,0) [0|0] "" XXX + +BO_ 356 VSM11: 4 XXX + SG_ CF_Esc_Act : 12|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_AliveCnt : 17|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_Chksum : 24|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_CtrMode : 13|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Esc_Def : 16|1@1+ (1,0) [0|0] "" XXX + SG_ CR_Esc_StrTqReq : 0|12@1+ (0.01,-20.48) [0|0] "" XXX + +BO_ 544 ESP12: 8 XXX + SG_ CYL_PRES : 26|12@1+ (0.1,0) [0|0] "" XXX + SG_ CYL_PRESS_DIAG : 39|1@1+ (1,0) [0|0] "" XXX + SG_ CYL_PRES_STAT : 38|1@1+ (1,0) [0|0] "" XXX + SG_ ESP12_AliveCounter : 60|4@1+ (1,0) [0|0] "" XXX + SG_ ESP12_Checksum : 56|4@1+ (1,0) [0|0] "" XXX + SG_ LAT_ACCEL : 0|11@1+ (0.01,-10.23) [0|0] "" XXX + SG_ LAT_ACCEL_DIAG : 12|1@1+ (1,0) [0|0] "" XXX + SG_ LAT_ACCEL_STAT : 11|1@1+ (1,0) [0|0] "" XXX + SG_ LONG_ACCEL : 13|11@1+ (0.01,-10.23) [0|0] "" XXX + SG_ LONG_ACCEL_DIAG : 25|1@1+ (1,0) [0|0] "" XXX + SG_ LONG_ACCEL_STAT : 24|1@1+ (1,0) [0|0] "" XXX + SG_ YAW_RATE : 40|13@1+ (0.01,-40.95) [0|0] "" XXX + SG_ YAW_RATE_DIAG : 54|1@1+ (1,0) [0|0] "" XXX + SG_ YAW_RATE_STAT : 53|1@1+ (1,0) [0|0] "" XXX + +BO_ 593 MDPS12: 8 XXX + SG_ CF_Mdps_Chksum2 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Def : 11|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_FailStat : 15|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_MsgCount2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_SErr : 37|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_ToiActive : 13|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_ToiFlt : 14|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_ToiUnavail : 12|1@1+ (1,0) [0|0] "" XXX + SG_ CR_Mdps_OutTq : 52|12@1+ (0.1,-204.8) [0|0] "" XXX + SG_ CR_Mdps_StrColTq : 0|11@1+ (1,-1024) [0|0] "" XXX + SG_ CR_Mdps_StrTq : 40|12@1+ (0.01,-20.48) [0|0] "" XXX + +BO_ 608 EMS16: 8 XXX + SG_ AliveCounter : 60|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_AclAct : 62|2@1+ (1,0) [0|0] "" XXX + SG_ CRUISE_LAMP_M : 25|1@1+ (1,0) [0|0] "" XXX + SG_ CRUISE_LAMP_S : 26|1@1+ (1,0) [0|0] "" XXX + SG_ Checksum : 56|4@1+ (1,0) [0|0] "" XXX + SG_ ENG_STAT : 28|3@1+ (1,0) [0|0] "" XXX + SG_ GLOW_STAT : 24|1@1+ (1,0) [0|0] "" XXX + SG_ PRE_FUEL_CUT_IN : 27|1@1+ (1,0) [0|0] "" XXX + SG_ SOAK_TIME : 32|8@1+ (1,0) [0|0] "" XXX + SG_ SOAK_TIME_ERROR : 31|1@1+ (1,0) [0|0] "" XXX + SG_ SPK_TIME_CUR : 48|8@1+ (0.375,-35.625) [0|0] "" XXX + SG_ TQI : 8|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_MAX : 40|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_MIN : 0|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_TARGET : 16|8@1+ (0.390625,0) [0|0] "" XXX + +BO_ 625 LPI11: 8 XXX + SG_ BFS_CYL : 48|8@1+ (1,0) [0|0] "" XXX + SG_ ERR_GAS : 16|8@1+ (1,0) [0|0] "" XXX + SG_ FAC_TI_GAS_COR : 24|16@1+ (3.05e-05,0) [0|0] "" XXX + SG_ FTL_AFU : 40|8@1+ (0.392,0) [0|0] "" XXX + SG_ FUP_LPG_MMV : 0|8@1+ (128,0) [0|0] "" XXX + SG_ LPI_OBD : 12|4@1+ (1,0) [0|0] "" XXX + SG_ LV_BFS_IN_PROGRESS : 9|1@1+ (1,0) [0|0] "" XXX + SG_ LV_CONF_INJECTION_DELAY : 57|1@1+ (1,0) [0|0] "" XXX + SG_ LV_FUEL_TYPE_BOX : 8|1@1+ (1,0) [0|0] "" XXX + SG_ LV_FUP_ENA_THD : 11|1@1+ (1,0) [0|0] "" XXX + SG_ LV_GAS_OK : 10|1@1+ (1,0) [0|0] "" XXX + SG_ LV_LPG_SW_DRIVER_REQ : 58|1@1+ (1,0) [0|0] "" XXX + SG_ LV_PRE_CDN_LEAK : 56|1@1+ (1,0) [0|0] "" XXX + +BO_ 640 EMS13: 8 XXX + SG_ AMP : 56|8@1+ (21.22,0) [0|0] "" XXX + SG_ EOS : 16|8@1+ (1,0) [0|0] "" XXX + SG_ ERR_FUEL : 8|8@1+ (1,0) [0|0] "" XXX + SG_ LV_BFS_CFIRM : 1|1@1+ (1,0) [0|0] "" XXX + SG_ LV_CRASH : 2|1@1+ (1,0) [0|0] "" XXX + SG_ LV_ENG_TURN : 5|1@1+ (1,0) [0|0] "" XXX + SG_ LV_FUEL_TYPE_ECU : 0|1@1+ (1,0) [0|0] "" XXX + SG_ LV_GSL_MAP : 4|1@1+ (1,0) [0|0] "" XXX + SG_ LV_VB_OFF_ACT : 3|1@1+ (1,0) [0|0] "" XXX + SG_ MAF : 40|8@1+ (5.447,0) [0|0] "" XXX + SG_ MAP : 56|8@1+ (0.47058,0) [0|0] "" XXX + SG_ N_32 : 32|8@1+ (32,0) [0|0] "" XXX + SG_ TCO : 24|8@1+ (0.75,-48) [0|0] "" XXX + SG_ TIA : 48|8@1+ (0.75,-48) [0|0] "" XXX + +BO_ 688 SAS11: 5 XXX + SG_ CheckSum : 36|4@1+ (1,0) [0|0] "" XXX + SG_ MsgCount : 32|4@1+ (1,0) [0|0] "" XXX + SG_ SAS_Angle : 0|16@1- (0.1,0) [0|0] "" XXX + SG_ SAS_Speed : 16|8@1+ (4,0) [0|0] "" XXX + SG_ SAS_Stat : 24|8@1+ (1,0) [0|0] "" XXX + +BO_ 790 EMS11: 8 XXX + SG_ ACK_TCS : 2|1@1+ (1,0) [0|0] "" XXX + SG_ F_N_ENG : 1|1@1+ (1,0) [0|0] "" XXX + SG_ F_SUB_TQI : 7|1@1+ (1,0) [0|0] "" XXX + SG_ N : 16|16@1+ (0.25,0) [0|0] "" XXX + SG_ PUC_STAT : 3|1@1+ (1,0) [0|0] "" XXX + SG_ RATIO_TQI_BAS_MAX_STND : 56|8@1+ (0.0078,0) [0|0] "" XXX + SG_ RLY_AC : 6|1@1+ (1,0) [0|0] "" XXX + SG_ SWI_IGK : 0|1@1+ (1,0) [0|0] "" XXX + SG_ TQFR : 40|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI : 32|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_ACOR : 8|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQ_COR_STAT : 4|2@1+ (1,0) [0|0] "" XXX + SG_ VS : 48|8@1+ (1,0) [0|0] "" XXX + +BO_ 809 EMS12: 8 XXX + SG_ ACC_ACT : 30|1@1+ (1,0) [0|0] "" XXX + SG_ ACK_ES : 25|1@1+ (1,0) [0|0] "" XXX + SG_ BRAKE_ACT : 32|2@1+ (1,0) [0|0] "" XXX + SG_ CAN_VERS : 0|6@1+ (1,0) [0|0] "" XXX + SG_ CLU_ACK : 31|1@1+ (1,0) [0|0] "" XXX + SG_ CONF_MIL_FMY : 26|3@1+ (1,0) [0|0] "" XXX + SG_ CONF_TCU : 0|6@1+ (1,0) [0|0] "" XXX + SG_ ENG_CHR : 34|4@1+ (1,0) [0|0] "" XXX + SG_ ENG_VOL : 56|8@1+ (0.1,0) [0|0] "" XXX + SG_ GP_CTL : 38|2@1+ (1,0) [0|0] "" XXX + SG_ MAF_FAC_ALTI_MMV : 16|8@1+ (0.00781,0) [0|0] "" XXX + SG_ MUL_CODE : 6|2@1+ (1,0) [0|0] "" XXX + SG_ OBD_FRF_ACK : 0|6@1+ (1,0) [0|0] "" XXX + SG_ OD_OFF_REQ : 29|1@1+ (1,0) [0|0] "" XXX + SG_ PV_AV_CAN : 48|8@1+ (0.3906,0) [0|0] "" XXX + SG_ TEMP_ENG : 8|8@1+ (0.75,-48) [0|0] "" XXX + SG_ TPS : 40|8@1+ (0.4694836,-15.0234742) [0|0] "" XXX + SG_ TQ_STND : 0|6@1+ (10,0) [0|0] "" XXX + SG_ VB_OFF_ACT : 24|1@1+ (1,0) [0|0] "" XXX + +BO_ 832 LKAS11: 8 XXX + SG_ CF_Lkas_ActToi : 27|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CF_Lkas_Chksum : 0|8@1+ (1.0,0.0) [0.0|255.0] "" MDPS + SG_ CF_Lkas_FcwOpt_USM : 32|3@1+ (1.0,0.0) [0.0|7.0] "" CLU + SG_ CF_Lkas_LdwsActivemode : 30|2@1+ (1,0) [0|3] "" CLU,IBOX,PSB + SG_ CF_Lkas_LdwsLHWarning : 12|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB + SG_ CF_Lkas_LdwsRHWarning : 10|2@1+ (1.0,0.0) [0.0|3.0] "" BCM,CLU,PSB + SG_ CF_Lkas_MsgCount : 36|4@1+ (1.0,0.0) [0.0|15.0] "" CLU,MDPS + SG_ CF_Lkas_ToiFlt : 28|1@1+ (1.0,0.0) [0.0|1.0] "" MDPS + SG_ CR_Lkas_StrToqReq : 16|11@1+ (1.0,-1024.0) [-1024.0|1024.0] "" MDPS + SG_ NEW_SIGNAL_1 : 8|2@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_2 : 14|2@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_3 : 29|1@0+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_4 : 35|1@0+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 854 M_356: 8 XXX + SG_ PAINT1 : 32|1@0+ (1,0) [0|0] "" XXX + SG_ PAINT2 : 34|2@0+ (1,0) [0|0] "" XXX + SG_ PAINT3 : 36|2@0+ (1,0) [0|0] "" XXX + SG_ PAINT4 : 38|1@0+ (1,0) [0|0] "" XXX + +BO_ 867 RADAR_0x363: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ FCA_ESA : 8|2@1+ (1,0) [0|3] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 870 EMS_366: 8 XXX + SG_ N : 8|16@1+ (0.25,0) [0|0] "" XXX + SG_ SWI_IGK : 48|1@0+ (1,0) [0|0] "" XXX + SG_ TQI_1 : 0|8@1+ (0.390625,0) [0|0] "" XXX + SG_ TQI_2 : 24|8@1+ (0.390625,0) [0|0] "" XXX + SG_ VS : 40|8@1+ (1,0) [0|0] "" XXX + +BO_ 871 LVR12: 8 XXX + SG_ CF_Lvr_CruiseSet : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_Gear : 32|4@1+ (1,0) [0|0] "" XXX + +BO_ 872 LVR11: 8 XXX + SG_ CF_Lvr_AC : 48|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_BkeAct : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_CS : 52|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_GearInf : 0|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_NFnStat : 6|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_PNStat : 20|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_PRelStat : 4|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_PosCpl : 12|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_PosInf : 8|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_ShfErrInf : 28|20@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_ShtLkStat : 24|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Lvr_UlkButStat : 18|2@1+ (1,0) [0|0] "" XXX + +BO_ 897 MDPS11: 8 XXX + SG_ CF_MDPS_VSM_FUNC : 56|1@0+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_ALTRequest : 23|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_AliveCnt : 40|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Chksum : 48|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_CurrMode : 59|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Flex : 2|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_FlexDisp : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_LKAS_FUNC : 58|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_SPAS_FUNC : 57|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Stat : 7|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_Type : 61|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Mdps_WLmp : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CR_Mdps_DrvTq : 11|12@1+ (1,-2048) [0|0] "" XXX + SG_ CR_Mdps_StrAng : 24|16@1- (0.1,0) [0|0] "" XXX + +BO_ 902 WHL_SPD11: 8 XXX + SG_ WHL_SPD_AliveCounter_LSB : 14|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_SPD_AliveCounter_MSB : 30|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_SPD_Checksum_LSB : 46|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_SPD_Checksum_MSB : 62|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_SPD_FL : 0|14@1+ (0.03125,0) [0|0] "" XXX + SG_ WHL_SPD_FR : 16|14@1+ (0.03125,0) [0|0] "" XXX + SG_ WHL_SPD_RL : 32|14@1+ (0.03125,0) [0|0] "" XXX + SG_ WHL_SPD_RR : 48|14@1+ (0.03125,0) [0|0] "" XXX + +BO_ 903 WHL_PUL11: 6 XXX + SG_ WHL_DIR_FL : 32|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_DIR_FR : 34|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_DIR_RL : 36|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_DIR_RR : 38|2@1+ (1,0) [0|0] "" XXX + SG_ WHL_PUL_Chksum : 40|8@1+ (1,0) [0|0] "" XXX + SG_ WHL_PUL_FL : 0|8@1+ (0.5,0) [0|0] "" XXX + SG_ WHL_PUL_FR : 8|8@1+ (0.5,0) [0|0] "" XXX + SG_ WHL_PUL_RL : 16|8@1+ (0.5,0) [0|0] "" XXX + SG_ WHL_PUL_RR : 24|8@1+ (0.5,0) [0|0] "" XXX + +BO_ 905 SCC14: 8 XXX + SG_ ACC_ObjLatPos : 16|9@1+ (0.1,-20) [-20|31.1] "m" ABS,ESC + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ ObjGap : 51|3@1+ (1,0) [0|255] "" CLU,HUD,ESC + +BO_ 909 FCA11: 8 XXX + SG_ CR_FCA_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ CR_FCA_Alive : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 913 BCM_PO_11: 8 XXX + SG_ BCM_Door_Dri_Status : 5|1@0+ (1,0) [0|0] "" XXX + SG_ BCM_Shift_R_MT_SW_Status : 39|2@0+ (1,0) [0|0] "" XXX + SG_ LFA_Pressed : 4|1@0+ (1,0) [0|0] "" XXX + +BO_ 916 TCS13: 8 XXX + SG_ ACCEL_REF_ACC : 32|11@1+ (0.01,-10.23) [0|0] "" XXX + SG_ ACCEnable : 43|2@1+ (1,0) [0|0] "" XXX + SG_ ACC_EQUIP : 52|1@1+ (1,0) [0|0] "" XXX + SG_ ACC_REQ : 54|1@1+ (1,0) [0|0] "" XXX + SG_ AEB_EQUIP : 63|1@1+ (1,0) [0|0] "" XXX + SG_ AliveCounterTCS : 13|3@1+ (1,0) [0|0] "" XXX + SG_ BrakeLight : 11|1@1+ (1,0) [0|0] "" XXX + SG_ CF_DriBkeStat : 60|1@1+ (1,0) [0|0] "" XXX + SG_ CF_VSM_Avail : 57|2@1+ (1,0) [0|0] "" XXX + SG_ CF_VSM_Coded : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_VSM_ConfSwi : 61|2@1+ (1,0) [0|0] "" XXX + SG_ CF_VSM_Handshake : 59|1@1+ (1,0) [0|0] "" XXX + SG_ CheckSum_TCS3 : 48|4@1+ (1,0) [0|0] "" XXX + SG_ DCEnable : 12|1@1+ (1,0) [0|0] "" XXX + SG_ DF_BF_STAT : 19|2@1+ (1,0) [0|0] "" XXX + SG_ DriverBraking : 55|1@1+ (1,0) [0|0] "" XXX + SG_ DriverOverride : 45|2@1+ (1,0) [0|0] "" XXX + SG_ EBA_ACK : 17|1@1+ (1,0) [0|0] "" XXX + SG_ FCA_ACK : 18|1@1+ (1,0) [0|0] "" XXX + SG_ PBRAKE_ACT : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Pre_TCS_CTL : 16|1@1+ (1,0) [0|0] "" XXX + SG_ SCCReqLim : 22|2@1+ (1,0) [0|0] "" XXX + SG_ StandStill : 47|1@1+ (1,0) [0|0] "" XXX + SG_ TQI_SCC : 24|8@1+ (0.390625,0) [0|0] "" XXX + SG_ aBasis : 0|11@1+ (0.01,-10.23) [0|0] "" XXX + +BO_ 920 RADAR_0x398: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 921 RADAR_0x399: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 922 RADAR_0x39a: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 923 RADAR_0x39b: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 924 RADAR_0x39c: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 1040 CGW_USM1: 8 XXX + SG_ CF_Gway_ADrLRValue : 8|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ADrURValue : 11|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ATTurnRValue : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AutoLightRValue : 35|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrLockSoundRValue : 24|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_EscortHLRValue : 4|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HAnBRValue : 27|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HfreeTrunkRValue : 32|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_MoodLpRValue : 30|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_OTTurnRValue : 21|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PSMRValue : 18|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PTGMRValue : 2|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PasSpkrLvRValue : 40|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RearWiperRValue : 38|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SCMRValue : 14|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TTUnlockRValue : 6|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WlightRValue : 16|2@1+ (1,0) [0|0] "" XXX + +BO_ 1042 ICM_412h: 8 XXX + SG_ PopupMessageOutput_1Level : 48|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_2Level : 49|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_3Level : 50|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_4Level : 51|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_5Level : 52|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_6Level : 53|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_7Level : 54|1@0+ (1,0) [0|0] "" XXX + SG_ PopupMessageOutput_8Level : 55|1@0+ (1,0) [0|0] "" XXX + SG_ TRIP_A_DT_Display_clock : 22|7@0+ (1,0) [0|0] "" XXX + SG_ TRIP_A_DT_Display_minute : 29|6@0+ (1,0) [0|0] "" XXX + SG_ TRIP_B_DT_Display_clock : 38|7@0+ (1,0) [0|0] "" XXX + SG_ TRIP_B_DT_Display_minute : 45|6@0+ (1,0) [0|0] "" XXX + SG_ T_Outside_input : 0|9@0+ (0.01,0) [0|0] "" XXX + SG_ WarningSoundOutput_1Group : 5|1@0+ (1,0) [0|0] "" XXX + SG_ WarningSoundOutput_2Group : 6|1@0+ (1,0) [0|0] "" XXX + SG_ WarningSoundOutput_3Group : 7|1@0+ (1,0) [0|0] "" XXX + +BO_ 1056 SCC11: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ AliveCounterACC : 12|4@1+ (1,0) [0|15] "" CLU,EMS,ESC,TCU + SG_ JerkLowerLimit : 50|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ JerkUpperLimit : 43|7@1+ (0.1,0) [0|12.7] "m/s^3" ESC + SG_ ObjValid : 59|1@1+ (1,0) [0|1] "" CLU,ESC,TCU + SG_ aReqRaw : 27|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + SG_ aReqValue : 16|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" Vector__XXX + +BO_ 1057 SCC12: 8 XXX + SG_ ACCMode : 28|2@1+ (1,0) [0|3] "" CLU,HUD,LDWS_LKAS,ESC + SG_ ACCMode_Inactive : 30|1@1+ (1,0) [0|1] "" CLU,HUD,LDWS_LKAS,ESC + SG_ ACC_ObjDist : 16|11@1+ (0.1,0) [0|204.7] "m" ABS,ESC + SG_ CR_VSM_ChkSum : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CR_VSM_Alive : 12|4@1+ (1,0) [0|15] "" ESC,PSB + SG_ MainMode_ACC : 27|1@1+ (1,0) [0|1] "" CLU,EMS,ESC + SG_ SCCInfoDisplay : 32|3@1+ (1,0) [0|7] "" CLU,ESC + SG_ TauGapSet : 37|3@1+ (1,0) [0|7] "" CLU,ESC,TCU + SG_ VSetDis : 41|8@1+ (1,0) [0|255] "km/h or MPH" CLU,ESC,TCU + SG_ StopReq : 49|1@1+ (1,0) [0|1] "" EPB,ESC + +BO_ 1064 _4WD11: 8 XXX + SG_ AUTO_ACT : 43|1@1+ (1,0) [0|0] "" XXX + SG_ CLU_DUTY : 16|8@1+ (1,0) [0|0] "" XXX + SG_ LOCK_ACT : 44|1@1+ (1,0) [0|0] "" XXX + SG_ LOW_ACT : 42|1@1+ (1,0) [0|0] "" XXX + SG_ R_TIRE : 24|8@1+ (1,200) [0|0] "" XXX + SG_ _2H_ACT : 40|1@1+ (1,0) [0|0] "" XXX + SG_ _4H_ACT : 41|1@1+ (1,0) [0|0] "" XXX + SG_ _4WD_ERR : 8|8@1+ (1,0) [0|0] "" XXX + SG_ _4WD_SUPPORT : 2|2@1+ (1,0) [0|0] "" XXX + SG_ _4WD_SW : 32|8@1+ (1,0) [0|0] "" XXX + SG_ _4WD_TQC_CUR : 48|16@1+ (1,0) [0|0] "" XXX + SG_ _4WD_TYPE : 0|2@1+ (1,0) [0|0] "" XXX + +BO_ 1078 PAS11: 4 XXX + SG_ CF_Gway_PASCheckSound : 22|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayFCTR : 8|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayFLH : 0|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayFRH : 3|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayRCTR : 11|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayRLH : 16|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDisplayRRH : 19|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASDistance : 28|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASFsound : 14|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASOption : 26|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASRsound : 6|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PASSystemOn : 24|2@1+ (1,0) [0|0] "" XXX + +BO_ 1082 RADAR_0x43a: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 1136 P_STS: 8 XXX + SG_ Checksum : 62|2@1+ (1,0) [0|0] "" XXX + SG_ Counter : 58|4@1+ (1,0) [0|0] "" XXX + SG_ HCU1_STS : 6|2@1+ (1,0) [0|0] "" XXX + SG_ HCU5_STS : 8|2@1+ (1,0) [0|0] "" XXX + +BO_ 1151 ESP11: 6 XXX + SG_ AVH_STAT : 0|2@1+ (1,0) [0|0] "" XXX + SG_ ECD_ACT : 6|1@1+ (1,0) [0|0] "" XXX + SG_ LDM_STAT : 2|1@1+ (1,0) [0|0] "" XXX + SG_ REQ_EPB_ACT : 3|2@1+ (1,0) [0|0] "" XXX + SG_ REQ_EPB_STAT : 5|1@1+ (1,0) [0|0] "" XXX + SG_ ROL_CNT_ESP : 8|8@1+ (1,0) [0|0] "" XXX + SG_ _4WD_CLU_LIM : 32|8@1+ (0.390625,0) [0|0] "" XXX + SG_ _4WD_LIM_MODE : 42|1@1+ (1,0) [0|0] "" XXX + SG_ _4WD_LIM_REQ : 7|1@1+ (1,0) [0|0] "" XXX + SG_ _4WD_OPEN : 40|2@1+ (1,0) [0|0] "" XXX + SG_ _4WD_TQC_LIM : 16|16@1+ (1,0) [0|0] "" XXX + +BO_ 1157 LFAHDA_MFC: 8 XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_1 : 8|4@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_2 : 16|1@0+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_3 : 17|1@0+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_4 : 18|1@0+ (1,0) [0|0] "" XXX + SG_ HDA_Icon_State : 19|2@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_5 : 21|3@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_6 : 24|1@0+ (1,0) [0|0] "" XXX + SG_ LFA_Icon_State : 25|2@1+ (1,0) [0|0] "" XXX + SG_ NEW_SIGNAL_7 : 27|37@1+ (1,0) [0|0] "" XXX + +BO_ 1162 BCA11: 8 XXX + SG_ AliveCounter : 21|4@1+ (1,0) [0|0] "" XXX + SG_ CF_BCA_State : 16|3@1+ (1,0) [0|0] "" XXX + SG_ CF_BCA_Warning : 19|2@1+ (1,0) [0|0] "" XXX + SG_ Check_Sum : 56|8@1+ (1,0) [0|0] "" XXX + SG_ RCCA_Brake_Command : 29|1@1+ (1,0) [0|0] "" XXX + +BO_ 1168 EPB11: 7 XXX + SG_ EPB_ALARM : 6|2@1+ (1,0) [0|0] "" XXX + SG_ EPB_CLU : 8|8@1+ (1,0) [0|0] "" XXX + SG_ EPB_DBF_DECEL : 48|8@1+ (0.01,0) [0|0] "" XXX + SG_ EPB_DBF_REQ : 26|1@1+ (1,0) [0|0] "" XXX + SG_ EPB_DBF_STAT : 24|1@1+ (1,0) [0|0] "" XXX + SG_ EPB_FAIL : 29|3@1+ (1,0) [0|0] "" XXX + SG_ EPB_FORCE : 32|12@1+ (1,-1000) [0|0] "" XXX + SG_ EPB_FRC_ERR : 22|2@1+ (1,0) [0|0] "" XXX + SG_ EPB_F_LAMP : 4|2@1+ (1,0) [0|0] "" XXX + SG_ EPB_I_LAMP : 0|4@1+ (1,0) [0|0] "" XXX + SG_ EPB_RBL : 18|1@1+ (1,0) [0|0] "" XXX + SG_ EPB_STATUS : 19|3@1+ (1,0) [0|0] "" XXX + SG_ EPB_SWITCH : 16|2@1+ (1,0) [0|0] "" XXX + SG_ ESP_ACK : 25|1@1+ (1,0) [0|0] "" XXX + +BO_ 1170 EMS19: 8 XXX + SG_ BAT_LAMP_STAT : 42|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_AAFOpenReq : 7|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_AliveCounterEMS9 : 58|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_BrkReq : 0|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_ChecksumEMS9 : 60|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_DecelReq : 8|12@1+ (0.001,-4.094) [0|0] "" XXX + SG_ CF_Ems_DnShftReq : 1|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_ModeledAmbTemp : 48|8@1+ (0.5,-41) [0|0] "" XXX + SG_ CF_Ems_OPSFail : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Ems_RepModChk : 5|2@1+ (1,0) [0|0] "" XXX + SG_ CR_Ems_BstPre : 20|12@1+ (1.322,0) [0|0] "" XXX + SG_ CR_Ems_EngOilTemp : 32|8@1+ (0.75,-40) [0|0] "" XXX + SG_ DPF_LAMP_STAT : 40|2@1+ (1,0) [0|0] "" XXX + +BO_ 1173 YRS13: 8 XXX + SG_ YRS_SeralNo : 16|48@1+ (1,0) [0|0] "" XXX + +BO_ 1186 FRT_RADAR11: 2 XXX + SG_ BYTE0 : 0|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE1 : 8|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE2 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE3 : 24|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE4 : 32|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE5 : 40|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE6 : 48|8@1+ (1,0) [0|0] "" XXX + SG_ BYTE7 : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 1265 CLU11: 4 XXX + SG_ CF_Clu_AliveCnt1 : 28|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AmpInfo : 25|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_CluInfo : 24|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_CruiseSwMain : 3|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_CruiseSwState : 0|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_DetentOut : 18|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_ParityBit1 : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_RheostatLevel : 19|5@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_SPEED_UNIT : 17|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_SldMainSW : 4|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_Vanz : 8|9@1+ (0.5,0) [0|0] "" XXX + SG_ CF_Clu_VanzDecimal : 6|2@1+ (0.125,0) [0|0] "" XXX + +BO_ 1280 ACU14: 1 XXX + SG_ CF_SBR_Ind : 4|2@1+ (1,0) [0|0] "" XXX + SG_ CF_SWL_Ind : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CF_TTL_Ind : 2|2@1+ (1,0) [0|0] "" XXX + +BO_ 1287 TCS15: 4 XXX + SG_ ABS_W_LAMP : 0|1@1+ (1,0) [0|0] "" XXX + SG_ AVH_ALARM : 27|2@1+ (1,0) [0|0] "" XXX + SG_ AVH_CLU : 16|8@1+ (1,0) [0|0] "" XXX + SG_ AVH_I_LAMP : 24|2@1+ (1,0) [0|0] "" XXX + SG_ AVH_LAMP : 29|3@1+ (1,0) [0|0] "" XXX + SG_ DBC_F_LAMP : 6|2@1+ (1,0) [0|0] "" XXX + SG_ DBC_W_LAMP : 5|1@1+ (1,0) [0|0] "" XXX + SG_ EBD_W_LAMP : 26|1@1+ (1,0) [0|0] "" XXX + SG_ ESC_Off_Step : 8|2@1+ (1,0) [0|0] "" XXX + SG_ TCS_LAMP : 3|2@1+ (1,0) [0|0] "" XXX + SG_ TCS_OFF_LAMP : 1|2@1+ (1,0) [0|0] "" XXX + +BO_ 1292 CLU13: 8 XXX + SG_ CF_Clu_ActiveEcoSW : 39|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AliveCnt2 : 60|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AltLStatus : 59|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AvgFCI : 6|10@1+ (0.1,0) [0|0] "" XXX + SG_ CF_Clu_AvgFCU : 3|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_AvsmCur : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_DTE : 24|10@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_DrivingModeSwi : 16|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_EcoDriveInf : 40|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_FlexSteerSW : 23|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_FuelDispLvl : 18|5@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_IsaMainSW : 43|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_LdwsLkasSW : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_LowfuelWarn : 0|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_RefDetMod : 2|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_SWL_Stat : 36|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_TripUnit : 34|2@1+ (1,0) [0|0] "" XXX + +BO_ 1312 CGW3: 8 XXX + SG_ CF_Hoodsw_memory : 22|2@1+ (1,0) [0|0] "" XXX + SG_ CR_Photosensor_LH : 0|8@1+ (78.125,0) [0|0] "" XXX + SG_ CR_Photosensor_RH : 10|8@1+ (78.125,0) [0|0] "" XXX + SG_ C_MirOutTempSns : 24|8@1+ (0.5,-40.5) [0|0] "" XXX + +BO_ 1322 CLU15: 8 XXX + SG_ CF_Clu_ClusterSound : 38|1@1- (1,0) [0|0] "" XXX + SG_ CF_Clu_Gear : 9|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudBrightDnSW : 24|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudBrightUpSW : 22|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudFontColorSet : 20|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudFontSizeSet : 31|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudHeightDnSW : 28|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudHeightUpSW : 26|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudInfoSet : 13|7@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_HudSet : 30|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_LanguageInfo : 33|5@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_VehicleSpeed : 0|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Clu_VehicleSpeed2 : 48|8@1+ (1,0) [0|0] "" XXX + +BO_ 1342 LKAS12: 8 XXX + SG_ CF_LkasDawStatus : 40|3@1+ (1,0) [0|0] "" XXX + SG_ CF_LkasTsrSpeed_Display_Navi : 24|8@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_Daw_USM : 37|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_TsrAddinfo_Display : 32|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_TsrSlifOpt : 10|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Lkas_TsrSpeed_Display_Clu : 16|8@1+ (1,0) [0|0] "" XXX + SG_ _CHECKSUM : 0|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|0] "" XXX + +BO_ 1345 CGW1: 8 XXX + SG_ CF_Gway_ALightStat : 37|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AstDrSw : 35|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AstSeatBeltSw : 14|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DefoggerRly : 36|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DriveTypeOption : 43|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvDrSw : 8|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvKeyLockSw : 6|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvKeyUnlockSw : 7|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvSeatBeltSw : 10|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_Frt_Fog_Act : 40|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HBAControlMode : 52|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HLpHighSw : 53|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HazardSw : 33|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HeadLampHigh : 32|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HeadLampLow : 31|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HoodSw : 17|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IGNSw : 0|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_Ign1 : 58|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_Ign2 : 59|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_InhibitRMT : 54|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_LightSwState : 38|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ParkBrakeSw : 60|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PassingSW : 51|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PassiveAccessLock : 45|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PassiveAccessUnlock : 48|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RKECmd : 3|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RainSnsOption : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RainSnsState : 28|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RrSunRoofOpenState : 50|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SMKOption : 16|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_StarterRlyState : 44|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TSigLHSw : 42|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TSigRHSw : 41|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TrunkTgSw : 12|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TurnSigLh : 19|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_TurnSigRh : 62|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperAutoSw : 27|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperHighSw : 26|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperIntSw : 24|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperIntT : 21|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperLowSw : 25|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperMistSw : 47|1@1+ (1,0) [0|0] "" XXX + SG_ C_SunRoofOpenState : 57|1@1+ (1,0) [0|0] "" XXX + +BO_ 1348 Navi_HU: 8 XXX + SG_ SpeedLim_Nav_Clu : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1363 CGW2: 8 XXX + SG_ CF_Gway_AutoLightOption : 54|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AutoLightValue : 16|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AvTail : 20|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_BCMRKEID : 41|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_BrakeFluidSw : 17|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CLUSwEnter : 15|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CLUSwGroup : 13|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CLUSwGuiCtrl : 10|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CLUSwMode : 14|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_CountryCfg : 26|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DDMDiagState : 1|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DeactivationWarn : 45|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvSeatBeltInd : 18|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ESCLFailWarn : 35|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ESCLNotLockedWarn : 36|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ESCLNotUnlockWarn : 37|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ExtTailAct : 22|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_GwayDiagState : 0|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HLLowLHFail : 33|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_HLLowRHFail : 34|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IDoutWarn : 38|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IPMDiagState : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_ImmoLp : 40|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IntTailAct : 25|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_KeyBATDischargeWarn : 46|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_KeyoutLp : 56|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_LDMFail : 6|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PSMDiagState : 3|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RLDrSw : 24|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RRDrSw : 23|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RearFogAct : 21|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SCMDiagState : 2|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SJBDeliveryMode : 55|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SJBDiagState : 4|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SMKDispWarn : 57|4@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SMKFobID : 48|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SMKRKECmd : 51|3@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_SSBWarn : 47|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_VehicleNotPWarn : 44|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WiperParkPosition : 32|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_WngBuz : 61|3@1+ (1,0) [0|0] "" XXX + +BO_ 1369 CGW4: 8 XXX + SG_ CF_Gway_AstSeatBeltInd : 38|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_AstWdwStat : 11|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvSeatBeltInd : 36|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_DrvWdwStat : 8|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_IMSBuzzer : 15|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_MemoryEnable : 12|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_MemoryP1Cmd : 0|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_MemoryP2Cmd : 1|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBACKStop : 14|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBACKStopCmd : 13|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBackP1Cmd : 2|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBackP2Cmd : 3|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_PBackStopCmd : 5|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RCSeatBeltInd : 40|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RLSeatBeltInd : 42|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RLWdwState : 9|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RRSeatBeltInd : 44|2@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RRWdwState : 10|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RrWiperHighSw : 46|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_RrWiperLowSw : 47|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_StaticBendLhAct : 6|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_StaticBendRhAct : 7|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Gway_StrgWhlHeatedState : 4|1@1+ (1,0) [0|0] "" XXX + +BO_ 1370 HU_AVM_PE_00: 8 XXX + SG_ HU_AVM_Status : 0|2@1+ (1,0) [0|0] "" XXX + +BO_ 1371 AVM_HU_PE_00: 8 XXX + SG_ AVM_Display_Message : 8|8@1+ (1,0) [0|0] "" XXX + SG_ AVM_FrontBtn_Type : 28|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_HU_FrontViewPointOpt : 36|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_HU_FrontView_Option : 44|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_HU_RearView_Option : 40|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_Option : 32|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_ParkingAssist_BtnSts : 5|3@1+ (1,0) [0|0] "" XXX + SG_ AVM_ParkingAssist_Step : 24|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_Popup_Msg : 16|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_Ready : 20|4@1+ (1,0) [0|0] "" XXX + SG_ AVM_Version : 48|16@1+ (1,0) [0|0] "" XXX + SG_ AVM_View : 0|5@1+ (1,0) [0|0] "" XXX + +BO_ 1407 HU_MON_PE_01: 8 XXX + SG_ HU_Type : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 1419 LCA11: 8 XXX + SG_ CF_Lca_IndLeft : 29|1@1+ (1,0) [0|0] "" XXX + SG_ CF_Lca_IndRight : 37|1@1+ (1,0) [0|0] "" XXX + +BO_ 1427 TPMS11: 6 XXX + SG_ POS_FL_W_LAMP : 4|1@1+ (1,0) [0|0] "" XXX + SG_ POS_FR_W_LAMP : 5|1@1+ (1,0) [0|0] "" XXX + SG_ POS_RL_W_LAMP : 6|1@1+ (1,0) [0|0] "" XXX + SG_ POS_RR_W_LAMP : 7|1@1+ (1,0) [0|0] "" XXX + SG_ PRESSURE_FL : 16|8@1+ (1,0) [0|0] "" XXX + SG_ PRESSURE_FR : 24|8@1+ (1,0) [0|0] "" XXX + SG_ PRESSURE_RL : 32|8@1+ (1,0) [0|0] "" XXX + SG_ PRESSURE_RR : 40|8@1+ (1,0) [0|0] "" XXX + SG_ STATUS_TPMS : 8|3@1+ (1,0) [0|0] "" XXX + SG_ TPMS_W_LAMP : 0|2@1+ (1,0) [0|0] "" XXX + SG_ TREAD_W_LAMP : 2|2@1+ (1,0) [0|0] "" XXX + SG_ UNIT : 11|2@1+ (1,0) [0|0] "" XXX + +BO_ 1456 CLU12: 4 XXX + SG_ CF_Clu_Odometer : 0|24@1+ (0.1,0) [0|0] "" XXX + + +CM_ SG_ 1348 SpeedLim_Nav_Clu "Speed limit displayed on Nav, Cluster and HUD"; + +VAL_ 871 CF_Lvr_Gear 12 "T" 5 "D" 8 "S" 6 "N" 7 "R" 0 "P"; +VAL_ 909 CF_VSM_Warn 2 "FCW" 3 "AEB"; +VAL_ 916 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue"; +VAL_ 1057 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled"; +VAL_ 1157 HDA_Icon_State 0 "no_hda" 1 "white_hda" 2 "green_hda"; +VAL_ 1157 LFA_SysWarning 0 "no_message" 1 "switching_to_hda" 2 "switching_to_scc" 3 "lfa_error" 4 "check_hda" 5 "keep_hands_on_wheel_orange" 6 "keep_hands_on_wheel_red"; +VAL_ 1157 LFA_Icon_State 0 "no_wheel" 1 "white_wheel" 2 "green_wheel" 3 "green_wheel_blink"; +VAL_ 1157 HDA_SysWarning 0 "no_message" 1 "driving_convenience_systems_cancelled" 2 "highway_drive_assist_system_cancelled"; +VAL_ 1322 CF_Clu_Gear 1 "P" 2 "R" 4 "N" 8 "D"; diff --git a/artifacts/package_runtime/iqdbc/dbc/hyundai_santafe_2007.dbc b/artifacts/package_runtime/iqdbc/dbc/hyundai_santafe_2007.dbc new file mode 100644 index 000000000..c0f4f7e18 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/hyundai_santafe_2007.dbc @@ -0,0 +1,118 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: AWD ECU TCU ESP SAS ABS + + +BO_ 339 ESP_Flags: 8 ESP + SG_ ABD_Active : 3|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU + SG_ TCS_Active : 9|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU + SG_ ABS_Active : 10|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU + SG_ ESP_Off : 12|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU + SG_ ESP_Active : 14|1@1+ (1,0) [0|1] "yes/no" AWD,ECU,TCU + SG_ VehicleSpeed : 16|8@1+ (1,0) [0|254] "km/h" AWD,ECU,TCU + SG_ TorqueRequestFast : 24|8@1+ (0.390625,0) [0|99.609375] "%" ECU,TCU + SG_ TorqueRequestSlow : 40|8@1+ (0.390625,0) [0|99.609375] "%" ECU,TCU + +BO_ 497 ESP_WheelSpeed: 8 ESP + SG_ FrontRightWheelSpeed : 16|12@1+ (0.125,0) [0|511.875] "km/h" AWD + SG_ FrontLeftWheelSpeed : 28|12@1+ (0.125,0) [0|511.875] "km/h" AWD + SG_ RearRightWheelSpeed : 40|12@1+ (0.125,0) [0|511.875] "km/h" AWD + SG_ RearLeftWheelSpeed : 52|12@1+ (0.125,0) [0|511.875] "km/h" AWD + +BO_ 608 ECU_Data1: 8 ECU + SG_ TorqueMin : 0|8@1+ (0.390625,0) [0|99.609375] "%" ESP,TCU + SG_ Torque : 8|8@1+ (0.390625,0) [0|99.609375] "%" ESP,TCU + SG_ TorqueTarget : 16|8@1+ (0.390625,0) [0|99.609375] "%" ESP,TCU + SG_ CruiseEnabled : 25|1@1+ (1,0) [0|1] "yes/no" TCU + SG_ CruiseActive : 26|1@1+ (1,0) [0|1] "yes/no" TCU + SG_ TorqueMax : 40|8@1+ (0.390625,0) [0|99.609375] "%" ESP,TCU + +BO_ 640 ECU_Data2: 8 ECU + SG_ RPM : 32|8@1+ (32,0) [0|8160] "rpm" TCU + SG_ MAF : 40|8@1+ (5.447,0) [0|1388.985] "mg/TDC" TCU + SG_ IAT : 48|8@1- (0.75,-48) [-48|143.25] "C" TCU + SG_ MAP : 56|8@1+ (0.47058,0) [0|119.9979] "KPa" TCU + +BO_ 688 SAS_Data: 5 SAS + SG_ SAS_Angle : 0|16@1- (0.1,0) [-3276.8|3276.7] "deg" AWD,ECU,ESP,TCU + SG_ SAS_Speed : 16|8@1+ (4,0) [0|1016] "deg/s" ESP,TCU + SG_ SAS_Status : 24|8@1+ (1,0) [0|255] "" ESP,TCU + SG_ Msg_Count : 32|4@1+ (1,0) [0|15] "" ESP + SG_ Check_Sum : 36|4@1+ (1,0) [0|15] "" ECU,ESP + +BO_ 809 ECU_Data5: 8 ECU + SG_ ECT : 8|8@1- (0.75,-48) [-48|143.25] "C" AWD,ABS,ESP,TCU + SG_ BrakeActive : 32|2@1+ (1,0) [0|3] "yes/no" AWD,ABS,ESP,TCU + SG_ TPS : 40|8@1+ (0.47265625,-15) [-15|105.52734375] "%" AWD,ABS,ESP,TCU + +BO_ 1064 AWD_Data1: 8 AWD + SG_ ClutchDuty : 16|8@1+ (1,0) [0|100] "%" ABS,ESP + SG_ ClutchLocked : 44|1@1+ (1,0) [0|1] "yes/no" ABS,ESP + +BO_ 1065 AWD_Data2: 8 AWD + SG_ SteeringWheelPosition : 0|16@1+ (1,-600) [-600|600] "deg" ABS + SG_ FrontRightWheelSpeed : 16|8@1+ (1,0) [0|254] "km/h" ABS + SG_ FrontLeftWheelSpeed : 24|8@1+ (1,0) [0|254] "km/h" ABS + SG_ RearRightWheelSpeed : 32|8@1+ (1,0) [0|254] "km/h" ABS + SG_ RearLeftWheelSpeed : 40|8@1+ (1,0) [0|254] "km/h" ABS + +BO_ 1087 TCU_Data: 8 TCU + SG_ CurrentGear : 0|3@1+ (1,0) [0|7] "" ECU + SG_ GearSwitch : 3|1@1+ (1,0) [0|1] "yes/no" ECU + SG_ SelectorPosition : 8|4@1+ (1,0) [0|15] "" ECU + SG_ InputShaftSpeed : 40|16@1+ (0.25,0) [0|16383.5] "rpm" ECU + +BO_ 1349 ECU_Data6: 8 ECU + SG_ BatteryVoltage : 24|8@1+ (0.1015625,0) [0|25.8984375] "V" ABS,ESP + +BO_ 1408 ABS_WheelSpeed: 8 ABS + SG_ FrontRightWheelSpeed : 16|12@1+ (0.125,0) [0|511.875] "km/h" AWD + SG_ FrontLeftWheelSpeed : 28|12@1+ (0.125,0) [0|511.875] "km/h" AWD + SG_ RearRightWheelSpeed : 40|12@1+ (0.125,0) [0|511.875] "km/h" AWD + SG_ RearLeftWheelSpeed : 52|12@1+ (0.125,0) [0|511.875] "km/h" AWD + +BO_ 1695 ECU_Data7: 8 ECU + SG_ ECU_Temperature : 8|8@1- (1,-28) [-28|227] "C" TCU + +BO_ 1984 SAS_Calibration: 2 ESP + SG_ CCW : 0|4@1+ (1,0) [0|15] "" SAS + SG_ CID : 4|11@1+ (1,0) [0|2047] "" SAS + + + +VAL_ 1087 CurrentGear 7 "R" 0 "N" 1 "1" 2 "2" 3 "3" 4 "4" ; +VAL_ 1087 SelectorPosition 7 "R" 6 "N" 5 "D" 8 "M" 15 "P" ; + diff --git a/artifacts/package_runtime/iqdbc/dbc/luxgen_s5_2015.dbc b/artifacts/package_runtime/iqdbc/dbc/luxgen_s5_2015.dbc new file mode 100644 index 000000000..34fe6b646 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/luxgen_s5_2015.dbc @@ -0,0 +1,153 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 928 EPB_STATUS: 8 XXX + SG_ EPB_BRAKE : 16|1@1+ (1,0) [0|3] "" XXX + +BO_ 1104 SEATBELT_STATUS: 8 XXX + SG_ DRIVER_SEAT_BELT_ONOFF : 21|1@0+ (1,0) [0|3] "" XXX + +BO_ 1056 BODY_ECU_STATUS: 8 XXX + SG_ DOOR_RL_STATUS : 18|1@0+ (1,0) [0|255] "" XXX + SG_ DOOR_FL_STATUS : 13|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_FR_STATUS : 12|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_RR_STATUS : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_BACK_DOOR_STATUS : 22|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_SIGNAL_STATUS : 10|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_SIGNAL_STATUS : 9|1@0+ (1,0) [0|1] "" XXX + +BO_ 832 GEAR_RPM_SPEED_STATUS: 8 XXX + SG_ TRANS_MODE : 7|5@1+ (1,0) [0|0] "" XXX + SG_ TRANS_GEAR_POS : 2|3@0+ (1,0) [0|1] "" XXX + SG_ ENGINE_RPM1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ ENGINE_TEMP : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 821 THROTTLE_STATUS: 8 XXX + SG_ CRUSE_ONOFF : 2|1@0+ (1,0) [0|1] "on/off" XXX + SG_ CRUSE_ENABLED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ THROTTLE_PEDAL_POS : 32|8@1+ (1,0) [0|255] "" XXX + SG_ THROTTLE_POS : 24|8@1+ (1,0) [0|255] "" XXX + SG_ RPM : 48|8@1- (1,0) [0|65535] "" XXX + +BO_ 922 STEERING_ANGLE_STATUS: 8 XXX + SG_ STEER_ANGLE_9000 : 7|16@0- (1,0) [0|65535] "" XXX + +BO_ 906 WHEEL_SPEEDS: 8 XXX + SG_ SPEED_FR : 24|8@1+ (1,0) [0|255] "" XXX + SG_ ABS_UNDEF1 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ SPEED_FL : 0|8@1+ (1,0) [0|255] "" XXX + +BO_ 848 ABS_WHEELS_STATUS: 8 XXX + SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 15|8@0+ (1,0) [0|255] "" XXX + +BO_ 1402 DASH_STATUS: 8 XXX + SG_ CAR_SPEED : 32|8@1+ (1,0) [0|255] "" XXX + SG_ DASH_INFO2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ DASH_INFO0 : 0|8@1+ (1,0) [0|255] "" XXX + SG_ DASH_INFO_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ DASH_INFO_3 : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 1306 _SPEEDX: 8 XXX + SG_ DASH_CAR_SPEED : 7|9@0+ (1,0) [0|255] "" XXX + +BO_ 1296 undefined: 8 XXX + +BO_ 790 ENGINE_DATA: 8 XXX + SG_ _X2 : 6|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 1313 undefined_2: 8 XXX + +BO_ 1312 __trigger_every_range: 8 XXX + SG_ __SIGNAL_every_interval : 4|1@0+ (1,0) [0|1] "" XXX + +BO_ 896 undefined_3: 8 XXX + SG_ NEW_SIGNAL_1 : 32|4@1+ (1,0) [0|15] "" XXX + +BO_ 809 undefined_4: 8 XXX + +BO_ 864 BREAK_TCS_STATUS: 8 XXX + SG_ SPEED3 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ TCS_ON_FF : 45|1@0+ (1,0) [0|1] "" XXX + SG_ XXXX1 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRSSED : 42|1@0+ (1,0) [0|1] "" XXX + +BO_ 842 undefined_5: 8 XXX + +BO_ 880 WHEEL_RPM_STATUS: 8 XXX + SG_ WHEEL_RL_SPEED : 23|16@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_FR_SPEED : 39|16@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_FL_SPEED : 55|16@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_RR_SPEED : 7|16@0- (1,0) [0|255] "" XXX + +BO_ 1040 CONSOLE_STATUS: 8 XXX + SG_ LEFT_SIGNAL_SWITCH : 1|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_SIGNAL_SWITCH : 2|1@0+ (1,0) [0|1] "" XXX + SG_ HEAD_LIGHT_HANDLE_SWITCH : 3|1@0+ (1,0) [0|1] "" XXX + SG_ HID_LIGHT_SWITCH : 4|1@0+ (1,0) [0|1] "" XXX + SG_ YELLOW_WARN_TEMP_TRIGGER : 5|1@0+ (1,0) [0|1] "" XXX + SG_ HID_LIGHT_HANDLE_SWITCH : 6|1@0+ (1,0) [0|1] "" XXX + SG_ MIX_MODE : 7|1@0+ (1,0) [0|1] "" XXX + SG_ slider_rain_bar : 13|1@0+ (1,0) [0|1] "" XXX + SG_ temp_slider_rain_bar : 15|1@0+ (1,0) [0|1] "" XXX + SG_ temp_water_push : 11|1@0+ (1,0) [0|1] "" XXX + +BO_ 1120 HAVC_STATUS: 8 XXX + SG_ HAVC_TEMP : 32|8@1+ (1,0) [0|255] "" XXX + + +CM_ SG_ 1104 DRIVER_SEAT_BELT_ONOFF "0 - on , 1 = off"; +CM_ SG_ 1056 DOOR_RL_STATUS "04 - RL - open"; +CM_ SG_ 1056 DOOR_FL_STATUS "28 - FL open , 38 - FR"; +CM_ SG_ 1056 RIGHT_SIGNAL_STATUS "R,L shows at same time means hazard"; +CM_ SG_ 832 TRANS_MODE "AT - 85 / MT - 8D"; +CM_ SG_ 832 TRANS_GEAR_POS "R-7 , 0 - N"; +CM_ SG_ 821 CRUSE_ONOFF "Cruse Switch"; +CM_ SG_ 821 CRUSE_ENABLED "Cruse enabled"; +CM_ SG_ 821 THROTTLE_PEDAL_POS "Real Pedal Pos"; +CM_ SG_ 821 THROTTLE_POS "Throttle Pos for Cruse Mode"; +CM_ SG_ 906 ABS_UNDEF1 "ABS force"; +CM_ SG_ 906 SPEED_FL "used for car speed in dash board"; +CM_ SG_ 864 TCS_ON_FF "ON = 1, OFF =0"; diff --git a/artifacts/package_runtime/iqdbc/dbc/mazda_2017.dbc b/artifacts/package_runtime/iqdbc/dbc/mazda_2017.dbc new file mode 100644 index 000000000..d2bb77b35 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/mazda_2017.dbc @@ -0,0 +1,791 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 117 STEER_RELATED: 8 XXX + SG_ CTR : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 49|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 50|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 54|4@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_3 : 55|1@0+ (1,0) [0|63] "" XXX + SG_ STEER_ANGLE_2 : 39|16@0+ (0.1,-1800) [0|131071] "" XXX + SG_ STEER_TORQUE : 19|12@0+ (1,-2000) [0|255] "" XXX + +BO_ 118 RPM_RELATED: 8 XXX + SG_ CTR : 7|8@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_2 : 19|12@0+ (1,0) [0|4095] "" XXX + +BO_ 514 ENGINE_DATA: 8 XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|127] "" XXX + SG_ RPM : 7|16@0+ (0.25,0) [0|8500] "rpm" XXX + SG_ SPEED : 23|16@0+ (0.01,0) [0|32767] "kph" XXX + SG_ PEDAL_GAS : 39|12@0+ (1,0) [0|255] "%" XXX + +BO_ 357 PEDALS: 8 XXX + SG_ NEW_SIGNAL_6 : 31|4@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 8|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_OFF : 2|1@1+ (1,0) [0|15] "" XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|15] "" XXX + SG_ STANDSTILL : 26|1@0+ (1,0) [0|16777215] "" XXX + SG_ NEW_SIGNAL_3 : 23|8@0+ (1,0) [0|3] "" XXX + SG_ BRAKE_ON : 4|1@0+ (1,0) [0|1] "" XXX + SG_ NO_BRAKE : 6|1@0+ (1,0) [0|7] "" XXX + SG_ BRAKE_ON_2 : 7|1@1+ (1,0) [0|255] "" XXX + SG_ NO_BRAKE_2 : 15|1@0+ (1,0) [0|7] "" XXX + SG_ GEAR : 48|5@1+ (1,0) [0|255] "" XXX + +BO_ 533 WHEEL_SPEEDS: 8 XXX + SG_ FL : 7|16@0+ (0.01,-100) [0|16383] "kph" XXX + SG_ FR : 23|16@0+ (0.01,-100) [0|65535] "kph" XXX + SG_ RL : 39|16@0+ (0.01,-100) [0|15] "kph" XXX + SG_ RR : 55|16@0+ (0.01,-100) [0|65535] "kph" XXX + +BO_ 134 STEER2: 8 XXX + SG_ CTR : 22|4@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_4 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ CTR_2 : 28|3@1+ (1,0) [0|7] "" XXX + SG_ STEER_ANGLE_ROUGH : 26|11@0+ (1,-1000) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 18|3@0+ (1,0) [0|1] "" XXX + SG_ STEER_ANGLE : 7|16@0+ (0.1,-1600) [-500|500] "deg" XXX + SG_ NEW_SIGNAL_1 : 63|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|7] "" XXX + +BO_ 576 STEER_TORQUE: 8 XXX + SG_ NEW_SIGNAL_1 : 23|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 47|1@0+ (1,0) [0|1] "" XXX + SG_ SENSOR1 : 39|8@0+ (1,-128) [0|127] "" XXX + SG_ STEER_TORQUE_MOTOR : 46|15@0- (0.1,0) [-3000|3000] "tbd" XXX + SG_ NEW_SIGNAL_2 : 62|4@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_4 : 15|8@0+ (1,0) [0|127] "" XXX + SG_ STEER_TORQUE_SENSOR : 7|8@0+ (1,-127) [-85|85] "" XXX + +BO_ 577 STEER_RATE: 8 XXX + SG_ STEER_ANGLE_RATE : 23|16@0+ (0.25,-8192) [0|1] "deg/s" XXX + SG_ CTR : 7|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_REQUEST : 3|12@0+ (1,-2048) [0|15] "" XXX + SG_ LKAS_EFFECTIVE : 39|12@0+ (1,-2048) [0|255] "" XXX + SG_ HANDS_OFF_5_SECONDS : 51|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_BLOCK : 50|1@1+ (1,0) [0|3] "" XXX + SG_ LKAS_TRACK_STATE : 52|1@0+ (1,0) [0|3] "" XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 582 CAM_LANEMAYBE: 8 XXX + SG_ NEW_SIGNAL_4 : 40|8@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_1 : 31|16@0- (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_2 : 55|16@0+ (1,0) [0|65535] "" XXX + SG_ CTR : 7|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_3 : 15|16@0+ (1,0) [0|65535] "" XXX + +BO_ 541 CAM_EMPTY: 8 XXX + +BO_ 605 CAM_PEDESTRIAN: 8 XXX + SG_ CTR : 17|4@0+ (1,0) [0|255] "" XXX + SG_ AEB_NOT_ENGAGED : 13|1@0+ (1,0) [0|1] "" XXX + SG_ PED_WARNING : 9|1@0+ (1,0) [0|255] "" XXX + SG_ PED_BRAKE : 3|3@0+ (1,0) [0|7] "" XXX + SG_ RST_CTR : 23|6@0+ (1,0) [0|63] "" XXX + SG_ S1 : 29|4@0+ (1,0) [0|31] "" XXX + SG_ BRAKE_WARNING : 25|1@0+ (1,0) [0|1] "" XXX + +BO_ 578 CAM_LANETRACK: 8 XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ ZERO : 53|6@0+ (1,0) [0|63] "" XXX + SG_ CTR : 7|4@0+ (1,0) [0|15] "" XXX + SG_ LINE2 : 9|10@0+ (1,-686) [0|255] "" XXX + SG_ LANE_CURVE : 31|8@0+ (1,-127) [0|255] "" XXX + SG_ SIG1 : 39|8@0+ (1,-128) [0|255] "" XXX + SG_ SIG2 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SIG3 : 55|2@0+ (1,0) [0|3] "" XXX + SG_ LINE1 : 3|10@0+ (1,-686) [0|1] "" XXX + +BO_ 579 CAM_LKAS: 8 XXX + SG_ CTR : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ERR_BIT_1 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|15] "" XXX + SG_ LINE_NOT_VISIBLE : 19|1@0+ (1,0) [0|1] "" XXX + SG_ BIT_1 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ LDW : 23|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_REQUEST : 3|12@0+ (1,-2048) [0|2048] "" XXX + SG_ ERR_BIT_2 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ ANGLE_ENABLED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_ANGLE : 33|12@0+ (1,-2048) [-2048|2047] "" XXX + +BO_ 580 CAM_DISTANCE: 8 XXX + SG_ S1 : 0|8@1+ (1,0) [0|127] "" XXX + SG_ S2 : 15|8@0+ (1,0) [0|1] "" XXX + SG_ S3 : 16|8@1+ (1,0) [0|3] "" XXX + SG_ S4 : 24|8@1+ (1,0) [0|31] "" XXX + SG_ S5 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ DISTANCE : 47|8@0+ (1,0) [0|65535] "" XXX + SG_ S6 : 55|16@0+ (1,0) [0|255] "" XXX + +BO_ 581 CAM_IDK3: 8 XXX + SG_ S1 : 0|8@1+ (1,0) [0|15] "" XXX + SG_ S2 : 8|6@1+ (1,0) [0|255] "" XXX + SG_ S3 : 15|2@0+ (1,0) [0|3] "" XXX + SG_ S4 : 16|8@1+ (1,0) [0|15] "" XXX + SG_ S5 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ S6 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ S7 : 40|8@1+ (1,0) [0|3] "" XXX + SG_ S8 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ S9 : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 863 CAM_TRAFFIC_SIGNS: 8 XXX + SG_ NEW_SIGNAL_3 : 55|1@0+ (1,0) [0|127] "" XXX + SG_ FORWARD_COLLISION : 40|8@1+ (1,0) [0|7] "" XXX + SG_ SPEED_SIGN : 4|7@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 52|5@0+ (1,0) [0|31] "" XXX + SG_ SPEED_SIGN_CAM : 32|1@0+ (1,0) [0|32767] "" XXX + SG_ SPEED_SIGN_ON : 12|1@0+ (1,0) [0|3] "" XXX + SG_ STOP_SIGN : 31|4@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 33|1@0+ (1,0) [0|1] "" XXX + +BO_ 1157 CAM_SETTINGS: 8 XXX + SG_ SBS_WARNING_DISTANCE : 25|2@0+ (1,0) [0|127] "" XXX + SG_ SBS_SCBC : 28|2@0+ (1,0) [0|7] "" XXX + SG_ LKAS_ASSIT_TIMING : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_SENSETIVITY : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ILKAS_NTERVENTION_ON2 : 17|1@0+ (1,0) [0|255] "" XXX + SG_ LANEE_DEPARTURE_ALERT : 16|2@0+ (1,0) [0|1] "" XXX + SG_ LKAS_INERVENTION_ON1 : 15|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING : 11|1@0+ (1,0) [0|1] "" XXX + SG_ BIT1 : 12|1@0+ (1,0) [0|7] "" XXX + SG_ BIT2 : 14|1@0+ (1,0) [0|1] "" XXX + SG_ BIT3 : 18|1@0+ (1,0) [0|1] "" XXX + +BO_ 1160 CAM_Empty3: 8 XXX + SG_ NEW_SIGNAL_1 : 47|24@0+ (1,0) [0|16777215] "" XXX + +BO_ 1088 CAM_LANEINFO: 8 XXX + SG_ BIT3 : 62|1@0+ (1,0) [0|3] "" XXX + SG_ HANDS_ON_STEER_WARN_2 : 59|1@0+ (1,0) [0|1] "" XXX + SG_ HANDS_ON_STEER_WARN : 56|1@0+ (1,0) [0|3] "" XXX + SG_ S1_HBEAM : 54|1@0+ (1,0) [0|31] "" XXX + SG_ S1 : 52|1@0+ (1,0) [0|1] "" XXX + SG_ HANDS_WARN_3_BITS : 51|3@0+ (1,0) [0|7] "" XXX + SG_ ERR_BIT : 40|1@0+ (1,0) [0|1] "" XXX + SG_ NO_ERR_BIT : 14|1@0+ (1,0) [0|1] "" XXX + SG_ BIT2 : 13|1@0+ (1,0) [0|15] "" XXX + SG_ LANE_LINES : 10|3@0+ (1,0) [0|3] "" XXX + SG_ BIT1 : 6|1@0+ (1,0) [0|65535] "" XXX + SG_ LINE_NOT_VISIBLE : 1|1@0+ (1,0) [0|1] "" XXX + SG_ LINE_VISIBLE : 0|1@0+ (1,0) [0|3] "" XXX + SG_ LDW_WARN_RL : 58|1@0+ (1,0) [0|1] "" XXX + SG_ LDW_WARN_LL : 57|1@0+ (1,0) [0|1] "" XXX + SG_ TJA : 38|3@0+ (1,0) [0|7] "" XXX + SG_ TJA_TRANSITION : 27|2@0+ (1,0) [0|63] "" XXX + +BO_ 1479 NEW_MSG_470: 8 XXX + +BO_ 1456 NEW_MSG_300: 8 XXX + +BO_ 1446 NEW_MSG_a600: 8 XXX + +BO_ 1416 MSG_18: 8 XXX + +BO_ 1086 DOORS: 8 XXX + SG_ LEFTGATE : 32|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 53|1@0+ (1,0) [0|255] "" XXX + SG_ KEYFOB_HORN : 2|1@0+ (1,0) [0|1] "" XXX + SG_ KEYFOB_LOCK : 3|1@0+ (1,0) [0|1] "" XXX + SG_ KEYFOB_UNLOCK : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CTR1 : 8|4@1+ (1,0) [0|3] "" XXX + SG_ CTR2 : 16|4@1+ (1,0) [0|15] "" XXX + SG_ BR : 34|1@0+ (1,0) [0|1] "" XXX + SG_ BL : 35|1@0+ (1,0) [0|1] "" XXX + SG_ FR : 36|1@0+ (1,0) [0|1] "" XXX + SG_ FL : 37|1@0+ (1,0) [0|255] "" XXX + SG_ DOORS_UNLOCKED : 30|1@0+ (1,0) [0|255] "" XXX + +BO_ 977 TWO_STATES: 8 XXX + SG_ NEW_SIGNAL_1 : 50|1@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 56|4@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_3 : 28|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 24|4@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_5 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 36|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 47|8@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 51|1@0+ (1,0) [0|1] "" XXX + +BO_ 1085 MSG_12: 8 XXX + SG_ NEW_SIGNAL_3 : 36|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 16|8@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 48|8@1+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 31|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 24|1@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_6 : 40|3@1+ (1,0) [0|7] "" XXX + +BO_ 159 MSG_11: 8 XXX + SG_ NEW_SIGNAL_1 : 50|4@1+ (1,0) [0|15] "" XXX + SG_ INCREASEING : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 1278 NEW_MSG_3: 8 XXX + SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ MILAGE_MAYBE : 7|16@0+ (1,0) [0|255] "" XXX + +BO_ 1277 NEW_MSG_10: 8 XXX + SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ counter : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 1275 2017_5: 8 XXX + SG_ counter : 4|5@0+ (1,0) [0|255] "" XXX + +BO_ 1274 NEW_MSG_12: 8 XXX + SG_ NEW_SIGNAL_1 : 24|4@1+ (1,0) [0|15] "" XXX + SG_ CTR : 55|4@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 35|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 32|3@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_4 : 48|4@1+ (1,0) [0|7] "" XXX + +BO_ 1180 last_byte_roughRPM: 8 XXX + SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1078 HVAC: 8 XXX + SG_ NEW_SIGNAL_1 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 8|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 23|1@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 56|5@0+ (1,0) [0|255] "" XXX + +BO_ 1056 CHECK_AND_TEMP: 8 XXX + SG_ NEW_SIGNAL_1 : 29|6@0+ (1,0) [0|255] "" XXX + SG_ counter_or_GEAR : 15|8@0+ (1,0) [0|255] "" XXX + SG_ CTR : 23|8@0+ (1,0) [0|255] "" XXX + SG_ STANDSTILL : 32|1@0+ (1,0) [0|255] "" XXX + SG_ COOLANT_TEMP : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LOW_ENGINE_OIL_PRESSURE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ CHECK_FUEL_CAP : 40|1@0+ (1,0) [0|1] "" XXX + SG_ CHARGING_SYSTEM_MALFUNCTION : 38|1@0+ (1,0) [0|1] "" XXX + SG_ OUTDOOR_TEMP : 63|8@0+ (0.25,-63) [0|255] "cel" XXX + +BO_ 1045 TRACTION: 8 XXX + SG_ NEW_SIGNAL_2 : 20|1@0+ (1,0) [0|3] "" XXX + SG_ CTR2 : 19|4@0+ (1,0) [0|31] "" XXX + SG_ CTR3 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ IS_MOVING : 12|1@0+ (1,0) [0|3] "" XXX + SG_ CTR1 : 53|6@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 54|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE : 55|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_WARNING : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ABS_MALFUNCTION : 1|2@0+ (1,0) [0|3] "" XXX + SG_ DSC_OFF : 3|1@0+ (1,0) [0|1] "" XXX + SG_ TCS_DCS_MALFUNCTION : 6|2@0+ (1,0) [0|3] "" XXX + SG_ LOUD_BEEP : 28|1@0+ (1,0) [0|1] "" XXX + SG_ TPMS_WARNING_DOUBLE_BLINK : 31|1@0+ (1,0) [0|1] "" XXX + +BO_ 1034 MSG_07: 8 XXX + SG_ NEW_SIGNAL_1 : 6|3@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 0|4@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_3 : 15|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_9 : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 870 RADAR_366_STATIC: 8 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 867 RADAR_363: 8 XXX + SG_ CTR : 59|4@0+ (1,0) [0|255] "" XXX + SG_ STATIC_4 : 43|16@0+ (1,0) [0|255] "" XXX + SG_ FLIPPY_1 : 31|3@0+ (1,0) [0|7] "" XXX + SG_ FLIPPY_2 : 47|1@0+ (1,0) [0|15] "" XXX + SG_ FLIPPY_4 : 44|1@0+ (1,0) [0|3] "" XXX + SG_ FLIPPY_3 : 46|1@0+ (1,0) [0|3] "" XXX + SG_ CURVE_1 : 7|12@0+ (1,0) [0|255] "" XXX + SG_ CURVE_2 : 11|12@0+ (1,0) [0|255] "" XXX + SG_ CURVE_3 : 28|13@0+ (1,0) [0|255] "" XXX + +BO_ 130 STEER: 8 XXX + SG_ NEW_SIGNAL_5 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ CTR : 47|4@0+ (1,0) [0|255] "" XXX + SG_ STEER_ANGLE : 23|16@0+ (0.05,-1600) [500|-500] "deg" XXX + SG_ CHKSUM_MAYBE : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 120 BRAKE: 8 XXX + SG_ CTR : 55|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PRESSURE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ VEHICLE_ACC_X : 5|13@0+ (0.01,-40) [-40|40] "m/s^2" XXX + SG_ VEHICLE_ACC_Y : 8|13@0+ (0.001,-4.096) [-4.096|4.096] "m/s^2" XXX + +BO_ 304 GEAR_RELATED: 8 XXX + SG_ NEW_SIGNAL_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 865 RADAR_DISTANCE: 8 XXX + SG_ CTR : 56|4@1+ (1,0) [0|15] "" XXX + SG_ STATIC : 36|3@0+ (1,0) [0|31] "" XXX + SG_ DISTANCE_RELATED : 33|4@0+ (1,0) [0|3] "" XXX + SG_ SPEED_INVERSE : 43|12@0- (-0.225,0) [0|255] "kph" XXX + SG_ DISTANCE_LEAD : 7|24@0+ (1,0) [0|31] "" XXX + SG_ RELATIVE_VEL_LEAD : 31|11@0- (1,0) [0|255] "" XXX + +BO_ 836 NEW_MSG_19: 8 XXX + SG_ CTR : 48|4@1+ (1,0) [0|15] "" XXX + SG_ CTR2 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 832 SEATBELT: 8 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ PASSENGER_SEATBELT : 26|1@1+ (1,0) [0|7] "" XXX + SG_ CTR1 : 15|4@0+ (1,0) [0|15] "" XXX + SG_ CTR2 : 23|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 8|4@1+ (1,0) [0|3] "" XXX + SG_ DRIVER_SEATBELT : 27|1@0+ (1,0) [0|1] "" XXX + +BO_ 866 RADAR_TURN: 8 XXX + SG_ CTR : 59|4@0+ (1,0) [0|15] "" XXX + SG_ STEER_ANGLE : 43|12@0+ (-1,2048) [0|7] "" XXX + SG_ STATIC_2 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ CURVE_1 : 7|12@0+ (1,0) [0|131071] "" XXX + SG_ CURVE_2 : 11|12@0- (1,0) [0|127] "" XXX + SG_ FLIPPY_1 : 44|1@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 34|3@1+ (1,0) [0|3] "" XXX + SG_ CURVE_3 : 31|11@0- (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_1 : 33|4@0+ (1,0) [0|3] "" XXX + +BO_ 158 MSG_05: 8 XXX + SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 157 CRZ_BTNS: 8 XXX + SG_ BIT1 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ BIT2 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ BIT3 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ SET_P_INV : 21|1@0+ (1,0) [0|1] "" XXX + SG_ CAN_OFF_INV : 17|1@0+ (1,0) [0|1] "" XXX + SG_ CAN_OFF : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SET_M_INV : 22|1@0+ (1,0) [0|1] "" XXX + SG_ SET_M : 5|1@0+ (1,0) [0|1] "" XXX + SG_ SET_P : 4|1@0+ (1,0) [0|1] "" XXX + SG_ RES_INV : 19|1@0+ (1,0) [0|1] "" XXX + SG_ RES : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE_LESS : 7|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE_LESS_INV : 8|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE_MORE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE_MORE_INV : 23|1@0+ (1,0) [0|1] "" XXX + SG_ MODE_Y : 13|1@0+ (1,0) [0|1] "" XXX + SG_ MODE_X : 14|1@0+ (1,0) [0|1] "" XXX + SG_ MODE_Y_INV : 30|1@0+ (1,0) [0|1] "" XXX + SG_ MODE_X_INV : 31|1@0+ (1,0) [0|1] "" XXX + SG_ CTR : 29|4@0+ (1,0) [0|15] "" XXX + +BO_ 154 BLINK_INFO: 8 XXX + SG_ LEFT_BLINK : 18|1@1+ (1,0) [0|3] "" XXX + SG_ RIGHT_BLINK : 19|1@0+ (1,0) [0|255] "" XXX + SG_ REAR_WIPER_ON : 0|1@0+ (1,0) [0|1] "" XXX + SG_ WIPER_LO : 33|1@1+ (1,0) [0|31] "" XXX + SG_ WIPER_HI : 34|1@0+ (1,0) [0|1] "" XXX + SG_ LOW_BEAMS : 5|2@0+ (1,0) [0|3] "" XXX + SG_ HIGH_BEAMS : 7|2@0+ (1,0) [0|3] "" XXX + SG_ LBEAM1 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ LBEAM2 : 50|1@0+ (1,0) [0|1] "" XXX + SG_ LBEAM3 : 60|1@0+ (1,0) [0|1] "" XXX + +BO_ 145 TURN_SWITCH: 8 XXX + SG_ HAZARD : 10|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_RIGHT_SWITCH : 12|1@0+ (1,0) [0|3] "" XXX + SG_ TURN_LEFT_SWITCH : 13|1@0+ (1,0) [0|255] "" XXX + SG_ CTR : 27|4@0+ (1,0) [0|255] "" XXX + SG_ CHKSUM : 39|8@0+ (1,0) [0|15] "" XXX + +BO_ 80 MSG_04: 8 XXX + SG_ NEW_SIGNAL_1 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ SIGNAL : 24|1@0+ (1,0) [0|1] "" XXX + +BO_ 978 MSG_03: 8 XXX + SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 23|8@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ CTR : 1|2@0+ (1,0) [0|255] "" XXX + +BO_ 607 NEW_MSG_25: 8 XXX + +BO_ 1115 MSG_02: 8 XXX + SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 47|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_3 : 63|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ CTR : 2|3@0+ (1,0) [0|255] "" XXX + +BO_ 1067 NEW_MSG_27: 8 XXX + SG_ NEW_SIGNAL_2 : 3|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 11|1@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_7 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 9|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_9 : 8|1@0+ (1,0) [0|1] "" XXX + +BO_ 358 NEW_MSG_28: 8 XXX + +BO_ 608 NEW_MSG_29: 8 XXX + SG_ NEW_SIGNAL_1 : 8|5@1+ (1,0) [0|7] "" XXX + +BO_ 606 SPEED_TBD: 8 XXX + SG_ SPEED_TBD : 7|12@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 23|12@0- (1,0) [0|65535] "" XXX + +BO_ 552 GEAR: 8 XXX + SG_ NEW_SIGNAL_3 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 26|3@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 31|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_7 : 39|1@0+ (1,0) [0|255] "" XXX + SG_ MORE_GEAR : 7|4@0+ (1,0) [0|15] "" XXX + SG_ GEAR : 2|3@0+ (1,0) [0|7] "" XXX + SG_ GEAR_BOX : 36|4@0+ (1,0) [0|15] "" XXX + +BO_ 543 CRZ_EVENTS: 8 XXX + SG_ CTR : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_21 : 23|1@0+ (1,0) [0|15] "" XXX + SG_ GAS_MAYBE : 22|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_CMD : 46|8@0- (1,0) [0|15] "" XXX + SG_ CRUISE_ACTIVE_CAR_MOVING : 16|1@0+ (1,0) [0|1] "" XXX + SG_ PLUS_ONE_CRZ : 17|1@0+ (1,0) [0|255] "" XXX + SG_ CRZ_STARTED : 18|1@0+ (1,0) [0|1] "" XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|15] "" XXX + SG_ PLUS_ONE_CRZ_2 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_CMD_LOW_RES : 29|8@0- (1,0) [0|255] "" XXX + SG_ CRZ_SPEED : 7|16@0+ (0.005,-0.5) [0|328] "kph" XXX + +BO_ 542 NEW_MSG_33: 8 XXX + SG_ CTR : 48|4@1+ (1,0) [0|15] "" XXX + SG_ CTR2 : 56|4@1+ (1,0) [0|15] "" XXX + +BO_ 868 RADAR_364: 8 XXX + SG_ CTR : 59|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 7|12@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 11|12@0- (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 27|12@0- (1,0) [0|255] "" XXX + SG_ FLIPPERS_1 : 31|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 44|1@1+ (1,0) [0|3] "" XXX + SG_ FLIPPY_1 : 46|1@0+ (1,0) [0|3] "" XXX + SG_ STATIC_1 : 47|1@0+ (1,0) [0|15] "" XXX + SG_ STATIC_2 : 43|16@0+ (1,0) [0|7] "" XXX + +BO_ 869 RADAR_365: 8 XXX + SG_ CTR : 59|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 39|6@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_1 : 7|14@0+ (1,0) [0|65535] "" XXX + SG_ RELATED_1 : 9|18@0+ (1,0) [0|3] "" XXX + SG_ RELATED_2 : 33|18@0+ (1,0) [0|15] "" XXX + SG_ STATIC : 61|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 63|2@0+ (1,0) [0|15] "" XXX + +BO_ 1114 NEW_MSG_4: 8 XXX + +BO_ 535 CURVE_CTRS: 8 XXX + SG_ CTR_A_1 : 4|3@0+ (1,0) [0|31] "" XXX + SG_ CTR_A_2 : 7|3@0+ (1,0) [0|255] "" XXX + SG_ CTR_B_1 : 12|3@0+ (1,0) [0|7] "" XXX + SG_ CTR_B_2 : 15|3@0+ (1,0) [0|7] "" XXX + SG_ CTR_C_1 : 20|3@0+ (1,0) [0|7] "" XXX + SG_ CTR_C_2 : 23|3@0+ (1,0) [0|255] "" XXX + SG_ CTR_D_2 : 31|3@0+ (1,0) [0|7] "" XXX + SG_ CTR_D_1 : 28|3@0+ (1,0) [0|7] "" XXX + SG_ SPEED : 39|16@0+ (0.01,0) [0|7] "kph" XXX + SG_ CTR : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHK_MAYBE : 63|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 17|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ SEATBELT_MAYBE : 8|1@0+ (1,0) [0|1] "" XXX + SG_ NO_SEATBELT_MAYBE : 16|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 9|1@0+ (1,0) [0|1] "" XXX + +BO_ 540 CRZ_CTRL: 8 XXX + SG_ NEW_SIGNAL_6 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_9 : 31|1@0+ (1,0) [0|255] "" XXX + SG_ ACC_GAS_MAYBE2 : 29|1@0+ (1,0) [0|1] "" XXX + SG_ HANDS_OFF_STEERING : 48|1@0+ (1,0) [0|1] "" XXX + SG_ HANDS_ON_STEER_WARN : 59|4@0+ (1,0) [0|255] "" XXX + SG_ CRZ_ACTIVE : 3|1@0+ (1,0) [0|1] "" XXX + SG_ CRZ_AVAILABLE : 17|1@0+ (1,0) [0|255] "" XXX + SG_ DISTANCE_SETTING : 20|3@0+ (1,0) [0|7] "" XXX + SG_ MSG_1_INV : 1|1@0+ (1,0) [0|1] "" XXX + SG_ MSG_1_COPY : 9|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_GAS_MAYBE : 23|1@0+ (1,0) [0|31] "" XXX + SG_ ACC_ACTIVE_2 : 52|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_10 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ MSG_1 : 0|1@0+ (1,0) [0|3] "" XXX + SG_ 5_SEC_DISABLE_TIMER : 45|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_3 : 13|1@0+ (1,0) [0|3] "" XXX + SG_ MSG_1_INV_COPY : 8|1@0+ (1,0) [0|7] "" XXX + SG_ RADAR_HAS_LEAD : 23|1@0+ (1,0) [0|1] "" XXX + SG_ RADAR_LEAD_RELATIVE_DISTANCE : 31|3@0+ (1,0) [0|5] "" XXX + +BO_ 539 CRZ_INFO: 8 XXX + SG_ CTR1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ ACC_ACTIVE : 33|1@0+ (1,0) [0|1] "" XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 47|1@0+ (1,0) [0|255] "" XXX + SG_ ACC_SET_ALLOWED : 34|1@0+ (1,0) [0|1] "" XXX + SG_ CRZ_ENDED : 36|1@0+ (1,0) [0|255] "" XXX + SG_ ACCEL_CMD : 17|13@0+ (1,-4096) [0|1] "" XXX + SG_ STATIC_1 : 15|11@0+ (1,0) [0|16383] "" XXX + SG_ STATIC_2 : 18|3@1+ (1,0) [0|3] "" XXX + SG_ ERROR_STATUS : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 121 EPB: 8 XXX + SG_ NEW_SIGNAL_1 : 4|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 25|2@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ CTR : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 41|2@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_9 : 47|1@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_10 : 46|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_11 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ EPB_ACTIVE : 29|1@0+ (1,0) [0|15] "" XXX + +BO_ 1070 2017_1: 8 XXX + +BO_ 1183 2017_2: 8 XXX + +BO_ 1243 2017_3: 8 XXX + SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX + +BO_ 1269 MSG_2017_4: 8 XXX + SG_ NEW_SIGNAL_1 : 55|16@0+ (1,0) [0|18446744073709552000] "" XXX + +BO_ 1178 2017_6: 8 XXX + SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX + +BO_ 1179 2017_7: 8 XXX + SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX + +BO_ 1435 2017_8: 8 XXX + +BO_ 253 GAS: 8 XXX + SG_ NEW_SIGNAL_1 : 16|1@0+ (1,0) [0|65535] "" XXX + SG_ CTR : 23|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 41|1@0+ (1,0) [0|255] "" XXX + SG_ CRZ_NOT_ACTIVE : 61|1@0+ (1,0) [0|255] "" XXX + SG_ GAS_CMD : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 359 MORE_GAS: 8 XXX + SG_ NEW_SIGNAL_1 : 15|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ CTR : 31|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 36|5@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 38|1@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_5 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 47|4@0+ (1,0) [0|255] "" XXX + +BO_ 512 NEW_MSG_30: 8 XXX + SG_ NEW_SIGNAL_1 : 6|7@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 23|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 22|7@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_6 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 38|7@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_9 : 40|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_10 : 47|4@0+ (1,0) [0|15] "" XXX + SG_ CTR : 51|3@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_11 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 515 MSG_01: 8 XXX + SG_ CTR : 39|4@0+ (1,0) [0|65535] "" XXX + SG_ CHKSUM : 47|8@0+ (1,0) [0|255] "" XXX + SG_ START1 : 6|1@0+ (1,0) [0|1] "" XXX + SG_ START2 : 28|5@0+ (1,0) [0|255] "" XXX + +BO_ 529 NEW_MSG_36: 8 XXX + SG_ NEW_SIGNAL_1 : 22|5@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 32|4@1+ (1,0) [0|3] "" XXX + SG_ CTR : 39|4@0+ (1,0) [0|255] "" XXX + SG_ CTR_2 : 47|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 40|4@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_5 : 53|1@0+ (1,0) [0|255] "" XXX + +BO_ 1242 NEW_MSG_37: 8 XXX + +BO_ 1266 MSG_09: 8 XXX + SG_ NEW_SIGNAL_1 : 20|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 19|4@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 31|1@0+ (1,0) [0|255] "" XXX + +BO_ 976 MSG_15: 8 XXX + SG_ NEW_SIGNAL_1 : 55|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 61|6@0+ (1,0) [0|1] "" XXX + +BO_ 155 MSG_14: 8 XXX + +BO_ 1267 MSG_10: 8 XXX + SG_ NEW_SIGNAL_1 : 40|1@0+ (1,0) [0|16777215] "" XXX + SG_ NEW_SIGNAL_2 : 42|1@0+ (1,0) [0|1] "" XXX + +BO_ 305 NEW_MSG_6: 8 XXX + SG_ NEW_SIGNAL_1 : 8|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 9|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 10|1@0+ (1,0) [0|1] "" XXX + +BO_ 1238 TEMPERATURE: 8 XXX + SG_ TEMPERATURE_MAYBE : 47|8@0+ (1,0) [0|4294967295] "" XXX + +BO_ 1087 NEW_MSG_1: 8 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 1143 BSM: 8 XXX + SG_ BSM_OFF : 0|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BS_3 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ STANDSTILL : 8|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BS_STATUS : 13|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_BS_STATUS : 15|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_BS3 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BS4 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BS_SIDE : 36|1@0+ (1,0) [0|1] "" XXX + SG_ IS_MOVING : 9|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BS_BEHIND : 46|2@1+ (1,0) [0|16777215] "" XXX + SG_ RIGHT_BS_DISTANCE : 35|3@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ REAR_CT_ALERT : 23|5@0+ (1,0) [0|63] "" XXX + +BO_ 480 ACCEL_TEST: 8 XXX + SG_ ACCEL_COMMAND : 7|32@0- (1,0) [-2147483647|2147483647] "" XXX + SG_ ENABLED : 32|1@0+ (1,0) [0|1] "" XXX + SG_ STARTING : 40|1@0+ (1,0) [0|1] "" XXX + SG_ STOPPING : 48|1@0+ (1,0) [0|1] "" XXX + +BO_ 1361 KEY_POSITION: 8 XXX + +BO_ 1283 KEY_POSITION2: 8 XXX + +BO_ 628 MSG_06: 8 XXX + +BO_ 1154 MSG_08: 8 XXX + +BO_ 1139 MSG_13: 8 XXX + +BO_ 1270 MSG_16: 8 XXX + +BO_ 1272 MSG_17: 8 XXX + +BO_ 1425 MSG_19: 8 XXX + +BO_ 70 MOB1: 8 XXX + SG_ NEW_SIGNAL_1 : 1|3@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 14|6@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_3 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 30|6@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 38|6@0+ (1,0) [0|7] "" XXX + +BO_ 64 MOB2: 8 XXX + SG_ NEW_SIGNAL_1 : 7|2@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 10|3@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 16|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 24|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 35|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 0|3@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_7 : 13|3@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_8 : 15|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_9 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_10 : 31|6@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_11 : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 1171 MOB3: 8 XXX + +BO_ 1248 MOB4: 8 XXX + +BO_ 1177 RADAR_499_STATIC: 8 XXX + + + + +CM_ SG_ 357 GEAR "13P, 26R, 13N, 24D"; +CM_ SG_ 605 PED_BRAKE "3: no brake, 4: brake"; +CM_ SG_ 605 BRAKE_WARNING "Flashing brake warning and audible alert for potential forward collision"; +CM_ SG_ 579 STEERING_ANGLE "steering angle aligns with 0.022 factor and -45.06 offset"; +CM_ SG_ 863 SPEED_SIGN "speed limit in MPH"; +CM_ SG_ 863 SPEED_SIGN_CAM "1: The speed limit is recognized by the camera. 0: speed limit is map based or is not available"; +CM_ SG_ 863 STOP_SIGN "value 9 when stop sign is active"; +CM_ SG_ 1157 SBS_WARNING_DISTANCE "1 far, 2 mid, 3 near"; +CM_ SG_ 1157 SBS_SCBC "1 off, 2 on"; +CM_ SG_ 1157 LKAS_ASSIT_TIMING "1 at, 0 before"; +CM_ SG_ 1157 LKAS_SENSETIVITY "0 low, 1 high"; +CM_ SG_ 1157 LANEE_DEPARTURE_ALERT "1 off, 2 on"; +CM_ SG_ 1157 WARNING "1 Rare, 0 often"; +CM_ SG_ 1088 LANE_LINES "0 LKAS disabled, 1 no lines, 2 two lines, 3 left line, 4 right line"; +CM_ SG_ 1088 TJA "2: crz not active, 3: TJA not allowed, 4: TJA allowed"; +CM_ SG_ 1088 TJA_TRANSITION "3: if TJA signal is 3, otherwise set to 0"; +CM_ SG_ 1045 ABS_MALFUNCTION "off: 0, solid: 1, slow blink: 2, fast blink: 3"; +CM_ SG_ 120 VEHICLE_ACC_X "Vehicle acceleration of X-axis wrt. NED frame."; +CM_ SG_ 120 VEHICLE_ACC_Y "Vehicle acceleration of Y-axis wrt. NED frame."; +CM_ SG_ 157 CAN_OFF "Disengage Cruise if enabled, if already disabled TURN it OFF "; +CM_ SG_ 552 MORE_GEAR ""; +CM_ SG_ 552 GEAR "0 Shifting, 1 P, 2 R, 3 N, 4 D"; +CM_ SG_ 552 GEAR_BOX "0 P, 14 R, 1 though 6 D for speeds, 15 Shift"; +CM_ SG_ 540 HANDS_ON_STEER_WARN "0 no warning, b warning"; +CM_ SG_ 540 DISTANCE_SETTING "Radar distance 0: disabled, 1: 4 bars, 2: 3 bars, 3: 2 bars, 4: 1 bar"; +CM_ SG_ 1143 REAR_CT_ALERT "Rear Cross Traffic Alert"; +VAL_ 552 GEAR 1 "P" 2 "R" 3 "N" 4 "D" ; +VAL_ 540 RADAR_HAS_LEAD 0 "NO LEAD" 1 "HAS LEAD" ; +VAL_ 540 RADAR_LEAD_RELATIVE_DISTANCE 0 "NO LEAD" 1 "FARTHEST" 2 "4" 3 "3" 4 "2" 5 "NEAREST" ; +VAL_ 1143 LEFT_BS_STATUS 0 "No object detected" 1 "Object detected in left blindspot" 2 "Object detected in left blindspot with blinker - warning" +VAL_ 1143 RIGHT_BS_STATUS 0 "No object detected" 1 "Object detected in right blindspot" 2 "Object detected in right blindspot with blinker - warning" diff --git a/artifacts/package_runtime/iqdbc/dbc/mazda_3_2019.dbc b/artifacts/package_runtime/iqdbc/dbc/mazda_3_2019.dbc new file mode 100644 index 000000000..b23e7196b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/mazda_3_2019.dbc @@ -0,0 +1,408 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 256 CAM_Start: 8 XXX + SG_ NEW_SIGNAL_7 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_8 : 61|2@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_10 : 44|12@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 63|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_5 : 24|12@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 2|2@0+ (1,0) [0|1] "" XXX + SG_ ACTIVE_TARGET : 4|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 20|12@0+ (1,0) [0|7] "" XXX + SG_ DISTANCE_LEAD_CAR : 0|12@0+ (1,0) [0|255] "" XXX + +BO_ 358 CAM_End: 8 XXX + SG_ NEW_SIGNAL_2 : 61|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_3 : 59|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 1216 CAM_69: 8 XXX + SG_ NEW_SIGNAL_1 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_3 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_5 : 55|12@0+ (1,0) [0|7] "" XXX + +BO_ 1120 CAM_KEEP_ALIVE_2: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 1436 CAM_71: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 18 STEER: 8 XXX + SG_ NEW_SIGNAL_3 : 55|2@0+ (1,0) [0|15] "" XXX + SG_ CTR : 41|2@0+ (1,0) [0|3] "" XXX + SG_ STEER_LEFT_BIT : 26|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_ANGLE : 25|14@0- (1,375) [0|65536] "" XXX + SG_ ENGINE_OFF : 43|2@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 53|6@0+ (1,0) [0|15] "" XXX + +BO_ 257 LKAS: 8 XXX + SG_ CTR : 59|4@0+ (1,0) [0|255] "" XXX + SG_ CTR_ACT : 61|2@0+ (1,0) [0|3] "" XXX + SG_ SET_0 : 48|1@1+ (1,0) [0|3] "" XXX + SG_ SET_0_1 : 63|2@0+ (1,0) [0|3] "" XXX + SG_ SET_19 : 2|2@0+ (1,0) [0|255] "" XXX + SG_ LEAD_DIST : 0|12@0+ (1,0) [0|255] "" XXX + SG_ ANGLE_TARGET : 20|12@0+ (1,0) [0|4095] "" XXX + SG_ UNKNOWN : 24|12@0+ (1,0) [0|4095] "" XXX + SG_ MAX_TORQUE__ : 44|12@0- (1,0) [0|4095] "" XXX + +BO_ 258 NEW_MSG_3: 8 XXX + SG_ NEW_SIGNAL_3 : 59|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 44|10@0- (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 1|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_4 : 39|10@0- (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 13|10@0- (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 18|10@0- (1,0) [0|255] "" XXX + +BO_ 28 WHEEL_SPEEDS: 8 XXX + SG_ RR : 55|16@0+ (0.01,-100) [0|65535] "" XXX + SG_ RL : 39|16@0+ (0.01,-102) [0|65535] "" XXX + SG_ FL : 7|16@0+ (0.01,-100) [0|65535] "" XXX + SG_ FR : 23|16@0+ (0.01,-100) [0|65535] "" XXX + +BO_ 259 NEW_MSG_5: 8 XXX + SG_ NEW_SIGNAL_3 : 39|10@0- (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 44|10@0- (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 0|12@0- (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 19|11@0- (1,0) [0|10000000] "" XXX + +BO_ 260 NEW_MSG_6: 8 XXX + SG_ NEW_SIGNAL_1 : 0|12@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 24|12@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 20|12@0- (1,0) [0|1] "" XXX + +BO_ 261 NEW_MSG_7: 8 XXX + SG_ NEW_SIGNAL_1 : 15|8@0+ (1,0) [0|255] "" XXX + +BO_ 262 NEW_MSG_8: 8 XXX + SG_ NEW_SIGNAL_1 : 15|8@0- (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 263 NEW_MSG_9: 8 XXX + SG_ NEW_SIGNAL_1 : 15|8@0+ (1,0) [0|255] "" XXX + +BO_ 310 NEW_MSG_10: 8 XXX + SG_ NEW_SIGNAL_1 : 56|4@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 308 ACC_POSSIBLY: 8 XXX + SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 4|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 54|7@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 0|7@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_7 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 18|7@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 36|7@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 55|1@0+ (1,0) [0|1] "" XXX + +BO_ 304 CAM_LANES: 8 XXX + SG_ NEW_SIGNAL_3 : 59|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 61|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LANE_DETECTED : 7|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_DETECTED : 4|1@0+ (1,0) [0|255] "" XXX + SG_ DISTANCE_TO_LEFT_LANE_LOW_RES : 29|8@0+ (1,0) [0|4095] "" XXX + SG_ DISTANCE_TO_RIGHT_LANE_LOW_RES : 37|8@0+ (1,0) [0|15] "" XXX + SG_ DISTANCE_TO_RIGHT_LANE : 23|10@0- (1,0) [0|2047] "" XXX + SG_ DISTANCE_TO_LEFT_LANE : 1|10@0- (1,0) [0|1] "" XXX + +BO_ 305 CAM_LANES_2_MAYBE: 8 XXX + SG_ NEW_SIGNAL_1 : 1|10@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 37|8@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_6 : 61|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_4 : 29|8@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 4|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 23|10@0+ (1,0) [0|4095] "" XXX + +BO_ 352 NEW_MSG_14: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 355 NEW_MSG_15: 8 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|127] "" XXX + +BO_ 356 NEW_MSG_16: 8 XXX + SG_ NEW_SIGNAL_1 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 61|2@0+ (1,0) [0|3] "" XXX + +BO_ 357 NEW_MSG_17: 8 XXX + SG_ NEW_SIGNAL_1 : 61|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ NEW_SIGNAL_3 : 56|4@1+ (1,0) [0|15] "" XXX + +BO_ 59 STEER_RATE: 8 XXX + SG_ NEW_SIGNAL_2 : 47|4@0+ (1,0) [0|15] "" XXX + SG_ STEER_ANGLE_RATE : 55|8@0+ (0.05,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_1 : 43|4@0+ (1,0) [0|15] "" XXX + SG_ STEER_ANGLE : 23|16@0+ (0.05,-1600) [-500|500] "" XXX + SG_ CHKSUM : 39|8@0+ (1,0) [0|15] "" XXX + +BO_ 24 BRAKE_PEDAL: 8 XXX + SG_ BRAKE_PEDAL_PRESSED_AND_ENGINE_ON : 0|1@0+ (1,0) [0|3] "" XXX + SG_ NOT_BRAKE_PEDAL_PRESSED : 6|1@0+ (1,0) [0|3] "" XXX + SG_ BRAKE_PEDAL_PRESSED : 7|1@0+ (1,0) [0|65535] "" XXX + SG_ NOT_BRAKE_PEDAL_PRESSED_AND_ENGINE_ON : 15|1@0+ (1,0) [0|7] "" XXX + +BO_ 26 ENGINE_DATA: 8 XXX + SG_ PEDAL_GAS : 39|10@0+ (1,0) [0|15] "" XXX + SG_ CHKSUM : 63|8@0- (1,0) [0|15] "" XXX + SG_ RPM : 7|13@0+ (1,0) [0|15] "" XXX + SG_ ENGINE_ON : 52|1@0+ (1,0) [0|15] "" XXX + +BO_ 145 BLINK_INFO: 8 XXX + SG_ RIGHT_BLINK : 12|1@0+ (1,0) [0|3] "" XXX + SG_ LEFT_BLINK : 13|1@0+ (1,0) [0|3] "" XXX + SG_ Speed : 27|12@0+ (1,0) [0|255] "" XXX + SG_ CTR : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|15] "" XXX + +BO_ 16 STEER_TORQUE: 8 XXX + SG_ NEW_SIGNAL_12 : 7|2@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 43|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 47|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ STEER_TORQUE_SENSOR : 5|13@0+ (1,-4000) [0|15] "" XXX + SG_ CHKSUM : 63|8@0- (1,0) [0|15] "" XXX + SG_ STEER_TORQUE_MOTOR : 8|13@0+ (0.05,-205) [0|15] "" XXX + SG_ BRAKE_PREASURE : 27|12@0+ (1,0) [0|15] "" XXX + +BO_ 17 STEER_TORQUE_2: 8 XXX + SG_ CTR : 51|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_TORQUE_MOTOR : 7|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 27|14@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 45|6@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 23|12@0+ (1,0) [0|255] "" XXX + +BO_ 29 WHEEL: 8 XXX + SG_ STANDSTILL : 52|1@0+ (1,0) [0|15] "" XXX + SG_ SPEED : 39|16@0+ (1,0) [0|127] "" XXX + SG_ ENCODER_1 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ ENCODER_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_6 : 55|3@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 51|4@0+ (1,0) [0|15] "" XXX + +BO_ 31 GEAR: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX + SG_ GEAR : 36|4@0+ (1,0) [0|65535] "" XXX + +BO_ 96 STEER2: 8 XXX + SG_ NEW_SIGNAL_5 : 48|4@1+ (1,0) [0|15] "" XXX + SG_ CTR : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ TURN_ON : 34|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_OFF : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ENGINE_ON : 33|1@0+ (1,0) [0|1] "" XXX + SG_ CAR_MOVING_FORWARD : 21|1@0+ (1,0) [0|15] "" XXX + SG_ CAR_REVERSING : 22|1@0+ (1,0) [0|1] "" XXX + SG_ ENGINE_OFF : 23|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 45|1@0+ (1,0) [0|15] "" XXX + SG_ SPEED : 18|16@0- (0.00621371,-62.1371) [-65635|65635] "MPH" XXX + SG_ STEER__ : 7|16@0+ (1,0) [0|65535] "" XXX + +BO_ 1209 KEEP_ALIVE_1: 8 XXX + SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_6 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 4|5@0+ (1,0) [0|127] "" XXX + +BO_ 37 BLANK_1: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 44 BLANK_2: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|16777215] "" XXX + SG_ NEW_SIGNAL_3 : 55|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_2 : 39|16@0+ (1,0) [0|16777215] "" XXX + +BO_ 128 RADARS: 8 XXX + SG_ NEW_SIGNAL_1 : 59|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 15|1@0+ (1,0) [0|255] "" XXX + SG_ FRONT_LEFT : 19|1@0+ (1,0) [0|255] "" XXX + SG_ FRONT : 21|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RIGHT : 18|1@0+ (1,0) [0|1] "" XXX + SG_ REAR_RIGHT : 20|1@0+ (1,0) [0|15] "" XXX + SG_ REAR_LEFT : 17|1@0+ (1,0) [0|1] "" XXX + +BO_ 129 NEW_MSG_19: 8 XXX + SG_ NEW_SIGNAL_2 : 15|1@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_3 : 31|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 47|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_5 : 56|8@1+ (1,0) [0|15] "" XXX + +BO_ 1034 KEEP_ALIVE_2: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 23|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 39|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 55|16@0+ (1,0) [0|255] "" XXX + +BO_ 1200 KEEP_ALIVE_3: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 55|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 39|16@0+ (1,0) [0|65535] "" XXX + +BO_ 354 CAM_KEEP_ALIVE_1: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_2 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_3 : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 55|30@0+ (1,0) [0|65535] "" XXX + +BO_ 336 NEW_MSG_20: 8 XXX + SG_ NEW_SIGNAL_2 : 7|8@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_1 : 11|12@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 342 NEW_MSG_21: 8 XXX + SG_ NEW_SIGNAL_1 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 63|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 55|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 39|16@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 48|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_7 : 7|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 23|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_6 : 40|4@1+ (1,0) [0|15] "" XXX + +BO_ 264 NEW_MSG_2: 8 XXX + SG_ NEW_SIGNAL_1 : 56|8@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 49|3@1+ (1,0) [0|7] "" XXX + SG_ CRZ_CTRL_PRESSED : 48|1@0+ (1,0) [0|1] "" XXX + +BO_ 22 CRZ_CTRL_BTNS: 8 XXX + SG_ CRZ_CTRL_BTN_PRESSED : 48|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 51|3@0+ (1,0) [0|7] "" XXX + SG_ SIGNAL : 45|1@0+ (1,0) [0|15] "" XXX + SG_ NOT_SIGNAL : 46|1@0+ (1,0) [0|3] "" XXX + +BO_ 306 CAM_LANE_3_MAYBE: 8 XXX + SG_ NEW_SIGNAL_1 : 19|10@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 13|10@0+ (1,0) [0|255] "" XXX + SG_ LANE_DETECTED_1 : 44|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_DETECTED_2 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 25|10@0+ (1,0) [0|1] "" XXX + SG_ STEER : 7|10@0+ (1,0) [0|1] "" XXX + +BO_ 307 NEW_MSG_1: 8 XXX + SG_ NEW_SIGNAL_2 : 13|10@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 61|6@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 25|10@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 7|10@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 19|10@0+ (1,0) [0|1] "" XXX + +BO_ 320 NEW_MSG_4: 8 XXX + SG_ NEW_SIGNAL_4 : 16|1@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 43|6@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 36|9@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 27|7@0+ (1,0) [0|1] "" XXX + +BO_ 321 NEW_MSG_11: 8 XXX + SG_ NEW_SIGNAL_1 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 32|1@0+ (1,0) [0|1] "" XXX + +BO_ 293 NEW_MSG_12: 8 XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 39|16@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 19|4@0+ (1,0) [0|1] "" XXX + +BO_ 294 NEW_MSG_13: 8 XXX + SG_ NEW_SIGNAL_1 : 59|4@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 61|2@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 7|16@0+ (1,0) [0|1] "" XXX + +BO_ 292 NEW_MSG_18: 8 XXX + SG_ NEW_SIGNAL_1 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 291 NEW_MSG_22: 8 XXX + SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 290 NEW_MSG_23: 8 XXX + SG_ NEW_SIGNAL_1 : 31|5@0+ (1,0) [0|255] "" XXX + +BO_ 277 NEW_MSG_24: 8 XXX + SG_ NEW_SIGNAL_1 : 47|8@0+ (1,0) [0|1] "" XXX + +BO_ 278 NEW_MSG_25: 8 XXX + +BO_ 273 NEW_MSG_26: 8 XXX + SG_ NEW_SIGNAL_1 : 23|4@0+ (1,0) [0|3] "" XXX + +BO_ 274 NEW_MSG_27: 8 XXX + SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|1] "" XXX + +BO_ 289 NEW_MSG_28: 8 XXX + SG_ NEW_SIGNAL_1 : 55|8@0+ (1,0) [0|1] "" XXX + +BO_ 20 NEW_MSG_29: 8 XXX + SG_ RIGHT_BLINK_CLOCK : 23|8@0+ (1,0) [0|1] "" XXX + +BO_ 288 NEW_MSG_30: 8 XXX + + + + +CM_ SG_ 31 GEAR "13-P, 12-R, 11-N, 1-6-D"; +CM_ SG_ 96 SPEED ""; +VAL_ 31 GEAR 13 "P" 12 "R" 11 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D"; diff --git a/artifacts/package_runtime/iqdbc/dbc/mazda_radar.dbc b/artifacts/package_runtime/iqdbc/dbc/mazda_radar.dbc new file mode 100644 index 000000000..a4fe3b4b9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/mazda_radar.dbc @@ -0,0 +1,73 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 540 CRZ_CTRL: 8 XXX + +BO_ 539 CRZ_INFO: 8 XXX + +BO_ 865 RADAR_TRACK_361: 8 XXX + SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX + SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX + SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX + +BO_ 866 RADAR_TRACK_362: 8 XXX + SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX + SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX + SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX + +BO_ 867 RADAR_TRACK_363: 8 XXX + SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX + SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX + SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX + +BO_ 868 RADAR_TRACK_364: 8 XXX + SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX + SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX + SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX + +BO_ 869 RADAR_TRACK_365: 8 XXX + SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX + SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX + SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX + +BO_ 870 RADAR_TRACK_366: 8 XXX + SG_ DIST_OBJ : 7|12@0+ (1,0) [0|4095] "" XXX + SG_ ANG_OBJ : 11|12@0- (1,0) [-2047|2047] "" XXX + SG_ RELV_OBJ : 31|11@0- (1,0) [-1023|1023] "" XXX + +BO_ 1177 RADAR_499: 8 XXX \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/mazda_rx8.dbc b/artifacts/package_runtime/iqdbc/dbc/mazda_rx8.dbc new file mode 100644 index 000000000..b81e7c1d9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/mazda_rx8.dbc @@ -0,0 +1,77 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: PowertrainControlModule InstrumentCluster ElectricPowerSteering AntilockBrakeSystem + + +BO_ 129 steering: 8 ElectricPowerSteering + SG_ SteeringAngle : 23|16@0- (1,0) [0|0] "deg" Vector__XXX + +BO_ 513 speed: 8 PowertrainControlModule + SG_ EngineRPM : 7|16@0+ (0.25,0) [0|0] "rpm" Vector__XXX + SG_ VehicleSpeed : 39|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX + SG_ AcceleratorPos : 55|8@0+ (0.5,0) [0|0] "%" Vector__XXX + +BO_ 592 throttle_body: 8 PowertrainControlModule + SG_ IntakeAirTemperature : 31|8@0+ (1,-40) [0|0] "Cel" Vector__XXX + SG_ AcceleratorPedalSensorRaw : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ AcceleratorPedalSensorFiltered : 55|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 658 brake_controls: 8 PowertrainControlModule + SG_ BrakePedalSwitch : 43|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ParkingBrakeSwitch : 38|1@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 1056 coolant: 8 PowertrainControlModule + SG_ CoolantTemperature : 7|8@0+ (1,-40) [0|0] "Cel" Vector__XXX + +BO_ 1072 instrument_cluster: 8 InstrumentCluster + SG_ FuelLevel : 7|8@0+ (0.392156,0) [0|0] "%" Vector__XXX + SG_ FuelTankSensorLeft : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ FuelTankSensorRight : 23|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1200 wheel_speed: 8 AntilockBrakeSystem + SG_ WheelSpeedFL : 7|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX + SG_ WheelSpeedFR : 23|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX + SG_ WheelSpeedRL : 39|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX + SG_ WheelSpeedRR : 55|16@0+ (0.01,-100) [0|0] "kph" Vector__XXX + +CM_ SG_ 129 SteeringAngle "Steering wheel angle: positive is right and negative is left"; +CM_ SG_ 513 AcceleratorPos "processed interpretation of AcceleratorPedalSensor values"; +CM_ SG_ 1072 FuelTankSensorLeft "lower sensor values indicate a more full tank"; +CM_ SG_ 1072 FuelTankSensorRight "lower sensor values indicate a more full tank"; + + + + diff --git a/artifacts/package_runtime/iqdbc/dbc/mercedes_benz_e350_2010.dbc b/artifacts/package_runtime/iqdbc/dbc/mercedes_benz_e350_2010.dbc new file mode 100644 index 000000000..da6ae4c15 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/mercedes_benz_e350_2010.dbc @@ -0,0 +1,176 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 3 STEER_SENSOR: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_RATE : 19|12@0- (0.5,0) [0|255] "" XXX + SG_ STEER_DIRECTION : 4|1@0+ (1,2) [0|1] "" XXX + SG_ STEER_ANGLE : 3|12@0- (-0.5,0) [-500|500] "degrees" XXX + +BO_ 5 BRAKE_MODULE: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_HOLD : 2|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_POSITION : 17|10@0+ (1,0) [0|65535] "" XXX + SG_ DRIVER_BRAKE : 4|1@0+ (1,0) [0|1] "" XXX + SG_ COMPUTER_BRAKE : 10|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PRESSED : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 69 DRIVER_CONTROLS: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ STEERING_WHEEL_BUTTONS : 32|16@1+ (1,0) [0|255] "4 directional, 2 volume control & 2 phone buttons" XXX + SG_ LEFT_BLINKER : 16|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 17|1@0+ (1,0) [0|1] "" XXX + SG_ HIGHBEAM_TOGGLE : 18|1@0+ (1,0) [0|1] "" XXX + SG_ HIGHBEAM_MOMENTARY : 19|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_CANCEL : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_RESUME : 1|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_ACCEL_HIGH : 2|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_DECEL_HIGH : 3|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_ACCEL_LOW : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_DECEL_LOW : 5|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_XFF : 15|8@0+ (1,0) [0|255] "" XXX + +BO_ 513 WHEEL_ENCODERS: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ WHEEL_ENCODER_2 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_ENCODER_3 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ WHEEL_ENCODER_4 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 56|8@1+ (1,0) [0|255] "" XXX + SG_ WHEEL_ENCODER_1 : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 261 GAS_PEDAL: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ ENGINE_RPM : 4|5@0+ (1,0) [0|255] "" XXX + SG_ GAS_PEDAL : 39|8@0+ (1,0) [0|255] "" XXX + SG_ COMBINED_GAS : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 643 DOOR_SENSORS: 8 XXX + SG_ BRAKE_PRESSED : 27|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 3|1@1+ (1,0) [0|3] "" XXX + SG_ DOOR_OPEN_RL : 5|1@0+ (1,0) [0|3] "" XXX + SG_ DOOR_OPEN_RR : 7|1@0+ (1,0) [0|3] "" XXX + SG_ DOOR_OPEN_FL : 1|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_FL : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_FR : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_RL : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_RR : 6|1@0+ (1,0) [0|1] "" XXX + +BO_ 885 SEATBELT_SENSORS: 8 XXX + SG_ SEATBELT_DRIVER_LATCHED : 16|1@0+ (1,0) [0|1] "" XXX + SG_ SEATBELT_PASSENGER_LATCHED : 18|1@0+ (1,0) [0|1] "" XXX + +BO_ 257 CRUISE_CONTROL: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 6|1@0+ (1,0) [0|255] "" XXX + SG_ CRUISE_DISABLED : 23|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X002 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X003 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_1 : 5|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_ACCELERATING : 22|1@0+ (1,0) [0|1] "" XXX + SG_ LONGITUDINAL_ACCEL_REQUEST : 15|8@0- (1,0) [0|127] "" XXX + +BO_ 260 CRUISE_CONTROL2: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_XFF : 31|8@0+ (1,0) [0|65535] "" XXX + SG_ SET_ME_X02 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_XFF2 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 7|4@0+ (1,0) [0|255] "" XXX + +BO_ 14 STEER_TORQUE: 8 XXX + SG_ STEER_TORQUE : 15|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 888 CRUISE_CONTROL3: 8 XXX + SG_ NEW_SIGNAL_2 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_DISABLED : 36|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_ENABLED : 34|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X003 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X004 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X002 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ CRUISE_SET_SPEED : 15|8@0+ (1,0) [0|63] "mph" XXX + SG_ CRUISE_SPEED_CHANGE : 55|1@0+ (1,0) [0|1] "" XXX + +BO_ 307 POWER_SEATS: 8 XXX + SG_ DRIVER_FORWARD : 0|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_BACK : 1|1@0+ (1,0) [0|1] "" XXX + +BO_ 109 GEAR_LEVER: 8 XXX + SG_ PARK_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX + SG_ NEUTRAL_UP : 9|1@0+ (1,0) [0|1] "" XXX + SG_ NEUTRAL_DOWN : 10|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE : 11|1@0+ (1,0) [0|1] "" XXX + SG_ REVERSE : 8|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 23|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 115 GEAR_PACKET: 8 XXX + SG_ GEAR : 0|4@1+ (1,0) [0|15] "" XXX + +BO_ 581 IGNITION: 8 XXX + +BO_ 515 WHEEL_SPEEDS: 8 XXX + SG_ WHEEL_MOVING_FR : 22|1@1+ (1,0) [0|15] "" XXX + SG_ WHEEL_MOVING_RL : 38|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_MOVING_FL : 6|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_MOVING_RR : 54|1@0+ (1,0) [0|1] "" XXX + SG_ WHEEL_SPEED_FL : 2|11@0+ (0.0375,0) [0|255] "mph" XXX + SG_ WHEEL_SPEED_FR : 18|11@0+ (0.0375,0) [0|255] "mph" XXX + SG_ WHEEL_SPEED_RL : 34|11@0+ (0.0375,0) [0|255] "mph" XXX + SG_ WHEEL_SPEED_RR : 50|11@0+ (0.0375,0) [0|255] "mph" XXX + + + + +CM_ SG_ 3 STEER_DIRECTION "0 = left, 1 = right"; +CM_ SG_ 5 BRAKE_POSITION "computer and driver"; +CM_ SG_ 5 BRAKE_PRESSED "computer and driver"; +CM_ SG_ 261 GAS_PEDAL "user gas input"; +CM_ SG_ 261 COMBINED_GAS "computer and driver gas"; +CM_ SG_ 257 CRUISE_ACCELERATING ""; \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/nissan_leaf_2018_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/nissan_leaf_2018_generated.dbc new file mode 100644 index 000000000..c714d2f24 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/nissan_leaf_2018_generated.dbc @@ -0,0 +1,184 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _nissan_common.dbc starts here"; +BO_ 2 STEER_ANGLE_SENSOR: 5 XXX + SG_ STEER_ANGLE_RATE : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X07 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ STEER_ANGLE : 0|16@1- (-0.1,0) [0|65535] "" XXX + SG_ COUNTER : 32|4@1+ (1,0) [0|15] "" XXX + +BO_ 361 LKAS: 8 XXX + SG_ MAX_TORQUE : 39|8@0+ (0.01,0) [0|255] "Nm" XXX + SG_ SET_0x80 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ LKA_ACTIVE : 52|1@0+ (1,0) [0|15] "" XXX + SG_ SET_0x80_2 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [-1311.43|1310] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 389 STEER_TORQUE_SENSOR: 8 XXX + SG_ LKAS_ACTIVE : 37|1@0+ (1,0) [0|3] "" XXX + SG_ STEER_TORQUE_LKAS : 47|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_ANGLE : 23|18@0+ (-0.01,1310) [0|262143] "" XXX + SG_ STEER_TORQUE_DRIVER : 7|12@0+ (-0.01,20.47) [0|4095] "Nm" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|127] "" XXX + +BO_ 645 WHEEL_SPEEDS_REAR: 8 XXX + SG_ WHEEL_SPEED_RR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX + SG_ WHEEL_SPEED_RL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX + +BO_ 689 PROPILOT_HUD: 8 XXX + SG_ LARGE_WARNING_FLASHING : 9|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING1 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING2 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_YELLOW_FLASH : 12|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_YELLOW_FLASH : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_CAR : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_CAR_ERROR : 15|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_ERROR : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_ERROR_FLASHING : 17|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_GREEN : 24|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_GREEN : 25|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING3 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ERROR_FLASHING : 29|1@0+ (1,0) [0|1] "" XXX + SG_ SAFETY_SHIELD_ACTIVE : 44|1@0+ (1,0) [0|1] "" XXX + SG_ LARGE_STEERING_WHEEL_ICON : 61|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_GREEN_FLASH : 62|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_GREEN_FLASH : 63|1@0+ (1,0) [0|1] "" XXX + SG_ FOLLOW_DISTANCE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ AUDIBLE_TONE : 47|3@0+ (1,0) [0|8] "" XXX + SG_ SPEED_SET_ICON : 7|2@0+ (1,0) [0|3] "" XXX + SG_ SMALL_STEERING_WHEEL_ICON : 42|3@0+ (1,0) [0|7] "" XXX + SG_ SET_SPEED : 39|8@0+ (1,0) [0|255] "" XXX + SG_ unknown02 : 1|2@0+ (1,0) [0|3] "" XXX + SG_ unknown05 : 5|2@0+ (1,0) [0|3] "" XXX + SG_ unknown08 : 8|7@0+ (1,0) [0|63] "" XXX + SG_ unknown26 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ unknown28 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ unknown31 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ unknown43 : 43|1@0+ (1,0) [0|1] "" XXX + SG_ unknown55 : 55|8@0+ (1,0) [0|63] "" XXX + SG_ unknown59 : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 451 PROPILOT_BRAKE: 8 XXX + SG_ BRAKE_PRESSURE : 5|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_ACTIVE : 47|1@0+ (1,0) [0|1] "" XXX + +BO_ 783 CRUISE_STATE: 3 XXX + SG_ CRUISE_ENABLED : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 1228 PROPILOT_HUD_INFO_MSG: 8 XXX + SG_ NA_HIGH_ACCEL_TEMP : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_NA_HIGH_CABIN_TEMP : 8|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_MALFUNCTION : 11|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_MALFUNCTION : 12|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_MALFUNCTION : 13|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_NA_CLEAN_REAR_CAMERA : 14|1@0+ (1,0) [0|1] "" XXX + SG_ NA_POOR_ROAD_CONDITIONS : 16|1@0+ (1,0) [0|1] "" XXX + SG_ CURRENTLY_UNAVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ SAFETY_SHIELD_OFF : 18|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_COLLISION_NA_FRONT_RADAR_OBSTRUCTION : 20|1@0+ (1,0) [0|1] "" XXX + SG_ PEDAL_MISSAPPLICATION_SYSTEM_ACTIVATED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_NA_RADAR_OBSTRUCTION : 25|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_DO_NOT_ENTER : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_SYSTEM_OFF : 34|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_MALFUNCTION : 35|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_COLLISION_MALFUNCTION : 36|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_MALFUNCTION2 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_MALFUNCTION2 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_MALFUNCTION2 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_MSGS : 42|3@0+ (1,0) [0|7] "" XXX + SG_ BOTTOM_MSG : 45|3@0+ (1,0) [0|7] "" XXX + SG_ HANDS_ON_WHEEL_WARNING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_STEP_ON_BRAKE_NOW : 51|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_FRONT_CAMERA_OBSTRUCTED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_HIGH_CABIN_TEMP : 53|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_PROPILOT_MALFUNCTION : 54|1@0+ (1,0) [0|3] "" XXX + SG_ ACC_UNAVAILABLE_HIGH_CABIN_TEMP : 62|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_NA_FRONT_CAMERA_IMPARED : 63|1@0+ (1,0) [0|1] "" XXX + SG_ unknown07 : 7|7@0+ (1,0) [0|127] "" XXX + SG_ unknown10 : 10|2@0+ (1,0) [0|3] "" XXX + SG_ unknown15 : 15|1@0+ (1,0) [0|1] "" XXX + SG_ unknown23 : 23|3@0+ (1,0) [0|7] "" XXX + SG_ unknown19 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ unknown31 : 31|6@0+ (1,0) [0|63] "" XXX + SG_ unknown32 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ unknown46 : 46|1@0+ (1,0) [0|1] "" XXX + SG_ unknown50 : 50|3@0+ (1,0) [0|7] "" XXX + SG_ unknown55 : 55|1@0+ (1,0) [0|1] "" XXX + SG_ unknown61 : 61|6@0+ (1,0) [0|63] "" XXX + +BO_ 1227 LKAS_SETTINGS: 8 XXX + SG_ LKAS_ENABLED : 51|1@0+ (1,0) [0|1] "" XXX + +VAL_ 1228 PROPILOT_NA_MSGS 0 "NO_MSG" 1 "NA_FRONT_CAMERA_IMPARED" 2 "STEERING_ASSIST_ON_STANDBY" 3 "NA_PARKING_ASSIST_ENABLED" 4 "STEER_ASSIST_CURRENTLY_NA" 5 "NA_BAD_WEATHER" 6 "NA_PARK_BRAKE_ON" 7 "NA_SEATBELT_NOT_FASTENED" ; +VAL_ 1228 BOTTOM_MSG 0 "OK_STEER_ASSIST_SETTINGS" 1 "NO_MSG" 2 "PRESS_SET_TO_SET_SPEED" 3 "PRESS_RES_SET_TO_CHANGE_SPEED" 4 "PRESS_RES_TO_RESTART" 5 "NO_MSG" 6 "CRUISE_NOT_AVAIL" 7 "NO_MSG" ; +VAL_ 689 FOLLOW_DISTANCE 0 "NO_FOLLOW_DISTANCE" 1 "FOLLOW_DISTANCE_1" 2 "FOLLOW_DISTANCE_2" 3 "FOLLOW_DISTANCE_3" ; +VAL_ 689 AUDIBLE_TONE 0 "NO_TONE" 1 "CONT" 2 "FAST_BEEP_CONT" 3 "TRIPLE_FAST_BEEP_CONT" 4 "SLOW_BEEP_CONT" 5 "QUAD_SLOW_BEEP_CONT" 6 "SINGLE_BEEP_ONCE" 7 "DOUBLE_BEEP_ONCE" ; +VAL_ 689 SMALL_STEERING_WHEEL_ICON 0 "NO_ICON" 1 "GRAY_ICON" 2 "GRAY_ICON_FLASHING" 3 "GREEN_ICON" 4 "GREEN_ICON_FLASHING" 5 "RED_ICON" 6 "RED_ICON_FLASHING" 7 "YELLOW_ICON" ; +VAL_ 689 LARGE_STEERING_WHEEL_ICON 0 "NO_STEERINGWHEEL" 1 "GRAY_STEERINGWHEEL" 2 "GREEN_STEERINGWHEEL" 3 "GREEN_STEERINGWHEEL_FLASHING" ; + +CM_ "nissan_leaf_2018.dbc starts here"; + +BO_ 42 SEATBELT: 8 XXX + SG_ SEATBELT_DRIVER_LATCHED : 27|1@1+ (1,0) [0|3] "" XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 26|1@0+ (1,0) [0|1] "" XXX + SG_ unknown2 : 31|4@0+ (1,0) [0|15] "" XXX + SG_ unknown3 : 24|2@1+ (1,0) [0|3] "" XXX + SG_ unknown1 : 7|24@0+ (1,0) [0|16777215] "" XXX + SG_ unknown4 : 39|16@0+ (1,0) [0|65535] "" XXX + +BO_ 460 BRAKE_PEDAL: 8 XXX + SG_ BRAKE_PEDAL : 7|8@0+ (1,0) [0|256] "" XXX + +BO_ 569 CRUISE_THROTTLE: 8 XXX + SG_ GAS_PEDAL_INVERTED : 15|8@0+ (1,0) [0|255] "" XXX + SG_ GAS_PEDAL : 7|8@0+ (1,0) [0|255] "" XXX + SG_ CRUISE_AVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ unsure1 : 23|6@0+ (1,0) [0|63] "" XXX + SG_ unsure2 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ unsure3 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ NO_BUTTON_PRESSED : 29|1@0+ (1,0) [0|1] "" XXX + SG_ RES_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX + SG_ SET_BUTTON : 27|1@0+ (1,0) [0|1] "" XXX + SG_ FOLLOW_DISTANCE_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX + SG_ CANCEL_BUTTON : 25|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX + SG_ USER_BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 32|2@1+ (1,0) [0|3] "" XXX + SG_ unsure5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ unsure6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ unsure7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 640 CANCEL_MSG: 8 XXX + SG_ CANCEL_SEATBELT : 1|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 7|6@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 15|56@0+ (1,0) [0|72057594037927940] "" XXX + +BO_ 644 WHEEL_SPEEDS_FRONT: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX + +BO_ 852 ESP: 8 XXX + SG_ ESP_DISABLED : 38|1@0+ (1,0) [0|1] "" XXX + +BO_ 853 HUD_SETTINGS: 8 XXX + SG_ SPEED_MPH : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 856 LIGHTS: 8 XXX + SG_ LEFT_BLINKER : 17|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 18|1@0+ (1,0) [0|1] "" XXX + +BO_ 1057 GEARBOX: 3 XXX + SG_ GEAR_SHIFTER : 5|3@0+ (1,0) [0|255] "" XXX + +BO_ 1549 DOORS_LIGHTS: 8 XXX + SG_ DOOR_OPEN_FL : 3|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 5|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 6|1@0+ (1,0) [0|1] "" XXX + +VAL_ 1057 GEAR_SHIFTER 7 "B" 4 "D" 3 "N" 2 "R" 1 "P" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/nissan_x_trail_2017_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/nissan_x_trail_2017_generated.dbc new file mode 100644 index 000000000..f64dfc266 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/nissan_x_trail_2017_generated.dbc @@ -0,0 +1,191 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _nissan_common.dbc starts here"; +BO_ 2 STEER_ANGLE_SENSOR: 5 XXX + SG_ STEER_ANGLE_RATE : 16|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_X07 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ STEER_ANGLE : 0|16@1- (-0.1,0) [0|65535] "" XXX + SG_ COUNTER : 32|4@1+ (1,0) [0|15] "" XXX + +BO_ 361 LKAS: 8 XXX + SG_ MAX_TORQUE : 39|8@0+ (0.01,0) [0|255] "Nm" XXX + SG_ SET_0x80 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ LKA_ACTIVE : 52|1@0+ (1,0) [0|15] "" XXX + SG_ SET_0x80_2 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [-1311.43|1310] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 389 STEER_TORQUE_SENSOR: 8 XXX + SG_ LKAS_ACTIVE : 37|1@0+ (1,0) [0|3] "" XXX + SG_ STEER_TORQUE_LKAS : 47|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_ANGLE : 23|18@0+ (-0.01,1310) [0|262143] "" XXX + SG_ STEER_TORQUE_DRIVER : 7|12@0+ (-0.01,20.47) [0|4095] "Nm" XXX + SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|127] "" XXX + +BO_ 645 WHEEL_SPEEDS_REAR: 8 XXX + SG_ WHEEL_SPEED_RR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX + SG_ WHEEL_SPEED_RL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX + +BO_ 689 PROPILOT_HUD: 8 XXX + SG_ LARGE_WARNING_FLASHING : 9|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING1 : 10|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING2 : 11|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_YELLOW_FLASH : 12|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_YELLOW_FLASH : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_CAR : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_CAR_ERROR : 15|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_ERROR : 16|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_ERROR_FLASHING : 17|1@0+ (1,0) [0|1] "" XXX + SG_ RIGHT_LANE_GREEN : 24|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_GREEN : 25|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_ERROR_FLASHING3 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_ERROR_FLASHING : 29|1@0+ (1,0) [0|1] "" XXX + SG_ SAFETY_SHIELD_ACTIVE : 44|1@0+ (1,0) [0|1] "" XXX + SG_ LARGE_STEERING_WHEEL_ICON : 61|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LANE_GREEN_FLASH : 62|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_LANE_GREEN_FLASH : 63|1@0+ (1,0) [0|1] "" XXX + SG_ FOLLOW_DISTANCE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ AUDIBLE_TONE : 47|3@0+ (1,0) [0|8] "" XXX + SG_ SPEED_SET_ICON : 7|2@0+ (1,0) [0|3] "" XXX + SG_ SMALL_STEERING_WHEEL_ICON : 42|3@0+ (1,0) [0|7] "" XXX + SG_ SET_SPEED : 39|8@0+ (1,0) [0|255] "" XXX + SG_ unknown02 : 1|2@0+ (1,0) [0|3] "" XXX + SG_ unknown05 : 5|2@0+ (1,0) [0|3] "" XXX + SG_ unknown08 : 8|7@0+ (1,0) [0|63] "" XXX + SG_ unknown26 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ unknown28 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ unknown31 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ unknown43 : 43|1@0+ (1,0) [0|1] "" XXX + SG_ unknown55 : 55|8@0+ (1,0) [0|63] "" XXX + SG_ unknown59 : 59|4@0+ (1,0) [0|15] "" XXX + +BO_ 451 PROPILOT_BRAKE: 8 XXX + SG_ BRAKE_PRESSURE : 5|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_ACTIVE : 47|1@0+ (1,0) [0|1] "" XXX + +BO_ 783 CRUISE_STATE: 3 XXX + SG_ CRUISE_ENABLED : 3|1@0+ (1,0) [0|1] "" XXX + +BO_ 1228 PROPILOT_HUD_INFO_MSG: 8 XXX + SG_ NA_HIGH_ACCEL_TEMP : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_NA_HIGH_CABIN_TEMP : 8|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_MALFUNCTION : 11|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_MALFUNCTION : 12|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_MALFUNCTION : 13|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_NA_CLEAN_REAR_CAMERA : 14|1@0+ (1,0) [0|1] "" XXX + SG_ NA_POOR_ROAD_CONDITIONS : 16|1@0+ (1,0) [0|1] "" XXX + SG_ CURRENTLY_UNAVAILABLE : 17|1@0+ (1,0) [0|1] "" XXX + SG_ SAFETY_SHIELD_OFF : 18|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_COLLISION_NA_FRONT_RADAR_OBSTRUCTION : 20|1@0+ (1,0) [0|1] "" XXX + SG_ PEDAL_MISSAPPLICATION_SYSTEM_ACTIVATED : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_NA_RADAR_OBSTRUCTION : 25|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_DO_NOT_ENTER : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_SYSTEM_OFF : 34|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_IMPACT_MALFUNCTION : 35|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_COLLISION_MALFUNCTION : 36|1@0+ (1,0) [0|1] "" XXX + SG_ SIDE_RADAR_MALFUNCTION2 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_MALFUNCTION2 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ FRONT_RADAR_MALFUNCTION2 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_MSGS : 42|3@0+ (1,0) [0|7] "" XXX + SG_ BOTTOM_MSG : 45|3@0+ (1,0) [0|7] "" XXX + SG_ HANDS_ON_WHEEL_WARNING : 47|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_STEP_ON_BRAKE_NOW : 51|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_FRONT_CAMERA_OBSTRUCTED : 52|1@0+ (1,0) [0|1] "" XXX + SG_ PROPILOT_NA_HIGH_CABIN_TEMP : 53|1@0+ (1,0) [0|1] "" XXX + SG_ WARNING_PROPILOT_MALFUNCTION : 54|1@0+ (1,0) [0|3] "" XXX + SG_ ACC_UNAVAILABLE_HIGH_CABIN_TEMP : 62|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_NA_FRONT_CAMERA_IMPARED : 63|1@0+ (1,0) [0|1] "" XXX + SG_ unknown07 : 7|7@0+ (1,0) [0|127] "" XXX + SG_ unknown10 : 10|2@0+ (1,0) [0|3] "" XXX + SG_ unknown15 : 15|1@0+ (1,0) [0|1] "" XXX + SG_ unknown23 : 23|3@0+ (1,0) [0|7] "" XXX + SG_ unknown19 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ unknown31 : 31|6@0+ (1,0) [0|63] "" XXX + SG_ unknown32 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ unknown46 : 46|1@0+ (1,0) [0|1] "" XXX + SG_ unknown50 : 50|3@0+ (1,0) [0|7] "" XXX + SG_ unknown55 : 55|1@0+ (1,0) [0|1] "" XXX + SG_ unknown61 : 61|6@0+ (1,0) [0|63] "" XXX + +BO_ 1227 LKAS_SETTINGS: 8 XXX + SG_ LKAS_ENABLED : 51|1@0+ (1,0) [0|1] "" XXX + +VAL_ 1228 PROPILOT_NA_MSGS 0 "NO_MSG" 1 "NA_FRONT_CAMERA_IMPARED" 2 "STEERING_ASSIST_ON_STANDBY" 3 "NA_PARKING_ASSIST_ENABLED" 4 "STEER_ASSIST_CURRENTLY_NA" 5 "NA_BAD_WEATHER" 6 "NA_PARK_BRAKE_ON" 7 "NA_SEATBELT_NOT_FASTENED" ; +VAL_ 1228 BOTTOM_MSG 0 "OK_STEER_ASSIST_SETTINGS" 1 "NO_MSG" 2 "PRESS_SET_TO_SET_SPEED" 3 "PRESS_RES_SET_TO_CHANGE_SPEED" 4 "PRESS_RES_TO_RESTART" 5 "NO_MSG" 6 "CRUISE_NOT_AVAIL" 7 "NO_MSG" ; +VAL_ 689 FOLLOW_DISTANCE 0 "NO_FOLLOW_DISTANCE" 1 "FOLLOW_DISTANCE_1" 2 "FOLLOW_DISTANCE_2" 3 "FOLLOW_DISTANCE_3" ; +VAL_ 689 AUDIBLE_TONE 0 "NO_TONE" 1 "CONT" 2 "FAST_BEEP_CONT" 3 "TRIPLE_FAST_BEEP_CONT" 4 "SLOW_BEEP_CONT" 5 "QUAD_SLOW_BEEP_CONT" 6 "SINGLE_BEEP_ONCE" 7 "DOUBLE_BEEP_ONCE" ; +VAL_ 689 SMALL_STEERING_WHEEL_ICON 0 "NO_ICON" 1 "GRAY_ICON" 2 "GRAY_ICON_FLASHING" 3 "GREEN_ICON" 4 "GREEN_ICON_FLASHING" 5 "RED_ICON" 6 "RED_ICON_FLASHING" 7 "YELLOW_ICON" ; +VAL_ 689 LARGE_STEERING_WHEEL_ICON 0 "NO_STEERINGWHEEL" 1 "GRAY_STEERINGWHEEL" 2 "GREEN_STEERINGWHEEL" 3 "GREEN_STEERINGWHEEL_FLASHING" ; + +CM_ "nissan_x_trail_2017.dbc starts here"; + +BO_ 348 GAS_PEDAL: 8 XXX + SG_ GAS_PEDAL_RAW : 26|11@0+ (1,0) [0|2047] "" XXX + SG_ GAS_PEDAL : 47|10@0+ (1,0) [0|1023] "" XXX + +BO_ 438 PRO_PILOT: 8 XXX + SG_ COUNTER : 55|4@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X03 : 33|2@0+ (1,0) [0|15] "" XXX + SG_ CRUISE_ACTIVATED : 38|1@0+ (1,0) [0|3] "" XXX + SG_ CRUISE_ON : 36|1@0+ (1,0) [0|255] "" XXX + SG_ STEER_STATUS : 51|1@0+ (1,0) [0|3] "" XXX + +BO_ 523 CRUISE_THROTTLE: 6 XXX + SG_ PROPILOT_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX + SG_ CANCEL_BUTTON : 9|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL_INVERTED : 37|10@0+ (1,0) [0|1023] "" XXX + SG_ SET_BUTTON : 11|1@0+ (1,0) [0|1] "" XXX + SG_ RES_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX + SG_ FOLLOW_DISTANCE_BUTTON : 10|1@0+ (1,0) [0|1] "" XXX + SG_ NO_BUTTON_PRESSED : 13|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL : 31|10@0+ (1,0) [0|255] "" XXX + SG_ USER_BRAKE_PRESSED : 21|1@0+ (1,0) [0|1] "" XXX + SG_ USER_BRAKE_PRESSED_INVERTED : 22|1@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PRESSED_INVERTED : 20|1@0+ (1,0) [0|255] "" XXX + SG_ COUNTER : 17|2@0+ (1,0) [0|3] "" XXX + SG_ unsure1 : 7|10@0+ (1,0) [0|1023] "" XXX + SG_ unsure2 : 43|4@0+ (1,0) [0|1] "" XXX + SG_ unsure3 : 19|2@0+ (1,0) [0|3] "" XXX + +BO_ 665 ESP: 8 XXX + SG_ ESP_DISABLED : 24|1@0+ (1,0) [0|1] "" XXX + +BO_ 666 WHEEL_SPEEDS_FRONT: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX + +BO_ 768 STEER_TORQUE_SENSOR2: 2 XXX + SG_ STEERING_TORQUE : 6|7@0+ (1,0) [0|127] "" XXX + SG_ STEERING_PRESSED : 15|1@0+ (-1,1) [0|7] "" XXX + +BO_ 1055 GEARBOX: 2 XXX + SG_ SPORTS_MODE : 13|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR_SHIFTER : 5|3@0+ (1,0) [0|255] "" XXX + +BO_ 1107 LIGHTS: 8 XXX + SG_ RIGHT_BLINKER : 12|1@0+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 11|1@0+ (1,0) [0|1] "" XXX + SG_ HEADLIGHTS : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 1108 DOORS_LIGHTS: 8 XXX + SG_ DOOR_CLOSED_RR : 40|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 41|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_RL : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_FL : 44|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_CLOSED_FR : 46|1@0+ (1,0) [0|3] "" XXX + SG_ DOOR_OPEN_FR : 47|1@0+ (1,0) [0|3] "" XXX + SG_ BOOT_OPEN : 55|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_LIGHT : 54|1@0+ (1,0) [0|1] "" XXX + SG_ USER_BRAKE_PRESSED : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1273 HUD: 7 XXX + SG_ SEATBELT_DRIVER_LATCHED : 25|1@0+ (1,0) [0|1] "" XXX + SG_ SPEED_MPH : 5|1@0+ (1,0) [0|1] "" XXX + +VAL_ 1055 GEAR_SHIFTER 6 "L" 4 "D" 3 "N" 2 "R" 1 "P" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/nissan_xterra_2011.dbc b/artifacts/package_runtime/iqdbc/dbc/nissan_xterra_2011.dbc new file mode 100644 index 000000000..1e7bd4c4a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/nissan_xterra_2011.dbc @@ -0,0 +1,96 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 2 STEERING: 5 XXX + SG_ COUNTER : 35|4@0+ (1,0) [0|255] "" XXX + SG_ STEERING_ANGLE : 0|16@1- (0.1,0) [0|65535] "deg" XXX + SG_ POWER_STEER_RATE : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 505 ENGINE_1: 8 XXX + SG_ RPM : 16|16@1+ (0.125,0) [0|45000] "R/min" XXX + SG_ FAN_REQ : 6|2@1+ (1,0) [0|3] "" XXX + SG_ AC_REQ : 3|1@1+ (1,0) [0|1] "" XXX + +BO_ 561 ENGINE_2: 8 XXX + SG_ Pedal_position : 16|8@1+ (0.5,0) [0|200] "%" XXX + +BO_ 563 ENGINE_7: 8 XXX + SG_ CLT : 0|8@1+ (0.366666,0) [0|255] "C" XXX + SG_ RPMlow : 32|8@1+ (3.15,0) [0|45000] "R/min" XXX + SG_ RPMhi : 56|8@1+ (3.15,0) [0|45000] "R/min" XXX + +BO_ 573 ENGINE_3: 8 XXX + SG_ Pedal_position : 8|8@1+ (0.392,0) [0|255] "%" XXX + SG_ Throttle_position_capped : 16|8@1+ (0.392,0) [0|255] "%" XXX + SG_ RPM : 24|16@1+ (3.15,0) [0|45000] "R/min" XXX + SG_ CLT : 56|8@1+ (0.366666,0) [0|255] "C" XXX + +BO_ 574 ENGINE_4: 8 XXX + SG_ Throttle_position_inverted : 16|8@1+ (0.392,0) [0|255] "%" XXX + SG_ EstimatedTorque : 24|16@1+ (0.1,0) [0|45000] "nM" XXX + SG_ Throttle_position : 48|8@1+ (0.392,0) [0|255] "%" XXX + +BO_ 595 TCU_1: 8 XXX + SG_ SHAFT_1_SPEED : 32|16@1+ (1,0) [0|45000] "r/min" XXX + SG_ SHAFT_2_SPEED : 48|16@1+ (1,0) [0|45000] "r/min" XXX + +BO_ 640 SPEED: 8 XXX + SG_ SPEED : 32|16@1+ (0.01,0) [0|45000] "km/h" XXX + +BO_ 644 ABS_1: 8 XXX + SG_ WHEEL_1 : 0|16@1+ (0.01,0) [0|45000] "km/h" XXX + SG_ WHEEL_2 : 15|16@1+ (0.01,0) [0|45000] "km/h" XXX + +BO_ 645 ABS_2: 8 XXX + SG_ WHEEL_3 : 0|16@1+ (0.01,0) [0|45000] "km/h" XXX + SG_ WHEEL_4 : 15|16@1+ (0.01,0) [0|45000] "km/h" XXX + +BO_ 852 SPEED_BREAK: 8 XXX + SG_ BREAK_LIGHT : 52|1@0+ (1,0) [0|3] "" XXX + SG_ SPEED_MPH : 7|16@0+ (0.0066,0) [0|65535] "mph" XXX + SG_ TCS_OFF : 38|1@0+ (1,0) [0|255] "" XXX + +BO_ 861 BCM: 8 XXX + +BO_ 1361 ENGINE_5: 8 XXX + SG_ CLT : 0|8@1+ (1,-45) [-45|150] "" XXX + +BO_ 1408 ENGINE_6: 8 XXX + SG_ RPM : 7|16@0+ (1.5,0) [0|65535] "" XXX + SG_ OIL_TEMP : 32|8@1+ (1,-40) [-40|150] "" XXX + +BO_ 1477 MILEAGE: 8 XXX \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/opel_omega_2001.dbc b/artifacts/package_runtime/iqdbc/dbc/opel_omega_2001.dbc new file mode 100644 index 000000000..8f8e0cfde --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/opel_omega_2001.dbc @@ -0,0 +1,104 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: ABS ESP ECU TCU SAS + + +BO_ 272 TCU_Data1: 8 TCU + SG_ TorqueRequest1 : 15|8@0+ (1,0) [0|255] "" ABS,ESP,ECU + SG_ TorqueRequest2 : 31|8@0+ (1,0) [0|255] "" ABS,ESP,ECU + SG_ OutputShaftSpeed : 55|16@0+ (1,0) [0|65535] "rpm" ABS,ESP,ECU + +BO_ 288 ESP_Data1: 8 ESP + SG_ ABD_Active : 4|1@0+ (1,0) [0|1] "yes/no" ECU,TCU + SG_ TorqueRequestFast : 15|8@0+ (1,0) [0|255] "" ECU,TCU + SG_ TorqueRequestSlow : 31|8@0+ (1,0) [0|255] "" ECU,TCU + +BO_ 384 SAS_Data: 8 SAS + SG_ SteeringAngle : 0|16@1- (0.1,0) [-3276.8|3276.7] "yes/no" ECU,TCU + SG_ SteeringSpeed : 16|8@1+ (1,0) [0|255] "" ECU,TCU + +BO_ 416 ECU_Data1: 8 ECU + SG_ RPM : 15|16@0+ (1,0) [0|65535] "rpm" ABS,ESP,TCU + SG_ TorqueResponse : 31|8@0+ (1,0) [0|255] "" ABS,ESP,TCU + SG_ TorqueLost : 39|8@0+ (1,0) [0|255] "" ABS,ESP,TCU + SG_ APP : 47|8@0+ (1,0) [0|102] "" ABS,ESP,TCU + SG_ TorqueRequest : 63|8@0+ (1,0) [0|255] "" ABS,ESP,TCU + +BO_ 448 ECU_Data2: 8 ECU + SG_ TPS : 23|8@0+ (1,0) [0|100] "" ABS,ESP,TCU + +BO_ 640 ECU_Data3: 8 ECU + SG_ BrakeActive : 18|1@0+ (1,0) [0|1] "yes/no" ABS,ESP,TCU + SG_ KickdownActive : 20|1@0+ (1,0) [0|1] "yes/no" ABS,ESP,TCU + SG_ CruiseActive : 22|1@0+ (1,0) [0|1] "yes/no" ABS,ESP,TCU + +BO_ 736 TCU_Data2: 8 TCU + SG_ TOT : 31|8@0- (1,-40) [-40|215] "" ECU + SG_ InputShaftSpeed : 47|16@0+ (1,0) [0|65535] "rpm" ECU + +BO_ 768 ABS_WheelSpeed: 8 ABS + SG_ FrontLeftWheelSpeed : 5|14@0+ (0.112,0) [0|255] "km/h" ECU,TCU + SG_ FrontLeftWheelErrorFlag : 7|1@0+ (1,0) [0|1] "" ECU,TCU + SG_ FrontRightWheelSpeed : 21|14@0+ (0.112,0) [0|255] "km/h" ECU,TCU + SG_ FrontRightWheelErrorFlag : 23|1@0+ (1,0) [0|1] "" ECU,TCU + SG_ RearLeftWheelSpeed : 37|14@0+ (0.112,0) [0|255] "km/h" ECU,TCU + SG_ RearLeftWheelErrorFlag : 39|1@0+ (1,0) [0|1] "" ECU,TCU + SG_ RearRightWheelSpeed : 53|14@0+ (0.112,0) [0|255] "km/h" ECU,TCU + SG_ RearRightWheelErrorFlag : 55|1@0+ (1,0) [0|1] "" ECU,TCU + +BO_ 792 ESP_Data2: 8 ESP + SG_ ABS_Active : 12|1@0+ (1,0) [0|1] "yes/no" ECU,TCU + SG_ ESP_Off : 20|1@0+ (1,0) [0|1] "yes/no" ECU,TCU + SG_ ESP_Active : 21|1@0+ (1,0) [0|1] "yes/no" ECU,TCU + +BO_ 992 TCU_Data3: 8 TCU + SG_ CurrentGear : 11|4@0+ (1,0) [0|15] "" ECU + SG_ SelectorPosition : 18|3@0+ (1,0) [0|7] "" ECU + SG_ AutoNeutralActive : 26|1@0+ (1,0) [0|1] "yes/no" ECU + SG_ WinterModeActive : 29|1@0+ (1,0) [0|1] "yes/no" ECU + SG_ SportModeActive : 30|1@0+ (1,0) [0|1] "yes/no" ECU + SG_ TCC_State : 37|2@0+ (1,0) [0|2] "" ECU + +BO_ 1472 ECU_Data4: 8 ECU + SG_ ECT : 15|8@0- (1,-40) [-40|215] "" TCU + SG_ IAT : 47|8@0- (1,-40) [-40|215] "" TCU + + + +VAL_ 992 CurrentGear 5 "1" 6 "2" 7 "3" 8 "4" ; +VAL_ 992 SelectorPosition 1 "P" 2 "R" 3 "N" 4 "D" 7 "3" 6 "2" 5 "1" ; +VAL_ 992 TCC_State 0 "Off" 1 "Partially Locked" 2 "Locked" ; + diff --git a/artifacts/package_runtime/iqdbc/dbc/psa_aee2010_r3.dbc b/artifacts/package_runtime/iqdbc/dbc/psa_aee2010_r3.dbc new file mode 100644 index 000000000..8f76dede8 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/psa_aee2010_r3.dbc @@ -0,0 +1,1041 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: UTIL__Traminator CMM___Motor_SG CDS___Fahrdynamikregelung BVA___Automatikgetriebe BSI___Kombiinstrument AR2S_StartStop ABS___Antiblockiersystem + + +BO_ 114 RQD_CMM: 5 CMM___Motor_SG + SG_ ADC2_Req_Status : 0|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ ADC2_Seed_Byte3 : 8|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ ADC2_Seed_Byte2 : 16|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ ADC2_Seed_Byte1 : 24|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ ADC2_Seed_Byte0 : 32|8@1+ (1,0) [0|255] "-" BSI___Kombiinstrument + +BO_ 146 Elec_Int: 1 BSI___Kombiinstrument + SG_ P__Elec_Int_Cntrl_Word : 7|8@0+ (1,0) [0|255] "" Vector__XXX + +BO_ 168 CFD_BSI: 5 BSI___Kombiinstrument + SG_ ADC2_Key_Status : 0|8@1+ (1,0) [0|0] "-" Vector__XXX + SG_ ADC2_Key_Byte3 : 8|8@1+ (1,0) [0|255] "-" CMM___Motor_SG + SG_ ADC2_Key_Byte2 : 16|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ ADC2_Key_Byte1 : 24|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ ADC2_Key_Byte0 : 32|8@1+ (1,0) [0|255] "-" Vector__XXX + +BO_ 264 Vers_CMM: 8 CMM___Motor_SG + SG_ P076_System : 0|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ P077_Day : 8|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ P078_Month : 16|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ P079_Year : 24|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ P080_Application : 32|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ P081_Version : 40|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ P082_Edition : 48|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ P083_Calibration : 56|8@1+ (1,0) [0|255] "-" Vector__XXX + +BO_ 461 ESP: 3 XXX + SG_ COUNTER : 3|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 4|4@1+ (1,0) [0|15] "" XXX + SG_ UNCLEAR : 14|10@0+ (1,0) [0|1023] "" XXX + SG_ ESP_STATUS : 15|1@0+ (1,0) [0|1] "" XXX + SG_ ESP_STATUS_INV : 20|1@0+ (1,0) [0|1] "" XXX + +BO_ 488 DAT3_CMM: 3 Vector__XXX + SG_ Reserved_3 : 5|6@0+ (1,0) [0|0] "" Vector__XXX + SG_ P413_Com_stRstrtStSpPrgs : 7|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ P426_Com_ctRstrtStSp : 15|16@0+ (1,0) [0|3276750] "" Vector__XXX + +BO_ 520 Dyn_CMM: 8 CMM___Motor_SG + SG_ P000_Com_nEng : 7|16@0+ (0.125,0) [0|8191.75] "1/min" Vector__XXX + SG_ P003_Com_trqActOut : 16|8@1+ (3,-150) [-150|615] "Nm" Vector__XXX + SG_ P002_Com_rAPP : 24|8@1+ (0.5,0) [0|100] "%" Vector__XXX + SG_ P027_ACCtl_stLogicOut : 32|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P014_Brk_stRed : 33|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P037_VehV_stXVV : 34|2@1+ (1,0) [0|2] "-" Vector__XXX + SG_ P153_Com_bTrqInacc : 36|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P042_Inm_bCanMon : 38|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P127_EGT_st_Bit30 : 39|1@1+ (1,0) [0|0] "-" Vector__XXX + SG_ P198_ActMod_trqClthTraIntv : 56|8@1+ (2,-100) [-100|410] "Nm" Vector__XXX + +BO_ 552 Dyn5_CMM: 5 CMM___Motor_SG + SG_ P320_EasyMvTrqInfo : 0|8@1+ (3,-150) [-150|615] "Nm" Vector__XXX + SG_ P411_Com_stTrqAvlStSp : 12|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P410_Com_stEngTrqStSp : 13|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P321_StatusOfEasyMvTrq : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P334_ACCPed_Position : 16|8@1+ (0.5,0) [0|100] "%" Vector__XXX + SG_ P336_Com_xDyn5CMMChkSum : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P335_Com_ctDyn5CMMCntr : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P388_Com_rClthPedPos : 39|8@0+ (0.5,0) [0|100] "" Vector__XXX + +BO_ 694 HS2_DYN1_MDD_ETAT_2B6: 8 ARTIV + SG_ MDD_DESIRED_DECELERATION : 7|8@0+ (0.05,-10.65) [-10.65|2] "m/s2" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ POTENTIAL_WHEEL_TORQUE_REQUEST : 9|2@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ MIN_TIME_FOR_DESIRED_GEAR : 15|6@0+ (0.1,0) [0|6.2] "s" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ GMP_POTENTIAL_WHEEL_TORQUE : 23|12@0+ (4,-4000) [-4000|11000] "N.m" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ ACC_STATUS : 27|4@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ GMP_WHEEL_TORQUE : 39|14@0+ (1,-4000) [-4000|11000] "N.m" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ WHEEL_TORQUE_REQUEST : 41|2@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ AUTO_BRAKING_STATUS : 50|3@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ MDD_DECEL_TYPE : 52|2@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ MDD_DECEL_CONTROL_REQ : 53|1@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ GEAR_TYPE : 54|1@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ PREFILL_REQUEST : 55|1@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ DYN_ACC_CHECKSUM : 59|4@0+ (1,0) [0|0] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + SG_ DYN_ACC_PROCESS_COUNTER : 63|4@0+ (1,0) [0|15] "" CMM,UC_FREIN,BSI,PASS_HCU2,CMF + +BO_ 717 HS2_DYN_UCF_2CD: 3 UC_FREIN + SG_ AUTO_BRAKING_PRESSURE : 7|8@0+ (0.2,0) [0|50.6] "bar" BV,BVN + SG_ VITESSE_LACET : 15|16@0- (0.1,0) [-100|100] "DegrÊ/s" BV,BVN + +BO_ 728 NEW_MSG_2D8: 7 XXX + SG_ ACC_RELATED : 17|1@0+ (1,0) [0|1] "" XXX + SG_ ESP_STATUS_RELATED : 28|1@0+ (1,0) [0|1] "" XXX + SG_ ESP_STATUS_RELATED_INV : 29|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ACTIVATION_RELATED : 43|1@0+ (1,0) [0|1] "" XXX + +BO_ 757 STEERING: 7 XXX + SG_ COUNTER : 3|4@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 7|4@0+ (1,0) [0|15] "" XXX + SG_ DRIVER_TORQUE : 15|8@0- (1,0) [0|255] "" XXX + SG_ ANGLE : 31|16@0- (0.1,0) [-3276.8|3276.7] "degrees" XXX + SG_ RATE : 47|12@0- (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_1 : 48|1@0+ (1,0) [0|1] "" XXX + +BO_ 758 HS2_DYN_MDD_ETAT_2F6: 8 ARTIV + SG_ TARGET_DETECTED : 0|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ REQUEST_TAKEOVER : 2|2@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ BLIND_SENSOR : 4|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ REQ_VISUAL_COLL_ALERT_ARC : 5|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ REQ_AUDIO_COLL_ALERT_ARC : 6|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ REQ_HAPTIC_COLL_ALERT_ARC : 7|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ INTER_VEHICLE_DISTANCE : 15|10@0+ (0.25,0) [0|255.5] "m" BSI,CMM,UC_FREIN,CMF + SG_ ARC_STATUS : 19|4@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ AUTO_BRAKING_IN_PROGRESS : 20|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ AEB_ENABLED : 21|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ DRIVE_AWAY_REQUEST : 33|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ DISPLAY_INTERVEHICLE_TIME : 39|6@0+ (0.1,0) [0|6.1] "s" BSI,CMM,UC_FREIN,CMF + SG_ MDD_DECEL_CONTROL_REQ : 42|1@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ AUTO_BRAKING_STATUS : 47|3@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ CHECKSUM_TRANSM_DYN_ACC2 : 51|4@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + SG_ PROCESS_COUNTER_4B_ACC2 : 55|4@0+ (1,0) [0|15] "" BSI,CMM,UC_FREIN,CMF + SG_ TARGET_POSITION : 63|3@0+ (1,0) [0|0] "" BSI,CMM,UC_FREIN,CMF + +BO_ 760 NEW_MSG_2F8: 7 XXX + SG_ ESP_STATUS_RELATED : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ESP_STATUS_RELATED_INV : 13|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_ACTIVATION_RELATED : 35|1@0+ (1,0) [0|1] "" XXX + +BO_ 770 NEW_MSG_302: 7 XXX + SG_ ACC_RELATED : 46|1@0+ (1,0) [0|1] "" XXX + +BO_ 773 STEERING_ALT: 7 XXX + SG_ ANGLE : 7|16@0- (0.1,0) [-3276.8|3276.7] "degrees" XXX + SG_ RATE : 23|8@0+ (1,0) [0|255] "" XXX + SG_ RATE_SIGN : 31|1@0+ (1,0) [0|1] "" XXX + SG_ 0_COUNTER : 35|4@0+ (1,0) [0|255] "" XXX + SG_ 0_CHECKSUM : 39|4@0+ (1,0) [0|15] "" XXX + SG_ RATE_ALT : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 781 Dyn4_FRE: 8 CDS___Fahrdynamikregelung + SG_ P263_VehV_VPsvValWhlFrtL : 7|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX + SG_ P264_VehV_VPsvValWhlFrtR : 23|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX + SG_ P265_VehV_VPsvValWhlBckL : 39|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX + SG_ P266_VehV_VPsvValWhlBckR : 55|16@0+ (0.01,0) [0|655.35] "km/h" Vector__XXX + +BO_ 792 NEW_MSG_318: 5 XXX + SG_ ACC_RELATED : 14|13@0+ (1,0) [0|8191] "" XXX + SG_ ACC_RELATED_2 : 30|13@0+ (1,0) [0|8191] "" XXX + SG_ ACC_GO_RELATED : 32|1@0+ (1,0) [0|1] "" XXX + +BO_ 809 Dyn_STT_BV: 4 BVA___Automatikgetriebe + SG_ P230_Com_ctGbxCnt3 : 3|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ P340_Com_xChkSum3 : 7|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ P441_Com_bGbxAuthRstrtRaw : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P444_Com_bGbxSysFaultRaw : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P443_Com_bGbxRstrtReq : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P442_Com_bGbxAuthStopRaw : 15|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 813 HS2_DYN_UCF_MDD_32D: 8 UC_FREIN + SG_ ACCEL_LONGI_CALIB : 7|12@0+ (0.02,-40.96) [-40.96|40.92] "m/s2" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ VAL_INFO_VIT_LACET : 8|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ EFFORT_FREIN : 9|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ FA_ETAT_DECEL : 11|2@0+ (1,0) [0|3] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ APPUI_FREIN_RECONSTRUIT : 17|2@0+ (1,0) [0|3] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ PREFILL_EN_COURS : 18|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ ACC_ETAT_DECEL_OR_ESP_STATUS : 20|2@0+ (1,0) [0|3] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ VEHICLE_STANDSTILL : 21|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ FREINAGE_DYN_EN_COURS : 22|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ BRAKE_RELEASED_FAILSAFE : 23|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ EFFORT_FREIN_ERRONE : 28|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ ARRET_VHL_ADAS : 30|2@0+ (1,0) [0|3] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ DEFAUT_ACC_FREIN : 31|1@0+ (1,0) [0|1] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ VITESSE_LACET_BRUTE : 39|12@0+ (0.08,-163.84) [-163.84|163.68] "DegrÊ/s" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ CHKSUM_TRME_DYN_UCF_ACC : 59|4@0+ (1,0) [0|15] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + SG_ CPT_PROCESS_4B_UC_FREIN : 63|4@0+ (1,0) [0|15] "" CMM,BSI,PASS_HCU2,CMF,ARTIV + +BO_ 840 Dyn2_CMM: 8 CMM___Motor_SG + SG_ P165_FlFCD_stWtLvlSensDebVal : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P152_Gearbx_stGear : 4|4@1+ (1,0) [0|15] "-" Vector__XXX + SG_ P019_Com_trqPrp : 8|8@1+ (2,-100) [-100|410] "Nm" Vector__XXX + SG_ P211_AirC_pClnt : 16|8@1+ (1,110) [110|2904] "kpa" Vector__XXX + SG_ P017_Com_trqFrc : 24|8@1+ (2,-100) [-100|408] "Nm" Vector__XXX + SG_ P026_Com_bESPAck : 32|1@1+ (1,0) [0|0] "-" Vector__XXX + SG_ P025_Com_stESPErr : 33|2@1+ (1,0) [0|0] "-" Vector__XXX + SG_ P091_ConvCD_stDebVal : 35|2@1+ (1,0) [0|3] "-" Vector__XXX + SG_ P212_Comp_load_shed : 37|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ P134_Com_stEng : 40|4@1+ (1,0) [0|0] "-" Vector__XXX + SG_ P343_Com_bOBDErr : 49|1@1- (1,0) [0|0] "" Vector__XXX + SG_ P344_Com_bMILOn : 50|1@1- (1,0) [0|0] "" Vector__XXX + SG_ P345_Com_bMILBln : 51|1@1- (1,0) [0|0] "" Vector__XXX + SG_ P370_Com_bWUC : 52|1@1- (1,0) [0|0] "" Vector__XXX + SG_ P371_Com_bDrivingCycl : 53|1@1- (1,0) [0|0] "" Vector__XXX + SG_ P372_T15_st : 54|1@1- (1,0) [0|0] "" Vector__XXX + SG_ P207_Fan_rAct : 56|6@1+ (2,0) [0|100] "" Vector__XXX + SG_ P269_StSys_stStrtBVMPAuth : 62|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 841 Dyn_V2_BVMP: 8 BVA___Automatikgetriebe + SG_ P030_Gbx_stDrvTrnEgd : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P360_Com_stIntvTyp : 2|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ P440_Com_bUCAPSWkUpReqRaw : 5|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ P057_Com_xTrqTIIDes : 8|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P009_Com_bGearShftActv : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P362_Com_bGearShftExpt : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P333_Com_stGbxTrqIntv : 18|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P085_Com_bGbxACCmprShOff : 20|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P167_Com_stEngSpdCtl : 21|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P287_Com_stGearRat : 24|4@1+ (1,0) [0|15] "-" Vector__XXX + SG_ P283_Com_stGearTrgtPos : 28|4@1+ (1,0) [0|15] "-" Vector__XXX + SG_ P230_Com_ctTSCCntr : 51|4@0+ (1,0) [0|15] "-" Vector__XXX + SG_ P340_Com_xTSCChkSum : 55|4@0+ (1,0) [0|15] "-" Vector__XXX + SG_ P166_Com_nEngTSC : 56|8@1+ (25,750) [750|7075] "RPM" Vector__XXX + +BO_ 845 Dyn_CDS: 8 CDS___Fahrdynamikregelung + SG_ P047_Com_stESPIntv : 0|3@1+ (1,0) [0|7] "-" CMM___Motor_SG + SG_ P088_CutOffForbidden_OR_ESP_STATUS_INV : 3|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P147_Com_bESPIntvActv : 6|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P043_Com_xTCSStatRaw : 16|8@1+ (3,-150) [-150|612] "Nm" Vector__XXX + SG_ P044_Com_trqTCSRaw : 24|8@1+ (2,-100) [-100|410] "Nm" Vector__XXX + SG_ P045_Com_trqDCSRaw : 32|8@1+ (2,-100) [-100|410] "Nm" Vector__XXX + SG_ P157_Com_ctESP : 40|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P352_StbIntv_bTCSIntvActv : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P353_StbIntv_bESPExclvIntvActv : 52|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 904 Dyn_Veh: 7 CMM___Motor_SG + SG_ P060_vECU : 7|16@0+ (0.01,0) [0|655.34] "km/h" Vector__XXX + SG_ P062_sECU : 23|16@0+ (0.1,0) [0|6553.5] "m" Vector__XXX + SG_ P066_aECU : 32|8@1+ (0.08,-14) [-14|6.32] "m/s**2" Vector__XXX + +BO_ 909 HS2_DYN_ABR_38D: 8 UC_FREIN + SG_ VITESSE_VEHICULE_ROUES : 7|16@0+ (0.01,0) [0|655.34] "km/h" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ DISTANCE_ROUES : 23|16@0+ (0.1,0) [0|6553.5] "m" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ P052_Com_aLng : 32|8@1+ (0.08,-14) [-14|6.32] "m/s**2" Vector__XXX + SG_ ACCEL_LONGI_ROUES : 39|8@0+ (0.08,-14) [-14|6.32] "m/s2" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ CHECKSUM : 43|4@0+ (1,0) [0|7] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ COUNTER : 47|4@0+ (1,0) [0|15] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ VHL_MVT : 49|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ VVH_INDISP : 51|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ SENS_ROULAGE : 53|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ AUTOR_ARRET_HILL_STT : 54|1@0+ (1,0) [0|1] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ REQ_LAMPE_WARNING : 55|1@0+ (1,0) [0|1] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ HADC_FAULTY : 58|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ HADC_STATUS : 60|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ HADC_SPEED_CONDITION : 61|1@0+ (1,0) [0|1] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + SG_ HADC_CLUTCH_CONDITION : 63|2@0+ (1,0) [0|3] "" CMF,CMM,BV,BSI,HCU1,ARTIV,BVN,AVAS + +BO_ 941 Dyn_EasyMove: 8 CDS___Fahrdynamikregelung + SG_ P299_Com_bCrCtlInhib : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P337_Com_stPrkBrk : 24|3@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 968 Dyn_STT_CMM: 2 Vector__XXX + SG_ P412_Com_stDeadPnt : 2|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P428_Com_stCDTReq : 6|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 969 Dyn2_V2_BV: 6 BVA___Automatikgetriebe + SG_ P291_Com_trqMaxConv : 7|8@0+ (3,-150) [-150|615] "" Vector__XXX + SG_ P__Rapport_cible : 23|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ P230_Com_ctGbxCnt2 : 27|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ P340_Com_xChkSum2 : 31|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ P293_Com_stGbxEngShOff : 38|2@0+ (1,0) [0|3] "" Vector__XXX + +BO_ 973 Dyn2_FRE: 8 ABS___Antiblockiersystem + SG_ P226_Com_stBrkActv : 0|2@1+ (1,0) [0|4] "" Vector__XXX + SG_ P225_Com_stBrkRaw_0 : 37|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P224_Com_stBrkRaw_1 : 38|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ BRAKE_PRESSURE : 47|12@0+ (1,0) [0|0] "" Vector__XXX + SG_ P319_FrmMng_rClthPos : 56|8@1+ (0.5,0) [0|255] "%" Vector__XXX + +BO_ 1010 LANE_KEEP_ASSIST: 8 XXX + SG_ DRIVE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 15|4@0+ (1,0) [0|15] "" XXX + SG_ unknown2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ TORQUE : 31|11@0- (1,0) [0|2047] "" XXX + SG_ LANE_DEPARTURE : 33|2@0+ (1,0) [0|3] "" XXX + SG_ STATUS : 36|3@0+ (1,0) [0|3] "" XXX + SG_ LXA_ACTIVATION : 40|1@0+ (1,0) [0|1] "" XXX + SG_ TORQUE_FACTOR : 47|7@0+ (1,0) [0|127] "" XXX + SG_ SET_ANGLE : 55|14@0- (0.1,0) [-90|90] "" XXX + SG_ unknown4 : 57|1@0+ (1,0) [0|1] "" XXX + +BO_ 1042 Dat_BSI: 8 BSI___Kombiinstrument + SG_ P040_MainBrakeFault : 0|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P103_Com_bRevGear : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PARKING_BRAKE : 3|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ P013_MainBrake : 5|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P277_Com_bOilLvlDem : 10|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P298_Req_RTE_Ena : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P012_Com_bFlMin : 24|1@1+ (1,0) [0|0] "-" Vector__XXX + SG_ P086_Com_stFlLvlDia : 25|2@1+ (1,0) [0|3] "-" Vector__XXX + SG_ P328_Com_stEHRPmp : 27|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P104_Dspl_stAOHt : 30|2@1+ (1,0) [0|3] "-" CMM___Motor_SG + SG_ DRIVER_DOOR : 51|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ PASSENGER_DOOR : 52|1@0+ (1,0) [0|1] "" Vector__XXX + +BO_ 1069 NEW_MSG_42D: 4 XXX + SG_ COUNTER : 16|4@1+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 20|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_RELATED : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 1074 Dat_BSI1: 8 BSI___Kombiinstrument + SG_ P249_Com_stEngStopReq : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P216_Com_bSiaWkUp : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P214_Com_stMnWkUp : 6|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P402_Com_stStaDemActv : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P253_Com_bEngPrepReq : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P267_Exh_volRefl : 24|8@1+ (0.5,0) [0|255] "l" Vector__XXX + SG_ P276_Com_bOilWkUp : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P274_Exh_ctRefl : 40|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ P403_Com_stStaReq : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P439_Com_bUCAPSWkUpReqRaw : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P350_Com_bPstVtln : 46|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P368_Com_stMnSEVRaw : 48|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P367_Com_stCtxJDDRaw : 50|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ P369_Com_stElecNetRaw : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 1101 Vroues_ABR: 8 CDS___Fahrdynamikregelung + SG_ P330_VehV_vWhlRrL : 23|16@0+ (0.01,0) [0|655.34] "km/h" Vector__XXX + SG_ P331_VehV_vWhlRrR : 39|16@0+ (0.01,0) [0|655.34] "km/h" Vector__XXX + SG_ P354_VehV_nWhlAvrg : 55|16@0+ (0.04,0) [0|0] "rpm" Vector__XXX + +BO_ 1106 HS2_DAT_MDD_CMD_452: 6 BSI + SG_ LONGITUDINAL_REGULATION_TYPE : 1|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN + SG_ TURN_SIGNAL_STATUS : 5|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN + SG_ FRONT_WIPER_STATUS : 7|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN + SG_ SPEED_SETPOINT : 15|8@0+ (1,0) [0|255] "km/h" CMF,ARTIV,CMM,UC_FREIN + SG_ CHECKSUM_CONS_RVV_LVV2 : 17|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN + SG_ BRAKE_ONLY_CMD_BSI : 18|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN + SG_ LVV_ACTIVATION_REQ : 22|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN + SG_ RVV_ACC_ACTIVATION_REQ : 23|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN + SG_ ARC_HABIT_SENSITIVITY : 26|3@0+ (1,0) [0|7] "" CMF,ARTIV,CMM,UC_FREIN + SG_ ARC_HABIT_ACTIVATION_REQ : 27|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN + SG_ COUNTER : 31|4@0+ (1,0) [0|15] "" CMF,ARTIV,CMM,UC_FREIN + SG_ FRONT_WASH_STATUS : 32|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN + SG_ FORCE_ACTIVATION_HAB_CMD : 33|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN + SG_ INTER_VEHICLE_TIME_SETPOINT : 39|6@0+ (0.1,0) [0|6.1] "s" CMF,ARTIV,CMM,UC_FREIN + SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" CMF,ARTIV,CMM,UC_FREIN + SG_ COCKPIT_GO_ACC_REQUEST : 45|1@0+ (1,0) [0|1] "" CMF,ARTIV,CMM,UC_FREIN + SG_ ACC_PROGRAM_MODE : 47|2@0+ (1,0) [0|3] "" CMF,ARTIV,CMM,UC_FREIN + +BO_ 1128 Dyn3_CMM: 6 CMM___Motor_SG + SG_ P247_Com_stStaFunc : 3|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P246_Com_bStaPrt : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P245_Com_stRedBrkPlaus : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P244_Com_bSta : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P400_Com_stDrvTrnTx : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P401_Com_stStrtAuth : 10|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P234_Com_stAcvWarn : 13|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ P347_Alt_uSetPoint : 25|6@0+ (1,0) [0|63] "" Vector__XXX + SG_ P346_Alt_enumPwrProd : 26|3@1+ (1,0) [0|7] "-" Vector__XXX + SG_ P408_Com_bRly3CtlReq : 40|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1160 Dat_CMM: 8 CMM___Motor_SG + SG_ P005_CEngDst_tSens : 0|8@1+ (1,-40) [-40|214] "°C" Vector__XXX + SG_ P021_Com_volFlCons : 8|8@1+ (80,0) [0|20400] "mm^3" Vector__XXX + SG_ P022_Com_nSetPLo : 16|8@1+ (8,0) [0|2032] "1/min" Vector__XXX + SG_ P032_Com_bEngStrt : 24|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P031_GlwLmp_st : 25|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P105_Com_bTtLmp : 27|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P108_Fid_ComAddPmpLvl : 28|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P296_AOHt_stPmp : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P063_vehV_bXVVErr : 30|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P233_Fid_PFltDef_mp : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P053_ACCtl_stHys : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P051_ACCD_stPres : 33|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P154_PFlt_bPFltClnReq : 38|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P011_Oil_tSwmp : 40|8@1+ (1,-40) [-40|213] "" Vector__XXX + SG_ P056_ACCD_p : 48|8@1+ (25,0) [100|3100] "kPa" Vector__XXX + SG_ P158_Air_tAFS : 56|8@1+ (1,-40) [-40|214] "°C" Vector__XXX + +BO_ 1161 Dat_V2_BV: 8 BVA___Automatikgetriebe + SG_ P374_Com_bOBDRdy : 8|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ P029_Com_stPrg : 11|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ P282_Com_stGbxErr : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P375_Com_bMILDem : 16|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ P376_Com_bMILcntResDemRaw : 18|1@0+ (1,0) [0|1] "" Vector__XXX + SG_ P285_Com_bPNDia : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P218_Com_stDrvIdx : 48|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 1173 IS_DAT_DIRA: 4 PSCM + SG_ EPS_TORQUE : 7|8@0- (0.25,0) [-32|31.5] "Nm" Tester + SG_ ETAT_DA_2004 : 9|2@0+ (1,0) [0|3] "" Tester + SG_ ETAT_DA_DYN : 13|2@0+ (1,0) [0|3] "" Tester + SG_ ETAT_DA_2010 : 15|2@0+ (1,0) [0|3] "" Tester + SG_ TRQ_LIMIT_STATE : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ STEERWHL_HOLD_BY_DRV : 17|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ EPS_STATE_LKA : 20|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ AUTOR_ARRET_MOT_DA : 21|1@0+ (1,0) [0|1] "" Tester + SG_ STEERING_REBOOT_REQUEST : 23|1@0+ (1,0) [0|1] "" Tester + SG_ Reserved : 31|8@0+ (1,0) [0|255] "" Tester + +BO_ 1224 Etat_Crash: 3 BSI___Kombiinstrument + SG_ Reserved_1 : 7|8@0+ (1,0) [0|0] "-" Vector__XXX + SG_ P223_CrashInfo : 8|1@0+ (1,0) [0|0] "-" Vector__XXX + SG_ Reserved_2 : 23|8@0+ (1,0) [0|0] "-" Vector__XXX + +BO_ 1266 Dat3_BSI: 8 Vector__XXX + SG_ P434_Com_rBattChHiRes : 7|10@0+ (0.1,0) [0|100] "" Vector__XXX + SG_ P429_Com_stSOCInfoInvldRaw : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P435_Com_stUCAPRechCrntRaw : 10|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P438_Com_uBattIntRstnRaw : 23|10@0+ (0.01,0) [0|10.23] "" Vector__XXX + SG_ P437_Com_uBattOpnCir : 24|9@0+ (0.01,0) [0|14] "" Vector__XXX + SG_ P493_Com_stPrioVoltMin : 41|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ P490_Com_uVoltCtlProdMin : 47|6@0+ (1,0) [0|0] "" Vector__XXX + SG_ P494_Com_stPrioVoltMax : 49|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ P491_Com_uVoltCtlProdMax : 55|6@0+ (1,0) [0|0] "" Vector__XXX + SG_ P492_Com_uVarProdMax : 63|7@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1270 HS2_DAT_ARTIV_V2_4F6: 5 ARTIV + SG_ TIME_GAP : 7|8@0+ (0.1,0) [0|25.4] "s" RITCS,BSI,CMF + SG_ DISTANCE_GAP : 15|8@0+ (1,0) [0|253] "m" RITCS,BSI,CMF + SG_ RELATIVE_SPEED : 20|13@0+ (0.02,-70) [-70|70] "m/s" RITCS,BSI,CMF + SG_ ARTIV_SENSOR_STATE : 23|3@0+ (1,0) [0|0] "" RITCS,BSI,CMF + SG_ TARGET_DETECTED : 36|1@0+ (1,0) [0|0] "" RITCS,BSI,CMF + SG_ ARTIV_TARGET_CHANGE_INFO : 37|1@0+ (1,0) [0|0] "" RITCS,BSI,CMF + SG_ TRAFFIC_DIRECTION : 39|2@0+ (1,0) [0|0] "" RITCS,BSI,CMF + +BO_ 1293 Dat_ABR: 7 ABS___Antiblockiersystem + SG_ P351_Com_bABSIntvActv : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P415_Com_stABSSTTReqRaw : 52|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1294 Dat_CLIM: 8 BSI___Kombiinstrument + SG_ P050_Com_stAC : 0|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P209_Com_stACRaw : 1|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P433_Com_bCmptEngStopReqRaw : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P232_Com_stXVVChkSum : 4|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P046_Com_rFanClgDes : 8|6@1+ (2,0) [0|110] "%" Vector__XXX + SG_ P164_Com_stPFltFan : 14|2@1+ (1,0) [0|0] "" Vector__XXX + SG_ P144_Com_bPFltGlw : 17|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P189_Com_stEEMIdlDem : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P432_Com_bCmptEngRstrtReqRaw : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P417_Com_stDrvPrsRaw : 25|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P210_Com_pwrACDem : 32|8@1+ (25,0) [0|6350] "W" Vector__XXX + SG_ P208_Com_nACIdlDem : 40|8@1+ (8,0) [0|2032] "" Vector__XXX + SG_ P219_Com_xPrpReqRaw : 48|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P231_Com_ctBSIFrm : 56|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P222_Typ_PrpCtl_Req : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P221_Speed_setPoint_Typ : 61|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P220_Com_stPrpMsgRaw : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1362 DAT4_BSI_AEE2010: 8 Vector__XXX + SG_ P325_Com_tiEngOff : 7|32@0+ (1,0) [0|1000] "" Vector__XXX + SG_ P015_Com_lTotDst : 39|24@0+ (1,0) [0|16777215] "km" Vector__XXX + SG_ P326_Com_ctTmrRst : 63|8@0+ (1,0) [0|255] "" Vector__XXX + +BO_ 1375 ACQ_NEW_JDD: 1 Vector__XXX + SG_ P__JDD_Com_stFaultAck : 7|8@0+ (1,0) [0|255] "" Vector__XXX + +BO_ 1390 DRIVER: 6 XXX + SG_ NEW_SIGNAL_3 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ BRIGHTNESS_SETTING : 7|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 13|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL : 31|8@0+ (0.5,0) [0|99.5] "%" XXX + +BO_ 1394 RESTRAINTS: 8 XXX + SG_ PASSENGER_SEATBELT : 5|2@0+ (1,0) [0|3] "" XXX + SG_ DRIVER_SEATBELT : 7|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_1 : 23|11@0+ (1,0) [0|1] "" XXX + SG_ IGNITION : 32|1@0+ (1,0) [0|1] "" XXX + +BO_ 1416 Dat2_CMM: 8 CMM___Motor_SG + SG_ P275_EngOilLvl : 7|8@0- (3,0) [0|0] "" Vector__XXX + SG_ P268_AdPmp_volAddInjStp : 8|8@1+ (5,0) [0|255] "mm3" Vector__XXX + SG_ P278_Oil_stPSwmp : 16|1@1- (1,0) [0|1] "" Vector__XXX + SG_ P424_Com_bMMIClthReq : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P423_Com_bMMIStSpAvl : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P316_FlSys_volFlConsVirt : 24|8@1+ (80,0) [0|20400] "mm^3" Vector__XXX + SG_ P373_CoETS_rTrq : 32|8@1+ (0.39215686275,0) [0|100] "%" Vector__XXX + SG_ P414_Com_stSTTFunc : 40|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P338_EnvP_p : 42|5@1+ (15,685) [0|1120] "" Vector__XXX + SG_ P288_Com_bSVSLmp : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P366_CoEom_stEngOpm : 48|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P446_Com_bAuthAdPmp : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P425_Com_stVltgSysLd : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P422_Com_bSyncDlyStSp : 54|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P359_SITUATION_VIE : 58|3@0+ (1,0) [0|7] "" Vector__XXX + SG_ P358_SENS_CHGMT_RAP : 60|2@0+ (1,0) [0|3] "" Vector__XXX + SG_ P357_RAP_CIBLE_TRANSMIS : 63|3@0+ (1,0) [0|7] "" Vector__XXX + +BO_ 1423 Rep_Diag_OBC_DCDC: 7 XXX + +BO_ 1424 Req_Diag_OBC_DCDC: 3 XXX + +BO_ 1426 Dat6_BSI: 8 CMM___Motor_SG + SG_ P272_Com_rBattCh : 0|8@1+ (1,0) [0|100] "%" Vector__XXX + SG_ P273_Com_tBatt : 8|8@1+ (0.5,-30) [-30|97.5] "deg C" Vector__XXX + SG_ P418_Com_uBattRaw : 28|11@0+ (0.01,5) [5|25.47] "" Vector__XXX + SG_ P349_EEM_stAltCtlType : 29|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ P420_Com_stBattCrntMeasRaw : 40|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P419_Com_stSTTActvRaw : 44|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P421_Com_xBattCrnt : 55|16@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1458 Contexte1_5B2: 8 Vector__XXX + SG_ P146_Com_tEnvT : 16|8@1+ (0.5,-40) [-40|87] "°C" Vector__XXX + SG_ P100_Com_stAddPmpDef : 24|8@1+ (1,0) [0|255] "-" Vector__XXX + SG_ P__Com_stEOBD : 39|8@0+ (1,0) [0|255] "-" Vector__XXX + +BO_ 1475 NEW_MSG_5C3: 8 XXX + SG_ ESP_STATUS_RELATED_1 : 27|2@0+ (1,0) [0|3] "" XXX + SG_ ESP_STATUS_RELATED_2 : 28|1@0+ (1,0) [0|1] "" XXX + +BO_ 1544 EOBD_CMM: 8 CMM___Motor_SG + SG_ P__LID_No : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ P__Data1_PID : 8|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ P__Data2_PID : 16|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ P__Data3_PID : 24|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ P__Data4_PID : 32|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ P__Data5_PID : 40|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ P__Data6_PID : 48|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ P__Data7_PID : 56|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 1554 HS2_DAT7_BSI_612: 8 BSI + SG_ INH_ECLAIRAGE_VIRAGE_DYN : 5|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ INH_ECLAIRAGE_AUTOROUTE : 6|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ INH_DIURNE_ECLRGE : 7|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ ETAT_FEUX_CROIST : 9|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ ETAT_FEUX_ROUTE : 10|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ MODE_CONF_VEH : 13|2@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ CDE_CLG_ET_HDC : 15|2@0+ (1,0) [0|3] "" CMM,BV,BVN + SG_ MODE_ECO : 17|2@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ MODE_ASR_PLUS_SELECT : 19|2@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ DEF_FEU_ROUTE_G : 20|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ DEF_FEU_ROUTE_D : 21|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ DEF_FEU_CROISMNT_G : 22|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ DEF_FEU_CROISMNT_D : 23|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ INFO_NIV_CARB : 31|8@0+ (0.5,0) [0|127] "L" CMM,BV,BVN + SG_ U_PRED_DEMARRAGE : 34|11@0+ (0.01,0) [0|13] "V" CMM,BV,BVN + SG_ POS_DEFLEC_MOBILE : 38|3@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ INFO_REQ_OLVI_REAR_ACT : 39|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ UB_D_LIGNE_REL_RX : 49|1@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ D_LIGNE_REL_R2 : 52|3@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ D_LIGNE_REL_R1 : 55|3@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ CONFIG_VHL : 60|3@0+ (1,0) [0|0] "" CMM,BV,BVN + SG_ D_LIGNE_REL_R3 : 63|3@0+ (1,0) [0|0] "" CMM,BV,BVN + +BO_ 1610 Rep_Diag_CVM: 7 XXX + +BO_ 1666 Rep_Diag_VCU: 7 XXX + +BO_ 1670 Rep_Diag_HCU2: 7 XXX + +BO_ 1672 Rep_Diag_On_CAN_688: 8 Vector__XXX + +BO_ 1677 Rep_Diag_ABRASR: 7 XXX + +BO_ 1684 Rep_Diag_MSB: 7 XXX + +BO_ 1685 Rep_Diag_DIRECTN: 7 XXX + +BO_ 1686 Rep_Diag_ARTIV: 7 XXX + +BO_ 1697 Req_Diag_SCR: 3 XXX + +BO_ 1698 Req_Diag_VCU: 3 XXX + +BO_ 1702 Req_Diag_HCU2: 3 XXX + +BO_ 1704 Req_Diag_On_CAN_6A8: 8 Vector__XXX + +BO_ 1705 Req_Diag_BOITEVIT: 3 XXX + +BO_ 1709 Req_Diag_ABRASR: 3 XXX + +BO_ 1716 Req_Diag_MSB: 3 XXX + +BO_ 1717 Req_Diag_DIRECTN: 3 XXX + +BO_ 1718 Req_Diag_ARTIV: 3 XXX + +BO_ 1719 Req_Diag_CORPRO: 3 XXX + +BO_ 1722 Req_Diag_CONV_PUIS: 3 XXX + +BO_ 1792 Req_Diag_BMF_UDS_CQCA: 8 XXX + +BO_ 1793 Req_Diag_COMBINE_UDS_CQCA: 8 XXX + +BO_ 1810 Rep_Diag_BAAST: 8 XXX + +BO_ 1815 Rep_Diag_CTPA: 8 XXX + +BO_ 1824 Req_Diag_BSP: 8 XXX + +BO_ 1840 Req_Diag_CPL_MOTED_SUSPVAR: 8 XXX + +BO_ 1842 Req_Diag_BAAST_BAASL_FEU_AR_C_CCE: 8 XXX + +BO_ 1847 Req_Diag_CTPA: 4 XXX + +BO_ 1856 Req_Diag_IDB: 8 XXX + +BO_ 1858 Req_Diag_HDC: 8 XXX + +BO_ 1859 Req_Diag_AFFICHEUR_LVDS_BD: 8 XXX + +BO_ 1860 Req_Diag_AIRBAG: 8 XXX + +BO_ 1862 Req_Diag_RHF: 8 XXX + +BO_ 1866 Req_Diag_CVM_CPL: 3 XXX + +BO_ 1871 Req_Diag_AVM_AVE: 8 XXX + +BO_ 1872 Req_Diag_PDSP_DCU_FD_AUTDEM_BML_ES_CSP: 8 XXX + +BO_ 1875 Req_Diag_RETRO_INT: 8 XXX + +BO_ 1879 Req_Diag_BDMAR_DCU_RL: 8 XXX + +BO_ 1888 Req_Diag_AUTORADIO: 8 XXX + +BO_ 1889 Req_Diag_BMU_IVC_D: 8 XXX + +BO_ 1892 Req_Diag_TELEMAT: 8 XXX + +BO_ 1896 BSI_FaultLog: 8 CMM___Motor_SG + SG_ P__BSI_FaultLog_Header : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P__BSI_FaultLog_DTC1 : 8|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P__BSI_FaultLog_DTC2 : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P__BSI_FaultLog_Env1 : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P__BSI_FaultLog_Env2 : 32|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P__BSI_FaultLog_Env3 : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P__BSI_FaultLog_Env4 : 48|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ P__BSI_FaultLog_Env5 : 56|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 1906 FaultLog_Ack: 1 BSI___Kombiinstrument + SG_ P__FaultLog_Ack : 0|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 1922 Req_Diag_CMB: 8 XXX + +BO_ 1927 Req_Diag_TRANSMISSION: 8 XXX + +BO_ 1928 Supv_CMM: 8 CMM___Motor_SG + SG_ P073_SupervisionFaultCodes : 7|8@0+ (1,0) [0|255] "-" Vector__XXX + SG_ P071_ConfirmedAbsentFlags : 15|32@0+ (1,0) [0|4294967295] "-" Vector__XXX + SG_ P284_T15CD_stPart : 43|12@0+ (1,0) [0|4095] "" Vector__XXX + SG_ P242_T15CD_stElec : 44|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 1942 HS2_SUPV_ARTIV_796: 8 ARTIV + SG_ FAULT_CODE : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ STATUS_NO_CONFIG : 15|32@0+ (1,0) [0|0] "" Vector__XXX + SG_ STATUS_PARTIAL_WAKEUP_GMP : 43|16@0+ (1,0) [0|0] "" Vector__XXX + SG_ UCE_ELECTR_STATE : 47|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1953 Rep_Diag_BMF_CAN_MMC_2: 8 XXX + +BO_ 1968 Req_Diag_BMF_CAN_FIAT_CONBINE_CAN_FIAT_SUSPVAR: 8 XXX + +BO_ 2015 Req_EOBD_On_Can_7DF: 8 Vector__XXX + +BO_ 2016 Req_Diag_INJ_T: 8 Vector__XXX + +BO_ 2024 Rep_Diag_INJ_T: 8 Vector__XXX + +BO_ 3221225472 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX + SG_ Code : 0|5@0+ (1,0) [0|0] "" Vector__XXX + SG_ ConfIdCde : 0|11@0+ (1,0) [0|0] "" Vector__XXX + SG_ ConfIdStatus : 0|11@0+ (1,0) [0|0] "" Vector__XXX + SG_ Data0 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Data1 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Data2 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Data3 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Data4 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Data5 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Data6 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Data7 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Diagnostic_On_Can : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Edge : 0|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ GetConfIdCde : 0|11@0+ (1,0) [0|0] "" Vector__XXX + SG_ GetConfIdStatus : 0|11@0+ (1,0) [0|0] "" Vector__XXX + SG_ IdPert : 0|11@0+ (1,0) [0|0] "" Vector__XXX + SG_ Input1 : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ Input2 : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ Input3 : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ Input4 : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ Local_ID : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Mask0 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Mask1 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Mask2 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Mask3 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Mask4 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Mask5 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Mask6 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Mask7 : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MaskIdPert : 0|11@0+ (1,0) [0|0] "" Vector__XXX + SG_ NumScenario : 0|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ Output0 : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ Output1 : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ Output2 : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ Output3 : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ OutputNumber : 0|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ P004_ActualTorqueNoGearbox : 0|8@1+ (2,-100) [-100|408] "Nm" Vector__XXX + SG_ P013_Com_stBrk1 : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P028_Gbx_stEOBDFault : 0|4@1+ (1,0) [0|15] "-" Vector__XXX + SG_ P033_sABS : 0|16@0+ (0.1,0) [0|6553.5] "m" Vector__XXX + SG_ P040_Com_stBrkRaw1 : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P041_Cde_RVV : 0|2@1+ (1,0) [0|3] "-" Vector__XXX + SG_ P049_Com_bMIL : 0|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P051_ACCD_stPres : 0|2@1+ (1,0) [0|3] "-" Vector__XXX + SG_ P053_ACCtl_stHys : 0|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P055_Com_trqTCSAbs : 0|8@1+ (2,-100) [-100|408] "Nm" Vector__XXX + SG_ P069_Act_RVV : 0|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P084_CoDT_trqGearbxDes : 0|8@1+ (2,-100) [-100|408] "Nm" Vector__XXX + SG_ P087_Com_stClth : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P093_Temp_aval_FAP : 0|8@1+ (4,-40) [0|255] "°C" Vector__XXX + SG_ P095_EngPrt_stOvrSpd : 0|2@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P101_Com_mAddPmpTot : 0|16@0+ (0.05,0) [0|3276.5] "g" Vector__XXX + SG_ P107_Com_stAddPmpLvl : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P128_Forcage_Encl_GMV : 0|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P133_StSys_stEngSTT2Rls : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P135_StSys_stAR2s : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P145_Saturation_Active : 0|1@1+ (1,0) [0|1] "-" Vector__XXX + SG_ P227_Pwr_Gen_Support_state : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P229_Com_xTCChkSum : 0|4@1+ (1,0) [0|0] "" Vector__XXX + SG_ P243_FrmMng_stFlCnsmp_mp : 0|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ P248_StarterStopReq : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P250_MajorStartRequest : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P251_Com_stScndStrtReq : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P252_ImpluseStart : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P255_Com_tiSec : 0|20@0+ (1,0) [0|0] "" Vector__XXX + SG_ P256_Com_tiDay : 0|12@0+ (1,0) [0|0] "" Vector__XXX + SG_ P257_Com_tiYr : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ P261_PCH_WakeUP : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P268_AddPmpCD_volAddInjStp : 0|8@1+ (10,0) [0|255] "" Vector__XXX + SG_ P284_T15CD_stPart_byte6 : 0|4@0+ (1,0) [0|15] "" Vector__XXX + SG_ P284_T15CD_stPart_byte8 : 0|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P290_StSys_stGlwAuth : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P292_FrmMng_stGearTrqReq : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P296_Fans_bEHRPmpReq : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P297_RTE_Fun_StErr : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P298_Com_stEHRCtl : 0|1@1- (1,0) [0|1] "" Vector__XXX + SG_ P308_EOBD_Rediness : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P314_VehDa_stTrqMax : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P315_VehDa_stEngSpdMax : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P317_FrmMng_dtBVMPChkSum : 0|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P318_FrmMng_ctBVMPCntr : 0|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ P325_Com_tiEngOffLSB : 0|16@1+ (1,0) [0|65535] "" Vector__XXX + SG_ P325_Com_tiEngOffMSB : 0|16@1+ (1,0) [0|65535] "" Vector__XXX + SG_ P348_Alt_bFault : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P361_Com_stTscEngDemTyp : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P363_Com_trqRelCrSConv : 0|8@1- (3,-150) [0|0] "Nm" Vector__XXX + SG_ P364_Gbx_nGbxIPSpeedFlt : 0|12@0+ (2,0) [0|0] "rpm" Vector__XXX + SG_ P399_Com_stProd : 0|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ P405_Com_stRly1DiagRaw : 0|3@1- (1,0) [0|7] "" Vector__XXX + SG_ P407_Com_stRly2DiagRaw : 0|3@1- (1,0) [-4|3] "" Vector__XXX + SG_ P416_Com_bStSpCabReqRaw : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ P427_Com_stBattTypEstRaw : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ P436_Com_uPrdcVltgStrtRaw : 0|11@0+ (0.01,0) [0|13] "" Vector__XXX + SG_ Rate : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Reserved_1 : 0|16@1+ (1,0) [0|255] "-" Vector__XXX + SG_ VersionActel : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VersionBaudRate : 0|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ VersionDate : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VersionInput : 0|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ VersionMajor : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VersionMinor : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VersionMode : 0|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ VersionMonth : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VersionYear : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ code : 0|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ commande : 0|5@0+ (1,0) [0|0] "" Vector__XXX + +CM_ BO_ 114 "ID 072: Unlock Request Frame or LockingStatus (Event triggered)"; +CM_ SG_ 114 ADC2_Req_Status "Unlock request"; +CM_ SG_ 114 ADC2_Seed_Byte3 "SEED1 of RQD_CMM (highest byte)"; +CM_ SG_ 114 ADC2_Seed_Byte2 "SEED2 of RQD_CMM (high byte)"; +CM_ SG_ 114 ADC2_Seed_Byte1 "SEED3 of RQD_CMM (low byte)"; +CM_ SG_ 114 ADC2_Seed_Byte0 "SEED4 of RQD_CMM (lowest byte)"; +CM_ BO_ 146 "Trame BSI Êmise toutes les 100 ms pendant 1 seconde."; +CM_ BO_ 168 "ID A8: Unlock Permission Frame Code (Period time 10 ms)"; +CM_ SG_ 168 ADC2_Key_Status "Unlock permission"; +CM_ SG_ 168 ADC2_Key_Byte3 "KEY1 of CFD_BSI (highest byte)"; +CM_ SG_ 168 ADC2_Key_Byte2 "KEY2 of CFD_BSI (high byte)"; +CM_ SG_ 168 ADC2_Key_Byte1 "KEY3 of CFD_BSI (low byte)"; +CM_ SG_ 168 ADC2_Key_Byte0 "KEY4 of CFD_BSI (lowest byte)"; +CM_ BO_ 264 "ID 108: ECM Version Frame - Vers_CMM (Period: Single shot) + +Le contenu de la trame est une recopie d'un sous-ensemble de la zone d'identification de la Flash Eprom dÊfinie dans le document Application flash EPROM 2000 ref. 96.285.582.9."; +CM_ SG_ 264 P076_System "P076 system version"; +CM_ SG_ 264 P077_Day "P077 Date: day of the version"; +CM_ SG_ 264 P078_Month "P078 Date: month of the version"; +CM_ SG_ 264 P079_Year "P079 Date: year of the version"; +CM_ SG_ 264 P080_Application "P080 supplier application"; +CM_ SG_ 264 P081_Version "P081 Software version"; +CM_ SG_ 264 P082_Edition "P082 Software issue"; +CM_ SG_ 264 P083_Calibration "P083 Calibration issue"; +CM_ BO_ 520 "ID 208: Engine Dynamic Frame (Period time 10 ms)"; +CM_ SG_ 520 P000_Com_nEng "P000 Motordrehzahl"; +CM_ SG_ 520 P003_Com_trqActOut "P003 Actual torque"; +CM_ SG_ 520 P002_Com_rAPP "P002 rueckgerechnete PWG-Stellung"; +CM_ SG_ 520 P027_ACCtl_stLogicOut "P027 Klimakompressor Status ein/aus"; +CM_ SG_ 520 P014_Brk_stRed "P014 Redundanter Bremskontakt"; +CM_ SG_ 520 P037_VehV_stXVV "P037 Zustand des FGR (Ein/Aus,Ueberdruecken)"; +CM_ SG_ 520 P153_Com_bTrqInacc "P153: Indicates to the torque consumers that the accuracy of the +torque data output is not guaranteed by the CMM."; +CM_ SG_ 520 P042_Inm_bCanMon "P042 CAN-Fehlerbehandlung im Startfall mit Hilfe der + Startendekennung unterdrÃŧcken"; +CM_ SG_ 520 P127_EGT_st_Bit30 "P127: Regeneration aid by electric consumers (engine load increase)."; +CM_ SG_ 520 P198_ActMod_trqClthTraIntv "P084 Vorweggenommenes Drehmoment"; +CM_ SG_ 694 ACC_STATUS "Indicates the operational state of the ACC system."; +CM_ SG_ 694 DYN_ACC_CHECKSUM "CHK_INI = 0x3"; +CM_ SG_ 694 DYN_ACC_PROCESS_COUNTER "This counter increments from 0 to 15 at each activation of the calculation process."; +CM_ SG_ 757 ANGLE "asymmetric, could be init"; +CM_ SG_ 758 CHECKSUM_TRANSM_DYN_ACC2 "CHK_INI = 0x7"; +CM_ SG_ 758 PROCESS_COUNTER_4B_ACC2 "This counter increments from 0 to 15 at each activation of the calculation process."; +CM_ SG_ 773 ANGLE "-565 to 560, seems like estimate and not init"; +CM_ SG_ 773 RATE_SIGN "1=moving clockwise, 0=moving anticlockwise"; +CM_ SG_ 773 0_CHECKSUM "TODO: find checksum"; +CM_ BO_ 840 "ID 348: Engine Dynamic Frame 2 (Period time 20 ms)"; +CM_ SG_ 840 P165_FlFCD_stWtLvlSensDebVal "P165: Water in fuel indication (1 = water in fuel detected / 0 = no water in fuel)"; +CM_ SG_ 840 P152_Gearbx_stGear "P152: Gear detected by ratio vehicule speed to engine speed"; +CM_ SG_ 840 P019_Com_trqPrp "P019 Requested torque before processing."; +CM_ SG_ 840 P211_AirC_pClnt "P084 Vorweggenommenes Drehmoment"; +CM_ SG_ 840 P017_Com_trqFrc "P017 Torque lost by AC, friction, high pressure pump and acsessories."; +CM_ SG_ 840 P026_Com_bESPAck "P026 TCS/DCS (ASR/MSR) acknowledgement by engine ECU +(1 = communication correct)"; +CM_ SG_ 840 P025_Com_stESPErr "P025 TCS/DCS (ASR/MSR) request state"; +CM_ SG_ 840 P091_ConvCD_stDebVal "P091 clutch pedal switch and status"; +CM_ SG_ 840 P212_Comp_load_shed "Compressor load shedding command"; +CM_ SG_ 840 P134_Com_stEng "Engine status"; +CM_ BO_ 841 "ID 349: Gearbox Synchronisation Frame (Period time 20 ms)"; +CM_ SG_ 841 P009_Com_bGearShftActv "P057 Gearbox torque request"; +CM_ SG_ 841 P085_Com_bGbxACCmprShOff "P085 AC compressor inhibit"; +CM_ SG_ 841 P167_Com_stEngSpdCtl "P009 shift in progress"; +CM_ SG_ 841 P287_Com_stGearRat "P008 transmission range engaged"; +CM_ SG_ 841 P283_Com_stGearTrgtPos "P087 gearbox converter state"; +CM_ SG_ 841 P230_Com_ctTSCCntr "P048 fan request for gearbox"; +CM_ SG_ 841 P340_Com_xTSCChkSum "P097 request to increase the idle speed"; +CM_ SG_ 841 P166_Com_nEngTSC "P055 torque limitation for gearbox"; +CM_ BO_ 845 "ID 34D: ESP Synchronisation frame (Period time 20 ms)"; +CM_ SG_ 845 P047_Com_stESPIntv "P047 ESP torque request status"; +CM_ SG_ 845 P088_CutOffForbidden_OR_ESP_STATUS_INV "P088 Cut off of injection is forbidden."; +CM_ SG_ 845 P147_Com_bESPIntvActv "P147 ESP-TCS (ASR) in regulation"; +CM_ SG_ 845 P043_Com_xTCSStatRaw "P043 TCS (ASR) static torque request = max. threshold"; +CM_ SG_ 845 P044_Com_trqTCSRaw "P044 TCS (ASR) dynamic torque request"; +CM_ SG_ 845 P045_Com_trqDCSRaw "P045 DCS (MSR) torque request = min. threshold"; +CM_ SG_ 845 P157_Com_ctESP "P157 Check counter"; +CM_ BO_ 904 "ID 388: Engine Dynamic Frame 3 (Period time 40ms)"; +CM_ SG_ 904 P060_vECU "P060 velocity by engine ECU"; +CM_ SG_ 904 P062_sECU "P062 odometer by engine ECU"; +CM_ SG_ 904 P066_aECU "P066 longitudinal acceleration by engine ECU"; +CM_ BO_ 909 "ID 38D: ABS Vehicle Dynamic Frame (Period time 40 ms)"; +CM_ SG_ 909 P052_Com_aLng "P052 longitudinal acceleration (FrmMng_a)"; +CM_ BO_ 969 "Pour application MCP SSTG"; +CM_ SG_ 1010 TORQUE "Set to ~2043 when active"; +CM_ SG_ 1010 LANE_DEPARTURE "UNUSED in HDA"; +CM_ SG_ 1010 STATUS "0=LKA OFF (button in console)"; +CM_ SG_ 1010 LXA_ACTIVATION "Set = 0, no activity seen in routes"; +CM_ BO_ 1042 "ID 412: Body Car Data Frame (Period time 50 ms)"; +CM_ SG_ 1042 P040_MainBrakeFault "P040 Main brake switch is defect."; +CM_ SG_ 1042 P103_Com_bRevGear "P013 main brake signal"; +CM_ SG_ 1042 P013_MainBrake "P013 main brake signal"; +CM_ SG_ 1042 P012_Com_bFlMin "P012 Minimum fuel level detected. If fuel level < 15 % signal P012 will be set to one."; +CM_ SG_ 1042 P086_Com_stFlLvlDia "P086 Minimum fuel level diagnosis status. (00 Minimum fuel is valid / 01 Minimum fuel is not valid / others are not defined)"; +CM_ SG_ 1042 P104_Dspl_stAOHt "P104 Ansteuerung Zusatzheizer"; +CM_ SG_ 1074 P249_Com_stEngStopReq "Engine stop request"; +CM_ SG_ 1074 P216_Com_bSiaWkUp "Immobilizer anticipation with wake up"; +CM_ SG_ 1074 P214_Com_stMnWkUp "Main wake-up (RCD )"; +CM_ SG_ 1074 P253_Com_bEngPrepReq "Engine preparation request"; +CM_ BO_ 1101 "ID 44D: Rear unfiltered wheel speeds, used for EasyMove"; +CM_ SG_ 1101 P330_VehV_vWhlRrL "P010 vehicle speed of ABS. This signal is loaded into VSSCD_v"; +CM_ SG_ 1101 P331_VehV_vWhlRrR "P010 vehicle speed of ABS. This signal is loaded into VSSCD_v"; +CM_ SG_ 1106 LONGITUDINAL_REGULATION_TYPE "Defines if the system is in RVV (Vehicle Speed Governor) or LVV (Vehicle Speed Limiter) or ACC (Adaptive Cruise Control) or without regulation."; +CM_ SG_ 1106 FRONT_WIPER_STATUS "Emitted when the rain sensor is active."; +CM_ SG_ 1106 SPEED_SETPOINT "Setpoint or limit: based on the value of the 'requested speed type' bit."; +CM_ SG_ 1106 CHECKSUM_CONS_RVV_LVV2 "Used to secure the RVV or LVV setpoint sent via the CAN network (signal SPEED_SETPOINT)."; +CM_ SG_ 1106 CHECKSUM "CHK_INI = 0xB"; +CM_ SG_ 1128 P247_Com_stStaFunc "CMM DAMP function state"; +CM_ SG_ 1128 P246_Com_bStaPrt "Starter protection"; +CM_ SG_ 1128 P245_Com_stRedBrkPlaus "Uncertain redendant brake contact"; +CM_ SG_ 1128 P244_Com_bSta "Starter state"; +CM_ BO_ 1160 "ID 488: Engine Data Frame (Period time 100 ms)"; +CM_ SG_ 1160 P005_CEngDst_tSens "P005 Wassertemperatur"; +CM_ SG_ 1160 P021_Com_volFlCons "P021 Kraftstoffverbrauch"; +CM_ SG_ 1160 P032_Com_bEngStrt "P032 Zustand Motor"; +CM_ SG_ 1160 P031_GlwLmp_st "P031 Ansteuerung Gluehanzeige"; +CM_ SG_ 1160 P105_Com_bTtLmp "P105 Temperaturwarnlampe: ein/aus"; +CM_ SG_ 1160 P108_Fid_ComAddPmpLvl "P106 Temperaturwarnlampe : blinken"; +CM_ SG_ 1160 P063_vehV_bXVVErr "P063 FGR-Fehler"; +CM_ SG_ 1160 P154_PFlt_bPFltClnReq "P154: Tell-tale lamp for \"risk of clogged filter\""; +CM_ SG_ 1160 P056_ACCD_p "P056 Kältemitteldruck"; +CM_ SG_ 1160 P158_Air_tAFS "P158: Intake air temperature."; +CM_ BO_ 1224 "ID 4C8: Crash status by Airbag Control (Event triggered / Period time 50 ms)"; +CM_ SG_ 1224 P223_CrashInfo "Crash Information"; +CM_ BO_ 1294 "ID 50E: Body Car & Air Conditioning Data Frame (Period time 100 ms)"; +CM_ SG_ 1294 P050_Com_stAC "P050 Fahrerwunsch Klimakompressor ein/aus ermitteln"; +CM_ SG_ 1294 P164_Com_stPFltFan "P164: Fan speed setpoint increase"; +CM_ BO_ 1362 "Trame utilisable uniquement sur vÊhicules en archi EE 2010 + +cette trame est Êmise toutes les 100ms pendant 1seconde puis toutes les secondes"; +CM_ SG_ 1362 P015_Com_lTotDst "P015: covered distance from dashboard"; +CM_ BO_ 1375 "trame utilisable uniquement pour le JDD en archi EE 2010"; +CM_ SG_ 1390 GAS_PEDAL "Max 99.5%"; +CM_ SG_ 1394 IGNITION "doesn't turn off straight away"; +CM_ BO_ 1458 "trame utilisable uniquement sur vÊhicules en archi EE 2010"; +CM_ SG_ 1458 P146_Com_tEnvT "P146: Environment air temperature"; +CM_ SG_ 1458 P100_Com_stAddPmpDef "P100: Status of additive for FAP"; +CM_ SG_ 1458 P__Com_stEOBD "Pxxx: EOBD relevant errors in the network"; +CM_ BO_ 1554 "trame consommÊe uniquement sur vÊhicules en archi EE 2010"; +CM_ BO_ 1610 "CVM_3, CVM_2, CVM"; +CM_ BO_ 1666 "VCU_EMS8000, E_VCU"; +CM_ BO_ 1670 "HCU2"; +CM_ BO_ 1677 "ABS81, ESP81, ABS8_BOSCH, ESP8_BOSCH, ESP90, ABSMK100, ESPMK100, ESP_KP1, ABS_KP1, ASC, ABS, ESP, ABS80, ESP80, ASR80, ABS90_D, ESP90_D, ESP90_F, ESPMK100_UDS, ESP_EBC_440_CAN, ESP_EBC_440_K, ESP_EBC_440, ABSMK70_1, ESPMK60_O, ABSMK100_UDS, ABS90_T, ABS_8_0_C1, ESP_8_0_C1, ABS_4x4, ESP_4x4, ABS81_BOSCH, ESP81_BOSCH, ABS90_F, RBV"; +CM_ BO_ 1684 "TBMU, TBMU_PHEV, BMU_CTE1"; +CM_ BO_ 1685 "GEP, DAE_BVH2, DAE, DAE_A515, DAE_UDS, EPS, SSCU, DAE_D, GEP_UDS, EPS_T"; +CM_ BO_ 1686 "ARTIV, RADAR_AV_4, LIDAR, ARTIV_UDS"; +CM_ BO_ 1704 "Le mÊcanisme d'Êmission utilisÊ est ÊvÊnementiel de l'outil vers le calculateur via la BSI +Trame question pour le tÊlÊchargement et le Diag On CAN."; +CM_ BO_ 1810 "BAAST"; +CM_ BO_ 1815 "CTPA"; +CM_ BO_ 1906 "Le mÊcanisme d'Êmission utilisÊ est ÊvÊnementiel de la BSI vers le CMM. + +Trame d'acquittement du Journal Des DÊfauts BSI."; +CM_ BO_ 1928 "ID 788: CMM Supervision Frame (Period time 1000 ms)"; +CM_ SG_ 1928 P073_SupervisionFaultCodes "P073 Supervision fault codes"; +CM_ SG_ 1928 P071_ConfirmedAbsentFlags "P071 confirmed absent status flags of the ECU"; +CM_ SG_ 1928 P284_T15CD_stPart "ECU electronic state"; +CM_ SG_ 1928 P242_T15CD_stElec "ECU electronic state"; +CM_ BO_ 1953 "BSI"; +CM_ BO_ 2015 "Le mÊcanisme d'Êmission utilisÊ est ÊvÊnementiel de l'outil branchÊ sur le rÊseau Can vers les calculateurs. + +Trame question EOBD On Can adresse a tous les calculateurs"; +CM_ BO_ 2016 "Le mÊcanisme d'Êmission utilisÊ est ÊvÊnementiel de l'outil branchÊ sur le rÊseau Can vers le CMM + +Trame question EOBD On Can adresse au CMM +ECU Family: INT_J"; +CM_ BO_ 2024 "Le mÊcanisme d'Êmission utilisÊ est ÊvÊnementiel du CMM vers l'outil branchÊ sur le rÊseau Can + +Trame rÊponse EOBD On Can du CMM + +ECU Family: INJ_T"; +CM_ BO_ 3221225472 "This is a message for not used signals, created by Vector CANdb++ DBC OLE DB Provider."; +CM_ SG_ 3221225472 P004_ActualTorqueNoGearbox "P004 Actual torque before torque intervention by automatic gearbox"; +CM_ SG_ 3221225472 P028_Gbx_stEOBDFault "P028 MIL request gearbox"; +CM_ SG_ 3221225472 P033_sABS "P033 odometer"; +CM_ SG_ 3221225472 P041_Cde_RVV "P041 FGR-Bedienteilinfo"; +CM_ SG_ 3221225472 P049_Com_bMIL "P049 Ansteuerung DIA-Lampe"; +CM_ SG_ 3221225472 P051_ACCD_stPres "P051 Abschaltung Klimakompressor wegen Ueber- oder +Unterdruck im Kaeltemittelkreislauf"; +CM_ SG_ 3221225472 P053_ACCtl_stHys "P053 Abschaltung Klimakompressor aus Sicherheitsgruenden +oder wegen Komfortfunktionen"; +CM_ SG_ 3221225472 P069_Act_RVV "P069 FGR-Hauptschalter"; +CM_ SG_ 3221225472 P084_CoDT_trqGearbxDes "P084 Vorweggenommenes Drehmoment"; +CM_ SG_ 3221225472 P087_Com_stClth "Clutch signal for AM6"; +CM_ SG_ 3221225472 P093_Temp_aval_FAP "P093 FAP-Temperatur"; +CM_ SG_ 3221225472 P101_Com_mAddPmpTot "P101: absolute Menge des eingespritztem Additivs (Cerium)"; +CM_ SG_ 3221225472 P107_Com_stAddPmpLvl "P107 Minimum of FAP additive exeeded"; +CM_ SG_ 3221225472 P227_Pwr_Gen_Support_state "P165: Water in fuel indication (1 = water in fueel detected / 0 = no water in fuel)"; +CM_ SG_ 3221225472 P243_FrmMng_stFlCnsmp_mp "P155: Preparation of glow activation."; +CM_ SG_ 3221225472 P248_StarterStopReq "starter stop request"; +CM_ SG_ 3221225472 P250_MajorStartRequest "Main latch starting request"; +CM_ SG_ 3221225472 P251_Com_stScndStrtReq "Secondary latched starting request"; +CM_ SG_ 3221225472 P252_ImpluseStart "Momentary starting request"; +CM_ SG_ 3221225472 P284_T15CD_stPart_byte6 "ECU electronic state"; +CM_ SG_ 3221225472 P284_T15CD_stPart_byte8 "ECU electronic state"; +CM_ SG_ 3221225472 Reserved_1 "P074 Number of BusOff in driving cycle"; +VAL_ 461 ESP_STATUS 0 "DISABLED" 1 "ENABLED"; +VAL_ 461 ESP_STATUS_INV 0 "ENABLED" 1 "DISABLED"; +VAL_ 694 POTENTIAL_WHEEL_TORQUE_REQUEST 0 "Not requested" 1 "Requested in GMP mode" 2 "Requested in Brake mode" 3 "Not used"; +VAL_ 694 ACC_STATUS 0 "Initialization" 1 "OFF" 2 "Inhibited" 3 "Waiting" 4 "Active" 5 "Suspended" 6 "Brake only" 7 "Wait ramp" 8 "Reserved" 9 "Reserved" 10 "Reserved" 11 "Reserved" 12 "Reserved" 13 "Reserved" 14 "Reserved" 15 "Fault"; +VAL_ 694 WHEEL_TORQUE_REQUEST 0 "Not requested" 1 "High range requested" 2 "Low range requested" 3 "Not used"; +VAL_ 694 AUTO_BRAKING_STATUS 0 "Unavailable" 1 "Initialization" 2 "Not used" 3 "Inhibited" 4 "Not used" 5 "Waiting" 6 "Active" 7 "Fault"; +VAL_ 694 MDD_DECEL_TYPE 0 "No braking" 1 "ACC" 2 "FA_HV (high-speed automatic braking) / AFUi braking" 3 "FA_BV (low-speed automatic braking) / FARC2 braking"; +VAL_ 694 MDD_DECEL_CONTROL_REQ 0 "No UCF control request" 1 "UCF control request"; +VAL_ 694 GEAR_TYPE 0 "Downshift" 1 "Upshift"; +VAL_ 694 PREFILL_REQUEST 0 "No prefill request" 1 "Prefill request"; +VAL_ 728 ESP_STATUS_RELATED 0 "DISABLED" 1 "ENABLED"; +VAL_ 728 ESP_STATUS_RELATED_INV 0 "ENABLED" 1 "DISABLED"; +VAL_ 758 TARGET_DETECTED 0 "initialization or no target detected" 1 "target detected"; +VAL_ 758 REQUEST_TAKEOVER 0 "No request" 1 "Non-critical request" 2 "Critical request" 3 "Invalid"; +VAL_ 758 BLIND_SENSOR 0 "False" 1 "True"; +VAL_ 758 REQ_VISUAL_COLL_ALERT_ARC 0 "no visual alert request" 1 "visual alert request"; +VAL_ 758 REQ_AUDIO_COLL_ALERT_ARC 0 "no audio alert request" 1 "audio alert request"; +VAL_ 758 REQ_HAPTIC_COLL_ALERT_ARC 0 "no haptic alert request" 1 "haptic alert request"; +VAL_ 758 ARC_STATUS 0 "unavailable" 1 "not used" 2 "not used" 3 "initialization" 4 "not used" 5 "not used" 6 "inhibited" 7 "not used" 8 "not used" 9 "not used" 10 "waiting" 11 "not used" 12 "active" 13 "not used" 14 "not used" 15 "fault"; +VAL_ 758 AUTO_BRAKING_IN_PROGRESS 0 "no braking in progress" 1 "braking in progress"; +VAL_ 758 AEB_ENABLED 0 "FALSE" 1 "TRUE"; +VAL_ 758 DRIVE_AWAY_REQUEST 0 "No drive away required" 1 "Drive away required"; +VAL_ 758 MDD_DECEL_CONTROL_REQ 0 "no UCF control request" 1 "UCF control request"; +VAL_ 758 AUTO_BRAKING_STATUS 0 "unavailable" 1 "initialization" 2 "not used" 3 "inhibited" 4 "not used" 5 "waiting" 6 "active" 7 "fault"; +VAL_ 758 TARGET_POSITION 0 "POS1" 1 "POS2" 2 "POS3" 3 "POS4" 4 "POS5" 5 "POS6" 6 "POS7" 7 "Invalid"; +VAL_ 760 ESP_STATUS_RELATED 0 "DISABLED" 1 "ENABLED"; +VAL_ 760 ESP_STATUS_RELATED_INV 0 "ENABLED" 1 "DISABLED"; +VAL_ 840 P134_Com_stEng 7 "RESERVED" 6 "DegradedGO" 5 "GO" 4 "Stopped" 3 "Running" 2 "Starting" 1 "Cut" 0 "Locked"; +VAL_ 909 VITESSE_VEHICULE_ROUES 65535 "Invalid"; +VAL_ 1010 LANE_DEPARTURE 0 "NOT_DEPARTED" 1 "DEPARTED_RIGHT" 2 "DEPARTED_LEFT"; +VAL_ 1010 STATUS 0 "UNAVAILABLE" 1 "UNSELECTED" 2 "SELECTED" 3 "AUTHORIZED" 4 "ACTIVE" 5 "DEFECT" 6 "COLLISION" 7 "RESERVED"; +VAL_ 1106 LONGITUDINAL_REGULATION_TYPE 0 "None" 1 "RVV: Vehicle Speed Governor" 2 "LVV: Vehicle Speed Limiter" 3 "ACC: Adaptive Cruise Control"; +VAL_ 1106 TURN_SIGNAL_STATUS 0 "Turn signal inactive" 1 "Right turn signal active" 2 "Left turn signal active" 3 "Both turn signals active"; +VAL_ 1106 FRONT_WIPER_STATUS 0 "Off" 1 "Front wiper confirmed" 2 "Low speed" 3 "High speed"; +VAL_ 1106 CHECKSUM_CONS_RVV_LVV2 0 "Most significant nibble of SPEED_SETPOINT is even AND least significant nibble of SPEED_SETPOINT is even" 1 "Most significant nibble of SPEED_SETPOINT is even AND least significant nibble of SPEED_SETPOINT is odd" 2 "Most significant nibble of SPEED_SETPOINT is odd AND least significant nibble of SPEED_SETPOINT is even" 3 "Most significant nibble of SPEED_SETPOINT is odd AND least significant nibble of SPEED_SETPOINT is odd"; +VAL_ 1106 BRAKE_ONLY_CMD_BSI 0 "No brake-only command requested by BSI" 1 "Brake-only command requested by BSI"; +VAL_ 1106 LVV_ACTIVATION_REQ 0 "No LVV activation request" 1 "LVV activation requested"; +VAL_ 1106 RVV_ACC_ACTIVATION_REQ 0 "No RVV/ACC activation request" 1 "RVV/ACC activation requested"; +VAL_ 1106 ARC_HABIT_SENSITIVITY 0 "Unused value" 1 "1" 2 "2" 3 "3" 4 "Unused value" 5 "Unused value" 6 "Unused value" 7 "Unused value"; +VAL_ 1106 ARC_HABIT_ACTIVATION_REQ 0 "ARC deactivation" 1 "ARC activation"; +VAL_ 1106 FRONT_WASH_STATUS 0 "Off" 1 "Wash"; +VAL_ 1106 FORCE_ACTIVATION_HAB_CMD 0 "Deactivation" 1 "Activation"; +VAL_ 1106 COCKPIT_GO_ACC_REQUEST 0 "VALUE_1" 1 "VALUE_2"; +VAL_ 1106 ACC_PROGRAM_MODE 0 "Comfort" 1 "Sport" 2 "Eco" 3 "Reserved"; +VAL_ 1173 EPS_TORQUE 127 "Invalid"; +VAL_ 1173 ETAT_DA_2004 3 "Reserved" 2 "Orange LED" 1 "Red LED" 0 "No Demand"; +VAL_ 1173 ETAT_DA_DYN 3 "Invalid" 2 "Adjustable Mode" 1 "Dynamic Mode" 0 "Normal Mode"; +VAL_ 1173 ETAT_DA_2010 3 "Reserved" 2 "Orange LED" 1 "Red LED" 0 "No Demand"; +VAL_ 1173 TRQ_LIMIT_STATE 1 "Saturation Effective" 0 "No Saturation"; +VAL_ 1173 STEERWHL_HOLD_BY_DRV 1 "Steer Activity From Drv Trq" 0 "No Steer Activity From Drv Trq"; +VAL_ 1173 EPS_STATE_LKA 4 "Defect" 3 "Active" 2 "Available" 1 "Authorised" 0 "Unauthorised"; +VAL_ 1173 AUTOR_ARRET_MOT_DA 1 "Permission to Stop" 0 "No Permission to Stop"; +VAL_ 1173 STEERING_REBOOT_REQUEST 1 "Request Reboot" 0 "No Reboot Required"; +VAL_ 1270 ARTIV_SENSOR_STATE 0 "Initialization" 1 "Inactive" 2 "Active" 3 "Reduced visibility" 4 "Simulation" 5 "Learning" 6 "Free" 7 "Fault"; +VAL_ 1270 TARGET_DETECTED 0 "initialization or no target detected" 1 "target detected"; +VAL_ 1270 ARTIV_TARGET_CHANGE_INFO 0 "VALUE_1" 1 "VALUE_2"; +VAL_ 1270 TRAFFIC_DIRECTION 0 "right" 1 "left" 2 "reserved" 3 "undetermined"; diff --git a/artifacts/package_runtime/iqdbc/dbc/rivian_mando_front_radar_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/rivian_mando_front_radar_generated.dbc new file mode 100644 index 000000000..6f7304ec2 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/rivian_mando_front_radar_generated.dbc @@ -0,0 +1,457 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "rivian_mando_front_radar.dbc starts here"; + +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 1280 RADAR_TRACK_500: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1281 RADAR_TRACK_501: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1282 RADAR_TRACK_502: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1283 RADAR_TRACK_503: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1284 RADAR_TRACK_504: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1285 RADAR_TRACK_505: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1286 RADAR_TRACK_506: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1287 RADAR_TRACK_507: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1288 RADAR_TRACK_508: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1289 RADAR_TRACK_509: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1290 RADAR_TRACK_50a: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1291 RADAR_TRACK_50b: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1292 RADAR_TRACK_50c: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1293 RADAR_TRACK_50d: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1294 RADAR_TRACK_50e: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1295 RADAR_TRACK_50f: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1296 RADAR_TRACK_510: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1297 RADAR_TRACK_511: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1298 RADAR_TRACK_512: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1299 RADAR_TRACK_513: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1300 RADAR_TRACK_514: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1301 RADAR_TRACK_515: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1302 RADAR_TRACK_516: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1303 RADAR_TRACK_517: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1304 RADAR_TRACK_518: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1305 RADAR_TRACK_519: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1306 RADAR_TRACK_51a: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1307 RADAR_TRACK_51b: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1308 RADAR_TRACK_51c: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1309 RADAR_TRACK_51d: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1310 RADAR_TRACK_51e: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +BO_ 1311 RADAR_TRACK_51f: 8 RADAR + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UNKNOWN_1 : 23|8@0- (1,0) [-128|127] "" XXX + SG_ AZIMUTH : 28|10@0- (0.1,0) [-51.2|51.1] "" XXX + SG_ STATE : 31|3@0+ (1,0) [0|7] "" XXX + SG_ LONG_DIST : 34|11@0+ (0.1,0) [0|204.7] "" XXX + SG_ MODE : 55|2@0+ (1,0) [0|3] "" XXX + SG_ REL_SPEED : 53|14@0- (0.01,0) [-81.92|81.92] "m/s" XXX + +VAL_ 1280 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1280 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1281 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1281 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1282 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1282 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1283 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1283 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1284 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1284 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1285 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1285 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1286 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1286 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1287 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1287 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1288 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1288 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1289 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1289 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1290 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1290 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1291 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1291 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1292 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1292 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1293 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1293 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1294 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1294 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1295 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1295 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1296 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1296 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1297 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1297 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1298 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1298 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1299 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1299 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1300 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1300 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1301 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1301 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1302 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1302 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1303 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1303 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1304 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1304 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1305 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1305 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1306 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1306 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1307 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1307 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1308 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1308 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1309 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1309 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1310 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1310 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + +VAL_ 1311 STATE 0 "Empty" 1 "New" 2 "New_updated" 3 "Updated" 4 "Coasting" 7 "New_coasting" ; +VAL_ 1311 MODE 0 "None" 1 "SRR" 2 "LRR" 3 "SRR_and_LRR" ; + \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/rivian_park_assist_can.dbc b/artifacts/package_runtime/iqdbc/dbc/rivian_park_assist_can.dbc new file mode 100644 index 000000000..b18f0a53d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/rivian_park_assist_can.dbc @@ -0,0 +1,55 @@ +VERSION "ParkAssistCAN" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: ACM CGM EPAS_P ESP IBM OCS RCM SAS TestTool VDM Vector_XXX + +BO_ 794 WheelButtons: 7 XXX + SG_ LeftButton_ScrollClick : 19|2@0+ (1,0) [0|3] "" XXX + SG_ LeftButton_RightClick : 21|2@0+ (1,0) [0|3] "" XXX + SG_ LeftButton_LeftClick : 22|2@1+ (1,0) [0|3] "" XXX + SG_ LeftButton_Scroll : 31|8@0+ (1,0) [0|255] "" XXX + SG_ RightButton_ScrollClick : 35|2@0+ (1,0) [0|3] "" XXX + SG_ RightButton_RightClick : 37|2@0+ (1,0) [0|3] "" XXX + SG_ RightButton_LeftClick : 38|2@1+ (1,0) [0|3] "" XXX + SG_ RightButton_Scroll : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 848 BSM_BlindSpotIndicator: 4 XXX + SG_ BSM_BlindSpotIndicator_Checksum : 0|8@1+ (1,0) [0|255] "" XXX + SG_ BSM_BlindSpotIndicator_Counter : 11|4@0+ (1,0) [0|15] "" XXX + SG_ BSM_BlindSpotIndicator_Left : 29|2@0+ (1,0) [0|3] "" XXX + SG_ BSM_BlindSpotIndicator_Right : 30|2@1+ (1,0) [0|3] "" XXX + +VAL_ 848 BSM_BlindSpotIndicator_Left 0 "OFF" 1 "OBJECT_DETECTED" 2 "ACTIVE_WARNING" ; +VAL_ 848 BSM_BlindSpotIndicator_Right 0 "OFF" 1 "OBJECT_DETECTED" 2 "ACTIVE_WARNING" ; \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/rivian_primary_actuator.dbc b/artifacts/package_runtime/iqdbc/dbc/rivian_primary_actuator.dbc new file mode 100644 index 000000000..2be328901 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/rivian_primary_actuator.dbc @@ -0,0 +1,1022 @@ +VERSION "PrimaryActuatorCAN" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: ACM CGM EPAS_P ESP IBM OCS RCM SAS TestTool VDM Vector_XXX + + +BO_ 64 SAS_Status: 8 SAS + SG_ SAS_Status_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ACM,EPAS_P,ESP,RCM,VDM + SG_ SAS_Status_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ACM,EPAS_P,ESP,RCM,VDM + SG_ SAS_Status_AngleSafe : 23|15@0- (0.0009765625,0) [-14.5|14.5] "rad" ACM,EPAS_P,ESP,RCM,VDM + SG_ SAS_Status_Calibrated : 24|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,RCM,VDM + SG_ SAS_Status_AngleSpeedSafe : 39|14@0- (0.0078125,0) [-50|50] "rad/s" ACM,EPAS_P,ESP,RCM,VDM + SG_ SAS_StatusQ : 41|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,RCM,VDM + +BO_ 256 ACM_Status: 8 ACM + SG_ ACM_Status_Checksum : 7|8@0+ (1,0) [0|255] "-" EPAS_P,VDM + SG_ ACM_Status_Counter : 11|4@0+ (1,0) [0|15] "-" EPAS_P,VDM + SG_ ACM_Unkown1 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ ACM_FeatureStatus : 23|3@0+ (1,0) [0|7] "" EPAS_P,VDM + SG_ ACM_FaultStatus : 26|3@0+ (1,0) [0|7] "" EPAS_P,VDM + SG_ ACM_FaultSupervisorState : 42|3@0+ (1,0) [0|7] "" ACMB + +BO_ 257 ACM_AebRequest: 8 ACM + SG_ ACM_AebRequest_Checksum : 7|8@0+ (1,0) [0|255] "" ESP,VDM + SG_ ACM_AebRequest_Counter : 11|4@0+ (1,0) [0|15] "" ESP,VDM + SG_ ACM_StopRequest : 17|1@0+ (1,0) [0|1] "" ESP,VDM + SG_ ACM_FailInfo : 19|2@0+ (1,0) [0|3] "" ESP,VDM + SG_ ACM_DbsLevel : 21|2@0+ (1,0) [0|3] "" ESP,VDM + SG_ ACM_OnOffStatus : 23|2@0+ (1,0) [0|3] "" ESP,VDM + SG_ ACM_DecelRequest : 27|12@0+ (0.004885,0) [0|15.998375] "m/s^2" ESP,VDM + SG_ ACM_WarnLevel : 44|2@0+ (1,0) [0|3] "" ESP,VDM + SG_ ACM_PrefillEnableRequest : 46|1@0+ (1,0) [0|1] "" ESP,VDM + SG_ ACM_EnableRequest : 47|1@0+ (1,0) [0|1] "" ESP,VDM + +BO_ 258 ESP_AebFb: 8 ESP + SG_ ESP_AebFeedback_Checksum : 7|8@0+ (1,0) [0|255] "" ACM + SG_ ESP_AebFeedback_Counter : 11|4@0+ (1,0) [0|15] "" ACM + SG_ iB_BrakePedalApplied_Q : 14|2@0+ (1,0) [0|3] "" ACM + SG_ iB_BrakePedalApplied : 15|1@0+ (1,0) [0|1] "" ACM + SG_ ESP_DecelFeedback : 23|12@0+ (0.004885,-16) [-16|3.99919] "m/s^2" ACM + SG_ ESP_AebActive : 24|1@0+ (1,0) [0|1] "" ACM + SG_ ESP_AebAvailable : 25|1@0+ (1,0) [0|1] "" ACM + SG_ ESP_DbsActive : 26|1@0+ (1,0) [0|1] "" ACM + SG_ ESP_PrefillActiveFeedback : 27|1@0+ (1,0) [0|1] "" ACM + SG_ ESP_PrefillAvailable : 32|1@0+ (1,0) [0|1] "" ACM + SG_ ESP_DbsAvailable : 33|1@0+ (1,0) [0|1] "" ACM + +BO_ 272 ACM_SteeringControl: 8 ACM + SG_ ACM_SteeringControl_Checksum : 7|8@0+ (1,0) [0|0] "" EPAS_P + SG_ ACM_SteeringControl_Counter : 11|4@0+ (1,0) [0|0] "" EPAS_P + SG_ ACM_EacEnabled : 13|2@0+ (1,0) [0|3] "" EPAS_P + SG_ ACM_HapticRequired : 15|2@0+ (1,0) [0|3] "" EPAS_P + SG_ ACM_SteeringAngleRequest : 23|15@0+ (0.1,-1638.4) [-1638.4|1638.3] "deg" EPAS_P + +BO_ 288 ACM_lkaHbaCmd: 8 ACM + SG_ ACM_lkaHbaCmd_Checksum : 7|8@0+ (1,0) [0|255] "" EPAS_P + SG_ ACM_lkaHbaCmd_Counter : 11|4@0+ (1,0) [0|15] "" EPAS_P + SG_ ACM_lkaElkRequest : 14|3@0+ (1,0) [0|7] "" EPAS_P + SG_ ACM_HapticRequest : 15|1@0+ (1,0) [0|1] "" EPAS_P + SG_ ACM_lkaStrToqReq : 23|11@0+ (1,-1024) [-1024|1024] "" EPAS_P + SG_ ACM_lkaSymbolState : 26|3@0+ (1,0) [0|7] "" EPAS_P + SG_ ACM_lkaToiFlt : 27|1@0+ (1,0) [0|1] "" EPAS_P + SG_ ACM_lkaActToi : 28|1@0+ (1,0) [0|1] "" EPAS_P + SG_ ACM_hbaSysState : 34|3@0+ (1,0) [0|7] "" EPAS_P + SG_ ACM_hbaLamp : 35|1@0+ (1,0) [0|1] "" EPAS_P + SG_ ACM_slifOnOffState : 37|2@0+ (1,0) [0|3] "" EPAS_P + SG_ ACM_elkOnOffState : 39|2@0+ (1,0) [0|3] "" EPAS_P + SG_ ACM_ldwLHWarning : 43|3@0+ (1,0) [0|7] "" EPAS_P + SG_ ACM_lkaLaneRecogState : 45|2@0+ (1,0) [0|3] "" EPAS_P + SG_ ACM_hbaOnOffState : 47|2@0+ (1,0) [0|3] "" EPAS_P + SG_ ACM_ldwlkaOnOffState : 48|3@0+ (1,0) [0|7] "" EPAS_P + SG_ ACM_ldwWarnTimingState : 51|3@0+ (1,0) [0|7] "" EPAS_P + SG_ ACM_lkaHandsoffSoundWarning : 53|2@0+ (1,0) [0|3] "" EPAS_P + SG_ ACM_lkaHandsoffDisplayWarning : 55|2@0+ (1,0) [0|3] "" EPAS_P + SG_ ACM_ldwRHWarning : 58|3@0+ (1,0) [0|7] "" EPAS_P + SG_ ACM_ldwWarnTypeState : 61|3@0+ (1,0) [0|7] "" EPAS_P + +BO_ 304 RCM_IMU_LatAccYaw: 8 RCM + SG_ RCM_LateralAccelYaw_Checksum : 7|8@0+ (1,0) [0|25] "" ACM,ESP,VDM + SG_ RCM_LateralAccelYaw_Counter : 11|4@0+ (1,0) [0|15] "" ACM,ESP,VDM + SG_ RCM_IMU_LatAcc_Stat_SensAvail : 12|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_LatAcc_Stat_Fail : 13|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_LatAcc_Stat_Init : 14|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_LatAcc_Stat_Startup : 15|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_Yaw_Stat_SensAvail : 16|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_Yaw_Stat_Fail : 17|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_Yaw_Stat_Init : 18|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_Yaw_Stat_Startup : 19|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_LatAcc : 39|16@0+ (0.004998293,-163.784065024) [-40.961|40.961] "m/s2" ACM,ESP,VDM + SG_ RCM_IMU_Yaw : 55|16@0+ (0.0125,-409.6) [-163.85|163.85] "deg/sec" ACM,ESP,VDM + +BO_ 309 RCM_IMU_HeaveRoll: 8 RCM + SG_ RCM_HeaveRoll_Checksum : 7|8@0+ (1,0) [0|25] "" VDM + SG_ RCM_HeaveRoll_Counter : 11|4@0+ (1,0) [0|15] "" VDM + SG_ RCM_IMU_Heave : 23|16@0+ (0.004998293,-163.784065024) [-34.32328|34.32328] "m/s2" VDM + SG_ RCM_IMU_Roll : 39|16@0+ (0.0125,-409.6) [-100.0125|100.0125] "deg/sec" VDM + SG_ RCM_IMU_Roll_Stat_SensAvail : 48|1@0+ (1,0) [0|1] "" VDM + SG_ RCM_IMU_Roll_Stat_Fail : 49|1@0+ (1,0) [0|1] "" VDM + SG_ RCM_IMU_Roll_Stat_Init : 50|1@0+ (1,0) [0|1] "" VDM + SG_ RCM_IMU_Roll_Stat_Startup : 51|1@0+ (1,0) [0|1] "" VDM + SG_ RCM_IMU_Heave_Stat_SensAvail : 52|1@0+ (1,0) [0|1] "" VDM + SG_ RCM_IMU_Heave_Stat_Fail : 53|1@0+ (1,0) [0|1] "" VDM + SG_ RCM_IMU_Heave_Stat_Init : 54|1@0+ (1,0) [0|1] "" VDM + SG_ RCM_IMU_Heave_Stat_Startup : 55|1@0+ (1,0) [0|1] "" VDM + +BO_ 320 RCM_IMU_LongAcc: 8 RCM + SG_ RCM_LongAcc_Checksum : 7|8@0+ (1,0) [0|25] "" ACM,ESP,VDM + SG_ RCM_LongAcc_Counter : 11|4@0+ (1,0) [0|15] "" ACM,ESP,VDM + SG_ RCM_IMU_LongAcc_Sig : 39|16@0+ (0.004998293,-163.784065024) [-40.961|40.961] "m/s2" ACM,ESP,VDM + SG_ RCM_IMU_LongAcc_Stat_SensAvail : 48|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_LongAcc_Stat_Fail : 49|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_LongAcc_Stat_Init : 50|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ RCM_IMU_LongAcc_Stat_Startup : 51|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + +BO_ 336 VDM_PropStatus: 7 VDM + SG_ VDM_PropStatus_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ACM,EPAS_P,ESP,RCM + SG_ VDM_PropStatus_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ACM,EPAS_P,ESP,RCM + SG_ VDM_PropsnActv : 13|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,RCM + SG_ VDM_VehicleSpeedQ : 15|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,RCM + SG_ VDM_Prndl_Status : 19|4@0+ (1,0) [0|15] "" ACM,EPAS_P,ESP,RCM + SG_ VDM_Prndl_Request : 23|4@0+ (1,0) [0|15] "" ACM,EPAS_P,ESP,RCM + SG_ VDM_AcceleratorPedalPosition : 31|10@0+ (0.1,0) [0|102.3] "" ACM,EPAS_P,ESP,RCM + SG_ VDM_VehicleSpeed : 47|16@0+ (0.01,0) [0|400] "Kph" ACM,EPAS_P,ESP,RCM + +BO_ 338 VDM_OutputSignals: 8 VDM + SG_ VDM_OutputSigs_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_OutputSigs_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_LfcRequestType : 13|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_LfcActiveRequest : 14|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_BrakeLightRequest : 15|1@0+ (1,0) [0|0] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_Lfc_BrakeTorqueRequest : 23|15@0+ (2,-65534) [-65534|0] "Nm" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_StcTorqueRequest : 39|11@0+ (0.0078125,-8) [-8|7.9921875] "Nm" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_StcFault : 43|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_StcActiveRequest : 44|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_EpbRequest : 49|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_ABSOffRoadModeRequest : 50|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_HhcActiveRequest : 51|1@0+ (1,0) [0|1] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_EspPartialModeRequest : 53|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_SteeringModeRequest : 59|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM + SG_ VDM_EpasPowerMode : 61|2@0+ (1,0) [0|3] "" ACM,EPAS_P,ESP,IBM,RCM + +BO_ 352 ACM_longitudinalRequest: 5 ACM + SG_ ACM_longitudinalRequest_Checksum : 7|8@0+ (1,0) [0|255] "-" VDM + SG_ ACM_longitudinalRequest_Counter : 11|4@0+ (1,0) [0|15] "-" VDM + SG_ ACM_AccelerationRequest : 23|11@0+ (0.01,-10.24) [-10.24|10.23] "m/s^2" VDM + SG_ ACM_PrndRequest : 27|4@0+ (1,0) [0|7] "" VDM + SG_ ACM_longInterfaceEnable : 37|2@0+ (1,0) [0|3] "" VDM + SG_ ACM_VehicleHoldRequest : 39|2@0+ (1,0) [0|3] "" VDM + +BO_ 354 VDM_AdasSts: 8 VDM + SG_ VDM_AdasStatus_Checksum : 7|8@0+ (1,0) [0|0] "" ACM + SG_ VDM_AdasStatus_Counter : 11|4@0+ (1,0) [0|0] "" ACM + SG_ VDM_AdasDecelLimit : 17|10@0+ (0.01,0) [0|-10.23] "m/s^2" ACM + SG_ VDM_AdasDriverAccelPriorityStatus : 19|2@0+ (1,0) [0|3] "" ACM + SG_ VDM_AdasFaultStatus : 23|4@0+ (1,0) [0|15] "" ACM + SG_ VDM_AdasAccelLimit : 33|10@0+ (0.01,0) [0|10.23] "m/s^2" ACM + SG_ VDM_AdasDriverModeStatus : 36|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AdasUnkown1 : 50|8@0+ (1,0) [0|255] "" XXX + SG_ VDM_AdasInterfaceStatus : 52|2@0+ (1,0) [0|3] "" ACM + SG_ VDM_AdasVehicleHoldStatus : 55|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_UserAdasRequest : 58|3@0+ (1,0) [0|7] "" ACM + +BO_ 357 VDM_AdasStalk: 4 VDM + SG_ VDM_AdasStalk_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ACM + SG_ VDM_AdasStalk_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ACM + SG_ VDM_AdasStalkGapAdjust : 17|2@0+ (1,0) [0|3] "" ACM + SG_ VDM_AdasStalkAccCancelRes : 19|2@0+ (1,0) [0|3] "" ACM + SG_ VDM_AdasStalkAutonomyButton : 20|1@0+ (1,0) [0|1] "" ACM + SG_ VDM_AdasStalkAccEnableAdj : 23|3@0+ (1,0) [0|7] "" ACM + +BO_ 384 VDM_CGM_GW: 8 CGM + SG_ VDM_CGM_GW_Checksum : 7|8@0+ (1,0) [0|0] "" ESP,IBM + SG_ VDM_CGM_GW_Counter : 11|4@0+ (1,0) [0|0] "" ESP,IBM + SG_ CGM_TrailerPresent : 13|2@0+ (1,0) [0|3] "" ESP,IBM + SG_ CGM_DriverPresent : 15|2@0+ (1,0) [0|3] "" ESP,IBM + SG_ CGM_TimeSinceLastIgnitionOn : 23|16@0+ (1,0) [0|65535] "s" ESP,IBM + SG_ CGM_IgnSwtState : 35|4@0+ (1,0) [0|15] "" ESP,IBM + +BO_ 432 ESP_TorqueLimit_Front: 8 ESP + SG_ ESP_Torque_Front_Checksum : 7|8@0+ (1,0) [0|255] "" VDM + SG_ ESP_Torque_Front_Counter : 11|4@0+ (1,0) [0|15] "" VDM + SG_ ESP_Torque_Front_MinQ : 14|1@0+ (1,0) [0|1] "" VDM + SG_ ESP_Torque_Front_MaxQ : 15|1@0+ (1,0) [0|1] "" VDM + SG_ ESP_Torque_Front_Max : 23|16@0+ (0.5,-16384) [-16384|16383] "Nm" VDM + SG_ ESP_Torque_Front_Min : 39|16@0+ (0.5,-16384) [-16384|16383] "Nm" VDM + +BO_ 448 ESP_TorqueLimit_Rear: 8 ESP + SG_ ESP_Torque_Rear_Checksum : 7|8@0+ (1,0) [0|255] "" VDM + SG_ ESP_Torque_Rear_Counter : 11|4@0+ (1,0) [0|15] "" VDM + SG_ ESP_Torque_Rear_MinQ : 14|1@0+ (1,0) [0|1] "" VDM + SG_ ESP_Torque_Rear_MaxQ : 15|1@0+ (1,0) [0|1] "" VDM + SG_ ESP_Torque_Rear_Max : 23|16@0+ (0.5,-16384) [-16384|16383] "Nm" VDM + SG_ ESP_Torque_Rear_Min : 39|16@0+ (0.5,-16384) [-16384|16383] "Nm" VDM + +BO_ 516 RCM_ALR_Status: 8 RCM + SG_ RCM_ALR_Status_Signal : 0|2@1+ (1,0) [0|3] "" OCS + +BO_ 520 ESP_Status: 8 ESP + SG_ ESP_Status_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Status_Counter : 11|4@0+ (1,0) [0|15] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_BrakeLightActive_Q : 12|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_BrakeLightActive : 13|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Hhc_Active : 14|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Hhc_Available : 15|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Abs_OffRoad_Mode : 16|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Tsm_Active : 17|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_FaultLamp_EBD : 18|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_FaultLamp_VDC : 19|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_FaultLamp_ABS : 20|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Esp_Active : 21|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Abs_Active : 23|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Partial_Mode : 25|2@0+ (1,0) [0|3] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Dtc_Active : 26|1@0+ (1,0) [0|1] "Enum" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Vehicle_Speed_Q : 28|2@0+ (1,0) [0|3] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Lfc_Available : 30|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Hba_Active : 31|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_BrkTrq : 38|15@0+ (2,-65534) [-65534|0] "Nm" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Lfc_Active : 39|1@0+ (1,0) [0|1] "" ACM,CGM,EPAS_P,RCM,VDM + SG_ ESP_Vehicle_Speed : 55|16@0+ (0.01,0) [0|400] "kph" ACM,CGM,EPAS_P,RCM,VDM + +BO_ 521 ESP_WSpeed_Front: 8 ESP + SG_ ESP_WSpeed_Front_CRC : 7|8@0+ (1,0) [0|255] "" ACM,VDM + SG_ ESP_WSpeed_Front_Message_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM + SG_ ESP_Wheel_Speed_Left_Front_Q : 13|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Speed_Right_Front_Q : 15|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Speed_Left_Front : 23|16@0+ (0.01,0) [0|400] "kph" ACM,VDM + SG_ ESP_Wheel_Speed_Right_Front : 39|16@0+ (0.01,0) [0|400] "kph" ACM,VDM + SG_ ESP_Wheel_Dir_Right_Front : 53|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Dir_Left_Front : 55|2@0+ (1,0) [0|3] "" ACM,VDM + +BO_ 522 ESP_WSpeed_Rear: 8 ESP + SG_ ESP_WSpeed_Rear_CRC : 7|8@0+ (1,0) [0|255] "" ACM,VDM + SG_ ESP_WSpeed_Rear_Message_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM + SG_ ESP_Wheel_Speed_Left_Rear_Q : 13|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Speed_Right_Rear_Q : 15|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Speed_Left_Rear : 23|16@0+ (0.01,0) [0|400] "kph" ACM,VDM + SG_ ESP_Wheel_Speed_Right_Rear : 39|16@0+ (0.01,0) [0|400] "kph" ACM,VDM + SG_ ESP_Wheel_Dir_Right_Rear : 53|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Dir_Left_Rear : 55|2@0+ (1,0) [0|3] "" ACM,VDM + +BO_ 523 ESP_Wheel_Pulse_Veh: 8 ESP + SG_ ESP_Wheel_Pulse_CRC : 7|8@0+ (1,0) [0|255] "" ACM,VDM + SG_ ESP_Wheel_Pulse_Message_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM + SG_ ESP_Wheel_Pulse_Left_Front : 23|8@0+ (1,0) [0|255] "Pulse" ACM,VDM + SG_ ESP_Wheel_Pulse_Left_Rear : 31|8@0+ (1,0) [0|255] "Pulse" ACM,VDM + SG_ ESP_Wheel_Pulse_Right_Front : 39|8@0+ (1,0) [0|255] "Pulse" ACM,VDM + SG_ ESP_Wheel_Pulse_Right_Rear : 47|8@0+ (1,0) [0|255] "Pulse" ACM,VDM + SG_ ESP_Wheel_Pulse_Right_Front_Q : 49|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Pulse_Right_Rear_Q : 51|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Pulse_Left_Rear_Q : 53|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_Wheel_Pulse_Left_Front_Q : 55|2@0+ (1,0) [0|3] "" ACM,VDM + +BO_ 524 ESP_Brake_Pressure: 8 ESP + SG_ ESP_BrakeP_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,RCM,VDM + SG_ ESP_BrakeP_Message_Counter : 11|4@0+ (1,0) [0|15] "" ACM,RCM,VDM + SG_ ESP_BrakePressure_RF_Q : 13|2@0+ (1,0) [0|3] "" ACM,RCM,VDM + SG_ ESP_BrakePressure_LF_Q : 15|2@0+ (1,0) [0|3] "" ACM,RCM,VDM + SG_ ESP_BrakePressure_LF : 23|8@0+ (1,0) [0|255] "bar" ACM,RCM,VDM + SG_ ESP_BrakePressure_LR : 31|8@0+ (1,0) [0|255] "bar" ACM,RCM,VDM + SG_ ESP_BrakePressure_RF : 39|8@0+ (1,0) [0|255] "bar" ACM,RCM,VDM + SG_ ESP_BrakePressure_RR : 47|8@0+ (1,0) [0|255] "bar" ACM,RCM,VDM + SG_ ESP_MasterCyl_Pressure : 55|10@0+ (0.25,0) [0|255] "bar" ACM,RCM,VDM + SG_ ESP_MasterCyl_Pressure_Q : 57|2@0+ (1,0) [0|3] "" ACM,RCM,VDM + SG_ ESP_BrakePressure_RR_Q : 59|2@0+ (1,0) [0|3] "" ACM,RCM,VDM + SG_ ESP_BrakePressure_LR_Q : 61|2@0+ (1,0) [0|3] "" ACM,RCM,VDM + +BO_ 529 VDM_Torque_Front: 8 VDM + SG_ VDM_Torque_Front_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ESP + SG_ VDM_Torque_Front_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ESP + SG_ VDM_Torque_Front_Max : 23|11@0+ (1,-1023) [-1023|1024] "Nm" ESP + SG_ VDM_Torque_Front_Min : 26|11@0+ (1,-1023) [-1023|1024] "Nm" ESP + SG_ VDM_Torque_Front_MaxQ : 28|1@0+ (1,0) [0|1] "" ESP + SG_ VDM_OutputTorqueFront : 47|11@0+ (1,-1023) [-1023|1024] "Nm" ESP + SG_ VDM_DriverIntendedTorqueFront : 50|11@0+ (1,-1023) [-1023|1024] "Nm" ESP + SG_ VDM_OutputTorqueFrontQ : 51|1@0+ (1,0) [0|1] "" ESP + SG_ VDM_Torque_Front_MinQ : 52|1@0+ (1,0) [0|1] "" ESP + +BO_ 530 VDM_Torque_Rear: 8 VDM + SG_ VDM_Torque_Rear_Checksum : 7|8@0+ (1,0) [0|255] "Unitless" ESP + SG_ VDM_Torque_Rear_Counter : 11|4@0+ (1,0) [0|15] "Unitless" ESP + SG_ VDM_Torque_Rear_Max : 23|11@0+ (1,-1023) [-1023|1024] "Nm" ESP + SG_ VDM_Torque_Rear_Min : 26|11@0+ (1,-1023) [-1023|1024] "Nm" ESP + SG_ VDM_Torque_Rear_MaxQ : 28|1@0+ (1,0) [0|1] "" ESP + SG_ VDM_OutputTorqueRear : 47|11@0+ (1,-1023) [-1023|1024] "Nm" ESP + SG_ VDM_DriverIntendedTorque_Rear : 50|11@0+ (1,-1023) [-1023|1024] "Nm" ESP + SG_ VDM_OutputTorqueRearQ : 51|1@0+ (1,0) [0|1] "" ESP + SG_ VDM_Torque_Rear_MinQ : 52|1@0+ (1,0) [0|1] "" ESP + +BO_ 565 IndicatorLights: 8 XXX + SG_ checksum : 0|8@1+ (1,0) [0|255] "" XXX + SG_ counter : 8|4@1+ (1,0) [0|15] "" XXX + SG_ RearDriverDoor : 24|2@0+ (1,0) [0|3] "" XXX + SG_ FrontPassengerDoor : 26|2@0+ (1,0) [0|3] "" XXX + SG_ DriverDoor : 28|2@0+ (1,0) [0|3] "" XXX + SG_ RearPassengerDoor : 38|2@0+ (1,0) [0|3] "" XXX + SG_ TurnLightLeft : 40|2@0+ (1,0) [0|3] "" XXX + SG_ IgnitionOn : 48|1@0+ (1,0) [0|1] "" XXX + SG_ TurnLightRight : 54|2@0+ (1,0) [0|3] "" XXX + +BO_ 592 VDM_EcasStatus: 8 VDM + SG_ VDM_EcasHeightFL : 7|8@0- (1,0) [-128|127] "mm" ACM + SG_ VDM_EcasHeightFR : 15|8@0- (1,0) [-128|127] "mm" ACM + SG_ VDM_EcasHeightRL : 23|8@0- (1,0) [-128|127] "mm" ACM + SG_ VDM_EcasHeightRR : 31|8@0- (1,0) [-128|127] "mm" ACM + +BO_ 789 BCM_Status: 8 VDM + SG_ BCM_AmbientAirTemperature : 15|8@0- (1,0) [-60|100] "degC" ESP + +BO_ 801 SCCM_WheelTouch: 7 SCCM + SG_ SCCM_WheelTouch_Checksum : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SCCM_WheelTouch_Counter : 11|4@0+ (1,0) [0|15] "" XXX + SG_ SCCM_WheelTouch_HandsOn : 21|1@0+ (1,0) [0|1] "" XXX + SG_ SETME_X52 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ SCCM_WheelTouch_CapacitiveValue : 32|12@1+ (1,0) [0|4095] "" XXX + +BO_ 811 ESP_EpbStatus: 8 ESP + SG_ ESP_EpbStatus_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,VDM + SG_ ESP_EpbStatus_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM + SG_ ESP_EpbAvailable : 12|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ ESP_EpbServiceMode : 13|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ ESP_EpbWarningLamp : 15|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ ESP_EpbMessageDisplayRequest : 20|5@0+ (1,0) [0|30] "" ACM,VDM + SG_ ESP_EpbStatus : 23|3@0+ (1,0) [0|7] "" ACM,VDM + SG_ ESP_EpbClampForce : 31|16@0+ (1,0) [0|65534] "N" ACM,VDM + SG_ ESP_EpbFunctionLamp : 47|2@0+ (1,0) [0|3] "" ACM,VDM + +BO_ 826 RCM_Status: 8 RCM + SG_ RCM_IMU_LongAcc_Checksum : 7|8@0+ (1,0) [0|25] "" ACM,ESP,VDM + SG_ RCM_IMU_LongAcc_MSG_Counter : 11|4@0+ (1,0) [0|15] "" ACM,ESP,VDM + SG_ RCM_Status_DETECT_CRUSH : 21|3@0+ (1,0) [0|7] "" ACM,ESP,VDM + SG_ RCM_Status_IND_WARN_RCM : 23|2@0+ (1,0) [0|3] "" ACM,ESP,VDM + SG_ RCM_Status_IND_ACT_RCM_PASS : 25|2@0+ (1,0) [0|3] "" ACM,ESP,VDM + SG_ RCM_Status_IND_WARN_BELT_DRIVER : 27|2@0+ (1,0) [0|3] "" ACM,ESP,VDM + SG_ RCM_Status_IND_WARN_BELT_PASS : 31|2@0+ (1,0) [0|3] "" ACM,ESP,VDM + +BO_ 848 EPASP_Status: 4 EPAS_P + SG_ EPAS_Ecu1Status_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,VDM + SG_ EPAS_Ecu1Status_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM + SG_ EPAS_Ecu1EacSts : 14|3@0+ (1,0) [0|7] "" ACM,VDM + SG_ EPAS_Ecu1PowerMode : 18|3@0+ (1,0) [0|7] "" ACM,VDM + SG_ EPAS_Ecu1Role : 20|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ EPAS_Ecu1State : 31|4@0+ (1,0) [0|15] "" ACM,VDM + +BO_ 864 EPASS_Status: 4 VDM + SG_ EPASS_Ecu2Status_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,EPAS_P + SG_ EPASS_Ecu2Status_Counter : 11|4@0+ (1,0) [0|15] "" ACM,EPAS_P + SG_ EPAS_Ecu2EacSts : 14|3@0+ (1,0) [0|7] "" ACM,EPAS_P + SG_ EPAS_Ecu2PowerMode : 18|3@0+ (1,0) [0|7] "" ACM,EPAS_P + SG_ EPASS_Ecu2Role : 20|2@0+ (1,0) [0|3] "" ACM,EPAS_P + SG_ EPASS_Ecu2State : 31|4@0+ (1,0) [0|15] "" ACM,EPAS_P + +BO_ 880 ACM_tsrCmd: 8 ACM + SG_ ACM_tsrCmd_Checksum : 7|8@0+ (1,0) [0|0] "" Vector_XXX + SG_ ACM_tsrCmd_Counter : 11|4@0+ (1,0) [0|15] "" Vector_XXX + SG_ ACM_tsrConInfoStaCon2 : 19|4@0+ (1,0) [0|15] "" Vector_XXX + SG_ ACM_tsrConInfoStaCon1 : 23|4@0+ (1,0) [0|15] "" Vector_XXX + SG_ ACM_tsrSpdDisClsMain : 31|8@0+ (1,0) [0|255] "" Vector_XXX + SG_ ACM_tsrSpdDisCluCon1 : 39|8@0+ (1,0) [0|255] "" Vector_XXX + SG_ ACM_tsrSpdDisCluCon2 : 47|8@0+ (1,0) [0|255] "" Vector_XXX + SG_ ACM_tsrSpdDisCluConM : 55|8@0+ (1,0) [0|255] "" Vector_XXX + SG_ ACM_tsrAddInfoDisplay : 59|2@0+ (1,0) [0|3] "" Vector_XXX + SG_ ACM_tsrOvrlapSignDis : 61|2@0+ (1,0) [0|3] "" Vector_XXX + SG_ ACM_tsrStatus : 63|2@0+ (1,0) [0|3] "" Vector_XXX + +BO_ 896 EPAS_SystemStatus: 5 EPAS_P + SG_ EPAS_SytemStatus_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,VDM + SG_ EPAS_SystemStatus_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM + SG_ EPAS_SteeringReduced : 12|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ EPAS_SteeringFault : 13|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ EPAS_SteeringMode : 15|2@0+ (1,0) [0|3] "" ACM,VDM + SG_ EPAS_TorsionBarTorque : 23|12@0+ (0.01,-20.5) [-20.49|20.43] "" ACM,VDM + SG_ EPAS_StcFault : 32|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ EPAS_StcActive : 33|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ EPAS_StcUnavailable : 34|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ H_CAN_EPSS_ToiFlt : 35|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ H_CAN_EPSS_ToiActive : 36|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ H_CAN_EPS_ToiUnavailable : 37|1@0+ (1,0) [0|1] "" ACM,VDM + SG_ EPAS_HandsOnLevel : 39|2@0+ (1,0) [0|3] "" ACM,VDM + +BO_ 907 ESPiB1: 6 ESP + SG_ ESPiB1_Checksum : 7|8@0+ (1,0) [0|255] "" IBM + SG_ ESPiB1_AliveCounter : 11|4@0+ (1,0) [0|15] "" IBM + SG_ ESPiB1_IgnitionOn : 12|1@0+ (1,0) [0|1] "" IBM + SG_ ESPiB1_VehicleSpeed_Q : 15|2@0+ (1,0) [0|3] "" IBM + SG_ ESPiB1_VehicleSpeed : 23|8@0+ (0.4,0) [0|100] "m/s" IBM + +BO_ 908 ESPiB2: 4 ESP + SG_ ESPiB2_Checksum : 7|8@0+ (1,0) [0|255] "" IBM + SG_ ESPiB2_Alive_Counter : 11|4@0+ (1,0) [0|15] "" IBM + SG_ ESPiB2_qTargetExternal_Q : 15|2@0+ (1,0) [0|3] "" IBM + SG_ ESPiB2_qTargetExternal : 23|16@0+ (0.0078125,-252) [-252|252] "ml/s" IBM + +BO_ 909 ESPiB3: 7 ESP + SG_ ESPiB3_Checksum : 7|8@0+ (1,0) [0|255] "" IBM + SG_ ESPiB3_AliveCounter : 11|4@0+ (1,0) [0|15] "" IBM + SG_ ESPiB3_ABSActive : 12|1@0+ (1,0) [0|1] "" IBM + SG_ ESPiB3_ForceBlendingActive : 15|2@0+ (1,0) [0|3] "" IBM + SG_ ESPiB3_pMcVirtual : 23|10@0+ (0.25,0) [0|250] "bar" IBM + SG_ ESPiB3_pMcVirtual_Q : 29|2@0+ (1,0) [0|3] "" IBM + SG_ ESPiB3_pForceBlendingMC : 39|10@0+ (0.25,0) [0|250] "" IBM + SG_ ESPiB3_pMC1 : 43|10@0+ (0.3,-30) [-30|276.6] "bar" IBM + SG_ ESPiB3_pForceBlendingMC_Q : 45|2@0+ (1,0) [0|3] "" IBM + SG_ ESPiB3_pMC1_Q : 49|2@0+ (1,0) [0|3] "" IBM + +BO_ 910 iBESP1: 7 IBM + SG_ iBESP1_Checksum : 7|8@0+ (1,0) [0|255] "" ESP,VDM + SG_ iBESP1_AliveCounter : 11|4@0+ (1,0) [0|15] "" ESP,VDM + SG_ iBESP1_ExtReqPrio : 12|1@0+ (1,0) [0|1] "" ESP,VDM + SG_ iBESP1_ExtReqStatus : 15|3@0+ (1,0) [0|7] "" ESP,VDM + SG_ iBESP1_sOutputRodDriver : 23|12@0+ (0.015625,-5) [-5|47] "mm" ESP,VDM + SG_ iBESP1_sOutputRodDriver_Q : 27|2@0+ (1,0) [0|3] "" ESP,VDM + SG_ iBESP1_sOutputRodAct : 39|12@0+ (0.015625,-5) [-5|47] "mm" ESP,VDM + SG_ iBESP1_sOutputRodAct_Q : 43|2@0+ (1,0) [0|3] "" ESP,VDM + +BO_ 911 iBESP2: 6 IBM + SG_ iBESP2_Checksum : 7|8@0+ (1,0) [0|255] "" ACM,ESP,VDM + SG_ iBESP2_AliveCounter : 11|4@0+ (1,0) [0|15] "" ACM,ESP,VDM + SG_ iBESP2_CompatibilityIndex : 15|4@0+ (1,0) [0|15] "" ACM,ESP,VDM + SG_ iBESP2_pRunout_Q : 17|2@0+ (1,0) [0|3] "" ACM,ESP,VDM + SG_ iBESP2_iBDiagActive : 19|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ iBESP2_HbcRequest : 20|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ iBESP2_BrakePedalApplied_Q : 22|2@0+ (1,0) [0|3] "" ACM,ESP,VDM + SG_ iBESP2_BrakePedalApplied : 23|1@0+ (1,0) [0|1] "" ACM,ESP,VDM + SG_ iBESP2_pRunout : 31|8@0+ (1,0) [0|250] "bar" ACM,ESP,VDM + SG_ iBESP2_RprMode : 39|3@0+ (1,0) [0|7] "" ACM,ESP,VDM + +BO_ 912 EPAS_AdasStatus: 7 EPAS_P + SG_ EPAS_AdasStatus_Checksum : 7|8@0+ (1,0) [0|0] "" ACM,VDM + SG_ EPAS_AdasStatus_Counter : 11|4@0+ (1,0) [0|15] "" ACM,VDM + SG_ EPAS_SteeringAngleSpeed : 23|14@0+ (0.1,-819) [-819|819.3] "deg/s" ACM,VDM + SG_ EPAS_EacStatus : 35|3@0+ (1,0) [0|7] "" ACM,VDM + SG_ EPAS_EacErrorCode : 39|4@0+ (1,0) [0|15] "" ACM,VDM + SG_ EPAS_InternalSas : 47|14@0+ (0.1,-819.2) [-819.2|819] "deg" ACM,VDM + SG_ EPAS_InternalSasQ : 49|1@0+ (1,0) [0|1] "" ACM,VDM + +BO_ 929 VDM_ModSw_DrvModPosSts_GW: 8 VDM + SG_ VDM_AchDriveModeRequestConfirm : 0|1@0+ (1,0) [0|1] "" ACM + SG_ VDM_AchDriveModeRequestPullRearw : 1|1@0+ (1,0) [0|1] "" ACM + SG_ VDM_AchDriveModeRequestPushDown : 2|1@0+ (1,0) [0|1] "" ACM + SG_ VDM_AchDriveModeRequestPushForwa : 3|1@0+ (1,0) [0|1] "" ACM + SG_ VDM_AchDriveModeRequestPushUp : 4|1@0+ (1,0) [0|1] "" ACM + SG_ VDM_AchDriveModeRequestRest : 5|1@0+ (1,0) [0|1] "" ACM + SG_ VDM_AchDriveMode4x4 : 20|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveMode : 23|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveModeAirSuspension : 28|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveModeAbs : 31|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveModeDrivability : 36|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveModeDamping : 39|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveModeRollControl : 44|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveModeEsp : 47|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveModeEpas : 52|3@0+ (1,0) [0|7] "" ACM + SG_ VDM_AchDriveModeTcs : 55|3@0+ (1,0) [0|7] "" ACM + +BO_ 1024 VehicleConfig: 7 CGM + SG_ VCM_VehicleType : 7|8@0+ (1,0) [0|255] "" ACM,ESP + SG_ VCM_HandOfDrive : 9|1@0+ (1,0) [0|1] "" ACM,ESP + SG_ VCM_BatterySize : 15|6@0+ (1,0) [0|63] "" ACM,ESP + SG_ VCM_Market : 23|8@0+ (1,0) [0|255] "" ACM,ESP + +BO_ 1265 Cluster: 6 XXX + SG_ Cluster_Unit : 7|1@0+ (1,0) [0|1] "" XXX + SG_ Cluster_VehicleSpeed : 15|8@0+ (1,0) [0|255] "mph" XXX + SG_ Cluster_Odometer : 23|32@0+ (0.1,0) [0|429496729.5] "" XXX + +BO_ 1280 RCM_Dtc: 8 RCM + SG_ RCM_Dtc_Checksum : 7|8@0+ (1,0) [0|25] "" VDM + SG_ RCM_Dtc_Counter : 11|4@0+ (1,0) [0|15] "" VDM + SG_ RCM_Dtc_HighByte : 23|8@0+ (1,0) [0|255] "" VDM + SG_ RCM_Dtc_MidByte : 31|8@0+ (1,0) [0|255] "" VDM + SG_ RCM_Dtc_LowByte : 39|8@0+ (1,0) [0|255] "" VDM + SG_ RCM_Dtc_Stat_Bit : 47|8@0+ (1,0) [0|255] "" VDM + SG_ RCM_Dtc_Number : 55|8@0+ (1,0) [0|255] "" VDM + +BO_ 1281 RCM_SerialIdentifier: 8 RCM + SG_ RCM_SerialNumber : 7|64@0+ (1,0) [0|1.84467440737096e+19] "" ESP,VDM + +BO_ 1328 Dummy_ACM_PrimaryActuatorCAN: 8 ACM + SG_ Dummy_ACM_PrimaryActuatorCAN : 7|8@0+ (1,0) [0|255] "" TestTool + +BO_ 1329 Dummy_CGM_PrimaryActuatorCAN: 1 CGM + SG_ Dummy_CGM_PrimaryActuatorCAN : 7|8@0+ (1,0) [0|255] "" TestTool + +BO_ 1330 Dummy_VDM_PrimaryActuatorCAN: 1 VDM + SG_ Dummy_VDM_PrimaryActuatorCAN : 7|8@0+ (1,0) [0|255] "" TestTool + +BO_ 1535 DoorStatus: 8 XXX + SG_ DoorOpen : 8|1@0+ (1,0) [0|1] "" XXX + +BO_ 1545 XCP_Cmd_VDM: 8 TestTool + +BO_ 1609 XCP_Resp_VDM: 8 VDM + +BO_ 1635 XCP_Cmd_EPAS_P: 8 TestTool + +BO_ 1636 XCP_Daq_EPAS_P: 8 EPAS_P + +BO_ 1637 XCP_Resp_EPAS_P: 8 EPAS_P + +BO_ 1640 OCS_PassSeatInfo: 8 OCS + SG_ OCS_Checksum : 0|8@1+ (1,0) [0|255] "-" RCM + SG_ OCS_Counter : 8|4@1+ (1,0) [0|15] "-" RCM + SG_ OCS_FrontPassClass : 16|4@1+ (1,0) [0|15] "" RCM + SG_ OCS_FrontPassClassValid : 20|1@1+ (1,0) [0|1] "" RCM + SG_ OCS_FrontPassFaultStatus : 21|2@1+ (1,0) [0|3] "" RCM + SG_ OCS_Reserved_1 : 23|1@1+ (1,0) [0|1] "" RCM + SG_ OCS_FrontPassSBRStatus : 24|4@1+ (1,0) [0|15] "" RCM + SG_ OCS_OperatingMode : 28|4@1+ (1,0) [0|15] "" RCM + SG_ OCS_Reserved_2 : 56|8@1+ (1,0) [0|255] "" RCM + +BO_ 1705 XCP_Daq_VDM: 8 VDM + +BO_ 1800 Diag_PhysReq_ACM_PrimaryActuator: 8 TestTool + +BO_ 1843 Diag_PhysReq_EPAS_P_PrimaryActua: 8 TestTool + +BO_ 1844 Diag_PhysReq_RCM_PrimaryActuator: 8 TestTool + +BO_ 1845 Diag_PhysReq_ESP_PrimaryActuator: 8 TestTool + +BO_ 1846 Diag_PhysReq_IBM_PrimaryActuator: 8 TestTool + +BO_ 1864 Diag_PhysResp_ACM_PrimaryActuato: 8 ACM + +BO_ 1907 Diag_PhysResp_EPAS_P_PrimaryActu: 8 EPAS_P + +BO_ 1908 Diag_PhysResp_RCM_PrimaryActuato: 8 RCM + +BO_ 1909 Diag_PhysResp_ESP_PrimaryActuato: 8 ESP + +BO_ 1910 Diag_PhysResp_IBM_PrimaryActuato: 8 IBM + +CM_ BO_ 64 "External steering angle sensor message."; +CM_ BO_ 801 "Not a reference message. Suspected ECU source is SCCM (Steering Column Control Module). Used by ACM to show hold wheel message on ACC engagement."; +CM_ SG_ 64 SAS_Status_Checksum "Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel position) where a left turn (counterclockwise from steering wheel centre position) is represented by positive values and right turn (clockwise from steering wheel centre position) will have negative value. Checksum for steering wheel sensor data."; +CM_ SG_ 64 SAS_Status_Counter "Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel position) where a left turn (counterclockwise from steering wheel centre position) is represented by positive values and right turn (clockwise from steering wheel centre position) will have negative value. Counter value for steering wheel sensor data."; +CM_ SG_ 64 SAS_Status_AngleSafe "Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel position) where a left turn (counterclockwise from steering wheel centre position) is represented by positive values and right turn (clockwise from steering wheel centre position) will have negative value. Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel"; +CM_ SG_ 64 SAS_Status_AngleSpeedSafe "Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel position) where a left turn (counterclockwise from steering wheel centre position) is represented by positive values and right turn (clockwise from steering wheel centre position) will have negative value. Steering angle speed with steering wheel rotation direction. Turning the steering wheel left (counterclockwise) is represented by positive values and"; +CM_ SG_ 64 SAS_StatusQ "Actual steering wheel angle from the actual centre position of the steering wheel. The signal value is a signed value from zero (at centre steering wheel position) where a left turn (counterclockwise from steering wheel centre position) is represented by positive values and right turn (clockwise from steering wheel centre position) will have negative value. Qf for steering wheel sensor information"; +CM_ SG_ 256 ACM_Status_Checksum "Checksum signal for frame"; +CM_ SG_ 256 ACM_Status_Counter "Message counter signal for frame"; +CM_ SG_ 256 ACM_FeatureStatus "Current active ADAS feature"; +CM_ SG_ 256 ACM_FaultStatus "Reason for ACM fault"; +CM_ SG_ 257 ACM_AebRequest_Checksum "J1850"; +CM_ SG_ 257 ACM_AebRequest_Counter "Message Counter"; +CM_ SG_ 257 ACM_StopRequest "AEB Stop Request subsequent to AEB event"; +CM_ SG_ 257 ACM_FailInfo "AEB System Failure flags"; +CM_ SG_ 257 ACM_DbsLevel "Dynamic Braking Support (DBS) Level"; +CM_ SG_ 257 ACM_OnOffStatus "AEB System On/Off Status"; +CM_ SG_ 257 ACM_DecelRequest "AEB Target Deceleration command"; +CM_ SG_ 257 ACM_WarnLevel "AEB Warning Level"; +CM_ SG_ 257 ACM_PrefillEnableRequest "AEB Pre-fill Enable Request"; +CM_ SG_ 257 ACM_EnableRequest "AEB Enable Request"; +CM_ SG_ 258 ESP_AebFeedback_Checksum "J1850 Checksum"; +CM_ SG_ 258 ESP_AebFeedback_Counter "Message Counter"; +CM_ SG_ 258 iB_BrakePedalApplied_Q "Description: Qualifier for iBESP2_BrakePedalApplied signal"; +CM_ SG_ 258 iB_BrakePedalApplied "Description: Indicates whether the driver operates the brake pedal. Only active when the driver brakes, not when an external brake command implemented on iB + +Note: +1.Needed for HBB and HBC + +2. Monitoring for pMC (BSM)"; +CM_ SG_ 258 ESP_DecelFeedback "AEB Decel Feedback"; +CM_ SG_ 258 ESP_AebActive "AEB Active"; +CM_ SG_ 258 ESP_AebAvailable "AEB Available"; +CM_ SG_ 258 ESP_DbsActive "DBS Active"; +CM_ SG_ 258 ESP_PrefillActiveFeedback "Prefill Active Feedback"; +CM_ BO_ 272 "External steering angle control message for EPAS."; +CM_ SG_ 272 ACM_SteeringControl_Checksum "Checksum for DAS_steeringControl message. Refer to AUTOSAR E2E library Profile 1."; +CM_ SG_ 272 ACM_SteeringControl_Counter "Message counter for DAS_steeringControl message. It counts from 0 to 14 and rolls back to 0 after reaching14. Refer to AUTOSAR E2E library Profile 1."; +CM_ SG_ 272 ACM_EacEnabled "External angle control type for EPAS."; +CM_ SG_ 272 ACM_HapticRequired "External angle control type for EPAS."; +CM_ SG_ 272 ACM_SteeringAngleRequest "External angle control request for EPAS"; +CM_ SG_ 304 RCM_IMU_LatAcc "Inertial Measurement Unit Lateral Acceleration Primary"; +CM_ SG_ 320 RCM_IMU_LongAcc_Sig "Inertial Measurement Unit Longitudinal Accleration Primary"; +CM_ SG_ 338 VDM_EpbRequest "Apply and release request (EVIC, Shift to From Park/Stalk Switch Input)"; +CM_ SG_ 338 VDM_EpasPowerMode "EPAS power mode request."; +CM_ SG_ 352 ACM_longitudinalRequest_Checksum "Checksum signal for frame"; +CM_ SG_ 352 ACM_longitudinalRequest_Counter "Message counter signal for frame"; +CM_ SG_ 352 ACM_AccelerationRequest "Acceleration Request command from the ACM"; +CM_ SG_ 352 ACM_VehicleHoldRequired "Vehicle hold request flag"; +CM_ SG_ 352 ACM_PrndRequest "Gear state Request command from the ACM"; +CM_ SG_ 352 ACM_longInterfaceEnable "Acceleration Interface Enable Request from the ACM"; +CM_ SG_ 352 ACM_VehicleHoldRequest "Vehicle hold request from ACM"; +CM_ SG_ 354 VDM_AdasStatus_Checksum "VDM_AdasSts message j1850 checksum."; +CM_ SG_ 354 VDM_AdasStatus_Counter "VDM_AdasSts message counter."; +CM_ SG_ 354 VDM_AdasFaultStatus "Fault status of ADAS requests from VDM."; +CM_ SG_ 354 VDM_AdasDriverModeStatus "Signal which describes who is commanding the torque - Human or ADAS"; +CM_ SG_ 432 ESP_Torque_Front_MinQ "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 432 ESP_Torque_Front_MaxQ "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 432 ESP_Torque_Front_Max "ESP intervention, ESP tractive torque limit per axle."; +CM_ SG_ 432 ESP_Torque_Front_Min "ESP intervention, ESP regen torque limit per axle."; +CM_ SG_ 448 ESP_Torque_Rear_Checksum "J1850 Checksum"; +CM_ SG_ 448 ESP_Torque_Rear_Counter "Message Counter"; +CM_ SG_ 448 ESP_Torque_Rear_MinQ "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 448 ESP_Torque_Rear_MaxQ "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 448 ESP_Torque_Rear_Max "ESP intervention, ESP tractive torque limit per axle."; +CM_ SG_ 448 ESP_Torque_Rear_Min "ESP intervention, ESP regen torque limit per axle."; +CM_ SG_ 520 ESP_Status_Checksum "J1850 Checksum"; +CM_ SG_ 520 ESP_Status_Counter "Message Counter"; +CM_ SG_ 520 ESP_BrakeLightActive_Q "Indication of whether ESP_BrakeLightActive signal is valid"; +CM_ SG_ 520 ESP_BrakeLightActive "ESP Request to Activate Rear Brake Lamps"; +CM_ SG_ 520 ESP_Hhc_Active "HHC Active"; +CM_ SG_ 520 ESP_Hhc_Available "HHC Available"; +CM_ SG_ 520 ESP_Tsm_Active "Trailer Sway Mitigation Active Flag"; +CM_ SG_ 520 ESP_FaultLamp_EBD "ESP request to display ABS-TC Fault Lamp"; +CM_ SG_ 520 ESP_FaultLamp_VDC "ESP request to display ABS/ESP Fault Lamp"; +CM_ SG_ 520 ESP_FaultLamp_ABS "ESP request to display ABS Fault Lamp"; +CM_ SG_ 520 ESP_Esp_Active "Vehicle Stability Control is actively managing a stability event"; +CM_ SG_ 520 ESP_Abs_Active "Anti-Lock Brakes is actively working to prevent the brakes from locking up"; +CM_ SG_ 520 ESP_Partial_Mode "ESP current PATA mode"; +CM_ SG_ 520 ESP_Dtc_Active "Drag Torque Control is actively requesting torque."; +CM_ SG_ 520 ESP_Vehicle_Speed_Q "Indication of whether ESP_VehicleSpeed signal is valid"; +CM_ SG_ 520 ESP_Lfc_Available "LFC Available"; +CM_ SG_ 520 ESP_Hba_Active "HBA Active"; +CM_ SG_ 520 ESP_BrkTrq "ESP Brake Torque"; +CM_ SG_ 520 ESP_Lfc_Active "LFC Active"; +CM_ SG_ 520 ESP_Vehicle_Speed "ESP calculated vehicle speed. Average of front wheels on rear wheel drive vehicles. Average of all four wheels on dual motor vehicles."; +CM_ SG_ 521 ESP_WSpeed_Front_CRC "J1850 Checksum"; +CM_ SG_ 521 ESP_WSpeed_Front_Message_Counter "Message Counter"; +CM_ SG_ 521 ESP_Wheel_Speed_Left_Front_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 521 ESP_Wheel_Speed_Right_Front_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 521 ESP_Wheel_Speed_Left_Front "Wheel Speed Left Front"; +CM_ SG_ 521 ESP_Wheel_Speed_Right_Front "Wheel Speed Right Front"; +CM_ SG_ 521 ESP_Wheel_Dir_Right_Front "Wheel Rotation Direction Right Front"; +CM_ SG_ 521 ESP_Wheel_Dir_Left_Front "Wheel Rotation Direction Left Front"; +CM_ SG_ 522 ESP_WSpeed_Rear_CRC "J1850 Checksum"; +CM_ SG_ 522 ESP_WSpeed_Rear_Message_Counter "Message Counter"; +CM_ SG_ 522 ESP_Wheel_Speed_Left_Rear_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 522 ESP_Wheel_Speed_Right_Rear_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 522 ESP_Wheel_Speed_Left_Rear "Wheel Speed Left Rear"; +CM_ SG_ 522 ESP_Wheel_Speed_Right_Rear "Wheel Speed Right Rear"; +CM_ SG_ 522 ESP_Wheel_Dir_Right_Rear "Wheel Rotation Direction Right Rear"; +CM_ SG_ 522 ESP_Wheel_Dir_Left_Rear "Wheel Rotation Direction Left Rear"; +CM_ SG_ 523 ESP_Wheel_Pulse_CRC "J1850 Checksum"; +CM_ SG_ 523 ESP_Wheel_Pulse_Message_Counter "Message Counter"; +CM_ SG_ 523 ESP_Wheel_Pulse_Left_Front "Wheel Pulse Left Front"; +CM_ SG_ 523 ESP_Wheel_Pulse_Left_Rear "Wheel Pule Left Rear"; +CM_ SG_ 523 ESP_Wheel_Pulse_Right_Front "Wheel Pulse Right Front"; +CM_ SG_ 523 ESP_Wheel_Pulse_Right_Rear "Wheel Pulse Right Rear"; +CM_ SG_ 523 ESP_Wheel_Pulse_Right_Front_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 523 ESP_Wheel_Pulse_Right_Rear_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 523 ESP_Wheel_Pulse_Left_Rear_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 523 ESP_Wheel_Pulse_Left_Front_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 524 ESP_BrakeP_Checksum "J1850 Checksum"; +CM_ SG_ 524 ESP_BrakeP_Message_Counter "Message Counter"; +CM_ SG_ 524 ESP_BrakePressure_RF_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 524 ESP_BrakePressure_LF_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 524 ESP_BrakePressure_LF "Brake Pressure Left Front"; +CM_ SG_ 524 ESP_BrakePressure_LR "Brake Pressure Left Rear"; +CM_ SG_ 524 ESP_BrakePressure_RF "Brake Pressure Right Front"; +CM_ SG_ 524 ESP_BrakePressure_RR "Brake Pressure Right Rear"; +CM_ SG_ 524 ESP_MasterCyl_Pressure "Master Cylinder Brake Pressure"; +CM_ SG_ 524 ESP_MasterCyl_Pressure_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 524 ESP_BrakePressure_RR_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 524 ESP_BrakePressure_LR_Q "Indication of whether signal with corresponding name is valid"; +CM_ SG_ 529 VDM_OutputTorqueFront "Output torque which is currently provided by the electric machine"; +CM_ SG_ 529 VDM_DriverIntendedTorqueFront "Driver Requested Torque pre ESP limits being applied"; +CM_ SG_ 530 VDM_OutputTorqueRear "Output torque which is currently provided by the electric machine"; +CM_ SG_ 530 VDM_DriverIntendedTorque_Rear "Driver Requested Torque pre ESP limits being applied"; +CM_ SG_ 592 VDM_EcasHeightFL "Change in ride height, with zero referenced to normal/design ride height"; +CM_ SG_ 592 VDM_EcasHeightFR "Change in ride height, with zero referenced to normal/design ride height"; +CM_ SG_ 592 VDM_EcasHeightRL "Change in ride height, with zero referenced to normal/design ride height"; +CM_ SG_ 592 VDM_EcasHeightRR "Change in ride height, with zero referenced to normal/design ride height"; +CM_ SG_ 811 ESP_EpbStatus_Checksum "J1850 Checksum"; +CM_ SG_ 811 ESP_EpbStatus_Counter "Message Counter"; +CM_ SG_ 811 ESP_EpbAvailable "EPB Availability. Shows the availability of the EPB function."; +CM_ SG_ 811 ESP_EpbServiceMode "Indication whether EPB is in service mode."; +CM_ SG_ 811 ESP_EpbWarningLamp "Failure Driver Lamp indication for EPB."; +CM_ SG_ 811 ESP_EpbMessageDisplayRequest "EPB text message"; +CM_ SG_ 811 ESP_EpbStatus "Current EPB actuator state."; +CM_ SG_ 811 ESP_EpbClampForce "Currently applied clamp force of EPB."; +CM_ SG_ 811 ESP_EpbFunctionLamp "Driver Lamp indication for EPB (LED on button)."; +CM_ BO_ 848 "Forwarded Message from EPAS Primary to Secondary ECU via Public CAN."; +CM_ BO_ 864 "Forwarded Message from EPAS Secondary to Primary ECU via Public CAN ."; +CM_ BO_ 896 "EPAS status info."; +CM_ SG_ 896 EPAS_SytemStatus_Checksum "Checksum for EPAS_sysStatus message. Refer to AUTOSAR E2E library Profile 1."; +CM_ SG_ 896 EPAS_SystemStatus_Counter "Message counter for EPAS_sysStatus message. It counts from 0 to 14 and rolls back to 0 after reaching14. Refer to AUTOSAR E2E library Profile 1."; +CM_ SG_ 896 EPAS_SteeringReduced "Power steering is functional, but reduced."; +CM_ SG_ 896 EPAS_SteeringFault "Power steering is not-available."; +CM_ SG_ 896 EPAS_SteeringMode "ESP current PATA mode"; +CM_ BO_ 907 "Basic communication ESP iBooster"; +CM_ SG_ 907 ESPiB1_Checksum "J1850 Checksum"; +CM_ SG_ 907 ESPiB1_AliveCounter "Message Counter"; +CM_ SG_ 907 ESPiB1_IgnitionOn "Description: Indicates whether the key is turned or not in the car + +Note: Used in PostRun calculation in iBooster"; +CM_ SG_ 907 ESPiB1_VehicleSpeed_Q "Description: Qualifier of the signal : ESPiB1_VehicleSpeed_Q + +Note: Robert Bosch Standard qualifier"; +CM_ SG_ 907 ESPiB1_VehicleSpeed "Description: Averaged wheel speed (signal in m/s on CAN but monitored in km/h in dbc) + +Note: +for standstill detection in iBooster + +1. For HEV function in iBoosterhev + +2. For EBR +3. Logic for Pressure Reduction"; +CM_ SG_ 908 ESPiB2_Checksum "J1850 Checksum"; +CM_ SG_ 908 ESPiB2_Alive_Counter "Message Counter"; +CM_ SG_ 908 ESPiB2_qTargetExternal_Q "Description: Qualifier for the volume flow interface + +Note: Qualifier for the volume flow interface"; +CM_ SG_ 908 ESPiB2_qTargetExternal "Description: Target flow of the brake system to be applied by iBooster for EBR. + +Note: For EBR through iBooster, interface needs to be operated together with ESPiB_pTargetExternal."; +CM_ BO_ 909 "Extended communication ESP iBooster"; +CM_ SG_ 909 ESPiB3_Checksum "J1850 Checksum"; +CM_ SG_ 909 ESPiB3_AliveCounter "Message Counter"; +CM_ SG_ 909 ESPiB3_ABSActive "Description: Indicates that at least one wheel ABS is in control + +Note: +1. For ABS pressure limitation + +2. For HEV function"; +CM_ SG_ 909 ESPiB3_ForceBlendingActive "Description: Control state of force-blending interface + +Note: Used by PFC in iB"; +CM_ SG_ 909 ESPiB3_pMcVirtual "Description: Virtual master cylinder pressure determined in ESP from boost body position of iBooster. + +note: +1. to control the force-blending of recuperation in ESPhev. +2. For JumpIn/Gain Adjustment in iBooster"; +CM_ SG_ 909 ESPiB3_pMcVirtual_Q "Description: Qualifier for the ESPiB3_pMcVirtual_Q signal"; +CM_ SG_ 909 ESPiB3_pForceBlendingMC "Description : Master Cylinder pressure used by force blending function. Can differ from real master cylinder pressure, to avoid short peaks and disturbances which should not be compensated by force-blending + +Note: Used by PFC in iB"; +CM_ SG_ 909 ESPiB3_pMC1 "Description: Current pressure of the master cylinder pressure sensor in the ESP. Raw value without offset compensation. + + +Note: +1. For pressure reduction logic + +2. For HEV Function + +3. For EBR + +4. For runout definition"; +CM_ SG_ 909 ESPiB3_pForceBlendingMC_Q "Description: Qualifier for the ESPiB3_pForceBlendingMC"; +CM_ SG_ 909 ESPiB3_pMC1_Q "Description: Qualifier for ESPiB3_pMC1_Q signal"; +CM_ SG_ 910 iBESP1_ExtReqPrio "To determine driver's braking request for EBR together with sPushRod, eg for CDD"; +CM_ SG_ 910 iBESP1_ExtReqStatus "Status of external brake request (EBR) function"; +CM_ SG_ 910 iBESP1_sOutputRodDriver "Information of driver brake request. +Calculation of: +- target value for output rod in iBooster +Also shows pedal travel with active pressure increase via iBooster"; +CM_ SG_ 910 iBESP1_sOutputRodDriver_Q "Information about the signal quality of sOutputRodDriver"; +CM_ SG_ 910 iBESP1_sOutputRodAct "Current value for output rod in iBooster indicates the shifted volume in master cylinder. Gives information, if the compensation port is closed."; +CM_ SG_ 910 iBESP1_sOutputRodAct_Q "Information about the signal quality of sOutputRodAct"; +CM_ SG_ 911 iBESP2_CompatibilityIndex "Description: iB is sending an static number which which must fit to the same number monitored in ESP to ensure the compatibility of the two ECU."; +CM_ SG_ 911 iBESP2_pRunout_Q "Description: Qualifier for the iBESP2_pRunout signal"; +CM_ SG_ 911 iBESP2_iBDiagActive "iB is in extended Diag Session (iB_ActiveMode = Diagnosis)"; +CM_ SG_ 911 iBESP2_HbcRequest "request HBC if amplification of iB is not possible"; +CM_ SG_ 911 iBESP2_BrakePedalApplied_Q "Description: Qualifier for iBESP2_BrakePedalApplied signal"; +CM_ SG_ 911 iBESP2_BrakePedalApplied "Description: Indicates whether the driver operates the brake pedal. Only active when the driver brakes, not when an external brake command implemented on iB + +Note: +1.Needed for HBB and HBC + +2. Monitoring for pMC (BSM)"; +CM_ SG_ 911 iBESP2_pRunout "Description: In driver braking: maximum achievable master cylinder pressure with boost (runout.) +With an active pressure increase: maximum achievable brake master cylinder pressure. + +Note: +1. Required for HBB + +2. For LDM demand on iB (EBR)"; +CM_ SG_ 912 EPAS_EacStatus "Status of the EAC function of EPAS, to indicate what mode is active."; +CM_ SG_ 912 EPAS_EacErrorCode "EPAS external angle control error code."; +CM_ SG_ 912 EPAS_InternalSas "Steering wheel angle measured by EPAS"; +CM_ SG_ 912 EPAS_InternalSasQ "Steering angle sensor validity status"; +CM_ SG_ 1640 OCS_Checksum "Checksum signal for frame"; +VAL_ 64 SAS_Status_Calibrated 0 "SAS_Status_Calibrated_Not_Calibrated" 1 "SAS_Status_Calibrated_Calibrated"; +VAL_ 64 SAS_StatusQ 0 "SAS_Status_UndefinedDataACCur" 1 "SAS_Status_TmpUnDefinedData" 2 "SAS_Status_DataACCurrentNotWithinSpecification" 3 "SAS_Status_ACCurrentData"; +VAL_ 256 ACM_FeatureStatus 0 "ACM_FeatureStatus_Standby" 1 "ACM_FeatureStatus_Acc" 2 "ACM_FeatureStatus_Hwp" 3 "ACM_FeatureStatus_Uf" 4 "ACM_FeatureStatus_Faulted"; +VAL_ 256 ACM_FaultStatus 0 "ACM_FaultStatus_NoFault" 1 "ACM_FaultStatus_Faulted" 7 "ACM_FaultStatus_Sna"; +VAL_ 256 ACM_FaultSupervisorState 0 "Nominal_Operation" 1 "SS_1" 2 "SS_2" 3 "SS_3" 4 "SS_4" 5 "SS_5" 6 "SS_6" 7 "Reserved"; +VAL_ 257 ACM_StopRequest 0 "ACM_StopRequest_No_Request" 1 "ACM_StopRequest_Request"; +VAL_ 257 ACM_FailInfo 0 "ACM_FailInfo_Normal" 1 "ACM_FailInfo_Temp_Unav_By_Camera" 2 "ACM_FailInfo_Temp_Unav_By_Radar" 3 "ACM_FailInfo_Service_Required"; +VAL_ 257 ACM_DbsLevel 0 "ACM_DbsLevel_No_Activation" 1 "ACM_DbsLevel_Level_1" 2 "ACM_DbsLevel_Level_2" 3 "ACM_DbsLevel_Level_3"; +VAL_ 257 ACM_OnOffStatus 0 "ACM_OnOffStatus_Off" 1 "ACM_OnOffStatus_On_Fcw" 2 "ACM_OnOffStatus_On_Aeb" 3 "ACM_OnOffStatus_Invalid"; +VAL_ 257 ACM_WarnLevel 0 "ACM_WarnLevel_No_Warning" 1 "ACM_WarnLevel_Warning_Level_1" 2 "ACM_WarnLevel_Warning_Level_2" 3 "ACM_WarnLevel_Warning_Level_3"; +VAL_ 257 ACM_PrefillEnableRequest 0 "ACM_PrefillEnableRequest_Disable" 1 "ACM_PrefillEnableRequest_Enable"; +VAL_ 257 ACM_EnableRequest 0 "ACM_EnableRequest_Disable" 1 "ACM_EnableRequest_Enable"; +VAL_ 258 iB_BrakePedalApplied_Q 0 "iB_BrakePedalApplied_Q_No_Init_Or_Off" 1 "iB_BrakePedalApplied_Q_Applied_Normal" 2 "iB_BrakePedalApplied_Q_Applied_Faulty"; +VAL_ 258 iB_BrakePedalApplied 0 "iB_BrakePedalApplied_NotApplied" 1 "iB_BrakePedalApplied_Applied"; +VAL_ 258 ESP_AebActive 0 "ESP_AebActive_Inactive" 1 "ESP_AebActive_Active"; +VAL_ 258 ESP_AebAvailable 0 "ESP_AebAvailable_Not_Available" 1 "ESP_AebAvailable_Available"; +VAL_ 258 ESP_DbsActive 0 "ESP_DbsActive_Dbs_Inactive" 1 "ESP_DbsActive_Dbs_Active"; +VAL_ 258 ESP_PrefillActiveFeedback 0 "ESP_PrefillActiveFeedback_Inactive" 1 "ESP_PrefillActiveFeedback_Active"; +VAL_ 258 ESP_PrefillAvailable 0 "ESP_PrefillAvailible_NotAvailable" 1 "ESP_PrefillAvailible_Available"; +VAL_ 258 ESP_DbsAvailable 0 "ESP_DbsAvailable_NotAvailable" 1 "ESP_DbsAvailable_Available"; +VAL_ 272 ACM_EacEnabled 0 "ACM_EacEnable_None" 1 "ACM_EacEnable_Enabled" 2 "ACM_EacEnable_Reserved"; +VAL_ 272 ACM_HapticRequired 0 "ACM_HapticRequired_Inactive" 1 "ACM_HapticRequired_Active"; +VAL_ 288 ACM_HapticRequest 0 "ACM_HapticRequest_No_Request" 1 "ACM_HapticRequest_Haptic_Request"; +VAL_ 288 ACM_lkaSymbolState 0 "ACM_LKASYMBOLSTATE_OFF" 1 "ACM_LKASYMBOLSTATE_WHITE_ON_LDW_STANDBY" 2 "ACM_LKASYMBOLSTATE_GREEN_ON_LDW_LKA_STANDBY" 3 "ACM_LKASYMBOLSTATE_GREEN_BLNK_LDW_WARN_OR_LKA_CNTRL" 4 "ACM_LKASYMBOLSTATE_ORANGE_ON_FAIL" 5 "ACM_LKASYMBOLSTATE_ORANGE_BLINK_NOT_CALIBRATED" 6 "ACM_LKASYMBOLSTATE_ORANGE_ON_REGULATION" 7 "ACM_LKASYMBOLSTATE_WHITE_BLINK"; +VAL_ 288 ACM_lkaToiFlt 0 "ACM_LKATOIFLT_NO_FAULT" 1 "ACM_LKATOIFLT_FAULT_PRESENT"; +VAL_ 288 ACM_lkaActToi 0 "ACM_LKAACTTOI_DE_ACTIVATE_TOI" 1 "ACM_LKAACTTOI_ACTIVATE_TOI"; +VAL_ 288 ACM_hbaSysState 0 "ACM_HBASYSSTATE_DEFAULT_DISABLE" 1 "ACM_HBASYSSTATE_HBA_ENABLE_HIGH_BEAM_OFF" 2 "ACM_HBASYSSTATE_HBA_ENABLE_HIGH_BEAM_ON" 7 "ACM_HBASYSSTATE_SYSTEM_FAIL"; +VAL_ 288 ACM_ldwRHWarning 0 "ACM_LKARHWARNING_NO_WARNING" 1 "ACM_LKARHWARNING_HAPTIC_WARNING_AND_DISPLAY" 2 "ACM_LKARHWARNING_ACOUSTIC_WARNING_AND_DISPLAY" 3 "ACM_LKARHWARNING_HAPTIC_ACOUSTIC_AND_DISPLAY"; +VAL_ 288 ACM_ldwLHWarning 0 "ACM_LKALHWARNING_NO_WARNING" 1 "ACM_LKALHWARNING_HAPTIC_WARNING_AND_DISPLAY" 2 "ACM_LKALHWARNING_ACOUSTIC_WARNING_AND_DISPLAY" 3 "ACM_LKALHWARNING_HAPTIC_ACOUSTIC_AND_DISPLAY"; +VAL_ 288 ACM_lkaLaneRecogState 0 "ACM_LKALANERECOGSTATE_NOT_RECOGNITION" 1 "ACM_LKALANERECOGSTATE_LEFT_LANE_RECOGNITION" 2 "ACM_LKALANERECOGSTATE_RIGHT_LANE_RECOGNITION" 3 "ACM_LKALANERECOGSTATE_FULL_LANE_RECOGNITION"; +VAL_ 288 ACM_hbaLamp 0 "ACM_HBALAMP_HBA_INDICATOR_LAMP_OFF" 1 "ACM_HBALAMP_HBA_INDICATOR_LAMP_ON"; +VAL_ 288 ACM_lkaHandsoffSoundWarning 0 "ACM_LKAHANDSOFFSOUNDWARNING_NO_INFO" 1 "ACM_LKAHANDSOFFSOUNDWARNING_WARNING" 2 "ACM_LKAHANDSOFFSOUNDWARNING_RESERVED_2" 3 "ACM_LKAHANDSOFFSOUNDWARNING_RESERVED_3"; +VAL_ 288 ACM_lkaHandsoffDisplayWarning 0 "ACM_LKAHANDSOFFDISPLAYWARNING_NO_INFO" 1 "ACM_LKAHANDSOFFDISPLAYWARNING_WARNING" 2 "ACM_LKAHANDSOFFDISPLAYWARNING_RESERVED_2" 3 "ACM_LKAHANDSOFFDISPLAYWARNING_RESERVED_3"; +VAL_ 288 ACM_lkaElkRequest 0 "off" 1 "applying torque right for left departure" 2 "applying torque left for right departure"; +VAL_ 288 ACM_ldwlkaOnOffState 1 "LDW on" 2 "LKAS+LDW on" 3 "all off"; +VAL_ 288 ACM_elkOnOffState 1 "LKAS toggled on" 2 "LKAS toggled off"; +VAL_ 304 RCM_IMU_LatAcc_Stat_SensAvail 0 "RCM_IMU_LatAcc_Stat_SensAvail_InSpec" 1 "RCM_IMU_LatAcc_Stat_SensAvail_NotInSpec"; +VAL_ 304 RCM_IMU_LatAcc_Stat_Fail 0 "RCM_IMU_LatAcc_Stat_Fail_NotFailed" 1 "RCM_IMU_LatAcc_Stat_Fail_Failed"; +VAL_ 304 RCM_IMU_LatAcc_Stat_Init 0 "RCM_IMU_LatAcc_Stat_Init_Finished" 1 "RCM_IMU_LatAcc_Stat_Init_Running"; +VAL_ 304 RCM_IMU_LatAcc_Stat_Startup 0 "RCM_IMU_LatAcc_Stat_Startup_Finished" 1 "RCM_IMU_LatAcc_Stat_Startup_Running"; +VAL_ 304 RCM_IMU_Yaw_Stat_SensAvail 0 "RCM_IMU_Yaw_Stat_SensAvail_InSpec" 1 "RCM_IMU_Yaw_Stat_SensAvail_NotInSpec"; +VAL_ 304 RCM_IMU_Yaw_Stat_Fail 0 "RCM_IMU_Yaw_Stat_Fail_NotFailed" 1 "RCM_IMU_Yaw_Stat_Fail_Failed"; +VAL_ 304 RCM_IMU_Yaw_Stat_Init 0 "RCM_IMU_Yaw_Stat_Init_Finish" 1 "RCM_IMU_Yaw_Stat_Init_Running"; +VAL_ 304 RCM_IMU_Yaw_Stat_Startup 0 "RCM_IMU_Yaw_Stat_Startup_Finished" 1 "RCM_IMU_Yaw_Stat_Startup_Running"; +VAL_ 309 RCM_IMU_Roll_Stat_SensAvail 0 "RCM_IMU_Roll_Stat_SensAvail_InSpec" 1 "RCM_IMU_Roll_Stat_SensAvail_NotInSpec"; +VAL_ 309 RCM_IMU_Roll_Stat_Fail 0 "RCM_IMU_Roll_Stat_Fail_NotFailed" 1 "RCM_IMU_Roll_Stat_Fail_Failed"; +VAL_ 309 RCM_IMU_Roll_Stat_Init 0 "RCM_IMU_Roll_Stat_Init_Finished" 1 "RCM_IMU_Roll_Stat_Init_Running"; +VAL_ 309 RCM_IMU_Roll_Stat_Startup 0 "RCM_IMU_Roll_Stat_Startup_Finished" 1 "RCM_IMU_Roll_Stat_Startup_Running"; +VAL_ 309 RCM_IMU_Heave_Stat_SensAvail 0 "RCM_IMU_Heave_Stat_SensAvail_InSpec" 1 "RCM_IMU_Heave_Stat_SensAvail_NotInSpec"; +VAL_ 309 RCM_IMU_Heave_Stat_Fail 0 "RCM_IMU_Heave_Stat_Fail_NotFailed" 1 "RCM_IMU_Heave_Stat_Fail_Failed"; +VAL_ 309 RCM_IMU_Heave_Stat_Init 0 "RCM_IMU_Heave_Stat_Init_Finished" 1 "RCM_IMU_Heave_Stat_Init_Running"; +VAL_ 309 RCM_IMU_Heave_Stat_Startup 0 "RCM_IMU_Heave_Stat_Startup_Finished" 1 "RCM_IMU_Heave_Stat_Startup_Running"; +VAL_ 320 RCM_IMU_LongAcc_Stat_SensAvail 0 "RCM_IMU_LongAcc_Stat_SensAvail_InSpec" 1 "RCM_IMU_LongAcc_Stat_SensAvail_NotInSpec"; +VAL_ 320 RCM_IMU_LongAcc_Stat_Fail 0 "RCM_IMU_LongAcc_Stat_Fail_NotFailed" 1 "RCM_IMU_LongAcc_Stat_Fail_Failed"; +VAL_ 320 RCM_IMU_LongAcc_Stat_Init 0 "RCM_IMU_LongAcc_Stat_Init_Finished" 1 "RCM_IMU_LongAcc_Stat_Init_Running"; +VAL_ 320 RCM_IMU_LongAcc_Stat_Startup 0 "RCM_IMU_LongAcc_Stat_Startup_Finished" 1 "RCM_IMU_LongAcc_Stat_Startup_Running"; +VAL_ 336 VDM_PropsnActv 0 "VDM_PropsnActv_Not_Defined" 1 "VDM_PropsnActv_Active" 2 "VDM_PropsnActv_Inactive"; +VAL_ 336 VDM_VehicleSpeedQ 0 "VDM_VehSpdQ_Inactive" 1 "VDM_VehSpdQ_Active"; +VAL_ 336 VDM_Prndl_Status 0 "VDM_Prndl_Status_Not_Defined" 1 "VDM_Prndl_Status_Park" 2 "VDM_Prndl_Status_Reverse" 3 "VDM_Prndl_Status_Neutral" 4 "VDM_Prndl_Status_Drive"; +VAL_ 336 VDM_Prndl_Request 0 "VDM_Prndl_Request_No_Req" 1 "VDM_Prndl_Request_Park" 2 "VDM_Prndl_Request_Reverse" 3 "VDM_Prndl_Request_Neutral" 4 "VDM_Prndl_Request_Drive"; +VAL_ 338 VDM_LfcRequestType 0 "LFC_Request_Type_No_Request" 1 "LFC_Request_Type_Brake_Torque_Request_Fx" 2 "LFC_Request_Type_Standstill_Hold_Request_Ssm" 3 "LFC_Request_Type_Release_Ssm"; +VAL_ 338 VDM_LfcActiveRequest 0 "VDM_LfcActiveRequest_Inactive" 1 "VDM_LfcActiveRequest_Active"; +VAL_ 338 VDM_StcFault 0 "Stc_NoFault" 1 "Stc_Fault"; +VAL_ 338 VDM_StcActiveRequest 0 "Stc_NotActive" 1 "Stc_Active"; +VAL_ 338 VDM_EpbRequest 0 "VDM_EpbRequest_No_Request" 1 "VDM_EpbRequest_Release_Req" 2 "VDM_EpbRequest_Apply_Req" 3 "VDM_EpbRequest_Sna"; +VAL_ 338 VDM_ABSOffRoadModeRequest 0 "VDM_ABSOffRoadModeRequest_Inactive" 1 "VDM_ABSOffRoadModeRequest_Active"; +VAL_ 338 VDM_HhcActiveRequest 0 "VDM_HhcActiveRequest_Inactive" 1 "VDM_HhcActiveRequest_Active"; +VAL_ 338 VDM_EspPartialModeRequest 0 "VDM_EspPartialModeRequest_Normal" 1 "VDM_EspPartialModeRequest_Sport" 2 "VDM_EspPartialModeRequest_Esc_Off" 3 "VDM_EspPartialModeRequest_Reserved"; +VAL_ 338 VDM_SteeringModeRequest 0 "VDM_SteeringModeRequest_Default" 1 "VDM_SteeringModeRequest_Normal" 2 "VDM_SteeringModeRequest_Sport" 3 "VDM_SteeringModeRequest_Comfort"; +VAL_ 338 VDM_EpasPowerMode 0 "VDM_EpasPowerMode_Drive_Off" 1 "VDM_EpasPowerMode_Drive_On" 2 "VDM_EpasPowerMode_Shutdown"; +VAL_ 352 ACM_VehicleHoldRequired 0 "ACM_VEHICLEHOLDREQ_NO_REQUEST" 1 "ACM_VEHICLEHOLDREQ_VEHICLE_HOLD_REQUEST"; +VAL_ 352 ACM_PrndRequest 0 "ACM_PRNDREQ_NO_REQUEST" 1 "ACM_PRNDREQ_PARK" 2 "ACM_PRNDREQ_REVERSE" 3 "ACM_PRNDREQ_NEUTRAL" 4 "ACM_PRNDREQ_DRIVE"; +VAL_ 352 ACM_longInterfaceEnable 0 "ACM_LONGIFEN_INIT" 1 "ACM_LONGIFEN_LONGITUDINAL_INTERFACE_ENABLE" 2 "ACM_LONGIFEN_LONGITUDINAL_INTERFACE_DISABLE" 3 "ACM_LONGIFEN_SNA"; +VAL_ 352 ACM_VehicleHoldRequest 0 "NO_REQUEST" 1 "HOLD_REQUEST"; +VAL_ 354 VDM_AdasDriverAccelPriorityStatus 0 "VDM_AdasDriverAccelPriorityStatus_Driver" 1 "VDM_AdasDriverAccelPriorityStatus_Adas"; +VAL_ 354 VDM_AdasFaultStatus 0 "VDM_AdasFlaultStatus_No_Fault" 1 "VDM_AdasFaultStatus_Brk_Intv" 2 "VDM_AdasFlaultStatus_Cntr_Fault" 3 "VDM_AdasFlaultStatus_Imps_Cmd" 15 "VDM_AdasFlaultStatus_Sna"; +VAL_ 354 VDM_AdasDriverModeStatus 0 "VDM_AdasDriverModeStatus_Human" 1 "VDM_AdasDriverModeStatus_Adas" 2 "VDM_AdasDriverModeStatus_Reserved" 3 "VDM_AdasDriverModeStatus_Sna"; +VAL_ 354 VDM_AdasInterfaceStatus 0 "VDM_AdasInterfaceStatus_Unavailable" 1 "VDM_AdasInterfaceStatus_Available" 2 "VDM_AdasInterfaceStatus_Enabled" 3 "VDM_AdasInterfaceStatus_Faulted"; +VAL_ 354 VDM_AdasVehicleHoldStatus 0 "VDM_AdasVehicleHoldStatus_NotHold" 1 "VDM_AdasVehicleHoldStatus_Hold"; +VAL_ 354 VDM_UserAdasRequest 0 "IDLE" 1 "UP_1" 2 "UP_2" 3 "DOWN_1" 4 "DOWN_2"; +VAL_ 357 VDM_AdasStalkGapAdjust 0 "VDM_AdasStalkGapAdjust_No_Required" 1 "VDM_AdasStalkGapAdjust_GapDecrement" 2 "VDM_AdasStalkGapAdjust_GapIncrement"; +VAL_ 357 VDM_AdasStalkAccCancelRes 0 "VDM_AdasStalkAccCancelRes_NoRequired" 1 "VDM_AdasStalkAccCancelRes_Cancel" 2 "VDM_AdasStalkAccCancelRes_Resume"; +VAL_ 357 VDM_AdasStalkAutonomyButton 0 "VDM_AdasStalkAutonomyButton_No_Required" 1 "VDM_AdasStalkAutonomyButton_Pressed"; +VAL_ 357 VDM_AdasStalkAccEnableAdj 0 "VDM_AdasStalkAccEnableAdj_No_Required" 1 "VDM_AdasStalkAccEnableAdj_UpDetent1" 2 "VDM_AdasStalkAccEnableAdj_UpDetent2" 3 "VDM_AdasStalkAccEnableAdj_DownDetent1" 4 "VDM_AdasStalkAccEnableAdj_DownDetent2"; +VAL_ 384 CGM_TrailerPresent 0 "CGM_TrailerPresent_Trailer_Not_Present" 1 "CGM_TrailerPresent_Trailer_Present" 3 "CGM_TrailerPresent_Invalid"; +VAL_ 384 CGM_DriverPresent 0 "CGM_DriverPresent_Driver_Not_Present" 1 "CGM_DriverPresent_Driver_Present" 3 "CGM_DriverPresent_Invalid"; +VAL_ 384 CGM_IgnSwtState 0 "IGNSWTSTATE_OFF" 1 "IGNSWTSTATE_STANDBY" 2 "IGNSWTSTATE_ACCESSORY" 3 "IGNSWTSTATE_RUN" 4 "IGNSWTSTATE_CRANK"; +VAL_ 432 ESP_Torque_Front_MinQ 0 "ESP_TorqueFront_MinQ_Invalid" 1 "ESP_TorqueFront_MinQ_Valid"; +VAL_ 432 ESP_Torque_Front_MaxQ 0 "ESP_TorqueFront_MaxQ_Invalid" 1 "ESP_TorqueFront_MaxQ_Valid"; +VAL_ 448 ESP_Torque_Rear_MinQ 0 "ESP_TorqueLimitRear_MinQ_Invalid" 1 "ESP_TorqueLimitRear_MinQ_Valid"; +VAL_ 448 ESP_Torque_Rear_MaxQ 0 "ESP_TorqueLimitRear_MaxQ_Invalid" 1 "ESP_TorqueLimitRear_MaxQ_Valid"; +VAL_ 516 RCM_ALR_Status_Signal 0 "ALR_Unknown" 1 "ALR_Not_Engaged" 2 "ALR_Engaged" 3 "ALR_Invalid"; +VAL_ 520 ESP_BrakeLightActive_Q 0 "ESP_BRAKELIGHTACTIVE_Q_INVALID" 1 "ESP_BRAKELIGHTACTIVE_Q_VALID"; +VAL_ 520 ESP_BrakeLightActive 0 "ESP_BRAKELIGHTACTIVE_INACTIVE" 1 "ESP_BRAKELIGHTACTIVE_ACTIVE"; +VAL_ 520 ESP_Hhc_Active 0 "ESP_HHCACTV_INACTIVE" 1 "ESP_HHCACTV_ACTIVE"; +VAL_ 520 ESP_Hhc_Available 0 "ESP_HHCAVL_NOT_INITIALIZED" 1 "ESP_HHCAVL_ACTIVE"; +VAL_ 520 ESP_Abs_OffRoad_Mode 0 "ABS_OFFROAD_NORMAL" 1 "ABS_OFFROAD_OFFROAD"; +VAL_ 520 ESP_Tsm_Active 0 "TSM_ACTIVE_INACTIVE" 1 "TSM_ACTIVE_ACTIVE"; +VAL_ 520 ESP_FaultLamp_EBD 0 "ESP_FAULTLAMP_EBD_OFF" 1 "ESP_FAULTLAMP_EBD_ON"; +VAL_ 520 ESP_FaultLamp_VDC 0 "ESP_FAULTLAMP_VDC_OFF" 1 "ESP_FAULTLAMP_VDC_ON"; +VAL_ 520 ESP_FaultLamp_ABS 0 "ESP_FAULTLAMP_ABS_OFF" 1 "ESP_FAULTLAMP_ABS_ON"; +VAL_ 520 ESP_Esp_Active 0 "ESP_ACTIVE_INACTIVE" 1 "ESP_ACTIVE_ACTIVE"; +VAL_ 520 ESP_Abs_Active 0 "ABS_ACTIVE_INACTIVE" 1 "ABS_ACTIVE_ACTIVE"; +VAL_ 520 ESP_Partial_Mode 0 "ESP_PATA_MODE_NORMAL" 1 "ESP_PATA_MODE_SPORT" 2 "ESP_PATA_MODE_ESC_OFF" 3 "ESP_PATA_MODE_RESERVED"; +VAL_ 520 ESP_Vehicle_Speed_Q 0 "ESP_VEHICLE_SPEED_Q_NOT_INITIALIZED" 1 "ESP_VEHICLE_SPEED_Q_NORMAL" 2 "ESP_VEHICLE_SPEED_Q_FAULT"; +VAL_ 520 ESP_Lfc_Available 0 "LFC_AVAILABLE_NOT_AVAILABLE" 1 "LFC_AVAILABLE_AVAILABLE"; +VAL_ 520 ESP_Hba_Active 0 "ESP_HBAACTV_INACTIVE" 1 "ESP_HBAACTV_ACTIVE"; +VAL_ 520 ESP_Lfc_Active 0 "LFC_ACTIVE_INACTIVE" 1 "LFC_ACTIVE_ACTIVE"; +VAL_ 521 ESP_Wheel_Speed_Left_Front_Q 0 "ESP_WHEEL_SPEED_LEFT_FRONT_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_SPEED_LEFT_FRONT_Q_NORMAL" 2 "ESP_WHEEL_SPEED_LEFT_FRONT_Q_FAULT"; +VAL_ 521 ESP_Wheel_Speed_Right_Front_Q 0 "ESP_WHEEL_SPEED_RIGHT_FRONT_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_SPEED_RIGHT_FRONT_Q_NORMAL" 2 "ESP_WHEEL_SPEED_RIGHT_FRONT_Q_FAULT"; +VAL_ 521 ESP_Wheel_Dir_Right_Front 0 "ESP_WHEEL_DIR_RIGHT_FRONT_FORWARDDIRECTION" 1 "ESP_WHEEL_DIR_RIGHT_FRONT_BACKWARDDIRECTION" 2 "ESP_WHEEL_DIR_RIGHT_FRONT_STANDSTILL" 3 "ESP_WHEEL_DIR_RIGHT_FRONT_NOTDEFINABLE"; +VAL_ 521 ESP_Wheel_Dir_Left_Front 0 "ESP_WHEEL_DIR_LEFT_FRONT_FORWARDDIRECTION" 1 "ESP_WHEEL_DIR_LEFT_FRONT_BACKWARDDIRECTION" 2 "ESP_WHEEL_DIR_LEFT_FRONT_STANDSTILL" 3 "ESP_WHEEL_DIR_LEFT_FRONT_NOTDEFINABLE"; +VAL_ 522 ESP_Wheel_Speed_Left_Rear_Q 0 "ESP_WHEEL_SPEED_LEFT_REAR_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_SPEED_LEFT_REAR_Q_NORMAL" 2 "ESP_WHEEL_SPEED_LEFT_REAR_Q_FAULT"; +VAL_ 522 ESP_Wheel_Speed_Right_Rear_Q 0 "ESP_WHEEL_SPEED_RIGHT_REAR_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_SPEED_RIGHT_REAR_Q_NORMAL" 2 "ESP_WHEEL_SPEED_RIGHT_REAR_Q_FAULT"; +VAL_ 522 ESP_Wheel_Dir_Right_Rear 0 "ESP_WHEEL_DIR_RIGHT_REAR_FORWARDDIRECTION" 1 "ESP_WHEEL_DIR_RIGHT_REAR_BACKWARDDIRECTION" 2 "ESP_WHEEL_DIR_RIGHT_REAR_STANDSTILL" 3 "ESP_WHEEL_DIR_RIGHT_REAR_NOTDEFINABLE"; +VAL_ 522 ESP_Wheel_Dir_Left_Rear 0 "ESP_WHEEL_DIR_LEFT_REAR_FORWARDDIRECTION" 1 "ESP_WHEEL_DIR_LEFT_REAR_BACKWARDDIRECTION" 2 "ESP_WHEEL_DIR_LEFT_REAR_STANDSTILL" 3 "ESP_WHEEL_DIR_LEFT_REAR_NOTDEFINABLE"; +VAL_ 523 ESP_Wheel_Pulse_Right_Front_Q 0 "ESP_WHEEL_PULSE_RIGHT_FRONT_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_PULSE_RIGHT_FRONT_Q_NORMAL" 2 "ESP_WHEEL_PULSE_RIGHT_FRONT_Q_FAULT"; +VAL_ 523 ESP_Wheel_Pulse_Right_Rear_Q 0 "ESP_WHEEL_PULSE_RIGHT_REAR_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_PULSE_RIGHT_REAR_Q_NORMAL" 2 "ESP_WHEEL_PULSE_RIGHT_REAR_Q_FAULT"; +VAL_ 523 ESP_Wheel_Pulse_Left_Rear_Q 0 "ESP_WHEEL_PULSE_LEFT_REAR_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_PULSE_LEFT_REAR_Q_NORMAL" 2 "ESP_WHEEL_PULSE_LEFT_REAR_Q_FAULT"; +VAL_ 523 ESP_Wheel_Pulse_Left_Front_Q 0 "ESP_WHEEL_PULSE_LEFT_FRONT_Q_NOT_INITIALIZED" 1 "ESP_WHEEL_PULSE_LEFT_FRONT_Q_NORMAL" 2 "ESP_WHEEL_PULSE_LEFT_FRONT_Q_FAULT"; +VAL_ 524 ESP_BrakePressure_RF_Q 0 "ESP_BRAKEPRESSURE_RF_Q_NOT_INITIALIZED" 1 "ESP_BRAKEPRESSURE_RF_Q_NORMAL" 2 "ESP_BRAKEPRESSURE_RF_Q_FAULT"; +VAL_ 524 ESP_BrakePressure_LF_Q 0 "ESP_BRAKEPRESSURE_LF_Q_NOT_INITIALIZED" 1 "ESP_BRAKEPRESSURE_LF_Q_NORMAL" 2 "ESP_BRAKEPRESSURE_LF_Q_FAULT"; +VAL_ 524 ESP_MasterCyl_Pressure_Q 0 "ESP_MASTERCYL_PRESSURE_Q_NOT_INITIALIZED" 1 "ESP_MASTERCYL_PRESSURE_Q_NORMAL" 2 "ESP_MASTERCYL_PRESSURE_Q_FAULT"; +VAL_ 524 ESP_BrakePressure_RR_Q 0 "ESP_BRAKEPRESSURE_RR_Q_NOT_INITIALIZED" 1 "ESP_BRAKEPRESSURE_RR_Q_NORMAL" 2 "ESP_BRAKEPRESSURE_RR_Q_FAULT"; +VAL_ 524 ESP_BrakePressure_LR_Q 0 "ESP_BRAKEPRESSURE_LR_Q_NOT_INITIALIZED" 1 "ESP_BRAKEPRESSURE_LR_Q_NORMAL" 2 "ESP_BRAKEPRESSURE_LR_Q_FAULT"; +VAL_ 529 VDM_Torque_Front_MaxQ 0 "VDM_Torque_Front_MaxQ_Invalid" 1 "VDM_Torque_Front_MaxQ_Valid"; +VAL_ 529 VDM_OutputTorqueFrontQ 0 "VDM_OutputTorqueFrontQ_Invalid" 1 "VDM_OutputTorqueFrontQ_Valid"; +VAL_ 529 VDM_Torque_Front_MinQ 0 "VDM_Torque_Front_MinQ_Invalid" 1 "VDM_Torque_FrontinQ_Valid"; +VAL_ 530 VDM_Torque_Rear_MaxQ 0 "VDM_Torque_Rear_MaxQ_Invalid" 1 "VDM_Torque_Rear_MaxQ_Valid"; +VAL_ 530 VDM_OutputTorqueRearQ 0 "VDM_OutputTorqueRearQ_Invalid" 1 "VDM_OutputTorqueRearQ_Valid"; +VAL_ 530 VDM_Torque_Rear_MinQ 0 "VDM_Torque_Rear_MinQ_Invalid" 1 "VDM_Torque_Rear_MinQ_Valid"; +VAL_ 565 RearDriverDoor 0 "SNA" 1 "Open" 2 "Closed" 3 "SNA"; +VAL_ 565 FrontPassengerDoor 0 "SNA" 1 "Open" 2 "Closed" 3 "SNA"; +VAL_ 565 DriverDoor 0 "SNA" 1 "Open" 2 "Closed" 3 "SNA"; +VAL_ 565 RearPassengerDoor 0 "SNA" 1 "Open" 2 "Closed" 3 "SNA"; +VAL_ 811 ESP_EpbAvailable 0 "ESP_EpbAvailable_Not_Available" 1 "ESP_EpbAvailable_Available"; +VAL_ 811 ESP_EpbServiceMode 0 "ESP_EpbServiceMode_Not_Active" 1 "ESP_EpbServiceMode_Active"; +VAL_ 811 ESP_EpbWarningLamp 0 "ESP_EpbWarningLamp_Off" 1 "ESP_EpbWarningLamp_Continous" 2 "ESP_EpbWarningLamp_Blink" 3 "ESP_EpbWarningLamp_Sna"; +VAL_ 811 ESP_EpbStatus 0 "ESP_EpbStatus_Released" 1 "ESP_EpbStatus_Applied" 2 "ESP_EpbStatus_Releasing" 3 "ESP_EpbStatus_Applying" 4 "ESP_EpbStatus_Dynamic_Control" 5 "ESP_EpbStatus_Unknown" 7 "ESP_EpbStatus_Sna"; +VAL_ 811 ESP_EpbFunctionLamp 0 "ESP_EpbFunction_Lamp_Off" 1 "ESP_EpbFunctionLamp_Continous" 2 "ESP_EpbFunctionLamp_Blink" 3 "ESP_EpbFunctionLamp_Sna"; +VAL_ 826 RCM_Status_DETECT_CRUSH 0 "DETECT_CRUSH_Normal_Condition" 1 "DETECT_CRUSH_Collision_Detection"; +VAL_ 826 RCM_Status_IND_WARN_RCM 0 "IND_WARN_RCM_Off" 1 "IND_WARN_RCM_Lighting"; +VAL_ 826 RCM_Status_IND_ACT_RCM_PASS 0 "IWBP_On_Ind_onOFF_Ind_on" 1 "IWBP_On_Ind_offOFF_Ind_on" 2 "IWBP_On_Ind_onOFF_Ind_off" 3 "IWBP_On_Ind_offOFF_Ind_off"; +VAL_ 826 RCM_Status_IND_WARN_BELT_DRIVER 0 "IWBP_Equipped" 1 "IWBP_Not_Equipped" 2 "IWBP_Undetermined" 3 "IWBP_SW_Failure"; +VAL_ 826 RCM_Status_IND_WARN_BELT_PASS 0 "IWBP_Equipped" 1 "IWBP_Not_Equipped" 2 "IWBP_Undetermined" 3 "IWBP_SW_Failure"; +VAL_ 848 EPAS_Ecu1EacSts 0 "EPAS_Ecu1EacSts_Eac_Inhibited" 1 "EPAS_Ecu1EacSts_Eac_Available" 2 "EPAS_Ecu1EacSts_Eac_Active" 3 "EPAS_Ecu1EacSts_Eac_Fault" 7 "EPAS_Ecu1EacSts_Sna"; +VAL_ 848 EPAS_Ecu1PowerMode 0 "EPASP_powerMode_Drive_Off" 1 "EPASP_powerMode_Drive_On" 2 "EPASP_powerMode_Shutdown" 3 "EPASP_powerMode_Sna"; +VAL_ 848 EPAS_Ecu1Role 0 "EPASP_ROLE_MASTER" 1 "EPASP_ROLE_SLAVE" 2 "EPASP_ROLE_RESERVED"; +VAL_ 848 EPAS_Ecu1State 0 "EPAS_Ecu1State_Initialisation_Arbitration" 1 "EPAS_Ecu1State_Reserved" 2 "EPAS_Ecu1State_Reserved1" 3 "EPAS_Ecu1State_Initialisation_Complete" 4 "EPAS_Ecu1State_Passive" 5 "EPAS_Ecu1State_Passive_Faulted" 6 "EPAS_Ecu1State_Assist_Active" 7 "EPAS_Ecu1State_Assist_Standby" 8 "EPAS_Ecu1State_Eac_Active" 9 "EPAS_Ecu1State_Eac_Standby" 15 "EPAS_Ecu1State_Invalid"; +VAL_ 864 EPAS_Ecu2EacSts 0 "EPAS_Ecu2EacSts_Eac_Inhibited" 1 "EPAS_Ecu2EacSts_Eac_Available" 2 "EPAS_Ecu2EacSts_Eac_Active" 3 "EPAS_Ecu2EacSts_Eac_Fault" 7 "EPAS_Ecu2EacSts_Sna"; +VAL_ 864 EPAS_Ecu2PowerMode 0 "EPASS_powerMode_Drive_Off" 1 "EPASS_powerMode_Drive_On" 2 "EPASS_powerMode_Shutdown" 3 "EPASS_powerMode_Sna"; +VAL_ 864 EPASS_Ecu2Role 0 "EPASS_Ecu2Role_Master" 1 "EPASS_Ecu2Role_Slave" 2 "EPASS_Ecu2Role_Reserved"; +VAL_ 864 EPASS_Ecu2State 0 "EPASS_Ecu2State_Initialisation_Arbitration" 1 "EPASS_Ecu2State_Reserved" 2 "EPASS_Ecu2State_Reserved1" 3 "EPASS_Ecu2State_Initialisation_Complete" 4 "EPASS_Ecu2State_Passive" 5 "EPASS_Ecu2State_Passive_Faulted" 6 "EPASS_Ecu2State_Assist_Active" 7 "EPASS_Ecu2State_Assist_Standby" 8 "EPASS_Ecu2State_Eac_Active" 9 "EPASS_Ecu2State_Eac_Standby" 15 "EPASS_Ecu2State_Invalid"; +VAL_ 880 ACM_tsrConInfoStaCon2 0 "ACM_TSRCONINFOSTACON2_NONE_DEFAULT" 1 "ACM_TSRCONINFOSTACON2_RAIN" 2 "ACM_TSRCONINFOSTACON2_SNOW" 3 "ACM_TSRCONINFOSTACON2_SNOW_RAIN" 4 "ACM_TSRCONINFOSTACON2_TARILER" 5 "ACM_TSRCONINFOSTACON2_DISTANCE" 6 "ACM_TSRCONINFOSTACON2_TIME" 7 "ACM_TSRCONINFOSTACON2_FOG" 8 "ACM_TSRCONINFOSTACON2_RESERVED_8" 9 "ACM_TSRCONINFOSTACON2_RESERVED_9" 10 "ACM_TSRCONINFOSTACON2_RESERVED_10" 11 "ACM_TSRCONINFOSTACON2_RESERVED_11" 12 "ACM_TSRCONINFOSTACON2_RESERVED_12" 14 "ACM_TSRCONINFOSTACON2_GENERIC" 15 "ACM_TSRCONINFOSTACON2_RESERVED_15"; +VAL_ 880 ACM_tsrConInfoStaCon1 0 "ACM_TSRCONINFOSTACON1_NONE_DEFAULT" 1 "ACM_TSRCONINFOSTACON1_RAIN" 2 "ACM_TSRCONINFOSTACON1_SNOW" 3 "ACM_TSRCONINFOSTACON1_SNOW_RAIN" 4 "ACM_TSRCONINFOSTACON1_TARILER" 5 "ACM_TSRCONINFOSTACON1_DISTANCE" 6 "ACM_TSRCONINFOSTACON1_TIME" 7 "ACM_TSRCONINFOSTACON1_FOG" 8 "ACM_TSRCONINFOSTACON1_RESERVED_8" 9 "ACM_TSRCONINFOSTACON1_RESERVED_9" 10 "ACM_TSRCONINFOSTACON1_RESERVED_10" 11 "ACM_TSRCONINFOSTACON1_RESERVED_11" 12 "ACM_TSRCONINFOSTACON1_RESERVED_12" 14 "ACM_TSRCONINFOSTACON1_GENERIC" 15 "ACM_TSRCONINFOSTACON1_RESERVED_15"; +VAL_ 880 ACM_tsrSpdDisClsMain 0 "TSR_Speed_No_Recognition_Default" 253 "TSR_Speed_Unlimited_Speed" 254 "TSR_Speed_Reserved" 255 "TSR_Speed_Invalid"; +VAL_ 880 ACM_tsrSpdDisCluCon1 0 "ACM_TSRSPDDISCLUCON1_NO_RECOGNITION_DEFAULT" 1 "ACM_TSRSPDDISCLUCON1_A1_252_PH_1XHEX_KPHORMPH" 253 "ACM_TSRSPDDISCLUCON1_LHD_CONDITIONAL_NO_PASSING_ZONE" 254 "ACM_TSRSPDDISCLUCON1_RHD_CONDITIONAL_NO_PASSING_ZONE" 255 "ACM_TSRSPDDISCLUCON1_INVALID"; +VAL_ 880 ACM_tsrSpdDisCluCon2 0 "ACM_TSRSPDDISCLUCON2_NO_RECOGNITION_DEFAULT" 1 "ACM_TSRSPDDISCLUCON2_A1_252_PH_1XHEX_KPHORMPH" 253 "ACM_TSRSPDDISCLUCON2_LHD_CONDITIONAL_NO_PASSING_ZONE" 254 "ACM_TSRSPDDISCLUCON2_RHD_CONDITIONAL_NO_PASSING_ZONE" 255 "ACM_TSRSPDDISCLUCON2_INVALID"; +VAL_ 880 ACM_tsrSpdDisCluConM 0 "ACM_TSRSPDDISCLUCONM_NO_RECOGNITION_DEFAULT" 253 "ACM_TSRSPDDISCLUCONM_UNLIMITED_SPEED" 254 "ACM_TSRSPDDISCLUCONM_RESERVED" 255 "ACM_TSRSPDDISCLUCONM_INVALID"; +VAL_ 880 ACM_tsrAddInfoDisplay 0 "ACM_TSRADDINFODISPLAY_NONE_DISPLAY_DEFAULT" 1 "ACM_TSRADDINFODISPLAY_LHD_NO_PASSING_ZONE_DISPLAY" 2 "ACM_TSRADDINFODISPLAY_RHD_NO_PASSING_ZONE_DISPLAY" 3 "ACM_TSRADDINFODISPLAY_INVALID"; +VAL_ 880 ACM_tsrOvrlapSignDis 0 "ACM_TSROVRLAPSIGNDIS_NONE_DEFAULT" 1 "ACM_TSROVRLAPSIGNDIS_OVERLAP_SIGN" 2 "ACM_TSROVRLAPSIGNDIS_RESERVED"; +VAL_ 880 ACM_tsrStatus 0 "ACM_TSRSTATUS_TSR_INFORMATION_VALID_DEFAULT" 1 "ACM_TSRSTATUS_TSR_INFORMATION_INVALID_FAILURE" 2 "ACM_TSRSTATUS_TSR_INFORMATION_TEMPORARY_UNAVAILABLE"; +VAL_ 896 EPAS_SteeringReduced 0 "EPAS_EPAS_SteeringReduced_Normal_Assist" 1 "EPAS_EPAS_SteeringReduced_Reduced_Assist"; +VAL_ 896 EPAS_SteeringFault 0 "EPAS_SteeringFault_No_Fault" 1 "EPAS_SteeringFault_Fault"; +VAL_ 896 EPAS_SteeringMode 0 "EPASP_SteeringMode_Default" 1 "EPASP_SteeringMode_Normal" 2 "EPASP_SteeringMode_Sport" 3 "EPASP_SteeringMode_Comfort"; +VAL_ 896 EPAS_StcFault 0 "Stc_NoFault" 1 "Stc_Fault"; +VAL_ 896 EPAS_StcActive 0 "Stc_NotActive" 1 "Stc_Active"; +VAL_ 896 EPAS_StcUnavailable 0 "Stc_Available" 1 "Stc_Unavailable"; +VAL_ 896 H_CAN_EPSS_ToiFlt 0 "H_CAN_EPS_ToiFault_No_Fault" 1 "H_CAN_EPS_ToiFault_Fault"; +VAL_ 896 H_CAN_EPSS_ToiActive 0 "H_CAN_EPS_ToiActive_Deactivated" 1 "H_CAN_EPS_ToiActive_Activated"; +VAL_ 896 H_CAN_EPS_ToiUnavailable 0 "H_CAN_EPS_ToiUnavailable_Available" 1 "H_CAN_EPS_ToiUnavailable_Unavailable"; +VAL_ 896 EPAS_HandsOnLevel 0 "EPAS_HandsOnLevel_Level_0" 1 "EPAS_HandsOnLevel_Level_1" 2 "EPAS_HandsOnLevel_Level_2" 3 "EPAS_HandsOnLevel_Level_3"; +VAL_ 907 ESPiB1_IgnitionOn 0 "ESPIB1_IgnitionOn_Not_Initilized" 1 "ESPIB1_IgnitionOn_Normal"; +VAL_ 907 ESPiB1_VehicleSpeed_Q 0 "ESPiB1_VehicleSpeed_Q_VehicleSpeedQualifier_NotInit" 1 "ESPiB1_VehicleSpeed_Q_VehicleSpeedQualifier_Normal" 2 "ESPiB1_VehicleSpeed_Q_VehicleSpeedQualifier_Faulty"; +VAL_ 908 ESPiB2_qTargetExternal_Q 0 "ESPiB2_qTargetExternal_Q_QTarget_Off" 1 "ESPiB2_qTargetExternal_Q_QTarget_EBR" 2 "ESPiB2_qTargetExternal_Q_QTarget_EBRmaxPerformance"; +VAL_ 909 ESPiB3_ABSActive 0 "ESPIB3_ABSACTIVE_ABS_IS_INACTIVE" 1 "ESPIB3_ABSACTIVE_ABS_IS_ACTIVE"; +VAL_ 909 ESPiB3_ForceBlendingActive 0 "ESPIB3_FORCEBLENDINGACTIVE_PFC_INACTIVE" 1 "ESPIB3_FORCEBLENDINGACTIVE_PFC_HOLD" 2 "ESPIB3_FORCEBLENDINGACTIVE_PFC_ACTIVE"; +VAL_ 909 ESPiB3_pMcVirtual_Q 0 "ESPIB3_PMCVIRTUAL_Q_PMCVIRTUAL_NOTINITIALIZED" 1 "ESPIB3_PMCVIRTUAL_Q_PMCVIRTUAL_NORMAL" 2 "ESPIB3_PMCVIRTUAL_Q_PMCVIRTUAL_FAULTY"; +VAL_ 909 ESPiB3_pForceBlendingMC_Q 0 "ESPIB3_PFORCEBLENDINGMC_Q_PFORCEBLENDINGMC_NOTINITIALIZED" 1 "ESPIB3_PFORCEBLENDINGMC_Q_PFORCEBLENDINGMC_NORMAL" 2 "ESPIB3_PFORCEBLENDINGMC_Q_PFORCEBLENDINGMC_FAULTY"; +VAL_ 909 ESPiB3_pMC1_Q 0 "ESPIB3_PMC1_Q_MCPRESSUREQUALIFIER_NOTINIT" 1 "ESPIB3_PMC1_Q_MCPRESSUREQUALIFIER_NORMAL" 2 "ESPIB3_PMC1_Q_MCPRESSUREQUALIFIER_FAULTY"; +VAL_ 910 iBESP1_ExtReqStatus 0 "iBESP1_ExtReqStatus_NotInitialized" 1 "iBESP1_ExtReqStatus_EBR_NotAvailable" 2 "iBESP1_ExtReqStatus_EBR_Available"; +VAL_ 910 iBESP1_sOutputRodDriver_Q 0 "IBESP1_SOUTPUTRODDRIVER_Q_SOUTPUTRODDRIVER_NOTINITIALIZED" 1 "IBESP1_SOUTPUTRODDRIVER_Q_SOUTPUTRODDRIVER_NORMAL" 2 "IBESP1_SOUTPUTRODDRIVER_Q_SOUTPUTRODDRIVER_FAULTY"; +VAL_ 910 iBESP1_sOutputRodAct_Q 0 "IBESP1_SOUTPUTRODACT_Q_SOUTPUTRODACT_NOTINITIALIZED" 1 "IBESP1_SOUTPUTRODACT_Q_SOUTPUTRODACT_NORMAL" 2 "IBESP1_SOUTPUTRODACT_Q_SOUTPUTRODACT_FAULTY"; +VAL_ 911 iBESP2_pRunout_Q 0 "IBESP2_PRUNOUT_Q_P_RUNOUT_NOT_INITIALIZED" 1 "IBESP2_PRUNOUT_Q_P_RUNOUT_NORMAL" 2 "IBESP2_PRUNOUT_Q_P_RUNOUT_FAULTY"; +VAL_ 911 iBESP2_BrakePedalApplied_Q 0 "IBESP2_BRAKEPEDALAPPLIED_Q_BRAKE_PEDAL_APPLIED_NO_INIT_OR_OFF" 1 "IBESP2_BRAKEPEDALAPPLIED_Q_BRAKE_PEDAL_APPLIED_NORMAL" 2 "IBESP2_BRAKEPEDALAPPLIED_Q_BRAKE_PEDAL_APPLIED_FAULTY"; +VAL_ 911 iBESP2_BrakePedalApplied 0 "iBESP2_BrakePedalApplied_NotApplied" 1 "iBESP2_BrakePedalApplied_Applied"; +VAL_ 911 iBESP2_RprMode 0 "IBESP2_RPRMODE_RPR_PASSIVE" 1 "IBESP2_RPRMODE_RPR_PRELOAD" 2 "IBESP2_RPRMODE_RPR_HOLD" 3 "IBESP2_RPRMODE_RPR_SUCTION" 4 "IBESP2_RPRMODE_RPR_HOLDLOWPRESSURE" 5 "IBESP2_RPRMODE_RPR_ABORT"; +VAL_ 912 EPAS_EacStatus 0 "EPAS_EacStatus_Eac_Inhibited" 1 "EPAS_EacStatus_Eac_Available" 2 "EPAS_EacStatus_Eac_Active" 3 "EPAS_EacStatus_Eac_Standby" 4 "EPAS_EacStatus_Eac_Fault" 5 "EPAS_EacStatus_Sna"; +VAL_ 912 EPAS_EacErrorCode 0 "EPAS_No_Err" 1 "EPAS_High_Angle_Cmd_Err" 2 "EPAS_High_Actual_Angle_Err" 3 "EPAS_High_Actual_Angle_Rate_Err" 4 "EPAS_Feature_Fault_Err" 5 "EPAS_Feature_Status_Invalid_Err" 6 "EPAS_Feature_Angle_Thd_Err" 7 "EPAS_Angle_Control_Cntr_Err" 8 "EPAS_Angle_Control_Mia_Err" 9 "EPAS_Angle_Control_Crc_Err" 10 "EPAS_Vehspd_Corrln_Failr_Err" 11 "EPAS_Vehspd_Max_Thd_Err" 12 "EPAS_Hands_On_Detn_Err" 13 "EPAS_Ext_Angle_Plausibility_Err" 14 "EPAS_High_Delta_Angle_Err" 15 "EPAS_Max_Steady_State_Err"; +VAL_ 912 EPAS_InternalSasQ 0 "EPAS_INTERNALSASQF_VALID" 1 "EPAS_INTERNALSASQF_INVALID"; +VAL_ 929 VDM_AchDriveModeRequestConfirm 0 "VDM_AchDriveModeRequestConfirm_NoRequest" 1 "VDM_AchDriveModeRequestConfirm_Request"; +VAL_ 929 VDM_AchDriveModeRequestPullRearw 0 "VDM_AchDriveModeRequestPullRearward_NoRequired" 1 "VDM_AchDriveModeRequestPullRearward_Required"; +VAL_ 929 VDM_AchDriveModeRequestPushDown 0 "VDM_AchDriveModeRequestPushDown_NoRequired" 1 "VDM_AchDriveModeRequestPushDown_Required"; +VAL_ 929 VDM_AchDriveModeRequestPushForwa 0 "VDM_AchDriveModeRequestPushForward_NoRequired" 1 "VDM_AchDriveModeRequestPushForward_Required"; +VAL_ 929 VDM_AchDriveModeRequestPushUp 0 "VDM_AchDriveModeRequestPushUp_NoRequired" 1 "VDM_AchDriveModeRequestPushUp_Required"; +VAL_ 929 VDM_AchDriveModeRequestRest 0 "VDM_AchDriveModeRequestRest_NoRequired" 1 "VDM_AchDriveModeRequestRest_Required"; +VAL_ 929 VDM_AchDriveMode4x4 0 "VDM_AchDriveMode4x4_A4x4Auto" 1 "VDM_AchDriveMode4x4_P4x4Permenant" 6 "VDM_AchDriveMode4x4_I_Transition" 7 "VDM_AchDriveMode4x4_Fault"; +VAL_ 929 VDM_AchDriveMode 0 "VDM_AchDriveMode_Eco" 1 "VDM_AchDriveMode_OnRoadComford" 2 "VDM_AchDriveMode_OnRoadSport" 3 "VDM_AchDriveMode_OffRoad" 4 "VDM_AchDriveMode_OffRoadSport" 5 "VDM_AchDriveMode_Autonomy"; +VAL_ 929 VDM_AchDriveModeAirSuspension 0 "VDM_AchDriveModeAirSuspension_Kneel" 1 "VDM_AchDriveModeAirSuspension_Aero" 2 "VDM_AchDriveModeAirSuspension_Design" 3 "VDM_AchDriveModeAirSuspension_High" 4 "VDM_AchDriveModeAirSuspension_Max" 7 "VDM_AchDriveModeAirSuspension_Null"; +VAL_ 929 VDM_AchDriveModeAbs 0 "VDM_AchDriveModeAbs_OnRoad" 1 "VDM_AchDriveModeAbs_OffRoad" 6 "VDM_AchDriveModeAbs_InTransition" 7 "VDM_AchDriveModeAbs_Fault"; +VAL_ 929 VDM_AchDriveModeDrivability 0 "VDM_AchDriveModeDrivability_Eco" 1 "VDM_AchDriveModeDrivability_Sport" 2 "VDM_AchDriveModeDrivability_OffRoad" 6 "VDM_AchDriveModeDrivability_InTransition" 7 "VDM_AchDriveModeDrivability_Null"; +VAL_ 929 VDM_AchDriveModeDamping 0 "VDM_AchDriveModeDamping_Kneel" 1 "VDM_AchDriveModeDamping_Aero" 2 "VDM_AchDriveModeDamping_Design" 3 "VDM_AchDriveModeDamping_High" 4 "VDM_AchDriveModeDamping_AirSuspensionMax" 6 "VDM_AchDriveModeDamping_InTransition" 7 "VDM_AchDriveModeDamping_Fault"; +VAL_ 929 VDM_AchDriveModeRollControl 0 "VDM_AchDriveModeRollControl_Low" 1 "VDM_AchDriveModeRollControl_Middle" 2 "VDM_AchDriveModeRollControl_High" 6 "VDM_AchDriveModeRollControl_InTransition" 7 "VDM_AchDriveModeRollControl_Null"; +VAL_ 929 VDM_AchDriveModeEsp 0 "VDM_AchDriveModeEsp_EspOn" 1 "VDM_AchDriveModeEsp_EspReduced" 2 "VDM_AchDriveModeEsp_EspOff" 6 "VDM_AchDriveModeEsp_InTransition" 7 "VDM_AchDriveModeEsp_Null"; +VAL_ 929 VDM_AchDriveModeEpas 0 "VDM_AchDriveModeEpas_TcsStable" 1 "VDM_AchDriveModeEpas_TcsSportRoad" 2 "VDM_AchDriveModeEpas_TcsSportOffRoad" 3 "VDM_AchDriveModeEpas_TcsOff" 7 "VDM_AchDriveModeEpas_Null"; +VAL_ 929 VDM_AchDriveModeTcs 0 "VDM_AchDriveModeTcs_Stable" 1 "VDM_AchDriveModeTcs_SportRoad" 2 "VDM_AchDriveModeTcs_SportOffRoad" 3 "VDM_AchDriveModeTcs_Off" 7 "VDM_AchDriveModeTcs_Null"; +VAL_ 1024 VCM_VehicleType 0 "VCM_VehicleType_Sna" 1 "VCM_VehicleType_R1T" 2 "VCM_VehicleType_R1S" 3 "VCM_VehicleType_Reserved_AProj" 4 "VCM_VehicleType_Reserved_BProj" 5 "VCM_VehicleType_Reserved_CProj" 6 "VCM_VehicleType_Reserved_DProj" 7 "VCM_VehicleType_Reserved_EProj"; +VAL_ 1024 VCM_HandOfDrive 0 "VCM_HandOfDrive_Lhd" 1 "VCM_HandOfDrive_Rhd"; +VAL_ 1024 VCM_BatterySize 0 "VCM_BatterySize_Sna" 1 "VCM_BatterySize_A105kW" 2 "VCM_BatterySize_A130kW" 3 "VCM_BatterySize_A180kW" 4 "VCM_BatterySize_BxxxkW" 5 "VCM_BatterySize_CxxxkW" 6 "VCM_BatterySize_DxxxkW" 7 "VCM_BatterySize_ExxxkW"; +VAL_ 1024 VCM_Market 0 "VCM_Market_Sna" 1 "VCM_Market_RegionB" 2 "VCM_Market_RegionC" 3 "VCM_Market_RegionD" 4 "VCM_Market_RegionE" 5 "VCM_Market_RegionF" 6 "VCM_Market_RegionG" 7 "VCM_Market_RegionH"; +VAL_ 1265 Cluster_Unit 0 "KPH" 1 "MPH"; +VAL_ 1640 OCS_FrontPassClass 0 "OCS_FrontPassClass_Classification_Unknown" 1 "OCS_FrontPassClass_Reserved_1" 2 "OCS_FrontPassClass_One_YO_CRS" 3 "OCS_FrontPassClass_Reserved_2" 4 "OCS_FrontPassClass_Reserved_3" 5 "OCS_FrontPassClass_Reserved_4" 6 "OCS_FrontPassClass_Small_Adult" 7 "OCS_FrontPassClass_Medium_Adult" 8 "OCS_FrontPassClass_Reserved_5" 9 "OCS_FrontPassClass_Reserved_6" 10 "OCS_FrontPassClass_Reserved_7" 11 "OCS_FrontPassClass_Reserved_8" 12 "OCS_FrontPassClass_Reserved_9" 13 "OCS_FrontPassClass_Reserved_10" 14 "OCS_FrontPassClass_Reserved_11" 15 "OCS_FrontPassClass_Reserved_12"; +VAL_ 1640 OCS_FrontPassClassValid 0 "Not_Valid" 1 "Valid"; +VAL_ 1640 OCS_FrontPassFaultStatus 0 "No_Fault_Present" 1 "Fault_Status" 2 "Reserved_1" 3 "Reserved_2"; +VAL_ 1640 OCS_Reserved_1 0 "OCS_Reserved_Reserved"; +VAL_ 1640 OCS_FrontPassSBRStatus 0 "Unknown" 1 "Empty" 2 "Occupied"; +VAL_ 1640 OCS_OperatingMode 0 "OCS_OperatingMode_Initialisation" 1 "OCS_OperatingMode_Normal_Mode" 2 "OCS_OperatingMode_Empty_Seat_Calibration_Active" 3 "OCS_OperatingMode_Barrier_Airbag_Test_Mode" 4 "OCS_OperatingMode_Voltage_Out_Of_Range" 5 "OCS_OperatingMode_Falut_Active" 6 "OCS_OperatingMode_Reserved_1" 7 "OCS_OperatingMode_Reserved_2" 8 "OCS_OperatingMode_Reserved_3" 9 "OCS_OperatingMode_Reserved_4" 10 "OCS_OperatingMode_Reserved_5" 11 "OCS_OperatingMode_Reserved_6" 12 "OCS_OperatingMode_Reserved_7" 13 "OCS_OperatingMode_Reserved_8" 14 "OCS_OperatingMode_Reserved_9" 15 "OCS_OperatingMode_Reserved_10"; +VAL_ 1640 OCS_Reserved_2 0 "OCS_Reserved_2_Reserved"; diff --git a/artifacts/package_runtime/iqdbc/dbc/subaru_forester_2017_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/subaru_forester_2017_generated.dbc new file mode 100644 index 000000000..16acdc4d9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/subaru_forester_2017_generated.dbc @@ -0,0 +1,269 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _subaru_preglobal_2015.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX X + + +BO_ 2 Steering: 8 XXX + SG_ Steering_Angle : 7|16@0- (0.1,0) [-500|500] "degree" XXX + SG_ COUNTER : 27|3@0+ (1,0) [0|7] "" XXX + SG_ Checksum : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 208 G_Sensor: 8 XXX + SG_ Steering_Angle : 0|16@1- (-0.1,0) [-500|500] "" XXX + SG_ Lateral : 16|16@1- (-0.0035,1) [-255|255] "" XXX + SG_ Longitudinal : 48|16@1- (-0.00035,0) [-255|255] "" XXX + +BO_ 209 Brake_Pedal: 4 XXX + SG_ Speed : 0|16@1+ (0.05625,0) [0|255] "KPH" XXX + SG_ Brake_Pedal : 16|8@1+ (1,0) [0|255] "" XXX + SG_ Signal1 : 24|8@1+ (1,0) [0|255] "" XXX + +BO_ 210 Brake_2: 8 XXX + SG_ Brake_Light : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Related : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Brake : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Left_Brake : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 211 Brake_Type: 8 XXX + SG_ Brake_Light : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Speed_Counter : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_Cruise_On : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal_On : 46|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 48|8@1+ (1,0) [0|255] "" XXX + +BO_ 212 Wheel_Speeds: 8 XXX + SG_ FL : 0|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ FR : 16|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ RL : 32|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ RR : 48|16@1+ (0.0592,0) [0|255] "KPH" XXX + +BO_ 320 Throttle: 8 XXX + SG_ Throttle_Pedal : 0|8@1+ (0.392157,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|2@1+ (1,0) [0|7] "" XXX + SG_ Not_Full_Throttle : 14|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Engine_RPM : 16|14@1+ (1,0) [0|32767] "" XXX + SG_ Off_Throttle : 30|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Throttle_Cruise : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Combo : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Body : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Off_Throttle_2 : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Signal4 : 57|7@1+ (1,0) [0|127] "" XXX + +BO_ 321 Engine: 8 XXX + SG_ Engine_Torque : 0|15@1+ (1,0) [0|255] "" XXX + SG_ Engine_Stop : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Wheel_Torque : 16|12@1+ (1,0) [0|4095] "" XXX + SG_ Engine_RPM : 32|12@1+ (1,0) [0|8191] "" XXX + +BO_ 324 CruiseControl: 8 XXX + SG_ OnOffButton : 2|1@1+ (1,0) [0|1] "" XXX + SG_ SET_BUTTON : 3|1@1+ (1,0) [0|1] "" XXX + SG_ RES_BUTTON : 4|1@1+ (1,0) [0|1] "" XXX + SG_ Button : 13|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal_On : 51|1@1+ (1,0) [0|1] "" XXX + +BO_ 328 Transmission: 8 XXX + SG_ Manual_Gear : 4|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Transmission_Engine : 16|15@1+ (1,0) [0|65535] "" XXX + SG_ Gear : 48|4@1+ (1,0) [0|15] "" XXX + SG_ Gear_2 : 52|4@1+ (1,0) [0|15] "" XXX + SG_ Paddle_Shift : 60|2@1+ (1,0) [0|3] "" XXX + +BO_ 329 CVT_Ratio: 8 XXX + +BO_ 336 Brake_Pressure: 8 XXX + SG_ Brake_Pressure_Right : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_Pressure_Left : 8|8@1+ (1,0) [0|255] "" XXX + +BO_ 338 Stalk: 8 XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Light : 52|1@1+ (1,0) [0|1] "" XXX + SG_ Runlights : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Headlights : 59|1@1+ (1,0) [0|1] "" XXX + SG_ Highbeam : 60|1@1+ (1,0) [0|1] "" XXX + SG_ Wiper : 62|1@1+ (1,0) [0|1] "" XXX + +BO_ 352 ES_Brake: 8 XXX + SG_ Brake_Pressure : 0|16@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Brake_Lights : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 22|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 23|1@1+ (1,0) [0|1] "" XXX + SG_ SET_1 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 353 ES_Distance: 8 XXX + SG_ Cruise_Throttle : 0|12@1+ (1,0) [0|4095] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Car_Follow : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 17|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Brake_Active : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Distance_Swap : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Standstill : 22|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Close_Distance : 24|8@1+ (0.019607,0) [0|5] "m" XXX + SG_ Signal4 : 32|9@1+ (1,0) [0|255] "" XXX + SG_ Standstill_2 : 41|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Signal5 : 43|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 44|3@1+ (1,0) [0|7] "" XXX + SG_ Signal6 : 47|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Button : 48|3@1+ (1,0) [0|7] "" XXX + SG_ Signal7 : 51|5@1+ (1,0) [0|31] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 354 ES_Status: 8 XXX + SG_ Brake : 8|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 9|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_RPM : 16|16@1+ (1,0) [0|65535] "" XXX + SG_ Checksum : 32|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX + +BO_ 356 ES_LKAS: 8 XXX + SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX + SG_ LKAS_Command : 8|13@1- (-1,0) [-4096|4096] "" XXX + SG_ LKAS_Active : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 359 ES_LDW: 8 XXX + SG_ All_depart_2015 : 0|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1All_Depart : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Sig2All_Depart : 31|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Active : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Depart_Front : 51|1@1+ (1,0) [0|1] "" XXX + SG_ Sig3All_Depart : 52|1@1+ (1,0) [0|1] "" XXX + +BO_ 604 BSD_RCTA: 8 XXX + SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX + SG_ State : 5|1@1+ (1,0) [0|1] "" XXX + SG_ R_ADJACENT : 32|1@1+ (1,0) [0|1] "" XXX + SG_ L_ADJACENT : 33|1@1+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 42|1@1+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 43|1@1+ (1,0) [0|1] "" XXX + SG_ R_RCTA : 46|1@1+ (1,0) [0|1] "" XXX + SG_ L_RCTA : 47|1@1+ (1,0) [0|1] "" XXX + +BO_ 642 Dashlights: 8 XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ SEATBELT_FL : 40|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 44|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 45|1@1+ (1,0) [0|1] "" XXX + +BO_ 880 Steering_Torque_2: 8 XXX + SG_ Steering_Voltage_Flat : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX + SG_ COUNTER : 40|4@1+ (1,0) [0|15] "" XXX + +BO_ 884 BodyInfo: 8 XXX + SG_ DOOR_OPEN_FR : 24|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 25|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 26|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 27|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_Hatch : 28|1@1+ (1,0) [0|1] "" XXX + +BO_ 864 Engine_Temp: 8 XXX + SG_ Oil_Temp : 16|8@1+ (1,-40) [0|255] "" XXX + SG_ Coolant_Temp : 24|8@1+ (1,-40) [0|255] "" XXX + SG_ Cruise_Activated : 45|1@1+ (1,0) [0|1] "" XXX + SG_ Saved_Speed : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 866 Fuel: 8 XXX + +BO_ 977 Dash_State2: 8 XXX + SG_ UNITS : 15|1@1+ (1,0) [0|1] "" XXX + +BO_ 1745 Dash_State: 8 XXX + SG_ Units : 15|1@1+ (1,0) [0|1] "" XXX + +CM_ SG_ 320 Off_Throttle_2 "Less sensitive"; +CM_ SG_ 320 Throttle_Body "Throttle related"; +CM_ SG_ 328 Gear "15 = P, 14 = R, 0 = N, 1-6=gear"; +CM_ SG_ 328 Gear_2 "15 = P, 14 = R, 0 = N, 1-6=gear"; +CM_ SG_ 353 Cruise_Button "1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 resume deep"; +CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission"; +CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage"; +CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering"; +CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert "; +CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart"; +CM_ SG_ 359 Sig1All_Depart "Left and right depart"; +CM_ SG_ 359 Sig2All_Depart "Left and right depart"; +CM_ SG_ 359 All_depart_2015 "always 1 on 2017"; +CM_ SG_ 604 R_APPROACHING "Faster car approaching in far right lane"; +CM_ SG_ 604 L_APPROACHING "Faster car approaching in far left lane"; +CM_ SG_ 604 R_RCTA "Rear cross traffic alert, only when in R gear"; +CM_ SG_ 604 L_RCTA "Rear cross traffic alert, only when in R gear"; +CM_ SG_ 642 COUNTER "Affected by signals"; +CM_ SG_ 642 SEATBELT_FL "Driver seatbelt"; +CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371"; +CM_ SG_ 977 UNITS "0 = Metric, 1 = Imperial"; + +VAL_ 328 Gear 0 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 14 "R" 15 "P"; + +CM_ "subaru_forester_2017.dbc starts here"; + +BO_ 355 ES_DashStatus: 8 XXX + SG_ Not_Ready_Startup : 4|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 17|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 40|3@1+ (1,0) [0|7] "" XXX + SG_ Brake : 43|1@1+ (1,0) [0|1] "" XXX + SG_ Car_Follow : 54|1@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX + +BO_ 881 Steering_Torque: 8 XXX + SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX + SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX + SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX + SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/subaru_global_2017_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/subaru_global_2017_generated.dbc new file mode 100644 index 000000000..f9ac24748 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/subaru_global_2017_generated.dbc @@ -0,0 +1,375 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _subaru_global.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX X + + +BO_ 2 Steering: 8 XXX + SG_ Steering_Angle : 7|16@0- (0.1,0) [0|65535] "" XXX + SG_ COUNTER : 25|3@1+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 32|8@1+ (1,0) [0|255] "" XXX + +BO_ 64 Throttle: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Engine_RPM : 16|13@1+ (1,0) [0|8191] "" XXX + SG_ Neutral : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Cruise : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Combo : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Signal3 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ Off_Accel : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 316 Brake_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|46@1+ (1,0) [0|1] "" XXX + SG_ ES_Brake : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 59|3@1+ (1,0) [0|1] "" XXX + SG_ Brake : 62|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 326 Cruise_Buttons: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|30@1+ (1,0) [0|1073741823] "" XXX + SG_ Main : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Set : 43|1@1+ (1,0) [0|1] "" XXX + SG_ Resume : 44|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 45|19@1+ (1,0) [0|524287] "" XXX + +BO_ 315 G_Sensor: 8 XXX + SG_ Lateral : 48|8@1- (-0.1,0) [0|255] "m/s2" XXX + SG_ Longitudinal : 56|8@1- (-0.1,0) [0|255] "m/s2" XXX + +BO_ 314 Wheel_Speeds: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ FR : 12|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ RR : 25|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ FL : 51|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ RL : 38|13@1+ (0.057,0) [0|255] "kph" XXX + +BO_ 280 Steering_Torque_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steer_Torque_Output : 13|11@1- (-10,0) [0|255] "" XXX + SG_ Signal1 : 24|8@1+ (1,0) [0|511] "" XXX + SG_ Steer_Torque_Sensor : 45|11@1- (-1,0) [0|255] "" XXX + SG_ Steering_Active : 61|1@0+ (1,0) [0|1] "" XXX + SG_ Steering_Disabled : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 281 Steering_Torque: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steer_Error_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 16|11@1- (-1,0) [-1000|1000] "" XXX + SG_ Steer_Error_2 : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Warning : 29|1@1+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 32|16@1- (-0.0217,0) [-600|600] "" X + SG_ Steer_Torque_Output : 48|11@1- (-10,0) [-1000|1000] "" XXX + +BO_ 282 Steering_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 24|17@1- (-0.01,0) [0|1] "" XXX + +BO_ 312 Brake_Pressure_L_R: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steering_Angle : 16|16@1- (-0.1,0) [-3276.8|3276.7] "" XXX + SG_ Brake_1 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_2 : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 313 Brake_Pedal: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Speed : 16|12@1+ (0.05625,0) [0|255] "kph" XXX + SG_ Signal2 : 28|6@1+ (1,0) [0|63] "" XXX + SG_ Brake_Lights : 34|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal : 36|12@1+ (1,0) [0|4095] "" XXX + SG_ Signal4 : 48|16@1+ (1,0) [0|65535] "" XXX + +BO_ 372 Engine_Stop_Start: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX + SG_ STOP_START_STATE : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 290 ES_LKAS: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_Output : 16|13@1- (-1,0) [-8191|8191] "" XXX + SG_ LKAS_Request : 29|1@0+ (1,0) [0|1] "" XXX + +BO_ 292 ES_LKAS_ANGLE: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Request : 12|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Output : 40|17@1- (-0.01,0) [0|1] "deg" XXX + SG_ SET_3 : 60|2@1+ (1,0) [0|1] "" XXX + +BO_ 544 ES_Brake: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Pressure : 16|16@1+ (1,0) [0|65535] "" XXX + SG_ AEB_Status : 32|4@1+ (1,0) [0|15] "" XXX + SG_ Cruise_Brake_Lights : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Fault : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 38|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 39|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 40|24@1+ (1,0) [0|16777215] "" XXX + +BO_ 577 Cruise_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Clutch_Depressed : 47|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_Set_Speed : 51|12@0+ (1,0) [0|120] "" XXX + SG_ Cruise_On : 54|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 55|1@1+ (1,0) [0|1] "" XXX + +BO_ 552 BSD_RCTA: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ R_ADJACENT : 48|1@1+ (1,0) [0|1] "" XXX + SG_ L_ADJACENT : 49|1@1+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 58|1@1+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 59|1@1+ (1,0) [0|1] "" XXX + +BO_ 912 Dashlights: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ UNITS : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ICY_ROAD : 32|2@1+ (1,0) [0|3] "" XXX + SG_ SEATBELT_FL : 48|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 50|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 51|1@1+ (1,0) [0|1] "" XXX + SG_ STOP_START : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 940 BodyInfo: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ DOOR_OPEN_FL : 32|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 33|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 34|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 35|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_TRUNK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE : 54|1@1+ (1,0) [0|1] "" XXX + SG_ DASH_BTN_LIGHTS : 56|1@0+ (1,0) [0|1] "" XXX + SG_ LOWBEAM : 57|1@1+ (1,0) [0|1] "" XXX + SG_ HIGHBEAM : 58|1@1+ (1,0) [0|1] "" XXX + SG_ FOG_LIGHTS : 60|1@1+ (1,0) [0|1] "" XXX + SG_ WIPERS : 62|1@0+ (1,0) [0|1] "" XXX + +BO_ 801 ES_DashStatus: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ PCB_Off : 12|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Off : 13|1@1+ (1,0) [0|1] "" XXX + SG_ Signal1 : 14|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_State_Msg : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_State_Msg : 20|3@1+ (1,0) [0|7] "" XXX + SG_ Signal2 : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Soft_Disable : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Status_Msg : 25|2@1+ (1,0) [0|3] "" XXX + SG_ Signal3 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Distance : 28|3@1+ (1,0) [0|7] "" XXX + SG_ Signal4 : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Conventional_Cruise : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Signal5 : 33|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_Disengaged_Dash : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Signal6 : 37|3@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Set_Speed : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Fault : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Display_Own_Car : 50|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Lights : 51|1@1+ (1,0) [0|1] "" XXX + SG_ Car_Follow : 52|1@1+ (1,0) [0|1] "" XXX + SG_ Signal7 : 53|3@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX + SG_ Cruise_State : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 802 ES_LKAS_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_Alert_Msg : 12|3@1+ (1,0) [0|7] "" XXX + SG_ Signal1 : 15|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_ACTIVE : 17|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Dash_State : 18|2@1+ (1,0) [0|2] "" XXX + SG_ Signal2 : 20|3@1+ (1,0) [0|7] "" XXX + SG_ Backward_Speed_Limit_Menu : 23|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Enable : 24|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Light_Blink : 25|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Right_Line_Enable : 26|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Right_Line_Light_Blink : 27|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Visible : 28|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_Right_Line_Visible : 30|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_Alert : 32|5@1+ (1,0) [0|31] "" XXX + SG_ Signal3 : 37|27@1+ (1,0) [0|1] "" XXX + +BO_ 803 ES_Infotainment: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_Blue_Lines : 15|4@0+ (1,0) [0|15] "" XXX + SG_ Signal1 : 19|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_State_Infotainment : 22|3@0+ (1,0) [0|7] "" XXX + SG_ Signal2 : 24|1@0+ (1,0) [0|1] "" XXX + +BO_ 722 AC_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ AC_Mode : 37|3@1+ (1,0) [0|1] "" XXX + SG_ AC_ON : 24|2@1+ (1,0) [0|1] "" XXX + +BO_ 1677 Dash_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Units : 29|3@1+ (1,0) [0|7] "" XXX + +BO_ 554 ES_HighBeamAssist: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ HBA_Available : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 805 ES_STATIC_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_3 : 23|2@0+ (1,0) [0|3] "" XXX + +BO_ 289 ES_STATIC_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_3 : 15|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_Fault : 18|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 64 Throttle_Combo "Throttle Cruise + Pedal"; +CM_ SG_ 313 Brake_Lights "Driver or Cruise Brake on"; +CM_ SG_ 544 Cruise_Brake_Lights "1 = switch on brake lights"; +CM_ SG_ 544 Brake_Pressure "Winds down after cruise disabled. Also can be non-zero when likely preparing for AEB"; +CM_ SG_ 544 Signal3 "Usually goes to 2 if AEB_Status is 4"; +CM_ SG_ 544 AEB_Status "Occasionally is 4 instead of 8 while Brake_Pressure is non-zero, unsure why"; +CM_ SG_ 801 Cruise_Activated_Dash "Falls during user gas or standstill. This is likely only a UI signal to the dash to show if ACC is actually actuating"; +CM_ SG_ 801 PCB_Off "Pre-Collision Braking off"; +CM_ SG_ 801 Brake_Lights "Driver or Cruise brake on"; +CM_ SG_ 801 Cruise_State "0 = Normal, 1 = Hold+User Brake, 2 = Ready, 3 = Hold"; +CM_ SG_ 801 Far_Distance "1=0-5m, 2=5-10m, 3=10-15m, 4=15-20m, 5=20-25m, 6=25-30m, 7=30-35m, 8=35-40m, 9=40-45m, 10=45-50m, 11=50-55m, 12=55-60m, 13=60-65m, 14=65-70m, 15=75m+"; +CM_ SG_ 801 LKAS_State_Msg "1 = LKAS_Off_Sharp_Curve, 2 = Keep_Hands_On_Steering_wheel_disabled, 3 = LKAS_Off, 4 = LKAS_Off_Too_Slow, 5 = LKAS_Off_Too_Fast"; +CM_ SG_ 801 Cruise_State_Msg "1 = Cruise_Off_Steep_Slope, 2 = Cruise_lvl1_eco, 3 = Cruise_lvl2_comfort, 4 = Cruise_off_empty_reason, 5 = Cruise_off, 6 = Cruise_Unable_to_set, 7 = Cruise_Unable_to_set_brakes_applied, 8 = Eyesight_not_ready, 9 = Cruise_lvl3_standard, 10 = Cruise_lvl4_dynamic, 11 = Cruise_Unable_to_set_steep_slope"; +CM_ SG_ 801 Cruise_Soft_Disable "Eyesight soft disable (eg direct sunlight)"; +CM_ SG_ 801 Cruise_Status_Msg "1 = Disabled_Bad_Visibility, 2 = Disabled_Check_Manual"; +CM_ SG_ 802 LKAS_ACTIVE "Turns on the full LKAS dash display"; +CM_ SG_ 802 LKAS_Alert_Msg "1 = Keep_Hands_On_Wheel, 6 = Pre_Collision_Braking, 7 = Keep_Hands_On_Wheel_Off"; +CM_ SG_ 802 LKAS_Alert "1 = FCW_Cont_Beep, 2 = FCW_Repeated_Beep, 3 = Throttle_Management_Activated_Warning, 4 = Throttle_Management_Activated_Alert, 5 = Pre_Collision_Activated_Alert, 8 = Traffic_Light_Ahead, 9 = Apply_Brake_to_Hold Position, 11 = LDW_Right, 12 = LDW_Left, 13 = Stay_Alert, 14 = Lead_Vehicle_Start_Alert, 18 = Keep_Hands_On_Steering_Alert, 24 = Audio_Beep, 25 = Audio_Lead_Car_Change, 26 = Audio_ACC_Disengaged, 27 = Audio_LKAS_disabled, 28 = Audio_Ding_Ding, 30 = Audio_Repeated_Beep"; +CM_ SG_ 802 LKAS_Left_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange"; +CM_ SG_ 802 LKAS_Dash_State "0 = Off, 1 = Ready, 2 = Active"; +CM_ SG_ 802 LKAS_Right_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange"; +CM_ SG_ 912 UNITS "0 = Metric, 1 = Imperial"; +CM_ SG_ 912 ICY_ROAD "1 = DASHLIGHT ON, 2 = WARNING, 3 = OFF"; +VAL_ 544 AEB_Status 12 "AEB related" 8 "AEB actuation" 4 "AEB related" 0 "No AEB actuation"; + +CM_ "subaru_global_2017.dbc starts here"; + +BO_ 72 Transmission: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Gear : 24|8@1+ (1,0) [0|255] "" XXX + SG_ RPM : 40|15@1+ (1,0) [0|65535] "" XXX + +BO_ 73 CVT: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ CVT_Gear : 24|8@1+ (1,0) [0|255] "" XXX + +BO_ 545 ES_Distance: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Fault : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Throttle : 16|13@1+ (1,0) [0|4095] "" XXX + SG_ Signal2 : 29|3@1+ (1,0) [0|15] "" XXX + SG_ Car_Follow : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Low_Speed_Follow : 33|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Soft_Disable : 34|1@1+ (1,0) [0|1] "" XXX + SG_ Signal7 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Distance_Swap : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_EPB : 38|1@1+ (1,0) [0|1] "" XXX + SG_ Signal4 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ Close_Distance : 40|8@1+ (0.019607,0) [0|5] "m" XXX + SG_ Signal5 : 48|8@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Cancel : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Set : 57|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Resume : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Signal6 : 59|5@1+ (1,0) [0|1] "" XXX + +BO_ 546 ES_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|3@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_RPM : 16|13@1+ (1,0) [0|4095] "" XXX + SG_ Cruise_Activated : 29|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Lights : 30|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Hold : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 32|32@1+ (1,0) [0|1] "" XXX + +BO_ 576 CruiseControl: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|28@1+ (1,0) [0|268435455] "" XXX + SG_ Cruise_On : 40|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 41|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 42|22@1+ (1,0) [0|4194303] "" XXX + +CM_ SG_ 545 Cruise_Throttle "RPM-like output signal"; +CM_ SG_ 545 Cruise_EPB "1 = Electric Parking Brake set"; +CM_ SG_ 545 Distance_Swap "Switch from Close to Far distance"; +CM_ SG_ 545 Cruise_Soft_Disable "Eyesight Temporary disable, sets CruiseControl Activated = 0"; +CM_ SG_ 546 Cruise_RPM "ES RPM output for ECM and TCM"; +CM_ SG_ 546 Signal3 "0 when cruise_activated = 1"; +CM_ SG_ 803 Signal1 "Seems to be static, set only on some cars"; +CM_ SG_ 803 Signal2 "Seems to be static, set only on some cars"; +VAL_ 803 LKAS_Blue_Lines 0 "no modifier" 2 "changes lines to blue"; +VAL_ 803 LKAS_State_Infotainment 0 "none" 2 "Obstacle Detected" 3 "Keep Hands On Wheel" 4 "Keep Hands On Wheel Off"; +VAL_ 72 Gear 2 "N" 3 "R" 4 "P" 121 "D" 137 "1" 145 "2" 153 "3" 161 "4" 169 "5" 177 "6"; diff --git a/artifacts/package_runtime/iqdbc/dbc/subaru_global_2020_hybrid_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/subaru_global_2020_hybrid_generated.dbc new file mode 100644 index 000000000..1767a924d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/subaru_global_2020_hybrid_generated.dbc @@ -0,0 +1,328 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _subaru_global.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX X + + +BO_ 2 Steering: 8 XXX + SG_ Steering_Angle : 7|16@0- (0.1,0) [0|65535] "" XXX + SG_ COUNTER : 25|3@1+ (1,0) [0|7] "" XXX + SG_ CHECKSUM : 32|8@1+ (1,0) [0|255] "" XXX + +BO_ 64 Throttle: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Engine_RPM : 16|13@1+ (1,0) [0|8191] "" XXX + SG_ Neutral : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Cruise : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Combo : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Signal3 : 56|4@1+ (1,0) [0|15] "" XXX + SG_ Off_Accel : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 316 Brake_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|46@1+ (1,0) [0|1] "" XXX + SG_ ES_Brake : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 59|3@1+ (1,0) [0|1] "" XXX + SG_ Brake : 62|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 326 Cruise_Buttons: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|30@1+ (1,0) [0|1073741823] "" XXX + SG_ Main : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Set : 43|1@1+ (1,0) [0|1] "" XXX + SG_ Resume : 44|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 45|19@1+ (1,0) [0|524287] "" XXX + +BO_ 315 G_Sensor: 8 XXX + SG_ Lateral : 48|8@1- (-0.1,0) [0|255] "m/s2" XXX + SG_ Longitudinal : 56|8@1- (-0.1,0) [0|255] "m/s2" XXX + +BO_ 314 Wheel_Speeds: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ FR : 12|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ RR : 25|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ FL : 51|13@1+ (0.057,0) [0|255] "kph" XXX + SG_ RL : 38|13@1+ (0.057,0) [0|255] "kph" XXX + +BO_ 280 Steering_Torque_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steer_Torque_Output : 13|11@1- (-10,0) [0|255] "" XXX + SG_ Signal1 : 24|8@1+ (1,0) [0|511] "" XXX + SG_ Steer_Torque_Sensor : 45|11@1- (-1,0) [0|255] "" XXX + SG_ Steering_Active : 61|1@0+ (1,0) [0|1] "" XXX + SG_ Steering_Disabled : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 281 Steering_Torque: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steer_Error_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 16|11@1- (-1,0) [-1000|1000] "" XXX + SG_ Steer_Error_2 : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Warning : 29|1@1+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 32|16@1- (-0.0217,0) [-600|600] "" X + SG_ Steer_Torque_Output : 48|11@1- (-10,0) [-1000|1000] "" XXX + +BO_ 282 Steering_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 24|17@1- (-0.01,0) [0|1] "" XXX + +BO_ 312 Brake_Pressure_L_R: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Steering_Angle : 16|16@1- (-0.1,0) [-3276.8|3276.7] "" XXX + SG_ Brake_1 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_2 : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 313 Brake_Pedal: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Speed : 16|12@1+ (0.05625,0) [0|255] "kph" XXX + SG_ Signal2 : 28|6@1+ (1,0) [0|63] "" XXX + SG_ Brake_Lights : 34|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal : 36|12@1+ (1,0) [0|4095] "" XXX + SG_ Signal4 : 48|16@1+ (1,0) [0|65535] "" XXX + +BO_ 372 Engine_Stop_Start: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX + SG_ STOP_START_STATE : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 290 ES_LKAS: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_Output : 16|13@1- (-1,0) [-8191|8191] "" XXX + SG_ LKAS_Request : 29|1@0+ (1,0) [0|1] "" XXX + +BO_ 292 ES_LKAS_ANGLE: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Request : 12|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Output : 40|17@1- (-0.01,0) [0|1] "deg" XXX + SG_ SET_3 : 60|2@1+ (1,0) [0|1] "" XXX + +BO_ 544 ES_Brake: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Pressure : 16|16@1+ (1,0) [0|65535] "" XXX + SG_ AEB_Status : 32|4@1+ (1,0) [0|15] "" XXX + SG_ Cruise_Brake_Lights : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Fault : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 38|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 39|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 40|24@1+ (1,0) [0|16777215] "" XXX + +BO_ 577 Cruise_Status: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Clutch_Depressed : 47|1@0+ (1,0) [0|1] "" XXX + SG_ Cruise_Set_Speed : 51|12@0+ (1,0) [0|120] "" XXX + SG_ Cruise_On : 54|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 55|1@1+ (1,0) [0|1] "" XXX + +BO_ 552 BSD_RCTA: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ R_ADJACENT : 48|1@1+ (1,0) [0|1] "" XXX + SG_ L_ADJACENT : 49|1@1+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 58|1@1+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 59|1@1+ (1,0) [0|1] "" XXX + +BO_ 912 Dashlights: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ UNITS : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ICY_ROAD : 32|2@1+ (1,0) [0|3] "" XXX + SG_ SEATBELT_FL : 48|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 50|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 51|1@1+ (1,0) [0|1] "" XXX + SG_ STOP_START : 54|1@0+ (1,0) [0|1] "" XXX + +BO_ 940 BodyInfo: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ DOOR_OPEN_FL : 32|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 33|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 34|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 35|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_TRUNK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE : 54|1@1+ (1,0) [0|1] "" XXX + SG_ DASH_BTN_LIGHTS : 56|1@0+ (1,0) [0|1] "" XXX + SG_ LOWBEAM : 57|1@1+ (1,0) [0|1] "" XXX + SG_ HIGHBEAM : 58|1@1+ (1,0) [0|1] "" XXX + SG_ FOG_LIGHTS : 60|1@1+ (1,0) [0|1] "" XXX + SG_ WIPERS : 62|1@0+ (1,0) [0|1] "" XXX + +BO_ 801 ES_DashStatus: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ PCB_Off : 12|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Off : 13|1@1+ (1,0) [0|1] "" XXX + SG_ Signal1 : 14|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_State_Msg : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_State_Msg : 20|3@1+ (1,0) [0|7] "" XXX + SG_ Signal2 : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Soft_Disable : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Status_Msg : 25|2@1+ (1,0) [0|3] "" XXX + SG_ Signal3 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Distance : 28|3@1+ (1,0) [0|7] "" XXX + SG_ Signal4 : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Conventional_Cruise : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Signal5 : 33|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_Disengaged_Dash : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Signal6 : 37|3@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Set_Speed : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Fault : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Display_Own_Car : 50|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Lights : 51|1@1+ (1,0) [0|1] "" XXX + SG_ Car_Follow : 52|1@1+ (1,0) [0|1] "" XXX + SG_ Signal7 : 53|3@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 56|4@1+ (5,0) [0|75] "m" XXX + SG_ Cruise_State : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 802 ES_LKAS_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_Alert_Msg : 12|3@1+ (1,0) [0|7] "" XXX + SG_ Signal1 : 15|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_ACTIVE : 17|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Dash_State : 18|2@1+ (1,0) [0|2] "" XXX + SG_ Signal2 : 20|3@1+ (1,0) [0|7] "" XXX + SG_ Backward_Speed_Limit_Menu : 23|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Enable : 24|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Light_Blink : 25|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Right_Line_Enable : 26|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Right_Line_Light_Blink : 27|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Left_Line_Visible : 28|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_Right_Line_Visible : 30|2@1+ (1,0) [0|3] "" XXX + SG_ LKAS_Alert : 32|5@1+ (1,0) [0|31] "" XXX + SG_ Signal3 : 37|27@1+ (1,0) [0|1] "" XXX + +BO_ 803 ES_Infotainment: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LKAS_Blue_Lines : 15|4@0+ (1,0) [0|15] "" XXX + SG_ Signal1 : 19|4@0+ (1,0) [0|15] "" XXX + SG_ LKAS_State_Infotainment : 22|3@0+ (1,0) [0|7] "" XXX + SG_ Signal2 : 24|1@0+ (1,0) [0|1] "" XXX + +BO_ 722 AC_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ AC_Mode : 37|3@1+ (1,0) [0|1] "" XXX + SG_ AC_ON : 24|2@1+ (1,0) [0|1] "" XXX + +BO_ 1677 Dash_State: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Units : 29|3@1+ (1,0) [0|7] "" XXX + +BO_ 554 ES_HighBeamAssist: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ HBA_Available : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 805 ES_STATIC_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_3 : 23|2@0+ (1,0) [0|3] "" XXX + +BO_ 289 ES_STATIC_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SET_3 : 15|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_Fault : 18|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 64 Throttle_Combo "Throttle Cruise + Pedal"; +CM_ SG_ 313 Brake_Lights "Driver or Cruise Brake on"; +CM_ SG_ 544 Cruise_Brake_Lights "1 = switch on brake lights"; +CM_ SG_ 544 Brake_Pressure "Winds down after cruise disabled. Also can be non-zero when likely preparing for AEB"; +CM_ SG_ 544 Signal3 "Usually goes to 2 if AEB_Status is 4"; +CM_ SG_ 544 AEB_Status "Occasionally is 4 instead of 8 while Brake_Pressure is non-zero, unsure why"; +CM_ SG_ 801 Cruise_Activated_Dash "Falls during user gas or standstill. This is likely only a UI signal to the dash to show if ACC is actually actuating"; +CM_ SG_ 801 PCB_Off "Pre-Collision Braking off"; +CM_ SG_ 801 Brake_Lights "Driver or Cruise brake on"; +CM_ SG_ 801 Cruise_State "0 = Normal, 1 = Hold+User Brake, 2 = Ready, 3 = Hold"; +CM_ SG_ 801 Far_Distance "1=0-5m, 2=5-10m, 3=10-15m, 4=15-20m, 5=20-25m, 6=25-30m, 7=30-35m, 8=35-40m, 9=40-45m, 10=45-50m, 11=50-55m, 12=55-60m, 13=60-65m, 14=65-70m, 15=75m+"; +CM_ SG_ 801 LKAS_State_Msg "1 = LKAS_Off_Sharp_Curve, 2 = Keep_Hands_On_Steering_wheel_disabled, 3 = LKAS_Off, 4 = LKAS_Off_Too_Slow, 5 = LKAS_Off_Too_Fast"; +CM_ SG_ 801 Cruise_State_Msg "1 = Cruise_Off_Steep_Slope, 2 = Cruise_lvl1_eco, 3 = Cruise_lvl2_comfort, 4 = Cruise_off_empty_reason, 5 = Cruise_off, 6 = Cruise_Unable_to_set, 7 = Cruise_Unable_to_set_brakes_applied, 8 = Eyesight_not_ready, 9 = Cruise_lvl3_standard, 10 = Cruise_lvl4_dynamic, 11 = Cruise_Unable_to_set_steep_slope"; +CM_ SG_ 801 Cruise_Soft_Disable "Eyesight soft disable (eg direct sunlight)"; +CM_ SG_ 801 Cruise_Status_Msg "1 = Disabled_Bad_Visibility, 2 = Disabled_Check_Manual"; +CM_ SG_ 802 LKAS_ACTIVE "Turns on the full LKAS dash display"; +CM_ SG_ 802 LKAS_Alert_Msg "1 = Keep_Hands_On_Wheel, 6 = Pre_Collision_Braking, 7 = Keep_Hands_On_Wheel_Off"; +CM_ SG_ 802 LKAS_Alert "1 = FCW_Cont_Beep, 2 = FCW_Repeated_Beep, 3 = Throttle_Management_Activated_Warning, 4 = Throttle_Management_Activated_Alert, 5 = Pre_Collision_Activated_Alert, 8 = Traffic_Light_Ahead, 9 = Apply_Brake_to_Hold Position, 11 = LDW_Right, 12 = LDW_Left, 13 = Stay_Alert, 14 = Lead_Vehicle_Start_Alert, 18 = Keep_Hands_On_Steering_Alert, 24 = Audio_Beep, 25 = Audio_Lead_Car_Change, 26 = Audio_ACC_Disengaged, 27 = Audio_LKAS_disabled, 28 = Audio_Ding_Ding, 30 = Audio_Repeated_Beep"; +CM_ SG_ 802 LKAS_Left_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange"; +CM_ SG_ 802 LKAS_Dash_State "0 = Off, 1 = Ready, 2 = Active"; +CM_ SG_ 802 LKAS_Right_Line_Visible "0 = Off, 1 = White, 2 = Green, 3 = Orange"; +CM_ SG_ 912 UNITS "0 = Metric, 1 = Imperial"; +CM_ SG_ 912 ICY_ROAD "1 = DASHLIGHT ON, 2 = WARNING, 3 = OFF"; +VAL_ 544 AEB_Status 12 "AEB related" 8 "AEB actuation" 4 "AEB related" 0 "No AEB actuation"; + +CM_ "subaru_global_2020_hybrid.dbc starts here"; + +BO_ 39 Cruise_Status_2: 8 XXX + SG_ Cruise_Activated : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 295 Transmission: 8 XXX + SG_ Gear : 44|4@1+ (1,0) [0|15] "" XXX + +BO_ 360 Throttle_Hybrid: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX + +BO_ 550 Brake_Hybrid: 8 XXX + SG_ Brake_Pedal : 24|8@1+ (1,0) [0|1] "" XXX + SG_ Brake : 37|1@1+ (1,0) [0|1] "" XXX + +VAL_ 295 Gear 0 "P" 1 "R" 3 "D"; diff --git a/artifacts/package_runtime/iqdbc/dbc/subaru_outback_2015_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/subaru_outback_2015_generated.dbc new file mode 100644 index 000000000..0cc6d2963 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/subaru_outback_2015_generated.dbc @@ -0,0 +1,281 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _subaru_preglobal_2015.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX X + + +BO_ 2 Steering: 8 XXX + SG_ Steering_Angle : 7|16@0- (0.1,0) [-500|500] "degree" XXX + SG_ COUNTER : 27|3@0+ (1,0) [0|7] "" XXX + SG_ Checksum : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 208 G_Sensor: 8 XXX + SG_ Steering_Angle : 0|16@1- (-0.1,0) [-500|500] "" XXX + SG_ Lateral : 16|16@1- (-0.0035,1) [-255|255] "" XXX + SG_ Longitudinal : 48|16@1- (-0.00035,0) [-255|255] "" XXX + +BO_ 209 Brake_Pedal: 4 XXX + SG_ Speed : 0|16@1+ (0.05625,0) [0|255] "KPH" XXX + SG_ Brake_Pedal : 16|8@1+ (1,0) [0|255] "" XXX + SG_ Signal1 : 24|8@1+ (1,0) [0|255] "" XXX + +BO_ 210 Brake_2: 8 XXX + SG_ Brake_Light : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Related : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Brake : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Left_Brake : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 211 Brake_Type: 8 XXX + SG_ Brake_Light : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Speed_Counter : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_Cruise_On : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal_On : 46|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 48|8@1+ (1,0) [0|255] "" XXX + +BO_ 212 Wheel_Speeds: 8 XXX + SG_ FL : 0|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ FR : 16|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ RL : 32|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ RR : 48|16@1+ (0.0592,0) [0|255] "KPH" XXX + +BO_ 320 Throttle: 8 XXX + SG_ Throttle_Pedal : 0|8@1+ (0.392157,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|2@1+ (1,0) [0|7] "" XXX + SG_ Not_Full_Throttle : 14|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Engine_RPM : 16|14@1+ (1,0) [0|32767] "" XXX + SG_ Off_Throttle : 30|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Throttle_Cruise : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Combo : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Body : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Off_Throttle_2 : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Signal4 : 57|7@1+ (1,0) [0|127] "" XXX + +BO_ 321 Engine: 8 XXX + SG_ Engine_Torque : 0|15@1+ (1,0) [0|255] "" XXX + SG_ Engine_Stop : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Wheel_Torque : 16|12@1+ (1,0) [0|4095] "" XXX + SG_ Engine_RPM : 32|12@1+ (1,0) [0|8191] "" XXX + +BO_ 324 CruiseControl: 8 XXX + SG_ OnOffButton : 2|1@1+ (1,0) [0|1] "" XXX + SG_ SET_BUTTON : 3|1@1+ (1,0) [0|1] "" XXX + SG_ RES_BUTTON : 4|1@1+ (1,0) [0|1] "" XXX + SG_ Button : 13|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal_On : 51|1@1+ (1,0) [0|1] "" XXX + +BO_ 328 Transmission: 8 XXX + SG_ Manual_Gear : 4|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Transmission_Engine : 16|15@1+ (1,0) [0|65535] "" XXX + SG_ Gear : 48|4@1+ (1,0) [0|15] "" XXX + SG_ Gear_2 : 52|4@1+ (1,0) [0|15] "" XXX + SG_ Paddle_Shift : 60|2@1+ (1,0) [0|3] "" XXX + +BO_ 329 CVT_Ratio: 8 XXX + +BO_ 336 Brake_Pressure: 8 XXX + SG_ Brake_Pressure_Right : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_Pressure_Left : 8|8@1+ (1,0) [0|255] "" XXX + +BO_ 338 Stalk: 8 XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Light : 52|1@1+ (1,0) [0|1] "" XXX + SG_ Runlights : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Headlights : 59|1@1+ (1,0) [0|1] "" XXX + SG_ Highbeam : 60|1@1+ (1,0) [0|1] "" XXX + SG_ Wiper : 62|1@1+ (1,0) [0|1] "" XXX + +BO_ 352 ES_Brake: 8 XXX + SG_ Brake_Pressure : 0|16@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Brake_Lights : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 22|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 23|1@1+ (1,0) [0|1] "" XXX + SG_ SET_1 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 353 ES_Distance: 8 XXX + SG_ Cruise_Throttle : 0|12@1+ (1,0) [0|4095] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Car_Follow : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 17|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Brake_Active : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Distance_Swap : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Standstill : 22|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Close_Distance : 24|8@1+ (0.019607,0) [0|5] "m" XXX + SG_ Signal4 : 32|9@1+ (1,0) [0|255] "" XXX + SG_ Standstill_2 : 41|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Signal5 : 43|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 44|3@1+ (1,0) [0|7] "" XXX + SG_ Signal6 : 47|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Button : 48|3@1+ (1,0) [0|7] "" XXX + SG_ Signal7 : 51|5@1+ (1,0) [0|31] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 354 ES_Status: 8 XXX + SG_ Brake : 8|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 9|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_RPM : 16|16@1+ (1,0) [0|65535] "" XXX + SG_ Checksum : 32|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX + +BO_ 356 ES_LKAS: 8 XXX + SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX + SG_ LKAS_Command : 8|13@1- (-1,0) [-4096|4096] "" XXX + SG_ LKAS_Active : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 359 ES_LDW: 8 XXX + SG_ All_depart_2015 : 0|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1All_Depart : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Sig2All_Depart : 31|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Active : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Depart_Front : 51|1@1+ (1,0) [0|1] "" XXX + SG_ Sig3All_Depart : 52|1@1+ (1,0) [0|1] "" XXX + +BO_ 604 BSD_RCTA: 8 XXX + SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX + SG_ State : 5|1@1+ (1,0) [0|1] "" XXX + SG_ R_ADJACENT : 32|1@1+ (1,0) [0|1] "" XXX + SG_ L_ADJACENT : 33|1@1+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 42|1@1+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 43|1@1+ (1,0) [0|1] "" XXX + SG_ R_RCTA : 46|1@1+ (1,0) [0|1] "" XXX + SG_ L_RCTA : 47|1@1+ (1,0) [0|1] "" XXX + +BO_ 642 Dashlights: 8 XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ SEATBELT_FL : 40|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 44|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 45|1@1+ (1,0) [0|1] "" XXX + +BO_ 880 Steering_Torque_2: 8 XXX + SG_ Steering_Voltage_Flat : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX + SG_ COUNTER : 40|4@1+ (1,0) [0|15] "" XXX + +BO_ 884 BodyInfo: 8 XXX + SG_ DOOR_OPEN_FR : 24|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 25|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 26|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 27|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_Hatch : 28|1@1+ (1,0) [0|1] "" XXX + +BO_ 864 Engine_Temp: 8 XXX + SG_ Oil_Temp : 16|8@1+ (1,-40) [0|255] "" XXX + SG_ Coolant_Temp : 24|8@1+ (1,-40) [0|255] "" XXX + SG_ Cruise_Activated : 45|1@1+ (1,0) [0|1] "" XXX + SG_ Saved_Speed : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 866 Fuel: 8 XXX + +BO_ 977 Dash_State2: 8 XXX + SG_ UNITS : 15|1@1+ (1,0) [0|1] "" XXX + +BO_ 1745 Dash_State: 8 XXX + SG_ Units : 15|1@1+ (1,0) [0|1] "" XXX + +CM_ SG_ 320 Off_Throttle_2 "Less sensitive"; +CM_ SG_ 320 Throttle_Body "Throttle related"; +CM_ SG_ 328 Gear "15 = P, 14 = R, 0 = N, 1-6=gear"; +CM_ SG_ 328 Gear_2 "15 = P, 14 = R, 0 = N, 1-6=gear"; +CM_ SG_ 353 Cruise_Button "1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 resume deep"; +CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission"; +CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage"; +CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering"; +CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert "; +CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart"; +CM_ SG_ 359 Sig1All_Depart "Left and right depart"; +CM_ SG_ 359 Sig2All_Depart "Left and right depart"; +CM_ SG_ 359 All_depart_2015 "always 1 on 2017"; +CM_ SG_ 604 R_APPROACHING "Faster car approaching in far right lane"; +CM_ SG_ 604 L_APPROACHING "Faster car approaching in far left lane"; +CM_ SG_ 604 R_RCTA "Rear cross traffic alert, only when in R gear"; +CM_ SG_ 604 L_RCTA "Rear cross traffic alert, only when in R gear"; +CM_ SG_ 642 COUNTER "Affected by signals"; +CM_ SG_ 642 SEATBELT_FL "Driver seatbelt"; +CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371"; +CM_ SG_ 977 UNITS "0 = Metric, 1 = Imperial"; + +VAL_ 328 Gear 0 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 14 "R" 15 "P"; + +CM_ "subaru_outback_2015.dbc starts here"; + +BO_ 358 ES_DashStatus: 8 XXX + SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX + SG_ Seatbelt_Disengage : 12|2@1+ (1,0) [0|3] "" XXX + SG_ Disengage_Alert : 14|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 17|1@1+ (1,0) [0|1] "" XXX + SG_ Signal1 : 18|1@1+ (1,0) [0|1] "" XXX + SG_ WHEELS_MOVING_2015 : 19|1@1+ (1,0) [0|1] "" XXX + SG_ Driver_Input : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Distance : 21|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Fault : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On_2 : 34|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 37|3@1+ (1,0) [0|7] "" XXX + SG_ Steep_Hill_Disengage : 44|1@1+ (1,0) [0|3] "" XXX + SG_ Car_Follow : 46|1@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 48|4@1+ (5,0) [0|75] "m" XXX + +BO_ 881 Steering_Torque: 8 XXX + SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX + SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX + SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (1,0) [-1000|1000] "" XXX + SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX + +CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage"; +CM_ SG_ 358 Cruise_Fault "No engagement until restart"; +CM_ SG_ 358 Car_Follow "lead car detected"; diff --git a/artifacts/package_runtime/iqdbc/dbc/subaru_outback_2019_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/subaru_outback_2019_generated.dbc new file mode 100644 index 000000000..7d159d2cf --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/subaru_outback_2019_generated.dbc @@ -0,0 +1,281 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _subaru_preglobal_2015.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX X + + +BO_ 2 Steering: 8 XXX + SG_ Steering_Angle : 7|16@0- (0.1,0) [-500|500] "degree" XXX + SG_ COUNTER : 27|3@0+ (1,0) [0|7] "" XXX + SG_ Checksum : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 208 G_Sensor: 8 XXX + SG_ Steering_Angle : 0|16@1- (-0.1,0) [-500|500] "" XXX + SG_ Lateral : 16|16@1- (-0.0035,1) [-255|255] "" XXX + SG_ Longitudinal : 48|16@1- (-0.00035,0) [-255|255] "" XXX + +BO_ 209 Brake_Pedal: 4 XXX + SG_ Speed : 0|16@1+ (0.05625,0) [0|255] "KPH" XXX + SG_ Brake_Pedal : 16|8@1+ (1,0) [0|255] "" XXX + SG_ Signal1 : 24|8@1+ (1,0) [0|255] "" XXX + +BO_ 210 Brake_2: 8 XXX + SG_ Brake_Light : 35|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Related : 36|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Brake : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Left_Brake : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 211 Brake_Type: 8 XXX + SG_ Brake_Light : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Speed_Counter : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_Cruise_On : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal_On : 46|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 48|8@1+ (1,0) [0|255] "" XXX + +BO_ 212 Wheel_Speeds: 8 XXX + SG_ FL : 0|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ FR : 16|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ RL : 32|16@1+ (0.0592,0) [0|255] "KPH" XXX + SG_ RR : 48|16@1+ (0.0592,0) [0|255] "KPH" XXX + +BO_ 320 Throttle: 8 XXX + SG_ Throttle_Pedal : 0|8@1+ (0.392157,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Signal1 : 12|2@1+ (1,0) [0|7] "" XXX + SG_ Not_Full_Throttle : 14|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Engine_RPM : 16|14@1+ (1,0) [0|32767] "" XXX + SG_ Off_Throttle : 30|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Throttle_Cruise : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Combo : 40|8@1+ (1,0) [0|255] "" XXX + SG_ Throttle_Body : 48|8@1+ (1,0) [0|255] "" XXX + SG_ Off_Throttle_2 : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Signal4 : 57|7@1+ (1,0) [0|127] "" XXX + +BO_ 321 Engine: 8 XXX + SG_ Engine_Torque : 0|15@1+ (1,0) [0|255] "" XXX + SG_ Engine_Stop : 15|1@1+ (1,0) [0|1] "" XXX + SG_ Wheel_Torque : 16|12@1+ (1,0) [0|4095] "" XXX + SG_ Engine_RPM : 32|12@1+ (1,0) [0|8191] "" XXX + +BO_ 324 CruiseControl: 8 XXX + SG_ OnOffButton : 2|1@1+ (1,0) [0|1] "" XXX + SG_ SET_BUTTON : 3|1@1+ (1,0) [0|1] "" XXX + SG_ RES_BUTTON : 4|1@1+ (1,0) [0|1] "" XXX + SG_ Button : 13|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pedal_On : 51|1@1+ (1,0) [0|1] "" XXX + +BO_ 328 Transmission: 8 XXX + SG_ Manual_Gear : 4|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Transmission_Engine : 16|15@1+ (1,0) [0|65535] "" XXX + SG_ Gear : 48|4@1+ (1,0) [0|15] "" XXX + SG_ Gear_2 : 52|4@1+ (1,0) [0|15] "" XXX + SG_ Paddle_Shift : 60|2@1+ (1,0) [0|3] "" XXX + +BO_ 329 CVT_Ratio: 8 XXX + +BO_ 336 Brake_Pressure: 8 XXX + SG_ Brake_Pressure_Right : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Brake_Pressure_Left : 8|8@1+ (1,0) [0|255] "" XXX + +BO_ 338 Stalk: 8 XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Light : 52|1@1+ (1,0) [0|1] "" XXX + SG_ Runlights : 58|1@1+ (1,0) [0|1] "" XXX + SG_ Headlights : 59|1@1+ (1,0) [0|1] "" XXX + SG_ Highbeam : 60|1@1+ (1,0) [0|1] "" XXX + SG_ Wiper : 62|1@1+ (1,0) [0|1] "" XXX + +BO_ 352 ES_Brake: 8 XXX + SG_ Brake_Pressure : 0|16@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Brake_Lights : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Brake_Active : 22|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 23|1@1+ (1,0) [0|1] "" XXX + SG_ SET_1 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 353 ES_Distance: 8 XXX + SG_ Cruise_Throttle : 0|12@1+ (1,0) [0|4095] "" XXX + SG_ Signal1 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Car_Follow : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Signal2 : 17|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Brake_Active : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Distance_Swap : 21|1@1+ (1,0) [0|1] "" XXX + SG_ Standstill : 22|1@1+ (1,0) [0|1] "" XXX + SG_ Signal3 : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Close_Distance : 24|8@1+ (0.019607,0) [0|5] "m" XXX + SG_ Signal4 : 32|9@1+ (1,0) [0|255] "" XXX + SG_ Standstill_2 : 41|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Fault : 42|1@1+ (1,0) [0|1] "" XXX + SG_ Signal5 : 43|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 44|3@1+ (1,0) [0|7] "" XXX + SG_ Signal6 : 47|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Button : 48|3@1+ (1,0) [0|7] "" XXX + SG_ Signal7 : 51|5@1+ (1,0) [0|31] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 354 ES_Status: 8 XXX + SG_ Brake : 8|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated : 9|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_RPM : 16|16@1+ (1,0) [0|65535] "" XXX + SG_ Checksum : 32|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 48|3@1+ (1,0) [0|7] "" XXX + +BO_ 356 ES_LKAS: 8 XXX + SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX + SG_ LKAS_Command : 8|13@1- (-1,0) [-4096|4096] "" XXX + SG_ LKAS_Active : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Checksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 359 ES_LDW: 8 XXX + SG_ All_depart_2015 : 0|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1All_Depart : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Sig2All_Depart : 31|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|1] "" XXX + SG_ LKAS_Active : 37|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|1] "" XXX + SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|1] "" XXX + SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Depart_Front : 51|1@1+ (1,0) [0|1] "" XXX + SG_ Sig3All_Depart : 52|1@1+ (1,0) [0|1] "" XXX + +BO_ 604 BSD_RCTA: 8 XXX + SG_ COUNTER : 0|3@1+ (1,0) [0|7] "" XXX + SG_ State : 5|1@1+ (1,0) [0|1] "" XXX + SG_ R_ADJACENT : 32|1@1+ (1,0) [0|1] "" XXX + SG_ L_ADJACENT : 33|1@1+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 42|1@1+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 43|1@1+ (1,0) [0|1] "" XXX + SG_ R_RCTA : 46|1@1+ (1,0) [0|1] "" XXX + SG_ L_RCTA : 47|1@1+ (1,0) [0|1] "" XXX + +BO_ 642 Dashlights: 8 XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ SEATBELT_FL : 40|1@1+ (1,0) [0|1] "" XXX + SG_ LEFT_BLINKER : 44|1@1+ (1,0) [0|1] "" XXX + SG_ RIGHT_BLINKER : 45|1@1+ (1,0) [0|1] "" XXX + +BO_ 880 Steering_Torque_2: 8 XXX + SG_ Steering_Voltage_Flat : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX + SG_ COUNTER : 40|4@1+ (1,0) [0|15] "" XXX + +BO_ 884 BodyInfo: 8 XXX + SG_ DOOR_OPEN_FR : 24|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 25|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 26|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 27|1@1+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_Hatch : 28|1@1+ (1,0) [0|1] "" XXX + +BO_ 864 Engine_Temp: 8 XXX + SG_ Oil_Temp : 16|8@1+ (1,-40) [0|255] "" XXX + SG_ Coolant_Temp : 24|8@1+ (1,-40) [0|255] "" XXX + SG_ Cruise_Activated : 45|1@1+ (1,0) [0|1] "" XXX + SG_ Saved_Speed : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 866 Fuel: 8 XXX + +BO_ 977 Dash_State2: 8 XXX + SG_ UNITS : 15|1@1+ (1,0) [0|1] "" XXX + +BO_ 1745 Dash_State: 8 XXX + SG_ Units : 15|1@1+ (1,0) [0|1] "" XXX + +CM_ SG_ 320 Off_Throttle_2 "Less sensitive"; +CM_ SG_ 320 Throttle_Body "Throttle related"; +CM_ SG_ 328 Gear "15 = P, 14 = R, 0 = N, 1-6=gear"; +CM_ SG_ 328 Gear_2 "15 = P, 14 = R, 0 = N, 1-6=gear"; +CM_ SG_ 353 Cruise_Button "1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 resume deep"; +CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission"; +CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage"; +CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering"; +CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert "; +CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart"; +CM_ SG_ 359 Sig1All_Depart "Left and right depart"; +CM_ SG_ 359 Sig2All_Depart "Left and right depart"; +CM_ SG_ 359 All_depart_2015 "always 1 on 2017"; +CM_ SG_ 604 R_APPROACHING "Faster car approaching in far right lane"; +CM_ SG_ 604 L_APPROACHING "Faster car approaching in far left lane"; +CM_ SG_ 604 R_RCTA "Rear cross traffic alert, only when in R gear"; +CM_ SG_ 604 L_RCTA "Rear cross traffic alert, only when in R gear"; +CM_ SG_ 642 COUNTER "Affected by signals"; +CM_ SG_ 642 SEATBELT_FL "Driver seatbelt"; +CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371"; +CM_ SG_ 977 UNITS "0 = Metric, 1 = Imperial"; + +VAL_ 328 Gear 0 "N" 1 "D" 2 "D" 3 "D" 4 "D" 5 "D" 6 "D" 14 "R" 15 "P"; + +CM_ "subaru_outback_2019.dbc starts here"; + +BO_ 358 ES_DashStatus: 8 XXX + SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX + SG_ Seatbelt_Disengage : 12|2@1+ (1,0) [0|3] "" XXX + SG_ Disengage_Alert : 14|2@1+ (1,0) [0|3] "" XXX + SG_ Cruise_On : 16|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Activated_Dash : 17|1@1+ (1,0) [0|1] "" XXX + SG_ Signal1 : 18|1@1+ (1,0) [0|1] "" XXX + SG_ WHEELS_MOVING_2015 : 19|1@1+ (1,0) [0|1] "" XXX + SG_ Driver_Input : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_Distance : 21|3@1+ (1,0) [0|7] "" XXX + SG_ Cruise_Set_Speed : 24|8@1+ (1,0) [0|255] "" XXX + SG_ Cruise_Fault : 32|1@1+ (1,0) [0|1] "" XXX + SG_ Cruise_On_2 : 34|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 37|3@1+ (1,0) [0|7] "" XXX + SG_ Steep_Hill_Disengage : 44|1@1+ (1,0) [0|3] "" XXX + SG_ Car_Follow : 46|1@1+ (1,0) [0|1] "" XXX + SG_ Far_Distance : 48|4@1+ (5,0) [0|75] "m" XXX + +BO_ 881 Steering_Torque: 8 XXX + SG_ Steering_Motor_Flat : 0|10@1+ (32,0) [0|1000] "" XXX + SG_ Steer_Torque_Output : 16|11@1- (-32,0) [-1000|1000] "" XXX + SG_ Steer_Error_1 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Steer_Torque_Sensor : 29|11@1- (-1,0) [-1000|1000] "" XXX + SG_ Steering_Angle : 40|16@1- (-0.033,0) [-600|600] "" XXX + +CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage"; +CM_ SG_ 358 Cruise_Fault "No engagement until restart"; +CM_ SG_ 358 Car_Follow "lead car detected"; diff --git a/artifacts/package_runtime/iqdbc/dbc/tesla_can.dbc b/artifacts/package_runtime/iqdbc/dbc/tesla_can.dbc new file mode 100644 index 000000000..56624c3e5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/tesla_can.dbc @@ -0,0 +1,901 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: + NEO + MCU + GTW + EPAS + DI + ESP + SBW + STW + APP + DAS + XXX + +VAL_TABLE_ StW_AnglHP_Spd 16383 "SNA" ; +VAL_TABLE_ DI_aebFaultReason 15 "DI_AEB_FAULT_DAS_REQ_DI_UNAVAIL" 14 "DI_AEB_FAULT_ACCEL_REQ_INVALID" 13 "DI_AEB_FAULT_MIN_TIME_BTWN_EVENTS" 12 "DI_AEB_FAULT_ESP_MIA" 11 "DI_AEB_FAULT_ESP_FAULT" 10 "DI_AEB_FAULT_EPB_NOT_PARKED" 9 "DI_AEB_FAULT_ACCEL_OUT_OF_BOUNDS" 8 "DI_AEB_FAULT_PM_REQUEST" 7 "DI_AEB_FAULT_VEL_EST_ABNORMAL" 6 "DI_AEB_FAULT_DAS_SNA" 5 "DI_AEB_FAULT_DAS_CONTROL_MIA" 4 "DI_AEB_FAULT_SPEED_DELTA" 3 "DI_AEB_FAULT_EBR_FAULT" 2 "DI_AEB_FAULT_PM_MIA" 1 "DI_AEB_FAULT_EPB_MIA" 0 "DI_AEB_FAULT_NONE" ; +VAL_TABLE_ DI_aebLockState 3 "AEB_LOCK_STATE_SNA" 2 "AEB_LOCK_STATE_UNUSED" 1 "AEB_LOCK_STATE_UNLOCKED" 0 "AEB_LOCK_STATE_LOCKED" ; +VAL_TABLE_ DI_aebSmState 7 "DI_AEB_STATE_FAULT" 6 "DI_AEB_STATE_EXIT" 5 "DI_AEB_STATE_STANDSTILL" 4 "DI_AEB_STATE_STOPPING" 3 "DI_AEB_STATE_ENABLE" 2 "DI_AEB_STATE_ENABLE_INIT" 1 "DI_AEB_STATE_STANDBY" 0 "DI_AEB_STATE_UNAVAILABLE" ; +VAL_TABLE_ DI_aebState 7 "AEB_CAN_STATE_SNA" 4 "AEB_CAN_STATE_FAULT" 3 "AEB_CAN_STATE_STANDSTILL" 2 "AEB_CAN_STATE_ENABLED" 1 "AEB_CAN_STATE_STANDBY" 0 "AEB_CAN_STATE_UNAVAILABLE" ; +VAL_TABLE_ DI_epbInterfaceReady 1 "EPB_INTERFACE_READY" 0 "EPB_INTERFACE_NOT_READY" ; +VAL_TABLE_ DI_gear 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ; +VAL_TABLE_ DI_gpoReason 8 "DI_GPO_NUMREASONS" 7 "DI_GPO_CAPACITOR_OVERTEMP" 6 "DI_GPO_NOT_ENOUGH_12V" 5 "DI_GPO_NO_BATTERY_POWER" 4 "DI_GPO_AMBIENT_OVERTEMP" 3 "DI_GPO_FLUID_DELTAT" 2 "DI_GPO_STATOR_OVERTEMP" 1 "DI_GPO_HEATSINK_OVERTEMP" 0 "DI_GPO_OUTLET_OVERTEMP" ; +VAL_TABLE_ DI_immobilizerCondition 1 "DI_IMM_CONDITION_LEARNED" 0 "DI_IMM_CONDITION_VIRGIN_SNA" ; +VAL_TABLE_ DI_immobilizerState 7 "DI_IMM_STATE_FAULT" 6 "DI_IMM_STATE_FAULTRETRY" 5 "DI_IMM_STATE_RESET" 4 "DI_IMM_STATE_LEARN" 3 "DI_IMM_STATE_DISARMED" 2 "DI_IMM_STATE_AUTHENTICATING" 1 "DI_IMM_STATE_REQUEST" 0 "DI_IMM_STATE_INIT_SNA" ; +VAL_TABLE_ DI_limpReason 24 "DI_LIMP_NUMREASONS" 23 "DI_LIMP_CAPACITOR_OVERTEMP" 22 "DI_LIMP_GTW_MIA" 21 "DI_LIMP_TRQCMD_VALIDITY_UNKNOWN" 20 "DI_LIMP_DI_MIA" 19 "DI_LIMP_CONFIG_MISMATCH" 18 "DI_LIMP_HEATSINK_TEMP" 17 "DI_LIMP_PMREQUEST" 16 "DI_LIMP_PMHEARTBEAT" 15 "DI_LIMP_TRQ_CROSS_CHECK" 14 "DI_LIMP_EXTERNAL_COMMAND" 13 "DI_LIMP_WRONG_CS_CALIBRATION" 12 "DI_LIMP_STATOR_TEMP" 11 "DI_LIMP_DELTAT_TOO_NEGATIVE" 10 "DI_LIMP_DELTAT_TOO_POSITIVE" 9 "DI_LIMP_AMBIENT_TEMP" 8 "DI_LIMP_OUTLET_TEMP" 7 "DI_LIMP_LOW_FLOW" 6 "DI_LIMP_BMS_MIA" 5 "DI_LIMP_12V_SUPPLY_UNDERVOLTAGE" 4 "DI_LIMP_NO_FLUID" 3 "DI_LIMP_NO_FUNC_HEATSINK_SENSOR" 2 "DI_LIMP_NO_FUNC_STATORT_SENSOR" 1 "DI_LIMP_BUSV_SENSOR_IRRATIONAL" 0 "DI_LIMP_PHASE_IMBALANCE" ; +VAL_TABLE_ DI_mode 2 "DI_MODE_DYNO" 1 "DI_MODE_DRIVE" 0 "DI_MODE_UNDEF" ; +VAL_TABLE_ DI_motorType 14 "DI_MOTOR_F2AE" 13 "DI_MOTOR_F2AD" 12 "DI_MOTOR_F2AC" 11 "DI_MOTOR_F2AB" 10 "DI_MOTOR_F1AC" 9 "DI_MOTOR_SSR1A" 8 "DI_MOTOR_F1A" 7 "DI_MOTOR_M7M6" 6 "DI_MOTOR_M8A" 5 "DI_MOTOR_M7M5" 4 "DI_MOTOR_M7M4" 3 "DI_MOTOR_M7M3" 2 "DI_MOTOR_ROADSTER_SPORT" 1 "DI_MOTOR_ROADSTER_BASE" 0 "DI_MOTOR_SNA" ; +VAL_TABLE_ DI_speedUnits 1 "DI_SPEED_KPH" 0 "DI_SPEED_MPH" ; +VAL_TABLE_ DI_state 4 "DI_STATE_ENABLE" 3 "DI_STATE_FAULT" 2 "DI_STATE_CLEAR_FAULT" 1 "DI_STATE_STANDBY" 0 "DI_STATE_PREAUTH" ; +VAL_TABLE_ DI_velocityEstimatorState 4 "VE_STATE_BACKUP_MOTOR" 3 "VE_STATE_BACKUP_WHEELS_B" 2 "VE_STATE_BACKUP_WHEELS_A" 1 "VE_STATE_WHEELS_NORMAL" 0 "VE_STATE_NOT_INITIALIZED" ; + + +BO_ 1160 DAS_steeringControl: 4 NEO + SG_ DAS_steeringControlType : 23|2@0+ (1,0) [0|0] "" EPAS + SG_ DAS_steeringControlChecksum : 31|8@0+ (1,0) [0|0] "" EPAS + SG_ DAS_steeringControlCounter : 19|4@0+ (1,0) [0|0] "" EPAS + SG_ DAS_steeringAngleRequest : 6|15@0+ (0.1,-1638.35) [-1638.35|1638.35] "deg" EPAS + SG_ DAS_steeringHapticRequest : 7|1@0+ (1,0) [0|0] "" EPAS + +BO_ 697 DAS_control: 8 NEO + SG_ DAS_setSpeed : 0|12@1+ (0.1,0) [0|409.4] "kph" NEO + SG_ DAS_accState : 12|4@1+ (1,0) [0|0] "" NEO + SG_ DAS_aebEvent : 16|2@1+ (1,0) [0|3] "" NEO + SG_ DAS_jerkMin : 18|9@1+ (0.03,-15.232) [-15.232|0.098] "m/s^3" NEO + SG_ DAS_jerkMax : 27|8@1+ (0.059,0) [0|15.045] "m/s^3" NEO + SG_ DAS_accelMin : 35|9@1+ (0.04,-15) [-15|5.44] "m/s^2" NEO + SG_ DAS_accelMax : 44|9@1+ (0.04,-15) [-15|5.44] "m/s^2" NEO + SG_ DAS_controlCounter : 53|3@1+ (1,0) [0|0] "" NEO + SG_ DAS_controlChecksum : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 521 DAS_longControl: 8 NEO + SG_ DAS_locMode : 0|2@1+ (1,0) [0|0] "" NEO + SG_ DAS_locState : 2|3@1+ (1,0) [0|0] "" NEO + SG_ DAS_locRequest : 5|3@1+ (1,0) [0|0] "" NEO + SG_ DAS_locJerkMin : 8|8@1+ (0.034,-8.67) [-8.67|0] "m/s^3" NEO + SG_ DAS_locJerkMax : 16|8@1+ (0.034,0) [0|8.67] "m/s^3" NEO + SG_ DAS_locSpeed : 24|11@1+ (0.1,0) [0|204.7] "kph" NEO + SG_ DAS_locAccelMin : 35|9@1+ (0.04,-15) [-15|5.44] "m/s^2" NEO + SG_ DAS_locAccelMax : 44|9@1+ (0.04,-15) [-15|5.44] "m/s^2" NEO + SG_ DAS_longControlCounter : 53|3@1+ (1,0) [0|0] "" NEO + SG_ DAS_longControlChecksum : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 569 DAS_lanes: 8 NEO + SG_ DAS_leftLaneExists : 0|1@1+ (1,0) [0|0] "" NEO + SG_ DAS_rightLaneExists : 1|1@1+ (1,0) [0|0] "" NEO + SG_ DAS_virtualLaneWidth : 4|4@1+ (0.3125,2) [2|7] "m" NEO + SG_ DAS_virtualLaneViewRange : 8|8@1+ (1,0) [0|160] "m" NEO + SG_ DAS_virtualLaneC0 : 16|8@1+ (0.035,-3.5) [-3.5|3.5] "m" NEO + SG_ DAS_virtualLaneC1 : 24|8@1+ (0.0016,-0.2) [-0.2|0.2] "rad" NEO + SG_ DAS_virtualLaneC2 : 32|8@1+ (2E-05,-0.0025) [-0.0025|0.0025] "m-1" NEO + SG_ DAS_virtualLaneC3 : 40|8@1+ (2.4E-07,-3E-05) [-3E-05|3E-05] "m-2" NEO + SG_ DAS_leftLineUsage : 48|2@1+ (1,0) [0|3] "" NEO + SG_ DAS_rightLineUsage : 50|2@1+ (1,0) [0|3] "" NEO + SG_ DAS_leftFork : 52|2@1+ (1,0) [0|3] "" NEO + SG_ DAS_rightFork : 54|2@1+ (1,0) [0|3] "" NEO + SG_ DAS_lanesCounter : 60|4@1+ (1,0) [0|0] "" NEO + +BO_ 257 GTW_epasControl: 3 NEO + SG_ GTW_epasControlChecksum : 23|8@0+ (1,0) [0|255] "" NEO + SG_ GTW_epasControlCounter : 11|4@0+ (1,0) [0|15] "" NEO + SG_ GTW_epasControlType : 15|2@0+ (1,0) [-1|4] "" NEO + SG_ GTW_epasEmergencyOn : 7|1@0+ (1,0) [-1|2] "" NEO + SG_ GTW_epasLDWEnabled : 12|1@0+ (1,0) [-1|2] "" NEO + SG_ GTW_epasPowerMode : 6|4@0+ (1,0) [4|14] "" NEO + SG_ GTW_epasTuneRequest : 2|3@0+ (1,0) [-1|8] "" NEO + +BO_ 880 EPAS_sysStatus: 8 EPAS + SG_ EPAS_currentTuneMode : 7|4@0+ (1,0) [8|15] "" NEO + SG_ EPAS_eacErrorCode : 23|4@0+ (1,0) [-1|16] "" NEO + SG_ EPAS_eacStatus : 55|3@0+ (1,0) [5|7] "" NEO + SG_ EPAS_handsOnLevel : 39|2@0+ (1,0) [-1|4] "" NEO + SG_ EPAS_internalSAS : 37|14@0+ (0.1,-819.200012) [0|0] "deg" NEO + SG_ EPAS_steeringFault : 2|1@0+ (1,0) [-1|2] "" NEO + SG_ EPAS_steeringRackForce : 1|10@0+ (50,-25575) [0|0] "N" NEO + SG_ EPAS_steeringReduced : 3|1@0+ (1,0) [-1|2] "" NEO + SG_ EPAS_sysStatusChecksum : 63|8@0+ (1,0) [0|255] "" NEO + SG_ EPAS_sysStatusCounter : 51|4@0+ (1,0) [0|15] "" NEO + SG_ EPAS_torsionBarTorque : 19|12@0+ (0.01,-20.5) [0|0] "Nm" NEO + +BO_ 305 EPAS3P_sysStatus: 8 NEO + SG_ EPAS_currentTuneMode : 7|4@0+ (1,0) [0|0] "" NEO + SG_ EPAS_eacErrorCode : 23|4@0+ (1,0) [0|15] "" NEO + SG_ EPAS_eacStatus : 55|3@0+ (1,0) [0|7] "" NEO + SG_ EPAS_handsOnLevel : 39|2@0+ (1,0) [0|3] "" NEO + SG_ EPAS_internalSAS : 37|14@0+ (0.1,-819.2) [-819.2|819] "deg" NEO + SG_ EPAS_steeringFault : 2|1@0+ (1,0) [0|1] "" NEO + SG_ EPAS_steeringRackForce : 1|10@0+ (50,-25575) [-25575|25575] "N" NEO + SG_ EPAS_steeringReduced : 3|1@0+ (1,0) [0|1] "" NEO + SG_ EPAS_sysStatusChecksum : 63|8@0+ (1,0) [0|255] "" NEO + SG_ EPAS_sysStatusCounter : 51|4@0+ (1,0) [0|15] "" NEO + SG_ EPAS_torsionBarTorque : 19|12@0+ (0.01,-20.5) [-20.5|20.45] "Nm" NEO + +BO_ 3 STW_ANGL_STAT: 8 STW + SG_ StW_Angl : 5|14@0+ (0.5,-2048) [0|0] "deg" NEO + SG_ StW_AnglSpd : 21|14@0+ (0.5,-2048) [0|0] "/s" NEO + SG_ StW_AnglSens_Stat : 33|2@0+ (1,0) [-1|4] "" NEO + SG_ StW_AnglSens_Id : 35|2@0+ (1,0) [3|3] "" NEO + SG_ MC_STW_ANGL_STAT : 55|4@0+ (1,0) [0|15] "" NEO + SG_ CRC_STW_ANGL_STAT : 63|8@0+ (1,0) [0|255] "" NEO + +BO_ 14 STW_ANGLHP_STAT: 8 STW + SG_ StW_AnglHP : 5|14@0+ (0.1,-819.2) [-819.2|819] "deg" NEO + SG_ StW_AnglHP_Spd : 21|14@0+ (0.5,-4096) [-4096|4095.5] "deg/s" NEO + SG_ StW_AnglHP_Sens_Stat : 33|2@0+ (1,0) [0|0] "" NEO + SG_ StW_AnglHP_Sens_Id : 35|2@0+ (1,0) [0|0] "" NEO + SG_ MC_STW_ANGLHP_STAT : 55|4@0+ (1,0) [0|15] "" NEO + SG_ CRC_STW_ANGLHP_STAT : 63|8@0+ (1,0) [0|0] "" NEO + +BO_ 264 DI_torque1: 8 DI + SG_ DI_torqueDriver : 0|13@1- (0.25,0) [-750|750] "Nm" NEO + SG_ DI_torque1Counter : 13|3@1+ (1,0) [0|0] "" NEO + SG_ DI_torqueMotor : 16|13@1- (0.25,0) [-750|750] "Nm" NEO + SG_ DI_soptState : 29|3@1+ (1,0) [0|0] "" NEO + SG_ DI_motorRPM : 32|16@1- (1,0) [-17000|17000] "RPM" NEO + SG_ DI_pedalPos : 48|8@1+ (0.4,0) [0|100] "%" NEO + SG_ DI_torque1Checksum : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 280 DI_torque2: 6 DI + SG_ DI_torqueEstimate : 0|12@1- (0.5,0) [-750|750] "Nm" NEO + SG_ DI_gear : 12|3@1+ (1,0) [0|0] "" NEO + SG_ DI_brakePedal : 15|1@1+ (1,0) [0|0] "" NEO + SG_ DI_vehicleSpeed : 16|12@1+ (0.05,-25) [-25|179.75] "MPH" NEO + SG_ DI_gearRequest : 28|3@1+ (1,0) [0|0] "" NEO + SG_ DI_torqueInterfaceFailure : 31|1@1+ (1,0) [0|0] "" NEO + SG_ DI_torque2Counter : 32|4@1+ (1,0) [0|0] "" NEO + SG_ DI_brakePedalState : 36|2@1+ (1,0) [0|0] "" NEO + SG_ DI_epbParkRequest : 38|1@1+ (1,0) [0|0] "" NEO + SG_ DI_epbInterfaceReady : 39|1@1+ (1,0) [0|0] "" NEO + SG_ DI_torque2Checksum : 40|8@1+ (1,0) [0|0] "" NEO + +BO_ 309 ESP_135h: 5 ESP + SG_ ESP_135hChecksum : 23|8@0+ (1,0) [0|255] "" NEO + SG_ ESP_135hCounter : 11|4@0+ (1,0) [0|15] "" NEO + SG_ ESP_absBrakeEvent : 2|1@0+ (1,0) [-1|2] "" NEO + SG_ ESP_brakeDiscWipingActive : 4|1@0+ (1,0) [-1|2] "" NEO + SG_ ESP_brakeLamp : 3|1@0+ (1,0) [-1|2] "" NEO + SG_ ESP_espFaultLamp : 6|1@0+ (1,0) [-1|2] "" NEO + SG_ ESP_espLampFlash : 7|1@0+ (1,0) [-1|2] "" NEO + SG_ ESP_hillStartAssistActive : 1|2@0+ (1,0) [-1|4] "" NEO + SG_ ESP_messagePumpService : 24|1@0+ (1,0) [0|1] "" NEO + SG_ ESP_messagePumpFailure : 25|1@0+ (1,0) [0|1] "" NEO + SG_ ESP_messageEBDFailure : 26|1@0+ (1,0) [0|1] "" NEO + SG_ ESP_absFaultLamp : 27|1@0+ (1,0) [-1|2] "" NEO + SG_ ESP_tcDisabledByFault : 28|1@0+ (1,0) [0|1] "" NEO + SG_ ESP_messageDynoModeActive : 29|1@0+ (1,0) [0|1] "" NEO + SG_ ESP_hydraulicBoostEnabled : 30|1@0+ (1,0) [0|1] "" NEO + SG_ ESP_espOffLamp : 31|1@0+ (1,0) [-1|2] "" NEO + SG_ ESP_stabilityControlSts : 14|3@0+ (1,0) [6|7] "" NEO + SG_ ESP_tcLampFlash : 5|1@0+ (1,0) [-1|2] "" NEO + SG_ ESP_tcOffLamp : 15|1@0+ (1,0) [0|1] "" NEO + +BO_ 341 ESP_B: 8 ESP + SG_ ESP_BChecksum : 39|8@0+ (1,0) [0|255] "" NEO,EPAS + SG_ ESP_BCounter : 62|4@0+ (1,0) [1|15] "" NEO,EPAS + SG_ ESP_vehicleSpeed : 47|16@0+ (0.00999999978,0) [0|0] "kph" NEO,EPAS + SG_ ESP_vehicleSpeedQF : 57|2@0+ (1,0) [1|2] "" NEO,EPAS + SG_ ESP_wheelPulseCountFrL : 7|8@0+ (1,0) [0|254] "" NEO,EPAS + SG_ ESP_wheelPulseCountFrR : 15|8@0+ (1,0) [0|254] "" NEO,EPAS + SG_ ESP_wheelPulseCountReL : 23|8@0+ (1,0) [0|254] "" NEO,EPAS + SG_ ESP_wheelPulseCountReR : 31|8@0+ (1,0) [0|254] "" NEO,EPAS + +BO_ 513 SDM1: 5 GTW + SG_ SDM_bcklPassStatus : 3|2@0+ (1,0) [0|3] "" NEO + SG_ SDM_bcklDrivStatus : 5|2@0+ (1,0) [0|3] "" NEO + +BO_ 532 EPB_epasControl: 3 EPB + SG_ EPB_epasControlChecksum : 23|8@0+ (1,0) [0|255] "" NEO,EPAS + SG_ EPB_epasControlCounter : 11|4@0+ (1,0) [0|15] "" NEO,EPAS + SG_ EPB_epasEACAllow : 2|3@0+ (1,0) [4|7] "" NEO,EPAS + +BO_ 792 GTW_carState: 8 GTW + SG_ YEAR : 0|7@1+ (1,2000) [2000|2127] "Year" NEO + SG_ CERRD : 7|1@1+ (1,0) [0|1] "" NEO + SG_ MONTH : 8|4@1+ (1,0) [1|12] "Month" NEO + SG_ DOOR_STATE_FL : 12|2@1+ (1,0) [0|3] "" NEO + SG_ DOOR_STATE_FR : 14|2@1+ (1,0) [0|3] "" NEO + SG_ SECOND : 16|6@1+ (1,0) [0|59] "s" NEO + SG_ DOOR_STATE_RL : 22|2@1+ (1,0) [0|3] "" NEO + SG_ Hour : 24|5@1+ (1,0) [0|23] "h" NEO + SG_ DOOR_STATE_RR : 29|2@1+ (1,0) [0|3] "" NEO + SG_ DAY : 32|5@1+ (1,0) [0|31] "" NEO + SG_ MINUTE : 40|6@1+ (1,0) [0|59] "min" NEO + SG_ BOOT_STATE : 46|2@1+ (1,0) [0|3] "" NEO + SG_ GTW_updateInProgress : 48|2@1+ (1,0) [0|3] "" NEO + SG_ DOOR_STATE_FrontTrunk : 50|2@1+ (1,0) [0|3] "" NEO + SG_ MCU_factoryMode : 52|1@1+ (1,0) [0|1] "" NEO + SG_ MCU_transportModeOn : 53|1@0+ (1,0) [0|1] "" NEO + SG_ BC_headLightLStatus : 55|2@0+ (1,0) [0|3] "" NEO + SG_ BC_headLightRStatus : 57|2@0+ (1,0) [0|3] "" NEO + SG_ BC_indicatorLStatus : 59|2@0+ (1,0) [0|3] "" NEO + SG_ BC_indicatorRStatus : 61|2@0+ (1,0) [0|3] "" NEO + +BO_ 872 DI_state: 8 DI + SG_ DI_systemState : 0|3@1+ (1,0) [0|0] "" NEO + SG_ DI_vehicleHoldState : 3|3@1+ (1,0) [0|0] "" NEO + SG_ DI_proximity : 6|1@1+ (1,0) [0|0] "" NEO + SG_ DI_driveReady : 7|1@1+ (1,0) [0|0] "" NEO + SG_ DI_regenLight : 8|1@1+ (1,0) [0|0] "" NEO + SG_ DI_state : 9|3@1+ (1,0) [0|0] "" NEO + SG_ DI_cruiseState : 12|4@1+ (1,0) [0|0] "" NEO + SG_ DI_analogSpeed : 16|12@1+ (0.1,0) [0|150] "speed" NEO + SG_ DI_immobilizerState : 28|3@1+ (1,0) [0|0] "" NEO + SG_ DI_speedUnits : 31|1@1+ (1,0) [0|1] "" NEO + SG_ DI_cruiseSet : 32|9@1+ (0.5,0) [0|255.5] "speed" NEO + SG_ DI_aebState : 41|3@1+ (1,0) [0|0] "" NEO + SG_ DI_stateCounter : 44|4@1+ (1,0) [0|0] "" NEO + SG_ DI_digitalSpeed : 48|8@1+ (1,0) [0|250] "" NEO + SG_ DI_stateChecksum : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 109 SBW_RQ_SCCM: 4 STW + SG_ StW_Sw_Stat3 : 0|3@1+ (1,0) [0|0] "" NEO + SG_ MsgTxmtId : 6|2@1+ (1,0) [0|0] "" NEO + SG_ TSL_RND_Posn_StW : 8|4@1+ (1,0) [0|0] "" NEO + SG_ TSL_P_Psd_StW : 12|2@1+ (1,0) [0|0] "" NEO + SG_ MC_SBW_RQ_SCCM : 20|4@1+ (1,0) [0|15] "" NEO + SG_ CRC_SBW_RQ_SCCM : 24|8@1+ (1,0) [0|0] "" NEO + +BO_ 69 STW_ACTN_RQ: 8 STW + SG_ SpdCtrlLvr_Stat : 0|6@1+ (1,0) [0|0] "" NEO + SG_ VSL_Enbl_Rq : 6|1@1+ (1,0) [0|0] "" NEO + SG_ SpdCtrlLvrStat_Inv : 7|1@1+ (1,0) [0|0] "" NEO + SG_ DTR_Dist_Rq : 8|8@1+ (1,0) [0|200] "" NEO + SG_ TurnIndLvr_Stat : 16|2@1+ (1,0) [0|0] "" NEO + SG_ HiBmLvr_Stat : 18|2@1+ (1,0) [0|0] "" NEO + SG_ WprWashSw_Psd : 20|2@1+ (1,0) [0|0] "" NEO + SG_ WprWash_R_Sw_Posn_V2 : 22|2@1+ (1,0) [0|0] "" NEO + SG_ StW_Lvr_Stat : 24|3@1+ (1,0) [0|0] "" NEO + SG_ StW_Cond_Flt : 27|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Cond_Psd : 28|2@1+ (1,0) [0|0] "" NEO + SG_ HrnSw_Psd : 30|2@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw00_Psd : 32|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw01_Psd : 33|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw02_Psd : 34|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw03_Psd : 35|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw04_Psd : 36|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw05_Psd : 37|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw06_Psd : 38|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw07_Psd : 39|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw08_Psd : 40|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw09_Psd : 41|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw10_Psd : 42|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw11_Psd : 43|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw12_Psd : 44|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw13_Psd : 45|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw14_Psd : 46|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw15_Psd : 47|1@1+ (1,0) [0|0] "" NEO + SG_ WprSw6Posn : 48|3@1+ (1,0) [0|0] "" NEO + SG_ MC_STW_ACTN_RQ : 52|4@1+ (1,0) [0|15] "" NEO + SG_ CRC_STW_ACTN_RQ : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 643 BODY_R1: 8 GTW + SG_ AirTemp_Insd : 47|8@0+ (0.25,0) [0|63.5] "C" NEO + SG_ AirTemp_Outsd : 63|8@0+ (0.5,-40) [-40|86.5] "C" NEO + SG_ Bckl_Sw_RL_Stat_SAM_R : 49|2@0+ (1,0) [-1|4] "" NEO + SG_ Bckl_Sw_RM_Stat_SAM_R : 53|2@0+ (1,0) [-1|4] "" NEO + SG_ Bckl_Sw_RR_Stat_SAM_R : 51|2@0+ (1,0) [-1|4] "" NEO + SG_ DL_RLtch_Stat : 9|2@0+ (1,0) [-1|4] "" NEO + SG_ DrRLtch_FL_Stat : 1|2@0+ (1,0) [-1|4] "" NEO + SG_ DrRLtch_FR_Stat : 3|2@0+ (1,0) [-1|4] "" NEO + SG_ DrRLtch_RL_Stat : 5|2@0+ (1,0) [-1|4] "" NEO + SG_ DrRLtch_RR_Stat : 7|2@0+ (1,0) [-1|4] "" NEO + SG_ EngHd_Stat : 11|2@0+ (1,0) [-1|4] "" NEO + SG_ LoBm_On_Rq : 32|1@0+ (1,0) [0|1] "" NEO + SG_ HiBm_On : 33|1@0+ (1,0) [0|1] "" NEO + SG_ Hrn_On : 26|1@0+ (1,0) [0|1] "" NEO + SG_ IrLmp_D_Lt_Flt : 34|1@0+ (1,0) [0|1] "" NEO + SG_ IrLmp_P_Rt_Flt : 35|1@0+ (1,0) [0|1] "" NEO + SG_ LgtSens_Twlgt : 18|3@0+ (1,0) [0|7] "Steps" NEO + SG_ LgtSens_SNA : 19|1@0+ (1,0) [0|1] "" NEO + SG_ LgtSens_Tunnel : 20|1@0+ (1,0) [0|1] "" NEO + SG_ LgtSens_Flt : 21|1@0+ (1,0) [0|1] "" NEO + SG_ LgtSens_Night : 22|1@0+ (1,0) [-1|2] "" NEO + SG_ ADL_LoBm_On_Rq : 23|1@0+ (1,0) [0|1] "" NEO + SG_ LoBm_D_Lt_Flt : 36|1@0+ (1,0) [0|1] "" NEO + SG_ LoBm_P_Rt_Flt : 37|1@0+ (1,0) [0|1] "" NEO + SG_ MPkBrk_Stat : 28|1@0+ (1,0) [-1|2] "" NEO + SG_ RevGr_Engg : 39|2@0+ (1,0) [-1|4] "" NEO + SG_ StW_Cond_Stat : 55|2@0+ (1,0) [-1|4] "" NEO + SG_ Term54_Actv : 27|1@0+ (1,0) [0|1] "" NEO + SG_ Trlr_Stat : 25|2@0+ (1,0) [-1|4] "" NEO + SG_ VTA_Alm_Actv : 13|1@0+ (1,0) [0|1] "" NEO + SG_ WprOutsdPkPosn : 29|1@0+ (1,0) [0|1] "" NEO + +BO_ 760 UI_gpsVehicleSpeed: 8 GTW + SG_ UI_gpsHDOP : 0|8@1+ (0.1,0) [0|25.5] "1" DAS + SG_ UI_gpsVehicleHeading : 8|16@1+ (0.0078125,0) [0|511.9921875] "deg" DAS + SG_ UI_gpsVehicleSpeed : 24|16@1+ (0.00390625,0) [0|250.996] "km/hr" Vector__XXX + SG_ UI_userSpeedOffset : 40|6@1+ (1,-30) [-30|33] "kph/mph" DAS + SG_ UI_mapSpeedLimitUnits : 46|1@1+ (1,0) [0|1] "" DAS + SG_ UI_userSpeedOffsetUnits : 47|1@1+ (1,0) [0|1] "" DAS + SG_ UI_mppSpeedLimit : 48|5@1+ (5,0) [0|155] "kph/mph" DAS + SG_ UI_gpsNmeaMIA : 53|1@1+ (1,0) [0|0] "" DAS + +BO_ 536 MCU_chassisControl: 8 GTW + SG_ MCU_dasDebugEnable : 0|1@1+ (1,0) [0|0] "" NEO + SG_ MCU_parkBrakeRequest : 1|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_trailerModeCH : 3|1@1+ (1,0) [0|0] "" NEO + SG_ MCU_fcwSensitivity : 4|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_fcwEnable : 6|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_latControlEnable : 8|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_accOvertakeEnable : 10|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_ldwEnable : 12|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_aebEnable : 14|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_bsdEnable : 16|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_ahlbEnable : 18|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_parkSetting : 20|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_pedalSafetyEnable : 22|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_frontDefrostReq_das : 24|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_autoParkRequest : 26|4@1+ (1,0) [0|0] "" NEO + SG_ MCU_redLightStopSignEnable : 30|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_enableCreepTorqueCH : 32|1@1+ (1,0) [0|0] "" NEO + SG_ MCU_narrowGarages : 33|1@1+ (1,0) [0|0] "" NEO + SG_ MCU_rebootAutopilot : 34|1@1+ (1,0) [0|0] "" NEO + SG_ MCU_enableAutowipers : 35|1@1+ (1,0) [0|0] "" NEO + SG_ MCU_overPaintedUSS : 38|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_selfParkTune : 40|4@1+ (1,0) [0|15] "" NEO + SG_ MCU_towModeEnable : 44|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_zeroSpeedConfirmed : 46|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_aesEnable : 48|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_autoLaneChangeEnable : 50|2@1+ (1,0) [0|0] "" NEO + SG_ MCU_chassisControlCounter : 52|4@1+ (1,0) [0|0] "" NEO + SG_ MCU_chassisControlChecksum : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 904 MCU_clusterBacklightRequest: 3 NEO + SG_ MCU_clusterBacklightOn : 7|1@1+ (1,0) [0|1] "" NEO + SG_ MCU_clusterBrightnessLevel : 8|8@1+ (0.5,0) [0|127.5] "%" NEO + SG_ MCU_clusterReadyForDrive : 6|1@1+ (1,0) [-1|2] "" NEO + SG_ MCU_clusterReadyForPowerOff : 5|1@1+ (1,0) [0|1] "" NEO + +BO_ 984 MCU_locationStatus: 8 MCU + SG_ MCU_gpsAccuracy : 57|7@1+ (0.2,0) [0|0] "m" NEO + SG_ MCU_latitude : 0|28@1- (1E-06,0) [0|0] "deg" NEO + SG_ MCU_longitude : 28|29@1- (1E-06,0) [0|0] "deg" NEO + +BO_ 104 MCU_locationStatus2: 8 MCU + SG_ MCU_elevation : 0|32@1- (0.1,0) [0|0] "m" GTW + SG_ MCU_navigonExpectedSpeed : 32|7@1+ (1,0) [0|126] "mph" GTW + +BO_ 840 GTW_status: 8 GTW + SG_ GTW_accGoingDown : 6|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_accRailReq : 8|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_brakePressed : 1|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_driveGoingDown : 7|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_driveRailReq : 0|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_driverIsLeaving : 5|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_driverPresent : 2|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_hvacGoingDown : 11|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_hvacRailReq : 9|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_icPowerOff : 4|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_notEnough12VForDrive : 3|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_preconditionRequest : 10|1@0+ (1,0) [0|1] "" NEO + SG_ GTW_statusChecksum : 63|8@0+ (1,0) [0|255] "" NEO + SG_ GTW_statusCounter : 51|4@0+ (1,0) [0|15] "" NEO + +BO_ 920 GTW_carConfig: 8 GTW + SG_ GTW_performanceConfig : 2|3@0+ (1,0) [0|0] "" NEO + SG_ GTW_fourWheelDrive : 4|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_unknown1 : 5|1@0+ (1,0) [0|0] "" NEO + SG_ GTW_dasHw : 7|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_parkAssistInstalled : 9|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_forwardRadarHw : 11|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_airSuspensionInstalled : 14|3@0+ (1,0) [0|0] "" NEO + SG_ GTW_unknown2 : 15|1@0+ (1,0) [0|0] "" NEO + SG_ GTW_country : 23|16@0+ (1,0) [0|0] "" NEO + SG_ GTW_parkSensorGeometryType : 33|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_rhd : 34|1@0+ (1,0) [0|0] "" NEO + SG_ GTW_bodyControlsType : 35|1@0+ (1,0) [0|0] "" NEO + SG_ GTW_radarPosition : 39|4@0+ (1,0) [0|0] "" NEO + SG_ GTW_rearCornerRadarHw : 41|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_frontCornerRadarHw : 43|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_epasType : 45|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_chassisType : 47|2@0+ (1,0) [0|2] "" NEO + SG_ GTW_wheelType : 52|5@0+ (1,0) [0|0] "" NEO + SG_ GTW_rearSeatControllerMask : 55|3@0+ (1,0) [0|7] "" NEO + SG_ GTW_euVehicle : 56|1@0+ (1,0) [0|0] "" NEO + SG_ GTW_foldingMirrorsInstalled : 57|1@0+ (1,0) [0|0] "" NEO + SG_ GTW_brakeHwType : 59|2@0+ (1,0) [0|2] "" NEO + SG_ GTW_autopilot : 61|2@0+ (1,0) [0|0] "" NEO + SG_ GTW_unknown3 : 63|2@0+ (1,0) [0|0] "" NEO + +BO_ 1006 UI_autopilotControl: 8 GTW + SG_ UI_autopilotControlIndex M : 0|3@1+ (1,0) [0|7] "" APP,APS + SG_ UI_hovEnabled m0 : 3|1@1+ (1,0) [0|0] "" APP,APS + SG_ UI_donDisableAutoWiperDuration m0 : 4|3@1+ (1,0) [0|0] "" APP,APS + SG_ UI_donDisableOnAutoWiperSpeed m0 : 7|4@1+ (1,0) [0|0] "" APP,APS + SG_ UI_blindspotMinSpeed m0 : 11|4@1+ (1,0) [0|0] "" APP,APS + SG_ UI_blindspotDistance m0 : 15|3@1+ (1,0) [0|0] "" APP,APS + SG_ UI_blindspotTTC m0 : 18|3@1+ (1,0) [0|0] "" APP,APS + SG_ UI_donStopEndOfRampBuffer m0 : 21|3@1+ (1,0) [0|0] "" APP,APS + SG_ UI_donDisableCutin m0 : 24|1@1+ (1,0) [0|0] "" APP,APS + SG_ UI_donMinGoreWidthForAbortMap m0 : 25|4@1+ (1,0) [0|0] "" APP,APS + SG_ UI_donAlcProgGoreAbortThres m0 : 29|4@1+ (1,0) [0|0] "" APP,APS + SG_ UI_donMinGoreWidthForAbortNotMap m0 : 33|4@1+ (1,0) [0|0] "" APP,APS + SG_ UI_alcDisableUltrasonicCheck m0 : 37|1@1+ (1,0) [0|0] "" APP,APS + SG_ UI_alcUltrasonicDistance m0 : 38|4@1+ (1,0) [0|0] "" APP,APS + SG_ UI_alcUltrasonicWaitTime m0 : 42|3@1+ (1,0) [0|0] "" APP,APS + SG_ UI_alcEgoLeadingReactionAccel m0 : 48|2@1+ (1,0) [0|0] "" APP,APS + SG_ UI_alcMergIntervalRearDHyst m0 : 50|2@1+ (1,0) [0|0] "" APP,APS + SG_ UI_alcMergingIntervalHeadwayHyst m0 : 52|2@1+ (1,0) [0|0] "" APP,APS + SG_ UI_alcAssertivenessRate m0 : 54|2@1+ (1,0) [0|0] "" APP,APS + SG_ UI_alcViewRangeSensitivity m0 : 56|2@1+ (1,0) [0|0] "" APP,APS + SG_ UI_camBlockLaneCheckDisable m1 : 3|1@1+ (1,0) [0|0] "" APP,APS + SG_ UI_camBlockLaneCheckThreshold m1 : 4|6@1+ (0.01587,0) [0|1] "%" APP,APS + SG_ UI_camBlockBlurDisable m1 : 10|1@1+ (1,0) [0|0] "" APP,APS + SG_ UI_camBlockBlurThreshold m1 : 11|6@1+ (0.01587,0) [0|1] "%" APP,APS + +BO_ 728 UI_csaOfframpCurvature: 8 GTW + SG_ UI_csaOfframpCurvC2 : 0|16@1- (1E-06,0) [-0.032768|0.032767] "1/m" DAS + SG_ UI_csaOfframpCurvC3 : 16|16@1- (4E-09,0) [-0.000131072|0.000131068] "1/m2" DAS + SG_ UI_csaOfframpCurvRange : 32|8@1+ (2,0) [0|510] "m" DAS + SG_ UI_csaOfframpCurvCounter : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ UI_csaOfframpCurvUsingTspline : 48|1@1+ (1,0) [0|1] "" DAS + SG_ UI_csaOfframpCurvReserved : 49|7@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_csaOfframpCurvChecksum : 56|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 744 UI_csaRoadCurvature: 8 GTW + SG_ UI_csaRoadCurvC2 : 0|16@1- (1E-06,0) [-0.032768|0.032767] "1/m" DAS + SG_ UI_csaRoadCurvC3 : 16|16@1- (4E-09,0) [-0.000131072|0.000131068] "1/m2" DAS + SG_ UI_csaRoadCurvRange : 32|8@1+ (2,0) [0|510] "m" DAS + SG_ UI_csaRoadCurvCounter : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ UI_csaRoadCurvUsingTspline : 48|1@1+ (1,0) [0|1] "" DAS + SG_ UI_csaRoadCurvReserved : 49|7@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_csaRoadCurvChecksum : 56|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 1080 UI_driverAssistAnonDebugParams: 8 GTW + SG_ UI_anonDebugParam1 : 0|7@1+ (1,0) [0|100] "" DAS + SG_ UI_anonDebugFlag1 : 7|1@1+ (1,0) [0|0] "" DAS + SG_ UI_anonDebugParam2 : 8|7@1+ (1,0) [0|100] "" DAS + SG_ UI_anonDebugFlag2 : 15|1@1+ (1,0) [0|0] "" DAS + SG_ UI_anonDebugParam3 : 16|7@1+ (1,0) [0|100] "" DAS + SG_ UI_anonDebugFlag3 : 23|1@1+ (1,0) [0|0] "" DAS + SG_ UI_anonDebugParam4 : 24|7@1+ (1,0) [0|100] "" DAS + SG_ UI_anonDebugFlag4 : 31|1@1+ (1,0) [0|0] "" DAS + SG_ UI_anonDebugParam5 : 32|7@1+ (1,0) [0|100] "" DAS + SG_ UI_anonDebugParam6 : 40|7@1+ (1,0) [0|100] "" DAS + SG_ UI_anonDebugParam7 : 48|7@1+ (1,0) [0|100] "" DAS + SG_ UI_visionSpeedSlider : 56|7@1+ (1,0) [0|100] "" DAS + +BO_ 1000 UI_driverAssistControl: 8 GTW + SG_ UI_autopilotControlRequest : 0|1@1+ (1,0) [1|0] "" DAS + SG_ UI_ulcStalkConfirm : 1|1@1+ (1,0) [1|0] "" DAS + SG_ UI_summonHeartbeat : 2|2@1+ (1,0) [0|0] "" DAS + SG_ UI_curvSpeedAdaptDisable : 4|1@1+ (1,0) [0|0] "" DAS + SG_ UI_dasDeveloper : 5|1@1+ (1,0) [0|0] "" DAS + SG_ UI_enableVinAssociation : 6|1@1+ (1,0) [0|0] "" DAS + SG_ UI_lssLkaEnabled : 7|1@1+ (1,0) [0|0] "" DAS + SG_ UI_lssLdwEnabled : 8|1@1+ (1,0) [0|0] "" DAS + SG_ UI_autoSummonEnable : 10|1@1+ (1,0) [0|1] "" DAS + SG_ UI_exceptionListEnable : 11|1@1+ (1,0) [0|1] "" APP + SG_ UI_roadCheckDisable : 12|1@1+ (1,0) [0|0] "" DAS + SG_ UI_driveOnMapsEnable : 13|1@1+ (1,0) [0|0] "" DAS + SG_ UI_handsOnRequirementDisable : 14|1@1+ (1,0) [0|0] "" DAS + SG_ UI_forksEnable : 15|1@1+ (1,0) [0|0] "" DAS + SG_ UI_fuseLanesDisable : 16|1@1+ (1,0) [0|0] "" DAS + SG_ UI_fuseHPPDisable : 17|1@1+ (1,0) [0|0] "" DAS + SG_ UI_fuseVehiclesDisable : 18|1@1+ (1,0) [0|0] "" DAS + SG_ UI_enableNextGenACC : 19|1@1+ (1,0) [0|1] "" APP + SG_ UI_visionSpeedType : 20|2@1+ (1,0) [0|0] "" APP + SG_ UI_curvatureDatabaseOnly : 22|1@1+ (1,0) [0|0] "" DAS + SG_ UI_lssElkEnabled : 23|1@1+ (1,0) [0|0] "" DAS + SG_ UI_summonExitType : 24|2@1+ (1,0) [0|3] "" DAS + SG_ UI_summonEntryType : 26|2@1+ (1,0) [0|3] "" DAS + SG_ UI_selfParkRequest : 28|4@1+ (1,0) [0|15] "" DAS,PARK + SG_ UI_summonReverseDist : 32|6@1+ (1,0) [0|63] "" DAS + SG_ UI_undertakeAssistEnable : 38|1@1+ (1,0) [0|0] "" DAS + SG_ UI_adaptiveSetSpeedEnable : 39|1@1+ (1,0) [0|0] "" DAS + SG_ UI_drivingSide : 40|2@1+ (1,0) [0|3] "" DAS + SG_ UI_enableClipTelemetry : 42|1@1+ (1,0) [0|0] "" APP + SG_ UI_enableTripTelemetry : 43|1@1+ (1,0) [0|0] "" APP + SG_ UI_enableRoadSegmentTelemetry : 44|1@1+ (1,0) [0|0] "" APP + SG_ UI_followNavRouteEnable : 46|1@1+ (1,0) [0|0] "" APP + SG_ UI_ulcSpeedConfig : 48|2@1+ (1,0) [0|3] "" APP + SG_ UI_ulcBlindSpotConfig : 50|2@1+ (1,0) [0|3] "" APP + SG_ UI_autopilotAlwaysOn : 52|1@1+ (1,0) [0|1] "" APP + SG_ UI_accFromZero : 53|1@1+ (1,0) [0|1] "" APP + SG_ UI_alcOffHighwayEnable : 54|1@1+ (1,0) [0|1] "" APP + SG_ UI_validationLoop : 55|1@1+ (1,0) [0|1] "" APP + SG_ UI_ulcOffHighway : 56|1@1+ (1,0) [0|1] "" APP + SG_ UI_enableNavRouteCSA : 57|1@1+ (1,0) [0|1] "" APP + SG_ UI_enableCutinExperiments : 58|1@1+ (1,0) [0|1] "" APP + SG_ UI_source3D : 60|3@1+ (1,0) [0|7] "" APP + SG_ UI_enableVisionOnlyStops : 63|1@1+ (1,0) [0|1] "" APP + +BO_ 968 UI_driverAssistMapData: 8 GTW + SG_ UI_mapSpeedLimitDependency : 0|3@1+ (1,0) [0|0] "" DAS + SG_ UI_roadClass : 3|3@1+ (1,0) [0|0] "" DAS + SG_ UI_inSuperchargerGeofence : 6|1@1+ (1,0) [0|0] "" DAS + SG_ UI_mapSpeedUnits : 7|1@1+ (1,0) [0|0] "" DAS + SG_ UI_mapSpeedLimit : 8|5@1+ (1,0) [0|0] "" DAS + SG_ UI_mapSpeedLimitType : 13|3@1+ (1,0) [0|0] "" DAS + SG_ UI_countryCode : 16|10@1+ (1,0) [0|0] "" DAS + SG_ UI_streetCount : 26|2@1+ (1,0) [0|0] "" DAS + SG_ UI_gpsRoadMatch : 28|1@1+ (1,0) [0|0] "" DAS + SG_ UI_navRouteActive : 29|1@1+ (1,0) [0|0] "" DAS + SG_ UI_parallelAutoparkEnabled : 30|1@1+ (1,0) [0|1] "" DAS + SG_ UI_perpendicularAutoparkEnabled : 31|1@1+ (1,0) [0|1] "" DAS + SG_ UI_nextBranchDist : 32|5@1+ (10,0) [0|300] "m" DAS + SG_ UI_controlledAccess : 37|1@1+ (1,0) [0|0] "" DAS + SG_ UI_nextBranchLeftOffRamp : 38|1@1+ (1,0) [0|0] "" DAS + SG_ UI_nextBranchRightOffRamp : 39|1@1+ (1,0) [0|0] "" DAS + SG_ UI_rejectLeftLane : 40|1@1+ (1,0) [0|0] "" DAS + SG_ UI_rejectRightLane : 41|1@1+ (1,0) [0|0] "" DAS + SG_ UI_rejectHPP : 42|1@1+ (1,0) [0|0] "" DAS + SG_ UI_rejectNav : 43|1@1+ (1,0) [0|0] "" DAS + SG_ UI_rejectLeftFreeSpace : 44|1@1+ (1,0) [0|0] "" DAS + SG_ UI_rejectRightFreeSpace : 45|1@1+ (1,0) [0|0] "" DAS + SG_ UI_rejectAutosteer : 46|1@1+ (1,0) [0|0] "" DAS + SG_ UI_rejectHandsOn : 47|1@1+ (1,0) [0|0] "" DAS + SG_ UI_acceptBottsDots : 48|1@1+ (1,0) [0|0] "" DAS + SG_ UI_autosteerRestricted : 49|1@1+ (1,0) [0|0] "" DAS + SG_ UI_pmmEnabled : 50|1@1+ (1,0) [0|0] "" DAS + SG_ UI_scaEnabled : 51|1@1+ (1,0) [0|0] "" DAS + SG_ UI_mapDataCounter : 52|4@1+ (1,0) [0|0] "" DAS + SG_ UI_mapDataChecksum : 56|8@1+ (1,0) [0|0] "" DAS + +BO_ 568 UI_driverAssistRoadSign: 8 GTW + SG_ UI_roadSign M : 0|8@1+ (1,0) [0|0] "" DAS + SG_ UI_splineLocConfidence : 40|7@1+ (1,0) [0|100] "" DAS + SG_ UI_splineID : 48|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ UI_roadSignCounter : 52|4@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_roadSignChecksum : 56|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_dummyData m0 : 8|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_stopSignStopLineDist m1 : 8|10@1+ (0.25,-8) [-8|247.5] "m" Vector__XXX + SG_ UI_stopSignStopLineConf m1 : 18|7@1+ (1,0) [0|100] "" Vector__XXX + SG_ UI_trafficLightStopLineDist m2 : 8|10@1+ (0.25,-8) [-8|247.5] "m" Vector__XXX + SG_ UI_trafficLightStopLineConf m2 : 18|7@1+ (1,0) [0|100] "" Vector__XXX + SG_ UI_baseMapSpeedLimitMPS m3 : 8|8@1+ (0.25,0) [0|63.75] "m/s" DAS + SG_ UI_bottomQrtlFleetSpeedMPS m3 : 16|8@1+ (0.25,0) [0|63.75] "m/s" DAS + SG_ UI_topQrtlFleetSpeedMPS m3 : 24|8@1+ (0.25,0) [0|63.75] "m/s" DAS + SG_ UI_meanFleetSplineSpeedMPS m4 : 8|8@1+ (0.25,0) [0|63.75] "m/s" DAS + SG_ UI_medianFleetSpeedMPS m4 : 16|8@1+ (0.25,0) [0|63.75] "m/s" DAS + SG_ UI_meanFleetSplineAccelMPS2 m4 : 24|8@1+ (0.05,-6.35) [-6.35|6.4] "m/s^2" DAS + SG_ UI_rampType m4 : 32|3@1+ (1,0) [0|7] "" DAS + SG_ UI_currSplineIdFull m5 : 8|32@1+ (1,0) [0|1] "" APP + + +BO_ 696 UI_radarMapData: 8 GTW + SG_ UI_radarTargetDx : 0|8@1+ (1,-95) [-95|160] "m" DAS + SG_ UI_radarTargetDxEnd : 8|8@1+ (1,0) [0|255] "m" DAS + SG_ UI_radarTargetTrustMap : 16|1@1+ (1,0) [0|1] "" DAS + SG_ UI_radarEnableBraking : 17|1@1+ (1,0) [0|1] "" DAS + SG_ UI_radarMapDataCounter : 52|4@1+ (1,0) [0|0] "" DAS + SG_ UI_radarMapDataChecksum : 56|8@1+ (1,0) [0|0] "" DAS + +BO_ 712 UI_roadCurvature: 8 GTW + SG_ UI_roadCurvC0 : 0|11@1- (0.02,0) [-20.48|20.46] "m" DAS + SG_ UI_roadCurvC1 : 11|10@1- (0.00075,0) [-0.384|0.38325] "1" DAS + SG_ UI_roadCurvC2 : 21|14@1- (7.5E-06,0) [-0.03072|0.03071625] "1/m" DAS + SG_ UI_roadCurvC3 : 35|13@1- (3E-08,0) [-0.00012288|0.00012285] "1/m2" DAS + SG_ UI_roadCurvRange : 48|6@1+ (4,0) [0|252] "m" DAS + SG_ UI_roadCurvHealth : 54|2@1+ (1,0) [0|0] "" DAS + SG_ UI_roadCurvChecksum : 56|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 582 UI_solarData: 5 GTW + SG_ UI_solarAzimuthAngle : 0|16@1- (1,0) [0|360] "deg" APP + SG_ UI_solarAzimuthAngleCarRef : 16|9@1- (1,0) [-180|180] "deg" APP + SG_ UI_isSunUp : 25|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_solarElevationAngle : 32|8@1- (1,0) [-90|90] "deg" APP + +BO_ 824 UI_status: 8 GTW + SG_ UI_touchActive : 0|1@1+ (1,0) [0|0] "" IC + SG_ UI_audioActive : 1|1@1+ (1,0) [0|0] "" IC + SG_ UI_bluetoothActive : 2|1@1+ (1,0) [0|0] "" IC + SG_ UI_cellActive : 3|1@1+ (1,0) [0|0] "" IC + SG_ UI_displayReady : 4|1@1+ (1,0) [0|0] "" IC + SG_ UI_gpsActive : 5|1@1+ (1,0) [0|0] "" IC + SG_ UI_wifiConnected : 6|1@1+ (1,0) [0|0] "" IC,APP + SG_ UI_systemActive : 7|1@1+ (1,0) [0|0] "" IC + SG_ UI_xmActive : 8|1@1+ (1,0) [0|0] "" IC + SG_ UI_displayOn : 9|1@1+ (1,0) [0|0] "" IC,APP + SG_ UI_readyForDrive : 10|1@1+ (1,0) [0|0] "" IC + SG_ UI_cellConnected : 11|1@1+ (1,0) [0|0] "" IC,APP + SG_ UI_vpnActive : 12|1@1+ (1,0) [0|0] "" IC,APP + SG_ UI_wifiActive : 13|1@1+ (1,0) [0|0] "" IC + SG_ UI_cameraActive : 14|1@1+ (1,0) [0|0] "" IC,APP + SG_ UI_usbActive : 15|1@1+ (1,0) [0|0] "" IC + SG_ UI_screenshotActive : 16|1@1+ (1,0) [0|0] "" IC,APP + SG_ UI_monitorModemPower : 17|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_factoryReset : 18|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ UI_cellNetworkTechnology : 20|4@1+ (1,0) [0|15] "" APP + SG_ UI_tegraCoreTemperature : 24|8@1+ (1,-64) [0|0] "deg C" IC + SG_ UI_tegraAmbientTemperature : 32|8@1+ (1,-64) [0|0] "deg C" IC + SG_ UI_googleWifiUsages : 40|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_autopilotTrial : 48|2@1+ (1,0) [0|0] "" APP + SG_ UI_cellSignalBars : 50|3@1+ (1,0) [0|7] "" APP + SG_ UI_hardwareType : 53|2@1+ (1,0) [0|3] "" APP + SG_ UI_developmentCar : 55|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_cellReceiverPower : 56|8@1+ (1,-128) [-128|127] "dB" APP + +BO_ 1064 UI_telemetryControl: 8 GTW + SG_ UI_TCR_enable : 0|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_moveStateStanding : 1|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_moveStateStopped : 2|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_moveStateMoving : 3|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_moveStateIndeterm : 4|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_classConstElem : 5|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_classMovingPed : 6|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_classMovingTwoWheel : 7|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_classMovingFourWheel : 8|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_classUnknown : 9|1@1+ (1,0) [0|0] "" DAS + SG_ UI_TCR_downSampleFactor : 16|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ UI_TCR_wExist : 24|5@1+ (1,0) [0|31] "" Vector__XXX + SG_ UI_TCR_vehSpeed : 32|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ UI_TCR_minRCS : 40|8@1+ (0.25,-14) [-14|49.75] "dB" Vector__XXX + SG_ UI_TCR_maxDy : 48|5@1+ (0.5,0) [0|15.5] "m" Vector__XXX + SG_ UI_TCR_maxObjects : 56|5@1+ (1,0) [0|31] "" Vector__XXX + SG_ UI_TCR_maxRoadClass : 61|3@1+ (1,0) [0|7] "" Vector__XXX + +BO_ 522 BrakeMessage: 8 XXX + SG_ driverBrakeStatus : 2|2@1+ (1,0) [0|3] "" XXX + +BO_ 921 AutopilotStatus: 8 XXX + SG_ autopilotStatus : 0|4@1+ (1,0) [0|0] "" XXX + SG_ DAS_blindSpotRearLeft : 4|2@1+ (1,0) [0|0] "" XXX + SG_ DAS_blindSpotRearRight : 6|2@1+ (1,0) [0|0] "" XXX + SG_ DAS_fusedSpeedLimit : 8|5@1+ (5,0) [0|150] "kph/mph" XXX + SG_ DAS_suppressSpeedWarning : 13|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_summonObstacle : 14|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_summonClearedGate : 15|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_visionOnlySpeedLimit : 16|5@1+ (5,0) [0|150] "kph/mph" XXX + SG_ DAS_heaterState : 21|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_forwardCollisionWarning : 22|2@1+ (1,0) [0|0] "" XXX + SG_ DAS_autoparkReady : 24|1@1+ (1,0) [0|1] "" XXX + SG_ DAS_autoParked : 25|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_autoparkWaitingForBrake : 26|1@1+ (1,0) [0|1] "" XXX + SG_ DAS_summonFwdLeashReached : 28|1@1+ (1,0) [0|1] "" XXX + SG_ DAS_summonRvsLeashReached : 29|1@1+ (1,0) [0|1] "" XXX + SG_ DAS_sideCollisionAvoid : 30|2@1+ (1,0) [0|0] "" XXX + SG_ DAS_sideCollisionWarning : 32|2@1+ (1,0) [0|0] "" XXX + SG_ DAS_sideCollisionInhibit : 34|1@1+ (1,0) [0|0] "" XXX + SG_ DAS_csaState : 35|2@1+ (1,0) [0|0] "" XXX + SG_ DAS_laneDepartureWarning : 37|3@1+ (1,0) [0|0] "" XXX + SG_ DAS_fleetSpeedState : 40|2@1+ (1,0) [0|0] "" XXX + SG_ DAS_autopilotHandsOnState : 42|4@1+ (1,0) [0|0] "" XXX + SG_ DAS_autoLaneChangeState : 46|5@1+ (1,0) [0|0] "" XXX + SG_ DAS_summonAvailable : 51|1@1+ (1,0) [0|1] "" XXX + SG_ DAS_statusCounter : 52|4@1+ (1,0) [0|0] "" XXX + SG_ DAS_statusChecksum : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 905 DAS_status2: 8 XXX + SG_ DAS_accSpeedLimit : 0|10@1+ (0.2,0) [0|204.6] "mph" XXX + SG_ DAS_pmmObstacleSeverity : 10|3@1+ (1,0) [0|7] "" XXX + SG_ DAS_pmmLoggingRequest : 13|1@1+ (1,0) [0|1] "" XXX + SG_ DAS_activationFailureStatus : 14|2@1+ (1,0) [0|1] "" XXX + SG_ DAS_pmmUltrasonicsFaultReason : 16|3@1+ (1,0) [0|7] "" XXX + SG_ DAS_pmmRadarFaultReason : 19|2@1+ (1,0) [0|3] "" XXX + SG_ DAS_pmmSysFaultReason : 21|3@1+ (1,0) [0|7] "" XXX + SG_ DAS_pmmCameraFaultReason : 24|2@1+ (1,0) [0|3] "" XXX + SG_ DAS_ACC_report : 26|5@1+ (1,0) [0|0] "" XXX + SG_ DAS_lssState : 31|3@1+ (1,0) [0|0] "" XXX + SG_ DAS_radarTelemetry : 34|2@1+ (1,0) [0|0] "" XXX + SG_ DAS_robState : 36|2@1+ (1,0) [0|3] "" XXX + SG_ DAS_driverInteractionLevel : 38|2@1+ (1,0) [0|3] "" XXX + SG_ DAS_ppOffsetDesiredRamp : 40|8@1+ (0.01,-1.28) [-1.28|1.27] "m" XXX + SG_ DAS_longCollisionWarning : 48|4@1+ (1,0) [0|15] "" XXX + SG_ DAS_status2Counter : 52|4@1+ (1,0) [0|0] "" XXX + SG_ DAS_status2Checksum : 56|8@1+ (1,0) [0|0] "" XXX + +BO_ 1001 DAS_bodyControls: 8 XXX + SG_ DAS_headlightRequest : 0|2@1+ (1,0) [0|3] "" XXX + SG_ DAS_hazardLightRequest : 2|2@1+ (1,0) [0|3] "" XXX + SG_ DAS_wiperSpeed : 4|4@1+ (1,0) [0|15] "" XXX + SG_ DAS_turnIndicatorRequest : 8|2@1+ (1,0) [0|3] "" XXX + SG_ DAS_highLowBeamDecision : 10|2@1+ (1,0) [0|3] "" XXX + SG_ DAS_highLowBeamOffReason : 12|3@1+ (1,0) [0|4] "" XXX + SG_ DAS_turnIndicatorRequestReason : 16|4@1+ (1,0) [0|15] "" XXX + SG_ DAS_bodyControlsCounter : 52|4@1+ (1,0) [0|15] "" XXX + SG_ DAS_bodyControlsChecksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 780 DriverSeat: 8 XXX + SG_ occupancyStatus : 16|3@1+ (1,0) [0|7] "" XXX + SG_ buckleStatus : 19|2@1+ (1,0) [0|3] "" XXX + +VAL_ 3 StW_Angl 16383 "SNA" ; +VAL_ 3 StW_AnglSens_Id 2 "MUST" 0 "PSBL" 1 "SELF" ; +VAL_ 3 StW_AnglSens_Stat 2 "ERR" 3 "ERR_INI" 1 "INI" 0 "OK" ; +VAL_ 3 StW_AnglSpd 16383 "SNA" ; +VAL_ 14 StW_AnglHP 16383 "SNA" ; +VAL_ 14 StW_AnglHP_Spd 16383 "SNA" ; +VAL_ 14 StW_AnglHP_Sens_Stat 3 "SNA" 2 "ERR" 1 "INI" 0 "OK" ; +VAL_ 14 StW_AnglHP_Sens_Id 3 "SNA" 2 "KOSTAL" 1 "DELPHI" 0 "TEST" ; +VAL_ 69 SpdCtrlLvr_Stat 32 "DN_1ST" 16 "UP_1ST" 8 "DN_2ND" 4 "UP_2ND" 2 "RWD" 1 "FWD" 0 "IDLE" ; +VAL_ 69 DTR_Dist_Rq 255 "SNA" 200 "ACC_DIST_7" 166 "ACC_DIST_6" 133 "ACC_DIST_5" 100 "ACC_DIST_4" 66 "ACC_DIST_3" 33 "ACC_DIST_2" 0 "ACC_DIST_1" ; +VAL_ 69 TurnIndLvr_Stat 3 "SNA" 2 "RIGHT" 1 "LEFT" 0 "IDLE" ; +VAL_ 69 HiBmLvr_Stat 3 "SNA" 2 "HIBM_FLSH_ON_PSD" 1 "HIBM_ON_PSD" 0 "IDLE" ; +VAL_ 69 WprWashSw_Psd 3 "SNA" 2 "WASH" 1 "TIPWIPE" 0 "NPSD" ; +VAL_ 69 WprWash_R_Sw_Posn_V2 3 "SNA" 2 "WASH" 1 "INTERVAL" 0 "OFF" ; +VAL_ 69 StW_Lvr_Stat 4 "STW_BACK" 3 "STW_FWD" 2 "STW_DOWN" 1 "STW_UP" 0 "NPSD" ; +VAL_ 69 StW_Cond_Psd 3 "SNA" 2 "DOWN" 1 "UP" 0 "NPSD" ; +VAL_ 69 HrnSw_Psd 3 "SNA" 2 "NDEF2" 1 "PSD" 0 "NPSD" ; +VAL_ 69 StW_Sw00_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 69 StW_Sw01_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 69 StW_Sw03_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 69 StW_Sw04_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 69 WprSw6Posn 7 "SNA" 6 "STAGE2" 5 "STAGE1" 4 "INTERVAL4" 3 "INTERVAL3" 2 "INTERVAL2" 1 "INTERVAL1" 0 "OFF" ; +VAL_ 257 GTW_epasControlType 0 "WITHOUT" 1 "WITH_ANGLE" 3 "WITH_BOTH" 2 "WITH_TORQUE" ; +VAL_ 109 StW_Sw_Stat3 7 "SNA" 6 "NDEF6" 5 "NDEF5" 4 "NDEF4" 3 "PLUS_MINUS" 2 "MINUS" 1 "PLUS" 0 "NPSD" ; +VAL_ 109 MsgTxmtId 3 "NDEF3" 2 "NDEF2" 1 "SCCM" 0 "EWM" ; +VAL_ 109 TSL_RND_Posn_StW 15 "SNA" 8 "D" 6 "INI" 4 "N_DOWN" 2 "N_UP" 1 "R" 0 "IDLE" ; +VAL_ 109 TSL_P_Psd_StW 3 "SNA" 2 "INI" 1 "PSD" 0 "IDLE" ; +VAL_ 257 GTW_epasEmergencyOn 1 "EMERGENCY_POWER" 0 "NONE" ; +VAL_ 257 GTW_epasLDWEnabled 1 "ALLOWED" 0 "INHIBITED" ; +VAL_ 257 GTW_epasPowerMode 0 "DRIVE_OFF" 1 "DRIVE_ON" 3 "LOAD_SHED" 2 "SHUTTING_DOWN" 15 "SNA" ; +VAL_ 257 GTW_epasTuneRequest 1 "DM_COMFORT" 3 "DM_SPORT" 2 "DM_STANDARD" 0 "FAIL_SAFE_DEFAULT" 4 "RWD_COMFORT" 6 "RWD_SPORT" 5 "RWD_STANDARD" 7 "SNA" ; +VAL_ 264 DI_torqueDriver -4096 "SNA" ; +VAL_ 264 DI_torqueMotor -4096 "SNA" ; +VAL_ 264 DI_soptState 7 "SOPT_TEST_SNA" 4 "SOPT_TEST_NOT_RUN" 3 "SOPT_TEST_PASSED" 2 "SOPT_TEST_FAILED" 1 "SOPT_TEST_IN_PROGRESS" 0 "SOPT_PRE_TEST" ; +VAL_ 264 DI_motorRPM -32768 "SNA" ; +VAL_ 264 DI_pedalPos 255 "SNA" ; +VAL_ 280 DI_torqueEstimate -2048 "SNA" ; +VAL_ 280 DI_gear 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ; +VAL_ 280 DI_brakePedal 1 "Applied" 0 "Not_applied" ; +VAL_ 280 DI_vehicleSpeed 4095 "SNA" ; +VAL_ 280 DI_gearRequest 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ; +VAL_ 280 DI_torqueInterfaceFailure 1 "TORQUE_INTERFACE_FAILED" 0 "TORQUE_INTERFACE_NORMAL" ; +VAL_ 280 DI_brakePedalState 3 "SNA" 2 "INVALID" 1 "ON" 0 "OFF" ; +VAL_ 280 DI_epbParkRequest 1 "Park_requested" 0 "No_request" ; +VAL_ 280 DI_epbInterfaceReady 1 "EPB_INTERFACE_READY" 0 "EPB_INTERFACE_NOT_READY" ; +VAL_ 309 ESP_absBrakeEvent 1 "ACTIVE" 0 "NOT_ACTIVE" ; +VAL_ 309 ESP_brakeDiscWipingActive 1 "ACTIVE" 0 "INACTIVE" ; +VAL_ 309 ESP_brakeLamp 0 "OFF" 1 "ON" ; +VAL_ 309 ESP_espFaultLamp 0 "OFF" 1 "ON" ; +VAL_ 309 ESP_espLampFlash 1 "FLASH" 0 "OFF" ; +VAL_ 309 ESP_hillStartAssistActive 1 "ACTIVE" 0 "INACTIVE" 2 "NOT_AVAILABLE" 3 "SNA" ; +VAL_ 309 ESP_absFaultLamp 0 "OFF" 1 "ON" ; +VAL_ 309 ESP_espOffLamp 0 "OFF" 1 "ON" ; +VAL_ 309 ESP_stabilityControlSts 2 "ENGAGED" 3 "FAULTED" 5 "INIT" 4 "NOT_CONFIGURED" 0 "OFF" 1 "ON" ; +VAL_ 309 ESP_tcLampFlash 1 "FLASH" 0 "OFF" ; +VAL_ 568 UI_mapSpeedLimit 31 "SNA" 30 "UNLIMITED" 29 "LESS_OR_EQ_160" 28 "LESS_OR_EQ_150" 27 "LESS_OR_EQ_140" 26 "LESS_OR_EQ_130" 25 "LESS_OR_EQ_120" 24 "LESS_OR_EQ_115" 23 "LESS_OR_EQ_110" 22 "LESS_OR_EQ_105" 21 "LESS_OR_EQ_100" 20 "LESS_OR_EQ_95" 19 "LESS_OR_EQ_90" 18 "LESS_OR_EQ_85" 17 "LESS_OR_EQ_80" 16 "LESS_OR_EQ_75" 15 "LESS_OR_EQ_70" 14 "LESS_OR_EQ_65" 13 "LESS_OR_EQ_60" 12 "LESS_OR_EQ_55" 11 "LESS_OR_EQ_50" 10 "LESS_OR_EQ_45" 9 "LESS_OR_EQ_40" 8 "LESS_OR_EQ_35" 7 "LESS_OR_EQ_30" 6 "LESS_OR_EQ_25" 5 "LESS_OR_EQ_20" 4 "LESS_OR_EQ_15" 3 "LESS_OR_EQ_10" 2 "LESS_OR_EQ_7" 1 "LESS_OR_EQ_5" 0 "UNKNOWN" ; +VAL_ 569 DAS_leftLineUsage 3 "BLACKLISTED" 2 "FUSED" 1 "AVAILABLE" 0 "REJECTED_UNAVAILABLE" ; +VAL_ 569 DAS_rightLineUsage 3 "BLACKLISTED" 2 "FUSED" 1 "AVAILABLE" 0 "REJECTED_UNAVAILABLE" ; +VAL_ 569 DAS_leftFork 3 "LEFT_FORK_UNAVAILABLE" 2 "LEFT_FORK_SELECTED" 1 "LEFT_FORK_AVAILABLE" 0 "LEFT_FORK_NONE" ; +VAL_ 569 DAS_rightFork 3 "RIGHT_FORK_UNAVAILABLE" 2 "RIGHT_FORK_SELECTED" 1 "RIGHT_FORK_AVAILABLE" 0 "RIGHT_FORK_NONE" ; +VAL_ 521 DAS_locMode 3 "DAS_LOC_DRIVERLESS" 2 "DAS_LOC_RESTRICTED" 1 "DAS_LOC_NORMAL" 0 "DAS_LOC_OFF" ; +VAL_ 521 DAS_locState 7 "DAS_LOC_FAULT_SNA" 6 "DAS_LOC_AEB_ACTIVE" 2 "DAS_LOC_CANCEL_SILENT" 1 "DAS_LOC_CANCEL_GENERIC" 0 "DAS_LOC_HEALTHY" ; +VAL_ 521 DAS_locRequest 4 "DAS_RQ_PARK" 3 "DAS_RQ_HOLD" 2 "DAS_RQ_BACKWARD" 1 "DAS_RQ_FORWARD" 0 "DAS_RQ_IDLE" ; +VAL_ 521 DAS_locJerkMin 255 "SNA" ; +VAL_ 521 DAS_locJerkMax 255 "SNA" ; +VAL_ 521 DAS_locSpeed 2047 "SNA" ; +VAL_ 521 DAS_locAccelMin 511 "SNA" ; +VAL_ 521 DAS_locAccelMax 511 "SNA" ; +VAL_ 522 driverBrakeStatus 2 "APPLIED" 1 "NOT_APPLIED" ; +VAL_ 760 UI_mapSpeedLimitUnits 1 "KPH" 0 "MPH" ; +VAL_ 760 UI_userSpeedOffsetUnits 1 "KPH" 0 "MPH" ; +VAL_ 643 AirTemp_Insd 255 "SNA" ; +VAL_ 643 AirTemp_Outsd 254 "INIT" 255 "SNA" ; +VAL_ 643 Bckl_Sw_RL_Stat_SAM_R 2 "FLT" 1 "NOT" 0 "OK" 3 "SNA" ; +VAL_ 643 Bckl_Sw_RM_Stat_SAM_R 2 "FLT" 1 "NOT" 0 "OK" 3 "SNA" ; +VAL_ 643 Bckl_Sw_RR_Stat_SAM_R 2 "FLT" 1 "NOT" 0 "OK" 3 "SNA" ; +VAL_ 643 DL_RLtch_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ; +VAL_ 643 DrRLtch_FL_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ; +VAL_ 643 DrRLtch_FR_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ; +VAL_ 643 DrRLtch_RL_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ; +VAL_ 643 DrRLtch_RR_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ; +VAL_ 643 EngHd_Stat 1 "CLS" 0 "NDEF0" 2 "OPN" 3 "SNA" ; +VAL_ 643 LgtSens_Night 0 "DAY" 1 "NIGHT" ; +VAL_ 643 MPkBrk_Stat 1 "ENGG" 0 "RELS" ; +VAL_ 643 RevGr_Engg 0 "DISENGG" 1 "ENGG" 2 "NDEF2" 3 "SNA" ; +VAL_ 643 StW_Cond_Stat 3 "BLINK" 1 "NDEF1" 0 "OFF" 2 "ON" ; +VAL_ 643 Trlr_Stat 2 "NDEF2" 0 "NONE" 1 "OK" 3 "SNA" ; +VAL_ 697 DAS_setSpeed 4095 "SNA" ; +VAL_ 697 DAS_accState 15 "FAULT_SNA" 13 "ACC_CANCEL_GENERIC_SILENT" 11 "APC_SELFPARK_START" 10 "APC_UNPARK_COMPLETE" 9 "APC_PAUSE" 8 "APC_ABORT" 7 "APC_COMPLETE" 6 "APC_FORWARD" 5 "APC_BACKWARD" 4 "ACC_ON" 3 "ACC_HOLD" 0 "ACC_CANCEL_GENERIC" ; +VAL_ 697 DAS_aebEvent 3 "AEB_SNA" 2 "AEB_FAULT" 1 "AEB_ACTIVE" 0 "AEB_NOT_ACTIVE" ; +VAL_ 697 DAS_jerkMin 511 "SNA" ; +VAL_ 697 DAS_jerkMax 255 "SNA" ; +VAL_ 697 DAS_accelMin 511 "SNA" ; +VAL_ 697 DAS_accelMax 511 "SNA" ; +VAL_ 780 occupancyStatus 1 "OCCUPIED" 0 "UNOCCUPIED" ; +VAL_ 780 buckleStatus 1 "LATCHED" 0 "UNLATCHED" ; +VAL_ 792 BOOT_STATE 2 "Init" 3 "SNA" 0 "closed" 1 "open" ; +VAL_ 792 CERRD 1 "CAN error detect" 0 "no Can error detected" ; +VAL_ 792 DAY 1 "Init" 0 "SNA" ; +VAL_ 792 DOOR_STATE_FL 2 "Init" 3 "SNA" 0 "closed" 1 "open" ; +VAL_ 792 DOOR_STATE_FR 2 "Init" 3 "SNA" 0 "closed" 1 "open" ; +VAL_ 792 DOOR_STATE_FrontTrunk 2 "Init" 3 "SNA" 0 "closed" 1 "open" ; +VAL_ 792 DOOR_STATE_RL 2 "Init" 3 "SNA" 0 "closed" 1 "open" ; +VAL_ 792 DOOR_STATE_RR 2 "Init" 3 "SNA" 0 "closed" 1 "open" ; +VAL_ 792 GTW_updateInProgress 1 "IN_PROGRESS" 2 "IN_PROGRESS_NOT_USED" 3 "IN_PROGRESS_SNA" 0 "NOT_IN_PROGRESS" ; +VAL_ 792 Hour 30 "Init" 31 "SNA" ; +VAL_ 792 MCU_factoryMode 1 "FACTORY_MODE" 0 "NORMAL_MODE" ; +VAL_ 792 MCU_transportModeOn 0 "NORMAL_MODE" ; +VAL_ 792 MINUTE 62 "Init" 63 "SNA" ; +VAL_ 792 MONTH 1 "Init" 15 "SNA" ; +VAL_ 792 SECOND 62 "Init" 63 "SNA" ; +VAL_ 792 YEAR 126 "Init" 127 "SNA" ; +VAL_ 872 DI_aebState 2 "ENABLED" 4 "FAULT" 7 "SNA" 1 "STANDBY" 3 "STANDSTILL" 0 "UNAVAILABLE" ; +VAL_ 872 DI_analogSpeed 4095 "SNA" ; +VAL_ 872 DI_cruiseState 2 "ENABLED" 5 "FAULT" 0 "OFF" 4 "OVERRIDE" 7 "PRE_CANCEL" 6 "PRE_FAULT" 1 "STANDBY" 3 "STANDSTILL" ; +VAL_ 872 DI_digitalSpeed 255 "SNA" ; +VAL_ 872 DI_immobilizerState 2 "AUTHENTICATING" 3 "DISARMED" 6 "FAULT" 4 "IDLE" 0 "INIT_SNA" 1 "REQUEST" 5 "RESET" ; +VAL_ 872 DI_speedUnits 1 "KPH" 0 "MPH" ; +VAL_ 872 DI_state 3 "ABORT" 4 "ENABLE" 2 "FAULT" 1 "STANDBY" 0 "UNAVAILABLE" ; +VAL_ 872 DI_systemState 3 "ABORT" 4 "ENABLE" 2 "FAULT" 1 "STANDBY" 0 "UNAVAILABLE" ; +VAL_ 872 DI_vehicleHoldState 2 "BLEND_IN" 4 "BLEND_OUT" 6 "FAULT" 7 "INIT" 5 "PARK" 1 "STANDBY" 3 "STANDSTILL" 0 "UNAVAILABLE" ; +VAL_ 880 EPAS_currentTuneMode 1 "DM_COMFORT" 3 "DM_SPORT" 2 "DM_STANDARD" 0 "FAIL_SAFE_DEFAULT" 4 "RWD_COMFORT" 6 "RWD_SPORT" 5 "RWD_STANDARD" 7 "UNAVAILABLE" ; +VAL_ 880 EPAS_eacErrorCode 14 "EAC_ERROR_EPB_INHIBIT" 3 "EAC_ERROR_HANDS_ON" 7 "EAC_ERROR_HIGH_ANGLE_RATE_REQ" 9 "EAC_ERROR_HIGH_ANGLE_RATE_SAFETY" 6 "EAC_ERROR_HIGH_ANGLE_REQ" 8 "EAC_ERROR_HIGH_ANGLE_SAFETY" 10 "EAC_ERROR_HIGH_MMOT_SAFETY" 11 "EAC_ERROR_HIGH_TORSION_SAFETY" 0 "EAC_ERROR_IDLE" 12 "EAC_ERROR_LOW_ASSIST" 2 "EAC_ERROR_MAX_SPEED" 1 "EAC_ERROR_MIN_SPEED" 13 "EAC_ERROR_PINION_VEL_DIFF" 4 "EAC_ERROR_TMP_FAULT" 5 "EAR_ERROR_MAX_STEER_DELTA" 15 "SNA" ; +VAL_ 880 EPAS_eacStatus 2 "EAC_ACTIVE" 1 "EAC_AVAILABLE" 3 "EAC_FAULT" 0 "EAC_INHIBITED" 4 "SNA" ; +VAL_ 880 EPAS_handsOnLevel 0 "0" 1 "1" 2 "2" 3 "3" ; +VAL_ 880 EPAS_steeringFault 1 "FAULT" 0 "NO_FAULT" ; +VAL_ 880 EPAS_steeringRackForce 1022 "NOT_IN_SPEC" 1023 "SNA" ; +VAL_ 880 EPAS_steeringReduced 0 "NORMAL_ASSIST" 1 "REDUCED_ASSIST" ; +VAL_ 880 EPAS_torsionBarTorque 0 "SEE_SPECIFICATION" 4095 "SNA" 4094 "UNDEFINABLE_DATA" ; +VAL_ 904 MCU_clusterReadyForDrive 0 "NO_SNA" 1 "YES" ; +VAL_ 905 DAS_accSpeedLimit 1023 "SNA" 0 "NONE" ; +VAL_ 905 DAS_pmmObstacleSeverity 7 "PMM_SNA" 6 "PMM_ACCEL_LIMIT" 5 "PMM_CRASH_FRONT" 4 "PMM_CRASH_REAR" 3 "PMM_BRAKE_REQUEST" 2 "PMM_IMMINENT_FRONT" 1 "PMM_IMMINENT_REAR" 0 "PMM_NONE" ; +VAL_ 905 DAS_pmmLoggingRequest 1 "TRUE" 0 "FALSE" ; +VAL_ 905 DAS_activationFailureStatus 2 "LC_ACTIVATION_FAILED_2" 1 "LC_ACTIVATION_FAILED_1" 0 "LC_ACTIVATION_IDLE" ; +VAL_ 905 DAS_pmmUltrasonicsFaultReason 4 "PMM_ULTRASONICS_INVALID_MIA" 3 "PMM_ULTRASONICS_BLOCKED_BOTH" 2 "PMM_ULTRASONICS_BLOCKED_REAR" 1 "PMM_ULTRASONICS_BLOCKED_FRONT" 0 "PMM_ULTRASONICS_NO_FAULT" ; +VAL_ 905 DAS_pmmRadarFaultReason 2 "PMM_RADAR_INVALID_MIA" 1 "PMM_RADAR_BLOCKED_FRONT" 0 "PMM_RADAR_NO_FAULT" ; +VAL_ 905 DAS_pmmSysFaultReason 7 "PMM_FAULT_BRAKE_PEDAL_INHIBIT" 6 "PMM_FAULT_ROAD_TYPE" 5 "PMM_FAULT_DISABLED_BY_USER" 4 "PMM_FAULT_STEERING_ANGLE_RATE" 3 "PMM_FAULT_DI_FAULT" 2 "PMM_FAULT_SPEED" 1 "PMM_FAULT_DAS_DISABLED" 0 "PMM_FAULT_NONE" ; +VAL_ 905 DAS_pmmCameraFaultReason 2 "PMM_CAMERA_INVALID_MIA" 1 "PMM_CAMERA_BLOCKED_FRONT" 0 "PMM_CAMERA_NO_FAULT" ; +VAL_ 905 DAS_ACC_report 24 "ACC_REPORT_BEHAVIOR_REPORT" 23 "ACC_REPORT_CAMERA_ONLY" 22 "ACC_REPORT_RADAR_OBJ_FIVE" 21 "ACC_REPORT_CIPV_CUTTING_OUT" 20 "ACC_REPORT_MCVLR_IN_PATH" 19 "ACC_REPORT_MCVLR_DPP" 18 "ACC_REPORT_FLEET_SPEEDS" 17 "ACC_REPORT_TARGET_MCP" 16 "ACC_REPORT_RADAR_OBJ_TWO" 15 "ACC_REPORT_RADAR_OBJ_ONE" 14 "ACC_REPORT_LC_EXTERNAL_STATE_ACTIVE_RESTRICTED" 13 "ACC_REPORT_LC_EXTERNAL_STATE_ABORTED" 12 "ACC_REPORT_LC_EXTERNAL_STATE_ABORTING" 11 "ACC_REPORT_LC_HANDS_ON_REQD_STRUCK_OUT" 10 "ACC_REPORT_CSA" 9 "ACC_REPORT_TARGET_TYPE_FAULT" 8 "ACC_REPORT_TARGET_TYPE_IPSO" 7 "ACC_REPORT_TARGET_TYPE_TRAFFIC_LIGHT" 6 "ACC_REPORT_TARGET_TYPE_STOP_SIGN" 5 "ACC_REPORT_TARGET_CUTIN" 4 "ACC_REPORT_TARGET_MCVR" 3 "ACC_REPORT_TARGET_MCVL" 2 "ACC_REPORT_TARGET_IN_FRONT_OF_CIPV" 1 "ACC_REPORT_TARGET_CIPV" 0 "ACC_REPORT_TARGET_NONE" ; +VAL_ 905 DAS_lssState 7 "LSS_STATE_OFF" 6 "LSS_STATE_ABORT" 5 "LSS_STATE_BLINDSPOT" 4 "LSS_STATE_MONITOR" 3 "LSS_STATE_ELK" 2 "LSS_STATE_LKA" 1 "LSS_STATE_LDW" 0 "LSS_STATE_FAULT" ; +VAL_ 905 DAS_radarTelemetry 2 "RADAR_TELEMETRY_URGENT" 1 "RADAR_TELEMETRY_NORMAL" 0 "RADAR_TELEMETRY_IDLE" ; +VAL_ 905 DAS_robState 3 "ROB_STATE_MAPLESS" 2 "ROB_STATE_ACTIVE" 1 "ROB_STATE_MEASURE" 0 "ROB_STATE_INHIBITED" ; +VAL_ 905 DAS_driverInteractionLevel 2 "CONTINUED_DRIVER_NOT_INTERACTING" 1 "DRIVER_NOT_INTERACTING" 0 "DRIVER_INTERACTING" ; +VAL_ 905 DAS_ppOffsetDesiredRamp 128 "PP_NO_OFFSET" ; +VAL_ 905 DAS_longCollisionWarning 15 "FCM_LONG_COLLISION_WARNING_SNA" 12 "FCM_LONG_COLLISION_WARNING_VEHICLE_CIPV2" 11 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVR2" 10 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVR" 9 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVL2" 8 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVL" 7 "FCM_LONG_COLLISION_WARNING_VEHICLE_CUTIN" 6 "FCM_LONG_COLLISION_WARNING_VEHICLE_CIPV" 5 "FCM_LONG_COLLISION_WARNING_TFL_STOPLINE" 4 "FCM_LONG_COLLISION_WARNING_STOPSIGN_STOPLINE" 3 "FCM_LONG_COLLISION_WARNING_IPSO" 2 "FCM_LONG_COLLISION_WARNING_PEDESTRIAN" 1 "FCM_LONG_COLLISION_WARNING_VEHICLE_UNKNOWN" 0 "FCM_LONG_COLLISION_WARNING_NONE" ; +VAL_ 921 autopilotStatus 5 "ACTIVE_NAVIGATE_ON_AUTOPILOT" 4 "ACTIVE_2" 3 "ACTIVE_1" 2 "AVAILABLE" 1 "UNAVAILABLE" 0 "DISABLED" ; +VAL_ 921 DAS_blindSpotRearLeft 3 "SNA" 2 "WARNING_LEVEL_2" 1 "WARNING_LEVEL_1" 0 "NO_WARNING" ; +VAL_ 921 DAS_blindSpotRearRight 3 "SNA" 2 "WARNING_LEVEL_2" 1 "WARNING_LEVEL_1" 0 "NO_WARNING" ; +VAL_ 921 DAS_fusedSpeedLimit 31 "NONE" 0 "UNKNOWN_SNA" ; +VAL_ 921 DAS_suppressSpeedWarning 1 "Suppress_Speed_Warning" 0 "Do_Not_Suppress" ; +VAL_ 921 DAS_visionOnlySpeedLimit 31 "NONE" 0 "UNKNOWN_SNA" ; +VAL_ 921 DAS_heaterState 1 "HEATER_ON" 0 "HEATER_OFF_SNA" ; +VAL_ 921 DAS_forwardCollisionWarning 3 "SNA" 1 "FORWARD_COLLISION_WARNING" 0 "NONE" ; +VAL_ 921 DAS_autoparkReady 1 "AUTOPARK_READY" 0 "AUTOPARK_UNAVAILABLE" ; +VAL_ 921 DAS_sideCollisionAvoid 3 "SNA" 2 "AVOID_RIGHT" 1 "AVOID_LEFT" 0 "NONE" ; +VAL_ 921 DAS_sideCollisionWarning 3 "WARN_LEFT_RIGHT" 2 "WARN_RIGHT" 1 "WARN_LEFT" 0 "NONE" ; +VAL_ 921 DAS_sideCollisionInhibit 1 "INHIBIT" 0 "NO_INHIBIT" ; +VAL_ 921 DAS_csaState 3 "CSA_EXTERNAL_STATE_HOLD" 2 "CSA_EXTERNAL_STATE_ENABLE" 1 "CSA_EXTERNAL_STATE_AVAILABLE" 0 "CSA_EXTERNAL_STATE_UNAVAILABLE" ; +VAL_ 921 DAS_laneDepartureWarning 5 "SNA" 4 "RIGHT_WARNING_SEVERE" 3 "LEFT_WARNING_SEVERE" 2 "RIGHT_WARNING" 1 "LEFT_WARNING" 0 "NONE" ; +VAL_ 921 DAS_fleetSpeedState 3 "FLEETSPEED_HOLD" 2 "FLEETSPEED_ACTIVE" 1 "FLEETSPEED_AVAILABLE" 0 "FLEETSPEED_UNAVAILABLE" ; +VAL_ 921 DAS_autopilotHandsOnState 15 "LC_HANDS_ON_SNA" 8 "LC_HANDS_ON_SUSPENDED" 7 "LC_HANDS_ON_REQD_STRUCK_OUT" 5 "LC_HANDS_ON_REQD_CHIME_2" 4 "LC_HANDS_ON_REQD_CHIME_1" 3 "LC_HANDS_ON_REQD_VISUAL" 2 "LC_HANDS_ON_REQD_NOT_DETECTED" 1 "LC_HANDS_ON_REQD_DETECTED" 0 "LC_HANDS_ON_NOT_REQD" ; +VAL_ 921 DAS_autoLaneChangeState 31 "ALC_SNA" 30 "ALC_ABORT_MISSION_PLAN_INVALID" 29 "ALC_ABORT_TIMEOUT" 28 "ALC_WAITING_HANDS_ON" 27 "ALC_BLOCKED_LANE_TYPE_R" 26 "ALC_BLOCKED_LANE_TYPE_L" 25 "ALC_BLOCKED_VEH_TTC_AND_USS_R" 24 "ALC_BLOCKED_VEH_TTC_R" 23 "ALC_BLOCKED_VEH_TTC_AND_USS_L" 22 "ALC_BLOCKED_VEH_TTC_L" 21 "ALC_UNAVAILABLE_SOLID_LANE_LINE" 20 "ALC_ABORT_OTHER_REASON" 19 "ALC_ABORT_BLINKER_TURNED_OFF" 18 "ALC_ABORT_LC_HEALTH_BAD" 17 "ALC_ABORT_POOR_VIEW_RANGE" 16 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_R" 15 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_L" 14 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_R" 13 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_L" 12 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_R" 11 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_L" 10 "ALC_IN_PROGRESS_R" 9 "ALC_IN_PROGRESS_L" 8 "ALC_AVAILABLE_BOTH" 7 "ALC_AVAILABLE_ONLY_R" 6 "ALC_AVAILABLE_ONLY_L" 5 "ALC_UNAVAILABLE_VEHICLE_SPEED" 4 "ALC_UNAVAILABLE_EXITING_HIGHWAY" 3 "ALC_UNAVAILABLE_TP_FOLLOW" 2 "ALC_UNAVAILABLE_SONICS_INVALID" 1 "ALC_UNAVAILABLE_NO_LANES" 0 "ALC_UNAVAILABLE_DISABLED" ; +VAL_ 1001 DAS_headlightRequest 3 "DAS_HEADLIGHT_REQUEST_INVALID" 1 "DAS_HEADLIGHT_REQUEST_ON" 0 "DAS_HEADLIGHT_REQUEST_OFF" ; +VAL_ 1001 DAS_hazardLightRequest 3 "DAS_REQUEST_HAZARDS_SNA" 2 "DAS_REQUEST_HAZARDS_UNUSED" 1 "DAS_REQUEST_HAZARDS_ON" 0 "DAS_REQUEST_HAZARDS_OFF" ; +VAL_ 1001 DAS_wiperSpeed 15 "DAS_WIPER_SPEED_INVALID" 14 "DAS_WIPER_SPEED_14" 13 "DAS_WIPER_SPEED_13" 12 "DAS_WIPER_SPEED_12" 11 "DAS_WIPER_SPEED_11" 10 "DAS_WIPER_SPEED_10" 9 "DAS_WIPER_SPEED_9" 8 "DAS_WIPER_SPEED_8" 7 "DAS_WIPER_SPEED_7" 6 "DAS_WIPER_SPEED_6" 5 "DAS_WIPER_SPEED_5" 4 "DAS_WIPER_SPEED_4" 3 "DAS_WIPER_SPEED_3" 2 "DAS_WIPER_SPEED_2" 1 "DAS_WIPER_SPEED_1" 0 "DAS_WIPER_SPEED_OFF" ; +VAL_ 1001 DAS_turnIndicatorRequest 3 "DAS_TURN_INDICATOR_CANCEL" 2 "DAS_TURN_INDICATOR_RIGHT" 1 "DAS_TURN_INDICATOR_LEFT" 0 "DAS_TURN_INDICATOR_NONE" ; +VAL_ 1001 DAS_highLowBeamDecision 3 "DAS_HIGH_BEAM_SNA" 2 "DAS_HIGH_BEAM_ON" 1 "DAS_HIGH_BEAM_OFF" 0 "DAS_HIGH_BEAM_UNDECIDED" ; +VAL_ 1001 DAS_highLowBeamOffReason 5 "HIGH_BEAM_OFF_REASON_SNA" 4 "HIGH_BEAM_OFF_REASON_HEAD_LIGHT" 3 "HIGH_BEAM_OFF_REASON_AMBIENT_LIGHT" 2 "HIGH_BEAM_OFF_REASON_MOVING_RADAR_TARGET" 1 "HIGH_BEAM_OFF_REASON_MOVING_VISION_TARGET" 0 "HIGH_BEAM_ON" ; +VAL_ 1001 DAS_turnIndicatorRequestReason 6 "DAS_ACTIVE_COMMANDED_LANE_CHANGE" 5 "DAS_CANCEL_FORK" 4 "DAS_CANCEL_LANE_CHANGE" 3 "DAS_ACTIVE_FORK" 2 "DAS_ACTIVE_SPEED_LANE_CHANGE" 1 "DAS_ACTIVE_NAV_LANE_CHANGE" 0 "DAS_NONE" ; +VAL_ 1160 DAS_steeringAngleRequest 16384 "ZERO_ANGLE" ; +VAL_ 1160 DAS_steeringControlType 1 "ANGLE_CONTROL" 3 "DISABLED" 0 "NONE" 2 "RESERVED" ; +VAL_ 1160 DAS_steeringHapticRequest 1 "ACTIVE" 0 "IDLE" ; + + diff --git a/artifacts/package_runtime/iqdbc/dbc/tesla_model3_party.dbc b/artifacts/package_runtime/iqdbc/dbc/tesla_model3_party.dbc new file mode 100644 index 000000000..f08a72a01 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/tesla_model3_party.dbc @@ -0,0 +1,488 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: CH DIPF DIPR ETH FC HVI HVS PARTY SDCV VEH VIRT + + +BO_ 905 DAS_status2: 8 PARTY + SG_ DAS_status2Checksum : 56|8@1+ (1,0) [0|255] "" aps + SG_ DAS_status2Counter : 52|4@1+ (1,0) [0|15] "" aps + SG_ DAS_longCollisionWarning : 48|4@1+ (1,0) [0|15] "" aps + SG_ DAS_ppOffsetDesiredRamp : 40|8@1+ (0.01,-1.28) [-1.28|1.27] "m" aps + SG_ DAS_driverInteractionLevel : 38|2@1+ (1,0) [0|2] "" aps + SG_ DAS_robState : 36|2@1+ (1,0) [0|3] "" aps + SG_ DAS_radarTelemetry : 34|2@1+ (1,0) [0|2] "" aps + SG_ DAS_lssState : 31|3@1+ (1,0) [0|7] "" aps + SG_ DAS_ACC_report : 26|5@1+ (1,0) [0|24] "" aps + SG_ DAS_pmmCameraFaultReason : 24|2@1+ (1,0) [0|2] "" aps + SG_ DAS_pmmSysFaultReason : 21|3@1+ (1,0) [0|7] "" aps + SG_ DAS_pmmRadarFaultReason : 19|2@1+ (1,0) [0|2] "" aps + SG_ DAS_pmmUltrasonicsFaultReason : 16|3@1+ (1,0) [0|4] "" aps + SG_ DAS_activationFailureStatus : 14|2@1+ (1,0) [0|2] "" aps + SG_ DAS_pmmLoggingRequest : 13|1@1+ (1,0) [0|1] "" aps + SG_ DAS_pmmObstacleSeverity : 10|3@1+ (1,0) [0|7] "" aps + SG_ DAS_accSpeedLimit : 0|10@1+ (0.4,0) [0|204.6] "mph" aps + +BO_ 264 DI_torque: 8 PARTY + SG_ DI_axleSpeed : 40|16@1- (0.1,0.0) [-2750|2750] "RPM" epas3s + SG_ DI_torqueActual : 27|13@1- (2,0) [-7500|7500] "Nm" X + SG_ DI_torqueCommand : 12|13@1- (2,0) [-7500|7500] "Nm" X + SG_ DI_torqueCounter : 8|4@1+ (1,0) [0|15] "" epas3s + SG_ DI_torqueChecksum : 0|8@1+ (1,0) [0|255] "" epas3s + +BO_ 585 SCCM_leftStalk: 3 PARTY + SG_ SCCM_leftStalkReserved1 : 19|5@1+ (1,0) [0|31] "" X + SG_ SCCM_turnIndicatorStalkStatus : 16|3@1+ (1,0) [0|5] "" park + SG_ SCCM_washWipeButtonStatus : 14|2@1+ (1,0) [0|3] "" X + SG_ SCCM_highBeamStalkStatus : 12|2@1+ (1,0) [0|3] "" X + SG_ SCCM_leftStalkCounter : 8|4@1+ (1,0) [0|15] "" X + SG_ SCCM_leftStalkCrc : 0|8@1+ (1,0) [0|255] "" X + +BO_ 280 DI_systemStatus: 8 PARTY + SG_ DI_trackModeState : 48|2@1+ (1,0) [0|2] "" X + SG_ DI_keepAliveRequest : 47|1@1+ (1,0) [0|1] "" X + SG_ DI_proximity : 46|1@1+ (1,0) [0|1] "" X + SG_ DI_epbRequest : 44|2@1+ (1,0) [0|2] "" X + SG_ DI_tractionControlMode : 40|3@1+ (1,0) [0|5] "" X + SG_ DI_accelPedalPos : 32|8@1+ (0.4,0) [0|100] "%" X + SG_ DI_immobilizerState : 27|3@1+ (1,0) [0|6] "" X + SG_ DI_regenLight : 26|1@1+ (1,0) [0|1] "" X + SG_ DI_gear : 21|3@1+ (1,0) [0|7] "" park + SG_ DI_brakePedalState : 19|2@1+ (1,0) [0|2] "" X + SG_ DI_systemState : 16|3@1+ (1,0) [0|5] "" X + SG_ DI_systemStatusCounter : 8|4@1+ (1,0) [0|15] "" X + SG_ DI_systemStatusChecksum : 0|8@1+ (1,0) [0|255] "" X + +BO_ 697 DAS_control: 8 PARTY + SG_ DAS_controlChecksum : 56|8@1+ (1,0) [0|255] "" aps + SG_ DAS_controlCounter : 53|3@1+ (1,0) [0|7] "" aps + SG_ DAS_accelMax : 44|9@1+ (0.04,-15) [-15|5.44] "m/s^2" aps + SG_ DAS_accelMin : 35|9@1+ (0.04,-15) [-15|5.44] "m/s^2" aps + SG_ DAS_jerkMax : 27|8@1+ (0.034,0) [0|8.67] "m/s^3" aps + SG_ DAS_jerkMin : 18|9@1+ (0.018,-9.1) [-9.1|0.097999999999999] "m/s^3" aps + SG_ DAS_aebEvent : 16|2@1+ (1,0) [0|3] "" aps + SG_ DAS_accState : 12|4@1+ (1,0) [0|15] "" aps + SG_ DAS_setSpeed : 0|12@1+ (0.1,0) [0|409.4] "kph" aps + +BO_ 341 ESP_B: 8 PARTY + SG_ ESP_wheelRotationChecksum : 56|8@1+ (1,0) [0|255] "" app + SG_ ESP_wheelRotationCounter : 52|4@1+ (1,0) [0|15] "" app + SG_ ESP_vehicleSpeed : 42|10@1+ (0.5,0) [0|511] "kph" app + SG_ ESP_vehicleStandstillSts : 41|1@1+ (1,0) [0|1] "" park + SG_ ESP_wheelSpeedsQF : 40|1@1+ (1,0) [0|1] "" epas3s + SG_ ESP_WheelRotationFrL : 38|2@1+ (1,0) [0|3] "" aps + SG_ ESP_WheelRotationFrR : 36|2@1+ (1,0) [0|3] "" aps + SG_ ESP_WheelRotationReL : 34|2@1+ (1,0) [0|3] "" aps + SG_ ESP_WheelRotationReR : 32|2@1+ (1,0) [0|3] "" aps + SG_ ESP_wheelPulseCountReR : 24|8@1+ (1,0) [0|254] "1" das + SG_ ESP_wheelPulseCountReL : 16|8@1+ (1,0) [0|254] "1" das + SG_ ESP_wheelPulseCountFrR : 8|8@1+ (1,0) [0|254] "1" app + SG_ ESP_wheelPulseCountFrL : 0|8@1+ (1,0) [0|254] "1" app + +BO_ 373 ESP_wheelSpeeds: 8 CH + SG_ ESP_wheelSpeedsChecksum : 56|8@1+ (1,0) [0|255] "" das + SG_ ESP_wheelSpeedsCounter : 52|4@1+ (1,0) [0|15] "" das + SG_ ESP_wheelSpeedReR : 39|13@1+ (0.04,0) [0|327.64] "km/h" das + SG_ ESP_wheelSpeedReL : 26|13@1+ (0.04,0) [0|327.64] "km/h" das + SG_ ESP_wheelSpeedFrR : 13|13@1+ (0.04,0) [0|327.64] "km/h" das + SG_ ESP_wheelSpeedFrL : 0|13@1+ (0.04,0) [0|327.64] "km/h" das + +BO_ 969 APS_status: 4 PARTY + SG_ APS_statusCounter : 22|4@1+ (1,0) [0|15] "" X + SG_ APS_apbGpioState : 20|2@1+ (1,0) [0|3] "" gtw + SG_ APS_apbStatusMonitorState : 16|3@1+ (1,0) [0|7] "" gtw + SG_ APS_switchState : 15|1@1+ (1,0) [0|1] "" X + SG_ APS_eacInternalState : 12|3@1+ (1,0) [0|7] "" gtw + SG_ APS_appGpioState : 10|2@1+ (1,0) [0|3] "" gtw + SG_ APS_canMaster : 8|2@1+ (1,0) [0|3] "" gtw + SG_ APS_vehBehaviorState : 4|3@1+ (1,0) [0|7] "" gtw + SG_ APS_appStatusMonitorState : 0|3@1+ (1,0) [0|7] "" gtw + +BO_ 925 IBST_status: 5 PARTY + SG_ IBST_sInputRodDriver : 21|12@1+ (0.015625,-5) [-5|47] "mm" gtw + SG_ IBST_internalState : 18|3@1+ (1,0) [0|6] "" gtw + SG_ IBST_driverBrakeApply : 16|2@1+ (1,0) [0|3] "" gtw + SG_ IBST_iBoosterStatus : 12|3@1+ (1,0) [0|6] "" gtw + SG_ IBST_statusCounter : 8|4@1+ (1,0) [0|15] "" X + SG_ IBST_statusChecksum : 0|8@1+ (1,0) [0|255] "" X + +BO_ 880 EPAS3S_sysStatus: 8 PARTY + SG_ EPAS3S_sysStatusChecksum : 56|8@1+ (1,0) [0|255] "" park + SG_ EPAS3S_sysStatusCounter : 48|4@1+ (1,0) [0|15] "" gtw + SG_ EPAS3S_eacStatus : 55|3@0+ (1,0) [0|7] "" das + SG_ EPAS3S_internalSAS : 37|14@0+ (0.1,-819.2) [-819.2|819] "deg" das + SG_ EPAS3S_handsOnLevel : 39|2@0+ (1,0) [0|3] "" das + SG_ EPAS3S_torsionBarTorque : 19|12@0+ (0.01,-20.5) [-20.5|20.45] "Nm" das + SG_ EPAS3S_eacErrorCode : 23|4@0+ (1,0) [0|15] "" das + SG_ EPAS3S_steeringRackForce : 1|10@0+ (50,-25575) [-25575|25575] "N" gtw + SG_ EPAS3S_steeringFault : 2|1@0+ (1,0) [0|1] "" das + SG_ EPAS3S_steeringReduced : 3|1@0+ (1,0) [0|1] "" das + SG_ EPAS3S_internalSASQF : 4|1@0+ (1,0) [0|1] "" gtw + SG_ EPAS3S_currentTuneMode : 7|3@0+ (1,0) [0|5] "" gtw + +BO_ 637 APS_eacMonitor: 3 PARTY + SG_ APS_eacAllow : 0|2@1+ (1,0) [0|0] "" X + SG_ APS_eacMonitorChecksum : 16|8@1+ (1,0) [0|0] "" X + SG_ APS_eacMonitorCounter : 8|4@1+ (1,0) [0|0] "" X + +BO_ 545 VCFRONT_LVPowerState: 8 CH + SG_ VCFRONT_LVPowerStateChecksum : 56|8@1+ (1,0) [0|255] "" ibst + SG_ VCFRONT_LVPowerStateCounter : 52|4@1+ (1,0) [0|15] "" ibst + SG_ VCFRONT_uiAudioLVState m0 : 50|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_uiHiCurrentLVState m0 : 48|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_vcrightHiCurrentLVState m0 : 46|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_vcleftHiCurrentLVState m0 : 44|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_ocsLVRequest m0 : 42|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_oilPumpRearLVRequest m0 : 40|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_oilPumpFrontLVState m0 : 38|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_disLVState m0 : 36|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_diLVRequest m0 : 34|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_das2HighCurrentLVState m0 : 32|2@1+ (1,0) [0|3] "" das + SG_ VCFRONT_das1HighCurrentLVState m0 : 30|2@1+ (1,0) [0|3] "" das + SG_ VCFRONT_amplifierLVRequest m0 : 28|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_tunerLVRequest m0 : 26|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_iBoosterLVState m0 : 24|2@1+ (1,0) [0|3] "" ibst + SG_ VCFRONT_rcmLVRequest m0 : 22|2@1+ (1,0) [0|3] "" rcm + SG_ VCFRONT_tpmsLVRequest m0 : 20|2@1+ (1,0) [0|3] "" tpms + SG_ VCFRONT_sccmLVRequest m0 : 18|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_pcsLVState m1 : 16|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_ptcLVRequest m0 : 16|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_hvacCompLVState m0 : 14|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_tasLVState m1 : 14|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_hvcLVRequest m1 : 12|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_radcLVState m0 : 12|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_epasLVState m1 : 10|2@1+ (1,0) [0|3] "" epas3s + SG_ VCFRONT_espLVState m0 : 10|2@1+ (1,0) [0|3] "" ibst + SG_ VCFRONT_parkLVState m0 : 8|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_cpLVRequest m1 : 8|2@1+ (1,0) [0|3] "" X + SG_ VCFRONT_vehiclePowerState : 5|2@1+ (1,0) [0|3] "" park + SG_ VCFRONT_LVPowerStateIndex M : 0|5@1+ (1,0) [0|1] "" epas3s + +BO_ 599 DI_speed: 8 PARTY + SG_ DI_uiSpeedUnits : 33|1@1+ (1,0) [0|1] "" das + SG_ DI_uiSpeed : 24|8@1+ (1,0) [0|254] "" das + SG_ DI_vehicleSpeed : 12|12@1+ (0.08,-40) [-40|285] "kph" park + SG_ DI_speedCounter : 8|4@1+ (1,0) [0|15] "" park + SG_ DI_speedChecksum : 0|8@1+ (1,0) [0|255] "" park + +BO_ 605 DAS_road: 6 XXX + SG_ DAS_stopLineDist : 16|8@1+ (0.5,0) [0|127.5] "m" XXX + SG_ DAS_trafficLightColor : 26|3@0+ (1,0) [0|7] "" XXX + +BO_ 1160 DAS_steeringControl: 4 PARTY + SG_ DAS_steeringControlChecksum : 24|8@1+ (1,0) [0|255] "" aps + SG_ DAS_steeringControlCounter : 16|4@1+ (1,0) [0|15] "" aps + SG_ DAS_steeringControlType : 23|3@0+ (1,0) [0|7] "" aps + SG_ DAS_steeringAngleRequest : 6|15@0+ (0.1,-1638.35) [-1638.35|1638.35] "deg" aps + SG_ DAS_steeringHapticRequest : 7|1@0+ (1,0) [0|1] "" aps + +BO_ 297 SCCM_steeringAngleSensor: 8 PARTY + SG_ SCCM_steeringAngleSensorReservd3 : 56|8@1+ (1,0) [0|255] "" X + SG_ SCCM_steeringAngleSensorReservd2 : 48|8@1+ (1,0) [0|255] "" X + SG_ SCCM_steeringAngleSensorReservd1 : 46|2@1+ (1,0) [0|3] "" X + SG_ SCCM_steeringAngleSpeed : 32|14@1+ (0.5,-4096) [-4096|4095.5] "deg/s" park + SG_ SCCM_steeringAngleValidity : 30|2@1+ (1,0) [0|3] "" park + SG_ SCCM_steeringAngle : 16|14@1+ (0.1,-819.2) [-819.2|819] "deg" epas3s + SG_ SCCM_steeringAngleSensorStatus : 14|2@1+ (1,0) [0|3] "" epas3s + SG_ SCCM_supplierID : 12|2@1+ (1,0) [0|3] "" park + SG_ SCCM_steeringAngleCounter : 8|4@1+ (1,0) [0|15] "" epas3s + SG_ SCCM_steeringAngleCrc : 0|8@1+ (1,0) [0|255] "" epas3s + +BO_ 646 DI_state: 8 ETH + SG_ DI_summonInPanic : 48|1@1+ (1,0) [0|0] "" X + SG_ DI_rollPreventionState : 45|3@1+ (1,0) [0|0] "" X + SG_ DI_vehicleHoldState : 42|3@1+ (1,0) [0|0] "" X + SG_ DI_pmmStatus : 40|2@1+ (1,0) [0|0] "" X + SG_ DI_aebState : 37|3@1+ (1,0) [0|0] "" X + SG_ DI_autopilotRequest : 36|1@1+ (1,0) [0|0] "" X + SG_ DI_parkBrakeState : 32|4@1+ (1,0) [0|0] "" X + SG_ DI_autoparkState : 25|4@1+ (1,0) [0|0] "" X + SG_ DI_speedUnits : 24|1@1+ (1,0) [0|0] "" X + SG_ DI_digitalSpeed : 15|9@1+ (0.5,0) [0|0] "speed" X + SG_ DI_cruiseState : 12|3@1+ (1,0) [0|0] "" X + SG_ DI_locStatusCounter : 8|4@1+ (1,0) [0|0] "" X + SG_ DI_locStatusChecksum : 0|8@1+ (1,0) [0|0] "" X + +BO_ 659 DAS_settings: 8 XXX + SG_ DAS_driverSteeringWeight : 1|2@0+ (1,0) [0|255] "" XXX + SG_ DAS_slipStart : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DAS_offRoadAssist : 3|2@1+ (1,0) [0|63] "" XXX + SG_ DAS_distanceUnits : 13|1@1+ (1,0) [0|255] "" XXX + SG_ DAS_aebEnabled : 18|1@0+ (1,0) [0|255] "" XXX + SG_ DAS_adaptiveHeadlights : 22|1@1+ (1,0) [0|31] "" XXX + SG_ DAS_autosteerEnabled2 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ DAS_fcwEnabled : 34|1@0+ (1,0) [0|1] "" XXX + SG_ DAS_fcwSensitivity : 37|2@0+ (1,0) [0|63] "" XXX + SG_ DAS_autosteerEnabled : 38|1@0+ (1,0) [0|1] "" XXX + SG_ DAS_obstacleAwareAcceleration : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DAS_driverAccelerationMode : 44|1@1+ (1,0) [0|127] "" XXX + SG_ DAS_settingCounter : 52|4@1+ (1,0) [0|15] "" XXX + SG_ DAS_settingChecksum : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 785 UI_warning: 7 XXX + SG_ buckleStatus : 13|1@0+ (1,0) [0|1] "" XXX + SG_ scrollWheelPressed : 21|1@0+ (1,0) [0|1] "" XXX + SG_ leftBlinkerOn : 22|1@0+ (1,0) [0|1] "" XXX + SG_ rightBlinkerOn : 23|1@0+ (1,0) [0|1] "" XXX + SG_ leftBlinkerBlinking : 25|2@0+ (1,0) [0|3] "" XXX + SG_ rightBlinkerBlinking : 26|2@1+ (1,0) [0|15] "" XXX + SG_ anyDoorOpen : 28|1@0+ (1,0) [0|1] "" XXX + SG_ wiperSettings : 39|8@0+ (1,0) [0|255] "" XXX + SG_ highBeam : 50|1@0+ (1,0) [0|1] "" XXX + SG_ UI_warningCounter : 8|4@1+ (1,0) [0|15] "" XXX + SG_ UI_warningChecksum : 0|8@1+ (1,0) [0|255] "" XXX + +BO_ 923 DAS_status: 8 PARTY + SG_ DAS_statusChecksum : 56|8@1+ (1,0) [0|255] "" aps + SG_ DAS_statusCounter : 52|4@1+ (1,0) [0|15] "" aps + SG_ DAS_summonAvailable : 51|1@1+ (1,0) [0|1] "" aps + SG_ DAS_autoLaneChangeState : 46|5@1+ (1,0) [0|31] "" aps + SG_ DAS_autopilotHandsOnState : 42|4@1+ (1,0) [0|15] "" aps + SG_ DAS_fleetSpeedState : 40|2@1+ (1,0) [0|3] "" aps + SG_ DAS_laneDepartureWarning : 37|3@1+ (1,0) [0|5] "" aps + SG_ DAS_csaState : 35|2@1+ (1,0) [0|3] "" aps + SG_ DAS_sideCollisionInhibit : 34|1@1+ (1,0) [0|1] "" aps + SG_ DAS_sideCollisionWarning : 32|2@1+ (1,0) [0|3] "" aps + SG_ DAS_sideCollisionAvoid : 30|2@1+ (1,0) [0|3] "" aps + SG_ DAS_summonRvsLeashReached : 29|1@1+ (1,0) [0|1] "" aps + SG_ DAS_summonFwdLeashReached : 28|1@1+ (1,0) [0|1] "" aps + SG_ DAS_autoparkWaitingForBrake : 26|1@1+ (1,0) [0|1] "" gtw + SG_ DAS_autoParked : 25|1@1+ (1,0) [0|1] "" aps + SG_ DAS_autoparkReady : 24|1@1+ (1,0) [0|1] "" aps + SG_ DAS_forwardCollisionWarning : 22|2@1+ (1,0) [0|3] "" aps + SG_ DAS_heaterState : 21|1@1+ (1,0) [0|1] "" gtw + SG_ DAS_visionOnlySpeedLimit : 16|5@1+ (5,0) [0|150] "kph/mph" aps + SG_ DAS_summonClearedGate : 15|1@1+ (1,0) [0|1] "" aps + SG_ DAS_summonObstacle : 14|1@1+ (1,0) [0|1] "" aps + SG_ DAS_suppressSpeedWarning : 13|1@1+ (1,0) [0|1] "" aps + SG_ DAS_fusedSpeedLimit : 8|5@1+ (5,0) [0|150] "kph/mph" aps + SG_ DAS_blindSpotRearRight : 6|2@1+ (1,0) [0|3] "" aps + SG_ DAS_blindSpotRearLeft : 4|2@1+ (1,0) [0|3] "" aps + SG_ DAS_autopilotState : 0|4@1+ (1,0) [0|15] "" aps + +BO_ 325 ESP_status: 8 PARTY + SG_ ESP_absBrakeEvent2 : 22|2@1+ (1,0) [0|0] "" X + SG_ ESP_absFaultLamp : 17|1@1+ (1,0) [0|0] "" X + SG_ ESP_brakeApply : 31|1@1+ (1,0) [0|0] "" X + SG_ ESP_brakeDiscWipingActive : 28|1@1+ (1,0) [0|0] "" X + SG_ ESP_brakeLamp : 21|1@1+ (1,0) [0|0] "" X + SG_ ESP_brakeTorqueTarget : 51|13@1+ (2,0) [0|0] "Nm" X + SG_ ESP_btcTargetState : 38|2@1+ (1,0) [0|0] "" X + SG_ ESP_cdpStatus : 34|2@1+ (1,0) [0|0] "" X + SG_ ESP_driverBrakeApply : 29|2@1+ (1,0) [0|0] "" X + SG_ ESP_ebdFaultLamp : 16|1@1+ (1,0) [0|0] "" X + SG_ ESP_ebrStandstillSkid : 48|1@1+ (1,0) [0|0] "" X + SG_ ESP_ebrStatus : 49|2@1+ (1,0) [0|0] "" X + SG_ ESP_espFaultLamp : 18|1@1+ (1,0) [0|0] "" X + SG_ ESP_espLampFlash : 20|1@1+ (1,0) [0|0] "" X + SG_ ESP_espModeActive : 12|2@1+ (1,0) [0|0] "" X + SG_ ESP_hydraulicBoostEnabled : 19|1@1+ (1,0) [0|0] "" X + SG_ ESP_lateralAccelQF : 25|1@1+ (1,0) [0|0] "" X + SG_ ESP_longitudinalAccelQF : 24|1@1+ (1,0) [0|0] "" X + SG_ ESP_ptcTargetState : 36|2@1+ (1,0) [0|0] "" X + SG_ ESP_stabilityControlSts2 : 14|2@1+ (1,0) [0|0] "" X + SG_ ESP_statusChecksum : 0|8@1+ (1,0) [0|0] "" X + SG_ ESP_statusCounter : 8|4@1+ (1,0) [0|0] "" X + SG_ ESP_steeringAngleQF : 27|1@1+ (1,0) [0|0] "" X + SG_ ESP_yawRateQF : 26|1@1+ (1,0) [0|0] "" X + +CM_ BO_ 605 "Bytes change when toggling between FSD and AP, as well as Traffic Light and Stop Sign Control in TACC"; + +CM_ SG_ 659 DAS_autosteerEnabled "1 if Autosteer or FSD is enabled, 0 otherwise"; +CM_ SG_ 785 leftBlinkerOn "only describes stalk position if half pressed without auto-cancel blinkers. otherwise acts as expected"; +CM_ SG_ 785 rightBlinkerOn "only describes stalk position if half pressed without auto-cancel blinkers. otherwise acts as expected"; +CM_ SG_ 785 scrollWheelPressed "captures either scroll wheel left, right or down press"; + +VAL_ 545 VCFRONT_uiAudioLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_uiHiCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_vcrightHiCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_vcleftHiCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_ocsLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_oilPumpRearLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_oilPumpFrontLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_disLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_diLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_das2HighCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_das1HighCurrentLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_amplifierLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_tunerLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_iBoosterLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_rcmLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_tpmsLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_sccmLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_pcsLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_ptcLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_hvacCompLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_tasLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_hvcLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_radcLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_epasLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_espLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_parkLVState 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_cpLVRequest 1 "LV_ON" 2 "LV_GOING_DOWN" 3 "LV_FAULT" 0 "LV_OFF" ; +VAL_ 545 VCFRONT_vehiclePowerState 3 "VEHICLE_POWER_STATE_DRIVE" 1 "VEHICLE_POWER_STATE_CONDITIONING" 2 "VEHICLE_POWER_STATE_ACCESSORY" 0 "VEHICLE_POWER_STATE_OFF" ; +VAL_ 545 VCFRONT_LVPowerStateIndex 0 "Mux0" 1 "Mux1" ; +VAL_ 905 DAS_longCollisionWarning 7 "FCM_LONG_COLLISION_WARNING_VEHICLE_CUTIN" 0 "FCM_LONG_COLLISION_WARNING_NONE" 4 "FCM_LONG_COLLISION_WARNING_STOPSIGN_STOPLINE" 9 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVL2" 15 "FCM_LONG_COLLISION_WARNING_SNA" 8 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVL" 5 "FCM_LONG_COLLISION_WARNING_TFL_STOPLINE" 2 "FCM_LONG_COLLISION_WARNING_PEDESTRIAN" 12 "FCM_LONG_COLLISION_WARNING_VEHICLE_CIPV2" 6 "FCM_LONG_COLLISION_WARNING_VEHICLE_CIPV" 10 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVR" 3 "FCM_LONG_COLLISION_WARNING_IPSO" 1 "FCM_LONG_COLLISION_WARNING_VEHICLE_UNKNOWN" 11 "FCM_LONG_COLLISION_WARNING_VEHICLE_MCVR2" ; +VAL_ 905 DAS_ppOffsetDesiredRamp 128 "PP_NO_OFFSET" ; +VAL_ 905 DAS_driverInteractionLevel 0 "DRIVER_INTERACTING" 1 "DRIVER_NOT_INTERACTING" 2 "CONTINUED_DRIVER_NOT_INTERACTING" ; +VAL_ 905 DAS_robState 0 "ROB_STATE_INHIBITED" 2 "ROB_STATE_ACTIVE" 3 "ROB_STATE_MAPLESS" 1 "ROB_STATE_MEASURE" ; +VAL_ 905 DAS_radarTelemetry 0 "RADAR_TELEMETRY_IDLE" 1 "RADAR_TELEMETRY_NORMAL" 2 "RADAR_TELEMETRY_URGENT" ; +VAL_ 905 DAS_lssState 7 "LSS_STATE_OFF" 1 "LSS_STATE_LDW" 4 "LSS_STATE_MONITOR" 2 "LSS_STATE_LKA" 3 "LSS_STATE_ELK" 0 "LSS_STATE_FAULT" 5 "LSS_STATE_BLINDSPOT" 6 "LSS_STATE_ABORT" ; +VAL_ 905 DAS_ACC_report 12 "ACC_REPORT_LC_EXTERNAL_STATE_ABORTING" 17 "ACC_REPORT_TARGET_MCP" 11 "ACC_REPORT_LC_HANDS_ON_REQD_STRUCK_OUT" 19 "ACC_REPORT_MCVLR_DPP" 1 "ACC_REPORT_TARGET_CIPV" 15 "ACC_REPORT_RADAR_OBJ_ONE" 16 "ACC_REPORT_RADAR_OBJ_TWO" 14 "ACC_REPORT_LC_EXTERNAL_STATE_ACTIVE_RESTRICTED" 4 "ACC_REPORT_TARGET_MCVR" 20 "ACC_REPORT_MCVLR_IN_PATH" 10 "ACC_REPORT_CSA" 5 "ACC_REPORT_TARGET_CUTIN" 9 "ACC_REPORT_TARGET_TYPE_FAULT" 7 "ACC_REPORT_TARGET_TYPE_TRAFFIC_LIGHT" 6 "ACC_REPORT_TARGET_TYPE_STOP_SIGN" 24 "ACC_REPORT_BEHAVIOR_REPORT" 18 "ACC_REPORT_FLEET_SPEEDS" 2 "ACC_REPORT_TARGET_IN_FRONT_OF_CIPV" 23 "ACC_REPORT_CAMERA_ONLY" 3 "ACC_REPORT_TARGET_MCVL" 22 "ACC_REPORT_RADAR_OBJ_FIVE" 0 "ACC_REPORT_TARGET_NONE" 8 "ACC_REPORT_TARGET_TYPE_IPSO" 21 "ACC_REPORT_CIPV_CUTTING_OUT" 13 "ACC_REPORT_LC_EXTERNAL_STATE_ABORTED" ; +VAL_ 905 DAS_pmmCameraFaultReason 1 "PMM_CAMERA_BLOCKED_FRONT" 2 "PMM_CAMERA_INVALID_MIA" 0 "PMM_CAMERA_NO_FAULT" ; +VAL_ 905 DAS_pmmSysFaultReason 4 "PMM_FAULT_STEERING_ANGLE_RATE" 6 "PMM_FAULT_ROAD_TYPE" 5 "PMM_FAULT_DISABLED_BY_USER" 0 "PMM_FAULT_NONE" 1 "PMM_FAULT_DAS_DISABLED" 3 "PMM_FAULT_DI_FAULT" 2 "PMM_FAULT_SPEED" 7 "PMM_FAULT_BRAKE_PEDAL_INHIBIT" ; +VAL_ 905 DAS_pmmRadarFaultReason 2 "PMM_RADAR_INVALID_MIA" 1 "PMM_RADAR_BLOCKED_FRONT" 0 "PMM_RADAR_NO_FAULT" ; +VAL_ 905 DAS_pmmUltrasonicsFaultReason 2 "PMM_ULTRASONICS_BLOCKED_REAR" 0 "PMM_ULTRASONICS_NO_FAULT" 1 "PMM_ULTRASONICS_BLOCKED_FRONT" 3 "PMM_ULTRASONICS_BLOCKED_BOTH" 4 "PMM_ULTRASONICS_INVALID_MIA" ; +VAL_ 905 DAS_activationFailureStatus 0 "LC_ACTIVATION_IDLE" 2 "LC_ACTIVATION_FAILED_2" 1 "LC_ACTIVATION_FAILED_1" ; +VAL_ 905 DAS_pmmLoggingRequest 0 "FALSE" 1 "TRUE" ; +VAL_ 905 DAS_pmmObstacleSeverity 5 "PMM_CRASH_FRONT" 0 "PMM_NONE" 2 "PMM_IMMINENT_FRONT" 4 "PMM_CRASH_REAR" 1 "PMM_IMMINENT_REAR" 6 "PMM_ACCEL_LIMIT" 7 "PMM_SNA" 3 "PMM_BRAKE_REQUEST" ; +VAL_ 905 DAS_accSpeedLimit 1023 "SNA" 0 "NONE" ; +VAL_ 264 DI_axleSpeed -32768 "SNA" ; +VAL_ 264 DI_torqueActual -4096 "SNA" ; +VAL_ 264 DI_torqueCommand -4096 "SNA" ; +VAL_ 585 SCCM_turnIndicatorStalkStatus 3 "DOWN_1" 5 "SNA" 0 "IDLE" 1 "UP_1" 4 "DOWN_2" 2 "UP_2" ; +VAL_ 585 SCCM_washWipeButtonStatus 3 "SNA" 0 "NOT_PRESSED" 2 "2ND_DETENT" 1 "1ST_DETENT" ; +VAL_ 585 SCCM_highBeamStalkStatus 3 "SNA" 0 "IDLE" 1 "PULL" 2 "PUSH" ; +VAL_ 280 DI_trackModeState 0 "TRACK_MODE_UNAVAILABLE" 1 "TRACK_MODE_AVAILABLE" 2 "TRACK_MODE_ON" ; +VAL_ 280 DI_keepAliveRequest 1 "KEEP_ALIVE" 0 "NO_REQUEST" ; +VAL_ 280 DI_epbRequest 0 "DI_EPBREQUEST_NO_REQUEST" 1 "DI_EPBREQUEST_PARK" 2 "DI_EPBREQUEST_UNPARK" ; +VAL_ 280 DI_tractionControlMode 0 "TC_NORMAL" 1 "TC_SLIP_START" 4 "TC_ROLLS_MODE" 2 "TC_DEV_MODE_1" 5 "TC_DYNO_MODE" 3 "TC_DEV_MODE_2" ; +VAL_ 280 DI_accelPedalPos 255 "SNA" ; +VAL_ 280 DI_immobilizerState 2 "DI_IMM_STATE_AUTHENTICATING" 0 "DI_IMM_STATE_INIT_SNA" 3 "DI_IMM_STATE_DISARMED" 4 "DI_IMM_STATE_IDLE" 6 "DI_IMM_STATE_FAULT" 1 "DI_IMM_STATE_REQUEST" 5 "DI_IMM_STATE_RESET" ; +VAL_ 280 DI_gear 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" 7 "DI_GEAR_SNA" 2 "DI_GEAR_R" 3 "DI_GEAR_N" 4 "DI_GEAR_D" ; +VAL_ 280 DI_brakePedalState 2 "INVALID" 0 "OFF" 1 "ON" ; +VAL_ 280 DI_systemState 5 "DI_SYS_ENABLE" 1 "DI_SYS_IDLE" 2 "DI_SYS_STANDBY" 0 "DI_SYS_UNAVAILABLE" 3 "DI_SYS_FAULT" 4 "DI_SYS_ABORT" ; +VAL_ 605 DAS_trafficLightColor 0 "NONE" 1 "RED" 2 "GREEN" 3 "YELLOW" ; +VAL_ 697 DAS_accelMax 511 "SNA" ; +VAL_ 697 DAS_accelMin 511 "SNA" ; +VAL_ 697 DAS_jerkMax 255 "SNA" ; +VAL_ 697 DAS_jerkMin 511 "SNA" ; +VAL_ 697 DAS_aebEvent 2 "AEB_FAULT" 0 "AEB_NOT_ACTIVE" 3 "AEB_SNA" 1 "AEB_ACTIVE" ; +VAL_ 697 DAS_accState 4 "ACC_ON" 9 "APC_PAUSE" 14 "ACC_CANCEL_OUT_OF_CALIBRATION" 10 "APC_UNPARK_COMPLETE" 6 "APC_FORWARD" 3 "ACC_HOLD" 2 "ACC_CANCEL_RADAR_BLIND" 7 "APC_COMPLETE" 1 "ACC_CANCEL_CAMERA_BLIND" 8 "APC_ABORT" 13 "ACC_CANCEL_GENERIC_SILENT" 5 "APC_BACKWARD" 11 "APC_SELFPARK_START" 0 "ACC_CANCEL_GENERIC" 12 "ACC_CANCEL_PATH_NOT_CLEAR" 15 "FAULT_SNA" ; +VAL_ 697 DAS_setSpeed 4095 "SNA" ; +VAL_ 341 ESP_vehicleSpeed 1023 "ESP_VEHICLE_SPEED_SNA" ; +VAL_ 341 ESP_vehicleStandstillSts 1 "STANDSTILL" 0 "NOT_STANDSTILL" ; +VAL_ 341 ESP_wheelSpeedsQF 0 "ONE_OR_MORE_WSS_INVALID" 1 "ALL_WSS_VALID" ; +VAL_ 341 ESP_WheelRotationFrL 1 "WR_BACKWARD" 0 "WR_FORWARD" 3 "WR_NOT_DEFINABLE" 2 "WR_STANDSTILL" ; +VAL_ 341 ESP_WheelRotationFrR 1 "WR_BACKWARD" 0 "WR_FORWARD" 3 "WR_NOT_DEFINABLE" 2 "WR_STANDSTILL" ; +VAL_ 341 ESP_WheelRotationReL 1 "WR_BACKWARD" 0 "WR_FORWARD" 3 "WR_NOT_DEFINABLE" 2 "WR_STANDSTILL" ; +VAL_ 341 ESP_WheelRotationReR 1 "WR_BACKWARD" 0 "WR_FORWARD" 3 "WR_NOT_DEFINABLE" 2 "WR_STANDSTILL" ; +VAL_ 341 ESP_wheelPulseCountReR 255 "SNA" ; +VAL_ 341 ESP_wheelPulseCountReL 255 "SNA" ; +VAL_ 341 ESP_wheelPulseCountFrR 255 "SNA" ; +VAL_ 341 ESP_wheelPulseCountFrL 255 "SNA" ; +VAL_ 969 APS_apbGpioState 0 "AP_GPIO_STATE_PWR_DOWN_REBOOT" 3 "AP_GPIO_STATE_HEALTHY" 1 "AP_GPIO_STATE_DISABLED" 2 "AP_GPIO_STATE_CRITICAL" ; +VAL_ 969 APS_apbStatusMonitorState 1 "STATUS_MONITOR_STATE_PWR_OFF" 2 "STATUS_MONITOR_STATE_INIT" 7 "STATUS_MONITOR_NUM_STATES" 0 "STATUS_MONITOR_STATE_UNKNOWN" 4 "STATUS_MONITOR_STATE_CRITICAL" 6 "STATUS_MONITOR_STATE_RECOVERY" 5 "STATUS_MONITOR_STATE_SHUTTING_DOWN" 3 "STATUS_MONITOR_STATE_NOMINAL" ; +VAL_ 969 APS_eacInternalState 1 "APS_EAC_STATE_MOMENTARY" 3 "APS_EAC_STATE_AUTOPARK" 5 "APS_EAC_STATE_OVERRIDE" 4 "APS_EAC_STATE_INHIBIT" 0 "APS_EAC_STATE_INIT" 2 "APS_EAC_STATE_CONTINUOUS" 7 "APS_EAC_NUM_STATES" 6 "APS_EAC_STATE_LSS" ; +VAL_ 969 APS_appGpioState 0 "AP_GPIO_STATE_PWR_DOWN_REBOOT" 3 "AP_GPIO_STATE_HEALTHY" 1 "AP_GPIO_STATE_DISABLED" 2 "AP_GPIO_STATE_CRITICAL" ; +VAL_ 969 APS_canMaster 0 "CAN_MASTER_APS" 2 "CAN_MASTER_APB" 3 "CAN_MASTER_SNA" 1 "CAN_MASTER_APP" ; +VAL_ 969 APS_vehBehaviorState 0 "VEH_BEHAVIOR_STATE_UNKNOWN" 3 "VEH_BEHAVIOR_STATE_APS_BRIDGE_APP" 1 "VEH_BEHAVIOR_STATE_APS_AVAILABLE" 5 "VEH_BEHAVIOR_STATE_APS_FAIL_SAFE" 7 "VEH_BEHAVIOR_NUM_STATES" 2 "VEH_BEHAVIOR_STATE_APS_CONTROL" 6 "VEH_BEHAVIOR_STATE_APS_OVERRIDE" 4 "VEH_BEHAVIOR_STATE_APS_BRIDGE_APB" ; +VAL_ 969 APS_appStatusMonitorState 1 "STATUS_MONITOR_STATE_PWR_OFF" 2 "STATUS_MONITOR_STATE_INIT" 7 "STATUS_MONITOR_NUM_STATES" 0 "STATUS_MONITOR_STATE_UNKNOWN" 4 "STATUS_MONITOR_STATE_CRITICAL" 6 "STATUS_MONITOR_STATE_RECOVERY" 5 "STATUS_MONITOR_STATE_SHUTTING_DOWN" 3 "STATUS_MONITOR_STATE_NOMINAL" ; +VAL_ 925 IBST_internalState 5 "TRANSITION_TO_IDLE" 0 "NO_MODE_ACTIVE" 4 "DIAGNOSTIC" 6 "POST_DRIVE_CHECK" 1 "PRE_DRIVE_CHECK" 3 "EXTERNAL_BRAKE_REQUEST" 2 "LOCAL_BRAKE_REQUEST" ; +VAL_ 925 IBST_driverBrakeApply 1 "BRAKES_NOT_APPLIED" 2 "DRIVER_APPLYING_BRAKES" 3 "FAULT" 0 "NOT_INIT_OR_OFF" ; +VAL_ 925 IBST_iBoosterStatus 6 "IBOOSTER_ACTUATION" 4 "IBOOSTER_ACTIVE_GOOD_CHECK" 2 "IBOOSTER_FAILURE" 5 "IBOOSTER_READY" 3 "IBOOSTER_DIAGNOSTIC" 0 "IBOOSTER_OFF" 1 "IBOOSTER_INIT" ; +VAL_ 880 EPAS3S_eacStatus 7 "SNA" 2 "EAC_ACTIVE" 4 "LANE_KEEP_ASSIST" 3 "EAC_FAULT" 1 "EAC_AVAILABLE" 5 "EMERGENCY_LANE_KEEP" 0 "EAC_INHIBITED" ; +VAL_ 880 EPAS3S_handsOnLevel 1 "LEVEL_1" 0 "LEVEL_0" 3 "LEVEL_3" 2 "LEVEL_2" ; +VAL_ 880 EPAS3S_torsionBarTorque 4095 "SNA" 4094 "UNDEFINABLE_DATA" ; +VAL_ 880 EPAS3S_eacErrorCode 15 "SNA" 11 "EAC_ERROR_HIGH_TORSION_SAFETY" 4 "EAC_ERROR_TMP_FAULT" 2 "EAC_ERROR_MAX_SPEED" 7 "EAC_ERROR_HIGH_ANGLE_RATE_REQ" 0 "EAC_ERROR_IDLE" 10 "EAC_ERROR_HIGH_MMOT_SAFETY" 6 "EAC_ERROR_HIGH_ANGLE_REQ" 8 "EAC_ERROR_HIGH_ANGLE_SAFETY" 5 "EAR_ERROR_MAX_STEER_DELTA" 13 "EAC_ERROR_PINION_VEL_DIFF" 1 "EAC_ERROR_MIN_SPEED" 14 "EAC_EXTERNAL_MONITOR_INHIBIT" 12 "EAC_ERROR_LOW_ASSIST" 9 "EAC_ERROR_HIGH_ANGLE_RATE_SAFETY" 3 "EAC_ERROR_HANDS_ON" ; +VAL_ 880 EPAS3S_steeringRackForce 1023 "SNA" 1022 "NOT_IN_SPEC" ; +VAL_ 880 EPAS3S_steeringFault 0 "NO_FAULT" 1 "FAULT" ; +VAL_ 880 EPAS3S_steeringReduced 0 "NORMAL_ASSIST" 1 "REDUCED_ASSIST" ; +VAL_ 880 EPAS3S_internalSASQF 1 "IN_SPEC" 0 "UNDEFINABLE_ACCURACY" ; +VAL_ 880 EPAS3S_currentTuneMode 3 "STEERING_TUNE_RWD_COMFORT" 1 "STEERING_TUNE_DM_STANDARD" 5 "STEERING_TUNE_RWD_SPORT" 0 "STEERING_TUNE_DM_COMFORT" 4 "STEERING_TUNE_RWD_STANDARD" 2 "STEERING_TUNE_DM_SPORT" ; +VAL_ 599 DI_uiSpeedUnits 0 "DI_SPEED_MPH" 1 "DI_SPEED_KPH" ; +VAL_ 599 DI_uiSpeed 255 "DI_UI_SPEED_SNA" ; +VAL_ 599 DI_vehicleSpeed 4095 "SNA" ; +VAL_ 637 APS_eacAllow 0 "INHIBIT" 1 "ALLOW" 2 "RESERVED" 3 "SNA"; +VAL_ 1160 DAS_steeringControlType 2 "LANE_KEEP_ASSIST" 0 "NONE" 1 "ANGLE_CONTROL" 3 "EMERGENCY_LANE_KEEP" 4 "FSD" ; +VAL_ 1160 DAS_steeringAngleRequest 16384 "ZERO_ANGLE" ; +VAL_ 297 SCCM_steeringAngleValidity 3 "SNA" 2 "INIT" 0 "INVALID" 1 "VALID" ; +VAL_ 297 SCCM_steeringAngleSensorStatus 0 "OK" 1 "INIT" 2 "ERROR" 3 "ERROR_INIT" ; +VAL_ 646 DI_rollPreventionState 0 "UNAVAILABLE" 1 "STANDBY" 2 "READY" 3 "BUILD" 4 "HOLD" 5 "PARK" 6 "FAULT" 7 "INIT" ; +VAL_ 646 DI_vehicleHoldState 0 "UNAVAILABLE" 1 "STANDBY" 2 "BLEND_IN" 3 "STANDSTILL" 4 "BLEND_OUT" 5 "PARK" 6 "FAULT" 7 "INIT" ; +VAL_ 646 DI_pmmStatus 0 "INACTIVE" 1 "ACTIVE" 2 "LOGGING_ACTIVE" 3 "SNA" ; +VAL_ 646 DI_aebState 0 "UNAVAILABLE" 1 "STANDBY" 2 "ENABLED" 3 "STANDSTILL" 4 "FAULT" 7 "SNA" ; +VAL_ 646 DI_autopilotRequest 0 "IDLE" 1 "ACTIVATE" ; +VAL_ 646 DI_parkBrakeState 0 "UNAVAILABLE" 1 "RELEASED" 2 "REQUESTED" 3 "APPLIED" 4 "FAULTED" 5 "PANIC_EPB" 6 "PANIC_SKID" 7 "RELEASING" 15 "SNA" ; +VAL_ 646 DI_autoparkState 0 "UNAVAILABLE" 1 "STANDBY" 2 "STARTED" 3 "ACTIVE" 4 "COMPLETE" 5 "PAUSED" 6 "ABORTED" 7 "RESUMED" 8 "UNPARK_COMPLETE" 9 "SELFPARK_STARTED" 15 "SNA" ; +VAL_ 646 DI_speedUnits 0 "MPH" 1 "KPH" ; +VAL_ 646 DI_cruiseState 0 "UNAVAILABLE" 1 "STANDBY" 2 "ENABLED" 3 "STANDSTILL" 4 "OVERRIDE" 5 "FAULT" 6 "PRE_FAULT" 7 "PRE_CANCEL" ; +VAL_ 659 DAS_driverSteeringWeight 0 "light" 1 "standard" 2 "heavy"; +VAL_ 659 DAS_offRoadAssist 0 "disabled" 3 "enabled"; +VAL_ 659 DAS_distanceUnits 1 "miles" 0 "kilometers"; +VAL_ 659 DAS_fcwSensitivity 0 "early" 1 "medium" 2 "late" 3 "off"; +VAL_ 659 DAS_driverAccelerationMode 0 "chill" 1 "standard"; +VAL_ 785 buckleStatus 1 "LATCHED" 0 "UNLATCHED" ; +VAL_ 785 anyDoorOpen 1 "OPEN" 0 "CLOSED" ; +VAL_ 785 leftBlinkerBlinking 0 "off" 1 "blinking, off" 2 "blinking, on"; +VAL_ 785 rightBlinkerBlinking 0 "off" 1 "blinking, off" 2 "blinking, on"; +VAL_ 923 DAS_autoLaneChangeState 5 "ALC_UNAVAILABLE_VEHICLE_SPEED" 17 "ALC_ABORT_POOR_VIEW_RANGE" 23 "ALC_BLOCKED_VEH_TTC_AND_USS_L" 0 "ALC_UNAVAILABLE_DISABLED" 26 "ALC_BLOCKED_LANE_TYPE_L" 29 "ALC_ABORT_TIMEOUT" 9 "ALC_IN_PROGRESS_L" 4 "ALC_UNAVAILABLE_EXITING_HIGHWAY" 22 "ALC_BLOCKED_VEH_TTC_L" 12 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_R" 18 "ALC_ABORT_LC_HEALTH_BAD" 28 "ALC_WAITING_HANDS_ON" 8 "ALC_AVAILABLE_BOTH" 11 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_L" 3 "ALC_UNAVAILABLE_TP_FOLLOW" 2 "ALC_UNAVAILABLE_SONICS_INVALID" 21 "ALC_UNAVAILABLE_SOLID_LANE_LINE" 24 "ALC_BLOCKED_VEH_TTC_R" 1 "ALC_UNAVAILABLE_NO_LANES" 25 "ALC_BLOCKED_VEH_TTC_AND_USS_R" 30 "ALC_ABORT_MISSION_PLAN_INVALID" 27 "ALC_BLOCKED_LANE_TYPE_R" 19 "ALC_ABORT_BLINKER_TURNED_OFF" 31 "ALC_SNA" 13 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_L" 16 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_R" 6 "ALC_AVAILABLE_ONLY_L" 20 "ALC_ABORT_OTHER_REASON" 15 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_L" 7 "ALC_AVAILABLE_ONLY_R" 14 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_R" 10 "ALC_IN_PROGRESS_R" ; +VAL_ 923 DAS_autopilotHandsOnState 8 "LC_HANDS_ON_SUSPENDED" 15 "LC_HANDS_ON_SNA" 7 "LC_HANDS_ON_REQD_STRUCK_OUT" 3 "LC_HANDS_ON_REQD_VISUAL" 4 "LC_HANDS_ON_REQD_CHIME_1" 6 "LC_HANDS_ON_REQD_SLOWING" 1 "LC_HANDS_ON_REQD_DETECTED" 2 "LC_HANDS_ON_REQD_NOT_DETECTED" 5 "LC_HANDS_ON_REQD_CHIME_2" 0 "LC_HANDS_ON_NOT_REQD" ; +VAL_ 923 DAS_fleetSpeedState 0 "FLEETSPEED_UNAVAILABLE" 1 "FLEETSPEED_AVAILABLE" 2 "FLEETSPEED_ACTIVE" 3 "FLEETSPEED_HOLD" ; +VAL_ 923 DAS_laneDepartureWarning 5 "SNA" 0 "NONE" 2 "RIGHT_WARNING" 4 "RIGHT_WARNING_SEVERE" 3 "LEFT_WARNING_SEVERE" 1 "LEFT_WARNING" ; +VAL_ 923 DAS_csaState 1 "CSA_EXTERNAL_STATE_AVAILABLE" 3 "CSA_EXTERNAL_STATE_HOLD" 2 "CSA_EXTERNAL_STATE_ENABLE" 0 "CSA_EXTERNAL_STATE_UNAVAILABLE" ; +VAL_ 923 DAS_sideCollisionInhibit 0 "NO_INHIBIT" 1 "INHIBIT" ; +VAL_ 923 DAS_sideCollisionWarning 0 "NONE" 2 "WARN_RIGHT" 1 "WARN_LEFT" 3 "WARN_LEFT_RIGHT" ; +VAL_ 923 DAS_sideCollisionAvoid 3 "SNA" 0 "NONE" 1 "AVOID_LEFT" 2 "AVOID_RIGHT" ; +VAL_ 923 DAS_autoparkReady 0 "AUTOPARK_UNAVAILABLE" 1 "AUTOPARK_READY" ; +VAL_ 923 DAS_forwardCollisionWarning 3 "SNA" 0 "NONE" 1 "FORWARD_COLLISION_WARNING" ; +VAL_ 923 DAS_heaterState 0 "HEATER_OFF_SNA" 1 "HEATER_ON" ; +VAL_ 923 DAS_visionOnlySpeedLimit 31 "NONE" 0 "UNKNOWN_SNA" ; +VAL_ 923 DAS_suppressSpeedWarning 1 "Suppress_Speed_Warning" 0 "Do_Not_Suppress" ; +VAL_ 923 DAS_fusedSpeedLimit 31 "NONE" 0 "UNKNOWN_SNA" ; +VAL_ 923 DAS_blindSpotRearRight 3 "SNA" 0 "NO_WARNING" 1 "WARNING_LEVEL_1" 2 "WARNING_LEVEL_2" ; +VAL_ 923 DAS_blindSpotRearLeft 3 "SNA" 0 "NO_WARNING" 1 "WARNING_LEVEL_1" 2 "WARNING_LEVEL_2" ; +VAL_ 923 DAS_autopilotState 15 "SNA" 8 "ABORTING" 3 "ACTIVE_NOMINAL" 0 "DISABLED" 4 "ACTIVE_RESTRICTED" 5 "ACTIVE_NAV" 6 "ACTIVE_FSD" 14 "FAULT" 1 "UNAVAILABLE" 9 "ABORTED" 2 "AVAILABLE" ; +VAL_ 325 ESP_absBrakeEvent2 0 "NOT_ACTIVE" 1 "ACTIVE_FRONT_REAR" 2 "ACTIVE_FRONT" 3 "ACTIVE_REAR"; +VAL_ 325 ESP_absFaultLamp 0 "OFF" 1 "ON"; +VAL_ 325 ESP_brakeApply 0 "INACTIVE" 1 "ACTIVE"; +VAL_ 325 ESP_brakeDiscWipingActive 0 "INACTIVE" 1 "ACTIVE"; +VAL_ 325 ESP_brakeLamp 0 "OFF" 1 "ON"; +VAL_ 325 ESP_brakeTorqueTarget 8191 "SNA"; +VAL_ 325 ESP_btcTargetState 0 "OFF" 1 "BACKUP" 2 "ON" 3 "SNA"; +VAL_ 325 ESP_cdpStatus 0 "CDP_IS_NOT_AVAILABLE" 1 "CDP_IS_AVAILABLE" 2 "ACTUATING_EPB_CDP" 3 "CDP_COMMAND_INVALID"; +VAL_ 325 ESP_driverBrakeApply 0 "NotInit_orOff" 1 "Not_Applied" 2 "Driver_applying_brakes" 3 "Faulty_SNA"; +VAL_ 325 ESP_ebdFaultLamp 0 "OFF" 1 "ON"; +VAL_ 325 ESP_ebrStandstillSkid 0 "NO_STANDSTILL_SKID" 1 "STANDSTILL_SKID_DETECTED"; +VAL_ 325 ESP_ebrStatus 0 "EBR_IS_NOT_AVAILABLE" 1 "EBR_IS_AVAILABLE" 2 "ACTUATING_DI_EBR" 3 "EBR_COMMAND_INVALID"; +VAL_ 325 ESP_espFaultLamp 0 "OFF" 1 "ON"; +VAL_ 325 ESP_espLampFlash 0 "OFF" 1 "FLASH"; +VAL_ 325 ESP_espModeActive 0 "00_NORMAL" 1 "01" 2 "02" 3 "03"; +VAL_ 325 ESP_lateralAccelQF 0 "UNDEFINABLE_ACCURACY" 1 "IN_SPEC"; +VAL_ 325 ESP_longitudinalAccelQF 0 "UNDEFINABLE_ACCURACY" 1 "IN_SPEC"; +VAL_ 325 ESP_ptcTargetState 0 "FAULT" 1 "BACKUP" 2 "ON" 3 "SNA"; +VAL_ 325 ESP_stabilityControlSts2 0 "INIT" 1 "ON" 2 "ENGAGED" 3 "FAULTED"; +VAL_ 325 ESP_steeringAngleQF 0 "UNDEFINABLE_ACCURACY" 1 "IN_SPEC"; +VAL_ 325 ESP_yawRateQF 0 "UNDEFINABLE_ACCURACY" 1 "IN_SPEC"; diff --git a/artifacts/package_runtime/iqdbc/dbc/tesla_model3_vehicle.dbc b/artifacts/package_runtime/iqdbc/dbc/tesla_model3_vehicle.dbc new file mode 100644 index 000000000..a8faeca93 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/tesla_model3_vehicle.dbc @@ -0,0 +1,406 @@ +VERSION "" + + +BU_: CH DIPF DIPR ETH FC HVI HVS PARTY SDCV VEH VIRT + + +BO_ 962 VCLEFT_switchStatus: 8 VEH + SG_ VCLEFT_frontBuckleSwitch m0: 48|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_btnWindowSwPackUpLF m0: 32|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_frontSeatTrackBack m0: 8|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_btnWindowSwPackAutoDownLF m0: 35|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowSwPackDownRR m0: 46|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowSwPackAutoUpRR m0: 45|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowSwPackAutoDownRR m0: 47|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_rightMirrorTilt m0: 5|3@1+ (1,0) [0|4] "" vcright + SG_ VCLEFT_btnWindowSwPackUpRR m0: 44|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_frontOccupancySwitch m0: 50|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_swcRightTiltLeft m1: 8|2@1+ (1,0) [0|3] "" das + SG_ VCLEFT_rearRightOccupancySwitch m0: 58|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_btnWindowSwPackDownLF m0: 34|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowSwPackAutoUpLF m0: 33|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_swcLeftTiltRight m1: 3|2@1+ (1,0) [0|3] "" das + SG_ VCLEFT_frontSeatBackrestForward m0: 22|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_swcRightTiltRight m1: 10|2@1+ (1,0) [0|3] "" das + SG_ VCLEFT_swcLeftScrollTicks m1: 16|6@1- (1,0) [-32|31] "" das + SG_ VCLEFT_btnWindowUpLR m1: 32|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowAutoDownLR m1: 35|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowSwPackDownRF m0: 42|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowSwPackAutoUpRF m0: 41|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_frontSeatLumbarIn m0: 28|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_frontSeatLiftUp m0: 18|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_btnWindowSwPackDownLR m0: 38|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowSwPackAutoUpLR m0: 37|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_frontSeatLumbarDown m0: 24|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_driverPresent m0: 4|1@1+ (1,0) [0|1] "" das + SG_ VCLEFT_frontSeatTiltDown m0: 12|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_frontSeatTrackForward m0: 10|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_rearLeftBuckleSwitch m0: 52|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_hazardButtonPressed m0: 3|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_swcRightScrollTicks m1: 24|6@1- (1,0) [-32|31] "" das + SG_ VCLEFT_swcRightPressed m1: 12|2@1+ (1,0) [0|3] "" das + SG_ VCLEFT_frontSeatLumbarOut m0: 30|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_brakePressed m0: 60|1@1+ (1,0) [0|1] "" di + SG_ VCLEFT_swcLeftTiltLeft m1: 14|2@1+ (1,0) [0|3] "" das + SG_ VCLEFT_swcLeftPressed m1: 5|2@1+ (1,0) [0|3] "" das + SG_ VCLEFT_btnWindowSwPackUpLR m0: 36|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_frontSeatTiltUp m0: 14|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_rearLeftOccupancySwitch m0: 56|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_frontSeatBackrestBack m0: 20|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_btnWindowSwPackAutoDownLR m0: 39|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_rearCenterOccupancySwitch m0: 54|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_frontSeatLumbarUp m0: 26|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_frontSeatLiftDown m0: 16|2@1+ (1,0) [0|3] "" gtw + SG_ VCLEFT_hornSwitchPressed m0: 2|1@1+ (1,0) [0|1] "" app + SG_ VCLEFT_btnWindowSwPackUpRF m0: 40|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowAutoUpLR m1: 33|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_btnWindowSwPackAutoDownRF m0: 43|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_switchStatusIndex M: 0|2@1+ (1,0) [0|2] "" X + SG_ VCLEFT_btnWindowDownLR m1: 34|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_rearHVACButtonPressed m0: 61|1@1+ (1,0) [0|1] "" gtw + +BO_ 259 VCRIGHT_doorStatus: 8 VEH + SG_ VCRIGHT_reservedForBackCompat : 28|2@1+ (1,0) [0|3] "" X + SG_ VCRIGHT_trunkLatchStatus : 56|4@1+ (1,0) [0|8] "" di + SG_ VCRIGHT_mirrorFoldState : 52|3@1+ (1,0) [0|4] "" gtw + SG_ VCRIGHT_rearLatchStatus : 4|4@1+ (1,0) [0|8] "" aps + SG_ VCRIGHT_mirrorTiltYPosition : 41|8@1+ (0.02,0) [0|5] "V" gtw + SG_ VCRIGHT_frontRelActuatorSwitch : 12|1@1+ (1,0) [0|1] "" gtw + SG_ VCRIGHT_mirrorRecallState : 60|3@1+ (1,0) [0|5] "" gtw + SG_ VCRIGHT_frontIntSwitchPressed : 31|1@1+ (1,0) [0|1] "" aps + SG_ VCRIGHT_mirrorState : 49|3@1+ (1,0) [0|4] "" gtw + SG_ VCRIGHT_rearRelActuatorSwitch : 13|1@1+ (1,0) [0|1] "" gtw + SG_ VCRIGHT_frontHandlePulledPersist : 30|1@1+ (1,0) [0|1] "" gtw + SG_ VCRIGHT_mirrorTiltXPosition : 33|8@1+ (0.02,0) [0|5] "V" gtw + SG_ VCRIGHT_mirrorDipped : 63|1@1+ (1,0) [0|1] "" X + SG_ VCRIGHT_frontHandlePulled : 10|1@1+ (1,0) [0|1] "" aps + SG_ VCRIGHT_frontLatchStatus : 0|4@1+ (1,0) [0|8] "" aps + SG_ VCRIGHT_rearHandlePulled : 11|1@1+ (1,0) [0|1] "" aps + SG_ VCRIGHT_frontHandlePWM : 14|7@1+ (1,0) [0|100] "%" X + SG_ VCRIGHT_frontLatchSwitch : 8|1@1+ (1,0) [0|1] "" gtw + SG_ VCRIGHT_rearLatchSwitch : 9|1@1+ (1,0) [0|1] "" gtw + SG_ VCRIGHT_rearHandlePWM : 21|7@1+ (1,0) [0|100] "%" X + SG_ VCRIGHT_rearIntSwitchPressed : 32|1@1+ (1,0) [0|1] "" aps + +BO_ 585 SCCM_leftStalk: 3 VEH + SG_ SCCM_leftStalkCounter : 8|4@1+ (1,0) [0|15] "" X + SG_ SCCM_washWipeButtonStatus : 14|2@1+ (1,0) [0|3] "" das + SG_ SCCM_turnIndicatorStalkStatus : 16|3@1+ (1,0) [0|5] "" das + SG_ SCCM_leftStalkCrc : 0|8@1+ (1,0) [0|255] "" X + SG_ SCCM_leftStalkReserved1 : 19|5@1+ (1,0) [0|31] "" X + SG_ SCCM_highBeamStalkStatus : 12|2@1+ (1,0) [0|3] "" das + +BO_ 280 DI_systemStatus: 8 VEH + SG_ DI_epbRequest : 44|2@1+ (1,0) [0|2] "" epbl + SG_ DI_systemStatusCounter : 8|4@1+ (1,0) [0|15] "" X + SG_ DI_proximity : 46|1@1+ (1,0) [0|1] "" bms + SG_ DI_keepAliveRequest : 47|1@1+ (1,0) [0|1] "" bms + SG_ DI_accelPedalPos : 32|8@1+ (0.4,0) [0|100] "%" vcfront + SG_ DI_gear : 21|3@1+ (1,0) [0|7] "" gtw + SG_ DI_tractionControlMode : 40|3@1+ (1,0) [0|5] "" X + SG_ DI_trackModeState : 48|2@1+ (1,0) [0|2] "" gtw + SG_ DI_regenLight : 26|1@1+ (1,0) [0|1] "" vcleft + SG_ DI_systemState : 16|3@1+ (1,0) [0|5] "" epbl + SG_ DI_immobilizerState : 27|3@1+ (1,0) [0|6] "" X + SG_ DI_systemStatusChecksum : 0|8@1+ (1,0) [0|255] "" X + SG_ DI_brakePedalState : 19|2@1+ (1,0) [0|2] "" vcleft + +BO_ 835 VCRIGHT_status: 8 VEH + SG_ VCRIGHT_5AVoltage : 18|10@1+ (0.005443676098,0) [0|5.56888] "V" gtw + SG_ VCRIGHT_loadShedPriority : 0|8@1+ (1,0) [0|255] "" X + SG_ VCRIGHT_rearDefrostState : 11|3@1+ (1,0) [0|4] "" gtw + SG_ VCRIGHT_vbatProt : 28|12@1+ (0.005443676098,0) [0|22.29185] "V" gtw + SG_ VCRIGHT_vehiclePowerStateDBG : 8|2@1+ (1,0) [0|3] "" gtw + SG_ VCRIGHT_swEnStatus : 10|1@1+ (1,0) [0|1] "" gtw + SG_ VCRIGHT_mirrorHeatState : 14|3@1+ (1,0) [0|4] "" X + SG_ VCRIGHT_OTAState : 17|1@1+ (1,0) [0|1] "" gtw + SG_ VCRIGHT_footwellLightCurrent : 40|12@1- (0.1,0) [-204.8|204.7] "mA" X + SG_ VCRIGHT_pcbaTemperature : 52|11@1+ (0.125,-40) [-40|150] "degC" gtw + +BO_ 553 SCCM_rightStalk: 3 VEH + SG_ SCCM_rightStalkCounter : 8|4@1+ (1,0) [0|15] "" X + SG_ SCCM_rightStalkCrc : 0|8@1+ (1,0) [0|255] "" X + SG_ SCCM_rightStalkReserved1 : 15|1@1+ (1,0) [0|1] "" X + SG_ SCCM_parkButtonStatus : 16|2@1+ (1,0) [0|3] "" das + SG_ SCCM_rightStalkReserved2 : 18|6@1+ (1,0) [0|63] "" X + SG_ SCCM_rightStalkStatus : 12|3@1+ (1,0) [0|6] "" das + +BO_ 297 SCCM_steeringAngleSensor: 8 VEH + SG_ SCCM_steeringAngleValidity : 30|2@1+ (1,0) [0|3] "" gtw + SG_ SCCM_supplierID : 12|2@1+ (1,0) [0|3] "" gtw + SG_ SCCM_steeringAngleSensorReservd1 : 46|2@1+ (1,0) [0|3] "" X + SG_ SCCM_steeringAngleCrc : 0|8@1+ (1,0) [0|255] "" gtw + SG_ SCCM_steeringAngleSensorStatus : 14|2@1+ (1,0) [0|3] "" aps + SG_ SCCM_steeringAngleSpeed : 32|14@1+ (0.5,-4096) [-4096|4095.5] "deg/s" das + SG_ SCCM_steeringAngle : 16|14@1+ (0.1,-819.2) [-819.2|819] "deg" aps + SG_ SCCM_steeringAngleSensorReservd2 : 48|8@1+ (1,0) [0|255] "" X + SG_ SCCM_steeringAngleCounter : 8|4@1+ (1,0) [0|15] "" gtw + SG_ SCCM_steeringAngleSensorReservd3 : 56|8@1+ (1,0) [0|255] "" X + +BO_ 258 VCLEFT_doorStatus: 8 VEH + SG_ VCLEFT_mirrorDipped : 61|1@1+ (1,0) [0|1] "" X + SG_ VCLEFT_frontHandlePulledPersist : 62|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_mirrorRecallState : 55|3@1+ (1,0) [0|5] "" gtw + SG_ VCLEFT_rearIntSwitchPressed : 32|1@1+ (1,0) [0|1] "" aps + SG_ VCLEFT_rearLatchSwitch : 9|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_rearHandlePWM : 24|7@1+ (1,0) [0|100] "%" X + SG_ VCLEFT_frontLatchSwitch : 8|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_frontHandlePWM : 16|7@1+ (1,0) [0|100] "%" X + SG_ VCLEFT_rearHandlePulled : 11|1@1+ (1,0) [0|1] "" aps + SG_ VCLEFT_rearLatchStatus : 4|4@1+ (1,0) [0|8] "" aps + SG_ VCLEFT_frontHandlePulled : 10|1@1+ (1,0) [0|1] "" aps + SG_ VCLEFT_mirrorTiltXPosition : 33|8@1+ (0.02,0) [0|5] "V" gtw + SG_ VCLEFT_mirrorState : 49|3@1+ (1,0) [0|4] "" gtw + SG_ VCLEFT_frontIntSwitchPressed : 31|1@1+ (1,0) [0|1] "" aps + SG_ VCLEFT_rearRelActuatorSwitch : 13|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_mirrorHeatState : 58|3@1+ (1,0) [0|4] "" X + SG_ VCLEFT_frontRelActuatorSwitch : 12|1@1+ (1,0) [0|1] "" gtw + SG_ VCLEFT_mirrorTiltYPosition : 41|8@1+ (0.02,0) [0|5] "V" gtw + SG_ VCLEFT_frontLatchStatus : 0|4@1+ (1,0) [0|8] "" aps + SG_ VCLEFT_mirrorFoldState : 52|3@1+ (1,0) [0|4] "" gtw + + +BO_ 568 STW_ACTN_RQ: 8 STW + SG_ SpdCtrlLvr_Stat : 0|6@1+ (1,0) [0|0] "" NEO + SG_ VSL_Enbl_Rq : 6|1@1+ (1,0) [0|0] "" NEO + SG_ SpdCtrlLvrStat_Inv : 7|1@1+ (1,0) [0|0] "" NEO + SG_ DTR_Dist_Rq : 8|8@1+ (1,0) [0|200] "" NEO + SG_ TurnIndLvr_Stat : 16|2@1+ (1,0) [0|0] "" NEO + SG_ HiBmLvr_Stat : 18|2@1+ (1,0) [0|0] "" NEO + SG_ WprWashSw_Psd : 20|2@1+ (1,0) [0|0] "" NEO + SG_ WprWash_R_Sw_Posn_V2 : 22|2@1+ (1,0) [0|0] "" NEO + SG_ StW_Lvr_Stat : 24|3@1+ (1,0) [0|0] "" NEO + SG_ StW_Cond_Flt : 27|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Cond_Psd : 28|2@1+ (1,0) [0|0] "" NEO + SG_ HrnSw_Psd : 30|2@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw00_Psd : 32|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw01_Psd : 33|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw02_Psd : 34|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw03_Psd : 35|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw04_Psd : 36|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw05_Psd : 37|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw06_Psd : 38|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw07_Psd : 39|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw08_Psd : 40|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw09_Psd : 41|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw10_Psd : 42|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw11_Psd : 43|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw12_Psd : 44|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw13_Psd : 45|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw14_Psd : 46|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw15_Psd : 47|1@1+ (1,0) [0|0] "" NEO + SG_ WprSw6Posn : 48|3@1+ (1,0) [0|0] "" NEO + SG_ MC_STW_ACTN_RQ : 52|4@1+ (1,0) [0|15] "" NEO + SG_ CRC_STW_ACTN_RQ : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 1001 DAS_bodyControls: 8 VEH + SG_ DAS_headlightRequest : 0|2@1+ (1,0) [0|3] "" aps + SG_ DAS_hazardLightRequest : 2|2@1+ (1,0) [0|3] "" aps + SG_ DAS_wiperSpeed : 4|4@1+ (1,0) [0|15] "" aps + SG_ DAS_turnIndicatorRequest : 8|3@1+ (1,0) [0|4] "" aps + SG_ DAS_highLowBeamDecision : 11|2@1+ (1,0) [0|3] "" aps + SG_ DAS_heaterRequest : 13|2@1+ (1,0) [0|2] "" aps + SG_ DAS_highLowBeamOffReason : 15|3@1+ (1,0) [0|5] "" aps + SG_ DAS_turnIndicatorRequestReason : 18|4@1+ (1,0) [0|12] "" aps + SG_ DAS_dynamicBrakeLightRequest : 22|1@1+ (1,0) [0|1] "" aps + SG_ DAS_radarHeaterRequest : 23|1@1+ (1,0) [0|1] "" aps + SG_ DAS_ahlbOverride : 24|1@1+ (1,0) [0|1] "" aps + SG_ DAS_mirrorFoldRequest : 25|2@1+ (1,0) [0|3] "" aps + SG_ DAS_bodyControlsCounter : 52|4@1+ (1,0) [0|15] "" aps + SG_ DAS_bodyControlsChecksum : 56|8@1+ (1,0) [0|255] "" aps + +BO_ 994 VCLEFT_lightStatus: 7 VEH + SG_ VCLEFT_turnSignalStatus : 4|2@1+ (1,0) [0|3] "" XXX + +BO_ 995 VCRIGHT_lightStatus: 2 VEH + SG_ VCRIGHT_turnSignalStatus : 4|2@1+ (1,0) [0|3] "" XXX + +BO_ 1013 ID3F5VCFRONT_lighting: 8 VEH + SG_ VCFRONT_lowBeamsCalibrated : 62|1@1+ (1,0) [0|1] "" Receiver + SG_ VCFRONT_lowBeamsOnForDRL : 61|1@1+ (1,0) [0|1] "" Receiver + SG_ VCFRONT_simLatchingStalk : 59|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_highBeamSwitchActive : 58|1@1+ (1,0) [0|1] "" Receiver + SG_ VCFRONT_parkRightStatus : 56|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_parkLeftStatus : 54|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_turnSignalRightStatus : 52|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_turnSignalLeftStatus : 50|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_sideRepeaterRightStatus : 48|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_sideRepeaterLeftStatus : 46|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_sideMarkersStatus : 44|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_fogRightStatus : 42|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_fogLeftStatus : 40|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_DRLRightStatus : 38|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_DRLLeftStatus : 36|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_highBeamRightStatus : 34|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_highBeamLeftStatus : 32|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_lowBeamRightStatus : 30|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_lowBeamLeftStatus : 28|2@1+ (1,0) [0|3] "" Receiver + SG_ VCFRONT_hazardSwitchBacklight : 27|1@1+ (1,0) [0|1] "" Receiver + SG_ VCFRONT_seeYouHomeLightingReq : 26|1@1+ (1,0) [0|1] "" Receiver + SG_ VCFRONT_approachLightingRequest : 25|1@1+ (1,0) [0|1] "" Receiver + SG_ VCFRONT_courtesyLightingRequest : 24|1@1+ (1,0) [0|1] "" Receiver + SG_ VCFRONT_switchLightingBrightness : 16|8@1+ (0.5,0) [0|127] "%" Receiver + SG_ VCFRONT_ambientLightingBrightnes : 8|8@1+ (0.5,0) [0|127] "%" Receiver + SG_ VCFRONT_hazardLightRequest : 4|4@1+ (1,0) [0|8] "" Receiver + SG_ VCFRONT_indicatorRightRequest : 2|2@1+ (1,0) [0|2] "" Receiver + SG_ VCFRONT_indicatorLeftRequest : 0|2@1+ (1,0) [0|2] "" Receiver + +BO_ 851 UI_status: 8 VehicleBus + SG_ UI_touchActive : 0|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_audioActive : 1|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_bluetoothActive : 2|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_cellActive : 3|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_displayReady : 4|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_displayOn : 5|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_wifiActive : 6|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_wifiConnected : 7|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_systemActive : 8|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_readyForDrive : 9|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_cellConnected : 10|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_vpnActive : 11|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_autopilotTrial : 12|2@1+ (1,0) [0|3] "" VehicleBus + SG_ UI_factoryReset : 14|2@1+ (1,0) [0|3] "" VehicleBus + SG_ UI_gpsActive : 16|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_screenshotActive : 17|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_radioActive : 18|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_cellNetworkTechnology : 19|4@1+ (1,0) [0|15] "" VehicleBus + SG_ UI_cellReceiverPower : 24|8@1+ (1,-128) [-128|127] "dB" VehicleBus + SG_ UI_falseTouchCounter : 32|8@1+ (1,0) [0|255] "1" VehicleBus + SG_ UI_developmentCar : 40|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_cameraActive : 41|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_cellSignalBars : 42|3@1+ (1,0) [0|7] "" VehicleBus + SG_ UI_trailerModeTelltale : 45|2@1+ (1,0) [0|3] "" VehicleBus + SG_ UI_pcbTemperature : 48|8@1- (1,40) [-87|167] "degC" VehicleBus + SG_ UI_cpuTemperature : 56|8@1- (1,40) [-87|167] "degC" VehicleBus + +BO_ 991 UI_status2: 8 VehicleBus + SG_ UI_mobileAppStepCount : 0|16@1+ (1,0) [0|65535] "" VehicleBus + SG_ UI_userRequestSnapshot : 16|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_touchDetected : 17|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_validDeviceForEUSummon : 18|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_locatedAtHome : 19|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_locatedAtWork : 20|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_locatedAtFavorite : 21|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_displayInDarkMode : 22|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_userActivity : 23|1@1+ (1,0) [0|1] "" VehicleBus + SG_ UI_activeTouchPoints : 24|8@1+ (1,0) [0|255] "" VehicleBus + SG_ UI_linkState : 32|2@1+ (1,0) [0|3] "" VehicleBus + SG_ UI_sentryModeState : 34|3@1+ (1,0) [0|7] "" VehicleBus + +VAL_ 568 SpdCtrlLvr_Stat 32 "DN_1ST" 16 "UP_1ST" 8 "DN_2ND" 4 "UP_2ND" 2 "RWD" 1 "FWD" 0 "IDLE" ; +VAL_ 568 DTR_Dist_Rq 255 "SNA" 200 "ACC_DIST_7" 166 "ACC_DIST_6" 133 "ACC_DIST_5" 100 "ACC_DIST_4" 66 "ACC_DIST_3" 33 "ACC_DIST_2" 0 "ACC_DIST_1" ; +VAL_ 568 TurnIndLvr_Stat 3 "SNA" 2 "RIGHT" 1 "LEFT" 0 "IDLE" ; +VAL_ 568 HiBmLvr_Stat 3 "SNA" 2 "HIBM_FLSH_ON_PSD" 1 "HIBM_ON_PSD" 0 "IDLE" ; +VAL_ 568 WprWashSw_Psd 3 "SNA" 2 "WASH" 1 "TIPWIPE" 0 "NPSD" ; +VAL_ 568 WprWash_R_Sw_Posn_V2 3 "SNA" 2 "WASH" 1 "INTERVAL" 0 "OFF" ; +VAL_ 568 StW_Lvr_Stat 4 "STW_BACK" 3 "STW_FWD" 2 "STW_DOWN" 1 "STW_UP" 0 "NPSD" ; +VAL_ 568 StW_Cond_Psd 3 "SNA" 2 "DOWN" 1 "UP" 0 "NPSD" ; +VAL_ 568 HrnSw_Psd 3 "SNA" 2 "NDEF2" 1 "PSD" 0 "NPSD" ; +VAL_ 568 StW_Sw00_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 568 StW_Sw01_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 568 StW_Sw03_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 568 StW_Sw04_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 568 WprSw6Posn 7 "SNA" 6 "STAGE2" 5 "STAGE1" 4 "INTERVAL4" 3 "INTERVAL3" 2 "INTERVAL2" 1 "INTERVAL1" 0 "OFF" ; + +VAL_ 1001 DAS_headlightRequest 3 "DAS_HEADLIGHT_REQUEST_INVALID" 1 "DAS_HEADLIGHT_REQUEST_ON" 0 "DAS_HEADLIGHT_REQUEST_OFF"; +VAL_ 1001 DAS_hazardLightRequest 3 "DAS_REQUEST_HAZARDS_SNA" 2 "DAS_REQUEST_HAZARDS_UNUSED" 0 "DAS_REQUEST_HAZARDS_OFF" 1 "DAS_REQUEST_HAZARDS_ON"; +VAL_ 1001 DAS_wiperSpeed 3 "DAS_WIPER_SPEED_3" 12 "DAS_WIPER_SPEED_12" 8 "DAS_WIPER_SPEED_8" 14 "DAS_WIPER_SPEED_14" 5 "DAS_WIPER_SPEED_5" 13 "DAS_WIPER_SPEED_13" 2 "DAS_WIPER_SPEED_2" 0 "DAS_WIPER_SPEED_OFF" 4 "DAS_WIPER_SPEED_4" 1 "DAS_WIPER_SPEED_1" 15 "DAS_WIPER_SPEED_INVALID" 10 "DAS_WIPER_SPEED_10" 11 "DAS_WIPER_SPEED_11" 7 "DAS_WIPER_SPEED_7" 9 "DAS_WIPER_SPEED_9" 6 "DAS_WIPER_SPEED_6"; +VAL_ 1001 DAS_turnIndicatorRequest 0 "DAS_TURN_INDICATOR_NONE" 2 "DAS_TURN_INDICATOR_RIGHT" 3 "DAS_TURN_INDICATOR_CANCEL" 1 "DAS_TURN_INDICATOR_LEFT"; +VAL_ 1001 DAS_highLowBeamDecision 2 "DAS_HIGH_BEAM_ON" 1 "DAS_HIGH_BEAM_OFF" 3 "DAS_HIGH_BEAM_SNA" 0 "DAS_HIGH_BEAM_UNDECIDED"; +VAL_ 1001 DAS_heaterRequest 0 "DAS_HEATER_SNA" 2 "DAS_HEATER_ON" 1 "DAS_HEATER_OFF"; +VAL_ 1001 DAS_turnIndicatorRequestReason 8 "DAS_ACTIVE_COMMANDED_LANE_CHANGE" 4 "DAS_CANCEL_LANE_CHANGE" 6 "DAS_ACTIVE_MERGE" 2 "DAS_ACTIVE_SPEED_LANE_CHANGE" 5 "DAS_CANCEL_FORK" 0 "DAS_NONE" 3 "DAS_ACTIVE_FORK" 7 "DAS_CANCEL_MERGE" 1 "DAS_ACTIVE_NAV_LANE_CHANGE"; + +VAL_ 1013 VCFRONT_DRLLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_DRLRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_ambientLightingBrightnes 255 "SNA" ; +VAL_ 1013 VCFRONT_fogLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_fogRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_hazardLightRequest 1 "HAZARD_REQUEST_BUTTON" 6 "HAZARD_REQUEST_CAR_ALARM" 5 "HAZARD_REQUEST_CRASH" 7 "HAZARD_REQUEST_DAS" 2 "HAZARD_REQUEST_LOCK" 4 "HAZARD_REQUEST_MISLOCK" 0 "HAZARD_REQUEST_NONE" 8 "HAZARD_REQUEST_UDS" 3 "HAZARD_REQUEST_UNLOCK" ; +VAL_ 1013 VCFRONT_highBeamLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_highBeamRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_indicatorLeftRequest 2 "TURN_SIGNAL_ACTIVE_HIGH" 1 "TURN_SIGNAL_ACTIVE_LOW" 0 "TURN_SIGNAL_OFF" ; +VAL_ 1013 VCFRONT_indicatorRightRequest 2 "TURN_SIGNAL_ACTIVE_HIGH" 1 "TURN_SIGNAL_ACTIVE_LOW" 0 "TURN_SIGNAL_OFF" ; +VAL_ 1013 VCFRONT_lowBeamLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_lowBeamRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_parkLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_parkRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_sideMarkersStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_sideRepeaterLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_sideRepeaterRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_simLatchingStalk 0 "SIMULATED_LATCHING_STALK_IDLE" 1 "SIMULATED_LATCHING_STALK_LEFT" 2 "SIMULATED_LATCHING_STALK_RIGHT" 3 "SIMULATED_LATCHING_STALK_SNA" ; +VAL_ 1013 VCFRONT_switchLightingBrightness 255 "SNA" ; +VAL_ 1013 VCFRONT_turnSignalLeftStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 1013 VCFRONT_turnSignalRightStatus 2 "LIGHT_FAULT" 0 "LIGHT_OFF" 1 "LIGHT_ON" 3 "LIGHT_SNA" ; +VAL_ 962 VCLEFT_frontBuckleSwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatTrackBack 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_rightMirrorTilt 4 "MIRROR_TILT_LEFT" 2 "MIRROR_TILT_UP" 3 "MIRROR_TILT_RIGHT" 0 "MIRROR_TILT_STOP" 1 "MIRROR_TILT_DOWN"; +VAL_ 962 VCLEFT_frontOccupancySwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_swcRightTiltLeft 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_rearRightOccupancySwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_swcLeftTiltRight 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatBackrestForward 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_swcRightTiltRight 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatLumbarIn 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatLiftUp 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatLumbarDown 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatTiltDown 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatTrackForward 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_rearLeftBuckleSwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_swcRightPressed 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatLumbarOut 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_swcLeftTiltLeft 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_swcLeftPressed 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatTiltUp 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_rearLeftOccupancySwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatBackrestBack 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_rearCenterOccupancySwitch 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatLumbarUp 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_frontSeatLiftDown 2 "SWITCH_ON" 0 "SWITCH_SNA" 3 "SWITCH_FAULT" 1 "SWITCH_OFF"; +VAL_ 962 VCLEFT_switchStatusIndex 1 "VCLEFT_SWITCH_STATUS_INDEX_1" 2 "VCLEFT_SWITCH_STATUS_INDEX_INVALID" 0 "VCLEFT_SWITCH_STATUS_INDEX_0"; +VAL_ 259 VCRIGHT_trunkLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA"; +VAL_ 259 VCRIGHT_mirrorFoldState 4 "MIRROR_FOLD_STATE_UNFOLDING" 1 "MIRROR_FOLD_STATE_FOLDED" 3 "MIRROR_FOLD_STATE_FOLDING" 0 "MIRROR_FOLD_STATE_UNKNOWN" 2 "MIRROR_FOLD_STATE_UNFOLDED"; +VAL_ 259 VCRIGHT_rearLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA"; +VAL_ 259 VCRIGHT_mirrorRecallState 5 "MIRROR_RECALL_STATE_RECALLING_STOPPED" 2 "MIRROR_RECALL_STATE_RECALLING_AXIS_2" 0 "MIRROR_RECALL_STATE_INIT" 3 "MIRROR_RECALL_STATE_RECALLING_COMPLETE" 4 "MIRROR_RECALL_STATE_RECALLING_FAILED" 1 "MIRROR_RECALL_STATE_RECALLING_AXIS_1"; +VAL_ 259 VCRIGHT_mirrorState 3 "MIRROR_STATE_FOLD_UNFOLD" 1 "MIRROR_STATE_TILT_X" 0 "MIRROR_STATE_IDLE" 2 "MIRROR_STATE_TILT_Y" 4 "MIRROR_STATE_RECALL"; +VAL_ 259 VCRIGHT_frontLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA"; +VAL_ 585 SCCM_washWipeButtonStatus 3 "SNA" 0 "NOT_PRESSED" 2 "2ND_DETENT" 1 "1ST_DETENT"; +VAL_ 585 SCCM_turnIndicatorStalkStatus 3 "DOWN_1" 5 "SNA" 0 "IDLE" 1 "UP_1" 4 "DOWN_2" 2 "UP_2"; +VAL_ 585 SCCM_highBeamStalkStatus 3 "SNA" 0 "IDLE" 1 "PULL" 2 "PUSH"; +VAL_ 280 DI_epbRequest 0 "DI_EPBREQUEST_NO_REQUEST" 1 "DI_EPBREQUEST_PARK" 2 "DI_EPBREQUEST_UNPARK"; +VAL_ 280 DI_keepAliveRequest 1 "KEEP_ALIVE" 0 "NO_REQUEST"; +VAL_ 280 DI_accelPedalPos 255 "SNA"; +VAL_ 280 DI_gear 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" 7 "DI_GEAR_SNA" 2 "DI_GEAR_R" 3 "DI_GEAR_N" 4 "DI_GEAR_D"; +VAL_ 280 DI_tractionControlMode 0 "TC_NORMAL" 1 "TC_SLIP_START" 4 "TC_ROLLS_MODE" 2 "TC_DEV_MODE_1" 5 "TC_DYNO_MODE" 3 "TC_DEV_MODE_2"; +VAL_ 280 DI_trackModeState 0 "TRACK_MODE_UNAVAILABLE" 1 "TRACK_MODE_AVAILABLE" 2 "TRACK_MODE_ON"; +VAL_ 280 DI_systemState 5 "DI_SYS_ENABLE" 1 "DI_SYS_IDLE" 2 "DI_SYS_STANDBY" 0 "DI_SYS_UNAVAILABLE" 3 "DI_SYS_FAULT" 4 "DI_SYS_ABORT"; +VAL_ 280 DI_immobilizerState 2 "DI_IMM_STATE_AUTHENTICATING" 0 "DI_IMM_STATE_INIT_SNA" 3 "DI_IMM_STATE_DISARMED" 4 "DI_IMM_STATE_IDLE" 6 "DI_IMM_STATE_FAULT" 1 "DI_IMM_STATE_REQUEST" 5 "DI_IMM_STATE_RESET"; +VAL_ 280 DI_brakePedalState 2 "INVALID" 0 "OFF" 1 "ON"; +VAL_ 835 VCRIGHT_rearDefrostState 2 "HEATER_STATE_OFF" 4 "HEATER_STATE_FAULT" 1 "HEATER_STATE_ON" 0 "HEATER_STATE_SNA" 3 "HEATER_STATE_OFF_UNAVAILABLE"; +VAL_ 835 VCRIGHT_vehiclePowerStateDBG 3 "VEHICLE_POWER_STATE_DRIVE" 1 "VEHICLE_POWER_STATE_CONDITIONING" 2 "VEHICLE_POWER_STATE_ACCESSORY" 0 "VEHICLE_POWER_STATE_OFF"; +VAL_ 835 VCRIGHT_mirrorHeatState 2 "HEATER_STATE_OFF" 4 "HEATER_STATE_FAULT" 1 "HEATER_STATE_ON" 0 "HEATER_STATE_SNA" 3 "HEATER_STATE_OFF_UNAVAILABLE"; +VAL_ 553 SCCM_parkButtonStatus 3 "SNA" 0 "NOT_PRESSED" 2 "INIT" 1 "PRESSED"; +VAL_ 553 SCCM_rightStalkStatus 3 "DOWN_1" 6 "SNA" 0 "IDLE" 5 "INIT" 1 "UP_1" 4 "DOWN_2" 2 "UP_2"; +VAL_ 297 SCCM_steeringAngleValidity 3 "SNA" 2 "INIT" 0 "INVALID" 1 "VALID"; +VAL_ 297 SCCM_steeringAngleSensorStatus 0 "OK" 1 "INIT" 2 "ERROR" 3 "ERROR_INIT"; +VAL_ 258 VCLEFT_mirrorRecallState 5 "MIRROR_RECALL_STATE_RECALLING_STOPPED" 2 "MIRROR_RECALL_STATE_RECALLING_AXIS_2" 0 "MIRROR_RECALL_STATE_INIT" 3 "MIRROR_RECALL_STATE_RECALLING_COMPLETE" 4 "MIRROR_RECALL_STATE_RECALLING_FAILED" 1 "MIRROR_RECALL_STATE_RECALLING_AXIS_1"; +VAL_ 258 VCLEFT_rearLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA"; +VAL_ 258 VCLEFT_mirrorState 3 "MIRROR_STATE_FOLD_UNFOLD" 1 "MIRROR_STATE_TILT_X" 0 "MIRROR_STATE_IDLE" 2 "MIRROR_STATE_TILT_Y" 4 "MIRROR_STATE_RECALL"; +VAL_ 258 VCLEFT_mirrorHeatState 2 "HEATER_STATE_OFF" 4 "HEATER_STATE_FAULT" 1 "HEATER_STATE_ON" 0 "HEATER_STATE_SNA" 3 "HEATER_STATE_OFF_UNAVAILABLE"; +VAL_ 258 VCLEFT_frontLatchStatus 8 "LATCH_FAULT" 2 "LATCH_CLOSED" 1 "LATCH_OPENED" 3 "LATCH_CLOSING" 7 "LATCH_DEFAULT" 4 "LATCH_OPENING" 5 "LATCH_AJAR" 6 "LATCH_TIMEOUT" 0 "LATCH_SNA"; +VAL_ 258 VCLEFT_mirrorFoldState 4 "MIRROR_FOLD_STATE_UNFOLDING" 1 "MIRROR_FOLD_STATE_FOLDED" 3 "MIRROR_FOLD_STATE_FOLDING" 0 "MIRROR_FOLD_STATE_UNKNOWN" 2 "MIRROR_FOLD_STATE_UNFOLDED"; + + +BO_ 826 ID33AUI_rangeSOC: 8 VehicleBus + SG_ UI_Range : 0|10@1+ (1,0) [0|1023] "mi" Receiver + SG_ UI_SOC : 48|7@1+ (1,0) [0|127] "%" Receiver + +BO_ 306 ID132HVBattAmpVolt: 8 VehicleBus + SG_ BattVoltage132 : 0|16@1+ (0.01,0) [0|655.35] "V" Receiver + +BO_ 950 ID3B6UI_odometer: 8 VehicleBus + SG_ UI_odometer : 0|32@1+ (0.001,0) [0|4294967.295] "km" Receiver + SG_ UI_odometerCounter : 52|4@1+ (1,0) [0|15] "" Receiver + SG_ UI_odometerChecksum : 56|8@1+ (1,0) [0|255] "" Receiver + +BO_ 658 ID292BMS_SOC: 8 VehicleBus + SG_ SOCUI292 : 10|10@1+ (0.1,0) [0|102.3] "%" Receiver diff --git a/artifacts/package_runtime/iqdbc/dbc/tesla_powertrain.dbc b/artifacts/package_runtime/iqdbc/dbc/tesla_powertrain.dbc new file mode 100644 index 000000000..8572ee20f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/tesla_powertrain.dbc @@ -0,0 +1,179 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: + NEO + MCU + GTW + EPAS + DI + ESP + SBW + STW + APP + DAS + XXX + +BO_ 262 DI_torque1: 8 DI + SG_ DI_torqueDriver : 0|13@1- (0.25,0) [-750|750] "Nm" NEO + SG_ DI_torque1Counter : 13|3@1+ (1,0) [0|0] "" NEO + SG_ DI_torqueMotor : 16|13@1- (0.25,0) [-750|750] "Nm" NEO + SG_ DI_soptState : 29|3@1+ (1,0) [0|0] "" NEO + SG_ DI_motorRPM : 32|16@1- (1,0) [-17000|17000] "RPM" NEO + SG_ DI_pedalPos : 48|8@1+ (0.4,0) [0|100] "%" NEO + SG_ DI_torque1Checksum : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 278 DI_torque2: 6 DI + SG_ DI_torqueEstimate : 0|12@1- (0.5,0) [-750|750] "Nm" NEO + SG_ DI_gear : 12|3@1+ (1,0) [0|0] "" NEO + SG_ DI_brakePedal : 15|1@1+ (1,0) [0|0] "" NEO + SG_ DI_vehicleSpeed : 16|12@1+ (0.05,-25) [-25|179.75] "MPH" NEO + SG_ DI_gearRequest : 28|3@1+ (1,0) [0|0] "" NEO + SG_ DI_torqueInterfaceFailure : 31|1@1+ (1,0) [0|0] "" NEO + SG_ DI_torque2Counter : 32|4@1+ (1,0) [0|0] "" NEO + SG_ DI_brakePedalState : 36|2@1+ (1,0) [0|0] "" NEO + SG_ DI_epbParkRequest : 38|1@1+ (1,0) [0|0] "" NEO + SG_ DI_epbInterfaceReady : 39|1@1+ (1,0) [0|0] "" NEO + SG_ DI_torque2Checksum : 40|8@1+ (1,0) [0|0] "" NEO + +BO_ 504 BrakeMessage: 8 XXX + SG_ driverBrakeStatus : 2|2@1+ (1,0) [0|3] "" XXX + +BO_ 568 STW_ACTN_RQ: 8 STW + SG_ SpdCtrlLvr_Stat : 0|6@1+ (1,0) [0|0] "" NEO + SG_ VSL_Enbl_Rq : 6|1@1+ (1,0) [0|0] "" NEO + SG_ SpdCtrlLvrStat_Inv : 7|1@1+ (1,0) [0|0] "" NEO + SG_ DTR_Dist_Rq : 8|8@1+ (1,0) [0|200] "" NEO + SG_ TurnIndLvr_Stat : 16|2@1+ (1,0) [0|0] "" NEO + SG_ HiBmLvr_Stat : 18|2@1+ (1,0) [0|0] "" NEO + SG_ WprWashSw_Psd : 20|2@1+ (1,0) [0|0] "" NEO + SG_ WprWash_R_Sw_Posn_V2 : 22|2@1+ (1,0) [0|0] "" NEO + SG_ StW_Lvr_Stat : 24|3@1+ (1,0) [0|0] "" NEO + SG_ StW_Cond_Flt : 27|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Cond_Psd : 28|2@1+ (1,0) [0|0] "" NEO + SG_ HrnSw_Psd : 30|2@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw00_Psd : 32|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw01_Psd : 33|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw02_Psd : 34|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw03_Psd : 35|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw04_Psd : 36|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw05_Psd : 37|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw06_Psd : 38|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw07_Psd : 39|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw08_Psd : 40|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw09_Psd : 41|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw10_Psd : 42|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw11_Psd : 43|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw12_Psd : 44|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw13_Psd : 45|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw14_Psd : 46|1@1+ (1,0) [0|0] "" NEO + SG_ StW_Sw15_Psd : 47|1@1+ (1,0) [0|0] "" NEO + SG_ WprSw6Posn : 48|3@1+ (1,0) [0|0] "" NEO + SG_ MC_STW_ACTN_RQ : 52|4@1+ (1,0) [0|15] "" NEO + SG_ CRC_STW_ACTN_RQ : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 598 DI_state: 8 DI + SG_ DI_systemState : 0|3@1+ (1,0) [0|0] "" NEO + SG_ DI_vehicleHoldState : 3|3@1+ (1,0) [0|0] "" NEO + SG_ DI_proximity : 6|1@1+ (1,0) [0|0] "" NEO + SG_ DI_driveReady : 7|1@1+ (1,0) [0|0] "" NEO + SG_ DI_regenLight : 8|1@1+ (1,0) [0|0] "" NEO + SG_ DI_state : 9|3@1+ (1,0) [0|0] "" NEO + SG_ DI_cruiseState : 12|4@1+ (1,0) [0|0] "" NEO + SG_ DI_analogSpeed : 16|12@1+ (0.1,0) [0|150] "speed" NEO + SG_ DI_immobilizerState : 28|3@1+ (1,0) [0|0] "" NEO + SG_ DI_speedUnits : 31|1@1+ (1,0) [0|1] "" NEO + SG_ DI_cruiseSet : 32|9@1+ (0.5,0) [0|255.5] "speed" NEO + SG_ DI_aebState : 41|3@1+ (1,0) [0|0] "" NEO + SG_ DI_stateCounter : 44|4@1+ (1,0) [0|0] "" NEO + SG_ DI_digitalSpeed : 48|8@1+ (1,0) [0|250] "" NEO + SG_ DI_stateChecksum : 56|8@1+ (1,0) [0|0] "" NEO + +BO_ 703 DAS_control: 8 GTW + SG_ DAS_setSpeed : 0|12@1+ (0.1,0) [0|409.4] "kph" DI,PM,APS + SG_ DAS_accState : 12|4@1+ (1,0) [0|0] "" DI,PM,APS + SG_ DAS_aebEvent : 16|2@1+ (1,0) [0|3] "" DI,PM,APS + SG_ DAS_jerkMin : 18|9@1+ (0.03,-15.232) [-15.232|0.098] "m/s^3" DI,PM,APS + SG_ DAS_jerkMax : 27|8@1+ (0.059,0) [0|15.045] "m/s^3" DI,PM,APS + SG_ DAS_accelMin : 35|9@1+ (0.04,-15) [-15|5.44] "m/s^2" DI,PM,APS + SG_ DAS_accelMax : 44|9@1+ (0.04,-15) [-15|5.44] "m/s^2" DI,PM,APS + SG_ DAS_controlCounter : 53|3@1+ (1,0) [0|0] "" DI,PM,APS + SG_ DAS_controlChecksum : 56|8@1+ (1,0) [0|0] "" DI,PM,APS + +VAL_ 262 DI_torqueDriver -4096 "SNA" ; +VAL_ 262 DI_torqueMotor -4096 "SNA" ; +VAL_ 262 DI_soptState 7 "SOPT_TEST_SNA" 4 "SOPT_TEST_NOT_RUN" 3 "SOPT_TEST_PASSED" 2 "SOPT_TEST_FAILED" 1 "SOPT_TEST_IN_PROGRESS" 0 "SOPT_PRE_TEST" ; +VAL_ 262 DI_motorRPM -32768 "SNA" ; +VAL_ 262 DI_pedalPos 255 "SNA" ; +VAL_ 278 DI_torqueEstimate -2048 "SNA" ; +VAL_ 278 DI_gear 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ; +VAL_ 278 DI_brakePedal 1 "Applied" 0 "Not_applied" ; +VAL_ 278 DI_vehicleSpeed 4095 "SNA" ; +VAL_ 278 DI_gearRequest 7 "DI_GEAR_SNA" 4 "DI_GEAR_D" 3 "DI_GEAR_N" 2 "DI_GEAR_R" 1 "DI_GEAR_P" 0 "DI_GEAR_INVALID" ; +VAL_ 278 DI_torqueInterfaceFailure 1 "TORQUE_INTERFACE_FAILED" 0 "TORQUE_INTERFACE_NORMAL" ; +VAL_ 278 DI_brakePedalState 3 "SNA" 2 "INVALID" 1 "ON" 0 "OFF" ; +VAL_ 278 DI_epbParkRequest 1 "Park_requested" 0 "No_request" ; +VAL_ 278 DI_epbInterfaceReady 1 "EPB_INTERFACE_READY" 0 "EPB_INTERFACE_NOT_READY" ; +VAL_ 504 driverBrakeStatus 2 "APPLIED" 1 "NOT_APPLIED" ; +VAL_ 568 SpdCtrlLvr_Stat 32 "DN_1ST" 16 "UP_1ST" 8 "DN_2ND" 4 "UP_2ND" 2 "RWD" 1 "FWD" 0 "IDLE" ; +VAL_ 568 DTR_Dist_Rq 255 "SNA" 200 "ACC_DIST_7" 166 "ACC_DIST_6" 133 "ACC_DIST_5" 100 "ACC_DIST_4" 66 "ACC_DIST_3" 33 "ACC_DIST_2" 0 "ACC_DIST_1" ; +VAL_ 568 TurnIndLvr_Stat 3 "SNA" 2 "RIGHT" 1 "LEFT" 0 "IDLE" ; +VAL_ 568 HiBmLvr_Stat 3 "SNA" 2 "HIBM_FLSH_ON_PSD" 1 "HIBM_ON_PSD" 0 "IDLE" ; +VAL_ 568 WprWashSw_Psd 3 "SNA" 2 "WASH" 1 "TIPWIPE" 0 "NPSD" ; +VAL_ 568 WprWash_R_Sw_Posn_V2 3 "SNA" 2 "WASH" 1 "INTERVAL" 0 "OFF" ; +VAL_ 568 StW_Lvr_Stat 4 "STW_BACK" 3 "STW_FWD" 2 "STW_DOWN" 1 "STW_UP" 0 "NPSD" ; +VAL_ 568 StW_Cond_Psd 3 "SNA" 2 "DOWN" 1 "UP" 0 "NPSD" ; +VAL_ 568 HrnSw_Psd 3 "SNA" 2 "NDEF2" 1 "PSD" 0 "NPSD" ; +VAL_ 568 StW_Sw00_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 568 StW_Sw01_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 568 StW_Sw03_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 568 StW_Sw04_Psd 1 "PRESSED" 0 "NOT_PRESSED_SNA" ; +VAL_ 568 WprSw6Posn 7 "SNA" 6 "STAGE2" 5 "STAGE1" 4 "INTERVAL4" 3 "INTERVAL3" 2 "INTERVAL2" 1 "INTERVAL1" 0 "OFF" ; +VAL_ 598 DI_aebState 2 "ENABLED" 4 "FAULT" 7 "SNA" 1 "STANDBY" 3 "STANDSTILL" 0 "UNAVAILABLE" ; +VAL_ 598 DI_analogSpeed 4095 "SNA" ; +VAL_ 598 DI_cruiseState 2 "ENABLED" 5 "FAULT" 0 "OFF" 4 "OVERRIDE" 7 "PRE_CANCEL" 6 "PRE_FAULT" 1 "STANDBY" 3 "STANDSTILL" ; +VAL_ 598 DI_digitalSpeed 255 "SNA" ; +VAL_ 598 DI_immobilizerState 2 "AUTHENTICATING" 3 "DISARMED" 6 "FAULT" 4 "IDLE" 0 "INIT_SNA" 1 "REQUEST" 5 "RESET" ; +VAL_ 598 DI_speedUnits 1 "KPH" 0 "MPH" ; +VAL_ 598 DI_state 3 "ABORT" 4 "ENABLE" 2 "FAULT" 1 "STANDBY" 0 "UNAVAILABLE" ; +VAL_ 598 DI_systemState 3 "ABORT" 4 "ENABLE" 2 "FAULT" 1 "STANDBY" 0 "UNAVAILABLE" ; +VAL_ 598 DI_vehicleHoldState 2 "BLEND_IN" 4 "BLEND_OUT" 6 "FAULT" 7 "INIT" 5 "PARK" 1 "STANDBY" 3 "STANDSTILL" 0 "UNAVAILABLE" ; +VAL_ 703 DAS_setSpeed 4095 "SNA" ; +VAL_ 703 DAS_accState 15 "FAULT_SNA" 13 "ACC_CANCEL_GENERIC_SILENT" 11 "APC_SELFPARK_START" 10 "APC_UNPARK_COMPLETE" 9 "APC_PAUSE" 8 "APC_ABORT" 7 "APC_COMPLETE" 6 "APC_FORWARD" 5 "APC_BACKWARD" 4 "ACC_ON" 3 "ACC_HOLD" 0 "ACC_CANCEL_GENERIC" ; +VAL_ 703 DAS_aebEvent 3 "AEB_SNA" 2 "AEB_FAULT" 1 "AEB_ACTIVE" 0 "AEB_NOT_ACTIVE" ; +VAL_ 703 DAS_jerkMin 511 "SNA" ; +VAL_ 703 DAS_jerkMax 255 "SNA" ; +VAL_ 703 DAS_accelMin 511 "SNA" ; +VAL_ 703 DAS_accelMax 511 "SNA" ; \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/tesla_radar_bosch_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/tesla_radar_bosch_generated.dbc new file mode 100644 index 000000000..cdd03908a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/tesla_radar_bosch_generated.dbc @@ -0,0 +1,1373 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "tesla_radar_bosch.dbc starts here"; + +VERSION "" + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: Autopilot Radar Diag + + +BO_ 769 TeslaRadarSguInfo: 8 Radar + SG_ RADC_VerticalMisalignment : 0|8@1+ (1,0) [0|255] "" Autopilot + SG_ RADC_SCUTemperature : 8|8@1+ (1,-128) [-128|127] "" Autopilot + SG_ RADC_VMA_Plaus : 16|8@1+ (1,0) [0|255] "" Autopilot + SG_ RADC_SGU_ITC : 24|8@1+ (1,0) [0|255] "" Autopilot + SG_ RADC_HorizontMisalignment : 32|12@1+ (1,0) [0|4096] "" Autopilot + SG_ RADC_SensorDirty : 44|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_HWFail : 45|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_SGUFail : 46|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_SGUInfoConsistBit : 47|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 770 TeslaRadarTguInfo: 8 Radar + SG_ RADC_ACCTargObj1_sguIndex : 0|6@1+ (1,0) [0|63] "" Autopilot + SG_ RADC_ACCTargObj2_sguIndex : 6|6@1+ (1,0) [0|63] "" Autopilot + SG_ RADC_ACCTargObj3_sguIndex : 12|6@1+ (1,0) [0|63] "" Autopilot + SG_ RADC_ACCTargObj4_sguIndex : 18|6@1+ (1,0) [0|63] "" Autopilot + SG_ RADC_ACCTargObj5_sguIndex : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ unused30 : 30|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_TGUInfoConsistBit : 31|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_ACCTargObj1_dBPower : 32|16@1+ (1,0) [0|65535] "" Autopilot + SG_ RADC_ACCTargObj5_dBPower : 48|16@1+ (1,0) [0|65535] "" Autopilot + +BO_ 1281 TeslaRadarAlertMatrix: 8 Radar + SG_ RADC_a001_ecuInternalPerf : 0|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a002_flashPerformance : 1|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a003_vBatHigh : 2|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a004_adjustmentNotDone : 3|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a005_adjustmentReq : 4|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a006_adjustmentNotOk : 5|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a007_sensorBlinded : 6|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a008_plantModeActive : 7|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a009_configMismatch : 8|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a010_canBusOff : 9|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a011_bdyMIA : 10|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a012_espMIA : 11|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a013_gtwMIA : 12|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a014_sccmMIA : 13|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a015_adasMIA : 14|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a016_bdyInvalidCount : 15|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a017_adasInvalidCount : 16|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a018_espInvalidCount : 17|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a019_sccmInvalidCount : 18|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a020_bdyInvalidChkSm : 19|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a021_espInvalidChkSm : 20|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a022_sccmInvalidChkSm : 21|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a023_sccmInvalidChkSm : 22|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a024_absValidity : 23|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a025_ambTValidity : 24|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a026_brakeValidity : 25|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a027_CntryCdValidity : 26|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a028_espValidity : 27|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a029_longAccOffValidity : 28|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a030_longAccValidity : 29|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a031_odoValidity : 30|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a032_gearValidity : 31|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a033_steerAngValidity : 32|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a034_steerAngSpdValidity : 33|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a035_indctrValidity : 34|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a036_vehStandStillValidity : 35|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a037_vinValidity : 36|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a038_whlRotValidity : 37|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a039_whlSpdValidity : 38|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a040_whlStandStillValidity : 39|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a041_wiperValidity : 40|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a042_xwdValidity : 41|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a043_yawOffValidity : 42|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a044_yawValidity : 43|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a045_bsdSanity : 44|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a046_rctaSanity : 45|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a047_lcwSanity : 46|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a048_steerAngOffSanity : 47|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a049_tireSizeSanity : 48|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a050_velocitySanity : 49|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a051_yawSanity : 50|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a052_radomeHtrInop : 51|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a053_espmodValidity : 52|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a054_gtwmodValidity : 53|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a055_stwmodValidity : 54|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a056_bcmodValidity : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a057_dimodValidity : 56|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a058_opmodValidity : 57|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a059_drmiInvalidChkSm : 58|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a060_drmiInvalidCount : 59|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a061_radPositionMismatch : 60|1@1+ (1,0) [0|1] "" Autopilot + SG_ RADC_a062_strRackMismatch : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ unused62 : 62|2@1+ (1,0) [0|3] "" Autopilot + +BO_ 784 RadarPoint0_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 785 RadarPoint0_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 787 RadarPoint1_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 788 RadarPoint1_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 790 RadarPoint2_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 791 RadarPoint2_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 793 RadarPoint3_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 794 RadarPoint3_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 796 RadarPoint4_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 797 RadarPoint4_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 799 RadarPoint5_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 800 RadarPoint5_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 802 RadarPoint6_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 803 RadarPoint6_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 805 RadarPoint7_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 806 RadarPoint7_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 808 RadarPoint8_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 809 RadarPoint8_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 811 RadarPoint9_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 812 RadarPoint9_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 814 RadarPoint10_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 815 RadarPoint10_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 817 RadarPoint11_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 818 RadarPoint11_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 820 RadarPoint12_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 821 RadarPoint12_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 823 RadarPoint13_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 824 RadarPoint13_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 826 RadarPoint14_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 827 RadarPoint14_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 829 RadarPoint15_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 830 RadarPoint15_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 832 RadarPoint16_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 833 RadarPoint16_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 835 RadarPoint17_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 836 RadarPoint17_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 838 RadarPoint18_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 839 RadarPoint18_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 841 RadarPoint19_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 842 RadarPoint19_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 844 RadarPoint20_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 845 RadarPoint20_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 847 RadarPoint21_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 848 RadarPoint21_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 850 RadarPoint22_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 851 RadarPoint22_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 853 RadarPoint23_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 854 RadarPoint23_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 856 RadarPoint24_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 857 RadarPoint24_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 859 RadarPoint25_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 860 RadarPoint25_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 862 RadarPoint26_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 863 RadarPoint26_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 865 RadarPoint27_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 866 RadarPoint27_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 868 RadarPoint28_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 869 RadarPoint28_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 871 RadarPoint29_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 872 RadarPoint29_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 874 RadarPoint30_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 875 RadarPoint30_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 877 RadarPoint31_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 878 RadarPoint31_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 881 ProcessedRadarPoint1_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 882 ProcessedRadarPoint1_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 884 ProcessedRadarPoint2_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 885 ProcessedRadarPoint2_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 887 ProcessedRadarPoint3_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 888 ProcessedRadarPoint3_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 890 ProcessedRadarPoint4_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 891 ProcessedRadarPoint4_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 893 ProcessedRadarPoint5_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 894 ProcessedRadarPoint5_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 697 VIN_VIP_405HS: 8 Autopilot + SG_ VIN_MuxID M : 0|8@1+ (1,0) [0|0] "" Radar + SG_ VIN_Part1 m16 : 47|24@0+ (1,0) [0|16777215] "" Radar + SG_ VIN_Part2 m17 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar + SG_ VIN_Part3 m18 : 15|56@0+ (1,0) [0|7.2057594038E+16] "" Radar + +BO_ 681 Msg2A9_GTW_carConfig: 8 Autopilot + SG_ Msg2A9_Always0x02 : 48|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Always0x10 : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Always0x16 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Always0x41 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Value1_0x02 : 0|3@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_FourWheelDrive : 3|2@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Value2_0x02 : 5|3@1+ (1,0) [0|0] "" Radar + SG_ Msg2A9_Always0x43 : 16|8@1+ (1,0) [0|0] "" Radar + +BO_ 409 Msg199_STW_ANGLHP_STAT: 8 Autopilot + SG_ Msg199Always0x04 : 32|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Always0x20 : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Always0x2F : 0|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Always0x67 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Always0xFF : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Checksum : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg199Counter : 52|4@1+ (1,0) [0|0] "" Radar + +BO_ 361 Msg169_ESP_wheelSpeeds: 8 Autopilot + SG_ ESP_wheelSpeedFrL_HS : 0|13@1+ (0.04,0) [0|327.64] "km/h" Radar + SG_ ESP_wheelSpeedFrR_HS : 13|13@1+ (0.04,0) [0|327.64] "km/h" Radar + SG_ ESP_wheelSpeedReL_HS : 26|13@1+ (0.04,0) [0|327.64] "km/h" Radar + SG_ ESP_wheelSpeedReR_HS : 39|13@1+ (0.04,0) [0|327.64] "km/h" Radar + SG_ Msg169Checksum : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg169Counter : 52|4@1+ (1,0) [0|0] "" Radar + +BO_ 345 Msg159_ESP_C: 8 Autopilot + SG_ Msg159Always0x3A : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg159Always0xA5 : 0|8@1+ (1,0) [0|0] "" Radar + SG_ Msg159Always0xCF : 32|8@1+ (1,0) [0|0] "" Radar + SG_ Msg159Always0xF4 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg159Counter : 44|4@1+ (1,0) [0|0] "" Radar + SG_ Msg159Checksum : 24|8@1+ (1,0) [0|0] "" Radar + +BO_ 329 Msg149_ESP_145h: 8 Autopilot + SG_ Msg149Always0x02 : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0x04 : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0x26 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0x6A : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0xAA : 32|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Always0xF : 48|4@1+ (1,0) [0|0] "" Radar + SG_ Msg149Checksum : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg149Counter : 52|4@1+ (1,0) [0|0] "" Radar + +BO_ 297 Msg129_ESP_115h: 6 Autopilot + SG_ Msg129Always0x20 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg129Checksum : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg129Counter : 36|4@1+ (1,0) [0|0] "" Radar + +BO_ 281 Msg119_DI_torque2: 6 Autopilot + SG_ Msg119Always0x11 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Always0x1F : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Always0x8 : 36|4@1+ (1,0) [0|0] "" Radar + SG_ Msg119Always0xF4 : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Always0xFF : 0|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Checksum : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg119Counter : 32|4@1+ (1,0) [0|0] "" Radar + +BO_ 265 Msg109_DI_torque1: 8 Autopilot + SG_ Msg109Always0x80 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg109Checksum : 56|8@1+ (1,0) [0|0] "" Radar + SG_ Msg109Counter : 13|3@1+ (1,0) [0|0] "" Radar + +BO_ 521 Msg209_GTW_odo: 8 Autopilot + SG_ Msg209Always0x61 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x94 : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x52 : 24|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x13 : 32|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x03 : 40|8@1+ (1,0) [0|0] "" Radar + SG_ Msg209Always0x80 : 48|8@1+ (1,0) [0|0] "" Radar + +BO_ 537 Msg219_STW_ACTN_RQ: 8 Autopilot + SG_ Msg219Counter : 52|4@1+ (1,0) [0|15] "" Radar + SG_ Msg219CRC : 56|8@1+ (1,0) [0|0] "" Radar + +BO_ 425 Msg1A9_DI_espControl: 5 Autopilot + SG_ Msg1A9Always0x0C : 16|8@1+ (1,0) [0|0] "" Radar + SG_ Msg1A9Counter : 28|4@1+ (1,0) [0|0] "" Radar + SG_ Msg1A9Checksum : 32|8@1+ (1,0) [0|0] "" Radar + +BO_ 729 Msg2D9_BC_status : 8 Autopilot + SG_ Msg2D9Always0x80 : 0|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2D9Always0x40 : 8|8@1+ (1,0) [0|0] "" Radar + SG_ Msg2D9Always0x83 : 16|8@1+ (1,0) [0|0] "" Radar + +BO_ 1601 UDS_radarRequest: 8 Diag + SG_ UDS_radarRequestData : 7|64@0+ (1,0) [0|0] "" Radar + +BO_ 1617 Radar_udsResponse: 8 Radar + SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|0] "" Diag + +CM_ BO_ 697 "Start with MuxID 0x12, then 0x11 and finally 0x10 (VIN is then transmitted in the reverse order)"; +CM_ BO_ 681 "Message sent every 1000 ms. All fixed bytes, no checksum, the byte for RWD or AWD needs to match VIN config"; +CM_ BO_ 409 "Message sent every 10ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo"; +CM_ BO_ 361 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x76"; +CM_ BO_ 345 "Message sent every 20ms. Checksum : Sum of all first bytes + 0xc; place checksum in 4th octet"; +CM_ BO_ 329 "Message sent every 20ms. Checksum : Sum of all first 7 bytes + 0x46"; +CM_ BO_ 297 "Message sent every 20ms. Checksum : Sum of all first 5 bytes + 0x16"; +CM_ BO_ 281 "Message sent every 10ms. Checksum : Sum of all first 5 bytes + 0x17"; +CM_ BO_ 265 "Message sent every 10ms. Checksum : Sum of all first 7 bytes + 0x7"; +CM_ BO_ 521 "Message sent every 100ms. All fixed bytes, no checksum."; +CM_ BO_ 537 "Message sent every 100ms. Checksum : use all first 7 bytes with the SAE J1850 CRC algo"; +CM_ BO_ 425 "Message sent every 20ms. Checksum : Sum of all first 4 bytes + 0x38"; +CM_ BO_ 729 "Message sent every 1000ms. All fixed bytes, no checksum."; + +BA_DEF_ "BusType" STRING ; +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 0; +BA_DEF_ SG_ "FieldType" STRING ; + +BA_DEF_DEF_ "BusType" "CAN"; +BA_DEF_DEF_ "FieldType" ""; +BA_DEF_DEF_ "GenMsgCycleTime" 0; + +BA_ "GenMsgCycleTime" BO_ 697 250; +BA_ "GenMsgCycleTime" BO_ 681 1000; +BA_ "GenMsgCycleTime" BO_ 409 10; +BA_ "GenMsgCycleTime" BO_ 361 10; +BA_ "GenMsgCycleTime" BO_ 345 20; +BA_ "GenMsgCycleTime" BO_ 329 20; +BA_ "GenMsgCycleTime" BO_ 297 20; +BA_ "GenMsgCycleTime" BO_ 281 10; +BA_ "GenMsgCycleTime" BO_ 265 10; +BA_ "GenMsgCycleTime" BO_ 521 100; +BA_ "GenMsgCycleTime" BO_ 537 100; +BA_ "GenMsgCycleTime" BO_ 425 20; +BA_ "GenMsgCycleTime" BO_ 729 1000; + +VAL_ 681 Msg2A9_FourWheelDrive 3 "SNA" 2 "UNUSED" 1 "4WD" 0 "2WD" ; +VAL_ 785 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 785 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 788 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 788 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 791 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 791 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 794 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 794 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 797 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 797 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 800 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 800 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 803 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 803 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 806 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 806 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 809 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 809 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 812 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 812 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 815 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 815 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 818 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 818 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 821 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 821 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 824 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 824 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 827 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 827 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 830 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 830 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 833 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 833 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 836 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 836 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 839 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 839 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 842 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 842 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 845 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 845 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 848 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 848 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 851 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 851 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 854 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 854 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 857 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 857 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 860 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 860 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 863 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 863 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 866 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 866 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 869 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 869 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 872 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 872 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 875 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 875 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 878 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 878 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 882 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 882 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 885 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 885 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 888 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 888 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 891 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 891 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 894 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 894 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/tesla_radar_continental_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/tesla_radar_continental_generated.dbc new file mode 100644 index 000000000..9a543b345 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/tesla_radar_continental_generated.dbc @@ -0,0 +1,1262 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + +CM_ "tesla_radar_continental.dbc starts here"; + +VERSION "" + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: Autopilot Radar Diag + +BO_ 1025 RadarStatus: 8 Radar + SG_ carparkDetected : 29|1@1+ (1,0) [0|1] "" Autopilot + SG_ decreaseBlockage : 25|1@1+ (1,0) [0|1] "" Autopilot + SG_ horizontMisalignment : 8|12@1+ (0.00012207,-0.25) [-0.25|0.249878] "rad" Autopilot + SG_ increaseBlockage : 24|1@1+ (1,0) [0|1] "" Autopilot + SG_ lowPowerMode : 20|2@1+ (1,0) [0|3] "" Autopilot + SG_ powerOnSelfTest : 22|1@1+ (1,0) [0|1] "" Autopilot + SG_ sensorBlocked : 26|1@1+ (1,0) [0|1] "" Autopilot + SG_ sensorInfoConsistBit : 30|1@1+ (1,0) [0|1] "" Autopilot + SG_ sensorReplace : 31|1@1+ (1,0) [0|1] "" Autopilot + SG_ shortTermUnavailable : 23|1@1+ (1,0) [0|1] "" Autopilot + SG_ tunnelDetected : 28|1@1+ (1,0) [0|1] "" Autopilot + SG_ vehDynamicsError : 27|1@1+ (1,0) [0|1] "" Autopilot + SG_ verticalMisalignment : 0|8@1+ (0.00195313,-0.25) [-0.25|0.248047] "rad" Autopilot + +BO_ 1617 Radar_udsResponse: 8 Radar + SG_ Radar_udsResponseData : 7|64@0+ (1,0) [0|1.84467e+19] "" Diag + +BO_ 1601 UDS_radcRequest: 8 Diag + SG_ UDS_radcRequestData : 7|64@0+ (1,0) [0|1.84467e+19] "" Radar + +BO_ 1040 RadarPoint0_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1041 RadarPoint0_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1042 RadarPoint1_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1043 RadarPoint1_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1044 RadarPoint2_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1045 RadarPoint2_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1046 RadarPoint3_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1047 RadarPoint3_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1048 RadarPoint4_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1049 RadarPoint4_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1050 RadarPoint5_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1051 RadarPoint5_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1052 RadarPoint6_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1053 RadarPoint6_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1054 RadarPoint7_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1055 RadarPoint7_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1056 RadarPoint8_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1057 RadarPoint8_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1058 RadarPoint9_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1059 RadarPoint9_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1060 RadarPoint10_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1061 RadarPoint10_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1062 RadarPoint11_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1063 RadarPoint11_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1064 RadarPoint12_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1065 RadarPoint12_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1066 RadarPoint13_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1067 RadarPoint13_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1068 RadarPoint14_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1069 RadarPoint14_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1070 RadarPoint15_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1071 RadarPoint15_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1072 RadarPoint16_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1073 RadarPoint16_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1074 RadarPoint17_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1075 RadarPoint17_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1076 RadarPoint18_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1077 RadarPoint18_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1078 RadarPoint19_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1079 RadarPoint19_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1080 RadarPoint20_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1081 RadarPoint20_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1082 RadarPoint21_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1083 RadarPoint21_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1084 RadarPoint22_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1085 RadarPoint22_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1086 RadarPoint23_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1087 RadarPoint23_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1088 RadarPoint24_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1089 RadarPoint24_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1090 RadarPoint25_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1091 RadarPoint25_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1092 RadarPoint26_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1093 RadarPoint26_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1094 RadarPoint27_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1095 RadarPoint27_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1096 RadarPoint28_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1097 RadarPoint28_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1098 RadarPoint29_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1099 RadarPoint29_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1100 RadarPoint30_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1101 RadarPoint30_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1102 RadarPoint31_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1103 RadarPoint31_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1104 RadarPoint32_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1105 RadarPoint32_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1106 RadarPoint33_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1107 RadarPoint33_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1108 RadarPoint34_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1109 RadarPoint34_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1110 RadarPoint35_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1111 RadarPoint35_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1112 RadarPoint36_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1113 RadarPoint36_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1114 RadarPoint37_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1115 RadarPoint37_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1116 RadarPoint38_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1117 RadarPoint38_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1118 RadarPoint39_A: 8 Radar + SG_ LongDist : 0|12@1+ (0.0625,0) [0|255.9] "meters" Autopilot + SG_ LongSpeed : 12|12@1+ (0.0625,-128) [-128|128] "meters/sec" Autopilot + SG_ LatDist : 24|11@1+ (0.125,-128) [-128|128] "meters" Autopilot + SG_ ProbExist : 35|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ LongAccel : 40|10@1+ (0.03125,-16) [-16|16] "meters/sec/sec" Autopilot + SG_ ProbObstacle : 50|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Valid : 55|1@1+ (1,0) [0|1] "" Autopilot + SG_ ProbNonObstacle : 56|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Meas : 61|1@1+ (1,0) [0|1] "" Autopilot + SG_ Tracked : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index : 63|1@1+ (1,0) [0|1] "" Autopilot + +BO_ 1119 RadarPoint39_B: 8 Radar + SG_ LatSpeed : 0|10@1+ (0.125,-64) [-64|64] "meters/sec" Autopilot + SG_ Length : 10|6@1+ (0.125,0) [0|7.875] "m" Autopilot + SG_ dZ : 16|6@1+ (0.25,-5) [-5|10.75] "m" Autopilot + SG_ MovingState : 22|2@1+ (1,0) [0|3] "" Autopilot + SG_ dxSigma : 24|6@1+ (1,0) [0|63] "" Autopilot + SG_ vxSigma : 30|6@1+ (1,0) [0|63] "" Autopilot + SG_ axSigma : 36|6@1+ (1,0) [0|63] "" Autopilot + SG_ dySigma : 42|6@1+ (1,0) [0|63] "" Autopilot + SG_ ProbClass : 48|5@1+ (3.125,0) [0|96.875] "%" Autopilot + SG_ Class : 53|3@1+ (1,0) [0|7] "" Autopilot + SG_ dxRearEndLoss : 56|6@1+ (1,0) [0|63] "" Autopilot + SG_ NotUsed : 62|1@1+ (1,0) [0|1] "" Autopilot + SG_ Index2 : 63|1@1+ (1,0) [0|1] "" Autopilot + +VAL_ 1025 lowPowerMode 1 "COMMANDED_LOW_POWER" 0 "DEFAULT_LOW_POWER" 2 "NORMAL_POWER" 3 "SNA"; +VAL_ 1041 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1041 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1043 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1043 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1045 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1045 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1047 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1047 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1049 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1049 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1051 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1051 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1053 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1053 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1055 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1055 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1057 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1057 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1059 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1059 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1061 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1061 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1063 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1063 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1065 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1065 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1067 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1067 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1069 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1069 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1071 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1071 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1073 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1073 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1075 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1075 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1077 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1077 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1079 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1079 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1081 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1081 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1083 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1083 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1085 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1085 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1087 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1087 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1089 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1089 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1091 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1091 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1093 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1093 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1095 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1095 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1097 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1097 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1099 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1099 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1101 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1101 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1103 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1103 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1105 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1105 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1107 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1107 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1109 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1109 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1111 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1111 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1113 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1113 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1115 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1115 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1117 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1117 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; +VAL_ 1119 MovingState 3 "RADAR_MOVESTATE_STANDING" 2 "RADAR_MOVESTATE_STOPPED" 1 "RADAR_MOVESTATE_MOVING" 0 "RADAR_MOVESTATE_INDETERMINATE" ; +VAL_ 1119 Class 4 "RADAR_CLASS_CONSTRUCTION_ELEMENT" 3 "RADAR_CLASS_MOVING_PEDESTRIAN" 2 "RADAR_CLASS_MOVING_TWO_WHEEL_VEHICLE" 1 "RADAR_CLASS_MOVING_FOUR_WHEEL_VEHICLE" 0 "RADAR_CLASS_UNKNOWN" ; \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_2017_ref_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_2017_ref_pt.dbc new file mode 100644 index 000000000..17cd8f1b3 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_2017_ref_pt.dbc @@ -0,0 +1,1638 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: AFS BSR CGW CSR DS1 FCM FRD KSS MAV SCS Vector__XXX + + +BO_ 1196 ABG1D50: 8 CGW + SG_ DRABG01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1212 ABG1D51: 8 CGW + SG_ DRABG09 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG10 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG11 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG12 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG13 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG14 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG15 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRABG16 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 945 ABG1S01: 8 CGW + SG_ CDT : 22|3@0+ (1,0) [0|0] "" DS1 + SG_ AB : 19|2@0+ (1,0) [0|0] "" DS1 + SG_ DBKLAB : 17|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PODT : 27|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PBKLAB : 25|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ EDRTRG : 44|2@0+ (1,0) [0|0] "" DS1 + +BO_ 836 ACC1F01: 8 DS1 + SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX + SG_ DS1STAT2 : 13|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ DS1STBK2 : 10|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSWAR : 18|1@0+ (1,0) [0|0] "" FCM + SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM + SG_ PCSOPR : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSABK : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PPTRGR : 28|1@0+ (1,0) [0|0] "" FCM + SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM + SG_ CLEXTRGR : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ IRLT_REQ : 25|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKHLD : 37|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS + SG_ VGRSTRGR : 35|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PBRTRGR : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSDIS : 43|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PBPREPMP : 40|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCF01SM : 63|8@0+ (1,0) [0|0] "" FCM + +BO_ 1227 ACC1N01: 8 DS1 + SG_ ACCNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ ACCSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ ACCSPF : 23|16@0+ (1,0) [0|0] "" CGW + SG_ ACCREV : 39|32@0+ (1,0) [0|0] "" CGW + +BO_ 835 ACC1S03: 8 DS1 + SG_ ATACC2 : 7|16@0- (0.001,0) [0|0] "m/s^2" Vector__XXX + SG_ ACCTYPE : 23|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ XTRGT2 : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XLTMD2 : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LCDT2 : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LCNG : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SMC : 17|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ STOKJD : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PMTBRKG : 30|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LVSTP : 29|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LCCWOK : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LCBW2 : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CACC : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ AT_RAW : 47|8@0- (0.05,0) [0|0] "m/s^2" Vector__XXX + SG_ ACC03SUM : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 896 ACN1S01: 8 CGW + SG_ R_AC2 : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_HTR : 5|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ECOSW : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_EGON : 1|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ BLWON : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SCAC : 13|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CGIH : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FAN_AC : 22|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACHI : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACMAX : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_VSCUS : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_SHTR : 30|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_PTC : 29|2@0+ (1,0) [0|0] "piece" Vector__XXX + SG_ GNRTIH : 27|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_COL_TM : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_HET_TM : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TAMOUT : 55|8@0- (0.625,0) [0|0] "" Vector__XXX + +BO_ 897 ACN1S04: 8 CGW + SG_ R_ACCALL : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_AC_WNG : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_SW_CON : 5|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_BEEP : 4|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_RA_AUT : 3|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_RA_AC : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_RA_LO : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_RA_HI : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_AUTO_D : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_AUTO_P : 14|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_DEF : 13|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_RRDEF : 12|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_RFAUT : 11|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_REC : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_FRS : 9|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_AC : 8|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_MHTR : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_WIPD : 22|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_DUSY : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_SWNG : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_BLW_F : 19|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_OAUT_D : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_OLET_D : 30|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_OAUT_P : 27|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_OLET_P : 26|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ ST_BMN_F : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_AIRPR : 47|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_O2 : 46|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_PLSM : 45|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_KAFUN : 43|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_SAFS : 42|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_ACOFF : 41|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_ONSCRN : 40|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 944 ACN1S07: 6 CGW + SG_ RDEF : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MHTR : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TR_TEMP : 15|8@0+ (0.25,-6.5) [0|0] "" Vector__XXX + SG_ ACN_AMB : 31|8@0+ (1,0) [0|0] "" CSR,DS1,FCM + SG_ AC_AMB05 : 44|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AC_MODE : 43|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1250 AFS1N01: 8 AFS + SG_ AFSNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ AFSSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ AFSSPF : 23|16@0+ (1,0) [0|0] "" CGW + SG_ AFSREV : 39|32@0+ (1,0) [0|0] "" CGW + +BO_ 913 AFS1S01: 8 AFS + SG_ HLLI : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AZB_ADV : 5|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ HEDH_AZB : 3|1@0+ (1,0) [0|0] "" FCM + SG_ AZB_IND : 13|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ AZB_HIND : 11|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AZB_PRE : 10|1@0+ (1,0) [0|0] "" FCM + SG_ LED_HLI : 9|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LPECU_PR : 24|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 845 AFS1S02: 5 AFS + SG_ AHRR : 17|10@0+ (0.0048828125,0) [0|0] "V" Vector__XXX + SG_ AHVLD : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AHFAIL : 38|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1044 AHB1S01: 8 FCM + SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX + SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 900 AVN1S01: 6 CGW + SG_ RDC : 7|4@0+ (1,0) [0|0] "" SCS + SG_ CONFID01 : 3|2@0+ (1,0) [0|0] "" SCS + SG_ CONF : 1|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LYT : 15|4@0+ (1,0) [0|0] "" SCS + SG_ DRVW : 9|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MWMP : 8|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GRAD : 23|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ HARSHID : 19|4@0+ (1,0) [0|0] "" SCS + SG_ BRANCH : 27|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ HARSH : 35|2@0+ (1,0) [0|0] "" SCS + SG_ TOLLGATE : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TUNL : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LEAVEOUT : 47|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MRGLANE : 46|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LVLANE : 45|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 902 AVN1S03: 6 CGW + SG_ ANS : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CRS1 : 15|1@0+ (1,0) [0|0] "" SCS + SG_ RQAC : 14|7@0+ (0.02,0) [0|0] "G" Vector__XXX + SG_ GUID : 23|1@0+ (1,0) [0|0] "" SCS + SG_ GYRO : 22|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ NCRN : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CRN6 : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CRN5 : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CRN3 : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CRN2 : 17|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CRN1 : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CONFID03 : 31|2@0+ (1,0) [0|0] "" SCS + SG_ CURV : 29|2@0+ (1,0) [0|0] "" SCS + SG_ CVST : 27|1@0+ (1,0) [0|0] "" SCS + SG_ NAVI_STR : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MIND : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ONOFF : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ HWPB : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RAD : 38|7@0+ (5,0) [0|0] "m" SCS + SG_ AFS_SW : 41|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVS_SW : 40|1@0+ (1,0) [0|0] "" SCS + +BO_ 911 AVN1S07: 8 CGW + SG_ TOFC_RST : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SL_CSTM : 3|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SL_RMDG : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ST_RTCOM : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVN07VLD : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ST_UCST : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RSCOM51 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ RSCOM52 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ RSCOM53 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ RSCOM54 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ RSCOM55 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ RSCOM56 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 905 AVN1S08: 8 CGW + SG_ VVSW : 7|3@0+ (1,0) [0|0] "" CSR + SG_ BZV : 4|3@0+ (1,0) [0|0] "" CSR + SG_ DFS : 1|2@0+ (1,0) [0|0] "" CSR + SG_ BZ_M_SW : 15|1@0+ (1,0) [0|0] "" CSR + SG_ VOL_SW : 14|1@0+ (1,0) [0|0] "" CSR + SG_ BM : 13|1@0+ (1,0) [0|0] "" CSR + SG_ DOFR : 12|1@0+ (1,0) [0|0] "" CSR + SG_ RDSW : 11|1@0+ (1,0) [0|0] "" CSR + SG_ FDSW : 10|1@0+ (1,0) [0|0] "" CSR + SG_ RBSW : 9|1@0+ (1,0) [0|0] "" CSR + SG_ FBSW : 8|1@0+ (1,0) [0|0] "" CSR + SG_ NVDP_OK : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DEVICE : 22|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ DISPSIZE : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ HPTCSW_L : 30|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ HPTCSW_R : 29|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ HPTCSW_E : 28|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_MODE : 27|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VARBGM : 26|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ WBGM : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ X_LL : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Y_LL : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ X_RH : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ Y_RH : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 998 AVN1S11: 5 CGW + SG_ SENSPFM : 7|3@0+ (1,0) [0|0] "" SCS + SG_ SENSFAIL : 4|3@0+ (1,0) [0|0] "" SCS + SG_ CONFID11 : 1|2@0+ (1,0) [0|0] "" SCS + SG_ CONFMMC : 15|8@0+ (1,0) [0|0] "" SCS + SG_ DISTERR : 23|8@0+ (1,0) [0|0] "" SCS + SG_ CONFLANE : 31|8@0+ (1,0) [0|0] "" SCS + SG_ CONFDIR : 39|8@0+ (1,0) [0|0] "" SCS + +BO_ 933 AVN1S13: 8 CGW + SG_ HUD_DISP : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRVSIDE : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DT_GP : 5|6@0+ (1,0) [0|0] "" Vector__XXX + SG_ DT_UNIT : 15|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ DIR_TURN : 12|5@0+ (11.25,0) [0|0] "degree" Vector__XXX + SG_ ROTARY : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ROAD_TP1 : 22|15@0+ (1,0) [0|0] "" Vector__XXX + SG_ ROAD_TP2 : 39|16@0+ (1,0) [0|0] "" Vector__XXX + SG_ N_H_UP : 55|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ COMPASS : 54|6@0+ (11.25,0) [0|0] "degree" Vector__XXX + SG_ DIR : 63|6@0+ (11.25,0) [0|0] "degree" Vector__XXX + +BO_ 936 AVN1S16: 5 CGW + SG_ NDADVSRY : 7|5@0+ (1,0) [0|0] "" Vector__XXX + SG_ NDCAUTON : 15|5@0+ (1,0) [0|0] "" Vector__XXX + SG_ NDSSLCT : 23|5@0+ (1,0) [0|0] "" Vector__XXX + SG_ NDCNFDID : 18|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ NDINDST : 25|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVN16SUM : 39|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 999 AVN1S17: 7 CGW + SG_ AVN17VLD : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANEID17 : 6|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRVLANE : 3|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRV_SIDE : 12|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE_NS : 11|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE1FLG : 23|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE2FLG : 19|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE1DIR : 31|16@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE2DIR : 47|16@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1000 AVN1S18: 8 CGW + SG_ AVN18VLD : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANEID18 : 6|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE3FLG : 3|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE4FLG : 15|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE5FLG : 11|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE3DIR : 23|16@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE4DIR : 39|16@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE5DIR : 55|16@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1001 AVN1S19: 8 CGW + SG_ AVN19VLD : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANEID19 : 6|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE6FLG : 3|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE7FLG : 15|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE8FLG : 11|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE6DIR : 23|16@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE7DIR : 39|16@0+ (1,0) [0|0] "" Vector__XXX + SG_ LANE8DIR : 55|16@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1076 AVN1S20: 8 CGW + SG_ A_LNG_ST : 7|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LANG : 5|6@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LNGDB1 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LNGDB2 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LNGDB3 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LNGDB4 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LNGDB5 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LNGDB6 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LNGDB7 : 63|7@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_LNGCHG : 56|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1077 AVN1S21: 8 CGW + SG_ A_OPEN_S : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ OPENCHG : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CAPSW_S : 5|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_CLR_S : 3|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ DISP_BRT : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DISP_CNT : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MM_CLOCK : 31|11@0+ (1,0) [0|0] "" Vector__XXX + SG_ CLK_OFST : 36|4@0- (5,0) [0|0] "min" Vector__XXX + SG_ DST : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CLK_TYP : 47|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_UNTTMP : 45|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_UNTSP : 43|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_UNTDST : 41|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_UNTCSP : 55|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_CLRCHG : 52|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_TMPCHG : 51|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_SPCHG : 50|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_DSTCHG : 49|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_CSPCHG : 48|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ A_SPLM : 63|6@0+ (5,0) [0|0] "" Vector__XXX + SG_ A_UTSPLM : 57|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1043 AVN1S31: 8 CGW + SG_ GPSTM_Y : 7|8@0+ (1,0) [0|0] "year" Vector__XXX + SG_ GPSTM_MO : 15|8@0+ (1,0) [0|0] "month" Vector__XXX + SG_ GPSTM_D : 23|8@0+ (1,0) [0|0] "day" Vector__XXX + SG_ GPSTM_H : 31|8@0+ (1,0) [0|0] "hour" Vector__XXX + SG_ GPSTM_MI : 39|8@0+ (1,0) [0|0] "minute" Vector__XXX + SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GMTDIF_H : 54|4@0+ (1,0) [0|0] "hour" Vector__XXX + SG_ GMTDIF_M : 50|6@0+ (1,0) [0|0] "minute" Vector__XXX + SG_ SUMMERTM : 60|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075054137 BDB1F01_14: 8 CGW + SG_ BDBF01ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDBF01IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ SALR : 23|6@0+ (1,0) [0|0] "" Vector__XXX + SG_ HDCY_BDB : 17|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AARE_B : 31|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ I_SEN_B : 27|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ INTSET_B : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ INCSET_B : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ISSD_BDB : 39|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SEID : 37|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ WS_ID : 44|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ WS_SWON : 41|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ WS_DATA : 55|16@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075185211 BDB1F03_16: 8 CGW + SG_ BDBF03ID : 7|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ BDBF03IF : 15|8@0+ (1,0) [0|0] "" DS1,FCM + SG_ TRIP_CNT : 23|16@0+ (1,0) [0|0] "trip" AFS,BSR,CSR,DS1,FCM,MAV + SG_ TIME_CNT : 39|32@0+ (100,0) [0|0] "ms" AFS,BSR,CSR,DS1,FCM,MAV + +BO_ 1074791968 BDB1S01_10: 8 CGW + SG_ BDB01_ID : 7|8@0+ (1,0) [0|0] "" FCM,MAV + SG_ BDB01_IF : 15|8@0+ (1,0) [0|0] "" FCM + SG_ LX : 23|16@0+ (0.2,0) [0|0] "ms" FCM + SG_ ADIM : 39|2@0+ (1,0) [0|0] "" AFS,BSR,CSR + SG_ IG_BDB : 37|1@0+ (1,0) [0|0] "" AFS,MAV + SG_ ACC_BDB : 36|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SKSW : 46|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DCTY : 45|1@0+ (1,0) [0|0] "" FCM,MAV,SCS + SG_ PCTY : 44|1@0+ (1,0) [0|0] "" MAV,SCS + SG_ RRCY : 43|1@0+ (1,0) [0|0] "" MAV,SCS + SG_ RLCY : 42|1@0+ (1,0) [0|0] "" MAV,SCS + SG_ BCTY : 41|1@0+ (1,0) [0|0] "" MAV,SCS + SG_ PSW : 51|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SRBZ : 49|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DBKL : 63|2@0+ (1,0) [0|0] "" FCM + SG_ PKB_BDB : 60|1@0+ (1,0) [0|0] "" CSR + SG_ SREXIST : 59|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SRPOS : 58|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1074857505 BDB1S02_11: 8 CGW + SG_ BDB02_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB02_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ LUD : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TRNKOPN : 45|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1074923042 BDB1S03_12: 8 CGW + SG_ BDB03_ID : 7|8@0+ (1,0) [0|0] "" DS1,FCM + SG_ BDB03_IF : 15|8@0+ (1,0) [0|0] "" DS1,FCM + SG_ LTS : 23|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ PANL : 19|1@0+ (1,0) [0|0] "" BSR,CSR + SG_ UDRL : 31|1@0+ (1,0) [0|0] "" AFS + SG_ HEDH : 30|1@0+ (1,0) [0|0] "" AFS,DS1,FCM + SG_ HEDL : 29|1@0+ (1,0) [0|0] "" AFS,DS1 + SG_ TAIL : 28|1@0+ (1,0) [0|0] "" AFS,BSR,CSR,DS1 + SG_ FFOG : 27|1@0+ (1,0) [0|0] "" DS1 + SG_ RFOG : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SB_IND : 39|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SB_OK : 37|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RTRRQ : 35|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SRWARN : 51|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PWWARN : 50|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ WEL_REQ : 48|1@0+ (1,0) [0|0] "" AFS + SG_ DRPBZ_R : 62|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075381795 BDB1S04_19: 8 CGW + SG_ BDB04_ID : 7|8@0+ (1,0) [0|0] "" MAV + SG_ BDB04_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MRMV_R : 23|2@0+ (1,0) [0|0] "" MAV + SG_ RSEL : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LSEL : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MHR : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MHL : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MVU : 17|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MVD : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GHSW : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GCTY : 30|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GHOPN : 42|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ ABIF : 55|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ FLSHRQ : 63|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ SB_ADV : 60|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1074988600 BDB1S05_13: 8 CGW + SG_ BDB05_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB05_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ PARK : 23|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSWB : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LSWD : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LSWP : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LSWR : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LSWL : 17|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LSWB : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRVKS_R : 31|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ PWDRD : 39|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PWDRP : 37|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PWDRR : 35|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PWDRL : 33|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ DKLS : 43|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ BKLS : 54|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ KIDSCN_R : 51|7@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075250736 BDB1S06_17: 8 CGW + SG_ BDB06_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB06_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TBSW : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ WBZF : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ WVOL : 42|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075316273 BDB1S07_18: 8 CGW + SG_ BDB07_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB07_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ WCD : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ W1D : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ W2D : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ W3D : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB7SUM1 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB7SUM2 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075447332 BDB1S08_1A: 8 CGW + SG_ BDB08_ID : 7|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ BDB08_IF : 15|8@0+ (1,0) [0|0] "" DS1,FCM + SG_ DEST_BDB : 23|8@0+ (1,0) [0|0] "" AFS,BSR,CSR,DS1,FCM,MAV + SG_ DS_PACK1 : 31|8@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM,MAV + SG_ DS_PACK2 : 39|8@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM,MAV + SG_ STRG_WHL : 47|2@0+ (1,0) [0|0] "" AFS,CSR,DS1,FCM,MAV + SG_ DEICER : 40|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ KEYPLATE : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DBLLCK : 62|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ U2OP_CST : 61|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ U2OP_DFT : 60|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075643943 BDB1S11_1D: 8 CGW + SG_ BDB11_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB11_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDBREQ11 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDBREQ12 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1083704892 BDB1S17_98: 8 CGW + SG_ BDB17_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB17_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ CHABASE1 : 23|8@0+ (1,0) [0|0] "" AFS + SG_ CHABASE2 : 31|8@0+ (1,0) [0|0] "" AFS + SG_ CHABASE3 : 39|8@0+ (1,0) [0|0] "" AFS + SG_ CHA_NO1 : 47|4@0+ (1,0) [0|0] "" AFS + SG_ CHA_NO2 : 43|4@0+ (1,0) [0|0] "" AFS + SG_ CHA_NO3 : 55|4@0+ (1,0) [0|0] "" AFS + SG_ SP_BODY : 63|5@0+ (1,0) [0|0] "" AFS + +BO_ 1083770429 BDB1S18_99: 8 CGW + SG_ BDB18_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB18_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ POP_NAME : 23|8@0+ (1,0) [0|0] "" AFS + SG_ BODY : 31|8@0+ (1,0) [0|0] "" AFS + SG_ GEAR : 39|8@0+ (1,0) [0|0] "" AFS + SG_ GRADE : 47|8@0+ (1,0) [0|0] "" AFS + SG_ ENGINE : 55|8@0+ (1,0) [0|0] "" AFS + +BO_ 1020 BDB1S19: 8 CGW + SG_ SOLAR_R : 23|9@0+ (100,0) [0|0] "" Vector__XXX + SG_ SOLAR_L : 39|9@0+ (100,0) [0|0] "" Vector__XXX + SG_ N_LX : 55|13@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1083835966 BDB1S20_9A: 8 CGW + SG_ BDB20_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB20_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ RNBDYC : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ RNBDYD : 39|32@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1083901503 BDB1S21_9B: 8 CGW + SG_ BDB21_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BDB21_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ RFOG_SW : 22|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FFOG_SW : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ HF_SW : 20|1@0+ (1,0) [0|0] "" AFS + SG_ HU_SW : 19|1@0+ (1,0) [0|0] "" AFS + SG_ AUTO_SW : 18|1@0+ (1,0) [0|0] "" AFS + SG_ HEAD_SW : 17|1@0+ (1,0) [0|0] "" AFS + SG_ TAIL_SW : 16|1@0+ (1,0) [0|0] "" AFS + SG_ DRL_OFF : 24|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1005 BGM1S01: 2 CGW + SG_ WCAA : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ R_DISP : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BGM_BEEP : 11|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ BGM_MODE : 9|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1237 BSR1N01: 8 BSR + SG_ BSRNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ BSRSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ BSRSPF : 23|16@0+ (1,0) [0|0] "" CGW + SG_ BSRREV : 39|32@0+ (1,0) [0|0] "" CGW + +BO_ 1014 BSR1S01: 8 BSR + SG_ BSD_STAT : 7|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ BSD_SW : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BSD_BUZ : 23|1@0+ (1,0) [0|0] "" CSR + +BO_ 1114 CGW1N02: 8 CGW + SG_ CGW2REV : 7|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1228 CSR1N01: 8 CSR + SG_ CSRNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ CSRSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ CSRSPF : 23|16@0+ (1,0) [0|0] "" CGW + SG_ CSRREV : 39|32@0+ (1,0) [0|0] "" CGW + +BO_ 918 CSR1S01: 7 CSR + SG_ CSV : 7|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ CSSR : 4|2@0+ (1,0) [0|0] "" MAV + SG_ CSD : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CSME : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CSIN : 0|1@0+ (1,0) [0|0] "" MAV + SG_ FL_INFO : 15|4@0+ (1,0) [0|0] "" MAV + SG_ FR_INFO : 11|4@0+ (1,0) [0|0] "" MAV + SG_ RB_INFO : 23|4@0+ (1,0) [0|0] "" MAV + SG_ FC_INFO : 19|4@0+ (1,0) [0|0] "" MAV + SG_ RL_INFO : 31|4@0+ (1,0) [0|0] "" MAV + SG_ RR_INFO : 27|4@0+ (1,0) [0|0] "" MAV + SG_ CZV : 39|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ VOT : 47|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ FCZD : 43|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RCZD : 42|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FCDD : 41|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RCDD : 40|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VOL : 55|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ CDG : 52|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ MUTE : 49|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BZ_OFF : 48|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1087768273 DMS1S02_D6: 8 CGW + SG_ SS_MODE : 25|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 869 DS11D70: 7 DS1 + SG_ D_TRGJDG : 7|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_RESSW : 3|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_SETSW : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_CANSW : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_MAINSW : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_VMCC : 15|8@0+ (1,0) [0|0] "km/h" Vector__XXX + SG_ D_VNCC : 23|8@0+ (1,0) [0|0] "km/h" Vector__XXX + SG_ D_CCREQ : 31|8@0+ (100,-12800) [0|0] "N" Vector__XXX + SG_ D_TGTDST : 39|8@0+ (1,0) [0|0] "m" Vector__XXX + SG_ D_VRCC : 47|8@0- (1,0) [0|0] "km/h" Vector__XXX + SG_ D_WSTL : 55|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_DSW : 54|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_FDJDG : 52|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ D_DSSJDG : 51|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 870 DS11D71: 7 DS1 + SG_ XREQALM : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XREQABK : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TGT_DIST : 5|14@0+ (0.01,0) [0|0] "m" Vector__XXX + SG_ XREQPBA : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XREQFPB : 22|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XREQPB : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XREQEXT : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XREQPSB : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TGT_VGAP : 18|11@0+ (0.025,-51.175) [0|0] "m/s" Vector__XXX + SG_ PCSDISP : 39|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ XPCSRDY : 35|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TGT_NUMB : 34|3@0+ (1,1) [0|0] "" Vector__XXX + SG_ TGT_POSX : 47|8@0- (0.04,0) [0|0] "m" Vector__XXX + +BO_ 871 DS11D72: 2 FCM + SG_ LKADRTRG : 7|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKADRSHR : 5|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKADRSLK : 4|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKADRSLD : 3|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKADRCC : 2|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKADRTUR : 15|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKADRINV : 13|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 643 DS11F01: 7 DS1 + SG_ DSCOUNT : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DSLCCW1 : 15|1@0+ (1,0) [0|0] "" FCM + SG_ DSSTPBZ : 14|1@0+ (1,0) [0|0] "" FCM + SG_ PBRTRGR2 : 12|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DSSFTRQD : 11|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ DSS1FDRV : 23|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ DSS1STBK : 39|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ DSS1STAT : 36|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ DSBHOK : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PPTRGR2 : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DSRQBH : 47|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ IBTRGR2 : 45|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSABK2 : 44|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSNOCHG : 41|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ DS1F01SM : 55|8@0+ (1,0) [0|0] "" FCM + +BO_ 1041 DS12F02: 8 DS1 + SG_ PCSINDI : 7|2@0+ (1,0) [0|0] "" FCM + SG_ PCSWM : 5|2@0+ (1,0) [0|0] "" FCM + SG_ PCSFCT : 3|1@0+ (1,0) [0|0] "" FCM + SG_ PCSTUCT : 2|1@0+ (1,0) [0|0] "" FCM + SG_ DS1LCCK : 1|2@0+ (1,0) [0|0] "" FCM + SG_ PBTUCT : 14|1@0+ (1,0) [0|0] "" FCM + SG_ PCSEXIST : 13|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSWDUCT : 11|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSWD : 9|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSDW : 39|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSDSRF : 36|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSTEMP : 35|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSDUST : 34|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSLCCK : 33|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSPEDW : 47|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSPVSN : 44|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCTEMP2 : 42|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSDUST2 : 41|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSOFFS : 40|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSWDS : 55|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ FRDADJ : 53|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1042 DS12F03: 8 FCM + SG_ LKAINDI : 7|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKAWLSL : 5|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKAWLSR : 3|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKAFCT : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKATUCT : 14|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKACAMT : 13|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LDWEXIST : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKASPCND : 23|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKAWTCS : 18|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKASAUT : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LDWBZ : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LDAFCVB : 47|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LDARDA : 46|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SWSSENSD : 45|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SWSSWD : 43|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SWSRAD : 55|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SWSFLD : 53|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ SWSBUZ : 50|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1207 ECO1D50: 8 CGW + SG_ DRECO01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECO02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECO03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECO04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECO05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECO06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECO07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECO08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 355 ECO1S01: 5 CGW + SG_ ECOSTAON : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ECOMODE : 18|3@0+ (1,0) [0|0] "" KSS,SCS + SG_ FCREQ : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SSVMREQ : 27|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ E2MRXMK : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BPHLDRQ : 36|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BPHLDRQ2 : 35|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ ECOEGSTP : 33|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 922 ECO1S90: 8 CGW + SG_ ECOBZR : 23|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ ECOLMP : 21|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ TESTECO : 30|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ OPLMPMSK : 29|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MSTART : 28|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ECOMODE3 : 27|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ INFSSCOP : 39|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ INFSSSTL : 36|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ ECLMP : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ AUTOSTA : 47|1@0+ (1,0) [0|0] "" SCS + SG_ INFSSFAL : 46|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ INFSSINH : 45|6@0+ (1,0) [0|0] "" Vector__XXX + SG_ SSACMODE : 52|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ INFSSADV : 50|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1182 ECT1D50: 8 CGW + SG_ DRECT01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1183 ECT1D51: 8 CGW + SG_ DRECT11 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT12 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT13 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT14 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT15 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT16 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT17 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT18 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1200 ECT1D52: 8 CGW + SG_ DRECT21 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT22 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT23 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT24 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT25 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT26 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT27 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT28 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1201 ECT1D53: 8 CGW + SG_ DRECT31 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT32 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT33 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT34 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT35 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT36 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT37 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT38 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1202 ECT1D54: 8 CGW + SG_ DRECT41 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT42 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT43 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT44 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT45 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT46 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT47 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT48 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1203 ECT1D55: 8 CGW + SG_ DRECT51 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT52 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT53 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT54 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT55 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT56 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT57 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRECT58 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 464 ECT1F03: 8 CGW + SG_ NT : 7|16@0- (0.390625,0) [0|0] "rpm" Vector__XXX + SG_ ACT : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XDMET : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XNTSW : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XNMET : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XRMET : 17|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XPMET : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SFTOUT_S : 29|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ X3MET : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ X2MET : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XLOMET : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ L4SW : 38|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SNOW : 36|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XFSFT : 35|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SFTOUT : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ HSSLWN : 55|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ HSINH : 54|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CLTMODBK : 53|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ LUOUT : 51|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LUKG : 50|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ FBCOA : 48|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ECTF03SM : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 725 ECT1S10: 2 CGW + SG_ VTORATIO : 7|16@0+ (0.0009765625,0) [0|0] "" Vector__XXX + +BO_ 956 ECT1S92: 8 CGW + SG_ B_OILW : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_OILMD : 5|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_ISNW : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_RJTB : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_WNDL : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_LMULRJ : 14|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_P : 13|1@0+ (1,0) [0|0] "" AFS,CSR,MAV + SG_ B_R : 12|1@0+ (1,0) [0|0] "" AFS,BSR,CSR,DS1,FCM,MAV + SG_ B_N : 11|1@0+ (1,0) [0|0] "" AFS,CSR,MAV + SG_ B_ISPTM : 10|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ BV_THOCL : 23|16@0+ (0.625,-50) [0|0] "" Vector__XXX + SG_ B_GEAR : 39|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_SMDE : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_D : 47|1@0+ (1,0) [0|0] "" AFS,CSR,DS1,MAV + SG_ B_ECOMI : 40|1@0+ (1,0) [0|0] "" DS1 + SG_ B_SPTMI : 55|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_PWRM : 54|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_OILWM : 51|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_SPTMS : 49|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_DMODE : 61|3@0+ (1,0) [0|0] "" SCS + +BO_ 1176 ENG1D50: 8 CGW + SG_ DRENG01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1177 ENG1D51: 8 CGW + SG_ DRENG11 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG12 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG13 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG14 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG15 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG16 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG17 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG18 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1178 ENG1D52: 8 CGW + SG_ DRENG21 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG22 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG23 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG24 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG25 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG26 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG27 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG28 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1179 ENG1D53: 8 CGW + SG_ DRENG31 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG32 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG33 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG34 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG35 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG36 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG37 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG38 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1180 ENG1D54: 8 CGW + SG_ DRENG41 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG42 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG43 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG44 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG45 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG46 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG47 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG48 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1181 ENG1D55: 8 CGW + SG_ DRENG51 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG52 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG53 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG54 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG55 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG56 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG57 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG58 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1192 ENG1D56: 8 CGW + SG_ DRENG61 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG62 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG63 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG64 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG65 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG66 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG67 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG68 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1191 ENG1D57: 8 CGW + SG_ DRENG71 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG72 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG73 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG74 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG75 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG76 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG77 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG78 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1197 ENG1D58: 8 CGW + SG_ DRENG81 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG82 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG83 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG84 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG85 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG86 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG87 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG88 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1198 ENG1D59: 8 CGW + SG_ DRENG91 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG92 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG93 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG94 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG95 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG96 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG97 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG98 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1199 ENG1D60: 8 CGW + SG_ DRENG101 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG102 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG103 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG104 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG105 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG106 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG107 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRENG108 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1017 ENG1F03: 8 CGW + SG_ VARENG1 : 7|4@0+ (1,0) [0|0] "" AFS,SCS + SG_ VARENG2 : 3|4@0+ (1,0) [0|0] "" AFS,SCS + SG_ VARENG3 : 15|4@0+ (1,0) [0|0] "" AFS,SCS + SG_ VARENG4 : 11|1@0+ (1,0) [0|0] "" AFS,SCS + SG_ HVFLAG : 10|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,SCS + SG_ VARTRM1 : 23|4@0+ (1,0) [0|0] "" AFS,CSR,FCM,MAV,SCS + SG_ GEARINF : 19|4@0+ (1,0) [0|0] "" SCS + SG_ DVINF : 31|2@0+ (1,0) [0|0] "" AFS,DS1,FCM,SCS + SG_ OBDINF : 27|4@0+ (1,0) [0|0] "" BSR,DS1,FCM,SCS + SG_ ECOFLAG : 39|1@0+ (1,0) [0|0] "" FCM + SG_ CDYMD : 38|2@0+ (1,0) [0|0] "" DS1,FCM + SG_ ENGF03SM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 452 ENG1F07: 8 CGW + SG_ NE1 : 7|16@0- (0.78125,0) [0|0] "rpm" SCS + SG_ THA1 : 23|8@0+ (2.5,-40) [0|0] "" Vector__XXX + SG_ THWX : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ EGF : 30|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ T2ERXF : 29|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ T2ERXMK : 28|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ASTEFI : 27|1@0+ (1,0) [0|0] "" AFS + SG_ B2ERXMK : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PDLF : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENTCAL2 : 39|8@0+ (12.5,0) [0|0] "rpm" Vector__XXX + SG_ EGFB : 46|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ PTFB : 45|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MILREQ : 43|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_ECOL : 55|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_IECOCR : 53|6@0+ (2,0) [0|0] "" Vector__XXX + SG_ ENGF07SM : 63|8@0+ (1,0) [0|0] "" AFS,DS1,FCM + +BO_ 114 ENG1F43: 5 CGW + SG_ FAVLMCHL : 7|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ FAVLMONL : 23|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ ENGF43SM : 39|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 705 ENG1S01: 8 CGW + SG_ ETCSFB : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ETCSF : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VSCTH : 5|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ THF : 4|1@0+ (1,0) [0|0] "" DS1 + SG_ IDL1 : 3|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XCCACT2 : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ STPSWF : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ WTC : 0|1@0+ (1,0) [0|0] "" KSS,SCS + SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" Vector__XXX + SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS + SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" Vector__XXX + SG_ EACCP : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM + SG_ ENG01SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 961 ENG1S23: 3 CGW + SG_ EKLSM : 7|8@0+ (0.625,0) [0|0] "%" Vector__XXX + SG_ GATHW : 15|16@0- (0.625,0) [0|0] "" Vector__XXX + +BO_ 979 ENG1S28: 2 CGW + SG_ B_FC : 7|16@0+ (0.0005,0) [0|0] "ml" Vector__XXX + +BO_ 1408 ENG1S51: 8 CGW + SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1409 ENG1S52: 8 CGW + SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1410 ENG1S54: 8 CGW + SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VC : 52|5@0+ (1,0) [0|0] "" Vector__XXX + SG_ TES : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 955 ENG1S92: 8 CGW + SG_ B_ST : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_TC : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_GLOW : 3|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_STPE : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_OMWI : 15|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_SILUP : 13|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_SILDN : 12|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_WSTP : 11|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_LOUT : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_OILPL : 9|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_TMP : 23|8@0+ (0.5,0) [0|0] "" Vector__XXX + SG_ OGENETCS : 30|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_DPFW : 28|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ BOSLAMP : 37|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ BOSMINF : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ GOSLAMP : 45|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ GOSMINF : 42|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 921 ENG1S95: 8 CGW + SG_ B_LLSP2 : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TLSTBZ : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_ASLBZ2 : 5|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_SPU2 : 4|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACASID1 : 3|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACASID2 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_LSP2 : 31|8@0+ (1,0) [0|0] "km/h Emph" Vector__XXX + SG_ B_ASLSP2 : 39|8@0+ (1,0) [0|0] "km/h Emph" Vector__XXX + SG_ CACCTRN : 47|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CACCINF : 46|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CACCFR2 : 45|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CACCFR1 : 44|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CACCFLD : 43|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CACCCM3 : 42|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CACCCM2 : 41|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CACCCM1 : 40|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 238 ENG2F01: 4 CGW + SG_ STOFOK : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GROWIND : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_TMP3 : 15|8@0+ (0.5,0) [0|0] "" Vector__XXX + SG_ IMMINJST : 23|16@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 466 ENG2F04: 8 CGW + SG_ XLDR : 7|1@0+ (1,0) [0|0] "" DS1 + SG_ XACCACTV : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XACCACT : 5|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ XPAIDLV : 4|1@0+ (1,0) [0|0] "" DS1 + SG_ XPAIDL : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ BHOK : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RQBH : 1|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCSTAT : 15|3@0+ (1,0) [0|0] "" DS1 + SG_ ACCSTBK : 12|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ STPBZ : 9|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ PLOCKF : 8|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ACCREQ : 23|16@0- (0.0009765625,0) [0|0] "m/s^2" DS1 + SG_ ACCAVL : 39|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ SPDSTAT : 55|4@0+ (1,0) [0|0] "" DS1 + SG_ SSTOK : 51|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CANREQ : 49|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FCACT : 48|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SM1D2 : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 467 ENG2F05: 8 CGW + SG_ LCCW2 : 4|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ WSTL2 : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ LCCHK : 2|3@0+ (1,0) [0|0] "" DS1 + SG_ XCCOK2 : 15|1@0+ (1,0) [0|0] "" DS1 + SG_ SLTACC : 14|2@0+ (1,0) [0|0] "" DS1 + SG_ LTME2 : 12|2@0+ (1,0) [0|0] "" DS1 + SG_ STPSWF2 : 10|1@0+ (1,0) [0|0] "" DS1 + SG_ CCSF : 9|1@0+ (1,0) [0|0] "" DS1 + SG_ CCSNG : 8|1@0+ (1,0) [0|0] "" DS1 + SG_ VM : 23|16@0+ (0.00390625,0) [0|0] "km/h" DS1 + SG_ INTG : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1 + SG_ D2PRXMK : 47|1@0+ (1,0) [0|0] "" DS1 + SG_ SM1D3 : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 119 ENG2F41: 6 CGW + SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX + SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 120 ENG2F42: 4 CGW + SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 916 EPS1S90: 1 CGW + SG_ B_WPS0 : 1|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1235 FCM1N01: 8 FCM + SG_ FCMNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ FCMSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ FCMSPF : 23|16@0+ (1,0) [0|0] "" CGW + SG_ FCMREV : 39|32@0+ (1,0) [0|0] "" CGW + +BO_ 1161 FCM1S10: 8 FCM + SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1162 FCM1S11: 8 FCM + SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1163 FCM1S12: 8 FCM + SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" Vector__XXX + SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" Vector__XXX + SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" Vector__XXX + SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1279 FRD1N01: 8 FRD + SG_ FRDNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ FRDSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ FRDSPF : 23|16@0+ (1,0) [0|0] "" CGW + SG_ FRDREV : 39|32@0+ (1,0) [0|0] "" CGW + +BO_ 737 FWM1S01: 2 CGW + SG_ ACTHLF : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MOT4WD : 6|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CCANCEL : 5|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AI4WD : 4|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LOW4 : 3|1@0+ (1,0) [0|0] "" MAV,SCS + SG_ DLOCK : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RDLOCK : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ HLN : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ F_SP4WD : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RQ_SP4WD : 14|7@0+ (1,73) [0|0] "km/h" Vector__XXX + +BO_ 1082263092 IDT1S03_82: 8 CGW + SG_ IDT03_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ IDT03_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ CO_IDT : 23|16@0+ (1,0) [0|0] "" Vector__XXX + SG_ UACK : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ WRT : 38|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RSTP : 37|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1082328629 IDT1S04_83: 8 CGW + SG_ IDT04_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ IDT04_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ OSID : 47|16@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1257 KSS1N01: 8 KSS + SG_ KSSNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ KSSSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ KSSSPF : 23|16@0+ (1,0) [0|0] "" CGW + SG_ KSSREV : 39|32@0+ (1,0) [0|0] "" CGW + +BO_ 927 KSS1S90: 1 KSS + SG_ LKSS0 : 1|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1263 MAV1N01: 8 MAV + SG_ MAVNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ MAVSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ MAVSPF : 23|16@0+ (1,0) [0|0] "" CGW + +BO_ 1075840528 MET1S01_20: 8 CGW + SG_ MET01_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET01_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET_SPD : 23|8@0+ (1,0) [0|0] "km/h" CSR + SG_ RHEOSTAT : 30|7@0+ (1,0) [0|0] "%" Vector__XXX + SG_ TAIL_CN : 39|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ ILL_OF : 37|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ UNIT_TMP : 33|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ IN_FC : 47|16@0+ (0.1,0) [0|0] "Note" Vector__XXX + SG_ UNIT_0 : 63|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ SP_TL : 60|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET_TC : 56|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075906065 MET1S02_21: 8 CGW + SG_ MET02_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET02_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET_DEST : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ ODO_UNIT : 29|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ OMRS : 27|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ UNIT_CH : 26|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ ODO : 39|32@0+ (1,0) [0|0] "km/mile" Vector__XXX + +BO_ 1076037145 MET1S04_23: 8 CGW + SG_ MET04_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET04_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ AF_FC : 23|16@0+ (0.1,0) [0|0] "Note" Vector__XXX + SG_ UNIT_3 : 39|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ RANGE : 47|16@0+ (1,0) [0|0] "Note" Vector__XXX + SG_ UNIT_4 : 63|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1076102682 MET1S05_24: 8 CGW + SG_ MET05_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET05_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TO_SP : 23|16@0+ (0.1,0) [0|0] "km/h,MPH" Vector__XXX + SG_ UNIT_5 : 39|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ TO_FC : 47|16@0+ (0.1,0) [0|0] "MPG Ekm/l El/100km Ekm/gallon" Vector__XXX + SG_ UNIT_6 : 63|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1076299282 MET1S08_27: 8 CGW + SG_ MET08_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET08_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ TO_DT : 23|16@0+ (1,0) [0|0] "km,mile" Vector__XXX + SG_ UNIT_10 : 39|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1076364819 MET1S09_28: 8 CGW + SG_ MET09_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET09_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ WASH : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BLVW : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_CW : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENGW : 29|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ABSW : 28|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VSCW : 27|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ OPW : 37|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ OLW : 36|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LW : 35|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FSRS : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ HALW : 46|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRW : 43|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TIRW : 42|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FWW : 40|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SUSW : 53|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LKAW : 61|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET_PCSW : 59|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ WTPW : 57|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1076430356 MET1S10_29: 8 CGW + SG_ MET10_ID : 7|8@0+ (1,0) [0|0] "" DS1,FCM + SG_ MET10_IF : 15|8@0+ (1,0) [0|0] "" DS1,FCM + SG_ OM_MLG : 23|7@0+ (100,0) [0|0] "miles" Vector__XXX + SG_ PR_OM_FL : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TNS : 29|2@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM + SG_ HZS : 27|1@0+ (1,0) [0|0] "" AFS,FCM + +BO_ 1076495893 MET1S11_2A: 8 CGW + SG_ MET11_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET11_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ UNIT_CH2 : 23|2@0+ (1,0) [0|0] "" FCM + SG_ TOLER_A : 21|6@0+ (0.002,0.94) [0|0] "" FCM + SG_ CDISP_EX : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TOLER_B : 29|6@0- (0.2,0) [0|0] "km/h" FCM + SG_ TRIP_B : 39|32@0+ (0.1,0) [0|0] "km/MILE" Vector__XXX + +BO_ 1076561430 MET1S12_2B: 8 CGW + SG_ MET12_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ MET12_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ ESLW : 19|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CSOW : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LHLW : 37|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SMBW : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ KDSW : 32|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ OMRW : 46|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BSDW : 54|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ MTSW : 48|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ATSW : 63|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 992 MET1S18: 8 CGW + SG_ M_LANG : 7|6@0+ (1,0) [0|0] "" Vector__XXX + SG_ M_LNG_ST : 1|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ M_LNGDB1 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ M_LNGDB2 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ M_LNGDB3 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ M_LNGDB4 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ M_LNGDB5 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ M_LNGDB6 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ M_LNGDB7 : 63|7@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1075840755 MET1S22_20: 8 CGW + SG_ ID6F320 : 7|8@0+ (1,0) [0|0] "" DS1,FCM + SG_ IF6F320 : 15|8@0+ (1,0) [0|0] "" DS1,FCM + SG_ TSR_OSM : 22|2@0+ (1,0) [0|0] "" FCM + SG_ TSR_OSL : 20|2@0+ (1,0) [0|0] "" FCM + SG_ TSR_SNM : 18|2@0+ (1,0) [0|0] "" FCM + SG_ TSR_MAIN : 16|1@0+ (1,0) [0|0] "" FCM + SG_ LDAMCUS : 31|2@0+ (1,0) [0|0] "" FCM + SG_ LDAMSW : 29|2@0+ (1,0) [0|0] "" FCM + SG_ FCMUSER : 27|1@0+ (1,0) [0|0] "" FCM + SG_ FCMMCUS : 26|2@0+ (1,0) [0|0] "" FCM + SG_ FCMMSW : 24|1@0+ (1,0) [0|0] "" FCM + SG_ BSMMSW : 37|1@0+ (1,0) [0|0] "" BSR + SG_ CSRMSW : 34|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSMCUS : 41|1@0+ (1,0) [0|0] "" DS1 + SG_ PCSMSW : 40|1@0+ (1,0) [0|0] "" DS1 + SG_ LKACTCSW : 51|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ LDA_SFB : 50|3@0+ (1,0) [0|0] "" FCM + +BO_ 1088685760 PMN1F03_E4: 8 CGW + SG_ PMNF03ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ PMNF03IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ PSSW_PMN : 17|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PSW_PMN : 31|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ KCC_PMN : 29|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PMOD_PMN : 27|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ MOD_EIG : 39|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ SWBZ_EIG : 36|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1193 SCS1D50: 8 SCS + SG_ DRSCS01 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRSCS02 : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRSCS03 : 23|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRSCS04 : 31|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRSCS05 : 39|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRSCS06 : 47|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRSCS07 : 55|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ DRSCS08 : 63|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1226 SCS1N01: 8 SCS + SG_ SCSNID : 7|8@0+ (1,0) [0|0] "" CGW + SG_ SCSSNG : 15|1@0+ (1,0) [0|0] "" CGW + SG_ SCSSPF : 23|16@0+ (1,0) [0|0] "" CGW + SG_ SCSREV : 39|32@0+ (1,0) [0|0] "" CGW + +BO_ 744 SCS1S01: 8 SCS + SG_ SELECTOR : 3|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVS_MD : 63|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 815 SCS1S06: 5 SCS + SG_ RRVH : 23|8@0- (1,0) [0|0] "mm" AFS + SG_ RLVH : 31|8@0- (1,0) [0|0] "mm" AFS + SG_ SCECOINH : 35|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 917 SCS1S90: 4 SCS + SG_ B_LSUS6 : 7|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_LSUS4 : 5|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_LSUS2 : 3|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_LSUS8 : 9|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ DLR_HSID : 23|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LAR_HS : 18|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVSNI : 16|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 37 STR1S01: 8 CGW + SG_ STS3 : 7|1@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM,MAV + SG_ STS2 : 6|1@0+ (1,0) [0|0] "" AFS,DS1,FCM,KSS,MAV,SCS + SG_ STS1 : 5|1@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM,KSS,MAV,SCS + SG_ STS0 : 4|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ SSA : 3|12@0- (1.5,0) [0|0] "deg" AFS,BSR,DS1,FCM,KSS,MAV,SCS + SG_ SAZS : 23|1@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM + SG_ SFRZ : 22|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ SSAZ : 19|12@0- (1.5,0) [0|0] "deg" AFS,BSR,DS1,FCM + SG_ SSAS : 39|4@0- (0.1,0) [0|0] "deg" FCM,KSS,SCS + SG_ SSAV : 35|12@0- (1,0) [0|0] "deg/s" FCM,KSS,SCS + SG_ STDID : 51|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ STR01SUM : 63|8@0+ (1,0) [0|0] "" AFS,DS1,FCM,MAV + +BO_ 1059 STR1S02: 1 CGW + SG_ SFR : 5|1@0+ (1,0) [0|0] "" MAV + SG_ STRWVG : 4|1@0+ (1,0) [0|0] "" AFS,BSR,DS1,FCM + +BO_ 170 VSC1F01: 8 CGW + SG_ VXFREF : 7|1@0+ (1,0) [0|0] "" AFS,FCM,MAV + SG_ VXFR : 6|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS + SG_ VXFLEF : 23|1@0+ (1,0) [0|0] "" AFS,FCM,MAV + SG_ VXFL : 22|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS + SG_ VXRREF : 39|1@0+ (1,0) [0|0] "" AFS,FCM,MAV + SG_ VXRR : 38|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS + SG_ VXRLEF : 55|1@0+ (1,0) [0|0] "" AFS,FCM,MAV + SG_ VXRL : 54|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS + +BO_ 426 VSC1F02: 6 CGW + SG_ VXFRF : 7|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV + SG_ VXFRIGS : 6|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV + SG_ VXFRHDS : 5|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS + SG_ VXFLF : 2|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV + SG_ VXFLIGS : 1|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV + SG_ VXFLHDS : 0|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS + SG_ VXRRF : 13|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV + SG_ VXRRIGS : 12|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV + SG_ VXRRHDS : 11|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS + SG_ VXRLF : 8|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV + SG_ VXRLIGS : 23|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV + SG_ VXRLHDS : 22|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS + SG_ VSCF02SM : 47|8@0+ (1,0) [0|0] "" AFS,DS1,FCM,MAV + +BO_ 550 VSC1F06: 8 CGW + SG_ VSCF01FG : 7|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ AHCURQ : 4|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PMCF : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ PMCS : 2|1@0+ (1,0) [0|0] "" DS1 + SG_ PMC : 1|10@0+ (0.02,0) [0|0] "Mpa" DS1 + SG_ ECOEN : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ CCS : 22|1@0+ (1,0) [0|0] "" DS1 + SG_ FBA : 21|1@0+ (1,0) [0|0] "" DS1 + SG_ TRBRKSYS : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TS : 38|1@0+ (1,0) [0|0] "" KSS,SCS + SG_ WSTP : 37|1@0+ (1,0) [0|0] "" DS1,KSS,SCS + SG_ VSCACT : 36|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ BAEX : 35|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TEM : 34|3@0+ (1,0) [0|0] "" SCS + SG_ FSTP : 60|1@0+ (1,0) [0|0] "" DS1 + SG_ ABSACT : 59|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 180 VSC1S03: 8 CGW + SG_ SP1P : 39|6@0+ (1,0) [0|0] "" DS1,FCM + SG_ SP1S : 33|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV + SG_ SP1 : 47|16@0- (0.01,0) [0|0] "km/h" BSR,DS1,FCM,MAV + SG_ VSC03SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 800 VSC1S07: 8 CGW + SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1 + SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1 + SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1 + SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1 + SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1 + SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1 + SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1 + SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1 + SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1 + SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 1056 VSC1S08: 8 CGW + SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS + SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 186 VSC1S12: 4 CGW + SG_ HAC2ESRQ : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FHACHOLD : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VSC12SUM : 31|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 562 VSC1S14: 6 CGW + SG_ VWPSUMFR : 7|8@0+ (1,0) [0|0] "" MAV + SG_ VWPSUMFL : 15|8@0+ (1,0) [0|0] "" MAV + SG_ VWPFRPM : 23|1@0+ (1,0) [0|0] "" MAV + SG_ VWPFLPM : 22|1@0+ (1,0) [0|0] "" MAV + SG_ S14CNT : 21|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ VWPFRPMS : 18|1@0+ (1,0) [0|0] "" MAV + SG_ VWPFLPMS : 17|1@0+ (1,0) [0|0] "" MAV + SG_ VWPSUMRR : 31|8@0+ (1,0) [0|0] "" MAV + SG_ VWPSUMRL : 39|8@0+ (1,0) [0|0] "" MAV + SG_ VSC14SUM : 47|8@0+ (1,0) [0|0] "" MAV + +BO_ 552 VSC1S29: 4 CGW + SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1 + SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1 + SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1 + +BO_ 1168 VSC1S92: 1 CGW + SG_ C_DCMOD1 : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_DCMOD2 : 6|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_DCMOD3 : 3|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 951 VSC1S95: 8 CGW + SG_ B_BRKW : 7|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_ABS : 5|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_BRLV : 14|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TRCOFF : 13|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ VSCOFF : 12|2@0+ (1,0) [0|0] "" DS1,FCM + SG_ SLP_WL : 10|3@0+ (1,0) [0|0] "" MAV + SG_ B_MCST : 19|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_BUZZER : 31|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_ALSD : 27|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_DACIND : 25|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ OGENVSC : 37|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_ATRC : 47|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_STRC : 46|3@0+ (1,0) [0|0] "" MAV + SG_ B_HZD : 43|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VSCSWIH : 51|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ STRCDISP : 50|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ STRCDSP2 : 60|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VSCEXIST : 59|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1063 VSC1S96: 8 CGW + SG_ MTS_DISP : 5|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ B_MTS : 1|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ TRCCONRL : 11|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TRCCONRR : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TRCCONFL : 9|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TRCCONFR : 8|1@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 545 VSC2F05: 5 CGW + SG_ TQER : 7|16@0- (0.03125,0) [0|0] "Nm" Vector__XXX + SG_ REQC : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ REQ2 : 22|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ REQ1 : 21|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AIDWI : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ RTD : 19|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ LOMUSFT : 31|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VSC2F05S : 39|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 544 VSC2F07: 4 CGW + SG_ FSROT : 7|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRK2 : 4|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRK1 : 3|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FCNG : 1|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TSLP : 0|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ TRCACT : 15|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ ABSSLP : 14|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ VDMACT : 13|1@0+ (1,0) [0|0] "" FCM + SG_ DAC_CND : 9|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ VSC2F07S : 31|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 36 YGS1S03: 8 CGW + SG_ YRS11S : 7|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRS14S : 6|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRS21S : 5|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRS24S : 4|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YGS1 : 3|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ YGS0 : 2|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ YR : 1|10@0+ (0.244,-125) [0|0] "deg/sec" DS1,FCM,MAV + SG_ YR_CPUMN : 23|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ GS4S : 19|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ GS1S : 18|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ GL1X : 17|10@0+ (0.03589,-18.375) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ YG_ID : 39|4@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS + SG_ GS5S : 35|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ GS2S : 34|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ GL2Y : 33|10@0+ (0.03589,-18.375) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ YR_DIF : 55|8@0+ (0.244,-31) [0|0] "deg/sec" DS1,FCM,MAV + SG_ YGS03SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 1073743490 YGW1S01_0: 8 CGW + SG_ YGW01_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ YGW01_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ YR_STSW : 22|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ YR_EGST : 20|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ YR_DRLK : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ YR_KLEG : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ YR_HZRD : 26|3@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1073743491 YGW1S02_0: 8 CGW + SG_ YGW02_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ YGW02_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ YR_DEFOG : 19|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ YR_ARCON : 17|2@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1073743494 YGW1S05_0: 8 CGW + SG_ YGW05_ID : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ YGW05_IF : 15|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ YI_IMO_E : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ YI_UREQ : 16|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ YI_RE : 47|16@0+ (1,0) [0|0] "" Vector__XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_adas.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_adas.dbc new file mode 100644 index 000000000..4aae65aa4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_adas.dbc @@ -0,0 +1,276 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 528 TRACK_A_0: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 529 TRACK_A_1: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 530 TRACK_A_2: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 531 TRACK_A_3: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 532 TRACK_A_4: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 533 TRACK_A_5: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 534 TRACK_A_6: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 535 TRACK_A_7: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 536 TRACK_A_8: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 537 TRACK_A_9: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 538 TRACK_A_10: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 539 TRACK_A_11: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 540 TRACK_A_12: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 541 TRACK_A_13: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 542 TRACK_A_14: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 543 TRACK_A_15: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 544 TRACK_B_0: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 545 TRACK_B_1: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 546 TRACK_B_2: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 547 TRACK_B_3: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 548 TRACK_B_4: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 549 TRACK_B_5: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 550 TRACK_B_6: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 551 TRACK_B_7: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 552 TRACK_B_8: 6 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 553 TRACK_B_9: 6 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 554 TRACK_B_10: 6 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 555 TRACK_B_11: 6 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 556 TRACK_B_12: 6 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 557 TRACK_B_13: 6 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 558 TRACK_B_14: 6 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 559 TRACK_B_15: 6 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 47|8@0+ (1,0) [0|255] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_iQ_2009_can.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_iQ_2009_can.dbc new file mode 100644 index 000000000..2213e1ade --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_iQ_2009_can.dbc @@ -0,0 +1,196 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + +BO_ 1552 CONTAINS_LRES_SPEED: 8 XXX + SG_ SPEED_LOWRES : 16|8@1+ (1,0) [0|255] "km/h?" XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 452 ENGINE: 8 XXX + SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "rpm" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ DIFFERENT_EACH_RIDE : 23|8@0+ (1,0) [0|255] "" XXX + SG_ A_DECREASING_VALUE : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 37 STEERING: 8 XXX + SG_ STEER_DIRECTION : 3|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 42|2@0- (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 44|2@0- (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 46|2@0- (1,0) [0|3] "" XXX + SG_ STEER_ANGLE : 2|11@0- (1,0) [-350|350] "" XXX + +BO_ 36 ACCELERATIONS: 8 XXX + SG_ ACC_LAT_CLEAN : 2|11@0- (1,0) [0|255] "" XXX + SG_ ACC_LATERAL : 63|8@0- (1,0) [0|255] "" XXX + SG_ ACC_FRONT_BACK_1 : 31|8@0- (1,0) [0|255] "" XXX + SG_ ACC_FRONT_BACK_2 : 47|8@0- (1,0) [0|255] "" XXX + +BO_ 947 LOW_RES_INDICATORS: 8 XXX + SG_ LOW_RES_ACC_PEDAL : 23|7@0+ (1,0) [0|63] "" XXX + SG_ LOW_RES_RPM : 7|16@0+ (1,0) [0|255] "rpm" XXX + +BO_ 955 BRAKING_PLUS_OTHER: 8 XXX + SG_ IS_BRAKING_2 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ENGINE_TEMPERATURE : 23|8@0+ (1,0) [0|255] "" XXX + SG_ MAYBE_CLUTCH : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 1595 CONTAINS_TIME: 8 XXX + SG_ TIME_ON : 55|16@0+ (0.1,0) [0|65535] "s" XXX + SG_ BETWEEN_RIDES : 7|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 170 WHEELS_SPEEDS: 8 XXX + SG_ FRONT_LEFT_WHEEL_SPEED : 23|16@0+ (0.01,-67.67) [0|65535] "km/h" XXX + SG_ REAR_RIGHT_WHEEL_SPEED : 39|16@0+ (0.01,-67.67) [0|65535] "km/h" XXX + SG_ REAR_LEFT_WHEEL_SPEED : 55|16@0+ (0.01,-67.67) [0|65535] "km/h" XXX + SG_ FRONT_RIGHT_WHEEL_SPEED : 7|16@0+ (0.01,-67.67) [0|65535] "km/h" XXX + +BO_ 180 VEHICLE_DYNAMICS: 8 XXX + SG_ WIERD_STUFF : 8|2@1+ (1,0) [0|3] "" XXX + SG_ VEHICLE_SPEED : 47|16@0+ (0.01,0) [0|255] "km/h" XXX + SG_ SPEED_MOD_256 : 63|8@0- (1,0) [0|255] "" XXX + SG_ MAYBE_DISTANCE_MOD_256 : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 186 NEW_MSG_9: 8 XXX + SG_ NEW_SIGNAL_2 : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 426 NEW_MSG_5: 8 XXX + SG_ CONSTANT : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 906 BOOLS: 8 XXX + SG_ MAY_CONTAIN_LIGHTS : 7|4@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_1 : 3|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ MOVEMENT_START_TRIGGER : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 979 LOW_RES_ACCELERATOR: 8 XXX + SG_ VERY_LRES_ACC : 7|16@0+ (1,0) [0|65535] "" XXX + +BO_ 1600 SLOW_VARIABLE_INFOS: 8 XXX + SG_ CHANGES_EACH_RIDE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ INCREASING_VALUE_FUEL : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 1568 DOORS: 8 XXX + SG_ KEY_ACC : 36|1@0+ (1,0) [0|1] "" XXX + SG_ KEY_ON : 37|1@0+ (1,0) [0|1] "" XXX + SG_ KEY_INSERT : 46|1@0+ (1,0) [0|1] "" XXX + SG_ NOT_ON : 63|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_RIGHT : 44|1@0+ (1,0) [0|3] "" XXX + SG_ DOOR_TRUNK : 41|1@1+ (1,0) [0|3] "" XXX + SG_ DOOR_LEFT : 45|1@0+ (1,0) [0|255] "" XXX + SG_ HANDBRAKE : 60|1@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_1 : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVER_SEATBELT : 62|1@0+ (1,0) [0|1] "" XXX + SG_ TRIGGER_BOOL : 15|1@0+ (1,0) [0|1] "" XXX + +BO_ 705 COMMAND: 8 XXX + SG_ NOT_ACCELERATING_PEDAL : 3|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_PEDAL_SENSOR : 55|16@0+ (1,0) [0|65535] "" XXX + SG_ ACC_COMMAND : 31|16@0- (1,0) [0|7] "" XXX + SG_ ACC_PEDAL_MEAN : 15|16@0- (1,0) [0|255] "" XXX + SG_ NEGATIVE_COMMAND_OFFSET : 47|8@0- (1,0) [0|255] "" XXX + +BO_ 928 STEER2_MAYBE: 8 XXX + SG_ NEW_SIGNAL_1 : 13|6@0+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 60|5@0+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_4 : 5|6@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 46|7@0+ (1,0) [0|15] "" XXX + +BO_ 896 LONG_TERM_2: 8 XXX + SG_ NEW_SIGNAL_1 : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 944 LONG_TERM_MSG: 8 XXX + SG_ LONG_TERM_SIGN : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 1553 TOTAL_DIST: 8 XXX + SG_ TOTAL_DISTANCE : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 1572 WHY_THESE_VALUES: 8 XXX + +BO_ 1555 BETWEEN_RIDES_CHANGE_1: 8 XXX + SG_ BETWEEN_RIDES : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1090 ASYNC_MSG_ACK: 8 XXX + SG_ NEW_SIGNAL_1 : 13|2@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1592 NEW_MSG_14: 8 XXX + SG_ DOORS_LOCKED2 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ DOORS_LOCKED1 : 16|1@0+ (1,0) [0|1] "" XXX + +BO_ 608 NEW_MSG_6: 8 XXX + SG_ VERY_SMALL_SIGNAL2 : 56|1@0+ (1,0) [0|255] "" XXX + SG_ VERY_SMALL_SIGNAL1 : 0|1@0+ (1,0) [0|1] "" XXX + +BO_ 945 BETWEEN_RIDES_CHANGES_2: 8 XXX + SG_ BETWEEN_RIDES : 24|1@0+ (1,0) [0|65535] "" XXX + + + + +CM_ SG_ 1552 SPEED_LOWRES "Negative values to check"; +CM_ SG_ 452 CHECKSUM "Follows path of RPMs but more precise & 1 byte only"; +CM_ SG_ 452 A_DECREASING_VALUE "stabilizes to 62 after ~10 mins"; +CM_ SG_ 37 STEER_DIRECTION "Could be intended as 12 bit steering angle"; +CM_ SG_ 37 STEER_ANGLE "can convert to degrees (imprecise) or percentage of max amplitude"; +CM_ SG_ 36 ACC_FRONT_BACK_1 "more likely up-down"; +CM_ SG_ 36 ACC_FRONT_BACK_2 "more likely front-back"; +CM_ SG_ 947 LOW_RES_ACC_PEDAL "Follows rather closely other acceleration commands"; +CM_ SG_ 947 LOW_RES_RPM "Maybe used for onboard display?"; +CM_ SG_ 955 MAYBE_CLUTCH "might be related to shifting gears"; +CM_ SG_ 1595 TIME_ON "Time since last ignition, tenth of seconds"; +CM_ SG_ 1595 BETWEEN_RIDES "the fourth byte (at least) changes between rides"; +CM_ SG_ 180 WIERD_STUFF "Might be a signed value on the whole two bytes (sometimes all set)"; +CM_ SG_ 180 VEHICLE_SPEED "Roughly 2 seconds before wheel speeds"; +CM_ SG_ 180 SPEED_MOD_256 "One byte speed, a bit before vehicle speed"; +CM_ SG_ 180 MAYBE_DISTANCE_MOD_256 "Looks like measure for distance or wheel angle"; +CM_ SG_ 906 MOVEMENT_START_TRIGGER "trigger of when speed becomes != 0"; +CM_ SG_ 979 VERY_LRES_ACC "Power used by engine? moves alongside speed, very low res, goes from 0 to 9 max?"; +CM_ SG_ 1600 CHANGES_EACH_RIDE "Small decrementation during some rides, possibly long term fuel"; +CM_ SG_ 1600 INCREASING_VALUE_FUEL "Fuel/distance? Average fuel consumption?"; +CM_ SG_ 705 NOT_ACCELERATING_PEDAL "Looks like opposite of accelerating bit"; +CM_ SG_ 705 ACC_PEDAL_SENSOR "similar to pedal sensor maybe checksum."; +CM_ SG_ 705 ACC_COMMAND "Similar to other pedal indicator., cleaner, must be sent back to engine"; +CM_ SG_ 705 ACC_PEDAL_MEAN "Actual sensor for pedal (works when engine off)"; +CM_ SG_ 705 NEGATIVE_COMMAND_OFFSET "Mysterious for now"; +CM_ SG_ 928 NEW_SIGNAL_1 "Very slow changing noisy value, 45-49 in 10 min"; +CM_ SG_ 928 NEW_SIGNAL_2 "Other very slow changing 24-26 in 10 min"; +CM_ SG_ 928 NEW_SIGNAL_4 "Inconsistent across rides"; +CM_ SG_ 896 NEW_SIGNAL_1 "there is a difference at the beginning of 2017-10-31--12-04-05"; +CM_ SG_ 1553 TOTAL_DISTANCE "Probably also contains the previous/two previous bytes but can't confirm"; +CM_ SG_ 945 BETWEEN_RIDES "Might be others in the same message. at least this one"; + diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_new_mc_pt_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_new_mc_pt_generated.dbc new file mode 100644 index 000000000..1c8eaaf09 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_new_mc_pt_generated.dbc @@ -0,0 +1,688 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 359 STEERING_IPAS_COMMA: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "BO_ STEERING_IPAS_COMMA: Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant"; + +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + +BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX + SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX + +CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor that can replace the lower resolution sensor in most TSS1 Toyotas. Learn more: https://github.com/commaai/openpilot/wiki/Toyota-Lexus#zorro-steering-sensor-zss"; + +BO_ 767 SDSU: 8 XXX + SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX + +CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu"; +CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu"; + +VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _toyota_2017.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX DSU HCU EPS IPAS CGW BGM + +BO_ 36 KINEMATICS: 8 XXX + SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX + SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + +BO_ 37 STEER_ANGLE_SENSOR: 8 XXX + SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX + SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX + SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX + +BO_ 119 ENG2F41: 6 CGW + SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX + SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 120 ENG2F42: 4 CGW + SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X + SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 166 BRAKE: 8 XXX + SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX + +BO_ 170 WHEEL_SPEEDS: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + +BO_ 180 SPEED: 8 XXX + SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 295 GEAR_PACKET_HYBRID: 8 XXX + SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX + SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX + +BO_ 353 DSU_SPEED: 7 XXX + SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX + +BO_ 452 ENGINE_RPM: 8 CGW + SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS + SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX + +BO_ 467 PCM_CRUISE_2: 8 XXX + SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX + SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX + SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX + SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 552 VSC1S29: 4 CGW + SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1 + SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1 + SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1 + +BO_ 560 BRAKE_2: 7 XXX + SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX + +BO_ 581 GAS_PEDAL_HYBRID: 8 XXX + SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX + +BO_ 608 STEER_TORQUE_SENSOR: 8 XXX + SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX + SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 614 STEERING_IPAS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 742 LEAD_INFO: 8 DSU + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU + SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU + SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU + +BO_ 800 VSC1S07: 8 CGW + SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1 + SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1 + SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1 + SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1 + SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1 + SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1 + SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1 + SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1 + SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1 + SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 835 ACC_CONTROL: 8 DSU + SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU + SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX + SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX + SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU + SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU + SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU + SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU + SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU + SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX + SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 865 CLUTCH: 8 XXX + SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX + SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX + +BO_ 869 DSU_CRUISE : 7 DSU + SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX + SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX + SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX + SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX + SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX + +BO_ 898 AIR_CONDITIONER: 8 XXX + SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX + SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX + +BO_ 921 PCM_CRUISE_SM: 8 XXX + SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX + SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 944 AIR_CONDITIONER_2: 8 XXX + SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX + +BO_ 951 ESP_CONTROL: 8 ESP + SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX + SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX + +BO_ 956 GEAR_PACKET: 8 XXX + SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX + SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX + SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX + SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX + +BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM + SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX + +BO_ 1009 PCM_CRUISE_ALT: 8 XXX + SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX + SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + +BO_ 1020 SOLAR_SENSOR: 8 XXX + SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX + +BO_ 1041 PCS_HUD: 8 DSU + SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX + SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX + SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX + SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX + SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX + +BO_ 1042 LKAS_HUD: 8 DSU + SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX + SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX + SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX + SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX + SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX + SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX + SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 1043 TIME : 8 CGW + SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX + SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX + SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX + SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX + SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX + SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX + SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX + SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX + SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX + +BO_ 1044 AUTO_HIGH_BEAM: 8 FCM + SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX + SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1056 VSC1S08: 8 CGW + SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS + SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 1083 AUTOPARK_STATUS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 1161 RSA1: 8 FCM + SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX + SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1162 RSA2: 8 FCM + SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX + SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX + SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1163 RSA3: 8 FCM + SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX + SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX + SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX + SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX + SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX + +BO_ 1408 VIN_PART_1: 8 CGW + SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1409 VIN_PART_2: 8 CGW + SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1410 VIN_PART_3: 8 CGW + SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX + SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX + SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX + SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX + SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX + +BO_ 1553 UI_SETTING: 8 XXX + SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX + SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX + +BO_ 1556 BLINKERS_STATE: 8 XXX + SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX + +BO_ 1568 BODY_CONTROL_STATE: 8 XXX + SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX + +BO_ 1570 LIGHT_STALK: 8 SCM + SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX + SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX + SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX + SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 1571 CERTIFICATION_ECU: 8 CGW + SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX + +BO_ 1592 DOOR_LOCKS: 8 XXX + SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX + SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX + SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM + SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 36 YAW_RATE "verify"; +CM_ SG_ 36 ACCEL_X "x-axis accel"; +CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set"; +CM_ SG_ 37 STEER_RATE "factor is tbd"; +CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking"; +CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command"; +CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking"; +CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement"; +CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect"; +CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph"; +CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?"; +CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered"; +CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque"; +CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value"; +CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active"; +CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok"; +CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD"; +CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1"; +CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1"; +CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1"; +CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect"; +CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles"; +CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars"; +CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG."; +CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file."; +CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals."; +CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT."; +CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force"; +CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set."; +CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs"; +CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit"; +CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on."; +CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel"; +CM_ SG_ 956 GEAR "on 6MT, only R shows."; +CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to"; +CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator"; +CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity"; +CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual"; +CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor"; +CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature"; +CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual"; +CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM"; +CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle"; +CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0"; +CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity"; +CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message"; +CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning"; +CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1"; +CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages"; +CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1"; +CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning"; +CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch"; +CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered"; +CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled"; +CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS"; +CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations"; +CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations"; +CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero"; +CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit."; +CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1161 SPDVAL2 "conditional speed value 70"; +CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0"; +CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1163 TSREQPD "always 1"; +CM_ SG_ 1163 TSRMSW "always 1"; +CM_ SG_ 1163 OTSGNNTM "always 3"; +CM_ SG_ 1163 NTLVLSPD "always 3"; +CM_ SG_ 1163 OVSPNTM "always 3"; +CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds"; +CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds"; +CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds"; +CM_ SG_ 1163 TSRSPU "always 1"; +CM_ SG_ 1552 UI_SPEED "Does not appear to match dash"; +CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting"; +CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal"; +CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking"; +CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal."; +CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch"; + +VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B"; +VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok"; +VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 614 STATE 3 "enabled" 1 "disabled"; +VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left"; +VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok"; +VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok"; +VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear"; +VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press"; +VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released"; +VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF"; +VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF"; +VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted"; +VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far"; +VAL_ 956 SPORT_ON 0 "off" 1 "on"; +VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P"; +VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on"; +VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6"; +VAL_ 956 ECON_ON 0 "off" 1 "on"; +VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on"; +VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on"; +VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines"; +VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled"; +VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off"; +VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none"; +VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none"; +VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LKAS_STATUS 1 "on" 0 "off"; +VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear"; +VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on"; +VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined"; +VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok"; +VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok"; +VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok"; +VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok"; +VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok"; +VAL_ 1161 TSGN1 1 "speed sign" 0 "none"; +VAL_ 1161 TSGN2 1 "speed sign" 0 "none"; +VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter"; +VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on"; +VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed"; +VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)"; +VAL_ 1553 UNITS 1 "km" 2 "miles"; +VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left"; +VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed"; +VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights"; +VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked"; + + +CM_ "Imported file _toyota_adas_standard.dbc starts here"; +BO_ 466 PCM_CRUISE: 8 XXX + SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_BRAKING : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 23|16@0- (0.0009765625,0) [-20|20] "m/s^2" XXX + SG_ NEUTRAL_FORCE : 39|16@0- (2,0) [-65536|65534] "N" XXX + SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 643 PRE_COLLISION: 7 DSU + SG_ _COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX + SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX + SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX + SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 705 GAS_PEDAL: 8 XXX + SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" XXX + SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS + SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" XXX + SG_ GAS_PEDAL : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 740 STEERING_LKA: 5 XXX + SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX + SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 836 PRE_COLLISION_2: 8 DSU + SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX + SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM + SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM + SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX + +CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input"; +CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command"; +CM_ SG_ 466 ACCEL_NET "net negative acceleration (braking) applied by the system if on flat ground"; +CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10"; +CM_ SG_ 643 _COUNTER "only used on cars that use this msg for cruise control"; +CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control"; +CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking"; + +VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off"; +VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking"; + +CM_ "toyota_new_mc_pt.dbc starts here"; + +BO_ 548 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 43|12@0+ (1,0) [0|4047] "" XXX + SG_ BRAKE_PRESSED : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 610 EPS_STATUS: 5 EPS + SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX + SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 1178 BRAKE_RELATED: 8 XXX + SG_ BRAKE_PRESSED : 48|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 548 BRAKE_PRESSURE "seems prop to pedal force"; +CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others"; + +VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled"; +VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby"; diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_nodsu_pt_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_nodsu_pt_generated.dbc new file mode 100644 index 000000000..84cf63790 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_nodsu_pt_generated.dbc @@ -0,0 +1,745 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 359 STEERING_IPAS_COMMA: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "BO_ STEERING_IPAS_COMMA: Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant"; + +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + +BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX + SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX + +CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor that can replace the lower resolution sensor in most TSS1 Toyotas. Learn more: https://github.com/commaai/openpilot/wiki/Toyota-Lexus#zorro-steering-sensor-zss"; + +BO_ 767 SDSU: 8 XXX + SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX + +CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu"; +CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu"; + +VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _toyota_2017.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX DSU HCU EPS IPAS CGW BGM + +BO_ 36 KINEMATICS: 8 XXX + SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX + SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + +BO_ 37 STEER_ANGLE_SENSOR: 8 XXX + SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX + SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX + SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX + +BO_ 119 ENG2F41: 6 CGW + SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX + SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 120 ENG2F42: 4 CGW + SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X + SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 166 BRAKE: 8 XXX + SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX + +BO_ 170 WHEEL_SPEEDS: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + +BO_ 180 SPEED: 8 XXX + SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 295 GEAR_PACKET_HYBRID: 8 XXX + SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX + SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX + +BO_ 353 DSU_SPEED: 7 XXX + SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX + +BO_ 452 ENGINE_RPM: 8 CGW + SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS + SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX + +BO_ 467 PCM_CRUISE_2: 8 XXX + SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX + SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX + SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX + SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 552 VSC1S29: 4 CGW + SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1 + SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1 + SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1 + +BO_ 560 BRAKE_2: 7 XXX + SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX + +BO_ 581 GAS_PEDAL_HYBRID: 8 XXX + SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX + +BO_ 608 STEER_TORQUE_SENSOR: 8 XXX + SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX + SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 614 STEERING_IPAS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 742 LEAD_INFO: 8 DSU + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU + SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU + SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU + +BO_ 800 VSC1S07: 8 CGW + SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1 + SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1 + SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1 + SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1 + SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1 + SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1 + SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1 + SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1 + SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1 + SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 835 ACC_CONTROL: 8 DSU + SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU + SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX + SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX + SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU + SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU + SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU + SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU + SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU + SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX + SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 865 CLUTCH: 8 XXX + SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX + SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX + +BO_ 869 DSU_CRUISE : 7 DSU + SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX + SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX + SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX + SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX + SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX + +BO_ 898 AIR_CONDITIONER: 8 XXX + SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX + SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX + +BO_ 921 PCM_CRUISE_SM: 8 XXX + SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX + SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 944 AIR_CONDITIONER_2: 8 XXX + SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX + +BO_ 951 ESP_CONTROL: 8 ESP + SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX + SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX + +BO_ 956 GEAR_PACKET: 8 XXX + SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX + SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX + SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX + SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX + +BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM + SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX + +BO_ 1009 PCM_CRUISE_ALT: 8 XXX + SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX + SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + +BO_ 1020 SOLAR_SENSOR: 8 XXX + SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX + +BO_ 1041 PCS_HUD: 8 DSU + SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX + SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX + SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX + SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX + SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX + +BO_ 1042 LKAS_HUD: 8 DSU + SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX + SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX + SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX + SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX + SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX + SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX + SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 1043 TIME : 8 CGW + SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX + SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX + SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX + SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX + SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX + SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX + SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX + SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX + SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX + +BO_ 1044 AUTO_HIGH_BEAM: 8 FCM + SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX + SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1056 VSC1S08: 8 CGW + SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS + SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 1083 AUTOPARK_STATUS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 1161 RSA1: 8 FCM + SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX + SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1162 RSA2: 8 FCM + SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX + SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX + SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1163 RSA3: 8 FCM + SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX + SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX + SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX + SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX + SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX + +BO_ 1408 VIN_PART_1: 8 CGW + SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1409 VIN_PART_2: 8 CGW + SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1410 VIN_PART_3: 8 CGW + SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX + SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX + SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX + SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX + SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX + +BO_ 1553 UI_SETTING: 8 XXX + SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX + SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX + +BO_ 1556 BLINKERS_STATE: 8 XXX + SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX + +BO_ 1568 BODY_CONTROL_STATE: 8 XXX + SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX + +BO_ 1570 LIGHT_STALK: 8 SCM + SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX + SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX + SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX + SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 1571 CERTIFICATION_ECU: 8 CGW + SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX + +BO_ 1592 DOOR_LOCKS: 8 XXX + SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX + SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX + SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM + SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 36 YAW_RATE "verify"; +CM_ SG_ 36 ACCEL_X "x-axis accel"; +CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set"; +CM_ SG_ 37 STEER_RATE "factor is tbd"; +CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking"; +CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command"; +CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking"; +CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement"; +CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect"; +CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph"; +CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?"; +CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered"; +CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque"; +CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value"; +CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active"; +CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok"; +CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD"; +CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1"; +CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1"; +CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1"; +CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect"; +CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles"; +CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars"; +CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG."; +CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file."; +CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals."; +CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT."; +CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force"; +CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set."; +CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs"; +CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit"; +CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on."; +CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel"; +CM_ SG_ 956 GEAR "on 6MT, only R shows."; +CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to"; +CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator"; +CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity"; +CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual"; +CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor"; +CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature"; +CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual"; +CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM"; +CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle"; +CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0"; +CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity"; +CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message"; +CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning"; +CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1"; +CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages"; +CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1"; +CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning"; +CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch"; +CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered"; +CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled"; +CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS"; +CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations"; +CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations"; +CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero"; +CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit."; +CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1161 SPDVAL2 "conditional speed value 70"; +CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0"; +CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1163 TSREQPD "always 1"; +CM_ SG_ 1163 TSRMSW "always 1"; +CM_ SG_ 1163 OTSGNNTM "always 3"; +CM_ SG_ 1163 NTLVLSPD "always 3"; +CM_ SG_ 1163 OVSPNTM "always 3"; +CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds"; +CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds"; +CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds"; +CM_ SG_ 1163 TSRSPU "always 1"; +CM_ SG_ 1552 UI_SPEED "Does not appear to match dash"; +CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting"; +CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal"; +CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking"; +CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal."; +CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch"; + +VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B"; +VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok"; +VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 614 STATE 3 "enabled" 1 "disabled"; +VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left"; +VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok"; +VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok"; +VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear"; +VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press"; +VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released"; +VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF"; +VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF"; +VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted"; +VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far"; +VAL_ 956 SPORT_ON 0 "off" 1 "on"; +VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P"; +VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on"; +VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6"; +VAL_ 956 ECON_ON 0 "off" 1 "on"; +VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on"; +VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on"; +VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines"; +VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled"; +VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off"; +VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none"; +VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none"; +VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LKAS_STATUS 1 "on" 0 "off"; +VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear"; +VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on"; +VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined"; +VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok"; +VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok"; +VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok"; +VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok"; +VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok"; +VAL_ 1161 TSGN1 1 "speed sign" 0 "none"; +VAL_ 1161 TSGN2 1 "speed sign" 0 "none"; +VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter"; +VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on"; +VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed"; +VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)"; +VAL_ 1553 UNITS 1 "km" 2 "miles"; +VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left"; +VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed"; +VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights"; +VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked"; + + +CM_ "Imported file _toyota_adas_standard.dbc starts here"; +BO_ 466 PCM_CRUISE: 8 XXX + SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_BRAKING : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 23|16@0- (0.0009765625,0) [-20|20] "m/s^2" XXX + SG_ NEUTRAL_FORCE : 39|16@0- (2,0) [-65536|65534] "N" XXX + SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 643 PRE_COLLISION: 7 DSU + SG_ _COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX + SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX + SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX + SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 705 GAS_PEDAL: 8 XXX + SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" XXX + SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS + SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" XXX + SG_ GAS_PEDAL : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 740 STEERING_LKA: 5 XXX + SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX + SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 836 PRE_COLLISION_2: 8 DSU + SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX + SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM + SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM + SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX + +CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input"; +CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command"; +CM_ SG_ 466 ACCEL_NET "net negative acceleration (braking) applied by the system if on flat ground"; +CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10"; +CM_ SG_ 643 _COUNTER "only used on cars that use this msg for cruise control"; +CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control"; +CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking"; + +VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off"; +VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking"; + +CM_ "toyota_nodsu_pt.dbc starts here"; + +BO_ 401 STEERING_LTA: 8 XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ SETME_X3 : 29|2@0+ (1,0) [0|3] "" XXX + SG_ PERCENTAGE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ TORQUE_WIND_DOWN : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ANGLE : 55|8@0- (0.5,0) [0|255] "" XXX + SG_ STEER_ANGLE_CMD : 15|16@0- (0.0573,0) [-540|540] "" XXX + SG_ STEER_REQUEST_2 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_ACTIVE : 26|1@0+ (1,0) [0|1] "" XXX + SG_ CLEAR_HOLD_STEERING_ALERT : 30|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|255] "" XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ SETME_X1 : 7|1@0+ (1,0) [0|1] "" XXX + +BO_ 550 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 610 EPS_STATUS: 8 EPS + SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX + SG_ LTA_STATE : 15|5@0+ (1,0) [0|31] "" XXX + SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 881 LTA_RELATED: 8 FCM + SG_ GAS_PEDAL : 15|8@0+ (0.005,0) [0|1] "" XXX + SG_ STEER_ANGLE : 23|16@0- (0.0573,0) [-500|500] "" XXX + SG_ TURN_SIGNALS : 35|2@0+ (1,0) [0|3] "" XXX + SG_ UNKNOWN_2 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SA_TOGGLE : 59|1@0+ (1,0) [0|1] "" XXX + SG_ LTA_STEER_REQUEST : 60|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN : 61|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_PRESSED : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 1014 BSM: 8 XXX + SG_ L_ADJACENT : 0|1@0+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 8|1@0+ (1,0) [0|1] "" XXX + SG_ R_ADJACENT : 1|1@0+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 10|1@0+ (1,0) [0|1] "" XXX + SG_ ADJACENT_ENABLED : 7|1@0+ (1,0) [0|1] "" XXX + SG_ APPROACHING_ENABLED : 15|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 401 PERCENTAGE "driver override percentage (0-100), very close to steeringPressed in OP"; +CM_ SG_ 401 TORQUE_WIND_DOWN "used to wind down torque on user override"; +CM_ SG_ 401 ANGLE "angle of car relative to lane center on LTA camera"; +CM_ SG_ 401 STEER_ANGLE_CMD "desired angle, OEM steers up to 95 degrees, no angle limit but torque will bottom out"; +CM_ SG_ 401 CLEAR_HOLD_STEERING_ALERT "set to 1 when user clears LKAS_HUD->LDA_ALERT ('Hold Steering') by applying torque to steering wheel"; +CM_ SG_ 401 STEER_REQUEST "enable bit for steering, 1 to steer, 0 to not"; +CM_ SG_ 401 STEER_REQUEST_2 "enable bit for steering, 1 to steer, 0 to not"; +CM_ SG_ 401 LKA_ACTIVE "1 when using LTA for LKA"; +CM_ SG_ 401 SETME_X1 "usually 1, seen at 0 on some South American Corollas indicating lack of stock Lane Tracing Assist"; +CM_ SG_ 401 SETME_X3 "almost completely correlates with Toyota Safety Sense version, but may instead describe max torque when using LTA. if TSS 2.5 or 2022 RAV4, this is always 1. if TSS 2.0 this is always 3 (or 0 on Alphard, Highlander, NX)"; +CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force"; +CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8"; +CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others"; +CM_ SG_ 881 GAS_PEDAL "not set on all cars, only seen on TSS 2.5 Camry Hybrid so far"; +CM_ SG_ 881 STEER_ANGLE "matches STEER_TORQUE_SENSOR->STEER_ANGLE"; +CM_ SG_ 881 TURN_SIGNALS "flipped on some cars"; +CM_ SG_ 881 LDA_SA_TOGGLE "not applicable for all cars"; +CM_ SG_ 881 LTA_STEER_REQUEST "only applicable for TSS 2.5: matches STEERING_LTA->STEER_REQUEST"; +CM_ SG_ 881 UNKNOWN "related to steering wheel angle"; +CM_ SG_ 881 STEERING_PRESSED "only applicable for TSS 2.5: low sensitivity steering wheel pressed by driver signal"; +CM_ SG_ 1014 L_ADJACENT "vehicle adjacent left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 L_APPROACHING "vehicle approaching from left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 R_ADJACENT "vehicle adjacent right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 R_APPROACHING "vehicle approaching from right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 ADJACENT_ENABLED "when BSM is enabled in settings, this is on along with APPROACHING_ENABLED. this controls bsm alert visibility"; +CM_ SG_ 1014 APPROACHING_ENABLED "when BSM is enabled in settings, this is on along with ADJACENT_ENABLED. this controls bsm alert visibility"; + +VAL_ 401 SETME_X3 3 "TSS 2.0" 1 "TSS 2.5 or 2022 RAV4" 0 "TSS 2.0 on Alphard, Highlander, NX"; +VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled"; +VAL_ 610 LKA_STATE 25 "temporary_fault" 17 "permanent_fault" 11 "lka_missing_unavailable2" 9 "temporary_fault2" 5 "active" 3 "lka_missing_unavailable" 1 "standby"; +VAL_ 610 LTA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 3 "lta_missing_unavailable" 1 "standby"; diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_prius_2010_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_prius_2010_pt.dbc new file mode 100644 index 000000000..5c7df7d18 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_prius_2010_pt.dbc @@ -0,0 +1,203 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX DSU HCU EPS IPAS + + +BO_ 36 KINEMATICS: 8 XXX + SG_ ACCEL_Y : 33|10@0+ (1,-512) [0|65535] "" XXX + SG_ STEERING_TORQUE : 17|10@0+ (1,-512) [0|65535] "" XXX + SG_ YAW_RATE : 1|10@0+ (1,-512) [0|65535] "" XXX + +BO_ 166 BRAKE: 8 XXX + SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_PEDAL : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 170 WHEEL_SPEEDS: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.0062,-67.67) [0|250] "mph" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.0062,-67.67) [0|250] "mph" XXX + SG_ WHEEL_SPEED_RR : 39|16@0+ (0.0062,-67.67) [0|250] "mph" XXX + SG_ WHEEL_SPEED_RL : 55|16@0+ (0.0062,-67.67) [0|250] "mph" XXX + +BO_ 180 SPEED: 8 XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED : 47|16@0+ (0.0062,0) [0|115] "mph" XXX + SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 295 GEAR_PACKET: 8 XXX + SG_ CAR_MOVEMENT : 39|8@0- (1,0) [0|255] "" XXX + SG_ COUNTER : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX + +BO_ 466 PCM_CRUISE: 8 XXX + SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 23|16@0- (0.001,0) [-20|20] "m/s2" XXX + SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 550 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 552 ACCELEROMETER: 8 XXX + SG_ ACCEL_Z : 22|15@0- (1,0) [0|32767] "" XXX + SG_ ACCEL_X : 6|15@0- (0.001,0) [-20|20] "m/s2" XXX + +BO_ 560 BRAKE_MODULE2: 8 XXX + SG_ BRAKE_LIGHTS : 26|1@0+ (1,0) [0|1] "" XXX + +BO_ 581 GAS_PEDAL: 8 XXX + SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX + +BO_ 608 STEER_TORQUE_SENSOR: 8 XXX + SG_ STEER_TORQUE_EPS : 47|16@0- (0.66,0) [-20000|20000] "" XXX + SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 610 EPS_STATUS: 5 EPS + SG_ STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 614 STEERING_IPAS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1,0) [0|16777215] "" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 643 PRE_COLLISION: 8 XXX + +BO_ 740 STEERING_LKA: 8 XXX + SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX + SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX + +BO_ 742 LEAD_INFO: 8 DSU + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU + SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU + SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU + +BO_ 835 ACC_CONTROL: 8 DSU + SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s2" HCU + +BO_ 1556 STEERING_LEVERS: 8 XXX + SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX + +BO_ 37 STEER_ANGLE_SENSOR: 8 XXX + SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX + SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX + SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX + +BO_ 467 PCM_CRUISE_2: 8 XXX + SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "kph" XXX + SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "kph" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 921 PCM_CRUISE_SM: 8 XXX + SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 951 ESP_CONTROL: 8 ESP + SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX + +BO_ 1042 LKAS_HUD: 8 XXX + SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_1 : 7|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX + SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX + +BO_ 1553 UI_SEETING: 8 XXX + SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX + +BO_ 1568 SEATS_DOORS: 8 XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX + +BO_ 452 POWERTRAIN: 8 XXX + SG_ ENGINE_RPM : 7|16@0+ (1,0) [0|65535] "rpm" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + + + + +CM_ SG_ 36 ACCEL_Y "unit is tbd"; +CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd"; +CM_ SG_ 36 YAW_RATE "verify"; +CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors"; +CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10"; +CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force"; +CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8"; +CM_ SG_ 560 BRAKE_LIGHTS "double check"; +CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered"; +CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque"; +CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value"; +CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active"; +CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set"; +CM_ SG_ 37 STEER_RATE "factor is tbd"; +CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph"; +CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect"; +CM_ SG_ 921 UI_SET_SPEED "set speed shown in UI with user set unit"; +CM_ SG_ 1042 SET_ME_1 "unclear what this is, nut it's always 1 in drive traces"; +VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B" ; +VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "setspeeddown" 9 "setspeedup" 8 "active" 7 "standstill" 1 "off" 0 "off"; +VAL_ 610 STATE 5 "override" 3 "enabled" 1 "disabled" ; +VAL_ 610 LKA_STATE 50 "temporary_fault" ; +VAL_ 614 STATE 3 "enabled" 1 "disabled" ; +VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left" ; +VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left" ; +VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok" ; +VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted" ; +VAL_ 1042 BARRIERS 3 "both" 2 "right" 1 "left" 0 "none" ; +VAL_ 1042 RIGHT_LINE 3 "orange" 2 "double" 1 "solid" 0 "none" ; +VAL_ 1042 LEFT_LINE 3 "orange" 2 "double" 1 "solid" 0 "none" ; +VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none" ; +VAL_ 1553 UNITS 1 "km" 2 "miles" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_radar_dsu_tssp.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_radar_dsu_tssp.dbc new file mode 100644 index 000000000..168e58913 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_radar_dsu_tssp.dbc @@ -0,0 +1,194 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX RADAR + +BO_ 768 BUTTONS: 8 RADAR + SG_ LKAS_PRESS : 2|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE_PRESS : 5|1@0+ (1,0) [0|1] "" XXX + +BO_ 769 OBJECT_0: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 771 OBJECT_1: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 773 OBJECT_2: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 775 OBJECT_3: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 777 OBJECT_4: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 779 OBJECT_5: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 781 OBJECT_6: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 783 OBJECT_7: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 785 OBJECT_8: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 787 OBJECT_9: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 789 OBJECT_10: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 791 OBJECT_11: 8 RADAR + SG_ ID : 5|6@0+ (1,0) [0|255] "" XXX + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|65535] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.018,0) [0|15] "" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "Front target" +BO_ 1664 CLUSTER_F: 8 RADAR + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "Front target ahead" +BO_ 1665 CLUSTER_F_A: 8 RADAR + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "Left target" +BO_ 1666 CLUSTER_L: 8 RADAR + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ VALID : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "Right target" +BO_ 1667 CLUSTER_R: 8 RADAR + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ VALID : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "Left target ahead" +BO_ 1668 CLUSTER_L_A: 8 RADAR + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ VALID : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "Right target ahead" +BO_ 1669 CLUSTER_R_A: 8 RADAR + SG_ LONG_DIST : 7|13@1+ (0.03,0) [0|255] "m" XXX + SG_ LAT_DIST : 20|11@1- (0.015,0) [-20|20] "m" XXX + SG_ SPEED : 31|10@1- (0.06944444444,0) [0|71] "m/s" XXX + SG_ VALID : 6|1@0+ (1,0) [0|1] "" XXX + SG_ ID : 0|6@1+ (1,0) [0|63] "" XXX + SG_ LAT_SPEED : 48|7@1- (0.1,0) [0|127] "m/s" XXX + SG_ RCS : 63|8@0+ (1,0) [0|255] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_secoc_pt_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_secoc_pt_generated.dbc new file mode 100644 index 000000000..4f7f3f911 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_secoc_pt_generated.dbc @@ -0,0 +1,721 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _toyota_2017.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX DSU HCU EPS IPAS CGW BGM + +BO_ 36 KINEMATICS: 8 XXX + SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX + SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + +BO_ 37 STEER_ANGLE_SENSOR: 8 XXX + SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX + SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX + SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX + +BO_ 119 ENG2F41: 6 CGW + SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX + SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 120 ENG2F42: 4 CGW + SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X + SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 166 BRAKE: 8 XXX + SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX + +BO_ 170 WHEEL_SPEEDS: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + +BO_ 180 SPEED: 8 XXX + SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 295 GEAR_PACKET_HYBRID: 8 XXX + SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX + SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX + +BO_ 353 DSU_SPEED: 7 XXX + SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX + +BO_ 452 ENGINE_RPM: 8 CGW + SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS + SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX + +BO_ 467 PCM_CRUISE_2: 8 XXX + SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX + SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX + SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX + SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 552 VSC1S29: 4 CGW + SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1 + SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1 + SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1 + +BO_ 560 BRAKE_2: 7 XXX + SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX + +BO_ 581 GAS_PEDAL_HYBRID: 8 XXX + SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX + +BO_ 608 STEER_TORQUE_SENSOR: 8 XXX + SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX + SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 614 STEERING_IPAS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 742 LEAD_INFO: 8 DSU + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU + SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU + SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU + +BO_ 800 VSC1S07: 8 CGW + SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1 + SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1 + SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1 + SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1 + SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1 + SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1 + SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1 + SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1 + SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1 + SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 835 ACC_CONTROL: 8 DSU + SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU + SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX + SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX + SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU + SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU + SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU + SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU + SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU + SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX + SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 865 CLUTCH: 8 XXX + SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX + SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX + +BO_ 869 DSU_CRUISE : 7 DSU + SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX + SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX + SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX + SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX + SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX + +BO_ 898 AIR_CONDITIONER: 8 XXX + SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX + SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX + +BO_ 921 PCM_CRUISE_SM: 8 XXX + SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX + SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 944 AIR_CONDITIONER_2: 8 XXX + SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX + +BO_ 951 ESP_CONTROL: 8 ESP + SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX + SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX + +BO_ 956 GEAR_PACKET: 8 XXX + SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX + SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX + SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX + SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX + +BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM + SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX + +BO_ 1009 PCM_CRUISE_ALT: 8 XXX + SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX + SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + +BO_ 1020 SOLAR_SENSOR: 8 XXX + SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX + +BO_ 1041 PCS_HUD: 8 DSU + SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX + SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX + SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX + SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX + SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX + +BO_ 1042 LKAS_HUD: 8 DSU + SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX + SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX + SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX + SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX + SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX + SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX + SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 1043 TIME : 8 CGW + SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX + SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX + SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX + SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX + SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX + SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX + SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX + SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX + SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX + +BO_ 1044 AUTO_HIGH_BEAM: 8 FCM + SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX + SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1056 VSC1S08: 8 CGW + SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS + SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 1083 AUTOPARK_STATUS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 1161 RSA1: 8 FCM + SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX + SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1162 RSA2: 8 FCM + SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX + SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX + SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1163 RSA3: 8 FCM + SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX + SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX + SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX + SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX + SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX + +BO_ 1408 VIN_PART_1: 8 CGW + SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1409 VIN_PART_2: 8 CGW + SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1410 VIN_PART_3: 8 CGW + SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX + SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX + SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX + SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX + SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX + +BO_ 1553 UI_SETTING: 8 XXX + SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX + SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX + +BO_ 1556 BLINKERS_STATE: 8 XXX + SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX + +BO_ 1568 BODY_CONTROL_STATE: 8 XXX + SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX + +BO_ 1570 LIGHT_STALK: 8 SCM + SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX + SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX + SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX + SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 1571 CERTIFICATION_ECU: 8 CGW + SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX + +BO_ 1592 DOOR_LOCKS: 8 XXX + SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX + SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX + SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM + SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 36 YAW_RATE "verify"; +CM_ SG_ 36 ACCEL_X "x-axis accel"; +CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set"; +CM_ SG_ 37 STEER_RATE "factor is tbd"; +CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking"; +CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command"; +CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking"; +CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement"; +CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect"; +CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph"; +CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?"; +CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered"; +CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque"; +CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value"; +CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active"; +CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok"; +CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD"; +CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1"; +CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1"; +CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1"; +CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect"; +CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles"; +CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars"; +CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG."; +CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file."; +CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals."; +CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT."; +CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force"; +CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set."; +CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs"; +CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit"; +CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on."; +CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel"; +CM_ SG_ 956 GEAR "on 6MT, only R shows."; +CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to"; +CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator"; +CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity"; +CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual"; +CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor"; +CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature"; +CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual"; +CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM"; +CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle"; +CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0"; +CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity"; +CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message"; +CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning"; +CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1"; +CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages"; +CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1"; +CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning"; +CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch"; +CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered"; +CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled"; +CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS"; +CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations"; +CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations"; +CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero"; +CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit."; +CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1161 SPDVAL2 "conditional speed value 70"; +CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0"; +CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1163 TSREQPD "always 1"; +CM_ SG_ 1163 TSRMSW "always 1"; +CM_ SG_ 1163 OTSGNNTM "always 3"; +CM_ SG_ 1163 NTLVLSPD "always 3"; +CM_ SG_ 1163 OVSPNTM "always 3"; +CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds"; +CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds"; +CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds"; +CM_ SG_ 1163 TSRSPU "always 1"; +CM_ SG_ 1552 UI_SPEED "Does not appear to match dash"; +CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting"; +CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal"; +CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking"; +CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal."; +CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch"; + +VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B"; +VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok"; +VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 614 STATE 3 "enabled" 1 "disabled"; +VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left"; +VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok"; +VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok"; +VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear"; +VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press"; +VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released"; +VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF"; +VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF"; +VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted"; +VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far"; +VAL_ 956 SPORT_ON 0 "off" 1 "on"; +VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P"; +VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on"; +VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6"; +VAL_ 956 ECON_ON 0 "off" 1 "on"; +VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on"; +VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on"; +VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines"; +VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled"; +VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off"; +VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none"; +VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none"; +VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LKAS_STATUS 1 "on" 0 "off"; +VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear"; +VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on"; +VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined"; +VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok"; +VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok"; +VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok"; +VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok"; +VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok"; +VAL_ 1161 TSGN1 1 "speed sign" 0 "none"; +VAL_ 1161 TSGN2 1 "speed sign" 0 "none"; +VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter"; +VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on"; +VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed"; +VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)"; +VAL_ 1553 UNITS 1 "km" 2 "miles"; +VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left"; +VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed"; +VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights"; +VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked"; + +CM_ "toyota_secoc_pt.dbc starts here"; + +BO_ 15 SECOC_SYNCHRONIZATION: 8 XXX + SG_ TRIP_CNT : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ RESET_CNT : 23|20@0+ (1,0) [0|65535] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + +BO_ 257 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_PRESSURE_1 : 31|8@0+ (1,0) [0|15] "" XXX + SG_ BRAKE_PRESSURE_2 : 61|6@0+ (1,0) [0|63] "" XXX + +BO_ 278 GAS_PEDAL: 8 XXX + SG_ GAS_PEDAL_ACC : 7|8@0+ (0.005,0) [0|255] "" XXX + SG_ GAS_PEDAL_USER : 15|8@0+ (0.005,0) [0|255] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 305 STEERING_LTA_2: 8 XXX + SG_ STEER_REQUEST_2 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_REQUEST : 3|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 13|6@0+ (1,0) [0|63] "" XXX + SG_ STEER_ANGLE_CMD : 23|16@0- (0.0573,0) [0|65535] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 374 PCM_CRUISE: 8 XXX + SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_STATE : 31|4@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 375 PCM_CRUISE_3: 8 XXX + SG_ NEW_SIGNAL_1 : 7|16@0- (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_4 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 21|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_RELEASED : 30|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 387 ACC_CONTROL_2: 8 XXX + SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 401 STEERING_LTA: 8 XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|255] "" XXX + SG_ SETME_X1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_ANGLE_CMD : 15|16@0- (0.0573,0) [-540|540] "" XXX + SG_ STEER_REQUEST_2 : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_ACTIVE : 26|1@0+ (1,0) [0|1] "" XXX + SG_ SETME_X3 : 29|2@0+ (1,0) [0|3] "" XXX + SG_ CLEAR_HOLD_STEERING_ALERT : 30|1@0+ (1,0) [0|1] "" XXX + SG_ PERCENTAGE : 39|8@0+ (1,0) [0|255] "" XXX + SG_ TORQUE_WIND_DOWN : 47|8@0+ (1,0) [0|255] "" XXX + SG_ ANGLE : 55|8@0- (0.5,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 418 CRUISE_RELATED: 8 XXX + SG_ CRUISE_ACTIVE : 7|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 589 PCM_CRUISE_4: 8 PCM + SG_ DISTANCE : 2|1@0+ (1,0) [0|1] "" XXX + SG_ CANCEL : 4|1@0+ (1,0) [0|1] "" XXX + SG_ DECREASE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ENABLE : 6|1@0+ (1,0) [0|1] "" XXX + SG_ INCREASE : 7|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 27|4@0+ (1,0) [0|15] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 610 EPS_STATUS: 8 EPS + SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LTA_STATE : 15|5@0+ (1,0) [0|31] "" XXX + SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX + SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 643 PRE_COLLISION: 8 DSU + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 740 STEERING_LKA: 8 XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX + SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX + SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 836 PRE_COLLISION_2: 8 DSU + SG_ AUTHENTICATOR : 35|28@0+ (1,0) [0|268435455] "" XXX + SG_ RESET_FLAG : 37|2@0+ (1,0) [0|3] "" XXX + SG_ MSG_CNT_LOWER : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 881 LTA_RELATED: 8 FCM + SG_ GAS_PEDAL : 15|8@0+ (0.005,0) [0|1] "" XXX + SG_ STEER_ANGLE : 23|16@0- (0.0573,0) [-500|500] "" XXX + SG_ TURN_SIGNALS : 35|2@0+ (1,0) [0|3] "" XXX + SG_ UNKNOWN_2 : 58|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SA_TOGGLE : 59|1@0+ (1,0) [0|1] "" XXX + SG_ LTA_STEER_REQUEST : 60|1@0+ (1,0) [0|1] "" XXX + SG_ UNKNOWN : 61|1@0+ (1,0) [0|1] "" XXX + SG_ STEERING_PRESSED : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 1014 BSM: 8 XXX + SG_ L_ADJACENT : 0|1@0+ (1,0) [0|1] "" XXX + SG_ R_ADJACENT : 1|1@0+ (1,0) [0|1] "" XXX + SG_ ADJACENT_ENABLED : 7|1@0+ (1,0) [0|1] "" XXX + SG_ L_APPROACHING : 8|1@0+ (1,0) [0|1] "" XXX + SG_ R_APPROACHING : 10|1@0+ (1,0) [0|1] "" XXX + SG_ APPROACHING_ENABLED : 15|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 305 STEER_ANGLE_CMD "Used in place of STEERING_LTA.STEER_ANGLE_CMD on SecOC cars"; +CM_ SG_ 387 ACCEL_CMD "Used in place of ACC_CONTROL.ACCEL_CMD on SecOC cars"; +CM_ SG_ 401 STEER_REQUEST "enable bit for steering, 1 to steer, 0 to not"; +CM_ SG_ 401 SETME_X1 "usually 1, seen at 0 on some South American Corollas indicating lack of stock Lane Tracing Assist"; +CM_ SG_ 401 STEER_ANGLE_CMD "desired angle, OEM steers up to 95 degrees, no angle limit but torque will bottom out"; +CM_ SG_ 401 STEER_REQUEST_2 "enable bit for steering, 1 to steer, 0 to not"; +CM_ SG_ 401 LKA_ACTIVE "1 when using LTA for LKA"; +CM_ SG_ 401 SETME_X3 "almost completely correlates with Toyota Safety Sense version, but may instead describe max torque when using LTA. if TSS 2.5 or 2022 RAV4, this is always 1. if TSS 2.0 this is always 3 (or 0 on Alphard, Highlander, NX)"; +CM_ SG_ 401 CLEAR_HOLD_STEERING_ALERT "set to 1 when user clears LKAS_HUD->LDA_ALERT ('Hold Steering') by applying torque to steering wheel"; +CM_ SG_ 401 PERCENTAGE "driver override percentage (0-100), very close to steeringPressed in OP"; +CM_ SG_ 401 TORQUE_WIND_DOWN "used to wind down torque on user override"; +CM_ SG_ 401 ANGLE "angle of car relative to lane center on LTA camera"; +CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others"; +CM_ SG_ 881 GAS_PEDAL "not set on all cars, only seen on TSS 2.5 Camry Hybrid so far"; +CM_ SG_ 881 STEER_ANGLE "matches STEER_TORQUE_SENSOR->STEER_ANGLE"; +CM_ SG_ 881 TURN_SIGNALS "flipped on some cars"; +CM_ SG_ 881 LDA_SA_TOGGLE "not applicable for all cars"; +CM_ SG_ 881 LTA_STEER_REQUEST "only applicable for TSS 2.5: matches STEERING_LTA->STEER_REQUEST"; +CM_ SG_ 881 UNKNOWN "related to steering wheel angle"; +CM_ SG_ 881 STEERING_PRESSED "only applicable for TSS 2.5: low sensitivity steering wheel pressed by driver signal"; +CM_ SG_ 1014 L_ADJACENT "vehicle adjacent left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 R_ADJACENT "vehicle adjacent right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 ADJACENT_ENABLED "when BSM is enabled in settings, this is on along with APPROACHING_ENABLED. this controls bsm alert visibility"; +CM_ SG_ 1014 L_APPROACHING "vehicle approaching from left side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 R_APPROACHING "vehicle approaching from right side of car. enabled above 10mph, regardless of ADJACENT_ENABLED or APPROACHING_ENABLED"; +CM_ SG_ 1014 APPROACHING_ENABLED "when BSM is enabled in settings, this is on along with ADJACENT_ENABLED. this controls bsm alert visibility"; + +VAL_ 401 SETME_X3 3 "TSS 2.0" 1 "TSS 2.5 or 2022 RAV4" 0 "TSS 2.0 on Alphard, Highlander, NX"; +VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled"; +VAL_ 610 LTA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 3 "lta_missing_unavailable" 1 "standby"; +VAL_ 610 LKA_STATE 25 "temporary_fault" 17 "permanent_fault" 11 "lka_missing_unavailable2" 9 "temporary_fault2" 5 "active" 3 "lka_missing_unavailable" 1 "standby"; diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_tnga_k_pt_generated.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_tnga_k_pt_generated.dbc new file mode 100644 index 000000000..d52f7e99c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_tnga_k_pt_generated.dbc @@ -0,0 +1,687 @@ +CM_ "AUTOGENERATED FILE, DO NOT EDIT"; + + +CM_ "Imported file _community.dbc starts here"; +BO_ 359 STEERING_IPAS_COMMA: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ "BO_ STEERING_IPAS_COMMA: Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant"; + +BO_ 512 GAS_COMMAND: 6 EON + SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR + SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR + SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR + +BO_ 513 GAS_SENSOR: 6 INTERCEPTOR + SG_ INTERCEPTOR_GAS : 7|16@0+ (1,0) [0|1] "" EON + SG_ INTERCEPTOR_GAS2 : 23|16@0+ (1,0) [0|1] "" EON + SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_COUNTER : 35|4@0+ (1,0) [0|15] "" EON + SG_ PEDAL_CHECKSUM : 47|8@0+ (1,0) [0|255] "" EON + +VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + +BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX + SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX + +CM_ "BO_ SECONDARY_STEER_ANGLE: ZSS is a high-precision steering angle sensor that can replace the lower resolution sensor in most TSS1 Toyotas. Learn more: https://github.com/commaai/openpilot/wiki/Toyota-Lexus#zorro-steering-sensor-zss"; + +BO_ 767 SDSU: 8 XXX + SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX + +CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu"; +CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu"; + +VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ; + + +CM_ "Imported file _toyota_2017.dbc starts here"; +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX DSU HCU EPS IPAS CGW BGM + +BO_ 36 KINEMATICS: 8 XXX + SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/s" XXX + SG_ ACCEL_X : 17|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX + +BO_ 37 STEER_ANGLE_SENSOR: 8 XXX + SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX + SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX + SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX + +BO_ 119 ENG2F41: 6 CGW + SG_ FDRV : 7|16@0- (2,0) [0|0] "N" Vector__XXX + SG_ FDRVREAL : 23|13@0- (10,0) [0|0] "N" Vector__XXX + SG_ XAECT : 39|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ XFDRVCOL : 38|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVSELP : 34|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F41S : 47|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 120 ENG2F42: 4 CGW + SG_ FAVLMCHH : 7|16@0- (2,0) [0|0] "N" Vector__XX228X + SG_ CCRNG : 23|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ FDRVTYPD : 22|3@0+ (1,0) [0|0] "" Vector__XXX + SG_ GEARHD : 18|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ ENG2F42S : 31|8@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 166 BRAKE: 8 XXX + SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX + SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX + +BO_ 170 WHEEL_SPEEDS: 8 XXX + SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX + +BO_ 180 SPEED: 8 XXX + SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX + SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "km/h" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 295 GEAR_PACKET_HYBRID: 8 XXX + SG_ FDRVREAL : 26|11@0- (25,0) [-25600|25575] "N" XXX + SG_ UNKNOWN : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + SG_ GEAR : 47|4@0+ (1,0) [0|15] "" XXX + +BO_ 353 DSU_SPEED: 7 XXX + SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX + +BO_ 452 ENGINE_RPM: 8 CGW + SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS + SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX + +BO_ 467 PCM_CRUISE_2: 8 XXX + SG_ BRAKE_PRESSED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ PCM_FOLLOW_DISTANCE : 12|2@0+ (1,0) [0|3] "" XXX + SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX + SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "km/h" XXX + SG_ ACC_FAULTED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 552 VSC1S29: 4 CGW + SG_ ICBACT : 7|1@0+ (1,0) [0|0] "" DS1 + SG_ DVS0PCS : 6|15@0- (0.001,0) [0|0] "m/s^2" DS1 + SG_ SM228 : 31|8@0+ (1,0) [0|0] "" DS1 + +BO_ 560 BRAKE_2: 7 XXX + SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX + +BO_ 581 GAS_PEDAL_HYBRID: 8 XXX + SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX + +BO_ 608 STEER_TORQUE_SENSOR: 8 XXX + SG_ STEER_TORQUE_EPS : 47|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX + SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX + SG_ STEER_ANGLE_INITIALIZING : 3|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 614 STEERING_IPAS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX + SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 742 LEAD_INFO: 8 DSU + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU + SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU + SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU + +BO_ 800 VSC1S07: 8 CGW + SG_ FBKRLY : 6|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCM : 4|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCSFT : 3|1@0+ (1,0) [0|0] "" DS1 + SG_ FABS : 2|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ TSVSC : 1|1@0+ (1,0) [0|0] "" DS1 + SG_ FVSCL : 0|1@0+ (1,0) [0|0] "" DS1 + SG_ RQCSTBKB : 15|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PSBSTBY : 14|1@0+ (1,0) [0|0] "" DS1 + SG_ P2BRXMK : 13|1@0+ (1,0) [0|0] "" DS1 + SG_ MCC : 11|1@0+ (1,0) [0|0] "" DS1 + SG_ RQBKB : 10|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRSTOP : 9|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ BRKON : 8|1@0+ (1,0) [0|0] "" DS1,FCM + SG_ ASLP : 23|8@0- (1,0) [0|0] "deg" DS1 + SG_ BRTYPACC : 31|2@0+ (1,0) [0|0] "" DS1 + SG_ BRKABT3 : 26|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT2 : 25|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ BRKABT1 : 24|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ GVC : 39|8@0- (0.04,0) [0|0] "m/s^2" DS1 + SG_ XGVCINV : 43|1@0+ (1,0) [0|0] "" DS1 + SG_ S07CNT : 52|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ PCSBRSTA : 50|2@0+ (1,0) [0|0] "" DS1 + SG_ VSC07SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 835 ACC_CONTROL: 8 DSU + SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s^2" HCU + SG_ ALLOW_LONG_PRESS : 17|2@0+ (1,0) [0|2] "" XXX + SG_ ACC_MALFUNCTION : 18|1@0+ (1,0) [0|0] "" XXX + SG_ RADAR_DIRTY : 19|1@0+ (1,0) [0|1] "" XXX + SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX + SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_TYPE : 23|2@0+ (1,0) [0|3] "" HCU + SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU + SG_ ACC_CUT_IN : 25|1@0+ (1,0) [0|1] "" XXX + SG_ LEAD_VEHICLE_STOPPED : 29|1@0+ (1,0) [0|0] "" DSU + SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU + SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU + SG_ ITS_CONNECT_LEAD : 39|8@0+ (1,0) [0|1] "" Vector__XXX + SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 865 CLUTCH: 8 XXX + SG_ ACC_FAULTED : 32|1@0+ (1,0) [0|1] "" XXX + SG_ GAS_PEDAL_ALT : 23|8@0+ (0.005,0) [0|1] "" XXX + SG_ CLUTCH_RELEASED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 48|16@1+ (0.0002,-6.5536) [-6.5536|6.5534] "" XXX + +BO_ 869 DSU_CRUISE : 7 DSU + SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX + SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX + SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX + SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX + SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX + SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX + SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX + +BO_ 898 AIR_CONDITIONER: 8 XXX + SG_ CLIMATE_SET_POINT : 5|6@0+ (1,0) [5|33] "" XXX + SG_ AIR_CONDITIONER_STATE : 48|7@1+ (1,0) [0|127] "" XXX + +BO_ 921 PCM_CRUISE_SM: 8 XXX + SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX + SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX + SG_ TEMP_ACC_FAULTED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX + +BO_ 944 AIR_CONDITIONER_2: 8 XXX + SG_ WINDSCREEN_DEFOG : 43|1@0+ (1,0) [0|1] "" XXX + +BO_ 951 ESP_CONTROL: 8 ESP + SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX + SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ENABLED : 33|1@1+ (1,0) [0|1] "" XXX + SG_ BRAKE_HOLD_ACTIVE : 36|1@0+ (1,0) [0|1] "" XXX + +BO_ 956 GEAR_PACKET: 8 XXX + SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX + SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX + SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX + SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX + SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX + SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX + SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX + +BO_ 1005 REVERSE_CAMERA_STATE: 2 BGM + SG_ REVERSE_CAMERA_GUIDELINES : 9|2@0+ (1,0) [1|3] "" XXX + +BO_ 1009 PCM_CRUISE_ALT: 8 XXX + SG_ PCM_FOLLOW_DISTANCE : 4|2@1+ (1,0) [0|3] "" XXX + SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX + SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX + SG_ UI_SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX + +BO_ 1020 SOLAR_SENSOR: 8 XXX + SG_ LUX_SENSOR : 55|13@0+ (1,0) [0|0] "" XXX + +BO_ 1041 PCS_HUD: 8 DSU + SG_ PCS_INDICATOR : 7|2@0+ (1,0) [0|3] "" XXX + SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_DUST : 34|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP : 35|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_DUST2 : 41|1@0+ (1,0) [0|0] "" XXX + SG_ PCS_TEMP2 : 42|1@0+ (1,0) [0|0] "" XXX + SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX + SG_ PCS_OFF : 40|1@0+ (1,0) [0|0] "" XXX + SG_ FRD_ADJ : 53|3@0+ (1,0) [0|0] "" XXX + SG_ PCS_SENSITIVITY : 55|8@0+ (1,0) [0|1] "" XXX + +BO_ 1042 LKAS_HUD: 8 DSU + SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX + SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX + SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_STATUS : 7|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX + SG_ LDW_EXIST : 10|1@0+ (1,0) [0|1] "" XXX + SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE_QUIET : 14|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_UNAVAILABLE : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY : 18|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_SA_TOGGLE : 20|2@0+ (1,0) [0|3] "" XXX + SG_ LDA_MESSAGES : 23|3@0+ (1,0) [0|1] "" XXX + SG_ LDA_ON_MESSAGE : 31|2@0+ (1,0) [0|3] "" XXX + SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_TOGGLE : 43|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_SENSITIVITY : 45|2@0+ (1,0) [0|3] "" XXX + SG_ TAKE_CONTROL : 46|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_FRONT_CAMERA_BLOCKED : 47|1@0+ (1,0) [0|1] "" XXX + SG_ LANE_SWAY_BUZZER : 50|2@0+ (1,0) [0|0] "" XXX + SG_ LANE_SWAY_FLD : 53|3@0+ (1,0) [0|7] "" XXX + SG_ LANE_SWAY_WARNING : 55|2@0+ (1,0) [0|3] "" XXX + SG_ SET_ME_X01 : 42|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX + +BO_ 1043 TIME : 8 CGW + SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX + SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX + SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX + SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX + SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX + SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX + SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX + SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX + SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX + +BO_ 1044 AUTO_HIGH_BEAM: 8 FCM + SG_ AHB_DUTY : 47|8@0+ (0.5,0) [0|0] "%" Vector__XXX + SG_ F_AHB : 55|4@0+ (1,0) [0|0] "" Vector__XXX + SG_ C_AHB : 51|4@0+ (1,0) [0|0] "" Vector__XXX + +BO_ 1056 VSC1S08: 8 CGW + SG_ YR1Z : 7|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ YR2Z : 23|16@0- (1,0) [0|0] "rad/s" DS1,FCM,MAV + SG_ GL1Z : 39|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ GL2Z : 47|8@0- (0.0359,0) [0|0] "m/s^2" DS1,FCM,KSS,MAV,SCS + SG_ YRGSDIR : 55|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,SCS + SG_ GLZS : 51|1@0+ (1,0) [0|0] "" DS1,FCM,KSS,MAV,SCS + SG_ YRZF : 50|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZS : 49|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ YRZKS : 48|1@0+ (1,0) [0|0] "" DS1,FCM,MAV + SG_ VSC08SUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM,MAV + +BO_ 1083 AUTOPARK_STATUS: 8 IPAS + SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX + +BO_ 1161 RSA1: 8 FCM + SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "km/h" XXX + SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX + SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1162 RSA2: 8 FCM + SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX + SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX + SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX + SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX + SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX + SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX + SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX + SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX + SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX + +BO_ 1163 RSA3: 8 FCM + SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX + SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX + SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX + SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX + SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX + SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX + SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX + +BO_ 1408 VIN_PART_1: 8 CGW + SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1409 VIN_PART_2: 8 CGW + SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX + SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX + +BO_ 1410 VIN_PART_3: 8 CGW + SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX + +BO_ 1552 BODY_CONTROL_STATE_2: 8 XXX + SG_ UI_SPEED : 23|8@0+ (1,0) [0|255] "" XXX + SG_ METER_SLIDER_BRIGHTNESS_PCT : 30|7@0+ (1,0) [12|100] "%" XXX + SG_ METER_SLIDER_LOW_BRIGHTNESS : 37|1@0+ (1,0) [0|1] "" XXX + SG_ METER_SLIDER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ UNITS : 63|3@0+ (1,0) [1|4] "" XXX + +BO_ 1553 UI_SETTING: 8 XXX + SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX + SG_ ODOMETER : 39|32@0+ (1,0) [0|1048575] "" XXX + +BO_ 1556 BLINKERS_STATE: 8 XXX + SG_ BLINKER_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ HAZARD_LIGHT : 27|1@0+ (1,0) [0|1] "" XXX + SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX + +BO_ 1568 BODY_CONTROL_STATE: 8 XXX + SG_ METER_DIMMED : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_BRAKE : 60|1@0+ (1,0) [0|1] "" XXX + SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX + SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX + +BO_ 1570 LIGHT_STALK: 8 SCM + SG_ LIGHT_STALK_MOVED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TAIL_LIGHT : 19|1@0+ (1,0) [0|1] "" XXX + SG_ HEADLIGHT_MODE : 21|3@1+ (1,0) [0|7] "" XXX + SG_ FRONT_FOG : 27|1@0+ (1,0) [0|1] "" XXX + SG_ PARKING_LIGHT : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LOW_BEAM : 29|1@0+ (1,0) [0|1] "" XXX + SG_ HIGH_BEAM : 30|1@0+ (1,0) [0|1] "" XXX + SG_ DAYTIME_RUNNING_LIGHT : 31|1@0+ (1,0) [0|1] "" XXX + SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 1571 CERTIFICATION_ECU: 8 CGW + SG_ DOOR_LOCK_FEEDBACK_LIGHT : 15|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_LOCKING_FEEDBACK_LIGHT : 61|1@0+ (1,0) [0|0] "" XXX + SG_ KEYFOB_UNLOCKING_FEEDBACK_LIGHT : 62|1@0+ (1,0) [0|0] "" XXX + +BO_ 1592 DOOR_LOCKS: 8 XXX + SG_ LOCK_STATUS_CHANGED : 15|1@0+ (1,0) [0|1] "" XXX + SG_ LOCK_STATUS : 20|1@0+ (1,0) [0|1] "" XXX + SG_ LOCKED_VIA_KEYFOB : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1779 ADAS_TOGGLE_STATE: 8 XXX + SG_ OK_BUTTON_PRESSED : 15|1@0+ (1,0) [0|1] "" BCM + SG_ SWS_TOGGLE_CMD : 24|1@0+ (1,0) [0|1] "" XXX + SG_ SWS_SENSITIVITY_CMD : 26|2@0+ (1,0) [0|3] "" XXX + SG_ LKAS_ON_CMD : 28|1@0+ (1,0) [0|1] "" XXX + SG_ LKAS_OFF_CMD : 29|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_HI_CMD : 30|1@0+ (1,0) [0|1] "" XXX + SG_ LDA_SENSITIVITY_STD_CMD : 31|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_TOGGLE : 34|1@0+ (1,0) [0|1] "" XXX + SG_ BSM_TOGGLE_CMD : 37|1@0+ (1,0) [0|1] "" XXX + SG_ IPAS_SONAR_TOGGLE : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_TOGGLE_CMD : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PCS_SENSITIVITY_CMD : 41|1@0+ (1,0) [0|1] "" XXX + +CM_ SG_ 36 YAW_RATE "verify"; +CM_ SG_ 36 ACCEL_X "x-axis accel"; +CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set"; +CM_ SG_ 37 STEER_RATE "factor is tbd"; +CM_ SG_ 119 FDRVREAL "ICE only: force applied by wheels from the engine. includes creeping force, regen, and engine braking"; +CM_ SG_ 166 BRAKE_FORCE "hybrid only: force applied by friction brakes from user or ACC command"; +CM_ SG_ 295 FDRVREAL "hybrid only: force applied by wheels from the engine and/or electric motors. includes creeping force, regen, and engine braking"; +CM_ SG_ 467 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement"; +CM_ SG_ 467 SET_SPEED "43 km/h are shown as 28 mph, so conversion isn't perfect"; +CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph"; +CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?"; +CM_ SG_ 581 GAS_PEDAL "it seems slightly filtered"; +CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque"; +CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value"; +CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active"; +CM_ SG_ 835 ACC_TYPE "if 2, car is likely to have a permanent low speed lockout. 1 is ok"; +CM_ SG_ 835 RADAR_DIRTY "Display Clean Radar Sensor message on HUD"; +CM_ SG_ 835 ACC_MALFUNCTION "display ACC fault on dash if set to 1"; +CM_ SG_ 835 ACC_CUT_IN "Display blinking yellow lead if set to 1"; +CM_ SG_ 835 DISTANCE "Cycle through ACC following distance from long, mid, short when set to 1"; +CM_ SG_ 835 ITS_CONNECT_LEAD "Displayed when lead car is capable of ITS Connect"; +CM_ SG_ 835 LEAD_VEHICLE_STOPPED "Set to 1 when lead is stopped, likely only used in older TSS-P vehicles"; +CM_ SG_ 835 ALLOW_LONG_PRESS "Enable Toyota's factory set speed increment behaviour, available on both metrics cars and imperial unit cars"; +CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was 'SET_ME_1' and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG."; +CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file."; +CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals."; +CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT."; +CM_ SG_ 865 ACCEL_NET "net positive acceleration (gas) applied by the system if on flat ground, may not include creeping force"; +CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set."; +CM_ SG_ 898 AIR_CONDITIONER_STATE "very difficult to parse with some air register motors operating without user-inputs"; +CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit"; +CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on."; +CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel"; +CM_ SG_ 956 GEAR "on 6MT, only R shows."; +CM_ SG_ 1009 UI_SET_SPEED "units seem to be whatever the car is set to"; +CM_ SG_ 1041 PCS_INDICATOR "Pre-Collision System Indicator"; +CM_ SG_ 1041 PCS_SENSITIVITY "Pre-Collision System Sensitivity"; +CM_ SG_ 1041 PCS_DUST "alert: Front Camera Low Visibility Unavailable See Owner's Manual"; +CM_ SG_ 1041 PCS_DUST2 "alert: Pre-Collision System Radar Sensor Blocked Unavailable Clean Radar Sensor"; +CM_ SG_ 1041 PCS_TEMP "alert: Front Camera Out of Temperature Range Unavailable Wait until Normal Temperature"; +CM_ SG_ 1041 PCS_TEMP2 "alert: Pre-Collision System Out of Temperature Range Unavailable See Owner's Manual"; +CM_ SG_ 1041 FRD_ADJ "alert: ERROR ADJUSTING FRONT RADAR BEAM"; +CM_ SG_ 1042 LDA_SA_TOGGLE "LDA Steering Assist Toggle"; +CM_ SG_ 1042 LDW_EXIST "Unclear what this is, it's usually set to 0"; +CM_ SG_ 1042 LDA_SENSITIVITY "LDA Sensitivity"; +CM_ SG_ 1042 LDA_ON_MESSAGE "Display LDA Turned ON message"; +CM_ SG_ 1042 REPEATED_BEEPS "LDA audible warning"; +CM_ SG_ 1042 LDA_UNAVAILABLE_QUIET "LDA toggles and sensitivity settings are greyed out if set to 1"; +CM_ SG_ 1042 LDA_MESSAGES "Various LDA Messages"; +CM_ SG_ 1042 LDA_FRONT_CAMERA_BLOCKED "originally LDAFCVB, LDA related settings are greyed out if set to 1"; +CM_ SG_ 1042 TAKE_CONTROL "Please Control Steering Wheel warning"; +CM_ SG_ 1042 LANE_SWAY_TOGGLE "Lane Sway Warning System SWS Switch"; +CM_ SG_ 1042 LANE_SWAY_WARNING "Lane Sway Warning System Triggered"; +CM_ SG_ 1042 LANE_SWAY_FLD "Unknown signal for Lane Sway Warning System, set to 7 on stock system when SWS is enabled, 0 when SWS is disabled"; +CM_ SG_ 1042 LANE_SWAY_BUZZER "Similar to TWO_BEEPS"; +CM_ SG_ 1042 SET_ME_X01 "empty bit on leaked dbc, always set to 1 during normal operations"; +CM_ SG_ 1042 SET_ME_X02 "empty bit on leaked dbc, always set to 2 during normal operations"; +CM_ SG_ 1083 STATE "when the dashboard button is pressed, the value changes from zero to non-zero"; +CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit."; +CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1161 SPDVAL2 "conditional speed value 70"; +CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0"; +CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz"; +CM_ SG_ 1163 TSREQPD "always 1"; +CM_ SG_ 1163 TSRMSW "always 1"; +CM_ SG_ 1163 OTSGNNTM "always 3"; +CM_ SG_ 1163 NTLVLSPD "always 3"; +CM_ SG_ 1163 OVSPNTM "always 3"; +CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds"; +CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds"; +CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds"; +CM_ SG_ 1163 TSRSPU "always 1"; +CM_ SG_ 1552 UI_SPEED "Does not appear to match dash"; +CM_ SG_ 1552 METER_SLIDER_BRIGHTNESS_PCT "Combination display brightness setting, scales from 12 per cent to 100 per cent, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1552 METER_SLIDER_LOW_BRIGHTNESS "Combination display low brightness mode, also controls footwell lighting"; +CM_ SG_ 1552 METER_SLIDER_DIMMED "Combination display slider not at max, reflects combination meter settings only, not linked with headlight state"; +CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal"; +CM_ SG_ 1592 LOCK_STATUS_CHANGED "1 on rising edge of lock/unlocking"; +CM_ SG_ 1592 LOCK_STATUS "The next 3 bits always seem to follow this signal."; +CM_ SG_ 1592 LOCKED_VIA_KEYFOB "1 for as long as car is locked with key fob or door handle touch"; + +VAL_ 295 GEAR 0 "P" 1 "R" 2 "N" 3 "D" 4 "B"; +VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok"; +VAL_ 467 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 614 STATE 3 "enabled" 1 "disabled"; +VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left"; +VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok"; +VAL_ 835 ACC_MALFUNCTION 1 "faulted" 0 "ok"; +VAL_ 835 ACC_CUT_IN 1 "CUT-IN Detected" 0 "clear"; +VAL_ 835 ALLOW_LONG_PRESS 2 "set speed increase by 5 speed units regardless" 1 "set speed increase by 1 speed unit on short press, 5 speed units on long press"; +VAL_ 865 CLUTCH_RELEASED 0 "clutch pressed any amount" 1 "clutch released"; +VAL_ 898 CLIMATE_SET_POINT 0 "CLIMATE LO MODE" 55 "CLIMATE HI MODE" 57 "CLIMATE OFF"; +VAL_ 898 AIR_CONDITIONER_STATE 20 "CLIMATE OFF"; +VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted"; +VAL_ 921 DISTANCE_LINES 0 "not displayed" 1 "close" 2 "medium" 3 "far"; +VAL_ 956 SPORT_ON 0 "off" 1 "on"; +VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P"; +VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on"; +VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6"; +VAL_ 956 ECON_ON 0 "off" 1 "on"; +VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on"; +VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on"; +VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines"; +VAL_ 1009 PCM_FOLLOW_DISTANCE 1 "far" 2 "medium" 3 "close"; +VAL_ 1041 PCS_INDICATOR 2 "PCS Faulted" 1 "PCS Turned Off By User" 0 "PCS Enabled"; +VAL_ 1041 PCS_SENSITIVITY 64 "high sensitivity" 128 "mid sensitivity" 192 "low sensitivity" 0 "off"; +VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none"; +VAL_ 1042 BARRIERS 3 "left" 2 "right" 1 "both" 0 "none"; +VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LKAS_STATUS 1 "on" 0 "off"; +VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none"; +VAL_ 1042 LDA_ON_MESSAGE 2 "Lane Departure Alert Turned ON, Steering Assist Inactive" 1 "Lane Departure Alert Turned ON, Steering Assist Active" 0 "clear"; +VAL_ 1042 LDA_SA_TOGGLE 2 "steering assist off" 1 "steering assist on"; +VAL_ 1042 LDA_SENSITIVITY 2 "standard" 1 "high" 0 "undefined"; +VAL_ 1042 LDA_MESSAGES 4 "lda unavailable at this speed" 1 "lda unavailable below approx 50km/h" 0 "ok"; +VAL_ 1042 LDA_FRONT_CAMERA_BLOCKED 1 "lda unavailable" 0 "ok"; +VAL_ 1042 TAKE_CONTROL 1 "take control" 0 "ok"; +VAL_ 1042 LANE_SWAY_WARNING 3 "ok" 2 "orange please take a break" 1 "prompt would you like to take a break" 0 "ok"; +VAL_ 1042 LANE_SWAY_BUZZER 3 "ok" 2 "beep twice" 1 "beep twice" 0 "ok"; +VAL_ 1161 TSGN1 1 "speed sign" 0 "none"; +VAL_ 1161 TSGN2 1 "speed sign" 0 "none"; +VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter"; +VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none"; +VAL_ 1552 METER_SLIDER_LOW_BRIGHTNESS 1 "Low brightness mode, footwell lights off" 0 "Normal mode, footwell lights on"; +VAL_ 1552 METER_SLIDER_DIMMED 1 "Dimmed" 0 "Not Dimmed"; +VAL_ 1552 UNITS 1 "km (km/L)" 2 "km (L/100km)" 3 "miles (MPG US)" 4 "miles (MPG Imperial)"; +VAL_ 1553 UNITS 1 "km" 2 "miles"; +VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left"; +VAL_ 1556 BLINKER_BUTTON_PRESSED 1 "button pressed" 0 "not pressed"; +VAL_ 1570 HEADLIGHT_MODE 0 "headlights off" 2 "force parking lights" 4 "force low beams" 7 "auto low beams" 6 "auto parking lights"; +VAL_ 1592 LOCK_STATUS 0 "locked" 1 "unlocked"; + + +CM_ "Imported file _toyota_adas_standard.dbc starts here"; +BO_ 466 PCM_CRUISE: 8 XXX + SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX + SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_BRAKING : 12|1@0+ (1,0) [0|1] "" XXX + SG_ ACCEL_NET : 23|16@0- (0.0009765625,0) [-20|20] "m/s^2" XXX + SG_ NEUTRAL_FORCE : 39|16@0- (2,0) [-65536|65534] "N" XXX + SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX + SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 643 PRE_COLLISION: 7 DSU + SG_ _COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX + SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX + SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX + SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX + SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX + SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 705 GAS_PEDAL: 8 XXX + SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX + SG_ ETQLVSC : 15|16@0- (0.03125,0) [0|0] "Nm" XXX + SG_ ETQREAL : 31|16@0- (0.03125,0) [0|0] "Nm" SCS + SG_ ETQISC : 47|8@0+ (1,-192) [0|0] "Nm" XXX + SG_ GAS_PEDAL : 55|8@0+ (0.5,0) [0|0] "%" DS1,FCM + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" DS1,FCM + +BO_ 740 STEERING_LKA: 5 XXX + SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX + SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX + SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX + SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 836 PRE_COLLISION_2: 8 DSU + SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX + SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM + SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM + SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX + SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX + SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS + SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX + +CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input"; +CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command"; +CM_ SG_ 466 ACCEL_NET "net negative acceleration (braking) applied by the system if on flat ground"; +CM_ SG_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10"; +CM_ SG_ 643 _COUNTER "only used on cars that use this msg for cruise control"; +CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control"; +CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking"; + +VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "off"; +VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking"; + +CM_ "toyota_tnga_k_pt.dbc starts here"; + +BO_ 550 BRAKE_MODULE: 8 XXX + SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX + SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX + +BO_ 610 EPS_STATUS: 5 EPS + SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX + SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX + SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX + +CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force"; +CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8"; +CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others"; + +VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled"; +VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby"; diff --git a/artifacts/package_runtime/iqdbc/dbc/toyota_tss2_adas.dbc b/artifacts/package_runtime/iqdbc/dbc/toyota_tss2_adas.dbc new file mode 100644 index 000000000..d472debd6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/toyota_tss2_adas.dbc @@ -0,0 +1,285 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 384 TRACK_A_0: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 385 TRACK_A_1: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 386 TRACK_A_2: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 387 TRACK_A_3: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 388 TRACK_A_4: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 389 TRACK_A_5: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 390 TRACK_A_6: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 391 TRACK_A_7: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 392 TRACK_A_8: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 393 TRACK_A_9: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 394 TRACK_A_10: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 395 TRACK_A_11: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 396 TRACK_A_12: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 397 TRACK_A_13: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 398 TRACK_A_14: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 399 TRACK_A_15: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ LAT_DIST : 31|11@0- (0.04,0) [-50|50] "m" XXX + SG_ LONG_DIST : 15|13@0+ (0.04,0) [0|300] "m" XXX + SG_ NEW_TRACK : 36|1@0+ (1,0) [0|1] "" XXX + SG_ REL_SPEED : 47|12@0- (0.025,0) [-100|100] "m/s" XXX + SG_ VALID : 48|1@0+ (1,0) [0|1] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 400 TRACK_B_0: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 401 TRACK_B_1: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 402 TRACK_B_2: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 403 TRACK_B_3: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 404 TRACK_B_4: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 405 TRACK_B_5: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 406 TRACK_B_6: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 407 TRACK_B_7: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 408 TRACK_B_8: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 409 TRACK_B_9: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 410 TRACK_B_10: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 411 TRACK_B_11: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 412 TRACK_B_12: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 413 TRACK_B_13: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 414 TRACK_B_14: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 415 TRACK_B_15: 8 XXX + SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX + SG_ REL_ACCEL : 15|7@0- (1,0) [-64|63] "" XXX + SG_ SCORE : 23|8@0+ (1,0) [0|100] "" XXX + SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 576 NEW_MSG_1: 8 XXX + SG_ NEW_SIGNAL_1 : 15|7@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 577 NEW_MSG_2: 8 XXX + SG_ NEW_SIGNAL_1 : 15|7@0+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_2 : 23|8@0+ (1,0) [0|255] "" XXX diff --git a/artifacts/package_runtime/iqdbc/dbc/volvo_v40_2017_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/volvo_v40_2017_pt.dbc new file mode 100644 index 000000000..c5f533d60 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/volvo_v40_2017_pt.dbc @@ -0,0 +1,363 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX BCM CEM CVM DIM ECM FSM PSCM SAS SRS TCM + +BO_ 8 SAS0: 8 SAS + SG_ SteeringDirection : 42|1@0+ (1,0) [0|1] "" XXX + SG_ RelativeTurnDirection : 43|1@0+ (1,0) [0|1] "" XXX + SG_ SteeringAngle : 53|14@0+ (0.04395,0) [0|65535] "degrees" XXX + SG_ NEW_SIGNAL_1 : 47|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 39|4@0+ (1,0) [0|15] "" XXX + SG_ AngleRate : 21|14@0+ (0.075,0) [0|1500] "deg/S" XXX + +BO_ 16 CCButtons: 8 CEM + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|5@0+ (1,0) [0|31] "" XXX + SG_ B7b0 : 56|1@0+ (1,0) [0|1] "" XXX + SG_ B7b1 : 57|1@0+ (1,0) [0|1] "" XXX + SG_ B7b6 : 62|1@0+ (1,0) [0|1] "" XXX + SG_ ACCOnOffBtn : 58|1@0+ (1,0) [0|1] "" XXX + SG_ ACCSetBtn : 63|1@0+ (1,0) [0|1] "" XXX + SG_ ACCStopBtn : 60|1@0+ (1,0) [0|1] "" XXX + SG_ ACCResumeBtn : 61|1@0+ (1,0) [0|1] "" XXX + SG_ ACCMinusBtn : 48|1@0+ (1,0) [0|1] "" XXX + SG_ TimeGapIncreaseBtn : 49|1@0+ (1,0) [0|1] "" XXX + SG_ TimeGapDecreaseBtn : 50|1@0+ (1,0) [0|1] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ B7b3 : 59|1@0+ (1,0) [0|1] "" XXX + +BO_ 48 FSM0: 8 FSM + SG_ ACCStatusTracking : 56|1@0+ (1,0) [0|1] "" XXX + SG_ ACCStatusOnOff : 57|1@0+ (1,0) [0|1] "" XXX + SG_ ACCStatusActive : 58|1@0+ (1,0) [0|1] "" XXX + SG_ FCWSomething : 25|3@0+ (1,0) [0|3] "" XXX + SG_ StatusSomething : 55|8@0+ (1,0) [0|255] "" XXX + +BO_ 64 TCM0: 8 TCM + SG_ RPMSomething : 42|11@0+ (1,0) [0|2047] "" XXX + SG_ GearShifter : 46|2@0+ (1,0) [0|3] "" XXX + +BO_ 85 PedalandBrake: 8 ECM + SG_ AccPedal : 9|10@0+ (0.1,0) [0|1023] "%" XXX + SG_ BrakePedalActive2 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 35|12@0+ (1,0) [0|4095] "" XXX + SG_ BrakePedalActive : 38|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 101 EngineInfo: 8 XXX + SG_ NEW_SIGNAL_1 : 17|10@0+ (1,-512) [0|1023] "" XXX + SG_ EngineSpeed : 52|13@0+ (1,0) [0|1023] "" XXX + +BO_ 112 NEW_MSG_4: 8 XXX + SG_ NEW_SIGNAL_1 : 39|8@0+ (1,0) [0|255] "" XXX + +BO_ 114 ECM1: 8 ECM1 + SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ ECM_ACC_ONOFF_INV : 43|1@0+ (1,0) [0|1] "" XXX + SG_ ECM_ACC_RESUME_INV : 45|1@0+ (1,0) [0|1] "" XXX + SG_ ECM_ACC_SET_INV : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ECM_ACC_TIMEGAP_INC_INV : 33|1@0+ (1,0) [0|1] "" XXX + SG_ ECM_ACC_DEC_INV : 32|1@0+ (1,0) [0|1] "" XXX + SG_ ECM_ACC_TIMEGAP_DEC_INV : 34|1@0+ (1,0) [0|1] "" XXX + +BO_ 117 ECM1_2: 8 ECM + +BO_ 128 NEW_MSG_5: 8 XXX + SG_ NEW_SIGNAL_2 : 26|11@0+ (1,0) [0|2047] "" XXX + SG_ NEW_SIGNAL_1 : 52|13@0+ (1,0) [0|8191] "" XXX + +BO_ 176 ECM2: 8 ECM + SG_ NEW_SIGNAL_1 : 50|11@0+ (1,0) [0|2047] "" XXX + SG_ NEW_SIGNAL_2 : 47|8@0+ (1,0) [0|63] "" XXX + +BO_ 192 Gear: 8 XXX + SG_ TransmissionGear : 36|3@0+ (1,1) [0|7] "" XXX + +BO_ 208 FSM1: 8 FSM + SG_ SET_X_E3 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SET_X_B4 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ SET_X_08 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ TrqLim : 31|8@0+ (1,-128) [0|255] "" XXX + SG_ Checksum : 55|8@0+ (1,0) [0|255] "" XXX + SG_ LKASteerDirection : 57|2@0+ (1,0) [0|2] "" XXX + SG_ SET_X_25 : 63|6@0+ (1,0) [0|63] "" XXX + SG_ LKAAngleReq : 37|14@0+ (0.04395,-360.0384) [-360.0384|359.99445] "degrees" XXX + SG_ SET_X_02 : 39|2@0+ (1,0) [0|3] "" XXX + +BO_ 224 PSCM0: 8 PSCM + SG_ NEW_SIGNAL_2 : 12|5@0+ (1,0) [0|31] "" XXX + SG_ counter_07 : 15|3@0+ (1,0) [0|7] "" XXX + SG_ counter2_07 : 37|3@0+ (1,0) [0|16383] "" XXX + SG_ rate_of_something : 46|7@0+ (1,0) [0|62] "" XXX + SG_ OneDuringDriving : 49|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 245 wheelspeed0: 8 BCM + SG_ counter1 : 21|6@0+ (1,0) [0|65535] "" XXX + SG_ counter0 : 7|16@0+ (1,0) [0|65535] "" XXX + SG_ WhlSpdLF : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ WhlSpdRF : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 272 SpeedSignal0: 8 XXX + SG_ VehicleSpeedSignal : 55|16@0+ (0.01,0) [0|65535] "" XXX + +BO_ 288 wheel_speed1: 8 BCM + SG_ WhlSpdLR : 39|16@0+ (1,0) [0|65535] "" XXX + SG_ WhlSpdRR : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 293 PSCM1: 8 PSCM + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + SG_ LKATorque : 11|12@0+ (1,-2000) [0|4095] "" XXX + SG_ SteeringAngleServo : 47|16@0+ (0.04395,-1440.1536) [0|65535] "deg" XXX + SG_ LKAActive : 15|4@0+ (1,0) [0|15] "" XXX + +BO_ 304 VehicleSpeed0: 8 BCM + SG_ NEW_SIGNAL_2 : 15|16@0+ (1,0) [0|65535] "" XXX + SG_ VehicleSpeed : 31|16@0+ (0.01,0) [0|65535] "km/h" XXX + SG_ NEW_SIGNAL_1 : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 325 ECM3: 8 ECM + +BO_ 336 VehicleSpeed1: 8 BCM + SG_ NEW_SIGNAL_2 : 31|16@0+ (1,0) [0|65535] "" XXX + SG_ NEW_SIGNAL_1 : 15|16@0+ (1,0) [0|65535] "" XXX + SG_ VehicleSpeed : 55|16@0+ (0.01,0) [0|65535] "" XXX + +BO_ 352 FSM2: 8 FSM + SG_ LkaDimLine : 51|2@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_2 : 56|7@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 55|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 7|24@0+ (1,0) [0|16777215] "" XXX + SG_ NEW_SIGNAL_4 : 36|5@0+ (1,0) [0|31] "" XXX + +BO_ 432 BrakeMessages: 8 BCM + SG_ BrakePress0 : 1|10@0+ (1,0) [0|1023] "" XXX + SG_ BrakePress1 : 33|10@0+ (1,0) [0|1023] "" XXX + SG_ BrakeStatus : 18|3@0+ (1,0) [0|7] "" XXX + +BO_ 464 DIM0: 8 DIM + +BO_ 480 BCM0: 8 BCM + +BO_ 528 CEM0: 8 CEM + +BO_ 608 CVM0: 8 CVM + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 15|5@0+ (1,0) [0|32] "" XXX + SG_ Distance : 10|11@0+ (1,0) [0|2048] "" XXX + +BO_ 624 FSM3: 8 FSM + SG_ NEW_SIGNAL_1 : 23|8@0+ (1,0) [0|255] "" XXX + +BO_ 640 FSM4: 8 FSM + SG_ SpeedTarget : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_1 : 49|10@0+ (1,0) [0|255] "" XXX + +BO_ 648 SRS0: 8 SRS + +BO_ 652 ECM4: 8 ECM + +BO_ 656 ECM5: 8 ECM + +BO_ 657 ECM6: 8 ECM + +BO_ 681 MiscCarInfo: 8 CEM + SG_ TurnSignal : 1|2@0+ (1,0) [0|3] "" XXX + SG_ HighBeamOn : 52|1@0+ (1,0) [0|1] "" XX + +BO_ 693 ECM7: 8 ECM + +BO_ 709 ACC: 8 ECM + SG_ SpeedTargetACC : 0|9@0+ (0.5,0) [0|511] "" XXX + +BO_ 853 FSM5: 8 FSM + SG_ TargetSpeedOdo : 23|8@0+ (1,0) [0|63] "kph" XXX + SG_ SpeedSign : 36|5@0+ (5,0) [0|32] "" XXX + SG_ TextUnderSign : 37|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 39|3@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ LaneMarkingsOdo : 15|4@0+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 11|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_4 : 55|16@0+ (1,0) [0|65535] "" XXX + +BO_ 864 CEM1: 8 CEM + +BO_ 912 DIM1: 8 DIM + +BO_ 968 SRS1: 8 SRS + SG_ PassengerSeatBelt : 22|1@0+ (1,0) [0|1] "" XXX + SG_ DriverSeatBelt : 19|1@0+ (1,0) [0|1] "" XXX + +BO_ 1029 CEMBCM0: 8 CEM + +BO_ 1344 NEW_MSG_1: 8 XXX + SG_ NEW_SIGNAL_1 : 4|13@0+ (1,0) [0|8191] "" XXX + +BO_ 1830 diagCEMReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1838 diagCEMResp: 8 XXX + SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 1840 diagPSCMReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1848 diagPSCMResp: 8 XXX + SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 1892 diagFSMReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1900 diagFSMResp: 8 XXX + SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 1939 diagCVMReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1947 diagCVMResp: 8 XXX + SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2015 diagGlobalReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + + + + +CM_ SG_ 85 BrakePedalActive2 "Active during braking"; +CM_ SG_ 85 NEW_SIGNAL_1 "Not yet figured out."; +CM_ SG_ 85 BrakePedalActive "Brake pedal pushed"; +CM_ SG_ 8 SteeringDirection "1=Right turn, 0=Left turn. Steering wheel pointing left or right from center (0 deg)."; +CM_ SG_ 8 RelativeTurnDirection "1=Right turn, 0=Left turn. Steering wheel currently turning the way."; +CM_ SG_ 101 NEW_SIGNAL_1 "Rate of something?"; +CM_ SG_ 192 TransmissionGear "0 = 1st gear, 1= 2nd gear..."; +CM_ SG_ 681 TurnSignal "0 = Nothing, 1= Left, 3=Right"; +CM_ SG_ 681 HighBeamOn "1=HighBeam On, 0=HighBeam Off"; +CM_ SG_ 48 ACCStatusTracking "ACC Tracking vehicle, distance control."; +CM_ SG_ 48 ACCStatusOnOff "Turns one after pressing on/off button on steering wheel"; +CM_ SG_ 48 ACCStatusActive "ACC Active"; +CM_ SG_ 48 FCWSomething "All bit set during fcw"; +CM_ SG_ 48 StatusSomething "Some status changes when zeroing DTCs"; +CM_ SG_ 208 TrqLim "Used in checksum calculation, Limit directional torque based on the number."; +CM_ SG_ 208 Checksum "Checksum calculated as a one-complement addition of LKAAngleRequest+LKADirection+Unkown, Zeros used to pad missing bits."; +CM_ SG_ 208 SET_X_02 "Bit 0 = Vibrate steering wheel., Bit 1 = Heartbeat"; +CM_ SG_ 352 LkaDimLine "Not true, but follows lka steer direction."; +CM_ SG_ 352 NEW_SIGNAL_1 "Turned one. Got LKA service needed can this be the one?"; +CM_ SG_ 640 SpeedTarget "SpeedTarget ACC (noisy bf starting acc Jumps from 0->252->0)"; +CM_ SG_ 853 TargetSpeedOdo "Probably target speed odo"; +CM_ SG_ 853 LaneMarkingsOdo "Bit 3=Left lane, Bit 2=Right lane, Bit 1=LKA on?, Bit 0=?"; +CM_ SG_ 709 SpeedTargetACC "SpeedTargetACC"; +CM_ SG_ 224 rate_of_something "Seems to be some kind of torque rather than rate."; +CM_ SG_ 224 OneDuringDriving "Set to 1 when vehicle is rolling."; +CM_ SG_ 293 byte7 "Bit0=0 when gearshift in park, else 1"; +CM_ SG_ 293 LKAActive "Bit0=0 when gear in park otherwise =1, Bit1=1 when LKA Active, 0 when not active. Bit2=? Bit3=?"; +CM_ SG_ 16 ACCOnOffBtn "Cruise control on/off button pressed"; +CM_ SG_ 16 ACCSetBtn "Acc Set button (+) pressed"; +CM_ SG_ 16 ACCStopBtn "ACC Stop button pressed"; +CM_ SG_ 16 ACCResumeBtn "ACC Resume button pressed"; +CM_ SG_ 16 ACCMinusBtn "ACC Minus (-) button pressed"; +CM_ SG_ 16 TimeGapIncreaseBtn "Increase the time gap on ACC"; +CM_ SG_ 16 TimeGapDecreaseBtn "Decrease the time gap on ACC"; +CM_ SG_ 245 counter0 "Speed based counter"; +CM_ SG_ 245 WhlSpdLF "Wheel speed left front"; +CM_ SG_ 245 WhlSpdRF "Wheel speed right front"; +CM_ SG_ 288 WhlSpdLR "Wheel speed left rear"; +CM_ SG_ 288 WhlSpdRR "Wheel speed right rear"; +CM_ SG_ 64 RPMSomething "TransmissionOutput?"; +CM_ SG_ 64 GearShifter "P=0, R=1, N=2, D=3"; +CM_ SG_ 272 VehicleSpeedSignal "km/h"; +CM_ SG_ 432 BrakePress0 "Brake being pressed"; +CM_ SG_ 432 BrakePress1 "Brake being pressed"; +CM_ SG_ 432 BrakeStatus "ACC brake?"; +CM_ SG_ 437 Counter0 "Related to braking? Maybe one per wheel?"; +CM_ SG_ 437 Counter1 "Related to braking? Maybe one per wheel?"; +CM_ SG_ 437 Counter2 "Related to braking? Maybe one per wheel?"; +CM_ SG_ 437 Counter3 "Related to braking? Maybe one per wheel?"; +CM_ SG_ 114 NEW_SIGNAL_1 "Jumped from 0 -> 120 during start. Makes triangle from time to time"; +CM_ SG_ 608 NEW_SIGNAL_1 "Status?"; +CM_ SG_ 608 NEW_SIGNAL_2 "Classification of object?"; +CM_ SG_ 608 Distance "Distance to object in front."; +CM_ SG_ 968 PassengerSeatBelt "1 = Seatbelt latched"; +CM_ SG_ 968 DriverSeatBelt "1=Seatbelt latched"; +VAL_ 64 GearShifter 0 "P" 1 "R" 2 "N" 3 "D" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/volvo_v60_2015_pt.dbc b/artifacts/package_runtime/iqdbc/dbc/volvo_v60_2015_pt.dbc new file mode 100644 index 000000000..d2b58fdd0 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/volvo_v60_2015_pt.dbc @@ -0,0 +1,298 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX BCM CEM FSM PSCM SAS + +BO_ 16 SAS0: 8 SAS + SG_ Counter0 : 3|8@0+ (1,0) [0|511] "" XXX + SG_ SteeringDirection : 6|1@0+ (1,0) [0|1] "" XXX + SG_ SteeringRateOfChange2 : 22|15@0+ (1,0) [0|32767] "" XXX + SG_ SteeringPressureOnIt : 23|1@0+ (1,0) [0|1] "" XXX + SG_ SteeringRateOfChange : 39|16@0+ (1,-32768) [0|65535] "" XXX + SG_ SteeringAngle : 53|14@0+ (0.0445,0) [0|65535] "degrees" XXX + +BO_ 32 AccPedal: 8 XXX + SG_ AccPedal : 17|10@0+ (0.1,0) [0|100.0] "%" XXX + +BO_ 81 FSM0: 8 FSM + SG_ ACCStatus : 18|3@0+ (1,0) [0|7] "" XXX + +BO_ 277 NEW_MSG_7: 8 XXX + SG_ NEW_SIGNAL_1 : 39|16@0+ (1,0) [0|65535] "" XXX + +BO_ 295 CCButtons: 8 CEM + SG_ ACCMinusBtnInv : 32|1@0+ (1,0) [0|1] "" XXX + SG_ TimeGapIncreaseBtnInv : 33|1@0+ (1,0) [0|1] "" XXX + SG_ TimeGapDecreaseBtnInv : 34|1@0+ (1,0) [0|1] "" XXX + SG_ ACCOnOffBtnInv : 43|1@0+ (1,0) [0|1] "" XXX + SG_ ACCResumeBtnInv : 45|1@0+ (1,0) [0|1] "" XXX + SG_ ACCSetBtnInv : 47|1@0+ (1,0) [0|1] "" XXX + SG_ ACCMinusBtn : 48|1@0+ (1,0) [0|1] "" XXX + SG_ TimeGapIncreaseBtn : 49|1@0+ (1,0) [0|1] "" XXX + SG_ TimeGapDecreaseBtn : 50|1@0+ (1,0) [0|1] "" XXX + SG_ ACCOnOffBtn : 59|1@0+ (1,0) [0|1] "" XXX + SG_ ACCResumeBtn : 61|1@0+ (1,0) [0|1] "" XXX + SG_ ACCSetBtn : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 298 EngineData: 8 XXX + SG_ NEW_SIGNAL_1 : 1|10@0+ (1,0) [0|1023] "" XXX + SG_ BrakePressed2 : 2|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 25|2@0+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 33|10@0- (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_3 : 34|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 35|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 36|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 37|1@0+ (1,0) [0|1] "" XXX + SG_ BrakePressed : 38|1@0+ (1,0) [0|1] "" XXX + SG_ EngineRpm : 52|13@0+ (1,0) [0|8000] "" XXX + +BO_ 307 NEW_MSG_133: 8 XXX + SG_ Brake : 14|7@0+ (1,0) [0|127] "" XXX + +BO_ 328 VehicleSpeed1: 8 XXX + SG_ BrakePressure2 : 33|10@0+ (1,0) [0|63] "" XXX + SG_ COUNTER : 37|4@0+ (1,0) [0|15] "" XXX + SG_ VehicleSpeed : 55|16@0+ (0.01,0) [0|65535] "" XXX + +BO_ 336 NEW_MSG_8: 8 XXX + SG_ NEW_SIGNAL_1 : 3|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_2 : 19|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_3 : 35|12@0+ (1,0) [0|4095] "" XXX + SG_ NEW_SIGNAL_4 : 51|12@0+ (1,0) [0|4095] "" XXX + +BO_ 359 ACC_Speed: 8 XXX + SG_ ACC_Speed : 0|8@0+ (1,0) [0|255] "km/h" XXX + SG_ GasPedal : 51|12@0- (1,0) [0|255] "" XXX + SG_ GasPressed : 52|1@0+ (1,0) [0|1] "" XXX + +BO_ 384 Accessories_02: 8 XXX + SG_ Park_Assist_State : 42|1@0+ (1,0) [0|1] "" XXX + SG_ StartStop_Inv : 44|1@0+ (1,0) [0|1] "" XXX + +BO_ 465 NEW_MSG_4: 8 XXX + SG_ BrakePressedInv : 3|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 55|16@0+ (1,0) [0|4095] "" XXX + +BO_ 522 Brake_Info: 8 XXX + SG_ NEW_SIGNAL_2 : 1|1@0+ (1,0) [0|1] "" XXX + SG_ COUNTER : 11|4@0+ (1,0) [0|15] "" XXX + SG_ BrakeCmd : 13|1@0+ (1,0) [0|1] "" XXX + SG_ BrakePressure : 17|10@0+ (1,0) [0|255] "" XXX + SG_ BrakePedal : 19|2@0+ (1,0) [0|3] "" XXX + SG_ BrakePedal2 : 33|2@0+ (1,0) [0|3] "" XXX + SG_ CHECKSUM : 39|4@0+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 544 wheelspeed1: 8 BCM + SG_ WhlSpdRR : 39|16@0+ (0.01,-327.68) [0|65535] "" XXX + SG_ WhlSpdLR : 55|16@0+ (0.01,-327.68) [0|65535] "" XXX + +BO_ 565 wheelspeed0: 8 BCM + SG_ WhlSpdRF : 39|16@0+ (0.01,-327.68) [0|65535] "" XXX + SG_ WhlSpdLF : 55|16@0+ (0.01,-327.68) [0|65535] "" XXX + +BO_ 582 PSCM1: 8 PSCM + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ SteeringWheelRateOfChange : 15|8@0+ (1,0) [0|255] "" XXX + SG_ SteeringAngleServo : 23|16@0+ (0.0447,-1464.8) [0|65535] "deg" XXX + SG_ LKATorque : 35|12@0+ (1,-2000) [0|65535] "" XXX + SG_ byte4 : 39|4@0+ (1,0) [0|15] "" XXX + SG_ LKAActive : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 608 FSM1: 8 FSM + SG_ ACC_Distance : 7|8@0+ (1,0) [0|255] "" XXX + +BO_ 609 fromWhere: 8 XXX + SG_ COUNTER : 3|4@0+ (1,0) [0|15] "" XXX + SG_ CHECKSUM : 15|4@0+ (1,0) [0|15] "" XXX + SG_ SteeringAngle : 21|14@0+ (0.1,-1021) [0|65535] "deg" XXX + +BO_ 610 FSM2: 8 FSM + SG_ SET_X_22 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ TrqLim : 23|8@0+ (1,-128) [0|255] "" PSCM + SG_ LKAAngleReq : 29|14@0+ (0.04,-327.68) [0|16383] "" PSCM + SG_ SET_X_02 : 31|2@0+ (1,0) [0|3] "" XXX + SG_ LKASteerDirection : 41|2@0+ (1,0) [0|3] "" PSCM + SG_ SET_X_10 : 47|6@0+ (1,0) [0|63] "" XXX + SG_ Checksum : 55|8@0+ (1,0) [0|255] "" PSCM + SG_ SET_X_A4 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 612 Accessories_03: 8 XXX + SG_ Park_Assist_Button : 60|1@0+ (1,0) [0|1] "" XXX + +BO_ 624 FSM3: 8 FSM + SG_ ACC_Standstill : 0|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Check : 2|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_AccelDecel : 15|8@0+ (1,0) [0|255] "" XXX + SG_ ACC_Some : 17|10@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 47|8@0+ (1,0) [0|255] "" XXX + +BO_ 648 BrakePedal: 8 XXX + SG_ Counter : 0|3@1+ (1,0) [0|6] "" XXX + SG_ BrakePressure : 17|10@0+ (1,0) [0|1023] "" XXX + +BO_ 750 HandBrake: 8 XXX + SG_ Hand_Brake_Button : 33|2@0+ (1,0) [0|3] "" XXX + SG_ Hand_Brake_State : 44|4@0+ (1,0) [0|15] "" XXX + +BO_ 794 FSM4: 8 FSM + SG_ ACC_LeadSpeed : 31|8@0+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_2 : 32|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 47|16@0+ (1,-46090) [0|16383] "" XXX + +BO_ 802 StartStop: 8 XXX + SG_ StartStop : 8|1@0+ (1,0) [0|1] "" XXX + +BO_ 923 Accessories_01: 8 XXX + SG_ NEW_SIGNAL_1 : 15|16@0+ (1,0) [0|65535] "" XXX + SG_ Wipers : 38|2@0+ (1,0) [0|3] "" XXX + +BO_ 1006 Doors: 8 XXX + SG_ DriverDoorClosed : 8|1@0+ (1,0) [0|1] "" XXX + SG_ PassengerDoorClosed : 9|1@0+ (1,0) [0|1] "" XXX + +BO_ 1021 FSM5: 8 FSM + SG_ TSR_Speed : 25|4@1+ (10,0) [0|15] "km/h" XXX + +BO_ 1024 NEW_MSG_400: 8 XXX + SG_ NEW_SIGNAL_1 : 25|8@0+ (1,0) [0|255] "" XXX + +BO_ 1039 MiscCarInfo: 8 XXX + SG_ TurnSignal : 33|2@0+ (1,0) [0|3] "" XXX + +BO_ 1174 Lights: 8 XXX + SG_ High_Beam : 23|1@0+ (1,0) [0|1] "" XXX + +BO_ 1279 PSCM3: 8 PSCM + +BO_ 1830 diagCEMReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1838 diagCEMResp: 8 XXX + SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 1840 diagPSCMReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1848 diagPSCMResp: 8 XXX + SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 1892 diagFSMReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1900 diagFSMResp: 8 XXX + SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 1939 diagCVMReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +BO_ 1947 diagCVMResp: 8 XXX + SG_ byte03 : 7|32@0+ (1,0) [0|4294967295] "" XXX + SG_ byte47 : 39|32@0+ (1,0) [0|4294967295] "" XXX + +BO_ 2015 diagGlobalReq: 8 XXX + SG_ byte0 : 7|8@0+ (1,0) [0|255] "" XXX + SG_ byte1 : 15|8@0+ (1,0) [0|255] "" XXX + SG_ byte2 : 23|8@0+ (1,0) [0|255] "" XXX + SG_ byte3 : 31|8@0+ (1,0) [0|255] "" XXX + SG_ byte4 : 39|8@0+ (1,0) [0|255] "" XXX + SG_ byte5 : 47|8@0+ (1,0) [0|255] "" XXX + SG_ byte6 : 55|8@0+ (1,0) [0|255] "" XXX + SG_ byte7 : 63|8@0+ (1,0) [0|255] "" XXX + +CM_ SG_ 16 SteeringDirection "0 = CCW, 1=CW (turning left or right of center)"; +CM_ SG_ 16 SteeringRateOfChange "Rate of change? Torque?"; +CM_ SG_ 81 ACCStatus "0=Acc Unavailable, 1=???, 2=Acc Ready, 3,4=???, 6= Acc Active, 7=Acc active tracking object (probably)"; +CM_ SG_ 295 ACCMinusBtnInv "Active zero when button pressed."; +CM_ SG_ 295 TimeGapIncreaseBtnInv "Active zero when button pressed."; +CM_ SG_ 295 TimeGapDecreaseBtnInv "Active zero when button pressed."; +CM_ SG_ 295 ACCOnOffBtnInv "Active zero when button pressed."; +CM_ SG_ 295 ACCResumeBtnInv "Active zero when button pressed."; +CM_ SG_ 295 ACCSetBtnInv "Active zero when button pressed."; +CM_ SG_ 295 ACCMinusBtn "ACC Minus (-) button pressed"; +CM_ SG_ 295 TimeGapIncreaseBtn "Increase the time gap on ACC"; +CM_ SG_ 295 TimeGapDecreaseBtn "Decrease the time gap on ACC"; +CM_ SG_ 295 ACCOnOffBtn "Cruise control on/off button pressed"; +CM_ SG_ 295 ACCResumeBtn "ACC Resume button pressed"; +CM_ SG_ 295 ACCSetBtn "Acc Set button (+) pressed"; +CM_ SG_ 298 NEW_SIGNAL_4 "related to gas pedal"; +CM_ SG_ 298 NEW_SIGNAL_5 "related to ACCStatus"; +CM_ SG_ 298 NEW_SIGNAL_6 "went high at same time as ACCStatus >= 2"; +CM_ SG_ 298 BrakePressed "driver"; +CM_ SG_ 298 EngineRpm "Might be engine rpm. But behaves a bit weird."; +CM_ SG_ 582 byte0 "0=CCW, 1=CW, bit 2,"; +CM_ SG_ 582 SteeringWheelRateOfChange "Some rate of change for steering wheel? Torque?"; +CM_ SG_ 582 byte4 "High nibble"; +CM_ SG_ 582 LKAActive "Bit 1, 1 When LKA Active, Bit 3, 1 When denying?"; +CM_ SG_ 608 ACC_Distance "Seems to track distance, or speed of vehicle in front."; +CM_ SG_ 610 SET_X_22 "0x20 Heartbeat, VEgo <58kph = 0x03, VEgo >65kph = 0x04, 0x05"; +CM_ SG_ 624 ACC_AccelDecel "Might be some acc speed, moved a bit after activating acc"; +CM_ SG_ 624 ACC_Some "Jumps to life after activating ACC, 0 when not active"; +CM_ SG_ 648 Counter "counts 0 to 6"; +CM_ SG_ 1021 TSR_Speed "Traffic Sign Recognition speed"; +CM_ SG_ 1039 TurnSignal "0 = Nothing, 1= Left, 3=Right"; +VAL_ 522 BrakePedal 1 "Not Pressed" 2 "Pressed"; diff --git a/artifacts/package_runtime/iqdbc/dbc/vw_meb.dbc b/artifacts/package_runtime/iqdbc/dbc/vw_meb.dbc new file mode 100644 index 000000000..c22407cca --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/vw_meb.dbc @@ -0,0 +1,3530 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: BAP_Tester BedienDisp_vo BedienSG_hi CGS DDA Gateway Gateway_PAG GurtMikrofon OTA_FC ZR_High ZR_LIMU ZR_MIB_TOP_ab_Gen3 ZR_Standard + + +BO_ 64 Airbag_01: 8 Gateway + SG_ Airbag_01_CRC : 0|8@1+ (1,0) [0|255] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway + SG_ Airbag_01_BZ : 8|4@1+ (1,0) [0|15] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway + SG_ AB_RGS_Anst : 12|4@1+ (1,0) [0|15] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Front_Crash : 16|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Heck_Crash : 17|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_SF_Crash : 18|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_SB_Crash : 19|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Rollover_Crash : 20|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Crash_Int : 21|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,Sub_Gateway,TME + SG_ AB_Lampe : 24|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Deaktiviert : 25|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_VB_deaktiviert : 26|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Systemfehler : 27|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Diagnose : 28|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Stellgliedtest : 29|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway,TME + SG_ AB_Erh_Auf_VB : 30|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Gurtwarn_VF : 32|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Gurtwarn_VB : 33|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Anzeige_Fussg : 34|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Texte_AKS : 36|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_MKB_gueltig : 39|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_MKB_Anforderung : 40|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Versorgungsspannung : 41|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Deaktivierung_HV : 42|3@1+ (1,0) [0|7] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway,TME + SG_ AB_EDR_Trigger : 45|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Belegung_VF : 47|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ SC_Masterzeit_Offset : 53|2@1+ (5.08,0) [0|15.24] "Unit_Secon" FCU_MLBevo_FCEV,Sub_Gateway + SG_ SC_LowSpeedCrashErkannt : 55|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ SC_Masterzeit : 57|7@1+ (0.04,0) [0|5.04] "Unit_Secon" FCU_MLBevo_FCEV,Sub_Gateway + +BO_ 134 LWI_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ LWI_Sensorstatus : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ LWI_MFL_Abschaltung : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ LWI_Lenkradwinkel : 16|13@1+ (0.0843,0) [0|800] "Unit_DegreOfArc" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" OTA_FC,ZR_High + SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" Vector__XXX + +BO_ 159 LH_EPS_03: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_DSR_Status : 12|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Berechneter_LW : 16|12@1+ (0.15,0) [0|613.95] "Unit_DegreOfArc" XXX + SG_ EPS_BLW_QBit : 30|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_BLW : 31|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_HCA_Status : 32|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Lenkmoment : 40|10@1+ (1,0) [0|8] "Unit_centiNewtoMeter" XXX + SG_ EPS_Lenkmoment_QBit : 54|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_Lenkmoment : 55|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_Lenkungstyp : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 167 Motor_11: 8 Motor_Diesel_MQB + SG_ Motor_11_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ Motor_11_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Soll_Roh : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Ist_Summe : 22|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,SAK_MQB + SG_ MO_Mom_Traegheit_Summe : 32|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Soll_gefiltert : 42|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Schub : 52|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Status_Normalbetrieb_01 : 61|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_erste_Ungenauschwelle : 62|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_QBit_Motormomente : 63|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 168 Motor_12: 8 Motor_Diesel_MQB + SG_ Motor_12_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ Motor_12_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Mom_neg_verfuegbar : 12|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB + SG_ MO_Mom_Begr_stat : 21|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Begr_dyn : 30|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB + SG_ MO_Momentenintegral_02 : 40|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Drehzahl_01 : 47|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Drehzahl_01 : 48|16@1+ (0.25,0) [0|16383] "Unit_MinutInver" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB + +BO_ 173 Getriebe_11: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ GE_MMom_Soll_02 : 12|10@1+ (1,-509) [-509|509] "" Vector__XXX + SG_ GE_MMom_Vorhalt_02 : 22|10@1+ (1,-509) [-509|509] "" Vector__XXX + SG_ GE_Uefkt : 32|10@1+ (0.1,0) [0|102.2] "" Vector__XXX + SG_ GE_Fahrstufe : 42|4@1+ (1,0) [0|15] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ GE_reserv_Fahrstufe : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GE_Schaltablauf : 47|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ GE_Uefkt_unplausibel : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GE_MMom_Status_02 : 50|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ GE_Status_Kraftschluss : 53|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ GE_MMom_Status : 56|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ GE_Freig_MMom_Vorhalt : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GE_Verbot_Ausblendung : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GE_Zielgang : 60|4@1+ (1,0) [0|15] "" OTA_FC,ZR_High + +BO_ 184 EM1_HYB_13: 8 Gateway + SG_ EM1_Freigabe_Info_WFS : 12|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Sperr_Info_WFS : 13|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_AR_aktiv : 14|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Eta_Sys : 15|9@1+ (0.2,0) [0|101.8] "Unit_PerCent" Sub_Gateway + SG_ EM1_IstStrom : 24|11@1+ (1,-1023) [-1023|1022] "Unit_Amper" Sub_Gateway + SG_ EM1_Fehler_ElAntriebFreilauf_Anf : 35|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Abregelung_Temperatur : 36|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_AnlernenElMotor_Anf : 43|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Moment_HVVerbraucher : 44|10@1+ (1,-511) [-511|511] "Unit_NewtoMeter" Sub_Gateway + SG_ EM1_Freigabe_Verfallsinfo_WFS : 55|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Parken_WFS_Status : 56|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ EM1_HV_betriebsbereit : 58|1@1+ (1,0) [0|1] "" Sub_Gateway + +BO_ 190 MEB_HVEM_01: 48 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Engine_RPM_Max : 12|14@1+ (2,-9658) [0|15] "RPM" XXX + SG_ Engine_RPM_Min : 26|14@1+ (2,-10300) [0|63] "RPM" XXX + SG_ In_Motion_04 : 48|3@1+ (1,0) [0|7] "" XXX + SG_ In_Motion_03 : 52|1@0+ (1,0) [0|1] "" XXX + SG_ In_Motion_02 : 54|1@0+ (1,0) [0|1] "" XXX + SG_ Engine_Power : 56|12@1+ (0.5,-1023) [0|255] "kW" XXX + SG_ In_Motion : 68|1@1+ (1,0) [0|3] "" XXX + SG_ Standstill : 71|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_04 : 72|10@1+ (1,0) [0|255] "" XXX + SG_ Voltage : 86|12@1+ (0.24,0) [0|3] "V" XXX + SG_ Unknown_01 : 100|9@1+ (1,0) [0|7] "" XXX + SG_ Battery_Voltage : 113|13@1+ (0.065,0) [0|127] "V" XXX + SG_ Engine_Status : 296|2@1+ (1,0) [0|3] "" XXX + SG_ Inactive : 300|1@0+ (1,0) [0|1] "" XXX + SG_ Inactive_02 : 303|1@0+ (1,0) [0|1] "" XXX + +BO_ 192 EM1_01: 32 XXX + SG_ Schubbetrieb : 79|1@0+ (1,0) [0|1] "" XXX + +BO_ 247 MEB_HVEM_02: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 44|10@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 54|7@1+ (1,0) [0|3] "" XXX + +BO_ 253 ESP_21: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BR_Eingriffsmoment : 12|10@1+ (1,-509) [-509|509] "" Vector__XXX + SG_ ESP_Diagnose : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ ESC_v_Signal_Qualifier_High_Low : 24|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ESP_Vorsteuerung : 28|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ OBD_Schlechtweg : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ OBD_QBit_Schlechtweg : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0|655.32] "Unit_KiloMeterPerHour" BedienSG_hi,DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ASR_Tastung_passiv : 48|1@1+ (1,0) [0|1] "" OTA_FC + SG_ ESP_Tastung_passiv : 49|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ESP_Systemstatus : 50|1@1+ (1,0) [0|1] "" OTA_FC + SG_ ASR_Schalteingriff : 51|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_QBit_v_Signal : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ABS_Bremsung : 56|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ASR_Anf : 57|1@1+ (1,0) [0|1] "" ZR_High + SG_ MSR_Anf : 58|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ EBV_Eingriff : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EDS_Eingriff : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Eingriff : 61|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ ESP_ASP : 62|1@1+ (1,0) [0|1] "" ZR_High + SG_ ESC_Neutralschaltung : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 261 VMM_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 13|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 40|2@1+ (1,0) [0|3] "" XXX + SG_ Brake : 53|7@1+ (1,0) [0|3] "" XXX + +BO_ 278 ESP_10: 8 Gateway_MQB + SG_ ESP_10_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_10_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_VL : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_VR : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_HL : 14|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_HR : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_VL : 16|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_VR : 26|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_HL : 36|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_HR : 46|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VL_Fahrtrichtung : 56|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VR_Fahrtrichtung : 58|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HL_Fahrtrichtung : 60|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HR_Fahrtrichtung : 62|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 285 LH_EPS_02: 8 Gateway_D4C7 + SG_ EPS_02_CRC : 0|8@1+ (1,0) [0|255] "" SCU_D4 + SG_ EPS_02_BZ : 8|4@1+ (1,0) [0|15] "" SCU_D4 + SG_ EPS_Notlauf : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ EPS_Lastinfo : 16|8@1+ (1,0) [0|253] "Unit_Amper" Vector__XXX + SG_ EPS_Unterstuetzungsleistung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" SCU_D4 + SG_ EPS_Drehzahlreserve : 32|7@1+ (10,0) [0|1000] "Unit_DegreOfArcPerSecon" SCU_D4 + SG_ EPS_VZ_Drehzahlreserve : 39|1@1+ (1,0) [0|1] "" SCU_D4 + SG_ EPS_Leistungsanforderung : 40|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 294 HCA_01: 8 Frontsensorik + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HCA_01_Vib_Freq : 12|4@1+ (1,15) [18|30] "Unit_Hertz" Vector__XXX + SG_ HCA_01_LM_Offset : 16|9@1+ (1,0) [0|511] "Unit_centiNewtoMeter" Vector__XXX + SG_ EA_ACC_Sollstatus : 25|2@1+ (1,0) [0|3] "" Frontradar + SG_ EA_Ruckprofil : 27|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HCA_01_Enable : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_LM_OffSign : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Available : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Standby : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Request : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Vib_Amp : 36|4@1+ (0.2,0) [0|3] "Unit_NewtoMeter" Vector__XXX + SG_ EA_Ruckfreigabe : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EA_ACC_Wunschgeschwindigkeit : 41|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Frontradar + +BO_ 299 GRA_ACC_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ GRA_Hauptschalter : 12|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Abbrechen : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Typ_Hauptschalter : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Limiter : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Setzen : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Hoch : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Runter : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Wiederaufnahme : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Verstellung_Zeitluecke : 20|2@1+ (1,0) [0|3] "" ZR_High + SG_ GRA_Codierung : 22|2@1+ (1,0) [0|3] "" ZR_High + SG_ GRA_Fehler : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_LIM_Taste_verfuegbar : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Stufe_2 : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_ButtonTypeInfo : 27|3@1+ (1,0) [0|7] "" ZR_High + SG_ GRA_TravelAssist : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GRA_reserveByte4 : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GRA_reserveByte5 : 32|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ GRA_reserveByte6 : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ GRA_reserveByte7 : 48|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ GRA_reserveByte8 : 56|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 312 IPA_01: 32 XXX + +BO_ 319 PreCrash_02: 8 Gateway + SG_ PreCrash_02_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ PreCrash_02_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PreCrash_Charisma_FahrPr : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PreCrash_Charisma_Status : 16|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PreCrash_Schiebedach_schliessen : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_Fenster_schliessen : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_Blinken : 20|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreSense_FCWP : 23|1@1+ (1,0) [0|1] "" NightVision + SG_ PreCrash_Tueren_Verriegeln : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_Anforderung_AFR : 26|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreCrash_LED : 29|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PreCrash_FS_Pneumatik_ansteuern : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_BFS_Pneumatik_ansteuern : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_Fo_Pneumatik_ansteuern : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_FS_Sitzlehne_verfahren : 34|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PreCrash_BFS_Sitzlehne_verfahren : 37|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PreCrash_Fo_Sitzlehne_verfahren : 40|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PreCrash_FS_KSV_verfahren : 43|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PreCrash_BFS_KSV_verfahren : 47|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PreCrash_Fo_KSV_verfahren : 51|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ SC_PreCrash_Warnung : 56|4@1+ (1,0) [0|15] "" NightVision + SG_ SC_PreCrash_Texte : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 332 Motor_54: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Accelerator_Pressure : 175|8@0+ (0.4,-14.8) [0|100] "Unit_Percent" XXX + +BO_ 333 ACC_18: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_limitierte_Anfahrdyn : 12|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_nachtr_Stopp_Anf : 13|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_DynErhoehung : 14|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_StartStopp_Info : 22|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Sollbeschleunigung_02 : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_neg_Sollbeschl_Grad_02 : 40|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_pos_Sollbeschl_Grad_02 : 48|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ : 58|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalteweg : 64|11@1+ (0.01,0) [0|2046] "" XXX + SG_ ACC_Anforderung_HMS : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SET_ME_0XFE : 80|8@1+ (1,0) [0|255] "" XXX + SG_ ACC_AKTIV_regelt : 90|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X1 : 92|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X9 : 232|4@1+ (1,0) [0|15] "" XXX + SG_ Speed : 236|12@1+ (0.1,0) [0|15] "" XXX + SG_ Accel_Boost : 248|6@1+ (1,0) [0|3] "" XXX + SG_ Reversing : 254|1@0+ (1,0) [0|1] "" XXX + +BO_ 339 MSG_HYB_30: 8 Gateway + SG_ MSG_HYB_30_CRC : 0|8@1+ (1,0) [0|255] "" Ladegeraet_Konzern + SG_ MSG_HYB_30_BZ : 8|4@1+ (1,0) [0|15] "" Ladegeraet_Konzern + SG_ MO_HVEM_Eskalation : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_ErwGrenzen_Anf : 13|1@1+ (1,0) [0|1] "" BMC_MLBevo + SG_ MO_Fehler_Notentladung_Anf : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_HVEM_MaxLeistung : 15|9@1+ (50,0) [0|25450] "Unit_Watt" Vector__XXX + SG_ MO_HVK_EmIstzustand : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ MO_HVK_AntriebFehlerstatus : 37|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_Bordnetz_Anf : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_HVK_AntriebZustand : 41|3@1+ (1,0) [0|7] "" TME + SG_ MO_HVK_EmFehlerstatus : 44|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_AntriebFehlerstatus : 47|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_AntriebZustand : 50|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_EmFehlerstatus : 53|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_EmIstzustand : 56|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 387 MEB_Camera_01: 64 XXX + SG_ NEW_SIGNAL_1 : 191|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 200|9@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 209|9@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_9 : 218|6@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_10 : 224|8@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_4 : 232|9@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 241|9@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_8 : 250|6@1+ (1,0) [0|63] "" XXX + SG_ Lane_Center_Offset : 256|12@1+ (0.001,-2.5) [0|255] "Unit_Meter" XXX + SG_ NEW_SIGNAL_6 : 268|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 280|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_11 : 292|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 304|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 320|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_14 : 332|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_15 : 344|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_16 : 356|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_17 : 368|10@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_18 : 384|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_19 : 396|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_20 : 408|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_21 : 420|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_22 : 432|5@1+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_23 : 448|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_24 : 460|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_25 : 472|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_26 : 484|12@1+ (1,0) [0|15] "" XXX + +BO_ 420 EA_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ EA_Parken_beibehalten_HMS : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Warnruckprofil : 28|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_eCall_Anf : 31|2@1+ (1,0) [0|3] "" ZR_High + SG_ EA_Funktionsstatus : 40|4@1+ (1,0) [0|15] "" ZR_High + SG_ EA_Gurtstraffer_Anf : 44|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Anforderung_HMS : 48|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Sollbeschleunigung : 53|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" Vector__XXX + +BO_ 496 EA_02: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ EA_Texte : 12|4@1+ (1,0) [0|15] "" ZR_High + SG_ ACF_Lampe_Hands_Off : 16|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Infotainment_Anf : 22|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ EA_Tueren_Anf : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ EA_Innenraumlicht_Anf : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ zFAS_Warnblinken : 26|2@1+ (1,0) [0|3] "" ZR_High + SG_ STP_Primaeranz : 28|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Bremslichtblinken : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EA_Blinken : 32|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Unknown : 60|3@0+ (1,0) [0|7] "" XXX + +BO_ 517 SAM_01: 8 XXX + SG_ Brake_Light : 36|1@0+ (1,0) [0|1] "" XXX + SG_ Left_Blinker : 37|1@0+ (1,0) [0|1] "" XXX + SG_ Right_Blinker : 38|1@0+ (1,0) [0|1] "" XXX + +BO_ 518 Parken_01: 24 XXX + SG_ CHK : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ AEB_Active : 16|1@0+ (1,0) [0|1] "" XXX + +BO_ 522 EML_06: 64 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Yaw_Rate_VZ : 33|1@1+ (1,0) [0|1] "" XXX + SG_ Yaw_Rate : 200|16@1+ (0.007,-229.34) [0|255] "" XXX + +BO_ 564 MEB_Camera_02: 64 XXX + SG_ NEW_SIGNAL_1 : 12|6@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 18|6@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_3 : 24|6@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_4 : 30|6@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_7 : 178|13@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_6 : 192|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 286|9@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_5 : 295|9@1+ (1,0) [0|255] "" XXX + +BO_ 588 MEB_Side_Assist_01: 16 XXX + SG_ Blind_Spot_Passenger : 12|7@1+ (1,0) [0|15] "" XXX + SG_ Blind_Spot_Driver : 19|7@1+ (1,0) [0|15] "" XXX + SG_ Blind_Spot_Info_Passenger : 26|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Warn_Passenger : 27|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Info_Driver : 29|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Warn_Driver : 30|1@0+ (1,0) [0|1] "" XXX + SG_ Lower_Speed_01 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ Higher_Speed_01 : 33|1@0+ (1,0) [0|1] "" XXX + SG_ Higher_Speed_02 : 83|1@0+ (1,0) [0|1] "" XXX + SG_ Lower_Speed_02 : 84|1@0+ (1,0) [0|1] "" XXX + SG_ Standstill : 86|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 98|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 119|1@0+ (1,0) [0|1] "" XXX + +BO_ 589 MEB_Side_Assist_02: 64 XXX + SG_ Unknown_01 : 100|3@0+ (1,0) [0|7] "" XXX + SG_ Unknown_02 : 108|3@0+ (1,0) [0|7] "" XXX + +BO_ 591 MEB_Distance_01: 64 XXX + SG_ Unknown_01 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Distance_Status : 13|2@1+ (1,0) [0|3] "" XXX + SG_ Same_Lane_01_ObjectID : 16|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Left_Lane_01_ObjectID : 22|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Right_Lane_01_ObjectID : 28|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Same_Lane_02_ObjectID : 34|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Left_Lane_02_ObjectID : 40|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Right_Lane_02_ObjectID : 46|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Unknown_02 : 52|2@1+ (1,0) [0|3] "" XXX + SG_ Unknown_03 : 54|10@1+ (1,0) [0|3] "" XXX + SG_ Same_Lane_01_Long_Distance : 64|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Same_Lane_01_Lat_Distance : 76|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Same_Lane_01_Rel_Velo : 86|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Left_Lane_01_Long_Distance : 96|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Left_Lane_01_Lat_Distance : 108|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Left_Lane_01_Rel_Velo : 118|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Right_Lane_01_Long_Distance : 128|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Right_Lane_01_Lat_Distance : 140|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Right_Lane_01_Rel_Velo : 150|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Same_Lane_02_Long_Distance : 160|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Same_Lane_02_Lat_Distance : 172|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Same_Lane_02_Rel_Velo : 182|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Left_Lane_02_Long_Distance : 192|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Left_Lane_02_Lat_Distance : 204|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Left_Lane_02_Rel_Velo : 214|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Right_Lane_02_Long_Distance : 224|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Right_Lane_02_Lat_Distance : 236|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Right_Lane_02_Rel_Velo : 246|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Same_Lane_01_Unknown_01 : 256|8@1+ (1,-128) [0|31] "" XXX + SG_ Same_Lane_01_Unknown_02 : 264|6@1+ (1,-15) [0|31] "" XXX + SG_ Same_Lane_01_Unknown_03 : 270|6@1+ (1,0) [0|127] "" XXX + SG_ Same_Lane_01_Unknown_04 : 277|6@1+ (1,0) [0|7] "" XXX + SG_ Same_Lane_01_Unknown_05 : 284|6@1+ (1,0) [0|1] "" XXX + +BO_ 605 KLR_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KLR_Fehler : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_ResponseError : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Lokalaktiv : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Fehler_Codierung : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Touchintensitaet_1 : 16|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchintensitaet_2 : 24|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchintensitaet_3 : 32|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchauswertung : 40|4@1+ (1,0) [0|15] "" ZR_High + +BO_ 695 RCTA_01: 8 XXX + SG_ RCTA_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ RCTA_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 706 Motor_41: 8 Gateway + SG_ MO_Anzeige_StSt_Text : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MO_Anzeige_StSt_Symbol : 16|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_ADR_Status : 19|2@1+ (1,0) [0|3] "" ZR_High + SG_ MO_AGA_Sound_Texte : 21|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Anzeige_FMAus_Text : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Fehler_MSpG : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PEA_Texte : 25|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_Ueberstimmt_vMax_FahrerInfo : 28|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Avus_Motorschutz : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Rekuperationsstufe : 32|3@1+ (1,0) [0|7] "" OTA_FC + SG_ TSK_Einheit_vMax_FahrerInfo : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_Status_vMax_FahrerInfo : 36|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Red_Fahrleistung : 38|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_Anz_Kuehlerluefter : 47|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_im_Leerlauf : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Enable_Oeldr_Motor : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_OelMessung_Dauer : 52|4@1+ (15,15) [15|225] "Unit_Secon" Vector__XXX + SG_ TSK_vMax_FahrerInfo : 56|8@1+ (1,15) [16|270] "" Vector__XXX + +BO_ 768 MEB_ACC_01: 48 XXX + SG_ ACC_Tempolimit : 64|5@1+ (1,0) [0|31] "" OTA_FC + SG_ ACC_Wunschgeschw_Farbe : 69|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Warnung_Verkehrszeichen_1 : 70|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACA_Querfuehrung : 71|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ Unknown_02 : 73|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Regelung_AIO : 75|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ACC_Wunschgeschw_02 : 76|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Vector__XXX + SG_ ACC_Abstandsindex_02 : 86|10@1+ (1,0) [1|1021] "" Vector__XXX + SG_ ACC_Display_Prio : 96|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_rel_Objekt_Zusatzanz : 98|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_Gesetzte_Zeitluecke : 101|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ACC_Optischer_Fahrerhinweis : 104|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Warnhinweis : 105|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_EGO_Fahrzeug : 106|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ACC_Relevantes_Objekt_02 : 109|2@1+ (1,0) [0|3] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ACC_Wunschgeschw_erreicht : 112|1@1+ (1,0) [0|1] "" OTA_FC + SG_ ACC_Anzeige_Zeitluecke : 113|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Texte_Primaeranz_02 : 114|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ ACC_Texte_Zusatzanz_02 : 120|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ STA_Primaeranz : 126|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_Event_Wunschgeschw : 140|10@1+ (0.32,0) [0|15] "" XXX + SG_ Heartbeat : 150|9@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0XFFFF : 160|16@1+ (1,0) [0|65535] "" XXX + SG_ ACC_Enabled : 186|1@0+ (1,0) [0|1] "" XXX + SG_ Zeitluecke_Farbe : 189|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X1 : 199|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Status_ACC : 208|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Akustischer_Fahrerhinweis : 211|2@1+ (1,0) [0|1] "" XXX + SG_ Unknown_08 : 224|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_01 : 225|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_06 : 226|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_07 : 228|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X7FFF : 240|16@1+ (1,0) [0|65535] "" XXX + SG_ Unknown_09 : 262|1@0+ (1,0) [0|3] "" XXX + SG_ Lead_Type_Detected : 265|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Standby_Override : 266|1@0+ (1,0) [0|1] "" XXX + SG_ Street_Color : 267|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Limiter_Mode : 268|1@0+ (1,0) [0|1] "" XXX + SG_ Lead_Brightness : 269|4@1+ (1,0) [0|7] "" XXX + SG_ SET_ME_0X6A : 273|8@1+ (1,0) [0|7] "" XXX + SG_ Lead_Position : 281|2@1+ (1,0) [0|1] "" XXX + SG_ Lead_Type : 287|3@1+ (1,0) [0|3] "" XXX + SG_ Lead_Distance : 290|10@1+ (0.2,0) [0|7] "Unit_Meter" XXX + SG_ Lead_Distance_Right : 300|10@1+ (0.2,0) [0|15] "Unit_Meter" XXX + SG_ Lead_Distance_Left : 310|10@1+ (0.2,0) [0|3] "Unit_Meter" XXX + SG_ ACC_Events : 332|4@0+ (1,0) [0|3] "Unit_Meter" XXX + SG_ Zeitluecke_1 : 334|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_2 : 344|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_3 : 354|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_4 : 364|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_5 : 374|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + +BO_ 771 HCA_03: 24 XXX + SG_ RequestStatus : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Power : 16|8@1+ (0.4,0) [0.0|100.0] "Unit_Percent" XXX + SG_ Curvature : 24|15@1+ (6.7e-06,0) [0|0.219] "Unit_rad/m" XXX + SG_ Curvature_VZ : 39|1@1+ (1,0) [0|1] "" XXX + SG_ Unknown_01 : 53|1@0+ (1,0) [0|1] "" XXX + SG_ Vibration : 56|1@0+ (1,0) [0|1] "" XXX + SG_ HighSendRate : 66|1@1+ (1,0) [0|1] "" XXX + +BO_ 792 MEB_Camera_03: 8 XXX + +BO_ 795 ESP_24: 8 Gateway + SG_ ESP_Lampe : 12|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ABS_Lampe : 13|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ BK_Lampe_02 : 14|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ TC_Lampe : 16|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_m_Raddrehz : 17|15@1+ (0.002,0) [0|65.278] "Unit_Hertz" Sub_Gateway + SG_ ESP_Textanzeigen_03 : 32|5@1+ (1,0) [0|31] "" Sub_Gateway + SG_ ESP_Meldungen : 37|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ ESP_Wegimp_VA : 40|11@1+ (1,0) [0|2047] "" Sub_Gateway + SG_ ESP_Fehlerstatus_Wegimp : 51|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_Wegimp_Ueberlauf : 52|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_QBit_Wegimp_VA : 53|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_HDC_Geschw_Farbe : 54|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_Off_Lampe : 55|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_HDC_Regelgeschw : 56|7@1+ (0.32,0) [0.32|39.68] "Unit_KiloMeterPerHour" Sub_Gateway + SG_ ESP_BKV_Warnung : 63|1@1+ (1,0) [0|1] "" Sub_Gateway + +BO_ 817 MFL_01: 8 Gateway + SG_ MFL_Zaehler : 0|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Toggle : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MFL_Lokalaktiv : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MFL_M_Taste : 6|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Paddle_Verbau : 7|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Tastencode_1 : 8|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ MFL_Tastencode_2 : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ MFL_Eventcode_1 : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Eventcode_2 : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Marke : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Variante : 36|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Dummy_0_Signal_1 : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ MFL_Tip_Down : 48|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Tip_Up : 49|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_SatModul_links_Err : 50|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_SatModul_rechts_Err : 51|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Dummy_0_Signal_2 : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MFL_Dummy_0_Signal_3 : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MFL_LR_HZG_Status : 54|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_LR_HZG_Err : 55|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Signalhorn : 56|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ MFL_Signalhorn_Err : 57|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Tip_links_Err : 58|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Tip_rechts_Err : 59|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Taste_links_Err : 60|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Taste_rechts_Err : 61|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_ECU_Err : 62|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Response_Err : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 850 Parken_SM_03: 8 Gateway + SG_ Parken_SM_03_MUX M : 0|3@1+ (1,0) [0|7] "" DDA + SG_ Parken_SM_03_Traj_Trans_ID_00 m0 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P1_Pos_X m0 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P1_Pos_Y m0 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P1_Tangent m0 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P2_Pos_X m0 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_SM_03_Traj_Trans_ID_01 m1 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P2_Pos_Y m1 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P2_Tangent m1 : 20|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P3_Pos_X m1 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P3_Pos_Y m1 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_SM_03_Traj_Trans_ID_02 m2 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P3_Tangent m2 : 7|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P4_Pos_X m2 : 17|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P4_Pos_Y m2 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P4_Tangent m2 : 43|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_SM_03_Traj_Trans_ID_03 m3 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P5_Pos_X m3 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P5_Pos_Y m3 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P5_Tangent m3 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P6_Pos_X m3 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_SM_03_Traj_Trans_ID_04 m4 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P6_Pos_Y m4 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P6_Tangent m4 : 20|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P7_Pos_X m4 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P7_Pos_Y m4 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_SM_03_Traj_Trans_ID_05 m5 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P7_Tangent m5 : 7|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P8_Pos_X m5 : 17|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P8_Pos_Y m5 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P8_Tangent m5 : 43|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_SM_03_Traj_Trans_ID_06 m6 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P9_Pos_X m6 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P9_Pos_Y m6 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P9_Tangent m6 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + +BO_ 869 NVEM_05: 8 Gateway + SG_ NVEM_05_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NVEM_05_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ NVEM_Pilot_Info : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ NVEM_P_Generator_Status : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Vector__XXX + SG_ BEM_n_LLA : 24|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BEM_Anf_KL : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BEM_StartStopp_Info : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BEM_DFM : 32|5@1+ (3.225,0.025) [0.025|100] "" Vector__XXX + SG_ BEM_Batt_Ab : 38|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_IHEV + SG_ BEM_Hybrid_Info : 44|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ NVEM_Red_KL : 46|2@1+ (1,0) [0|3] "" TME + SG_ NVEM_Freilauf_Info : 48|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BEM_HYB_DC_uSollLV : 50|6@1+ (0.1,10.6) [10.6|16] "Unit_Volt" DCDC_800V_PAG,DCDC_HV,LE_MLBevo + SG_ BEM_HYB_DC_uMinLV : 56|8@1+ (0.1,0) [0|25.3] "Unit_Volt" Vector__XXX + +BO_ 870 Blinkmodi_02: 8 Gateway + SG_ BM_ZV_auf : 12|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_ZV_zu : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_DWA_ein : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_DWA_Alarm : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Crash : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Panik : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Not_Bremsung : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_GDO : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BM_Warnblinken : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Taxi_Notalarm : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Telematik : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_links : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_rechts : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ Blinken_li_Fzg_Takt : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ Blinken_re_Fzg_Takt : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ Blinken_li_Kombi_Takt : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ Blinken_re_Kombi_Takt : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BM_NBA_n_codiert_n_aktiv : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BM_NBA_Status : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BM_WBT_Beleuchtung : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_HD_Oeffnung_angelernt : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BM_Autobahn : 34|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ BM_Rollenmodus_Blinken : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BM_Recas : 36|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Wischblinken : 37|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Telematik_Abbruchgrund : 38|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ BM_PiloPa : 44|1@1+ (1,0) [0|1] "" ZR_High + SG_ Unknown_01 : 45|2@1+ (1,0) [0|3] "" XXX + SG_ DWA_Alarmquelle : 59|5@1+ (1,0) [0|31] "" ZR_High + +BO_ 888 GNSS_04: 8 Gateway + SG_ GNSS_Nachrichtenpaket_ID4 : 0|2@1+ (1,0) [0|3] "Unit_Bit" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Ortung_Zeit_in_GPSWoche : 2|30@1+ (1,0) [0|604800001] "Unit_MilliSecon" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Ortung_Hoehe : 32|12@1+ (2,-500) [-500|7686] "Unit_Meter" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + +BO_ 891 GNSS_05: 8 Gateway + SG_ GNSS_UTC_Zeit : 0|32@1+ (1,0) [1|4294967295] "Unit_Secon" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Empfaenger_Status : 32|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_GPS_in_Nutzung : 33|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_GLONASS_in_Nutzung : 34|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Empfangbare_Satelliten : 35|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Sichtbare_Satelliten : 40|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Genutzte_Satelliten : 45|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Nachrichtenpaket_ID5 : 50|2@1+ (1,0) [0|3] "Unit_Bit" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + +BO_ 896 APS_Master: 8 XXX + SG_ Active : 54|1@0+ (1,0) [0|1] "" XXX + SG_ Distance : 55|9@1+ (1,0) [0|255] "" XXX + +BO_ 916 WBA_03: 8 Gateway + SG_ WBA_03_CRC : 0|8@1+ (1,0) [0|255] "" Sub_Gateway + SG_ WBA_03_BZ : 8|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_Fahrstufe_02 : 12|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_ZielFahrstufe : 16|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_GE_Warnung_02 : 20|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_eing_Gang_02 : 24|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_GE_Texte : 28|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ WBA_Segeln_aktiv : 31|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ WBA_Schaltschema : 32|5@1+ (1,0) [0|31] "" Sub_Gateway + SG_ WBA_GE_Zusatzwarnungen : 37|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ GE_Sollgang : 40|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ GE_Tipschaltempf_verfuegbar : 44|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ WBA_GE_Texte_02 : 45|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ WBA_GE_Texte_03 : 48|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_Blinken : 54|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Wiederstart_Anz_Std : 55|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_01 : 56|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_02 : 57|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_03 : 58|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_04 : 59|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_05 : 60|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_06 : 61|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_07 : 62|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_Std : 63|1@1+ (1,0) [0|1] "" Sub_Gateway + +BO_ 919 LDW_02: 8 XXX + SG_ LDW_Gong : 12|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_SW_Warnung_links : 14|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_SW_Warnung_rechts : 15|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Texte : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Seite_DLCTLC : 20|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Lernmodus : 21|3@1+ (1,0) [0|7] "" XXX + SG_ LDW_Anlaufsp_VLR : 24|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Vib_Amp_VLR : 28|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Anlaufzeit_VLR : 32|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Lernmodus_rechts : 36|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Lernmodus_links : 38|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_DLC : 40|8@1+ (0.01,-1.25) [-1.25|1.25] "Unit_Meter" XXX + SG_ LDW_TLC : 48|5@1+ (0.1,0) [0|3] "Unit_Secon" XXX + SG_ LDW_Warnung_links : 56|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Warnung_rechts : 57|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Codierinfo_fuer_VLR : 58|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Frontscheibenheizung_aktiv : 60|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Status_LED_gelb : 61|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Status_LED_gruen : 62|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_KD_Fehler : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 949 Klima_11: 8 Gateway + SG_ KL_Drehz_Anh : 0|1@1+ (1,0) [0|1] "" TME + SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1,0) [0|1] "" TME + SG_ KL_AC_Schalter : 2|1@1+ (1,0) [0|1] "" TME + SG_ KL_Komp_Moment_alt : 3|1@1+ (1,0) [0|1] "" TME + SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Zustand : 7|1@1+ (1,0) [0|1] "" TME + SG_ KL_Kompressorkupplung_linear : 8|8@1+ (20,0) [0|4000] "Unit_MilliAmper" Vector__XXX + SG_ KL_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" TME + SG_ KL_Charisma_Status : 20|2@1+ (1,0) [0|3] "" TME + SG_ KL_nachtr_Stopp_Anf : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_T_Charge : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0|63.5] "Unit_NewtoMeter" TME + SG_ KL_Spannungs_Anf : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Thermomanagement : 34|2@1+ (1,0) [0|3] "" TME + SG_ KL_StartStopp_Info : 36|2@1+ (1,0) [0|3] "" TME + SG_ KL_Freilauf_Info : 38|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" TME + SG_ KL_el_Zuheizer_Stufe : 48|3@1+ (1,0) [0|7] "" TME + SG_ KL_Ausstattung_Klima : 51|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ KL_Variante_Standheizung : 54|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 958 Motor_14: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ MO_StartStopp_Status : 12|2@1+ (1,0) [0|3] "" Sub_Gateway,TME + SG_ MO_StartStopp_Wiederstart : 14|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway,TME + SG_ MO_StartStopp_Motorstopp : 15|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway,TME + SG_ MO_Freig_Reku : 16|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Kl_75 : 18|1@1+ (1,0) [0|1] "" Sub_Gateway,TME + SG_ MO_Kl_50 : 19|1@1+ (1,0) [0|1] "" DCDC_IHEV,Ladegeraet_Konzern,Sub_Gateway + SG_ MO_Gangposition : 20|4@1+ (1,0) [0|15] "" AWC,Sub_Gateway,TME + SG_ MO_StartStopp_Fahrerwunsch : 24|2@1+ (1,0) [0|3] "" Sub_Gateway,TME + SG_ MO_HYB_Fahrbereitschaft : 26|1@1+ (1,0) [0|1] "" AWC,BMS_NV,Ladegeraet_Konzern,Sub_Gateway,TME + SG_ MO_Ext_E_Fahrt_aktiv : 27|1@1+ (1,0) [0|1] "" Sub_Gateway,TME + SG_ MO_Fahrer_bremst : 28|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_QBit_Fahrer_bremst : 29|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_BLS : 30|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Konsistenz_Bremsped : 31|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_KomFehler_ESP : 32|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Klima_Eingr : 33|2@1+ (1,0) [0|3] "" Sub_Gateway,TME + SG_ MO_Aussp_Anlass : 35|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Freig_Anlass : 36|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Kuppl_schalter : 37|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Interlock : 38|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Motor_laeuft : 39|1@1+ (1,0) [0|1] "" Sub_Gateway,TME + SG_ MO_Kickdown : 40|1@1+ (1,0) [0|1] "" Sub_Gateway,TME + SG_ MO_QBit_KL_75 : 41|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_EKlKomLeiRed : 42|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Handshake_STH : 44|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_BKV_Unterdruckwarnung : 45|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Freigabe_Segeln : 46|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_PTC_Status : 47|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ MO_QBit_Gangposition : 50|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Signalquelle_Gangposition : 51|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Remotestart_Betrieb : 52|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Remotestart_moeglich : 53|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_FMAus_aktiv : 55|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway + SG_ MO_FMAus_Startvariante : 56|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_BMS_NV_Anf_stuetzen : 58|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Zylinderabschaltung : 59|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_HYB_VM_aktiv : 61|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_StartVorauss_erfuellt : 62|2@1+ (1,0) [0|3] "" AWC,Ladegeraet_Konzern,Sub_Gateway + +BO_ 960 Klemmen_Status_01: 4 Gateway + SG_ Klemmen_Status_01_CRC : 0|8@1+ (1,0) [0|255] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ Klemmen_Status_01_BZ : 8|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ RSt_Fahrerhinweise : 12|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_S : 16|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,GurtMikrofon,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_15 : 17|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,GurtMikrofon,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_X : 18|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_50_Startanforderung : 19|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM_Remotestart_Betrieb : 20|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_Infotainment : 21|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM_Remotestart_KL15_Anf : 22|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM_Remotestart_MO_Start : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Warn_P1_ZST_def : 24|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Warn_P2_ZST_def : 25|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_1 : 26|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_2 : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM_Ausparken_Betrieb : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_4 : 29|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_5 : 30|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_6 : 31|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + +BO_ 967 Motor_26: 8 Gateway + SG_ MO_Kuehlerluefter_MUX M : 0|1@1+ (1,0) [0|1] "" TME + SG_ MO_Kuehlerluefter_1 m0 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" TME + SG_ MO_Kuehlerluefter_2 m1 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" TME + SG_ MO_EFLEX_Lampe : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_KJS_nicht_bereit : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_ITM_Warnung_Pumpe : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Anzeige_aktiv : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelmin_Warn : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Sensorfehler : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Schieflage : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ MO_Zustand_HWP : 20|2@1+ (1,0) [0|3] "" TME + SG_ OLEV_Systemstoerung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Oelwarnung_max : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_nicht_betriebswarm : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_laufender_Motor : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_E_Warnungen : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MO_Text_Motorstart : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MO_E_Texte : 36|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ WIV_Oeldyn_avl : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ OLEV_Oelstand_nicht_vorhanden : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Vector__XXX + SG_ MO_Systemlampe : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_OBD2_Lampe : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Heissleuchte : 50|1@1+ (1,0) [0|1] "" TME + SG_ MO_Partikel_Lampe : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_RedFahrleistung_Lampe : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Unterfuell_Warn : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Vorglueh_Lampe : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_E_Mode : 61|3@1+ (1,0) [0|7] "" Vector__XXX + +BO_ 974 TSG_HFS_01: 8 Gateway + SG_ HFS_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Heckrollotaster_betaetigt : 3|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Tuerschloss_defekt : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_HBFS_AutoHoch : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_HBFS_AutoTief : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_HBFS_ManHoch : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_HBFS_ManTief : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Tuer_Status : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HFS_SAD_Schalter : 16|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HFS_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ HFS_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Tueroeffnen_Warnung : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_Warnung_aktiv_HFS : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Seitenrollo_hoch : 42|1@1+ (1,0) [0|1] "" TME + SG_ HFS_Seitenrollo_tief : 43|1@1+ (1,0) [0|1] "" TME + SG_ HFS_Status_KiSi : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SSR_HFS_Pos_Unten : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHFS_M_Taste : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHFS_Pos1 : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHFS_Pos2 : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHFS_Pos3 : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_MRollo_Schalter : 52|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HFS_Lock_Taster_inv : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Status_eTAG : 56|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HFS_Tuer_Status_QBit : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_TCR_Mode_aktiv : 59|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 975 TSG_HBFS_01: 8 Gateway + SG_ HBFS_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Heckrollotaster_betaetigt : 3|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Tuerschloss_defekt : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_HFS_AutoHoch : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_HFS_AutoTief : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_HFS_ManHoch : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_HFS_ManTief : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Tuer_Status : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HBFS_SAD_Schalter : 16|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HBFS_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ HBFS_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Tueroeffnen_Warnung : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_Warnung_aktiv_HBFS : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Seitenrollo_hoch : 42|1@1+ (1,0) [0|1] "" TME + SG_ HBFS_Seitenrollo_tief : 43|1@1+ (1,0) [0|1] "" TME + SG_ HBFS_Status_KiSi : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SSR_HBFS_Pos_Unten : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHBFS_M_Taste : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHBFS_Pos1 : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHBFS_Pos2 : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHBFS_Pos3 : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_MRollo_Schalter : 52|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HBFS_Lock_Taster_inv : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Status_KiSi_inv : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Status_eTAG : 57|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HBFS_Tuer_Status_QBit : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_TIG_betaetigt_schliessen : 60|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 976 TSG_FT_01: 8 Gateway + SG_ FT_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern,TME + SG_ FT_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Schluesselschalter_auf : 3|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV + SG_ FT_Schluesselschalter_zu : 4|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV + SG_ FT_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_IRUE_Taste : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_HD_Taste : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_TD_Taste_Fehler : 12|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern + SG_ FT_TD_Taste : 13|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Ladegeraet_Konzern + SG_ SSR_Temp_Freigabe : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Sp_Heizung_Anf : 15|1@1+ (100,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ FT_HD_Taste_2 : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_TSG_hinten_verbaut : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Sp_Blk_def : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" TME + SG_ FT_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_HMI_defekt : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Schliesstaster : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_ausgerastet : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_lr_aktiv : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_ht_aktiv : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_wakeup : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_li_aktiv : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_re_aktiv : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_Taster_li : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_Taster_re : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_BFS_Fond_Freigabe : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_Fehler : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Daemmglas : 54|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_Heizung_Status : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_Warnung_aktiv_FS : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Pos_oben : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Tuerschloss_defekt : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SWA_Taster : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_HMI_Diagnose : 60|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ FS_Status_eTAG : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 980 SMLS_01: 8 Gateway + SG_ SMLS_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ SMLS_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BH_Blinker_li : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ BH_Blinker_re : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ BH_Lichthupe : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ BH_Fernlicht : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Tipwischen : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Intervall : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_WischerStufe1 : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_WischerStufe2 : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Frontwaschen : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Heckintervall : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Heckwaschen : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Intervallstufen : 23|4@1+ (1,0) [0|15] "" ZR_High + SG_ FAS_Taster : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ FAS_Taster_Fehler : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_Hupe : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LRH_On_Off : 30|2@1+ (1,0) [0|3] "" ZR_High + SG_ LRH_aktiv : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_P_verriegelt_plausibel : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WH_SRA : 44|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ WH_Wischer_Fehler : 45|1@1+ (1,0) [0|1] "" ZR_High + SG_ BH_Blinker_Fehler : 46|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_PTT : 47|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WH_Tipwischen_lang : 48|1@1+ (1,0) [0|1] "" ZR_High + +BO_ 981 Licht_Anf_01: 8 Gateway + SG_ Licht_Anf_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Licht_Anf_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BCM1_Kurvenlicht_links_Anf : 12|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Kurvenlicht_rechts_Anf : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Standlicht_Anf : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Abblendlicht_Anf : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ BCM1_Fernlicht_Anf : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Nebellicht_Anf : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Parklicht_li_Anf : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Parklicht_re_Anf : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Nebelschluss_Ahg_Anf : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Nebelschluss_Fzg_Anf : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Schlusslicht_Anf : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM_Rueckfahrlicht_Anf : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM1_Signaturlicht_Anf : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Umfeldleuchten_Anf : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Tagfahrlicht_Anf : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Regenlicht_Anf : 27|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Autobahnlicht_Anf : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Touristen_Licht_Anf : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_CH_aktiv : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_LH_aktiv : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Gleitende_Leuchtw_Anf : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_GLW_Fernlicht_Anf : 33|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Adaptive_Lichtvert_Anf : 34|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_FoD_Sperrung_WiBli : 35|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM1_FOD_Sperrung_Animationen_HL : 37|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM1_Animationssperrung : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_CH_LH_aktiv : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Allwetterlicht_Anf : 41|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Schlusslicht_Signatur : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 982 Licht_hinten_01: 8 Gateway + SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Aussenlicht_def : 7|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Blinker_HL_akt : 14|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Blinker_HR_akt : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Blinker_li_def : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Bremsl_li_def : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schlusslicht_li_def : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Rueckf_li_def : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Nebel_li_def : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Zusatzschlussl_def : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Brems_Blk_li_def : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Diag_Status_re_def : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Diag_Status_li_def : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Diag_LED_li_def : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Diag_LED_re_def : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Blinker_re_def : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Bremsl_re_def : 33|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schlusslicht_re_def : 34|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Rueckf_re_def : 35|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Nebel_re_def : 36|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Brems_mi_def : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Brems_Blk_re_def : 43|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Kennzl_def : 48|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_3_Bremsl_def : 49|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Nebel_mi_def : 50|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Rueckf_mi_def : 51|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schlusslicht_mi_def : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_mi_def : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1,0) [0|1] "" ZR_High + +BO_ 987 Gateway_72: 8 Gateway_MQB + SG_ BCM_01_alt : 0|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ SMLS_01_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ZV_02_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Wischer_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Anhaenger_01_alt : 4|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ Klima_Sensor_02_alt : 5|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ VSG_01_alt : 6|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ Klima_01_alt : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_01_alt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Licht_Anf_01_alt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HFS_offen : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HBFS_offen : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VS_VD_offen_ver : 22|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ VS_VD_zu_ver : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_BT_offen : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Rueckfahrlicht_Schalter : 25|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ZV_FT_offen : 26|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Wischer_vorne_aktiv : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Anhaenger_erkannt : 28|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ BCM1_MH_Schalter : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HD_offen : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Waschen_vorne_aktiv : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Thermomanagement : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WFS_Schluessel_Fahrberecht : 34|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BCM1_RFahrlicht_Fzg_Anf : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_RFahrlicht_Ahg_Anf : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Fernlicht : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Blinker_li : 50|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BH_Blinker_re : 51|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_OBD_FStatus_ATemp : 52|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_Aussen_Temp_ungef : 56|8@1+ (0.5,-50) [-50|76] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 988 Gateway_73: 8 XXX + SG_ UNKNOWN_1 : 15|2@0+ (1,0) [0|3] "" XXX + SG_ GE_Fahrstufe : 40|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_Status : 53|3@1+ (1,0) [0|7] "" XXX + SG_ UNKNOWN_2 : 58|3@0+ (1,0) [0|7] "" XXX + +BO_ 997 TSG_FT_02: 8 Gateway + SG_ TSG_FT_02_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ TSG_FT_02_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ FT_Tuer_Status : 12|2@1+ (1,0) [0|3] "" OTA_FC,ZR_High + SG_ FT_Tuer_Status_QBit : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_Lock_Taster_02 : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_Schluesselschalter_zu_02 : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_BFS_Tuer_Status : 17|2@1+ (1,0) [0|3] "" ZR_High + SG_ FT_HBFS_Tuer_Status : 19|2@1+ (1,0) [0|3] "" ZR_High + SG_ FT_HFS_Tuer_Status : 21|2@1+ (1,0) [0|3] "" ZR_High + SG_ FT_Tueroeffnen_Warnung : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_Heizung_ein : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_Taster_li_02 : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_Kisi_Taster_re_02 : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_TD_Taste_Status : 27|2@1+ (1,0) [0|3] "" ZR_High + SG_ FT_TCR_Mode_aktiv : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FS_Push_Tuergriff : 36|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1004 MEB_TSK_01: 8 XXX + SG_ TSK_State : 53|3@1+ (1,0) [0|7] "" XXX + +BO_ 1031 PLA_04: 8 XXX + +BO_ 1122 PSD_04: 8 ZR_High + SG_ PSD_Segment_ID : 0|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Vorgaenger_Segment_ID : 6|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Segmentlaenge : 12|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Strassenkategorie : 19|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Endkruemmung : 22|8@1+ (1,0) [0|254] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Endkruemmung_Vorz : 30|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Idenditaets_ID : 31|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_ADAS_Qualitaet : 37|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_wahrscheinlichster_Pfad : 38|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Geradester_Pfad : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Fahrspuren_Anzahl : 40|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Bebauung : 43|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Segment_Komplett : 44|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Rampe : 45|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Anfangskruemmung : 47|8@1+ (1,0) [0|254] "" Gateway,Gateway_PAG + SG_ PSD_Anfangskruemmung_Vorz : 55|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Abzweigerichtung : 56|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Abzweigewinkel : 57|7@1+ (1.417323,0) [0|180.000021] "" Gateway,Gateway_PAG + +BO_ 1123 PSD_05: 8 ZR_High + SG_ PSD_Pos_Segment_ID : 0|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Segmentlaenge : 6|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Pos_Inhibitzeit : 13|5@1+ (10,0) [0|310] "Unit_MilliSecon" Gateway,Gateway_PAG + SG_ PSD_Pos_Standort_Eindeutig : 18|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Fehler_Laengsrichtung : 19|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Fahrspur : 22|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Attribut_Segment_ID_05 : 25|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_ID : 31|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_Wert : 36|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_Offset : 40|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_ID : 47|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_Wert : 52|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_Offset : 56|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribute_Komplett_05 : 63|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + +BO_ 1124 PSD_06: 8 ZR_High + SG_ PSD_06_Mux M : 0|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Segment_ID m0 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Laendercode m0 : 9|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geschwindigkeit_Einheit m0 : 17|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Verkehrsrichtung m0 : 18|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geometrieguete m0 : 19|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Mapmatchingguete m0 : 21|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Alter_Karte m0 : 23|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Zielfuehrung m0 : 26|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Sys_US_State m0 : 27|6@1+ (1,0) [0|63] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Geometrien m0 : 33|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Ortsinfo m0 : 36|2@1+ (1,0) [0|3] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_verfuegbar m0 : 38|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Zielfuehrung_geaendert m0 : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geometrieguete_erweitert m0 : 40|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_sonstige_Attribute m0 : 48|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Steigungen m0 : 51|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Strassenkennz m0 : 54|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Tempolimits m0 : 57|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Vorfahrtsregelung m0 : 60|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Attribut_Segment_ID m1 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_ID m1 : 9|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_Offset m1 : 14|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_Wert m1 : 21|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_ID m1 : 25|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_Wert m1 : 30|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_Offset m1 : 34|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_ID m1 : 41|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_Offset m1 : 46|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_Wert m1 : 53|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribute_Komplett_06 m1 : 57|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Segment_ID m2 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Offset m2 : 9|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit m2 : 16|5@1+ (1,0) [0|31] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Ges_Typ m2 : 21|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Spur_Geschw_Begrenzung m2 : 23|6@1+ (1,0) [0|63] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Gespann m2 : 29|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Witter m2 : 31|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Tag_Anf m2 : 33|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Tag_Ende m2 : 36|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Std_Anf m2 : 39|5@1+ (1,0) [0|24] "Unit_Hours" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Std_Ende m2 : 44|5@1+ (1,0) [0|24] "Unit_Hours" Gateway,Gateway_PAG + SG_ PSD_Ges_Ueberholverbot m2 : 49|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Wechselverkehrszeichen m2 : 51|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Wechselverkehrszeichen_Typ m2 : 54|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Gesetzlich_Kategorie m2 : 56|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Gesetzlich_Zusatz m2 : 59|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Verkehrszeichen_Quelle m2 : 61|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Attribute_Komplett m2 : 63|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Laenge_VZ m3 : 3|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Laenge m3 : 4|25@1+ (1e-05,0) [0|180] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Baum_Breite_VZ m3 : 29|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Breite m3 : 30|24@1+ (1e-05,0) [0|90] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Baum_Ausrichtung m3 : 54|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_Segment_ID m4 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Steigung m4 : 9|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Vorz m4 : 16|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Offset m4 : 17|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Steigung m4 : 24|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Vorz m4 : 31|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Offset m4 : 32|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_Attribute_kompl m4 : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Segment_ID m4 : 40|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Steigung m4 : 46|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Vorz m4 : 53|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Offset m4 : 54|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Attribute_kompl m4 : 61|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + +BO_ 1153 MainUnit_01: 8 ZR_High + SG_ ZR_LoGeWa_Event_Kombiwarnung : 0|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ Nav_FoD_Status : 4|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ MIB_Tongenerator_PH_verfuegbar : 9|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ MMI_Counter_Bedienevent : 12|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ DSSS_Warning : 16|5@1+ (1,0) [0|31] "" Gateway,Gateway_PAG + SG_ ZR_Kindersicherung_RSE : 21|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ ZR_RSE_aktivieren : 22|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ MMI_SDS_aktiv : 23|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ MU_SecondDisplay : 24|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ MMI_Telefon_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ MMI_Gurt_Mic_ref : 28|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,GurtMikrofon + SG_ ZR_Sta_Inszenierung : 29|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ MMI_Gauges_active : 31|1@1+ (1,0) [0|1] "" BedienDisp_vo,Gateway,Gateway_PAG + SG_ MU_Update_Time : 32|8@1+ (0.1,0) [0|25.5] "Unit_Hours" Gateway,Gateway_PAG + SG_ ZR_MXB_Manoever_Ansage : 42|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ ZR_LAPP_Sondermodus_Status : 44|2@1+ (1,0) [0|3] "" DDA,Gateway,Gateway_PAG + SG_ MMI_StartStopp_Info : 46|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ ZR_Parken_Sondermodus : 48|4@1+ (1,0) [0|15] "" DDA,Gateway,Gateway_PAG + SG_ ZR_Rundenbewertung : 52|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ ZR_Rundenfortschritt : 56|8@1+ (0.5,0) [0|100] "Unit_PerCent" Gateway,Gateway_PAG + +BO_ 1155 Motor_Hybrid_06: 8 Gateway + SG_ Mo_Powermeter_Grenze : 0|12@1+ (1,0) [0|4092] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ MO_Text_Aktivierung_Antrieb : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MO_Powermeter_Inszenierung_aktiv : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Powermeter_Charge_Grenze : 18|10@1+ (1,0) [0|1021] "Unit_None" Vector__XXX + SG_ MO_Powermeter_Grenze_strategisch : 28|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX + SG_ MO_Powermeter_untere_E_Grenze : 40|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX + SG_ MO_Powermeter_obere_E_Grenze : 52|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX + +BO_ 1163 BEM_06: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 1175 Parkhilfe_01: 8 Gateway + SG_ PH_Visualisierung : 0|3@1+ (1,0) [0|7] "" AWC + SG_ PDC_Tonausgabe_Front : 4|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PDC_Tonausgabe_Heck : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_nachtr_Stopp_Anf : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Abschaltursache : 13|3@1+ (1,0) [0|7] "" AWC + SG_ PH_Opt_Anzeige_V_ein : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Opt_Anzeige_H_ein : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Opt_Anz_V_Hindernis : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Opt_Anz_H_Hindernis : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Tongeber_V_aktiv : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Tongeber_H_aktiv : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Tongeber_mute : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Anf_Audioabsenkung : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Tongeber_H_verfuegbar : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PLA_Anf_Aufschaltung_RVC : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Taster : 28|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PH_Anf_Verdeck : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PH_Frequenz_hinten : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_Lautstaerke_hinten : 36|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_Frequenz_vorn : 40|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_Lautstaerke_vorn : 44|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_StartStopp_Info : 49|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PH_Stoermeldung : 52|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_defekt : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_gestoert : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Systemzustand : 58|3@1+ (1,0) [0|7] "" AWC + SG_ PH_Display_Kundenwunsch : 61|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1283 HVK_01: 8 Gateway + SG_ HVK_01_CRC : 0|8@1+ (1,0) [0|255] "" BMC_MLBevo,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo,TME + SG_ HVK_01_BZ : 8|4@1+ (1,0) [0|15] "" BMC_MLBevo,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo,TME + SG_ HVK_Istmodus_Anf : 12|1@1+ (1,0) [0|1] "" BMC_MLBevo,DCDC_HV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo + SG_ HVK_TN1_Sollmodus : 13|2@1+ (1,0) [0|3] "" DCDC_HV_02,FCU_MLBevo_FCEV + SG_ HVK_MO_EmSollzustand : 16|8@1+ (1,0) [0|255] "" FCU_MLBevo_FCEV + SG_ HVK_BMS_Sollmodus : 24|3@1+ (1,0) [0|7] "" BMC_MLBevo,FCU_MLBevo_FCEV + SG_ HVK_DCDC_Sollmodus : 27|3@1+ (1,0) [0|7] "" DCDC_800V_PAG,DCDC_HV,FCU_MLBevo_FCEV,LE_MLBevo + SG_ HVK_EKK_Sollmodus : 30|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,TME + SG_ HVK_HVPTC_Sollmodus : 33|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,TME + SG_ HVK_HVLM_Sollmodus : 36|3@1+ (1,0) [0|7] "" DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_Konzern + SG_ HVK_HV_Netz_Warnungen : 39|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV + SG_ HV_Bordnetz_aktiv : 41|1@1+ (1,0) [0|1] "" DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo + SG_ HV_Bordnetz_Fehler : 42|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Ladegeraet_Konzern,TME + SG_ HVK_Gesamtst_Spgfreiheit : 43|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV + SG_ HVK_AktiveEntladung_Anf : 45|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,LE1,LE2,LE_MLBevo + SG_ HVK_Iso_Messung_Start : 50|3@1+ (1,0) [0|7] "" BMC_MLBevo,FCU_MLBevo_FCEV + SG_ HVK_DCDC_EKK_Sollmodus : 62|2@1+ (1,0) [0|3] "" DCDC_800V_PAG,FCU_MLBevo_FCEV + +BO_ 1312 Airbag_02: 8 Gateway + SG_ LoGeWa_Event_Kombiwarnung : 12|4@1+ (1,0) [0|15] "" ZR_High + SG_ AB_Anforderung_eCall : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ AB_Anprall_Seite_Beifahrer : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Rollover : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_FGS : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Front_Beifahrer : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Front_Fahrer : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Heck_Beifahrer : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Heck_Fahrer : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Wickelklappung_Reihe2_MI : 24|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Belegung_VB : 26|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Abschaltanf_SIH_BF : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ AB_Anprall_Seite_Fahrer : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SC_PAO_Schriftzug_Anf : 30|2@1+ (1,0) [0|3] "" ZR_High + SG_ SC_PAO_ON_Anf : 32|2@1+ (1,0) [0|3] "" ZR_High + SG_ SC_PAO_OFF_Anf : 34|2@1+ (1,0) [0|3] "" ZR_High + SG_ AB_Crashschwere : 36|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ AB_Anforderung_USM : 39|1@1+ (1,0) [0|1] "" ZR_Standard + SG_ AB_Gurtschloss_FA : 40|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High + SG_ AB_Gurtschloss_BF : 42|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High + SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High + SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High + SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1,0) [0|3] "" ZR_High + SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1,0) [0|3] "" ZR_High + SG_ AB_Wickelklappung_Reihe2_BF : 60|2@1+ (1,0) [0|3] "" ZR_High + SG_ AB_Wickelklappung_Reihe2_FA : 62|2@1+ (1,0) [0|3] "" ZR_High + +BO_ 1349 Airbag_04: 8 Gateway + SG_ AB_Gurtwarn_Reihe2_FA : 20|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe2_BF : 22|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AbstWarn_MV_FAS_Fkt_Status : 24|2@1+ (1,0) [0|3] "" ZR_High + SG_ WarnBrems_Charisma_Status : 26|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WarnBrems_Charisma_FahrPr : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe2_MI : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe3_FA : 34|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe3_MI : 36|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe3_BF : 38|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ LGI_FAS_Fkt_Status : 40|2@1+ (1,0) [0|3] "" ZR_High + SG_ PreCrash_FAS_Fkt_Status : 42|3@1+ (1,0) [0|7] "" ZR_High + SG_ AB_SBR_hinten_verbau : 48|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AWV_Einstellung_System_ASG : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_Einstellung_Warnung_ASG : 52|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreSense_Modus_Warnung_NV : 55|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreSense_Modus_Warnung_MV : 58|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreSense_Modus_System_MV : 61|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SC_PreSense_Modus_System_NV : 62|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SC_PreSense_Modus_System_KAS : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1355 Parkhilfe_04: 8 Gateway + SG_ PH_Verschmutzungsmeldung : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_Aufschaltursache : 16|5@1+ (1,0) [0|31] "" AWC + SG_ PH_Ton_Ausgabe : 21|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PH_Ton_Pausenlaenge : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ PH_Ton_Richtung : 49|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PH_Ton_Lautstaerke : 52|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ BCM_WAH_Meldung : 55|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PDC_Charisma_Status : 58|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PDC_Charisma_FahrPr : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 1361 WFS_01: 8 Gateway + SG_ WFS_Schluessel_Fahrberecht : 0|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WFS_ID_Geb_autorisiert : 5|1@1+ (1,0) [0|1] "" ZR_High + SG_ WFS_ID_Geb_autorisiert_in_Kl15 : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_ID_Geb_steckt : 7|1@1+ (1,0) [0|1] "" ZR_High + SG_ WFS_Schluessel_Soll : 8|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WFS_Schluessel_Ist : 12|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WFS_Safe : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_LZ : 17|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WFS_ELV_authorisiert : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_LF_Aktiv : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_Betrieb_Lesespule : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_Klemmenfreigabe : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_Fahrerhinweise : 34|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WFS_Parken_Status : 36|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1385 MEB_HVEM_03: 8 XXX + SG_ NEW_SIGNAL_12 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 1|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_10 : 3|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 4|2@1+ (1,0) [0|3] "" XXX + SG_ PTC_ON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 25|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_13 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 33|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_11 : 35|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 36|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_6 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PTC_ein_02 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ PTC_ein_03 : 57|1@0+ (1,0) [0|1] "" XXX + SG_ PTC_ein_04 : 59|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_9 : 61|2@1+ (1,0) [0|3] "" XXX + +BO_ 1411 ZV_02: 8 Gateway + SG_ BCM_FH_Freigabe : 12|1@1+ (1,0) [0|1] "" BedienDisp_vo + SG_ BCM_Komfortfkt_Freigabe : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_HSK_Freigabe : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Verdeck_Freigabe : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_intern_ist : 16|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High + SG_ ZV_verriegelt_extern_ist : 17|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High + SG_ ZV_verriegelt_intern_soll : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_extern_soll : 19|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_gesafet_extern_ist : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_gesafet_extern_soll : 21|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ZV_Einzeltuerentriegelung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_Heckeinzelentriegelung : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_FT_offen : 24|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_BT_offen : 25|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HFS_offen : 26|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HBFS_offen : 27|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HD_offen : 28|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HS_offen : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ IRUE_aktiv : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ DWA_aktiv : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ HD_Hauptraste : 32|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ HD_Vorraste : 33|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ FFB_CarFinder : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FFB_Komfortoeffnen : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FFB_Komfortschliessen : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_Schluessel_Zugang : 42|4@1+ (1,0) [0|15] "" ZR_High + SG_ ZV_SafeFunktion_aktiv : 46|1@1+ (1,0) [0|1] "" ZR_High + SG_ FBS_Warn_Schluessel_Batt : 47|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Oeffnungsmodus : 48|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HFS_verriegelt : 50|1@1+ (1,0) [0|1] "" OTA_FC + SG_ HFS_gesafet : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_verriegelt : 52|1@1+ (1,0) [0|1] "" OTA_FC + SG_ HBFS_gesafet : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_ist_Zustand_verfuegbar : 54|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ IRUE_Taster_Fkts_LED : 55|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Tankklappe_offen : 56|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Rollo_auf : 57|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Rollo_zu : 58|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_SAD_auf : 59|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_SAD_zu : 60|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM_Tankklappensteller_Fehler : 61|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_soll : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1413 Systeminfo_01: 8 Gateway + SG_ SI_Sammel_SG_Fehler : 0|6@1+ (1,0) [0|60] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_Diagnose_Aktiv : 7|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_QRS_Mode : 8|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_T_Mode : 9|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_NWDF : 10|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_NWDF_gueltig : 11|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_Sammelfehler : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GW_KD_Fehler : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_T_Schutz : 14|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_01 : 16|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_02 : 17|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_03 : 18|1@1+ (1,0) [0|1] "" BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_04 : 19|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_05 : 20|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_06 : 21|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_07 : 22|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_08 : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_09 : 24|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_10 : 25|1@1+ (1,0) [0|1] "" BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_11 : 26|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_12 : 27|1@1+ (1,0) [0|1] "" DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_13 : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_14 : 29|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_15 : 30|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_Bus_Identifikation : 32|8@1+ (1,0) [0|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_CAB : 40|24@1+ (1,0) [0|16777215] "" BedienSG_hi,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + +BO_ 1420 Klemmen_Steuerung_01: 8 Gateway + SG_ Klemmen_Steuerung_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Klemmen_Steuerung_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KST_Txt_P_Gang : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_Txt_Panikabschaltung : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_Anf_Klemmenfreigabe_ELV : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_Txt_Komfortabschaltung : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_ZAT_betaetigt : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ KST_Unterdr_Zuendungsmeldung : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_aut_Abschaltung_Zuendung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_Anf_ZV_Verriegelung : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Relais_VoKo_angesteuert : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ RSt_Anforderung_HMS : 26|3@1+ (1,0) [0|7] "" Vector__XXX + +BO_ 1426 Kessy_04: 8 XXX + +BO_ 1440 RLS_01: 8 Gateway + SG_ LS_Helligkeit_IR : 0|8@1+ (400,0) [0|101200] "Unit_Lux" ZR_High + SG_ LS_Helligkeit_FW : 8|10@1+ (6,0) [0|6126] "Unit_Lux" ZR_High + SG_ LS_defekt : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ LS_Verbau : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Regenmenge : 24|4@1+ (10,0) [0|100] "Unit_PerCent" OTA_FC,ZR_High + SG_ RS_Verbau : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Verglasung_schliessen : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_defekt : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Wischergeschwindigkeit : 32|3@1+ (1,0) [0|7] "" OTA_FC,ZR_High + SG_ RLS_Vorfeldhelligkeit_Boost : 35|4@1+ (1,0) [0|15] "" ZR_High + +BO_ 1442 BMS_04: 8 BMC_MLBevo + SG_ BMS_04_CRC : 0|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_04_BZ : 8|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_Status_ServiceDisconnect : 13|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_HV,Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_Status_Spgfreiheit : 14|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_OBD_Lampe_Anf : 16|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_IstModus : 17|3@1+ (1,0) [0|7] "" AWC,Gateway,Gateway_PAG,Ladegeraet_Konzern,LE1,LE2,LE2_3_MLBevo_LB,Sub_Gateway,TME + SG_ BMS_Fehlerstatus : 20|3@1+ (1,0) [0|7] "" AWC,DCDC_800V_PAG,DCDC_HV,Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway + SG_ BMS_Kapazitaet_02 : 23|11@1+ (0.2,0) [0|409.2] "Unit_AmperHour" Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway + SG_ BMS_Soll_SOC_HiRes : 53|11@1+ (0.05,0) [0|100] "Unit_PerCent" Gateway,Gateway_PAG,Sub_Gateway + +BO_ 1447 TM_01: 8 Gateway + SG_ TM_Spiegel_Anklappen : 47|1@1+ (1,0) [0|1] "" ZR_High + SG_ TM_Nur_Hupen : 48|1@1+ (1,0) [0|1] "" ZR_High + SG_ TM_Door_Lock : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TM_Door_Unlock : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TM_Warnblinken : 51|1@1+ (1,0) [0|1] "" ZR_High + SG_ TM_Panik_Alarm : 52|1@1+ (1,0) [0|1] "" ZR_High + SG_ TM_ZV_Signatur : 53|11@1+ (1,0) [1|2047] "Unit_None" Vector__XXX + +BO_ 1452 HVEM_02: 8 Gateway + SG_ HVEM_IstStrom_HVVerbraucher : 0|12@1+ (0.1,-204.7) [-204.7|204.6] "Unit_Amper" Vector__XXX + SG_ HVEM_Energie_Klima_Vorgabe_HighR : 12|3@1+ (10,0) [0|50] "Unit_WattHour" TME + SG_ HVEM_IstLeistungNA : 15|9@1+ (50,0) [0|25450] "Unit_Watt" Vector__XXX + SG_ HVEM_Leistung_Klima_Vorgabe : 24|8@1+ (50,0) [0|12650] "Unit_Watt" TME + SG_ HVEM_Nutzbare_Energie : 32|11@1+ (50,0) [0|102200] "Unit_WattHour" Ladegeraet_Konzern + SG_ HVEM_Energie_Klima_Vorgabe : 43|8@1+ (50,0) [0|12650] "Unit_WattHour" TME + SG_ HVEM_MO_MaxLeistungIgnoriert : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1485 DCDC_03: 8 DCDC_800V_PAG + SG_ DCDC_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DCDC_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_Fehlerstatus : 16|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_Peakstrom_verfuegbar : 19|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_Abregelung_Temperatur : 20|1@1+ (1,0) [0|1] "" Gateway_PAG,Sub_Gateway,TME + SG_ DC_IstModus_02 : 21|3@1+ (1,0) [0|7] "" DCDC_HV_02,Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway,TME + SG_ DC_HV_EKK_IstModus : 28|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,Sub_Gateway,TME + SG_ DC_Status_Spgfreiheit_HV : 46|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_IstSpannung_EKK_HV : 48|8@1+ (2,0) [0|508] "Unit_Volt" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_Temperatur : 56|8@1+ (1,-40) [-40|213] "Unit_DegreCelsi" Gateway,Gateway_PAG,Sub_Gateway,TME + +BO_ 1505 Klima_Sensor_02: 8 Gateway + SG_ BCM1_Aussen_Temp_ungef : 0|8@1+ (0.5,-50) [-50|76] "Unit_DegreCelsi" BMC_MLBevo,BMS_NV,FCU_MLBevo_FCEV,Ladegeraet_Konzern,TME + SG_ BCM_Heizungsabsperrventil_Status : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM_Heizungspumpe_Status : 10|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM_Kompressorkupplung_Status : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM1_PTC_stufig_Status : 28|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ BCM1_FStatus_Aussentemp_ungef : 31|1@1+ (1,0) [0|1] "" TME + SG_ BCM1_Kompressorstrom_ist : 32|8@1+ (4,0) [0|1000] "Unit_MilliAmper" Vector__XXX + SG_ BCM1_OBD_FStatus_ATemp : 44|4@1+ (1,0) [0|15] "" BMC_MLBevo,Ladegeraet_Konzern,TME + +BO_ 1513 Klima_Sensor_04: 8 Gateway + SG_ DS_Kaeltemittel_P : 8|11@1+ (0.0161,0) [0|32.9245] "Unit_Bar" TME + SG_ DS_Status : 19|2@1+ (1,0) [0|3] "" TME + SG_ ION_Status : 21|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ION_Status_LED : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAU_Geblaese : 24|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ ION_Status_Taster : 31|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1520 Dimmung_01: 8 Gateway_MQB + SG_ DI_KL_58xd : 0|8@1+ (1,0) [0|253] "" Airbag_MQB + SG_ DI_KL_58xs : 8|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ DI_Display_Nachtdesign : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ DI_KL_58xt : 16|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ DI_Fotosensor : 24|16@1+ (1,0) [0|65535] "" Vector__XXX + +BO_ 1524 Innenlicht_11: 8 Gateway + SG_ IL_Dimmung_V_Tuerkontur : 0|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + SG_ IL_Dimmung_H_Tuerkontur : 8|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + SG_ IL_Dimmung_Tuerinnengriff : 16|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + SG_ IL_Dimmung_Umfeldbel : 24|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + SG_ IL_Bel_FS_Ausstieg : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Bel_BFS_Ausstieg : 33|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Bel_HFS_Ausstieg : 34|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Bel_HBFS_Ausstieg : 35|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Innenlicht_gedimmt_V : 36|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Innenlicht_gedimmt_H : 37|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Innenlicht_aktiv : 38|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Klemme_30G_aktiv : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_DI_Rampe_Innenlicht : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_DI_Rampe_Leselicht : 41|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Innenlicht_H : 42|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Innenlicht_V : 43|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leselicht_Anf_hl : 44|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leselicht_Anf_hr : 45|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leselicht_Anf_vl : 46|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leselicht_Anf_vr : 47|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leuchten_Aus : 48|1@1+ (1,0) [0|1] "" ZR_High + SG_ AMB_Charisma_FahrPr : 49|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ AMB_Charisma_Status : 53|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ IL_Dimmung_Lautspr : 56|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + +BO_ 1600 Motor_07: 8 Motor_Diesel_MQB + SG_ MO_QBit_Ansaugluft_Temp : 0|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_QBit_Oel_Temp : 1|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Kuehlmittel_Temp : 2|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Stellgliedtest_Soundaktuator : 3|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Fehler_HV_Netz : 4|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_aktives_Getriebeheizen : 5|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Absperrventil_oeffnen : 6|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Ansaugluft_Temp : 8|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB + SG_ MO_Oel_Temp : 16|8@1+ (1,-60) [-60|192] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kuehlmittel_Temp : 24|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Hoeheninfo : 32|8@1+ (0.00781,0) [0|1.98374] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kennfeldk : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Versionsinfo : 41|6@1+ (1,0) [0|63] "" Gateway_MQB + SG_ MO_Getriebe_kuehlen : 47|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Traegheit_02 : 48|5@1+ (0.01,0) [0|0.31] "Unit_KiloGramMeterSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Heizungspumpenansteuerung : 53|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ MO_SpannungsAnf : 57|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Nachlaufzeit_Heizungspumpe : 58|6@1+ (15,0) [0|945] "Unit_Secon" Gateway_MQB + +BO_ 1601 Motor_Code_01: 8 Motor_Diesel_MQB + SG_ Motor_Code_01_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ Motor_Code_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Faktor_Momente_02 : 12|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Hybridfahrzeug : 14|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Code : 16|8@1+ (1,0) [0|255] "" Gateway_MQB,SAK_MQB + SG_ MO_Getriebe_Code : 24|6@1+ (1,0) [0|63] "" Gateway_MQB + SG_ MO_StartStopp_Codiert : 30|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Anzahl_Zyl : 32|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Kraftstoffart : 36|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Hubraum : 40|7@1+ (0.1,0) [0|12.7] "Unit_Liter" Gateway_MQB + SG_ MO_Ansaugsystem : 47|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Leistung : 48|9@1+ (1,0) [0|511] "Unit_KiloWatt" Gateway_MQB + SG_ MO_Abgastyp_EOBD : 57|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ MO_Abgastyp_OBD : 58|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ MO_DPF_verbaut : 59|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_Codierung : 60|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Einspritzart : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 1603 Einheiten_01: 8 Gateway + SG_ KBI_Einheit_Datum : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Druck : 2|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Streckenanz : 4|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern + SG_ KBI_MFA_v_Einheit_02 : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Einheit_Temp : 6|1@1+ (1,0) [0|1] "" TME + SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern + SG_ KBI_Einheit_Verbrauch : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Volumen : 10|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Verbrauch_elektr : 12|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ KBI_Einheit_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KBI_Einheit_Verbrauch_Gas : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KBI_Einheit_Masse : 28|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1622 ELV_01: 8 Gateway + SG_ ELV_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ ELV_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ ELV_Anf_Klemme_S : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Anf_Klemme_15 : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Anf_Klemme_50 : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_01_Sendestatus : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Verriegelt : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_Entriegelt : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_ZAT_betaetigt : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Lebenszustand : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Anlernmodus : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Klemmenfreigabe : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Abbruch_Anf_Klemmenfreigabe : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_LED_Rot : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_LED_Gelb : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_Panikabschaltung : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_Lkg_Bewegen : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_Txt_Werkstatt : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_Txt_Defekt : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_Txt_P_Gang : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_PN_Gang : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_Kupplung : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_Bremse : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_P_verriegelt : 35|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1624 Licht_vorne_01: 8 Gateway + SG_ Licht_Vorne_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Licht_Vorne_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ LV_Standlicht_Anzeige : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Abblendlicht_Anzeige : 13|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Fernlicht_Anzeige : 14|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Nebellicht_Anzeige : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Nebelschlusslicht_Anzeige : 16|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Tagfahrlicht_Anzeige : 17|1@1+ (1,0) [0|1] "" BedienSG_hi,OTA_FC,ZR_High + SG_ LV_AFL_aktiv_Anzeige : 18|1@1+ (1,0) [0|1] "" BedienSG_hi,OTA_FC,ZR_High + SG_ LV_AFL_defekt : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Blinker_li_def : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Standlicht_li_def : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblendlicht_li_def : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Fernlicht_li_def : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Nebellicht_li_def : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Blk_li_Seite_def : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Tagfahrlicht_li_def : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_FLA_aktiv_Anzeige : 27|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_FLA_defekt : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_FLA_Sensor_blockiert : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Blinker_re_def : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Standlicht_re_def : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblendlicht_re_def : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Fernlicht_re_def : 33|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Nebellicht_re_def : 34|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Blk_re_Seite_def : 35|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Tagfahrlicht_re_def : 36|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Aussenlicht_def : 37|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblendlicht_TFL_li_def : 38|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Nebellicht_TFL_li_def : 39|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Standlicht_TFL_li_def : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblend_Fernlicht_li_def : 41|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblendlicht_TFL_re_def : 42|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Nebellicht_TFL_re_def : 43|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Standlicht_TFL_re_def : 44|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblend_Fernlicht_re_def : 45|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abbiegelicht_li_def : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LV_Abbiegelicht_re_def : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Linksverkehr : 48|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ BCM1_Licht_Dunkelheit_aktiv : 49|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_LED_Scheinwerfer_li_def : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LV_LED_Scheinwerfer_re_def : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LV_Blinker_VL_aktiv : 52|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Blinker_VR_aktiv : 53|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_MXB_Status_Anzeige : 54|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1629 ESP_20: 8 Gateway + SG_ ESP_20_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ ESP_20_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BR_Systemart : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_Zaehnezahl : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ ESP_Charisma_FahrPr : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ ESP_Charisma_Status : 28|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_Wiederstart_Anz_01 : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Wiederstart_Anz_02 : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Wiederstart_Anz_03 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Wiederstart_Anz_04 : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_01 : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_02 : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_03 : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_04 : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_05 : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_06 : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_07 : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_Std : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Dachrelingsensor : 42|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_08 : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HDC_Charisma_FahrPr : 45|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HDC_Charisma_Status : 49|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BR_QBit_Reifenumfang : 51|1@1+ (1,0) [0|1] "" AWC + SG_ BR_Reifenumfang : 52|12@1+ (1,0) [0|4095] "Unit_MilliMeter" AWC + +BO_ 1631 Motor_16: 8 Gateway + SG_ TSK_Grundmasse : 0|8@1+ (32,0) [0|8128] "Unit_KiloGram" ZR_High + SG_ TSK_QBit_Steigung : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_QBit_Fahrzeugmasse : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ MO_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_DPF_reg : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ MO_Heizstrom_EKAT : 17|7@1+ (1,0) [0|126] "Unit_Amper" Vector__XXX + SG_ MO_Heizstrom_SCR : 24|6@1+ (1,0) [0|62] "Unit_Amper" Vector__XXX + SG_ MO_Anzeige_Kaltleuchte : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_P_Generator_ungefiltert_Anf : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_Getriebeinfo : 34|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Energieinhalt_BMS : 36|12@1+ (25,0) [0|102325] "Unit_WattHour" Vector__XXX + SG_ TSK_Fahrzeugmasse_02 : 48|8@1+ (32,0) [0|8128] "Unit_KiloGram" OTA_FC,ZR_High + SG_ TSK_Steigung_02 : 56|8@1+ (0.8,-101.6) [-100.8|101.6] "Unit_PerCent" OTA_FC + +BO_ 1640 Klima_12: 8 Gateway + SG_ KL_LRH_Taster : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_LRH_Stufe : 1|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HSH_Taster : 3|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ FSH_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Zuheizer_Freigabe : 6|1@1+ (1,0) [0|1] "" TME + SG_ KL_Beschlagsgefahr : 7|1@1+ (1,0) [0|1] "" TME + SG_ KL_SIH_Soll_li : 8|3@1+ (1,0) [0|7] "" TME + SG_ KL_SIH_Soll_re : 11|3@1+ (1,0) [0|7] "" TME + SG_ KRH_Soll_li : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_SIL_Soll_li : 16|3@1+ (1,0) [0|7] "" TME + SG_ KL_SIL_Soll_re : 19|3@1+ (1,0) [0|7] "" TME + SG_ KRH_Soll_re : 22|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Geblspng_Soll : 24|8@1+ (0.05,1.45) [1.5|14] "Unit_Volt" Vector__XXX + SG_ KL_Geblspng_Fond_Soll : 32|8@1+ (0.05,1.45) [1.5|14] "Unit_Volt" Vector__XXX + SG_ KL_I_Geblaese : 40|8@1+ (0.25,0) [0|63.5] "Unit_Amper" Vector__XXX + SG_ KL_Kompressorstrom_soll : 48|10@1+ (1,0) [0|1021] "" TME + SG_ KL_Umluftklappe_Status : 58|4@1+ (1,0) [0|15] "" TME + SG_ KL_PTC_Verbauinfo : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1648 Motor_18: 8 Gateway + SG_ MO_max_Ladedruck : 0|6@1+ (0.1,0) [0|6.3] "Unit_Bar" Sub_Gateway + SG_ MO_ANC_Kennfeld_Anf : 6|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Bremslicht_Reku : 8|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_StartStopp_PopUp : 9|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO1_Sperr_Info_WFS : 11|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO1_Freigabe_Info_WFS : 12|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_EPCL : 13|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ MO_Zylabsch_Texte_02 : 16|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ MO_Fahrzeugtyp : 20|3@1+ (1,0) [0|7] "" BMS_NV,Sub_Gateway + SG_ MO_NMAX_Schaltanzeige : 23|9@1+ (25,0) [0|12775] "Unit_MinutInver" Sub_Gateway + SG_ MO_Abstellzeit : 32|8@1+ (8,0) [0|2024] "Unit_Minut" BMS_NV,Sub_Gateway,TME + SG_ MO_Abstellzeit_Status : 40|2@1+ (1,0) [0|3] "" BMS_NV,Sub_Gateway,TME + SG_ MO1_Freigabe_Verfallsinfo_WFS : 42|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Hybrid_StartStopp_LED : 43|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Fehler_Zylabsch : 45|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ MO_Zylabsch_Texte : 50|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Ethanol_BS_Texte : 52|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ MO_Drehzahl_Warnung : 55|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Sub_Gateway + +BO_ 1710 Spiegel_01: 8 Gateway + SG_ SP_FT_oben : 0|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_FT_unten : 1|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_FT_links : 2|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_FT_rechts : 3|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_BT_oben : 4|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_BT_unten : 5|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_BT_links : 6|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_BT_rechts : 7|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_abklappen : 8|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_anklappen : 9|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_normieren : 10|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_Hzg_Taster : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_S_oben : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_S_unten : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_S_links : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_S_rechts : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_Auswahl_li : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_Auswahl_re : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_ARA_Status : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_S_Klappen : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_Verstellschalter_Fehler : 24|1@1+ (1,0) [0|1] "" ZR_High + +BO_ 1711 Rear_View_01: 8 Gateway + SG_ RV_Video_on : 0|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_Dark_Screen : 1|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_HMI_Mode : 2|2@1+ (1,0) [0|3] "" ZR_High,ZR_Standard + SG_ RV_GL_side : 4|2@1+ (1,0) [0|3] "" ZR_High,ZR_Standard + SG_ RV_System_aktiv : 6|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_Reinigung_Anf : 7|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ RV_Settings_enabled : 8|1@1+ (1,0) [0|1] "" ZR_High + SG_ RV_Menu_Item : 9|2@1+ (1,0) [0|3] "" ZR_High + SG_ SV_Video_on : 11|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_Calib_Fehler : 12|1@1+ (1,0) [0|1] "" ZR_High + SG_ RV_GL_Trailer_connect : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_GL_Trunk_open : 14|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_GL_LWS_Fehler : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ RV_Helligkeit : 16|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard + SG_ ZFAS_Umfeldbeleuchtung_Anf : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ RV_Kontrast : 24|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard + SG_ RV_Farbe : 32|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard + +BO_ 1714 Diagnose_01: 8 Gateway_MQB + SG_ DGN_Verlernzaehler : 0|8@1+ (1,0) [0|254] "" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB + SG_ KBI_Kilometerstand : 8|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Tag : 39|5@1+ (1,0) [1|31] "Unit_Day" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ Kombi_02_alt : 62|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB + SG_ Uhrzeit_01_alt : 63|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB + +BO_ 1716 VIN_01: 8 Gateway_MQB + SG_ VIN_01_MUX M : 0|2@1+ (1,0) [0|3] "" Airbag_MQB + SG_ KS_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + +BO_ 316495015 MEB_VZE_01: 32 XXX + SG_ VZE_Anzeigemodus : 0|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ Detected_01 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ VZE_Anzeigeunterdrueck_Zeichen_3 : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Anzeigeunterdrueck_Zeichen_2 : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Verkehrszeichen_1 : 11|8@1+ (5,0) [1|520] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_2 : 19|8@1+ (5,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_3 : 27|8@1+ (5,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_1 : 35|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_2 : 36|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_3 : 37|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_1 : 38|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_2 : 42|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_3 : 46|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Anzeigeunterdrueck_Zeichen_1 : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Zeichen_01_KameraWied : 51|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_KameraWied : 52|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_KameraWied : 53|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Kamera : 54|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Karte : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Gesetz : 56|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Kamera : 57|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Karte : 58|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Gesetz : 59|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Kamera : 60|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Karte : 61|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Gesetz : 62|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Gong : 63|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_4 : 75|8@1+ (1,0) [0|31] "" XXX + SG_ VZE_Verkehrszeichen_6 : 92|7@1+ (1,0) [0|7] "" XXX + SG_ VZE_Baustelle : 110|1@0+ (1,0) [0|1] "" XXX + SG_ Zeichen_Unknown : 129|4@1+ (1,0) [0|15] "" XXX + SG_ Zeichen_Unknown_Entfernung : 140|6@1+ (1,0) [0|15] "" XXX + SG_ Zusatzschild_Unknown : 147|2@1+ (1,0) [0|3] "" XXX + SG_ Unknown_02 : 167|4@1+ (1,0) [0|3] "" XXX + SG_ Unknown_01 : 207|1@0+ (1,0) [0|1] "" XXX + +BO_ 316495049 SAL_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Unknown : 18|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Light_01 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ Right_Blinker : 25|1@0+ (1,0) [0|1] "" XXX + SG_ Left_Blinker : 26|1@1+ (1,0) [0|3] "" XXX + SG_ Reverse_Light : 27|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Light_02 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ Right_Blinker_02 : 44|1@1+ (1,0) [0|3] "" XXX + SG_ Left_Blinker_02 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 52|8@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 316495081 MEB_Camera_05: 8 XXX + +BO_ 316495106 AAA_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 316495140 MEB_Camera_06: 64 XXX + +BO_ 316495165 HVL_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 380195935 IPA_02: 8 XXX + +BO_ 380196019 MEB_Camera_07: 16 XXX + +BO_ 380196036 MEB_Camera_08: 8 XXX + +BO_ 389241617 MEB_Camera_10: 8 XXX + +BO_ 401604687 MEB_Camera_11: 8 XXX + +BO_ 402522959 MEB_Camera_14: 8 XXX + +BO_ 441800001 EML_02: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 441800082 MEB_Camera_12: 8 XXX + +BO_ 452984911 MEB_Camera_13: 8 XXX + +BO_ 316495058 Battery_Heating_Status: 8 XXX + SG_ Battery_Heating_Active : 38|1@1+ (1,0) [0|1] "" XXX + SG_ Heating_Request : 45|3@1+ (1,0) [0|7] "" XXX + SG_ Cooling_Request : 42|3@1+ (1,0) [0|7] "" XXX + SG_ Power_Batt_Heating : 48|8@1+ (1,0) [0|255] "W" XXX + SG_ Power_Batt_Heating_Req : 56|8@1+ (1,0) [0|255] "W" XXX + +BO_ 441800114 Charging_Optimization: 8 XXX + SG_ Temperature_Status_Charge : 15|3@1+ (1,0) [0|7] "" XXX + +BO_ 316495056 Charging_Dynamics: 8 XXX + SG_ Max_Charge_Power : 51|13@1+ (0.1,0) [0|819.1] "kW" XXX + SG_ Max_Charge_Current : 25|13@1+ (0.2,0) [0|1638.2] "A" XXX + +BO_ 380196006 Battery_Temperatures: 8 XXX + SG_ Battery_Max_Temp : 24|8@1+ (0.5,-40) [-40|87.5] "degC" XXX + SG_ Battery_Min_Temp : 32|8@1+ (0.5,-40) [-40|87.5] "degC" XXX + +CM_ BO_ 184 "Motorsteuergerät"; +CM_ BO_ 192 "Motorsteuergerät"; +CM_ BO_ 317 "Lenkungssteuergerät"; +CM_ BO_ 517 "Steuergerät fÃŧr Motorstart"; +CM_ BO_ 522 "Steuergerät fÃŧr Fahrzeugbewegung"; +CM_ BO_ 1622 "Steuergerät fÃŧr Lenkungsverriegelung"; +CM_ BO_ 316495165 "Steuergerät ICAS1"; +CM_ BO_ 441800001 "Steuergerät fÃŧr Fahrzeugbewegung"; +VAL_ 64 AB_RGS_Anst 4 "aktiv_Niveau_1" 5 "aktiv_Niveau_2" 6 "aktiv_Niveau_3" 7 "aktiv_Niveau_4" 8 "deaktiviert"; +VAL_ 64 AB_Front_Crash 0 "kein_Front_Crash" 1 "Front_Crash"; +VAL_ 64 AB_Heck_Crash 0 "kein_Heck_Crash" 1 "Heck_Crash"; +VAL_ 64 AB_SF_Crash 0 "kein_Seiten_Crash_Fahrer" 1 "Seiten_Crash_Fahrer"; +VAL_ 64 AB_SB_Crash 0 "kein_Seiten_Crash_Beifahrer" 1 "Seiten_Crash_Beifahrer"; +VAL_ 64 AB_Rollover_Crash 0 "kein_Rollover" 1 "Rollover"; +VAL_ 64 AB_Crash_Int 0 "kein_Crash" 1 "Crash_Intensitaet_1" 2 "Crash_Intensitaet_2_(nur_Stellgliedtest_MLB_B8)" 3 "Crash_Intensitaet_2_(nur_D4_C7_Colorado_NF_PAG__Crash_im_MLB_B8)" 4 "Crash_Intensitaet_3_(alt_VW/AUDI__Stellgliedtest_MLB_B8)" 5 "Crash_Intensitaet_3_(alt_PAG)" 7 "Crash_Intensitaet_3"; +VAL_ 64 AB_Lampe 0 "Aus" 1 "Ein"; +VAL_ 64 AB_Deaktiviert 0 "aktiv" 1 "deaktiviert"; +VAL_ 64 AB_VB_deaktiviert 0 "Beifahrerairbag_aktiv" 1 "Beifahrerairbag_deaktiviert"; +VAL_ 64 AB_Systemfehler 0 "kein_Fehler" 1 "Airbag_Systemfehler"; +VAL_ 64 AB_Diagnose 0 "nicht_in_Diagnose" 1 "in_Diagnose"; +VAL_ 64 AB_Stellgliedtest 0 "nicht_im_Stellgliedtest" 1 "Airbag_im_Stellgliedtest"; +VAL_ 64 AB_Erh_Auf_VB 0 "keine_Anzeige" 1 "Beifahrerairbag_deaktiviert" 2 "Beifahrerairbag_aktiviert" 3 "nicht_definiert"; +VAL_ 64 AB_Gurtwarn_VF 0 "keine_Warnung" 1 "Gurtwarnung_ausloesen"; +VAL_ 64 AB_Gurtwarn_VB 0 "keine_Warnung" 1 "Gurtwarnung_ausloesen"; +VAL_ 64 AB_Anzeige_Fussg 0 "keine_FSG_Aktion_ausgeloest" 1 "Motorhaube_offen" 2 "Systemfehler"; +VAL_ 64 AB_Texte_AKS 0 "keine_AKS_Ausloesung" 1 "AKS_ausgeloest" 2 "AKS_Systemfehler"; +VAL_ 64 AB_MKB_gueltig 0 "Multikollisionsbremsung_nicht_freigeschaltet" 1 "Multikollisionsbremsung_freigeschaltet"; +VAL_ 64 AB_MKB_Anforderung 0 "Multikollisionsbremsung_nicht_angefordert" 1 "Multikollisionsbremsung_angefordert"; +VAL_ 64 AB_Versorgungsspannung 0 "plausibel" 1 "unplausibel"; +VAL_ 64 AB_Deaktivierung_HV 0 "keine_Deaktivierung" 1 "Deaktivierung_1" 2 "Deaktivierung_2" 3 "Deaktivierung_3" 4 "Deaktivierung_4" 5 "Deaktivierung_5" 6 "Deaktivierung_6" 7 "Fehler"; +VAL_ 64 AB_EDR_Trigger 0 "No_Event" 1 "Start_Event" 2 "NonDeployment_Event" 3 "Deployment_Event"; +VAL_ 64 AB_Belegung_VF 0 "nicht_verfuegbar" 1 "Fehler" 2 "nicht_belegt" 3 "belegt"; +VAL_ 64 SC_LowSpeedCrashErkannt 0 "kein_Crash_erkannt" 1 "Crash_Frontbereich_erkannt" 2 "Crash_Heckbereich_erkannt" 3 "Crash_Front_und_Heckbereich_erkannt"; +VAL_ 64 SC_Masterzeit 127 "Init"; +VAL_ 134 LWI_Sensorstatus 0 "iO" 1 "nicht kalibriert"; +VAL_ 134 LWI_QBit_Sub_Daten 0 "LWS-Subinfo real (Lenkradwinkelinformation ADS-tauglich)" 1 "LWS-Subinfo simuliert (Lenkradwinkelinformation nicht ADS-tauglich )"; +VAL_ 134 LWI_MFL_Abschaltung 0 "inaktiv" 1 "aktiv"; +VAL_ 134 LWI_QBit_Lenkradwinkel 0 "gÃŧltiger Wert" 1 "ausserhalb der Spezifikation"; +VAL_ 134 LWI_Lenkradwinkel 8190 "Init" 8191 "Fehler"; +VAL_ 134 LWI_VZ_Lenkradwinkel 0 "positiv_links_von_der_Nullstellung" 1 "negativ"; +VAL_ 134 LWI_VZ_Lenkradw_Geschw 0 "positiv_links_von_der_Nullstellung" 1 "negativ"; +VAL_ 134 LWI_Lenkradw_Geschw 510 "Init" 511 "Fehler"; +VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" 8 "preempted"; +VAL_ 167 MO_Mom_Soll_Roh 1022 "Init"; +VAL_ 167 MO_Mom_Ist_Summe 1022 "Init"; +VAL_ 167 MO_Mom_Traegheit_Summe 1022 "Init"; +VAL_ 167 MO_Mom_Soll_gefiltert 1022 "Init"; +VAL_ 167 MO_Mom_Schub 510 "Init"; +VAL_ 167 MO_Status_Normalbetrieb_01 0 "kein_Normalbetrieb" 1 "Normalbetrieb_erreicht"; +VAL_ 167 MO_erste_Ungenauschwelle 0 "genau" 1 "Momente ungenauer >8%"; +VAL_ 167 MO_QBit_Motormomente 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 168 MO_Mom_neg_verfuegbar 510 "Init" 511 "Fehler"; +VAL_ 168 MO_Mom_Begr_stat 510 "Init"; +VAL_ 168 MO_Mom_Begr_dyn 1022 "Init"; +VAL_ 168 MO_QBit_Drehzahl_01 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 173 GE_MMom_Soll_02 1022 "keine_Anforderung_Init" 1023 "Fehler"; +VAL_ 173 GE_MMom_Vorhalt_02 1022 "Init" 1023 "Fehler"; +VAL_ 173 GE_Uefkt 1023 "Fehler"; +VAL_ 173 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; +VAL_ 173 GE_Schaltablauf 0 "keine_Schaltung" 1 "Momentenueberschneidung" 2 "Befuellphase" 3 "Drehzahlueberfuehrung"; +VAL_ 173 GE_Uefkt_unplausibel 0 "Uefkt_plausibel" 1 "Uefkt_unplausibel"; +VAL_ 173 GE_MMom_Status_02 0 "kein_Eingriff" 1 "abs_reduzierender_Eingriff_auf_Gesamt_Antrieb_nur_schneller_Pfad" 2 "abs_erhoehender_Eingriff_auf_Gesamt_Antrieb" 3 "relativer_Eingriff_auf_Gesamt_Antrieb" 4 "relativer_Eingriff_auf_E_Maschine" 5 "abs_red_Eingr_auf_Gesamt_Antrieb_nur_Luftpfad" 6 "abs_red_Eingr_auf_Gesamt_Antrieb_Luft-_und_schnellen_Pfad" 7 "abs_Eingriff_auf_Gesamtantrieb_erhoehend_und_reduzierend"; +VAL_ 173 GE_Status_Kraftschluss 0 "offen_kein_Kraftschluss" 1 "offen_mit_Kraftschluss" 2 "schlupfend_geregelt" 3 "abgesichert_offen_kein_Kraftschl" 4 "geschlossen_mit_Mikroschlupf" 5 "geschlossen_mit_Ueberanpressung" 6 "sonstige_Fehler" 7 "fehlerhaft_geschlossen"; +VAL_ 173 GE_MMom_Status 0 "keine Anforderung" 1 "reduzierender Getriebeeingriff" 2 "erhÃļhender Getriebeeingriff" 3 "ÄŽderung mit Sprung"; +VAL_ 173 GE_Freig_MMom_Vorhalt 0 "nicht_freigegeben" 1 "freigegeben"; +VAL_ 173 GE_Verbot_Ausblendung 0 "kein_Verbot" 1 "Verbot"; +VAL_ 173 GE_Zielgang 0 "Gang P/N (ausgekuppelt)" 1 "Gang 1" 2 "Gang 2" 3 "Gang 3" 4 "Gang 4" 5 "Gang 5" 6 "Gang 6" 7 "Gang 7" 8 "Gang R" 11 "Gang 8" 12 "Gang 9" 13 "Gang10" 14 "Istgang nicht definiert" 15 "Fehler"; +VAL_ 184 EM1_Freigabe_Info_WFS 0 "ungueltig" 1 "gueltig"; +VAL_ 184 EM1_Sperr_Info_WFS 0 "nicht_gesperrt" 1 "gesperrt"; +VAL_ 184 EM1_AR_aktiv 0 "Init" 1 "Ruckeldaempfer_aktiv"; +VAL_ 184 EM1_Eta_Sys 510 "Init" 511 "Fehler"; +VAL_ 184 EM1_IstStrom 2046 "Init" 2047 "Fehler"; +VAL_ 184 EM1_Fehler_ElAntriebFreilauf_Anf 0 "Init" 1 "Fehler_EM_im_Freilauf"; +VAL_ 184 EM1_Abregelung_Temperatur 0 "Init" 1 "Abregelung_Temperatur"; +VAL_ 184 EM1_AnlernenElMotor_Anf 0 "kein_Diagnose_Request" 1 "Diagnose_Request"; +VAL_ 184 EM1_Moment_HVVerbraucher 1023 "Init"; +VAL_ 184 EM1_Freigabe_Verfallsinfo_WFS 0 "Aus" 1 "Ein"; +VAL_ 184 EM1_Parken_WFS_Status 0 "Limitierung_Inaktiv" 1 "Limitierung_Aktiv" 2 "Abbruch"; +VAL_ 184 EM1_HV_betriebsbereit 0 "Init" 1 "Ready_HV"; +VAL_ 190 Engine_Status 1 "Ready" 2 "Online"; +VAL_ 253 BR_Eingriffsmoment 1022 "Init" 1023 "Fehler"; +VAL_ 253 ESP_Diagnose 0 "ESP_nicht_in_Diagnose" 1 "ESP_in_Diagnose"; +VAL_ 253 ESC_v_Signal_Qualifier_High_Low 0 "Gueteschwelle_kleiner_1kmh" 1 "Gueteschwelle_kleiner_3kmh" 2 "Gueteschwelle_kleiner_5kmh" 3 "Gueteschwelle_kleiner_10kmh" 4 "Gueteschwelle_kleiner_20kmh" 5 "Gueteschwelle_groessergleich_20kmh" 6 "Init" 7 "Fehler"; +VAL_ 253 ESP_Vorsteuerung 0 "keine_Vorsteuerung_aktiv" 1 "Vorsteuerung_aktiv"; +VAL_ 253 OBD_Schlechtweg 0 "kein_Schlechtweg_erkannt" 1 "Schlechtweg_erkannt"; +VAL_ 253 OBD_QBit_Schlechtweg 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 253 ESP_v_Signal 65533 "Unterspannung" 65534 "Init" 65535 "Fehler"; +VAL_ 253 ASR_Tastung_passiv 0 "ASR_aktiviert" 1 "ASR_passiv_getastet_oder_Schwellen_geaendert"; +VAL_ 253 ESP_Tastung_passiv 0 "ESP_aktiviert" 1 "ESP_passiv_getastet_oder_Schwellen_geaendert"; +VAL_ 253 ESP_Systemstatus 0 "iO" 1 "Fehler"; +VAL_ 253 ASR_Schalteingriff 0 "keine_Anforderung" 1 "ASR_Schaltkennfeld" 2 "Rueckschaltung" 3 "Schaltverbot"; +VAL_ 253 ESP_QBit_v_Signal 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 253 ABS_Bremsung 0 "keine_ABS_Regelung" 1 "ABS_Regelung_aktiv"; +VAL_ 253 ASR_Anf 0 "keine_Anforderung" 1 "ASR_Anforderung"; +VAL_ 253 MSR_Anf 0 "keine Anfoderung" 1 "MSR-Anforderung"; +VAL_ 253 EBV_Eingriff 0 "kein_EBV_Eingriff" 1 "EBV_Eingriff"; +VAL_ 253 EDS_Eingriff 0 "kein_EDS_Eingriff" 1 "EDS_Eingriff"; +VAL_ 253 ESP_Eingriff 0 "kein_ESP_Eingriff" 1 "ESP_Eingriff_aktiv"; +VAL_ 253 ESP_ASP 0 "inaktiv" 1 "aktiv"; +VAL_ 253 ESC_Neutralschaltung 0 "keine_Anforderung" 1 "Neutralschaltung_angefordert"; +VAL_ 278 ESP_QBit_Wegimpuls_VL 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 278 ESP_QBit_Wegimpuls_VR 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 278 ESP_QBit_Wegimpuls_HL 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 278 ESP_QBit_Wegimpuls_HR 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 278 ESP_Wegimpuls_VL 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; +VAL_ 278 ESP_Wegimpuls_VR 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; +VAL_ 278 ESP_Wegimpuls_HL 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; +VAL_ 278 ESP_Wegimpuls_HR 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; +VAL_ 278 ESP_VL_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; +VAL_ 278 ESP_VR_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; +VAL_ 278 ESP_HL_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; +VAL_ 278 ESP_HR_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; +VAL_ 299 GRA_Hauptschalter 0 "Hauptschalter_aus__Taster_nicht_betaetigt" 1 "Hauptschalter_ein__Taster_betaetigt"; +VAL_ 299 GRA_Abbrechen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Typ_Hauptschalter 0 "gerasteter_Lenkstockschalter" 1 "getasteter_Lenkstockschalter"; +VAL_ 299 GRA_Limiter 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Tip_Setzen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Tip_Hoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Tip_Runter 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Tip_Wiederaufnahme 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Verstellung_Zeitluecke 0 "Taste_nicht_betaetigt" 1 "Dist_minus_1" 2 "Dist_plus_1" 3 "Dist_Toggle"; +VAL_ 299 GRA_Codierung 0 "kein_Hebel" 1 "GRA_Hebel" 2 "ACC_Hebel" 3 "Limiter_Only"; +VAL_ 299 GRA_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 299 GRA_LIM_Taste_verfuegbar 0 "Limiter_Taste_nicht_vorhanden" 1 "Limiter_Taste_vorhanden"; +VAL_ 299 GRA_Tip_Stufe_2 0 "Tip_Stufe_1__keine_Betaetigung" 1 "Tip_Stufe_2"; +VAL_ 299 GRA_TravelAssist 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 319 PreCrash_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 319 PreCrash_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 319 PreCrash_Schiebedach_schliessen 0 "keine_Schliessung" 1 "Schliessung_angefordert"; +VAL_ 319 PreCrash_Fenster_schliessen 0 "keine_Schliessung" 1 "Schliessung_angefordert"; +VAL_ 319 PreCrash_Blinken 0 "keine_Blinkanforderung" 1 "Warnblinken" 2 "RECAS_Blinken" 3 "Notbremsblinken"; +VAL_ 319 SC_PreSense_FCWP 0 "Warnung_gilt_fuer_Objekte" 1 "Warnung_gitl_fuer_Fussgaenger"; +VAL_ 319 PreCrash_Tueren_Verriegeln 0 "keine_Anforderung" 1 "Tueren_Verriegeln"; +VAL_ 319 PreCrash_Anforderung_AFR 0 "keine_Anforderung" 1 "linke_Seite" 2 "rechte_Seite" 3 "Vorderachse" 4 "Hinterachse" 5 "Vorwarnung" 7 "Init"; +VAL_ 319 SC_PreCrash_LED 0 "keine_Anzeige" 1 "Stufe_1_glimmen" 2 "Stufe_2_leuchten" 3 "Stufe_3_blinken"; +VAL_ 319 PreCrash_FS_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; +VAL_ 319 PreCrash_BFS_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; +VAL_ 319 PreCrash_Fo_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; +VAL_ 319 PreCrash_FS_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)" 6 "Lehnenverstellung_ansteuern" 7 "Lehnenkopfverstellung_ansteuern"; +VAL_ 319 PreCrash_BFS_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)" 6 "Lehnenverstellung_ansteuern" 7 "Lehnenkopfverstellung_ansteuern"; +VAL_ 319 PreCrash_Fo_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)"; +VAL_ 319 PreCrash_FS_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren" 9 "Kopfstuetze_ansteuern"; +VAL_ 319 PreCrash_BFS_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren" 9 "Kopfstuetze_ansteuern"; +VAL_ 319 PreCrash_Fo_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren"; +VAL_ 319 SC_PreCrash_Warnung 0 "keine_Anzeige" 1 "latente_Vorwarnung" 2 "Vorwarnung" 3 "Akutwarnung" 4 "Eingriff" 5 "Fahreruebernahmeaufforderung" 6 "Abbiegewarnung" 7 "Basiseingriff" 8 "Heckeingriff"; +VAL_ 319 SC_PreCrash_Texte 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "Demomodus" 4 "System_aus" 5 "Anhaengerbetrieb" 6 "ESC_aus" 7 "zurzeit_eingeschraenkt" 8 "zurzeit_eingeschraenkt_ESP_Aus" 9 "Initialisierung"; +VAL_ 333 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert"; +VAL_ 333 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 333 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler"; +VAL_ 333 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 333 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren"; +VAL_ 333 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht"; +VAL_ 333 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert"; +VAL_ 333 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; +VAL_ 333 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv"; +VAL_ 333 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 333 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe"; +VAL_ 333 Accel_Boost 3 "Driving" 0 "Stop" 2 "Driving" 1 "Driving"; +VAL_ 339 MO_HVEM_Eskalation 0 "keine_Eskalation_HVEM" 1 "Eskalation_HVEM"; +VAL_ 339 MO_ErwGrenzen_Anf 0 "normal" 1 "erweitert"; +VAL_ 339 MO_Fehler_Notentladung_Anf 0 "Init"; +VAL_ 339 MO_HVEM_MaxLeistung 510 "Init"; +VAL_ 339 MO_HVK_EmIstzustand 0 "HvOff" 1 "HvStbyReq" 2 "HvStbyOk" 3 "HvBattOnReq" 4 "HvBattOnOk" 10 "HvOnIdle" 18 "HvOnDrvReq" 19 "HvOnDrvOk" 20 "HvOnDrvRdy" 28 "HvStepUpReq" 29 "HvStepUpOk" 30 "HvStepUp" 38 "HvStepDownReq" 39 "HvStepDownOk" 40 "HvStepDown" 46 "HvAcChPreReq" 47 "HvAcChPreOk" 48 "HvAcChReq" 49 "HvAcChOk" 50 "HvAcCh" 56 "HvDcChPreReq" 57 "HvDcChPreOk" 58 "HvDcChReq" 59 "HvDcChOk" 60 "HvDcCh" 67 "HvChOffReq" 68 "HvChOffOk" 69 "HvOnIdleReq" 70 "HvOnIdleOk" 96 "HvCpntOffReq" 97 "HvCpntOffOk" 98 "HvBattOffReq" 99 "HvBattOffOk" 109 "HvDcDcFailOffReq" 110 "HvDcDcFail" 119 "HvElmOffReq" 120 "HvElmOff" 126 "HvFailCpntOffReq" 127 "HvFailCpntOffOk" 128 "HvFailBattOffReq" 129 "HvFailBattOffOk" 130 "HvFailBattOff" 138 "HvFailUCtlReq" 139 "HvFailUCtlOk" 140 "HvFailUCtl" 150 "HvEmgcyOff" 255 "Init"; +VAL_ 339 MO_HVK_AntriebFehlerstatus 0 "Komponente_IO" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 339 MO_MVK_Bordnetz_Anf 0 "keine_Anforderung" 1 "Bordnetzaktivitaet_gefordert"; +VAL_ 339 MO_HVK_AntriebZustand 0 "Antrieb_AUS" 1 "Antrieb_Startphase" 2 "E_Fahren" 3 "Hybrid_Fahren" 7 "Init"; +VAL_ 339 MO_HVK_EmFehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Teilbetrieb" 3 "Eingeschr_KompFkt_Interlock" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 339 MO_MVK_AntriebFehlerstatus 0 "Komponente_IO" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 339 MO_MVK_AntriebZustand 0 "Antrieb_AUS" 1 "Antrieb_Startphase" 2 "FreilaufMotorAus" 7 "Init"; +VAL_ 339 MO_MVK_EmFehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Teilbetrieb" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 339 MO_MVK_EmIstzustand 0 "MvOff" 1 "MvStbyReq" 2 "MvStbyOk" 3 "MvBattOnReq" 4 "MvBattOnOk" 10 "MvOnIdle" 18 "MvOnDrvReq" 19 "MvOnDrvOk" 20 "MvOnDrv" 28 "MvStepUpReq" 29 "MvStepUpOk" 30 "MvStepUp" 38 "MvStepDownReq" 39 "MvStepDownOk" 40 "MvStepDown" 96 "MvCpntOffReq" 97 "MvCpntOffOk" 98 "MvBattOffReq" 99 "MvBattOffOk" 109 "MvDcDcFailOffReq" 110 "MvDcDcFail" 119 "MvElmFailOffReq" 120 "MvElmFail" 126 "MvFailCpntOffReq" 127 "MvFailCpntOffOk" 128 "MvFailBattOffReq" 129 "MvFailBattOffOk" 130 "MvFailBattOff" 138 "MvFailUCtlReq" 139 "MvFailUCtlOk" 140 "MvFailUCtl" 150 "MvEmgcyOff" 255 "Init"; +VAL_ 420 EA_Parken_beibehalten_HMS 0 "Parken_nicht_beibehalten" 1 "Parken_beibehalten" 2 "Init" 3 "Fehler"; +VAL_ 420 EA_Warnruckprofil 0 "keine_Ruckanforderung" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7"; +VAL_ 420 EA_eCall_Anf 0 "Keine_Anforderung" 1 "Ausloesen_eCall"; +VAL_ 420 EA_Funktionsstatus 0 "EA_INIT" 1 "EA_OFF" 2 "EA_STANDBY" 3 "EA_PHASE0_AKTIV" 4 "EA_PHASE1_AKTIV" 5 "EA_PHASE2_AKTIV" 6 "EA_PHASE3_AKTIV" 7 "EA_REVERSIBLER_FEHLER" 8 "EA_IRREVERSIBLER_FEHLER"; +VAL_ 420 EA_Gurtstraffer_Anf 0 "Keine_Anforderung" 1 "Haptik_1" 2 "Haptik_2" 3 "Haptik_3"; +VAL_ 420 EA_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" 6 "Parken_mit_P"; +VAL_ 420 EA_Sollbeschleunigung 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 496 EA_Texte 0 "keine_Anzeige" 1 "Nothalteassistent_fehlende_Fahreraktivitaet" 2 "Nothalteassistent_aktiv_Fahrzeugfuehrung_uebernehmen" 3 "Nothalteassistent_automatischer_Nothalt_wird_durchgefuehrt" 4 "Nothalteassistent_automatischer_Nothalt_durchgefuehrt" 5 "Nothalteassistent_Verbindung_zum_Notruf_wird_aufgebaut" 6 "Nothalteassistent_deaktiviert" 7 "Nothalteassistent_Eingriff_abgebrochen" 8 "Nothalteassistent_fehlende_Fahreraktivitaet_2" 9 "Sekundenschlaf_erkannt" 10 "LaneAssist_Lenkung_uebernehmen" 11 "ACA_Fahrzeugfuehrung_uebernehmen" 12 "EA_Fahr_Standstreifenwechsel" 14 "Nothalteassistent_nicht_verfuegbar_reversibel" 15 "Nothalteassistent_Stoerung_irreversibel"; +VAL_ 496 ACF_Lampe_Hands_Off 0 "keine_Anzeige" 1 "Hands_Off_erkannt"; +VAL_ 496 EA_Infotainment_Anf 0 "Init" 1 "Keine_Absenkung" 2 "Absenkung" 3 "Mute"; +VAL_ 496 EA_Tueren_Anf 0 "Keine_Anforderung" 1 "Tueren_entriegeln"; +VAL_ 496 EA_Innenraumlicht_Anf 0 "Innenraumbeleuchtung_ausschalten" 1 "Innenraumbeleuchtung_einschalten"; +VAL_ 496 zFAS_Warnblinken 0 "Aus" 1 "Statisch" 2 "Taster" 3 "Statisch_ohne_WBT"; +VAL_ 496 STP_Primaeranz 0 "keine_Anzeige" 1 "Verfuegbar" 2 "Aktiv" 3 "Uebernahme" 4 "Aktiv_Warnung" 5 "Nicht_Verfuegbar"; +VAL_ 496 EA_Bremslichtblinken 0 "kein_Blinken" 1 "Anforderung_Bremslichtblinken"; +VAL_ 496 EA_Blinken 0 "Kein_Blinken" 1 "Wechselblinken_links" 2 "Wechselblinken_rechts" 3 "Warnblinken" 4 "Warnblinken_Taster"; +VAL_ 591 Distance_Status 0 "Valid" 3 "Invalid"; +VAL_ 706 MO_Anzeige_StSt_Text 0 "keine_Anzeige" 1 "Systemfehler" 2 "Motor_manuell_starten" 3 "Rueckmeldung_durch_Fahrstufe_einlegen" 4 "Zuendungsabschaltwarnung_Timerstart" 5 "Zum_Motorstart_Bremse_treten" 6 "StSt_Aktivierung_nicht_moeglich_auf_Grund_Fahrprogramm"; +VAL_ 706 MO_Anzeige_StSt_Symbol 0 "keine_Anzeige" 1 "StSt_aktiv" 2 "Motorlauf_noetig" 3 "Fahrer_temporaer_abwesend" 4 "Fahrer_vielleicht_anwesend"; +VAL_ 706 MO_ADR_Status 0 "nicht_aktiv" 1 "ADR_angefordert" 2 "ADR_aktiv" 3 "ADR_Fehler"; +VAL_ 706 MO_AGA_Sound_Texte 0 "keine_Anzeige" 1 "Sound_off" 2 "Sound_on"; +VAL_ 706 MO_Anzeige_FMAus_Text 0 "keine_Anzeige" 1 "FMAus_Systemfehler"; +VAL_ 706 MO_Fehler_MSpG 0 "i.O." 1 "GebläŗĨ defekt oder Motorraumtemp. zu hoch"; +VAL_ 706 PEA_Texte 0 "Keine_Anzeige" 1 "PEA_Fahreruebernahme_noetig" 2 "PEA_Reku_nicht_verfuegbar"; +VAL_ 706 TSK_Ueberstimmt_vMax_FahrerInfo 0 "nicht_ueberstimmbar" 1 "ueberstimmbar" 2 "ueberstimmt"; +VAL_ 706 MO_Avus_Motorschutz 0 "keine Warnung" 1 "Drehzahlwarnung Stufe 1" 2 "Drehzahlwarnung Stufe 2" 3 "Drehzahlwarnung Stufe 3"; +VAL_ 706 MO_Rekuperationsstufe 0 "keine_Anzeige" 1 "Rekuperationsstufe_1" 2 "Rekuperationsstufe_2" 3 "Rekuperationsstufe_3" 4 "Rekuperationsstufe_4" 5 "Rekuperationsstufe_5" 6 "Rekuperationsstufe_auto" 7 "Init"; +VAL_ 706 TSK_Einheit_vMax_FahrerInfo 0 "km_h" 1 "mph"; +VAL_ 706 TSK_Status_vMax_FahrerInfo 0 "keine_Anzeige" 1 "Anzeige_im_Fahrzeugstatus" 2 "PopUp_ohne_Gong__Eintrag_FhzStat" 3 "PopUp_mit_Gong__Eintrag_FhzStat"; +VAL_ 706 MO_Red_Fahrleistung 0 "keine_Anzeige" 1 "kleine_Red" 2 "mittlere_Red_temp" 3 "mittlere_Red" 4 "grosse_Red_temp" 5 "grosse_Red"; +VAL_ 706 MO_Anz_Kuehlerluefter 0 "Kein_KuehlerluefterNachlauf" 1 "Text_Luefternachlauf_aktiv" 2 "Text_Luefternachlauf_DPF_aktiv" 3 "Platzhalter_weitere_Signale" 4 "Platzhalter_weitere_Signale" 5 "Platzhalter_weitere_Signale" 6 "Platzhalter_weitere_Signale" 7 "Platzhalter_weitere_Signale"; +VAL_ 706 MO_im_Leerlauf 0 "nicht_im_Leerlauf" 1 "im_Leerlauf"; +VAL_ 706 WIV_Enable_Oeldr_Motor 0 "Oeldruckauswertung_im_Kombi" 1 "Oeldruckauswertung_im_MSG"; +VAL_ 706 MO_OelMessung_Dauer 15 "keine_Messung_aktiv"; +VAL_ 706 TSK_vMax_FahrerInfo 0 "Init___kein_Wert"; +VAL_ 768 ACC_Tempolimit 0 "keine_Anzeige" 1 "5_zulHoechstgeschw" 2 "7_zulHoechstgeschw" 3 "10_zulHoechstgeschw" 4 "15_zulHoechstgeschw" 5 "20_zulHoechstgeschw" 6 "25_zulHoechstgeschw" 7 "30_zulHoechstgeschw" 8 "35_zulHoechstgeschw" 9 "40_zulHoechstgeschw" 10 "45_zulHoechstgeschw" 11 "50_zulHoechstgeschw" 12 "55_zulHoechstgeschw" 13 "60_zulHoechstgeschw" 14 "65_zulHoechstgeschw" 15 "70_zulHoechstgeschw" 16 "75_zulHoechstgeschw" 17 "80_zulHoechstgeschw" 18 "85_zulHoechstgeschw" 19 "90_zulHoechstgeschw" 20 "95_zulHoechstgeschw" 21 "100_zulHoechstgeschw" 22 "110_zulHoechstgeschw" 23 "120_zulHoechstgeschw" 24 "130_zulHoechstgeschw" 25 "140_zulHoechstgeschw" 26 "150_zulHoechstgeschw" 27 "160_zulHoechstgeschw" 28 "200_zulHoechstgeschw" 30 "250_zulHoechstgeschw" 31 "Ende_zulHoechstgeschw"; +VAL_ 768 ACC_Wunschgeschw_Farbe 0 "Grundfarbe" 1 "Farbe_1"; +VAL_ 768 ACC_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert" 1 "Warnung"; +VAL_ 768 ACA_Querfuehrung 0 "keine_Anzeige_oder_init" 1 "passiv" 2 "aktiv" 3 "Warnung"; +VAL_ 768 ACC_Regelung_AIO 0 "Regelung_Ampel_nicht_aktiv" 1 "Regelung_Ampel_aktiv"; +VAL_ 768 ACC_Wunschgeschw_02 1023 "keine_Anzeige"; +VAL_ 768 ACC_Abstandsindex_02 0 "Audi (Init), VW (passiv/aktiv_Freifahrt)" 1022 "aus_passiv" 1023 "aktiv_Freifahrt"; +VAL_ 768 ACC_Display_Prio 0 "hoechste_Prio" 1 "mittlere_Prio" 2 "geringe_Prio" 3 "keine_Prio"; +VAL_ 768 ACC_rel_Objekt_Zusatzanz 0 "keine Anzeige" 1 "Relevantes_Objekt_erkannt" 2 "Relevantes_Objekt_Abstandswarnung"; +VAL_ 768 ACC_Gesetzte_Zeitluecke 0 "keine_Anzeige" 1 "Zeitluecke_1" 2 "Zeitluecke_2" 3 "Zeitluecke_3" 4 "Zeitluecke_4" 5 "Zeitluecke_5" 6 "nicht_definiert" 7 "nicht_definiert"; +VAL_ 768 ACC_Optischer_Fahrerhinweis 0 "optischer_Fahrerhinweis_AUS" 1 "optischer_Fahrerhinweis_EIN"; +VAL_ 768 ACC_Warnhinweis 0 "kein_Warnhinweis" 1 "Warnhinweis"; +VAL_ 768 ACC_EGO_Fahrzeug 0 "keine_Anzeige" 1 "aktiv" 2 "Warnung" 3 "aktiv_stop" 4 "passiv"; +VAL_ 768 ACC_Relevantes_Objekt_02 0 "keine_Anzeige" 1 "Relevantes_Objekt_erkannt" 2 "Relevantes_Objekt_Warnung" 3 "passiv"; +VAL_ 768 ACC_Wunschgeschw_erreicht 0 "Wunschgeschwindigkeit_nicht_erreicht" 1 "Wunschgeschwindigkeit_erreicht"; +VAL_ 768 ACC_Anzeige_Zeitluecke 0 "Anzeige_Zeitluecke_nicht_angefordert" 1 "Anzeige_Zeitluecke_angefordert"; +VAL_ 768 ACC_Texte_Primaeranz_02 0 "keine Anzeige" 1 "VDA_ACC_Symbol_YYY_kmh_mph" 2 "Kurven_Symbol_YYY_kmh_mph" 3 "Tempolimit_Symbol_YYY_kmh_mph" 4 "ACC_anfahrbereit" 5 "eingestellte_Zeitluecke" 6 "Tuer offen !" 7 "Stehendes Objekt voraus" 8 "o o o" 9 "ACC aus" 10 "ACC startet" 11 "ACC Sensor Sicht !" 12 "ACC nicht verfuegbar" 13 "ACC Fehler" 14 "ESP Eingriff" 15 "ESP PASSIV !" 16 "Parkbremse !" 17 "Geschwindigkeitsgrenze" 18 "Waehlhebelposition !" 19 "Fahrer Gurtschloss offen !" 20 "Schalthebelposition !" 21 "Drehzahl !" 22 "HDC aktiv" 23 "Kupplung betaetigt" 24 "Gang einlegen !" 25 "Bremse ueberhitzt !" 26 "Steigung_Gefaelle_zu_gross" 27 "ABSTAND" 28 "Rechtsueberholen_verhindert" 29 "Linksueberholen_verhindert" 30 "Kreuzungs_Symbol" 31 "Kreisverkehr_Symbol" 32 "Gefaelle_Symbol" 33 "Tempolimit_Kurvenassistent_ein" 34 "Kurvenassistent_ein" 35 "Tempolimitassistent_ein" 36 "Achtung_Geschwindigkeitsueberschreitung" 37 "Tempolimit_und_Kurvenassistent_nicht_verfuegbar" 38 "Tempolimit_nicht_verfuegbar" 39 "Kurvenassistent_nicht_verfuegbar" 40 "Autobahnausfahrt_Symbol" 41 "Stauende_Symbol" 42 "Engstelle_Symbol" 43 "STP_verfuegbar" 44 "Ampel_vertikal" 45 "Ampel_horizontal" 46 "STA_verfuegbar"; +VAL_ 768 ACC_Texte_Zusatzanz_02 0 "keine_Anzeige" 1 "ACC_AUS" 2 "Standby" 3 "UEBERTRETEN" 4 "ABSTAND" 5 "DISTANZ_1" 6 "DISTANZ_2" 7 "DISTANZ_3" 8 "DISTANZ_4" 9 "DISTANZ_5" 10 "DISTANZ_1__dyn" 11 "DISTANZ_2__dyn" 12 "DISTANZ_3__dyn" 13 "DISTANZ_4__dyn" 14 "DISTANZ_5__dyn" 15 "DISTANZ_1__comf" 16 "DISTANZ_2__comf" 17 "DISTANZ_3__comf" 18 "DISTANZ_4__comf" 19 "DISTANZ_5__comf" 20 "DISTANZ_1__efficiency" 21 "DISTANZ_2__efficiency" 22 "DISTANZ_3__efficiency" 23 "DISTANZ_4__efficiency" 24 "DISTANZ_5__efficiency" 25 "DISTANZ_1__Stau" 26 "DISTANZ_2__Stau" 27 "DISTANZ_3__Stau" 28 "DISTANZ_4__Stau" 29 "DISTANZ_5__Stau" 30 "ACHTUNG" 31 "Abstandsanzeige" 32 "Abstandsanzeige_Warnung_aktiviert" 33 "STA_verfuegbar" 34 "Engstelle" 35 "RUV_aktiv_Rechtsverkehr" 36 "RUV_aktiv_Linksverkehr" 37 "STP_Verfuegbar" 38 "AW_Warnschwelle_1" 39 "AW_Warnschwelle_2" 40 "AW_Warnschwelle_3" 41 "AW_Warnung_1" 42 "AW_Warnung_2" 43 "AW_Warnung_3"; +VAL_ 768 STA_Primaeranz 0 "keine_Anzeige" 1 "STA_standby" 2 "STA_aktiv" 3 "STA_Warnung"; +VAL_ 768 ACC_Event_Wunschgeschw 1023 "None"; +VAL_ 768 Heartbeat 1 "ACC_Init_Low" 420 "ACC_Init_High" 221 "ACC_Available_Low" 360 "ACC_Available_High"; +VAL_ 768 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; +VAL_ 768 Lead_Type_Detected 1 "Lead_Detected" 0 "No_Lead_Detected"; +VAL_ 768 Lead_Type 5 "Bicycle" 3 "Car" 0 "None" 2 "Truck" 4 "Motorcycle"; +VAL_ 768 ACC_Events 3 "Starting_Available" 0 "None" 5 "Speed_Limit_Detected" 9 "Crossing" 4 "Speed_Limit_Ahead" 10 "Roundabout" 6 "Curve"; +VAL_ 768 Zeitluecke_1 0 "keine Anzeige"; +VAL_ 768 Zeitluecke_2 0 "keine Anzeige" 32 "Minimum"; +VAL_ 768 Zeitluecke_3 0 "keine Anzeige"; +VAL_ 768 Zeitluecke_4 0 "keine Anzeige" 40 "Minimum"; +VAL_ 768 Zeitluecke_5 0 "keine Anzeige"; +VAL_ 795 ESP_Lampe 0 "Aus" 1 "Ein"; +VAL_ 795 ABS_Lampe 0 "Aus" 1 "Ein"; +VAL_ 795 BK_Lampe_02 0 "aus" 1 "ein_statisch" 3 "Warnung"; +VAL_ 795 TC_Lampe 0 "Aus" 1 "Ein"; +VAL_ 795 ESP_m_Raddrehz 32765 "Unterspannung" 32766 "Init" 32767 "Fehler"; +VAL_ 795 ESP_Textanzeigen_03 0 "kein_Text" 1 "ESP_Stoerung" 2 "ABS_Stoerung" 3 "ESP_ABS_Stoerung" 4 "Werkstatt_Bremse" 5 "ASR_Stoerung" 6 "ESP_switched_off" 7 "ASR_off" 8 "ESP_ASR_on" 10 "keine_Bremskraftverstaerkung" 11 "ASR_aktiviert" 12 "ABS_ASR_Stoerung" 15 "ESP_offroad" 17 "ESP_sport" 18 "ESP_Zwangsaktivierung" 19 "ESP_Taster_Info" 20 "TC_aktiv" 21 "reserviert_fuer_Verlwarn" 22 "TC_switched_off" 23 "Verlwarn_akt_Rollsicher_inakt" 24 "ESP_SuperSport" 25 "ESP_Offroad_nicht_verfuegbar"; +VAL_ 795 ESP_Meldungen 0 "keine_Anzeige" 1 "Autohold_Hinweis_1" 2 "Stoerung_Autohold" 3 "Stoerung_Hillholder" 4 "Uebernehmen" 5 "Autohold_aus" 6 "Autohold_Hinweis_2"; +VAL_ 795 ESP_Fehlerstatus_Wegimp 0 "Wegimpulse_iO" 1 "Fehler"; +VAL_ 795 ESP_Wegimp_Ueberlauf 0 "Reset_und_kein_Ueberlauf" 1 "mindestens_1x_Ueberlauf"; +VAL_ 795 ESP_QBit_Wegimp_VA 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 795 ESP_HDC_Geschw_Farbe 0 "Standard_Farbe" 1 "abweichende_Farbe"; +VAL_ 795 ESP_Off_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 795 ESP_HDC_Regelgeschw 0 "nicht_verbaut" 125 "HDC_Standby" 126 "Init" 127 "Fehler"; +VAL_ 795 ESP_BKV_Warnung 0 "keine_Anzeige" 1 "keine_Bremskraftverstaerkung"; +VAL_ 817 MFL_Lokalaktiv 0 "war_nicht_lokal_aktiv" 1 "war_lokal_aktiv"; +VAL_ 817 MFL_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 817 MFL_Paddle_Verbau 0 "verbaut" 1 "nicht_verbaut"; +VAL_ 817 MFL_Tastencode_1 0 "Key_Released__No_Key" 1 "Context_Menu" 2 "Menu_Up__Next_Screen" 3 "Menu_Down__Previous_Screen" 4 "Up" 5 "Down" 6 "Up__Down_ThumbWheel" 7 "OK__ThumbWheel_Button" 8 "Cancel__Escape" 9 "Main_Menu" 10 "Side_Menu_left" 11 "Side_Menu_right" 12 "FAS_Menu" 13 "Left__Right_ThumbWheel" 14 "FAS_Menu_ThumbWheel" 16 "Volume_Up" 17 "Volume_Down" 18 "Volume_Up__Down_ThumbWheel" 19 "Volume_ThumbWheel_Button" 20 "Audio_Source" 21 "Arrow_A_Up__Right" 22 "Arrow_A_Down__Left" 23 "Arrow_B_Up__Right" 24 "Arrow_B_Down__Left" 25 "PTT__PushToTalk" 26 "PTT_Cancel" 27 "Route_Info" 28 "Hook" 29 "Hang_Up" 30 "Off_Hook" 31 "Light_On__Off" 32 "Mute" 33 "Joker1" 34 "Joker2" 35 "View" 36 "Arrow_A_Up__Down_ThumbWheel" 37 "Lenkradheizung" 38 "Rekuperation" 39 "Tube_Toggle" 40 "DRS_Drag_Reduction_System" 41 "Stopwatch_Start_Stop" 42 "Stopwatch_Nextlap" 100 "MAP" 101 "MAP_Boost" 102 "Turn_signal_left" 103 "Turn_signal_right" 104 "Turn_signal_off" 105 "Flashlight" 106 "Highbeam" 107 "Washer_button" 108 "Wiper_button_left" 109 "Wiper_button_right" 110 "Wiper_button_cancel" 111 "Exhaust_Sound" 112 "Drive_Select_button" 113 "Sport_button" 114 "ESP_Drift_Selection_ThumbWheel" 115 "PTT_special_vehicle" 116 "TravelAssist" 117 "Launch_Control" 118 "Drift_Mode_Button_Increase" 119 "Drift_Mode_Button_Decrease" 120 "Drift_Mode_Button_Select" 121 "Drive_Mode_Button_Increase" 122 "Drive_Mode_Button_Decrease" 123 "Drive_Mode_Button_Select" 124 "E_Boost_Button_Increase" 125 "E_Boost_Button_Decrease" 126 "E_Boost_Button_Select" 127 "PerformanceHybridButton_Increase" 128 "PerformanceHybridButton_Decrease" 129 "EV_Mode_Button" 130 "HUD_Button" 131 "PASM_Wheel" 132 "PASM_Button" 133 "PTV_Wheel" 134 "PTV_Button" 135 "TC_ESC_Wheel" 136 "TC_ESC_Button" 240 "Startup_Reset" 241 "Initialization"; +VAL_ 817 MFL_Tastencode_2 0 "Key_Released__No_Key" 1 "Context_Menu" 2 "Menu_Up__Next_Screen" 3 "Menu_Down__Previous_Screen" 4 "Up" 5 "Down" 6 "Up__Down_ThumbWheel" 7 "OK__ThumbWheel_Button" 8 "Cancel__Escape" 9 "Main_Menu" 10 "Side_Menu_left" 11 "Side_Menu_right" 12 "FAS_Menu" 13 "Left__Right_ThumbWheel" 14 "FAS_Menu_ThumbWheel" 16 "Volume_Up" 17 "Volume_Down" 18 "Volume_Up__Down_ThumbWheel" 19 "Volume_ThumbWheel_Button" 20 "Audio_Source" 21 "Arrow_A_Up__Right" 22 "Arrow_A_Down__Left" 23 "Arrow_B_Up__Right" 24 "Arrow_B_Down__Left" 25 "PTT__PushToTalk" 26 "PTT_Cancel" 27 "Route_Info" 28 "Hook" 29 "Hang_Up" 30 "Off_Hook" 31 "Light_On__Off" 32 "Mute" 33 "Joker1" 34 "Joker2" 35 "View" 36 "Arrow_A_Up_Right_Down_Left_ThumbWheel" 37 "Lenkradheizung" 38 "Rekuperation" 39 "Tube_Toggle" 40 "DRS_Drag_Reduction_System" 41 "Stopwatch_Start_Stop" 42 "Stopwatch_Nextlap" 100 "MAP" 101 "MAP_Boost" 102 "Turn_signal_left" 103 "Turn_signal_right" 104 "Turn_signal_off" 105 "Flashlight" 106 "Highbeam" 107 "Washer_button" 108 "Wiper_button_left" 109 "Wiper_button_right" 110 "Wiper_button_cancel" 111 "Exhaust_Sound" 112 "Drive_Select_button" 113 "Sport_button" 114 "ESP_Drift_Selection_ThumbWheel" 115 "PTT_special_vehicle" 116 "TravelAssist" 117 "Launch_Control" 118 "Drift_Mode_Button_Increase" 119 "Drift_Mode_Button_Decrease" 120 "Drift_Mode_Button_Select" 121 "Drive_Mode_Button_Increase" 122 "Drive_Mode_Button_Decrease" 123 "Drive_Mode_Button_Select" 124 "E_Boost_Button_Increase" 125 "E_Boost_Button_Decrease" 126 "E_Boost_Button_Select" 127 "PerformanceHybridButton_Increase" 128 "PerformanceHybridButton_Decrease" 129 "EV_Mode_Button" 130 "HUD_Button" 131 "PASM_Wheel" 132 "PASM_Button" 133 "PTV_Wheel" 134 "PTV_Button" 135 "TC_ESC_Wheel" 136 "TC_ESC_Button" 240 "Startup_Reset" 241 "Initialization"; +VAL_ 817 MFL_Eventcode_1 0 "W_no_event____T_no_event" 1 "W_1_Tick_up__T_pressed_normal" 2 "W_2_Ticks_up__T_touched" 3 "W_3_Ticks_up__T_double_click_nor" 4 "W_4_Ticks_up__T_long_press_nor_1" 5 "W_5_Ticks_up__T_long_press_nor_2" 6 "W_6_Ticks_up__T_long_press_nor_3" 7 "W_7_Ticks_up" 9 "W_7_Ticks_dn__T_pressed_strong" 10 "W_6_Ticks_dn" 11 "W_5_Ticks_dn__T_double_click_str" 12 "W_4_Ticks_dn__T_long_press_str_1" 13 "W_3_Ticks_dn__T_long_press_str_2" 14 "W_2_Ticks_dn__T_long_press_str_3" 15 "W_1_Tick_dn"; +VAL_ 817 MFL_Eventcode_2 0 "W_no_event____T_no_event" 1 "W_1_Tick_up__T_pressed_normal" 2 "W_2_Ticks_up__T_touched" 3 "W_3_Ticks_up__T_double_click_nor" 4 "W_4_Ticks_up__T_long_press_nor_1" 5 "W_5_Ticks_up__T_long_press_nor_2" 6 "W_6_Ticks_up__T_long_press_nor_3" 7 "W_7_Ticks_up" 9 "W_7_Ticks_dn__T_pressed_strong" 10 "W_6_Ticks_dn" 11 "W_5_Ticks_dn__T_double_click_str" 12 "W_4_Ticks_dn__T_long_press_str_1" 13 "W_3_Ticks_dn__T_long_press_str_2" 14 "W_2_Ticks_dn__T_long_press_str_3" 15 "W_1_Tick_dn"; +VAL_ 817 MFL_Marke 0 "VW" 1 "Audi" 2 "Seat" 3 "Skoda" 4 "VW_Nutzf" 5 "Bugatti" 6 "Lamborghini" 7 "Bentley" 8 "Rolls Royce" 9 "Quattro" 10 "kein_Hersteller_1" 11 "kein_Hersteller_2" 12 "kein_Hersteller_3" 13 "kein_Hersteller_4" 14 "Ford" 15 "Porsche"; +VAL_ 817 MFL_Tip_Down 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 817 MFL_Tip_Up 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 817 MFL_SatModul_links_Err 0 "kein_Fehler" 1 "Fehler"; +VAL_ 817 MFL_SatModul_rechts_Err 0 "kein_Fehler" 1 "Fehler"; +VAL_ 817 MFL_LR_HZG_Status 0 "inaktiv" 1 "aktiv"; +VAL_ 817 MFL_LR_HZG_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Signalhorn 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 817 MFL_Signalhorn_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Tip_links_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Tip_rechts_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Taste_links_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Taste_rechts_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_ECU_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Response_Err 0 "normal" 1 "Fehler"; +VAL_ 850 Parken_SM_03_MUX 0 "MUX_Gruppe_Punktinfo_0" 1 "MUX_Gruppe_Punktinfo_1" 2 "MUX_Gruppe_Punktinfo_2" 3 "MUX_Gruppe_Punktinfo_3" 4 "MUX_Gruppe_Punktinfo_4" 5 "MUX_Gruppe_Punktinfo_5" 6 "MUX_Gruppe_Punktinfo_6"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_00 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_01 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_02 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_03 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_04 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_05 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_06 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 869 NVEM_Pilot_Info 0 "Init" 1 "keine_Einschraenkung" 2 "Veto_1" 3 "Veto_2"; +VAL_ 869 NVEM_P_Generator_Status 0 "gefiltert" 1 "ungefiltert"; +VAL_ 869 BEM_P_Generator 255 "Fehler"; +VAL_ 869 BEM_n_LLA 0 "keine_Erhoehung" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; +VAL_ 869 BEM_Anf_KL 0 "keine Anforderung" 1 "Anforderung KÃŧhlerlÃŧfter Ansteuerung"; +VAL_ 869 BEM_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; +VAL_ 869 BEM_Batt_Ab 0 "verbunden" 1 "nicht_verbunden"; +VAL_ 869 BEM_Hybrid_Info 0 "keine_Einschraenkung_durch_Energiemanagement" 1 "Motorstart_ueber_12V_Starter_nur_bei_0kmh_moeglich" 2 "kein_Motorstart_ueber_12V_Starter_nach_el_Fahrtbetrieb" 3 "Systemfehler"; +VAL_ 869 NVEM_Red_KL 0 "Init" 1 "Abschaltung_KL" 2 "Reduzierung_KL"; +VAL_ 869 NVEM_Freilauf_Info 0 "Freilauf_freigegeben" 1 "Weiches_Veto_uebertippbar" 2 "Hartes_Veto_Abbruch" 3 "Freilauf_Anforderung"; +VAL_ 869 BEM_HYB_DC_uMinLV 254 "Init" 255 "Fehler"; +VAL_ 870 BM_ZV_auf 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_ZV_zu 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_DWA_ein 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_DWA_Alarm 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Crash 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Panik 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Not_Bremsung 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_GDO 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Warnblinken 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Taxi_Notalarm 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Telematik 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_links 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_rechts 0 "inaktiv" 1 "aktiv"; +VAL_ 870 Blinken_li_Fzg_Takt 0 "Blinker_links_ausgeschaltet" 1 "Blinker_links_eingeschaltet"; +VAL_ 870 Blinken_re_Fzg_Takt 0 "Blinker_rechts_ausgeschaltet" 1 "Blinker_rechts_eingeschaltet"; +VAL_ 870 Blinken_li_Kombi_Takt 0 "Blinkerkontrolllampe_links_ausgeschaltet" 1 "Blinkerkontrolllampe_links_eingeschaltet"; +VAL_ 870 Blinken_re_Kombi_Takt 0 "Blinkerkontrolllampe_rechts_ausgeschaltet" 1 "Blinkerkontrolllampe_rechts_eingeschaltet"; +VAL_ 870 BM_NBA_n_codiert_n_aktiv 0 "codiert_AND_kein_Fehler" 1 "nicht_codiert_OR_Fehler_erkannt"; +VAL_ 870 BM_NBA_Status 0 "NBA_nicht_aktiv" 1 "BRL_Dunkelphase" 3 "BRL_Hellphase"; +VAL_ 870 BM_WBT_Beleuchtung 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_HD_Oeffnung_angelernt 0 "keine_Quittierung" 1 "Quittierung"; +VAL_ 870 BM_Autobahn 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Rollenmodus_Blinken 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Recas 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Wischblinken 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Telematik_Abbruchgrund 0 "Init" 1 "speed_out_of_range" 2 "defect" 3 "clamp_s_on" 4 "clamp_15_on" 5 "door_open" 6 "engine_hood_open" 7 "trunk_open" 8 "convertible_top_not_locked" 9 "horn_activated_by_user" 10 "Higher_Prioritiy_Function_active" 11 "Central_Lock_status_changed" 12 "Request_Dropped_by_Requester" 13 "Service_Duration_Expired" 14 "not_possible_due_to_coding" 15 "no_reason_or_unknown_timeout"; +VAL_ 870 BM_PiloPa 0 "PiloPa_Blinkerquittierung_inaktiv" 1 "PiloPa_Blinkerquittierung_aktiv"; +VAL_ 870 DWA_Alarmquelle 0 "kein_Ausloesegrund" 1 "Tuerkontakt_Fahrertuer" 2 "Tuerkontakt_Beifahrertuer" 3 "Tuerkontakt_hinten_links" 4 "Tuerkontakt_hinten_rechts" 5 "Motorhaubenkontakt_vorne" 6 "Kofferraum_hinten" 7 "Masseschleife_der_Heckscheibe" 8 "Innenraumueberwachung" 9 "Alarm_durch_Noteinstieg" 10 "Sounder" 11 "Neigungssensor" 12 "TSG_FT_am_CAN_Bus" 13 "TSG_BT_am_CAN_Bus" 14 "TSG_HFS_am_CAN_Bus" 15 "TSG_HBFS_am_CAN_Bus" 16 "Klemme_15" 17 "Klemme_15sig" 18 "frei" 19 "Anhaengerueberwachung" 20 "Scheinwerferueberwachung_links" 21 "Scheinwerferueberwachung_rechts" 22 "Handschuhkasten" 23 "Verdeckueberwachung" 24 "OBD_Alarm" 25 "Power_on_Reset" 30 "Init" 31 "Fehler"; +VAL_ 888 GNSS_Ortung_Hoehe 4094 "Init" 4095 "Fehler"; +VAL_ 891 GNSS_UTC_Zeit 0 "Init"; +VAL_ 891 GNSS_Empfaenger_Status 0 "Backup_Mode" 1 "Live"; +VAL_ 891 GNSS_GPS_in_Nutzung 0 "unbenutzt" 1 "benutzt"; +VAL_ 891 GNSS_GLONASS_in_Nutzung 0 "unbenutzt" 1 "benutzt"; +VAL_ 891 GNSS_Empfangbare_Satelliten 0 "Init" 31 "31_oder_mehr"; +VAL_ 891 GNSS_Sichtbare_Satelliten 0 "Init" 31 "31_oder_mehr"; +VAL_ 891 GNSS_Genutzte_Satelliten 0 "Init" 31 "31_oder_mehr"; +VAL_ 916 WBA_Fahrstufe_02 0 "Zwischenstellung_keine_Position" 1 "Position_P" 2 "Position_R" 3 "Position_N" 4 "Position_D" 5 "Position_S" 6 "Position_M_Tippfunktion" 7 "Kurzzeit_M" 8 "Position_E" 9 "Position_MS" 10 "Position_S_Plus" 11 "Position_MS_Plus" 12 "Position_Offroad" 13 "Position_B"; +VAL_ 916 WBA_ZielFahrstufe 0 "keine_Gangempfehlung_kein_Gang_eingelegt" 1 "Pfeil_nach_S" 2 "Pfeil_nach_D" 3 "Pfeil_nach_M" 4 "Pfeil_nach_E"; +VAL_ 916 WBA_GE_Warnung_02 0 "keine_Anzeige" 1 "Fehlereskalationsstufe_I" 2 "Fehlereskalationsstufe_II" 3 "Weiterfahrt_nur_eingeschraenkt_moeglich__Kein_R_Gang" 4 "Getriebefehler_Weiterfahrt_nur_in_D_moeglich__P_bei_Motor_aus" 5 "Wegrollgefahr__P_nicht_moeglich" 6 "Paddlenotbetrieb_Schema+Warnung" 7 "Paddlenotbetrieb_Schema" 8 "Geschwindigkeitsbegrenzung_Notlauf" 9 "Fehlereskalationsst_o_Einschr" 10 "Fehlereskalationsstufe_v_Limit" 11 "Parksperre_Infostufe" 12 "Parksperre_Warnstufe_I" 13 "Parksperre_Warnstufe_II"; +VAL_ 916 WBA_eing_Gang_02 0 "keine_Ganganzeige" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Gang_9" 10 "Funktion_Ganganzeigeunterdrueckung" 11 "Gang_10"; +VAL_ 916 WBA_GE_Texte 0 "keine_Anzeige" 1 "zum_Einlegen_einer_Fahrstufe_Fussbremse_betaetigen__ShiftLock_Information" 2 "zum_Einlegen_von_R_N_D_Fussbremse_betaetigen_und_Motor_starten" 3 "Wegrollgefahr_bitte_P_einlegen" 4 "Achtung_Zeitueberschreitung_P_wird_eingelegt" 5 "Wiederanmeldeprozedur_Bremse_betaetigen" 6 "P_nur_im_Stillstand_moeglich" 7 "Rennstart_aktiv"; +VAL_ 916 WBA_Segeln_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 916 WBA_Schaltschema 0 "kein_Schaltschema" 1 "xxxD(S)" 2 "xxxD_S" 3 "xxxS(D)" 4 "xxxS_D" 5 "xxxM(D)" 6 "xxxM_D" 7 "xxxM(S)" 8 "xxxM_S" 9 "xxxE(D)" 10 "xxxE_D" 11 "xxxE(S)" 12 "xxxE_S" 13 "xxxE(M)" 14 "xxxE_M"; +VAL_ 916 WBA_GE_Zusatzwarnungen 0 "keine_Anzeige" 1 "Getriebeueberhitzung_Warnstufe_I" 2 "Getriebeueberhitzung_Warnstufe_II" 3 "Getriebefehler_Bitte_anhalten_und_P_einlegen"; +VAL_ 916 GE_Sollgang 0 "keine_Empfehlung" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Gang_9" 11 "Gang_10"; +VAL_ 916 GE_Tipschaltempf_verfuegbar 0 "nicht_verfuegbar" 1 "verfuegbar"; +VAL_ 916 WBA_GE_Texte_02 0 "Keine_Anzeige" 1 "Fahrtrichtungswechsel_nur_nach_Stillstandt" 2 "Ladestecker_gesteckt" 3 "zusaetzlicher_Service_erforderlich" 4 "eLaunch_Aktiv" 5 "eLaunch_nicht_moeglich" 6 "WH_S_nicht_moeglich_Offroad" 7 "WH_S_nicht_moeglich_RangeMode"; +VAL_ 916 WBA_GE_Texte_03 0 "init" 1 "LC_not_available" 2 "LCperformance_not_possible" 3 "LCperformance_possible" 4 "LCperformance_armed" 5 "LCperformance_preparation" 6 "LCperformance_launch" 7 "LCperformance_aborted" 8 "LCsmoke_not_possible" 9 "LCsmoke_possible" 10 "LCsmoke_armed" 11 "LCsmoke_launch" 12 "LCsmoke_aborted" 15 "Fehler"; +VAL_ 916 WBA_Blinken 0 "kein_WBA_Blinken" 1 "WBA_Blinken"; +VAL_ 916 GE_Wiederstart_Anz_Std 0 "keine_Anzeige" 1 "Standard_Wiederstartgrund"; +VAL_ 916 GE_Stoppverbot_Anz_01 0 "keine_Anzeige" 1 "Temperaturbedingung"; +VAL_ 916 GE_Stoppverbot_Anz_02 0 "keine_Anzeige" 1 "Drucksensorausfall"; +VAL_ 916 GE_Stoppverbot_Anz_03 0 "keine_Anzeige" 1 "Grundeinstellung"; +VAL_ 916 GE_Stoppverbot_Anz_04 0 "keine_Anzeige" 1 "Demontagestellung"; +VAL_ 916 GE_Stoppverbot_Anz_05 0 "keine_Anzeige" 1 "Eingeschraenkte_Fahrfunktion_Notlauf_Liegenbleiber"; +VAL_ 916 GE_Stoppverbot_Anz_06 0 "keine_Anzeige" 1 "Stoppverbot_ueber_Applikation"; +VAL_ 916 GE_Stoppverbot_Anz_07 0 "keine_Anzeige" 1 "Schaltung_aktiv"; +VAL_ 916 GE_Stoppverbot_Anz_Std 0 "keine_Anzeige" 1 "Standard_Stoppvetogrund"; +VAL_ 919 LDW_Gong 1 "Chime" 2 "Beep" 0 "None"; +VAL_ 919 LDW_Texte 8 "laneAssistTakeOver" 4 "laneAssistTakeOverUrgent" 0 "none"; +VAL_ 949 KL_Drehz_Anh 0 "keine_Anhebung" 1 "Drehzahlanhebung_vom_Motor_angefordert"; +VAL_ 949 KL_Vorwarn_Komp_ein 0 "Init" 1 "Vorwarnung_Kompressor_ein"; +VAL_ 949 KL_AC_Schalter 0 "aus" 1 "ein"; +VAL_ 949 KL_Komp_Moment_alt 1 "veraltet_bzw_Ermittlung_des_Moments_nicht_moeglich__zB_keine_Drehzahl_kein_Kaeltemitteldruck"; +VAL_ 949 KL_Vorwarn_Zuheizer_ein 0 "keine_Vorwarnung" 1 "Vorwarnung_Zuheizer_ein"; +VAL_ 949 KL_Zustand 0 "Aus" 1 "Ein"; +VAL_ 949 KL_Kompressorkupplung_linear 253 "volle_Ansteuerung" 254 "Init__nicht_bedient"; +VAL_ 949 KL_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 949 KL_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 949 KL_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 949 KL_T_Charge 0 "Taster_nicht_betaetigt" 1 "Taster_betaetigt"; +VAL_ 949 KL_Last_Kompr 255 "Fehler"; +VAL_ 949 KL_Spannungs_Anf 0 "keine_Anforderung" 1 "Anforderung_Stufe_1" 2 "Anforderung_Stufe_2" 3 "Anforderung_Stufe_3"; +VAL_ 949 KL_Thermomanagement 0 "keine_Freigabe_TMM__max_Heizbedarf" 1 "kleine_Freigabe_TMM" 2 "mittlere_Freigabe_TMM" 3 "volle_Freigabe_TMM__kein_Heizbedarf"; +VAL_ 949 KL_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; +VAL_ 949 KL_Freilauf_Info 0 "Freilauf_freigegeben" 1 "Uebergang_in_Freilauf_unzulaessig" 2 "Freilauf_nicht_freigegeben_Abbruch" 3 "Freilauf_Anforderung"; +VAL_ 949 KL_Anf_KL 255 "Fehler"; +VAL_ 949 KL_el_Zuheizer_Stufe 0 "Aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; +VAL_ 949 KL_Ausstattung_Klima 0 "Heizung_elektrisch" 1 "Klimamanuell_elektrisch" 2 "Climatic__1_Zone" 3 "Climatronic__1_Zone" 4 "Climatronic__2_Zonen" 5 "Climatronic__3_Zonen" 6 "Climatronic__4_Zonen" 7 "reserviert"; +VAL_ 949 KL_Variante_Standheizung 0 "Wasserstandheizung_60_min_Laufzeit" 1 "Luftstandheizung_120_min_Laufzeit" 2 "Wasserstandheizung_120_min_Laufzeit" 3 "Wasser_und_Luftstandheizung_120_min_Laufzeit"; +VAL_ 958 MO_StartStopp_Status 0 "System_in_diesem_KL15_Zyklus_nicht_verfuegbar" 1 "System_aktiv_keine_Freigabe_durch_StartStop_Koordinator" 2 "System_aktiv_alle_Freigaben_liegen_vor" 3 "System_aktiv_mindestens_eine_Freigabe_fehlt"; +VAL_ 958 MO_StartStopp_Wiederstart 0 "Wiederstart_inaktiv" 1 "Wiederstart_aktiv"; +VAL_ 958 MO_StartStopp_Motorstopp 0 "Motor_Stop_inaktiv" 1 "Motor_Stop_aktiv"; +VAL_ 958 MO_Freig_Reku 0 "Rekuperations-Modus aus" 1 "Empfehlung Spannungsanhebung" 2 "Empfehlung Spannungsabsenkung" 3 "Rekuperationsmodus aktiv, Spannungsvariation nicht notwendig"; +VAL_ 958 MO_Kl_75 0 "Aus" 1 "Ein"; +VAL_ 958 MO_Kl_50 0 "aus" 1 "KL50_ein_Startausfuehrung_Fahrer"; +VAL_ 958 MO_Gangposition 0 "Gang_N" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Automat_P" 10 "Automat_Vorwaerts_S" 11 "Automat_Vorwaerts_D/E" 12 "Zwischenstellung" 13 "Gang_R" 14 "Istgang_nicht_definiert" 15 "Fehler"; +VAL_ 958 MO_StartStopp_Fahrerwunsch 0 "Init" 1 "Stoppverbot_durch_Fahrer" 2 "Stoppfreigabe_durch_Fahrer" 3 "Stoppanforderung_durch_Fahrer"; +VAL_ 958 MO_HYB_Fahrbereitschaft 0 "keine_Fahrbereitschaft" 1 "Fahrbereitschaft"; +VAL_ 958 MO_Ext_E_Fahrt_aktiv 0 "Rueckmeldung_E_Taster_aus" 1 "Rueckmeldung_E_Taster_ein"; +VAL_ 958 MO_Fahrer_bremst 0 "kein_Bremsen" 1 "Bremse_betaetigt"; +VAL_ 958 MO_QBit_Fahrer_bremst 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 958 MO_BLS 0 "kein_Bremsen" 1 "Bremse_betaetigt"; +VAL_ 958 MO_Konsistenz_Bremsped 0 "Bremspedalinformation_plausibel" 1 "Bremspedalinformation_unplausibel"; +VAL_ 958 MO_KomFehler_ESP 0 "kein_Fehler" 1 "Fehler"; +VAL_ 958 MO_Klima_Eingr 0 "kein Eingriff" 1 "Klimakompressor ausschalten" 2 "Klimakompressor Leistungsreduzierung" 3 "Klimakompressor aufgrund der Heissleuchtenvorwarnung ausschalten"; +VAL_ 958 MO_Aussp_Anlass 0 "Anlasser_darf_angesteuert_werden" 1 "Anlasser_ausspuren__Ansteuerung_nicht_moeglich"; +VAL_ 958 MO_Freig_Anlass 0 "Start_nicht_zulaessig" 1 "Startfreigabe"; +VAL_ 958 MO_Kuppl_schalter 0 "Schalter_sagt_ausgekuppelt" 1 "Schalter_sagt_eingekuppelt"; +VAL_ 958 MO_Interlock 0 "Interlockschalter_nicht_betaetigt" 1 "Interlockschalter_betaetigt"; +VAL_ 958 MO_Motor_laeuft 0 "Motor_laeuft_nicht" 1 "Motor_laeuft_autark_und_stabil_und_darf_mechanisch_belastet_werden"; +VAL_ 958 MO_Kickdown 0 "kein_Kickdown" 1 "Kickdown"; +VAL_ 958 MO_QBit_KL_75 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 958 MO_EKlKomLeiRed 0 "keine_Leistungsbegr" 1 "Leistungsbegr_75" 2 "Leistungsbegr_50" 3 "Leistungsbegr_25"; +VAL_ 958 MO_Handshake_STH 0 "keine EKP-Ansteuerung durch STH-Anforderung" 1 "EKP-Ansteuerung durch STH-Anforderung"; +VAL_ 958 MO_BKV_Unterdruckwarnung 0 "Unterdruckhaushalt_iO" 1 "Unterdruckhaushalt_niO"; +VAL_ 958 MO_Freigabe_Segeln 0 "Segelbetrieb_nicht_freigegeben" 1 "Segelbetrieb_freigegeben"; +VAL_ 958 MO_PTC_Status 0 "nicht_unterstuetzt" 1 "Stufe_0" 2 "Stufe_1" 3 "Stufe_2" 4 "Stufe_3" 7 "PTC_am_BCM"; +VAL_ 958 MO_QBit_Gangposition 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 958 MO_Signalquelle_Gangposition 0 "Sensorsignal" 1 "Modellsignal"; +VAL_ 958 MO_Remotestart_Betrieb 0 "MSG_nicht_bereit_fuer_RS_Betrieb" 1 "MSG_bereit_fuer_oder_im_RS_Betrieb"; +VAL_ 958 MO_Remotestart_moeglich 0 "Remotestart_nicht_moeglich" 1 "Remotestart_moeglich"; +VAL_ 958 MO_FMAus_aktiv 0 "inaktiv" 1 "Segeln_mit_Motor_aus_aktiv"; +VAL_ 958 MO_FMAus_Startvariante 0 "kein_Motorstart" 1 "Motorstart_elektrischer_Starter" 2 "GetriebeAnschleppstart" 3 "GetriebeNotAnschleppstart"; +VAL_ 958 MO_BMS_NV_Anf_stuetzen 0 "nicht_notwendig" 1 "notwendig"; +VAL_ 958 MO_Zylinderabschaltung 0 "Vollmotorbetrieb_VMB" 1 "Uebergang_HMB_in_VMB" 2 "Uebergang_VMB_in_HMB" 3 "Halbmotorbetrieb_HMB"; +VAL_ 958 MO_HYB_VM_aktiv 0 "VM_nicht_aktiv" 1 "VM_aktiv"; +VAL_ 958 MO_StartVorauss_erfuellt 0 "Signal_nicht_bedient" 1 "StartVorauss_nicht_ueberpruefbar" 2 "StartVorauss_nicht_erfuellt" 3 "StartVorauss_erfuellt"; +VAL_ 960 RSt_Fahrerhinweise 0 "Init" 1 "Fahreruebernahme_Hinweis_ZAT_Automat_ohne_Gong" 2 "Fahreruebernahme_Hinweis_ZAT_Automat_mit_Gong" 3 "Fahreruebernahme_Hinweis_ZAT_Handschalter_ohne_Gong" 4 "Fahreruebernahme_Hinweis_ZAT_Handschalter_mit_Gong" 5 "Fahreruebernahme_Hinweis_ZAS_Automat_ohne_Gong" 6 "Fahreruebernahme_Hinweis_ZAS_Automat_mit_Gong" 7 "Fahreruebernahme_Hinweis_ZAS_Handschalter_ohne_Gong" 8 "Fahreruebernahme_Hinweis_ZAS_Handschalter_mit_Gong" 9 "RemoteStart_aktiv_ohne_Gong" 10 "RemoteStart_aktiv_mit_Gong" 11 "void" 12 "void" 13 "void" 14 "void" 15 "void"; +VAL_ 960 ZAS_Kl_S 0 "aus" 1 "S_Kontakt_ein"; +VAL_ 960 ZAS_Kl_15 0 "aus" 1 "ein"; +VAL_ 960 ZAS_Kl_X 0 "aus" 1 "ein"; +VAL_ 960 ZAS_Kl_50_Startanforderung 0 "aus" 1 "KL50_ein_Startwunsch_Fahrer"; +VAL_ 960 BCM_Remotestart_Betrieb 0 "kein_RS_Betrieb" 1 "RS_Betrieb"; +VAL_ 960 ZAS_Kl_Infotainment 0 "inaktiv" 1 "aktiv"; +VAL_ 960 BCM_Remotestart_KL15_Anf 0 "inaktiv" 1 "aktiv"; +VAL_ 960 BCM_Remotestart_MO_Start 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 960 KST_Warn_P1_ZST_def 0 "nicht_defekt" 1 "defekt"; +VAL_ 960 KST_Warn_P2_ZST_def 0 "nicht_defekt" 1 "defekt"; +VAL_ 960 KST_Fahrerhinweis_1 0 "inaktiv" 1 "aktiv"; +VAL_ 960 KST_Fahrerhinweis_2 0 "inaktiv" 1 "aktiv"; +VAL_ 960 BCM_Ausparken_Betrieb 0 "kein_Betrieb" 1 "Ausparkvorgang_aktiv"; +VAL_ 960 KST_Fahrerhinweis_4 0 "inaktiv" 1 "aktiv"; +VAL_ 960 KST_Fahrerhinweis_5 0 "inaktiv" 1 "aktiv"; +VAL_ 960 KST_Fahrerhinweis_6 0 "inaktiv" 1 "aktiv"; +VAL_ 967 MO_Kuehlerluefter_MUX 0 "Kuehlerluefter_1" 1 "Kuehlerluefter_2"; +VAL_ 967 MO_Kuehlerluefter_1 126 "Init" 127 "Fehler"; +VAL_ 967 MO_Kuehlerluefter_2 126 "Init" 127 "Fehler"; +VAL_ 967 MO_EFLEX_Lampe 0 "Lampe_aus" 1 "Lampe_ein" 2 "Lampe_blinkend" 3 "Lampe_blinkend_mit_Akustik"; +VAL_ 967 MO_KJS_nicht_bereit 0 "kein_Fehler" 1 "Fehler"; +VAL_ 967 MO_ITM_Warnung_Pumpe 0 "keine_Warnung" 1 "ITM_Warnung"; +VAL_ 967 WIV_Anzeige_aktiv 0 "Anzeige aus" 1 "WIV Anzeige aktiv"; +VAL_ 967 WIV_Oelmin_Warn 0 "in_Ordnung" 1 "Warnung"; +VAL_ 967 WIV_Sensorfehler 0 "in_Ordnung" 1 "Sensor_defekt"; +VAL_ 967 WIV_Schieflage 0 "Fahrzeug_gerade" 1 "Fahrzeug_in_Schieflage"; +VAL_ 967 MO_Zustand_HWP 0 "HWP_nicht_schaltbar" 1 "HWP_foerdert_nicht" 2 "HWP_foerdert" 3 "reserviert"; +VAL_ 967 OLEV_Systemstoerung 0 "ÖŦsystem i.O." 1 "SystemstÃļrung ÖŦsystem"; +VAL_ 967 MO_Oelwarnung_max 0 "keine_Warnung" 1 "Warnfall_aktiv"; +VAL_ 967 WIV_Oelsystem_aktiv 0 "Anzeige_aus" 1 "Anzeige_aktiv"; +VAL_ 967 WIV_nicht_betriebswarm 0 "Motor_warm" 1 "Motor_nicht_betriebswarm"; +VAL_ 967 WIV_Ueberfuell_Warn 0 "in_Ordnung" 1 "Ueberfuellwarnung"; +VAL_ 967 WIV_laufender_Motor 0 "Messung_moeglich" 1 "Messung_nicht_moeglich"; +VAL_ 967 MO_E_Warnungen 0 "keine_Anzeige" 1 "Fehler_Elektrosystem_Anhalten" 2 "Fehler_Elektrosystem_Werkstatt" 3 "Elektrosystem_ueberhitzt_Stopp" 4 "Fehler_Hybridsystem_Anhalten" 5 "Fehler_Hybridsystem_Werkstatt" 6 "Fehler_Wasserstoffsystem_Anhalte" 7 "Fehler_Wasserstoffsystem_Werksta" 8 "reserviert_keine_Anzeige" 9 "reserviert_keine_Anzeige" 10 "reserviert_keine_Anzeige" 11 "reserviert_keine_Anzeige" 12 "reserviert_keine_Anzeige" 13 "reserviert_keine_Anzeige" 14 "reserviert_keine_Anzeige" 15 "reserviert_keine_Anzeige"; +VAL_ 967 MO_Text_Motorstart 0 "keine_Anzeige" 1 "Motor_im_Stoppbetrieb" 2 "StartStopp_sicherheitsbedingt_deaktiviert" 3 "System_fordert_Wiederstart" 4 "Aufforderung_Motorstart" 5 "Motorlauf_noetig" 6 "Motorlaufwarnung" 9 "Unerwuenschter_Motorstillstand" 10 "Motorstart_nicht_moeglich" 11 "Fehler_Kupplungsschalter" 12 "Motor_startet" 13 "Kupplung_betaetigen" 14 "Waehlhebel_in_PN_Position" 15 "Bremse_treten"; +VAL_ 967 MO_E_Texte 0 "keine_Anzeige" 1 "Batterie_fast_leer" 2 "Ladestecker_nicht_fahrbereit" 3 "VM_Betrieb_erforderlich" 4 "Batterie_laedt_Nicht_ausschalten" 5 "Bitte_Bremse_treten" 6 "manueller_Neustart_erforderlich" 7 "Stopp_Fahrzeug_nicht_abschleppen" 8 "kein_Neustart_Haube_nicht_oeffnen" 9 "Motorstart_im_naechsten_Zyklus" 10 "VM_erforderlich_EVMode_abwaehlen" 11 "laengerer_VMBetrieb_Bordbuch" 12 "Tank_leer_VM_nicht_verfuegbar" 13 "Bitte_warten_Motor_startet" 14 "kein_Start_Batterietemperatur" 15 "Ende_elektrische_Reichweite_erreicht"; +VAL_ 967 WIV_Oeldyn_avl 0 "Oeldyn_nicht_vorhanden" 1 "Oeldyn_vorhanden"; +VAL_ 967 OLEV_Oelstand_nicht_vorhanden 0 "ÖŦstand vorhanden" 1 "ÖŦstand nicht vorhanden"; +VAL_ 967 MO_Systemlampe 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_OBD2_Lampe 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_Heissleuchte 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_Partikel_Lampe 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_RedFahrleistung_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 967 WIV_Oelstand_nicht_vorhanden 0 "ÖŦstand vorhanden" 1 "ÖŦstand nicht vorhanden"; +VAL_ 967 WIV_nachfuellanzeige_ein 0 "keine_Nachfuellanzeige" 1 "Nachfuellanzeige"; +VAL_ 967 WIV_Ueberfuell_deaktiv 0 "Ueberfuellwarnung_am_Kombi_aktiv" 1 "Ueberfuellwarnung_am_Kombi_deaktiv"; +VAL_ 967 WIV_Unterfuell_Warn 0 "in_Ordnung" 1 "Unterfuellwarnung"; +VAL_ 967 MO_Tankdeckel_Lampe 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_Text_Tankdeckelwarn 0 "kein_Text" 1 "Anzeige_Text_Tankdeckelwarnung_im_Kombi"; +VAL_ 967 MO_Vorglueh_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 967 WIV_Oeldr_Warn_Motor 0 "keine_Warnung" 1 "niedrige_Oeldruckstufe_nicht_erreicht"; +VAL_ 967 MO_E_Mode 0 "keine_Anzeige" 1 "E_Mode_passiv" 2 "E_Mode_aktiv" 3 "E_Mode_inaktiv_nicht_verfuegbar" 4 "E_Mode_aktiv_nicht_verfuegbar" 5 "reserviert_keine_Anzeige" 6 "reserviert_keine_Anzeige" 7 "reserviert_keine_Anzeige"; +VAL_ 974 HFS_Tuer_geoeffnet 0 "geschlossen" 1 "offen"; +VAL_ 974 HFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 974 HFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 974 HFS_Heckrollotaster_betaetigt 0 "keine_Verfahranweisung_in_Richtung_Hoch" 1 "In_Richtung_Hoch_Verfahren"; +VAL_ 974 HFS_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; +VAL_ 974 HFS_Unlock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_Lock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; +VAL_ 974 HFS_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_S_HBFS_AutoHoch 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; +VAL_ 974 HFS_FH_S_HBFS_AutoTief 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; +VAL_ 974 HFS_FH_S_HBFS_ManHoch 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; +VAL_ 974 HFS_FH_S_HBFS_ManTief 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; +VAL_ 974 HFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 974 HFS_SAD_Schalter 0 "nicht_betaetigt" 5 "AUF_manuell" 6 "AUF_automatik" 7 "ZU_manuell" 8 "ZU_automatik" 13 "nicht_verfuegbar" 14 "Init" 15 "Fehler"; +VAL_ 974 HFS_FH_S_ManHoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_S_AutoHoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_S_ManTief 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_S_AutoTief 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_Bew_hoch 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_FH_Bew_tief 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; +VAL_ 974 HFS_FH_Block 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_FH_Thermo 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_UEKB_aktiviert 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; +VAL_ 974 HFS_FH_normiert 0 "inaktiv" 1 "aktiv"; +VAL_ 974 ASW_Warnung_aktiv_HFS 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 974 HFS_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehhilfe_aktiv"; +VAL_ 974 HFS_Seitenrollo_hoch 1 "Seitenrollo_in_Bewegung_hoch"; +VAL_ 974 HFS_Seitenrollo_tief 1 "Seitenrollo_in_Bewegung_tief"; +VAL_ 974 HFS_Status_KiSi 0 "inaktiv" 1 "aktiv"; +VAL_ 974 SSR_HFS_Pos_Unten 0 "SSR_Oben" 1 "SSR_Unten"; +VAL_ 974 HFS_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; +VAL_ 974 HFS_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; +VAL_ 974 MTHFS_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 MTHFS_Pos1 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 MTHFS_Pos2 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 MTHFS_Pos3 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_MRollo_Schalter 0 "nicht_betaetigt" 1 "ZU_manuell" 2 "ZU_automatik" 3 "AUF_manuell" 4 "AUF_automatik" 5 "nicht_verfuegbar" 6 "Init" 7 "Fehler"; +VAL_ 974 HFS_Lock_Taster_inv 0 "Lock Taster betä´§it" 1 "Lock Taster nicht betä´Šgt"; +VAL_ 974 HFS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; +VAL_ 974 HFS_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; +VAL_ 974 HFS_TCR_Mode_aktiv 0 "TCR_Mode_deaktiv" 1 "TCR_Mode_aktiv"; +VAL_ 975 HBFS_Tuer_geoeffnet 0 "geschlossen" 1 "offen"; +VAL_ 975 HBFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 975 HBFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 975 HBFS_Heckrollotaster_betaetigt 0 "keine_Verfahranweisung_in_Richtung_Hoch" 1 "In_Richtung_Hoch_Verfahren"; +VAL_ 975 HBFS_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; +VAL_ 975 HBFS_Unlock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_Lock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; +VAL_ 975 HBFS_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_S_HFS_AutoHoch 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; +VAL_ 975 HBFS_FH_S_HFS_AutoTief 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; +VAL_ 975 HBFS_FH_S_HFS_ManHoch 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; +VAL_ 975 HBFS_FH_S_HFS_ManTief 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; +VAL_ 975 HBFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 975 HBFS_SAD_Schalter 0 "nicht_betaetigt" 5 "AUF_manuell" 6 "AUF_automatik" 7 "ZU_manuell" 8 "ZU_automatik" 13 "nicht_verfuegbar" 14 "Init" 15 "Fehler"; +VAL_ 975 HBFS_FH_S_ManHoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_S_AutoHoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_S_ManTief 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_S_AutoTief 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_Bew_hoch 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_FH_Bew_tief 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; +VAL_ 975 HBFS_FH_Block 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_FH_Thermo 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_UEKB_aktiviert 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; +VAL_ 975 HBFS_FH_normiert 0 "inaktiv" 1 "aktiv"; +VAL_ 975 ASW_Warnung_aktiv_HBFS 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 975 HBFS_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehhilfe_aktiv"; +VAL_ 975 HBFS_Seitenrollo_hoch 1 "Seitenrollo_in_Bewegung_hoch"; +VAL_ 975 HBFS_Seitenrollo_tief 1 "Seitenrollo_in_Bewegung_tief"; +VAL_ 975 HBFS_Status_KiSi 0 "inaktiv" 1 "aktiv"; +VAL_ 975 SSR_HBFS_Pos_Unten 0 "SSR_Oben" 1 "SSR_Unten"; +VAL_ 975 HBFS_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; +VAL_ 975 HBFS_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; +VAL_ 975 MTHBFS_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 MTHBFS_Pos1 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 MTHBFS_Pos2 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 MTHBFS_Pos3 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_MRollo_Schalter 0 "nicht_betaetigt" 1 "ZU_manuell" 2 "ZU_automatik" 3 "AUF_manuell" 4 "AUF_automatik" 5 "nicht_verfuegbar" 6 "Init" 7 "Fehler"; +VAL_ 975 HBFS_Lock_Taster_inv 0 "Lock Taster betä´§it" 1 "Lock Taster nicht betä´Šgt"; +VAL_ 975 HBFS_Status_KiSi_inv 0 "aktiv" 1 "inaktiv"; +VAL_ 975 HBFS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; +VAL_ 975 HBFS_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; +VAL_ 975 HBFS_TIG_betaetigt_schliessen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_Tuer_geoeffnet 0 "Init" 1 "Tuer offen"; +VAL_ 976 FT_verriegelt 0 "Init" 1 "verriegelt"; +VAL_ 976 FT_gesafet 0 "Init" 1 "gesafet"; +VAL_ 976 FT_Schluesselschalter_auf 0 "Init" 1 "Schluesselschalter_auf_betaetigt"; +VAL_ 976 FT_Schluesselschalter_zu 1 "Schluesselschalter zu betaetigt"; +VAL_ 976 FT_Unlock_Taster 0 "Init" 1 "Unlock_Taster_betaetigt"; +VAL_ 976 FT_Lock_Taster 0 "Init" 1 "Lock_Taster_betaetigt"; +VAL_ 976 FT_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; +VAL_ 976 FT_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_IRUE_Taste 0 "Init" 1 "IRUE_Taste_betaetigt"; +VAL_ 976 FT_HD_Taste 0 "Init" 1 "Heckdeckel_oeffnen"; +VAL_ 976 FT_TD_Taste_Fehler 0 "iO" 1 "defekt"; +VAL_ 976 FT_TD_Taste 1 "Tankdeckelentriegelungs Taster gedrÃŧckt"; +VAL_ 976 SSR_Temp_Freigabe 0 "SSR_Deaktiviert" 1 "SSR_Freigegeben"; +VAL_ 976 FT_HD_Taste_2 0 "Taste_nicht_gedrueckt" 1 "Taste_gedrueckt"; +VAL_ 976 FT_TSG_hinten_verbaut 0 "nicht verbaut" 1 "verbaut"; +VAL_ 976 FT_Sp_Blk_def 0 "iO" 1 "defekt"; +VAL_ 976 FT_FH_S_ManHoch 0 "Init" 1 "FH_Schalter_man_hoch_betaetigt"; +VAL_ 976 FT_FH_S_AutoHoch 0 "Init" 1 "FH_Schalter_auto_hoch_betaetigt"; +VAL_ 976 FT_FH_S_ManTief 0 "Init" 1 "FH_Schalter_man_tief_betaetigt"; +VAL_ 976 FT_FH_S_AutoTief 0 "Init" 1 "FH_Schalter_auto_tief_betaetigt"; +VAL_ 976 FT_FH_Bew_hoch 0 "Init" 1 "FH_in_Bewegung_hoch"; +VAL_ 976 FT_FH_Bew_tief 0 "Init" 1 "FH_in_Bewegung_tief"; +VAL_ 976 FT_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; +VAL_ 976 FT_FH_Block 0 "Init" 1 "Fenster_Block"; +VAL_ 976 FT_FH_Thermo 0 "Init" 1 "Thermoschutz_aktiv"; +VAL_ 976 FT_UEKB_aktiviert 0 "Init" 1 "UEKB_aktiv"; +VAL_ 976 ASW_HMI_defekt 0 "iO" 1 "defekt"; +VAL_ 976 FT_FH_normiert 0 "Init" 1 "Fenster_normiert"; +VAL_ 976 FT_Schliesstaster 1 "Schliesstaster_betaetigt"; +VAL_ 976 FT_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehilfe_aktiv"; +VAL_ 976 FT_SP_ausgerastet 0 "Init" 1 "Spiegel_ausgerastet"; +VAL_ 976 FT_SP_lr_aktiv 0 "Init" 1 "Spiegel_xAchse_aktiv"; +VAL_ 976 FT_SP_ht_aktiv 0 "Init" 1 "Spiegel_yAchse_aktiv"; +VAL_ 976 ASW_wakeup 0 "Sleep" 1 "Wakeup"; +VAL_ 976 FT_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; +VAL_ 976 FT_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; +VAL_ 976 FT_Kisi_li_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 976 FT_Kisi_re_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 976 FT_Kisi_Taster_li 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_Kisi_Taster_re 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_BFS_Fond_Freigabe 0 "Init" 1 "Freigabe_fuer_Fondbedienung_BFS"; +VAL_ 976 FT_Kisi_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 976 FT_Daemmglas 0 "Normalglas_verbaut" 1 "Daemmglas_verbaut"; +VAL_ 976 FT_SP_Heizung_Status 0 "Init" 1 "Status_Spiegelheizung_ein"; +VAL_ 976 ASW_Warnung_aktiv_FS 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 976 FT_FH_Pos_oben 1 "Scheibe oben (nach Absenken auf Position)"; +VAL_ 976 FT_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; +VAL_ 976 FT_SWA_Taster 0 "Taster_nicht_betaetigt" 1 "Taster_betaetigt"; +VAL_ 976 SWA_HMI_Diagnose 0 "kein_Fehler_erkannt" 1 "Fehler_Taster_erkannt" 2 "Fehler_LED_erkannt" 3 "Fehler_LED_und_Taster_erkannt"; +VAL_ 976 FS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; +VAL_ 980 BH_Blinker_li 0 "nicht_betaetigt" 1 "Blinkerhebel_Pos_li_betaetigt"; +VAL_ 980 BH_Blinker_re 0 "nicht_betaetigt" 1 "Blinkerhebel_Pos_re_betaetigt"; +VAL_ 980 BH_Lichthupe 0 "nicht_betaetigt" 1 "Blinkerhebel in Richtung Lichthupe betaetigt"; +VAL_ 980 BH_Fernlicht 0 "nicht_betaetigt" 1 "Blinkerhebel_in_Richtung_Fernlicht_betaetigt"; +VAL_ 980 WH_Tipwischen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 980 WH_Intervall 0 "aus" 1 "Wischerhebel in Stellung Intervall"; +VAL_ 980 WH_WischerStufe1 0 "aus" 1 "Wischerhebel in Stufe Wischen 1"; +VAL_ 980 WH_WischerStufe2 0 "aus" 1 "Wischerhebel in Stufe Wischen 2"; +VAL_ 980 WH_Frontwaschen 0 "aus" 1 "Wischerhebel in Stellung Wisch Wasch vorne"; +VAL_ 980 WH_Heckintervall 0 "nicht_betaetigt" 1 "Wischerhebel in Stellung Heckintervall"; +VAL_ 980 WH_Heckwaschen 0 "nicht_betaetigt" 1 "Wischerhebel in Stellung Wisch Wasch hinten"; +VAL_ 980 WH_Intervallstufen 0 "Init / Default" 1 "Intervallstufe 1" 5 "Intervallstufe 2" 9 "Intervallstufe 3" 13 "Intervallstufe 4" 15 "Fehler"; +VAL_ 980 FAS_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 980 FAS_Taster_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 SMLS_Hupe 0 "nicht_betaetigt" 1 "Hupe_gedrueckt"; +VAL_ 980 LRH_On_Off 0 "LRH_aus__keine Anzeige" 1 "LRH_aus" 2 "LRH_ein" 3 "Fehler"; +VAL_ 980 LRH_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 980 SMLS_P_verriegelt_plausibel 0 "unplausibel" 1 "plausibel"; +VAL_ 980 WH_SRA 0 "SRA_Aus" 1 "SRA_Ein"; +VAL_ 980 WH_Wischer_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 BH_Blinker_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 SMLS_PTT 0 "nicht_betaetigt" 1 "PTT_gedrueckt"; +VAL_ 980 WH_Tipwischen_lang 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 981 BCM1_Kurvenlicht_links_Anf 0 "linkes_Kurvenlicht/Abbiegelicht_durch_BCM1_nicht_angesteuert" 1 "linkes_Kurven/Abbiegelicht_durch_BCM1_angesteuert"; +VAL_ 981 BCM1_Kurvenlicht_rechts_Anf 0 "rechtes_Kurvenlicht/Abbiegelicht_durch_BCM1_nicht_angesteuert" 1 "rechtes_Kurvenlicht/Abbiegelicht_durch_BCM1_angesteuert"; +VAL_ 981 BCM1_Standlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Abblendlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Fernlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Nebellicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Parklicht_li_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Parklicht_re_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Nebelschluss_Ahg_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Nebelschluss_Fzg_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Schlusslicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM_Rueckfahrlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_angefordert"; +VAL_ 981 BCM1_Signaturlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; +VAL_ 981 BCM1_Umfeldleuchten_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; +VAL_ 981 BCM1_Tagfahrlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Regenlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Autobahnlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Touristen_Licht_Anf 0 "Licht_nicht_angefordert" 1 "Anforderung von Touristenlicht"; +VAL_ 981 BCM1_CH_aktiv 0 "Inaktiv" 1 "Aktiv"; +VAL_ 981 BCM1_LH_aktiv 0 "Inaktiv" 1 "Aktiv"; +VAL_ 981 BCM1_Gleitende_Leuchtw_Anf 0 "Aus" 1 "Ein"; +VAL_ 981 BCM1_GLW_Fernlicht_Anf 0 "Aus" 1 "Ein"; +VAL_ 981 BCM1_Adaptive_Lichtvert_Anf 0 "Aus" 1 "Ein"; +VAL_ 981 BCM1_FoD_Sperrung_WiBli 0 "Freigabe_WiBli" 1 "Sperrung_WiBli" 2 "Init"; +VAL_ 981 BCM1_FOD_Sperrung_Animationen_HL 0 "Freigabe_Animationen" 1 "Sperrung_Animationen" 2 "Init"; +VAL_ 981 BCM1_Animationssperrung 0 "keine_Sperrung" 1 "Sperrung"; +VAL_ 981 BCM1_CH_LH_aktiv 0 "Comming_Home_Bzw._Leaving_Home_nicht_aktiv" 1 "Comming Home bzw. Leaving Home aktiv"; +VAL_ 981 BCM1_Allwetterlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; +VAL_ 981 BCM1_Schlusslicht_Signatur 0 "keine_Signatur" 1 "Signatur_1" 2 "Signatur_2" 3 "Signatur_3" 4 "Signatur_4" 5 "Signatur_5" 6 "Signatur_6" 7 "Signatur_7" 8 "Signatur_8" 9 "Signatur_9" 10 "Signatur_10" 11 "Signatur_11" 12 "Signatur_12" 13 "Signatur_13" 14 "Signatur_14" 15 "Signatur_15"; +VAL_ 982 BCM2_Bremsl_durch_ECD 0 "Bremslicht_ist_aus" 1 "Bremslicht_durch_ECD_aktiv"; +VAL_ 982 LH_Aussenlicht_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Standlicht_H_aktiv 1 "Standlicht hinten aktiv"; +VAL_ 982 LH_Parklicht_HL_aktiv 0 "nicht aktiv" 1 "Parklicht hinten links aktiv"; +VAL_ 982 LH_Parklicht_HR_aktiv 0 "nicht aktiv" 1 "Parklicht hinten rechts aktiv"; +VAL_ 982 LH_Bremslicht_H_aktiv 1 "Bremslicht hinten aktiv"; +VAL_ 982 LH_Nebelschluss_aktiv 0 "nicht aktiv" 1 "aktiv"; +VAL_ 982 LH_Rueckfahrlicht_aktiv 0 "nicht aktiv" 1 "aktiv"; +VAL_ 982 LH_Blinker_HL_akt 1 "Blinker hinten links aktiv"; +VAL_ 982 LH_Blinker_HR_akt 1 "Blinker hinten rechts aktiv"; +VAL_ 982 LH_Blinker_li_def 0 "OK" 1 "Blinker hinten links defekt"; +VAL_ 982 LH_Bremsl_li_def 0 "OK" 1 "mindestens ein Bremslicht hinten links defekt"; +VAL_ 982 LH_Schlusslicht_li_def 0 "OK" 1 "mindestens ein Schlusslicht hinten links defekt"; +VAL_ 982 LH_Rueckf_li_def 0 "OK" 1 "RÃŧckfahrlicht hinten links defekt"; +VAL_ 982 LH_Nebel_li_def 0 "OK" 1 "Nebelschlusslicht hinten links defekt"; +VAL_ 982 LH_Schluss_Brems_Nebel_li_def 0 "iO" 1 "defekt"; +VAL_ 982 LH_Schluss_Brems_Nebel_re_def 0 "iO" 1 "defekt"; +VAL_ 982 LH_Zusatzschlussl_def 0 "OK" 1 "mindestens_ein_Zusatzschlusslicht_defekt"; +VAL_ 982 LH_Schluss_Brems_li_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Schluss_Nebel_li_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_SL_BRL_BLK_li_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Brems_Blk_li_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Diag_Status_re_def 0 "OK" 1 "Aussenlict_Diagnose_Systemstoerung_rechts"; +VAL_ 982 LH_Diag_Status_li_def 0 "OK" 1 "Aussenlicht_Diagnose_Systemstoerung_links"; +VAL_ 982 LH_Diag_LED_li_def 0 "OK" 1 "Heckleuchte_links_defekt"; +VAL_ 982 LH_Diag_LED_re_def 0 "OK" 1 "Heckleuchte_rechts_defekt"; +VAL_ 982 LH_Blinker_re_def 0 "OK" 1 "Blinker hinten rechts defekt"; +VAL_ 982 LH_Bremsl_re_def 0 "OK" 1 "mindestens ein Bremslicht hinten rechts defekt"; +VAL_ 982 LH_Schlusslicht_re_def 0 "OK" 1 "mindestens ein Schlusslicht hinten rechts defekt"; +VAL_ 982 LH_Rueckf_re_def 0 "OK" 1 "RÃŧckfahrlicht hinten rechts defekt"; +VAL_ 982 LH_Nebel_re_def 0 "OK" 1 "Nebelschlusslicht hinten rechts defekt"; +VAL_ 982 LH_Schluss_Brems_mi_def 0 "OK" 1 "Defekt"; +VAL_ 982 LH_Schluss_Brems_re_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Schluss_Nebel_re_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_SL_BRL_BLK_re_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Brems_Blk_re_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Kennzl_def 0 "OK" 1 "Kennzeichenbeleuchtung hinten defekt"; +VAL_ 982 LH_3_Bremsl_def 0 "OK" 1 "hochgesetzte Bremsleuchte defekt"; +VAL_ 982 LH_Nebel_mi_def 0 "OK" 1 "Nebelschlusslicht hinten Mitte defekt"; +VAL_ 982 LH_Rueckf_mi_def 0 "OK" 1 "RÃŧckfahllicht Mitte defekt"; +VAL_ 982 LH_Schlusslicht_mi_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Bremsl_mi_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Bremsl_li_ges_def 0 "OK" 1 "Alle Bremslichter hinten links defekt"; +VAL_ 982 LH_Bremsl_re_ges_def 0 "OK" 1 "Alle Bremslichter hinten rechts defekt"; +VAL_ 988 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; +VAL_ 988 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; +VAL_ 997 FT_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 997 FT_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; +VAL_ 997 FT_Lock_Taster_02 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 997 FT_Schluesselschalter_zu_02 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 997 FT_BFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 997 FT_HBFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 997 FT_HFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 997 FT_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; +VAL_ 997 FT_SP_Heizung_ein 0 "Aus" 1 "Ein"; +VAL_ 997 FT_Kisi_Taster_li_02 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 997 FT_Kisi_Taster_re_02 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 997 FT_TD_Taste_Status 0 "kein_Fehler" 1 "Kurzschluss_nach_Minus" 2 "Kurzschluss_nach_Plus" 3 "Leitungsunterbrechung"; +VAL_ 997 FT_TCR_Mode_aktiv 0 "TCR_Mode_deaktiv" 1 "TCR_Mode_aktiv"; +VAL_ 997 FS_Push_Tuergriff 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 1004 TSK_State 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault"; +VAL_ 1122 PSD_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "Fehlerwert"; +VAL_ 1122 PSD_Vorgaenger_Segment_ID 0 "keine Segmentinformation vorhanden" 1 "Fehlerwert"; +VAL_ 1122 PSD_Strassenkategorie 0 "Rest_Feldweg_Schotterweg_Privatweg" 1 "OrtsstraßĨ" 2 "KreisstraßĨ" 3 "LandstraßĨ" 4 "BundesstraßĨ" 5 "Autobahn" 7 "Init"; +VAL_ 1122 PSD_Endkruemmung 255 "Gerade"; +VAL_ 1122 PSD_Endkruemmung_Vorz 0 "Kruemmung_positiv" 1 "Kruemmung_negativ"; +VAL_ 1122 PSD_Idenditaets_ID 0 "keine_Segment_Informationen_vorhanden" 1 "Fehler"; +VAL_ 1122 PSD_ADAS_Qualitaet 0 "keine_ADAS_Qualitaet" 1 "ADAS_Qualitaet"; +VAL_ 1122 PSD_wahrscheinlichster_Pfad 0 "Pfad_mit_geringer_Wahrscheinlichkeit" 1 "wahrscheinlichster_Pfad"; +VAL_ 1122 PSD_Geradester_Pfad 0 "nicht_geradester_PFad" 1 "geradester_Pfad"; +VAL_ 1122 PSD_Fahrspuren_Anzahl 0 "Einbahnstrasse_in_falsche_Richtung" 1 "eine_Fahrspur" 2 "zwei_Fahrspuren" 3 "drei_Fahrspuren" 4 "vier_Fahrspuren" 5 "fuenf_Fahrspuren" 6 "sechs_Fahrspuren" 7 "mehr_als_sechs_Fahrspuren"; +VAL_ 1122 PSD_Bebauung 0 "ausserhalb_bebauten_Gebietes" 1 "innerhalb_bebauten_Gebietes"; +VAL_ 1122 PSD_Segment_Komplett 0 "Segment_Attribute_nicht_komplett" 1 "Segment_Attribute_komplett"; +VAL_ 1122 PSD_Rampe 0 "Strasse_mit_Gegenverkehr" 1 "Auffahrt_Einbahnstr" 2 "Abfahrt_Einbahnstr" 3 "Einbahnstrasse"; +VAL_ 1122 PSD_Anfangskruemmung 255 "Gerade"; +VAL_ 1122 PSD_Anfangskruemmung_Vorz 0 "positiv" 1 "negativ"; +VAL_ 1122 PSD_Abzweigerichtung 0 "rects_abzweigende_Strasse" 1 "links_abzweigende_Strasse"; +VAL_ 1123 PSD_Pos_Segment_ID 0 "keine Position gegeben" 1 "Fehlerwert"; +VAL_ 1123 PSD_Pos_Standort_Eindeutig 0 "mehrdeutiger_Standort" 1 "eindeutiger_Standort"; +VAL_ 1123 PSD_Pos_Fehler_Laengsrichtung 0 "Init" 1 "< 2m" 2 "< 5m" 3 "< 10m" 4 "< 20m" 5 "< 50m" 6 "> 50m" 7 "Off-Road"; +VAL_ 1123 PSD_Pos_Fahrspur 0 "unbekannt" 1 "Erste_Spur_von_rechts" 2 "Zweite_Spur_von_rechts" 3 "Dritte_Spur_von_rechts" 4 "Vierte_Spur_von_rechts" 5 "Fuenfte_Spur_von_rechts" 6 "Sechte_Spur_von_rechts" 7 "Siebte_oder_weitere_Spur_von_rechts"; +VAL_ 1123 PSD_Attribut_Segment_ID_05 0 "keine_Segment_Information" 1 "Fehler"; +VAL_ 1123 PSD_Attribut_1_ID 0 "keine_Information"; +VAL_ 1123 PSD_Attribut_2_ID 0 "keine_Information"; +VAL_ 1123 PSD_Attribute_Komplett_05 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_06_Mux 0 "Init"; +VAL_ 1124 PSD_Sys_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig"; +VAL_ 1124 PSD_Sys_Geschwindigkeit_Einheit 0 "km/h" 1 "mph"; +VAL_ 1124 PSD_Sys_Verkehrsrichtung 0 "Rechtsverkehr" 1 "Linksverkehr"; +VAL_ 1124 PSD_Sys_Geometrieguete 0 "Geringe_Guete" 1 "tbd" 2 "tbd" 3 "Hohe_Guete"; +VAL_ 1124 PSD_Sys_Mapmatchingguete 0 "geringe_Guete" 1 "res" 2 "res" 3 "hohe_Guete"; +VAL_ 1124 PSD_Sys_Alter_Karte 0 "kleiner_1_Jahr" 1 "1_Jahr" 2 "2_Jahre" 3 "3_Jahre" 4 "4_Jahre" 5 "5_Jahre" 6 "6_Jahre" 7 "groesser_7_Jahre"; +VAL_ 1124 PSD_Sys_Zielfuehrung 0 "Zielfuehrung nicht aktiv" 1 "Zielfuehrung aktiv"; +VAL_ 1124 PSD_Sys_US_State 0 "kein_US_State" 1 "Alabama" 2 "Alaska" 3 "Arkansas" 4 "Arizona" 5 "California" 6 "Colorado" 7 "Conneticut" 8 "District_of_Columbia" 9 "Delaware" 10 "Florida" 11 "Georgia" 12 "Hawaii" 13 "Idaho" 14 "Illinois" 15 "Iowa" 16 "Indiana" 17 "Kansas" 18 "Kentucky" 19 "Louisiana" 20 "Massachusetts" 21 "Maryland" 22 "Maine" 23 "Michigan" 24 "Minnesota" 25 "Missouri" 26 "Mississippi" 27 "Montana" 28 "North_Carolina" 29 "North_Dakota" 30 "Nebraska" 31 "Nevada" 32 "New_Hampshire" 33 "New_Jersey" 34 "New_Mexico" 35 "New_York" 36 "Ohio" 37 "Oklahoma" 38 "Oregon" 39 "Pennsylvania" 40 "Puerto_Rico" 41 "Rhode_Island" 42 "South_Carolina" 43 "South_Dakota" 44 "Tennessee" 45 "Texas" 46 "Utah" 47 "Virginia" 48 "Virgin_Islands" 49 "Vermont" 50 "Washington" 51 "Wisconsin" 52 "West_Virginia" 53 "Wyoming"; +VAL_ 1124 PSD_Sys_Quali_verfuegbar 0 "Qualitaetskriterien_nicht_verfuegbar" 1 "Qualitaetskriterien_verfuegbar"; +VAL_ 1124 PSD_Sys_Zielfuehrung_geaendert 0 "Zielfuehrung_nicht_geaendert" 1 "Zielfuehrung_geaendert"; +VAL_ 1124 PSD_Sys_Geometrieguete_erweitert 0 "Init"; +VAL_ 1124 PSD_Attribut_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Attribut_3_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribut_4_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribut_5_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribute_Komplett_06 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_Ges_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig"; +VAL_ 1124 PSD_Ges_Geschwindigkeit 0 "Kein Geschwindigkeitsgebot" 1 "0 km/h < v_max < 5 km/h" 2 "5 km/h < v_max < 10km/h" 3 "10 km/h < v_max < 15 km/h" 4 "15 km/h < v_max < 20 km/h" 5 "20 km/h < v_max < 25 km/h" 6 "25 km/h < v_max < 30 km/h" 7 "30 km/h < v_max < 35 km/h" 8 "35 km/h < v_max < 40 km/h" 9 "40 km/h < v_max < 45 km/h" 10 "45 km/h < v_max < 50 km/h" 11 "50 km/h < v_max < 60 km/h" 12 "60 km/h < v_max < 70 km/h" 13 "70 km/h < v_max < 80 km/h" 14 "80 km/h < v_max < 90 km/h" 15 "90 km/h < v_max < 100 km/h" 16 "100 km/h < v_max < 110 km/h" 17 "110 km/h < v_max < 120 km/h" 18 "120 km/h < v_max < 130 km/h" 19 "130 km/h < v_max < 140 km/h" 20 "140 km/h < v_max < 150 km/h" 21 "150 km/h < v_max < 160 km/h" 22 "160 km/h < v_max" 23 "Geschwindigkeitsgebot aufgehoben" 24 "..0x1F ungÃŧltig"; +VAL_ 1124 PSD_Ges_Typ 0 "Geschw_Klasse_des_Kartendatensuppliers" 1 "Explizit_abgeleiteten_Begrenzung" 2 "Durch_Gesetzg_vorgeg_allgem_Gebot_fuer_uebertr_Rahmenbed" 3 "Init"; +VAL_ 1124 PSD_Ges_Spur_Geschw_Begrenzung 0 "Gebot_fuer_alle_spuren_gueltig"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Gespann 0 "alle Fahrzeuge" 1 "PKW mit Gespann" 2 "LKW, Busse, etc."; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Witter 0 "Witterungsunabh䎧ig" 1 "Näŗŗe, Regen, Niederschlag" 2 "Glä´´e" 3 "Nebel"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Tag_Anf 0 "kein Beginn definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Tag_Ende 0 "kein Ende definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Std_Anf 25 "kein Beginn fÃŧr stundenweise EinschräŽĢungen"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Std_Ende 25 "kein Ende fÃŧr stundenweise EinschräŽĢungen"; +VAL_ 1124 PSD_Ges_Ueberholverbot 0 "kein Üĸerholverbot" 1 "alle Fahrzeuge" 2 "Üĸerholverbot fÃŧr PKW mit Gespann" 3 "Üĸerholverbot fÃŧr LKW, Busse, etc."; +VAL_ 1124 PSD_Ges_Wechselverkehrszeichen 0 "Kein Wechselverkehrszeichen" 1 "Wechselverkehrszeichen links" 2 "Wechselverkehrszeichen rechts" 3 "Wechselverkehrszeichen links und rechts" 4 "Wechselverkerhszeichen Ãŧber der Fahrbahn"; +VAL_ 1124 PSD_Wechselverkehrszeichen_Typ 0 "kein_Wechselverkehrszeichen" 1 "LED_Wechselverkehrszeichen" 2 "nicht_LED_Wechselverkehrszeichen"; +VAL_ 1124 PSD_Ges_Gesetzlich_Kategorie 0 "kein_legales_Verbot" 1 "innerorts" 2 "ausserorts" 3 "Autobahn"; +VAL_ 1124 PSD_Ges_Gesetzlich_Zusatz 0 "kein_Zusatz_zu_legalem_Gebot" 1 "Anhaenger_Klasse_1" 2 "Anhaenger_Klasse_2"; +VAL_ 1124 PSD_Ges_Verkehrszeichen_Quelle 0 "VZA_kein_Onlinedienst" 1 "nur_VZA" 2 "nur_VZO" 3 "VZA_und_VZO"; +VAL_ 1124 PSD_Ges_Attribute_Komplett 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_Baum_Laenge_VZ 0 "Ost" 1 "West"; +VAL_ 1124 PSD_Baum_Breite_VZ 0 "Nord" 1 "Sued"; +VAL_ 1124 PSD_Steigung_1_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Steigung_1_A_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_1_A_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_1_B_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_1_B_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_1_Attribute_kompl 0 "Steigungen_nicht_komplett" 1 "Steigungen_komplett"; +VAL_ 1124 PSD_Steigung_2_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Steigung_2_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_2_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_2_Attribute_kompl 0 "Steigungen_nicht_komplett" 1 "Steigungen_komplett"; +VAL_ 1153 ZR_LoGeWa_Event_Kombiwarnung 0 "Init" 1 "Unfall" 2 "Traktionsverlust" 3 "Panne" 4 "Sichtbehinderung" 5 "Aquaplaning" 6 "EEBL" 7 "SEF_stat" 8 "SEF_dyn_allgemein" 9 "SEF_dyn_vorne" 10 "SEF_dyn_hinten" 11 "SEF_dyn_links" 12 "SEF_dyn_rechts" 13 "Stauende"; +VAL_ 1153 Nav_FoD_Status 0 "Init" 1 "Nav_permanently_available" 2 "FoD_Nav_not_activated" 3 "FoD_Nav_activated" 4 "R4N_Nav_not_activated"; +VAL_ 1153 MIB_Tongenerator_PH_verfuegbar 0 "Tongenerator_nicht_verfuegbar" 1 "Tongenerator_vorne_verfuegbar" 2 "Tongenerator_hinten_verfuegbar" 3 "Tongenerator_gesamt_verfuegbar" 4 "Tongenerator_im_AMP"; +VAL_ 1153 DSSS_Warning 0 "No_Warning" 1 "Red_traffic_light_guidance" 2 "Stop_sign_warning" 3 "Rear_end_collision_avoidance_warning" 4 "Intersection_collision_avoidance_warning_right" 5 "Intersection_collision_avoidance_warning_left" 6 "turn_right_collision_avoidance" 7 "turn_left_collision_avoidance" 8 "pedestrian_crossing_right" 9 "pedestrian_crossing_left" 10 "bicycle_collision_right" 11 "bicycle_collision_left"; +VAL_ 1153 ZR_Kindersicherung_RSE 0 "inaktiv" 1 "aktiv"; +VAL_ 1153 ZR_RSE_aktivieren 0 "inaktiv" 1 "aktiv"; +VAL_ 1153 MMI_SDS_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1153 MU_SecondDisplay 0 "Init" 1 "gueltige_Karte" 2 "ungueltiges_Signal" 3 "Nicht_Verbaut"; +VAL_ 1153 MMI_Telefon_aktiv 0 "Telefongespraech_nicht_aktiv" 1 "Telefongespraech_aktiv"; +VAL_ 1153 MMI_Gurt_Mic_ref 0 "Downlink_inaktiv" 1 "Downlink_aktiv"; +VAL_ 1153 ZR_Sta_Inszenierung 0 "Init" 1 "Inszenierung_deaktiviert" 2 "Inszenierung_Start" 3 "Inszenierung_Stop"; +VAL_ 1153 MMI_Gauges_active 0 "gauges_inactive" 1 "gauges_active"; +VAL_ 1153 ZR_MXB_Manoever_Ansage 0 "keine_Ansage" 1 "Ansage_ohne_Richtung" 2 "Ansage_rechte_Richtung" 3 "Ansage_linke_Richtung"; +VAL_ 1153 ZR_LAPP_Sondermodus_Status 0 "keine_Anforderung" 1 "Sondermodus_aktiv" 2 "Aktivierung_nicht_moeglich"; +VAL_ 1153 MMI_StartStopp_Info 0 "Stoppfreigabe" 1 "Stoppverbot" 2 "Startanforderung" 3 "Fehler"; +VAL_ 1153 ZR_Parken_Sondermodus 0 "Init" 1 "Sondermodus_aktiv" 2 "Sondermodus_nicht_verfuegbar" 3 "WLAN_aus" 4 "WLAN_auscodiert" 15 "keine_WLAN_HW"; +VAL_ 1153 ZR_Rundenbewertung 0 "Bewertung_nicht_aktiv" 1 "langsamer" 2 "gleich_schnell" 3 "schneller" 4 "reserviert" 5 "reserviert" 6 "reserviert" 7 "reserviert" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "Init" 15 "Funktion_nicht_verbaut"; +VAL_ 1153 ZR_Rundenfortschritt 254 "Init" 255 "Funktion_nicht_verbaut"; +VAL_ 1155 Mo_Powermeter_Grenze 4093 "OFF"; +VAL_ 1155 MO_Text_Aktivierung_Antrieb 0 "keine_Anzeige" 1 "Ladestecker_nicht_fahrbereit" 2 "erneute_Aktivierung_erforderlich" 3 "Warten_Antrieb_wird_aktiviert" 4 "zum_Fahren_Bremse_und_Fahrstufe" 5 "h2_Tankklappe_nicht_fahrbereit" 6 "zum_Starten_Bremse_treten" 7 "zum_Starten_Kupplung_treten" 15 "Init"; +VAL_ 1155 MO_Powermeter_Inszenierung_aktiv 0 "keine_Anzeige" 1 "Inszenierung_aktiv"; +VAL_ 1155 MO_Powermeter_Charge_Grenze 1022 "Init" 1023 "Fehler"; +VAL_ 1155 MO_Powermeter_Grenze_strategisch 4094 "Init" 4095 "Fehler"; +VAL_ 1155 MO_Powermeter_untere_E_Grenze 4094 "Init" 4095 "Fehler"; +VAL_ 1155 MO_Powermeter_obere_E_Grenze 4094 "Init" 4095 "Fehler"; +VAL_ 1175 PH_Visualisierung 0 "Aus" 1 "Angefragt" 2 "InAnzeige" 3 "Abgefordert" 6 "Init" 7 "Fehler"; +VAL_ 1175 PDC_Tonausgabe_Front 0 "kein_Ton" 1 "Intervallton_1" 2 "Intervallton_2" 3 "Intervallton_3" 4 "Intervallton_4" 5 "Intervallton_5" 6 "Dauerton" 7 "Fehlerton" 8 "RCTATon"; +VAL_ 1175 PDC_Tonausgabe_Heck 0 "kein_Ton" 1 "Intervallton_1" 2 "Intervallton_2" 3 "Intervallton_3" 4 "Intervallton_4" 5 "Intervallton_5" 6 "Dauerton" 7 "Fehlerton" 8 "Erstwarnton_hinten" 9 "RCTATon"; +VAL_ 1175 PH_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1175 PH_Abschaltursache 0 "keine, bzw. System aktiv" 1 "Abschaltung durch Herausnahme R-Gang" 2 "Abschaltung ueber Geschwindigkeit" 3 "Abschaltung ueber PDC-Taster" 4 "Abschaltung wegen PLA" 5 "Abschaltung durch KL 15 Bit = 0" 6 "tbd." 7 "Fehler-/gestÃļrt Zustand, System noch aktiv"; +VAL_ 1175 PH_Opt_Anzeige_V_ein 0 "optische Anzeige vorne nicht aktiv" 1 "optische Anzeige vorne aktiviert"; +VAL_ 1175 PH_Opt_Anzeige_H_ein 0 "Optische Anzeige aus" 1 "optische Anzeige hinten aktiviert"; +VAL_ 1175 PH_Opt_Anz_V_Hindernis 0 "optische Anzeige vorne meldet kein Hindernis" 1 "optische Anzeige vorne meldet Hindernis im Warnbereich"; +VAL_ 1175 PH_Opt_Anz_H_Hindernis 0 "optische Anzeige hinten meldet kein Hindernis" 1 "optische Anzeige hinten meldet Hindernis im Warnbereich"; +VAL_ 1175 PH_Tongeber_V_aktiv 0 "Tongeber vorne nicht aktiv" 1 "Tongeber vorne aktiv"; +VAL_ 1175 PH_Tongeber_H_aktiv 0 "Tongeber hinten nicht aktiv" 1 "Tongeber hinten aktiv"; +VAL_ 1175 PH_Tongeber_mute 0 "Tongeber nicht stummgeschaltet" 1 "Tongeber stummgeschaltet"; +VAL_ 1175 PH_Anf_Audioabsenkung 0 "Keine_Audioabsenkung" 1 "Anforderung_Audioabsenkung"; +VAL_ 1175 PH_Tongeber_H_verfuegbar 0 "nicht verfÃŧgbar" 1 "verfÃŧgbar"; +VAL_ 1175 PLA_Anf_Aufschaltung_RVC 0 "Keine_RVC_Aufschalteanf" 1 "RVC_Aufschalteanforderung"; +VAL_ 1175 PH_Taster 0 "Taster_nicht_gedrueckt" 1 "Taster_gedrueckt" 2 "reserviert" 3 "Fehler"; +VAL_ 1175 PH_Anf_Verdeck 0 "Verdeckbetrieb_freigegeben" 1 "Verdeckbetrieb_sperren" 2 "reserviert" 3 "reserviert"; +VAL_ 1175 PH_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; +VAL_ 1175 PH_Stoermeldung 0 "keine_Anzeige_kein_Gong" 1 "Textmeldung_PDC_hinten_gestoert_mit_Gong" 2 "Textmeldung_PDC_hinten_gestoert_ohne_Gong" 3 "Textmeldung_PDC_vorn_gestoert_mit_Gong" 4 "Textmeldung_PDC_vorn_gestoert_ohne_Gong" 5 "Textmeldung_PDC_gestoert_mit_Gong" 6 "Textmeldung_PDC_gestoert_ohne_Gong" 7 "Textmeldung_PDC_seitlich_gestoert_mit_Gong" 8 "Textmeldung_PDC_seitlich_gestoert_ohne_Gong"; +VAL_ 1175 PH_defekt 0 "PH aktiv" 1 "PH wurde aufgrund eines Defektes deaktiviert"; +VAL_ 1175 PH_gestoert 0 "PH aktiv" 1 "PH wurde auf Grund einer Stoerung tempraer deaktiviert"; +VAL_ 1175 PH_Systemzustand 0 "Anlage aus" 1 "Anlage durch einlegen R-Gang aktiviert" 2 "Anlage manuell durch Taster aktiviert" 3 "Anlage automatisch aktiviert" 4 "Anlage durch ARA aktiviert" 6 "Init - Initialisierungsphase nach Kl. 15 ein / Reset" 7 "Fehler-/gestÃļrt Zustand, System noch aktiv"; +VAL_ 1175 PH_Display_Kundenwunsch 0 "Anzeige aus" 1 "Grafik" 2 "Rear View" 3 "automatisch"; +VAL_ 1283 HVK_Istmodus_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1283 HVK_TN1_Sollmodus 0 "HV_Off" 1 "HV_On" 2 "reserviert" 3 "Initialisierung"; +VAL_ 1283 HVK_MO_EmSollzustand 0 "HvOff" 1 "HvStbyReq" 2 "HvStbyWait" 3 "HvBattOnReq" 4 "HvBattOnWait" 10 "HvOnIdle" 18 "HvOnDrvReq" 19 "HvOnDrvWait" 20 "HvOnDrvRdy" 28 "HvStepUpReq" 29 "HvStepUpWait" 30 "HvStepUp" 38 "HvStepDownReq" 39 "HvStepDownWait" 40 "HvStepDown" 46 "HvAcChPreReq" 47 "HvAcChPreWait" 48 "HvAcChReq" 49 "HvAcChWait" 50 "HvAcCh" 56 "HvDcChPreReq" 57 "HvDcChPreWait" 58 "HvDcChReq" 59 "HvDcChWait" 60 "HvDcCh" 67 "HvChOffReq" 68 "HvChOffWait" 69 "HvOnIdleReq" 70 "HvOnIdleWait" 96 "HvCpntOffReq" 97 "HvCpntOffWait" 98 "HvBattOffReq" 99 "HvBattOffWait" 109 "HvDcDcFailOffReq" 110 "HvDcDcFail" 119 "HvElmOffReq" 120 "HvElmOff" 126 "HvFailCpntOffReq" 127 "HvFailCpntOffWait" 128 "HvFailBattOffReq" 129 "HvFailBattOffWait" 130 "HvFailBattOff" 138 "HvFailUCtlReq" 139 "HvFailUCtlWait" 140 "HvFailUCtl" 150 "HvEmgcyOff" 255 "Init"; +VAL_ 1283 HVK_BMS_Sollmodus 0 "HV_Off" 1 "HV_On" 3 "AC_Laden_erw" 4 "AC_Laden" 6 "DC_Laden" 7 "Init"; +VAL_ 1283 HVK_DCDC_Sollmodus 0 "Standby" 1 "HV_On_Vorladen" 2 "Tiefsetzen" 3 "Hochsetzen" 4 "Pruefpuls_12V" 7 "Initialisierung"; +VAL_ 1283 HVK_EKK_Sollmodus 0 "Keine_Freigabe" 1 "Freigabe" 2 "Freigabe_ausgesetzt" 7 "Init"; +VAL_ 1283 HVK_HVPTC_Sollmodus 0 "Keine_Freigabe" 1 "Freigabe" 2 "Freigabe_ausgesetzt" 7 "Init"; +VAL_ 1283 HVK_HVLM_Sollmodus 0 "keine_Freigabe" 1 "Freigabe_Lademanager" 2 "Vorladung_AC_Pfad" 7 "Init"; +VAL_ 1283 HVK_HV_Netz_Warnungen 0 "Keine_Warnung" 1 "Warntext_HV_Netz_Anf" 2 "Fehlertext_HV_Netz_Anf" 3 "Warnung_Kein_Wiederstart_moeglich"; +VAL_ 1283 HV_Bordnetz_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1283 HV_Bordnetz_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 1283 HVK_Gesamtst_Spgfreiheit 0 "Funktion_Init__ohne_Funktion" 1 "HV_System_spannungsfrei" 2 "HV_System_nicht_spannungsfrei" 3 "Fehler"; +VAL_ 1283 HVK_AktiveEntladung_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1283 HVK_Iso_Messung_Start 0 "keine_Messung" 1 "Messung_HV_Netz_1" 2 "Messung_HV_Netz_2" 4 "deaktiviert"; +VAL_ 1283 HVK_DCDC_EKK_Sollmodus 0 "aus" 1 "ein" 2 "reserviert" 3 "Init"; +VAL_ 1312 LoGeWa_Event_Kombiwarnung 0 "Init" 1 "Unfall" 2 "Traktionsverlust" 3 "Panne" 4 "Sichtbehinderung" 5 "Aquaplaning"; +VAL_ 1312 AB_Anforderung_eCall 0 "keine_Anforderung" 1 "Anforderung"; +VAL_ 1312 AB_Anprall_Seite_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Rollover 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_FGS 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Front_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Front_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Heck_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Heck_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Wickelklappung_Reihe2_MI 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; +VAL_ 1312 AB_Belegung_VB 0 "nicht_verfuegbar" 1 "Fehler" 2 "nicht_belegt" 3 "belegt"; +VAL_ 1312 AB_Abschaltanf_SIH_BF 0 "Normalbetrieb" 1 "Abschaltung_angefordert"; +VAL_ 1312 AB_Anprall_Seite_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 SC_PAO_Schriftzug_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; +VAL_ 1312 SC_PAO_ON_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; +VAL_ 1312 SC_PAO_OFF_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; +VAL_ 1312 AB_Crashschwere 0 "kein_Ereignis" 1 "Crashschwere_1" 2 "Crashschwere_2" 3 "Crashschwere_3" 4 "Crashschwere_4" 5 "Crashschwere_5" 6 "Crashschwere_2_bis_5" 7 "Fehler"; +VAL_ 1312 AB_Anforderung_USM 0 "keine_Anforderung" 1 "Anforderung"; +VAL_ 1312 AB_Gurtschloss_FA 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_BF 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe2_FA 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe2_MI 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe2_BF 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe3_FA 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe3_MI 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe3_BF 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Sitzpos_Sens_FA 0 "nicht verfÃŧgbar" 1 "Fehler" 2 "Sitz nicht vorne" 3 "Sitz vorne"; +VAL_ 1312 AB_Sitzpos_Sens_BF 0 "nicht verfÃŧgbar" 1 "Fehler" 2 "Sitz nicht vorne" 3 "Sitz vorne"; +VAL_ 1312 AB_Wickelklappung_Reihe2_BF 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; +VAL_ 1312 AB_Wickelklappung_Reihe2_FA 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; +VAL_ 1349 AB_Gurtwarn_Reihe2_FA 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AB_Gurtwarn_Reihe2_BF 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AbstWarn_MV_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; +VAL_ 1349 WarnBrems_Charisma_Status 0 "Init" 1 "verfÃŧgbar" 2 "nicht verfÃŧgbar" 3 "asynchron durch Fahrerwunsch"; +VAL_ 1349 WarnBrems_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1349 AB_Gurtwarn_Reihe2_MI 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AB_Gurtwarn_Reihe3_FA 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AB_Gurtwarn_Reihe3_MI 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AB_Gurtwarn_Reihe3_BF 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 LGI_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; +VAL_ 1349 PreCrash_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; +VAL_ 1349 AB_SBR_hinten_verbau 0 "ohne_SBR_hinten" 1 "mit_SBR_hinten" 2 "nicht_definiert" 3 "Init"; +VAL_ 1349 AWV_Einstellung_System_ASG 0 "deaktiviert" 1 "aktiviert"; +VAL_ 1349 AWV_Einstellung_Warnung_ASG 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; +VAL_ 1349 SC_PreSense_Modus_Warnung_NV 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; +VAL_ 1349 SC_PreSense_Modus_Warnung_MV 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; +VAL_ 1349 SC_PreSense_Modus_System_MV 0 "deaktiviert" 1 "aktiviert"; +VAL_ 1349 SC_PreSense_Modus_System_NV 0 "deaktiviert" 1 "aktiviert"; +VAL_ 1349 SC_PreSense_Modus_System_KAS 0 "deaktiviert" 1 "aktiviert"; +VAL_ 1355 PH_Verschmutzungsmeldung 0 "keine_Anzeige_kein_Gong" 1 "Textmeldung_PDC_hinten_verschmutzt_mit_Gong" 2 "Textmeldung_PDC_hinten_verschmutzt_ohne_Gong" 3 "Textmeldung_PDC_vorn_verschmutzt_mit_Gong" 4 "Textmeldung_PDC_vorn_verschmutzt_ohne_Gong" 5 "Textmeldung_PDC_verschmutzt_mit_Gong" 6 "Textmeldung_PDC_verschmutzt_ohne_Gong" 7 "Textmeldung_PDC_seitlich_verschmutzt_mit_Gong" 8 "Textmeldung_PDC_seitlich_verschmutzt_ohne_Gong"; +VAL_ 1355 PH_Aufschaltursache 0 "Anlage aus" 1 "Anlage durch einlegen R-Gang aktiviert" 2 "Anlage manuell durch Taster aktiviert" 3 "Anlage automatisch aktiviert" 4 "Anlage durch ARA aktiviert" 5 "Rueckwaertsrollen" 6 "Anlage_durch_PLA_aktiviert" 7 "Anlage_durch_IPA_aktiviert" 8 "Anlage_durch_FA_aktiviert" 9 "Anlage_durch_RBF_oder_MA_aktiviert" 10 "Anlage_durch_Smartphone_aktiviert" 11 "Anlage_durch_Jokertaste_aktiviert" 12 "Anlage_durch_Favoritentasten_aktiviert" 13 "Anlage_durch_SideViewTaster_aktiviert" 14 "Anlage_durch_RCTA_aktiviert" 15 "Anlage_durch_KAS_aktiviert" 16 "Anlage_durch_AWC_aktiviert" 30 "Init_Initialisierungsphase_nach_Kl_15_ein_oder_Reset" 31 "Fehler_gestoerter_Zustand_System_noch_aktiv"; +VAL_ 1355 PH_Ton_Ausgabe 0 "Init" 1 "Intervallton_vorne" 2 "Intervallton_hinten" 3 "Dauerton_vorne" 4 "Dauerton_hinten" 5 "Quittierungston" 6 "Reserviert" 7 "Fehler"; +VAL_ 1355 PH_Ton_Pausenlaenge 0 "Init" 1 "Pause_5ms" 2 "Pause_10ms" 3 "Pause_15ms" 100 "Pause_500ms" 101 "Reserviert" 126 "Reserviert" 127 "Fehler"; +VAL_ 1355 PH_Ton_Richtung 0 "vorne" 1 "vorne_rechts" 2 "rechts" 3 "rechts_hinten" 4 "hinten" 5 "hinten_links" 6 "links" 7 "vorne_links"; +VAL_ 1355 PH_Ton_Lautstaerke 0 "Minimallautstaerke" 1 "Lautstaerke_1" 2 "Lautstaerke_2" 3 "Lautstaerke_3" 4 "Lautstaerke_4" 5 "Lautstaerke_5" 6 "Lautstaerke_6" 7 "Maximallautstaerke"; +VAL_ 1355 BCM_WAH_Meldung 0 "Init" 1 "Fehlermeldung_bei_Nichtverfuegbarkeit_mit_Gong" 2 "Fehlermeldung_bei_Nichtverfuegbarkeit_ohne_Gong" 3 "Anzeige_dass_Fahrzeug_erkannt_wurde_und_Funktion_aktiv_ist" 4 "Wiederanfahrhinweis_mit_Gong" 5 "Wiederanfahrhinweis_ohne_Gong"; +VAL_ 1355 PDC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 1355 PDC_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1361 WFS_Schluessel_Fahrberecht 0 "kein authorisierter Schluessel erkannt" 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "digitaler_Schluessel_aktiv"; +VAL_ 1361 WFS_ID_Geb_autorisiert 0 "Schluessel_nicht_authorisiert" 1 "Schluessel authorisiert"; +VAL_ 1361 WFS_ID_Geb_autorisiert_in_Kl15 0 "nicht_authorisiert_in_Kl15" 1 "authorisiert_in_Kl15"; +VAL_ 1361 WFS_ID_Geb_steckt 0 "kein_Schluessel_im_Zuendschloss" 1 "Schluessel steckt im Zuendschloss"; +VAL_ 1361 WFS_Schluessel_Soll 0 "Init"; +VAL_ 1361 WFS_Schluessel_Ist 0 "Init"; +VAL_ 1361 WFS_Safe 0 "Init" 1 "WFS nicht deaktiviert"; +VAL_ 1361 WFS_LZ 0 "nicht def." 1 "LZ 1" 2 "LZ 2" 3 "LZ 3"; +VAL_ 1361 WFS_ELV_authorisiert 0 "ELV_nicht_authorisiert" 1 "ELV_authorisiert"; +VAL_ 1361 WFS_LF_Aktiv 0 "Funktempfang_nicht_aktiv" 1 "LF_Funkempfang_aktiv"; +VAL_ 1361 WFS_Betrieb_Lesespule 0 "keine_Schluesselkomm_Lesespule" 1 "Schluesselkomm_Lesespule"; +VAL_ 1361 WFS_Klemmenfreigabe 0 "keine_Freigabe" 1 "Freigabe"; +VAL_ 1361 WFS_Fahrerhinweise 0 "Keine_Anzeigeanforderung" 1 "Schuessel_Auth_niO" 2 "Notlauf_aktiv" 3 "Schluessel_Kessy_nicht_gefunden"; +VAL_ 1361 WFS_Parken_Status 0 "Limitierung_inaktiv" 1 "Limitierung_aktiv" 2 "Abbruch"; +VAL_ 1411 BCM_FH_Freigabe 1 "Funktionsfreigabe Fensterheber"; +VAL_ 1411 BCM_Komfortfkt_Freigabe 0 "Komfortfunktion gesperrt" 1 "globale Freigabe der Komfortfunktion erteilt"; +VAL_ 1411 BCM_HSK_Freigabe 0 "erlauben" 1 "sperren"; +VAL_ 1411 BCM_Verdeck_Freigabe 0 "Verdeckbetrieb nicht erlaubt" 1 "Verdeckbetrieb erlaubt"; +VAL_ 1411 ZV_verriegelt_intern_ist 1 "Fahrzeug innen verriegelt; Istzustand"; +VAL_ 1411 ZV_verriegelt_extern_ist 1 "Fahrzeug_aussen_verriegelt_Istzustand"; +VAL_ 1411 ZV_verriegelt_intern_soll 1 "Fahrzeug verriegelt intern; Sollzusstand"; +VAL_ 1411 ZV_verriegelt_extern_soll 1 "Fahrzeug verriegelt extern; Sollzusstand"; +VAL_ 1411 ZV_gesafet_extern_ist 1 "Fahrzeug aussen gesafet; Istzustand"; +VAL_ 1411 ZV_gesafet_extern_soll 1 "Fahrzeug_aussen_gesafet_Sollzustand"; +VAL_ 1411 ZV_Einzeltuerentriegelung 1 "Fahrzeug an Einzeltuer entriegelt"; +VAL_ 1411 ZV_Heckeinzelentriegelung 1 "Heckdeckeleinzelentriegelung"; +VAL_ 1411 ZV_FT_offen 0 "FT_geschlossen" 1 "FT_geoeffnet"; +VAL_ 1411 ZV_BT_offen 0 "BT_geschlossen" 1 "BT_geoeffnet"; +VAL_ 1411 ZV_HFS_offen 0 "geschlossen" 1 "offen"; +VAL_ 1411 ZV_HBFS_offen 0 "geschlossen" 1 "offen"; +VAL_ 1411 ZV_HD_offen 1 "Heckdeckel_auf"; +VAL_ 1411 ZV_HS_offen 0 "Heckscheibe_geschlossen" 1 "Heckscheibe auf"; +VAL_ 1411 IRUE_aktiv 0 "unscharf" 1 "scharf"; +VAL_ 1411 DWA_aktiv 0 "unscharf" 1 "scharf"; +VAL_ 1411 HD_Hauptraste 0 "geschlossen" 1 "offen"; +VAL_ 1411 HD_Vorraste 0 "geschlossen" 1 "offen"; +VAL_ 1411 FFB_CarFinder 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1411 FFB_Komfortoeffnen 0 "kein_Komfortoeffnen_empfangen" 1 "Komfortoeffnen ueber Funk empfangen"; +VAL_ 1411 FFB_Komfortschliessen 0 "kein_Komfortschliessen_empfangen" 1 "Komfortschliessen ueber Funk empfangen"; +VAL_ 1411 ZV_Schluessel_Zugang 0 "kein_auth_Schluessel_erkannt" 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "ungueltig_15"; +VAL_ 1411 ZV_SafeFunktion_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 FBS_Warn_Schluessel_Batt 0 "i.O." 1 "defekt"; +VAL_ 1411 ZV_Oeffnungsmodus 0 "globale_Oeffnung" 1 "ZV_mit_Einzeltuerentr" 2 "ZV_individuell_selektiv" 3 "ZV_seitenselektiv"; +VAL_ 1411 HFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1411 HFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 1411 HBFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1411 HBFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 1411 ZV_ist_Zustand_verfuegbar 0 "nicht_verfuegbar" 1 "verfuegbar_alle_TSGs_am_Bus"; +VAL_ 1411 IRUE_Taster_Fkts_LED 0 "LED_aus" 1 "LED_ein"; +VAL_ 1411 ZV_Tankklappe_offen 0 "Tankklappe_geschlossen" 1 "Tankklappe_offen"; +VAL_ 1411 ZV_Rollo_auf 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_Rollo_zu 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_SAD_auf 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_SAD_zu 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 BCM_Tankklappensteller_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 1411 ZV_verriegelt_soll 0 "Init" 1 "nicht_verriegelt" 2 "verriegelt"; +VAL_ 1413 SI_Sammel_SG_Fehler 61 "Reserviert" 62 "Overflow" 63 "ungueltig"; +VAL_ 1413 SI_Diagnose_Aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1413 SI_QRS_Mode 0 "QRS_Messmodus_nicht_aktiv" 1 "QRS_Messmodus_aktiv"; +VAL_ 1413 SI_T_Mode 0 "Transportmodus_nicht_aktiv" 1 "Transportmodus_aktiv"; +VAL_ 1413 SI_NWDF 0 "Ueberwachung_nicht_freigegeben" 1 "Ueberwachung_freigegeben"; +VAL_ 1413 SI_NWDF_gueltig 0 "NWDF_wird_nicht_unterstuetzt" 1 "NWDF_wird_unterstuetzt"; +VAL_ 1413 SI_Sammelfehler 0 "kein_Sammelfehler" 1 "Sammelfehler"; +VAL_ 1413 GW_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler"; +VAL_ 1413 SI_T_Schutz 0 "Transportschutz_nicht_aktiv" 1 "Transportschutz_aktiv"; +VAL_ 1413 SI_BUS_01 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_02 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_03 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_04 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_05 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_06 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_07 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_08 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_09 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_10 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_11 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_12 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_13 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_14 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_15 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_Bus_Identifikation 16 "CAN_Diagnose" 17 "CAN_Antrieb" 18 "CAN_Komfort" 19 "CAN_Infotainment" 20 "CAN_Fahrwerk" 21 "CAN_Extended" 22 "CAN_Hybrid" 23 "CAN_Lade" 24 "CAN_Kombi" 25 "CAN_Komfort_2" 26 "CAN_AFS" 33 "CAN_FahrerAssistenzSysteme" 34 "CAN_Migration" 35 "CAN_Connect" 36 "CAN_AnzeigeBedienung" 37 "CAN_ElectricalVehicle" 40 "CAN_Telematik" 41 "CAN_MFL" 42 "CAN_FahrerAssistenzSysteme_2" 48 "FlexRay_A" 49 "FlexRay_B" 97 "VLAN_FAS" 98 "VLAN_Infotainment" 99 "VLAN_Connect" 100 "VLAN_Komfort" 101 "VLAN_Antrieb" 102 "VLAN_Diagnose" 103 "VLAN_Internet" 104 "VLAN_Gateway" 105 "VLAN_Remote_FC" 106 "VLAN_Connect_2" 107 "VLAN_Licht" 108 "VLAN_Charge" 109 "VLAN_Cockpit" 176 "HCP1_CANFD01" 177 "HCP1_CANFD02" 178 "HCP1_CANFD03" 179 "HCP1_CANFD04" 180 "HCP1_CANFD05" 181 "HCP1_CANFD06" 182 "HCP1_CANFD07" 183 "HCP1_CANFD08" 186 "HCP4_CANFD03" 187 "HCP4_CANFD04" 188 "HCP1_CANFD09" 189 "HCP4_CANFD06" 190 "HCP4_CANFD07" 191 "HCP4_CANFD08" 192 "HCP4_CANFD09" 193 "HCP4_CANFD10" 194 "HCP1_CANFD10" 195 "ICAS1_CANFD2_HCP5_CANFD02" 196 "HCP1_CANFD11" 197 "WU_HCP1_CANFD" 198 "WU_HCP2_1_CANFD" 199 "WU_HCP_2_CANFD" 200 "WU_HCP_3_CANFD" 201 "WU_HCP4_CANFD" 202 "WU_HCP3_CANFD02" 204 "ESC_CANFD" 205 "HCP4_CANFD11" 206 "HCP4_CANFD12" 207 "HCP5_CANFD04" 208 "HCP5_CANFD05" 212 "WU_ConMod_CANFD" 213 "WU_PASD_CANFD"; +VAL_ 1413 SI_CAB 0 "inaktiv" 1 "CAB_01__Tueren" 2 "CAB_02__Anhaenger" 4 "CAB_03__Nightvision" 8 "CAB_04__Sitzverstellung" 16 "CAB_05__Klappen" 32 "CAB_06__Infotainment" 64 "CAB_07__Sub_Infotainment" 128 "CAB_08__Anzeige" 256 "CAB_09__Laden" 512 "CAB_10__Klima" 1024 "CAB_11__FlexRay" 262144 "CAB_19_VLAN_Remote_FC" 524288 "CAB_20_VLAN_Komfort"; +VAL_ 1420 KST_Txt_P_Gang 0 "Aus" 1 "Ein"; +VAL_ 1420 KST_Txt_Panikabschaltung 0 "Aus" 1 "Ein"; +VAL_ 1420 KST_Anf_Klemmenfreigabe_ELV 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1420 KST_Txt_Komfortabschaltung 0 "inaktiv" 1 "aktiv"; +VAL_ 1420 KST_ZAT_betaetigt 0 "Aus" 1 "Ein"; +VAL_ 1420 KST_Unterdr_Zuendungsmeldung 0 "keine_Unterdr_der_Zuendungsmeldung" 1 "Unterdr_der_Zuendungsmeldung_aktiv"; +VAL_ 1420 KST_aut_Abschaltung_Zuendung 0 "Zuendung_wird_bei_Verl_nicht_deaktiviert" 1 "Zuendung_wird_bei_Verl_deaktiviert"; +VAL_ 1420 KST_Anf_ZV_Verriegelung 0 "inaktiv" 1 "aktiv"; +VAL_ 1420 Relais_VoKo_angesteuert 0 "nicht_angesteuert" 1 "angesteuert"; +VAL_ 1420 RSt_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" 6 "Parken_mit_P"; +VAL_ 1440 LS_Helligkeit_IR 254 "Init" 255 "Fehler"; +VAL_ 1440 LS_Helligkeit_FW 1022 "Init" 1023 "Fehler"; +VAL_ 1440 LS_defekt 0 "OK" 1 "defekt"; +VAL_ 1440 LS_Verbau 0 "Init" 1 "Lichtsensor_verbaut"; +VAL_ 1440 RS_Regenmenge 14 "Init" 15 "Fehler"; +VAL_ 1440 RS_Verbau 0 "Init" 1 "Regensensor verbaut"; +VAL_ 1440 RS_Verglasung_schliessen 0 "Verglasung nicht schliessen" 1 "Verglasung schliessen"; +VAL_ 1440 RS_defekt 0 "OK" 1 "defekt"; +VAL_ 1440 RS_Wischergeschwindigkeit 0 "kein Wischen" 1 "42 Huebe/min" 2 "45 Huebe/min" 3 "48 Huebe/min" 4 "51 Huebe/min" 5 "54 Huebe/min" 6 "57 Huebe/min" 7 "60 Huebe/min"; +VAL_ 1440 RLS_Vorfeldhelligkeit_Boost 0 "groesser_24413_Lux" 1 "bis_24413_Lux" 2 "bis_22193_Lux" 3 "bis_20176_Lux" 4 "bis_18342_Lux" 5 "bis_16647_Lux" 6 "bis_15158_Lux" 7 "bis_13780_Lux" 8 "bis_12527_Lux" 9 "bis_11388_Lux" 10 "bis_10353_Lux" 11 "bis_9412_Lux" 12 "bis_8556_Lux" 13 "bis_7778_Lux" 14 "bis_7071_Lux" 15 "bis_6428_Lux"; +VAL_ 1442 BMS_Status_ServiceDisconnect 0 "gesteckt" 1 "gezogen"; +VAL_ 1442 BMS_Status_Spgfreiheit 0 "Init" 1 "HV_Komponente_spannungsfrei" 2 "HV_Komp_nicht_spannungsfrei" 3 "Fehler_nicht_spannungsfrei"; +VAL_ 1442 BMS_OBD_Lampe_Anf 0 "kein_MIL_Request" 1 "MIL_Request"; +VAL_ 1442 BMS_IstModus 0 "HV_inaktiv" 1 "Fahren_HV_aktiv" 2 "stBalancing" 3 "externes_Laden" 4 "AC_Laden" 5 "Error_Batt" 6 "DC_Laden" 7 "Init"; +VAL_ 1442 BMS_Fehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Isofehler_I" 2 "Eingeschr_KompFkt_Isofehler_II" 3 "Eingeschr_KompFkt_Interlock" 4 "Eingeschr_KompFkt_SD" 5 "Eingeschr_KompFkt_Leistungsred" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 1442 BMS_Kapazitaet_02 2047 "Init"; +VAL_ 1442 BMS_Soll_SOC_HiRes 2046 "Init" 2047 "Fehler"; +VAL_ 1447 TM_Spiegel_Anklappen 0 "Init" 1 "Spiegel_anklappen"; +VAL_ 1447 TM_Nur_Hupen 0 "inaktiv" 1 "aktiv"; +VAL_ 1447 TM_Door_Lock 0 "Init" 1 "door_lock"; +VAL_ 1447 TM_Door_Unlock 0 "Init" 1 "door_unlock"; +VAL_ 1447 TM_Warnblinken 0 "Init" 1 "Warnblinken_on"; +VAL_ 1447 TM_Panik_Alarm 0 "Init" 1 "panik_alarm_on"; +VAL_ 1447 TM_ZV_Signatur 0 "Init"; +VAL_ 1452 HVEM_IstStrom_HVVerbraucher 4094 "Init" 4095 "Fehler"; +VAL_ 1452 HVEM_Energie_Klima_Vorgabe_HighR 6 "Init" 7 "Fehler"; +VAL_ 1452 HVEM_IstLeistungNA 510 "Init" 511 "Fehler"; +VAL_ 1452 HVEM_Leistung_Klima_Vorgabe 254 "Init" 255 "Fehler"; +VAL_ 1452 HVEM_Nutzbare_Energie 2045 "Max" 2046 "Init" 2047 "Fehler"; +VAL_ 1452 HVEM_Energie_Klima_Vorgabe 254 "Init" 255 "Fehler"; +VAL_ 1452 HVEM_MO_MaxLeistungIgnoriert 0 "Max_Leistung_nicht_ignoriert" 1 "Max_Leistung_ignoriert"; +VAL_ 1485 DC_Fehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Entlad_defekt" 3 "Eingeschr_KompFkt_Interlock" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 1485 DC_Peakstrom_verfuegbar 0 "Peakstrom_nicht_verfuegbar" 1 "Peakstrom_verfuegbar"; +VAL_ 1485 DC_Abregelung_Temperatur 0 "keine_Abregelung" 1 "Abregelung_Temp"; +VAL_ 1485 DC_IstModus_02 0 "Standby" 1 "HV_On_Vorladen" 2 "Tiefsetzen" 3 "Hochsetzen" 4 "Pruefimpuls_12V" 5 "Fehler" 7 "Initialisierung"; +VAL_ 1485 DC_HV_EKK_IstModus 0 "Standby" 2 "Tiefsetzen" 3 "Hochsetzen" 5 "Fehler" 7 "Initialisierung"; +VAL_ 1485 DC_Status_Spgfreiheit_HV 0 "Init" 1 "HV_Komponente_spannungsfrei" 2 "HV_Komp_nicht_spannungsfrei" 3 "Fehler_nicht_spannungsfrei"; +VAL_ 1485 DC_IstSpannung_EKK_HV 255 "Init"; +VAL_ 1485 DC_Temperatur 254 "Init" 255 "Fehler"; +VAL_ 1505 BCM1_Aussen_Temp_ungef 253 "nicht_verbaut" 254 "Initwert" 255 "Fehler"; +VAL_ 1505 BCM_Heizungsabsperrventil_Status 0 "HAV_offen" 1 "HAV_geschlossen" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; +VAL_ 1505 BCM_Heizungspumpe_Status 0 "Pumpe_aus" 1 "Pumpe_aktiv_und_Stauts_iO" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; +VAL_ 1505 BCM_Kompressorkupplung_Status 0 "Kupplung_offen" 1 "Kupplung_geschlossen" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; +VAL_ 1505 BCM1_PTC_stufig_Status 0 "Aus" 1 "Stufe_1_aktiv" 2 "Stufe_2_aktiv" 3 "Stufe_3_aktiv" 6 "Init_oder_nicht_verbaut" 7 "Fehler"; +VAL_ 1505 BCM1_FStatus_Aussentemp_ungef 0 "iO" 1 "niO"; +VAL_ 1505 BCM1_Kompressorstrom_ist 254 "Init, bzw. nicht verfuegbar" 255 "Fehler"; +VAL_ 1505 BCM1_OBD_FStatus_ATemp 0 "kein Fehler / Init / nicht verbaut" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach minus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei"; +VAL_ 1513 DS_Kaeltemittel_P 2046 "Init" 2047 "Fehler"; +VAL_ 1513 DS_Status 0 "i.O." 1 "t.b.d." 2 "Init bzw. nicht verfÃŧgbar" 3 "Fehler"; +VAL_ 1513 ION_Status 0 "Hochspannung_ausgeschaltet" 1 "Hochspannung_eingeschaltet" 2 "Init"; +VAL_ 1513 ION_Status_LED 0 "Aus" 1 "Ein"; +VAL_ 1513 AAU_Geblaese 126 "Init" 127 "Fehler"; +VAL_ 1513 ION_Status_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1520 DI_KL_58xd 254 "Init" 255 "Fehler"; +VAL_ 1520 DI_KL_58xs 126 "Init" 127 "Fehler"; +VAL_ 1520 DI_KL_58xt 126 "Init" 127 "Fehler"; +VAL_ 1524 IL_Bel_FS_Ausstieg 0 "inaktiv" 1 "aktiv"; +VAL_ 1524 IL_Bel_BFS_Ausstieg 0 "inaktiv" 1 "aktiv"; +VAL_ 1524 IL_Bel_HFS_Ausstieg 0 "inaktiv" 1 "aktiv"; +VAL_ 1524 IL_Bel_HBFS_Ausstieg 0 "inaktiv" 1 "aktiv"; +VAL_ 1524 BCM1_Innenlicht_gedimmt_V 0 "100% Innenlicht" 1 "gedimmtes Innenlicht"; +VAL_ 1524 BCM1_Innenlicht_gedimmt_H 0 "100% Innenlicht" 1 "gedimmtes Innenlicht"; +VAL_ 1524 IL_Innenlicht_aktiv 0 "Innenlicht inaktiv" 1 "Innenlicht aktiv"; +VAL_ 1524 IL_Klemme_30G_aktiv 0 "Kl_30G_abgeschaltet" 1 "eingeschaltet"; +VAL_ 1524 BCM1_DI_Rampe_Innenlicht 0 "Dimmrampe 0" 1 "Dimmrampe 1"; +VAL_ 1524 BCM1_DI_Rampe_Leselicht 0 "Dimmrampe 0" 1 "Dimmrampe 1"; +VAL_ 1524 BCM1_Innenlicht_H 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Innenlicht_V 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leselicht_Anf_hl 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leselicht_Anf_hr 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leselicht_Anf_vl 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leselicht_Anf_vr 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leuchten_Aus 0 "keine Aenderung" 1 "Aus"; +VAL_ 1524 AMB_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1524 AMB_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 1600 MO_QBit_Ansaugluft_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1600 MO_QBit_Oel_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1600 MO_QBit_Kuehlmittel_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1600 MO_HYB_Fehler_HV_Netz 0 "i_O" 1 "kein_generatorischer_Betrieb_moeglich"; +VAL_ 1600 MO_aktives_Getriebeheizen 0 "kein_Ventil_ansteuern" 1 "Ventil_muss_angesteuert_werden"; +VAL_ 1600 MO_Absperrventil_oeffnen 0 "nicht_verfuegbar" 1 "Ansteuerung_Ventil_zulaessig" 2 "Ventil_oeffnen_oder_geoeffnet" 3 "Ventil_schliessen_oder_geschlossen"; +VAL_ 1600 MO_Ansaugluft_Temp 254 "Init" 255 "Fehler"; +VAL_ 1600 MO_Oel_Temp 253 "nicht_verbaut" 254 "Init" 255 "Fehler"; +VAL_ 1600 MO_Kuehlmittel_Temp 254 "Init" 255 "Fehler"; +VAL_ 1600 MO_Hoeheninfo 255 "Fehler"; +VAL_ 1600 MO_Kennfeldk 0 "keine KennfeldkÃŧhlung vorhanden" 1 "KennfeldkÃŧhlung vorhanden"; +VAL_ 1600 MO_Getriebe_kuehlen 0 "nicht_kuehlen" 1 "kuehlen"; +VAL_ 1600 MO_Heizungspumpenansteuerung 13 "Fehler" 14 "Init" 15 "nicht_verbaut"; +VAL_ 1600 MO_SpannungsAnf 0 "keine_Anforderung" 1 "Anforderung"; +VAL_ 1601 MO_Faktor_Momente_02 0 "nicht_belegt"; +VAL_ 1601 MO_Hybridfahrzeug 0 "kein_Hybridfahrzeug" 1 "Mild_Hybrid" 2 "Full_Hybrid" 3 "PlugIn_Hybrid"; +VAL_ 1601 MO_Getriebe_Code 0 "Init" 2 "DL501" 3 "DL800" 4 "VL381" 5 "DL382_Front" 6 "DL382_Allrad" 7 "DL702" 8 "AL552_Allrad" 9 "AL552_Front" 10 "AL651" 11 "AL551__AL951__AL1000_8A" 12 "PDK_PAG" 13 "AL551_Hybrid" 15 "Handschalter_konventionell" 16 "AQ250_160" 17 "AQ450" 18 "DQ200" 19 "DQ250" 20 "DQ500" 21 "SQ100" 22 "SQ200" 23 "DQ400E" 24 "DQ381" 25 "AL550" 26 "AQ300" 31 "DL800E" 32 "Single_Gear__ohne_GSG_WH_am_MSG" 33 "EQ550_2P"; +VAL_ 1601 MO_StartStopp_Codiert 0 "Start_Stopp_nicht_verbaut" 1 "Start_Stopp_verbaut"; +VAL_ 1601 MO_Anzahl_Zyl 0 "kein_Zylinder" 1 "1_Zylinder" 2 "2_Zylinder" 3 "3_Zylinder" 4 "4_Zylinder" 5 "5_Zylinder" 6 "6_Zylinder" 7 "7_Zylinder" 8 "8_Zylinder" 9 "9_Zylinder" 10 "10_Zylinder" 11 "11_Zylinder" 12 "12_Zylinder" 13 "15_Zylinder" 14 "16_Zylinder" 15 "18_Zylinder"; +VAL_ 1601 MO_Kraftstoffart 0 "Diesel" 1 "Benzin_inkl_E25_E85" 2 "CNG" 3 "LPG" 4 "Wasserstoff" 5 "E100_Ethanol" 15 "kein_Verbrennungskraftstoff"; +VAL_ 1601 MO_Ansaugsystem 0 "Turbo" 1 "Sauger"; +VAL_ 1601 MO_DPF_verbaut 0 "kein_DPF_verbaut" 1 "DPF_verbaut"; +VAL_ 1601 TSK_Codierung 0 "kein_Fahrgeschwindigkeitsregler" 1 "GRA" 2 "GRA_Plus" 3 "Basis_ACC" 4 "ACC_Follow_to_Stop" 5 "ACC_Stop_and_Go" 7 "Codierung_in_Plausibilisierungsphase"; +VAL_ 1603 KBI_Einheit_Datum 0 "Tag/Monat/Jahr" 1 "Monat/Tag/Jahr" 2 "Jahr/Monat/Tag" 3 "reserviert"; +VAL_ 1603 KBI_Einheit_Druck 0 "Druckangabe in bar" 1 "Druckangabe in psi" 2 "Druckangabe in kPa" 3 "tbd."; +VAL_ 1603 KBI_Einheit_Streckenanz 0 "Kilometer" 1 "Meilen"; +VAL_ 1603 KBI_MFA_v_Einheit_02 0 "kmh" 1 "mph"; +VAL_ 1603 KBI_Einheit_Temp 0 "Grad Celsius °C" 1 "Grad Fahrenheit °F"; +VAL_ 1603 KBI_Einheit_Uhrzeit 0 "24h" 1 "12h AM/PM"; +VAL_ 1603 KBI_Einheit_Verbrauch 0 "mpg UK" 1 "mpg USA" 2 "Liter/100km" 3 "km/Liter"; +VAL_ 1603 KBI_Einheit_Volumen 0 "Liter" 1 "Gallonen UK" 2 "Gallonen USA" 3 "reserviert"; +VAL_ 1603 KBI_Einheit_Verbrauch_elektr 0 "kWh_pro_100km" 1 "km_pro_kWh" 2 "kWh_pro_100mls" 3 "mls_pro_kWh" 4 "MPGe"; +VAL_ 1603 KBI_Einheit_Verbrauch_Gas 0 "kg_per_100km" 1 "km_per_kg" 2 "m3_per_100km" 3 "km_per_m3" 4 "miles_per_lbs" 5 "miles_per_yard3" 6 "miles_per_kg" 7 "miles_per_m3" 8 "miles_per_gallon_equivalent_US"; +VAL_ 1603 KBI_Einheit_Masse 0 "kg" 1 "lbs" 2 "reserviert"; +VAL_ 1622 ELV_Anf_Klemme_S 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Anf_Klemme_15 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Anf_Klemme_50 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_01_Sendestatus 0 "ELV_sendet_mit_1000ms" 1 "ELV_sendet_mit_50ms"; +VAL_ 1622 ELV_Verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1622 ELV_Entriegelt 0 "ELV_nicht_entriegelt" 1 "ELV_entriegelt"; +VAL_ 1622 ELV_ZAT_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1622 ELV_Lebenszustand 0 "Lebenszustand_0" 1 "Lebenszustand_4"; +VAL_ 1622 ELV_Anlernmodus 0 "Normalbetrieb" 1 "Anlernmodus"; +VAL_ 1622 ELV_Klemmenfreigabe 0 "keine_Freigabe" 1 "Freigabe"; +VAL_ 1622 ELV_Abbruch_Anf_Klemmenfreigabe 0 "kein_Abbruch" 1 "Abbruch"; +VAL_ 1622 ELV_LED_Rot 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_LED_Gelb 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Panikabschaltung 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Lkg_Bewegen 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Werkstatt 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Defekt 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_P_Gang 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_PN_Gang 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Kupplung 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Bremse 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_P_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1624 LV_Standlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_Abblendlicht_Anzeige 0 "inaktiv" 1 "aktiv"; +VAL_ 1624 LV_Fernlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_Nebellicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_Nebelschlusslicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_Tagfahrlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_AFL_aktiv_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_AFL_defekt 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Blinker_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Standlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblendlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Fernlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Nebellicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Blk_li_Seite_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Tagfahrlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_FLA_aktiv_Anzeige 0 "aus" 1 "ein"; +VAL_ 1624 LV_FLA_defekt 0 "i.O." 1 "FLA defekt"; +VAL_ 1624 LV_FLA_Sensor_blockiert 0 "i.O." 1 "FLA-Sensor blockiert"; +VAL_ 1624 LV_Blinker_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Standlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblendlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Fernlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Nebellicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Blk_re_Seite_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Tagfahrlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Aussenlicht_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblendlicht_TFL_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Nebellicht_TFL_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Standlicht_TFL_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblend_Fernlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblendlicht_TFL_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Nebellicht_TFL_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Standlicht_TFL_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblend_Fernlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abbiegelicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abbiegelicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 BCM1_Linksverkehr 0 "Rechtsverkehr" 1 "Linksverkehr"; +VAL_ 1624 BCM1_Licht_Dunkelheit_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1624 LV_LED_Scheinwerfer_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_LED_Scheinwerfer_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Blinker_VL_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1624 LV_Blinker_VR_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1624 LV_MXB_Status_Anzeige 0 "MXB_aus" 1 "MXB_regelt" 2 "MXB_volles_Fernlicht" 3 "MXB_und_Laser_aktiv"; +VAL_ 1629 BR_Systemart 0 "ABS" 1 "ABS_ASR" 2 "ESP" 3 "ESP_mit_integrierter_EPB"; +VAL_ 1629 ESP_SpannungsAnf_02 0 "keine_Anforderung" 1 "Anforderung_Stufe1" 2 "Anforderung_Stufe2" 3 "Anforderung_Stufe3"; +VAL_ 1629 ESP_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1629 ESP_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 1629 ESP_Wiederstart_Anz_01 0 "keine_Anzeige" 1 "Rueckwaertsrollen"; +VAL_ 1629 ESP_Wiederstart_Anz_02 0 "keine_Anzeige" 1 "Autohold_Rutschen"; +VAL_ 1629 ESP_Wiederstart_Anz_03 0 "keine_Anzeige" 1 "Offroad_HDC"; +VAL_ 1629 ESP_Wiederstart_Anz_04 0 "keine_Anzeige" 1 "ESC_Off"; +VAL_ 1629 ESP_Stoppverbot_Anz_01 0 "keine_Anzeige" 1 "Notbremsung_aktiv"; +VAL_ 1629 ESP_Stoppverbot_Anz_02 0 "keine_Anzeige" 1 "Autohold_AVH_Rutschen"; +VAL_ 1629 ESP_Stoppverbot_Anz_03 0 "keine_Anzeige" 1 "Rueckwaertsrollen"; +VAL_ 1629 ESP_Stoppverbot_Anz_04 0 "keine_Anzeige" 1 "ESP_Pumpenlauf"; +VAL_ 1629 ESP_Stoppverbot_Anz_05 0 "keine_Anzeige" 1 "ESP_OFF"; +VAL_ 1629 ESP_Stoppverbot_Anz_06 0 "keine_Anzeige" 1 "Offroad_HDC"; +VAL_ 1629 ESP_Stoppverbot_Anz_07 0 "keine_Anzeige" 1 "ESP_Haltefunktion_nicht_verfuegbar"; +VAL_ 1629 ESP_Stoppverbot_Anz_Std 0 "keine_Anzeige" 1 "Standard_Stoppvetogrund"; +VAL_ 1629 ESP_Dachrelingsensor 0 "Sensor_nicht_verbaut" 1 "Quertraeger_montiert" 2 "Quertraeger_nicht_montiert" 3 "Fehler"; +VAL_ 1629 ESP_Stoppverbot_Anz_08 0 "keine_Anzeige" 1 "Neigungsbegrenzung"; +VAL_ 1629 HDC_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1629 HDC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 1629 BR_QBit_Reifenumfang 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1631 TSK_QBit_Steigung 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1631 TSK_QBit_Fahrzeugmasse 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1631 MO_SpannungsAnf_02 0 "keine_Anforderung" 1 "Anforderung_Stufe_1" 2 "Anforderung_Stufe_2" 3 "Anforderung_Stufe_3"; +VAL_ 1631 MO_DPF_reg 0 "DPF_regeneriert_nicht" 1 "DPF_regeneriert"; +VAL_ 1631 MO_Heizstrom_EKAT 127 "Fehler"; +VAL_ 1631 MO_Heizstrom_SCR 63 "Fehler"; +VAL_ 1631 MO_Anzeige_Kaltleuchte 0 "Lampe_aus" 1 "Lampe_an"; +VAL_ 1631 MO_P_Generator_ungefiltert_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1631 TSK_Getriebeinfo 0 "Handschalter" 1 "AL_AQ_Getriebe" 2 "DL_DQ_Getriebe" 3 "CVT_Getriebe"; +VAL_ 1631 MO_Energieinhalt_BMS 4094 "Init" 4095 "Fehler"; +VAL_ 1631 TSK_Fahrzeugmasse_02 255 "Fehler"; +VAL_ 1631 TSK_Steigung_02 0 "Init_oder_nicht_verbaut" 255 "Fehler"; +VAL_ 1640 KL_LRH_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1640 KL_LRH_Stufe 0 "Stufe_niedrig" 1 "Stufe_mittel" 2 "Stufe_hoch" 3 "AUS"; +VAL_ 1640 HSH_Taster 0 "nicht_betaetigt" 1 "short_push" 2 "long_push" 3 "tbd"; +VAL_ 1640 FSH_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1640 KL_Zuheizer_Freigabe 0 "keine_Freigabe_Zuheizer" 1 "Zuheizerfreigabe"; +VAL_ 1640 KL_Beschlagsgefahr 0 "keine_Beschlagsgefahr" 1 "Beschlagsgefahr"; +VAL_ 1640 KRH_Soll_li 0 "aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; +VAL_ 1640 KRH_Soll_re 0 "aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; +VAL_ 1640 KL_Geblspng_Soll 0 "0V_Motorspannung" 252 "0V_sofort_Abschalten" 253 "0V_senken_mit_Rampe" 254 "reserviert" 255 "Fehler"; +VAL_ 1640 KL_Geblspng_Fond_Soll 0 "0V_Motorspannung" 252 "0V_sofort_Abschalten" 253 "0V_senken_mit_Rampe" 254 "reserviert" 255 "Fehler"; +VAL_ 1640 KL_I_Geblaese 255 "Fehler"; +VAL_ 1640 KL_Kompressorstrom_soll 1022 "Init" 1023 "Fehler"; +VAL_ 1640 KL_Umluftklappe_Status 0 "Frischluft" 1 "Teilumluft_10" 2 "Teilumluft_20" 3 "Teilumluft_30" 4 "Teilumluft_40" 5 "Teilumluft_50" 6 "Teilumluft_60" 7 "Teilumluft_70" 8 "Teilumluft_80" 9 "Teilumluft_90" 10 "Umluft" 14 "Init" 15 "Fehler"; +VAL_ 1640 KL_PTC_Verbauinfo 0 "kein_PTC" 1 "600W_geschaltet" 2 "1000W_geschaltet" 3 "1400W_LIN"; +VAL_ 1648 MO_ANC_Kennfeld_Anf 0 "Kennfeld_1" 1 "Uebergang_Kennfeld_2_nach_1" 2 "Uebergang_Kennfeld_1_nach_2" 3 "Kennfeld_2"; +VAL_ 1648 MO_Bremslicht_Reku 0 "Aus" 1 "Ein"; +VAL_ 1648 MO_StartStopp_PopUp 0 "Statuswechsel_ohne_Taster (Init)" 1 "StSt_per_Taster_deaktiviert" 2 "StSt_per_Taster_aktiviert" 3 "nicht verwendet"; +VAL_ 1648 MO1_Sperr_Info_WFS 0 "nicht_gesperrt" 1 "gesperrt"; +VAL_ 1648 MO1_Freigabe_Info_WFS 0 "ungueltig" 1 "gueltig"; +VAL_ 1648 MO_EPCL 0 "EPCL_aus_kein_Text" 1 "EPCL_gelb_Stoerung" 2 "EPCL_gelb_Leistungsbeschraenkung" 3 "EPCL_rot_Fzg_sicher_abstellen"; +VAL_ 1648 MO_Zylabsch_Texte_02 0 "ein_ZAS_generell_keine_ZAS_Anzeigen" 1 "ZAS_im_VMB" 2 "ZAS_im_ASB_1_Zyl_aktiv" 3 "ZAS_im_ASB_2_Zyl_aktiv" 4 "ZAS_im_ASB_3_Zyl_aktiv" 5 "ZAS_im_ASB_4_Zyl_aktiv" 6 "ZAS_im_ASB_5_Zyl_aktiv" 7 "ZAS_im_ASB_6_Zyl_aktiv" 8 "ZAS_im_ASB_8_Zyl_aktiv" 9 "ZAS_im_ASB_12_Zyl_aktiv" 13 "Uebergangsbetrieb" 14 "keine_ZAS_Anzeige_ggf_Stopp_Schub_Betrieb" 15 "ZAS_Stoerungs_Anzeige"; +VAL_ 1648 MO_Fahrzeugtyp 0 "Verbrenner_Fahrzeug" 1 "Hybrid" 2 "E_Fahrzeug" 3 "E_Fahrzeug_mit_Range_Extender" 4 "Brennstoffzellenfahrzeug" 5 "tbd" 6 "tbd" 7 "tbd"; +VAL_ 1648 MO_Abstellzeit 254 "Init" 255 "reserviert"; +VAL_ 1648 MO_Abstellzeit_Status 0 "Abstellzeit_nicht_berechnet" 1 "Abstellzeit_berechnet" 2 "Abstellzeit_Minimalwert" 3 "Abstellzeit_ungueltig"; +VAL_ 1648 MO1_Freigabe_Verfallsinfo_WFS 0 "verfaellt_nicht" 1 "verfaellt"; +VAL_ 1648 MO_Hybrid_StartStopp_LED 0 "LED_aus_und_Blinken_aus" 1 "LED_ein_und_Blinken_aus" 2 "LED_ein_und_Blinken_ein_50_percent" 3 "reserviert"; +VAL_ 1648 MO_Fehler_Zylabsch 0 "kein_Fehler" 1 "Notlauf_Vollmotorbetrieb" 2 "Notlauf_mindestens_einem_abgesch_Zylinder"; +VAL_ 1648 MO_Anzahl_Abgesch_Zyl 0 "Vollmotorbetrieb" 1 "1_Zylinder_abgeschaltet" 2 "2_Zylinder_abgeschaltet" 3 "3_Zylinder_abgeschaltet" 4 "4_Zylinder_abgeschaltet" 5 "5_Zylinder_abgeschaltet" 6 "6_Zylinder_abgeschaltet" 7 "8_Zylinder_abgeschaltet"; +VAL_ 1648 MO_Zylabsch_Texte 0 "keine_Texte" 1 "Zylinderabschaltung_deaktivieren" 2 "Zylinderabschaltung_aktivieren" 3 "Zylinderabschaltung_unruhig"; +VAL_ 1648 MO_Ethanol_BS_Texte 0 "kein_Text" 1 "E85_Warm_Up" 2 "FlexFuel_Warnung_Stufe_3" 3 "Warmfahrempfehlung_MQB__FlexFuel_Warnung_Stufe_1" 4 "FlexFuel_Warnung_Stufe_2" 5 "FlexFuel_Warnung_Stufe_4" 6 "E25_Warm_Up"; +VAL_ 1648 MO_Drehzahl_Warnung 0 "keinen_Warnhinweis_anzeigen" 1 "Warnhinweis_anzeigen"; +VAL_ 1648 MO_obere_Drehzahlgrenze 0 "Init"; +VAL_ 1710 SP_FT_oben 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_FT_unten 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_FT_links 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_FT_rechts 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_BT_oben 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_BT_unten 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_BT_links 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_BT_rechts 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_abklappen 0 "Spiegel_abklappen_nicht_aktiv" 1 "Spiegel_abklappen_aktiv"; +VAL_ 1710 SP_anklappen 0 "Spiegle_anklappen_nicht_aktiv" 1 "Spiegel_anklappen_aktiv"; +VAL_ 1710 SP_normieren 0 "Spiegel_nicht_normiert" 1 "Spiegel_normiert"; +VAL_ 1710 SP_Hzg_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_S_oben 1 "Spiegelschalter in Stellung oben"; +VAL_ 1710 SP_S_unten 1 "Spiegelschalter in Stellung unten"; +VAL_ 1710 SP_S_links 1 "Spiegelschalter in Stellung links"; +VAL_ 1710 SP_S_rechts 1 "Spiegelschalter in Stellung rechts"; +VAL_ 1710 SP_Auswahl_li 1 "Spiegelschalter in Stellung Auswahl links"; +VAL_ 1710 SP_Auswahl_re 1 "Spiegelschalter in Stellung Auswahl rechts"; +VAL_ 1710 SP_ARA_Status 0 "TSG nicht im ARA-Modus" 1 "TSG im ARA-Modus"; +VAL_ 1710 SP_S_Klappen 1 "Spiegelschalter in Stellung Klappen"; +VAL_ 1710 SP_Verstellschalter_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 1711 RV_Video_on 0 "Kamerabild wird nicht angezeigt" 1 "Kamerabild wird angezeigt"; +VAL_ 1711 RV_Dark_Screen 0 "Kamerabild nicht verdunkeln" 1 "Kamerabild verdunkeln"; +VAL_ 1711 RV_HMI_Mode 0 "Parkluecke (Modus 1)" 1 "Parallel zur StraßĨ (Modus 2)" 2 "reserviert" 3 "Kalibrierung (nur Diagnose)"; +VAL_ 1711 RV_GL_side 0 "Guidelines_abgeschaltet" 1 "Guidelines_Anzeige_rechte_Seite" 2 "Guiedelines_Anzeige_linke_Seite" 3 "Guiedelines_Anzeige_beide_Seiten"; +VAL_ 1711 RV_System_aktiv 0 "System nicht betriebsbereit" 1 "System betriebsbereit"; +VAL_ 1711 RV_Reinigung_Anf 0 "nicht_reinigen" 1 "reinigen"; +VAL_ 1711 RV_Settings_enabled 0 "Menu 'Einstellungen' nicht aktiviert" 1 "Menu 'Einstellungen' aktiviert"; +VAL_ 1711 RV_Menu_Item 0 "HMI Mode als ausgewaehlt markiert" 1 "Helligkeit als ausgewaehlt markiert" 2 "Kontrast als ausgewaehlt markiert" 3 "Farbsaettigung als ausgewaehlt markiert"; +VAL_ 1711 SV_Video_on 0 "SideView_aus_/_nicht_verbaut" 1 "SideView_an"; +VAL_ 1711 RV_Calib_Fehler 0 "Kalibrierung_i.O." 1 "RearView_nicht_kalibriert"; +VAL_ 1711 RV_GL_Trailer_connect 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_angekoppeltem_Anh䎧er_deaktiviert"; +VAL_ 1711 RV_GL_Trunk_open 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_geÃļffneter_Heckklappe_deaktiviert"; +VAL_ 1711 RV_GL_LWS_Fehler 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_nicht_kalibriertem_Lenkwinkelsensor_deaktiviert"; +VAL_ 1711 ZFAS_Umfeldbeleuchtung_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1714 DGN_Verlernzaehler 255 "ungÃŧltiger Zä¨Ŧerstand oder kein gÃŧltiger Fahrzyklus"; +VAL_ 1714 UH_Monat 0 "Init" 14 "Relatives_Datum" 15 "Fehler"; +VAL_ 1714 UH_Tag 0 "Init"; +VAL_ 1714 Kombi_02_alt 0 "aktuell" 1 "veraltet"; +VAL_ 1714 Uhrzeit_01_alt 0 "aktuell" 1 "veraltet"; +VAL_ 316495015 VZE_Anzeigemodus 0 "EU_RDW" 1 "USA" 2 "Canada" 3 "China"; +VAL_ 316495015 VZE_Verkehrszeichen_Einheit 0 "mph" 1 "kmh"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_3 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_2 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Verkehrszeichen_1_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_1 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Verkehrszeichen_2_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_2 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Verkehrszeichen_3_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_3 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_2 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_3 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Zusatzschild_1 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Zusatzschild_2 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Zusatzschild_3 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_1 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Zeichen_01_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_02_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_03_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_01_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_01_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_01_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_02_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_02_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_02_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_03_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_03_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_03_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Gong 0 "Gong_deaktiv" 1 "Gong_aktiv"; +VAL_ 441800114 Temperature_Status_Charge 0 "init" 1 "temp under optimal" 2 "temp optimal" 3 "temp over optimal" 7 "fault"; + + + +BO_ 258 ESC_50: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Lateral_Accel : 16|8@1+ (0.15,-18.9) [0|255] "Unit_MeterPerSquareSecond" XXX + SG_ Longitudinal_Accel : 24|10@1+ (0.03125,-16) [0|255] "Unit_MeterPerSquareSecond" XXX + SG_ Yaw_Rate : 40|14@1+ (0.01,0) [0|16383] "Unit_DegreePerSecond" XXX + SG_ Yaw_Rate_Sign : 54|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Power : 80|8@1+ (1,-100) [0|255] "" XXX + SG_ Brake_01 : 90|1@0+ (1,0) [0|1] "" XXX + SG_ Regen_Braking : 123|1@1+ (1,0) [0|7] "" XXX + SG_ Brake_02 : 125|1@0+ (1,0) [0|1] "" XXX + SG_ Motion_State : 171|2@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 180|1@0+ (1,0) [0|1] "" XXX + SG_ Longitudinal_Speed : 181|10@1+ (0.25,0) [0|255] "Unit_KilometerPerHour" XXX + SG_ Brake_Power_02 : 226|8@1+ (1,-100) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 236|9@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_1 : 248|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_Status : 317|3@1+ (1,0) [0|7] "" XXX + +BO_ 252 ESC_51: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 14|6@1+ (1,0) [0|3] "" XXX + SG_ AEB_Breaking_01 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ AEB_Breaking_02 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Accelerator_Higher_Speed : 40|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressure : 42|9@1+ (0.195,0) [0|100] "Unit_Percent" XXX + SG_ NEW_SIGNAL_1 : 52|8@1+ (1,0) [0|15] "" XXX + SG_ HL_Radgeschw : 64|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ HR_Radgeschw : 80|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ VL_Radgeschw : 96|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ VR_Radgeschw : 112|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ NEW_SIGNAL_3 : 128|4@1+ (1,0) [0|15] "" XXX + SG_ HL_Brake_Pressure : 152|8@1+ (1,0) [0|100] "" XXX + SG_ HR_Brake_Pressure : 160|8@1+ (1,0) [0|100] "" XXX + SG_ VL_Brake_Pressure : 168|8@1+ (1,0) [0|100] "" XXX + SG_ VR_Brake_Pressure : 176|8@1+ (1,0) [0|100] "" XXX + SG_ Steering_Wheel_CW : 184|8@1+ (1.67,0) [0|255] "" XXX + SG_ Steering_Wheel_CCW : 192|8@1+ (1.67,0) [0|255] "" XXX + SG_ ESC_v_Signal : 328|13@1+ (0.052,-107.016) [0|63] "" XXX + SG_ NEW_SIGNAL_4 : 342|13@1+ (1,0) [0|3] "" XXX + +BO_ 219 AWV_03: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Unknown_01 : 12|3@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_63 : 18|6@1+ (1,0) [0|63] "" XXX + SG_ SET_ME_1_2 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_02 : 25|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_30 : 27|5@1+ (1,0) [0|15] "" XXX + SG_ SET_ME_127 : 33|7@1+ (1,0) [0|127] "" XXX + SG_ Unknown_03 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_127_2 : 41|7@1+ (1,0) [0|127] "" XXX + SG_ Pre_FCW : 64|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_63_2 : 66|6@1+ (1,0) [0|63] "" XXX + SG_ SET_ME_15_1 : 72|4@1+ (1,0) [0|15] "" XXX + SG_ FCW_Active : 76|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_255 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_1023 : 94|10@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_1 : 129|1@0+ (1,0) [0|1] "" XXX + +BO_ 267 Motor_51: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Accel_Pedal_Pressure : 12|9@1+ (0.4,0) [0|255] "" XXX + SG_ Accel_Low_Pressed_Support : 21|1@1+ (1,0) [0|7] "" XXX + SG_ TSK_Status : 88|3@1+ (1,0) [0|7] "" XXX + SG_ TSK_Limiter_ausgewaehlt : 95|1@1+ (1,0) [0|3] "" XXX + +BO_ 317 QFK_01: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ HCA_No_Override : 14|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LatCon_HCA_Accept : 17|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ LatCon_HCA_Status : 20|3@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_10 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 30|3@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 34|3@0+ (1,0) [0|1] "" XXX + SG_ Steering_Angle_VZ : 36|1@0+ (1,0) [0|1] "" XXX + SG_ Curvature : 40|15@1+ (6.7e-06,0) [0|65535] "" XXX + SG_ Curvature_VZ : 55|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 56|7@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_4 : 63|1@0+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 76|17@1+ (0.00906,0) [0|32767] "" XXX + +BO_ 389241616 MEB_Camera_09: 8 XXX + +BO_ 313 VMM_02: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ FCW_Reaction_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_1 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_Active : 31|1@0+ (1,0) [0|1] "" XXX + SG_ ESP_Hold : 35|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_3 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_Reaction_2 : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pressure : 76|11@1+ (1,0) [0|100] "" XXX + SG_ FCW_Reaction_3 : 88|5@1+ (1,0) [0|31] "" XXX + +BO_ 619 TA_01: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Travel_Assist_Status : 13|3@1+ (1,0) [0|3] "" XXX + SG_ Travel_Assist_Request : 19|3@1+ (1,0) [0|7] "" XXX + SG_ Travel_Assist_Available : 23|1@1+ (1,0) [0|1] "" XXX + +VAL_ 258 Motion_State 1 "Forwards" 2 "Reversing" 3 "Stopped"; +VAL_ 258 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; +VAL_ 267 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault"; +VAL_ 317 LatCon_HCA_Status 0 "disabled" 1 "initializing" 2 "ready" 3 "fault" 4 "active" 5 "preempted" 6 "fault" 7 "rejected"; +VAL_ 619 Travel_Assist_Status 4 "enabled" 0 "disabled" 2 "ready" 3 "pre_ready"; +VAL_ 619 Travel_Assist_Request 4 "enable" 3 "disable" 0 "no_request" 1 "error"; +VAL_ 619 Travel_Assist_Available 0 "not_available" 1 "available"; diff --git a/artifacts/package_runtime/iqdbc/dbc/vw_meb_2024.dbc b/artifacts/package_runtime/iqdbc/dbc/vw_meb_2024.dbc new file mode 100644 index 000000000..6e9aa3fa7 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/vw_meb_2024.dbc @@ -0,0 +1,3543 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: BAP_Tester BedienDisp_vo BedienSG_hi CGS DDA Gateway Gateway_PAG GurtMikrofon OTA_FC ZR_High ZR_LIMU ZR_MIB_TOP_ab_Gen3 ZR_Standard + + +BO_ 84569818 Panda_Data_01: 32 Vector__XXX + SG_ Roll : 0|15@1+ (0.0001,0) [0|3] "rad" Vector__XXX + SG_ Roll_VZ : 15|1@1+ (1,0) [0|1] "" XXX + +BO_ 64 Airbag_01: 8 Gateway + SG_ Airbag_01_CRC : 0|8@1+ (1,0) [0|255] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway + SG_ Airbag_01_BZ : 8|4@1+ (1,0) [0|15] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway + SG_ AB_RGS_Anst : 12|4@1+ (1,0) [0|15] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Front_Crash : 16|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Heck_Crash : 17|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_SF_Crash : 18|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_SB_Crash : 19|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Rollover_Crash : 20|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Crash_Int : 21|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,Sub_Gateway,TME + SG_ AB_Lampe : 24|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Deaktiviert : 25|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_VB_deaktiviert : 26|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Systemfehler : 27|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Diagnose : 28|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Stellgliedtest : 29|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway,TME + SG_ AB_Erh_Auf_VB : 30|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Gurtwarn_VF : 32|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Gurtwarn_VB : 33|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Anzeige_Fussg : 34|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Texte_AKS : 36|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_MKB_gueltig : 39|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_MKB_Anforderung : 40|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Versorgungsspannung : 41|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Deaktivierung_HV : 42|3@1+ (1,0) [0|7] "" AWC,BMC_MLBevo,BMS_NV,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,DCDC_IHEV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,Sub_Gateway,TME + SG_ AB_EDR_Trigger : 45|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ AB_Belegung_VF : 47|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ SC_Masterzeit_Offset : 53|2@1+ (5.08,0) [0|15.24] "Unit_Secon" FCU_MLBevo_FCEV,Sub_Gateway + SG_ SC_LowSpeedCrashErkannt : 55|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV,Sub_Gateway + SG_ SC_Masterzeit : 57|7@1+ (0.04,0) [0|5.04] "Unit_Secon" FCU_MLBevo_FCEV,Sub_Gateway + +BO_ 134 LWI_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ LWI_Sensorstatus : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ LWI_MFL_Abschaltung : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ LWI_Lenkradwinkel : 16|13@1+ (0.0843,0) [0|800] "Unit_DegreOfArc" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" OTA_FC,ZR_High + SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" Vector__XXX + +BO_ 159 LH_EPS_03: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_DSR_Status : 12|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Berechneter_LW : 16|12@1+ (0.15,0) [0|613.95] "Unit_DegreOfArc" XXX + SG_ EPS_BLW_QBit : 30|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_BLW : 31|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_HCA_Status : 32|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Lenkmoment : 40|10@1+ (1,0) [0|8] "Unit_centiNewtoMeter" XXX + SG_ EPS_Lenkmoment_QBit : 54|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_Lenkmoment : 55|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_Lenkungstyp : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 167 Motor_11: 8 Motor_Diesel_MQB + SG_ Motor_11_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ Motor_11_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Soll_Roh : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Ist_Summe : 22|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,SAK_MQB + SG_ MO_Mom_Traegheit_Summe : 32|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Soll_gefiltert : 42|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Schub : 52|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Status_Normalbetrieb_01 : 61|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_erste_Ungenauschwelle : 62|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_QBit_Motormomente : 63|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 168 Motor_12: 8 Motor_Diesel_MQB + SG_ Motor_12_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ Motor_12_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Mom_neg_verfuegbar : 12|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB + SG_ MO_Mom_Begr_stat : 21|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Begr_dyn : 30|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB + SG_ MO_Momentenintegral_02 : 40|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Drehzahl_01 : 47|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Drehzahl_01 : 48|16@1+ (0.25,0) [0|16383] "Unit_MinutInver" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB + +BO_ 173 Getriebe_11: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ GE_MMom_Soll_02 : 12|10@1+ (1,-509) [-509|509] "" Vector__XXX + SG_ GE_MMom_Vorhalt_02 : 22|10@1+ (1,-509) [-509|509] "" Vector__XXX + SG_ GE_Uefkt : 32|10@1+ (0.1,0) [0|102.2] "" Vector__XXX + SG_ GE_Fahrstufe : 42|4@1+ (1,0) [0|15] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ GE_reserv_Fahrstufe : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GE_Schaltablauf : 47|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ GE_Uefkt_unplausibel : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GE_MMom_Status_02 : 50|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ GE_Status_Kraftschluss : 53|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ GE_MMom_Status : 56|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ GE_Freig_MMom_Vorhalt : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GE_Verbot_Ausblendung : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GE_Zielgang : 60|4@1+ (1,0) [0|15] "" OTA_FC,ZR_High + +BO_ 184 EM1_HYB_13: 8 Gateway + SG_ EM1_Freigabe_Info_WFS : 12|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Sperr_Info_WFS : 13|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_AR_aktiv : 14|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Eta_Sys : 15|9@1+ (0.2,0) [0|101.8] "Unit_PerCent" Sub_Gateway + SG_ EM1_IstStrom : 24|11@1+ (1,-1023) [-1023|1022] "Unit_Amper" Sub_Gateway + SG_ EM1_Fehler_ElAntriebFreilauf_Anf : 35|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Abregelung_Temperatur : 36|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_AnlernenElMotor_Anf : 43|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Moment_HVVerbraucher : 44|10@1+ (1,-511) [-511|511] "Unit_NewtoMeter" Sub_Gateway + SG_ EM1_Freigabe_Verfallsinfo_WFS : 55|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ EM1_Parken_WFS_Status : 56|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ EM1_HV_betriebsbereit : 58|1@1+ (1,0) [0|1] "" Sub_Gateway + +BO_ 190 MEB_HVEM_01: 48 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Engine_RPM_Max : 12|14@1+ (2,-9658) [0|15] "RPM" XXX + SG_ Engine_RPM_Min : 26|14@1+ (2,-10300) [0|63] "RPM" XXX + SG_ In_Motion_04 : 48|3@1+ (1,0) [0|7] "" XXX + SG_ In_Motion_03 : 52|1@0+ (1,0) [0|1] "" XXX + SG_ In_Motion_02 : 54|1@0+ (1,0) [0|1] "" XXX + SG_ Engine_Power : 56|12@1+ (0.5,-1023) [0|255] "kW" XXX + SG_ In_Motion : 68|1@1+ (1,0) [0|3] "" XXX + SG_ Standstill : 71|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_04 : 72|10@1+ (1,0) [0|255] "" XXX + SG_ Voltage : 86|12@1+ (0.24,0) [0|3] "V" XXX + SG_ Unknown_01 : 100|9@1+ (1,0) [0|7] "" XXX + SG_ Battery_Voltage : 113|13@1+ (0.065,0) [0|127] "V" XXX + SG_ Engine_Status : 296|2@1+ (1,0) [0|3] "" XXX + SG_ Inactive : 300|1@0+ (1,0) [0|1] "" XXX + SG_ Inactive_02 : 303|1@0+ (1,0) [0|1] "" XXX + +BO_ 192 EM1_01: 32 XXX + SG_ Schubbetrieb : 79|1@0+ (1,0) [0|1] "" XXX + +BO_ 247 MEB_HVEM_02: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_3 : 44|10@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_2 : 54|7@1+ (1,0) [0|3] "" XXX + +BO_ 253 ESP_21: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BR_Eingriffsmoment : 12|10@1+ (1,-509) [-509|509] "" Vector__XXX + SG_ ESP_Diagnose : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ ESC_v_Signal_Qualifier_High_Low : 24|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ESP_Vorsteuerung : 28|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ OBD_Schlechtweg : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ OBD_QBit_Schlechtweg : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0|655.32] "Unit_KiloMeterPerHour" BedienSG_hi,DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ASR_Tastung_passiv : 48|1@1+ (1,0) [0|1] "" OTA_FC + SG_ ESP_Tastung_passiv : 49|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ESP_Systemstatus : 50|1@1+ (1,0) [0|1] "" OTA_FC + SG_ ASR_Schalteingriff : 51|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_QBit_v_Signal : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ABS_Bremsung : 56|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ASR_Anf : 57|1@1+ (1,0) [0|1] "" ZR_High + SG_ MSR_Anf : 58|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ EBV_Eingriff : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EDS_Eingriff : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Eingriff : 61|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ ESP_ASP : 62|1@1+ (1,0) [0|1] "" ZR_High + SG_ ESC_Neutralschaltung : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 261 VMM_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 13|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 40|2@1+ (1,0) [0|3] "" XXX + SG_ Brake : 53|7@1+ (1,0) [0|3] "" XXX + +BO_ 278 ESP_10: 8 Gateway_MQB + SG_ ESP_10_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_10_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_VL : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_VR : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_HL : 14|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_HR : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_VL : 16|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_VR : 26|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_HL : 36|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_HR : 46|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VL_Fahrtrichtung : 56|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VR_Fahrtrichtung : 58|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HL_Fahrtrichtung : 60|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HR_Fahrtrichtung : 62|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 285 LH_EPS_02: 8 Gateway_D4C7 + SG_ EPS_02_CRC : 0|8@1+ (1,0) [0|255] "" SCU_D4 + SG_ EPS_02_BZ : 8|4@1+ (1,0) [0|15] "" SCU_D4 + SG_ EPS_Notlauf : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ EPS_Lastinfo : 16|8@1+ (1,0) [0|253] "Unit_Amper" Vector__XXX + SG_ EPS_Unterstuetzungsleistung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" SCU_D4 + SG_ EPS_Drehzahlreserve : 32|7@1+ (10,0) [0|1000] "Unit_DegreOfArcPerSecon" SCU_D4 + SG_ EPS_VZ_Drehzahlreserve : 39|1@1+ (1,0) [0|1] "" SCU_D4 + SG_ EPS_Leistungsanforderung : 40|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 294 HCA_01: 8 Frontsensorik + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HCA_01_Vib_Freq : 12|4@1+ (1,15) [18|30] "Unit_Hertz" Vector__XXX + SG_ HCA_01_LM_Offset : 16|9@1+ (1,0) [0|511] "Unit_centiNewtoMeter" Vector__XXX + SG_ EA_ACC_Sollstatus : 25|2@1+ (1,0) [0|3] "" Frontradar + SG_ EA_Ruckprofil : 27|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HCA_01_Enable : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_LM_OffSign : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Available : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Standby : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Request : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Vib_Amp : 36|4@1+ (0.2,0) [0|3] "Unit_NewtoMeter" Vector__XXX + SG_ EA_Ruckfreigabe : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EA_ACC_Wunschgeschwindigkeit : 41|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Frontradar + +BO_ 299 GRA_ACC_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ GRA_Hauptschalter : 12|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Abbrechen : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Typ_Hauptschalter : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Limiter : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Setzen : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Hoch : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Runter : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Wiederaufnahme : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Verstellung_Zeitluecke : 20|2@1+ (1,0) [0|3] "" ZR_High + SG_ GRA_Codierung : 22|2@1+ (1,0) [0|3] "" ZR_High + SG_ GRA_Fehler : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_LIM_Taste_verfuegbar : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_Tip_Stufe_2 : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ GRA_ButtonTypeInfo : 27|3@1+ (1,0) [0|7] "" ZR_High + SG_ GRA_TravelAssist : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GRA_reserveByte4 : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GRA_reserveByte5 : 32|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ GRA_reserveByte6 : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ GRA_reserveByte7 : 48|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ GRA_reserveByte8 : 56|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 312 IPA_01: 32 XXX + +BO_ 319 PreCrash_02: 8 Gateway + SG_ PreCrash_02_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ PreCrash_02_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PreCrash_Charisma_FahrPr : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PreCrash_Charisma_Status : 16|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PreCrash_Schiebedach_schliessen : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_Fenster_schliessen : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_Blinken : 20|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreSense_FCWP : 23|1@1+ (1,0) [0|1] "" NightVision + SG_ PreCrash_Tueren_Verriegeln : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_Anforderung_AFR : 26|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreCrash_LED : 29|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PreCrash_FS_Pneumatik_ansteuern : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_BFS_Pneumatik_ansteuern : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_Fo_Pneumatik_ansteuern : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PreCrash_FS_Sitzlehne_verfahren : 34|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PreCrash_BFS_Sitzlehne_verfahren : 37|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PreCrash_Fo_Sitzlehne_verfahren : 40|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PreCrash_FS_KSV_verfahren : 43|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PreCrash_BFS_KSV_verfahren : 47|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PreCrash_Fo_KSV_verfahren : 51|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ SC_PreCrash_Warnung : 56|4@1+ (1,0) [0|15] "" NightVision + SG_ SC_PreCrash_Texte : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 332 Motor_54: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Accelerator_Pressure : 175|8@0+ (0.4,-14.8) [0|100] "Unit_Percent" XXX + +BO_ 339 MSG_HYB_30: 8 Gateway + SG_ MSG_HYB_30_CRC : 0|8@1+ (1,0) [0|255] "" Ladegeraet_Konzern + SG_ MSG_HYB_30_BZ : 8|4@1+ (1,0) [0|15] "" Ladegeraet_Konzern + SG_ MO_HVEM_Eskalation : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_ErwGrenzen_Anf : 13|1@1+ (1,0) [0|1] "" BMC_MLBevo + SG_ MO_Fehler_Notentladung_Anf : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_HVEM_MaxLeistung : 15|9@1+ (50,0) [0|25450] "Unit_Watt" Vector__XXX + SG_ MO_HVK_EmIstzustand : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ MO_HVK_AntriebFehlerstatus : 37|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_Bordnetz_Anf : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_HVK_AntriebZustand : 41|3@1+ (1,0) [0|7] "" TME + SG_ MO_HVK_EmFehlerstatus : 44|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_AntriebFehlerstatus : 47|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_AntriebZustand : 50|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_EmFehlerstatus : 53|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_MVK_EmIstzustand : 56|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 387 MEB_Camera_01: 64 XXX + SG_ NEW_SIGNAL_1 : 191|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 200|9@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_3 : 209|9@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_9 : 218|6@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_10 : 224|8@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_4 : 232|9@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_5 : 241|9@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_8 : 250|6@1+ (1,0) [0|63] "" XXX + SG_ Lane_Center_Offset : 256|12@1+ (0.001,-2.5) [0|255] "Unit_Meter" XXX + SG_ NEW_SIGNAL_6 : 268|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_7 : 280|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_11 : 292|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_12 : 304|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_13 : 320|8@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_14 : 332|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_15 : 344|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_16 : 356|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_17 : 368|10@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_18 : 384|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_19 : 396|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_20 : 408|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_21 : 420|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_22 : 432|5@1+ (1,0) [0|31] "" XXX + SG_ NEW_SIGNAL_23 : 448|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_24 : 460|12@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_25 : 472|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_26 : 484|12@1+ (1,0) [0|15] "" XXX + +BO_ 420 EA_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ EA_Parken_beibehalten_HMS : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Warnruckprofil : 28|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_eCall_Anf : 31|2@1+ (1,0) [0|3] "" ZR_High + SG_ EA_Funktionsstatus : 40|4@1+ (1,0) [0|15] "" ZR_High + SG_ EA_Gurtstraffer_Anf : 44|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Anforderung_HMS : 48|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Sollbeschleunigung : 53|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" Vector__XXX + +BO_ 496 EA_02: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ EA_Texte : 12|4@1+ (1,0) [0|15] "" ZR_High + SG_ ACF_Lampe_Hands_Off : 16|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Infotainment_Anf : 22|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ EA_Tueren_Anf : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ EA_Innenraumlicht_Anf : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ zFAS_Warnblinken : 26|2@1+ (1,0) [0|3] "" ZR_High + SG_ STP_Primaeranz : 28|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Bremslichtblinken : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EA_Blinken : 32|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Unknown : 60|3@0+ (1,0) [0|7] "" XXX + +BO_ 517 SAM_01: 8 XXX + SG_ Brake_Light : 36|1@0+ (1,0) [0|1] "" XXX + SG_ Left_Blinker : 37|1@0+ (1,0) [0|1] "" XXX + SG_ Right_Blinker : 38|1@0+ (1,0) [0|1] "" XXX + +BO_ 518 Parken_01: 24 XXX + SG_ CHK : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ AEB_Active : 16|1@0+ (1,0) [0|1] "" XXX + +BO_ 522 EML_06: 64 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Yaw_Rate_VZ : 33|1@1+ (1,0) [0|1] "" XXX + SG_ Yaw_Rate : 200|16@1+ (0.007,-229.34) [0|255] "" XXX + +BO_ 564 MEB_Camera_02: 64 XXX + SG_ NEW_SIGNAL_1 : 12|6@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 18|6@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_3 : 24|6@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_4 : 30|6@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_7 : 178|13@1+ (1,0) [0|127] "" XXX + SG_ NEW_SIGNAL_6 : 192|12@1+ (1,0) [0|255] "" XXX + SG_ NEW_SIGNAL_8 : 286|9@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_5 : 295|9@1+ (1,0) [0|255] "" XXX + +BO_ 588 MEB_Side_Assist_01: 16 XXX + SG_ Blind_Spot_Passenger : 12|7@1+ (1,0) [0|15] "" XXX + SG_ Blind_Spot_Driver : 19|7@1+ (1,0) [0|15] "" XXX + SG_ Blind_Spot_Info_Passenger : 26|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Warn_Passenger : 27|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Info_Driver : 29|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Warn_Driver : 30|1@0+ (1,0) [0|1] "" XXX + SG_ Lower_Speed_01 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ Higher_Speed_01 : 33|1@0+ (1,0) [0|1] "" XXX + SG_ Higher_Speed_02 : 83|1@0+ (1,0) [0|1] "" XXX + SG_ Lower_Speed_02 : 84|1@0+ (1,0) [0|1] "" XXX + SG_ Standstill : 86|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 98|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 119|1@0+ (1,0) [0|1] "" XXX + +BO_ 589 MEB_Side_Assist_02: 64 XXX + SG_ Unknown_01 : 100|3@0+ (1,0) [0|7] "" XXX + SG_ Unknown_02 : 108|3@0+ (1,0) [0|7] "" XXX + +BO_ 591 MEB_Distance_01: 64 XXX + SG_ Unknown_01 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Distance_Status : 13|2@1+ (1,0) [0|3] "" XXX + SG_ Same_Lane_01_ObjectID : 16|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Left_Lane_01_ObjectID : 22|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Right_Lane_01_ObjectID : 28|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Same_Lane_02_ObjectID : 34|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Left_Lane_02_ObjectID : 40|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Right_Lane_02_ObjectID : 46|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Unknown_02 : 52|2@1+ (1,0) [0|3] "" XXX + SG_ Unknown_03 : 54|10@1+ (1,0) [0|3] "" XXX + SG_ Same_Lane_01_Long_Distance : 64|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Same_Lane_01_Lat_Distance : 76|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Same_Lane_01_Rel_Velo : 86|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Left_Lane_01_Long_Distance : 96|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Left_Lane_01_Lat_Distance : 108|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Left_Lane_01_Rel_Velo : 118|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Right_Lane_01_Long_Distance : 128|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Right_Lane_01_Lat_Distance : 140|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Right_Lane_01_Rel_Velo : 150|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Same_Lane_02_Long_Distance : 160|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Same_Lane_02_Lat_Distance : 172|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Same_Lane_02_Rel_Velo : 182|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Left_Lane_02_Long_Distance : 192|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Left_Lane_02_Lat_Distance : 204|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Left_Lane_02_Rel_Velo : 214|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Right_Lane_02_Long_Distance : 224|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Right_Lane_02_Lat_Distance : 236|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Right_Lane_02_Rel_Velo : 246|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Same_Lane_01_Unknown_01 : 256|8@1+ (1,-128) [0|31] "" XXX + SG_ Same_Lane_01_Unknown_02 : 264|6@1+ (1,-15) [0|31] "" XXX + SG_ Same_Lane_01_Unknown_03 : 270|6@1+ (1,0) [0|127] "" XXX + SG_ Same_Lane_01_Unknown_04 : 277|6@1+ (1,0) [0|7] "" XXX + SG_ Same_Lane_01_Unknown_05 : 284|6@1+ (1,0) [0|1] "" XXX + +BO_ 605 KLR_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KLR_Fehler : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_ResponseError : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Lokalaktiv : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Fehler_Codierung : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Touchintensitaet_1 : 16|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchintensitaet_2 : 24|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchintensitaet_3 : 32|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchauswertung : 40|4@1+ (1,0) [0|15] "" ZR_High + +BO_ 695 RCTA_01: 8 XXX + SG_ RCTA_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ RCTA_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 706 Motor_41: 8 Gateway + SG_ MO_Anzeige_StSt_Text : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MO_Anzeige_StSt_Symbol : 16|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_ADR_Status : 19|2@1+ (1,0) [0|3] "" ZR_High + SG_ MO_AGA_Sound_Texte : 21|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Anzeige_FMAus_Text : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Fehler_MSpG : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PEA_Texte : 25|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_Ueberstimmt_vMax_FahrerInfo : 28|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Avus_Motorschutz : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Rekuperationsstufe : 32|3@1+ (1,0) [0|7] "" OTA_FC + SG_ TSK_Einheit_vMax_FahrerInfo : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_Status_vMax_FahrerInfo : 36|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Red_Fahrleistung : 38|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_Anz_Kuehlerluefter : 47|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_im_Leerlauf : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Enable_Oeldr_Motor : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_OelMessung_Dauer : 52|4@1+ (15,15) [15|225] "Unit_Secon" Vector__XXX + SG_ TSK_vMax_FahrerInfo : 56|8@1+ (1,15) [16|270] "" Vector__XXX + +BO_ 768 MEB_ACC_01: 48 XXX + SG_ ACC_Tempolimit : 64|5@1+ (1,0) [0|31] "" OTA_FC + SG_ ACC_Wunschgeschw_Farbe : 69|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Warnung_Verkehrszeichen_1 : 70|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACA_Querfuehrung : 71|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ Unknown_02 : 73|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Regelung_AIO : 75|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ACC_Wunschgeschw_02 : 76|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Vector__XXX + SG_ ACC_Abstandsindex_02 : 86|10@1+ (1,0) [1|1021] "" Vector__XXX + SG_ ACC_Display_Prio : 96|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_rel_Objekt_Zusatzanz : 98|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_Gesetzte_Zeitluecke : 101|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ACC_Optischer_Fahrerhinweis : 104|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Warnhinweis : 105|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_EGO_Fahrzeug : 106|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ACC_Relevantes_Objekt_02 : 109|2@1+ (1,0) [0|3] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ACC_Wunschgeschw_erreicht : 112|1@1+ (1,0) [0|1] "" OTA_FC + SG_ ACC_Anzeige_Zeitluecke : 113|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Texte_Primaeranz_02 : 114|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ ACC_Texte_Zusatzanz_02 : 120|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ STA_Primaeranz : 126|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_Event_Wunschgeschw : 140|10@1+ (0.32,0) [0|15] "" XXX + SG_ Heartbeat : 150|9@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0XFFFF : 160|16@1+ (1,0) [0|65535] "" XXX + SG_ ACC_Enabled : 186|1@0+ (1,0) [0|1] "" XXX + SG_ Zeitluecke_Farbe : 189|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X1 : 199|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Status_ACC : 208|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Akustischer_Fahrerhinweis : 211|2@1+ (1,0) [0|1] "" XXX + SG_ Unknown_08 : 224|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_01 : 225|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_06 : 226|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_07 : 228|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X7FFF : 240|16@1+ (1,0) [0|65535] "" XXX + SG_ Unknown_09 : 262|1@0+ (1,0) [0|3] "" XXX + SG_ Lead_Type_Detected : 265|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Standby_Override : 266|1@0+ (1,0) [0|1] "" XXX + SG_ Street_Color : 267|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Limiter_Mode : 268|1@0+ (1,0) [0|1] "" XXX + SG_ Lead_Brightness : 269|4@1+ (1,0) [0|7] "" XXX + SG_ SET_ME_0X6A : 273|8@1+ (1,0) [0|7] "" XXX + SG_ Lead_Position : 281|2@1+ (1,0) [0|1] "" XXX + SG_ Lead_Type : 287|3@1+ (1,0) [0|3] "" XXX + SG_ Lead_Distance : 290|10@1+ (0.2,0) [0|7] "Unit_Meter" XXX + SG_ Lead_Distance_Right : 300|10@1+ (0.2,0) [0|15] "Unit_Meter" XXX + SG_ Lead_Distance_Left : 310|10@1+ (0.2,0) [0|3] "Unit_Meter" XXX + SG_ ACC_Events : 332|4@0+ (1,0) [0|3] "Unit_Meter" XXX + SG_ Zeitluecke_1 : 334|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_2 : 344|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_3 : 354|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_4 : 364|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_5 : 374|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + +BO_ 771 HCA_03: 24 XXX + SG_ RequestStatus : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Power : 16|8@1+ (0.4,0) [0.0|100.0] "Unit_Percent" XXX + SG_ Curvature : 24|15@1+ (6.7e-06,0) [0|0.219] "Unit_rad/m" XXX + SG_ Curvature_VZ : 39|1@1+ (1,0) [0|1] "" XXX + SG_ Unknown_01 : 53|1@0+ (1,0) [0|1] "" XXX + SG_ Vibration : 56|1@0+ (1,0) [0|1] "" XXX + SG_ HighSendRate : 66|1@1+ (1,0) [0|1] "" XXX + +BO_ 792 MEB_Camera_03: 8 XXX + +BO_ 795 ESP_24: 8 Gateway + SG_ ESP_Lampe : 12|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ABS_Lampe : 13|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ BK_Lampe_02 : 14|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ TC_Lampe : 16|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_m_Raddrehz : 17|15@1+ (0.002,0) [0|65.278] "Unit_Hertz" Sub_Gateway + SG_ ESP_Textanzeigen_03 : 32|5@1+ (1,0) [0|31] "" Sub_Gateway + SG_ ESP_Meldungen : 37|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ ESP_Wegimp_VA : 40|11@1+ (1,0) [0|2047] "" Sub_Gateway + SG_ ESP_Fehlerstatus_Wegimp : 51|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_Wegimp_Ueberlauf : 52|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_QBit_Wegimp_VA : 53|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_HDC_Geschw_Farbe : 54|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_Off_Lampe : 55|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ ESP_HDC_Regelgeschw : 56|7@1+ (0.32,0) [0.32|39.68] "Unit_KiloMeterPerHour" Sub_Gateway + SG_ ESP_BKV_Warnung : 63|1@1+ (1,0) [0|1] "" Sub_Gateway + +BO_ 817 MFL_01: 8 Gateway + SG_ MFL_Zaehler : 0|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Toggle : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MFL_Lokalaktiv : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MFL_M_Taste : 6|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Paddle_Verbau : 7|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Tastencode_1 : 8|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ MFL_Tastencode_2 : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ MFL_Eventcode_1 : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Eventcode_2 : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Marke : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Variante : 36|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Dummy_0_Signal_1 : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ MFL_Tip_Down : 48|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Tip_Up : 49|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_SatModul_links_Err : 50|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_SatModul_rechts_Err : 51|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Dummy_0_Signal_2 : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MFL_Dummy_0_Signal_3 : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MFL_LR_HZG_Status : 54|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_LR_HZG_Err : 55|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Signalhorn : 56|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ MFL_Signalhorn_Err : 57|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Tip_links_Err : 58|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Tip_rechts_Err : 59|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Taste_links_Err : 60|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Taste_rechts_Err : 61|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_ECU_Err : 62|1@1+ (1,0) [0|1] "" ZR_High + SG_ MFL_Response_Err : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 850 Parken_SM_03: 8 Gateway + SG_ Parken_SM_03_MUX M : 0|3@1+ (1,0) [0|7] "" DDA + SG_ Parken_SM_03_Traj_Trans_ID_00 m0 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P1_Pos_X m0 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P1_Pos_Y m0 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P1_Tangent m0 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P2_Pos_X m0 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_SM_03_Traj_Trans_ID_01 m1 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P2_Pos_Y m1 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P2_Tangent m1 : 20|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P3_Pos_X m1 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P3_Pos_Y m1 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_SM_03_Traj_Trans_ID_02 m2 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P3_Tangent m2 : 7|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P4_Pos_X m2 : 17|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P4_Pos_Y m2 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P4_Tangent m2 : 43|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_SM_03_Traj_Trans_ID_03 m3 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P5_Pos_X m3 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P5_Pos_Y m3 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P5_Tangent m3 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P6_Pos_X m3 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_SM_03_Traj_Trans_ID_04 m4 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P6_Pos_Y m4 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P6_Tangent m4 : 20|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P7_Pos_X m4 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P7_Pos_Y m4 : 43|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_SM_03_Traj_Trans_ID_05 m5 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P7_Tangent m5 : 7|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_Traj_P8_Pos_X m5 : 17|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P8_Pos_Y m5 : 30|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P8_Tangent m5 : 43|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + SG_ Parken_SM_03_Traj_Trans_ID_06 m6 : 3|4@1+ (1,0) [0|15] "" DDA + SG_ Parken_Traj_P9_Pos_X m6 : 7|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P9_Pos_Y m6 : 20|13@1+ (0.5,-2047.5) [-2047.5|2048] "Unit_Centimeter" DDA + SG_ Parken_Traj_P9_Tangent m6 : 33|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" DDA + +BO_ 869 NVEM_05: 8 Gateway + SG_ NVEM_05_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NVEM_05_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ NVEM_Pilot_Info : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ NVEM_P_Generator_Status : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Vector__XXX + SG_ BEM_n_LLA : 24|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BEM_Anf_KL : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BEM_StartStopp_Info : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BEM_DFM : 32|5@1+ (3.225,0.025) [0.025|100] "" Vector__XXX + SG_ BEM_Batt_Ab : 38|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_IHEV + SG_ BEM_Hybrid_Info : 44|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ NVEM_Red_KL : 46|2@1+ (1,0) [0|3] "" TME + SG_ NVEM_Freilauf_Info : 48|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BEM_HYB_DC_uSollLV : 50|6@1+ (0.1,10.6) [10.6|16] "Unit_Volt" DCDC_800V_PAG,DCDC_HV,LE_MLBevo + SG_ BEM_HYB_DC_uMinLV : 56|8@1+ (0.1,0) [0|25.3] "Unit_Volt" Vector__XXX + +BO_ 870 Blinkmodi_02: 8 Gateway + SG_ BM_ZV_auf : 12|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_ZV_zu : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_DWA_ein : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_DWA_Alarm : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Crash : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Panik : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Not_Bremsung : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_GDO : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BM_Warnblinken : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Taxi_Notalarm : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Telematik : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_links : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_rechts : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ Blinken_li_Fzg_Takt : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ Blinken_re_Fzg_Takt : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ Blinken_li_Kombi_Takt : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ Blinken_re_Kombi_Takt : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BM_NBA_n_codiert_n_aktiv : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BM_NBA_Status : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BM_WBT_Beleuchtung : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_HD_Oeffnung_angelernt : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BM_Autobahn : 34|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ BM_Rollenmodus_Blinken : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BM_Recas : 36|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Wischblinken : 37|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_Telematik_Abbruchgrund : 38|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ BM_PiloPa : 44|1@1+ (1,0) [0|1] "" ZR_High + SG_ Unknown_01 : 45|2@1+ (1,0) [0|3] "" XXX + SG_ DWA_Alarmquelle : 59|5@1+ (1,0) [0|31] "" ZR_High + +BO_ 888 GNSS_04: 8 Gateway + SG_ GNSS_Nachrichtenpaket_ID4 : 0|2@1+ (1,0) [0|3] "Unit_Bit" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Ortung_Zeit_in_GPSWoche : 2|30@1+ (1,0) [0|604800001] "Unit_MilliSecon" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Ortung_Hoehe : 32|12@1+ (2,-500) [-500|7686] "Unit_Meter" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + +BO_ 891 GNSS_05: 8 Gateway + SG_ GNSS_UTC_Zeit : 0|32@1+ (1,0) [1|4294967295] "Unit_Secon" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Empfaenger_Status : 32|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_GPS_in_Nutzung : 33|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_GLONASS_in_Nutzung : 34|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Empfangbare_Satelliten : 35|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Sichtbare_Satelliten : 40|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Genutzte_Satelliten : 45|5@1+ (1,0) [1|30] "Unit_None" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GNSS_Nachrichtenpaket_ID5 : 50|2@1+ (1,0) [0|3] "Unit_Bit" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + +BO_ 896 APS_Master: 8 XXX + SG_ Active : 54|1@0+ (1,0) [0|1] "" XXX + SG_ Distance : 55|9@1+ (1,0) [0|255] "" XXX + +BO_ 916 WBA_03: 8 Gateway + SG_ WBA_03_CRC : 0|8@1+ (1,0) [0|255] "" Sub_Gateway + SG_ WBA_03_BZ : 8|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_Fahrstufe_02 : 12|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_ZielFahrstufe : 16|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_GE_Warnung_02 : 20|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_eing_Gang_02 : 24|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_GE_Texte : 28|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ WBA_Segeln_aktiv : 31|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ WBA_Schaltschema : 32|5@1+ (1,0) [0|31] "" Sub_Gateway + SG_ WBA_GE_Zusatzwarnungen : 37|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ GE_Sollgang : 40|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ GE_Tipschaltempf_verfuegbar : 44|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ WBA_GE_Texte_02 : 45|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ WBA_GE_Texte_03 : 48|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ WBA_Blinken : 54|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Wiederstart_Anz_Std : 55|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_01 : 56|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_02 : 57|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_03 : 58|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_04 : 59|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_05 : 60|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_06 : 61|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_07 : 62|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ GE_Stoppverbot_Anz_Std : 63|1@1+ (1,0) [0|1] "" Sub_Gateway + +BO_ 919 LDW_02: 8 XXX + SG_ LDW_Gong : 12|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_SW_Warnung_links : 14|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_SW_Warnung_rechts : 15|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Texte : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Seite_DLCTLC : 20|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Lernmodus : 21|3@1+ (1,0) [0|7] "" XXX + SG_ LDW_Anlaufsp_VLR : 24|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Vib_Amp_VLR : 28|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Anlaufzeit_VLR : 32|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Lernmodus_rechts : 36|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Lernmodus_links : 38|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_DLC : 40|8@1+ (0.01,-1.25) [-1.25|1.25] "Unit_Meter" XXX + SG_ LDW_TLC : 48|5@1+ (0.1,0) [0|3] "Unit_Secon" XXX + SG_ LDW_Warnung_links : 56|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Warnung_rechts : 57|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Codierinfo_fuer_VLR : 58|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Frontscheibenheizung_aktiv : 60|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Status_LED_gelb : 61|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Status_LED_gruen : 62|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_KD_Fehler : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 949 Klima_11: 8 Gateway + SG_ KL_Drehz_Anh : 0|1@1+ (1,0) [0|1] "" TME + SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1,0) [0|1] "" TME + SG_ KL_AC_Schalter : 2|1@1+ (1,0) [0|1] "" TME + SG_ KL_Komp_Moment_alt : 3|1@1+ (1,0) [0|1] "" TME + SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Zustand : 7|1@1+ (1,0) [0|1] "" TME + SG_ KL_Kompressorkupplung_linear : 8|8@1+ (20,0) [0|4000] "Unit_MilliAmper" Vector__XXX + SG_ KL_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" TME + SG_ KL_Charisma_Status : 20|2@1+ (1,0) [0|3] "" TME + SG_ KL_nachtr_Stopp_Anf : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_T_Charge : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0|63.5] "Unit_NewtoMeter" TME + SG_ KL_Spannungs_Anf : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Thermomanagement : 34|2@1+ (1,0) [0|3] "" TME + SG_ KL_StartStopp_Info : 36|2@1+ (1,0) [0|3] "" TME + SG_ KL_Freilauf_Info : 38|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" TME + SG_ KL_el_Zuheizer_Stufe : 48|3@1+ (1,0) [0|7] "" TME + SG_ KL_Ausstattung_Klima : 51|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ KL_Variante_Standheizung : 54|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 958 Motor_14: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ MO_StartStopp_Status : 12|2@1+ (1,0) [0|3] "" Sub_Gateway,TME + SG_ MO_StartStopp_Wiederstart : 14|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway,TME + SG_ MO_StartStopp_Motorstopp : 15|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway,TME + SG_ MO_Freig_Reku : 16|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Kl_75 : 18|1@1+ (1,0) [0|1] "" Sub_Gateway,TME + SG_ MO_Kl_50 : 19|1@1+ (1,0) [0|1] "" DCDC_IHEV,Ladegeraet_Konzern,Sub_Gateway + SG_ MO_Gangposition : 20|4@1+ (1,0) [0|15] "" AWC,Sub_Gateway,TME + SG_ MO_StartStopp_Fahrerwunsch : 24|2@1+ (1,0) [0|3] "" Sub_Gateway,TME + SG_ MO_HYB_Fahrbereitschaft : 26|1@1+ (1,0) [0|1] "" AWC,BMS_NV,Ladegeraet_Konzern,Sub_Gateway,TME + SG_ MO_Ext_E_Fahrt_aktiv : 27|1@1+ (1,0) [0|1] "" Sub_Gateway,TME + SG_ MO_Fahrer_bremst : 28|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_QBit_Fahrer_bremst : 29|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_BLS : 30|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Konsistenz_Bremsped : 31|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_KomFehler_ESP : 32|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Klima_Eingr : 33|2@1+ (1,0) [0|3] "" Sub_Gateway,TME + SG_ MO_Aussp_Anlass : 35|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Freig_Anlass : 36|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Kuppl_schalter : 37|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Interlock : 38|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Motor_laeuft : 39|1@1+ (1,0) [0|1] "" Sub_Gateway,TME + SG_ MO_Kickdown : 40|1@1+ (1,0) [0|1] "" Sub_Gateway,TME + SG_ MO_QBit_KL_75 : 41|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_EKlKomLeiRed : 42|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Handshake_STH : 44|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_BKV_Unterdruckwarnung : 45|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Freigabe_Segeln : 46|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_PTC_Status : 47|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ MO_QBit_Gangposition : 50|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Signalquelle_Gangposition : 51|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Remotestart_Betrieb : 52|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Remotestart_moeglich : 53|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_FMAus_aktiv : 55|1@1+ (1,0) [0|1] "" BMS_NV,Sub_Gateway + SG_ MO_FMAus_Startvariante : 56|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_BMS_NV_Anf_stuetzen : 58|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Zylinderabschaltung : 59|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_HYB_VM_aktiv : 61|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_StartVorauss_erfuellt : 62|2@1+ (1,0) [0|3] "" AWC,Ladegeraet_Konzern,Sub_Gateway + +BO_ 960 Klemmen_Status_01: 4 Gateway + SG_ Klemmen_Status_01_CRC : 0|8@1+ (1,0) [0|255] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ Klemmen_Status_01_BZ : 8|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ RSt_Fahrerhinweise : 12|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_S : 16|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,GurtMikrofon,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_15 : 17|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,GurtMikrofon,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_X : 18|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_50_Startanforderung : 19|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM_Remotestart_Betrieb : 20|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZAS_Kl_Infotainment : 21|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM_Remotestart_KL15_Anf : 22|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM_Remotestart_MO_Start : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Warn_P1_ZST_def : 24|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Warn_P2_ZST_def : 25|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_1 : 26|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_2 : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM_Ausparken_Betrieb : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_4 : 29|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_5 : 30|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ KST_Fahrerhinweis_6 : 31|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + +BO_ 967 Motor_26: 8 Gateway + SG_ MO_Kuehlerluefter_MUX M : 0|1@1+ (1,0) [0|1] "" TME + SG_ MO_Kuehlerluefter_1 m0 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" TME + SG_ MO_Kuehlerluefter_2 m1 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" TME + SG_ MO_EFLEX_Lampe : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_KJS_nicht_bereit : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_ITM_Warnung_Pumpe : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Anzeige_aktiv : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelmin_Warn : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Sensorfehler : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Schieflage : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ MO_Zustand_HWP : 20|2@1+ (1,0) [0|3] "" TME + SG_ OLEV_Systemstoerung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Oelwarnung_max : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_nicht_betriebswarm : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_laufender_Motor : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_E_Warnungen : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MO_Text_Motorstart : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MO_E_Texte : 36|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ WIV_Oeldyn_avl : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ OLEV_Oelstand_nicht_vorhanden : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Vector__XXX + SG_ MO_Systemlampe : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_OBD2_Lampe : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Heissleuchte : 50|1@1+ (1,0) [0|1] "" TME + SG_ MO_Partikel_Lampe : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_RedFahrleistung_Lampe : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Unterfuell_Warn : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Vorglueh_Lampe : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_E_Mode : 61|3@1+ (1,0) [0|7] "" Vector__XXX + +BO_ 974 TSG_HFS_01: 8 Gateway + SG_ HFS_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Heckrollotaster_betaetigt : 3|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Tuerschloss_defekt : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_HBFS_AutoHoch : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_HBFS_AutoTief : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_HBFS_ManHoch : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_HBFS_ManTief : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Tuer_Status : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HFS_SAD_Schalter : 16|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HFS_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ HFS_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Tueroeffnen_Warnung : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_Warnung_aktiv_HFS : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Seitenrollo_hoch : 42|1@1+ (1,0) [0|1] "" TME + SG_ HFS_Seitenrollo_tief : 43|1@1+ (1,0) [0|1] "" TME + SG_ HFS_Status_KiSi : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SSR_HFS_Pos_Unten : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHFS_M_Taste : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHFS_Pos1 : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHFS_Pos2 : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHFS_Pos3 : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_MRollo_Schalter : 52|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HFS_Lock_Taster_inv : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_Status_eTAG : 56|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HFS_Tuer_Status_QBit : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HFS_TCR_Mode_aktiv : 59|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 975 TSG_HBFS_01: 8 Gateway + SG_ HBFS_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Heckrollotaster_betaetigt : 3|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Tuerschloss_defekt : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_HFS_AutoHoch : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_HFS_AutoTief : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_HFS_ManHoch : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_HFS_ManTief : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Tuer_Status : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HBFS_SAD_Schalter : 16|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HBFS_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ HBFS_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Tueroeffnen_Warnung : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_Warnung_aktiv_HBFS : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Seitenrollo_hoch : 42|1@1+ (1,0) [0|1] "" TME + SG_ HBFS_Seitenrollo_tief : 43|1@1+ (1,0) [0|1] "" TME + SG_ HBFS_Status_KiSi : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SSR_HBFS_Pos_Unten : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHBFS_M_Taste : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHBFS_Pos1 : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHBFS_Pos2 : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MTHBFS_Pos3 : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_MRollo_Schalter : 52|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HBFS_Lock_Taster_inv : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Status_KiSi_inv : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_Status_eTAG : 57|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HBFS_Tuer_Status_QBit : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_TIG_betaetigt_schliessen : 60|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 976 TSG_FT_01: 8 Gateway + SG_ FT_Tuer_geoeffnet : 0|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern,TME + SG_ FT_verriegelt : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_gesafet : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Schluesselschalter_auf : 3|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV + SG_ FT_Schluesselschalter_zu : 4|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV + SG_ FT_Unlock_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Lock_Taster : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Sperrklinke : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_TAG_betaetigt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_TIG_betaetigt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_IRUE_Taste : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_HD_Taste : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_TD_Taste_Fehler : 12|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern + SG_ FT_TD_Taste : 13|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Ladegeraet_Konzern + SG_ SSR_Temp_Freigabe : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Sp_Heizung_Anf : 15|1@1+ (100,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ FT_HD_Taste_2 : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_TSG_hinten_verbaut : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Sp_Blk_def : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_S_ManHoch : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_S_AutoHoch : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_S_ManTief : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_S_AutoTief : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Oeffnung : 24|8@1+ (0.5,0) [0|100] "Unit_PerCent" TME + SG_ FT_FH_Bew_hoch : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Bew_tief : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Fang : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Block : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Thermo : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_UEKB_aktiviert : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_HMI_defekt : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_normiert : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Schliesstaster : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Zuziehhilfe_aktiv : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_ausgerastet : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_lr_aktiv : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_ht_aktiv : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_wakeup : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Oben_Block_erw : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Unten_Block_erw : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_li_aktiv : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_re_aktiv : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_Taster_li : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_Taster_re : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_BFS_Fond_Freigabe : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_Fehler : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Daemmglas : 54|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_Heizung_Status : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ASW_Warnung_aktiv_FS : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_FH_Pos_oben : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Tuerschloss_defekt : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SWA_Taster : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_HMI_Diagnose : 60|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ FS_Status_eTAG : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 980 SMLS_01: 8 Gateway + SG_ SMLS_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ SMLS_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BH_Blinker_li : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ BH_Blinker_re : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ BH_Lichthupe : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ BH_Fernlicht : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Tipwischen : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Intervall : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_WischerStufe1 : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_WischerStufe2 : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Frontwaschen : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Heckintervall : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Heckwaschen : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Intervallstufen : 23|4@1+ (1,0) [0|15] "" ZR_High + SG_ FAS_Taster : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ FAS_Taster_Fehler : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_Hupe : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LRH_On_Off : 30|2@1+ (1,0) [0|3] "" ZR_High + SG_ LRH_aktiv : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_P_verriegelt_plausibel : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WH_SRA : 44|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ WH_Wischer_Fehler : 45|1@1+ (1,0) [0|1] "" ZR_High + SG_ BH_Blinker_Fehler : 46|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_PTT : 47|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WH_Tipwischen_lang : 48|1@1+ (1,0) [0|1] "" ZR_High + +BO_ 981 Licht_Anf_01: 8 Gateway + SG_ Licht_Anf_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Licht_Anf_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BCM1_Kurvenlicht_links_Anf : 12|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Kurvenlicht_rechts_Anf : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Standlicht_Anf : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Abblendlicht_Anf : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ BCM1_Fernlicht_Anf : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Nebellicht_Anf : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Parklicht_li_Anf : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Parklicht_re_Anf : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Nebelschluss_Ahg_Anf : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Nebelschluss_Fzg_Anf : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Schlusslicht_Anf : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM_Rueckfahrlicht_Anf : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ BCM1_Signaturlicht_Anf : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Umfeldleuchten_Anf : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Tagfahrlicht_Anf : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Regenlicht_Anf : 27|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Autobahnlicht_Anf : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Touristen_Licht_Anf : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_CH_aktiv : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_LH_aktiv : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Gleitende_Leuchtw_Anf : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_GLW_Fernlicht_Anf : 33|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Adaptive_Lichtvert_Anf : 34|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_FoD_Sperrung_WiBli : 35|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM1_FOD_Sperrung_Animationen_HL : 37|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM1_Animationssperrung : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_CH_LH_aktiv : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Allwetterlicht_Anf : 41|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Schlusslicht_Signatur : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 982 Licht_hinten_01: 8 Gateway + SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Aussenlicht_def : 7|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Blinker_HL_akt : 14|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Blinker_HR_akt : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LH_Blinker_li_def : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Bremsl_li_def : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schlusslicht_li_def : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Rueckf_li_def : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Nebel_li_def : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Zusatzschlussl_def : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Brems_Blk_li_def : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Diag_Status_re_def : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Diag_Status_li_def : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Diag_LED_li_def : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Diag_LED_re_def : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Blinker_re_def : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Bremsl_re_def : 33|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schlusslicht_re_def : 34|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Rueckf_re_def : 35|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Nebel_re_def : 36|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Brems_mi_def : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Brems_Blk_re_def : 43|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Kennzl_def : 48|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_3_Bremsl_def : 49|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Nebel_mi_def : 50|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Rueckf_mi_def : 51|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Schlusslicht_mi_def : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_mi_def : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1,0) [0|1] "" ZR_High + SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1,0) [0|1] "" ZR_High + +BO_ 987 Gateway_72: 8 Gateway_MQB + SG_ BCM_01_alt : 0|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ SMLS_01_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ZV_02_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Wischer_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Anhaenger_01_alt : 4|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ Klima_Sensor_02_alt : 5|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ VSG_01_alt : 6|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ Klima_01_alt : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_01_alt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Licht_Anf_01_alt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HFS_offen : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HBFS_offen : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VS_VD_offen_ver : 22|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ VS_VD_zu_ver : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_BT_offen : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Rueckfahrlicht_Schalter : 25|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ZV_FT_offen : 26|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Wischer_vorne_aktiv : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Anhaenger_erkannt : 28|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ BCM1_MH_Schalter : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HD_offen : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Waschen_vorne_aktiv : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Thermomanagement : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WFS_Schluessel_Fahrberecht : 34|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BCM1_RFahrlicht_Fzg_Anf : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_RFahrlicht_Ahg_Anf : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Fernlicht : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Blinker_li : 50|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BH_Blinker_re : 51|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_OBD_FStatus_ATemp : 52|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_Aussen_Temp_ungef : 56|8@1+ (0.5,-50) [-50|76] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 988 Gateway_73: 8 XXX + SG_ UNKNOWN_1 : 15|2@0+ (1,0) [0|3] "" XXX + SG_ GE_Fahrstufe : 40|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_Status : 53|3@1+ (1,0) [0|7] "" XXX + SG_ UNKNOWN_2 : 58|3@0+ (1,0) [0|7] "" XXX + +BO_ 997 TSG_FT_02: 8 Gateway + SG_ TSG_FT_02_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ TSG_FT_02_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ FT_Tuer_Status : 12|2@1+ (1,0) [0|3] "" OTA_FC,ZR_High + SG_ FT_Tuer_Status_QBit : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_Lock_Taster_02 : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_Schluesselschalter_zu_02 : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_BFS_Tuer_Status : 17|2@1+ (1,0) [0|3] "" ZR_High + SG_ FT_HBFS_Tuer_Status : 19|2@1+ (1,0) [0|3] "" ZR_High + SG_ FT_HFS_Tuer_Status : 21|2@1+ (1,0) [0|3] "" ZR_High + SG_ FT_Tueroeffnen_Warnung : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_SP_Heizung_ein : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FT_Kisi_Taster_li_02 : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_Kisi_Taster_re_02 : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ FT_TD_Taste_Status : 27|2@1+ (1,0) [0|3] "" ZR_High + SG_ FT_TCR_Mode_aktiv : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FS_Push_Tuergriff : 36|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1004 MEB_TSK_01: 8 XXX + SG_ TSK_State : 53|3@1+ (1,0) [0|7] "" XXX + +BO_ 1031 PLA_04: 8 XXX + +BO_ 1122 PSD_04: 8 ZR_High + SG_ PSD_Segment_ID : 0|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Vorgaenger_Segment_ID : 6|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Segmentlaenge : 12|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Strassenkategorie : 19|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Endkruemmung : 22|8@1+ (1,0) [0|254] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Endkruemmung_Vorz : 30|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Idenditaets_ID : 31|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_ADAS_Qualitaet : 37|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_wahrscheinlichster_Pfad : 38|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Geradester_Pfad : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Fahrspuren_Anzahl : 40|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Bebauung : 43|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Segment_Komplett : 44|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Rampe : 45|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Anfangskruemmung : 47|8@1+ (1,0) [0|254] "" Gateway,Gateway_PAG + SG_ PSD_Anfangskruemmung_Vorz : 55|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Abzweigerichtung : 56|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Abzweigewinkel : 57|7@1+ (1.417323,0) [0|180.000021] "" Gateway,Gateway_PAG + +BO_ 1123 PSD_05: 8 ZR_High + SG_ PSD_Pos_Segment_ID : 0|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Segmentlaenge : 6|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Pos_Inhibitzeit : 13|5@1+ (10,0) [0|310] "Unit_MilliSecon" Gateway,Gateway_PAG + SG_ PSD_Pos_Standort_Eindeutig : 18|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Fehler_Laengsrichtung : 19|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Fahrspur : 22|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Attribut_Segment_ID_05 : 25|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_ID : 31|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_Wert : 36|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_Offset : 40|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_ID : 47|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_Wert : 52|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_Offset : 56|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribute_Komplett_05 : 63|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + +BO_ 1124 PSD_06: 8 ZR_High + SG_ PSD_06_Mux M : 0|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Segment_ID m0 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Laendercode m0 : 9|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geschwindigkeit_Einheit m0 : 17|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Verkehrsrichtung m0 : 18|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geometrieguete m0 : 19|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Mapmatchingguete m0 : 21|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Alter_Karte m0 : 23|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Zielfuehrung m0 : 26|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Sys_US_State m0 : 27|6@1+ (1,0) [0|63] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Geometrien m0 : 33|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Ortsinfo m0 : 36|2@1+ (1,0) [0|3] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_verfuegbar m0 : 38|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Zielfuehrung_geaendert m0 : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geometrieguete_erweitert m0 : 40|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_sonstige_Attribute m0 : 48|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Steigungen m0 : 51|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Strassenkennz m0 : 54|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Tempolimits m0 : 57|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Vorfahrtsregelung m0 : 60|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Attribut_Segment_ID m1 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_ID m1 : 9|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_Offset m1 : 14|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_Wert m1 : 21|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_ID m1 : 25|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_Wert m1 : 30|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_Offset m1 : 34|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_ID m1 : 41|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_Offset m1 : 46|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_Wert m1 : 53|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribute_Komplett_06 m1 : 57|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Segment_ID m2 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Offset m2 : 9|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit m2 : 16|5@1+ (1,0) [0|31] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Ges_Typ m2 : 21|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Spur_Geschw_Begrenzung m2 : 23|6@1+ (1,0) [0|63] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Gespann m2 : 29|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Witter m2 : 31|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Tag_Anf m2 : 33|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Tag_Ende m2 : 36|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Std_Anf m2 : 39|5@1+ (1,0) [0|24] "Unit_Hours" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Std_Ende m2 : 44|5@1+ (1,0) [0|24] "Unit_Hours" Gateway,Gateway_PAG + SG_ PSD_Ges_Ueberholverbot m2 : 49|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Wechselverkehrszeichen m2 : 51|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Wechselverkehrszeichen_Typ m2 : 54|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Gesetzlich_Kategorie m2 : 56|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Gesetzlich_Zusatz m2 : 59|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Verkehrszeichen_Quelle m2 : 61|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Attribute_Komplett m2 : 63|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Laenge_VZ m3 : 3|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Laenge m3 : 4|25@1+ (1e-05,0) [0|180] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Baum_Breite_VZ m3 : 29|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Breite m3 : 30|24@1+ (1e-05,0) [0|90] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Baum_Ausrichtung m3 : 54|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_Segment_ID m4 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Steigung m4 : 9|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Vorz m4 : 16|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Offset m4 : 17|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Steigung m4 : 24|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Vorz m4 : 31|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Offset m4 : 32|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_Attribute_kompl m4 : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Segment_ID m4 : 40|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Steigung m4 : 46|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Vorz m4 : 53|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Offset m4 : 54|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Attribute_kompl m4 : 61|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + +BO_ 1153 MainUnit_01: 8 ZR_High + SG_ ZR_LoGeWa_Event_Kombiwarnung : 0|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ Nav_FoD_Status : 4|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ MIB_Tongenerator_PH_verfuegbar : 9|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ MMI_Counter_Bedienevent : 12|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ DSSS_Warning : 16|5@1+ (1,0) [0|31] "" Gateway,Gateway_PAG + SG_ ZR_Kindersicherung_RSE : 21|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ ZR_RSE_aktivieren : 22|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ MMI_SDS_aktiv : 23|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ MU_SecondDisplay : 24|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ MMI_Telefon_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ MMI_Gurt_Mic_ref : 28|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,GurtMikrofon + SG_ ZR_Sta_Inszenierung : 29|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ MMI_Gauges_active : 31|1@1+ (1,0) [0|1] "" BedienDisp_vo,Gateway,Gateway_PAG + SG_ MU_Update_Time : 32|8@1+ (0.1,0) [0|25.5] "Unit_Hours" Gateway,Gateway_PAG + SG_ ZR_MXB_Manoever_Ansage : 42|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ ZR_LAPP_Sondermodus_Status : 44|2@1+ (1,0) [0|3] "" DDA,Gateway,Gateway_PAG + SG_ MMI_StartStopp_Info : 46|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ ZR_Parken_Sondermodus : 48|4@1+ (1,0) [0|15] "" DDA,Gateway,Gateway_PAG + SG_ ZR_Rundenbewertung : 52|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ ZR_Rundenfortschritt : 56|8@1+ (0.5,0) [0|100] "Unit_PerCent" Gateway,Gateway_PAG + +BO_ 1155 Motor_Hybrid_06: 8 Gateway + SG_ Mo_Powermeter_Grenze : 0|12@1+ (1,0) [0|4092] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ MO_Text_Aktivierung_Antrieb : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MO_Powermeter_Inszenierung_aktiv : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Powermeter_Charge_Grenze : 18|10@1+ (1,0) [0|1021] "Unit_None" Vector__XXX + SG_ MO_Powermeter_Grenze_strategisch : 28|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX + SG_ MO_Powermeter_untere_E_Grenze : 40|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX + SG_ MO_Powermeter_obere_E_Grenze : 52|12@1+ (1,0) [0|4093] "Unit_None" Vector__XXX + +BO_ 1163 BEM_06: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 1175 Parkhilfe_01: 8 Gateway + SG_ PH_Visualisierung : 0|3@1+ (1,0) [0|7] "" AWC + SG_ PDC_Tonausgabe_Front : 4|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PDC_Tonausgabe_Heck : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_nachtr_Stopp_Anf : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Abschaltursache : 13|3@1+ (1,0) [0|7] "" AWC + SG_ PH_Opt_Anzeige_V_ein : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Opt_Anzeige_H_ein : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Opt_Anz_V_Hindernis : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Opt_Anz_H_Hindernis : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Tongeber_V_aktiv : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Tongeber_H_aktiv : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Tongeber_mute : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Anf_Audioabsenkung : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Tongeber_H_verfuegbar : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PLA_Anf_Aufschaltung_RVC : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Taster : 28|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PH_Anf_Verdeck : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PH_Frequenz_hinten : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_Lautstaerke_hinten : 36|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_Frequenz_vorn : 40|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_Lautstaerke_vorn : 44|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_StartStopp_Info : 49|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PH_Stoermeldung : 52|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_defekt : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_gestoert : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ PH_Systemzustand : 58|3@1+ (1,0) [0|7] "" AWC + SG_ PH_Display_Kundenwunsch : 61|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1283 HVK_01: 8 Gateway + SG_ HVK_01_CRC : 0|8@1+ (1,0) [0|255] "" BMC_MLBevo,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo,TME + SG_ HVK_01_BZ : 8|4@1+ (1,0) [0|15] "" BMC_MLBevo,DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo,TME + SG_ HVK_Istmodus_Anf : 12|1@1+ (1,0) [0|1] "" BMC_MLBevo,DCDC_HV,FCU_MLBevo_FCEV,Ladegeraet_2,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo + SG_ HVK_TN1_Sollmodus : 13|2@1+ (1,0) [0|3] "" DCDC_HV_02,FCU_MLBevo_FCEV + SG_ HVK_MO_EmSollzustand : 16|8@1+ (1,0) [0|255] "" FCU_MLBevo_FCEV + SG_ HVK_BMS_Sollmodus : 24|3@1+ (1,0) [0|7] "" BMC_MLBevo,FCU_MLBevo_FCEV + SG_ HVK_DCDC_Sollmodus : 27|3@1+ (1,0) [0|7] "" DCDC_800V_PAG,DCDC_HV,FCU_MLBevo_FCEV,LE_MLBevo + SG_ HVK_EKK_Sollmodus : 30|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,TME + SG_ HVK_HVPTC_Sollmodus : 33|3@1+ (1,0) [0|7] "" FCU_MLBevo_FCEV,TME + SG_ HVK_HVLM_Sollmodus : 36|3@1+ (1,0) [0|7] "" DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_Konzern + SG_ HVK_HV_Netz_Warnungen : 39|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV + SG_ HV_Bordnetz_aktiv : 41|1@1+ (1,0) [0|1] "" DCDC_HV_02,FCU_MLBevo_FCEV,Ladegeraet_Konzern,LE1,LE2,LE_MLBevo + SG_ HV_Bordnetz_Fehler : 42|1@1+ (1,0) [0|1] "" FCU_MLBevo_FCEV,Ladegeraet_Konzern,TME + SG_ HVK_Gesamtst_Spgfreiheit : 43|2@1+ (1,0) [0|3] "" FCU_MLBevo_FCEV + SG_ HVK_AktiveEntladung_Anf : 45|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_HV,DCDC_HV_02,FCU_MLBevo_FCEV,LE1,LE2,LE_MLBevo + SG_ HVK_Iso_Messung_Start : 50|3@1+ (1,0) [0|7] "" BMC_MLBevo,FCU_MLBevo_FCEV + SG_ HVK_DCDC_EKK_Sollmodus : 62|2@1+ (1,0) [0|3] "" DCDC_800V_PAG,FCU_MLBevo_FCEV + +BO_ 1312 Airbag_02: 8 Gateway + SG_ LoGeWa_Event_Kombiwarnung : 12|4@1+ (1,0) [0|15] "" ZR_High + SG_ AB_Anforderung_eCall : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ AB_Anprall_Seite_Beifahrer : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Rollover : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_FGS : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Front_Beifahrer : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Front_Fahrer : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Heck_Beifahrer : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Anprall_Heck_Fahrer : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AB_Wickelklappung_Reihe2_MI : 24|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Belegung_VB : 26|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Abschaltanf_SIH_BF : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ AB_Anprall_Seite_Fahrer : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SC_PAO_Schriftzug_Anf : 30|2@1+ (1,0) [0|3] "" ZR_High + SG_ SC_PAO_ON_Anf : 32|2@1+ (1,0) [0|3] "" ZR_High + SG_ SC_PAO_OFF_Anf : 34|2@1+ (1,0) [0|3] "" ZR_High + SG_ AB_Crashschwere : 36|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ AB_Anforderung_USM : 39|1@1+ (1,0) [0|1] "" ZR_Standard + SG_ AB_Gurtschloss_FA : 40|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High + SG_ AB_Gurtschloss_BF : 42|2@1+ (1,0) [0|3] "" BedienSG_hi,GurtMikrofon,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High + SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High + SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1,0) [0|3] "" BedienSG_hi,ZR_High + SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1,0) [0|3] "" ZR_High + SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1,0) [0|3] "" ZR_High + SG_ AB_Wickelklappung_Reihe2_BF : 60|2@1+ (1,0) [0|3] "" ZR_High + SG_ AB_Wickelklappung_Reihe2_FA : 62|2@1+ (1,0) [0|3] "" ZR_High + +BO_ 1349 Airbag_04: 8 Gateway + SG_ AB_Gurtwarn_Reihe2_FA : 20|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe2_BF : 22|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AbstWarn_MV_FAS_Fkt_Status : 24|2@1+ (1,0) [0|3] "" ZR_High + SG_ WarnBrems_Charisma_Status : 26|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WarnBrems_Charisma_FahrPr : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe2_MI : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe3_FA : 34|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe3_MI : 36|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AB_Gurtwarn_Reihe3_BF : 38|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ LGI_FAS_Fkt_Status : 40|2@1+ (1,0) [0|3] "" ZR_High + SG_ PreCrash_FAS_Fkt_Status : 42|3@1+ (1,0) [0|7] "" ZR_High + SG_ AB_SBR_hinten_verbau : 48|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AWV_Einstellung_System_ASG : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_Einstellung_Warnung_ASG : 52|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreSense_Modus_Warnung_NV : 55|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreSense_Modus_Warnung_MV : 58|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ SC_PreSense_Modus_System_MV : 61|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SC_PreSense_Modus_System_NV : 62|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SC_PreSense_Modus_System_KAS : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1355 Parkhilfe_04: 8 Gateway + SG_ PH_Verschmutzungsmeldung : 12|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ PH_Aufschaltursache : 16|5@1+ (1,0) [0|31] "" AWC + SG_ PH_Ton_Ausgabe : 21|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PH_Ton_Pausenlaenge : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ PH_Ton_Richtung : 49|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PH_Ton_Lautstaerke : 52|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ BCM_WAH_Meldung : 55|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ PDC_Charisma_Status : 58|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ PDC_Charisma_FahrPr : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 1361 WFS_01: 8 Gateway + SG_ WFS_Schluessel_Fahrberecht : 0|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WFS_ID_Geb_autorisiert : 5|1@1+ (1,0) [0|1] "" ZR_High + SG_ WFS_ID_Geb_autorisiert_in_Kl15 : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_ID_Geb_steckt : 7|1@1+ (1,0) [0|1] "" ZR_High + SG_ WFS_Schluessel_Soll : 8|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WFS_Schluessel_Ist : 12|4@1+ (1,0) [0|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WFS_Safe : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_LZ : 17|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WFS_ELV_authorisiert : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_LF_Aktiv : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_Betrieb_Lesespule : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_Klemmenfreigabe : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_Fahrerhinweise : 34|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WFS_Parken_Status : 36|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1385 MEB_HVEM_03: 8 XXX + SG_ NEW_SIGNAL_12 : 0|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 1|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_10 : 3|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 4|2@1+ (1,0) [0|3] "" XXX + SG_ PTC_ON : 7|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 25|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_13 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 33|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_11 : 35|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_5 : 36|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_6 : 38|1@0+ (1,0) [0|1] "" XXX + SG_ PTC_ein_02 : 39|1@0+ (1,0) [0|1] "" XXX + SG_ PTC_ein_03 : 57|1@0+ (1,0) [0|1] "" XXX + SG_ PTC_ein_04 : 59|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_9 : 61|2@1+ (1,0) [0|3] "" XXX + +BO_ 1411 ZV_02: 8 Gateway + SG_ BCM_FH_Freigabe : 12|1@1+ (1,0) [0|1] "" BedienDisp_vo + SG_ BCM_Komfortfkt_Freigabe : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_HSK_Freigabe : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Verdeck_Freigabe : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_intern_ist : 16|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High + SG_ ZV_verriegelt_extern_ist : 17|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High + SG_ ZV_verriegelt_intern_soll : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_extern_soll : 19|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_gesafet_extern_ist : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_gesafet_extern_soll : 21|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ZV_Einzeltuerentriegelung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_Heckeinzelentriegelung : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_FT_offen : 24|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_BT_offen : 25|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HFS_offen : 26|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HBFS_offen : 27|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HD_offen : 28|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HS_offen : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ IRUE_aktiv : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ DWA_aktiv : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ HD_Hauptraste : 32|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ HD_Vorraste : 33|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ FFB_CarFinder : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FFB_Komfortoeffnen : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FFB_Komfortschliessen : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_Schluessel_Zugang : 42|4@1+ (1,0) [0|15] "" ZR_High + SG_ ZV_SafeFunktion_aktiv : 46|1@1+ (1,0) [0|1] "" ZR_High + SG_ FBS_Warn_Schluessel_Batt : 47|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Oeffnungsmodus : 48|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HFS_verriegelt : 50|1@1+ (1,0) [0|1] "" OTA_FC + SG_ HFS_gesafet : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_verriegelt : 52|1@1+ (1,0) [0|1] "" OTA_FC + SG_ HBFS_gesafet : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_ist_Zustand_verfuegbar : 54|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ IRUE_Taster_Fkts_LED : 55|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Tankklappe_offen : 56|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Rollo_auf : 57|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Rollo_zu : 58|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_SAD_auf : 59|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_SAD_zu : 60|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM_Tankklappensteller_Fehler : 61|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_soll : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1413 Systeminfo_01: 8 Gateway + SG_ SI_Sammel_SG_Fehler : 0|6@1+ (1,0) [0|60] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_Diagnose_Aktiv : 7|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_QRS_Mode : 8|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_T_Mode : 9|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_NWDF : 10|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_NWDF_gueltig : 11|1@1+ (1,0) [0|1] "" BedienDisp_vo,BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_Sammelfehler : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ GW_KD_Fehler : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_T_Schutz : 14|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_01 : 16|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_02 : 17|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_03 : 18|1@1+ (1,0) [0|1] "" BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_04 : 19|1@1+ (1,0) [0|1] "" BedienSG_hi,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_05 : 20|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_06 : 21|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_07 : 22|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_08 : 23|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_09 : 24|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_10 : 25|1@1+ (1,0) [0|1] "" BedienSG_hi,DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_11 : 26|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_12 : 27|1@1+ (1,0) [0|1] "" DDA,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_13 : 28|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_14 : 29|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_BUS_15 : 30|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_Bus_Identifikation : 32|8@1+ (1,0) [0|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ SI_CAB : 40|24@1+ (1,0) [0|16777215] "" BedienSG_hi,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + +BO_ 1420 Klemmen_Steuerung_01: 8 Gateway + SG_ Klemmen_Steuerung_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Klemmen_Steuerung_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KST_Txt_P_Gang : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_Txt_Panikabschaltung : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_Anf_Klemmenfreigabe_ELV : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_Txt_Komfortabschaltung : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_ZAT_betaetigt : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ KST_Unterdr_Zuendungsmeldung : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_aut_Abschaltung_Zuendung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KST_Anf_ZV_Verriegelung : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Relais_VoKo_angesteuert : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ RSt_Anforderung_HMS : 26|3@1+ (1,0) [0|7] "" Vector__XXX + +BO_ 1426 Kessy_04: 8 XXX + +BO_ 1440 RLS_01: 8 Gateway + SG_ LS_Helligkeit_IR : 0|8@1+ (400,0) [0|101200] "Unit_Lux" ZR_High + SG_ LS_Helligkeit_FW : 8|10@1+ (6,0) [0|6126] "Unit_Lux" ZR_High + SG_ LS_defekt : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ LS_Verbau : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Regenmenge : 24|4@1+ (10,0) [0|100] "Unit_PerCent" OTA_FC,ZR_High + SG_ RS_Verbau : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Verglasung_schliessen : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_defekt : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Wischergeschwindigkeit : 32|3@1+ (1,0) [0|7] "" OTA_FC,ZR_High + SG_ RLS_Vorfeldhelligkeit_Boost : 35|4@1+ (1,0) [0|15] "" ZR_High + +BO_ 1442 BMS_04: 8 BMC_MLBevo + SG_ BMS_04_CRC : 0|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_04_BZ : 8|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_Status_ServiceDisconnect : 13|1@1+ (1,0) [0|1] "" DCDC_800V_PAG,DCDC_HV,Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_Status_Spgfreiheit : 14|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_OBD_Lampe_Anf : 16|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ BMS_IstModus : 17|3@1+ (1,0) [0|7] "" AWC,Gateway,Gateway_PAG,Ladegeraet_Konzern,LE1,LE2,LE2_3_MLBevo_LB,Sub_Gateway,TME + SG_ BMS_Fehlerstatus : 20|3@1+ (1,0) [0|7] "" AWC,DCDC_800V_PAG,DCDC_HV,Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway + SG_ BMS_Kapazitaet_02 : 23|11@1+ (0.2,0) [0|409.2] "Unit_AmperHour" Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway + SG_ BMS_Soll_SOC_HiRes : 53|11@1+ (0.05,0) [0|100] "Unit_PerCent" Gateway,Gateway_PAG,Sub_Gateway + +BO_ 1447 TM_01: 8 Gateway + SG_ TM_Spiegel_Anklappen : 47|1@1+ (1,0) [0|1] "" ZR_High + SG_ TM_Nur_Hupen : 48|1@1+ (1,0) [0|1] "" ZR_High + SG_ TM_Door_Lock : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TM_Door_Unlock : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TM_Warnblinken : 51|1@1+ (1,0) [0|1] "" ZR_High + SG_ TM_Panik_Alarm : 52|1@1+ (1,0) [0|1] "" ZR_High + SG_ TM_ZV_Signatur : 53|11@1+ (1,0) [1|2047] "Unit_None" Vector__XXX + +BO_ 1452 HVEM_02: 8 Gateway + SG_ HVEM_IstStrom_HVVerbraucher : 0|12@1+ (0.1,-204.7) [-204.7|204.6] "Unit_Amper" Vector__XXX + SG_ HVEM_Energie_Klima_Vorgabe_HighR : 12|3@1+ (10,0) [0|50] "Unit_WattHour" TME + SG_ HVEM_IstLeistungNA : 15|9@1+ (50,0) [0|25450] "Unit_Watt" Vector__XXX + SG_ HVEM_Leistung_Klima_Vorgabe : 24|8@1+ (50,0) [0|12650] "Unit_Watt" TME + SG_ HVEM_Nutzbare_Energie : 32|11@1+ (50,0) [0|102200] "Unit_WattHour" Ladegeraet_Konzern + SG_ HVEM_Energie_Klima_Vorgabe : 43|8@1+ (50,0) [0|12650] "Unit_WattHour" TME + SG_ HVEM_MO_MaxLeistungIgnoriert : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1485 DCDC_03: 8 DCDC_800V_PAG + SG_ DCDC_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DCDC_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_Fehlerstatus : 16|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_Peakstrom_verfuegbar : 19|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_Abregelung_Temperatur : 20|1@1+ (1,0) [0|1] "" Gateway_PAG,Sub_Gateway,TME + SG_ DC_IstModus_02 : 21|3@1+ (1,0) [0|7] "" DCDC_HV_02,Gateway,Gateway_PAG,Ladegeraet_Konzern,Sub_Gateway,TME + SG_ DC_HV_EKK_IstModus : 28|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,Sub_Gateway,TME + SG_ DC_Status_Spgfreiheit_HV : 46|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_IstSpannung_EKK_HV : 48|8@1+ (2,0) [0|508] "Unit_Volt" Gateway,Gateway_PAG,Sub_Gateway + SG_ DC_Temperatur : 56|8@1+ (1,-40) [-40|213] "Unit_DegreCelsi" Gateway,Gateway_PAG,Sub_Gateway,TME + +BO_ 1505 Klima_Sensor_02: 8 Gateway + SG_ BCM1_Aussen_Temp_ungef : 0|8@1+ (0.5,-50) [-50|76] "Unit_DegreCelsi" BMC_MLBevo,BMS_NV,FCU_MLBevo_FCEV,Ladegeraet_Konzern,TME + SG_ BCM_Heizungsabsperrventil_Status : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM_Heizungspumpe_Status : 10|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM_Kompressorkupplung_Status : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BCM1_PTC_stufig_Status : 28|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ BCM1_FStatus_Aussentemp_ungef : 31|1@1+ (1,0) [0|1] "" TME + SG_ BCM1_Kompressorstrom_ist : 32|8@1+ (4,0) [0|1000] "Unit_MilliAmper" Vector__XXX + SG_ BCM1_OBD_FStatus_ATemp : 44|4@1+ (1,0) [0|15] "" BMC_MLBevo,Ladegeraet_Konzern,TME + +BO_ 1513 Klima_Sensor_04: 8 Gateway + SG_ DS_Kaeltemittel_P : 8|11@1+ (0.0161,0) [0|32.9245] "Unit_Bar" TME + SG_ DS_Status : 19|2@1+ (1,0) [0|3] "" TME + SG_ ION_Status : 21|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ION_Status_LED : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAU_Geblaese : 24|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ ION_Status_Taster : 31|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1520 Dimmung_01: 8 Gateway_MQB + SG_ DI_KL_58xd : 0|8@1+ (1,0) [0|253] "" Airbag_MQB + SG_ DI_KL_58xs : 8|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ DI_Display_Nachtdesign : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ DI_KL_58xt : 16|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ DI_Fotosensor : 24|16@1+ (1,0) [0|65535] "" Vector__XXX + +BO_ 1524 Innenlicht_11: 8 Gateway + SG_ IL_Dimmung_V_Tuerkontur : 0|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + SG_ IL_Dimmung_H_Tuerkontur : 8|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + SG_ IL_Dimmung_Tuerinnengriff : 16|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + SG_ IL_Dimmung_Umfeldbel : 24|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + SG_ IL_Bel_FS_Ausstieg : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Bel_BFS_Ausstieg : 33|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Bel_HFS_Ausstieg : 34|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Bel_HBFS_Ausstieg : 35|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Innenlicht_gedimmt_V : 36|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Innenlicht_gedimmt_H : 37|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Innenlicht_aktiv : 38|1@1+ (1,0) [0|1] "" ZR_High + SG_ IL_Klemme_30G_aktiv : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_DI_Rampe_Innenlicht : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_DI_Rampe_Leselicht : 41|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Innenlicht_H : 42|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Innenlicht_V : 43|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leselicht_Anf_hl : 44|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leselicht_Anf_hr : 45|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leselicht_Anf_vl : 46|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leselicht_Anf_vr : 47|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM1_Leuchten_Aus : 48|1@1+ (1,0) [0|1] "" ZR_High + SG_ AMB_Charisma_FahrPr : 49|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ AMB_Charisma_Status : 53|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ IL_Dimmung_Lautspr : 56|8@1+ (1,0) [0|100] "Unit_PerCent" ZR_High + +BO_ 1600 Motor_07: 8 Motor_Diesel_MQB + SG_ MO_QBit_Ansaugluft_Temp : 0|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_QBit_Oel_Temp : 1|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Kuehlmittel_Temp : 2|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Stellgliedtest_Soundaktuator : 3|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Fehler_HV_Netz : 4|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_aktives_Getriebeheizen : 5|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Absperrventil_oeffnen : 6|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Ansaugluft_Temp : 8|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB + SG_ MO_Oel_Temp : 16|8@1+ (1,-60) [-60|192] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kuehlmittel_Temp : 24|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Hoeheninfo : 32|8@1+ (0.00781,0) [0|1.98374] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kennfeldk : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Versionsinfo : 41|6@1+ (1,0) [0|63] "" Gateway_MQB + SG_ MO_Getriebe_kuehlen : 47|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Traegheit_02 : 48|5@1+ (0.01,0) [0|0.31] "Unit_KiloGramMeterSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Heizungspumpenansteuerung : 53|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ MO_SpannungsAnf : 57|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Nachlaufzeit_Heizungspumpe : 58|6@1+ (15,0) [0|945] "Unit_Secon" Gateway_MQB + +BO_ 1601 Motor_Code_01: 8 Motor_Diesel_MQB + SG_ Motor_Code_01_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ Motor_Code_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Faktor_Momente_02 : 12|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Hybridfahrzeug : 14|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Code : 16|8@1+ (1,0) [0|255] "" Gateway_MQB,SAK_MQB + SG_ MO_Getriebe_Code : 24|6@1+ (1,0) [0|63] "" Gateway_MQB + SG_ MO_StartStopp_Codiert : 30|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Anzahl_Zyl : 32|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Kraftstoffart : 36|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Hubraum : 40|7@1+ (0.1,0) [0|12.7] "Unit_Liter" Gateway_MQB + SG_ MO_Ansaugsystem : 47|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Leistung : 48|9@1+ (1,0) [0|511] "Unit_KiloWatt" Gateway_MQB + SG_ MO_Abgastyp_EOBD : 57|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ MO_Abgastyp_OBD : 58|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ MO_DPF_verbaut : 59|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_Codierung : 60|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Einspritzart : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 1603 Einheiten_01: 8 Gateway + SG_ KBI_Einheit_Datum : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Druck : 2|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Streckenanz : 4|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern + SG_ KBI_MFA_v_Einheit_02 : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Einheit_Temp : 6|1@1+ (1,0) [0|1] "" TME + SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1,0) [0|1] "" Ladegeraet_Konzern + SG_ KBI_Einheit_Verbrauch : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Volumen : 10|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Verbrauch_elektr : 12|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ KBI_Einheit_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KBI_Einheit_Verbrauch_Gas : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KBI_Einheit_Masse : 28|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1622 ELV_01: 8 Gateway + SG_ ELV_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ ELV_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ ELV_Anf_Klemme_S : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Anf_Klemme_15 : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Anf_Klemme_50 : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_01_Sendestatus : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Verriegelt : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_Entriegelt : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_ZAT_betaetigt : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Lebenszustand : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Anlernmodus : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Klemmenfreigabe : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Abbruch_Anf_Klemmenfreigabe : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_LED_Rot : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_LED_Gelb : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_Panikabschaltung : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_Lkg_Bewegen : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_Txt_Werkstatt : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_Txt_Defekt : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ ELV_Txt_P_Gang : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_PN_Gang : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_Kupplung : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_Txt_Bremse : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ELV_P_verriegelt : 35|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1624 Licht_vorne_01: 8 Gateway + SG_ Licht_Vorne_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Licht_Vorne_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ LV_Standlicht_Anzeige : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Abblendlicht_Anzeige : 13|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Fernlicht_Anzeige : 14|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Nebellicht_Anzeige : 15|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Nebelschlusslicht_Anzeige : 16|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Tagfahrlicht_Anzeige : 17|1@1+ (1,0) [0|1] "" BedienSG_hi,OTA_FC,ZR_High + SG_ LV_AFL_aktiv_Anzeige : 18|1@1+ (1,0) [0|1] "" BedienSG_hi,OTA_FC,ZR_High + SG_ LV_AFL_defekt : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Blinker_li_def : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Standlicht_li_def : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblendlicht_li_def : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Fernlicht_li_def : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Nebellicht_li_def : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Blk_li_Seite_def : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Tagfahrlicht_li_def : 26|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_FLA_aktiv_Anzeige : 27|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_FLA_defekt : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_FLA_Sensor_blockiert : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Blinker_re_def : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Standlicht_re_def : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblendlicht_re_def : 32|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Fernlicht_re_def : 33|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Nebellicht_re_def : 34|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Blk_re_Seite_def : 35|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Tagfahrlicht_re_def : 36|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Aussenlicht_def : 37|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblendlicht_TFL_li_def : 38|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Nebellicht_TFL_li_def : 39|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Standlicht_TFL_li_def : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblend_Fernlicht_li_def : 41|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblendlicht_TFL_re_def : 42|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Nebellicht_TFL_re_def : 43|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Standlicht_TFL_re_def : 44|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abblend_Fernlicht_re_def : 45|1@1+ (1,0) [0|1] "" ZR_High + SG_ LV_Abbiegelicht_li_def : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LV_Abbiegelicht_re_def : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Linksverkehr : 48|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ BCM1_Licht_Dunkelheit_aktiv : 49|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_LED_Scheinwerfer_li_def : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LV_LED_Scheinwerfer_re_def : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LV_Blinker_VL_aktiv : 52|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_Blinker_VR_aktiv : 53|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ LV_MXB_Status_Anzeige : 54|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1629 ESP_20: 8 Gateway + SG_ ESP_20_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ ESP_20_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BR_Systemart : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_Zaehnezahl : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ ESP_Charisma_FahrPr : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ ESP_Charisma_Status : 28|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_Wiederstart_Anz_01 : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Wiederstart_Anz_02 : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Wiederstart_Anz_03 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Wiederstart_Anz_04 : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_01 : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_02 : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_03 : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_04 : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_05 : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_06 : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_07 : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_Std : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Dachrelingsensor : 42|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_Stoppverbot_Anz_08 : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HDC_Charisma_FahrPr : 45|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HDC_Charisma_Status : 49|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BR_QBit_Reifenumfang : 51|1@1+ (1,0) [0|1] "" AWC + SG_ BR_Reifenumfang : 52|12@1+ (1,0) [0|4095] "Unit_MilliMeter" AWC + +BO_ 1631 Motor_16: 8 Gateway + SG_ TSK_Grundmasse : 0|8@1+ (32,0) [0|8128] "Unit_KiloGram" ZR_High + SG_ TSK_QBit_Steigung : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_QBit_Fahrzeugmasse : 13|1@1+ (1,0) [0|1] "" ZR_High + SG_ MO_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_DPF_reg : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ MO_Heizstrom_EKAT : 17|7@1+ (1,0) [0|126] "Unit_Amper" Vector__XXX + SG_ MO_Heizstrom_SCR : 24|6@1+ (1,0) [0|62] "Unit_Amper" Vector__XXX + SG_ MO_Anzeige_Kaltleuchte : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_P_Generator_ungefiltert_Anf : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_Getriebeinfo : 34|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ MO_Energieinhalt_BMS : 36|12@1+ (25,0) [0|102325] "Unit_WattHour" Vector__XXX + SG_ TSK_Fahrzeugmasse_02 : 48|8@1+ (32,0) [0|8128] "Unit_KiloGram" OTA_FC,ZR_High + SG_ TSK_Steigung_02 : 56|8@1+ (0.8,-101.6) [-100.8|101.6] "Unit_PerCent" OTA_FC + +BO_ 1640 Klima_12: 8 Gateway + SG_ KL_LRH_Taster : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_LRH_Stufe : 1|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HSH_Taster : 3|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ FSH_Taster : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Zuheizer_Freigabe : 6|1@1+ (1,0) [0|1] "" TME + SG_ KL_Beschlagsgefahr : 7|1@1+ (1,0) [0|1] "" TME + SG_ KL_SIH_Soll_li : 8|3@1+ (1,0) [0|7] "" TME + SG_ KL_SIH_Soll_re : 11|3@1+ (1,0) [0|7] "" TME + SG_ KRH_Soll_li : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_SIL_Soll_li : 16|3@1+ (1,0) [0|7] "" TME + SG_ KL_SIL_Soll_re : 19|3@1+ (1,0) [0|7] "" TME + SG_ KRH_Soll_re : 22|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Geblspng_Soll : 24|8@1+ (0.05,1.45) [1.5|14] "Unit_Volt" Vector__XXX + SG_ KL_Geblspng_Fond_Soll : 32|8@1+ (0.05,1.45) [1.5|14] "Unit_Volt" Vector__XXX + SG_ KL_I_Geblaese : 40|8@1+ (0.25,0) [0|63.5] "Unit_Amper" Vector__XXX + SG_ KL_Kompressorstrom_soll : 48|10@1+ (1,0) [0|1021] "" TME + SG_ KL_Umluftklappe_Status : 58|4@1+ (1,0) [0|15] "" TME + SG_ KL_PTC_Verbauinfo : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1648 Motor_18: 8 Gateway + SG_ MO_max_Ladedruck : 0|6@1+ (0.1,0) [0|6.3] "Unit_Bar" Sub_Gateway + SG_ MO_ANC_Kennfeld_Anf : 6|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Bremslicht_Reku : 8|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_StartStopp_PopUp : 9|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO1_Sperr_Info_WFS : 11|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO1_Freigabe_Info_WFS : 12|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_EPCL : 13|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ MO_Zylabsch_Texte_02 : 16|4@1+ (1,0) [0|15] "" Sub_Gateway + SG_ MO_Fahrzeugtyp : 20|3@1+ (1,0) [0|7] "" BMS_NV,Sub_Gateway + SG_ MO_NMAX_Schaltanzeige : 23|9@1+ (25,0) [0|12775] "Unit_MinutInver" Sub_Gateway + SG_ MO_Abstellzeit : 32|8@1+ (8,0) [0|2024] "Unit_Minut" BMS_NV,Sub_Gateway,TME + SG_ MO_Abstellzeit_Status : 40|2@1+ (1,0) [0|3] "" BMS_NV,Sub_Gateway,TME + SG_ MO1_Freigabe_Verfallsinfo_WFS : 42|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_Hybrid_StartStopp_LED : 43|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Fehler_Zylabsch : 45|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ MO_Zylabsch_Texte : 50|2@1+ (1,0) [0|3] "" Sub_Gateway + SG_ MO_Ethanol_BS_Texte : 52|3@1+ (1,0) [0|7] "" Sub_Gateway + SG_ MO_Drehzahl_Warnung : 55|1@1+ (1,0) [0|1] "" Sub_Gateway + SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Sub_Gateway + +BO_ 1710 Spiegel_01: 8 Gateway + SG_ SP_FT_oben : 0|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_FT_unten : 1|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_FT_links : 2|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_FT_rechts : 3|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_BT_oben : 4|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_BT_unten : 5|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_BT_links : 6|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_BT_rechts : 7|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_abklappen : 8|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_anklappen : 9|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_normieren : 10|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_Hzg_Taster : 12|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ SP_S_oben : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_S_unten : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_S_links : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_S_rechts : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_Auswahl_li : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_Auswahl_re : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_ARA_Status : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_S_Klappen : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ SP_Verstellschalter_Fehler : 24|1@1+ (1,0) [0|1] "" ZR_High + +BO_ 1711 Rear_View_01: 8 Gateway + SG_ RV_Video_on : 0|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_Dark_Screen : 1|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_HMI_Mode : 2|2@1+ (1,0) [0|3] "" ZR_High,ZR_Standard + SG_ RV_GL_side : 4|2@1+ (1,0) [0|3] "" ZR_High,ZR_Standard + SG_ RV_System_aktiv : 6|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_Reinigung_Anf : 7|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ RV_Settings_enabled : 8|1@1+ (1,0) [0|1] "" ZR_High + SG_ RV_Menu_Item : 9|2@1+ (1,0) [0|3] "" ZR_High + SG_ SV_Video_on : 11|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_Calib_Fehler : 12|1@1+ (1,0) [0|1] "" ZR_High + SG_ RV_GL_Trailer_connect : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_GL_Trunk_open : 14|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ RV_GL_LWS_Fehler : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ RV_Helligkeit : 16|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard + SG_ ZFAS_Umfeldbeleuchtung_Anf : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ RV_Kontrast : 24|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard + SG_ RV_Farbe : 32|7@1+ (1,0) [0|100] "Unit_PerCent" ZR_High,ZR_Standard + +BO_ 1714 Diagnose_01: 8 Gateway_MQB + SG_ DGN_Verlernzaehler : 0|8@1+ (1,0) [0|254] "" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB + SG_ KBI_Kilometerstand : 8|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Tag : 39|5@1+ (1,0) [1|31] "Unit_Day" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ Kombi_02_alt : 62|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB + SG_ Uhrzeit_01_alt : 63|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB + +BO_ 1716 VIN_01: 8 Gateway_MQB + SG_ VIN_01_MUX M : 0|2@1+ (1,0) [0|3] "" Airbag_MQB + SG_ KS_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + +BO_ 316495015 MEB_VZE_01: 32 XXX + SG_ VZE_Anzeigemodus : 0|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ Detected_01 : 8|1@0+ (1,0) [0|1] "" XXX + SG_ VZE_Anzeigeunterdrueck_Zeichen_3 : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Anzeigeunterdrueck_Zeichen_2 : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Verkehrszeichen_1 : 11|8@1+ (5,0) [1|520] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_2 : 19|8@1+ (5,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_3 : 27|8@1+ (5,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_1 : 35|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_2 : 36|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_3 : 37|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_1 : 38|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_2 : 42|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_3 : 46|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Anzeigeunterdrueck_Zeichen_1 : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Zeichen_01_KameraWied : 51|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_KameraWied : 52|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_KameraWied : 53|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Kamera : 54|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Karte : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Gesetz : 56|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Kamera : 57|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Karte : 58|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Gesetz : 59|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Kamera : 60|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Karte : 61|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Gesetz : 62|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Gong : 63|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_4 : 75|8@1+ (1,0) [0|31] "" XXX + SG_ VZE_Verkehrszeichen_6 : 92|7@1+ (1,0) [0|7] "" XXX + SG_ VZE_Baustelle : 110|1@0+ (1,0) [0|1] "" XXX + SG_ Zeichen_Unknown : 129|4@1+ (1,0) [0|15] "" XXX + SG_ Zeichen_Unknown_Entfernung : 140|6@1+ (1,0) [0|15] "" XXX + SG_ Zusatzschild_Unknown : 147|2@1+ (1,0) [0|3] "" XXX + SG_ Unknown_02 : 167|4@1+ (1,0) [0|3] "" XXX + SG_ Unknown_01 : 207|1@0+ (1,0) [0|1] "" XXX + +BO_ 316495049 SAL_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Brake_Unknown : 18|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Light_01 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_2 : 22|1@0+ (1,0) [0|1] "" XXX + SG_ Right_Blinker : 25|1@0+ (1,0) [0|1] "" XXX + SG_ Left_Blinker : 26|1@1+ (1,0) [0|3] "" XXX + SG_ Reverse_Light : 27|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Light_02 : 30|1@0+ (1,0) [0|1] "" XXX + SG_ Right_Blinker_02 : 44|1@1+ (1,0) [0|3] "" XXX + SG_ Left_Blinker_02 : 45|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 52|8@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_4 : 63|1@0+ (1,0) [0|1] "" XXX + +BO_ 316495081 MEB_Camera_05: 8 XXX + +BO_ 316495106 AAA_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 316495140 MEB_Camera_06: 64 XXX + +BO_ 316495165 HVL_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 380195935 IPA_02: 8 XXX + +BO_ 380196019 MEB_Camera_07: 16 XXX + +BO_ 380196036 MEB_Camera_08: 8 XXX + +BO_ 389241617 MEB_Camera_10: 8 XXX + +BO_ 401604687 MEB_Camera_11: 8 XXX + +BO_ 402522959 MEB_Camera_14: 8 XXX + +BO_ 441800001 EML_02: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CHK : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 441800082 MEB_Camera_12: 8 XXX + +BO_ 452984911 MEB_Camera_13: 8 XXX + +BO_ 316495058 Battery_Heating_Status: 8 XXX + SG_ Battery_Heating_Active : 38|1@1+ (1,0) [0|1] "" XXX + SG_ Heating_Request : 45|3@1+ (1,0) [0|7] "" XXX + SG_ Cooling_Request : 42|3@1+ (1,0) [0|7] "" XXX + SG_ Power_Batt_Heating : 48|8@1+ (1,0) [0|255] "W" XXX + SG_ Power_Batt_Heating_Req : 56|8@1+ (1,0) [0|255] "W" XXX + +BO_ 441800114 Charging_Optimization: 8 XXX + SG_ Temperature_Status_Charge : 15|3@1+ (1,0) [0|7] "" XXX + +BO_ 316495056 Charging_Dynamics: 8 XXX + SG_ Max_Charge_Power : 51|13@1+ (0.1,0) [0|819.1] "kW" XXX + SG_ Max_Charge_Current : 25|13@1+ (0.2,0) [0|1638.2] "A" XXX + +BO_ 380196006 Battery_Temperatures: 8 XXX + SG_ Battery_Max_Temp : 24|8@1+ (0.5,-40) [-40|87.5] "degC" XXX + SG_ Battery_Min_Temp : 32|8@1+ (0.5,-40) [-40|87.5] "degC" XXX + +CM_ BO_ 184 "Motorsteuergerät"; +CM_ BO_ 192 "Motorsteuergerät"; +CM_ BO_ 317 "Lenkungssteuergerät"; +CM_ BO_ 517 "Steuergerät fÃŧr Motorstart"; +CM_ BO_ 522 "Steuergerät fÃŧr Fahrzeugbewegung"; +CM_ BO_ 1622 "Steuergerät fÃŧr Lenkungsverriegelung"; +CM_ BO_ 316495165 "Steuergerät ICAS1"; +CM_ BO_ 441800001 "Steuergerät fÃŧr Fahrzeugbewegung"; +VAL_ 64 AB_RGS_Anst 4 "aktiv_Niveau_1" 5 "aktiv_Niveau_2" 6 "aktiv_Niveau_3" 7 "aktiv_Niveau_4" 8 "deaktiviert"; +VAL_ 64 AB_Front_Crash 0 "kein_Front_Crash" 1 "Front_Crash"; +VAL_ 64 AB_Heck_Crash 0 "kein_Heck_Crash" 1 "Heck_Crash"; +VAL_ 64 AB_SF_Crash 0 "kein_Seiten_Crash_Fahrer" 1 "Seiten_Crash_Fahrer"; +VAL_ 64 AB_SB_Crash 0 "kein_Seiten_Crash_Beifahrer" 1 "Seiten_Crash_Beifahrer"; +VAL_ 64 AB_Rollover_Crash 0 "kein_Rollover" 1 "Rollover"; +VAL_ 64 AB_Crash_Int 0 "kein_Crash" 1 "Crash_Intensitaet_1" 2 "Crash_Intensitaet_2_(nur_Stellgliedtest_MLB_B8)" 3 "Crash_Intensitaet_2_(nur_D4_C7_Colorado_NF_PAG__Crash_im_MLB_B8)" 4 "Crash_Intensitaet_3_(alt_VW/AUDI__Stellgliedtest_MLB_B8)" 5 "Crash_Intensitaet_3_(alt_PAG)" 7 "Crash_Intensitaet_3"; +VAL_ 64 AB_Lampe 0 "Aus" 1 "Ein"; +VAL_ 64 AB_Deaktiviert 0 "aktiv" 1 "deaktiviert"; +VAL_ 64 AB_VB_deaktiviert 0 "Beifahrerairbag_aktiv" 1 "Beifahrerairbag_deaktiviert"; +VAL_ 64 AB_Systemfehler 0 "kein_Fehler" 1 "Airbag_Systemfehler"; +VAL_ 64 AB_Diagnose 0 "nicht_in_Diagnose" 1 "in_Diagnose"; +VAL_ 64 AB_Stellgliedtest 0 "nicht_im_Stellgliedtest" 1 "Airbag_im_Stellgliedtest"; +VAL_ 64 AB_Erh_Auf_VB 0 "keine_Anzeige" 1 "Beifahrerairbag_deaktiviert" 2 "Beifahrerairbag_aktiviert" 3 "nicht_definiert"; +VAL_ 64 AB_Gurtwarn_VF 0 "keine_Warnung" 1 "Gurtwarnung_ausloesen"; +VAL_ 64 AB_Gurtwarn_VB 0 "keine_Warnung" 1 "Gurtwarnung_ausloesen"; +VAL_ 64 AB_Anzeige_Fussg 0 "keine_FSG_Aktion_ausgeloest" 1 "Motorhaube_offen" 2 "Systemfehler"; +VAL_ 64 AB_Texte_AKS 0 "keine_AKS_Ausloesung" 1 "AKS_ausgeloest" 2 "AKS_Systemfehler"; +VAL_ 64 AB_MKB_gueltig 0 "Multikollisionsbremsung_nicht_freigeschaltet" 1 "Multikollisionsbremsung_freigeschaltet"; +VAL_ 64 AB_MKB_Anforderung 0 "Multikollisionsbremsung_nicht_angefordert" 1 "Multikollisionsbremsung_angefordert"; +VAL_ 64 AB_Versorgungsspannung 0 "plausibel" 1 "unplausibel"; +VAL_ 64 AB_Deaktivierung_HV 0 "keine_Deaktivierung" 1 "Deaktivierung_1" 2 "Deaktivierung_2" 3 "Deaktivierung_3" 4 "Deaktivierung_4" 5 "Deaktivierung_5" 6 "Deaktivierung_6" 7 "Fehler"; +VAL_ 64 AB_EDR_Trigger 0 "No_Event" 1 "Start_Event" 2 "NonDeployment_Event" 3 "Deployment_Event"; +VAL_ 64 AB_Belegung_VF 0 "nicht_verfuegbar" 1 "Fehler" 2 "nicht_belegt" 3 "belegt"; +VAL_ 64 SC_LowSpeedCrashErkannt 0 "kein_Crash_erkannt" 1 "Crash_Frontbereich_erkannt" 2 "Crash_Heckbereich_erkannt" 3 "Crash_Front_und_Heckbereich_erkannt"; +VAL_ 64 SC_Masterzeit 127 "Init"; +VAL_ 134 LWI_Sensorstatus 0 "iO" 1 "nicht kalibriert"; +VAL_ 134 LWI_QBit_Sub_Daten 0 "LWS-Subinfo real (Lenkradwinkelinformation ADS-tauglich)" 1 "LWS-Subinfo simuliert (Lenkradwinkelinformation nicht ADS-tauglich )"; +VAL_ 134 LWI_MFL_Abschaltung 0 "inaktiv" 1 "aktiv"; +VAL_ 134 LWI_QBit_Lenkradwinkel 0 "gÃŧltiger Wert" 1 "ausserhalb der Spezifikation"; +VAL_ 134 LWI_Lenkradwinkel 8190 "Init" 8191 "Fehler"; +VAL_ 134 LWI_VZ_Lenkradwinkel 0 "positiv_links_von_der_Nullstellung" 1 "negativ"; +VAL_ 134 LWI_VZ_Lenkradw_Geschw 0 "positiv_links_von_der_Nullstellung" 1 "negativ"; +VAL_ 134 LWI_Lenkradw_Geschw 510 "Init" 511 "Fehler"; +VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" 8 "preempted"; +VAL_ 167 MO_Mom_Soll_Roh 1022 "Init"; +VAL_ 167 MO_Mom_Ist_Summe 1022 "Init"; +VAL_ 167 MO_Mom_Traegheit_Summe 1022 "Init"; +VAL_ 167 MO_Mom_Soll_gefiltert 1022 "Init"; +VAL_ 167 MO_Mom_Schub 510 "Init"; +VAL_ 167 MO_Status_Normalbetrieb_01 0 "kein_Normalbetrieb" 1 "Normalbetrieb_erreicht"; +VAL_ 167 MO_erste_Ungenauschwelle 0 "genau" 1 "Momente ungenauer >8%"; +VAL_ 167 MO_QBit_Motormomente 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 168 MO_Mom_neg_verfuegbar 510 "Init" 511 "Fehler"; +VAL_ 168 MO_Mom_Begr_stat 510 "Init"; +VAL_ 168 MO_Mom_Begr_dyn 1022 "Init"; +VAL_ 168 MO_QBit_Drehzahl_01 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 173 GE_MMom_Soll_02 1022 "keine_Anforderung_Init" 1023 "Fehler"; +VAL_ 173 GE_MMom_Vorhalt_02 1022 "Init" 1023 "Fehler"; +VAL_ 173 GE_Uefkt 1023 "Fehler"; +VAL_ 173 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; +VAL_ 173 GE_Schaltablauf 0 "keine_Schaltung" 1 "Momentenueberschneidung" 2 "Befuellphase" 3 "Drehzahlueberfuehrung"; +VAL_ 173 GE_Uefkt_unplausibel 0 "Uefkt_plausibel" 1 "Uefkt_unplausibel"; +VAL_ 173 GE_MMom_Status_02 0 "kein_Eingriff" 1 "abs_reduzierender_Eingriff_auf_Gesamt_Antrieb_nur_schneller_Pfad" 2 "abs_erhoehender_Eingriff_auf_Gesamt_Antrieb" 3 "relativer_Eingriff_auf_Gesamt_Antrieb" 4 "relativer_Eingriff_auf_E_Maschine" 5 "abs_red_Eingr_auf_Gesamt_Antrieb_nur_Luftpfad" 6 "abs_red_Eingr_auf_Gesamt_Antrieb_Luft-_und_schnellen_Pfad" 7 "abs_Eingriff_auf_Gesamtantrieb_erhoehend_und_reduzierend"; +VAL_ 173 GE_Status_Kraftschluss 0 "offen_kein_Kraftschluss" 1 "offen_mit_Kraftschluss" 2 "schlupfend_geregelt" 3 "abgesichert_offen_kein_Kraftschl" 4 "geschlossen_mit_Mikroschlupf" 5 "geschlossen_mit_Ueberanpressung" 6 "sonstige_Fehler" 7 "fehlerhaft_geschlossen"; +VAL_ 173 GE_MMom_Status 0 "keine Anforderung" 1 "reduzierender Getriebeeingriff" 2 "erhÃļhender Getriebeeingriff" 3 "ÄŽderung mit Sprung"; +VAL_ 173 GE_Freig_MMom_Vorhalt 0 "nicht_freigegeben" 1 "freigegeben"; +VAL_ 173 GE_Verbot_Ausblendung 0 "kein_Verbot" 1 "Verbot"; +VAL_ 173 GE_Zielgang 0 "Gang P/N (ausgekuppelt)" 1 "Gang 1" 2 "Gang 2" 3 "Gang 3" 4 "Gang 4" 5 "Gang 5" 6 "Gang 6" 7 "Gang 7" 8 "Gang R" 11 "Gang 8" 12 "Gang 9" 13 "Gang10" 14 "Istgang nicht definiert" 15 "Fehler"; +VAL_ 184 EM1_Freigabe_Info_WFS 0 "ungueltig" 1 "gueltig"; +VAL_ 184 EM1_Sperr_Info_WFS 0 "nicht_gesperrt" 1 "gesperrt"; +VAL_ 184 EM1_AR_aktiv 0 "Init" 1 "Ruckeldaempfer_aktiv"; +VAL_ 184 EM1_Eta_Sys 510 "Init" 511 "Fehler"; +VAL_ 184 EM1_IstStrom 2046 "Init" 2047 "Fehler"; +VAL_ 184 EM1_Fehler_ElAntriebFreilauf_Anf 0 "Init" 1 "Fehler_EM_im_Freilauf"; +VAL_ 184 EM1_Abregelung_Temperatur 0 "Init" 1 "Abregelung_Temperatur"; +VAL_ 184 EM1_AnlernenElMotor_Anf 0 "kein_Diagnose_Request" 1 "Diagnose_Request"; +VAL_ 184 EM1_Moment_HVVerbraucher 1023 "Init"; +VAL_ 184 EM1_Freigabe_Verfallsinfo_WFS 0 "Aus" 1 "Ein"; +VAL_ 184 EM1_Parken_WFS_Status 0 "Limitierung_Inaktiv" 1 "Limitierung_Aktiv" 2 "Abbruch"; +VAL_ 184 EM1_HV_betriebsbereit 0 "Init" 1 "Ready_HV"; +VAL_ 190 Engine_Status 1 "Ready" 2 "Online"; +VAL_ 253 BR_Eingriffsmoment 1022 "Init" 1023 "Fehler"; +VAL_ 253 ESP_Diagnose 0 "ESP_nicht_in_Diagnose" 1 "ESP_in_Diagnose"; +VAL_ 253 ESC_v_Signal_Qualifier_High_Low 0 "Gueteschwelle_kleiner_1kmh" 1 "Gueteschwelle_kleiner_3kmh" 2 "Gueteschwelle_kleiner_5kmh" 3 "Gueteschwelle_kleiner_10kmh" 4 "Gueteschwelle_kleiner_20kmh" 5 "Gueteschwelle_groessergleich_20kmh" 6 "Init" 7 "Fehler"; +VAL_ 253 ESP_Vorsteuerung 0 "keine_Vorsteuerung_aktiv" 1 "Vorsteuerung_aktiv"; +VAL_ 253 OBD_Schlechtweg 0 "kein_Schlechtweg_erkannt" 1 "Schlechtweg_erkannt"; +VAL_ 253 OBD_QBit_Schlechtweg 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 253 ESP_v_Signal 65533 "Unterspannung" 65534 "Init" 65535 "Fehler"; +VAL_ 253 ASR_Tastung_passiv 0 "ASR_aktiviert" 1 "ASR_passiv_getastet_oder_Schwellen_geaendert"; +VAL_ 253 ESP_Tastung_passiv 0 "ESP_aktiviert" 1 "ESP_passiv_getastet_oder_Schwellen_geaendert"; +VAL_ 253 ESP_Systemstatus 0 "iO" 1 "Fehler"; +VAL_ 253 ASR_Schalteingriff 0 "keine_Anforderung" 1 "ASR_Schaltkennfeld" 2 "Rueckschaltung" 3 "Schaltverbot"; +VAL_ 253 ESP_QBit_v_Signal 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 253 ABS_Bremsung 0 "keine_ABS_Regelung" 1 "ABS_Regelung_aktiv"; +VAL_ 253 ASR_Anf 0 "keine_Anforderung" 1 "ASR_Anforderung"; +VAL_ 253 MSR_Anf 0 "keine Anfoderung" 1 "MSR-Anforderung"; +VAL_ 253 EBV_Eingriff 0 "kein_EBV_Eingriff" 1 "EBV_Eingriff"; +VAL_ 253 EDS_Eingriff 0 "kein_EDS_Eingriff" 1 "EDS_Eingriff"; +VAL_ 253 ESP_Eingriff 0 "kein_ESP_Eingriff" 1 "ESP_Eingriff_aktiv"; +VAL_ 253 ESP_ASP 0 "inaktiv" 1 "aktiv"; +VAL_ 253 ESC_Neutralschaltung 0 "keine_Anforderung" 1 "Neutralschaltung_angefordert"; +VAL_ 278 ESP_QBit_Wegimpuls_VL 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 278 ESP_QBit_Wegimpuls_VR 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 278 ESP_QBit_Wegimpuls_HL 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 278 ESP_QBit_Wegimpuls_HR 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 278 ESP_Wegimpuls_VL 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; +VAL_ 278 ESP_Wegimpuls_VR 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; +VAL_ 278 ESP_Wegimpuls_HL 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; +VAL_ 278 ESP_Wegimpuls_HR 1021 "Init" 1022 "Unterspannung" 1023 "Fehler"; +VAL_ 278 ESP_VL_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; +VAL_ 278 ESP_VR_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; +VAL_ 278 ESP_HL_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; +VAL_ 278 ESP_HR_Fahrtrichtung 0 "Vorwaerts" 1 "Rueckwaerts" 2 "Init" 3 "ungueltig_oder_nicht_verbaut"; +VAL_ 299 GRA_Hauptschalter 0 "Hauptschalter_aus__Taster_nicht_betaetigt" 1 "Hauptschalter_ein__Taster_betaetigt"; +VAL_ 299 GRA_Abbrechen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Typ_Hauptschalter 0 "gerasteter_Lenkstockschalter" 1 "getasteter_Lenkstockschalter"; +VAL_ 299 GRA_Limiter 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Tip_Setzen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Tip_Hoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Tip_Runter 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Tip_Wiederaufnahme 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 299 GRA_Verstellung_Zeitluecke 0 "Taste_nicht_betaetigt" 1 "Dist_minus_1" 2 "Dist_plus_1" 3 "Dist_Toggle"; +VAL_ 299 GRA_Codierung 0 "kein_Hebel" 1 "GRA_Hebel" 2 "ACC_Hebel" 3 "Limiter_Only"; +VAL_ 299 GRA_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 299 GRA_LIM_Taste_verfuegbar 0 "Limiter_Taste_nicht_vorhanden" 1 "Limiter_Taste_vorhanden"; +VAL_ 299 GRA_Tip_Stufe_2 0 "Tip_Stufe_1__keine_Betaetigung" 1 "Tip_Stufe_2"; +VAL_ 299 GRA_TravelAssist 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 319 PreCrash_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 319 PreCrash_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 319 PreCrash_Schiebedach_schliessen 0 "keine_Schliessung" 1 "Schliessung_angefordert"; +VAL_ 319 PreCrash_Fenster_schliessen 0 "keine_Schliessung" 1 "Schliessung_angefordert"; +VAL_ 319 PreCrash_Blinken 0 "keine_Blinkanforderung" 1 "Warnblinken" 2 "RECAS_Blinken" 3 "Notbremsblinken"; +VAL_ 319 SC_PreSense_FCWP 0 "Warnung_gilt_fuer_Objekte" 1 "Warnung_gitl_fuer_Fussgaenger"; +VAL_ 319 PreCrash_Tueren_Verriegeln 0 "keine_Anforderung" 1 "Tueren_Verriegeln"; +VAL_ 319 PreCrash_Anforderung_AFR 0 "keine_Anforderung" 1 "linke_Seite" 2 "rechte_Seite" 3 "Vorderachse" 4 "Hinterachse" 5 "Vorwarnung" 7 "Init"; +VAL_ 319 SC_PreCrash_LED 0 "keine_Anzeige" 1 "Stufe_1_glimmen" 2 "Stufe_2_leuchten" 3 "Stufe_3_blinken"; +VAL_ 319 PreCrash_FS_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; +VAL_ 319 PreCrash_BFS_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; +VAL_ 319 PreCrash_Fo_Pneumatik_ansteuern 0 "keine_Anforderung" 1 "Pneumatik_ansteuern"; +VAL_ 319 PreCrash_FS_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)" 6 "Lehnenverstellung_ansteuern" 7 "Lehnenkopfverstellung_ansteuern"; +VAL_ 319 PreCrash_BFS_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)" 6 "Lehnenverstellung_ansteuern" 7 "Lehnenkopfverstellung_ansteuern"; +VAL_ 319 PreCrash_Fo_Sitzlehne_verfahren 0 "keine_Anforderung" 1 "Sitzlehne_in_pos_x-Richtung_verfahren(vor)" 2 "Sitzlehne_in_neg_x-Richtung_verfahren(zurueck)" 3 "Sitzlehnenkopf_in_pos_x-Richtung_verfahren(vor)" 4 "Sitzlehnenkopf_in_neg_x-Richtung_verfahren(zurueck)"; +VAL_ 319 PreCrash_FS_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren" 9 "Kopfstuetze_ansteuern"; +VAL_ 319 PreCrash_BFS_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren" 9 "Kopfstuetze_ansteuern"; +VAL_ 319 PreCrash_Fo_KSV_verfahren 0 "keine_Anforderung" 1 "in_pos_x-Richtung_verfahren" 2 "in_neg_x-Richung_verfahren" 3 "in_pos_z-Richtung_verfahren" 4 "in_neg_z-Richtung_verfahren" 5 "in_pos_x-Richtung_und_neg_z-Richtung_verfahren" 6 "in_pos_x_Richtung_und_pos_z-Richtung_verfahren" 7 "in_neg_x-Richtung_und_neg_z-Richtung_verfahren" 8 "in_neg_x-Richtung_und_pos_z-Richtung_verfahren"; +VAL_ 319 SC_PreCrash_Warnung 0 "keine_Anzeige" 1 "latente_Vorwarnung" 2 "Vorwarnung" 3 "Akutwarnung" 4 "Eingriff" 5 "Fahreruebernahmeaufforderung" 6 "Abbiegewarnung" 7 "Basiseingriff" 8 "Heckeingriff"; +VAL_ 319 SC_PreCrash_Texte 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "Demomodus" 4 "System_aus" 5 "Anhaengerbetrieb" 6 "ESC_aus" 7 "zurzeit_eingeschraenkt" 8 "zurzeit_eingeschraenkt_ESP_Aus" 9 "Initialisierung"; +VAL_ 339 MO_HVEM_Eskalation 0 "keine_Eskalation_HVEM" 1 "Eskalation_HVEM"; +VAL_ 339 MO_ErwGrenzen_Anf 0 "normal" 1 "erweitert"; +VAL_ 339 MO_Fehler_Notentladung_Anf 0 "Init"; +VAL_ 339 MO_HVEM_MaxLeistung 510 "Init"; +VAL_ 339 MO_HVK_EmIstzustand 0 "HvOff" 1 "HvStbyReq" 2 "HvStbyOk" 3 "HvBattOnReq" 4 "HvBattOnOk" 10 "HvOnIdle" 18 "HvOnDrvReq" 19 "HvOnDrvOk" 20 "HvOnDrvRdy" 28 "HvStepUpReq" 29 "HvStepUpOk" 30 "HvStepUp" 38 "HvStepDownReq" 39 "HvStepDownOk" 40 "HvStepDown" 46 "HvAcChPreReq" 47 "HvAcChPreOk" 48 "HvAcChReq" 49 "HvAcChOk" 50 "HvAcCh" 56 "HvDcChPreReq" 57 "HvDcChPreOk" 58 "HvDcChReq" 59 "HvDcChOk" 60 "HvDcCh" 67 "HvChOffReq" 68 "HvChOffOk" 69 "HvOnIdleReq" 70 "HvOnIdleOk" 96 "HvCpntOffReq" 97 "HvCpntOffOk" 98 "HvBattOffReq" 99 "HvBattOffOk" 109 "HvDcDcFailOffReq" 110 "HvDcDcFail" 119 "HvElmOffReq" 120 "HvElmOff" 126 "HvFailCpntOffReq" 127 "HvFailCpntOffOk" 128 "HvFailBattOffReq" 129 "HvFailBattOffOk" 130 "HvFailBattOff" 138 "HvFailUCtlReq" 139 "HvFailUCtlOk" 140 "HvFailUCtl" 150 "HvEmgcyOff" 255 "Init"; +VAL_ 339 MO_HVK_AntriebFehlerstatus 0 "Komponente_IO" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 339 MO_MVK_Bordnetz_Anf 0 "keine_Anforderung" 1 "Bordnetzaktivitaet_gefordert"; +VAL_ 339 MO_HVK_AntriebZustand 0 "Antrieb_AUS" 1 "Antrieb_Startphase" 2 "E_Fahren" 3 "Hybrid_Fahren" 7 "Init"; +VAL_ 339 MO_HVK_EmFehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Teilbetrieb" 3 "Eingeschr_KompFkt_Interlock" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 339 MO_MVK_AntriebFehlerstatus 0 "Komponente_IO" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 339 MO_MVK_AntriebZustand 0 "Antrieb_AUS" 1 "Antrieb_Startphase" 2 "FreilaufMotorAus" 7 "Init"; +VAL_ 339 MO_MVK_EmFehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Teilbetrieb" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 339 MO_MVK_EmIstzustand 0 "MvOff" 1 "MvStbyReq" 2 "MvStbyOk" 3 "MvBattOnReq" 4 "MvBattOnOk" 10 "MvOnIdle" 18 "MvOnDrvReq" 19 "MvOnDrvOk" 20 "MvOnDrv" 28 "MvStepUpReq" 29 "MvStepUpOk" 30 "MvStepUp" 38 "MvStepDownReq" 39 "MvStepDownOk" 40 "MvStepDown" 96 "MvCpntOffReq" 97 "MvCpntOffOk" 98 "MvBattOffReq" 99 "MvBattOffOk" 109 "MvDcDcFailOffReq" 110 "MvDcDcFail" 119 "MvElmFailOffReq" 120 "MvElmFail" 126 "MvFailCpntOffReq" 127 "MvFailCpntOffOk" 128 "MvFailBattOffReq" 129 "MvFailBattOffOk" 130 "MvFailBattOff" 138 "MvFailUCtlReq" 139 "MvFailUCtlOk" 140 "MvFailUCtl" 150 "MvEmgcyOff" 255 "Init"; +VAL_ 420 EA_Parken_beibehalten_HMS 0 "Parken_nicht_beibehalten" 1 "Parken_beibehalten" 2 "Init" 3 "Fehler"; +VAL_ 420 EA_Warnruckprofil 0 "keine_Ruckanforderung" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7"; +VAL_ 420 EA_eCall_Anf 0 "Keine_Anforderung" 1 "Ausloesen_eCall"; +VAL_ 420 EA_Funktionsstatus 0 "EA_INIT" 1 "EA_OFF" 2 "EA_STANDBY" 3 "EA_PHASE0_AKTIV" 4 "EA_PHASE1_AKTIV" 5 "EA_PHASE2_AKTIV" 6 "EA_PHASE3_AKTIV" 7 "EA_REVERSIBLER_FEHLER" 8 "EA_IRREVERSIBLER_FEHLER"; +VAL_ 420 EA_Gurtstraffer_Anf 0 "Keine_Anforderung" 1 "Haptik_1" 2 "Haptik_2" 3 "Haptik_3"; +VAL_ 420 EA_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" 6 "Parken_mit_P"; +VAL_ 420 EA_Sollbeschleunigung 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 496 EA_Texte 0 "keine_Anzeige" 1 "Nothalteassistent_fehlende_Fahreraktivitaet" 2 "Nothalteassistent_aktiv_Fahrzeugfuehrung_uebernehmen" 3 "Nothalteassistent_automatischer_Nothalt_wird_durchgefuehrt" 4 "Nothalteassistent_automatischer_Nothalt_durchgefuehrt" 5 "Nothalteassistent_Verbindung_zum_Notruf_wird_aufgebaut" 6 "Nothalteassistent_deaktiviert" 7 "Nothalteassistent_Eingriff_abgebrochen" 8 "Nothalteassistent_fehlende_Fahreraktivitaet_2" 9 "Sekundenschlaf_erkannt" 10 "LaneAssist_Lenkung_uebernehmen" 11 "ACA_Fahrzeugfuehrung_uebernehmen" 12 "EA_Fahr_Standstreifenwechsel" 14 "Nothalteassistent_nicht_verfuegbar_reversibel" 15 "Nothalteassistent_Stoerung_irreversibel"; +VAL_ 496 ACF_Lampe_Hands_Off 0 "keine_Anzeige" 1 "Hands_Off_erkannt"; +VAL_ 496 EA_Infotainment_Anf 0 "Init" 1 "Keine_Absenkung" 2 "Absenkung" 3 "Mute"; +VAL_ 496 EA_Tueren_Anf 0 "Keine_Anforderung" 1 "Tueren_entriegeln"; +VAL_ 496 EA_Innenraumlicht_Anf 0 "Innenraumbeleuchtung_ausschalten" 1 "Innenraumbeleuchtung_einschalten"; +VAL_ 496 zFAS_Warnblinken 0 "Aus" 1 "Statisch" 2 "Taster" 3 "Statisch_ohne_WBT"; +VAL_ 496 STP_Primaeranz 0 "keine_Anzeige" 1 "Verfuegbar" 2 "Aktiv" 3 "Uebernahme" 4 "Aktiv_Warnung" 5 "Nicht_Verfuegbar"; +VAL_ 496 EA_Bremslichtblinken 0 "kein_Blinken" 1 "Anforderung_Bremslichtblinken"; +VAL_ 496 EA_Blinken 0 "Kein_Blinken" 1 "Wechselblinken_links" 2 "Wechselblinken_rechts" 3 "Warnblinken" 4 "Warnblinken_Taster"; +VAL_ 591 Distance_Status 0 "Valid" 3 "Invalid"; +VAL_ 706 MO_Anzeige_StSt_Text 0 "keine_Anzeige" 1 "Systemfehler" 2 "Motor_manuell_starten" 3 "Rueckmeldung_durch_Fahrstufe_einlegen" 4 "Zuendungsabschaltwarnung_Timerstart" 5 "Zum_Motorstart_Bremse_treten" 6 "StSt_Aktivierung_nicht_moeglich_auf_Grund_Fahrprogramm"; +VAL_ 706 MO_Anzeige_StSt_Symbol 0 "keine_Anzeige" 1 "StSt_aktiv" 2 "Motorlauf_noetig" 3 "Fahrer_temporaer_abwesend" 4 "Fahrer_vielleicht_anwesend"; +VAL_ 706 MO_ADR_Status 0 "nicht_aktiv" 1 "ADR_angefordert" 2 "ADR_aktiv" 3 "ADR_Fehler"; +VAL_ 706 MO_AGA_Sound_Texte 0 "keine_Anzeige" 1 "Sound_off" 2 "Sound_on"; +VAL_ 706 MO_Anzeige_FMAus_Text 0 "keine_Anzeige" 1 "FMAus_Systemfehler"; +VAL_ 706 MO_Fehler_MSpG 0 "i.O." 1 "GebläŗĨ defekt oder Motorraumtemp. zu hoch"; +VAL_ 706 PEA_Texte 0 "Keine_Anzeige" 1 "PEA_Fahreruebernahme_noetig" 2 "PEA_Reku_nicht_verfuegbar"; +VAL_ 706 TSK_Ueberstimmt_vMax_FahrerInfo 0 "nicht_ueberstimmbar" 1 "ueberstimmbar" 2 "ueberstimmt"; +VAL_ 706 MO_Avus_Motorschutz 0 "keine Warnung" 1 "Drehzahlwarnung Stufe 1" 2 "Drehzahlwarnung Stufe 2" 3 "Drehzahlwarnung Stufe 3"; +VAL_ 706 MO_Rekuperationsstufe 0 "keine_Anzeige" 1 "Rekuperationsstufe_1" 2 "Rekuperationsstufe_2" 3 "Rekuperationsstufe_3" 4 "Rekuperationsstufe_4" 5 "Rekuperationsstufe_5" 6 "Rekuperationsstufe_auto" 7 "Init"; +VAL_ 706 TSK_Einheit_vMax_FahrerInfo 0 "km_h" 1 "mph"; +VAL_ 706 TSK_Status_vMax_FahrerInfo 0 "keine_Anzeige" 1 "Anzeige_im_Fahrzeugstatus" 2 "PopUp_ohne_Gong__Eintrag_FhzStat" 3 "PopUp_mit_Gong__Eintrag_FhzStat"; +VAL_ 706 MO_Red_Fahrleistung 0 "keine_Anzeige" 1 "kleine_Red" 2 "mittlere_Red_temp" 3 "mittlere_Red" 4 "grosse_Red_temp" 5 "grosse_Red"; +VAL_ 706 MO_Anz_Kuehlerluefter 0 "Kein_KuehlerluefterNachlauf" 1 "Text_Luefternachlauf_aktiv" 2 "Text_Luefternachlauf_DPF_aktiv" 3 "Platzhalter_weitere_Signale" 4 "Platzhalter_weitere_Signale" 5 "Platzhalter_weitere_Signale" 6 "Platzhalter_weitere_Signale" 7 "Platzhalter_weitere_Signale"; +VAL_ 706 MO_im_Leerlauf 0 "nicht_im_Leerlauf" 1 "im_Leerlauf"; +VAL_ 706 WIV_Enable_Oeldr_Motor 0 "Oeldruckauswertung_im_Kombi" 1 "Oeldruckauswertung_im_MSG"; +VAL_ 706 MO_OelMessung_Dauer 15 "keine_Messung_aktiv"; +VAL_ 706 TSK_vMax_FahrerInfo 0 "Init___kein_Wert"; +VAL_ 768 ACC_Tempolimit 0 "keine_Anzeige" 1 "5_zulHoechstgeschw" 2 "7_zulHoechstgeschw" 3 "10_zulHoechstgeschw" 4 "15_zulHoechstgeschw" 5 "20_zulHoechstgeschw" 6 "25_zulHoechstgeschw" 7 "30_zulHoechstgeschw" 8 "35_zulHoechstgeschw" 9 "40_zulHoechstgeschw" 10 "45_zulHoechstgeschw" 11 "50_zulHoechstgeschw" 12 "55_zulHoechstgeschw" 13 "60_zulHoechstgeschw" 14 "65_zulHoechstgeschw" 15 "70_zulHoechstgeschw" 16 "75_zulHoechstgeschw" 17 "80_zulHoechstgeschw" 18 "85_zulHoechstgeschw" 19 "90_zulHoechstgeschw" 20 "95_zulHoechstgeschw" 21 "100_zulHoechstgeschw" 22 "110_zulHoechstgeschw" 23 "120_zulHoechstgeschw" 24 "130_zulHoechstgeschw" 25 "140_zulHoechstgeschw" 26 "150_zulHoechstgeschw" 27 "160_zulHoechstgeschw" 28 "200_zulHoechstgeschw" 30 "250_zulHoechstgeschw" 31 "Ende_zulHoechstgeschw"; +VAL_ 768 ACC_Wunschgeschw_Farbe 0 "Grundfarbe" 1 "Farbe_1"; +VAL_ 768 ACC_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert" 1 "Warnung"; +VAL_ 768 ACA_Querfuehrung 0 "keine_Anzeige_oder_init" 1 "passiv" 2 "aktiv" 3 "Warnung"; +VAL_ 768 ACC_Regelung_AIO 0 "Regelung_Ampel_nicht_aktiv" 1 "Regelung_Ampel_aktiv"; +VAL_ 768 ACC_Wunschgeschw_02 1023 "keine_Anzeige"; +VAL_ 768 ACC_Abstandsindex_02 0 "Audi (Init), VW (passiv/aktiv_Freifahrt)" 1022 "aus_passiv" 1023 "aktiv_Freifahrt"; +VAL_ 768 ACC_Display_Prio 0 "hoechste_Prio" 1 "mittlere_Prio" 2 "geringe_Prio" 3 "keine_Prio"; +VAL_ 768 ACC_rel_Objekt_Zusatzanz 0 "keine Anzeige" 1 "Relevantes_Objekt_erkannt" 2 "Relevantes_Objekt_Abstandswarnung"; +VAL_ 768 ACC_Gesetzte_Zeitluecke 0 "keine_Anzeige" 1 "Zeitluecke_1" 2 "Zeitluecke_2" 3 "Zeitluecke_3" 4 "Zeitluecke_4" 5 "Zeitluecke_5" 6 "nicht_definiert" 7 "nicht_definiert"; +VAL_ 768 ACC_Optischer_Fahrerhinweis 0 "optischer_Fahrerhinweis_AUS" 1 "optischer_Fahrerhinweis_EIN"; +VAL_ 768 ACC_Warnhinweis 0 "kein_Warnhinweis" 1 "Warnhinweis"; +VAL_ 768 ACC_EGO_Fahrzeug 0 "keine_Anzeige" 1 "aktiv" 2 "Warnung" 3 "aktiv_stop" 4 "passiv"; +VAL_ 768 ACC_Relevantes_Objekt_02 0 "keine_Anzeige" 1 "Relevantes_Objekt_erkannt" 2 "Relevantes_Objekt_Warnung" 3 "passiv"; +VAL_ 768 ACC_Wunschgeschw_erreicht 0 "Wunschgeschwindigkeit_nicht_erreicht" 1 "Wunschgeschwindigkeit_erreicht"; +VAL_ 768 ACC_Anzeige_Zeitluecke 0 "Anzeige_Zeitluecke_nicht_angefordert" 1 "Anzeige_Zeitluecke_angefordert"; +VAL_ 768 ACC_Texte_Primaeranz_02 0 "keine Anzeige" 1 "VDA_ACC_Symbol_YYY_kmh_mph" 2 "Kurven_Symbol_YYY_kmh_mph" 3 "Tempolimit_Symbol_YYY_kmh_mph" 4 "ACC_anfahrbereit" 5 "eingestellte_Zeitluecke" 6 "Tuer offen !" 7 "Stehendes Objekt voraus" 8 "o o o" 9 "ACC aus" 10 "ACC startet" 11 "ACC Sensor Sicht !" 12 "ACC nicht verfuegbar" 13 "ACC Fehler" 14 "ESP Eingriff" 15 "ESP PASSIV !" 16 "Parkbremse !" 17 "Geschwindigkeitsgrenze" 18 "Waehlhebelposition !" 19 "Fahrer Gurtschloss offen !" 20 "Schalthebelposition !" 21 "Drehzahl !" 22 "HDC aktiv" 23 "Kupplung betaetigt" 24 "Gang einlegen !" 25 "Bremse ueberhitzt !" 26 "Steigung_Gefaelle_zu_gross" 27 "ABSTAND" 28 "Rechtsueberholen_verhindert" 29 "Linksueberholen_verhindert" 30 "Kreuzungs_Symbol" 31 "Kreisverkehr_Symbol" 32 "Gefaelle_Symbol" 33 "Tempolimit_Kurvenassistent_ein" 34 "Kurvenassistent_ein" 35 "Tempolimitassistent_ein" 36 "Achtung_Geschwindigkeitsueberschreitung" 37 "Tempolimit_und_Kurvenassistent_nicht_verfuegbar" 38 "Tempolimit_nicht_verfuegbar" 39 "Kurvenassistent_nicht_verfuegbar" 40 "Autobahnausfahrt_Symbol" 41 "Stauende_Symbol" 42 "Engstelle_Symbol" 43 "STP_verfuegbar" 44 "Ampel_vertikal" 45 "Ampel_horizontal" 46 "STA_verfuegbar"; +VAL_ 768 ACC_Texte_Zusatzanz_02 0 "keine_Anzeige" 1 "ACC_AUS" 2 "Standby" 3 "UEBERTRETEN" 4 "ABSTAND" 5 "DISTANZ_1" 6 "DISTANZ_2" 7 "DISTANZ_3" 8 "DISTANZ_4" 9 "DISTANZ_5" 10 "DISTANZ_1__dyn" 11 "DISTANZ_2__dyn" 12 "DISTANZ_3__dyn" 13 "DISTANZ_4__dyn" 14 "DISTANZ_5__dyn" 15 "DISTANZ_1__comf" 16 "DISTANZ_2__comf" 17 "DISTANZ_3__comf" 18 "DISTANZ_4__comf" 19 "DISTANZ_5__comf" 20 "DISTANZ_1__efficiency" 21 "DISTANZ_2__efficiency" 22 "DISTANZ_3__efficiency" 23 "DISTANZ_4__efficiency" 24 "DISTANZ_5__efficiency" 25 "DISTANZ_1__Stau" 26 "DISTANZ_2__Stau" 27 "DISTANZ_3__Stau" 28 "DISTANZ_4__Stau" 29 "DISTANZ_5__Stau" 30 "ACHTUNG" 31 "Abstandsanzeige" 32 "Abstandsanzeige_Warnung_aktiviert" 33 "STA_verfuegbar" 34 "Engstelle" 35 "RUV_aktiv_Rechtsverkehr" 36 "RUV_aktiv_Linksverkehr" 37 "STP_Verfuegbar" 38 "AW_Warnschwelle_1" 39 "AW_Warnschwelle_2" 40 "AW_Warnschwelle_3" 41 "AW_Warnung_1" 42 "AW_Warnung_2" 43 "AW_Warnung_3"; +VAL_ 768 STA_Primaeranz 0 "keine_Anzeige" 1 "STA_standby" 2 "STA_aktiv" 3 "STA_Warnung"; +VAL_ 768 ACC_Event_Wunschgeschw 1023 "None"; +VAL_ 768 Heartbeat 1 "ACC_Init_Low" 420 "ACC_Init_High" 221 "ACC_Available_Low" 360 "ACC_Available_High"; +VAL_ 768 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; +VAL_ 768 Lead_Type_Detected 1 "Lead_Detected" 0 "No_Lead_Detected"; +VAL_ 768 Lead_Type 5 "Bicycle" 3 "Car" 0 "None" 2 "Truck" 4 "Motorcycle"; +VAL_ 768 ACC_Events 3 "Starting_Available" 0 "None" 5 "Speed_Limit_Detected" 9 "Crossing" 4 "Speed_Limit_Ahead" 10 "Roundabout" 6 "Curve"; +VAL_ 768 Zeitluecke_1 0 "keine Anzeige"; +VAL_ 768 Zeitluecke_2 0 "keine Anzeige" 32 "Minimum"; +VAL_ 768 Zeitluecke_3 0 "keine Anzeige"; +VAL_ 768 Zeitluecke_4 0 "keine Anzeige" 40 "Minimum"; +VAL_ 768 Zeitluecke_5 0 "keine Anzeige"; +VAL_ 795 ESP_Lampe 0 "Aus" 1 "Ein"; +VAL_ 795 ABS_Lampe 0 "Aus" 1 "Ein"; +VAL_ 795 BK_Lampe_02 0 "aus" 1 "ein_statisch" 3 "Warnung"; +VAL_ 795 TC_Lampe 0 "Aus" 1 "Ein"; +VAL_ 795 ESP_m_Raddrehz 32765 "Unterspannung" 32766 "Init" 32767 "Fehler"; +VAL_ 795 ESP_Textanzeigen_03 0 "kein_Text" 1 "ESP_Stoerung" 2 "ABS_Stoerung" 3 "ESP_ABS_Stoerung" 4 "Werkstatt_Bremse" 5 "ASR_Stoerung" 6 "ESP_switched_off" 7 "ASR_off" 8 "ESP_ASR_on" 10 "keine_Bremskraftverstaerkung" 11 "ASR_aktiviert" 12 "ABS_ASR_Stoerung" 15 "ESP_offroad" 17 "ESP_sport" 18 "ESP_Zwangsaktivierung" 19 "ESP_Taster_Info" 20 "TC_aktiv" 21 "reserviert_fuer_Verlwarn" 22 "TC_switched_off" 23 "Verlwarn_akt_Rollsicher_inakt" 24 "ESP_SuperSport" 25 "ESP_Offroad_nicht_verfuegbar"; +VAL_ 795 ESP_Meldungen 0 "keine_Anzeige" 1 "Autohold_Hinweis_1" 2 "Stoerung_Autohold" 3 "Stoerung_Hillholder" 4 "Uebernehmen" 5 "Autohold_aus" 6 "Autohold_Hinweis_2"; +VAL_ 795 ESP_Fehlerstatus_Wegimp 0 "Wegimpulse_iO" 1 "Fehler"; +VAL_ 795 ESP_Wegimp_Ueberlauf 0 "Reset_und_kein_Ueberlauf" 1 "mindestens_1x_Ueberlauf"; +VAL_ 795 ESP_QBit_Wegimp_VA 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 795 ESP_HDC_Geschw_Farbe 0 "Standard_Farbe" 1 "abweichende_Farbe"; +VAL_ 795 ESP_Off_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 795 ESP_HDC_Regelgeschw 0 "nicht_verbaut" 125 "HDC_Standby" 126 "Init" 127 "Fehler"; +VAL_ 795 ESP_BKV_Warnung 0 "keine_Anzeige" 1 "keine_Bremskraftverstaerkung"; +VAL_ 817 MFL_Lokalaktiv 0 "war_nicht_lokal_aktiv" 1 "war_lokal_aktiv"; +VAL_ 817 MFL_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 817 MFL_Paddle_Verbau 0 "verbaut" 1 "nicht_verbaut"; +VAL_ 817 MFL_Tastencode_1 0 "Key_Released__No_Key" 1 "Context_Menu" 2 "Menu_Up__Next_Screen" 3 "Menu_Down__Previous_Screen" 4 "Up" 5 "Down" 6 "Up__Down_ThumbWheel" 7 "OK__ThumbWheel_Button" 8 "Cancel__Escape" 9 "Main_Menu" 10 "Side_Menu_left" 11 "Side_Menu_right" 12 "FAS_Menu" 13 "Left__Right_ThumbWheel" 14 "FAS_Menu_ThumbWheel" 16 "Volume_Up" 17 "Volume_Down" 18 "Volume_Up__Down_ThumbWheel" 19 "Volume_ThumbWheel_Button" 20 "Audio_Source" 21 "Arrow_A_Up__Right" 22 "Arrow_A_Down__Left" 23 "Arrow_B_Up__Right" 24 "Arrow_B_Down__Left" 25 "PTT__PushToTalk" 26 "PTT_Cancel" 27 "Route_Info" 28 "Hook" 29 "Hang_Up" 30 "Off_Hook" 31 "Light_On__Off" 32 "Mute" 33 "Joker1" 34 "Joker2" 35 "View" 36 "Arrow_A_Up__Down_ThumbWheel" 37 "Lenkradheizung" 38 "Rekuperation" 39 "Tube_Toggle" 40 "DRS_Drag_Reduction_System" 41 "Stopwatch_Start_Stop" 42 "Stopwatch_Nextlap" 100 "MAP" 101 "MAP_Boost" 102 "Turn_signal_left" 103 "Turn_signal_right" 104 "Turn_signal_off" 105 "Flashlight" 106 "Highbeam" 107 "Washer_button" 108 "Wiper_button_left" 109 "Wiper_button_right" 110 "Wiper_button_cancel" 111 "Exhaust_Sound" 112 "Drive_Select_button" 113 "Sport_button" 114 "ESP_Drift_Selection_ThumbWheel" 115 "PTT_special_vehicle" 116 "TravelAssist" 117 "Launch_Control" 118 "Drift_Mode_Button_Increase" 119 "Drift_Mode_Button_Decrease" 120 "Drift_Mode_Button_Select" 121 "Drive_Mode_Button_Increase" 122 "Drive_Mode_Button_Decrease" 123 "Drive_Mode_Button_Select" 124 "E_Boost_Button_Increase" 125 "E_Boost_Button_Decrease" 126 "E_Boost_Button_Select" 127 "PerformanceHybridButton_Increase" 128 "PerformanceHybridButton_Decrease" 129 "EV_Mode_Button" 130 "HUD_Button" 131 "PASM_Wheel" 132 "PASM_Button" 133 "PTV_Wheel" 134 "PTV_Button" 135 "TC_ESC_Wheel" 136 "TC_ESC_Button" 240 "Startup_Reset" 241 "Initialization"; +VAL_ 817 MFL_Tastencode_2 0 "Key_Released__No_Key" 1 "Context_Menu" 2 "Menu_Up__Next_Screen" 3 "Menu_Down__Previous_Screen" 4 "Up" 5 "Down" 6 "Up__Down_ThumbWheel" 7 "OK__ThumbWheel_Button" 8 "Cancel__Escape" 9 "Main_Menu" 10 "Side_Menu_left" 11 "Side_Menu_right" 12 "FAS_Menu" 13 "Left__Right_ThumbWheel" 14 "FAS_Menu_ThumbWheel" 16 "Volume_Up" 17 "Volume_Down" 18 "Volume_Up__Down_ThumbWheel" 19 "Volume_ThumbWheel_Button" 20 "Audio_Source" 21 "Arrow_A_Up__Right" 22 "Arrow_A_Down__Left" 23 "Arrow_B_Up__Right" 24 "Arrow_B_Down__Left" 25 "PTT__PushToTalk" 26 "PTT_Cancel" 27 "Route_Info" 28 "Hook" 29 "Hang_Up" 30 "Off_Hook" 31 "Light_On__Off" 32 "Mute" 33 "Joker1" 34 "Joker2" 35 "View" 36 "Arrow_A_Up_Right_Down_Left_ThumbWheel" 37 "Lenkradheizung" 38 "Rekuperation" 39 "Tube_Toggle" 40 "DRS_Drag_Reduction_System" 41 "Stopwatch_Start_Stop" 42 "Stopwatch_Nextlap" 100 "MAP" 101 "MAP_Boost" 102 "Turn_signal_left" 103 "Turn_signal_right" 104 "Turn_signal_off" 105 "Flashlight" 106 "Highbeam" 107 "Washer_button" 108 "Wiper_button_left" 109 "Wiper_button_right" 110 "Wiper_button_cancel" 111 "Exhaust_Sound" 112 "Drive_Select_button" 113 "Sport_button" 114 "ESP_Drift_Selection_ThumbWheel" 115 "PTT_special_vehicle" 116 "TravelAssist" 117 "Launch_Control" 118 "Drift_Mode_Button_Increase" 119 "Drift_Mode_Button_Decrease" 120 "Drift_Mode_Button_Select" 121 "Drive_Mode_Button_Increase" 122 "Drive_Mode_Button_Decrease" 123 "Drive_Mode_Button_Select" 124 "E_Boost_Button_Increase" 125 "E_Boost_Button_Decrease" 126 "E_Boost_Button_Select" 127 "PerformanceHybridButton_Increase" 128 "PerformanceHybridButton_Decrease" 129 "EV_Mode_Button" 130 "HUD_Button" 131 "PASM_Wheel" 132 "PASM_Button" 133 "PTV_Wheel" 134 "PTV_Button" 135 "TC_ESC_Wheel" 136 "TC_ESC_Button" 240 "Startup_Reset" 241 "Initialization"; +VAL_ 817 MFL_Eventcode_1 0 "W_no_event____T_no_event" 1 "W_1_Tick_up__T_pressed_normal" 2 "W_2_Ticks_up__T_touched" 3 "W_3_Ticks_up__T_double_click_nor" 4 "W_4_Ticks_up__T_long_press_nor_1" 5 "W_5_Ticks_up__T_long_press_nor_2" 6 "W_6_Ticks_up__T_long_press_nor_3" 7 "W_7_Ticks_up" 9 "W_7_Ticks_dn__T_pressed_strong" 10 "W_6_Ticks_dn" 11 "W_5_Ticks_dn__T_double_click_str" 12 "W_4_Ticks_dn__T_long_press_str_1" 13 "W_3_Ticks_dn__T_long_press_str_2" 14 "W_2_Ticks_dn__T_long_press_str_3" 15 "W_1_Tick_dn"; +VAL_ 817 MFL_Eventcode_2 0 "W_no_event____T_no_event" 1 "W_1_Tick_up__T_pressed_normal" 2 "W_2_Ticks_up__T_touched" 3 "W_3_Ticks_up__T_double_click_nor" 4 "W_4_Ticks_up__T_long_press_nor_1" 5 "W_5_Ticks_up__T_long_press_nor_2" 6 "W_6_Ticks_up__T_long_press_nor_3" 7 "W_7_Ticks_up" 9 "W_7_Ticks_dn__T_pressed_strong" 10 "W_6_Ticks_dn" 11 "W_5_Ticks_dn__T_double_click_str" 12 "W_4_Ticks_dn__T_long_press_str_1" 13 "W_3_Ticks_dn__T_long_press_str_2" 14 "W_2_Ticks_dn__T_long_press_str_3" 15 "W_1_Tick_dn"; +VAL_ 817 MFL_Marke 0 "VW" 1 "Audi" 2 "Seat" 3 "Skoda" 4 "VW_Nutzf" 5 "Bugatti" 6 "Lamborghini" 7 "Bentley" 8 "Rolls Royce" 9 "Quattro" 10 "kein_Hersteller_1" 11 "kein_Hersteller_2" 12 "kein_Hersteller_3" 13 "kein_Hersteller_4" 14 "Ford" 15 "Porsche"; +VAL_ 817 MFL_Tip_Down 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 817 MFL_Tip_Up 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 817 MFL_SatModul_links_Err 0 "kein_Fehler" 1 "Fehler"; +VAL_ 817 MFL_SatModul_rechts_Err 0 "kein_Fehler" 1 "Fehler"; +VAL_ 817 MFL_LR_HZG_Status 0 "inaktiv" 1 "aktiv"; +VAL_ 817 MFL_LR_HZG_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Signalhorn 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 817 MFL_Signalhorn_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Tip_links_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Tip_rechts_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Taste_links_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Taste_rechts_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_ECU_Err 0 "normal" 1 "Fehler"; +VAL_ 817 MFL_Response_Err 0 "normal" 1 "Fehler"; +VAL_ 850 Parken_SM_03_MUX 0 "MUX_Gruppe_Punktinfo_0" 1 "MUX_Gruppe_Punktinfo_1" 2 "MUX_Gruppe_Punktinfo_2" 3 "MUX_Gruppe_Punktinfo_3" 4 "MUX_Gruppe_Punktinfo_4" 5 "MUX_Gruppe_Punktinfo_5" 6 "MUX_Gruppe_Punktinfo_6"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_00 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_01 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_02 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_03 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_04 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_05 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 850 Parken_SM_03_Traj_Trans_ID_06 0 "Transaktions_ID_0" 1 "Transaktions_ID_1" 2 "Transaktions_ID_2" 3 "Transaktions_ID_3" 4 "Transaktions_ID_4" 5 "Transaktions_ID_5" 6 "Transaktions_ID_6" 7 "Transaktions_ID_7" 8 "Transaktions_ID_8" 9 "Transaktions_ID_9" 10 "Transaktions_ID_10" 11 "Transaktions_ID_11" 12 "Transaktions_ID_12" 13 "Transaktions_ID_13" 14 "Transaktions_ID_14" 15 "Transaktions_ID_15"; +VAL_ 869 NVEM_Pilot_Info 0 "Init" 1 "keine_Einschraenkung" 2 "Veto_1" 3 "Veto_2"; +VAL_ 869 NVEM_P_Generator_Status 0 "gefiltert" 1 "ungefiltert"; +VAL_ 869 BEM_P_Generator 255 "Fehler"; +VAL_ 869 BEM_n_LLA 0 "keine_Erhoehung" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; +VAL_ 869 BEM_Anf_KL 0 "keine Anforderung" 1 "Anforderung KÃŧhlerlÃŧfter Ansteuerung"; +VAL_ 869 BEM_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; +VAL_ 869 BEM_Batt_Ab 0 "verbunden" 1 "nicht_verbunden"; +VAL_ 869 BEM_Hybrid_Info 0 "keine_Einschraenkung_durch_Energiemanagement" 1 "Motorstart_ueber_12V_Starter_nur_bei_0kmh_moeglich" 2 "kein_Motorstart_ueber_12V_Starter_nach_el_Fahrtbetrieb" 3 "Systemfehler"; +VAL_ 869 NVEM_Red_KL 0 "Init" 1 "Abschaltung_KL" 2 "Reduzierung_KL"; +VAL_ 869 NVEM_Freilauf_Info 0 "Freilauf_freigegeben" 1 "Weiches_Veto_uebertippbar" 2 "Hartes_Veto_Abbruch" 3 "Freilauf_Anforderung"; +VAL_ 869 BEM_HYB_DC_uMinLV 254 "Init" 255 "Fehler"; +VAL_ 870 BM_ZV_auf 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_ZV_zu 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_DWA_ein 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_DWA_Alarm 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Crash 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Panik 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Not_Bremsung 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_GDO 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Warnblinken 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Taxi_Notalarm 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Telematik 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_links 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_rechts 0 "inaktiv" 1 "aktiv"; +VAL_ 870 Blinken_li_Fzg_Takt 0 "Blinker_links_ausgeschaltet" 1 "Blinker_links_eingeschaltet"; +VAL_ 870 Blinken_re_Fzg_Takt 0 "Blinker_rechts_ausgeschaltet" 1 "Blinker_rechts_eingeschaltet"; +VAL_ 870 Blinken_li_Kombi_Takt 0 "Blinkerkontrolllampe_links_ausgeschaltet" 1 "Blinkerkontrolllampe_links_eingeschaltet"; +VAL_ 870 Blinken_re_Kombi_Takt 0 "Blinkerkontrolllampe_rechts_ausgeschaltet" 1 "Blinkerkontrolllampe_rechts_eingeschaltet"; +VAL_ 870 BM_NBA_n_codiert_n_aktiv 0 "codiert_AND_kein_Fehler" 1 "nicht_codiert_OR_Fehler_erkannt"; +VAL_ 870 BM_NBA_Status 0 "NBA_nicht_aktiv" 1 "BRL_Dunkelphase" 3 "BRL_Hellphase"; +VAL_ 870 BM_WBT_Beleuchtung 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_HD_Oeffnung_angelernt 0 "keine_Quittierung" 1 "Quittierung"; +VAL_ 870 BM_Autobahn 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Rollenmodus_Blinken 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Recas 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Wischblinken 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_Telematik_Abbruchgrund 0 "Init" 1 "speed_out_of_range" 2 "defect" 3 "clamp_s_on" 4 "clamp_15_on" 5 "door_open" 6 "engine_hood_open" 7 "trunk_open" 8 "convertible_top_not_locked" 9 "horn_activated_by_user" 10 "Higher_Prioritiy_Function_active" 11 "Central_Lock_status_changed" 12 "Request_Dropped_by_Requester" 13 "Service_Duration_Expired" 14 "not_possible_due_to_coding" 15 "no_reason_or_unknown_timeout"; +VAL_ 870 BM_PiloPa 0 "PiloPa_Blinkerquittierung_inaktiv" 1 "PiloPa_Blinkerquittierung_aktiv"; +VAL_ 870 DWA_Alarmquelle 0 "kein_Ausloesegrund" 1 "Tuerkontakt_Fahrertuer" 2 "Tuerkontakt_Beifahrertuer" 3 "Tuerkontakt_hinten_links" 4 "Tuerkontakt_hinten_rechts" 5 "Motorhaubenkontakt_vorne" 6 "Kofferraum_hinten" 7 "Masseschleife_der_Heckscheibe" 8 "Innenraumueberwachung" 9 "Alarm_durch_Noteinstieg" 10 "Sounder" 11 "Neigungssensor" 12 "TSG_FT_am_CAN_Bus" 13 "TSG_BT_am_CAN_Bus" 14 "TSG_HFS_am_CAN_Bus" 15 "TSG_HBFS_am_CAN_Bus" 16 "Klemme_15" 17 "Klemme_15sig" 18 "frei" 19 "Anhaengerueberwachung" 20 "Scheinwerferueberwachung_links" 21 "Scheinwerferueberwachung_rechts" 22 "Handschuhkasten" 23 "Verdeckueberwachung" 24 "OBD_Alarm" 25 "Power_on_Reset" 30 "Init" 31 "Fehler"; +VAL_ 888 GNSS_Ortung_Hoehe 4094 "Init" 4095 "Fehler"; +VAL_ 891 GNSS_UTC_Zeit 0 "Init"; +VAL_ 891 GNSS_Empfaenger_Status 0 "Backup_Mode" 1 "Live"; +VAL_ 891 GNSS_GPS_in_Nutzung 0 "unbenutzt" 1 "benutzt"; +VAL_ 891 GNSS_GLONASS_in_Nutzung 0 "unbenutzt" 1 "benutzt"; +VAL_ 891 GNSS_Empfangbare_Satelliten 0 "Init" 31 "31_oder_mehr"; +VAL_ 891 GNSS_Sichtbare_Satelliten 0 "Init" 31 "31_oder_mehr"; +VAL_ 891 GNSS_Genutzte_Satelliten 0 "Init" 31 "31_oder_mehr"; +VAL_ 916 WBA_Fahrstufe_02 0 "Zwischenstellung_keine_Position" 1 "Position_P" 2 "Position_R" 3 "Position_N" 4 "Position_D" 5 "Position_S" 6 "Position_M_Tippfunktion" 7 "Kurzzeit_M" 8 "Position_E" 9 "Position_MS" 10 "Position_S_Plus" 11 "Position_MS_Plus" 12 "Position_Offroad" 13 "Position_B"; +VAL_ 916 WBA_ZielFahrstufe 0 "keine_Gangempfehlung_kein_Gang_eingelegt" 1 "Pfeil_nach_S" 2 "Pfeil_nach_D" 3 "Pfeil_nach_M" 4 "Pfeil_nach_E"; +VAL_ 916 WBA_GE_Warnung_02 0 "keine_Anzeige" 1 "Fehlereskalationsstufe_I" 2 "Fehlereskalationsstufe_II" 3 "Weiterfahrt_nur_eingeschraenkt_moeglich__Kein_R_Gang" 4 "Getriebefehler_Weiterfahrt_nur_in_D_moeglich__P_bei_Motor_aus" 5 "Wegrollgefahr__P_nicht_moeglich" 6 "Paddlenotbetrieb_Schema+Warnung" 7 "Paddlenotbetrieb_Schema" 8 "Geschwindigkeitsbegrenzung_Notlauf" 9 "Fehlereskalationsst_o_Einschr" 10 "Fehlereskalationsstufe_v_Limit" 11 "Parksperre_Infostufe" 12 "Parksperre_Warnstufe_I" 13 "Parksperre_Warnstufe_II"; +VAL_ 916 WBA_eing_Gang_02 0 "keine_Ganganzeige" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Gang_9" 10 "Funktion_Ganganzeigeunterdrueckung" 11 "Gang_10"; +VAL_ 916 WBA_GE_Texte 0 "keine_Anzeige" 1 "zum_Einlegen_einer_Fahrstufe_Fussbremse_betaetigen__ShiftLock_Information" 2 "zum_Einlegen_von_R_N_D_Fussbremse_betaetigen_und_Motor_starten" 3 "Wegrollgefahr_bitte_P_einlegen" 4 "Achtung_Zeitueberschreitung_P_wird_eingelegt" 5 "Wiederanmeldeprozedur_Bremse_betaetigen" 6 "P_nur_im_Stillstand_moeglich" 7 "Rennstart_aktiv"; +VAL_ 916 WBA_Segeln_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 916 WBA_Schaltschema 0 "kein_Schaltschema" 1 "xxxD(S)" 2 "xxxD_S" 3 "xxxS(D)" 4 "xxxS_D" 5 "xxxM(D)" 6 "xxxM_D" 7 "xxxM(S)" 8 "xxxM_S" 9 "xxxE(D)" 10 "xxxE_D" 11 "xxxE(S)" 12 "xxxE_S" 13 "xxxE(M)" 14 "xxxE_M"; +VAL_ 916 WBA_GE_Zusatzwarnungen 0 "keine_Anzeige" 1 "Getriebeueberhitzung_Warnstufe_I" 2 "Getriebeueberhitzung_Warnstufe_II" 3 "Getriebefehler_Bitte_anhalten_und_P_einlegen"; +VAL_ 916 GE_Sollgang 0 "keine_Empfehlung" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Gang_9" 11 "Gang_10"; +VAL_ 916 GE_Tipschaltempf_verfuegbar 0 "nicht_verfuegbar" 1 "verfuegbar"; +VAL_ 916 WBA_GE_Texte_02 0 "Keine_Anzeige" 1 "Fahrtrichtungswechsel_nur_nach_Stillstandt" 2 "Ladestecker_gesteckt" 3 "zusaetzlicher_Service_erforderlich" 4 "eLaunch_Aktiv" 5 "eLaunch_nicht_moeglich" 6 "WH_S_nicht_moeglich_Offroad" 7 "WH_S_nicht_moeglich_RangeMode"; +VAL_ 916 WBA_GE_Texte_03 0 "init" 1 "LC_not_available" 2 "LCperformance_not_possible" 3 "LCperformance_possible" 4 "LCperformance_armed" 5 "LCperformance_preparation" 6 "LCperformance_launch" 7 "LCperformance_aborted" 8 "LCsmoke_not_possible" 9 "LCsmoke_possible" 10 "LCsmoke_armed" 11 "LCsmoke_launch" 12 "LCsmoke_aborted" 15 "Fehler"; +VAL_ 916 WBA_Blinken 0 "kein_WBA_Blinken" 1 "WBA_Blinken"; +VAL_ 916 GE_Wiederstart_Anz_Std 0 "keine_Anzeige" 1 "Standard_Wiederstartgrund"; +VAL_ 916 GE_Stoppverbot_Anz_01 0 "keine_Anzeige" 1 "Temperaturbedingung"; +VAL_ 916 GE_Stoppverbot_Anz_02 0 "keine_Anzeige" 1 "Drucksensorausfall"; +VAL_ 916 GE_Stoppverbot_Anz_03 0 "keine_Anzeige" 1 "Grundeinstellung"; +VAL_ 916 GE_Stoppverbot_Anz_04 0 "keine_Anzeige" 1 "Demontagestellung"; +VAL_ 916 GE_Stoppverbot_Anz_05 0 "keine_Anzeige" 1 "Eingeschraenkte_Fahrfunktion_Notlauf_Liegenbleiber"; +VAL_ 916 GE_Stoppverbot_Anz_06 0 "keine_Anzeige" 1 "Stoppverbot_ueber_Applikation"; +VAL_ 916 GE_Stoppverbot_Anz_07 0 "keine_Anzeige" 1 "Schaltung_aktiv"; +VAL_ 916 GE_Stoppverbot_Anz_Std 0 "keine_Anzeige" 1 "Standard_Stoppvetogrund"; +VAL_ 919 LDW_Gong 1 "Chime" 2 "Beep" 0 "None"; +VAL_ 919 LDW_Texte 8 "laneAssistTakeOver" 4 "laneAssistTakeOverUrgent" 0 "none"; +VAL_ 949 KL_Drehz_Anh 0 "keine_Anhebung" 1 "Drehzahlanhebung_vom_Motor_angefordert"; +VAL_ 949 KL_Vorwarn_Komp_ein 0 "Init" 1 "Vorwarnung_Kompressor_ein"; +VAL_ 949 KL_AC_Schalter 0 "aus" 1 "ein"; +VAL_ 949 KL_Komp_Moment_alt 1 "veraltet_bzw_Ermittlung_des_Moments_nicht_moeglich__zB_keine_Drehzahl_kein_Kaeltemitteldruck"; +VAL_ 949 KL_Vorwarn_Zuheizer_ein 0 "keine_Vorwarnung" 1 "Vorwarnung_Zuheizer_ein"; +VAL_ 949 KL_Zustand 0 "Aus" 1 "Ein"; +VAL_ 949 KL_Kompressorkupplung_linear 253 "volle_Ansteuerung" 254 "Init__nicht_bedient"; +VAL_ 949 KL_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 949 KL_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 949 KL_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 949 KL_T_Charge 0 "Taster_nicht_betaetigt" 1 "Taster_betaetigt"; +VAL_ 949 KL_Last_Kompr 255 "Fehler"; +VAL_ 949 KL_Spannungs_Anf 0 "keine_Anforderung" 1 "Anforderung_Stufe_1" 2 "Anforderung_Stufe_2" 3 "Anforderung_Stufe_3"; +VAL_ 949 KL_Thermomanagement 0 "keine_Freigabe_TMM__max_Heizbedarf" 1 "kleine_Freigabe_TMM" 2 "mittlere_Freigabe_TMM" 3 "volle_Freigabe_TMM__kein_Heizbedarf"; +VAL_ 949 KL_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; +VAL_ 949 KL_Freilauf_Info 0 "Freilauf_freigegeben" 1 "Uebergang_in_Freilauf_unzulaessig" 2 "Freilauf_nicht_freigegeben_Abbruch" 3 "Freilauf_Anforderung"; +VAL_ 949 KL_Anf_KL 255 "Fehler"; +VAL_ 949 KL_el_Zuheizer_Stufe 0 "Aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; +VAL_ 949 KL_Ausstattung_Klima 0 "Heizung_elektrisch" 1 "Klimamanuell_elektrisch" 2 "Climatic__1_Zone" 3 "Climatronic__1_Zone" 4 "Climatronic__2_Zonen" 5 "Climatronic__3_Zonen" 6 "Climatronic__4_Zonen" 7 "reserviert"; +VAL_ 949 KL_Variante_Standheizung 0 "Wasserstandheizung_60_min_Laufzeit" 1 "Luftstandheizung_120_min_Laufzeit" 2 "Wasserstandheizung_120_min_Laufzeit" 3 "Wasser_und_Luftstandheizung_120_min_Laufzeit"; +VAL_ 958 MO_StartStopp_Status 0 "System_in_diesem_KL15_Zyklus_nicht_verfuegbar" 1 "System_aktiv_keine_Freigabe_durch_StartStop_Koordinator" 2 "System_aktiv_alle_Freigaben_liegen_vor" 3 "System_aktiv_mindestens_eine_Freigabe_fehlt"; +VAL_ 958 MO_StartStopp_Wiederstart 0 "Wiederstart_inaktiv" 1 "Wiederstart_aktiv"; +VAL_ 958 MO_StartStopp_Motorstopp 0 "Motor_Stop_inaktiv" 1 "Motor_Stop_aktiv"; +VAL_ 958 MO_Freig_Reku 0 "Rekuperations-Modus aus" 1 "Empfehlung Spannungsanhebung" 2 "Empfehlung Spannungsabsenkung" 3 "Rekuperationsmodus aktiv, Spannungsvariation nicht notwendig"; +VAL_ 958 MO_Kl_75 0 "Aus" 1 "Ein"; +VAL_ 958 MO_Kl_50 0 "aus" 1 "KL50_ein_Startausfuehrung_Fahrer"; +VAL_ 958 MO_Gangposition 0 "Gang_N" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 9 "Automat_P" 10 "Automat_Vorwaerts_S" 11 "Automat_Vorwaerts_D/E" 12 "Zwischenstellung" 13 "Gang_R" 14 "Istgang_nicht_definiert" 15 "Fehler"; +VAL_ 958 MO_StartStopp_Fahrerwunsch 0 "Init" 1 "Stoppverbot_durch_Fahrer" 2 "Stoppfreigabe_durch_Fahrer" 3 "Stoppanforderung_durch_Fahrer"; +VAL_ 958 MO_HYB_Fahrbereitschaft 0 "keine_Fahrbereitschaft" 1 "Fahrbereitschaft"; +VAL_ 958 MO_Ext_E_Fahrt_aktiv 0 "Rueckmeldung_E_Taster_aus" 1 "Rueckmeldung_E_Taster_ein"; +VAL_ 958 MO_Fahrer_bremst 0 "kein_Bremsen" 1 "Bremse_betaetigt"; +VAL_ 958 MO_QBit_Fahrer_bremst 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 958 MO_BLS 0 "kein_Bremsen" 1 "Bremse_betaetigt"; +VAL_ 958 MO_Konsistenz_Bremsped 0 "Bremspedalinformation_plausibel" 1 "Bremspedalinformation_unplausibel"; +VAL_ 958 MO_KomFehler_ESP 0 "kein_Fehler" 1 "Fehler"; +VAL_ 958 MO_Klima_Eingr 0 "kein Eingriff" 1 "Klimakompressor ausschalten" 2 "Klimakompressor Leistungsreduzierung" 3 "Klimakompressor aufgrund der Heissleuchtenvorwarnung ausschalten"; +VAL_ 958 MO_Aussp_Anlass 0 "Anlasser_darf_angesteuert_werden" 1 "Anlasser_ausspuren__Ansteuerung_nicht_moeglich"; +VAL_ 958 MO_Freig_Anlass 0 "Start_nicht_zulaessig" 1 "Startfreigabe"; +VAL_ 958 MO_Kuppl_schalter 0 "Schalter_sagt_ausgekuppelt" 1 "Schalter_sagt_eingekuppelt"; +VAL_ 958 MO_Interlock 0 "Interlockschalter_nicht_betaetigt" 1 "Interlockschalter_betaetigt"; +VAL_ 958 MO_Motor_laeuft 0 "Motor_laeuft_nicht" 1 "Motor_laeuft_autark_und_stabil_und_darf_mechanisch_belastet_werden"; +VAL_ 958 MO_Kickdown 0 "kein_Kickdown" 1 "Kickdown"; +VAL_ 958 MO_QBit_KL_75 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 958 MO_EKlKomLeiRed 0 "keine_Leistungsbegr" 1 "Leistungsbegr_75" 2 "Leistungsbegr_50" 3 "Leistungsbegr_25"; +VAL_ 958 MO_Handshake_STH 0 "keine EKP-Ansteuerung durch STH-Anforderung" 1 "EKP-Ansteuerung durch STH-Anforderung"; +VAL_ 958 MO_BKV_Unterdruckwarnung 0 "Unterdruckhaushalt_iO" 1 "Unterdruckhaushalt_niO"; +VAL_ 958 MO_Freigabe_Segeln 0 "Segelbetrieb_nicht_freigegeben" 1 "Segelbetrieb_freigegeben"; +VAL_ 958 MO_PTC_Status 0 "nicht_unterstuetzt" 1 "Stufe_0" 2 "Stufe_1" 3 "Stufe_2" 4 "Stufe_3" 7 "PTC_am_BCM"; +VAL_ 958 MO_QBit_Gangposition 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 958 MO_Signalquelle_Gangposition 0 "Sensorsignal" 1 "Modellsignal"; +VAL_ 958 MO_Remotestart_Betrieb 0 "MSG_nicht_bereit_fuer_RS_Betrieb" 1 "MSG_bereit_fuer_oder_im_RS_Betrieb"; +VAL_ 958 MO_Remotestart_moeglich 0 "Remotestart_nicht_moeglich" 1 "Remotestart_moeglich"; +VAL_ 958 MO_FMAus_aktiv 0 "inaktiv" 1 "Segeln_mit_Motor_aus_aktiv"; +VAL_ 958 MO_FMAus_Startvariante 0 "kein_Motorstart" 1 "Motorstart_elektrischer_Starter" 2 "GetriebeAnschleppstart" 3 "GetriebeNotAnschleppstart"; +VAL_ 958 MO_BMS_NV_Anf_stuetzen 0 "nicht_notwendig" 1 "notwendig"; +VAL_ 958 MO_Zylinderabschaltung 0 "Vollmotorbetrieb_VMB" 1 "Uebergang_HMB_in_VMB" 2 "Uebergang_VMB_in_HMB" 3 "Halbmotorbetrieb_HMB"; +VAL_ 958 MO_HYB_VM_aktiv 0 "VM_nicht_aktiv" 1 "VM_aktiv"; +VAL_ 958 MO_StartVorauss_erfuellt 0 "Signal_nicht_bedient" 1 "StartVorauss_nicht_ueberpruefbar" 2 "StartVorauss_nicht_erfuellt" 3 "StartVorauss_erfuellt"; +VAL_ 960 RSt_Fahrerhinweise 0 "Init" 1 "Fahreruebernahme_Hinweis_ZAT_Automat_ohne_Gong" 2 "Fahreruebernahme_Hinweis_ZAT_Automat_mit_Gong" 3 "Fahreruebernahme_Hinweis_ZAT_Handschalter_ohne_Gong" 4 "Fahreruebernahme_Hinweis_ZAT_Handschalter_mit_Gong" 5 "Fahreruebernahme_Hinweis_ZAS_Automat_ohne_Gong" 6 "Fahreruebernahme_Hinweis_ZAS_Automat_mit_Gong" 7 "Fahreruebernahme_Hinweis_ZAS_Handschalter_ohne_Gong" 8 "Fahreruebernahme_Hinweis_ZAS_Handschalter_mit_Gong" 9 "RemoteStart_aktiv_ohne_Gong" 10 "RemoteStart_aktiv_mit_Gong" 11 "void" 12 "void" 13 "void" 14 "void" 15 "void"; +VAL_ 960 ZAS_Kl_S 0 "aus" 1 "S_Kontakt_ein"; +VAL_ 960 ZAS_Kl_15 0 "aus" 1 "ein"; +VAL_ 960 ZAS_Kl_X 0 "aus" 1 "ein"; +VAL_ 960 ZAS_Kl_50_Startanforderung 0 "aus" 1 "KL50_ein_Startwunsch_Fahrer"; +VAL_ 960 BCM_Remotestart_Betrieb 0 "kein_RS_Betrieb" 1 "RS_Betrieb"; +VAL_ 960 ZAS_Kl_Infotainment 0 "inaktiv" 1 "aktiv"; +VAL_ 960 BCM_Remotestart_KL15_Anf 0 "inaktiv" 1 "aktiv"; +VAL_ 960 BCM_Remotestart_MO_Start 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 960 KST_Warn_P1_ZST_def 0 "nicht_defekt" 1 "defekt"; +VAL_ 960 KST_Warn_P2_ZST_def 0 "nicht_defekt" 1 "defekt"; +VAL_ 960 KST_Fahrerhinweis_1 0 "inaktiv" 1 "aktiv"; +VAL_ 960 KST_Fahrerhinweis_2 0 "inaktiv" 1 "aktiv"; +VAL_ 960 BCM_Ausparken_Betrieb 0 "kein_Betrieb" 1 "Ausparkvorgang_aktiv"; +VAL_ 960 KST_Fahrerhinweis_4 0 "inaktiv" 1 "aktiv"; +VAL_ 960 KST_Fahrerhinweis_5 0 "inaktiv" 1 "aktiv"; +VAL_ 960 KST_Fahrerhinweis_6 0 "inaktiv" 1 "aktiv"; +VAL_ 967 MO_Kuehlerluefter_MUX 0 "Kuehlerluefter_1" 1 "Kuehlerluefter_2"; +VAL_ 967 MO_Kuehlerluefter_1 126 "Init" 127 "Fehler"; +VAL_ 967 MO_Kuehlerluefter_2 126 "Init" 127 "Fehler"; +VAL_ 967 MO_EFLEX_Lampe 0 "Lampe_aus" 1 "Lampe_ein" 2 "Lampe_blinkend" 3 "Lampe_blinkend_mit_Akustik"; +VAL_ 967 MO_KJS_nicht_bereit 0 "kein_Fehler" 1 "Fehler"; +VAL_ 967 MO_ITM_Warnung_Pumpe 0 "keine_Warnung" 1 "ITM_Warnung"; +VAL_ 967 WIV_Anzeige_aktiv 0 "Anzeige aus" 1 "WIV Anzeige aktiv"; +VAL_ 967 WIV_Oelmin_Warn 0 "in_Ordnung" 1 "Warnung"; +VAL_ 967 WIV_Sensorfehler 0 "in_Ordnung" 1 "Sensor_defekt"; +VAL_ 967 WIV_Schieflage 0 "Fahrzeug_gerade" 1 "Fahrzeug_in_Schieflage"; +VAL_ 967 MO_Zustand_HWP 0 "HWP_nicht_schaltbar" 1 "HWP_foerdert_nicht" 2 "HWP_foerdert" 3 "reserviert"; +VAL_ 967 OLEV_Systemstoerung 0 "ÖŦsystem i.O." 1 "SystemstÃļrung ÖŦsystem"; +VAL_ 967 MO_Oelwarnung_max 0 "keine_Warnung" 1 "Warnfall_aktiv"; +VAL_ 967 WIV_Oelsystem_aktiv 0 "Anzeige_aus" 1 "Anzeige_aktiv"; +VAL_ 967 WIV_nicht_betriebswarm 0 "Motor_warm" 1 "Motor_nicht_betriebswarm"; +VAL_ 967 WIV_Ueberfuell_Warn 0 "in_Ordnung" 1 "Ueberfuellwarnung"; +VAL_ 967 WIV_laufender_Motor 0 "Messung_moeglich" 1 "Messung_nicht_moeglich"; +VAL_ 967 MO_E_Warnungen 0 "keine_Anzeige" 1 "Fehler_Elektrosystem_Anhalten" 2 "Fehler_Elektrosystem_Werkstatt" 3 "Elektrosystem_ueberhitzt_Stopp" 4 "Fehler_Hybridsystem_Anhalten" 5 "Fehler_Hybridsystem_Werkstatt" 6 "Fehler_Wasserstoffsystem_Anhalte" 7 "Fehler_Wasserstoffsystem_Werksta" 8 "reserviert_keine_Anzeige" 9 "reserviert_keine_Anzeige" 10 "reserviert_keine_Anzeige" 11 "reserviert_keine_Anzeige" 12 "reserviert_keine_Anzeige" 13 "reserviert_keine_Anzeige" 14 "reserviert_keine_Anzeige" 15 "reserviert_keine_Anzeige"; +VAL_ 967 MO_Text_Motorstart 0 "keine_Anzeige" 1 "Motor_im_Stoppbetrieb" 2 "StartStopp_sicherheitsbedingt_deaktiviert" 3 "System_fordert_Wiederstart" 4 "Aufforderung_Motorstart" 5 "Motorlauf_noetig" 6 "Motorlaufwarnung" 9 "Unerwuenschter_Motorstillstand" 10 "Motorstart_nicht_moeglich" 11 "Fehler_Kupplungsschalter" 12 "Motor_startet" 13 "Kupplung_betaetigen" 14 "Waehlhebel_in_PN_Position" 15 "Bremse_treten"; +VAL_ 967 MO_E_Texte 0 "keine_Anzeige" 1 "Batterie_fast_leer" 2 "Ladestecker_nicht_fahrbereit" 3 "VM_Betrieb_erforderlich" 4 "Batterie_laedt_Nicht_ausschalten" 5 "Bitte_Bremse_treten" 6 "manueller_Neustart_erforderlich" 7 "Stopp_Fahrzeug_nicht_abschleppen" 8 "kein_Neustart_Haube_nicht_oeffnen" 9 "Motorstart_im_naechsten_Zyklus" 10 "VM_erforderlich_EVMode_abwaehlen" 11 "laengerer_VMBetrieb_Bordbuch" 12 "Tank_leer_VM_nicht_verfuegbar" 13 "Bitte_warten_Motor_startet" 14 "kein_Start_Batterietemperatur" 15 "Ende_elektrische_Reichweite_erreicht"; +VAL_ 967 WIV_Oeldyn_avl 0 "Oeldyn_nicht_vorhanden" 1 "Oeldyn_vorhanden"; +VAL_ 967 OLEV_Oelstand_nicht_vorhanden 0 "ÖŦstand vorhanden" 1 "ÖŦstand nicht vorhanden"; +VAL_ 967 MO_Systemlampe 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_OBD2_Lampe 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_Heissleuchte 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_Partikel_Lampe 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_RedFahrleistung_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 967 WIV_Oelstand_nicht_vorhanden 0 "ÖŦstand vorhanden" 1 "ÖŦstand nicht vorhanden"; +VAL_ 967 WIV_nachfuellanzeige_ein 0 "keine_Nachfuellanzeige" 1 "Nachfuellanzeige"; +VAL_ 967 WIV_Ueberfuell_deaktiv 0 "Ueberfuellwarnung_am_Kombi_aktiv" 1 "Ueberfuellwarnung_am_Kombi_deaktiv"; +VAL_ 967 WIV_Unterfuell_Warn 0 "in_Ordnung" 1 "Unterfuellwarnung"; +VAL_ 967 MO_Tankdeckel_Lampe 0 "Lampe aus" 1 "Lampe ein"; +VAL_ 967 MO_Text_Tankdeckelwarn 0 "kein_Text" 1 "Anzeige_Text_Tankdeckelwarnung_im_Kombi"; +VAL_ 967 MO_Vorglueh_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 967 WIV_Oeldr_Warn_Motor 0 "keine_Warnung" 1 "niedrige_Oeldruckstufe_nicht_erreicht"; +VAL_ 967 MO_E_Mode 0 "keine_Anzeige" 1 "E_Mode_passiv" 2 "E_Mode_aktiv" 3 "E_Mode_inaktiv_nicht_verfuegbar" 4 "E_Mode_aktiv_nicht_verfuegbar" 5 "reserviert_keine_Anzeige" 6 "reserviert_keine_Anzeige" 7 "reserviert_keine_Anzeige"; +VAL_ 974 HFS_Tuer_geoeffnet 0 "geschlossen" 1 "offen"; +VAL_ 974 HFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 974 HFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 974 HFS_Heckrollotaster_betaetigt 0 "keine_Verfahranweisung_in_Richtung_Hoch" 1 "In_Richtung_Hoch_Verfahren"; +VAL_ 974 HFS_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; +VAL_ 974 HFS_Unlock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_Lock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; +VAL_ 974 HFS_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_S_HBFS_AutoHoch 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; +VAL_ 974 HFS_FH_S_HBFS_AutoTief 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; +VAL_ 974 HFS_FH_S_HBFS_ManHoch 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; +VAL_ 974 HFS_FH_S_HBFS_ManTief 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; +VAL_ 974 HFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 974 HFS_SAD_Schalter 0 "nicht_betaetigt" 5 "AUF_manuell" 6 "AUF_automatik" 7 "ZU_manuell" 8 "ZU_automatik" 13 "nicht_verfuegbar" 14 "Init" 15 "Fehler"; +VAL_ 974 HFS_FH_S_ManHoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_S_AutoHoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_S_ManTief 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_S_AutoTief 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_FH_Bew_hoch 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_FH_Bew_tief 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; +VAL_ 974 HFS_FH_Block 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_FH_Thermo 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_UEKB_aktiviert 0 "inaktiv" 1 "aktiv"; +VAL_ 974 HFS_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; +VAL_ 974 HFS_FH_normiert 0 "inaktiv" 1 "aktiv"; +VAL_ 974 ASW_Warnung_aktiv_HFS 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 974 HFS_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehhilfe_aktiv"; +VAL_ 974 HFS_Seitenrollo_hoch 1 "Seitenrollo_in_Bewegung_hoch"; +VAL_ 974 HFS_Seitenrollo_tief 1 "Seitenrollo_in_Bewegung_tief"; +VAL_ 974 HFS_Status_KiSi 0 "inaktiv" 1 "aktiv"; +VAL_ 974 SSR_HFS_Pos_Unten 0 "SSR_Oben" 1 "SSR_Unten"; +VAL_ 974 HFS_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; +VAL_ 974 HFS_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; +VAL_ 974 MTHFS_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 MTHFS_Pos1 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 MTHFS_Pos2 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 MTHFS_Pos3 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 974 HFS_MRollo_Schalter 0 "nicht_betaetigt" 1 "ZU_manuell" 2 "ZU_automatik" 3 "AUF_manuell" 4 "AUF_automatik" 5 "nicht_verfuegbar" 6 "Init" 7 "Fehler"; +VAL_ 974 HFS_Lock_Taster_inv 0 "Lock Taster betä´§it" 1 "Lock Taster nicht betä´Šgt"; +VAL_ 974 HFS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; +VAL_ 974 HFS_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; +VAL_ 974 HFS_TCR_Mode_aktiv 0 "TCR_Mode_deaktiv" 1 "TCR_Mode_aktiv"; +VAL_ 975 HBFS_Tuer_geoeffnet 0 "geschlossen" 1 "offen"; +VAL_ 975 HBFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 975 HBFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 975 HBFS_Heckrollotaster_betaetigt 0 "keine_Verfahranweisung_in_Richtung_Hoch" 1 "In_Richtung_Hoch_Verfahren"; +VAL_ 975 HBFS_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; +VAL_ 975 HBFS_Unlock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_Lock_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; +VAL_ 975 HBFS_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_S_HFS_AutoHoch 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; +VAL_ 975 HBFS_FH_S_HFS_AutoTief 0 "keine_Bedienung" 1 "Automatiklauf_Angefordert"; +VAL_ 975 HBFS_FH_S_HFS_ManHoch 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; +VAL_ 975 HBFS_FH_S_HFS_ManTief 0 "keine_Bedienung" 1 "Manueller_Lauf_Angefordert"; +VAL_ 975 HBFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 975 HBFS_SAD_Schalter 0 "nicht_betaetigt" 5 "AUF_manuell" 6 "AUF_automatik" 7 "ZU_manuell" 8 "ZU_automatik" 13 "nicht_verfuegbar" 14 "Init" 15 "Fehler"; +VAL_ 975 HBFS_FH_S_ManHoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_S_AutoHoch 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_S_ManTief 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_S_AutoTief 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_FH_Bew_hoch 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_FH_Bew_tief 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; +VAL_ 975 HBFS_FH_Block 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_FH_Thermo 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_UEKB_aktiviert 0 "inaktiv" 1 "aktiv"; +VAL_ 975 HBFS_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; +VAL_ 975 HBFS_FH_normiert 0 "inaktiv" 1 "aktiv"; +VAL_ 975 ASW_Warnung_aktiv_HBFS 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 975 HBFS_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehhilfe_aktiv"; +VAL_ 975 HBFS_Seitenrollo_hoch 1 "Seitenrollo_in_Bewegung_hoch"; +VAL_ 975 HBFS_Seitenrollo_tief 1 "Seitenrollo_in_Bewegung_tief"; +VAL_ 975 HBFS_Status_KiSi 0 "inaktiv" 1 "aktiv"; +VAL_ 975 SSR_HBFS_Pos_Unten 0 "SSR_Oben" 1 "SSR_Unten"; +VAL_ 975 HBFS_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; +VAL_ 975 HBFS_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; +VAL_ 975 MTHBFS_M_Taste 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 MTHBFS_Pos1 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 MTHBFS_Pos2 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 MTHBFS_Pos3 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 975 HBFS_MRollo_Schalter 0 "nicht_betaetigt" 1 "ZU_manuell" 2 "ZU_automatik" 3 "AUF_manuell" 4 "AUF_automatik" 5 "nicht_verfuegbar" 6 "Init" 7 "Fehler"; +VAL_ 975 HBFS_Lock_Taster_inv 0 "Lock Taster betä´§it" 1 "Lock Taster nicht betä´Šgt"; +VAL_ 975 HBFS_Status_KiSi_inv 0 "aktiv" 1 "inaktiv"; +VAL_ 975 HBFS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; +VAL_ 975 HBFS_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; +VAL_ 975 HBFS_TIG_betaetigt_schliessen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_Tuer_geoeffnet 0 "Init" 1 "Tuer offen"; +VAL_ 976 FT_verriegelt 0 "Init" 1 "verriegelt"; +VAL_ 976 FT_gesafet 0 "Init" 1 "gesafet"; +VAL_ 976 FT_Schluesselschalter_auf 0 "Init" 1 "Schluesselschalter_auf_betaetigt"; +VAL_ 976 FT_Schluesselschalter_zu 1 "Schluesselschalter zu betaetigt"; +VAL_ 976 FT_Unlock_Taster 0 "Init" 1 "Unlock_Taster_betaetigt"; +VAL_ 976 FT_Lock_Taster 0 "Init" 1 "Lock_Taster_betaetigt"; +VAL_ 976 FT_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste"; +VAL_ 976 FT_TAG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_TIG_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_IRUE_Taste 0 "Init" 1 "IRUE_Taste_betaetigt"; +VAL_ 976 FT_HD_Taste 0 "Init" 1 "Heckdeckel_oeffnen"; +VAL_ 976 FT_TD_Taste_Fehler 0 "iO" 1 "defekt"; +VAL_ 976 FT_TD_Taste 1 "Tankdeckelentriegelungs Taster gedrÃŧckt"; +VAL_ 976 SSR_Temp_Freigabe 0 "SSR_Deaktiviert" 1 "SSR_Freigegeben"; +VAL_ 976 FT_HD_Taste_2 0 "Taste_nicht_gedrueckt" 1 "Taste_gedrueckt"; +VAL_ 976 FT_TSG_hinten_verbaut 0 "nicht verbaut" 1 "verbaut"; +VAL_ 976 FT_Sp_Blk_def 0 "iO" 1 "defekt"; +VAL_ 976 FT_FH_S_ManHoch 0 "Init" 1 "FH_Schalter_man_hoch_betaetigt"; +VAL_ 976 FT_FH_S_AutoHoch 0 "Init" 1 "FH_Schalter_auto_hoch_betaetigt"; +VAL_ 976 FT_FH_S_ManTief 0 "Init" 1 "FH_Schalter_man_tief_betaetigt"; +VAL_ 976 FT_FH_S_AutoTief 0 "Init" 1 "FH_Schalter_auto_tief_betaetigt"; +VAL_ 976 FT_FH_Bew_hoch 0 "Init" 1 "FH_in_Bewegung_hoch"; +VAL_ 976 FT_FH_Bew_tief 0 "Init" 1 "FH_in_Bewegung_tief"; +VAL_ 976 FT_FH_Fang 0 "ausserhalb_Fangbereich" 1 "innerhalb_Fangbereich"; +VAL_ 976 FT_FH_Block 0 "Init" 1 "Fenster_Block"; +VAL_ 976 FT_FH_Thermo 0 "Init" 1 "Thermoschutz_aktiv"; +VAL_ 976 FT_UEKB_aktiviert 0 "Init" 1 "UEKB_aktiv"; +VAL_ 976 ASW_HMI_defekt 0 "iO" 1 "defekt"; +VAL_ 976 FT_FH_normiert 0 "Init" 1 "Fenster_normiert"; +VAL_ 976 FT_Schliesstaster 1 "Schliesstaster_betaetigt"; +VAL_ 976 FT_Zuziehhilfe_aktiv 0 "Init" 1 "Zuziehilfe_aktiv"; +VAL_ 976 FT_SP_ausgerastet 0 "Init" 1 "Spiegel_ausgerastet"; +VAL_ 976 FT_SP_lr_aktiv 0 "Init" 1 "Spiegel_xAchse_aktiv"; +VAL_ 976 FT_SP_ht_aktiv 0 "Init" 1 "Spiegel_yAchse_aktiv"; +VAL_ 976 ASW_wakeup 0 "Sleep" 1 "Wakeup"; +VAL_ 976 FT_Oben_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_o"; +VAL_ 976 FT_Unten_Block_erw 0 "Fensterheber_nicht_in_Blockerwar" 1 "Fensterheber_in_Blockerwartung_u"; +VAL_ 976 FT_Kisi_li_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 976 FT_Kisi_re_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 976 FT_Kisi_Taster_li 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_Kisi_Taster_re 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 976 FT_BFS_Fond_Freigabe 0 "Init" 1 "Freigabe_fuer_Fondbedienung_BFS"; +VAL_ 976 FT_Kisi_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 976 FT_Daemmglas 0 "Normalglas_verbaut" 1 "Daemmglas_verbaut"; +VAL_ 976 FT_SP_Heizung_Status 0 "Init" 1 "Status_Spiegelheizung_ein"; +VAL_ 976 ASW_Warnung_aktiv_FS 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 976 FT_FH_Pos_oben 1 "Scheibe oben (nach Absenken auf Position)"; +VAL_ 976 FT_Tuerschloss_defekt 0 "Tuerschloss_funktionsfaehig" 1 "Tuerschloss_defekt"; +VAL_ 976 FT_SWA_Taster 0 "Taster_nicht_betaetigt" 1 "Taster_betaetigt"; +VAL_ 976 SWA_HMI_Diagnose 0 "kein_Fehler_erkannt" 1 "Fehler_Taster_erkannt" 2 "Fehler_LED_erkannt" 3 "Fehler_LED_und_Taster_erkannt"; +VAL_ 976 FS_Status_eTAG 0 "Init" 1 "Griff_ausgefahren" 2 "Griff_eingefahren" 3 "Fehler"; +VAL_ 980 BH_Blinker_li 0 "nicht_betaetigt" 1 "Blinkerhebel_Pos_li_betaetigt"; +VAL_ 980 BH_Blinker_re 0 "nicht_betaetigt" 1 "Blinkerhebel_Pos_re_betaetigt"; +VAL_ 980 BH_Lichthupe 0 "nicht_betaetigt" 1 "Blinkerhebel in Richtung Lichthupe betaetigt"; +VAL_ 980 BH_Fernlicht 0 "nicht_betaetigt" 1 "Blinkerhebel_in_Richtung_Fernlicht_betaetigt"; +VAL_ 980 WH_Tipwischen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 980 WH_Intervall 0 "aus" 1 "Wischerhebel in Stellung Intervall"; +VAL_ 980 WH_WischerStufe1 0 "aus" 1 "Wischerhebel in Stufe Wischen 1"; +VAL_ 980 WH_WischerStufe2 0 "aus" 1 "Wischerhebel in Stufe Wischen 2"; +VAL_ 980 WH_Frontwaschen 0 "aus" 1 "Wischerhebel in Stellung Wisch Wasch vorne"; +VAL_ 980 WH_Heckintervall 0 "nicht_betaetigt" 1 "Wischerhebel in Stellung Heckintervall"; +VAL_ 980 WH_Heckwaschen 0 "nicht_betaetigt" 1 "Wischerhebel in Stellung Wisch Wasch hinten"; +VAL_ 980 WH_Intervallstufen 0 "Init / Default" 1 "Intervallstufe 1" 5 "Intervallstufe 2" 9 "Intervallstufe 3" 13 "Intervallstufe 4" 15 "Fehler"; +VAL_ 980 FAS_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 980 FAS_Taster_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 SMLS_Hupe 0 "nicht_betaetigt" 1 "Hupe_gedrueckt"; +VAL_ 980 LRH_On_Off 0 "LRH_aus__keine Anzeige" 1 "LRH_aus" 2 "LRH_ein" 3 "Fehler"; +VAL_ 980 LRH_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 980 SMLS_P_verriegelt_plausibel 0 "unplausibel" 1 "plausibel"; +VAL_ 980 WH_SRA 0 "SRA_Aus" 1 "SRA_Ein"; +VAL_ 980 WH_Wischer_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 BH_Blinker_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 SMLS_PTT 0 "nicht_betaetigt" 1 "PTT_gedrueckt"; +VAL_ 980 WH_Tipwischen_lang 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 981 BCM1_Kurvenlicht_links_Anf 0 "linkes_Kurvenlicht/Abbiegelicht_durch_BCM1_nicht_angesteuert" 1 "linkes_Kurven/Abbiegelicht_durch_BCM1_angesteuert"; +VAL_ 981 BCM1_Kurvenlicht_rechts_Anf 0 "rechtes_Kurvenlicht/Abbiegelicht_durch_BCM1_nicht_angesteuert" 1 "rechtes_Kurvenlicht/Abbiegelicht_durch_BCM1_angesteuert"; +VAL_ 981 BCM1_Standlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Abblendlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Fernlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Nebellicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Parklicht_li_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Parklicht_re_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Nebelschluss_Ahg_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Nebelschluss_Fzg_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Schlusslicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM_Rueckfahrlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_angefordert"; +VAL_ 981 BCM1_Signaturlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; +VAL_ 981 BCM1_Umfeldleuchten_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; +VAL_ 981 BCM1_Tagfahrlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Regenlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Autobahnlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten"; +VAL_ 981 BCM1_Touristen_Licht_Anf 0 "Licht_nicht_angefordert" 1 "Anforderung von Touristenlicht"; +VAL_ 981 BCM1_CH_aktiv 0 "Inaktiv" 1 "Aktiv"; +VAL_ 981 BCM1_LH_aktiv 0 "Inaktiv" 1 "Aktiv"; +VAL_ 981 BCM1_Gleitende_Leuchtw_Anf 0 "Aus" 1 "Ein"; +VAL_ 981 BCM1_GLW_Fernlicht_Anf 0 "Aus" 1 "Ein"; +VAL_ 981 BCM1_Adaptive_Lichtvert_Anf 0 "Aus" 1 "Ein"; +VAL_ 981 BCM1_FoD_Sperrung_WiBli 0 "Freigabe_WiBli" 1 "Sperrung_WiBli" 2 "Init"; +VAL_ 981 BCM1_FOD_Sperrung_Animationen_HL 0 "Freigabe_Animationen" 1 "Sperrung_Animationen" 2 "Init"; +VAL_ 981 BCM1_Animationssperrung 0 "keine_Sperrung" 1 "Sperrung"; +VAL_ 981 BCM1_CH_LH_aktiv 0 "Comming_Home_Bzw._Leaving_Home_nicht_aktiv" 1 "Comming Home bzw. Leaving Home aktiv"; +VAL_ 981 BCM1_Allwetterlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten"; +VAL_ 981 BCM1_Schlusslicht_Signatur 0 "keine_Signatur" 1 "Signatur_1" 2 "Signatur_2" 3 "Signatur_3" 4 "Signatur_4" 5 "Signatur_5" 6 "Signatur_6" 7 "Signatur_7" 8 "Signatur_8" 9 "Signatur_9" 10 "Signatur_10" 11 "Signatur_11" 12 "Signatur_12" 13 "Signatur_13" 14 "Signatur_14" 15 "Signatur_15"; +VAL_ 982 BCM2_Bremsl_durch_ECD 0 "Bremslicht_ist_aus" 1 "Bremslicht_durch_ECD_aktiv"; +VAL_ 982 LH_Aussenlicht_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Standlicht_H_aktiv 1 "Standlicht hinten aktiv"; +VAL_ 982 LH_Parklicht_HL_aktiv 0 "nicht aktiv" 1 "Parklicht hinten links aktiv"; +VAL_ 982 LH_Parklicht_HR_aktiv 0 "nicht aktiv" 1 "Parklicht hinten rechts aktiv"; +VAL_ 982 LH_Bremslicht_H_aktiv 1 "Bremslicht hinten aktiv"; +VAL_ 982 LH_Nebelschluss_aktiv 0 "nicht aktiv" 1 "aktiv"; +VAL_ 982 LH_Rueckfahrlicht_aktiv 0 "nicht aktiv" 1 "aktiv"; +VAL_ 982 LH_Blinker_HL_akt 1 "Blinker hinten links aktiv"; +VAL_ 982 LH_Blinker_HR_akt 1 "Blinker hinten rechts aktiv"; +VAL_ 982 LH_Blinker_li_def 0 "OK" 1 "Blinker hinten links defekt"; +VAL_ 982 LH_Bremsl_li_def 0 "OK" 1 "mindestens ein Bremslicht hinten links defekt"; +VAL_ 982 LH_Schlusslicht_li_def 0 "OK" 1 "mindestens ein Schlusslicht hinten links defekt"; +VAL_ 982 LH_Rueckf_li_def 0 "OK" 1 "RÃŧckfahrlicht hinten links defekt"; +VAL_ 982 LH_Nebel_li_def 0 "OK" 1 "Nebelschlusslicht hinten links defekt"; +VAL_ 982 LH_Schluss_Brems_Nebel_li_def 0 "iO" 1 "defekt"; +VAL_ 982 LH_Schluss_Brems_Nebel_re_def 0 "iO" 1 "defekt"; +VAL_ 982 LH_Zusatzschlussl_def 0 "OK" 1 "mindestens_ein_Zusatzschlusslicht_defekt"; +VAL_ 982 LH_Schluss_Brems_li_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Schluss_Nebel_li_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_SL_BRL_BLK_li_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Brems_Blk_li_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Diag_Status_re_def 0 "OK" 1 "Aussenlict_Diagnose_Systemstoerung_rechts"; +VAL_ 982 LH_Diag_Status_li_def 0 "OK" 1 "Aussenlicht_Diagnose_Systemstoerung_links"; +VAL_ 982 LH_Diag_LED_li_def 0 "OK" 1 "Heckleuchte_links_defekt"; +VAL_ 982 LH_Diag_LED_re_def 0 "OK" 1 "Heckleuchte_rechts_defekt"; +VAL_ 982 LH_Blinker_re_def 0 "OK" 1 "Blinker hinten rechts defekt"; +VAL_ 982 LH_Bremsl_re_def 0 "OK" 1 "mindestens ein Bremslicht hinten rechts defekt"; +VAL_ 982 LH_Schlusslicht_re_def 0 "OK" 1 "mindestens ein Schlusslicht hinten rechts defekt"; +VAL_ 982 LH_Rueckf_re_def 0 "OK" 1 "RÃŧckfahrlicht hinten rechts defekt"; +VAL_ 982 LH_Nebel_re_def 0 "OK" 1 "Nebelschlusslicht hinten rechts defekt"; +VAL_ 982 LH_Schluss_Brems_mi_def 0 "OK" 1 "Defekt"; +VAL_ 982 LH_Schluss_Brems_re_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Schluss_Nebel_re_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_SL_BRL_BLK_re_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Brems_Blk_re_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Kennzl_def 0 "OK" 1 "Kennzeichenbeleuchtung hinten defekt"; +VAL_ 982 LH_3_Bremsl_def 0 "OK" 1 "hochgesetzte Bremsleuchte defekt"; +VAL_ 982 LH_Nebel_mi_def 0 "OK" 1 "Nebelschlusslicht hinten Mitte defekt"; +VAL_ 982 LH_Rueckf_mi_def 0 "OK" 1 "RÃŧckfahllicht Mitte defekt"; +VAL_ 982 LH_Schlusslicht_mi_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Bremsl_mi_def 0 "OK" 1 "defekt"; +VAL_ 982 LH_Bremsl_li_ges_def 0 "OK" 1 "Alle Bremslichter hinten links defekt"; +VAL_ 982 LH_Bremsl_re_ges_def 0 "OK" 1 "Alle Bremslichter hinten rechts defekt"; +VAL_ 988 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; +VAL_ 988 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; +VAL_ 997 FT_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 997 FT_Tuer_Status_QBit 0 "Status_Tuerkontakt_sicher" 1 "Status_Tuerkontakt_unsicher"; +VAL_ 997 FT_Lock_Taster_02 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 997 FT_Schluesselschalter_zu_02 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 997 FT_BFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 997 FT_HBFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 997 FT_HFS_Tuer_Status 0 "Init" 1 "Tuer_geschlossen" 2 "Tuer_offen" 3 "Fehler"; +VAL_ 997 FT_Tueroeffnen_Warnung 0 "Tuerwarnung_nicht_aktiv" 1 "Tuerwarnung_aktiv"; +VAL_ 997 FT_SP_Heizung_ein 0 "Aus" 1 "Ein"; +VAL_ 997 FT_Kisi_Taster_li_02 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 997 FT_Kisi_Taster_re_02 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 997 FT_TD_Taste_Status 0 "kein_Fehler" 1 "Kurzschluss_nach_Minus" 2 "Kurzschluss_nach_Plus" 3 "Leitungsunterbrechung"; +VAL_ 997 FT_TCR_Mode_aktiv 0 "TCR_Mode_deaktiv" 1 "TCR_Mode_aktiv"; +VAL_ 997 FS_Push_Tuergriff 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 1004 TSK_State 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault"; +VAL_ 1122 PSD_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "Fehlerwert"; +VAL_ 1122 PSD_Vorgaenger_Segment_ID 0 "keine Segmentinformation vorhanden" 1 "Fehlerwert"; +VAL_ 1122 PSD_Strassenkategorie 0 "Rest_Feldweg_Schotterweg_Privatweg" 1 "OrtsstraßĨ" 2 "KreisstraßĨ" 3 "LandstraßĨ" 4 "BundesstraßĨ" 5 "Autobahn" 7 "Init"; +VAL_ 1122 PSD_Endkruemmung 255 "Gerade"; +VAL_ 1122 PSD_Endkruemmung_Vorz 0 "Kruemmung_positiv" 1 "Kruemmung_negativ"; +VAL_ 1122 PSD_Idenditaets_ID 0 "keine_Segment_Informationen_vorhanden" 1 "Fehler"; +VAL_ 1122 PSD_ADAS_Qualitaet 0 "keine_ADAS_Qualitaet" 1 "ADAS_Qualitaet"; +VAL_ 1122 PSD_wahrscheinlichster_Pfad 0 "Pfad_mit_geringer_Wahrscheinlichkeit" 1 "wahrscheinlichster_Pfad"; +VAL_ 1122 PSD_Geradester_Pfad 0 "nicht_geradester_PFad" 1 "geradester_Pfad"; +VAL_ 1122 PSD_Fahrspuren_Anzahl 0 "Einbahnstrasse_in_falsche_Richtung" 1 "eine_Fahrspur" 2 "zwei_Fahrspuren" 3 "drei_Fahrspuren" 4 "vier_Fahrspuren" 5 "fuenf_Fahrspuren" 6 "sechs_Fahrspuren" 7 "mehr_als_sechs_Fahrspuren"; +VAL_ 1122 PSD_Bebauung 0 "ausserhalb_bebauten_Gebietes" 1 "innerhalb_bebauten_Gebietes"; +VAL_ 1122 PSD_Segment_Komplett 0 "Segment_Attribute_nicht_komplett" 1 "Segment_Attribute_komplett"; +VAL_ 1122 PSD_Rampe 0 "Strasse_mit_Gegenverkehr" 1 "Auffahrt_Einbahnstr" 2 "Abfahrt_Einbahnstr" 3 "Einbahnstrasse"; +VAL_ 1122 PSD_Anfangskruemmung 255 "Gerade"; +VAL_ 1122 PSD_Anfangskruemmung_Vorz 0 "positiv" 1 "negativ"; +VAL_ 1122 PSD_Abzweigerichtung 0 "rects_abzweigende_Strasse" 1 "links_abzweigende_Strasse"; +VAL_ 1123 PSD_Pos_Segment_ID 0 "keine Position gegeben" 1 "Fehlerwert"; +VAL_ 1123 PSD_Pos_Standort_Eindeutig 0 "mehrdeutiger_Standort" 1 "eindeutiger_Standort"; +VAL_ 1123 PSD_Pos_Fehler_Laengsrichtung 0 "Init" 1 "< 2m" 2 "< 5m" 3 "< 10m" 4 "< 20m" 5 "< 50m" 6 "> 50m" 7 "Off-Road"; +VAL_ 1123 PSD_Pos_Fahrspur 0 "unbekannt" 1 "Erste_Spur_von_rechts" 2 "Zweite_Spur_von_rechts" 3 "Dritte_Spur_von_rechts" 4 "Vierte_Spur_von_rechts" 5 "Fuenfte_Spur_von_rechts" 6 "Sechte_Spur_von_rechts" 7 "Siebte_oder_weitere_Spur_von_rechts"; +VAL_ 1123 PSD_Attribut_Segment_ID_05 0 "keine_Segment_Information" 1 "Fehler"; +VAL_ 1123 PSD_Attribut_1_ID 0 "keine_Information"; +VAL_ 1123 PSD_Attribut_2_ID 0 "keine_Information"; +VAL_ 1123 PSD_Attribute_Komplett_05 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_06_Mux 0 "Init"; +VAL_ 1124 PSD_Sys_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig"; +VAL_ 1124 PSD_Sys_Geschwindigkeit_Einheit 0 "km/h" 1 "mph"; +VAL_ 1124 PSD_Sys_Verkehrsrichtung 0 "Rechtsverkehr" 1 "Linksverkehr"; +VAL_ 1124 PSD_Sys_Geometrieguete 0 "Geringe_Guete" 1 "tbd" 2 "tbd" 3 "Hohe_Guete"; +VAL_ 1124 PSD_Sys_Mapmatchingguete 0 "geringe_Guete" 1 "res" 2 "res" 3 "hohe_Guete"; +VAL_ 1124 PSD_Sys_Alter_Karte 0 "kleiner_1_Jahr" 1 "1_Jahr" 2 "2_Jahre" 3 "3_Jahre" 4 "4_Jahre" 5 "5_Jahre" 6 "6_Jahre" 7 "groesser_7_Jahre"; +VAL_ 1124 PSD_Sys_Zielfuehrung 0 "Zielfuehrung nicht aktiv" 1 "Zielfuehrung aktiv"; +VAL_ 1124 PSD_Sys_US_State 0 "kein_US_State" 1 "Alabama" 2 "Alaska" 3 "Arkansas" 4 "Arizona" 5 "California" 6 "Colorado" 7 "Conneticut" 8 "District_of_Columbia" 9 "Delaware" 10 "Florida" 11 "Georgia" 12 "Hawaii" 13 "Idaho" 14 "Illinois" 15 "Iowa" 16 "Indiana" 17 "Kansas" 18 "Kentucky" 19 "Louisiana" 20 "Massachusetts" 21 "Maryland" 22 "Maine" 23 "Michigan" 24 "Minnesota" 25 "Missouri" 26 "Mississippi" 27 "Montana" 28 "North_Carolina" 29 "North_Dakota" 30 "Nebraska" 31 "Nevada" 32 "New_Hampshire" 33 "New_Jersey" 34 "New_Mexico" 35 "New_York" 36 "Ohio" 37 "Oklahoma" 38 "Oregon" 39 "Pennsylvania" 40 "Puerto_Rico" 41 "Rhode_Island" 42 "South_Carolina" 43 "South_Dakota" 44 "Tennessee" 45 "Texas" 46 "Utah" 47 "Virginia" 48 "Virgin_Islands" 49 "Vermont" 50 "Washington" 51 "Wisconsin" 52 "West_Virginia" 53 "Wyoming"; +VAL_ 1124 PSD_Sys_Quali_verfuegbar 0 "Qualitaetskriterien_nicht_verfuegbar" 1 "Qualitaetskriterien_verfuegbar"; +VAL_ 1124 PSD_Sys_Zielfuehrung_geaendert 0 "Zielfuehrung_nicht_geaendert" 1 "Zielfuehrung_geaendert"; +VAL_ 1124 PSD_Sys_Geometrieguete_erweitert 0 "Init"; +VAL_ 1124 PSD_Attribut_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Attribut_3_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribut_4_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribut_5_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribute_Komplett_06 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_Ges_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig"; +VAL_ 1124 PSD_Ges_Geschwindigkeit 0 "Kein Geschwindigkeitsgebot" 1 "0 km/h < v_max < 5 km/h" 2 "5 km/h < v_max < 10km/h" 3 "10 km/h < v_max < 15 km/h" 4 "15 km/h < v_max < 20 km/h" 5 "20 km/h < v_max < 25 km/h" 6 "25 km/h < v_max < 30 km/h" 7 "30 km/h < v_max < 35 km/h" 8 "35 km/h < v_max < 40 km/h" 9 "40 km/h < v_max < 45 km/h" 10 "45 km/h < v_max < 50 km/h" 11 "50 km/h < v_max < 60 km/h" 12 "60 km/h < v_max < 70 km/h" 13 "70 km/h < v_max < 80 km/h" 14 "80 km/h < v_max < 90 km/h" 15 "90 km/h < v_max < 100 km/h" 16 "100 km/h < v_max < 110 km/h" 17 "110 km/h < v_max < 120 km/h" 18 "120 km/h < v_max < 130 km/h" 19 "130 km/h < v_max < 140 km/h" 20 "140 km/h < v_max < 150 km/h" 21 "150 km/h < v_max < 160 km/h" 22 "160 km/h < v_max" 23 "Geschwindigkeitsgebot aufgehoben" 24 "..0x1F ungÃŧltig"; +VAL_ 1124 PSD_Ges_Typ 0 "Geschw_Klasse_des_Kartendatensuppliers" 1 "Explizit_abgeleiteten_Begrenzung" 2 "Durch_Gesetzg_vorgeg_allgem_Gebot_fuer_uebertr_Rahmenbed" 3 "Init"; +VAL_ 1124 PSD_Ges_Spur_Geschw_Begrenzung 0 "Gebot_fuer_alle_spuren_gueltig"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Gespann 0 "alle Fahrzeuge" 1 "PKW mit Gespann" 2 "LKW, Busse, etc."; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Witter 0 "Witterungsunabh䎧ig" 1 "Näŗŗe, Regen, Niederschlag" 2 "Glä´´e" 3 "Nebel"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Tag_Anf 0 "kein Beginn definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Tag_Ende 0 "kein Ende definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Std_Anf 25 "kein Beginn fÃŧr stundenweise EinschräŽĢungen"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Std_Ende 25 "kein Ende fÃŧr stundenweise EinschräŽĢungen"; +VAL_ 1124 PSD_Ges_Ueberholverbot 0 "kein Üĸerholverbot" 1 "alle Fahrzeuge" 2 "Üĸerholverbot fÃŧr PKW mit Gespann" 3 "Üĸerholverbot fÃŧr LKW, Busse, etc."; +VAL_ 1124 PSD_Ges_Wechselverkehrszeichen 0 "Kein Wechselverkehrszeichen" 1 "Wechselverkehrszeichen links" 2 "Wechselverkehrszeichen rechts" 3 "Wechselverkehrszeichen links und rechts" 4 "Wechselverkerhszeichen Ãŧber der Fahrbahn"; +VAL_ 1124 PSD_Wechselverkehrszeichen_Typ 0 "kein_Wechselverkehrszeichen" 1 "LED_Wechselverkehrszeichen" 2 "nicht_LED_Wechselverkehrszeichen"; +VAL_ 1124 PSD_Ges_Gesetzlich_Kategorie 0 "kein_legales_Verbot" 1 "innerorts" 2 "ausserorts" 3 "Autobahn"; +VAL_ 1124 PSD_Ges_Gesetzlich_Zusatz 0 "kein_Zusatz_zu_legalem_Gebot" 1 "Anhaenger_Klasse_1" 2 "Anhaenger_Klasse_2"; +VAL_ 1124 PSD_Ges_Verkehrszeichen_Quelle 0 "VZA_kein_Onlinedienst" 1 "nur_VZA" 2 "nur_VZO" 3 "VZA_und_VZO"; +VAL_ 1124 PSD_Ges_Attribute_Komplett 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_Baum_Laenge_VZ 0 "Ost" 1 "West"; +VAL_ 1124 PSD_Baum_Breite_VZ 0 "Nord" 1 "Sued"; +VAL_ 1124 PSD_Steigung_1_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Steigung_1_A_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_1_A_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_1_B_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_1_B_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_1_Attribute_kompl 0 "Steigungen_nicht_komplett" 1 "Steigungen_komplett"; +VAL_ 1124 PSD_Steigung_2_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Steigung_2_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_2_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_2_Attribute_kompl 0 "Steigungen_nicht_komplett" 1 "Steigungen_komplett"; +VAL_ 1153 ZR_LoGeWa_Event_Kombiwarnung 0 "Init" 1 "Unfall" 2 "Traktionsverlust" 3 "Panne" 4 "Sichtbehinderung" 5 "Aquaplaning" 6 "EEBL" 7 "SEF_stat" 8 "SEF_dyn_allgemein" 9 "SEF_dyn_vorne" 10 "SEF_dyn_hinten" 11 "SEF_dyn_links" 12 "SEF_dyn_rechts" 13 "Stauende"; +VAL_ 1153 Nav_FoD_Status 0 "Init" 1 "Nav_permanently_available" 2 "FoD_Nav_not_activated" 3 "FoD_Nav_activated" 4 "R4N_Nav_not_activated"; +VAL_ 1153 MIB_Tongenerator_PH_verfuegbar 0 "Tongenerator_nicht_verfuegbar" 1 "Tongenerator_vorne_verfuegbar" 2 "Tongenerator_hinten_verfuegbar" 3 "Tongenerator_gesamt_verfuegbar" 4 "Tongenerator_im_AMP"; +VAL_ 1153 DSSS_Warning 0 "No_Warning" 1 "Red_traffic_light_guidance" 2 "Stop_sign_warning" 3 "Rear_end_collision_avoidance_warning" 4 "Intersection_collision_avoidance_warning_right" 5 "Intersection_collision_avoidance_warning_left" 6 "turn_right_collision_avoidance" 7 "turn_left_collision_avoidance" 8 "pedestrian_crossing_right" 9 "pedestrian_crossing_left" 10 "bicycle_collision_right" 11 "bicycle_collision_left"; +VAL_ 1153 ZR_Kindersicherung_RSE 0 "inaktiv" 1 "aktiv"; +VAL_ 1153 ZR_RSE_aktivieren 0 "inaktiv" 1 "aktiv"; +VAL_ 1153 MMI_SDS_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1153 MU_SecondDisplay 0 "Init" 1 "gueltige_Karte" 2 "ungueltiges_Signal" 3 "Nicht_Verbaut"; +VAL_ 1153 MMI_Telefon_aktiv 0 "Telefongespraech_nicht_aktiv" 1 "Telefongespraech_aktiv"; +VAL_ 1153 MMI_Gurt_Mic_ref 0 "Downlink_inaktiv" 1 "Downlink_aktiv"; +VAL_ 1153 ZR_Sta_Inszenierung 0 "Init" 1 "Inszenierung_deaktiviert" 2 "Inszenierung_Start" 3 "Inszenierung_Stop"; +VAL_ 1153 MMI_Gauges_active 0 "gauges_inactive" 1 "gauges_active"; +VAL_ 1153 ZR_MXB_Manoever_Ansage 0 "keine_Ansage" 1 "Ansage_ohne_Richtung" 2 "Ansage_rechte_Richtung" 3 "Ansage_linke_Richtung"; +VAL_ 1153 ZR_LAPP_Sondermodus_Status 0 "keine_Anforderung" 1 "Sondermodus_aktiv" 2 "Aktivierung_nicht_moeglich"; +VAL_ 1153 MMI_StartStopp_Info 0 "Stoppfreigabe" 1 "Stoppverbot" 2 "Startanforderung" 3 "Fehler"; +VAL_ 1153 ZR_Parken_Sondermodus 0 "Init" 1 "Sondermodus_aktiv" 2 "Sondermodus_nicht_verfuegbar" 3 "WLAN_aus" 4 "WLAN_auscodiert" 15 "keine_WLAN_HW"; +VAL_ 1153 ZR_Rundenbewertung 0 "Bewertung_nicht_aktiv" 1 "langsamer" 2 "gleich_schnell" 3 "schneller" 4 "reserviert" 5 "reserviert" 6 "reserviert" 7 "reserviert" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "Init" 15 "Funktion_nicht_verbaut"; +VAL_ 1153 ZR_Rundenfortschritt 254 "Init" 255 "Funktion_nicht_verbaut"; +VAL_ 1155 Mo_Powermeter_Grenze 4093 "OFF"; +VAL_ 1155 MO_Text_Aktivierung_Antrieb 0 "keine_Anzeige" 1 "Ladestecker_nicht_fahrbereit" 2 "erneute_Aktivierung_erforderlich" 3 "Warten_Antrieb_wird_aktiviert" 4 "zum_Fahren_Bremse_und_Fahrstufe" 5 "h2_Tankklappe_nicht_fahrbereit" 6 "zum_Starten_Bremse_treten" 7 "zum_Starten_Kupplung_treten" 15 "Init"; +VAL_ 1155 MO_Powermeter_Inszenierung_aktiv 0 "keine_Anzeige" 1 "Inszenierung_aktiv"; +VAL_ 1155 MO_Powermeter_Charge_Grenze 1022 "Init" 1023 "Fehler"; +VAL_ 1155 MO_Powermeter_Grenze_strategisch 4094 "Init" 4095 "Fehler"; +VAL_ 1155 MO_Powermeter_untere_E_Grenze 4094 "Init" 4095 "Fehler"; +VAL_ 1155 MO_Powermeter_obere_E_Grenze 4094 "Init" 4095 "Fehler"; +VAL_ 1175 PH_Visualisierung 0 "Aus" 1 "Angefragt" 2 "InAnzeige" 3 "Abgefordert" 6 "Init" 7 "Fehler"; +VAL_ 1175 PDC_Tonausgabe_Front 0 "kein_Ton" 1 "Intervallton_1" 2 "Intervallton_2" 3 "Intervallton_3" 4 "Intervallton_4" 5 "Intervallton_5" 6 "Dauerton" 7 "Fehlerton" 8 "RCTATon"; +VAL_ 1175 PDC_Tonausgabe_Heck 0 "kein_Ton" 1 "Intervallton_1" 2 "Intervallton_2" 3 "Intervallton_3" 4 "Intervallton_4" 5 "Intervallton_5" 6 "Dauerton" 7 "Fehlerton" 8 "Erstwarnton_hinten" 9 "RCTATon"; +VAL_ 1175 PH_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1175 PH_Abschaltursache 0 "keine, bzw. System aktiv" 1 "Abschaltung durch Herausnahme R-Gang" 2 "Abschaltung ueber Geschwindigkeit" 3 "Abschaltung ueber PDC-Taster" 4 "Abschaltung wegen PLA" 5 "Abschaltung durch KL 15 Bit = 0" 6 "tbd." 7 "Fehler-/gestÃļrt Zustand, System noch aktiv"; +VAL_ 1175 PH_Opt_Anzeige_V_ein 0 "optische Anzeige vorne nicht aktiv" 1 "optische Anzeige vorne aktiviert"; +VAL_ 1175 PH_Opt_Anzeige_H_ein 0 "Optische Anzeige aus" 1 "optische Anzeige hinten aktiviert"; +VAL_ 1175 PH_Opt_Anz_V_Hindernis 0 "optische Anzeige vorne meldet kein Hindernis" 1 "optische Anzeige vorne meldet Hindernis im Warnbereich"; +VAL_ 1175 PH_Opt_Anz_H_Hindernis 0 "optische Anzeige hinten meldet kein Hindernis" 1 "optische Anzeige hinten meldet Hindernis im Warnbereich"; +VAL_ 1175 PH_Tongeber_V_aktiv 0 "Tongeber vorne nicht aktiv" 1 "Tongeber vorne aktiv"; +VAL_ 1175 PH_Tongeber_H_aktiv 0 "Tongeber hinten nicht aktiv" 1 "Tongeber hinten aktiv"; +VAL_ 1175 PH_Tongeber_mute 0 "Tongeber nicht stummgeschaltet" 1 "Tongeber stummgeschaltet"; +VAL_ 1175 PH_Anf_Audioabsenkung 0 "Keine_Audioabsenkung" 1 "Anforderung_Audioabsenkung"; +VAL_ 1175 PH_Tongeber_H_verfuegbar 0 "nicht verfÃŧgbar" 1 "verfÃŧgbar"; +VAL_ 1175 PLA_Anf_Aufschaltung_RVC 0 "Keine_RVC_Aufschalteanf" 1 "RVC_Aufschalteanforderung"; +VAL_ 1175 PH_Taster 0 "Taster_nicht_gedrueckt" 1 "Taster_gedrueckt" 2 "reserviert" 3 "Fehler"; +VAL_ 1175 PH_Anf_Verdeck 0 "Verdeckbetrieb_freigegeben" 1 "Verdeckbetrieb_sperren" 2 "reserviert" 3 "reserviert"; +VAL_ 1175 PH_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler"; +VAL_ 1175 PH_Stoermeldung 0 "keine_Anzeige_kein_Gong" 1 "Textmeldung_PDC_hinten_gestoert_mit_Gong" 2 "Textmeldung_PDC_hinten_gestoert_ohne_Gong" 3 "Textmeldung_PDC_vorn_gestoert_mit_Gong" 4 "Textmeldung_PDC_vorn_gestoert_ohne_Gong" 5 "Textmeldung_PDC_gestoert_mit_Gong" 6 "Textmeldung_PDC_gestoert_ohne_Gong" 7 "Textmeldung_PDC_seitlich_gestoert_mit_Gong" 8 "Textmeldung_PDC_seitlich_gestoert_ohne_Gong"; +VAL_ 1175 PH_defekt 0 "PH aktiv" 1 "PH wurde aufgrund eines Defektes deaktiviert"; +VAL_ 1175 PH_gestoert 0 "PH aktiv" 1 "PH wurde auf Grund einer Stoerung tempraer deaktiviert"; +VAL_ 1175 PH_Systemzustand 0 "Anlage aus" 1 "Anlage durch einlegen R-Gang aktiviert" 2 "Anlage manuell durch Taster aktiviert" 3 "Anlage automatisch aktiviert" 4 "Anlage durch ARA aktiviert" 6 "Init - Initialisierungsphase nach Kl. 15 ein / Reset" 7 "Fehler-/gestÃļrt Zustand, System noch aktiv"; +VAL_ 1175 PH_Display_Kundenwunsch 0 "Anzeige aus" 1 "Grafik" 2 "Rear View" 3 "automatisch"; +VAL_ 1283 HVK_Istmodus_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1283 HVK_TN1_Sollmodus 0 "HV_Off" 1 "HV_On" 2 "reserviert" 3 "Initialisierung"; +VAL_ 1283 HVK_MO_EmSollzustand 0 "HvOff" 1 "HvStbyReq" 2 "HvStbyWait" 3 "HvBattOnReq" 4 "HvBattOnWait" 10 "HvOnIdle" 18 "HvOnDrvReq" 19 "HvOnDrvWait" 20 "HvOnDrvRdy" 28 "HvStepUpReq" 29 "HvStepUpWait" 30 "HvStepUp" 38 "HvStepDownReq" 39 "HvStepDownWait" 40 "HvStepDown" 46 "HvAcChPreReq" 47 "HvAcChPreWait" 48 "HvAcChReq" 49 "HvAcChWait" 50 "HvAcCh" 56 "HvDcChPreReq" 57 "HvDcChPreWait" 58 "HvDcChReq" 59 "HvDcChWait" 60 "HvDcCh" 67 "HvChOffReq" 68 "HvChOffWait" 69 "HvOnIdleReq" 70 "HvOnIdleWait" 96 "HvCpntOffReq" 97 "HvCpntOffWait" 98 "HvBattOffReq" 99 "HvBattOffWait" 109 "HvDcDcFailOffReq" 110 "HvDcDcFail" 119 "HvElmOffReq" 120 "HvElmOff" 126 "HvFailCpntOffReq" 127 "HvFailCpntOffWait" 128 "HvFailBattOffReq" 129 "HvFailBattOffWait" 130 "HvFailBattOff" 138 "HvFailUCtlReq" 139 "HvFailUCtlWait" 140 "HvFailUCtl" 150 "HvEmgcyOff" 255 "Init"; +VAL_ 1283 HVK_BMS_Sollmodus 0 "HV_Off" 1 "HV_On" 3 "AC_Laden_erw" 4 "AC_Laden" 6 "DC_Laden" 7 "Init"; +VAL_ 1283 HVK_DCDC_Sollmodus 0 "Standby" 1 "HV_On_Vorladen" 2 "Tiefsetzen" 3 "Hochsetzen" 4 "Pruefpuls_12V" 7 "Initialisierung"; +VAL_ 1283 HVK_EKK_Sollmodus 0 "Keine_Freigabe" 1 "Freigabe" 2 "Freigabe_ausgesetzt" 7 "Init"; +VAL_ 1283 HVK_HVPTC_Sollmodus 0 "Keine_Freigabe" 1 "Freigabe" 2 "Freigabe_ausgesetzt" 7 "Init"; +VAL_ 1283 HVK_HVLM_Sollmodus 0 "keine_Freigabe" 1 "Freigabe_Lademanager" 2 "Vorladung_AC_Pfad" 7 "Init"; +VAL_ 1283 HVK_HV_Netz_Warnungen 0 "Keine_Warnung" 1 "Warntext_HV_Netz_Anf" 2 "Fehlertext_HV_Netz_Anf" 3 "Warnung_Kein_Wiederstart_moeglich"; +VAL_ 1283 HV_Bordnetz_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1283 HV_Bordnetz_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 1283 HVK_Gesamtst_Spgfreiheit 0 "Funktion_Init__ohne_Funktion" 1 "HV_System_spannungsfrei" 2 "HV_System_nicht_spannungsfrei" 3 "Fehler"; +VAL_ 1283 HVK_AktiveEntladung_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1283 HVK_Iso_Messung_Start 0 "keine_Messung" 1 "Messung_HV_Netz_1" 2 "Messung_HV_Netz_2" 4 "deaktiviert"; +VAL_ 1283 HVK_DCDC_EKK_Sollmodus 0 "aus" 1 "ein" 2 "reserviert" 3 "Init"; +VAL_ 1312 LoGeWa_Event_Kombiwarnung 0 "Init" 1 "Unfall" 2 "Traktionsverlust" 3 "Panne" 4 "Sichtbehinderung" 5 "Aquaplaning"; +VAL_ 1312 AB_Anforderung_eCall 0 "keine_Anforderung" 1 "Anforderung"; +VAL_ 1312 AB_Anprall_Seite_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Rollover 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_FGS 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Front_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Front_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Heck_Beifahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Anprall_Heck_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 AB_Wickelklappung_Reihe2_MI 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; +VAL_ 1312 AB_Belegung_VB 0 "nicht_verfuegbar" 1 "Fehler" 2 "nicht_belegt" 3 "belegt"; +VAL_ 1312 AB_Abschaltanf_SIH_BF 0 "Normalbetrieb" 1 "Abschaltung_angefordert"; +VAL_ 1312 AB_Anprall_Seite_Fahrer 0 "kein_Anprall" 1 "Anprall_erkannt"; +VAL_ 1312 SC_PAO_Schriftzug_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; +VAL_ 1312 SC_PAO_ON_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; +VAL_ 1312 SC_PAO_OFF_Anf 0 "LED aus" 1 "LED an" 2 "LED blinken" 3 "reserviert"; +VAL_ 1312 AB_Crashschwere 0 "kein_Ereignis" 1 "Crashschwere_1" 2 "Crashschwere_2" 3 "Crashschwere_3" 4 "Crashschwere_4" 5 "Crashschwere_5" 6 "Crashschwere_2_bis_5" 7 "Fehler"; +VAL_ 1312 AB_Anforderung_USM 0 "keine_Anforderung" 1 "Anforderung"; +VAL_ 1312 AB_Gurtschloss_FA 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_BF 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe2_FA 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe2_MI 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe2_BF 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe3_FA 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe3_MI 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Gurtschloss_Reihe3_BF 0 "nicht_verbaut" 1 "nicht_verfÃŧgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt"; +VAL_ 1312 AB_Sitzpos_Sens_FA 0 "nicht verfÃŧgbar" 1 "Fehler" 2 "Sitz nicht vorne" 3 "Sitz vorne"; +VAL_ 1312 AB_Sitzpos_Sens_BF 0 "nicht verfÃŧgbar" 1 "Fehler" 2 "Sitz nicht vorne" 3 "Sitz vorne"; +VAL_ 1312 AB_Wickelklappung_Reihe2_BF 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; +VAL_ 1312 AB_Wickelklappung_Reihe2_FA 0 "nicht_verbaut" 1 "nicht_verfuegbar__Fehler_oder_Init" 2 "nicht_verriegelt" 3 "verriegelt"; +VAL_ 1349 AB_Gurtwarn_Reihe2_FA 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AB_Gurtwarn_Reihe2_BF 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AbstWarn_MV_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; +VAL_ 1349 WarnBrems_Charisma_Status 0 "Init" 1 "verfÃŧgbar" 2 "nicht verfÃŧgbar" 3 "asynchron durch Fahrerwunsch"; +VAL_ 1349 WarnBrems_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1349 AB_Gurtwarn_Reihe2_MI 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AB_Gurtwarn_Reihe3_FA 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AB_Gurtwarn_Reihe3_MI 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 AB_Gurtwarn_Reihe3_BF 0 "nicht_verbaut" 1 "keine_Gurtwarnung_Sitz_leer" 2 "keine_Gurtwarnung_Sitz_belegt" 3 "Gurtwarnung_Sitz_belegt"; +VAL_ 1349 LGI_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; +VAL_ 1349 PreCrash_FAS_Fkt_Status 0 "Init" 1 "Funktion_Ist_Ein" 2 "Funktion_Ist_Aus" 3 "Fehler"; +VAL_ 1349 AB_SBR_hinten_verbau 0 "ohne_SBR_hinten" 1 "mit_SBR_hinten" 2 "nicht_definiert" 3 "Init"; +VAL_ 1349 AWV_Einstellung_System_ASG 0 "deaktiviert" 1 "aktiviert"; +VAL_ 1349 AWV_Einstellung_Warnung_ASG 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; +VAL_ 1349 SC_PreSense_Modus_Warnung_NV 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; +VAL_ 1349 SC_PreSense_Modus_Warnung_MV 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; +VAL_ 1349 SC_PreSense_Modus_System_MV 0 "deaktiviert" 1 "aktiviert"; +VAL_ 1349 SC_PreSense_Modus_System_NV 0 "deaktiviert" 1 "aktiviert"; +VAL_ 1349 SC_PreSense_Modus_System_KAS 0 "deaktiviert" 1 "aktiviert"; +VAL_ 1355 PH_Verschmutzungsmeldung 0 "keine_Anzeige_kein_Gong" 1 "Textmeldung_PDC_hinten_verschmutzt_mit_Gong" 2 "Textmeldung_PDC_hinten_verschmutzt_ohne_Gong" 3 "Textmeldung_PDC_vorn_verschmutzt_mit_Gong" 4 "Textmeldung_PDC_vorn_verschmutzt_ohne_Gong" 5 "Textmeldung_PDC_verschmutzt_mit_Gong" 6 "Textmeldung_PDC_verschmutzt_ohne_Gong" 7 "Textmeldung_PDC_seitlich_verschmutzt_mit_Gong" 8 "Textmeldung_PDC_seitlich_verschmutzt_ohne_Gong"; +VAL_ 1355 PH_Aufschaltursache 0 "Anlage aus" 1 "Anlage durch einlegen R-Gang aktiviert" 2 "Anlage manuell durch Taster aktiviert" 3 "Anlage automatisch aktiviert" 4 "Anlage durch ARA aktiviert" 5 "Rueckwaertsrollen" 6 "Anlage_durch_PLA_aktiviert" 7 "Anlage_durch_IPA_aktiviert" 8 "Anlage_durch_FA_aktiviert" 9 "Anlage_durch_RBF_oder_MA_aktiviert" 10 "Anlage_durch_Smartphone_aktiviert" 11 "Anlage_durch_Jokertaste_aktiviert" 12 "Anlage_durch_Favoritentasten_aktiviert" 13 "Anlage_durch_SideViewTaster_aktiviert" 14 "Anlage_durch_RCTA_aktiviert" 15 "Anlage_durch_KAS_aktiviert" 16 "Anlage_durch_AWC_aktiviert" 30 "Init_Initialisierungsphase_nach_Kl_15_ein_oder_Reset" 31 "Fehler_gestoerter_Zustand_System_noch_aktiv"; +VAL_ 1355 PH_Ton_Ausgabe 0 "Init" 1 "Intervallton_vorne" 2 "Intervallton_hinten" 3 "Dauerton_vorne" 4 "Dauerton_hinten" 5 "Quittierungston" 6 "Reserviert" 7 "Fehler"; +VAL_ 1355 PH_Ton_Pausenlaenge 0 "Init" 1 "Pause_5ms" 2 "Pause_10ms" 3 "Pause_15ms" 100 "Pause_500ms" 101 "Reserviert" 126 "Reserviert" 127 "Fehler"; +VAL_ 1355 PH_Ton_Richtung 0 "vorne" 1 "vorne_rechts" 2 "rechts" 3 "rechts_hinten" 4 "hinten" 5 "hinten_links" 6 "links" 7 "vorne_links"; +VAL_ 1355 PH_Ton_Lautstaerke 0 "Minimallautstaerke" 1 "Lautstaerke_1" 2 "Lautstaerke_2" 3 "Lautstaerke_3" 4 "Lautstaerke_4" 5 "Lautstaerke_5" 6 "Lautstaerke_6" 7 "Maximallautstaerke"; +VAL_ 1355 BCM_WAH_Meldung 0 "Init" 1 "Fehlermeldung_bei_Nichtverfuegbarkeit_mit_Gong" 2 "Fehlermeldung_bei_Nichtverfuegbarkeit_ohne_Gong" 3 "Anzeige_dass_Fahrzeug_erkannt_wurde_und_Funktion_aktiv_ist" 4 "Wiederanfahrhinweis_mit_Gong" 5 "Wiederanfahrhinweis_ohne_Gong"; +VAL_ 1355 PDC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 1355 PDC_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1361 WFS_Schluessel_Fahrberecht 0 "kein authorisierter Schluessel erkannt" 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "digitaler_Schluessel_aktiv"; +VAL_ 1361 WFS_ID_Geb_autorisiert 0 "Schluessel_nicht_authorisiert" 1 "Schluessel authorisiert"; +VAL_ 1361 WFS_ID_Geb_autorisiert_in_Kl15 0 "nicht_authorisiert_in_Kl15" 1 "authorisiert_in_Kl15"; +VAL_ 1361 WFS_ID_Geb_steckt 0 "kein_Schluessel_im_Zuendschloss" 1 "Schluessel steckt im Zuendschloss"; +VAL_ 1361 WFS_Schluessel_Soll 0 "Init"; +VAL_ 1361 WFS_Schluessel_Ist 0 "Init"; +VAL_ 1361 WFS_Safe 0 "Init" 1 "WFS nicht deaktiviert"; +VAL_ 1361 WFS_LZ 0 "nicht def." 1 "LZ 1" 2 "LZ 2" 3 "LZ 3"; +VAL_ 1361 WFS_ELV_authorisiert 0 "ELV_nicht_authorisiert" 1 "ELV_authorisiert"; +VAL_ 1361 WFS_LF_Aktiv 0 "Funktempfang_nicht_aktiv" 1 "LF_Funkempfang_aktiv"; +VAL_ 1361 WFS_Betrieb_Lesespule 0 "keine_Schluesselkomm_Lesespule" 1 "Schluesselkomm_Lesespule"; +VAL_ 1361 WFS_Klemmenfreigabe 0 "keine_Freigabe" 1 "Freigabe"; +VAL_ 1361 WFS_Fahrerhinweise 0 "Keine_Anzeigeanforderung" 1 "Schuessel_Auth_niO" 2 "Notlauf_aktiv" 3 "Schluessel_Kessy_nicht_gefunden"; +VAL_ 1361 WFS_Parken_Status 0 "Limitierung_inaktiv" 1 "Limitierung_aktiv" 2 "Abbruch"; +VAL_ 1411 BCM_FH_Freigabe 1 "Funktionsfreigabe Fensterheber"; +VAL_ 1411 BCM_Komfortfkt_Freigabe 0 "Komfortfunktion gesperrt" 1 "globale Freigabe der Komfortfunktion erteilt"; +VAL_ 1411 BCM_HSK_Freigabe 0 "erlauben" 1 "sperren"; +VAL_ 1411 BCM_Verdeck_Freigabe 0 "Verdeckbetrieb nicht erlaubt" 1 "Verdeckbetrieb erlaubt"; +VAL_ 1411 ZV_verriegelt_intern_ist 1 "Fahrzeug innen verriegelt; Istzustand"; +VAL_ 1411 ZV_verriegelt_extern_ist 1 "Fahrzeug_aussen_verriegelt_Istzustand"; +VAL_ 1411 ZV_verriegelt_intern_soll 1 "Fahrzeug verriegelt intern; Sollzusstand"; +VAL_ 1411 ZV_verriegelt_extern_soll 1 "Fahrzeug verriegelt extern; Sollzusstand"; +VAL_ 1411 ZV_gesafet_extern_ist 1 "Fahrzeug aussen gesafet; Istzustand"; +VAL_ 1411 ZV_gesafet_extern_soll 1 "Fahrzeug_aussen_gesafet_Sollzustand"; +VAL_ 1411 ZV_Einzeltuerentriegelung 1 "Fahrzeug an Einzeltuer entriegelt"; +VAL_ 1411 ZV_Heckeinzelentriegelung 1 "Heckdeckeleinzelentriegelung"; +VAL_ 1411 ZV_FT_offen 0 "FT_geschlossen" 1 "FT_geoeffnet"; +VAL_ 1411 ZV_BT_offen 0 "BT_geschlossen" 1 "BT_geoeffnet"; +VAL_ 1411 ZV_HFS_offen 0 "geschlossen" 1 "offen"; +VAL_ 1411 ZV_HBFS_offen 0 "geschlossen" 1 "offen"; +VAL_ 1411 ZV_HD_offen 1 "Heckdeckel_auf"; +VAL_ 1411 ZV_HS_offen 0 "Heckscheibe_geschlossen" 1 "Heckscheibe auf"; +VAL_ 1411 IRUE_aktiv 0 "unscharf" 1 "scharf"; +VAL_ 1411 DWA_aktiv 0 "unscharf" 1 "scharf"; +VAL_ 1411 HD_Hauptraste 0 "geschlossen" 1 "offen"; +VAL_ 1411 HD_Vorraste 0 "geschlossen" 1 "offen"; +VAL_ 1411 FFB_CarFinder 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1411 FFB_Komfortoeffnen 0 "kein_Komfortoeffnen_empfangen" 1 "Komfortoeffnen ueber Funk empfangen"; +VAL_ 1411 FFB_Komfortschliessen 0 "kein_Komfortschliessen_empfangen" 1 "Komfortschliessen ueber Funk empfangen"; +VAL_ 1411 ZV_Schluessel_Zugang 0 "kein_auth_Schluessel_erkannt" 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "ungueltig_15"; +VAL_ 1411 ZV_SafeFunktion_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 FBS_Warn_Schluessel_Batt 0 "i.O." 1 "defekt"; +VAL_ 1411 ZV_Oeffnungsmodus 0 "globale_Oeffnung" 1 "ZV_mit_Einzeltuerentr" 2 "ZV_individuell_selektiv" 3 "ZV_seitenselektiv"; +VAL_ 1411 HFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1411 HFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 1411 HBFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1411 HBFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 1411 ZV_ist_Zustand_verfuegbar 0 "nicht_verfuegbar" 1 "verfuegbar_alle_TSGs_am_Bus"; +VAL_ 1411 IRUE_Taster_Fkts_LED 0 "LED_aus" 1 "LED_ein"; +VAL_ 1411 ZV_Tankklappe_offen 0 "Tankklappe_geschlossen" 1 "Tankklappe_offen"; +VAL_ 1411 ZV_Rollo_auf 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_Rollo_zu 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_SAD_auf 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_SAD_zu 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 BCM_Tankklappensteller_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 1411 ZV_verriegelt_soll 0 "Init" 1 "nicht_verriegelt" 2 "verriegelt"; +VAL_ 1413 SI_Sammel_SG_Fehler 61 "Reserviert" 62 "Overflow" 63 "ungueltig"; +VAL_ 1413 SI_Diagnose_Aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1413 SI_QRS_Mode 0 "QRS_Messmodus_nicht_aktiv" 1 "QRS_Messmodus_aktiv"; +VAL_ 1413 SI_T_Mode 0 "Transportmodus_nicht_aktiv" 1 "Transportmodus_aktiv"; +VAL_ 1413 SI_NWDF 0 "Ueberwachung_nicht_freigegeben" 1 "Ueberwachung_freigegeben"; +VAL_ 1413 SI_NWDF_gueltig 0 "NWDF_wird_nicht_unterstuetzt" 1 "NWDF_wird_unterstuetzt"; +VAL_ 1413 SI_Sammelfehler 0 "kein_Sammelfehler" 1 "Sammelfehler"; +VAL_ 1413 GW_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler"; +VAL_ 1413 SI_T_Schutz 0 "Transportschutz_nicht_aktiv" 1 "Transportschutz_aktiv"; +VAL_ 1413 SI_BUS_01 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_02 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_03 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_04 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_05 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_06 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_07 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_08 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_09 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_10 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_11 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_12 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_13 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_14 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_BUS_15 0 "keine_Busruhe" 1 "Busruhe"; +VAL_ 1413 SI_Bus_Identifikation 16 "CAN_Diagnose" 17 "CAN_Antrieb" 18 "CAN_Komfort" 19 "CAN_Infotainment" 20 "CAN_Fahrwerk" 21 "CAN_Extended" 22 "CAN_Hybrid" 23 "CAN_Lade" 24 "CAN_Kombi" 25 "CAN_Komfort_2" 26 "CAN_AFS" 33 "CAN_FahrerAssistenzSysteme" 34 "CAN_Migration" 35 "CAN_Connect" 36 "CAN_AnzeigeBedienung" 37 "CAN_ElectricalVehicle" 40 "CAN_Telematik" 41 "CAN_MFL" 42 "CAN_FahrerAssistenzSysteme_2" 48 "FlexRay_A" 49 "FlexRay_B" 97 "VLAN_FAS" 98 "VLAN_Infotainment" 99 "VLAN_Connect" 100 "VLAN_Komfort" 101 "VLAN_Antrieb" 102 "VLAN_Diagnose" 103 "VLAN_Internet" 104 "VLAN_Gateway" 105 "VLAN_Remote_FC" 106 "VLAN_Connect_2" 107 "VLAN_Licht" 108 "VLAN_Charge" 109 "VLAN_Cockpit" 176 "HCP1_CANFD01" 177 "HCP1_CANFD02" 178 "HCP1_CANFD03" 179 "HCP1_CANFD04" 180 "HCP1_CANFD05" 181 "HCP1_CANFD06" 182 "HCP1_CANFD07" 183 "HCP1_CANFD08" 186 "HCP4_CANFD03" 187 "HCP4_CANFD04" 188 "HCP1_CANFD09" 189 "HCP4_CANFD06" 190 "HCP4_CANFD07" 191 "HCP4_CANFD08" 192 "HCP4_CANFD09" 193 "HCP4_CANFD10" 194 "HCP1_CANFD10" 195 "ICAS1_CANFD2_HCP5_CANFD02" 196 "HCP1_CANFD11" 197 "WU_HCP1_CANFD" 198 "WU_HCP2_1_CANFD" 199 "WU_HCP_2_CANFD" 200 "WU_HCP_3_CANFD" 201 "WU_HCP4_CANFD" 202 "WU_HCP3_CANFD02" 204 "ESC_CANFD" 205 "HCP4_CANFD11" 206 "HCP4_CANFD12" 207 "HCP5_CANFD04" 208 "HCP5_CANFD05" 212 "WU_ConMod_CANFD" 213 "WU_PASD_CANFD"; +VAL_ 1413 SI_CAB 0 "inaktiv" 1 "CAB_01__Tueren" 2 "CAB_02__Anhaenger" 4 "CAB_03__Nightvision" 8 "CAB_04__Sitzverstellung" 16 "CAB_05__Klappen" 32 "CAB_06__Infotainment" 64 "CAB_07__Sub_Infotainment" 128 "CAB_08__Anzeige" 256 "CAB_09__Laden" 512 "CAB_10__Klima" 1024 "CAB_11__FlexRay" 262144 "CAB_19_VLAN_Remote_FC" 524288 "CAB_20_VLAN_Komfort"; +VAL_ 1420 KST_Txt_P_Gang 0 "Aus" 1 "Ein"; +VAL_ 1420 KST_Txt_Panikabschaltung 0 "Aus" 1 "Ein"; +VAL_ 1420 KST_Anf_Klemmenfreigabe_ELV 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1420 KST_Txt_Komfortabschaltung 0 "inaktiv" 1 "aktiv"; +VAL_ 1420 KST_ZAT_betaetigt 0 "Aus" 1 "Ein"; +VAL_ 1420 KST_Unterdr_Zuendungsmeldung 0 "keine_Unterdr_der_Zuendungsmeldung" 1 "Unterdr_der_Zuendungsmeldung_aktiv"; +VAL_ 1420 KST_aut_Abschaltung_Zuendung 0 "Zuendung_wird_bei_Verl_nicht_deaktiviert" 1 "Zuendung_wird_bei_Verl_deaktiviert"; +VAL_ 1420 KST_Anf_ZV_Verriegelung 0 "inaktiv" 1 "aktiv"; +VAL_ 1420 Relais_VoKo_angesteuert 0 "nicht_angesteuert" 1 "angesteuert"; +VAL_ 1420 RSt_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" 6 "Parken_mit_P"; +VAL_ 1440 LS_Helligkeit_IR 254 "Init" 255 "Fehler"; +VAL_ 1440 LS_Helligkeit_FW 1022 "Init" 1023 "Fehler"; +VAL_ 1440 LS_defekt 0 "OK" 1 "defekt"; +VAL_ 1440 LS_Verbau 0 "Init" 1 "Lichtsensor_verbaut"; +VAL_ 1440 RS_Regenmenge 14 "Init" 15 "Fehler"; +VAL_ 1440 RS_Verbau 0 "Init" 1 "Regensensor verbaut"; +VAL_ 1440 RS_Verglasung_schliessen 0 "Verglasung nicht schliessen" 1 "Verglasung schliessen"; +VAL_ 1440 RS_defekt 0 "OK" 1 "defekt"; +VAL_ 1440 RS_Wischergeschwindigkeit 0 "kein Wischen" 1 "42 Huebe/min" 2 "45 Huebe/min" 3 "48 Huebe/min" 4 "51 Huebe/min" 5 "54 Huebe/min" 6 "57 Huebe/min" 7 "60 Huebe/min"; +VAL_ 1440 RLS_Vorfeldhelligkeit_Boost 0 "groesser_24413_Lux" 1 "bis_24413_Lux" 2 "bis_22193_Lux" 3 "bis_20176_Lux" 4 "bis_18342_Lux" 5 "bis_16647_Lux" 6 "bis_15158_Lux" 7 "bis_13780_Lux" 8 "bis_12527_Lux" 9 "bis_11388_Lux" 10 "bis_10353_Lux" 11 "bis_9412_Lux" 12 "bis_8556_Lux" 13 "bis_7778_Lux" 14 "bis_7071_Lux" 15 "bis_6428_Lux"; +VAL_ 1442 BMS_Status_ServiceDisconnect 0 "gesteckt" 1 "gezogen"; +VAL_ 1442 BMS_Status_Spgfreiheit 0 "Init" 1 "HV_Komponente_spannungsfrei" 2 "HV_Komp_nicht_spannungsfrei" 3 "Fehler_nicht_spannungsfrei"; +VAL_ 1442 BMS_OBD_Lampe_Anf 0 "kein_MIL_Request" 1 "MIL_Request"; +VAL_ 1442 BMS_IstModus 0 "HV_inaktiv" 1 "Fahren_HV_aktiv" 2 "stBalancing" 3 "externes_Laden" 4 "AC_Laden" 5 "Error_Batt" 6 "DC_Laden" 7 "Init"; +VAL_ 1442 BMS_Fehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Isofehler_I" 2 "Eingeschr_KompFkt_Isofehler_II" 3 "Eingeschr_KompFkt_Interlock" 4 "Eingeschr_KompFkt_SD" 5 "Eingeschr_KompFkt_Leistungsred" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 1442 BMS_Kapazitaet_02 2047 "Init"; +VAL_ 1442 BMS_Soll_SOC_HiRes 2046 "Init" 2047 "Fehler"; +VAL_ 1447 TM_Spiegel_Anklappen 0 "Init" 1 "Spiegel_anklappen"; +VAL_ 1447 TM_Nur_Hupen 0 "inaktiv" 1 "aktiv"; +VAL_ 1447 TM_Door_Lock 0 "Init" 1 "door_lock"; +VAL_ 1447 TM_Door_Unlock 0 "Init" 1 "door_unlock"; +VAL_ 1447 TM_Warnblinken 0 "Init" 1 "Warnblinken_on"; +VAL_ 1447 TM_Panik_Alarm 0 "Init" 1 "panik_alarm_on"; +VAL_ 1447 TM_ZV_Signatur 0 "Init"; +VAL_ 1452 HVEM_IstStrom_HVVerbraucher 4094 "Init" 4095 "Fehler"; +VAL_ 1452 HVEM_Energie_Klima_Vorgabe_HighR 6 "Init" 7 "Fehler"; +VAL_ 1452 HVEM_IstLeistungNA 510 "Init" 511 "Fehler"; +VAL_ 1452 HVEM_Leistung_Klima_Vorgabe 254 "Init" 255 "Fehler"; +VAL_ 1452 HVEM_Nutzbare_Energie 2045 "Max" 2046 "Init" 2047 "Fehler"; +VAL_ 1452 HVEM_Energie_Klima_Vorgabe 254 "Init" 255 "Fehler"; +VAL_ 1452 HVEM_MO_MaxLeistungIgnoriert 0 "Max_Leistung_nicht_ignoriert" 1 "Max_Leistung_ignoriert"; +VAL_ 1485 DC_Fehlerstatus 0 "Komponente_IO" 1 "Eingeschr_KompFkt_Entlad_defekt" 3 "Eingeschr_KompFkt_Interlock" 6 "Keine_Komponentenfunktion" 7 "Init"; +VAL_ 1485 DC_Peakstrom_verfuegbar 0 "Peakstrom_nicht_verfuegbar" 1 "Peakstrom_verfuegbar"; +VAL_ 1485 DC_Abregelung_Temperatur 0 "keine_Abregelung" 1 "Abregelung_Temp"; +VAL_ 1485 DC_IstModus_02 0 "Standby" 1 "HV_On_Vorladen" 2 "Tiefsetzen" 3 "Hochsetzen" 4 "Pruefimpuls_12V" 5 "Fehler" 7 "Initialisierung"; +VAL_ 1485 DC_HV_EKK_IstModus 0 "Standby" 2 "Tiefsetzen" 3 "Hochsetzen" 5 "Fehler" 7 "Initialisierung"; +VAL_ 1485 DC_Status_Spgfreiheit_HV 0 "Init" 1 "HV_Komponente_spannungsfrei" 2 "HV_Komp_nicht_spannungsfrei" 3 "Fehler_nicht_spannungsfrei"; +VAL_ 1485 DC_IstSpannung_EKK_HV 255 "Init"; +VAL_ 1485 DC_Temperatur 254 "Init" 255 "Fehler"; +VAL_ 1505 BCM1_Aussen_Temp_ungef 253 "nicht_verbaut" 254 "Initwert" 255 "Fehler"; +VAL_ 1505 BCM_Heizungsabsperrventil_Status 0 "HAV_offen" 1 "HAV_geschlossen" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; +VAL_ 1505 BCM_Heizungspumpe_Status 0 "Pumpe_aus" 1 "Pumpe_aktiv_und_Stauts_iO" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; +VAL_ 1505 BCM_Kompressorkupplung_Status 0 "Kupplung_offen" 1 "Kupplung_geschlossen" 2 "Init_oder_nicht_verbaut" 3 "Fehler"; +VAL_ 1505 BCM1_PTC_stufig_Status 0 "Aus" 1 "Stufe_1_aktiv" 2 "Stufe_2_aktiv" 3 "Stufe_3_aktiv" 6 "Init_oder_nicht_verbaut" 7 "Fehler"; +VAL_ 1505 BCM1_FStatus_Aussentemp_ungef 0 "iO" 1 "niO"; +VAL_ 1505 BCM1_Kompressorstrom_ist 254 "Init, bzw. nicht verfuegbar" 255 "Fehler"; +VAL_ 1505 BCM1_OBD_FStatus_ATemp 0 "kein Fehler / Init / nicht verbaut" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach minus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei"; +VAL_ 1513 DS_Kaeltemittel_P 2046 "Init" 2047 "Fehler"; +VAL_ 1513 DS_Status 0 "i.O." 1 "t.b.d." 2 "Init bzw. nicht verfÃŧgbar" 3 "Fehler"; +VAL_ 1513 ION_Status 0 "Hochspannung_ausgeschaltet" 1 "Hochspannung_eingeschaltet" 2 "Init"; +VAL_ 1513 ION_Status_LED 0 "Aus" 1 "Ein"; +VAL_ 1513 AAU_Geblaese 126 "Init" 127 "Fehler"; +VAL_ 1513 ION_Status_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1520 DI_KL_58xd 254 "Init" 255 "Fehler"; +VAL_ 1520 DI_KL_58xs 126 "Init" 127 "Fehler"; +VAL_ 1520 DI_KL_58xt 126 "Init" 127 "Fehler"; +VAL_ 1524 IL_Bel_FS_Ausstieg 0 "inaktiv" 1 "aktiv"; +VAL_ 1524 IL_Bel_BFS_Ausstieg 0 "inaktiv" 1 "aktiv"; +VAL_ 1524 IL_Bel_HFS_Ausstieg 0 "inaktiv" 1 "aktiv"; +VAL_ 1524 IL_Bel_HBFS_Ausstieg 0 "inaktiv" 1 "aktiv"; +VAL_ 1524 BCM1_Innenlicht_gedimmt_V 0 "100% Innenlicht" 1 "gedimmtes Innenlicht"; +VAL_ 1524 BCM1_Innenlicht_gedimmt_H 0 "100% Innenlicht" 1 "gedimmtes Innenlicht"; +VAL_ 1524 IL_Innenlicht_aktiv 0 "Innenlicht inaktiv" 1 "Innenlicht aktiv"; +VAL_ 1524 IL_Klemme_30G_aktiv 0 "Kl_30G_abgeschaltet" 1 "eingeschaltet"; +VAL_ 1524 BCM1_DI_Rampe_Innenlicht 0 "Dimmrampe 0" 1 "Dimmrampe 1"; +VAL_ 1524 BCM1_DI_Rampe_Leselicht 0 "Dimmrampe 0" 1 "Dimmrampe 1"; +VAL_ 1524 BCM1_Innenlicht_H 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Innenlicht_V 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leselicht_Anf_hl 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leselicht_Anf_hr 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leselicht_Anf_vl 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leselicht_Anf_vr 0 "Aus" 1 "Ein"; +VAL_ 1524 BCM1_Leuchten_Aus 0 "keine Aenderung" 1 "Aus"; +VAL_ 1524 AMB_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1524 AMB_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 1600 MO_QBit_Ansaugluft_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1600 MO_QBit_Oel_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1600 MO_QBit_Kuehlmittel_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1600 MO_HYB_Fehler_HV_Netz 0 "i_O" 1 "kein_generatorischer_Betrieb_moeglich"; +VAL_ 1600 MO_aktives_Getriebeheizen 0 "kein_Ventil_ansteuern" 1 "Ventil_muss_angesteuert_werden"; +VAL_ 1600 MO_Absperrventil_oeffnen 0 "nicht_verfuegbar" 1 "Ansteuerung_Ventil_zulaessig" 2 "Ventil_oeffnen_oder_geoeffnet" 3 "Ventil_schliessen_oder_geschlossen"; +VAL_ 1600 MO_Ansaugluft_Temp 254 "Init" 255 "Fehler"; +VAL_ 1600 MO_Oel_Temp 253 "nicht_verbaut" 254 "Init" 255 "Fehler"; +VAL_ 1600 MO_Kuehlmittel_Temp 254 "Init" 255 "Fehler"; +VAL_ 1600 MO_Hoeheninfo 255 "Fehler"; +VAL_ 1600 MO_Kennfeldk 0 "keine KennfeldkÃŧhlung vorhanden" 1 "KennfeldkÃŧhlung vorhanden"; +VAL_ 1600 MO_Getriebe_kuehlen 0 "nicht_kuehlen" 1 "kuehlen"; +VAL_ 1600 MO_Heizungspumpenansteuerung 13 "Fehler" 14 "Init" 15 "nicht_verbaut"; +VAL_ 1600 MO_SpannungsAnf 0 "keine_Anforderung" 1 "Anforderung"; +VAL_ 1601 MO_Faktor_Momente_02 0 "nicht_belegt"; +VAL_ 1601 MO_Hybridfahrzeug 0 "kein_Hybridfahrzeug" 1 "Mild_Hybrid" 2 "Full_Hybrid" 3 "PlugIn_Hybrid"; +VAL_ 1601 MO_Getriebe_Code 0 "Init" 2 "DL501" 3 "DL800" 4 "VL381" 5 "DL382_Front" 6 "DL382_Allrad" 7 "DL702" 8 "AL552_Allrad" 9 "AL552_Front" 10 "AL651" 11 "AL551__AL951__AL1000_8A" 12 "PDK_PAG" 13 "AL551_Hybrid" 15 "Handschalter_konventionell" 16 "AQ250_160" 17 "AQ450" 18 "DQ200" 19 "DQ250" 20 "DQ500" 21 "SQ100" 22 "SQ200" 23 "DQ400E" 24 "DQ381" 25 "AL550" 26 "AQ300" 31 "DL800E" 32 "Single_Gear__ohne_GSG_WH_am_MSG" 33 "EQ550_2P"; +VAL_ 1601 MO_StartStopp_Codiert 0 "Start_Stopp_nicht_verbaut" 1 "Start_Stopp_verbaut"; +VAL_ 1601 MO_Anzahl_Zyl 0 "kein_Zylinder" 1 "1_Zylinder" 2 "2_Zylinder" 3 "3_Zylinder" 4 "4_Zylinder" 5 "5_Zylinder" 6 "6_Zylinder" 7 "7_Zylinder" 8 "8_Zylinder" 9 "9_Zylinder" 10 "10_Zylinder" 11 "11_Zylinder" 12 "12_Zylinder" 13 "15_Zylinder" 14 "16_Zylinder" 15 "18_Zylinder"; +VAL_ 1601 MO_Kraftstoffart 0 "Diesel" 1 "Benzin_inkl_E25_E85" 2 "CNG" 3 "LPG" 4 "Wasserstoff" 5 "E100_Ethanol" 15 "kein_Verbrennungskraftstoff"; +VAL_ 1601 MO_Ansaugsystem 0 "Turbo" 1 "Sauger"; +VAL_ 1601 MO_DPF_verbaut 0 "kein_DPF_verbaut" 1 "DPF_verbaut"; +VAL_ 1601 TSK_Codierung 0 "kein_Fahrgeschwindigkeitsregler" 1 "GRA" 2 "GRA_Plus" 3 "Basis_ACC" 4 "ACC_Follow_to_Stop" 5 "ACC_Stop_and_Go" 7 "Codierung_in_Plausibilisierungsphase"; +VAL_ 1603 KBI_Einheit_Datum 0 "Tag/Monat/Jahr" 1 "Monat/Tag/Jahr" 2 "Jahr/Monat/Tag" 3 "reserviert"; +VAL_ 1603 KBI_Einheit_Druck 0 "Druckangabe in bar" 1 "Druckangabe in psi" 2 "Druckangabe in kPa" 3 "tbd."; +VAL_ 1603 KBI_Einheit_Streckenanz 0 "Kilometer" 1 "Meilen"; +VAL_ 1603 KBI_MFA_v_Einheit_02 0 "kmh" 1 "mph"; +VAL_ 1603 KBI_Einheit_Temp 0 "Grad Celsius °C" 1 "Grad Fahrenheit °F"; +VAL_ 1603 KBI_Einheit_Uhrzeit 0 "24h" 1 "12h AM/PM"; +VAL_ 1603 KBI_Einheit_Verbrauch 0 "mpg UK" 1 "mpg USA" 2 "Liter/100km" 3 "km/Liter"; +VAL_ 1603 KBI_Einheit_Volumen 0 "Liter" 1 "Gallonen UK" 2 "Gallonen USA" 3 "reserviert"; +VAL_ 1603 KBI_Einheit_Verbrauch_elektr 0 "kWh_pro_100km" 1 "km_pro_kWh" 2 "kWh_pro_100mls" 3 "mls_pro_kWh" 4 "MPGe"; +VAL_ 1603 KBI_Einheit_Verbrauch_Gas 0 "kg_per_100km" 1 "km_per_kg" 2 "m3_per_100km" 3 "km_per_m3" 4 "miles_per_lbs" 5 "miles_per_yard3" 6 "miles_per_kg" 7 "miles_per_m3" 8 "miles_per_gallon_equivalent_US"; +VAL_ 1603 KBI_Einheit_Masse 0 "kg" 1 "lbs" 2 "reserviert"; +VAL_ 1622 ELV_Anf_Klemme_S 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Anf_Klemme_15 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Anf_Klemme_50 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_01_Sendestatus 0 "ELV_sendet_mit_1000ms" 1 "ELV_sendet_mit_50ms"; +VAL_ 1622 ELV_Verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1622 ELV_Entriegelt 0 "ELV_nicht_entriegelt" 1 "ELV_entriegelt"; +VAL_ 1622 ELV_ZAT_betaetigt 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1622 ELV_Lebenszustand 0 "Lebenszustand_0" 1 "Lebenszustand_4"; +VAL_ 1622 ELV_Anlernmodus 0 "Normalbetrieb" 1 "Anlernmodus"; +VAL_ 1622 ELV_Klemmenfreigabe 0 "keine_Freigabe" 1 "Freigabe"; +VAL_ 1622 ELV_Abbruch_Anf_Klemmenfreigabe 0 "kein_Abbruch" 1 "Abbruch"; +VAL_ 1622 ELV_LED_Rot 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_LED_Gelb 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Panikabschaltung 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Lkg_Bewegen 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Werkstatt 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Defekt 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_P_Gang 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_PN_Gang 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Kupplung 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_Txt_Bremse 0 "Aus" 1 "Ein"; +VAL_ 1622 ELV_P_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1624 LV_Standlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_Abblendlicht_Anzeige 0 "inaktiv" 1 "aktiv"; +VAL_ 1624 LV_Fernlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_Nebellicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_Nebelschlusslicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_Tagfahrlicht_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_AFL_aktiv_Anzeige 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1624 LV_AFL_defekt 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Blinker_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Standlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblendlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Fernlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Nebellicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Blk_li_Seite_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Tagfahrlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_FLA_aktiv_Anzeige 0 "aus" 1 "ein"; +VAL_ 1624 LV_FLA_defekt 0 "i.O." 1 "FLA defekt"; +VAL_ 1624 LV_FLA_Sensor_blockiert 0 "i.O." 1 "FLA-Sensor blockiert"; +VAL_ 1624 LV_Blinker_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Standlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblendlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Fernlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Nebellicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Blk_re_Seite_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Tagfahrlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Aussenlicht_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblendlicht_TFL_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Nebellicht_TFL_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Standlicht_TFL_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblend_Fernlicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblendlicht_TFL_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Nebellicht_TFL_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Standlicht_TFL_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abblend_Fernlicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abbiegelicht_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Abbiegelicht_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 BCM1_Linksverkehr 0 "Rechtsverkehr" 1 "Linksverkehr"; +VAL_ 1624 BCM1_Licht_Dunkelheit_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1624 LV_LED_Scheinwerfer_li_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_LED_Scheinwerfer_re_def 0 "OK" 1 "defekt"; +VAL_ 1624 LV_Blinker_VL_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1624 LV_Blinker_VR_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1624 LV_MXB_Status_Anzeige 0 "MXB_aus" 1 "MXB_regelt" 2 "MXB_volles_Fernlicht" 3 "MXB_und_Laser_aktiv"; +VAL_ 1629 BR_Systemart 0 "ABS" 1 "ABS_ASR" 2 "ESP" 3 "ESP_mit_integrierter_EPB"; +VAL_ 1629 ESP_SpannungsAnf_02 0 "keine_Anforderung" 1 "Anforderung_Stufe1" 2 "Anforderung_Stufe2" 3 "Anforderung_Stufe3"; +VAL_ 1629 ESP_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1629 ESP_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 1629 ESP_Wiederstart_Anz_01 0 "keine_Anzeige" 1 "Rueckwaertsrollen"; +VAL_ 1629 ESP_Wiederstart_Anz_02 0 "keine_Anzeige" 1 "Autohold_Rutschen"; +VAL_ 1629 ESP_Wiederstart_Anz_03 0 "keine_Anzeige" 1 "Offroad_HDC"; +VAL_ 1629 ESP_Wiederstart_Anz_04 0 "keine_Anzeige" 1 "ESC_Off"; +VAL_ 1629 ESP_Stoppverbot_Anz_01 0 "keine_Anzeige" 1 "Notbremsung_aktiv"; +VAL_ 1629 ESP_Stoppverbot_Anz_02 0 "keine_Anzeige" 1 "Autohold_AVH_Rutschen"; +VAL_ 1629 ESP_Stoppverbot_Anz_03 0 "keine_Anzeige" 1 "Rueckwaertsrollen"; +VAL_ 1629 ESP_Stoppverbot_Anz_04 0 "keine_Anzeige" 1 "ESP_Pumpenlauf"; +VAL_ 1629 ESP_Stoppverbot_Anz_05 0 "keine_Anzeige" 1 "ESP_OFF"; +VAL_ 1629 ESP_Stoppverbot_Anz_06 0 "keine_Anzeige" 1 "Offroad_HDC"; +VAL_ 1629 ESP_Stoppverbot_Anz_07 0 "keine_Anzeige" 1 "ESP_Haltefunktion_nicht_verfuegbar"; +VAL_ 1629 ESP_Stoppverbot_Anz_Std 0 "keine_Anzeige" 1 "Standard_Stoppvetogrund"; +VAL_ 1629 ESP_Dachrelingsensor 0 "Sensor_nicht_verbaut" 1 "Quertraeger_montiert" 2 "Quertraeger_nicht_montiert" 3 "Fehler"; +VAL_ 1629 ESP_Stoppverbot_Anz_08 0 "keine_Anzeige" 1 "Neigungsbegrenzung"; +VAL_ 1629 HDC_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 1629 HDC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 1629 BR_QBit_Reifenumfang 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1631 TSK_QBit_Steigung 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1631 TSK_QBit_Fahrzeugmasse 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1631 MO_SpannungsAnf_02 0 "keine_Anforderung" 1 "Anforderung_Stufe_1" 2 "Anforderung_Stufe_2" 3 "Anforderung_Stufe_3"; +VAL_ 1631 MO_DPF_reg 0 "DPF_regeneriert_nicht" 1 "DPF_regeneriert"; +VAL_ 1631 MO_Heizstrom_EKAT 127 "Fehler"; +VAL_ 1631 MO_Heizstrom_SCR 63 "Fehler"; +VAL_ 1631 MO_Anzeige_Kaltleuchte 0 "Lampe_aus" 1 "Lampe_an"; +VAL_ 1631 MO_P_Generator_ungefiltert_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1631 TSK_Getriebeinfo 0 "Handschalter" 1 "AL_AQ_Getriebe" 2 "DL_DQ_Getriebe" 3 "CVT_Getriebe"; +VAL_ 1631 MO_Energieinhalt_BMS 4094 "Init" 4095 "Fehler"; +VAL_ 1631 TSK_Fahrzeugmasse_02 255 "Fehler"; +VAL_ 1631 TSK_Steigung_02 0 "Init_oder_nicht_verbaut" 255 "Fehler"; +VAL_ 1640 KL_LRH_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1640 KL_LRH_Stufe 0 "Stufe_niedrig" 1 "Stufe_mittel" 2 "Stufe_hoch" 3 "AUS"; +VAL_ 1640 HSH_Taster 0 "nicht_betaetigt" 1 "short_push" 2 "long_push" 3 "tbd"; +VAL_ 1640 FSH_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1640 KL_Zuheizer_Freigabe 0 "keine_Freigabe_Zuheizer" 1 "Zuheizerfreigabe"; +VAL_ 1640 KL_Beschlagsgefahr 0 "keine_Beschlagsgefahr" 1 "Beschlagsgefahr"; +VAL_ 1640 KRH_Soll_li 0 "aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; +VAL_ 1640 KRH_Soll_re 0 "aus" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3"; +VAL_ 1640 KL_Geblspng_Soll 0 "0V_Motorspannung" 252 "0V_sofort_Abschalten" 253 "0V_senken_mit_Rampe" 254 "reserviert" 255 "Fehler"; +VAL_ 1640 KL_Geblspng_Fond_Soll 0 "0V_Motorspannung" 252 "0V_sofort_Abschalten" 253 "0V_senken_mit_Rampe" 254 "reserviert" 255 "Fehler"; +VAL_ 1640 KL_I_Geblaese 255 "Fehler"; +VAL_ 1640 KL_Kompressorstrom_soll 1022 "Init" 1023 "Fehler"; +VAL_ 1640 KL_Umluftklappe_Status 0 "Frischluft" 1 "Teilumluft_10" 2 "Teilumluft_20" 3 "Teilumluft_30" 4 "Teilumluft_40" 5 "Teilumluft_50" 6 "Teilumluft_60" 7 "Teilumluft_70" 8 "Teilumluft_80" 9 "Teilumluft_90" 10 "Umluft" 14 "Init" 15 "Fehler"; +VAL_ 1640 KL_PTC_Verbauinfo 0 "kein_PTC" 1 "600W_geschaltet" 2 "1000W_geschaltet" 3 "1400W_LIN"; +VAL_ 1648 MO_ANC_Kennfeld_Anf 0 "Kennfeld_1" 1 "Uebergang_Kennfeld_2_nach_1" 2 "Uebergang_Kennfeld_1_nach_2" 3 "Kennfeld_2"; +VAL_ 1648 MO_Bremslicht_Reku 0 "Aus" 1 "Ein"; +VAL_ 1648 MO_StartStopp_PopUp 0 "Statuswechsel_ohne_Taster (Init)" 1 "StSt_per_Taster_deaktiviert" 2 "StSt_per_Taster_aktiviert" 3 "nicht verwendet"; +VAL_ 1648 MO1_Sperr_Info_WFS 0 "nicht_gesperrt" 1 "gesperrt"; +VAL_ 1648 MO1_Freigabe_Info_WFS 0 "ungueltig" 1 "gueltig"; +VAL_ 1648 MO_EPCL 0 "EPCL_aus_kein_Text" 1 "EPCL_gelb_Stoerung" 2 "EPCL_gelb_Leistungsbeschraenkung" 3 "EPCL_rot_Fzg_sicher_abstellen"; +VAL_ 1648 MO_Zylabsch_Texte_02 0 "ein_ZAS_generell_keine_ZAS_Anzeigen" 1 "ZAS_im_VMB" 2 "ZAS_im_ASB_1_Zyl_aktiv" 3 "ZAS_im_ASB_2_Zyl_aktiv" 4 "ZAS_im_ASB_3_Zyl_aktiv" 5 "ZAS_im_ASB_4_Zyl_aktiv" 6 "ZAS_im_ASB_5_Zyl_aktiv" 7 "ZAS_im_ASB_6_Zyl_aktiv" 8 "ZAS_im_ASB_8_Zyl_aktiv" 9 "ZAS_im_ASB_12_Zyl_aktiv" 13 "Uebergangsbetrieb" 14 "keine_ZAS_Anzeige_ggf_Stopp_Schub_Betrieb" 15 "ZAS_Stoerungs_Anzeige"; +VAL_ 1648 MO_Fahrzeugtyp 0 "Verbrenner_Fahrzeug" 1 "Hybrid" 2 "E_Fahrzeug" 3 "E_Fahrzeug_mit_Range_Extender" 4 "Brennstoffzellenfahrzeug" 5 "tbd" 6 "tbd" 7 "tbd"; +VAL_ 1648 MO_Abstellzeit 254 "Init" 255 "reserviert"; +VAL_ 1648 MO_Abstellzeit_Status 0 "Abstellzeit_nicht_berechnet" 1 "Abstellzeit_berechnet" 2 "Abstellzeit_Minimalwert" 3 "Abstellzeit_ungueltig"; +VAL_ 1648 MO1_Freigabe_Verfallsinfo_WFS 0 "verfaellt_nicht" 1 "verfaellt"; +VAL_ 1648 MO_Hybrid_StartStopp_LED 0 "LED_aus_und_Blinken_aus" 1 "LED_ein_und_Blinken_aus" 2 "LED_ein_und_Blinken_ein_50_percent" 3 "reserviert"; +VAL_ 1648 MO_Fehler_Zylabsch 0 "kein_Fehler" 1 "Notlauf_Vollmotorbetrieb" 2 "Notlauf_mindestens_einem_abgesch_Zylinder"; +VAL_ 1648 MO_Anzahl_Abgesch_Zyl 0 "Vollmotorbetrieb" 1 "1_Zylinder_abgeschaltet" 2 "2_Zylinder_abgeschaltet" 3 "3_Zylinder_abgeschaltet" 4 "4_Zylinder_abgeschaltet" 5 "5_Zylinder_abgeschaltet" 6 "6_Zylinder_abgeschaltet" 7 "8_Zylinder_abgeschaltet"; +VAL_ 1648 MO_Zylabsch_Texte 0 "keine_Texte" 1 "Zylinderabschaltung_deaktivieren" 2 "Zylinderabschaltung_aktivieren" 3 "Zylinderabschaltung_unruhig"; +VAL_ 1648 MO_Ethanol_BS_Texte 0 "kein_Text" 1 "E85_Warm_Up" 2 "FlexFuel_Warnung_Stufe_3" 3 "Warmfahrempfehlung_MQB__FlexFuel_Warnung_Stufe_1" 4 "FlexFuel_Warnung_Stufe_2" 5 "FlexFuel_Warnung_Stufe_4" 6 "E25_Warm_Up"; +VAL_ 1648 MO_Drehzahl_Warnung 0 "keinen_Warnhinweis_anzeigen" 1 "Warnhinweis_anzeigen"; +VAL_ 1648 MO_obere_Drehzahlgrenze 0 "Init"; +VAL_ 1710 SP_FT_oben 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_FT_unten 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_FT_links 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_FT_rechts 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_BT_oben 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_BT_unten 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_BT_links 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_BT_rechts 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_abklappen 0 "Spiegel_abklappen_nicht_aktiv" 1 "Spiegel_abklappen_aktiv"; +VAL_ 1710 SP_anklappen 0 "Spiegle_anklappen_nicht_aktiv" 1 "Spiegel_anklappen_aktiv"; +VAL_ 1710 SP_normieren 0 "Spiegel_nicht_normiert" 1 "Spiegel_normiert"; +VAL_ 1710 SP_Hzg_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 1710 SP_S_oben 1 "Spiegelschalter in Stellung oben"; +VAL_ 1710 SP_S_unten 1 "Spiegelschalter in Stellung unten"; +VAL_ 1710 SP_S_links 1 "Spiegelschalter in Stellung links"; +VAL_ 1710 SP_S_rechts 1 "Spiegelschalter in Stellung rechts"; +VAL_ 1710 SP_Auswahl_li 1 "Spiegelschalter in Stellung Auswahl links"; +VAL_ 1710 SP_Auswahl_re 1 "Spiegelschalter in Stellung Auswahl rechts"; +VAL_ 1710 SP_ARA_Status 0 "TSG nicht im ARA-Modus" 1 "TSG im ARA-Modus"; +VAL_ 1710 SP_S_Klappen 1 "Spiegelschalter in Stellung Klappen"; +VAL_ 1710 SP_Verstellschalter_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 1711 RV_Video_on 0 "Kamerabild wird nicht angezeigt" 1 "Kamerabild wird angezeigt"; +VAL_ 1711 RV_Dark_Screen 0 "Kamerabild nicht verdunkeln" 1 "Kamerabild verdunkeln"; +VAL_ 1711 RV_HMI_Mode 0 "Parkluecke (Modus 1)" 1 "Parallel zur StraßĨ (Modus 2)" 2 "reserviert" 3 "Kalibrierung (nur Diagnose)"; +VAL_ 1711 RV_GL_side 0 "Guidelines_abgeschaltet" 1 "Guidelines_Anzeige_rechte_Seite" 2 "Guiedelines_Anzeige_linke_Seite" 3 "Guiedelines_Anzeige_beide_Seiten"; +VAL_ 1711 RV_System_aktiv 0 "System nicht betriebsbereit" 1 "System betriebsbereit"; +VAL_ 1711 RV_Reinigung_Anf 0 "nicht_reinigen" 1 "reinigen"; +VAL_ 1711 RV_Settings_enabled 0 "Menu 'Einstellungen' nicht aktiviert" 1 "Menu 'Einstellungen' aktiviert"; +VAL_ 1711 RV_Menu_Item 0 "HMI Mode als ausgewaehlt markiert" 1 "Helligkeit als ausgewaehlt markiert" 2 "Kontrast als ausgewaehlt markiert" 3 "Farbsaettigung als ausgewaehlt markiert"; +VAL_ 1711 SV_Video_on 0 "SideView_aus_/_nicht_verbaut" 1 "SideView_an"; +VAL_ 1711 RV_Calib_Fehler 0 "Kalibrierung_i.O." 1 "RearView_nicht_kalibriert"; +VAL_ 1711 RV_GL_Trailer_connect 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_angekoppeltem_Anh䎧er_deaktiviert"; +VAL_ 1711 RV_GL_Trunk_open 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_geÃļffneter_Heckklappe_deaktiviert"; +VAL_ 1711 RV_GL_LWS_Fehler 0 "Guidelines_werden_angezeigt" 1 "Guidelines_wegen_nicht_kalibriertem_Lenkwinkelsensor_deaktiviert"; +VAL_ 1711 ZFAS_Umfeldbeleuchtung_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 1714 DGN_Verlernzaehler 255 "ungÃŧltiger Zä¨Ŧerstand oder kein gÃŧltiger Fahrzyklus"; +VAL_ 1714 UH_Monat 0 "Init" 14 "Relatives_Datum" 15 "Fehler"; +VAL_ 1714 UH_Tag 0 "Init"; +VAL_ 1714 Kombi_02_alt 0 "aktuell" 1 "veraltet"; +VAL_ 1714 Uhrzeit_01_alt 0 "aktuell" 1 "veraltet"; +VAL_ 316495015 VZE_Anzeigemodus 0 "EU_RDW" 1 "USA" 2 "Canada" 3 "China"; +VAL_ 316495015 VZE_Verkehrszeichen_Einheit 0 "mph" 1 "kmh"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_3 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_2 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Verkehrszeichen_1_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_1 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Verkehrszeichen_2_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_2 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Verkehrszeichen_3_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_3 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_2 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_3 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Zusatzschild_1 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Zusatzschild_2 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Zusatzschild_3 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_1 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Zeichen_01_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_02_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_03_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_01_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_01_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_01_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_02_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_02_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_02_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_03_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_03_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_03_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Gong 0 "Gong_deaktiv" 1 "Gong_aktiv"; +VAL_ 441800114 Temperature_Status_Charge 0 "init" 1 "temp under optimal" 2 "temp optimal" 3 "temp over optimal" 7 "fault"; + + + +BO_ 258 ESC_50: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Lateral_Accel : 16|8@1+ (0.15,-18.9) [0|255] "Unit_MeterPerSquareSecond" XXX + SG_ Longitudinal_Accel : 24|10@1+ (0.03125,-16) [0|255] "Unit_MeterPerSquareSecond" XXX + SG_ Yaw_Rate : 40|14@1+ (0.01,0) [0|16383] "Unit_DegreePerSecond" XXX + SG_ Yaw_Rate_Sign : 54|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Power : 80|8@1+ (1,-100) [0|255] "" XXX + SG_ Brake_01 : 90|1@0+ (1,0) [0|1] "" XXX + SG_ Regen_Braking : 123|1@1+ (1,0) [0|7] "" XXX + SG_ Brake_02 : 125|1@0+ (1,0) [0|1] "" XXX + SG_ Motion_State : 171|2@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 180|1@0+ (1,0) [0|1] "" XXX + SG_ Longitudinal_Speed : 181|10@1+ (0.25,0) [0|255] "Unit_KilometerPerHour" XXX + SG_ Brake_Power_02 : 226|8@1+ (1,-100) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 236|9@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_1 : 248|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_Status : 317|3@1+ (1,0) [0|7] "" XXX + +BO_ 252 ESC_51: 64 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 14|6@1+ (1,0) [0|3] "" XXX + SG_ AEB_Breaking_01 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ AEB_Breaking_02 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Accelerator_Higher_Speed : 40|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressure : 42|9@1+ (0.195,0) [0|100] "Unit_Percent" XXX + SG_ NEW_SIGNAL_1 : 52|8@1+ (1,0) [0|15] "" XXX + SG_ HL_Radgeschw : 64|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ HR_Radgeschw : 80|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ VL_Radgeschw : 96|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ VR_Radgeschw : 112|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ NEW_SIGNAL_3 : 128|4@1+ (1,0) [0|15] "" XXX + SG_ HL_Brake_Pressure : 152|8@1+ (1,0) [0|100] "" XXX + SG_ HR_Brake_Pressure : 160|8@1+ (1,0) [0|100] "" XXX + SG_ VL_Brake_Pressure : 168|8@1+ (1,0) [0|100] "" XXX + SG_ VR_Brake_Pressure : 176|8@1+ (1,0) [0|100] "" XXX + SG_ Steering_Wheel_CW : 184|8@1+ (1.67,0) [0|255] "" XXX + SG_ Steering_Wheel_CCW : 192|8@1+ (1.67,0) [0|255] "" XXX + SG_ ESC_v_Signal : 328|13@1+ (0.052,-107.016) [0|63] "" XXX + SG_ NEW_SIGNAL_4 : 342|13@1+ (1,0) [0|3] "" XXX + +BO_ 219 AWV_03: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Unknown_01 : 12|3@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_63 : 18|6@1+ (1,0) [0|63] "" XXX + SG_ SET_ME_1_2 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_02 : 25|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_30 : 27|5@1+ (1,0) [0|15] "" XXX + SG_ SET_ME_127 : 33|7@1+ (1,0) [0|127] "" XXX + SG_ Unknown_03 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_127_2 : 41|7@1+ (1,0) [0|127] "" XXX + SG_ Pre_FCW : 64|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_63_2 : 66|6@1+ (1,0) [0|63] "" XXX + SG_ SET_ME_15_1 : 72|4@1+ (1,0) [0|15] "" XXX + SG_ FCW_Active : 76|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_255 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_1023 : 94|10@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_1 : 129|1@0+ (1,0) [0|1] "" XXX + +BO_ 267 Motor_51: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Accel_Pedal_Pressure : 12|9@1+ (0.4,0) [0|255] "" XXX + SG_ Accel_Low_Pressed_Support : 21|1@1+ (1,0) [0|7] "" XXX + SG_ TSK_Status : 88|3@1+ (1,0) [0|7] "" XXX + SG_ TSK_Limiter_ausgewaehlt : 95|1@1+ (1,0) [0|3] "" XXX + +BO_ 317 QFK_01: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ HCA_No_Override : 14|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LatCon_HCA_Accept : 17|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ LatCon_HCA_Status : 20|3@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_10 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 30|3@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 34|3@0+ (1,0) [0|1] "" XXX + SG_ Steering_Angle_VZ : 36|1@0+ (1,0) [0|1] "" XXX + SG_ Curvature : 40|15@1+ (6.7e-06,0) [0|65535] "" XXX + SG_ Curvature_VZ : 55|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 56|7@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_4 : 63|1@0+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 76|17@1+ (0.00906,0) [0|32767] "" XXX + +BO_ 389241616 MEB_Camera_09: 3 XXX + +BO_ 313 VMM_02: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ FCW_Reaction_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_1 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_Active : 31|1@0+ (1,0) [0|1] "" XXX + SG_ ESP_Hold : 35|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_3 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_Reaction_2 : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pressure : 76|11@1+ (1,0) [0|100] "" XXX + SG_ FCW_Reaction_3 : 88|5@1+ (1,0) [0|31] "" XXX + +BO_ 619 TA_01: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Travel_Assist_Status : 13|3@1+ (1,0) [0|3] "" XXX + SG_ Speed_Mode_01 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ Speed_Mode_02 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ Travel_Assist_Request : 19|3@1+ (1,0) [0|7] "" XXX + SG_ Init : 22|1@0+ (1,0) [0|1] "" XXX + SG_ Travel_Assist_Available : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Unknown_01 : 26|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_02 : 28|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_03 : 31|1@0+ (1,0) [0|1] "" XXX + SG_ Speed_Mode_Status : 32|3@1+ (1,0) [0|7] "" XXX + SG_ Lane_Unsure : 37|2@1+ (1,0) [0|3] "" XXX + +BO_ 333 ACC_18: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_limitierte_Anfahrdyn : 12|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_nachtr_Stopp_Anf : 13|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_DynErhoehung : 14|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_StartStopp_Info : 22|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Sollbeschleunigung_02 : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_neg_Sollbeschl_Grad_02 : 40|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_pos_Sollbeschl_Grad_02 : 48|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ : 58|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalteweg : 64|11@1+ (0.01,0) [0|2046] "" XXX + SG_ ACC_Anforderung_HMS : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SET_ME_0XFE : 80|8@1+ (1,0) [0|255] "" XXX + SG_ ACC_AKTIV_regelt : 90|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X1 : 92|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0x2FE : 98|10@1+ (1,0) [0|63] "" XXX + SG_ SET_ME_0X9 : 232|4@1+ (1,0) [0|15] "" XXX + SG_ Speed : 236|12@1+ (0.1,0) [0|15] "" XXX + SG_ Accel_Boost : 248|6@1+ (1,0) [0|3] "" XXX + SG_ Reversing : 254|1@0+ (1,0) [0|1] "" XXX + +VAL_ 258 Motion_State 1 "Forwards" 2 "Reversing" 3 "Stopped"; +VAL_ 258 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; +VAL_ 267 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault"; +VAL_ 317 LatCon_HCA_Status 0 "disabled" 1 "initializing" 2 "ready" 3 "fault" 4 "active" 5 "preempted" 6 "fault" 7 "rejected"; +VAL_ 333 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert"; +VAL_ 333 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 333 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler"; +VAL_ 333 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 333 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren"; +VAL_ 333 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht"; +VAL_ 333 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert"; +VAL_ 333 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; +VAL_ 333 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv"; +VAL_ 333 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 333 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe"; +VAL_ 333 Accel_Boost 3 "Driving" 0 "Stop" 2 "Driving" 1 "Driving"; +VAL_ 619 Travel_Assist_Status 4 "enabled" 0 "disabled" 2 "ready" 3 "pre_ready"; +VAL_ 619 Travel_Assist_Request 4 "enable" 3 "disable" 0 "no_request" 1 "error"; +VAL_ 619 Travel_Assist_Available 0 "not_available" 1 "available"; diff --git a/artifacts/package_runtime/iqdbc/dbc/vw_mlb.dbc b/artifacts/package_runtime/iqdbc/dbc/vw_mlb.dbc new file mode 100644 index 000000000..401a80f66 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/vw_mlb.dbc @@ -0,0 +1,2760 @@ +VERSION "HNNBNNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN/4/%%%/4/'%**4NNN///" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + +BS_: + +BU_: Airbag_D4 EPB_D4 ESP_D4 Gateway_D4C7 Getriebe_AL551_951_D4_C7 Getriebe_DL501_C7 Getriebe_VL381_C7 LWS_D4 Motor_EDC17_D4 Motor_ME17_BY Motor_MED17_SIMOS8_D4 Motor_Slave_D4 QSP_D4 SAK_C7 SCR_C7 SCU_D4 + +BO_ 265 ACC_01: 8 Gateway_B8 + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Magnetic_Ride_LB,Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Magnetic_Ride_LB,Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + SG_ ACC_Sollbeschleunigung : 24|11@1+ (0.005,-7.22) [-7.22|3.01] "Unit_MeterPerSeconSquar" Magnetic_Ride_LB,Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + SG_ ACC_neg_Sollbeschl_Grad : 40|8@1+ (0.05,0) [0|12.7] "Unit_MeterPerCubicSecon" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + SG_ ACC_pos_Sollbeschl_Grad : 48|8@1+ (0.05,0) [0|12.7] "Unit_MeterPerCubicSecon" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + SG_ ACC_Dynamik : 58|2@1+ (1,0) [0|3] "" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" Motor_MLB_AU48_AU416_Diesel,Motor_MLB_B8_Q5_Otto,Motor_MLB_Q5_Hybrid + +BO_ 780 ACC_02: 8 Gateway_D4C7 + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" HUD_C7,Kombi_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" HUD_C7,Kombi_D4 + SG_ ACC_Wunschgeschw_02 : 12|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" HUD_C7,Kombi_D4 + SG_ ACC_Status_Prim_Anz : 22|2@1+ (1.0,0.0) [0.0|3] "" HUD_C7,Kombi_D4 + SG_ ACC_Abstandsindex : 24|10@1+ (1,0) [1|1021] "" HUD_C7,Kombi_D4 + SG_ ACC_Akustik : 34|3@1+ (1.0,0.0) [0.0|7] "" Kombi_D4 + SG_ ACC_Gesetzte_Zeitluecke : 37|3@1+ (1.0,0.0) [0.0|7] "" Kombi_D4 + SG_ ACC_Optischer_Fahrerhinweis : 40|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4 + SG_ ACC_Typ_Tachokranz : 41|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4 + SG_ ACC_Anzeige_Zeitluecke : 42|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4 + SG_ ACC_Tachokranz : 43|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4 + SG_ ACC_Display_Prio : 44|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ ACC_Relevantes_Objekt : 46|2@1+ (1.0,0.0) [0.0|3] "" HUD_C7,Kombi_D4 + SG_ ACC_Texte_Primaeranz : 48|7@1+ (1.0,0.0) [0.0|127] "" HUD_C7,Kombi_D4 + SG_ ACC_Wunschgeschw_erreicht : 55|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4 + SG_ ACC_Status_Anzeige : 61|3@1+ (1.0,0.0) [0.0|7] "" APS_D4,Kombi_D4 + +BO_ 804 ACC_04: 8 Gateway_D4C7 + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" HUD_C7,Kombi_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" HUD_C7,Kombi_D4 + SG_ ACC_Texte_Zusatzanz : 16|6@1+ (1.0,0.0) [0.0|63] "" Kombi_D4 + SG_ ACC_Status_Zusatzanz : 22|5@1+ (1.0,0.0) [0.0|31] "" HUD_C7,Kombi_D4 + SG_ ACC_Texte : 27|5@1+ (1.0,0.0) [0.0|31] "" Kombi_D4 + SG_ ACC_Texte_braking_guard : 32|3@1+ (1.0,0.0) [0.0|7] "" HUD_C7,Kombi_D4 + SG_ ACC_Warnhinweis : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ACC_Geschw_Zielfahrzeug : 40|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" Vector__XXX + SG_ ACC_Charisma_FahrPr : 56|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ ACC_Charisma_Status : 59|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ ACC_Charisma_Umschaltung : 61|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + +BO_ 269 ACC_05: 8 Gateway_D4C7 + SG_ ACC_05_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ACC_Freigabe_Momentenanf : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ACC_Freigabe_Verzanf : 13|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ ACC_Getriebestellung_P : 14|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ ACC_limitierte_Anfahrdyn : 15|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ACC_Momentenanforderung : 16|10@1+ (1,0) [0|1021] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ACC_zul_Regelabw : 26|6@1+ (0.024,0) [0.000|1.512] "Unit_MeterPerSeconSquar" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ ACC_Verz_anf : 32|11@1+ (0.005,-7.22) [-7.220|3.015] "Unit_MeterPerSeconSquar" Vector__XXX + SG_ ACC_Loeseanforderung : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ACC_StartStopp_Info : 44|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ACC_Vorbefuellung_Bremsanlage : 47|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ACC_ax_Getriebe : 48|9@1+ (0.024,-2.016) [-2.016|10.248] "Unit_MeterPerSeconSquar" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ ACC_Status_ACC : 57|3@1+ (1.0,0.0) [0.0|7] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ACC_Betaetigung_EPB : 60|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ACC_Beeinflussung_ESP : 61|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ACC_Anhalten : 62|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ACC_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 279 ACC_10: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ AWV1_Anf_Prefill : 16|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_CM_Info : 17|1@1+ (1,0) [0|1] "" XXX + SG_ AWV2_Freigabe : 18|1@1+ (1,0) [0|1] "" XXX + SG_ AWV1_HBA_Param : 19|2@1+ (1,0) [0|3] "" XXX + SG_ AWV2_Ruckprofil : 21|3@1+ (1,0) [0|7] "" XXX + SG_ AWV2_Priowarnung : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_CM_Anforderung : 25|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Info_Teilbremsung : 26|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Notfallblinken : 27|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Teilbremsung_Freigabe : 28|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Zielbrems_Teilbrems_Verz_Anf : 29|10@1+ (0.024,-20.016) [-20.016|4.536] "Unit_MeterPerSeconSquar" XXX + SG_ ANB_Zielbremsung_Freigabe : 39|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_Vorstufe : 40|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_Halten : 41|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_CityANB_Auspraegung : 42|1@1+ (1,0) [0|1] "" XXX + SG_ PCF_Freigabe : 43|1@1+ (1,0) [0|1] "" XXX + SG_ AWV1_ECD_Anlauf : 44|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_AWA_VZ_Anf_Lenkmomoffset : 46|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ AWV_AWA_Anf_Lenkmomoffset : 47|9@1+ (0.01,0) [0.00|5.11] "Unit_NewtoMeter" XXX + SG_ PCF_Time_to_collision : 56|8@1+ (0.01,0) [0|2.5] "Unit_Secon" XXX + +BO_ 64 Airbag_01: 8 Airbag_D4 + SG_ Airbag_01_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Airbag_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ AB_RGS_Anst : 12|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7 + SG_ AB_Front_Crash : 16|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Heck_Crash : 17|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_SF_Crash : 18|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_SB_Crash : 19|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Rollover_Crash : 20|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Crash_Int : 21|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ AB_Lampe : 24|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Deaktiviert : 25|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_VB_deaktiviert : 26|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Systemfehler : 27|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Diagnose : 28|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Stellgliedtest : 29|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ AB_Erh_Auf_VB : 30|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Gurtwarn_VF : 32|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Gurtwarn_VB : 33|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Anzeige_Fussg : 34|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Texte_AKS : 36|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_PAO_Leuchte_Anf : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_MKB_gueltig : 39|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_MKB_Anforderung : 40|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_Versorgungsspannung : 41|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ AB_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 1312 Airbag_02: 8 Airbag_D4 + SG_ AB_Belegung_VB : 26|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Gurtschloss_FA : 40|2@1+ (1.0,0.0) [0.0|3] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ AB_Gurtschloss_BF : 42|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + +BO_ 1633 Anhaenger_01: 3 Gateway_D4C7 + SG_ AAG_BZ : 0|4@1+ (1,0) [0|15] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ AAG_Bremsl_durch_ECD : 5|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ AAG_Anhaenger_abgesteckt : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ AAG_NSL_aktiv : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ AAG_Anhaenger_erkannt : 8|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ AAG_Blinker_H_aktiv : 9|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ AAG_Blinker_HL_def : 10|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ AAG_Blinker_HR_def : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ AAG_Bremslicht_H_def : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ AAG_Schlusslicht_HL_def : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ AAG_Schlusslicht_HR_def : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ AAG_KD_Fehler : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ AAG_AVS_Fehler : 18|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ AAG_AVS_Stati : 20|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + +BO_ 777 BEM_01: 4 Gateway_D4C7 + SG_ BEM_01_CHK : 0|8@1+ (1,0) [0|255] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BEM_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BEM_Segel_Info : 12|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BEM_n_LLA : 24|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BEM_01_Abschaltstufen : 26|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ BEM_Anf_KL : 29|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BEM_StartStopp_Info : 30|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + +BO_ 867 Blinkmodi_01: 4 Gateway_D4C7 + SG_ BM_ZV_auf : 0|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_ZV_zu : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_DWA_ein : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_DWA_Alarm : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_Crash : 4|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_Panik : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_Not_Bremsung : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_GDO : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_links : 8|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_rechts : 9|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_Warnblinken : 10|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_Autobahn : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_Taxi_Notalarm : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_Telematik : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_HD_Oeffnung_angelernt : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_WBT_Beleuchtung : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ Blinken_li_Fzg_Takt : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ Blinken_re_Fzg_Takt : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ Blinken_li_Kombi_Takt : 18|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4 + SG_ Blinken_re_Kombi_Takt : 19|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4 + SG_ BM_NBA_n_codiert_n_aktiv : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BM_NBA_Status : 21|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ Blinken_FWB_aktiv : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 482 CCP_GE_CR0_01: 8 Gateway_D4C7 + SG_ CCP_GE_CRO_01_Data : 0|64@1+ (1,0) [0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + +BO_ 490 CCP_GE_DTO_01: 8 Getriebe_AL551_951_D4_C7 + SG_ CCP_GE_DTO_01_Data : 0|64@1+ (1,0) [0|1] "" Gateway_D4C7 + +BO_ 480 CCP_MO_CRO_01: 8 Gateway_D4C7 + SG_ CCP_MO_CRO_01_Data : 0|64@1+ (1,0) [0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + +BO_ 2616986624 CCP_MO_CRO_02: 8 Vector__XXX + SG_ CCP_MO_CRO_02_Data : 0|64@1+ (1,0) [0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + +BO_ 488 CCP_MO_DTO_01: 8 Motor_EDC17_D4 + SG_ CCP_MO_DTO_01_Data : 0|64@1+ (1,0) [0|1] "" Gateway_D4C7 + +BO_ 2616986625 CCP_MO_DTO_02: 8 Motor_EDC17_D4 + SG_ CCP_MO_DTO_02_Data : 0|64@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 481 CCP_MOS_CRO_01: 8 Gateway_D4C7 + SG_ CCP_MOS_CRO_01_Data : 0|64@1+ (1,0) [0|1] "" Motor_Slave_D4 + +BO_ 2616986629 CCP_MOS_CRO_02: 8 Vector__XXX + SG_ CCP_MOS_CRO_02_Data : 0|64@1+ (1,0) [0|1] "" Motor_Slave_D4 + +BO_ 489 CCP_MOS_DTO_01: 8 Motor_Slave_D4 + SG_ CCP_MOS_DTO_01_Data : 0|64@1+ (1,0) [0|1] "" Gateway_D4C7 + +BO_ 2616986630 CCP_MOS_DTO_02: 8 Motor_Slave_D4 + SG_ CCP_MOS_DTO_02_Data : 0|64@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2617042432 CCP_Soundaktor_CRO_01: 8 Vector__XXX + SG_ CCP_Soundaktor_CRO_01_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" SAK_C7 + +BO_ 2617042433 CCP_Soundaktor_DTO_01: 8 SAK_C7 + SG_ CCP_Soundaktor_DTO_01_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Vector__XXX + +BO_ 901 Charisma_01: 8 Gateway_D4C7 + SG_ CHA_01_CHK : 0|8@1+ (1,0) [0|255] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ CHA_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ CHA_Systemstatus : 12|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ CHA_Fahrer_Umschaltung : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_MO : 16|3@1+ (1.0,0.0) [0.0|7] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ CHA_Ziel_FahrPr_GE : 20|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ CHA_Ziel_FahrPr_ST : 24|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_SCU : 28|3@1+ (1.0,0.0) [0.0|7] "" SCU_D4 + SG_ CHA_Ziel_FahrPr_DR : 32|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_QS : 36|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_AFS : 40|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_RGS : 44|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_EPS : 48|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_ACC : 52|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_SAK : 56|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + +BO_ 2617027072 DEV_Airbag_01: 4 Airbag_D4 + SG_ DEV_Airbag_01 : 0|32@1+ (1.0,0.0) [0.0|4294967295] "" Vector__XXX + +BO_ 1714 Diagnose_01: 8 Gateway_D4C7 + SG_ DGN_Verlernzaehler : 0|8@1+ (1,0) [0|254] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,SAK_C7,SCR_C7,SCU_D4 + SG_ KBI_Kilometerstand : 8|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4 + SG_ UH_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4 + SG_ UH_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4 + SG_ UH_Tag : 39|5@1+ (1,0) [1|31] "Unit_Day" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4 + SG_ UH_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4 + SG_ UH_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4 + SG_ UH_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7,SCU_D4 + SG_ Kombi_02_alt : 62|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4 + SG_ Uhrzeit_01_alt : 63|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4 + +BO_ 1520 Dimmung_01: 5 Gateway_D4C7 + SG_ DI_KL_58d : 0|8@1+ (1,0) [0|253] "" Airbag_D4,Getriebe_AL551_951_D4_C7 + SG_ DI_KL_58s : 8|7@1+ (1,0) [0|100] "Unit_PerCent" Getriebe_AL551_951_D4_C7 + SG_ DI_KL_58st : 16|7@1+ (1,0) [0|100] "Unit_PerCent" Getriebe_AL551_951_D4_C7 + SG_ DI_Lichtsensorwert : 24|16@1+ (1,0) [0|65535] "" Airbag_D4,Getriebe_AL551_951_D4_C7 + +BO_ 1603 Einheiten_01: 3 Gateway_D4C7 + SG_ KBI_Einheit_Datum : 0|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ KBI_Einheit_Druck : 2|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ KBI_Einheit_Streckenanz : 4|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4 + SG_ KBI_MFA_v_Einheit_02 : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KBI_Einheit_Temp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KBI_Einheit_Verbrauch : 8|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ KBI_Einheit_Volumen : 10|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ KBI_Einheit_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 260 EPB_01: 8 EPB_D4 + SG_ EPB_01_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EPB_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EPB_QBit_Laengsbeschleunigung : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_QBit_Pedalweg_Kuppl : 13|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EPB_BCM2_Motor_Wakeup : 14|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_Freig_Verzoeg_Anf : 15|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EPB_Verzoeg_Anf : 16|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" Gateway_D4C7 + SG_ EPB_Laengsbeschleunigung : 24|8@1+ (1,-128) [-128|126] "Unit_PerCentOfForceOfGravi" Gateway_D4C7 + SG_ EPB_Pedalweg_Kuppl : 32|8@1+ (0.4,0) [8.0|92.0] "Unit_PerCent" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EPB_Anfahrwunsch_erkannt : 48|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_DAA_Randbed_erf : 49|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_Fehlerstatus : 50|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ EPB_Schalterposition : 52|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EPB_QBit_Schalterpos : 54|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EPB_Konsistenz_ACC : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_Spannkraft : 56|5@1+ (1,0) [0|29] "Unit_KiloNewto" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ EPB_Status : 61|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EPB_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 781 EPB_02: 4 EPB_D4 + SG_ EPB_Fehlerlampe_Gelb : 0|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_Fehlerlampe_BKL : 1|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_Funktionslampe : 2|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_Texte : 3|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7 + SG_ EPB_Akustik : 7|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_Autoholdlampe : 8|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ EPB_Bremsbelag_Warn : 9|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 256 ESP_01: 8 Gateway_D4C7 + SG_ ESP_01_CHK : 0|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ASR_Moment_langsam : 12|10@1+ (1,0) [0|1021] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ASR_MSR_Moment_schnell : 22|10@1+ (1,0) [0|1021] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0.00|655.32] "Unit_KiloMeterPerHour" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SAK_C7,SCR_C7 + SG_ ASR_Tastung_passiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Tastung_passiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Systemstatus : 50|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ASR_Schalteingriff : 51|2@1+ (1.0,0.0) [0.0|3] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ OBD_Schlechtweg : 53|1@1+ (1.0,0.0) [0.0|1] "" Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ OBD_QBit_Schlechtweg : 54|1@1+ (1.0,0.0) [0.0|1] "" Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_QBit_v_Signal : 55|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7 + SG_ ABS_Bremsung : 56|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ASR_Anf : 57|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ MSR_Anf : 58|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EBV_Eingriff : 59|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ EDS_Eingriff : 60|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Eingriff : 61|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_ASP : 62|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 257 ESP_02: 8 Gateway_D4C7 + SG_ ESP_02_CHK : 0|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_QBit_Gierrate : 12|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4 + SG_ ESP_QBit_Laengsbeschl : 13|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_QBit_Querb : 14|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Stillstandsflag : 15|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Querbeschleunigung : 16|8@1+ (0.01,-1.27) [-1.27|1.27] "Unit_ForceOfGravi" Airbag_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Laengsbeschl : 24|10@1+ (0.03125,-16) [-16.00000|15.90625] "Unit_MeterPerSeconSquar" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Verteil_Wankmom : 34|5@1+ (0.1,-1) [-1.0|1.0] "" Vector__XXX + SG_ ESP_QBit_Anf_Vert_Wank : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Gierrate : 40|14@1+ (0.01,0) [0.00|163.82] "Unit_DegreOfArcPerSecon" Airbag_D4 + SG_ ESP_VZ_Gierrate : 54|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4 + SG_ ESP_Notbremsanzeige : 55|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_SpannungsAnf : 56|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_PLA_Abbruch : 57|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ ESP_Status_ESP_PLA : 60|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + +BO_ 259 ESP_03: 8 Gateway_D4C7 + SG_ ESP_03_CHK : 0|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ ESP_VL_FR : 12|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ ESP_VR_FR : 13|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ ESP_HL_FR : 14|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ ESP_HR_FR : 15|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ ESP_VL_Radgeschw : 16|12@1+ (0.1,0) [0.0|409.2] "Unit_KiloMeterPerHour" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,SCU_D4 + SG_ ESP_VR_Radgeschw : 28|12@1+ (0.1,0) [0.0|409.2] "Unit_KiloMeterPerHour" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,SCU_D4 + SG_ ESP_HL_Radgeschw : 40|12@1+ (0.1,0) [0.0|409.2] "Unit_KiloMeterPerHour" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,SCU_D4 + SG_ ESP_HR_Radgeschw : 52|12@1+ (0.1,0) [0.0|409.2] "Unit_KiloMeterPerHour" Airbag_D4,EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,LWS_D4,SCU_D4 + +BO_ 776 ESP_04: 8 Gateway_D4C7 + SG_ ESP_Meldungen : 0|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ ESP_HDC_FktLampe : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Lampe : 4|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ABS_Lampe : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BK_Lampe : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Akustik : 7|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ ESP_Diagnose : 9|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4 + SG_ ESP_Textanzeigen_02 : 10|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX + SG_ ESP_Off_Lampe : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_m_Raddrehz : 16|15@1+ (0.002,0) [0.000|65.278] "Unit_Hertz" Vector__XXX + SG_ ESP_ASR_Lampe : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Wegimp_VA : 32|11@1+ (1,0) [0|2047] "" Vector__XXX + SG_ ESP_Fehlerstatus_Wegimp : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Wegimp_Ueberlauf : 44|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_QBit_Wegimp_VA : 45|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Displaywarnungen : 46|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ ESP_HDC_Regelgeschw : 48|7@1+ (0.32,0) [0.32|39.68] "Unit_KiloMeterPerHour" Vector__XXX + SG_ ESP_BKV_Warnung : 55|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Zaehnezahl : 56|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 262 ESP_05: 8 Gateway_D4C7 + SG_ ESP_05_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ ESP_QBit_Bremsdruck : 12|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_QBit_Fahrer_bremst : 13|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Schwelle_Unterdruck : 14|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ ESP_Bremsdruck : 16|10@1+ (0.3,-30) [-30.0|276.6] "Unit_Bar" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Fahrer_bremst : 26|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Verz_TSK_aktiv : 27|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Lenkeingriff_ADS : 28|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ ESP_Konsistenz_TSK : 29|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Bremsruck_AWV2 : 30|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Konsistenz_AWV2 : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ECD_Fehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ECD_nicht_verfuegbar : 33|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Status_Bremsentemp : 34|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Autohold_Standby : 35|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7 + SG_ ESP_HDC_Standby : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_HBA_aktiv : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Prefill_ausgeloest : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Rueckwaertsfahrt_erkannt : 39|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Status_Anfahrhilfe : 40|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_MED17_SIMOS8_D4 + SG_ ESP_HDC_aktiv : 41|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_StartStopp_Info : 42|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Eingr_HL : 44|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Eingr_HR : 45|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Eingr_VL : 46|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Eingr_VR : 47|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_BKV_Unterdruck : 48|8@1+ (4,0) [0|1012] "Unit_MilliBar" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Autohold_aktiv : 56|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_FStatus_Anfahrhilfe : 57|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Verz_EPB_aktiv : 58|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7 + SG_ ECD_Bremslicht : 59|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Verzoeg_EPB_verf : 60|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4 + SG_ ESP_Status_Bremsdruck : 61|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Anforderung_EPB : 62|2@1+ (1.0,0.0) [0.0|3] "" EPB_D4 + +BO_ 132 ESP_06: 8 ESP_D4 + SG_ ESP_06_CHK : 0|8@1+ (1,0) [0|255] "" SCU_D4 + SG_ ESP_06_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_D4,SCU_D4 + SG_ ESP_06_KD_Fehler : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ ESP_Teilsollwinkel : 16|11@1+ (0.1,0) [0.0|204.7] "Unit_DegreOfArc" SCU_D4 + SG_ ESP_VZ_Teilsollwinkel : 27|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4 + SG_ ESP_Winkeleingriff : 28|2@1+ (1.0,0.0) [0.0|3] "" SCU_D4 + SG_ ESP_Status_ADS : 30|2@1+ (1.0,0.0) [0.0|3] "" SCU_D4 + SG_ ESP_v_ref : 32|12@1+ (0.125,0) [0.000|511.500] "Unit_KiloMeterPerHour" Airbag_D4 + SG_ void_Byte_10 : 48|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ ESP_06_CRC : 56|8@1+ (1,0) [0|255] "" Airbag_D4,SCU_D4 + +BO_ 914 ESP_07_FR: 8 Gateway_D4C7 + SG_ ESP_07_CHK : 0|8@1+ (1,0) [0|255] "" LWS_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_07_BZ : 8|4@1+ (1,0) [0|15] "" LWS_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_ACC_LDE : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Quattro_Antrieb : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Codierung_ADS : 14|2@1+ (1.0,0.0) [0.0|3] "" LWS_D4 + SG_ ESP_RTA_HL : 16|8@1+ (0.048828125,-6.20117) [-6.201170000|6.152345625] "Unit_PerCent" Vector__XXX + SG_ ESP_RTA_HR : 24|8@1+ (0.048828125,-6.20117) [-6.201170000|6.152345625] "Unit_PerCent" Vector__XXX + SG_ ESP_RTA_VR : 32|8@1+ (0.048828125,-6.20117) [-6.201170000|6.152345625] "Unit_PerCent" Vector__XXX + SG_ OBD_Fehler_Radsensor_HL : 40|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ OBD_Fehler_Radsensor_HR : 44|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ OBD_Fehler_Radsensor_VL : 48|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ OBD_Fehler_Radsensor_VR : 52|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Qualifizierung_Antriebsart : 56|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Offroad_Modus : 57|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_MKB_ausloesbar : 58|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_MKB_Status : 59|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_CM_Variante : 60|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_OBD_Status : 61|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 286 ESP_08: 8 Vector__XXX + SG_ ESP_08_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ ESP_08_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ ESP_ANB_CM_Rueckk_Umsetz : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Konsistenz_ACC_Botschaft : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Stillstandsphase_erschoepft : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_ZT_Rueckk_Umsetz : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Tuerkontakt_Fahrertuer : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Abrutschen_Stillstand : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Fahrer_tritt_ZBR_Schw : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_QBit_v_ref : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_v_ref_Fahrtrichtung : 42|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESC_Bremsdruckgradient : 44|8@1+ (10,0) [0|2500] "Unit_BarPerSecon" Vector__XXX + SG_ ESP_v_ref : 52|12@1+ (0.125,0) [0|511.5] "Unit_KiloMeterPerHour" Vector__XXX + +BO_ 1623 ESP_17: 8 ESP_D4 + SG_ ESP_17_CRC : 0|8@1+ (1,0) [0|255] "" EPB_D4 + SG_ ESP_17_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4 + SG_ ESP_BremsenTemp_hinten : 12|3@1+ (1.0,0.0) [0.0|7] "" EPB_D4 + +BO_ 924 Gateway_05: 8 Gateway_D4C7 + SG_ BCM1_02_alt : 0|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Wischer_01_alt : 1|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Klima_02_alt : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_01_alt : 3|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_07_alt : 4|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ TSG_BT_1_alt : 5|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ TSG_HL_1_alt : 6|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ TSG_HR_1_alt : 7|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Motor_02_alt : 8|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ Klima_Sensor_02_alt : 9|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7 + SG_ TSG_FT_1_alt : 10|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Motor_05_alt : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ QSP_01_alt : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Parkhilfe_01_alt : 13|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Fahrwerk_02_alt : 14|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GW_05_va_27 : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_MH_WIV_Schalter : 16|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Wischer_vorne_aktiv : 17|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BCM1_Rueckfahrlicht_Schalter : 18|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ MO_Status_Normalbetrieb_01 : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KL_Zuheizer_Freigabe : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_Vorwaertsgang_eingelegt : 21|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4 + SG_ ESP_Codierung_ADS : 22|2@1+ (1.0,0.0) [0.0|3] "" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ QSP_StartStopp_Info : 24|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ FA_StartStopp_Info : 26|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ PH_StartStopp_Info : 28|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_Beschlagsgefahr : 30|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_GLW_Fernlicht_Anf : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_RFahrlicht_Fzg_Anf : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ FT_Tuer_geoeffnet : 33|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ MO_Handshake_STH : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ FT_Sperrklinke : 35|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BCM1_OBD_FStatus_ATemp : 36|4@1+ (1.0,0.0) [0.0|15] "" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7 + SG_ BCM1_Aussen_Temp_ungef : 40|8@1+ (0.5,-50) [-50.0|76.0] "Unit_DegreCelsi" Airbag_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7 + SG_ BCM1_Oeldruck_Schalter : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_Oeldruck_Schalter_2 : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BT_Tuer_geoeffnet : 50|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ HL_Tuer_geoeffnet : 51|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ HR_Tuer_geoeffnet : 52|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BCM1_Adaptive_Lichtvert_Anf : 53|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_Gleitende_Leuchtw_Anf : 54|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_Schalter_StartStopp : 55|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ESP_Offroad_Modus : 56|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ MO_Freig_Reku : 57|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + +BO_ 927 Gateway_06: 8 XXX + SG_ AB_Gurtschloss_FA : 30|2@1+ (1,0) [0|3] "" XXX + +BO_ 1604 Gateway_11: 8 Gateway_D4C7 + SG_ SMLS_01_alt : 0|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ HUD_01_alt : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_01_alt : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_02_alt : 3|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BCM2_02_alt : 4|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_VL381_C7 + SG_ HYB_Anf_E_Mode_alt : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_04_alt : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_04_alt : 7|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4 + SG_ GW_11_va_20 : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_11_va_21 : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_11_va_22 : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_11_va_23 : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_11_va_24 : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_11_va_25 : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_11_va_26 : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_11_va_27 : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Blinker_li : 16|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BH_Blinker_re : 17|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BM_Autobahn : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BH_Fernlicht : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BH_Lichthupe : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_MH_Schalter : 21|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ HYB_Anf_E_Mode : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ HUD_NV_in_Anzeige : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_Touristen_Licht_Anf : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LV_Abblendlicht_li_def : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LV_Abblendlicht_re_def : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LV_Abblendlicht_Anzeige : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LV_AFL_aktiv_Anzeige : 28|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_Licht_Dunkelheit_aktiv : 29|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LV_Nebelschlusslicht_Anzeige : 30|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM1_Linksverkehr : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ BCM2_P_verriegelt : 32|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_VL381_C7 + SG_ BCM1_LDS_Stellung : 33|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ BCM1_Allwetterlicht_Anf : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ HUD_Anzeigefehler_NV : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ ESP_Diagnose : 38|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4 + +BO_ 130 Getriebe_01: 8 Getriebe_AL551_951_D4_C7 + SG_ Getriebe_01_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Getriebe_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Schaltvorgang : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Status_Kupplung : 13|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Verbot_Ausblendung : 15|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_MMom_Soll : 16|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_MMom_Status : 26|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Freig_Mmom_Soll : 28|1@1+ (1,0) [0|1] "" Gateway_D4C7 + SG_ GE_Status_Schaltablauf : 29|3@1+ (1,0) [0|7] "" Gateway_D4C7 + SG_ GE_MMom_Vorhalt : 32|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Freig_MMom_Vorhalt : 42|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 131 Getriebe_02: 8 Getriebe_AL551_951_D4_C7 + SG_ Getriebe_02_CHK : 0|8@1+ (1,0) [0|255] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Getriebe_02_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Anf_Zylabsch : 13|2@1+ (1.0,0.0) [0.0|3] "" Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Synchro_Wunschdrehz : 15|9@1+ (25,0) [0|12750] "Unit_MinutInver" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Synchro_Zeit : 24|8@1+ (20,0) [0|5080] "Unit_MilliSecon" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Mom_Begr_Gradient : 32|8@1+ (10,0) [0|2540] "Unit_NewtoMeterPerSecon" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Anheb_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Vorsteuermoment : 48|9@1+ (1,0) [0|509] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Drehzahlmesser_Daempfung : 58|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Schubabschalt_Unt : 59|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Freigabe_Synchro : 60|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_HYB_DZ_Eingriff : 61|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + +BO_ 258 Getriebe_03: 8 Getriebe_AL551_951_D4_C7 + SG_ Getriebe_03_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Getriebe_03_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Freig_Langfr_Schutzmom : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Uefkt : 14|10@1+ (0.1,0) [0.0|102.2] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Zielgang : 24|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_StartStopp_Info : 28|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Langfr_Schutzmom : 32|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_reserv_Waehlhebel : 43|1@1+ (1,0) [0|1] "" Gateway_D4C7 + SG_ GE_Waehlhebel : 44|4@1+ (1.0,0.0) [0.0|15] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Eingangsdrehz : 48|14@1+ (1,0) [0|16381] "Unit_MinutInver" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Notlauf : 62|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Codierung_MSG : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 1089 Getriebe_04: 8 Getriebe_AL551_951_D4_C7 + SG_ GE_Index_Fahrwid : 0|8@1+ (0.249,-31.623) [-31.623|31.623] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Heizwunsch : 8|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_OBD_Status : 10|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_LFR_Adaption : 11|1@1+ (1,0) [0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_OBD_AbsperrVent : 12|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7 + SG_ GE_Grenzkriechmoment : 16|6@1+ (2,0) [0|122] "" Gateway_D4C7 + SG_ GE_Charisma_FahrPr : 24|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7 + SG_ GE_Charisma_Status : 27|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ GE_Charisma_Umschaltung : 29|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ GE_Freigabe_Verfallsinfo_WFS : 31|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Verlustmoment : 32|8@1+ (1,0) [0|254] "" EPB_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_amax_moeglich : 42|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ GE_Sumpftemperatur : 56|8@1+ (1,-58) [-58|196] "Unit_DegreCelsi" Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + +BO_ 294 HCA_01: 8 Frontsensorik + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HCA_01_Vib_Freq : 12|4@1+ (1,15) [15|30] "Unit_Hertz" Vector__XXX + SG_ HCA_01_LM_Offset : 16|9@1+ (1,0) [0|511] "Unit_centiNewtoMeter" Vector__XXX + SG_ EA_ACC_Sollstatus : 25|2@1+ (1,0) [0|3] "" Frontradar + SG_ EA_Ruckprofil : 27|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HCA_01_Sendestatus : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_LM_OffSign : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Status_HCA : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HCA_01_Vib_Amp : 36|4@1+ (0.2,0) [0|3] "Unit_NewtoMeter" Vector__XXX + SG_ EA_Ruckfreigabe : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EA_ACC_Wunschgeschwindigkeit : 41|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Frontradar + +BO_ 1811 ISO_ABS_Req: 8 Gateway_D4C7 + SG_ ISO_ABS_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" ESP_D4 + +BO_ 1917 ISO_ABS_Resp: 8 ESP_D4 + SG_ ISO_ABS_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1813 ISO_Airbag_01_Req: 8 Gateway_D4C7 + SG_ ISO_Airbag_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Airbag_D4 + +BO_ 1919 ISO_Airbag_01_Resp: 8 Airbag_D4 + SG_ ISO_Airbag_01_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1874 ISO_EPB_Req: 8 Gateway_D4C7 + SG_ ISO_EPB_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" EPB_D4 + +BO_ 1980 ISO_EPB_Resp: 8 EPB_D4 + SG_ ISO_EPB_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1795 ISO_Funktionaler_Req_Aggregate: 8 Gateway_D4C7 + SG_ ISO_Functionaler_Req_Aggregate : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + +BO_ 1792 ISO_Funktionaler_Req_All: 8 Gateway_D4C7 + SG_ ISO_ALL_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Airbag_D4,EPB_D4,ESP_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SAK_C7,SCR_C7 + +BO_ 2015 ISO_Funktionaler_Req_OBD: 8 Gateway_D4C7 + SG_ ISO_OBD_Funktionaler_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + +BO_ 2017 ISO_Getriebe_01_Req: 8 Gateway_D4C7 + SG_ ISO_Getriebe_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + +BO_ 2025 ISO_Getriebe_01_Resp: 8 Getriebe_AL551_951_D4_C7 + SG_ ISO_Getriebe_01_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 2016 ISO_MO_01_Req: 8 Gateway_D4C7 + SG_ ISO_MO_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + +BO_ 2024 ISO_MO_01_Resp: 8 Motor_EDC17_D4 + SG_ ISO_MO_01_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 2018 ISO_MOS_01_Req: 8 Gateway_D4C7 + SG_ ISO_MOS_01_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Motor_Slave_D4 + +BO_ 2026 ISO_MOS_01_Resp: 8 Motor_Slave_D4 + SG_ ISO_MOS_01_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 2019 ISO_OBD_reserv5_Req: 8 Gateway_D4C7 + SG_ ISO_OBD_reserv5_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Vector__XXX + +BO_ 2027 ISO_OBD_reserv5_Resp: 8 Vector__XXX + SG_ ISO_OBD_reserv5_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1834 ISO_SCR_Req: 8 Gateway_D4C7 + SG_ ISO_SCR_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" SCR_C7 + +BO_ 1940 ISO_SCR_Resp: 8 SCR_C7 + SG_ ISO_SCR_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1814 ISO_SCU_Req: 8 Gateway_D4C7 + SG_ ISO_SCU_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Vector__XXX + +BO_ 1920 ISO_SCU_Resp: 8 Vector__XXX + SG_ ISO_SCU_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1820 ISO_Soundaktor_Req: 8 Gateway_D4C7 + SG_ ISO_Soundaktor_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" SAK_C7 + +BO_ 1926 ISO_Soundaktor_Resp: 8 SAK_C7 + SG_ ISO_Soundaktor_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1875 ISO_Waehlhebel_Req: 8 Gateway_D4C7 + SG_ ISO_Waehlhebel_Req_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Getriebe_AL551_951_D4_C7 + +BO_ 1981 ISO_Waehlhebel_Resp: 8 Getriebe_AL551_951_D4_C7 + SG_ ISO_Waehlhebel_Resp_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1424 Kessy_02: 8 Gateway_D4C7 + SG_ KY_Funkschl_Nr : 0|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + SG_ KY_ID_Geb_autorisiert : 4|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_ID_Geb_steckt : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_FFB_Frequenz : 6|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ KY_HF_Aktiv : 8|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_LF_Aktiv : 9|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_ELV_verr : 10|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4 + SG_ KY_ELV_entr : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_ELV_enable_Anforderung : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_Valet_Parking : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_Keyless_Verbau : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_FBS_Fahrer_Hinweise : 16|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ FBS_Warn_Lenkung_def : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ FBS_Warn_LenkVerriegelung_def : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ FBS_Warn_Schluessel_Batt : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ FBS_Prio_Warn_04 : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ FBS_Prio_Warn_05 : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_KYL_Fahrer_Hinweise : 24|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ KYL_Warn_kein_Schluessel : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KYL_Warn_Kessy_defekt : 28|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_KYL_Prio_Warn_03 : 29|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_KYL_Prio_Warn_04 : 30|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_KYL_Prio_Warn_05 : 31|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_Schluessel_Soll : 32|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + SG_ KY_Schluessel_Ist : 36|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + SG_ KY_WFS_Safe : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KY_WFS_LZ : 41|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ KY_StartStopp_Info : 43|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KYL_Notzuendschloss : 45|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KYL_Warn_Notzuendschloss : 46|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ FBS_KD_Fehler : 47|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 960 Klemmen_Status_01: 4 Gateway_D4C7 + SG_ Klemmen_Status_01_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ Klemmen_Status_01_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ ZV_verriegelt_extern_soll_02 : 12|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ ZAS_Kl_S : 16|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7 + SG_ ZAS_Kl_15 : 17|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCU_D4 + SG_ ZAS_Kl_X : 18|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,SCU_D4 + SG_ ZAS_Kl_50 : 19|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + +BO_ 959 Klima_01: 8 Gateway_D4C7 + SG_ KL_Drehz_Anh : 0|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_Handshake_BEM : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KL_Komp_Moment_alt : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KL_Vorwarn_HHS_ein : 4|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_Vorwarn_HFS_ein : 5|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KL_KD_Fehler : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KL_Comp_rev_rq : 8|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX + SG_ KL_Charisma_FahrPr : 16|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ KL_Charisma_Status : 19|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ KL_Charisma_Umschaltung : 21|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0.00|63.50] "Unit_NewtoMeter" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_Leistung_Hzg_Soll : 32|8@1+ (11,0) [0|2805] "Unit_Watt" Vector__XXX + SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0.0|101.6] "Unit_PerCent" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_4_Zonen : 48|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_AC_Schalter : 49|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KL_Zustand : 50|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_Thermomanagement : 51|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_Comp_enable : 53|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KL_StartStopp_Info : 54|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KL_el_Zuheizer_Stufe : 56|3@1+ (1.0,0.0) [0.0|7] "" Motor_EDC17_D4 + SG_ KL_Diag_Absperrvent : 59|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + +BO_ 779 Kombi_01: 8 Gateway_D4C7 + SG_ KBI_ABS_Lampe : 0|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_ESP_Lampe : 1|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_BKL_Lampe : 2|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Airbag_Lampe : 3|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_SILA_gueltig : 4|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Lenkung_Lampe : 5|1@1+ (1,0) [0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Vorglueh_System_Lampe : 6|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4 + SG_ KBI_NV_in_Anzeige : 7|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ XCOUNTER : 8|4@1+ (1,0) [0|15] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Anzeigestatus_ACC : 12|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Oeldruck_Schalter : 15|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Tankwarnung : 16|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KBI_MFA_v_Einheit_01 : 17|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KBI_im_Stellgliedtest : 18|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Anzeigefehler_LDW : 19|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Variante_USA : 21|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Oeldruckwarnung : 22|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Handbremse : 23|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_V_Digital : 24|9@1+ (1,0) [0|511] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_PLA_in_Anzeige : 33|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Anzeigefehler_NV : 34|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_angez_Geschw : 48|10@1+ (0.32,0) [0.00|325.12] "Unit_KiloMeterPerHour" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KBI_Einheit_Tacho : 58|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KBI_Konsistenz_ACC : 59|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Fehler_Anzeige_ACC : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_Anzeigefehler_SWA : 61|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7 + SG_ KBI_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + +BO_ 1719 Kombi_02: 8 Gateway_D4C7 + SG_ KBI_Kilometerstand : 0|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Vector__XXX + SG_ KBI_Standzeit : 20|15@1+ (4,0) [0|131068] "Unit_Secon" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KBI_Reset_Standzeit : 35|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KBI_Inhalt_Tank : 40|7@1+ (1,0) [0|126] "Unit_Liter" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KBI_FStatus_Tank : 47|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ KBI_QBit_Aussen_Temp_gef : 55|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7 + SG_ KBI_Aussen_Temp_gef : 56|8@1+ (0.5,-50) [-50.0|75.0] "Unit_DegreCelsi" EPB_D4,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,SCR_C7 + +BO_ 1720 Kombi_03: 8 Gateway_D4C7 + SG_ KBI_Reifenumfang : 0|12@1+ (1,0) [0|4095] "Unit_MilliMeter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ WFS_Schluessel_Fahrberecht : 12|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + SG_ KBI_BCmE_aktiv : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ KBI_Sparhinweis_quittiert : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 517 KS_Airbag: 8 Airbag_D4 + SG_ KS_Airbag_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 640 KS_Master: 8 Gateway_D4C7 + SG_ KS_Master_Data : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Airbag_D4 + +BO_ 919 LDW_02: 8 Gateway_D4C7 + SG_ LDW_Gong : 12|2@1+ (1.0,0.0) [0.0|3] "" Kombi_D4 + SG_ LDW_SW_Warnung_links : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LDW_SW_Warnung_rechts : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LDW_Texte : 16|4@1+ (1.0,0.0) [0.0|15] "" Kombi_D4 + SG_ LDW_Seite_DLCTLC : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LDW_Lernmodus : 21|3@1+ (1.0,0.0) [0.0|7] "" HUD_C7 + SG_ LDW_Anlaufsp_VLR : 24|4@1+ (1,0) [0|15] "" SMLS_D4 + SG_ LDW_Vib_Amp_VLR : 28|4@1+ (1,0) [0|15] "" SMLS_D4 + SG_ LDW_Anlaufzeit_VLR : 32|4@1+ (1,0) [0|15] "" SMLS_D4 + SG_ LDW_Lernmodus_rechts : 36|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Lernmodus_links : 38|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_DLC : 40|8@1+ (0.01,-1.25) [-1.25|1.25] "Unit_Meter" Vector__XXX + SG_ LDW_TLC : 48|5@1+ (0.1,0) [0.0|3.0] "Unit_Secon" Vector__XXX + SG_ LDW_Warnung_links : 56|1@1+ (1.0,0.0) [0.0|1] "" SMLS_D4 + SG_ LDW_Warnung_rechts : 57|1@1+ (1.0,0.0) [0.0|1] "" SMLS_D4 + SG_ LDW_Codierinfo_fuer_VLR : 58|2@1+ (1.0,0.0) [0.0|3] "" SMLS_D4 + SG_ LDW_Frontscheibenheizung_aktiv : 60|1@1+ (1.0,0.0) [0.0|1] "" Klima_D4_C7,SMLS_D4 + SG_ LDW_Status_LED_gelb : 61|1@1+ (1.0,0.0) [0.0|1] "" APS_D4,Kombi_D4 + SG_ LDW_Status_LED_gruen : 62|1@1+ (1.0,0.0) [0.0|1] "" APS_D4,Kombi_D4 + SG_ LDW_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 810 LH_EPS_01: 8 Gateway_D4C7 + SG_ EPS_01_CRC : 0|8@1+ (1,0) [0|255] "" APS_D4 + SG_ EPS_01_BZ : 8|4@1+ (1,0) [0|15] "" APS_D4 + SG_ EPS_Akustiksignal : 16|1@1+ (1.0,0.0) [0.0|1] "" Kombi_D4 + SG_ EPS_Fehlerlampe : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ EPS_KD_Fehler : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ EPS_Warnungen : 19|3@1+ (1.0,0.0) [0.0|7] "" Kombi_D4 + SG_ EPS_PLA_Fehler : 26|4@1+ (1,0) [0|15] "" APS_D4 + SG_ EPS_Charisma_FahrPr : 34|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ EPS_Charisma_Status : 37|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ EPS_Charisma_Umschaltung : 39|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ EPS_Lenkerposition : 41|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ EPS_Anf_KL : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 285 LH_EPS_02: 8 Gateway_D4C7 + SG_ EPS_02_CRC : 0|8@1+ (1,0) [0|255] "" SCU_D4 + SG_ EPS_02_BZ : 8|4@1+ (1,0) [0|15] "" SCU_D4 + SG_ EPS_Notlauf : 12|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + SG_ EPS_Lastinfo : 16|8@1+ (1,0) [0|253] "Unit_Amper" Vector__XXX + SG_ EPS_Unterstuetzungsleistung : 24|8@1+ (0.5,0) [0.0|100.0] "Unit_PerCent" SCU_D4 + SG_ EPS_Drehzahlreserve : 32|7@1+ (10,0) [0|1000] "Unit_DegreOfArcPerSecon" SCU_D4 + SG_ EPS_VZ_Drehzahlreserve : 39|1@1+ (1.0,0.0) [0.0|1] "" SCU_D4 + SG_ EPS_Leistungsanforderung : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 159 LH_EPS_03: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_DSR_Status : 12|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Berechneter_LW : 16|12@1+ (0.15,0) [0|613.95] "Unit_DegreOfArc" XXX + SG_ EPS_BLW_QBit : 30|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_BLW : 31|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_HCA_Status : 32|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Lenkmoment : 40|10@1+ (1,0) [0|8] "Unit_centiNewtoMeter" XXX + SG_ EPS_Lenkmoment_QBit : 54|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_Lenkmoment : 55|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_Lenkungstyp : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 1137 Licht_hinten_01: 8 Gateway_D4C7 + SG_ Licht_hinten_01_BZ : 0|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LH_Aussenlicht_def : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Blinker_HL_akt : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Blinker_HR_akt : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Blinker_li_def : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Bremsl_li_def : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Schlusslicht_li_def : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Rueckf_li_def : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Nebel_li_def : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Brems_Blk_li_def : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Blinker_re_def : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Bremsl_re_def : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Schlusslicht_re_def : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Rueckf_re_def : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Nebel_re_def : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Brems_Blk_re_def : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Kennzl_def : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_3_Bremsl_def : 49|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LH_Nebel_mi_def : 50|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Rueckf_mi_def : 51|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + +BO_ 267 LS_01: 4 Gateway_D4C7 + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Hauptschalter : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Abbrechen : 13|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Typ_Hauptschalter : 14|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Limiter : 15|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Tip_Setzen : 16|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Tip_Hoch : 17|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Tip_Runter : 18|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Tip_Wiederaufnahme : 19|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_DL501_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Verstellung_Zeitluecke : 20|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ MFL_Tip_Down : 22|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MFL_Tip_Up : 23|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ LS_Tiptronic_Fehler : 24|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7 + SG_ LS_Fehler : 25|1@1+ (1,0) [0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Codierung : 26|3@1+ (1.0,0.0) [0.0|7] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_Tip_Stufe_2 : 29|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ LS_GRA_ACC_2stufig : 30|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ MFL_M_Taste : 31|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + +BO_ 134 LWI_01: 8 LWS_D4 + SG_ LWI_01_CHK : 0|8@1+ (1,0) [0|255] "" ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_D4,ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4 + SG_ LWI_Sensorstatus : 12|1@1+ (1.0,0.0) [0.0|1] "" ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4 + SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1.0,0.0) [0.0|1] "" ESP_D4,Gateway_D4C7,QSP_D4,SCU_D4 + SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4 + SG_ LWI_Lenkradwinkel : 16|13@1+ (0.1,0) [0.0|800.0] "Unit_DegreOfArc" Airbag_D4,ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4 + SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,ESP_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4,SCU_D4 + SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,QSP_D4 + SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" Gateway_D4C7,QSP_D4 + SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" ESP_D4,Gateway_D4C7,QSP_D4,SCU_D4 + SG_ LWI_01_CRC : 56|8@1+ (1,0) [0|255] "" Airbag_D4,ESP_D4,Gateway_D4C7,QSP_D4,SCU_D4 + +BO_ 128 Motor_01: 8 Motor_EDC17_D4 + SG_ Motor_01_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ Motor_01_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Mom_o_ex : 12|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Mom_m_ex : 22|10@1+ (1,0) [0|1021] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SAK_C7 + SG_ MO_Mom_Verlust : 32|10@1+ (1,0) [0|1021] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SAK_C7 + SG_ MO_Mom_Begrenzung : 42|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Mom_Fahrerwunsch : 52|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Kickdown : 62|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 129 Motor_02: 8 Motor_EDC17_D4 + SG_ Motor_02_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCU_D4 + SG_ Motor_02_BZ : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCU_D4 + SG_ MO_Mom_ZWR : 12|10@1+ (1,0) [0|1021] "" Gateway_D4C7 + SG_ MO_Mom_Soll : 22|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Mom_Ist : 32|10@1+ (1,0) [0|1021] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Status_Zylabschalt_01 : 42|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7 + SG_ MO_Status_Normalbetrieb_01 : 43|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_StartStopp_Status : 44|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4 + SG_ MO_StartStopp_Motorstopp : 46|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4 + SG_ MO_StartStopp_Wiederstart : 47|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7,SCU_D4 + SG_ MO_Ext_E_Fahrt_aktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Gangposition : 49|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7 + SG_ MO_StartStopp_Fahrerwunsch : 53|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Momentenintegral : 56|8@1+ (0.3921,0) [0.0000|99.9855] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + +BO_ 261 Motor_03: 8 Motor_EDC17_D4 + SG_ MOTOR_03_CHK : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCU_D4 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCU_D4 + SG_ MO_QBit_Fahrpedalwerte_01 : 12|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_QBit_Motormomente : 13|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_QBit_Fahrer_bremst : 14|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_QBit_Drehzahl_01 : 15|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7 + SG_ MO_Drehzahl_01 : 16|16@1+ (0.25,0) [0.00|16383.00] "Unit_MinutInver" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SAK_C7,SCR_C7,SCU_D4 + SG_ MO_Moment_im_Leerlauf : 32|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Interlock : 33|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7 + SG_ MO_BLS : 34|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Fahrer_bremst : 35|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Konsistenz_Bremsped : 36|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Kuppl_schalter : 37|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7 + SG_ MO_Timeout_ESP : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Motor_laeuft : 39|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Fahrpedalrohwert_01 : 48|8@1+ (0.4,0) [0.0|101.6] "Unit_PerCent" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_erste_Ungenauschwelle : 56|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_QBit_Stressfaktor : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Stressfaktor : 58|6@1+ (1.6,0) [0.0|100.8] "Unit_PerCent" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + +BO_ 263 Motor_04: 8 Motor_EDC17_D4 + SG_ MO_Istgang : 8|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7 + SG_ MO_Sollgang : 12|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7 + SG_ MO_Oeldruck : 16|8@1+ (0.04,0) [0.00|10.00] "Unit_Bar" Gateway_D4C7 + SG_ MO_Anzeigedrehz : 24|12@1+ (3,0) [0|12282] "Unit_MinutInver" Gateway_D4C7 + SG_ MO_Schaltempf_verfbar : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Ladedruck : 39|9@1+ (0.01,0) [0.00|5.10] "Unit_Bar" Gateway_D4C7 + SG_ MO_KVS : 48|15@1+ (1,0) [0|32767] "Unit_MicroLiter" Gateway_D4C7 + SG_ MO_KVS_Ueberlauf : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 782 Motor_05: 8 Motor_EDC17_D4 + SG_ Motor_05_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ Motor_05_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_EKlKomLeiRed : 12|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Freig_Reku : 14|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Klima_Eingr : 16|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Status_Normalbetrieb_02 : 18|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Schaltbeeinfl_Leistungsbegr : 19|1@1+ (1,0) [0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7 + SG_ MO_Schaltbeeinfl_Partikelfilter : 20|1@1+ (1,0) [0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7 + SG_ MO_Prio_MIN_Wunschdrehzahl : 21|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Freig_Anlass : 22|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Aussp_Anlass : 23|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_MAX_Wunschdrehzahl : 24|9@1+ (25,0) [0|12750] "Unit_MinutInver" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Prio_MAX_Wunschdrehzahl : 33|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Luftpfad_aktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7 + SG_ MO_v_Begrenz_Aktiv : 35|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_v_Begrenz_Aktivierbar : 36|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Verbot_EKP : 37|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Anf_Pruefimpuls : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Anf_KL75 : 39|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Charisma_FahrPr : 40|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7 + SG_ MO_Charisma_Status : 43|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Charisma_Umschaltung : 45|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Handshake_STH : 47|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_MIN_Wunschdrehzahl : 48|8@1+ (25,0) [0|6350] "Unit_MinutInver" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Drehzahlbeeinflussung : 56|8@1+ (0.39,0) [0.00|99.45] "Unit_PerCent" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + +BO_ 1088 Motor_06: 8 Motor_EDC17_D4 + SG_ MO_Kuehlerluefter_MUX M : 0|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Kuehlerluefter_1 m0 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_D4C7 + SG_ MO_Kuehlerluefter_2 m1 : 1|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_D4C7 + SG_ MO_HYB_Status_HV_Ladung : 8|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7 + SG_ WIV_Anzeige_aktiv : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Oelmin_Warn : 13|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Sensorfehler : 14|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Schieflage : 15|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0.0|100.0] "Unit_PerCent" Gateway_D4C7 + SG_ MO_Zustand_HWP : 20|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_nicht_betriebswarm : 25|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_laufender_Motor : 27|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_HYB_Text_1 : 28|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_HYB_Text_2 : 29|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_HYB_Text_3 : 30|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Text_Motorstart : 32|4@1+ (1.0,0.0) [0.0|15] "" Gateway_D4C7 + SG_ MO_HYB_Text_5 : 36|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_HYB_Text_6 : 37|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_HYB_Text_7 : 38|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Oeldyn_avl : 39|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Text_MSG_Werkstatt : 40|1@1+ (1,0) [0|1] "" Gateway_D4C7 + SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Gateway_D4C7 + SG_ MO_Text_Fehler_Kraftstoffsys : 42|1@1+ (1,0) [0|1] "" Gateway_D4C7 + SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Gateway_D4C7 + SG_ MO_Systemlampe : 48|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_OBD2_Lampe : 49|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Heissleuchte : 50|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Partikel_Lampe : 51|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Winterfahrprog : 52|1@1+ (1,0) [0|1] "" Gateway_D4C7 + SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Unterfuell_Warn : 56|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Enable_Oeldr_Motor : 59|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Avus_Motorschutz : 61|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_HYB_Fahrbereitschaft : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 1600 Motor_07: 8 Motor_EDC17_D4 + SG_ MO_QBit_Ansaugluft_Temp : 0|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_QBit_Oel_Temp : 1|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7 + SG_ MO_QBit_Kuehlmittel_Temp : 2|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Stellgliedtest_Soundaktuator : 3|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_HYB_Fehler_HV_Netz : 4|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_aktives_Getriebeheizen : 5|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Absperrventil_oeffnen : 6|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Ansaugluft_Temp : 8|8@1+ (0.75,-48) [-48.00|141.75] "Unit_DegreCelsi" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Oel_Temp : 16|8@1+ (1,-60) [-60|192] "Unit_DegreCelsi" Gateway_D4C7,Getriebe_AL551_951_D4_C7 + SG_ MO_Kuehlmittel_Temp : 24|8@1+ (0.75,-48) [-48.00|141.75] "Unit_DegreCelsi" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Hoeheninfo : 32|8@1+ (0.00781,0) [0.00000|1.98374] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Kennfeldk : 40|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Versionsinfo : 41|6@1+ (1.0,0.0) [0.0|63] "" Gateway_D4C7 + SG_ MO_Getriebe_kuehlen : 47|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Mom_Traegheit_02 : 48|5@1+ (0.01,0) [0.00|0.31] "Unit_KiloGramMeterSquar" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Heizungspumpenansteuerung : 53|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_D4C7 + SG_ MO_SpannungsAnf : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Nachlaufzeit_Heizungspumpe : 58|6@1+ (15,0) [0|945] "Unit_Secon" Gateway_D4C7 + +BO_ 1607 Motor_09: 8 Motor_EDC17_D4 + SG_ MO_ITM_Kuehlmittel_Temp : 0|8@1+ (0.75,-48) [-45.75|143.25] "Unit_DegreCelsi" Gateway_D4C7 + SG_ MO_E85_Sensor : 8|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_D4C7 + SG_ SCR_Anz_Motorstarts : 12|4@1+ (1,0) [0|8] "" Gateway_D4C7 + SG_ SCR_Reichweite : 16|15@1+ (1,0) [0|32766] "" Gateway_D4C7 + SG_ SCR_Warnstufe_1 : 32|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ SCR_Warnstufe_2 : 33|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ SCR_Text : 34|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7 + SG_ SCR_Akustik : 37|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Kraftstofffilter_Wasser : 40|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ SCR_Systemfehler : 41|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ SCR_Inducement_Strategie : 42|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_CO2_Faktor : 44|12@1+ (1,0) [1|4094] "Unit_GramPerLiter" Gateway_D4C7 + SG_ MO_MKB_MUX M : 56|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_MKB_01 m0 : 59|5@1+ (1.0,0.0) [0.0|31] "" Gateway_D4C7 + SG_ MO_MKB_02 m1 : 59|5@1+ (1.0,0.0) [0.0|31] "" Gateway_D4C7 + SG_ MO_MKB_03 m2 : 59|5@1+ (1.0,0.0) [0.0|31] "" Gateway_D4C7 + SG_ MO_MKB_04 m3 : 59|5@1+ (1.0,0.0) [0.0|31] "" Gateway_D4C7 + +BO_ 276 Motor_10: 8 Motor_EDC17_D4 + SG_ Motor_10_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7 + SG_ Motor_10_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7 + SG_ MO_Sig_Fahrpedalgradient : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_BKV_Unterdruckwarnung : 13|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Zylinderabschaltung : 14|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7 + SG_ MO_Fahrpedalgradient : 16|8@1+ (25,0) [0|6350] "Unit_PerCentPerSecon" Gateway_D4C7 + SG_ MO_Schubabschaltung : 24|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_rel_Saugrohrdruck : 25|6@1+ (18,0) [0|1116] "Unit_MilliBar" Gateway_D4C7 + SG_ MO_rel_Saugrohrdruck_gem_err : 31|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_BKV_Unterdruck : 32|8@1+ (4,0) [0|1012] "Unit_MilliBar" Gateway_D4C7 + +BO_ 1648 Motor_18: 8 Motor_EDC17_D4 + SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7 + SG_ MO_Zylabsch_Texte : 50|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_E85_BS_Texte : 52|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7 + SG_ MO_Drehzahl_Warnung : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Gateway_D4C7 + +BO_ 1010 Motor_19: 8 Motor_EDC17_D4 + SG_ Motor_19_BZ : 8|4@1+ (1,0) [0|15] "" SCR_C7 + SG_ MO_SCR_Tankheizung : 43|1@1+ (1.0,0.0) [0.0|1] "" SCR_C7 + SG_ MO_SCR_Dosierpumpe_Zustand : 44|3@1+ (1.0,0.0) [0.0|7] "" SCR_C7 + SG_ MO_SCR_Leitungsheizung : 47|1@1+ (1.0,0.0) [0.0|1] "" SCR_C7 + SG_ MO_SCR_Dosierpumpe_Wartezeit : 48|7@1+ (1,0) [0|120] "Unit_Secon" SCR_C7 + SG_ MO_SCR_Transferpumpe : 55|1@1+ (1.0,0.0) [0.0|1] "" SCR_C7 + SG_ MO_SCR_Dosierpumpe_Soll : 56|8@1+ (0.4,0) [0.0|100.0] "Unit_PerCent" SCR_C7 + +BO_ 1601 Motor_Code_01: 8 Motor_EDC17_D4 + SG_ Motor_Code_01_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ Motor_Code_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Faktor_Momente : 12|2@1+ (1.0,0.0) [0.0|3] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_Hybridfahrzeug : 14|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ MO_Code : 16|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SAK_C7 + SG_ MO_Getriebe_Code : 24|6@1+ (1.0,0.0) [0.0|63] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ MO_StartStopp_Codiert : 30|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ MO_Anzahl_Zyl : 32|4@1+ (1,0) [0|15] "" Gateway_D4C7 + SG_ MO_Kraftstoffart : 36|4@1+ (1.0,0.0) [0.0|15] "" EPB_D4,Gateway_D4C7 + SG_ MO_Hubraum : 40|7@1+ (0.1,0) [0.0|12.7] "Unit_Liter" Gateway_D4C7 + SG_ MO_Ansaugsystem : 47|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7 + SG_ MO_Leistung : 48|9@1+ (1,0) [0|511] "Unit_KiloWatt" Gateway_D4C7 + SG_ MO_Abgastyp : 57|6@1+ (1.0,0.0) [0.0|63] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7 + SG_ MO_Einspritzart : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 969 MotorSlave_01: 1 Motor_Slave_D4 + SG_ MOS_KD_Fehler : 0|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 1696 NightVision_01: 8 Gateway_D4C7 + SG_ NV_aktiv : 12|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4 + SG_ NV_Texte : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ NV_Gong : 16|2@1+ (1.0,0.0) [0.0|3] "" Airbag_D4 + SG_ NV_Symbol : 18|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4 + SG_ NV_Hinweise : 19|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ NV_Piktogramm_aktiv : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NV_Akustik_deaktiviert_Icon : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NV_FGM_deaktiviert_Icon : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NV_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 1753 NMH_EPB: 7 EPB_D4 + SG_ NMH_EPB_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_EPB_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX + SG_ NMH_EPB_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ NMH_EPB_NM_aktiv_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_NM_aktiv_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_NM_aktiv_Start : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_NM_aktiv_Schalter : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_NM_aktiv_Bedarf_Anzeige : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_NM_aktiv_v_groesser_Null : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_kein_NL : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_NL_Temp_Modell : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_NL_Min : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_NL_AutoAdjust : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NM_EPB_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Eindraht_Fehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_EPB_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 1728 NMH_Gateway: 7 Gateway_D4C7 + SG_ NMH_GW_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_GW_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_GW_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_GW_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_GW_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX + SG_ NMH_GW_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ NMH_GW_NM_aktiv_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_NM_aktiv_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_NM_aktiv_Start : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_NM_aktiv_BDM : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_NM_aktiv_Warnblinken : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_NM_aktiv_ESP : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_Abschaltstufe_3 : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_SG_Fehlerdauer : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_STH_Wakeup : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_NL_Diagnose : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NM_GW_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_Eindraht_Fehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_ACAN : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_KombiCAN : 41|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_KomfortCAN : 42|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_Infotainment : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_Fahrwerk : 44|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GW_WakeUp_CAN_Bus : 45|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + +BO_ 1730 NMH_Getriebe: 7 Getriebe_AL551_951_D4_C7 + SG_ NMH_GE_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_GE_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX + SG_ NMH_GE_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ NMH_GE_NM_aktiv_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_NM_aktiv_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_NM_aktiv_Start : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_N_Haltephase : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_kein_NL : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_NL_Daten_EEPROM : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_NL_Drucksens : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_NL_Abtrieb : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_NL_Waehlhebel : 28|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_NL_Wegfahrsperre : 29|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NM_GE_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Eindraht_Fehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GE_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_GSG_Subbusaktiv : 50|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 1729 NMH_Motor: 7 Motor_EDC17_D4 + SG_ NMH_MO_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_MO_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX + SG_ NMH_MO_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ NMH_MO_NM_aktiv_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NM_aktiv_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NM_aktiv_Start : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NM_aktiv_EKP_Vorlauf : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NM_aktiv_STH_Betrieb : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NM_aktiv_HV_Abschaltung : 21|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_kein_NL : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NL_Kuehlerluefter : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NL_Diagnose : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NL_WFS : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NL_EEPROM : 28|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_NL_Sonstige : 29|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NM_MO_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Eindraht_Fehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 1736 NMH_Motor_Slave: 7 Motor_Slave_D4 + SG_ NMH_MO_SL_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_MO_SL_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX + SG_ NMH_MO_SL_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ NMH_MO_SL_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Busfehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_Sl_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_MO_SL_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 1782 NMH_SCR: 7 SCR_C7 + SG_ NMH_SCR_Start_1 : 0|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,Motor_Slave_D4,SCR_C7 + SG_ NMH_SCR_Start_2 : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Normal_Mode_1 : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Normal_Mode_2 : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Car_WakeUp : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Per_WakeUp : 8|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX + SG_ NMH_SCR_Fkt_WakeUp : 13|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ NMH_SCR_Klemme_15 : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Diagnose : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_MindestAktivZeit : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_NL_Datem_EEPROM : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Signalfehler : 32|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_TimeOut_Fehler : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_CAN_Diag_deaktiv : 34|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_KompSchutz : 35|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Mute_Mode : 36|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Transport_Mode : 37|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Abschaltstufe_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Busfehler : 39|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Lokalaktiv : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ NMH_SCR_Subsystemaktiv : 49|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 913 OBD_01: 8 Motor_EDC17_D4 + SG_ OBD_Calc_Load_Val : 0|8@1+ (0.39215686274509803,0) [0E-17|99.99999999999999765] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ OBD_Eng_Cool_Temp : 8|8@1+ (1,-40) [-40|215] "Unit_DegreCelsi" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ OBD_Abs_Throttle_Pos : 16|8@1+ (0.39215686274509803,0) [0E-17|99.99999999999999765] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ OBD_Abs_Load_Val : 24|16@1+ (0.39215686274509803,0) [0E-17|25699.99999999999939605] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ OBD_Abs_Pedal_Pos : 40|8@1+ (0.39215686274509803,0) [0E-17|99.99999999999999765] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ OBD_Kaltstart_Denominator : 59|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ OBD_Minimum_Trip : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ OBD_Driving_Cycle : 61|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7 + SG_ OBD_Warm_Up_Cycle : 62|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7 + SG_ OBD_Normed_Trip : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7,SCR_C7 + +BO_ 803 PCF_01: 8 Gateway_D4C7 + SG_ PCF_01_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_D4 + SG_ PCF_01_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_D4 + SG_ PCF_Objektstatus : 12|3@1+ (1.0,0.0) [0.0|7] "" Airbag_D4 + SG_ PCF_Fahrer_aktiv_erkannt : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ PCF_Time_to_collision : 16|8@1+ (0.01,0) [0.00|2.50] "Unit_Secon" Airbag_D4 + SG_ PCF_v_rel : 24|7@1+ (0.5,0) [0.5|63.5] "Unit_MeterPerSecon" Airbag_D4 + SG_ PCF_dy_Kollisionsueberdeckung : 31|5@1+ (0.1,0) [0.1|2.9] "Unit_Meter" Vector__XXX + +BO_ 802 PCR_01: 8 Gateway_D4C7 + SG_ PCR_Sensorstatus : 12|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4 + SG_ PCR_Obj_vx_rel : 13|11@1+ (0.1,-102.3) [-102.3|102.3] "Unit_MeterPerSecon" Airbag_D4 + SG_ PCR_Obj_vy_rel : 24|11@1+ (0.1,-102.3) [-102.3|102.3] "Unit_MeterPerSecon" Airbag_D4 + SG_ PCR_Obj_TTC : 35|9@1+ (0.01,0) [0.00|5.10] "Unit_Secon" Airbag_D4 + SG_ PCR_Obj_Guete : 44|7@1+ (1,0) [0|100] "Unit_PerCent" Airbag_D4 + SG_ PCR_Crashwahrscheinlichkeit : 51|7@1+ (1,0) [0|100] "Unit_PerCent" Airbag_D4 + +BO_ 929 PSD_01: 8 Gateway_D4C7 + SG_ PSD_Pos_Segment_ID : 0|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Pos_Segmentlaenge : 6|7@1+ (2,0) [0|254] "Unit_Meter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Pos_Inhibitzeit : 13|5@1+ (10,0) [0|310] "Unit_MilliSecon" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Pos_Standort : 18|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Pos_Laengsfehler : 19|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Segment_ID : 22|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Vorgaenger_Segment_ID : 28|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Strassenklasse : 34|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Segmentlaenge : 36|7@1+ (2,0) [0|254] "Unit_Meter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Rampe : 43|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Endkruemmung : 45|8@1+ (1,0) [0|254] "Unit_None" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Endkruemmung_Vorz : 53|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Endsteigung : 54|5@1+ (0.5,0) [0.0|14.5] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Endsteigung_Vorz : 59|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_ADAS_Qualitaet : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Fahrspuren : 61|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_wahrscheinlichster_Pfad : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + +BO_ 930 PSD_02: 8 Gateway_D4C7 + SG_ PSD_Multiplex M : 0|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Segment_ID m0 : 2|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Segment_ID m1 : 2|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Segment_ID m2 : 2|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ort_Laenge_VZ m3 : 2|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ort_Laenge m3 : 3|25@1+ (0.00001,0) [0.00000|180.00000] "Unit_DegreOfArc" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Laendercode m0 : 8|8@1+ (1.0,0.0) [0.0|255] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Segmentlaenge m1 : 8|7@1+ (2,0) [0|254] "Unit_Meter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Geschwindigkeit m2 : 8|5@1+ (1.0,0.0) [0.0|31] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Geschwindigkeit_Typ m2 : 13|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Geschwindigkeit_Gespann m2 : 14|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Vorgaenger_Segment_ID m1 : 15|6@1+ (1,0) [2|63] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Geschwindigkeit_Einheit m0 : 16|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Geschwindigkeit_Witter m2 : 16|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Verkehrsrichtung m0 : 17|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Release_Monat m0 : 18|4@1+ (1,0) [1|12] "Unit_Month" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Geschwindigkeit_Tag_Anf m2 : 18|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Geschwindigkeit m1 : 21|5@1+ (1.0,0.0) [0.0|31] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Geschwindigkeit_Tag_Ende m2 : 21|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Release_Jahr m0 : 22|5@1+ (1,2000) [2000|2031] "Unit_Year" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Geschwindigkeit_Std_Anf m2 : 24|5@1+ (1,0) [0|24] "Unit_Hours" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Geschwindigkeit_Typ m1 : 26|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Tunnel m0 : 27|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Strassenklasse m1 : 27|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Bruecke m0 : 28|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ort_Breite_VZ m3 : 28|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Fahrsp_Gegenr m0 : 29|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_ADAS_Qualitaet m1 : 29|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Geschwindigkeit_Std_Ende m2 : 29|5@1+ (1,0) [0|24] "Unit_Hours" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ort_Breite m3 : 29|24@1+ (0.00001,0) [0.00000|90.00000] "Unit_DegreOfArc" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Abzweigerichtung m1 : 30|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_TMC_Baustelle m0 : 31|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Abzweigewinkel m1 : 31|4@1+ (1.0,0.0) [0.0|15] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_TMC_Stau m0 : 32|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_alter_Geschw m2 : 34|5@1+ (1.0,0.0) [0.0|31] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Rampe m1 : 35|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Anfangskruemmung m1 : 37|8@1+ (1,0) [0|254] "Unit_None" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_alter_Geschw_Gespann m2 : 39|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_alter_Geschw_Witter m2 : 41|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_alter_Geschw_Tag_Anf m2 : 43|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Anfangskruemmung_Vorz m1 : 45|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Anfangskruemmung m0 : 46|8@1+ (1,0) [0|254] "Unit_None" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Endkruemmung m1 : 46|8@1+ (1,0) [0|254] "Unit_None" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_alter_Geschw_Tag_Ende m2 : 46|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_alter_Geschw_Std_Anf m2 : 49|5@1+ (1,0) [0|24] "Unit_Hours" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ort_Hoehe m3 : 53|11@1+ (5,-1000) [-1000|8000] "Unit_Meter" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Anfangskruemmung_Vorz m0 : 54|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Endkruemmung_Vorz m1 : 54|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_alter_Geschw_Std_Ende m2 : 54|5@1+ (1,0) [0|24] "Unit_Hours" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Anfangssteigung m0 : 55|5@1+ (0.5,0) [0.0|14.5] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Endsteigung m1 : 55|5@1+ (0.5,0) [0.0|14.5] "Unit_PerCent" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Ueberholverbot m2 : 59|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Anfangssteigung_Vorz m0 : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Endsteigung_Vorz m1 : 60|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Ortschaft m0 : 61|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_Fahrspuren m1 : 61|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Ges_Wechselverkehrszeichen m2 : 61|3@1+ (1.0,0.0) [0.0|7] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Digitalisierung m0 : 62|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Sys_Zielfuehrung m0 : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ PSD_Abz_wahrscheinlichster_Pfad m1 : 63|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + +BO_ 2033 Request_Airbag_Deployment: 8 Gateway_D4C7 + SG_ Request_Airbag_Deployment : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Airbag_D4 + +BO_ 2041 Response_Airbag_Deployment: 8 Airbag_D4 + SG_ Response_Airbag_Deployment : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 1528 SAK_01: 8 SAK_C7 + SG_ SAK_Charisma_FahrPr : 16|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ SAK_Charisma_Status : 19|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ SAK_Charisma_Umschaltung : 21|2@1+ (1.0,0.0) [0.0|3] "" Vector__XXX + SG_ SAK_KD_Fehler : 23|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + +BO_ 1011 SCR_01: 8 SCR_C7 + SG_ SCR_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4 + SG_ SCR_Dosierpumpe_Drehzahl : 23|11@1+ (4,-4080) [-4080|4100] "Unit_MinutInver" Motor_EDC17_D4 + SG_ SCR_Druck : 34|10@1+ (5,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4 + SG_ SCR_Level_Aktivtank : 44|10@1+ (5,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4 + SG_ SCR_Level_Passivtank : 54|10@1+ (5,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4 + +BO_ 1507 SCR_02: 8 SCR_C7 + SG_ SCR_Heizkreis_3_Strom : 0|8@1+ (0.1,0) [0.0|14.0] "Unit_Amper" Motor_EDC17_D4 + SG_ SCR_02_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4 + SG_ SCR_KD_Fehler : 13|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ SCR_Guetesensor : 14|10@1+ (5,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4 + SG_ SCR_Temp_Aktivtank : 24|8@1+ (20,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4 + SG_ SCR_Temp_Passivtank : 32|8@1+ (20,0) [0|5000] "Unit_MilliVolt" Motor_EDC17_D4 + SG_ SCR_Leitungsheizung_Strom : 40|8@1+ (0.1,0) [0.0|14.0] "Unit_Amper" Motor_EDC17_D4 + SG_ SCR_Transferpumpe_Strom : 48|8@1+ (0.1,0) [0.0|14.0] "Unit_Amper" Motor_EDC17_D4 + SG_ SCR_Tankheizung_Strom : 56|8@1+ (0.1,0) [0.0|14.0] "Unit_Amper" Motor_EDC17_D4 + +BO_ 1508 SCR_03: 8 SCR_C7 + SG_ SCR_03_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4 + SG_ SCR_Spannungsversorgung_Status : 12|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_VersorgungSensoren_Status : 16|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Heizkreis_3_Status : 20|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Guetesensor_Status : 24|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Leitungsheizung_Status : 28|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Tankheizung_Status : 32|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Druck_Status : 36|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Dosierpumpe_Status_Spule : 40|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Transferpumpe_Status : 44|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Level_Aktivtank_Status : 48|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Level_Passivtank_Status : 52|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Temp_Aktivtank_Status : 56|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + SG_ SCR_Temp_Passivtank_Status : 60|4@1+ (1.0,0.0) [0.0|15] "" Motor_EDC17_D4 + +BO_ 1509 SCR_04: 8 SCR_C7 + SG_ SCR_04_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4 + SG_ SCR_Ansteuerung_Transferpumpe : 12|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4 + SG_ SCR_Ansteuerung_Dosierpumpe : 13|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4 + SG_ SCR_Ansteuerung_Heizkreis_3 : 14|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4 + SG_ SCR_Ansteuerung_Leitungsheizung : 15|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4 + SG_ SCR_Ansteuerung_Tankheizung : 16|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4 + SG_ SCR_CAL_CVN_CRC_32 : 32|32@1+ (1.0,0.0) [0.0|4294967295] "" Motor_EDC17_D4 + +BO_ 1526 SCR_05: 8 SCR_C7 + SG_ SCR_05_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4 + SG_ SCR_Steuergeraet_Heizung_Status : 48|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4 + SG_ SCR_Steuergeraet_Pumpe_Status : 50|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4 + SG_ SCR_Steuergeraet_Relais_Status : 52|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4 + SG_ SCR_Steuergeraet_Bus_Status : 56|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4 + SG_ SCR_Steuergeraet_Codierung_St000 : 58|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4 + SG_ SCR_Steuergeraet_Datensatz_St001 : 60|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4 + SG_ SCR_Steuergeraet_Defekt_Status : 62|2@1+ (1.0,0.0) [0.0|3] "" Motor_EDC17_D4 + +BO_ 1510 SCR_CAL_ID1: 8 SCR_C7 + SG_ SCR_CAL_ID_Name_01 : 0|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_Name_02 : 8|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_Name_03 : 16|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_TN_01 : 24|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_TN_02 : 32|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_TN_03 : 40|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_TN_04 : 48|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_TN_05 : 56|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + +BO_ 1512 SCR_CAL_ID2: 8 SCR_C7 + SG_ SCR_CAL_ID_TN_06 : 0|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_TN_07 : 8|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_TN_08 : 16|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_Leer : 24|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_Index_01 : 32|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_Index_02 : 40|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_Index_03 : 48|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + SG_ SCR_CAL_ID_Index_04 : 56|8@1+ (1.0,0.0) [0.0|255] "" Motor_EDC17_D4 + +BO_ 133 SCU_01: 8 SCU_D4 + SG_ SCU_01_CHK : 0|8@1+ (1,0) [0|255] "" Airbag_D4,ESP_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4 + SG_ SCU_01_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_D4,ESP_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4 + SG_ SCU_Ue_Winkel_ADS : 16|12@1+ (0.1,0) [0.0|409.3] "Unit_DegreOfArc" Airbag_D4,ESP_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4 + SG_ SCU_VZ_Ue_Winkel_ADS : 28|1@1+ (1.0,0.0) [0.0|1] "" Airbag_D4,ESP_D4,Gateway_D4C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4,QSP_D4 + SG_ SCU_Soll_Ue_Winkel : 29|11@1+ (0.1,0) [0.0|204.5] "Unit_DegreOfArc" ESP_D4,Gateway_D4C7,QSP_D4 + SG_ SCU_max_Gradient : 40|9@1+ (1,0) [0|510] "" ESP_D4,Gateway_D4C7,QSP_D4 + SG_ SCU_VZ_Soll_Ue_Winkel : 49|1@1+ (1.0,0.0) [0.0|1] "" ESP_D4,Gateway_D4C7,QSP_D4 + SG_ SCU_Status : 50|3@1+ (1.0,0.0) [0.0|7] "" ESP_D4,Gateway_D4C7,QSP_D4 + SG_ SCU_KD_Fehler : 53|1@1+ (1.0,0.0) [0.0|1] "" ESP_D4,Gateway_D4C7,QSP_D4 + SG_ SCU_01_CRC : 56|8@1+ (1,0) [0|255] "" ESP_D4,Gateway_D4C7,QSP_D4 + +BO_ 784 SCU_02: 8 SCU_D4 + SG_ SCU_Warnlampe : 12|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ SCU_Warnungen : 14|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ SCU_Charisma_FahrPr : 16|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7 + SG_ SCU_Charisma_Status : 19|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ SCU_Charisma_Umschaltung : 21|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + +BO_ 1313 STH_01: 8 Gateway_D4C7 + SG_ STH_Funk_ein : 0|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STH_Funk_aus : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STH_Zusatzheizung : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STH_LED : 3|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ STH_Pumpe_ein : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Geblaese : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STH_EKP_Anst : 6|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ STH_Start_folgt : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STH_Ventiloeffnungszeit : 8|6@1+ (1,0) [0|63] "Unit_Minut" Vector__XXX + SG_ STH_Ventil_Status : 14|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STH_Waermeeintrag : 16|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ STH_KVS : 24|13@1+ (1,0) [0|8191] "Unit_MilliLiter" Vector__XXX + SG_ STH_Fehlerstatus : 37|3@1+ (1.0,0.0) [0.0|7] "" Vector__XXX + SG_ STH_Heizleistung : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ STH_Wassertemp : 48|8@1+ (0.75,-40) [-40.00|142.25] "Unit_DegreCelsi" Vector__XXX + SG_ STH_Motorvorwaermung : 59|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ STH_Servicemode : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_war_aktiv : 61|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ STH_KVS_Ueberlauf : 62|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STH_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 1172 STS_01: 8 Gateway_D4C7 + SG_ STS_01_CHK : 0|8@1+ (1,0) [0|255] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ STS_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ STS_Car_not_under_theft : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Car_under_theft : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Anlassersperre : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Typencodierung : 16|5@1+ (1.0,0.0) [0.0|31] "" Vector__XXX + SG_ STS_KD_Fehler : 22|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_LIN_aktiv : 23|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Standlicht : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Fahrlicht : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Alarm_still : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Texte : 27|4@1+ (1.0,0.0) [0.0|15] "" Vector__XXX + SG_ STS_Laderelais : 38|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Summer : 48|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Alarm_Blinker : 50|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Notstart : 51|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Signalhorn : 55|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ STS_Leerlaufschaltung : 56|1@1+ (1.0,0.0) [0.0|1] "" Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + +BO_ 783 SWA_01: 8 Gateway_D4C7 + SG_ SWA_Status_CHK : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ SWA_Status_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ SWA_Anzeigen : 12|4@1+ (1.0,0.0) [0.0|15] "" Kombi_D4 + SG_ SWA_Blindheit_erkannt : 16|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_rel_Nichtverf : 17|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_rel_Fehler : 18|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Sta_aktiv : 19|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Sta_passiv : 20|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Standziele_li : 24|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Kolonne_li : 25|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Infostufe_SWA_li : 26|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Warnung_SWA_li : 27|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Kolonne_mi : 33|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Standziele_re : 40|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Kolonne_re : 41|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Infostufe_SWA_re : 42|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Warnung_SWA_re : 43|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SWA_Gischtzaehler : 48|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ SWA_KD_Fehler : 59|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 1413 Systeminfo_01: 8 Gateway_D4C7 + SG_ SI_Int_CAN_gespiegelt : 0|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_CAN_Komfort_Sleep : 1|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_CAN_Dashboard_Sleep : 2|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_CAN_Antrieb_Sleep : 3|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_Infotainment_Sleep : 4|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_CAN_Extended_Sleep : 5|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_Fahrwerk_Sleep : 6|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_Diagnose_Aktiv : 7|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_QRS_Mode : 8|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7 + SG_ SI_T_Mode : 9|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Motor_EDC17_D4,Motor_ME17_BY,Motor_MED17_SIMOS8_D4 + SG_ SI_NWDF : 10|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_NWDF_gueltig : 11|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_Sammelfehler : 12|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ GW_KD_Fehler : 13|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_MOST_Status : 15|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + SG_ SI_Sammel_SG_Fehler : 56|6@1+ (1,0) [0|60] "" Vector__XXX + SG_ SI_MO_WU : 63|1@1+ (1.0,0.0) [0.0|1] "" Vector__XXX + +BO_ 1214 TPD_SCU_01: 8 Gateway_D4C7 + SG_ TPD_SCU_Data_1 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" SCU_D4 + +BO_ 768 TPD_Tester_01: 8 SCU_D4 + SG_ TPD_Tester_Data_1 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 769 TPD_Tester_02: 8 SCU_D4 + SG_ TPD_Tester_Data_2 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 770 TPD_Tester_03: 8 SCU_D4 + SG_ TPD_Tester_Data_3 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 771 TPD_Tester_04: 8 SCU_D4 + SG_ TPD_Tester_Data_4 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 772 TPD_Tester_05: 8 SCU_D4 + SG_ TPD_Tester_Data_5 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 773 TPD_Tester_06: 8 SCU_D4 + SG_ TPD_Tester_Data_6 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 774 TPD_Tester_07: 8 SCU_D4 + SG_ TPD_Tester_Data_7 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 775 TPD_Tester_08: 8 SCU_D4 + SG_ TPD_Tester_Data_8 : 0|64@1+ (1.0,0.0) [0.0|18446744073709551615] "" Gateway_D4C7 + +BO_ 542 TPS_SCU: 7 SCU_D4 + SG_ TPS_SCU_Data : 0|56@1+ (1.0,0.0) [0.0|72057594037927935] "" Gateway_D4C7 + +BO_ 512 TPS_Tester: 7 Gateway_D4C7 + SG_ TPS_Tester_Data : 0|56@1+ (1.0,0.0) [0.0|72057594037927935] "" SCU_D4 + +BO_ 268 TSK_02: 8 XXX + SG_ TSK_02_CHK : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ TSK_Status : 16|2@1+ (1,0) [0|3] "" XXX + +BO_ 786 TSK_03: 8 Motor_EDC17_D4 + SG_ TSK_03_CHK : 0|8@1+ (1,0) [0|255] "" Gateway_D4C7 + SG_ TSK_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_D4C7 + SG_ FAS_Wunschgeschw : 12|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" Gateway_D4C7 + SG_ FAS_Status_Prim_Anz : 22|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ FAS_Texte_Primaeranz : 48|7@1+ (1.0,0.0) [0.0|127] "" Gateway_D4C7 + SG_ FAS_Status_Anzeige : 61|3@1+ (1.0,0.0) [0.0|7] "" Gateway_D4C7 + +BO_ 270 TSK_04: 8 Motor_EDC17_D4 + SG_ TSK_04_CHK : 0|8@1+ (1,0) [0|255] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_04_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_zul_Regelabw : 12|6@1+ (0.024,0) [0.000|1.512] "Unit_MeterPerSeconSquar" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_ax_Getriebe : 18|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Wunsch_Uebersetz : 27|10@1+ (0.0245,0) [0.0245|25.0635] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Freig_WU : 37|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Limiter_aktiv : 38|1@1+ (1.0,0.0) [0.0|1] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Status_GRA_ACC_02 : 62|2@1+ (1.0,0.0) [0.0|3] "" Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + +BO_ 273 TSK_05: 8 Motor_EDC17_D4 + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_QBit_Steigung : 12|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Status_GRA_ACC_01 : 16|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ TSK_Fahrzeugmasse : 18|5@1+ (200,500) [500|6500] "Unit_KiloGram" Gateway_D4C7 + SG_ TSK_QBit_Fahrzeugmasse : 23|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Fahrzeugmasse_02 : 24|8@1+ (32,0) [0|8128] "Unit_KiloGram" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Steigung : 40|8@1+ (0.8,-101.6) [-101.6|101.6] "Unit_PerCent" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Getriebeinfo : 51|2@1+ (1.0,0.0) [0.0|3] "" Gateway_D4C7 + SG_ TSK_Codierung_ACC : 53|1@1+ (1.0,0.0) [0.0|1] "" EPB_D4,Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Zwangszusch_ESP : 54|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + SG_ TSK_Freig_Verzoeg_Anf : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7,Getriebe_AL551_951_D4_C7,Getriebe_DL501_C7,Getriebe_VL381_C7 + SG_ TSK_Verzoeg_Anf_02 : 56|8@1+ (0.024,-3.984) [-3.984|2.136] "Unit_MeterPerSeconSquar" Gateway_D4C7 + +BO_ 1716 VIN_01: 8 Gateway_D4C7 + SG_ VIN_01_MUX M : 0|2@1+ (1,0) [0|3] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4 + SG_ KS_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4 + SG_ VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ KS_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4 + SG_ VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ KS_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4 + SG_ VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ KS_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4 + SG_ VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4 + SG_ VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4 + SG_ VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4 + SG_ VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,SCR_C7 + SG_ VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" Airbag_D4,EPB_D4,LWS_D4,SCR_C7,SCU_D4 + +BO_ 1414 Waehlhebel_02: 8 Getriebe_AL551_951_D4_C7 + SG_ WH_KD_Fehler : 63|1@1+ (1.0,0.0) [0.0|1] "" Gateway_D4C7 + + +VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" ; +VAL_ 269 ACC_Freigabe_Momentenanf 0 "Momanf_nicht_freigegeben" 1 "Momanf_freigegeben" ; +VAL_ 269 ACC_Freigabe_Verzanf 0 "Verzanf_nicht_freigegeben" 1 "Verzanf_freigegeben" ; +VAL_ 269 ACC_Getriebestellung_P 0 "P_Stellung_nicht_angefordert" 1 "Anforderung_P_Stellung" ; +VAL_ 269 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert" ; +VAL_ 269 ACC_Loeseanforderung 0 "keine_Anforderung" 1 "Loeseanforderung" ; +VAL_ 269 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler" ; +VAL_ 269 ACC_Vorbefuellung_Bremsanlage 0 "Vorbefuellung_AUS" 1 "Vorbefuellung_EIN" ; +VAL_ 269 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "nicht_definiert" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System" ; +VAL_ 269 ACC_Betaetigung_EPB 0 "keine_EPB_Anforderung" 1 "EPB_Aktuator_schliessen" ; +VAL_ 269 ACC_Beeinflussung_ESP 0 "keine_Zwangszuschaltung" 1 "ESP_Zwangszuschaltung" ; +VAL_ 269 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht" ; +VAL_ 269 ACC_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 64 AB_RGS_Anst 4 "aktiv_Niveau_1" 5 "aktiv_Niveau_2" 6 "aktiv_Niveau_3" 7 "aktiv_Niveau_4" 8 "deaktiviert" ; +VAL_ 64 AB_Front_Crash 0 "kein_Front_Crash" 1 "Front_Crash" ; +VAL_ 64 AB_Heck_Crash 0 "kein_Heck_Crash" 1 "Heck_Crash" ; +VAL_ 64 AB_SF_Crash 0 "kein_Seiten_Crash_Fahrer" 1 "Seiten_Crash_Fahrer" ; +VAL_ 64 AB_SB_Crash 0 "kein_Seiten_Crash_Beifahrer" 1 "Seiten_Crash_Beifahrer" ; +VAL_ 64 AB_Rollover_Crash 0 "kein_Rollover" 1 "Rollover" ; +VAL_ 64 AB_Crash_Int 0 "kein_Crash" 1 "Crash_Intensitaet_1" 2 "Crash_Intensitaet_2_(nur_Stellgliedtest_B8)" 3 "Crash_Intensitaet_2_(nur_D4_C7_Colorado_NF_PAG__Crash_im_B8)" 4 "Crash_Intensitaet_3_(alt_VW/AUDI__Stellgiedtest_B8)" 5 "Crash_Intensitaet_3_(alt_PAG)" 7 "Crash_Intensitaet_3" ; +VAL_ 64 AB_Lampe 0 "Aus" 1 "Ein" ; +VAL_ 64 AB_Deaktiviert 0 "aktiv" 1 "deaktiviert" ; +VAL_ 64 AB_VB_deaktiviert 0 "Beifahrerairbag_aktiv" 1 "Beifahrerairbag_deaktiviert" ; +VAL_ 64 AB_Systemfehler 0 "kein_Fehler" 1 "Airbag_Systemfehler" ; +VAL_ 64 AB_Diagnose 0 "nicht_in_Diagnose" 1 "in_Diagnose" ; +VAL_ 64 AB_Stellgliedtest 0 "nicht_im_Stellgliedtest" 1 "Airbag_im_Stellgliedtest" ; +VAL_ 64 AB_Erh_Auf_VB 0 "keine_Anzeige" 1 "Beifahrerairbag_deaktiviert" 2 "Beifahrerairbag_aktiviert" 3 "nicht_definiert" ; +VAL_ 64 AB_Gurtwarn_VF 0 "keine_Warnung" 1 "Gurtwarnung_ausloesen" ; +VAL_ 64 AB_Gurtwarn_VB 0 "keine_Warnung" 1 "Gurtwarnung_ausloesen" ; +VAL_ 64 AB_Anzeige_Fussg 0 "keine_FSG_Aktion_ausgeloest" 1 "Motorhaube_offen" 2 "Systemfehler" ; +VAL_ 64 AB_Texte_AKS 0 "keine_AKS_Ausloesung" 1 "AKS_ausgeloest" 2 "AKS_Systemfehler" ; +VAL_ 64 AB_PAO_Leuchte_Anf 0 "Leuchte_ausschalten" 1 "Leuchte_einschalten" ; +VAL_ 64 AB_MKB_gueltig 0 "Multikollisionsbremsung_nicht_freigeschaltet" 1 "Multikollisionsbremsung_freigeschaltet" ; +VAL_ 64 AB_MKB_Anforderung 0 "Multikollisionsbremsung_nicht_angefordert" 1 "Multikollisionsbremsung_angefordert" ; +VAL_ 64 AB_Versorgungsspannung 0 "plausibel" 1 "unplausibel" ; +VAL_ 64 AB_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1312 AB_Belegung_VB 0 "nicht_verfuegbar" 1 "Fehler" 2 "nicht_belegt" 3 "belegt" ; +VAL_ 1312 AB_Gurtschloss_FA 0 "nicht_verbaut" 1 "nicht_verfīŋŊgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt" ; +VAL_ 1312 AB_Gurtschloss_BF 0 "nicht_verbaut" 1 "nicht_verfīŋŊgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt" ; +VAL_ 1312 AB_Gurtschloss_Reihe2_FA 0 "nicht_verbaut" 1 "nicht_verfīŋŊgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt" ; +VAL_ 1312 AB_Gurtschloss_Reihe2_MI 0 "nicht_verbaut" 1 "nicht_verfīŋŊgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt" ; +VAL_ 1312 AB_Gurtschloss_Reihe2_BF 0 "nicht_verbaut" 1 "nicht_verfīŋŊgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt" ; +VAL_ 1312 AB_Gurtschloss_Reihe3_FA 0 "nicht_verbaut" 1 "nicht_verfīŋŊgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt" ; +VAL_ 1312 AB_Gurtschloss_Reihe3_MI 0 "nicht_verbaut" 1 "nicht_verfīŋŊgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt" ; +VAL_ 1312 AB_Gurtschloss_Reihe3_BF 0 "nicht_verbaut" 1 "nicht_verfīŋŊgbar (Fehler oder Init)" 2 "nicht_gesteckt" 3 "gesteckt" ; +VAL_ 1312 AB_Sitzpos_Sens_FA 0 "nicht verfīŋŊgbar" 1 "Fehler" 2 "Sitz nicht vorne" 3 "Sitz vorne" ; +VAL_ 1312 AB_Sitzpos_Sens_BF 0 "nicht verfīŋŊgbar" 1 "Fehler" 2 "Sitz nicht vorne" 3 "Sitz vorne" ; +VAL_ 1633 AAG_Bremsl_durch_ECD 0 "Bremslicht_ist_aus" 1 "Bremslicht_durch_ECD_aktiv" ; +VAL_ 1633 AAG_Anhaenger_abgesteckt 1 "Anhaenger_wurde_bei_KL15_aus_abgesteckt" ; +VAL_ 1633 AAG_NSL_aktiv 1 "Anhaenger_Nebelschusslicht_aktiv" ; +VAL_ 1633 AAG_Anhaenger_erkannt 0 "kein_Anhaenger_erkannt" 1 "AAG_Anhaenger_erkannt" ; +VAL_ 1633 AAG_Blinker_H_aktiv 1 "Anhaenger_Blinker_aktiv" ; +VAL_ 1633 AAG_Blinker_HL_def 1 "Anhaenger_Blinker_links_defekt" ; +VAL_ 1633 AAG_Blinker_HR_def 1 "Anhaenger_Blinker_rechts_defekt" ; +VAL_ 1633 AAG_Bremslicht_H_def 1 "Anhaenger_Bremslicht_defekt" ; +VAL_ 1633 AAG_Schlusslicht_HL_def 1 "Anhaenger_Schlusslicht_links_defekt" ; +VAL_ 1633 AAG_Schlusslicht_HR_def 1 "Anhaenger_Schlusslicht_rechts_defekt" ; +VAL_ 1633 AAG_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1633 AAG_AVS_Fehler 0 "iO" 1 "niO" 2 "niO_Fahrzeugstopp_erforderlich" 3 "tbd" ; +VAL_ 1633 AAG_AVS_Stati 0 "endlage eingefahren erreicht" 1 "endlage ausgefahren erreicht" 2 "ausfahren automatik " 3 "einfahren automatik" 4 "ausfahren manuell " 5 "einfahren manuell" 6 "zwischenposition" 7 "nicht initialisiert" ; +VAL_ 777 BEM_Segel_Info 0 "keine_Anforderung" 1 "Mindestdrehzahl_1" 2 "Mindestdrehzahl_2" 3 "Segelveto" ; +VAL_ 777 BEM_P_Generator 255 "Fehler" ; +VAL_ 777 BEM_n_LLA 0 "keine_Erhoehung" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3" ; +VAL_ 777 BEM_01_Abschaltstufen 0 "Stufe_0_keine_Einschraenkung" 1 "Stufe_1" 2 "Stufe_2" 3 "Stufe_3" 4 "Transportmodus" 7 "Ruhestrommessmodus" ; +VAL_ 777 BEM_Anf_KL 0 "keine Anforderung" 1 "Anforderung KīŋŊhlerlīŋŊfter Ansteuerung" ; +VAL_ 777 BEM_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ; +VAL_ 901 CHA_Systemstatus 0 "Status in Ordnung" 1 "reserviert" 2 "reserviert" 3 "reserviert" ; +VAL_ 901 CHA_Fahrer_Umschaltung 0 "keine_oder_automatische Umschaltung" 1 "manuelle_Umschaltung" ; +VAL_ 901 CHA_Ziel_FahrPr_MO 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_GE 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_ST 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_SCU 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_DR 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_QS 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_AFS 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_RGS 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_EPS 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_ACC 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 901 CHA_Ziel_FahrPr_SAK 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 1714 DGN_Verlernzaehler 255 "ungīŋŊltiger ZīŋŊhlerstand oder kein gīŋŊltiger Fahrzyklus" ; +VAL_ 1714 KBI_Kilometerstand 1048574 "Init" 1048575 "Fehler" ; +VAL_ 1714 UH_Monat 14 "reserviert" ; +VAL_ 1714 UH_Tag 0 "reserviert" ; +VAL_ 1714 Kombi_02_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 1714 Uhrzeit_01_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 1520 DI_KL_58d 254 "Init" 255 "Fehler" ; +VAL_ 1520 DI_KL_58s 126 "Init" 127 "Fehler" ; +VAL_ 1520 DI_KL_58st 126 "Init" 127 "Fehler" ; +VAL_ 1603 KBI_Einheit_Datum 0 "Tag/Monat/Jahr" 1 "Monat/Tag/Jahr" 2 "Jahr/Monat/Tag" 3 "reserviert" ; +VAL_ 1603 KBI_Einheit_Druck 0 "Druckangabe in bar" 1 "Druckangabe in psi" 2 "Druckangabe in kPa" 3 "tbd." ; +VAL_ 1603 KBI_Einheit_Streckenanz 0 "Kilometer" 1 "Meilen" ; +VAL_ 1603 KBI_MFA_v_Einheit_02 0 "kmh" 1 "mph" ; +VAL_ 1603 KBI_Einheit_Temp 0 "Grad Celsius īŋŊC" 1 "Grad Fahrenheit īŋŊF" ; +VAL_ 1603 KBI_Einheit_Uhrzeit 0 "24h" 1 " 12h AM/PM" ; +VAL_ 1603 KBI_Einheit_Verbrauch 0 "mpg UK" 1 "mpg USA" 2 "Liter/100km" 3 "km/Liter" ; +VAL_ 1603 KBI_Einheit_Volumen 0 "Liter" 1 "Gallonen UK" 2 "Gallonen USA" 3 "reserviert" ; +VAL_ 260 EPB_QBit_Laengsbeschleunigung 0 "gīŋŊltiger Wert" 1 "Ersatz-, Init- oder Fehlerwert" ; +VAL_ 260 EPB_QBit_Pedalweg_Kuppl 0 "gīŋŊltiger Wert" 1 "Ersatz-, Init- oder Fehlerwert" ; +VAL_ 260 EPB_BCM2_Motor_Wakeup 0 "keine Anforderung" 1 "Anforderung an BCM2 Wakeupleitung zum Motor hochzuziehen aufgrund von Car-Wakeup" ; +VAL_ 260 EPB_Freig_Verzoeg_Anf 0 "nicht freigegeben" 1 "freigegeben" ; +VAL_ 260 EPB_Laengsbeschleunigung 255 "Fehler" ; +VAL_ 260 EPB_Pedalweg_Kuppl 0 "Init" 255 "Fehler" ; +VAL_ 260 EPB_Anfahrwunsch_erkannt 0 "kein Anfahrwunsch erkannt" 1 "Anfahrwunsch erkannt" ; +VAL_ 260 EPB_DAA_Randbed_erf 0 "Randbed_nicht_erfuellt" 1 "Randbed_erfuellt" ; +VAL_ 260 EPB_Fehlerstatus 0 "kein Fehler in EPB - AVH darf von ESP ausgefīŋŊhrt werden" 1 "nur VW526: temporīŋŊrer Fehler" 2 "nur VW526: EPB in Diagnose" 3 "Fehler in EPB - AVH darf von ESP nicht ausgefīŋŊhrt werden" ; +VAL_ 260 EPB_Schalterposition 0 "keine Fahreranforderung" 1 "Fahreranforderung īŋŊffnen" 2 "Fahreranforderung SchlieīŋŊen" 3 "Fehler" ; +VAL_ 260 EPB_QBit_Schalterpos 0 "gīŋŊltiger Wert (volle Funktion)" 1 " Ersatz-, Init- oder Fehlerwert (Schalter ausser Funktion)" ; +VAL_ 260 EPB_Konsistenz_ACC 0 "kein Fehler erkannt" 1 "Fehler erkannt" ; +VAL_ 260 EPB_Spannkraft 30 "Init" 31 "Fehler" ; +VAL_ 260 EPB_Status 0 "offen" 1 "Bremse_geschl_(Spannkraft_voll/reduziert)" 2 "Aktuator im Lauf" 3 "Fehler" ; +VAL_ 260 EPB_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 781 EPB_Fehlerlampe_Gelb 0 "Aus" 1 "Ein" ; +VAL_ 781 EPB_Fehlerlampe_BKL 0 "BKL aus" 1 "BKL an" ; +VAL_ 781 EPB_Funktionslampe 0 "Aus" 1 "Ein" ; +VAL_ 781 EPB_Texte 0 "keine_Anzeige" 1 "Neigungswinkel_zu_gross" 2 "Parkbremse_von_Hand_oeffnen" 3 "EPB_in_Diagnose" 4 "Bremspedal_betaetigen" 5 "tbd." 6 "tbd." 7 "StīŋŊrung Anfahrassistent" 8 "Abschleppschutz blockiert" ; +VAL_ 781 EPB_Akustik 0 "Warnton aus" 1 "Warnton an" ; +VAL_ 781 EPB_Autoholdlampe 0 "Lampe aus (Autohold inaktiv)" 1 "Lampe ein (Autohold aktiv)" ; +VAL_ 781 EPB_Bremsbelag_Warn 0 "Bremsbelag_ok" 1 "Bremsbelag_unter_Minimum" ; +VAL_ 256 ASR_Moment_langsam 1022 "Init" 1023 "Fehler" ; +VAL_ 256 ASR_MSR_Moment_schnell 1022 "Init" 1023 "Fehler" ; +VAL_ 256 ESP_v_Signal 65533 "Unterspannung" 65534 "Init" 65535 "Fehler" ; +VAL_ 256 ASR_Tastung_passiv 0 "ASR_aktiviert" 1 "ASR_passiv_getastet_oder_Schwellen_geaendert" ; +VAL_ 256 ESP_Tastung_passiv 0 "ESP_aktiviert" 1 "ESP_passiv_getastet_oder_Schwellen_geaendert" ; +VAL_ 256 ESP_Systemstatus 0 "iO" 1 "Fehler" ; +VAL_ 256 ASR_Schalteingriff 0 "keine Anforderung" 1 "ASR_Schaltkennfeld" 2 "RīŋŊckschaltung" 3 "Schaltverbot" ; +VAL_ 256 OBD_Schlechtweg 0 "kein Schlechtweg erkannt" 1 "Schlechtweg erkannt" ; +VAL_ 256 OBD_QBit_Schlechtweg 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 256 ESP_QBit_v_Signal 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 256 ABS_Bremsung 0 "keine_ABS_Regelung" 1 "ABS_Regelung_aktiv" ; +VAL_ 256 ASR_Anf 0 "keine_Anforderung" 1 "ASR_Anforderung" ; +VAL_ 256 MSR_Anf 0 "keine Anfoderung" 1 "MSR-Anforderung" ; +VAL_ 256 EBV_Eingriff 0 "kein EBV-Eingriff" 1 "EBV-Eingriff" ; +VAL_ 256 EDS_Eingriff 0 "kein_EDS_Eingriff" 1 "EDS_Eingriff" ; +VAL_ 256 ESP_Eingriff 0 "kein_ESP_Eingriff" 1 "ESP_Eingriff_aktiv" ; +VAL_ 256 ESP_ASP 0 "inaktiv" 1 "aktiv" ; +VAL_ 256 ESP_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 257 ESP_QBit_Gierrate 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 257 ESP_QBit_Laengsbeschl 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 257 ESP_QBit_Querb 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 257 ESP_Stillstandsflag 0 "kein_Stillstand_erkannt" 1 "Stillstand_erkannt" ; +VAL_ 257 ESP_Querbeschleunigung 255 "Fehler" ; +VAL_ 257 ESP_Laengsbeschl 1022 "Signal_nicht_vorhanden" 1023 "Fehler" ; +VAL_ 257 ESP_Verteil_Wankmom 30 "Init" 31 "Fehler" ; +VAL_ 257 ESP_QBit_Anf_Vert_Wank 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 257 ESP_Gierrate 16383 "Fehler" ; +VAL_ 257 ESP_VZ_Gierrate 0 "positiv" 1 "negativ" ; +VAL_ 257 ESP_Notbremsanzeige 0 "keine_Notbremsung_erkannt" 1 "Notbremsung_erkannt" ; +VAL_ 257 ESP_SpannungsAnf 0 "keine_Anforderung" 1 "Anforderung_Spannungswert_1" ; +VAL_ 257 ESP_PLA_Abbruch 0 "Init" 1 "Geschwindigkeitsueberschreitung" 2 "Falscher_PLA_Status" 3 "Deaktivierung_durch_Abbruch_Lenkung" 4 "PLA_Bremsanforderung_nach_Stillstand" 5 "Abbruch_durch_Kl15_aus" 6 "Abbruch_durch_FT_offen" ; +VAL_ 257 ESP_Status_ESP_PLA 0 "ESP_PLA_deaktiv" 1 "ESP_PLA_Init" 2 "ESP_PLA_Fehler" 4 "ESP_PLA_aktivierbar" 6 "ESP_PLA_Bremse_aktiv" 8 "ESP_PLA_funktionsbereit" 9 "ESP_PLA_Neustart" 10 "ESP_PLA_Abbruch" ; +VAL_ 259 ESP_VL_FR 0 "Vorwaerts" 1 "Rueckwaerts" ; +VAL_ 259 ESP_VR_FR 0 "Vorwaerts" 1 "Rueckwaerts" ; +VAL_ 259 ESP_HL_FR 0 "Vorwaerts" 1 "Rueckwaerts" ; +VAL_ 259 ESP_HR_FR 0 "Vorwaerts" 1 "Rueckwaerts" ; +VAL_ 259 ESP_VL_Radgeschw 4093 "Unterspannung" 4094 "Init" 4095 "Fehler" ; +VAL_ 259 ESP_VR_Radgeschw 4093 "Unterspannung" 4094 "Init" 4095 "Fehler" ; +VAL_ 259 ESP_HL_Radgeschw 4093 "Unterspannung" 4094 "Init" 4095 "Fehler" ; +VAL_ 259 ESP_HR_Radgeschw 4093 "Unterspannung" 4094 "Init" 4095 "Fehler" ; +VAL_ 776 ESP_Meldungen 0 "keine_Anzeige_kein_Gong" 1 "Autohold_Hinweis_1_und_kein_Gong" 2 "Stoerung_Autohold_und_1x_Gong" 3 "Stoerung_Hillholder_und_1x_Gong" 4 "Uebernehmen_und_1x_Gong" ; +VAL_ 776 ESP_HDC_FktLampe 0 "Aus" 1 "Ein" ; +VAL_ 776 ESP_Lampe 0 "Aus" 1 "Ein" ; +VAL_ 776 ABS_Lampe 0 "Aus" 1 "Ein" ; +VAL_ 776 BK_Lampe 0 "Aus" 1 "Ein" ; +VAL_ 776 ESP_Akustik 0 "keine_Akustik" 1 "1x_Beep" ; +VAL_ 776 ESP_Diagnose 0 "ESP_nicht_in_Diagnose" 1 "ESP_in_Diagnose" ; +VAL_ 776 ESP_Textanzeigen_02 0 "kein_Text" 1 "ESP_Stoerung" 2 "ABS_Stoerung" 3 "ESP_ABS_Stoerung" 4 "nicht_definiert" 5 "ASR_Stoerung" 6 "ESP_switched_off" 7 "ASR_off" 8 "ESP_ASR_on" 9 "Stoerung_Hillholder" 10 "keine_Bremskraftverstaerkung" 11 "ASR_aktiviert" 12 "ABS_ASR_Stoerung" 13 "bitte_Reifen_pruefen" 14 "Stoerung_Autohold" 15 "ESP_offroad" 16 "Autohold_Hinweis_1" 17 "ESP_sport" 18 "ESP_Zwangsaktivierung" ; +VAL_ 776 ESP_Off_Lampe 0 "Lampe_aus" 1 "Lampe_ein" ; +VAL_ 776 ESP_m_Raddrehz 32765 "Unterspannung" 32766 "Init" 32767 "Fehler" ; +VAL_ 776 ESP_ASR_Lampe 0 "ESP_ASR_Lampe_aus" 1 "ESP_ASR_Lampe_an" ; +VAL_ 776 ESP_Fehlerstatus_Wegimp 0 "Wegimpulse_iO" 1 "Fehler" ; +VAL_ 776 ESP_Wegimp_Ueberlauf 0 "Reset und kein īŋŊberlauf" 1 "mindestens 1x īŋŊberlauf" ; +VAL_ 776 ESP_QBit_Wegimp_VA 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 776 ESP_Displaywarnungen 0 "keine_Warnung" 1 "BKL_Display_Warnung" ; +VAL_ 776 ESP_HDC_Regelgeschw 0 "nicht_verbaut" 125 "HDC_Standby" 127 "Fehler" ; +VAL_ 776 ESP_BKV_Warnung 0 "keine_Anzeige_kein_Gong" 1 "keine_Bremskraftverstaerkung_plus_1x_Gong" ; +VAL_ 262 ESP_QBit_Bremsdruck 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 262 ESP_QBit_Fahrer_bremst 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 262 ESP_Schwelle_Unterdruck 0 "kein_Signal" 1 "Unterdruck_kleiner_gleich_450_mbar" 2 "Unterdruck_groesser_450_mbar" 3 "Fehler_Unterdrucksensor" ; +VAL_ 262 ESP_Bremsdruck 1023 "Fehler" ; +VAL_ 262 ESP_Fahrer_bremst 0 "Bremsdruckschwelle_nicht_ueberschritten" 1 "Bremsdruckschwelle_ueberschritten" ; +VAL_ 262 ESP_Verz_TSK_aktiv 0 "TSK_Verzoegerung_inaktiv" 1 "TSK_Verzoegerung_aktiv" ; +VAL_ 262 ESP_Lenkeingriff_ADS 0 "kein_Lenkeingriff" 1 "stabilisierender_Lenkeingriff" ; +VAL_ 262 ESP_Konsistenz_TSK 0 "Botschaft_fuer_Verzoegerungsanforderung_konsistent" 1 "Botschaft_fuer_Verzoegerungsanforderung_nicht_konsistent" ; +VAL_ 262 ESP_Bremsruck_AWV2 0 "kein_Bremsruck_ausgefuehrt" 1 "Bremsruck_ausgefuehrt" ; +VAL_ 262 ESP_Konsistenz_AWV2 0 "Botschaft_fuer_AWV2_konsistent" 1 "Botschaft_fuer_AWV2_nicht_konsistent" ; +VAL_ 262 ECD_Fehler 0 "ECD_iO" 1 "ECD_Fehler" ; +VAL_ 262 ECD_nicht_verfuegbar 0 "ECD_Funktion_verfuegbar" 1 "ECD_Funktion_nicht_verfuegbar" ; +VAL_ 262 ESP_Status_Bremsentemp 0 "Bremse nicht īŋŊberhitzt" 1 "Bremse īŋŊberhitzt" ; +VAL_ 262 ESP_Autohold_Standby 0 "Autohold_nicht_im_Standby" 1 "Autohold_im_Standby" ; +VAL_ 262 ESP_HDC_Standby 0 "HDC_Funktion_nicht_im_Standby" 1 "HDC_Funktion_im_Standby" ; +VAL_ 262 ESP_HBA_aktiv 0 "HBA_nicht_aktiv" 1 "HBA_aktiv" ; +VAL_ 262 ESP_Prefill_ausgeloest 0 "nicht_ausgeloest" 1 "Prefill_ausgeloest" ; +VAL_ 262 ESP_Rueckwaertsfahrt_erkannt 0 "keine_Rueckwaetsfahrt" 1 "Rueckwaertsfahrt_erkannt" ; +VAL_ 262 ESP_Status_Anfahrhilfe 0 "Aus" 1 "Ein" ; +VAL_ 262 ESP_HDC_aktiv 0 "inaktiv" 1 "aktiv" ; +VAL_ 262 ESP_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ; +VAL_ 262 ESP_Eingr_HL 0 "kein_Eingriff" 1 "ESP_Eingriff_HL" ; +VAL_ 262 ESP_Eingr_HR 0 "kein_Eingriff" 1 "ESP_Eingriff_HR" ; +VAL_ 262 ESP_Eingr_VL 0 "kein_Eingriff" 1 "ESP_Eingriff_VL" ; +VAL_ 262 ESP_Eingr_VR 0 "kein_Eingriff" 1 "ESP_Eingriff_VR" ; +VAL_ 262 ESP_BKV_Unterdruck 255 "Fehler" ; +VAL_ 262 ESP_Autohold_aktiv 0 "Autohold inaktiv" 1 "Autohold aktiv" ; +VAL_ 262 ESP_FStatus_Anfahrhilfe 0 "kein_Fehler" 1 "Fehler" ; +VAL_ 262 ESP_Verz_EPB_aktiv 0 "nicht aktiviert" 1 "aktiviert" ; +VAL_ 262 ECD_Bremslicht 0 "Aus" 1 "Ein" ; +VAL_ 262 ESP_Verzoeg_EPB_verf 0 "nicht verfuegbar" 1 "System verfuegbar" ; +VAL_ 262 ESP_Status_Bremsdruck 0 "Bremse drucklos" 1 "mit Bremsdruck" ; +VAL_ 262 ESP_Anforderung_EPB 0 "keine_Anforderung" 1 "Anforderung_Oeffnen" 2 "Anforderung_Schliessen" 3 "reserviert" ; +VAL_ 132 ESP_06_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 132 ESP_VZ_Teilsollwinkel 0 "positiv" 1 "negativ" ; +VAL_ 132 ESP_Winkeleingriff 0 "kein Eingriff" 1 "Eingriff mit langsamer RīŋŊckfīŋŊhrung" 2 "Eingriff mit mittlerer RīŋŊckfīŋŊhrung" 3 "Eingriff mit schneller RīŋŊckfīŋŊhrung" ; +VAL_ 132 ESP_Status_ADS 0 "ADS iO" 1 "ADS noch nicht verfīŋŊgbar" 2 "ADS temporīŋŊr nicht verfīŋŊgbar" ; +VAL_ 132 ESP_v_ref 4093 "Unterspannung" 4095 "Fehler" ; +VAL_ 914 ESP_ACC_LDE 0 "Lebensdauerende_nicht_erreicht" 1 "Lebensdauerende_erreicht" ; +VAL_ 914 ESP_Quattro_Antrieb 0 "Front" 1 "Allrad" ; +VAL_ 914 ESP_Codierung_ADS 0 "Init" 1 "ESP_nicht_ADS_codiert" 2 "ADS_codiert" 3 "tbd" ; +VAL_ 914 ESP_RTA_HL 254 "Abgleich_nocht_nicht_genuegend_konvergent" 255 "Fehler" ; +VAL_ 914 ESP_RTA_HR 254 "Abgleich_nocht_nicht_genuegend_konvergent" 255 "Fehler" ; +VAL_ 914 ESP_RTA_VR 254 "Abgleich_nocht_nicht_genuegend_konvergent" 255 "Fehler" ; +VAL_ 914 OBD_Fehler_Radsensor_HL 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 914 OBD_Fehler_Radsensor_HR 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 914 OBD_Fehler_Radsensor_VL 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 914 OBD_Fehler_Radsensor_VR 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 914 ESP_Qualifizierung_Antriebsart 0 "alte_Bedeutung_Bit_ESP_Quattro_Antrieb" 1 "neue_Bedeutung_Bit_ESP_Quattro_Antrieb" ; +VAL_ 914 ESP_Offroad_Modus 0 "kein_ESP_Offroadmodus" 1 "ESP_Offroadmodus" ; +VAL_ 914 ESP_MKB_ausloesbar 0 "Multikollisionsbremsung_nicht_freigeschaltet" 1 "Multikollisionsbremsung_freigeschaltet" ; +VAL_ 914 ESP_MKB_Status 0 "Multikollisionsbremsung_nicht_aktiv" 1 "Multikollisionsbremsung_aktiv" ; +VAL_ 914 ESP_CM_Variante 0 "Standard" 1 "Erweitert" ; +VAL_ 914 ESP_OBD_Status 0 "MIL_aus" 1 "MIL_ein" ; +VAL_ 1623 ESP_BremsenTemp_hinten 0 "Temp_kleiner_99GradC" 1 "Temp_zwischen_100-199GradC" 2 "Temp_zwischen_200-299GradC" 3 "Temp_zwischen_300-399GradC" 4 "Temp_zwischen_400-499GradC" 5 "Temp_zwischen_500-599GradC" 6 "Temp_groesser_599GradC" 7 "Fehler" ; +VAL_ 924 BCM1_02_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 Wischer_01_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 Klima_02_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 BCM1_01_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 ESP_07_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 TSG_BT_1_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 TSG_HL_1_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 TSG_HR_1_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 Motor_02_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 Klima_Sensor_02_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 TSG_FT_1_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 Motor_05_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 QSP_01_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 Parkhilfe_01_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 Fahrwerk_02_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 924 BCM1_MH_WIV_Schalter 0 "MH_geschlossen" 1 "MH_offen" ; +VAL_ 924 Wischer_vorne_aktiv 1 "Wischer vorne līŋŊuft" ; +VAL_ 924 BCM1_Rueckfahrlicht_Schalter 0 "aus" 1 "betaetigt" ; +VAL_ 924 MO_Status_Normalbetrieb_01 0 "kein Normalbetrieb" 1 "Normalbetrieb erreicht" ; +VAL_ 924 KL_Zuheizer_Freigabe 0 "keine_Freigabe_Zuheizer" 1 "Zuheizerfreigabe" ; +VAL_ 924 BCM1_Vorwaertsgang_eingelegt 0 "Rueckwaertsgang bzw. restliche Gaenge eingelegt" 1 "Erster oder zweiter Gang eingelegt" ; +VAL_ 924 ESP_Codierung_ADS 0 "Init" 1 "ESP_nicht_ADS_codiert" 2 "ADS_codiert" 3 "tbd" ; +VAL_ 924 QSP_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ; +VAL_ 924 FA_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ; +VAL_ 924 PH_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ; +VAL_ 924 KL_Beschlagsgefahr 0 "keine_Beschlagsgefahr" 1 "Beschlagsgefahr" ; +VAL_ 924 BCM1_GLW_Fernlicht_Anf 0 "Aus" 1 "Ein" ; +VAL_ 924 BCM1_RFahrlicht_Fzg_Anf 0 "Licht_nicht_angefordert" 1 "Licht ist einzuschalten" ; +VAL_ 924 FT_Tuer_geoeffnet 1 "Tuer offen" ; +VAL_ 924 MO_Handshake_STH 0 "keine EKP-Ansteuerung durch STH-Anforderung" 1 "EKP-Ansteuerung durch STH-Anforderung" ; +VAL_ 924 FT_Sperrklinke 0 "Schloss_in_Vorraste_und_Hauptraste" 1 "Tuer_auf_oder_Tuer_Position_zwischen_Vor_und_Hauptraste" ; +VAL_ 924 BCM1_OBD_FStatus_ATemp 0 "kein Fehler" 1 "KS-" 2 "KS+" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (out of range high)" 5 "OOR- (out of range low)" 6 "RC+ (Signal unplausibel hoch)" 7 "RC- (Signal unplausibel niedrig)" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC (allgemeiner Fehler)" ; +VAL_ 924 BCM1_Aussen_Temp_ungef 253 "nicht verbaut" 254 "Initwert" 255 "Fehler" ; +VAL_ 924 BCM1_Oeldruck_Schalter 0 "offen" 1 "geschlossen (p > p soll)" ; +VAL_ 924 BCM1_Oeldruck_Schalter_2 0 "offen" 1 "geschlossen" ; +VAL_ 924 BT_Tuer_geoeffnet 1 "Tuer_offen" ; +VAL_ 924 HL_Tuer_geoeffnet 1 "Tuer geoeffnet" ; +VAL_ 924 HR_Tuer_geoeffnet 1 "Tuer offen" ; +VAL_ 924 BCM1_Adaptive_Lichtvert_Anf 0 "Aus" 1 "Ein" ; +VAL_ 924 BCM1_Gleitende_Leuchtw_Anf 0 "Aus" 1 "Ein" ; +VAL_ 924 BCM1_Schalter_StartStopp 0 "Start_Stopp_ueber_Hauptschalter_deaktiviert" 1 "Start_Stopp_ueber_Hauptschalter_aktiviert" ; +VAL_ 924 ESP_Offroad_Modus 0 "kein_ESP_Offroadmodus" 1 "ESP_Offroadmodus" ; +VAL_ 924 MO_Freig_Reku 0 "Rekuperations-Modus aus" 1 "Empfehlung Spannungsanhebung" 2 "Empfehlung Spannungsabsenkung" 3 "Rekuperationsmodus aktiv, Spannungsvariation nicht notwendig" ; +VAL_ 1604 SMLS_01_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 1604 BCM1_01_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 1604 BCM1_02_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 1604 BCM2_02_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 1604 HYB_Anf_E_Mode_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 1604 ESP_04_alt 0 "aktuell" 1 "veraltet" ; +VAL_ 1604 BH_Blinker_li 0 "nicht_betaetigt" 1 "Blinkerhebel_Richtung_links_betaetigt" ; +VAL_ 1604 BH_Blinker_re 0 "nicht_betaetigt" 1 "Blinkerhebel_Richtung_rechts_betaetigt" ; +VAL_ 1604 BM_Autobahn 0 "Autobahnblinken nicht aktiv " 1 "Autobahnblinken aktiv " ; +VAL_ 1604 BH_Fernlicht 0 "nicht_betaetigt" 1 "Blinkerhebel_in_Richtung_Fernlicht_betaetigt" ; +VAL_ 1604 BH_Lichthupe 0 "nicht_betaetigt" 1 "Blinkerhebel in Richtung Lichthupe betaetigt" ; +VAL_ 1604 BCM1_MH_Schalter 0 "MH_geschlossen" 1 "MH_offen" ; +VAL_ 1604 HYB_Anf_E_Mode 0 "Taster_nicht_betaetigt" 1 "Taster_betaetigt" ; +VAL_ 1604 HUD_NV_in_Anzeige 0 "NV_nicht_in_Anzeige" 1 "NV_in_Anzeige" ; +VAL_ 1604 BCM1_Touristen_Licht_Anf 0 "Licht_nicht_angefordert" 1 "Anforderung von Touristenlicht" ; +VAL_ 1604 LV_Abblendlicht_li_def 0 "OK" 1 "defekt" ; +VAL_ 1604 LV_Abblendlicht_re_def 0 "OK" 1 "defekt" ; +VAL_ 1604 LV_Abblendlicht_Anzeige 0 "nicht aktiv" 1 "aktiv" ; +VAL_ 1604 LV_AFL_aktiv_Anzeige 0 "nicht aktiv" 1 "aktiv" ; +VAL_ 1604 BCM1_Licht_Dunkelheit_aktiv 1 "Licht wegen Dunkelheit aktiv, nicht bei Autobahnlicht, Tagfahrlicht oder Regenlicht" ; +VAL_ 1604 LV_Nebelschlusslicht_Anzeige 0 "nicht aktiv" 1 "aktiv" ; +VAL_ 1604 BCM1_Linksverkehr 0 "Rechtsverkehr" 1 "Linksverkehr" ; +VAL_ 1604 BCM2_P_verriegelt 0 "WH nicht in Stellung P" 1 "WH in Stellung P" ; +VAL_ 1604 BCM1_LDS_Stellung 0 "Init" 1 "Stellung_0" 2 "Auto" 3 "Standlicht" 4 "Abblendlicht" 7 "Fehler" ; +VAL_ 1604 BCM1_Allwetterlicht_Anf 0 "Licht_nicht_angefordert" 1 "Licht_ist_einzuschalten" ; +VAL_ 1604 HUD_Anzeigefehler_NV 0 "kein_Fehler" 1 "Anzeigefehler" ; +VAL_ 1604 ESP_Diagnose 0 "ESP_nicht_in_Diagnose" 1 "ESP_in_Diagnose" ; +VAL_ 130 GE_Schaltvorgang 0 "keine Schaltung" 1 "Schaltung aktiv" ; +VAL_ 130 GE_Status_Kupplung 0 "Kupplung geīŋŊffnet" 1 "Kupplung geregelt" 2 "Kupplung geschlossen" 3 "Fehler" ; +VAL_ 130 GE_Verbot_Ausblendung 0 "kein_Verbot" 1 "Verbot" ; +VAL_ 130 GE_MMom_Soll 1022 "kein Eingriff" 1023 "Fehler" ; +VAL_ 130 GE_MMom_Status 0 "keine Anforderung" 1 "reduzierender Getriebeeingriff" 2 "erhīŋŊhender Getriebeeingriff" 3 "īŋŊnderung mit Sprung" ; +VAL_ 130 GE_MMom_Vorhalt 1022 "keine_Anforderung" 1023 "Fehler" ; +VAL_ 130 GE_Freig_MMom_Vorhalt 0 "nicht_freigegeben" 1 "freigegeben" ; +VAL_ 130 GE_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 131 GE_Anf_Zylabsch 0 "Umschaltung erlaubt" 1 "Umschaltung verboten" 3 "VMB-Empfehlung" ; +VAL_ 131 GE_Synchro_Wunschdrehz 511 "Fehler" ; +VAL_ 131 GE_Synchro_Zeit 255 "Fehler" ; +VAL_ 131 GE_Mom_Begr_Gradient 255 "keine Begrenzung (Init)" ; +VAL_ 131 GE_Anheb_Solldrehz_Leerlauf 255 "Fehler" ; +VAL_ 131 GE_Vorsteuermoment 510 "Init" 511 "Fehler" ; +VAL_ 131 GE_Drehzahlmesser_Daempfung 0 "normale DīŋŊmpfung" 1 "dynamische DīŋŊmpfung" ; +VAL_ 131 GE_Schubabschalt_Unt 0 "inaktiv" 1 "aktiv" ; +VAL_ 131 GE_Freigabe_Synchro 0 "inaktiv" 1 "aktiv" ; +VAL_ 131 GE_HYB_DZ_Eingriff 0 "kein_Drehzahleingriff" 1 "Slip_Start" 2 "Low_Speed_Modus" ; +VAL_ 258 GE_Freig_Langfr_Schutzmom 0 "nicht freigegeben" 1 "freigegeben" ; +VAL_ 258 GE_Uefkt 1023 "Fehler" ; +VAL_ 258 GE_Zielgang 0 "Gang P/N (ausgekuppelt)" 1 "Gang 1" 2 "Gang 2" 3 "Gang 3" 4 "Gang 4" 5 "Gang 5" 6 "Gang 6" 7 "Gang 7" 8 "Gang R" 11 "Gang 8" 12 "Gang 9" 14 "Istgang nicht definiert" 15 "Fehler" ; +VAL_ 258 GE_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ; +VAL_ 258 GE_Langfr_Schutzmom 1022 "Init" 1023 "Fehler" ; +VAL_ 258 GE_Waehlhebel 0 "UNDEFINED" 1 "INIT" 5 "P" 6 "R" 7 "N" 8 "D" 9 "S" 10 "E" 13 "T" 14 "T" ; +VAL_ 258 GE_Eingangsdrehz 16382 "Init" 16383 "Fehler" ; +VAL_ 258 GE_Notlauf 0 "kein Notlauf / Init" 1 "Getriebe im Notlauf" ; +VAL_ 258 GE_Codierung_MSG 0 "Codierung iO / Init" 1 "Codierung niO" ; +VAL_ 1089 GE_Index_Fahrwid 255 "Fehler" ; +VAL_ 1089 GE_Heizwunsch 0 "maximaler_Waermebedarf" 1 "kein_Waermebedarf" 2 "Kuehlbedarf" 3 "Notfall_(maximaler_Kuehlbedarf)" ; +VAL_ 1089 GE_OBD_Status 0 "MIL aus" 1 "MIL ein" ; +VAL_ 1089 GE_LFR_Adaption 0 "fuer_Adaption_geeignet" 1 "fuer_Adaption_nicht_geeignet" ; +VAL_ 1089 GE_OBD_AbsperrVent 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1089 GE_Grenzkriechmoment 62 "Init" 63 "Fehler" ; +VAL_ 1089 GE_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 1089 GE_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ; +VAL_ 1089 GE_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ; +VAL_ 1089 GE_Freigabe_Verfallsinfo_WFS 0 "aus" 1 "ein" ; +VAL_ 1089 GE_Verlustmoment 255 "Fehler" ; +VAL_ 1089 GE_amax_moeglich 511 "Wert ist nicht definiert" ; +VAL_ 1089 GE_Sumpftemperatur 255 "Fehler" ; +VAL_ 1424 KY_Funkschl_Nr 0 "kein authorisierter Schluessel erkannt" 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "ungueltig_15" ; +VAL_ 1424 KY_ID_Geb_autorisiert 0 "Schluessel_nicht_authorisiert" 1 "Schluessel authorisiert" ; +VAL_ 1424 KY_ID_Geb_steckt 0 "kein_Schluessel_im_Zuendschloss" 1 " Schluessel steckt im Zuendschloss" ; +VAL_ 1424 KY_FFB_Frequenz 1 "433 MHz" 2 "315 MHz" 3 "868 MHz" ; +VAL_ 1424 KY_HF_Aktiv 0 "Funktempfang_nicht_aktiv" 1 "HF_Funkempfang_aktiv" ; +VAL_ 1424 KY_LF_Aktiv 0 "Funktempfang_nicht_aktiv" 1 "LF_Funkempfang_aktiv" ; +VAL_ 1424 KY_ELV_verr 0 "ELV_nicht_verriegelt" 1 "ELV verriegelt" ; +VAL_ 1424 KY_ELV_entr 0 "ELV_nicht_entriegelt" 1 "ELV entriegelt" ; +VAL_ 1424 KY_ELV_enable_Anforderung 0 "Freigabe_nicht_angefordert" 1 "Freigabe ELV wird angefordert" ; +VAL_ 1424 KY_Valet_Parking 0 "kein_Valet_Schluessel_erkannt" 1 "Valet Schluessel erkannt" ; +VAL_ 1424 KY_Keyless_Verbau 0 "kein_Keyless_verbaut" 1 "Keyless verbaut" ; +VAL_ 1424 FBS_Warn_Lenkung_def 0 "iO" 1 "defekt" ; +VAL_ 1424 FBS_Warn_LenkVerriegelung_def 0 "i.O." 1 "defekt" ; +VAL_ 1424 FBS_Warn_Schluessel_Batt 0 "i.O." 1 "defekt" ; +VAL_ 1424 FBS_Prio_Warn_04 1 "Kombi Prio Warnung FBS 4" ; +VAL_ 1424 FBS_Prio_Warn_05 1 "Kombi Prio Warnung FBS 5" ; +VAL_ 1424 KYL_Warn_kein_Schluessel 1 "kein Schluessel erkannt" ; +VAL_ 1424 KYL_Warn_Kessy_defekt 0 "Kessy_i.O." 1 "Kessy defekt" ; +VAL_ 1424 KY_KYL_Prio_Warn_03 1 "Kombi Prio Warnung Keyless 3" ; +VAL_ 1424 KY_KYL_Prio_Warn_04 1 "Kombi Prio Warnung Keyless 4" ; +VAL_ 1424 KY_KYL_Prio_Warn_05 1 "Kombi Prio Warnung Keyless 5" ; +VAL_ 1424 KY_WFS_Safe 1 "WFS nicht deaktiviert" ; +VAL_ 1424 KY_WFS_LZ 0 "nicht def." 1 "LZ 1" 2 "LZ 2" 3 "LZ 3" ; +VAL_ 1424 KY_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ; +VAL_ 1424 KYL_Notzuendschloss 0 "nicht_verbaut" 1 "verbaut" ; +VAL_ 1424 KYL_Warn_Notzuendschloss 0 "Aus" 1 "Ein" ; +VAL_ 1424 FBS_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 960 ZV_verriegelt_extern_soll_02 1 "Fahrzeug verriegelt extern; Sollzusstand" ; +VAL_ 960 ZAS_Kl_S 0 "aus" 1 "S_Kontakt_ein" ; +VAL_ 960 ZAS_Kl_15 0 "aus" 1 "ein" ; +VAL_ 960 ZAS_Kl_X 0 "aus" 1 "ein" ; +VAL_ 960 ZAS_Kl_50 0 "aus" 1 "KL50_ein_Startwunsch_Fahrer" ; +VAL_ 959 KL_Drehz_Anh 0 "keine_Anhebung" 1 "Drehzahlanhebung_vom_Motor_angefordert" ; +VAL_ 959 KL_Vorwarn_Komp_ein 1 "Vorwarnung Kompressor ein" ; +VAL_ 959 KL_Handshake_BEM 0 "keine_Leistungsaenderung_in_den_Heizsystemen_aktiv" 1 "Heizleistungsaenderung_wird_gerade_durchgefuehrt" ; +VAL_ 959 KL_Komp_Moment_alt 1 "veraltet_bzw_Ermittlung_des_Moments_nicht_moeglich__zB_keine_Drehzahl_kein_Kaeltemitteldruck" ; +VAL_ 959 KL_Vorwarn_HHS_ein 1 "Vorwarnung_Heckscheibenheizung_ein" ; +VAL_ 959 KL_Vorwarn_HFS_ein 1 "Vorwarnung_Frontscheibenheizung_ein" ; +VAL_ 959 KL_Vorwarn_Zuheizer_ein 1 "Vorwarnung_Zuheizer_ein" ; +VAL_ 959 KL_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 959 KL_Comp_rev_rq 255 "Fehler" ; +VAL_ 959 KL_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 959 KL_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ; +VAL_ 959 KL_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ; +VAL_ 959 KL_Last_Kompr 255 "Fehler" ; +VAL_ 959 KL_Anf_KL 255 "Fehler" ; +VAL_ 959 KL_4_Zonen 0 "2_Zonen_Klimaanlage" 1 "4_Zonen_Klimaanlage" ; +VAL_ 959 KL_AC_Schalter 0 "aus" 1 "ein" ; +VAL_ 959 KL_Zustand 0 "aus" 1 "ein" ; +VAL_ 959 KL_Thermomanagement 0 "keine_Freigabe_TMM__max_Heizbedarf" 1 "kleine_Freigabe_TMM" 2 "mittlere_Freigabe_TMM" 3 "volle_Freigabe_TMM__kein_Heizbedarf" ; +VAL_ 959 KL_Comp_enable 0 "Disable" 1 "Enable" ; +VAL_ 959 KL_StartStopp_Info 0 "Motorlauf_nicht_notwendig_(Stoppfreigabe)" 1 "Motoranlauf_nicht_zwingend_notwendig_(Stoppverbot,keine_Startanforderung)" 2 "Motoranlauf_zwingend_notwendig_(Startanforderung)" 3 "Systemfehler" ; +VAL_ 959 KL_Diag_Absperrvent 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" ; +VAL_ 779 KBI_ABS_Lampe 0 "ABS Lampe aus" 1 "ABS Lampe ein" ; +VAL_ 779 KBI_ESP_Lampe 0 "ESP Lampe aus" 1 "ESP Lampe ein" ; +VAL_ 779 KBI_BKL_Lampe 0 "BKL aus" 1 "BKL ein" ; +VAL_ 779 KBI_Airbag_Lampe 0 "Airbag Lampe aus" 1 "Airbag Lampe ein" ; +VAL_ 779 KBI_SILA_gueltig 0 "ungueltig" 1 "gueltig" ; +VAL_ 779 KBI_Vorglueh_System_Lampe 0 "Lampe aus" 1 "Lampe ein" ; +VAL_ 779 KBI_NV_in_Anzeige 0 "NV_nicht_in_Anzeige" 1 "NV_in_Anzeige" ; +VAL_ 779 KBI_Anzeigestatus_ACC 0 "keine_ACC_Anzeige" 1 "ACC_Anzeige_aktiv" ; +VAL_ 779 KBI_Tankwarnung 0 "Lampe aus" 1 "Lampe ein" ; +VAL_ 779 KBI_MFA_v_Einheit_01 0 "kmh" 1 "mph" ; +VAL_ 779 KBI_im_Stellgliedtest 0 "kein Stellgliedtest" 1 "Kombi im Stellgliedtest" ; +VAL_ 779 KBI_Anzeigefehler_LDW 0 "nicht vorhanden bzw. unterstīŋŊtzt" 1 "Anzeige iO" 2 "Anzeigefehler" 3 "nicht definiert" ; +VAL_ 779 KBI_Variante_USA 0 "keine USA-Variante" 1 "USA-Variante" ; +VAL_ 779 KBI_Oeldruckwarnung 0 "inaktiv" 1 "aktiv" ; +VAL_ 779 KBI_Handbremse 0 "nicht_angezogen" 1 "angezogen" ; +VAL_ 779 KBI_PLA_in_Anzeige 0 "PLA_nicht_in_Anzeige" 1 "PLA_in_Anzeige" ; +VAL_ 779 KBI_Anzeigefehler_NV 0 "kein_Anzeigefehler" 1 "Anzeigefehler" ; +VAL_ 779 KBI_Einheit_Tacho 0 "km/h" 1 "mph" ; +VAL_ 779 KBI_Konsistenz_ACC 0 "ACC Botschaft konsistent" 1 "ACC Botschaft inkonsistent " ; +VAL_ 779 KBI_Fehler_Anzeige_ACC 0 " iO" 1 "Anzeigefehler ACC" ; +VAL_ 779 KBI_Anzeigefehler_SWA 0 "nicht vorhanden bzw. unterstīŋŊtzt" 1 "Anzeige iO" 2 "Anzeigefehler" 3 "nicht definiert" ; +VAL_ 779 KBI_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1719 KBI_Kilometerstand 1048574 "Init" 1048575 "Fehler" ; +VAL_ 1719 KBI_Reset_Standzeit 0 "Standzeit iO" 1 "KL30 war weg" ; +VAL_ 1719 KBI_Inhalt_Tank 127 "Fehler" ; +VAL_ 1719 KBI_FStatus_Tank 0 "TankfīŋŊllstand i.O." 1 "TankfīŋŊllstand n.i.O" ; +VAL_ 1719 KBI_QBit_Aussen_Temp_gef 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 1719 KBI_Aussen_Temp_gef 253 "nicht verbaut" 254 "Init" 255 "Fehler" ; +VAL_ 1720 WFS_Schluessel_Fahrberecht 0 "kein authorisierter Schluessel erkannt " 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "ungueltig_15" ; +VAL_ 1720 KBI_BCmE_aktiv 0 "Anzeige_nicht_aktiv" 1 "Anzeige_aktiv" ; +VAL_ 1720 KBI_Sparhinweis_quittiert 0 "nicht_quittiert" 1 "quittiert" ; +VAL_ 285 EPS_Notlauf 0 "kein_Notlauf" 1 "Notlauf_Unterspannung" 2 "Notlauf_Ueberspannung" 3 "reserviert" 4 "Notlauf_Uebertemperatur" 5 "Notlauf_Unterspannung_und_Uebertemperatur" 6 "Notlauf_Ueberspannung_und_Uebertemperatur" 7 "reserviert" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "reserviert" 15 "reserviert" ; +VAL_ 285 EPS_Lastinfo 255 "Fehler" ; +VAL_ 285 EPS_Unterstuetzungsleistung 255 "Fehler" ; +VAL_ 285 EPS_Drehzahlreserve 127 "Fehler" ; +VAL_ 285 EPS_VZ_Drehzahlreserve 0 "positiv" 1 "negativ" ; +VAL_ 285 EPS_Leistungsanforderung 0 "keine_Anforderung" 1 "Anforderung_hoehere_Spannung_oder_Leistung" ; +VAL_ 1137 BCM2_Bremsl_durch_ECD 0 "Bremslicht_ist_aus" 1 "Bremslicht_durch_ECD_aktiv" ; +VAL_ 1137 LH_Aussenlicht_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_Standlicht_H_aktiv 1 "Standlicht hinten aktiv" ; +VAL_ 1137 LH_Parklicht_HL_aktiv 0 "nicht aktiv" 1 "Parklicht hinten links aktiv" ; +VAL_ 1137 LH_Parklicht_HR_aktiv 0 "nicht aktiv" 1 "Parklicht hinten rechts aktiv" ; +VAL_ 1137 LH_Bremslicht_H_aktiv 1 "Bremslicht hinten aktiv" ; +VAL_ 1137 LH_Nebelschluss_aktiv 0 "nicht aktiv" 1 "aktiv" ; +VAL_ 1137 LH_Rueckfahrlicht_aktiv 0 "nicht aktiv" 1 "aktiv" ; +VAL_ 1137 LH_Blinker_HL_akt 1 "Blinker hinten links aktiv" ; +VAL_ 1137 LH_Blinker_HR_akt 1 "Blinker hinten rechts aktiv" ; +VAL_ 1137 LH_Blinker_li_def 0 "OK" 1 "Blinker hinten links defekt" ; +VAL_ 1137 LH_Bremsl_li_def 0 "OK" 1 "mindestens ein Bremslicht hinten links defekt" ; +VAL_ 1137 LH_Schlusslicht_li_def 0 "OK" 1 "mindestens ein Schlusslicht hinten links defekt" ; +VAL_ 1137 LH_Rueckf_li_def 0 "OK" 1 "RīŋŊckfahrlicht hinten links defekt" ; +VAL_ 1137 LH_Nebel_li_def 0 "OK" 1 " Nebelschlusslicht hinten links defekt" ; +VAL_ 1137 LH_Schluss_Brems_Nebel_li_def 0 "iO" 1 "defekt" ; +VAL_ 1137 LH_Schluss_Brems_Nebel_re_def 0 "iO" 1 "defekt" ; +VAL_ 1137 LH_Schluss_Brems_li_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_Schluss_Nebel_li_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_SL_BRL_BLK_li_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_Brems_Blk_li_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_Blinker_re_def 0 "OK" 1 "Blinker hinten rechts defekt" ; +VAL_ 1137 LH_Bremsl_re_def 0 "OK" 1 "mindestens ein Bremslicht hinten rechts defekt" ; +VAL_ 1137 LH_Schlusslicht_re_def 0 "OK" 1 "mindestens ein Schlusslicht hinten rechts defekt" ; +VAL_ 1137 LH_Rueckf_re_def 0 "OK" 1 "RīŋŊckfahrlicht hinten rechts defekt" ; +VAL_ 1137 LH_Nebel_re_def 0 "OK" 1 "Nebelschlusslicht hinten rechts defekt" ; +VAL_ 1137 LH_Schluss_Brems_re_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_Schluss_Nebel_re_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_SL_BRL_BLK_re_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_Brems_Blk_re_def 0 "OK" 1 "defekt" ; +VAL_ 1137 LH_Kennzl_def 0 "OK" 1 "Kennzeichenbeleuchtung hinten defekt" ; +VAL_ 1137 LH_3_Bremsl_def 0 "OK" 1 "hochgesetzte Bremsleuchte defekt" ; +VAL_ 1137 LH_Nebel_mi_def 0 "OK" 1 " Nebelschlusslicht hinten Mitte defekt" ; +VAL_ 1137 LH_Rueckf_mi_def 0 "OK" 1 "RīŋŊckfahllicht Mitte defekt" ; +VAL_ 1137 LH_Bremsl_li_ges_def 0 "OK" 1 "Alle Bremslichter hinten links defekt" ; +VAL_ 1137 LH_Bremsl_re_ges_def 0 "OK" 1 "Alle Bremslichter hinten rechts defekt" ; +VAL_ 267 LS_Hauptschalter 0 "Gerastet Aus" 1 "Ein" ; +VAL_ 267 LS_Abbrechen 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ; +VAL_ 267 LS_Typ_Hauptschalter 0 "gerasteter_Lenkstockschalter" 1 "getasteter_Lenkstockschalter" ; +VAL_ 267 LS_Limiter 0 "Limiter aus" 1 "Limiter ein" ; +VAL_ 267 LS_Tip_Setzen 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ; +VAL_ 267 LS_Tip_Hoch 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ; +VAL_ 267 LS_Tip_Runter 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ; +VAL_ 267 LS_Tip_Wiederaufnahme 0 "Tippschalter nicht betaetigt" 1 "Tippschalter betaetigt" ; +VAL_ 267 LS_Verstellung_Zeitluecke 0 "Taste nicht betaetigt" 1 "Dist -1" 2 "Dist +1" 3 "nicht belegt" ; +VAL_ 267 MFL_Tip_Down 0 "nicht_betaetigt" 1 "betaetigt" ; +VAL_ 267 MFL_Tip_Up 0 "nicht_betaetigt" 1 "betaetigt" ; +VAL_ 267 LS_Tiptronic_Fehler 0 " i. O." 1 "Fehler erkannt" ; +VAL_ 267 LS_Codierung 0 "kein Hebel, keine Tiptronic am Lenkrad" 1 "kein Hebel, Tiptronic am Lenkrad" 2 "GRA Hebel, keine Tiptronic am Lenkrad" 3 "GRA Hebel, Tiptronic am Lenkrad" 4 "ACC Hebel, keine Tiptronic am Lenkrad" 5 "ACC Hebel, Tiptronic am Lenkrad" 6 "nicht verwendet" 7 "nicht verwendet" ; +VAL_ 267 LS_Tip_Stufe_2 0 "Hebelbetaetigung_in_erster_Tipstufe__Keine_Hebelbetaetigung" 1 "Hebelbetaetigung_in_der_zweiten_Tipstufe" ; +VAL_ 267 LS_GRA_ACC_2stufig 0 "kein_zweistufiger_Hebel_verbaut" 1 "zweistufiger_Hebel_verbaut" ; +VAL_ 267 MFL_M_Taste 0 "nicht_betaetigt" 1 "betaetigt" ; +VAL_ 134 LWI_Sensorstatus 0 "iO" 1 "nicht kalibriert" ; +VAL_ 134 LWI_QBit_Sub_Daten 0 "LWS-Subinfo 'real' (Lenkradwinkelinformation ADS-tauglich) " 1 "LWS-Subinfo 'simuliert' (Lenkradwinkelinformation nicht ADS-tauglich )" ; +VAL_ 134 LWI_QBit_Lenkradwinkel 0 "gīŋŊltiger Wert" 1 "ausserhalb der Spezifikation" ; +VAL_ 134 LWI_Lenkradwinkel 8190 "Init" 8191 "Fehler" ; +VAL_ 134 LWI_VZ_Lenkradwinkel 0 "positiv_links_von_der_Nullstellung" 1 "negativ" ; +VAL_ 134 LWI_VZ_Lenkradw_Geschw 0 "positiv_links_von_der_Nullstellung" 1 "negativ" ; +VAL_ 134 LWI_Lenkradw_Geschw 510 "Init" 511 "Fehler" ; +VAL_ 128 MO_Mom_o_ex 1022 "Init" 1023 "Fehler" ; +VAL_ 128 MO_Mom_m_ex 1022 "Init" 1023 "Fehler" ; +VAL_ 128 MO_Mom_Verlust 1022 "Init" 1023 "Fehler" ; +VAL_ 128 MO_Mom_Begrenzung 1022 "Init" 1023 "Fehler" ; +VAL_ 128 MO_Mom_Fahrerwunsch 1022 "Init" 1023 "Fehler" ; +VAL_ 128 MO_Kickdown 0 "kein Kickdown" 1 "Kickdown" ; +VAL_ 128 MO_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 129 MO_Mom_ZWR 1022 "Init" 1023 "Fehler" ; +VAL_ 129 MO_Mom_Soll 1022 "Init" 1023 "Fehler" ; +VAL_ 129 MO_Mom_Ist 1022 "Init" 1023 "Fehler" ; +VAL_ 129 MO_Status_Zylabschalt_01 0 "alle Zylinder brennen" 1 "mindestens ein Zylinder wurde abgeschaltet" ; +VAL_ 129 MO_Status_Normalbetrieb_01 0 "kein Normalbetrieb" 1 "Normalbetrieb erreicht" ; +VAL_ 129 MO_StartStopp_Status 0 "System_in_diesem_KL15_Zyklus_nicht_verfuegbar" 1 "System_aktiv_keine_Freigabe_durch_StartStop_Koordinator" 2 "System_aktiv_alle Freigaben_liegen_vor" 3 "System_aktiv_mindestens_eine_Freigabe_fehlt" ; +VAL_ 129 MO_StartStopp_Motorstopp 0 "Motor_Stop_inaktiv" 1 "Motor_Stop_aktiv" ; +VAL_ 129 MO_StartStopp_Wiederstart 0 "Wiederstart_inaktiv" 1 "Wiederstart_aktiv" ; +VAL_ 129 MO_Ext_E_Fahrt_aktiv 0 "Rueckmeldung_E_Taster_aus " 1 "Rueckmeldung_E_Taster_ein" ; +VAL_ 129 MO_Gangposition 0 "Gang_N" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" 7 "Gang_7" 8 "Gang_8" 12 "Zwischengangstellung" 13 "Gang_R" 14 "Istgang_nicht_definiert" 15 "Fehler" ; +VAL_ 129 MO_StartStopp_Fahrerwunsch 0 "Init" 1 "Stoppverbot_durch_Fahrer" 2 "Stoppfreigabe_durch_Fahrer" 3 "Stoppanforderung_durch_Fahrer" ; +VAL_ 261 MO_QBit_Fahrpedalwerte_01 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 261 MO_QBit_Motormomente 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 261 MO_QBit_Fahrer_bremst 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 261 MO_QBit_Drehzahl_01 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 261 MO_Drehzahl_01 65535 "Fehler" ; +VAL_ 261 MO_Moment_im_Leerlauf 0 "kein_Leergas" 1 "Leergas" ; +VAL_ 261 MO_Interlock 0 "Interlockschalter nicht betīŋŊtigt" 1 "Interlockschalter betīŋŊtigt" ; +VAL_ 261 MO_BLS 0 "kein Bremsen" 1 "Bremse betīŋŊtigt" ; +VAL_ 261 MO_Fahrer_bremst 0 "kein Bremsen" 1 "Bremse betīŋŊtigt" ; +VAL_ 261 MO_Konsistenz_Bremsped 0 "Bremspedalinformation_plausibel" 1 "Bremspedalinformation_unplausibel" ; +VAL_ 261 MO_Kuppl_schalter 0 "Schalter sagt nicht betīŋŊtigt (Eingekuppelt)" 1 "Schalter sagt betīŋŊtigt (Ausgekuppelt)" ; +VAL_ 261 MO_Timeout_ESP 0 "Empfang i.O." 1 "Timeout" ; +VAL_ 261 MO_Motor_laeuft 0 "Motor līŋŊuft nicht" 1 "Motor līŋŊuft autark und stabil und darf mechanisch belastet werden" ; +VAL_ 261 MO_Solldrehz_Leerlauf 255 "Fehler" ; +VAL_ 261 MO_Fahrpedalrohwert_01 255 "Fehler" ; +VAL_ 261 MO_erste_Ungenauschwelle 0 "genau" 1 "Momente ungenauer >8%" ; +VAL_ 261 MO_QBit_Stressfaktor 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 263 MO_Istgang 0 "kein_Gang_eingelegt" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" ; +VAL_ 263 MO_Sollgang 0 "keine_Empfehlung" 1 "Gang_1" 2 "Gang_2" 3 "Gang_3" 4 "Gang_4" 5 "Gang_5" 6 "Gang_6" ; +VAL_ 263 MO_Oeldruck 255 "Fehler" ; +VAL_ 263 MO_Anzeigedrehz 4095 "Fehler" ; +VAL_ 263 MO_Schaltempf_verfbar 0 "nicht_verfuegbar" 1 "verfuegbar" ; +VAL_ 263 MO_Ladedruck 511 "Fehler" ; +VAL_ 263 MO_KVS_Ueberlauf 0 "kein Ueberlauf" 1 "Kraftstoffverbrauchsignale mindestens 1x īŋŊbergelaufen" ; +VAL_ 782 MO_EKlKomLeiRed 0 "keine_Leistungsbegr" 1 "Leistungsbegr_75" 2 "Leistungsbegr_50" 3 "Leistungsbegr_25" ; +VAL_ 782 MO_Freig_Reku 0 "Rekuperations-Modus aus" 1 "Empfehlung Spannungsanhebung" 2 "Empfehlung Spannungsabsenkung" 3 "Rekuperationsmodus aktiv, Spannungsvariation nicht notwendig" ; +VAL_ 782 MO_Klima_Eingr 0 "kein Eingriff" 1 "Klimakompressor ausschalten" 2 "Klimakompressor Leistungsreduzierung" 3 "Klimakompressor aufgrund der Heissleuchtenvorwarnung ausschalten" ; +VAL_ 782 MO_Status_Normalbetrieb_02 0 "kein Normalbetrieb" 1 "Normalbetrieb erreicht" ; +VAL_ 782 MO_Prio_MIN_Wunschdrehzahl 0 "Wunsch" 1 "Zwang" ; +VAL_ 782 MO_Freig_Anlass 0 "Start nicht zulīŋŊssig" 1 "Startfreigabe" ; +VAL_ 782 MO_Aussp_Anlass 0 "Motor līŋŊuft nicht stabil" 1 "Anlasser ausspuren (Motor līŋŊuft stabil)" ; +VAL_ 782 MO_MAX_Wunschdrehzahl 511 "Fehler" ; +VAL_ 782 MO_Prio_MAX_Wunschdrehzahl 0 "Wunsch" 1 "Zwang" ; +VAL_ 782 MO_Luftpfad_aktiv 0 "kein Eingriff oder nur Eingriff īŋŊber ZīŋŊndpfad" 1 "Eingriff īŋŊber Luftpfad" ; +VAL_ 782 MO_v_Begrenz_Aktiv 0 "inaktiv" 1 "aktiv" ; +VAL_ 782 MO_v_Begrenz_Aktivierbar 0 "V-Begrenzung nicht mīŋŊglich" 1 "V-Begrenzung mīŋŊglich" ; +VAL_ 782 MO_Verbot_EKP 0 "Ansteuerung zugelassen" 1 "Ansteuerung verboten" ; +VAL_ 782 MO_Anf_Pruefimpuls 0 "keine Anforderung" 1 "Anforderung" ; +VAL_ 782 MO_Anf_KL75 0 "Anforderung KL75 ausschalten" 1 "Anforderung KL75 einschalten" ; +VAL_ 782 MO_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 782 MO_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ; +VAL_ 782 MO_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ; +VAL_ 782 MO_Handshake_STH 0 "keine EKP-Ansteuerung durch STH-Anforderung" 1 "EKP-Ansteuerung durch STH-Anforderung" ; +VAL_ 782 MO_MIN_Wunschdrehzahl 255 "Fehler" ; +VAL_ 1088 MO_Kuehlerluefter_MUX 0 "Kuehlerluefter_1" 1 "Kuehlerluefter_2" ; +VAL_ 1088 MO_Kuehlerluefter_1 126 "Init" 127 "Fehler" ; +VAL_ 1088 MO_Kuehlerluefter_2 126 "Init" 127 "Fehler" ; +VAL_ 1088 MO_HYB_Status_HV_Ladung 0 "HV-Ladung_nicht_notwendig" 1 "HV-Ladung_notwendig_Freigaben_erforderlich" 2 "HV-Ladung laeuf" 3 "HV-Ladung_erfolgreich_Motorstart_moeglich" 4 "HV_Ladung_abgebrochen" ; +VAL_ 1088 WIV_Anzeige_aktiv 0 "Anzeige aus" 1 "WIV Anzeige aktiv" ; +VAL_ 1088 WIV_Oelmin_Warn 0 "in_Ordnung" 1 "Warnung" ; +VAL_ 1088 WIV_Sensorfehler 0 "in_Ordnung" 1 "Sensor_defekt" ; +VAL_ 1088 WIV_Schieflage 0 "Fahrzeug_gerade" 1 "Fahrzeug_in_Schieflage" ; +VAL_ 1088 MO_Zustand_HWP 0 "HWP_nicht_schaltbar" 1 "HWP_foerdert_nicht" 2 "HWP_foerdert" 3 "reserviert" ; +VAL_ 1088 WIV_Oelsystem_aktiv 0 "Anzeige_aus" 1 "Anzeige_aktiv" ; +VAL_ 1088 WIV_nicht_betriebswarm 0 "Motor_warm" 1 "Motor_nicht_betriebswarm" ; +VAL_ 1088 WIV_Ueberfuell_Warn 0 "in_Ordnung" 1 "Ueberfuellwarnung" ; +VAL_ 1088 WIV_laufender_Motor 0 "Messung_moeglich" 1 "Messung_nicht_moeglich" ; +VAL_ 1088 MO_HYB_Text_1 0 "kein_Text" 1 "Text_anzeigen" ; +VAL_ 1088 MO_HYB_Text_2 0 "kein_Text" 1 "Text_anzeigen" ; +VAL_ 1088 MO_HYB_Text_3 0 "kein_Text" 1 "Text_anzeigen" ; +VAL_ 1088 MO_Text_Motorstart 0 "keine_Anzeige" 1 "Motor_im_Stoppbetrieb" 2 "StartStopp_sicherheitsbedingt_deaktiviert" 3 "System_fordert_Wiederstart" 5 "Motorlauf_noetig" 9 "Unerwuenschter_Motorstillstand" 12 "Motor_startet" 13 "Kupplung_betaetigen" 14 "Waehlhebel_in_PN_Position" 15 "Bremse_treten" ; +VAL_ 1088 MO_HYB_Text_5 0 "kein_Text" 1 "Text_anzeigen" ; +VAL_ 1088 MO_HYB_Text_6 0 "kein_Text" 1 "Text_anzeigen" ; +VAL_ 1088 MO_HYB_Text_7 0 "kein_Text" 1 "Text_anzeigen" ; +VAL_ 1088 WIV_Oeldyn_avl 0 "Oeldyn_nicht_vorhanden" 1 "Oeldyn_vorhanden" ; +VAL_ 1088 MO_Systemlampe 0 "Lampe aus" 1 "Lampe ein" ; +VAL_ 1088 MO_OBD2_Lampe 0 "Lampe aus" 1 "Lampe ein" ; +VAL_ 1088 MO_Heissleuchte 0 "Lampe aus" 1 "Lampe ein" ; +VAL_ 1088 MO_Partikel_Lampe 0 "Lampe aus" 1 "Lampe ein" ; +VAL_ 1088 WIV_Oelstand_nicht_vorhanden 0 "īŋŊlstand vorhanden" 1 "īŋŊlstand nicht vorhanden" ; +VAL_ 1088 WIV_nachfuellanzeige_ein 0 "keine_Nachfuellanzeige" 1 "Nachfuellanzeige" ; +VAL_ 1088 WIV_Ueberfuell_deaktiv 0 "Ueberfuellwarnung_am_Kombi_aktiv" 1 "Ueberfuellwarnung_am_Kombi_deaktiv" ; +VAL_ 1088 WIV_Unterfuell_Warn 0 "in_Ordnung" 1 "Unterfuellwarnung" ; +VAL_ 1088 MO_Tankdeckel_Lampe 0 "Lampe aus" 1 "Lampe ein" ; +VAL_ 1088 MO_Text_Tankdeckelwarn 0 "kein Text" 1 "Anzeige Text Tankdeckelwarnung im Kombi" ; +VAL_ 1088 WIV_Enable_Oeldr_Motor 0 "Oeldruckauswertung_im_Kombi" 1 "Oeldruckauswertung_im_MSG" ; +VAL_ 1088 WIV_Oeldr_Warn_Motor 0 "keine_Warnung" 1 "niedrige_Oeldruckstufe_nicht_erreicht " ; +VAL_ 1088 MO_Avus_Motorschutz 0 "keine Warnung" 1 "Drehzahlwarnung Stufe 1" 2 "Drehzahlwarnung Stufe 2" 3 "Drehzahlwarnung Stufe 3" ; +VAL_ 1088 MO_HYB_Fahrbereitschaft 0 "keine_Fahrbereitschaft" 1 "Fahrbereitschaft" ; +VAL_ 1600 MO_QBit_Ansaugluft_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 1600 MO_QBit_Oel_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 1600 MO_QBit_Kuehlmittel_Temp 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 1600 MO_Stellgliedtest_Soundaktuator 0 "kein_Stellgliedtest" 1 "Anforderung_des_Stellgliedtest" ; +VAL_ 1600 MO_HYB_Fehler_HV_Netz 0 "i_O" 1 "kein_generatorischer_Betrieb_moeglich" ; +VAL_ 1600 MO_aktives_Getriebeheizen 0 "kein_Ventil_ansteuern" 1 "Ventil_muss_angesteuert_werden" ; +VAL_ 1600 MO_Absperrventil_oeffnen 0 "nicht_verfuegbar" 1 "Ansteuerung_Ventil_zulaessig" 2 "Ventil_oeffnen_oder_geoeffnet" 3 "Ventil_schliessen_oder_geschlossen" ; +VAL_ 1600 MO_Ansaugluft_Temp 254 "Init" 255 "Fehler" ; +VAL_ 1600 MO_Oel_Temp 253 "nicht_verbaut" 254 "Init" 255 "Fehler" ; +VAL_ 1600 MO_Kuehlmittel_Temp 254 "Init" 255 "Fehler" ; +VAL_ 1600 MO_Hoeheninfo 255 "Fehler" ; +VAL_ 1600 MO_Kennfeldk 0 "keine KennfeldkīŋŊhlung vorhanden" 1 "KennfeldkīŋŊhlung vorhanden" ; +VAL_ 1600 MO_Versionsinfo 0 "zum Projektbeginn 'aufgerīŋŊumter CAN' " 1 "Motor_03_mit_10ms" 16 "MQB_mit_neuer_Momentenschnittstelle" ; +VAL_ 1600 MO_Getriebe_kuehlen 0 "nicht_kuehlen" 1 "kuehlen" ; +VAL_ 1600 MO_Heizungspumpenansteuerung 15 "nicht_verbaut" ; +VAL_ 1600 MO_SpannungsAnf 0 "keine_Anforderung" 1 "Anforderung" ; +VAL_ 1607 MO_ITM_Kuehlmittel_Temp 0 "nicht_verbaut" 2 "Fehler" ; +VAL_ 1607 MO_E85_Sensor 13 "nicht_verbaut" 15 "Fehler" ; +VAL_ 1607 SCR_Anz_Motorstarts 15 "keine EinschrīŋŊnkung (Anzeige Reichweite)" ; +VAL_ 1607 SCR_Reichweite 32767 "Init" ; +VAL_ 1607 SCR_Warnstufe_1 0 "nicht aktiv" 1 "Warnstufe 1 aktiv" ; +VAL_ 1607 SCR_Warnstufe_2 0 "nicht aktiv" 1 "Warnstufe 2 aktiv" ; +VAL_ 1607 SCR_Text 0 "kein Text" 1 "Warntext 1" 2 "Warntext 2" 3 "Hinweistext (nur AUDI)" 4 "Reserve" 5 "Warntext 'SCR-Systemfehler Stufe 1'" 6 "Warntext 'SCR-Systemfehler Stufe 2'" ; +VAL_ 1607 SCR_Akustik 0 "keine Akustik" 1 "Akustik 1" 2 "Akustik 2" 3 "Akustik_bei_Hinweis_(VW)" ; +VAL_ 1607 MO_Kraftstofffilter_Wasser 0 "keine_Anzeige" 1 "Abscheidevolumen_erschoepft" ; +VAL_ 1607 SCR_Systemfehler 0 "Warnung_nicht_aktiv" 1 "Warnung_aktiv" ; +VAL_ 1607 SCR_Inducement_Strategie 0 "Restart_Strategie" 1 "Reduced_Drivability_Strategie" ; +VAL_ 1607 MO_CO2_Faktor 0 "nicht_verbaut" 4095 "Fehler" ; +VAL_ 1607 MO_MKB_MUX 0 "MKB_01" 1 "MKB_02" 2 "MKB_03" 3 "MKB_04" ; +VAL_ 1607 MO_MKB_01 0 "Minus" 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" 7 "G" 8 "H" 9 "I" 10 "J" 11 "K" 12 "L" 13 "M" 14 "N" 15 "O" 16 "P" 17 "Q" 18 "R" 19 "S" 20 "T" 21 "U" 22 "V" 23 "W" 24 "X" 25 "Y" 26 "Z" 27 "Leerzeichen" 28 "Leerzeichen" 29 "Leerzeichen" 30 "Leerzeichen" 31 "Unterstrich" ; +VAL_ 1607 MO_MKB_02 0 "Minus" 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" 7 "G" 8 "H" 9 "I" 10 "J" 11 "K" 12 "L" 13 "M" 14 "N" 15 "O" 16 "P" 17 "Q" 18 "R" 19 "S" 20 "T" 21 "U" 22 "V" 23 "W" 24 "X" 25 "Y" 26 "Z" 27 "Leerzeichen" 28 "Leerzeichen" 29 "Leerzeichen" 30 "Leerzeichen" 31 "Unterstrich" ; +VAL_ 1607 MO_MKB_03 0 "Minus" 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" 7 "G" 8 "H" 9 "I" 10 "J" 11 "K" 12 "L" 13 "M" 14 "N" 15 "O" 16 "P" 17 "Q" 18 "R" 19 "S" 20 "T" 21 "U" 22 "V" 23 "W" 24 "X" 25 "Y" 26 "Z" 27 "Leerzeichen" 28 "Leerzeichen" 29 "Leerzeichen" 30 "Leerzeichen" 31 "Unterstrich" ; +VAL_ 1607 MO_MKB_04 0 "Minus" 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" 7 "G" 8 "H" 9 "I" 10 "J" 11 "K" 12 "L" 13 "M" 14 "N" 15 "O" 16 "P" 17 "Q" 18 "R" 19 "S" 20 "T" 21 "U" 22 "V" 23 "W" 24 "X" 25 "Y" 26 "Z" 27 "Leerzeichen" 28 "Leerzeichen" 29 "Leerzeichen" 30 "Leerzeichen" 31 "Unterstrich" ; +VAL_ 276 MO_Sig_Fahrpedalgradient 0 "Fahrpedalgradient positiv" 1 "Fahrpedalgradient negativ" ; +VAL_ 276 MO_BKV_Unterdruckwarnung 0 "Unterdruckhaushalt_iO" 1 "Unterdruckhaushalt_niO" ; +VAL_ 276 MO_Zylinderabschaltung 0 "Vollmotorbetrieb_VMB" 1 "Uebergang_HMB_in_VMB" 2 "Uebergang_VMB_in_HMB" 3 "Halbmotorbetrieb_HMB" ; +VAL_ 276 MO_Fahrpedalgradient 255 "Fehler" ; +VAL_ 276 MO_Schubabschaltung 0 "keine_Schubabschaltung" 1 "Schubabschaltung_aktiv" ; +VAL_ 276 MO_rel_Saugrohrdruck 0 "Init_Ueberdruck" 63 "Fehler" ; +VAL_ 276 MO_rel_Saugrohrdruck_gem_err 0 "errechnet" 1 "gemessen" ; +VAL_ 276 MO_BKV_Unterdruck 255 "Fehler" ; +VAL_ 1648 MO_Anzahl_Abgesch_Zyl 0 "Vollmotorbetrieb" 1 "1_Zylinder_abgeschaltet" 2 "2_Zylinder_abgeschaltet" 3 "3_Zylinder_abgeschaltet" 4 "4_Zylinder_abgeschaltet" 5 "5_Zylinder_abgeschaltet" 6 "6_Zylinder_abgeschaltet" 7 "8_Zylinder_abgeschaltet" ; +VAL_ 1648 MO_Zylabsch_Texte 0 "keine_Texte" 1 "Zylinderabschaltung_deaktivieren" 2 "Zylinderabschaltung_aktivieren" 3 "Zylinderabschaltung_unruhig" ; +VAL_ 1648 MO_E85_BS_Texte 0 "kein Text" 1 "FlexFuel Warm_Up_ Lampe" 2 "FlexFuel Warnung 3.Stufe " 3 "FlexFuel Warnung 1.Stufe " 4 "FlexFuel Warnung 2.Stufe " 5 "FlexFuel Warnung 4.Stufe " ; +VAL_ 1648 MO_Drehzahl_Warnung 0 "keinen_Warnhinweis_anzeigen" 1 "Warnhinweis_anzeigen" ; +VAL_ 1010 MO_SCR_Tankheizung 0 "Heizung_aus" 1 "Heizung_ein" ; +VAL_ 1010 MO_SCR_Dosierpumpe_Zustand 0 "frei" 1 "Drehzahlregelung" 2 "Druckregelung_langsam" 3 "Druckregelung_schnell" 4 "Pumpe_Stop" 5 "Rueckwaertsbetrieb" 6 "verzoegerter_Rueckwaertsbetrieb" 7 "Pumpe_heizen" ; +VAL_ 1010 MO_SCR_Leitungsheizung 0 "Heizung_aus" 1 "Heizung_ein" ; +VAL_ 1010 MO_SCR_Dosierpumpe_Wartezeit 125 "nicht_verbaut" 127 "Fehler" ; +VAL_ 1010 MO_SCR_Transferpumpe 0 "Pumpe_aus" 1 "Pumpe_ein" ; +VAL_ 1601 MO_Faktor_Momente 0 "nicht belegt" 1 "Faktor: x 0,5Nm" 2 "Faktor: x 1,0Nm" 3 "Faktor: x 2,0Nm" ; +VAL_ 1601 MO_Hybridfahrzeug 0 "kein_Hybridfahrzeug" 1 "Mild_Hybrid" 2 "Full_Hybrid" ; +VAL_ 1601 MO_Getriebe_Code 2 "DL501" 4 "VL381" 10 "AL651" 11 "AL551, AL951, AL1000-8A" 12 "PDK_PAG" 13 "AL551_Hybrid" 15 "Handschalter (konventionell)" 16 "AQ250" 17 "AQ450" 18 "DQ200" 19 "DQ250" 20 "DQ500" 21 "SQ100" 22 "SQ200" ; +VAL_ 1601 MO_StartStopp_Codiert 0 "Start_Stopp_nicht_verbaut" 1 "Start_Stopp_verbaut" ; +VAL_ 1601 MO_Kraftstoffart 0 "Diesel" 1 "Benzin" 2 "CNG" 3 "Erdgas" 4 "Wasserstoff" ; +VAL_ 1601 MO_Ansaugsystem 0 "Turbo" 1 "Sauger" ; +VAL_ 1601 MO_Einspritzart 0 "MPI" 1 " FSI / TDI" ; +VAL_ 969 MOS_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1696 NV_aktiv 0 "NV nicht aktiv" 1 "NV aktiv" ; +VAL_ 1696 NV_Texte 0 "kein_Text" 1 "Abblendlicht_einschalten" 2 "Fussgaengermarkierung_nicht_verfuegbar" 3 "zur_Zeit_nicht_verfuegbar" 4 "Systemfehler" ; +VAL_ 1696 NV_Gong 0 "kein_Gong" 1 "Gong_leise" 2 "Gong_mittel" 3 "Gong_laut" ; +VAL_ 1696 NV_Symbol 0 "kein_Symbol_anzeigen" 1 "Symbol_fuer_erkanntes_Objekt_anzeigen" ; +VAL_ 1696 NV_Hinweise 0 "keine_Anzeige" 1 "Disclaimer" 2 "Fussgaenger_Markierung_nicht_verfuegbar" 3 "Nachtsichtsystem_wird_initialisiert" ; +VAL_ 1696 NV_Piktogramm_aktiv 0 "keine_Anzeigenprioritaet" 1 "Anzeigenprioritaet" ; +VAL_ 1696 NV_Akustik_deaktiviert_Icon 0 "aus" 1 "ein" ; +VAL_ 1696 NV_FGM_deaktiviert_Icon 0 "aus" 1 "ein" ; +VAL_ 1696 NV_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1753 NMH_EPB_Start_1 1 "Zustand Start (<--Sleep)" ; +VAL_ 1753 NMH_EPB_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ; +VAL_ 1753 NMH_EPB_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ; +VAL_ 1753 NMH_EPB_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ; +VAL_ 1753 NMH_EPB_Per_WakeUp 0 "Wenn Funktions-Wakeup" 1 "CAN-Wakeup" 2 "Periphrie-Wakeup Ursache nicht bekannt" 3 "Klemme 15 HW (falls vorhanden)" 4 "t.b.d." 5 "Schalter_EPB" ; +VAL_ 1753 NMH_EPB_Fkt_WakeUp 0 "Wenn Peripherie-Wakeup" ; +VAL_ 1753 NMH_EPB_NM_aktiv_Klemme_15 1 "Klemme 15 EIN" ; +VAL_ 1753 NMH_EPB_NM_aktiv_Diagnose 1 "Diagnose bei Kl 15 aus" ; +VAL_ 1753 NMH_EPB_NM_aktiv_Start 1 "Zustand 'START' (NM-high)" ; +VAL_ 1753 NMH_EPB_NM_aktiv_Schalter 1 "Schalter aktiv" ; +VAL_ 1753 NMH_EPB_NM_aktiv_Bedarf_Anzeige 1 "Kombi-Anzeige EPB" ; +VAL_ 1753 NMH_EPB_NM_aktiv_v_groesser_Null 1 "v > 0" ; +VAL_ 1753 NMH_EPB_kein_NL 1 "kein lokaler Nachlauf" ; +VAL_ 1753 NMH_EPB_NL_Temp_Modell 1 "Temperaturmodell aktiv" ; +VAL_ 1753 NMH_EPB_NL_AutoAdjust 0 "AutoAdjust_nicht_aktiv" 1 "AutoAdjust_aktiv" ; +VAL_ 1753 NM_EPB_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ; +VAL_ 1753 NMH_EPB_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ; +VAL_ 1753 NMH_EPB_CAN_Diag_deaktiv 1 "CAN-Diagnose deaktiv" ; +VAL_ 1753 NMH_EPB_KompSchutz 1 "KS aktiv" ; +VAL_ 1753 NMH_EPB_Mute_Mode 1 "MuteMode aktiv" ; +VAL_ 1753 NMH_EPB_Transport_Mode 1 "Transportmodus aktiv" ; +VAL_ 1753 NMH_EPB_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ; +VAL_ 1753 NMH_EPB_Eindraht_Fehler 1 "Eindrahtbetrieb erkannt" ; +VAL_ 1753 NMH_EPB_Lokalaktiv 0 "war nicht Lokalaktiv" 1 "war Lokalaktiv" ; +VAL_ 1753 NMH_EPB_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ; +VAL_ 1728 NMH_GW_Start_1 1 "Zustand Start (<--Sleep)" ; +VAL_ 1728 NMH_GW_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ; +VAL_ 1728 NMH_GW_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ; +VAL_ 1728 NMH_GW_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ; +VAL_ 1728 NMH_GW_Per_WakeUp 0 "Wenn_FunktionsWakeup" 1 "CAN_Wakeup__Weckendes_CAN_Segment_siehe_NMH_GW_WakeUp_CAN_Bus" 2 "P_WakeUp_Ursache_unbekannt" 3 "Klemme_15HW__falls_vorhanden" 4 "MOST_Wakeup" 5 "LIN_Wakeup" 6 "KL30_Reset" ; +VAL_ 1728 NMH_GW_Fkt_WakeUp 0 "Wenn_Peripherie_Wakeup" 1 "Funktionswakeup_EM" 2 "Car_Wakeup_empfangen" 3 "VNSM_VehicleNetworkStateManager" 4 "Alarm_RTC__Wecken_weil_Weckzeit_abgelaufen" 5 "Wecken_durch_Diagnose" ; +VAL_ 1728 NMH_GW_NM_aktiv_Klemme_15 1 "Klemme 15 EIN" ; +VAL_ 1728 NMH_GW_NM_aktiv_Diagnose 1 "Diagnose bei Kl 15 aus" ; +VAL_ 1728 NMH_GW_NM_aktiv_Start 1 "Zustand 'START' (NM-high)" ; +VAL_ 1728 NMH_GW_NM_aktiv_BDM 1 "BDM-Kommunikation" ; +VAL_ 1728 NMH_GW_NM_aktiv_Warnblinken 1 "Warnblinken aktiv" ; +VAL_ 1728 NMH_GW_NM_aktiv_ESP 1 "ESP aktiv (Wakeup/Sleep-Konzept)" ; +VAL_ 1728 NMH_GW_Abschaltstufe_3 1 "BEM aufgrund Abschaltstufe 3 aktiv" ; +VAL_ 1728 NMH_GW_SG_Fehlerdauer 1 "BEM aufgrund Steuergeraetefehlerdauer aktiv" ; +VAL_ 1728 NMH_GW_STH_Wakeup 1 "BEM aktiv aufgrund Standheizungswakeup" ; +VAL_ 1728 NMH_GW_NL_Diagnose 0 "keine_Diagnose_aktiv" 1 "Diagnose_war_lokal_aktiv" ; +VAL_ 1728 NM_GW_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ; +VAL_ 1728 NMH_GW_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ; +VAL_ 1728 NMH_GW_CAN_Diag_deaktiv 1 "CAN Bus bezogene Eigendiagnose deaktiv" ; +VAL_ 1728 NMH_GW_KompSchutz 1 "KS aktiv" ; +VAL_ 1728 NMH_GW_Mute_Mode 1 "MuteMode aktiv" ; +VAL_ 1728 NMH_GW_Transport_Mode 1 "Transportmodus aktiv" ; +VAL_ 1728 NMH_GW_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ; +VAL_ 1728 NMH_GW_Eindraht_Fehler 1 "Eindrahtbetrieb erkannt" ; +VAL_ 1728 NMH_GW_ACAN 1 "ACAN aktiv (Wakeup/Sleep-Konzept)" ; +VAL_ 1728 NMH_GW_KombiCAN 1 "KombiCAN aktiv (Wakeup/Sleep-Konzept)" ; +VAL_ 1728 NMH_GW_KomfortCAN 1 "KomfortCAN aktiv (Wakeup/Sleep-Konzept)" ; +VAL_ 1728 NMH_GW_Infotainment 1 "Infotainment aktiv (CAN oder MOST), Wakeup/Sleep-Konzept" ; +VAL_ 1728 NMH_GW_Fahrwerk 1 "BUS_Fahrwerk_aktiv (Wakeup/Sleep-Konzept)" ; +VAL_ 1728 NMH_GW_WakeUp_CAN_Bus 0 "Nicht zutreffend (kein CAN-Wakeup bzw. CarWakeup)" 1 "Antriebs-CAN" 2 "Kombi-CAN" 3 "Komfort-CAN" 4 "Infotainment-CAN (wenn verfuegbar)" 5 "Fahrwerks-CAN" 6 "Diagnose-CAN" ; +VAL_ 1730 NMH_GE_Start_1 1 "Zustand Start (<--Sleep)" ; +VAL_ 1730 NMH_GE_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ; +VAL_ 1730 NMH_GE_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ; +VAL_ 1730 NMH_GE_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ; +VAL_ 1730 NMH_GE_Per_WakeUp 0 "wenn Funktionswakeup" 1 "CAN" 2 "P-Wakeup, Ursache nicht bekannt" 3 "KL 15 HW (falls vorhanden)" ; +VAL_ 1730 NMH_GE_Fkt_WakeUp 0 "wenn Peripheriewakeup" 1 "Ende_N_Haltephase" ; +VAL_ 1730 NMH_GE_NM_aktiv_Klemme_15 1 "Klemme 15 ein" ; +VAL_ 1730 NMH_GE_NM_aktiv_Diagnose 1 "Diagnose bei Kl 15 aus" ; +VAL_ 1730 NMH_GE_NM_aktiv_Start 1 "Zustand 'START' (NM-high)" ; +VAL_ 1730 NMH_GE_N_Haltephase 0 "keine_N_Haltephase" 1 "N_Haltephase_aktiv" ; +VAL_ 1730 NMH_GE_kein_NL 1 "kein lokaler Nachlauf" ; +VAL_ 1730 NMH_GE_NL_Daten_EEPROM 1 "EEPROM Datenspeicherung" ; +VAL_ 1730 NM_GE_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ; +VAL_ 1730 NMH_GE_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ; +VAL_ 1730 NMH_GE_CAN_Diag_deaktiv 1 "CAN-Diagnose deaktiv" ; +VAL_ 1730 NMH_GE_KompSchutz 1 "KS aktiv" ; +VAL_ 1730 NMH_GE_Mute_Mode 1 "MuteMode aktiv" ; +VAL_ 1730 NMH_GE_Transport_Mode 1 "Transportmodus aktiv" ; +VAL_ 1730 NMH_GE_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ; +VAL_ 1730 NMH_GE_Eindraht_Fehler 1 "Eindrahtbetrieb erkannt" ; +VAL_ 1730 NMH_GE_Lokalaktiv 0 "war nicht Lokalaktiv" 1 "war Lokalaktiv" ; +VAL_ 1730 NMH_GE_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ; +VAL_ 1730 NMH_GSG_Subbusaktiv 0 "Subbus inaktiv" 1 "Subbus aktiv" ; +VAL_ 1729 NMH_MO_Start_1 1 "Zustand Start (<--Sleep)" ; +VAL_ 1729 NMH_MO_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ; +VAL_ 1729 NMH_MO_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ; +VAL_ 1729 NMH_MO_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ; +VAL_ 1729 NMH_MO_Per_WakeUp 0 "Wenn Funktions-Wakeup" 1 "CAN-Wakeup" 2 "Peripherie-Wakeup Ursache nicht bekannt" 3 "Klemme 15 HW (falls vorhanden)" 4 "analog (Standheizung/Tuerkontakt)(nur MED9)" ; +VAL_ 1729 NMH_MO_Fkt_WakeUp 0 "Wenn_Peripherie_Wakeup" ; +VAL_ 1729 NMH_MO_NM_aktiv_Klemme_15 1 "Klemme 15 EIN" ; +VAL_ 1729 NMH_MO_NM_aktiv_Diagnose 1 "Diagnose bei Kl 15 aus " ; +VAL_ 1729 NMH_MO_NM_aktiv_Start 1 "Zustand 'START' (NM-high)" ; +VAL_ 1729 NMH_MO_NM_aktiv_EKP_Vorlauf 1 "EKP-Vorlauf" ; +VAL_ 1729 NMH_MO_NM_aktiv_STH_Betrieb 1 "STH-Betrieb" ; +VAL_ 1729 NMH_MO_NM_aktiv_HV_Abschaltung 0 "kein_Nachlauf" 1 "Abschaltung_aktiv" ; +VAL_ 1729 NMH_MO_kein_NL 1 "kein lokaler Nachlauf" ; +VAL_ 1729 NMH_MO_NL_Kuehlerluefter 1 "KīŋŊhlerlīŋŊfter Steuerung / Zusatzwasserpumpe aktiv" ; +VAL_ 1729 NMH_MO_NL_Diagnose 1 "Diagnosefunktionen aktiv" ; +VAL_ 1729 NMH_MO_NL_WFS 1 "WFS aktiv" ; +VAL_ 1729 NMH_MO_NL_EEPROM 1 "EEPROM Zugriffe RAM/ROM Tests" ; +VAL_ 1729 NMH_MO_NL_Sonstige 1 "Sonstige NachlīŋŊufe aktiv" ; +VAL_ 1729 NM_MO_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ; +VAL_ 1729 NMH_MO_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ; +VAL_ 1729 NMH_MO_CAN_Diag_deaktiv 1 "CAN-Diagnose deaktiv" ; +VAL_ 1729 NMH_MO_KompSchutz 1 "KS aktiv" ; +VAL_ 1729 NMH_MO_Mute_Mode 1 "MuteMode aktiv" ; +VAL_ 1729 NMH_MO_Transport_Mode 1 "Transportmodus aktiv" ; +VAL_ 1729 NMH_MO_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ; +VAL_ 1729 NMH_MO_Eindraht_Fehler 1 "Eindrahtbetrieb erkannt" ; +VAL_ 1729 NMH_MO_Lokalaktiv 0 "war nicht Lokalaktiv" 1 "war Lokalaktiv" ; +VAL_ 1729 NMH_MO_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ; +VAL_ 1736 NMH_MO_SL_Start_1 1 "Zustand Start (<--Sleep)" ; +VAL_ 1736 NMH_MO_SL_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ; +VAL_ 1736 NMH_MO_SL_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ; +VAL_ 1736 NMH_MO_SL_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ; +VAL_ 1736 NMH_MO_SL_Per_WakeUp 0 "Wenn Funktions-Wakeup" 1 "CAN-Wakeup" 2 "Peripherie-Wakeup Ursache nicht bekannt" 3 "Klemme 15 HW (falls vorhanden)" 4 "analog (Standheizung/Tuerkontakt)(nur MED9)" ; +VAL_ 1736 NMH_MO_SL_Fkt_WakeUp 0 "Wenn Peripherie-Wakeup" ; +VAL_ 1736 NMH_MO_SL_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag " ; +VAL_ 1736 NMH_MO_SL_CAN_Diag_deaktiv 1 "CAN-Diagnose deaktiv" ; +VAL_ 1736 NMH_MO_SL_KompSchutz 1 "KS aktiv" ; +VAL_ 1736 NMH_MO_SL_Mute_Mode 1 "MuteMode aktiv" ; +VAL_ 1736 NMH_MO_SL_Transport_Mode 1 "Transportmodus aktiv" ; +VAL_ 1736 NMH_MO_SL_Abschaltstufe_aktiv 1 "Abschaltstufe aktiv" ; +VAL_ 1736 NMH_MO_SL_Busfehler 1 "Busfehler" ; +VAL_ 1736 NMH_MO_Sl_Lokalaktiv 0 "war_nicht_lokal_aktiv" 1 "war_lokal_aktiv" ; +VAL_ 1736 NMH_MO_SL_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ; +VAL_ 1782 NMH_SCR_Start_1 1 "Zustand Start (<--Sleep)" ; +VAL_ 1782 NMH_SCR_Start_2 1 "Zustand Start (<--Prepare to Sleep)" ; +VAL_ 1782 NMH_SCR_Normal_Mode_1 1 "Zustand Normal Mode (<-- Start)" ; +VAL_ 1782 NMH_SCR_Normal_Mode_2 1 "Zustand Normal Mode (<-- Ready to Sleep)" ; +VAL_ 1782 NMH_SCR_Car_WakeUp 1 "Car Wake Up" ; +VAL_ 1782 NMH_SCR_Per_WakeUp 0 "Funktions-WakeUp" 1 "CAN" 2 "P_WakeUp_Ursache_unbekannt" 3 "KL_15_Hardware_falls_vorhanden" ; +VAL_ 1782 NMH_SCR_Fkt_WakeUp 0 "Peripheriewakeup" ; +VAL_ 1782 NMH_SCR_Klemme_15 1 "Klemme 15 ein" ; +VAL_ 1782 NMH_SCR_Diagnose 1 "Diagnose bei Kl 15 aus" ; +VAL_ 1782 NMH_SCR_MindestAktivZeit 1 "aktiv" ; +VAL_ 1782 NMH_SCR_NL_Datem_EEPROM 0 "kein_Nachlauf" 1 "EEPROM_schreibzugriff" ; +VAL_ 1782 NMH_SCR_Signalfehler 1 "Aktiver_Signalfehler_eingetragen" ; +VAL_ 1782 NMH_SCR_TimeOut_Fehler 1 "Aktiver Timeout Fehlerspeichereintrag" ; +VAL_ 1782 NMH_SCR_CAN_Diag_deaktiv 1 "CAN Bus bezogene Eigendiagnose deaktiviert" ; +VAL_ 1782 NMH_SCR_KompSchutz 1 "KS aktiv" ; +VAL_ 1782 NMH_SCR_Mute_Mode 1 "Mute Mode aktiv" ; +VAL_ 1782 NMH_SCR_Transport_Mode 1 "Transportmodus aktiv" ; +VAL_ 1782 NMH_SCR_Abschaltstufe_aktiv 1 "Funktionsabschaltung wegen Abschaltschaltstufe" ; +VAL_ 1782 NMH_SCR_Busfehler 1 "Busfehler" ; +VAL_ 1782 NMH_SCR_Lokalaktiv 0 "war_nicht_lokal_aktiv" 1 "war_lokal_aktiv" ; +VAL_ 1782 NMH_SCR_Subsystemaktiv 0 "Subsystem war nicht lokalaktiv" 1 "war Lokalaktiv" ; +VAL_ 913 OBD_Kaltstart_Denominator 0 "Denominator_nicht_hochzaehlen" 1 "Bedingungen_zum_Inkr_des_Kaltstart_Denom_erf" ; +VAL_ 913 OBD_Minimum_Trip 0 "kein_Min_Normed_Trip" 1 "Min_Normed_Trip" ; +VAL_ 913 OBD_Driving_Cycle 0 "kein Driving Cycle erkannt" 1 "DC erkannt" ; +VAL_ 913 OBD_Warm_Up_Cycle 0 "kein Warm Up Cycle erkannt" 1 "Warm Up Cycle erkannt" ; +VAL_ 913 OBD_Normed_Trip 0 "kein Normed Trip" 1 "Normed Trip erfīŋŊllt" ; +VAL_ 803 PCF_Objektstatus 0 "Kein_relevantes_Objekt_erkannt" 1 "Relevantes_Objekt_vorausfahrend" 2 "Relevantes_Objekt_stehend" 3 "Relevantes_Objekt_angehalten" 4 "Relevantes_Objekt_entgegenkommend" 5 "Ungueltig" 6 "Ungueltig" 7 "Ungueltig" ; +VAL_ 803 PCF_Fahrer_aktiv_erkannt 0 "Fahrer_nicht_aktiv" 1 "Fahrer_aktiv" ; +VAL_ 803 PCF_Time_to_collision 255 "Objektstatus=0x0__oder_berechneter_TTC_Wert_groesser_als_Maximalwert" ; +VAL_ 803 PCF_v_rel 0 " Objektstatus_0x0_oder _berechnete_v_rel_>= 0_(Objekt_entfernt_sich_oder_faehrt_vorraus_mit v_Obj_=_v_ego)" ; +VAL_ 803 PCF_dy_Kollisionsueberdeckung 0 "Keine_Ueberdeckung_oder_bei_Objektstatus_0x0" 30 "Ueberdeckung_groesser_Maximalwert" 31 "Objekueberdeckung_nicht_ermittelbar" ; +VAL_ 802 PCR_Sensorstatus 0 "Sensor_ok" 1 "Sensor_nok" ; +VAL_ 802 PCR_Obj_vx_rel 2047 "Fehler" ; +VAL_ 802 PCR_Obj_vy_rel 2047 "Fehler" ; +VAL_ 802 PCR_Obj_TTC 511 "Fehler" ; +VAL_ 802 PCR_Obj_Guete 127 "Fehler" ; +VAL_ 802 PCR_Crashwahrscheinlichkeit 127 "Fehler" ; +VAL_ 929 PSD_Pos_Segment_ID 0 "keine Position gegeben" 1 "Fehlerwert" ; +VAL_ 929 PSD_Pos_Standort 0 "mehrdeutiger_Standort" 1 "eindeutiger_Standort" ; +VAL_ 929 PSD_Pos_Laengsfehler 0 "keine PrīŋŊdiktion (off-road)" 1 "< 2m" 2 "< 5m" 3 "< 10m " 4 "< 20m" 5 "< 50m" 6 "> 50m " 7 "nicht erlaubt" ; +VAL_ 929 PSD_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "Fehlerwert" ; +VAL_ 929 PSD_Vorgaenger_Segment_ID 0 "keine Segmentinformation vorhanden" 1 "Fehlerwert" ; +VAL_ 929 PSD_Strassenklasse 0 "Rest_Feldweg_Schotterweg_Privatweg" 1 "Ortsstrasse" 2 "Bundes_Landstrasse" 3 "Autobahn" ; +VAL_ 929 PSD_Rampe 0 "Strasse_mit_Gegenverkehr" 1 "Auffahrt_Einbahnstr" 2 "Abfahrt_Einbahnstr" 3 "Einbahnstrasse" ; +VAL_ 929 PSD_Endkruemmung 255 "Gerade" ; +VAL_ 929 PSD_Endkruemmung_Vorz 0 "Kruemmung_positiv" 1 "Kruemmung_negativ" ; +VAL_ 929 PSD_Endsteigung 30 "gleich_oder_mehr_15_Prozent_Steigung" 31 "nicht_definiert" ; +VAL_ 929 PSD_Endsteigung_Vorz 0 "Gefaelle" 1 "Steigung" ; +VAL_ 929 PSD_ADAS_Qualitaet 0 "keine_ADAS_Qualitaet" 1 "ADAS_Qualitaet" ; +VAL_ 929 PSD_Fahrspuren 0 "Einbahnstrasse_in_falscher_Richtung" 1 "eine_Fahrspur" 2 "zwei_Fahrspuren" 3 "drei_Fahrspuren" ; +VAL_ 929 PSD_wahrscheinlichster_Pfad 0 "Pfad_mit_geringer_Wahrscheinlichkeit" 1 "wahrscheinlichster_Pfad" ; +VAL_ 930 PSD_Multiplex 0 "fīŋŊr System Informationen, die sich nur langsam īŋŊndern" 1 "Informationen īŋŊber ein Streckensegment" 2 "fīŋŊr Informationen īŋŊber Geschwindigkeitsbegrenzungen und mīŋŊgliche EinschrīŋŊnkungen der Geschwindigkeitsbegrenzungen" 3 "Fahrzeugposition aus der Koppelortung" ; +VAL_ 930 PSD_Sys_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig" ; +VAL_ 930 PSD_Abz_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig" ; +VAL_ 930 PSD_Ges_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig" ; +VAL_ 930 PSD_Ort_Laenge_VZ 0 "Ost" 1 "West" ; +VAL_ 930 PSD_Ort_Laenge 33554431 "Keine GPS Position verfuegbar" ; +VAL_ 930 PSD_Ges_Geschwindigkeit 0 "Kein Geschwindigkeitsgebot" 1 "0 km/h < v_max < 5 km/h" 2 "5 km/h īŋŊ v_max < 10km/h" 3 "10 km/h īŋŊ v_max < 15 km/h" 4 "15 km/h īŋŊ v_max < 20 km/h" 5 "20 km/h īŋŊ v_max < 25 km/h" 6 "25 km/h īŋŊ v_max < 30 km/h" 7 "30 km/h īŋŊ v_max < 35 km/h" 8 "35 km/h īŋŊ v_max < 40 km/h" 9 "40 km/h īŋŊ v_max < 45 km/h" 10 "45 km/h īŋŊ v_max < 50 km/h" 11 "50 km/h īŋŊ v_max < 60 km/h" 12 "60 km/h īŋŊ v_max < 70 km/h" 13 "70 km/h īŋŊ v_max < 80 km/h" 14 "80 km/h īŋŊ v_max < 90 km/h" 15 "90 km/h īŋŊ v_max < 100 km/h" 16 "100 km/h īŋŊ v_max < 110 km/h" 17 "110 km/h īŋŊ v_max < 120 km/h" 18 " 120 km/h īŋŊ v_max < 130 km/h" 19 "130 km/h īŋŊ v_max < 140 km/h" 20 "140 km/h īŋŊ v_max < 150 km/h" 21 "150 km/h īŋŊ v_max < 160 km/h" 22 "160 km/h īŋŊ v_max" 23 "Geschwindigkeitsgebot aufgehoben" 24 "..0x1F ungīŋŊltig" ; +VAL_ 930 PSD_Ges_Geschwindigkeit_Typ 0 "Der Wert im Attribut Geschwindigkeitsbegrenzung entspricht der Geschwindigkeitsklasse von Navteq." 1 "Der Wert im Attribut Geschwindigkeitsbegrenzung entspricht einer explizit angegebenen Begrenzung der Geschwindigkeit." ; +VAL_ 930 PSD_Ges_Geschwindigkeit_Gespann 0 "alle Fahrzeuge" 1 "PKW mit Gespann" 2 "LKW, Busse, etc." ; +VAL_ 930 PSD_Abz_Vorgaenger_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig" ; +VAL_ 930 PSD_Sys_Geschwindigkeit_Einheit 0 "km/h" 1 "mph" ; +VAL_ 930 PSD_Ges_Geschwindigkeit_Witter 0 "WitterungsunabhīŋŊngig" 1 "NīŋŊsse, Regen, Niederschlag" 2 "GlīŋŊtte" 3 "Nebel" ; +VAL_ 930 PSD_Sys_Verkehrsrichtung 0 "Rechtsverkehr" 1 "Linksverkehr" ; +VAL_ 930 PSD_Ges_Geschwindigkeit_Tag_Anf 0 "kein Beginn definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag" ; +VAL_ 930 PSD_Abz_Geschwindigkeit 0 "kein Geschwindigkeitsgebot" 1 "0 km/h < v_max < 5 km/h" 2 "5 km/h īŋŊ v_max < 10km/h" 3 "10 km/h īŋŊ v_max < 15 km/h" 4 "15 km/h īŋŊ v_max < 20 km/h" 5 "20 km/h īŋŊ v_max < 25 km/h" 6 "25 km/h īŋŊ v_max < 30 km/h" 7 "30 km/h īŋŊ v_max < 35 km/h" 8 "35 km/h īŋŊ v_max < 40 km/h" 9 "40 km/h īŋŊ v_max < 45 km/h" 10 "45 km/h īŋŊ v_max < 50 km/h" 11 "50 km/h īŋŊ v_max < 60 km/h" 12 "60 km/h īŋŊ v_max < 70 km/h" 13 "70 km/h īŋŊ v_max < 80 km/h" 14 "80 km/h īŋŊ v_max < 90 km/h" 15 "90 km/h īŋŊ v_max < 100 km/h" 16 "100 km/h īŋŊ v_max < 110 km/h" 17 "110 km/h īŋŊ v_max < 120 km/h" 18 "120 km/h īŋŊ v_max < 130 km/h" 19 "130 km/h īŋŊ v_max < 140 km/h" 20 "140 km/h īŋŊ v_max < 150 km/h" 21 "150 km/h īŋŊ v_max < 160 km/h" 22 "160 km/h īŋŊ v_max" 23 " Geschwindigkeitsgebot aufgehoben" 24 "..0x1F ungīŋŊltig" ; +VAL_ 930 PSD_Ges_Geschwindigkeit_Tag_Ende 0 "kein Ende definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag" ; +VAL_ 930 PSD_Ges_Geschwindigkeit_Std_Anf 25 "kein Beginn fīŋŊr stundenweise EinschrīŋŊnkungen" ; +VAL_ 930 PSD_Abz_Geschwindigkeit_Typ 0 "Der Wert im Attribut Geschwindigkeitsbegrenzung entspricht der Geschwindigkeitsklasse von Navteq." 1 "Der Wert im Attribut Geschwindigkeitsbegrenzung entspricht einer explizit angegebenen Begrenzung der Geschwindigkeit" ; +VAL_ 930 PSD_Sys_Tunnel 0 "kein Tunnel oder keine Information verfuegbar" 1 "Tunnel" ; +VAL_ 930 PSD_Abz_Strassenklasse 0 " Rest (Feldweg, Schotter, Privatweg)" 1 "OrtsstraīŋŊe" 2 "Bundes-,Landstrasse" 3 "Autobahn" ; +VAL_ 930 PSD_Sys_Bruecke 0 "keine Bruecke oder keine Information verfuegbar" 1 "Bruecke" ; +VAL_ 930 PSD_Ort_Breite_VZ 0 "Nord" 1 "Sued" ; +VAL_ 930 PSD_Sys_Fahrsp_Gegenr 0 "keine Fahrspur" 1 "eine Fahrspur" 2 "mehr als eine Fahrspur" 3 "keine Information verfuegbar" ; +VAL_ 930 PSD_Abz_ADAS_Qualitaet 0 "keine ADAS QualitīŋŊt" 1 "ADAS QualitīŋŊt" ; +VAL_ 930 PSD_Ges_Geschwindigkeit_Std_Ende 25 "kein Ende fīŋŊr stundenweise EinschrīŋŊnkungen" ; +VAL_ 930 PSD_Abz_Abzweigerichtung 0 "rechts abzweigende StraīŋŊe" 1 "links abzweigende StraīŋŊe" ; +VAL_ 930 PSD_Sys_TMC_Baustelle 0 "keine Baustelle oder keine Information verfuegbar" 1 "Baustelle" ; +VAL_ 930 PSD_Abz_Abzweigewinkel 0 "0īŋŊ: StraīŋŊe verlīŋŊuft gerade aus" 1 "0īŋŊ < Winkel īŋŊ 12īŋŊ" 2 "12īŋŊ < Winkel īŋŊ 24īŋŊ" 3 "24īŋŊ < Winkel īŋŊ 36īŋŊ" 4 "36īŋŊ < Winkel īŋŊ 48īŋŊ" 5 "48īŋŊ < Winkel īŋŊ 60īŋŊ" 6 "60īŋŊ < Winkel īŋŊ 72īŋŊ" 7 "72īŋŊ < Winkel īŋŊ 84īŋŊ" 8 "84īŋŊ < Winkel īŋŊ 96īŋŊ" 9 "96īŋŊ < Winkel īŋŊ 108īŋŊ" 10 "108īŋŊ < Winkel īŋŊ 120īŋŊ" 11 "120īŋŊ < Winkel īŋŊ 132īŋŊ" 12 "132īŋŊ < Winkel īŋŊ 144īŋŊ" 13 "144īŋŊ < Winkel īŋŊ 156īŋŊ" 14 "156īŋŊ < Winkel īŋŊ 168īŋŊ" 15 "168īŋŊ < Winkel īŋŊ 180īŋŊ" ; +VAL_ 930 PSD_Sys_TMC_Stau 0 "kein Stau oder keine Information verfuegbar" 1 "Stau" ; +VAL_ 930 PSD_Ges_alter_Geschw 0 "Kein Geschwindigkeitsgebot" 1 "0 km/h < v_max < 5 km/h" 2 "5 km/h īŋŊ v_max < 10km/h" 3 "10 km/h īŋŊ v_max < 15 km/h" 4 "15 km/h īŋŊ v_max < 20 km/h" 5 "20 km/h īŋŊ v_max < 25 km/h" 6 "25 km/h īŋŊ v_max < 30 km/h" 7 "30 km/h īŋŊ v_max < 35 km/h" 8 "35 km/h īŋŊ v_max < 40 km/h" 9 "40 km/h īŋŊ v_max < 45 km/h" 10 "45 km/h īŋŊ v_max < 50 km/h" 11 "50 km/h īŋŊ v_max < 60 km/h" 12 "60 km/h īŋŊ v_max < 70 km/h" 13 "70 km/h īŋŊ v_max < 80 km/h" 14 "80 km/h īŋŊ v_max < 90 km/h" 15 "90 km/h īŋŊ v_max < 100 km/h" 16 "100 km/h īŋŊ v_max < 110 km/h" 17 "110 km/h īŋŊ v_max < 120 km/h" 18 "120 km/h īŋŊ v_max < 130 km/h" 19 "130 km/h īŋŊ v_max < 140 km/h" 20 "140 km/h īŋŊ v_max < 150 km/h" 21 "150 km/h īŋŊ v_max < 160 km/h" 22 "160 km/h īŋŊ v_max" 23 "Geschwindigkeitsgebot aufgehoben" 24 "..0x1F ungīŋŊltig" ; +VAL_ 930 PSD_Abz_Rampe 0 "StraīŋŊe mit Gegenverkehr" 1 "Auffahrt (Einbahnstr.) " 2 "Abfahrt (Einbahnstr.)" 3 "EinbahnstraīŋŊe" ; +VAL_ 930 PSD_Abz_Anfangskruemmung 255 "Gerade" ; +VAL_ 930 PSD_Ges_alter_Geschw_Gespann 0 "alle Fahrzeuge" 1 "PKW mit Gespann" 2 "LKW, Busse, etc." ; +VAL_ 930 PSD_Ges_alter_Geschw_Witter 0 "WitterungsunabhīŋŊngig" 1 "NīŋŊsse, Regen, Niederschlag" 2 "GlīŋŊtte" 3 "Nebel" ; +VAL_ 930 PSD_Ges_alter_Geschw_Tag_Anf 0 "kein Beginn definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag" ; +VAL_ 930 PSD_Abz_Anfangskruemmung_Vorz 0 "KrīŋŊmmung positiv" 1 "KrīŋŊmmung negativ" ; +VAL_ 930 PSD_Sys_Anfangskruemmung 255 "Gerade" ; +VAL_ 930 PSD_Abz_Endkruemmung 255 "Gerade" ; +VAL_ 930 PSD_Ges_alter_Geschw_Tag_Ende 0 "kein Ende definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag" ; +VAL_ 930 PSD_Ges_alter_Geschw_Std_Anf 25 "kein Beginn fīŋŊr stundenweise EinschrīŋŊnkungen" ; +VAL_ 930 PSD_Sys_Anfangskruemmung_Vorz 0 "KrīŋŊmmung positiv" 1 "KrīŋŊmmung negativ" ; +VAL_ 930 PSD_Abz_Endkruemmung_Vorz 0 "KrīŋŊmmung positiv" 1 "KrīŋŊmmung negativ" ; +VAL_ 930 PSD_Ges_alter_Geschw_Std_Ende 25 "kein Ende fīŋŊr stundenweise EinschrīŋŊnkungen" ; +VAL_ 930 PSD_Sys_Anfangssteigung 30 "gleich oder mehr als 15 % Steigung" 31 "ungīŋŊltig" ; +VAL_ 930 PSD_Abz_Endsteigung 30 "gleich oder mehr als 15 % Steigung" 31 "ungīŋŊltig" ; +VAL_ 930 PSD_Ges_Ueberholverbot 0 "kein īŋŊberholverbot" 1 "alle Fahrzeuge" 2 "īŋŊberholverbot fīŋŊr PKW mit Gespann" 3 "īŋŊberholverbot fīŋŊr LKW, Busse, etc." ; +VAL_ 930 PSD_Sys_Anfangssteigung_Vorz 0 "GefīŋŊlle " 1 "Steigung" ; +VAL_ 930 PSD_Abz_Endsteigung_Vorz 0 "GefīŋŊlle" 1 "Steigung" ; +VAL_ 930 PSD_Sys_Ortschaft 0 "auīŋŊerhalb der Ortschaft" 1 "innerhalb der Ortschaft" ; +VAL_ 930 PSD_Abz_Fahrspuren 0 "EinbahnstraīŋŊe in falscher Richtung" 1 "eine Fahrspur" 2 "zwei Fahrspuren" 3 "mehr als 2 Fahrspuren" ; +VAL_ 930 PSD_Ges_Wechselverkehrszeichen 0 "Kein Wechselverkehrszeichen" 1 "Wechselverkehrszeichen links" 2 "Wechselverkehrszeichen rechts" 3 "Wechselverkehrszeichen links und rechts" 4 "Wechselverkerhszeichen īŋŊber der Fahrbahn" ; +VAL_ 930 PSD_Sys_Digitalisierung 0 "teildigitalisiert" 1 "volldigitalisiert" ; +VAL_ 930 PSD_Sys_Zielfuehrung 0 "Zielfuehrung nicht aktiv" 1 "Zielfuehrung aktiv" ; +VAL_ 930 PSD_Abz_wahrscheinlichster_Pfad 0 "Pfad mit geringer Wahrscheinlichkeit" 1 "wahrscheinlichster Pfad" ; +VAL_ 1528 SAK_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 1528 SAK_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ; +VAL_ 1528 SAK_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ; +VAL_ 1528 SAK_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1011 SCR_Dosierpumpe_Drehzahl 2047 "Fehler" ; +VAL_ 1011 SCR_Druck 1021 "nicht_verbaut" 1023 "Fehler" ; +VAL_ 1011 SCR_Level_Aktivtank 1021 "nicht_verbaut" 1023 "Fehler" ; +VAL_ 1011 SCR_Level_Passivtank 1021 "nicht_verbaut" 1023 "Fehler" ; +VAL_ 1507 SCR_Heizkreis_3_Strom 253 "nicht_verbaut" 255 "Fehler" ; +VAL_ 1507 SCR_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1507 SCR_Guetesensor 1021 "nicht_verbaut" 1023 "Fehler" ; +VAL_ 1507 SCR_Temp_Aktivtank 255 "Fehler" ; +VAL_ 1507 SCR_Temp_Passivtank 253 "nicht_verbaut" 255 "Fehler" ; +VAL_ 1507 SCR_Leitungsheizung_Strom 255 "Fehler" ; +VAL_ 1507 SCR_Transferpumpe_Strom 253 "nicht_verbaut" 255 "Fehler" ; +VAL_ 1507 SCR_Tankheizung_Strom 255 "Fehler" ; +VAL_ 1508 SCR_Spannungsversorgung_Status 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+(Ueberspannung)" 5 "OOR-(Unterspannung)" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "OOR+(FktEinschr_Ueberspg)" 13 "OOR-(FktEinschr_Unterspg)" 14 "frei" 15 "Diagnose_noch_nicht_beendet" ; +VAL_ 1508 SCR_VersorgungSensoren_Status 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+" 7 "RC-" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "frei" 13 "frei" 14 "frei" 15 "Diagnose_noch_nicht_beendet" ; +VAL_ 1508 SCR_Heizkreis_3_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Guetesensor_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Leitungsheizung_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Tankheizung_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Druck_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Dosierpumpe_Status_Spule 0 "kein_Fehler" 1 "KS-" 2 "KS+" 3 "OC" 4 "OOR+" 5 "OOR-" 6 "RC+(Drehzahl_zu_hoch)" 7 "RC-(Drehzahl_zu_niedrig)" 8 "KS+/OC" 9 "KS-/OC" 10 "KS-/KS+" 11 "KS-/KS+/OC" 12 "KS_zwischen_Phasen" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Transferpumpe_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Level_Aktivtank_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Level_Passivtank_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Temp_Aktivtank_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1508 SCR_Temp_Passivtank_Status 0 "kein_Fehler" 1 "KS- (Kurzschluss nach minus)" 2 "KS+ (Kurzschluss nach plus)" 3 "OC (Leitungsunterbrechung)" 4 "OOR+ (Signal zu gross)" 5 "OOR- (Signal zu klein)" 6 "RC+ (Signal unplausibel zu gross)" 7 "RC- (Signal unplausibel zu klein)" 8 "KS+/OC (Kurzschluss nach plus/Unterbrechung)" 9 "KS-/OC (Kurzschluss nach plus/Unterbrechung)" 10 "KS-/KS+ (Kurzschluss nach minus/plus)" 11 "KS-/KS+/OC (Kurzschluss nach minus/plus/Unterbrechung)" 12 "frei" 13 "frei" 14 "frei" 15 "frei" ; +VAL_ 1509 SCR_Ansteuerung_Transferpumpe 0 "nicht_aktiv" 1 "aktiv" ; +VAL_ 1509 SCR_Ansteuerung_Dosierpumpe 0 "nicht_aktiv" 1 "aktiv" ; +VAL_ 1509 SCR_Ansteuerung_Heizkreis_3 0 "nicht_aktiv" 1 "aktiv" ; +VAL_ 1509 SCR_Ansteuerung_Leitungsheizung 0 "nicht_aktiv" 1 "aktiv" ; +VAL_ 1509 SCR_Ansteuerung_Tankheizung 0 "nicht_aktiv" 1 "aktiv" ; +VAL_ 1526 SCR_Steuergeraet_Heizung_Status 0 "kein_Fehler" 1 "Endstufe_Tankheizung_ueberhitzt" 2 "Endstufe_Leitungsheizung_ueberhitzt" 3 "Diagnose_noch_nicht_beendet" ; +VAL_ 1526 SCR_Steuergeraet_Pumpe_Status 0 "kein_Fehler" 1 "Endstufe_Pumpe_ueberhitzt" 2 "Pumpe_blockiert" 3 "Diagnose_noch_nicht_beendet" ; +VAL_ 1526 SCR_Steuergeraet_Relais_Status 0 "kein_Fehler" 1 "KS+ (Ausgang Leistungsrelais) " 2 "KS-/OC (Ausgang Leistungsrelais)" 3 "Diagnose_noch_nicht_beendet" ; +VAL_ 1526 SCR_Steuergeraet_Bus_Status 0 "kein_Fehler" 1 "Bus_Kommunikation_Fehler" 2 "Bus_Kommunikation_Stoerung_(temporaer)" 3 "Diagnose_noch_nicht_beendet" ; +VAL_ 1526 SCR_Steuergeraet_Codierung_St000 0 "kein_Fehler" 1 "Steuergeraet_nicht_codiert" 2 "Steuergeraet_falsch_codiert" 3 "Diagnose_noch_nicht_beendet" ; +VAL_ 1526 SCR_Steuergeraet_Datensatz_St001 0 "kein_Fehler" 1 "ungueltiger_Datensatz" 2 "unplausibeler_Datensatz" 3 "Diagnose_noch_nicht_beendet" ; +VAL_ 1526 SCR_Steuergeraet_Defekt_Status 0 "kein_Fehler" 1 "Steuergeraet_defekt" 2 "Steuergeraet_Stoerung_(temporaer)" 3 "Diagnose_noch_nicht_beendet" ; +VAL_ 1510 SCR_CAL_ID_Name_01 48 "Fehler" ; +VAL_ 1510 SCR_CAL_ID_Name_02 48 "Fehler" ; +VAL_ 1510 SCR_CAL_ID_Name_03 48 "Fehler" ; +VAL_ 1512 SCR_CAL_ID_Leer 48 "Fehler" ; +VAL_ 133 SCU_Ue_Winkel_ADS 4094 "Init" 4095 "Fehler" ; +VAL_ 133 SCU_VZ_Ue_Winkel_ADS 0 "positiv" 1 "negativ" ; +VAL_ 133 SCU_Soll_Ue_Winkel 2046 "Init" 2047 "Fehler" ; +VAL_ 133 SCU_max_Gradient 511 "Fehler" ; +VAL_ 133 SCU_VZ_Soll_Ue_Winkel 0 "positiv" 1 "negativ" ; +VAL_ 133 SCU_Status 0 "betriebsbereit" 1 "Init" 2 "sichere īŋŊbersetzung" 3 "Motorsperre verriegelt" 4 "Synchronisierung līŋŊuft" ; +VAL_ 133 SCU_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 784 SCU_Warnlampe 0 "keine Anzeige (SCU_Status=0x0)" 1 "Warnlampe an (SCU_Status=0x1, 0x2, 0x3)" 2 "reserviert" 3 "Warnlampe Synchronisation (SCU_Status=0x4)" ; +VAL_ 784 SCU_Warnungen 0 "keine Anzeige (SCU_Status=0x0, 0x1)" 1 "ADS Stoerung (SCU_Status=0x2, 0x3)" 2 "ADS Initialisierung (SCU_Status=0x4)" 3 "reserviert" ; +VAL_ 784 SCU_Charisma_FahrPr 0 "nicht_belegt" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" ; +VAL_ 784 SCU_Charisma_Status 0 "Init (SCU_Status=0x1)" 1 "idle (SCU_Status=0x0, 0x4)" 2 "nicht verfuegbar (SCU_Status=0x2, 0x3)" 3 "reserviert" ; +VAL_ 784 SCU_Charisma_Umschaltung 0 "Idle" 1 "Erkennung_Umschaltaufforderung" 2 "Steuerbotschaft_nicht_definiert" 3 "Umschaltung_verzoegert" ; +VAL_ 1313 STH_Funk_ein 0 "kein Funkbefehl zum Einschalten" 1 "Funkbefehl zum Einschalten erhalten" ; +VAL_ 1313 STH_Funk_aus 0 "kein Funkbefehl" 1 "Funkbefehl zum Ausschalten erhalten" ; +VAL_ 1313 STH_Zusatzheizung 0 "Zuheizer aus" 1 "Zuheizer ein" ; +VAL_ 1313 STH_LED 0 "keine RīŋŊckmeldung" 1 "Rueckmeldung Standheizung in Betrieb" ; +VAL_ 1313 STH_Geblaese 0 "kein Einschaltbefehl an die Klimaanlage, GeblīŋŊse" 1 "Einschaltbefehl an die Klimaanlage, GeblīŋŊse" ; +VAL_ 1313 STH_EKP_Anst 0 "EKP nicht ansteuern" 1 "EKP ansteuern" ; +VAL_ 1313 STH_Start_folgt 0 "kein_Start_folgt" 1 "Start_folgt" ; +VAL_ 1313 STH_Ventil_Status 0 "Ventil_offen__grosser_Kreislauf" 1 "Ventil_geschlossen__kleiner_Kreislauf" ; +VAL_ 1313 STH_Fehlerstatus 0 "kein Fehler" 1 "Batterie Low" 2 "Fuel Low" 3 "Hardware defekt" 4 "Heizgeraet verriegelt" ; +VAL_ 1313 STH_Wassertemp 254 "Init" 255 "Fehler" ; +VAL_ 1313 STH_Motorvorwaermung 0 "keine MotorvorwīŋŊrmung erfolgt" 1 "Aufheizung mit MotorvorwīŋŊrmung erfolgt" ; +VAL_ 1313 STH_war_aktiv 0 "war inaktiv" 1 "Standheizung war letzte halbe Stunde aktiv" ; +VAL_ 1313 STH_KVS_Ueberlauf 0 "kein īŋŊberlauf" 1 "Kraftstoffverbrauchssignal, mindestens ein īŋŊberlauf hat stattgefunden" ; +VAL_ 1313 STH_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1172 STS_Car_not_under_theft 0 "false" 1 "true" ; +VAL_ 1172 STS_Car_under_theft 0 "false" 1 "true" ; +VAL_ 1172 STS_Anlassersperre 0 "inaktiv" 1 "aktiv" ; +VAL_ 1172 STS_Typencodierung 0 "Basis" 1 "E-Gas" 4 "Sonderschutz" ; +VAL_ 1172 STS_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1172 STS_Standlicht 0 "inaktiv" 1 "aktiv" ; +VAL_ 1172 STS_Fahrlicht 0 "inaktiv" 1 "aktiv" ; +VAL_ 1172 STS_Alarm_still 0 "inaktiv" 1 "aktiv" ; +VAL_ 1172 STS_Texte 0 "kein_Text" 1 "Text_01" 2 "Text_02" 3 "Text_03" 4 "Text_04" 5 "Text_05" 6 "Text_06" 7 "Text_07" 8 "Text_08" 9 "Text_09" 10 "Text_10" 11 "Text_11" 12 "Text_12" 13 "Text_13" 14 "Init" 15 "Fehler" ; +VAL_ 1172 STS_Laderelais 0 "Relais_offen" 1 "Relais_geschlossen" ; +VAL_ 1172 STS_Summer 0 "inaktiv" 1 "aktiv" ; +VAL_ 1172 STS_Notstart 0 "kein_Notstart" 1 "Notstart" ; +VAL_ 1172 STS_Signalhorn 0 "inaktiv" 1 "aktiv" ; +VAL_ 1172 STS_Leerlaufschaltung 0 "Leerlaufschaltung_Aus" 1 "Leerlaufschaltung_Ein" ; +VAL_ 1413 SI_Int_CAN_gespiegelt 0 "interner CAN getrennt" 1 "interner CAN gespiegelt" ; +VAL_ 1413 SI_CAN_Komfort_Sleep 0 "keine_Busruhe" 1 "Busruhe" ; +VAL_ 1413 SI_CAN_Dashboard_Sleep 0 "keine_Busruhe" 1 "Busruhe" ; +VAL_ 1413 SI_CAN_Antrieb_Sleep 0 "keine_Busruhe" 1 "Busruhe" ; +VAL_ 1413 SI_Infotainment_Sleep 0 "keine_Busruhe" 1 "Busruhe" ; +VAL_ 1413 SI_CAN_Extended_Sleep 0 "keine_Busruhe" 1 "Busruhe" ; +VAL_ 1413 SI_Fahrwerk_Sleep 0 "keine_Busruhe" 1 "Busruhe" ; +VAL_ 1413 SI_Diagnose_Aktiv 0 "inaktiv" 1 "aktiv" ; +VAL_ 1413 SI_QRS_Mode 0 "QRS_Messmodus_nicht_aktiv" 1 "QRS_Messmodus_aktiv" ; +VAL_ 1413 SI_T_Mode 0 "Transportmodus_nicht_aktiv" 1 "Transportmodus_aktiv" ; +VAL_ 1413 SI_NWDF 0 "Ueberwachung_nicht_freigegeben" 1 "Ueberwachung_freigegeben" ; +VAL_ 1413 SI_NWDF_gueltig 0 "NWDF_wird_nicht_unterstuetzt" 1 "NWDF_wird_unterstuetzt" ; +VAL_ 1413 SI_Sammelfehler 0 "kein_Sammelfehler" 1 "Sammelfehler" ; +VAL_ 1413 GW_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; +VAL_ 1413 SI_MOST_Status 0 "MOST_sleep_(Licht_AUS)" 1 "MOST_aktiv_(Kommunikation_moeglich)" ; +VAL_ 1413 SI_Sammel_SG_Fehler 61 "Reserviert" 62 "Overflow" ; +VAL_ 1413 SI_MO_WU 0 "kein Wakeup angefordert" 1 "Wakeup MED9 angefordert" ; +VAL_ 786 FAS_Wunschgeschw 1022 "keine Anzeige" 1023 "nicht definiert" ; +VAL_ 786 FAS_Status_Prim_Anz 0 "Symbol nicht beleuchtet" 1 "Farbe 1 (typisch 'grīŋŊn')" 2 "Farbe 2 (typisch 'rot')" 3 "Farbe 3 (typisch 'gelb')" ; +VAL_ 786 FAS_Texte_Primaeranz 0 "keine Anzeige " 1 "ACC nicht verfuegbar !" 2 "Auto_Auto_ _ _" 3 "Auto_ _Auto_ _" 4 "Auto_ _ _Auto_" 5 "Auto_ _ _ _Auto" 6 "Auto_Auto_ _ _ Gong (durchgestrichen)" 7 "Auto_ _Auto_ _ Gong (durchgestrichen)" 8 "Auto_ _ _Auto_ Gong (durchgestrichen)" 9 "Auto_ _ _ _Auto Gong (durchgestrichen)" 10 "ACC bereit" 11 "keine Abstandsregelung" 12 "ACC Sensor Sicht !" 13 "ACC nicht verfuegbar" 14 "o o o" 15 "Hochschalten" 16 "ESP Eingriff" 17 "Herunterschalten" 18 "Parkbremse !" 19 "Geschwindigkeitsgrenze" 20 "Waehlhebelposition !" 21 "VDA ACC-Symbol YYY km/h / mph" 22 "Tempolimit XXX km/h / mph" 23 "Kurve XXX km/h / mph" 24 "ACC Abschaltung" 25 "Symbol 'Eieruhr'" 26 "!" 27 "--- km/h / mph" 28 "XXX km/h / mph (Schriftart 2)" 29 "Lenkradwinkel" 30 "Anfahren bestaetigen" 31 "Fahrzeug verloren" 32 "Im Stand nicht moeglich" 33 "Ungueltiger Anfahrbefehl" 34 "Tuer offen !" 35 "Fahrer Gurtschloss offen !" 36 "Schalthebelposition !" 37 "Drehzahl !" 38 "Kurvenassistent aus" 39 "Tempolimit aus" 40 "Abbiegeassistent" 41 "Ortsanfang XXX km/h / mph" 42 "Ortsende XXX km/h / mph" 43 "Tempolimit Ende XXX km/h / mph" 44 "HDC aktiv" 45 "braking guard Bremsruck" 46 "braking guard aus " 47 "braking guard aus" 48 "Uebernehmen !" 49 "Steigung zu gross" 50 "Stehendes Objekt voraus" 51 "SET / 'GRA Symbol'___xxx km/h / mph" 52 "SET / 'GRA Symbol' xxx km/h / mph" 53 "ACC aus" 54 "ACC startet" 55 "ACC reinigen" 56 "ACC Fehler" 57 "ACC haelt an !" 58 "Bremse betaetigen !" 59 "Kupplung betaetigt" 60 "LIM AUS" 61 "LIM AKTIV " 62 "LIM PASSIV" 63 "LIM FEHLER" 64 "Bremse ueberhitzt !" 65 "Bremse haelt !" 66 "ESP PASSIV !" ; +VAL_ 786 FAS_Status_Anzeige 0 "ACC/GRA Hauptschalter aus" 1 "ACC in Init (nicht bei GRA)" 2 "ACC/GRA passiv" 3 "ACCGRA aktiv" 4 "ACC/GRA im Hintergrund (īŋŊbertreten)" 5 "frei" 6 "ACC reversibel aus (nicht bei GRA)" 7 "ACC/GRA irreversibel aus" ; +VAL_ 270 TSK_ax_Getriebe 511 "nicht definiert" ; +VAL_ 270 TSK_Freig_WU 0 "TSK_Uebersetzungswunsch nicht freigegeben" 1 "TSK_Uebersetzungswunsch freigegeben" ; +VAL_ 270 TSK_Limiter_aktiv 0 "Speed Limiter ist nicht aktiv" 1 "Speed Limiter aktiv und regelt" ; +VAL_ 270 TSK_Status_GRA_ACC_02 0 "nicht verbaut / kein ACC zulīŋŊssig" 1 "GRA / ACC aktiv " 2 "GRA / ACC vom Fahrer īŋŊbersteuert" 3 "Fehler, GRA/ACC nicht mīŋŊglich " ; +VAL_ 273 TSK_QBit_Steigung 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 273 TSK_Status_GRA_ACC_01 0 "nicht_verbaut_kein_ACC_zulaessig" 1 "GRA_ACC_aktiv" 2 "GRA_ACC_vom_Fahrer_uebersteuert" 3 "Fehler_GRA_ACC_nicht_moeglich" ; +VAL_ 273 TSK_Fahrzeugmasse 31 "Fehler" ; +VAL_ 273 TSK_QBit_Fahrzeugmasse 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert" ; +VAL_ 273 TSK_Fahrzeugmasse_02 255 "Fehler" ; +VAL_ 273 TSK_Steigung 255 "Fehler" ; +VAL_ 273 TSK_Getriebeinfo 0 "Handschalter" 1 "AL_AQ_Getriebe" 2 "DL_DQ_Getriebe" 3 "CVT_Getriebe" ; +VAL_ 273 TSK_Codierung_ACC 0 "TSK_korrekt_auf_kein_ACC_codiert_oder_TSK_falsch_codiert" 1 "TSK_korrekt_auf_ACC_codiert" ; +VAL_ 273 TSK_Zwangszusch_ESP 0 "keine_ESP_ASR_Beeinflussung" 1 "ESP_ASR_Beeinflussung" ; +VAL_ 273 TSK_Freig_Verzoeg_Anf 0 "Verzoegerungsanforderung_nicht_freigegeben" 1 "Verzoegerungsanforderung_freigegeben" ; +VAL_ 1414 WH_KD_Fehler 0 "kein_KD_Fehler" 1 "KD_Fehler" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/vw_mqb.dbc b/artifacts/package_runtime/iqdbc/dbc/vw_mqb.dbc new file mode 100644 index 000000000..dc79e16e9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/vw_mqb.dbc @@ -0,0 +1,1804 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: Airbag_MQB BAP_Tester_MQB BMS_MQB Datenlogger_MQB Gateway_MQB Getriebe_DQ_Hybrid_MQB Getriebe_DQ_MQB LEH_MQB Motor_Diesel_MQB Motor_Hybrid_MQB Motor_Otto_MQB SAK_MQB Waehlhebel_MQB Vector__XXX l c i XXX + + +BO_ 290 ACC_06: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_limitierte_Anfahrdyn : 12|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_nachtr_Stopp_Anf : 13|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_DynErhoehung : 14|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_StartStopp_Info : 22|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Sollbeschleunigung_02 : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_neg_Sollbeschl_Grad_02 : 40|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_pos_Sollbeschl_Grad_02 : 48|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ : 58|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 279 ACC_10: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ AWV_AWA_Status_EPS : 12|4@1+ (1,0) [0|7] "" XXX + SG_ AWV1_Anf_Prefill : 16|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_CM_Info : 17|1@1+ (1,0) [0|1] "" XXX + SG_ AWV2_Freigabe : 18|1@1+ (1,0) [0|1] "" XXX + SG_ AWV1_HBA_Param : 19|2@1+ (1,0) [0|3] "" XXX + SG_ AWV2_Ruckprofil : 21|3@1+ (1,0) [0|7] "" XXX + SG_ AWV2_Priowarnung : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_CM_Anforderung : 25|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Info_Teilbremsung : 26|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Notfallblinken : 27|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Teilbremsung_Freigabe : 28|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Zielbrems_Teilbrems_Verz_Anf : 29|10@1+ (0.024,-20.016) [-20.016|4.536] "Unit_MeterPerSeconSquar" XXX + SG_ ANB_Zielbremsung_Freigabe : 39|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_Vorstufe : 40|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_Halten : 41|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_CityANB_Auspraegung : 42|1@1+ (1,0) [0|1] "" XXX + SG_ PCF_Freigabe : 43|1@1+ (1,0) [0|1] "" XXX + SG_ AWV1_ECD_Anlauf : 44|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_AWA_VZ_Anf_Lenkmomoffset : 46|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ AWV_AWA_Anf_Lenkmomoffset : 47|9@1+ (0.01,0) [0.00|5.11] "Unit_NewtoMeter" XXX + SG_ PCF_Time_to_collision : 56|8@1+ (0.01,0) [0|2.5] "Unit_Secon" XXX + +BO_ 304 PLA_01: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ PLA_Status_PLA_ESP : 12|4@1+ (1.0,0.0) [0.0|15] "" XXX + SG_ PLA_LW_Soll : 16|13@1+ (0.1,0) [0.0|819.1] "Unit_DegreOfArc" XXX + SG_ PLA_VZ_LW_Soll : 31|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ PLA_Status_PLA_EPS : 32|4@1+ (1.0,0.0) [0.0|15] "" XXX + SG_ PLA_Bremsmoment : 36|13@1+ (4,0) [0|32760] "Unit_NewtoMeter" XXX + SG_ PLA_Bremsverzoegerung : 36|7@1+ (0.1,0) [0.0|12.0] "Unit_MeterPerSeconSquar" XXX + SG_ PLA_Anf_Bremsverzoegerung : 43|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ PLA_BremsMom_Verzoeg : 50|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ PLA_Anhalten : 51|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ PLA_Anhalteweg : 52|11@1+ (0.01,0) [0.01|20.45] "Unit_Meter" XXX + SG_ PLA_01_Signal_red_cyclic : 63|1@1+ (1.0,0.0) [0.0|1] "" XXX + +BO_ 679 ACC_13: 8 XXX + SG_ ACC_Regelgeschw : 12|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" XXX + SG_ ACC_Einheit_maxSetzgeschw : 22|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_maxSetzgeschw : 23|9@1+ (1,0) [0|510] "" XXX + SG_ ACC_minRegelgeschw : 32|8@1+ (0.32,0) [0|81.28] "Unit_KiloMeterPerHour" XXX + SG_ ACC_maxRegelgeschw : 40|8@1+ (0.32,0) [0|81.28] "Unit_KiloMeterPerHour" XXX + SG_ ACC_Tempolimitassistent : 48|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Kurvenassistent : 52|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_RUV : 56|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Tachokranz : 58|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ_Tachokranz_unten : 59|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_ENG_Texte : 60|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_ADAPTIVE : 63|2@0+ (1,0) [0|3] "" XXX + +BO_ 681 ACC_15: 8 XXX + SG_ AWV_Warnung : 16|3@1+ (1,0) [0|7] "" XXX + SG_ AWV_Texte : 24|3@1+ (1,0) [0|7] "" XXX + SG_ AWV_Status_Anzeige : 32|2@1+ (1,0) [0|3] "" XXX + SG_ AWV_Einstellung_System_FSG : 34|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_Einstellung_Warnung_FSG : 36|3@1+ (1,0) [0|7] "" XXX + SG_ AWV_Warnlevel : 58|6@1+ (1,0) [0|63] "" XXX + +BO_ 64 Airbag_01: 8 Airbag_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AB_RGS_Anst : 12|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ AB_Front_Crash : 16|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Heck_Crash : 17|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_SF_Crash : 18|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_SB_Crash : 19|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Rollover_Crash : 20|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Crash_Int : 21|3@1+ (1,0) [0|7] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AB_Lampe : 24|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Deaktiviert : 25|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_VB_deaktiviert : 26|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Systemfehler : 27|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ AB_Diagnose : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Stellgliedtest : 29|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AB_Erh_Auf_VB : 30|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtwarn_VF : 32|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Gurtwarn_VB : 33|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Anzeige_Fussg : 34|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Texte_AKS : 36|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_PAO_Leuchte_Anf : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_MKB_gueltig : 39|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_MKB_Anforderung : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Versorgungsspannung : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Deaktivierung_HV : 42|3@1+ (1.0,0.0) [0.0|7] "" BMS,Gateway_MQB,LEH_MQB,Motor_Hybrid_MQB + SG_ AB_EDR_Trigger : 45|2@1+ (1.0,0.0) [0.0|3] "" Gateway_MQB + SG_ AB_Gurtwarn_HFS : 47|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ AB_Gurtwarn_HBFS : 48|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ SC_Masterzeit_Offset : 53|2@1+ (5.08,0) [0.00|15.24] "Unit_Secon" Gateway_MQB + SG_ SC_Masterzeit : 57|7@1+ (0.04,0) [0.00|5.04] "Unit_Secon" Gateway_MQB + +BO_ 1312 Airbag_02: 8 Airbag_MQB + SG_ AB_Belegung_VB : 26|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_FA : 40|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Otto_MQB + SG_ AB_Gurtschloss_BF : 42|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1,0) [0|3] "" Gateway_MQB + +BO_ 65 Airbag_03: 8 Airbag_MQB + SG_ Airbag_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ Airbag_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ AB_MKB_Safing : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 1633 Anhaenger_01: 8 Gateway_MQB + SG_ AAG_BZ : 0|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Anhaenger_abgesteckt : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_NSL_aktiv : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Anhaenger_erkannt : 8|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Blinker_H_aktiv : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Blinker_HL_def : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Blinker_HR_def : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Bremslicht_H_def : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Schlusslicht_HL_def : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Schlusslicht_HR_def : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_AVS_Fehler_02 : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_AVS_Stati : 20|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 1626 BCM_01: 8 Gateway_MQB + SG_ BCM_Bremsbelag_Sensor : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Bremsfluessigkeit_Sensor : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Licht_Warn : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Waschwasser_Sensor : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Kuehlmittel_Sensor : 16|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_Kl_15_HW_erkannt : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Eis_Offroad_Taste : 18|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ZZH_Endlage_oben : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZZH_Endlage_unten : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZZH_Endlage_unplausibel : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM2_EZS_gedrueckt : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM2_SST_gedrueckt : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Hybrid_StartStopp_Taste : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_Warnblink_Taster : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Valet_Parking_Taster : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Remotestart_Betrieb : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_HSK_Taster : 28|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Heckrollo_Taster : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Rueckfahrlicht_Schalter : 30|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_MH_Schalter : 31|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_MH_WIV_Schalter : 32|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM_Eco_Charisma_Taste : 33|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ BCM_Thermomanagement : 34|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM_Thermomanagement_Fehler : 36|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM_Thermomanagement_gueltig : 37|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_Lichtwarn_Texte : 38|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 869 BEM_05: 8 Gateway_MQB + SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_n_LLA : 24|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_01_Abschaltstufen : 26|3@1+ (1,0) [0|7] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_Anf_KL : 29|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_StartStopp_Info : 30|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BEM_DFM : 32|5@1+ (3.225,0.025) [0.025|100] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_EMLIN_ungueltig : 37|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_Batt_Ab : 38|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_Segel_Info : 48|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_HYB_DC_uSollLV : 50|6@1+ (0.1,10.6) [10.6|16] "Unit_Volt" LEH_MQB + SG_ BEM_HYB_DC_uMinLV : 56|8@1+ (0.1,0) [0|25.3] "Unit_Volt" LEH_MQB + +BO_ 1628 BMS_Hybrid_01: 8 BMS_MQB + SG_ BMS_HYB_ASV_hinten_Status : 13|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_ASV_vorne_Status : 14|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_KD_Fehler : 15|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_BattFanSpd : 16|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ BMS_HYB_VentilationReq : 20|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_Spuelbetrieb_Status : 21|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_Kuehlung_Anf : 22|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ BMS_HYB_Temp_vor_Verd : 24|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB + SG_ BMS_HYB_Temp_nach_Verd : 32|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB + SG_ BMS_Temperatur : 40|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB + SG_ BMS_Temperatur_Ansaugluft : 48|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB + SG_ BMS_IstSpannung_HV : 56|8@1+ (1,100) [100|350] "Unit_Volt" Gateway_MQB + +BO_ 901 Charisma_01: 8 Gateway_MQB + SG_ CHA_Ziel_FahrPr_ALR : 0|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_ESP : 4|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_FL : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Fahrer_Umschaltung : 14|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ CHA_Ziel_FahrPr_MO : 16|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ CHA_Ziel_FahrPr_GE : 20|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ CHA_Ziel_FahrPr_ST : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_SCU : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_DR : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_QS : 36|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_AFS : 40|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_RGS : 44|4@1+ (1,0) [0|15] "" Airbag_MQB + SG_ CHA_Ziel_FahrPr_EPS : 48|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_ACC : 52|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_SAK : 56|4@1+ (1,0) [0|15] "" SAK_MQB + SG_ CHA_Ziel_FahrPr_MStSt : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 945 DC_Hybrid_01: 8 LEH_MQB + SG_ DC_HYB_iAktLV : 12|10@1+ (1,-511) [-511|510] "Unit_Amper" Gateway_MQB + SG_ DC_HYB_iAktReserveLV : 22|10@1+ (1,-511) [-511|510] "Unit_Amper" Gateway_MQB + SG_ DC_HYB_uAktLV : 32|8@1+ (0.1,0) [0|25.3] "Unit_Volt" Gateway_MQB + SG_ DC_HYB_LangsRegelung : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Abregelung_Temperatur : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Fehler_RedLeistung : 42|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Fehler_intern : 43|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Fehler_Spannung : 44|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Auslastungsgrad : 56|8@1+ (0.4,0) [0|100] "Unit_PerCent" Gateway_MQB + +BO_ 1714 Diagnose_01: 8 Gateway_MQB + SG_ DGN_Verlernzaehler : 0|8@1+ (1,0) [0|254] "" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB + SG_ KBI_Kilometerstand : 8|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Tag : 39|5@1+ (1,0) [1|31] "Unit_Day" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ Kombi_02_alt : 62|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB + SG_ Uhrzeit_01_alt : 63|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB + +BO_ 1520 Dimmung_01: 8 Gateway_MQB + SG_ DI_KL_58xd : 0|8@1+ (1,0) [0|253] "" Airbag_MQB + SG_ DI_KL_58xs : 8|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ DI_Display_Nachtdesign : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ DI_KL_58xt : 16|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ DI_Fotosensor : 24|16@1+ (1,0) [0|65535] "" Vector__XXX + +BO_ 1603 Einheiten_01: 8 Gateway_MQB + SG_ KBI_Einheit_Datum : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Druck : 2|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Streckenanz : 4|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB + SG_ KBI_MFA_v_Einheit_02 : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Einheit_Temp : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Einheit_Verbrauch : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Volumen : 10|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 260 EPB_01: 8 Gateway_MQB + SG_ EPB_01_CRC : 0|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_01_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_QBit_Laengsbeschleunigung : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_QBit_Pedalweg_Kuppl : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_BCM2_Motor_Wakeup : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_Freig_Verzoeg_Anf : 15|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_Verzoeg_Anf : 16|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" Vector__XXX + SG_ EPB_Laengsbeschleunigung : 24|8@1+ (1,-128) [-128|126] "Unit_PerCentOfForceOfGravi" Vector__XXX + SG_ EPB_Pedalweg_Kuppl : 32|8@1+ (0.4,0) [8|92] "Unit_PerCent" Vector__XXX + SG_ EPB_Anfahrwunsch_erkannt : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_DAA_Randbed_erf : 49|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ EPB_Fehlerstatus : 50|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EPB_Schalterposition : 52|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_QBit_Schalterpos : 54|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_Konsistenz_ACC : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_Spannkraft : 56|5@1+ (1,0) [0|29] "Unit_KiloNewto" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ EPB_Status : 61|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 257 ESP_02: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Gierrate : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_QBit_Laengsbeschl : 13|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Querb : 14|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Stillstandsflag : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Querbeschleunigung : 16|8@1+ (0.01,-1.27) [-1.27|1.27] "Unit_ForceOfGravi" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Laengsbeschl : 24|10@1+ (0.03125,-16) [-16|15.90625] "Unit_MeterPerSeconSquar" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Verteil_Wankmom : 34|5@1+ (0.1,-1) [-1|1] "" Vector__XXX + SG_ ESP_QBit_Anf_Vert_Wank : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Gierrate : 40|14@1+ (0.01,0) [0|163.82] "Unit_DegreOfArcPerSecon" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_VZ_Gierrate : 54|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_Notbremsanzeige : 55|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESP_SpannungsAnf : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_PLA_Abbruch : 57|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ESP_Status_ESP_PLA : 60|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 262 ESP_05: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Bremsdruck : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Fahrer_bremst : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Schwelle_Unterdruck : 14|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Bremsdruck : 16|10@1+ (0.3,-30) [-30|276.6] "Unit_Bar" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Fahrer_bremst : 26|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Verz_TSK_aktiv : 27|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Lenkeingriff_ADS : 28|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Konsistenz_TSK : 29|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Bremsruck_AWV2 : 30|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Konsistenz_AWV2 : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ECD_Fehler : 32|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ECD_nicht_verfuegbar : 33|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Status_Bremsentemp : 34|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Autohold_Standby : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_HDC_Standby : 36|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_HBA_aktiv : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Prefill_ausgeloest : 38|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Rueckwaertsfahrt_erkannt : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Status_Anfahrhilfe : 40|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HDC_aktiv : 41|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_StartStopp_Info : 42|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ESP_Eingr_HL : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Eingr_HR : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Eingr_VL : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Eingr_VR : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_BKV_Unterdruck : 48|8@1+ (4,0) [0|1012] "Unit_MilliBar" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Autohold_aktiv : 56|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_FStatus_Anfahrhilfe : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_Verz_EPB_aktiv : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ECD_Bremslicht : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Verzoeg_EPB_verf : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Status_Bremsdruck : 61|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Anforderung_EPB : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 914 ESP_07: 8 Gateway_MQB + SG_ ESP_07_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_07_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_ACC_LDE : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Quattro_Antrieb : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Codierung_ADS : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_RTA_HL : 16|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX + SG_ ESP_RTA_HR : 24|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX + SG_ ESP_RTA_VR : 32|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX + SG_ OBD_Fehler_Radsensor_HL : 40|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_Fehler_Radsensor_HR : 44|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_Fehler_Radsensor_VL : 48|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_Fehler_Radsensor_VR : 52|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Qualifizierung_Antriebsart : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Offroad_Modus : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_MKB_ausloesbar : 58|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESP_MKB_Status : 59|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESP_CM_Variante : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_OBD_Status : 61|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 278 ESP_10: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_VL : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_VR : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_HL : 14|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_HR : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_VL : 16|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_VR : 26|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_HL : 36|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_HR : 46|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VL_Fahrtrichtung : 56|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VR_Fahrtrichtung : 58|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HL_Fahrtrichtung : 60|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HR_Fahrtrichtung : 62|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 178 ESP_19: 8 Gateway_MQB + SG_ ESP_HL_Radgeschw_02 : 0|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HR_Radgeschw_02 : 16|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VL_Radgeschw_02 : 32|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VR_Radgeschw_02 : 48|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 1629 ESP_20: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ BR_Systemart : 12|2@1+ (1,0) [0|3] "" XXX + SG_ ESP_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" XXX + SG_ ESP_Zaehnezahl : 16|8@1+ (1,0) [0|255] "" XXX + SG_ ESP_Charisma_FahrPr : 24|4@1+ (1,0) [0|15] "" XXX + SG_ ESP_Charisma_Status : 28|2@1+ (1,0) [0|3] "" XXX + SG_ ESP_Wiederstart_Anz_01 : 30|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Wiederstart_Anz_02 : 31|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Wiederstart_Anz_03 : 32|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Wiederstart_Anz_04 : 33|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stoppverbot_Anz_01 : 34|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stoppverbot_Anz_02 : 35|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stoppverbot_Anz_03 : 36|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stoppverbot_Anz_04 : 37|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stoppverbot_Anz_05 : 38|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stoppverbot_Anz_06 : 39|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stoppverbot_Anz_07 : 40|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stoppverbot_Anz_Std : 41|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Dachrelingsensor : 42|2@1+ (1,0) [0|3] "" XXX + SG_ ESP_Stoppverbot_Anz_08 : 44|1@1+ (1,0) [0|1] "" XXX + SG_ HDC_Charisma_FahrPr : 45|4@1+ (1,0) [0|15] "" XXX + SG_ HDC_Charisma_Status : 49|2@1+ (1,0) [0|3] "" XXX + SG_ BR_QBit_Reifenumfang : 51|1@1+ (1,0) [0|1] "" XXX + SG_ BR_Reifenumfang : 52|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX + +BO_ 253 ESP_21: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ BR_Eingriffsmoment : 12|10@1+ (1,-509) [-509|509] "" XXX + SG_ ESP_PLA_Bremseingriff : 22|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Diagnose : 23|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESC_Reku_Freigabe : 24|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESC_v_Signal_Qualifier_High_Low : 25|3@1+ (1.0,0.0) [0.0|7] "" XXX + SG_ ESP_Vorsteuerung : 28|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_AWV3_Brems_aktiv : 29|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ OBD_Schlechtweg : 30|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ OBD_QBit_Schlechtweg : 31|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0.00|655.32] "Unit_KiloMeterPerHour" XXX + SG_ ASR_Tastung_passiv : 48|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Tastung_passiv : 49|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Systemstatus : 50|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ASR_Schalteingriff : 51|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ ESP_Haltebestaetigung : 53|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_MKB_Abbruch_Geschw : 54|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_QBit_v_Signal : 55|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ABS_Bremsung : 56|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ASR_Anf : 57|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MSR_Anf : 58|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ EBV_Eingriff : 59|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ EDS_Eingriff : 60|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Eingriff : 61|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_ASP : 62|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Anhaltevorgang_ACC_aktiv : 63|1@1+ (1.0,0.0) [0.0|1] "" XXX + +BO_ 987 Gateway_72: 8 Gateway_MQB + SG_ BCM_01_alt : 0|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ SMLS_01_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ZV_02_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Wischer_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Anhaenger_01_alt : 4|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ Klima_Sensor_02_alt : 5|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ VSG_01_alt : 6|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ Klima_01_alt : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_01_alt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Licht_Anf_01_alt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HFS_offen : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HBFS_offen : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VS_VD_offen_ver : 22|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ VS_VD_zu_ver : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_BT_offen : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Rueckfahrlicht_Schalter : 25|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ZV_FT_offen : 26|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Wischer_vorne_aktiv : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Anhaenger_erkannt : 28|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ BCM1_MH_Schalter : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HD_offen : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Waschen_vorne_aktiv : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Thermomanagement : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WFS_Schluessel_Fahrberecht : 34|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BCM1_RFahrlicht_Fzg_Anf : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_RFahrlicht_Ahg_Anf : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Fernlicht : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Blinker_li : 50|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BH_Blinker_re : 51|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_OBD_FStatus_ATemp : 52|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_Aussen_Temp_ungef : 56|8@1+ (0.5,-50) [-50|76] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 989 Gateway_74: 8 Gateway_MQB + SG_ LH_EPS_01_alt : 0|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB + SG_ Kessy_04_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ LIN_2_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MFG_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ GW_74_va_14 : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Klima_02_alt : 5|1@1+ (1,0) [0|1] "" BMS_MQB + SG_ Parkhilfe_01_alt : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ELV_01_alt : 7|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KY_StartStopp_Info : 16|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ PH_StartStopp_Info : 18|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ EPS_Lenkerposition : 20|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB + SG_ ELV_Anf_Klemme_50 : 22|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ MF_StartStopp_Info : 25|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ KL_Geblaesespannung_Soll : 40|8@1+ (0.05,0.5) [2|13] "Unit_Volt" BMS_MQB + SG_ KL_Umluftklappe_Status : 48|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Tip_Down : 56|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MFL_Tip_Up : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ LS_Tiptronic_Fehler : 58|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 296 Getriebe_06: 3 Getriebe_DQ_Hybrid_MQB + SG_ GE_WH_Sperre : 0|1@1+ (1,0) [0|1] "" Waehlhebel_MQB + SG_ GE_Ausleuchtungsmode : 1|1@1+ (1,0) [0|1] "" Waehlhebel_MQB + SG_ GE_Test_Freigabe : 2|1@1+ (1,0) [0|1] "" Waehlhebel_MQB + SG_ GE_Ist_Fahrstufe : 4|4@1+ (1,0) [0|15] "" Waehlhebel_MQB + SG_ GE_Testparameter_1 : 8|8@1+ (1,0) [0|255] "" Waehlhebel_MQB + SG_ GE_Testparameter_2 : 16|8@1+ (1,0) [0|255] "" Waehlhebel_MQB + +BO_ 173 Getriebe_11: 8 Getriebe_DQ_Hybrid_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER_DISABLED : 8|4@1+ (1,0) [0|15] "" XXX + SG_ GE_MMom_Soll_02 : 12|10@1+ (1,-509) [-509|509] "" XXX + SG_ GE_MMom_Vorhalt_02 : 22|10@1+ (1,-509) [-509|509] "" XXX + SG_ GE_Uefkt : 32|10@1+ (0.1,0) [0|102.2] "" XXX + SG_ GE_Fahrstufe : 42|4@1+ (1,0) [0|15] "" XXX + SG_ GE_reserv_Fahrstufe : 46|1@1+ (1,0) [0|1] "" XXX + SG_ GE_Schaltablauf : 47|2@1+ (1,0) [0|3] "" XXX + SG_ GE_Uefkt_unplausibel : 49|1@1+ (1,0) [0|1] "" XXX + SG_ GE_MMom_Status_02 : 50|3@1+ (1,0) [0|7] "" XXX + SG_ GE_Status_Kraftschluss : 53|3@1+ (1,0) [0|7] "" XXX + SG_ GE_MMom_Status : 56|2@1+ (1,0) [0|3] "" XXX + SG_ GE_Freig_MMom_Vorhalt : 58|1@1+ (1,0) [0|1] "" XXX + SG_ GE_Verbot_Ausblendung : 59|1@1+ (1,0) [0|1] "" XXX + SG_ GE_Zielgang : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 174 Getriebe_12: 8 Getriebe_DQ_Hybrid_MQB + SG_ Getriebe_12_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Getriebe_12_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Drehzahlmesser_Daempfung : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Schubabschalt_Unt : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Freigabe_Synchro : 14|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Synchro_Wunschdrehz : 15|9@1+ (25,0) [0|12750] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Synchro_Zeit : 24|8@1+ (20,0) [0|5080] "Unit_MilliSecon" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Mom_Begr_Gradient : 32|8@1+ (10,0) [0|2540] "Unit_NewtoMeterPerSecon" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Anheb_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Aufnahmemoment : 48|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Anf_Zylabsch : 58|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ GE_HYB_DZ_Eingriff : 62|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB + +BO_ 301 Getriebe_13: 8 Getriebe_DQ_Hybrid_MQB + SG_ Getriebe_13_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Getriebe_13_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_StartStopp_Info : 12|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ GE_Langfr_Schutzmom_02 : 14|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Eingangsdrehz : 48|14@1+ (1,0) [0|16381] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Notlauf : 62|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Freig_Langfr_Schutzmom : 63|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 968 Getriebe_14: 8 Getriebe_DQ_Hybrid_MQB + SG_ GE_OBD_AbsperrVent : 12|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_amax_moeglich : 16|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Charisma_FahrPr : 25|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ GE_Charisma_Status : 29|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ GE_Verlustmoment : 32|8@1+ (1,0) [0|254] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Freigabe_Verfallsinfo_WFS : 49|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ GE_Codierung_MSG : 50|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ GE_LaunchControl : 51|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ GE_Heizwunsch : 52|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_OBD_Status : 54|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_LFR_Adaption : 55|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Sumpftemperatur : 56|8@1+ (1,-58) [-58|196] "Unit_DegreCelsi" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 158 Getriebe_Hybrid_01: 8 Getriebe_DQ_Hybrid_MQB + SG_ Getriebe_Hybrid_01_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Hybrid_MQB + SG_ Getriebe_Hybrid_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB + SG_ GE_HYB_Fehlerstatus : 12|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB + SG_ GE_HYB_Freigabe_K0 : 16|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Freigabe_LL_Reg : 17|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Freig_sSchl_K0 : 18|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Freig_VM_EM_Stop : 19|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Wiederstart : 20|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Filt_MomAufbau : 21|3@1+ (1,0) [0|7] "" Motor_Hybrid_MQB + SG_ GE_HYB_nK0 : 24|8@1+ (25,0) [0|6350] "Unit_MinutInver" Vector__XXX + SG_ GE_HYB_MomEingriff_EM : 32|6@1+ (0.5,0) [0|31.5] "Unit_NewtoMeter" LEH_MQB + SG_ GE_HYB_VZ_MomEingriff_EM : 38|1@1+ (1,0) [0|1] "" LEH_MQB + SG_ GE_HYB_Sportfaktor : 56|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB + SG_ GE_HYB_VM_akt_halten : 61|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_StartAnf : 62|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_VM_Startkontr : 63|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + +BO_ 299 GRA_ACC_01: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Hauptschalter : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Abbrechen : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Typ_Hauptschalter : 14|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Limiter : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Setzen : 16|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Hoch : 17|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Runter : 18|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Wiederaufnahme : 19|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Verstellung_Zeitluecke : 20|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Codierung : 22|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Fehler : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Typ468 : 25|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Stufe_2 : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_ButtonTypeInfo : 28|2@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 960 Klemmen_Status_01: 4 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ZAS_Kl_S : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZAS_Kl_15 : 17|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ZAS_Kl_X : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZAS_Kl_50 : 19|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 949 Klima_11: 8 Gateway_MQB + SG_ KL_Drehz_Anh : 0|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_AC_Schalter : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Komp_Moment_alt : 3|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Zonen : 4|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Zustand : 7|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_Comp_rev_rq : 8|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX + SG_ KL_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KL_Charisma_Status : 20|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Comp_enable : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0|63.5] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_Spannungs_Anf : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Thermomanagement : 34|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_StartStopp_Info : 36|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_el_Zuheizer_Stufe : 48|3@1+ (1,0) [0|7] "" Motor_Diesel_MQB + +BO_ 1625 Klimakomp_01: 8 Gateway_MQB + SG_ EKL_KD_Fehler : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EKL_Comp_SCI_com_stat : 16|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EKL_Comp_output_stat : 18|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EKL_Comp_main_stat : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EKL_Comp_ovld_stat : 21|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EKL_Comp_Inv_stat : 24|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EKL_Comp_photo_temp_stat : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EKL_Comp_photo_temp : 32|8@1+ (1,0) [0|254] "Unit_DegreCelsi" Vector__XXX + SG_ EKL_Comp_current : 40|8@1+ (0.1,0) [0|25.4] "Unit_Amper" Motor_Hybrid_MQB + SG_ EKL_Comp_rev_stat : 48|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX + +BO_ 2549088277 KN_Airbag_01: 8 Airbag_MQB + SG_ Airbag_01_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Airbag_01_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ AB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088380 KN_EMotor_01: 8 LEH_MQB + SG_ EMotor_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EMotor_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ EM_HYB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088375 KN_Getriebe_01: 8 Getriebe_DQ_Hybrid_MQB + SG_ Getriebe_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Getriebe_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ GE_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088379 KN_Hybrid_01: 8 BMS_MQB + SG_ Hybrid_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Hybrid_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ BMS_HYB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088374 KN_MO_01: 8 Motor_Diesel_MQB + SG_ Motor_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Motor_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088284 KN_SAK: 8 SAK_MQB + SG_ SAK_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SAK_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ SAK_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 779 Kombi_01: 8 Gateway_MQB + SG_ KBI_ABS_Lampe : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_ESP_Lampe : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_BKL_Lampe : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Airbag_Lampe : 3|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ KBI_SILA_gueltig : 4|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ KBI_Lenkung_Lampe : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Vorglueh_System_Lampe : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB + SG_ KBI_NV_in_Anzeige : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Kombi_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Anzeigestatus_ACC : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Anzeigestatus_GRA : 13|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Oeldruck_Schalter : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Tankwarnung : 16|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_MFA_v_Einheit_01 : 17|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_im_Stellgliedtest : 18|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ KBI_Anzeigefehler_LDW : 19|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Variante_USA : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Oeldruckwarnung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Handbremse : 23|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ KBI_V_Digital : 24|9@1+ (1,0) [0|511] "" Vector__XXX + SG_ KBI_PLA_in_Anzeige : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Anzeigefehler_NV : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Anzeigestatus_LIM : 35|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_angez_Geschw : 48|10@1+ (0.32,0) [0|325.12] "Unit_KiloMeterPerHour" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Einheit_Tacho : 58|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Konsistenz_ACC : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Fehler_Anzeige_ACC : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Anzeigefehler_SWA : 61|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1719 Kombi_02: 8 Gateway_MQB + SG_ KBI_Kilometerstand : 0|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Vector__XXX + SG_ KBI_Standzeit_02 : 20|17@1+ (1,0) [0|131068] "Unit_Secon" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Inhalt_Tank : 40|7@1+ (1,0) [0|125] "Unit_Liter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_FStatus_Tank : 47|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_QBit_Aussen_Temp_gef : 55|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Aussen_Temp_gef : 56|8@1+ (0.5,-50) [-50|75] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 982 Licht_hinten_01: 8 Gateway_MQB + SG_ Licht_hinten_01_BZ : 0|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LH_Aussenlicht_def : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Blinker_HL_akt : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Blinker_HR_akt : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Blinker_li_def : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_li_def : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schlusslicht_li_def : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Rueckf_li_def : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Nebel_li_def : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Brems_Blk_li_def : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Blinker_re_def : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_re_def : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schlusslicht_re_def : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Rueckf_re_def : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Nebel_re_def : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Brems_Blk_re_def : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Kennzl_def : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_3_Bremsl_def : 49|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LH_Nebel_mi_def : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Rueckf_mi_def : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 134 LWI_01: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_Sensorstatus : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_Lenkradwinkel : 16|13@1+ (0.1,0) [0|800] "Unit_DegreOfArc" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" Vector__XXX + SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" Vector__XXX + +BO_ 263 Motor_04: 8 Motor_Diesel_MQB + SG_ MO_Istgang : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Sollgang : 12|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Oeldruck : 16|8@1+ (0.04,0) [0|10] "Unit_Bar" Gateway_MQB + SG_ MO_Anzeigedrehz : 24|12@1+ (3,0) [0|12282] "Unit_MinutInver" Gateway_MQB + SG_ MO_Schaltempf_verfbar : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Ladedruck : 39|9@1+ (0.01,0) [0|5.1] "Unit_Bar" Gateway_MQB + SG_ MO_KVS : 48|15@1+ (1,0) [0|32767] "Unit_MicroLiter" Gateway_MQB + SG_ MO_KVS_Ueberlauf : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 1600 Motor_07: 8 Motor_Diesel_MQB + SG_ MO_QBit_Ansaugluft_Temp : 0|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_QBit_Oel_Temp : 1|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Kuehlmittel_Temp : 2|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Stellgliedtest_Soundaktuator : 3|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Fehler_HV_Netz : 4|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_aktives_Getriebeheizen : 5|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Absperrventil_oeffnen : 6|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Ansaugluft_Temp : 8|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB + SG_ MO_Oel_Temp : 16|8@1+ (1,-60) [-60|192] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kuehlmittel_Temp : 24|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Hoeheninfo : 32|8@1+ (0.00781,0) [0|1.98374] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kennfeldk : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Versionsinfo : 41|6@1+ (1,0) [0|63] "" Gateway_MQB + SG_ MO_Getriebe_kuehlen : 47|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Traegheit_02 : 48|5@1+ (0.01,0) [0|0.31] "Unit_KiloGramMeterSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Heizungspumpenansteuerung : 53|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ MO_SpannungsAnf : 57|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Nachlaufzeit_Heizungspumpe : 58|6@1+ (15,0) [0|945] "Unit_Secon" Gateway_MQB + +BO_ 1607 Motor_09: 8 Motor_Diesel_MQB + SG_ MO_ITM_Kuehlmittel_Temp : 0|8@1+ (0.75,-48) [-45.75|143.25] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_E85_Sensor : 8|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ SCR_Anz_Motorstarts : 12|4@1+ (1,0) [0|8] "" Gateway_MQB + SG_ SCR_Reichweite : 16|15@1+ (1,0) [0|32766] "" Gateway_MQB + SG_ SCR_Warnstufe_1 : 32|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ SCR_Warnstufe_2 : 33|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ SCR_Text : 34|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ SCR_Akustik : 37|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Kraftstofffilter_Wasser : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ SCR_Systemfehler : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ SCR_Inducement_Strategie : 42|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_CO2_Faktor : 44|12@1+ (1,0) [1|4094] "Unit_GramPerLiter" Gateway_MQB + +BO_ 167 Motor_11: 8 Motor_Diesel_MQB + SG_ Motor_11_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ Motor_11_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Soll_Roh : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Ist_Summe : 22|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,SAK_MQB + SG_ MO_Mom_Traegheit_Summe : 32|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Soll_gefiltert : 42|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Schub : 52|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Status_Normalbetrieb_01 : 61|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_erste_Ungenauschwelle : 62|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_QBit_Motormomente : 63|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 168 Motor_12: 8 Motor_Diesel_MQB + SG_ Motor_12_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ Motor_12_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Mom_neg_verfuegbar : 12|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB + SG_ MO_Mom_Begr_stat : 21|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Begr_dyn : 30|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB + SG_ MO_Momentenintegral_02 : 40|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Drehzahl_01 : 47|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Drehzahl_01 : 48|16@1+ (0.25,0) [0|16383] "Unit_MinutInver" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB + +BO_ 958 Motor_14: 8 Motor_Diesel_MQB + SG_ MO_StartStopp_Status : 12|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_StartStopp_Wiederstart : 14|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_StartStopp_Motorstopp : 15|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Freig_Reku : 16|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Kl_75 : 18|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Kl_50 : 19|1@1+ (1,0) [0|1] "" Gateway_MQB,LEH_MQB + SG_ MO_Gangposition : 20|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_StartStopp_Fahrerwunsch : 24|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_HYB_Fahrbereitschaft : 26|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB + SG_ MO_Ext_E_Fahrt_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Fahrer_bremst : 28|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Fahrer_bremst : 29|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_BLS : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Konsistenz_Bremsped : 31|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Timeout_ESP : 32|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Klima_Eingr : 33|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Aussp_Anlass : 35|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Freig_Anlass : 36|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Kuppl_schalter : 37|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Interlock : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Motor_laeuft : 39|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kickdown : 40|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Status_Zylabschalt_01 : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_EKlKomLeiRed : 42|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Handshake_STH : 44|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_BKV_Unterdruckwarnung : 45|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Freigabe_Segeln : 46|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_PTC_Status : 47|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ MO_QBit_Gangposition : 50|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Signalquelle_Gangposition : 51|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Remotestart_Betrieb : 52|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 1631 Motor_16: 8 Motor_Diesel_MQB + SG_ TSK_QBit_Steigung : 12|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_QBit_Fahrzeugmasse : 13|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_DPF_reg : 16|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Heizstrom_EKAT : 17|7@1+ (1,0) [0|126] "Unit_Amper" Gateway_MQB + SG_ MO_Heizstrom_SCR : 24|6@1+ (1,0) [0|62] "Unit_Amper" Gateway_MQB + SG_ TSK_Fahrzeugmasse_02 : 48|8@1+ (32,0) [0|8128] "Unit_KiloGram" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Steigung : 56|8@1+ (0.8,-101.6) [-101.6|101.6] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 812 Motor_17: 8 Motor_Diesel_MQB + SG_ MO_Prio_MAX_Wunschdrehzahl : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Prio_MIN_Wunschdrehzahl : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Luftpfad_aktiv : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_v_Begrenz_Aktivierbar : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Drehzahlbeeinflussung : 16|8@1+ (0.39,0) [0|99.45] "Unit_PerCent" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_MIN_Wunschdrehzahl : 24|8@1+ (25,0) [0|6350] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_MAX_Wunschdrehzahl : 32|9@1+ (25,0) [0|12750] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Charisma_FahrPr : 41|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Charisma_Status : 45|2@1+ (1,0) [0|3] "" Gateway_MQB + +BO_ 1648 Motor_18: 8 Motor_Diesel_MQB + SG_ MO_Hybrid_StartStopp_LED : 43|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Eis_Offroad_LED : 45|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ MO_Zylabsch_Texte : 50|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_E85_BS_Texte : 52|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ MO_Drehzahl_Warnung : 55|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 289 Motor_20: 8 Motor_Diesel_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|255] "" XXX + SG_ MO_Fahrpedalrohwert_01 : 12|8@1+ (0.4,0) [0.0|101.6] "Unit_PerCent" XXX + SG_ MO_QBit_Fahrpedalwerte_01 : 20|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_Fahrpedalgradient : 21|8@1+ (25,0) [0|6350] "Unit_PerCentPerSecon" XXX + SG_ MO_Sig_Fahrpedalgradient : 29|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_rel_Saugrohrdruck : 30|6@1+ (18,0) [0|1116] "Unit_MilliBar" XXX + SG_ MO_rel_Saugrohrdruck_gem_err : 36|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_Moment_im_Leerlauf : 37|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_Schubabschaltung : 38|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_StartStopp_StoppVorbereitung : 39|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" XXX + SG_ MO_Entkopplung_Sollschlupf : 48|7@1+ (20,0) [0|2480] "Unit_MinutInver" XXX + SG_ MO_temporaere_Fahrerabwesenheit : 55|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ TSK_a_Soll_gradientenbegrenzt : 57|7@1+ (0.1,-7.2) [-7.2|5.4] "Unit_MeterPerSeconSquar" XXX + +BO_ 967 Motor_26: 8 Motor_Diesel_MQB + SG_ MO_HYB_Status_HV_Ladung : 8|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ WIV_Anzeige_aktiv : 12|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Oelmin_Warn : 13|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Sensorfehler : 14|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Schieflage : 15|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ MO_Zustand_HWP : 20|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_nicht_betriebswarm : 25|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_laufender_Motor : 27|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_1 : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_2 : 29|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_3 : 30|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_4 : 31|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Text_Motorstart : 32|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_HYB_Text_5 : 36|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_6 : 37|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_7 : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Gateway_MQB + SG_ MO_Systemlampe : 48|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_OBD2_Lampe : 49|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Heissleuchte : 50|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Partikel_Lampe : 51|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Winterfahrprog : 52|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Unterfuell_Warn : 56|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 1601 Motor_Code_01: 8 Motor_Diesel_MQB + SG_ Motor_Code_01_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ Motor_Code_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Faktor_Momente_02 : 12|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Hybridfahrzeug : 14|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Code : 16|8@1+ (1,0) [0|255] "" Gateway_MQB,SAK_MQB + SG_ MO_Getriebe_Code : 24|6@1+ (1,0) [0|63] "" Gateway_MQB + SG_ MO_StartStopp_Codiert : 30|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Anzahl_Zyl : 32|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Kraftstoffart : 36|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Hubraum : 40|7@1+ (0.1,0) [0|12.7] "Unit_Liter" Gateway_MQB + SG_ MO_Ansaugsystem : 47|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Leistung : 48|9@1+ (1,0) [0|511] "Unit_KiloWatt" Gateway_MQB + SG_ MO_Abgastyp_EOBD : 57|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ MO_Abgastyp_OBD : 58|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ MO_DPF_verbaut : 59|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_Codierung : 60|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Einspritzart : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 157 Motor_Hybrid_01: 8 Motor_Hybrid_MQB + SG_ Motor_Hybrid_01_CRC : 0|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB + SG_ Motor_Hybrid_01_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_IstStatusK0 : 12|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_max_ind_VM_Mom : 16|10@1+ (1,0) [0|1021] "Unit_NewtoMeter" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Zielzustand : 26|3@1+ (1,0) [0|7] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Startmodus : 29|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_HYB_Startmodus_PQ3x : 32|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Stoppmodus : 33|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_VM_Mom_oE : 40|10@1+ (1,-100) [-100|922] "Unit_NewtoMeter" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_VM_aktiv : 50|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Schaltverhinderung : 51|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + +BO_ 811 Motor_Hybrid_02: 8 Motor_Hybrid_MQB + SG_ MO_HYB_E_Faktor : 12|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Drehzahl_VM : 16|16@1+ (0.25,0) [0|16256] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_LowSpeedModus : 32|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + +BO_ 2600468501 NMH_Airbag_01: 8 Airbag_MQB + SG_ NM_Airbag_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Airbag_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_Airbag_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_Airbag_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Airbag_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Airbag_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Airbag_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Airbag_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468604 NMH_EMotor_01: 8 LEH_MQB + SG_ NM_EMotor_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_EMotor_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_EMotor_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_EMotor_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_EMotor_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_EMotor_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_EMotor_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_EMotor_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_EMotor_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468496 NMH_Gateway: 8 Gateway_MQB + SG_ NM_Gateway_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Gateway_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_Gateway_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Gateway_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_ACAN_Aktivitaet : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_FCAN_Aktivitaet : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_KCAN_Aktivitaet : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_ICAN_Aktivitaet : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_DiagCAN_Aktivitaet : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_ECAN_Aktivitaet : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_Energie_LIN_Aktivi000 : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_Bedien_LIN_Aktivitaet : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_EM_Aktivitaet : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NL_EM : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NL_Shutdown : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NL_Spg_Messung : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NL_Wakeup_Monitor : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468599 NMH_Getriebe_01: 8 Getriebe_DQ_Hybrid_MQB + SG_ NM_Getriebe_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Getriebe_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_Getriebe_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_Getriebe_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_v_gr_0 : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_Pos_Erk : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_Umg_Bed : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468603 NMH_Hybrid_01: 8 BMS_MQB + SG_ NM_Hybrid_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Hybrid_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_Hybrid_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_Hybrid_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Hybrid_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_NL_Luefter : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468598 NMH_MO_01: 8 Motor_Diesel_MQB + SG_ NM_MO_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_MO_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_MO_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_MO_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_HV_Abschaltung : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_EKP_Vorlauf : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_STH_Betrieb : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_Kuehlerluefter : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_Diagnose : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_WFS : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_EEPROM : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_Sonstige : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 913 OBD_01: 8 Motor_Diesel_MQB + SG_ OBD_Calc_Load_Val : 0|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Eng_Cool_Temp : 8|8@1+ (1,-40) [-40|215] "Unit_DegreCelsi" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Abs_Throttle_Pos : 16|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Abs_Load_Val : 24|16@1+ (0.39215686275,0) [0|25700] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Abs_Pedal_Pos : 40|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Kaltstart_Denominator : 59|1@1+ (1,0) [0|1] "" BMS_MQB,LEH_MQB + SG_ OBD_Minimum_Trip : 60|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Driving_Cycle : 61|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Warm_Up_Cycle : 62|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Normed_Trip : 63|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + +BO_ 1630 OBD_Tankgeber_01: 8 Gateway_MQB + SG_ OBD_TG_F_Status_1 : 0|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_F_Status_2 : 4|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_F_Status_3 : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_F_Status_4 : 12|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_Sens_Rohwert_1 : 16|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_Sens_Rohwert_2 : 28|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_Sens_Rohwert_3 : 40|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_Sens_Rohwert_4 : 52|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 1437 Remotestart_FFB: 8 Gateway_MQB + SG_ RSF_Tastencode_1 : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ RSF_Tastencode_2 : 8|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ RSF_Tastencode_Maske : 16|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB + +BO_ 984 RGS_VL_01: 8 Airbag_MQB + SG_ RGS_VL_Texte : 12|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ RGS_VL_Charisma_FahrPr : 14|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ RGS_VL_Charisma_Status : 18|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ RGS_VL_aktiv : 21|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_PC_Aktuator_Sitz : 25|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_PC_Aktuator_Schiebedach : 26|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_PC_Aktuator_Fenster : 27|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_PC_Aktuator_Warnblinken : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_Precrash_Basis : 32|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ RGS_VL_Precrash_Front : 40|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ RGS_VL_Precrash_Rear : 48|8@1+ (1,0) [0|255] "" Gateway_MQB + +BO_ 1528 SAK_01: 8 SAK_MQB + SG_ SAK_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ SAK_Charisma_Status : 20|2@1+ (1,0) [0|3] "" Gateway_MQB + +BO_ 1313 STH_01: 8 Gateway_MQB + SG_ STH_Funk_ein : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Funk_aus : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Zusatzheizung : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_LED : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STH_Pumpe_ein : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Geblaese : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_EKP_Anst : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STH_Start_folgt : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Ventiloeffnungszeit : 8|6@1+ (1,0) [0|63] "Unit_Minut" Vector__XXX + SG_ STH_Ventil_Status : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Waermeeintrag : 16|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ STH_KVS : 24|13@1+ (1,0) [0|8191] "Unit_MilliLiter" Vector__XXX + SG_ STH_Fehlerstatus : 37|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ STH_Heizleistung : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ STH_Wassertemp : 48|8@1+ (0.75,-40) [-40|142.25] "Unit_DegreCelsi" Vector__XXX + SG_ STH_Motorvorwaermung : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STH_Servicemode : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_war_aktiv : 61|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STH_KVS_Ueberlauf : 62|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1172 STS_01: 8 Gateway_MQB + SG_ STS_01_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STS_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STS_Car_not_under_theft : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Car_under_theft : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Anlassersperre : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Typencodierung : 16|5@1+ (1,0) [0|31] "" Vector__XXX + SG_ STS_LIN_aktiv : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Standlicht : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Fahrlicht : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Alarm_still : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Texte : 27|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ STS_Laderelais : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Summer : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Alarm_Blinker : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Notstart : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Signalhorn : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Leerlaufschaltung : 56|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 1413 Systeminfo_01: 8 Gateway_MQB + SG_ SI_Sammel_SG_Fehler : 0|6@1+ (1,0) [0|60] "" Vector__XXX + SG_ SI_Rollenmode : 6|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ SI_QRS_Mode : 8|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ SI_T_Mode : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_NWDF : 10|1@1+ (1,0) [0|1] "" SAK_MQB + SG_ SI_NWDF_gueltig : 11|1@1+ (1,0) [0|1] "" SAK_MQB + SG_ SI_Sammelfehler : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_KD_Fehler : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_01 : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_02 : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_03 : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_04 : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_05 : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_06 : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_07 : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_08 : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_09 : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_10 : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_11 : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_12 : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_13 : 28|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_14 : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_15 : 30|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 288 TSK_06: 8 Motor_Diesel_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Radbremsmom : 12|12@1+ (8,0) [0|32760] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Status : 24|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_v_Begrenzung_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Standby_Anf_ESP : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_Freig_WU : 29|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ TSK_Freig_Verzoeg_Anf : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Limiter_ausgewaehlt : 31|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Wunsch_Uebersetz : 32|10@1+ (0.0245,0) [0.0245|25.0635] "" Gateway_MQB + SG_ TSK_Hauptschalter_GRA_ACC : 42|2@1+ (1.0,0.0) [0.0|3] "" Gateway_MQB + SG_ TSK_SRBM_Anf_ASIL : 44|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB + SG_ TSK_ax_Getriebe_02 : 48|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Zwangszusch_ESP : 57|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_zul_Regelabw : 58|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 798 TSK_07: 8 Motor_Diesel_MQB + SG_ TSK_07_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_AQ + SG_ TSK_07_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_AQ + SG_ TSK_Wunschgeschw : 12|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" Gateway_MQB,Getriebe_AQ + SG_ TSK_Texte : 40|5@1+ (1.0,0.0) [0.0|31] "" Gateway_MQB + SG_ TSK_Akustik : 45|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB + SG_ TSK_Texte_Primaeranz : 48|5@1+ (1.0,0.0) [0.0|31] "" Gateway_MQB + SG_ TSK_Limiter_Fahrerinfo : 53|2@1+ (1.0,0.0) [0.0|3] "" Gateway_MQB + SG_ TSK_Limiter_Anzeige : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ TSK_Fahrzeugstatus_GRA : 56|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ TSK_Fahrzeugstatus_Limiter : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ MO_Motorlaufwarnung : 58|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ TSK_Status_Anzeige : 61|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB + +BO_ 346 TSK_08: 8 Motor_Diesel_MQB + SG_ TSK_08_CRC : 0|8@1+ (1,0) [0|255] "" Frontradar + SG_ TSK_08_BZ : 8|4@1+ (1,0) [0|15] "" Frontradar + SG_ MO_Anforderung_HMS : 12|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_Status_EA : 32|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_vMax_Fahrerassistenz : 40|9@1+ (1,0) [0|510] "" Frontradar + SG_ TSK_Einheit_vMax_Fahrerassistenz : 49|1@1+ (1,0) [0|1] "" Frontradar + SG_ TSK_Status_PLA : 50|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_aktives_System : 53|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_erhoehter_Fahrwiderstand : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_Anf_Antriebsmoment : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_Status_ARA : 58|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_Status_IPA : 61|3@1+ (1,0) [0|7] "" Vector__XXX + +BO_ 1716 VIN_01: 8 Gateway_MQB + SG_ VIN_01_MUX M : 0|2@1+ (1,0) [0|3] "" Airbag_MQB + SG_ KS_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ KS_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ KS_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ KS_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + +BO_ 175 Waehlhebel_03: 4 Waehlhebel_MQB + SG_ WH_Status_Sperre : 0|3@1+ (1,0) [0|7] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_Initialisierung : 3|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_SensorPos_roh : 4|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_03_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_SensorPos_roh_inv : 12|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_Testergebnis : 16|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_Test_Aktiv : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_Status : 25|7@1+ (1,0) [0|127] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 916 WBA_03: 8 Getriebe_DQ_Hybrid_MQB + SG_ WBA_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ WBA_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ WBA_Fahrstufe_02 : 12|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ WBA_ZielFahrstufe : 16|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ WBA_GE_Warnung_02 : 20|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ WBA_eing_Gang_02 : 24|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Otto_MQB + SG_ WBA_GE_Texte : 28|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ WBA_Segeln_aktiv : 31|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WBA_Schaltschema : 32|5@1+ (1,0) [0|31] "" Gateway_MQB + +BO_ 1602 WIV_01: 8 Motor_Diesel_MQB + SG_ WIV_Verschleissindex : 0|16@1+ (2e-8,0) [0|0.00131068] "" Gateway_MQB + SG_ WIV_Russindex : 16|16@1+ (2e-8,0) [0|0.00131068] "" Gateway_MQB + SG_ WIV_t_min : 32|6@1+ (1,0) [0|63] "Unit_Month" Gateway_MQB + SG_ WIV_t_max : 40|6@1+ (1,0) [0|63] "Unit_Month" Gateway_MQB + SG_ WIV_W_min : 48|7@1+ (1000,0) [0|127000] "Unit_KiloMeter" Gateway_MQB + SG_ WIV_W_max : 56|7@1+ (1000,0) [0|127000] "Unit_KiloMeter" Gateway_MQB + +BO_ 294 HCA_01: 8 Frontsensorik + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HCA_01_Vib_Freq : 12|4@1+ (1,15) [15|30] "Unit_Hertz" Vector__XXX + SG_ HCA_01_LM_Offset : 16|9@1+ (1,0) [0|511] "Unit_centiNewtoMeter" Vector__XXX + SG_ EA_ACC_Sollstatus : 25|2@1+ (1,0) [0|3] "" Frontradar + SG_ EA_Ruckprofil : 27|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HCA_01_Sendestatus : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_LM_OffSign : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Status_HCA : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HCA_01_Vib_Amp : 36|4@1+ (0.2,0) [0|3] "Unit_NewtoMeter" Vector__XXX + SG_ EA_Ruckfreigabe : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EA_ACC_Wunschgeschwindigkeit : 41|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Frontradar + +BO_ 810 LH_EPS_01: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_SpannungsAnf : 12|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ EPS_Endanschlag : 14|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ EPS_Akustiksignal : 16|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ EPS_Fehlerlampe : 17|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ EPS_Warnungen : 19|3@1+ (1.0,0.0) [0.0|7] "" XXX + SG_ EPS_PLA_Fehler : 26|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Charisma_FahrPr : 34|4@1+ (1.0,0.0) [0.0|15] "" XXX + SG_ EPS_Charisma_Status : 38|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ EPS_Lenkerposition : 41|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ EPS_Anf_KL : 43|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ EPS_ARA_Status : 44|4@1+ (1.0,0.0) [0.0|15] "" XXX + +BO_ 159 LH_EPS_03: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_DSR_Status : 12|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Berechneter_LW : 16|12@1+ (0.15,0) [0|613.95] "Unit_DegreOfArc" XXX + SG_ EPS_BLW_QBit : 30|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_BLW : 31|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_HCA_Status : 32|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_AWA_Status : 36|4@1+ (1,0) [0|14] "" XXX + SG_ EPS_Lenkmoment : 40|10@1+ (1,0) [0|8] "Unit_centiNewtoMeter" XXX + SG_ EPS_Lenkmoment_QBit : 54|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_Lenkmoment : 55|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_Lenkungstyp : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 286 ESP_08: 8 Gateway_MQB + SG_ ESP_08_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ ESP_08_BZ : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ESP_ANB_CM_Rueckk_Umsetz : 12|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Konsistenz_ACC_Botschaft : 13|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Stillstandsphase_erschoepft : 14|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_ZT_Rueckk_Umsetz : 15|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Tuerkontakt_Fahrertuer : 16|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Abrutschen_Stillstand : 18|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_Fahrer_tritt_ZBR_Schw : 19|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_QBit_v_ref : 41|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ ESP_v_ref_Fahrtrichtung : 42|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ ESC_Bremsdruckgradient : 44|8@1+ (10,0) [0|2500] "Unit_BarPerSecon" XXX + SG_ ESP_v_ref : 52|12@1+ (0.125,0) [0.000|511.500] "Unit_KiloMeterPerHour" XXX + +BO_ 919 LDW_02: 8 XXX + SG_ LDW_Gong : 12|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_SW_Warnung_links : 14|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_SW_Warnung_rechts : 15|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Texte : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Seite_DLCTLC : 20|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Lernmodus : 21|3@1+ (1,0) [0|7] "" XXX + SG_ LDW_Anlaufsp_VLR : 24|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Vib_Amp_VLR : 28|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Anlaufzeit_VLR : 32|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Lernmodus_rechts : 36|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Lernmodus_links : 38|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_DLC : 40|8@1+ (0.01,-1.25) [-1.25|1.25] "Unit_Meter" XXX + SG_ LDW_TLC : 48|5@1+ (0.1,0) [0|3] "Unit_Secon" XXX + SG_ LDW_Warnung_links : 56|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Warnung_rechts : 57|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Codierinfo_fuer_VLR : 58|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Frontscheibenheizung_aktiv : 60|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Status_LED_gelb : 61|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Status_LED_gruen : 62|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_KD_Fehler : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 780 ACC_02: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Wunschgeschw_02 : 12|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" XXX + SG_ ACC_Status_Prim_Anz : 22|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Abstandsindex : 24|10@1+ (1,0) [1|1021] "" XXX + SG_ ACC_Akustik_02 : 34|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Warnung_Verkehrszeichen_1 : 36|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Gesetzte_Zeitluecke : 37|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Optischer_Fahrerhinweis : 40|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ_Tachokranz : 41|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anzeige_Zeitluecke : 42|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Tachokranz : 43|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Display_Prio : 44|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Relevantes_Objekt : 46|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Texte_Primaeranz : 48|7@1+ (1,0) [0|127] "" XXX + SG_ ACC_Wunschgeschw_erreicht : 55|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ_Tachokranz_unten : 60|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Status_Anzeige : 61|3@1+ (1,0) [0|7] "" XXX + +BO_ 302 ACC_07: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Anhalteweg : 12|11@1+ (0.01,0) [0|20.45] "Unit_Meter" XXX + SG_ ACC_Anhalten : 23|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Boost_Anf : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Freilauf_Anf : 25|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Freilauf_Info : 26|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Anforderung_HMS : 28|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Anfahren : 31|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Folgebeschl : 32|8@1+ (0.03,-4.6) [-4.6|2.99] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_Sollbeschleunigung_02 : 53|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + +BO_ 264 Fahrwerk_01: 8 XXX + SG_ Fahrwerk_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Fahrwerk_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX + +BO_ 695 RCTA_01: 8 XXX + SG_ RCTA_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX + SG_ RCTA_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX + +BO_ 783 SWA_01: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SWA_Anzeigen : 12|4@1+ (1,0) [0|15] "" XXX + SG_ SWA_Blindheit_erkannt : 16|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_rel_Nichtverf : 17|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_rel_Fehler : 18|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Sta_aktiv : 19|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Sta_passiv : 20|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_FT_RueckLED : 21|1@1+ (1,0) [0|1] "" XXX + SG_ ASW_Status : 22|2@1+ (1,0) [0|3] "" XXX + SG_ SWA_Standziele_li : 24|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Kolonne_li : 25|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Infostufe_SWA_li : 26|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Warnung_SWA_li : 27|1@1+ (1,0) [0|1] "" XXX + SG_ ASW_Warnung_FS : 28|1@1+ (1,0) [0|1] "" XXX + SG_ ASW_Warnung_BFS : 29|1@1+ (1,0) [0|1] "" XXX + SG_ ASW_Kombitexte : 30|3@1+ (1,0) [0|7] "" XXX + SG_ SWA_Kolonne_mi : 33|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Standziele_re : 40|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Kolonne_re : 41|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Infostufe_SWA_re : 42|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Warnung_SWA_re : 43|1@1+ (1,0) [0|1] "" XXX + SG_ HRE_Anzeigetexte : 44|4@1+ (1,0) [0|15] "" XXX + SG_ SWA_Gischtzaehler : 48|7@1+ (1,0) [0|100] "Unit_PerCent" XXX + SG_ Heckradar_Kombitexte : 56|5@1+ (1,0) [0|31] "" XXX + SG_ RCTA_Kombitexte : 61|3@1+ (1,0) [0|7] "" XXX + +BO_ 804 ACC_04: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Texte_Sekundaeranz : 12|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Texte_Zusatzanz : 16|6@1+ (1,0) [0|63] "" XXX + SG_ ACC_Status_Zusatzanz : 22|5@1+ (1,0) [0|31] "" XXX + SG_ ACC_Texte : 27|5@1+ (1,0) [0|31] "" XXX + SG_ ACC_Texte_braking_guard : 32|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Warnhinweis : 35|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Zeitluecke_Abstandswarner : 36|6@1+ (0.1,0) [0|6] "Unit_Secon" XXX + SG_ ACC_Abstand_Abstandswarner : 42|9@1+ (1,0) [0|508] "" XXX + SG_ ACC_Tempolimit : 51|5@1+ (1,0) [0|31] "" XXX + SG_ ACC_Charisma_FahrPr : 56|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Charisma_Status : 60|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Texte_Abstandswarner : 62|2@1+ (1,0) [0|3] "" XXX + +BO_ 917 LWR_AFS_01: 8 XXX + +BO_ 991 Gateway_76: 8 XXX + +BO_ 997 TSG_FT_02: 8 XXX + SG_ TSG_FT_02_BZ : 8|4@1+ (1,0) [0|15] "" XXX + SG_ TSG_FT_02_CRC : 0|8@1+ (1,0) [0|255] "" XXX + +BO_ 1175 Parkhilfe_01: 8 XXX + +BO_ 427 ESP_33: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_AHW_aktiv : 12|3@1+ (1,0) [0|7] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_AHW_nicht_verfuegbar : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_ANB_CM_aktiv : 16|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_ANB_CM_nicht_verfuegbar : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Warnruck_aktiv : 19|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_Warnruck_nicht_verfuegbar : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Prefill_aktiv : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Prefill_nicht_verfuegbar : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_HBA_aktiv : 26|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESC_HBA_nicht_verfuegbar : 27|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESC_TSK_SRBM_Anf : 28|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_TSK_SRBM_nicht_verfuegbar : 29|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_Verz_Reg_aktiv : 30|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_Verz_Reg_nicht_verfuegbar : 34|1@1+ (1,0) [0|1] "" Airbag_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_Verz_Reg_TB_nicht_verfuegbar : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Verz_Reg_ZB_nicht_verfuegbar : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Bremslicht_unplausibel : 37|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_Konsistenz_ACC : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_AWV : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_ARA : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_IPA : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_FCW : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_NV : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_RCTA : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_TSK : 45|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_Konsistenz_vFGS : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_STA : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Fahrer_Bremsdruck_bestimmend : 48|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_Konsistenz_EA : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_BFF : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_MKB : 51|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESC_Verz_ASIL_Verfuegbarkeit : 52|3@1+ (1,0) [0|7] "" Airbag_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESC_Pumpenanlauf_aktiv : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_AGW : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_KAS : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_PCF : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_FAS_VK : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Verz_Begrenzung : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESC_Konsistenz_AWA : 61|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 418 ESP_15: 8 XXX + SG_ ESP_15_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ ESP_15_BZ : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 1122 PSD_04: 8 XXX + SG_ PSD_Object_Index : 0|6@1+ (1,0) [0|63] "" XXX + +BO_ 1123 PSD_05: 8 XXX + SG_ PSD_Current_Route_Index : 0|6@1+ (1,0) [0|63] "" XXX + SG_ Route_Distance_Remaining : 8|5@1+ (1,0) [0|31] "" XXX + +BO_ 1124 PSD_06: 8 XXX + +BO_ 988 Gateway_73: 8 XXX + SG_ UNKNOWN_1 : 15|2@0+ (1,0) [0|3] "" XXX + SG_ GE_Fahrstufe : 40|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_Status : 53|3@1+ (1,0) [0|7] "" XXX + SG_ UNKNOWN_2 : 58|3@0+ (1,0) [0|7] "" XXX + +BO_ 792 Kamera_Status: 8 XXX + +BO_ 981 Licht_Anf_01: 8 Vector__XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BCM1_Kurvenlicht_links_Anf : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Kurvenlicht_rechts_Anf : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Standlicht_Anf : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Abblendlicht_Anf : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Fernlicht_Anf : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Nebellicht_Anf : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Parklicht_li_Anf : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Parklicht_re_Anf : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Nebelschluss_Ahg_Anf : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Nebelschluss_Fzg_Anf : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Schlusslicht_Anf : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Rueckfahrlicht_Anf : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Signaturlicht_Anf : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Umfeldleuchten_Anf : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Tagfahrlicht_Anf : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Regenlicht_Anf : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Autobahnlicht_Anf : 28|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Touristen_Licht_Anf : 29|1@1+ (1,0) [0|1] "" Frontradar + SG_ BCM1_CH_aktiv : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_LH_aktiv : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Gleitende_Leuchtw_Anf : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_GLW_Fernlicht_Anf : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Adaptive_Lichtvert_Anf : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_CH_LH_aktiv : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Allwetterlicht_Anf : 41|1@1+ (1,0) [0|1] "" Frontradar + +BO_ 1440 RLS_01: 8 XXX + +BO_ 870 Blinkmodi_02: 8 XXX + SG_ Hazard_Switch : 20|1@1+ (1,0) [0|1] "" XXX + SG_ Comfort_Signal_Left : 23|1@1+ (1,0) [0|1] "" XXX + SG_ Comfort_Signal_Right : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Turn_Exterior_Bulb_1 : 25|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Turn_Exterior_Bulb_1 : 26|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Turn_Exterior_Bulb_2 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Turn_Exterior_Bulb_2 : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Fast_Send_Rate_Active : 37|1@1+ (1,0) [0|1] "" XXX + +BO_ 1385 HVEM_04: 8 XXX + +BO_ 1605 FLA_01: 8 XXX + +BO_ 1624 Licht_vorne_01: 8 XXX + +BO_ 1646 Klima_03: 8 XXX + +BO_ 1720 Kombi_03: 8 XXX + SG_ KBI_Reifenumfang : 0|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX + SG_ KBI_Variante_USA : 12|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ KBI_Variante : 13|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ KBI_BCmE_aktiv : 16|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ KBI_Sparhinweis_quittiert : 17|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ KBI_Tankfuellstand_Prozent : 18|7@1+ (1,0) [0|100] "Unit_PerCent" XXX + SG_ KBI_Nachtanken_erkannt : 25|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ KBI_Tankinhalt_hochaufl : 26|14@1+ (0.01,0) [0.00|163.81] "Unit_Liter" XXX + SG_ KBI_Max_Tankinhalt : 40|8@1+ (0.5,0) [0.0|126.5] "" XXX + SG_ KBI_Reifenumfang_Sekundaer : 48|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX + +BO_ 391 Motor_EV_01: 8 Motor_MQB_BEV + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EV_Rekuperationsstufe : 12|3@1+ (1.0,0.0) [0.0|7] "" XXX + SG_ HV_Bordnetz_aktiv : 15|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_Waehlpos : 16|3@1+ (1.0,0.0) [0.0|7] "" XXX + SG_ MO_Fehler_NTKreis : 19|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_Fehler_Notabschaltung_Klima : 20|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ MO_KLE_FStatus : 22|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ MO_WH_Texte : 24|3@1+ (1.0,0.0) [0.0|7] "" XXX + SG_ MO_Drehzahl_VM : 32|16@1+ (0.25,0) [0.00|16383.00] "Unit_MinutInver" XXX + SG_ HV_Bordnetz_Fehler : 48|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_Tankbereitschaft_Status : 49|3@1+ (1.0,0.0) [0.0|7] "" XXX + SG_ MO_Tankklappensteuerung : 52|2@1+ (1.0,0.0) [0.0|3] "" XXX + SG_ MO_HVEM_Eskalation : 54|1@1+ (1.0,0.0) [0.0|1] "" XXX + SG_ MO_HVEM_MaxLeistung : 55|9@1+ (50,0) [0|25450] "Unit_Watt" XXX + +CM_ SG_ 134 LWI_Lenkradwinkel "Steering angle WITH variable ratio effect included"; +CM_ SG_ 159 EPS_HCA_Status "Status of Heading Control Assist feature"; +CM_ SG_ 159 EPS_Lenkmoment "Steering input by driver, torque"; +CM_ SG_ 159 EPS_VZ_Lenkmoment "Steering input by driver, direction"; +CM_ SG_ 159 EPS_Berechneter_LW "Raw steering angle, degrees"; +CM_ SG_ 159 EPS_VZ_BLW "Raw steering angle, direction"; +CM_ SG_ 173 COUNTER_DISABLED "Message not renamed to COUNTER because J533 rate-limiting makes it look like messages are being lost"; +CM_ SG_ 294 HCA_01_Vib_Freq "Frequenz der Lenkradvibration"; +CM_ SG_ 294 HCA_01_LM_Offset "Von HCA angefordertes Lenkmoment (Betrag)"; +CM_ SG_ 294 EA_ACC_Sollstatus "Status-Anforderung ACC von Emergency Alert. Statuswechsel bei Flanke. Solange Wert=1, wird EA_ACC_Wunschgeschwindigkeit Ãŧbernommen. Wert=2 fÃŧhrt zu Zustand ÂŋACC_GRA_passivÂŋ"; +CM_ SG_ 294 EA_Ruckprofil "Emergency Alert Anforderung an ESP, welcher Ruck verwendet werden soll. Eine Umsetzung der Ruckanforderung im ESP erfolgt nur mit gesetztem Bit 'EA_Ruckfreigabe'."; +CM_ SG_ 294 HCA_01_Sendestatus "Gibt den Sendestatus der HCA_01 an (notwendig fÃŧr IL-UnterstÃŧtzung)"; +CM_ SG_ 294 HCA_01_LM_OffSign "Vorzeichen des HCA-Lenkmoments"; +CM_ SG_ 294 HCA_01_Status_HCA "Statusinformation vom HCA und Manoevrierassistent fÃŧr Handshakemechanismus mit der Lenkung"; +CM_ SG_ 294 HCA_01_Vib_Amp "Momentenamplitude der Lenkradvibration"; +CM_ SG_ 294 EA_Ruckfreigabe "Emergency Alert Freigabit fÃŧr die Warnruck-Anforderung an das ESP"; +CM_ SG_ 294 EA_ACC_Wunschgeschwindigkeit "Emergency Alert Anforderung neue Wunschgeschwindigkeit"; +CM_ SG_ 302 ACC_Hold_Request "Active request for ABS brake hold in ACC_Hold_Type"; +CM_ SG_ 302 ACC_Boost_Request "Hybrid engine start related"; +CM_ SG_ 302 ACC_Freewheel_Request "Active request for DSG sailing/coasting in ACC_Freewheel_Type"; +CM_ SG_ 302 ACC_Hold_Release "Request to ABS to release brake hold"; +CM_ SG_ 302 ACC_Accel_Secondary "Target acceleration of the secondary controller"; +CM_ SG_ 302 ACC_Accel_TSK "Mirror of request to TSK to implement a target acceleration"; +CM_ SG_ 870 Hazard_Switch "Four-way flashers active"; +CM_ SG_ 870 Comfort_Signal_Left "Comfort turn signal active, left"; +CM_ SG_ 870 Comfort_Signal_Right "Comfort turn signal active, right"; +CM_ SG_ 870 Left_Turn_Exterior_Bulb_1 "Probably front"; +CM_ SG_ 870 Right_Turn_Exterior_Bulb_1 "Probably front"; +CM_ SG_ 870 Left_Turn_Exterior_Bulb_2 "Probably rear"; +CM_ SG_ 870 Right_Turn_Exterior_Bulb_2 "Probably rear"; +CM_ SG_ 870 Fast_Send_Rate_Active "CAN message send rate"; +CM_ SG_ 919 LDW_DLC "Probable DLC (distance to line crossing)"; +CM_ SG_ 919 LDW_TLC "Probable TLC (time to line crossing)"; +CM_ SG_ 919 LDW_Unknown "Might be a steering pressed / driver active flag"; +CM_ SG_ 919 Alert_Message "Static table of alert messages to be invoked in the instrument cluster, some with or without beeps, 0 = no current message"; +CM_ SG_ 919 LDW_Direction "Left/right indicator for DLC and TLC"; +CM_ SG_ 919 Right_Lane_Status "Display brightness range, 0 = no lane, 3 = full brightness"; +CM_ SG_ 919 Left_Lane_Status "Display brightness range, 0 = no lane, 3 = full brightness"; +CM_ SG_ 919 Kombi_Lamp_Orange "Enables orange LDW light in instrument cluster"; +CM_ SG_ 919 Kombi_Lamp_Green "Enables green LDW light in instrument cluster"; +CM_ SG_ 780 Folgefahrt "Following another vehicle"; +CM_ SG_ 780 SetAbstand "Set following distance"; +CM_ SG_ 780 Abstand "Following distance"; +CM_ SG_ 780 SetSpeed "ACC set speed"; +CM_ SG_ 391 MO_Waehlpos "Traditional PRND plus B-mode aggressive regen, B-mode mapped to Drive"; +CM_ SG_ 679 ACC_ADAPTIVE "TSK_06.TSK_Limiter_ausgewaehlt seems to take precedence"; +CM_ SG_ 960 ZAS_Kl_15 "Indicates ignition on"; +CM_ SG_ 1720 KBI_BCmE_aktiv "Anzeige BCmE aktiv (BCmE-Screen oder Einsparhinweis in der Anzeige)"; +CM_ SG_ 1720 KBI_Max_Tankinhalt "Mitteilung des maximalen Tankinhalts an das Reichweitenmodul"; +CM_ SG_ 1720 KBI_Nachtanken_erkannt "Statusinformation Nachtankmodus"; + +Primärachse: KBI_Reifenumfang +Sekundärachse: KBI_Reifenumfang_Sekundaer +"; +CM_ SG_ 1720 KBI_Sparhinweis_quittiert "angezeigter Sparhinweis ist quittiert. Signal wird nach zwei Sendebotschaften wieder auf '0' gesetzt."; +CM_ SG_ 1720 KBI_Tankfuellstand_Prozent "TankfÃŧllstand in %"; +CM_ SG_ 1720 KBI_Tankinhalt_hochaufl "angezeigter Tankinhalt hochauflÃļsend zur Restreichweitenberechnung"; +CM_ SG_ 1720 KBI_Variante "Zeigt an ob es sich um ein konventionelles Zeiger-Kombiinstrument handelt oder um eine Volldisplay-Kombiinstrument"; +CM_ SG_ 1720 KBI_Variante_USA "In diesem Signal wird die HW-Variante des Kombis ausgegeben, ACC plausibilisiert auf dieses Signal hin seine US-Codierung"; + + +VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" 8 "preempted" ; +VAL_ 159 EPS_AWA_Status 0 "AWA_deaktiviert" 1 "AWA_Anf_nicht_ausfuehrbar" 2 "Kom_AWA_gestoert" 3 "EPS_bzgl_AWA_funktionsbereit" 4 "AWA_Anf_abgewiesen" 5 "AWA_Momeingriff_1_aktiv" 7 "AWA_Momeingriff_2_aktiv" 8 "AWA_abgewiesen_Momentenpriorisierung" 9 "Anf_abgewiesen_Bedienueblich" 14 "Init" ; +VAL_ 173 GE_Fahrstufe 5 "P" 6 "R" 7 "N" 8 "D" 9 "S" 10 "E" 13 "T" 14 "T" ; +VAL_ 279 AWV_AWA_Status_EPS 0 "AWA_deactivated" 1 "AWA_request_not_executable" 2 "EPS_communication_disturbed" 3 "AWA_ready" 5 "AWA_torque_intervention_1" 7 "AWA_torque_intervention_2" ; +VAL_ 288 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault" ; +VAL_ 288 TSK_v_Begrenzung_aktiv 0 "inaktiv" 1 "aktiv" ; +VAL_ 288 TSK_Standby_Anf_ESP 0 "keine_Standby_Anforderung" 1 "Standby_Anforderung" ; +VAL_ 288 TSK_Freig_WU 0 "TSK_Uebersetzungswunsch_nicht_freigegeben" 1 "TSK_Uebersetzungswunsch_freigegeben" ; +VAL_ 288 TSK_Freig_Verzoeg_Anf 0 "Verzoegerungsanforderung_nicht_freigegeben" 1 "Verzoegerungsanforderung_freigegeben" ; +VAL_ 288 TSK_Limiter_ausgewaehlt 0 "kein_Limiter_ausgewaehlt" 1 "Limiter_ausgewaehlt" ; +VAL_ 288 TSK_Wunsch_Uebersetz 0 "Init" ; +VAL_ 288 TSK_Hauptschalter_GRA_ACC 0 "Init" 1 "Aus" 2 "Ein" 3 "Fehler" ; +VAL_ 288 TSK_ax_Getriebe_02 511 "Neutralwert" ; +VAL_ 288 TSK_Zwangszusch_ESP 0 "keine_ESP_ASR_Beeinflussung" 1 "ESP_ASR_Beeinflussung" ; +VAL_ 294 EA_ACC_Sollstatus 0 "Init" 1 "ACC_aktivieren" 2 "ACC_deaktivieren" ; +VAL_ 294 EA_Ruckprofil 0 "Init" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7" ; +VAL_ 294 HCA_01_Sendestatus 0 "HCA_sendet_mit_1000ms" 1 "HCA_sendet_mit_20ms" ; +VAL_ 294 HCA_01_LM_OffSign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen" ; +VAL_ 294 HCA_01_Status_HCA 0 "deaktiviert" 1 "reserviert" 2 "reserviert" 3 "funktionsbereit" 4 "reserviert" 5 "HCA_Momenteneingriff_1" 6 "MA_Aktiv" 7 "HCA_Momenteneingriff_2" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "reserviert" 15 "reserviert" ; +VAL_ 294 EA_Ruckfreigabe 0 "keine_Freigabe" 1 "Freigabe" ; +VAL_ 294 EA_ACC_Wunschgeschwindigkeit 1023 "Init" ; +VAL_ 346 MO_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" ; +VAL_ 346 TSK_Status_EA 0 "Aus" 1 "Init_oder_nicht_verbaut" 3 "Aktiv" 4 "Uebertreten" 5 "Abschaltung_laeuft" 6 "Reversibel_aus" 7 "Irreversibel_Aus" ; +VAL_ 346 TSK_vMax_Fahrerassistenz 511 "Init_ungueltig_keine_Beschraenkung" ; +VAL_ 346 TSK_Einheit_vMax_Fahrerassistenz 0 "kmh" 1 "mph" ; +VAL_ 346 TSK_Status_PLA 0 "Aus_Funktionsbereit" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "Abschaltung_laeuft" 6 "reversibel_aus" 7 "Fehler" ; +VAL_ 346 TSK_aktives_System 0 "keine_Funktion_aktiv" 1 "GRA_ACC" 2 "ARA" 3 "Speedlimiter" 4 "IPA" 5 "PLA" 6 "PEA_Ausrollassistent" 7 "EA" ; +VAL_ 346 TSK_erhoehter_Fahrwiderstand 0 "kein_erhoehter_Fahrwiderstand" 1 "erhoehter_Fahrwiderstand" ; +VAL_ 346 TSK_Anf_Antriebsmoment 0 "keine_Anforderung" 1 "Anforderung_aktiv" ; +VAL_ 346 TSK_Status_ARA 0 "Aus" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "abschaltung_laeuft" 6 "reversibel_aus" 7 "Fehler" ; +VAL_ 346 TSK_Status_IPA 0 "Aus_Funktionsbereit" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "Abschaltung_laueft" 6 "reversibel_aus" 7 "Fehler" ; +VAL_ 798 TSK_Wunschgeschw 1022 "keine_Anzeige" 1023 "kein_Wert_im_Speicher" ; +VAL_ 798 TSK_Texte 0 "kein_Text" 1 "GRA_Modus_ausgewaehlt" 2 "ACC_Modus_ausgewaehlt" 3 "Lim_Modus_ausgewaehlt" 4 "Lim_nicht_verfuegbar_ESC_passiv" 5 "GRA_nicht_verfuegbar_ESC_passiv" 6 "Lim_nicht_verfuegbar_Charisma" 7 "GRA_nicht_verfuegbar_Charisma" 8 "Lim_nicht_verfuegbar_HDC" 9 "GRA_nicht_verfuegbar_HDC" ; +VAL_ 798 TSK_Akustik 0 "keine_Akustik" 1 "einzelner_Warnton" 2 "dauerhafter_Warnton" ; +VAL_ 798 TSK_Texte_Primaeranz 0 "keine_Anzeige" 1 "GRA_Symbol_passiv_xxx_kmh_mph" 2 "GRA_Symbol_aktiv_xxx_kmh_mph" 3 "Bremse_ueberhitzt" 4 "Limiter_Modus_aktiviert" 5 "GRA_Modus_aktiviert" 6 "ACC_Modus_aktiviert" 7 "Opt_Geschwindigkeitswarnung" 8 "Opt_und_akustische_GeschwWarnung" 9 "Opt_GeschwWarnung_dauerhaft_mit_einmal_Akustik" 10 "Limiter_passiv_mit_Akustik" 11 "Limiter_Fehler_mit_Akustik" 12 "Limiter_Symbol_passiv_xxx_kmh_mph" 13 "Limiter_Symbol_aktiv_xxx_kmh_mph" 14 "Popup_Geschw_zu_hoch__Resume_unzulaessig" ; +VAL_ 798 TSK_Limiter_Fahrerinfo 0 "keine_Info" 1 "Limit_erreicht" 2 "Ueberschritten" 3 "Vom_Fahrer_Ueberstimmt" ; +VAL_ 798 TSK_Limiter_Anzeige 0 "Display_Anzeige_GRA_ACC" 1 "Display_Anzeige_Limiter" ; +VAL_ 798 TSK_Fahrzeugstatus_GRA 0 "GRA_verfuegbar" 1 "GRA_nicht_verfuegbar" ; +VAL_ 798 TSK_Fahrzeugstatus_Limiter 0 "Limiter_verfuegbar" 1 "Limiter_nicht_verfuegbar" ; +VAL_ 798 MO_Motorlaufwarnung 0 "keine_Anzeige" 1 "Anforderung_Motorlaufwarnung" ; +VAL_ 798 TSK_Status_Anzeige 0 "Hauptschalter_aus" 1 "Init" 2 "passiv" 3 "aktiv" 4 "Uebertreten" 5 "Limitiierung_aktiv" 6 "reversibel_aus" 7 "irreversibel_aus" ; +VAL_ 780 ACC_Wunschgeschw_02 1023 "keine_Anzeige" ; +VAL_ 780 ACC_Status_Prim_Anz 0 "Symbol nicht beleuchtet" 1 "Farbe 1 (typisch 'gruen')" 2 "Farbe 2 (typisch 'rot')" 3 "Farbe 3 (typisch 'gelb')" ; +VAL_ 780 ACC_Abstandsindex 0 "Sonderanzeige_graue_Fahrbahn" 1022 "Sonderanzeige_graue_Fahrbahn" 1023 "Sonderanzeige_Fahrbahn_mit_gruenem_roten_Bereich" ; +VAL_ 780 ACC_Akustik_02 0 "keine_Akustik" 1 "hochpriore_Akustik" 2 "niederpriore_Akustik" 3 "hochpriore_Dauerakustik" ; +VAL_ 780 ACC_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert" 1 "Warnung" ; +VAL_ 780 ACC_Gesetzte_Zeitluecke 0 "keine_Anzeige" 1 "Zeitluecke_1" 2 "Zeitluecke_2" 3 "Zeitluecke_3" 4 "Zeitluecke_4" 5 "Zeitluecke_5" 6 "nicht_definiert" 7 "nicht_definiert" ; +VAL_ 780 ACC_Optischer_Fahrerhinweis 0 "optischer_Fahrerhinweis_AUS" 1 "optischer_Fahrerhinweis_EIN" ; +VAL_ 780 ACC_Typ_Tachokranz 0 "Tachokranz_lang" 1 "Tachokranz_kurz" ; +VAL_ 780 ACC_Anzeige_Zeitluecke 0 "Anzeige_Zeitluecke_nicht_angefordert" 1 "Anzeige_Zeitluecke_angefordert" ; +VAL_ 780 ACC_Tachokranz 0 "Tachokranz_nicht_beleuchtet" 1 "Tachokranz_beleuchtet" ; +VAL_ 780 ACC_Display_Prio 0 "hoechste_Prio" 1 "mittlere_Prio" 2 "geringe_Prio" 3 "keine_Prio" ; +VAL_ 780 ACC_Relevantes_Objekt 0 "Symbol_nicht_beleuchtet" 1 "Farbe_1_typisch_gruen" 2 "Farbe_2_typisch_rot" 3 "Farbe_3_typisch_gelb" ; +VAL_ 780 ACC_Texte_Primaeranz 0 "keine Anzeige" 1 "ACC nicht verfuegbar !" 2 "Auto_Auto_ _ _" 3 "Auto_ _Auto_ _" 4 "Auto_ _ _Auto_" 5 "Auto_ _ _ _Auto" 6 "Auto_Auto_ _ _ Gong (durchgestrichen)" 7 "Auto_ _Auto_ _ Gong (durchgestrichen)" 8 "Auto_ _ _Auto_ Gong (durchgestrichen)" 9 "Auto_ _ _ _Auto Gong (durchgestrichen)" 10 "ACC bereit" 11 "keine Abstandsregelung" 12 "ACC Sensor Sicht !" 13 "ACC nicht verfuegbar" 14 "o o o" 15 "Hochschalten" 16 "ESP Eingriff" 17 "Herunterschalten" 18 "Parkbremse !" 19 "Geschwindigkeitsgrenze" 20 "Waehlhebelposition !" 21 "VDA ACC-Symbol YYY km/h / mph" 22 "Tempolimit XXX km/h / mph" 23 "Kurve XXX km/h / mph" 24 "ACC Abschaltung" 25 "Symbol 'Eieruhr'" 26 "!" 27 "--- km/h / mph" 28 "XXX km/h / mph (Schriftart 2)" 29 "Lenkradwinkel" 30 "Anfahren bestaetigen" 31 "Fahrzeug verloren" 32 "Im Stand nicht moeglich" 33 "Ungueltiger Anfahrbefehl" 34 "Tuer offen !" 35 "Fahrer Gurtschloss offen !" 36 "Schalthebelposition !" 37 "Drehzahl !" 38 "Kurvenassistent aus" 39 "Tempolimit aus" 40 "Abbiegeassistent" 41 "Ortsanfang XXX km/h / mph" 42 "Ortsende XXX km/h / mph" 43 "Tempolimit Ende XXX km/h / mph" 44 "HDC aktiv" 45 "braking guard Bremsruck" 46 "braking guard aus" 47 "braking guard aus" 48 "Uebernehmen !" 49 "Steigung zu gross" 50 "Stehendes Objekt voraus" 51 "SET / 'GRA Symbol'___xxx km/h / mph" 52 "SET / 'GRA Symbol' xxx km/h / mph" 53 "ACC aus" 54 "ACC startet" 55 "ACC reinigen" 56 "ACC Fehler" 57 "ACC haelt an !" 58 "Bremse betaetigen !" 59 "Kupplung betaetigt" 60 "LIM AUS" 61 "LIM AKTIV" 62 "LIM PASSIV" 63 "LIM FEHLER" 64 "Bremse ueberhitzt !" 65 "Bremse haelt !" 66 "ESP PASSIV !" 67 "ACC_anfahrbereit" 68 "Gang_einlegen" 69 "Rechtsueberholen_verhindert" 70 "Linksueberholen_verhindert" 71 "Achtung_Geschwindigkeitsueberschreitung" 72 "Tempolimit_und_Kurvenassistent_nicht_verfuegbar" ; +VAL_ 780 ACC_Wunschgeschw_erreicht 0 "Wunschgeschwindigkeit_nicht_erreicht" 1 "Wunschgeschwindigkeit_erreicht" ; +VAL_ 780 ACC_Typ_Tachokranz_unten 0 "LEDs_an" 1 "LEDs_aus" ; +VAL_ 780 ACC_Status_Anzeige 0 "ACC_GRA_Hauptschalter_aus" 1 "ACC_in_Init_nicht_bei_GRA" 2 "ACC_GRA_passiv" 3 "ACC_GRA_aktiv" 4 "ACC_GRA_im_Hintergrund_uebertreten" 5 "ACC_GRA_Abschaltreaktion" 6 "ACC_reversibel_aus_nicht_bei_GRA" 7 "ACC_GRA_irreversibel_aus" ; +VAL_ 804 ACC_Texte_Sekundaeranz 0 "keine_Anzeige" 1 "Zielfahrzeug_erkannt" 2 "Rechtskurve_voraus" 3 "Linkskurve_voraus" 4 "Tempolimit_voraus" 5 "Sensorsicht" 6 "Anfahrbereit" 7 "Tempolimit_erkannt" 8 "Kreuzung_voraus" 9 "Kreisverkehr_voraus" ; +VAL_ 804 ACC_Texte_Zusatzanz 0 "keine_Anzeige" 1 "ACC_AUS" 2 "ACC_BEREIT" 3 "UEBERTRETEN" 4 "ABSTAND" 5 "DISTANZ_1" 6 "DISTANZ_2" 7 "DISTANZ_3" 8 "DISTANZ_4" 9 "DISTANZ_1__dyn" 10 "DISTANZ_2__dyn" 11 "DISTANZ_3__dyn" 12 "DISTANZ_4__dyn" 13 "DISTANZ_1__stand" 14 "DISTANZ_2__stand" 15 "DISTANZ_3__stand" 16 "DISTANZ_4__stand" 17 "DISTANZ_1__comf" 18 "DISTANZ_2__comf" 19 "DISTANZ_3__comf" 20 "DISTANZ_4__comf" 21 "DISTANZ_1__efficiency" 22 "DISTANZ_2__efficiency" 23 "DISTANZ_3__efficiency" 24 "DISTANZ_4__efficiency" 25 "DISTANZ_5" 26 "DISTANZ_5__dyn" 27 "DISTANZ_5__stand" 28 "DISTANZ_5__comf" 29 "DISTANZ_5__efficiency" 30 "ACHTUNG" 31 "Abstandsanzeige" 32 "Abstandsanz_Warnung_aktiviert" ; +VAL_ 804 ACC_Status_Zusatzanz 0 "keine Anzeige" 1 "Bild 1 (Fzg. Silhouette, typ. farblos)" 2 "Bild 2 (Fzg. Farbe 1, typ. grau)" 3 "Bild 3 (Fzg. Farbe 2, typ. rot)" 4 "Bild 4 (Symbol 1 ACCplus, typ. Doppelfzg. gelb)" 5 "Bild 5 (Symbol 2 ACCplus, typ. Doppelfzg. grau)" 6 "Bild 6 (Fzg. Farbe 2, typ. rot) mit Priorität im Kombi (Pop-up)" ; +VAL_ 804 ACC_Texte 0 "keine_Anzeige" 1 "ACC_nicht_verfuegbar" 2 "ACC_und_AWV_nicht_verfuegbar" 3 "ACC_keine_Sensorsicht" 4 "ACC_und_AWV_keine_Sensorsicht" 5 "ACC_Steigung_zu_gross" 6 "ACC_nur_in_Fahrstufe_verfuegbar" 7 "ACC_Parkbremse_betaetigt" 8 "ACC_ESP_Eingriff" 9 "ACC_Bitte_uebernehmen" 10 "ACC_HDC_betaetigt" 11 "ACC_Geschwindigkeitsgrenze" 12 "ACC_Schalthebelposition" 13 "ACC_Drehzahl" 14 "ACC_Kupplung_betaetigt" 15 "ACC_Aktivierverhinderung" 16 "ACC_Abschaltung" 17 "ACC_Parkassistent_aktiv" 18 "ACC_ESC_aus" 19 "ACC_Charisma_Modus_inkompatibel" 20 "ACC_Stehendes_Objekt_voraus" 21 "ACA_Fahreruebernahme" 22 "ACA_Querfuehrung_nicht_verfuegbar" ; +VAL_ 804 ACC_Texte_braking_guard 0 "keine_Anzeige" 1 "AWV_aus" 2 "AWV_Warnung" 3 "AWV_Demomodus" 4 "AWV_Systemstoerung" 5 "AWV_Eingriff" 6 "AWV_Vorwarnung_aus" 7 "AWV_keine_Sensorsicht" ; +VAL_ 804 ACC_Warnhinweis 0 "kein_Warnhinweis" 1 "Warnhinweis" ; +VAL_ 804 ACC_Zeitluecke_Abstandswarner 61 "Freifahrt" 62 "nicht_definiert" 63 "keine_Anzeige" ; +VAL_ 804 ACC_Abstand_Abstandswarner 509 "Freifahrt" 510 "nicht_definiert" 511 "keine_Anzeige" ; +VAL_ 804 ACC_Tempolimit 0 "keine_Anzeige" 1 "5_zulHoechstgeschw" 2 "7_zulHoechstgeschw" 3 "10_zulHoechstgeschw" 4 "15_zulHoechstgeschw" 5 "20_zulHoechstgeschw" 6 "25_zulHoechstgeschw" 7 "30_zulHoechstgeschw" 8 "35_zulHoechstgeschw" 9 "40_zulHoechstgeschw" 10 "45_zulHoechstgeschw" 11 "50_zulHoechstgeschw" 12 "55_zulHoechstgeschw" 13 "60_zulHoechstgeschw" 14 "65_zulHoechstgeschw" 15 "70_zulHoechstgeschw" 16 "75_zulHoechstgeschw" 17 "80_zulHoechstgeschw" 18 "85_zulHoechstgeschw" 19 "90_zulHoechstgeschw" 20 "95_zulHoechstgeschw" 21 "100_zulHoechstgeschw" 22 "110_zulHoechstgeschw" 23 "120_zulHoechstgeschw" 24 "130_zulHoechstgeschw" 25 "140_zulHoechstgeschw" 26 "150_zulHoechstgeschw" 27 "160_zulHoechstgeschw" 28 "200_zulHoechstgeschw" 30 "250_zulHoechstgeschw" 31 "Ende_zulHoechstgeschw" ; +VAL_ 804 ACC_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15" ; +VAL_ 804 ACC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch" ; +VAL_ 804 ACC_Texte_Abstandswarner 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "zurzeit_eingeschraenkt" ; +VAL_ 290 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert" ; +VAL_ 290 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert" ; +VAL_ 290 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler" ; +VAL_ 290 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler" ; +VAL_ 290 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren" ; +VAL_ 290 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht" ; +VAL_ 290 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert" ; +VAL_ 290 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System" ; +VAL_ 290 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv" ; +VAL_ 302 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler" ; +VAL_ 302 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht" ; +VAL_ 302 ACC_Freilauf_Anf 0 "keine Freilauf-Anforderung" 1 "Freilauf-Anforderung" ; +VAL_ 302 ACC_Freilauf_Info 0 "Freilauf_freigegeben" 1 "kein_Uebergang_in_Freilauf_zulaessig" 2 "Freilauf_nicht_freigegeben" 3 "Freilauf_Anforderung" ; +VAL_ 302 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" ; +VAL_ 302 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren" ; +VAL_ 302 ACC_Folgebeschl 254 "Neutralwert" ; +VAL_ 302 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler" ; +VAL_ 279 AWV1_Anf_Prefill 0 "Prefill_nicht_aktivieren" 1 "Prefill_aktivieren" ; +VAL_ 279 ANB_CM_Info 0 "Standard" 1 "Erweitert" ; +VAL_ 279 AWV2_Freigabe 0 "keine_Freigabe" 1 "Freigabe" ; +VAL_ 279 AWV1_HBA_Param 0 "Defaultparametersatz" 1 "Parametersatz_mit_leicht_erhoehter_Empfindlichkeit" 2 "Parametersatz_mit_erhoehter_Empfindlichkeit" 3 "Parametersatz_mit_hoechster_Empfindlichkeit" ; +VAL_ 279 AWV2_Priowarnung 0 "Anzeige_Verlassen_der_Fahrspur_wird_nicht_unterdrueckt" 1 "Anzeige_Verlassen_der_Fahrspur_wird_unterdrueckt" ; +VAL_ 279 ANB_CM_Anforderung 0 "keine_Anforderung" 1 "Anforderung_aktiv" ; +VAL_ 279 ANB_Info_Teilbremsung 0 "Auspraegung_Standard" 1 "Auspraegung_Erweitert" ; +VAL_ 279 ANB_Notfallblinken 0 "kein_ANB_Notfallblinken" 1 "Notfallblinken_ANB_angefordert" ; +VAL_ 279 ANB_Teilbremsung_Freigabe 0 "Teilbremsung_nicht_freigegeben" 1 "Teilbremsung_freigegeben" ; +VAL_ 279 ANB_Zielbremsung_Freigabe 0 "Zielbremsung_nicht_freigegeben" 1 "Zielbremsung_freigegeben" ; +VAL_ 279 AWV_Vorstufe 0 "keine_Notbremsung_erwartet" 1 "Notbremsung_in_Kuerze" ; +VAL_ 279 AWV_Halten 0 "keine_Anforderung" 1 "Anforderung_das_Fzg_im_Stillstand_zu_halten" ; +VAL_ 279 AWV_CityANB_Auspraegung 0 "autom_Bremsung_im_ges_vBereich" 1 "autom_Bremsung_im_def_vBereich" ; +VAL_ 279 PCF_Freigabe 0 "keine_Freigabe_PreCrashFront" 1 "Freigabe_PreCrashFront" ; +VAL_ 279 AWV1_ECD_Anlauf 0 "ECD_Anlauf_nicht_aktivieren" 1 "ECD_Anlauf_aktivieren" ; +VAL_ 279 PCF_Time_to_collision 255 "Objektstatus=0x0__oder_berechneter_TTC_Wert_groesser_als_Maximalwert" ; +VAL_ 679 ACC_Regelgeschw 1023 "keine_Anzeige" ; +VAL_ 679 ACC_Einheit_maxSetzgeschw 0 "kmh" 1 "mph" ; +VAL_ 679 ACC_maxSetzgeschw 511 "Init_Neutralwert" ; +VAL_ 679 ACC_minRegelgeschw 255 "keine_Anzeige" ; +VAL_ 679 ACC_maxRegelgeschw 255 "keine_Anzeige" ; +VAL_ 679 ACC_Tempolimitassistent 0 "keine_Anzeige" 1 "Tempolimitassistent_aktiv" 2 "Tempolimitassistent_nicht_verfuegbar" 3 "Tempolimitassistent_Fahreruebernahme" ; +VAL_ 679 ACC_Kurvenassistent 0 "keine_Anzeige" 1 "Kreuzung" 2 "Rechtskurve" 3 "Linkskurve" 4 "Kreisverkehr" ; +VAL_ 679 ACC_RUV 0 "keine_Anzeige" 1 "RUV_aktiv_Rechtsverkehr" 2 "RUV_aktiv_Linksverkehr" ; +VAL_ 679 ACC_Tachokranz 0 "Tachokranz_nicht_beleuchtet" 1 "Tachokranz_beleuchtet" ; +VAL_ 679 ACC_Typ_Tachokranz_unten 0 "LEDs_an" 1 "LEDs_aus" ; +VAL_ 679 ACC_ENG_Texte 0 "keine_Anzeige" 1 "keine_Laenderverfuegbarkeit" 2 "nicht_verfuegbar" 3 "Geschwindigkeitsgrenze" ; +VAL_ 679 ACC_ADAPTIVE 1 "adaptive" 2 "non-adaptive" ; +VAL_ 681 AWV_Warnung 0 "keine_Anzeige" 1 "latente_Vorwarnung" 2 "Vorwarnung" 3 "Akutwarnung" 4 "Eingriff" 5 "Fahreruebernahmeaufforderung" 6 "Abbiegewarnung" ; +VAL_ 681 AWV_Texte 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "Demomodus" 4 "System_aus" 5 "nicht_definiert" 6 "ESC_aus" 7 "zurzeit_eingeschraenkt" ; +VAL_ 681 AWV_Status_Anzeige 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" ; +VAL_ 681 AWV_Einstellung_System_FSG 0 "deaktiviert" 1 "aktiviert" ; +VAL_ 681 AWV_Einstellung_Warnung_FSG 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein" ; +VAL_ 681 AWV_Warnlevel 0 "keine_Gefaehrdung" 63 "max_Gefaehrdung" ; +VAL_ 391 MO_Waehlpos 2 "P" 3 "R" 4 "N" 5 "D" 6 "D" ; +VAL_ 391 EV_Rekuperationsstufe 0 "default" 1 "B1" 2 "B2" 3 "B3" ; +VAL_ 870 Fast_Send_Rate_Active 0 "1 Hz" 1 "50 Hz" ; +VAL_ 988 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; +VAL_ 988 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; +VAL_ 1720 KBI_Variante_USA 0 "keine USA-Variante" 1 "USA-Variante" ; +VAL_ 1720 KBI_Variante 0 "Zeiger Kombiinstrument" 1 "Volldisplay Kombiinstrument" ; +VAL_ 1720 KBI_BCmE_aktiv 0 "Anzeige_nicht_aktiv" 1 "Anzeige_aktiv" ; +VAL_ 1720 KBI_Sparhinweis_quittiert 0 "nicht_quittiert" 1 "quittiert" ; +VAL_ 1720 KBI_Tankfuellstand_Prozent 126 "Init" 127 "Fehler" ; +VAL_ 1720 KBI_Nachtanken_erkannt 0 "Geberbetrieb" 1 "Nachtankmodus" ; +VAL_ 1720 KBI_Tankinhalt_hochaufl 16382 "Init" 16383 "Fehler" ; +VAL_ 1720 KBI_Max_Tankinhalt 254 "Init" 255 "Fehler" ; diff --git a/artifacts/package_runtime/iqdbc/dbc/vw_mqbevo.dbc b/artifacts/package_runtime/iqdbc/dbc/vw_mqbevo.dbc new file mode 100644 index 000000000..4b5043be5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/vw_mqbevo.dbc @@ -0,0 +1,2309 @@ +BO_ 64 Airbag_01: 8 Airbag_MQB + SG_ Airbag_01_CRC : 0|8@1+ (1,0) [0|255] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Airbag_01_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AB_RGS_Anst : 12|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ AB_Front_Crash : 16|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Heck_Crash : 17|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_SF_Crash : 18|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_SB_Crash : 19|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Rollover_Crash : 20|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Crash_Int : 21|3@1+ (1,0) [0|7] "" BMS_MQB,Gateway_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AB_Lampe : 24|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Deaktiviert : 25|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_VB_deaktiviert : 26|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Systemfehler : 27|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ AB_Diagnose : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Stellgliedtest : 29|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AB_Erh_Auf_VB : 30|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtwarn_VF : 32|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Gurtwarn_VB : 33|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Anzeige_Fussg : 34|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Texte_AKS : 36|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_PAO_Leuchte_Anf : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_MKB_gueltig : 39|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_MKB_Anforderung : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ AB_Versorgungsspannung : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 65 Airbag_03: 8 Airbag_MQB + SG_ Airbag_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ Airbag_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ AB_MKB_Safing : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 134 LWI_01: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_Sensorstatus : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_QBit_Sub_Daten : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LWI_QBit_Lenkradwinkel : 15|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_Lenkradwinkel : 16|13@1+ (0.1,0) [0|800] "Unit_DegreOfArc" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_VZ_Lenkradwinkel : 29|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LWI_VZ_Lenkradw_Geschw : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LWI_Lenkradw_Geschw : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" Vector__XXX + SG_ LWI_Sub_Daten : 40|16@1+ (1,0) [0|65535] "" Vector__XXX + +BO_ 157 Motor_Hybrid_01: 8 Motor_Hybrid_MQB + SG_ Motor_Hybrid_01_CRC : 0|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB + SG_ Motor_Hybrid_01_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_IstStatusK0 : 12|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_max_ind_VM_Mom : 16|10@1+ (1,0) [0|1021] "Unit_NewtoMeter" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Zielzustand : 26|3@1+ (1,0) [0|7] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Startmodus : 29|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ MO_HYB_Startmodus_PQ3x : 32|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Stoppmodus : 33|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_VM_Mom_oE : 40|10@1+ (1,-100) [-100|922] "Unit_NewtoMeter" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_VM_aktiv : 50|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Schaltverhinderung : 51|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + +BO_ 158 Getriebe_Hybrid_01: 8 Getriebe_DQ_Hybrid_MQB + SG_ Getriebe_Hybrid_01_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Hybrid_MQB + SG_ Getriebe_Hybrid_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB + SG_ GE_HYB_Fehlerstatus : 12|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB + SG_ GE_HYB_Freigabe_K0 : 16|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Freigabe_LL_Reg : 17|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Freig_sSchl_K0 : 18|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Freig_VM_EM_Stop : 19|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Wiederstart : 20|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_Filt_MomAufbau : 21|3@1+ (1,0) [0|7] "" Motor_Hybrid_MQB + SG_ GE_HYB_nK0 : 24|8@1+ (25,0) [0|6350] "Unit_MinutInver" Vector__XXX + SG_ GE_HYB_MomEingriff_EM : 32|6@1+ (0.5,0) [0|31.5] "Unit_NewtoMeter" LEH_MQB + SG_ GE_HYB_VZ_MomEingriff_EM : 38|1@1+ (1,0) [0|1] "" LEH_MQB + SG_ GE_HYB_Sportfaktor : 56|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB + SG_ GE_HYB_VM_akt_halten : 61|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_StartAnf : 62|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + SG_ GE_HYB_VM_Startkontr : 63|1@1+ (1,0) [0|1] "" Motor_Hybrid_MQB + +BO_ 159 LH_EPS_03: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_DSR_Status : 12|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Berechneter_LW : 16|12@1+ (0.15,0) [0|613.95] "Unit_DegreOfArc" XXX + SG_ EPS_BLW_QBit : 30|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_BLW : 31|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_HCA_Status : 32|4@1+ (1,0) [0|15] "" XXX + SG_ EPS_Lenkmoment : 40|10@1+ (1,0) [0|8] "Unit_centiNewtoMeter" XXX + SG_ EPS_Lenkmoment_QBit : 54|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_VZ_Lenkmoment : 55|1@1+ (1,0) [0|1] "" XXX + SG_ EPS_Lenkungstyp : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 167 Motor_11: 8 Motor_Diesel_MQB + SG_ Motor_11_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ Motor_11_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Soll_Roh : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Ist_Summe : 22|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,SAK_MQB + SG_ MO_Mom_Traegheit_Summe : 32|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Soll_gefiltert : 42|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Schub : 52|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Status_Normalbetrieb_01 : 61|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_erste_Ungenauschwelle : 62|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_QBit_Motormomente : 63|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 168 Motor_12: 8 Motor_Diesel_MQB + SG_ Motor_12_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ Motor_12_BZ : 8|4@1+ (1,0) [0|15] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Mom_neg_verfuegbar : 12|9@1+ (1,-509) [-509|0] "Unit_NewtoMeter" Gateway_MQB + SG_ MO_Mom_Begr_stat : 21|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Begr_dyn : 30|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB + SG_ MO_Momentenintegral_02 : 40|7@1+ (1,0) [0|100] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Drehzahl_01 : 47|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Drehzahl_01 : 48|16@1+ (0.25,0) [0|16383] "Unit_MinutInver" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB + +BO_ 173 Getriebe_11: 8 Getriebe_DQ_Hybrid_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTERXX : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_MMom_Soll_02 : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_MMom_Vorhalt_02 : 22|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Uefkt : 32|10@1+ (0.1,0) [0|102.2] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Fahrstufe : 42|5@1+ (1,0) [0|31] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Schaltvorgang : 47|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Status_Kupplung : 54|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_MMom_Status : 56|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Freig_MMom_Vorhalt : 58|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Verbot_Ausblendung : 59|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Zielgang : 60|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 174 Getriebe_12: 8 Getriebe_DQ_Hybrid_MQB + SG_ Getriebe_12_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Getriebe_12_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Drehzahlmesser_Daempfung : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Schubabschalt_Unt : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Freigabe_Synchro : 14|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Synchro_Wunschdrehz : 15|9@1+ (25,0) [0|12750] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Synchro_Zeit : 24|8@1+ (20,0) [0|5080] "Unit_MilliSecon" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Mom_Begr_Gradient : 32|8@1+ (10,0) [0|2540] "Unit_NewtoMeterPerSecon" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Anheb_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Aufnahmemoment : 48|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Anf_Zylabsch : 58|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ GE_HYB_DZ_Eingriff : 62|2@1+ (1,0) [0|3] "" Motor_Hybrid_MQB + +BO_ 175 Waehlhebel_03: 4 Waehlhebel_MQB + SG_ WH_Status_Sperre : 0|3@1+ (1,0) [0|7] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_Initialisierung : 3|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_SensorPos_roh : 4|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_03_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_SensorPos_roh_inv : 12|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_Testergebnis : 16|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_Test_Aktiv : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WH_Status : 25|7@1+ (1,0) [0|127] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 178 ESP_19: 8 Gateway_MQB + SG_ ESP_HL_Radgeschw_02 : 0|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HR_Radgeschw_02 : 16|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VL_Radgeschw_02 : 32|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VR_Radgeschw_02 : 48|16@1+ (0.0075,0) [0|491.49] "Unit_KiloMeterPerHour" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 219 AWV_03: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Unknown_01 : 12|3@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_63 : 18|6@1+ (1,0) [0|63] "" XXX + SG_ SET_ME_1_2 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_02 : 25|2@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_30 : 27|5@1+ (1,0) [0|15] "" XXX + SG_ SET_ME_127 : 33|7@1+ (1,0) [0|127] "" XXX + SG_ Unknown_03 : 40|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_127_2 : 41|7@1+ (1,0) [0|127] "" XXX + SG_ Pre_FCW : 64|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_63_2 : 66|6@1+ (1,0) [0|63] "" XXX + SG_ SET_ME_15_1 : 72|4@1+ (1,0) [0|15] "" XXX + SG_ FCW_Active : 76|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_255 : 80|8@1+ (1,0) [0|255] "" XXX + SG_ SET_ME_1023 : 94|10@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_1 : 129|1@0+ (1,0) [0|1] "" XXX + +BO_ 252 ESC_51: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_2 : 14|6@1+ (1,0) [0|3] "" XXX + SG_ AEB_Breaking_01 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ AEB_Breaking_02 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ Accelerator_Higher_Speed : 40|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressure : 42|9@1+ (0.195,0) [0|100] "Unit_Percent" XXX + SG_ NEW_SIGNAL_1 : 52|8@1+ (1,0) [0|15] "" XXX + SG_ HL_Radgeschw : 64|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ HR_Radgeschw : 80|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ VL_Radgeschw : 96|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ VR_Radgeschw : 112|16@1+ (0.0075,0) [0|491.5125] "Unit_KilometerPerHour" XXX + SG_ NEW_SIGNAL_3 : 128|4@1+ (1,0) [0|15] "" XXX + SG_ HL_Brake_Pressure : 152|8@1+ (1,0) [0|100] "" XXX + SG_ HR_Brake_Pressure : 160|8@1+ (1,0) [0|100] "" XXX + SG_ VL_Brake_Pressure : 168|8@1+ (1,0) [0|100] "" XXX + SG_ VR_Brake_Pressure : 176|8@1+ (1,0) [0|100] "" XXX + SG_ Steering_Wheel_CW : 184|8@1+ (1.67,0) [0|255] "" XXX + SG_ Steering_Wheel_CCW : 192|8@1+ (1.67,0) [0|255] "" XXX + SG_ ESC_v_Signal : 328|13@1+ (0.052,-107.016) [0|63] "" XXX + SG_ NEW_SIGNAL_4 : 342|13@1+ (1,0) [0|3] "" XXX + +BO_ 253 ESP_21: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BR_Eingriffsmoment : 12|10@1+ (1,-509) [-509|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_v_Signal : 32|16@1+ (0.01,0) [0|655.32] "Unit_KiloMeterPerHour" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ ASR_Tastung_passiv : 48|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Tastung_passiv : 49|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Systemstatus : 50|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ASR_Schalteingriff : 51|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_Haltebestaetigung : 53|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_v_Signal : 55|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ABS_Bremsung : 56|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ASR_Anf : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ MSR_Anf : 58|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EBV_Eingriff : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EDS_Eingriff : 60|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Eingriff : 61|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_ASP : 62|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Anhaltevorgang_ACC_aktiv : 63|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 257 ESP_02: 8 Gateway_MQB + SG_ ESP_02_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_02_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Gierrate : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_QBit_Laengsbeschl : 13|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Querb : 14|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Stillstandsflag : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Querbeschleunigung : 16|8@1+ (0.01,-1.27) [-1.27|1.27] "Unit_ForceOfGravi" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Laengsbeschl : 24|10@1+ (0.03125,-16) [-16|15.90625] "Unit_MeterPerSeconSquar" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Verteil_Wankmom : 34|5@1+ (0.1,-1) [-1|1] "" Vector__XXX + SG_ ESP_QBit_Anf_Vert_Wank : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Gierrate : 40|14@1+ (0.01,0) [0|163.82] "Unit_DegreOfArcPerSecon" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_VZ_Gierrate : 54|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_Notbremsanzeige : 55|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESP_SpannungsAnf : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_PLA_Abbruch : 57|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ESP_Status_ESP_PLA : 60|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 258 ESC_50: 48 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Lateral_Accel : 16|8@1+ (0.15,-18.9) [0|255] "Unit_MeterPerSquareSecond" XXX + SG_ Longitudinal_Accel : 24|10@1+ (0.03125,-16) [0|255] "Unit_MeterPerSquareSecond" XXX + SG_ Yaw_Rate : 40|14@1+ (0.01,0) [0|16383] "Unit_DegreePerSecond" XXX + SG_ Yaw_Rate_Sign : 54|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Power : 80|8@1+ (1,-100) [0|255] "" XXX + SG_ Brake_01 : 90|1@0+ (1,0) [0|1] "" XXX + SG_ Regen_Braking : 123|1@1+ (1,0) [0|7] "" XXX + SG_ Brake_02 : 125|1@0+ (1,0) [0|1] "" XXX + SG_ Standstill : 171|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 180|1@0+ (1,0) [0|1] "" XXX + SG_ Longitudinal_Speed : 181|10@1+ (0.25,0) [0|255] "Unit_KilometerPerHour" XXX + SG_ Brake_Power_02 : 226|8@1+ (1,-100) [0|63] "" XXX + SG_ NEW_SIGNAL_2 : 236|9@1+ (1,0) [0|7] "" XXX + SG_ NEW_SIGNAL_1 : 248|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_Status : 317|3@1+ (1,0) [0|7] "" XXX + +BO_ 260 EPB_01: 8 Gateway_MQB + SG_ EPB_01_CRC : 0|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_01_BZ : 8|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_QBit_Laengsbeschleunigung : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_QBit_Pedalweg_Kuppl : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_BCM2_Motor_Wakeup : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_Freig_Verzoeg_Anf : 15|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_Verzoeg_Anf : 16|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" Vector__XXX + SG_ EPB_Laengsbeschleunigung : 24|8@1+ (1,-128) [-128|126] "Unit_PerCentOfForceOfGravi" Vector__XXX + SG_ EPB_Pedalweg_Kuppl : 32|8@1+ (0.4,0) [8|92] "Unit_PerCent" Vector__XXX + SG_ EPB_Anfahrwunsch_erkannt : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_DAA_Randbed_erf : 49|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ EPB_Fehlerstatus : 50|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EPB_Schalterposition : 52|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_QBit_Schalterpos : 54|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ EPB_Konsistenz_ACC : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EPB_Spannkraft : 56|5@1+ (1,0) [0|29] "Unit_KiloNewto" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ EPB_Status : 61|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 261 VMM_01: 8 XXX + SG_ CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ CNT : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 13|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_4 : 20|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 40|2@1+ (1,0) [0|3] "" XXX + SG_ Brake : 53|7@1+ (1,0) [0|3] "" XXX + +BO_ 262 ESP_05: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Bremsdruck : 12|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Fahrer_bremst : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Schwelle_Unterdruck : 14|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Bremsdruck : 16|10@1+ (0.3,-30) [-30|276.6] "Unit_Bar" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Fahrer_bremst : 26|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Verz_TSK_aktiv : 27|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Lenkeingriff_ADS : 28|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Konsistenz_TSK : 29|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Bremsruck_AWV2 : 30|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Konsistenz_AWV2 : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ECD_Fehler : 32|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ECD_nicht_verfuegbar : 33|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Status_Bremsentemp : 34|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Autohold_Standby : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_HDC_Standby : 36|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_HBA_aktiv : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Prefill_ausgeloest : 38|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Rueckwaertsfahrt_erkannt : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Status_Anfahrhilfe : 40|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HDC_aktiv : 41|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_StartStopp_Info : 42|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ESP_Eingr_HL : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Eingr_HR : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Eingr_VL : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Eingr_VR : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_BKV_Unterdruck : 48|8@1+ (4,0) [0|1012] "Unit_MilliBar" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Autohold_aktiv : 56|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_FStatus_Anfahrhilfe : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_Verz_EPB_aktiv : 58|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ECD_Bremslicht : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Verzoeg_EPB_verf : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Status_Bremsdruck : 61|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Anforderung_EPB : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 263 Motor_04: 8 Motor_Diesel_MQB + SG_ MO_Istgang : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Sollgang : 12|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Oeldruck : 16|8@1+ (0.04,0) [0|10] "Unit_Bar" Gateway_MQB + SG_ MO_Anzeigedrehz : 24|12@1+ (3,0) [0|12282] "Unit_MinutInver" Gateway_MQB + SG_ MO_Schaltempf_verfbar : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Ladedruck : 39|9@1+ (0.01,0) [0|5.1] "Unit_Bar" Gateway_MQB + SG_ MO_KVS : 48|15@1+ (1,0) [0|32767] "Unit_MicroLiter" Gateway_MQB + SG_ MO_KVS_Ueberlauf : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 264 Fahrwerk_01: 8 XXX + SG_ Fahrwerk_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ Fahrwerk_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 267 Motor_51: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Accel_Pedal_Pressure : 12|9@1+ (0.4,0) [0|255] "" XXX + SG_ Accel_Low_Pressed_Support : 21|1@1+ (1,0) [0|7] "" XXX + SG_ TSK_Status : 88|3@1+ (1,0) [0|7] "" XXX + SG_ TSK_Limiter_ausgewaehlt : 95|1@1+ (1,0) [0|3] "" XXX + +BO_ 278 ESP_10: 8 Gateway_MQB + SG_ ESP_10_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_10_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_VL : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_VR : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_HL : 14|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_QBit_Wegimpuls_HR : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_VL : 16|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_VR : 26|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_HL : 36|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Wegimpuls_HR : 46|10@1+ (1,0) [0|1000] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VL_Fahrtrichtung : 56|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_VR_Fahrtrichtung : 58|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HL_Fahrtrichtung : 60|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_HR_Fahrtrichtung : 62|2@1+ (1,0) [0|3] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 279 ACC_10: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ AWV1_Anf_Prefill : 16|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_CM_Info : 17|1@1+ (1,0) [0|1] "" XXX + SG_ AWV2_Freigabe : 18|1@1+ (1,0) [0|1] "" XXX + SG_ AWV1_HBA_Param : 19|2@1+ (1,0) [0|3] "" XXX + SG_ AWV2_Ruckprofil : 21|3@1+ (1,0) [0|7] "" XXX + SG_ AWV2_Priowarnung : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_CM_Anforderung : 25|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Info_Teilbremsung : 26|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Notfallblinken : 27|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Teilbremsung_Freigabe : 28|1@1+ (1,0) [0|1] "" XXX + SG_ ANB_Zielbrems_Teilbrems_Verz_Anf : 29|10@1+ (0.024,-20.016) [-20.016|4.536] "Unit_MeterPerSeconSquar" XXX + SG_ ANB_Zielbremsung_Freigabe : 39|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_Vorstufe : 40|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_Halten : 41|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_CityANB_Auspraegung : 42|1@1+ (1,0) [0|1] "" XXX + SG_ PCF_Freigabe : 43|1@1+ (1,0) [0|1] "" XXX + SG_ AWV1_ECD_Anlauf : 44|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_AWA_VZ_Anf_Lenkmomoffset : 46|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_AWA_Anf_Lenkmomoffset : 47|9@1+ (0.01,0) [0|5.11] "Unit_NewtoMeter" XXX + SG_ PCF_Time_to_collision : 56|8@1+ (0.01,0) [0|2.5] "Unit_Secon" XXX + +BO_ 286 VehicleSpeed: 8 XXX + SG_ VehicleSpeed_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ VehicleSpeed_BZ : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Speed : 52|12@1+ (0.125,0) [0|1] "" XXX + +BO_ 288 TSK_06: 8 Motor_Diesel_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Radbremsmom : 12|12@1+ (8,0) [0|32760] "Unit_NewtoMeter" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Status : 24|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_v_Begrenzung_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Standby_Anf_ESP : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_Freig_Verzoeg_Anf : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Limiter_ausgewaehlt : 31|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_ax_Getriebe_02 : 48|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Zwangszusch_ESP : 57|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_zul_Regelabw : 58|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 289 Motor_20: 8 Motor_Diesel_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|255] "" XXX + SG_ MO_Fahrpedalrohwert_01 : 12|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" Airbag_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Fahrpedalwerte_01 : 20|1@1+ (1,0) [0|1] "" Airbag_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Fahrpedalgradient : 21|8@1+ (25,0) [0|6350] "Unit_PerCentPerSecon" Airbag_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Sig_Fahrpedalgradient : 29|1@1+ (1,0) [0|1] "" Airbag_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_rel_Saugrohrdruck : 30|6@1+ (18,0) [0|1116] "Unit_MilliBar" Gateway_MQB + SG_ MO_rel_Saugrohrdruck_gem_err : 36|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Moment_im_Leerlauf : 37|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Schubabschaltung : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Solldrehz_Leerlauf : 40|8@1+ (10,0) [0|2540] "Unit_MinutInver" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 290 ACC_06: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_limitierte_Anfahrdyn : 12|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_nachtr_Stopp_Anf : 13|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_DynErhoehung : 14|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_StartStopp_Info : 22|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Sollbeschleunigung_02 : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_neg_Sollbeschl_Grad_02 : 40|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_pos_Sollbeschl_Grad_02 : 48|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ : 58|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 294 HCA_01: 8 Frontsensorik + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HCA_01_Vib_Freq : 12|4@1+ (1,15) [15|30] "Unit_Hertz" Vector__XXX + SG_ HCA_01_LM_Offset : 16|9@1+ (1,0) [0|511] "Unit_centiNewtoMeter" Vector__XXX + SG_ EA_ACC_Sollstatus : 25|2@1+ (1,0) [0|3] "" Frontradar + SG_ EA_Ruckprofil : 27|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ HCA_01_Sendestatus : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_LM_OffSign : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HCA_01_Status_HCA : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ HCA_01_Vib_Amp : 36|4@1+ (0.2,0) [0|3] "Unit_NewtoMeter" Vector__XXX + SG_ EA_Ruckfreigabe : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EA_ACC_Wunschgeschwindigkeit : 41|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Frontradar + +BO_ 296 Getriebe_06: 3 Getriebe_DQ_Hybrid_MQB + SG_ GE_WH_Sperre : 0|1@1+ (1,0) [0|1] "" Waehlhebel_MQB + SG_ GE_Ausleuchtungsmode : 1|1@1+ (1,0) [0|1] "" Waehlhebel_MQB + SG_ GE_Test_Freigabe : 2|1@1+ (1,0) [0|1] "" Waehlhebel_MQB + SG_ GE_Ist_Fahrstufe : 4|4@1+ (1,0) [0|15] "" Waehlhebel_MQB + SG_ GE_Testparameter_1 : 8|8@1+ (1,0) [0|255] "" Waehlhebel_MQB + SG_ GE_Testparameter_2 : 16|8@1+ (1,0) [0|255] "" Waehlhebel_MQB + +BO_ 299 GRA_ACC_01: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Hauptschalter : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Abbrechen : 13|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Typ_Hauptschalter : 14|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Limiter : 15|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Setzen : 16|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Hoch : 17|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Runter : 18|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Wiederaufnahme : 19|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Verstellung_Zeitluecke : 20|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Codierung : 22|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Fehler : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Typ468 : 25|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_Tip_Stufe_2 : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GRA_ButtonTypeInfo : 28|2@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ MAYBE_TRAVEL_ASSIST : 30|1@1+ (1,0) [0|1] "" XXX + +BO_ 301 Getriebe_13: 8 Getriebe_DQ_Hybrid_MQB + SG_ Getriebe_13_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Getriebe_13_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_StartStopp_Info : 12|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ GE_Langfr_Schutzmom_02 : 14|9@1+ (1,0) [0|509] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Eingangsdrehz : 48|14@1+ (1,0) [0|16381] "Unit_MinutInver" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Notlauf : 62|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Freig_Langfr_Schutzmom : 63|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 302 ACC_07: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Anhalteweg : 12|11@1+ (0.01,0) [0|20.45] "Unit_Meter" XXX + SG_ ACC_Anhalten : 23|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Boost_Anf : 24|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Freilauf_Anf : 25|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Freilauf_Info : 26|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Anforderung_HMS : 28|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Anfahren : 31|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Folgebeschl : 32|8@1+ (0.03,-4.6) [-4.6|2.99] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_Sollbeschleunigung_02 : 53|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + +BO_ 313 VMM_02: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ FCW_Reaction_1 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_1 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_2 : 27|1@0+ (1,0) [0|1] "" XXX + SG_ AEB_Active : 31|1@0+ (1,0) [0|1] "" XXX + SG_ ESP_Hold : 35|1@0+ (1,0) [0|1] "" XXX + SG_ Brake_Pressed_3 : 48|1@0+ (1,0) [0|1] "" XXX + SG_ FCW_Reaction_2 : 56|1@1+ (1,0) [0|1] "" XXX + SG_ Brake_Pressure : 76|11@1+ (1,0) [0|100] "" XXX + SG_ FCW_Reaction_3 : 88|5@1+ (1,0) [0|31] "" XXX + +BO_ 317 QFK_01: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_5 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ HCA_No_Override : 14|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_8 : 16|1@0+ (1,0) [0|1] "" XXX + SG_ LatCon_HCA_Accept : 17|2@1+ (1,0) [0|3] "" XXX + SG_ NEW_SIGNAL_2 : 19|1@0+ (1,0) [0|1] "" XXX + SG_ LatCon_HCA_Status : 20|3@1+ (1,0) [0|15] "" XXX + SG_ NEW_SIGNAL_1 : 23|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_10 : 24|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 30|3@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_7 : 34|3@0+ (1,0) [0|1] "" XXX + SG_ Steering_Angle_VZ : 36|1@0+ (1,0) [0|1] "" XXX + SG_ Curvature : 40|15@1+ (6.7e-06,0) [0|65535] "" XXX + SG_ Curvature_VZ : 55|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_3 : 56|7@1+ (1,0) [0|63] "" XXX + SG_ NEW_SIGNAL_4 : 63|1@0+ (1,0) [0|1] "" XXX + SG_ Steering_Angle : 76|17@1+ (0.00906,0) [0|32767] "" XXX + +BO_ 332 Motor_54: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Accelerator_Pressure : 175|8@0+ (0.4,-14.4) [0|100] "Unit_Percent" XXX + +BO_ 333 ACC_18: 32 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_limitierte_Anfahrdyn : 12|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_nachtr_Stopp_Anf : 13|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_DynErhoehung : 14|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Freilaufstrategie_TSK : 15|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_zul_Regelabw_unten : 16|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_StartStopp_Info : 22|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Sollbeschleunigung_02 : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_zul_Regelabw_oben : 35|5@1+ (0.0625,0) [0|1.9375] "Unit_MeterPerSeconSquar" XXX + SG_ ACC_neg_Sollbeschl_Grad_02 : 40|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_pos_Sollbeschl_Grad_02 : 48|8@1+ (0.05,0) [0|12.75] "Unit_MeterPerCubicSecon" XXX + SG_ ACC_Anfahren : 56|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalten : 57|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ : 58|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Status_ACC : 60|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Minimale_Bremsung : 63|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anhalteweg : 64|11@1+ (0.01,0) [0|2046] "" XXX + SG_ ACC_Anforderung_HMS : 77|3@1+ (1,0) [0|7] "" XXX + SG_ SET_ME_0XFE : 80|8@1+ (1,0) [0|255] "" XXX + SG_ ACC_AKTIV_regelt : 90|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X1 : 92|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X9 : 232|4@1+ (1,0) [0|15] "" XXX + SG_ Speed : 236|12@1+ (0.1,0) [0|15] "" XXX + SG_ Accel_Boost : 248|6@1+ (1,0) [0|3] "" XXX + SG_ Reversing : 254|1@0+ (1,0) [0|1] "" XXX + +BO_ 387 CAMERA_NEW_3_HF: 64 XXX + SG_ NEW_SIGNAL_1 : 28|12@1+ (1,0) [0|15] "" XXX + +BO_ 391 EV_Gearshift: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ RegenBrakingMode : 12|2@1+ (1,0) [0|3] "" XXX + SG_ GearPosition : 16|4@1+ (1,0) [0|255] "" XXX + +BO_ 418 ESP_15: 8 XXX + SG_ ESP_15_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ ESP_15_BZ : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 420 EA_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ EA_Parken_beibehalten_HMS : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Warnruckprofil : 28|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_eCall_Anf : 31|2@1+ (1,0) [0|3] "" ZR_High + SG_ EA_Funktionsstatus : 40|4@1+ (1,0) [0|15] "" ZR_High + SG_ EA_Gurtstraffer_Anf : 44|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Anforderung_HMS : 48|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Sollbeschleunigung : 53|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" Vector__XXX + +BO_ 427 ESP_33: 8 XXX + SG_ ESP_33_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ ESP_33_BZ : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 496 EA_02: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ EA_Texte : 12|4@1+ (1,0) [0|15] "" ZR_High + SG_ ACF_Lampe_Hands_Off : 16|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EA_Infotainment_Anf : 22|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ EA_Tueren_Anf : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ EA_Innenraumlicht_Anf : 25|1@1+ (1,0) [0|1] "" ZR_High + SG_ zFAS_Warnblinken : 26|2@1+ (1,0) [0|3] "" ZR_High + SG_ STP_Primaeranz : 28|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Bremslichtblinken : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EA_Blinken : 32|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EA_Unknown : 60|3@0+ (1,0) [0|7] "" XXX + +BO_ 519 CAMERA_NEW_1_HF: 64 XXX + SG_ NEW_SIGNAL_2 : 36|11@1+ (1,0) [0|2047] "" XXX + SG_ NEW_SIGNAL_1 : 48|12@1+ (1,0) [0|4095] "" XXX + +BO_ 564 CAMERA_NEW_2_HF: 64 XXX + +BO_ 588 MEB_Side_Assist_01: 16 XXX + SG_ Blind_Spot_Passenger : 12|7@1+ (1,0) [0|15] "" XXX + SG_ Blind_Spot_Driver : 19|7@1+ (1,0) [0|15] "" XXX + SG_ Blind_Spot_Info_Passenger : 26|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Warn_Passenger : 27|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Info_Driver : 29|1@0+ (1,0) [0|1] "" XXX + SG_ Blind_Spot_Warn_Driver : 30|1@0+ (1,0) [0|1] "" XXX + SG_ Lower_Speed_01 : 32|1@0+ (1,0) [0|1] "" XXX + SG_ Higher_Speed_01 : 33|1@0+ (1,0) [0|1] "" XXX + SG_ Higher_Speed_02 : 83|1@0+ (1,0) [0|1] "" XXX + SG_ Lower_Speed_02 : 84|1@0+ (1,0) [0|1] "" XXX + SG_ Standstill : 86|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_1 : 98|1@0+ (1,0) [0|1] "" XXX + SG_ NEW_SIGNAL_6 : 119|1@0+ (1,0) [0|1] "" XXX + +BO_ 589 NEW_MSG_24D: 64 XXX + SG_ NEW_SIGNAL_1 : 24|12@1+ (1,0) [0|4095] "" XXX + +BO_ 591 MEB_Distance_01: 64 XXX + SG_ Unknown_01 : 12|1@0+ (1,0) [0|1] "" XXX + SG_ Distance_Status : 13|2@1+ (1,0) [0|3] "" XXX + SG_ Same_Lane_01_ObjectID : 16|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Left_Lane_01_ObjectID : 22|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Right_Lane_01_ObjectID : 28|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Same_Lane_02_ObjectID : 34|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Left_Lane_02_ObjectID : 40|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Right_Lane_02_ObjectID : 46|6@1+ (1,0) [0|63] "Unit_ObjectID" XXX + SG_ Unknown_02 : 52|2@1+ (1,0) [0|3] "" XXX + SG_ Unknown_03 : 54|10@1+ (1,0) [0|3] "" XXX + SG_ Same_Lane_01_Long_Distance : 64|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Same_Lane_01_Lat_Distance : 76|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Same_Lane_01_Rel_Velo : 86|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Left_Lane_01_Long_Distance : 96|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Left_Lane_01_Lat_Distance : 108|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Left_Lane_01_Rel_Velo : 118|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Right_Lane_01_Long_Distance : 128|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Right_Lane_01_Lat_Distance : 140|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Right_Lane_01_Rel_Velo : 150|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Same_Lane_02_Long_Distance : 160|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Same_Lane_02_Lat_Distance : 172|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Same_Lane_02_Rel_Velo : 182|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Left_Lane_02_Long_Distance : 192|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Left_Lane_02_Lat_Distance : 204|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Left_Lane_02_Rel_Velo : 214|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Right_Lane_02_Long_Distance : 224|12@1+ (0.07,-6) [0|300] "Unit_Meter" XXX + SG_ Right_Lane_02_Lat_Distance : 236|10@1+ (0.065,-33.28) [-50|50] "Unit_Meter" XXX + SG_ Right_Lane_02_Rel_Velo : 246|10@1+ (0.28,-143.36) [-150|150] "Unit_MeterPerSecond" XXX + SG_ Same_Lane_01_Unknown_01 : 256|8@1+ (1,-128) [0|31] "" XXX + SG_ Same_Lane_01_Unknown_02 : 264|6@1+ (1,-15) [0|31] "" XXX + SG_ Same_Lane_01_Unknown_03 : 270|6@1+ (1,0) [0|127] "" XXX + SG_ Same_Lane_01_Unknown_04 : 277|6@1+ (1,0) [0|7] "" XXX + SG_ Same_Lane_01_Unknown_05 : 284|6@1+ (1,0) [0|1] "" XXX + +BO_ 605 KLR_01: 8 Gateway + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KLR_Fehler : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_ResponseError : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Lokalaktiv : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Fehler_Codierung : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KLR_Touchintensitaet_1 : 16|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchintensitaet_2 : 24|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchintensitaet_3 : 32|8@1+ (1,0) [0|250] "Unit_None" Vector__XXX + SG_ KLR_Touchauswertung : 40|4@1+ (1,0) [0|15] "" ZR_High + +BO_ 619 TA_01: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Travel_Assist_Status : 13|3@1+ (1,0) [0|3] "" XXX + SG_ Travel_Assist_Request : 19|3@1+ (1,0) [0|7] "" XXX + SG_ Travel_Assist_Available : 23|1@1+ (1,0) [0|1] "" XXX + +BO_ 679 ACC_13: 8 XXX + SG_ ACC_Regelgeschw : 12|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" XXX + SG_ ACC_Einheit_maxSetzgeschw : 22|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_maxSetzgeschw : 23|9@1+ (1,0) [0|510] "" XXX + SG_ ACC_minRegelgeschw : 32|8@1+ (0.32,0) [0|81.28] "Unit_KiloMeterPerHour" XXX + SG_ ACC_maxRegelgeschw : 40|8@1+ (0.32,0) [0|81.28] "Unit_KiloMeterPerHour" XXX + SG_ ACC_Tempolimitassistent : 48|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Kurvenassistent : 52|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_RUV : 56|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Tachokranz : 58|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ_Tachokranz_unten : 59|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_ENG_Texte : 60|2@1+ (1,0) [0|3] "" XXX + +BO_ 681 ACC_15: 8 XXX + SG_ AWV_Warnung : 16|3@1+ (1,0) [0|7] "" XXX + SG_ AWV_Texte : 24|3@1+ (1,0) [0|7] "" XXX + SG_ AWV_Status_Anzeige : 32|2@1+ (1,0) [0|3] "" XXX + SG_ AWV_Einstellung_System_FSG : 34|1@1+ (1,0) [0|1] "" XXX + SG_ AWV_Einstellung_Warnung_FSG : 36|3@1+ (1,0) [0|7] "" XXX + SG_ AWV_Warnlevel : 58|6@1+ (1,0) [0|63] "" XXX + +BO_ 695 RCTA_01: 8 XXX + SG_ RCTA_01_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ RCTA_01_BZ : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 768 MEB_ACC_01: 48 XXX + SG_ ACC_Tempolimit : 64|5@1+ (1,0) [0|31] "" OTA_FC + SG_ ACC_Wunschgeschw_Farbe : 69|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Warnung_Verkehrszeichen_1 : 70|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACA_Querfuehrung : 71|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ Unknown_02 : 73|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Regelung_AIO : 75|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ACC_Wunschgeschw_02 : 76|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" Vector__XXX + SG_ ACC_Abstandsindex_02 : 86|10@1+ (1,0) [1|1021] "" Vector__XXX + SG_ ACC_Display_Prio : 96|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_rel_Objekt_Zusatzanz : 98|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_Gesetzte_Zeitluecke : 101|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ACC_Optischer_Fahrerhinweis : 104|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Warnhinweis : 105|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_EGO_Fahrzeug : 106|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ ACC_Relevantes_Objekt_02 : 109|2@1+ (1,0) [0|3] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ACC_Wunschgeschw_erreicht : 112|1@1+ (1,0) [0|1] "" OTA_FC + SG_ ACC_Anzeige_Zeitluecke : 113|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ACC_Texte_Primaeranz_02 : 114|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ ACC_Texte_Zusatzanz_02 : 120|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ STA_Primaeranz : 126|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ACC_Event_Wunschgeschw : 140|10@1+ (0.32,0) [0|15] "" XXX + SG_ Heartbeat : 150|9@1+ (1,0) [0|3] "" XXX + SG_ SET_ME_0XFFFF : 160|16@1+ (1,0) [0|65535] "" XXX + SG_ ACC_Enabled : 186|1@0+ (1,0) [0|1] "" XXX + SG_ Zeitluecke_Farbe : 189|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X1 : 199|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Status_ACC : 208|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Akustischer_Fahrerhinweis : 211|2@1+ (1,0) [0|1] "" XXX + SG_ Unknown_08 : 224|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_01 : 225|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_06 : 226|1@0+ (1,0) [0|1] "" XXX + SG_ Unknown_07 : 228|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_0X7FFF : 240|16@1+ (1,0) [0|65535] "" XXX + SG_ Unknown_09 : 262|1@0+ (1,0) [0|3] "" XXX + SG_ Lead_Type_Detected : 265|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Standby_Override : 266|1@0+ (1,0) [0|1] "" XXX + SG_ Street_Color : 267|1@0+ (1,0) [0|1] "" XXX + SG_ ACC_Limiter_Mode : 268|1@0+ (1,0) [0|1] "" XXX + SG_ Lead_Brightness : 269|4@1+ (1,0) [0|7] "" XXX + SG_ SET_ME_0X6A : 273|8@1+ (1,0) [0|7] "" XXX + SG_ Lead_Position : 281|2@1+ (1,0) [0|1] "" XXX + SG_ Lead_Type : 287|3@1+ (1,0) [0|3] "" XXX + SG_ Lead_Distance : 290|10@1+ (0.2,0) [0|7] "Unit_Meter" XXX + SG_ Lead_Distance_Right : 300|10@1+ (0.2,0) [0|15] "Unit_Meter" XXX + SG_ Lead_Distance_Left : 310|10@1+ (0.2,0) [0|3] "Unit_Meter" XXX + SG_ ACC_Events : 332|4@0+ (1,0) [0|3] "Unit_Meter" XXX + SG_ Zeitluecke_1 : 334|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_2 : 344|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_3 : 354|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_4 : 364|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + SG_ Zeitluecke_5 : 374|9@1+ (0.171,0) [0|100] "Unit_Meter" XXX + +BO_ 771 HCA_03: 24 XXX + SG_ RequestStatus : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Power : 16|8@1+ (0.4,0) [0|100] "Unit_Percent" XXX + SG_ Curvature : 24|15@1+ (6.7e-06,0) [0|0.219] "Unit_rad/m" XXX + SG_ Curvature_VZ : 39|1@1+ (1,0) [0|1] "" XXX + SG_ Unknown_01 : 53|1@0+ (1,0) [0|1] "" XXX + SG_ Vibration : 56|1@0+ (1,0) [0|1] "" XXX + SG_ HighSendRate : 66|1@1+ (1,0) [0|1] "" XXX + +BO_ 779 Kombi_01: 8 Gateway_MQB + SG_ KBI_ABS_Lampe : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_ESP_Lampe : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_BKL_Lampe : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Airbag_Lampe : 3|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ KBI_SILA_gueltig : 4|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ KBI_Lenkung_Lampe : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Vorglueh_System_Lampe : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB + SG_ KBI_NV_in_Anzeige : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Kombi_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Anzeigestatus_ACC : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Anzeigestatus_GRA : 13|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Oeldruck_Schalter : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Tankwarnung : 16|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_MFA_v_Einheit_01 : 17|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_im_Stellgliedtest : 18|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ KBI_Anzeigefehler_LDW : 19|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Variante_USA : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Oeldruckwarnung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Handbremse : 23|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ KBI_V_Digital : 24|9@1+ (1,0) [0|511] "" Vector__XXX + SG_ KBI_PLA_in_Anzeige : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Anzeigefehler_NV : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Anzeigestatus_LIM : 35|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_angez_Geschw : 48|10@1+ (0.32,0) [0|325.12] "Unit_KiloMeterPerHour" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Einheit_Tacho : 58|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Konsistenz_ACC : 59|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Fehler_Anzeige_ACC : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Anzeigefehler_SWA : 61|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 780 ACC_02: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Wunschgeschw_02 : 12|10@1+ (0.32,0) [0|327.04] "Unit_KiloMeterPerHour" XXX + SG_ ACC_Status_Prim_Anz : 22|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Abstandsindex : 24|10@1+ (1,0) [1|1021] "" XXX + SG_ ACC_Akustik_02 : 34|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Warnung_Verkehrszeichen_1 : 36|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Gesetzte_Zeitluecke : 37|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Optischer_Fahrerhinweis : 40|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ_Tachokranz : 41|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Anzeige_Zeitluecke : 42|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Tachokranz : 43|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Display_Prio : 44|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Relevantes_Objekt : 46|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Texte_Primaeranz : 48|7@1+ (1,0) [0|127] "" XXX + SG_ ACC_Wunschgeschw_erreicht : 55|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Typ_Tachokranz_unten : 60|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Status_Anzeige : 61|3@1+ (1,0) [0|7] "" XXX + +BO_ 783 SWA_01: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ SWA_Anzeigen : 12|4@1+ (1,0) [0|15] "" Kombi_D4 + SG_ SWA_Blindheit_erkannt : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_rel_Nichtverf : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_rel_Fehler : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Sta_aktiv : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Sta_passiv : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Standziele_li : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Kolonne_li : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Infostufe_SWA_li : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Warnung_SWA_li : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Kolonne_mi : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Standziele_re : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Kolonne_re : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Infostufe_SWA_re : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Warnung_SWA_re : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SWA_Gischtzaehler : 48|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ SWA_KD_Fehler : 59|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 792 Kamera_Status: 8 XXX + +BO_ 798 TSK_07: 8 Motor_Diesel_MQB + SG_ TSK_07_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ TSK_07_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ TSK_Wunschgeschw : 12|10@1+ (0.32,0) [0|326.72] "Unit_KiloMeterPerHour" Gateway_MQB + SG_ TSK_Texte_Primaeranz : 48|5@1+ (1,0) [0|31] "" Gateway_MQB + SG_ TSK_Limiter_Anzeige : 55|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_Status_Anzeige : 61|3@1+ (1,0) [0|7] "" Gateway_MQB + +BO_ 804 ACC_04: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Texte_Sekundaeranz : 12|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Texte_Zusatzanz : 16|6@1+ (1,0) [0|63] "" XXX + SG_ ACC_Status_Zusatzanz : 22|5@1+ (1,0) [0|31] "" XXX + SG_ ACC_Texte : 27|5@1+ (1,0) [0|31] "" XXX + SG_ ACC_Texte_braking_guard : 32|3@1+ (1,0) [0|7] "" XXX + SG_ ACC_Warnhinweis : 35|1@1+ (1,0) [0|1] "" XXX + SG_ ACC_Zeitluecke_Abstandswarner : 36|6@1+ (0.1,0) [0|6] "Unit_Secon" XXX + SG_ ACC_Abstand_Abstandswarner : 42|9@1+ (1,0) [0|508] "" XXX + SG_ ACC_Tempolimit : 51|5@1+ (1,0) [0|31] "" XXX + SG_ ACC_Charisma_FahrPr : 56|4@1+ (1,0) [0|15] "" XXX + SG_ ACC_Charisma_Status : 60|2@1+ (1,0) [0|3] "" XXX + SG_ ACC_Texte_Abstandswarner : 62|2@1+ (1,0) [0|3] "" XXX + +BO_ 811 Motor_Hybrid_02: 8 Motor_Hybrid_MQB + SG_ MO_HYB_E_Faktor : 12|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_Drehzahl_VM : 16|16@1+ (0.25,0) [0|16256] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB + SG_ MO_HYB_LowSpeedModus : 32|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB + +BO_ 812 Motor_17: 8 Motor_Diesel_MQB + SG_ MO_Prio_MAX_Wunschdrehzahl : 12|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Prio_MIN_Wunschdrehzahl : 13|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Luftpfad_aktiv : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_v_Begrenz_Aktivierbar : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MO_Drehzahlbeeinflussung : 16|8@1+ (0.39,0) [0|99.45] "Unit_PerCent" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_MIN_Wunschdrehzahl : 24|8@1+ (25,0) [0|6350] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_MAX_Wunschdrehzahl : 32|9@1+ (25,0) [0|12750] "Unit_MinutInver" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Charisma_FahrPr : 41|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Charisma_Status : 45|2@1+ (1,0) [0|3] "" Gateway_MQB + +BO_ 869 BEM_05: 8 Gateway_MQB + SG_ BEM_P_Generator : 16|8@1+ (50,0) [0|12700] "Unit_Watt" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_n_LLA : 24|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_01_Abschaltstufen : 26|3@1+ (1,0) [0|7] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_Anf_KL : 29|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_StartStopp_Info : 30|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BEM_DFM : 32|5@1+ (3.225,0.025) [0.025|100] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_EMLIN_ungueltig : 37|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_Batt_Ab : 38|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_Segel_Info : 48|2@1+ (1,0) [0|3] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BEM_HYB_DC_uSollLV : 50|6@1+ (0.1,10.6) [10.6|16] "Unit_Volt" LEH_MQB + SG_ BEM_HYB_DC_uMinLV : 56|8@1+ (0.1,0) [0|25.3] "Unit_Volt" LEH_MQB + +BO_ 870 Blinkmodi_02: 8 XXX + SG_ Hazard_Switch : 20|1@1+ (1,0) [0|1] "" XXX + SG_ BM_links : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ BM_rechts : 24|1@1+ (1,0) [0|1] "" ZR_High + SG_ Left_Turn_Exterior_Bulb_1 : 25|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Turn_Exterior_Bulb_1 : 26|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Turn_Exterior_Bulb_2 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Turn_Exterior_Bulb_2 : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Fast_Send_Rate_Active : 37|1@1+ (1,0) [0|1] "" XXX + +BO_ 873 CAMERA_NEW_4: 8 XXX + +BO_ 901 Charisma_01: 8 Gateway_MQB + SG_ CHA_Ziel_FahrPr_ALR : 0|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_ESP : 4|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_FL : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Fahrer_Umschaltung : 14|1@1+ (1,0) [0|1] "" Airbag_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ CHA_Ziel_FahrPr_MO : 16|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ CHA_Ziel_FahrPr_GE : 20|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ CHA_Ziel_FahrPr_ST : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_SCU : 28|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_DR : 32|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_QS : 36|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_AFS : 40|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_RGS : 44|4@1+ (1,0) [0|15] "" Airbag_MQB + SG_ CHA_Ziel_FahrPr_EPS : 48|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_ACC : 52|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CHA_Ziel_FahrPr_SAK : 56|4@1+ (1,0) [0|15] "" SAK_MQB + SG_ CHA_Ziel_FahrPr_MStSt : 60|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 913 OBD_01: 8 Motor_Diesel_MQB + SG_ OBD_Calc_Load_Val : 0|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Eng_Cool_Temp : 8|8@1+ (1,-40) [-40|215] "Unit_DegreCelsi" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Abs_Throttle_Pos : 16|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Abs_Load_Val : 24|16@1+ (0.39215686275,0) [0|25700] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Abs_Pedal_Pos : 40|8@1+ (0.39215686275,0) [0|100] "Unit_PerCent" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Kaltstart_Denominator : 59|1@1+ (1,0) [0|1] "" BMS_MQB,LEH_MQB + SG_ OBD_Minimum_Trip : 60|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Driving_Cycle : 61|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Warm_Up_Cycle : 62|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ OBD_Normed_Trip : 63|1@1+ (1,0) [0|1] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + +BO_ 914 ESP_07: 8 Gateway_MQB + SG_ ESP_07_CRC : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_07_BZ : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_ACC_LDE : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Quattro_Antrieb : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Codierung_ADS : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_RTA_HL : 16|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX + SG_ ESP_RTA_HR : 24|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX + SG_ ESP_RTA_VR : 32|8@1+ (0.048828125,-6.20117) [-6.20117|6.152345625] "Unit_PerCent" Vector__XXX + SG_ OBD_Fehler_Radsensor_HL : 40|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_Fehler_Radsensor_HR : 44|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_Fehler_Radsensor_VL : 48|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_Fehler_Radsensor_VR : 52|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ESP_Qualifizierung_Antriebsart : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_Offroad_Modus : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_MKB_ausloesbar : 58|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESP_MKB_Status : 59|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ESP_CM_Variante : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ESP_OBD_Status : 61|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 916 WBA_03: 8 Getriebe_DQ_Hybrid_MQB + SG_ WBA_03_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ WBA_03_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ WBA_Fahrstufe_02 : 12|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ WBA_ZielFahrstufe : 16|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ WBA_GE_Warnung_02 : 20|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ WBA_eing_Gang_02 : 24|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Otto_MQB + SG_ WBA_GE_Texte : 28|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ WBA_Segeln_aktiv : 31|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WBA_Schaltschema : 32|5@1+ (1,0) [0|31] "" Gateway_MQB + +BO_ 917 LWR_AFS_01: 8 XXX + +BO_ 919 LDW_02: 8 XXX + SG_ LDW_Gong : 12|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_SW_Warnung_links : 14|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_SW_Warnung_rechts : 15|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Texte : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Seite_DLCTLC : 20|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Lernmodus : 21|3@1+ (1,0) [0|7] "" XXX + SG_ LDW_Anlaufsp_VLR : 24|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Vib_Amp_VLR : 28|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Anlaufzeit_VLR : 32|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Lernmodus_rechts : 36|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Lernmodus_links : 38|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_DLC : 40|8@1+ (0.01,-1.25) [-1.25|1.25] "Unit_Meter" XXX + SG_ LDW_TLC : 48|5@1+ (0.1,0) [0|3] "Unit_Secon" XXX + SG_ LDW_Warnung_links : 56|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Warnung_rechts : 57|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Codierinfo_fuer_VLR : 58|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Frontscheibenheizung_aktiv : 60|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Status_LED_gelb : 61|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Status_LED_gruen : 62|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_KD_Fehler : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 945 DC_Hybrid_01: 8 LEH_MQB + SG_ DC_HYB_iAktLV : 12|10@1+ (1,-511) [-511|510] "Unit_Amper" Gateway_MQB + SG_ DC_HYB_iAktReserveLV : 22|10@1+ (1,-511) [-511|510] "Unit_Amper" Gateway_MQB + SG_ DC_HYB_uAktLV : 32|8@1+ (0.1,0) [0|25.3] "Unit_Volt" Gateway_MQB + SG_ DC_HYB_LangsRegelung : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Abregelung_Temperatur : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Fehler_RedLeistung : 42|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Fehler_intern : 43|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Fehler_Spannung : 44|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ DC_HYB_Auslastungsgrad : 56|8@1+ (0.4,0) [0|100] "Unit_PerCent" Gateway_MQB + +BO_ 949 Klima_11: 8 Gateway_MQB + SG_ KL_Drehz_Anh : 0|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_Vorwarn_Komp_ein : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_AC_Schalter : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Komp_Moment_alt : 3|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Zonen : 4|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_Vorwarn_Zuheizer_ein : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Zustand : 7|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_Comp_rev_rq : 8|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX + SG_ KL_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ KL_Charisma_Status : 20|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Comp_enable : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Last_Kompr : 24|8@1+ (0.25,0) [0|63.5] "Unit_NewtoMeter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_Spannungs_Anf : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KL_Thermomanagement : 34|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_StartStopp_Info : 36|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ KL_Anf_KL : 40|8@1+ (0.4,0) [0|101.6] "Unit_PerCent" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KL_el_Zuheizer_Stufe : 48|3@1+ (1,0) [0|7] "" Motor_Diesel_MQB + +BO_ 958 Motor_14: 8 Motor_Diesel_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ MO_StartStopp_Status : 12|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_StartStopp_Wiederstart : 14|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_StartStopp_Motorstopp : 15|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Freig_Reku : 16|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Kl_75 : 18|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Kl_50 : 19|1@1+ (1,0) [0|1] "" Gateway_MQB,LEH_MQB + SG_ MO_Gangposition : 20|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_StartStopp_Fahrerwunsch : 24|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_HYB_Fahrbereitschaft : 26|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB + SG_ MO_Ext_E_Fahrt_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Fahrer_bremst : 28|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Fahrer_bremst : 29|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_BLS : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Konsistenz_Bremsped : 31|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Timeout_ESP : 32|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Klima_Eingr : 33|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Aussp_Anlass : 35|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Freig_Anlass : 36|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Kuppl_schalter : 37|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Interlock : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Motor_laeuft : 39|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kickdown : 40|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Status_Zylabschalt_01 : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_EKlKomLeiRed : 42|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Handshake_STH : 44|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_BKV_Unterdruckwarnung : 45|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Freigabe_Segeln : 46|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_PTC_Status : 47|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ MO_QBit_Gangposition : 50|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Signalquelle_Gangposition : 51|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Remotestart_Betrieb : 52|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 960 Klemmen_Status_01: 4 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ZAS_Kl_S : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZAS_Kl_15 : 17|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ ZAS_Kl_X : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZAS_Kl_50 : 19|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 967 Motor_26: 8 Motor_Diesel_MQB + SG_ MO_HYB_Status_HV_Ladung : 8|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ WIV_Anzeige_aktiv : 12|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Oelmin_Warn : 13|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Sensorfehler : 14|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Schieflage : 15|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Oelstand : 16|4@1+ (12.5,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ MO_Zustand_HWP : 20|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ WIV_Oelsystem_aktiv : 24|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_nicht_betriebswarm : 25|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Ueberfuell_Warn : 26|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_laufender_Motor : 27|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_1 : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_2 : 29|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_3 : 30|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_4 : 31|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Text_Motorstart : 32|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_HYB_Text_5 : 36|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_6 : 37|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Text_7 : 38|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Text_Partikelfil_Reg : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Oelmenge : 43|5@1+ (125,0) [0|3875] "Unit_MilliLiter" Gateway_MQB + SG_ MO_Systemlampe : 48|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_OBD2_Lampe : 49|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Heissleuchte : 50|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Partikel_Lampe : 51|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Winterfahrprog : 52|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ WIV_Oelstand_nicht_vorhanden : 53|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_nachfuellanzeige_ein : 54|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Ueberfuell_deaktiv : 55|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Unterfuell_Warn : 56|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Tankdeckel_Lampe : 57|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Text_Tankdeckelwarn : 58|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ WIV_Oeldr_Warn_Motor : 60|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 968 Getriebe_14: 8 Getriebe_DQ_Hybrid_MQB + SG_ GE_OBD_AbsperrVent : 12|4@1+ (1,0) [0|15] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_amax_moeglich : 16|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Charisma_FahrPr : 25|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ GE_Charisma_Status : 29|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ GE_Verlustmoment : 32|8@1+ (1,0) [0|254] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Freigabe_Verfallsinfo_WFS : 49|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ GE_Codierung_MSG : 50|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ GE_LaunchControl : 51|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ GE_Heizwunsch : 52|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_OBD_Status : 54|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_LFR_Adaption : 55|1@1+ (1,0) [0|1] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ GE_Sumpftemperatur : 56|8@1+ (1,-58) [-58|196] "Unit_DegreCelsi" Gateway_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 980 SMLS_01: 8 Gateway + SG_ SMLS_01_CRC : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ SMLS_01_BZ : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BH_Blinker_li : 12|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ BH_Blinker_re : 13|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ BH_Lichthupe : 14|1@1+ (1,0) [0|1] "" ZR_High + SG_ BH_Fernlicht : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Tipwischen : 16|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Intervall : 17|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_WischerStufe1 : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_WischerStufe2 : 19|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Frontwaschen : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Heckintervall : 21|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Heckwaschen : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ WH_Intervallstufen : 23|4@1+ (1,0) [0|15] "" ZR_High + SG_ FAS_Taster : 27|1@1+ (1,0) [0|1] "" ZR_High,ZR_Standard + SG_ FAS_Taster_Fehler : 28|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_Hupe : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LRH_On_Off : 30|2@1+ (1,0) [0|3] "" ZR_High + SG_ LRH_aktiv : 40|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_P_verriegelt_plausibel : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WH_SRA : 44|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ WH_Wischer_Fehler : 45|1@1+ (1,0) [0|1] "" ZR_High + SG_ BH_Blinker_Fehler : 46|1@1+ (1,0) [0|1] "" ZR_High + SG_ SMLS_PTT : 47|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ WH_Tipwischen_lang : 48|1@1+ (1,0) [0|1] "" ZR_High + +BO_ 981 Licht_Anf_01: 8 XXX + +BO_ 982 Licht_hinten_01: 8 Gateway_MQB + SG_ Licht_hinten_01_BZ : 0|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM2_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LH_Aussenlicht_def : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Standlicht_H_aktiv : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Parklicht_HL_aktiv : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Parklicht_HR_aktiv : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremslicht_H_aktiv : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Nebelschluss_aktiv : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Rueckfahrlicht_aktiv : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Blinker_HL_akt : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Blinker_HR_akt : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Blinker_li_def : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_li_def : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schlusslicht_li_def : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Rueckf_li_def : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Nebel_li_def : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_Nebel_li_def : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_Nebel_re_def : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_li_def : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Nebel_li_def : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_SL_BRL_BLK_li_def : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Brems_Blk_li_def : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Blinker_re_def : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_re_def : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schlusslicht_re_def : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Rueckf_re_def : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Nebel_re_def : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Brems_re_def : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Schluss_Nebel_re_def : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_SL_BRL_BLK_re_def : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Brems_Blk_re_def : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Kennzl_def : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_3_Bremsl_def : 49|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LH_Nebel_mi_def : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Rueckf_mi_def : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LH_Bremsl_li_ges_def : 54|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ LH_Bremsl_re_ges_def : 55|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 984 RGS_VL_01: 8 Airbag_MQB + SG_ RGS_VL_Texte : 12|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ RGS_VL_Charisma_FahrPr : 14|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ RGS_VL_Charisma_Status : 18|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ RGS_VL_aktiv : 21|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_PC_Aktuator_Sitz : 25|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_PC_Aktuator_Schiebedach : 26|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_PC_Aktuator_Fenster : 27|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_PC_Aktuator_Warnblinken : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ RGS_VL_Precrash_Basis : 32|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ RGS_VL_Precrash_Front : 40|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ RGS_VL_Precrash_Rear : 48|8@1+ (1,0) [0|255] "" Gateway_MQB + +BO_ 987 Gateway_72: 8 Gateway_MQB + SG_ BCM_01_alt : 0|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ SMLS_01_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ZV_02_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Wischer_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Anhaenger_01_alt : 4|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ Klima_Sensor_02_alt : 5|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ VSG_01_alt : 6|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ Klima_01_alt : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WFS_01_alt : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Licht_Anf_01_alt : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HFS_offen : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HBFS_offen : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VS_VD_offen_ver : 22|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ VS_VD_zu_ver : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_BT_offen : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Rueckfahrlicht_Schalter : 25|1@1+ (1,0) [0|1] "" Airbag_MQB + SG_ ZV_FT_offen : 26|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ Wischer_vorne_aktiv : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Anhaenger_erkannt : 28|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ BCM1_MH_Schalter : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_HD_offen : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Waschen_vorne_aktiv : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KL_Thermomanagement : 32|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ WFS_Schluessel_Fahrberecht : 34|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BCM1_RFahrlicht_Fzg_Anf : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_RFahrlicht_Ahg_Anf : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Fernlicht : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BH_Blinker_li : 50|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BH_Blinker_re : 51|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_OBD_FStatus_ATemp : 52|4@1+ (1,0) [0|15] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_Aussen_Temp_ungef : 56|8@1+ (0.5,-50) [-50|76] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 988 Gateway_73: 8 XXX + SG_ UNKNOWN_1 : 15|2@0+ (1,0) [0|3] "" XXX + SG_ GE_Fahrstufe : 40|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_Status : 53|3@1+ (1,0) [0|7] "" XXX + SG_ UNKNOWN_2 : 58|3@0+ (1,0) [0|7] "" XXX + +BO_ 989 Gateway_74: 8 Gateway_MQB + SG_ LH_EPS_01_alt : 0|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB + SG_ Kessy_04_alt : 1|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ LIN_2_alt : 2|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MFG_01_alt : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ GW_74_va_14 : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Klima_02_alt : 5|1@1+ (1,0) [0|1] "" BMS_MQB + SG_ Parkhilfe_01_alt : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ELV_01_alt : 7|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KY_StartStopp_Info : 16|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ PH_StartStopp_Info : 18|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ EPS_Lenkerposition : 20|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB + SG_ ELV_Anf_Klemme_50 : 22|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ MF_StartStopp_Info : 25|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ KL_Geblaesespannung_Soll : 40|8@1+ (0.05,0.5) [2|13] "Unit_Volt" BMS_MQB + SG_ KL_Umluftklappe_Status : 48|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ MFL_Tip_Down : 56|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MFL_Tip_Up : 57|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ LS_Tiptronic_Fehler : 58|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 991 Gateway_76: 8 XXX + +BO_ 997 TSG_FT_02: 8 XXX + SG_ TSG_FT_02_CRC : 0|8@1+ (1,0) [0|255] "" XXX + SG_ TSG_FT_02_BZ : 8|4@1+ (1,0) [0|15] "" XXX + +BO_ 1122 PSD_04: 8 ZR_High + SG_ PSD_Segment_ID : 0|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Vorgaenger_Segment_ID : 6|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Segmentlaenge : 12|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Strassenkategorie : 19|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Endkruemmung : 22|8@1+ (1,0) [0|254] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Endkruemmung_Vorz : 30|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Idenditaets_ID : 31|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_ADAS_Qualitaet : 37|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_wahrscheinlichster_Pfad : 38|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Geradester_Pfad : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Fahrspuren_Anzahl : 40|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Bebauung : 43|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Segment_Komplett : 44|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Rampe : 45|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Anfangskruemmung : 47|8@1+ (1,0) [0|254] "" Gateway,Gateway_PAG + SG_ PSD_Anfangskruemmung_Vorz : 55|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Abzweigerichtung : 56|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Abzweigewinkel : 57|7@1+ (1.417323,0) [0|180.000021] "" Gateway,Gateway_PAG + +BO_ 1123 PSD_05: 8 ZR_High + SG_ PSD_Pos_Segment_ID : 0|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Segmentlaenge : 6|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Pos_Inhibitzeit : 13|5@1+ (10,0) [0|310] "Unit_MilliSecon" Gateway,Gateway_PAG + SG_ PSD_Pos_Standort_Eindeutig : 18|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Fehler_Laengsrichtung : 19|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Pos_Fahrspur : 22|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Attribut_Segment_ID_05 : 25|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_ID : 31|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_Wert : 36|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_1_Offset : 40|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_ID : 47|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_Wert : 52|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_2_Offset : 56|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribute_Komplett_05 : 63|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + +BO_ 1124 PSD_06: 8 ZR_High + SG_ PSD_06_Mux M : 0|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Segment_ID m0 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Laendercode m0 : 9|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geschwindigkeit_Einheit m0 : 17|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Verkehrsrichtung m0 : 18|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geometrieguete m0 : 19|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Mapmatchingguete m0 : 21|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Alter_Karte m0 : 23|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Zielfuehrung m0 : 26|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Sys_US_State m0 : 27|6@1+ (1,0) [0|63] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Geometrien m0 : 33|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Ortsinfo m0 : 36|2@1+ (1,0) [0|3] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_verfuegbar m0 : 38|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Zielfuehrung_geaendert m0 : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Geometrieguete_erweitert m0 : 40|8@1+ (1,0) [0|255] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_sonstige_Attribute m0 : 48|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Steigungen m0 : 51|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Strassenkennz m0 : 54|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Tempolimits m0 : 57|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Sys_Quali_Vorfahrtsregelung m0 : 60|3@1+ (1,0) [0|7] "Unit_None" Gateway,Gateway_PAG + SG_ PSD_Attribut_Segment_ID m1 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_ID m1 : 9|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_Offset m1 : 14|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_3_Wert m1 : 21|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_ID m1 : 25|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_Wert m1 : 30|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_4_Offset m1 : 34|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_ID m1 : 41|5@1+ (1,0) [1|31] "" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_Offset m1 : 46|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Attribut_5_Wert m1 : 53|4@1+ (1,0) [0|15] "" Gateway,Gateway_PAG + SG_ PSD_Attribute_Komplett_06 m1 : 57|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Segment_ID m2 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Offset m2 : 9|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit m2 : 16|5@1+ (1,0) [0|31] "" Gateway,Gateway_PAG,OTA_FC + SG_ PSD_Ges_Typ m2 : 21|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Spur_Geschw_Begrenzung m2 : 23|6@1+ (1,0) [0|63] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Gespann m2 : 29|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Witter m2 : 31|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Tag_Anf m2 : 33|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Tag_Ende m2 : 36|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Std_Anf m2 : 39|5@1+ (1,0) [0|24] "Unit_Hours" Gateway,Gateway_PAG + SG_ PSD_Ges_Geschwindigkeit_Std_Ende m2 : 44|5@1+ (1,0) [0|24] "Unit_Hours" Gateway,Gateway_PAG + SG_ PSD_Ges_Ueberholverbot m2 : 49|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Wechselverkehrszeichen m2 : 51|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Wechselverkehrszeichen_Typ m2 : 54|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Gesetzlich_Kategorie m2 : 56|3@1+ (1,0) [0|7] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Gesetzlich_Zusatz m2 : 59|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Verkehrszeichen_Quelle m2 : 61|2@1+ (1,0) [0|3] "" Gateway,Gateway_PAG + SG_ PSD_Ges_Attribute_Komplett m2 : 63|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Laenge_VZ m3 : 3|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Laenge m3 : 4|25@1+ (1e-05,0) [0|180] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Baum_Breite_VZ m3 : 29|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Baum_Breite m3 : 30|24@1+ (1e-05,0) [0|90] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Baum_Ausrichtung m3 : 54|10@1+ (0.3515625,0) [0|359.6484375] "Unit_DegreOfArc" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_Segment_ID m4 : 3|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Steigung m4 : 9|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Vorz m4 : 16|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_A_Offset m4 : 17|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Steigung m4 : 24|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Vorz m4 : 31|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_B_Offset m4 : 32|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_1_Attribute_kompl m4 : 39|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Segment_ID m4 : 40|6@1+ (1,0) [2|63] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Steigung m4 : 46|7@1+ (0.12,0) [0|15] "Unit_PerCent" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Vorz m4 : 53|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Offset m4 : 54|7@1+ (2,0) [0|254] "Unit_Meter" Gateway,Gateway_PAG + SG_ PSD_Steigung_2_Attribute_kompl m4 : 61|1@1+ (1,0) [0|1] "" Gateway,Gateway_PAG + +BO_ 1172 STS_01: 8 Gateway_MQB + SG_ STS_01_CRC : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STS_01_BZ : 8|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STS_Car_not_under_theft : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Car_under_theft : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Anlassersperre : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Typencodierung : 16|5@1+ (1,0) [0|31] "" Vector__XXX + SG_ STS_LIN_aktiv : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Standlicht : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Fahrlicht : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Alarm_still : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Texte : 27|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ STS_Laderelais : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Summer : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Alarm_Blinker : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Notstart : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Signalhorn : 55|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STS_Leerlaufschaltung : 56|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 1175 Parkhilfe_01: 8 XXX + +BO_ 1312 Airbag_02: 8 Airbag_MQB + SG_ AB_Belegung_VB : 26|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_FA : 40|2@1+ (1,0) [0|3] "" Gateway_MQB,Motor_Diesel_MQB,Motor_Otto_MQB + SG_ AB_Gurtschloss_BF : 42|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe2_FA : 44|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe2_MI : 46|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe2_BF : 48|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe3_FA : 50|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe3_MI : 52|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Gurtschloss_Reihe3_BF : 54|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Sitzpos_Sens_FA : 56|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ AB_Sitzpos_Sens_BF : 58|2@1+ (1,0) [0|3] "" Gateway_MQB + +BO_ 1313 STH_01: 8 Gateway_MQB + SG_ STH_Funk_ein : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Funk_aus : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Zusatzheizung : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_LED : 3|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STH_Pumpe_ein : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Geblaese : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_EKP_Anst : 6|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STH_Start_folgt : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Ventiloeffnungszeit : 8|6@1+ (1,0) [0|63] "Unit_Minut" Vector__XXX + SG_ STH_Ventil_Status : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_Waermeeintrag : 16|6@1+ (1,0) [0|63] "" Vector__XXX + SG_ STH_KVS : 24|13@1+ (1,0) [0|8191] "Unit_MilliLiter" Vector__XXX + SG_ STH_Fehlerstatus : 37|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ STH_Heizleistung : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ STH_Wassertemp : 48|8@1+ (0.75,-40) [-40|142.25] "Unit_DegreCelsi" Vector__XXX + SG_ STH_Motorvorwaermung : 59|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STH_Servicemode : 60|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_war_aktiv : 61|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ STH_KVS_Ueberlauf : 62|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ STH_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1385 HVEM_04: 8 XXX + +BO_ 1411 ZV_02: 8 Gateway + SG_ BCM_FH_Freigabe : 12|1@1+ (1,0) [0|1] "" BedienDisp_vo + SG_ BCM_Komfortfkt_Freigabe : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_HSK_Freigabe : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Verdeck_Freigabe : 15|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_intern_ist : 16|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High + SG_ ZV_verriegelt_extern_ist : 17|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High + SG_ ZV_verriegelt_intern_soll : 18|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_extern_soll : 19|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_gesafet_extern_ist : 20|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_gesafet_extern_soll : 21|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ ZV_Einzeltuerentriegelung : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_Heckeinzelentriegelung : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_FT_offen : 24|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_BT_offen : 25|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HFS_offen : 26|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HBFS_offen : 27|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HD_offen : 28|1@1+ (1,0) [0|1] "" DDA,OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3,ZR_Standard + SG_ ZV_HS_offen : 29|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ IRUE_aktiv : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ DWA_aktiv : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ HD_Hauptraste : 32|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ HD_Vorraste : 33|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ FFB_CarFinder : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FFB_Komfortoeffnen : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FFB_Komfortschliessen : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_Schluessel_Zugang : 42|4@1+ (1,0) [0|15] "" ZR_High + SG_ ZV_SafeFunktion_aktiv : 46|1@1+ (1,0) [0|1] "" ZR_High + SG_ FBS_Warn_Schluessel_Batt : 47|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Oeffnungsmodus : 48|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HFS_verriegelt : 50|1@1+ (1,0) [0|1] "" OTA_FC + SG_ HFS_gesafet : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HBFS_verriegelt : 52|1@1+ (1,0) [0|1] "" OTA_FC + SG_ HBFS_gesafet : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZV_ist_Zustand_verfuegbar : 54|1@1+ (1,0) [0|1] "" OTA_FC,ZR_High + SG_ IRUE_Taster_Fkts_LED : 55|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Tankklappe_offen : 56|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Rollo_auf : 57|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_Rollo_zu : 58|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_SAD_auf : 59|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_SAD_zu : 60|1@1+ (1,0) [0|1] "" ZR_High + SG_ BCM_Tankklappensteller_Fehler : 61|1@1+ (1,0) [0|1] "" ZR_High + SG_ ZV_verriegelt_soll : 62|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1413 Systeminfo_01: 8 Gateway_MQB + SG_ SI_Sammel_SG_Fehler : 0|6@1+ (1,0) [0|60] "" Vector__XXX + SG_ SI_Rollenmode : 6|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ SI_QRS_Mode : 8|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ SI_T_Mode : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_NWDF : 10|1@1+ (1,0) [0|1] "" SAK_MQB + SG_ SI_NWDF_gueltig : 11|1@1+ (1,0) [0|1] "" SAK_MQB + SG_ SI_Sammelfehler : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ GW_KD_Fehler : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_01 : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_02 : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_03 : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_04 : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_05 : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_06 : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_07 : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_08 : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_09 : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_10 : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_11 : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_12 : 27|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_13 : 28|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_14 : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SI_BUS_15 : 30|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 1437 Remotestart_FFB: 8 Gateway_MQB + SG_ RSF_Tastencode_1 : 0|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ RSF_Tastencode_2 : 8|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ RSF_Tastencode_Maske : 16|8@1+ (1,0) [0|255] "" Motor_Diesel_MQB,Motor_Otto_MQB + +BO_ 1440 RLS_01: 8 Gateway + SG_ LS_Helligkeit_IR : 0|8@1+ (400,0) [0|101200] "Unit_Lux" ZR_High + SG_ LS_Helligkeit_FW : 8|10@1+ (6,0) [0|6126] "Unit_Lux" ZR_High + SG_ LS_defekt : 22|1@1+ (1,0) [0|1] "" ZR_High + SG_ LS_Verbau : 23|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Regenmenge : 24|4@1+ (10,0) [0|100] "Unit_PerCent" OTA_FC,ZR_High + SG_ RS_Verbau : 29|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Verglasung_schliessen : 30|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_defekt : 31|1@1+ (1,0) [0|1] "" ZR_High + SG_ RS_Wischergeschwindigkeit : 32|3@1+ (1,0) [0|7] "" OTA_FC,ZR_High + SG_ RLS_Vorfeldhelligkeit_Boost : 35|4@1+ (1,0) [0|15] "" ZR_High + +BO_ 1520 Dimmung_01: 8 Gateway_MQB + SG_ DI_KL_58xd : 0|8@1+ (1,0) [0|253] "" Airbag_MQB + SG_ DI_KL_58xs : 8|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ DI_Display_Nachtdesign : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ DI_KL_58xt : 16|7@1+ (1,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ DI_Fotosensor : 24|16@1+ (1,0) [0|65535] "" Vector__XXX + +BO_ 1528 SAK_01: 8 SAK_MQB + SG_ SAK_Charisma_FahrPr : 16|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ SAK_Charisma_Status : 20|2@1+ (1,0) [0|3] "" Gateway_MQB + +BO_ 1600 Motor_07: 8 Motor_Diesel_MQB + SG_ MO_QBit_Ansaugluft_Temp : 0|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_QBit_Oel_Temp : 1|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_QBit_Kuehlmittel_Temp : 2|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Stellgliedtest_Soundaktuator : 3|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_HYB_Fehler_HV_Netz : 4|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_aktives_Getriebeheizen : 5|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Absperrventil_oeffnen : 6|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Ansaugluft_Temp : 8|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB + SG_ MO_Oel_Temp : 16|8@1+ (1,-60) [-60|192] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kuehlmittel_Temp : 24|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB + SG_ MO_Hoeheninfo : 32|8@1+ (0.00781,0) [0|1.98374] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Kennfeldk : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Versionsinfo : 41|6@1+ (1,0) [0|63] "" Gateway_MQB + SG_ MO_Getriebe_kuehlen : 47|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Mom_Traegheit_02 : 48|5@1+ (0.01,0) [0|0.31] "Unit_KiloGramMeterSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Heizungspumpenansteuerung : 53|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ MO_SpannungsAnf : 57|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Nachlaufzeit_Heizungspumpe : 58|6@1+ (15,0) [0|945] "Unit_Secon" Gateway_MQB + +BO_ 1601 Motor_Code_01: 8 Motor_Diesel_MQB + SG_ Motor_Code_01_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB + SG_ Motor_Code_01_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Faktor_Momente_02 : 12|2@1+ (1,0) [0|3] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Hybridfahrzeug : 14|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Code : 16|8@1+ (1,0) [0|255] "" Gateway_MQB,SAK_MQB + SG_ MO_Getriebe_Code : 24|6@1+ (1,0) [0|63] "" Gateway_MQB + SG_ MO_StartStopp_Codiert : 30|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Anzahl_Zyl : 32|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_Kraftstoffart : 36|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Hubraum : 40|7@1+ (0.1,0) [0|12.7] "Unit_Liter" Gateway_MQB + SG_ MO_Ansaugsystem : 47|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_Leistung : 48|9@1+ (1,0) [0|511] "Unit_KiloWatt" Gateway_MQB + SG_ MO_Abgastyp_EOBD : 57|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ MO_Abgastyp_OBD : 58|1@1+ (1,0) [0|1] "" BMS_MQB,Gateway_MQB,LEH_MQB + SG_ MO_DPF_verbaut : 59|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_Codierung : 60|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Einspritzart : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 1602 WIV_01: 8 Motor_Diesel_MQB + SG_ WIV_Verschleissindex : 0|16@1+ (2e-08,0) [0|0.00131068] "" Gateway_MQB + SG_ WIV_Russindex : 16|16@1+ (2e-08,0) [0|0.00131068] "" Gateway_MQB + SG_ WIV_t_min : 32|6@1+ (1,0) [0|63] "Unit_Month" Gateway_MQB + SG_ WIV_t_max : 40|6@1+ (1,0) [0|63] "Unit_Month" Gateway_MQB + SG_ WIV_W_min : 48|7@1+ (1000,0) [0|127000] "Unit_KiloMeter" Gateway_MQB + SG_ WIV_W_max : 56|7@1+ (1000,0) [0|127000] "Unit_KiloMeter" Gateway_MQB + +BO_ 1603 Einheiten_01: 8 Gateway_MQB + SG_ KBI_Einheit_Datum : 0|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Druck : 2|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Streckenanz : 4|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB + SG_ KBI_MFA_v_Einheit_02 : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Einheit_Temp : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Einheit_Uhrzeit : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ KBI_Einheit_Verbrauch : 8|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Volumen : 10|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ KBI_Einheit_Sprache : 16|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 1605 FLA_01: 8 XXX + +BO_ 1607 Motor_09: 8 Motor_Diesel_MQB + SG_ MO_ITM_Kuehlmittel_Temp : 0|8@1+ (0.75,-48) [-45.75|143.25] "Unit_DegreCelsi" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_E85_Sensor : 8|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ SCR_Anz_Motorstarts : 12|4@1+ (1,0) [0|8] "" Gateway_MQB + SG_ SCR_Reichweite : 16|15@1+ (1,0) [0|32766] "" Gateway_MQB + SG_ SCR_Warnstufe_1 : 32|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ SCR_Warnstufe_2 : 33|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ SCR_Text : 34|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ SCR_Akustik : 37|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Kraftstofffilter_Wasser : 40|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ SCR_Systemfehler : 41|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ SCR_Inducement_Strategie : 42|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_CO2_Faktor : 44|12@1+ (1,0) [1|4094] "Unit_GramPerLiter" Gateway_MQB + +BO_ 1624 Licht_vorne_01: 8 XXX + +BO_ 1625 Klimakomp_01: 8 Gateway_MQB + SG_ EKL_KD_Fehler : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EKL_Comp_SCI_com_stat : 16|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EKL_Comp_output_stat : 18|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EKL_Comp_main_stat : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EKL_Comp_ovld_stat : 21|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ EKL_Comp_Inv_stat : 24|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EKL_Comp_photo_temp_stat : 30|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EKL_Comp_photo_temp : 32|8@1+ (1,0) [0|254] "Unit_DegreCelsi" Vector__XXX + SG_ EKL_Comp_current : 40|8@1+ (0.1,0) [0|25.4] "Unit_Amper" Motor_Hybrid_MQB + SG_ EKL_Comp_rev_stat : 48|8@1+ (50,0) [0|8600] "Unit_MinutInver" Vector__XXX + +BO_ 1626 BCM_01: 8 Gateway_MQB + SG_ BCM_Bremsbelag_Sensor : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Bremsfluessigkeit_Sensor : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Licht_Warn : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Waschwasser_Sensor : 15|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Kuehlmittel_Sensor : 16|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_Kl_15_HW_erkannt : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Eis_Offroad_Taste : 18|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Otto_MQB + SG_ ZZH_Endlage_oben : 19|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZZH_Endlage_unten : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ZZH_Endlage_unplausibel : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM2_EZS_gedrueckt : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM2_SST_gedrueckt : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Hybrid_StartStopp_Taste : 24|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_Warnblink_Taster : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Valet_Parking_Taster : 26|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM_Remotestart_Betrieb : 27|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_HSK_Taster : 28|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Heckrollo_Taster : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BCM1_Rueckfahrlicht_Schalter : 30|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_MH_Schalter : 31|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Otto_MQB + SG_ BCM1_MH_WIV_Schalter : 32|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM_Eco_Charisma_Taste : 33|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ BCM_Thermomanagement : 34|2@1+ (1,0) [0|3] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM_Thermomanagement_Fehler : 36|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM_Thermomanagement_gueltig : 37|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ BCM1_Lichtwarn_Texte : 38|2@1+ (1,0) [0|3] "" Vector__XXX + +BO_ 1628 BMS_Hybrid_01: 8 BMS_MQB + SG_ BMS_HYB_ASV_hinten_Status : 13|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_ASV_vorne_Status : 14|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_KD_Fehler : 15|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_BattFanSpd : 16|4@1+ (10,0) [0|100] "Unit_PerCent" Gateway_MQB + SG_ BMS_HYB_VentilationReq : 20|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_Spuelbetrieb_Status : 21|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ BMS_HYB_Kuehlung_Anf : 22|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ BMS_HYB_Temp_vor_Verd : 24|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB + SG_ BMS_HYB_Temp_nach_Verd : 32|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB + SG_ BMS_Temperatur : 40|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB + SG_ BMS_Temperatur_Ansaugluft : 48|8@1+ (0.5,-40) [-40|86.5] "Unit_DegreCelsi" Gateway_MQB + SG_ BMS_IstSpannung_HV : 56|8@1+ (1,100) [100|350] "Unit_Volt" Gateway_MQB + +BO_ 1629 ESP_20: 8 Gateway_MQB + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ BR_Systemart : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESP_Zaehnezahl : 16|8@1+ (1,0) [0|255] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ ESP_Charisma_FahrPr : 24|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ ESP_Charisma_Status : 28|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ BR_QBit_Reifenumfang : 51|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ BR_Reifenumfang : 52|12@1+ (1,0) [0|4095] "Unit_MilliMeter" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 1630 OBD_Tankgeber_01: 8 Gateway_MQB + SG_ OBD_TG_F_Status_1 : 0|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_F_Status_2 : 4|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_F_Status_3 : 8|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_F_Status_4 : 12|4@1+ (1,0) [0|15] "" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_Sens_Rohwert_1 : 16|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_Sens_Rohwert_2 : 28|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_Sens_Rohwert_3 : 40|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ OBD_TG_Sens_Rohwert_4 : 52|12@1+ (0.5,0) [0|2047.5] "Unit_Ohm" Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 1631 Motor_16: 8 Motor_Diesel_MQB + SG_ TSK_QBit_Steigung : 12|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_QBit_Fahrzeugmasse : 13|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_SpannungsAnf_02 : 14|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_DPF_reg : 16|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ MO_Heizstrom_EKAT : 17|7@1+ (1,0) [0|126] "Unit_Amper" Gateway_MQB + SG_ MO_Heizstrom_SCR : 24|6@1+ (1,0) [0|62] "Unit_Amper" Gateway_MQB + SG_ TSK_Fahrzeugmasse_02 : 48|8@1+ (32,0) [0|8128] "Unit_KiloGram" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Steigung : 56|8@1+ (0.8,-101.6) [-101.6|101.6] "Unit_PerCent" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 1633 Anhaenger_01: 8 Gateway_MQB + SG_ AAG_BZ : 0|4@1+ (1,0) [0|15] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Bremsl_durch_ECD : 5|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Anhaenger_abgesteckt : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_NSL_aktiv : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Anhaenger_erkannt : 8|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Blinker_H_aktiv : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Blinker_HL_def : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Blinker_HR_def : 11|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Bremslicht_H_def : 12|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ AAG_Schlusslicht_HL_def : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_Schlusslicht_HR_def : 14|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_AVS_Fehler_02 : 18|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AAG_AVS_Stati : 20|4@1+ (1,0) [0|15] "" Vector__XXX + +BO_ 1646 Klima_03: 8 XXX + +BO_ 1648 Motor_18: 8 Motor_Diesel_MQB + SG_ MO_Hybrid_StartStopp_LED : 43|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Eis_Offroad_LED : 45|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_Anzahl_Abgesch_Zyl : 47|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ MO_Zylabsch_Texte : 50|2@1+ (1,0) [0|3] "" Gateway_MQB + SG_ MO_E85_BS_Texte : 52|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ MO_Drehzahl_Warnung : 55|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ MO_obere_Drehzahlgrenze : 56|8@1+ (50,0) [50|12750] "Unit_MinutInver" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + +BO_ 1714 Diagnose_01: 8 Gateway_MQB + SG_ DGN_Verlernzaehler : 0|8@1+ (1,0) [0|254] "" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,SAK_MQB + SG_ KBI_Kilometerstand : 8|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Tag : 39|5@1+ (1,0) [1|31] "Unit_Day" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ UH_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" Airbag_MQB,BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB,SAK_MQB + SG_ Kombi_02_alt : 62|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB + SG_ Uhrzeit_01_alt : 63|1@1+ (1,0) [0|1] "" Airbag_MQB,BMS_MQB,LEH_MQB + +BO_ 1716 VIN_01: 8 Gateway_MQB + SG_ VIN_01_MUX M : 0|2@1+ (1,0) [0|3] "" Airbag_MQB + SG_ KS_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ KS_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" Airbag_MQB + SG_ VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" Airbag_MQB + +BO_ 1719 Kombi_02: 8 Gateway_MQB + SG_ KBI_Kilometerstand : 0|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" Vector__XXX + SG_ KBI_Standzeit_02 : 20|17@1+ (1,0) [0|131068] "Unit_Secon" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Inhalt_Tank : 40|7@1+ (1,0) [0|125] "Unit_Liter" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_FStatus_Tank : 47|1@1+ (1,0) [0|1] "" Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_QBit_Aussen_Temp_gef : 55|1@1+ (1,0) [0|1] "" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ KBI_Aussen_Temp_gef : 56|8@1+ (0.5,-50) [-50|75] "Unit_DegreCelsi" Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + +BO_ 1720 Kombi_03: 8 XXX + SG_ KBI_Reifenumfang : 0|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX + SG_ KBI_Variante_USA : 12|1@1+ (1,0) [0|1] "" XXX + SG_ KBI_Variante : 13|1@1+ (1,0) [0|1] "" XXX + SG_ KBI_BCmE_aktiv : 16|1@1+ (1,0) [0|1] "" XXX + SG_ KBI_Sparhinweis_quittiert : 17|1@1+ (1,0) [0|1] "" XXX + SG_ KBI_Tankfuellstand_Prozent : 18|7@1+ (1,0) [0|100] "Unit_PerCent" XXX + SG_ KBI_Nachtanken_erkannt : 25|1@1+ (1,0) [0|1] "" XXX + SG_ KBI_Tankinhalt_hochaufl : 26|14@1+ (0.01,0) [0|163.81] "Unit_Liter" XXX + SG_ KBI_Max_Tankinhalt : 40|8@1+ (0.5,0) [0|126.5] "" XXX + SG_ KBI_Reifenumfang_Sekundaer : 48|12@1+ (1,0) [0|4095] "Unit_MilliMeter" XXX + +BO_ 316495015 MEB_VZE_01: 32 XXX + SG_ VZE_Anzeigemodus : 0|2@1+ (1,0) [0|3] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_Einheit : 8|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Anzeigeunterdrueck_Zeichen_3 : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Anzeigeunterdrueck_Zeichen_2 : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Verkehrszeichen_1_Typ : 11|1@0+ (1,0) [0|1] "" XXX + SG_ VZE_Verkehrszeichen_1 : 12|7@1+ (10,0) [1|520] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_2_Typ : 19|1@0+ (1,0) [0|1] "" XXX + SG_ VZE_Verkehrszeichen_2 : 20|7@1+ (10,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_3_Typ : 27|1@0+ (1,0) [0|1] "" XXX + SG_ VZE_Verkehrszeichen_3 : 28|7@1+ (10,0) [1|255] "" OTA_FC,ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_1 : 35|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_2 : 36|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Warnung_Verkehrszeichen_3 : 37|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_1 : 38|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_2 : 42|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zusatzschild_3 : 46|4@1+ (1,0) [1|15] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Anzeigeunterdrueck_Zeichen_1 : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ VZE_Zeichen_01_KameraWied : 51|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_KameraWied : 52|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_KameraWied : 53|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Kamera : 54|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Karte : 55|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_01_Gesetz : 56|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Kamera : 57|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Karte : 58|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_02_Gesetz : 59|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Kamera : 60|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Karte : 61|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Zeichen_03_Gesetz : 62|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Gong : 63|1@1+ (1,0) [0|1] "" ZR_High,ZR_LIMU,ZR_MIB_TOP_ab_Gen3 + SG_ VZE_Verkehrszeichen_4 : 75|8@1+ (1,0) [0|31] "" XXX + SG_ VZE_Verkehrszeichen_6 : 92|7@1+ (1,0) [0|7] "" XXX + SG_ VZE_Baustelle : 110|1@0+ (1,0) [0|1] "" XXX + SG_ Zeichen_Unknown : 129|4@1+ (1,0) [0|15] "" XXX + SG_ Zeichen_Unknown_Entfernung : 140|6@1+ (1,0) [0|15] "" XXX + SG_ Zusatzschild_Unknown : 147|2@1+ (1,0) [0|3] "" XXX + SG_ Unknown_02 : 167|4@1+ (1,0) [0|3] "" XXX + SG_ Unknown_01 : 207|1@0+ (1,0) [0|1] "" XXX + +BO_ 380196019 CAMERA_NEW_16: 16 XXX + +BO_ 380196036 CAMERA_NEW_18: 8 XXX + +BO_ 389224720 CAMERA_NEW_13: 3 XXX + +BO_ 389226768 CAMERA_NEW_12: 2 XXX + +BO_ 389241616 CAMERA_NEW_14: 5 XXX + +BO_ 401604687 CAMERA_NEW_9: 8 XXX + +BO_ 441800082 CAMERA_NEW_15: 8 XXX + +BO_ 441800100 CAMERA_NEW_8: 64 XXX + +BO_ 441800101 CAMERA_NEW_7: 64 XXX + +BO_ 2549088277 KN_Airbag_01: 8 Airbag_MQB + SG_ Airbag_01_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Airbag_01_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ AB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088284 KN_SAK: 8 SAK_MQB + SG_ SAK_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SAK_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ SAK_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088374 KN_MO_01: 8 Motor_Diesel_MQB + SG_ Motor_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Motor_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ MO_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088375 KN_Getriebe_01: 8 Getriebe_DQ_Hybrid_MQB + SG_ Getriebe_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Getriebe_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ GE_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088379 KN_Hybrid_01: 8 BMS_MQB + SG_ Hybrid_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ Hybrid_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ BMS_HYB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2549088380 KN_EMotor_01: 8 LEH_MQB + SG_ EMotor_KompSchutz : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EMotor_Nachlauftyp : 4|4@1+ (1,0) [0|15] "" Gateway_MQB + SG_ EM_HYB_KD_Fehler : 63|1@1+ (1,0) [0|1] "" Gateway_MQB + +BO_ 2600468496 NMH_Gateway: 8 Gateway_MQB + SG_ NM_Gateway_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Gateway_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_Gateway_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Gateway_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_ACAN_Aktivitaet : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_FCAN_Aktivitaet : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_KCAN_Aktivitaet : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_ICAN_Aktivitaet : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_DiagCAN_Aktivitaet : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_ECAN_Aktivitaet : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_Energie_LIN_Aktivi000 : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_Bedien_LIN_Aktivitaet : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_EM_Aktivitaet : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NL_EM : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NL_Shutdown : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NL_Spg_Messung : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_NL_Wakeup_Monitor : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Gateway_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468501 NMH_Airbag_01: 8 Airbag_MQB + SG_ NM_Airbag_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Airbag_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_Airbag_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_Airbag_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Airbag_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Airbag_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Airbag_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Airbag_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468598 NMH_MO_01: 8 Motor_Diesel_MQB + SG_ NM_MO_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_MO_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_MO_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_MO_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_HV_Abschaltung : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_EKP_Vorlauf : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NM_aktiv_STH_Betrieb : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_Kuehlerluefter : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_Diagnose : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_WFS : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_EEPROM : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_NL_Sonstige : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_MO_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468599 NMH_Getriebe_01: 8 Getriebe_DQ_Hybrid_MQB + SG_ NM_Getriebe_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Getriebe_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_Getriebe_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_Getriebe_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_v_gr_0 : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_Pos_Erk : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NM_aktiv_Umg_Bed : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Getriebe_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468603 NMH_Hybrid_01: 8 BMS_MQB + SG_ NM_Hybrid_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Hybrid_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_Hybrid_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_Hybrid_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_Hybrid_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_NL_Luefter : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_Hybrid_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 2600468604 NMH_EMotor_01: 8 LEH_MQB + SG_ NM_EMotor_01_SNI : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_EMotor_01_NM_State : 16|6@1+ (1,0) [0|63] "" BMS_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB,LEH_MQB,Motor_Diesel_MQB,Motor_Hybrid_MQB,Motor_Otto_MQB + SG_ NM_EMotor_01_Car_Wakeup : 22|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ NM_EMotor_01_Wakeup : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ NM_EMotor_01_NM_aktiv_KL15 : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_EMotor_01_NM_aktiv_Diagnose : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_EMotor_01_NM_aktiv_Tmin : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_EMotor_01_NL_Daten_EEPROM : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ NM_EMotor_01_UDS_CC : 63|1@1+ (1,0) [0|1] "" Vector__XXX + +CM_ SG_ 134 LWI_Lenkradwinkel "Steering angle WITH variable ratio effect included"; +CM_ SG_ 159 EPS_Berechneter_LW "Raw steering angle, degrees"; +CM_ SG_ 159 EPS_VZ_BLW "Raw steering angle, direction"; +CM_ SG_ 159 EPS_HCA_Status "Status of Heading Control Assist feature"; +CM_ SG_ 159 EPS_Lenkmoment "Steering input by driver, torque"; +CM_ SG_ 159 EPS_VZ_Lenkmoment "Steering input by driver, direction"; +CM_ SG_ 173 COUNTERXX "Message not renamed to COUNTER because J533 rate-limiting makes it look like messages are being lost"; +CM_ SG_ 294 HCA_01_Vib_Freq "Frequenz der Lenkradvibration"; +CM_ SG_ 294 HCA_01_LM_Offset "Von HCA angefordertes Lenkmoment (Betrag)"; +CM_ SG_ 294 EA_ACC_Sollstatus "Status-Anforderung ACC von Emergency Alert. Statuswechsel bei Flanke. Solange Wert=1, wird EA_ACC_Wunschgeschwindigkeit Ãŧbernommen. Wert=2 fÃŧhrt zu Zustand ÂŋACC_GRA_passivÂŋ"; +CM_ SG_ 294 EA_Ruckprofil "Emergency Alert Anforderung an ESP, welcher Ruck verwendet werden soll. Eine Umsetzung der Ruckanforderung im ESP erfolgt nur mit gesetztem Bit 'EA_Ruckfreigabe'."; +CM_ SG_ 294 HCA_01_Sendestatus "Gibt den Sendestatus der HCA_01 an (notwendig fÃŧr IL-UnterstÃŧtzung)"; +CM_ SG_ 294 HCA_01_LM_OffSign "Vorzeichen des HCA-Lenkmoments"; +CM_ SG_ 294 HCA_01_Status_HCA "Statusinformation vom HCA und Manoevrierassistent fÃŧr Handshakemechanismus mit der Lenkung"; +CM_ SG_ 294 HCA_01_Vib_Amp "Momentenamplitude der Lenkradvibration"; +CM_ SG_ 294 EA_Ruckfreigabe "Emergency Alert Freigabit fÃŧr die Warnruck-Anforderung an das ESP"; +CM_ SG_ 294 EA_ACC_Wunschgeschwindigkeit "Emergency Alert Anforderung neue Wunschgeschwindigkeit"; +CM_ SG_ 391 GearPosition "Traditional PRND plus B-mode aggressive regen, B-mode mapped to Drive"; +CM_ SG_ 919 LDW_DLC "Probable DLC (distance to line crossing)"; +CM_ SG_ 919 LDW_TLC "Probable TLC (time to line crossing)"; +CM_ SG_ 960 ZAS_Kl_15 "Indicates ignition on"; +CM_ SG_ 1720 KBI_Reifenumfang "Mittlerer Radumfang aus der K-Zahl gerechnet in Millimeter. Byte 2 Bit 5,4 reserviert, Byte 2 Bit 3..0 und Byte 1 Bit 7..0; Wertebereich 0..4096 mm"; +CM_ SG_ 1720 KBI_Variante_USA "In diesem Signal wird die HW-Variante des Kombis ausgegeben, ACC plausibilisiert auf dieses Signal hin seine US-Codierung"; +CM_ SG_ 1720 KBI_Variante "Zeigt an ob es sich um ein konventionelles Zeiger-Kombiinstrument handelt oder um eine Volldisplay-Kombiinstrument"; +CM_ SG_ 1720 KBI_BCmE_aktiv "Anzeige BCmE aktiv (BCmE-Screen oder Einsparhinweis in der Anzeige)"; +CM_ SG_ 1720 KBI_Sparhinweis_quittiert "angezeigter Sparhinweis ist quittiert. Signal wird nach zwei Sendebotschaften wieder auf '0' gesetzt."; +CM_ SG_ 1720 KBI_Tankfuellstand_Prozent "TankfÃŧllstand in %"; +CM_ SG_ 1720 KBI_Nachtanken_erkannt "Statusinformation Nachtankmodus"; +CM_ SG_ 1720 KBI_Tankinhalt_hochaufl "angezeigter Tankinhalt hochauflÃļsend zur Restreichweitenberechnung"; +CM_ SG_ 1720 KBI_Max_Tankinhalt "Mitteilung des maximalen Tankinhalts an das Reichweitenmodul"; +CM_ SG_ 1720 KBI_Reifenumfang_Sekundaer "Fahrzeuge mit unterschiedlichen Reifenumfängen Vorderachse / Hinterachse:Primärachse: KBI_Reifenumfang Sekundärachse: KBI_Reifenumfang_Sekundaer"; + +VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active"; +VAL_ 173 GE_Fahrstufe 5 "P" 6 "R" 7 "N" 8 "D" 9 "S" 10 "E" 13 "T" 14 "T"; +VAL_ 258 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; +VAL_ 267 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault"; +VAL_ 279 AWV1_Anf_Prefill 0 "Prefill_nicht_aktivieren" 1 "Prefill_aktivieren"; +VAL_ 279 ANB_CM_Info 0 "Standard" 1 "Erweitert"; +VAL_ 279 AWV2_Freigabe 0 "keine_Freigabe" 1 "Freigabe"; +VAL_ 279 AWV1_HBA_Param 0 "Defaultparametersatz" 1 "Parametersatz_mit_leicht_erhoehter_Empfindlichkeit" 2 "Parametersatz_mit_erhoehter_Empfindlichkeit" 3 "Parametersatz_mit_hoechster_Empfindlichkeit"; +VAL_ 279 AWV2_Priowarnung 0 "Anzeige_Verlassen_der_Fahrspur_wird_nicht_unterdrueckt" 1 "Anzeige_Verlassen_der_Fahrspur_wird_unterdrueckt"; +VAL_ 279 ANB_CM_Anforderung 0 "keine_Anforderung" 1 "Anforderung_aktiv"; +VAL_ 279 ANB_Info_Teilbremsung 0 "Auspraegung_Standard" 1 "Auspraegung_Erweitert"; +VAL_ 279 ANB_Notfallblinken 0 "kein_ANB_Notfallblinken" 1 "Notfallblinken_ANB_angefordert"; +VAL_ 279 ANB_Teilbremsung_Freigabe 0 "Teilbremsung_nicht_freigegeben" 1 "Teilbremsung_freigegeben"; +VAL_ 279 ANB_Zielbremsung_Freigabe 0 "Zielbremsung_nicht_freigegeben" 1 "Zielbremsung_freigegeben"; +VAL_ 279 AWV_Vorstufe 0 "keine_Notbremsung_erwartet" 1 "Notbremsung_in_Kuerze"; +VAL_ 279 AWV_Halten 0 "keine_Anforderung" 1 "Anforderung_das_Fzg_im_Stillstand_zu_halten"; +VAL_ 279 AWV_CityANB_Auspraegung 0 "autom_Bremsung_im_ges_vBereich" 1 "autom_Bremsung_im_def_vBereich"; +VAL_ 279 PCF_Freigabe 0 "keine_Freigabe_PreCrashFront" 1 "Freigabe_PreCrashFront"; +VAL_ 279 AWV1_ECD_Anlauf 0 "ECD_Anlauf_nicht_aktivieren" 1 "ECD_Anlauf_aktivieren"; +VAL_ 279 PCF_Time_to_collision 255 "Objektstatus=0x0__oder_berechneter_TTC_Wert_groesser_als_Maximalwert"; +VAL_ 288 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault"; +VAL_ 290 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert"; +VAL_ 290 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 290 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler"; +VAL_ 290 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 290 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren"; +VAL_ 290 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht"; +VAL_ 290 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert"; +VAL_ 290 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; +VAL_ 290 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv"; +VAL_ 294 EA_ACC_Sollstatus 0 "Init" 1 "ACC_aktivieren" 2 "ACC_deaktivieren"; +VAL_ 294 EA_Ruckprofil 0 "Init" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7"; +VAL_ 294 HCA_01_Sendestatus 0 "HCA_sendet_mit_1000ms" 1 "HCA_sendet_mit_20ms"; +VAL_ 294 HCA_01_LM_OffSign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen"; +VAL_ 294 HCA_01_Status_HCA 0 "deaktiviert" 1 "reserviert" 2 "reserviert" 3 "funktionsbereit" 4 "reserviert" 5 "HCA_Momenteneingriff_1" 6 "MA_Aktiv" 7 "HCA_Momenteneingriff_2" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "reserviert" 15 "reserviert"; +VAL_ 294 EA_Ruckfreigabe 0 "keine_Freigabe" 1 "Freigabe"; +VAL_ 294 EA_ACC_Wunschgeschwindigkeit 1023 "Init"; +VAL_ 302 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 302 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht"; +VAL_ 302 ACC_Freilauf_Anf 0 "keine Freilauf-Anforderung" 1 "Freilauf-Anforderung"; +VAL_ 302 ACC_Freilauf_Info 0 "Freilauf_freigegeben" 1 "kein_Uebergang_in_Freilauf_zulaessig" 2 "Freilauf_nicht_freigegeben" 3 "Freilauf_Anforderung"; +VAL_ 302 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe"; +VAL_ 302 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren"; +VAL_ 302 ACC_Folgebeschl 254 "Neutralwert"; +VAL_ 302 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 317 LatCon_HCA_Status 0 "disabled" 1 "initializing" 2 "ready" 3 "fault" 4 "active" 5 "preempted" 6 "fault" 7 "rejected"; +VAL_ 333 ACC_limitierte_Anfahrdyn 0 "keine_Limitierung" 1 "Limitierung_Anfahrdynamik_angefordert"; +VAL_ 333 ACC_nachtr_Stopp_Anf 0 "nicht_angefordert" 1 "angefordert"; +VAL_ 333 ACC_StartStopp_Info 0 "Motorlauf_langfristig_nicht_notwendig_Stoppfreigabe" 1 "Motoranlauf_nicht_zwingend_notwendig_Stoppverbot_keine_Startanforderung" 2 "Motoranlauf_zwingend_notwendig_Startanforderung" 3 "Systemfehler"; +VAL_ 333 ACC_Sollbeschleunigung_02 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 333 ACC_Anfahren 0 "keine_Anforderung_Anfahren" 1 "Anforderung_Anfahren"; +VAL_ 333 ACC_Anhalten 0 "kein_Anhalten_gewuenscht" 1 "Anhalten_gewuenscht"; +VAL_ 333 ACC_Typ 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 2 "ACC_mit_StopAndGo" 3 "ACC_nicht_codiert"; +VAL_ 333 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; +VAL_ 333 ACC_Minimale_Bremsung 0 "Anforderung_Minimale_Bremsung_nicht_aktiv" 1 "Anforderung_Minimale_Bremsung_aktiv"; +VAL_ 333 ACC_Anhalteweg 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 333 ACC_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe"; +VAL_ 333 Accel_Boost 3 "Driving" 0 "Stop" 2 "Driving" 1 "Driving"; +VAL_ 391 RegenBrakingMode 0 "default" 1 "B1" 2 "B2" 3 "B3"; +VAL_ 391 GearPosition 2 "P" 3 "R" 4 "N" 5 "D" 6 "D"; +VAL_ 420 EA_Parken_beibehalten_HMS 0 "Parken_nicht_beibehalten" 1 "Parken_beibehalten" 2 "Init" 3 "Fehler"; +VAL_ 420 EA_Warnruckprofil 0 "keine_Ruckanforderung" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7"; +VAL_ 420 EA_eCall_Anf 0 "Keine_Anforderung" 1 "Ausloesen_eCall"; +VAL_ 420 EA_Funktionsstatus 0 "EA_INIT" 1 "EA_OFF" 2 "EA_STANDBY" 3 "EA_PHASE0_AKTIV" 4 "EA_PHASE1_AKTIV" 5 "EA_PHASE2_AKTIV" 6 "EA_PHASE3_AKTIV" 7 "EA_REVERSIBLER_FEHLER" 8 "EA_IRREVERSIBLER_FEHLER"; +VAL_ 420 EA_Gurtstraffer_Anf 0 "Keine_Anforderung" 1 "Haptik_1" 2 "Haptik_2" 3 "Haptik_3"; +VAL_ 420 EA_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" 6 "Parken_mit_P"; +VAL_ 420 EA_Sollbeschleunigung 2046 "Neutralwert" 2047 "Fehler"; +VAL_ 496 EA_Texte 0 "keine_Anzeige" 1 "Nothalteassistent_fehlende_Fahreraktivitaet" 2 "Nothalteassistent_aktiv_Fahrzeugfuehrung_uebernehmen" 3 "Nothalteassistent_automatischer_Nothalt_wird_durchgefuehrt" 4 "Nothalteassistent_automatischer_Nothalt_durchgefuehrt" 5 "Nothalteassistent_Verbindung_zum_Notruf_wird_aufgebaut" 6 "Nothalteassistent_deaktiviert" 7 "Nothalteassistent_Eingriff_abgebrochen" 8 "Nothalteassistent_fehlende_Fahreraktivitaet_2" 9 "Sekundenschlaf_erkannt" 10 "LaneAssist_Lenkung_uebernehmen" 11 "ACA_Fahrzeugfuehrung_uebernehmen" 12 "EA_Fahr_Standstreifenwechsel" 14 "Nothalteassistent_nicht_verfuegbar_reversibel" 15 "Nothalteassistent_Stoerung_irreversibel"; +VAL_ 496 ACF_Lampe_Hands_Off 0 "keine_Anzeige" 1 "Hands_Off_erkannt"; +VAL_ 496 EA_Infotainment_Anf 0 "Init" 1 "Keine_Absenkung" 2 "Absenkung" 3 "Mute"; +VAL_ 496 EA_Tueren_Anf 0 "Keine_Anforderung" 1 "Tueren_entriegeln"; +VAL_ 496 EA_Innenraumlicht_Anf 0 "Innenraumbeleuchtung_ausschalten" 1 "Innenraumbeleuchtung_einschalten"; +VAL_ 496 zFAS_Warnblinken 0 "Aus" 1 "Statisch" 2 "Taster" 3 "Statisch_ohne_WBT"; +VAL_ 496 STP_Primaeranz 0 "keine_Anzeige" 1 "Verfuegbar" 2 "Aktiv" 3 "Uebernahme" 4 "Aktiv_Warnung" 5 "Nicht_Verfuegbar"; +VAL_ 496 EA_Bremslichtblinken 0 "kein_Blinken" 1 "Anforderung_Bremslichtblinken"; +VAL_ 496 EA_Blinken 0 "Kein_Blinken" 1 "Wechselblinken_links" 2 "Wechselblinken_rechts" 3 "Warnblinken" 4 "Warnblinken_Taster"; +VAL_ 591 Distance_Status 0 "Valid" 3 "Invalid"; +VAL_ 619 Travel_Assist_Status 4 "enabled" 0 "disabled" 2 "ready" 3 "pre_ready"; +VAL_ 619 Travel_Assist_Request 4 "enable" 3 "disable" 0 "no_request" 1 "error"; +VAL_ 619 Travel_Assist_Available 0 "not_available" 1 "available"; +VAL_ 679 ACC_Regelgeschw 1023 "keine_Anzeige"; +VAL_ 679 ACC_Einheit_maxSetzgeschw 0 "kmh" 1 "mph"; +VAL_ 679 ACC_maxSetzgeschw 511 "Init_Neutralwert"; +VAL_ 679 ACC_minRegelgeschw 255 "keine_Anzeige"; +VAL_ 679 ACC_maxRegelgeschw 255 "keine_Anzeige"; +VAL_ 679 ACC_Tempolimitassistent 0 "keine_Anzeige" 1 "Tempolimitassistent_aktiv" 2 "Tempolimitassistent_nicht_verfuegbar" 3 "Tempolimitassistent_Fahreruebernahme"; +VAL_ 679 ACC_Kurvenassistent 0 "keine_Anzeige" 1 "Kreuzung" 2 "Rechtskurve" 3 "Linkskurve" 4 "Kreisverkehr"; +VAL_ 679 ACC_RUV 0 "keine_Anzeige" 1 "RUV_aktiv_Rechtsverkehr" 2 "RUV_aktiv_Linksverkehr"; +VAL_ 679 ACC_Tachokranz 0 "Tachokranz_nicht_beleuchtet" 1 "Tachokranz_beleuchtet"; +VAL_ 679 ACC_Typ_Tachokranz_unten 0 "LEDs_an" 1 "LEDs_aus"; +VAL_ 679 ACC_ENG_Texte 0 "keine_Anzeige" 1 "keine_Laenderverfuegbarkeit" 2 "nicht_verfuegbar" 3 "Geschwindigkeitsgrenze"; +VAL_ 681 AWV_Warnung 0 "keine_Anzeige" 1 "latente_Vorwarnung" 2 "Vorwarnung" 3 "Akutwarnung" 4 "Eingriff" 5 "Fahreruebernahmeaufforderung" 6 "Abbiegewarnung"; +VAL_ 681 AWV_Texte 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "Demomodus" 4 "System_aus" 5 "nicht_definiert" 6 "ESC_aus" 7 "zurzeit_eingeschraenkt"; +VAL_ 681 AWV_Status_Anzeige 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar"; +VAL_ 681 AWV_Einstellung_System_FSG 0 "deaktiviert" 1 "aktiviert"; +VAL_ 681 AWV_Einstellung_Warnung_FSG 0 "Aus" 1 "Setting_2" 2 "Setting_3" 3 "Setting_4" 4 "Setting_5" 5 "Ein"; +VAL_ 681 AWV_Warnlevel 0 "keine_Gefaehrdung" 63 "max_Gefaehrdung"; +VAL_ 768 ACC_Tempolimit 0 "keine_Anzeige" 1 "5_zulHoechstgeschw" 2 "7_zulHoechstgeschw" 3 "10_zulHoechstgeschw" 4 "15_zulHoechstgeschw" 5 "20_zulHoechstgeschw" 6 "25_zulHoechstgeschw" 7 "30_zulHoechstgeschw" 8 "35_zulHoechstgeschw" 9 "40_zulHoechstgeschw" 10 "45_zulHoechstgeschw" 11 "50_zulHoechstgeschw" 12 "55_zulHoechstgeschw" 13 "60_zulHoechstgeschw" 14 "65_zulHoechstgeschw" 15 "70_zulHoechstgeschw" 16 "75_zulHoechstgeschw" 17 "80_zulHoechstgeschw" 18 "85_zulHoechstgeschw" 19 "90_zulHoechstgeschw" 20 "95_zulHoechstgeschw" 21 "100_zulHoechstgeschw" 22 "110_zulHoechstgeschw" 23 "120_zulHoechstgeschw" 24 "130_zulHoechstgeschw" 25 "140_zulHoechstgeschw" 26 "150_zulHoechstgeschw" 27 "160_zulHoechstgeschw" 28 "200_zulHoechstgeschw" 30 "250_zulHoechstgeschw" 31 "Ende_zulHoechstgeschw"; +VAL_ 768 ACC_Wunschgeschw_Farbe 0 "Grundfarbe" 1 "Farbe_1"; +VAL_ 768 ACC_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert" 1 "Warnung"; +VAL_ 768 ACA_Querfuehrung 0 "keine_Anzeige_oder_init" 1 "passiv" 2 "aktiv" 3 "Warnung"; +VAL_ 768 ACC_Regelung_AIO 0 "Regelung_Ampel_nicht_aktiv" 1 "Regelung_Ampel_aktiv"; +VAL_ 768 ACC_Wunschgeschw_02 1023 "keine_Anzeige"; +VAL_ 768 ACC_Abstandsindex_02 0 "Audi (Init), VW (passiv/aktiv_Freifahrt)" 1022 "aus_passiv" 1023 "aktiv_Freifahrt"; +VAL_ 768 ACC_Display_Prio 0 "hoechste_Prio" 1 "mittlere_Prio" 2 "geringe_Prio" 3 "keine_Prio"; +VAL_ 768 ACC_rel_Objekt_Zusatzanz 0 "keine Anzeige" 1 "Relevantes_Objekt_erkannt" 2 "Relevantes_Objekt_Abstandswarnung"; +VAL_ 768 ACC_Gesetzte_Zeitluecke 0 "keine_Anzeige" 1 "Zeitluecke_1" 2 "Zeitluecke_2" 3 "Zeitluecke_3" 4 "Zeitluecke_4" 5 "Zeitluecke_5" 6 "nicht_definiert" 7 "nicht_definiert"; +VAL_ 768 ACC_Optischer_Fahrerhinweis 0 "optischer_Fahrerhinweis_AUS" 1 "optischer_Fahrerhinweis_EIN"; +VAL_ 768 ACC_Warnhinweis 0 "kein_Warnhinweis" 1 "Warnhinweis"; +VAL_ 768 ACC_EGO_Fahrzeug 0 "keine_Anzeige" 1 "aktiv" 2 "Warnung" 3 "aktiv_stop" 4 "passiv"; +VAL_ 768 ACC_Relevantes_Objekt_02 0 "keine_Anzeige" 1 "Relevantes_Objekt_erkannt" 2 "Relevantes_Objekt_Warnung" 3 "passiv"; +VAL_ 768 ACC_Wunschgeschw_erreicht 0 "Wunschgeschwindigkeit_nicht_erreicht" 1 "Wunschgeschwindigkeit_erreicht"; +VAL_ 768 ACC_Anzeige_Zeitluecke 0 "Anzeige_Zeitluecke_nicht_angefordert" 1 "Anzeige_Zeitluecke_angefordert"; +VAL_ 768 ACC_Texte_Primaeranz_02 0 "keine Anzeige" 1 "VDA_ACC_Symbol_YYY_kmh_mph" 2 "Kurven_Symbol_YYY_kmh_mph" 3 "Tempolimit_Symbol_YYY_kmh_mph" 4 "ACC_anfahrbereit" 5 "eingestellte_Zeitluecke" 6 "Tuer offen !" 7 "Stehendes Objekt voraus" 8 "o o o" 9 "ACC aus" 10 "ACC startet" 11 "ACC Sensor Sicht !" 12 "ACC nicht verfuegbar" 13 "ACC Fehler" 14 "ESP Eingriff" 15 "ESP PASSIV !" 16 "Parkbremse !" 17 "Geschwindigkeitsgrenze" 18 "Waehlhebelposition !" 19 "Fahrer Gurtschloss offen !" 20 "Schalthebelposition !" 21 "Drehzahl !" 22 "HDC aktiv" 23 "Kupplung betaetigt" 24 "Gang einlegen !" 25 "Bremse ueberhitzt !" 26 "Steigung_Gefaelle_zu_gross" 27 "ABSTAND" 28 "Rechtsueberholen_verhindert" 29 "Linksueberholen_verhindert" 30 "Kreuzungs_Symbol" 31 "Kreisverkehr_Symbol" 32 "Gefaelle_Symbol" 33 "Tempolimit_Kurvenassistent_ein" 34 "Kurvenassistent_ein" 35 "Tempolimitassistent_ein" 36 "Achtung_Geschwindigkeitsueberschreitung" 37 "Tempolimit_und_Kurvenassistent_nicht_verfuegbar" 38 "Tempolimit_nicht_verfuegbar" 39 "Kurvenassistent_nicht_verfuegbar" 40 "Autobahnausfahrt_Symbol" 41 "Stauende_Symbol" 42 "Engstelle_Symbol" 43 "STP_verfuegbar" 44 "Ampel_vertikal" 45 "Ampel_horizontal" 46 "STA_verfuegbar"; +VAL_ 768 ACC_Texte_Zusatzanz_02 0 "keine_Anzeige" 1 "ACC_AUS" 2 "Standby" 3 "UEBERTRETEN" 4 "ABSTAND" 5 "DISTANZ_1" 6 "DISTANZ_2" 7 "DISTANZ_3" 8 "DISTANZ_4" 9 "DISTANZ_5" 10 "DISTANZ_1__dyn" 11 "DISTANZ_2__dyn" 12 "DISTANZ_3__dyn" 13 "DISTANZ_4__dyn" 14 "DISTANZ_5__dyn" 15 "DISTANZ_1__comf" 16 "DISTANZ_2__comf" 17 "DISTANZ_3__comf" 18 "DISTANZ_4__comf" 19 "DISTANZ_5__comf" 20 "DISTANZ_1__efficiency" 21 "DISTANZ_2__efficiency" 22 "DISTANZ_3__efficiency" 23 "DISTANZ_4__efficiency" 24 "DISTANZ_5__efficiency" 25 "DISTANZ_1__Stau" 26 "DISTANZ_2__Stau" 27 "DISTANZ_3__Stau" 28 "DISTANZ_4__Stau" 29 "DISTANZ_5__Stau" 30 "ACHTUNG" 31 "Abstandsanzeige" 32 "Abstandsanzeige_Warnung_aktiviert" 33 "STA_verfuegbar" 34 "Engstelle" 35 "RUV_aktiv_Rechtsverkehr" 36 "RUV_aktiv_Linksverkehr" 37 "STP_Verfuegbar" 38 "AW_Warnschwelle_1" 39 "AW_Warnschwelle_2" 40 "AW_Warnschwelle_3" 41 "AW_Warnung_1" 42 "AW_Warnung_2" 43 "AW_Warnung_3"; +VAL_ 768 STA_Primaeranz 0 "keine_Anzeige" 1 "STA_standby" 2 "STA_aktiv" 3 "STA_Warnung"; +VAL_ 768 ACC_Event_Wunschgeschw 1023 "None"; +VAL_ 768 Heartbeat 1 "ACC_Init_Low" 420 "ACC_Init_High" 221 "ACC_Available_Low" 360 "ACC_Available_High"; +VAL_ 768 ACC_Status_ACC 0 "ACC_OFF_Hauptschalter_aus" 1 "ACC_INIT" 2 "ACC_STANDBY" 3 "ACC_AKTIV_regelt" 4 "ACC_OVERRIDE" 5 "ACC_Abschaltreaktion" 6 "reversibler_Fehler_im_ACC_System" 7 "irreversibler_Fehler_im_ACC_System"; +VAL_ 768 Lead_Type_Detected 1 "Lead_Detected" 0 "No_Lead_Detected"; +VAL_ 768 Lead_Type 5 "Bicycle" 3 "Car" 0 "None" 2 "Truck" 4 "Motorcycle"; +VAL_ 768 ACC_Events 3 "Starting_Available" 0 "None" 5 "Speed_Limit_Detected" 9 "Crossing" 4 "Speed_Limit_Ahead" 10 "Roundabout" 6 "Curve"; +VAL_ 768 Zeitluecke_1 0 "keine Anzeige"; +VAL_ 768 Zeitluecke_2 0 "keine Anzeige" 32 "Minimum"; +VAL_ 768 Zeitluecke_3 0 "keine Anzeige"; +VAL_ 768 Zeitluecke_4 0 "keine Anzeige" 40 "Minimum"; +VAL_ 768 Zeitluecke_5 0 "keine Anzeige"; +VAL_ 780 ACC_Wunschgeschw_02 1023 "keine_Anzeige"; +VAL_ 780 ACC_Status_Prim_Anz 0 "Symbol nicht beleuchtet" 1 "Farbe 1 (typisch 'gruen')" 2 "Farbe 2 (typisch 'rot')" 3 "Farbe 3 (typisch 'gelb')"; +VAL_ 780 ACC_Abstandsindex 0 "Sonderanzeige_graue_Fahrbahn" 1022 "Sonderanzeige_graue_Fahrbahn" 1023 "Sonderanzeige_Fahrbahn_mit_gruenem_roten_Bereich"; +VAL_ 780 ACC_Akustik_02 0 "keine_Akustik" 1 "hochpriore_Akustik" 2 "niederpriore_Akustik" 3 "hochpriore_Dauerakustik"; +VAL_ 780 ACC_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert" 1 "Warnung"; +VAL_ 780 ACC_Gesetzte_Zeitluecke 0 "keine_Anzeige" 1 "Zeitluecke_1" 2 "Zeitluecke_2" 3 "Zeitluecke_3" 4 "Zeitluecke_4" 5 "Zeitluecke_5" 6 "nicht_definiert" 7 "nicht_definiert"; +VAL_ 780 ACC_Optischer_Fahrerhinweis 0 "optischer_Fahrerhinweis_AUS" 1 "optischer_Fahrerhinweis_EIN"; +VAL_ 780 ACC_Typ_Tachokranz 0 "Tachokranz_lang" 1 "Tachokranz_kurz"; +VAL_ 780 ACC_Anzeige_Zeitluecke 0 "Anzeige_Zeitluecke_nicht_angefordert" 1 "Anzeige_Zeitluecke_angefordert"; +VAL_ 780 ACC_Tachokranz 0 "Tachokranz_nicht_beleuchtet" 1 "Tachokranz_beleuchtet"; +VAL_ 780 ACC_Display_Prio 0 "hoechste_Prio" 1 "mittlere_Prio" 2 "geringe_Prio" 3 "keine_Prio"; +VAL_ 780 ACC_Relevantes_Objekt 0 "Symbol_nicht_beleuchtet" 1 "Farbe_1_typisch_gruen" 2 "Farbe_2_typisch_rot" 3 "Farbe_3_typisch_gelb"; +VAL_ 780 ACC_Texte_Primaeranz 0 "keine Anzeige" 1 "ACC nicht verfuegbar !" 2 "Auto_Auto_ _ _" 3 "Auto_ _Auto_ _" 4 "Auto_ _ _Auto_" 5 "Auto_ _ _ _Auto" 6 "Auto_Auto_ _ _ Gong (durchgestrichen)" 7 "Auto_ _Auto_ _ Gong (durchgestrichen)" 8 "Auto_ _ _Auto_ Gong (durchgestrichen)" 9 "Auto_ _ _ _Auto Gong (durchgestrichen)" 10 "ACC bereit" 11 "keine Abstandsregelung" 12 "ACC Sensor Sicht !" 13 "ACC nicht verfuegbar" 14 "o o o" 15 "Hochschalten" 16 "ESP Eingriff" 17 "Herunterschalten" 18 "Parkbremse !" 19 "Geschwindigkeitsgrenze" 20 "Waehlhebelposition !" 21 "VDA ACC-Symbol YYY km/h / mph" 22 "Tempolimit XXX km/h / mph" 23 "Kurve XXX km/h / mph" 24 "ACC Abschaltung" 25 "Symbol 'Eieruhr'" 26 "!" 27 "--- km/h / mph" 28 "XXX km/h / mph (Schriftart 2)" 29 "Lenkradwinkel" 30 "Anfahren bestaetigen" 31 "Fahrzeug verloren" 32 "Im Stand nicht moeglich" 33 "Ungueltiger Anfahrbefehl" 34 "Tuer offen !" 35 "Fahrer Gurtschloss offen !" 36 "Schalthebelposition !" 37 "Drehzahl !" 38 "Kurvenassistent aus" 39 "Tempolimit aus" 40 "Abbiegeassistent" 41 "Ortsanfang XXX km/h / mph" 42 "Ortsende XXX km/h / mph" 43 "Tempolimit Ende XXX km/h / mph" 44 "HDC aktiv" 45 "braking guard Bremsruck" 46 "braking guard aus" 47 "braking guard aus" 48 "Uebernehmen !" 49 "Steigung zu gross" 50 "Stehendes Objekt voraus" 51 "SET / 'GRA Symbol'___xxx km/h / mph" 52 "SET / 'GRA Symbol' xxx km/h / mph" 53 "ACC aus" 54 "ACC startet" 55 "ACC reinigen" 56 "ACC Fehler" 57 "ACC haelt an !" 58 "Bremse betaetigen !" 59 "Kupplung betaetigt" 60 "LIM AUS" 61 "LIM AKTIV" 62 "LIM PASSIV" 63 "LIM FEHLER" 64 "Bremse ueberhitzt !" 65 "Bremse haelt !" 66 "ESP PASSIV !" 67 "ACC_anfahrbereit" 68 "Gang_einlegen" 69 "Rechtsueberholen_verhindert" 70 "Linksueberholen_verhindert" 71 "Achtung_Geschwindigkeitsueberschreitung" 72 "Tempolimit_und_Kurvenassistent_nicht_verfuegbar"; +VAL_ 780 ACC_Wunschgeschw_erreicht 0 "Wunschgeschwindigkeit_nicht_erreicht" 1 "Wunschgeschwindigkeit_erreicht"; +VAL_ 780 ACC_Typ_Tachokranz_unten 0 "LEDs_an" 1 "LEDs_aus"; +VAL_ 780 ACC_Status_Anzeige 0 "ACC_GRA_Hauptschalter_aus" 1 "ACC_in_Init_nicht_bei_GRA" 2 "ACC_GRA_passiv" 3 "ACC_GRA_aktiv" 4 "ACC_GRA_im_Hintergrund_uebertreten" 5 "ACC_GRA_Abschaltreaktion" 6 "ACC_reversibel_aus_nicht_bei_GRA" 7 "ACC_GRA_irreversibel_aus"; +VAL_ 804 ACC_Texte_Sekundaeranz 0 "keine_Anzeige" 1 "Zielfahrzeug_erkannt" 2 "Rechtskurve_voraus" 3 "Linkskurve_voraus" 4 "Tempolimit_voraus" 5 "Sensorsicht" 6 "Anfahrbereit" 7 "Tempolimit_erkannt" 8 "Kreuzung_voraus" 9 "Kreisverkehr_voraus"; +VAL_ 804 ACC_Texte_Zusatzanz 0 "keine_Anzeige" 1 "ACC_AUS" 2 "ACC_BEREIT" 3 "UEBERTRETEN" 4 "ABSTAND" 5 "DISTANZ_1" 6 "DISTANZ_2" 7 "DISTANZ_3" 8 "DISTANZ_4" 9 "DISTANZ_1__dyn" 10 "DISTANZ_2__dyn" 11 "DISTANZ_3__dyn" 12 "DISTANZ_4__dyn" 13 "DISTANZ_1__stand" 14 "DISTANZ_2__stand" 15 "DISTANZ_3__stand" 16 "DISTANZ_4__stand" 17 "DISTANZ_1__comf" 18 "DISTANZ_2__comf" 19 "DISTANZ_3__comf" 20 "DISTANZ_4__comf" 21 "DISTANZ_1__efficiency" 22 "DISTANZ_2__efficiency" 23 "DISTANZ_3__efficiency" 24 "DISTANZ_4__efficiency" 25 "DISTANZ_5" 26 "DISTANZ_5__dyn" 27 "DISTANZ_5__stand" 28 "DISTANZ_5__comf" 29 "DISTANZ_5__efficiency" 30 "ACHTUNG" 31 "Abstandsanzeige" 32 "Abstandsanz_Warnung_aktiviert"; +VAL_ 804 ACC_Status_Zusatzanz 0 "keine Anzeige" 1 "Bild 1 (Fzg. Silhouette, typ. farblos)" 2 "Bild 2 (Fzg. Farbe 1, typ. grau)" 3 "Bild 3 (Fzg. Farbe 2, typ. rot)" 4 "Bild 4 (Symbol 1 ACCplus, typ. Doppelfzg. gelb)" 5 "Bild 5 (Symbol 2 ACCplus, typ. Doppelfzg. grau)" 6 "Bild 6 (Fzg. Farbe 2, typ. rot) mit Priorität im Kombi (Pop-up)"; +VAL_ 804 ACC_Texte 0 "keine_Anzeige" 1 "ACC_nicht_verfuegbar" 2 "ACC_und_AWV_nicht_verfuegbar" 3 "ACC_keine_Sensorsicht" 4 "ACC_und_AWV_keine_Sensorsicht" 5 "ACC_Steigung_zu_gross" 6 "ACC_nur_in_Fahrstufe_verfuegbar" 7 "ACC_Parkbremse_betaetigt" 8 "ACC_ESP_Eingriff" 9 "ACC_Bitte_uebernehmen" 10 "ACC_HDC_betaetigt" 11 "ACC_Geschwindigkeitsgrenze" 12 "ACC_Schalthebelposition" 13 "ACC_Drehzahl" 14 "ACC_Kupplung_betaetigt" 15 "ACC_Aktivierverhinderung" 16 "ACC_Abschaltung" 17 "ACC_Parkassistent_aktiv" 18 "ACC_ESC_aus" 19 "ACC_Charisma_Modus_inkompatibel" 20 "ACC_Stehendes_Objekt_voraus" 21 "ACA_Fahreruebernahme" 22 "ACA_Querfuehrung_nicht_verfuegbar"; +VAL_ 804 ACC_Texte_braking_guard 0 "keine_Anzeige" 1 "AWV_aus" 2 "AWV_Warnung" 3 "AWV_Demomodus" 4 "AWV_Systemstoerung" 5 "AWV_Eingriff" 6 "AWV_Vorwarnung_aus" 7 "AWV_keine_Sensorsicht"; +VAL_ 804 ACC_Warnhinweis 0 "kein_Warnhinweis" 1 "Warnhinweis"; +VAL_ 804 ACC_Zeitluecke_Abstandswarner 61 "Freifahrt" 62 "nicht_definiert" 63 "keine_Anzeige"; +VAL_ 804 ACC_Abstand_Abstandswarner 509 "Freifahrt" 510 "nicht_definiert" 511 "keine_Anzeige"; +VAL_ 804 ACC_Tempolimit 0 "keine_Anzeige" 1 "5_zulHoechstgeschw" 2 "7_zulHoechstgeschw" 3 "10_zulHoechstgeschw" 4 "15_zulHoechstgeschw" 5 "20_zulHoechstgeschw" 6 "25_zulHoechstgeschw" 7 "30_zulHoechstgeschw" 8 "35_zulHoechstgeschw" 9 "40_zulHoechstgeschw" 10 "45_zulHoechstgeschw" 11 "50_zulHoechstgeschw" 12 "55_zulHoechstgeschw" 13 "60_zulHoechstgeschw" 14 "65_zulHoechstgeschw" 15 "70_zulHoechstgeschw" 16 "75_zulHoechstgeschw" 17 "80_zulHoechstgeschw" 18 "85_zulHoechstgeschw" 19 "90_zulHoechstgeschw" 20 "95_zulHoechstgeschw" 21 "100_zulHoechstgeschw" 22 "110_zulHoechstgeschw" 23 "120_zulHoechstgeschw" 24 "130_zulHoechstgeschw" 25 "140_zulHoechstgeschw" 26 "150_zulHoechstgeschw" 27 "160_zulHoechstgeschw" 28 "200_zulHoechstgeschw" 30 "250_zulHoechstgeschw" 31 "Ende_zulHoechstgeschw"; +VAL_ 804 ACC_Charisma_FahrPr 0 "keine_Funktion" 1 "Programm_1" 2 "Programm_2" 3 "Programm_3" 4 "Programm_4" 5 "Programm_5" 6 "Programm_6" 7 "Programm_7" 8 "Programm_8" 9 "Programm_9" 10 "Programm_10" 11 "Programm_11" 12 "Programm_12" 13 "Programm_13" 14 "Programm_14" 15 "Programm_15"; +VAL_ 804 ACC_Charisma_Status 0 "Init" 1 "verfuegbar" 2 "nicht_verfuegbar" 3 "asynchron_durch_Fahrerwunsch"; +VAL_ 804 ACC_Texte_Abstandswarner 0 "keine_Anzeige" 1 "Systemstoerung" 2 "keine_Sensorsicht" 3 "zurzeit_eingeschraenkt"; +VAL_ 870 BM_links 0 "inaktiv" 1 "aktiv"; +VAL_ 870 BM_rechts 0 "inaktiv" 1 "aktiv"; +VAL_ 958 MO_Fahrer_bremst 0 "kein_Bremsen" 1 "Bremse_betaetigt"; +VAL_ 980 BH_Blinker_li 0 "nicht_betaetigt" 1 "Blinkerhebel_Pos_li_betaetigt"; +VAL_ 980 BH_Blinker_re 0 "nicht_betaetigt" 1 "Blinkerhebel_Pos_re_betaetigt"; +VAL_ 980 BH_Lichthupe 0 "nicht_betaetigt" 1 "Blinkerhebel in Richtung Lichthupe betaetigt"; +VAL_ 980 BH_Fernlicht 0 "nicht_betaetigt" 1 "Blinkerhebel_in_Richtung_Fernlicht_betaetigt"; +VAL_ 980 WH_Tipwischen 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 980 WH_Intervall 0 "aus" 1 "Wischerhebel in Stellung Intervall"; +VAL_ 980 WH_WischerStufe1 0 "aus" 1 "Wischerhebel in Stufe Wischen 1"; +VAL_ 980 WH_WischerStufe2 0 "aus" 1 "Wischerhebel in Stufe Wischen 2"; +VAL_ 980 WH_Frontwaschen 0 "aus" 1 "Wischerhebel in Stellung Wisch Wasch vorne"; +VAL_ 980 WH_Heckintervall 0 "nicht_betaetigt" 1 "Wischerhebel in Stellung Heckintervall"; +VAL_ 980 WH_Heckwaschen 0 "nicht_betaetigt" 1 "Wischerhebel in Stellung Wisch Wasch hinten"; +VAL_ 980 WH_Intervallstufen 0 "Init / Default" 1 "Intervallstufe 1" 5 "Intervallstufe 2" 9 "Intervallstufe 3" 13 "Intervallstufe 4" 15 "Fehler"; +VAL_ 980 FAS_Taster 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 980 FAS_Taster_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 SMLS_Hupe 0 "nicht_betaetigt" 1 "Hupe_gedrueckt"; +VAL_ 980 LRH_On_Off 0 "LRH_aus__keine Anzeige" 1 "LRH_aus" 2 "LRH_ein" 3 "Fehler"; +VAL_ 980 LRH_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 980 SMLS_P_verriegelt_plausibel 0 "unplausibel" 1 "plausibel"; +VAL_ 980 WH_SRA 0 "SRA_Aus" 1 "SRA_Ein"; +VAL_ 980 WH_Wischer_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 BH_Blinker_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 980 SMLS_PTT 0 "nicht_betaetigt" 1 "PTT_gedrueckt"; +VAL_ 980 WH_Tipwischen_lang 0 "nicht_betaetigt" 1 "betaetigt"; +VAL_ 988 GE_Fahrstufe 0 "Zwischenstellung" 1 "Init" 5 "P" 6 "R" 7 "N" 8 "D" 9 "D" 10 "E" 13 "T" 14 "T" 15 "Fehler"; +VAL_ 988 EPB_Status 0 "offen" 1 "geschlossen_Parken" 2 "teilgespannt_Halten" 3 "im_Lauf_oeffnen" 4 "im_Lauf_schliessen" 5 "tbd" 6 "Init" 7 "unbekannt"; +VAL_ 1122 PSD_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "Fehlerwert"; +VAL_ 1122 PSD_Vorgaenger_Segment_ID 0 "keine Segmentinformation vorhanden" 1 "Fehlerwert"; +VAL_ 1122 PSD_Strassenkategorie 0 "Rest_Feldweg_Schotterweg_Privatweg" 1 "OrtsstraßĨ" 2 "KreisstraßĨ" 3 "LandstraßĨ" 4 "BundesstraßĨ" 5 "Autobahn" 7 "Init"; +VAL_ 1122 PSD_Endkruemmung 255 "Gerade"; +VAL_ 1122 PSD_Endkruemmung_Vorz 0 "Kruemmung_positiv" 1 "Kruemmung_negativ"; +VAL_ 1122 PSD_Idenditaets_ID 0 "keine_Segment_Informationen_vorhanden" 1 "Fehler"; +VAL_ 1122 PSD_ADAS_Qualitaet 0 "keine_ADAS_Qualitaet" 1 "ADAS_Qualitaet"; +VAL_ 1122 PSD_wahrscheinlichster_Pfad 0 "Pfad_mit_geringer_Wahrscheinlichkeit" 1 "wahrscheinlichster_Pfad"; +VAL_ 1122 PSD_Geradester_Pfad 0 "nicht_geradester_PFad" 1 "geradester_Pfad"; +VAL_ 1122 PSD_Fahrspuren_Anzahl 0 "Einbahnstrasse_in_falsche_Richtung" 1 "eine_Fahrspur" 2 "zwei_Fahrspuren" 3 "drei_Fahrspuren" 4 "vier_Fahrspuren" 5 "fuenf_Fahrspuren" 6 "sechs_Fahrspuren" 7 "mehr_als_sechs_Fahrspuren"; +VAL_ 1122 PSD_Bebauung 0 "ausserhalb_bebauten_Gebietes" 1 "innerhalb_bebauten_Gebietes"; +VAL_ 1122 PSD_Segment_Komplett 0 "Segment_Attribute_nicht_komplett" 1 "Segment_Attribute_komplett"; +VAL_ 1122 PSD_Rampe 0 "Strasse_mit_Gegenverkehr" 1 "Auffahrt_Einbahnstr" 2 "Abfahrt_Einbahnstr" 3 "Einbahnstrasse"; +VAL_ 1122 PSD_Anfangskruemmung 255 "Gerade"; +VAL_ 1122 PSD_Anfangskruemmung_Vorz 0 "positiv" 1 "negativ"; +VAL_ 1122 PSD_Abzweigerichtung 0 "rects_abzweigende_Strasse" 1 "links_abzweigende_Strasse"; +VAL_ 1123 PSD_Pos_Segment_ID 0 "keine Position gegeben" 1 "Fehlerwert"; +VAL_ 1123 PSD_Pos_Standort_Eindeutig 0 "mehrdeutiger_Standort" 1 "eindeutiger_Standort"; +VAL_ 1123 PSD_Pos_Fehler_Laengsrichtung 0 "Init" 1 "< 2m" 2 "< 5m" 3 "< 10m" 4 "< 20m" 5 "< 50m" 6 "> 50m" 7 "Off-Road"; +VAL_ 1123 PSD_Pos_Fahrspur 0 "unbekannt" 1 "Erste_Spur_von_rechts" 2 "Zweite_Spur_von_rechts" 3 "Dritte_Spur_von_rechts" 4 "Vierte_Spur_von_rechts" 5 "Fuenfte_Spur_von_rechts" 6 "Sechte_Spur_von_rechts" 7 "Siebte_oder_weitere_Spur_von_rechts"; +VAL_ 1123 PSD_Attribut_Segment_ID_05 0 "keine_Segment_Information" 1 "Fehler"; +VAL_ 1123 PSD_Attribut_1_ID 0 "keine_Information"; +VAL_ 1123 PSD_Attribut_2_ID 0 "keine_Information"; +VAL_ 1123 PSD_Attribute_Komplett_05 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_06_Mux 0 "Init"; +VAL_ 1124 PSD_Sys_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig"; +VAL_ 1124 PSD_Sys_Geschwindigkeit_Einheit 0 "km/h" 1 "mph"; +VAL_ 1124 PSD_Sys_Verkehrsrichtung 0 "Rechtsverkehr" 1 "Linksverkehr"; +VAL_ 1124 PSD_Sys_Geometrieguete 0 "Geringe_Guete" 1 "tbd" 2 "tbd" 3 "Hohe_Guete"; +VAL_ 1124 PSD_Sys_Mapmatchingguete 0 "geringe_Guete" 1 "res" 2 "res" 3 "hohe_Guete"; +VAL_ 1124 PSD_Sys_Alter_Karte 0 "kleiner_1_Jahr" 1 "1_Jahr" 2 "2_Jahre" 3 "3_Jahre" 4 "4_Jahre" 5 "5_Jahre" 6 "6_Jahre" 7 "groesser_7_Jahre"; +VAL_ 1124 PSD_Sys_Zielfuehrung 0 "Zielfuehrung nicht aktiv" 1 "Zielfuehrung aktiv"; +VAL_ 1124 PSD_Sys_US_State 0 "kein_US_State" 1 "Alabama" 2 "Alaska" 3 "Arkansas" 4 "Arizona" 5 "California" 6 "Colorado" 7 "Conneticut" 8 "District_of_Columbia" 9 "Delaware" 10 "Florida" 11 "Georgia" 12 "Hawaii" 13 "Idaho" 14 "Illinois" 15 "Iowa" 16 "Indiana" 17 "Kansas" 18 "Kentucky" 19 "Louisiana" 20 "Massachusetts" 21 "Maryland" 22 "Maine" 23 "Michigan" 24 "Minnesota" 25 "Missouri" 26 "Mississippi" 27 "Montana" 28 "North_Carolina" 29 "North_Dakota" 30 "Nebraska" 31 "Nevada" 32 "New_Hampshire" 33 "New_Jersey" 34 "New_Mexico" 35 "New_York" 36 "Ohio" 37 "Oklahoma" 38 "Oregon" 39 "Pennsylvania" 40 "Puerto_Rico" 41 "Rhode_Island" 42 "South_Carolina" 43 "South_Dakota" 44 "Tennessee" 45 "Texas" 46 "Utah" 47 "Virginia" 48 "Virgin_Islands" 49 "Vermont" 50 "Washington" 51 "Wisconsin" 52 "West_Virginia" 53 "Wyoming"; +VAL_ 1124 PSD_Sys_Quali_verfuegbar 0 "Qualitaetskriterien_nicht_verfuegbar" 1 "Qualitaetskriterien_verfuegbar"; +VAL_ 1124 PSD_Sys_Zielfuehrung_geaendert 0 "Zielfuehrung_nicht_geaendert" 1 "Zielfuehrung_geaendert"; +VAL_ 1124 PSD_Sys_Geometrieguete_erweitert 0 "Init"; +VAL_ 1124 PSD_Attribut_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Attribut_3_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribut_4_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribut_5_ID 0 "keine_Information"; +VAL_ 1124 PSD_Attribute_Komplett_06 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_Ges_Segment_ID 0 "keine Segmentinformationen vorhanden" 1 "nicht zulaessig"; +VAL_ 1124 PSD_Ges_Geschwindigkeit 0 "Kein Geschwindigkeitsgebot" 1 "0 km/h < v_max < 5 km/h" 2 "5 km/h < v_max < 10km/h" 3 "10 km/h < v_max < 15 km/h" 4 "15 km/h < v_max < 20 km/h" 5 "20 km/h < v_max < 25 km/h" 6 "25 km/h < v_max < 30 km/h" 7 "30 km/h < v_max < 35 km/h" 8 "35 km/h < v_max < 40 km/h" 9 "40 km/h < v_max < 45 km/h" 10 "45 km/h < v_max < 50 km/h" 11 "50 km/h < v_max < 60 km/h" 12 "60 km/h < v_max < 70 km/h" 13 "70 km/h < v_max < 80 km/h" 14 "80 km/h < v_max < 90 km/h" 15 "90 km/h < v_max < 100 km/h" 16 "100 km/h < v_max < 110 km/h" 17 "110 km/h < v_max < 120 km/h" 18 "120 km/h < v_max < 130 km/h" 19 "130 km/h < v_max < 140 km/h" 20 "140 km/h < v_max < 150 km/h" 21 "150 km/h < v_max < 160 km/h" 22 "160 km/h < v_max" 23 "Geschwindigkeitsgebot aufgehoben" 24 "..0x1F ungÃŧltig"; +VAL_ 1124 PSD_Ges_Typ 0 "Geschw_Klasse_des_Kartendatensuppliers" 1 "Explizit_abgeleiteten_Begrenzung" 2 "Durch_Gesetzg_vorgeg_allgem_Gebot_fuer_uebertr_Rahmenbed" 3 "Init"; +VAL_ 1124 PSD_Ges_Spur_Geschw_Begrenzung 0 "Gebot_fuer_alle_spuren_gueltig"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Gespann 0 "alle Fahrzeuge" 1 "PKW mit Gespann" 2 "LKW, Busse, etc."; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Witter 0 "Witterungsunabh䎧ig" 1 "Näŗŗe, Regen, Niederschlag" 2 "Glä´´e" 3 "Nebel"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Tag_Anf 0 "kein Beginn definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Tag_Ende 0 "kein Ende definiert" 1 "Montag" 2 "Dienstag" 3 "Mittwoch" 4 "Donnerstag" 5 "Freitag" 6 "Samstag" 7 "Sonntag"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Std_Anf 25 "kein Beginn fÃŧr stundenweise EinschräŽĢungen"; +VAL_ 1124 PSD_Ges_Geschwindigkeit_Std_Ende 25 "kein Ende fÃŧr stundenweise EinschräŽĢungen"; +VAL_ 1124 PSD_Ges_Ueberholverbot 0 "kein Üĸerholverbot" 1 "alle Fahrzeuge" 2 "Üĸerholverbot fÃŧr PKW mit Gespann" 3 "Üĸerholverbot fÃŧr LKW, Busse, etc."; +VAL_ 1124 PSD_Ges_Wechselverkehrszeichen 0 "Kein Wechselverkehrszeichen" 1 "Wechselverkehrszeichen links" 2 "Wechselverkehrszeichen rechts" 3 "Wechselverkehrszeichen links und rechts" 4 "Wechselverkerhszeichen Ãŧber der Fahrbahn"; +VAL_ 1124 PSD_Wechselverkehrszeichen_Typ 0 "kein_Wechselverkehrszeichen" 1 "LED_Wechselverkehrszeichen" 2 "nicht_LED_Wechselverkehrszeichen"; +VAL_ 1124 PSD_Ges_Gesetzlich_Kategorie 0 "kein_legales_Verbot" 1 "innerorts" 2 "ausserorts" 3 "Autobahn"; +VAL_ 1124 PSD_Ges_Gesetzlich_Zusatz 0 "kein_Zusatz_zu_legalem_Gebot" 1 "Anhaenger_Klasse_1" 2 "Anhaenger_Klasse_2"; +VAL_ 1124 PSD_Ges_Verkehrszeichen_Quelle 0 "VZA_kein_Onlinedienst" 1 "nur_VZA" 2 "nur_VZO" 3 "VZA_und_VZO"; +VAL_ 1124 PSD_Ges_Attribute_Komplett 0 "Attribute_nicht_komplett" 1 "Attribute_komplett"; +VAL_ 1124 PSD_Baum_Laenge_VZ 0 "Ost" 1 "West"; +VAL_ 1124 PSD_Baum_Breite_VZ 0 "Nord" 1 "Sued"; +VAL_ 1124 PSD_Steigung_1_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Steigung_1_A_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_1_A_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_1_B_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_1_B_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_1_Attribute_kompl 0 "Steigungen_nicht_komplett" 1 "Steigungen_komplett"; +VAL_ 1124 PSD_Steigung_2_Segment_ID 0 "keine_Segment_Information_vorhanden" 1 "Fehler"; +VAL_ 1124 PSD_Steigung_2_Steigung 126 "mehr_als_15_Prozent" 127 "Steigung_unbekannt"; +VAL_ 1124 PSD_Steigung_2_Vorz 0 "Gefaelle" 1 "Steigung"; +VAL_ 1124 PSD_Steigung_2_Attribute_kompl 0 "Steigungen_nicht_komplett" 1 "Steigungen_komplett"; +VAL_ 1411 BCM_FH_Freigabe 1 "Funktionsfreigabe Fensterheber"; +VAL_ 1411 BCM_Komfortfkt_Freigabe 0 "Komfortfunktion gesperrt" 1 "globale Freigabe der Komfortfunktion erteilt"; +VAL_ 1411 BCM_HSK_Freigabe 0 "erlauben" 1 "sperren"; +VAL_ 1411 BCM_Verdeck_Freigabe 0 "Verdeckbetrieb nicht erlaubt" 1 "Verdeckbetrieb erlaubt"; +VAL_ 1411 ZV_verriegelt_intern_ist 1 "Fahrzeug innen verriegelt; Istzustand"; +VAL_ 1411 ZV_verriegelt_extern_ist 1 "Fahrzeug_aussen_verriegelt_Istzustand"; +VAL_ 1411 ZV_verriegelt_intern_soll 1 "Fahrzeug verriegelt intern; Sollzusstand"; +VAL_ 1411 ZV_verriegelt_extern_soll 1 "Fahrzeug verriegelt extern; Sollzusstand"; +VAL_ 1411 ZV_gesafet_extern_ist 1 "Fahrzeug aussen gesafet; Istzustand"; +VAL_ 1411 ZV_gesafet_extern_soll 1 "Fahrzeug_aussen_gesafet_Sollzustand"; +VAL_ 1411 ZV_Einzeltuerentriegelung 1 "Fahrzeug an Einzeltuer entriegelt"; +VAL_ 1411 ZV_Heckeinzelentriegelung 1 "Heckdeckeleinzelentriegelung"; +VAL_ 1411 ZV_FT_offen 0 "FT_geschlossen" 1 "FT_geoeffnet"; +VAL_ 1411 ZV_BT_offen 0 "BT_geschlossen" 1 "BT_geoeffnet"; +VAL_ 1411 ZV_HFS_offen 0 "geschlossen" 1 "offen"; +VAL_ 1411 ZV_HBFS_offen 0 "geschlossen" 1 "offen"; +VAL_ 1411 ZV_HD_offen 1 "Heckdeckel_auf"; +VAL_ 1411 ZV_HS_offen 0 "Heckscheibe_geschlossen" 1 "Heckscheibe auf"; +VAL_ 1411 IRUE_aktiv 0 "unscharf" 1 "scharf"; +VAL_ 1411 DWA_aktiv 0 "unscharf" 1 "scharf"; +VAL_ 1411 HD_Hauptraste 0 "geschlossen" 1 "offen"; +VAL_ 1411 HD_Vorraste 0 "geschlossen" 1 "offen"; +VAL_ 1411 FFB_CarFinder 0 "nicht aktiv" 1 "aktiv"; +VAL_ 1411 FFB_Komfortoeffnen 0 "kein_Komfortoeffnen_empfangen" 1 "Komfortoeffnen ueber Funk empfangen"; +VAL_ 1411 FFB_Komfortschliessen 0 "kein_Komfortschliessen_empfangen" 1 "Komfortschliessen ueber Funk empfangen"; +VAL_ 1411 ZV_Schluessel_Zugang 0 "kein_auth_Schluessel_erkannt" 1 "aktive_Funkschluessel_Nr_01" 2 "aktive_Funkschluessel_Nr_02" 3 "aktive_Funkschluessel_Nr_03" 4 "aktive_Funkschluessel_Nr_04" 5 "aktive_Funkschluessel_Nr_05" 6 "aktive_Funkschluessel_Nr_06" 7 "aktive_Funkschluessel_Nr_07" 8 "aktive_Funkschluessel_Nr_08" 9 "ungueltig_09" 10 "ungueltig_10" 11 "ungueltig_11" 12 "ungueltig_12" 13 "ungueltig_13" 14 "ungueltig_14" 15 "ungueltig_15"; +VAL_ 1411 ZV_SafeFunktion_aktiv 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 FBS_Warn_Schluessel_Batt 0 "i.O." 1 "defekt"; +VAL_ 1411 ZV_Oeffnungsmodus 0 "globale_Oeffnung" 1 "ZV_mit_Einzeltuerentr" 2 "ZV_individuell_selektiv" 3 "ZV_seitenselektiv"; +VAL_ 1411 HFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1411 HFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 1411 HBFS_verriegelt 0 "nicht_verriegelt" 1 "verriegelt"; +VAL_ 1411 HBFS_gesafet 0 "nicht_gesafet" 1 "gesafet"; +VAL_ 1411 ZV_ist_Zustand_verfuegbar 0 "nicht_verfuegbar" 1 "verfuegbar_alle_TSGs_am_Bus"; +VAL_ 1411 IRUE_Taster_Fkts_LED 0 "LED_aus" 1 "LED_ein"; +VAL_ 1411 ZV_Tankklappe_offen 0 "Tankklappe_geschlossen" 1 "Tankklappe_offen"; +VAL_ 1411 ZV_Rollo_auf 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_Rollo_zu 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_SAD_auf 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 ZV_SAD_zu 0 "inaktiv" 1 "aktiv"; +VAL_ 1411 BCM_Tankklappensteller_Fehler 0 "kein_Fehler" 1 "Fehler"; +VAL_ 1411 ZV_verriegelt_soll 0 "Init" 1 "nicht_verriegelt" 2 "verriegelt"; +VAL_ 1440 LS_Helligkeit_IR 254 "Init" 255 "Fehler"; +VAL_ 1440 LS_Helligkeit_FW 1022 "Init" 1023 "Fehler"; +VAL_ 1440 LS_defekt 0 "OK" 1 "defekt"; +VAL_ 1440 LS_Verbau 0 "Init" 1 "Lichtsensor_verbaut"; +VAL_ 1440 RS_Regenmenge 14 "Init" 15 "Fehler"; +VAL_ 1440 RS_Verbau 0 "Init" 1 "Regensensor verbaut"; +VAL_ 1440 RS_Verglasung_schliessen 0 "Verglasung nicht schliessen" 1 "Verglasung schliessen"; +VAL_ 1440 RS_defekt 0 "OK" 1 "defekt"; +VAL_ 1440 RS_Wischergeschwindigkeit 0 "kein Wischen" 1 "42 Huebe/min" 2 "45 Huebe/min" 3 "48 Huebe/min" 4 "51 Huebe/min" 5 "54 Huebe/min" 6 "57 Huebe/min" 7 "60 Huebe/min"; +VAL_ 1440 RLS_Vorfeldhelligkeit_Boost 0 "groesser_24413_Lux" 1 "bis_24413_Lux" 2 "bis_22193_Lux" 3 "bis_20176_Lux" 4 "bis_18342_Lux" 5 "bis_16647_Lux" 6 "bis_15158_Lux" 7 "bis_13780_Lux" 8 "bis_12527_Lux" 9 "bis_11388_Lux" 10 "bis_10353_Lux" 11 "bis_9412_Lux" 12 "bis_8556_Lux" 13 "bis_7778_Lux" 14 "bis_7071_Lux" 15 "bis_6428_Lux"; +VAL_ 1720 KBI_Variante_USA 0 "keine USA-Variante" 1 "USA-Variante"; +VAL_ 1720 KBI_Variante 0 "Zeiger Kombiinstrument" 1 "Volldisplay Kombiinstrument"; +VAL_ 1720 KBI_BCmE_aktiv 0 "Anzeige_nicht_aktiv" 1 "Anzeige_aktiv"; +VAL_ 1720 KBI_Sparhinweis_quittiert 0 "nicht_quittiert" 1 "quittiert"; +VAL_ 1720 KBI_Tankfuellstand_Prozent 126 "Init" 127 "Fehler"; +VAL_ 1720 KBI_Nachtanken_erkannt 0 "Geberbetrieb" 1 "Nachtankmodus"; +VAL_ 1720 KBI_Tankinhalt_hochaufl 16382 "Init" 16383 "Fehler"; +VAL_ 1720 KBI_Max_Tankinhalt 254 "Init" 255 "Fehler"; +VAL_ 316495015 VZE_Anzeigemodus 0 "EU_RDW" 1 "USA" 2 "Canada" 3 "China"; +VAL_ 316495015 VZE_Verkehrszeichen_Einheit 0 "mph" 1 "kmh"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_3 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_2 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Verkehrszeichen_1_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_1 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Verkehrszeichen_2_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_2 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Verkehrszeichen_3_Typ 0 "Geschwindigkeitszeichen" 1 "Kein Geschwindigkeitszeichen"; +VAL_ 316495015 VZE_Verkehrszeichen_3 0 "kein_Verkehrszeichen" 520 "Unbegrenzt"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_1 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_2 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Warnung_Verkehrszeichen_3 0 "keine_Warnung_Initialwert_Fehlerwert" 1 "Warnung"; +VAL_ 316495015 VZE_Zusatzschild_1 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Zusatzschild_2 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Zusatzschild_3 0 "keine_Zusatzschild_Initialwert_Fehlerwert"; +VAL_ 316495015 VZE_Anzeigeunterdrueck_Zeichen_1 0 "anzeigerelevant" 1 "nicht_anzeigerelevant"; +VAL_ 316495015 VZE_Zeichen_01_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_02_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_03_KameraWied 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_01_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_01_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_01_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_02_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_02_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_02_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_03_Kamera 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Zeichen_03_Karte 0 "inaktiv" 1 "aktiv"; +VAL_ 316495015 VZE_Zeichen_03_Gesetz 0 "nicht_erkannt" 1 "erkannt"; +VAL_ 316495015 VZE_Gong 0 "Gong_deaktiv" 1 "Gong_aktiv"; diff --git a/artifacts/package_runtime/iqdbc/dbc/vw_pq.dbc b/artifacts/package_runtime/iqdbc/dbc/vw_pq.dbc new file mode 100644 index 000000000..15626ecf5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/dbc/vw_pq.dbc @@ -0,0 +1,2138 @@ +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + SG_MUL_VAL_ + +BS_: + +BU_: XXX + + +BO_ 1394 ZAS_1: 2 XXX + SG_ Fehlerspeichereintrag__ZAS_ : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_ZAS_1_3 : 8|7@1+ (1,0) [0|0] "" XXX + SG_ Frei_ZAS_1_2 : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_15_SV : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_ZAS_1_1 : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_P__Parklichtstellung_ : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_50__Starten_ : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_X__Startvorgang_ : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_15__Z_ndung_ein_ : 1|1@1+ (1,0) [0|0] "" XXX + SG_ S_Kontakt__Schl_ssel_steckt_ : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1336 Wischer_1: 2 XXX + SG_ Blockierung_Heckwischer_erkannt : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Wischer_1_2 : 12|3@1+ (1,0) [0|0] "" XXX + SG_ Fehlerspeichereintrag__Wischer_ : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Ansteuerung_Scheibenwischer_Hec : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Ansteuerung_Wascher_Heck : 9|1@1+ (1,0) [0|0] "" XXX + SG_ Scheibenwischer_Heck_eingeschal : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Blockierung_Frontwischer_erkann : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Wischer_1_1 : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Status_Waschduesenheizung : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Parklage_Frontwischer : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Ansteuerung_Frontwischer_Schnel : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Ansteuerung_Frontwischer_Normal : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Ansteuerung_Wascher_Front : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Frontwischer__eingeschaltet : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1464 WFS_1: 2 XXX + SG_ WFS_Textbits : 8|8@1+ (1,0) [0|0] "" XXX + SG_ Frei_WFS_1_1 : 1|7@1+ (1,0) [0|0] "" XXX + SG_ WFS_LED : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1096 Waehlhebel_1: 4 XXX + SG_ Frei_Waehlhebel_1_1 : 29|3@1+ (1,0) [0|0] "" XXX + SG_ Test_aktiv_Flag : 28|1@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_Waehlhebel_1 : 24|4@1+ (1,0) [0|15] "" XXX + SG_ Waehlhebel_Testergebnis : 16|8@1+ (1,0) [0|255] "" XXX + SG_ Fehler_Waehlhebel : 8|8@1+ (1,0) [0|0] "" XXX + SG_ Waehlhebelposition : 4|4@1+ (1,0) [0|0] "" XXX + SG_ Waehlhebel_Initialisierung : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Shiftlock_Position : 0|3@1+ (1,0) [0|0] "" XXX + +BO_ 1496 Verbauliste_1: 8 XXX + SG_ TV_Tuner : 63|1@1+ (1,0) [0|0] "" XXX + SG_ DSP : 62|1@1+ (1,0) [0|0] "" XXX + SG_ CD_Wechsler : 61|1@1+ (1,0) [0|0] "" XXX + SG_ Spracheingabe : 60|1@1+ (1,0) [0|0] "" XXX + SG_ Telematik : 59|1@1+ (1,0) [0|0] "" XXX + SG_ Navigation : 58|1@1+ (1,0) [0|0] "" XXX + SG_ Telefon : 57|1@1+ (1,0) [0|0] "" XXX + SG_ Radio : 56|1@1+ (1,0) [0|0] "" XXX + SG_ MMI_vorne : 55|1@1+ (1,0) [0|0] "" XXX + SG_ MMI_hinten : 54|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Verbauliste_1_11 : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Klimabedienteil_HL : 52|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Verbauliste_1_10 : 50|2@1+ (1,0) [0|0] "" XXX + SG_ Tankgeber : 49|1@1+ (1,0) [0|0] "" XXX + SG_ Assistenzfahrlicht : 48|1@1+ (1,0) [0|0] "" XXX + SG_ Memory_hinter_Fahrer : 47|1@1+ (1,0) [0|0] "" XXX + SG_ Sitzmemory_hinten : 46|1@1+ (1,0) [0|0] "" XXX + SG_ Sitzmemory_Beifahrer : 45|1@1+ (1,0) [0|0] "" XXX + SG_ Anh_ngersteuergeraet : 44|1@1+ (1,0) [0|0] "" XXX + SG_ Energiemanagement : 43|1@1+ (1,0) [0|0] "" XXX + SG_ Wischermodul : 42|1@1+ (1,0) [0|0] "" XXX + SG_ EZS___Kessy__Komfort_ : 41|1@1+ (1,0) [0|0] "" XXX + SG_ Verdecksteuergeraet : 40|1@1+ (1,0) [0|0] "" XXX + SG_ Standheizung : 39|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Verbauliste_1_9 : 38|1@1+ (1,0) [0|0] "" XXX + SG_ Einparkhilfe : 37|1@1+ (1,0) [0|0] "" XXX + SG_ Klimasteuergeraet_Komfort : 36|1@1+ (1,0) [0|0] "" XXX + SG_ Gateway : 35|1@1+ (1,0) [0|0] "" XXX + SG_ Lenksaeulenmodul : 34|1@1+ (1,0) [0|0] "" XXX + SG_ Reifendruck : 33|1@1+ (1,0) [0|0] "" XXX + SG_ Kombiinstrument_Komfort : 32|1@1+ (1,0) [0|0] "" XXX + SG_ Dachmodul : 31|1@1+ (1,0) [0|0] "" XXX + SG_ Memory : 30|1@1+ (1,0) [0|0] "" XXX + SG_ TSG_HR : 29|1@1+ (1,0) [0|0] "" XXX + SG_ TSG_HL : 28|1@1+ (1,0) [0|0] "" XXX + SG_ TSG_BT : 27|1@1+ (1,0) [0|0] "" XXX + SG_ TSG_FT : 26|1@1+ (1,0) [0|0] "" XXX + SG_ ZKE : 25|1@1+ (1,0) [0|0] "" XXX + SG_ BSG_Komfort : 24|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Verbauliste_1_8 : 19|5@1+ (1,0) [0|0] "" XXX + SG_ Stabi_Entkopplung : 18|1@1+ (1,0) [0|0] "" XXX + SG_ Waehlhebel : 17|1@1+ (1,0) [0|0] "" XXX + SG_ Batteriemanager : 16|1@1+ (1,0) [0|0] "" XXX + SG_ Daempfer_SG : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Niveauregulierung : 14|1@1+ (1,0) [0|0] "" XXX + SG_ EZS___Kessy__Antrieb_ : 13|1@1+ (1,0) [0|0] "" XXX + SG_ Bremsbooster : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Antrieb : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Einspritzpumpe : 9|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkwinkel : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Allrad : 7|1@1+ (1,0) [0|0] "" XXX + SG_ BSG_Antrieb : 6|1@1+ (1,0) [0|0] "" XXX + SG_ ADR : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Airbag : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Climatronic_Antrieb : 3|1@1+ (1,0) [0|0] "" XXX + SG_ ABS : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Getriebesteuergeraet : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Motorsteuergeraet : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1488 Systeminfo_1: 6 XXX + SG_ CAN_Stand_4_1_Antrieb_Daten_Hau : 44|4@1+ (1,0) [0|15] "" XXX + SG_ CAN_Stand_4_1_Antrieb_Daten_Neb : 40|4@1+ (1,0) [0|15] "" XXX + SG_ CAN_Stand_4_1_Komfort_Daten_Hau : 36|4@1+ (1,0) [0|15] "" XXX + SG_ CAN_Stand_4_1_Komfort_Daten_Neb : 32|4@1+ (1,0) [0|15] "" XXX + SG_ Frei_Systeminfo_1_6 : 30|1@1+ (1,0) [0|0] "" XXX + SG_ Viertuerer : 29|1@1+ (1,0) [0|0] "" XXX + SG_ Rechtslenker : 28|1@1+ (1,0) [0|0] "" XXX + SG_ Fahrzeug_Index : 24|4@1+ (1,0) [0|0] "" XXX + SG_ Fahrzeug_Generation : 20|4@1+ (1,0) [0|15] "" XXX + SG_ Fahrzeug_Derivat : 16|4@1+ (1,0) [0|15] "" XXX + SG_ Fahrzeug_Marke_2 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Fahrzeug_Klasse : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Verbauinformation_gueltig : 7|1@1+ (1,0) [0|0] "" XXX + SG_ CAN_Infotainment_verbaut : 6|1@1+ (1,0) [0|0] "" XXX + SG_ CAN_Infotainment_in_Diagnose : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Sleep_CAN_Infotainment : 4|1@1+ (1,0) [0|0] "" XXX + SG_ CAN_Komfort_in_Diagnose : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Sleep_CAN_Komfort : 2|1@1+ (1,0) [0|0] "" XXX + SG_ CAN_Antrieb_in_Diagnose : 1|1@1+ (1,0) [0|0] "" XXX + SG_ CAN_Extern_zugeschaltet : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 268 Slave_1: 8 XXX + SG_ Delta_reduziertes_Sollmoment : 48|1@1+ (1,0) [0|0] "" XXX + SG_ Delta_Drosselklappenwinkel : 32|16@1+ (1,0) [0|0] "" XXX + SG_ Frei_Slave_1_1 : 25|7@1+ (1,0) [0|0] "" XXX + SG_ Delta_Zuendwinkelausgabe : 24|1@1+ (1,0) [0|0] "" XXX + SG_ Ubat_Freigabe_DVE__Slave_ : 23|1@1+ (1,0) [0|0] "" XXX + SG_ Drosselklappe_Sollwertbegrenzun : 22|1@1+ (1,0) [0|0] "" XXX + SG_ Einspritzverbot_lernen__Slave_ : 21|1@1+ (1,0) [0|0] "" XXX + SG_ Master_erkannt__Slave_ : 20|1@1+ (1,0) [0|0] "" XXX + SG_ Fehler_Momentenausgabe : 19|1@1+ (1,0) [0|0] "" XXX + SG_ Fehler_Getriebe_Moment : 18|1@1+ (1,0) [0|0] "" XXX + SG_ Fehler_Bremsenbotschaft : 17|1@1+ (1,0) [0|0] "" XXX + SG_ Indiziertes_Istmoment__Slave_ : 0|16@1+ (0.0015259,0) [0|99.998] "%" XXX + SG_ Timeout_Bremsenbotschaft : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1332 Sitz_info: 2 XXX + SG_ Positionserkennung_Beifahrersit : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Beifahrersitz_im_vorderen_Dritt : 14|1@1+ (1,0) [0|0] "" XXX + SG_ Positionserkennung_Fahrersitz_u : 13|1@1+ (1,0) [0|0] "" XXX + SG_ Fahrersitz_im_vorderen_Drittel : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_Sitzinfo : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Checksumme_Sitzinfo : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 1810 PSG_3: 2 XXX + SG_ Selbsttestergebnis : 0|16@1+ (1,0) [0|0] "" XXX + +BO_ 1298 PSG_2: 8 XXX + SG_ RAM_Inhalt_4 : 48|16@1+ (1,0) [0|0] "" XXX + SG_ RAM_Inhalt_3 : 32|16@1+ (1,0) [0|0] "" XXX + SG_ RAM_Inhalt_2 : 16|16@1+ (1,0) [0|0] "" XXX + SG_ RAM_Inhalt_1 : 0|16@1+ (1,0) [0|0] "" XXX + +BO_ 274 PSG_1: 8 XXX + SG_ Pumpentemperatur__2_1_ : 48|16@1+ (0.0625,0) [0|4096] "K" XXX + SG_ Pumpentemperatur__3_2_2_ : 44|12@1+ (1,0) [0|0] "" XXX + SG_ Zylinderzaehler__3_2_2_ : 43|3@1+ (1,0) [1|8] "Zaehler" XXX + SG_ Ansteuerdauer__3_2_2_ : 32|11@1+ (0.0469,0) [0|96] "NW" XXX + SG_ Nockenwellendrehzahl__3_2_2_ : 20|12@1+ (4,0) [0|16380] "upm" XXX + SG_ Pumpen_Statuswort__3_2_2_ : 0|20@1+ (1,0) [0|0] "" XXX + +BO_ 1300 NOX_1: 8 XXX + SG_ OBD_fuer_NOX : 56|8@1+ (1,0) [0|0] "" XXX + SG_ Frei_NOX1_4 : 53|3@1+ (1,0) [0|0] "" XXX + SG_ IP2 : 52|1@1+ (1,0) [0|0] "" XXX + SG_ IP1 : 51|1@1+ (1,0) [0|0] "" XXX + SG_ IP0 : 50|1@1+ (1,0) [0|0] "" XXX + SG_ Sondenheizung_NOX : 49|1@1+ (1,0) [0|0] "" XXX + SG_ Offsetkorrektur_NOX : 48|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_NOX1_3 : 43|5@1+ (1,0) [0|0] "" XXX + SG_ Sauerstoff_binaer : 32|11@1+ (1,-200) [-200|1847] "mV" XXX + SG_ Frei_NOX1_2 : 27|5@1+ (1,0) [0|0] "" XXX + SG_ Sauerstoff_linear : 16|11@1+ (1,0) [0|2047] "1000/Lambd" XXX + SG_ Frei_NOX1_1 : 11|5@1+ (1,0) [0|0] "" XXX + SG_ NOX_Signal : 0|11@1+ (1,0) [0|2047] "ppm" XXX + +BO_ 1424 Niveau_1: 6 XXX + SG_ Beladungszustand : 40|8@1+ (1,0) [0|253] "Zuladung" XXX + SG_ Fehlerspeichereintrag__Niveau_1 : 39|1@1+ (1,0) [0|0] "" XXX + SG_ Systemstatus__Niveau_1_ : 38|1@1+ (1,0) [0|0] "" XXX + SG_ Reserve_Fahrzeugart : 37|1@1+ (1,0) [0|0] "" XXX + SG_ Fahrzeugart_Niveau : 36|1@1+ (1,0) [0|0] "" XXX + SG_ Textbits__Niveau_1_ : 32|4@1+ (1,0) [0|0] "" XXX + SG_ Verstellung_HL : 31|1@1+ (1,0) [0|0] "" XXX + SG_ Verstellung_HR : 30|1@1+ (1,0) [0|0] "" XXX + SG_ Verstellung_VL : 29|1@1+ (1,0) [0|0] "" XXX + SG_ Verstellung_VR : 28|1@1+ (1,0) [0|0] "" XXX + SG_ Absenkung_Fahrzeug : 27|1@1+ (1,0) [0|0] "" XXX + SG_ Anhebung_Fahrzeug : 26|1@1+ (1,0) [0|0] "" XXX + SG_ Verstellung_aktiv : 25|1@1+ (1,0) [0|0] "" XXX + SG_ Kompressorlauf_in_Kuerze : 24|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Niveau_1_5 : 23|1@1+ (1,0) [0|0] "" XXX + SG_ Taster_Niveau : 22|1@1+ (1,0) [0|0] "" XXX + SG_ Parkniveau : 21|1@1+ (1,0) [0|0] "" XXX + SG_ Zwischenniveau : 20|1@1+ (1,0) [0|0] "" XXX + SG_ Niveaustati : 16|4@1+ (1,0) [0|0] "" XXX + SG_ MSG_Einschraenkung : 15|1@1+ (1,0) [0|0] "" XXX + SG_ ESP_Beeinflussung : 14|1@1+ (1,0) [0|0] "" XXX + SG_ Warnlampe_Niveau_1 : 13|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Niveau_1_1 : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_Niveau_1 : 8|4@1+ (1,0) [0|15] "Zaehler" XXX + SG_ Checksumme_Niveau_1 : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 1328 Navigation_1: 7 XXX + SG_ Kreuzungstyp : 54|2@1+ (1,0) [0|3] "" XXX + SG_ Entfernung_bis_Kreuzung : 48|6@1+ (5,0) [0|315] "m" XXX + SG_ Entfernung_bis_Kurvenanfang : 40|8@1+ (1,0) [0|255] "m" XXX + SG_ Voarusliegende_Kurvenrichtung : 39|1@1+ (1,0) [0|0] "" XXX + SG_ Vorausliegender_Kurvenverlauf : 32|7@1+ (50,0) [0|6350] "m" XXX + SG_ Fehler_Navigation : 31|1@1+ (1,0) [0|0] "" XXX + SG_ Anzahl_Fahrbahnen__0_ist_unguel : 28|3@1+ (1,0) [1|7] "" XXX + SG_ Strassentyp : 24|4@1+ (1,0) [0|15] "" XXX + SG_ Laenderkennung : 16|8@1+ (1,0) [0|0] "" XXX + SG_ Vorzeichen_Gierrate______ : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Gierratenfehler : 14|1@1+ (1,0) [0|0] "" XXX + SG_ Gierrate : 0|14@1+ (0.01,0) [0|100] "deg/sek" XXX + +BO_ 1792 MSG_3: 3 XXX + SG_ MSG_Konfiguration : 16|8@1+ (1,0) [0|0] "" XXX + SG_ Lage_des_OT_Impuls : 0|16@1+ (0.01172,-384) [-384|384] "KW" XXX + +BO_ 1280 MSG_2: 8 XXX + SG_ RAM_Adresse_4 : 48|16@1+ (1,0) [0|0] "" XXX + SG_ RAM_Adresse_3 : 32|16@1+ (1,0) [0|0] "" XXX + SG_ RAM_Adresse_2 : 16|16@1+ (1,0) [0|0] "" XXX + SG_ Ram_Adresse_1 : 0|16@1+ (1,0) [0|0] "" XXX + +BO_ 256 MSG_1: 8 XXX + SG_ Kurbelwellendrehzahl__3_2_2_ : 56|8@1+ (1,0) [0|0] "" XXX + SG_ Soll_Foerderbeginn_KW__3_2_2_ : 40|16@1+ (0.01172,-384) [-384|384] "KW" XXX + SG_ Soll_Foerderbeginn_NW__3_2_2_ : 28|12@1+ (0.01172,0) [0|768] "degNW" XXX + SG_ Soll_Voreinspritzung : 16|12@1+ (1,0) [0|0] "" XXX + SG_ Soll_Einspritzmenge : 0|16@1+ (0.03125,0) [0|2047] "mg/H" XXX + +BO_ 1796 Motor_NOX: 8 XXX + SG_ Frei_Motor_NOX_1_2 : 24|40@1+ (1,0) [0|0] "" XXX + SG_ Frei_Motor_NOX_1_1 : 19|5@1+ (1,0) [0|0] "" XXX + SG_ Heizleistungsanforderung : 18|1@1+ (1,0) [0|0] "" XXX + SG_ Offsetkorrektur_moeglich : 17|1@1+ (1,0) [0|0] "" XXX + SG_ Betriebsbereich : 16|1@1+ (1,0) [0|0] "" XXX + SG_ Abgastemperatur_NOX : 8|8@1+ (5,-40) [-40|1230] "C" XXX + SG_ Abgasdruck_NOX : 0|8@1+ (5,600) [600|1870] "mbar" XXX + +BO_ 900 Motor_Momente: 8 XXX + SG_ Momentenangaben_ungenau__Moment : 35|2@1+ (1,0) [0|0] "" XXX + +BO_ 1408 Motor_Flexia: 8 XXX + SG_ Ansaugsystem m0 : 63|1@1+ (1,0) [0|0] "" XXX + SG_ Hubraum m0 : 56|7@1+ (0.1,0) [0|12.7] "l" XXX + SG_ Steigung_der_Befuellungskennlin m1 : 56|8@1+ (0.001,0) [0|0.255] "l/mm" XXX + SG_ Anzahl_Zylinder m0 : 52|4@1+ (1,0) [0|15] "Vent./Zyl." XXX + SG_ Bewertungsfaktor_Russindex_Turb m1 : 50|6@1+ (0.1,0) [0|6.3] "" XXX + SG_ Anzahl_Ventile m0 : 49|3@1+ (1,0) [0|7] "Vent./Zyl." XXX + SG_ Bewertungsfaktor_Verschleissind m1 : 44|6@1+ (0.1,0) [0|6.3] "" XXX + SG_ Hersteller_Code m1 : 40|4@1+ (1,0) [0|15] "" XXX + SG_ Motorleistung m0 : 40|9@1+ (1,0) [0|512] "KW" XXX + SG_ Max_Drehmoment m0 : 32|8@1+ (10,0) [0|2550] "Nm" XXX + SG_ Normierter_Verbrauch m1 : 32|8@1+ (10,0) [0|2550] "l/Zyl." XXX + SG_ Oelniveauschwelle m1 : 24|8@1+ (0.25,0) [0|63.75] "cm" XXX + SG_ Drehzahl_MaxNorm m0 : 24|8@1+ (100,0) [0|25500] "U/min" XXX + SG_ Verschleissindex : 16|8@1+ (1,0) [0|254] "" XXX + SG_ Russindex : 8|8@1+ (1,0) [0|254] "" XXX + SG_ Verbrennungsart : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Motor_Flexia_1 : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Warm_Up_Cycle : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Driving_Cycle : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_Motor_Flexia : 1|3@1+ (1,0) [0|15] "" XXX + SG_ Multiplex_Schalter_Motor_Flexia M : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1160 Motor_6: 8 XXX + SG_ MO6_Zaehler M : 60|4@1+ (1,0) [0|15] "" XXX + SG_ MO6_FF_Mux00 m0 : 48|8@1+ (0.39215686,0) [0|100] "%" XXX + SG_ MO6_FF_Mux01 m1 : 48|8@1+ (0.39215686,0) [0|100] "%" XXX + SG_ MO6_FF_Mux02 m2 : 48|8@1+ (1,-40) [-40|215] "C" XXX + SG_ MO6_FF_Mux03 m3 : 48|8@1+ (3.1372549,0) [0|800] "%" XXX + SG_ MO6_FF_Mux04 m4 : 48|8@1+ (0.39215686,0) [0|100] "%" XXX + SG_ MO6_Checksum : 0|8@1+ (1,0) [0|255] "" XXX + SG_ MO6_SollM_Getr : 8|8@1+ (0.39,0) [0|99.06] "%" XXX + SG_ MO6_Ist_Moment : 16|8@1+ (0.39,0) [0|99.06] "%" XXX + SG_ MO6_Hoeheninfo : 24|8@1+ (0.0078125,0) [0|2] "" XXX + SG_ MO6_GRA_Soll : 32|8@1+ (0.024,-3.984) [-3.984|2.112] "m/s2" XXX + SG_ MO6_MomIntGeOng : 40|8@1+ (0.39215686,0) [0|100] "%" XXX + SG_ MO6_Freigabe_GRA : 56|1@1+ (1,0) [0|1] "" XXX + SG_ MO6_Schutz_Toel : 57|1@1+ (1,0) [0|1] "" XXX + SG_ MO6_Luftpfad_akt : 58|1@1+ (1,0) [0|1] "" XXX + SG_ MO6_RegPartikel : 59|1@1+ (1,0) [0|1] "" XXX + +BO_ 1162 Motor_8: 8 XXX + SG_ MO8_Checksumme : 0|8@1+ (1,0) [0|255] "" XXX + SG_ MO8_AnzeigeDZ : 8|12@1+ (3,0) [0|12282] "rpm" XXX + SG_ MO_Effizienzmodus : 20|1@1+ (1,0) [0|1] "" XXX + SG_ MO8_SGT_Soundakt : 21|1@1+ (1,0) [0|1] "" XXX + SG_ MO8_Spoiler_ausf : 22|1@1+ (1,0) [0|1] "" XXX + SG_ MO8_Sportschalter : 23|1@1+ (1,0) [0|1] "" XXX + SG_ MO8_LampeDZBegr : 24|1@1+ (1,0) [0|1] "" XXX + SG_ MO8_Enable_Oeldr_Motor : 25|1@1+ (1,0) [0|1] "" XXX + SG_ MO8_Oeldr_Warn_Motor : 26|1@1+ (1,0) [0|1] "" XXX + SG_ MO8_Avus_Motorschutz : 27|2@1+ (1,0) [0|3] "" XXX + SG_ MO8_Anzeigecode : 29|1@1+ (1,0) [0|1] "" XXX + SG_ MO_P_verriegelt : 30|2@1+ (1,0) [0|3] "" XXX + SG_ MO8_GRA_v_Wunsch : 32|9@1+ (1,0) [0|511] "km/h" XXX + SG_ MO_Schaltempf_verfbar : 41|1@1+ (1,0) [0|1] "" XXX + SG_ MO8_Trailing_ZWP : 42|6@1+ (15,0) [0|945] "s" XXX + SG_ MO_Istgang : 48|4@1+ (1,0) [0|15] "" XXX + SG_ MO_Sollgang : 52|4@1+ (1,0) [0|15] "" XXX + SG_ MO8_Zaehler : 60|4@1+ (1,0) [0|15] "" XXX + + +BO_ 1152 Motor_5: 8 Motor + SG_ MO5_Mp_Code M : 6|2@1+ (1,0) [0|3] "" Gateway + SG_ MO5_max_Moment m0 : 0|6@1+ (10,0) [0|630] "Nm" Gateway + SG_ MO5_Drehzahl m1 : 0|6@1+ (100,0) [0|6300] "U/min" Gateway + SG_ MO5_Motortyp m2 : 0|6@1+ (1,0) [0|63] "" Gateway + SG_ MO5_Abgastyp m3 : 0|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Abgastyp2 m3 : 1|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Abgastyp3 m3 : 2|1@1+ (1,0) [0|1] "" Gateway + SG_ OBD_Kaltstart_Denominator m3 : 3|1@1+ (1,0) [0|1] "" Gateway + SG_ OBD_Minimum_Trip m3 : 4|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_DPF_reg m3 : 5|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Vorgluehen : 9|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_E_Gas : 10|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_OBD_2 : 11|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_Heissl : 12|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_KlimaKompr : 13|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Feld_kuehl : 14|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_KliKo_Red : 15|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Verbrauch : 16|15@1+ (1,0) [0|32767] "Âĩl" KOMBI + SG_ MO5_UeberlVerb : 31|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_Luefter : 32|8@1+ (0.4,0) [0|101.6] "%" Gateway + SG_ MO5_HLeuchte : 40|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_PartikelLamp : 41|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_Sta_BKU : 42|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_TypStartSteu : 43|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_TDE_Lampe : 44|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_TDE_Text : 45|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_DZM_Daempf : 46|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_Interlock : 47|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Start : 48|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Anlasser : 49|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_GRA_Hauptsch : 50|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Momente : 51|1@1+ (1,0) [0|1] "" Gateway + SG_ MO5_Motortext1 : 52|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_Motortext2 : 53|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_Motortext3 : 54|1@1+ (1,0) [0|1] "" KOMBI + SG_ MO5_Motortext4 : 55|1@1+ (1,0) [0|1] "" KOMBI + SG_ CHECKSUM : 56|8@1+ (1,0) [0|255] "" Gateway + +BO_ 896 Motor_3: 8 Motor + SG_ MO3_Vorgluehen : 0|1@1+ (1,0) [0|1] "" Gateway + SG_ MO3_Prio_Dz : 1|1@1+ (1,0) [0|1] "" Transmission + SG_ MO_Schalter_StartStopp : 2|1@1+ (1,0) [0|1] "" Gateway + SG_ MO3_Winterprg : 3|1@1+ (1,0) [0|1] "" Transmission + SG_ MO3_Sta_Pedal : 4|1@1+ (1,0) [0|1] "" Gateway + SG_ MO3_Sta_FPG M : 5|1@1+ (1,0) [0|1] "" ESP + SG_ MO3_Sign_FPG m1 : 6|1@1+ (1,0) [0|1] "" ESP + SG_ MO3_Sta_Temp : 7|1@1+ (1,0) [0|1] "" Gateway + SG_ MO3_Offsentemp : 8|8@1+ (0.75,-48) [-48|142.5] "°C" Gateway + SG_ MO3_Pedalwert : 16|8@1+ (0.4,0) [0|101.6] "%" Gateway + SG_ MO3_Rad_Wu_Mo : 24|12@1+ (0.39,0) [0|1596.66] "%" Transmission + SG_ MO3_Vorz_RadWu : 36|1@1+ (1,0) [0|1] "" Transmission + SG_ MO3_Freigabe_Segeln : 37|1@1+ (1,0) [0|1] "" Transmission + SG_ MO_StartStopp_StoppVorbereitung : 38|1@1+ (1,0) [0|1] "" Gateway + SG_ MO3_Dz_Beeinfl : 40|8@1+ (0.39,0) [0|99.45] "%" Transmission + SG_ MO3_WunschDz : 48|8@1+ (25,0) [0|6350] "U/min" Transmission + SG_ MO3_DKW m0 : 56|8@1+ (0.4,0) [0|101.6] "%" Gateway + SG_ MO3_FPGradient m1 : 56|8@1+ (25,0) [0|6350] "%/s" ESP + +BO_ 648 Motor_2: 8 Motor + SG_ MO2_Mp_Code m : 6|2@1+ (1,0) [0|3] "" Gateway + SG_ MO2_Getr_Code m2 : 0|6@1+ (1,0) [0|63] "" Gateway + SG_ MO2_max_Mo m3 : 0|6@1+ (10,0) [0|630] "Nm" Gateway + SG_ MO2_CAN_Vers m0 : 0|6@1+ (1,0) [0|63] "" Gateway + SG_ MO2_Motor_Code m1 : 0|6@1+ (1,0) [0|63] "" Gateway + SG_ MO2_Kuehlm_T : 8|8@1+ (0.75,-48) [-47.25|142.5] "°C" Gateway + SG_ MO2_BLS : 16|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_BTS : 17|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_Sta_Kuehlm : 18|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_Sta_Klima : 19|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_Sta_No_Bet : 20|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_Status_TSK : 21|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_Sta_GRA : 22|2@1+ (1,0) [0|3] "" ACC,GRA + SG_ TSK_Limiter_ausgewaehlt : 25|1@1+ (1,0) [0|1] "" ACC,GRA + SG_ MO2_GRAregelt : 26|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_Sport_Error : 27|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_OffRoad : 28|1@1+ (1,0) [0|1] "" Gateway + SG_ MO2_RME_Gehalt : 29|3@1+ (12.5,0) [0|75] "%" Gateway + SG_ MO2_GRA_Soll : 32|8@1+ (1.28,0) [0|325.12] "km/h" ACC,GRA + SG_ MO2_LL_Solldz : 40|8@1+ (10,0) [0|2540] "1/min" Gateway + SG_ MO2_Begr_Mo : 48|8@1+ (0.39,0) [0|99.06] "%" Gateway + SG_ MO2_Mo_ZWR : 56|8@1+ (0.39,0) [0|99.06] "%" Gateway + +BO_ 1416 Motor_7: 8 XXX + SG_ MO7_LL_Solldz : 0|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_Fehler_VBegr : 1|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_Sta_VBegr : 2|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_Fehlereintr : 3|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_StaOeltemp : 4|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_Sta_PTC : 5|3@1+ (1,0) [0|7] "" XXX + SG_ MO7_DFM : 8|8@1+ (0.4,0) [0|101.6] "%" XXX + SG_ MO7_Hoeheninfo : 16|8@1+ (0.0078125,0) [0|2] "" XXX + SG_ MO7_Gradient_Dz : 24|7@1+ (1,0) [0|126] "rpm" XXX + SG_ MO7_GradientVorz : 31|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_Ladedruckneu : 32|8@1+ (0.02,0) [0|5.08] "bar" XXX + SG_ MO7_GenLdResp : 40|2@1+ (3,0) [0|9] "s" XXX + SG_ MO7_PTC_bereit : 42|2@1+ (1,0) [0|3] "" XXX + SG_ MO7_Mot_weckfaehig : 44|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_Zus_Kuehl : 45|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_SleepInd : 46|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_RueckLLDz : 47|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_Lastabwurf : 48|2@1+ (1,0) [0|3] "" XXX + SG_ MO7_Gen_ein : 50|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_Lastabw_Heiz : 51|1@1+ (1,0) [0|1] "" XXX + SG_ MO7_StaGluehk : 52|4@1+ (8,0) [0|112] "%" XXX + SG_ MO7_Oeltemp : 56|8@1+ (1,-60) [-60|194] "C" XXX + +BO_ 1450 Motor_13: 8 XXX + SG_ MO_NMAX_Schaltanzeige : 0|9@1+ (25,0) [0|12775] "rpm" XXX + SG_ MO_Ethanol_BS_Texte : 9|3@1+ (1,0) [0|7] "" XXX + SG_ MO_Heizungspumpenansteuerung : 12|4@1+ (10,0) [0|100] "%" XXX + SG_ MO_Trailingzeit_Heizungspumpe : 16|6@1+ (15,0) [0|945] "s" XXX + SG_ MO_Absperrventil_oeffnen : 22|2@1+ (1,0) [0|3] "" XXX + SG_ MO_activees_Getriebeheizen : 24|1@1+ (1,0) [0|1] "" XXX + SG_ MO_Getriebe_kuehlen : 25|1@1+ (1,0) [0|1] "" XXX + SG_ MO_Zustand_HWP : 26|2@1+ (1,0) [0|3] "" XXX + SG_ MO_BKV_Unterdruckwarnung : 28|1@1+ (1,0) [0|1] "" XXX + SG_ MO_StartStopp_Codiert : 29|1@1+ (1,0) [0|1] "" XXX + SG_ MO_Zylinderabschaltung : 30|2@1+ (1,0) [0|3] "" XXX + SG_ MO_Heizstrom_SCR : 32|6@1+ (1,0) [0|62] "A" XXX + SG_ MO_Heizstrom_EKAT : 38|7@1+ (1,0) [0|126] "A" XXX + SG_ MO_Tankklappenstatus : 45|3@1+ (1,0) [0|7] "" XXX + SG_ MO_Tankklappensteuerung : 48|2@1+ (1,0) [0|3] "" XXX + SG_ MO_Zylabsch_Texte_02 : 50|4@1+ (1,0) [0|15] "" XXX + SG_ MO_EFLEX_Lampe : 54|2@1+ (1,0) [0|3] "" XXX + SG_ MO_Testmode_AG : 56|1@1+ (1,0) [0|1] "" XXX + SG_ MO_Ext_E_Fahrt_active : 57|1@1+ (1,0) [0|1] "" XXX + SG_ MO_E85_WU_Lampe : 58|1@1+ (1,0) [0|1] "" XXX + SG_ MO_E85_WU_Texte : 59|1@1+ (1,0) [0|1] "" XXX + SG_ MO_Zylabsch_Texte : 60|2@1+ (1,0) [0|3] "" XXX + SG_ MO_E85_BS_Texte : 62|2@1+ (1,0) [0|3] "" XXX + +BO_ 1420 Motor_10: 8 XXX + SG_ M10_Anzeige : 0|4@1+ (1,0) [0|15] "" XXX + SG_ M10_Anf_Kl75 : 4|1@1+ (1,0) [0|1] "" XXX + SG_ MSG_Remotestart_Betrieb : 5|1@1+ (1,0) [0|1] "" XXX + SG_ M10_SpannungsAnf : 6|1@1+ (1,0) [0|1] "" XXX + SG_ M10_UDruckDyn : 7|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Status_StSt : 8|2@1+ (1,0) [0|3] "" XXX + SG_ M10_MotorStopp : 10|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Wiederstart : 11|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Schubabschaltung : 12|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Druck_err_gem : 13|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Freigabe_Reku : 14|2@1+ (1,0) [0|3] "" XXX + SG_ M10_rel_Saugrohrdruck : 16|6@1+ (18,0) [0|1116] "mbar" XXX + SG_ M10_Fahrbereitschaft : 22|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Hybrid : 23|1@1+ (1,0) [0|1] "" XXX + SG_ M10_EM_active : 24|1@1+ (1,0) [0|1] "" XXX + SG_ M10_VM_active : 25|1@1+ (1,0) [0|1] "" XXX + SG_ M10_HYB_Bereitlampe : 26|1@1+ (1,0) [0|1] "" XXX + SG_ M10_HYB_Warnlampe : 27|1@1+ (1,0) [0|1] "" XXX + SG_ M10_HYB_Fehlerlampe : 28|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Fehler_HV_Netz : 29|1@1+ (1,0) [0|1] "" XXX + SG_ M10_EKlKomLeiRed : 30|2@1+ (1,0) [0|3] "" XXX + SG_ M10_Klimadruck : 32|8@1+ (0.2,0) [0|50.8] "bar" XXX + SG_ M10_KompOffCode : 40|4@1+ (1,0) [0|15] "" XXX + SG_ M10_StartStopp_Fahrerwunsch : 44|2@1+ (1,0) [0|3] "" XXX + SG_ M10_Akustik : 46|2@1+ (1,0) [0|3] "" XXX + SG_ M10_Text_1_Hybrid : 48|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Text_2_Hybrid : 49|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Text_3_Hybrid : 50|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Text_4_Hybrid : 51|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Text_5_Hybrid : 52|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Text_6_Hybrid : 53|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Text_7_Hybrid : 54|1@1+ (1,0) [0|1] "" XXX + SG_ M10_Text_8_Hybrid : 55|1@1+ (1,0) [0|1] "" XXX + SG_ M10_ShiftLockLampe : 56|1@1+ (1,0) [0|1] "" XXX + SG_ MO_Auth_Aufforderung_WFS : 57|1@1+ (1,0) [0|1] "" XXX + SG_ M10_BMSInfo_gue : 58|1@1+ (1,0) [0|1] "" XXX + SG_ M10_VentilationReq : 59|1@1+ (1,0) [0|1] "" XXX + SG_ M10_BattFanSpd : 60|4@1+ (10,0) [0|140] "%" XXX + +BO_ 1423 Motor_12: 8 XXX + SG_ M12_MKB_MUX M : 56|2@1+ (1,0) [0|3] "" XXX + SG_ M12_MKB_01 m0 : 59|5@1+ (1,0) [0|31] "" XXX + SG_ M12_MKB_02 m1 : 59|5@1+ (1,0) [0|31] "" XXX + SG_ M12_MKB_03 m2 : 59|5@1+ (1,0) [0|31] "" XXX + SG_ M12_MKB_04 m3 : 59|5@1+ (1,0) [0|31] "" XXX + SG_ MO_ITM_Kuehlmittel_Temp : 0|8@1+ (0.75,-48) [-48|143.25] "C" XXX + SG_ M12_E85_Sensor : 8|4@1+ (10,0) [0|100] "%" XXX + SG_ M12_SCR_Anz_Motorstarts : 12|4@1+ (1,0) [0|15] "" XXX + SG_ M12_SCR_Reichweite : 16|15@1+ (1,0) [0|32766] "km" XXX + SG_ SCR_Tankdeckel : 31|1@1+ (1,0) [0|1] "" XXX + SG_ M12_SCR_Warnstufe_1 : 32|1@1+ (1,0) [0|1] "" XXX + SG_ M12_SCR_Warnstufe_2 : 33|1@1+ (1,0) [0|1] "" XXX + SG_ M12_SCR_Text : 34|3@1+ (1,0) [0|7] "" XXX + SG_ M12_Akustik : 37|2@1+ (1,0) [0|3] "" XXX + SG_ M12_Luftfilter_Lampe : 39|1@1+ (1,0) [0|1] "" XXX + SG_ M12_Kraftstofffilter_Wasser : 40|1@1+ (1,0) [0|1] "" XXX + SG_ M12_SCR_Systemfehler : 41|1@1+ (1,0) [0|1] "" XXX + SG_ M12_SCR_Inducement : 42|2@1+ (1,0) [0|3] "" XXX + SG_ M12_CO2_Faktor : 44|12@1+ (1,0) [0|4094] "g/l" XXX + SG_ MO_EDK_Luefter_defekt : 58|1@1+ (1,0) [0|1] "" XXX + +BO_ 1437 mRemotestart_FFB: 8 Vector__XXX + SG_ RSF_Tastencode_1 : 0|8@1+ (1,0) [1|255] "" Vector__XXX + SG_ RSF_Tastencode_2 : 8|8@1+ (1,0) [1|255] "" Vector__XXX + SG_ RSF_Tastencode_Maske : 16|8@1+ (1,0) [1|255] "" Vector__XXX + +BO_ 640 Motor_1: 8 Motor + SG_ MO1_Wunschmo : 56|8@1+ (0.39,0) [0|99.06] "%" XXX + SG_ MO1_Verlustmo : 48|8@1+ (0.39,0) [0|99.06] "%" XXX + SG_ MO1_Pedalwert : 40|8@1+ (0.4,0) [0|101.6] "%" XXX + SG_ MO1_Mo_o_ex : 32|8@1+ (0.39,0) [0|99.06] "%" XXX + SG_ MO1_Drehzahl : 16|16@1+ (0.25,0) [0|16256] "1/min" XXX + SG_ MO1_Mo_m_ex : 8|8@1+ (0.39,0) [0|99.06] "%" XXX + SG_ MO1_Sta_MotMo : 7|1@1+ (1,0) [0|1] "" XXX + SG_ MO1_Sta_Getr : 6|1@1+ (1,0) [0|1] "" XXX + SG_ MO1_Sta_Bremse : 5|1@1+ (1,0) [0|1] "" XXX + SG_ MO1_TiOut_Br : 4|1@1+ (1,0) [0|1] "" XXX + SG_ MO1_Kup_schalt : 3|1@1+ (1,0) [0|1] "" XXX + SG_ MO1_Kickdown : 2|1@1+ (1,0) [0|1] "" XXX + SG_ MO1_Sta_Pedal : 1|1@1+ (1,0) [0|1] "" XXX + SG_ MO1_Leergas : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 262 Master_3: 8 XXX + SG_ Frei_Master_3_1 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ Motortemperatur_linearisiert : 48|8@1+ (0.75,-48) [-48|143.25] "" XXX + SG_ Indiziertes_Sollmoment_f_r_Vmax : 32|16@1+ (0.0015259,0) [0|100] "%" XXX + SG_ Relative_Momentenanforderung_de : 16|16@1+ (0.003052,0) [0|200] "%" XXX + SG_ Delta_Motormoment_aus_Verlustmo : 0|16@1+ (0.003052,-100) [-100|100] "%" XXX + +BO_ 260 Master_2: 8 XXX + SG_ Ubat_Freigabe_DVE : 45|1@1+ (1,0) [0|0] "" XXX + SG_ DK_Sollwertbegrenzung : 44|1@1+ (1,0) [0|0] "" XXX + SG_ Einspritzverbot_DV_E_lernen : 43|1@1+ (1,0) [0|0] "" XXX + SG_ Master_erkannt : 42|1@1+ (1,0) [0|0] "" XXX + SG_ Vmax_Begrenzung_aktiv : 41|1@1+ (1,0) [0|0] "" XXX + SG_ SA_Verbot_von_FGR : 40|1@1+ (1,0) [0|0] "" XXX + SG_ Pedalwert_Komplement : 24|16@1+ (1,0) [0|0] "" XXX + SG_ Zaehler__Master_2_ : 16|8@1+ (1,0) [0|255] "" XXX + SG_ Normierter_Fahrpedalwinkel : 0|16@1+ (0.001526,0) [0|100] "%" XXX + +BO_ 258 Master_1: 8 XXX + SG_ Stationaere_Solldrehzahl : 56|8@1+ (10,0) [0|2550] "Umin" XXX + SG_ Drehmoment_LLR__I_Anteil_ : 40|16@1+ (0.003052,-100) [-100|100] "%" XXX + SG_ Drehmoment_LLR__PD_Anteil_ : 24|16@1+ (0.003052,-100) [-100|100] "%" XXX + SG_ Drehmoment_LLR__Luftpfad_ : 8|16@1+ (0.003052,-100) [-100|100] "%" XXX + SG_ Frei_Master_1_1 : 4|4@1+ (1,0) [0|0] "" XXX + SG_ LLR_ist_aktiv : 3|1@1+ (1,0) [0|0] "" XXX + SG_ I_Anteil_der_LLR_aktiv : 2|1@1+ (1,0) [0|0] "" XXX + SG_ PD_Anteil_der_LLR_aktiv : 1|1@1+ (1,0) [0|0] "" XXX + SG_ LLR_Freigabe_nach_Start : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1984 LWS_Kalibrierung: 2 XXX + SG_ Frei_LWS_Kalibrierung_1_1 : 15|1@1+ (1,0) [0|0] "" XXX + SG_ LWS_Identifier : 8|7@1+ (1,0) [0|0] "" XXX + SG_ Frei_LWS_Kalibrierung_1_2 : 4|4@1+ (1,0) [0|0] "" XXX + SG_ Command_Dode_Word : 0|4@1+ (1,0) [0|0] "" XXX + +BO_ 1986 Lenkwinkel_Init: 4 XXX + SG_ Kodierbytes : 8|24@1+ (1,0) [0|0] "" XXX + SG_ Identiifier_f_r_LWS_Init : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 192 Lenkwinkel_1__RB_: 2 XXX + SG_ Vorzeichen__RB_ : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkwinkel__RB_ : 5|10@1+ (2.5,-720) [-720|720] "" XXX + SG_ LWS_OK__RB_ : 4|1@1+ (1,0) [0|0] "" XXX + SG_ LWS_Abgleich__RB_ : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Lenkwinkel_1_1__RB_ : 2|1@1+ (1,0) [0|0] "" XXX + SG_ FINE_CHECK__RB_ : 1|1@1+ (1,0) [0|0] "" XXX + SG_ COARSE_CHECK__RB_ : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 196 Lenkwinkel_1__ITT_: 2 XXX + SG_ Vorzeichen__ITT_ : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkwinkel__ITT_ : 5|10@1+ (1.5,-768) [-768|766.5] "" XXX + SG_ LWS_OK : 4|1@1+ (1,0) [0|0] "" XXX + SG_ LWS_Abgleich__ITT_ : 3|1@1+ (1,0) [0|0] "" XXX + SG_ LWS_Initialisierung__ITT_ : 2|1@1+ (1,0) [0|0] "" XXX + SG_ FINE_CHECK__ITT_ : 1|1@1+ (1,0) [0|0] "" XXX + SG_ COARSE_CHECK__ITT_ : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 194 Lenkwinkel_1: 8 XXX + SG_ LW1_LRW : 0|15@1+ (0.04375,0) [0|1433.55625] "°Grad" Gateway,ESP,ABS + SG_ LW1_LRW_Sign : 15|1@1+ (1,0) [0|1] "" Gateway,ESP,ABS + SG_ LW1_Lenk_Gesch : 16|15@1+ (0.04375,0) [0|1433.55625] "°Grad/s" Gateway,ESP,ABS + SG_ LW1_Gesch_Sign : 31|1@1+ (1,0) [0|1] "" Gateway,ESP,ABS + SG_ LW1_ID : 32|8@1+ (1,0) [0|255] "" Gateway,ESP,ABS + SG_ LW1_Initquelle : 40|1@1+ (1,0) [0|1] "" Gateway,ESP,ABS + SG_ LW1_Status : 41|2@1+ (1,0) [0|3] "" Gateway,ESP,ABS + SG_ LW1_Sta_KL30 : 43|1@1+ (1,0) [0|1] "" Gateway,ESP,ABS + SG_ LW1_Zaehler : 44|4@1+ (1,0) [0|15] "" Gateway,ESP,ABS + SG_ LW1_Kodier : 48|8@1+ (1,0) [0|255] "" Gateway + SG_ LW1_CRC : 56|8@1+ (1,0) [0|255] "" Gateway,ESP,ABS + +BO_ 1502 Lenkhilfe_Fehler: 7 XXX + SG_ Werkstattcode : 48|8@1+ (1,0) [0|0] "" XXX + SG_ Multiplex_Signal : 45|3@1+ (1,0) [0|7] "" XXX + SG_ Sensorcodierung_Lenkhilfe : 44|1@1+ (1,0) [0|0] "" XXX + SG_ Kennliniencodierung_Lenkhilfe : 40|4@1+ (1,0) [0|15] "Kennlinie" XXX + SG_ Geber_f__Lenkw__Speicher_ausles : 39|1@1+ (1,0) [0|0] "" XXX + SG_ Kombiinstr__Speicher_auslesen : 38|1@1+ (1,0) [0|0] "" XXX + SG_ Steuerger__Speicher_auslesen : 37|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Steuergeraet_defekt : 36|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Lenkhilfe_1_3 : 32|4@1+ (1,0) [0|0] "" XXX + SG_ Frei_Lenkhilfe_1_4 : 30|2@1+ (1,0) [0|0] "" XXX + SG_ Geber_f__Lenkwi__k__CAN_Komm_sp : 29|1@1+ (1,0) [0|0] "" XXX + SG_ Geber_f__Lenkwinkel_k__CAN_Komm : 28|1@1+ (1,0) [0|0] "" XXX + SG_ Kombiinstr__k__CAN_Kommunik__sp : 27|1@1+ (1,0) [0|0] "" XXX + SG_ Kombiinstrument_k__CAN_Kommunik : 26|1@1+ (1,0) [0|0] "" XXX + SG_ Steuergeraet_k__CAN_Kommunik__S : 25|1@1+ (1,0) [0|0] "" XXX + SG_ Steuergeraet_keine_CAN_Kommunik : 24|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Spannung_Ks__nach_Mas : 23|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Spannung_Ks_nach_Mass : 22|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Spannung_Ks__nach___s : 21|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Spannung_Ks__nach__ : 20|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Temperaturschutz_sp_ : 19|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Temperaturschutz : 18|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Betrieb_unpl__Sig__sp : 17|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfe_Betrieb_unpl__Signal : 16|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfesensor_k__Kommunik__sp : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfesensor_keine_Kommunik_ : 14|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfesensor_defekt_sp_ : 13|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfesensor_defekt : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfesensor_Unterbrechung_s : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfesensor_Unterbrechung : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhilfesensor_Ks_nach_Masse_s : 9|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkhifesensor_Ks_nach_Masse : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Spannung_Kl_15_zu_klein_sp_ : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Spannung_Kl_15_zu_klein : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Lenkhilfe_1_5 : 4|2@1+ (1,0) [0|0] "" XXX + SG_ Spannung_Kl_30_zu_klein_sp_ : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Spannung_Kl_30_zu_klein : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Spannung_Kl_30_zu_gro__sp_ : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Spannung_Kl_30_zu_gro_ : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 976 Lenkhilfe_1: 2 XXX + SG_ LH1_Lastinfo : 0|7@1+ (1,0) [0|127] "A" XXX + SG_ LH1_Fehler_LI : 7|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_Sicherheitslamp : 8|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_Fehlerlampe : 9|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_Textbits : 10|3@1+ (1,0) [0|7] "" XXX + SG_ LH1_Akustiksign : 13|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_SleepInd : 14|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_Fehlereintr : 15|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_EPS_Diagmode : 16|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_gue_ECU_Temp : 19|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_Kuehlung : 20|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_Mode_Hybrid : 21|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_NL_Untersp : 24|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_NL_Uebersp : 25|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_NL_Uebertemp : 26|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_NL_Sensor : 27|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_NL_CAN_SS : 28|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_NL_ECU : 29|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_NL_Motor : 30|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_NL_LeistDichte : 31|1@1+ (1,0) [0|1] "" XXX + SG_ LH1_ULeistung : 32|8@1+ (0.5,0) [0|100] "%" XXX + SG_ LH1_ECU_Temp : 40|8@1+ (1,-70) [-70|185] "°C" XXX + +BO_ 1312 Kombi_3: 8 XXX + SG_ Frei_Kombi_3_2 : 60|4@1+ (1,0) [0|0] "" XXX + SG_ Kilometerstand : 40|20@1+ (1,0) [0|1000000] "km" XXX + SG_ Fehlerstatus_Standzeit : 39|1@1+ (1,0) [0|0] "" XXX + SG_ Standzeit : 24|15@1+ (4,0) [0|131068] "sec" XXX + SG_ Frei_Kombi_3_1 : 20|4@1+ (1,0) [0|0] "" XXX + SG_ Schluesselinfo : 16|4@1+ (1,0) [0|15] "" XXX + SG_ Kombi_Multiplex_Code M : 14|2@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Niveauregulie m3 : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Multiplex_Marke m1 : 11|3@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Lenkhilfe m3 : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Dieselpumpe m3 : 9|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Lenkwinkel m3 : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Multiplex_Baureihe m1 : 8|3@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Multiplex_Laendervariante m0 : 8|6@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Allrad m3 : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Bordnetz m3 : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_ACC m3 : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Airbag m3 : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Multiplex_Generation m1 : 4|4@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Klima m3 : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_ABS m3 : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Verbauliste_Motor m3 : 0|1@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Multiplex_Derivat m1 : 0|4@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Multiplex_Sprachvariante m0 : 0|8@1+ (1,0) [0|0] "" XXX + SG_ Kombi_Multiplex_Reifenumfang m2 : 0|12@1+ (1,0) [0|4095] "mm" XXX + +BO_ 1056 Kombi_2: 8 XXX + SG_ Frei_Kombi_2_2 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ Fehlerstatus_Kl__58_s : 55|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_58s__Kombi_2_ : 48|7@1+ (1,0) [0|100] "%" XXX + SG_ Fehlerstatus_Kl__58_d : 47|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_58d__Kombi_2_ : 40|7@1+ (1,0) [0|100] "%" XXX + SG_ Kuehlmitteltemp__4_1__Kombi_2_ : 32|8@1+ (0.75,-48) [-48|142.5] "C" XXX + SG_ Oeltemperatur_4_1 : 24|8@1+ (1,-60) [-60|194] "C" XXX + SG_ Aussentemp__ungefiltert_4_1__Ko : 16|8@1+ (0.5,-50) [-50|77] "C" XXX + SG_ Aussentemperatur_gefiltert : 8|8@1+ (0.5,-50) [-50|77] "C" XXX + SG_ Fehlerspeichereintrag__Kombi_ : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Kombi_2_1 : 4|3@1+ (1,0) [0|0] "" XXX + SG_ Anhaenger_erkannt : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerst__Kuehlmitteltemp__4_1 : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerstatus_Oeltemperatur_4_1 : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerstatus_Aussentemp__4_1 : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 800 Kombi_1: 8 XXX + SG_ Frei_Kombi_1_3 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ Angezeigte_Geschwindigkeit : 46|10@1+ (0.32,0) [0|325] "km/h" XXX + SG_ Blinker_rechts_4_1 : 45|1@1+ (1,0) [0|0] "" XXX + SG_ Blinker_links_4_1 : 44|1@1+ (1,0) [0|0] "" XXX + SG_ Gesetzte_Zeitluecke__Kombi_1_ : 43|1@1+ (1,0) [0|0] "" XXX + SG_ ADR_Summer_abgeschaltet : 42|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Kombi_1_2 : 40|2@1+ (1,0) [0|0] "" XXX + SG_ Geschwindigkeit__Kombi_1_ : 25|15@1+ (0.01,0) [0|326] "km/h" XXX + SG_ Signalquelle_Geschwindigkeit_4_ : 24|1@1+ (1,0) [0|0] "" XXX + SG_ Tankwarnung : 23|1@1+ (1,0) [0|0] "" XXX + SG_ Tankinhalt : 16|7@1+ (1,0) [0|126] "l" XXX + SG_ Tankstop : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Kombi_1_7 : 12|3@1+ (1,0) [0|0] "" XXX + SG_ Kombi_im_Stellgliedtest : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Ladekontroll_Lampe__Kombi_ : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Bremsinfo : 8|2@1+ (1,0) [0|0] "" XXX + SG_ Vorgluehlampe__Kombi_1_ : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Tankwarnlampe : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Heissleuchten_Vorwarnung : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Kuehlmittelmangel : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Dynamische_Oeldruckwarnung : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Oeldruck : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerstatus_Tank : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Fahrertuer_4_1 : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1504 Klima_1: 8 XXX + SG_ Aussentemp__ungef__Sto_f__4_1 : 56|8@1+ (0.5,-50) [-50|77] "C" XXX + SG_ Fehlerspeichereintrag__Klima_ : 55|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Klima_1_5 : 50|5@1+ (1,0) [0|0] "" XXX + SG_ AC_Schalter : 49|1@1+ (1,0) [0|0] "" XXX + SG_ Temperatureinheit : 48|1@1+ (1,0) [0|0] "" XXX + SG_ Kuehlerluefteransteuerung__Klim : 40|8@1+ (0.4,0) [0|101.6] "%" XXX + SG_ Geblaeselast_4_1 : 32|8@1+ (0.4,0) [0|101.6] "%" XXX + SG_ Kompressorlast : 24|8@1+ (0.25,0) [0|63.5] "Nm" XXX + SG_ Klimadrucksignal__Klima_1_ : 16|8@1+ (0.2,0) [0|50.8] "bar" XXX + SG_ Aussentemp__ungef__4_1__Klima_1 : 8|8@1+ (0.5,-50) [-50|77] "C" XXX + SG_ Kaeltemitteldruck_veraltet : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Kompressormoment_veraltet_4_1 : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Keine_Heizleistg_gewuenscht_4_1 : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Kompressorzustand__4_1_ : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Heizbare_Frontscheibe : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Heizbare_Heckscheibe : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Fahrerwunsch_Zuheizer : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Drehzahlanhebung : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 906 GRA_Neu: 4 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ GRA_Hauptschalt : 8|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Abbrechen : 9|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Down_kurz : 10|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Up_kurz : 11|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Down_lang : 12|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Up_lang : 13|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Fehler_Bed : 14|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Kodierinfo : 15|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Neu_Setzen : 16|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Recall : 17|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Sender : 18|2@1+ (1,0) [0|3] "" XXX + SG_ COUNTER : 20|4@1+ (1,0) [0|15] "" XXX + SG_ GRA_Tip_Down : 24|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Tip_Up : 25|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Zeitluecke : 26|2@1+ (1,0) [0|3] "" XXX + SG_ GRA_Sta_Limiter : 28|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Typ_Hauptschalt : 29|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Sportschalter : 30|1@1+ (1,0) [0|1] "" XXX + SG_ GRA_Fehler_Tip : 31|1@1+ (1,0) [0|1] "" XXX + +BO_ 904 GRA: 3 XXX + SG_ Checksumme_GRA_alt : 16|8@1+ (1,0) [0|0] "" XXX + SG_ Frei_GRA_alt : 15|1@1+ (1,0) [0|0] "" XXX + SG_ GRA_alt__ADR_Bedienteil_Fehler : 14|1@1+ (1,0) [0|0] "" XXX + SG_ GRA_alt__ADR_beschleunigen : 13|1@1+ (1,0) [0|0] "" XXX + SG_ GRA_alt__ADR_verzoegern : 12|1@1+ (1,0) [0|0] "" XXX + SG_ GRA_alt__ADR___Tipschalter__Wie : 11|1@1+ (1,0) [0|0] "" XXX + SG_ GRA_alt__ADR___Tipschalter__Set : 10|1@1+ (1,0) [0|0] "" XXX + SG_ GRA_alt__ADR___Tipschalter__Aus : 9|1@1+ (1,0) [0|0] "" XXX + SG_ GRA_alt__ADR___Hauptschalter : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_GRA_alt : 0|8@1+ (1,0) [0|255] "" XXX + +BO_ 1352 Getriebe_4: 3 XXX + SG_ Testparameter_2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ Testparameter_1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ Waehlhebelausleuchtung : 4|4@1+ (1,0) [0|0] "" XXX + SG_ Frei_Getriebe_4_1 : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Testfreigabeflag : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Handbremserinnerung_s_Lampe : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Shiftlock_Getriebe_4 : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1344 Getriebe_2: 8 XXX + SG_ eingelegte_Fahrstufe : 60|4@1+ (1,0) [0|0] "" XXX + SG_ Ganganzeige_Kombi___Getriebe_Va : 56|4@1+ (1,0) [0|15] "" XXX + SG_ Fehlerlampe_f_r_Kupplung_bei_VL : 55|1@1+ (1,0) [0|0] "" XXX + SG_ Anforderung_Kriechadaption : 54|1@1+ (1,0) [0|0] "" XXX + SG_ ECO_Anzeige__4_1_ : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Shift_Lock_Lampe : 52|1@1+ (1,0) [0|0] "" XXX + SG_ Unterdrueckung_von_Warnungen : 51|1@1+ (1,0) [0|0] "" XXX + SG_ Gong : 50|1@1+ (1,0) [0|0] "" XXX + SG_ Starter_wird_angesteuert : 49|1@1+ (1,0) [0|0] "" XXX + SG_ Hochschaltlampe : 48|1@1+ (1,0) [0|0] "" XXX + SG_ Synchronisationszeit : 40|8@1+ (20,0) [0|5080] "ms" XXX + SG_ invertierte_Synchronisations_Wu : 32|8@1+ (25,0) [0|6350] "U/min" XXX + SG_ Synchronisations_Wunschdrehzahl : 24|8@1+ (25,0) [0|6350] "U/min" XXX + SG_ Gradientenbegrenzung : 16|8@1+ (10,0) [0|2540] "Nm/s" XXX + SG_ Leerlaufsolldrehzahl__Getriebe : 8|8@1+ (10,0) [0|2540] "U/min" XXX + SG_ Zahler_Getriebe_2 : 4|4@1+ (1,0) [0|15] "" XXX + SG_ Zwischengasflag : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Ecomatic__4_1_ : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Schubabschaltunterstuetzung : 1|1@1+ (1,0) [0|0] "" XXX + SG_ LFR_Adaption_Freigabeflag : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1088 Getriebe_1: 8 Transmission + SG_ GE1_Schaltung : 0|1@1+ (1,0) [0|1] "" Gateway + SG_ GE1_Sta_Schutz : 1|1@1+ (1,0) [0|1] "" Motor + SG_ GE1_Klimakompr : 2|1@1+ (1,0) [0|1] "" Motor + SG_ GE1_WK : 3|2@1+ (1,0) [0|3] "" Gateway + SG_ GE1_StSt_Info : 5|2@1+ (1,0) [0|3] "" Gateway + SG_ GE1_EGS_Anf : 7|1@1+ (1,0) [0|1] "" Motor + SG_ GE1_Zielgang : 8|4@1+ (1,0) [0|15] "" Gateway + SG_ GE1_Wahl_Pos : 12|4@1+ (1,0) [0|15] "" Gateway + SG_ GE1_Mrad_Mkurb : 16|8@1+ (0.1,0) [0|25.4] "" Gateway + SG_ GE1_Soll_Mo : 24|8@1+ (0.39,0) [0|99.06] "%" Motor + SG_ GE1_Fahrwistd : 32|8@1+ (0.249,-31.623) [-31.623|31.623] "" Gateway + SG_ GE1_Notlauf : 40|4@1+ (1,0) [0|15] "" Gateway + SG_ GE1_Kuehlung : 44|2@1+ (1,0) [0|3] "" Gateway + SG_ GE1_Sta_OBD : 47|1@1+ (1,0) [0|1] "" Motor + SG_ GE1_LaunchControl : 48|1@1+ (1,0) [0|1] "" ESP + SG_ GE1_Infobit : 49|1@1+ (1,0) [0|1] "" Gateway + SG_ GE1_SleepInd : 50|1@1+ (1,0) [0|1] "" Gateway + SG_ COUNTER : 51|4@1+ (1,0) [0|15] "" Gateway + SG_ GE1_Fehlereintr : 55|1@1+ (1,0) [0|1] "" Gateway + SG_ GE1_WaVerl_Mo : 56|8@1+ (0.39,0) [0|99.06] "%" Motor + +BO_ 912 Gate_Komf_1: 8 XXX + SG_ GK1_Sta_RDK_Warn : 0|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Anhaen : 1|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Licht1 : 2|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Licht3 : 3|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Tuerkont : 4|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Li_vorn : 5|1@1+ (1,0) [0|1] "" XXX + SG_ LIA_Standlicht : 6|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_SleepAckn : 7|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_CharismaModus : 8|4@1+ (1,0) [0|15] "" XXX + SG_ GK1_SamFktNr : 12|4@1+ (1,0) [0|15] "" XXX + SG_ GK1_Fa_Tuerkont : 16|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_RueckfahrSch : 17|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_ELV_verrieg : 18|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Kessy_2 : 19|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Stdhzg : 20|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_SH_Verbau : 21|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_ParkFrontWi : 22|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_KW_Warm : 23|1@1+ (1,0) [0|1] "" XXX + SG_ BCM_Remotestart_Betrieb : 24|1@1+ (1,0) [0|1] "" XXX + SG_ BCM_Offroad_Taster : 25|1@1+ (1,0) [0|1] "" XXX + SG_ BSK_HL_geoeffnet : 26|1@1+ (1,0) [0|1] "" XXX + SG_ BSK_HR_geoeffnet : 27|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Rueckfahr : 28|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BrLi_links : 29|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BrLi_rechts : 30|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BrLi_mitte : 31|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BLS_ILM : 32|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_EDC_ILM : 33|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Blinker_li : 34|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Blinker_re : 35|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_def_P_verr : 36|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_LS1_Fernlicht : 37|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Licht2 : 38|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_LSM : 39|1@1+ (1,0) [0|1] "" XXX + SG_ WI1_Front_Wasch : 40|1@1+ (1,0) [0|1] "" XXX + SG_ BSK_BT_geoeffnet : 41|1@1+ (1,0) [0|1] "" XXX + SG_ BCM_CV_Taster : 42|1@1+ (1,0) [0|1] "" XXX + SG_ BSK_HD_Hauptraste : 43|1@1+ (1,0) [0|1] "" XXX + SG_ BSK_Tankklappe : 44|1@1+ (1,0) [0|1] "" XXX + SG_ EV1_Anf_Klemme_50 : 45|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Anhaenger : 46|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BrLi_Anhaen : 47|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Abblendlicht : 48|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Fernlicht : 49|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Wischer_vorn : 50|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_ILM_F_1 : 51|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Abbl_VL_def : 52|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Abbl_VR_def : 53|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Blink_Autob : 54|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Warnblk_Status : 55|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_SH_laeuft : 56|1@1+ (1,0) [0|1] "" XXX + SG_ SH1_ein_Wasserpumpe : 57|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Nebel_ein : 58|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Bremslicht : 59|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Anh_abgesteckt : 60|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_AnhKonLamp : 61|1@1+ (1,0) [0|1] "" XXX + SG_ LDS_Stellung_AFL : 62|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_SH_Zusatzfkt : 63|1@1+ (1,0) [0|1] "" XXX + + +BO_ 1340 Fahrwerk_1: 1 XXX + SG_ Frei_Fahrwerk_1_2 : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Fahrwerk_1_1 : 6|2@1+ (1,0) [0|0] "" XXX + SG_ Einstellung_Fahrwerkdaempfung_4 : 4|3@1+ (1,0) [0|7] "" XXX + SG_ Ansteuererung_Fahrzeugniveau : 0|4@1+ (1,0) [0|15] "" XXX + +BO_ 1482 EPB_2: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ EPB_Status : 12|2@1+ (1,0) [0|3] "" XXX + +BO_ 1472 EPB_1: 8 XXX + SG_ COUNTER : 0|4@1+ (1,0) [0|15] "" XXX + SG_ EP1_Fehler_Sta : 4|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ EP1_Sta_EPB : 6|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Sta_Schalter : 7|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Spannkraft : 8|5@1+ (1,0) [0|30] "Unit_KiloNewto" XXX + SG_ EP1_Schalterinfo : 13|2@1+ (1,0) [0|3] "" XXX + SG_ EP1_Sta_NWS : 15|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Neig_winkel : 16|8@1+ (1,-128) [-128|127] "Unit_PerCentOfForceOfGravi" XXX + SG_ EP1_Verzoegerung : 24|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" XXX + SG_ EP1_Fehlereintr : 32|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Freigabe_Ver : 33|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_AutoHold_zul : 34|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_AutoHold_aktiv : 35|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_SleepInd : 36|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Status_Kl_15 : 37|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Lampe_AutoP : 38|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Bremslicht : 39|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Warnton1 : 40|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Warnton2 : 41|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_AnfShLock : 42|1@1+ (1,0) [0|1] "" XXX + SG_ EPB_Autoholdlampe : 43|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_QualNeigWi : 44|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_KuppModBer : 45|2@1+ (1,0) [0|3] "" XXX + SG_ EP1_HydrHalten : 47|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Fkt_Lampe : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EP1_Warnton : 49|1@1+ (1,0) [0|1] "" XXX + SG_ EP1_Fehler_BKL : 50|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EP1_Fehler_gelb : 51|1@1+ (1,0) [0|1] "" XXX + SG_ EP1__Text : 52|4@1+ (1,0) [0|8] "" Vector__XXX + SG_ CHECKSUM : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 1326 Diag_Lenkhilfe: 3 XXX + SG_ Werkstattcode__Diag_ : 16|8@1+ (1,0) [0|0] "" XXX + SG_ Multiplex_Signal__Diag_ : 13|3@1+ (1,0) [0|7] "" XXX + SG_ Befehl_Sensorcodierung_Lenkhilf : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Befehl_Kennliniencodierung_Lenk : 8|4@1+ (1,0) [0|0] "" XXX + SG_ Befehl_Fehlerspeicher_loeschen : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 1432 Daempfer_1: 2 XXX + SG_ Frei_Daempfer_1_4 : 12|4@1+ (1,0) [0|0] "" XXX + SG_ Textbits_Daempfer : 8|4@1+ (1,0) [0|0] "" XXX + SG_ Fehlerspeicherbit__Daempfer_1_ : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Systemstatus__Daempfer_1_ : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Daempfer_1_3 : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Status_CDC_Taster : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Daempfer_1_2 : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Status_Daempferregelung_4_1 : 0|3@1+ (1,0) [0|7] "" XXX + +BO_ 1392 BSG_Last: 4 XXX + SG_ Klimaanlage_abschalten : 31|1@1+ (1,0) [0|0] "" XXX + SG_ Sitzbelueftung_abschalten : 30|1@1+ (1,0) [0|0] "" XXX + SG_ Wischwasserheizung_abschalten : 29|1@1+ (1,0) [0|0] "" XXX + SG_ Lenkradheizung_abschalten : 28|1@1+ (1,0) [0|0] "" XXX + SG_ Heizbare_Sitze_abschalten : 27|1@1+ (1,0) [0|0] "" XXX + SG_ Heizbare_Aussenspiegel_abschalt : 26|1@1+ (1,0) [0|0] "" XXX + SG_ Heizbare_Frontscheibe_abschalte : 25|1@1+ (1,0) [0|0] "" XXX + SG_ Heizbare_Heckscheibe_abschalten : 24|1@1+ (1,0) [0|0] "" XXX + SG_ Batteriespannung_Bordnetzbatter : 16|8@1+ (0.05,5) [5|17.7] "V" XXX + SG_ Motorhaubenkontakt : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Leuchtweitenregulierung : 14|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerspeichereintrag__BSG_Last : 13|1@1+ (1,0) [0|0] "" XXX + SG_ Zustand_der_Starterbatterie : 11|2@1+ (1,0) [0|0] "" XXX + SG_ Zustand_der_Bordnetzbatterie : 9|2@1+ (1,0) [0|0] "" XXX + SG_ LL_Drehzahlanhebung : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_L : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_BSG_Last_1_1 : 4|3@1+ (1,0) [0|0] "" XXX + SG_ ZAS_Klemme_50 : 3|1@1+ (1,0) [0|0] "" XXX + SG_ ZAS_Klemme_X : 2|1@1+ (1,0) [0|0] "" XXX + SG_ ZAS_Klemme_15 : 1|1@1+ (1,0) [0|0] "" XXX + SG_ ZAS_Klemme_S : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1136 BSG_Kombi: 5 XXX + SG_ Frei_BSG_Kombi_1_3 : 36|4@1+ (1,0) [0|0] "" XXX + SG_ Ruecksitzlehne_HR_verr__4_1 : 35|1@1+ (1,0) [0|0] "" XXX + SG_ Ruecksitzlehne_HL_verr__4_1 : 34|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerlampe_Lenkhilfe_veraltet : 33|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerlampe_Lenkhilfe__BSG_Komb : 32|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerstatus_Kl__58s : 31|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_58s__BSG_Kombi_ : 24|7@1+ (1,0) [0|100] "%" XXX + SG_ Fehlerstatus_Kl__58d : 23|1@1+ (1,0) [0|0] "" XXX + SG_ Klemme_58d__BSG_Kombi_ : 16|7@1+ (1,0) [0|100] "%" XXX + SG_ Unterspannung : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_BSG_Kombi_1_2 : 14|1@1+ (1,0) [0|0] "" XXX + SG_ Heckdeckel_geoeffnet : 13|1@1+ (1,0) [0|0] "" XXX + SG_ Motorhaube_geoeffnet : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Tuer_hinten_rechts_geoeffnet : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Tuer_hinten_links_geoeffnet : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Beifahrertuer_geoeffnet : 9|1@1+ (1,0) [0|0] "" XXX + SG_ Fahrertuer_geoeffnet : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Lade_Kontrollampe : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_BSG_Kombi_1_1 : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Rueckfahrlicht : 5|1@1+ (1,0) [0|0] "" XXX + SG_ DWA_Akku : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Warnblink_Mode : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Anhaenger_Kontrollampe : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Blinker_rechts_Kontrollampe : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Blinker_links_Kontrollampe : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 424 Bremse_6: 3 XXX + SG_ Checksumme_Bremse_6 : 16|8@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_Bremse_6 : 12|4@1+ (1,0) [0|15] "" XXX + SG_ Status_Bremsdruck__Bremse_6__du : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Bremse_6_1 : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Bremsdruck__Bremse_6_ : 0|10@1+ (0.3255,-40) [-40|293] "bar" XXX + +BO_ 1192 Bremse_5: 8 XXX + SG_ CHECKSUM : 56|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 52|4@1+ (1,0) [0|15] "" XXX + SG_ BR5_ECD_Lampe : 51|1@1+ (1,0) [0|0] "" XXX + SG_ BR5_ZT_Rueckk_Umsetz : 48|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Anhi_Sta : 40|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Rollenmodus_Deactiveieren : 34|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Sign_Druck : 31|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Sta_Druck : 30|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Druckvalid : 29|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Stillstand : 28|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Bremsdruck : 16|12@1+ (0.1,0) [0|250] "bar" XXX + SG_ BR5_Vorzeichen : 15|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Sta_Gierrate : 14|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Giergeschw : 0|14@1+ (0.01,0) [0|100] "Grad/sec" XXX + SG_ BR5_ANB_CM_Rueckk_Umsetz : 49|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_HDC_bereit : 50|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Stat_FallBack_eBKV : 35|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Anforderung_EPB : 36|2@1+ (1,0) [0|3] "" XXX + SG_ ESP_Autohold_active : 38|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Autohold_Standby : 39|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Anhi_akt : 41|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_v_Ueberw : 42|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Bremslicht : 43|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Notbremsung : 44|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_Fahrer_tritt_ZBR_Schw : 45|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_AWV2_Bremsruck : 46|1@1+ (1,0) [0|1] "" XXX + SG_ BR5_AWV2_Fehler : 47|1@1+ (1,0) [0|1] "" XXX + +BO_ 672 Bremse_4: 3 XXX + SG_ Frei_Bremse_4_1 : 17|7@1+ (1,0) [0|0] "" XXX + SG_ Einheit_Kupplungssteifigkeit : 16|1@1+ (1,0) [0|0] "" XXX + SG_ ABS_Vorgabewert_hinten_Kupplung : 8|8@1+ (0.7874,0) [0|100] "%" XXX + SG_ ABS_Vorgabewert_mitte_Kupplungs : 0|8@1+ (3,-381) [-381|378] "Nm/min" XXX + +BO_ 1184 Bremse_3: 8 XXX + SG_ Radgeschw__HR_4_1 : 49|15@1+ (0.01,0) [0|326] "km/h" XXX + SG_ Frei_Bremse_3_4 : 48|1@1+ (1,0) [0|0] "" XXX + SG_ Radgeschw__HL_4_1 : 33|15@1+ (0.01,0) [0|326] "km/h" XXX + SG_ Frei_Bremse_3_3 : 32|1@1+ (1,0) [0|0] "" XXX + SG_ Radgeschw__VR_4_1 : 17|15@1+ (0.01,0) [0|326] "km/h" XXX + SG_ Frei_Bremse_3_2 : 16|1@1+ (0.01,0) [0|325] "km/h" XXX + SG_ Radgeschw__VL_4_1 : 1|15@1+ (0.01,0) [0|326] "km/h" XXX + SG_ Frei_Bremse_3_1 : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1440 Bremse_2: 8 XXX + SG_ gemessene_Querbeschleunigung : 63|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Bremse_2_2 : 62|1@1+ (1,0) [0|0] "" XXX + SG_ Impulszahl : 56|6@1+ (1,0) [0|63] "" XXX + SG_ Fehlerstatus_Wegimpulse_4_1 : 55|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Bremse_2_5 : 54|1@1+ (1,0) [0|0] "" XXX + SG_ Warnlampe_DDS : 53|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerspeichereintrag_Bremse : 52|1@1+ (1,0) [0|0] "" XXX + SG_ Wegimpulszaehlerstatus : 51|1@1+ (1,0) [0|0] "" XXX + SG_ Wegimpulse_Vorderachse : 40|11@1+ (1,0) [0|2047] "" XXX + SG_ Zeitstempel : 24|16@1+ (1,0) [0|65535] "tics" XXX + SG_ mittlere_Raddrehzahl__Bremse_2 : 9|15@1+ (0.002,0) [0|65.278] "U/sec" XXX + SG_ Querbeschl__TimerTic M : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Timer m1 : 0|8@1+ (0.04,0) [0|10.2] "usec" XXX + SG_ Querbeschleunigung m0 : 0|8@1+ (0.01,-1.27) [-1.27|1.27] "g" XXX + +BO_ 416 Bremse_1: 8 ABS + SG_ BR1_ASR_Anf : 0|1@1+ (1,0) [0|1] "" Motor + SG_ BR1_MSR_Anf M : 1|1@1+ (1,0) [0|1] "" Motor + SG_ BR1_ABS_Brems : 2|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_EDS_Ongr : 3|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_ESP_Ongr : 4|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_ASR_Ongr : 5|2@1+ (1,0) [0|3] "" Transmission + SG_ BR1_EBV_Ongr : 7|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Lampe_ABS : 8|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Lampe_ASR : 9|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Lampe_BK : 10|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Lichtschalt : 11|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_StaDruckschw : 12|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_MAD : 13|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Sta_MAD : 14|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Diagnose : 15|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_BKV_active : 16|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Rad_kmh : 17|15@1+ (0.01,0) [0|326.39] "km/h" XXX + SG_ BR1_ASRMo_sl : 32|8@1+ (0.39,0) [0|99.06] "%" Motor + SG_ BR1_ASRMo_fa m0 : 40|8@1+ (0.39,0) [0|99.06] "%" Motor + SG_ BR1_MSR_Mo_inv m1 : 40|8@1+ (-0.39,99.45) [0|99.06] "%" Motor + SG_ BR1_MSR_Mo : 48|8@1+ (0.39,0) [0|99.06] "%" Motor + SG_ BR1_Zaehler : 56|4@1+ (1,0) [0|15] "" XXX + SG_ BR1_ASR_ESP : 60|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_ESPASR_passive : 61|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Sta_ESP : 62|1@1+ (1,0) [0|1] "" XXX + SG_ BR1_Ersatz_Kmh : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 680 Bremsbooster_1: 3 XXX + SG_ Fehlerspeichereintrag_Booster : 23|1@1+ (1,0) [0|0] "" XXX + SG_ Loseschalter_unplausibel_Boost : 22|1@1+ (1,0) [0|0] "" XXX + SG_ Position_Standby : 21|1@1+ (1,0) [0|0] "" XXX + SG_ ADR_Relais_ge_ffnet : 20|1@1+ (1,0) [0|0] "" XXX + SG_ Status_Bremsbooster_Steuerung : 19|1@1+ (1,0) [0|0] "" XXX + SG_ Bremsbooster_verf_gbar : 18|1@1+ (1,0) [0|0] "" XXX + SG_ Eingriff_Bremsbooster : 17|1@1+ (1,0) [0|0] "" XXX + SG_ Bremseingriff_Fahrer : 16|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Bremsbooster_1_1 : 12|4@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_Booster_1 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Checksumme_Booster_1 : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 1400 BatMan_1: 1 XXX + SG_ Fehlerspeichereintrag__BatMan_ : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Leistungsrelais : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Messung_Starterleitung : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Zustand_Starterleitung : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Umschaltrelais_Bordnetzbatterie : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Ladung_Starterbatterie : 1|2@1+ (1,0) [0|0] "" XXX + SG_ Startmodus : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 704 Allrad_1: 5 XXX + SG_ Kupplungssteifigkeit_Hinten__Is : 32|8@1+ (0.7874,0) [0|100] "%" XXX + SG_ Fehlerspeichereintrag_Allrad_1 : 31|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Allrad_1_1 : 26|5@1+ (1,0) [0|0] "" XXX + SG_ Schaltung_Vorwarnung : 25|1@1+ (1,0) [0|0] "" XXX + SG_ Schaltung_aktiv__Allrad_1_ : 24|1@1+ (1,0) [0|0] "" XXX + SG_ Ganginfo__PNG_ : 20|4@1+ (1,0) [0|0] "" XXX + SG_ PNG_Anzeige_blinkend : 19|1@1+ (1,0) [0|0] "" XXX + SG_ PNG_Status_4_1 : 16|3@1+ (1,0) [0|0] "" XXX + SG_ Kupplungssteifigkeit_Mitte__Ist : 8|8@1+ (3,-381) [-381|378] "Nm/min" XXX + SG_ Einheit_der_Kupplungssteifigkei : 7|1@1+ (1,0) [0|0] "" XXX + SG_ Geschwindigkeitsbegrenzung : 6|1@1+ (1,0) [0|0] "" XXX + SG_ Allrad_Warnlampe : 5|1@1+ (1,0) [0|0] "" XXX + SG_ Notlauf : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Kupplung_komplett_offen : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Fehlerstatus_Kupplungssteifigke : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Ubertemperaturschutz__Allrad_1_ : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Fehler_Allrad_Kupplung : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 1360 Airbag_2: 2 XXX + SG_ OOP_Beifahrer : 14|2@1+ (1,0) [0|0] "" XXX + SG_ OOP_Fahrer : 12|2@1+ (1,0) [0|0] "" XXX + SG_ Belegungserkennung_hinten_mitte : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Belegungserkennung_hinten_recht : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Belegungserkennung_hinten_links : 9|1@1+ (1,0) [0|0] "" XXX + SG_ Belegungserkennung_Beifahrersit : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Checksumme_Airbag_2__reserviert : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 80 Airbag_1: 4 XXX + SG_ CHECKSUM : 24|8@1+ (1,0) [0|0] "" XXX + SG_ COUNTER : 20|4@1+ (1,0) [0|15] "" XXX + SG_ Fehlerspeichereintrag : 19|1@1+ (1,0) [0|0] "" XXX + SG_ Frei_Airbag_1_2 : 18|1@1+ (1,0) [0|0] "" XXX + SG_ Airbag_im_Stellgliedtest : 17|1@1+ (1,0) [0|0] "" XXX + SG_ Airbag_in_Diagnose : 16|1@1+ (1,0) [0|0] "" XXX + SG_ Gurtwarnung_Beifahrer : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Gurtschalter_Beifahrer : 14|1@1+ (1,0) [0|0] "" XXX + SG_ Gurtwarnung_Fahrer : 13|1@1+ (1,0) [0|0] "" XXX + SG_ Gurtschalter_Fahrer : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Airbag_Systemfehler : 11|1@1+ (1,0) [0|0] "" XXX + SG_ Kindersitzerkennung : 10|1@1+ (1,0) [0|0] "" XXX + SG_ Airbag_deaktiviert : 9|1@1+ (1,0) [0|0] "" XXX + SG_ Airbag_Lampe : 8|1@1+ (1,0) [0|0] "" XXX + SG_ Crash_Intensitaet : 5|3@1+ (1,0) [0|111] "B" XXX + SG_ Rollover : 4|1@1+ (1,0) [0|0] "" XXX + SG_ Seiten_Crash_Beifahrer : 3|1@1+ (1,0) [0|0] "" XXX + SG_ Seiten_Crash_Fahrer : 2|1@1+ (1,0) [0|0] "" XXX + SG_ Heck_Crash : 1|1@1+ (1,0) [0|0] "" XXX + SG_ Front_Crash : 0|1@1+ (1,0) [0|0] "" XXX + +BO_ 864 ADR_System: 8 XXX + SG_ S_Checksumme_ADR_1 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ S_Frei_ADR_1_1 : 52|4@1+ (1,0) [0|0] "" XXX + SG_ S_Zeitluecke_gemessen : 48|4@1+ (1,0) [0|15] "" XXX + SG_ S_Fehlerspeichereintrag_ADR : 47|1@1+ (1,0) [0|0] "" XXX + SG_ S_Fehlerspeichereintrag_Bremsbo : 46|1@1+ (1,0) [0|0] "" XXX + SG_ S_ADR_Relais_geoeffnet : 45|1@1+ (1,0) [0|0] "" XXX + SG_ S_Bremsbooster_Status : 43|2@1+ (1,0) [0|0] "" XXX + SG_ S_Eingriff_Bremsbooster : 42|1@1+ (1,0) [0|0] "" XXX + SG_ S_Loeseschalter_unplausibel : 41|1@1+ (1,0) [0|0] "" XXX + SG_ S_Bremseingriff_Fahrer : 40|1@1+ (1,0) [0|0] "" XXX + SG_ S_Anzeige_Sensor_blind : 39|1@1+ (1,0) [0|0] "" XXX + SG_ S_Ansteuerung_optischer_Fahrerh : 38|1@1+ (1,0) [0|0] "" XXX + SG_ S_Ansteuerung_Gong_2 : 37|1@1+ (1,0) [0|0] "" XXX + SG_ S_Ansteuerung_Gong_1 : 36|1@1+ (1,0) [0|0] "" XXX + SG_ S_Schaltaufforderung : 34|2@1+ (1,0) [0|0] "" XXX + SG_ S_Anzeige_Prioritaet : 33|1@1+ (1,0) [0|0] "" XXX + SG_ S_Anzeige_Zeitluecke : 32|1@1+ (1,0) [0|0] "" XXX + SG_ S_Wunschgeschwindigkeit : 24|8@1+ (1,0) [0|254] "km/h" XXX + SG_ S_Objekt_erfasst : 22|2@1+ (1,0) [0|0] "" XXX + SG_ S_Gesetzte_Zeitluecke__ADR_1_ : 18|4@1+ (1,0) [0|15] "" XXX + SG_ S_Synchronisation_Bremsbooster : 17|1@1+ (1,0) [0|0] "" XXX + SG_ S_Momentenanforderung_Freigabe : 16|1@1+ (1,0) [0|0] "" XXX + SG_ S_Verhinderung_Schubabschaltung : 15|1@1+ (1,0) [0|0] "" XXX + SG_ S_Status_ADR_1__S_ : 13|2@1+ (1,0) [0|0] "" XXX + SG_ S_Fehler_ADR_1__S_ : 12|1@1+ (1,0) [0|0] "" XXX + SG_ S_Zaehler_ADR_1 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ S_Momentenanforderung_ADR : 0|8@1+ (0.39,0) [0|99] "MDI" XXX + +BO_ 608 ADR_2: 4 XXX + SG_ Frei_ADR_2_2 : 27|5@1+ (1,0) [0|0] "" XXX + SG_ Anforderung_Bremsdruck : 16|11@1+ (0.0625,0) [0|127.9375] "bar" XXX + SG_ Frei_ADR_2_1 : 14|2@1+ (1,0) [0|0] "" XXX + SG_ Relais_Test_Fehler : 13|1@1+ (1,0) [0|0] "" XXX + SG_ Standby : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_ADR_2 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Checksumme_ADR_2 : 0|8@1+ (1,0) [0|0] "" XXX + +BO_ 1324 ADR_1: 8 XXX + SG_ Checksumme_ADR_1 : 56|8@1+ (1,0) [0|0] "" XXX + SG_ Frei_ADR_1_5 : 52|4@1+ (1,0) [0|0] "" XXX + SG_ Zeitluecke_gemessen : 48|4@1+ (1,0) [0|15] "" XXX + SG_ Fehlerspeichereintrag_ADR : 47|1@1+ (1,0) [0|0] "" XXX + SG_ Reserviert_ADR_1_1 : 40|7@1+ (1,0) [0|0] "" XXX + SG_ Anzeige_Sensor_blind : 39|1@1+ (1,0) [0|0] "" XXX + SG_ Ansteuerung_optischer_Fahrerhin : 38|1@1+ (1,0) [0|0] "" XXX + SG_ Ansteuerung_Gong_2 : 37|1@1+ (1,0) [0|0] "" XXX + SG_ Ansteuerung_Gong_1 : 36|1@1+ (1,0) [0|0] "" XXX + SG_ Schaltaufforderung : 34|2@1+ (1,0) [0|0] "" XXX + SG_ Anzeige_Prioritaet : 33|1@1+ (1,0) [0|0] "" XXX + SG_ Anzeige_Zeitluecke : 32|1@1+ (1,0) [0|0] "" XXX + SG_ Wunschgeschwindigkeit : 24|8@1+ (1,0) [0|254] "km/h" XXX + SG_ Objekt_erfasst : 22|2@1+ (1,0) [0|0] "" XXX + SG_ Gesetzte_Zeitluecke__ADR_1_ : 18|4@1+ (1,0) [0|15] "" XXX + SG_ Synchronisation_Bremsbooster : 17|1@1+ (1,0) [0|0] "" XXX + SG_ Momentenanforderung_Freigabe : 16|1@1+ (1,0) [0|0] "" XXX + SG_ Verhinderung_Schubabschaltung : 15|1@1+ (1,0) [0|0] "" XXX + SG_ Status_ADR_1 : 13|2@1+ (1,0) [0|0] "" XXX + SG_ Fehler_ADR_1 : 12|1@1+ (1,0) [0|0] "" XXX + SG_ Zaehler_ADR_1 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ Momentenanforderung_ADR : 0|8@1+ (0.39,0) [0|99] "MDI" XXX + +BO_ 1550 Einheiten_1: 2 XXX + SG_ MFA_v_Einheit_02 : 0|1@1+ (1,0) [0|1] "" XXX + +BO_ 872 ACC_System: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACS_Sta_ADR : 12|2@1+ (1,0) [0|3] "" XXX + SG_ ACS_ADR_Schub : 14|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_Schubabsch : 15|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_StSt_Info : 16|2@1+ (1,0) [0|3] "" XXX + SG_ ACS_MomEingriff : 18|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_Typ_ACC : 19|2@1+ (1,0) [0|3] "" XXX + SG_ ACS_FreigSollB : 23|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_Sollbeschl : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + SG_ ACS_Anhaltewunsch : 38|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_Fehler : 39|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_zul_Regelabw : 40|8@1+ (0.005,0) [0|1.265] "Unit_MeterPerSeconSquar" XXX + SG_ ACS_max_AendGrad : 48|8@1+ (0.02,0) [0.02|5.06] "Unit_MeterPerSeconSquar" XXX + +BO_ 1386 ACC_GRA_Anzeige: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ ACA_StaACC : 8|3@1+ (1,0) [0|7] "" XXX + SG_ ACA_ID_StaACC : 11|5@1+ (1,0) [0|31] "" XXX + SG_ ACA_Fahrerhinw : 16|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_AnzDisplay : 17|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Zeitluecke : 18|4@1+ (1,0) [0|15] "" XXX + SG_ ACA_V_Wunsch : 24|8@1+ (1,0) [0|255] "Unit_KiloMeterPerHour" XXX + SG_ ACA_kmh_mph : 32|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Akustik1 : 33|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Akustik2 : 34|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_PrioDisp : 35|2@1+ (1,0) [0|3] "" XXX + SG_ ACA_gemZeitl : 40|4@1+ (1,0) [0|15] "" XXX + SG_ ACA_ACC_Verz : 44|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_StaGRA : 48|3@1+ (1,0) [0|7] "" XXX + SG_ ACA_ID_StaGRA : 51|5@1+ (1,0) [0|31] "" XXX + SG_ ACA_Codierung : 56|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Tachokranz : 57|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Aend_Zeitluecke : 58|1@1+ (1,0) [0|1] "" XXX + SG_ COUNTER : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 208 Lenkhilfe_3: 6 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ LH3_BS_Spiegel : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ LH3_LM : 16|10@1+ (1,0) [0|1023] "" XXX + SG_ LH3_LMSign : 26|1@1+ (1,0) [0|1] "" XXX + SG_ LH3_LMValid : 27|1@1+ (1,0) [0|1] "" XXX + SG_ LH3_Sta_DSR : 28|4@1+ (1,0) [0|15] "" XXX + SG_ LH3_BLW : 32|12@1+ (0.15,0) [0|615] "" XXX + SG_ LH3_BLWSign : 44|1@1+ (1,0) [0|1] "" XXX + SG_ LH3_BLWValid : 45|1@1+ (1,0) [0|1] "" XXX + SG_ LH3_Lenkungstyp : 46|2@1+ (1,0) [0|3] "" XXX + +BO_ 978 Lenkhilfe_2: 7 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LH2_Geradeaus : 12|1@1+ (1,0) [0|1] "" XXX + SG_ LH2_Sta_Charisma : 13|3@1+ (1,0) [0|7] "" XXX + SG_ LH2_Sta_HCA : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LH2_Ausg_LW1 : 20|1@1+ (1,0) [0|1] "" XXX + SG_ LH2_Ausg_LW1_gue : 21|1@1+ (1,0) [0|1] "" XXX + SG_ LH2_aktLenkeingriff : 32|8@1+ (1,0) [0|255] "" XXX + +BO_ 980 PLA_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ PL1_Status_EPS : 12|4@1+ (1,0) [0|15] "" XXX + SG_ PL1_ArcAngleReq : 16|15@1+ (0.04375,0) [0|1433.55625] "Unit_DegreeOfArc" XXX + SG_ PL1_AngleReqSign : 31|1@1+ (1,0) [0|1] "" XXX + SG_ PL1_Stat_PLA_ESP : 32|4@1+ (1,0) [0|10] "" Vector__XXX + SG_ PL1_Bremsmoment : 40|13@1+ (4,0) [0|32760] "Unit_NewtoMeter" Vector__XXX + SG_ PL1_void : 53|11@1+ (1,0) [0|2047] "" XXX + +BO_ 982 APD_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ APD_Version : 12|4@1+ (1,0) [0|15] "" XXX + SG_ APD_Flags : 16|4@1+ (1,0) [0|15] "" XXX + SG_ APD_SteerRatio : 20|11@1+ (0.01,8) [8|28.47] "" XXX + SG_ APD_Wheelbase : 31|11@1+ (1,2000) [2000|4047] "mm" XXX + SG_ APD_AngleOffSet : 42|11@1+ (0.01,-10) [-10|10.47] "deg" XXX + SG_ APD_GripFactor : 53|11@1+ (0.001,0) [0|2.047] "" XXX + +BO_ 983 SNG_1: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ SNG_HandoffActive : 12|1@1+ (1,0) [0|1] "" XXX + SG_ SNG_DecelReq : 16|8@1+ (0.048,-7.968) [-7.968|4.224] "Unit_MeterPerSeconSquar" XXX + +BO_ 210 HCA_1: 5 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ HCA_Status : 12|4@1+ (1,0) [0|15] "" XXX + SG_ LM_Offset : 16|15@1+ (0.03125,0) [0|300] "cNm" XXX + SG_ LW_Offset : 16|15@1+ (0.04375,0) [0|1433.55625] "Unit_DegreeOfArc" XXX + SG_ LM_OffSign : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Vib_Freq : 32|4@1+ (4,0) [0|60] "Hz" XXX + SG_ Vib_Amp : 36|4@1+ (0.5,0) [0|7.5] "Nm" XXX + SG_ HCA_ALC_LW_KeyCipher : 32|8@1+ (1,0) [0|255] "" XXX + +BO_ 174 Bremse_9: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ BR9_Sta_ESP_PLA : 8|4@1+ (1,0) [0|15] "" XXX + SG_ COUNTER : 12|4@1+ (1,0) [0|15] "" XXX + SG_ BR9_LMOffset : 16|15@1+ (0.0003052,0) [0|9.9987] "Nm" XXX + SG_ BR9_LMOffSign : 31|1@1+ (1,0) [0|1] "" XXX + SG_ BR9_LWOffset : 32|15@1+ (0.04375,0) [0|1433.5] "deg" XXX + SG_ BR9_Sta_DSR : 48|4@1+ (1,0) [0|15] "" XXX + SG_ BR9_PLA_Abbruch : 52|3@1+ (1,0) [0|7] "" XXX + SG_ BR9_LWOffSign : 55|1@1+ (1,0) [0|1] "" XXX + +BO_ 644 Motor_Bremse: 6 XXX + SG_ MOB_Standby : 12|1@1+ (1,0) [0|1] "" XXX + SG_ MOB_Freigabe : 14|1@1+ (1,0) [0|1] "" BCM_Gateway,Bremse_MK25AESP,Gateway_separat + SG_ MOB_Anhaltewunsch : 13|1@1+ (1,0) [0|1] "" Bremse_MK25AESP,Getriebe_DQ + SG_ MOB_CHECKSUM : 0|8@1+ (1,0) [0|255] "" Bremse_MK25AESP + SG_ MOB_COUNTER : 8|4@1+ (1,0) [0|15] "" Bremse_MK25AESP + SG_ TSK_v_Begrenzung_aktiv : 15|1@0+ (1,0) [0|1] "" XXX + SG_ TSK_ax_Getriebe_01 : 40|8@1+ (0.048,0) [0|255] "m/s2" XXX + SG_ MOB_Bremsstgr : 16|11@1+ (0.048852,0) [0|100] "Unit_PerCent" Vector__XXX + SG_ MOB_Bremsmom : 27|13@1+ (4,0) [0|32760] "Unit_NewtoMeter" Bremse_MK25AESP + +BO_ 870 AWV: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ AWV_Text : 12|4@1+ (1,0) [0|14] "" Vector__XXX + SG_ AWV_1_Freigabe : 16|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_1_Prefill : 17|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_1_Parameter : 18|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AWV_only : 20|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_CityANB_Auspraegung : 21|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_Halten : 22|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ANB_Teilbremsung_Freigabe : 23|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_Status : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_Fehler : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_SU_Warnzeit : 26|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ AWV_2_SU_Bremsruck : 28|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_SU_Gong : 29|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_SU_Lampe : 30|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_Umfeldwarn : 31|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_Freigabe : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_Ruckprofil : 33|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ AWV_2_Warnton : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_Warnsymbol : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_Infoton : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_Gurtstraffer : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_Konfiguration_Menueanf : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_Konfiguration_Vorw_Menueanf : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_Konfiguration_Status : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_Konfiguration_Vorw_Status : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AWV_2_Abstandswarnung : 51|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ANB_Zielbremsung_Freigabe : 52|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ANB_CM_Anforderung : 53|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ ANB_Ziel_Teilbrems_Verz_Anf : 54|10@1+ (0.024,-20.016) [0|1023] "Unit_MeterPerSeconSquar" Vector__XXX + +BO_ 1470 LDW_Status: 8 XXX + SG_ LDW_Lernmodus_rechts : 0|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Lernmodus_links : 2|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Lernmodus : 9|3@1+ (1,0) [0|3] "" XXX + SG_ LDW_Textbits : 12|4@1+ (1,0) [0|15] "" XXX + SG_ LDW_Gong : 16|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Kameratyp : 18|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Lampe_gelb : 19|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Lampe_gruen : 20|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_SW_Warnung_links : 21|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_SW_Warnung_rechts : 22|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_KD_Fehler : 23|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_DLC : 24|8@1+ (0.01,-1.25) [-1.25|1.25] "" XXX + SG_ LDW_TLC : 32|5@1+ (0.1,0) [0|3] "" XXX + SG_ LDW_Seite_DLCTLC : 37|1@1+ (1,0) [0|1] "" XXX + SG_ LDW_Frueh_Spaet : 38|2@1+ (1,0) [0|3] "" XXX + +BO_ 428 Bremse_8: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ BR8_Sta_ACC_Anf : 12|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Verz_EPB_akt : 13|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Sta_Br_temp : 14|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Sta_Br_Druck : 15|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_HHC_Haltebestaetigung : 16|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_HHC_Signal_QBit : 17|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_MKB_ausloesbar : 20|1@1+ (1,0) [0|1] "" XXX + SG_ ESP_Haltebestaetigung : 21|1@1+ (1,0) [0|1] "" XXX + SG_ ESC_Motorstartverzeogerung : 22|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Istbeschl : 32|9@1+ (0.02,-7.22) [-7.22|2.98] "Unit_MeterPerSeconSquar" XXX + SG_ BR8_Sta_HW_BLS : 41|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_QB_LBeschl : 42|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_ESC_Mode : 43|2@1+ (1,0) [0|3] "" XXX + SG_ BR8_aktBrSyst : 45|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Fa_bremst : 46|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_StaBrSyst : 47|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Laengsbeschl : 48|10@1+ (0.03125,-16) [-15.96875|15.9375] "Unit_MeterPerSeconSquar" XXX + SG_ BR8_Sta_ADR_BR : 58|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Quattro : 59|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Sta_VerzReg : 60|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Sta_BLS : 61|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Verz_EPB : 62|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Check_EPB : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 928 Bremse_10: 8 XXX + SG_ B10_Checksumme : 0|8@1+ (1,0) [0|255] "" XXX + SG_ B10_Zaehler : 8|4@1+ (1,0) [0|15] "" XXX + SG_ B10_QB_Wegimp_VL : 12|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Wegimp_VR : 13|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Wegimp_HL : 14|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Wegimp_HR : 15|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Wegimp_VL : 16|10@1+ (1,0) [0|1000] "" XXX + SG_ B10_Wegimp_VR : 26|10@1+ (1,0) [0|1000] "" XXX + SG_ B10_Wegimp_HL : 36|10@1+ (1,0) [0|1000] "" XXX + SG_ B10_Wegimp_HR : 46|10@1+ (1,0) [0|1000] "" XXX + SG_ B10_QB_Fahrtr_VL : 56|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Fahrtr_VR : 57|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Fahrtr_HL : 58|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Fahrtr_HR : 59|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Fahrtr_VL : 60|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Fahrtr_VR : 61|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Fahrtr_HL : 62|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Fahrtr_HR : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 170 Blinkmodi_02: 8 XXX + SG_ Hazard_Switch : 20|1@1+ (1,0) [0|1] "" XXX + SG_ BM_links : 23|1@1+ (1,0) [0|1] "" XXX + SG_ BM_rechts : 24|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Turn_Exterior_Bulb_1 : 25|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Turn_Exterior_Bulb_1 : 26|1@1+ (1,0) [0|1] "" XXX + SG_ Left_Turn_Exterior_Bulb_2 : 27|1@1+ (1,0) [0|1] "" XXX + SG_ Right_Turn_Exterior_Bulb_2 : 28|1@1+ (1,0) [0|1] "" XXX + SG_ Fast_Send_Rate_Active : 37|1@1+ (1,0) [0|1] "" XXX + +BO_ 835 RDK_Status: 3 XXX + SG_ RKS_Reifen_VL : 0|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Reifen_VR : 1|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Reifen_HL : 2|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Reifen_HR : 3|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Reifen_RR : 4|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Warnung_2 : 5|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Warnung_1 : 6|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Systemfehler : 7|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Kalibrier_abgew : 8|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Druckdiff_Vorn : 9|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Druckdiff_Hinten : 10|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Befuellung_RR_low : 11|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Funkstoerung : 12|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_System_Aus : 13|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_KD_Fehler : 15|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Lampe : 16|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Ton : 17|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Gong : 18|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_RDK_Blinkbit : 19|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Teillast : 20|1@1+ (1,0) [0|1] "" XXX + +BO_ 914 Gate_Komf_2: 8 XXX + SG_ GK2_Sta_LSM : 0|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Lichtsensor : 1|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Licht1 : 2|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_VSG : 3|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Schluessel : 4|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Profil : 5|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Clima2 : 6|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_BSG4 : 7|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Kessy_4 : 8|1@1+ (1,0) [0|1] "" XXX + SG_ BS4_Gleitende_Leuchtw_Anf : 9|1@1+ (1,0) [0|1] "" XXX + SG_ BS4_GLW_Fernlicht_Anf : 10|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Blk_L_Kontrolle : 11|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Blk_R_Kontrolle : 12|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_LS_KomFehler : 14|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_LS_def : 15|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Helligkeit : 16|3@1+ (714.286,0) [0|5000.002] "Unit_Lux" XXX + SG_ GK2_VD_zu_ver : 19|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_VD_entriegelt : 20|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_VD_offen_ver : 21|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Verdeck_Anf : 22|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_VDKD_auf : 23|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Schluessel : 24|4@1+ (1,0) [0|15] "" XXX + SG_ GK2_Hardtop : 28|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_AFL_Schalter : 29|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Nebelschluss : 30|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_EM_LIN_ungueltig : 31|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Profil : 32|4@1+ (1,0) [0|15] "" XXX + SG_ GK2_Kl_StSt_Info : 36|2@1+ (1,0) [0|3] "" XXX + SG_ GK2_BSG_StSt_Info : 38|2@1+ (1,0) [0|3] "" XXX + SG_ GK2_BEM_P_Generator : 40|8@1+ (50,0) [0|12700] "Unit_Watt" XXX + SG_ GK2_BEM_Abschaltstufen : 48|3@1+ (1,0) [0|7] "" XXX + SG_ GK2_BEM_DFM : 51|5@1+ (3.225,0.025) [0.025|100] "Unit_PerCent" XXX + SG_ GK2_Kessy_StSt_Info : 56|2@1+ (1,0) [0|3] "" XXX + SG_ GK2_BEM_StSt_Info : 58|2@1+ (1,0) [0|3] "" XXX + +BO_ 954 SWA_1: 8 SWA + SG_ SWA_Textbits : 12|4@1+ (1,0) [0|15] "" XXX + SG_ SWA_Gong : 16|2@1+ (1,0) [0|3] "" XXX + SG_ SWA_Sta_passiv : 19|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Sta_aktiv : 20|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Infostufe_SWA_li : 26|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Warnung_SWA_li : 27|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Infostufe_SWA_re : 42|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_Warnung_SWA_re : 43|1@1+ (1,0) [0|1] "" XXX + SG_ SWA_KD_Fehler : 59|1@1+ (1,0) [0|1] "" XXX + +BO_ 1175 Parkhilfe_01: 8 XXX + SG_ PH_Abschaltursache : 13|3@1+ (1,0) [0|7] "" XXX + SG_ PH_Opt_Anzeige_V_ein : 16|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Opt_Anzeige_H_ein : 17|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Opt_Anz_V_Hindernis : 18|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Opt_Anz_H_Hindernis : 19|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Tongeber_V_aktiv : 20|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Tongeber_H_aktiv : 21|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Tongeber_mute : 22|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Anf_Audioabsenkung : 23|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Frequenz_hinten : 32|4@1+ (1,0) [0|15] "" XXX + SG_ PH_Lautstaerke_hinten : 36|4@1+ (1,0) [0|15] "" XXX + SG_ PH_Frequenz_vorn : 40|4@1+ (1,0) [0|15] "" XXX + SG_ PH_Lautstaerke_vorn : 44|4@1+ (1,0) [0|15] "" XXX + SG_ PH_Trigger_Bildaufschaltung : 48|1@1+ (1,0) [0|1] "" XXX + SG_ PH_StartStopp_Info : 49|2@1+ (1,0) [0|3] "" XXX + SG_ PH_Aufbauten_erk : 51|1@1+ (1,0) [0|1] "" XXX + SG_ PH_BerErk_vorn : 52|2@1+ (1,0) [0|3] "" XXX + SG_ PH_BerErk_hinten : 54|2@1+ (1,0) [0|3] "" XXX + SG_ PH_defekt : 56|1@1+ (1,0) [0|1] "" XXX + SG_ PH_gestoert : 57|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Systemzustand : 58|3@1+ (1,0) [0|7] "" XXX + SG_ PH_Display_Kundenwunsch : 61|2@1+ (1,0) [0|3] "" XXX + SG_ PH_KD_Fehler : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 1463 Bremse_11: 8 XXX + SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" XXX + SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" XXX + SG_ B11_HydHalten : 13|1@1+ (1,0) [0|1] "" XXX + SG_ B11_Br_StSt_Info : 14|2@1+ (1,0) [0|3] "" XXX + SG_ B11_OBD_Nib_VL : 16|4@1+ (1,0) [0|15] "" XXX + SG_ B11_OBD_Nib_VR : 20|4@1+ (1,0) [0|15] "" XXX + SG_ B11_OBD_Nib_HL : 24|4@1+ (1,0) [0|15] "" XXX + SG_ B11_OBD_Nib_HR : 28|4@1+ (1,0) [0|15] "" XXX + SG_ B11_EPB_Steller_akt : 32|1@1+ (1,0) [0|1] "" XXX + SG_ B11_EPB_Steller_gue : 33|1@1+ (1,0) [0|1] "" XXX + +BO_ 1500 Soll_Verbauliste_neu: 8 XXX + SG_ VL1_Motor_SG : 0|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Getr_SG : 1|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_ABS : 2|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Kombi : 3|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_LSM : 4|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Airbag : 5|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Lenkhilfe : 6|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_dyn_LWR : 7|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_res_08 : 8|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Allrad : 9|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_ADR : 10|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_ADR_getrennt : 11|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_EPB : 12|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_res_13 : 13|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Daempfer : 14|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Quersperre : 15|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_MotorSlave : 16|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_SWA : 17|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_HCA : 18|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_RKA_Plus : 19|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_PLA : 20|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_WFS_KBI : 21|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Kombi_KBI : 22|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Soll_eq_Ist : 23|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_BSG_Komf : 24|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_ZKE : 25|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TSG_FT : 26|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TSG_BT : 27|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TSG_HL : 28|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TSG_HR : 29|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Memory : 30|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Dachmodul_K : 31|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Zentralelektrik_II : 32|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_RDK : 33|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Lenksaeule : 34|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Gateway : 35|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Clima_Komf : 36|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Einparkhilfe : 37|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_PTC_Heizung : 38|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Standheiz : 39|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Verdeck : 40|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_RSE_I : 41|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_res_42 : 42|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_MDI_I : 43|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Anhaenger : 44|1@1+ (1,0) [0|1] "" SWA + SG_ VL1_Memory_BF : 45|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Easy_Entry_VF : 46|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Easy_Entry_VB : 47|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Heckdeckel : 48|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Rearview : 49|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Sonderfzg_SG : 50|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Tastenmodul : 51|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Kompass : 52|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_WFS_K : 53|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_GSM_Pager : 54|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_InfoElektronik : 55|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_DSP : 56|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_DAB : 57|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Telematik : 58|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Navigation : 59|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TV_Tuner : 60|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Neigungsmodul_I : 61|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Radio : 62|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Telefon : 63|1@1+ (1,0) [0|1] "" XXX + +BO_ 1490 Ident: 8 XXX + SG_ IDT_Mux M : 0|2@1+ (1,0) [0|2] "" XXX + SG_ IDT_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 2000 Diagnose_1: 8 XXX + SG_ DI1_VerlernZaehl : 0|8@1+ (1,0) [0|254] "" XXX + SG_ DI1_km_Stand : 8|20@1+ (1,0) [0|1048575] "Unit_KiloMeter" XXX + SG_ DI1_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" XXX + SG_ DI1_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" XXX + SG_ DI1_Tag : 39|5@1+ (1,0) [0|31] "Unit_Day" XXX + SG_ DI1_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" XXX + SG_ DI1_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" XXX + SG_ DI1_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" XXX + SG_ DI1_KM_Stand_alt : 62|1@1+ (1,0) [0|1] "" XXX + SG_ DI1_Zeit_alt : 63|1@1+ (1,0) [0|1] "" XXX + +CM_ SG_ 80 Checksumme_Airbag_1 "Checksum Airbag_1"; +CM_ SG_ 80 Zaehler_Airbag_1 "Counter Airbag_1"; + +CM_ BO_ 194 "Steering wheel angle message 1 - Contains steering angle, speed, and status information"; + +CM_ SG_ 194 LW1_LRW "Steering wheel angle (0 = straight ahead, 7FFFh = stop)"; +CM_ SG_ 194 LW1_LRW_Sign "Steering angle sign: 0=positive (left), 1=negative (right)"; +CM_ SG_ 194 LW1_Lenk_Gesch "Steering wheel angular velocity (0 = no movement, 7FFFh = max speed)"; +CM_ SG_ 194 LW1_Gesch_Sign "Angular velocity sign: 0=positive, 1=negative"; +CM_ SG_ 194 LW1_ID "Calibration ID - 0=not calibrated, 128=calibrated (PQ35/46/VW32x/VW411)"; +CM_ SG_ 194 LW1_Initquelle "Initialization source"; +CM_ SG_ 194 LW1_Status "Sensor status"; +CM_ SG_ 194 LW1_Sta_KL30 "Terminal 30 status (Kostal sensor)"; +CM_ SG_ 194 LW1_Zaehler "Free running message counter"; +CM_ SG_ 194 LW1_Kodier "Coding data (multiplex output depends on counter)"; +CM_ SG_ 194 LW1_CRC "Checksum - One's complement of 8-bit sum of bytes 1,2,3,4,6"; + +CM_ SG_ 210 LM_Offset "centiNewton-meters for ease of calculation without FP math in Panda"; +CM_ SG_ 210 Vib_Amp "Steering wheel haptic, amplitude"; +CM_ SG_ 210 Vib_Freq "Steering wheel haptic, frequency"; +CM_ SG_ 210 HCA_ALC_LW_KeyCipher "Private PQ ALC cipher byte. Valid on the private HCA_Status 8/3 path only."; +CM_ SG_ 416 BR1_ASR_Anf "ASR request to engine - requests in bytes 5 and 6 to be executed"; +CM_ SG_ 416 BR1_MSR_Anf "MSR request - when set, byte 6 contains inverse MSR torque"; +CM_ SG_ 416 BR1_ABS_Brems "ABS control active (including pressure reduction)"; +CM_ SG_ 416 BR1_EDS_Ongr "Electronic differential lock intervention"; +CM_ SG_ 416 BR1_ESP_Ongr "ESP driving dynamics control intervention"; +CM_ SG_ 416 BR1_ASR_Ongr "ASR transmission switching influence"; +CM_ SG_ 416 BR1_EBV_Ongr "Electronic brake force distribution intervention"; +CM_ SG_ 416 BR1_Lampe_ABS "ABS safety warning lamp"; +CM_ SG_ 416 BR1_Lampe_ASR "ASR/ESP lamp (including flashing info)"; +CM_ SG_ 416 BR1_Lampe_BK "Brake control lamp (red)"; +CM_ SG_ 416 BR1_Lichtschalt "Brake light switch / brake pressure threshold exceeded"; +CM_ SG_ 416 BR1_StaDruckschw "Brake test switch / pressure threshold status"; +CM_ SG_ 416 BR1_MAD "OBD rough road suppression"; +CM_ SG_ 416 BR1_Sta_MAD "Rough road suppression status"; +CM_ SG_ 416 BR1_Diagnose "ABS diagnosis mode active"; +CM_ SG_ 416 BR1_BKV_active "Active brake booster installed and not faulty"; +CM_ SG_ 416 BR1_Rad_kmh "Vehicle speed (mean of driven wheels or ABS reference)"; +CM_ SG_ 416 BR1_ASRMo_sl "ASR engagement torque slow (0-99.06%)"; +CM_ SG_ 416 BR1_ASRMo_fa "ASR engagement torque fast when MSR_Anf=0 (0-99.06%)"; +CM_ SG_ 416 BR1_MSR_Mo_inv "Inverse MSR torque when MSR_Anf=1 (99.06-0%)"; +CM_ SG_ 416 BR1_MSR_Mo "MSR engagement torque (0-99.06%)"; +CM_ SG_ 416 BR1_Zaehler "Message counter to mark intervention moment"; +CM_ SG_ 416 BR1_ASR_ESP "Control unit type: 0=ABS/EDS, 1=ASR/ESP/MABS"; +CM_ SG_ 416 BR1_ESPASR_passive "ESP/ASR passive or deactivated by driver"; +CM_ SG_ 416 BR1_Sta_ESP "ESP error status (fault memory entry)"; +CM_ SG_ 416 BR1_Ersatz_Kmh "Speed is substitute value (sensor defect)"; + +CM_ SG_ 640 inneres_Motor_Moment "Engine Indicated Torque"; +CM_ SG_ 640 Fahrerwunschmoment "Driver Requested Torque"; +CM_ SG_ 640 mechanisches_Motor_Verlustmomen "Mechanical Torque Loss"; +CM_ SG_ 640 Fahrpedalwert_oder_Drosselklapp "Accelerator Pedal or Throttle Position"; +CM_ SG_ 640 Motordrehzahl "Engine Speed"; +CM_ SG_ 640 Momentenangaben_ungenau "Approximate Torque Values"; +CM_ SG_ 640 inneres_Motor_Moment_ohne_exter "Inner torque without external"; + +CM_ SG_ 644 MOB_CHECKSUM "Checksum MOB"; +CM_ SG_ 644 MOB_COUNTER "Counter MOB"; + +CM_ BO_ 648 "Motor message 2 - Contains engine status, temperatures, and torque information"; +CM_ SG_ 648 MO2_Mp_Code "Multiplex code - switches after 4 transmissions"; +CM_ SG_ 648 MO2_Getr_Code "Transmission code (multiplex value when Mp_Code=2)"; +CM_ SG_ 648 MO2_max_Mo "Maximum torque MDI (multiplex value when Mp_Code=3)"; +CM_ SG_ 648 MO2_CAN_Vers "CAN version (multiplex value when Mp_Code=0)"; +CM_ SG_ 648 MO2_Motor_Code "Motor code (multiplex value when Mp_Code=1)"; +CM_ SG_ 648 MO2_Kuehlm_T "Engine coolant temperature or substitute value"; +CM_ SG_ 648 MO2_BLS "Brake light switch - unfiltered raw signal"; +CM_ SG_ 648 MO2_BTS "Brake test switch"; +CM_ SG_ 648 MO2_Sta_Kuehlm "Coolant temperature status - 0=OK, 1=Not OK"; +CM_ SG_ 648 MO2_Sta_Klima "Air conditioning compressor status"; +CM_ SG_ 648 MO2_Sta_No_Bet "Normal operation status (Terminal 15 on, init complete)"; +CM_ SG_ 648 MO2_Status_TSK "Drive train coordinator status"; +CM_ SG_ 648 MO2_Sta_GRA "GRA/ACC status"; +CM_ SG_ 648 TSK_Limiter_ausgewaehlt "Speed limiter selected"; +CM_ SG_ 648 MO2_GRAregelt "GRA regulating to displayed speed"; +CM_ SG_ 648 MO2_Sport_Error "Sport mode error (Porsche Cayenne)"; +CM_ SG_ 648 MO2_OffRoad "OffRoad mode active"; +CM_ SG_ 648 MO2_RME_Gehalt "Rapeseed oil methyl ester content (diesel)"; +CM_ SG_ 648 MO2_GRA_Soll "GRA target speed setpoint"; +CM_ SG_ 648 MO2_LL_Solldz "Idle target speed"; +CM_ SG_ 648 MO2_Begr_Mo "Limiting torque - max possible at speed"; +CM_ SG_ 648 MO2_Mo_ZWR "Minimum engine torque with ignition angle retardation"; + +CM_ SG_ 896 MO3_Vorgluehen "Pre-glow active (diesel engines)"; +CM_ SG_ 896 MO3_Prio_Dz "Engine speed priority: 0=request, 1=mandatory"; +CM_ SG_ 896 MO_Schalter_StartStopp "Start/stop deactivated by driver (LED on when 0)"; +CM_ SG_ 896 MO3_Winterprg "Winter driving program active"; +CM_ SG_ 896 MO3_Sta_Pedal "Accelerator pedal status: 0=OK, 1=substitute value"; +CM_ SG_ 896 MO3_Sta_FPG "Accelerator pedal gradient control bit (multiplexer for byte 8)"; +CM_ SG_ 896 MO3_Sign_FPG "Accelerator pedal gradient sign (only when MO3_Sta_FPG=1)"; +CM_ SG_ 896 MO3_Sta_Temp "Intake air temperature status: 0=OK, 1=substitute value"; +CM_ SG_ 896 MO3_Offsentemp "Intake air temperature"; +CM_ SG_ 896 MO3_Pedalwert "Accelerator pedal raw signal (0-101.6%)"; +CM_ SG_ 896 MO3_Rad_Wu_Mo "Wheel torque request (12-bit value, 0-1596.66% MDI)"; +CM_ SG_ 896 MO3_Vorz_RadWu "Wheel torque sign: 0=positive, 1=negative"; +CM_ SG_ 896 MO3_Freigabe_Segeln "Sailing operation enable for transmission"; +CM_ SG_ 896 MO_StartStopp_StoppVorbereitung "Engine stop in preparation"; +CM_ SG_ 896 MO3_Dz_Beeinfl "Engine speed influence factor (0-100% interpolation)"; +CM_ SG_ 896 MO3_WunschDz "Desired engine speed (when MO3_Prio_Dz=1)"; +CM_ SG_ 896 MO3_DKW "Throttle valve position when MO3_Sta_FPG=0 (0-101.6%)"; +CM_ SG_ 896 MO3_FPGradient "Accelerator pedal gradient when MO3_Sta_FPG=1 (0-6350%/s)"; + +CM_ SG_ 912 GK1_Fa_Tuerkont "Status of the driver's door rotary latch"; +CM_ SG_ 912 BSK_HL_geoeffnet "Status of the rear left door rotary latch"; +CM_ SG_ 912 BSK_HR_geoeffnet "Status of the rear right door rotary latch"; +CM_ SG_ 912 BSK_BT_geoeffnet "Status of the passenger door rotary latch"; +CM_ SG_ 912 BSK_HD_Hauptraste "Status of trunk lid main detent"; + +CM_ BO_ 1088 "Getriebe 1 - Contains gear status, torque requests, and control signals"; + +CM_ SG_ 1088 GE1_Schaltung "Gear shift active: 0=no shift, 1=shift in progress"; +CM_ SG_ 1088 GE1_Sta_Schutz "Transmission/converter protection request (power reduction or ignition angle)"; +CM_ SG_ 1088 GE1_Klimakompr "AC compressor off request"; +CM_ SG_ 1088 GE1_WK "Torque converter clutch status"; +CM_ SG_ 1088 GE1_StSt_Info "Start/stop coordinator info"; +CM_ SG_ 1088 GE1_EGS_Anf "EGS request - byte 4 becomes valid when set"; +CM_ SG_ 1088 GE1_Zielgang "Target gear when shifting or current gear"; +CM_ SG_ 1088 GE1_Wahl_Pos "Selector lever position / driving program"; +CM_ SG_ 1088 GE1_Mrad_Mkurb "Wheel torque to crankshaft torque ratio (Mrad/Mcrank)"; +CM_ SG_ 1088 GE1_Soll_Mo "Internal target engine torque request (0-99.06%)"; +CM_ SG_ 1088 GE1_Fahrwistd "Driving resistance index (normalized % slope)"; +CM_ SG_ 1088 GE1_Notlauf "Emergency mode status"; +CM_ SG_ 1088 GE1_Kuehlung "Cooling request level"; +CM_ SG_ 1088 GE1_Sta_OBD "OBD status - MIL lamp control"; +CM_ SG_ 1088 GE1_LaunchControl "Launch control active"; +CM_ SG_ 1088 GE1_Infobit "Transmission type: 0=stepped automatic, 1=CVT"; +CM_ SG_ 1088 GE1_SleepInd "Sleep readiness after terminal 15 off"; +CM_ SG_ 1088 GE1_Zaehler "Message counter (synchronized with Getriebe_2)"; +CM_ SG_ 1088 GE1_Fehlereintr "Fault memory entry present"; +CM_ SG_ 1088 GE1_WaVerl_Mo "Transmission torque loss / clutch torque (0-99.06%)"; + +CM_ SG_ 1056 Fehlerstatus_Aussentemp__4_1 "ambient temp error"; +CM_ SG_ 1056 Fehlerstatus_Oeltemperatur_4_1 "oil temp error"; +CM_ SG_ 1056 Fehlerst__Kuehlmitteltemp__4_1 "water temp error"; +CM_ SG_ 1056 Aussentemperatur_gefiltert "outside temp, filtered"; +CM_ SG_ 1056 Oeltemperatur_4_1 "kombi oil temperature"; +CM_ SG_ 1056 Kuehlmitteltemp__4_1__Kombi_2_ "kombi coolant temperature"; + +CM_ SG_ 1096 Zaehler_Waehlhebel_1 "Counter Waehlhebel_1"; + +CM_ BO_ 1152 "Motor message 5 - Contains engine type, consumption, lamps, and diagnostic info"; + +CM_ SG_ 1152 MO5_Mp_Code "Multiplex selector - switches every 4 transmissions"; +CM_ SG_ 1152 MO5_max_Moment "Maximum torque when Mp_Code=0 (0-630 Nm)"; +CM_ SG_ 1152 MO5_Drehzahl "Engine speed at max torque when Mp_Code=1 (0-6300 RPM)"; +CM_ SG_ 1152 MO5_Motortyp "Engine type info when Mp_Code=2 (cylinder count, turbo, fuel type)"; +CM_ SG_ 1152 MO5_Abgastyp "Exhaust type EOBD when Mp_Code=3"; +CM_ SG_ 1152 MO5_Abgastyp2 "Exhaust type OBD when Mp_Code=3"; +CM_ SG_ 1152 MO5_Abgastyp3 "DPF installed when Mp_Code=3"; +CM_ SG_ 1152 OBD_Kaltstart_Denominator "Cold start denominator increment when Mp_Code=3"; +CM_ SG_ 1152 OBD_Minimum_Trip "Minimum normalized trip when Mp_Code=3"; +CM_ SG_ 1152 MO5_DPF_reg "DPF regenerating when Mp_Code=3"; +CM_ SG_ 1152 MO5_Vorgluehen "Diesel pre-glow lamp"; +CM_ SG_ 1152 MO5_E_Gas "E-Gas system lamp (petrol only)"; +CM_ SG_ 1152 MO5_OBD_2 "OBD/MIL lamp control"; +CM_ SG_ 1152 MO5_Heissl "Coolant overheat warning lamp"; +CM_ SG_ 1152 MO5_KlimaKompr "AC compressor off request"; +CM_ SG_ 1152 MO5_Feld_kuehl "Map cooling installed and OK"; +CM_ SG_ 1152 MO5_KliKo_Red "AC compressor power reduction"; +CM_ SG_ 1152 MO5_Verbrauch "Fuel consumption counter (15-bit, Âĩl)"; +CM_ SG_ 1152 MO5_UeberlVerb "Consumption counter overflow"; +CM_ SG_ 1152 MO5_Luefter "Cooling fan PWM control (0-101.6%)"; +CM_ SG_ 1152 MO5_HLeuchte "Overheat pre-warning"; +CM_ SG_ 1152 MO5_PartikelLamp "Particle filter lamp"; +CM_ SG_ 1152 MO5_Sta_BKU "Brake vacuum pump status (Porsche only)"; +CM_ SG_ 1152 MO5_TypStartSteu "Starter control type: 0=BSG/BCM, 1=MSG"; +CM_ SG_ 1152 MO5_TDE_Lampe "Fuel cap warning lamp (petrol only)"; +CM_ SG_ 1152 MO5_TDE_Text "Fuel cap text display (petrol only)"; +CM_ SG_ 1152 MO5_DZM_Daempf "RPM gauge damping control"; +CM_ SG_ 1152 MO5_Interlock "Interlock switch for manual transmission start"; +CM_ SG_ 1152 MO5_Start "Automatic start permission"; +CM_ SG_ 1152 MO5_Anlasser "Starter control permission"; +CM_ SG_ 1152 MO5_GRA_Hauptsch "GRA main switch / readiness"; +CM_ SG_ 1152 MO5_Momente "MDI torque values doubled"; +CM_ SG_ 1152 MO5_Motortext1 "Text: Engine workshop"; +CM_ SG_ 1152 MO5_Motortext2 "Text: Exhaust workshop (deprecated)"; +CM_ SG_ 1152 MO5_Motortext3 "Text: Fuel system fault"; +CM_ SG_ 1152 MO5_Motortext4 "Text: Particle filter needs regeneration"; +CM_ SG_ 1152 CHECKSUM "Checksum with final value 0x0"; + +CM_ SG_ 1160 Zaehler_Motor_6 "Counter Motor_6"; +CM_ SG_ 1160 Hoeheninfo__Motor_6_ "Altitude Correction"; +CM_ SG_ 1160 Istmoment_f_r_Getriebe "Actual torque for gear"; +CM_ SG_ 1160 Sollmoment_f_r_Getriebe "Target torque for gearbox"; +CM_ SG_ 1160 Checksumme_Motor_6 "Checksum Motor_6"; +CM_ SG_ 1160 GRA_Sollbeschleunigung "GRA target acceleration"; +CM_ SG_ 1160 Ruckmeldung_Momenten "Feedback torque-integral gear intervention"; + +CM_ SG_ 1344 Zahler_Getriebe_2 "Counter Getriebe_2"; +CM_ SG_ 1344 Hochschaltlampe "Upshift Flag"; + +CM_ SG_ 1386 ACA_V_Wunsch "255=unset"; + +CM_ SG_ 1408 Zaehler_Motor_Flexia "Counter Motor_Flexia"; +CM_ SG_ 1408 Verbrennungsart "Type of combustion"; +CM_ SG_ 1408 Max_Drehmoment "Maximum torque"; +CM_ SG_ 1408 Drehzahl_MaxNorm "RPM of maximum torque"; +CM_ SG_ 1408 Hubraum "Displacement"; +CM_ SG_ 1408 Anzahl_Zylinder "Number of cylinders"; +CM_ SG_ 1408 Anzahl_Ventile "Number of valves"; +CM_ SG_ 1408 Ansaugsystem "Induction System"; +CM_ SG_ 1408 Motorleistung "Maximum engine power"; + +CM_ SG_ 1416 Ladedruck "Boost Pressure"; +CM_ SG_ 1416 Motordrehzahlgradient "Engine speed gradient"; +CM_ SG_ 1416 Hoeheninfo__Motor_7_ "Altitude correction factor"; +CM_ SG_ 1416 Oltemperatur "Oil temperature"; + +CM_ SG_ 1470 LDW_Direction "0=right,1=left"; +CM_ SG_ 1470 XX_DLCORTLC1 "Might be DLC or TLC"; +CM_ SG_ 1470 XX_DLCORTLC2 "Might be DLC or TLC, might have wrong size"; + +CM_ SG_ 1550 MFA_v_Signal_02 "0=km/h, 1=mph"; + +SG_MUL_VAL_ 416 BR1_ASRMo_fa BR1_MSR_Anf 0-0; +SG_MUL_VAL_ 416 BR1_MSR_Mo_inv BR1_MSR_Anf 1-1; + +SG_MUL_VAL_ 896 MO3_DKW MO3_Sta_FPG 0-0; +SG_MUL_VAL_ 896 MO3_FPGradient MO3_Sta_FPG 1-1; +SG_MUL_VAL_ 896 MO3_Sign_FPG MO3_Sta_FPG 1-1; + +VAL_ 194 LW1_LRW_Sign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen"; +VAL_ 194 LW1_Gesch_Sign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen"; +VAL_ 194 LW1_ID 0 "noch_not_kalibriert" 128 "kalibriert_nur_bei_PQ35_46_VW32x_VW411"; +VAL_ 194 LW1_Initquelle 0 "Bremse_3" 1 "EPS_Bit"; +VAL_ 194 LW1_Status 0 "OK" 1 "no_initial" 2 "sporadic_failure" 3 "permanent_failure"; +VAL_ 194 LW1_Sta_KL30 0 "ok" 1 "no_init_s"; + +VAL_ 416 BR1_ASR_Anf 0 "no_requirement" 1 "ASR_requirement"; +VAL_ 416 BR1_MSR_Anf 0 "no_requirement" 1 "MSR_requirement"; +VAL_ 416 BR1_ABS_Brems 0 "no_ABS_control" 1 "ABS_control"; +VAL_ 416 BR1_EDS_Ongr 0 "no_EDS_intervention" 1 "EDS_intervention"; +VAL_ 416 BR1_ESP_Ongr 0 "no_ESP_intervention" 1 "ESP_intervention"; +VAL_ 416 BR1_ASR_Ongr 0 "no_requirement" 1 "ASR_shift_map" 2 "Downshift" 3 "Switching_ban"; +VAL_ 416 BR1_EBV_Ongr 0 "no_EBV_intervention" 1 "EBV_intervention"; +VAL_ 416 BR1_Lampe_ABS 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 416 BR1_Lampe_ASR 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 416 BR1_Lampe_BK 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 416 BR1_Lichtschalt 0 "no_Bremsen_Schw_unterschr" 1 "Bremse_betaetigt_Schw_ueberschr"; +VAL_ 416 BR1_StaDruckschw 0 "Sta_guel_BKV_n_angest_k_Br" 1 "Sta_n_verf_BKV_angest_Br"; +VAL_ 416 BR1_MAD 0 "no_Offblendung" 1 "Offblendung"; +VAL_ 416 BR1_Sta_MAD 0 "valid" 1 "invalid"; +VAL_ 416 BR1_Diagnose 0 "no" 1 "in_Diagnose"; +VAL_ 416 BR1_BKV_active 0 "BKV_not_installed_or_fault" 1 "BKV_installed_and_not_fault"; +VAL_ 416 BR1_ASR_ESP 0 "ABS_ABS_EDS" 1 "ASR_ESP_MABS"; +VAL_ 416 BR1_ESPASR_passive 0 "ESP_ASR_activated" 1 "ESP_oder_ASR_passive_get_oder_Fktumsch_oder_Rollenmodus"; +VAL_ 416 BR1_Sta_ESP 0 "ok" 1 "Failure"; +VAL_ 416 BR1_Ersatz_Kmh 0 "OK" 1 "Substitute_value"; + +SG_MUL_VAL_ 648 MO2_Getr_Code MO2_Mp_Code 2-2; +SG_MUL_VAL_ 648 MO2_max_Mo MO2_Mp_Code 3-3; +SG_MUL_VAL_ 648 MO2_CAN_Vers MO2_Mp_Code 0-0; +SG_MUL_VAL_ 648 MO2_Motor_Code MO2_Mp_Code 1-1; + +SG_MUL_VAL_ 1152 MO5_max_Moment MO5_Mp_Code 0-0; +SG_MUL_VAL_ 1152 MO5_Drehzahl MO5_Mp_Code 1-1; +SG_MUL_VAL_ 1152 MO5_Motortyp MO5_Mp_Code 2-2; +SG_MUL_VAL_ 1152 MO5_Abgastyp MO5_Mp_Code 3-3; +SG_MUL_VAL_ 1152 MO5_Abgastyp2 MO5_Mp_Code 3-3; +SG_MUL_VAL_ 1152 MO5_Abgastyp3 MO5_Mp_Code 3-3; +SG_MUL_VAL_ 1152 OBD_Kaltstart_Denominator MO5_Mp_Code 3-3; +SG_MUL_VAL_ 1152 OBD_Minimum_Trip MO5_Mp_Code 3-3; +SG_MUL_VAL_ 1152 MO5_DPF_reg MO5_Mp_Code 3-3; + +VAL_ 648 MO2_Mp_Code 0 "CAN_Stand" 1 "Motor_Kod" 2 "Getriebe_Kod" 3 "MDI_Max"; + +VAL_ 648 MO2_Getr_Code 0 "_5HP19" 1 "_5HP24" 2 "AG4" 3 "VL300" 4 "VQ250" 5 "VQ35" 6 "AG4_yestco" 7 "AG5_yestco" 8 "autom_Kupplung" 9 "autom_Kupplung_mit_ASG" 10 "AG6_yestco_ZF_6HP_AISIN" 11 "DQ500_DQ250_DQ200" 12 "SQ100_SQ200" 14 "AL1000_AL551_AL951_ZF8HPx" 15 "Handschalter_konv" 16 "DL800" 17 "E_Fahrzeug__Single_Gear"; + +VAL_ 648 MO2_BLS 0 "no_Bremsen" 1 "Bremse_betaetigt"; +VAL_ 648 MO2_BTS 0 "no_braking" 1 "Brake_activated"; +VAL_ 648 MO2_Sta_Kuehlm 0 "Temperature_ok" 1 "Temperature_not_ok"; +VAL_ 648 MO2_Sta_Klima 0 "Climate_off" 1 "Climate_on"; +VAL_ 648 MO2_Sta_No_Bet 0 "no_Normalbetrieb" 1 "Normalbetrieb"; +VAL_ 648 MO2_Status_TSK 0 "TSK_not_available" 1 "TSK_available"; +VAL_ 648 MO2_Sta_GRA 0 "ADR_GRA_off" 1 "gra_activated_lamp_on" 2 "gra_overdriven_lamp_on" 3 "ADR_gra_faulted"; +VAL_ 648 TSK_Limiter_ausgewaehlt 0 "no_limiter_selected" 1 "Limiter_Selected"; +VAL_ 648 MO2_GRAregelt 0 "no" 1 "yes"; +VAL_ 648 MO2_Sport_Error 0 "no_Failure" 1 "Failure"; +VAL_ 648 MO2_OffRoad 0 "not_active" 1 "active"; + +VAL_ 870 AWV_Text 0 "kein_Text" 1 "FrontAssist_aus" 2 "FrontAssist_startet" 3 "FrontAssist_Warnung" 4 "FrontAssist_Sens_reinig" 5 "FrontAssist_Failure" 6 "FrontAssist_Demo" 7 "Vorhalt" 8 "Bremsung_wird_gerade_durchgefuehrt" 9 "Sensor_not_verfuegbar" 10 "Sensor_reinigen" 11 "Service_notwendig_Failure" 12 "Funktion_vom_Fahrer_deactivated" 13 "Funktion_vom_Fahrer_activated" 14 "FrontAssist_zur_Zeit_not_verfuegbar__rev_Failure"; +VAL_ 870 AWV_1_Freigabe 0 "nicht_freigegeben" 1 "freigegeben"; +VAL_ 870 AWV_1_Prefill 0 "keine_Prefill_Anf" 1 "Prefill_Anf"; +VAL_ 870 AWV_1_Parameter 0 "Defaultparametersatz" 1 "Par_leicht_erh_Empf" 2 "Par_erh_Empf" 3 "Par_hoechster_Empf"; +VAL_ 870 AWV_only 0 "ACC_und_AWV_verbaut" 1 "AWV_ohne_ACC_verbaut"; +VAL_ 870 AWV_CityANB_Auspraegung 0 "autom_Bremsung_im_ges_vBereich" 1 "autom_Bremsung_im_def_vBereich"; +VAL_ 870 AWV_Halten 0 "keine_Anforderung" 1 "Anforderung_das_Fzg_im_Stillstand_zu_halten"; +VAL_ 870 ANB_Teilbremsung_Freigabe 0 "Teilbremsung_nicht_freigegeben" 1 "Teilbremsung_freigegeben"; +VAL_ 870 AWV_2_Status 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 870 AWV_2_Fehler 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 870 AWV_2_SU_Warnzeit 0 "frueh" 1 "normal" 2 "spaet" 3 "adaptiv"; +VAL_ 870 AWV_2_SU_Bremsruck 0 "Bremsruck_deaktiviert" 1 "Bremsruck_aktiviert"; +VAL_ 870 AWV_2_SU_Gong 0 "Gong_deaktiviert" 1 "Gong_aktiviert"; +VAL_ 870 AWV_2_SU_Lampe 0 "Lampe_deaktiviert" 1 "Lampe_aktiviert"; +VAL_ 870 AWV_2_Umfeldwarn 0 "keine_Warnung" 1 "Warnung"; +VAL_ 870 AWV_2_Freigabe 0 "keine_Ruckfreigabe" 1 "Ruckfreigabe"; +VAL_ 870 AWV_2_Ruckprofil 0 "kein_Ruck" 1 "Ruckprofil_1" 2 "Ruckprofil_2" 3 "Ruckprofil_3" 4 "Ruckprofil_4" 5 "Ruckprofil_5" 6 "not_erlaubt" 7 "not_erlaubt"; +VAL_ 870 AWV_2_Warnton 0 "Aus" 1 "Ein"; +VAL_ 870 AWV_2_Warnsymbol 0 "Aus" 1 "Ein"; +VAL_ 870 AWV_Infoton 0 "Aus" 1 "Ein"; +VAL_ 870 AWV_2_Gurtstraffer 0 "Gurt_not_straffen" 1 "Gurt_straffen"; +VAL_ 870 AWV_Konfiguration_Menueanf 0 "Menue_deaktivieren" 1 "Menue_aktivieren"; +VAL_ 870 AWV_Konfiguration_Vorw_Menueanf 0 "Menue_deaktivieren" 1 "Menue_aktivieren"; +VAL_ 870 AWV_Konfiguration_Status 0 "AWV_inaktiv" 1 "AWV_aktiv"; +VAL_ 870 AWV_Konfiguration_Vorw_Status 0 "AWV_Vorwarnung_inaktiv" 1 "AWV_Vorwarnung_aktiv"; +VAL_ 870 AWV_2_Abstandswarnung 0 "kein_Warnhinweis" 1 "Warnhinweis"; +VAL_ 870 ANB_Zielbremsung_Freigabe 0 "Zielbremsung_nicht_freigegeben" 1 "Zielbremsung_freigegeben"; +VAL_ 870 ANB_CM_Anforderung 0 "keine_Anforderung" 1 "Anforderung_aktiv"; + +VAL_ 872 ACS_Sta_ADR 2 "ADR_passiv" 0 "ADR_nicht_aktiv" 1 "ADR_aktiv" 3 "irrev_Fehler" ; +VAL_ 872 ACS_ADR_Schub 1 "Verz_begr_auf_Schub" 0 "Verz_nicht_begr_auf_Schub" ; +VAL_ 872 ACS_Schubabsch 1 "SA_nicht_zulaessig" 0 "SA_zulaessig" ; +VAL_ 872 ACS_StSt_Info 3 "Systemfehler" 0 "Motorlauf_nn" 1 "Stoppverbot_Motoranlauf_nn" 2 "Motoranlauf_notwendig" ; +VAL_ 872 ACS_MomEingriff 1 "MomEingr_verhindern" 0 "keine_Beeinfl_MomEingr_Mot" ; +VAL_ 872 ACS_Typ_ACC 0 "Basis_ACC" 1 "ACC_mit_FollowToStop" 3 "frei" 2 "frei" ; +VAL_ 872 ACS_FreigSollB 0 "Sollbeschl_nicht_freigeg" 1 "Sollbeschl_freigeg" ; +VAL_ 872 ACS_Sollbeschl 2046 "ADR_nicht_aktiv" 2047 "Fehler" ; +VAL_ 872 ACS_Anhaltewunsch 0 "kein_Haltewunsch" 1 "Fzg_haelt_an" ; +VAL_ 872 ACS_Fehler 1 "Fehlerspeichereintrag" 0 "kein_Fehlerspeichereintrag" ; +VAL_ 872 ACS_zul_Regelabw 254 "ADR_nicht_aktiv" 255 "Fehler" ; +VAL_ 872 ACS_max_AendGrad 254 "Neutralwert" 0 "Neutralwert" 255 "Fehler" ; + +VAL_ 896 MO3_Vorgluehen 0 "no_Vorgluehen" 1 "Vorgluehen_active"; +VAL_ 896 MO3_Prio_Dz 0 "Wunsch" 1 "Zwang"; +VAL_ 896 MO_Schalter_StartStopp 0 "StartStopp_ueber_Hauptschalter_deactivated_LED_an" 1 "StartStopp_ueber_Hauptschalter_activated_LED_aus"; +VAL_ 896 MO3_Winterprg 0 "not_active" 1 "active"; +VAL_ 896 MO3_Sta_Pedal 0 "Fahrpedal_iO" 1 "Ersatzwert"; +VAL_ 896 MO3_Sta_FPG 0 "Gradient_not_bed" 1 "Gradient_bed"; +VAL_ 896 MO3_Sign_FPG 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen"; +VAL_ 896 MO3_Sta_Temp 0 "Geber_iO" 1 "Ersatzwert"; +VAL_ 896 MO3_Vorz_RadWu 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen"; +VAL_ 896 MO3_Freigabe_Segeln 0 "Segelbetrieb_not_freigegeben" 1 "Segelbetrieb_freigegeben"; +VAL_ 896 MO_StartStopp_StoppVorbereitung 0 "Motorstopp_not_in_Vorbereitung" 1 "Motorstopp_in_Vorbereitung"; +CM_ BO_ 896 "Motor message 3 - Contains accelerator pedal, temperatures, and control signals"; + +VAL_ 978 LH2_Sta_HCA 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" 7 "active"; +VAL_ 210 HCA_Status 3 "ready" 5 "torque" 7 "torque_active" 8 "alc_angle_private" 10 "override_reset" 11 "pla_entry" 15 "standby"; +VAL_ 1088 GE1_Schaltung 0 "no_circuit" 1 "circuit_is_running"; +VAL_ 1088 GE1_Sta_Schutz 0 "no_protection" 1 "protection_requested"; +VAL_ 1088 GE1_Klimakompr 0 "no_Anforderung" 1 "Kompressor_aus"; +VAL_ 1088 GE1_WK 0 "WK_open" 1 "WK_regulated" 2 "WK_closed" 3 "Failure"; +VAL_ 1088 GE1_StSt_Info 0 "Engine_running_not_necessary_stop_release" 1 "Motor_start_not_mandatory_necessary_stop_prohibition" 2 "Motor_start_absolute_necessary_start_request" 3 "System_error"; +VAL_ 1088 GE1_EGS_Anf 0 "no_requirement" 1 "EGS_requirement"; +VAL_ 1088 GE1_Zielgang 0 "P (Park) | Disengaged" 1 "Gear 1 | Engaged" 2 "Gear 2 | Engaged" 3 "Gear 3 | Engaged" 4 "Gear 4 | Engaged" 5 "Gear 5 | Engaged" 6 "1m Gear" 7 "Gang_R" 8 "Gear 6 | Engaged" 9 "Gear 7 | Engaged" 10 "Gear 8 | Engaged" 14 "Speed Not Defined" 15 "Failure"; +VAL_ 1088 GE1_Wahl_Pos 8 "P" 7 "R" 6 "N" 5 "D" 9 "U" 12 "S" 14 "T" 10 "T" 11 "T"; +VAL_ 1088 GE1_Notlauf 0 "No Emergency" 1 "No Switching" 2 "Switch to Neutral" 3 "50% Shifting Capacity" 4 "Driving Without UK" 5 "No Emeregency" 6 "No Emergency" 7 "No Emergency, Target Shifting Reached" 15 "Failure"; +VAL_ 1088 GE1_Kuehlung 0 "No Additional Cooling Requested" 1 "20% Additional Fan Cooling Requested" 2 "40% Additional Fan Cooling Requested" 3 "Maximum Additional Fan Cooling Requested"; +VAL_ 1088 GE1_Sta_OBD 0 "MIL Off" 1 "MIL On"; +VAL_ 1088 GE1_LaunchControl 0 "Launch Control Not Active" 1 "Launch Control Program Active"; +VAL_ 1088 GE1_Infobit 0 "Standard Automatic" 1 "CVT"; +VAL_ 1088 GE1_SleepInd 0 "CAN is Required" 1 "Sleep Ready"; +VAL_ 1088 GE1_Fehlereintr 0 "No Failure Memory Entry" 1 "Failure Memory Entry"; + +VAL_ 1152 MO5_Mp_Code 0 "Max_Moment" 1 "Drehzahl" 2 "Motor_Typ" 3 "Abgastyp_od_norm_Verbrauch"; +VAL_ 1152 MO5_Abgastyp 0 "no_EOBD" 1 "EOBD"; +VAL_ 1152 MO5_Abgastyp2 0 "no_OBD" 1 "OBD"; +VAL_ 1152 MO5_Abgastyp3 0 "no_DPF_verbaut" 1 "DPF_verbaut"; +VAL_ 1152 OBD_Kaltstart_Denominator 0 "Denominator_not_hochzaehlen" 1 "Bedingungen_zum_Inkr_des_Kaltstart_Denom_erf"; +VAL_ 1152 OBD_Minimum_Trip 0 "no_Min_Normed_Trip" 1 "Min_Normed_Trip"; +VAL_ 1152 MO5_DPF_reg 0 "DPF_regeneriert_nicht" 1 "DPF_regeneriert"; +VAL_ 1152 MO5_Vorgluehen 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 1152 MO5_E_Gas 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 1152 MO5_OBD_2 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 1152 MO5_Heissl 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 1152 MO5_KlimaKompr 0 "no_Anforderung" 1 "Klimakompr_aus"; +VAL_ 1152 MO5_Feld_kuehl 0 "no" 1 "yes"; +VAL_ 1152 MO5_KliKo_Red 0 "no" 1 "yes"; +VAL_ 1152 MO5_UeberlVerb 0 "no_Ueberlauf" 1 "mindestens_einmal_uebergelaufen"; +VAL_ 1152 MO5_HLeuchte 0 "no_Warnung" 1 "Vorwarnung"; +VAL_ 1152 MO5_PartikelLamp 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 1152 MO5_Sta_BKU 0 "iO_oder_not_verbaut" 1 "n_iO"; +VAL_ 1152 MO5_TypStartSteu 0 "Startersteuerung_BSG_BCM_KessyD1_ZAS" 1 "Startersteuerung_durch_MSG"; +VAL_ 1152 MO5_TDE_Lampe 0 "Lamp_off" 1 "Lamp_on"; +VAL_ 1152 MO5_TDE_Text 0 "no_Text" 1 "Textanzeige_nach_ISO"; +VAL_ 1152 MO5_DZM_Daempf 0 "normale_Daempfung" 1 "dynamische_Daempfung"; +VAL_ 1152 MO5_Interlock 0 "Interlock_not_betaetigt" 1 "Interlock_betaetigt"; +VAL_ 1152 MO5_Start 0 "Start_not_zulaessig" 1 "Startfreigabe"; +VAL_ 1152 MO5_Anlasser 0 "Anlasser_darf_angesteuert_werden" 1 "Anlasser_ausspuren_Ansteuerung_not_moeglich"; +VAL_ 1152 MO5_GRA_Hauptsch 0 "Off" 1 "On"; +VAL_ 1152 MO5_Momente 0 "Einfach" 1 "Doppelt"; +VAL_ 1152 MO5_Motortext1 0 "no_Text" 1 "Text_1"; +VAL_ 1152 MO5_Motortext2 0 "no_Text" 1 "Text_2"; +VAL_ 1152 MO5_Motortext3 0 "no_Text" 1 "Text_3"; +VAL_ 1152 MO5_Motortext4 0 "no_Text" 1 "Text_4"; + +VAL_ 1386 ACA_StaACC 6 "ACC_rev_aus" 0 "Hauptschalter_aus" 4 "ACC_im_Hintergrund" 3 "ACC_aktiv" 1 "Reserve" 2 "ACC_passiv" 7 "ACC_irrev_aus" 5 "frei" ; +VAL_ 1386 ACA_ID_StaACC 0 "keine_Anzeige" ; +VAL_ 1386 ACA_Fahrerhinw 1 "Ein" 0 "Aus" ; +VAL_ 1386 ACA_AnzDisplay 1 "Anzeige_erw" 0 "Anzeige_nicht_erw" ; +VAL_ 1386 ACA_Zeitluecke 3 "Zeitluecke3" 10 "Zeitluecke10" 4 "Zeitluecke4" 14 "Zeitluecke14" 11 "Zeitluecke11" 2 "Zeitluecke2" 13 "Zeitluecke13" 9 "Zeitluecke9" 1 "Zeitluecke1" 8 "Zeitluecke8" 5 "Zeitluecke5" 15 "Zeitluecke15" 0 "nicht_definiert" 12 "Zeitluecke12" 6 "Zeitluecke6" 7 "Zeitluecke7" ; +VAL_ 1386 ACA_V_Wunsch 255 "kein_Wert_im_Speicher" ; +VAL_ 1386 ACA_kmh_mph 0 "km_h" 1 "mph" ; +VAL_ 1386 ACA_Akustik1 0 "kein_Gong" 1 "Gong" ; +VAL_ 1386 ACA_Akustik2 0 "kein_Summer" 1 "Summer" ; +VAL_ 1386 ACA_PrioDisp 1 "mittlere_Prio" 3 "keine_Anzeige_Anf" 0 "hohe_Prio" 2 "niedrige_Prio" ; +VAL_ 1386 ACA_gemZeitl 6 "Zeitluecke6" 2 "Zeitluecke2" 7 "Zeitluecke7" 13 "Zeitluecke13" 11 "Zeitluecke11" 4 "Zeitluecke4" 8 "Zeitluecke8" 12 "Zeitluecke12" 10 "Zeitluecke10" 0 "Kein_Objekt_erfasst" 1 "Zeitluecke1" 3 "Zeitluecke3" 9 "Zeitluecke9" 15 "Zeitluecke15" 14 "Zeitluecke14" 5 "Zeitluecke5" ; +VAL_ 1386 ACA_ACC_Verz 0 "ACC_verzoegert_nicht" 1 "ACC_verzoegert" ; +VAL_ 1386 ACA_StaGRA 3 "GRA_aktiv" 4 "GRA_uebertreten" 2 "GRA_passiv" 0 "Hauptschalter_aus" 6 "frei" 7 "GRA_Fehler" 1 "Reserve" 5 "frei" ; +VAL_ 1386 ACA_ID_StaGRA 0 "keine_Anzeige" ; +VAL_ 1386 ACA_Codierung 0 "ACC" 1 "GRA" ; +VAL_ 1386 ACA_Tachokranz 0 "nicht_beleuchtet" 1 "beleuchtet" ; +VAL_ 1386 ACA_Aend_Zeitluecke 1 "Anzeige_angef" 0 "keine_Anzeige" ; + +VAL_ 1472 EP1_Fehler_Sta 0 "volle_Funktion" 1 "linke_Seite_fehlerhaft" 2 "rechte_Seite_fehlerhaft" 3 "beide_Seiten_fehlerhaft"; +VAL_ 1472 EP1_Sta_EPB 0 "Bremse_geoeffnet" 1 "Bremse_geschlossen"; +VAL_ 1472 EP1_Sta_Schalter 0 "volle_Funktion" 1 "Schalter_ausser_Funktion"; +VAL_ 1472 EP1_Spannkraft 31 "Fehler"; +VAL_ 1472 EP1_Schalterinfo 0 "keine_Fahreranforderung" 1 "Fahreranforderung_oeffnen" 2 "Fahreranforderung_schliessen" 3 "Schalterfehler"; +VAL_ 1472 EP1_Sta_NWS 0 "volle_Funktion" 1 "keine_Funktion"; +VAL_ 1472 EP1_Fehlereintr 0 "kein_Fehlerspeichereintrag" 1 "Fehlerspeichereintrag"; +VAL_ 1472 EP1_Freigabe_Ver 0 "Verzoegerungsanf_nicht_freigegeb" 1 "Verzoegerungsanf_freigegeben"; +VAL_ 1472 EP1_AutoHold_zul 0 "Pers_nicht_zulaessig" 1 "Pers_zulaessig"; +VAL_ 1472 EP1_AutoHold_aktiv 0 "nein" 1 "ja"; +VAL_ 1472 EP1_SleepInd 0 "CAN_wird_benoetigt" 1 "Sleep_bereit"; +VAL_ 1472 EP1_Status_Kl_15 0 "Kl_15_aus" 1 "Kl_15_ein"; +VAL_ 1472 EP1_Lampe_AutoP 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 1472 EP1_Bremslicht 0 "Aus" 1 "Ein"; +VAL_ 1472 EP1_Warnton1 0 "Aus" 1 "Ein"; +VAL_ 1472 EP1_Warnton2 0 "Aus" 1 "Ein"; +VAL_ 1472 EP1_AnfShLock 0 "Aus" 1 "Ein"; +VAL_ 1472 EPB_Autoholdlampe 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 1472 EP1_QualNeigWi 0 "gueltiger_Wert" 1 "Ersatz_Init_oder_Fehlerwert"; +VAL_ 1472 EP1_KuppModBer 0 "Kuppsensor_aus_Modbereich" 1 "Kupplsensor_im_Modbereich" 2 "Sensorsignal_ungenau" 3 "Sensor_defekt"; +VAL_ 1472 EP1_HydrHalten 0 "Fzg_nicht_hydr_geh" 1 "Fzg_hydr_geh"; +VAL_ 1472 EP1_Fkt_Lampe 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 1472 EP1_Warnton 0 "Warnton_aus" 1 "Warnton_an"; +VAL_ 1472 EP1_Fehler_BKL 0 "BKL_aus" 1 "BKL_an"; +VAL_ 1472 EP1_Fehler_gelb 0 "Lampe_aus" 1 "Lampe_ein"; +VAL_ 1472 EP1__Text 0 "kein_Text" 1 "Text_1" 2 "Text_2" 3 "Text_3" 4 "Text_4" 5 "Text_5" 6 "reserviert" 7 "reserviert" 8 "Text_8"; diff --git a/artifacts/package_runtime/iqdbc/lvbs/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/artifacts/package_runtime/iqdbc/lvbs/aol_base.py b/artifacts/package_runtime/iqdbc/lvbs/aol_base.py new file mode 100644 index 000000000..b472e81fa --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/aol_base.py @@ -0,0 +1,22 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from abc import abstractmethod, ABC +from enum import StrEnum + +from iqdbc.car import structs +from iqdbc.can.parser import CANParser + + +class AolCarStateBase(ABC): + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + + self.lkas_button = 0 + self.prev_lkas_button = 0 + + @abstractmethod + def update_aol(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None: + pass diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/__init__.py new file mode 100644 index 000000000..f08cca121 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/__init__.py @@ -0,0 +1,38 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + + +def crc8_pedal(data): + crc = 0xFF # standard init value + poly = 0xD5 # standard crc8: x8+x7+x6+x4+x2+1 + size = len(data) + for i in range(size - 1, -1, -1): + crc ^= data[i] + for _ in range(8): + if (crc & 0x80) != 0: + crc = ((crc << 1) ^ poly) & 0xFF + else: + crc <<= 1 + return crc + + +def create_gas_interceptor_command(packer, gas_amount, idx): + # Common gas pedal msg generator + enable = gas_amount > 0.001 + + values = { + "ENABLE": enable, + "PEDAL_COUNTER": idx & 0xF, + } + + if enable: + values["GAS_COMMAND"] = gas_amount * 255. + values["GAS_COMMAND2"] = gas_amount * 255. + + dat = packer.make_can_msg("GAS_COMMAND", 0, values)[1] + + checksum = crc8_pedal(dat[:-1]) + values["PEDAL_CHECKSUM"] = checksum + + return packer.make_can_msg("GAS_COMMAND", 0, values) diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/car_catalog.py b/artifacts/package_runtime/iqdbc/lvbs/car/car_catalog.py new file mode 100644 index 000000000..67ed4ee9d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/car_catalog.py @@ -0,0 +1,62 @@ +import re +import unicodedata + +from iqdbc.car.docs import get_all_footnotes, get_params_for_docs +from iqdbc.car.values import PLATFORMS + + +def build_car_catalog() -> dict[str, dict[str, list[str] | str]]: + collected_footnote = get_all_footnotes() + sorted_list: dict[str, dict[str, list[str] | str]] = collect_car_docs(PLATFORMS, collected_footnote) + return sorted_list + + +def _natural_sort_key(s): + # NFKD normalization ensures accented characters sort with their base letter (e.g., Å  sorts with S) + normalized = unicodedata.normalize('NFKD', s) + return [int(t) if t.isdigit() else t.lower() for t in re.split(r'(\d+)', normalized) if t] + + +def collect_car_docs(platforms, footnotes) -> dict[str, dict[str, list[str] | str]]: + cars: dict[str, dict[str, list[str] | str]] = {} + for model, platform in platforms.items(): + car_docs = platform.config.get_all_docs() + CP, CP_IQ = get_params_for_docs(platform) + + if CP.dashcamOnly or not len(car_docs): + continue + + # A platform can include multiple car models + for _car_docs in car_docs: + if not hasattr(_car_docs, "row"): + _car_docs.init_make(CP) + _car_docs.init(CP, footnotes) + cars[_car_docs.name] = model + + _platform = model + _name = _car_docs.name + _make = _car_docs.make + _brand = _car_docs.brand + _model = _car_docs.model + _years = _car_docs.year_list + _package = _car_docs.package if _car_docs.package else [] + + cars[_name] = { + "platform": _platform, + "make": _make, + "brand": _brand, + "model": _model, + "year": _years if _years else [], + "package": _package, + } + + # Sort cars by make and model + year + sorted_cars = sorted(cars.keys(), key=lambda car: _natural_sort_key(car)) + sorted_car_list = {car: cars[car] for car in sorted_cars} + return sorted_car_list + + +if __name__ == "__main__": + # build_car_catalog() is the raw platform source; the shipped catalog is generated + # (and encoded to its on-disk envelope) by the main-repo entry point: + print("run: python -m iqpilot.selfdrive.car.vehicle_catalog") diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/aol.py b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/aol.py new file mode 100644 index 000000000..348641785 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/aol.py @@ -0,0 +1,73 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Always-on-Lateral adapter for Chrysler. CarState reads the LKAS toggle button +(and the forwarded LKAS heartbeat); CarController tracks the AOL state and, when +AOL is available, drives the LKAS_DISABLED bit the dash reads from the heartbeat. +""" +from enum import StrEnum +from collections import namedtuple + +from iqdbc.car import Bus, structs +from iqdbc.car.chrysler.values import RAM_CARS +from iqdbc.lvbs.aol_base import AolCarStateBase +from iqdbc.can.parser import CANParser + +AolDataIQ = namedtuple("AolDataIQ", ["enable_aol", "paused", "lkas_disabled"]) +ButtonType = structs.CarState.ButtonEvent.Type + +_HEARTBIT_FIELDS = ("LKAS_DISABLED", "AUTO_HIGH_BEAM", "FORWARD_1", "FORWARD_2", "FORWARD_3") + + +class AolCarController: + def __init__(self): + self.aol = AolDataIQ(False, False, False) + + @staticmethod + def create_lkas_heartbit(packer, lkas_heartbit, aol): + values = {name: lkas_heartbit[name] for name in _HEARTBIT_FIELDS} + if aol.enable_aol: + values["LKAS_DISABLED"] = 1 if aol.lkas_disabled else 0 + return packer.make_can_msg("LKAS_HEARTBIT", 0, values) + + @staticmethod + def aol_status_update(CC: structs.CarControl, CC_IQ: structs.IQCarControl, CS) -> AolDataIQ: + enable_aol = CC_IQ.aol.available + paused = CC_IQ.aol.enabled and not CC.latActive + # A tap of the LKAS button flips the driver's "LKAS disabled" preference. + if any(be.type == ButtonType.lkas and be.pressed for be in CS.out.buttonEvents): + CS.lkas_disabled = not CS.lkas_disabled + return AolDataIQ(enable_aol, paused, CS.lkas_disabled) + + def update(self, CC: structs.CarControl, CC_IQ: structs.IQCarControl, CS) -> None: + self.aol = self.aol_status_update(CC, CC_IQ, CS) + + +class AolCarState(AolCarStateBase): + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + super().__init__(CP, CP_IQ) + self.lkas_heartbit = 0 + self.init_lkas_disabled = False + self.lkas_disabled = False + + @staticmethod + def get_parser(CP, pt_messages, cam_messages) -> None: + if CP.carFingerprint in RAM_CARS: + pt_messages.append(("Center_Stack_2", 1)) + else: + pt_messages.append(("TRACTION_BUTTON", 1)) + cam_messages.append(("LKAS_HEARTBIT", 1)) + + def _read_lkas_button(self, cp, cp_cam) -> int: + if self.CP.carFingerprint in RAM_CARS: + return cp.vl["Center_Stack_2"]["LKAS_Button"] + + self.lkas_heartbit = cp_cam.vl["LKAS_HEARTBIT"] + if not self.init_lkas_disabled: + self.lkas_disabled = cp_cam.vl["LKAS_HEARTBIT"]["LKAS_DISABLED"] + self.init_lkas_disabled = True + return cp.vl["TRACTION_BUTTON"]["TOGGLE_LKAS"] + + def update_aol(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None: + self.prev_lkas_button = self.lkas_button + self.lkas_button = self._read_lkas_button(can_parsers[Bus.pt], can_parsers[Bus.cam]) diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_carcontroller.py b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_carcontroller.py new file mode 100644 index 000000000..140fff14a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_carcontroller.py @@ -0,0 +1,30 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Chrysler low-speed steering gate: overrides the stock LKAS control bit when the +no-min-steering-speed option is set, and holds the RAM DT engagement window. +""" +from iqdbc.car import structs +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.chrysler.values import RAM_DT +from iqdbc.lvbs.car.chrysler.iq_values import ChryslerFlagsIQ + +GearShifter = structs.CarState.GearShifter + + +class IQCarController: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + + def get_lkas_control_bit(self, CS: CarStateBase, CC: structs.CarControl, lkas_control_bit: bool) -> bool: + if self.CP_IQ.flags & ChryslerFlagsIQ.NO_MIN_STEERING_SPEED: + return CC.latActive + + if self.CP.carFingerprint in RAM_DT: + if self.CP.minEnableSpeed <= CS.out.vEgo <= self.CP.minEnableSpeed + 0.5: + lkas_control_bit = True + if self.CP.minEnableSpeed >= 14.5 and CS.out.gearShifter != GearShifter.drive: + lkas_control_bit = False + + return lkas_control_bit diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_carstate.py b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_carstate.py new file mode 100644 index 000000000..e92944a69 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_carstate.py @@ -0,0 +1,32 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Chrysler cruise-button reader: emits edge ButtonEvents for the ACC steering-wheel +buttons so IQ.Pilot can react to accel/decel/cancel/resume. +""" +from enum import StrEnum + +from iqdbc.car import Bus, structs +from iqdbc.can.parser import CANParser +from iqdbc.lvbs.car.chrysler.iq_values import BUTTONS + + +class IQCarState: + def __init__(self, CP, CP_IQ): + self.CP = CP + self.CP_IQ = CP_IQ + self.button_events: list = [] + self.button_states = {button.event_type: False for button in BUTTONS} + + def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None: + cp = can_parsers[Bus.pt] + events = [] + for button in BUTTONS: + pressed = cp.vl[button.can_addr][button.can_msg] in button.values + if pressed != self.button_states[button.event_type]: + event = structs.CarState.ButtonEvent.new_message() + event.type = button.event_type + event.pressed = pressed + events.append(event) + self.button_states[button.event_type] = pressed + self.button_events = events diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_fingerprints.py b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_fingerprints.py new file mode 100644 index 000000000..ff5d937b4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_fingerprints.py @@ -0,0 +1,27 @@ +from iqdbc.car.structs import CarParams +from iqdbc.car.chrysler.values import CAR + +Ecu = CarParams.Ecu + + +FW_VERSIONS_EXT = { + CAR.RAM_1500_5TH_GEN: { + (Ecu.combinationMeter, 0x742, None): [ + b'68453485AC', + b'68510283AH', + ], + (Ecu.eps, 0x75a, None): [ + b'68552791AA', + ], + (Ecu.engine, 0x7e0, None): [ + b'05149390AA ', + b'68378696AI ', + b'68500631AF', + ], + (Ecu.transmission, 0x7e1, None): [ + b'68360085AF', + b'68360086AL', + b'68502996AC', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_values.py b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_values.py new file mode 100644 index 000000000..caee7333c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/chrysler/iq_values.py @@ -0,0 +1,24 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +IQ.Pilot Chrysler extension flags + the cruise-button table read by the AOL +cruise-button reader. +""" +from collections import namedtuple +from enum import IntFlag + +from iqdbc.car import structs + +ButtonType = structs.CarState.ButtonEvent.Type +Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) + +BUTTONS = [ + Button(ButtonType.accelCruise, "CRUISE_BUTTONS", "ACC_Accel", [1]), + Button(ButtonType.decelCruise, "CRUISE_BUTTONS", "ACC_Decel", [1]), + Button(ButtonType.cancel, "CRUISE_BUTTONS", "ACC_Cancel", [1]), + Button(ButtonType.resumeCruise, "CRUISE_BUTTONS", "ACC_Resume", [1]), +] + + +class ChryslerFlagsIQ(IntFlag): + NO_MIN_STEERING_SPEED = 1 diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/gm/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/gm/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_carstate.py b/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_carstate.py new file mode 100644 index 000000000..96d1344ad --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_carstate.py @@ -0,0 +1,26 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Non-ACC GM carState: these cars have no adaptive cruise, so cruise engage/set +speed come from the stock (non-adaptive) ECM cruise message. +""" +from enum import StrEnum + +from iqdbc.car import Bus, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.can.parser import CANParser +from iqdbc.lvbs.car.gm.iq_values import GMFlagsIQ + + +class IQCarState: + def __init__(self, CP, CP_IQ): + self.CP = CP + self.CP_IQ = CP_IQ + + def update(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None: + if not self.CP_IQ.flags & GMFlagsIQ.NON_ACC: + return + pt_cp = can_parsers[Bus.pt] + ret.cruiseState.enabled = pt_cp.vl["ECMCruiseControl"]["CruiseActive"] != 0 + ret.cruiseState.speed = pt_cp.vl["ECMCruiseControl"]["CruiseSetSpeed"] * CV.KPH_TO_MS + ret.accFaulted = False diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_fingerprints.py b/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_fingerprints.py new file mode 100644 index 000000000..4d5944140 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_fingerprints.py @@ -0,0 +1,119 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +# ruff: noqa: E501 +from iqdbc.car.gm.values import CAR + +FINGERPRINTS_EXT = { + # FIXME-IQ: Need user validation + # CAR.CHEVROLET_VOLT: [{ + # 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 513: 6, 528: 4, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 5, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 761: 7, 810: 8, 840: 5, 842: 5, 844: 8, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1922: 7 + # }], + # FIXME-IQ: Need a message to distinguish flashed from non-flashed + # CAR.CHEVROLET_VOLT_CC: [ + # Volt Premier w/o acc 2016 + # { + # 170: 8, 171: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 199: 4, 201: 6, 209: 7, 211: 2, 241: 6, 288: 5, 289: 1, 290: 1, 298: 2, 304: 8, 308: 4, 309: 8, 311: 8, 313: 8, 320: 8, 328: 1, 352: 5, 368: 8, 381: 6, 384: 8, 386: 5, 388: 8, 389: 2, 390: 7, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 3, 508: 8, 512: 3, 528: 4, 530: 8, 532: 6, 537: 4, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 8, 563: 5, 564: 5, 565: 8, 566: 5, 567: 3, 568: 1, 577: 8, 578: 8, 594: 8, 647: 3, 707: 8, 711: 6, 717: 5, 761: 7, 800: 6, 810: 8, 821: 4, 823: 7, 832: 8, 840: 5, 842: 6, 844: 8, 866: 4, 869: 4, 961: 8, 969: 8, 977: 8, 979: 7, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1273: 3, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1602: 8, 1618: 8, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1922: 7, 1927: 7, 1928: 7, 1930: 7, 2016: 8, 2017: 8, 2018: 8, 2019: 8, 2020: 8, 2024: 8, 2025: 8, 2028: 8 + # }, + # { + # 201: 8, 493: 8, 495: 4, 193: 8, 197: 8, 209: 7, 171: 8, 456: 8, 199: 4, 489: 8, 211: 2, 499: 3, 390: 7, 532: 6, 568: 1, 761: 7, 381: 6, 485: 8, 189: 7, 479: 3, 711: 6, 501: 8, 241: 6, 717: 5, 869: 4, 389: 2, 454: 8, 170: 8, 190: 6, 497: 8, 417: 7, 419: 1, 426: 7, 451: 8, 452: 8, 453: 6, 500: 6, 508: 8, 528: 4, 647: 3, 1105: 6, 1005: 6, 481: 7, 844: 8, 866: 4, 564: 5, 969: 8, 388: 8, 352: 5, 562: 8, 961: 8, 386: 8, 707: 8, 977: 8, 979: 7, 298: 8, 840: 5, 842: 5, 988: 6, 1001: 8, 560: 8, 546: 7, 558: 8, 309: 8, 995: 7, 311: 8, 566: 5, 567:3, 989: 8, 384: 4, 800: 6, 1033: 7, 1034: 7, 313: 8, 554: 3, 810: 8, 1017: 8, 1019: 2, 1020: 8, 1217: 8, 1223: 3, 1233: 8, 1227: 4, 1417: 8, 1009: 8, 1221: 5, 1275: 3, 1225: 7, 289: 8, 550: 8, 1273: 3, 1928: 7, 1187: 4, 1265: 8, 1927: 7, 1267: 1, 1906: 7, 288: 5, 304: 1, 328: 1, 1912: 7, 320: 3, 1910: 7, 563: 5, 1249: 8, 1930: 7, 1257: 6, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 565: 5, 1280: 4, 1907: 7 + # }, + # # Volt Premier w/o ACC 2018 + Pedal + # { + # 189: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 513: 6, 528: 4, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 5, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 717: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1922: 7, 1930: 7 + # } + # ], + CAR.CHEVROLET_BOLT_NON_ACC: [ + # Bolt Premier w/o ACC 2017 + { + 170: 8, 188: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 201: 6, 209: 7, 211: 2, 241: 6, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 311: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 5, 353: 3, 368: 8, 381: 6, 384: 8, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 512: 3, 513: 6, 514: 2, 516: 4, 519: 2, 521: 3, 528: 5, 530: 8, 532: 7, 537: 5, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 4, 563: 5, 564: 5, 565: 8, 566: 6, 567: 5, 568: 1, 569: 3, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 832: 8, 840: 6, 842: 6, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1601: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8 + }, + # Bolt EV Premier 2017 + { + 170: 8, 188: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 201: 6, 209: 7, 211: 2, 241: 6, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 311: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 5, 353: 3, 368: 8, 381: 6, 384: 8, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 513: 6, 512: 3, 514: 2, 516: 4, 519: 2, 521: 3, 528: 5, 530: 8, 532: 7, 537: 5, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 4, 563: 5, 564: 5, 565: 8, 566: 6, 567: 5, 568: 1, 569: 3, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 832: 8, 840: 6, 842: 6, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1601: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8 + }, + # Bolt EV Premier 2017 w Pedal + { + 170: 8, 188: 8, 189: 7, 190: 6, 192: 5, 193: 8, 197: 8, 201: 6, 209: 7, 211: 2, 241: 6, 289: 1, 290: 1, 298: 8, 304: 8, 309: 8, 311: 8, 313: 8, 320: 8, 322: 7, 328: 1, 352: 5, 353: 3, 368: 8, 381: 6, 384: 8, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 5, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 512: 3, 512: 6, 513: 6, 514: 2, 516: 4, 519: 2, 521: 3, 528: 5, 530: 8, 532: 7, 537: 5, 539: 8, 542: 7, 546: 7, 550: 8, 554: 3, 558: 8, 560: 6, 562: 4, 563: 5, 564: 5, 565: 8, 566: 6, 567: 5, 568: 1, 569: 3, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 832: 8, 840: 6, 842: 6, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 5, 1003: 5, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1601: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8 # noqa: F601 + }, + # Bolt EV Premier 2017 2 w Pedal + { + 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 6, 567: 5, 568: 1, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7 + }, + { + 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 6, 567: 5, 568: 1, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8 + }], + CAR.CHEVROLET_BOLT_NON_ACC_1ST_GEN: [ + # Bolt Premier no ACC 2018 + Pedal + { + 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 6, 567: 5, 568: 1, 573: 1, 577: 8, 592: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1601: 8, 1616: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7, 2020: 8, 2023: 8, 2028: 8, 2031: 8 + }, + # Bolt Premier no ACC 2019 + Pedal + { + 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 512: 6, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 7, 567: 5, 568: 2, 569: 3, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1037: 5, 1105: 5, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1268: 2, 1275: 3, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2024: 8 + }, + # Bolt Premier no ACC 2020 + { + 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 7, 567: 5, 568: 2, 569: 3, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1037: 5, 1105: 5, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1268: 2, 1275: 3, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1927: 7, 2016: 8, 2024: 8 + }], + CAR.CHEVROLET_BOLT_NON_ACC_2ND_GEN: [ + # Bolt EV Premier no ACC 2023 w Pedal + { + 170: 8, 188: 8, 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 308: 4, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 353: 3, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 398: 8, 407: 7, 417: 8, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 8, 567: 5, 568: 2, 569: 3, 573: 1, 577: 8, 592: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 711: 6, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 880: 6, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1010: 8, 1013: 6, 1015: 1, 1017: 8, 1019: 2, 1020: 8, 1037: 5, 1105: 5, 1187: 5, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1601: 8, 1616: 8, 1618: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7, 1930: 7, 2016: 8, 2020: 8, 2023: 8, 2024: 8, 2028: 8, 2031: 8 + }, + # Bolt EV Premier no ACC 2021 + { + 170: 8, 188: 8, 189: 7, 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 257: 8, 288: 5, 298: 8, 304: 1, 308: 4, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 407: 7, 417: 7, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 7, 567: 5, 568: 1, 569: 3, 573: 1, 577: 8, 578: 8, 579: 8, 592: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 3, 707: 8, 711: 6, 717: 5, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 7, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1037: 5, 1105: 5, 1187: 4, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1243: 3, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1345: 8, 1346: 8, 1347: 8, 1513: 8, 1516: 8, 1601: 8, 1616: 8, 1904: 7, 1905: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1922: 7, 1927: 7, 2016: 8, 2017: 8, 2018: 8, 2020: 8, 2023: 8, 2024: 8, 2028: 8, 2031: 8 + }, + # shermy99's Bolt EV Premier no ACC 2023 + { + 170: 8, 188: 8, 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 308: 4, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 353: 3, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 398: 8, 407: 7, 417: 8, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 566: 8, 567: 5, 568: 2, 569: 3, 573: 1, 577: 8, 579: 8, 592: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 711: 6, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 880: 6, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1005: 6, 1009: 8, 1010: 8, 1013: 6, 1015: 1, 1017: 8, 1019: 2, 1020: 8, 1037: 5, 1105: 5, 1187: 5, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1345: 8, 1347: 8, 1513: 8, 1516: 8, 1601: 8, 1609: 8, 1613: 8, 1616: 8, 1618: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1913: 7, 1920: 8, 1922: 7, 1924: 8, 1927: 7, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1984: 8, 1988: 8, 2000: 8, 2001: 8, 2002: 8, 2017: 8, 2018: 8, 2020: 8, 2023: 8, 2025: 8, 2028: 8, 2031: 8 + }, + { + 170: 8, 188: 8, 189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 353: 3, 381: 8, 384: 4, 386: 8, 388: 8, 390: 7, 398: 8, 407: 7, 417: 8, 419: 1, 451: 8, 452: 8, 453: 6, 454: 8, 456: 8, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 2, 508: 8, 513: 6, 528: 5, 532: 6, 546: 7, 550: 8, 554: 3, 558: 8, 560: 8, 562: 8, 564: 5, 566: 8, 567: 5, 568: 2, 569: 3, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 711: 6, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 866: 4, 869: 4, 872: 1, 880: 6, 961: 8, 967: 4, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 988: 6, 989: 8, 995: 7, 1001: 8, 1009: 8, 1010: 8, 1013: 6, 1015: 1, 1017: 8, 1019: 2, 1020: 8, 1105: 5, 1187: 5, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1227: 4, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1265: 8, 1275: 3, 1279: 4, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1905: 7, 1906: 7, 1907: 7, 1910: 7, 1912: 7, 1913: 7, 1927: 7, 1930: 7, 2016: 8, 2020: 8, 2024: 8, 2028: 8 + }], + CAR.CHEVROLET_EQUINOX_NON_ACC_3RD_GEN: [{ + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 401: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 444: 7, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 569: 3, 573: 1, 577: 8, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 880: 6, 961: 8, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1017: 8, 1020: 8, 1033: 7, 1034: 7, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1273: 3, 1280: 4, 1296: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1601: 8, 1611: 8, 1618: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1920: 7, 1930: 7 + }, + { + 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 384: 4, 393: 8, 398: 8, 401: 8, 413: 8, 422: 4, 431: 8, 444: 7, 453: 6, 456: 8, 479: 3, 481: 7, 485: 8, 499: 3, 500: 6, 501: 8, 567: 5, 647: 6, 800: 6, 1033: 7, 1034: 7, 1296: 4 + }], + # Trailblazer also matches as a Silverado, so comment out to avoid conflicts. + # TODO-IQ: split with FW versions + # CAR.TRAILBLAZER: [ + # { + # 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1609: 8, 1611: 8, 1613: 8, 1649: 8, 1792: 8, 1798: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1858: 8, 1860: 8, 1863: 8, 1872: 8, 1875: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1930: 7, 1937: 8, 1953: 8, 1968: 8, 2001: 8, 2017: 8, 2018: 8, 2020: 8 + # }], + CAR.CHEVROLET_SUBURBAN_NON_ACC_11TH_GEN: [ + # Slav's 2018 Suburban, LKAS no ACC + { + 170: 8, 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 393: 8, 398: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 493: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 510: 8, 532: 6, 562: 8, 563: 5, 564: 5, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 717: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1017: 8, 1019: 2, 1020: 8, 1105: 6, 1217: 8, 1221: 5, 1223: 2, 1225: 8, 1233: 8, 1249: 8, 1257: 6, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7, 1920: 7 + }, + # Qube's 2017 Suburban, LKAS no ACC + { + 190: 6, 193: 8, 197: 8, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 460: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 510: 8, 528: 5, 532: 6, 534: 2, 562: 8, 563: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 717: 5, 761: 7, 800: 6, 801: 8, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1609: 8, 1611: 8, 1613: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1799: 8, 1810: 8, 1813: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1856: 8, 1858: 8, 1859: 8, 1860: 8, 1862: 8, 1863: 8, 1871: 8, 1872: 8, 1875: 8, 1879: 8, 1882: 8, 1888: 8, 1889: 8, 1892: 8, 1920: 8, 1924: 8, 1927: 8, 1937: 8, 1953: 8, 1954: 8, 1955: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1984: 8, 1988: 8, 1990: 8, 2000: 8, 2001: 8, 2004: 8, 2017: 8, 2018: 8, 2020: 8 + }], + CAR.CADILLAC_CT6_NON_ACC_1ST_GEN: [ + # badgers4life's 2017 CT6 + { + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 289: 8, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 322: 4, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 2, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 456: 8, 460: 5, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 4, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 3, 573: 1, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 717: 5, 723: 2, 753: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 961: 8, 969: 8, 977: 8, 979: 7, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 1, 1017: 8, 1019: 2, 1020: 8, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 7, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1609: 8, 1613: 8, 1649: 8, 1792: 8, 1793: 8, 1798: 8, 1799: 8, 1810: 8, 1813: 8, 1824: 8, 1825: 8, 1840: 8, 1842: 8, 1856: 8, 1858: 8, 1859: 8, 1860: 8, 1862: 8, 1863: 8, 1872: 8, 1875: 8, 1879: 8, 1882: 8, 1888: 4, 1889: 8, 1892: 8, 1906: 7, 1907: 7, 1912: 7, 1914: 7, 1919: 7, 1920: 8, 1924: 8, 1927: 8, 1928: 7, 1937: 8, 1953: 8, 1954: 8, 1955: 8, 1968: 8, 1969: 8, 1971: 8, 1975: 8, 1984: 8, 1988: 8, 2000: 8, 2001: 8, 2002: 8, 2004: 8, 2017: 8, 2018: 8, 2020: 8, 2026: 8 + }], + CAR.CHEVROLET_TRAILBLAZER_NON_ACC_2ND_GEN: [ + { + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 289: 8, 292: 2, 298: 8, 304: 3, 309: 8, 313: 8, 320: 4, 322: 7, 328: 1, 331: 3, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 456: 8, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 528: 5, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 569: 3, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 717: 5, 723: 4, 730: 4, 761: 7, 800: 6, 840: 5, 842: 5, 844: 8, 869: 4, 961: 8, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 6, 1017: 8, 1020: 8, 1037: 5, 1105: 5, 1187: 5, 1195: 3, 1217: 8, 1221: 5, 1223: 2, 1225: 7, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1268: 2, 1271: 8, 1273: 3, 1276: 2, 1277: 7, 1278: 4, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7 + }], + CAR.CHEVROLET_MALIBU_NON_ACC_9TH_GEN: [ + # Verylukyguy's Malibu + { + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 257: 8, 288: 5, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 328: 1, 352: 5, 368: 3, 381: 8, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 401: 8, 407: 7, 409: 8, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 499: 3, 500: 6, 501: 8, 508: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 565: 5, 567: 5, 573: 1, 577: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 647: 6, 707: 8, 717: 5, 730: 4, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 961: 8, 969: 8, 975: 2, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 6, 1017: 8, 1020: 8, 1037: 5, 1105: 5, 1187: 6, 1189: 1, 1195: 3, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1236: 8, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1268: 2, 1271: 8, 1273: 3, 1279: 4, 1280: 4, 1300: 8, 1322: 6, 1323: 4, 1328: 4, 1417: 8, 1601: 8, 1906: 7, 1907: 7, 1912: 7, 1919: 7 + }, + # Tesla's Malibu + { + 189: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 311: 8, 313: 8, 320: 3, 328: 1, 352: 5, 381: 6, 384: 4, 386: 8, 388: 8, 389: 6, 390: 8, 392: 4, 393: 4, 394: 8, 395: 3, 396: 4, 397: 4, 398: 4, 399: 4, 400: 4, 401: 4, 402: 4, 403: 4, 404: 4, 405: 4, 406: 4, 407: 4, 408: 4, 409: 4, 410: 4, 411: 4, 412: 4, 413: 4, 414: 4, 415: 4, 416: 4, 417: 4, 418: 4, 419: 4, 420: 4, 421: 4, 422: 4, 423: 4, 424: 4, 425: 4, 426: 4, 427: 4, 428: 4, 429: 4, 430: 4, 431: 4, 432: 4, 433: 4, 434: 4, 435: 4, 436: 4, 437: 4, 438: 4, 439: 4, 440: 4, 441: 4, 442: 4, 443: 4, 444: 4, 445: 4, 446: 4, 447: 4, 448: 4, 449: 4, 450: 4, 451: 8, 452: 8, 453: 6, 479: 4, 481: 7, 485: 8, 489: 8, 493: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 6, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 717: 5, 761: 7, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1922: 7 + }], + CAR.CADILLAC_XT5_NON_ACC_1ST_GEN: [ + # TRain's 2017 XT5 + { + 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 647: 3, 707: 8, 717: 5, 723: 2, 753: 5, 761: 7, 800: 6, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1914: 7, 1919: 7, 1920: 7 + }], +} diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_interface.py b/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_interface.py new file mode 100644 index 000000000..1c7b64cef --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_interface.py @@ -0,0 +1,43 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +GM torque-space feed-forward for the IQ.Pilot lateral extension: a sigmoid+linear +lat-accel -> torque curve for the tuned platforms, else the linear default. +""" +from math import exp + +from iqdbc.car import structs +from iqdbc.car.gm.interface import CAR +from iqdbc.lvbs.car.interfaces import LatControlInputs, TorqueFromLateralAccelCallbackTypeTorqueSpace + +_NON_LINEAR_TORQUE_PARAMS = { + CAR.CHEVROLET_BOLT_EUV: [2.6531724862969748, 1.0, 0.1919764879840985, 0.009054123646805178], + CAR.GMC_ACADIA: [4.78003305, 1.0, 0.3122, 0.05591772], + CAR.CHEVROLET_SILVERADO: [3.29974374, 1.0, 0.25571356, 0.0465122], +} + + +class IQCarInterface: + def __init__(self, CP: structs.CarParams, CI_Base): + self.CP = CP + self.CI_Base = CI_Base + + @staticmethod + def _centered_sigmoid(val: float) -> float: + # sigmoid shifted to pass through the origin; branch keeps exp() from overflowing + if val >= 0: + return 1.0 / (1.0 + exp(-val)) - 0.5 + z = exp(val) + return z / (1.0 + z) - 0.5 + + def torque_from_lateral_accel_siglin(self, latcontrol_inputs: LatControlInputs, + torque_params: structs.CarParams.LateralTorqueTuning, + gravity_adjusted: bool) -> float: + a, b, c, _ = _NON_LINEAR_TORQUE_PARAMS[self.CP.carFingerprint] + lat_accel = latcontrol_inputs.lateral_acceleration + return float(self._centered_sigmoid(lat_accel * a) * b + lat_accel * c) + + def torque_from_lateral_accel_in_torque_space(self) -> TorqueFromLateralAccelCallbackTypeTorqueSpace: + if self.CP.carFingerprint in _NON_LINEAR_TORQUE_PARAMS: + return self.torque_from_lateral_accel_siglin + return self.CI_Base.torque_from_lateral_accel_linear_in_torque_space diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_values.py b/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_values.py new file mode 100644 index 000000000..b52d29380 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/gm/iq_values.py @@ -0,0 +1,14 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +IQ.Pilot GM extension flags for the non-adaptive-cruise (Non-ACC) camera-harness port. +""" +from enum import IntFlag + + +class GMFlagsIQ(IntFlag): + NON_ACC = 1 + + +class GMSafetyFlagsIQ: + NON_ACC = 1 diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/honda/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/honda/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/honda/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/honda/aol.py b/artifacts/package_runtime/iqdbc/lvbs/car/honda/aol.py new file mode 100644 index 000000000..449949168 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/honda/aol.py @@ -0,0 +1,19 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from iqdbc.car import structs +from iqdbc.car.honda.values import HONDA_BOSCH_RADARLESS + + +class AolCarController: + def __init__(self): + self.dashed_lanes = False + + def update(self, CP: structs.CarParams, CC: structs.CarControl, CC_IQ: structs.IQCarControl) -> None: + enable_aol = CC_IQ.aol.available + + if enable_aol: + self.dashed_lanes = CC_IQ.aol.enabled and not CC.latActive + else: + self.dashed_lanes = CC.hudControl.lanesVisible if CP.carFingerprint in HONDA_BOSCH_RADARLESS else False diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/honda/gas_interceptor.py b/artifacts/package_runtime/iqdbc/lvbs/car/honda/gas_interceptor.py new file mode 100644 index 000000000..95ed00a91 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/honda/gas_interceptor.py @@ -0,0 +1,32 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import numpy as np + +from iqdbc.car import structs +from iqdbc.car.can_definitions import CanData +from iqdbc.lvbs.car import create_gas_interceptor_command + + +class GasInterceptorCarController: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + + self.gas = 0. + self.interceptor_gas_cmd = 0. + + def update(self, CC: structs.CarControl, CS: structs.CarState, gas: float, brake: float, wind_brake: float, + packer, frame: int) -> list[CanData]: + can_sends = [] + + if self.CP_IQ.enableGasInterceptor: + gas_pedal = np.interp(CS.out.vEgo, [0., 10.], [0.4, 1.0]) + if CC.longActive: + self.gas = float(np.clip(gas_pedal * (gas - brake + wind_brake * 3 / 4), 0., 1.)) + else: + self.gas = 0.0 + can_sends.append(create_gas_interceptor_command(packer, self.gas, frame // 2)) + + return can_sends diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_carstate.py b/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_carstate.py new file mode 100644 index 000000000..8987e5ab0 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_carstate.py @@ -0,0 +1,37 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from enum import StrEnum + +from iqdbc.car import Bus, structs +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.honda.values import HONDA_BOSCH, HONDA_BOSCH_CANFD, HONDA_BOSCH_RADARLESS +from iqdbc.can.parser import CANParser +from iqdbc.lvbs.car.honda.iq_values import HondaFlagsIQ + + +class IQCarState: + def __init__(self, CP, CP_IQ): + self.CP = CP + self.CP_IQ = CP_IQ + + def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + + if self.CP_IQ.flags & HondaFlagsIQ.HAS_CAMERA_MESSAGES: + speed_bus = cp if (self.CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS - HONDA_BOSCH_CANFD)) else cp_cam + speed_limit_raw = speed_bus.vl["CAMERA_MESSAGES"]["SPEED_LIMIT_SIGN"] % 32 + ret_iq.speedLimit = speed_limit_raw * 5.0 * CV.MPH_TO_MS if (1 <= speed_limit_raw <= 17) else 0.0 + + if self.CP_IQ.flags & HondaFlagsIQ.NIDEC_HYBRID: + ret.accFaulted = bool(cp.vl["HYBRID_BRAKE_ERROR"]["BRAKE_ERROR_1"] or cp.vl["HYBRID_BRAKE_ERROR"]["BRAKE_ERROR_2"]) + ret.stockAeb = bool(cp_cam.vl["BRAKE_COMMAND"]["AEB_REQ_1"] and cp_cam.vl["BRAKE_COMMAND"]["COMPUTER_BRAKE_HYBRID"] > 1e-5) + + if self.CP_IQ.flags & HondaFlagsIQ.HYBRID_ALT_BRAKEHOLD: + ret.brakeHoldActive = cp.vl["BRAKE_HOLD_HYBRID_ALT"]["BRAKE_HOLD_ACTIVE"] == 1 + + if self.CP_IQ.enableGasInterceptor: + # Same threshold as panda, equivalent to 1e-5 with previous DBC scaling + gas = (cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS"] + cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS2"]) // 2 + ret.gasPressed = gas > 492 diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_fingerprints.py b/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_fingerprints.py new file mode 100644 index 000000000..34cead11b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_fingerprints.py @@ -0,0 +1,56 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from iqdbc.car.structs import CarParams +from iqdbc.car.honda.values import CAR + +Ecu = CarParams.Ecu + +FW_VERSIONS_EXT = { + CAR.HONDA_ACCORD: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TVA,A150\x00\x00', + ], + }, + CAR.HONDA_CIVIC: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TBA,A030\x00\x00', + ], + }, + CAR.HONDA_CIVIC_BOSCH: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TGG,A020\x00\x00', + b'39990-TGG,A120\x00\x00', + ], + }, + CAR.HONDA_CRV_5G: { + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TLA,A040\x00\x00', + ], + }, + CAR.HONDA_CLARITY: { + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TRW-A910\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TRW-A010\x00\x00', + b'57114-TRW-A020\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TRW-A020\x00\x00', + b'39990-TRW,A020\x00\x00', # modified firmware + b'39990,TRW,A020\x00\x00', # extra modified firmware + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TRW-A210\x00\x00', + b'77959-TRW-A220\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TRW-A010\x00\x00', + ], + (Ecu.fwdRadar, 0x18dab0f1, None): [ + b'36161-TRW-A110\x00\x00', + ], + }, +} diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_values.py b/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_values.py new file mode 100644 index 000000000..d04d32964 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/honda/iq_values.py @@ -0,0 +1,17 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from enum import IntFlag + + +class HondaFlagsIQ(IntFlag): + NIDEC_HYBRID = 1 + EPS_MODIFIED = 2 + HYBRID_ALT_BRAKEHOLD = 4 + HAS_CAMERA_MESSAGES = 8 + + +class HondaSafetyFlagsIQ: + NIDEC_HYBRID = 1 + GAS_INTERCEPTOR = 2 diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/honda/test_honda.py b/artifacts/package_runtime/iqdbc/lvbs/car/honda/test_honda.py new file mode 100644 index 000000000..09e34c813 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/honda/test_honda.py @@ -0,0 +1,48 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from parameterized import parameterized +from types import SimpleNamespace + +from iqdbc.can import CANParser +from iqdbc.car import Bus, gen_empty_fingerprint +from iqdbc.car.structs import CarParams, CarState, IQCarState as IQCarStateStruct +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.honda.values import CAR +from iqdbc.lvbs.car.honda.iq_carstate import IQCarState + +CarFw = CarParams.CarFw + + +class TestHondaEpsMod: + + @parameterized.expand([(CAR.HONDA_CIVIC, b'39990-TBA,A030\x00\x00'), (CAR.HONDA_CIVIC, b'39990-TBA-A030\x00\x00'), + (CAR.HONDA_CLARITY, b'39990-TRW-A020\x00\x00'), (CAR.HONDA_CLARITY, b'39990,TRW,A020\x00\x00')]) + def test_eps_mod_fingerprint(self, car_name, fw): + fingerprint = gen_empty_fingerprint() + car_fw = [CarFw(ecu="eps", fwVersion=fw)] + + CarInterface = interfaces[car_name] + CP = CarInterface.get_params(car_name, fingerprint, car_fw, False, False, False) + _ = CarInterface.get_params_iq(CP, car_name, fingerprint, car_fw, False, False, False) + + assert not CP.dashcamOnly + + +class TestHondaGasInterceptor: + def test_gas_sensor_registration_and_threshold(self): + CP = SimpleNamespace() + CP_IQ = SimpleNamespace(enableGasInterceptor=True, flags=0) + parser = CANParser("acura_ilx_2016_can_generated", [], 0) + state = IQCarState(CP, CP_IQ) + ret = CarState() + ret_iq = IQCarStateStruct() + + state.update(ret, ret_iq, {Bus.pt: parser, Bus.cam: parser}) + assert "GAS_SENSOR" in parser.vl + assert not ret.gasPressed + + parser.vl["GAS_SENSOR"]["INTERCEPTOR_GAS"] = 493 + parser.vl["GAS_SENSOR"]["INTERCEPTOR_GAS2"] = 493 + state.update(ret, ret_iq, {Bus.pt: parser, Bus.cam: parser}) + assert ret.gasPressed diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/interfaces.py b/artifacts/package_runtime/iqdbc/lvbs/car/interfaces.py new file mode 100644 index 000000000..dd1181707 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/interfaces.py @@ -0,0 +1,127 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import json +import numpy as np +from typing import NamedTuple +from collections.abc import Callable + +from iqdbc.car import structs +from iqdbc.car.can_definitions import CanRecvCallable, CanSendCallable +from iqdbc.car.subaru.values import SubaruFlags +from iqdbc.lvbs.car.subaru.iq_values import SubaruFlagsIQ, SubaruSafetyFlagsIQ +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ, TeslaSafetyFlagsIQ +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ + + +class LatControlInputs(NamedTuple): + lateral_acceleration: float + roll_compensation: float + vego: float + aego: float + + +TorqueFromLateralAccelCallbackTypeTorqueSpace = Callable[[LatControlInputs, structs.CarParams.LateralTorqueTuning, bool], float] + + +class CarInterfaceBaseIQ: + @staticmethod + def torque_from_lateral_accel_linear_in_torque_space(latcontrol_inputs: LatControlInputs, torque_params: structs.CarParams.LateralTorqueTuning, + gravity_adjusted: bool) -> float: + # The default is a linear relationship between torque and lateral acceleration (accounting for road roll and steering friction) + return latcontrol_inputs.lateral_acceleration / float(torque_params.latAccelFactor) + + def torque_from_lateral_accel_in_torque_space(self) -> TorqueFromLateralAccelCallbackTypeTorqueSpace: + return self.torque_from_lateral_accel_linear_in_torque_space + + +class NanoFFModel: + def __init__(self, weights_loc: str, platform: str): + self.weights_loc = weights_loc + self.platform = platform + self.load_weights(platform) + + def load_weights(self, platform: str): + with open(self.weights_loc) as fob: + self.weights = {k: np.array(v) for k, v in json.load(fob)[platform].items()} + + def relu(self, x: np.ndarray): + return np.maximum(0.0, x) + + def forward(self, x: np.ndarray): + assert x.ndim == 1 + x = (x - self.weights['input_norm_mat'][:, 0]) / (self.weights['input_norm_mat'][:, 1] - self.weights['input_norm_mat'][:, 0]) + x = self.relu(np.dot(x, self.weights['w_1']) + self.weights['b_1']) + x = self.relu(np.dot(x, self.weights['w_2']) + self.weights['b_2']) + x = self.relu(np.dot(x, self.weights['w_3']) + self.weights['b_3']) + x = np.dot(x, self.weights['w_4']) + self.weights['b_4'] + return x + + def predict(self, x: list[float], do_sample: bool = False): + x = self.forward(np.array(x)) + if do_sample: + pred = np.random.laplace(x[0], np.exp(x[1]) / self.weights['temperature']) + else: + pred = x[0] + pred = pred * (self.weights['output_norm_mat'][1] - self.weights['output_norm_mat'][0]) + self.weights['output_norm_mat'][0] + return pred + + +def apply_iq_car_config(CI, CP: structs.CarParams, CP_IQ: structs.IQCarParams, + params_list: list[dict[str, str]] | None = None, + can_recv: CanRecvCallable | None = None, can_send: CanSendCallable | None = None) -> None: + if params_list is None: + params_list = [] + + params_dict = {k: v for param in params_list for k, v in param.items()} + + _apply_long_tuning(CI, CP, CP_IQ, params_dict) + _apply_tesla_options(CP, CP_IQ, params_dict) + _apply_creep_assist(CP, CP_IQ, params_dict) + _apply_toyota_options(CP, CP_IQ, params_dict) + + +def _apply_long_tuning(CI, CP: structs.CarParams, CP_IQ: structs.IQCarParams, + params_dict: dict[str, str]) -> None: + + _ = CI.get_longitudinal_tuning_iq(CP, CP_IQ) + + +def _apply_tesla_options(CP: structs.CarParams, CP_IQ: structs.IQCarParams, + params_dict: dict[str, str]) -> None: + if CP.brand == 'tesla': + torque_blend = int(params_dict.get("IQTeslaTorqueBlend", 0)) == 1 + if torque_blend: + CP_IQ.flags |= TeslaFlagsIQ.COOP_STEERING.value + fsd_visualization = int(params_dict.get("IQTeslaFsdVisualization", 0)) == 1 + if fsd_visualization: + CP_IQ.flags |= TeslaFlagsIQ.FSD_VISUALIZATION.value + CP_IQ.iqSafetyFlags |= TeslaSafetyFlagsIQ.FSD_VISUALIZATION + + +def _apply_creep_assist(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params_dict: dict[str, str]) -> None: + # Subaru stop-and-go; unsupported on gen2-global and hybrid platforms. + if CP.brand != 'subaru' or CP.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID): + return + + if int(params_dict.get("IQSubaruCreepAssist", 0)) == 1: + CP_IQ.flags |= SubaruFlagsIQ.STOP_AND_GO.value + if int(params_dict.get("IQSubaruCreepAssistManualBrake", 0)) == 1: + CP_IQ.flags |= SubaruFlagsIQ.STOP_AND_GO_MANUAL_PARKING_BRAKE.value + + if CP_IQ.flags & (SubaruFlagsIQ.STOP_AND_GO | SubaruFlagsIQ.STOP_AND_GO_MANUAL_PARKING_BRAKE): + CP_IQ.iqSafetyFlags |= SubaruSafetyFlagsIQ.STOP_AND_GO + + +def _apply_toyota_options(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params_dict: dict[str, str]) -> None: + if CP.brand == 'toyota': + toyota_stock_long = int(params_dict.get("IQToyotaFactoryLong", 0)) == 1 + toyota_sng_hack = int(params_dict.get("ToyotaSnGHack", 0)) == 1 + + if toyota_stock_long: + CP_IQ.flags |= ToyotaFlagsIQ.STOCK_LONGITUDINAL.value + + if toyota_sng_hack: + CP_IQ.flags |= ToyotaFlagsIQ.STOP_AND_GO_HACK.value + CP.minEnableSpeed = -1. + CP.autoResumeSng = CP.openpilotLongitudinalControl diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/iq_fingerprints.py b/artifacts/package_runtime/iqdbc/lvbs/car/iq_fingerprints.py new file mode 100644 index 000000000..1d43a621b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/iq_fingerprints.py @@ -0,0 +1,36 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + + +def extend_fw_versions(fw_versions, new_fw_versions): + """ + Merge firmware versions by extending lists for matching ECUs, + adding all entries regardless of duplicates. + """ + for c, f in new_fw_versions.items(): + if c not in fw_versions: + fw_versions[c] = f + continue + + for e, new_fw_list in f.items(): + if e not in fw_versions[c]: + fw_versions[c][e] = new_fw_list + else: + fw_versions[c][e].extend(new_fw_list) + + return fw_versions + + +def extend_fingerprints(fingerprints, new_fingerprints): + """ + Merge fingerprints by extending lists for matching keys, + adding all entries regardless of duplicates. + """ + for car, fp_list in new_fingerprints.items(): + if car not in fingerprints: + fingerprints[car] = fp_list + else: + fingerprints[car].extend(fp_list) + + return fingerprints diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/iq_lateral.py b/artifacts/package_runtime/iqdbc/lvbs/car/iq_lateral.py new file mode 100644 index 000000000..bffb4af59 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/iq_lateral.py @@ -0,0 +1,18 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import numpy as np + +from iqdbc.car import structs +from iqdbc.car.lateral import apply_center_deadzone + + +def get_friction(lateral_accel_error: float, lateral_accel_deadzone: float, friction_threshold: float, + torque_params: structs.CarParams.LateralTorqueTuning) -> float: + # TODO torque params' friction should be in lataxel space, not torque space + friction_interp = np.interp( + apply_center_deadzone(lateral_accel_error, lateral_accel_deadzone), + [-friction_threshold, friction_threshold], + [-torque_params.friction, torque_params.friction] + ) + return float(friction_interp) diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/nissan/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/nissan/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/nissan/iq_carstate.py b/artifacts/package_runtime/iqdbc/lvbs/car/nissan/iq_carstate.py new file mode 100644 index 000000000..76e88915a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/nissan/iq_carstate.py @@ -0,0 +1,31 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Nissan cruise-button reader: emits edge ButtonEvents for the RES/SET buttons. +""" +from enum import StrEnum + +from iqdbc.car import Bus, structs +from iqdbc.can.parser import CANParser +from iqdbc.lvbs.car.nissan.values import BUTTONS + + +class IQCarState: + def __init__(self, CP, CP_IQ): + self.CP = CP + self.CP_IQ = CP_IQ + self.button_events: list = [] + self.button_states = {button.event_type: False for button in BUTTONS} + + def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None: + cp = can_parsers[Bus.pt] + events = [] + for button in BUTTONS: + pressed = cp.vl[button.can_addr][button.can_msg] in button.values + if pressed != self.button_states[button.event_type]: + event = structs.CarState.ButtonEvent.new_message() + event.type = button.event_type + event.pressed = pressed + events.append(event) + self.button_states[button.event_type] = pressed + self.button_events = events diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/nissan/values.py b/artifacts/package_runtime/iqdbc/lvbs/car/nissan/values.py new file mode 100644 index 000000000..d1cbe203a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/nissan/values.py @@ -0,0 +1,22 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +IQ.Pilot Nissan extension: safety flag + cruise-button table. +""" +from collections import namedtuple + +from iqdbc.car import structs + + +class NissanSafetyFlagsIQ: + DEFAULT = 0 + LEAF = 1 + + +ButtonType = structs.CarState.ButtonEvent.Type +Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) + +BUTTONS = [ + Button(ButtonType.accelCruise, "CRUISE_THROTTLE", "RES_BUTTON", [1]), + Button(ButtonType.decelCruise, "CRUISE_THROTTLE", "SET_BUTTON", [1]), +] diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/rivian/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/rivian/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/rivian/aol.py b/artifacts/package_runtime/iqdbc/lvbs/car/rivian/aol.py new file mode 100644 index 000000000..3c92c9a31 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/rivian/aol.py @@ -0,0 +1,30 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Always-on-Lateral output adapter for Rivian: derives the per-frame lateral-active +and lane-keep icon state the LKAS command needs from the shared AOL state. +""" +from collections import namedtuple + +from iqdbc.car import structs +from iqdbc.car.interfaces import CarStateBase + +# Rivian EPAS rejects large-angle torque, so lateral is dropped past this bound. +_MAX_STEERING_ANGLE = 90.0 + +AolDataIQ = namedtuple("AolDataIQ", ["lka_icon_states", "lat_active"]) + + +class AolCarController: + def __init__(self): + self.aol = AolDataIQ(False, False) + + def update(self, CC: structs.CarControl, CC_IQ: structs.IQCarControl, CS: CarStateBase) -> None: + prev_active = self.aol.lat_active + if CC_IQ.aol.available: + lat_active = CC.latActive and abs(CS.out.steeringAngleDeg) < _MAX_STEERING_ANGLE + lka_icon = prev_active + else: + lat_active = CC.latActive + lka_icon = CC.enabled + self.aol = AolDataIQ(lka_icon, lat_active) diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/rivian/iq_carstate.py b/artifacts/package_runtime/iqdbc/lvbs/car/rivian/iq_carstate.py new file mode 100644 index 000000000..d7098e2df --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/rivian/iq_carstate.py @@ -0,0 +1,104 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Rivian longitudinal-harness-upgrade carState reader: with the upgrade harness the +right steering-wheel controls and the drive stalk drive the openpilot set speed, +and the harness exposes blind-spot indicators. Only active behind the upgrade flag. +""" +import math +from enum import StrEnum + +from iqdbc.car import Bus, structs +from iqdbc.can.parser import CANParser +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.rivian.values import DBC +from iqdbc.lvbs.car.rivian.values import RivianFlagsIQ + +ButtonType = structs.CarState.ButtonEvent.Type + +_SET_SPEED_MAX = 85 * CV.MPH_TO_MS +_SET_SPEED_MIN = 20 * CV.MPH_TO_MS +_LONG_PRESS_FRAMES = 66 +_STALK_HOLD_FRAMES = 50 + + +class IQCarState: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + + self.set_speed = 10 + self.increase_button = False + self.decrease_button = False + self.distance_button = 0 + self.increase_counter = 0 + self.decrease_counter = 0 + self.stalk_down_counter = 0 + + def _apply_set_speed_buttons(self, ret: structs.CarState, cp_park, cp_adas) -> None: + was_increasing = self.increase_button + was_decreasing = self.decrease_button + + self.increase_button = cp_park.vl["WheelButtons"]["RightButton_RightClick"] == 2 + self.decrease_button = cp_park.vl["WheelButtons"]["RightButton_LeftClick"] == 2 + self.increase_counter = self.increase_counter + 1 if self.increase_button else 0 + self.decrease_counter = self.decrease_counter + 1 if self.decrease_button else 0 + + metric = cp_adas.vl["Cluster"]["Cluster_Unit"] == 0 + conversion = CV.KPH_TO_MS if metric else CV.MPH_TO_MS + step = 10.0 if metric else 5.0 + shown = self.set_speed * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH) + + # A held button steps to the next round multiple; a tap nudges by one unit. + if self.increase_button: + if self.increase_counter % _LONG_PRESS_FRAMES == 0: + self.set_speed = math.ceil((shown + 1) / step) * step * conversion + elif not was_increasing: + self.set_speed += conversion + if self.decrease_button: + if self.decrease_counter % _LONG_PRESS_FRAMES == 0: + self.set_speed = math.floor((shown - 1) / step) * step * conversion + elif not was_decreasing: + self.set_speed -= conversion + + def update_longitudinal_upgrade(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None: + cp_park = can_parsers[Bus.alt] + cp_adas = can_parsers[Bus.adas] + cp = can_parsers[Bus.pt] + + if self.CP.openpilotLongitudinalControl: + right_scroll = cp_park.vl["WheelButtons"]["RightButton_Scroll"] + if right_scroll != 255: + if self.distance_button != right_scroll: + ret.buttonEvents = [structs.CarState.ButtonEvent(pressed=False, type=ButtonType.gapAdjustCruise)] + self.distance_button = right_scroll + + self._apply_set_speed_buttons(ret, cp_park, cp_adas) + + if not ret.cruiseState.enabled: + self.set_speed = ret.vEgoCluster + + # Drive stalk held down (VDM_UserAdasRequest 3/4) for ~0.5s snaps set speed + # up to the current speed, matching stock Rivian ACC (it never lowers it). + stalk_down = int(cp.vl["VDM_AdasSts"]["VDM_UserAdasRequest"]) in (3, 4) + self.stalk_down_counter = self.stalk_down_counter + 1 if stalk_down else 0 + if self.stalk_down_counter == _STALK_HOLD_FRAMES: + self.set_speed = max(self.set_speed, ret.vEgoCluster) + + self.set_speed = max(_SET_SPEED_MIN, min(self.set_speed, _SET_SPEED_MAX)) + ret.cruiseState.speed = self.set_speed + + if self.CP.enableBsm: + ret.leftBlindspot = cp_park.vl["BSM_BlindSpotIndicator"]["BSM_BlindSpotIndicator_Left"] != 0 + ret.rightBlindspot = cp_park.vl["BSM_BlindSpotIndicator"]["BSM_BlindSpotIndicator_Right"] != 0 + + def update(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None: + if self.CP_IQ.flags & RivianFlagsIQ.LONGITUDINAL_HARNESS_UPGRADE: + self.update_longitudinal_upgrade(ret, can_parsers) + + @staticmethod + def get_parser(CP, CP_IQ) -> dict[StrEnum, CANParser]: + messages: dict[StrEnum, CANParser] = {} + if CP_IQ.flags & RivianFlagsIQ.LONGITUDINAL_HARNESS_UPGRADE: + messages[Bus.alt] = CANParser(DBC[CP.carFingerprint][Bus.alt], [], 5) + return messages diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/rivian/values.py b/artifacts/package_runtime/iqdbc/lvbs/car/rivian/values.py new file mode 100644 index 000000000..0cbd70116 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/rivian/values.py @@ -0,0 +1,10 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +IQ.Pilot Rivian extension flags. +""" +from enum import IntFlag + + +class RivianFlagsIQ(IntFlag): + LONGITUDINAL_HARNESS_UPGRADE = 1 diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/subaru/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/subaru/aol.py b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/aol.py new file mode 100644 index 000000000..6846fafc3 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/aol.py @@ -0,0 +1,36 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Always-on-Lateral input adapter for Subaru: turns the dashboard LKAS button into +a carState lkas ButtonEvent so the shared AOL state machine can toggle lateral. +""" +from enum import StrEnum + +from iqdbc.car import Bus, structs +from iqdbc.car.subaru.values import SubaruFlags +from iqdbc.lvbs.aol_base import AolCarStateBase +from iqdbc.can.parser import CANParser + +_LKAS = structs.CarState.ButtonEvent.Type.lkas + +# ES_LKAS_State/LKAS_Dash_State: 0 = neutral, 1 = LKAS shown on, 2 = LKAS shown off +_DASH_ON = 1 +_DASH_OFF = 2 + + +class AolCarState(AolCarStateBase): + def update_aol(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None: + if self.CP.flags & SubaruFlags.PREGLOBAL: + return + + self.prev_lkas_button = self.lkas_button + self.lkas_button = can_parsers[Bus.cam].vl["ES_LKAS_State"]["LKAS_Dash_State"] + + if self._is_toggle_edge(): + ret.buttonEvents = [*ret.buttonEvents, structs.CarState.ButtonEvent(type=_LKAS, pressed=True)] + + def _is_toggle_edge(self) -> bool: + # every dash-state change is a deliberate press except the off->on rebound (2 -> 1) + if self.lkas_button == self.prev_lkas_button: + return False + return not (self.prev_lkas_button == _DASH_OFF and self.lkas_button == _DASH_ON) diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/subaru/creep_assist.py b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/creep_assist.py new file mode 100644 index 000000000..29417e142 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/creep_assist.py @@ -0,0 +1,93 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +IQ.Pilot Subaru stop-and-go: nudges the ACC out of a standstill it would +otherwise hold. Two variants gated by user flags — an electronic-parking-brake +resume pulse (distance/lead triggered) and a manual-parking-brake hold-timer +resume. Both work by spoofing the camera-bus throttle/brake frames. +""" +import copy +from enum import StrEnum + +from iqdbc.car import Bus, structs, DT_CTRL +from iqdbc.car.can_definitions import CanData +from iqdbc.car.interfaces import CarStateBase +from iqdbc.car.subaru.values import SubaruFlags + +from iqdbc.lvbs.car.subaru import iq_subarucan +from iqdbc.lvbs.car.subaru.iq_values import SubaruFlagsIQ +from iqdbc.can.parser import CANParser + +# EPB resume fires only while the lead is pulling away within this gap band (m). +_RESUME_GAP_MIN = 3.0 +_RESUME_GAP_MAX = 4.5 +_EPB_PULSE_FRAMES = 15 + + +class IQStopAndGoController: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + self.enabled = bool(CP_IQ.flags & (SubaruFlagsIQ.STOP_AND_GO | SubaruFlagsIQ.STOP_AND_GO_MANUAL_PARKING_BRAKE)) + self.manual_parking_brake = bool(CP_IQ.flags & SubaruFlagsIQ.STOP_AND_GO_MANUAL_PARKING_BRAKE) + + self.standstill_since = 0 + self._pulse_left = 0 + self.prev_gap = 0.0 + + def _epb_pulse(self, trigger: bool) -> bool: + # A trigger arms a fixed-length resume pulse; the pulse then plays out frame by frame. + if self.manual_parking_brake: + return False + if trigger: + self._pulse_left = _EPB_PULSE_FRAMES + if self._pulse_left > 0: + self._pulse_left -= 1 + return True + return False + + def _want_resume(self, CC: structs.CarControl, CS: CarStateBase, frame: int) -> bool: + if not CC.enabled or not CC.hudControl.leadVisible: + return False + + gap = CS.es_distance_msg["Close_Distance"] + standing = CS.out.standstill + if not standing: + self.standstill_since = frame + + hold_arm, hold_reset = (0.75, 0.8) if self.CP.flags & SubaruFlags.PREGLOBAL else (0.5, 0.55) + held_for = (frame - self.standstill_since) * DT_CTRL + held_long_enough = held_for > hold_arm + if held_for >= hold_reset: + self.standstill_since = frame + + lead_pulling_away = _RESUME_GAP_MIN < gap < _RESUME_GAP_MAX and gap > self.prev_gap + self.prev_gap = gap + + if self.manual_parking_brake: + return held_long_enough + return self._epb_pulse(standing and lead_pulling_away) + + def create_creep_assist(self, packer, CC: structs.CarControl, CS: CarStateBase, frame: int) -> list[CanData]: + if not self.enabled: + return [] + + resume = self._want_resume(CC, CS, frame) + can_sends = [iq_subarucan.create_throttle(packer, self.CP, CS.throttle_msg, resume and not self.manual_parking_brake)] + if frame % 2 == 0: + can_sends.append(iq_subarucan.create_brake_pedal(packer, self.CP, CS.brake_pedal_msg, resume and self.manual_parking_brake)) + return can_sends + + +class IQStopAndGoState: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + self.brake_pedal_msg: dict[str, float] = {} + self.throttle_msg: dict[str, float] = {} + + def update(self, ret: structs.CarState, can_parsers: dict[StrEnum, CANParser]) -> None: + cp = can_parsers[Bus.pt] + self.brake_pedal_msg = copy.copy(cp.vl["Brake_Pedal"]) + if not self.CP.flags & SubaruFlags.HYBRID: + self.throttle_msg = copy.copy(cp.vl["Throttle"]) diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/subaru/iq_subarucan.py b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/iq_subarucan.py new file mode 100644 index 000000000..5fd8e16e7 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/iq_subarucan.py @@ -0,0 +1,41 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Camera-bus message spoofers for Subaru stop-and-go: re-emit the stock Throttle +and Brake_Pedal frames, nudging a single field to trigger an ACC resume from a +standstill. Field sets mirror the DBC message layout. +""" +from iqdbc.car.subaru.values import CanBus, SubaruFlags + +_THROTTLE_FIELDS_PREGLOBAL = ("Throttle_Pedal", "Signal1", "Not_Full_Throttle", "Signal2", "Engine_RPM", + "Off_Throttle", "Signal3", "Throttle_Cruise", "Throttle_Combo", "Throttle_Body", + "Off_Throttle_2", "Signal4") +_THROTTLE_FIELDS_GLOBAL = ("CHECKSUM", "Signal1", "Engine_RPM", "Neutral", "Throttle_Pedal", "Throttle_Cruise", + "Throttle_Combo", "Signal3", "Off_Accel") +_BRAKE_FIELDS_PREGLOBAL = ("Speed", "Brake_Pedal", "Signal1") +_BRAKE_FIELDS_GLOBAL = ("CHECKSUM", "Signal1", "Speed", "Signal2", "Brake_Lights", "Signal3", "Brake_Pedal", "Signal4") + + +def _next_counter(msg): + return (msg["COUNTER"] + 1) % 0x10 + + +def create_throttle(packer, CP, throttle_msg, send_resume): + preglobal = bool(CP.flags & SubaruFlags.PREGLOBAL) + fields = _THROTTLE_FIELDS_PREGLOBAL if preglobal else _THROTTLE_FIELDS_GLOBAL + values = {name: throttle_msg[name] for name in fields} + values["COUNTER"] = _next_counter(throttle_msg) + if send_resume: + values["Throttle_Pedal"] = 5 + return packer.make_can_msg("Throttle", CanBus.camera, values) + + +def create_brake_pedal(packer, CP, brake_pedal_msg, send_resume): + preglobal = bool(CP.flags & SubaruFlags.PREGLOBAL) + fields = _BRAKE_FIELDS_PREGLOBAL if preglobal else _BRAKE_FIELDS_GLOBAL + values = {name: brake_pedal_msg[name] for name in fields} + if not preglobal: + values["COUNTER"] = _next_counter(brake_pedal_msg) + if send_resume: + values["Speed"] = 1 if preglobal else 3 + return packer.make_can_msg("Brake_Pedal", CanBus.camera, values) diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/subaru/iq_values.py b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/iq_values.py new file mode 100644 index 000000000..6536b0c0d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/subaru/iq_values.py @@ -0,0 +1,16 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +IQ.Pilot Subaru extension flags. Selected in apply_iq_car_config() from the user's +stop-and-go params and consumed by the stop-and-go controller and panda safety. +""" +from enum import IntFlag + + +class SubaruFlagsIQ(IntFlag): + STOP_AND_GO = 1 + STOP_AND_GO_MANUAL_PARKING_BRAKE = 2 + + +class SubaruSafetyFlagsIQ: + STOP_AND_GO = 1 diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/tesla/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/tesla/iq_carstate.py b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/iq_carstate.py new file mode 100644 index 000000000..357e0c4fd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/iq_carstate.py @@ -0,0 +1,84 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from enum import StrEnum + +from iqdbc.car import Bus, create_button_events, structs +from iqdbc.can.parser import CANParser +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.car.tesla.values import DBC, CANBUS +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ + +ButtonType = structs.CarState.ButtonEvent.Type + + +class IQCarState: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + + self.infotainment_3_finger_press = 0 + self.vehicle_bus_available = bool(CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS) + + def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None: + if Bus.adas in can_parsers: + cp_adas = can_parsers[Bus.adas] + + odometer_km = float(cp_adas.vl["ID3B6UI_odometer"].get("UI_odometer", 0.0)) + if 0.0 < odometer_km < 4294967.296: + self.vehicle_bus_available = True + ret.odometer = odometer_km + + if self.vehicle_bus_available and Bus.adas in can_parsers: + cp_adas = can_parsers[Bus.adas] + + prev_infotainment_3_finger_press = self.infotainment_3_finger_press + self.infotainment_3_finger_press = int(cp_adas.vl["UI_status2"]["UI_activeTouchPoints"]) + + ret.buttonEvents = [*ret.buttonEvents, + *create_button_events(self.infotainment_3_finger_press, prev_infotainment_3_finger_press, + {3: ButtonType.lkas})] + + bms_soc_ui = float(cp_adas.vl["ID292BMS_SOC"].get("SOCUI292", 0.0)) + ui_range_mi = float(cp_adas.vl["ID33AUI_rangeSOC"].get("UI_Range", 0.0)) + hv_batt_voltage_v = float(cp_adas.vl["ID132HVBattAmpVolt"].get("BattVoltage132", 0.0)) + battery_details = None + try: + battery_details = ret.batteryDetails + except Exception: + battery_details = None + + soc_ui = bms_soc_ui if 0.0 <= bms_soc_ui <= 102.3 else None + if soc_ui is not None: + ret.fuelGauge = min(100.0, soc_ui) / 100.0 + if battery_details is not None: + battery_details.soc = soc_ui + battery_details.charge = soc_ui + if 0.0 <= ui_range_mi <= 1023.0 and battery_details is not None: + battery_details.capacity = ui_range_mi + if 0.0 < hv_batt_voltage_v <= 800.0 and battery_details is not None: + battery_details.voltage = hv_batt_voltage_v + + cp_party = can_parsers[Bus.party] + cp_ap_party = can_parsers[Bus.ap_party] + + speed_units = self.can_define.dv["DI_state"]["DI_speedUnits"].get(int(cp_party.vl["DI_state"]["DI_speedUnits"]), None) + speed_limit = cp_ap_party.vl["DAS_status"]["DAS_fusedSpeedLimit"] + if self.can_define.dv["DAS_status"]["DAS_fusedSpeedLimit"].get(int(speed_limit), None) in ["NONE", "UNKNOWN_SNA"]: + ret_iq.speedLimit = 0 + else: + if speed_units == "KPH": + ret_iq.speedLimit = speed_limit * CV.KPH_TO_MS + elif speed_units == "MPH": + ret_iq.speedLimit = speed_limit * CV.MPH_TO_MS + + @staticmethod + def get_parser(CP: structs.CarParams, CP_IQ: structs.IQCarParams) -> dict[StrEnum, CANParser]: + messages = {} + + # Only tap the vehicle bus on cars where fingerprinting saw it: an always-on + # bus-1 parser trips bus_timeout -> canBusMissing on harnesses without the tap. + if CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS and Bus.adas in DBC[CP.carFingerprint]: + messages[Bus.adas] = CANParser(DBC[CP.carFingerprint][Bus.adas], [], CANBUS.vehicle) + + return messages diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/tesla/test_torque_blend.py b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/test_torque_blend.py new file mode 100644 index 000000000..530507c85 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/test_torque_blend.py @@ -0,0 +1,205 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from types import SimpleNamespace + +import pytest + +from iqdbc.car.tesla.interface import CarInterface +from iqdbc.car.vehicle_model import VehicleModel +from iqdbc.lvbs.car.tesla.torque_blend import ( + DT_LAT_CTRL, + STEER_OVERRIDE_MAX_LAT_ACCEL, + STEER_OVERRIDE_MIN_TORQUE, + STEER_OVERRIDE_TORQUE_RANGE, + STEER_OVERRIDE_TORQUE_ZERO_MAX, + SteeringTorqueZero, + TorqueBlendController, + calc_override_angle_limited, + get_steer_from_lat_accel, +) +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ + +VM = VehicleModel(CarInterface.get_non_essential_params("TESLA_MODEL_Y")) + +COOP_ON = SimpleNamespace(flags=TeslaFlagsIQ.COOP_STEERING.value) +COOP_OFF = SimpleNamespace(flags=0) + +HAND_REST_TORQUE = 0.55 +ZERO_WEIGHT_SPEED = 20.0 +FULL_WEIGHT_SPEED = 8.0 +SETTLING_SECONDS = 300.0 + + +def _car_state(torque, v_ego, angle=0.0): + return SimpleNamespace( + out=SimpleNamespace(steeringTorque=torque, vEgo=v_ego, vEgoRaw=v_ego, steeringAngleDeg=angle, steeringRateDeg=0.0), + hands_on_level=0, + ) + + +def _drive(blend, torque, v_ego, seconds, angle=0.0, cp_iq=COOP_ON, lat_active=True): + steps = int(seconds / DT_LAT_CTRL) + out = 0.0 + for _ in range(steps): + out = blend.update(angle, lat_active, cp_iq, _car_state(torque, v_ego, angle), VM).steeringAngleDeg + return out + + +def _override(blend): + return blend.coop_apply_angle_last - blend.debug_angle_desired_limited + + +MAX_NULLABLE_PRELOAD = STEER_OVERRIDE_MIN_TORQUE + STEER_OVERRIDE_TORQUE_ZERO_MAX + + +@pytest.mark.parametrize("rest", [0.3, HAND_REST_TORQUE, MAX_NULLABLE_PRELOAD]) +@pytest.mark.parametrize("sign", [1.0, -1.0]) +def test_torque_zero_pulls_a_sustained_hand_rest_inside_the_deadzone(rest, sign): + zero = SteeringTorqueZero() + for _ in range(int(SETTLING_SECONDS / DT_LAT_CTRL)): + corrected = zero.update(sign * rest, True) + assert abs(corrected) <= STEER_OVERRIDE_MIN_TORQUE + + +@pytest.mark.parametrize("sign", [1.0, -1.0]) +def test_a_settled_hand_rest_at_the_nullable_limit_produces_no_override(sign): + blend = TorqueBlendController() + _drive(blend, sign * MAX_NULLABLE_PRELOAD, ZERO_WEIGHT_SPEED, seconds=SETTLING_SECONDS) + assert abs(_override(blend)) == pytest.approx(0.0, abs=1e-6) + + +def test_override_unwinds_once_the_driver_releases(): + blend = TorqueBlendController() + _drive(blend, 2.0, FULL_WEIGHT_SPEED, seconds=10.0) + assert abs(_override(blend)) > 1.0 + _drive(blend, 0.0, FULL_WEIGHT_SPEED, seconds=20.0) + assert _override(blend) == pytest.approx(0.0, abs=1e-6) + assert blend.override_angle_accu == pytest.approx(0.0, abs=1e-6) + + +def test_torque_zero_passes_a_step_through_untouched(): + zero = SteeringTorqueZero() + assert zero.update(2.0, True) == pytest.approx(2.0, abs=1e-3) + + +def test_torque_zero_is_bounded(): + zero = SteeringTorqueZero() + for _ in range(int(SETTLING_SECONDS / DT_LAT_CTRL)): + zero.update(10.0, True) + assert zero.update(0.0, False) == pytest.approx(-STEER_OVERRIDE_TORQUE_ZERO_MAX) + + +def test_torque_zero_holds_while_not_learning(): + zero = SteeringTorqueZero() + zero.update(1.0, False) + assert zero.update(1.0, False) == pytest.approx(1.0) + + +def test_sustained_hand_rest_stops_steering_the_car(): + blend = TorqueBlendController() + _drive(blend, HAND_REST_TORQUE, FULL_WEIGHT_SPEED, seconds=1.0) + early = abs(_override(blend)) + _drive(blend, HAND_REST_TORQUE, FULL_WEIGHT_SPEED, seconds=SETTLING_SECONDS) + assert early > 0.1 + assert abs(_override(blend)) < 0.1 * early + + +def test_a_deliberate_push_still_overrides_after_the_zero_has_settled(): + blend = TorqueBlendController() + _drive(blend, HAND_REST_TORQUE, FULL_WEIGHT_SPEED, seconds=SETTLING_SECONDS) + _drive(blend, HAND_REST_TORQUE + 1.5, FULL_WEIGHT_SPEED, seconds=1.0) + assert abs(_override(blend)) > 1.0 + + +def test_accumulator_cannot_charge_where_its_weight_is_zero(): + blend = TorqueBlendController() + _drive(blend, 2.0, ZERO_WEIGHT_SPEED, seconds=30.0) + assert blend.override_angle_accu == pytest.approx(0.0, abs=1e-6) + + +def test_accumulator_drains_once_the_car_passes_the_crossover_speed(): + blend = TorqueBlendController() + _drive(blend, 2.5, FULL_WEIGHT_SPEED, seconds=10.0) + assert abs(blend.override_angle_accu) > 1.0 + _drive(blend, 2.5, ZERO_WEIGHT_SPEED, seconds=5.0) + assert blend.override_angle_accu == pytest.approx(0.0, abs=1e-6) + + +def test_low_speed_override_can_exceed_the_direct_term_authority(): + blend = TorqueBlendController() + _drive(blend, 2.5, FULL_WEIGHT_SPEED, seconds=60.0) + authority = calc_override_angle_limited(STEER_OVERRIDE_TORQUE_RANGE, FULL_WEIGHT_SPEED, VM, STEER_OVERRIDE_MAX_LAT_ACCEL) + assert abs(blend.override_angle_accu) > authority + + +def test_a_sustained_low_speed_push_reaches_a_large_override(): + blend = TorqueBlendController() + _drive(blend, 2.5, FULL_WEIGHT_SPEED, seconds=10.0) + assert abs(_override(blend)) > 20.0 + + +@pytest.mark.parametrize("v_ego", [3.0, 5.0, FULL_WEIGHT_SPEED, 12.0]) +def test_override_stays_inside_the_max_lat_accel_envelope_plus_the_direct_term(v_ego): + blend = TorqueBlendController() + _drive(blend, 2.5, v_ego, seconds=60.0) + envelope = get_steer_from_lat_accel(STEER_OVERRIDE_MAX_LAT_ACCEL, v_ego, VM) + direct_authority = calc_override_angle_limited(STEER_OVERRIDE_TORQUE_RANGE, v_ego, VM, STEER_OVERRIDE_MAX_LAT_ACCEL) + assert abs(_override(blend)) <= envelope + direct_authority + + +@pytest.mark.parametrize("v_ego", [3.0, 5.0, FULL_WEIGHT_SPEED, 12.0]) +def test_a_pinned_push_cannot_run_the_contribution_away(v_ego): + blend = TorqueBlendController() + _drive(blend, 2.5, v_ego, seconds=130.0) + envelope = get_steer_from_lat_accel(STEER_OVERRIDE_MAX_LAT_ACCEL, v_ego, VM) + capability = calc_override_angle_limited(STEER_OVERRIDE_TORQUE_RANGE, v_ego, VM, STEER_OVERRIDE_MAX_LAT_ACCEL) / envelope + assert abs(blend.override_angle_accu) * (1.0 - capability) <= envelope + 1e-6 + + +def test_the_envelope_opens_up_as_speed_drops(): + low = get_steer_from_lat_accel(STEER_OVERRIDE_MAX_LAT_ACCEL, 3.0, VM) + high = get_steer_from_lat_accel(STEER_OVERRIDE_MAX_LAT_ACCEL, 12.0, VM) + assert low > 10 * high + + +def test_relative_weight_is_zero_above_the_direct_capability_crossover(): + capability = (calc_override_angle_limited(STEER_OVERRIDE_TORQUE_RANGE, ZERO_WEIGHT_SPEED, VM, STEER_OVERRIDE_MAX_LAT_ACCEL) / + get_steer_from_lat_accel(STEER_OVERRIDE_MAX_LAT_ACCEL, ZERO_WEIGHT_SPEED, VM)) + assert capability == pytest.approx(1.0) + + +HEAVY_REST = 0.80 + + +@pytest.mark.parametrize("sign", [1.0, -1.0]) +def test_the_zero_nulls_a_hand_rest_heavier_than_the_deadzone(sign): + assert HEAVY_REST > 2 * STEER_OVERRIDE_MIN_TORQUE + blend = TorqueBlendController() + _drive(blend, sign * HEAVY_REST, FULL_WEIGHT_SPEED, seconds=SETTLING_SECONDS) + assert abs(_override(blend)) == pytest.approx(0.0, abs=1e-6) + + +LIGHT_PUSH = 0.45 + + +@pytest.mark.parametrize("v_ego", [FULL_WEIGHT_SPEED, 17.0]) +def test_a_light_push_overrides_without_needing_the_old_half_newton(v_ego): + assert STEER_OVERRIDE_MIN_TORQUE < LIGHT_PUSH < 0.5 + blend = TorqueBlendController() + _drive(blend, LIGHT_PUSH, v_ego, seconds=5.0) + assert abs(_override(blend)) > 0.2 + + +def test_torque_below_the_deadzone_never_overrides(): + blend = TorqueBlendController() + _drive(blend, STEER_OVERRIDE_MIN_TORQUE * 0.5, FULL_WEIGHT_SPEED, seconds=5.0) + assert abs(_override(blend)) == pytest.approx(0.0, abs=1e-6) + + +def test_coop_disabled_leaves_the_command_untouched(): + blend = TorqueBlendController() + angle = 5.0 + out = _drive(blend, 2.0, FULL_WEIGHT_SPEED, seconds=5.0, angle=angle, cp_iq=COOP_OFF) + assert out == pytest.approx(angle, abs=1e-6) + assert blend.override_angle_accu == pytest.approx(0.0) diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/tesla/torque_blend.py b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/torque_blend.py new file mode 100644 index 000000000..866a798eb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/torque_blend.py @@ -0,0 +1,340 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import math +import numpy as np +from collections import namedtuple +from dataclasses import replace + +from iqdbc.car import structs, rate_limit, DT_CTRL +from iqdbc.car.vehicle_model import VehicleModel +from iqdbc.car.lateral import apply_steer_angle_limits_vm +from iqdbc.car.tesla.values import CarControllerParams +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ + + +DT_LAT_CTRL = DT_CTRL * CarControllerParams.STEER_STEP + +class TorqueBlendParams(CarControllerParams): + ANGLE_LIMITS = replace(CarControllerParams.ANGLE_LIMITS, MAX_ANGLE_RATE=5) + +STEERING_DEG_PHASE_LEAD_COEFF = 8.0 + +# angle override # todo implement steering torque inertia compensation to increase gains +STEER_OVERRIDE_MIN_TORQUE = 0.35 # Nm - only noise now, SteeringTorqueZero removes the bias this used to cover +STEER_OVERRIDE_MAX_TORQUE = 2.5 # Nm max torque before EPS disengages, LKAS takes over at 1.8Nm +STEER_OVERRIDE_MAX_LAT_ACCEL = 1.5 # m/s^2 - determines angle rate - speed dependent - similar to Tesla comfort steering mode +STEER_OVERRIDE_LAT_ACCEL_GAIN_LIMIT = 10 # deg/Nm stability and smoothness for angle control # todo this could be increased after solving feedback stability + +# angle ramping +STEER_OVERRIDE_MAX_LAT_JERK = 2.0 # m/s^3 - determines angle ramping rate - speed dependent +STEER_OVERRIDE_MAX_LAT_JERK_CENTERING = TorqueBlendParams.ANGLE_LIMITS.MAX_LATERAL_JERK # m/s^3 - for low speed angle ramp down +# stability and smoothness for angle ramp control - at very low speeds this takes precedence over jerk settings +STEER_OVERRIDE_LAT_JERK_GAIN_LIMIT = 100 # deg/s/Nm - should be less than CarControllerParams.ANGLE_LIMITS.MAX_ANGLE_RATE / DT_CTRL / STEER_OVERRIDE_TORQUE_RANGE +STEER_OVERRIDE_TORQUE_RANGE = STEER_OVERRIDE_MAX_TORQUE - STEER_OVERRIDE_MIN_TORQUE + +STEER_OVERRIDE_TORQUE_ZERO_TAU = 60.0 +STEER_OVERRIDE_TORQUE_ZERO_MAX = 0.5 # Nm - sized to the observed hand rest and sensor bias, not to the deadzone + +# model fighting mitigation +STEER_DESIRED_LIMITER_ALLOW_SPEED = 6.0 # m/s - below this speed the desired angle limiter is active +STEER_DESIRED_LIMITER_ACCEL = 100 # deg/s^2 when override angle ramp is active +STEER_DESIRED_LIMITER_OVERRIDE_ACTIVE_COUNTER = 0.7 # second + +# limit model acceleration when engaging +STEER_RESUME_RATE_LIMIT_RAMP_RATE = 500 # deg/s^2 - controls rate of rise of angle rate limit, not angle directly + + +TorqueBlendDataIQ = namedtuple("TorqueBlendDataIQ", + ["steeringAngleDeg", "lat_active", "control_type"]) + +def get_steer_from_lat_accel(lat_accel, v_ego: float, VM: VehicleModel): + """Calculate the maximum steering angle based on lateral acceleration.""" + curvature = lat_accel / (max(1, v_ego) ** 2) # 1/m + return math.degrees(VM.get_steer_from_curvature(curvature, v_ego, 0)) # deg + + +def apply_bounds(signal: float, limit: float) -> float: + """Limit input to a range.""" + return float(np.clip(signal, -limit, limit)) + + +def apply_deadzone(signal: float, deadzone: float) -> float: + """Apply deadzone to input.""" + return signal - apply_bounds(signal, deadzone) + + +def calc_override_angle_limited(torque: float, vEgo: float, VM: VehicleModel, lat_accel) -> float: + """ + Map driver torque to lateral acceleration and convert to steering angle. + Limit gain for stability with EPS and torque sensor interaction. + """ + + # lateral accel is linear in respect to angle so it's fine to interpolate it with torque + torque_to_angle = get_steer_from_lat_accel(lat_accel, vEgo, VM) / STEER_OVERRIDE_TORQUE_RANGE + + # limit the gain to prevent jerkiness and instability + gain_limit = STEER_OVERRIDE_LAT_ACCEL_GAIN_LIMIT + override_angle_target = torque * min(torque_to_angle, gain_limit) + + return override_angle_target + + +def calc_override_angle_delta_limited(torque: float, vEgo: float, VM: VehicleModel, lat_jerk) -> float: + """ + Map driver torque to lateral jerk and convert to steering speed. + Limit gain for stability with EPS and torque sensor interaction. + """ + + # prevents windup in carcontroller rate limiter + lat_jerk = min(lat_jerk, TorqueBlendParams.ANGLE_LIMITS.MAX_LATERAL_JERK) + + # lateral accel is linear in respect to angle so it's fine to interpolate it with torque + torque_to_angle = get_steer_from_lat_accel(lat_jerk, vEgo, VM) / STEER_OVERRIDE_TORQUE_RANGE + # limit the gain to prevent jerkiness and instability + gain_limit = min(STEER_OVERRIDE_LAT_JERK_GAIN_LIMIT, CarControllerParams.ANGLE_LIMITS.MAX_ANGLE_RATE / DT_CTRL / STEER_OVERRIDE_TORQUE_RANGE) + override_angle_rate = torque * min(torque_to_angle, gain_limit) + + # prevent windup in angle rate limiter + return apply_bounds(override_angle_rate * DT_LAT_CTRL, TorqueBlendParams.ANGLE_LIMITS.MAX_ANGLE_RATE) + + +class SteeringTorqueZero: + def __init__(self): + self._zero = 0.0 + + def reset(self) -> None: + self._zero = 0.0 + + def update(self, torque: float, learning: bool) -> float: + if learning: + self._zero += (torque - self._zero) * (DT_LAT_CTRL / STEER_OVERRIDE_TORQUE_ZERO_TAU) + self._zero = apply_bounds(self._zero, STEER_OVERRIDE_TORQUE_ZERO_MAX) + return torque - self._zero + + +class SteerRateLimiter: + """Handles rate limiting of steering angle changes with a configurable rate.""" + def __init__(self): + self._last = 0.0 + + def reset(self, angle: float) -> None: + """Reset the rate limiter state with the given angle.""" + self._last = angle + + def update(self, angle: float, angle_delta_lim: float) -> float: + angle_lim = rate_limit(angle, self._last, -angle_delta_lim, angle_delta_lim) + self._last = angle_lim + return angle_lim + + +class SteerAccelLimiter: + """ + Second-order limiter for steering angle: + - Limits angular acceleration (change in allowed angular rate). + - Enforces a hard max angular rate. + """ + def __init__(self): + self.delta_rl = SteerRateLimiter() + self.angle_cmd = 0.0 + + def reset(self, angle: float) -> None: + self.delta_rl.reset(0) + self.angle_cmd = angle + + def update(self, angle_target: float, max_rate: float, accel: float, decel: float, dt: float) -> float: + if dt <= 0.0: + return self.angle_cmd + + # acceleration limits per update step + accel_delta = max(0.0, accel) * (dt * dt) + decel_delta = max(0.0, decel) * (dt * dt) + + err = angle_target - self.angle_cmd + err = apply_bounds(err, max(0.0, max_rate) * dt) + + # acceleration (towards target) or deceleration (away from target) + if err * self.delta_rl._last < 0: + delta = decel_delta + else: + delta = accel_delta + + # Handle large decel (enabled with inf value) + if decel == np.inf and err * self.delta_rl._last < 0: + # if output crosses the target or target crosses the output + self.delta_rl._last = 0 + angle_out = self.angle_cmd + else: + self.delta_rl._last = self.delta_rl.update(err, delta) + if decel == np.inf: + # if we are close to target, snap to it before we cross it + self.delta_rl._last = apply_bounds(self.delta_rl._last, abs(err)) + angle_out = self.angle_cmd + self.delta_rl._last + + # Integrate + self.angle_cmd = angle_out + + return angle_out + + +class TorqueBlendController: + def __init__(self): + self.coop_apply_angle_last = 0 + self.blend_apply_angle_last_sat = 0 + self.override_angle_accu = 0 + self.override_active_counter = 0 # Counter for how many cycles torque is below threshold + self.resume_rate_limiter_delta = SteerRateLimiter() + self.resume_rate_limiter = SteerRateLimiter() + self.override_accel_rate_limiter = SteerAccelLimiter() + self.torque_zero = SteeringTorqueZero() + self.debug_angle_desired_limited = 0 + + def apply_override_angle_direct(self, lat_active: bool, driverTorque: float, vEgo: float, VM: VehicleModel) -> float: + """ + Emulates steering springiness based on lateral acceleration exerted on the steering rack. + We rely on apply_override_angle_ramp to reach the max angle at low speeds. + At low speed lateral acceleration approaches infinity and it is not good proxy + for the torque to target angle conversion and needs to be limited + + """ + if not lat_active: + return 0.0 + + ## torque to position + # ignore torque sensor offset and disturbances + steering_torque_with_deadzone = apply_deadzone(driverTorque, STEER_OVERRIDE_MIN_TORQUE) + angle_override = calc_override_angle_limited(steering_torque_with_deadzone, vEgo, VM, STEER_OVERRIDE_MAX_LAT_ACCEL) + return angle_override + + def apply_override_angle_relative(self, lat_active: bool, driverTorque: float, vEgo: float, + VM: VehicleModel, unwind_weight: float = 1.0) -> float: + """ + Converts steering torque to steering rotation rate. + Physically angle rate is related to viscous damping of tires rotating on the ground. + Here, however, the angle rate target is obtained from lateral jerk limit + as a reasonable safe rate which decays quadratically with vehicle speed. + """ + if not lat_active: + self.override_angle_accu = 0 + return 0 + + # unwind accumulator toward zero if the previous loop saturated (apply_steer_angle_limits_vm) + unwind = (self.coop_apply_angle_last - self.blend_apply_angle_last_sat) * unwind_weight + if self.override_angle_accu * unwind > 0: + unwind = apply_bounds(unwind, abs(self.override_angle_accu)) + self.override_angle_accu -= unwind + + # torque biasing emulates the steering centering when released: + if self.override_angle_accu > 0 and abs(vEgo) > 0.1: + torque_biased = driverTorque - STEER_OVERRIDE_MIN_TORQUE + elif self.override_angle_accu < 0 and abs(vEgo) > 0.1: + torque_biased = driverTorque + STEER_OVERRIDE_MIN_TORQUE + else: + # when override_angle_accu is reset this turns off everything + torque_biased = apply_deadzone(driverTorque, STEER_OVERRIDE_MIN_TORQUE) + + # higher rate when centering + angle_override_delta = calc_override_angle_delta_limited(torque_biased, vEgo, VM, + STEER_OVERRIDE_MAX_LAT_JERK if (torque_biased * self.override_angle_accu) > 0 + else STEER_OVERRIDE_MAX_LAT_JERK_CENTERING) + + # ramp the angle + new_override_angle_accu = self.override_angle_accu + angle_override_delta + # snap to 0 if sign changes and driver torque is steering centering zone + if (new_override_angle_accu * self.override_angle_accu) < 0 and abs(driverTorque) < STEER_OVERRIDE_MIN_TORQUE: + new_override_angle_accu = 0 + + self.override_angle_accu = new_override_angle_accu + + return self.override_angle_accu + + def apply_override_angle_combined(self, lat_active: bool, driverTorque: float, vEgo: float, VM: VehicleModel) -> float: + """ + Combines direct and relative override angles based on direct angle override limitations (stability and practical range depending on vehicle speed). + Effectively vehicle-speed based transition. + """ + if not lat_active: + return 0 + + override_envelope = get_steer_from_lat_accel(STEER_OVERRIDE_MAX_LAT_ACCEL, vEgo, VM) + # calculate capability of direct angle override (fully active above ~36kph) + direct_override_capability = calc_override_angle_limited(STEER_OVERRIDE_TORQUE_RANGE, vEgo, VM, + STEER_OVERRIDE_MAX_LAT_ACCEL) / override_envelope + + angle_override_direct = self.apply_override_angle_direct(lat_active, driverTorque, vEgo, VM) + relative_weight = 1.0 - direct_override_capability + if relative_weight > 0.0: + self.apply_override_angle_relative(lat_active, driverTorque, vEgo, VM, unwind_weight=relative_weight) + self.override_angle_accu = apply_bounds(self.override_angle_accu, override_envelope / relative_weight) + else: + self.center_override_angle_accu(vEgo, VM) + + return angle_override_direct * direct_override_capability + self.override_angle_accu * relative_weight + + def center_override_angle_accu(self, vEgo: float, VM: VehicleModel) -> None: + centering_delta = calc_override_angle_delta_limited(STEER_OVERRIDE_TORQUE_RANGE, vEgo, VM, + STEER_OVERRIDE_MAX_LAT_JERK_CENTERING) + self.override_angle_accu -= apply_bounds(self.override_angle_accu, centering_delta) + + def overriding_steer_desired_accel_limit(self, lat_active: bool, apply_angle: float, vEgo: float, steeringTorque: float) -> float: + """ + Acceleration rate limiter - limits acceleration but allows for quick deceleration (no overshoot) + """ + if not lat_active: + self.override_accel_rate_limiter.reset(apply_angle) + return apply_angle + + if abs(steeringTorque) >= STEER_OVERRIDE_MIN_TORQUE: + self.override_active_counter = 0 + else: + self.override_active_counter += DT_LAT_CTRL + self.override_active_counter = min(self.override_active_counter, STEER_DESIRED_LIMITER_OVERRIDE_ACTIVE_COUNTER) + + max_angle_rate = CarControllerParams.ANGLE_LIMITS.MAX_ANGLE_RATE / DT_LAT_CTRL # MAX_ANGLE_RATE is per frame units so convert to real rate + # this ensures no acceleration limit when override is disabled: + max_angle_accel = max_angle_rate / DT_LAT_CTRL # ensures max deceleration + if vEgo < STEER_DESIRED_LIMITER_ALLOW_SPEED: + # Interpolate between STEER_DESIRED_LIMITER_ACCEL and max_angle_accel based on counter progress + max_angle_accel = np.interp( + self.override_active_counter, + [0, STEER_DESIRED_LIMITER_OVERRIDE_ACTIVE_COUNTER], + [STEER_DESIRED_LIMITER_ACCEL, max_angle_accel] + ) + # max_angle_rate / DT_LAT_CTRL ensures max deceleration + return self.override_accel_rate_limiter.update(apply_angle, max_angle_rate, max_angle_accel, np.inf, DT_LAT_CTRL) + + def resume_steer_desired_rate_limit(self, lat_active: bool, apply_angle: float, steering_angle: float) -> float: + """Limits steering wheel acceleration when resuming steering""" + if not lat_active: + # reset and bypass + self.resume_rate_limiter_delta.reset(0) + self.resume_rate_limiter.reset(steering_angle) + return steering_angle + + angle_rate_delta_lim = self.resume_rate_limiter_delta.update(CarControllerParams.ANGLE_LIMITS.MAX_ANGLE_RATE, + STEER_RESUME_RATE_LIMIT_RAMP_RATE * DT_LAT_CTRL**2) + apply_angle_lim = self.resume_rate_limiter.update(apply_angle, angle_rate_delta_lim) + return apply_angle_lim + + def update(self, apply_angle, lat_active, CP_IQ: structs.IQCarParams, CS: structs.CarState, VM: VehicleModel) -> TorqueBlendDataIQ: + # estimate real steering angle by adding rate to the tesla filtered angle + steeringAngleDegPhaseLead = CS.out.steeringAngleDeg + CS.out.steeringRateDeg / STEERING_DEG_PHASE_LEAD_COEFF + + angle_coop_enabled = CP_IQ.flags & TeslaFlagsIQ.COOP_STEERING.value + + # avoid sudden rotation on engagement + apply_angle = self.resume_steer_desired_rate_limit(lat_active, apply_angle, steeringAngleDegPhaseLead) + + if angle_coop_enabled: + # apply_angle = self.overriding_steer_desired_accel_limit(lat_active, apply_angle, CS.out.vEgo, CS.out.steeringTorque) + self.debug_angle_desired_limited = apply_angle #! debug + + driver_torque = self.torque_zero.update(CS.out.steeringTorque, lat_active) + apply_angle += self.apply_override_angle_combined(lat_active, driver_torque, CS.out.vEgo, VM) + + # final rate limit - matching panda safety + self.coop_apply_angle_last = apply_angle + self.blend_apply_angle_last_sat = apply_steer_angle_limits_vm(apply_angle, self.blend_apply_angle_last_sat, CS.out.vEgoRaw, + CS.out.steeringAngleDeg, lat_active, TorqueBlendParams, VM) + + return TorqueBlendDataIQ(self.blend_apply_angle_last_sat, lat_active, 1) # 1 = angle control diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/tesla/values.py b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/values.py new file mode 100644 index 000000000..78d0e9dff --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/tesla/values.py @@ -0,0 +1,15 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from enum import IntFlag + + +class TeslaFlagsIQ(IntFlag): + HAS_VEHICLE_BUS = 1 # 3-finger infotainment press signal is present on the VEHICLE bus with the deprecated Tesla harness installed + COOP_STEERING = 2 # virtual torque blending + FSD_VISUALIZATION = 4 + + +class TeslaSafetyFlagsIQ: + HAS_VEHICLE_BUS = 1 + FSD_VISUALIZATION = 2 diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/tests/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/tests/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/tests/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/toyota/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/toyota/gas_interceptor.py b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/gas_interceptor.py new file mode 100644 index 000000000..34ab7986a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/gas_interceptor.py @@ -0,0 +1,47 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import numpy as np + +from iqdbc.car import structs +from iqdbc.car.can_definitions import CanData +from iqdbc.car.toyota.values import CAR, MIN_ACC_SPEED, PEDAL_TRANSITION +from iqdbc.lvbs.car import create_gas_interceptor_command + + +class GasInterceptorCarController: + def __init__(self, CP, CP_IQ): + self.CP = CP + self.CP_IQ = CP_IQ + + self.gas = 0. + self.interceptor_gas_cmd = 0. + + def create_gas_command(self, CC: structs.CarControl, CS: structs.CarState, actuators: structs.CarControl.Actuators, + packer, frame: int) -> list[CanData]: + can_sends = [] + + if self.CP_IQ.enableGasInterceptor and CC.longActive: + MAX_INTERCEPTOR_GAS = 0.3 + # RAV4 has very sensitive gas pedal + if self.CP.carFingerprint in (CAR.TOYOTA_RAV4, CAR.TOYOTA_RAV4H, CAR.TOYOTA_HIGHLANDER): + PEDAL_SCALE = np.interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.15, 0.3, 0.0]) + elif self.CP.carFingerprint in (CAR.TOYOTA_COROLLA,): + PEDAL_SCALE = np.interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.3, 0.4, 0.0]) + else: + PEDAL_SCALE = np.interp(CS.out.vEgo, [0.0, MIN_ACC_SPEED, MIN_ACC_SPEED + PEDAL_TRANSITION], [0.4, 0.5, 0.0]) + # offset for creep and windbrake + pedal_offset = np.interp(CS.out.vEgo, [0.0, 2.3, MIN_ACC_SPEED + PEDAL_TRANSITION], [-.4, 0.0, 0.2]) + pedal_command = PEDAL_SCALE * (actuators.accel + pedal_offset) + self.interceptor_gas_cmd = float(np.clip(pedal_command, 0., MAX_INTERCEPTOR_GAS)) + else: + self.interceptor_gas_cmd = 0. + + if frame % 2 == 0 and self.CP_IQ.enableGasInterceptor and self.CP.openpilotLongitudinalControl: + # send exactly zero if gas cmd is zero. Interceptor will send the max between read value and gas cmd. + # This prevents unexpected pedal range rescaling + can_sends.append(create_gas_interceptor_command(packer, self.interceptor_gas_cmd, frame // 2)) + self.gas = self.interceptor_gas_cmd + + return can_sends diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/toyota/iq_carstate.py b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/iq_carstate.py new file mode 100644 index 000000000..df00ceec0 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/iq_carstate.py @@ -0,0 +1,167 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from enum import StrEnum + +from iqdbc.car import Bus, structs +from iqdbc.car.carlog import carlog +from iqdbc.can.parser import CANParser +from iqdbc.car.common.conversions import Conversions as CV +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ + +TRAFFIC_SIGNAL_MAP = { + 1: "kph", + 36: "mph", + 65: "No overtake", + 66: "No overtake" +} + +ZSS_DIFF_THRESHOLD = 4 +ZSS_MAX_THRESHOLD = 10 + + +class IQCarState: + def __init__(self, CP, CP_IQ): + self.CP = CP + self.CP_IQ = CP_IQ + + self.acc_type = 1 + self.zss_compute = False + self.zss_cruise_active_last = False + self.zss_angle_offset = 0. + self.zss_threshold_count = 0 + + """Initialize traffic signal variables""" + self._tsgn1 = None + self._spdval1 = None + self._splsgn1 = None + self._tsgn2 = None + self._splsgn2 = None + self._tsgn3 = None + self._splsgn3 = None + self._tsgn4 = None + self._splsgn4 = None + + @staticmethod + def traffic_signal_description(tsgn): + """Get description for traffic signal code""" + desc = TRAFFIC_SIGNAL_MAP.get(int(tsgn)) + return f'{tsgn}: {desc}' if desc is not None else f'{tsgn}' + + def update_traffic_signals(self, cp_cam): + """Update traffic signals with error handling""" + try: + # Add error handling for missing RSA messages + tsgn1 = cp_cam.vl.get("RSA1", {}).get('TSGN1', 0) + spdval1 = cp_cam.vl.get("RSA1", {}).get('SPDVAL1', 0) + splsgn1 = cp_cam.vl.get("RSA1", {}).get('SPLSGN1', 0) + tsgn2 = cp_cam.vl.get("RSA1", {}).get('TSGN2', 0) + splsgn2 = cp_cam.vl.get("RSA1", {}).get('SPLSGN2', 0) + tsgn3 = cp_cam.vl.get("RSA2", {}).get('TSGN3', 0) + splsgn3 = cp_cam.vl.get("RSA2", {}).get('SPLSGN3', 0) + tsgn4 = cp_cam.vl.get("RSA2", {}).get('TSGN4', 0) + splsgn4 = cp_cam.vl.get("RSA2", {}).get('SPLSGN4', 0) + except (KeyError, AttributeError) as e: + # Handle case where RSA messages are not available + carlog.debug(f"RSA messages not available: {e}") + return + + has_changed = tsgn1 != self._tsgn1 \ + or spdval1 != self._spdval1 \ + or splsgn1 != self._splsgn1 \ + or tsgn2 != self._tsgn2 \ + or splsgn2 != self._splsgn2 \ + or tsgn3 != self._tsgn3 \ + or splsgn3 != self._splsgn3 \ + or tsgn4 != self._tsgn4 \ + or splsgn4 != self._splsgn4 + + self._tsgn1 = tsgn1 + self._spdval1 = spdval1 + self._splsgn1 = splsgn1 + self._tsgn2 = tsgn2 + self._splsgn2 = splsgn2 + self._tsgn3 = tsgn3 + self._splsgn3 = splsgn3 + self._tsgn4 = tsgn4 + self._splsgn4 = splsgn4 + + if not has_changed: + return + + carlog.debug('---- TRAFFIC SIGNAL UPDATE -----') + if tsgn1 is not None and tsgn1 != 0: + carlog.debug(f'TSGN1: {self.traffic_signal_description(tsgn1)}') + if spdval1 is not None and spdval1 != 0: + carlog.debug(f'SPDVAL1: {spdval1}') + if splsgn1 is not None and splsgn1 != 0: + carlog.debug(f'SPLSGN1: {splsgn1}') + if tsgn2 is not None and tsgn2 != 0: + carlog.debug(f'TSGN2: {self.traffic_signal_description(tsgn2)}') + if splsgn2 is not None and splsgn2 != 0: + carlog.debug(f'SPLSGN2: {splsgn2}') + if tsgn3 is not None and tsgn3 != 0: + carlog.debug(f'TSGN3: {self.traffic_signal_description(tsgn3)}') + if splsgn3 is not None and splsgn3 != 0: + carlog.debug(f'SPLSGN3: {splsgn3}') + if tsgn4 is not None and tsgn4 != 0: + carlog.debug(f'TSGN4: {self.traffic_signal_description(tsgn4)}') + if splsgn4 is not None and splsgn4 != 0: + carlog.debug(f'SPLSGN4: {splsgn4}') + carlog.debug('------------------------') + + def calculate_speed_limit(self): + """Calculate speed limit from traffic signals with validation""" + # Check all traffic sign slots for speed limits, not just tsgn1 + for tsgn, spdval in [(self._tsgn1, self._spdval1), + (self._tsgn2, None), + (self._tsgn3, None), + (self._tsgn4, None)]: + + if tsgn == 1 and spdval is not None and 0 < spdval <= 200: # Reasonable speed range + return spdval * CV.KPH_TO_MS + + if tsgn == 36 and spdval is not None and 0 < spdval <= 120: # Reasonable MPH range + return spdval * CV.MPH_TO_MS + + return 0 + + def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None: + cp = can_parsers[Bus.pt] + cp_cam = can_parsers[Bus.cam] + + if self.CP_IQ.flags & ToyotaFlagsIQ.SMART_DSU or self.CP_IQ.flags & ToyotaFlagsIQ.STOP_AND_GO_HACK: + self.acc_type = 1 + + if self.CP_IQ.enableGasInterceptor: + gas = (cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS"] + cp.vl["GAS_SENSOR"]["INTERCEPTOR_GAS2"]) // 2 + ret.gasPressed = gas > 805 + + # ZSS support thanks to zorrobyte, ErichMoraga, and dragonpilot + if self.CP_IQ.flags & ToyotaFlagsIQ.ZSS: + zorro_steer = cp.vl["SECONDARY_STEER_ANGLE"]["ZORRO_STEER"] + control_available = ret.cruiseState.available + + # Only compute ZSS offset when control is available + if control_available and not self.zss_cruise_active_last: + self.zss_threshold_count = 0 + self.zss_compute = True # Control was just activated, so allow offset to be recomputed + self.zss_cruise_active_last = control_available + + # Compute ZSS offset once we have meaningful angles + if self.zss_compute and abs(ret.steeringAngleDeg) > 1e-3 and abs(zorro_steer) > 1e-3: + self.zss_compute = False + self.zss_angle_offset = zorro_steer - ret.steeringAngleDeg + + # Sanity checks + steering_angle_deg = zorro_steer - self.zss_angle_offset + if self.zss_threshold_count <= ZSS_MAX_THRESHOLD: + if abs(ret.steeringAngleDeg - steering_angle_deg) > ZSS_DIFF_THRESHOLD: + self.zss_threshold_count += 1 + else: + ret.steeringAngleDeg = steering_angle_deg + + # Update traffic signals and speed limit + self.update_traffic_signals(cp_cam) + ret_iq.speedLimit = self.calculate_speed_limit() diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/toyota/iq_fingerprints.py b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/iq_fingerprints.py new file mode 100644 index 000000000..07b4125fc --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/iq_fingerprints.py @@ -0,0 +1,6 @@ +from iqdbc.car.structs import CarParams + +Ecu = CarParams.Ecu + +FW_VERSIONS_EXT = { +} diff --git a/artifacts/package_runtime/iqdbc/lvbs/car/toyota/values.py b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/values.py new file mode 100644 index 000000000..955a76187 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/car/toyota/values.py @@ -0,0 +1,21 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from enum import IntFlag + + +class ToyotaFlagsIQ(IntFlag): + SMART_DSU = 1 + RADAR_CAN_FILTER = 2 + ZSS = 4 + STOCK_LONGITUDINAL = 8 + STOP_AND_GO_HACK = 16 + + +class ToyotaSafetyFlagsIQ: + DEFAULT = 0 + UNSUPPORTED_DSU = 1 + GAS_INTERCEPTOR = 2 + LKAS_HUD = 4 + diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/tools/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/__init__.py @@ -0,0 +1 @@ + diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/__init__.py @@ -0,0 +1 @@ + diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/clear_dtc.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/clear_dtc.py new file mode 100644 index 000000000..c5060b370 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/clear_dtc.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +import sys +import argparse +from subprocess import check_output, CalledProcessError +from iqdbc.car.carlog import carlog +from iqdbc.car.uds import UdsClient, MessageTimeoutError, SESSION_TYPE, DTC_GROUP_TYPE +from iqdbc.car.structs import CarParams +from panda import Panda + +parser = argparse.ArgumentParser(description="clear DTC status") +parser.add_argument("addr", type=lambda x: int(x,0), nargs="?", default=0x7DF) # default is functional (broadcast) address +parser.add_argument("--bus", type=int, default=0) +parser.add_argument('--debug', action='store_true') +args = parser.parse_args() + +if args.debug: + carlog.setLevel('DEBUG') + +try: + check_output(["pidof", "pandad"]) + print("pandad is running, please kill openpilot before running this script! (aborted)") + sys.exit(1) +except CalledProcessError as e: + if e.returncode != 1: # 1 == no process found (pandad not running) + raise e + +panda = Panda() +panda.set_safety_mode(CarParams.SafetyModel.elm327) +uds_client = UdsClient(panda, args.addr, bus=args.bus) +print("extended diagnostic session ...") +try: + uds_client.diagnostic_session_control(SESSION_TYPE.EXTENDED_DIAGNOSTIC) +except MessageTimeoutError: + # functional address isn't properly handled so a timeout occurs + if args.addr != 0x7DF: + raise +print("clear diagnostic info ...") +try: + uds_client.clear_diagnostic_information(DTC_GROUP_TYPE.ALL) +except MessageTimeoutError: + # functional address isn't properly handled so a timeout occurs + if args.addr != 0x7DF: + pass +print("") +print("you may need to power cycle your vehicle now") diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/disable_ecu.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/disable_ecu.py new file mode 100644 index 000000000..803d49e21 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/disable_ecu.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +import time +import iqpilot.cereal.messaging as messaging +from iqdbc.car.disable_ecu import disable_ecu +from iqpilot.selfdrive.car.card import can_comm_callbacks + +if __name__ == "__main__": + sendcan = messaging.pub_sock('sendcan') + logcan = messaging.sub_sock('can') + can_callbacks = can_comm_callbacks(logcan, sendcan) + time.sleep(1) + + # honda bosch radar disable + disabled = disable_ecu(*can_callbacks, bus=1, addr=0x18DAB0F1, com_cont_req=b'\x28\x83\x03', timeout=0.5) + print(f"disabled: {disabled}") diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/ecu_addrs.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/ecu_addrs.py new file mode 100644 index 000000000..e7a08050e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/ecu_addrs.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +import argparse +import time +import iqpilot.cereal.messaging as messaging +from iqdbc.car.carlog import carlog +from iqdbc.car.ecu_addrs import get_all_ecu_addrs +from iqpilot.common.params import Params +from iqpilot.selfdrive.car.card import can_comm_callbacks, obd_callback + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Get addresses of all ECUs') + parser.add_argument('--debug', action='store_true') + parser.add_argument('--bus', type=int, default=1) + parser.add_argument('--no-obd', action='store_true') + parser.add_argument('--timeout', type=float, default=1.0) + args = parser.parse_args() + + if args.debug: + carlog.setLevel('DEBUG') + + logcan = messaging.sub_sock('can') + sendcan = messaging.pub_sock('sendcan') + can_callbacks = can_comm_callbacks(logcan, sendcan) + + # Set up params for pandad + params = Params() + params.remove("FirmwareQueryDone") + params.put_bool("IsOnroad", False) + time.sleep(0.2) # thread is 10 Hz + params.put_bool("IsOnroad", True) + + obd_callback(params)(not args.no_obd) + + print("Getting ECU addresses ...") + ecu_addrs = get_all_ecu_addrs(*can_callbacks, args.bus, args.timeout) + + print() + print("Found ECUs on rx addresses:") + for addr, subaddr, _ in ecu_addrs: + msg = f" {hex(addr)}" + if subaddr is not None: + msg += f" (sub-address: {hex(subaddr)})" + print(msg) diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/hyundai_enable_radar_points.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/hyundai_enable_radar_points.py new file mode 100644 index 000000000..d055f02a9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/hyundai_enable_radar_points.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +"""Some Hyundai radars can be reconfigured to output (debug) radar points on bus 1. +Reconfiguration is done over UDS by reading/writing to 0x0142 using the Read/Write Data By Identifier +endpoints (0x22 & 0x2E). This script checks your radar firmware version against a list of known +firmware versions. If you want to try on a new radar make sure to note the default config value +in case it's different from the other radars and you need to revert the changes. + +After changing the config the car should not show any faults when openpilot is not running. +These config changes are persistent across car reboots. You need to run this script again +to go back to the default values. + +USE AT YOUR OWN RISK! Safety features, like AEB and FCW, might be affected by these changes.""" + +import sys +import argparse +from typing import NamedTuple +from subprocess import check_output, CalledProcessError + +from iqdbc.car.carlog import carlog +from iqdbc.car.uds import UdsClient, SESSION_TYPE, DATA_IDENTIFIER_TYPE +from iqdbc.car.structs import CarParams +from panda.python import Panda + +class ConfigValues(NamedTuple): + default_config: bytes + tracks_enabled: bytes + +# If your radar supports changing data identifier 0x0142 as well make a PR to +# this file to add your firmware version. Make sure to post a drive as proof! +# NOTE: these firmware versions do not match what openpilot uses +# because this script uses a different diagnostic session type +SUPPORTED_FW_VERSIONS = { + # 2020 SONATA + b"DN8_ SCC FHCUP 1.00 1.00 99110-L0000\x19\x08)\x15T ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + b"DN8_ SCC F-CUP 1.00 1.00 99110-L0000\x19\x08)\x15T ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + # 2021 SONATA HYBRID + b"DNhe SCC FHCUP 1.00 1.00 99110-L5000\x19\x04&\x13' ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + b"DNhe SCC FHCUP 1.00 1.02 99110-L5000 \x01#\x15# ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + # 2020 PALISADE + b"LX2_ SCC FHCUP 1.00 1.04 99110-S8100\x19\x05\x02\x16V ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + # 2022 PALISADE + b"LX2_ SCC FHCUP 1.00 1.00 99110-S8110!\x04\x05\x17\x01 ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + # 2020 SANTA FE + b"TM__ SCC F-CUP 1.00 1.03 99110-S2000\x19\x050\x13' ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + # 2020 GENESIS G70 + b'IK__ SCC F-CUP 1.00 1.02 96400-G9100\x18\x07\x06\x17\x12 ': ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + # 2019 SANTA FE + b"TM__ SCC F-CUP 1.00 1.00 99110-S1210\x19\x01%\x168 ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + b"TM__ SCC F-CUP 1.00 1.02 99110-S2000\x18\x07\x08\x18W ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + # 2021 K5 HEV + b"DLhe SCC FHCUP 1.00 1.02 99110-L7000 \x01 \x102 ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + # 2022 Niro EV + b"DEev SCC F-CUP 1.00 1.00 99110-Q4600\x01\x42 ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), + b"DEev SCC F-CUP 1.00 1.00 99110-Q4600 \x07\x03\t% ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), +} + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='configure radar to output points (or reset to default)') + parser.add_argument('--default', action="store_true", default=False, help='reset to default configuration (default: false)') + parser.add_argument('--debug', action="store_true", default=False, help='enable debug output (default: false)') + parser.add_argument('--bus', type=int, default=0, help='can bus to use (default: 0)') + args = parser.parse_args() + + if args.debug: + carlog.setLevel('DEBUG') + + try: + check_output(["pidof", "pandad"]) + print("pandad is running, please kill openpilot before running this script! (aborted)") + sys.exit(1) + except CalledProcessError as e: + if e.returncode != 1: # 1 == no process found (pandad not running) + raise e + + confirm = input("power on the vehicle keeping the engine off (press start button twice) then type OK to continue: ").upper().strip() + if confirm != "OK": + print("\nyou didn't type 'OK! (aborted)") + sys.exit(0) + + panda = Panda() + panda.set_safety_mode(CarParams.SafetyModel.elm327) + uds_client = UdsClient(panda, 0x7D0, bus=args.bus) + + print("\n[START DIAGNOSTIC SESSION]") + session_type: SESSION_TYPE = 0x07 + uds_client.diagnostic_session_control(session_type) + + print("[HARDWARE/SOFTWARE VERSION]") + fw_version_data_id: DATA_IDENTIFIER_TYPE = 0xf100 + fw_version = uds_client.read_data_by_identifier(fw_version_data_id) + print(fw_version) + if fw_version not in SUPPORTED_FW_VERSIONS.keys(): + print("radar not supported! (aborted)") + sys.exit(1) + + print("[GET CONFIGURATION]") + config_data_id: DATA_IDENTIFIER_TYPE = 0x0142 + current_config = uds_client.read_data_by_identifier(config_data_id) + config_values = SUPPORTED_FW_VERSIONS[fw_version] + new_config = config_values.default_config if args.default else config_values.tracks_enabled + print(f"current config: 0x{current_config.hex()}") + if current_config != new_config: + print("[CHANGE CONFIGURATION]") + print(f"new config: 0x{new_config.hex()}") + uds_client.write_data_by_identifier(config_data_id, new_config) + if not args.default and current_config != SUPPORTED_FW_VERSIONS[fw_version].default_config: + print("\ncurrent config does not match expected default! (aborted)") + sys.exit(1) + + print("[DONE]") + print("\nrestart your vehicle and ensure there are no faults") + if not args.default: + print("you can run this script again with --default to go back to the original (factory) settings") + else: + print("[DONE]") + print("\ncurrent config is already the desired configuration") + sys.exit(0) diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/read_dtc_status.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/read_dtc_status.py new file mode 100644 index 000000000..20d69d2c3 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/read_dtc_status.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +import sys +import argparse +from subprocess import check_output, CalledProcessError +from iqdbc.car.carlog import carlog +from iqdbc.car.uds import UdsClient, SESSION_TYPE, DTC_REPORT_TYPE, DTC_STATUS_MASK_TYPE, get_dtc_num_as_str, get_dtc_status_names +from iqdbc.car.structs import CarParams +from panda import Panda + +parser = argparse.ArgumentParser(description="read DTC status") +parser.add_argument("addr", type=lambda x: int(x,0)) +parser.add_argument("--bus", type=int, default=0) +parser.add_argument('--debug', action='store_true') +args = parser.parse_args() + +if args.debug: + carlog.setLevel('DEBUG') + +try: + check_output(["pidof", "pandad"]) + print("pandad is running, please kill openpilot before running this script! (aborted)") + sys.exit(1) +except CalledProcessError as e: + if e.returncode != 1: # 1 == no process found (pandad not running) + raise e + +panda = Panda() +panda.set_safety_mode(CarParams.SafetyModel.elm327) +uds_client = UdsClient(panda, args.addr, bus=args.bus) +print("extended diagnostic session ...") +uds_client.diagnostic_session_control(SESSION_TYPE.EXTENDED_DIAGNOSTIC) +print("read diagnostic codes ...") +data = uds_client.read_dtc_information(DTC_REPORT_TYPE.DTC_BY_STATUS_MASK, DTC_STATUS_MASK_TYPE.ALL) +print("status availability:", " ".join(get_dtc_status_names(data[0]))) +print("DTC status:") +for i in range(1, len(data), 4): + dtc_num = get_dtc_num_as_str(data[i:i+3]) + dtc_status = " ".join(get_dtc_status_names(data[i+3])) + print(dtc_num, dtc_status) diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/toyota_eps_factor.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/toyota_eps_factor.py new file mode 100644 index 000000000..560227b1a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/toyota_eps_factor.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +import sys +import numpy as np +import matplotlib.pyplot as plt +from sklearn import linear_model +from iqdbc.car.toyota.values import STEER_THRESHOLD + +from iqpilot.tools.lib.logreader import LogReader + +MIN_SAMPLES = 30 * 100 + + +def to_signed(n, bits): + if n >= (1 << max((bits - 1), 0)): + n = n - (1 << max(bits, 0)) + return n + + +def get_eps_factor(lr, plot=False): + engaged = False + steering_pressed = False + torque_cmd, eps_torque = None, None + cmds, eps = [], [] + + for msg in lr: + if msg.which() != 'can': + continue + + for m in msg.can: + if m.address == 0x2e4 and m.src == 128: + engaged = bool(m.dat[0] & 1) + torque_cmd = to_signed((m.dat[1] << 8) | m.dat[2], 16) + elif m.address == 0x260 and m.src == 0: + eps_torque = to_signed((m.dat[5] << 8) | m.dat[6], 16) + steering_pressed = abs(to_signed((m.dat[1] << 8) | m.dat[2], 16)) > STEER_THRESHOLD + + if engaged and torque_cmd is not None and eps_torque is not None and not steering_pressed: + cmds.append(torque_cmd) + eps.append(eps_torque) + else: + if len(cmds) > MIN_SAMPLES: + break + cmds, eps = [], [] + + if len(cmds) < MIN_SAMPLES: + raise Exception("too few samples found in route") + + lm = linear_model.LinearRegression(fit_intercept=False) + lm.fit(np.array(cmds).reshape(-1, 1), eps) + scale_factor = 1. / lm.coef_[0] + + if plot: + plt.plot(np.array(eps) * scale_factor) + plt.plot(cmds) + plt.show() + return scale_factor + + +if __name__ == "__main__": + lr = LogReader(sys.argv[1]) + n = get_eps_factor(lr, plot="--plot" in sys.argv) + print("EPS torque factor: ", n) diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/vin.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/vin.py new file mode 100644 index 000000000..efc2f5b50 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/vin.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +import argparse +import time +import iqpilot.cereal.messaging as messaging +from iqdbc.car.carlog import carlog +from iqdbc.car.vin import get_vin +from iqpilot.selfdrive.car.card import can_comm_callbacks + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Get VIN of the car') + parser.add_argument('--debug', action='store_true') + parser.add_argument('--bus', type=int, default=1) + parser.add_argument('--timeout', type=float, default=0.1) + parser.add_argument('--retry', type=int, default=5) + args = parser.parse_args() + + if args.debug: + carlog.setLevel('DEBUG') + + sendcan = messaging.pub_sock('sendcan') + logcan = messaging.sub_sock('can') + can_callbacks = can_comm_callbacks(logcan, sendcan) + time.sleep(1) + + vin_rx_addr, vin_rx_bus, vin = get_vin(*can_callbacks, (args.bus,), args.timeout, args.retry) + print(f'RX: {hex(vin_rx_addr)}, BUS: {vin_rx_bus}, VIN: {vin}') diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/vw_mqb_config.py b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/vw_mqb_config.py new file mode 100644 index 000000000..d94eaf9d5 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/ecu/vw_mqb_config.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 + +import argparse +import struct +from enum import IntEnum +from iqdbc.car.carlog import carlog +from iqdbc.car.uds import UdsClient, MessageTimeoutError, NegativeResponseError, SESSION_TYPE,\ + DATA_IDENTIFIER_TYPE, ACCESS_TYPE +from iqdbc.car.structs import CarParams +from panda import Panda +from datetime import date + +# TODO: extend UDS library to allow custom/vendor-defined data identifiers without ignoring type checks +class VOLKSWAGEN_DATA_IDENTIFIER_TYPE(IntEnum): + CODING = 0x0600 + +# TODO: extend UDS library security_access() to take an access level offset per ISO 14229-1:2020 10.4 and remove this +class ACCESS_TYPE_LEVEL_1(IntEnum): + REQUEST_SEED = ACCESS_TYPE.REQUEST_SEED + 2 + SEND_KEY = ACCESS_TYPE.SEND_KEY + 2 + +MQB_EPS_CAN_ADDR = 0x712 +RX_OFFSET = 0x6a + +if __name__ == "__main__": + desc_text = "Shows Volkswagen EPS software and coding info, and enables or disables Heading Control Assist " + \ + "(Lane Assist). Useful for enabling HCA on cars without factory Lane Assist that want to use " + \ + "openpilot integrated at the CAN gateway (J533)." + epilog_text = "This tool is meant to run directly on a vehicle-installed comma three, with the " + \ + "openpilot/tmux processes stopped. It should also work on a separate PC with a USB-attached comma " + \ + "panda. Vehicle ignition must be on. Recommend engine not be running when making changes. Must " + \ + "turn ignition off and on again for any changes to take effect." + parser = argparse.ArgumentParser(description=desc_text, epilog=epilog_text) + parser.add_argument("--debug", action="store_true", help="enable ISO-TP/UDS stack debugging output") + parser.add_argument("action", choices={"show", "enable", "disable"}, help="show or modify current EPS HCA config") + args = parser.parse_args() + + if args.debug: + carlog.setLevel('DEBUG') + + panda = Panda() + panda.set_safety_mode(CarParams.SafetyModel.elm327) + uds_client = UdsClient(panda, MQB_EPS_CAN_ADDR, MQB_EPS_CAN_ADDR + RX_OFFSET, 1, timeout=0.2) + + try: + uds_client.diagnostic_session_control(SESSION_TYPE.EXTENDED_DIAGNOSTIC) + except MessageTimeoutError: + print("Timeout opening session with EPS") + quit() + + odx_file, current_coding = None, None + try: + hw_pn = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_HARDWARE_NUMBER).decode("utf-8") + sw_pn = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_SPARE_PART_NUMBER).decode("utf-8") + sw_ver = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_VERSION_NUMBER).decode("utf-8") + component = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.SYSTEM_NAME_OR_ENGINE_TYPE).decode("utf-8") + odx_file = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.ODX_FILE).decode("utf-8").rstrip('\x00') + current_coding = uds_client.read_data_by_identifier(VOLKSWAGEN_DATA_IDENTIFIER_TYPE.CODING) + coding_text = current_coding.hex() + + print("\nEPS diagnostic data\n") + print(f" Part No HW: {hw_pn}") + print(f" Part No SW: {sw_pn}") + print(f" SW Version: {sw_ver}") + print(f" Component: {component}") + print(f" Coding: {coding_text}") + print(f" ASAM Dataset: {odx_file}") + except NegativeResponseError: + print("Error fetching data from EPS") + quit() + except MessageTimeoutError: + print("Timeout fetching data from EPS") + quit() + + coding_variant, current_coding_array, coding_byte, coding_bit = None, None, 0, 0 + coding_length = len(current_coding) + + # EPS_MQB_ZFLS + if odx_file in ("EV_SteerAssisMQB", "EV_SteerAssisMNB"): + coding_variant = "ZFLS" + coding_byte = 0 + coding_bit = 4 + + # MQB_PP_APA, MQB_VWBS_GEN2 + elif odx_file in ("EV_SteerAssisVWBSMQBA", "EV_SteerAssisVWBSMQBGen2"): + coding_variant = "APA" + coding_byte = 3 + coding_bit = 0 + + else: + print("Configuration changes not yet supported on this EPS!") + quit() + + current_coding_array = struct.unpack(f"!{coding_length}B", current_coding) + hca_enabled = (current_coding_array[coding_byte] & (1 << coding_bit) != 0) + hca_text = ("DISABLED", "ENABLED")[hca_enabled] + print(f" Lane Assist: {hca_text}") + + try: + params = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION).decode("utf-8") + param_version_system_params = params[1:3] + param_vehicle_type = params[3:5] + param_index_char_curve = params[5:7] + param_version_char_values = params[7:9] + param_version_memory_map = params[9:11] + print("\nEPS parameterization (per-vehicle calibration) data\n") + print(f" Version of system parameters: {param_version_system_params}") + print(f" Vehicle type: {param_vehicle_type}") + print(f" Index of characteristic curve: {param_index_char_curve}") + print(f" Version of characteristic values: {param_version_char_values}") + print(f" Version of memory map: {param_version_memory_map}") + except (NegativeResponseError, MessageTimeoutError): + print("Error fetching parameterization data from EPS!") + quit() + + if args.action in ["enable", "disable"]: + print("\nAttempting configuration update") + + assert (coding_variant in ("ZFLS", "APA")) + # ZFLS EPS config coding length can be anywhere from 1 to 4 bytes, but the + # bit we care about is always in the same place in the first byte + if args.action == "enable": + new_byte = current_coding_array[coding_byte] | (1 << coding_bit) + else: + new_byte = current_coding_array[coding_byte] & ~(1 << coding_bit) + new_coding = current_coding[0:coding_byte] + new_byte.to_bytes(1, "little") + current_coding[coding_byte+1:] + + try: + seed = uds_client.security_access(ACCESS_TYPE_LEVEL_1.REQUEST_SEED) + key = struct.unpack("!I", seed)[0] + 28183 # yeah, it's like that + uds_client.security_access(ACCESS_TYPE_LEVEL_1.SEND_KEY, struct.pack("!I", key)) + except (NegativeResponseError, MessageTimeoutError): + print("Security access failed!") + print("Open the hood and retry (disables the \"diagnostic firewall\" on newer vehicles)") + quit() + + try: + # Programming date and tester number must be written before making + # a change, or write to CODING will fail with request sequence error + # Encoding on tester is unclear, it contains the workshop code in the + # last two bytes, but not the VZ/importer or tester serial number + # Can't seem to read it back, but we can read the calibration tester, + # so fib a little and say that same tester did the programming + current_date = date.today() + formatted_date = current_date.strftime('%y-%m-%d') + year, month, day = (int(part) for part in formatted_date.split('-')) + prog_date = bytes([year, month, day]) + uds_client.write_data_by_identifier(DATA_IDENTIFIER_TYPE.PROGRAMMING_DATE, prog_date) + tester_num = uds_client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.CALIBRATION_REPAIR_SHOP_CODE_OR_CALIBRATION_EQUIPMENT_SERIAL_NUMBER) + uds_client.write_data_by_identifier(DATA_IDENTIFIER_TYPE.REPAIR_SHOP_CODE_OR_TESTER_SERIAL_NUMBER, tester_num) + uds_client.write_data_by_identifier(VOLKSWAGEN_DATA_IDENTIFIER_TYPE.CODING, new_coding) + except (NegativeResponseError, MessageTimeoutError): + print("Writing new configuration failed!") + print("Make sure the comma processes are stopped: tmux kill-session -t comma") + quit() + + try: + # Read back result just to make 100% sure everything worked + current_coding_text = uds_client.read_data_by_identifier(VOLKSWAGEN_DATA_IDENTIFIER_TYPE.CODING).hex() + print(f" New coding: {current_coding_text}") + except (NegativeResponseError, MessageTimeoutError): + print("Reading back updated coding failed!") + quit() + print("EPS configuration successfully updated") diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/__init__.py b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/__init__.py @@ -0,0 +1 @@ + diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/debug_fw_fingerprinting_offline.py b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/debug_fw_fingerprinting_offline.py new file mode 100644 index 000000000..8bc9f2862 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/debug_fw_fingerprinting_offline.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +import argparse + +from iqdbc.car import uds +from iqpilot.tools.lib.logreader import LogReader, ReadMode, live_logreader + + +def main(route: str | None, addrs: list[int], rxoffset: int | None): + """ + TODO: + - highlight TX vs RX clearly + - disambiguate sendcan and can (useful to know if something sent on sendcan made it to the bus on can->128) + - print as fixed width table, easier to read + """ + + if route is None: + lr = live_logreader() + else: + lr = LogReader(route, default_mode=ReadMode.RLOG, sort_by_time=True) + + start_mono_time = None + prev_mono_time = 0 + + # include rx addresses + addrs = addrs + [uds.get_rx_addr_for_tx_addr(addr, rxoffset) for addr in addrs] + + for msg in lr: + if msg.which() == 'can': + if start_mono_time is None: + start_mono_time = msg.logMonoTime + + if msg.which() in ("can", 'sendcan'): + for can in getattr(msg, msg.which()): + if can.address in addrs or not len(addrs): + if msg.logMonoTime != prev_mono_time: + print() + prev_mono_time = msg.logMonoTime + print(f"{msg.which():>7}: rxaddr={can.address}, bus={str(can.src) + ',':<4} {round((msg.logMonoTime - start_mono_time) * 1e-6)} ms, " + + f"0x{can.dat.hex()}, {can.dat}, {len(can.dat)=}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='View back and forth ISO-TP communication between various ECUs given an address') + parser.add_argument('route', nargs='?', help='Route name, live if not specified') + parser.add_argument('--addrs', nargs='*', default=[], help='List of tx address to view (0x7e0 for engine)') + parser.add_argument('--rxoffset', default='') + args = parser.parse_args() + + addrs = [int(addr, base=16) if addr.startswith('0x') else int(addr) for addr in args.addrs] + rxoffset = int(args.rxoffset, base=16) if args.rxoffset else None + main(args.route, addrs, rxoffset) diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fingerprint_from_route.py b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fingerprint_from_route.py new file mode 100644 index 000000000..24d1fe9ff --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fingerprint_from_route.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 + +import sys +from iqpilot.tools.lib.logreader import LogReader, ReadMode + + +def get_fingerprint(lr): + # TODO: make this a nice tool for car ports. should also work with qlogs for FW + + fw = None + vin = None + msgs = {} + for msg in lr: + if msg.which() == 'carParams': + fw = msg.carParams.carFw + vin = msg.carParams.carVin + elif msg.which() == 'can': + for c in msg.can: + # read also msgs sent by EON on CAN bus 0x80 and filter out the + # addr with more than 11 bits + if c.src % 0x80 == 0 and c.address < 0x800 and c.address not in (0x7df, 0x7e0, 0x7e8): + msgs[c.address] = len(c.dat) + + # show CAN fingerprint + fingerprint = ', '.join(f"{v[0]}: {v[1]}" for v in sorted(msgs.items())) + print(f"\nfound {len(msgs)} messages. CAN fingerprint:\n") + print(fingerprint) + + # TODO: also print the fw fingerprint merged with the existing ones + # show FW fingerprint + if fw: + print("\nFW fingerprint:\n") + for f in fw: + print(f" (Ecu.{f.ecu}, {hex(f.address)}, {None if f.subAddress == 0 else f.subAddress}): [") + print(f" {f.fwVersion},") + print(" ],") + print() + print(f"VIN: {vin}") + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Usage: ./fingerprint_from_route.py ") + sys.exit(1) + + lr = LogReader(sys.argv[1], ReadMode.QLOG) + get_fingerprint(lr) diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fuzz_fw_fingerprint.py b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fuzz_fw_fingerprint.py new file mode 100644 index 000000000..9ad03b183 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fuzz_fw_fingerprint.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +import random +from collections import defaultdict + +from tqdm import tqdm + +from iqdbc.car.fw_versions import match_fw_to_car_fuzzy +from iqdbc.car.toyota.values import FW_VERSIONS as TOYOTA_FW_VERSIONS +from iqdbc.car.honda.values import FW_VERSIONS as HONDA_FW_VERSIONS +from iqdbc.car.hyundai.values import FW_VERSIONS as HYUNDAI_FW_VERSIONS +from iqdbc.car.volkswagen.values import FW_VERSIONS as VW_FW_VERSIONS + + +FWS = {} +FWS.update(TOYOTA_FW_VERSIONS) +FWS.update(HONDA_FW_VERSIONS) +FWS.update(HYUNDAI_FW_VERSIONS) +FWS.update(VW_FW_VERSIONS) + +if __name__ == "__main__": + total = 0 + match = 0 + wrong_match = 0 + confusions = defaultdict(set) + + for _ in tqdm(range(1000)): + for candidate, fws in FWS.items(): + fw_dict = {} + for (_, addr, subaddr), fw_list in fws.items(): + fw_dict[(addr, subaddr)] = [random.choice(fw_list)] + + matches = match_fw_to_car_fuzzy(fw_dict, log=False, exclude=candidate) + + total += 1 + if len(matches) == 1: + if list(matches)[0] == candidate: + match += 1 + else: + confusions[candidate] |= matches + wrong_match += 1 + + print() + for candidate, wrong_matches in sorted(confusions.items()): + print(candidate, wrong_matches) + + print() + print(f"Total fuzz cases: {total}") + print(f"Correct matches: {match}") + print(f"Wrong matches: {wrong_match}") diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fw_query_on_routes.py b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fw_query_on_routes.py new file mode 100644 index 000000000..b97c076de --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fw_query_on_routes.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 + +from collections import defaultdict +import argparse +import os +import traceback +from tqdm import tqdm +from iqdbc.car.car_helpers import interface_names +from iqdbc.car.fingerprints import MIGRATION +from iqdbc.car.fw_versions import VERSIONS, match_fw_to_car +from iqpilot.tools.lib.logreader import LogReader, ReadMode +from iqpilot.tools.lib.route import SegmentRange + + +NO_API = "NO_API" in os.environ +SUPPORTED_BRANDS = VERSIONS.keys() +SUPPORTED_CARS = [brand for brand in SUPPORTED_BRANDS for brand in interface_names[brand]] +UNKNOWN_BRAND = "unknown" + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Run FW fingerprint on Qlog of route or list of routes') + parser.add_argument('route', help='Route or file with list of routes') + parser.add_argument('--car', help='Force comparison fingerprint to known car') + args = parser.parse_args() + + if os.path.exists(args.route): + routes = list(open(args.route)) + else: + routes = [args.route] + + mismatches = defaultdict(list) + + not_fingerprinted = 0 + solved_by_fuzzy = 0 + + good_exact = 0 + wrong_fuzzy = 0 + good_fuzzy = 0 + + dongles = [] + for route in tqdm(routes): + sr = SegmentRange(route) + dongle_id = sr.dongle_id + + if dongle_id in dongles: + continue + + if sr.slice == '' and sr.selector is None: + route += '/0' + + lr = LogReader(route, default_mode=ReadMode.QLOG) + + try: + dongles.append(dongle_id) + + CP = None + for msg in lr: + if msg.which() == "pandaStates": + if msg.pandaStates[0].pandaType in ('unknown', 'whitePanda', 'greyPanda', 'pedal'): + print("wrong panda type") + break + + elif msg.which() == "carParams": + CP = msg.carParams + car_fw = [fw for fw in CP.carFw if not fw.logging] + if len(car_fw) == 0: + print("WARNING: no fw") + + live_fingerprint = CP.carFingerprint + live_fingerprint = MIGRATION.get(live_fingerprint, live_fingerprint) + + if args.car is not None: + live_fingerprint = args.car + + if live_fingerprint not in SUPPORTED_CARS: + print("not in supported cars") + break + + _, exact_matches = match_fw_to_car(car_fw, CP.carVin, allow_exact=True, allow_fuzzy=False) + _, fuzzy_matches = match_fw_to_car(car_fw, CP.carVin, allow_exact=False, allow_fuzzy=True) + + if (len(exact_matches) == 1) and (list(exact_matches)[0] == live_fingerprint): + good_exact += 1 + print(f"Correct! Live: {live_fingerprint} - Fuzzy: {fuzzy_matches}") + + # Check if fuzzy match was correct + if len(fuzzy_matches) == 1: + if list(fuzzy_matches)[0] != live_fingerprint: + wrong_fuzzy += 1 + print("Fuzzy match wrong! Fuzzy:", fuzzy_matches, "Live:", live_fingerprint) + else: + good_fuzzy += 1 + break + + print("Old style:", live_fingerprint, "Vin", CP.carVin) + print("New style (exact):", exact_matches) + print("New style (fuzzy):", fuzzy_matches) + + padding = max([len(fw.brand or UNKNOWN_BRAND) for fw in car_fw] + [0]) + for version in sorted(car_fw, key=lambda fw: fw.brand): + subaddr = None if version.subAddress == 0 else hex(version.subAddress) + print(f" Brand: {version.brand or UNKNOWN_BRAND:{padding}}, bus: {version.bus} - " + + f"(Ecu.{version.ecu}, {hex(version.address)}, {subaddr}): [{version.fwVersion}],") + + print("Mismatches") + found = False + for brand in SUPPORTED_BRANDS: + car_fws = VERSIONS[brand] + if live_fingerprint in car_fws: + found = True + expected = car_fws[live_fingerprint] + for (_, expected_addr, expected_sub_addr), v in expected.items(): + for version in car_fw: + if version.brand != brand and len(version.brand): + continue + sub_addr = None if version.subAddress == 0 else version.subAddress + addr = version.address + + if (addr, sub_addr) == (expected_addr, expected_sub_addr): + if version.fwVersion not in v: + print(f"({hex(addr)}, {'None' if sub_addr is None else hex(sub_addr)}) - {version.fwVersion}") + + # Add to global list of mismatches + mismatch = (addr, sub_addr, version.fwVersion) + if mismatch not in mismatches[live_fingerprint]: + mismatches[live_fingerprint].append(mismatch) + + # No FW versions for this car yet, add them all to mismatch list + if not found: + for version in car_fw: + sub_addr = None if version.subAddress == 0 else version.subAddress + addr = version.address + mismatch = (addr, sub_addr, version.fwVersion) + if mismatch not in mismatches[live_fingerprint]: + mismatches[live_fingerprint].append(mismatch) + + print() + not_fingerprinted += 1 + + if len(fuzzy_matches) == 1: + if list(fuzzy_matches)[0] == live_fingerprint: + solved_by_fuzzy += 1 + else: + wrong_fuzzy += 1 + print("Fuzzy match wrong! Fuzzy:", fuzzy_matches, "Live:", live_fingerprint) + + break + + if CP is None: + print("no CarParams in logs") + except Exception: + traceback.print_exc() + except KeyboardInterrupt: + break + + print() + # Print FW versions that need to be added separated out by car and address + for car, m in sorted(mismatches.items()): + print(car) + addrs = defaultdict(list) + for (addr, sub_addr, version) in m: + addrs[(addr, sub_addr)].append(version) + + for (addr, sub_addr), versions in addrs.items(): + print(f" ({hex(addr)}, {'None' if sub_addr is None else hex(sub_addr)}): [") + for v in versions: + print(f" {v},") + print(" ]") + print() + + print() + print(f"Number of dongle ids checked: {len(dongles)}") + print(f"Fingerprinted: {good_exact}") + print(f"Not fingerprinted: {not_fingerprinted}") + print(f" of which had a fuzzy match: {solved_by_fuzzy}") + + print() + print(f"Correct fuzzy matches: {good_fuzzy}") + print(f"Wrong fuzzy matches: {wrong_fuzzy}") + print() diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fw_versions.py b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fw_versions.py new file mode 100644 index 000000000..e81f7865e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/fw_versions.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +import time +import argparse +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car +from iqdbc.car.carlog import carlog +from iqdbc.car.fw_versions import get_fw_versions, match_fw_to_car +from iqdbc.car.vin import get_vin +from iqpilot.common.params import Params +from iqpilot.selfdrive.car.card import can_comm_callbacks, obd_callback +from typing import Any + +Ecu = car.CarParams.Ecu + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Get firmware version of ECUs') + parser.add_argument('--scan', action='store_true') + parser.add_argument('--debug', action='store_true') + parser.add_argument('--brand', help='Only query addresses/with requests for this brand') + args = parser.parse_args() + + if args.debug: + carlog.setLevel('DEBUG') + + logcan = messaging.sub_sock('can') + pandaStates_sock = messaging.sub_sock('pandaStates') + sendcan = messaging.pub_sock('sendcan') + can_callbacks = can_comm_callbacks(logcan, sendcan) + + # Set up params for pandad + params = Params() + params.remove("FirmwareQueryDone") + params.put_bool("IsOnroad", False) + time.sleep(0.2) # thread is 10 Hz + params.put_bool("IsOnroad", True) + set_obd_multiplexing = obd_callback(params) + + extra: Any = None + if args.scan: + extra = {} + # Honda + for i in range(256): + extra[(Ecu.unknown, 0x18da00f1 + (i << 8), None)] = [] + extra[(Ecu.unknown, 0x700 + i, None)] = [] + extra[(Ecu.unknown, 0x750, i)] = [] + extra = {"any": {"debug": extra}} + + num_pandas = len(messaging.recv_one_retry(pandaStates_sock).pandaStates) + + t = time.monotonic() + print("Getting vin...") + set_obd_multiplexing(True) + vin_rx_addr, vin_rx_bus, vin = get_vin(*can_callbacks, (0, 1)) + print(f'RX: {hex(vin_rx_addr)}, BUS: {vin_rx_bus}, VIN: {vin}') + print(f"Getting VIN took {time.monotonic() - t:.3f} s") + print() + + t = time.monotonic() + fw_vers = get_fw_versions(*can_callbacks, set_obd_multiplexing, query_brand=args.brand, extra=extra, num_pandas=num_pandas, progress=True) + _, candidates = match_fw_to_car(fw_vers, vin) + + print() + print("Found FW versions") + print("{") + padding = max([len(fw.brand) for fw in fw_vers] or [0]) + for version in fw_vers: + subaddr = None if version.subAddress == 0 else hex(version.subAddress) + print(f" Brand: {version.brand:{padding}}, bus: {version.bus}, OBD: {version.obdMultiplexing} - " + + f"(Ecu.{version.ecu}, {hex(version.address)}, {subaddr}): [{version.fwVersion!r}]") + print("}") + + print() + print("Possible matches:", candidates) + print(f"Getting fw took {time.monotonic() - t:.3f} s") diff --git a/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/get_fingerprint.py b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/get_fingerprint.py new file mode 100644 index 000000000..3b965c55f --- /dev/null +++ b/artifacts/package_runtime/iqdbc/lvbs/tools/fw_fingerprint/get_fingerprint.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +# simple script to get a vehicle fingerprint. + +# Instructions: +# - connect to a Panda +# - run selfdrive/pandad/pandad +# - launching this script +# Note: it's very important that the car is in stock mode, in order to collect a complete fingerprint +# - since some messages are published at low frequency, keep this script running for at least 30s, +# until all messages are received at least once + +import iqpilot.cereal.messaging as messaging + +logcan = messaging.sub_sock('can') +msgs = {} +while True: + lc = messaging.recv_sock(logcan, True) + if lc is None: + continue + + for c in lc.can: + # read also msgs sent by EON on CAN bus 0x80 and filter out the + # addr with more than 11 bits + if c.src % 0x80 == 0 and c.address < 0x800 and c.address not in (0x7df, 0x7e0, 0x7e8): + msgs[c.address] = len(c.dat) + + fingerprint = ', '.join(f"{v[0]}: {v[1]}" for v in sorted(msgs.items())) + + print(f"number of messages {len(msgs)}:") + print(f"fingerprint {fingerprint}") diff --git a/artifacts/package_runtime/iqdbc/safety/__init__.py b/artifacts/package_runtime/iqdbc/safety/__init__.py new file mode 100644 index 000000000..3285397c3 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/__init__.py @@ -0,0 +1,15 @@ +# constants from can.h +DLC_TO_LEN = [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64] +LEN_TO_DLC = {length: dlc for (dlc, length) in enumerate(DLC_TO_LEN)} + + +class ALTERNATIVE_EXPERIENCE: + DEFAULT = 0 + DISABLE_STOCK_AEB = 2 + RAISE_LONGITUDINAL_LIMITS_TO_ISO_MAX = 8 + ALLOW_AEB = 16 + + # iqpilot + ENABLE_AOL = 1024 + AOL_DISENGAGE_LATERAL_ON_BRAKE = 2048 + AOL_PAUSE_LATERAL_ON_BRAKE = 4096 diff --git a/artifacts/package_runtime/iqdbc/safety/tests/__init__.py b/artifacts/package_runtime/iqdbc/safety/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/safety/tests/aol_common.py b/artifacts/package_runtime/iqdbc/safety/tests/aol_common.py new file mode 100644 index 000000000..f0435f310 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/aol_common.py @@ -0,0 +1,372 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from parameterized import parameterized +import abc +import unittest + +from iqdbc.safety.tests.libsafety import libsafety_py + + +class AolSafetyTestBase(unittest.TestCase): + safety: libsafety_py.LibSafety + + @abc.abstractmethod + def _lkas_button_msg(self, enabled): + raise NotImplementedError + + @abc.abstractmethod + def _acc_state_msg(self, enabled): + raise NotImplementedError + + def tearDown(self): + self.safety = libsafety_py.libsafety + self.safety.set_aol_button_press(-1) + self.safety.set_controls_allowed_lat(False) + self.safety.set_controls_requested_lat(False) + self.safety.set_acc_main_on(False) + self.safety.set_aol_params(False, False, False) + self.safety.set_heartbeat_engaged_aol(True) + + def test_heartbeat_engaged_aol_check(self): + """Test AOL heartbeat engaged check behavior""" + for boolean in (True, False): + # If boolean is True, the heartbeat is engaged and should remain engaged, otherwise it should disengage. + with self.subTest(heartbeat_engaged=boolean, should_remain_engaged=boolean): + # Setup initial conditions + self.safety.set_aol_params(True, False, False) # Enable AOL + self.safety.set_controls_allowed_lat(True) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + # Set heartbeat engaged state based on test case + self.safety.set_heartbeat_engaged_aol(boolean) + + # Call the heartbeat check function multiple times + # We know from the implementation that it takes 3 mismatches to disengage + for _ in range(4): # More than 3 times to ensure we pass the threshold + self.safety.aol_heartbeat_engaged_check() + + # Verify engagement state matches expectation + self.assertEqual(self.safety.get_controls_allowed_lat(), boolean, + f"Expected controls_allowed_lat to be [{boolean}] but got [{self.safety.get_controls_allowed_lat()}]") + + def test_enable_control_allowed_with_aol_button(self): + """Toggle AOL with AOL button""" + try: + self._lkas_button_msg(False) + except NotImplementedError as err: + raise unittest.SkipTest("Skipping test because AOL button is not supported") from err + + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + self.safety.set_aol_params(enable_aol, False, False) + self.assertEqual(enable_aol, self.safety.get_enable_aol()) + + self._rx(self._lkas_button_msg(True)) + self._rx(self._lkas_button_msg(False)) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + def test_enable_control_allowed_with_manual_acc_main_on_state(self): + try: + self._acc_state_msg(False) + except NotImplementedError as err: + raise unittest.SkipTest("Skipping test because _acc_state_msg is not implemented for this car") from err + + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + self.safety.set_aol_params(enable_aol, False, False) + self._rx(self._acc_state_msg(True)) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + def test_enable_control_allowed_with_manual_aol_button_state(self): + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + for aol_button_press in (-1, 0, 1): + with self.subTest("aol_button_press", button_state=aol_button_press): + self.safety.set_aol_params(enable_aol, False, False) + + self.safety.set_aol_button_press(aol_button_press) + self._rx(self._speed_msg(0)) + self.assertEqual(enable_aol and aol_button_press == 1, self.safety.get_controls_allowed_lat()) + + def test_enable_control_allowed_from_acc_main_on(self): + """Test that lateral controls are allowed when ACC main is enabled and disabled when ACC main is disabled""" + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + for acc_main_on in (True, False): + with self.subTest("initial_acc_main", initial_acc_main=acc_main_on): + self.safety.set_aol_params(enable_aol, False, False) + + # Set initial state + self.safety.set_acc_main_on(acc_main_on) + self._rx(self._speed_msg(0)) + expected_lat = enable_aol and acc_main_on + self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(), + f"Expected lat: [{expected_lat}] when acc_main_on goes to [{acc_main_on}]") + + # Test transition to opposite state + self.safety.set_acc_main_on(not acc_main_on) + self._rx(self._speed_msg(0)) + expected_lat = enable_aol and not acc_main_on + self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(), + f"Expected lat: [{expected_lat}] when acc_main_on goes from [{acc_main_on}] to [{not acc_main_on}]") + + # Test transition back to initial state + self.safety.set_acc_main_on(acc_main_on) + self._rx(self._speed_msg(0)) + expected_lat = enable_aol and acc_main_on + self.assertEqual(expected_lat, self.safety.get_controls_allowed_lat(), + f"Expected lat: [{expected_lat}] when acc_main_on goes from [{not acc_main_on}] to [{acc_main_on}]") + + def test_aol_with_acc_main_on(self): + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + self.safety.set_aol_params(enable_aol, False, False) + + self.safety.set_acc_main_on(True) + self._rx(self._speed_msg(0)) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + self.safety.set_acc_main_on(False) + self._rx(self._speed_msg(0)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + def test_pause_lateral_on_brake_setup(self): + for enable_aol in (True, False): + with self.subTest("enable_aol", enable_aol=enable_aol): + for pause_lateral_on_brake in (True, False): + with self.subTest("pause_lateral_on_brake", pause_lateral_on_brake=pause_lateral_on_brake): + self.safety.set_aol_params(enable_aol, False, pause_lateral_on_brake) + self.assertEqual(enable_aol and pause_lateral_on_brake, self.safety.get_pause_lateral_on_brake()) + + def test_pause_lateral_on_brake(self): + self.safety.set_aol_params(True, False, True) + + self._rx(self._user_brake_msg(False)) + self.safety.set_controls_requested_lat(True) + self.safety.set_controls_allowed_lat(True) + + self._rx(self._user_brake_msg(True)) + # Test we pause lateral + self.assertFalse(self.safety.get_controls_allowed_lat()) + # Make sure we can re-gain lateral actuation + self._rx(self._user_brake_msg(False)) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + def test_no_pause_lateral_on_brake(self): + self.safety.set_aol_params(True, False, False) + + self._rx(self._user_brake_msg(False)) + self.safety.set_controls_requested_lat(True) + self.safety.set_controls_allowed_lat(True) + + self._rx(self._user_brake_msg(True)) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + @parameterized.expand(["aol_button", "acc_main_on"]) + def test_engage_with_brake_pressed(self, engage_method): + if engage_method == "aol_button": + try: + self._lkas_button_msg(False) + except NotImplementedError as err: + raise unittest.SkipTest("Skipping test because AOL button is not supported") from err + elif engage_method == "acc_main_on": + try: + self._acc_state_msg(False) + except NotImplementedError as err: + raise unittest.SkipTest("Skipping test because ACC main is not supported") from err + + for enable_aol in (True, False): + with self.subTest("enable_aol", enable_aol=enable_aol): + for pause_lateral_on_brake in (True, False): + with self.subTest("pause_lateral_on_brake", pause_lateral_on_brake=pause_lateral_on_brake): + with self.subTest(engage_method): + self.safety.set_aol_params(enable_aol, False, pause_lateral_on_brake) + + # Brake press rising edge + self._rx(self._user_brake_msg(True)) + + if engage_method == "aol_button": + self._rx(self._lkas_button_msg(True)) + elif engage_method == "acc_main_on": + self.safety.set_acc_main_on(True) + self.assertTrue(self.safety.get_acc_main_on()) + else: + raise ValueError(f"Invalid engage_method: {engage_method}") + self._rx(self._speed_msg(0)) + + self.assertEqual(enable_aol and not pause_lateral_on_brake, self.safety.get_controls_allowed_lat()) + + # Continuous braking after the first frame of brake press rising edge + for _ in range(400): + self.assertEqual(enable_aol and not pause_lateral_on_brake, self.safety.get_controls_allowed_lat()) + + def test_pause_lateral_on_brake_with_pressed_and_released(self): + for enable_aol in (True, False): + with self.subTest("enable_aol", enable_aol=enable_aol): + for pause_lateral_on_brake in (True, False): + with self.subTest("pause_lateral_on_brake", pause_lateral_on_brake=pause_lateral_on_brake): + self.safety.set_aol_params(enable_aol, False, pause_lateral_on_brake) + + # Set controls_allowed_lat rising edge + self.safety.set_controls_requested_lat(True) + self._rx(self._speed_msg(0)) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + # User brake press, validate controls_allowed_lat is false + self._rx(self._user_brake_msg(True)) + self.assertEqual(enable_aol and not pause_lateral_on_brake, self.safety.get_controls_allowed_lat()) + + # User brake release, validate controls_allowed_lat is true + self._rx(self._user_brake_msg(False)) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + def test_pause_lateral_on_brake_persistent_control_allowed_off(self): + self.safety.set_aol_params(True, False, True) + + self.safety.set_controls_requested_lat(True) + + # Vehicle moving, validate controls_allowed_lat is true + for _ in range(10): + self._rx(self._speed_msg(10)) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + # User braked, vehicle slowed down in 10 frames, then stopped for 10 frames + # Validate controls_allowed_lat is false + self._rx(self._user_brake_msg(True)) + for _ in range(10): + self._rx(self._speed_msg(5)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + for _ in range(10): + self._rx(self._speed_msg(0)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + def test_enable_lateral_control_with_controls_allowed_rising_edge(self): + for enable_aol in (True, False): + with self.subTest("enable_aol", enable_aol=enable_aol): + self.safety.set_aol_params(enable_aol, False, False) + + self.safety.set_controls_allowed(False) + self._rx(self._speed_msg(0)) + self.safety.set_controls_allowed(True) + self._rx(self._speed_msg(0)) + self.assertTrue(self.safety.get_controls_allowed()) + + def test_enable_control_allowed_with_aol_button_and_disable_with_main_cruise(self): + """Tests main cruise and AOL button state transitions. + + Sequence: + 1. Main cruise off -> on + 2. AOL button engage + 3. Main cruise off + + """ + try: + self._lkas_button_msg(False) + except NotImplementedError as err: + raise unittest.SkipTest("Skipping test because AOL button is not supported") from err + + try: + self._acc_state_msg(False) + except NotImplementedError as err: + raise unittest.SkipTest("Skipping test because _acc_state_msg is not implemented for this car") from err + + for enable_aol in (True, False): + with self.subTest("enable_aol", enable_aol=enable_aol): + self.safety.set_aol_params(enable_aol, False, False) + + self._rx(self._lkas_button_msg(True)) + self._rx(self._lkas_button_msg(False)) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + self._rx(self._acc_state_msg(True)) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + self._rx(self._acc_state_msg(False)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + def test_brake_disengage_with_control_request(self): + """Tests behavior when controls are requested while brake is engaged + + Sequence: + 1. Enable AOL with pause lateral on brake + 2. Brake to pause lateral control + 3. Set control request while braking + 4. Release brake + 5. Verify controls become allowed + """ + self.safety.set_aol_params(True, False, True) # enable AOL with pause lateral on brake + + # Initial state + self.safety.set_controls_allowed_lat(True) + self._rx(self._speed_msg(0)) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + # Brake press disengages lateral + self._rx(self._user_brake_msg(True)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + # Request controls while braking + self.safety.set_controls_requested_lat(True) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + # Release brake - should enable since controls were requested + self._rx(self._user_brake_msg(False)) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + def test_brake_disengage_with_acc_main_off(self): + """Tests behavior when ACC main is turned off while brake is engaged + + Sequence: + 1. Enable AOL with pause lateral on brake + 2. Brake to pause lateral control + 3. Turn ACC main off while braking + 4. Release brake + 5. Verify controls remain disengaged + """ + self.safety.set_aol_params(True, False, True) # enable AOL with pause lateral on brake + + # Initial state - enable with ACC main + self.safety.set_acc_main_on(True) + self._rx(self._speed_msg(0)) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + # Brake press disengages lateral + self._rx(self._user_brake_msg(True)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + # Turn ACC main off while braking + self.safety.set_acc_main_on(False) + self._rx(self._speed_msg(0)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + # Release brake - should remain disabled since ACC main is off + self._rx(self._user_brake_msg(False)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + def test_steering_disengage_with_control_request(self): + self.safety.set_aol_params(True, False, False) + + self.safety.set_controls_allowed_lat(True) + self._rx(self._speed_msg(0)) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + self.safety.set_steering_disengage(True) + self._rx(self._speed_msg(0)) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + def test_disengage_on_brake(self): + for disengage_on_brake in (True, False): + self.safety.set_aol_params(True, disengage_on_brake, False) + + self.safety.set_controls_allowed_lat(True) + self._rx(self._speed_msg(0)) + self.assertTrue(self.safety.get_controls_allowed_lat()) + + self._rx(self._user_brake_msg(True)) + self.assertEqual(not disengage_on_brake, self.safety.get_controls_allowed_lat()) + + self._rx(self._user_brake_msg(False)) + self.assertEqual(not disengage_on_brake, self.safety.get_controls_allowed_lat()) + + # TODO-IQ: controls_allowed and controls_allowed_lat check for steering safety tests diff --git a/artifacts/package_runtime/iqdbc/safety/tests/common.py b/artifacts/package_runtime/iqdbc/safety/tests/common.py new file mode 100644 index 000000000..cffc6de42 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/common.py @@ -0,0 +1,1185 @@ +import os +import abc +import inspect +import math +import sys +import unittest +import importlib +import numpy as np +from collections.abc import Callable +from parameterized import parameterized_class + +from iqdbc.can import CANPacker +from iqdbc.safety import ALTERNATIVE_EXPERIENCE +from iqdbc.safety.tests.libsafety import libsafety_py + +from iqdbc.safety.tests.aol_common import AolSafetyTestBase + +MAX_WRONG_COUNTERS = 5 +MAX_SAMPLE_VALS = 6 +VEHICLE_SPEED_FACTOR = 1000 +RT_INTERVAL = 250000 # 250ms + +# Max allowed delta between car speeds +MAX_SPEED_DELTA = 2.0 # m/s + +MessageFunction = Callable[[float], libsafety_py.CANPacket] + + +def parameterized_safety_class(attrs): + def decorate(base_class): + module = vars(sys.modules[base_class.__module__]) + existing_names = set(module) + result = parameterized_class(attrs)(base_class) + result.__test__ = False + for name in set(module) - existing_names: + generated_class = module[name] + if isinstance(generated_class, type) and issubclass(generated_class, result): + generated_class.__test__ = True + return result + return decorate + + +def sign_of(a): + return 1 if a > 0 else -1 + + +def away_round(x): + # non-banker's/away from zero rounding, C++ CANParser uses this style + return math.floor(x + 0.5) if x >= 0 else math.ceil(x - 0.5) + + +def round_speed(v): + return round(v * VEHICLE_SPEED_FACTOR) / VEHICLE_SPEED_FACTOR + + +def make_msg(bus, addr, length=8, dat=None): + if dat is None: + dat = b'\x00' * length + return libsafety_py.make_CANPacket(addr, bus, dat) + + +class CANPackerSafety(CANPacker): + def make_can_msg_safety(self, name_or_addr, bus, values, fix_checksum=None): + msg = self.make_can_msg(name_or_addr, bus, values) + if fix_checksum is not None: + msg = fix_checksum(msg) + addr, dat, bus = msg + return libsafety_py.make_CANPacket(addr, bus, dat) + + +def add_regen_tests(cls): + """Dynamically adds regen tests for all user brake tests.""" + + # only rx/user brake tests, not brake command + found_tests = [func for func in dir(cls) if func.startswith("test_") and "user_brake" in func] + assert len(found_tests) >= 3, "Failed to detect known brake tests" + + for test in found_tests: + def _make_regen_test(brake_func): + def _regen_test(self): + # only for safety modes with a regen message + if self._user_regen_msg(0) is None: + raise unittest.SkipTest("Safety mode implements no _user_regen_msg") + + getattr(self, brake_func)(self._user_regen_msg, self.safety.get_regen_braking_prev) + return _regen_test + + setattr(cls, test.replace("brake", "regen"), _make_regen_test(test)) + + return cls + + +class SafetyTestBase(unittest.TestCase): + safety: libsafety_py.LibSafety | None + __test__ = False + + def __init_subclass__(cls, **kwargs): + super().__init_subclass__(**kwargs) + cls.__test__ = cls.__name__.startswith("Test") and not cls.__name__.endswith("Base") and not inspect.isabstract(cls) + + @classmethod + def setUpClass(cls): + if cls.__name__ == "SafetyTestBase": + cls.safety = None + raise unittest.SkipTest + + def _reset_safety_hooks(self): + self.safety.set_safety_hooks(self.safety.get_current_safety_mode(), + self.safety.get_current_safety_param()) + + def _rx(self, msg): + return self.safety.safety_rx_hook(msg) + + def _tx(self, msg): + return self.safety.safety_tx_hook(msg) + + def _generic_limit_safety_check(self, msg_function: MessageFunction, min_allowed_value: float, max_allowed_value: float, + min_possible_value: float, max_possible_value: float, test_delta: float = 1, inactive_value: float = 0, + msg_allowed = True, additional_setup: Callable[[float], None] | None = None): + """ + Enforces that a signal within a message is only allowed to be sent within a specific range, min_allowed_value -> max_allowed_value. + Tests the range of min_possible_value -> max_possible_value with a delta of test_delta. + Message is also only allowed to be sent when controls_allowed is true, unless the value is equal to inactive_value. + Message is never allowed if msg_allowed is false, for example when stock longitudinal is enabled and you are sending acceleration requests. + additional_setup is used for extra setup before each _tx, ex: for setting the previous torque for rate limits + """ + + # Ensure that we at least test the allowed_value range + self.assertGreater(max_possible_value, max_allowed_value) + self.assertLessEqual(min_possible_value, min_allowed_value) + + for controls_allowed in [False, True]: + # enforce we don't skip over 0 or inactive + for v in np.concatenate((np.arange(min_possible_value, max_possible_value, test_delta), np.array([0, inactive_value]))): + v = round(v, 2) # floats might not hit exact boundary conditions without rounding + self.safety.set_controls_allowed(controls_allowed) + if additional_setup is not None: + additional_setup(v) + should_tx = controls_allowed and min_allowed_value <= v <= max_allowed_value + should_tx = (should_tx or v == inactive_value) and msg_allowed + self.assertEqual(self._tx(msg_function(v)), should_tx, (controls_allowed, should_tx, v)) + + def _common_measurement_test(self, msg_func: Callable, min_value: float, max_value: float, factor: float, + meas_min_func: Callable[[], int], meas_max_func: Callable[[], int]): + """Tests accurate measurement parsing, and that the struct is reset on safety mode init""" + for val in np.arange(min_value, max_value, 0.5): + for i in range(MAX_SAMPLE_VALS): + self.assertTrue(self._rx(msg_func(val + i * 0.1))) + + # assert close by one decimal place + self.assertAlmostEqual(meas_min_func() / factor, val, delta=0.1) + self.assertAlmostEqual(meas_max_func() / factor - 0.5, val, delta=0.1) + + # ensure sample_t is reset on safety init + self._reset_safety_hooks() + self.assertEqual(meas_min_func(), 0) + self.assertEqual(meas_max_func(), 0) + + +class LongitudinalAccelSafetyTest(SafetyTestBase, abc.ABC): + + LONGITUDINAL = True + MAX_ACCEL: float = 2.0 + MIN_ACCEL: float = -3.5 + INACTIVE_ACCEL: float = 0.0 + + @classmethod + def setUpClass(cls): + if cls.__name__ == "LongitudinalAccelSafetyTest": + cls.safety = None + raise unittest.SkipTest + + @abc.abstractmethod + def _accel_msg(self, accel: float): + pass + + def test_accel_limits_correct(self): + self.assertGreater(self.MAX_ACCEL, 0) + self.assertLess(self.MIN_ACCEL, 0) + + def test_accel_actuation_limits(self): + limits = ((self.MIN_ACCEL, self.MAX_ACCEL, ALTERNATIVE_EXPERIENCE.DEFAULT), + (self.MIN_ACCEL, self.MAX_ACCEL, ALTERNATIVE_EXPERIENCE.RAISE_LONGITUDINAL_LIMITS_TO_ISO_MAX)) + + for min_accel, max_accel, alternative_experience in limits: + # enforce we don't skip over 0 or inactive accel + for accel in np.concatenate((np.arange(min_accel - 1, max_accel + 1, 0.05), [0, self.INACTIVE_ACCEL])): + accel = round(accel, 2) # floats might not hit exact boundary conditions without rounding + for controls_allowed in [True, False]: + for gas_pressed in [True, False]: + self.safety.set_controls_allowed(controls_allowed) + self.safety.set_gas_pressed_prev(gas_pressed) + self.safety.set_alternative_experience(alternative_experience) + if self.LONGITUDINAL: + gas_allowed = controls_allowed + brake_allowed = controls_allowed and not gas_pressed + longitudinal_allowed = gas_allowed if accel >= 0 else brake_allowed + should_tx = longitudinal_allowed and min_accel <= accel <= max_accel + should_tx = should_tx or accel == self.INACTIVE_ACCEL + else: + should_tx = False + self.assertEqual(should_tx, self._tx(self._accel_msg(accel))) + + +class LongitudinalGasBrakeSafetyTest(SafetyTestBase, abc.ABC): + + MIN_BRAKE: int = 0 + MAX_BRAKE: int | None = None + MAX_POSSIBLE_BRAKE: int | None = None + + MIN_GAS: int = 0 + MAX_GAS: int | None = None + INACTIVE_GAS = 0 + MIN_POSSIBLE_GAS: int = 0 + MAX_POSSIBLE_GAS: int | None = None + + def test_gas_brake_limits_correct(self): + self.assertIsNotNone(self.MAX_POSSIBLE_BRAKE) + self.assertIsNotNone(self.MAX_POSSIBLE_GAS) + + assert self.MAX_BRAKE is not None and self.MAX_GAS is not None + self.assertGreater(self.MAX_BRAKE, self.MIN_BRAKE) + self.assertGreater(self.MAX_GAS, self.MIN_GAS) + + @abc.abstractmethod + def _send_gas_msg(self, gas: int): + pass + + @abc.abstractmethod + def _send_brake_msg(self, brake: int): + pass + + def test_brake_safety_check(self): + self._generic_limit_safety_check(self._send_brake_msg, self.MIN_BRAKE, self.MAX_BRAKE, 0, self.MAX_POSSIBLE_BRAKE, 1) + + def test_gas_safety_check(self): + self._generic_limit_safety_check(self._send_gas_msg, self.MIN_GAS, self.MAX_GAS, self.MIN_POSSIBLE_GAS, self.MAX_POSSIBLE_GAS, 1, self.INACTIVE_GAS) + + +class TorqueSteeringSafetyTestBase(SafetyTestBase, abc.ABC): + + MAX_RATE_UP = 0 + MAX_RATE_DOWN = 0 + MAX_TORQUE_LOOKUP: tuple[list[float], list[int]] = ([0], [0]) + DYNAMIC_MAX_TORQUE = False + MAX_RT_DELTA = 0 + + NO_STEER_REQ_BIT = False + + @classmethod + def setUpClass(cls): + if cls.__name__ == "TorqueSteeringSafetyTestBase": + cls.safety = None + raise unittest.SkipTest + + @property + def MAX_TORQUE(self): + return max(self.MAX_TORQUE_LOOKUP[1]) + + @property + def _torque_speed_range(self): + if not self.DYNAMIC_MAX_TORQUE: + return [0] + else: + # test with more precision inside breakpoint range + min_speed = min(self.MAX_TORQUE_LOOKUP[0]) + max_speed = max(self.MAX_TORQUE_LOOKUP[0]) + return np.concatenate([np.arange(0, min_speed, 5), np.arange(min_speed, max_speed, 0.5), np.arange(max_speed, 40, 5)]) + + def _get_max_torque(self, speed): + # matches safety fudge + torque = int(np.interp(speed - 1, self.MAX_TORQUE_LOOKUP[0], self.MAX_TORQUE_LOOKUP[1]) + 1) + return min(torque, self.MAX_TORQUE) + + @abc.abstractmethod + def _torque_cmd_msg(self, torque, steer_req=1): + pass + + @abc.abstractmethod + def _speed_msg(self, speed): + pass + + def _reset_speed_measurement(self, speed): + for _ in range(MAX_SAMPLE_VALS): + self._rx(self._speed_msg(speed)) + + def _set_prev_torque(self, t): + self.safety.set_desired_torque_last(t) + self.safety.set_rt_torque_last(t) + + def test_steer_safety_check(self): + for speed in self._torque_speed_range: + self._reset_speed_measurement(speed) + max_torque = self._get_max_torque(speed) + for enabled in [0, 1]: + for t in range(int(-max_torque * 1.5), int(max_torque * 1.5)): + self.safety.set_controls_allowed(enabled) + self._set_prev_torque(t) + if abs(t) > max_torque or (not enabled and abs(t) > 0): + self.assertFalse(self._tx(self._torque_cmd_msg(t))) + else: + self.assertTrue(self._tx(self._torque_cmd_msg(t))) + + def test_non_realtime_limit_up(self): + self.safety.set_controls_allowed(True) + + self._set_prev_torque(0) + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_RATE_UP))) + self._set_prev_torque(0) + self.assertTrue(self._tx(self._torque_cmd_msg(-self.MAX_RATE_UP))) + + self._set_prev_torque(0) + self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_RATE_UP + 1))) + self.safety.set_controls_allowed(True) + self._set_prev_torque(0) + self.assertFalse(self._tx(self._torque_cmd_msg(-self.MAX_RATE_UP - 1))) + + def test_steer_req_bit(self): + """Asserts all torque safety modes check the steering request bit""" + if self.NO_STEER_REQ_BIT: + self.safety.set_controls_allowed(True) + self._set_prev_torque(0) + self.assertTrue(self._tx(self._torque_cmd_msg(0, 0))) + self._set_prev_torque(0) + self.assertTrue(self._tx(self._torque_cmd_msg(0, 1))) + return + + self.safety.set_controls_allowed(True) + self._set_prev_torque(self.MAX_TORQUE) + + # Send torque successfully, then only drop the request bit and ensure it stays blocked + for _ in range(10): + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, 1))) + + self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, 0))) + for _ in range(10): + self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, 1))) + + +class SteerRequestCutSafetyTest(TorqueSteeringSafetyTestBase, abc.ABC): + + @classmethod + def setUpClass(cls): + if cls.__name__ == "SteerRequestCutSafetyTest": + cls.safety = None + raise unittest.SkipTest + + # Safety around steering request bit mismatch tolerance + MIN_VALID_STEERING_FRAMES: int + MAX_INVALID_STEERING_FRAMES: int + STEER_STEP: int = 1 + + @property + def MIN_VALID_STEERING_RT_INTERVAL(self): + # a ~10% buffer + return int((self.MIN_VALID_STEERING_FRAMES + 1) * self.STEER_STEP * 10000 * 0.9) + + def test_steer_req_bit_frames(self): + """ + Certain safety modes implement some tolerance on their steer request bits matching the + requested torque to avoid a steering fault or lockout and maintain torque. This tests: + - We can't cut torque for more than one frame + - We can't cut torque until at least the minimum number of matching steer_req messages + - We can always recover from violations if steer_req=1 + """ + + for min_valid_steer_frames in range(self.MIN_VALID_STEERING_FRAMES * 2): + # Reset match count and rt timer to allow cut (valid_steer_req_count, ts_steer_req_mismatch_last) + self.safety.init_tests() + self.safety.set_timer(self.MIN_VALID_STEERING_RT_INTERVAL) + + # Allow torque cut + self.safety.set_controls_allowed(True) + self._set_prev_torque(self.MAX_TORQUE) + for _ in range(min_valid_steer_frames): + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) + + # should tx if we've sent enough valid frames, and we're not cutting torque for too many frames consecutively + should_tx = min_valid_steer_frames >= self.MIN_VALID_STEERING_FRAMES + for idx in range(self.MAX_INVALID_STEERING_FRAMES * 2): + tx = self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0)) + self.assertEqual(should_tx and idx < self.MAX_INVALID_STEERING_FRAMES, tx) + + # Keep blocking after one steer_req mismatch + for _ in range(100): + self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) + + # Make sure we can recover + self.assertTrue(self._tx(self._torque_cmd_msg(0, steer_req=1))) + self._set_prev_torque(self.MAX_TORQUE) + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) + + def test_steer_req_bit_multi_invalid(self): + """ + For safety modes allowing multiple consecutive invalid frames, this ensures that once a valid frame + is sent after an invalid frame (even without sending the max number of allowed invalid frames), + all counters are reset. + """ + for max_invalid_steer_frames in range(1, self.MAX_INVALID_STEERING_FRAMES * 2): + self.safety.init_tests() + self.safety.set_timer(self.MIN_VALID_STEERING_RT_INTERVAL) + + # Allow torque cut + self.safety.set_controls_allowed(True) + self._set_prev_torque(self.MAX_TORQUE) + for _ in range(self.MIN_VALID_STEERING_FRAMES): + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) + + # Send partial amount of allowed invalid frames + for idx in range(max_invalid_steer_frames): + should_tx = idx < self.MAX_INVALID_STEERING_FRAMES + self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) + + # Send one valid frame, and subsequent invalid should now be blocked + self._set_prev_torque(self.MAX_TORQUE) + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) + for _ in range(self.MIN_VALID_STEERING_FRAMES + 1): + self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) + + def test_steer_req_bit_realtime(self): + """ + Realtime safety for cutting steer request bit. This tests: + - That we allow messages with mismatching steer request bit if time from last is >= MIN_VALID_STEERING_RT_INTERVAL + - That frame mismatch safety does not interfere with this test + """ + for rt_us in np.arange(self.MIN_VALID_STEERING_RT_INTERVAL - 50000, self.MIN_VALID_STEERING_RT_INTERVAL + 50000, 10000): + # Reset match count and rt timer (valid_steer_req_count, ts_steer_req_mismatch_last) + self.safety.init_tests() + + # Make sure valid_steer_req_count doesn't affect this test + self.safety.set_controls_allowed(True) + self._set_prev_torque(self.MAX_TORQUE) + for _ in range(self.MIN_VALID_STEERING_FRAMES): + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) + + # Normally, sending MIN_VALID_STEERING_FRAMES valid frames should always allow + self.safety.set_timer(max(rt_us, 0)) + should_tx = rt_us >= self.MIN_VALID_STEERING_RT_INTERVAL + for _ in range(self.MAX_INVALID_STEERING_FRAMES): + self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) + + # Keep blocking after one steer_req mismatch + for _ in range(100): + self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=0))) + + # Make sure we can recover + self.assertTrue(self._tx(self._torque_cmd_msg(0, steer_req=1))) + self._set_prev_torque(self.MAX_TORQUE) + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, steer_req=1))) + + +class DriverTorqueSteeringSafetyTest(TorqueSteeringSafetyTestBase, abc.ABC): + + DRIVER_TORQUE_ALLOWANCE = 0 + DRIVER_TORQUE_FACTOR = 0 + + @classmethod + def setUpClass(cls): + if cls.__name__ == "DriverTorqueSteeringSafetyTest": + cls.safety = None + raise unittest.SkipTest + + @abc.abstractmethod + def _torque_driver_msg(self, torque): + pass + + def _reset_torque_driver_measurement(self, torque): + for _ in range(MAX_SAMPLE_VALS): + self._rx(self._torque_driver_msg(torque)) + + def test_non_realtime_limit_up(self): + self._reset_torque_driver_measurement(0) + super().test_non_realtime_limit_up() + + def test_against_torque_driver(self): + # Tests down limits and driver torque blending + self.safety.set_controls_allowed(True) + + for speed in self._torque_speed_range: + self._reset_speed_measurement(speed) + max_torque = self._get_max_torque(speed) + + # Cannot stay at MAX_TORQUE if above DRIVER_TORQUE_ALLOWANCE + for sign in [-1, 1]: + for driver_torque in np.arange(0, self.DRIVER_TORQUE_ALLOWANCE * 2, 1): + self._reset_torque_driver_measurement(-driver_torque * sign) + self._set_prev_torque(max_torque * sign) + should_tx = abs(driver_torque) <= self.DRIVER_TORQUE_ALLOWANCE + self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(max_torque * sign))) + + # arbitrary high driver torque to ensure max steer torque is allowed + max_driver_torque = int(max_torque / self.DRIVER_TORQUE_FACTOR + self.DRIVER_TORQUE_ALLOWANCE + 1) + + # spot check some individual cases + for sign in [-1, 1]: + # Ensure we wind down factor units for every unit above allowance + driver_torque = (self.DRIVER_TORQUE_ALLOWANCE + 10) * sign + torque_desired = (max_torque - 10 * self.DRIVER_TORQUE_FACTOR) * sign + delta = 1 * sign + self._set_prev_torque(torque_desired) + self._reset_torque_driver_measurement(-driver_torque) + self.assertTrue(self._tx(self._torque_cmd_msg(torque_desired))) + self._set_prev_torque(torque_desired + delta) + self._reset_torque_driver_measurement(-driver_torque) + self.assertFalse(self._tx(self._torque_cmd_msg(torque_desired + delta))) + + # If we're well past the allowance, minimum wind down is MAX_RATE_DOWN + self._set_prev_torque(max_torque * sign) + self._reset_torque_driver_measurement(-max_driver_torque * sign) + self.assertTrue(self._tx(self._torque_cmd_msg((max_torque - self.MAX_RATE_DOWN) * sign))) + self._set_prev_torque(max_torque * sign) + self._reset_torque_driver_measurement(-max_driver_torque * sign) + self.assertTrue(self._tx(self._torque_cmd_msg(0))) + self._set_prev_torque(max_torque * sign) + self._reset_torque_driver_measurement(-max_driver_torque * sign) + self.assertFalse(self._tx(self._torque_cmd_msg((max_torque - self.MAX_RATE_DOWN + 1) * sign))) + + def test_realtime_limits(self): + self.safety.set_controls_allowed(True) + + for sign in [-1, 1]: + self.safety.init_tests() + self._set_prev_torque(0) + self._reset_torque_driver_measurement(0) + for t in np.arange(0, self.MAX_RT_DELTA, 1): + t *= sign + self.assertTrue(self._tx(self._torque_cmd_msg(t))) + self.assertFalse(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA + 1)))) + + self._set_prev_torque(0) + for t in np.arange(0, self.MAX_RT_DELTA, 1): + t *= sign + self.assertTrue(self._tx(self._torque_cmd_msg(t))) + + # Increase timer to update rt_torque_last + self.safety.set_timer(RT_INTERVAL + 1) + self.assertTrue(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA - 1)))) + self.assertTrue(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA + 1)))) + + def test_reset_driver_torque_measurements(self): + # Tests that the driver torque measurement sample_t is reset on safety mode init + for t in np.linspace(-self.MAX_TORQUE, self.MAX_TORQUE, MAX_SAMPLE_VALS): + self.assertTrue(self._rx(self._torque_driver_msg(t))) + + self.assertNotEqual(self.safety.get_torque_driver_min(), 0) + self.assertNotEqual(self.safety.get_torque_driver_max(), 0) + + self._reset_safety_hooks() + self.assertEqual(self.safety.get_torque_driver_min(), 0) + self.assertEqual(self.safety.get_torque_driver_max(), 0) + + +class MotorTorqueSteeringSafetyTest(TorqueSteeringSafetyTestBase, abc.ABC): + + MAX_TORQUE_ERROR = 0 + TORQUE_MEAS_TOLERANCE = 0 + + @classmethod + def setUpClass(cls): + if cls.__name__ == "MotorTorqueSteeringSafetyTest": + cls.safety = None + raise unittest.SkipTest + + @abc.abstractmethod + def _torque_meas_msg(self, torque): + pass + + def _set_prev_torque(self, t): + super()._set_prev_torque(t) + self.safety.set_torque_meas(t, t) + + def test_torque_absolute_limits(self): + for speed in self._torque_speed_range: + self._reset_speed_measurement(speed) + max_torque = self._get_max_torque(speed) + for controls_allowed in [True, False]: + for torque in np.arange(-max_torque - 1000, max_torque + 1000, self.MAX_RATE_UP): + self.safety.set_controls_allowed(controls_allowed) + self.safety.set_rt_torque_last(torque) + self.safety.set_torque_meas(torque, torque) + self.safety.set_desired_torque_last(torque - self.MAX_RATE_UP) + + if controls_allowed: + send = (-max_torque <= torque <= max_torque) + else: + send = torque == 0 + + self.assertEqual(send, self._tx(self._torque_cmd_msg(torque))) + + def test_non_realtime_limit_down(self): + self.safety.set_controls_allowed(True) + + for speed in self._torque_speed_range: + self._reset_speed_measurement(speed) + max_torque = self._get_max_torque(speed) + + torque_meas = max_torque - self.MAX_TORQUE_ERROR - 50 + + self.safety.set_rt_torque_last(max_torque) + self.safety.set_torque_meas(torque_meas, torque_meas) + self.safety.set_desired_torque_last(max_torque) + self.assertTrue(self._tx(self._torque_cmd_msg(max_torque - self.MAX_RATE_DOWN))) + + self.safety.set_rt_torque_last(max_torque) + self.safety.set_torque_meas(torque_meas, torque_meas) + self.safety.set_desired_torque_last(max_torque) + self.assertFalse(self._tx(self._torque_cmd_msg(max_torque - self.MAX_RATE_DOWN + 1))) + + def test_exceed_torque_sensor(self): + self.safety.set_controls_allowed(True) + + for sign in [-1, 1]: + self._set_prev_torque(0) + for t in np.arange(0, self.MAX_TORQUE_ERROR + 2, 2): # step needs to be smaller than MAX_TORQUE_ERROR + t *= sign + self.assertTrue(self._tx(self._torque_cmd_msg(t))) + + self.assertFalse(self._tx(self._torque_cmd_msg(sign * (self.MAX_TORQUE_ERROR + 2)))) + + def test_realtime_limit_up(self): + self.safety.set_controls_allowed(True) + + for sign in [-1, 1]: + self.safety.init_tests() + self._set_prev_torque(0) + for t in np.arange(0, self.MAX_RT_DELTA + 1, 1): + t *= sign + self.safety.set_torque_meas(t, t) + self.assertTrue(self._tx(self._torque_cmd_msg(t))) + self.assertFalse(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA + 1)))) + + self._set_prev_torque(0) + for t in np.arange(0, self.MAX_RT_DELTA + 1, 1): + t *= sign + self.safety.set_torque_meas(t, t) + self.assertTrue(self._tx(self._torque_cmd_msg(t))) + + # Increase timer to update rt_torque_last + self.safety.set_timer(RT_INTERVAL + 1) + self.assertTrue(self._tx(self._torque_cmd_msg(sign * self.MAX_RT_DELTA))) + self.assertTrue(self._tx(self._torque_cmd_msg(sign * (self.MAX_RT_DELTA + 1)))) + + def test_torque_measurements(self): + trq = 50 + for t in [trq, -trq, 0, 0, 0, 0]: + self._rx(self._torque_meas_msg(t)) + + max_range = range(trq, trq + self.TORQUE_MEAS_TOLERANCE + 1) + min_range = range(-(trq + self.TORQUE_MEAS_TOLERANCE), -trq + 1) + self.assertTrue(self.safety.get_torque_meas_min() in min_range) + self.assertTrue(self.safety.get_torque_meas_max() in max_range) + + max_range = range(self.TORQUE_MEAS_TOLERANCE + 1) + min_range = range(-(trq + self.TORQUE_MEAS_TOLERANCE), -trq + 1) + self._rx(self._torque_meas_msg(0)) + self.assertTrue(self.safety.get_torque_meas_min() in min_range) + self.assertTrue(self.safety.get_torque_meas_max() in max_range) + + max_range = range(self.TORQUE_MEAS_TOLERANCE + 1) + min_range = range(-self.TORQUE_MEAS_TOLERANCE, 0 + 1) + self._rx(self._torque_meas_msg(0)) + self.assertTrue(self.safety.get_torque_meas_min() in min_range) + self.assertTrue(self.safety.get_torque_meas_max() in max_range) + + def test_reset_torque_measurements(self): + # Tests that the torque measurement sample_t is reset on safety mode init + for t in np.linspace(-self.MAX_TORQUE, self.MAX_TORQUE, MAX_SAMPLE_VALS): + self.assertTrue(self._rx(self._torque_meas_msg(t))) + + self.assertNotEqual(self.safety.get_torque_meas_min(), 0) + self.assertNotEqual(self.safety.get_torque_meas_max(), 0) + + self._reset_safety_hooks() + self.assertEqual(self.safety.get_torque_meas_min(), 0) + self.assertEqual(self.safety.get_torque_meas_max(), 0) + + +class VehicleSpeedSafetyTest(SafetyTestBase): + @classmethod + def setUpClass(cls): + if cls.__name__ == "VehicleSpeedSafetyTest": + cls.safety = None + raise unittest.SkipTest + + @abc.abstractmethod + def _speed_msg(self, speed): + pass + + def test_vehicle_speed_measurements(self): + # TODO: lower tolerance on these tests + self._common_measurement_test(self._speed_msg, 0, 80, 1, self.safety.get_vehicle_speed_min, self.safety.get_vehicle_speed_max) + + +class AngleSteeringSafetyTest(VehicleSpeedSafetyTest): + + STEER_ANGLE_MAX: float = 300 + STEER_ANGLE_TEST_MAX: float | None = None + DEG_TO_CAN: float + ANGLE_RATE_BP: list[float] + ANGLE_RATE_UP: list[float] # windup limit + ANGLE_RATE_DOWN: list[float] # unwind limit + + # Real time limits + LATERAL_FREQUENCY: int = -1 # Hz + + @classmethod + def setUpClass(cls): + if cls.__name__ == "AngleSteeringSafetyTest": + cls.safety = None + raise unittest.SkipTest + + @abc.abstractmethod + def _angle_cmd_msg(self, angle: float, enabled: bool, increment_timer: bool = True): + pass + + @abc.abstractmethod + def _angle_meas_msg(self, angle: float): + pass + + def _get_steer_cmd_angle_max(self, speed): + return self.STEER_ANGLE_MAX + + def _set_prev_desired_angle(self, t): + t = round(t * self.DEG_TO_CAN) + self.safety.set_desired_angle_last(t) + + def _reset_angle_measurement(self, angle): + for _ in range(MAX_SAMPLE_VALS): + self._rx(self._angle_meas_msg(angle)) + + def _reset_speed_measurement(self, speed): + for _ in range(MAX_SAMPLE_VALS): + self._rx(self._speed_msg(speed)) + + def test_steering_angle_measurements(self): + self._common_measurement_test(self._angle_meas_msg, -self.STEER_ANGLE_MAX, self.STEER_ANGLE_MAX, self.DEG_TO_CAN, + self.safety.get_angle_meas_min, self.safety.get_angle_meas_max) + + def test_angle_cmd_when_enabled(self): + # when controls are allowed, angle cmd rate limit is enforced + speeds = [0., 1., 5., 10., 15., 50.] + # TODO: what should CANPacker do here? we should also have good coverage checks on this + if self.STEER_ANGLE_TEST_MAX is None: + self.STEER_ANGLE_TEST_MAX = self.STEER_ANGLE_MAX * 2 + angles = np.concatenate((np.arange(-self.STEER_ANGLE_TEST_MAX, self.STEER_ANGLE_TEST_MAX, 5), [0])) + for a in angles: + for s in speeds: + max_delta_up = np.interp(s, self.ANGLE_RATE_BP, self.ANGLE_RATE_UP) + max_delta_down = np.interp(s, self.ANGLE_RATE_BP, self.ANGLE_RATE_DOWN) + + # first test against false positives + self._reset_angle_measurement(a) + self._reset_speed_measurement(s) + + self._set_prev_desired_angle(a) + self.safety.set_controls_allowed(1) + + # Stay within limits + # Up + self.assertTrue(self._tx(self._angle_cmd_msg(a + sign_of(a) * max_delta_up, True))) + self.assertTrue(self.safety.get_controls_allowed()) + + # Don't change + self.assertTrue(self._tx(self._angle_cmd_msg(a, True))) + self.assertTrue(self.safety.get_controls_allowed()) + + # Down + self.assertTrue(self._tx(self._angle_cmd_msg(a - sign_of(a) * max_delta_down, True))) + self.assertTrue(self.safety.get_controls_allowed()) + + # Inject too high rates + # Up + self.assertFalse(self._tx(self._angle_cmd_msg(a + sign_of(a) * (max_delta_up + 1.1), True))) + + # Don't change + self.safety.set_controls_allowed(1) + self._set_prev_desired_angle(a) + self.assertTrue(self.safety.get_controls_allowed()) + self.assertTrue(self._tx(self._angle_cmd_msg(a, True))) + self.assertTrue(self.safety.get_controls_allowed()) + + # Down + self.assertFalse(self._tx(self._angle_cmd_msg(a - sign_of(a) * (max_delta_down + 1.1), True))) + + # Check desired steer should be the same as steer angle when controls are off + self.safety.set_controls_allowed(0) + should_tx = abs(a) <= abs(self.STEER_ANGLE_MAX) + self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(a, False))) + + def test_angle_cmd_when_disabled(self): + # Tests that only angles close to the meas are allowed while + # steer actuation bit is 0, regardless of controls allowed. + for controls_allowed in (True, False): + self.safety.set_controls_allowed(controls_allowed) + + for steer_control_enabled in (True, False): + for angle_meas in np.arange(-90, 91, 10): + self._reset_angle_measurement(angle_meas) + + for angle_cmd in np.arange(-90, 91, 10): + self._set_prev_desired_angle(angle_cmd) + + # controls_allowed is checked if actuation bit is 1, else the angle must be close to meas (inactive) + should_tx = controls_allowed if steer_control_enabled else angle_cmd == angle_meas + self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(angle_cmd, steer_control_enabled))) + + def test_angle_violation(self): + # If violation occurs, angle cmd is blocked until reset to 0. Matches behavior of torque safety modes + self.safety.set_controls_allowed(True) + + for speed in (0., 1., 5., 10., 15., 50.): + self._tx(self._angle_cmd_msg(0, True)) + self._reset_speed_measurement(speed) + + for _ in range(20): + self.assertFalse(self._tx(self._angle_cmd_msg(self._get_steer_cmd_angle_max(speed), True))) + self.assertTrue(self._tx(self._angle_cmd_msg(0, True))) + + def _test_rt_limits(self): + # Angle safety enforces real time limits by checking the message send frequency in a 250ms time window + self.safety.set_timer(0) + self.safety.set_controls_allowed(True) + max_rt_msgs = int(self.LATERAL_FREQUENCY * RT_INTERVAL / 1e6 * 1.2 + 1) # 1.2x buffer + + for i in range(max_rt_msgs * 2): + should_tx = i <= max_rt_msgs + self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(0, True, increment_timer=False))) + + # One under RT interval should do nothing + self.safety.set_timer(RT_INTERVAL - 1) + for _ in range(5): + self.assertFalse(self._tx(self._angle_cmd_msg(0, True, increment_timer=False))) + + # Increment timer and send 1 message to reset RT window + self.safety.set_timer(RT_INTERVAL) + self.assertFalse(self._tx(self._angle_cmd_msg(0, True, increment_timer=False))) + for _ in range(5): + self.assertTrue(self._tx(self._angle_cmd_msg(0, True, increment_timer=False))) + + +class SafetyTest(SafetyTestBase): + TX_MSGS: list[list[int]] = [] + SCANNED_ADDRS = [*range(0x800), # Entire 11-bit CAN address space + *range(0x18DA00F1, 0x18DB00F1, 0x100), # 29-bit UDS physical addressing + *range(0x18DB00F1, 0x18DC00F1, 0x100), # 29-bit UDS functional addressing + *range(0x3300, 0x3400), # Honda + *range(0x6CD5554, 0x6CD555A), # Honda Bosch LANE_PATH, HUD_OBJECTS (camera and radar variants) + 0xF31AA52, 0xF31AA54, 0xF31AA5C, # Honda Bosch RADAR_LEAD2, LKAS_HUD_2, RADAR_LEAD + 0x1A45AA4E] # Honda Bosch BOSCH_SUPPLEMENTAL_CANFD + FWD_BLACKLISTED_ADDRS: dict[int, list[int]] = {} # {bus: [addr]} + FWD_BUS_LOOKUP: dict[int, int] = {0: 2, 2: 0} + + @classmethod + def setUpClass(cls): + if cls.__name__ == "SafetyTest" or cls.__name__.endswith('Base'): + cls.safety = None + raise unittest.SkipTest + + # ***** standard tests for all safety modes ***** + + def test_tx_msg_in_scanned_range(self): + # the relay malfunction, fwd hook, and spam can tests don't exhaustively + # scan the entire 29-bit address space, only some known important ranges + # make sure SCANNED_ADDRS stays up to date with car port TX_MSGS; new + # model ports should expand the range if needed + for msg in self.TX_MSGS: + self.assertTrue(msg[0] in self.SCANNED_ADDRS, f"{msg[0]=:#x}") + + def test_fwd_hook(self): + # some safety modes don't forward anything, while others blacklist msgs + for bus in range(3): + for addr in self.SCANNED_ADDRS: + # assume len 8 + fwd_bus = self.FWD_BUS_LOOKUP.get(bus, -1) + if bus in self.FWD_BLACKLISTED_ADDRS and addr in self.FWD_BLACKLISTED_ADDRS[bus]: + fwd_bus = -1 + self.assertEqual(fwd_bus, self.safety.safety_fwd_hook(bus, addr), f"{addr=:#x} from {bus=} to {fwd_bus=}") + + def test_spam_can_buses(self): + for bus in range(4): + for addr in self.SCANNED_ADDRS: + if [addr, bus] not in self.TX_MSGS: + self.assertFalse(self._tx(make_msg(bus, addr, 8)), f"allowed TX {addr=} {bus=}") + + def test_default_controls_not_allowed(self): + self.assertFalse(self.safety.get_controls_allowed()) + + def test_manually_enable_controls_allowed(self): + self.safety.set_controls_allowed(1) + self.assertTrue(self.safety.get_controls_allowed()) + self.safety.set_controls_allowed(0) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_tx_hook_on_wrong_safety_mode(self): + files = os.listdir(os.path.dirname(os.path.realpath(__file__))) + test_files = [f for f in files if f.startswith("test_") and f.endswith(".py")] + + current_test = self.__class__.__name__ + + all_tx = [] + for tf in test_files: + try: + test = importlib.import_module("iqdbc.safety.tests."+tf[:-3]) + except ImportError: + continue + for attr in dir(test): + if attr.startswith("Test") and attr != current_test: + tc = getattr(test, attr) + tx = tc.TX_MSGS + if tx is not None and not attr.endswith('Base'): + # No point in comparing different Tesla safety modes + if 'Tesla' in attr and 'Tesla' in current_test: + continue + # No point in comparing to ALLOUTPUT which allows all messages + if attr.startswith('TestAllOutput'): + continue + if attr.startswith('TestElm327'): + continue + if attr.startswith('TestToyota') and current_test.startswith('TestToyota'): + continue + if attr.startswith('TestSubaruGen') and current_test.startswith('TestSubaruGen'): + continue + if attr.startswith('TestSubaruPreglobal') and current_test.startswith('TestSubaruPreglobal'): + continue + volkswagen_pq = {'TestVolkswagenPqSafety', 'TestVolkswagenPqStockSafety', 'TestVolkswagenPqLongSafety', + 'TestVolkswagenPqLowlineSafety', 'TestVolkswagenPqNoCamSafety'} + if {attr, current_test}.issubset(volkswagen_pq): + continue + if {attr, current_test}.issubset({'TestGmCameraSafety', 'TestGmCameraLongitudinalSafety', 'TestGmAscmSafety', + 'TestGmCameraEVSafety', 'TestGmCameraLongitudinalEVSafety', 'TestGmAscmEVSafety', + 'TestGmCameraNonACCSafety', 'TestGmCameraEVNonACCSafety'}): + continue + if attr.startswith('TestFord') and current_test.startswith('TestFord'): + continue + if attr.startswith('TestHyundaiCanfd') and current_test.startswith('TestHyundaiCanfd'): + continue + if {attr, current_test}.issubset({'TestHyundaiLongitudinalSafety', 'TestHyundaiLongitudinalSafetyCameraSCC', 'TestHyundaiSafetyFCEVLong'}): + continue + base_tests = {'TestHyundaiLongitudinalSafety', 'TestHyundaiLongitudinalSafetyCameraSCC', 'TestHyundaiSafetyFCEVLong', + 'TestHyundaiLongitudinalESCCSafety'} + if any(attr.startswith(test) for test in base_tests) and any(current_test.startswith(test) for test in base_tests): + continue + volkswagen_shared = ('TestVolkswagenMqb', 'TestVolkswagenMlb', 'TestVolkswagenMeb') + if attr.startswith(volkswagen_shared) and current_test.startswith(volkswagen_shared): + continue + + # overlapping TX addrs, but they're not actuating messages for either car + if attr == 'TestHyundaiCanfdLKASteeringLongEV' and current_test.startswith('TestToyota'): + tx = list(filter(lambda m: m[0] not in [0x160, ], tx)) + + # Volkswagen MQB longitudinal actuating message overlaps with the Subaru lateral actuating message + if attr == 'TestVolkswagenMqbLongSafety' and current_test.startswith('TestSubaru'): + tx = list(filter(lambda m: m[0] not in [0x122, ], tx)) + if attr.startswith('TestSubaru') and current_test == 'TestVolkswagenMqbLongSafety': + tx = list(filter(lambda m: m[0] not in [0x122, ], tx)) + + # Volkswagen MQB/MLB and Honda Nidec ACC HUD messages overlap + if attr in ('TestVolkswagenMqbLongSafety', 'TestVolkswagenMlbLongSafety') and current_test.startswith('TestHondaNidec'): + tx = list(filter(lambda m: m[0] not in [0x30c, ], tx)) + + # Volkswagen MQB/MLB and Honda Bosch Radarless ACC HUD messages overlap + if attr in ('TestVolkswagenMqbLongSafety', 'TestVolkswagenMlbLongSafety') and current_test.startswith('TestHondaBoschRadarless'): + tx = list(filter(lambda m: m[0] not in [0x30c, ], tx)) + + # Volkswagen MQB/MLB and Honda Bosch CANFD ACC HUD messages overlap + if attr in ('TestVolkswagenMqbLongSafety', 'TestVolkswagenMlbLongSafety') and current_test.startswith('TestHondaBoschCANFD'): + tx = list(filter(lambda m: m[0] not in [0x30c, ], tx)) + + # TODO: Temporary, should be fixed in panda firmware, safety_honda.h + if attr.startswith('TestHonda'): + # exceptions for common msgs across different hondas + tx = list(filter(lambda m: m[0] not in [0x1FA, 0x30C, 0x33D, 0x33DB, 0x6CD5554, 0xF31AA54, 0x6CD5557], tx)) + + if attr.startswith('TestHyundaiLongitudinal'): + # exceptions for common msgs across different Hyundai CAN platforms + tx = list(filter(lambda m: m[0] not in [0x420, 0x50A, 0x389, 0x4A2], tx)) + all_tx.append([[m[0], m[1], attr] for m in tx]) + + # make sure we got all the msgs + self.assertTrue(len(all_tx) >= len(test_files)-1) + + for tx_msgs in all_tx: + for addr, bus, test_name in tx_msgs: + msg = make_msg(bus, addr) + self.safety.set_controls_allowed(1) + # TODO: this should be blocked + if current_test in ["TestNissanSafety", "TestNissanSafetyAltEpsBus", "TestNissanLeafSafety"] and [addr, bus] in self.TX_MSGS: + continue + self.assertFalse(self._tx(msg), f"transmit of {addr=:#x} {bus=} from {test_name} during {current_test} was allowed") + + +class SecondSpeedSafetyTest(abc.ABC): + @abc.abstractmethod + def _speed_msg(self, speed): + pass + + @abc.abstractmethod + def _speed_msg_2(self, speed): + pass + + def test_rx_hook_speed_mismatch(self): + for speed in np.arange(0, 40, 0.5): + for speed_delta in np.arange(-5, 5, 0.1): + speed_2 = round(max(speed + speed_delta, 0), 1) + self._rx(self._speed_msg(speed)) + self.safety.set_controls_allowed(True) + self._rx(self._speed_msg_2(speed_2)) + + within_delta = abs(speed - speed_2) <= MAX_SPEED_DELTA + self.assertEqual(self.safety.get_controls_allowed(), within_delta) + + +@add_regen_tests +class CarSafetyTest(SafetyTest, AolSafetyTestBase): + STANDSTILL_THRESHOLD: float = 0.0 + GAS_PRESSED_THRESHOLD = 0 + RELAY_MALFUNCTION_ADDRS: dict[int, tuple[int, ...]] | None = None + + @classmethod + def setUpClass(cls): + if cls.__name__ == "CarSafetyTest" or cls.__name__.endswith('Base'): + cls.safety = None + raise unittest.SkipTest + + @abc.abstractmethod + def _user_brake_msg(self, brake): + pass + + def _user_regen_msg(self, regen): + pass + + @abc.abstractmethod + def _speed_msg(self, speed): + pass + + # Safety modes can override if vehicle_moving is driven by a different message + def _vehicle_moving_msg(self, speed: float): + return self._speed_msg(speed) + + @abc.abstractmethod + def _user_gas_msg(self, gas): + pass + + @abc.abstractmethod + def _pcm_status_msg(self, enable): + pass + + # ***** standard tests for all car-specific safety modes ***** + + def test_relay_malfunction(self): + # each car has an addr that is used to detect relay malfunction + # if that addr is seen on specified bus, triggers the relay malfunction + # protection logic: both tx_hook and fwd_hook are expected to return failure + self.assertFalse(self.safety.get_relay_malfunction()) + for bus in range(3): + for addr in self.SCANNED_ADDRS: + self.safety.set_relay_malfunction(False) + self._rx(make_msg(bus, addr, 8)) + should_relay_malfunction = addr in self.RELAY_MALFUNCTION_ADDRS.get(bus, ()) + self.assertEqual(should_relay_malfunction, self.safety.get_relay_malfunction(), (bus, hex(addr))) + + # test relay malfunction protection logic + self.safety.set_relay_malfunction(True) + for bus in range(3): + for addr in self.SCANNED_ADDRS: + self.assertFalse(self._tx(make_msg(bus, addr, 8))) + self.assertEqual(-1, self.safety.safety_fwd_hook(bus, addr)) + + def test_prev_gas(self): + self.assertFalse(self.safety.get_gas_pressed_prev()) + for pressed in [self.GAS_PRESSED_THRESHOLD + 1, 0]: + self._rx(self._user_gas_msg(pressed)) + self.assertEqual(bool(pressed), self.safety.get_gas_pressed_prev()) + + def test_allow_engage_with_gas_pressed(self): + self._rx(self._user_gas_msg(1)) + self.safety.set_controls_allowed(True) + self._rx(self._user_gas_msg(1)) + self.assertTrue(self.safety.get_controls_allowed()) + self._rx(self._user_gas_msg(1)) + self.assertTrue(self.safety.get_controls_allowed()) + + def test_no_disengage_on_gas(self): + self._rx(self._user_gas_msg(0)) + self.safety.set_controls_allowed(True) + self._rx(self._user_gas_msg(self.GAS_PRESSED_THRESHOLD + 1)) + self.assertTrue(self.safety.get_controls_allowed()) + self.assertFalse(self.safety.get_longitudinal_allowed()) + self.assertTrue(self.safety.get_longitudinal_gas_allowed()) + + def test_prev_user_brake(self, _user_brake_msg=None, get_brake_pressed_prev=None): + if _user_brake_msg is None: + _user_brake_msg = self._user_brake_msg + get_brake_pressed_prev = self.safety.get_brake_pressed_prev + + self.assertFalse(get_brake_pressed_prev()) + for pressed in [True, False]: + self._rx(_user_brake_msg(not pressed)) + self.assertEqual(not pressed, get_brake_pressed_prev()) + self._rx(_user_brake_msg(pressed)) + self.assertEqual(pressed, get_brake_pressed_prev()) + + def test_enable_control_allowed_from_cruise(self): + self._rx(self._pcm_status_msg(False)) + self.assertFalse(self.safety.get_controls_allowed()) + self._rx(self._pcm_status_msg(True)) + self.assertTrue(self.safety.get_controls_allowed()) + + def test_disable_control_allowed_from_cruise(self): + self.safety.set_controls_allowed(1) + self._rx(self._pcm_status_msg(False)) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_cruise_engaged_prev(self): + for engaged in [True, False]: + self._rx(self._pcm_status_msg(engaged)) + self.assertEqual(engaged, self.safety.get_cruise_engaged_prev()) + self._rx(self._pcm_status_msg(not engaged)) + self.assertEqual(not engaged, self.safety.get_cruise_engaged_prev()) + + def test_allow_user_brake_at_zero_speed(self, _user_brake_msg=None, get_brake_pressed_prev=None): + if _user_brake_msg is None: + _user_brake_msg = self._user_brake_msg + + # Brake was already pressed + self._rx(self._vehicle_moving_msg(0)) + self._rx(_user_brake_msg(1)) + self.safety.set_controls_allowed(1) + self._rx(_user_brake_msg(1)) + self.assertTrue(self.safety.get_controls_allowed()) + self.assertTrue(self.safety.get_longitudinal_brake_allowed()) + self.assertTrue(self.safety.get_longitudinal_gas_allowed()) + self._rx(_user_brake_msg(0)) + self.assertTrue(self.safety.get_controls_allowed()) + self.assertTrue(self.safety.get_longitudinal_brake_allowed()) + self.assertTrue(self.safety.get_longitudinal_gas_allowed()) + # rising edge of brake should disengage + self._rx(_user_brake_msg(1)) + self.assertFalse(self.safety.get_controls_allowed()) + self.assertFalse(self.safety.get_longitudinal_brake_allowed()) + self.assertFalse(self.safety.get_longitudinal_gas_allowed()) + self._rx(_user_brake_msg(0)) # reset no brakes + + def test_not_allow_user_brake_when_moving(self, _user_brake_msg=None, get_brake_pressed_prev=None): + if _user_brake_msg is None: + _user_brake_msg = self._user_brake_msg + + # Brake was already pressed + self._rx(_user_brake_msg(1)) + self.safety.set_controls_allowed(1) + self._rx(self._vehicle_moving_msg(self.STANDSTILL_THRESHOLD)) + self._rx(_user_brake_msg(1)) + self.assertTrue(self.safety.get_controls_allowed()) + self.assertTrue(self.safety.get_longitudinal_brake_allowed()) + self.assertTrue(self.safety.get_longitudinal_gas_allowed()) + self._rx(self._vehicle_moving_msg(self.STANDSTILL_THRESHOLD + 1)) + self._rx(_user_brake_msg(1)) + self.assertFalse(self.safety.get_controls_allowed()) + self.assertFalse(self.safety.get_longitudinal_brake_allowed()) + self.assertFalse(self.safety.get_longitudinal_gas_allowed()) + self._rx(self._vehicle_moving_msg(0)) + + def test_vehicle_moving(self): + self.assertFalse(self.safety.get_vehicle_moving()) + + # not moving + self._rx(self._vehicle_moving_msg(0)) + self.assertFalse(self.safety.get_vehicle_moving()) + + # speed is at threshold + self._rx(self._vehicle_moving_msg(self.STANDSTILL_THRESHOLD)) + self.assertFalse(self.safety.get_vehicle_moving()) + + # past threshold + self._rx(self._vehicle_moving_msg(self.STANDSTILL_THRESHOLD + 1)) + self.assertTrue(self.safety.get_vehicle_moving()) + + def test_safety_tick(self): + self.safety.set_timer(int(2e6)) + self.safety.set_controls_allowed(True) + self.safety.set_controls_allowed_lat(True) + self.safety.safety_tick_current_safety_config() + self.assertFalse(self.safety.get_controls_allowed()) + self.assertFalse(self.safety.get_controls_allowed_lat()) + self.assertFalse(self.safety.safety_config_valid()) diff --git a/artifacts/package_runtime/iqdbc/safety/tests/gas_interceptor_common.py b/artifacts/package_runtime/iqdbc/safety/tests/gas_interceptor_common.py new file mode 100644 index 000000000..20eba2326 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/gas_interceptor_common.py @@ -0,0 +1,82 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import numpy as np +import unittest + +from iqdbc.safety.tests.common import CANPackerSafety, CarSafetyTest + + +class GasInterceptorSafetyTest(CarSafetyTest): + + INTERCEPTOR_THRESHOLD = 0 + + cnt_gas_cmd = 0 + cnt_user_gas = 0 + + packer: CANPackerSafety + + @classmethod + def setUpClass(cls): + if cls.__name__ == "GasInterceptorSafetyTest" or cls.__name__.endswith("Base"): + cls.safety = None + raise unittest.SkipTest + + def _interceptor_gas_cmd(self, gas: int): + values: dict[str, float | int] = {"PEDAL_COUNTER": self.__class__.cnt_gas_cmd & 0xF} + if gas > 0: + values["GAS_COMMAND"] = gas * 255. + values["GAS_COMMAND2"] = gas * 255. + self.__class__.cnt_gas_cmd += 1 + return self.packer.make_can_msg_safety("GAS_COMMAND", 0, values) + + def _interceptor_user_gas(self, gas: int): + values = {"INTERCEPTOR_GAS": gas, "INTERCEPTOR_GAS2": gas, + "PEDAL_COUNTER": self.__class__.cnt_user_gas} + self.__class__.cnt_user_gas += 1 + return self.packer.make_can_msg_safety("GAS_SENSOR", 0, values) + + # Skip non-interceptor user gas tests + def test_prev_gas(self): + pass + + def test_no_disengage_on_gas(self): + pass + + def test_prev_gas_interceptor(self): + self._rx(self._interceptor_user_gas(0x0)) + self.assertFalse(self.safety.get_gas_interceptor_prev()) + self._rx(self._interceptor_user_gas(0x1000)) + self.assertTrue(self.safety.get_gas_interceptor_prev()) + self._rx(self._interceptor_user_gas(0x0)) + + def test_no_disengage_on_gas_interceptor(self): + self.safety.set_controls_allowed(True) + for g in range(0x1000): + self._rx(self._interceptor_user_gas(g)) + # Test we allow lateral, but not longitudinal + self.assertTrue(self.safety.get_controls_allowed()) + self.assertEqual(g <= self.INTERCEPTOR_THRESHOLD, self.safety.get_longitudinal_brake_allowed()) + self.assertTrue(self.safety.get_longitudinal_gas_allowed()) + # Make sure we can re-gain longitudinal actuation + self._rx(self._interceptor_user_gas(0)) + self.assertTrue(self.safety.get_longitudinal_brake_allowed()) + self.assertTrue(self.safety.get_longitudinal_gas_allowed()) + + def test_allow_engage_with_gas_interceptor_pressed(self): + self._rx(self._interceptor_user_gas(0x1000)) + self.safety.set_controls_allowed(True) + self._rx(self._interceptor_user_gas(0x1000)) + self.assertTrue(self.safety.get_controls_allowed()) + self._rx(self._interceptor_user_gas(0)) + + def test_gas_interceptor_safety_check(self): + for gas in np.arange(0, 4000, 100): + for controls_allowed in [True, False]: + self.safety.set_controls_allowed(controls_allowed) + if controls_allowed: + send = True + else: + send = gas == 0 + self.assertEqual(send, self._tx(self._interceptor_gas_cmd(gas))) diff --git a/artifacts/package_runtime/iqdbc/safety/tests/hyundai_common.py b/artifacts/package_runtime/iqdbc/safety/tests/hyundai_common.py new file mode 100644 index 000000000..b5ea09d47 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/hyundai_common.py @@ -0,0 +1,46 @@ +from iqdbc.safety.tests.libsafety import libsafety_py + + +def packet(addr: int, bus: int, length: int, updates: dict[int, int] | None = None): + data = bytearray(length) + for index, value in (updates or {}).items(): + data[index] = value + return libsafety_py.make_CANPacket(addr, bus, data) + + +def classic_steer(torque: int, request: bool = True): + value = torque + 1024 + word = (value << 16) | (int(request) << 27) + return packet(0x340, 0, 8, {i: (word >> (8 * i)) & 0xFF for i in range(4)}) + + +def canfd_steer(addr: int, length: int, torque: int, request: bool = True): + value = torque + 1024 + return packet(addr, 0, length, { + 5: (value & 0x7F) << 1, + 6: ((value >> 7) & 0xF) | (int(request) << 4), + }) + + +def classic_accel(accel: int, *, aeb_decel: int = 0, aeb_request: bool = False): + value = accel + 1023 + return packet(0x421, 0, 8, { + 2: aeb_decel, + 3: value & 0xFF, + 4: ((value >> 8) & 0x7) | ((value & 0x7) << 5), + 5: (value >> 3) & 0xFF, + 6: int(aeb_request) << 6, + }) + + +def canfd_accel(accel: int, *, acc_mode: int = 0, bus: int = 0): + value = accel + 1023 + return packet(0x1A0, bus, 32, { + 8: (acc_mode & 0x7) << 4, + 16: value & 0xFF, + 17: ((value >> 8) & 0x7) | ((value & 0xF) << 4), + 18: (value >> 4) & 0xFF, + }) + + +TESTER_PRESENT = bytes.fromhex("023e800000000000") diff --git a/artifacts/package_runtime/iqdbc/safety/tests/libsafety/__init__.py b/artifacts/package_runtime/iqdbc/safety/tests/libsafety/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/safety/tests/libsafety/libsafety_py.py b/artifacts/package_runtime/iqdbc/safety/tests/libsafety/libsafety_py.py new file mode 100644 index 000000000..2c0290ebd --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/libsafety/libsafety_py.py @@ -0,0 +1,120 @@ +import os +from cffi import FFI + +from iqdbc.safety import LEN_TO_DLC + +libsafety_dir = os.path.dirname(os.path.abspath(__file__)) +libsafety_fn = os.path.join(libsafety_dir, "libsafety.so") + +ffi = FFI() + +ffi.cdef(""" +typedef struct { + unsigned char fd : 1; + unsigned char bus : 3; + unsigned char data_len_code : 4; + unsigned char rejected : 1; + unsigned char returned : 1; + unsigned char extended : 1; + unsigned int addr : 29; + unsigned char checksum; + unsigned char data[64]; +} CANPacket_t; +""", packed=True) +class CANPacket: + pass + +ffi.cdef(""" +bool safety_rx_hook(CANPacket_t *msg); +bool safety_tx_hook(CANPacket_t *msg); +int safety_fwd_hook(int bus_num, int addr); +int set_safety_hooks(uint16_t mode, uint16_t param); + +void set_controls_allowed(bool c); +bool get_controls_allowed(void); +void set_heartbeat_engaged(bool c); +bool get_longitudinal_allowed(void); +bool get_longitudinal_gas_allowed(void); +bool get_longitudinal_brake_allowed(void); +void set_alternative_experience(int mode); +int get_alternative_experience(void); +void set_relay_malfunction(bool c); +bool get_relay_malfunction(void); +bool get_gas_pressed_prev(void); +void set_gas_pressed_prev(bool); +bool get_brake_pressed_prev(void); +bool get_regen_braking_prev(void); +bool get_steering_disengage_prev(void); +bool get_acc_main_on(void); +float get_vehicle_speed_min(void); +float get_vehicle_speed_max(void); +int get_current_safety_mode(void); +int get_current_safety_param(void); + +void set_torque_meas(int min, int max); +int get_torque_meas_min(void); +int get_torque_meas_max(void); +void set_torque_driver(int min, int max); +int get_torque_driver_min(void); +int get_torque_driver_max(void); +void set_desired_torque_last(int t); +void set_rt_torque_last(int t); +void set_desired_angle_last(int t); +int get_desired_angle_last(); +void set_angle_meas(int min, int max); +int get_angle_meas_min(void); +int get_angle_meas_max(void); + +bool get_cruise_engaged_prev(void); +void set_cruise_engaged_prev(bool engaged); +bool get_vehicle_moving(void); +void set_timer(uint32_t t); + +void safety_tick_current_safety_config(); +bool safety_config_valid(); + +void init_tests(void); + +void set_honda_fwd_brake(bool c); +bool get_honda_fwd_brake(void); +void set_honda_alt_brake_msg(bool c); +void set_honda_bosch_long(bool c); +int get_honda_hw(void); + +bool get_lat_active(void); +bool get_controls_allowed_lat(void); +bool get_controls_requested_lat(void); +void set_current_safety_param_iq(uint16_t param); +uint16_t get_current_safety_param_iq(void); +bool get_enable_aol(void); +bool get_disengage_lateral_on_brake(void); +bool get_pause_lateral_on_brake(void); +void set_aol_button_press(int aol_button_press); +void set_controls_allowed_lat(bool c); +void set_controls_requested_lat(bool c); +bool get_aol_acc_main(void); +void set_acc_main_on(bool c); +int get_aol_button_press(void); +void aol_set_current_disengage_reason(int reason); +int aol_get_current_disengage_reason(void); +int get_temp_debug(void); +uint32_t get_acc_main_on_mismatches(void); +void set_aol_params(bool enable_aol, bool disengage_lateral_on_brake, bool pause_lateral_on_brake); +void set_heartbeat_engaged_aol(bool c); +void aol_heartbeat_engaged_check(void); +void set_steering_disengage(bool c); +int get_gas_interceptor_prev(void); +""") + +class LibSafety: + pass +libsafety: LibSafety = ffi.dlopen(libsafety_fn) + +def make_CANPacket(addr: int, bus: int, dat): + ret = ffi.new('CANPacket_t *') + ret[0].extended = 1 if addr >= 0x800 else 0 + ret[0].addr = addr + ret[0].data_len_code = LEN_TO_DLC[len(dat)] + ret[0].bus = bus + ret[0].data = bytes(dat) + return ret diff --git a/artifacts/package_runtime/iqdbc/safety/tests/misra/.gitignore b/artifacts/package_runtime/iqdbc/safety/tests/misra/.gitignore new file mode 100644 index 000000000..fc9ac228c --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/misra/.gitignore @@ -0,0 +1,5 @@ +*.pdf +*.txt +.output.log +new_table +cppcheck/ diff --git a/artifacts/package_runtime/iqdbc/safety/tests/misra/checkers.txt b/artifacts/package_runtime/iqdbc/safety/tests/misra/checkers.txt new file mode 100644 index 000000000..8aa0ddd08 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/misra/checkers.txt @@ -0,0 +1,456 @@ +Cppcheck checkers list from test_misra.sh: + + + + + +TEST variant options: +--enable=all --enable=unusedFunction --addon=misra -DCANFD /iqdbc/safety/main.c + + +Critical errors +--------------- +No critical errors encountered. +Note: There might still have been non-critical bailouts which might lead to false negatives. + + +Open source checkers +-------------------- +Yes Check64BitPortability::pointerassignment +Yes CheckAssert::assertWithSideEffects +Yes CheckAutoVariables::assignFunctionArg +Yes CheckAutoVariables::autoVariables +Yes CheckAutoVariables::checkVarLifetime +No CheckBool::checkAssignBoolToFloat require:style,c++ +Yes CheckBool::checkAssignBoolToPointer +No CheckBool::checkBitwiseOnBoolean require:style,inconclusive +Yes CheckBool::checkComparisonOfBoolExpressionWithInt +No CheckBool::checkComparisonOfBoolWithBool require:style,c++ +No CheckBool::checkComparisonOfBoolWithInt require:warning,c++ +No CheckBool::checkComparisonOfFuncReturningBool require:style,c++ +Yes CheckBool::checkIncrementBoolean +Yes CheckBool::pointerArithBool +Yes CheckBool::returnValueOfFunctionReturningBool +Yes CheckBufferOverrun::analyseWholeProgram +Yes CheckBufferOverrun::argumentSize +Yes CheckBufferOverrun::arrayIndex +Yes CheckBufferOverrun::arrayIndexThenCheck +Yes CheckBufferOverrun::bufferOverflow +Yes CheckBufferOverrun::negativeArraySize +Yes CheckBufferOverrun::objectIndex +Yes CheckBufferOverrun::pointerArithmetic +No CheckBufferOverrun::stringNotZeroTerminated require:warning,inconclusive +Yes CheckClass::analyseWholeProgram +No CheckClass::checkConst require:style,inconclusive +No CheckClass::checkConstructors require:style,warning +No CheckClass::checkCopyConstructors require:warning +No CheckClass::checkDuplInheritedMembers require:warning +No CheckClass::checkExplicitConstructors require:style +No CheckClass::checkMemset +No CheckClass::checkMissingOverride require:style,c++03 +No CheckClass::checkReturnByReference require:performance +No CheckClass::checkSelfInitialization +No CheckClass::checkThisUseAfterFree require:warning +No CheckClass::checkUnsafeClassRefMember require:warning,safeChecks +No CheckClass::checkUselessOverride require:style +No CheckClass::checkVirtualFunctionCallInConstructor require:warning +No CheckClass::initializationListUsage require:performance +No CheckClass::initializerListOrder require:style,inconclusive +No CheckClass::operatorEqRetRefThis require:style +No CheckClass::operatorEqToSelf require:warning +No CheckClass::privateFunctions require:style +No CheckClass::thisSubtraction require:warning +No CheckClass::virtualDestructor +Yes CheckCondition::alwaysTrueFalse +Yes CheckCondition::assignIf +Yes CheckCondition::checkAssignmentInCondition +Yes CheckCondition::checkBadBitmaskCheck +Yes CheckCondition::checkCompareValueOutOfTypeRange +Yes CheckCondition::checkDuplicateConditionalAssign +Yes CheckCondition::checkIncorrectLogicOperator +Yes CheckCondition::checkInvalidTestForOverflow +Yes CheckCondition::checkModuloAlwaysTrueFalse +Yes CheckCondition::checkPointerAdditionResultNotNull +Yes CheckCondition::clarifyCondition +Yes CheckCondition::comparison +Yes CheckCondition::duplicateCondition +Yes CheckCondition::multiCondition +Yes CheckCondition::multiCondition2 +No CheckExceptionSafety::checkCatchExceptionByValue require:style +No CheckExceptionSafety::checkRethrowCopy require:style +No CheckExceptionSafety::deallocThrow require:warning +No CheckExceptionSafety::destructors require:warning +No CheckExceptionSafety::nothrowThrows +No CheckExceptionSafety::rethrowNoCurrentException +No CheckExceptionSafety::unhandledExceptionSpecification require:style,inconclusive +Yes CheckFunctions::checkIgnoredReturnValue +Yes CheckFunctions::checkMathFunctions +Yes CheckFunctions::checkMissingReturn +Yes CheckFunctions::checkProhibitedFunctions +Yes CheckFunctions::invalidFunctionUsage +Yes CheckFunctions::memsetInvalid2ndParam +Yes CheckFunctions::memsetZeroBytes +No CheckFunctions::returnLocalStdMove require:performance,c++11 +Yes CheckFunctions::useStandardLibrary +No CheckIO::checkCoutCerrMisusage require:c +Yes CheckIO::checkFileUsage +Yes CheckIO::checkWrongPrintfScanfArguments +Yes CheckIO::invalidScanf +Yes CheckLeakAutoVar::check +No CheckMemoryLeakInClass::check +Yes CheckMemoryLeakInFunction::checkReallocUsage +Yes CheckMemoryLeakNoVar::check +No CheckMemoryLeakNoVar::checkForUnsafeArgAlloc +Yes CheckMemoryLeakStructMember::check +Yes CheckNullPointer::analyseWholeProgram +Yes CheckNullPointer::arithmetic +Yes CheckNullPointer::nullConstantDereference +Yes CheckNullPointer::nullPointer +No CheckOther::checkAccessOfMovedVariable require:c++11,warning +Yes CheckOther::checkCastIntToCharAndBack +Yes CheckOther::checkCharVariable +Yes CheckOther::checkComparePointers +Yes CheckOther::checkComparisonFunctionIsAlwaysTrueOrFalse +Yes CheckOther::checkConstPointer +No CheckOther::checkConstVariable require:style,c++ +No CheckOther::checkDuplicateBranch require:style,inconclusive +Yes CheckOther::checkDuplicateExpression +Yes CheckOther::checkEvaluationOrder +Yes CheckOther::checkFuncArgNamesDifferent +No CheckOther::checkIncompleteArrayFill require:warning,portability,inconclusive +Yes CheckOther::checkIncompleteStatement +No CheckOther::checkInterlockedDecrement require:windows-platform +Yes CheckOther::checkInvalidFree +Yes CheckOther::checkKnownArgument +Yes CheckOther::checkKnownPointerToBool +No CheckOther::checkMisusedScopedObject require:style,c++ +Yes CheckOther::checkModuloOfOne +Yes CheckOther::checkNanInArithmeticExpression +Yes CheckOther::checkNegativeBitwiseShift +Yes CheckOther::checkOverlappingWrite +No CheckOther::checkPassByReference require:performance,c++ +Yes CheckOther::checkRedundantAssignment +No CheckOther::checkRedundantCopy require:c++,performance,inconclusive +Yes CheckOther::checkRedundantPointerOp +Yes CheckOther::checkShadowVariables +Yes CheckOther::checkSignOfUnsignedVariable +No CheckOther::checkSuspiciousCaseInSwitch require:warning,inconclusive +No CheckOther::checkSuspiciousSemicolon require:warning,inconclusive +Yes CheckOther::checkUnreachableCode +Yes CheckOther::checkUnusedLabel +Yes CheckOther::checkVarFuncNullUB +Yes CheckOther::checkVariableScope +Yes CheckOther::checkZeroDivision +Yes CheckOther::clarifyCalculation +Yes CheckOther::clarifyStatement +Yes CheckOther::invalidPointerCast +Yes CheckOther::redundantBitwiseOperationInSwitch +Yes CheckOther::suspiciousFloatingPointCast +No CheckOther::warningOldStylePointerCast require:style,c++ +No CheckPostfixOperator::postfixOperator require:performance +Yes CheckSizeof::checkSizeofForArrayParameter +Yes CheckSizeof::checkSizeofForNumericParameter +Yes CheckSizeof::checkSizeofForPointerSize +Yes CheckSizeof::sizeofCalculation +Yes CheckSizeof::sizeofFunction +Yes CheckSizeof::sizeofVoid +Yes CheckSizeof::sizeofsizeof +No CheckSizeof::suspiciousSizeofCalculation require:warning,inconclusive +No CheckStl::checkDereferenceInvalidIterator require:warning +No CheckStl::checkDereferenceInvalidIterator2 +No CheckStl::checkFindInsert require:performance +No CheckStl::checkMutexes require:warning +No CheckStl::erase +No CheckStl::eraseIteratorOutOfBounds +No CheckStl::if_find require:warning,performance +No CheckStl::invalidContainer +No CheckStl::iterators +No CheckStl::knownEmptyContainer require:style +No CheckStl::misMatchingContainerIterator +No CheckStl::misMatchingContainers +No CheckStl::missingComparison require:warning +No CheckStl::negativeIndex +No CheckStl::outOfBounds +No CheckStl::outOfBoundsIndexExpression +No CheckStl::redundantCondition require:style +No CheckStl::size require:performance,c++03 +No CheckStl::stlBoundaries +No CheckStl::stlOutOfBounds +No CheckStl::string_c_str +No CheckStl::useStlAlgorithm require:style +No CheckStl::uselessCalls require:performance,warning +Yes CheckString::checkAlwaysTrueOrFalseStringCompare +Yes CheckString::checkIncorrectStringCompare +Yes CheckString::checkSuspiciousStringCompare +Yes CheckString::overlappingStrcmp +Yes CheckString::sprintfOverlappingData +Yes CheckString::strPlusChar +Yes CheckString::stringLiteralWrite +Yes CheckType::checkFloatToIntegerOverflow +Yes CheckType::checkIntegerOverflow +Yes CheckType::checkLongCast +Yes CheckType::checkSignConversion +Yes CheckType::checkTooBigBitwiseShift +Yes CheckUninitVar::analyseWholeProgram +Yes CheckUninitVar::check +Yes CheckUninitVar::valueFlowUninit +Yes CheckUnusedFunctions::check +Yes CheckUnusedVar::checkFunctionVariableUsage +Yes CheckUnusedVar::checkStructMemberUsage +Yes CheckVaarg::va_list_usage +Yes CheckVaarg::va_start_argument + + +Premium checkers +---------------- +Not available, Cppcheck Premium is not used + + +Autosar +------- +Not available, Cppcheck Premium is not used + + +Cert C +------ +Not available, Cppcheck Premium is not used + + +Cert C++ +-------- +Not available, Cppcheck Premium is not used + + +Misra C 2012 +------------ +No Misra C 2012: Dir 1.1 +No Misra C 2012: Dir 2.1 +No Misra C 2012: Dir 3.1 +No Misra C 2012: Dir 4.1 +No Misra C 2012: Dir 4.2 +No Misra C 2012: Dir 4.3 +No Misra C 2012: Dir 4.4 +No Misra C 2012: Dir 4.5 +No Misra C 2012: Dir 4.6 amendment:3 +No Misra C 2012: Dir 4.7 +No Misra C 2012: Dir 4.8 +No Misra C 2012: Dir 4.9 amendment:3 +No Misra C 2012: Dir 4.10 +No Misra C 2012: Dir 4.11 amendment:3 +No Misra C 2012: Dir 4.12 +No Misra C 2012: Dir 4.13 +No Misra C 2012: Dir 4.14 amendment:2 +No Misra C 2012: Dir 4.15 amendment:3 +No Misra C 2012: Dir 5.1 amendment:4 +No Misra C 2012: Dir 5.2 amendment:4 +No Misra C 2012: Dir 5.3 amendment:4 +Yes Misra C 2012: 1.1 +Yes Misra C 2012: 1.2 +Yes Misra C 2012: 1.3 +Yes Misra C 2012: 1.4 amendment:2 +No Misra C 2012: 1.5 amendment:3 require:premium +Yes Misra C 2012: 2.1 +Yes Misra C 2012: 2.2 +Yes Misra C 2012: 2.3 +Yes Misra C 2012: 2.4 +Yes Misra C 2012: 2.5 +Yes Misra C 2012: 2.6 +Yes Misra C 2012: 2.7 +Yes Misra C 2012: 2.8 +Yes Misra C 2012: 3.1 +Yes Misra C 2012: 3.2 +Yes Misra C 2012: 4.1 +Yes Misra C 2012: 4.2 +Yes Misra C 2012: 5.1 +Yes Misra C 2012: 5.2 +Yes Misra C 2012: 5.3 +Yes Misra C 2012: 5.4 +Yes Misra C 2012: 5.5 +Yes Misra C 2012: 5.6 +Yes Misra C 2012: 5.7 +Yes Misra C 2012: 5.8 +Yes Misra C 2012: 5.9 +Yes Misra C 2012: 6.1 +Yes Misra C 2012: 6.2 +No Misra C 2012: 6.3 +Yes Misra C 2012: 7.1 +Yes Misra C 2012: 7.2 +Yes Misra C 2012: 7.3 +Yes Misra C 2012: 7.4 +No Misra C 2012: 7.5 +No Misra C 2012: 7.6 +Yes Misra C 2012: 8.1 +Yes Misra C 2012: 8.2 +No Misra C 2012: 8.3 +Yes Misra C 2012: 8.4 +Yes Misra C 2012: 8.5 +Yes Misra C 2012: 8.6 +Yes Misra C 2012: 8.7 +Yes Misra C 2012: 8.8 +Yes Misra C 2012: 8.9 +Yes Misra C 2012: 8.10 +Yes Misra C 2012: 8.11 +Yes Misra C 2012: 8.12 +Yes Misra C 2012: 8.13 +Yes Misra C 2012: 8.14 +No Misra C 2012: 8.15 +No Misra C 2012: 8.16 +No Misra C 2012: 8.17 +Yes Misra C 2012: 9.1 +Yes Misra C 2012: 9.2 +Yes Misra C 2012: 9.3 +Yes Misra C 2012: 9.4 +Yes Misra C 2012: 9.5 +No Misra C 2012: 9.6 +No Misra C 2012: 9.7 +Yes Misra C 2012: 10.1 +Yes Misra C 2012: 10.2 +Yes Misra C 2012: 10.3 +Yes Misra C 2012: 10.4 +Yes Misra C 2012: 10.5 +Yes Misra C 2012: 10.6 +Yes Misra C 2012: 10.7 +Yes Misra C 2012: 10.8 +Yes Misra C 2012: 11.1 +Yes Misra C 2012: 11.2 +Yes Misra C 2012: 11.3 +Yes Misra C 2012: 11.4 +Yes Misra C 2012: 11.5 +Yes Misra C 2012: 11.6 +Yes Misra C 2012: 11.7 +Yes Misra C 2012: 11.8 +Yes Misra C 2012: 11.9 +No Misra C 2012: 11.10 +Yes Misra C 2012: 12.1 +Yes Misra C 2012: 12.2 +Yes Misra C 2012: 12.3 +Yes Misra C 2012: 12.4 +Yes Misra C 2012: 12.5 amendment:1 +No Misra C 2012: 12.6 amendment:4 require:premium +Yes Misra C 2012: 13.1 +No Misra C 2012: 13.2 +Yes Misra C 2012: 13.3 +Yes Misra C 2012: 13.4 +Yes Misra C 2012: 13.5 +Yes Misra C 2012: 13.6 +Yes Misra C 2012: 14.1 +Yes Misra C 2012: 14.2 +Yes Misra C 2012: 14.3 +Yes Misra C 2012: 14.4 +Yes Misra C 2012: 15.1 +Yes Misra C 2012: 15.2 +Yes Misra C 2012: 15.3 +Yes Misra C 2012: 15.4 +Yes Misra C 2012: 15.5 +Yes Misra C 2012: 15.6 +Yes Misra C 2012: 15.7 +Yes Misra C 2012: 16.1 +Yes Misra C 2012: 16.2 +Yes Misra C 2012: 16.3 +Yes Misra C 2012: 16.4 +Yes Misra C 2012: 16.5 +Yes Misra C 2012: 16.6 +Yes Misra C 2012: 16.7 +Yes Misra C 2012: 17.1 +Yes Misra C 2012: 17.2 +Yes Misra C 2012: 17.3 +No Misra C 2012: 17.4 +Yes Misra C 2012: 17.5 +Yes Misra C 2012: 17.6 +Yes Misra C 2012: 17.7 +Yes Misra C 2012: 17.8 +No Misra C 2012: 17.9 +No Misra C 2012: 17.10 +No Misra C 2012: 17.11 +No Misra C 2012: 17.12 +No Misra C 2012: 17.13 +Yes Misra C 2012: 18.1 +Yes Misra C 2012: 18.2 +Yes Misra C 2012: 18.3 +Yes Misra C 2012: 18.4 +Yes Misra C 2012: 18.5 +Yes Misra C 2012: 18.6 +Yes Misra C 2012: 18.7 +Yes Misra C 2012: 18.8 +No Misra C 2012: 18.9 +No Misra C 2012: 18.10 +Yes Misra C 2012: 19.1 +Yes Misra C 2012: 19.2 +Yes Misra C 2012: 20.1 +Yes Misra C 2012: 20.2 +Yes Misra C 2012: 20.3 +Yes Misra C 2012: 20.4 +Yes Misra C 2012: 20.5 +Yes Misra C 2012: 20.6 +Yes Misra C 2012: 20.7 +Yes Misra C 2012: 20.8 +Yes Misra C 2012: 20.9 +Yes Misra C 2012: 20.10 +Yes Misra C 2012: 20.11 +Yes Misra C 2012: 20.12 +Yes Misra C 2012: 20.13 +Yes Misra C 2012: 20.14 +Yes Misra C 2012: 21.1 +Yes Misra C 2012: 21.2 +Yes Misra C 2012: 21.3 +Yes Misra C 2012: 21.4 +Yes Misra C 2012: 21.5 +Yes Misra C 2012: 21.6 +Yes Misra C 2012: 21.7 +Yes Misra C 2012: 21.8 +Yes Misra C 2012: 21.9 +Yes Misra C 2012: 21.10 +Yes Misra C 2012: 21.11 +Yes Misra C 2012: 21.12 +Yes Misra C 2012: 21.13 amendment:1 +Yes Misra C 2012: 21.14 amendment:1 +Yes Misra C 2012: 21.15 amendment:1 +Yes Misra C 2012: 21.16 amendment:1 +Yes Misra C 2012: 21.17 amendment:1 +Yes Misra C 2012: 21.18 amendment:1 +Yes Misra C 2012: 21.19 amendment:1 +Yes Misra C 2012: 21.20 amendment:1 +Yes Misra C 2012: 21.21 amendment:3 +No Misra C 2012: 21.22 amendment:3 require:premium +No Misra C 2012: 21.23 amendment:3 require:premium +No Misra C 2012: 21.24 amendment:3 require:premium +No Misra C 2012: 21.25 amendment:4 require:premium +No Misra C 2012: 21.26 amendment:4 require:premium +Yes Misra C 2012: 22.1 +Yes Misra C 2012: 22.2 +Yes Misra C 2012: 22.3 +Yes Misra C 2012: 22.4 +Yes Misra C 2012: 22.5 +Yes Misra C 2012: 22.6 +Yes Misra C 2012: 22.7 amendment:1 +Yes Misra C 2012: 22.8 amendment:1 +Yes Misra C 2012: 22.9 amendment:1 +Yes Misra C 2012: 22.10 amendment:1 +No Misra C 2012: 22.11 amendment:4 require:premium +No Misra C 2012: 22.12 amendment:4 require:premium +No Misra C 2012: 22.13 amendment:4 require:premium +No Misra C 2012: 22.14 amendment:4 require:premium +No Misra C 2012: 22.15 amendment:4 require:premium +No Misra C 2012: 22.16 amendment:4 require:premium +No Misra C 2012: 22.17 amendment:4 require:premium +No Misra C 2012: 22.18 amendment:4 require:premium +No Misra C 2012: 22.19 amendment:4 require:premium +No Misra C 2012: 22.20 amendment:4 require:premium +No Misra C 2012: 23.1 amendment:3 require:premium +No Misra C 2012: 23.2 amendment:3 require:premium +No Misra C 2012: 23.3 amendment:3 require:premium +No Misra C 2012: 23.4 amendment:3 require:premium +No Misra C 2012: 23.5 amendment:3 require:premium +No Misra C 2012: 23.6 amendment:3 require:premium +No Misra C 2012: 23.7 amendment:3 require:premium +No Misra C 2012: 23.8 amendment:3 require:premium + + +Misra C++ 2008 +-------------- +Not available, Cppcheck Premium is not used + + +Misra C++ 2023 +-------------- +Not available, Cppcheck Premium is not used diff --git a/artifacts/package_runtime/iqdbc/safety/tests/misra/coverage_table b/artifacts/package_runtime/iqdbc/safety/tests/misra/coverage_table new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/iqdbc/safety/tests/misra/install.sh b/artifacts/package_runtime/iqdbc/safety/tests/misra/install.sh new file mode 100755 index 000000000..f586fc32d --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/misra/install.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +: "${CPPCHECK_DIR:=$DIR/cppcheck/}" + +# skip if we're running in parallel with test_mutation.py +if [ ! -z "$OPENDBC_ROOT" ]; then + exit 0 +fi + +if [ ! -d "$CPPCHECK_DIR" ]; then + git clone https://github.com/danmar/cppcheck.git $CPPCHECK_DIR +fi + +cd $CPPCHECK_DIR + +VERS="2.19.1" +if [ "$(git describe --tags --always)" != "$VERS" ]; then + git fetch --all --tags --force + git checkout $VERS +fi + +#make clean +make MATCHCOMPILTER=yes CXXFLAGS="-O2" -j8 diff --git a/artifacts/package_runtime/iqdbc/safety/tests/misra/suppressions.txt b/artifacts/package_runtime/iqdbc/safety/tests/misra/suppressions.txt new file mode 100644 index 000000000..4800a270b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/misra/suppressions.txt @@ -0,0 +1,21 @@ +# Advisory: casting from void pointer to type pointer is ok. Done by STM libraries as well +misra-c2012-11.4 +# Advisory: casting from void pointer to type pointer is ok. Done by STM libraries as well +misra-c2012-11.5 +# Advisory: as stated in the Misra document, use of goto statements in accordance to 15.2 and 15.3 is ok +misra-c2012-15.1 +# Advisory: union types can be used +misra-c2012-19.2 +# Advisory: The # and ## preprocessor operators should not be used +misra-c2012-20.10 + +# needed since not all of these suppressions are applicable to all builds +unmatchedSuppression + +# All interrupt handlers are defined, including ones we don't use +unusedFunction:*/interrupt_handlers*.h + +# all of the below suppressions are from new checks introduced after updating +# cppcheck from 2.5 -> 2.13. they are listed here to separate the update from +# fixing the violations and all are intended to be removed soon after +misra-c2012-2.5 # unused macros. a few legit, rest aren't common between F4/H7 builds. should we do this in the unusedFunction pass? diff --git a/artifacts/package_runtime/iqdbc/safety/tests/misra/test_misra.sh b/artifacts/package_runtime/iqdbc/safety/tests/misra/test_misra.sh new file mode 100755 index 000000000..86be98e84 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/misra/test_misra.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +cd $DIR + +source ../../../../setup.sh + +GREEN="\e[1;32m" +YELLOW="\e[1;33m" +RED="\e[1;31m" +NC='\033[0m' + +: "${CPPCHECK_DIR:=$DIR/cppcheck/}" + +# ensure checked in coverage table is up to date +python3 $CPPCHECK_DIR/addons/misra.py -generate-table > coverage_table +if ! git diff --quiet coverage_table; then + echo -e "${YELLOW}MISRA coverage table doesn't match. Update and commit:${NC}" + exit 3 +fi + +cd $BASEDIR + +CHECKLIST=$(mktemp) +echo "Cppcheck checkers list from test_misra.sh:" > $CHECKLIST + +cppcheck() { + # get all gcc defines: arm-none-eabi-gcc -dM -E - < /dev/null + COMMON_DEFINES="-D__GNUC__=9" + + # note that cppcheck build cache results in inconsistent results as of v2.13.0 + OUTPUT=$(mktemp) + + echo -e "\n\n\n\n\nTEST variant options:" >> $CHECKLIST + echo -e ""${@//$BASEDIR/}"\n\n" >> $CHECKLIST # (absolute path removed) + + OPENDBC_ROOT=${OPENDBC_ROOT:-$BASEDIR} + $CPPCHECK_DIR/cppcheck --inline-suppr -I $OPENDBC_ROOT \ + --suppress=missingIncludeSystem \ + --suppressions-list=$DIR/suppressions.txt \ + --error-exitcode=2 --check-level=exhaustive --safety \ + --platform=arm32-wchar_t4 $COMMON_DEFINES --checkers-report=$CHECKLIST.tmp \ + --std=c11 "$@" 2>&1 | tee $OUTPUT + + cat $CHECKLIST.tmp >> $CHECKLIST + rm $CHECKLIST.tmp + # cppcheck bug: some MISRA errors won't result in the error exit code, + # so check the output (https://trac.cppcheck.net/ticket/12440#no1) + if grep -e "misra violation" -e "error" -e "style: " $OUTPUT > /dev/null; then + printf "${RED}** FAILED: MISRA violations found!${NC}\n" + exit 1 + fi +} + +OPTS=" --enable=all --enable=unusedFunction --addon=misra" + +printf "\n${GREEN}** Safety **${NC}\n" +cppcheck $OPTS $BASEDIR/iqdbc/safety/tests/misra/main.c + +printf "\n${GREEN}Success!${NC} took $SECONDS seconds\n" + +# ensure list of checkers is up to date +if [ -z "$OPENDBC_ROOT" ]; then + cd $DIR + if ! git diff --quiet $CHECKLIST; then + echo -e "\n${YELLOW}WARNING: Cppcheck checkers.txt report has changed. Review and commit...${NC}" + mv $CHECKLIST $DIR/checkers.txt + exit 4 + fi +fi diff --git a/artifacts/package_runtime/iqdbc/safety/tests/misra/test_mutation.py b/artifacts/package_runtime/iqdbc/safety/tests/misra/test_mutation.py new file mode 100644 index 000000000..295a73d50 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/misra/test_mutation.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +import os +import glob +import pytest +import shutil +import subprocess +import tempfile +import random + +HERE = os.path.abspath(os.path.dirname(__file__)) +ROOT = os.path.join(HERE, "../../../../") + +IGNORED_PATHS = ( + 'iqdbc/safety/main.c', + 'iqdbc/safety/tests/', +) + +mutations = [ + # no mutation, should pass + (None, None, lambda s: s, False), +] + +patterns = [ + ("misra-c2012-10.3", lambda s: s + "\nvoid test(float len) { for (float j = 0; j < len; j++) {;} }\n"), + ("misra-c2012-13.3", lambda s: s + "\nvoid test(int tmp) { int tmp2 = tmp++ + 2; if (tmp2) {;}}\n"), + ("misra-c2012-13.4", lambda s: s + "\nint test(int x, int y) { return (x=2) && (y=2); }\n"), + ("misra-c2012-13.5", lambda s: s + "\nvoid test(int tmp) { if (true && tmp++) {;} }\n"), + ("misra-c2012-13.6", lambda s: s + "\nvoid test(int tmp) { if (sizeof(tmp++)) {;} }\n"), + ("misra-c2012-14.2", lambda s: s + "\nvoid test(int cnt) { for (cnt=0;;cnt++) {;} }\n"), + ("misra-c2012-14.4", lambda s: s + "\nvoid test(int len) { if (len - 8) {;} }\n"), + ("misra-c2012-16.4", lambda s: s + "\nvoid test(int temp) {switch (temp) { case 1: ; }}\n"), + ("misra-c2012-20.4", lambda s: s + "\n#define auto 1\n"), + ("misra-c2012-20.5", lambda s: s + "\n#define TEST 1\n#undef TEST\n"), +] + +all_files = glob.glob('iqdbc/safety/**', root_dir=ROOT, recursive=True) +files = [f for f in all_files if f.endswith(('.c', '.h')) and not f.startswith(IGNORED_PATHS)] +assert len(files) > 20, files + +for p in patterns: + mutations.append((random.choice(files), *p, True)) + +mutations = random.sample(mutations, 2) # can remove this once cppcheck is faster + + +@pytest.mark.parametrize("fn, rule, transform, should_fail", mutations) +def test_misra_mutation(fn, rule, transform, should_fail): + with tempfile.TemporaryDirectory() as tmp: + shutil.copytree(ROOT, tmp, dirs_exist_ok=True, + ignore=shutil.ignore_patterns('.venv', 'cppcheck', '.git', '*.ctu-info', '.hypothesis')) + + # apply patch + if fn is not None: + with open(os.path.join(tmp, fn), 'r+') as f: + content = f.read() + f.seek(0) + f.write(transform(content)) + + # run test + r = subprocess.run(f"OPENDBC_ROOT={tmp} iqdbc/safety/tests/misra/test_misra.sh", + stdout=subprocess.PIPE, cwd=ROOT, shell=True, encoding='utf8') + print(r.stdout) # helpful for debugging failures + failed = r.returncode != 0 + assert failed == should_fail + if should_fail: + assert rule in r.stdout, "MISRA test failed but not for the correct violation" \ No newline at end of file diff --git a/artifacts/package_runtime/iqdbc/safety/tests/mutation.sh b/artifacts/package_runtime/iqdbc/safety/tests/mutation.sh new file mode 100755 index 000000000..3a46b0056 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/mutation.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +cd $DIR + +source $DIR/../../../setup.sh + +GIT_REF="${GIT_REF:-origin/master}" +GIT_ROOT=$(git rev-parse --show-toplevel) +cat > $GIT_ROOT/mull.yml <= (1 << (bits - 1)): + ret = d - (1 << bits) + return ret + + +def is_steering_msg(mode, param, addr): + ret = False + if mode in (CarParams.SafetyModel.hondaNidec, CarParams.SafetyModel.hondaBosch): + ret = (addr == 0xE4) or (addr == 0x194) or (addr == 0x33D) or (addr == 0x33DA) or (addr == 0x33DB) + elif mode == CarParams.SafetyModel.toyota: + ret = addr == (0x191 if param & ToyotaSafetyFlags.LTA else 0x2E4) + elif mode == CarParams.SafetyModel.gm: + ret = addr == 384 + elif mode in (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy): + ret = addr == 832 + elif mode == CarParams.SafetyModel.hyundaiCanfd: + ret = addr == (0x110 if param & HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT else + 0x50 if param & HyundaiSafetyFlags.CANFD_LKA_STEERING else + 0x12A) + elif mode == CarParams.SafetyModel.chrysler: + ret = addr == 0x292 + elif mode == CarParams.SafetyModel.subaru: + ret = addr == 0x122 + elif mode == CarParams.SafetyModel.ford: + ret = addr == 0x3d6 if param & FordSafetyFlags.CANFD else addr == 0x3d3 + elif mode == CarParams.SafetyModel.nissan: + ret = addr == 0x169 + elif mode == CarParams.SafetyModel.rivian: + ret = addr == 0x120 + elif mode == CarParams.SafetyModel.tesla: + ret = addr == 0x488 + return ret + + +def get_steer_value(mode, param, msg): + # TODO: use CANParser + torque, angle = 0, 0 + if mode in (CarParams.SafetyModel.hondaNidec, CarParams.SafetyModel.hondaBosch): + torque = (msg.data[0] << 8) | msg.data[1] + torque = to_signed(torque, 16) + elif mode == CarParams.SafetyModel.toyota: + if param & ToyotaSafetyFlags.LTA: + angle = (msg.data[1] << 8) | msg.data[2] + angle = to_signed(angle, 16) + else: + torque = (msg.data[1] << 8) | (msg.data[2]) + torque = to_signed(torque, 16) + elif mode == CarParams.SafetyModel.gm: + torque = ((msg.data[0] & 0x7) << 8) | msg.data[1] + torque = to_signed(torque, 11) + elif mode in (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy): + torque = (((msg.data[3] & 0x7) << 8) | msg.data[2]) - 1024 + elif mode == CarParams.SafetyModel.hyundaiCanfd: + torque = ((msg.data[5] >> 1) | (msg.data[6] & 0xF) << 7) - 1024 + elif mode == CarParams.SafetyModel.chrysler: + torque = (((msg.data[0] & 0x7) << 8) | msg.data[1]) - 1024 + elif mode == CarParams.SafetyModel.subaru: + torque = ((msg.data[3] & 0x1F) << 8) | msg.data[2] + torque = -to_signed(torque, 13) + elif mode == CarParams.SafetyModel.ford: + if param & FordSafetyFlags.CANFD: + angle = ((msg.data[2] << 3) | (msg.data[3] >> 5)) - 1000 + else: + angle = ((msg.data[0] << 3) | (msg.data[1] >> 5)) - 1000 + elif mode == CarParams.SafetyModel.nissan: + angle = (msg.data[0] << 10) | (msg.data[1] << 2) | (msg.data[2] >> 6) + angle = -angle + (1310 * 100) + elif mode == CarParams.SafetyModel.rivian: + torque = ((msg.data[2] << 3) | (msg.data[3] >> 5)) - 1024 + elif mode == CarParams.SafetyModel.tesla: + angle = (((msg.data[0] & 0x7F) << 8) | (msg.data[1])) - 16384 # ceil(1638.35/0.1) + return torque, angle + + +def package_can_msg(msg): + return libsafety_py.make_CANPacket(msg.address, msg.src % 4, msg.dat) + + +def init_segment(safety, msgs, mode, param): + sendcan = (msg for msg in msgs if msg.which() == 'sendcan') + steering_msgs = (can for msg in sendcan for can in msg.sendcan if is_steering_msg(mode, param, can.address)) + + msg = next(steering_msgs, None) + if msg is None: + print("no steering msgs found!") + return + + msg = package_can_msg(msg) + torque, angle = get_steer_value(mode, param, msg) + if torque != 0: + safety.set_controls_allowed(1) + safety.set_controls_allowed_lat(1) + safety.set_desired_torque_last(torque) + safety.set_rt_torque_last(torque) + safety.set_torque_meas(torque, torque) + safety.set_torque_driver(torque, torque) + elif angle != 0: + safety.set_controls_allowed(1) + safety.set_controls_allowed_lat(1) + safety.set_desired_angle_last(angle) + safety.set_angle_meas(angle, angle) + assert safety.safety_tx_hook(msg), "failed to initialize safety for segment" diff --git a/artifacts/package_runtime/iqdbc/safety/tests/safety_replay/replay_drive.py b/artifacts/package_runtime/iqdbc/safety/tests/safety_replay/replay_drive.py new file mode 100644 index 000000000..9d6781446 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/safety_replay/replay_drive.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +import argparse +import os +from collections import Counter, defaultdict +from tqdm import tqdm + +from iqdbc.safety import ALTERNATIVE_EXPERIENCE +from iqdbc.safety.tests.libsafety import libsafety_py +from iqdbc.car.carlog import carlog +from iqdbc.safety.tests.safety_replay.helpers import package_can_msg, init_segment + +# Define debug variables and their getter methods +DEBUG_VARS = { + 'lat_active': lambda safety: safety.get_lat_active(), + 'controls_allowed': lambda safety: safety.get_controls_allowed(), + 'controls_requested_lat': lambda safety: safety.get_controls_requested_lat(), + 'controls_allowed_lat': lambda safety: safety.get_controls_allowed_lat(), + 'current_disengage_reason': lambda safety: safety.aol_get_current_disengage_reason(), + 'stock_acc_main': lambda safety: safety.get_acc_main_on(), + 'aol_acc_main': lambda safety: safety.get_aol_acc_main(), +} + + +# replay a drive to check for safety violations +def replay_drive(msgs, safety_mode, param, alternative_experience, param_iq): + safety = libsafety_py.libsafety + msgs.sort(key=lambda m: m.logMonoTime) + + safety.set_current_safety_param_iq(param_iq) + err = safety.set_safety_hooks(safety_mode, param) + assert err == 0, "invalid safety mode: %d" % safety_mode + safety.set_alternative_experience(alternative_experience) + + _enable_aol = bool(alternative_experience & ALTERNATIVE_EXPERIENCE.ENABLE_AOL) + _disengage_lateral_on_brake = bool(alternative_experience & ALTERNATIVE_EXPERIENCE.AOL_DISENGAGE_LATERAL_ON_BRAKE) + _pause_lateral_on_brake = bool(alternative_experience & ALTERNATIVE_EXPERIENCE.AOL_PAUSE_LATERAL_ON_BRAKE) + safety.set_aol_params(_enable_aol, _disengage_lateral_on_brake, _pause_lateral_on_brake) + print("alternative experience:") + print(f" enable aol: {_enable_aol}") + print(f" disengage lateral on brake: {_disengage_lateral_on_brake}") + print(f" pause lateral on brake: {_pause_lateral_on_brake}") + + init_segment(safety, msgs, safety_mode, param) + + rx_tot, rx_invalid, tx_tot, tx_blocked, tx_controls, tx_controls_lat, tx_controls_blocked, tx_controls_lat_blocked, aol_mismatch = 0, 0, 0, 0, 0, 0, 0, 0, 0 + safety_tick_rx_invalid = False + blocked_addrs = Counter() + invalid_addrs = set() + + # Track last good state for each address + last_good_states = defaultdict(lambda: { + 'timestamp': None, + **{var: None for var in DEBUG_VARS} + }) + + can_msgs = [m for m in msgs if m.which() in ('can', 'sendcan')] + start_t = can_msgs[0].logMonoTime + end_t = can_msgs[-1].logMonoTime + for msg in tqdm(can_msgs): + safety.set_timer((msg.logMonoTime // 1000) % 0xFFFFFFFF) + + # skip start and end of route, warm up/down period + if msg.logMonoTime - start_t > 1e9 and end_t - msg.logMonoTime > 1e9: + safety.safety_tick_current_safety_config() + safety_tick_rx_invalid |= not safety.safety_config_valid() or safety_tick_rx_invalid + + if msg.which() == 'sendcan': + for canmsg in msg.sendcan: + _msg = package_can_msg(canmsg) + sent = safety.safety_tx_hook(_msg) + + # mismatched + if safety.get_controls_allowed() and not safety.get_controls_allowed_lat(): + aol_mismatch += 1 + print(f"controls allowed but not controls allowed lat [{aol_mismatch}]") + print(f"msg:{canmsg.address} ({hex(canmsg.address)})") + for var, getter in DEBUG_VARS.items(): + print(f" {var}: {getter(safety)}") + if not sent: + tx_blocked += 1 + tx_controls_blocked += safety.get_controls_allowed() + tx_controls_lat_blocked += safety.get_controls_allowed_lat() + blocked_addrs[canmsg.address] += 1 + + carlog.debug("blocked bus %d msg %d at %f" % (canmsg.src, canmsg.address, (msg.logMonoTime - start_t) / 1e9)) + + if "DEBUG" in os.environ: + last_good = last_good_states[canmsg.address] + print(f"\nBlocked message at {(msg.logMonoTime - start_t) / 1e9:.3f}s:") + print(f"Address: {hex(canmsg.address)} (bus {canmsg.src})") + print("Current state:") + for var, getter in DEBUG_VARS.items(): + print(f" {var}: {getter(safety)}") + + if last_good['timestamp'] is not None: + print(f"\nLast good state ({last_good['timestamp']:.3f}s):") + for var in DEBUG_VARS: + print(f" {var}: {last_good[var]}") + else: + print("\nNo previous good state found for this address") + print("-" * 80) + else: # Update last good state if message is allowed + last_good_states[canmsg.address].update({ + 'timestamp': (msg.logMonoTime - start_t) / 1e9, + **{var: getter(safety) for var, getter in DEBUG_VARS.items()} + }) + + tx_controls += safety.get_controls_allowed() + tx_controls_lat += safety.get_controls_allowed_lat() + tx_tot += 1 + elif msg.which() == 'can': + # ignore msgs we sent + for canmsg in filter(lambda m: m.src < 128, msg.can): + safety.safety_fwd_hook(canmsg.src, canmsg.address) + _msg = package_can_msg(canmsg) + recv = safety.safety_rx_hook(_msg) + if not recv: + rx_invalid += 1 + invalid_addrs.add(canmsg.address) + rx_tot += 1 + + print("\nRX") + print("total rx msgs:", rx_tot) + print("invalid rx msgs:", rx_invalid) + print("safety tick rx invalid:", safety_tick_rx_invalid) + print("invalid addrs:", invalid_addrs) + print("\nTX") + print("total openpilot msgs:", tx_tot) + print("total msgs with controls allowed:", tx_controls) + print("total msgs with controls_lat allowed:", tx_controls_lat) + print("blocked msgs:", tx_blocked) + print("blocked with controls allowed:", tx_controls_blocked) + print("blocked with controls_lat allowed:", tx_controls_lat_blocked) + print("blocked addrs:", blocked_addrs) + print("aol enabled:", safety.get_enable_aol()) + + return tx_controls_blocked == 0 and tx_controls_lat_blocked == 0 and rx_invalid == 0 and not safety_tick_rx_invalid + + +if __name__ == "__main__": + from iqpilot.tools.lib.logreader import LogReader + + parser = argparse.ArgumentParser(description="Replay CAN messages from a route or segment through a safety mode", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument("route_or_segment_name", nargs='+') + parser.add_argument("--mode", type=int, help="Override the safety mode from the log") + parser.add_argument("--param", type=int, help="Override the safety param from the log") + parser.add_argument("--alternative-experience", type=int, help="Override the alternative experience from the log") + parser.add_argument("--param-sp", type=int, help="Override the iqpilot safety param from the log") + args = parser.parse_args() + + lr = LogReader(args.route_or_segment_name[0]) + + if None in (args.mode, args.param, args.alternative_experience, args.param_iq): + CP = lr.first('carParams') + CP_IQ = lr.first('iqCarParams') + if args.mode is None: + args.mode = CP.safetyConfigs[-1].safetyModel.raw + if args.param is None: + args.param = CP.safetyConfigs[-1].safetyParam + if args.alternative_experience is None: + args.alternative_experience = CP.alternativeExperience + if args.param_iq is None: + _param_iq = CP_IQ.safetyParam if hasattr(CP_IQ, 'safetyParam') else 0 + args.param_iq = _param_iq + + print(f"replaying {args.route_or_segment_name[0]} with safety mode {args.mode}, param {args.param}, alternative experience {args.alternative_experience}, " + + f"param_iq {args.param_iq}") + replay_drive(list(lr), args.mode, args.param, args.alternative_experience, args.param_iq) diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test.sh b/artifacts/package_runtime/iqdbc/safety/tests/test.sh new file mode 100755 index 000000000..1ff4ee820 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +cd $DIR + +source ../../../setup.sh + +# reset coverage data and generate gcc note file +rm -f ./libsafety/*.gcda +scons -j$(nproc) -D + +# run safety tests and generate coverage data +pytest -n8 --ignore-glob=misra/* + +if [ "$(uname)" = "Darwin" ]; then + GCOV_EXEC="/opt/homebrew/opt/llvm@18/bin/llvm-cov gcov" +else + GCOV_EXEC="llvm-cov-18 gcov" +fi + +# generate and open report +if [ "$1" == "--report" ]; then + mkdir -p coverage-out + gcovr -r ../ --gcov-executable "$GCOV_EXEC" --html-nested coverage-out/index.html + sensible-browser coverage-out/index.html +fi + +# test coverage +GCOV="gcovr -r $DIR/../ --gcov-executable \"$GCOV_EXEC\" -d --fail-under-line=100 -e ^libsafety" +if ! GCOV_OUTPUT="$(eval $GCOV)"; then + echo -e "FAILED:\n$GCOV_OUTPUT" + exit 1 +else + echo "SUCCESS: All checked files have 100% coverage!" +fi diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_body.py b/artifacts/package_runtime/iqdbc/safety/tests/test_body.py new file mode 100644 index 000000000..428758802 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_body.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +import unittest + +from iqdbc.car.structs import CarParams +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.libsafety import libsafety_py +from iqdbc.safety.tests.common import CANPackerSafety + + +class TestBody(common.SafetyTest): + TX_MSGS = [[0x250, 0], [0x251, 0], + [0x1, 0], [0x1, 1], [0x1, 2], [0x1, 3]] + FWD_BUS_LOOKUP = {} + + def setUp(self): + self.packer = CANPackerSafety("comma_body") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.body, 0) + self.safety.init_tests() + + def _motors_data_msg(self, speed_l, speed_r): + values = {"SPEED_L": speed_l, "SPEED_R": speed_r} + return self.packer.make_can_msg_safety("MOTORS_DATA", 0, values) + + def _torque_cmd_msg(self, torque_l, torque_r): + values = {"TORQUE_L": torque_l, "TORQUE_R": torque_r} + return self.packer.make_can_msg_safety("TORQUE_CMD", 0, values) + + def _max_motor_rpm_cmd_msg(self, max_rpm_l, max_rpm_r): + values = {"MAX_RPM_L": max_rpm_l, "MAX_RPM_R": max_rpm_r} + return self.packer.make_can_msg_safety("MAX_MOTOR_RPM_CMD", 0, values) + + def test_rx_hook(self): + self.assertFalse(self.safety.get_controls_allowed()) + + # controls allowed when we get MOTORS_DATA message + self.assertTrue(self._rx(self._torque_cmd_msg(0, 0))) + self.assertFalse(self.safety.get_controls_allowed()) + + self.assertTrue(self._rx(self._motors_data_msg(0, 0))) + self.assertTrue(self.safety.get_controls_allowed()) + + def test_tx_hook(self): + self.assertFalse(self._tx(self._torque_cmd_msg(0, 0))) + self.safety.set_controls_allowed(True) + self.assertTrue(self._tx(self._torque_cmd_msg(0, 0))) + + def test_can_flasher(self): + # CAN flasher always allowed + self.safety.set_controls_allowed(False) + self.assertTrue(self._tx(common.make_msg(0, 0x1, 8))) + + # 0xdeadfaceU allowed for CAN flashing mode + self.assertTrue(self._tx(common.make_msg(0, 0x250, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0\x0a'))) + self.assertFalse(self._tx(common.make_msg(0, 0x250, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0'))) # not correct data/len + self.assertFalse(self._tx(common.make_msg(0, 0x251, dat=b'\xce\xfa\xad\xde\x1e\x0b\xb0\x0a'))) # wrong address + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_chrysler.py b/artifacts/package_runtime/iqdbc/safety/tests/test_chrysler.py new file mode 100644 index 000000000..23b4b815b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_chrysler.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +import unittest + +from iqdbc.car.chrysler.values import ChryslerSafetyFlags +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety + + +class TestChryslerSafety(common.CarSafetyTest, common.MotorTorqueSteeringSafetyTest): + TX_MSGS = [[0x23B, 0], [0x292, 0], [0x2A6, 0], [0x2D9, 0]] + RELAY_MALFUNCTION_ADDRS = {0: (0x292, 0x2A6, 0x2D9)} + FWD_BLACKLISTED_ADDRS = {2: [0x292, 0x2A6, 0x2D9]} + + MAX_RATE_UP = 3 + MAX_RATE_DOWN = 3 + MAX_TORQUE_LOOKUP = [0], [261] + MAX_RT_DELTA = 112 + MAX_TORQUE_ERROR = 80 + + LKAS_ACTIVE_VALUE = 1 + + DAS_BUS = 0 + + def setUp(self): + self.packer = CANPackerSafety("chrysler_pacifica_2017_hybrid_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.chrysler, 0) + self.safety.init_tests() + + def _button_msg(self, cancel=False, resume=False, accel=False, decel=False): + values = {"ACC_Cancel": cancel, "ACC_Resume": resume, "ACC_Accel": accel, "ACC_Decel": decel} + return self.packer.make_can_msg_safety("CRUISE_BUTTONS", self.DAS_BUS, values) + + def _pcm_status_msg(self, enable): + values = {"ACC_ACTIVE": enable} + return self.packer.make_can_msg_safety("DAS_3", self.DAS_BUS, values) + + def _speed_msg(self, speed): + values = {"SPEED_LEFT": speed, "SPEED_RIGHT": speed} + return self.packer.make_can_msg_safety("SPEED_1", 0, values) + + def _user_gas_msg(self, gas): + values = {"Accelerator_Position": gas} + return self.packer.make_can_msg_safety("ECM_5", 0, values) + + def _user_brake_msg(self, brake): + values = {"Brake_Pedal_State": 1 if brake else 0} + return self.packer.make_can_msg_safety("ESP_1", 0, values) + + def _torque_meas_msg(self, torque): + values = {"EPS_TORQUE_MOTOR": torque} + return self.packer.make_can_msg_safety("EPS_2", 0, values) + + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"STEERING_TORQUE": torque, "LKAS_CONTROL_BIT": self.LKAS_ACTIVE_VALUE if steer_req else 0} + return self.packer.make_can_msg_safety("LKAS_COMMAND", 0, values) + + def test_buttons(self): + for controls_allowed in (True, False): + self.safety.set_controls_allowed(controls_allowed) + + # resume/accel/decel only while controls allowed + self.assertEqual(controls_allowed, self._tx(self._button_msg(resume=True))) + self.assertEqual(controls_allowed, self._tx(self._button_msg(accel=True))) + self.assertEqual(controls_allowed, self._tx(self._button_msg(decel=True))) + + # can always cancel + self.assertTrue(self._tx(self._button_msg(cancel=True))) + + # invalid: more than one button pressed + combos = [ + # 2 buttons + {"cancel": True, "resume": True}, + {"cancel": True, "accel": True}, + {"cancel": True, "decel": True}, + {"resume": True, "accel": True}, + {"resume": True, "decel": True}, + {"accel": True, "decel": True}, + + # 3 buttons + {"cancel": True, "resume": True, "accel": True}, + {"cancel": True, "resume": True, "decel": True}, + {"cancel": True, "accel": True, "decel": True}, + {"resume": True, "accel": True, "decel": True}, + + # all 4 buttons + {"cancel": True, "resume": True, "accel": True, "decel": True}, + ] + + for combo in combos: + with self.subTest(combo=combo): + self.assertFalse(self._tx(self._button_msg(**combo))) + + def _lkas_button_msg(self, enabled): + values = {"TOGGLE_LKAS": enabled} + return self.packer.make_can_msg_safety("TRACTION_BUTTON", 0, values) + + +class TestChryslerRamDTSafety(TestChryslerSafety): + TX_MSGS = [[0xB1, 2], [0xA6, 0], [0xFA, 0]] + RELAY_MALFUNCTION_ADDRS = {0: (0xA6, 0xFA)} + FWD_BLACKLISTED_ADDRS = {2: [0xA6, 0xFA]} + + MAX_RATE_UP = 6 + MAX_RATE_DOWN = 6 + MAX_TORQUE_LOOKUP = [0], [350] + + DAS_BUS = 2 + + LKAS_ACTIVE_VALUE = 2 + + def setUp(self): + self.packer = CANPackerSafety("chrysler_ram_dt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.chrysler, ChryslerSafetyFlags.RAM_DT) + self.safety.init_tests() + + def _speed_msg(self, speed): + values = {"Vehicle_Speed": speed} + return self.packer.make_can_msg_safety("ESP_8", 0, values) + + def _lkas_button_msg(self, enabled): + values = {"LKAS_Button": enabled} + return self.packer.make_can_msg_safety("Center_Stack_2", 0, values) + + +class TestChryslerRamHDSafety(TestChryslerSafety): + TX_MSGS = [[0x275, 0], [0x276, 0], [0x23A, 2]] + RELAY_MALFUNCTION_ADDRS = {0: (0x276, 0x275)} + FWD_BLACKLISTED_ADDRS = {2: [0x275, 0x276]} + + MAX_TORQUE_LOOKUP = [0], [361] + MAX_RATE_UP = 14 + MAX_RATE_DOWN = 14 + MAX_RT_DELTA = 182 + + DAS_BUS = 2 + + LKAS_ACTIVE_VALUE = 2 + + def setUp(self): + self.packer = CANPackerSafety("chrysler_ram_hd_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.chrysler, ChryslerSafetyFlags.RAM_HD) + self.safety.init_tests() + + def _speed_msg(self, speed): + values = {"Vehicle_Speed": speed} + return self.packer.make_can_msg_safety("ESP_8", 0, values) + + def _lkas_button_msg(self, enabled): + values = {"LKAS_Button": enabled} + return self.packer.make_can_msg_safety("Center_Stack_2", 0, values) + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_defaults.py b/artifacts/package_runtime/iqdbc/safety/tests/test_defaults.py new file mode 100644 index 000000000..d5f22c283 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_defaults.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +import unittest + +import iqdbc.safety.tests.common as common +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py + + +class TestDefaultRxHookBase(common.SafetyTest): + FWD_BUS_LOOKUP = {} + + def test_rx_hook(self): + # default rx hook allows all msgs + for bus in range(4): + for addr in self.SCANNED_ADDRS: + self.assertTrue(self._rx(common.make_msg(bus, addr, 8)), f"failed RX {addr=}") + + +class TestNoOutput(TestDefaultRxHookBase): + TX_MSGS = [] + + def setUp(self): + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.noOutput, 0) + self.safety.init_tests() + + +class TestSilent(TestNoOutput): + """SILENT uses same hooks as NOOUTPUT""" + + def setUp(self): + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.silent, 0) + self.safety.init_tests() + + +class TestAllOutput(TestDefaultRxHookBase): + # Allow all messages + TX_MSGS = [[addr, bus] for addr in common.SafetyTest.SCANNED_ADDRS + for bus in range(4)] + + def setUp(self): + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.allOutput, 0) + self.safety.init_tests() + + def test_spam_can_buses(self): + # asserts tx allowed for all scanned addrs + for bus in range(4): + for addr in self.SCANNED_ADDRS: + should_tx = [addr, bus] in self.TX_MSGS + self.assertEqual(should_tx, self._tx(common.make_msg(bus, addr, 8)), f"allowed TX {addr=} {bus=}") + + def test_default_controls_not_allowed(self): + # controls always allowed + self.assertTrue(self.safety.get_controls_allowed()) + + def test_tx_hook_on_wrong_safety_mode(self): + # No point, since we allow all messages + pass + + +class TestAllOutputPassthrough(TestAllOutput): + FWD_BLACKLISTED_ADDRS = {} + FWD_BUS_LOOKUP = {0: 2, 2: 0} + + def setUp(self): + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.allOutput, 1) + self.safety.init_tests() + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_elm327.py b/artifacts/package_runtime/iqdbc/safety/tests/test_elm327.py new file mode 100644 index 000000000..a9d40c58a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_elm327.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +import unittest + +import iqdbc.safety.tests.common as common +from iqdbc.car.structs import CarParams +from iqdbc.safety import DLC_TO_LEN +from iqdbc.safety.tests.libsafety import libsafety_py +from iqdbc.safety.tests.test_defaults import TestDefaultRxHookBase + +GM_CAMERA_DIAG_ADDR = 0x24B + + +class TestElm327(TestDefaultRxHookBase): + TX_MSGS = [[addr, bus] for addr in [GM_CAMERA_DIAG_ADDR, *range(0x600, 0x800), + *range(0x18DA00F1, 0x18DB00F1, 0x100), # 29-bit UDS physical addressing + *[0x18DB33F1], # 29-bit UDS functional address + ] for bus in range(4)] + FWD_BUS_LOOKUP = {} + + def setUp(self): + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.elm327, 0) + self.safety.init_tests() + + def test_tx_hook(self): + # ensure we can transmit arbitrary data on allowed addresses + for bus in range(4): + for addr in self.SCANNED_ADDRS: + should_tx = [addr, bus] in self.TX_MSGS + self.assertEqual(should_tx, self._tx(common.make_msg(bus, addr, 8))) + + # ELM only allows 8 byte UDS/KWP messages under ISO 15765-4 + for msg_len in DLC_TO_LEN: + should_tx = msg_len == 8 + self.assertEqual(should_tx, self._tx(common.make_msg(0, 0x700, msg_len))) + + # TODO: perform this check for all addresses + # 4 to 15 are reserved ISO-TP frame types (https://en.wikipedia.org/wiki/ISO_15765-2) + for byte in range(0xff): + should_tx = (byte >> 4) <= 3 + self.assertEqual(should_tx, self._tx(common.make_msg(0, GM_CAMERA_DIAG_ADDR, dat=bytes([byte] * 8)))) + + # test GM camera diagnostic address with malformed length + self.assertEqual(False, self._tx(common.make_msg(0, GM_CAMERA_DIAG_ADDR, dat=bytes([0x00] * 7)))) + + def test_tx_hook_on_wrong_safety_mode(self): + # No point, since we allow many diagnostic addresses + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_ford.py b/artifacts/package_runtime/iqdbc/safety/tests/test_ford.py new file mode 100644 index 000000000..f4b6445bb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_ford.py @@ -0,0 +1,511 @@ +#!/usr/bin/env python3 +import numpy as np +import random +import unittest + +import iqdbc.safety.tests.common as common +from iqdbc.car.ford.values import FordSafetyFlags +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +from iqdbc.safety.tests.common import CANPackerSafety + +MSG_EngBrakeData = 0x165 # RX from PCM, for driver brake pedal and cruise state +MSG_EngVehicleSpThrottle = 0x204 # RX from PCM, for driver throttle input +MSG_BrakeSysFeatures = 0x415 # RX from ABS, for vehicle speed +MSG_EngVehicleSpThrottle2 = 0x202 # RX from PCM, for second vehicle speed +MSG_Yaw_Data_FD1 = 0x91 # RX from RCM, for yaw rate +MSG_Steering_Data_FD1 = 0x083 # TX by OP, various driver switches and LKAS/CC buttons +MSG_ACCDATA = 0x186 # TX by OP, ACC controls +MSG_ACCDATA_3 = 0x18A # TX by OP, ACC/TJA user interface +MSG_Lane_Assist_Data1 = 0x3CA # TX by OP, Lane Keep Assist +MSG_LateralMotionControl = 0x3D3 # TX by OP, Lateral Control message +MSG_LateralMotionControl2 = 0x3D6 # TX by OP, alternate Lateral Control message +MSG_IPMA_Data = 0x3D8 # TX by OP, IPMA and LKAS user interface + +SAFETY_ISO_LATERAL_ACCEL = 5.0 +EARTH_G = 9.81 +AVERAGE_ROAD_ROLL = 0.06 +MAX_LATERAL_ACCEL = SAFETY_ISO_LATERAL_ACCEL - (EARTH_G * AVERAGE_ROAD_ROLL) + + +def checksum(msg): + addr, dat, bus = msg + ret = bytearray(dat) + + if addr == MSG_Yaw_Data_FD1: + chksum = dat[0] + dat[1] # VehRol_W_Actl + chksum += dat[2] + dat[3] # VehYaw_W_Actl + chksum += dat[5] # VehRollYaw_No_Cnt + chksum += dat[6] >> 6 # VehRolWActl_D_Qf + chksum += (dat[6] >> 4) & 0x3 # VehYawWActl_D_Qf + chksum = 0xff - (chksum & 0xff) + ret[4] = chksum + + elif addr == MSG_BrakeSysFeatures: + chksum = dat[0] + dat[1] # Veh_V_ActlBrk + chksum += (dat[2] >> 2) & 0xf # VehVActlBrk_No_Cnt + chksum += dat[2] >> 6 # VehVActlBrk_D_Qf + chksum = 0xff - (chksum & 0xff) + ret[3] = chksum + + elif addr == MSG_EngVehicleSpThrottle2: + chksum = (dat[2] >> 3) & 0xf # VehVActlEng_No_Cnt + chksum += (dat[4] >> 5) & 0x3 # VehVActlEng_D_Qf + chksum += dat[6] + dat[7] # Veh_V_ActlEng + chksum = 0xff - (chksum & 0xff) + ret[1] = chksum + + return addr, ret, bus + + +class Buttons: + CANCEL = 0 + RESUME = 1 + TJA_TOGGLE = 2 + + +# Ford safety has four different configurations tested here: +# * CAN with openpilot longitudinal +# * CAN FD with stock longitudinal +# * CAN FD with openpilot longitudinal + +class TestFordSafetyBase(common.CarSafetyTest, common.SecondSpeedSafetyTest): + STANDSTILL_THRESHOLD = 1 + RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl, + MSG_LateralMotionControl2, MSG_IPMA_Data)} + + FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl, + MSG_LateralMotionControl2, MSG_IPMA_Data]} + + STEER_MESSAGE = 0 + + # Curvature control limits + DEG_TO_CAN = 50000 # 1 / (2e-5) rad to can + MAX_CURVATURE = 0.02 + MAX_CURVATURE_ERROR = 0.002 + CURVATURE_ERROR_MIN_SPEED = 10.0 # m/s + + ANGLE_RATE_BP = [5., 25., 25.] + ANGLE_RATE_UP = [0.00045, 0.0001, 0.0001] # windup limit + ANGLE_RATE_DOWN = [0.00045, 0.00015, 0.00015] # unwind limit + + cnt_speed = 0 + cnt_speed_2 = 0 + cnt_yaw_rate = 0 + + packer: CANPackerSafety + safety: libsafety_py.LibSafety + + def get_canfd_curvature_limits(self, speed): + # Round it in accordance with the safety + curvature_accel_limit = MAX_LATERAL_ACCEL / (max(speed, 1) ** 2) + curvature_accel_limit_lower = int(curvature_accel_limit * self.DEG_TO_CAN - 1) / self.DEG_TO_CAN + curvature_accel_limit_upper = int(curvature_accel_limit * self.DEG_TO_CAN + 1) / self.DEG_TO_CAN + return curvature_accel_limit_lower, curvature_accel_limit_upper + + def _set_prev_desired_angle(self, t): + t = round(t * self.DEG_TO_CAN) + self.safety.set_desired_angle_last(t) + + def _reset_curvature_measurement(self, curvature, speed): + for _ in range(6): + self._rx(self._speed_msg(speed)) + self._rx(self._yaw_rate_msg(curvature, speed)) + + # Driver brake pedal + def _user_brake_msg(self, brake: bool): + # brake pedal and cruise state share same message, so we have to send + # the other signal too + enable = self.safety.get_controls_allowed() + values = { + "BpedDrvAppl_D_Actl": 2 if brake else 1, + "CcStat_D_Actl": 5 if enable else 0, + } + return self.packer.make_can_msg_safety("EngBrakeData", 0, values) + + # ABS vehicle speed + def _speed_msg(self, speed: float, quality_flag=True): + values = {"Veh_V_ActlBrk": speed * 3.6, "VehVActlBrk_D_Qf": 3 if quality_flag else 0, "VehVActlBrk_No_Cnt": self.cnt_speed % 16} + self.__class__.cnt_speed += 1 + return self.packer.make_can_msg_safety("BrakeSysFeatures", 0, values, fix_checksum=checksum) + + # PCM vehicle speed + def _speed_msg_2(self, speed: float, quality_flag=True): + # Ford relies on speed for driver curvature limiting, so it checks two sources + values = {"Veh_V_ActlEng": speed * 3.6, "VehVActlEng_D_Qf": 3 if quality_flag else 0, "VehVActlEng_No_Cnt": self.cnt_speed_2 % 16} + self.__class__.cnt_speed_2 += 1 + return self.packer.make_can_msg_safety("EngVehicleSpThrottle2", 0, values, fix_checksum=checksum) + + # Standstill state + def _vehicle_moving_msg(self, speed: float): + values = {"VehStop_D_Stat": 1 if speed <= self.STANDSTILL_THRESHOLD else random.choice((0, 2, 3))} + return self.packer.make_can_msg_safety("DesiredTorqBrk", 0, values) + + # Current curvature + def _yaw_rate_msg(self, curvature: float, speed: float, quality_flag=True): + values = {"VehYaw_W_Actl": curvature * speed, "VehYawWActl_D_Qf": 3 if quality_flag else 0, + "VehRollYaw_No_Cnt": self.cnt_yaw_rate % 256} + self.__class__.cnt_yaw_rate += 1 + return self.packer.make_can_msg_safety("Yaw_Data_FD1", 0, values, fix_checksum=checksum) + + # Drive throttle input + def _user_gas_msg(self, gas: float): + values = {"ApedPos_Pc_ActlArb": gas} + return self.packer.make_can_msg_safety("EngVehicleSpThrottle", 0, values) + + # Cruise status + def _pcm_status_msg(self, enable: bool): + # brake pedal and cruise state share same message, so we have to send + # the other signal too + brake = self.safety.get_brake_pressed_prev() + values = { + "BpedDrvAppl_D_Actl": 2 if brake else 1, + "CcStat_D_Actl": 5 if enable else 0, + } + return self.packer.make_can_msg_safety("EngBrakeData", 0, values) + + # LKAS command + def _lkas_command_msg(self, action: int): + values = { + "LkaActvStats_D2_Req": action, + } + return self.packer.make_can_msg_safety("Lane_Assist_Data1", 0, values) + + # LCA command + def _lat_ctl_msg(self, enabled: bool, path_offset: float, path_angle: float, curvature: float, curvature_rate: float): + if self.STEER_MESSAGE == MSG_LateralMotionControl: + values = { + "LatCtl_D_Rq": 1 if enabled else 0, + "LatCtlPathOffst_L_Actl": path_offset, # Path offset [-5.12|5.11] meter + "LatCtlPath_An_Actl": path_angle, # Path angle [-0.5|0.5235] radians + "LatCtlCurv_NoRate_Actl": curvature_rate, # Curvature rate [-0.001024|0.00102375] 1/meter^2 + "LatCtlCurv_No_Actl": curvature, # Curvature [-0.02|0.02094] 1/meter + } + return self.packer.make_can_msg_safety("LateralMotionControl", 0, values) + elif self.STEER_MESSAGE == MSG_LateralMotionControl2: + values = { + "LatCtl_D2_Rq": 1 if enabled else 0, + "LatCtlPathOffst_L_Actl": path_offset, # Path offset [-5.12|5.11] meter + "LatCtlPath_An_Actl": path_angle, # Path angle [-0.5|0.5235] radians + "LatCtlCrv_NoRate2_Actl": curvature_rate, # Curvature rate [-0.001024|0.001023] 1/meter^2 + "LatCtlCurv_No_Actl": curvature, # Curvature [-0.02|0.02094] 1/meter + } + return self.packer.make_can_msg_safety("LateralMotionControl2", 0, values) + + # Cruise control buttons + def _acc_button_msg(self, button: int, bus: int): + values = { + "CcAslButtnCnclPress": 1 if button == Buttons.CANCEL else 0, + "CcAsllButtnResPress": 1 if button == Buttons.RESUME else 0, + "TjaButtnOnOffPress": 1 if button == Buttons.TJA_TOGGLE else 0, + } + return self.packer.make_can_msg_safety("Steering_Data_FD1", bus, values) + + def test_rx_hook(self): + # checksum, counter, and quality flag checks + for quality_flag in [True, False]: + for msg_type in ["speed", "speed_2", "yaw"]: + self.safety.set_controls_allowed(True) + # send multiple times to verify counter checks + for _ in range(10): + if msg_type == "speed": + msg = self._speed_msg(0, quality_flag=quality_flag) + elif msg_type == "speed_2": + msg = self._speed_msg_2(0, quality_flag=quality_flag) + elif msg_type == "yaw": + msg = self._yaw_rate_msg(0, 0, quality_flag=quality_flag) + + self.assertEqual(quality_flag, self._rx(msg)) + self.assertEqual(quality_flag, self.safety.get_controls_allowed()) + + # Mess with checksum to make it fail, checksum is not checked for 2nd speed + msg[0].data[3] = 0 # Speed checksum & half of yaw signal + should_rx = msg_type == "speed_2" and quality_flag + self.assertEqual(should_rx, self._rx(msg)) + self.assertEqual(should_rx, self.safety.get_controls_allowed()) + + def test_angle_measurements(self): + """Tests rx hook correctly parses the curvature measurement from the vehicle speed and yaw rate""" + for speed in np.arange(0.5, 40, 0.5): + for curvature in np.arange(0, self.MAX_CURVATURE * 2, 2e-3): + self._rx(self._speed_msg(speed)) + for c in (curvature, -curvature, 0, 0, 0, 0): + self._rx(self._yaw_rate_msg(c, speed)) + + self.assertEqual(self.safety.get_angle_meas_min(), round(-curvature * self.DEG_TO_CAN)) + self.assertEqual(self.safety.get_angle_meas_max(), round(curvature * self.DEG_TO_CAN)) + + self._rx(self._yaw_rate_msg(0, speed)) + self.assertEqual(self.safety.get_angle_meas_min(), round(-curvature * self.DEG_TO_CAN)) + self.assertEqual(self.safety.get_angle_meas_max(), 0) + + self._rx(self._yaw_rate_msg(0, speed)) + self.assertEqual(self.safety.get_angle_meas_min(), 0) + self.assertEqual(self.safety.get_angle_meas_max(), 0) + + def test_max_lateral_acceleration(self): + # Ford CAN FD can achieve a higher max lateral acceleration than CAN so we limit curvature based on speed + for speed in np.arange(0, 40, 0.5): + # Clip so we test curvature limiting at low speed due to low max curvature + _, curvature_accel_limit_upper = self.get_canfd_curvature_limits(speed) + curvature_accel_limit_upper = np.clip(curvature_accel_limit_upper, -self.MAX_CURVATURE, self.MAX_CURVATURE) + + for sign in (-1, 1): + # Test above and below the lateral by 20%, max is clipped since + # max curvature at low speed is higher than the signal max + for curvature in np.arange(curvature_accel_limit_upper * 0.8, min(curvature_accel_limit_upper * 1.2, self.MAX_CURVATURE), 1 / self.DEG_TO_CAN): + curvature = sign * round(curvature * self.DEG_TO_CAN) / self.DEG_TO_CAN # fix np rounding errors + self.safety.set_controls_allowed(True) + self._set_prev_desired_angle(curvature) + self._reset_curvature_measurement(curvature, speed) + + should_tx = abs(curvature) <= curvature_accel_limit_upper + self.assertEqual(should_tx, self._tx(self._lat_ctl_msg(True, 0, 0, curvature, 0))) + + def test_steer_allowed(self): + path_offsets = np.arange(-5.12, 5.11, 2.5).round() + path_angles = np.arange(-0.5, 0.5235, 0.25).round(1) + curvature_rates = np.arange(-0.001024, 0.00102375, 0.001).round(3) + curvatures = np.arange(-0.02, 0.02094, 0.01).round(2) + + for speed in (self.CURVATURE_ERROR_MIN_SPEED - 1, + self.CURVATURE_ERROR_MIN_SPEED + 1): + _, curvature_accel_limit_upper = self.get_canfd_curvature_limits(speed) + for controls_allowed in (True, False): + for steer_control_enabled in (True, False): + for path_offset in path_offsets: + for path_angle in path_angles: + for curvature_rate in curvature_rates: + for curvature in curvatures: + self.safety.set_controls_allowed(controls_allowed) + self._set_prev_desired_angle(curvature) + self._reset_curvature_measurement(curvature, speed) + + should_tx = path_offset == 0 and path_angle == 0 and curvature_rate == 0 + # when request bit is 0, only allow curvature of 0 since the signal range + # is not large enough to enforce it tracking measured + should_tx = should_tx and (controls_allowed if steer_control_enabled else curvature == 0) + + # Only CAN FD has the max lateral acceleration limit + if self.STEER_MESSAGE == MSG_LateralMotionControl2: + should_tx = should_tx and abs(curvature) <= curvature_accel_limit_upper + + with self.subTest(controls_allowed=controls_allowed, steer_control_enabled=steer_control_enabled, + path_offset=float(path_offset), path_angle=float(path_angle), curvature_rate=float(curvature_rate), + curvature=float(curvature)): + self.assertEqual(should_tx, self._tx(self._lat_ctl_msg(steer_control_enabled, path_offset, path_angle, curvature, curvature_rate))) + + def test_curvature_rate_limits(self): + """ + When the curvature error is exceeded, commanded curvature must start moving towards meas respecting rate limits. + Since safety allows higher rate limits to avoid false positives, we need to allow a lower rate to move towards meas. + """ + self.safety.set_controls_allowed(True) + # safety fudges the speed (1 m/s) and rate limits (1 CAN unit) to avoid false positives + small_curvature = 1 / self.DEG_TO_CAN # significant small amount of curvature to cross boundary + + for speed in np.arange(0, 40, 0.5): + curvature_accel_limit_lower, curvature_accel_limit_upper = self.get_canfd_curvature_limits(speed) + limit_command = speed > self.CURVATURE_ERROR_MIN_SPEED + # ensure our limits match the safety's rounded limits + max_delta_up = int(np.interp(speed - 1, self.ANGLE_RATE_BP, self.ANGLE_RATE_UP) * self.DEG_TO_CAN + 1) / self.DEG_TO_CAN + max_delta_up_lower = int(np.interp(speed + 1, self.ANGLE_RATE_BP, self.ANGLE_RATE_UP) * self.DEG_TO_CAN - 1) / self.DEG_TO_CAN + + max_delta_down = int(np.interp(speed - 1, self.ANGLE_RATE_BP, self.ANGLE_RATE_DOWN) * self.DEG_TO_CAN + 1 + 1e-3) / self.DEG_TO_CAN + max_delta_down_lower = int(np.interp(speed + 1, self.ANGLE_RATE_BP, self.ANGLE_RATE_DOWN) * self.DEG_TO_CAN - 1 + 1e-3) / self.DEG_TO_CAN + + up_cases = (self.MAX_CURVATURE_ERROR * 2, [ + (not limit_command, 0, 0), + (not limit_command, 0, max_delta_up_lower - small_curvature), + (True, 1e-9, max_delta_down), # TODO: safety should not allow down limits at 0 + (not limit_command, 1e-9, max_delta_up_lower), # TODO: safety should not allow down limits at 0 + (True, 0, max_delta_up_lower), + (True, 0, max_delta_up), + (False, 0, max_delta_up + small_curvature), + # stay at boundary limit + (True, self.MAX_CURVATURE_ERROR - small_curvature, self.MAX_CURVATURE_ERROR - small_curvature), + # 1 unit below boundary limit + (not limit_command, self.MAX_CURVATURE_ERROR - small_curvature * 2, self.MAX_CURVATURE_ERROR - small_curvature * 2), + # shouldn't allow command to move outside the boundary limit if last was inside + (not limit_command, self.MAX_CURVATURE_ERROR - small_curvature, self.MAX_CURVATURE_ERROR - small_curvature * 2), + ]) + + down_cases = (self.MAX_CURVATURE - self.MAX_CURVATURE_ERROR * 2, [ + (not limit_command, self.MAX_CURVATURE, self.MAX_CURVATURE), + (not limit_command, self.MAX_CURVATURE, self.MAX_CURVATURE - max_delta_down_lower + small_curvature), + (True, self.MAX_CURVATURE, self.MAX_CURVATURE - max_delta_down_lower), + (True, self.MAX_CURVATURE, self.MAX_CURVATURE - max_delta_down), + (False, self.MAX_CURVATURE, self.MAX_CURVATURE - max_delta_down - small_curvature), + ]) + + for sign in (-1, 1): + for angle_meas, cases in (up_cases, down_cases): + self._reset_curvature_measurement(sign * angle_meas, speed) + for should_tx, initial_curvature, desired_curvature in cases: + + # Only CAN FD has the max lateral acceleration limit + if self.STEER_MESSAGE == MSG_LateralMotionControl2: + if should_tx: + # can not send if the curvature is above the max lateral acceleration + should_tx = should_tx and abs(desired_curvature) <= curvature_accel_limit_upper + else: + # if desired curvature violates driver curvature error, it can only send if + # the curvature is being limited by max lateral acceleration + should_tx = should_tx or curvature_accel_limit_lower <= abs(desired_curvature) <= curvature_accel_limit_upper + + # small curvature ensures we're using up limits. at 0, safety allows down limits to allow to account for rounding errors + curvature_offset = small_curvature if initial_curvature == 0 else 0 + self._set_prev_desired_angle(sign * (curvature_offset + initial_curvature)) + self.assertEqual(should_tx, self._tx(self._lat_ctl_msg(True, 0, 0, sign * (curvature_offset + desired_curvature), 0))) + + def test_prevent_lkas_action(self): + self.safety.set_controls_allowed(1) + self.assertFalse(self._tx(self._lkas_command_msg(1))) + + self.safety.set_controls_allowed(0) + self.assertFalse(self._tx(self._lkas_command_msg(1))) + + def test_acc_buttons(self): + for allowed in (0, 1): + self.safety.set_controls_allowed(allowed) + for enabled in (True, False): + self._rx(self._pcm_status_msg(enabled)) + self.assertTrue(self._tx(self._acc_button_msg(Buttons.TJA_TOGGLE, 2))) + + for allowed in (0, 1): + self.safety.set_controls_allowed(allowed) + for bus in (0, 2): + self.assertEqual(allowed, self._tx(self._acc_button_msg(Buttons.RESUME, bus))) + + for enabled in (True, False): + self._rx(self._pcm_status_msg(enabled)) + for bus in (0, 2): + self.assertEqual(enabled, self._tx(self._acc_button_msg(Buttons.CANCEL, bus))) + + def test_enable_control_allowed_from_acc_main_on(self): + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + for main_button_msg_valid in (True, False): + with self.subTest("main_button_msg_valid", state_valid=main_button_msg_valid): + self.safety.set_aol_params(enable_aol, False, False) + self._rx(self._pcm_status_msg(main_button_msg_valid)) + self.assertEqual(enable_aol and main_button_msg_valid, self.safety.get_controls_allowed_lat()) + + +class TestFordCANFDStockSafety(TestFordSafetyBase): + STEER_MESSAGE = MSG_LateralMotionControl2 + + TX_MSGS = [ + [MSG_Steering_Data_FD1, 0], [MSG_Steering_Data_FD1, 2], [MSG_ACCDATA_3, 0], [MSG_Lane_Assist_Data1, 0], + [MSG_LateralMotionControl2, 0], [MSG_IPMA_Data, 0], + ] + RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl2, + MSG_IPMA_Data)} + + FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl2, + MSG_IPMA_Data]} + + def setUp(self): + self.packer = CANPackerSafety("ford_lincoln_base_pt") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.ford, FordSafetyFlags.CANFD) + self.safety.init_tests() + + +class TestFordLongitudinalSafetyBase(TestFordSafetyBase): + MAX_ACCEL = 2.0 # accel is used for brakes, but openpilot can set positive values + MIN_ACCEL = -3.5 + INACTIVE_ACCEL = 0.0 + + MAX_GAS = 2.0 + MIN_GAS = -0.5 + INACTIVE_GAS = -5.0 + + # ACC command + def _acc_command_msg(self, gas: float, brake: float, brake_actuation: bool, cmbb_deny: bool = False): + values = { + "AccPrpl_A_Rq": gas, # [-5|5.23] m/s^2 + "AccPrpl_A_Pred": gas, # [-5|5.23] m/s^2 + "AccBrkTot_A_Rq": brake, # [-20|11.9449] m/s^2 + "AccBrkPrchg_B_Rq": 1 if brake_actuation else 0, # Pre-charge brake request: 0=No, 1=Yes + "AccBrkDecel_B_Rq": 1 if brake_actuation else 0, # Deceleration request: 0=Inactive, 1=Active + "CmbbDeny_B_Actl": 1 if cmbb_deny else 0, # [0|1] deny AEB actuation + } + return self.packer.make_can_msg_safety("ACCDATA", 0, values) + + def test_stock_aeb(self): + # Test that CmbbDeny_B_Actl is never 1, it prevents the ABS module from actuating AEB requests from ACCDATA_2 + for controls_allowed in (True, False): + self.safety.set_controls_allowed(controls_allowed) + for cmbb_deny in (True, False): + should_tx = not cmbb_deny + self.assertEqual(should_tx, self._tx(self._acc_command_msg(self.INACTIVE_GAS, self.INACTIVE_ACCEL, controls_allowed, cmbb_deny))) + should_tx = controls_allowed and not cmbb_deny + self.assertEqual(should_tx, self._tx(self._acc_command_msg(self.MAX_GAS, self.MAX_ACCEL, controls_allowed, cmbb_deny))) + + def test_gas_safety_check(self): + for controls_allowed in (True, False): + self.safety.set_controls_allowed(controls_allowed) + for gas in np.concatenate((np.arange(self.MIN_GAS - 2, self.MAX_GAS + 2, 0.05), [self.INACTIVE_GAS])): + gas = round(gas, 2) # floats might not hit exact boundary conditions without rounding + should_tx = (controls_allowed and self.MIN_GAS <= gas <= self.MAX_GAS) or gas == self.INACTIVE_GAS + self.assertEqual(should_tx, self._tx(self._acc_command_msg(gas, self.INACTIVE_ACCEL, controls_allowed))) + + def test_brake_safety_check(self): + for controls_allowed in (True, False): + self.safety.set_controls_allowed(controls_allowed) + for brake_actuation in (True, False): + for brake in np.arange(self.MIN_ACCEL - 2, self.MAX_ACCEL + 2, 0.05): + brake = round(brake, 2) # floats might not hit exact boundary conditions without rounding + should_tx = (controls_allowed and self.MIN_ACCEL <= brake <= self.MAX_ACCEL) or brake == self.INACTIVE_ACCEL + should_tx = should_tx and (controls_allowed or not brake_actuation) + self.assertEqual(should_tx, self._tx(self._acc_command_msg(self.INACTIVE_GAS, brake, brake_actuation))) + + +class TestFordLongitudinalSafety(TestFordLongitudinalSafetyBase): + STEER_MESSAGE = MSG_LateralMotionControl + + TX_MSGS = [ + [MSG_Steering_Data_FD1, 0], [MSG_Steering_Data_FD1, 2], [MSG_ACCDATA, 0], [MSG_ACCDATA_3, 0], [MSG_Lane_Assist_Data1, 0], + [MSG_LateralMotionControl, 0], [MSG_IPMA_Data, 0], + ] + RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl, + MSG_IPMA_Data)} + + FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl, + MSG_IPMA_Data]} + + def setUp(self): + self.packer = CANPackerSafety("ford_lincoln_base_pt") + self.safety = libsafety_py.libsafety + # Make sure we enforce long safety even without long flag for CAN + self.safety.set_safety_hooks(CarParams.SafetyModel.ford, 0) + self.safety.init_tests() + + def test_max_lateral_acceleration(self): + # CAN does not limit curvature from lateral acceleration + pass + + +class TestFordCANFDLongitudinalSafety(TestFordLongitudinalSafetyBase): + STEER_MESSAGE = MSG_LateralMotionControl2 + + TX_MSGS = [ + [MSG_Steering_Data_FD1, 0], [MSG_Steering_Data_FD1, 2], [MSG_ACCDATA, 0], [MSG_ACCDATA_3, 0], [MSG_Lane_Assist_Data1, 0], + [MSG_LateralMotionControl2, 0], [MSG_IPMA_Data, 0], + ] + RELAY_MALFUNCTION_ADDRS = {0: (MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl2, + MSG_IPMA_Data)} + + FWD_BLACKLISTED_ADDRS = {2: [MSG_ACCDATA, MSG_ACCDATA_3, MSG_Lane_Assist_Data1, MSG_LateralMotionControl2, + MSG_IPMA_Data]} + + def setUp(self): + self.packer = CANPackerSafety("ford_lincoln_base_pt") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.ford, FordSafetyFlags.LONG_CONTROL | FordSafetyFlags.CANFD) + self.safety.init_tests() + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_gm.py b/artifacts/package_runtime/iqdbc/safety/tests/test_gm.py new file mode 100644 index 000000000..705bd3fbb --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_gm.py @@ -0,0 +1,254 @@ +#!/usr/bin/env python3 +import unittest + +from iqdbc.car.gm.values import GMSafetyFlags +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety + +# GM_PARAM_IQ_NON_ACC in safety/modes/gm.h (IQ safety framework flag) +GM_PARAM_IQ_NON_ACC = 1 + + +class Buttons: + UNPRESS = 1 + RES_ACCEL = 2 + DECEL_SET = 3 + CANCEL = 6 + + +class GmLongitudinalBase(common.CarSafetyTest, common.LongitudinalGasBrakeSafetyTest): + + RELAY_MALFUNCTION_ADDRS = {0: (0x180, 0x2CB), 2: (0x184,)} # ASCMLKASteeringCmd, ASCMGasRegenCmd, PSCMStatus + + MAX_POSSIBLE_BRAKE = 2 ** 12 + MAX_BRAKE = 400 + + MAX_POSSIBLE_GAS = 4000 # reasonably excessive limits, not signal max + MIN_POSSIBLE_GAS = -4000 + + PCM_CRUISE = False # openpilot can control the PCM state if longitudinal + + def _send_brake_msg(self, brake): + values = {"FrictionBrakeCmd": -brake} + return self.packer_chassis.make_can_msg_safety("EBCMFrictionBrakeCmd", self.BRAKE_BUS, values) + + def _send_gas_msg(self, gas): + values = {"GasRegenCmd": gas} + return self.packer.make_can_msg_safety("ASCMGasRegenCmd", 0, values) + + # override these tests from CarSafetyTest, GM longitudinal uses button enable + def _pcm_status_msg(self, enable): + raise NotImplementedError + + def test_disable_control_allowed_from_cruise(self): + pass + + def test_enable_control_allowed_from_cruise(self): + pass + + def test_cruise_engaged_prev(self): + pass + + def test_set_resume_buttons(self): + """ + SET and RESUME enter controls allowed on their falling and rising edges, respectively. + """ + for btn_prev in range(8): + for btn_cur in range(8): + with self.subTest(btn_prev=btn_prev, btn_cur=btn_cur): + self._rx(self._button_msg(btn_prev)) + self.safety.set_controls_allowed(0) + for _ in range(10): + self._rx(self._button_msg(btn_cur)) + + should_enable = btn_cur != Buttons.DECEL_SET and btn_prev == Buttons.DECEL_SET + should_enable = should_enable or (btn_cur == Buttons.RES_ACCEL and btn_prev != Buttons.RES_ACCEL) + should_enable = should_enable and btn_cur != Buttons.CANCEL + self.assertEqual(should_enable, self.safety.get_controls_allowed()) + + def test_cancel_button(self): + self.safety.set_controls_allowed(1) + self._rx(self._button_msg(Buttons.CANCEL)) + self.assertFalse(self.safety.get_controls_allowed()) + + +class TestGmSafetyBase(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest): + STANDSTILL_THRESHOLD = 10 * 0.0311 + # Ensures ASCM is off on ASCM cars, and relay is not malfunctioning for camera-ACC cars + RELAY_MALFUNCTION_ADDRS = {0: (0x180,), 2: (0x184,)} # ASCMLKASteeringCmd, PSCMStatus + BUTTONS_BUS = 0 # rx or tx + BRAKE_BUS = 0 # tx only + + MAX_RATE_UP = 10 + MAX_RATE_DOWN = 15 + MAX_TORQUE_LOOKUP = [0], [300] + MAX_RT_DELTA = 128 + DRIVER_TORQUE_ALLOWANCE = 65 + DRIVER_TORQUE_FACTOR = 4 + + PCM_CRUISE = True # openpilot is tied to the PCM state if not longitudinal + + EXTRA_SAFETY_PARAM = 0 + + def setUp(self): + self.packer = CANPackerSafety("gm_global_a_powertrain_generated") + self.packer_chassis = CANPackerSafety("gm_global_a_chassis") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.gm, 0) + self.safety.init_tests() + + def _pcm_status_msg(self, enable): + if self.PCM_CRUISE: + values = {"CruiseState": enable} + return self.packer.make_can_msg_safety("AcceleratorPedal2", 0, values) + else: + raise NotImplementedError + + def _speed_msg(self, speed): + values = {"%sWheelSpd" % s: speed for s in ["RL", "RR"]} + return self.packer.make_can_msg_safety("EBCMWheelSpdRear", 0, values) + + def _user_brake_msg(self, brake): + # GM safety has a brake threshold of 8 + values = {"BrakePedalPos": 8 if brake else 0} + return self.packer.make_can_msg_safety("ECMAcceleratorPos", 0, values) + + def _user_gas_msg(self, gas): + values = {"AcceleratorPedal2": 1 if gas else 0} + if self.PCM_CRUISE: + # Fill CruiseState with expected value if the safety mode reads cruise state from gas msg + values["CruiseState"] = self.safety.get_controls_allowed() + return self.packer.make_can_msg_safety("AcceleratorPedal2", 0, values) + + def _torque_driver_msg(self, torque): + # Safety tests assume driver torque is an int, use DBC factor + values = {"LKADriverAppldTrq": torque * 0.01} + return self.packer.make_can_msg_safety("PSCMStatus", 0, values) + + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"LKASteeringCmd": torque, "LKASteeringCmdActive": steer_req} + return self.packer.make_can_msg_safety("ASCMLKASteeringCmd", 0, values) + + def _button_msg(self, buttons): + values = {"ACCButtons": buttons} + return self.packer.make_can_msg_safety("ASCMSteeringButton", self.BUTTONS_BUS, values) + + +class TestGmEVSafetyBase(TestGmSafetyBase): + EXTRA_SAFETY_PARAM = GMSafetyFlags.EV + + # existence of _user_regen_msg adds regen tests + def _user_regen_msg(self, regen): + values = {"RegenPaddle": 2 if regen else 0} + return self.packer.make_can_msg_safety("EBCMRegenPaddle", 0, values) + + +class TestGmAscmSafety(GmLongitudinalBase, TestGmSafetyBase): + TX_MSGS = [[0x180, 0], [0x409, 0], [0x40A, 0], [0x2CB, 0], [0x370, 0], # pt bus + [0xA1, 1], [0x306, 1], [0x308, 1], [0x310, 1], # obs bus + [0x315, 2]] # ch bus + FWD_BLACKLISTED_ADDRS: dict[int, list[int]] = {} + RELAY_MALFUNCTION_ADDRS = {0: (0x180, 0x2CB)} # ASCMLKASteeringCmd, ASCMGasRegenCmd + FWD_BUS_LOOKUP: dict[int, int] = {} + BRAKE_BUS = 2 + + MAX_GAS = 1018 + MIN_GAS = -650 # maximum regen + INACTIVE_GAS = -650 + + def setUp(self): + self.packer = CANPackerSafety("gm_global_a_powertrain_generated") + self.packer_chassis = CANPackerSafety("gm_global_a_chassis") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.gm, self.EXTRA_SAFETY_PARAM) + self.safety.init_tests() + + +class TestGmAscmEVSafety(TestGmAscmSafety, TestGmEVSafetyBase): + pass + + +class TestGmCameraSafetyBase(TestGmSafetyBase): + def _user_brake_msg(self, brake): + values = {"BrakePressed": brake} + return self.packer.make_can_msg_safety("ECMEngineStatus", 0, values) + + +class TestGmCameraSafety(TestGmCameraSafetyBase): + TX_MSGS = [[0x180, 0], # pt bus + [0x184, 2]] # camera bus + FWD_BLACKLISTED_ADDRS = {2: [0x180], 0: [0x184]} # block LKAS message and PSCMStatus + BUTTONS_BUS = 2 # tx only + + def setUp(self): + self.packer = CANPackerSafety("gm_global_a_powertrain_generated") + self.packer_chassis = CANPackerSafety("gm_global_a_chassis") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.gm, GMSafetyFlags.HW_CAM | self.EXTRA_SAFETY_PARAM) + self.safety.init_tests() + + def test_buttons(self): + # Only CANCEL button is allowed while cruise is enabled + self.safety.set_controls_allowed(0) + for btn in range(8): + self.assertFalse(self._tx(self._button_msg(btn))) + + self.safety.set_controls_allowed(1) + for btn in range(8): + self.assertFalse(self._tx(self._button_msg(btn))) + + for enabled in (True, False): + self._rx(self._pcm_status_msg(enabled)) + self.assertEqual(enabled, self._tx(self._button_msg(Buttons.CANCEL))) + + +class TestGmCameraEVSafety(TestGmCameraSafety, TestGmEVSafetyBase): + pass + + +class TestGmCameraLongitudinalSafety(GmLongitudinalBase, TestGmCameraSafetyBase): + TX_MSGS = [[0x180, 0], [0x315, 0], [0x2CB, 0], [0x370, 0], # pt bus + [0x184, 2]] # camera bus + FWD_BLACKLISTED_ADDRS = {2: [0x180, 0x2CB, 0x370, 0x315], 0: [0x184]} # block LKAS, ACC messages and PSCMStatus + RELAY_MALFUNCTION_ADDRS = {0: (0x180, 0x2CB, 0x370, 0x315), 2: (0x184,)} + BUTTONS_BUS = 0 # rx only + + MAX_GAS = 1346 + MIN_GAS = -540 # maximum regen + INACTIVE_GAS = -500 + + def setUp(self): + self.packer = CANPackerSafety("gm_global_a_powertrain_generated") + self.packer_chassis = CANPackerSafety("gm_global_a_chassis") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.gm, GMSafetyFlags.HW_CAM | GMSafetyFlags.HW_CAM_LONG | self.EXTRA_SAFETY_PARAM) + self.safety.init_tests() + + +class TestGmCameraLongitudinalEVSafety(TestGmCameraLongitudinalSafety, TestGmEVSafetyBase): + pass + + +class TestGmCameraNonACCSafety(TestGmCameraSafety): + + def setUp(self): + self.packer = CANPackerSafety("gm_global_a_powertrain_generated") + self.packer_chassis = CANPackerSafety("gm_global_a_chassis") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(GM_PARAM_IQ_NON_ACC) + self.safety.set_safety_hooks(CarParams.SafetyModel.gm, GMSafetyFlags.HW_CAM | self.EXTRA_SAFETY_PARAM) + self.safety.init_tests() + + def _pcm_status_msg(self, enable): + values = {"CruiseActive": enable} + return self.packer.make_can_msg_safety("ECMCruiseControl", 0, values) + + +class TestGmCameraEVNonACCSafety(TestGmCameraNonACCSafety, TestGmEVSafetyBase): + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_honda.py b/artifacts/package_runtime/iqdbc/safety/tests/test_honda.py new file mode 100644 index 000000000..372a06a75 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_honda.py @@ -0,0 +1,799 @@ +#!/usr/bin/env python3 +import unittest +import numpy as np + +from iqdbc.car.honda.values import HondaSafetyFlags +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.common import CANPackerSafety, MAX_WRONG_COUNTERS +from iqdbc.safety.tests.gas_interceptor_common import GasInterceptorSafetyTest + +from iqdbc.lvbs.car.honda.iq_values import HondaSafetyFlagsIQ + +HONDA_N_COMMON_TX_MSGS = [[0xE4, 0], [0x194, 0], [0x1FA, 0], [0x30C, 0], [0x33D, 0]] + + +class Btn: + NONE = 0 + MAIN = 1 + CANCEL = 2 + SET = 3 + RESUME = 4 + +# Honda safety has several different configurations tested here: +# * Nidec +# * normal (PCM-enable) +# * alt SCM messages (PCM-enable) +# * gas interceptor (button-enable) +# * gas interceptor with alt SCM messages (button-enable) +# * Bosch +# * Bosch with Longitudinal Support +# * Bosch Radarless +# * Bosch Radarless with Longitudinal Support +# * Bosch CANFD +# * Bosch CANFD with Longitudinal Support + + +class HondaButtonEnableBase(common.CarSafetyTest): + + # override these inherited tests since we're using button enable + def test_disable_control_allowed_from_cruise(self): + pass + + def test_enable_control_allowed_from_cruise(self): + pass + + def test_cruise_engaged_prev(self): + pass + + def test_buttons_with_main_off(self): + for btn in (Btn.SET, Btn.RESUME, Btn.CANCEL): + self.safety.set_controls_allowed(1) + self._rx(self._acc_state_msg(False)) + self._rx(self._button_msg(btn, main_on=False)) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_set_resume_buttons(self): + """ + Both SET and RES should enter controls allowed on their falling edge. + """ + for main_on in (True, False): + self._rx(self._acc_state_msg(main_on)) + for btn_prev in range(8): + for btn_cur in range(8): + self._rx(self._button_msg(Btn.NONE)) + self.safety.set_controls_allowed(0) + for _ in range(10): + self._rx(self._button_msg(btn_prev)) + self.assertFalse(self.safety.get_controls_allowed()) + + # should enter controls allowed on falling edge and not transitioning to cancel or main + should_enable = (main_on and + btn_cur != btn_prev and + btn_prev in (Btn.RESUME, Btn.SET) and + btn_cur not in (Btn.CANCEL, Btn.MAIN)) + + self._rx(self._button_msg(btn_cur, main_on=main_on)) + self.assertEqual(should_enable, self.safety.get_controls_allowed(), msg=f"{main_on=} {btn_prev=} {btn_cur=}") + + def test_main_cancel_buttons(self): + """ + Both MAIN and CANCEL should exit controls immediately. + """ + for btn in (Btn.MAIN, Btn.CANCEL): + self.safety.set_controls_allowed(1) + self._rx(self._button_msg(btn, main_on=True)) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_disengage_on_main(self): + self.safety.set_controls_allowed(1) + self._rx(self._acc_state_msg(True)) + self.assertTrue(self.safety.get_controls_allowed()) + self._rx(self._acc_state_msg(False)) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_rx_hook(self): + + # TODO: move this test to common + # checksum checks + for msg_type in ["btn", "gas", "speed"]: + self.safety.set_controls_allowed(1) + if msg_type == "btn": + msg = self._button_msg(Btn.SET) + if msg_type == "gas": + msg = self._user_gas_msg(0) + if msg_type == "speed": + msg = self._speed_msg(0) + self.assertTrue(self._rx(msg)) + if msg_type != "btn": + msg[0].data[4] = 0 # invalidate checksum + msg[0].data[5] = 0 + msg[0].data[6] = 0 + msg[0].data[7] = 0 + self.assertFalse(self._rx(msg)) + self.assertFalse(self.safety.get_controls_allowed()) + + # counter + # reset wrong_counters to zero by sending valid messages + for i in range(MAX_WRONG_COUNTERS + 1): + self.__class__.cnt_speed += 1 + self.__class__.cnt_button += 1 + self.__class__.cnt_powertrain_data += 1 + if i < MAX_WRONG_COUNTERS: + self.safety.set_controls_allowed(1) + self._rx(self._button_msg(Btn.SET)) + self._rx(self._speed_msg(0)) + self._rx(self._user_gas_msg(0)) + else: + self.assertFalse(self._rx(self._button_msg(Btn.SET))) + self.assertFalse(self._rx(self._speed_msg(0))) + self.assertFalse(self._rx(self._user_gas_msg(0))) + self.assertFalse(self.safety.get_controls_allowed()) + + # restore counters for future tests with a couple of good messages + for _ in range(2): + self.safety.set_controls_allowed(1) + self._rx(self._button_msg(Btn.SET, main_on=True)) + self._rx(self._speed_msg(0)) + self._rx(self._user_gas_msg(0)) + self._rx(self._button_msg(Btn.SET, main_on=True)) + self.assertTrue(self.safety.get_controls_allowed()) + + +class HondaPcmEnableBase(common.CarSafetyTest): + + def test_buttons(self): + """ + Buttons should only cancel in this configuration, + since our state is tied to the PCM's cruise state. + """ + for controls_allowed in (True, False): + for main_on in (True, False): + # not a valid state + if controls_allowed and not main_on: + continue + + for btn in (Btn.SET, Btn.RESUME, Btn.CANCEL): + self.safety.set_controls_allowed(controls_allowed) + self._rx(self._acc_state_msg(main_on)) + + # btn + none for falling edge + self._rx(self._button_msg(btn, main_on=main_on)) + self._rx(self._button_msg(Btn.NONE, main_on=main_on)) + + if btn == Btn.CANCEL: + self.assertFalse(self.safety.get_controls_allowed()) + else: + self.assertEqual(controls_allowed, self.safety.get_controls_allowed()) + + +class HondaBase(common.CarSafetyTest): + MAX_BRAKE = 255 + PT_BUS: int | None = None # must be set when inherited + STEER_BUS: int | None = None # must be set when inherited + BUTTONS_BUS: int | None = None # must be set when inherited, tx on this bus, rx on PT_BUS + + RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x194)} # STEERING_CONTROL + + cnt_speed = 0 + cnt_button = 0 + cnt_brake = 0 + cnt_powertrain_data = 0 + cnt_acc_state = 0 + + def _powertrain_data_msg(self, cruise_on=None, brake_pressed=None, gas_pressed=None): + # preserve the state + if cruise_on is None: + # or'd with controls allowed since the tests use it to "enable" cruise + cruise_on = self.safety.get_cruise_engaged_prev() or self.safety.get_controls_allowed() + if brake_pressed is None: + brake_pressed = self.safety.get_brake_pressed_prev() + if gas_pressed is None: + gas_pressed = self.safety.get_gas_pressed_prev() + + values = { + "ACC_STATUS": cruise_on, + "BRAKE_PRESSED": brake_pressed, + "PEDAL_GAS": gas_pressed, + "COUNTER": self.cnt_powertrain_data % 4 + } + self.__class__.cnt_powertrain_data += 1 + return self.packer.make_can_msg_safety("POWERTRAIN_DATA", self.PT_BUS, values) + + def _pcm_status_msg(self, enable): + return self._powertrain_data_msg(cruise_on=enable) + + def _speed_msg(self, speed): + values = {"XMISSION_SPEED": speed, "COUNTER": self.cnt_speed % 4} + self.__class__.cnt_speed += 1 + return self.packer.make_can_msg_safety("ENGINE_DATA", self.PT_BUS, values) + + def _acc_state_msg(self, main_on): + values = {"MAIN_ON": main_on, "COUNTER": self.cnt_acc_state % 4} + self.__class__.cnt_acc_state += 1 + return self.packer.make_can_msg_safety("SCM_FEEDBACK", self.PT_BUS, values) + + def _button_msg(self, buttons, main_on=False, bus=None): + bus = self.PT_BUS if bus is None else bus + values = {"CRUISE_BUTTONS": buttons, "COUNTER": self.cnt_button % 4} + self.__class__.cnt_button += 1 + return self.packer.make_can_msg_safety("SCM_BUTTONS", bus, values) + + def _user_brake_msg(self, brake): + return self._powertrain_data_msg(brake_pressed=brake) + + def _user_gas_msg(self, gas): + return self._powertrain_data_msg(gas_pressed=gas) + + def _send_steer_msg(self, steer): + values = {"STEER_TORQUE": steer} + return self.packer.make_can_msg_safety("STEERING_CONTROL", self.STEER_BUS, values) + + def _send_brake_msg(self, brake): + # must be implemented when inherited + raise NotImplementedError + + def test_disengage_on_brake(self): + self.safety.set_controls_allowed(1) + self._rx(self._user_brake_msg(1)) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_steer_safety_check(self): + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._send_steer_msg(0x0000))) + self.assertFalse(self._tx(self._send_steer_msg(0x1000))) + + def _lkas_button_msg(self, lkas_button=False, setting_btn=0): + values = {"CRUISE_SETTING": 1 if lkas_button else setting_btn, "COUNTER": self.cnt_button % 4} + self.__class__.cnt_button += 1 + return self.packer.make_can_msg_safety("SCM_BUTTONS", self.PT_BUS, values) + + def test_enable_control_allowed_with_aol_button(self): + """Tests AOL button state transitions and internal button press state.""" + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + self.safety.set_aol_params(enable_aol, False, False) + + # Verify initial state + self._rx(self._lkas_button_msg(False, 0)) + self.assertEqual(0, self.safety.get_aol_button_press()) # NOT_PRESSED + self.assertFalse(self.safety.get_controls_allowed_lat()) + + # Verify press sets correct internal state + self._rx(self._lkas_button_msg(False, 1)) + self.assertEqual(1, self.safety.get_aol_button_press()) # PRESSED + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + # Verify release sets correct internal state + self._rx(self._lkas_button_msg(False, 0)) + self.assertEqual(0, self.safety.get_aol_button_press()) # NOT_PRESSED + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + # Test invalid values - should not change button press state + for invalid_setting in (2, 3): + self._rx(self._lkas_button_msg(False, invalid_setting)) + self.assertEqual(0, self.safety.get_aol_button_press()) # Should remain NOT_PRESSED + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + # Verify we can still transition after invalid values + self._rx(self._lkas_button_msg(False, 1)) + self.assertEqual(1, self.safety.get_aol_button_press()) + self._rx(self._lkas_button_msg(False, 0)) + self.assertEqual(0, self.safety.get_aol_button_press()) + + +# ********************* Honda Nidec ********************** + + +class TestHondaNidecSafetyBase(HondaBase): + TX_MSGS = HONDA_N_COMMON_TX_MSGS + FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x194, 0x33D, 0x30C]} + RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x194, 0x33D, 0x30C)} + + PT_BUS = 0 + STEER_BUS = 0 + BUTTONS_BUS = 0 + + MAX_GAS = 198 + + BRAKE_SIG = "COMPUTER_BRAKE" + + def setUp(self): + self.packer = CANPackerSafety("honda_civic_touring_2016_can_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, 0) + self.safety.init_tests() + + def _send_brake_msg(self, brake, aeb_req=0, bus=0): + values = {self.BRAKE_SIG: brake, "AEB_REQ_1": aeb_req} + return self.packer.make_can_msg_safety("BRAKE_COMMAND", bus, values) + + def _rx_brake_msg(self, brake, aeb_req=0): + return self._send_brake_msg(brake, aeb_req, bus=2) + + def _send_acc_hud_msg(self, pcm_gas, pcm_speed): + # Used to control ACC on Nidec without pedal + values = {"PCM_GAS": pcm_gas, "PCM_SPEED": pcm_speed} + return self.packer.make_can_msg_safety("ACC_HUD", 0, values) + + def test_acc_hud_safety_check(self): + for controls_allowed in [True, False]: + self.safety.set_controls_allowed(controls_allowed) + for pcm_gas in range(255): + for pcm_speed in range(100): + send = (controls_allowed and pcm_gas <= self.MAX_GAS) or (pcm_gas == 0 and pcm_speed == 0) + self.assertEqual(send, self._tx(self._send_acc_hud_msg(pcm_gas, pcm_speed))) + + def test_fwd_hook(self): + # normal operation, not forwarding AEB + self.FWD_BLACKLISTED_ADDRS[2].append(0x1FA) + self.safety.set_honda_fwd_brake(False) + super().test_fwd_hook() + + # forwarding AEB brake signal + self.FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x194, 0x33D, 0x30C]} + self.safety.set_honda_fwd_brake(True) + super().test_fwd_hook() + + def test_honda_fwd_brake_latching(self): + # Shouldn't fwd stock Honda requesting brake without AEB + self.assertTrue(self._rx(self._rx_brake_msg(self.MAX_BRAKE, aeb_req=0))) + self.assertFalse(self.safety.get_honda_fwd_brake()) + + # Now allow controls and request some brake + openpilot_brake = round(self.MAX_BRAKE / 2.0) + self.safety.set_controls_allowed(True) + self.assertTrue(self._tx(self._send_brake_msg(openpilot_brake))) + + # Still shouldn't fwd stock Honda brake until it's more than openpilot's + for stock_honda_brake in range(self.MAX_BRAKE + 1): + self.assertTrue(self._rx(self._rx_brake_msg(stock_honda_brake, aeb_req=1))) + should_fwd_brake = stock_honda_brake >= openpilot_brake + self.assertEqual(should_fwd_brake, self.safety.get_honda_fwd_brake()) + + # Shouldn't stop fwding until AEB event is over + for stock_honda_brake in range(self.MAX_BRAKE + 1)[::-1]: + self.assertTrue(self._rx(self._rx_brake_msg(stock_honda_brake, aeb_req=1))) + self.assertTrue(self.safety.get_honda_fwd_brake()) + + self.assertTrue(self._rx(self._rx_brake_msg(0, aeb_req=0))) + self.assertFalse(self.safety.get_honda_fwd_brake()) + + def test_brake_safety_check(self): + for fwd_brake in [False, True]: + self.safety.set_honda_fwd_brake(fwd_brake) + for brake in np.arange(0, self.MAX_BRAKE + 10, 1): + for controls_allowed in [True, False]: + self.safety.set_controls_allowed(controls_allowed) + if fwd_brake: + send = False # block openpilot brake msg when fwd'ing stock msg + elif controls_allowed: + send = self.MAX_BRAKE >= brake >= 0 + else: + send = brake == 0 + self.assertEqual(send, self._tx(self._send_brake_msg(brake))) + + # Inactive brake must pass when gas blocks longitudinal actuation + self.safety.set_honda_fwd_brake(False) + self.safety.set_controls_allowed(True) + self.safety.set_gas_pressed_prev(True) + self.assertFalse(self.safety.get_longitudinal_allowed()) + self.assertTrue(self._tx(self._send_brake_msg(0))) + self.assertFalse(self._tx(self._send_brake_msg(1))) + + +class TestHondaNidecPcmSafety(HondaPcmEnableBase, TestHondaNidecSafetyBase): + """ + Covers the Honda Nidec safety mode + """ + + # Nidec doesn't disengage on falling edge of cruise. See comment in safety_honda.h + def test_disable_control_allowed_from_cruise(self): + pass + + +class TestHondaNidecGasInterceptorSafety(GasInterceptorSafetyTest, HondaButtonEnableBase, TestHondaNidecSafetyBase): + """ + Covers the Honda Nidec safety mode with a gas interceptor, switches to a button-enable car + """ + + TX_MSGS = HONDA_N_COMMON_TX_MSGS + [[0x200, 0]] + INTERCEPTOR_THRESHOLD = 492 + + def setUp(self): + self.packer = CANPackerSafety("honda_civic_touring_2016_can_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(HondaSafetyFlagsIQ.GAS_INTERCEPTOR) + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, 0) + self.safety.init_tests() + + +class TestHondaNidecPcmAltSafety(TestHondaNidecPcmSafety): + """ + Covers the Honda Nidec safety mode with alt SCM messages + """ + def setUp(self): + self.packer = CANPackerSafety("acura_ilx_2016_can_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, HondaSafetyFlags.NIDEC_ALT) + self.safety.init_tests() + + def _acc_state_msg(self, main_on): + values = {"MAIN_ON": main_on, "COUNTER": self.cnt_acc_state % 4} + self.__class__.cnt_acc_state += 1 + return self.packer.make_can_msg_safety("SCM_BUTTONS", self.PT_BUS, values) + + def _button_msg(self, buttons, main_on=False, bus=None): + bus = self.PT_BUS if bus is None else bus + values = {"CRUISE_BUTTONS": buttons, "MAIN_ON": main_on, "COUNTER": self.cnt_button % 4} + self.__class__.cnt_button += 1 + return self.packer.make_can_msg_safety("SCM_BUTTONS", bus, values) + + +class TestHondaNidecAltGasInterceptorSafety(GasInterceptorSafetyTest, HondaButtonEnableBase, TestHondaNidecSafetyBase): + """ + Covers the Honda Nidec safety mode with alt SCM messages and gas interceptor, switches to a button-enable car + """ + + TX_MSGS = HONDA_N_COMMON_TX_MSGS + [[0x200, 0]] + INTERCEPTOR_THRESHOLD = 492 + + def setUp(self): + self.packer = CANPackerSafety("acura_ilx_2016_can_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(HondaSafetyFlagsIQ.GAS_INTERCEPTOR) + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, HondaSafetyFlags.NIDEC_ALT) + self.safety.init_tests() + + def _acc_state_msg(self, main_on): + values = {"MAIN_ON": main_on, "COUNTER": self.cnt_acc_state % 4} + self.__class__.cnt_acc_state += 1 + return self.packer.make_can_msg_safety("SCM_BUTTONS", self.PT_BUS, values) + + def _button_msg(self, buttons, main_on=False, bus=None): + bus = self.PT_BUS if bus is None else bus + values = {"CRUISE_BUTTONS": buttons, "MAIN_ON": main_on, "COUNTER": self.cnt_button % 4} + self.__class__.cnt_button += 1 + return self.packer.make_can_msg_safety("SCM_BUTTONS", bus, values) + + +# ********************* Honda Bosch ********************** + + +class TestHondaBoschSafetyBase(HondaBase): + PT_BUS = 1 + STEER_BUS = 0 + BUTTONS_BUS = 1 + + TX_MSGS = [[0xE4, 0], [0xE5, 0], [0x296, 1], [0x33D, 0], [0x33DA, 0], [0x33DB, 0]] + FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0xE5, 0x33D, 0x33DA, 0x33DB]} + RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0xE5, 0x33D, 0x33DA, 0x33DB)} # STEERING_CONTROL, BOSCH_SUPPLEMENTAL_1 + + def setUp(self): + self.packer = CANPackerSafety("honda_civic_hatchback_ex_2017_can_generated") + self.safety = libsafety_py.libsafety + + def _alt_brake_msg(self, brake): + values = {"BRAKE_PRESSED": brake, "COUNTER": self.cnt_brake % 4} + self.__class__.cnt_brake += 1 + return self.packer.make_can_msg_safety("BRAKE_MODULE", self.PT_BUS, values) + + def _send_brake_msg(self, brake): + pass + + def test_spam_cancel_safety_check(self): + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._button_msg(Btn.CANCEL, bus=self.BUTTONS_BUS))) + self.assertFalse(self._tx(self._button_msg(Btn.RESUME, bus=self.BUTTONS_BUS))) + self.assertFalse(self._tx(self._button_msg(Btn.SET, bus=self.BUTTONS_BUS))) + # do not block resume if we are engaged already + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._button_msg(Btn.RESUME, bus=self.BUTTONS_BUS))) + + +class TestHondaBoschAltBrakeSafetyBase(TestHondaBoschSafetyBase): + """ + Base Bosch safety test class with an alternate brake message + """ + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.ALT_BRAKE) + self.safety.init_tests() + + def _user_brake_msg(self, brake): + return self._alt_brake_msg(brake) + + def test_alt_brake_rx_hook(self): + self.safety.set_honda_alt_brake_msg(1) + self.safety.set_controls_allowed(1) + msg = self._alt_brake_msg(0) + self.assertTrue(self._rx(msg)) + msg[0].data[2] = msg[0].data[2] & 0xF0 # invalidate checksum + self.assertFalse(self._rx(msg)) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_alt_disengage_on_brake(self): + self.safety.set_honda_alt_brake_msg(1) + self.safety.set_controls_allowed(1) + self._rx(self._alt_brake_msg(1)) + self.assertFalse(self.safety.get_controls_allowed()) + + self.safety.set_honda_alt_brake_msg(0) + self.safety.set_controls_allowed(1) + self._rx(self._alt_brake_msg(1)) + self.assertTrue(self.safety.get_controls_allowed()) + + +class TestHondaBoschSafety(HondaPcmEnableBase, TestHondaBoschSafetyBase): + """ + Covers the Honda Bosch safety mode with stock longitudinal + """ + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, 0) + self.safety.init_tests() + + +class TestHondaBoschAltBrakeSafety(HondaPcmEnableBase, TestHondaBoschAltBrakeSafetyBase): + """ + Covers the Honda Bosch safety mode with stock longitudinal and an alternate brake message + """ + + +class TestHondaBoschLongSafety(HondaButtonEnableBase, TestHondaBoschSafetyBase): + """ + Covers the Honda Bosch safety mode with longitudinal control + """ + NO_GAS = -30000 + MAX_GAS = 2200 + MAX_ACCEL = 2.0 # accel is used for brakes, but openpilot can set positive values + MIN_ACCEL = -3.5 + + STEER_BUS = 1 + TX_MSGS = [[0xE4, 1], [0x1DF, 1], [0x1EF, 1], [0x1FA, 1], [0x30C, 1], [0x33D, 1], [0x33DA, 1], [0x33DB, 1], [0x39F, 1], [0x18DAB0F1, 1]] + FWD_BLACKLISTED_ADDRS = {} + # 0x1DF is to test that radar is disabled + RELAY_MALFUNCTION_ADDRS = {1: (0xE4, 0x1DF, 0x33D, 0x33DA, 0x33DB)} # STEERING_CONTROL, ACC_CONTROL + + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.BOSCH_LONG) + self.safety.init_tests() + + def _send_gas_brake_msg(self, gas, accel): + values = { + "GAS_COMMAND": gas, + "ACCEL_COMMAND": accel, + "BRAKE_REQUEST": accel < 0, + } + return self.packer.make_can_msg_safety("ACC_CONTROL", self.PT_BUS, values) + + # Longitudinal doesn't need to send buttons + def test_spam_cancel_safety_check(self): + pass + + def test_diagnostics(self): + tester_present = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x02\x3E\x80\x00\x00\x00\x00\x00") + self.assertTrue(self._tx(tester_present)) + + not_tester_present = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x03\xAA\xAA\x00\x00\x00\x00\x00") + self.assertFalse(self._tx(not_tester_present)) + + # the radar disable requests are only allowed on CANFD + ext_diag = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x02\x10\x03\x00\x00\x00\x00\x00") + self.assertFalse(self._tx(ext_diag)) + comm_control_disable = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x03\x28\x83\x03\x00\x00\x00\x00") + self.assertFalse(self._tx(comm_control_disable)) + + def test_gas_safety_check(self): + for controls_allowed in [True, False]: + for gas in np.arange(self.NO_GAS, self.MAX_GAS + 2000, 100): + accel = 0 if gas < 0 else min(gas / 1000, self.MAX_ACCEL) + self.safety.set_controls_allowed(controls_allowed) + send = (controls_allowed and 0 <= gas <= self.MAX_GAS) or gas == self.NO_GAS + self.assertEqual(send, self._tx(self._send_gas_brake_msg(gas, accel)), (controls_allowed, gas, accel)) + + def test_brake_safety_check(self): + for controls_allowed in [True, False]: + for accel in np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.01): + accel = round(accel, 2) # floats might not hit exact boundary conditions without rounding + self.safety.set_controls_allowed(controls_allowed) + send = self.MIN_ACCEL <= accel <= self.MAX_ACCEL if controls_allowed else accel == 0 + self.assertEqual(send, self._tx(self._send_gas_brake_msg(self.NO_GAS, accel)), (controls_allowed, accel)) + + +class TestHondaBoschRadarlessSafetyBase(TestHondaBoschSafetyBase): + """Base class for radarless Honda Bosch""" + PT_BUS = 0 + STEER_BUS = 0 + BUTTONS_BUS = 2 # camera controls ACC, need to send buttons on bus 2 + + TX_MSGS = [[0xE4, 0], [0x296, 2], [0x33D, 0]] + FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x33D]} + RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x33D)} # STEERING_CONTROL + + def setUp(self): + self.packer = CANPackerSafety("honda_bosch_radarless_generated") + self.safety = libsafety_py.libsafety + + +class TestHondaBoschRadarlessSafety(HondaPcmEnableBase, TestHondaBoschRadarlessSafetyBase): + """ + Covers the Honda Bosch Radarless safety mode with stock longitudinal + """ + + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.RADARLESS) + self.safety.init_tests() + + +class TestHondaBoschRadarlessAltBrakeSafety(HondaPcmEnableBase, TestHondaBoschRadarlessSafetyBase, TestHondaBoschAltBrakeSafetyBase): + """ + Covers the Honda Bosch Radarless safety mode with stock longitudinal and an alternate brake message + """ + + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.RADARLESS | HondaSafetyFlags.ALT_BRAKE) + self.safety.init_tests() + + +class TestHondaBoschRadarlessLongSafety(common.LongitudinalAccelSafetyTest, HondaButtonEnableBase, + TestHondaBoschRadarlessSafetyBase): + """ + Covers the Honda Bosch Radarless safety mode with longitudinal control + """ + TX_MSGS = [[0xE4, 0], [0x33D, 0], [0x1C8, 0], [0x30C, 0]] + FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x33D, 0x1C8, 0x30C]} + RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x1C8, 0x30C, 0x33D)} + + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.RADARLESS | HondaSafetyFlags.BOSCH_LONG) + self.safety.init_tests() + + def _accel_msg(self, accel): + values = { + "ACCEL_COMMAND": accel, + } + return self.packer.make_can_msg_safety("ACC_CONTROL", self.PT_BUS, values) + + # Longitudinal doesn't need to send buttons + def test_spam_cancel_safety_check(self): + pass + + +class TestHondaBoschCANFDSafetyBase(TestHondaBoschSafetyBase): + """Base class for CANFD Honda Bosch""" + PT_BUS = 0 + STEER_BUS = 0 + BUTTONS_BUS = 0 + + TX_MSGS = [[0xE4, 0], [0x296, 0], [0x296, 2], [0x33D, 0]] + FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x33D]} + RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x33D)} + + def setUp(self): + self.packer = CANPackerSafety("honda_common_canfd_generated") + self.safety = libsafety_py.libsafety + + def test_buttons_fwd(self): + # SCM_BUTTONS (0x296) forwards to the camera unless OP's replacement button stream is flowing + # (engaged + a recent OP SCM_BUTTONS tx on the camera bus); see the radarless variant of this test + self.safety.set_controls_allowed(True) + self.assertEqual(2, self.safety.safety_fwd_hook(0, 0x296)) + + self.assertTrue(self._tx(self._button_msg(Btn.NONE, bus=2))) + self.assertEqual(-1, self.safety.safety_fwd_hook(0, 0x296)) + + self.safety.set_controls_allowed(False) + self.assertEqual(2, self.safety.safety_fwd_hook(0, 0x296)) + + self.safety.set_controls_allowed(True) + for _ in range(10): + self._rx(self._button_msg(Btn.NONE, main_on=True)) + self.assertEqual(2, self.safety.safety_fwd_hook(0, 0x296)) + + def test_radar_diag_response_fwd(self): + # the radar's UDS responses (0x18DAF1B0) never forward to the camera: the radar disable handshake + # happens after the relay is open on CAN FD + self.safety.set_controls_allowed(False) + self.assertEqual(-1, self.safety.safety_fwd_hook(0, 0x18DAF1B0)) + self.safety.set_controls_allowed(True) + self.assertEqual(-1, self.safety.safety_fwd_hook(0, 0x18DAF1B0)) + + def test_buttons_tx_camera_bus(self): + # Buttons to the camera (bus 2): cancel-only while disengaged, any button while engaged + # (OP takes over SCM_BUTTONS towards the camera when engaged) + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._button_msg(Btn.CANCEL, bus=2))) + self.assertFalse(self._tx(self._button_msg(Btn.RESUME, bus=2))) + self.assertFalse(self._tx(self._button_msg(Btn.SET, bus=2))) + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._button_msg(Btn.NONE, bus=2))) + self.assertTrue(self._tx(self._button_msg(Btn.RESUME, bus=2))) + + +class TestHondaBoschCANFDSafety(HondaPcmEnableBase, TestHondaBoschCANFDSafetyBase): + """ + Covers the Honda Bosch CANFD safety mode with stock longitudinal + """ + + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.BOSCH_CANFD) + self.safety.init_tests() + + +class TestHondaBoschCANFDAltBrakeSafety(HondaPcmEnableBase, TestHondaBoschCANFDSafetyBase, TestHondaBoschAltBrakeSafetyBase): + """ + Covers the Honda Bosch CANFD safety mode with stock longitudinal and an alternate brake message + """ + + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.BOSCH_CANFD | HondaSafetyFlags.ALT_BRAKE) + self.safety.init_tests() + + +class TestHondaBoschCANFDLongSafety(TestHondaBoschLongSafety, TestHondaBoschCANFDSafetyBase): + """ + Covers the Honda Bosch CANFD safety mode with longitudinal control + """ + + PT_BUS = 0 + STEER_BUS = 0 + BUTTONS_BUS = 0 + + # the radar look-alikes are sent on both the powertrain bus (0) and the camera bus (2) + TX_MSGS = [[0xE4, 0], [0x1DF, 0], [0x1EF, 0], [0x30C, 0], [0x33D, 0], [0x39F, 0], [0x296, 2], [0x18DAB0F1, 0], + [0x310, 0], [0x6CD5558, 0], [0x6CD5559, 0], [0xF31AA52, 0], [0xF31AA5C, 0], [0x1A45AA4E, 0], + [0x310, 2], [0x6CD5558, 2], [0x6CD5559, 2], [0xF31AA52, 2], [0xF31AA5C, 2], [0x1A45AA4E, 2]] + FWD_BLACKLISTED_ADDRS = {0: [0x6CD5558, 0xF31AA5C], 2: [0xE4, 0x1DF, 0x33D, 0x6CD5558, 0xF31AA5C]} + # STEERING_CONTROL, ACC_CONTROL, LKAS_HUD on the pt bus; the radar's LANE_PATH and RADAR_LEAD are + # additionally blocked from forwarding to the camera in both directions + RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x1DF, 0x33D, 0x6CD5558, 0xF31AA5C), 2: (0x6CD5558, 0xF31AA5C)} + + def setUp(self): + super().setUp() + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaBosch, HondaSafetyFlags.BOSCH_CANFD | HondaSafetyFlags.BOSCH_LONG) + self.safety.init_tests() + + def test_diagnostics(self): + # CAN FD silences the radar from CarController after the relay opens, so exactly the extended + # diagnostic session and the suppressed-response CommunicationControl disable are allowed too + tester_present = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x02\x3E\x80\x00\x00\x00\x00\x00") + self.assertTrue(self._tx(tester_present)) + ext_diag = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x02\x10\x03\x00\x00\x00\x00\x00") + self.assertTrue(self._tx(ext_diag)) + comm_control_disable = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x03\x28\x83\x03\x00\x00\x00\x00") + self.assertTrue(self._tx(comm_control_disable)) + + # anything else stays blocked, including re-enabling the radar and non-zero trailing bytes + comm_control_enable = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x03\x28\x80\x03\x00\x00\x00\x00") + self.assertFalse(self._tx(comm_control_enable)) + not_tester_present = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x03\xAA\xAA\x00\x00\x00\x00\x00") + self.assertFalse(self._tx(not_tester_present)) + trailing_bytes = libsafety_py.make_CANPacket(0x18DAB0F1, self.PT_BUS, b"\x02\x10\x03\x00\x00\x00\x00\x01") + self.assertFalse(self._tx(trailing_bytes)) + + +class TestHondaNidecHybridSafety(TestHondaNidecPcmSafety): + """ + Covers the Honda Nidec safety mode with hybrid brake + """ + + BRAKE_SIG = "COMPUTER_BRAKE_HYBRID" + + def setUp(self): + self.packer = CANPackerSafety("honda_clarity_hybrid_2018_can_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(HondaSafetyFlagsIQ.NIDEC_HYBRID) + self.safety.set_safety_hooks(CarParams.SafetyModel.hondaNidec, 0) + self.safety.init_tests() + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai.py b/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai.py new file mode 100644 index 000000000..398d03a0b --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai.py @@ -0,0 +1,107 @@ +import pytest + +from iqdbc.car.hyundai.values import HyundaiSafetyFlags +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.hyundai_common import TESTER_PRESENT, classic_accel, classic_steer, packet +from iqdbc.safety.tests.libsafety import libsafety_py + + +@pytest.fixture +def safety(): + return libsafety_py.libsafety + + +@pytest.mark.parametrize("mode", (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy)) +@pytest.mark.parametrize("param", ( + 0, + HyundaiSafetyFlags.EV_GAS, + HyundaiSafetyFlags.HYBRID_GAS, + HyundaiSafetyFlags.LONG, + HyundaiSafetyFlags.CAMERA_SCC, + HyundaiSafetyFlags.ALT_LIMITS, + HyundaiSafetyFlags.FCEV_GAS, + HyundaiSafetyFlags.ALT_LIMITS_2, +)) +def test_classic_safety_configurations_initialize(safety, mode, param): + assert safety.set_safety_hooks(mode, param) == 0 + safety.init_tests() + assert safety.get_current_safety_param() == param + + +@pytest.mark.parametrize("mode", (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy)) +def test_classic_tx_whitelist_and_steering_limits(safety, mode): + safety.set_safety_hooks(mode, 0) + safety.init_tests() + + assert not safety.safety_tx_hook(packet(0x123, 0, 8)) + assert not safety.safety_tx_hook(packet(0x340, 1, 8)) + + safety.set_controls_allowed(False) + assert safety.safety_tx_hook(classic_steer(0, False)) + assert not safety.safety_tx_hook(classic_steer(1)) + + safety.set_controls_allowed(True) + assert safety.safety_tx_hook(classic_steer(10)) + safety.set_desired_torque_last(512) + safety.set_rt_torque_last(512) + assert safety.safety_tx_hook(classic_steer(512)) + assert not safety.safety_tx_hook(classic_steer(513)) + assert not safety.safety_tx_hook(classic_steer(-513)) + + +def test_classic_alt_limits_2(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.ALT_LIMITS_2) + safety.init_tests() + safety.set_controls_allowed(True) + safety.set_desired_torque_last(170) + safety.set_rt_torque_last(170) + assert safety.safety_tx_hook(classic_steer(170)) + assert not safety.safety_tx_hook(classic_steer(171)) + + +def test_classic_longitudinal_accel_and_aeb_guards(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG) + safety.init_tests() + + safety.set_controls_allowed(False) + assert safety.safety_tx_hook(classic_accel(0)) + assert not safety.safety_tx_hook(classic_accel(1)) + + safety.set_controls_allowed(True) + for accel in (-400, 0, 250): + assert safety.safety_tx_hook(classic_accel(accel)) + for accel in (-401, 251): + assert not safety.safety_tx_hook(classic_accel(accel)) + assert not safety.safety_tx_hook(classic_accel(0, aeb_decel=1)) + assert not safety.safety_tx_hook(classic_accel(0, aeb_request=True)) + + assert safety.safety_tx_hook(packet(0x38D, 0, 8)) + assert not safety.safety_tx_hook(packet(0x38D, 0, 8, {1: 1})) + assert not safety.safety_tx_hook(packet(0x38D, 0, 8, {2: 1 << 4})) + assert not safety.safety_tx_hook(packet(0x38D, 0, 8, {3: 1 << 7})) + + +def test_classic_buttons(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundai, 0) + safety.init_tests() + + safety.set_controls_allowed(False) + assert not safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 1})) + assert not safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 2})) + assert not safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 4})) + + safety.set_controls_allowed(True) + assert safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 1})) + assert not safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 2})) + assert safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 4})) + + safety.set_controls_allowed(False) + safety.set_cruise_engaged_prev(True) + assert safety.safety_tx_hook(packet(0x4F1, 0, 4, {0: 4})) + + +def test_classic_diagnostic_payload_is_restricted(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG) + safety.init_tests() + assert safety.safety_tx_hook(packet(0x7D0, 0, 8, dict(enumerate(TESTER_PRESENT)))) + assert not safety.safety_tx_hook(packet(0x7D0, 0, 8, {0: 3, 1: 0x22})) diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai_canfd.py b/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai_canfd.py new file mode 100644 index 000000000..a30c2e0f6 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai_canfd.py @@ -0,0 +1,146 @@ +import pytest + +from iqdbc.car.hyundai.values import HyundaiSafetyFlags +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.hyundai_common import TESTER_PRESENT, canfd_accel, canfd_steer, packet +from iqdbc.safety.tests.libsafety import libsafety_py + + +@pytest.fixture +def safety(): + return libsafety_py.libsafety + + +@pytest.mark.parametrize("param", ( + 0, + HyundaiSafetyFlags.EV_GAS, + HyundaiSafetyFlags.HYBRID_GAS, + HyundaiSafetyFlags.LONG, + HyundaiSafetyFlags.CAMERA_SCC, + HyundaiSafetyFlags.CANFD_LKA_STEERING, + HyundaiSafetyFlags.CANFD_ALT_BUTTONS, + HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT, + HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.LONG, + HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.LONG | HyundaiSafetyFlags.CANFD_ALT_BUTTONS, +)) +def test_canfd_safety_configurations_initialize(safety, param): + assert safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, param) == 0 + safety.init_tests() + assert safety.get_current_safety_param() == param + + +@pytest.mark.parametrize(("param", "addr", "length"), ( + (0, 0x12A, 16), + (HyundaiSafetyFlags.CANFD_LKA_STEERING, 0x50, 16), + (HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.CANFD_LKA_STEERING_ALT, 0x110, 32), + (HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.LONG, 0x12A, 16), +)) +def test_canfd_steering_limits(safety, param, addr, length): + safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, param) + safety.init_tests() + + safety.set_controls_allowed(False) + assert safety.safety_tx_hook(canfd_steer(addr, length, 0, False)) + assert not safety.safety_tx_hook(canfd_steer(addr, length, 1)) + + safety.set_controls_allowed(True) + assert safety.safety_tx_hook(canfd_steer(addr, length, 2)) + safety.set_desired_torque_last(270) + safety.set_rt_torque_last(270) + assert safety.safety_tx_hook(canfd_steer(addr, length, 270)) + assert not safety.safety_tx_hook(canfd_steer(addr, length, 271)) + assert not safety.safety_tx_hook(canfd_steer(addr, length, -271)) + + +def test_canfd_tx_whitelist_and_buttons(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, 0) + safety.init_tests() + assert not safety.safety_tx_hook(packet(0x123, 0, 8)) + assert not safety.safety_tx_hook(packet(0x12A, 1, 16)) + + safety.set_controls_allowed(False) + assert not safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 1})) + assert not safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 2})) + assert not safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 4})) + + safety.set_controls_allowed(True) + assert safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 1})) + assert not safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 2})) + assert safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 4})) + + safety.set_controls_allowed(False) + safety.set_cruise_engaged_prev(True) + assert safety.safety_tx_hook(packet(0x1CF, 0, 8, {2: 4})) + + +def test_canfd_camera_scc_button_passthrough(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CAMERA_SCC) + safety.init_tests() + + safety.set_controls_allowed(False) + assert safety.safety_tx_hook(packet(0x1CF, 2, 8)) + assert not safety.safety_tx_hook(packet(0x1CF, 0, 8)) + assert not safety.safety_tx_hook(packet(0x1CF, 2, 8, {2: 1})) + assert not safety.safety_tx_hook(packet(0x1CF, 2, 8, {2: 2})) + assert not safety.safety_tx_hook(packet(0x1CF, 2, 8, {2: 4})) + + safety.set_controls_allowed(True) + assert safety.safety_tx_hook(packet(0x1CF, 2, 8, {2: 1})) + assert not safety.safety_tx_hook(packet(0x1CF, 2, 8, {2: 2})) + assert safety.safety_tx_hook(packet(0x1CF, 2, 8, {2: 4})) + + +def test_canfd_camera_scc_single_owner_forwarding(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CAMERA_SCC) + safety.init_tests() + safety.set_timer(1_000_000) + + assert safety.safety_fwd_hook(2, 0x12A) == -1 + assert safety.safety_fwd_hook(2, 0x1E0) == -1 + assert safety.safety_fwd_hook(2, 0x1A0) == 0 + assert safety.safety_fwd_hook(0, 0xEA) == 2 + assert not safety.safety_tx_hook(packet(0xEA, 2, 24)) + assert not safety.safety_tx_hook(packet(0x2AF, 2, 8)) + + +def test_canfd_camera_scc_longitudinal_single_owner_forwarding(safety): + param = HyundaiSafetyFlags.CAMERA_SCC | HyundaiSafetyFlags.LONG + safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, param) + safety.init_tests() + safety.set_timer(1_000_000) + + assert safety.safety_fwd_hook(2, 0x12A) == -1 + assert safety.safety_fwd_hook(2, 0x1A0) == -1 + assert safety.safety_fwd_hook(0, 0x175) == -1 + assert safety.safety_fwd_hook(0, 0xEA) == 2 + + +def test_canfd_stock_longitudinal_only_allows_cancel(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, 0) + safety.init_tests() + assert safety.safety_tx_hook(canfd_accel(0, acc_mode=4)) + assert not safety.safety_tx_hook(canfd_accel(1, acc_mode=4)) + assert not safety.safety_tx_hook(canfd_accel(0, acc_mode=0)) + + +def test_canfd_longitudinal_accel_limits(safety): + safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.LONG) + safety.init_tests() + + safety.set_controls_allowed(False) + assert safety.safety_tx_hook(canfd_accel(0)) + assert not safety.safety_tx_hook(canfd_accel(1)) + + safety.set_controls_allowed(True) + for accel in (-400, 0, 250): + assert safety.safety_tx_hook(canfd_accel(accel)) + for accel in (-401, 251): + assert not safety.safety_tx_hook(canfd_accel(accel)) + + +def test_canfd_hda2_diagnostic_payload_is_restricted(safety): + param = HyundaiSafetyFlags.CANFD_LKA_STEERING | HyundaiSafetyFlags.LONG + safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, param) + safety.init_tests() + assert safety.safety_tx_hook(packet(0x730, 1, 8, dict(enumerate(TESTER_PRESENT)))) + assert not safety.safety_tx_hook(packet(0x730, 1, 8, {0: 3, 1: 0x22})) diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai_controller.py b/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai_controller.py new file mode 100644 index 000000000..810665a48 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_hyundai_controller.py @@ -0,0 +1,60 @@ +import pytest + +from iqdbc.car import gen_empty_fingerprint, structs +from iqdbc.car.hyundai.interface import CarInterface +from iqdbc.car.hyundai.values import CAR, HyundaiFlags +from iqdbc.safety.tests.libsafety import libsafety_py + + +@pytest.mark.parametrize("candidate", list(CAR), ids=lambda candidate: candidate.value) +@pytest.mark.parametrize("alpha_long", (False, True), ids=("stock_long", "openpilot_long")) +def test_controller_frames_match_configured_safety(candidate, alpha_long, monkeypatch, tmp_path): + """Run real controller output through the safety configuration selected for every HKG platform.""" + monkeypatch.setenv("PARAMS_ROOT", str(tmp_path / candidate.value)) + fingerprint = gen_empty_fingerprint() + cp = CarInterface.get_params(candidate, fingerprint, [], alpha_long, False, False) + cp_iq = CarInterface.get_params_iq(cp, candidate, fingerprint, [], alpha_long, False, False) + interface = CarInterface(cp, cp_iq) + interface.update([]) + + safety_config = cp.safetyConfigs[-1] + safety = libsafety_py.libsafety + assert safety.set_safety_hooks(safety_config.safetyModel.raw, safety_config.safetyParam) == 0 + safety.init_tests() + safety.set_controls_allowed(True) + + control = structs.CarControl.new_message() + control.enabled = True + control.latActive = True + control.longActive = alpha_long + control.actuators.torque = 0.01 + control.actuators.accel = 0.0 + + for frame in range(20): + _, can_sends = interface.apply(control.as_reader(), structs.IQCarControl()) + assert isinstance(can_sends, list) + for address, data, bus in can_sends: + packet = libsafety_py.make_CANPacket(address, bus, data) + rejection = f"{candidate.value} frame {frame}: safety rejected address={address:#x} bus={bus} data={data.hex()}" + assert safety.safety_tx_hook(packet), rejection + + +def test_ev6_camera_scc_has_one_lfa_sender(monkeypatch, tmp_path): + monkeypatch.setenv("PARAMS_ROOT", str(tmp_path)) + fingerprint = gen_empty_fingerprint() + cp = CarInterface.get_params(CAR.KIA_EV6, fingerprint, [], False, False, False) + cp.flags &= ~HyundaiFlags.CANFD_HDA2.value + cp.flags |= HyundaiFlags.CANFD_CAMERA_SCC.value + cp_iq = CarInterface.get_params_iq(cp, CAR.KIA_EV6, fingerprint, [], False, False, False) + interface = CarInterface(cp, cp_iq) + interface.update([]) + + control = structs.CarControl.new_message() + control.enabled = True + control.latActive = True + control.actuators.torque = 0.01 + + for _ in range(20): + _, can_sends = interface.apply(control.as_reader(), structs.IQCarControl()) + assert [(address, bus) for address, _, bus in can_sends if address == 0x12A] == [(0x12A, 0)] + assert all(address not in (0xEA, 0x2AF) for address, _, _ in can_sends) diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_mazda.py b/artifacts/package_runtime/iqdbc/safety/tests/test_mazda.py new file mode 100644 index 000000000..e370c39a2 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_mazda.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +import unittest + +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety + + +class TestMazdaSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest): + + TX_MSGS = [[0x243, 0], [0x09d, 0], [0x440, 0]] + STANDSTILL_THRESHOLD = .1 + RELAY_MALFUNCTION_ADDRS = {0: (0x243, 0x440)} + FWD_BLACKLISTED_ADDRS = {2: [0x243, 0x440]} + + MAX_RATE_UP = 10 + MAX_RATE_DOWN = 25 + MAX_TORQUE_LOOKUP = [0], [800] + + MAX_RT_DELTA = 300 + + DRIVER_TORQUE_ALLOWANCE = 15 + DRIVER_TORQUE_FACTOR = 1 + + # Mazda actually does not set any bit when requesting torque + NO_STEER_REQ_BIT = True + + def setUp(self): + self.packer = CANPackerSafety("mazda_2017") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.mazda, 0) + self.safety.init_tests() + + def _torque_meas_msg(self, torque): + values = {"STEER_TORQUE_MOTOR": torque} + return self.packer.make_can_msg_safety("STEER_TORQUE", 0, values) + + def _torque_driver_msg(self, torque): + values = {"STEER_TORQUE_SENSOR": torque} + return self.packer.make_can_msg_safety("STEER_TORQUE", 0, values) + + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"LKAS_REQUEST": torque} + return self.packer.make_can_msg_safety("CAM_LKAS", 0, values) + + def _speed_msg(self, speed): + values = {"SPEED": speed} + return self.packer.make_can_msg_safety("ENGINE_DATA", 0, values) + + def _user_brake_msg(self, brake): + values = {"BRAKE_ON": brake} + return self.packer.make_can_msg_safety("PEDALS", 0, values) + + def _user_gas_msg(self, gas): + values = {"PEDAL_GAS": gas} + return self.packer.make_can_msg_safety("ENGINE_DATA", 0, values) + + def _pcm_status_msg(self, enable): + values = {"CRZ_ACTIVE": enable} + return self.packer.make_can_msg_safety("CRZ_CTRL", 0, values) + + def _button_msg(self, resume=False, cancel=False): + values = { + "CAN_OFF": cancel, + "CAN_OFF_INV": (cancel + 1) % 2, + "RES": resume, + "RES_INV": (resume + 1) % 2, + } + return self.packer.make_can_msg_safety("CRZ_BTNS", 0, values) + + def test_buttons(self): + # only cancel allows while controls not allowed + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._button_msg(cancel=True))) + self.assertFalse(self._tx(self._button_msg(resume=True))) + + # do not block resume if we are engaged already + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._button_msg(cancel=True))) + self.assertTrue(self._tx(self._button_msg(resume=True))) + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_nissan.py b/artifacts/package_runtime/iqdbc/safety/tests/test_nissan.py new file mode 100644 index 000000000..fe09fa03e --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_nissan.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +import unittest + +from iqdbc.car.nissan.values import NissanSafetyFlags +from iqdbc.car.structs import CarParams + +# NISSAN_PARAM_IQ_LEAF in safety/modes/nissan.h (IQ safety framework flag) +NISSAN_PARAM_IQ_LEAF = 1 +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety + + +class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest): + + TX_MSGS = [[0x169, 0], [0x2b1, 0], [0x4cc, 0], [0x20b, 2], [0x280, 2]] + GAS_PRESSED_THRESHOLD = 3 + RELAY_MALFUNCTION_ADDRS = {0: (0x169, 0x2b1, 0x4cc), 2: (0x280,)} + FWD_BLACKLISTED_ADDRS = {0: [0x280], 2: [0x169, 0x2b1, 0x4cc]} + + EPS_BUS = 0 + CRUISE_BUS = 2 + ACC_MAIN_BUS = 1 + + # Angle control limits + STEER_ANGLE_MAX = 600 # deg, reasonable limit + DEG_TO_CAN = 100 + + ANGLE_RATE_BP = [0., 5., 15.] + ANGLE_RATE_UP = [5., .8, .15] # windup limit + ANGLE_RATE_DOWN = [5., 3.5, .4] # unwind limit + + def setUp(self): + self.packer = CANPackerSafety("nissan_x_trail_2017_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.nissan, 0) + self.safety.init_tests() + + def _angle_cmd_msg(self, angle: float, enabled: bool): + values = {"DESIRED_ANGLE": angle, "LKA_ACTIVE": 1 if enabled else 0} + return self.packer.make_can_msg_safety("LKAS", 0, values) + + def _angle_meas_msg(self, angle: float): + values = {"STEER_ANGLE": angle} + return self.packer.make_can_msg_safety("STEER_ANGLE_SENSOR", self.EPS_BUS, values) + + def _pcm_status_msg(self, enable): + values = {"CRUISE_ENABLED": enable} + return self.packer.make_can_msg_safety("CRUISE_STATE", self.CRUISE_BUS, values) + + def _speed_msg(self, speed): + values = {"WHEEL_SPEED_%s" % s: speed * 3.6 for s in ["RR", "RL"]} + return self.packer.make_can_msg_safety("WHEEL_SPEEDS_REAR", self.EPS_BUS, values) + + def _user_brake_msg(self, brake): + values = {"USER_BRAKE_PRESSED": brake} + return self.packer.make_can_msg_safety("DOORS_LIGHTS", self.EPS_BUS, values) + + def _user_gas_msg(self, gas): + values = {"GAS_PEDAL": gas} + return self.packer.make_can_msg_safety("GAS_PEDAL", self.EPS_BUS, values) + + def _acc_state_msg(self, main_on): + values = {"CRUISE_ON": main_on} + return self.packer.make_can_msg_safety("PRO_PILOT", self.ACC_MAIN_BUS, values) + + def _acc_button_cmd(self, cancel=0, propilot=0, flw_dist=0, _set=0, res=0): + no_button = not any([cancel, propilot, flw_dist, _set, res]) + values = {"CANCEL_BUTTON": cancel, "PROPILOT_BUTTON": propilot, + "FOLLOW_DISTANCE_BUTTON": flw_dist, "SET_BUTTON": _set, + "RES_BUTTON": res, "NO_BUTTON_PRESSED": no_button} + return self.packer.make_can_msg_safety("CRUISE_THROTTLE", 2, values) + + def test_acc_buttons(self): + btns = [ + ("cancel", True), + ("propilot", False), + ("flw_dist", False), + ("_set", False), + ("res", False), + (None, False), + ] + for controls_allowed in (True, False): + for btn, should_tx in btns: + self.safety.set_controls_allowed(controls_allowed) + args = {} if btn is None else {btn: 1} + tx = self._tx(self._acc_button_cmd(**args)) + self.assertEqual(tx, should_tx) + + +class TestNissanSafetyAltEpsBus(TestNissanSafety): + """Altima uses different buses""" + + EPS_BUS = 1 + CRUISE_BUS = 1 + ACC_MAIN_BUS = 2 + + def setUp(self): + self.packer = CANPackerSafety("nissan_x_trail_2017_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.nissan, NissanSafetyFlags.ALT_EPS_BUS) + self.safety.init_tests() + + +class TestNissanLeafSafety(TestNissanSafety): + + def setUp(self): + self.packer = CANPackerSafety("nissan_leaf_2018_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(NISSAN_PARAM_IQ_LEAF) + self.safety.set_safety_hooks(CarParams.SafetyModel.nissan, 0) + self.safety.init_tests() + + def _user_brake_msg(self, brake): + values = {"USER_BRAKE_PRESSED": brake} + return self.packer.make_can_msg_safety("CRUISE_THROTTLE", 0, values) + + def _user_gas_msg(self, gas): + values = {"GAS_PEDAL": gas} + return self.packer.make_can_msg_safety("CRUISE_THROTTLE", 0, values) + + def _acc_state_msg(self, main_on): + values = {"CRUISE_AVAILABLE": main_on} + return self.packer.make_can_msg_safety("CRUISE_THROTTLE", 0, values) + + # TODO: leaf should use its own safety param + def test_acc_buttons(self): + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_psa.py b/artifacts/package_runtime/iqdbc/safety/tests/test_psa.py new file mode 100644 index 000000000..be56f1426 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_psa.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +import unittest + +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety + +LANE_KEEP_ASSIST = 0x3F2 + + +class TestPsaSafetyBase(common.CarSafetyTest, common.AngleSteeringSafetyTest): + RELAY_MALFUNCTION_ADDRS = {0: (LANE_KEEP_ASSIST,)} + FWD_BLACKLISTED_ADDRS = {2: [LANE_KEEP_ASSIST]} + TX_MSGS = [[1010, 0]] + + MAIN_BUS = 0 + ADAS_BUS = 1 + CAM_BUS = 2 + + STEER_ANGLE_MAX = 390 + DEG_TO_CAN = 10 + + ANGLE_RATE_BP = [0., 5., 25.] + ANGLE_RATE_UP = [2.5, 1.5, .2] + ANGLE_RATE_DOWN = [5., 2., .3] + + def setUp(self): + self.packer = CANPackerSafety("psa_aee2010_r3") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.psa, 0) + self.safety.init_tests() + + def _angle_cmd_msg(self, angle: float, enabled: bool): + values = {"SET_ANGLE": angle, "TORQUE_FACTOR": 100 if enabled else 0} + return self.packer.make_can_msg_safety("LANE_KEEP_ASSIST", self.MAIN_BUS, values) + + def _angle_meas_msg(self, angle: float): + values = {"ANGLE": angle} + return self.packer.make_can_msg_safety("STEERING_ALT", self.MAIN_BUS, values) + + def _pcm_status_msg(self, enable): + values = {"RVV_ACC_ACTIVATION_REQ": enable} + return self.packer.make_can_msg_safety("HS2_DAT_MDD_CMD_452", self.ADAS_BUS, values) + + def _speed_msg(self, speed): + values = {"VITESSE_VEHICULE_ROUES": speed * 3.6} + return self.packer.make_can_msg_safety("HS2_DYN_ABR_38D", self.MAIN_BUS, values) + + def _user_brake_msg(self, brake): + values = {"P013_MainBrake": brake} + return self.packer.make_can_msg_safety("Dat_BSI", self.CAM_BUS, values) + + def _user_gas_msg(self, gas): + values = {"P002_Com_rAPP": int(gas * 100)} + return self.packer.make_can_msg_safety("Dyn_CMM", self.MAIN_BUS, values) + + def test_rx_hook(self): + # speed + for _ in range(10): + self.assertTrue(self._rx(self._speed_msg(0))) + msg = self._speed_msg(0) + # invalidate checksum + msg[0].data[5] = 0x00 + self.assertFalse(self._rx(msg)) + + # cruise + for _ in range(10): + self.assertTrue(self._rx(self._pcm_status_msg(0))) + msg = self._pcm_status_msg(0) + # invalidate checksum + msg[0].data[5] = 0x00 + self.assertFalse(self._rx(msg)) + msg = self._pcm_status_msg(0) + # write to unused payload byte + msg[0].data[6] = 0xAB + self.assertTrue(self._rx(msg)) + + +class TestPsaStockSafety(TestPsaSafetyBase): + + def setUp(self): + self.packer = CANPackerSafety("psa_aee2010_r3") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.psa, 0) + self.safety.init_tests() + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_rivian.py b/artifacts/package_runtime/iqdbc/safety/tests/test_rivian.py new file mode 100644 index 000000000..cb100ce0a --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_rivian.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +import unittest + +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety +from iqdbc.car.rivian.values import RivianSafetyFlags +from iqdbc.car.rivian.riviancan import checksum as _checksum + + +def checksum(msg): + addr, dat, bus = msg + ret = bytearray(dat) + + # ESP_Status + if addr == 0x208: + ret[0] = _checksum(ret[1:], 0x1D, 0xB1) + elif addr == 0x150: + ret[0] = _checksum(ret[1:], 0x1D, 0x9A) + + return addr, ret, bus + + +class TestRivianSafetyBase(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest, common.LongitudinalAccelSafetyTest, + common.VehicleSpeedSafetyTest, common.SecondSpeedSafetyTest): + + TX_MSGS = [[0x120, 0], [0x321, 2], [0x162, 2]] + RELAY_MALFUNCTION_ADDRS = {0: (0x120,), 2: (0x321, 0x162)} + FWD_BLACKLISTED_ADDRS = {0: [0x321, 0x162], 2: [0x120]} + + MAX_TORQUE_LOOKUP = [9, 17], [350, 250] + DYNAMIC_MAX_TORQUE = True + MAX_RATE_UP = 3 + MAX_RATE_DOWN = 5 + + MAX_RT_DELTA = 125 + + DRIVER_TORQUE_ALLOWANCE = 100 + DRIVER_TORQUE_FACTOR = 2 + + cnt_speed = 0 + cnt_speed_2 = 0 + + def _torque_driver_msg(self, torque): + values = {"EPAS_TorsionBarTorque": torque / 100.0} + return self.packer.make_can_msg_safety("EPAS_SystemStatus", 0, values) + + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"ACM_lkaStrToqReq": torque, "ACM_lkaActToi": steer_req} + return self.packer.make_can_msg_safety("ACM_lkaHbaCmd", 0, values) + + def _speed_msg(self, speed, quality_flag=True): + values = {"ESP_Vehicle_Speed": speed * 3.6, "ESP_Status_Counter": self.cnt_speed % 15, + "ESP_Vehicle_Speed_Q": 1 if quality_flag else 0} + self.__class__.cnt_speed += 1 + return self.packer.make_can_msg_safety("ESP_Status", 0, values, fix_checksum=checksum) + + def _speed_msg_2(self, speed, quality_flag=True): + # Rivian has a dynamic max torque limit based on speed, so it checks two sources + return self._user_gas_msg(0, speed, quality_flag) + + def _user_brake_msg(self, brake): + values = {"iBESP2_BrakePedalApplied": brake} + return self.packer.make_can_msg_safety("iBESP2", 0, values) + + def _user_gas_msg(self, gas, speed=0, quality_flag=True): + values = {"VDM_AcceleratorPedalPosition": gas, "VDM_VehicleSpeed": speed * 3.6, + "VDM_PropStatus_Counter": self.cnt_speed_2 % 15, "VDM_VehicleSpeedQ": 1 if quality_flag else 0} + self.__class__.cnt_speed_2 += 1 + return self.packer.make_can_msg_safety("VDM_PropStatus", 0, values, fix_checksum=checksum) + + def _pcm_status_msg(self, enable): + values = {"ACM_FeatureStatus": enable, "ACM_Unkown1": 1} + return self.packer.make_can_msg_safety("ACM_Status", 2, values) + + def _accel_msg(self, accel: float): + values = {"ACM_AccelerationRequest": accel} + return self.packer.make_can_msg_safety("ACM_longitudinalRequest", 0, values) + + def test_wheel_touch(self): + # For hiding hold wheel alert on engage + for controls_allowed in (True, False): + self.safety.set_controls_allowed(controls_allowed) + values = { + "SCCM_WheelTouch_HandsOn": 1 if controls_allowed else 0, + "SCCM_WheelTouch_CapacitiveValue": 100 if controls_allowed else 0, + "SETME_X52": 100, + } + self.assertTrue(self._tx(self.packer.make_can_msg_safety("SCCM_WheelTouch", 2, values))) + + def test_rx_hook(self): + # checksum, counter, and quality flag checks + for quality_flag in (True, False): + for msg_type in ("speed", "speed_2"): + self.safety.set_controls_allowed(True) + # send multiple times to verify counter checks + for _ in range(10): + if msg_type == "speed": + msg = self._speed_msg(0, quality_flag=quality_flag) + elif msg_type == "speed_2": + msg = self._speed_msg_2(0, quality_flag=quality_flag) + + self.assertEqual(quality_flag, self._rx(msg)) + self.assertEqual(quality_flag, self.safety.get_controls_allowed()) + + # Mess with checksum to make it fail + msg[0].data[0] = 0xff + self.assertFalse(self._rx(msg)) + self.assertFalse(self.safety.get_controls_allowed()) + + +class TestRivianStockSafety(TestRivianSafetyBase): + + LONGITUDINAL = False + + def setUp(self): + self.packer = CANPackerSafety("rivian_primary_actuator") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.rivian, 0) + self.safety.init_tests() + + def test_adas_status(self): + # For canceling stock ACC + for controls_allowed in (True, False): + self.safety.set_controls_allowed(controls_allowed) + for interface_status in range(4): + values = {"VDM_AdasInterfaceStatus": interface_status} + self.assertTrue(self._tx(self.packer.make_can_msg_safety("VDM_AdasSts", 2, values))) + + +class TestRivianLongitudinalSafety(TestRivianSafetyBase): + + TX_MSGS = [[0x120, 0], [0x321, 2], [0x160, 0]] + RELAY_MALFUNCTION_ADDRS = {0: (0x120, 0x160), 2: (0x321,)} + FWD_BLACKLISTED_ADDRS = {0: [0x321], 2: [0x120, 0x160]} + + def setUp(self): + self.packer = CANPackerSafety("rivian_primary_actuator") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.rivian, RivianSafetyFlags.LONG_CONTROL) + self.safety.init_tests() + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_subaru.py b/artifacts/package_runtime/iqdbc/safety/tests/test_subaru.py new file mode 100644 index 000000000..304cd5fea --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_subaru.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python3 +import enum +import unittest + +from iqdbc.car.subaru.values import SubaruSafetyFlags +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety +from functools import partial + + +class SubaruMsg(enum.IntEnum): + Brake_Status = 0x13c + CruiseControl = 0x240 + Throttle = 0x40 + Steering_Torque = 0x119 + Wheel_Speeds = 0x13a + ES_LKAS = 0x122 + ES_LKAS_ANGLE = 0x124 + ES_Brake = 0x220 + ES_Distance = 0x221 + ES_Status = 0x222 + ES_DashStatus = 0x321 + ES_LKAS_State = 0x322 + ES_Infotainment = 0x323 + ES_UDS_Request = 0x787 + ES_HighBeamAssist = 0x22A + ES_STATIC_1 = 0x325 + ES_STATIC_2 = 0x121 + + +SUBARU_MAIN_BUS = 0 +SUBARU_ALT_BUS = 1 +SUBARU_CAM_BUS = 2 + + +def lkas_tx_msgs(alt_bus, lkas_msg=SubaruMsg.ES_LKAS): + return [[lkas_msg, SUBARU_MAIN_BUS], + [SubaruMsg.ES_Distance, alt_bus], + [SubaruMsg.ES_DashStatus, SUBARU_MAIN_BUS], + [SubaruMsg.ES_LKAS_State, SUBARU_MAIN_BUS], + [SubaruMsg.ES_Infotainment, SUBARU_MAIN_BUS]] + + +def long_tx_msgs(alt_bus): + return [[SubaruMsg.ES_Brake, alt_bus], + [SubaruMsg.ES_Status, alt_bus]] + + +def gen2_long_additional_tx_msgs(): + return [[SubaruMsg.ES_UDS_Request, SUBARU_CAM_BUS], + [SubaruMsg.ES_HighBeamAssist, SUBARU_MAIN_BUS], + [SubaruMsg.ES_STATIC_1, SUBARU_MAIN_BUS], + [SubaruMsg.ES_STATIC_2, SUBARU_MAIN_BUS]] + + +def fwd_blacklisted_addr(lkas_msg=SubaruMsg.ES_LKAS): + return {SUBARU_CAM_BUS: [lkas_msg, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State, SubaruMsg.ES_Infotainment]} + + +class TestSubaruSafetyBase(common.CarSafetyTest): + FLAGS = 0 + RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State, + SubaruMsg.ES_Infotainment)} + FWD_BLACKLISTED_ADDRS = fwd_blacklisted_addr() + + MAX_RT_DELTA = 940 + + DRIVER_TORQUE_ALLOWANCE = 60 + DRIVER_TORQUE_FACTOR = 50 + + ALT_MAIN_BUS = SUBARU_MAIN_BUS + ALT_CAM_BUS = SUBARU_CAM_BUS + + DEG_TO_CAN = 100 + + INACTIVE_GAS = 1818 + + def setUp(self): + self.packer = CANPackerSafety("subaru_global_2017_generated") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.subaru, self.FLAGS) + self.safety.init_tests() + + def _set_prev_torque(self, t): + self.safety.set_desired_torque_last(t) + self.safety.set_rt_torque_last(t) + + def _torque_driver_msg(self, torque): + values = {"Steer_Torque_Sensor": torque} + return self.packer.make_can_msg_safety("Steering_Torque", 0, values) + + def _speed_msg(self, speed): + values = {s: speed for s in ["FR", "FL", "RR", "RL"]} + return self.packer.make_can_msg_safety("Wheel_Speeds", self.ALT_MAIN_BUS, values) + + def _user_brake_msg(self, brake): + values = {"Brake": brake} + return self.packer.make_can_msg_safety("Brake_Status", self.ALT_MAIN_BUS, values) + + def _user_gas_msg(self, gas): + values = {"Throttle_Pedal": gas} + return self.packer.make_can_msg_safety("Throttle", 0, values) + + def _pcm_status_msg(self, enable): + values = {"Cruise_Activated": enable} + return self.packer.make_can_msg_safety("CruiseControl", self.ALT_MAIN_BUS, values) + + def _lkas_button_msg(self, lkas_pressed=False, lkas_hud=0): + values = {"LKAS_Dash_State": 2 if lkas_pressed else lkas_hud} + return self.packer.make_can_msg_safety("ES_LKAS_State", SUBARU_CAM_BUS, values) + + def test_enable_control_allowed_with_aol_button(self): + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + for aol_button_press in range(4): + with self.subTest("aol_button_press", button_state=aol_button_press): + self.safety.set_aol_params(enable_aol, False, False) + + self._rx(self._lkas_button_msg(False, aol_button_press)) + self.assertEqual(enable_aol and aol_button_press in range(1, 4), + self.safety.get_controls_allowed_lat()) + + +class TestSubaruStockLongitudinalSafetyBase(TestSubaruSafetyBase): + def _cancel_msg(self, cancel, cruise_throttle=0): + values = {"Cruise_Cancel": cancel, "Cruise_Throttle": cruise_throttle} + return self.packer.make_can_msg_safety("ES_Distance", self.ALT_MAIN_BUS, values) + + def test_cancel_message(self): + # test that we can only send the cancel message (ES_Distance) with inactive throttle (1818) and Cruise_Cancel=1 + for cancel in [True, False]: + self._generic_limit_safety_check(partial(self._cancel_msg, cancel), self.INACTIVE_GAS, self.INACTIVE_GAS, 0, 2**12, 1, self.INACTIVE_GAS, cancel) + + +class TestSubaruLongitudinalSafetyBase(TestSubaruSafetyBase, common.LongitudinalGasBrakeSafetyTest): + MIN_GAS = 808 + MAX_GAS = 3400 + INACTIVE_GAS = 1818 + MAX_POSSIBLE_GAS = 2**13 + + MIN_BRAKE = 0 + MAX_BRAKE = 600 + MAX_POSSIBLE_BRAKE = 2**16 + + MIN_RPM = 0 + MAX_RPM = 3600 + MAX_POSSIBLE_RPM = 2**13 + + FWD_BLACKLISTED_ADDRS = {2: [SubaruMsg.ES_LKAS, SubaruMsg.ES_Brake, SubaruMsg.ES_Distance, + SubaruMsg.ES_Status, SubaruMsg.ES_DashStatus, + SubaruMsg.ES_LKAS_State, SubaruMsg.ES_Infotainment]} + + def test_rpm_safety_check(self): + self._generic_limit_safety_check(self._send_rpm_msg, self.MIN_RPM, self.MAX_RPM, 0, self.MAX_POSSIBLE_RPM, 1) + + def _send_brake_msg(self, brake): + values = {"Brake_Pressure": brake} + return self.packer.make_can_msg_safety("ES_Brake", self.ALT_MAIN_BUS, values) + + def _send_gas_msg(self, gas): + values = {"Cruise_Throttle": gas} + return self.packer.make_can_msg_safety("ES_Distance", self.ALT_MAIN_BUS, values) + + def _send_rpm_msg(self, rpm): + values = {"Cruise_RPM": rpm} + return self.packer.make_can_msg_safety("ES_Status", self.ALT_MAIN_BUS, values) + + +class TestSubaruTorqueSafetyBase(TestSubaruSafetyBase, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest): + MAX_RATE_UP = 50 + MAX_RATE_DOWN = 70 + MAX_TORQUE_LOOKUP = [0], [2047] + + # Safety around steering req bit + MIN_VALID_STEERING_FRAMES = 7 + MAX_INVALID_STEERING_FRAMES = 1 + STEER_STEP = 2 + + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"LKAS_Output": torque, "LKAS_Request": steer_req} + return self.packer.make_can_msg_safety("ES_LKAS", SUBARU_MAIN_BUS, values) + + +class TestSubaruGen1TorqueStockLongitudinalSafety(TestSubaruStockLongitudinalSafetyBase, TestSubaruTorqueSafetyBase): + FLAGS = 0 + TX_MSGS = lkas_tx_msgs(SUBARU_MAIN_BUS) + + +class TestSubaruGen2TorqueSafetyBase(TestSubaruTorqueSafetyBase): + ALT_MAIN_BUS = SUBARU_ALT_BUS + ALT_CAM_BUS = SUBARU_ALT_BUS + + MAX_RATE_UP = 35 + MAX_RATE_DOWN = 50 + MAX_TORQUE_LOOKUP = [0], [1500] + + +class TestSubaruGen2TorqueStockLongitudinalSafety(TestSubaruStockLongitudinalSafetyBase, TestSubaruGen2TorqueSafetyBase): + FLAGS = SubaruSafetyFlags.GEN2 + TX_MSGS = lkas_tx_msgs(SUBARU_ALT_BUS) + + +class TestSubaruGen1LongitudinalSafety(TestSubaruLongitudinalSafetyBase, TestSubaruTorqueSafetyBase): + FLAGS = SubaruSafetyFlags.LONG + TX_MSGS = lkas_tx_msgs(SUBARU_MAIN_BUS) + long_tx_msgs(SUBARU_MAIN_BUS) + RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State, + SubaruMsg.ES_Infotainment, SubaruMsg.ES_Brake, SubaruMsg.ES_Status, + SubaruMsg.ES_Distance)} + + +class TestSubaruGen2LongitudinalSafety(TestSubaruLongitudinalSafetyBase, TestSubaruGen2TorqueSafetyBase): + FLAGS = SubaruSafetyFlags.LONG | SubaruSafetyFlags.GEN2 + TX_MSGS = lkas_tx_msgs(SUBARU_ALT_BUS) + long_tx_msgs(SUBARU_ALT_BUS) + gen2_long_additional_tx_msgs() + FWD_BLACKLISTED_ADDRS = {2: [SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State, + SubaruMsg.ES_Infotainment]} + RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State, + SubaruMsg.ES_Infotainment), + SUBARU_ALT_BUS: (SubaruMsg.ES_Brake, SubaruMsg.ES_Status, SubaruMsg.ES_Distance)} + + def _rdbi_msg(self, did: int): + return b'\x03\x22' + did.to_bytes(2) + b'\x00\x00\x00\x00' + + def _es_uds_msg(self, msg: bytes): + return libsafety_py.make_CANPacket(SubaruMsg.ES_UDS_Request, 2, msg) + + def test_es_uds_message(self): + tester_present = b'\x02\x3E\x80\x00\x00\x00\x00\x00' + not_tester_present = b"\x03\xAA\xAA\x00\x00\x00\x00\x00" + + button_did = 0x1130 + + # Tester present is allowed for gen2 long to keep eyesight disabled + self.assertTrue(self._tx(self._es_uds_msg(tester_present))) + + # Non-Tester present is not allowed + self.assertFalse(self._tx(self._es_uds_msg(not_tester_present))) + + # Only button_did is allowed to be read via UDS + for did in range(0xFFFF): + should_tx = (did == button_did) + self.assertEqual(self._tx(self._es_uds_msg(self._rdbi_msg(did))), should_tx) + + # any other msg is not allowed + for sid in range(0xFF): + msg = b'\x03' + sid.to_bytes(1) + b'\x00' * 6 + self.assertFalse(self._tx(self._es_uds_msg(msg))) + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_subaru_preglobal.py b/artifacts/package_runtime/iqdbc/safety/tests/test_subaru_preglobal.py new file mode 100644 index 000000000..bd33d3057 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_subaru_preglobal.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +import unittest + +from iqdbc.car.structs import CarParams +from iqdbc.car.subaru.values import SubaruSafetyFlags +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety + + +class TestSubaruPreglobalSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest): + FLAGS = 0 + DBC = "subaru_outback_2015_generated" + TX_MSGS = [[0x161, 0], [0x164, 0]] + RELAY_MALFUNCTION_ADDRS = {0: (0x164, 0x161)} + FWD_BLACKLISTED_ADDRS = {2: [0x161, 0x164]} + + MAX_RATE_UP = 50 + MAX_RATE_DOWN = 70 + MAX_TORQUE_LOOKUP = [0], [2047] + + MAX_RT_DELTA = 940 + + DRIVER_TORQUE_ALLOWANCE = 75 + DRIVER_TORQUE_FACTOR = 10 + + def setUp(self): + self.packer = CANPackerSafety(self.DBC) + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.subaruPreglobal, self.FLAGS) + self.safety.init_tests() + + def _set_prev_torque(self, t): + self.safety.set_desired_torque_last(t) + self.safety.set_rt_torque_last(t) + + def _torque_driver_msg(self, torque): + values = {"Steer_Torque_Sensor": torque} + return self.packer.make_can_msg_safety("Steering_Torque", 0, values) + + def _speed_msg(self, speed): + # subaru safety doesn't use the scaled value, so undo the scaling + values = {s: speed*0.0592 for s in ["FR", "FL", "RR", "RL"]} + return self.packer.make_can_msg_safety("Wheel_Speeds", 0, values) + + def _user_brake_msg(self, brake): + values = {"Brake_Pedal": brake} + return self.packer.make_can_msg_safety("Brake_Pedal", 0, values) + + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"LKAS_Command": torque, "LKAS_Active": steer_req} + return self.packer.make_can_msg_safety("ES_LKAS", 0, values) + + def _user_gas_msg(self, gas): + values = {"Throttle_Pedal": gas} + return self.packer.make_can_msg_safety("Throttle", 0, values) + + def _pcm_status_msg(self, enable): + values = {"Cruise_Activated": enable} + return self.packer.make_can_msg_safety("CruiseControl", 0, values) + + +class TestSubaruPreglobalReversedDriverTorqueSafety(TestSubaruPreglobalSafety): + FLAGS = SubaruSafetyFlags.PREGLOBAL_REVERSED_DRIVER_TORQUE + DBC = "subaru_outback_2019_generated" + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_tesla.py b/artifacts/package_runtime/iqdbc/safety/tests/test_tesla.py new file mode 100644 index 000000000..73905fc46 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_tesla.py @@ -0,0 +1,502 @@ +#!/usr/bin/env python3 +import random +import unittest +import numpy as np + +import pytest +try: + from iqdbc.car.tesla.carcontroller import get_safety_CP + from iqdbc.lvbs.car.tesla.values import TeslaSafetyFlagsIQ +except ImportError: + pytest.skip("requires openpilot dependencies", allow_module_level=True) + +from iqdbc.car.lateral import get_max_angle_delta_vm, get_max_angle_vm +from iqdbc.car.tesla.values import CarControllerParams, TeslaSafetyFlags, CANBUS +from iqdbc.car.structs import CarParams +from iqdbc.car.vehicle_model import VehicleModel +from iqdbc.can import CANDefine +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety, MAX_SPEED_DELTA, MAX_WRONG_COUNTERS, away_round, round_speed + +MSG_DAS_steeringControl = 0x488 +MSG_APS_eacMonitor = 0x27d +MSG_DAS_Control = 0x2b9 +MSG_DAS_bodyControls = 0x3E9 + + +def round_angle(apply_angle, can_offset=0): + apply_angle_can = (apply_angle + 1638.35) / 0.1 + can_offset + # 0.49999_ == 0.5 + rnd_offset = 1e-5 if apply_angle >= 0 else -1e-5 + return away_round(apply_angle_can + rnd_offset) * 0.1 - 1638.35 + + +class TestTeslaSafetyBase(common.CarSafetyTest, common.AngleSteeringSafetyTest, common.LongitudinalAccelSafetyTest): + SAFETY_PARAM = 0 + STEER_TYPE_SHIFT = 0 # legacy firmware uses a 2-bit field, one bit up from the 3-bit signal + + RELAY_MALFUNCTION_ADDRS = {0: (MSG_DAS_steeringControl, MSG_APS_eacMonitor)} + FWD_BLACKLISTED_ADDRS = {2: [MSG_DAS_steeringControl, MSG_APS_eacMonitor]} + TX_MSGS = [[MSG_DAS_steeringControl, 0], [MSG_APS_eacMonitor, 0], [MSG_DAS_Control, 0]] + + STANDSTILL_THRESHOLD = 0.1 + GAS_PRESSED_THRESHOLD = 3 + + # Angle control limits + STEER_ANGLE_MAX = 360 # deg + DEG_TO_CAN = 10 + + # Tesla uses get_max_angle_delta_vm and get_max_angle_vm for real lateral accel and jerk limits + # TODO: integrate this into AngleSteeringSafetyTest + ANGLE_RATE_BP = None + ANGLE_RATE_UP = None + ANGLE_RATE_DOWN = None + + # Real time limits + LATERAL_FREQUENCY = 50 # Hz + + # Long control limits + MAX_ACCEL = 2.0 + MIN_ACCEL = -3.48 + INACTIVE_ACCEL = 0.0 + + cnt_epas = 0 + cnt_angle_cmd = 0 + + packer: CANPackerSafety + + def _get_steer_cmd_angle_max(self, speed): + return get_max_angle_vm(max(speed, 1), self.VM, CarControllerParams) + + def setUp(self): + self.VM = VehicleModel(get_safety_CP()) + self.packer = CANPackerSafety("tesla_model3_party") + self.define = CANDefine("tesla_model3_party") + self.acc_states = {d: v for v, d in self.define.dv["DAS_control"]["DAS_accState"].items()} + self.autopark_states = {d: v for v, d in self.define.dv["DI_state"]["DI_autoparkState"].items()} + self.active_autopark_states = [self.autopark_states[s] for s in ('ACTIVE', 'COMPLETE', 'SELFPARK_STARTED')] + + self.steer_control_types = {d: v for v, d in self.define.dv["DAS_steeringControl"]["DAS_steeringControlType"].items()} + + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(0) + self.safety.set_safety_hooks(CarParams.SafetyModel.tesla, self.SAFETY_PARAM) + self.safety.init_tests() + + def _angle_cmd_msg(self, angle: float, state: bool | int, increment_timer: bool = True, bus: int = 0): + values = {"DAS_steeringAngleRequest": angle, "DAS_steeringControlType": int(state) << self.STEER_TYPE_SHIFT} + if increment_timer: + self.safety.set_timer(self.cnt_angle_cmd * int(1e6 / self.LATERAL_FREQUENCY)) + self.__class__.cnt_angle_cmd += 1 + return self.packer.make_can_msg_safety("DAS_steeringControl", bus, values) + + def _angle_meas_msg(self, angle: float, hands_on_level: int = 0, eac_status: int = 1, eac_error_code: int = 0): + values = {"EPAS3S_internalSAS": angle, "EPAS3S_handsOnLevel": hands_on_level, + "EPAS3S_eacStatus": eac_status, "EPAS3S_eacErrorCode": eac_error_code, + "EPAS3S_sysStatusCounter": self.cnt_epas % 16} + self.__class__.cnt_epas += 1 + return self.packer.make_can_msg_safety("EPAS3S_sysStatus", 0, values) + + def _user_brake_msg(self, brake, quality_flag: bool = True): + values = {"ESP_driverBrakeApply": 2 if brake else 1} + if not quality_flag: + values["ESP_driverBrakeApply"] = random.choice((0, 3)) # NotInit_orOff, Faulty_SNA + return self.packer.make_can_msg_safety("ESP_status", 0, values) + + def _speed_msg(self, speed): + values = {"DI_vehicleSpeed": speed * 3.6} + return self.packer.make_can_msg_safety("DI_speed", 0, values) + + def _speed_msg_2(self, speed, quality_flag=True): + values = {"ESP_vehicleSpeed": speed * 3.6, "ESP_wheelSpeedsQF": quality_flag} + return self.packer.make_can_msg_safety("ESP_B", 0, values) + + def _vehicle_moving_msg(self, speed: float, quality_flag=True): + values = {"ESP_vehicleStandstillSts": 1 if speed <= self.STANDSTILL_THRESHOLD else 0, + "ESP_wheelSpeedsQF": quality_flag} + return self.packer.make_can_msg_safety("ESP_B", 0, values) + + def _user_gas_msg(self, gas): + values = {"DI_accelPedalPos": gas} + return self.packer.make_can_msg_safety("DI_systemStatus", 0, values) + + def _pcm_status_msg(self, enable, autopark_state=0): + values = { + "DI_cruiseState": 2 if enable else 0, + "DI_autoparkState": autopark_state, + } + return self.packer.make_can_msg_safety("DI_state", 0, values) + + def _long_control_msg(self, set_speed, acc_state=0, jerk_limits=(0, 0), accel_limits=(0, 0), aeb_event=0, bus=0): + values = { + "DAS_setSpeed": set_speed, + "DAS_accState": acc_state, + "DAS_aebEvent": aeb_event, + "DAS_jerkMin": jerk_limits[0], + "DAS_jerkMax": jerk_limits[1], + "DAS_accelMin": accel_limits[0], + "DAS_accelMax": accel_limits[1], + } + return self.packer.make_can_msg_safety("DAS_control", bus, values) + + def _accel_msg(self, accel: float): + # For common.LongitudinalAccelSafetyTest + return self._long_control_msg(10, accel_limits=(accel, max(accel, 0))) + + def test_rx_hook(self): + # counter check + for msg_type in ("angle", "long", "speed", "speed_2"): + # send multiple times to verify counter checks + for i in range(10): + if msg_type == "angle": + msg = self._angle_cmd_msg(0, True, bus=2) + elif msg_type == "long": + msg = self._long_control_msg(0, bus=2) + elif msg_type == "speed": + msg = self._speed_msg(0) + elif msg_type == "speed_2": + msg = self._speed_msg_2(0) + + should_rx = i >= 5 + if not should_rx: + # mess with checksums + if msg_type == "angle": + msg[0].data[3] = 0 + elif msg_type == "long": + msg[0].data[7] = 0 + elif msg_type == "speed": + msg[0].data[0] = 0 + elif msg_type == "speed_2": + msg[0].data[7] = 0 + + self.safety.set_controls_allowed(True) + self.assertEqual(should_rx, self._rx(msg)) + self.assertEqual(should_rx, self.safety.get_controls_allowed()) + + # Send static counters + for i in range(MAX_WRONG_COUNTERS + 1): + should_rx = i + 1 < MAX_WRONG_COUNTERS + self.assertEqual(should_rx, self._rx(msg)) + self.assertEqual(should_rx, self.safety.get_controls_allowed()) + + def test_vehicle_speed_measurements(self): + # OVERRIDDEN: 79.1667 is the max speed in m/s + self._common_measurement_test(self._speed_msg, 0, 285 / 3.6, 1, + self.safety.get_vehicle_speed_min, self.safety.get_vehicle_speed_max) + + def test_rx_hook_speed_mismatch(self): + # TODO: overridden because of custom rounding + # Tesla relies on speed for lateral limits close to ISO 11270, so it checks two sources + for speed in np.arange(0, 40, 0.5): + # match signal rounding on CAN + speed = away_round(speed / 0.08 * 3.6) * 0.08 / 3.6 + for speed_delta in np.arange(-5, 5, 0.1): + speed_2 = max(speed + speed_delta, 0) + speed_2 = away_round(speed_2 * 2 * 3.6) / 2 / 3.6 + + # Set controls allowed in between rx since first message can reset it + self.assertTrue(self._rx(self._speed_msg(speed))) + self.safety.set_controls_allowed(True) + self.assertTrue(self._rx(self._speed_msg_2(speed_2))) + + within_delta = abs(speed - speed_2) <= MAX_SPEED_DELTA + self.assertEqual(self.safety.get_controls_allowed(), within_delta) + + # Test ESP_B quality flag + for quality_flag in (True, False): + self.safety.set_controls_allowed(True) + self.assertTrue(self._rx(self._speed_msg(0))) + self.assertEqual(quality_flag, self._rx(self._speed_msg_2(0, quality_flag=quality_flag))) + self.assertEqual(quality_flag, self.safety.get_controls_allowed()) + + def test_rt_limits(self): + self._test_rt_limits() + + def test_user_brake_quality_flag(self): + for quality_flag in (True, False): + msg = self._user_brake_msg(True, quality_flag=quality_flag) + self.assertEqual(quality_flag, self._rx(msg)) + + def test_steering_wheel_disengage(self): + # Tesla disengages when the user forcibly overrides the locked-in angle steering control + # Either when the hands on level is high, or if there is a high angle rate fault + for hands_on_level in range(4): + for eac_status in range(8): + for eac_error_code in range(16): + self.safety.set_controls_allowed(True) + + should_disengage = hands_on_level >= 3 or (eac_status == 0 and eac_error_code == 9) + self.assertTrue(self._rx(self._angle_meas_msg(0, hands_on_level=hands_on_level, eac_status=eac_status, + eac_error_code=eac_error_code))) + self.assertNotEqual(should_disengage, self.safety.get_controls_allowed()) + self.assertEqual(should_disengage, self.safety.get_steering_disengage_prev()) + + # Should not recover + self.assertTrue(self._rx(self._angle_meas_msg(0, hands_on_level=0, eac_status=1, eac_error_code=0))) + self.assertNotEqual(should_disengage, self.safety.get_controls_allowed()) + self.assertFalse(self.safety.get_steering_disengage_prev()) + + def test_autopark_summon_while_enabled(self): + # We should not respect Autopark that activates while controls are allowed + self._rx(self._pcm_status_msg(True, 0)) + + self._rx(self._pcm_status_msg(True, self.autopark_states["SELFPARK_STARTED"])) + self.assertTrue(self.safety.get_controls_allowed()) + self.assertTrue(self._tx(self._angle_cmd_msg(0, True))) + self.assertTrue(self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"]))) + + # We should still not respect Autopark if we disengage cruise + self._rx(self._pcm_status_msg(False, self.autopark_states["SELFPARK_STARTED"])) + self.assertFalse(self.safety.get_controls_allowed()) + self.assertTrue(self._tx(self._angle_cmd_msg(0, False))) + self.assertTrue(self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"]))) + + def test_autopark_summon_behavior(self): + for autopark_state in range(16): + self._rx(self._pcm_status_msg(False, 0)) + + # We shouldn't allow controls if Autopark is an active state + autopark_active = autopark_state in self.active_autopark_states + self._rx(self._pcm_status_msg(False, autopark_state)) + self._rx(self._pcm_status_msg(True, autopark_state)) + self.assertNotEqual(autopark_active, self.safety.get_controls_allowed()) + + # We should also start blocking all inactive/active openpilot msgs + self.assertNotEqual(autopark_active, self._tx(self._angle_cmd_msg(0, False))) + self.assertNotEqual(autopark_active, self._tx(self._angle_cmd_msg(0, True))) + self.assertNotEqual(autopark_active, self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"]))) + self.assertNotEqual(autopark_active or not self.LONGITUDINAL, self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_ON"]))) + + # Regain controls when Autopark disables + self._rx(self._pcm_status_msg(True, 0)) + self.assertTrue(self.safety.get_controls_allowed()) + self.assertTrue(self._tx(self._angle_cmd_msg(0, False))) + self.assertTrue(self._tx(self._angle_cmd_msg(0, True))) + self.assertTrue(self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"]))) + self.assertEqual(self.LONGITUDINAL, self._tx(self._long_control_msg(0, acc_state=self.acc_states["ACC_ON"]))) + + def test_steering_control_type(self): + # Only angle control is allowed (no LANE_KEEP_ASSIST or EMERGENCY_LANE_KEEP) + self.safety.set_controls_allowed(True) + for steer_control_type in range(4): + should_tx = steer_control_type in (self.steer_control_types["NONE"], + self.steer_control_types["ANGLE_CONTROL"], + self.steer_control_types["LANE_KEEP_ASSIST"]) + self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(0, state=steer_control_type))) + + def test_stock_lkas_passthrough(self): + for control_type in ('ANGLE_CONTROL', 'LANE_KEEP_ASSIST'): + no_lkas_msg = self._angle_cmd_msg(0, state=False) + no_lkas_msg_cam = self._angle_cmd_msg(0, state=self.steer_control_types['NONE'], bus=2) + lkas_msg_cam = self._angle_cmd_msg(0, state=self.steer_control_types[control_type], bus=2) + + self.assertEqual(1, self._rx(no_lkas_msg_cam)) + self.assertEqual(-1, self.safety.safety_fwd_hook(2, no_lkas_msg_cam.addr)) + self.assertTrue(self._tx(no_lkas_msg)) + + self.assertEqual(1, self._rx(lkas_msg_cam)) + self.assertEqual(0, self.safety.safety_fwd_hook(2, lkas_msg_cam.addr)) + self.assertFalse(self._tx(no_lkas_msg)) + + def test_fsd_visualization(self): + self.safety.set_current_safety_param_iq(TeslaSafetyFlagsIQ.FSD_VISUALIZATION) + self.safety.set_safety_hooks(CarParams.SafetyModel.tesla, self.SAFETY_PARAM) + self.safety.init_tests() + + stock_msg = self._angle_cmd_msg(0, state=self.steer_control_types['ANGLE_CONTROL'], bus=2) + self.assertEqual(-1, self.safety.safety_fwd_hook(2, stock_msg.addr)) + self.assertEqual(1, self._rx(stock_msg)) + self.assertEqual(-1, self.safety.safety_fwd_hook(2, stock_msg.addr)) + + self.safety.set_controls_allowed(True) + iq_msg = self._angle_cmd_msg(0, state=self.steer_control_types['ANGLE_CONTROL']) + self.assertTrue(self._tx(iq_msg)) + + def test_angle_cmd_when_enabled(self): + # We properly test lateral acceleration and jerk below + pass + + def test_lateral_accel_limit(self): + for speed in np.linspace(0, 40, 100): + speed = max(speed, 1) + # match DI_vehicleSpeed rounding on CAN + speed = round_speed(away_round(speed / 0.08 * 3.6) * 0.08 / 3.6) + for sign in (-1, 1): + self.safety.set_controls_allowed(True) + self._reset_speed_measurement(speed + 1) # safety fudges the speed + + # angle signal can't represent 0, so it biases one unit down + angle_unit_offset = -1 if sign == -1 else 0 + + # at limit (safety tolerance adds 1) + max_angle = round_angle(get_max_angle_vm(speed, self.VM, CarControllerParams), angle_unit_offset + 1) * sign + max_angle = np.clip(max_angle, -self.STEER_ANGLE_MAX, self.STEER_ANGLE_MAX) + self.safety.set_desired_angle_last(round(max_angle * self.DEG_TO_CAN)) + + self.assertTrue(self._tx(self._angle_cmd_msg(max_angle, True))) + + # 1 unit above limit + max_angle_raw = round_angle(get_max_angle_vm(speed, self.VM, CarControllerParams), angle_unit_offset + 2) * sign + max_angle = np.clip(max_angle_raw, -self.STEER_ANGLE_MAX, self.STEER_ANGLE_MAX) + self._tx(self._angle_cmd_msg(max_angle, True)) + + # at low speeds max angle is above 360, so adding 1 has no effect + should_tx = abs(max_angle_raw) >= self.STEER_ANGLE_MAX + self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(max_angle, True))) + + def test_lateral_jerk_limit(self): + for speed in np.linspace(0, 40, 100): + speed = max(speed, 1) + # match DI_vehicleSpeed rounding on CAN + speed = round_speed(away_round(speed / 0.08 * 3.6) * 0.08 / 3.6) + for sign in (-1, 1): # (-1, 1): + self.safety.set_controls_allowed(True) + self._reset_speed_measurement(speed + 1) # safety fudges the speed + self._tx(self._angle_cmd_msg(0, True)) + + # angle signal can't represent 0, so it biases one unit down + angle_unit_offset = 1 if sign == -1 else 0 + + # Stay within limits + # Up + max_angle_delta = round_angle(get_max_angle_delta_vm(speed, self.VM, CarControllerParams), angle_unit_offset) * sign + self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True))) + + # Don't change + self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True))) + + # Down + self.assertTrue(self._tx(self._angle_cmd_msg(0, True))) + + # Inject too high rates + # Up + max_angle_delta = round_angle(get_max_angle_delta_vm(speed, self.VM, CarControllerParams), angle_unit_offset + 1) * sign + self.assertFalse(self._tx(self._angle_cmd_msg(max_angle_delta, True))) + + # Don't change + self.safety.set_desired_angle_last(round(max_angle_delta * self.DEG_TO_CAN)) + self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True))) + + # Down + self.assertFalse(self._tx(self._angle_cmd_msg(0, True))) + + # Recover + self.assertTrue(self._tx(self._angle_cmd_msg(0, True))) + + +class TestTeslaStockSafety(TestTeslaSafetyBase): + + LONGITUDINAL = False + + def test_cancel(self): + for acc_state in range(16): + self.safety.set_controls_allowed(True) + should_tx = acc_state == self.acc_states["ACC_CANCEL_GENERIC_SILENT"] + self.assertFalse(self._tx(self._long_control_msg(0, acc_state=acc_state, accel_limits=(self.MIN_ACCEL, self.MAX_ACCEL)))) + self.assertEqual(should_tx, self._tx(self._long_control_msg(0, acc_state=acc_state))) + + def test_no_aeb(self): + for aeb_event in range(4): + should_tx = aeb_event == 0 + ret = self._tx(self._long_control_msg(10, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"], aeb_event=aeb_event)) + self.assertEqual(ret, should_tx) + + def test_stock_aeb_no_cancel(self): + # No passthrough logic since we always forward DAS_control, + # but ensure we can't send cancel cmd while stock AEB is active + no_aeb_msg = self._long_control_msg(10, acc_state=self.acc_states["ACC_CANCEL_GENERIC_SILENT"], aeb_event=0) + no_aeb_msg_cam = self._long_control_msg(10, aeb_event=0, bus=2) + aeb_msg_cam = self._long_control_msg(10, aeb_event=1, bus=2) + + # stock system sends no AEB -> no forwarding, and OP is allowed to TX + self.assertEqual(1, self._rx(no_aeb_msg_cam)) + self.assertEqual(0, self.safety.safety_fwd_hook(2, no_aeb_msg_cam.addr)) + self.assertTrue(self._tx(no_aeb_msg)) + + # stock system sends AEB -> forwarding, and OP is not allowed to TX + self.assertEqual(1, self._rx(aeb_msg_cam)) + self.assertEqual(0, self.safety.safety_fwd_hook(2, aeb_msg_cam.addr)) + self.assertFalse(self._tx(no_aeb_msg)) + + +class TestTeslaLegacyDasSteeringStockSafety(TestTeslaStockSafety): + SAFETY_PARAM = TeslaSafetyFlags.LEGACY_DAS_STEERING + STEER_TYPE_SHIFT = 1 + + +class TestTeslaLongitudinalSafety(TestTeslaSafetyBase): + SAFETY_PARAM = TeslaSafetyFlags.LONG_CONTROL + + RELAY_MALFUNCTION_ADDRS = {0: (MSG_DAS_steeringControl, MSG_APS_eacMonitor, MSG_DAS_Control)} + FWD_BLACKLISTED_ADDRS = {2: [MSG_DAS_steeringControl, MSG_APS_eacMonitor, MSG_DAS_Control]} + + def test_no_aeb(self): + for aeb_event in range(4): + self.assertEqual(self._tx(self._long_control_msg(10, aeb_event=aeb_event)), aeb_event == 0) + + def test_stock_aeb_passthrough(self): + no_aeb_msg = self._long_control_msg(10, aeb_event=0) + no_aeb_msg_cam = self._long_control_msg(10, aeb_event=0, bus=2) + aeb_msg_cam = self._long_control_msg(10, aeb_event=1, bus=2) + + # stock system sends no AEB -> no forwarding, and OP is allowed to TX + self.assertEqual(1, self._rx(no_aeb_msg_cam)) + self.assertEqual(-1, self.safety.safety_fwd_hook(2, no_aeb_msg_cam.addr)) + self.assertTrue(self._tx(no_aeb_msg)) + + # stock system sends AEB -> forwarding, and OP is not allowed to TX + self.assertEqual(1, self._rx(aeb_msg_cam)) + self.assertEqual(0, self.safety.safety_fwd_hook(2, aeb_msg_cam.addr)) + self.assertFalse(self._tx(no_aeb_msg)) + + def test_prevent_reverse(self): + # Note: Tesla can reverse while at a standstill if both accel_min and accel_max are negative. + self.safety.set_controls_allowed(True) + + # accel_min and accel_max are positive + self.assertTrue(self._tx(self._long_control_msg(set_speed=10, accel_limits=(1.1, 0.8)))) + self.assertTrue(self._tx(self._long_control_msg(set_speed=0, accel_limits=(1.1, 0.8)))) + + # accel_min and accel_max are both zero + self.assertTrue(self._tx(self._long_control_msg(set_speed=10, accel_limits=(0, 0)))) + self.assertTrue(self._tx(self._long_control_msg(set_speed=0, accel_limits=(0, 0)))) + + # accel_min and accel_max have opposing signs + self.assertTrue(self._tx(self._long_control_msg(set_speed=10, accel_limits=(-0.8, 1.3)))) + self.assertTrue(self._tx(self._long_control_msg(set_speed=0, accel_limits=(0.8, -1.3)))) + self.assertTrue(self._tx(self._long_control_msg(set_speed=0, accel_limits=(0, -1.3)))) + + # accel_min and accel_max are negative + self.assertFalse(self._tx(self._long_control_msg(set_speed=10, accel_limits=(-1.1, -0.6)))) + self.assertFalse(self._tx(self._long_control_msg(set_speed=0, accel_limits=(-0.6, -1.1)))) + self.assertFalse(self._tx(self._long_control_msg(set_speed=0, accel_limits=(-0.1, -0.1)))) + + +class TestTeslaLegacyDasSteeringLongitudinalSafety(TestTeslaLongitudinalSafety): + SAFETY_PARAM = TeslaSafetyFlags.LONG_CONTROL | TeslaSafetyFlags.LEGACY_DAS_STEERING + STEER_TYPE_SHIFT = 1 + + +class TestTeslaVehicleBusSafety(TestTeslaSafetyBase): + + LONGITUDINAL = False + + # With the vehicle bus harness, DAS_bodyControls is also TX'd on bus 1 (blinker MITM) + TX_MSGS = [*TestTeslaSafetyBase.TX_MSGS, [MSG_DAS_bodyControls, 1]] + + def setUp(self): + super().setUp() + self.safety = libsafety_py.libsafety + self.packer_adas = CANPackerSafety("tesla_model3_vehicle") + self.safety.set_current_safety_param_iq(TeslaSafetyFlagsIQ.HAS_VEHICLE_BUS) + self.safety.set_safety_hooks(CarParams.SafetyModel.tesla, 0) + self.safety.init_tests() + + def _lkas_button_msg(self, enabled): + values = {"UI_activeTouchPoints": 3 if enabled else 0} + return self.packer_adas.make_can_msg_safety("UI_status2", CANBUS.vehicle, values) + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_toyota.py b/artifacts/package_runtime/iqdbc/safety/tests/test_toyota.py new file mode 100644 index 000000000..90427d4f4 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_toyota.py @@ -0,0 +1,540 @@ +#!/usr/bin/env python3 +import numpy as np +import random +import unittest +import itertools + +from iqdbc.car.toyota.values import ToyotaSafetyFlags +from iqdbc.lvbs.car.toyota.values import ToyotaSafetyFlagsIQ +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety, parameterized_safety_class +from iqdbc.safety.tests.gas_interceptor_common import GasInterceptorSafetyTest + +TOYOTA_COMMON_TX_MSGS = [[0x2E4, 0], [0x191, 0], [0x412, 0], [0x343, 0], [0x1D2, 0]] # LKAS + LTA + ACC & PCM cancel cmds +TOYOTA_SECOC_TX_MSGS = [[0x131, 0], [0x183, 0]] + TOYOTA_COMMON_TX_MSGS +TOYOTA_COMMON_LONG_TX_MSGS = [[0x283, 0], [0x2E6, 0], [0x2E7, 0], [0x33E, 0], [0x344, 0], [0x365, 0], [0x366, 0], [0x4CB, 0], # DSU bus 0 + [0x128, 1], [0x141, 1], [0x160, 1], [0x161, 1], [0x470, 1], # DSU bus 1 + [0x411, 0], # PCS_HUD + [0x750, 0]] # radar diagnostic address +GAS_INTERCEPTOR_TX_MSGS = [[0x200, 0]] + +UNSUPPORTED_DSU = [ + {"SAFETY_PARAM_IQ": ToyotaSafetyFlagsIQ.LKAS_HUD}, + {"SAFETY_PARAM_IQ": ToyotaSafetyFlagsIQ.UNSUPPORTED_DSU | ToyotaSafetyFlagsIQ.LKAS_HUD}, +] + + +class TestToyotaSafetyBase(common.CarSafetyTest, common.LongitudinalAccelSafetyTest): + + TX_MSGS = TOYOTA_COMMON_TX_MSGS + TOYOTA_COMMON_LONG_TX_MSGS + RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412, 0x343)} + FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x412, 0x191, 0x343]} + EPS_SCALE = 73 + + SAFETY_PARAM_IQ: int = ToyotaSafetyFlagsIQ.LKAS_HUD + + packer: CANPackerSafety + safety: libsafety_py.LibSafety + + def _torque_meas_msg(self, torque: int, driver_torque: int | None = None): + values = {"STEER_TORQUE_EPS": (torque / self.EPS_SCALE) * 100.} + if driver_torque is not None: + values["STEER_TORQUE_DRIVER"] = driver_torque + return self.packer.make_can_msg_safety("STEER_TORQUE_SENSOR", 0, values) + + # Both torque and angle safety modes test with each other's steering commands + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"STEER_TORQUE_CMD": torque, "STEER_REQUEST": steer_req} + return self.packer.make_can_msg_safety("STEERING_LKA", 0, values) + + def _angle_meas_msg(self, angle: float, steer_angle_initializing: bool = False): + # This creates a steering torque angle message. Not set on all platforms, + # relative to init angle on some older TSS2 platforms. Only to be used with LTA + values = {"STEER_ANGLE": angle, "STEER_ANGLE_INITIALIZING": int(steer_angle_initializing)} + return self.packer.make_can_msg_safety("STEER_TORQUE_SENSOR", 0, values) + + def _angle_cmd_msg(self, angle: float, enabled: bool): + return self._lta_msg(int(enabled), int(enabled), angle, torque_wind_down=100 if enabled else 0) + + def _lta_msg(self, req, req2, angle_cmd, torque_wind_down=100): + values = {"STEER_REQUEST": req, "STEER_REQUEST_2": req2, "STEER_ANGLE_CMD": angle_cmd, "TORQUE_WIND_DOWN": torque_wind_down} + return self.packer.make_can_msg_safety("STEERING_LTA", 0, values) + + def _accel_msg_343(self, accel, cancel_req=0): + values = {"ACCEL_CMD": accel, "CANCEL_REQ": cancel_req} + return self.packer.make_can_msg_safety("ACC_CONTROL", 0, values) + + def _accel_msg(self, accel, cancel_req=0): + return self._accel_msg_343(accel, cancel_req) + + def _speed_msg(self, speed): + values = {("WHEEL_SPEED_%s" % n): speed * 3.6 for n in ["FR", "FL", "RR", "RL"]} + return self.packer.make_can_msg_safety("WHEEL_SPEEDS", 0, values) + + def _user_brake_msg(self, brake): + values = {"BRAKE_PRESSED": brake} + return self.packer.make_can_msg_safety("BRAKE_MODULE", 0, values) + + def _user_gas_msg(self, gas): + cruise_active = self.safety.get_controls_allowed() + values = {"GAS_RELEASED": not gas, "CRUISE_ACTIVE": cruise_active} + return self.packer.make_can_msg_safety("PCM_CRUISE", 0, values) + + def _pcm_status_msg(self, enable): + values = {"CRUISE_ACTIVE": enable} + return self.packer.make_can_msg_safety("PCM_CRUISE", 0, values) + + def _acc_state_msg(self, enabled): + msg = "DSU_CRUISE" if self.SAFETY_PARAM_IQ & ToyotaSafetyFlagsIQ.UNSUPPORTED_DSU else "PCM_CRUISE_2" + values = {"MAIN_ON": enabled} + return self.packer.make_can_msg_safety(msg, 0, values) + + def _lkas_button_msg(self, lkas_button=False, lda_value=None): + values = {"LDA_ON_MESSAGE": (1 if lkas_button else 0) if lda_value is None else lda_value} + return self.packer.make_can_msg_safety("LKAS_HUD", 2, values) + + def test_enable_control_allowed_with_aol_button(self): + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ | ToyotaSafetyFlagsIQ.LKAS_HUD) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.safety.get_current_safety_param()) + self.safety.init_tests() + for enable_aol in (True, False): + with self.subTest("enable_aol", aol_enabled=enable_aol): + self.safety.set_aol_params(enable_aol, False, False) + + self._rx(self._lkas_button_msg(False)) + self.assertEqual(0, self.safety.get_aol_button_press()) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + self._rx(self._lkas_button_msg(True)) + self.assertEqual(1, self.safety.get_aol_button_press()) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + self._rx(self._lkas_button_msg(False)) + self.assertEqual(0, self.safety.get_aol_button_press()) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + + self.safety.set_controls_allowed_lat(False) + self._rx(self._lkas_button_msg(False, lda_value=2)) + self.assertEqual(1, self.safety.get_aol_button_press()) + self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat()) + self._rx(self._lkas_button_msg(False)) + self.safety.set_controls_allowed_lat(False) + self.safety.set_aol_params(False, False, False) + + def test_lkas_button_requires_lkas_hud(self): + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ & ~ToyotaSafetyFlagsIQ.LKAS_HUD) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.safety.get_current_safety_param()) + self.safety.init_tests() + self.safety.set_aol_params(True, False, False) + button_state = self.safety.get_aol_button_press() + self._rx(self._lkas_button_msg(True)) + self.assertEqual(button_state, self.safety.get_aol_button_press()) + self.assertFalse(self.safety.get_controls_allowed_lat()) + + def test_diagnostics(self, stock_longitudinal: bool = False, ecu_disabled: bool = True): + for should_tx, msg in ((False, b"\x6D\x02\x3E\x00\x00\x00\x00\x00"), # fwdCamera tester present + (False, b"\x0F\x03\xAA\xAA\x00\x00\x00\x00"), # non-tester present + (True, b"\x0F\x02\x3E\x00\x00\x00\x00\x00")): + tester_present = libsafety_py.make_CANPacket(0x750, 0, msg) + self.assertEqual(should_tx and ecu_disabled and not stock_longitudinal, self._tx(tester_present)) + + def test_block_aeb(self, stock_longitudinal: bool = False): + for controls_allowed in (True, False): + for bad in (True, False): + for _ in range(10): + self.safety.set_controls_allowed(controls_allowed) + dat = [random.randint(1, 255) for _ in range(7)] + if not bad: + dat = [0]*6 + dat[-1:] + msg = libsafety_py.make_CANPacket(0x283, 0, bytes(dat)) + self.assertEqual(not bad and not stock_longitudinal, self._tx(msg)) + + # Only allow LTA msgs with no actuation + def test_lta_steer_cmd(self): + for engaged, req, req2, torque_wind_down, angle in itertools.product([True, False], + [0, 1], [0, 1], + [0, 50, 100], + np.linspace(-20, 20, 5)): + self.safety.set_controls_allowed(engaged) + + should_tx = not req and not req2 and angle == 0 and torque_wind_down == 0 + self.assertEqual(should_tx, self._tx(self._lta_msg(req, req2, angle, torque_wind_down)), + f"{req=} {req2=} {angle=} {torque_wind_down=}") + + def test_rx_hook(self): + # checksum checks + for msg in ["trq", "pcm"]: + self.safety.set_controls_allowed(1) + if msg == "trq": + msg = self._torque_meas_msg(0) + if msg == "pcm": + msg = self._pcm_status_msg(True) + self.assertTrue(self._rx(msg)) + msg[0].data[4] = 0 + msg[0].data[5] = 0 + msg[0].data[6] = 0 + msg[0].data[7] = 0 + self.assertFalse(self._rx(msg)) + self.assertFalse(self.safety.get_controls_allowed()) + + +class TestToyotaSafetyGasInterceptorBase(GasInterceptorSafetyTest, TestToyotaSafetyBase): + + TX_MSGS = TOYOTA_COMMON_TX_MSGS + TOYOTA_COMMON_LONG_TX_MSGS + GAS_INTERCEPTOR_TX_MSGS + INTERCEPTOR_THRESHOLD = 805 + + def setUp(self): + super().setUp() + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ | ToyotaSafetyFlagsIQ.GAS_INTERCEPTOR) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.safety.get_current_safety_param()) + self.safety.init_tests() + + def test_stock_longitudinal(self): + # If stock longitudinal is set, the gas interceptor safety param should not be respected + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ | ToyotaSafetyFlagsIQ.GAS_INTERCEPTOR) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.safety.get_current_safety_param() | ToyotaSafetyFlags.STOCK_LONGITUDINAL) + self.safety.init_tests() + + # Spot check a few gas interceptor tests: (1) reading interceptor, + # (2) behavior around interceptor, and (3) txing interceptor msgs + for test in (self.test_prev_gas_interceptor, self.test_no_disengage_on_gas_interceptor, + self.test_gas_interceptor_safety_check): + with self.subTest(test=test.__name__): + with self.assertRaises(AssertionError): + test() + + +@parameterized_safety_class(UNSUPPORTED_DSU) +class TestToyotaSafetyTorque(TestToyotaSafetyBase, common.MotorTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest): + + MAX_RATE_UP = 15 + MAX_RATE_DOWN = 25 + MAX_TORQUE_LOOKUP = [0], [1500] + MAX_RT_DELTA = 450 + MAX_TORQUE_ERROR = 350 + TORQUE_MEAS_TOLERANCE = 1 # toyota safety adds one to be conservative for rounding + + # Safety around steering req bit + MIN_VALID_STEERING_FRAMES = 17 + MAX_INVALID_STEERING_FRAMES = 1 + + @classmethod + def setUpClass(cls): + if cls.__name__ == "TestToyotaSafetyTorque": + cls.safety = None + raise unittest.SkipTest + + def setUp(self): + self.packer = CANPackerSafety("toyota_nodsu_pt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE) + self.safety.init_tests() + + +@parameterized_safety_class(UNSUPPORTED_DSU) +class TestToyotaSafetyTorqueGasInterceptor(TestToyotaSafetyGasInterceptorBase, TestToyotaSafetyTorque): + + @classmethod + def setUpClass(cls): + if cls.__name__ == "TestToyotaSafetyTorqueGasInterceptor": + cls.safety = None + raise unittest.SkipTest + + +class TestToyotaSafetyAngle(TestToyotaSafetyBase, common.AngleSteeringSafetyTest): + + # Angle control limits + STEER_ANGLE_MAX = 94.9461 # deg + DEG_TO_CAN = 17.452007 # 1 / 0.0573 deg to can + + ANGLE_RATE_BP = [5., 25., 25.] + ANGLE_RATE_UP = [0.3, 0.15, 0.15] # windup limit + ANGLE_RATE_DOWN = [0.36, 0.26, 0.26] # unwind limit + + MAX_LTA_ANGLE = 94.9461 # PCS faults if commanding above this, deg + MAX_MEAS_TORQUE = 1500 # max allowed measured EPS torque before wind down + MAX_LTA_DRIVER_TORQUE = 150 # max allowed driver torque before wind down + + def setUp(self): + self.packer = CANPackerSafety("toyota_nodsu_pt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.LTA) + self.safety.init_tests() + + # Only allow LKA msgs with no actuation + def test_lka_steer_cmd(self): + for engaged, steer_req, torque in itertools.product([True, False], + [0, 1], + np.linspace(-1500, 1500, 7)): + self.safety.set_controls_allowed(engaged) + torque = int(torque) + self.safety.set_rt_torque_last(torque) + self.safety.set_torque_meas(torque, torque) + self.safety.set_desired_torque_last(torque) + + should_tx = not steer_req and torque == 0 + self.assertEqual(should_tx, self._tx(self._torque_cmd_msg(torque, steer_req))) + + def test_lta_steer_cmd(self): + """ + Tests the LTA steering command message + controls_allowed: + * STEER_REQUEST and STEER_REQUEST_2 do not mismatch + * TORQUE_WIND_DOWN is only set to 0 or 100 when STEER_REQUEST and STEER_REQUEST_2 are both 1 + * Full torque messages are blocked if either EPS torque or driver torque is above the threshold + + not controls_allowed: + * STEER_REQUEST, STEER_REQUEST_2, and TORQUE_WIND_DOWN are all 0 + """ + for controls_allowed in (True, False): + for angle in np.arange(-90, 90, 1): + self.safety.set_controls_allowed(controls_allowed) + self._reset_angle_measurement(angle) + self._set_prev_desired_angle(angle) + + self.assertTrue(self._tx(self._lta_msg(0, 0, angle, 0))) + if controls_allowed: + # Test the two steer request bits and TORQUE_WIND_DOWN torque wind down signal + for req, req2, torque_wind_down in itertools.product([0, 1], [0, 1], [0, 50, 100]): + mismatch = not (req or req2) and torque_wind_down != 0 + should_tx = req == req2 and (torque_wind_down in (0, 100)) and not mismatch + self.assertEqual(should_tx, self._tx(self._lta_msg(req, req2, angle, torque_wind_down))) + + # Test max EPS torque and driver override thresholds + cases = itertools.product( + (0, self.MAX_MEAS_TORQUE - 1, self.MAX_MEAS_TORQUE, self.MAX_MEAS_TORQUE + 1, self.MAX_MEAS_TORQUE * 2), + (0, self.MAX_LTA_DRIVER_TORQUE - 1, self.MAX_LTA_DRIVER_TORQUE, self.MAX_LTA_DRIVER_TORQUE + 1, self.MAX_LTA_DRIVER_TORQUE * 2) + ) + + for eps_torque, driver_torque in cases: + for sign in (-1, 1): + for _ in range(6): + self._rx(self._torque_meas_msg(sign * eps_torque, sign * driver_torque)) + + # Toyota adds 1 to EPS torque since it is rounded after EPS factor + should_tx = (eps_torque - 1) <= self.MAX_MEAS_TORQUE and driver_torque <= self.MAX_LTA_DRIVER_TORQUE + self.assertEqual(should_tx, self._tx(self._lta_msg(1, 1, angle, 100))) + self.assertTrue(self._tx(self._lta_msg(1, 1, angle, 0))) # should tx if we wind down torque + + else: + # Controls not allowed + for req, req2, torque_wind_down in itertools.product([0, 1], [0, 1], [0, 50, 100]): + should_tx = not (req or req2) and torque_wind_down == 0 + self.assertEqual(should_tx, self._tx(self._lta_msg(req, req2, angle, torque_wind_down))) + + def test_angle_measurements(self): + """ + * Tests angle meas quality flag dictates whether angle measurement is parsed, and if rx is valid + * Tests rx hook correctly clips the angle measurement, since it is to be compared to LTA cmd when inactive + """ + for steer_angle_initializing in (True, False): + for angle in np.arange(0, self.STEER_ANGLE_MAX * 2, 1): + # If init flag is set, do not rx or parse any angle measurements + for a in (angle, -angle, 0, 0, 0, 0): + self.assertEqual(not steer_angle_initializing, + self._rx(self._angle_meas_msg(a, steer_angle_initializing))) + + final_angle = 0 if steer_angle_initializing else round(angle * self.DEG_TO_CAN) + self.assertEqual(self.safety.get_angle_meas_min(), -final_angle) + self.assertEqual(self.safety.get_angle_meas_max(), final_angle) + + self._rx(self._angle_meas_msg(0)) + self.assertEqual(self.safety.get_angle_meas_min(), -final_angle) + self.assertEqual(self.safety.get_angle_meas_max(), 0) + + self._rx(self._angle_meas_msg(0)) + self.assertEqual(self.safety.get_angle_meas_min(), 0) + self.assertEqual(self.safety.get_angle_meas_max(), 0) + + +class TestToyotaSafetyAngleGasInterceptor(TestToyotaSafetyGasInterceptorBase, TestToyotaSafetyAngle): + pass + + +@parameterized_safety_class(UNSUPPORTED_DSU) +class TestToyotaAltBrakeSafety(TestToyotaSafetyTorque): + + @classmethod + def setUpClass(cls): + if cls.__name__ == "TestToyotaAltBrakeSafety": + cls.safety = None + raise unittest.SkipTest + + def setUp(self): + self.packer = CANPackerSafety("toyota_new_mc_pt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.ALT_BRAKE) + self.safety.init_tests() + + def _user_brake_msg(self, brake): + values = {"BRAKE_PRESSED": brake} + return self.packer.make_can_msg_safety("BRAKE_MODULE", 0, values) + + # No LTA message in the DBC + def test_lta_steer_cmd(self): + pass + + +@parameterized_safety_class(UNSUPPORTED_DSU) +class TestToyotaAltBrakeSafetyGasInterceptor(TestToyotaSafetyGasInterceptorBase, TestToyotaAltBrakeSafety): + + @classmethod + def setUpClass(cls): + if cls.__name__ == "TestToyotaAltBrakeSafetyGasInterceptor": + cls.safety = None + raise unittest.SkipTest + + # No LTA message in the DBC + def test_lta_steer_cmd(self): + pass + + +class TestToyotaStockLongitudinalBase(TestToyotaSafetyBase): + + TX_MSGS = TOYOTA_COMMON_TX_MSGS + # Base addresses minus ACC_CONTROL (0x343) + RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412)} + FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x412, 0x191]} + + LONGITUDINAL = False + + def test_diagnostics(self, stock_longitudinal: bool = True, ecu_disabled: bool = True): + super().test_diagnostics(stock_longitudinal=stock_longitudinal, ecu_disabled=ecu_disabled) + + def test_block_aeb(self, stock_longitudinal: bool = True): + super().test_block_aeb(stock_longitudinal=stock_longitudinal) + + def test_acc_cancel(self): + """ + Regardless of controls allowed, never allow ACC_CONTROL if cancel bit isn't set + """ + for controls_allowed in [True, False]: + self.safety.set_controls_allowed(controls_allowed) + for accel in np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.1): + self.assertFalse(self._tx(self._accel_msg_343(accel))) + should_tx = np.isclose(accel, self.INACTIVE_ACCEL, atol=0.0001) + self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel, cancel_req=1))) + + +@parameterized_safety_class(UNSUPPORTED_DSU) +class TestToyotaStockLongitudinalTorque(TestToyotaStockLongitudinalBase, TestToyotaSafetyTorque): + + @classmethod + def setUpClass(cls): + if cls.__name__ == "TestToyotaStockLongitudinalTorque": + cls.safety = None + raise unittest.SkipTest + + def setUp(self): + self.packer = CANPackerSafety("toyota_nodsu_pt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.STOCK_LONGITUDINAL) + self.safety.init_tests() + + +class TestToyotaStockLongitudinalAngle(TestToyotaStockLongitudinalBase, TestToyotaSafetyAngle): + + def setUp(self): + self.packer = CANPackerSafety("toyota_nodsu_pt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, + self.EPS_SCALE | ToyotaSafetyFlags.STOCK_LONGITUDINAL | ToyotaSafetyFlags.LTA) + self.safety.init_tests() + + +class TestToyotaSecOcSafetyBase(TestToyotaSafetyBase): + + TX_MSGS = TOYOTA_SECOC_TX_MSGS + RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412, 0x131)} + FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x191, 0x412, 0x131]} + + def setUp(self): + self.packer = CANPackerSafety("toyota_secoc_pt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, + self.EPS_SCALE | ToyotaSafetyFlags.SECOC) + self.safety.init_tests() + + def test_diagnostics(self, ecu_disabled: bool = False): + super().test_diagnostics(ecu_disabled=ecu_disabled) + + # This platform also has alternate brake and PCM messages, but same naming in the DBC, so same packers work + + def _user_gas_msg(self, gas): + values = {"GAS_PEDAL_USER": gas} + return self.packer.make_can_msg_safety("GAS_PEDAL", 0, values) + + # This platform sends both STEERING_LTA (same as other Toyota) and STEERING_LTA_2 (SecOC signed) + # STEERING_LTA is checked for no-actuation by the base class, STEERING_LTA_2 is checked for no-actuation below + + def _lta_2_msg(self, req, req2, angle_cmd, torque_wind_down=100): + values = {"STEER_REQUEST": req, "STEER_REQUEST_2": req2, "STEER_ANGLE_CMD": angle_cmd} + return self.packer.make_can_msg_safety("STEERING_LTA_2", 0, values) + + def test_lta_2_steer_cmd(self): + for engaged, req, req2, angle in itertools.product([True, False], [0, 1], [0, 1], np.linspace(-20, 20, 5)): + self.safety.set_controls_allowed(engaged) + + should_tx = not req and not req2 and angle == 0 + self.assertEqual(should_tx, self._tx(self._lta_2_msg(req, req2, angle)), f"{req=} {req2=} {angle=}") + + def _accel_msg_183(self, accel): + values = {"ACCEL_CMD": accel} + return self.packer.make_can_msg_safety("ACC_CONTROL_2", 0, values) + + def _accel_msg(self, accel, cancel_req=0): + return self._accel_msg_183(accel) + + +class TestToyotaSecOcSafetyStockLongitudinal(TestToyotaSecOcSafetyBase, TestToyotaStockLongitudinalBase): + + def setUp(self): + self.packer = CANPackerSafety("toyota_secoc_pt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, + self.EPS_SCALE | ToyotaSafetyFlags.STOCK_LONGITUDINAL | ToyotaSafetyFlags.SECOC) + self.safety.init_tests() + + +class TestToyotaSecOcSafety(TestToyotaSecOcSafetyBase): + + RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412, 0x131, 0x343, 0x183)} + FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x191, 0x412, 0x131, 0x343, 0x183]} + + def setUp(self): + self.packer = CANPackerSafety("toyota_secoc_pt_generated") + self.safety = libsafety_py.libsafety + self.safety.set_current_safety_param_iq(self.SAFETY_PARAM_IQ) + self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.SECOC) + self.safety.init_tests() + + def test_block_aeb(self, stock_longitudinal: bool = False): + for data in (bytes(8), bytes([1] * 8), bytes([255] * 8)): + self.assertFalse(self._tx(libsafety_py.make_CANPacket(0x283, 0, data))) + + def test_343_actuation_blocked(self): + """ + For SecOC cars, longitudinal acceleration must be sent in ACC_CONTROL_2, but all other ACC + data remains in ACC_CONTROL. Verify no actuation is sent via ACC_CONTROL. + """ + for controls_allowed in [True, False]: + self.safety.set_controls_allowed(controls_allowed) + for accel in np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.1): + should_tx = np.isclose(accel, self.INACTIVE_ACCEL, atol=0.0001) + self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel))) + self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel, cancel_req=1))) + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_meb.py b/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_meb.py new file mode 100644 index 000000000..fceb0fa64 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_meb.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python3 +import unittest +import numpy as np + +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety +from iqdbc.car.volkswagen.values import VolkswagenSafetyFlags +from iqdbc.car.lateral import ISO_LATERAL_JERK + +MAX_ACCEL = 2.0 +MIN_ACCEL = -3.5 + +MSG_ESC_51 = 0xFC +MSG_QFK_01 = 0x13D +MSG_Motor_54 = 0x14C +MSG_Motor_51 = 0x10B +MSG_ACC_18 = 0x14D +MSG_MEB_ACC_01 = 0x300 +MSG_HCA_03 = 0x303 +MSG_GRA_ACC_01 = 0x12B +MSG_LDW_02 = 0x397 +MSG_MOTOR_14 = 0x3BE +MSG_TA_01 = 0x26B +MSG_KLR_01 = 0x25D +MSG_EA_01 = 0x1A4 +MSG_EA_02 = 0x1F0 +MSG_AWV_03 = 0xDB +MSG_MEB_DISTANCE_01 = 0x24F +MSG_UDS_FUNCTIONAL = 0x700 + + +class TestVolkswagenMebSafetyBase(common.CarSafetyTest): + RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_03, MSG_LDW_02, MSG_EA_02), + 2: (MSG_KLR_01,)} + + CURVATURE_TO_CAN = 149253.7313 + MAX_CURVATURE = 0.195 + SEND_RATE = 0.02 + MAX_POWER = 225 + POWER_FACTOR = 0.4 + + def _speed_msg(self, speed_mps: float): + spd_kph = speed_mps * 3.6 + values = {"HL_Radgeschw": spd_kph, "HR_Radgeschw": spd_kph, "VL_Radgeschw": spd_kph, "VR_Radgeschw": spd_kph} + return self.packer.make_can_msg_safety("ESC_51", 0, values) + + def _speed_msg_2(self, speed: float): + return None + + def _motor_14_msg(self, brake): + values = {"MO_Fahrer_bremst": brake} + return self.packer.make_can_msg_safety("Motor_14", 0, values) + + def _user_brake_msg(self, brake): + return self._motor_14_msg(brake) + + def _user_gas_msg(self, gas): + values = {"Accel_Pedal_Pressure": gas, "TSK_Status": 3} + return self.packer.make_can_msg_safety("Motor_51", 0, values) + + def _tsk_status_msg(self, enable, main_switch=True): + tsk_status = 3 if enable else (2 if main_switch else 0) + values = {"TSK_Status": tsk_status} + return self.packer.make_can_msg_safety("Motor_51", 0, values) + + def _pcm_status_msg(self, enable): + return self._tsk_status_msg(enable) + + def _curvature_meas_msg(self, curvature): + values = {"Curvature": abs(curvature), "Curvature_VZ": curvature > 0} + return self.packer.make_can_msg_safety("QFK_01", 0, values) + + def _curvature_cmd_msg(self, curvature, steer_req=True, power=50): + values = { + "Curvature": abs(curvature), + "Curvature_VZ": curvature > 0, + "RequestStatus": 4 if steer_req else 0, + "Power": power, + } + return self.packer.make_can_msg_safety("HCA_03", 0, values) + + def _button_msg(self, cancel=0, resume=0, _set=0, bus=2): + values = {"GRA_Abbrechen": cancel, "GRA_Tip_Setzen": _set, "GRA_Tip_Wiederaufnahme": resume} + return self.packer.make_can_msg_safety("GRA_ACC_01", bus, values) + + def test_curvature_measurements(self): + self._rx(self._curvature_meas_msg(0.15)) + self._rx(self._curvature_meas_msg(-0.1)) + for _ in range(4): + self._rx(self._curvature_meas_msg(0)) + + self.assertEqual(int(-0.1 * self.CURVATURE_TO_CAN), self.safety.get_angle_meas_min()) + self.assertEqual(int(0.15 * self.CURVATURE_TO_CAN), self.safety.get_angle_meas_max()) + + self._reset_safety_hooks() + self.assertEqual(0, self.safety.get_angle_meas_min()) + self.assertEqual(0, self.safety.get_angle_meas_max()) + + def test_curvature_cmd_limits(self): + self._rx(self._speed_msg(0.0)) + self._rx(self._curvature_meas_msg(0.0)) + self.safety.set_controls_allowed(True) + + self.safety.set_desired_angle_last(int(self.MAX_CURVATURE * self.CURVATURE_TO_CAN)) + self.assertTrue(self._tx(self._curvature_cmd_msg(self.MAX_CURVATURE, True, power=50))) + self.safety.set_desired_angle_last(int(self.MAX_CURVATURE * self.CURVATURE_TO_CAN)) + self.assertTrue(self._tx(self._curvature_cmd_msg(self.MAX_CURVATURE + 0.05, True, power=50))) + + self.assertTrue(self._tx(self._curvature_cmd_msg(0.0, False, power=0))) + self.assertTrue(self._tx(self._curvature_cmd_msg(0.01, False, power=0))) + + power_over = (self.MAX_POWER + 1) * self.POWER_FACTOR + self.assertTrue(self._tx(self._curvature_cmd_msg(0.0, True, power=power_over))) + + def test_curvature_cmd_jerk_limit(self): + speed = 10.0 + for _ in range(common.MAX_SAMPLE_VALS): + self._rx(self._speed_msg(speed)) + self._rx(self._curvature_meas_msg(0.0)) + self.safety.set_controls_allowed(True) + + max_rate = ISO_LATERAL_JERK / (speed * speed) + max_delta = max_rate * self.SEND_RATE + prev = 0.0 + self.safety.set_desired_angle_last(int(prev * self.CURVATURE_TO_CAN)) + + self.assertTrue(self._tx(self._curvature_cmd_msg(prev + max_delta * 0.9, True, power=50))) + self.safety.set_desired_angle_last(int(prev * self.CURVATURE_TO_CAN)) + self.assertTrue(self._tx(self._curvature_cmd_msg(prev + max_delta * 3.0, True, power=50))) + + +class TestVolkswagenMebStockSafety(TestVolkswagenMebSafetyBase): + TX_MSGS = [[MSG_HCA_03, 0], [MSG_LDW_02, 0], [MSG_GRA_ACC_01, 0], [MSG_GRA_ACC_01, 2], + [MSG_EA_01, 0], [MSG_EA_02, 0], [MSG_KLR_01, 0], [MSG_KLR_01, 2]] + FWD_BLACKLISTED_ADDRS = {0: [MSG_KLR_01], + 2: [MSG_HCA_03, MSG_LDW_02, MSG_EA_02]} + + def setUp(self): + self.packer = CANPackerSafety("vw_meb") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMeb, 0) + self.safety.init_tests() + + def test_spam_cancel_safety_check(self): + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._button_msg(cancel=1))) + self.assertFalse(self._tx(self._button_msg(resume=1))) + self.assertFalse(self._tx(self._button_msg(_set=1))) + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._button_msg(resume=1))) + + +class TestVolkswagenMqbEvoStockSafety(TestVolkswagenMebStockSafety): + def setUp(self): + self.packer = CANPackerSafety("vw_mqbevo") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMqbEvo, VolkswagenSafetyFlags.NO_GAS_OFFSET) + self.safety.init_tests() + + +class TestVolkswagenMebLongSafety(TestVolkswagenMebSafetyBase): + TX_MSGS = [[MSG_HCA_03, 0], [MSG_LDW_02, 0], + [MSG_MEB_ACC_01, 0], [MSG_ACC_18, 0], [MSG_TA_01, 0], + [MSG_EA_01, 0], [MSG_EA_02, 0], [MSG_KLR_01, 0], [MSG_KLR_01, 2], + [MSG_AWV_03, 0], [MSG_MEB_DISTANCE_01, 0], [MSG_UDS_FUNCTIONAL, 0]] + FWD_BLACKLISTED_ADDRS = {0: [MSG_KLR_01], + 2: [MSG_HCA_03, MSG_LDW_02, MSG_EA_02, MSG_MEB_ACC_01, MSG_ACC_18, MSG_TA_01]} + RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_03, MSG_LDW_02, MSG_EA_02, MSG_TA_01, MSG_MEB_ACC_01, MSG_ACC_18), + 2: (MSG_KLR_01,)} + INACTIVE_ACCEL = 3.01 + + def setUp(self): + self.packer = CANPackerSafety("vw_meb") + self.safety = libsafety_py.libsafety + safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMeb, safety_param) + self.safety.init_tests() + + def _accel_msg(self, accel): + values = {"ACC_Sollbeschleunigung_02": accel} + return self.packer.make_can_msg_safety("ACC_18", 0, values) + + def test_disable_control_allowed_from_cruise(self): + pass + + def test_enable_control_allowed_from_cruise(self): + pass + + def test_cruise_engaged_prev(self): + pass + + def test_set_and_resume_buttons(self): + for button in ["set", "resume"]: + self.safety.set_controls_allowed(0) + self._rx(self._tsk_status_msg(False, main_switch=False)) + self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) + self.assertFalse(self.safety.get_controls_allowed()) + self._rx(self._tsk_status_msg(False, main_switch=True)) + self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) + self.assertFalse(self.safety.get_controls_allowed()) + self._rx(self._button_msg(bus=0)) + self.assertTrue(self.safety.get_controls_allowed()) + + def test_cancel_button(self): + self._rx(self._tsk_status_msg(False, main_switch=True)) + self.safety.set_controls_allowed(1) + self._rx(self._button_msg(cancel=True, bus=0)) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_main_switch(self): + self._rx(self._tsk_status_msg(False, main_switch=True)) + self.safety.set_controls_allowed(1) + self._rx(self._tsk_status_msg(False, main_switch=False)) + self.assertFalse(self.safety.get_controls_allowed()) + + def test_accel_safety_check(self): + for controls_allowed in [True, False]: + for accel in np.concatenate((np.arange(MIN_ACCEL - 2, MAX_ACCEL + 2, 0.03), [0, self.INACTIVE_ACCEL])): + accel = round(accel, 2) + self.safety.set_controls_allowed(controls_allowed) + self.assertTrue(self._tx(self._accel_msg(accel)), (controls_allowed, accel)) + + def test_accel_allowed_with_gas_pressed(self): + self._rx(self._user_gas_msg(1)) + self.safety.set_controls_allowed(True) + self.assertTrue(self._tx(self._accel_msg(0.5))) + + +class TestVolkswagenMqbEvoLongSafety(TestVolkswagenMebLongSafety): + def setUp(self): + self.packer = CANPackerSafety("vw_mqbevo") + self.safety = libsafety_py.libsafety + safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.NO_GAS_OFFSET | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMqbEvo, safety_param) + self.safety.init_tests() + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_mlb.py b/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_mlb.py new file mode 100644 index 000000000..becd1d6fa --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_mlb.py @@ -0,0 +1,287 @@ +#!/usr/bin/env python3 +import unittest +import numpy as np +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety +from iqdbc.car.volkswagen.values import VolkswagenSafetyFlags + +MAX_ACCEL = 2.0 +MIN_ACCEL = -2.95 # MLB floor, the shared -3.5 faults the Q5 ACC ECU until an ignition cycle +INACTIVE_ACCEL = 3.01 # one increment above the ACC_01 range max +INACTIVE_ACCEL_TOLERANCE = 15 # raw counts, matches VOLKSWAGEN_MLB_INACTIVE_ACCEL_TOLERANCE + +MSG_LH_EPS_03 = 0x9F # RX from EPS, for driver steering torque +MSG_ACC_01 = 0x109 # TX by OP, ACC acceleration request to the drivetrain coordinator +MSG_ESP_03 = 0x103 # RX from ABS, for wheel speeds +MSG_MOTOR_03 = 0x105 # RX from ECU, for driver throttle input and driver brake input +MSG_ESP_05 = 0x106 # RX from ABS, for brake light state +MSG_LS_01 = 0x10B # TX by OP, ACC control buttons for cancel/resume +MSG_TSK_02 = 0x10C # RX from ECU, for ACC status from drivetrain coordinator +MSG_HCA_01 = 0x126 # TX by OP, Heading Control Assist steering torque +MSG_ACC_02 = 0x30C # TX by OP, ACC HUD data to the instrument cluster +MSG_LDW_02 = 0x397 # TX by OP, Lane line recognition and text alerts + + +class TestVolkswagenMlbSafetyBase(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest): + RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01, MSG_LDW_02)} + + MAX_RATE_UP = 9 + MAX_RATE_DOWN = 10 + MAX_TORQUE_LOOKUP = [0], [300] + MAX_RT_DELTA = 169 + + DRIVER_TORQUE_ALLOWANCE = 80 + DRIVER_TORQUE_FACTOR = 3 + + # Wheel speeds _esp_03_msg + def _speed_msg(self, speed): + values = {"ESP_%s_Radgeschw" % s: speed for s in ["HL", "HR", "VL", "VR"]} + return self.packer.make_can_msg_safety("ESP_03", 0, values) + + # Driver brake pressure over threshold + def _esp_05_msg(self, brake): + values = {"ESP_Fahrer_bremst": brake} + return self.packer.make_can_msg_safety("ESP_05", 0, values) + + # Brake pedal switch + def _motor_03_msg(self, brake_signal=False, gas_signal=0): + values = { + "MO_BLS": brake_signal, + "MO_Fahrpedalrohwert_01": gas_signal, + } + return self.packer.make_can_msg_safety("Motor_03", 0, values) + + def _user_brake_msg(self, brake): + return self._motor_03_msg(brake_signal=brake) + + def _user_gas_msg(self, gas): + return self._motor_03_msg(gas_signal=gas) + + # ACC engagement status + def _tsk_status_msg(self, enable, main_switch=True): + values = {"ACC_Status_ACC": 1 if not main_switch else 3 if enable else 2} + return self.packer.make_can_msg_safety("ACC_05", 2, values) + + def _pcm_status_msg(self, enable): + return self._tsk_status_msg(enable) + + # Driver steering input torque + def _torque_driver_msg(self, torque): + values = {"EPS_Lenkmoment": abs(torque), "EPS_VZ_Lenkmoment": torque < 0} + return self.packer.make_can_msg_safety("LH_EPS_03", 0, values) + + # openpilot steering output torque + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"HCA_01_LM_Offset": abs(torque), + "HCA_01_LM_OffSign": torque < 0, + "HCA_01_Sendestatus": steer_req, + "HCA_01_Status_HCA": 7 if steer_req else 3} + return self.packer.make_can_msg_safety("HCA_01", 0, values) + + # Cruise control buttons + def _ls_01_msg(self, cancel=0, resume=0, _set=0, main_switch=1, bus=2): + values = {"LS_Abbrechen": cancel, "LS_Tip_Setzen": _set, "LS_Tip_Wiederaufnahme": resume, + "LS_Hauptschalter": main_switch} + return self.packer.make_can_msg_safety("LS_01", bus, values) + + # Acceleration request to drivetrain coordinator + def _acc_01_msg(self, accel): + values = {"ACC_Sollbeschleunigung": accel} + return self.packer.make_can_msg_safety("ACC_01", 0, values) + + # Verify brake_pressed is true if either the switch or pressure threshold signals are true + def test_redundant_brake_signals(self): + test_combinations = [(True, True, True), (True, True, False), (True, False, True), (False, False, False)] + for brake_pressed, motor_03_signal, esp_05_signal in test_combinations: + self._rx(self._motor_03_msg(brake_signal=False)) + self._rx(self._esp_05_msg(False)) + self.assertFalse(self.safety.get_brake_pressed_prev()) + self._rx(self._motor_03_msg(brake_signal=motor_03_signal)) + self._rx(self._esp_05_msg(esp_05_signal)) + self.assertEqual(brake_pressed, self.safety.get_brake_pressed_prev(), + f"expected {brake_pressed=} with {motor_03_signal=} and {esp_05_signal=}") + + def test_torque_measurements(self): + # TODO: make this test work with all cars + self._rx(self._torque_driver_msg(50)) + self._rx(self._torque_driver_msg(-50)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + + self.assertEqual(-50, self.safety.get_torque_driver_min()) + self.assertEqual(50, self.safety.get_torque_driver_max()) + + self._rx(self._torque_driver_msg(0)) + self.assertEqual(0, self.safety.get_torque_driver_max()) + self.assertEqual(-50, self.safety.get_torque_driver_min()) + + self._rx(self._torque_driver_msg(0)) + self.assertEqual(0, self.safety.get_torque_driver_max()) + self.assertEqual(0, self.safety.get_torque_driver_min()) + + +class TestVolkswagenMlbStockSafety(TestVolkswagenMlbSafetyBase): + TX_MSGS = [[MSG_HCA_01, 0], [MSG_LDW_02, 0], [MSG_LS_01, 0], [MSG_LS_01, 2]] + FWD_BLACKLISTED_ADDRS = {2: [MSG_HCA_01, MSG_LDW_02]} + FWD_BUS_LOOKUP = {0: 2, 2: 0} + + def setUp(self): + self.packer = CANPackerSafety("vw_mlb") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMlb, 0) + self.safety.init_tests() + + def test_spam_cancel_safety_check(self): + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._ls_01_msg(cancel=1))) + self.assertFalse(self._tx(self._ls_01_msg(resume=1))) + self.assertFalse(self._tx(self._ls_01_msg(_set=1))) + # do not block resume if we are engaged already + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._ls_01_msg(resume=1))) + + def test_cancel_button(self): + # Disable on rising edge of cancel button + self._rx(self._tsk_status_msg(False, main_switch=True)) + self.safety.set_controls_allowed(1) + self._rx(self._ls_01_msg(cancel=True, bus=0)) + self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after cancel") + + +class TestVolkswagenMlbLongSafety(TestVolkswagenMlbSafetyBase): + TX_MSGS = [[MSG_HCA_01, 0], [MSG_LDW_02, 0], [MSG_ACC_01, 0], [MSG_ACC_02, 0]] + FWD_BLACKLISTED_ADDRS = {2: [MSG_HCA_01, MSG_LDW_02, MSG_ACC_01, MSG_ACC_02]} + FWD_BUS_LOOKUP = {0: 2, 2: 0} + RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01, MSG_LDW_02, MSG_ACC_01, MSG_ACC_02)} + + def setUp(self): + self.packer = CANPackerSafety("vw_mlb") + self.safety = libsafety_py.libsafety + safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMlb, safety_param) + self.safety.init_tests() + + # stock cruise controls are entirely bypassed under openpilot longitudinal control + def test_disable_control_allowed_from_cruise(self): + pass + + def test_enable_control_allowed_from_cruise(self): + pass + + def test_cruise_engaged_prev(self): + pass + + def test_set_and_resume_buttons(self): + for button in ["set", "resume"]: + # ACC main switch must be on, engage on falling edge + self.safety.set_controls_allowed(0) + self._rx(self._ls_01_msg(_set=(button == "set"), resume=(button == "resume"), main_switch=0, bus=0)) + self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} with main switch off") + self._rx(self._ls_01_msg(main_switch=0, bus=0)) + self._rx(self._ls_01_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) + self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} rising edge") + self._rx(self._ls_01_msg(bus=0)) + self.assertTrue(self.safety.get_controls_allowed(), f"controls not allowed on {button} falling edge") + + def test_main_switch(self): + # Disable as soon as the ACC main switch turns off + self._rx(self._ls_01_msg(bus=0)) + self.safety.set_controls_allowed(1) + self._rx(self._ls_01_msg(main_switch=0, bus=0)) + self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after ACC main switch off") + + @staticmethod + def _acc_01_accel_on_wire(accel): + # ACC_Sollbeschleunigung: 11 bits, 0.005 m/s^2 per count, offset -7.22, scaled by 1000 in safety + raw = round((accel + 7.22) / 0.005) & 0x7FF + return raw * 5 - 7220 + + def test_accel_safety_check(self): + for controls_allowed in [True, False]: + for accel in np.concatenate((np.arange(MIN_ACCEL - 2, MAX_ACCEL + 2, 0.03), [0, INACTIVE_ACCEL])): + accel = round(accel, 2) + on_wire = self._acc_01_accel_on_wire(accel) + is_inactive_accel = on_wire == 0 or abs(on_wire - 3010) <= INACTIVE_ACCEL_TOLERANCE + send = (controls_allowed and MIN_ACCEL <= accel <= MAX_ACCEL) or is_inactive_accel + self.safety.set_controls_allowed(controls_allowed) + self.assertEqual(send, self._tx(self._acc_01_msg(accel)), (controls_allowed, accel)) + + def test_accel_allowed_with_gas_pressed(self): + self._rx(self._user_gas_msg(1)) + self.safety.set_controls_allowed(True) + self.assertTrue(self._tx(self._acc_01_msg(0.5))) + + +class TestVolkswagenMlbNoEcanSafety(TestVolkswagenMlbSafetyBase): + TX_MSGS = [[MSG_HCA_01, 1], [MSG_LDW_02, 1], [MSG_LS_01, 1]] + FWD_BLACKLISTED_ADDRS = {} + FWD_BUS_LOOKUP = {0: 2, 2: 0} + RELAY_MALFUNCTION_ADDRS = {1: (MSG_HCA_01, MSG_LDW_02)} + + def setUp(self): + self.packer = CANPackerSafety("vw_mlb") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenMlb, VolkswagenSafetyFlags.MLB_NO_ECAN) + self.safety.init_tests() + + def _speed_msg(self, speed): + values = {"ESP_%s_Radgeschw" % s: speed for s in ["HL", "HR", "VL", "VR"]} + return self.packer.make_can_msg_safety("ESP_03", 1, values) + + def _esp_05_msg(self, brake): + values = {"ESP_Fahrer_bremst": brake} + return self.packer.make_can_msg_safety("ESP_05", 1, values) + + def _motor_03_msg(self, brake_signal=False, gas_signal=0): + values = {"MO_BLS": brake_signal, "MO_Fahrpedalrohwert_01": gas_signal} + return self.packer.make_can_msg_safety("Motor_03", 1, values) + + def _torque_driver_msg(self, torque): + values = {"EPS_Lenkmoment": abs(torque), "EPS_VZ_Lenkmoment": torque < 0} + return self.packer.make_can_msg_safety("LH_EPS_03", 1, values) + + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"HCA_01_LM_Offset": abs(torque), + "HCA_01_LM_OffSign": torque < 0, + "HCA_01_Sendestatus": steer_req, + "HCA_01_Status_HCA": 7 if steer_req else 3} + return self.packer.make_can_msg_safety("HCA_01", 1, values) + + def _ls_01_msg(self, cancel=0, resume=0, _set=0, main_switch=1, bus=1): + values = {"LS_Abbrechen": cancel, "LS_Tip_Setzen": _set, "LS_Tip_Wiederaufnahme": resume, + "LS_Hauptschalter": main_switch} + return self.packer.make_can_msg_safety("LS_01", bus, values) + + def _tsk_status_msg(self, enable, main_switch=True): + values = {"TSK_Status": 1 if enable else 0 if main_switch else 3} + return self.packer.make_can_msg_safety("TSK_02", 1, values) + + def test_spam_cancel_safety_check(self): + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._ls_01_msg(cancel=1))) + self.assertFalse(self._tx(self._ls_01_msg(resume=1))) + self.assertFalse(self._tx(self._ls_01_msg(_set=1))) + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._ls_01_msg(resume=1))) + + def test_cancel_button(self): + self._rx(self._tsk_status_msg(False, main_switch=True)) + self.safety.set_controls_allowed(1) + self._rx(self._ls_01_msg(cancel=True)) + self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after cancel") + + def test_ecan_bus_is_ignored(self): + self._rx(self._torque_driver_msg(0)) + self.safety.set_controls_allowed(1) + self._rx(self.packer.make_can_msg_safety("LS_01", 0, {"LS_Abbrechen": 1, "LS_Hauptschalter": 1})) + self.assertTrue(self.safety.get_controls_allowed(), "bus 0 cancel disengaged a no-ECAN car") + self._rx(self.packer.make_can_msg_safety("LH_EPS_03", 0, {"EPS_Lenkmoment": 200, "EPS_VZ_Lenkmoment": 0})) + self.assertEqual(0, self.safety.get_torque_driver_max(), "bus 0 EPS torque reached the driver sample") + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_mqb.py b/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_mqb.py new file mode 100644 index 000000000..cafd491f9 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_mqb.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 +import unittest +import numpy as np +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety +from iqdbc.car.volkswagen.values import VolkswagenSafetyFlags + +MAX_ACCEL = 2.0 +MIN_ACCEL = -3.5 + +MSG_ESP_19 = 0xB2 # RX from ABS, for wheel speeds +MSG_LH_EPS_03 = 0x9F # RX from EPS, for driver steering torque +MSG_ESP_05 = 0x106 # RX from ABS, for brake light state +MSG_TSK_06 = 0x120 # RX from ECU, for ACC status from drivetrain coordinator +MSG_MOTOR_20 = 0x121 # RX from ECU, for driver throttle input +MSG_ACC_06 = 0x122 # TX by OP, ACC control instructions to the drivetrain coordinator +MSG_HCA_01 = 0x126 # TX by OP, Heading Control Assist steering torque +MSG_GRA_ACC_01 = 0x12B # TX by OP, ACC control buttons for cancel/resume +MSG_ACC_07 = 0x12E # TX by OP, ACC control instructions to the drivetrain coordinator +MSG_ACC_02 = 0x30C # TX by OP, ACC HUD data to the instrument cluster +MSG_LDW_02 = 0x397 # TX by OP, Lane line recognition and text alerts + + +MSG_MQB_APD_1 = 0x6A0 + + +class TestVolkswagenMqbSafetyBase(common.CarSafetyTest): + RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01, MSG_LDW_02), 2: (MSG_LH_EPS_03,)} + + MAX_RATE_UP = 4 + MAX_RATE_DOWN = 10 + MAX_TORQUE_LOOKUP = [0], [300] + MAX_RT_DELTA = 75 + + DRIVER_TORQUE_ALLOWANCE = 80 + DRIVER_TORQUE_FACTOR = 3 + + # Wheel speeds _esp_19_msg + def _speed_msg(self, speed): + values = {"ESP_%s_Radgeschw_02" % s: speed for s in ["HL", "HR", "VL", "VR"]} + return self.packer.make_can_msg_safety("ESP_19", 0, values) + + # Driver brake pressure over threshold + def _esp_05_msg(self, brake): + values = {"ESP_Fahrer_bremst": brake} + return self.packer.make_can_msg_safety("ESP_05", 0, values) + + # Brake pedal switch + def _motor_14_msg(self, brake): + values = {"MO_Fahrer_bremst": brake} + return self.packer.make_can_msg_safety("Motor_14", 0, values) + + def _user_brake_msg(self, brake): + return self._motor_14_msg(brake) + + # Driver throttle input + def _user_gas_msg(self, gas): + values = {"MO_Fahrpedalrohwert_01": gas} + return self.packer.make_can_msg_safety("Motor_20", 0, values) + + # ACC engagement status + def _tsk_status_msg(self, enable, main_switch=True): + if main_switch: + tsk_status = 3 if enable else 2 + else: + tsk_status = 0 + values = {"TSK_Status": tsk_status} + return self.packer.make_can_msg_safety("TSK_06", 0, values) + + def _pcm_status_msg(self, enable): + return self._tsk_status_msg(enable) + + # Driver steering input torque + def _torque_driver_msg(self, torque): + values = {"EPS_Lenkmoment": abs(torque), "EPS_VZ_Lenkmoment": torque < 0} + return self.packer.make_can_msg_safety("LH_EPS_03", 0, values) + + # openpilot steering output torque + def _torque_cmd_msg(self, torque, steer_req=1): + values = {"HCA_01_LM_Offset": abs(torque), "HCA_01_LM_OffSign": torque < 0, "HCA_01_Sendestatus": steer_req} + return self.packer.make_can_msg_safety("HCA_01", 0, values) + + # Cruise control buttons + def _gra_acc_01_msg(self, cancel=0, resume=0, _set=0, bus=2): + values = {"GRA_Abbrechen": cancel, "GRA_Tip_Setzen": _set, "GRA_Tip_Wiederaufnahme": resume} + return self.packer.make_can_msg_safety("GRA_ACC_01", bus, values) + + # Acceleration request to drivetrain coordinator + def _acc_06_msg(self, accel): + values = {"ACC_Sollbeschleunigung_02": accel} + return self.packer.make_can_msg_safety("ACC_06", 0, values) + + # Acceleration request to drivetrain coordinator + def _acc_07_msg(self, accel, secondary_accel=3.02): + values = {"ACC_Sollbeschleunigung_02": accel, "ACC_Folgebeschl": secondary_accel} + return self.packer.make_can_msg_safety("ACC_07", 0, values) + + # Verify brake_pressed is true if either the switch or pressure threshold signals are true + def test_redundant_brake_signals(self): + test_combinations = [(True, True, True), (True, True, False), (True, False, True), (False, False, False)] + for brake_pressed, motor_14_signal, esp_05_signal in test_combinations: + self._rx(self._motor_14_msg(False)) + self._rx(self._esp_05_msg(False)) + self.assertFalse(self.safety.get_brake_pressed_prev()) + self._rx(self._motor_14_msg(motor_14_signal)) + self._rx(self._esp_05_msg(esp_05_signal)) + self.assertEqual(brake_pressed, self.safety.get_brake_pressed_prev(), + f"expected {brake_pressed=} with {motor_14_signal=} and {esp_05_signal=}") + + def test_torque_measurements(self): + # TODO: make this test work with all cars + self._rx(self._torque_driver_msg(50)) + self._rx(self._torque_driver_msg(-50)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + + self.assertEqual(-50, self.safety.get_torque_driver_min()) + self.assertEqual(50, self.safety.get_torque_driver_max()) + + self._rx(self._torque_driver_msg(0)) + self.assertEqual(0, self.safety.get_torque_driver_max()) + self.assertEqual(-50, self.safety.get_torque_driver_min()) + + self._rx(self._torque_driver_msg(0)) + self.assertEqual(0, self.safety.get_torque_driver_max()) + self.assertEqual(0, self.safety.get_torque_driver_min()) + + +class TestVolkswagenMqbStockSafety(TestVolkswagenMqbSafetyBase): + TX_MSGS = [[MSG_HCA_01, 0], [MSG_LDW_02, 0], [MSG_LH_EPS_03, 2], [MSG_GRA_ACC_01, 0], [MSG_GRA_ACC_01, 2], [MSG_MQB_APD_1, 1]] + FWD_BLACKLISTED_ADDRS = {0: [MSG_LH_EPS_03], 2: [MSG_HCA_01, MSG_LDW_02]} + + def setUp(self): + self.packer = CANPackerSafety("vw_mqb") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagen, 0) + self.safety.init_tests() + + def test_spam_cancel_safety_check(self): + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._gra_acc_01_msg(cancel=1))) + self.assertFalse(self._tx(self._gra_acc_01_msg(resume=1))) + self.assertFalse(self._tx(self._gra_acc_01_msg(_set=1))) + # do not block resume if we are engaged already + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._gra_acc_01_msg(resume=1))) + + +class TestVolkswagenMqbLongSafety(TestVolkswagenMqbSafetyBase): + TX_MSGS = [[MSG_HCA_01, 0], [MSG_LDW_02, 0], [MSG_LH_EPS_03, 2], [MSG_ACC_02, 0], [MSG_ACC_06, 0], [MSG_ACC_07, 0], [MSG_MQB_APD_1, 1]] + FWD_BLACKLISTED_ADDRS = {0: [MSG_LH_EPS_03], 2: [MSG_HCA_01, MSG_LDW_02, MSG_ACC_02, MSG_ACC_06, MSG_ACC_07]} + RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_01, MSG_LDW_02, MSG_ACC_02, MSG_ACC_06, MSG_ACC_07), 2: (MSG_LH_EPS_03,)} + INACTIVE_ACCEL = 3.01 + + def setUp(self): + self.packer = CANPackerSafety("vw_mqb") + self.safety = libsafety_py.libsafety + safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagen, safety_param) + self.safety.init_tests() + + # stock cruise controls are entirely bypassed under openpilot longitudinal control + def test_disable_control_allowed_from_cruise(self): + pass + + def test_enable_control_allowed_from_cruise(self): + pass + + def test_cruise_engaged_prev(self): + pass + + def test_set_and_resume_buttons(self): + for button in ["set", "resume"]: + # ACC main switch must be on, engage on falling edge + self.safety.set_controls_allowed(0) + self._rx(self._tsk_status_msg(False, main_switch=False)) + self._rx(self._gra_acc_01_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) + self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} with main switch off") + self._rx(self._tsk_status_msg(False, main_switch=True)) + self._rx(self._gra_acc_01_msg(_set=(button == "set"), resume=(button == "resume"), bus=0)) + self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} rising edge") + self._rx(self._gra_acc_01_msg(bus=0)) + self.assertTrue(self.safety.get_controls_allowed(), f"controls not allowed on {button} falling edge") + + def test_cancel_button(self): + # Disable on rising edge of cancel button + self._rx(self._tsk_status_msg(False, main_switch=True)) + self.safety.set_controls_allowed(1) + self._rx(self._gra_acc_01_msg(cancel=True, bus=0)) + self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after cancel") + + def test_main_switch(self): + # Disable as soon as main switch turns off + self._rx(self._tsk_status_msg(False, main_switch=True)) + self.safety.set_controls_allowed(1) + self._rx(self._tsk_status_msg(False, main_switch=False)) + self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after ACC main switch off") + + def test_accel_safety_check(self): + for controls_allowed in [True, False]: + for accel in np.concatenate((np.arange(MIN_ACCEL - 2, MAX_ACCEL + 2, 0.03), [0, self.INACTIVE_ACCEL])): + accel = round(accel, 2) + is_inactive_accel = accel == self.INACTIVE_ACCEL + send = (controls_allowed and MIN_ACCEL <= accel <= MAX_ACCEL) or is_inactive_accel + self.safety.set_controls_allowed(controls_allowed) + self.assertEqual(send, self._tx(self._acc_06_msg(accel)), (controls_allowed, accel)) + self.assertEqual(send, self._tx(self._acc_07_msg(accel)), (controls_allowed, accel)) + both_send = (controls_allowed and MIN_ACCEL <= accel <= MAX_ACCEL) or is_inactive_accel + self.assertEqual(both_send, self._tx(self._acc_07_msg(accel, secondary_accel=accel)), (controls_allowed, accel)) + + def test_accel_allowed_with_gas_pressed(self): + self._rx(self._user_gas_msg(1)) + self.safety.set_controls_allowed(True) + self.assertTrue(self._tx(self._acc_06_msg(0.5))) + self.assertTrue(self._tx(self._acc_07_msg(0.5))) + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_pq.py b/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_pq.py new file mode 100644 index 000000000..7c3975031 --- /dev/null +++ b/artifacts/package_runtime/iqdbc/safety/tests/test_volkswagen_pq.py @@ -0,0 +1,294 @@ +#!/usr/bin/env python3 +import unittest +import numpy as np + +from iqdbc.car.volkswagen.values import VolkswagenSafetyFlags +from iqdbc.car.structs import CarParams +from iqdbc.safety.tests.libsafety import libsafety_py +import iqdbc.safety.tests.common as common +from iqdbc.safety.tests.common import CANPackerSafety + +MSG_LENKHILFE_3 = 0x0D0 # RX from EPS, for steering angle and driver steering torque +MSG_HCA_1 = 0x0D2 # TX by OP, Heading Control Assist steering torque +MSG_BREMSE_1 = 0x1A0 # RX from ABS, for ego speed +MSG_MOTOR_2 = 0x288 # RX from ECU, for CC state and brake switch state +MSG_ACC_SYSTEM = 0x368 # TX by OP, longitudinal acceleration controls +MSG_MOTOR_3 = 0x380 # RX from ECU, for driver throttle input +MSG_GRA_NEU = 0x38A # TX by OP, ACC control buttons for cancel/resume +MSG_MOTOR_5 = 0x480 # RX from ECU, for ACC main switch state +MSG_ACC_GRA_ANZEIGE = 0x56A # TX by OP, ACC HUD +MSG_LDW_1 = 0x5BE # TX by OP, Lane line recognition and text alerts +MSG_BLINKMODI_02 = 0x0AA # TX by OP, turn signal control +MSG_APD_1 = 0x3D6 # TX by OP, CarParams +MSG_IQ = 0x6A1 # TX by OP + + +class TestVolkswagenPqSafetyBase(common.CarSafetyTest): + cruise_engaged = False + tsk_status = False + + RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_1, MSG_LDW_1)} + + MAX_RATE_UP = 6 + MAX_RATE_DOWN = 10 + MAX_TORQUE_LOOKUP = [0], [300] + MAX_RT_DELTA = 113 + + DRIVER_TORQUE_ALLOWANCE = 80 + DRIVER_TORQUE_FACTOR = 3 + + def _set_prev_torque(self, t): + self.safety.set_desired_torque_last(t) + self.safety.set_rt_torque_last(t) + + # Ego speed (Bremse_1) + def _speed_msg(self, speed): + values = {"BR1_Rad_kmh": speed} + return self.packer.make_can_msg_safety("Bremse_1", 1, values) + + # Brake light switch (shared message Motor_2) + def _user_brake_msg(self, brake): + # since this signal is used for engagement status, preserve current state + return self._motor_2_msg(brake_pressed=brake, cruise_engaged=self.safety.get_controls_allowed(), tsk_status=self.tsk_status) + + # ACC engaged status (shared message Motor_2) + def _pcm_status_msg(self, enable): + self.__class__.cruise_engaged = enable + return self._motor_2_msg(cruise_engaged=enable, tsk_status=self.tsk_status) + + # Acceleration request to drivetrain coordinator + def _accel_msg(self, accel): + values = {"ACS_Sollbeschl": accel} + return self.packer.make_can_msg_safety("ACC_System", 0, values) + + # Driver steering input torque + def _torque_driver_msg(self, torque): + values = {"LH3_LM": abs(torque), "LH3_LMSign": torque < 0} + return self.packer.make_can_msg_safety("Lenkhilfe_3", 1, values) + + # openpilot steering output torque + def _torque_cmd_msg(self, torque, steer_req=1, hca_status=7): + values = {"LM_Offset": abs(torque), "LM_OffSign": torque < 0, "HCA_Status": hca_status if steer_req else 3} + return self.packer.make_can_msg_safety("HCA_1", 0, values) + + # ACC engagement and brake light switch status + # Called indirectly for compatibility with common.py tests + def _motor_2_msg(self, brake_pressed=False, cruise_engaged=False, tsk_status=False): + values = {"MO2_BLS": brake_pressed, + "MO2_Sta_GRA": cruise_engaged, + "MO2_Status_TSK": tsk_status} + return self.packer.make_can_msg_safety("Motor_2", 1, values) + + # ACC main switch status + def _motor_5_msg(self, main_switch=False): + values = {"MO5_GRA_Hauptsch": main_switch} + return self.packer.make_can_msg_safety("Motor_5", 1, values) + + # Driver throttle input (Motor_3) + def _user_gas_msg(self, gas): + values = {"MO3_Pedalwert": gas} + return self.packer.make_can_msg_safety("Motor_3", 1, values) + + # Cruise control buttons (GRA_Neu) + def _button_msg(self, _set=False, resume=False, cancel=False, bus=2): + values = {"GRA_Neu_Setzen": _set, "GRA_Recall": resume, "GRA_Abbrechen": cancel} + return self.packer.make_can_msg_safety("GRA_Neu", bus, values) + + def test_torque_measurements(self): + # TODO: make this test work with all cars + self._rx(self._torque_driver_msg(50)) + self._rx(self._torque_driver_msg(-50)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + self._rx(self._torque_driver_msg(0)) + + self.assertEqual(-50, self.safety.get_torque_driver_min()) + self.assertEqual(50, self.safety.get_torque_driver_max()) + + self._rx(self._torque_driver_msg(0)) + self.assertEqual(0, self.safety.get_torque_driver_max()) + self.assertEqual(-50, self.safety.get_torque_driver_min()) + + self._rx(self._torque_driver_msg(0)) + self.assertEqual(0, self.safety.get_torque_driver_max()) + self.assertEqual(0, self.safety.get_torque_driver_min()) + + +class TestVolkswagenPqStockSafety(TestVolkswagenPqSafetyBase): + # Transmit of GRA_Neu is allowed on bus 0/1/2 to keep compatibility with gateway and camera integration + TX_MSGS = [[MSG_HCA_1, 0], [MSG_GRA_NEU, 0], [MSG_GRA_NEU, 1], [MSG_GRA_NEU, 2], [MSG_LDW_1, 0], [MSG_BLINKMODI_02, 0], [MSG_APD_1, 1], [MSG_IQ, 1]] + FWD_BLACKLISTED_ADDRS = {2: [MSG_HCA_1, MSG_LDW_1]} + + def setUp(self): + self.packer = CANPackerSafety("vw_pq") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, 0) + self.safety.init_tests() + + def test_spam_cancel_safety_check(self): + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._button_msg(cancel=True))) + self.assertFalse(self._tx(self._button_msg(resume=True))) + self.assertFalse(self._tx(self._button_msg(_set=True))) + # do not block resume if we are engaged already + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._button_msg(resume=True))) + + +class TestVolkswagenPqLongSafety(TestVolkswagenPqSafetyBase, common.LongitudinalAccelSafetyTest): + tsk_status = True + + TX_MSGS = [[MSG_HCA_1, 0], [MSG_LDW_1, 0], [MSG_ACC_SYSTEM, 0], [MSG_ACC_GRA_ANZEIGE, 0], + [MSG_GRA_NEU, 1], [MSG_GRA_NEU, 2], [MSG_BLINKMODI_02, 0], [MSG_MOTOR_2, 2], [MSG_MOTOR_5, 2], [MSG_APD_1, 1], [MSG_IQ, 1]] + FWD_BLACKLISTED_ADDRS = {0: [MSG_MOTOR_2, MSG_MOTOR_5, MSG_GRA_NEU], + 2: [MSG_HCA_1, MSG_LDW_1, MSG_ACC_SYSTEM, MSG_ACC_GRA_ANZEIGE]} + RELAY_MALFUNCTION_ADDRS = {0: (MSG_HCA_1, MSG_LDW_1, MSG_ACC_SYSTEM, MSG_ACC_GRA_ANZEIGE), + 2: (MSG_MOTOR_2, MSG_GRA_NEU, MSG_MOTOR_5)} + INACTIVE_ACCEL = 3.01 + + def setUp(self): + self.packer = CANPackerSafety("vw_pq") + self.safety = libsafety_py.libsafety + safety_param = VolkswagenSafetyFlags.LONG_CONTROL | VolkswagenSafetyFlags.ALLOW_LONG_ACCEL_WITH_GAS_PRESSED + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, safety_param) + self.safety.init_tests() + + # stock cruise controls are entirely bypassed under openpilot longitudinal control + def test_disable_control_allowed_from_cruise(self): + pass + + def test_enable_control_allowed_from_cruise(self): + pass + + def test_cruise_engaged_prev(self): + pass + + def test_set_and_resume_buttons(self): + for button in ["set", "resume"]: + # ACC main switch must be on, engage on falling edge + self.safety.set_controls_allowed(0) + self._rx(self._motor_5_msg(main_switch=False)) + self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=1)) + self._rx(self._button_msg(bus=1)) + self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} with main switch off") + self._rx(self._motor_5_msg(main_switch=True)) + self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=1)) + self.assertFalse(self.safety.get_controls_allowed(), f"controls allowed on {button} rising edge") + self._rx(self._button_msg(bus=1)) + self.assertTrue(self.safety.get_controls_allowed(), f"controls not allowed on {button} falling edge") + + def test_cancel_button(self): + # Disable on rising edge of cancel button + self._rx(self._motor_5_msg(main_switch=True)) + self.safety.set_controls_allowed(1) + self._rx(self._button_msg(cancel=True, bus=1)) + self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after cancel") + + def test_main_switch(self): + # Disable as soon as main switch turns off + self._rx(self._motor_5_msg(main_switch=True)) + self.safety.set_controls_allowed(1) + self._rx(self._motor_5_msg(main_switch=False)) + self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after ACC main switch off") + + def test_main_switch_tsk_or(self): + for main_switch, tsk_status, expected in ( + (False, False, False), + (True, False, True), + (False, True, True), + (True, True, True), + ): + self._rx(self._motor_5_msg(main_switch=True)) + self._rx(self._motor_2_msg(tsk_status=True)) + self.safety.set_controls_allowed(1) + self._rx(self._motor_5_msg(main_switch=main_switch)) + self._rx(self._motor_2_msg(tsk_status=tsk_status)) + self.assertEqual(expected, self.safety.get_controls_allowed(), + f"main_switch={main_switch} tsk_status={tsk_status} expected={expected}") + + def test_main_switch_flicker_tsk_holds(self): + self._rx(self._motor_5_msg(main_switch=True)) + self._rx(self._motor_2_msg(tsk_status=True)) + self.safety.set_controls_allowed(1) + self._rx(self._motor_5_msg(main_switch=False)) + self.assertTrue(self.safety.get_controls_allowed(), "controls dropped on MO5 flicker while TSK ready") + self._rx(self._motor_5_msg(main_switch=True)) + self.assertTrue(self.safety.get_controls_allowed()) + self._rx(self._motor_5_msg(main_switch=False)) + self._rx(self._motor_2_msg(tsk_status=False)) + self.assertFalse(self.safety.get_controls_allowed(), "controls allowed after both MO5 and TSK off") + + def test_set_and_resume_buttons_with_tsk_only(self): + for button in ("set", "resume"): + self.safety.set_controls_allowed(0) + self._rx(self._motor_5_msg(main_switch=False)) + self._rx(self._motor_2_msg(tsk_status=True)) + self._rx(self._button_msg(_set=(button == "set"), resume=(button == "resume"), bus=1)) + self._rx(self._button_msg(bus=1)) + self.assertTrue(self.safety.get_controls_allowed(), f"controls not allowed on {button} falling edge with TSK ready") + + def test_torque_cmd_enable_variants(self): + # The EPS rack accepts either 5 or 7 for an enabled status, with different low speed tuning behavior + self.safety.set_controls_allowed(1) + for enabled_status in (5, 7): + self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_RATE_UP, steer_req=1, hca_status=enabled_status)), + f"torque cmd rejected with {enabled_status=}") + + def test_accel_actuation_limits(self): + for accel in np.concatenate((np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.05), [0, self.INACTIVE_ACCEL])): + accel = round(accel, 2) + for controls_allowed in [True, False]: + for gas_pressed in [True, False]: + self.safety.set_controls_allowed(controls_allowed) + self.safety.set_gas_pressed_prev(gas_pressed) + is_inactive = accel == self.INACTIVE_ACCEL + should_tx = (controls_allowed and self.MIN_ACCEL <= accel <= self.MAX_ACCEL) or is_inactive + self.assertEqual(should_tx, self._tx(self._accel_msg(accel)), (controls_allowed, gas_pressed, accel)) + + def test_accel_allowed_with_gas_pressed(self): + self._rx(self._user_gas_msg(1)) + self.safety.set_controls_allowed(True) + self.assertTrue(self._tx(self._accel_msg(0.5))) + self.assertTrue(self._tx(self._accel_msg(0.0))) + self.assertTrue(self._tx(self._accel_msg(-0.5))) + + +class TestVolkswagenPqLowlineSafety(TestVolkswagenPqSafetyBase): + """Non-ECAN lateral-only PQ cars: bus 0 dead, TX on bus 1 (ptCAN) directly to EPS.""" + TX_MSGS = [[MSG_HCA_1, 1], [MSG_GRA_NEU, 1], [MSG_GRA_NEU, 2], [MSG_LDW_1, 1], [MSG_BLINKMODI_02, 1], [MSG_APD_1, 1], [MSG_IQ, 1]] + FWD_BUS_LOOKUP = {2: 0} + FWD_BLACKLISTED_ADDRS = {} + RELAY_MALFUNCTION_ADDRS = {1: (MSG_HCA_1, MSG_LDW_1)} + + def setUp(self): + self.packer = CANPackerSafety("vw_pq") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, VolkswagenSafetyFlags.PQ_LOWLINE | VolkswagenSafetyFlags.PQ_NO_CAM_BUS) + self.safety.init_tests() + + def _torque_cmd_msg(self, torque, steer_req=1, hca_status=7): + values = {"LM_Offset": abs(torque), "LM_OffSign": torque < 0, "HCA_Status": hca_status if steer_req else 3} + return self.packer.make_can_msg_safety("HCA_1", 1, values) + + def test_spam_cancel_safety_check(self): + self.safety.set_controls_allowed(0) + self.assertTrue(self._tx(self._button_msg(cancel=True))) + self.assertFalse(self._tx(self._button_msg(resume=True))) + self.assertFalse(self._tx(self._button_msg(_set=True))) + self.safety.set_controls_allowed(1) + self.assertTrue(self._tx(self._button_msg(resume=True))) + + +class TestVolkswagenPqNoCamSafety(TestVolkswagenPqStockSafety): + FWD_BUS_LOOKUP = {2: 0} + + def setUp(self): + self.packer = CANPackerSafety("vw_pq") + self.safety = libsafety_py.libsafety + self.safety.set_safety_hooks(CarParams.SafetyModel.volkswagenPq, VolkswagenSafetyFlags.PQ_NO_CAM_BUS) + self.safety.init_tests() + + +if __name__ == "__main__": + unittest.main() diff --git a/artifacts/package_runtime/libdatachannel/__init__.py b/artifacts/package_runtime/libdatachannel/__init__.py new file mode 100644 index 000000000..e6767e636 --- /dev/null +++ b/artifacts/package_runtime/libdatachannel/__init__.py @@ -0,0 +1,17 @@ +from .libdatachannel_ext import * # noqa: F401,F403 + +# Audio RTP Packetizers +# OpusRtpPacketizer と AACRtpPacketizer は同じ型 (AudioRtpPacketizer<48000>) +AACRtpPacketizer = OpusRtpPacketizer # noqa: F405 + +# PCMARtpPacketizer, PCMURtpPacketizer, G722RtpPacketizer は同じ型 (AudioRtpPacketizer<8000>) +PCMURtpPacketizer = PCMARtpPacketizer # noqa: F405 +G722RtpPacketizer = PCMARtpPacketizer # noqa: F405 + +# Audio RTP Depacketizers +# OpusRtpDepacketizer と AACRtpDepacketizer は同じ型 (AudioRtpDepacketizer<48000>) +AACRtpDepacketizer = OpusRtpDepacketizer # noqa: F405 + +# PCMARtpDepacketizer, PCMURtpDepacketizer, G722RtpDepacketizer は同じ型 (AudioRtpDepacketizer<8000>) +PCMURtpDepacketizer = PCMARtpDepacketizer # noqa: F405 +G722RtpDepacketizer = PCMARtpDepacketizer # noqa: F405 diff --git a/artifacts/package_runtime/libdatachannel/__init__.pyi b/artifacts/package_runtime/libdatachannel/__init__.pyi new file mode 100644 index 000000000..d7301cebd --- /dev/null +++ b/artifacts/package_runtime/libdatachannel/__init__.pyi @@ -0,0 +1,1962 @@ +from collections.abc import Callable, Sequence +import datetime +import enum +from typing import overload + + +class IceServer: + @overload + def __init__(self, arg: str, /) -> None: ... + + @overload + def __init__(self, arg0: str, arg1: int, /) -> None: ... + + @overload + def __init__(self, arg0: str, arg1: str, /) -> None: ... + + @overload + def __init__(self, hostname: str, port: int, username: str, password: str, relay_type: IceServer.RelayType = IceServer.RelayType.TurnUdp) -> None: ... + + @overload + def __init__(self, hostname: str, service: str, username: str, password: str, relay_type: IceServer.RelayType = IceServer.RelayType.TurnUdp) -> None: ... + + class Type(enum.Enum): + Stun = 0 + + Turn = 1 + + class RelayType(enum.Enum): + TurnUdp = 0 + + TurnTcp = 1 + + TurnTls = 2 + + @property + def hostname(self) -> str: ... + + @hostname.setter + def hostname(self, arg: str, /) -> None: ... + + @property + def port(self) -> int: ... + + @port.setter + def port(self, arg: int, /) -> None: ... + + @property + def type(self) -> IceServer.Type: ... + + @type.setter + def type(self, arg: IceServer.Type, /) -> None: ... + + @property + def username(self) -> str: ... + + @username.setter + def username(self, arg: str, /) -> None: ... + + @property + def password(self) -> str: ... + + @password.setter + def password(self, arg: str, /) -> None: ... + + @property + def relay_type(self) -> IceServer.RelayType: ... + + @relay_type.setter + def relay_type(self, arg: IceServer.RelayType, /) -> None: ... + +class ProxyServer: + @overload + def __init__(self, arg: str, /) -> None: ... + + @overload + def __init__(self, arg0: ProxyServer.Type, arg1: str, arg2: int, /) -> None: ... + + @overload + def __init__(self, arg0: ProxyServer.Type, arg1: str, arg2: int, arg3: str, arg4: str, /) -> None: ... + + class Type(enum.Enum): + Http = 0 + + Socks5 = 1 + + @property + def type(self) -> ProxyServer.Type: ... + + @type.setter + def type(self, arg: ProxyServer.Type, /) -> None: ... + + @property + def hostname(self) -> str: ... + + @hostname.setter + def hostname(self, arg: str, /) -> None: ... + + @property + def port(self) -> int: ... + + @port.setter + def port(self, arg: int, /) -> None: ... + + @property + def username(self) -> str | None: ... + + @username.setter + def username(self, arg: str | None) -> None: ... + + @property + def password(self) -> str | None: ... + + @password.setter + def password(self, arg: str | None) -> None: ... + +class CertificateType(enum.Enum): + Default = 0 + + Ecdsa = 1 + + Rsa = 2 + +class TransportPolicy(enum.Enum): + All = 0 + + Relay = 1 + +class Configuration: + def __init__(self) -> None: ... + + @property + def ice_servers(self) -> list[IceServer]: ... + + @ice_servers.setter + def ice_servers(self, arg: Sequence[IceServer], /) -> None: ... + + @property + def proxy_server(self) -> ProxyServer | None: ... + + @proxy_server.setter + def proxy_server(self, arg: ProxyServer | None) -> None: ... + + @property + def bind_address(self) -> str | None: ... + + @bind_address.setter + def bind_address(self, arg: str | None) -> None: ... + + @property + def certificate_type(self) -> CertificateType: ... + + @certificate_type.setter + def certificate_type(self, arg: CertificateType, /) -> None: ... + + @property + def ice_transport_policy(self) -> TransportPolicy: ... + + @ice_transport_policy.setter + def ice_transport_policy(self, arg: TransportPolicy, /) -> None: ... + + @property + def enable_ice_tcp(self) -> bool: ... + + @enable_ice_tcp.setter + def enable_ice_tcp(self, arg: bool, /) -> None: ... + + @property + def enable_ice_udp_mux(self) -> bool: ... + + @enable_ice_udp_mux.setter + def enable_ice_udp_mux(self, arg: bool, /) -> None: ... + + @property + def disable_auto_negotiation(self) -> bool: ... + + @disable_auto_negotiation.setter + def disable_auto_negotiation(self, arg: bool, /) -> None: ... + + @property + def disable_auto_gathering(self) -> bool: ... + + @disable_auto_gathering.setter + def disable_auto_gathering(self, arg: bool, /) -> None: ... + + @property + def force_media_transport(self) -> bool: ... + + @force_media_transport.setter + def force_media_transport(self, arg: bool, /) -> None: ... + + @property + def disable_fingerprint_verification(self) -> bool: ... + + @disable_fingerprint_verification.setter + def disable_fingerprint_verification(self, arg: bool, /) -> None: ... + + @property + def port_range_begin(self) -> int: ... + + @port_range_begin.setter + def port_range_begin(self, arg: int, /) -> None: ... + + @property + def port_range_end(self) -> int: ... + + @port_range_end.setter + def port_range_end(self, arg: int, /) -> None: ... + + @property + def mtu(self) -> int | None: ... + + @mtu.setter + def mtu(self, arg: int | None) -> None: ... + + @property + def max_message_size(self) -> int | None: ... + + @max_message_size.setter + def max_message_size(self, arg: int | None) -> None: ... + + @property + def certificate_pem_file(self) -> str | None: ... + + @certificate_pem_file.setter + def certificate_pem_file(self, arg: str | None) -> None: ... + + @property + def key_pem_file(self) -> str | None: ... + + @key_pem_file.setter + def key_pem_file(self, arg: str | None) -> None: ... + + @property + def key_pem_pass(self) -> str | None: ... + + @key_pem_pass.setter + def key_pem_pass(self, arg: str | None) -> None: ... + +class WebSocketConfiguration: + def __init__(self) -> None: ... + + @property + def disable_tls_verification(self) -> bool: ... + + @disable_tls_verification.setter + def disable_tls_verification(self, arg: bool, /) -> None: ... + + @property + def proxy_server(self) -> ProxyServer | None: ... + + @proxy_server.setter + def proxy_server(self, arg: ProxyServer | None) -> None: ... + + @property + def protocols(self) -> list[str]: ... + + @protocols.setter + def protocols(self, arg: Sequence[str], /) -> None: ... + + @property + def connection_timeout(self) -> datetime.timedelta | None: ... + + @connection_timeout.setter + def connection_timeout(self, arg: datetime.timedelta | float | None) -> None: ... + + @property + def ping_interval(self) -> datetime.timedelta | None: ... + + @ping_interval.setter + def ping_interval(self, arg: datetime.timedelta | float | None) -> None: ... + + @property + def max_outstanding_pings(self) -> int | None: ... + + @max_outstanding_pings.setter + def max_outstanding_pings(self, arg: int | None) -> None: ... + + @property + def ca_certificate_pem_file(self) -> str | None: ... + + @ca_certificate_pem_file.setter + def ca_certificate_pem_file(self, arg: str | None) -> None: ... + + @property + def certificate_pem_file(self) -> str | None: ... + + @certificate_pem_file.setter + def certificate_pem_file(self, arg: str | None) -> None: ... + + @property + def key_pem_file(self) -> str | None: ... + + @key_pem_file.setter + def key_pem_file(self, arg: str | None) -> None: ... + + @property + def key_pem_pass(self) -> str | None: ... + + @key_pem_pass.setter + def key_pem_pass(self, arg: str | None) -> None: ... + + @property + def max_message_size(self) -> int | None: ... + + @max_message_size.setter + def max_message_size(self, arg: int | None) -> None: ... + +class WebSocketServerConfiguration: + def __init__(self) -> None: ... + + @property + def port(self) -> int: ... + + @port.setter + def port(self, arg: int, /) -> None: ... + + @property + def enable_tls(self) -> bool: ... + + @enable_tls.setter + def enable_tls(self, arg: bool, /) -> None: ... + + @property + def certificate_pem_file(self) -> str | None: ... + + @certificate_pem_file.setter + def certificate_pem_file(self, arg: str | None) -> None: ... + + @property + def key_pem_file(self) -> str | None: ... + + @key_pem_file.setter + def key_pem_file(self, arg: str | None) -> None: ... + + @property + def key_pem_pass(self) -> str | None: ... + + @key_pem_pass.setter + def key_pem_pass(self, arg: str | None) -> None: ... + + @property + def bind_address(self) -> str | None: ... + + @bind_address.setter + def bind_address(self, arg: str | None) -> None: ... + + @property + def connection_timeout(self) -> datetime.timedelta | None: ... + + @connection_timeout.setter + def connection_timeout(self, arg: datetime.timedelta | float | None) -> None: ... + + @property + def max_message_size(self) -> int | None: ... + + @max_message_size.setter + def max_message_size(self, arg: int | None) -> None: ... + +class CertificateFingerprint: + def __init__(self) -> None: ... + + class Algorithm(enum.Enum): + Sha1 = 0 + + Sha224 = 1 + + Sha256 = 2 + + Sha384 = 3 + + Sha512 = 4 + + @property + def algorithm(self) -> CertificateFingerprint.Algorithm: ... + + @algorithm.setter + def algorithm(self, arg: CertificateFingerprint.Algorithm, /) -> None: ... + + @property + def value(self) -> str: ... + + @value.setter + def value(self, arg: str, /) -> None: ... + + def is_valid(self) -> bool: ... + + @staticmethod + def algorithm_identifier(arg: CertificateFingerprint.Algorithm, /) -> str: ... + + @staticmethod + def algorithm_size(arg: CertificateFingerprint.Algorithm, /) -> int: ... + +class Description: + @overload + def __init__(self, sdp: str, type: Description.Type = Description.Type.Unspec, role: Description.Role = Description.Role.ActPass) -> None: ... + + @overload + def __init__(self, sdp: str, type_string: str) -> None: ... + + class Type(enum.Enum): + Unspec = 0 + + Offer = 1 + + Answer = 2 + + Pranswer = 3 + + Rollback = 4 + + class Role(enum.Enum): + ActPass = 0 + + Passive = 1 + + Active = 2 + + class Direction(enum.Enum): + SendOnly = 1 + + RecvOnly = 2 + + SendRecv = 3 + + Inactive = 4 + + Unknown = 0 + + class Entry: + class ExtMap: + @overload + def __init__(self, id: int, uri: str, direction: Description.Direction = Description.Direction.Unknown) -> None: ... + + @overload + def __init__(self, description: str) -> None: ... + + def set_description(self, arg: str, /) -> None: ... + + @staticmethod + def parse_id(arg: str, /) -> int: ... + + @property + def id(self) -> int: ... + + @id.setter + def id(self, arg: int, /) -> None: ... + + @property + def uri(self) -> str: ... + + @uri.setter + def uri(self, arg: str, /) -> None: ... + + @property + def attributes(self) -> str: ... + + @attributes.setter + def attributes(self, arg: str, /) -> None: ... + + @property + def direction(self) -> Description.Direction: ... + + @direction.setter + def direction(self, arg: Description.Direction, /) -> None: ... + + def type(self) -> str: ... + + def protocol(self) -> str: ... + + def description(self) -> str: ... + + def mid(self) -> str: ... + + def direction(self) -> Description.Direction: ... + + def set_direction(self, arg: Description.Direction, /) -> None: ... + + def is_removed(self) -> bool: ... + + def mark_removed(self) -> None: ... + + def attributes(self) -> list[str]: ... + + def add_attribute(self, arg: str, /) -> None: ... + + def remove_attribute(self, arg: str, /) -> None: ... + + def add_rid(self, arg: str, /) -> None: ... + + def ext_ids(self) -> list[int]: ... + + def add_ext_map(self, arg: Description.Entry.ExtMap, /) -> None: ... + + def remove_ext_map(self, arg: int, /) -> None: ... + + def __str__(self) -> str: ... + + class Application(Description.Entry): + @overload + def __init__(self, mid: str = 'data') -> None: ... + + @overload + def __init__(self, mline: str, mid: str) -> None: ... + + def reciprocate(self) -> Description.Application: ... + + def set_sctp_port(self, arg: int, /) -> None: ... + + def hint_sctp_port(self, arg: int, /) -> None: ... + + def set_max_message_size(self, arg: int, /) -> None: ... + + def sctp_port(self) -> int | None: ... + + def max_message_size(self) -> int | None: ... + + def parse_sdp_line(self, arg: str, /) -> None: ... + + class Media(Description.Entry): + @overload + def __init__(self, mline: str, mid: str, direction: Description.Direction = Description.Direction.SendOnly) -> None: ... + + @overload + def __init__(self, sdp: str) -> None: ... + + def description(self) -> str: ... + + def reciprocate(self) -> Description.Media: ... + + def add_ssrc(self, ssrc: int, name: str | None, msid: str | None = None, track_id: str | None = None) -> None: ... + + def remove_ssrc(self, arg: int, /) -> None: ... + + def replace_ssrc(self, arg0: int, arg1: int, arg2: str | None, arg3: str | None, arg4: str | None) -> None: ... + + def has_ssrc(self, arg: int, /) -> bool: ... + + def clear_ssrcs(self) -> None: ... + + def get_ssrcs(self) -> list[int]: ... + + def get_cname_for_ssrc(self, arg: int, /) -> str | None: ... + + def bitrate(self) -> int: ... + + def set_bitrate(self, arg: int, /) -> None: ... + + def parse_sdp_line(self, arg: str, /) -> None: ... + + def has_payload_type(self, arg: int, /) -> bool: ... + + def payload_types(self) -> list[int]: ... + + def rtp_map(self, payload_type: int) -> Description.RtpMap: ... + + def add_rtp_map(self, map: Description.RtpMap) -> None: ... + + def remove_rtp_map(self, payload_type: int) -> None: ... + + def remove_format(self, format: str) -> None: ... + + def add_rtx_codec(self, payload_type: int, orig_payload_type: int, clock_rate: int) -> None: ... + + def as_audio(self) -> Description.Audio: ... + + def as_video(self) -> Description.Video: ... + + class RtpMap: + @overload + def __init__(self, payload_type: int) -> None: ... + + @overload + def __init__(self, description: str) -> None: ... + + def set_description(self, arg: str, /) -> None: ... + + @staticmethod + def parse_payload_type(arg: str, /) -> int: ... + + def add_feedback(self, arg: str, /) -> None: ... + + def remove_feedback(self, arg: str, /) -> None: ... + + def add_parameter(self, arg: str, /) -> None: ... + + def remove_parameter(self, arg: str, /) -> None: ... + + @property + def payload_type(self) -> int: ... + + @payload_type.setter + def payload_type(self, arg: int, /) -> None: ... + + @property + def format(self) -> str: ... + + @format.setter + def format(self, arg: str, /) -> None: ... + + @property + def clock_rate(self) -> int: ... + + @clock_rate.setter + def clock_rate(self, arg: int, /) -> None: ... + + @property + def enc_params(self) -> str: ... + + @enc_params.setter + def enc_params(self, arg: str, /) -> None: ... + + @property + def rtcp_fbs(self) -> list[str]: ... + + @rtcp_fbs.setter + def rtcp_fbs(self, arg: Sequence[str], /) -> None: ... + + @property + def fmtps(self) -> list[str]: ... + + @fmtps.setter + def fmtps(self, arg: Sequence[str], /) -> None: ... + + class Audio(Description.Media): + def __init__(self, mid: str = 'audio', direction: Description.Direction = Description.Direction.SendOnly) -> None: ... + + def add_audio_codec(self, payload_type: int, codec: str, profile: str | None = None) -> None: ... + + def add_opus_codec(self, payload_type: int, profile: str | None = ...) -> None: ... + + def add_pcmu_codec(self, payload_type: int, profile: str | None = None) -> None: ... + + def add_pcma_codec(self, payload_type: int, profile: str | None = None) -> None: ... + + def add_aac_codec(self, payload_type: int, profile: str | None = None) -> None: ... + + def add_g722_codec(self, payload_type: int, profile: str | None = None) -> None: ... + + class Video(Description.Media): + def __init__(self, mid: str = 'video', direction: Description.Direction = Description.Direction.SendOnly) -> None: ... + + def add_video_codec(self, payload_type: int, codec: str, profile: str | None = None) -> None: ... + + def add_h264_codec(self, payload_type: int, profile: str | None = ...) -> None: ... + + def add_h265_codec(self, payload_type: int, profile: str | None = None) -> None: ... + + def add_vp8_codec(self, payload_type: int, profile: str | None = None) -> None: ... + + def add_vp9_codec(self, payload_type: int, profile: str | None = None) -> None: ... + + def add_av1_codec(self, payload_type: int, profile: str | None = None) -> None: ... + + def type(self) -> Description.Type: ... + + def type_string(self) -> str: ... + + def role(self) -> Description.Role: ... + + def bundle_mid(self) -> str: ... + + def ice_options(self) -> list[str]: ... + + def ice_ufrag(self) -> str | None: ... + + def ice_pwd(self) -> str | None: ... + + def fingerprint(self) -> CertificateFingerprint | None: ... + + def hint_type(self, arg: Description.Type, /) -> None: ... + + def add_ice_option(self, arg: str, /) -> None: ... + + def remove_ice_option(self, arg: str, /) -> None: ... + + def set_ice_attribute(self, ufrag: str, pwd: str) -> None: ... + + def set_fingerprint(self, arg: CertificateFingerprint, /) -> None: ... + + def __str__(self) -> str: ... + + def has_application(self) -> bool: ... + + def has_audio_or_video(self) -> bool: ... + + def has_mid(self, mid: str) -> bool: ... + + @overload + def add_media(self, media: Description.Media) -> int: ... + + @overload + def add_media(self, application: Description.Application) -> int: ... + + def add_application(self, mid: str = 'data') -> int: ... + + def add_video(self, mid: str = 'video', dir: Description.Direction = Description.Direction.SendOnly) -> int: ... + + def add_audio(self, mid: str = 'audio', dir: Description.Direction = Description.Direction.SendOnly) -> int: ... + + def clear_media(self) -> None: ... + + def media(self, arg: int, /) -> object: ... + + def media_count(self) -> int: ... + + def application(self) -> Description.Application: ... + +class Candidate: + @overload + def __init__(self) -> None: ... + + @overload + def __init__(self, arg: str, /) -> None: ... + + @overload + def __init__(self, candidate: str, mid: str) -> None: ... + + class Family(enum.Enum): + Unresolved = 0 + + Ipv4 = 1 + + Ipv6 = 2 + + class Type(enum.Enum): + Unknown = 0 + + Host = 1 + + ServerReflexive = 2 + + PeerReflexive = 3 + + Relayed = 4 + + class TransportType(enum.Enum): + Unknown = 0 + + Udp = 1 + + TcpActive = 2 + + TcpPassive = 3 + + TcpSo = 4 + + TcpUnknown = 5 + + class ResolveMode(enum.Enum): + Simple = 0 + + Lookup = 1 + + def hint_mid(self, arg: str, /) -> None: ... + + @overload + def change_address(self, arg: str, /) -> None: ... + + @overload + def change_address(self, arg0: str, arg1: int, /) -> None: ... + + @overload + def change_address(self, arg0: str, arg1: str, /) -> None: ... + + def resolve(self, mode: Candidate.ResolveMode = Candidate.ResolveMode.Simple) -> bool: ... + + def type(self) -> Candidate.Type: ... + + def transport_type(self) -> Candidate.TransportType: ... + + def priority(self) -> int: ... + + def candidate(self) -> str: ... + + def mid(self) -> str: ... + + def is_resolved(self) -> bool: ... + + def family(self) -> Candidate.Family: ... + + def address(self) -> str | None: ... + + def port(self) -> int | None: ... + + def __eq__(self, arg: object, /) -> bool: ... + + def __ne__(self, arg: object, /) -> bool: ... + + def __str__(self) -> str: ... + +class Reliability: + def __init__(self) -> None: ... + + @property + def unordered(self) -> bool: ... + + @unordered.setter + def unordered(self, arg: bool, /) -> None: ... + + @property + def max_packet_lifetime(self) -> datetime.timedelta | None: ... + + @max_packet_lifetime.setter + def max_packet_lifetime(self, arg: datetime.timedelta | float | None) -> None: ... + + @property + def max_retransmits(self) -> int | None: ... + + @max_retransmits.setter + def max_retransmits(self, arg: int | None) -> None: ... + +class FrameInfo: + @overload + def __init__(self, timestamp: int) -> None: ... + + @overload + def __init__(self, timestamp_seconds: datetime.timedelta | float) -> None: ... + + @property + def timestamp(self) -> int: ... + + @timestamp.setter + def timestamp(self, arg: int, /) -> None: ... + + @property + def payload_type(self) -> int: ... + + @payload_type.setter + def payload_type(self, arg: int, /) -> None: ... + + @property + def timestamp_seconds(self) -> datetime.timedelta | None: ... + + @timestamp_seconds.setter + def timestamp_seconds(self, arg: datetime.timedelta | float | None) -> None: ... + +class Message: + def __init__(self, size: int, type: Message.Type = Message.Type.Binary) -> None: ... + + class Type(enum.Enum): + Binary = 0 + + String = 1 + + Control = 2 + + Reset = 3 + + @property + def type(self) -> Message.Type: ... + + @type.setter + def type(self, arg: Message.Type, /) -> None: ... + + @property + def stream(self) -> int: ... + + @stream.setter + def stream(self, arg: int, /) -> None: ... + + @property + def dscp(self) -> int: ... + + @dscp.setter + def dscp(self, arg: int, /) -> None: ... + + @property + def reliability(self) -> Reliability: ... + + @reliability.setter + def reliability(self, arg: Reliability, /) -> None: ... + + @property + def frame_info(self) -> FrameInfo: ... + + @frame_info.setter + def frame_info(self, arg: FrameInfo, /) -> None: ... + + def to_bytes(self) -> bytes: ... + + def to_str(self) -> str: ... + + def __len__(self) -> int: ... + + def __getitem__(self, arg: int, /) -> int: ... + + def __setitem__(self, arg0: int, arg1: int, /) -> None: ... + +def make_message(size: int, type: Message.Type = Message.Type.Binary, stream: int = 0, reliability: Reliability | None = None) -> Message: ... + +def make_message_from_data(data: bytes, type: Message.Type = Message.Type.Binary, stream: int = 0, reliability: Reliability | None = None) -> Message: ... + +def make_message_with_frame_info(data: bytes, frame_info: FrameInfo) -> Message: ... + +def make_message_from_variant(data: bytes | str) -> Message: ... + +def message_size(message: Message) -> int: ... + +def to_variant(message: Message) -> object: ... + +class NalUnitHeader: + def __init__(self) -> None: ... + + def forbidden_bit(self) -> bool: ... + + def nri(self) -> int: ... + + def idc(self) -> int: ... + + def unit_type(self) -> int: ... + + def set_forbidden_bit(self, arg: bool, /) -> None: ... + + def set_nri(self, arg: int, /) -> None: ... + + def set_unit_type(self, arg: int, /) -> None: ... + +class NalUnitFragmentHeader: + def __init__(self) -> None: ... + + def is_start(self) -> bool: ... + + def reserved_bit6(self) -> bool: ... + + def is_end(self) -> bool: ... + + def unit_type(self) -> int: ... + + def set_start(self, arg: bool, /) -> None: ... + + def set_end(self, arg: bool, /) -> None: ... + + def set_reserved_bit6(self, arg: bool, /) -> None: ... + + def set_unit_type(self, arg: int, /) -> None: ... + +class NalUnitStartSequenceMatch(enum.Enum): + NoMatch = 0 + + FirstZero = 1 + + SecondZero = 2 + + ThirdZero = 3 + + ShortMatch = 4 + + LongMatch = 5 + +class NalUnit: + @overload + def __init__(self) -> None: ... + + @overload + def __init__(self, size: int, including_header: bool = True, type: NalUnit.Type = NalUnit.Type.H264) -> None: ... + + @overload + def __init__(self, arg: bytes, /) -> None: ... + + class Type(enum.Enum): + H264 = 0 + + H265 = 1 + + class Separator(enum.Enum): + Length = 0 + + LongStartSequence = 1 + + ShortStartSequence = 2 + + StartSequence = 3 + + def forbidden_bit(self) -> bool: ... + + def nri(self) -> int: ... + + def unit_type(self) -> int: ... + + def payload(self) -> bytes: ... + + def set_forbidden_bit(self, arg: bool, /) -> None: ... + + def set_nri(self, arg: int, /) -> None: ... + + def set_unit_type(self, arg: int, /) -> None: ... + + def set_payload(self, arg: bytes, /) -> None: ... + + @staticmethod + def start_sequence_match_succ(match: NalUnitStartSequenceMatch, _byte: int, separator: NalUnit.Separator) -> NalUnitStartSequenceMatch: ... + +class NalUnitFragmentA(NalUnit): + def __init__(self, type: NalUnitFragmentA.FragmentType, forbidden_bit: bool, nri: int, unit_type: int, data: bytes) -> None: ... + + class FragmentType(enum.Enum): + Start = 0 + + Middle = 1 + + End = 2 + + def unit_type(self) -> int: ... + + def payload(self) -> bytes: ... + + def type(self) -> NalUnitFragmentA.FragmentType: ... + + def set_unit_type(self, arg: int, /) -> None: ... + + def set_payload(self, arg: bytes, /) -> None: ... + + def set_fragment_type(self, arg: NalUnitFragmentA.FragmentType, /) -> None: ... + +class H265NalUnitHeader: + def __init__(self) -> None: ... + + def forbidden_bit(self) -> bool: ... + + def unit_type(self) -> int: ... + + def nuh_layer_id(self) -> int: ... + + def nuh_temp_id_plus1(self) -> int: ... + + def set_forbidden_bit(self, arg: bool, /) -> None: ... + + def set_unit_type(self, arg: int, /) -> None: ... + + def set_nuh_layer_id(self, arg: int, /) -> None: ... + + def set_nuh_temp_id_plus1(self, arg: int, /) -> None: ... + +class H265NalUnitFragmentHeader: + def __init__(self) -> None: ... + + def is_start(self) -> bool: ... + + def is_end(self) -> bool: ... + + def unit_type(self) -> int: ... + + def set_start(self, arg: bool, /) -> None: ... + + def set_end(self, arg: bool, /) -> None: ... + + def set_unit_type(self, arg: int, /) -> None: ... + +class H265NalUnit(NalUnit): + @overload + def __init__(self) -> None: ... + + @overload + def __init__(self, size: int, including_header: bool = True) -> None: ... + + @overload + def __init__(self, data: bytes) -> None: ... + + def forbidden_bit(self) -> bool: ... + + def unit_type(self) -> int: ... + + def nuh_layer_id(self) -> int: ... + + def nuh_temp_id_plus1(self) -> int: ... + + def payload(self) -> bytes: ... + + def set_forbidden_bit(self, arg: bool, /) -> None: ... + + def set_unit_type(self, arg: int, /) -> None: ... + + def set_nuh_layer_id(self, arg: int, /) -> None: ... + + def set_nuh_temp_id_plus1(self, arg: int, /) -> None: ... + + def set_payload(self, arg: bytes, /) -> None: ... + +class H265NalUnitFragment(H265NalUnit): + def __init__(self, type: H265NalUnitFragment.FragmentType, forbidden_bit: bool, nuh_layer_id: int, nuh_temp_id_plus1: int, unit_type: int, data: bytes) -> None: ... + + class FragmentType(enum.Enum): + Start = 0 + + Middle = 1 + + End = 2 + + def unit_type(self) -> int: ... + + def payload(self) -> bytes: ... + + def type(self) -> H265NalUnitFragment.FragmentType: ... + + def set_unit_type(self, arg: int, /) -> None: ... + + def set_payload(self, arg: bytes, /) -> None: ... + + def set_fragment_type(self, arg: H265NalUnitFragment.FragmentType, /) -> None: ... + +class MediaHandler: + def __init__(self) -> None: ... + + def media(self, desc: Description.Media) -> None: ... + + def incoming(self, messages: Sequence[Message], send: Callable[[Message], None]) -> None: ... + + def outgoing(self, messages: Sequence[Message], send: Callable[[Message], None]) -> None: ... + + def request_keyframe(self, send: Callable[[Message], None]) -> bool: ... + + def request_bitrate(self, bitrate: int, send: Callable[[Message], None]) -> bool: ... + + def add_to_chain(self, handler: MediaHandler) -> None: ... + + def set_next(self, next: MediaHandler) -> None: ... + + def next(self) -> MediaHandler: ... + + def last(self) -> MediaHandler: ... + + def media_chain(self, desc: Description.Media) -> None: ... + + def incoming_chain(self, messages: Sequence[Message], send: Callable[[Message], None]) -> None: ... + + def outgoing_chain(self, messages: Sequence[Message], send: Callable[[Message], None]) -> None: ... + +class PyMediaHandler(MediaHandler): + def __init__(self) -> None: ... + +class DecodeTargetIndication(enum.Enum): + NotPresent = 0 + + Discardable = 1 + + Switch = 2 + + Required = 3 + +class RenderResolution: + def __init__(self) -> None: ... + + @property + def width(self) -> int: ... + + @width.setter + def width(self, arg: int, /) -> None: ... + + @property + def height(self) -> int: ... + + @height.setter + def height(self, arg: int, /) -> None: ... + +class FrameDependencyTemplate: + def __init__(self) -> None: ... + + @property + def spatial_id(self) -> int: ... + + @spatial_id.setter + def spatial_id(self, arg: int, /) -> None: ... + + @property + def temporal_id(self) -> int: ... + + @temporal_id.setter + def temporal_id(self, arg: int, /) -> None: ... + + @property + def decode_target_indications(self) -> list[DecodeTargetIndication]: ... + + @decode_target_indications.setter + def decode_target_indications(self, arg: Sequence[DecodeTargetIndication], /) -> None: ... + + @property + def frame_diffs(self) -> list[int]: ... + + @frame_diffs.setter + def frame_diffs(self, arg: Sequence[int], /) -> None: ... + + @property + def chain_diffs(self) -> list[int]: ... + + @chain_diffs.setter + def chain_diffs(self, arg: Sequence[int], /) -> None: ... + +class FrameDependencyStructure: + def __init__(self) -> None: ... + + @property + def template_id_offset(self) -> int: ... + + @template_id_offset.setter + def template_id_offset(self, arg: int, /) -> None: ... + + @property + def decode_target_count(self) -> int: ... + + @decode_target_count.setter + def decode_target_count(self, arg: int, /) -> None: ... + + @property + def chain_count(self) -> int: ... + + @chain_count.setter + def chain_count(self, arg: int, /) -> None: ... + + @property + def decode_target_protected_by(self) -> list[int]: ... + + @decode_target_protected_by.setter + def decode_target_protected_by(self, arg: Sequence[int], /) -> None: ... + + @property + def resolutions(self) -> list[RenderResolution]: ... + + @resolutions.setter + def resolutions(self, arg: Sequence[RenderResolution], /) -> None: ... + + @property + def templates(self) -> list[FrameDependencyTemplate]: ... + + @templates.setter + def templates(self, arg: Sequence[FrameDependencyTemplate], /) -> None: ... + +class DependencyDescriptor: + def __init__(self) -> None: ... + + @property + def start_of_frame(self) -> bool: ... + + @start_of_frame.setter + def start_of_frame(self, arg: bool, /) -> None: ... + + @property + def end_of_frame(self) -> bool: ... + + @end_of_frame.setter + def end_of_frame(self, arg: bool, /) -> None: ... + + @property + def frame_number(self) -> int: ... + + @frame_number.setter + def frame_number(self, arg: int, /) -> None: ... + + @property + def dependency_template(self) -> FrameDependencyTemplate: ... + + @dependency_template.setter + def dependency_template(self, arg: FrameDependencyTemplate, /) -> None: ... + + @property + def resolution(self) -> RenderResolution | None: ... + + @resolution.setter + def resolution(self, arg: RenderResolution | None) -> None: ... + + @property + def active_decode_targets_bitmask(self) -> int | None: ... + + @active_decode_targets_bitmask.setter + def active_decode_targets_bitmask(self, arg: int | None) -> None: ... + + @property + def structure_attached(self) -> bool: ... + + @structure_attached.setter + def structure_attached(self, arg: bool, /) -> None: ... + +class DependencyDescriptorContext: + def __init__(self) -> None: ... + + @property + def descriptor(self) -> DependencyDescriptor: ... + + @descriptor.setter + def descriptor(self, arg: DependencyDescriptor, /) -> None: ... + + @property + def structure(self) -> FrameDependencyStructure: ... + + @structure.setter + def structure(self, arg: FrameDependencyStructure, /) -> None: ... + +class DependencyDescriptorWriter: + def __init__(self, context: DependencyDescriptorContext) -> None: ... + + def get_size_bits(self) -> int: ... + + def get_size(self) -> int: ... + + def write_to(self) -> bytes: ... + +class RtpPacketizationConfig: + def __init__(self, ssrc: int, cname: str, payload_type: int, clock_rate: int, video_orientation_id: int = 0) -> None: ... + + @property + def ssrc(self) -> int: ... + + @ssrc.setter + def ssrc(self, arg: int, /) -> None: ... + + @property + def cname(self) -> str: ... + + @cname.setter + def cname(self, arg: str, /) -> None: ... + + @property + def payload_type(self) -> int: ... + + @payload_type.setter + def payload_type(self, arg: int, /) -> None: ... + + @property + def clock_rate(self) -> int: ... + + @clock_rate.setter + def clock_rate(self, arg: int, /) -> None: ... + + @property + def video_orientation_id(self) -> int: ... + + @video_orientation_id.setter + def video_orientation_id(self, arg: int, /) -> None: ... + + @property + def sequence_number(self) -> int: ... + + @sequence_number.setter + def sequence_number(self, arg: int, /) -> None: ... + + @property + def timestamp(self) -> int: ... + + @timestamp.setter + def timestamp(self, arg: int, /) -> None: ... + + @property + def start_timestamp(self) -> int: ... + + @start_timestamp.setter + def start_timestamp(self, arg: int, /) -> None: ... + + @property + def video_orientation(self) -> int: ... + + @video_orientation.setter + def video_orientation(self, arg: int, /) -> None: ... + + @property + def mid_id(self) -> int: ... + + @mid_id.setter + def mid_id(self, arg: int, /) -> None: ... + + @property + def mid(self) -> str | None: ... + + @mid.setter + def mid(self, arg: str | None) -> None: ... + + @property + def rid_id(self) -> int: ... + + @rid_id.setter + def rid_id(self, arg: int, /) -> None: ... + + @property + def rid(self) -> str | None: ... + + @rid.setter + def rid(self, arg: str | None) -> None: ... + + @property + def dependency_descriptor_id(self) -> int: ... + + @dependency_descriptor_id.setter + def dependency_descriptor_id(self, arg: int, /) -> None: ... + + @property + def dependency_descriptor_context(self) -> DependencyDescriptorContext | None: ... + + @dependency_descriptor_context.setter + def dependency_descriptor_context(self, arg: DependencyDescriptorContext | None) -> None: ... + + @property + def playout_delay_id(self) -> int: ... + + @playout_delay_id.setter + def playout_delay_id(self, arg: int, /) -> None: ... + + @property + def playout_delay_min(self) -> int: ... + + @playout_delay_min.setter + def playout_delay_min(self, arg: int, /) -> None: ... + + @property + def playout_delay_max(self) -> int: ... + + @playout_delay_max.setter + def playout_delay_max(self, arg: int, /) -> None: ... + + @property + def color_space_id(self) -> int: ... + + @color_space_id.setter + def color_space_id(self, arg: int, /) -> None: ... + + @property + def color_chroma_siting_horz(self) -> int: ... + + @color_chroma_siting_horz.setter + def color_chroma_siting_horz(self, arg: int, /) -> None: ... + + @property + def color_chroma_siting_vert(self) -> int: ... + + @color_chroma_siting_vert.setter + def color_chroma_siting_vert(self, arg: int, /) -> None: ... + + @property + def color_range(self) -> int: ... + + @color_range.setter + def color_range(self, arg: int, /) -> None: ... + + @property + def color_primaries(self) -> int: ... + + @color_primaries.setter + def color_primaries(self, arg: int, /) -> None: ... + + @property + def color_transfer(self) -> int: ... + + @color_transfer.setter + def color_transfer(self, arg: int, /) -> None: ... + + @property + def color_matrix(self) -> int: ... + + @color_matrix.setter + def color_matrix(self, arg: int, /) -> None: ... + + @staticmethod + def get_seconds_from_timestamp(timestamp: int, clock_rate: int) -> float: ... + + def timestamp_to_seconds(self, timestamp: int) -> float: ... + + @staticmethod + def get_timestamp_from_seconds(seconds: float, clock_rate: int) -> int: ... + + def seconds_to_timestamp(self, seconds: float) -> int: ... + +class RtpPacketizer(MediaHandler): + def __init__(self, rtp_config: RtpPacketizationConfig) -> None: ... + + def media(self, arg: Description.Media, /) -> None: ... + + def outgoing(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + + @property + def rtp_config(self) -> RtpPacketizationConfig: ... + + DEFAULT_MAX_FRAGMENT_SIZE: int = ... + """(arg: object, /) -> int""" + + VIDEO_CLOCK_RATE: int = ... + """(arg: object, /) -> int""" + +class OpusRtpPacketizer(RtpPacketizer): + def __init__(self, rtp_config: RtpPacketizationConfig) -> None: ... + + DEFAULT_CLOCK_RATE: int = ... + """(arg: object, /) -> int""" + +class PCMARtpPacketizer(RtpPacketizer): + def __init__(self, rtp_config: RtpPacketizationConfig) -> None: ... + + DEFAULT_CLOCK_RATE: int = ... + """(arg: object, /) -> int""" + +class AV1RtpPacketizer(RtpPacketizer): + def __init__(self, packetization: AV1RtpPacketizer.Packetization, rtp_config: RtpPacketizationConfig, max_fragment_size: int = 1220) -> None: ... + + class Packetization(enum.Enum): + Obu = 0 + + TemporalUnit = 1 + + def outgoing(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + + CLOCK_RATE: int = ... + """(arg: object, /) -> int""" + + DEFAULT_MAX_FRAGMENT_SIZE: int = ... + """(arg: object, /) -> int""" + +class H264RtpPacketizer(RtpPacketizer): + def __init__(self, separator: NalUnit.Separator, rtp_config: RtpPacketizationConfig, max_fragment_size: int = 1220) -> None: ... + + def outgoing(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + + CLOCK_RATE: int = ... + """(arg: object, /) -> int""" + + DEFAULT_MAX_FRAGMENT_SIZE: int = ... + """(arg: object, /) -> int""" + +class H265RtpPacketizer(RtpPacketizer): + def __init__(self, separator: NalUnit.Separator, rtp_config: RtpPacketizationConfig, max_fragment_size: int = 1220) -> None: ... + + def outgoing(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + + CLOCK_RATE: int = ... + """(arg: object, /) -> int""" + + DEFAULT_MAX_FRAGMENT_SIZE: int = ... + """(arg: object, /) -> int""" + +class RtpDepacketizer(MediaHandler): + @overload + def __init__(self) -> None: ... + + @overload + def __init__(self, clock_rate: int) -> None: ... + + def incoming(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + +class OpusRtpDepacketizer(RtpDepacketizer): + def __init__(self, clock_rate: int = 48000) -> None: ... + + DEFAULT_CLOCK_RATE: int = ... + """(arg: object, /) -> int""" + +class PCMARtpDepacketizer(RtpDepacketizer): + def __init__(self, clock_rate: int = 8000) -> None: ... + + DEFAULT_CLOCK_RATE: int = ... + """(arg: object, /) -> int""" + +class H264RtpDepacketizer(RtpDepacketizer): + def __init__(self, separator: NalUnit.Separator = NalUnit.Separator.StartSequence) -> None: ... + +class H265RtpDepacketizer(RtpDepacketizer): + def __init__(self, separator: NalUnit.Separator = NalUnit.Separator.StartSequence) -> None: ... + +class PacingHandler(MediaHandler): + def __init__(self, bits_per_second: float, send_interval: datetime.timedelta | float) -> None: ... + + def outgoing(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + +class RembHandler(MediaHandler): + def __init__(self, on_remb: Callable[[int], None]) -> None: ... + + def incoming(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + +class PliHandler(MediaHandler): + def __init__(self, on_pli: Callable[[], None]) -> None: ... + + def incoming(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + +class RtcpNackResponder(MediaHandler): + def __init__(self, max_size: int = 512) -> None: ... + + DEFAULT_MAX_SIZE: int = ... + """(arg: object, /) -> int""" + + def incoming(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + + def outgoing(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + +class SyncTimestamps: + @property + def rtp_timestamp(self) -> int: ... + + @property + def ntp_timestamp(self) -> int: ... + +class RtcpReceivingSession(MediaHandler): + def __init__(self) -> None: ... + + def incoming(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + + def request_keyframe(self, arg: Callable[[Message], None], /) -> bool: ... + + def request_bitrate(self, arg0: int, arg1: Callable[[Message], None], /) -> bool: ... + + def get_sync_timestamps(self) -> SyncTimestamps: ... + +class RtcpSrReporter(MediaHandler): + def __init__(self, rtp_config: RtpPacketizationConfig) -> None: ... + + def last_reported_timestamp(self) -> int: ... + + def outgoing(self, arg0: Sequence[Message], arg1: Callable[[Message], None], /) -> None: ... + + @property + def rtp_config(self) -> RtpPacketizationConfig: ... + +class Channel: + def close(self) -> None: ... + + @overload + def send(self, data: bytes | str) -> bool: ... + + @overload + def send(self, data: bytes, size: int) -> bool: ... + + def is_open(self) -> bool: ... + + def is_closed(self) -> bool: ... + + def max_message_size(self) -> int: ... + + def buffered_amount(self) -> int: ... + + def on_open(self, arg: Callable[[], None], /) -> None: ... + + def on_closed(self, arg: Callable[[], None], /) -> None: ... + + def on_error(self, arg: Callable[[str], None], /) -> None: ... + + @overload + def on_message(self, arg: Callable[[bytes | str], None], /) -> None: ... + + @overload + def on_message(self, binary_callback: Callable[[bytes], None], string_callback: Callable[[str], None]) -> None: ... + + def on_buffered_amount_low(self, arg: Callable[[], None], /) -> None: ... + + def set_buffered_amount_low_threshold(self, arg: int, /) -> None: ... + + def reset_callbacks(self) -> None: ... + + def receive(self) -> bytes | str | None: ... + + def peek(self) -> bytes | str | None: ... + + def available_amount(self) -> int: ... + + def on_available(self, arg: Callable[[], None], /) -> None: ... + +class DataChannel(Channel): + def is_open(self) -> bool: ... + + def is_closed(self) -> bool: ... + + def max_message_size(self) -> int: ... + + def close(self) -> None: ... + + @overload + def send(self, data: bytes | str) -> bool: ... + + @overload + def send(self, data: bytes, size: int) -> bool: ... + + def stream(self) -> int | None: ... + + def id(self) -> int | None: ... + + def label(self) -> str: ... + + def protocol(self) -> str: ... + + def reliability(self) -> Reliability: ... + +class Track(Channel): + def is_open(self) -> bool: ... + + def is_closed(self) -> bool: ... + + def max_message_size(self) -> int: ... + + def close(self) -> None: ... + + @overload + def send(self, data: bytes | str) -> bool: ... + + @overload + def send(self, data: bytes, size: int) -> bool: ... + + @overload + def send_frame(self, data: bytes, info: FrameInfo) -> None: ... + + @overload + def send_frame(self, data: bytes, size: int, info: FrameInfo) -> None: ... + + def mid(self) -> str: ... + + def direction(self) -> Description.Direction: ... + + def description(self) -> Description.Media: ... + + def set_description(self, description: Description.Media) -> None: ... + + def on_frame(self, callback: Callable[[bytes, FrameInfo], None]) -> None: ... + + def request_keyframe(self) -> bool: ... + + def request_bitrate(self, bitrate: int) -> bool: ... + + def set_media_handler(self, handler: MediaHandler | None) -> None: ... + + def chain_media_handler(self, handler: MediaHandler) -> None: ... + + def get_media_handler(self) -> MediaHandler: ... + +class DataChannelInit: + def __init__(self) -> None: ... + + @property + def reliability(self) -> Reliability: ... + + @reliability.setter + def reliability(self, arg: Reliability, /) -> None: ... + + @property + def negotiated(self) -> bool: ... + + @negotiated.setter + def negotiated(self, arg: bool, /) -> None: ... + + @property + def id(self) -> int | None: ... + + @id.setter + def id(self, arg: int | None) -> None: ... + + @property + def protocol(self) -> str: ... + + @protocol.setter + def protocol(self, arg: str, /) -> None: ... + +class LocalDescriptionInit: + def __init__(self) -> None: ... + + @property + def ice_ufrag(self) -> str | None: ... + + @ice_ufrag.setter + def ice_ufrag(self, arg: str | None) -> None: ... + + @property + def ice_pwd(self) -> str | None: ... + + @ice_pwd.setter + def ice_pwd(self, arg: str | None) -> None: ... + +class PeerConnection: + @overload + def __init__(self) -> None: ... + + @overload + def __init__(self, config: Configuration) -> None: ... + + class State(enum.Enum): + New = 0 + + Connecting = 1 + + Connected = 2 + + Disconnected = 3 + + Failed = 4 + + Closed = 5 + + class IceState(enum.Enum): + New = 0 + + Checking = 1 + + Connected = 2 + + Completed = 3 + + Failed = 4 + + Disconnected = 5 + + Closed = 6 + + class GatheringState(enum.Enum): + New = 0 + + InProgress = 1 + + Complete = 2 + + class SignalingState(enum.Enum): + Stable = 0 + + HaveLocalOffer = 1 + + HaveRemoteOffer = 2 + + HaveLocalPranswer = 3 + + HaveRemotePranswer = 4 + + def close(self) -> None: ... + + def __del__(self) -> None: ... + + def config(self) -> Configuration: ... + + def state(self) -> PeerConnection.State: ... + + def ice_state(self) -> PeerConnection.IceState: ... + + def gathering_state(self) -> PeerConnection.GatheringState: ... + + def signaling_state(self) -> PeerConnection.SignalingState: ... + + def negotiation_needed(self) -> bool: ... + + def has_media(self) -> bool: ... + + def local_description(self) -> Description | None: ... + + def remote_description(self) -> Description | None: ... + + def remote_max_message_size(self) -> int: ... + + def local_address(self) -> str | None: ... + + def remote_address(self) -> str | None: ... + + def max_data_channel_id(self) -> int: ... + + def get_selected_candidate_pair(self, arg0: Candidate, arg1: Candidate, /) -> bool: ... + + def set_local_description(self, type: Description.Type = Description.Type.Unspec, init: LocalDescriptionInit | None = None) -> None: ... + + def set_remote_description(self, arg: Description, /) -> None: ... + + def add_remote_candidate(self, arg: Candidate, /) -> None: ... + + def gather_local_candidates(self, additional_ice_servers: Sequence[IceServer] = []) -> None: ... + + def create_offer(self) -> Description: ... + + def create_answer(self) -> Description: ... + + def set_media_handler(self, handler: MediaHandler | None) -> None: ... + + def get_media_handler(self) -> MediaHandler: ... + + def create_data_channel(self, label: str, init: DataChannelInit | None = None) -> DataChannel: ... + + def on_data_channel(self, arg: Callable[[DataChannel], None], /) -> None: ... + + def add_track(self, arg: Description.Media, /) -> Track: ... + + def on_track(self, arg: Callable[[Track], None], /) -> None: ... + + def on_local_description(self, arg: Callable[[Description], None], /) -> None: ... + + def on_local_candidate(self, arg: Callable[[Candidate], None], /) -> None: ... + + def on_state_change(self, arg: Callable[[PeerConnection.State], None], /) -> None: ... + + def on_ice_state_change(self, arg: Callable[[PeerConnection.IceState], None], /) -> None: ... + + def on_gathering_state_change(self, arg: Callable[[PeerConnection.GatheringState], None], /) -> None: ... + + def on_signaling_state_change(self, arg: Callable[[PeerConnection.SignalingState], None], /) -> None: ... + + def reset_callbacks(self) -> None: ... + + def remote_fingerprint(self) -> CertificateFingerprint: ... + + def clear_stats(self) -> None: ... + + def bytes_sent(self) -> int: ... + + def bytes_received(self) -> int: ... + + def rtt(self) -> datetime.timedelta | None: ... + +class WebSocket(Channel): + @overload + def __init__(self) -> None: ... + + @overload + def __init__(self, config: WebSocketConfiguration) -> None: ... + + class State(enum.Enum): + Connecting = 0 + + Open = 1 + + Closing = 2 + + Closed = 3 + + def is_open(self) -> bool: ... + + def is_closed(self) -> bool: ... + + def max_message_size(self) -> int: ... + + def close(self) -> None: ... + + @overload + def send(self, data: bytes | str) -> bool: ... + + @overload + def send(self, data: bytes, size: int) -> bool: ... + + def ready_state(self) -> WebSocket.State: ... + + def open(self, url: str) -> None: ... + + def force_close(self) -> None: ... + + def remote_address(self) -> str | None: ... + + def path(self) -> str | None: ... + +class IceUdpMuxRequest: + @property + def local_ufrag(self) -> str: ... + + @property + def remote_ufrag(self) -> str: ... + + @property + def remote_address(self) -> str: ... + + @property + def remote_port(self) -> int: ... + +class IceUdpMuxListener: + def __init__(self, port: int, bind_address: str | None = None) -> None: ... + + def stop(self) -> None: ... + + def port(self) -> int: ... + + def on_unhandled_stun_request(self, callback: Callable[[IceUdpMuxRequest], None]) -> None: ... + +class WebSocketServer: + @overload + def __init__(self) -> None: ... + + @overload + def __init__(self, config: WebSocketServerConfiguration) -> None: ... + + def stop(self) -> None: ... + + def port(self) -> int: ... + + def on_client(self, callback: Callable[[WebSocket], None]) -> None: ... diff --git a/artifacts/package_runtime/libdatachannel/libdatachannel_ext.cpython-312-aarch64-linux-gnu.so b/artifacts/package_runtime/libdatachannel/libdatachannel_ext.cpython-312-aarch64-linux-gnu.so new file mode 100644 index 000000000..2e82f1303 Binary files /dev/null and b/artifacts/package_runtime/libdatachannel/libdatachannel_ext.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/package_runtime/libdatachannel/py.typed b/artifacts/package_runtime/libdatachannel/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/msgq/.gitignore b/artifacts/package_runtime/msgq/.gitignore new file mode 100644 index 000000000..6bd751773 --- /dev/null +++ b/artifacts/package_runtime/msgq/.gitignore @@ -0,0 +1 @@ +ipc_pyx.cpp diff --git a/artifacts/package_runtime/msgq/__init__.py b/artifacts/package_runtime/msgq/__init__.py new file mode 100644 index 000000000..bafc6d5cf --- /dev/null +++ b/artifacts/package_runtime/msgq/__init__.py @@ -0,0 +1,69 @@ +import os + +INCLUDE_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +LIB_PATH = os.path.join(os.path.dirname(__file__), "libmsgq.a") +VISIONIPC_LIB_PATH = os.path.join(os.path.dirname(__file__), "visionipc", "libvisionipc.a") +PYTHON_LIB_PATH = os.path.join(os.path.dirname(__file__), "ipc_pyx.so") + +from msgq.ipc_pyx import Context, Poller, SubSocket, PubSocket, SocketEventHandle, toggle_fake_events, \ + set_fake_prefix, get_fake_prefix, delete_fake_prefix, wait_for_one_event, \ + context_is_zmq +from msgq.ipc_pyx import MultiplePublishersError, IpcError + +from typing import Optional, List, Union + +assert MultiplePublishersError +assert IpcError +assert toggle_fake_events +assert set_fake_prefix +assert get_fake_prefix +assert delete_fake_prefix +assert wait_for_one_event +assert context_is_zmq + +NO_TRAVERSAL_LIMIT = 2**64-1 + +context = Context() + + +def fake_event_handle(endpoint: str, identifier: Optional[Union[str, bytes]] = None, override: bool = True, enable: bool = False) -> SocketEventHandle: + ident = identifier if identifier is not None else get_fake_prefix() + handle = SocketEventHandle(endpoint, ident, override) + if override: + handle.enabled = enable + + return handle + +def pub_sock(endpoint: str, segment_size: int = 0) -> PubSocket: + sock = PubSocket() + sock.connect(context, endpoint, segment_size) + return sock + + +def sub_sock(endpoint: str, poller: Optional[Poller] = None, addr: str = "127.0.0.1", + conflate: bool = False, timeout: Optional[int] = None, segment_size: int = 0) -> SubSocket: + sock = SubSocket() + sock.connect(context, endpoint, addr.encode('utf8'), conflate, segment_size) + + if timeout is not None: + sock.setTimeout(timeout) + + if poller is not None: + poller.registerSocket(sock) + return sock + +def drain_sock_raw(sock: SubSocket, wait_for_one: bool = False) -> List[bytes]: + """Receive all message currently available on the queue""" + ret: List[bytes] = [] + while 1: + if wait_for_one and len(ret) == 0: + dat = sock.receive() + else: + dat = sock.receive(non_blocking=True) + + if dat is None: + break + + ret.append(dat) + + return ret diff --git a/artifacts/package_runtime/msgq/conftest.py b/artifacts/package_runtime/msgq/conftest.py new file mode 100644 index 000000000..bfd77925c --- /dev/null +++ b/artifacts/package_runtime/msgq/conftest.py @@ -0,0 +1,14 @@ +import os +import pytest +import msgq + +@pytest.fixture(params=[False, True], ids=["msgq", "zmq"], autouse=True) +def zmq_mode(request): + if request.param: + os.environ["ZMQ"] = "1" + else: + os.environ.pop("ZMQ", None) + msgq.context = msgq.Context() + assert msgq.context_is_zmq() == request.param + yield request.param + os.environ.pop("ZMQ", None) diff --git a/artifacts/package_runtime/msgq/ipc_pyx.so b/artifacts/package_runtime/msgq/ipc_pyx.so new file mode 100755 index 000000000..6bd65d39c Binary files /dev/null and b/artifacts/package_runtime/msgq/ipc_pyx.so differ diff --git a/artifacts/package_runtime/msgq/tests/__init__.py b/artifacts/package_runtime/msgq/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/msgq/tests/test_fake.py b/artifacts/package_runtime/msgq/tests/test_fake.py new file mode 100644 index 000000000..aaf60968c --- /dev/null +++ b/artifacts/package_runtime/msgq/tests/test_fake.py @@ -0,0 +1,193 @@ +import pytest +import os +import multiprocessing +import platform +import msgq +from parameterized import parameterized_class +from typing import Optional + +WAIT_TIMEOUT = 5 + + +@pytest.mark.skipif(condition=platform.system() == "Darwin", reason="Events not supported on macOS") +class TestEvents: + + def test_mutation(self): + handle = msgq.fake_event_handle("carState") + event = handle.recv_called_event + + assert not event.peek() + event.set() + assert event.peek() + event.clear() + assert not event.peek() + + del event + + def test_wait(self): + handle = msgq.fake_event_handle("carState") + event = handle.recv_called_event + + event.set() + try: + event.wait(WAIT_TIMEOUT) + assert event.peek() + except RuntimeError: + pytest.fail("event.wait() timed out") + + def test_wait_multiprocess(self): + handle = msgq.fake_event_handle("carState") + event = handle.recv_called_event + + def set_event_run(): + event.set() + + try: + p = multiprocessing.Process(target=set_event_run) + p.start() + event.wait(WAIT_TIMEOUT) + assert event.peek() + except RuntimeError: + pytest.fail("event.wait() timed out") + + p.kill() + + def test_wait_zero_timeout(self): + handle = msgq.fake_event_handle("carState") + event = handle.recv_called_event + + try: + event.wait(0) + pytest.fail("event.wait() did not time out") + except RuntimeError: + assert not event.peek() + + +@pytest.mark.skipif(condition=platform.system() == "Darwin", reason="FakeSockets not supported on macOS") +@parameterized_class([{"prefix": None}, {"prefix": "test"}]) +class TestFakeSockets: + prefix: Optional[str] = None + + @pytest.fixture(autouse=True) + def zmq_mode(self): + os.environ.pop("ZMQ", None) + msgq.context = msgq.Context() + yield + + def setup_method(self): + msgq.toggle_fake_events(True) + if self.prefix is not None: + msgq.set_fake_prefix(self.prefix) + else: + msgq.delete_fake_prefix() + + def teardown_method(self): + msgq.toggle_fake_events(False) + msgq.delete_fake_prefix() + + def test_event_handle_init(self): + handle = msgq.fake_event_handle("controlsState", override=True) + + assert not handle.enabled + assert handle.recv_called_event.fd >= 0 + assert handle.recv_ready_event.fd >= 0 + + def test_non_managed_socket_state(self): + # non managed socket should have zero state + _ = msgq.pub_sock("ubloxGnss") + + handle = msgq.fake_event_handle("ubloxGnss", override=False) + + assert not handle.enabled + assert handle.recv_called_event.fd == 0 + assert handle.recv_ready_event.fd == 0 + + def test_managed_socket_state(self): + # managed socket should not change anything about the state + handle = msgq.fake_event_handle("ubloxGnss") + handle.enabled = True + + expected_enabled = handle.enabled + expected_recv_called_fd = handle.recv_called_event.fd + expected_recv_ready_fd = handle.recv_ready_event.fd + + _ = msgq.pub_sock("ubloxGnss") + + assert handle.enabled == expected_enabled + assert handle.recv_called_event.fd == expected_recv_called_fd + assert handle.recv_ready_event.fd == expected_recv_ready_fd + + def test_sockets_enable_disable(self): + carState_handle = msgq.fake_event_handle("ubloxGnss", enable=True) + recv_called = carState_handle.recv_called_event + recv_ready = carState_handle.recv_ready_event + + pub_sock = msgq.pub_sock("ubloxGnss") + sub_sock = msgq.sub_sock("ubloxGnss") + + try: + carState_handle.enabled = True + recv_ready.set() + pub_sock.send(b"test") + _ = sub_sock.receive() + assert recv_called.peek() + recv_called.clear() + + carState_handle.enabled = False + recv_ready.set() + pub_sock.send(b"test") + _ = sub_sock.receive() + assert not recv_called.peek() + except RuntimeError: + pytest.fail("event.wait() timed out") + + def test_synced_pub_sub(self): + def daemon_repub_process_run(): + pub_sock = msgq.pub_sock("ubloxGnss") + sub_sock = msgq.sub_sock("carState") + + frame = -1 + while True: + frame += 1 + msg = sub_sock.receive(non_blocking=True) + if msg is None: + print("none received") + continue + + bts = frame.to_bytes(8, 'little') + pub_sock.send(bts) + + carState_handle = msgq.fake_event_handle("carState", enable=True) + recv_called = carState_handle.recv_called_event + recv_ready = carState_handle.recv_ready_event + + p = multiprocessing.Process(target=daemon_repub_process_run) + p.start() + + pub_sock = msgq.pub_sock("carState") + sub_sock = msgq.sub_sock("ubloxGnss") + + try: + for i in range(10): + recv_called.wait(WAIT_TIMEOUT) + recv_called.clear() + + if i == 0: + sub_sock.receive(non_blocking=True) + + bts = i.to_bytes(8, 'little') + pub_sock.send(bts) + + recv_ready.set() + recv_called.wait(WAIT_TIMEOUT) + + msg = sub_sock.receive(non_blocking=True) + assert msg is not None + assert len(msg) == 8 + + frame = int.from_bytes(msg, 'little') + assert frame == i + except RuntimeError: + pytest.fail("event.wait() timed out") + finally: + p.kill() diff --git a/artifacts/package_runtime/msgq/tests/test_messaging.py b/artifacts/package_runtime/msgq/tests/test_messaging.py new file mode 100644 index 000000000..38f1d9792 --- /dev/null +++ b/artifacts/package_runtime/msgq/tests/test_messaging.py @@ -0,0 +1,68 @@ +import os +import random +import time +import string +import msgq + +def random_sock(): + return ''.join(random.choices(string.ascii_uppercase + string.digits, k=10)) + +def random_bytes(length=1000): + return bytes([random.randrange(0xFF) for _ in range(length)]) + +def zmq_sleep(t=1): + if "ZMQ" in os.environ: + time.sleep(t) + +class TestPubSubSockets: + + def setup_method(self): + # ZMQ pub socket takes too long to die + # sleep to prevent multiple publishers error between tests + zmq_sleep() + + def test_pub_sub(self): + sock = random_sock() + pub_sock = msgq.pub_sock(sock) + sub_sock = msgq.sub_sock(sock, conflate=False, timeout=None) + zmq_sleep(3) + + for _ in range(1000): + msg = random_bytes() + pub_sock.send(msg) + recvd = sub_sock.receive() + assert msg == recvd + + def test_conflate(self): + sock = random_sock() + pub_sock = msgq.pub_sock(sock) + for conflate in [True, False]: + num_msgs = random.randint(3, 10) + sub_sock = msgq.sub_sock(sock, conflate=conflate, timeout=None) + zmq_sleep() + + sent_msgs = [] + for __ in range(num_msgs): + msg = random_bytes() + pub_sock.send(msg) + sent_msgs.append(msg) + time.sleep(0.1) + recvd_msgs = msgq.drain_sock_raw(sub_sock) + if conflate: + assert len(recvd_msgs) == 1 + assert recvd_msgs[0] == sent_msgs[-1] + else: + assert len(recvd_msgs) == len(sent_msgs) + for rec_msg, sent_msg in zip(recvd_msgs, sent_msgs): + assert rec_msg == sent_msg + + def test_receive_timeout(self): + sock = random_sock() + timeout = random.randrange(200) + sub_sock = msgq.sub_sock(sock, timeout=timeout) + zmq_sleep() + + start_time = time.monotonic() + recvd = sub_sock.receive() + assert (time.monotonic() - start_time) < (timeout + 0.1) + assert recvd is None diff --git a/artifacts/package_runtime/msgq/tests/test_poller.py b/artifacts/package_runtime/msgq/tests/test_poller.py new file mode 100644 index 000000000..6ef2c0423 --- /dev/null +++ b/artifacts/package_runtime/msgq/tests/test_poller.py @@ -0,0 +1,138 @@ +import pytest +import time +import msgq +import concurrent.futures + +SERVICE_NAME = 'myService' + +def poller(): + context = msgq.Context() + + p = msgq.Poller() + + sub = msgq.SubSocket() + sub.connect(context, SERVICE_NAME) + p.registerSocket(sub) + + socks = p.poll(10000) + r = [s.receive(non_blocking=True) for s in socks] + + return r + + +class TestPoller: + def test_poll_once(self): + context = msgq.Context() + + pub = msgq.PubSocket() + pub.connect(context, SERVICE_NAME) + + with concurrent.futures.ThreadPoolExecutor() as e: + poll = e.submit(poller) + + time.sleep(0.1) # Slow joiner syndrome + + # Send message + pub.send(b"a") + + # Wait for poll result + result = poll.result() + + del pub + context.term() + + assert result == [b"a"] + + def test_poll_and_create_many_subscribers(self): + context = msgq.Context() + + pub = msgq.PubSocket() + pub.connect(context, SERVICE_NAME) + + with concurrent.futures.ThreadPoolExecutor() as e: + poll = e.submit(poller) + + time.sleep(0.1) # Slow joiner syndrome + c = msgq.Context() + for _ in range(10): + msgq.SubSocket().connect(c, SERVICE_NAME) + + time.sleep(0.1) + + # Send message + pub.send(b"a") + + # Wait for poll result + result = poll.result() + + del pub + context.term() + + assert result == [b"a"] + + def test_multiple_publishers_exception(self): + context = msgq.Context() + + with pytest.raises(msgq.MultiplePublishersError): + pub1 = msgq.PubSocket() + pub1.connect(context, SERVICE_NAME) + + pub2 = msgq.PubSocket() + pub2.connect(context, SERVICE_NAME) + + pub1.send(b"a") + + del pub1 + del pub2 + context.term() + + def test_multiple_messages(self): + context = msgq.Context() + + pub = msgq.PubSocket() + pub.connect(context, SERVICE_NAME) + + sub = msgq.SubSocket() + sub.connect(context, SERVICE_NAME) + + time.sleep(0.1) # Slow joiner + + for i in range(1, 100): + pub.send(b'a'*i) + + msg_seen = False + i = 1 + while True: + r = sub.receive(non_blocking=True) + + if r is not None: + assert b'a'*i == r + + msg_seen = True + i += 1 + + if r is None and msg_seen: # ZMQ sometimes receives nothing on the first receive + break + + del pub + del sub + context.term() + + def test_conflate(self): + context = msgq.Context() + + pub = msgq.PubSocket() + pub.connect(context, SERVICE_NAME) + + sub = msgq.SubSocket() + sub.connect(context, SERVICE_NAME, conflate=True) + + time.sleep(0.1) # Slow joiner + pub.send(b'a') + pub.send(b'b') + + assert b'b' == sub.receive() + + del pub + del sub + context.term() diff --git a/artifacts/package_runtime/msgq/visionipc/.gitignore b/artifacts/package_runtime/msgq/visionipc/.gitignore new file mode 100644 index 000000000..fa5a2b9f3 --- /dev/null +++ b/artifacts/package_runtime/msgq/visionipc/.gitignore @@ -0,0 +1,2 @@ +visionipc_pyx.cpp +*.so diff --git a/artifacts/package_runtime/msgq/visionipc/__init__.py b/artifacts/package_runtime/msgq/visionipc/__init__.py new file mode 100644 index 000000000..faf92413f --- /dev/null +++ b/artifacts/package_runtime/msgq/visionipc/__init__.py @@ -0,0 +1,5 @@ +from msgq.visionipc.visionipc_pyx import VisionBuf, VisionIpcClient, VisionIpcServer, get_endpoint_name +assert VisionBuf +assert VisionIpcClient +assert VisionIpcServer +assert get_endpoint_name diff --git a/artifacts/package_runtime/msgq/visionipc/tests/__init__.py b/artifacts/package_runtime/msgq/visionipc/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/msgq/visionipc/tests/test_visionipc.py b/artifacts/package_runtime/msgq/visionipc/tests/test_visionipc.py new file mode 100644 index 000000000..9b11eb7b7 --- /dev/null +++ b/artifacts/package_runtime/msgq/visionipc/tests/test_visionipc.py @@ -0,0 +1,115 @@ +import os +import time +import random +from enum import IntEnum +from typing import Optional +import numpy as np +from msgq.visionipc import VisionIpcServer, VisionIpcClient + + +class VisionStreamType(IntEnum): + VISION_STREAM_ROAD = 0 + VISION_STREAM_DRIVER = 1 + VISION_STREAM_WIDE_ROAD = 2 + VISION_STREAM_MAP = 3 + +def zmq_sleep(t=1): + if "ZMQ" in os.environ: + time.sleep(t) + + +class TestVisionIpc: + server: VisionIpcServer + client: Optional[VisionIpcClient] + + def setup_vipc(self, name, *stream_types, num_buffers=1, width=100, height=100, conflate=False): + self.server = VisionIpcServer(name) + for stream_type in stream_types: + self.server.create_buffers(stream_type, num_buffers, width, height) + self.server.start_listener() + + if len(stream_types): + self.client = VisionIpcClient(name, stream_types[0], conflate) + assert self.client.connect(True) + else: + self.client = None + + zmq_sleep() + return self.server, self.client + + def test_connect(self): + self.setup_vipc("camerad", VisionStreamType.VISION_STREAM_ROAD) + assert self.client is not None + assert self.client.is_connected + del self.client + del self.server + + def test_available_streams(self): + for k in range(4): + stream_types = set(random.choices([x.value for x in VisionStreamType], k=k)) + self.setup_vipc("camerad", *stream_types) + available_streams = VisionIpcClient.available_streams("camerad", True) + assert available_streams == stream_types + del self.client + del self.server + + def test_buffers(self): + width, height, num_buffers = 100, 200, 5 + self.setup_vipc("camerad", VisionStreamType.VISION_STREAM_ROAD, num_buffers=num_buffers, width=width, height=height) + assert self.client is not None + assert self.client.width == width + assert self.client.height == height + assert self.client.buffer_len is not None and self.client.buffer_len > 0 + assert self.client.num_buffers == num_buffers + del self.client + del self.server + + def test_send_single_buffer(self): + self.setup_vipc("camerad", VisionStreamType.VISION_STREAM_ROAD) + assert self.client is not None + assert self.client.buffer_len is not None + buf = np.zeros(self.client.buffer_len, dtype=np.uint8) + buf.view(' None: + if motor not in (PandaBody.MOTOR_LEFT, PandaBody.MOTOR_RIGHT): + raise ValueError("motor must be MOTOR_LEFT or MOTOR_RIGHT") + + def motor_set_speed(self, motor: int, speed: int) -> None: + self._ensure_valid_motor(motor) + assert -100 <= speed <= 100, "speed must be between -100 and 100" + speed_param = speed if speed >= 0 else (256 + speed) + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe0, motor, speed_param, b'') + + def motor_set_target_rpm(self, motor: int, rpm: float) -> None: + self._ensure_valid_motor(motor) + target_deci_rpm = int(round(rpm * 10.0)) + assert -32768 <= target_deci_rpm <= 32767, "target rpm out of range (-3276.8 to 3276.7)" + target_param = target_deci_rpm if target_deci_rpm >= 0 else (target_deci_rpm + (1 << 16)) + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe4, motor, target_param, b'') + + def motor_stop(self, motor: int) -> None: + self._ensure_valid_motor(motor) + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe1, motor, 0, b'') + + def motor_get_encoder_state(self, motor: int) -> tuple[int, float]: + self._ensure_valid_motor(motor) + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xe2, motor, 0, 8) + position, rpm_milli = struct.unpack(" None: + self._ensure_valid_motor(motor) + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe3, motor, 0, b'') diff --git a/artifacts/package_runtime/panda/board/body/flash.py b/artifacts/package_runtime/panda/board/body/flash.py new file mode 100644 index 000000000..8f820ce97 --- /dev/null +++ b/artifacts/package_runtime/panda/board/body/flash.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +import argparse +import os +import subprocess + +from panda import Panda + +BODY_DIR = os.path.dirname(os.path.realpath(__file__)) +BOARD_DIR = os.path.abspath(os.path.join(BODY_DIR, "..")) +REPO_ROOT = os.path.abspath(os.path.join(BOARD_DIR, "..")) +DEFAULT_FIRMWARE = os.path.join(BOARD_DIR, "obj", "body_h7.bin.signed") + + +def build_body() -> None: + subprocess.check_call( + f"scons -C {REPO_ROOT} -j$(nproc) board/obj/body_h7.bin.signed", + shell=True, + ) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("firmware", nargs="?", help="Optional path to firmware binary to flash") + parser.add_argument("--all", action="store_true", help="Flash all Panda devices") + parser.add_argument( + "--wait-usb", + action="store_true", + help="Wait for the panda to reconnect over USB after flashing (defaults to skipping reconnect).", + ) + args = parser.parse_args() + + firmware_path = os.path.abspath(args.firmware) if args.firmware is not None else DEFAULT_FIRMWARE + + build_body() + + if not os.path.isfile(firmware_path): + parser.error(f"firmware file not found: {firmware_path}") + + if args.all: + serials = Panda.list() + print(f"found {len(serials)} panda(s) - {serials}") + else: + serials = [None] + + for s in serials: + with Panda(serial=s) as p: + print("flashing", p.get_usb_serial()) + p.flash(firmware_path, reconnect=args.wait_usb) + exit(1 if len(serials) == 0 else 0) diff --git a/artifacts/package_runtime/panda/board/flash.py b/artifacts/package_runtime/panda/board/flash.py new file mode 100644 index 000000000..394381462 --- /dev/null +++ b/artifacts/package_runtime/panda/board/flash.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +import os +import subprocess +import argparse + +from panda import Panda + +board_path = os.path.dirname(os.path.realpath(__file__)) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--all", action="store_true", help="Recover all Panda devices") + args = parser.parse_args() + + subprocess.check_call(f"scons -C {board_path}/.. -j$(nproc) {board_path}", shell=True) + + if args.all: + serials = Panda.list() + print(f"found {len(serials)} panda(s) - {serials}") + else: + serials = [None] + + for s in serials: + with Panda(serial=s) as p: + print("flashing", p.get_usb_serial()) + p.flash() + exit(1 if len(serials) == 0 else 0) diff --git a/artifacts/package_runtime/panda/board/jungle/__init__.py b/artifacts/package_runtime/panda/board/jungle/__init__.py new file mode 100644 index 000000000..dfb7d98c7 --- /dev/null +++ b/artifacts/package_runtime/panda/board/jungle/__init__.py @@ -0,0 +1,159 @@ +# python library to interface with panda +import os +import struct +from functools import wraps + +from panda import Panda, PandaDFU +from panda.python.constants import McuType + +BASEDIR = os.path.dirname(os.path.realpath(__file__)) +FW_PATH = os.path.join(BASEDIR, "../obj/") + + +def ensure_jungle_health_packet_version(fn): + @wraps(fn) + def wrapper(self, *args, **kwargs): + if self.health_version != self.HEALTH_PACKET_VERSION: + raise RuntimeError(f"Jungle firmware ({self.health_version}) doesn't match the \ + library's health packet version ({self.HEALTH_PACKET_VERSION}). \ + Reflash jungle.") + return fn(self, *args, **kwargs) + return wrapper + + +class PandaJungleDFU(PandaDFU): + def recover(self): + fn = os.path.join(FW_PATH, self._mcu_type.config.bootstub_fn.replace("panda", "panda_jungle")) + with open(fn, "rb") as f: + code = f.read() + self.program_bootstub(code) + self.reset() + + +class PandaJungle(Panda): + USB_PIDS = (0xddef, 0xddcf) + + HW_TYPE_UNKNOWN = b'\x00' + HW_TYPE_V2 = b'\x02' + + H7_DEVICES = [HW_TYPE_V2, ] + SUPPORTED_DEVICES = H7_DEVICES + + HEALTH_PACKET_VERSION = 1 + HEALTH_STRUCT = struct.Struct(" bool: + dfu_serial = self.get_dfu_serial() + + if reset: + self.reset(enter_bootstub=True) + self.reset(enter_bootloader=True) + + if not self.wait_for_dfu(dfu_serial, timeout=timeout): + return False + + dfu = PandaJungleDFU(dfu_serial) + dfu.recover() + + # reflash after recover + self.connect(True, True) + self.flash() + return True + + def get_mcu_type(self) -> McuType: + hw_type = self.get_type() + if hw_type in PandaJungle.H7_DEVICES: + return McuType.H7 + raise ValueError(f"unknown HW type: {hw_type}") + + def up_to_date(self, fn=None) -> bool: + if fn is None: + fn = os.path.join(FW_PATH, self.get_mcu_type().config.app_fn.replace("panda", "panda_jungle")) + return super().up_to_date(fn=fn) + + # ******************* health ******************* + + @ensure_jungle_health_packet_version + def health(self): + dat = self._handle.controlRead(PandaJungle.REQUEST_IN, 0xd2, 0, 0, self.HEALTH_STRUCT.size) + a = self.HEALTH_STRUCT.unpack(dat) + return { + "uptime": a[0], + "ch1_power": a[1], + "ch2_power": a[2], + "ch3_power": a[3], + "ch4_power": a[4], + "ch5_power": a[5], + "ch6_power": a[6], + "ch1_sbu1_voltage": a[7] / 1000.0, + "ch1_sbu2_voltage": a[8] / 1000.0, + "ch2_sbu1_voltage": a[9] / 1000.0, + "ch2_sbu2_voltage": a[10] / 1000.0, + "ch3_sbu1_voltage": a[11] / 1000.0, + "ch3_sbu2_voltage": a[12] / 1000.0, + "ch4_sbu1_voltage": a[13] / 1000.0, + "ch4_sbu2_voltage": a[14] / 1000.0, + "ch5_sbu1_voltage": a[15] / 1000.0, + "ch5_sbu2_voltage": a[16] / 1000.0, + "ch6_sbu1_voltage": a[17] / 1000.0, + "ch6_sbu2_voltage": a[18] / 1000.0, + } + + # ******************* control ******************* + + # Returns tuple with health packet version and CAN packet/USB packet version + def get_packets_versions(self): + dat = self._handle.controlRead(PandaJungle.REQUEST_IN, 0xdd, 0, 0, 3) + if dat and len(dat) == 3: + a = struct.unpack("BBB", dat) + return (a[0], a[1], a[2]) + return (-1, -1, -1) + + # ******************* jungle stuff ******************* + + def set_panda_power(self, enabled): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa0, int(enabled), 0, b'') + + def set_panda_individual_power(self, port, enabled): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa3, int(port), int(enabled), b'') + + def set_harness_orientation(self, mode): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa1, int(mode), 0, b'') + + def set_ignition(self, enabled): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa2, int(enabled), 0, b'') + + def set_can_silent(self, silent): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xf5, int(silent), 0, b'') + + def set_generated_can(self, enabled): + self._handle.controlWrite(PandaJungle.REQUEST_OUT, 0xa4, int(enabled), 0, b'') + + # ******************* serial ******************* + + def debug_read(self): + ret = [] + while 1: + lret = bytes(self._handle.controlRead(PandaJungle.REQUEST_IN, 0xe0, 0, 0, 0x40)) + if len(lret) == 0: + break + ret.append(lret) + return b''.join(ret) + + # ******************* header pins ******************* + + def set_header_pin(self, pin_num, enabled): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xf7, int(pin_num), int(enabled), b'') diff --git a/artifacts/package_runtime/panda/board/jungle/flash.py b/artifacts/package_runtime/panda/board/jungle/flash.py new file mode 100644 index 000000000..6f60f70b1 --- /dev/null +++ b/artifacts/package_runtime/panda/board/jungle/flash.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +import os +import subprocess +import argparse + +from panda import PandaJungle + +board_path = os.path.dirname(os.path.realpath(__file__)) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--all", action="store_true", help="Recover all panda jungle devices") + args = parser.parse_args() + + subprocess.check_call(f"scons -C {board_path}/.. -u -j$(nproc) .", shell=True) + + if args.all: + serials = PandaJungle.list() + print(f"found {len(serials)} panda jungles(s) - {serials}") + else: + serials = [None] + + for s in serials: + with PandaJungle(serial=s) as p: + print("flashing", p.get_usb_serial()) + p.flash() + exit(1 if len(serials) == 0 else 0) diff --git a/artifacts/package_runtime/panda/board/jungle/recover.py b/artifacts/package_runtime/panda/board/jungle/recover.py new file mode 100644 index 000000000..228f0c561 --- /dev/null +++ b/artifacts/package_runtime/panda/board/jungle/recover.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +import os +import time +import subprocess +import argparse + +from panda import PandaJungle, PandaJungleDFU + +board_path = os.path.dirname(os.path.realpath(__file__)) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--all", action="store_true", help="Recover all panda jungle devices") + args = parser.parse_args() + + subprocess.check_call(f"scons -C {board_path}/.. -u -j$(nproc) .", shell=True) + + serials = PandaJungle.list() if args.all else [None] + for s in serials: + with PandaJungle(serial=s) as p: + print(f"putting {p.get_usb_serial()} in DFU mode") + p.reset(enter_bootstub=True) + p.reset(enter_bootloader=True) + + # wait for reset panda jungles to come back up + time.sleep(1) + + dfu_serials = PandaJungleDFU.list() + print(f"found {len(dfu_serials)} panda jungle(s) in DFU - {dfu_serials}") + for s in dfu_serials: + print("flashing", s) + PandaJungleDFU(s).recover() + exit(1 if len(dfu_serials) == 0 else 0) diff --git a/artifacts/package_runtime/panda/board/obj/body_h7.bin.signed b/artifacts/package_runtime/panda/board/obj/body_h7.bin.signed new file mode 100644 index 000000000..0f6cf1264 Binary files /dev/null and b/artifacts/package_runtime/panda/board/obj/body_h7.bin.signed differ diff --git a/artifacts/package_runtime/panda/board/obj/bootstub.body_h7.bin b/artifacts/package_runtime/panda/board/obj/bootstub.body_h7.bin new file mode 100755 index 000000000..8a1c6afac Binary files /dev/null and b/artifacts/package_runtime/panda/board/obj/bootstub.body_h7.bin differ diff --git a/artifacts/package_runtime/panda/board/obj/bootstub.panda.bin b/artifacts/package_runtime/panda/board/obj/bootstub.panda.bin new file mode 100755 index 000000000..be4a3efc2 Binary files /dev/null and b/artifacts/package_runtime/panda/board/obj/bootstub.panda.bin differ diff --git a/artifacts/package_runtime/panda/board/obj/bootstub.panda_h7.bin b/artifacts/package_runtime/panda/board/obj/bootstub.panda_h7.bin new file mode 100755 index 000000000..de7af38d9 Binary files /dev/null and b/artifacts/package_runtime/panda/board/obj/bootstub.panda_h7.bin differ diff --git a/artifacts/package_runtime/panda/board/obj/bootstub.panda_jungle_h7.bin b/artifacts/package_runtime/panda/board/obj/bootstub.panda_jungle_h7.bin new file mode 100755 index 000000000..e9fb53bad Binary files /dev/null and b/artifacts/package_runtime/panda/board/obj/bootstub.panda_jungle_h7.bin differ diff --git a/artifacts/package_runtime/panda/board/obj/panda.bin.signed b/artifacts/package_runtime/panda/board/obj/panda.bin.signed new file mode 100644 index 000000000..806c0d1a8 Binary files /dev/null and b/artifacts/package_runtime/panda/board/obj/panda.bin.signed differ diff --git a/artifacts/package_runtime/panda/board/obj/panda_h7.bin.signed b/artifacts/package_runtime/panda/board/obj/panda_h7.bin.signed new file mode 100644 index 000000000..f10865538 Binary files /dev/null and b/artifacts/package_runtime/panda/board/obj/panda_h7.bin.signed differ diff --git a/artifacts/package_runtime/panda/board/obj/panda_jungle_h7.bin.signed b/artifacts/package_runtime/panda/board/obj/panda_jungle_h7.bin.signed new file mode 100644 index 000000000..d38ec1fc3 Binary files /dev/null and b/artifacts/package_runtime/panda/board/obj/panda_jungle_h7.bin.signed differ diff --git a/artifacts/package_runtime/panda/board/recover.py b/artifacts/package_runtime/panda/board/recover.py new file mode 100644 index 000000000..6268a07d9 --- /dev/null +++ b/artifacts/package_runtime/panda/board/recover.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +import os +import time +import subprocess + +from panda import Panda, PandaDFU + +board_path = os.path.dirname(os.path.realpath(__file__)) + +if __name__ == "__main__": + subprocess.check_call(f"scons -C {board_path}/.. -j$(nproc) {board_path}", shell=True) + + for s in Panda.list(): + with Panda(serial=s) as p: + print(f"putting {p.get_usb_serial()} in DFU mode") + p.reset(enter_bootstub=True) + p.reset(enter_bootloader=True) + + # wait for reset pandas to come back up + time.sleep(1) + + dfu_serials = PandaDFU.list() + print(f"found {len(dfu_serials)} panda(s) in DFU - {dfu_serials}") + for s in dfu_serials: + print("flashing", s) + PandaDFU(s).recover() + exit(1 if len(dfu_serials) == 0 else 0) diff --git a/artifacts/package_runtime/panda/python/__init__.py b/artifacts/package_runtime/panda/python/__init__.py new file mode 100644 index 000000000..a28b8b879 --- /dev/null +++ b/artifacts/package_runtime/panda/python/__init__.py @@ -0,0 +1,847 @@ +# python library to interface with panda +import os +import sys +import time +import usb1 +import struct +import hashlib +import binascii +from functools import wraps, partial +from itertools import accumulate + +from iqdbc.car.structs import CarParams + +from .base import BaseHandle +from .constants import FW_PATH, McuType +from .dfu import PandaDFU +from .spi import PandaSpiHandle, PandaSpiException, PandaProtocolMismatch +from .usb import PandaUsbHandle +from .utils import logger + +__version__ = '0.0.10' + +CANPACKET_HEAD_SIZE = 0x6 +DLC_TO_LEN = [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64] +LEN_TO_DLC = {length: dlc for (dlc, length) in enumerate(DLC_TO_LEN)} +PANDA_CAN_CNT = 3 + + +def calculate_checksum(data): + res = 0 + for b in data: + res ^= b + return res + +def pack_can_buffer(arr, chunk=False, fd=False): + snds = [bytearray(), ] + for address, dat, bus in arr: + extended = 1 if address >= 0x800 else 0 + data_len_code = LEN_TO_DLC[len(dat)] + header = bytearray(CANPACKET_HEAD_SIZE) + word_4b = (address << 3) | (extended << 2) + header[0] = (data_len_code << 4) | (bus << 1) | int(fd) + header[1] = word_4b & 0xFF + header[2] = (word_4b >> 8) & 0xFF + header[3] = (word_4b >> 16) & 0xFF + header[4] = (word_4b >> 24) & 0xFF + header[5] = calculate_checksum(header[:5] + dat) + + snds[-1].extend(header) + snds[-1].extend(dat) + if chunk and len(snds[-1]) > 256: + snds.append(bytearray()) + + return snds + +def unpack_can_buffer(dat): + ret = [] + + while len(dat) >= CANPACKET_HEAD_SIZE: + data_len = DLC_TO_LEN[(dat[0]>>4)] + + header = dat[:CANPACKET_HEAD_SIZE] + + bus = (header[0] >> 1) & 0x7 + address = (header[4] << 24 | header[3] << 16 | header[2] << 8 | header[1]) >> 3 + + if (header[1] >> 1) & 0x1: + # returned + bus += 128 + if header[1] & 0x1: + # rejected + bus += 192 + + # we need more from the next transfer + if data_len > len(dat) - CANPACKET_HEAD_SIZE: + break + + assert calculate_checksum(dat[:(CANPACKET_HEAD_SIZE+data_len)]) == 0, "CAN packet checksum incorrect" + + data = dat[CANPACKET_HEAD_SIZE:(CANPACKET_HEAD_SIZE+data_len)] + dat = dat[(CANPACKET_HEAD_SIZE+data_len):] + + ret.append((address, data, bus)) + + return (ret, dat) + + +def ensure_version(desc, lib_field, panda_field, fn): + @wraps(fn) + def wrapper(self, *args, **kwargs): + lib_version = getattr(self, lib_field) + panda_version = getattr(self, panda_field) + if lib_version != panda_version: + raise RuntimeError(f"{desc} packet version mismatch: panda's firmware v{panda_version}, library v{lib_version}. Reflash panda.") + return fn(self, *args, **kwargs) + return wrapper +ensure_can_packet_version = partial(ensure_version, "CAN", "CAN_PACKET_VERSION", "can_version") +ensure_can_health_packet_version = partial(ensure_version, "CAN health", "CAN_HEALTH_PACKET_VERSION", "can_health_version") +ensure_health_packet_version = partial(ensure_version, "health", "HEALTH_PACKET_VERSION", "health_version") + + +def _is_lite_hw() -> bool: + return os.environ.get('LITE') == '1' or os.path.exists('/tmp/lite_hw') + + +class Panda: + + SERIAL_DEBUG = 0 + SERIAL_SOM_DEBUG = 4 + + USB_VIDS = (0xbbaa, 0x3801) # 0x3801 is comma's registered VID + USB_PIDS = (0xddee, 0xddcc) + REQUEST_IN = usb1.ENDPOINT_IN | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE + REQUEST_OUT = usb1.ENDPOINT_OUT | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE + + # from https://github.com/commaai/openpilot/blob/103b4df18cbc38f4129555ab8b15824d1a672bdf/cereal/log.capnp#L648 + HW_TYPE_UNKNOWN = b'\x00' + HW_TYPE_WHITE = b'\x01' + HW_TYPE_GREY_PANDA = b'\x02' + HW_TYPE_BLACK = b'\x03' + HW_TYPE_PEDAL = b'\x04' + HW_TYPE_UNO = b'\x05' + HW_TYPE_DOS = b'\x06' + HW_TYPE_RED_PANDA = b'\x07' + HW_TYPE_RED_PANDA_V2 = b'\x08' + HW_TYPE_TRES = b'\x09' + HW_TYPE_CUATRO = b'\x0a' + HW_TYPE_BODY = b'\xb1' + + CAN_PACKET_VERSION = 4 + HEALTH_PACKET_VERSION = 17 + CAN_HEALTH_PACKET_VERSION = 5 + HEALTH_STRUCT = struct.Struct(" 0: + print("INFO: some attached pandas are in DFU mode.") + + pandas = self.list() + if len(pandas) == 0: + print("INFO: panda not available") + return None + if len(pandas) == 1: + print(f"INFO: connecting to panda {pandas[0]}") + return pandas[0] + while True: + print("Multiple pandas available:") + pandas.sort() + for idx, serial in enumerate(pandas): + print(f"{[idx]}: {serial}") + try: + choice = int(input("Choose serial [0]:") or "0") + return pandas[choice] + except (ValueError, IndexError): + print("Enter a valid index.") + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + if self._handle_open: + self._handle.close() + self._handle_open = False + if self._context is not None: + self._context.close() + + def connect(self, claim=True, wait=False): + self.close() + + self._handle = None + while self._handle is None: + # try USB first, then SPI + self._context, self._handle, serial, self.bootstub, bcd = self.usb_connect(self._connect_serial, claim=claim, no_error=wait) + if self._handle is None: + self._context, self._handle, serial, self.bootstub, bcd = self.spi_connect(self._connect_serial) + if not wait: + break + + if self._handle is None: + raise Exception("failed to connect to panda") + + self._bcd_hw_type = None + ret = self._handle.controlRead(Panda.REQUEST_IN, 0xc1, 0, 0, 0x40) + missing_hw_type_endpoint = self.bootstub and ret.startswith(b'\xff\x00\xc1\x3e\xde\xad\xd0\x0d') + if missing_hw_type_endpoint and bcd is not None: + self._bcd_hw_type = bcd + + self._assume_f4_mcu = (self._bcd_hw_type is None) and missing_hw_type_endpoint + + self._serial = serial + self._connect_serial = serial + self._handle_open = True + self._mcu_type = self.get_mcu_type() + self.health_version, self.can_version, self.can_health_version = self.get_packets_versions() + logger.debug("connected") + + hw_type = self.get_type() + if hw_type not in self.SUPPORTED_DEVICES: + print("WARNING: Using deprecated HW") + + # disable openpilot's heartbeat checks + if self._disable_checks: + self.set_heartbeat_disabled() + self.set_power_save(0) + + # reset comms + self.can_reset_communications() + + # disable automatic CAN-FD switching + for bus in range(PANDA_CAN_CNT): + self.set_canfd_auto(bus, False) + + # set CAN speed + for bus in range(PANDA_CAN_CNT): + self.set_can_speed_kbps(bus, self._can_speed_kbps) + + @property + def spi(self) -> bool: + return isinstance(self._handle, PandaSpiHandle) + + @classmethod + def spi_connect(cls, serial, ignore_version=False): + try: + handle = PandaSpiHandle() + dat = handle.get_protocol_version() + except PandaSpiException: + return None, None, None, False, None + + spi_serial = binascii.hexlify(dat[:12]).decode() + pid = dat[13] + if pid not in (0xcc, 0xee): + raise PandaProtocolMismatch(f"invalid bootstub status ({pid=}). reflash panda") + bootstub = pid == 0xee + spi_version = dat[14] + + # did we get the right panda? + if serial is not None and spi_serial != serial: + return None, None, None, False, None + + # ensure our protocol version matches the panda + if (not ignore_version) and spi_version != handle.PROTOCOL_VERSION: + raise PandaProtocolMismatch(f"panda protocol mismatch: expected {handle.PROTOCOL_VERSION}, got {spi_version}. reflash panda") + + # got a device and all good + return None, handle, spi_serial, bootstub, None + + @classmethod + def usb_connect(cls, serial, claim=True, no_error=False): + handle, usb_serial, bootstub, bcd = None, None, None, None + context = usb1.USBContext() + context.open() + try: + for device in context.getDeviceList(skip_on_error=True): + if device.getVendorID() in cls.USB_VIDS and device.getProductID() in cls.USB_PIDS: + try: + this_serial = device.getSerialNumber() + except Exception: + # Allow to ignore errors on reconnect. USB hubs need some time to initialize after panda reset + if not no_error: + logger.exception("failed to get serial number of panda") + continue + + if serial is None or this_serial == serial: + logger.debug("opening device %s %s", this_serial, hex(device.getProductID())) + + usb_serial = this_serial + bootstub = (device.getProductID() & 0xF0) == 0xe0 + handle = device.open() + if sys.platform not in ("win32", "cygwin", "msys", "darwin"): + handle.setAutoDetachKernelDriver(True) + if claim: + handle.claimInterface(0) + # handle.setInterfaceAltSetting(0, 0) # Issue in USB stack + + this_bcd = device.getbcdDevice() + if this_bcd is not None and this_bcd != 0x2300: + bcd = bytearray([this_bcd >> 8, ]) + + break + except Exception: + logger.exception("USB connect error") + + usb_handle = None + if handle is not None: + usb_handle = PandaUsbHandle(handle) + else: + context.close() + + return context, usb_handle, usb_serial, bootstub, bcd + + def is_connected_spi(self): + return isinstance(self._handle, PandaSpiHandle) + + def is_connected_usb(self): + return isinstance(self._handle, PandaUsbHandle) + + @classmethod + def list(cls, usb_only: bool = False): + ret = cls.usb_list() + if not usb_only: + ret += cls.spi_list() + return list(set(ret)) + + @classmethod + def usb_list(cls): + ret = [] + try: + with usb1.USBContext() as context: + for device in context.getDeviceList(skip_on_error=True): + if device.getVendorID() in cls.USB_VIDS and device.getProductID() in cls.USB_PIDS: + try: + serial = device.getSerialNumber() + if len(serial) == 24: + ret.append(serial) + else: + logger.warning(f"found device with panda descriptors but invalid serial: {serial}", RuntimeWarning) + except Exception: + logger.exception("error connecting to panda") + except Exception: + logger.exception("exception while listing pandas") + return ret + + @classmethod + def spi_list(cls): + _, _, serial, _, _ = cls.spi_connect(None, ignore_version=True) + if serial is not None: + return [serial, ] + return [] + + def reset(self, enter_bootstub=False, enter_bootloader=False, reconnect=True): + # no response is expected since it resets right away + timeout = 5000 if isinstance(self._handle, PandaSpiHandle) else 15000 + try: + if enter_bootloader: + self._handle.controlWrite(Panda.REQUEST_IN, 0xd1, 0, 0, b'', timeout=timeout, expect_disconnect=True) + else: + if enter_bootstub: + self._handle.controlWrite(Panda.REQUEST_IN, 0xd1, 1, 0, b'', timeout=timeout, expect_disconnect=True) + else: + self._handle.controlWrite(Panda.REQUEST_IN, 0xd8, 0, 0, b'', timeout=timeout, expect_disconnect=True) + except Exception: + pass + + self.close() + if not enter_bootloader and reconnect: + self.reconnect() + + @property + def connected(self) -> bool: + return self._handle_open + + def reconnect(self): + if self._handle_open: + self.close() + + success = False + # wait up to 15 seconds + for _ in range(15*10): + try: + self.connect(claim=False, wait=True) + success = True + break + except Exception: + pass + time.sleep(0.1) + if not success: + raise Exception("reconnect failed") + + @staticmethod + def flasher_present(handle: BaseHandle) -> bool: + fr = handle.controlRead(Panda.REQUEST_IN, 0xb0, 0, 0, 0xc) + return fr[4:8] == b"\xde\xad\xd0\x0d" + + @staticmethod + def flash_static(handle, code, mcu_type): + assert mcu_type is not None, "must set valid mcu_type to flash" + + # confirm flasher is present + assert Panda.flasher_present(handle) + + # determine sectors to erase + apps_sectors_cumsum = accumulate(mcu_type.config.sector_sizes[1:]) + last_sector = next((i + 1 for i, v in enumerate(apps_sectors_cumsum) if v > len(code)), -1) + assert last_sector >= 1, "Binary too small? No sector to erase." + assert last_sector < 7, "Binary too large! Risk of overwriting provisioning chunk." + + # unlock flash + logger.info("flash: unlocking") + handle.controlWrite(Panda.REQUEST_IN, 0xb1, 0, 0, b'') + + # erase sectors + logger.info(f"flash: erasing sectors 1 - {last_sector}") + for i in range(1, last_sector + 1): + handle.controlWrite(Panda.REQUEST_IN, 0xb2, i, 0, b'') + + # flash over EP2 + STEP = 0x200 + logger.info("flash: flashing") + for i in range(0, len(code), STEP): + handle.bulkWrite(2, code[i:i + STEP]) + + # reset + logger.info("flash: resetting") + try: + handle.controlWrite(Panda.REQUEST_IN, 0xd8, 0, 0, b'', expect_disconnect=True) + except Exception: + pass + + def flash(self, fn=None, code=None, reconnect=True): + if self.up_to_date(fn=fn): + logger.info("flash: already up to date") + return + + hw_type = self.get_type() + if hw_type not in self.SUPPORTED_DEVICES: + if not (hw_type == Panda.HW_TYPE_UNKNOWN and _is_lite_hw()): + raise RuntimeError(f"HW type {hw_type.hex()} is deprecated and can no longer be flashed.") + + if not fn: + fn = os.path.join(FW_PATH, self._mcu_type.config.app_fn) + assert os.path.isfile(fn) + logger.debug("flash: main version is %s", self.get_version()) + if not self.bootstub: + self.reset(enter_bootstub=True) + assert(self.bootstub) + + if code is None: + with open(fn, "rb") as f: + code = f.read() + + # get version + logger.debug("flash: bootstub version is %s", self.get_version()) + + # do flash + Panda.flash_static(self._handle, code, mcu_type=self._mcu_type) + + # reconnect + if reconnect: + self.reconnect() + + def recover(self, timeout: int | None = 60, reset: bool = True) -> bool: + dfu_serial = self.get_dfu_serial() + + if reset: + self.reset(enter_bootstub=True) + self.reset(enter_bootloader=True) + + if not self.wait_for_dfu(dfu_serial, timeout=timeout): + return False + + dfu = PandaDFU(dfu_serial) + dfu.recover() + + # reflash after recover + self.connect(True, True) + self.flash() + return True + + @staticmethod + def wait_for_dfu(dfu_serial: str | None, timeout: int | None = None) -> bool: + t_start = time.monotonic() + dfu_list = PandaDFU.list() + while (dfu_serial is None and len(dfu_list) == 0) or (dfu_serial is not None and dfu_serial not in dfu_list): + logger.debug("waiting for DFU...") + time.sleep(0.1) + if timeout is not None and (time.monotonic() - t_start) > timeout: + return False + dfu_list = PandaDFU.list() + return True + + @classmethod + def wait_for_panda(cls, serial: str | None, timeout: int) -> bool: + t_start = time.monotonic() + serials = cls.list() + while (serial is None and len(serials) == 0) or (serial is not None and serial not in serials): + logger.debug("waiting for panda...") + time.sleep(0.1) + if timeout is not None and (time.monotonic() - t_start) > timeout: + return False + serials = cls.list() + return True + + def up_to_date(self, fn=None) -> bool: + current = self.get_signature() + if fn is None: + fn = os.path.join(FW_PATH, self.get_mcu_type().config.app_fn) + expected = Panda.get_signature_from_firmware(fn) + return (current == expected) + + def call_control_api(self, msg): + self._handle.controlWrite(Panda.REQUEST_OUT, msg, 0, 0, b'') + + # ******************* health ******************* + + @ensure_health_packet_version + def health(self): + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xd2, 0, 0, self.HEALTH_STRUCT.size) + a = self.HEALTH_STRUCT.unpack(dat) + return { + "uptime": a[0], + "voltage": a[1], + "current": a[2], + "safety_tx_blocked": a[3], + "safety_rx_invalid": a[4], + "tx_buffer_overflow": a[5], + "rx_buffer_overflow": a[6], + "faults": a[7], + "ignition_line": a[8], + "ignition_can": a[9], + "controls_allowed": a[10], + "car_harness_status": a[11], + "safety_mode": a[12], + "safety_param": a[13], + "fault_status": a[14], + "power_save_enabled": a[15], + "heartbeat_lost": a[16], + "alternative_experience": a[17], + "interrupt_load": a[18], + "fan_power": a[19], + "safety_rx_checks_invalid": a[20], + "spi_error_count": a[21], + "sbu1_voltage_mV": a[22], + "sbu2_voltage_mV": a[23], + "som_reset_triggered": a[24], + } + + @ensure_can_health_packet_version + def can_health(self, can_number): + LEC_ERROR_CODE = { + 0: "No error", + 1: "Stuff error", + 2: "Form error", + 3: "AckError", + 4: "Bit1Error", + 5: "Bit0Error", + 6: "CRCError", + 7: "NoChange", + } + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xc2, int(can_number), 0, self.CAN_HEALTH_STRUCT.size) + a = self.CAN_HEALTH_STRUCT.unpack(dat) + return { + "bus_off": a[0], + "bus_off_cnt": a[1], + "error_warning": a[2], + "error_passive": a[3], + "last_error": LEC_ERROR_CODE[a[4]], + "last_stored_error": LEC_ERROR_CODE[a[5]], + "last_data_error": LEC_ERROR_CODE[a[6]], + "last_data_stored_error": LEC_ERROR_CODE[a[7]], + "receive_error_cnt": a[8], + "transmit_error_cnt": a[9], + "total_error_cnt": a[10], + "total_tx_lost_cnt": a[11], + "total_rx_lost_cnt": a[12], + "total_tx_cnt": a[13], + "total_rx_cnt": a[14], + "total_fwd_cnt": a[15], + "total_tx_checksum_error_cnt": a[16], + "can_speed": a[17], + "can_data_speed": a[18], + "canfd_enabled": a[19], + "brs_enabled": a[20], + "canfd_non_iso": a[21], + "irq0_call_rate": a[22], + "irq1_call_rate": a[23], + "irq2_call_rate": a[24], + "can_core_reset_count": a[25], + } + + # ******************* control ******************* + + def get_version(self): + return self._handle.controlRead(Panda.REQUEST_IN, 0xd6, 0, 0, 0x40).decode('utf8') + + @staticmethod + def get_signature_from_firmware(fn) -> bytes: + with open(fn, 'rb') as f: + f.seek(-128, 2) # Seek from end of file + return f.read(128) + + def get_signature(self) -> bytes: + part_1 = self._handle.controlRead(Panda.REQUEST_IN, 0xd3, 0, 0, 0x40) + part_2 = self._handle.controlRead(Panda.REQUEST_IN, 0xd4, 0, 0, 0x40) + return bytes(part_1 + part_2) + + def get_type(self): + ret = self._handle.controlRead(Panda.REQUEST_IN, 0xc1, 0, 0, 0x40) + + if self._bcd_hw_type is not None and (ret is None or len(ret) != 1): + ret = self._bcd_hw_type + + return ret + + # Returns tuple with health packet version and CAN packet/USB packet version + def get_packets_versions(self): + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xdd, 0, 0, 3) + if dat and len(dat) == 3: + a = struct.unpack("BBB", dat) + return (a[0], a[1], a[2]) + else: + return (0, 0, 0) + + def get_mcu_type(self) -> McuType: + hw_type = self.get_type() + if hw_type in Panda.F4_DEVICES: + return McuType.F4 + elif hw_type in Panda.H7_DEVICES: + return McuType.H7 + else: + if self._assume_f4_mcu: + return McuType.F4 + # C3 Lite (mr.one clone): panda has STM32F4 MCU (16-sector DFU layout = DOS board) + if hw_type == Panda.HW_TYPE_UNKNOWN and _is_lite_hw(): + return McuType.F4 + raise ValueError(f"unknown HW type: {hw_type}") + + def is_internal(self): + hw_type = self.get_type() + if hw_type in Panda.INTERNAL_DEVICES: + return True + if hw_type == Panda.HW_TYPE_UNKNOWN and _is_lite_hw(): + return True + return False + + def get_serial(self): + """ + Returns the comma-issued dongle ID from our provisioning + """ + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xd0, 0, 0, 0x20) + hashsig, calc_hash = dat[0x1c:], hashlib.sha1(dat[0:0x1c]).digest()[0:4] + assert(hashsig == calc_hash) + return [dat[0:0x10].decode("utf8"), dat[0x10:0x10 + 10].decode("utf8")] + + def get_usb_serial(self): + """ + Returns the serial number reported from the USB descriptor; + matches the MCU UID + """ + return self._serial + + def get_dfu_serial(self): + return PandaDFU.st_serial_to_dfu_serial(self._serial, self._mcu_type) + + def get_uid(self): + """ + Returns the UID from the MCU + """ + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xc3, 0, 0, 12) + return binascii.hexlify(dat).decode() + + def get_secret(self): + return self._handle.controlRead(Panda.REQUEST_IN, 0xd0, 1, 0, 0x10) + + def get_interrupt_call_rate(self, irqnum): + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xc4, int(irqnum), 0, 4) + return struct.unpack("I", dat)[0] + + # ******************* configuration ******************* + + def set_alternative_experience(self, alternative_experience, safety_param_iq=0): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xdf, int(alternative_experience), int(safety_param_iq), b'') + + def set_power_save(self, power_save_enabled=0): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe7, int(power_save_enabled), 0, b'') + + def set_safety_mode(self, mode=CarParams.SafetyModel.silent, param=0): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xdc, mode, param, b'') + + def set_obd(self, obd): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xdb, int(obd), 0, b'') + + def set_can_loopback(self, enable): + # set can loopback mode for all buses + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe5, int(enable), 0, b'') + + def set_can_enable(self, bus_num, enable): + # sets the can transceiver enable pin + self._handle.controlWrite(Panda.REQUEST_OUT, 0xf4, int(bus_num), int(enable), b'') + + def set_can_speed_kbps(self, bus, speed): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xde, bus, int(speed * 10), b'') + + def set_can_data_speed_kbps(self, bus, speed): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xf9, bus, int(speed * 10), b'') + + def set_canfd_non_iso(self, bus, non_iso): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xfc, bus, int(non_iso), b'') + + def set_canfd_auto(self, bus, auto): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe8, bus, int(auto), b'') + + def set_uart_baud(self, uart, rate): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe4, uart, int(rate / 300), b'') + + def set_uart_parity(self, uart, parity): + # parity, 0=off, 1=even, 2=odd + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe2, uart, parity, b'') + + def set_uart_callback(self, uart, install): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe3, uart, int(install), b'') + + # ******************* can ******************* + + # The panda will NAK CAN writes when there is CAN congestion. + # libusb will try to send it again, with a max timeout. + # Timeout is in ms. If set to 0, the timeout is infinite. + CAN_SEND_TIMEOUT_MS = 10 + + def can_reset_communications(self): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xc0, 0, 0, b'') + + @ensure_can_packet_version + def can_send_many(self, arr, *, fd=False, timeout=CAN_SEND_TIMEOUT_MS): + snds = pack_can_buffer(arr, chunk=(not self.spi), fd=fd) + for tx in snds: + while len(tx) > 0: + bs = self._handle.bulkWrite(3, tx, timeout=timeout) + tx = tx[bs:] + + def can_send(self, addr, dat, bus, *, fd=False, timeout=CAN_SEND_TIMEOUT_MS): + self.can_send_many([[addr, dat, bus]], fd=fd, timeout=timeout) + + @ensure_can_packet_version + def can_recv(self): + dat = bytearray() + while True: + try: + dat = self._handle.bulkRead(1, 16384) # Max receive batch size + 2 extra reserve frames + break + except (usb1.USBErrorIO, usb1.USBErrorOverflow): + logger.error("CAN: BAD RECV, RETRYING") + time.sleep(0.1) + msgs, self.can_rx_overflow_buffer = unpack_can_buffer(self.can_rx_overflow_buffer + dat) + return msgs + + def can_clear(self, bus): + """Clears all messages from the specified internal CAN ringbuffer as + though it were drained. + + Args: + bus (int): can bus number to clear a tx queue, or 0xFFFF to clear the + global can rx queue. + + """ + self._handle.controlWrite(Panda.REQUEST_OUT, 0xf1, bus, 0, b'') + + # ******************* serial ******************* + + def serial_read(self, port_number, maxlen=1024): + ret = b'' + while 1: + r = bytes(self._handle.controlRead(Panda.REQUEST_IN, 0xe0, port_number, 0, 0x40)) + if len(r) == 0 or len(ret) >= maxlen: + break + ret += r + return ret + + def serial_write(self, port_number, ln): + ret = 0 + if isinstance(ln, str): + ln = bytes(ln, 'utf-8') + for i in range(0, len(ln), 0x20): + ret += self._handle.bulkWrite(2, struct.pack("B", port_number) + ln[i:i + 0x20]) + return ret + + def send_heartbeat(self, engaged=True, engaged_aol=True): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xf3, engaged, engaged_aol, b'') + + # disable heartbeat checks for use outside of openpilot + # sending a heartbeat will reenable the checks + def set_heartbeat_disabled(self): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xf8, 0, 0, b'') + + # ****************** Timer ***************** + def get_microsecond_timer(self): + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xa8, 0, 0, 4) + return struct.unpack("I", dat)[0] + + # ******************* IR ******************* + def set_ir_power(self, percentage): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xb0, int(percentage), 0, b'') + + # ******************* Fan ****************** + def set_fan_power(self, percentage): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xb1, int(percentage), 0, b'') + + def get_fan_rpm(self): + dat = self._handle.controlRead(Panda.REQUEST_IN, 0xb2, 0, 0, 2) + a = struct.unpack("H", dat) + return a[0] + + # ****************** Siren ***************** + def set_siren(self, enabled): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xf6, int(enabled), 0, b'') + + # ****************** Debug ***************** + + # arr: timer period + # ccrN: channel N pulse length + def set_clock_source_timer_params(self, arr, ccr1, ccr2, ccr3): + param1 = ((ccr1 & 0xFF) << 8) | (ccr2 & 0xFF) + param2 = ((ccr3 & 0xFF) << 8) | (arr & 0xFF) + self._handle.controlWrite(Panda.REQUEST_OUT, 0xe6, param1, param2, b'') + + def force_relay_drive(self, intercept_relay_drive, ignition_relay_drive): + self._handle.controlWrite(Panda.REQUEST_OUT, 0xc5, (int(intercept_relay_drive) | int(ignition_relay_drive) << 1), 0, b'') + + def read_som_gpio(self) -> bool: + r = self._handle.controlRead(Panda.REQUEST_IN, 0xc6, 0, 0, 1) + return r[0] == 1 diff --git a/artifacts/package_runtime/panda/python/base.py b/artifacts/package_runtime/panda/python/base.py new file mode 100644 index 000000000..ffe9353d6 --- /dev/null +++ b/artifacts/package_runtime/panda/python/base.py @@ -0,0 +1,61 @@ +from abc import ABC, abstractmethod + +from .constants import McuType + +TIMEOUT = int(15 * 1e3) # default timeout, in milliseconds + +class BaseHandle(ABC): + """ + A handle to talk to a panda. + Borrows heavily from the libusb1 handle API. + """ + + @abstractmethod + def close(self) -> None: + ... + + @abstractmethod + def controlWrite(self, request_type: int, request: int, value: int, index: int, data, timeout: int = TIMEOUT, expect_disconnect: bool = False): + ... + + @abstractmethod + def controlRead(self, request_type: int, request: int, value: int, index: int, length: int, timeout: int = TIMEOUT) -> bytes: + ... + + @abstractmethod + def bulkWrite(self, endpoint: int, data: bytes, timeout: int = TIMEOUT) -> int: + ... + + @abstractmethod + def bulkRead(self, endpoint: int, length: int, timeout: int = TIMEOUT) -> bytes: + ... + + +class BaseSTBootloaderHandle(ABC): + """ + A handle to talk to a panda while it's in the STM32 bootloader. + """ + + @abstractmethod + def get_mcu_type(self) -> McuType: + ... + + @abstractmethod + def close(self) -> None: + ... + + @abstractmethod + def clear_status(self) -> None: + ... + + @abstractmethod + def program(self, address: int, dat: bytes) -> None: + ... + + @abstractmethod + def erase_sector(self, sector: int) -> None: + ... + + @abstractmethod + def jump(self, address: int) -> None: + ... diff --git a/artifacts/package_runtime/panda/python/constants.py b/artifacts/package_runtime/panda/python/constants.py new file mode 100644 index 000000000..cc5d231b9 --- /dev/null +++ b/artifacts/package_runtime/panda/python/constants.py @@ -0,0 +1,68 @@ +import os +import enum +from typing import NamedTuple + +BASEDIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../") +INCLUDE_PATH = os.path.abspath(os.path.join(BASEDIR, "..")) +FW_PATH = os.path.join(BASEDIR, "board/obj/") + +USBPACKET_MAX_SIZE = 0x40 + +class McuConfig(NamedTuple): + mcu: str + mcu_idcode: int + sector_sizes: list[int] + sector_count: int # total sector count, used for MCU identification in DFU mode + uid_address: int + block_size: int + serial_number_address: int + app_address: int + app_fn: str + bootstub_address: int + bootstub_fn: str + + def sector_address(self, i): + # assume bootstub is in sector 0 + return self.bootstub_address + sum(self.sector_sizes[:i]) + + +F4Config = McuConfig( + "STM32F4", + 0x463, + [0x4000 for _ in range(4)] + [0x10000] + [0x20000 for _ in range(11)], + 16, + 0x1FFF7A10, + 0x800, + 0x1FFF79C0, + 0x8004000, + "panda.bin.signed", + 0x8000000, + "bootstub.panda.bin", +) + + +H7Config = McuConfig( + "STM32H7", + 0x483, + [0x20000 for _ in range(7)], + 8, + 0x1FF1E800, + 0x400, + # there is an 8th sector, but we use that for the provisioning chunk, so don't program over that! + 0x080FFFC0, + 0x8020000, + "panda_h7.bin.signed", + 0x8000000, + "bootstub.panda_h7.bin", +) + +@enum.unique +class McuType(enum.Enum): + F4 = F4Config + H7 = H7Config + + @property + def config(self): + return self.value + +MCU_TYPE_BY_IDCODE = {m.config.mcu_idcode: m for m in McuType} diff --git a/artifacts/package_runtime/panda/python/dfu.py b/artifacts/package_runtime/panda/python/dfu.py new file mode 100644 index 000000000..624530cb2 --- /dev/null +++ b/artifacts/package_runtime/panda/python/dfu.py @@ -0,0 +1,137 @@ +import os +import usb1 +import struct +import binascii + +from .base import BaseSTBootloaderHandle +from .spi import STBootloaderSPIHandle, PandaSpiException +from .usb import STBootloaderUSBHandle +from .constants import FW_PATH, McuType + + +class PandaDFU: + def __init__(self, dfu_serial: str | None): + # try USB, then SPI + handle: BaseSTBootloaderHandle | None + self._context, handle = PandaDFU.usb_connect(dfu_serial) + if handle is None: + self._context, handle = PandaDFU.spi_connect(dfu_serial) + + if handle is None: + raise Exception(f"failed to open DFU device {dfu_serial}") + + self._handle: BaseSTBootloaderHandle = handle + self._mcu_type: McuType = self._handle.get_mcu_type() + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def close(self): + if self._handle is not None: + self._handle.close() + self._handle = None + if self._context is not None: + self._context.close() + + @staticmethod + def usb_connect(dfu_serial: str | None): + handle = None + context = usb1.USBContext() + context.open() + for device in context.getDeviceList(skip_on_error=True): + if device.getVendorID() == 0x0483 and device.getProductID() == 0xdf11: + try: + this_dfu_serial = device.open().getASCIIStringDescriptor(3) + except Exception: + continue + + if this_dfu_serial == dfu_serial or dfu_serial is None: + handle = STBootloaderUSBHandle(device, device.open()) + break + + return context, handle + + @staticmethod + def spi_connect(dfu_serial: str | None): + handle = None + this_dfu_serial = None + + try: + handle = STBootloaderSPIHandle() + this_dfu_serial = PandaDFU.st_serial_to_dfu_serial(handle.get_uid(), handle.get_mcu_type()) + except PandaSpiException: + handle = None + + if dfu_serial is not None and dfu_serial != this_dfu_serial: + handle = None + + return None, handle + + @staticmethod + def usb_list() -> list[str]: + dfu_serials = [] + try: + with usb1.USBContext() as context: + for device in context.getDeviceList(skip_on_error=True): + if device.getVendorID() == 0x0483 and device.getProductID() == 0xdf11: + try: + dfu_serials.append(device.open().getASCIIStringDescriptor(3)) + except Exception: + pass + except Exception: + pass + return dfu_serials + + @staticmethod + def spi_list() -> list[str]: + try: + _, h = PandaDFU.spi_connect(None) + if h is not None: + dfu_serial = PandaDFU.st_serial_to_dfu_serial(h.get_uid(), h.get_mcu_type()) + return [dfu_serial, ] + except PandaSpiException: + pass + return [] + + @staticmethod + def st_serial_to_dfu_serial(st: str, mcu_type: McuType = McuType.H7): + if st is None or st == "none": + return None + try: + uid_base = struct.unpack("H" * 6, bytes.fromhex(st)) + if mcu_type == McuType.H7: + return binascii.hexlify(struct.pack("!HHH", uid_base[1] + uid_base[5], uid_base[0] + uid_base[4], uid_base[3])).upper().decode("utf-8") + except struct.error: + return None + + def get_mcu_type(self) -> McuType: + return self._mcu_type + + def reset(self): + self._handle.jump(self._mcu_type.config.bootstub_address) + + def program_bootstub(self, code_bootstub): + self._handle.clear_status() + + # erase bootstub + app sectors + for i in (0, 1): + self._handle.erase_sector(i) + + # write bootstub + self._handle.program(self._mcu_type.config.bootstub_address, code_bootstub) + + def recover(self): + fn = os.path.join(FW_PATH, self._mcu_type.config.bootstub_fn) + with open(fn, "rb") as f: + code = f.read() + self.program_bootstub(code) + self.reset() + + @staticmethod + def list() -> list[str]: + ret = PandaDFU.usb_list() + ret += PandaDFU.spi_list() + return list(set(ret)) diff --git a/artifacts/package_runtime/panda/python/serial.py b/artifacts/package_runtime/panda/python/serial.py new file mode 100644 index 000000000..c2e965b76 --- /dev/null +++ b/artifacts/package_runtime/panda/python/serial.py @@ -0,0 +1,35 @@ +# mimic a python serial port +class PandaSerial: + def __init__(self, panda, port, baud): + self.panda = panda + self.port = port + self.panda.set_uart_parity(self.port, 0) + self._baudrate = baud + self.panda.set_uart_baud(self.port, baud) + self.buf = b"" + + def read(self, l=1): + tt = self.panda.serial_read(self.port) + if len(tt) > 0: + self.buf += tt + ret = self.buf[0:l] + self.buf = self.buf[l:] + return ret + + def write(self, dat): + return self.panda.serial_write(self.port, dat) + + def close(self): + pass + + def flush(self): + pass + + @property + def baudrate(self): + return self._baudrate + + @baudrate.setter + def baudrate(self, value): + self.panda.set_uart_baud(self.port, value) + self._baudrate = value diff --git a/artifacts/package_runtime/panda/python/socketpanda.py b/artifacts/package_runtime/panda/python/socketpanda.py new file mode 100644 index 000000000..464ea8ecc --- /dev/null +++ b/artifacts/package_runtime/panda/python/socketpanda.py @@ -0,0 +1,123 @@ +import socket +import struct +import time + +# /** +# * struct canfd_frame - CAN flexible data rate frame structure +# * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition +# * @len: frame payload length in byte (0 .. CANFD_MAX_DLEN) +# * @flags: additional flags for CAN FD +# * @__res0: reserved / padding +# * @__res1: reserved / padding +# * @data: CAN FD frame payload (up to CANFD_MAX_DLEN byte) +# */ +# struct canfd_frame { +# canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ +# __u8 len; /* frame payload length in byte */ +# __u8 flags; /* additional flags for CAN FD */ +# __u8 __res0; /* reserved / padding */ +# __u8 __res1; /* reserved / padding */ +# __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); +# }; +CAN_HEADER_FMT = "=IBB2x" +CAN_HEADER_LEN = struct.calcsize(CAN_HEADER_FMT) +CAN_MAX_DLEN = 8 +CANFD_MAX_DLEN = 64 + +CAN_CONFIRM_FLAG = 0x800 +CAN_EFF_FLAG = 0x80000000 + +CANFD_BRS = 0x01 # bit rate switch (second bitrate for payload data) +CANFD_FDF = 0x04 # mark CAN FD for dual use of struct canfd_frame + +# socket.SO_RXQ_OVFL is missing +# https://github.com/torvalds/linux/blob/47ac09b91befbb6a235ab620c32af719f8208399/include/uapi/asm-generic/socket.h#L61 +SO_RXQ_OVFL = 40 + +import typing +@typing.no_type_check # mypy struggles with macOS here... +def create_socketcan(interface:str, recv_buffer_size:int) -> socket.socket: + # settings mostly from https://github.com/linux-can/can-utils/blob/master/candump.c + socketcan = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW) + socketcan.setblocking(False) + socketcan.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FD_FRAMES, 1) + socketcan.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_RECV_OWN_MSGS, 1) + socketcan.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, recv_buffer_size) + # TODO: why is it always 2x the requested size? + assert socketcan.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) == recv_buffer_size * 2 + # TODO: how to dectect and alert on buffer overflow? + socketcan.setsockopt(socket.SOL_SOCKET, SO_RXQ_OVFL, 1) + socketcan.bind((interface,)) + return socketcan + +# Panda class substitute for socketcan device (to support using the uds/iso-tp/xcp/ccp library) +class SocketPanda(): + def __init__(self, interface:str="can0", recv_buffer_size:int=212992) -> None: + self.interface = interface + self.recv_buffer_size = recv_buffer_size + self.socket = create_socketcan(interface, recv_buffer_size) + + def __del__(self): + self.socket.close() + + def get_serial(self) -> tuple[int, int]: + return (0, 0) + + def get_version(self) -> int: + return 0 + + def can_clear(self, bus:int) -> None: + self.socket.close() + self.socket = create_socketcan(self.interface, self.recv_buffer_size) + + def set_safety_mode(self, mode:int, param=0) -> None: + pass + + def can_send_many(self, arr, *, fd=False, timeout=0) -> None: + for msg in arr: + self.can_send(*msg, fd=fd, timeout=timeout) + + def can_send(self, addr, dat, bus, *, fd=False, timeout=0) -> None: + # Even if the CANFD_FDF flag is not set, the data still must be 8 bytes for classic CAN frames. + data_len = CANFD_MAX_DLEN if fd else CAN_MAX_DLEN + msg_len = len(dat) + msg_dat = dat.ljust(data_len, b'\x00') + + # Set extended ID flag + if addr > 0x7ff: + addr |= CAN_EFF_FLAG + + # Set FD flags + flags = CANFD_BRS | CANFD_FDF if fd else 0 + + can_frame = struct.pack(CAN_HEADER_FMT, addr, msg_len, flags) + msg_dat + + # Try to send until timeout. sendto might block if the TX buffer is full. + # TX buffer size can also be adjusted through `ip link set can0 txqueuelen ` if needed + start_t = time.monotonic() + while (time.monotonic() - start_t < (timeout / 1000)) or (timeout == 0): + try: + self.socket.sendto(can_frame, (self.interface,)) + break + except (BlockingIOError, OSError): + continue + else: + raise TimeoutError + + + def can_recv(self) -> list[tuple[int, bytes, int]]: + msgs = list() + while True: + try: + dat, _, msg_flags, _ = self.socket.recvmsg(self.recv_buffer_size) + assert len(dat) >= CAN_HEADER_LEN, f"ERROR: received {len(dat)} bytes" + + can_id, msg_len, _ = struct.unpack(CAN_HEADER_FMT, dat[:CAN_HEADER_LEN]) + assert len(dat) >= CAN_HEADER_LEN + msg_len, f"ERROR: received {len(dat)} bytes, expected at least {CAN_HEADER_LEN + msg_len} bytes" + + msg_dat = dat[CAN_HEADER_LEN:CAN_HEADER_LEN+msg_len] + bus = 128 if (msg_flags & CAN_CONFIRM_FLAG) else 0 + msgs.append((can_id, msg_dat, bus)) + except BlockingIOError: + break # buffered data exhausted + return msgs diff --git a/artifacts/package_runtime/panda/python/spi.py b/artifacts/package_runtime/panda/python/spi.py new file mode 100644 index 000000000..4275017ed --- /dev/null +++ b/artifacts/package_runtime/panda/python/spi.py @@ -0,0 +1,417 @@ +import binascii +import os +import fcntl +import math +import time +import struct +import threading +from contextlib import contextmanager +from functools import reduce + +from .base import BaseHandle, BaseSTBootloaderHandle, TIMEOUT +from .constants import McuType, MCU_TYPE_BY_IDCODE, USBPACKET_MAX_SIZE +from .utils import logger + +try: + import spidev +except ImportError: + spidev = None + +# Constants +SYNC = 0x5A +HACK = 0x79 +DACK = 0x85 +NACK = 0x1F +CHECKSUM_START = 0xAB + +MIN_ACK_TIMEOUT_MS = 100 +MAX_XFER_RETRY_COUNT = 5 + +SPI_BUF_SIZE = 4096 # from panda/board/drivers/spi.h +XFER_SIZE = SPI_BUF_SIZE - 0x40 # give some room for SPI protocol overhead + +DEV_PATH = "/dev/spidev0.0" + + +def crc8(data): + crc = 0xFF # standard init value + poly = 0xD5 # standard crc8: x8+x7+x6+x4+x2+1 + size = len(data) + for i in range(size - 1, -1, -1): + crc ^= data[i] + for _ in range(8): + if ((crc & 0x80) != 0): + crc = ((crc << 1) ^ poly) & 0xFF + else: + crc <<= 1 + return crc + + +class PandaSpiException(Exception): + pass + +class PandaProtocolMismatch(PandaSpiException): + pass + +class PandaSpiUnavailable(PandaSpiException): + pass + +class PandaSpiNackResponse(PandaSpiException): + pass + +class PandaSpiMissingAck(PandaSpiException): + pass + +class PandaSpiBadChecksum(PandaSpiException): + pass + +class PandaSpiTransferFailed(PandaSpiException): + pass + + +SPI_LOCK = threading.Lock() +SPI_DEVICES = {} +class SpiDevice: + """ + Provides locked, thread-safe access to a panda's SPI interface. + """ + + MAX_SPEED = 50000000 # max of the SDM845 + + def __init__(self, speed=MAX_SPEED): + assert speed <= self.MAX_SPEED + + if not os.path.exists(DEV_PATH): + raise PandaSpiUnavailable(f"SPI device not found: {DEV_PATH}") + if spidev is None: + raise PandaSpiUnavailable("spidev is not installed") + + with SPI_LOCK: + if speed not in SPI_DEVICES: + SPI_DEVICES[speed] = spidev.SpiDev() + SPI_DEVICES[speed].open(0, 0) + SPI_DEVICES[speed].max_speed_hz = speed + self._spidev = SPI_DEVICES[speed] + + @contextmanager + def acquire(self): + try: + SPI_LOCK.acquire() + fcntl.flock(self._spidev, fcntl.LOCK_EX) + yield self._spidev + finally: + fcntl.flock(self._spidev, fcntl.LOCK_UN) + SPI_LOCK.release() + + def close(self): + pass + + +class PandaSpiHandle(BaseHandle): + """ + A class that mimics a libusb1 handle for panda SPI communications. + """ + + PROTOCOL_VERSION = 2 + HEADER = struct.Struct(" None: + self.dev = SpiDevice() + self.no_retry = "NO_RETRY" in os.environ + + # helpers + def _calc_checksum(self, data: bytes) -> int: + cksum = CHECKSUM_START + for b in data: + cksum ^= b + return cksum + + def _wait_for_ack(self, spi, ack_val: int, timeout: int, tx: int, length: int = 1) -> bytes: + timeout_s = max(MIN_ACK_TIMEOUT_MS, timeout) * 1e-3 + + start = time.monotonic() + while (timeout == 0) or ((time.monotonic() - start) < timeout_s): + dat = spi.xfer2([tx, ] * length) + if dat[0] == ack_val: + return bytes(dat) + elif dat[0] == NACK: + raise PandaSpiNackResponse + + raise PandaSpiMissingAck + + def _transfer_spidev(self, spi, endpoint: int, data, timeout: int, max_rx_len: int = 1000, expect_disconnect: bool = False) -> bytes: + max_rx_len = max(USBPACKET_MAX_SIZE, max_rx_len) + + logger.debug("- send header") + packet = self.HEADER.pack(SYNC, endpoint, len(data), max_rx_len) + packet += bytes([self._calc_checksum(packet), ]) + spi.xfer2(packet) + + logger.debug("- waiting for header ACK") + self._wait_for_ack(spi, HACK, MIN_ACK_TIMEOUT_MS, 0x11) + + logger.debug("- sending data") + packet = bytes([*data, self._calc_checksum(data)]) + spi.xfer2(packet) + + if expect_disconnect: + logger.debug("- expecting disconnect, returning") + return b"" + else: + logger.debug("- waiting for data ACK") + preread_len = USBPACKET_MAX_SIZE + 1 # read enough for a controlRead + dat = self._wait_for_ack(spi, DACK, timeout, 0x13, length=3 + preread_len) + + # get response length, then response + response_len = struct.unpack(" max_rx_len: + raise PandaSpiException(f"response length greater than max ({max_rx_len} {response_len})") + + # read rest + remaining = (response_len + 1) - preread_len + if remaining > 0: + dat += bytes(spi.readbytes(remaining)) + + dat = dat[:3 + response_len + 1] + if self._calc_checksum(dat) != 0: + raise PandaSpiBadChecksum + + return dat[3:-1] + + def _transfer(self, endpoint: int, data, timeout: int, max_rx_len: int = 1000, expect_disconnect: bool = False) -> bytes: + logger.debug("starting transfer: endpoint=%d, max_rx_len=%d", endpoint, max_rx_len) + logger.debug("==============================================") + + n = 0 + start_time = time.monotonic() + exc = PandaSpiException() + while (timeout == 0) or (time.monotonic() - start_time) < timeout*1e-3: + n += 1 + logger.debug("\ntry #%d", n) + with self.dev.acquire() as spi: + try: + return self._transfer_spidev(spi, endpoint, data, timeout, max_rx_len, expect_disconnect) + except PandaSpiException as e: + exc = e + logger.debug("SPI transfer failed, retrying", exc_info=True) + if self.no_retry: + break + + # ensure slave is in a consistent state and ready for the next transfer + # (e.g. slave TX buffer isn't stuck full) + nack_cnt = 0 + attempts = 5 + while (nack_cnt <= 3) and (attempts > 0): + attempts -= 1 + try: + self._wait_for_ack(spi, NACK, MIN_ACK_TIMEOUT_MS, 0x11, length=XFER_SIZE//2) + nack_cnt += 1 + except PandaSpiException: + nack_cnt = 0 + + raise exc + + def get_protocol_version(self) -> bytes: + vers_str = b"VERSION" + def _get_version(spi) -> bytes: + spi.writebytes(vers_str) + + logger.debug("- waiting for echo") + start = time.monotonic() + while True: + version_bytes = spi.readbytes(len(vers_str) + 2) + if bytes(version_bytes).startswith(vers_str): + break + if (time.monotonic() - start) > 0.001: + raise PandaSpiMissingAck + + rlen = struct.unpack(" 1000: + raise PandaSpiException("response length greater than max") + + # get response + dat = spi.readbytes(rlen + 1) + resp = dat[:-1] + calculated_crc = crc8(bytes(version_bytes + resp)) + if calculated_crc != dat[-1]: + raise PandaSpiBadChecksum + return bytes(resp) + + exc = PandaSpiException() + with self.dev.acquire() as spi: + for _ in range(10): + try: + return _get_version(spi) + except PandaSpiException as e: + exc = e + logger.debug("SPI get protocol version failed, retrying", exc_info=True) + raise exc + + # libusb1 functions + def close(self): + self.dev.close() + + def controlWrite(self, request_type: int, request: int, value: int, index: int, data, timeout: int = TIMEOUT, expect_disconnect: bool = False): + return self._transfer(0, struct.pack(" int: + mv = memoryview(data) + for x in range(math.ceil(len(data) / XFER_SIZE)): + self._transfer(endpoint, mv[XFER_SIZE*x:XFER_SIZE*(x+1)], timeout) + return len(data) + + def bulkRead(self, endpoint: int, length: int, timeout: int = TIMEOUT) -> bytes: + ret = b"" + for _ in range(math.ceil(length / XFER_SIZE)): + d = self._transfer(endpoint, [], timeout, max_rx_len=XFER_SIZE) + ret += d + if len(d) < XFER_SIZE: + break + return ret + + +class STBootloaderSPIHandle(BaseSTBootloaderHandle): + """ + Implementation of the STM32 SPI bootloader protocol described in: + https://www.st.com/resource/en/application_note/an4286-spi-protocol-used-in-the-stm32-bootloader-stmicroelectronics.pdf + + NOTE: the bootloader's state machine is fragile and immediately gets into a bad state when + sending any junk, e.g. when using the panda SPI protocol. + """ + + SYNC = 0x5A + ACK = 0x79 + NACK = 0x1F + + def __init__(self): + self.dev = SpiDevice(speed=1000000) + + # say hello + try: + with self.dev.acquire() as spi: + spi.xfer([self.SYNC, ]) + try: + self._get_ack(spi, 0.1) + except (PandaSpiNackResponse, PandaSpiMissingAck): + # NACK ok here, will only ACK the first time + pass + + self._mcu_type = MCU_TYPE_BY_IDCODE[self.get_chip_id()] + except PandaSpiException: + raise PandaSpiException("failed to connect to panda") from None + + def _get_ack(self, spi, timeout=1.0): + data = 0x00 + start_time = time.monotonic() + while data not in (self.ACK, self.NACK) and (time.monotonic() - start_time < timeout): + data = spi.xfer([0x00, ])[0] + time.sleep(0) + spi.xfer([self.ACK, ]) + + if data == self.NACK: + raise PandaSpiNackResponse + elif data != self.ACK: + raise PandaSpiMissingAck + + def _cmd_no_retry(self, cmd: int, data: list[bytes] | None = None, read_bytes: int = 0, predata=None) -> bytes: + ret = b"" + with self.dev.acquire() as spi: + # sync + command + spi.xfer([self.SYNC, ]) + spi.xfer([cmd, cmd ^ 0xFF]) + self._get_ack(spi, timeout=0.01) + + # "predata" - for commands that send the first data without a checksum + if predata is not None: + spi.xfer(predata) + self._get_ack(spi) + + # send data + if data is not None: + for d in data: + if predata is not None: + spi.xfer(d + self._checksum(predata + d)) + else: + spi.xfer(d + self._checksum(d)) + self._get_ack(spi, timeout=20) + + # receive + if read_bytes > 0: + ret = spi.xfer([0x00, ]*(read_bytes + 1))[1:] + if data is None or len(data) == 0: + self._get_ack(spi) + + return bytes(ret) + + def _cmd(self, cmd: int, data: list[bytes] | None = None, read_bytes: int = 0, predata=None) -> bytes: + exc = PandaSpiException() + for n in range(MAX_XFER_RETRY_COUNT): + try: + return self._cmd_no_retry(cmd, data, read_bytes, predata) + except PandaSpiException as e: + exc = e + logger.debug("SPI transfer failed, %d retries left", MAX_XFER_RETRY_COUNT - n - 1, exc_info=True) + raise exc + + def _checksum(self, data: bytes) -> bytes: + if len(data) == 1: + ret = data[0] ^ 0xFF + else: + ret = reduce(lambda a, b: a ^ b, data) + return bytes([ret, ]) + + # *** Bootloader commands *** + + def read(self, address: int, length: int): + data = [struct.pack('>I', address), struct.pack('B', length - 1)] + return self._cmd(0x11, data=data, read_bytes=length) + + def get_bootloader_id(self): + return self.read(0x1FF1E7FE, 1) + + def get_chip_id(self) -> int: + r = self._cmd(0x02, read_bytes=3) + if r[0] != 1: # response length - 1 + raise PandaSpiException("incorrect response length") + return ((r[1] << 8) + r[2]) + + def go_cmd(self, address: int) -> None: + self._cmd(0x21, data=[struct.pack('>I', address), ]) + + # *** helpers *** + + def get_uid(self): + dat = self.read(McuType.H7.config.uid_address, 12) + return binascii.hexlify(dat).decode() + + def erase_sector(self, sector: int): + p = struct.pack('>H', 0) # number of sectors to erase + d = struct.pack('>H', sector) + self._cmd(0x44, data=[d, ], predata=p) + + # *** PandaDFU API *** + + def get_mcu_type(self): + return self._mcu_type + + def clear_status(self): + pass + + def close(self): + self.dev.close() + + def program(self, address, dat): + bs = 256 # max block size for writing to flash over SPI + dat += b"\xFF" * ((bs - len(dat)) % bs) + for i in range(len(dat) // bs): + block = dat[i * bs:(i + 1) * bs] + self._cmd(0x31, data=[ + struct.pack('>I', address + i*bs), + bytes([len(block) - 1]) + block, + ]) + + def jump(self, address): + self.go_cmd(self._mcu_type.config.bootstub_address) diff --git a/artifacts/package_runtime/panda/python/usb.py b/artifacts/package_runtime/panda/python/usb.py new file mode 100644 index 000000000..0a012896b --- /dev/null +++ b/artifacts/package_runtime/panda/python/usb.py @@ -0,0 +1,98 @@ +import struct + +from .base import BaseHandle, BaseSTBootloaderHandle, TIMEOUT +from .constants import McuType + +class PandaUsbHandle(BaseHandle): + def __init__(self, libusb_handle): + self._libusb_handle = libusb_handle + + def close(self): + self._libusb_handle.close() + + def controlWrite(self, request_type: int, request: int, value: int, index: int, data, timeout: int = TIMEOUT, expect_disconnect: bool = False): + return self._libusb_handle.controlWrite(request_type, request, value, index, data, timeout) + + def controlRead(self, request_type: int, request: int, value: int, index: int, length: int, timeout: int = TIMEOUT): + return self._libusb_handle.controlRead(request_type, request, value, index, length, timeout) + + def bulkWrite(self, endpoint: int, data: bytes, timeout: int = TIMEOUT) -> int: + return self._libusb_handle.bulkWrite(endpoint, data, timeout) # type: ignore + + def bulkRead(self, endpoint: int, length: int, timeout: int = TIMEOUT) -> bytes: + return self._libusb_handle.bulkRead(endpoint, length, timeout) # type: ignore + + + +class STBootloaderUSBHandle(BaseSTBootloaderHandle): + DFU_DNLOAD = 1 + DFU_UPLOAD = 2 + DFU_GETSTATUS = 3 + DFU_CLRSTATUS = 4 + DFU_ABORT = 6 + + def __init__(self, libusb_device, libusb_handle): + self._libusb_handle = libusb_handle + + # example from F4: lsusb -v | grep Flash + # iInterface 4 @Internal Flash /0x08000000/04*016Kg,01*064Kg,011*128Kg + for i in range(20): + desc = libusb_handle.getStringDescriptor(i, 0) + if desc is not None and desc.startswith("@Internal Flash"): + sector_count = sum([int(s.split('*')[0]) for s in desc.split('/')[-1].split(',')]) + break + mcu_by_sector_count = {m.config.sector_count: m for m in McuType} + assert sector_count in mcu_by_sector_count, f"Unkown MCU: {sector_count=}" + self._mcu_type = mcu_by_sector_count[sector_count] + + def _status(self) -> None: + while 1: + dat = self._libusb_handle.controlRead(0x21, self.DFU_GETSTATUS, 0, 0, 6) + if dat[1] == 0: + break + + def _erase_page_address(self, address: int) -> None: + self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 0, 0, b"\x41" + struct.pack("I", address)) + self._status() + + def get_mcu_type(self): + return self._mcu_type + + def erase_sector(self, sector: int): + self._erase_page_address(self._mcu_type.config.sector_address(sector)) + + def clear_status(self): + # Clear status + stat = self._libusb_handle.controlRead(0x21, self.DFU_GETSTATUS, 0, 0, 6) + if stat[4] == 0xa: + self._libusb_handle.controlRead(0x21, self.DFU_CLRSTATUS, 0, 0, 0) + elif stat[4] == 0x9: + self._libusb_handle.controlWrite(0x21, self.DFU_ABORT, 0, 0, b"") + self._status() + stat = str(self._libusb_handle.controlRead(0x21, self.DFU_GETSTATUS, 0, 0, 6)) + + def close(self): + self._libusb_handle.close() + + def program(self, address, dat): + # Set Address Pointer + self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 0, 0, b"\x21" + struct.pack("I", address)) + self._status() + + # Program + bs = min(len(dat), self._mcu_type.config.block_size) + dat += b"\xFF" * ((bs - len(dat)) % bs) + for i in range(len(dat) // bs): + ldat = dat[i * bs:(i + 1) * bs] + print("programming %d with length %d" % (i, len(ldat))) + self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 2 + i, 0, ldat) + self._status() + + def jump(self, address): + self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 0, 0, b"\x21" + struct.pack("I", address)) + self._status() + try: + self._libusb_handle.controlWrite(0x21, self.DFU_DNLOAD, 2, 0, b"") + _ = str(self._libusb_handle.controlRead(0x21, self.DFU_GETSTATUS, 0, 0, 6)) + except Exception: + pass diff --git a/artifacts/package_runtime/panda/python/utils.py b/artifacts/package_runtime/panda/python/utils.py new file mode 100644 index 000000000..55181e08b --- /dev/null +++ b/artifacts/package_runtime/panda/python/utils.py @@ -0,0 +1,11 @@ +import os +import logging + +# set up logging +LOGLEVEL = os.environ.get('LOGLEVEL', 'INFO').upper() +logger = logging.getLogger('panda') +logger.setLevel(LOGLEVEL) + +handler = logging.StreamHandler() +handler.setFormatter(logging.Formatter('%(message)s')) +logger.addHandler(handler) diff --git a/artifacts/package_runtime/tinygrad/__init__.py b/artifacts/package_runtime/tinygrad/__init__.py new file mode 100644 index 000000000..9af09ab30 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/__init__.py @@ -0,0 +1,12 @@ +import os +if int(os.getenv("TYPED", "0")): + from typeguard import install_import_hook + install_import_hook(__name__) +from tinygrad.tensor import Tensor # noqa: F401 +from tinygrad.engine.jit import TinyJit # noqa: F401 +from tinygrad.function import function # noqa: F401 +from tinygrad.uop.ops import UOp +Variable = UOp.variable +from tinygrad.dtype import dtypes # noqa: F401 +from tinygrad.helpers import GlobalCounters, fetch, Context, getenv # noqa: F401 +from tinygrad.device import Device # noqa: F401 diff --git a/artifacts/package_runtime/tinygrad/codegen/__init__.py b/artifacts/package_runtime/tinygrad/codegen/__init__.py new file mode 100644 index 000000000..e50a8ce3a --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/__init__.py @@ -0,0 +1,487 @@ +from dataclasses import replace, dataclass +import itertools, functools +from tinygrad.helpers import DISABLE_FAST_IDIV, TRANSCENDENTAL, SPEC, DEBUG, VIZ, IMAGE, NOOPT, EMULATED_DTYPES, NOLOCALS, USE_TC +from tinygrad.helpers import ALLOW_TF32, DEFAULT_FLOAT, DEFAULT_INT, TracingKey, Context, panic +from tinygrad.uop.ops import PatternMatcher, graph_rewrite, UOp, Ops, UPat, rewrite_group, KernelInfo, ProgramInfo, GroupOp, AxisType +from tinygrad.uop.weak import pm_lower_index_dtype, pm_commit_weak, pm_cast_weak +from tinygrad.uop.render import pyrender +from tinygrad.uop.spec import type_verify, spec_tensor, spec_program +from tinygrad.renderer import Renderer, Estimates +from tinygrad.renderer.isa import ISARenderer, IselContext, PreRegAllocContext +from tinygrad.dtype import dtypes, AddrSpace + +# import all pattern matchers here +from tinygrad.codegen.gpudims import pm_add_gpudims +from tinygrad.uop.symbolic import sym, symbolic_simple, symbolic, pm_fold_cast_const, pm_move_where_on_load, pm_clean_up_group_sink, pm_remove_invalid +from tinygrad.uop.movement import mop_cleanup +from tinygrad.codegen.decomp.dtype import pm_dtype_decomps +from tinygrad.codegen.decomp.op import get_late_rewrite_patterns, get_simplifying_rewrite_patterns +from tinygrad.codegen.decomp.transcendental import get_transcendental_patterns +from tinygrad.codegen.late.coalesce import indexing_simplify +from tinygrad.codegen.opt.postrange import apply_opts +from tinygrad.codegen.late.gater import pm_move_gates_from_index +from tinygrad.codegen.simplify import pm_simplify_ranges, pm_flatten_range, pm_split_ranges, pm_load_collapse, pm_reduce_unparented +from tinygrad.schedule.multi import multi_pm +from tinygrad.schedule.rangeify import pm_mops +from tinygrad.codegen.late.linearizer import CFGContext, pm_split_ends, pm_add_control_flow, linearize +from tinygrad.codegen.late.regalloc import LinearScanRegallocContext, pm_regalloc_rewrite +from tinygrad.codegen.late.coalesce import memory_coalescing, pm_simplify_add_image +from tinygrad.helpers import all_same, flatten, argsort, partition +from tinygrad.uop.ops import _broadcast_shape, identity_element +from tinygrad.schedule.rangeify import BufferizeOpts + +def do_number_param(ctx:list[int], x:UOp): + if x.arg.slot != -1: return None + ctx[0] += 1 + return x.replace(arg=replace(x.arg, slot=ctx[0]-1)) + +pm_number_params = PatternMatcher([ + (UPat(Ops.PARAM, name="x"), do_number_param), +]) + +def build_range_map(sink:UOp) -> dict[int, int]: + ctx: dict[int, int] = {} + for x in sink.toposort(): + if x.op is Ops.RANGE and x.arg[1] in {AxisType.UNROLL, AxisType.UPCAST}: + ctx[x.arg[0]] = len(ctx) + return ctx + +def expand_reduce(r:UOp): + range_srcs = [] + new_axes = [] + for u in r.src[1:]: + if u.op == Ops.RANGE: + range_srcs.append(u) + else: + for i,s in enumerate(u.shape): + if s > 1: new_axes.append(i) + if len(new_axes) == 0: return None + assert r.arg[1] == 0 + # permute so new_axes come to front, then reduce + perm = tuple(new_axes) + tuple(i for i in range(len(r.src[0].shape)) if i not in new_axes) + out_shape = tuple([1 if i in new_axes else s for i,s in enumerate(r.src[0].shape)]) + return r.src[0].permute(perm).reduce(*range_srcs, arg=(r.arg[0], len(new_axes))).reshape(out_shape) + +def contract_axis(ctx:dict[int, int], u:UOp, arg): + permute_tail = [ctx[rn] for rn,_ in arg] + permute_head = [i for i in range(len(u.shape)) if i not in permute_tail] + out = u.permute(permute_head+permute_tail) + return out.reshape(*out.shape[:len(permute_head)], -1) + +def unroll_axis(ctx:dict[int, int], u:UOp, arg): + permute_tail = [ctx[rn] for rn,_ in arg] + out = u.reshape(*u.shape[:-1], *[nm for _,nm in arg]) + permute_head = [i for i in range(len(out.shape)) if i not in permute_tail] + return out.permute(argsort(permute_head+permute_tail)) + +def expand_wmma(ctx:dict[int, int], u:UOp): + if u.arg[4] is None: return None + in0, in1, out0 = u.arg[4] + wmma = u.replace(src=(contract_axis(ctx, u.src[0], in0), contract_axis(ctx, u.src[1], in1), u.src[2]), + arg=(*u.arg[:4], None)) + return unroll_axis(ctx, wmma, out0) + +expander2 = PatternMatcher([ + (UPat(Ops.REDUCE, name="r"), expand_reduce), + (UPat(Ops.RANGE, name="r"), + lambda ctx, r: UOp.const(tuple(range(r.vmax+1)), r.dtype) \ + .reshape(tuple([r.vmax+1 if i == ctx[r.arg[0]] else 1 for i in range(len(ctx))])) if r.arg[0] in ctx else None), + (UPat(Ops.WMMA, name="u"), expand_wmma), +])+pm_flatten_range+mop_cleanup + +def expand_broadcast(x:UOp): + shapes = [u._shape for u in x.src] + if any(s is None for s in shapes) or all_same(shapes): return None + shape = _broadcast_shape(*shapes) + return x.replace(src=tuple([u.expand(shape) for u in x.src])) + +def broadcast_and_devec_wmma(b:UOp): + shapes = [u.shape[:-1] for u in b.src] + if all_same(shapes): return None + shape = _broadcast_shape(*shapes) + src_expanded = tuple([u.expand(shape+(u.shape[-1],)) for u in b.src]) + src = [] + for idx in itertools.product(*[range(i) for i in b.shape[:-1]]): + src.append(b.replace(src=tuple([x.index(*idx) for x in src_expanded]))) + return UOp.stack(*src).reshape(b.shape) + +pm_wmma_add = PatternMatcher([ + (UPat(Ops.WMMA, name="wmma") + UPat.var("add"), + lambda add, wmma: UOp(wmma.op, src=(wmma.src[0], wmma.src[1], wmma.src[2]+add), arg=wmma.arg)), + # push permute/reshape to the other side of the add + (UPat(Ops.PERMUTE, src=(UPat(Ops.WMMA, name="wmma"),), name="permute") + UPat.var("add"), + lambda wmma,permute,add: (wmma + add.permute(argsort(permute.arg))).permute(permute.arg)), + (UPat(Ops.PERMUTE, src=(UPat(Ops.RESHAPE, src=(UPat(Ops.WMMA, name="wmma"), UPat()), name="reshape"),), name="permute") + UPat.var("add"), + lambda wmma,reshape,permute,add: (wmma + add.permute(argsort(permute.arg)).reshape(wmma.shape)).reshape(reshape.shape).permute(permute.arg)), +]) + +pm_expand_broadcast = pm_wmma_add+PatternMatcher([ + (UPat(GroupOp.Binary|GroupOp.Ternary|{Ops.STORE}, name="x"), expand_broadcast), + (UPat(Ops.WMMA, name="b"), broadcast_and_devec_wmma), +]) + +def do_devectorize(b:UOp): + if b.shape == (): return None + # broadcasting needs to be already unpacked, Invalid matches any dtype and shape + if not all(x.shape == b.shape or x.base.is_invalid for x in b.src): return None + src = [] + for idx_c in itertools.product(*[[UOp.const(i) for i in range(x)] for x in b.shape]): + src.append(b.replace(dtype=None, src=tuple(x.base if x.base.is_invalid else x.index(*idx_c) for x in b.src))) + return UOp.stack(*src).reshape(b.shape) if b.op is not Ops.STORE else UOp.group(*src) + +def do_stack_wmma(u:UOp): + if all(x.op in (Ops.STACK, Ops.WMMA) for x in u.src): return None + assert len(u.shape) == 1 + src = [] + for b in u.src: + if b.op != Ops.STACK: + src.append(UOp.stack(*[b.index(i) for i in range(b.max_numel())])) + else: + src.append(b) + return u.replace(src=tuple(src)) + +ew_devectorizer = PatternMatcher([ + # unpack broadcasting + (UPat(GroupOp.Elementwise, name="b"), do_devectorize), +]) + +devectorizer2 = mop_cleanup+pm_mops+PatternMatcher([ + # unpack broadcasting + (UPat(GroupOp.Elementwise|{Ops.LOAD,Ops.STORE}, name="b"), do_devectorize), + # INDEX without src is nothing (TODO: this should be in mop_cleanup) + (UPat(Ops.INDEX, src=(UPat.var('x'),)), lambda x: x), + # unpack WMMA + (UPat(Ops.WMMA, name="u"), do_stack_wmma), + # stacked INDEX is many INDEX + (UPat(Ops.INDEX, src=(UPat((Ops.PARAM, Ops.BUFFER), name="b"), UPat(Ops.STACK, name="s"))), + lambda b,s: UOp.stack(*[b.index(u) for u in s.src])), + # INDEX into RESHAPE moves the RESHAPE + (UPat(Ops.INDEX, src=(UPat((Ops.PARAM, Ops.BUFFER), name="b"), UPat(Ops.RESHAPE, name="s"))), + lambda b,s: b.index(s.src[0]).reshape(s.shape)), + # RESHAPE a void is removed (hack for AFTER) + (UPat(Ops.RESHAPE, dtype=dtypes.void, name="x"), lambda x: x.src[0]), + # reshape of a single element shaped value to scalar is an index + (UPat(Ops.RESHAPE, name="x"), lambda x: x.src[0].index(0) if x.marg == () and x.src[0].shape == (1,) else None), + # EXPAND on scalar -> STACK + (UPat(Ops.EXPAND, src=(UPat.var("x"), UPat()), name="out"), + lambda x,out: UOp.stack(*([x]*out.max_numel())) if x.shape == () and out.shape == (out.max_numel(),) else None), +]) + +def fix_group_for_reduce(x:UOp): + reduce_gfr, reduce_r = partition(x.src[1:], lambda u: u.op is Ops.RANGE and u.arg[1] == AxisType.GROUP_REDUCE) + if len(reduce_gfr) == 0: return None + + # NOTE: if there's other locals here, we need them in the buffer too + upstream_locals = [u for u in x.toposort() if u.op is Ops.RANGE and u.arg[1] == AxisType.LOCAL] + + # do only the non grouped reduces early + ret = x.replace(src=(x.src[0],)+tuple(reduce_r)) + reduce_loop = [x.replace(arg=(x.arg[0]+100, AxisType.REDUCE)) for x in reduce_gfr] + buf = ret.bufferize(*upstream_locals, *reduce_gfr, arg=BufferizeOpts(reduce_gfr[0].arg[0], AddrSpace.LOCAL)).index(*upstream_locals, *reduce_loop) + + # do the final reduce (if/barrier are added in gpudims step) + # NOTE: we remove all horizontal reduces here, they remain in the first reduce + return buf.reduce(*reduce_loop, arg=(x.arg[0], 0)) + +@dataclass +class ReduceContext: + acc_num: int = 0 + +def merge_reduce_ends(sink:UOp): + # merge ENDs that share the same range and nesting context (only those created by reduce_to_acc) + # ENDs at different nesting depths get cloned RANGEs so each RANGE maps to one END + range_to_ends: dict[tuple[UOp, ...], list[UOp]] = {} + for u in sink.backward_slice: + if u.op is Ops.END and u.tag == "mergeable": range_to_ends.setdefault(u.src[1:], []).append(u) + subs: dict[UOp, UOp] = {} + next_axis = max((u.arg[0] for u in sink.backward_slice if u.op is Ops.RANGE), default=-1) + 1 + for r, ends in range_to_ends.items(): + if len(ends) <= 1: continue + by_ctx: dict[frozenset[UOp], list[UOp]] = {} + for e in ends: by_ctx.setdefault(frozenset(e.ranges), []).append(e) + for i, group in enumerate(by_ctx.values()): + tr = r if i == 0 else tuple(rr.replace(arg=(next_axis + j, *rr.arg[1:])) for j, rr in enumerate(r)) + if i > 0: next_axis += len(r) + mapped = [e.substitute(dict(zip(r, tr))) if i > 0 else e for e in group] + merged = mapped[0] if len(mapped) == 1 else UOp.group(*(e.src[0] for e in mapped)).end(*tr) + for e in group: subs[e] = merged + return sink.substitute(subs) if subs else None + +def reduce_ranges_to_acc(ctx:ReduceContext, r:UOp): + acc = UOp.placeholder_like(r, ctx.acc_num, AddrSpace.REG) + ctx.acc_num += 1 + topo = r.src[0].toposort() + ended_ranges = flatten([x.ended_ranges for x in topo if x.op is Ops.END]) + input_ranges = tuple(x for x in topo if x.op is Ops.RANGE and x not in r.src[1:] and x not in ended_ranges) + acc_init = acc.after(*input_ranges).store(UOp.const(identity_element(r.arg[0], r.dtype))) + acc_initted = acc.after(acc_init, *r.src[1:]) + inp = r.src[0].reduce(arg=r.arg) if r.arg[1] else r.src[0] + acc_out = acc_initted.store(acc_initted.alu(r.arg[0], inp)).end(*r.src[1:]).rtag("mergeable") + return acc.after(acc_out) + +def expand_horizontal_reduce(r:UOp): + inp = r.src[0] + vals = [inp.index(*idx) for idx in itertools.product(*[range(inp.max_shape[a]) for a in range(r.arg[1])])] + return functools.reduce(lambda x,y: x.alu(r.arg[0], y), vals) + +pm_reduce_local = pm_wmma_add+PatternMatcher([ + # fix group for reduce + (UPat(Ops.REDUCE, name="x"), fix_group_for_reduce), + # remove reduces + (UPat(Ops.REDUCE, src=(UPat(), UPat()), allow_any_len=True, name="r"), reduce_ranges_to_acc), + (UPat(Ops.REDUCE, src=(UPat(),), name="r"), expand_horizontal_reduce), + (UPat(Ops.SINK, name="sink"), merge_reduce_ends), +])+pm_clean_up_group_sink + +def maybe_load(u:UOp): return u.load() if u.addrspace in (AddrSpace.GLOBAL, AddrSpace.LOCAL, AddrSpace.REG) else u +pm_add_loads = PatternMatcher([ + # BITCAST? + (UPat(GroupOp.Elementwise|{Ops.REDUCE,Ops.WMMA,Ops.STACK}, name="x"), lambda x: x.replace(src=tuple([maybe_load(u) for u in x.src]))), + (UPat(Ops.STORE, name="x"), lambda x: x.replace(src=(x.src[0], maybe_load(x.src[1]))+x.src[2:])), +]) + +def add_local_buffer(ctx, x:UOp): + buf = UOp.placeholder(x.max_shape, x.dtype, slot=next(ctx), addrspace=x.arg.addrspace) + return buf.after(buf.index(*x.src[1:]).store(x.src[0]).end(*x.src[1:])) + +pm_add_local_buffers = PatternMatcher([ + (UPat(Ops.STAGE, name="x"), add_local_buffer), +])+pm_mops + +# float ALUs need a float operand +# make that cast explicit before the decomps, which expand SIN/LOG2/EXP2 into float polynomials and assert a float operand +pm_cast_float_alu = PatternMatcher([ + (UPat((Ops.SIN, Ops.LOG2, Ops.EXP2, Ops.SQRT, Ops.RECIPROCAL), src=(UPat(name="x"),), name="u"), + lambda u,x: u.replace(src=(x.cast(u.dtype),)) if x.dtype != u.dtype else None), +]) + +def _is_local_store(x:UOp): return x.op is Ops.STORE and x.addrspace is AddrSpace.LOCAL + +def add_raw_barrier(after:UOp): + # loads from a LOCAL buffer that depend (via AFTER) on stores to LOCAL memory need a workgroup barrier + if after.addrspace is not AddrSpace.LOCAL: return None + # one toposort over all the deps + deps = UOp.sink(*after.src[1:]).toposort(gate=lambda x: x.op is not Ops.BARRIER) + if not any(_is_local_store(x) for x in deps): return None + return after.src[0].after(UOp(Ops.BARRIER, src=after.src[1:])) + +def add_war_barrier(end:UOp): + # a LOCAL buffer stored and loaded in the same loop needs a barrier at the end of the loop body + rngs = [r for r in end.src[1:] if r.op is Ops.RANGE and r.arg[1] in (AxisType.REDUCE, AxisType.WEAK, AxisType.LOOP) and r.vmax > 0] + if not rngs or end.src[0].op is Ops.BARRIER: return None + sl = end.src[0].backward_slice_with_self + # only stores that are inside this loop body (not in the backward slice through AFTER chains from other loops) + store_bufs = {x.buf_uop for x in sl if _is_local_store(x) and any(r in x.ranges for r in rngs)} + # a load whose buffer matches a local store's buffer is necessarily a local load + if not (loads:=[x for x in sl if x.op is Ops.LOAD and x.src[0].buf_uop in store_bufs]): return None + return end.replace(src=(UOp(Ops.BARRIER, src=(end.src[0], *loads)),)+end.src[1:]) + +pm_implicit_barriers = PatternMatcher([ + (UPat(Ops.AFTER, name="after"), add_raw_barrier), + (UPat(Ops.END, name="end"), add_war_barrier), +]) + +def full_rewrite_to_sink(ast:UOp, ren:Renderer, optimize:bool=True) -> UOp: + if VIZ: graph_rewrite(ast, PatternMatcher([]), name="View Base AST") + if DEBUG >= 5: print(pyrender(ast)) + if SPEC: type_verify(ast, spec_tensor) + + # resolve UNSHARDs (multi-device UNSHARDs are already resolved by the scheduler; this handles in-kernel shards, e.g. fragments) + sink = graph_rewrite(ast, multi_pm, name="multi_pm") + + # preprocess + sink = graph_rewrite(sink, pm_mops, name="early movement ops", bottom_up=True) + + # first we optimize + if optimize: + # collapse loads reduce (indexing by a tensor) + sink = graph_rewrite(sink, pm_load_collapse, name="load collapse") + + # split ranges + sink = graph_rewrite(sink, pm_split_ranges+pm_flatten_range, ctx={}, name="split ranges") + + # symbolic (NOTE: this is a requirement for pm_simplify_ranges to be correct) + sink = graph_rewrite(sink, sym+pm_fold_cast_const+pm_flatten_range, name="initial symbolic") + + # optimize (schedule) the AST + sink = graph_rewrite(sink, pm_flatten_range+pm_simplify_ranges, ctx={}, name="simplify ranges") + + # do postrange optimization, BEAM or hand_coded_optimizations + sink = apply_opts(sink, ren, beam=ast.arg.beam) + + # ** expander (expand_rewrite) ** + # reduce_unparented: a REDUCE whose src folded to a CONST (e.g. x*0) has no parented ranges, collapse it before the expander + sink = graph_rewrite(sink, sym+pm_move_where_on_load+pm_flatten_range+pm_reduce_unparented, name="postopt symbolic") + + # expand + sink = graph_rewrite(sink, expander2, ctx=build_range_map(sink), name="expander") + + # remove reduce + sink = graph_rewrite(sink, mop_cleanup+pm_reduce_local, ctx=ReduceContext(), name="remove reduces") + + # add locals + sink = graph_rewrite(sink, pm_add_local_buffers, ctx=itertools.count(0), name="add local buffers") + + # add gpu dims (late). this works after devectorize, but it's faster here + sink = graph_rewrite(sink, pm_add_gpudims, ctx=ren, name="add gpudims") + + # **** optimizations are done, now we lower to actual code **** + + sink = graph_rewrite(sink, symbolic_simple+pm_expand_broadcast+pm_add_loads, name="*** expand broadcast / add loads") + + # devectorize + sink = graph_rewrite(sink, symbolic_simple+pm_fold_cast_const+devectorizer2+indexing_simplify, ctx=ren, name="devectorize2") + + # some coalescing misses without this + sink = graph_rewrite(sink, sym+pm_fold_cast_const, name="early symbolic") + + # do memory coalescing (late) + sink = memory_coalescing(sink, ren) + sink = graph_rewrite(sink, symbolic_simple+ew_devectorizer+pm_simplify_add_image, + name="add images", ctx=({}, ren), bottom_up=True) + + # extra symbolic before decomp. crashes without this? + sink = graph_rewrite(sink, sym, name="extra symbolic") + + # lower index dtype + # NOTE: we need indexing_simplify to remove the cast to long using the Invalid + sink = graph_rewrite(sink, pm_lower_index_dtype+indexing_simplify, ctx={}, name="lower all index dtypes") + + # final symbolic before decomp + sink = graph_rewrite(sink, symbolic, name="final symbolic") + + sink = graph_rewrite(sink, pm_cast_float_alu, name="cast float alu operands") + + # **** decomps **** + + # floordiv+mod / dtype decomp (early) + supported_ops = tuple(ren.code_for_op.keys()) + pm_decomp = symbolic_simple+pm_fold_cast_const+get_simplifying_rewrite_patterns(supported_ops) + sink = graph_rewrite(sink, pm_decomp, name="early decompositions") + + # late decomps + move gates from unrenderable INVALID where + sink = graph_rewrite(sink, pm_dtype_decomps+pm_commit_weak, ctx=(set(), ren), name="decomp dtypes") + pm_decomp = pm_decomp+\ + get_late_rewrite_patterns(supported_ops, bool(DISABLE_FAST_IDIV))+\ + get_transcendental_patterns(supported_ops, TRANSCENDENTAL>=2) + sink = graph_rewrite(sink, pm_decomp, ctx=ren, name="late decompositions") + sink = graph_rewrite(sink, pm_move_gates_from_index, name="move gates from index") + + # final rules for the renderer (without sym) + extra_matcher = ren.extra_matcher if ren.extra_matcher is not None else PatternMatcher([]) + pm_final_rewrite = pm_commit_weak+pm_cast_weak+pm_decomp+extra_matcher+pm_split_ends + sink = graph_rewrite(sink, pm_final_rewrite+pm_remove_invalid, ctx=ren, name="final rewrite") + + # add implicit barriers (stores/loads through LOCAL memory ordered by AFTER or across loop iterations need workgroup barriers) + sink = graph_rewrite(sink, pm_implicit_barriers, name="add implicit barriers") + + # this was the linearizer + sink = graph_rewrite(sink, pm_add_control_flow, ctx=CFGContext(sink), name="add control flow", bottom_up=True) + + # put unnumbered variable PARAMs in slots + num_params = len([x for x in sink.toposort() if x.op is Ops.PARAM and x.arg.slot != -1]) + sink = graph_rewrite(sink, pm_number_params, ctx=[num_params], name="number params with -1", walk=True) + + if VIZ: graph_rewrite(sink, PatternMatcher([]), name="View Output AST") + if SPEC: type_verify(sink, spec_program) + + # return the rewritten sink + return sink + +# inject IF/ENDIF. only needed if device doesn't support gated stores +pm_linearize_cleanups = PatternMatcher([ + # if statements are not allowed in the graph + (UPat((Ops.IF, Ops.ENDIF)), lambda: panic(RuntimeError, "if not allowed in graph")), + # gated STORE becomes IF-STORE-ENDIF. this is the only use of IF-ENDIF + (UPat(Ops.STORE, name="u", src=(UPat((Ops.INDEX, Ops.SHRINK)).or_casted(), UPat(), UPat(name="gate", dtype=dtypes.bool))), + lambda u, gate: ((st:=u.replace(src=u.src[0:2])), [mif:=UOp(Ops.IF, src=(gate, u.src[0])), st, UOp(Ops.ENDIF, src=(mif,))])) +]) + +# requires lst be toposorted. like graph rewrite, but for lines +def line_rewrite(lst:list[UOp], pm:PatternMatcher, ctx=None) -> list[UOp]: + newlst = [] + replaced: dict[UOp, UOp] = {} + for u in lst: + nu = u.replace(src=tuple([replaced.get(x, x) for x in u.src])) + ret: tuple[UOp, list[UOp]] = pm.rewrite(nu, ctx) or (nu, [nu]) + replaced[u] = ret[0] + newlst.extend(ret[1]) + return newlst + +def do_linearize(ctx:Renderer, prg:UOp, sink:UOp) -> UOp: + if DEBUG >= 3 and sink.arg.applied_opts: print(f"{sink.arg.function_name:<25} opts: {sink.arg.applied_opts}") + lst = line_rewrite(linearize(sink), pm_linearize_cleanups) + # isa renderers need to allocate registers + if isinstance(ctx, ISARenderer): + if ctx.pre_regalloc_matcher is not None: lst = line_rewrite(lst, ctx.pre_regalloc_matcher, PreRegAllocContext()) + # register definitions (INS without srcs) move to the top so regalloc sees their live ranges span the whole program (callee saved regs) + lst = sorted(lst, key=lambda u: u.op is not Ops.INS or bool(u.src)) + regalloc_ctx = LinearScanRegallocContext(lst, ctx) + lst = line_rewrite(lst, pm_regalloc_rewrite, regalloc_ctx) + lst = line_rewrite(lst, ctx.post_regalloc_matcher, regalloc_ctx) + if DEBUG >= 4: print(ctx.asm_str(lst, sink.arg.function_name)) + return prg.replace(src=prg.src + (UOp(Ops.LINEAR, src=tuple(lst)),)) + +def do_estimates(prg:UOp, sink:UOp, lin:UOp) -> UOp|None: + if sink.arg.estimates is not None: return None + return prg.replace(src=(sink.replace(arg=replace(sink.arg, estimates=Estimates.from_uops(lin.src, ignore_indexing=True))),)+prg.src[1:]) + +def do_assemble(ctx:Renderer, prg:UOp, lin:UOp) -> UOp: + src = "\n".join(str(u.arg) for u in lin.src) + if DEBUG >= 4: print(src) + binary = ctx.asm(prg, lin) + return prg.replace(src=prg.src[:2]+(UOp(Ops.SOURCE, arg=src), UOp(Ops.BINARY, arg=binary))) + +def do_render(ctx:Renderer, prg:UOp, lin:UOp) -> UOp: + src = ctx.render(list(lin.src)) + return prg.replace(src=prg.src + (UOp(Ops.SOURCE, arg=src),)) + +def do_compile(ctx:Renderer, prg:UOp, source:UOp) -> UOp|None: + if DEBUG >= 4: print(source.arg) + lib = ctx.compiler.compile_cached(source.arg) + if DEBUG >= 7: ctx.compiler.disassemble(lib) + return prg.replace(src=prg.src + (UOp(Ops.BINARY, arg=lib),)) + +pm_to_program = PatternMatcher([ + (UPat(Ops.PROGRAM, src=(UPat(Ops.SINK, name="sink"),), name="prg"), do_linearize), + (UPat(Ops.PROGRAM, src=(UPat(Ops.SINK, name="sink"), UPat(Ops.LINEAR, name="lin")), name="prg"), do_estimates), + (UPat(Ops.PROGRAM, src=(UPat(), UPat(Ops.LINEAR, src=UPat(Ops.INS), name="lin")), name="prg"), do_assemble), + (UPat(Ops.PROGRAM, src=(UPat(), UPat(Ops.LINEAR, name="lin")), name="prg"), do_render), + (UPat(Ops.PROGRAM, src=(UPat(), UPat(Ops.LINEAR), UPat(Ops.SOURCE, name="source")), name="prg"), do_compile), +]) + +@rewrite_group(name=lambda ast,renderer,ret,**kwargs: TracingKey(ret.src[0].arg.name,(ret.src[0].arg.function_name, ast), ret=renderer), replay=True) +@Context(ALLOW_DEVICE_USAGE=0) +def do_to_program(ast:UOp, renderer:Renderer) -> UOp: + """ + Transform an AST into a compiled PROGRAM. May trigger BEAM search. + + Args: + ast: The Ops.SINK/Ops.PROGRAM rooted AST + renderer: The renderer used to generate the code + + Returns: + The Ops.PROGRAM with SINK/LINEAR/SOURCE/BINARY. + """ + if ast.op is Ops.PROGRAM: prg = ast + elif ast.op is Ops.SINK: + assert isinstance(ast.arg, KernelInfo), "requires KernelInfo on arg to to_program" + full_sink = full_rewrite_to_sink(ast, renderer, optimize=ast.tag is None) + prog_info = ProgramInfo.from_sink(full_sink, renderer.target) + # instruction selection + if isinstance(renderer, ISARenderer): + full_sink = graph_rewrite(full_sink, renderer.pre_isel_matcher, ctx=itertools.count(-1, -1), name="pre instruction selection", bottom_up=True) + full_sink = graph_rewrite(full_sink, renderer.isel_matcher, ctx=IselContext(full_sink), name="instruction selection", bottom_up=True) + prg = UOp(Ops.PROGRAM, src=(full_sink,), arg=prog_info) + else: raise RuntimeError(f"can't call to_program on {ast.op}") + if not isinstance(prg.arg, ProgramInfo): prg = prg.replace(arg=ProgramInfo.from_sink(prg.src[0], renderer.target)) + prg = graph_rewrite(prg, pm_to_program, ctx=renderer, name="linearize/render") + if VIZ: graph_rewrite(prg, PatternMatcher([]), name="View Program") + return prg + +to_program_cache: dict[tuple, UOp] = {} +def to_program(ast:UOp, renderer:Renderer) -> UOp: + config = (NOOPT, EMULATED_DTYPES, NOLOCALS, USE_TC, IMAGE, DISABLE_FAST_IDIV, TRANSCENDENTAL, ALLOW_TF32, DEFAULT_FLOAT, DEFAULT_INT) + key = (ast.key, type(renderer), renderer.target, *[x.value for x in config]) + if (prg:=to_program_cache.get(key)) is None: to_program_cache[key] = prg = do_to_program(ast, renderer) + return prg diff --git a/artifacts/package_runtime/tinygrad/codegen/decomp/__init__.py b/artifacts/package_runtime/tinygrad/codegen/decomp/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/codegen/decomp/dtype.py b/artifacts/package_runtime/tinygrad/codegen/decomp/dtype.py new file mode 100644 index 000000000..52b8e4630 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/decomp/dtype.py @@ -0,0 +1,213 @@ +from dataclasses import replace +from tinygrad.dtype import dtypes, DType, truncate +from tinygrad.helpers import flatten, DEBUG, EMULATED_DTYPES, Context, SPEC +from tinygrad.uop import GroupOp +from tinygrad.uop.ops import UOp, UPat, Ops, PatternMatcher, graph_rewrite, ParamArg +from tinygrad.renderer import Renderer +from tinygrad.codegen.decomp.transcendental import exponent_bias, shl, shr + +# ***** long as 2 ints ***** + +l2i_dt = {dtypes.long: dtypes.int, dtypes.ulong: dtypes.uint} +def unpack32(v:UOp) -> tuple[UOp, UOp]: return v.bitcast(dtypes.uint) & 0xFFFF, shr(v.bitcast(dtypes.uint), 16) +def reindex(idx:UOp, off:int, mul=2) -> UOp: + if idx.op is Ops.SHRINK: + assert mul == 1, "can't reindex SHRINK with mul != 1" + return idx.replace(op=Ops.INDEX, src=(idx.src[0], idx.src[1]+off)) + return idx.replace(src=(idx.src[0], idx.src[1]*mul+off, *idx.src[2:])) + +# 4.3.1 is the relevant section in TAOCP +def l2i(op: Ops, dt: DType, *uops:UOp): + zero = UOp.const(0, dt) + if len(uops) == 2: a0, a1 = uops + elif len(uops) == 3: a0, a1, b0 = uops # a shift's count is a single word + elif len(uops) == 4: a0, a1, b0, b1 = uops + match op: + case Ops.NEG: return l2i(Ops.SUB, dt, zero, zero, *uops) + case Ops.CAST if dt in (dtypes.long, dtypes.ulong) and uops[0].dtype not in dtypes.floats: + # the high word is the sign extension; bool has no sign, test the already-cast low word instead (bool < 0 would promote to weakint) + x, lo = uops[0], uops[0].cast(l2i_dt[dt]) + sign = lo if x.dtype is dtypes.bool else x + return lo, (sign < sign.const_like(0)).where(lo.const_like(-1), lo.const_like(0)) + case Ops.CAST if dt in (dtypes.long, dtypes.ulong): + return (lo:=uops[0].cast(l2i_dt[dt])), (uops[0] / 2**32).cast(l2i_dt[dt]) - ((uops[0] < 0) & lo.ne(0)) + case Ops.CAST if dt in dtypes.floats: + small = (a1.eq(0) & (a0 >= 0)) | (a1.eq(-1) & (a0 < 0)) + return small.where(a0.cast(dt), ((a1.cast(dtypes.float32) * (2**32)) + a0.bitcast(dtypes.uint).cast(dtypes.float32)).cast(dt)) + case Ops.CAST: return a0.bitcast(dtypes.uint).cast(dt) + case Ops.BITCAST: return a0.bitcast(dt), a1.bitcast(dt) + case Ops.SHL: + a0u, a1u, n = a0.bitcast(dtypes.uint), a1.bitcast(dtypes.uint), (b0 & 31).cast(dtypes.uint) + lo, hi = (a0u << n).bitcast(dt), ((a1u << n) | ((a0u >> 1) >> (31 - n))).bitcast(dt) + return (b0 >= 32).where(zero, lo), (b0 >= 32).where(lo, hi) + case Ops.SHR: + a0u, a1u, n = a0.bitcast(dtypes.uint), a1.bitcast(dtypes.uint), (b0 & 31).cast(dtypes.uint) + lo, hi = ((a0u >> n) | ((a1u << 1) << (31 - n))).bitcast(dt), a1 >> (b0 & 31) + fill = a1 >> 31 if dt == dtypes.int else zero # vacated high word: sign bits when signed, else 0 + return (b0 >= 32).where(hi, lo), (b0 >= 32).where(fill, hi) + case Ops.ADD: return (low:=a0+b0), a1 + b1 + (low.bitcast(dtypes.uint) < a0.bitcast(dtypes.uint)) + case Ops.SUB: return a0 - b0, a1 - b1 - (a0.bitcast(dtypes.uint) < b0.bitcast(dtypes.uint)) + case Ops.MUL: + (a00, a01), (b00, b01) = unpack32(a0), unpack32(b0) + mid = l2i(Ops.ADD, dt, shl(a00*b01, 16).bitcast(dt), shr(a00*b01, 16).bitcast(dt), shl(a01*b00, 16).bitcast(dt), shr(a01*b00, 16).bitcast(dt)) + return l2i(Ops.ADD, dt, *mid, (a00*b00).bitcast(dt), (a01*b01).bitcast(dt) + a0*b1 + a1*b0) + case Ops.CDIV | Ops.CMOD: + # TAOCP Algorithm 4.3.1D could be faster here, but must be parameterized over the width of b + if dt == dtypes.int: + ua0, ua1, ub0, ub1 = a0.bitcast(dtypes.uint), a1.bitcast(dtypes.uint), b0.bitcast(dtypes.uint), b1.bitcast(dtypes.uint) + a0, a1 = (a_neg:=a1 < zero).where((n:=l2i(Ops.NEG, dtypes.uint, ua0, ua1))[0], ua0), a_neg.where(n[1], ua1) + b0, b1 = (b_neg:=b1 < zero).where((n:=l2i(Ops.NEG, dtypes.uint, ub0, ub1))[0], ub0), b_neg.where(n[1], ub1) + q, r = (z:=UOp.const(0, dtypes.uint), z), (z, z) + for i in range(63, -1, -1): + r = l2i(Ops.SHL, dtypes.uint, *r, UOp.const(1, dtypes.uint), z) + r = (r[0] | l2i(Ops.SHR, dtypes.uint, a0, a1, UOp.const(i, dtypes.uint), z)[0] & 1), r[1] + cond = l2i(Ops.CMPLT, dtypes.uint, *r, b0, b1).logical_not() + diff = l2i(Ops.SUB, dtypes.uint, *r, b0, b1) + q = ((q[0] | shl(cond.cast(dtypes.uint), i % 32), q[1]) if i < 32 else (q[0], q[1] | shl(cond.cast(dtypes.uint), i % 32))) + r = l2i(Ops.WHERE, dtypes.uint, cond, *diff, *r) + if dt == dtypes.int: + (nq0, nq1), (nr0, nr1) = l2i(Ops.BITCAST, dt, *l2i(Ops.NEG, dtypes.uint, *q)), l2i(Ops.BITCAST, dt, *l2i(Ops.NEG, dtypes.uint, *r)) + (q0, q1), (r0, r1) = l2i(Ops.BITCAST, dt, *q), l2i(Ops.BITCAST, dt, *r) + return (a_neg.where(nr0, r0), a_neg.where(nr1, r1)) if op == Ops.CMOD else ((a_neg^b_neg).where(nq0, q0), (a_neg^b_neg).where(nq1, q1)) + return r if op == Ops.CMOD else q + case Ops.CMPLT: return (a1 < b1) | ((a1.eq(b1)) & (a0.bitcast(dtypes.uint) < b0.bitcast(dtypes.uint))) + case Ops.CMPEQ: return a0.eq(b0) & a1.eq(b1) + case Ops.CMPNE: return a0.ne(b0) | a1.ne(b1) + case Ops.XOR | Ops.OR | Ops.AND: return UOp(op, src=(a0, b0)), UOp(op, src=(a1, b1)) + case Ops.WHERE: return uops[0].where(uops[1], uops[3]), uops[0].where(uops[2], uops[4]) + case Ops.MAX: return l2i(Ops.WHERE, dt, l2i(Ops.CMPLT, dt, *uops), b0, b1, a0, a1) + case _: raise NotImplementedError(f"long decomposition of {op} unsupported") + +def split_l2i(ctx:dict, op: Ops, dt: DType, *uops:UOp): + # l2i does arithmetic on its inputs; rules enter here to split them to 32-bit words first, l2i recurses on itself. + # both word halves of a node ask for the same split, so ctx memos it for the pass + if (key:=(op, dt, uops)) not in ctx: ctx[key] = l2i(op, dt, *graph_rewrite(UOp.sink(*uops), pm_long_decomp, ctx=ctx, bottom_up=True).src) + return ctx[key] + +# ***** floats ***** +f2f_dt = { f:getattr(dtypes, f"uint{f.bitsize}") for f in dtypes.floats } + +def rne(v: UOp, s) -> UOp: return shr(v, s) + ((shr(v, s - 1) & 1) & ((v & ((1 << (s - 1)) - 1)).ne(0) | (shr(v, s) & 1))) + +def f2f(v, fr:DType, to:DType, sat=True): + fs, fb, (fe, fm), ts, tb, (te, tm) = fr.bitsize, exponent_bias(fr), dtypes.finfo(fr), to.bitsize, exponent_bias(to), dtypes.finfo(to) + # NB: denormals are zero! + if fe <= te and fm < tm: + sign, nosign = shl((v & shl(1, fs-1)).cast(f2f_dt[to]), ts - fs), (v & (shl(1, fs-1) - 1)).cast(f2f_dt[to]) + exp, norm = shr(nosign, fm), shl(nosign, tm - fm) + shl(tb - fb, tm) + nan = shl(nosign, tm - fm) | shl((shl(1, te) - 1), tm) + if fr in dtypes.fp8_fnuz: + fnuz_nan = sign.ne(0) & nosign.eq(0) + qnan = shl(shl(1, te) - 1, tm) | shl(1, tm - 1) + # the fnuz bias can exceed the target's: exp in [1, fb-tb] is normal in fr but lands below to's normal range, so it flushes like a denormal + return fnuz_nan.where(qnan, sign | (exp < max(fb - tb, 0) + 1).where(0, norm)).bitcast(to) + # fp8e4m3 has only one nan + is_nan = (nosign.eq(shl(1, fm + fe) - 1) if fr == dtypes.fp8e4m3 else exp.eq(shl(1, fe) - 1)) + return (sign | exp.eq(0).where(0, is_nan.where(nan, norm))).bitcast(to) + elif fe >= te and fm > tm: + v = f2f_clamp(v.bitcast(fr), to, sat).bitcast(f2f_dt[fr]) + sign, nosign = shr(v, fs - ts) & shl(1, ts - 1), v & (shl(1, fs - 1) - 1) + norm = (rne(nosign, fm - tm) - shl(fb - tb, tm)).cast(f2f_dt[to]) + underflow = (shr(v, fm) & (shl(1, fe) - 1)) < (1 + fb - tb) + nan_mantissa = (shl(1, tm) - 1) if to == dtypes.fp8e4m3 else (shr(nosign, fm - tm) & (shl(1, tm) - 1)) + nan = (sign | nan_mantissa | shl(shl(1, te) - 1, tm)).cast(f2f_dt[to]) + is_nan = (shr(v, fm) & (shl(1, fe) - 1)).eq(shl(1, fe) - 1) + if to in dtypes.fp8_fnuz: return is_nan.where(shl(1, ts - 1), underflow.where(0, sign.cast(f2f_dt[to]) | norm)) + return is_nan.where(nan, sign.cast(f2f_dt[to]) | underflow.where(0, norm)) + else: raise NotImplementedError(f"unsupported decomp {fr} -> {to}") + +def f2f_clamp(val:UOp, dt:DType, sat=True) -> UOp: + e, m = dtypes.finfo(dt) + if dt in dtypes.fp8_fnuz: max_exp, max_man = (1 << e) - 1, (1 << m) - 1 + else: max_exp, max_man = ((1 << e) - 1, (1 << m) - 2) if dt == dtypes.fp8e4m3 else ((1 << e) - 2, (1 << m) - 1) + mx = val.const_like(2.0**(max_exp - exponent_bias(dt)) * (1.0 + max_man / (1 << m))) + sat = mx if dt in dtypes.fp8s and sat else val.const_like(float('inf')) + # FIXME: CMPLT of nan is undefined + return val.ne(val).where(val, (val < -mx).where(-sat, (mx < val).where(sat, val))) + +def f2f_load(x: UOp, fr:DType, to:DType) -> UOp: + if (n:=x.max_numel()) == 1: return f2f(x.replace(dtype=f2f_dt[fr]), fr, to) + return UOp(Ops.STACK, src=tuple(f2f(x.replace(dtype=f2f_dt[fr], src=(reindex(x.src[0], i, 1),)), fr, to) for i in range(n))) + +def f2f_store(st, idx, val, fr:DType, to:DType): + if (n:=val.max_numel()) == 1: return st.replace(src=(idx, f2f(val.bitcast(f2f_dt[to]), to, fr))) + return UOp.group(*(st.replace(src=(reindex(idx, i, 1), f2f(val.index(i).bitcast(f2f_dt[to]), to, fr))) for i in range(n))) + +# tag is the 32-bit word this node becomes - (0 for the low word, 1 for the high, the dtype the consumer wants) +pm_long_decomp = PatternMatcher([ + (UPat(GroupOp.Defines, src=(UPat.var("sz"),), name="x"), lambda x,sz: + x.replace(dtype=l2i_dt[x.dtype], arg=replace(x.arg, dtype=l2i_dt[x.dtype]), src=(sz*2,)) if x.dtype in l2i_dt else None), + (UPat(Ops.INDEX, tuple(l2i_dt.keys()), name='x'), lambda x: + reindex(x, x.tag[0]).replace(dtype=x.tag[1], tag=None) if x.tag is not None else None), + (UPat(Ops.STORE, src=(UPat.var('idx', tuple(l2i_dt.keys())), UPat.var('val')), name='st'), lambda st,idx,val: + st.replace(src=(idx.rtag((0, dt:=l2i_dt[idx.dtype])), val.rtag((0, dt)))).group( + st.replace(src=(idx.rtag((1, dt)), val.rtag((1, dt))))) if val.tag is None else None), + (UPat(GroupOp.Comparison, src=[UPat.var('a', tuple(l2i_dt.keys())), UPat()], name="x"), lambda ctx,a,x: + split_l2i(ctx, x.op, dt:=l2i_dt[a.dtype], *flatten((s.rtag((0, dt)), s.rtag((1, dt))) for s in x.src))), + (UPat(Ops.CAST, tuple(l2i_dt.keys()), src=(UPat.var('a', tuple(l2i_dt.keys())),), name="x"), lambda ctx,a,x: + split_l2i(ctx, Ops.BITCAST, l2i_dt[x.dtype], a.rtag((0, dt:=l2i_dt[a.dtype])), a.rtag((1, dt)))[x.tag[0]]), + (UPat(Ops.CAST, tuple(l2i_dt.keys()), src=(UPat.var('a'),), name="x"), lambda ctx,a,x: + split_l2i(ctx, x.op, x.dtype, a)[x.tag[0]] if x.tag is not None else None), + (UPat(Ops.CAST, src=(UPat.var('a', tuple(l2i_dt.keys())),), name="x"), lambda ctx,a,x: + split_l2i(ctx, x.op, x.dtype, a.rtag((0, dt:=l2i_dt[a.dtype])), a.rtag((1, dt))) if x.dtype not in l2i_dt and a.tag is None else None), + (UPat((Ops.SHL, Ops.SHR), tuple(l2i_dt.keys()), src=(UPat.var('a'), UPat.var('b')), name="x"), lambda ctx,a,b,x: + split_l2i(ctx, x.op, dt:=l2i_dt[x.dtype], a.rtag((0, dt)), a.rtag((1, dt)), b.rtag((0, dt)))[x.tag[0]] if x.tag is not None else None), + (UPat(Ops.WHERE, tuple(l2i_dt.keys()), src=(UPat.var('c'), UPat.var('a'), UPat.var('b')), name="x"), lambda ctx,a,b,c,x: + split_l2i(ctx, x.op, dt:=l2i_dt[x.dtype], c, a.rtag((0, dt)), a.rtag((1, dt)), b.rtag((0, dt)), b.rtag((1, dt)))[x.tag[0]] + if x.tag is not None else None), + (UPat((*(GroupOp.ALU - GroupOp.Comparison - {Ops.SHL, Ops.SHR, Ops.WHERE}), Ops.BITCAST), tuple(l2i_dt.keys()), name="x"), lambda ctx,x: + split_l2i(ctx, x.op, l2i_dt[x.dtype], *flatten((a.rtag((0, l2i_dt[x.dtype])), a.rtag((1, l2i_dt[x.dtype]))) for a in x.src))[x.tag[0]] + if x.tag is not None else None), + (UPat(Ops.LOAD, tuple(l2i_dt.keys()), src=(UPat.var('idx'),), name='x'), lambda x,idx: + x.replace(dtype=l2i_dt[x.dtype], src=(reindex(idx, x.tag[0]).replace(dtype=l2i_dt[x.dtype], tag=None),), tag=None) if x.tag is not None else None), + (UPat(Ops.CONST, tag={(w, dt) for w in (0, 1) for dt in l2i_dt.values()}, name='x'), lambda x: + UOp.const(truncate[x.tag[1]]((x.val >> 32) if x.tag[0] == 1 else (x.val & 0xFFFFFFFF)), x.tag[1])) +]) + +# float decomposition patterns - ctx is (fr, to) tuple +pm_float_decomp = PatternMatcher([ + (UPat((*GroupOp.Defines, Ops.INDEX, Ops.SHRINK), name="x"), lambda ctx,x: + x.replace(dtype=f2f_dt[ctx[0]], arg=replace(x.arg, dtype=f2f_dt[ctx[0]]) if isinstance(x.arg, ParamArg) else x.arg, tag=ctx[0]) + if x.dtype == ctx[0] and (x.op is not Ops.INDEX or x.src[0].op not in {Ops.LOAD, Ops.STACK}) else None), + (UPat(Ops.LOAD, dtypes.floats, name="x"), lambda ctx,x: f2f_load(x, *ctx) if x.dtype == ctx[0] else None), + # bitcasted load should just replace load + (UPat(Ops.BITCAST, src=(UPat(Ops.LOAD, name="ld"),), name="bc"), lambda ctx,bc,ld: + ld.replace(dtype=f2f_dt[ctx[0]]).bitcast(bc.dtype) if ld.dtype == ctx[0] else None), + # bitcast from + (UPat(Ops.BITCAST, src=(UPat.var("x", dtypes.floats),), name="bc"), lambda ctx,bc,x: + bc.replace(src=(f2f(x.bitcast(f2f_dt[ctx[1]]), ctx[1], ctx[0]),)) if x.dtype == ctx[1] and bc.dtype.bitsize == ctx[0].bitsize else None), + # bitcast to + (UPat(Ops.BITCAST, src=(UPat.var("x"),), name="bc"), lambda ctx,bc,x: + f2f(x.bitcast(f2f_dt[ctx[0]]), ctx[0], ctx[1]) if bc.dtype == ctx[0] else None), + (UPat(Ops.CAST, dtypes.floats, src=(UPat.var("val"),), name="x"), lambda ctx,x,val: + f2f_clamp(val.cast(ctx[1]), ctx[0]) if x.dtype == ctx[0] else None), + # a CONST has no srcs to cast, it restates its value at the emulating dtype + (UPat(Ops.CONST, dtypes.floats, name="x"), lambda ctx,x: UOp.const(x.val, ctx[1]) if x.dtype == ctx[0] else None), + (UPat(GroupOp.All-GroupOp.Defines-{Ops.CAST, Ops.BITCAST, Ops.CONST}, dtypes.floats, name="x"), lambda ctx,x: + x.replace(dtype=ctx[1], src=tuple(s.cast(ctx[1]) if s.dtype == ctx[0] else s for s in x.src)) + if x.dtype == ctx[0] else None), + (UPat(Ops.STORE, src=(UPat.var("idx"), UPat(Ops.BITCAST, dtypes.floats, name="val")), name='st'), lambda ctx,st,idx,val: + st.replace(src=(idx, val.replace(dtype=f2f_dt[ctx[0]]))) if val.dtype == ctx[0] and idx.tag == ctx[0] else None), + (UPat(Ops.STORE, src=(UPat.var("idx"), UPat.var("val", dtypes.floats)), name='st'), lambda ctx,st,idx,val: + f2f_store(st, idx, val, *ctx) if val.dtype == ctx[1] and (idx:=idx.src[0] if idx.op == Ops.CAST else idx).tag == ctx[0] else None), +]) + +def do_dtype_decomps(sink:UOp, ctx:tuple[set[DType], Renderer]) -> UOp: + def _should_emulate(dt): return dt in EMULATED_DTYPES.tolist(dtypes) or dt not in ctx[1].supported_dtypes() + # NOTE: dtype decomp creates intermediate UOps that don't follow the spec (e.g. half LOAD on ushort BUFFER) + with Context(SPEC=min(SPEC.value, 1)): + for fr in sorted(filter(_should_emulate, ctx[0])): + to = dtypes.int if fr == dtypes.long else dtypes.half if not _should_emulate(dtypes.half) and fr in dtypes.fp8s else dtypes.float + if DEBUG >= 2: print(f"emulating {fr} as {to}") + pm = pm_float_decomp if fr in dtypes.floats else pm_long_decomp + sink = graph_rewrite(sink, pm, name=f"decomp {fr} -> {to}", ctx={} if pm is pm_long_decomp else (fr, to), bottom_up=True) + ctx[0].clear() + return sink + +pm_dtype_decomps = PatternMatcher([ + # detect dtypes to decompose + (UPat(GroupOp.All, (*dtypes.fp8s, dtypes.bfloat16, dtypes.half, dtypes.long, dtypes.ulong), name="x"), lambda x,ctx: + ctx[0].add({dtypes.ulong:dtypes.long}.get(dt:=x.dtype, dt))), + # do the rewrites + (UPat(Ops.SINK, name="sink"), do_dtype_decomps), +]) diff --git a/artifacts/package_runtime/tinygrad/codegen/decomp/op.py b/artifacts/package_runtime/tinygrad/codegen/decomp/op.py new file mode 100644 index 000000000..6a48cdca5 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/decomp/op.py @@ -0,0 +1,133 @@ +from typing import Callable +import functools +from tinygrad.dtype import dtypes +from tinygrad.uop.ops import UOp, UPat, Ops, PatternMatcher +from tinygrad.renderer import Renderer + +# *** integer division *** + +@functools.lru_cache(None) +def magicgu(vmax:int, d:int) -> tuple[int,int]: + # calculate m,s such that x//d == (x*m) >> s for all 0 <= x <= vmax, d>0; adapted from Hacker's Delight, Chapter 10 + nc = (vmax+1)//(d) * d - 1 + nbits = vmax.bit_length() + for s in range(0, 2*nbits + 1): + if 2**s > nc*(d - 1 - (2**s - 1) % d): + m = (2**s + d - 1 - (2**s - 1) % d)//d + return m, s + assert False + +def fast_idiv(ren: Renderer, x: UOp, d: int, dont_cast=False) -> UOp|None: + from tinygrad.renderer.cstyle import MetalRenderer + # NOTE: disable for METAL due to compiler bug. keccak with -O0 works but not with optimization + if isinstance(ren, MetalRenderer): return None + # If d is a power of two this is not valid for signed ints! + is_unsigned = x.vmin>=0 or x.dtype in dtypes.uints + assert d>0, "Sign should have been taken out of divisor" + vmin,vmax = max(x.vmin, x.dtype.min), min(x.vmax, x.dtype.max) + if vmin > -d and vmax < d: return x.const_like(0) + m,s = magicgu(max(vmax, abs(vmin)), d) + if m*vmin >= x.dtype.min and m*vmax <= x.dtype.max: + return ((x*m) >> s) if is_unsigned else ((x*m) >> s) + (x<0).where(x.ufix(1), 0) + # before we try casting to a larger dtype (slow), we see if there are powers of two in d we can shift to make x smaller + # use explicit Ops.CDIV (trunc) since the recursion assumes trunc semantics throughout + if (largest_factor_of_two_in_d := (d & -d)) > 1: + if (ret:=fast_idiv(ren, x.alu(Ops.CDIV, x.const_like(largest_factor_of_two_in_d)), + d//largest_factor_of_two_in_d, dont_cast=True)) is not None: return ret + if dont_cast: return None + # the next integer width that holds x*m + widen = {dtypes.int8:dtypes.int16, dtypes.int16:dtypes.int32, dtypes.int32:dtypes.int64, dtypes.int64:dtypes.uint64, + dtypes.uint8:dtypes.uint16, dtypes.uint16:dtypes.uint32, dtypes.uint32:dtypes.uint64} + if (next_dtype := widen.get(x.dtype)) is not None and next_dtype in ren.supported_dtypes(): + if m*vmin >= next_dtype.min and m*vmax <= next_dtype.max: + return ((x.cast(next_dtype)*m) >> s).cast(x.dtype) if is_unsigned else ((x.cast(next_dtype)*m) >> s).cast(x.dtype) + (x<0).where(x.ufix(1), 0) + return None + +# ***** threefry ***** + +def threefry2x32(x: UOp, key: UOp): + # split x and key from uint64 to two uint32 + x0, x1 = x.cast(dtypes.uint32), (x >> 32).cast(dtypes.uint32) + key0, key1 = key.cast(dtypes.uint32), (key >> 32).cast(dtypes.uint32) + + rotations = [[13, 15, 26, 6], [17, 29, 16, 24]] + ks = [key1, key0 ^ key1 ^ 0x1BD11BDA, key0] + xr:list[UOp] = [x0 + ks[-1], x1 + ks[0]] + for i in range(5): + for r in rotations[i % 2]: xr[0], xr[1] = (x0 := xr[0] + xr[1]), x0 ^ ((xr[1] << r) + (xr[1] >> (32 - r))) + xr = [(xr[0] + ks[i % 3]), (xr[1] + ks[(i + 1) % 3] + i + 1)] + + return (xr[1].cast(dtypes.uint64) << 32) | xr[0].cast(dtypes.uint64) + +# ***** decomposition patterns ***** + +def floordiv_to_idiv(a:UOp, b:UOp) -> UOp: + if (a.vmin >= 0 and b.vmin > 0) or (a.vmax <= 0 and b.vmax < 0): return a.alu(Ops.CDIV, b) + return a.alu(Ops.CDIV, b) - (a.alu(Ops.CMOD, b).ne(0) & (a<0).ne(b<0)) + +def floormod_to_mod(a:UOp, b:UOp) -> UOp: + if (a.vmin >= 0 and b.vmin > 0) or (a.vmax <= 0 and b.vmax < 0): return a.alu(Ops.CMOD, b) + r = a.alu(Ops.CMOD, b) + # use where instead of mul to avoid being fused into MULACC (which int64 long-decomp doesn't handle) + return r + (r.ne(0) & (a<0).ne(b<0)).where(b, b.const_like(0)) + +powers_of_two: dict[int, int] = {2**i:i for i in range(64)} +@functools.cache +def get_simplifying_rewrite_patterns(ops:tuple[Ops, ...]) -> PatternMatcher: + # these are rewrites that make things simpler + pat: list[tuple[UPat, Callable]] = [(UPat.var("a")//UPat.var("b"), floordiv_to_idiv)] + # FLOORMOD by 2**y -> x & (2**y-1) (correct floor mod for any sign in two's complement); fires before floormod_to_mod + if Ops.AND in ops: pat.append((UPat.var("x", dtypes.ints)%UPat.cvar("c"), lambda x,c: x & (c.val-1) if c.val in powers_of_two else None)) + pat.append((UPat.var("a")%UPat.var("b"), floormod_to_mod)) + # no real hardware supports THREEFRY, but NullRenderer does + if Ops.THREEFRY not in ops: pat.append((UPat(Ops.THREEFRY, dtype=dtypes.uint64, src=(UPat.var("x"), UPat.var("key"))), threefry2x32)) + # MAX can be rewritten as CMPLT + WHERE (max function is annoying on many cstyle backends) + if Ops.MAX not in ops and Ops.CMPLT in ops: pat.append((UPat(Ops.MAX, name="m"), lambda m: (m.src[0] < m.src[1]).where(m.src[1], m.src[0]))) + return PatternMatcher(pat) + +@functools.cache +def get_late_rewrite_patterns(ops:tuple[Ops, ...], disable_fast_idiv:bool) -> PatternMatcher: + pat: list[tuple[UPat, Callable]] = [] + if Ops.OR in ops: pat += [(UPat.var("x", dtypes.bool).logical_not()&UPat.var("y", dtypes.bool).logical_not(), + lambda x,y: (x | y).logical_not())] + # rewrite MUL/CDIV to SHL+SHR: x*(2**y) -> shl(x,y) and x//(2**y) -> shr(x,y) + if Ops.SHL in ops: pat += [(UPat.var("x", dtypes.ints)*UPat.cvar("c"), lambda c,x: x << v if (v:=powers_of_two.get(c.val, 0)) else None)] + if Ops.SHR in ops: + # uint CDIV by 2**v -> x >> v (FLOORDIV is lowered to CDIV by the rule above before reaching here) + pat += [(UPat(Ops.CDIV, src=(UPat.var("x", dtypes.uints), UPat.cvar("c"))), + lambda x,c: x >> v if (v:=powers_of_two.get(c.val, 0)) else None)] + # signed CDIV (trunc) by 2**v -> (x + (x<0 ? c-1 : 0)) >> v + pat += [(UPat(Ops.CDIV, src=(UPat.var("x", dtypes.ints), UPat.cvar("c"))), + lambda x,c: (x+(l.const_like(l.vmin) if (l:=(x<0)).vmin==l.vmax else l).where(c-1, 0)) >> v + if (v:=powers_of_two.get(c.val, 0)) else None)] + if not disable_fast_idiv: + # fast_idiv handles non-pow2: only fire on non-negative inputs (signed magic-mul is unreliable for x<0) + pat += [(UPat(Ops.CDIV, src=(UPat.var("x", dtypes.ints), UPat.cvar("d"))), + lambda ctx, x, d: fast_idiv(ctx, x, d.val) if x.vmin >= 0 or x.dtype in dtypes.uints else None)] + # rewrite raw CMOD -> x - d*CDIV(x,d) so fast_idiv can pick up the CDIV. only on non-negative inputs; + # avoids disturbing floormod_to_mod's general-path output (which uses a trunc Ops.CMOD as an implementation detail) + pat += [(UPat(Ops.CMOD, src=(UPat.var("x", dtypes.ints), UPat.var("d"))), + lambda x, d: x - d * x.alu(Ops.CDIV, d) if x.vmin >= 0 or x.dtype in dtypes.uints else None)] + if Ops.NEG in ops: + pat += [(UPat.var('x')*-1, lambda ctx,x: x.alu(Ops.NEG))] + if Ops.SUB in ops: pat += [(UPat.var('x')+UPat.var('y').alu(Ops.NEG), lambda ctx,x,y: x.alu(Ops.SUB, y))] + if Ops.CMPLT in ops: + # These are late rewrites because simplex expects equalities to be a certain format + pat += [ + ((UPat.var("x", dtypes.sints) < UPat.cvar("c")).logical_not(), lambda x,c: c-1 x==c + ] + if Ops.CMPEQ in ops: pat += [(UPat.var('x').ne(UPat.var('y')).logical_not(), lambda x,y: x.alu(Ops.CMPEQ, y))] + if Ops.MULACC in ops: + pat += [(UPat.var('a')*UPat.var('b')+UPat.var('c'), lambda a,b,c: a.alu(Ops.MULACC, b, c))] + # also fuse (x << n) + c → MULACC(x, 2^n, c) since MUL→SHL may run first + if Ops.SHL in ops: pat += [(UPat.var('x').alu(Ops.SHL, UPat.cvar('n'))+UPat.var('c'), lambda x,n,c: x.alu(Ops.MULACC, x.const_like(1< a/b + if Ops.FDIV in ops: + pat += [(UPat.var("x").reciprocal(), lambda x: x.const_like(1).alu(Ops.FDIV, x))] + pat += [(UPat.var("a", dtypes.floats) * UPat(Ops.FDIV, dtypes.floats, src=(UPat.const(1), UPat.var("b"))), lambda a,b: a.alu(Ops.FDIV, b))] + return PatternMatcher(pat) diff --git a/artifacts/package_runtime/tinygrad/codegen/decomp/transcendental.py b/artifacts/package_runtime/tinygrad/codegen/decomp/transcendental.py new file mode 100644 index 000000000..e4e66fbd5 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/decomp/transcendental.py @@ -0,0 +1,277 @@ +from typing import Callable +import math, functools +from tinygrad.dtype import dtypes, DType +from tinygrad.helpers import polyN +from tinygrad.uop.ops import UOp, UPat, Ops, PatternMatcher + +TRANSCENDENTAL_DTYPES = (dtypes.float16, dtypes.float32, dtypes.float64) + +def _lazy_map_numbers(x:UOp, inf:UOp, _inf:UOp, nan:UOp, ratio:UOp): + """replace inf -> inf, -inf -> _inf, nan -> nan, otherwise -> ratio""" + return x.ne(math.inf).where(x.ne(x).where(nan, x.ne(-math.inf).where(ratio, _inf)), inf) + +# *** helper functions for bit manipulation *** +def mantissa_bits(d:DType) -> int: return dtypes.finfo(d)[1] +def exponent_bias(d:DType) -> int: return (1 << (dtypes.finfo(d)[0] - 1)) - (0 if d in dtypes.fp8_fnuz else 1) +def exponent_mask(d:DType) -> int: return (1 << dtypes.finfo(d)[0]) - 1 + +# **** utils **** +def shr(x:UOp|int, y:UOp|int) -> UOp: return x // (2**(y.simplify().val) if isinstance(y, UOp) else 2**y) +def shl(x:UOp|int, y:UOp|int) -> UOp: return x * (2**(y.simplify().val) if isinstance(y, UOp) else 2**y) + +def rintk(d:UOp) -> UOp: + """round d:float to int away from 0""" + out_dtype = {dtypes.float64: dtypes.int64, dtypes.float32: dtypes.int32, dtypes.float16: dtypes.int16}[d.dtype] + return (d + (d<0.0).where(d.const_like(-0.5), d.const_like(0.5))).cast(out_dtype) + +def pow2if(q:UOp, float_dtype:DType): + """cast(2^q, float_dtype) where q is any integer in the range of [-126, 127]""" + out_dtype = {dtypes.int64: dtypes.float64, dtypes.int32: dtypes.float32, dtypes.int16: float_dtype}[q.dtype] + return shl(q + exponent_bias(out_dtype), mantissa_bits(out_dtype)).bitcast(out_dtype) + +def ilogb2k(d:UOp) -> UOp: + """calculate the integer part of log2(d), where d is normalized fp value in the range of [0, +inf).""" + assert d.dtype in TRANSCENDENTAL_DTYPES + dint = d.bitcast({dtypes.float64: dtypes.int64, dtypes.float32: dtypes.int32, dtypes.float16: dtypes.int16}[d.dtype]) + # -1 <= ilog2bk(d) <= 128 + return (shr(dint, mantissa_bits(d.dtype)) & exponent_mask(d.dtype)) - exponent_bias(d.dtype) + +def ldexp3k(d:UOp, e:UOp) -> UOp: + """d*2^e. e is a number obtained by casting an integer in the range [-127, 127] to a float. d is any float number.""" + assert d.dtype in TRANSCENDENTAL_DTYPES and e.dtype in TRANSCENDENTAL_DTYPES + dtype = {dtypes.float64: dtypes.int64, dtypes.float32: dtypes.int32, dtypes.float16: dtypes.int16}[d.dtype] + m1 = d.bitcast(dtype) + m2 = shl(e.cast(dtype), mantissa_bits(d.dtype)) + return (m1 + m2).bitcast(d.dtype) + +def ldexp2k(d:UOp, e:UOp) -> UOp: + """d*2^e. much faster than ldexp3k but risky. d > 0 and d is not denormal.""" + assert d.dtype in TRANSCENDENTAL_DTYPES and e.dtype in (dtypes.int16, dtypes.int32, dtypes.int64) + return (d * pow2if(shr(e, 1), d.dtype)) * pow2if(e - shr(e, 1), d.dtype) + +def frexp(v:UOp) -> tuple[UOp, UOp]: + """frexp(v) -> (mantissa, exponent) assuming v != 0""" + assert v.dtype in TRANSCENDENTAL_DTYPES + # m1 = masks for mantissa, m2 = masks to normalize the mantissa. + m1 = {dtypes.float64: 0x000FFFFFFFFFFFFF, dtypes.float32: 0x807FFFFF, dtypes.float16: 0x83FF}[v.dtype] + m2 = {dtypes.float64: 0x3FE0000000000000, dtypes.float32: 0x3F000000, dtypes.float16: 0x3800}[v.dtype] + bits = v.bitcast({dtypes.float64: dtypes.uint64, dtypes.float32: dtypes.uint32, dtypes.float16: dtypes.uint16}[v.dtype]) + exponent = shr(bits, mantissa_bits(v.dtype)) & exponent_mask(v.dtype) + # Set the exponent bits appropriately to normalize the mantissa into the range of [0.5, 1.0). + mantissa = ((bits & m1) | m2).bitcast(v.dtype) + exp = exponent - exponent_bias(v.dtype) + 1 + return mantissa, exp + +# *** reduction algorithms for sine *** +def payne_hanek_reduction(d:UOp) -> tuple[UOp, UOp]: + """ + Performs Payne-Hanek Reduction: computes the remainder of `d` modulo pi/2 for the values `d` where + 39800.0 <= d <= +Inf + Returns a tuple of `(r, q)`: + - `r`[d.dtype] is the reminder value corresponding to `round_to_nearest(x % pi/2)`. + - `q`[int32] is an integer, and q % 4 is corresponding to the quadrant of the original angle `d`. + """ + assert d.dtype in TRANSCENDENTAL_DTYPES + # https://stackoverflow.com/questions/30463616/payne-hanek-algorithm-implementation-in-c/30465751#30465751 + # 190 bits of 2/pi for Payne-Hanek style argument reduction + two_over_pi_f = [0x00000000, 0x28be60db, 0x9391054a, 0x7f09d5f4, 0x7d4d3770, 0x36d8a566, 0x4f10e410] + + intermediate_dtype = dtypes.float32 if d.dtype == dtypes.float16 else d.dtype + + f, e = frexp(d) + ia = (f.cast(intermediate_dtype) * 4.294967296e9).cast(dtypes.uint64) + # extract 96 relevant bits of 2/pi based on magnitude of argument + i = shr(e.cast(dtypes.uint64), 5) + e = e.cast(dtypes.int32) & 31 + offset = 32 - e + + def _take(an:UOp, offset:int, count:int=0) -> UOp: + """an = two_over_pi_f[i+offset]""" + if count+offset < len(two_over_pi_f) - 1: + an = i.ne(count).where(_take(an, offset, count=count+1), an.const_like(two_over_pi_f[count+offset])) + return an + def _shl_lazy(x:UOp, y:UOp): return (x.cast(dtypes.uint64) * pow2if(y, d.dtype).cast(dtypes.uint64)).cast(dtypes.uint32) + def _shr_lazy(x:UOp, y:UOp): return (x.cast(dtypes.uint64) // pow2if(y, d.dtype).cast(dtypes.uint64)).cast(dtypes.uint32) + + a = [_take(UOp.const(0, dtypes.uint32), i) for i in range(4)] + # (two_over_pi_f[Int(i) + n] << e) | (two_over_pi_f[Int(i) + n+1] >> (nbits - e)) + # Note: e >= 1 for all numbers d >= 1.0. assume e != 0 + hi = _shl_lazy(a[0], e) | _shr_lazy(a[1], offset) + mi = _shl_lazy(a[1], e) | _shr_lazy(a[2], offset) + lo = _shl_lazy(a[2], e) | _shr_lazy(a[3], offset) + + def _hp_mul(x:UOp, y:UOp) -> UOp: return x.cast(dtypes.uint64) * y.cast(dtypes.uint64) + # compute x * 2/pi + p = shl(_hp_mul(ia, hi), 32) + _hp_mul(ia, mi) + shr(_hp_mul(ia, lo), 32) + + # round quotient to nearest + q = shr(p, 62).cast(dtypes.int32) + p = p & 0x3fffffffffffffff + r = (p.cast(intermediate_dtype) * (3.4061215800865545e-19)).cast(d.dtype) + + # if fraction >= 0.5, r -= pi/2, q += 1 + return (f<0.5).where(r, r - math.pi/2), (f<0.5).where(q, q + 1) + +def cody_waite_reduction(d:UOp) -> tuple[UOp, UOp]: + """ + Performs Cody-Waite Reduction: computes the reminder of `d` modulo pi/2 for the values `d` where + 0 <= abs(d) <= 39800.0 + Returns a tuple of `(r, q)`, where the output format is the same as that of `payne_hanek_reduction`. + """ + def _reduce_d(x:UOp, q:UOp): + # https://github.com/shibatch/sleef/blob/4e08851f59fc2b545f9c393c6a23dfd311a26308/src/libm/sleefdp.c#L789-L823 + if x.dtype == dtypes.float64: + # https://github.com/shibatch/sleef/blob/f6d8a841fbfddd26ce712834d4da220cd76048fb/src/common/misc.h#L77 + PI_A, PI_B, PI_C, PI_D = 3.1415926218032836914, 3.1786509424591713469e-08, 1.2246467864107188502e-16, 1.2736634327021899816e-24 + d = qdh * -PI_A + x + d = q * -PI_A + d + d = qdh * -PI_B + d + d = q * -PI_B + d + d = qdh * -PI_C + d + d = q * -PI_C + d + d = (qdh + q) * -PI_D + d + elif x.dtype == dtypes.float16: + # [FIXME] when reducing `d`, FP16 needs FP32 precision to achieve 1.0 ULP precision. + d = _reduce_d(x.cast(dtypes.float32), q.cast(dtypes.float32)).cast(dtypes.float16) + else: + # https://github.com/shibatch/sleef/blob/4e08851f59fc2b545f9c393c6a23dfd311a26308/src/libm/sleefsp.c#L464-L503 + d = q * -3.1414794921875 + x + d = q * -0.00011315941810607910156 + d + d = q * -1.9841872589410058936e-09 + d + d = q * -1.2154201256553420762e-10 + d + return d + + m_1_pi = 0.318309886183790671537767526745028724 + qdh = (d * (m_1_pi / 2.0**24)).cast(dtypes.int64).cast(d.dtype) * (2.0**24) + quadrant = rintk(d * m_1_pi -qdh) if d.dtype == dtypes.float64 else rintk(d * m_1_pi) + return _reduce_d(d, quadrant.cast(d.dtype)), quadrant.cast(dtypes.int32) + +# *** approximate sine on small angle. *** +def trig_poly(d:UOp, coeff32, coeff64): return d * (polyN(d*d, coeff64) if d.dtype == dtypes.float64 else polyN(d*d, coeff32)) +# approximate sine on [-pi/2, pi/2] +def sin_poly(d:UOp) -> UOp: + return trig_poly(d, [2.6083159809786593541503e-06, -0.0001981069071916863322258, 0.00833307858556509017944336, -0.166666597127914428710938, 1.0], + [-7.97255955009037868891952e-18, 2.81009972710863200091251e-15, -7.64712219118158833288484e-13, 1.60590430605664501629054e-10, + -2.50521083763502045810755e-08, 2.75573192239198747630416e-06, -0.000198412698412696162806809, 0.00833333333333332974823815, + -0.166666666666666657414808, 1.0]) + +def _ifand(q:UOp, n:int): return (q & n).ne(0) + +def sin_poly_small(d:UOp, q:UOp) -> UOp: + r = sin_poly(d) + return r * _ifand(q, 1).where(r.const_like(-1), r.const_like(1)) + +def sin_poly_large(d:UOp, q:UOp) -> UOp: + r = sin_poly(d + _ifand(q, 1).where(d.const_like(math.pi / 2), d.const_like(0))) + return r * _ifand(q, 2).where(r.const_like(-1), r.const_like(1)) + +# *** toplevel functions for xsin/xlog2/xexp2 *** + +def xsin(d:UOp, fast:bool=False, switch_over:float=30.0) -> UOp: + """ + Implements a 1.0 ULP approximation for Ops.SIN. + - fast=True assumes x <= switch_over. + - switch_over is the threshold for switching to payne_hanek_reduction. + """ + assert d.dtype in TRANSCENDENTAL_DTYPES + # mask +-inf/nan as zero + x = _lazy_map_numbers(d, d.const_like(0.0), d.const_like(0.0), d.const_like(0.0), d) + # x_sign = sign(x) + x_sign = x.ne(0).where((x<0).where(x.const_like(-1), x.const_like(1)), x.const_like(0)) + x_abs = x * x_sign + r, q = (cody_waite_reduction if fast else payne_hanek_reduction)(x_abs) + if fast: result = sin_poly_small(r, q) + else: + # Payne Hanek Reduction assumes abs(x) >= pi/4, so for smaller values, use cody_waite_reduction. + r_small, q_small = cody_waite_reduction(x_abs) + result = (x_abs UOp: + """ + Implements a 1.0 ULP approximation for Ops.EXP2 + - Paper: https://arxiv.org/pdf/2001.09258 + """ + assert d.dtype in TRANSCENDENTAL_DTYPES + # mask +=inf/nan as zero. + x = _lazy_map_numbers(d, d.const_like(0.0), d.const_like(0.0), d.const_like(0.0), d) + q = rintk(x) + # s = d - round(d) + s = x - q + # a polynomial approximation with 13 non-zero terms in the range of [−(log 2)/2,(log 2)/2]. + if d.dtype == dtypes.float64: + u = polyN(s, [0.4434359082926529454e-9, 0.7073164598085707425e-8, 0.1017819260921760451e-6, 0.1321543872511327615e-5, 0.1525273353517584730e-4, + 0.1540353045101147808e-3, 0.1333355814670499073e-2, 0.9618129107597600536e-2, 0.5550410866482046596e-1, 0.2402265069591012214e+0, + 0.6931471805599452862e+0, 0.1000000000000000000e+1]) + else: u = polyN(s, [0.1535920892e-3, 0.1339262701e-2, 0.9618384764e-2, 0.5550347269e-1, 0.2402264476e+0, 0.6931471825e+0, 1.0]) + u = ldexp2k(u, q) # u*2^q + upper, lower = {dtypes.float64: (1024, -2000), dtypes.float32: (128, -150), dtypes.float16: (23, -22)}[d.dtype] + # Replace x >= upper with +inf + u = (d >= upper).where(d.const_like(math.inf), u) + # Replace x < lower with zero. + u = (d UOp: + """ + Implements a 1.0 ULP approximation for Ops.LOG2 + Paper: https://arxiv.org/pdf/2001.09258 5.5 + """ + assert d.dtype in TRANSCENDENTAL_DTYPES + # float16 uses 2^10 for denormal scaling (2^64 overflows), float32/64 use 2^64 + denormal_exp = 10 if d.dtype == dtypes.float16 else 64 + FLT_MIN = d.const_like({dtypes.float16: 6.1e-5, dtypes.float32: 1e-4, dtypes.float64: 1e-4}[d.dtype]) + is_denormal = d UOp: + # start with b ** e = exp2(e * log2(b)) + ret = (base < 0).where(-base, base).log2().mul(exponent).exp2() + # negative base: nan for non-integer exponent, negate for odd integer exponent. -inf is never nan, it stays |base| ** exponent + non_int = exponent != exponent.cast(dtypes.int32).cast(exponent.dtype) + is_odd = (exponent < 0).where(-exponent, exponent).cast(dtypes.int32).mod(2).cast(dtypes.bool) + neg_base = non_int.where(base.ne(-math.inf).where(ret.const_like(math.nan), ret), is_odd.where(-ret, ret)) + # x ** 0 = 1, including 0 ** 0 and inf ** 0 + return exponent.eq(0).where(ret.const_like(1), (base < 0).where(neg_base, ret)) + +@functools.cache +def get_transcendental_patterns(ops:tuple[Ops, ...], force_transcendental:bool) -> PatternMatcher: + pat: list[tuple[UPat, Callable]] = [] + for op,f in ((Ops.EXP2, xexp2), (Ops.LOG2, xlog2), (Ops.SIN, xsin)): + if op not in ops or force_transcendental: + pat += [(UPat(op, dtype=TRANSCENDENTAL_DTYPES, src=(UPat.var("d"),)), f), + (UPat(op, dtype=tuple(dt for dt in dtypes.floats if dt not in TRANSCENDENTAL_DTYPES), src=(UPat.var("d"),), name="x"), + lambda x,d: d.cast(dtypes.float32).alu(x.op).cast(x.dtype))] + # rewrite SQRT to xpow 0.5 + if Ops.SQRT not in ops or force_transcendental: pat.append((UPat(Ops.SQRT, src=UPat.var("d")), lambda d: xpow(d, d.const_like(0.5)))) + return PatternMatcher(pat) diff --git a/artifacts/package_runtime/tinygrad/codegen/gpudims.py b/artifacts/package_runtime/tinygrad/codegen/gpudims.py new file mode 100644 index 000000000..0a22c5687 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/gpudims.py @@ -0,0 +1,101 @@ +import math +from tinygrad.uop.ops import UOp, Ops, sint, PatternMatcher, UPat, KernelInfo, ssimplify, AxisType +from tinygrad.dtype import dtypes, AddrSpace +from tinygrad.renderer import Renderer + +def _dim_max(d:sint) -> int: return d if isinstance(d, int) else int(d.vmax) + +def _group_dims(dims:tuple[sint, ...], max_sizes:tuple[int, ...]): + while len(dims) > len(max_sizes) or any(d > m for d,m in zip(dims, max_sizes)): + for i,m in enumerate(max_sizes): + if i < (len(dims)-1) and _dim_max(dims[i]) * _dim_max(dims[i+1]) <= m: + dims = dims[:i] + (dims[i]*dims[i+1],) + dims[i+2:] + break + else: return None + return dims + +def _split_dims(dims, max_sizes): + if all(d <= m for d,m in zip(dims, max_sizes)): return dims + _dims = list(dims) + [1]*(3-len(dims)) + for i in range(len(_dims)): + while _dims[i] > max_sizes[i]: + div = next((d for d in range(2, math.ceil(math.sqrt(_dims[i])) + 1) if (_dims[i] % d) == 0), 1) + if div == 1: raise RuntimeError(f"cannot limit dim {dims=}, {max_sizes=}") + _dims[i], _dims[(i+1)%len(_dims)] = _dims[i]//div, _dims[(i+1)%len(_dims)]*div + return tuple(_dims[:2] if _dims[2] == 1 else _dims) + +def get_grouped_dims(prefix, dims:tuple[sint, ...], max_sizes:tuple[int, ...]|None, reverse=False) -> list[UOp]: + if reverse: return get_grouped_dims(prefix, dims[::-1], max_sizes)[::-1] + if max_sizes is None: limited = dims + else: + # try to group first: (a, b, c, d) -> (ab, c, d) + limited = grouped if (grouped := _group_dims(dims, max_sizes)) else dims + # check if grouping failed + if len(limited) > len(max_sizes): raise RuntimeError(f"cannot limit dim {dims=}, {max_sizes=}") + # try to split up dims: (a,) -> (b, c) + if limited == dims: limited = _split_dims(dims, max_sizes) + raw_idxs = [UOp.special(s, f"{prefix}{i}") for i,s in enumerate(limited)] + flat = sum(idx * math.prod(limited[i+1:]) for i,idx in enumerate(raw_idxs)) + return [ssimplify(flat // math.prod(dims[i+1:])) if i == 0 else ssimplify((flat // math.prod(dims[i+1:])) % dims[i]) for i in range(len(dims))] + +def add_gpudims(ctx:Renderer, s:UOp): + if s.arg is None: return None + s_topo = list(s.toposort()) + if any(x.op is Ops.SPECIAL for x in s_topo): return None + + # get ranges + all_ranges = {x.arg[0:-1]:x for x in s_topo if x.op is Ops.RANGE} + + # extract global/local dims + global_dims = sorted([x.arg[0:-1] for x in all_ranges.values() if x.arg[-1] in (AxisType.GLOBAL, AxisType.THREAD)]) + local_dims = sorted([x.arg[0:-1] for x in all_ranges.values() if x.arg[-1] in (AxisType.WARP, AxisType.LOCAL, AxisType.GROUP_REDUCE)]) + if not global_dims and not local_dims: return None + + # get global and local shape + global_shape = tuple(ssimplify(all_ranges[r].src[0]) for r in global_dims) + local_shape = tuple(ssimplify(all_ranges[r].src[0]) for r in local_dims) + + # get the idxs + ki: KernelInfo = s.arg + if ctx.has_threads: idxs = [UOp.variable("core_id", 0, int(global_shape[0])-1, dtypes.int).cast(dtypes.weakint)] + elif ki.dont_use_locals: + assert not local_dims, "can't use locals if there's no local dims" + idxs = get_grouped_dims("idx", global_shape, ctx.global_max, reverse=True) + else: + # define indexes for GPU-like execution + local_idxs = get_grouped_dims("lidx", local_shape, ctx.local_max) + hw_local = [_dim_max(u.src[0]) for u in local_idxs if u.op is Ops.SPECIAL] + global_max = ctx.global_max if ctx.global_prod_max is None else \ + tuple(min(gm, pm//l) for gm,pm,l in zip(ctx.global_max or ctx.global_prod_max, ctx.global_prod_max, hw_local+[1]*3)) + idxs = get_grouped_dims("gidx", global_shape, global_max, reverse=True) + local_idxs + + # apply to multiple ranges + subs = {} + for r in s_topo: + # look for local INDEXes that are not used in the GLOBAL store, then add them as an INVALID + if r.op is Ops.STORE and (idx := r.src[0]).src[0].addrspace == AddrSpace.GLOBAL: + missing_locals = [all_ranges[rng] for rng in local_dims if all_ranges[rng] not in idx.ranges] + if len(missing_locals): + assert len(idx.src) == 2, "index has 2 sources" + mask: UOp = UOp.uprod(*[x.eq(0) for x in missing_locals]) + subs[idx] = idx.replace(src=(idx.src[0], idx.src[1].valid(mask))) + if r.op is not Ops.RANGE: continue + try: + ii = (global_dims+local_dims).index(r.arg[0:-1]) + if r.arg[1] == AxisType.REDUCE: continue + subs[r] = idxs[ii] + except ValueError: continue + return s.substitute(subs) + +pm_device_to_var = PatternMatcher([ + # the DEVICE axis is not a program axis, it's bound per device at launch. lower it to the _device_num variable (like SPECIAL for devices) + (UPat(Ops.RANGE, name="r"), lambda r: UOp.variable("_device_num", 0, r.vmax, dtype=r.dtype) if r.arg[-1] is AxisType.DEVICE else None), + # ENDs that closed a DEVICE range no longer close it + (UPat(Ops.END, name="e"), lambda e: e.replace(src=(e.src[0],)+tuple(s for s in e.src[1:] if s.op is not Ops.PARAM)) + if any(s.op is Ops.PARAM and s.arg.name == '_device_num' for s in e.src[1:]) else None), +]) + +pm_add_gpudims = PatternMatcher([ + # add gpudims must be last + (UPat(Ops.SINK, name="s"), add_gpudims), +])+pm_device_to_var diff --git a/artifacts/package_runtime/tinygrad/codegen/late/__init__.py b/artifacts/package_runtime/tinygrad/codegen/late/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/codegen/late/coalesce.py b/artifacts/package_runtime/tinygrad/codegen/late/coalesce.py new file mode 100644 index 000000000..47ec32801 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/late/coalesce.py @@ -0,0 +1,165 @@ +import itertools, functools +from collections import defaultdict +from tinygrad.dtype import dtypes, AddrSpace, Invalid, DType +from tinygrad.uop.ops import UOp, Ops, PatternMatcher, UPat, GroupOp, shape_to_shape_arg +from tinygrad.uop.symbolic import uop_given_valid, parse_valid, invalid_gate +from tinygrad.helpers import getenv, IMAGE, OSX, ceildiv, is_image_shape +from tinygrad.renderer import Renderer + +# ***** image load valid simplification ***** + +@functools.cache +def _drop_valid_stmts(valid:UOp, idx:UOp, height:int, width:int) -> list[UOp]: + # can drop valid if idx is out of bound when valid is False + drop_stmt = [] + for i,stmt in enumerate(valid.split_uop(Ops.AND)): + if (res:=parse_valid(stmt)) is None: continue + X, is_upper_bound, c = res + + # for X0 + X1 + ... >= 1, check if it's out of bound when Xi = 0 for all i + if not is_upper_bound and c == 1 and all(u.op in GroupOp.Irreducible and u.vmin == 0 for u in X.split_uop(Ops.ADD)): + testidx = functools.reduce(lambda nowidx,u: nowidx.substitute({u:u.const_like(0)}), X.split_uop(Ops.ADD), idx) + if testidx.index(0).vmax < 0 or testidx.index(1).vmax < 0: + drop_stmt.append(stmt) + continue + + # check if idx is out of bound when X is on the wrong side of the bound: X in [c+1, vmax] or [vmin, c-1] + lo, hi = (c + 1, X.vmax) if is_upper_bound else (X.vmin, c - 1) + if lo <= hi: + fake = UOp.variable(f"fake{i}", lo, hi, X.dtype) + for coord,b in zip(idx.src, (width, height)): + rw = coord.substitute({X:fake}).simplify() + if rw.vmin >= b or rw.vmax < 0: + drop_stmt.append(stmt) + break + return drop_stmt + +def simplify_valid_load(buf:UOp, start_idx:UOp, valid:UOp) -> UOp|None: + idx = uop_given_valid(valid, start_idx) + return None if idx is start_idx or idx is start_idx.simplify() else buf.index(idx.valid(valid)) + +def simplify_valid_image_load(buf:UOp, idx_y:UOp, idx_x:UOp, valid:UOp) -> UOp|None: + if not is_image_shape(buf._shape): return None + if idx_x.dtype != idx_y.dtype: idx_x, idx_y = idx_x.cast(dtypes.int), idx_y.cast(dtypes.int) + start_idx = idx_x.stack(idx_y) + idx = uop_given_valid(valid, start_idx) + drop_stmt = _drop_valid_stmts(valid, idx, buf._shape[0], buf._shape[1]) + + if not drop_stmt and idx is start_idx: return None + new_valid = UOp.uprod(*ss) if (ss:=[s for s in valid.split_uop(Ops.AND) if s not in drop_stmt]) else None + idx_y, idx_x = idx.index(1), idx.index(0) + if new_valid is not None: return buf.index(idx_y.valid(new_valid), idx_x.valid(new_valid), dtype=dtypes.float) + return buf.index(idx_y, idx_x, dtype=dtypes.float) + +indexing_simplify = PatternMatcher([ + # image load valid idx simplification + (UPat(Ops.INDEX, src=(UPat.var("buf"), invalid_gate)), lambda buf,x,i,cond: simplify_valid_load(buf, x, cond)), + (UPat(Ops.INDEX, src=(UPat.var("buf"), UPat.var("valid").where(UPat.var("idx_y"), UPat(arg=Invalid)), + UPat.var("valid").where(UPat.var("idx_x"), UPat(arg=Invalid)))), simplify_valid_image_load), +]) + +# get list of (height, width) that do not require pitch padding +def image_valid_dims(base:DType, size:int, arch:str) -> list[tuple[int,int]]: + if (ALIGN:=next((int(p.split('=')[1]) for p in arch.split(',') if p.startswith("IMAGE_PITCH_ALIGNMENT=")), 0)) == 0: return [] + MAXW, pxls = 16384, size // 4 + if base not in (dtypes.half, dtypes.float) or size > 4*MAXW*MAXW: return [] + # height=1 images just need to abide by alignment requirements in bytes, not pixels! + if size % (ALIGN * 4) != 0: return [] if (base.itemsize * size) % (64 if OSX else ALIGN) != 0 or pxls > MAXW else [(1, pxls)] + return [(pxls//ALIGN//k, ALIGN*k) for k in range(ceildiv(pxls//ALIGN, MAXW), min(pxls//ALIGN, MAXW//ALIGN)+1) if (pxls//ALIGN)%k == 0] + +def transform_to_image(ctx, buf:UOp, x:UOp) -> UOp|None: + shapes, ren = ctx + if not IMAGE or ren.target.device not in {"QCOM", "CL", "PYTHON", "NULL"}: return None + valid, x = x.get_valid(), x.get_idx() + # search for dims that drop the most valid statements + best_drop, cands = -1, [] + for ch, cw in [shapes[buf.arg.slot]] if buf.arg.slot in shapes else image_valid_dims(buf.dtype, buf.max_numel(), ren.target.arch): + cidx = uop_given_valid(valid, ((x//4)%cw).stack(x//(4*cw))) + dropped = len(_drop_valid_stmts(valid, cidx, ch, cw)) + if dropped > best_drop: best_drop, cands = dropped, [(ch, cw, cidx)] + elif dropped == best_drop: cands.append((ch, cw, cidx)) + # if no candidates, we don't rewrite + if len(cands) == 0: return None + # and tiebreak with indexing complexity (ie. number of nodes) + h, w, cidx = cands[0] if len(cands) == 1 else min(cands, key=lambda cand: len(cand[2].index(1).simplify().backward_slice)) + buf = buf.replace(src=(shape_to_shape_arg((h, w, 4)),)) + shapes[buf.arg.slot] = (h, w) + if valid.op is not Ops.CONST or valid.val is not True: + return buf.index(cidx.src[1].valid(valid), cidx.src[0].valid(valid), dtype=dtypes.float) + else: + return buf.index(cidx.src[1], cidx.src[0], dtype=dtypes.float) + +pm_simplify_add_image = PatternMatcher([ + (UPat(Ops.SHRINK, src=(UPat(Ops.PARAM, name="buf"), UPat(name="x"), UPat(arg=4))), transform_to_image), + # image load/store is always float + (UPat(Ops.INDEX, dtype=dtypes.float, name="x").load(dtype=dtypes.half), lambda x: x.load().cast(dtypes.half)), + (UPat(Ops.INDEX, dtype=dtypes.float, name="x").store(UPat(name="d", dtype=dtypes.half)), lambda x,d: x.store(d.cast(dtypes.float))), + (UPat.var("x", dtype=dtypes.float).cast(dtypes.half).cast(dtypes.float), lambda x: x), +]) + +def memory_coalescing(sink:UOp, ctx:Renderer) -> UOp: + if getenv("DMC"): return sink + + # collect + memory: defaultdict[tuple[Ops, UOp, UOp|str, UOp], dict[int, list[UOp]]] = defaultdict(dict) + for u in sink.toposort(): + # TODO: this should handle images too, it's just memory coalescing + if u.op in {Ops.LOAD, Ops.STORE}: + assert len(u.src) == (2 if u.op is Ops.STORE else 1), "memory coalescing does not support gated loads/stores" + assert u.src[0].op is Ops.INDEX, f"memory coalescing should be on INDEX, not {u.src[0].op}" + buf, idx_u = u.src[0].src + if buf.addrspace == AddrSpace.REG: continue + idx, valid = idx_u.get_idx(), idx_u.get_valid() + root_src: UOp|str + if idx.op is Ops.ADD and idx.src[1].op is Ops.CONST: root_src, arg = idx.src[0], idx.src[1].val + elif idx.op is Ops.ADD and idx.src[0].op is Ops.CONST: root_src, arg = idx.src[1], idx.src[0].val + elif idx.op is Ops.CONST and idx.val is Invalid: root_src, arg = "INVALID", 0 + elif idx.op is Ops.CONST: root_src, arg = "CONST", idx.val + else: root_src, arg = idx, 0 + memory[(u.op, buf, root_src, valid)].setdefault(arg, []).append(u) + + # build replacements + replacements = {} + for (op,buf,base,valid),offsets in memory.items(): + # allowed lengths (copied in) + lengths = [] + must_divide = True + if ctx is not None and ctx.target.device == "DSP": + lengths = [128,64,32,16,8,4] + must_divide = False + elif buf.dtype not in (dtypes.float, dtypes.half, dtypes.int, dtypes.uint, *dtypes.fp8s) and not is_image_shape(buf._shape): + pass + elif buf.addrspace == AddrSpace.REG: + pass + elif is_image_shape(buf._shape): + lengths = [4] + elif ctx is not None and ctx.supports_float4: + # TODO: a better way to get this than ctx + lengths = [8,4,2] if buf.dtype == dtypes.half and getenv("ALLOW_HALF8") else [4,2] + lengths.append(1) # worst case, it's not folded + # do the grouping + grouped_offsets = [[x for _,x in group] for _,group in itertools.groupby(enumerate(sorted(offsets.keys())), lambda x: x[1]-x[0])] + for full_grp in grouped_offsets: + while len(full_grp): + offset = (base+full_grp[0]) if isinstance(base, UOp) else UOp.const(full_grp[0]) + length = [l for l in lengths if l <= len(full_grp) and (not must_divide or offset.divides(l) is not None)][0] + grp = full_grp[:length] + # NOTE: we apply the valid again after we determine the length + offset = offset.valid(valid) if valid is not None else offset + idx = UOp(Ops.SHRINK, src=(buf, offset, UOp.const(len(grp)))) if len(grp) > 1 else buf.index(offset) + if op == Ops.STORE: + datas = [] + for i,g in enumerate(grp): + assert len(offsets[g]) == 1, f"attempting multiple stores: {len(offsets[g])}" + datas.append(offsets[g][0].src[1]) + store = idx.store(UOp.stack(*datas) if len(datas) > 1 else datas[0]) + for i,g in enumerate(grp): replacements[offsets[g][0]] = store + else: + ld = idx.load() + for i,g in enumerate(grp): + for oo in offsets[g]: + replacements[oo] = ld.index(i) if len(grp) > 1 else ld + full_grp = full_grp[length:] + + # apply + return sink.substitute(replacements, name="memory coalescing") diff --git a/artifacts/package_runtime/tinygrad/codegen/late/gater.py b/artifacts/package_runtime/tinygrad/codegen/late/gater.py new file mode 100644 index 000000000..b9b3a4efb --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/late/gater.py @@ -0,0 +1,29 @@ +# this is a temporary intermediate step while we remove this index style +from tinygrad.uop.ops import PatternMatcher, UPat, Ops +from tinygrad.dtype import Invalid, dtypes + +def move_where_load(gate, l, a, w): + return l.replace(src=(l.src[0], l.vconst_like(0) if a.is_invalid else + a.src[0] if a.op is Ops.CAST and a.src[0].dtype == l.dtype else a.cast(l.dtype), l.src[2])).cast(w.dtype) + +pm_move_gates_from_index = PatternMatcher([ + # for image idx (must be first) + (UPat.var("buf").index(UPat.var("gate").where(UPat.var("idx_y"), UPat(arg=Invalid)), + UPat.var("gate").where(UPat.var("idx_x"), UPat(arg=Invalid))).load(name="l"), + lambda buf,gate,idx_y,idx_x,l: buf.index(idx_y, idx_x, dtype=dtypes.float).load(l.vconst_like(0), gate)), + (UPat.var("buf").index(UPat.var("gate").where(UPat.var("idx_y"), UPat(arg=Invalid)), + UPat.var("gate").where(UPat.var("idx_x"), UPat(arg=Invalid))).store(UPat.var("data")), + lambda buf,gate,idx_y,idx_x,data: buf.index(idx_y, idx_x, dtype=dtypes.float).store(data, gate)), + + # here we create the alt value for load to be 0s and remove the where Invalid + (UPat((Ops.INDEX, Ops.SHRINK), src=(UPat(), UPat.var("gate").where(UPat.var("idx"), UPat(arg=Invalid)),), name="mop", allow_any_len=True) \ + .load(name="l"), lambda mop,gate,idx,l: mop.replace(src=(mop.src[0],idx)+mop.src[2:]).load(l.vconst_like(0), gate)), + (UPat((Ops.INDEX, Ops.SHRINK), src=(UPat(), UPat.var("gate").where(UPat.var("idx"), UPat(arg=Invalid)),), name="mop", allow_any_len=True) \ + .store(UPat.var("data")), lambda mop,gate,idx,data: mop.replace(src=(mop.src[0],idx)+mop.src[2:]).store(data, gate)), + + # Where after gated load becomes alt value + (UPat.var("gate").where(UPat().load(UPat(), UPat.var("gate", dtype=dtypes.bool), name="l").or_casted(), UPat.var("a")).named("w"), + move_where_load), + (UPat.var("gate").where(UPat.var("a"), UPat().load(UPat(), ~UPat.var("gate", dtype=dtypes.bool), name="l").or_casted()).named("w"), + move_where_load), +]) diff --git a/artifacts/package_runtime/tinygrad/codegen/late/linearizer.py b/artifacts/package_runtime/tinygrad/codegen/late/linearizer.py new file mode 100644 index 000000000..e16778a36 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/late/linearizer.py @@ -0,0 +1,95 @@ +import heapq +from typing import Any +from collections import defaultdict +from tinygrad.uop.ops import PatternMatcher, UOp, Ops, UPat, multirange_str +from tinygrad.dtype import AddrSpace, dtypes +from tinygrad.helpers import prod, getenv, TUPLE_ORDER + +def linearize(sink:UOp) -> list[UOp]: + # this is a toposort with priority + lst = list(sink.toposort()) + out_degree:defaultdict[UOp, int] = defaultdict(int) + priorities:dict[UOp, tuple[int, int, Any]] = {} + + # get consumers and assign priorities + # NOTE: this requires the lst be locally toposorted + for u in reversed(lst): + for s in u.src: out_degree[s] += 1 + + # we place UOps with higher run_counts later + run_count = prod([int(r.vmax)+1 for r in u.ranges]) + + # simple priority override. this is all bottom up now, smaller numbers will be closer to the top + extra = None + match u.op: + # the order and placement of these defines is important + case Ops.PARAM: priority, extra = -20, u.arg.slot + case Ops.BUFFER: priority = -17 if u.addrspace == AddrSpace.LOCAL else -18 + case Ops.LOAD: priority = -1 # place loads early + case Ops.STORE: priority = 1 # place stores late + case Ops.RANGE: priority = 5 # placing RANGE is good + case Ops.END: priority = -5 # placing END is bad + case _: priority = 0 # everything else has priority 0 + priorities[u] = (run_count, priority, extra) + + # number the uops in "ideal" order + nkey = {u:i for i,u in enumerate(sorted(lst, key=lambda x: priorities[x]+(x.tuplize if TUPLE_ORDER else ())))} + + # then force them to be toposorted in as close to the ideal order as possible + heap = [(-nkey[sink], sink)] + newlst = [] + while heap: + newlst.append(u:=heapq.heappop(heap)[1]) + for v in u.src: + out_degree[v] -= 1 + if out_degree[v] == 0: heapq.heappush(heap, (-nkey[v],v)) + newlst = newlst[::-1] + + if getenv("DEBUG_LINEARIZE"): + for i,u in enumerate(newlst): + print(f"{i:4d} {str(u.op):20s} {multirange_str(u.ranges, color=True, pad=10)} {priorities[u]}") + return newlst + +class CFGContext: + def __init__(self, sink:UOp): + # there are 3 relationships between ranges: + # nested, meaning endrange y is a dependency of endrange x and range x is a dependency of endrange y + # dependent, meaning endrange y is a dependency of endrange x and range x is not a dependency of endrange y + # independent, endrange y is not a dependency of endrange x + # everything is nested inside the sink + deps: dict[UOp, dict[UOp, None]] = {} + nesting: dict[UOp, UOp] = {} + for u in sink.toposort(): + # get the deps from the src + deps[u] = {} + for s in u.src: deps[u] |= deps[s] + + if u.op in (Ops.END, Ops.SINK): + nesting |= {x:u for x in deps[u] if x.op is Ops.END and (u.op is Ops.SINK or u.src[1] in deps[x]) and x not in nesting} + if u.op in (Ops.RANGE, Ops.END): deps[u][u] = None + + self.edges: dict[UOp, UOp] = {} + siblings: dict[UOp, list[UOp]] = {} + for k,vv in nesting.items(): siblings.setdefault(vv, []).append(k) + for k,v in siblings.items(): + # ranges that have dependencies on other siblings need to be scheduled after them + order = sorted(v, key=lambda x: len([u for u in v if u in deps[x]])) + zipped = zip(order, order[1:]) if k.op is Ops.SINK else zip([k.src[1]] + order, order) + for x,y in zipped: + # TODO: this can happen! it causes infinite loop in shufflenet + assert y.src[1] not in x.backward_slice_with_self + self.edges[y.src[1]] = x + +pm_add_control_flow = PatternMatcher([ + (UPat(Ops.RANGE, name="x"), lambda ctx,x: x.replace(src=x.src+(y,)) if (y:=ctx.edges.get(x)) is not None else None), +]) + +def do_split_ends(e:UOp): + ret, backedge = e.src[0], tuple(x for x in e.src[1:] if x.dtype in (dtypes.void, dtypes.bool)) + for r in sorted(UOp.sink(*[x for x in e.src[1:] if x not in backedge]).ranges, key=lambda x: x.arg, reverse=True): ret = ret.end(r) + return ret.end(*backedge) if len(backedge) else ret + +pm_split_ends = PatternMatcher([ + # split the ends + (UPat(Ops.END, name="e"), do_split_ends), +]) diff --git a/artifacts/package_runtime/tinygrad/codegen/late/regalloc.py b/artifacts/package_runtime/tinygrad/codegen/late/regalloc.py new file mode 100644 index 000000000..0d675e62e --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/late/regalloc.py @@ -0,0 +1,136 @@ +import itertools +from tinygrad.helpers import dedup +from tinygrad.uop.ops import UOp, Ops, PatternMatcher, UPat +from tinygrad.renderer.isa import ISARenderer, Register, greg +from tinygrad.dtype import dtypes + +PSEUDO_OPS = {Ops.CONST, Ops.NOOP, Ops.AFTER, Ops.BARRIER, Ops.GROUP, Ops.STACK} + +class LinearScanRegallocContext: + # returns the uop that defines the virtual register + def vdef(self, v:Register) -> UOp: return self.uops[self.live_range[v][0]] + def __init__(self, uops:list[UOp], ren:ISARenderer): + self.uops = uops + self.ren = ren + self.idx = itertools.count() + # the label associated with each loop NOTE: this is only used post regalloc and should be removed + self.loop_label: dict[UOp, str] = {} + + # compute live ranges + self.live_range: dict[Register, list[int]] = {} + lr = self.live_range + ranges: list[Register] = [] + for i,u in enumerate(reversed(uops)): + if u.op in PSEUDO_OPS: continue + defs = u.tag if isinstance(u.tag, tuple) else () + for v in defs + tuple(greg(s) for s in dedup(u.src)): + if isinstance(v, Register): lr.setdefault(v, []).insert(0, len(uops) - 1 - i) + for v in defs: + if v in lr and (n:=max((lr[rng][-1] for rng in ranges if lr[rng][0] <= lr[v][-1] < lr[rng][-1]), default=None)): lr[v].append(n) + if u.op is Ops.RANGE: ranges.append(greg(u)) + + # allocate registers + self.stack_size: int = 0 + self.locals: dict[UOp, UOp] = {} + self.spills: dict[Register, UOp] = {} # mapping from virtual to stack slot + self.reals: dict[int, dict[Register, Register]] = {} # mapping from virtual to real at each program point + self.insert_before: dict[int, list[tuple[Register, Register]]] = {} # fills to be inserted at each program point + live: dict[Register, Register] = {} # mapping from virtual to real that's currently assigned to it + live_ins: list[dict[Register, Register]] = [] # mapping from virtual to real at loop entry + + def alloc(cons:tuple[Register, ...], i:int) -> Register: + live_inv = {v:k for k,v in live.items()} + # allocate the best register. Registers not in live or not used again are free and have priority, + # otherwise pick the one with the furthest next use. Regs that appear first in cons have priority in case of a tie + reg,vreg = max(((r,live_inv.get(r)) for r in cons), + key=lambda rv: next((j-i for j in ([] if rv[1] is None else lr[rv[1]]) if j >= i), len(uops))) + return live.pop(vreg) if vreg is not None else reg + + # assign register to spilled virtual and record load to be emitted before current uop, also assign it a stack slot + def fill(v:Register, i:int, cons:tuple[Register, ...]|None=None) -> Register: + if v not in self.spills: + # the value of a BUFFER is its 64bit address, XMM registers need 16 bytes + sz = 16 if v.cons[0].size == 16 else (8 if self.vdef(v).op is Ops.BUFFER else self.vdef(v).dtype.itemsize) + offset = self.stack_size + (sz - self.stack_size % sz) % sz + self.spills[v] = UOp.const(offset, dtypes.int32) + self.stack_size = offset + sz + r = alloc(cons if cons is not None else v.cons, i) + self.insert_before.setdefault(i, []).append((v, r)) + return r + + for i,u in enumerate(uops): + if u.op in PSEUDO_OPS: continue + # allocate uses + for s in u.src: + # HACK: cause of later hacks to lower range + if u.op is Ops.END: continue + if not isinstance(v:=greg(s), Register): continue + if v not in live: live[v] = fill(v, i) + self.reals.setdefault(i, {})[v] = live[v] + + # allocate defs + if isinstance(u.tag, tuple): + for j,v in enumerate(u.tag): + # register should only be defined once + assert isinstance(v, Register) and lr[v][0] == i + cons = v.cons + # two address instructions (src is reused by def) can only coalesce reused src. reused src goes first to get priority in case of a tiebreak + if ren.is_two_address(u) and j == 0: + uses = tuple(live.get(greg(s)) for s in u.src) + cons = ((uses[0],) if uses[0] in cons else ()) + tuple(r for r in cons if r not in uses) + # HACK: cause the range is missing the comparison + live[v] = alloc(cons, i+1 if u.op is not Ops.RANGE else i) + self.reals.setdefault(i, {})[v] = live[v] + + # allocate stack array + if u.op is Ops.BUFFER: + self.locals[u] = UOp.const(self.stack_size, dtypes.int32) + self.stack_size += u.max_numel() * u.dtype.itemsize + + # loop prologue, avoid loading inside the loop + if u.op is Ops.RANGE: + # we move to registers vars used in the loop sorted by next use, vars not used in the loop will not be reloaded in the epilogue + used_in_loop = [v for v in live.keys() | self.spills.keys() if any(i <= l < lr[greg(u)][-1] for l in lr[v])] + sorted_uses = sorted(used_in_loop, key=lambda k: (next(l-i for l in lr[k] if l >= i), lr[k][0], k.name, k.index)) + live_in: dict[Register, Register] = {} + for v in sorted_uses: + # if all the possible registers are already in live_in there's no space for this var + if set(v.cons).issubset(live_in.values()): continue + if v not in live: live[v] = fill(v, i) + live_in[v] = live[v] + live_ins.append(live_in) + + # loop epilogue, reload registers that were live at loop entry + if u.op is Ops.END: + # TODO: if a uop is in a different reg in live out vs live in move between registers instead of loading + # TODO: don't reload if first use in loop is a load + for v,r in live_ins.pop().items(): + if v not in live or live[v] != r: live[v] = fill(v, i, (r,)) + +def regalloc_rewrite(ctx:LinearScanRegallocContext, x:UOp): + i = next(ctx.idx) + if x.op in PSEUDO_OPS: return None + nsrc = [] + for j,s in enumerate(x.src): + # v here is the virtual defined by the original s as s is the rewritten version + if i in ctx.reals and (v:=greg(ctx.uops[i].src[j])) in ctx.spills: nsrc.append(ctx.ren.fill(ctx.spills[v], ctx.vdef(v), ctx.reals[i][v])) + else: nsrc.append(s) + ndefs = tuple(ctx.reals[i][v] for v in x.tag) if isinstance(x.tag, tuple) else x.tag + if x.op is Ops.BUFFER: nx = ctx.ren.isel_matcher.rewrite(ctx.ren.stack_pointer().index(ctx.locals[x], tag=ndefs)) + else: nx = x.replace(src=tuple(nsrc), tag=ndefs) + + before = [ctx.ren.fill(ctx.spills[v], ctx.vdef(v), r) for v,r in ctx.insert_before.get(i, [])] + after = [ctx.ren.spill(ctx.spills[v], nx) for v in x.tag if v in ctx.spills] if isinstance(x.tag, tuple) else [] + + # alloc/dealloc stack + if ctx.stack_size > 0: + sp = ctx.ren.stack_pointer() + offset = UOp.const(ctx.stack_size, sp.dtype) + if i == 0: before = [ctx.ren.isel_matcher.rewrite(UOp(Ops.SUB, src=(sp, offset), tag=sp.tag))] + before + elif i == len(ctx.uops) - 2: before += [ctx.ren.isel_matcher.rewrite(UOp(Ops.ADD, src=(sp, offset), tag=sp.tag))] + + return nx, before + [nx] + after + +pm_regalloc_rewrite = PatternMatcher([ + (UPat({Ops.INS, Ops.RANGE, Ops.END, Ops.BUFFER, Ops.PARAM, Ops.SPECIAL} | PSEUDO_OPS, name="x"), regalloc_rewrite), +]) diff --git a/artifacts/package_runtime/tinygrad/codegen/opt/__init__.py b/artifacts/package_runtime/tinygrad/codegen/opt/__init__.py new file mode 100644 index 000000000..fb4b84dde --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/opt/__init__.py @@ -0,0 +1,20 @@ +# opt opinionatedly transforms an ast into an optimized ast using either heuristics or beam search +from __future__ import annotations +from enum import Enum, auto +from dataclasses import dataclass + +class OptOps(Enum): + TC = auto(); UPCAST = auto(); UNROLL = auto(); LOCAL = auto(); THREAD = auto() # noqa: E702 + GROUP = auto(); GROUPTOP = auto(); NOLOCALS = auto(); PADTO = auto(); SWAP = auto() # noqa: E702 + def __lt__(self, x:OptOps): return self.value < x.value + +@dataclass(frozen=True, order=True) +class Opt: + op: OptOps + axis: int|None = None + arg: int|tuple|None = None + def __repr__(self): return f"Opt(op={self.op}, axis={self.axis}, arg={self.arg})" + +class KernelOptError(Exception): pass +def check(cond:bool, msg:str=""): + if not cond: raise KernelOptError(msg) diff --git a/artifacts/package_runtime/tinygrad/codegen/opt/heuristic.py b/artifacts/package_runtime/tinygrad/codegen/opt/heuristic.py new file mode 100644 index 000000000..f78dcb2b7 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/opt/heuristic.py @@ -0,0 +1,194 @@ +import itertools +from tinygrad.codegen.opt import Opt, OptOps, KernelOptError +from tinygrad.helpers import getenv, DEBUG, prod, NOLOCALS, TC_OPT, TC_SELECT, USE_TC, IMAGE +from tinygrad.uop.ops import Ops, resolve, AxisType +from tinygrad.codegen.late.coalesce import image_valid_dims +from tinygrad.codegen.opt.postrange import Scheduler + +def hand_coded_optimizations(k:Scheduler) -> Scheduler: + # first try the tensor cores + """ Attempts to apply a tensor core optimization to the kernel. If one exists and applies properly, return true, otherwise return false. + Tensor cores are optimized instructions that matrix multiply-accumulate across a wave of threads: D(M, N) = A(M, K) * B(K, N) + C(M, N). + + Keyword arguments: + use_tensor_cores -- controls how tensor cores are applied (default 1) + 0: will disable any tensor core matching + 1: enable tensor cores + 2: apply tensor core shape but don't use UOp.WMMA + extra_opts -- additional Opt's to apply after the tensor core instead of the hand-coded additional Opt's (default None) + tc_select -- specifies which tensor core(s) to use for optimization (default -1) + -1: iterates through all available tensor cores in order and uses the first one that matches the requirements (dims and dtypes) + [0-N]: uses only the n'th tensor core available; useful for search + tc_opt -- controls which kinds of kernels may be eligible for tensor cores application (default 2 during BEAM, 0 otherwise) + 0: applies to only kernels with a single reduce axis and direct Ops.LOAD into Ops.MUL + 1: allows kernels with multiple reduce axes and also multiplication of Ops.CAST'd buffers + 2: allows kernels with M, N, K axes that are not multiples of the tensor core dimensions by applying padding those axes as needed + """ + # NOTE: unless TC_OPT is > 0, we only trigger tensor cores if there's only one reduce axis + if USE_TC > 0 and (len(k.axes_of(AxisType.GROUP_REDUCE, AxisType.REDUCE)) == 1 or (TC_OPT.value >= 1)): + for axis in range(3): + tk = k.copy() + # check TC first and apply hand-coded opts if successful + try: rngs = tk.apply_opt(Opt(OptOps.TC, axis, (TC_SELECT.value, TC_OPT.value, USE_TC.value))) + except KernelOptError: continue + for tc_dim in [1,0]: # attempt to upcast M and N + szs = [sz for sz in [5,4,3,2] if rngs[tc_dim].src[0].divides(sz) is not None] + if szs: + # set it to the replaced range + rngs[tc_dim] = tk.apply_opt(Opt(OptOps.UPCAST, tk.rngs.index(rngs[tc_dim]), szs[0]))[0] + if (szs := [sz for sz in [4,2] if rngs[0].src[0].divides(sz) is not None]): # attempt to local N + tk.apply_opt(Opt(OptOps.LOCAL, tk.rngs.index(rngs[0]), szs[0])) + return tk + + # make a copy so it does not mutate the input + k = k.copy() + + # upcast float4 images, this must be early so we don't accidentally add locals before the upcast + if IMAGE: + for buf_index,buf in enumerate(k.bufs): + if image_valid_dims(buf.src[0].dtype, buf.src[0].max_numel(), k.ren.target.arch): + idx = k.bufs[buf_index].src[1] + # IMAGE upcasts require one validity shared by all four unit-stride lanes so memory_coalescing can combine them into one vector read. + unit_stride_axes_mul_4 = [k.rngs.index(c) for c in idx.get_idx().split_uop(Ops.ADD) if + c.op is Ops.RANGE and (c.vmax+1)%4 == 0 and c not in idx.get_valid().backward_slice] + if len(unit_stride_axes_mul_4): + if (axis:=unit_stride_axes_mul_4[0]) in k.upcastable_dims: + k.apply_opt(Opt(OptOps.UPCAST, axis, 4)) + elif axis in k.unrollable_dims: + k.apply_opt(Opt(OptOps.UNROLL, k.unrollable_dims.index(axis), 4)) + + # should use matvec - TODO: adjust/tune based on the wide vs tall/large vs small mat + MV_BLOCKSIZE, MV_THREADS_PER_ROW, MV_ROWS_PER_THREAD = getenv("MV_BLOCKSIZE", 4), getenv("MV_THREADS_PER_ROW", 8), getenv("MV_ROWS_PER_THREAD", 4) + if k.ren.has_local and getenv("MV",1) != 0 and (MV_BLOCKSIZE > 1 or MV_THREADS_PER_ROW > 1 or MV_ROWS_PER_THREAD > 1) and \ + k.reduceop is not None and k.reduceop.arg[0] is Ops.ADD and len(k.full_shape) >= 2 and k.ren.has_shared and \ + (mulop:=k.reduceop.src[0]).op is Ops.MUL and mulop.src[0].op is Ops.INDEX and mulop.src[1].op is Ops.INDEX: + idx0, idx1 = mulop.src[0].src[1].get_idx(), mulop.src[1].src[1].get_idx() + if k.ranges_of(AxisType.REDUCE): + first_reduce_rng = k.ranges_of(AxisType.REDUCE)[0] + if any(u is first_reduce_rng for u in idx0.split_uop(Ops.ADD)) and all(r in idx1.ranges for r in idx0.ranges): + for global_idx in k.axes_of(AxisType.GLOBAL): + if first_reduce_rng.src[0].divides(MV_THREADS_PER_ROW) is not None and k.full_shape[global_idx]%(MV_BLOCKSIZE*MV_ROWS_PER_THREAD) == 0: + if DEBUG >= 3: + print(f"MATVEC: {k.full_shape=} {first_reduce_rng.render()} {MV_BLOCKSIZE=} {MV_THREADS_PER_ROW=} {MV_ROWS_PER_THREAD=}") + try: + if MV_THREADS_PER_ROW > 1: k.apply_opt(Opt(OptOps.GROUP, 0, MV_THREADS_PER_ROW)) + except KernelOptError: pass + if MV_BLOCKSIZE > 1: k.apply_opt(Opt(OptOps.LOCAL, global_idx, MV_BLOCKSIZE)) + if MV_ROWS_PER_THREAD > 1: k.apply_opt(Opt(OptOps.UPCAST, global_idx, MV_ROWS_PER_THREAD)) + return k + + # are we grouping? (requires local shape support) + if resolve(prod(k.output_shape[i] for i in k.upcastable_dims) <= (240 if NOLOCALS else 2048), False): + for axis, sz in itertools.product((0, 1, 2), (16,)): + try: + k.apply_opt(Opt(OptOps.GROUPTOP, axis, sz)) + break + except KernelOptError: pass + + # no more opt if we are grouping + if k.group_for_reduces: return k + + # **** below this line need to be optional and benchmarked **** + + # if there are small dims with lots of valid masks, upcast them (they might be from Tensor.stack) + to_upcast: list[int] = [] + where_gate_rngs = {r for u in k.ast.backward_slice if u.op is Ops.WHERE for r in u.src[0].ranges} + # upcast leading axes first (hack-ish for winograd; we actually want to upcast masked axes with low stride first) + for axis in k.upcastable_dims: + # for Schedule, we check if the range is used in INDEX gates or WHERE gates + is_masked = k.rngs[axis] in where_gate_rngs + if k.full_shape[axis] <= 7 and is_masked and prod(k.full_shape[j] for j in to_upcast) * k.full_shape[axis] <= 7 * 7: + # upcasting a masked global axis moves that range out of the launch grid into each work-item + # under IMAGE, skip the upcast unless enough global work-items remain after it to hide memory latency + if IMAGE and k.axis_types[axis] is AxisType.GLOBAL: + global_upcast = prod(k.full_shape[i] for i in to_upcast if k.axis_types[i] is AxisType.GLOBAL) * k.full_shape[axis] + global_items_after = prod(k.full_shape[i] for i in k.axes_of(AxisType.GLOBAL)) // global_upcast + if resolve(global_items_after < getenv("OCCUPANCY_FLOOR", 4096), False): continue + if DEBUG >= 4: print(f"upcasting masked axis : {axis}") + to_upcast.append(axis) + for axis in to_upcast[::-1]: k.apply_opt(Opt(OptOps.UPCAST, axis, 0)) + + # potentially do more upcasts of non reduce axes based on a heuristic + is_dsp = k.ren is not None and k.ren.target.device == "DSP" + upcasted_axis: set[int] = set() + while resolve(prod(k.output_shape[i] for i in k.upcastable_dims) >= 1024) and (k.upcast_size() < 32): + xb_choices = [] + # consider all upcastable axes with 3 or 4 upcast (128 on the DSP) + for axis, upcast_amount in itertools.product(k.upcastable_dims, ([128] if not len(upcasted_axis) else []) if is_dsp else [3,4]): + # if we haven't upcasted it, it mods, and buffer has stride 0 on axis while having no stride 0 in the upcasted axis already + if axis in upcasted_axis or k.full_shape[axis]%upcast_amount != 0: continue + rng = k.rngs[axis] + if any(rng not in b.src[1].get_idx().backward_slice and all(r2 in b.src[1].get_idx().backward_slice + for r2 in k.ranges_of(AxisType.UPCAST, AxisType.UNROLL)) for b in k.bufs): + num_strides, sum_strides = 0, 0 + for b in k.bufs: + idx = b.src[1].get_idx() + if rng in idx.backward_slice: num_strides += 1 + for c in idx.split_uop(Ops.ADD): + if c is rng: sum_strides += 1 + if c.op is Ops.MUL and c.src[0] is rng and c.src[1].op is Ops.CONST: sum_strides += c.src[1].val + if c.op is Ops.MUL and c.src[1] is rng and c.src[0].op is Ops.CONST: sum_strides += c.src[0].val + xb_choices.append((num_strides, sum_strides, axis, upcast_amount)) + if xb_choices: + xb_choices = sorted(xb_choices) + if DEBUG >= 4: print(f"more upcast axis : {xb_choices}") + k.apply_opt(Opt(OptOps.UPCAST, xb_choices[0][2], xb_choices[0][3])) + upcasted_axis.add(xb_choices[0][2]) + else: break + + # if last reduce dim is small(ish), loop unroll the reduce + # NOTE: this can fail on multireduce with mismatching dimensions, this is okay + try: + if k.unrollable_dims and (k.upcast_size() <= 4 or not k.axes_of(AxisType.UNROLL)) and (k.upcast_size() < 64): + if (s:=k.full_shape[k.unrollable_dims[-1]]) <= 32: + k.apply_opt(Opt(OptOps.UNROLL, len(k.unrollable_dims)-1, 0)) + # if it's small, upcast a second reduce dimension too + if k.unrollable_dims and s <= 3 and k.full_shape[k.unrollable_dims[-1]] <= 3: + k.apply_opt(Opt(OptOps.UNROLL, len(k.unrollable_dims)-1, 0)) + else: + for splits in [4]: + if k.full_shape[axis:=k.unrollable_dims[-1]]%splits == 0: + k.apply_opt(Opt(OptOps.UNROLL, len(k.unrollable_dims)-1, splits)) + break + except KernelOptError: pass + + # if nothing at all is upcasted and it's easy to, do an upcast + for splits in [4]: + if not k.upcasted and k.upcastable_dims and k.full_shape[k.upcastable_dims[-1]] % splits == 0: + k.apply_opt(Opt(OptOps.UPCAST, k.upcastable_dims[-1], splits)) + + # **** local groups **** + + if k.ren.has_local: + if NOLOCALS: + k.apply_opt(Opt(OptOps.NOLOCALS)) + else: + # prioritize making expand axes local + local_axis_ranking = [(any(k.rngs[axis] not in b.src[1].get_idx().backward_slice for b in k.bufs), axis) \ + for axis in k.axes_of(AxisType.GLOBAL, AxisType.WEAK) if k.rngs[axis].src[0].op is Ops.CONST] + to_local: list[tuple[int, int]] = [] + for _, axis in sorted(local_axis_ranking, key=lambda x: (-x[0], -x[1])): + local_size = prod(sz for _, sz in to_local) + local_sz: int|None = next((x for x in ([32] * (axis == 0) + [16,8,4,3,2]) if k.full_shape[axis] % x == 0 and local_size * x <= 128), None) + if local_sz is not None: to_local.append((axis, local_sz)) + deleted_shape = 0 + for axis, local_sz in sorted(to_local[:3]): + axis = axis - deleted_shape + will_delete_shape = local_sz == k.full_shape[axis] + k.apply_opt(Opt(OptOps.LOCAL, axis, local_sz)) + if will_delete_shape: deleted_shape += 1 + + # **** threading **** + + if k.ren.has_threads and k.ren.global_max is not None: + for threads in [32,16,12,8,6,5,4,3,2]: + # Skip if too many threads. Heuristic: use about 128K ops per thread + if threads > k.ren.global_max[0] or resolve(prod(k.full_shape) // (128 << 10) < threads): continue + for axis in k.axes_of(AxisType.WEAK): + if k.full_shape[axis] % threads == 0: + try: k.apply_opt(Opt(OptOps.THREAD, axis, threads)) + except KernelOptError: pass + break + if k.applied_opts and k.applied_opts[-1].op is OptOps.THREAD: break + + return k diff --git a/artifacts/package_runtime/tinygrad/codegen/opt/postrange.py b/artifacts/package_runtime/tinygrad/codegen/opt/postrange.py new file mode 100644 index 000000000..987aea76b --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/opt/postrange.py @@ -0,0 +1,356 @@ +from __future__ import annotations +import math, itertools +from collections import defaultdict +from typing import cast, Final +from tinygrad.uop.ops import Ops, UOp, KernelInfo, graph_rewrite, AxisType, ssimplify, remove_all_tags +from tinygrad.uop.ops import axis_letters, axis_colors, axis_to_pos +from tinygrad.device import Buffer +from tinygrad.dtype import dtypes, Invalid +from tinygrad.helpers import colored, getenv, DEBUG, to_function_name, NOOPT, argsort, round_up, prod, merge_dicts, get_single_element, flatten +from tinygrad.helpers import ALLOW_TF32, count, Context +from tinygrad.codegen.opt import Opt, OptOps, KernelOptError, check +from tinygrad.codegen.simplify import pm_flatten_range +from tinygrad.renderer import Renderer + +class Scheduler: + def __init__(self, ast:UOp, ren:Renderer): + self.ast, self.ren = ast, ren + self.dont_use_locals = self.ast.arg.dont_use_locals if self.ast.arg is not None else False + self.applied_opts = list(self.ast.arg.applied_opts) if self.ast.arg is not None else [] + self.opt_range = count(start=max([x.arg[0] for x in self.rngs], default=0)+1) + + @property + def rngs(self): + # always in order by axistype. void RANGEs are loops, not opt axes. the DEVICE axis is launched, not an opt axis + return sorted([u for u in self.ast.backward_slice if u.op is Ops.RANGE and u.dtype is not dtypes.void and u.vmax > 0 + and u.arg[-1] is not AxisType.DEVICE], key=lambda x: (axis_to_pos[x.arg[-1]],) + x.arg[0:-1]) + @property + def shape_len(self) -> int: return len(self.rngs) + @property + def full_shape(self): return [ssimplify(x.src[0]) for x in self.rngs] + @property + def axis_types(self) -> list[AxisType]: return [x.arg[-1] for x in self.rngs] + + # strings like ['g0', 'g1', 'l0', 'l1', 'l2', 'l3', 'l4', 'l5', 'R0', 'r0', 'r1', 'r2', 'u0', 'u1', 'u2'] + def shape_str(self) -> list[str]: + ret: list[str] = [] + cnt: dict[AxisType, int] = {} + for x in self.axis_types: + cnt[x] = (cnt[x] + 1) if x in cnt else 0 + ret.append(f"{axis_letters[x]}{cnt[x]}") + return ret + def shape_str_to_axis(self, nms:list[str]) -> tuple[int, ...]: return tuple([self.shape_str().index(x) for x in nms]) + + def copy(self) -> Scheduler: + ret = Scheduler(self.ast, self.ren) + ret.dont_use_locals = self.dont_use_locals + ret.applied_opts = self.applied_opts[:] + if hasattr(self, 'tensor_core'): ret.tensor_core = self.tensor_core + return ret + + kernel_cnt: Final[defaultdict[str, int]] = defaultdict(int) + def get_optimized_ast(self, name_override:str|None=None) -> UOp: + if name_override is not None: name = name_override + else: + k_type = "r" if self.reduceop is not None else "E" + special_uops = sorted([x for x in self.ast.toposort() if x.op is Ops.SPECIAL], key=lambda x: x.arg) + special_ops = [colored(str(x.vmax+1), "blue" if x.arg[0] == "g" else "cyan") for x in special_uops] + name = k_type + colored('_', 'BLACK').join(['']+special_ops+[colored(x.src[0].render(), color) for x,color in zip(self.rngs, self.colors())]) + Scheduler.kernel_cnt[(function_name := to_function_name(name))] += 1 + num = f"n{Scheduler.kernel_cnt[function_name]-1}" if Scheduler.kernel_cnt[function_name] > 1 else "" + name += colored(num, 'BLACK') + self.ast = graph_rewrite(self.ast, pm_flatten_range, name="flatten range") + return self.ast.replace(arg=KernelInfo(name=name, applied_opts=tuple(self.applied_opts), dont_use_locals=self.dont_use_locals), tag=1) + + def _output_rngs(self) -> list[UOp]: + return flatten([[r for r in UOp.sink(*s.src[1:]).ranges if r.arg[-1] != AxisType.REDUCE] for s in self.ast.src if s.op is Ops.END]) + def _globalizable_rngs(self) -> list[UOp]: + ret = [r for r in self._output_rngs() if r.arg[-1] == AxisType.WEAK] + # exclude any output ranges from global that don't appear in all BUFFERIZE + for x in self.ast.toposort(): + if x.op is Ops.STAGE: + ret = [r for r in ret if r in x.ranges] + return ret + + def convert_loop_to_global(self) -> None: + if not self.ren.has_local: return + + globalizible_rngs = self._globalizable_rngs() + rng = [x.replace(arg=x.arg[0:-1]+(AxisType.GLOBAL,)) if x in globalizible_rngs else x for x in self.rngs] + + self.ast = self.ast.substitute(dict(zip(self.rngs, rng))) + + def colors(self) -> list[str]: + output_rngs = self._output_rngs() + globalizible_rngs = self._globalizable_rngs() + ret = [] + for x,r in zip(self.axis_types, self.rngs): + if self.dont_use_locals and x == AxisType.GLOBAL: ret.append("BLUE") + elif r not in output_rngs and x == AxisType.WEAK: ret.append("BLACK") + elif r not in globalizible_rngs and x == AxisType.WEAK: ret.append("white") + else: ret.append(axis_colors[x]) + return ret + def colored_shape(self) -> str: return ' '.join([colored(f'{x.src[0].render():>4s}', color) for x,color in zip(self.rngs, self.colors())]) + + def shift_to(self, rng:UOp, amount:int, new_type:AxisType, top:bool=False, input_new_rng:UOp|None=None): + if (old_sz:=rng.src[0].divides(amount)) is None: + raise KernelOptError(f"{amount} can't divide {rng.src[0]} in {self.colored_shape()}") + new_rng = UOp.range(amount, next(self.opt_range), new_type, dtype=rng.dtype) if input_new_rng is None else input_new_rng + replaced_rng = rng.replace(src=(old_sz,)) + sub_axis = (new_rng * old_sz + replaced_rng) if top else (replaced_rng * amount + new_rng) + self.ast = self.ast.substitute({rng:sub_axis}, name=f"shift {rng.arg[:-1]} {amount} {str(new_type).split('.')[1].lower()}") + return replaced_rng, new_rng + + def ranges_of(self, *axis_type:AxisType) -> list[UOp]: return [r for r in self.rngs if r.arg[-1] in axis_type] + def axes_of(self, *axis_type:AxisType) -> list[int]: return [i for i,t in enumerate(self.axis_types) if t in axis_type] + + def upcast_size(self): return prod(self.full_shape[a] for a in self.axes_of(AxisType.UPCAST, AxisType.UNROLL)) + + # copied from kernel.py + @property + def upcastable_dims(self) -> list[int]: return [i for i in self.axes_of(AxisType.GLOBAL, AxisType.LOCAL, AxisType.WEAK) \ + if isinstance(s:=self.full_shape[i], int) and s > 1] + @property + def unrollable_dims(self) -> list[int]: return [i for i in self.axes_of(AxisType.GROUP_REDUCE, AxisType.REDUCE) \ + if isinstance(s:=self.full_shape[i], int) and s > 1] + + def real_axis(self, op:OptOps, axis:int|None) -> int: + try: + if axis is None or op is OptOps.TC: return -1 + if op is OptOps.UNROLL: return self.unrollable_dims[axis] + if op in {OptOps.GROUP, OptOps.GROUPTOP}: return self.axes_of(AxisType.REDUCE)[axis] + check(axis < self.shape_len, f"invalid axis on {axis=} {op=} {self.shape_len=}") + return axis + except IndexError as e: raise KernelOptError from e + + def apply_opt(self, opt:Opt, append_opt:bool=True): + if opt.op is OptOps.NOLOCALS: + check(all(x not in {AxisType.WARP, AxisType.LOCAL, AxisType.GROUP_REDUCE} for x in self.axis_types), "no locals can't have locals") + if append_opt: self.applied_opts.append(opt) + self.dont_use_locals = True + return + + if opt.op in {OptOps.LOCAL, OptOps.GROUP, OptOps.GROUPTOP}: + check(self.ren.has_local, "locals needed for opt") + + rng = self.rngs[real_axis] if (real_axis:=self.real_axis(opt.op, opt.axis)) >= 0 else UOp(Ops.NOOP) + + opt_to_at = { + OptOps.LOCAL: AxisType.LOCAL, OptOps.UPCAST: AxisType.UPCAST, + OptOps.UNROLL: AxisType.UNROLL, OptOps.GROUP: AxisType.GROUP_REDUCE, + OptOps.GROUPTOP: AxisType.GROUP_REDUCE, OptOps.THREAD: AxisType.THREAD} + + ret = None + if opt.op in opt_to_at: + amt:int = int(rng.vmax+1) if opt.arg == 0 else cast(int, opt.arg) + + # copied from kernel.py. prevents METAL compiler hangs + if self.reduceop is not None and (opt.op in {OptOps.GROUP, OptOps.GROUPTOP} or \ + (self.group_for_reduces and opt.op not in {OptOps.NOLOCALS, OptOps.PADTO})): + upcast_local_sz = prod([self.full_shape[a] for a in self.axes_of(AxisType.UPCAST, AxisType.WARP, AxisType.LOCAL, AxisType.GROUP_REDUCE)]) + smem_sz = amt*upcast_local_sz*self.reduceop.dtype.itemsize + check(smem_sz <= self.ren.shared_max, f"exceeds maximum shared memory size: needs {smem_sz}, max {self.ren.shared_max}") + if self.reduceop is not None and (opt.op in {OptOps.GROUP, OptOps.GROUPTOP}): + # We currently dont support a group within another rudece, TODO: fix if-contexts + reduce = [u for u in self.ast.backward_slice if u.op is Ops.REDUCE and rng in merge_dicts([r.ranges for r in u.src[1:]])][0] + check(not any(u.arg[-1] in (AxisType.REDUCE, AxisType.UNROLL, AxisType.GROUP_REDUCE) for u in reduce.ranges), + "cannot have a GROUP_REDUCE inside another reduce") + + if opt.op is OptOps.UNROLL: + check(amt <= 32, "don't unroll more than 32") + check(rng.arg[-1] in {AxisType.GROUP_REDUCE, AxisType.REDUCE}, "unroll is for GROUP_REDUCE/REDUCE") + if opt.op is OptOps.UPCAST: + check((self.ren is not None and self.ren.target.device == "DSP") or amt <= 16, "don't upcast more than 16") + check(rng.arg[-1] in {AxisType.GLOBAL, AxisType.LOCAL, AxisType.WEAK}, f"upcast is for GLOBAL/LOCAL/LOOP, not {rng.arg[-1]}") + if opt.op is OptOps.LOCAL: + check(not self.dont_use_locals, "can't use locals") + check(rng.arg[-1] in {AxisType.GLOBAL, AxisType.WEAK}, "local is for globals") + if opt.op is OptOps.THREAD: + check(self.ren is not None and self.ren.has_threads, "target does not support threads") + check(self.ren is not None and self.ren.global_max is not None and amt <= self.ren.global_max[0], "too many threads") + check(all(x is not AxisType.THREAD for x in self.axis_types), "already threaded") + check(rng in self._globalizable_rngs(), "can't apply range to this dim") + if opt.op in {OptOps.GROUP, OptOps.GROUPTOP}: + check(all(x.op is not OptOps.TC for x in self.applied_opts), "no grouping with tensor cores") # TODO: why is this wrong? + check(not self.dont_use_locals, "can't use locals") + check(rng.arg[-1] == AxisType.REDUCE, "group is for reduce") + ret = self.shift_to(rng, amt, opt_to_at[opt.op], top=opt.op in {OptOps.GROUPTOP, OptOps.THREAD}) + elif opt.op is OptOps.TC: + check(len(self.applied_opts) == 0, "tensor core opts must be first") # TODO: remove the need for this by having warps + check(opt.axis is not None, "tensor core opts must have an axis") + check(opt.arg is not None and isinstance(opt.arg, tuple) and len(opt.arg) == 3, "tensor core opts must have valid arg") + check(-1 <= (tc_select:=cast(tuple, opt.arg)[0]) < len(self.ren.tensor_cores), "tensor core opts must have valid tc_select") + check(0 <= (tc_opt:=cast(tuple, opt.arg)[1]) <= 2, "tensor core opts must have valid tc_opt") + check(0 < (use_tensor_cores:=cast(tuple, opt.arg)[2]) <= 2, "use_tensor_cores value is not valid") + try: ret = self._apply_tc_opt(use_tensor_cores, cast(int, opt.axis), tc_select, tc_opt) + except ValueError as e: raise KernelOptError(str(e)) + check(ret is not None, "no tensor core available") + elif opt.op is OptOps.PADTO: + check(rng.src[0].op is Ops.CONST, "only pad const axes") + check(rng.arg[-1] not in {AxisType.UPCAST, AxisType.UNROLL}, "cannot pad upcasted") # TODO: why is this wrong? + check(rng.arg[-1] is not AxisType.THREAD, "cannot pad thread") + new_sz = round_up(int(rng.vmax+1), cast(int, opt.arg)) + check(rng.vmax+1 > new_sz//4, "pad adds more than quadruple the work") + replaced_rng = UOp.range(new_sz, *rng.arg, dtype=rng.dtype) + replaces = {rng:replaced_rng} + valid = replaced_rng < rng.vmax+1 + store_targets = {s.src[0] for s in self.ast.backward_slice_with_self if s.op is Ops.STORE} + for b in self.bufs: + if rng in (i:=b.src[1].get_idx()).backward_slice_with_self: + nb = b.replace(src=(b.src[0], i.valid(valid&b.src[1].get_valid()))) + replaces[b] = nb if b in store_targets else valid.where(nb, UOp.const(Invalid, b.dtype)) + self.ast = self.ast.substitute(replaces, f"padto {rng.arg[:-1]} {opt.arg}") + elif opt.op is OptOps.SWAP: + try: + altrng:UOp = self.rngs[opt.arg] + except IndexError: + raise KernelOptError + check(rng.arg[-1] == AxisType.GLOBAL and altrng.arg[-1] == AxisType.GLOBAL, "swap only for globals") + self.ast = self.ast.substitute({rng:rng.replace(arg=(*altrng.arg[0:-1], rng.arg[-1]), tag=1), + altrng:altrng.replace(arg=(*rng.arg[0:-1], altrng.arg[-1]), tag=1)}, + name=f"swap {rng.arg[:-1]} {altrng.arg[:-1]}") + self.ast = graph_rewrite(self.ast, remove_all_tags, name="swap remove tags") + else: + raise KernelOptError(f"unsupported opt {opt.op}") + + if append_opt: self.applied_opts.append(opt) + return ret + + def _apply_tc_opt(self, use_tensor_cores:int, axis:int, tc_select:int, opt_level:int) -> None|list[UOp]: + if not (reduceops := self.reduceops): raise KernelOptError("no reduce ops for TensorCore") + reduceop = reduceops[0] + if use_tensor_cores and reduceop.arg[0] is Ops.ADD: + mul = reduceop.src[0] if reduceop.src[0].op is not Ops.CAST else reduceop.src[0].src[0] + if mul.op is not Ops.MUL: return None + in0, in1 = mul.src + try: + tensor_cores = self.ren.tensor_cores if tc_select == -1 else [self.ren.tensor_cores[tc_select]] + except IndexError: + raise KernelOptError(f"invalid tensor core choice {tc_select}") + for tc in tensor_cores: + if self.ren.target.device in ("CUDA", "NV") and tc.dtype_in == dtypes.float and not ALLOW_TF32: continue + if tc.dtype_in == in0.dtype and tc.dtype_in == in1.dtype and tc.dtype_out == reduceop.dtype: + # tensor cores have three ranges. X, Y, and REDUCE + in0_ranges = sorted([u for u in in0.ranges if u not in in1.ranges], key=lambda x: x.arg[0], reverse=True) + in1_ranges = sorted([u for u in in1.ranges if u not in in0.ranges], key=lambda x: x.arg[0], reverse=True) + red_ranges = sorted(reduceop.src[1:], key=lambda x: x.arg[0], reverse=True) + if DEBUG >= 3: + print(f"TC({axis}): {[(x.arg[0],x.vmax+1) for x in in0_ranges]}", + f"{[(x.arg[0],x.vmax+1) for x in in1_ranges]} {[(x.arg[0],x.vmax+1) for x in red_ranges]}") + if not len(in0_ranges) or not len(in1_ranges) or not len(red_ranges): continue + + # pick ranges + # NOTE: why are in1 and in0 switched? + axis_choices = list(itertools.product(in1_ranges, in0_ranges, red_ranges)) + if not (axis < len(axis_choices)): continue + axes = list(axis_choices[axis]) + + if any(a.arg[-1] is AxisType.REDUCE for a in axes[:2]): raise KernelOptError("tensor core X/Y axes can't be REDUCE") + + # tag the reduceop + self.ast = self.ast.substitute({reduceop: reduceop.replace(tag="TC")}) + + # do optimizations and save the ranges + try: + for i,a in enumerate(axes): + idx = self.rngs.index(a) + if (a.vmax+1) % tc.dims[i] != 0: + if opt_level < 2: raise KernelOptError("tc padding requires opt_level >= 2") + # apply_opt should return the updated range? + self.apply_opt(Opt(OptOps.PADTO, idx, tc.dims[i]), append_opt=False) # PADTO might fail + axes[i] = self.rngs[idx] + except KernelOptError: continue + + # we create the warp as a whole thing, in case some of these ranges are moved/removed later + warp = UOp.range(tc.threads, -1, AxisType.WARP) + ne: list[UOp] = [] + for opt in tc.opts: + if opt[0] == "l": + axes[int(opt[1])], new_range = self.shift_to(axes[int(opt[1])], 2, AxisType.LOCAL, input_new_rng=warp%2) + warp //= 2 + elif opt[0] == "u": + axes[int(opt[1])], new_range = self.shift_to(axes[int(opt[1])], 2, AxisType.UPCAST) + else: raise RuntimeError(f"unsupported opt {opt[0]} in tensor cores") + ne.append(new_range) + + for _, amt in tc.get_reduce_axes(): + axes[2], new_range = self.shift_to(axes[2], amt, AxisType.UNROLL) + ne.append(new_range) + + if use_tensor_cores != 2: + # fix the srcs + reduceop = get_single_element([x for x in self.ast.toposort() if x.op is Ops.REDUCE and x.tag == "TC"]) + tne = [x.replace(tag=1) for x in ne] + ret = reduceop.substitute(dict(zip(ne, tne))) + srcs = list((ret.src[0] if ret.src[0].op is not Ops.CAST else ret.src[0].src[0]).src) + srcs = [x.substitute(dict(zip(tne, [ne[i] for i in argsort(p)]))) for x,p in zip(srcs, tc.permutes_for_shape_str(tc.base_shape_str()))] + + # get reduce/upcast axes for the tensor cores + tc_reduce_axes = self.shape_str_to_axis([f"r{i}" for i in range(len(tc.get_reduce_axes()))]) + base_upcast_axes = tuple([(s,2) for s in self.shape_str_to_axis(tc.base_upcast_axes())]) + tc_upcast_axes = tuple([base_upcast_axes[:int(math.log2(tc.elements_per_thread[i]))] for i in range(3)]) + + # axes to range number (was done in lowerer) + tc_upcast_axes = tuple([tuple([(self.rngs[a].arg[0], sz) for a,sz in v]) for v in tc_upcast_axes]) + tc_reduce_axes = tuple([self.rngs[a].arg[0] for a in tc_reduce_axes]) + def with_missing_tc_axes(arg): + ret = list(arg) + for rn,_ in tc_upcast_axes[0]+tc_upcast_axes[1]: + if rn not in [x[0] for x in ret]: ret.append((rn, 1)) + return tuple(ret) + tc_upcast_axes = tuple(with_missing_tc_axes(v) for v in tc_upcast_axes) + + # construct the op + # TODO: remove tc_upcast_axes from the arg + # do the reduce_axes always disappear? i think they don't + # they need to be moved into the WMMA srcs + tc_uop = UOp.wmma(srcs[0], srcs[1], UOp.const((0.0,)*tc.elements_per_thread[2], tc.dtype_out), + tc.dims, self.ren.target.device, tc.threads, tc_upcast_axes=tc_upcast_axes) + + # preserve extra reduces + reduce_ranges = [x for x in UOp.sink(*reduceop.src[1:]).toposort() if x.op is Ops.RANGE and x.arg[0] not in tc_reduce_axes] + if len(reduce_ranges): tc_uop = UOp(Ops.REDUCE, src=(tc_uop,)+tuple(reduce_ranges), arg=(Ops.ADD, 0)) + self.ast = self.ast.substitute({reduceop: tc_uop}) + self.tensor_core = tc + return axes + return None + + # helpers for hand_coded_optimizations + @property + def reduceops(self) -> list[UOp]: return [x for x in self.ast.backward_slice if x.op is Ops.REDUCE] + @property + def reduceop(self) -> UOp|None: + if not (red := self.reduceops): return None + return UOp(Ops.REDUCE, src=red[0].src, arg=red[0].arg) + @property + def bufs(self) -> list[UOp]: return [x for x in self.ast.toposort() if x.op is Ops.INDEX][::-1] + @property + def output_shape(self): + return [s if at not in {AxisType.REDUCE, AxisType.UNROLL, AxisType.GROUP_REDUCE} else 1 for s,at in zip(self.full_shape, self.axis_types)] + @property + def upcasted(self) -> int: return len(self.axes_of(AxisType.UPCAST, AxisType.UNROLL)) + @property + def group_for_reduces(self) -> int: return len(self.axes_of(AxisType.GROUP_REDUCE)) + +def bufs_from_ast(ast:UOp, dname:str) -> list[Buffer]: + glbls = sorted([x for x in ast.backward_slice if x.op is Ops.PARAM and x.arg.slot >= 0], key=lambda x: x.arg.slot) + return [Buffer(dname, x.max_numel(), x.dtype) for x in glbls] + +def apply_opts(ast:UOp, ren:Renderer, beam:int=0) -> UOp: + if ast.tag is not None: return ast + k = Scheduler(ast, ren) + k.convert_loop_to_global() + if ast.arg is not None and ast.arg.opts_to_apply is not None: + for opt in ast.arg.opts_to_apply: k.apply_opt(opt) + elif beam >= 1: + from tinygrad.codegen.opt.search import beam_search + rawbufs = bufs_from_ast(ast, ren.target.device) + # beam search may open devices + with Context(ALLOW_DEVICE_USAGE=1): + k = beam_search(k, rawbufs, beam, bool(getenv("BEAM_ESTIMATE", 1))) + elif not NOOPT and (ast.arg is None or ast.arg.applied_opts == ()): + from tinygrad.codegen.opt.heuristic import hand_coded_optimizations + # NOTE: hand_coded_optimizations doesn't support multiblock opts yet + if not any(u.op is Ops.STAGE for u in ast.backward_slice): + k = hand_coded_optimizations(k) + return k.get_optimized_ast(name_override=ast.arg.name if ast.arg is not None and ast.arg.name != "test" else None) diff --git a/artifacts/package_runtime/tinygrad/codegen/opt/search.py b/artifacts/package_runtime/tinygrad/codegen/opt/search.py new file mode 100644 index 000000000..cf85cdebf --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/opt/search.py @@ -0,0 +1,187 @@ +import math, time, multiprocessing, traceback, signal, atexit +from dataclasses import replace +from tinygrad.uop.ops import sym_infer, AxisType, UOp +from tinygrad.uop.render import pyrender +from tinygrad.device import Device, Buffer +from tinygrad.helpers import prod, flatten, DEBUG, CACHELEVEL, diskcache_get, diskcache_put, getenv, Context, colored, time_to_str +from tinygrad.helpers import IGNORE_BEAM_CACHE +from tinygrad.codegen.opt import Opt, OptOps, KernelOptError +from tinygrad.engine.realize import time_call +from tinygrad.codegen import to_program +from tinygrad.codegen.opt.postrange import Scheduler + +actions = [Opt(op=OptOps.UPCAST, axis=axis, arg=amt) for amt in [0,2,3,4,5,7] for axis in range(8)] +actions += [Opt(op=OptOps.UNROLL, axis=axis, arg=amt) for amt in [0,4,7] for axis in range(5)] +actions += [Opt(op=OptOps.LOCAL, axis=axis, arg=amt) for amt in [2,3,4,8,13,16,29] for axis in range(6)] +actions += [Opt(op=OptOps.GROUPTOP, axis=axis, arg=amt) for amt in [13,16,28,29,32,49,64,256] for axis in range(3)] +actions += [Opt(op=OptOps.GROUP, axis=axis, arg=amt) for amt in [0,4,8,16] for axis in range(3)] +if getenv("BEAM_PADTO", 0): actions += [Opt(op=OptOps.PADTO, axis=axis, arg=amt) for amt in [32] for axis in range(7)] +actions += [Opt(op=OptOps.LOCAL, axis=0, arg=32), Opt(op=OptOps.LOCAL, axis=6, arg=2)] +actions += [Opt(op=OptOps.TC, axis=0, arg=(-1, 0, getenv("TC", 1)))] +# covers resnet kernels (3 global * 3 reduce) +actions += [Opt(op=OptOps.TC, axis=axis, arg=(-1, getenv("TC_OPT", 2), getenv("TC", 1))) for axis in range(9)] +actions += [Opt(op=OptOps.SWAP, axis=axis_0, arg=axis_1) for axis_0 in range(5) for axis_1 in range(axis_0+1, 5)] +actions += [Opt(op=OptOps.THREAD, axis=axis, arg=amt) for amt in [2,3,4,5,8,12,16,24,32,64] for axis in range(3)] +if getenv("NOLOCALS"): actions += [Opt(op=OptOps.NOLOCALS)] + +def get_test_global_size(global_size, max_global_size, var_vals): + test_global_size = [sym_infer(sz, var_vals) for sz in global_size] + input_size = prod(test_global_size) + while prod(test_global_size) > max_global_size: + for j in range(len(global_size)-1,-1,-1): + if test_global_size[j] > 16: + test_global_size[j] //= 2 + break + return test_global_size, input_size / prod(test_global_size) + +def _time_program(prg:UOp, var_vals:dict[str, int], rawbufs:list[Buffer], early_stop:float|None=None, + allow_test_size:int=True, max_global_size:int|None=65536, clear_l2=False, cnt=3, name="test", dev_timeout=False) -> list[float]: + timeout = int(early_stop * 1e3) if dev_timeout and early_stop is not None and early_stop < math.inf else None + factor = 1 + if allow_test_size and max_global_size is not None: + global_size, factor = get_test_global_size(prg.arg.global_size, max_global_size, var_vals) + prg = prg.replace(arg=replace(prg.arg, global_size=tuple(global_size))) + call = prg.call(*[UOp.from_buffer(b) for b in rawbufs]) + tms = [] + for _ in range(cnt): + try: tms.append(time_call(call, var_vals, timeout=timeout, clear_l2=clear_l2) * factor) + except AssertionError: return [math.inf] * cnt + if early_stop is not None and early_stop < min(tms): break + return tms + +class TimeoutException(Exception): pass +def timeout_handler(signum, frame): + if DEBUG >= 2: print("*** BEAM COMPILE TIMEOUT") + raise TimeoutException() + +def _try_compile(x:tuple[int,Scheduler]) -> tuple[int, tuple[UOp, float]|None]: + if hasattr(signal, "alarm"): + signal.signal(getattr(signal, 'SIGALRM'), timeout_handler) + # set timeout + signal.alarm(getenv("BEAM_TIMEOUT_SEC", 10)) + ret = None + try: + st = time.perf_counter() + prg = to_program(x[1].copy().get_optimized_ast(name_override="test"), x[1].ren) + et = time.perf_counter() - st + uops = prg.src[1].src + if len(uops) >= (uops_max:=getenv("BEAM_UOPS_MAX", 3000)) > 0: + if getenv("BEAM_LOG_SURPASS_MAX"): print(f"too many uops. {len(uops)=}, {uops_max=}") + raise RuntimeError("too many uops") + ret = (prg, et) + except RuntimeError: + if DEBUG >= 4: traceback.print_exc() + except Exception as e: + if getenv("BEAM_STRICT_MODE"): raise e + finally: + if hasattr(signal, "alarm"): signal.alarm(0) + return x[0], ret + +# workers should not open devices and should ignore ctrl c and should not launch VIZ +def _init_worker(): + Context(ALLOW_DEVICE_USAGE=0, VIZ=0, TRACK_MATCH_STATS=0).__enter__() + signal.signal(signal.SIGINT, signal.SIG_IGN) + +def _ensure_buffer_alloc(bufs:list[Buffer]) -> list[Buffer]: return [buf.ensure_allocated() if buf is not None else buf for buf in bufs] + +# *** external API *** + +# get dictionary of all possible actions +def get_kernel_actions(s:Scheduler, include_0=True, max_up:int|None=None) -> dict[int, Scheduler]: + acted, max_up, max_lcl = {0:s} if include_0 else {}, getenv("BEAM_UPCAST_MAX", 256) if max_up is None else max_up, getenv("BEAM_LOCAL_MAX", 1024) + kernel_actions = actions.copy() + + for i,a in enumerate(kernel_actions): + if a.axis is not None and a.op is not OptOps.TC: + try: ax = s.real_axis(a.op, a.axis) + except KernelOptError: continue + if (ax >= s.shape_len) or (s.full_shape[ax] == a.arg and Opt(a.op, a.axis, 0) in kernel_actions): continue + s2 = s.copy() + try: + s2.apply_opt(a) + up, lcl, tc_up = 1, 1, prod(tc.dims)//tc.threads if hasattr(s2, 'tensor_core') and (tc:=s2.tensor_core) else 1 + for x,t in zip(s2.full_shape, s2.axis_types): + if t in (AxisType.UPCAST, AxisType.UNROLL): up *= x + elif t in (AxisType.WARP, AxisType.LOCAL, AxisType.GROUP_REDUCE): lcl *= x + if up//tc_up > max_up or lcl > max_lcl: + if getenv("BEAM_LOG_SURPASS_MAX"): print(f"too many upcast/local. {up//tc_up=}, {max_up=}, {lcl=}, {max_lcl=}") + continue + acted[i+1] = s2 + except KernelOptError: pass + return acted + +beam_pool, BEAM_DEBUG = None, getenv("BEAM_DEBUG") +def beam_search(s:Scheduler, rawbufs:list[Buffer], amt:int, allow_test_size=True, disable_cache=IGNORE_BEAM_CACHE.value): + global beam_pool + key = {"ast": s.ast.key, "amt": amt, "allow_test_size": allow_test_size, "device": s.ren.target.device, "suffix": s.ren.suffix} + if not disable_cache and CACHELEVEL >= 1 and (val:=diskcache_get("beam_search", key)) is not None: + ret = s.copy() + for o in val[len(s.applied_opts):]: ret.apply_opt(o) + return ret + + beam: list[tuple[Scheduler, float]] = [(s, float("inf"))] + seen_libs = set() + + default_parallel = multiprocessing.cpu_count() if s.ren.target.device in {"CUDA", "AMD", "NV", "METAL", "HIP"} else 0 + if beam_pool is None and (workers := getenv("PARALLEL", default_parallel)): + beam_pool = multiprocessing.get_context("spawn").Pool(workers, _init_worker, (), getenv("BEAM_MAX_TASKS_PER_CHILD", 16)) + @atexit.register + def close_pool(): beam_pool.close() + + min_progress = getenv("BEAM_MIN_PROGRESS", 0.01)/1e6 + if BEAM_DEBUG: + print("BEAM_SEARCH:") + print(pyrender(s.ast.replace(arg=None))) + if DEBUG >= 2: print(f" 0.00s: from 1 -> 1 actions {s.colored_shape()}") + + try: + rawbufs = _ensure_buffer_alloc(rawbufs) + var_vals: dict[str, int] = {k.expr:int(k.vmax+k.vmin)//2 for k in s.ast.variables()} + exiting, st = False, time.perf_counter() + dev = Device[s.ren.target.device] + while not exiting: + candidates: list[Scheduler] = flatten([get_kernel_actions(si, include_0=False).values() for si,_ in beam]) + timed: list[tuple[Scheduler, float]] = [] + least_compute_ops = math.inf + for i, proc in ((map if beam_pool is None else beam_pool.imap_unordered)(_try_compile, enumerate(candidates))): + if proc is None: continue + prg, compile_et = proc + if (lib:=prg.src[3].arg) in seen_libs: continue + # filter out kernels that use 1000x more compute than the smallest + estimates = prg.src[0].arg.estimates + least_compute_ops = min(this_compute_ops:=sym_infer(estimates.ops if estimates is not None else 0, var_vals), least_compute_ops) + if least_compute_ops*1000 < this_compute_ops: + if getenv("BEAM_LOG_SURPASS_MAX"): print(f"too much compute. {this_compute_ops} when least is {least_compute_ops}") + continue + seen_libs.add(lib) + try: tms = _time_program(prg, var_vals, rawbufs, early_stop=beam[0][1]*3 if len(beam) else 1.0, + allow_test_size=allow_test_size, clear_l2=hasattr(dev, 'invalidate_caches'), + dev_timeout=getenv("BEAM_DEV_TIMEOUT", 1)) + except Exception as e: + if BEAM_DEBUG: print(f"BEAM failed for opts: {candidates[i].applied_opts}\n{e}") + if isinstance(e, RuntimeError): continue + raise + timed.append((candidates[i], min(tms))) + if BEAM_DEBUG > 1: + print(f"{time.perf_counter() - st:7.2f}s: {i:5d} {len(prg.src[1].src):5d} uops", + f"{time_to_str(compile_et, w=12)} compile/{time_to_str(timed[-1][1], w=12)} run", + f" {len(timed):4d}/{len(candidates):4d} {timed[-1][0].colored_shape()}") + elif DEBUG >= 2: + print(f"\r{time.perf_counter() - st:7.2f}s: {time_to_str(timed[-1][1], w=12)}", + f" {len(timed):4d}/{len(candidates):4d} {timed[-1][0].colored_shape()}\033[K", end="") + + # done + opts = sorted(timed, key=lambda x: x[1]) + exiting = len(opts) == 0 or (opts[0][1] < min_progress) or (len(beam) > 0 and ((beam[0][1]-opts[0][1]) < min_progress)) + if not exiting: beam = opts[:amt] + elif len(opts) > 0 and opts[0][1] < beam[0][1]: beam = opts[:1] + if DEBUG >= 2: + print(f"\r{time.perf_counter() - st:7.2f}s:", colored(time_to_str(beam[0][1], w=12), "green" if exiting else None), + f"from {len(candidates):3d} -> {len(opts):3d} actions\033[K", beam[0][0].colored_shape()) + except KeyboardInterrupt as e: + if beam_pool is not None: beam_pool.terminate() + raise e + + if CACHELEVEL >= 1: diskcache_put("beam_search", key, beam[0][0].applied_opts) + if BEAM_DEBUG: print(f"BEAM_SEARCH: final tm={time_to_str(beam[0][1], w=0)}, applied_opts={beam[0][0].applied_opts}") + return beam[0][0] diff --git a/artifacts/package_runtime/tinygrad/codegen/opt/tc.py b/artifacts/package_runtime/tinygrad/codegen/opt/tc.py new file mode 100644 index 000000000..52df9ce56 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/opt/tc.py @@ -0,0 +1,145 @@ +import math, functools +from dataclasses import dataclass +from tinygrad.dtype import DType, dtypes + +@dataclass(frozen=True) +class TensorCore: # D = A * B + C, A is (M x K), B is (K x N), C and D are (M x N) + dims: tuple[int,int,int] # N, M, K + threads: int # number of threads that construct the warp + elements_per_thread: tuple[int, int, int] # elements per-thread to load/store from A/B/C + dtype_in: DType # dtype for A and B + dtype_out: DType # dtype for C and D + opts: tuple[str, ...] # ordered tuple of "ux" or "lx" specifying kernel opts to perform. "ux" upcasts dim x and "lx" localizes dim x + # (local_swizzle, upcast_swizzle, reduce_swizzle) + # l is the num axis of the locals, similar for u and upcasts, r and reduces + swizzle: tuple[tuple[tuple[str, ...], tuple[str, ...], tuple[str, ...]], tuple[tuple[str, ...], tuple[str, ...], tuple[str, ...]]] + @functools.cache # pylint: disable=method-cache-max-size-none + def _remaps(self) -> list[dict[str, str]]: + local_axes, upcast_axes, reduce_axes = len(self.get_local_axes()), len(self.get_upcast_axes()), len(self.get_reduce_axes()) + fwd_st = [f"l{i}" for i in range(local_axes)] + [f"u{i}" for i in range(upcast_axes)] + [f"r{i}" for i in range(reduce_axes)] + return [dict(zip(fwd_st, sum(s, ()))) for s in self.swizzle] + def permutes_for_shape_str(self, shape_str:list[str]) -> tuple[tuple[int, ...], tuple[int, ...]]: + ret = [[shape_str.index(remap[ss]) if ss in remap else i for i,ss in enumerate(shape_str)] for remap in self._remaps()] + return tuple(ret[0]), tuple(ret[1]) + @functools.cache # pylint: disable=method-cache-max-size-none + def base_shape_str(self) -> list[str]: + ret = [] + cnt = {'u': 0, 'l': 0} + for opt in self.opts: + ret.append(f"{opt[0]}{cnt[opt[0]]}") + cnt[opt[0]] += 1 + # assumes you do the UNROLL after the opts + return ret + [f"r{i}" for i in range(len(self.get_reduce_axes()))] + def get_reduce_axes(self): return [(i, 2) for i in range(int(math.log2(self.dims[2])))] + def get_upcast_axes(self): return [opt for opt in self.opts if opt[0] == "u"] + def get_local_axes(self): return [opt for opt in self.opts if opt[0] == "l"] + def base_upcast_axes(self): + # this is defined in the swizzle. first we use the upcast axes, then the reduce + return ([f"r{i}" for i in range(len(self.get_reduce_axes()))] + [f"u{i}" for i in range(len(self.get_upcast_axes()))])[::-1] + def __str__(self): return "_".join(["WMMA"] + list(map(str, self.dims)) + [self.dtype_in.name, self.dtype_out.name]) + def __post_init__(self): + # all axes have size 2, is the order + local_axes, upcast_axes, reduce_axes = len(self.get_local_axes()), len(self.get_upcast_axes()), len(self.get_reduce_axes()) + assert self.dims[0] * self.dims[1] == 2**(local_axes + upcast_axes), \ + f"N({self.dims[0]}) x M({self.dims[1]}) != local({2**local_axes}) x upcast({2**upcast_axes}) with opts({self.opts})" + assert 2**local_axes == self.threads, f"{self.threads} threads construct the warp but found {2**local_axes} in {self.opts}" + assert 2**upcast_axes == self.elements_per_thread[2], \ + f"{self.elements_per_thread[2]} elements from C are processed per thread but found {2**upcast_axes} in {self.opts}" + # check dims match opts + assert self.dims[0] == 2**len(gd:=[x for x in self.opts if x[1] == '0']), f"opts wrong on dims[0], {self.dims[0]} vs {gd}" + assert self.dims[1] == 2**len(gd:=[x for x in self.opts if x[1] == '1']), f"opts wrong on dims[1], {self.dims[1]} vs {gd}" + # NOTE: the K opts is implictly set by the dim + # check swizzle + assert len(self.swizzle[0]) == 3 and len(self.swizzle[1]) == 3, "swizzle has wrong part count" + assert len(self.swizzle[0][0]) == len(self.swizzle[1][0]) == local_axes, "local swizzle size is wrong" + assert len(self.swizzle[0][1]) == len(self.swizzle[1][1]) == upcast_axes, "upcast swizzle size is wrong" + assert len(self.swizzle[0][2]) == len(self.swizzle[1][2]) == reduce_axes, "reduce swizzle size is wrong" + assert all(len(s) == local_axes+upcast_axes+reduce_axes for s in self._remaps()), "remaps are the wrong size" + # check elements_per_thread + un, ln = 0, 0 + zero_stride_0 = [] + zero_stride_1 = [] + for o in self.opts: + if o[1] == '0': zero_stride_0.append(o[0] + str(un if o[0] == 'u' else ln)) + if o[1] == '1': zero_stride_1.append(o[0] + str(un if o[0] == 'u' else ln)) + if o[0] == 'u': un += 1 + if o[0] == 'l': ln += 1 + # NOTE: all the zero_stride dims can be placed in any order in the swizzle + upcasted_0 = [x for x in (self.swizzle[0][1] + self.swizzle[0][2]) if x not in zero_stride_0 and x[0] != 'l'] + upcasted_1 = [x for x in (self.swizzle[1][1] + self.swizzle[1][2]) if x not in zero_stride_1 and x[0] != 'l'] + assert 2**len(upcasted_0) == self.elements_per_thread[0], f"mismatch in elements_per_thread[0], {upcasted_0} vs {self.elements_per_thread[0]}" + assert 2**len(upcasted_1) == self.elements_per_thread[1], f"mismatch in elements_per_thread[1], {upcasted_1} vs {self.elements_per_thread[1]}" + +# ***** NVIDIA ***** + +cuda_tc_opts = ("u0","l0","l0","l1","l1","l1","u1") # shared by all shapes with M=16 N=8 + +# https://docs.nvidia.com/cuda/parallel-thread-execution/#warp-level-matrix-multiply-accumulate-instructions +cuda_81616 = [TensorCore(dims=(8,16,16), threads=32, elements_per_thread=(8,4,4), dtype_in=di, dtype_out=do, opts=cuda_tc_opts, + swizzle=((('r1', 'r2', 'l2', 'l3', 'l4'), ('u1', 'r3'), ('l0', 'l1', 'u0', 'r0')), + (('r1', 'r2', 'u0', 'l0', 'l1'), ('r0', 'r3'), ('l2', 'l3', 'l4', 'u1')))) + for di,do in [(dtypes.half,dtypes.float), (dtypes.bfloat16,dtypes.float), (dtypes.half,dtypes.half)]] +cuda_81632_f8 = [TensorCore(dims=(8,16,32), threads=32, elements_per_thread=(16,8,4), dtype_in=di, dtype_out=do, opts=cuda_tc_opts, + swizzle=((('r2', 'r3', 'l2', 'l3', 'l4'), ('u1', 'r4'), ('l0', 'l1', 'u0', 'r0', 'r1')), + (('r2', 'r3', 'u0', 'l0', 'l1'), ('r1', 'r4'), ('l2', 'l3', 'l4', 'u1', 'r0')))) + for di,do in [(dtypes.fp8e4m3,dtypes.float),(dtypes.fp8e5m2,dtypes.float)]] +cuda_8168_f16 = [TensorCore(dims=(8,16,8), threads=32, elements_per_thread=(4,2,4), dtype_in=di, dtype_out=do, opts=cuda_tc_opts, + swizzle=((('r1', 'r2', 'l2', 'l3', 'l4'), ('r0', 'u1'), ('l0', 'l1', 'u0')), + (('r1', 'r2', 'u0', 'l0', 'l1'), ('u1', 'r0'), ('l2', 'l3', 'l4')))) + for di,do in [(dtypes.half,dtypes.float), (dtypes.half,dtypes.half)]] +cuda_8168_tf32 = [TensorCore(dims=(8,16,8), threads=32, elements_per_thread=(4,2,4), dtype_in=dtypes.float, dtype_out=dtypes.float, opts=cuda_tc_opts, + swizzle=((('r0', 'r1', 'l2', 'l3', 'l4'), ('u1', 'r2'), ('l0', 'l1', 'u0')), + (('r0', 'r1', 'u0', 'l0', 'l1'), ('u1', 'r2'), ('l2', 'l3', 'l4'))))] +cuda_sm75: list[TensorCore] = cuda_8168_f16 +cuda_sm80: list[TensorCore] = cuda_81616 + cuda_8168_f16 + cuda_8168_tf32 +cuda_sm89: list[TensorCore] = cuda_sm80 + cuda_81632_f8 + +def get_cuda(arch): return cuda_sm89 if (ver:=int(arch[3:])) >= 89 else cuda_sm80 if ver >= 80 else cuda_sm75 if ver >= 75 else [] + +# ***** AMD ***** + +# https://gpuopen.com/learn/wmma_on_rdna3/ +amd_rdna3 = [TensorCore(dims=(16,16,16), threads=32, elements_per_thread=(16,16,8), dtype_in=di, dtype_out=do, + opts=("l0","l0","l0","l0","l1","u1","u1","u1"), + swizzle=((('l4', 'u0', 'u1', 'u2', 'l0'), ('r1', 'r2', 'r3'), ('l1', 'l2', 'l3', 'r0')), + (('l0', 'l1', 'l2', 'l3', 'l4'), ('r1', 'r2', 'r3'), ('u0', 'u1', 'u2', 'r0')))) + for di,do in [(dtypes.half,dtypes.float),(dtypes.half,dtypes.half),(dtypes.bfloat16,dtypes.float),(dtypes.int8,dtypes.int32)]] +amd_rdna4 = [TensorCore(dims=(16,16,16), threads=32, elements_per_thread=(8,8,8), dtype_in=di, dtype_out=do, + opts=("l0","l0","l0","l0","u1","u1","u1","l1"), + swizzle=((('u0', 'u1', 'u2', 'l4', 'r2'), ('r0', 'r1', 'r3'), ('l0', 'l1', 'l2', 'l3')), + (('l0', 'l1', 'l2', 'l3', 'r2'), ('r0', 'r1', 'r3'), ('l4', 'u0', 'u1', 'u2')))) + for di,do in [(dtypes.half,dtypes.float),(dtypes.half,dtypes.half),(dtypes.bfloat16,dtypes.float),(dtypes.bfloat16,dtypes.bfloat16)]] + +# https://gpuopen.com/learn/amd-lab-notes/amd-lab-notes-matrix-cores-readme +amd_cdna_161616 = [TensorCore(dims=(16,16,16), threads=64, elements_per_thread=(4,4,4), dtype_in=di, dtype_out=do, + opts=("l0","l0","l0","l0","u1","u1","l1","l1"), + swizzle=((('u0', 'u1', 'l4', 'l5', 'r2', 'r3'), ('r0', 'r1'), ('l0', 'l1', 'l2', 'l3')), + (('l0', 'l1', 'l2', 'l3', 'r2', 'r3'), ('r0', 'r1'), ('l4', 'l5', 'u0', 'u1')))) + for di,do in [(dtypes.half,dtypes.float),(dtypes.bfloat16,dtypes.float)]] + +amd_cdna_161632 = [TensorCore(dims=(16,16,32), threads=64, elements_per_thread=(8,8,4), dtype_in=di, dtype_out=do, + opts=("l0","l0","l0","l0","u1","u1","l1","l1"), + swizzle=((('u0', 'u1', 'l4', 'l5', 'r3', 'r4'), ('r0', 'r1'), ('l0', 'l1', 'l2', 'l3', 'r2')), + (('l0', 'l1', 'l2', 'l3', 'r3', 'r4'), ('r0', 'r1'), ('l4', 'l5', 'u0', 'u1', 'r2')))) + for di,do in [(dtypes.fp8e5m2,dtypes.float),(dtypes.fp8e4m3,dtypes.float),(dtypes.half,dtypes.float),(dtypes.bfloat16,dtypes.float)]] + +amd_cdna_1616128 = [TensorCore(dims=(16,16,128), threads=64, elements_per_thread=(32,32,4), dtype_in=di, dtype_out=do, + opts=("l0","l0","l0","l0","u1","u1","l1","l1"), + swizzle=((('u0', 'u1', 'l4', 'l5', 'r5', 'r6'), ('r0', 'r1'), ('l0', 'l1', 'l2', 'l3', 'r2', 'r3', 'r4')), + (('l0', 'l1', 'l2', 'l3', 'r5', 'r6'), ('r0', 'r1'), ('l4', 'l5', 'u0', 'u1', 'r2', 'r3', 'r4')))) + for di,do in [(dtypes.fp8e5m2,dtypes.float),(dtypes.fp8e4m3,dtypes.float)]] + +amd_cdna3 = amd_cdna_161632[:2] + amd_cdna_161616 + +amd_cdna4 = amd_cdna_1616128 + amd_cdna_161632 + amd_cdna_161616 + +def get_amd(arch): return {"gfx942": amd_cdna3, "gfx950": amd_cdna4, "gfx1200": amd_rdna4, "gfx1201": amd_rdna4}.get(arch, amd_rdna3) + +# ***** Apple Metal ***** + +metal = [TensorCore(dims=(8,8,8), threads=32, elements_per_thread=(2,2,2), dtype_in=di, dtype_out=do, + opts=("u0","l0","l1","l1","l0","l1"), + swizzle=((('r1', 'l1', 'l2', 'r2', 'l4'), ('r0',), ('u0', 'l0', 'l3')), + (('l0', 'r0', 'r1', 'l3', 'r2'), ('u0',), ('l1', 'l2', 'l4')))) + for di,do in [(dtypes.float,dtypes.float),(dtypes.half,dtypes.float), + (dtypes.half,dtypes.half),(dtypes.bfloat16,dtypes.float),(dtypes.bfloat16,dtypes.bfloat16)]] diff --git a/artifacts/package_runtime/tinygrad/codegen/simplify.py b/artifacts/package_runtime/tinygrad/codegen/simplify.py new file mode 100644 index 000000000..879dd0e6c --- /dev/null +++ b/artifacts/package_runtime/tinygrad/codegen/simplify.py @@ -0,0 +1,159 @@ +import itertools +from typing import Callable +from tinygrad.uop.ops import UOp, PatternMatcher, UPat, Ops, graph_rewrite, _substitute, range_start, AxisType +from tinygrad.uop.symbolic import symbolic, pm_fold_cast_const, invalid_gate +from tinygrad.helpers import partition +from tinygrad.dtype import dtypes + +def flatten_range(r:UOp) -> UOp|None: + off = range_start[r.op] + rngs = r.src[off:] + if not len(rngs): return None + # ranges in the cond should not be ended + backedge = tuple(x for x in rngs if x.dtype in (dtypes.void, dtypes.bool)) + return r.replace(src=r.src[:off]+tuple(UOp.sink(*[x for x in rngs if x not in backedge]).ranges)+backedge) + +pm_flatten_range = PatternMatcher([ + # real ranges only + (UPat((Ops.REDUCE, Ops.END), name="r"), flatten_range), +]) + +# index/range arithmetic uses FLOORDIV/FLOORMOD prior to late rewrite +def count_divmod(x:UOp) -> int: return sum(u.op in {Ops.FLOORDIV, Ops.FLOORMOD} for u in x.backward_slice) +def simplify_merge_adjacent(u:UOp) -> UOp|None: + if not all(r.op is Ops.RANGE for r in u.ended_ranges): return None + reduce_ranges = [x.ranges for x in u.backward_slice_with_self if x.op is Ops.REDUCE] + # on END we only want to merge adjacent ranges, on REDUCE we want to try all combinations + for r0, r1 in (zip(u.ended_ranges, u.ended_ranges[1:]) if u.op is Ops.END else itertools.permutations(u.ended_ranges, 2)): + # check same type + if r0.arg[-1] == r1.arg[-1]: + # check if the ranges to merge are in the same reduces + if all((r0 in rngs) == (r1 in rngs) for rngs in reduce_ranges): + s0, s1 = r0.src[0], r1.src[0] + # do the merge + new_range = r0.replace(src=(s0*s1,)) + nidx = graph_rewrite(u, _substitute+symbolic+pm_fold_cast_const+pm_flatten_range, ctx={r0:new_range//s1, r1:new_range%s1}, + name=f"check_merge_{r0.arg[0]}_{r1.arg[0]}") + + # check if it simplifies + if count_divmod(nidx) <= count_divmod(u): + u = nidx + return u + +def mark_gated(ctx, idx): + if len(idx.src) > 1 and idx.src[1].op is Ops.WHERE: + x, cond = idx.src[1].get_idx(), idx.src[1].get_valid() + # get all ranges r with guards "r < c" for some const c + guards = {r:c for v in cond.split_uop(Ops.AND) if v.op is Ops.CMPLT and (r:=v.src[0]).op is Ops.RANGE and (c:=v.src[1]).op is Ops.CONST} + else: x, guards = idx, {} + # ensure that we choose max(c_i) for all i where r < c_i + ctx |= {r:c for r,c in guards.items() if (r not in ctx or ctx[r].val < c.val)} + # but if a range is ever ungated, we cannot shrink it + ctx |= {r:r.src[0] for r in x.ranges if r not in guards} + +pm_simplify_ranges = PatternMatcher([ + (UPat((Ops.END, Ops.REDUCE), name="u"), simplify_merge_adjacent), + (UPat(Ops.INDEX, name="idx"), mark_gated), + # reduce ranges can't be shrunk + (UPat(Ops.REDUCE, name="red"), lambda ctx, red: ctx.update({r:r.src[0] for r in red.src[1:]})), + (UPat(Ops.SINK, name="x"), lambda ctx, x: do_substitute(ctx, x, lambda r,c: r.replace(src=(c,)))), +]) + +def mark_range_mod(ctx:dict[UOp, UOp|None], r:UOp, c:UOp) -> None: + # ranges that aren't looped over can't be split + if r not in ctx and r.arg[-1] not in {AxisType.WARP, AxisType.DEVICE} \ + and r.src[0].op is Ops.CONST and r.src[0].divides(c.val) is not None: ctx[r] = c + +def do_substitute(ctx:dict, x: UOp, sub_fxn:Callable[[UOp, UOp], UOp]) -> UOp|None: + ret = x.substitute({k:sub_fxn(k,v) for k,v in ctx.items() if v is not None}) + ctx.clear() + return None if ret is x else ret.simplify() + +pm_split_ranges = PatternMatcher([ + (UPat(Ops.RANGE, name="r")%UPat.cvar("c"), mark_range_mod), + (UPat(Ops.SINK, name="x"), lambda ctx, x: do_substitute(ctx, x, + lambda k,v: k.replace(src=(k.src[0]//v,), arg=k.arg[0:-1]+(0,k.arg[-1]))*v + k.replace(src=(v,), arg=k.arg[0:-1]+(1,k.arg[-1])))), +]) + +# **** reduce simplification **** + +def no_range(u:UOp) -> bool: return not any(x.op is Ops.RANGE for x in u.backward_slice_with_self) + +def reduce_unparented(red:UOp) -> UOp|None: + if red.arg[0] not in {Ops.ADD, Ops.MAX, Ops.MUL}: return None + assert all(x.op is Ops.RANGE for x in red.src[1:]), "some reduce srcs aren't ranges" + reduce_parented, reduce_unparented = partition(red.src[1:], lambda x: x in red.src[0].ranges) + if len(reduce_unparented) == 0: return None + ret = red.replace(src=(red.src[0],)+tuple(reduce_parented)) if len(reduce_parented) or red.dtype != red.src[0].dtype else red.src[0] + if red.arg[0] is Ops.ADD: + for r in reduce_unparented: ret = ret * r.src[0] + if red.arg[0] is Ops.MUL: + for r in reduce_unparented: ret = ret ** r.src[0] + return ret + +pm_reduce_unparented = PatternMatcher([ + # remove any ranges from a REDUCE that aren't referenced in the reduce source + (UPat(Ops.REDUCE, name="red"), reduce_unparented), +]) + +pm_reduce_collapse = pm_reduce_unparented + PatternMatcher([ + # lift x+y out of reduce on lt + ((UPat.var("x")+UPat.var("y")).or_casted() < UPat.var("c"), lambda x,y,c: (x < (c-y)) if no_range(y) and no_range(c) else None), + # lift x*y out of reduce + ((UPat.var("x")*UPat.var("y")) < UPat.var("c"), + lambda x,y,c: (x < ((c+y-1) // y)) if no_range(y) and no_range(c) and dtypes.is_int(y.dtype) and y.vmin > 0 else None), + # sum over r in [0,N) of [lower<=r clamp(min(upper,N) - max(lower,0), 0, N) * val + (UPat.any( + (UPat(Ops.RANGE, name="r") < UPat.var("upper")).where(UPat.var("val"), 0), + (UPat(Ops.RANGE, name="r") < UPat.var("lower")).where(0, UPat.var("val")), + ((UPat.var("r")= 0) & (idx.cast(r.dtype) < r.src[0])).where(expr.substitute({r:idx.cast(r.dtype).valid(v)}),0)), +]) + +def reduce_collapse(red:UOp, u:UOp, pm:PatternMatcher=pm_reduce_collapse) -> UOp|None: + for r in red.src[1:]: + included = u.toposort(gate=lambda x: r in x.ranges) + if any(x.op in {Ops.STORE, Ops.REDUCE} for x in included): return None + replaces: dict[UOp, UOp] = {} + for u in included: + for s in u.src: + if s in included or s in replaces or s.op in {Ops.CONST, Ops.PARAM, Ops.BUFFER}: continue + replaces[s] = UOp.variable(f'in{len(replaces)}', s.vmin, s.vmax, s.dtype) + collapse_fxn = u.substitute(replaces).reduce(r, arg=Ops.ADD) + sink = graph_rewrite(collapse_fxn, pm, name="reduce_collapse") + if not no_range(sink): return None + u = sink.substitute({v:k for k,v in replaces.items()}) + return u + +def reduce_load_collapse(red:UOp, u:UOp) -> UOp|None: return reduce_collapse(red, u, pm=pm_reduce_load_collapse) + +# remove REDUCE without loads (generic arange opt / indexing). +pm_reduce_simplify = pm_reduce_unparented + PatternMatcher([ + (UPat(Ops.REDUCE, src=(UPat.var("u"),), allow_any_len=True, arg=(Ops.ADD, 0), name="red"), reduce_collapse), +]) +# remove REDUCE on load, comes from indexing a tensor with another tensor +def no_load(u:UOp) -> bool: return not any(x.op is Ops.INDEX for x in u.backward_slice_with_self) +pm_load_collapse = PatternMatcher([ + (UPat(Ops.REDUCE, arg=(Ops.ADD, 0), src=(UPat.var("u"), UPat()), name="red"), reduce_load_collapse), + # we want to make sure we dont do math on a loaded index since that can cause overflow, this undoes the rule in pm_reduce_load_collapse + ((UPat.var("x", dtypes.weakint)+UPat.var("y")) None: + self._devices = [x.stem[len("ops_"):].upper() for x in (pathlib.Path(__file__).parent/"runtime").iterdir() if x.stem.startswith("ops_")] + self._opened_devices:set[str] = set() + @functools.cache # this class is a singleton, pylint: disable=method-cache-max-size-none + def _canonicalize(self, device:str) -> str: return re.sub(r":0$", "", (d:=device.split(":", 1)[0].upper()) + device[len(d):]) + # NOTE: you can't cache canonicalize in case Device.DEFAULT changes + def canonicalize(self, device:str|None) -> str: return self._canonicalize(device if device is not None else Device.DEFAULT) + def __getitem__(self, ix:str) -> Compiled: + ix = self.canonicalize(ix) + assert ALLOW_DEVICE_USAGE or ix.split(":")[0] in ["DISK", "TINYFS", "NPY", "PYTHON"], f"usage of device {ix} disallowed" + return self.__get_canonicalized_item(ix) + @functools.cache # this class is a singleton, pylint: disable=method-cache-max-size-none + def get_class(self, ix:str): + base = (__package__ or __name__).split('.')[0] # tinygrad + x = ix.split(":")[0].lower() + return [cls for cname, cls in inspect.getmembers(importlib.import_module(f'{base}.runtime.ops_{x}')) if (cname.lower() == x + "device")][0] + @functools.cache # this class is a singleton, pylint: disable=method-cache-max-size-none + def __get_canonicalized_item(self, ix:str) -> Compiled: + ret = self.get_class(ix)(ix) + if DEBUG >= 1: print(f"opened device {ix} from pid:{os.getpid()}") + self._opened_devices.add(ix) + return ret + @property + def default(self) -> Compiled: return self[self.DEFAULT] + def get_available_devices(self) -> Iterator[str]: + for device in ALL_DEVICES: + with contextlib.suppress(Exception): yield self[device].device + @property + def DEFAULT(self) -> str: return DEV.device or self._select_device + @DEFAULT.setter + def DEFAULT(self, v): raise AttributeError(f'setting Device.DEFAULT is deprecated, use "with Context(DEV={v!r})" or "DEV.value = {v!r}"') + @functools.cached_property + def _select_device(self) -> str: + assert (dev:=next((d for d in self._devices if d not in ["DISK", "TINYFS", "NPY"] and getenv(d) == 1), None)) is None, \ + f"{dev}=1 is deprecated, use DEV={dev} instead" + try: + device = next(self.get_available_devices()) + os.environ["DEV"] = device # we set this in environment for spawned children + return device + except StopIteration as exc: raise RuntimeError("no usable devices") from exc +Device: _Device = _Device() +atexit.register(lambda: [Device[dn].finalize() for dn in Device._opened_devices]) + +def canonicalize_device(device:str|tuple|list|None) -> str|tuple[str, ...]: + if not isinstance(device, (tuple, list)): return Device.canonicalize(device) + return canonical[0] if len(canonical:=tuple(Device.canonicalize(d) for d in device)) == 1 else canonical + +# **************** Profile **************** + +@dataclass(frozen=True) +class ProfileDeviceEvent(ProfileEvent): device:str; tdiff:decimal.Decimal=decimal.Decimal(0); props:dict[str,Any]|None=None # noqa: E702 + +@dataclass(frozen=True) +class ProfileProgramEvent(ProfileEvent): device:str; name:str; lib:bytes|None; base:int|None; tag:int|None=None # noqa: E702 + +@dataclass(frozen=True) +class ProfileGraphEntry: device:str; name:str|TracingKey; st_id:int; en_id:int # noqa: E702 + +@dataclass(frozen=True) +class ProfileGraphEvent(ProfileEvent): ents:list[ProfileGraphEntry]; deps:list[list[int]]; sigs:list[decimal.Decimal] # noqa: E702 + +# **************** Buffer + Allocators **************** + +@dataclass(frozen=True, eq=True) +class BufferSpec: + # TODO: move device, size, dtype here? + uncached: bool = False + cpu_access: bool = False + host: bool = False + nolru: bool = False + external_ptr: int|None = None + +class MultiBuffer: + def __init__(self, device:tuple[str, ...], size:int, dtype:DType): + self.bufs = [Buffer(d, size, dtype) for d in device] + @property + def size(self): return self.bufs[0].size + @property + def dtype(self): return self.bufs[0].dtype + def ref(self, cnt): + for b in self.bufs: b.ref(cnt) + return self + def is_allocated(self): return all(x.is_allocated() for x in self.bufs) + def __repr__(self): return f"" + +class Buffer: + profile_events:list[ProfileEvent] = [] + def __init__(self, device:str, size:int, dtype:DType, opaque:Any=None, options:BufferSpec|None=None, + initial_value:bytes|pickle.PickleBuffer|None=None, uop_refcount=0, base:Buffer|None=None, offset:int=0, preallocate=False): + assert isinstance(dtype, DType) + self.device, self.size, self.dtype, self.options, self.offset, self.allocated_views = device, size, dtype, options, offset, 0 + self._bufs: dict[str, Any] = {} + if base is None: + assert offset == 0, "base buffers can't have offset" + self._base = None + self._uop_refcount = uop_refcount + if opaque is not None: self.allocate(opaque) + if initial_value is not None: + self.allocate() + self.copy_from(Buffer("PYTHON", self.size, self.dtype, opaque=memoryview(bytearray(initial_value)))) + if isinstance(initial_value, pickle.PickleBuffer): initial_value.release() + else: + assert base._base is None, "base can't have a base" + assert device == base.device, "base must have the same device" + self._base = base + if preallocate: self.allocate() + @property + def base(self) -> Buffer: return self._base if self._base is not None else self + @property + def uop_refcount(self): return self.base._uop_refcount + @property + def _buf(self) -> Any: return self._bufs[self.device] + def ref(self, cnt): + self.base._uop_refcount += cnt + return self + # check if the underlying buffer is allocated and the current buffer/view is initialized + def is_initialized(self) -> bool: return self.is_allocated() and self.device in self._bufs + # check if the underlying buffer is allocated, possibly from the base object + def is_allocated(self) -> bool: return self.base.is_allocated() if self._base is not None else self.device in self._bufs + def get_buf(self, device: str) -> Any: + if device not in self._bufs: + allocator = Device[device].allocator + if device == self.device: self.ensure_allocated() + elif self._base is not None: self._bufs[device] = allocator._offset(self._base.get_buf(device), self.nbytes, self.offset) + else: self._bufs[device] = allocator.map(self.ensure_allocated()) + return self._bufs[device] + def ensure_allocated(self) -> Buffer: return self.allocate() if not self.is_initialized() else self + def allocate(self, opaque=None, external_ptr=None) -> Buffer: + assert not self.is_initialized(), "can't allocate already allocated buffer" + if DEBUG >= 7: print(f"buffer: allocate {self.nbytes} bytes on {self.device}") + if not self.device.startswith("NULL") and self.size > MAX_BUFFER_SIZE > 0 and (self.options is None or self.options.external_ptr is None): + raise RuntimeError(f"buffer of size {self.size/1e6:.2f}M is too large") + self.allocator:Allocator = Device[self.device].allocator + if external_ptr is not None: + self.options = replace(self.options, external_ptr=external_ptr) if self.options else BufferSpec(external_ptr=external_ptr) + if self._base is not None: + self._base.ensure_allocated() + self._base.allocated_views += 1 + self._bufs[self.device] = self.allocator._offset(self.base._buf, self.nbytes, self.offset) + else: + self._bufs[self.device] = opaque if opaque is not None else self.allocator.alloc(self.nbytes, self.options) + if not self.device.startswith("DISK") and (self.options is None or self.options.external_ptr is None): + GlobalCounters.mem_used += self.nbytes + GlobalCounters.mem_used_per_device[self.device] += self.nbytes + if PROFILE: Buffer.profile_events.append(ProfilePointEvent(self.device, "alloc", self.trace_num, {"dtype":self.dtype, "sz":self.size})) + return self + def deallocate(self): + assert self.device in self._bufs, "buffer must be allocated to deallocate" + if DEBUG is not None and DEBUG >= 7: print(f"buffer: deallocate {self.nbytes} bytes on {self.device}") + if self._base is None: + if GlobalCounters is not None and not self.device.startswith("DISK") and (self.options is None or self.options.external_ptr is None): + GlobalCounters.mem_used -= self.nbytes + GlobalCounters.mem_used_per_device[self.device] -= self.nbytes + if PROFILE: Buffer.profile_events.append(ProfilePointEvent(self.device, "free", self.trace_num)) + for dev, mb in self._bufs.items(): + if dev != self.device: Device[dev].allocator._unmap(mb) + self.allocator.free(self._buf, self.nbytes, self.options) + elif self._base is not None: self._base.allocated_views -= 1 + self._bufs.clear() + def __reduce_ex__(self, protocol): + buf:bytearray|pickle.PickleBuffer|None = None + if self._base is not None: + return self.__class__, (self.device, self.size, self.dtype, None, None, None, 0, self.base, self.offset, self.is_allocated()) + if self.device == "NPY": return self.__class__, (self.device, self.size, self.dtype, self._buf, self.options, None, self.uop_refcount) + if self.is_allocated(): + buf = pickle.PickleBuffer(self.as_memoryview()) if protocol >= 5 else bytearray(self.as_memoryview()) + return self.__class__, (self.device, self.size, self.dtype, None, self.options, buf, self.uop_refcount) + @property + def trace_num(self) -> int: + if not hasattr(self, '_trace_num'): self._trace_num = len(Buffer.profile_events) + return self._trace_num + @property + def nbytes(self): return self.size*self.dtype.itemsize + @suppress_finalizing + def __del__(self): (self.device not in self._bufs) or self.deallocate() + def __repr__(self): + return f"" + def as_memoryview(self, allow_zero_copy=False, force_zero_copy=False, no_sync=False) -> memoryview: + # zero copy with as_memoryview (disabled by default due to use after free) + if (force_zero_copy or allow_zero_copy) and hasattr(self.allocator, '_as_buffer'): + if not no_sync: self.allocator.dev.synchronize() + return self.allocator._as_buffer(self._buf) + assert not force_zero_copy, "force zero copy was passed, but copy is required" + Buffer("PYTHON", self.size, self.dtype, opaque=(mv:=memoryview(bytearray(self.nbytes)))).copy_from(self) + return mv + def numpy(self) -> 'np.ndarray': # type: ignore [name-defined] # noqa: F821 + import numpy as np + assert _to_np_dtype(self.dtype) is not None, f"no np dtype for {self.dtype}" + return np.frombuffer(self.as_memoryview(), dtype=_to_np_dtype(self.dtype)) + def copy_from(self, src:Buffer) -> Buffer: + assert self.nbytes == src.nbytes, f"copy size mismatch, {self.nbytes} != {src.nbytes}" + assert self.is_initialized() and src.is_initialized(), "copy requires allocated buffers" + from tinygrad.engine.realize import run_linear + from tinygrad.uop.ops import UOp, Ops + du, su = UOp.from_buffer(self), UOp.from_buffer(src) + run_linear(UOp(Ops.LINEAR, src=(su.param_like(1).copy_to_device(self.device).call(du, su),)), update_stats=False) + return self + def view(self, size:int, dtype:DType, offset:int) -> Buffer: + assert offset < self.nbytes, "offset must be less than nbytes" + return Buffer(self.device, size, dtype, base=self.base, offset=self.offset+offset) + +DeviceType = TypeVar('DeviceType', bound='Compiled') + +# TODO: size, dest, src are the same type. can we enforce this? +class Allocator(Generic[DeviceType]): + def __init__(self, dev:DeviceType, supports_copy_from_disk:bool=True, supports_transfer:bool=True): + self.dev: DeviceType = dev + self.default_buffer_spec: BufferSpec = BufferSpec() + self.supports_copy_from_disk, self.supports_transfer = supports_copy_from_disk, supports_transfer + # overridden in LRUAllocator + def alloc(self, size:int, options:BufferSpec|None=None): + assert size > 0, f"alloc size must be positive, getting {size}" + try: return self._alloc(size, options if options is not None else self.default_buffer_spec) + except (RuntimeError, MemoryError) as e: raise MemoryError(f"Allocation of {size_to_str(size)} failed on {self.dev.device}. " + f"Used: {size_to_str(GlobalCounters.mem_used_per_device[self.dev.device])}") from e + def free(self, opaque, size:int, options:BufferSpec|None=None): + self._free(opaque, options if options is not None else self.default_buffer_spec) + + def map(self, buf:Buffer): return self._map(buf.ensure_allocated()._buf) + + # implemented by the runtime + def _alloc(self, size:int, options:BufferSpec): raise NotImplementedError("need alloc") + def _free(self, opaque, options:BufferSpec): pass # if opaque is a Python object, you don't need a free + def _copyin(self, dest, src:memoryview): raise NotImplementedError("need copyin") + def _copyout(self, dest:memoryview, src): raise NotImplementedError("need copyout") + def _map(self, buf): raise NotImplementedError("need map") + def _unmap(self, mb): pass # default no-op; override if _map allocates iface-side state + # def _as_buffer(self, src) -> memoryview: + def _offset(self, buf, size:int, offset:int): raise NotImplementedError("need offset") + # def _transfer(self, dest, src, sz:int, src_dev, dest_dev): + def _encode_decode(self, bufout, bufin, desc, hist:list, shape:tuple[int,...], frame_pos:int): raise NotImplementedError("need encdec") # optional + +class LRUAllocator(Allocator, Generic[DeviceType]): + """ + The LRU Allocator is responsible for caching buffers. + It ensures that buffers are not freed until it is absolutely necessary, optimizing performance. + """ + def __init__(self, dev:DeviceType, **kwargs): + self.cache: dict[tuple[int, BufferSpec|None], Any] = defaultdict(list) + super().__init__(dev, **kwargs) + def alloc(self, size:int, options:BufferSpec|None=None): + if len(c := self.cache[(size, options)]): return c.pop() + try: return super().alloc(size, options) + except (RuntimeError, MemoryError): + self.free_cache() + return super().alloc(size, options) + def free_cache(self): + for (sz,options),opaques in self.cache.items(): + for opaque in opaques: super().free(opaque, sz, options) + opaques.clear() + def free(self, opaque:Any, size:int, options:BufferSpec|None=None): + if LRU and (options is None or (not options.nolru and options.external_ptr is None)): self.cache[(size, options)].append(opaque) + else: super().free(opaque, size, options) + +class DepsTracker: + def __init__(self): + # tracks (offset, end, dep) ranges per base buffer id to handle suballocated buffers correctly. + self.w_dependency_map: dict[int, list[tuple[int, int, Any]]] = defaultdict(list) + self.r_dependency_map: dict[int, list[tuple[int, int, Any]]] = defaultdict(list) + + @staticmethod + def _key(buf:Any) -> tuple[Any, int, int]: return id(buf.base), buf.offset, buf.offset + buf.nbytes + + def access_resources(self, bufs:list[Any], write:list[int], new_dependency:Any): + wait_nodes = [] + for i,buf in enumerate(bufs): + key, s, e = self._key(buf) + wait_nodes += [dep for st,en,dep in self.w_dependency_map[key] if st < e and s < en] + if i in write: wait_nodes += [dep for st,en,dep in self.r_dependency_map[key] if st < e and s < en] + for i,buf in enumerate(bufs): + key, s, e = self._key(buf) + if i in write: + for dmap in [self.w_dependency_map, self.r_dependency_map]: + kept = [] + for st,en,dep in dmap[key]: + if st < min(s, en): kept.append((st, min(s, en), dep)) + if max(e, st) < en: kept.append((max(e, st), en, dep)) + dmap[key] = kept + self.w_dependency_map[key].append((s, e, new_dependency)) + else: self.r_dependency_map[key].append((s, e, new_dependency)) + return list({id(x):x for x in wait_nodes}.values()) + +# **************** for Compiled Devices **************** + +class CompileError(Exception): pass + +class Compiler: + def __init__(self, cachekey:str|None=None): self.cachekey = cachekey if CCACHE else None + def compile(self, src:str) -> bytes: return src.encode() # NOTE: empty compiler is the default + def compile_cached(self, src:str) -> bytes: + if self.cachekey is None or (lib := diskcache_get(self.cachekey, src)) is None: + assert not getenv("ASSERT_COMPILE"), f"tried to compile with ASSERT_COMPILE set\n{src}" + lib = self.compile(src) + if self.cachekey is not None: diskcache_put(self.cachekey, src, lib) + return lib + def disassemble(self, lib:bytes): pass + +@dataclass +class TinyELF: + lib: bytes + name: str + target: Target + # tuple of (name, slot, dtype, shape) + signature: tuple[tuple[str|None, int, DType, tuple], ...] + + @staticmethod + def iter_sig(signature:tuple[tuple[str|None, int, DType, tuple], ...], offset:int=0) -> Generator[tuple[int, DType], None, None]: + for _,_,dt,_ in signature: + yield (offset:=round_up(offset, dt.itemsize)), dt + offset += dt.itemsize + +class Program(Generic[DeviceType]): + def __init__(self, dev:DeviceType, obj:TinyELF): pass + def __call__(self, *bufs, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), vals:tuple[int, ...]=(), + wait=False) -> float|None: pass + +class Compiled: + profile_events:list[ProfileEvent] = [ProfileDeviceEvent("CPU")] # NOTE: CPU is the default device. + + pm_lower:Any = None + pm_bufferize:Any = None + + def __init__(self, device:str, allocator:Allocator, renderers:list[type[Renderer]], runtime:type[Program[Self]]|None, graph=None, arch=None): + from tinygrad.renderer import Renderer + self.device, self.allocator, self.runtime_t, self.graph, self.renderers = device, allocator, runtime, graph, renderers or [Renderer] + self.arch = arch + self.cached_renderer:dict[Any, Renderer] = {} + + @property + def renderer(self) -> Renderer: return self._select_renderer() + + @property + def compiler(self) -> Compiler: + if (ret:=self.renderer.compiler) is None: raise RuntimeError(f"no compiler for {self.device}") + return ret + + def runtime(self, obj:TinyELF) -> Program[Self]: return unwrap(self.runtime_t)(self, obj) + + def _renderer_name(self, r:type[Renderer]) -> str: + return r.__name__.upper().removesuffix("RENDERER").removeprefix(devname:=self.device.split(':')[0].upper()) or devname + + def _select_renderer(self) -> Renderer: + assert (rn:=next((self._renderer_name(r) for r in self.renderers if getenv(f"{self.device}_{self._renderer_name(r)}")), None)) is None, \ + f"{self.device}_{rn}=1 is deprecated, use DEV={self.device}:{rn} or {self.device}_CC={rn} instead" + t = DEV.target(self.device.split(':')[0], **({"arch":self.arch} if self.arch else {})) + return select_first_inited(select_by_name(self.renderers, self._renderer_name, t.renderer, f"{self.device} has no renderer {t.renderer!r}"), + f"No renderer for {self.device} is available", self.cached_renderer, t) + + def count(self) -> int: + """ + Returns the number of physical accelerators available to the runtime. + """ + return 1 + + def synchronize(self): + """ + Synchronize all pending operations on the device. + + This method ensures that all previously queued operations on the device have been completed before proceeding. + """ + # override this in your device implementation + def _at_profile_finalize(self): + """ + Called at the end of profiling to allow the device to finalize any profiling. + """ + # override this in your device implementation + def finalize(self): + """ + Called at the end of process lifetime to allow the device to finalize. + """ + # override this in your device implementation + +if PROFILE: + @atexit.register + def finalize_profile(): + devs = [Device[d] for d in Device._opened_devices] + for dev in devs: dev.synchronize() + for dev in devs: dev._at_profile_finalize() + + with open(fn:=temp("profile.pkl", append_user=True), "wb") as f: pickle.dump(cpu_events+Compiled.profile_events+Buffer.profile_events, f) + + PROFILE.value = 0 + from tinygrad.uop.ops import launch_viz + launch_viz("PROFILE", fn) + +def enumerate_devices_str() -> Generator[str, None, None]: + from tinygrad import Tensor, Device + + for device in ALL_DEVICES: + ren_results, iface_results = [], [] + try: + d = Device[device] + for iface in [i for i in getattr(d, 'ifaces', []) if not i.__name__.startswith("MOCK")]: + try: + name = iface.__name__[:-5] + default_text, count = ("(default)", d.count()) if type(d.iface) is iface else (f"(DEV={name}+{device} to make default)", iface(d, 0).count) # type: ignore + iface_results.append(f"{colored('+', 'green')} {name}: {pluralize('device', count)} {default_text}") + except Exception as e: iface_results.append(f"{colored('-', 'red')} {iface.__name__[:-5]}: {e}") + for r in d.renderers: + try: + with Context(CACHELEVEL=0, DEV=f"{device}:{d._renderer_name(r)}"): test = (Tensor([1,2,3], device=device) * 2).tolist() + if test != [2,4,6]: raise ValueError(f"got {test} instead of [2, 4, 6]") + default_text = '(default)' if type(d.renderer) is r else f'(DEV={device}:{d._renderer_name(r)} to make default)' + ren_results.append(f"{colored('+', 'green')} {d._renderer_name(r)} {default_text}") + except Exception as e: ren_results.append(f"{colored('-', 'red')} {d._renderer_name(r)}: {e}") + result = (colored('PASS', 'green') + ("\n"+" "*12+"interfaces:\n" if iface_results else "") + '\n'.join([" "*13+x for x in iface_results]) + + (("\n"+" "*12+"renderers:\n") + '\n'.join([" "*13+x for x in ren_results]) if len(ren_results) > 1 else "")) + except Exception as e: result = f"{colored('FAIL', 'red')} {e}" + yield f"{'*' if device == Device.DEFAULT else ' '} {device:8s}: {result}" + +if __name__ == "__main__": + for s in enumerate_devices_str(): print(s) diff --git a/artifacts/package_runtime/tinygrad/dtype.py b/artifacts/package_runtime/tinygrad/dtype.py new file mode 100644 index 000000000..9c0b336a5 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/dtype.py @@ -0,0 +1,324 @@ +from __future__ import annotations +from typing import Final, ClassVar, Callable, Literal +import math, struct, ctypes, functools +from dataclasses import dataclass, fields +from tinygrad.helpers import getenv, DEFAULT_FLOAT, DEFAULT_INT +from enum import IntEnum, auto + +class ConstFloat(float): + """Float subclass that distinguishes -0.0 from 0.0 and where nan == nan.""" + __slots__ = ('bits',) + bits: int + def __new__(cls, v:float): + obj = super().__new__(cls, v) + obj.bits = struct.unpack(' int: return (self.bitsize + 7) // 8 + @staticmethod + def new(priority:int, bitsize:int, name:str, fmt:FmtStr|None): return DType(priority, bitsize, name, fmt) + def __reduce__(self): return type(self), tuple(getattr(self, f.name) for f in fields(self)) + def __repr__(self): return f"dtypes.{INVERSE_DTYPES_DICT[self.name]}" + def __lt__(self, o:DType): return (self.priority, self.bitsize, self.name, self.fmt) < (o.priority, o.bitsize, o.name, o.fmt) + def scalar(self) -> DType: return self + @functools.cached_property + def min(self): + if dtypes.is_int(self): return 0 if dtypes.is_unsigned(self) else -2**(self.bitsize-1) + return -float("inf") if dtypes.is_float(self) else False + @functools.cached_property + def max(self): + if dtypes.is_int(self): return 2**(self.bitsize)-1+self.min + return float("inf") if dtypes.is_float(self) else True + def const(self, val: ConstType): + if isinstance(val, InvalidType): return val + # NOTE: float('nan') != float('nan'), so we canonicalize here + if isinstance(val, float) and math.isnan(val): val = math.nan + # int is the default. wrap floats in ConstFloat to distinguish -0.0 from 0.0 in cache + return ConstFloat(truncate.get(self, float)(float(val))) if dtypes.is_float(self) else bool(val) if dtypes.is_bool(self) else int(val) + + +class DTypes: + @staticmethod + @functools.cache + def is_float(x: DType) -> bool: return x in (dtypes.floats + (dtypes.weakfloat,)) + @staticmethod # static methods on top, or bool in the type info will refer to dtypes.bool + @functools.cache + def is_int(x: DType) -> bool: return x in (dtypes.ints + (dtypes.weakint,)) + @staticmethod + @functools.cache + def is_unsigned(x: DType) -> bool: return x in dtypes.uints + @staticmethod + def is_bool(x: DType) -> bool: return x == dtypes.bool + @staticmethod + def from_py(x) -> DType: + # NOTE: isinstance(True, int) is True, so bool must be checked before int + if isinstance(x, (bool, InvalidType)): return dtypes.bool + if isinstance(x, float): return dtypes.weakfloat + if isinstance(x, int): return dtypes.weakint + # put this in the last is faster because there are more items than lists/tuples to check + if isinstance(x, (list, tuple)): return strong_dtype(max(dtypes.from_py(xi) for xi in x)) if x else dtypes.default_float + raise RuntimeError(f"Could not infer dtype of {x} with type {type(x)}") + @staticmethod + def finfo(dtype:DType) -> tuple[int, int]: + """(exponent, mantissa)""" + if not dtypes.is_float(dtype): raise ValueError(f"{dtype} is not a floating point type") + return {dtypes.float16: (5, 10), dtypes.bfloat16: (8, 7), dtypes.float32: (8, 23), dtypes.float64: (11, 52), + dtypes.fp8e4m3: (4, 3), dtypes.fp8e5m2: (5, 2), dtypes.fp8e4m3fnuz: (4, 3), dtypes.fp8e5m2fnuz: (5, 2)}[dtype] + void: Final[DType] = DType.new(-1, 0, "void", None) + weakint: Final[DType] = DType.new(0, 800, "weakint", None) # the weak int position in the promo lattice + bool: Final[DType] = DType.new(0, 1, "bool", '?') + int8: Final[DType] = DType.new(1, 8, "signed char", 'b') + uint8: Final[DType] = DType.new(2, 8, "unsigned char", 'B') + int16: Final[DType] = DType.new(3, 16, "short", 'h') + uint16: Final[DType] = DType.new(4, 16, "unsigned short", 'H') + int32: Final[DType] = DType.new(5, 32, "int", 'i') + uint32: Final[DType] = DType.new(6, 32, "unsigned int", 'I') + int64: Final[DType] = DType.new(7, 64, "long", 'q') + uint64: Final[DType] = DType.new(8, 64, "unsigned long", 'Q') + _uint128: Final[DType] = DType.new(8, 128, "uint128", None) + _uint256: Final[DType] = DType.new(8, 256, "uint256", None) + weakfloat: Final[DType] = DType.new(9, 800, "weakfloat", None) + fp8e4m3: Final[DType] = DType.new(10, 8, "float8_e4m3", None) + fp8e5m2: Final[DType] = DType.new(11, 8, "float8_e5m2", None) + fp8e4m3fnuz: Final[DType] = DType.new(10, 8, "float8_e4m3fnuz", None) + fp8e5m2fnuz: Final[DType] = DType.new(11, 8, "float8_e5m2fnuz", None) + float16: Final[DType] = DType.new(12, 16, "half", 'e') + bfloat16: Final[DType] = DType.new(13, 16, "__bf16", None) + float32: Final[DType] = DType.new(14, 32, "float", 'f') + float64: Final[DType] = DType.new(15, 64, "double", 'd') + + # dtype aliases + half = float16; float = float32; double = float64 # noqa: E702 + uchar = uint8; ushort = uint16; uint = uint32; ulong = uint64 # noqa: E702 + char = int8; short = int16; int = int32; long = int64 # noqa: E702 + + @property + def default_float(self) -> DType: return to_dtype(DEFAULT_FLOAT.value) + @property + def default_int(self) -> DType: return to_dtype(DEFAULT_INT.value) + + fp8_ocp = (fp8e4m3, fp8e5m2) + fp8_fnuz = (fp8e4m3fnuz, fp8e5m2fnuz) + fp8s = fp8_ocp + fp8_fnuz + floats = fp8s + (float16, bfloat16, float32, float64) + int8s = (uint8, int8) + int16s = (uint16, int16) + int32s = (uint32, int32) + int64s = (uint64, int64) + uints = (uint8, uint16, uint32, uint64) + sints = (int8, int16, int32, int64) + ints = uints + sints + weaks = (weakint, weakfloat) + all = floats + ints + (bool,) # noqa: A003 + +dtypes = DTypes() + +DTypeLike = str|DType +def to_dtype(dtype:DTypeLike) -> DType: return dtype if isinstance(dtype, DType) else getattr(dtypes, dtype.lower()) +assert dtypes.is_float(dtypes.default_float), f"{DEFAULT_FLOAT.value} is not a float dtype" +assert dtypes.is_int(dtypes.default_int), f"{DEFAULT_INT.value} is not an int dtype" +def strong_dtype(dtype:DType) -> DType: + return {dtypes.weakint: dtypes.default_int, dtypes.weakfloat: dtypes.default_float}.get(dtype, dtype) +def weak_dtype(dtype:DType) -> DType: + return dtypes.weakfloat if dtypes.is_float(dtype) else dtypes.weakint if dtypes.is_int(dtype) else dtype + +# https://jax.readthedocs.io/en/latest/jep/9407-type-promotion.html +# we don't support complex type +promo_lattice = { dtypes.bool: [dtypes.weakint], dtypes.weakint: [dtypes.int8, dtypes.uint8], + dtypes.int8: [dtypes.int16], dtypes.int16: [dtypes.int32], dtypes.int32: [dtypes.int64], + dtypes.int64: [dtypes.weakfloat], dtypes.uint8: [dtypes.int16, dtypes.uint16], dtypes.uint16: [dtypes.int32, dtypes.uint32], + dtypes.uint32: [dtypes.int64, dtypes.uint64], dtypes.uint64: [dtypes.weakfloat], + dtypes.weakfloat: [dtypes.fp8e4m3, dtypes.fp8e5m2, dtypes.fp8e4m3fnuz, dtypes.fp8e5m2fnuz], + dtypes.fp8e4m3: [dtypes.float16, dtypes.bfloat16], dtypes.fp8e5m2: [dtypes.float16, dtypes.bfloat16], + dtypes.fp8e4m3fnuz: [dtypes.float16, dtypes.bfloat16], dtypes.fp8e5m2fnuz: [dtypes.float16, dtypes.bfloat16], + dtypes.float16: [dtypes.float32], dtypes.bfloat16: [dtypes.float32], dtypes.float32: [dtypes.float64], } + +@functools.cache +def _get_recursive_parents(dtype:DType) -> set[DType]: + return set.union(*[_get_recursive_parents(d) for d in promo_lattice[dtype]], {dtype}) if dtype != dtypes.float64 else {dtypes.float64} +@functools.cache +def least_upper_dtype(*ds:DType) -> DType: + return min(set.intersection(*[_get_recursive_parents(d) for d in ds])) +def least_upper_float(dt:DType) -> DType: + return dtypes.weakfloat if dt is dtypes.weakint else dt if dtypes.is_float(dt) else least_upper_dtype(dt, dtypes.default_float) + +DTYPES_DICT = {k: v for k, v in DTypes.__dict__.items() if isinstance(v, DType) and not k.startswith(("default", "void", "weak", "_"))} +INVERSE_DTYPES_DICT = {**{v.name:k for k,v in DTYPES_DICT.items()}, "void": "void", "weakint":"weakint", "weakfloat":"weakfloat"} + +@functools.cache +def can_lossless_cast(dt0:DType, dt1:DType) -> bool: + # return if dt1 preserves value of dt0 + # similar to https://numpy.org/doc/stable/reference/generated/numpy.can_cast.html + if dt0 == dt1 or dt0 == dtypes.bool: return True + match dt1: + case dtypes.weakint: return dt0 in dtypes.ints + case dtypes.double: return dt0 in (dtypes.float, dtypes.half, dtypes.bfloat16, *dtypes.fp8s, + dtypes.uint32, dtypes.uint16, dtypes.uint8, dtypes.int32, dtypes.int16, dtypes.int8) + case dtypes.float: return dt0 in (dtypes.half, dtypes.bfloat16, *dtypes.fp8s, dtypes.uint16, dtypes.uint8, dtypes.int16, dtypes.int8) + case dtypes.half: return dt0 in (*dtypes.fp8s, dtypes.uint8, dtypes.int8) + case dtypes.uint64: return dt0 in (dtypes.uint32, dtypes.uint16, dtypes.uint8) + case dtypes.uint32: return dt0 in (dtypes.uint16, dtypes.uint8) + case dtypes.uint16: return dt0 in (dtypes.uint8,) + case dtypes.int64: return dt0 in (dtypes.uint32, dtypes.uint16, dtypes.uint8, dtypes.int32, dtypes.int16, dtypes.int8) + case dtypes.int32: return dt0 in (dtypes.uint16, dtypes.uint8, dtypes.int16, dtypes.int8) + case dtypes.int16: return dt0 in (dtypes.uint8, dtypes.int8) + case _: return False + +def sum_acc_dtype(dt:DType): + # default acc dtype for sum + if dtypes.is_unsigned(dt): return least_upper_dtype(dt, dtypes.uint) + if dtypes.is_int(dt) or dt == dtypes.bool: return least_upper_dtype(dt, dtypes.int) + return least_upper_dtype(dt, to_dtype(getenv("SUM_DTYPE", "float32"))) + +def float_to_fp16(x): + try: return struct.unpack('e', struct.pack('e', float(x)))[0] + except OverflowError: return math.copysign(math.inf, x) + +def float_to_bf16(x): + if not math.isfinite(x): return x + u = struct.unpack('I', struct.pack('f', x))[0] + u = (u + 0x7FFF + ((u >> 16) & 1)) & 0xFFFF0000 + return struct.unpack('f', struct.pack('I', u))[0] + +# fp8-float conversions based on https://gitlab.com/nvidia/headers/cuda-individual/cudart/-/blob/main/cuda_fp8.hpp +# (bias, sig_bits, mant_mask, min_denorm_half, ovf_threshold, max_norm, min_norm) +_fp8_cfg = { + dtypes.fp8e4m3: (7, 4, 0x7, 0x3F50000000000000, 0x407D000000000000, 0x7E, 0x3F90000000000000), + dtypes.fp8e5m2: (15, 3, 0x3, 0x3EE0000000000000, 0x40EE000000000000-1, 0x7B, 0x3F10000000000000), + dtypes.fp8e4m3fnuz: (8, 4, 0x7, 0x3F40000000000000, 0x406F000000000000-1, 0x7F, 0x3F80000000000000), + dtypes.fp8e5m2fnuz: (16, 3, 0x3, 0x3ED0000000000000, 0x40EE000000000000-1, 0x7F, 0x3F00000000000000), +} + +def float_to_fp8(x: float, dtype: DType) -> int: + assert dtype in dtypes.fp8s, "Only for fp8s" + if dtype in dtypes.fp8_fnuz and not math.isfinite(x): return 0x80 + if dtype in dtypes.fp8_fnuz and x == 0.0: return 0x00 + # e4m3 don't support inf, return 0x7f(+NaN) and 0xff(-NaN) to match jax + # NaN is unordered, can't compare with zero, use math.copysign to get sign + if dtype == dtypes.fp8e4m3 and not math.isfinite(x): return 0x7f if math.copysign(1, x) > 0 else 0xff + if dtype == dtypes.fp8e5m2 and not math.isfinite(x): return (0 if math.copysign(1, x) > 0 else 0x80) | (0x7c if math.isinf(x) else 0x7f) + bias, sig_bits, mant_mask, min_denorm_half, ovf_threshold, max_norm, min_norm = _fp8_cfg[dtype] + xbits, = struct.unpack('Q', struct.pack('d', x)) + half_ulp = 1 << (52 - sig_bits) + sign, exp, mantissa, absx = ((xbits>>63)&1)<<7, ((xbits>>52)&0x7FF)-1023+bias, (xbits>>(53-sig_bits))&mant_mask, xbits&0x7FFFFFFFFFFFFFFF + if absx <= min_denorm_half: res = 0 + elif absx > ovf_threshold: res = max_norm + elif absx >= min_norm: + res, round_bits = (exp << (sig_bits - 1)) | mantissa, xbits & ((half_ulp << 1) - 1) + if round_bits > half_ulp or (round_bits == half_ulp and mantissa & 1): res += 1 + else: + shift = 1 - exp + mantissa |= 1 << (sig_bits - 1) + res, half = mantissa >> shift, half_ulp << shift + round_bits = (xbits | (1 << 52)) & ((half << 1) - 1) + if round_bits > half or (round_bits == half and res & 1): res += 1 + return 0 if dtype in dtypes.fp8_fnuz and res == 0 else int(res | sign) # fnuz has no negative zero + +def fp8_to_float(x: int, dtype: DType) -> float: + assert dtype in dtypes.fp8s, "Only for fp8s" + if dtype in dtypes.fp8_fnuz and x == 0x80: return math.nan + if (x & 0x7F) == 0: return -0.0 if x & 0x80 else 0.0 + bias, sig_bits, *_ = _fp8_cfg[dtype] + mant_bits, exp_bits = sig_bits - 1, 8 - sig_bits + exp_max, mant_max = (1 << exp_bits) - 1, (1 << mant_bits) - 1 + sign, exp, mantissa = (x >> 7) & 1, (x >> mant_bits) & exp_max, x & mant_max + if dtype not in dtypes.fp8_fnuz and exp == exp_max: + if dtype == dtypes.fp8e5m2: return math.copysign(math.nan if mantissa else math.inf, -1 if sign else 1) + if mantissa == mant_max: return math.nan + val = (mantissa / (mant_max + 1)) * 2 ** (1 - bias) if exp == 0 else (1 + mantissa / (mant_max + 1)) * 2 ** (exp - bias) + return -val if sign else val + +def storage_fmt_for_dtype(dtype:DType): return 'H' if dtype == dtypes.bfloat16 else 'B' if dtype in dtypes.fp8s else dtype.fmt + +def to_storage_scalar(x, dtype:DType): + if dtype == dtypes.half: return float_to_fp16(x) + if dtype == dtypes.bfloat16: return (struct.unpack('I', struct.pack('f', float_to_bf16(x)))[0] >> 16) & 0xFFFF + if dtype in dtypes.fp8s: return float_to_fp8(float(x), dtype) + return x + +def from_storage_scalar(x, dtype:DType): + if dtype == dtypes.bfloat16: return struct.unpack('f', struct.pack('I', (x & 0xFFFF) << 16))[0] + if dtype in dtypes.fp8s: return fp8_to_float(int(x), dtype) + return x + +truncate: dict[DType, Callable] = {dtypes.bool: bool, + dtypes.float16: float_to_fp16, dtypes.bfloat16: lambda x: float_to_bf16(float(x)), + **{fp8: (lambda x, dtype=fp8: fp8_to_float(float_to_fp8(x, dtype), dtype)) for fp8 in dtypes.fp8s}, + **{getattr(dtypes, n): (lambda x, c=getattr(ctypes, f'c_{n}'): c(x).value) + for n in ('float', 'double', 'int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64')}} + +def bitcast(x, in_dtype:DType, out_dtype:DType): + assert in_dtype.itemsize == out_dtype.itemsize, "bitcast itemsize mismatch" + packed = struct.pack(storage_fmt_for_dtype(in_dtype), to_storage_scalar(x, in_dtype)) + out_val = struct.unpack(storage_fmt_for_dtype(out_dtype), packed)[0] + return from_storage_scalar(out_val, out_dtype) + +# numpy and torch dtype interop + +def _to_np_dtype(dtype:DType) -> type|None: + import numpy as np + if dtype in { dtypes.bfloat16, *dtypes.fp8s }: return np.float32 + return np.dtype(dtype.fmt).type if dtype.fmt is not None else None +def _from_np_dtype(npdtype:'np.dtype') -> DType: # type: ignore [name-defined] # noqa: F821 + import numpy as np + return DTYPES_DICT[np.dtype(npdtype).name] + +@functools.cache +def _to_torch_dtype(dtype:DType) -> 'torch.dtype'|None: # type: ignore [name-defined] # noqa: F821 + import numpy as np, torch + dtype = strong_dtype(dtype) + if dtype == dtypes.uint64: return torch.uint64 + if dtype == dtypes.bfloat16: return torch.bfloat16 + if dtype in dtypes.fp8s: return torch.uint8 + # NOTE: torch doesn't expose this mapping with a stable API + try: return torch.from_numpy(np.array([], dtype=_to_np_dtype(dtype))).dtype + except TypeError: return None +@functools.cache +def _from_torch_dtype(torchdtype:'torch.dtype') -> DType: # type: ignore [name-defined] # noqa: F821 + return {v:k for k in DTYPES_DICT.values() if (v:=_to_torch_dtype(k)) is not None}[torchdtype] diff --git a/artifacts/package_runtime/tinygrad/engine/__init__.py b/artifacts/package_runtime/tinygrad/engine/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/engine/jit.py b/artifacts/package_runtime/tinygrad/engine/jit.py new file mode 100644 index 000000000..fe11805c1 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/engine/jit.py @@ -0,0 +1,296 @@ +from typing import TypeVar, Generic, Callable, Any, overload +import functools +from tinygrad.tensor import Tensor, all_tensors +from tinygrad.helpers import flatten, merge_dicts, DEBUG, Context, BEAM, getenv, JIT, JIT_BATCH_SIZE, dedup, pluralize, VIZ, disable_gc +from tinygrad.device import Buffer, Compiled, Device, MultiBuffer, DepsTracker +from tinygrad.dtype import DType +from tinygrad.uop.ops import UOp, PatternMatcher, Variable, sym_infer, Ops, buffers, rewrite_group, graph_rewrite +from tinygrad.renderer import Estimates +from tinygrad.engine.realize import capturing, compile_linear, link_linear, run_linear, graph_cache, estimate_uop, get_runtime +from tinygrad.engine.realize import unwrap_multi, resolve_params, get_call_arg_uops, get_call_outs_ins +from tinygrad.schedule.memory import memory_plan_rewrite, _collect_bufs +from tinygrad.nn.state import get_parameters +from tinygrad.uop.movement import mop_cleanup +from dataclasses import dataclass + +def prune_linear(linear:UOp, needed:set[UOp]) -> tuple[UOp, UOp]: + kept, onetime = [], [] + for si in linear.src: + si_bufs = {b for src in si.src[1:] for b in _collect_bufs(src)} + if not si_bufs.isdisjoint(needed): + kept.append(si) + needed |= si_bufs + else: onetime.append(si) + return linear.replace(src=tuple(kept)), linear.replace(src=tuple(onetime)) + +def create_graph_call(batch:list[UOp]) -> UOp: + # all external inputs are PARAMs + input_list = dedup(u for si in batch for b in si.src[1:] for u in b.toposort() if u.op is Ops.PARAM) + cf = UOp(Ops.CUSTOM_FUNCTION, src=(UOp(Ops.LINEAR, src=tuple(batch)),), arg="graph") + return cf.call(*input_list) + +def graph_split_rewrite(linear:UOp, max_batch_size:int=0) -> UOp: + new_src: list[UOp] = [] + current_batch: list[UOp] = [] + current_batch_devs: list[Compiled] = [] + + def flush_batch(): + nonlocal current_batch, current_batch_devs, max_batch_size, new_src + if len(current_batch) <= 1 and not getenv("GRAPH_ONE_KERNEL"): new_src.extend(current_batch) + else: + new_src.append(create_graph_call(current_batch)) + max_batch_size *= 2 + if DEBUG >= 2: print(f"JIT GRAPHing batch with {len(current_batch)} kernels") + current_batch, current_batch_devs = [], [] + + for si in linear.src: + if si.src[0].op is Ops.SLICE: continue + + devs = dedup([Device[x] for b in si.src[1:] if b.op is not Ops.BIND for x in (b.device if isinstance(b.device, tuple) else (b.device,))]) + graph_t = graph_class(devs[0]) if devs[0].graph is not None else None + + can_graph = graph_t is not None and graph_t.supports_uop(devs, si) + can_extend = can_graph and graph_t is not None and (not current_batch_devs or graph_t.supports_uop(current_batch_devs, si)) \ + and (max_batch_size == 0 or len(current_batch) < max_batch_size) + if not can_extend and current_batch: flush_batch() + + # append this si and update devs + (current_batch if can_graph else new_src).append(si) + current_batch_devs = dedup(current_batch_devs + devs) if can_graph else [] + if current_batch: flush_batch() + return linear.replace(src=tuple(new_src)) + +def _copy_input(u:UOp) -> UOp: + run_linear(UOp(Ops.LINEAR, src=(u.copy_to_device(u.device).call(new:=UOp.new_buffer(u.device, u.max_numel(), u.dtype), u),))) + return new + +@rewrite_group(lambda linear,held_bufs,input_uops,ret=(): f"JIT {pluralize('call', len(linear.src))}") +def jit_lower(linear:UOp, held_bufs:set[UOp], input_uops:list[UOp]) -> UOp: + if VIZ: graph_rewrite(linear, PatternMatcher([]), name="View captured linear") + + # parametrize input buffers: map each input buffer UOp to a PARAM with the correct slot index + linear = linear.substitute({u: UOp.param(i, u.dtype, u.shape, u.device) for i,u in enumerate(input_uops)}, walk=True) + linear = memory_plan_rewrite(linear, held_bufs) + linear = compile_linear(linear, beam=getenv("JITBEAM", BEAM.value)) + if JIT < 2: linear = graph_split_rewrite(linear, max_batch_size=JIT_BATCH_SIZE.value) + if VIZ: graph_rewrite(linear, PatternMatcher([]), name="View graphed linear") + return linear + +class GraphException(Exception): pass +class JitError(Exception): pass + +def _check_no_non_tensor_return(ret): + if ret is None or isinstance(ret, Tensor): return + if isinstance(ret, (tuple, list, dict)): + for item in (ret.values() if isinstance(ret, dict) else ret): _check_no_non_tensor_return(item) + return + raise JitError(f"JIT return contains non-Tensor value of type {type(ret).__name__}") + +def graph_class(dev): return dev.graph.func if isinstance(dev.graph, functools.partial) else dev.graph + +class GraphRunner: + def __init__(self, linear:UOp, input_uops:tuple[UOp, ...]=()): + self.linear = linear.src[0] + self.calls: list[tuple[int, UOp, list[Buffer], dict[str, int]]] = [] + self.runtimes: list[Any|None] = [] + self.uop_replace: list[list[tuple[int, int]]] = [] + for call in self.linear.src: + replace = [(p, b.arg.slot) for p, b in enumerate(get_call_arg_uops(call)) if b.op is Ops.PARAM] + for dev_idx, (bufs, device_vars) in enumerate(unwrap_multi(call, resolve_params(call, input_uops))): + self.calls.append((dev_idx, call.src[0], [b.ensure_allocated() for b in bufs], device_vars)) + self.runtimes.append(get_runtime(bufs[0].device, call.src[0]) if call.src[0].op is Ops.PROGRAM else None) + self.uop_replace.append(replace) + + self.var_vals_replace:dict[int, list[tuple[int, int]]] = {} + self.launch_dims_replace:dict[int, tuple[int|None, int|None]] = {} + self.launch_dims_base:dict[int, tuple[tuple[int|float, ...], tuple[int, ...]]] = {} + + def is_sym_dim(dim) -> bool: return not all(isinstance(d, (int, float)) for d in dim) + + crs = [(j, self.calls[j][1].arg, self.calls[j][3]) for j in range(len(self.calls)) if self.calls[j][1].op is Ops.PROGRAM] + self.vars = sorted({v.expr for _,p,dv in crs for v in p.vars if v.expr not in dv | p.runtimevars}) + self.symbolic_dims = dedup(tuple(d) for _,p,_ in crs for d in (p.local_size, p.global_size) if d and is_sym_dim(d)) + + def find_symbolic_dim(dim): return self.symbolic_dims.index(tuple(dim)) if dim is not None and tuple(dim) in self.symbolic_dims else None + + for j,p,dv in crs: + if (replace:=[(i, self.vars.index(v.expr)) for i, v in enumerate(p.vars) if v.expr not in dv | p.runtimevars]): + self.var_vals_replace[j] = replace + global_dim_idx, local_dim_idx = find_symbolic_dim(p.global_size), find_symbolic_dim(p.local_size) + if global_dim_idx is not None or local_dim_idx is not None: + self.launch_dims_replace[j] = (global_dim_idx, local_dim_idx) + assert p.local_size is not None + self.launch_dims_base[j] = (tuple(p.global_size), tuple(p.local_size)) + + estimates = sum((estimate_uop(call) for call in self.linear.src), Estimates()) + + # used in MultiGraphRunner + self.deps = DepsTracker() + + self.device, self.estimates = self.calls[0][2][0].device.split(":")[0], estimates.simplify() + + def __call__(self, input_uops:tuple[UOp, ...], var_vals:dict[str, int], wait=False) -> float|None: raise NotImplementedError("override this") + + def updated_vars(self, var_vals: dict[str, int]): + vals = [var_vals[v] for v in self.vars] + for j, vidxs in self.var_vals_replace.items(): + for i, v in vidxs: yield j, i, vals[v] + + def updated_launch_dims(self, var_vals: dict[str, int]): + dims = [tuple(sym_infer(s, var_vals) for s in dim) for dim in self.symbolic_dims] + for j, (gl, lc) in self.launch_dims_replace.items(): + yield j, (dims[gl] if gl is not None else self.launch_dims_base[j][0]), (dims[lc] if lc is not None else self.launch_dims_base[j][1]) + + def _access_resources(self, bufs:list[Buffer], write:list[int], new_dependency:Any): + return self.deps.access_resources(bufs, write, new_dependency) + + @staticmethod + def _all_devs(batch_devs:list[Compiled], new_call:UOp) -> list[Compiled]: + return dedup(batch_devs + [Device[x] for b in get_call_arg_uops(new_call) + for x in (b.device if isinstance(b.device, tuple) else (b.device,))]) + + @staticmethod + def supports_uop(batch_devs:list[Compiled], new_call:UOp) -> bool: + return new_call.src[0].op is Ops.PROGRAM and len(GraphRunner._all_devs(batch_devs, new_call)) == 1 + +# a marker for your graph supporting multiple devices of the same type +class MultiGraphRunner(GraphRunner): + @staticmethod + def supports_uop(batch_devs:list[Compiled], new_call:UOp) -> bool: + # Devices must be the same type + return new_call.src[0].op in (Ops.PROGRAM, Ops.COPY) and len(dedup([type(d) for d in GraphRunner._all_devs(batch_devs, new_call)])) == 1 + +ReturnType = TypeVar('ReturnType') +@dataclass +class CapturedJit(Generic[ReturnType]): + ret: Any # includes the Tensors or any other returned object + _linear: UOp + expected_names: list[int|str] + expected_input_info: list[tuple[UOp, tuple[Variable, ...], DType, str]] # (view, variables, dtype, device) per input + + @functools.cached_property + def linear(self) -> UOp: return link_linear(self._linear) + + def __reduce__(self): return self.__class__, (self.ret, self._linear, self.expected_names, self.expected_input_info) + + @functools.cached_property + def _written_uops(self) -> set[UOp]: + out: set[UOp] = set() + for call in self.linear.toposort(): + if call.op is not Ops.CALL: continue + arg_uops = get_call_arg_uops(call) + outs, ins = get_call_outs_ins(call) + out |= {arg_uops[k] for k in set(outs) - set(ins) if arg_uops[k].op in (Ops.BUFFER, Ops.SLICE)} + return out + + def __call__(self, input_uops:list[UOp], var_vals:dict[str, int]) -> ReturnType: + concrete = tuple(_copy_input(u) if u in self._written_uops else u for u in input_uops) + if DEBUG >= 1 and len(self.linear.src) >= 10: print(f"jit execs {len(self.linear.src)} calls") + run_linear(self.linear, var_vals, input_uops=concrete, jit=True) + return self.ret + + def free_intermediates(self): + # drop graph runners + for call in self.linear.src: + if call.src[0].op is Ops.CUSTOM_FUNCTION and call.src[0].arg == "graph": graph_cache.pop(call.src[0], None) + for u in self._written_uops: + if (buf:=buffers.get(u)) is None: continue + for b in (buf.bufs if isinstance(buf, MultiBuffer) else (buf,)): + if b.is_initialized(): b.deallocate() + if (base:=b._base) is not None and base.allocated_views == 0 and base.is_allocated(): base.deallocate() + +def _prepare_jit_inputs(args, kwargs): + input_tensors: list[tuple[int|str, Tensor]] = [(name,t) for name,t in list(enumerate(args))+sorted(kwargs.items()) if t.__class__ is Tensor] + names, tensors = [name for name,_ in input_tensors], [t for _,t in input_tensors] + # extract tensors from containers (shallow, not recursive to avoid grabbing model weights) + for x in args + tuple(kwargs.values()): + it = x if isinstance(x, (tuple,list)) else x.values() if isinstance(x, dict) else [] + tensors += [t for t in it if t.__class__ is Tensor and not any(t is y for y in tensors)] + def get_input_uops() -> list[UOp]: return flatten([[t.uop.src[0]] if t.uop.op is Ops.UNSHARD else [t.uop] for t in tensors]) + if any(u.is_virtual for u in get_input_uops()): raise JitError("JIT inputs must be real buffers; use .clone()") + if len(unrealized_tensors := [x for x in tensors if not x.uop.is_realized]): Tensor.realize(*unrealized_tensors) + input_uops = get_input_uops() + # collect buffer UOps (including MultiBuffer) + input_buf_uops: list[UOp] = [u.base for u in input_uops if u.base.realized is not None] + if len(set(input_buf_uops)) != len(input_buf_uops): raise JitError("duplicate inputs to JIT") + inputs = [(*(u.substitute({u.base:UOp(Ops.NOOP, u.base.dtype)}, extra_pm=mop_cleanup).unbind_all()), u.dtype, u.device) for u in input_uops] + _var_vals = merge_dicts([x[1] for x in inputs] + [dict(v.unbind() for v in (args + tuple(kwargs.values())) if isinstance(v, UOp))]) + var_vals = {k.expr:v for k,v in _var_vals.items()} + expected_input_info = [(x[0], tuple(sorted(x[1].keys(), key=lambda v: v.expr)), x[2], x[3]) for x in inputs] + return input_buf_uops, var_vals, names, expected_input_info + +class _TinyJit(Generic[ReturnType]): + def __init__(self, fxn:Callable[..., ReturnType]|None, captured:CapturedJit|None=None, prune=False): + assert fxn or captured, "need either a function or a CapturedJit" + self.fxn = fxn + self.captured: CapturedJit|None = captured + self.cnt: int = 2 if self.fxn is None else 0 + self.prune = prune + + def add_linear(self, linear:UOp, var_vals:dict[str, int]): self._linears.append(linear) + + def reset(self): + assert self.fxn is not None, "can't reset without function" + self.cnt = 0 + self.captured = None + + def __reduce__(self): + assert self.captured is not None, "can't pickle an uncaptured JIT" + return self.__class__, (None, self.captured) + + def __get__(self, obj, objtype): return functools.partial(self.__call__, obj) # add support for instance methods + + @disable_gc() + def __call__(self, *args, **kwargs) -> ReturnType: + input_buf_uops, var_vals, names, expected_input_info = _prepare_jit_inputs(args, kwargs) + if not JIT or self.cnt == 0: + # jit ignore + assert self.fxn is not None + with Context(BEAM=0 if getenv("IGNORE_JIT_FIRST_BEAM") else BEAM.value): + ret = self.fxn(*args, **kwargs) + if len(params:=get_parameters(ret)): Tensor.realize(*params) + elif self.cnt == 1: + # jit capture + assert self.fxn is not None + if capturing: raise RuntimeError(f"having TinyJit inside another TinyJit is not supported {len(capturing)=} {capturing=}") + self._linears: list[UOp] = [] + capturing.append(self) + try: + ret = self.fxn(*args, **kwargs) + if len(params:=get_parameters(ret)): Tensor.realize(*params) + finally: capturing.clear() + if not len(self._linears): raise JitError("didn't JIT anything!") + _check_no_non_tensor_return(ret) + if DEBUG >= 1: print(f"JIT captured {len(self._linears)} linears with {len(input_buf_uops)} inputs") + + # combine all captured linears into one, memory plan, and graph split + big_linear = UOp(Ops.LINEAR, src=tuple(flatten([l.src for l in self._linears]))) + del self._linears + + if self.prune: + big_linear, onetime_linear = prune_linear(big_linear, set(input_buf_uops)) + if DEBUG >= 1: print(f"pruned from {len(big_linear.src) + len(onetime_linear.src)} -> {len(big_linear.src)} kernels") + run_linear(onetime_linear, var_vals) + + # hold all buffers reachable from live Tensors (e.g. lazy .grad created during capture), the memory planner can't suballocate those + held_bufs = set(buffers) | {u for tref in list(all_tensors) if (t:=tref()) is not None for u in t.uop.toposort() if u.op is Ops.BUFFER} + linear = jit_lower(big_linear, held_bufs, input_buf_uops) + self.captured = CapturedJit(ret, linear, names, expected_input_info) + ret = self.captured(input_buf_uops, var_vals) + elif self.cnt >= 2: + # jit exec + assert self.captured is not None + if self.captured.expected_names != names: raise JitError(f"args mismatch in JIT: {self.captured.expected_names=} != {names}") + if self.captured.expected_input_info != expected_input_info: + raise JitError(f"args mismatch in JIT: {self.captured.expected_input_info=} != {expected_input_info=}") + ret = self.captured(input_buf_uops, var_vals) + + self.cnt += 1 + return ret + +# overload signatures support both @TinyJit and @TinyJit(prune=True) syntax +@overload +def TinyJit(fxn:Callable[..., ReturnType], *, prune:bool=False) -> _TinyJit[ReturnType]: ... +@overload +def TinyJit(fxn:None=None, *, prune:bool=False) -> Callable[[Callable[..., ReturnType]], _TinyJit[ReturnType]]: ... +def TinyJit(fxn=None, **kwargs): return (lambda f: _TinyJit(f, **kwargs)) if fxn is None else _TinyJit(fxn, **kwargs) diff --git a/artifacts/package_runtime/tinygrad/engine/realize.py b/artifacts/package_runtime/tinygrad/engine/realize.py new file mode 100644 index 000000000..3a0f640e8 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/engine/realize.py @@ -0,0 +1,306 @@ +from __future__ import annotations +from typing import cast, Iterator, Any, Sequence +import time, random, itertools, math, contextlib, weakref, array +from dataclasses import dataclass, replace, field +from tinygrad.helpers import colored, DEBUG, GlobalCounters, ansilen, all_int, prod, flatten, Context, getenv, to_tuple +from tinygrad.helpers import BEAM, size_to_str, time_to_str, VALIDATE_WITH_CPU, PROFILE, ProfilePointEvent, cpu_events, wait_cond +from tinygrad.uop.ops import Ops, PatternMatcher, UOp, UPat, AxisType, sym_infer, buffers, graph_rewrite +from tinygrad.device import Device, Buffer, MultiBuffer +from tinygrad.renderer import Estimates +from tinygrad.codegen import to_program +from tinygrad.codegen.opt.postrange import bufs_from_ast + +# **************** Helpers **************** + +def get_call_arg_uops(call:UOp) -> tuple[UOp, ...]: return tuple(s for s in call.src[1:] if s.op is not Ops.BIND) + +def get_call_outs_ins(call:UOp) -> tuple[tuple[int, ...], tuple[int, ...]]: + ast = call.src[0] + if ast.op is Ops.PROGRAM: return tuple(ast.arg.outs), tuple(ast.arg.ins) + if ast.op in (Ops.COPY, Ops.SLICE): return (0,), (1,) + if ast.op is Ops.CUSTOM_FUNCTION and ast.arg == "encdec": return (0,), tuple(range(1, len(get_call_arg_uops(call)))) + return (), () + +def get_call_name(call:UOp, bufs:Sequence[Buffer|UOp], var_vals:dict[str, int]|None=None) -> str: + def _uop_sz_to_str(uop:UOp) -> str: return size_to_str(sym_infer(prod(uop.shape) * uop.dtype.itemsize, var_vals or {})) + def _dev_str(buf:Buffer|UOp) -> str: return ', '.join(d[:7] for d in to_tuple(buf.device)) + + ast, arg_uops = call.src[0], get_call_arg_uops(call) + if ast.op is Ops.PROGRAM: return ast.arg.name + if ast.op is Ops.SLICE: + offset = ast.src[1].val * arg_uops[1].dtype.itemsize + return colored(f"view {_uop_sz_to_str(arg_uops[0]):>10} @ {offset:<10d}", "yellow") + if ast.op is Ops.COPY: return colored(f"copy {_uop_sz_to_str(arg_uops[0]):>10}, {_dev_str(bufs[0]):>7s} <- {_dev_str(bufs[1]):7s}", "yellow") + if ast.op is Ops.CUSTOM_FUNCTION and ast.arg == "encdec": return colored(f"enc/dec {_uop_sz_to_str(arg_uops[0])}", "yellow") + if ast.op is Ops.CUSTOM_FUNCTION and ast.arg == "graph": return colored(f"batched {len(ast.src[0].src)}", "cyan") + if ast.op is Ops.CUSTOM_FUNCTION and ast.arg == "hcq": return cast(str, call.arg.name) + raise NotImplementedError("get_call_name is not implemented") + +# **************** Stat **************** + +def estimate_uop(call:UOp) -> Estimates: + ast = call.src[0] + if ast.op is Ops.PROGRAM: return ast.src[0].arg.estimates or Estimates() + if ast.op is Ops.COPY or (ast.op is Ops.CUSTOM_FUNCTION and ast.arg == "encdec"): + nbytes = prod(call.src[1].shape) * call.src[1].dtype.itemsize + return Estimates(lds=nbytes, mem=nbytes) + if ast.op is Ops.CUSTOM_FUNCTION and ast.arg == "graph": return get_graph_runtime(ast).estimates + if ast.op is Ops.CUSTOM_FUNCTION and ast.arg == "hcq": return call.arg.aux.estimates + return Estimates() + +first_run_cache:set[bytes] = set() +@contextlib.contextmanager +def track_stats(ctx:ExecContext, call:UOp, device:str, bufs:list[Buffer], var_vals:dict[str, int]): + if PROFILE: + outputs, inputs = get_call_outs_ins(call) + cpu_events.append(ProfilePointEvent(device, "exec", len(cpu_events), {"var_vals": var_vals, + "bufs": [b.trace_num for b in bufs], "name": get_call_name(call, bufs, var_vals), "outputs": outputs, "inputs": inputs})) + et: list[float|None] = [None] + if DEBUG >= 2: st = time.perf_counter() + yield et + if not ctx.update_stats: return + + if DEBUG >= 2 and et[0] is None: + Device[device].synchronize() + et[0] = time.perf_counter() - st + + estimates = estimate_uop(call) + GlobalCounters.kernel_count += 1 + GlobalCounters.global_ops += (op_est:=sym_infer(estimates.ops, var_vals)) + GlobalCounters.global_mem += (mem_est:=sym_infer(estimates.mem, var_vals)) + if et[0] is not None: GlobalCounters.time_sum_s += et[0] + if DEBUG >= 2: + display_name = get_call_name(call, bufs, var_vals) + lds_est = sym_infer(estimates.lds, var_vals) + header_color = 'magenta' if ctx.jit else ('green' if call.src[0].key not in first_run_cache else None) + ptm = colored(time_to_str(et[0], w=9), "yellow" if et[0] > 0.01 else None) if et[0] is not None else "" + flops, membw, ldsbw = op_est/(et[0] or 1e-20), mem_est/(et[0] or 1e-20), lds_est/(et[0] or 1e-20) + flops_str = f"{flops*1e-9:7.0f} GFLOPS" if flops < 1e14 else colored(f"{flops*1e-12:7.0f} TFLOPS", 'green') + mem_str = f"{membw*1e-9:4.0f}|{ldsbw*1e-9:<6.0f} GB/s" if membw < 1e13 and ldsbw < 1e15 else \ + colored(f"{membw*1e-12:4.0f}|{ldsbw*1e-12:<6.0f} TB/s", 'green') + print(f"{colored(f'*** {device[:7]:7s} {GlobalCounters.kernel_count:4d}', header_color)}"+ + f" {display_name+' '*(46-ansilen(display_name))} arg {len(bufs):2d} mem {GlobalCounters.mem_used/1e9:6.2f} GB"+ + ("" if et[0] is None else f" tm {ptm}/{GlobalCounters.time_sum_s*1e3:9.2f}ms ({flops_str} {mem_str})")) + first_run_cache.add(call.src[0].key) + +local_size_cache: dict[bytes, tuple[int, ...]] = {} +def optimize_local_size(call:UOp, prg:UOp) -> UOp|None: + device = to_tuple(prg.device)[0] + if prg.arg.local_size is not None or not Device[device].renderer.has_local or not all_int(prg.arg.global_size): return None + + if (local_size:=local_size_cache.get(prg.key)) is None: + MAX_WORKGROUP = 1024 + # divisors only: a non-divisor candidate yields a fractional global size, a malformed + # dispatch some GPUs (adreno a630) execute anyway and stall on + local_dims = [[x for x in set([sz, 1, 2, 4, 8, 16, 32, 64, 128, 256, MAX_WORKGROUP]) if x<=sz and sz%x==0] for sz in prg.arg.global_size] + if getenv("NO_LOCAL_SEARCH"): + # deterministic bake without timing dispatches on the GPU (one >timeout kernel + # permanently poisons the device error_state); largest divisor within limits + rt = get_runtime(device, prg, cache=False) + max_local = min(MAX_WORKGROUP, getattr(rt, 'max_threads', MAX_WORKGROUP)) + if getattr(rt, 'pvtmem', 0) > 0: max_local = 1 + best, budget = [], max_local + for cands in local_dims: + pick = max(x for x in cands if x <= budget) + best.append(pick); budget //= pick + local_size = local_size_cache[prg.key] = tuple(best) + else: + # reuse one loaded runtime across candidates, only launch dims vary + bufs, runtime = [b.allocate() for b in bufs_from_ast(prg.src[0], device)], get_runtime(device, prg, cache=False) + def try_exec(local_size): + try: + new_gs = tuple(g//l for g,l in zip(prg.arg.global_size, local_size)) + return runtime(*[bufs[i].get_buf(device) for i in prg.arg.globals], global_size=new_gs, local_size=(*local_size,), + vals=prg.arg.vals({}), wait=True) + except Exception: return float('inf') + + local_sizes = [list(x) for x in itertools.product(*local_dims) if prod(x) <= MAX_WORKGROUP] * 2 # try each valid size twice + best_time, best = min([(try_exec(ls), ls) for ls in random.sample(local_sizes, len(local_sizes))]) + assert not math.isinf(best_time), "all optimize_local_size exec failed" + local_size = local_size_cache[prg.key] = tuple(best) + + new_global = tuple(g//l if g%l == 0 else g/l for g,l in zip(prg.arg.global_size, local_size)) + return call.replace(src=(prg.replace(arg=replace(prg.arg, global_size=new_global, local_size=local_size)), *call.src[1:])) + +# **************** runtime cache **************** + +runtime_cache: dict[tuple[bytes, str], Any] = {} +def get_runtime(device:str, ast:UOp, cache=True): + if (runtime:=runtime_cache.get(key:=(ast.key, device))) is None: + runtime = Device[device].runtime(ast.to_elf()) + if cache: runtime_cache[key] = runtime + return runtime + +graph_cache:weakref.WeakKeyDictionary[UOp, Any] = weakref.WeakKeyDictionary() +def get_graph_runtime(ast:UOp, input_uops:tuple[UOp, ...]|None=None): + assert ast.op is Ops.CUSTOM_FUNCTION and ast.arg == "graph", "get_graph_runtime should only be called with a graph ast" + if (runtime:=graph_cache.get(ast)) is None and input_uops is not None: + graph_cache[ast] = runtime = Device[ast.device if isinstance(ast.device, str) else ast.device[0]].graph(ast, input_uops=input_uops) + return runtime + +# **************** run linear **************** + +capturing: list = [] # put classes with an add_linear method in here + +@dataclass +class ExecContext: + var_vals: dict[str, int] = field(default_factory=dict) + input_uops: tuple[UOp, ...] = () + update_stats: bool = True + jit: bool = False + wait: bool = False + timeout: int|None = None + cache: bool = True + +def _resolve(b:UOp, inputs:tuple[UOp, ...]) -> UOp: + if b.op in (Ops.SLICE, Ops.MSELECT) and b.src[0].op is Ops.PARAM: return b.replace(src=(inputs[b.src[0].arg.slot], *b.src[1:])) + if b.op is Ops.MSTACK: return b.replace(src=tuple(_resolve(x, inputs) for x in b.src)) + return inputs[b.arg.slot] if b.op is Ops.PARAM else b +def resolve_params(call:UOp, inputs:tuple[UOp, ...]) -> list[UOp]: return [_resolve(b, inputs) for b in get_call_arg_uops(call)] + +def unwrap_multi(call:UOp, resolved:list[UOp]) -> Iterator[tuple[list[Buffer], dict[str, int]]]: + bufs = [b.buffer for b in resolved] + if not any(isinstance(b, MultiBuffer) for b in bufs): yield cast(list[Buffer], bufs), {} + else: + # the DEVICE axis is bound per device at launch: it's a RANGE in the AST and the _device_num variable after codegen + has_dnum = any((x.op is Ops.RANGE and x.arg[-1] is AxisType.DEVICE) or (x.op is Ops.PARAM and x.arg.name == '_device_num') + for x in call.src[0].toposort()) + for j, per_dev in enumerate(zip(*[cast(MultiBuffer, b).bufs for b in bufs])): yield list(per_dev), {"_device_num": j} if has_dnum else {} + +def exec_view(ctx:ExecContext, call:UOp, ast:UOp) -> float|None: + resolved = resolve_params(call, ctx.input_uops) + bufs = [cast(Buffer, b.buffer) for b in resolved] + bv = bufs[1].view(resolved[0].max_numel(), ast.dtype, ast.src[1].val*bufs[1].dtype.itemsize) + with track_stats(ctx, call, bv.device, [bv, bufs[1]], ctx.var_vals): buffers[resolved[0]] = bv + return None + +def exec_copy(ctx:ExecContext, call:UOp, ast:UOp) -> float|None: + for bufs, device_vars in unwrap_multi(call, resolve_params(call, ctx.input_uops)): + dest, src = bufs[0].ensure_allocated(), bufs[1].ensure_allocated() + with track_stats(ctx, call, dest.device, [dest, src], ctx.var_vals): + if hasattr(dest.allocator,'_transfer') and dest.allocator.supports_transfer and dest.device.split(":")[0] == src.device.split(":")[0]: + dest.allocator._transfer(dest._buf, src._buf, dest.nbytes, src_dev=src.allocator.dev, dest_dev=dest.allocator.dev) + elif src.device.startswith("DISK") and getattr(src.allocator.dev, 'fd', None) is not None \ + and hasattr(dest.allocator, 'copy_from_disk') and src.nbytes >= 4096 and dest.allocator.supports_copy_from_disk: + dest.allocator.copy_from_disk(dest._buf, src._buf, src.nbytes) + elif hasattr(dest.allocator, '_as_buffer'): src.allocator._copyout(dest.as_memoryview(force_zero_copy=True), src._buf) + else: dest.allocator._copyin(dest._buf, src.as_memoryview(allow_zero_copy=True)) + return None + +def exec_kernel(ctx:ExecContext, call:UOp, ast:UOp) -> float|None: + et = None + for device, (bufs, device_vars) in zip(to_tuple(call.src[1].device), unwrap_multi(call, resolve_params(call, ctx.input_uops))): + var_vals = {**ctx.var_vals, **device_vars} + prg_bufs = [bufs[i].ensure_allocated() for i in ast.arg.globals] + rt = get_runtime(device, ast, cache=ctx.cache) + global_size, local_size = ast.arg.launch_dims(var_vals) + with track_stats(ctx, call, device, prg_bufs, var_vals) as tm: + et = tm[0] = rt(*[b.get_buf(device) for b in prg_bufs], global_size=global_size, local_size=local_size, vals=ast.arg.vals(var_vals), + wait=ctx.wait, timeout=ctx.timeout) + return et + +def exec_validate(ctx:ExecContext, call:UOp, ast:UOp) -> float|None: + import numpy as np + for bufs, device_vars in unwrap_multi(call, resolve_params(call, ctx.input_uops)): + bufs, dev_bufs = bufs[:len(bufs)//2], bufs[len(bufs)//2:] + var_vals = {**ctx.var_vals, **device_vars} + cpu_rt = get_runtime("CPU", prg:=to_program(ast.src[0], Device["CPU"].renderer)) + global_size, local_size = prg.arg.launch_dims(var_vals) + cpu_rt(*[bufs[i].ensure_allocated()._buf for i in prg.arg.globals], global_size=global_size, local_size=local_size, vals=prg.arg.vals(var_vals)) + for i in prg.arg.outs: np.testing.assert_allclose(dev_bufs[i].ensure_allocated().numpy(), bufs[i].numpy(), rtol=1e-3, atol=1e-3) + return None + +def exec_encdec(ctx:ExecContext, call:UOp, ast:UOp) -> float|None: + bufs = [cast(Buffer, b.buffer).ensure_allocated() for b in resolve_params(call, ctx.input_uops)] + shape, pos_var = tuple(s.val for s in ast.src if s.op is Ops.CONST), ast.variables()[0].expr + with track_stats(ctx, call, bufs[0].device, bufs, ctx.var_vals): + bufs[0].allocator._encode_decode(bufs[0]._buf, bufs[1]._buf, bufs[2]._buf, [x._buf for x in bufs[3:]], shape, ctx.var_vals[pos_var]) + return None + +def exec_graph(ctx:ExecContext, call:UOp, ast:UOp) -> float|None: + rt = get_graph_runtime(ast, ctx.input_uops) + with track_stats(ctx, call, rt.device, [], ctx.var_vals) as t: t[0] = rt(ctx.input_uops, ctx.var_vals, wait=ctx.wait) + return t[0] + +def exec_hcq(ctx:ExecContext, call:UOp, ast:UOp) -> float|None: + if (inputs:=call.arg.aux.inputs) is not None: + bufs = [_resolve(ctx.input_uops[i], ctx.input_uops).buffer for i in call.arg.aux.input_idxs] + table = call.src[1+inputs].buffer + for j,dev in enumerate(call.arg.aux.device): + addrs = array.array('Q', [(b.bufs[j] if isinstance(b, MultiBuffer) else b).get_buf(dev).va_addr for b in bufs]) + mv = (table.bufs[j] if isinstance(table, MultiBuffer) else table).ensure_allocated()._buf.cpu_view().view(fmt='Q') + wait_cond(lambda: mv[0], value=0, timeout_ms=ctx.timeout or getenv("HCQDEV_WAIT_TIMEOUT_MS", 30000), msg=f"{dev} hang detected") + mv[:len(addrs)] = addrs + + exec_kernel(replace(ctx, update_stats=False), call, ast) + + st = time.perf_counter() + for d in call.arg.aux.device: + with track_stats(ctx, call, d, [], ctx.var_vals): + if ctx.wait: cast(Any, Device[d]).synchronize(timeout=ctx.timeout) + return time.perf_counter() - st + +# flatten LINEAR-in-LINEAR: any nested LINEAR child gets inlined into its parent's src +pm_flatten_linear = PatternMatcher([ + (UPat(Ops.LINEAR, custom_early_reject={Ops.LINEAR}, name="lin"), + lambda lin: lin.replace(src=tuple(flatten(c.src if c.op is Ops.LINEAR else (c,) for c in lin.src)))), +]) + +def _validate(call:UOp, sink:UOp) -> UOp: + params = get_call_arg_uops(call) + shadows = tuple(UOp.new_buffer(("CPU",)*len(p.device) if isinstance(p.device, tuple) else "CPU", prod(p.max_shape), p.dtype) for p in params) + copies = tuple(p.copy_to_device(s.device).call(s, p) for s, p in zip(shadows, params)) + return UOp(Ops.LINEAR, src=copies + (call, UOp(Ops.CUSTOM_FUNCTION, src=(sink,), arg="validate").call(*shadows, *params))) +pm_validate = PatternMatcher([(UPat(Ops.CALL, src=(UPat(Ops.SINK, name="sink"),), name="call", allow_any_len=True), _validate)]) + pm_flatten_linear + +# ctx is beam value +pm_beam = PatternMatcher([ + (UPat(Ops.CALL, src=(UPat(Ops.SINK, name="sink"),), name="call", allow_any_len=True), + lambda ctx,call,sink: call.replace(src=(sink.replace(arg=replace(sink.arg, beam=ctx)), *call.src[1:])) if sink.arg.beam == 0 else None), +]) + +pm_compile = PatternMatcher([ + (UPat(Ops.CALL, src=(UPat((Ops.SINK, Ops.PROGRAM), name="ast"),), name="call", allow_any_len=True), lambda call,ast: + call.replace(src=(to_program(ast, Device[call.device if isinstance(call.device, str) else call.device[0]].renderer), *call.src[1:]))), +]) + +pm_optimize_local_size = PatternMatcher([ + (UPat(Ops.CALL, src=(UPat(Ops.PROGRAM, name="prg"),), name="call", allow_any_len=True), optimize_local_size), +]) + +pm_exec = PatternMatcher([ + (UPat(Ops.CALL, src=(UPat(Ops.SLICE, name="ast"),), name="call", allow_any_len=True), exec_view), + (UPat(Ops.CALL, src=(UPat(Ops.COPY, name="ast"),), name="call", allow_any_len=True), exec_copy), + (UPat(Ops.CALL, src=(UPat(Ops.PROGRAM, name="ast"),), name="call", allow_any_len=True), exec_kernel), + (UPat(Ops.CALL, src=(UPat(Ops.CUSTOM_FUNCTION, arg="encdec", name="ast"),), name="call", allow_any_len=True), exec_encdec), + (UPat(Ops.CALL, src=(UPat(Ops.CUSTOM_FUNCTION, arg="graph", name="ast"),), name="call", allow_any_len=True), exec_graph), + (UPat(Ops.CALL, src=(UPat(Ops.CUSTOM_FUNCTION, arg="hcq", src=(UPat(Ops.PROGRAM, name="ast"),)),), name="call", allow_any_len=True), exec_hcq), + (UPat(Ops.CALL, src=(UPat(Ops.CUSTOM_FUNCTION, arg="validate", name="ast"),), name="call", allow_any_len=True), exec_validate), +]) + +if getenv("HCQ2"): from tinygrad.runtime.support.hcq2 import hcq_compile, hcq_link # noqa: E402 # down here, hcq2 imports the helpers above + +def compile_linear(linear:UOp, beam:int|None=None, validate=False, input_uops:list[UOp]|None=None) -> UOp: + if validate: linear = graph_rewrite(linear, pm_validate, name="validate", walk=True) + if (beam_val:=BEAM.value if beam is None else beam) >= 1: linear = graph_rewrite(linear, pm_beam, ctx=beam_val, walk=True) + linear = graph_rewrite(linear, pm_compile, name="precompile kernels", walk=True) + if getenv("HCQ2"): linear = hcq_compile(linear, input_uops) + return graph_rewrite(linear, pm_optimize_local_size, name="optimize local size", walk=True) + +def link_linear(linear:UOp, cache=True) -> UOp: return hcq_link(linear, cache=cache) if getenv("HCQ2") else linear + +def run_linear(linear:UOp, var_vals:dict[str, int]|None=None, input_uops:Sequence[UOp]=(), update_stats=True, jit=False, wait=False): + inputs = list(input_uops) + if not jit: linear = link_linear(compile_linear(linear, validate=VALIDATE_WITH_CPU, input_uops=inputs)) + ctx = ExecContext(var_vals or {}, tuple(inputs), update_stats, jit, wait or DEBUG>=2) + for call in linear.src: pm_exec.rewrite(call, ctx) + +def time_call(call:UOp, var_vals:dict[str, int]|None=None, timeout:int|None=None, clear_l2:bool=False) -> float: + if clear_l2: + if hasattr(dev:=Device[call.src[1].device], 'invalidate_caches'): dev.invalidate_caches() + else: + from tinygrad.tensor import Tensor + with Context(DEBUG=0, BEAM=0, CAPTURING=0, TRACK_MATCH_STATS=0): Tensor.ones(1024, 1024).contiguous().realize(do_update_stats=False) + ctx = ExecContext(var_vals or {}, update_stats=False, wait=True, timeout=timeout, cache=False) + linear = link_linear(compile_linear(UOp(Ops.LINEAR, src=(call,)), beam=0), cache=ctx.cache) + return max(pm_exec.rewrite(c, ctx) or 0.0 for c in linear.src) diff --git a/artifacts/package_runtime/tinygrad/function.py b/artifacts/package_runtime/tinygrad/function.py new file mode 100644 index 000000000..edb1691d9 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/function.py @@ -0,0 +1,99 @@ +import functools, time +from typing import Generic, TypeVar, Callable, cast, overload +from tinygrad.helpers import Context, dedup, getenv, DEBUG +from tinygrad.uop.ops import UOp, Ops, graph_rewrite, PatternMatcher, UPat +from tinygrad.tensor import Tensor +from tinygrad.nn.state import get_state_dict + +def add_to_ctx(ctx, x:UOp): + if x.buf_uop in ctx[1]: return None + ret = x.param_like(len(ctx[0])) + ctx[0].append(x) + return ret + +pm_ctx = PatternMatcher([ + (UPat((Ops.BUFFER, Ops.BIND), name="x"), add_to_ctx), + (UPat((Ops.AFTER, Ops.CONTIGUOUS), name="x"), + lambda ctx,x: add_to_ctx(ctx,x) if not x.op_in_backward_slice_with_self(Ops.PARAM) and x.op_in_backward_slice_with_self(Ops.BUFFER) else None), +]) + +def invalid_outputs(uret:UOp) -> set[UOp]: + # invalids() returns fresh write-only scratch: a clone storing CONST(Invalid) + # don't capture it as an input; only skip fresh buffers, not realized ones + return {u.src[0].buf_uop for u in uret.backward_slice_with_self + if u.op is Ops.STORE and u.src[1].base.is_invalid and not u.src[0].buf_uop.is_realized} + +ReturnType = TypeVar('ReturnType') +class _function(Generic[ReturnType]): + depth = 0 + def __init__(self, fxn:Callable[..., ReturnType], *, precompile:bool, precompile_backward:bool, allow_implicit:bool, grad_fxn:Callable|None): + self.fxn = fxn + self.precompile = precompile + self.precompile_backward = precompile_backward + self.allow_implicit = allow_implicit + self.grad_fxn = grad_fxn + + def __get__(self, obj, objtype=None): return functools.partial(self.__call__, obj) if obj is not None else self + + def __call__(self, *args, **kwargs) -> ReturnType: + st = time.perf_counter() + + params = get_state_dict((args, kwargs), tensor_type=(Tensor, UOp)).values() + + # deduplicate input_uops, keeping the first occurrence index for each unique uop + call_uops: list[UOp] = dedup([u for t in params if (u:=t._uop).device is not None]) + + # disable realize/schedule while this is running + # run it and do surgery later + with Context(ALLOW_DEVICE_USAGE=getenv("DEVICE_IN_FUNCTION_BUG", 0)): + _function.depth += 1 + try: + ret = self.fxn(*args, **kwargs) + finally: + _function.depth -= 1 + if isinstance(ret, Tensor): + uret = ret.uop + elif isinstance(ret, tuple) and all(isinstance(x, Tensor) for x in ret): + uret = UOp.maketuple(*[x.uop for x in ret]) + else: + raise RuntimeError(f"function return type {type(ret)} not supported") + + # replace the known inputs with params (using deduplicated slots) + subs = {x:x.param_like(i) for i,x in enumerate(call_uops)} + uret = uret.substitute(subs) + + # the BUFFERs that are left are the implicit inputs + num_explicit = len(call_uops) + uret = graph_rewrite(uret, pm_ctx, (call_uops, invalid_outputs(uret)), bottom_up=True, name="get_implicit_inputs") + name = getattr(self.fxn, '__qualname__', None) or type(self.fxn).__qualname__ + if not self.allow_implicit: + implicit_buffers = [x for x in call_uops[num_explicit:] if x.op is Ops.BUFFER] + if implicit_buffers: + buf_strs = '\n '.join(f"{i}: dtype={b.dtype}, size={b.max_numel()}, device={b.device}" for i,b in enumerate(implicit_buffers)) + raise RuntimeError(f"function {name} has {len(implicit_buffers)} implicit buffer(s), but allow_implicit=False\n {buf_strs}") + + fret = uret.call(*call_uops, grad_fxn=self.grad_fxn, name=name, precompile=self.precompile, + precompile_backward=self.precompile_backward) + + if DEBUG >= 2: + print(" "*_function.depth+f"function {uret.key.hex()[:8]} in {(time.perf_counter()-st)*1000:8.2f} ms: {name}") + + if isinstance(ret, tuple): + return cast(ReturnType, tuple(Tensor(fret.gettuple(i)) for i in range(len(ret)))) + else: + return cast(ReturnType, Tensor(fret.gettuple(0))) + +# overload signatures support both @function and @function(precompile=True) syntax +@overload +def function(fxn:Callable[..., ReturnType], *, precompile:bool=False, precompile_backward:bool=False, + allow_implicit:bool=False, grad_fxn:Callable|None=None) -> _function[ReturnType]: ... +@overload +def function(fxn:None=None, *, precompile:bool=False, precompile_backward:bool=False, + allow_implicit:bool=False, grad_fxn:Callable|None=None) -> Callable[[Callable[..., ReturnType]], _function[ReturnType]]: ... +def function(fxn=None, *, precompile:bool=False, precompile_backward:bool=False, + allow_implicit:bool=False, grad_fxn:Callable|None=None): + if fxn is None: + return lambda f: _function(f, precompile=precompile, precompile_backward=precompile_backward, + allow_implicit=allow_implicit, grad_fxn=grad_fxn) + return _function(fxn, precompile=precompile, precompile_backward=precompile_backward, + allow_implicit=allow_implicit, grad_fxn=grad_fxn) diff --git a/artifacts/package_runtime/tinygrad/helpers.py b/artifacts/package_runtime/tinygrad/helpers.py new file mode 100644 index 000000000..fab620dea --- /dev/null +++ b/artifacts/package_runtime/tinygrad/helpers.py @@ -0,0 +1,622 @@ +from __future__ import annotations +import time +START_TIME = time.perf_counter() +import os, functools, platform, re, contextlib, operator, hashlib, pickle, sqlite3, tempfile, pathlib, string, ctypes, sys, gzip, getpass, gc +from collections import defaultdict +import subprocess, shutil, math, types, copyreg, inspect, importlib, decimal, itertools, difflib +from dataclasses import dataclass, field, replace +from typing import ClassVar, Iterable, Any, TypeVar, Callable, Sequence, TypeGuard, Iterator, Generic, Generator, cast, overload + +T = TypeVar("T") +U = TypeVar("U") +# NOTE: it returns int 1 if x is empty regardless of the type of x +def prod(x:Iterable[T]) -> T|int: return functools.reduce(operator.mul, x, 1) + +# NOTE: helpers is not allowed to import from anything else in tinygrad +OSX, WIN = platform.system() == "Darwin", sys.platform == "win32" +ARCH_X86 = any(x in platform.processor() for x in ("Intel", "i386", "x86_64")) +BASEDIR = pathlib.Path(__file__).parent + +# fix colors on Windows, https://stackoverflow.com/questions/12492810/python-how-can-i-make-the-ansi-escape-codes-to-work-also-in-windows +if WIN: os.system("") + +def dedup(x:Iterable[T]): return list(dict.fromkeys(x)) # retains list order +def argfix(*x): + if x and x[0].__class__ in (tuple, list): + if len(x) != 1: raise ValueError(f"bad arg {x}") + return tuple(x[0]) + return x +# https://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python +def argsort(x): return type(x)(sorted(range(len(x)), key=x.__getitem__)) +def all_same(items:Sequence): return all(x == items[0] for x in items) # works for empty input +def get_shape(x) -> tuple[int, ...]: + # NOTE: str is special because iterating it still yields strs + if not hasattr(x, "__len__") or isinstance(x, str) or getattr(x, "shape", None) == (): return () + if not all_same(subs:=[get_shape(xi) for xi in x]): raise ValueError(f"inhomogeneous shape from {x}") + return (len(subs),) + (subs[0] if subs else ()) +def is_image_shape(shape): return shape is not None and len(shape) == 3 and shape[-1] == 4 +def all_int(t: Sequence[Any]) -> TypeGuard[tuple[int, ...]]: return all(isinstance(s, int) for s in t) +def colored(st, color:str|None, background=False): # replace the termcolor library + if NO_COLOR: return st + colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'] + return f"\u001b[{10*background+60*(color.upper() == color)+30+colors.index(color.lower())}m{st}\u001b[0m" if color is not None else st +def colorize_float(x: float): return colored(f"{x:7.2f}x", 'green' if x < 0.75 else 'red' if x > 1.15 else 'yellow') +def time_to_str(t:float, w=8) -> str: return next((f"{t * d:{w}.2f}{pr}" for d,pr in [(1, "s "),(1e3, "ms")] if t > 10/d), f"{t * 1e6:{w}.2f}us") +def size_to_str(s:int) -> str: return next((f"{s / d:.2f} {pr}" for d,pr in [(1<<30, "GB"),(1<<20, "MB"),(1<<10, "KB")] if s >= d), f"{s} B") +def ansistrip(s:str): return re.sub('\x1b\\[(K|.*?m)', '', s) +def ansilen(s:str): return len(ansistrip(s)) +def make_tuple(x:int|Sequence[int], cnt:int) -> tuple[int, ...]: return (x,)*cnt if isinstance(x, int) else tuple(x) +def to_tuple(x:T|tuple[T, ...]) -> tuple[T, ...]: return x if isinstance(x, tuple) else (x,) +def flatten(l:Iterable[Iterable[T]]): return [item for sublist in l for item in sublist] +def fully_flatten(l): + if not (hasattr(l, "__len__") and hasattr(l, "__getitem__")) or isinstance(l, str): return [l] + return [l[()]] if hasattr(l, "shape") and l.shape == () else [x for li in l for x in fully_flatten(li)] +# `(padding_left, padding_right, padding_top, padding_bottom, ...)` -> `(..., (padding_top, padding_bottom), (padding_left, padding_right))` +def flat_to_grouped(padding:Sequence[T]) -> tuple[tuple[T, T], ...]: return tuple(zip(padding[-2::-2], padding[::-2])) +def resolve_pool_pads(padding:int|Sequence[int], dims:int) -> Sequence[int]: + if not isinstance(padding, int) and not (len(padding) == 2*dims or len(padding) == dims): + raise ValueError(f"Padding must be an int or a sequence of length {dims} or {2*dims}, but got {padding=} with {dims=}.") + return [padding]*2*dims if isinstance(padding, int) else (padding if len(padding) == 2*dims else [p for p in padding for _ in range(2)][::-1]) +def fromimport(mod, frm): return getattr(__import__(mod, fromlist=[frm]), frm) +def _is_balanced(s:str) -> bool: return (d := 0, all((d := d + (c == '(') - (c == ')')) >= 0 for c in s))[1] and d == 0 +def strip_parens(fst:str) -> str: return fst[1:-1] if fst[:1]=='(' and fst[-1:]==')' and _is_balanced(fst[1:-1]) else fst +def ceildiv(num, amt): + # use (num + amt - 1) // amt when num is a UOp and non-negative to avoid C/Python division mismatch + if hasattr(num, 'vmin') and num.vmin >= 0 and (amt > 0 if isinstance(amt, int) else amt.vmin > 0): return (num + amt - 1) // amt + return int(ret) if isinstance((ret:=-(num//-amt)), float) else ret +def round_up(num:int, amt:int) -> int: return (num+amt-1)//amt * amt +def round_down(num:int, amt:int) -> int: return -round_up(-num, amt) +def next_power2(x): return 1 if x == 0 else 1 << (x - 1).bit_length() +# cstyle div and mod +def cdiv(x:int, y:int) -> int: return abs(x)//abs(y)*(1,-1)[x*y<0] if y != 0 else 0 +def cmod(x:int, y:int) -> int: return x-cdiv(x,y)*y +# python floor div and mod +def floordiv(x:int, y:int) -> int: return x//y if y != 0 else 0 +def floormod(x:int, y:int) -> int: return x-floordiv(x,y)*y +def lo32(x:Any) -> Any: return x & 0xFFFFFFFF # Any is sint +def hi32(x:Any) -> Any: return x >> 32 # Any is sint +def data64(data:Any) -> tuple[Any, Any]: return (data >> 32, data & 0xFFFFFFFF) # Any is sint +def data64_le(data:Any) -> tuple[Any, Any]: return (data & 0xFFFFFFFF, data >> 32) # Any is sint +def to_be32(val:Any) -> Any: return ((val & 0xFF) << 24) | (((val >> 8) & 0xFF) << 16) | (((val >> 16) & 0xFF) << 8) | ((val >> 24) & 0xFF) +def to_be64(val:Any) -> Any: return to_be32(val >> 32) | (to_be32(val & 0xFFFFFFFF) << 32) +def getbits(value: int, start: int, end: int): return (value >> start) & ((1 << (end - start + 1)) - 1) +def i2u(bits: int, value: int): return value if value >= 0 else (1< dict[T,U]: + kvs = set([(k,v) for d in ds for k,v in d.items()]) + if len(kvs) != len(set(kv[0] for kv in kvs)): raise RuntimeError(f"{kvs} contains different values for the same key") + return {k:v for d in ds for k,v in d.items()} +def partition(itr:Iterable[T], fxn:Callable[[T],bool]) -> tuple[list[T], list[T]]: + ret:tuple[list[T], list[T]] = ([], []) + for s in itr: (ret[0] if fxn(s) else ret[1]).append(s) + return ret +def unwrap(x:T|None) -> T: + assert x is not None + return x +def get_single_element(x:Sequence[T]) -> T: + assert len(x) == 1, f"{x} must only have 1 element" + return x[0] +def get_child(obj, key): + for k in key.split('.'): + if k.isnumeric(): obj = obj[int(k)] + elif isinstance(obj, dict): obj = obj[k] + else: obj = getattr(obj, k) + return obj +def word_wrap(x, wrap=80): + if len(ansistrip(x)) <= wrap: return x + if len(lines:=x.splitlines()) > 1: return "\n".join(word_wrap(line, wrap) for line in lines) + i = vis = 0 + while vis < wrap and i < len(x): i, vis = (i + m.end(), vis) if (m:=re.match('\x1b\\[(K|.*?m)', x[i:])) is not None else (i+1, vis+1) + return x[:i] + "\n" + word_wrap(x[i:], wrap) +def pad_bytes(b:bytes, align:int) -> bytes: return b + b'\x00' * ((align - (len(b) % align)) % align) + +# NOTE: you must create the exception inside the function where it's raised or you will get a GC cycle! +def panic(e:type[Exception]|None=None, *arg): raise e(*arg) if e is not None else RuntimeError("PANIC!") + +@functools.cache +def canonicalize_strides(shape:tuple[T, ...], strides:tuple[T, ...]) -> tuple[T, ...]: + return tuple(cast(T, 0) if s == 1 else st for s, st in zip(shape, strides)) + +@functools.cache +def strides_for_shape(shape:tuple[T, ...]) -> tuple[T, ...]: + if not shape: return () + strides = tuple(itertools.accumulate(reversed(shape[1:]), operator.mul, initial=1))[::-1] + return canonicalize_strides(shape, strides) + +def suppress_finalizing(func): + def wrapper(*args, **kwargs): + try: return func(*args, **kwargs) + except (RuntimeError, AttributeError, TypeError, ImportError, OSError): + if not getattr(sys, 'is_finalizing', lambda: True)(): raise # re-raise if not finalizing + return wrapper + +def select_by_name(candidates:Sequence[T], get_name:Callable[...,str], query:str, err_msg:str) -> list[T]: + if len(ret:=[c for c in candidates if not query or get_name(c) == query]) == 0: + raise RuntimeError(err_msg + (f", did you mean: {m[0]!r}?" if (m:=difflib.get_close_matches(query, map(get_name, candidates))) else "")) + return ret + +def select_first_inited(candidates:Sequence[Callable[...,T]], err_msg:str, cache:dict|None=None, *args): + excs = [] + for typ in candidates: + if cache is not None and (typ,) + args in cache: return cache[(typ,) + args] + try: + x = typ(*args) + if cache is not None: cache[(typ,) + args] = x + return x + except Exception as e: excs.append(e) + raise excs[0] if len(excs) == 1 else ExceptionGroup(err_msg + " is available", excs) + +def pluralize(st:str, cnt:int): return f"{cnt} {st}"+('' if cnt == 1 else 's') + +# for length N coefficients `p`, returns p[0] * x**(N-1) + p[1] * x**(N-2) + ... + p[-2] * x + p[-1] +def polyN(x:T, p:list[float]) -> T: return functools.reduce(lambda acc,c: acc*x+c, p, 0.0) # type: ignore + +@functools.cache +def to_function_name(s:str): return ''.join([c if c in (string.ascii_letters+string.digits+'_') else f'{ord(c):02X}' for c in ansistrip(s)]) +@overload +def getenv(key:str) -> int: ... +@overload +def getenv(key:str, default:T) -> T: ... +@functools.cache +def getenv(key:str, default:Any=0): return type(default)(os.getenv(key, default)) + +def temp(x:str, append_user:bool=False) -> str: + return (pathlib.Path(tempfile.gettempdir()) / (f"{x}.{getpass.getuser()}" if append_user else x)).as_posix() + +def stderr_log(msg:str): print(msg, end='', file=sys.stderr, flush=True) + +class Context(contextlib.ContextDecorator): + def __init__(self, **kwargs): self.kwargs = kwargs + def __enter__(self): + self.old_context:dict[str, Any] = {k: ContextVar._cache[k].value for k in self.kwargs} + for k,v in self.kwargs.items(): ContextVar._cache[k].value = v + def __exit__(self, *args): + for k,v in self.old_context.items(): ContextVar._cache[k].value = v + +class ContextVar(Generic[T]): + _cache: ClassVar[dict[str, ContextVar]] = {} + value: T + key: str + def __init__(self, key: str, default_value: T): + if key in ContextVar._cache: raise RuntimeError(f"attempt to recreate ContextVar {key}") + ContextVar._cache[key] = self + self.value, self.key = getenv(key, default_value), key + def __bool__(self): return bool(self.value) + def __eq__(self, x): return self.value == x + def __ge__(self, x): return self.value >= x + def __gt__(self, x): return self.value > x + def __lt__(self, x): return self.value < x + def tolist(self, obj=None): + assert isinstance(self.value, str) + return [getattr(obj, x) if obj else x for x in self.value.split(',') if x] + +@dataclass(frozen=True) +class Target: + device: str = "" + renderer: str = "" + arch: str = "" + interface: str = "" + indices: str = "" + + @staticmethod + def parse(s:str) -> Target: + if len(split:=s.split('+')) == 2: + (iface, indices), s = ((iface_split[0], iface_split[1]) if len(iface_split:=split[0].rsplit(":", 1)) == 2 else (split[0], ""), split[1]) + elif len(split) > 2: raise RuntimeError(f"too many '+' in target string: {s!r}") + else: iface, indices = "", "" + match [x.upper() if i < 2 else x for i,x in enumerate(s.split(':'))]: + case [dev, ren, arch]: return Target(dev, ren, arch, iface, indices) + case [dev, ren]: return Target(dev, ren, interface=iface, indices=indices) + case [dev]: return Target(dev, interface=iface, indices=indices) + case _: raise RuntimeError(f"too many ':' in target string: {s!r}") + def __repr__(self): + fst, snd = re.sub(":*$", "", ":".join([self.interface, self.indices])), re.sub(":*$", "", ":".join([self.device, self.renderer, self.arch])) + return (fst + "+" if fst else "") + snd + # replaces if not already set + def replacedefault(self, **kwargs) -> Target: return replace(self, **{k:v for k,v in kwargs.items() if not getattr(self, k)}) + +class _DEV(ContextVar): + _value: list[Target] = [Target()] + @property + def value(self) -> list[Target]: return self._value + @value.setter + def value(self, v:str|Target|list[Target]): + self._value = v if isinstance(v, list) else [v] if isinstance(v, Target) else [Target.parse(t) for t in v.split(';')] + def __repr__(self) -> str: return ";".join([repr(t) for t in self._value]) + def __getattr__(self, k): return getattr(self._value[0], k) + # get target for device string, kwargs are passed if not already specified + def target(self, dev:str, **kwargs) -> Target: + assert (v:=getenv(k:=f"{dev}_CC", "")) == "", \ + f"{k}={v} is deprecated, use DEV='{';'.join([repr(t) for t in self._value if t.device != dev] + [f'{dev}:{v}'])}' instead" + return replace(next((t for t in self._value if not t.device or t.device == dev), Target(device=dev)).replacedefault(**kwargs), device=dev) + +DEV, DEBUG, BEAM, NOOPT = _DEV("DEV", ""), ContextVar("DEBUG", 0), ContextVar("BEAM", 0), ContextVar("NOOPT", 0) +IMAGE, FLOAT16, OPENPILOT_HACKS = ContextVar("IMAGE", 0), ContextVar("FLOAT16", 0), ContextVar("OPENPILOT_HACKS", 0) +JIT, JIT_BATCH_SIZE = ContextVar("JIT", 2 if OSX and ARCH_X86 else 1), ContextVar("JIT_BATCH_SIZE", 32) +CHUNK_SIZE = 2**20 # TinyFS content-addressed store: blob chunk + hash-tree node granularity +WINO, CAPTURING, TRACEMETA, NO_COLOR = ContextVar("WINO", 0), ContextVar("CAPTURING", 1), ContextVar("TRACEMETA", 1), ContextVar("NO_COLOR", 0) +TRAINING = ContextVar("TRAINING", 0) +USE_TC, TC_SELECT, TC_OPT = ContextVar("TC", 1), ContextVar("TC_SELECT", -1), ContextVar("TC_OPT", 0) +TRANSCENDENTAL, NOLOCALS = ContextVar("TRANSCENDENTAL", 1), ContextVar("NOLOCALS", 0) +SPLIT_REDUCEOP, NO_MEMORY_PLANNER, LRU = ContextVar("SPLIT_REDUCEOP", 1), ContextVar("NO_MEMORY_PLANNER", 0), ContextVar("LRU", 1) +RING, ALL2ALL, ALLREDUCE_CAST = ContextVar("RING", 1), ContextVar("ALL2ALL", 0), ContextVar("ALLREDUCE_CAST", 1) +CACHELEVEL, IGNORE_BEAM_CACHE = ContextVar("CACHELEVEL", 2), ContextVar("IGNORE_BEAM_CACHE", 0) +VALIDATE_WITH_CPU = ContextVar("VALIDATE_WITH_CPU", 0) +# TODO: this is broken for some indexing +DISABLE_FAST_IDIV = ContextVar("DISABLE_FAST_IDIV", 1) +FUSE_OPTIM = ContextVar("FUSE_OPTIM", 0) +ALLOW_DEVICE_USAGE, MAX_BUFFER_SIZE = ContextVar("ALLOW_DEVICE_USAGE", 1), ContextVar("MAX_BUFFER_SIZE", 0) +MAX_KERNEL_BUFFERS = ContextVar("MAX_KERNEL_BUFFERS", 0) +EMULATED_DTYPES = ContextVar("EMULATED_DTYPES", "") +DEFAULT_FLOAT, DEFAULT_INT = ContextVar("DEFAULT_FLOAT", "float32"), ContextVar("DEFAULT_INT", "int32") +CAPTURE_PROCESS_REPLAY = ContextVar("CAPTURE_PROCESS_REPLAY", 0) +def _get_cpu_count() -> int: + # os.process_cpu_count (3.13+) respects cgroup limits + if hasattr(os, "process_cpu_count"): return max(1, os.process_cpu_count() or 1) + # cgroup v2 (containers with --cpus=N) + try: + with open("/sys/fs/cgroup/cpu.max") as f: + quota, period = f.read().strip().split() + if quota != "max": return max(1, int(quota) // int(period)) + except (FileNotFoundError, ValueError, ZeroDivisionError): pass + # fall back to affinity (respects taskset but not cgroup quota) + return max(1, len(os.sched_getaffinity(0)) if hasattr(os, "sched_getaffinity") else (os.cpu_count() or 1)) +NUM_CPU_THREADS = ContextVar("NUM_CPU_THREADS", _get_cpu_count()) +NULL_ALLOW_COPYOUT = ContextVar("NULL_ALLOW_COPYOUT", 0) +# VIZ implies PROFILE, but you can run PROFILE without VIZ +VIZ = ContextVar("VIZ", 0) +PROFILE = ContextVar("PROFILE", abs(VIZ.value)) +SPEC = ContextVar("SPEC", 1) +# TODO: disable by default due to speed +CHECK_OOB = ContextVar("CHECK_OOB", 0) +PCONTIG = ContextVar("PCONTIG", 0) # partial contiguous in rangeify +DEBUG_RANGEIFY = ContextVar("DEBUG_RANGEIFY", 0) +# set to 1, this uses tuplize in the linearizer sort order +TUPLE_ORDER = ContextVar("TUPLE_ORDER", 1) +# set to 0 to disable the compiler cache +CCACHE = ContextVar("CCACHE", 1) +# allow tf32 to be used on NVIDIA GPUs +ALLOW_TF32 = ContextVar("ALLOW_TF32", 0) +# set to 0 to disable the scheduler cache +SCACHE = ContextVar("SCACHE", 1) +# allow use of atomics for embedding backward +USE_ATOMICS = ContextVar("USE_ATOMICS", 0) +# don't allow broadcast +DISALLOW_BROADCAST = ContextVar("DISALLOW_BROADCAST", 0) + +@dataclass(frozen=True) +class Metadata: + name: str + backward: bool = False + def __hash__(self): return hash(self.name) + def __str__(self): return self.name + (" bw" if self.backward else "") + +# **************** global state Counters **************** + +class GlobalCounters: + global_ops: ClassVar[int] = 0 + global_mem: ClassVar[int] = 0 + time_sum_s: ClassVar[float] = 0.0 + kernel_count: ClassVar[int] = 0 + mem_used: ClassVar[int] = 0 # NOTE: this is not reset + mem_used_per_device: ClassVar[defaultdict] = defaultdict(int) # NOTE: this is not reset + @staticmethod + def reset(): GlobalCounters.global_ops, GlobalCounters.global_mem, GlobalCounters.time_sum_s, GlobalCounters.kernel_count = 0,0,0.0,0 + +# **************** timer and profiler **************** + +class Timing(contextlib.ContextDecorator): + def __init__(self, prefix="", on_exit=None, enabled=True): self.prefix, self.on_exit, self.enabled = prefix, on_exit, enabled + def __enter__(self): self.st = time.perf_counter_ns() + def __exit__(self, *exc): + self.et = time.perf_counter_ns() - self.st + if self.enabled: print(f"{self.prefix}{self.et*1e-6:6.2f} ms"+(self.on_exit(self.et) if self.on_exit else "")) + +def _format_fcn(fcn): return f"{fcn[0]}:{fcn[1]}:{fcn[2]}" +class Profiling(contextlib.ContextDecorator): + def __init__(self, enabled=True, sort='cumtime', frac=0.2, fn=None, ts=1): + self.enabled, self.sort, self.frac, self.fn, self.time_scale = enabled, sort, frac, fn, 1e3/ts + def __enter__(self): + import cProfile + self.pr = cProfile.Profile() + if self.enabled: self.pr.enable() + def __exit__(self, *exc): + if self.enabled: + self.pr.disable() + if self.fn: self.pr.dump_stats(self.fn) + import pstats + stats = pstats.Stats(self.pr).strip_dirs().sort_stats(self.sort) + for fcn in stats.fcn_list[0:int(len(stats.fcn_list)*self.frac)]: # type: ignore[attr-defined] + (_primitive_calls, num_calls, tottime, cumtime, callers) = stats.stats[fcn] # type: ignore[attr-defined] + scallers = sorted(callers.items(), key=lambda x: -x[1][2]) + print(f"n:{num_calls:8d} tm:{tottime*self.time_scale:7.2f}ms tot:{cumtime*self.time_scale:7.2f}ms", + colored(_format_fcn(fcn).ljust(50), "yellow"), + colored(f"<- {(scallers[0][1][2]/tottime)*100:3.0f}% {_format_fcn(scallers[0][0])}", "BLACK") if scallers else '') + +def perf_counter_us() -> decimal.Decimal: return decimal.Decimal(time.perf_counter_ns())/1000 + +@functools.cache +def lines(fn) -> list[str]: + try: + with open(fn, encoding="utf-8") as f: return f.readlines() + except (FileNotFoundError, OSError): return [] + +def printable(loc:tuple[str, int]) -> str: + try: return lines(loc[0])[loc[1]-1].strip() + except IndexError: return "" + +def get_stacktrace(frm, max_frames=30) -> tuple[tuple, ...]: + ret:list[tuple] = [] + for i in range(max_frames): + if (frm:=frm.f_back) is None: break + ret.append(((fc:=frm.f_code).co_filename, frm.f_lineno, fc.co_name, printable((fc.co_filename, frm.f_lineno)))) + return tuple(ret) + +@dataclass(frozen=True) +class TracingKey: + display_name:str # display name of this trace event + keys:tuple[Any, ...]=() # optional keys to search for related traces + ret:Any=None + tb:tuple[tuple, ...]|None=field(default_factory=lambda: get_stacktrace(sys._getframe(1)) if VIZ else None) + +class ProfileEvent: pass + +@dataclass +class ProfileRangeEvent(ProfileEvent): device:str; name:str|TracingKey; st:decimal.Decimal; en:decimal.Decimal|None=None # noqa: E702 + +@dataclass(frozen=True) +class ProfilePointEvent(ProfileEvent): + device:str; name:str; key:Any; arg:Any=field(default_factory=dict); ts:decimal.Decimal=field(default_factory=perf_counter_us) # noqa: E702 + +cpu_events:list[ProfileEvent] = [] +@contextlib.contextmanager +def cpu_profile(name:str|TracingKey, device="TINY", display=True) -> Generator[ProfileRangeEvent, None, None]: + res = ProfileRangeEvent(device, name, perf_counter_us()) + try: yield res + finally: + res.en = perf_counter_us() + if PROFILE and display: cpu_events.append(res) + +def profile_marker(name:str, color="gray") -> None: + cpu_events.append(ProfilePointEvent("TINY", "marker", None, {"name":name, "color":color})) + +if getenv("DEBUG_GC"): + gc_start: decimal.Decimal = perf_counter_us() + def my_gc_callback(phase, info): + global gc_start + if phase == 'start': gc_start = perf_counter_us() + elif phase == "stop": + cpu_events.append(ProfileRangeEvent("GC", f"collected: {info['collected']} (gen {info['generation']})", gc_start, perf_counter_us())) + if PROFILE: gc.callbacks.append(my_gc_callback) + +# *** universal database cache *** + +cache_dir: str = os.path.join(getenv("XDG_CACHE_HOME", os.path.expanduser("~/Library/Caches" if OSX else "~/.cache")), "tinygrad") +CACHEDB: str = getenv("CACHEDB", os.path.abspath(os.path.join(cache_dir, "cache.db"))) + +VERSION = 22 +_db_connection = None +def db_connection(): + global _db_connection + if _db_connection is None: + os.makedirs(CACHEDB.rsplit(os.sep, 1)[0], exist_ok=True) + _db_connection = sqlite3.connect(CACHEDB, timeout=60, isolation_level="IMMEDIATE") + # another connection has set it already or is in the process of setting it + # that connection will lock the database + with contextlib.suppress(sqlite3.OperationalError): _db_connection.execute("PRAGMA journal_mode=WAL").fetchone() + _db_connection.execute("PRAGMA synchronous=NORMAL") + if DEBUG >= 8: _db_connection.set_trace_callback(print) + return _db_connection + +def diskcache_clear(): + cur = db_connection().cursor() + drop_tables = cur.execute("SELECT 'DROP TABLE IF EXISTS ' || quote(name) || ';' FROM sqlite_master WHERE type = 'table';").fetchall() + cur.executescript("\n".join([s[0] for s in drop_tables] + ["VACUUM;"])) + +def diskcache_get(table:str, key:dict|str|int) -> Any: + if CACHELEVEL < 1: return None + if isinstance(key, (str,int)): key = {"key": key} + cur = db_connection().cursor() + try: + res = cur.execute(f"SELECT val FROM '{table}_{VERSION}' WHERE {' AND '.join([f'{x}=?' for x in key.keys()])}", tuple(key.values())) + except sqlite3.OperationalError: + return None # table doesn't exist + if (val:=res.fetchone()) is not None: return pickle.loads(val[0]) + return None + +_db_tables: set[str] = set() +def diskcache_put(table:str, key:dict|str|int, val:Any, prepickled=False): + if CACHELEVEL < 1: return val + if isinstance(key, (str,int)): key = {"key": key} + conn = db_connection() + cur = conn.cursor() + if table not in _db_tables: + TYPES = {str: "text", bool: "integer", int: "integer", float: "numeric", bytes: "blob"} + ltypes = ', '.join(f"{k} {TYPES[type(key[k])]}" for k in key.keys()) + cur.execute(f"CREATE TABLE IF NOT EXISTS '{table}_{VERSION}' ({ltypes}, val blob, PRIMARY KEY ({', '.join(key.keys())}))") + _db_tables.add(table) + cur.execute(f"REPLACE INTO '{table}_{VERSION}' ({', '.join(key.keys())}, val) VALUES ({', '.join(['?']*len(key))}, ?)", + tuple(key.values()) + (val if prepickled else pickle.dumps(val),)) + conn.commit() + cur.close() + return val + +def diskcache(func:Callable[..., T]): + def wrapper(*args, **kwargs) -> T: + table, key = f"cache_{func.__name__}", hashlib.sha256(pickle.dumps((args, kwargs))).hexdigest() + if (ret:=diskcache_get(table, key)) is not None: return ret + return diskcache_put(table, key, func(*args, **kwargs)) + return wrapper + +# *** http support *** + +def _ensure_downloads_dir() -> pathlib.Path: + # if we are on a tinybox, use the raid array + if pathlib.Path("/etc/tinybox-release").is_file(): + # try creating dir with sudo + if not (downloads_dir := pathlib.Path("/raid/downloads")).exists(): + subprocess.run(["sudo", "mkdir", "-p", downloads_dir], check=True) + subprocess.run(["sudo", "chown", "tiny:root", downloads_dir], check=True) + subprocess.run(["sudo", "chmod", "775", downloads_dir], check=True) + return downloads_dir + return pathlib.Path(cache_dir) / "downloads" + +def fetch(url:str, name:pathlib.Path|str|None=None, subdir:str|None=None, gunzip:bool=False, allow_caching=not getenv("DISABLE_HTTP_CACHE"), + headers:dict[str, str]={}, sha256:str|None=None) -> pathlib.Path: + import urllib.request + if url.startswith(("/", ".")): return pathlib.Path(url) + if name is not None and (isinstance(name, pathlib.Path) or '/' in name): fp = pathlib.Path(name) + else: + hh = "_"+hashlib.md5(("\n".join(f"{k.strip()}:{v.strip()}" for k,v in sorted(headers.items()))).encode("utf-8")).hexdigest() if headers else "" + fp = _ensure_downloads_dir() / (subdir or "") / ((name or hashlib.md5(url.encode('utf-8')).hexdigest()) + hh + (".gunzip" if gunzip else "")) + if not fp.is_file() or not allow_caching or (sha256 and hashlib.sha256(fp.read_bytes()).hexdigest() != sha256): + (_dir := fp.parent).mkdir(parents=True, exist_ok=True) + with urllib.request.urlopen(urllib.request.Request(url, headers={"User-Agent": "tinygrad 0.13.0", **headers}), timeout=10) as r: + assert r.status in {200, 206}, r.status + length = int(r.headers.get('content-length', 0)) if not gunzip else None + readfile = gzip.GzipFile(fileobj=r) if gunzip else r + progress_bar:tqdm = tqdm(total=length, unit='B', unit_scale=True, desc=f"{url}") + h = hashlib.sha256() if sha256 else None + with tempfile.NamedTemporaryFile(dir=_dir, delete=False) as f: + while chunk := readfile.read(16384): + if h: h.update(chunk) + progress_bar.update(f.write(chunk)) + f.close() + if h and (actual_sha256:=h.hexdigest()) != sha256: raise RuntimeError(f"fetch sha mismatch, expected {sha256} but got {actual_sha256}") + pathlib.Path(f.name).rename(fp) + progress_bar.update(close=True) + if length and (file_size:=os.stat(fp).st_size) < length: raise RuntimeError(f"fetch size incomplete, {file_size} < {length}") + return fp + +def fetch_fw(path:str, name:str, sha256:str) -> bytes: + if sys.version_info >= (3,14) and (p:=pathlib.Path(f"/lib/firmware/{path}/{name}.zst")).is_file(): + from compression.zstd import decompress + if hashlib.sha256(b:=decompress(p.read_bytes())).hexdigest() == sha256: return b + return fetch(f"https://gitlab.com/kernel-firmware/linux-firmware/-/raw/1e2c15348485939baf1b6d1f5a7a3b799d80703d/{path}/{name}", + subdir="fw", sha256=sha256).read_bytes() + +# *** Exec helpers + +def system(cmd:str, **kwargs) -> str: + st = time.perf_counter() + try: ret = subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT, **kwargs).decode().strip() + except subprocess.CalledProcessError as e: + raise RuntimeError(f"system: '{cmd}' failed with exit code {e.returncode}\n{(e.output or b'').decode().strip()}") from e + if DEBUG >= 1: print(f"system: '{cmd}' returned {len(ret)} bytes in {(time.perf_counter() - st)*1e3:.2f} ms") + return ret + +def cpu_objdump(lib, objdump_tool='objdump'): + with tempfile.NamedTemporaryFile(delete=True) as f: + pathlib.Path(f.name).write_bytes(lib) + print(system(f"{objdump_tool} -d {f.name}")) + +def capstone_flatdump(lib: bytes, arch:str): + try: import capstone + except ImportError: + print("Disassembler Error: Capstone not installed.") + return + match arch: + case 'x86_64': cs = capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_64) + case 'arm64': cs = capstone.Cs(capstone.CS_ARCH_ARM64, capstone.CS_MODE_ARM) + case machine: raise NotImplementedError(f"Capstone disassembly isn't supported for {machine}") + cs.skipdata = True + for instr in cs.disasm(lib, 0): + print(f"{instr.address:#08x}: {instr.mnemonic}\t{instr.op_str}") + sys.stdout.flush() + +def _find_llvm_objdump(): + if OSX: return '/opt/homebrew/opt/llvm/bin/llvm-objdump' + # Try ROCm path first, then versioned, then unversioned + for p in ['/opt/rocm/llvm/bin/llvm-objdump', 'llvm-objdump-21', 'llvm-objdump-20', 'llvm-objdump']: + if shutil.which(p): return p + raise FileNotFoundError("llvm-objdump not found") + +def amdgpu_disassemble(lib:bytes): + asm = system(f"{_find_llvm_objdump()} -d -", input=lib).splitlines() + while asm and ("s_nop 0" in asm[-1] or "s_code_end" in asm[-1]): asm.pop() + print("\n".join(asm)) + +def wait_cond(cb, *args, value=True, timeout_ms=10000, msg="") -> bool: + start_time = int(time.perf_counter() * 1000) + while int(time.perf_counter() * 1000) - start_time < timeout_ms: + if (val:=cb(*args)) == value: return val + raise TimeoutError(f"{msg}. Timed out after {timeout_ms} ms, condition not met: {val} != {value}") + +# *** ctypes helpers + +# TODO: make this work with read only memoryviews (if possible) +def from_mv(mv:memoryview, to_type:type[ctypes._SimpleCData]=ctypes.c_char) -> ctypes.Array: + return ctypes.cast(ctypes.addressof(to_type.from_buffer(mv)), ctypes.POINTER(to_type * len(mv))).contents +def to_mv(ptr:int, sz:int) -> memoryview: return memoryview((ctypes.c_uint8 * sz).from_address(ptr)).cast("B") +def mv_address(mv): return ctypes.addressof(ctypes.c_char.from_buffer(mv)) +def to_char_p_p(options: list[bytes], to_type=ctypes.c_char): + return (ctypes.POINTER(to_type) * len(options))(*[ctypes.cast(ctypes.create_string_buffer(o), ctypes.POINTER(to_type)) for o in options]) +def flat_mv(mv:memoryview): return mv if len(mv) == 0 else mv.cast("B", shape=(mv.nbytes,)) + +# *** tqdm + +class tqdm(Generic[T]): + def __init__(self, iterable:Iterable[T]|None=None, desc:str='', disable:bool|None=False, + unit:str='it', unit_scale=False, total:int|None=None, rate:int=100): + self.disable = not sys.stderr.isatty() if disable is None else disable + self.iterable, self.unit, self.unit_scale, self.rate = iterable, unit, unit_scale, rate + self.st, self.i, self.n, self.skip, self.t = time.perf_counter(), -1, 0, 1, getattr(iterable, "__len__", lambda:0)() if total is None else total + self.set_description(desc) + self.update(0) + def __iter__(self) -> Iterator[T]: + assert self.iterable is not None, "need an iterable to iterate" + for item in self.iterable: + yield item + self.update(1) + self.update(close=True) + def __enter__(self): return self + def __exit__(self, *_): self.update(close=True) + def set_description(self, desc:str): self.desc = f"{desc}: " if desc else "" + def update(self, n:int=0, close:bool=False): + self.n, self.i = self.n+n, self.i+1 + if self.disable or (not close and self.i % self.skip != 0): return + prog, elapsed, ncols = self.n/self.t if self.t else 0, time.perf_counter()-self.st, shutil.get_terminal_size().columns + if elapsed and self.i/elapsed > self.rate and self.i: self.skip = max(int(self.i/elapsed)//self.rate,1) + def HMS(t): return ':'.join(f'{x:02d}' if i else str(x) for i,x in enumerate([int(t)//3600,int(t)%3600//60,int(t)%60]) if i or x) + def SI(x): + if not x: return '0.00' + v = f"{x/1000**int(g:=round(math.log(x,1000),6)):.{int(3-3*math.fmod(g,1))}f}"[:4].rstrip('.') + return (f"{x/1000**(int(g)+1):.3f}"[:4].rstrip('.')+' kMGTPEZY'[int(g)+1]) if v == "1000" else v+' kMGTPEZY'[int(g)].strip() + prog_text = f'{SI(self.n)}{f"/{SI(self.t)}" if self.t else self.unit}' if self.unit_scale else f'{self.n}{f"/{self.t}" if self.t else self.unit}' + est_text = f'<{HMS(elapsed/prog-elapsed) if self.n else "?"}' if self.t else '' + it_text = (SI(self.n/elapsed) if self.unit_scale else f"{self.n/elapsed:5.2f}") if self.n else "?" + suf = f'{prog_text} [{HMS(elapsed)}{est_text}, {it_text}{self.unit}/s]' + sz = max(ncols-len(self.desc)-3-2-2-len(suf), 1) + bar = '\r' + self.desc + (f'{100*prog:3.0f}%|{("█"*int(num:=sz*prog)+" ▏▎▍▌▋▊▉"[int(8*num)%8].strip()).ljust(sz," ")}| ' if self.t else '') + suf + print(bar[:ncols+1], flush=True, end='\n'*close, file=sys.stderr) + @classmethod + def write(cls, s:str): print(f"\r\033[K{s}", flush=True, file=sys.stderr) + +def trange(n:int, **kwargs) -> tqdm[int]: return tqdm(range(n), total=n, **kwargs) + +class disable_gc(contextlib.ContextDecorator): + # ContextDecorator otherwise reuses self, so recursive calls overwrite _was_enabled. + def _recreate_cm(self): return type(self)() + def __enter__(self): + self._was_enabled = gc.isenabled() + if self._was_enabled: gc.disable() + def __exit__(self, *exc): + if self._was_enabled: gc.enable() + +# *** universal support for code object pickling + +def _reconstruct_code(*args): return types.CodeType(*args) +def _serialize_code(code:types.CodeType): + args = inspect.signature(types.CodeType).parameters # NOTE: this works in Python 3.10 and up + return _reconstruct_code, tuple(code.__getattribute__('co_'+x.replace('codestring', 'code').replace('constants', 'consts')) for x in args) +copyreg.pickle(types.CodeType, _serialize_code) + +def _serialize_module(module:types.ModuleType): return importlib.import_module, (module.__name__,) +copyreg.pickle(types.ModuleType, _serialize_module) + +class count: + def __init__(self, start:int=0, step:int=1): + self.n, self.step = start, step + def __next__(self) -> int: + cur = self.n + self.n += self.step + return cur diff --git a/artifacts/package_runtime/tinygrad/llm/__init__.py b/artifacts/package_runtime/tinygrad/llm/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/llm/__main__.py b/artifacts/package_runtime/tinygrad/llm/__main__.py new file mode 100644 index 000000000..832facdaa --- /dev/null +++ b/artifacts/package_runtime/tinygrad/llm/__main__.py @@ -0,0 +1,2 @@ +from tinygrad.llm.cli import main +if __name__ == "__main__": main() \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/llm/chat.html b/artifacts/package_runtime/tinygrad/llm/chat.html new file mode 100644 index 000000000..c5eb80ce7 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/llm/chat.html @@ -0,0 +1,42 @@ +tinygrad chat
+ + diff --git a/artifacts/package_runtime/tinygrad/llm/cli.py b/artifacts/package_runtime/tinygrad/llm/cli.py new file mode 100644 index 000000000..d0865e26b --- /dev/null +++ b/artifacts/package_runtime/tinygrad/llm/cli.py @@ -0,0 +1,203 @@ +from __future__ import annotations +import sys, argparse, codecs, itertools, typing, re, unicodedata, json, time +from typing import TYPE_CHECKING +from tinygrad import nn +from tinygrad.uop.ops import UOp, Ops +from tinygrad.helpers import partition, DEBUG, Timing, GlobalCounters, Context, fetch, profile_marker, getenv +from tinygrad.llm.model import Transformer +if TYPE_CHECKING: + import jinja2 + +class SimpleTokenizer: + def __init__(self, normal_tokens:dict[str, int], special_tokens:dict[str, int], preset:str="llama3", + bos_id:int|None=None, eos_id:int=0, eot_id:int|None=None): + preset = {"qwen35":"qwen2","qwen35moe":"qwen2"}.get(preset, preset) + if preset not in ("llama3","llama-v3","llama-bpe","qwen2","olmo","kimi-k2","tekken","glm4"): + raise ValueError(f"Invalid tokenizer preset '{preset}'") + # https://github.com/openai/gpt-2/blob/9b63575ef42771a015060c964af2c3da4cf7c8ab/src/encoder.py#L9 + bs = [*range(33, 127), *range(161, 173), *range(174, 256)] # bytes that map to themselves + self._byte_decoder = {chr(b): b for b in bs} | {chr(256+i): b for i,b in enumerate(b for b in range(256) if b not in bs)} + + # https://github.com/ggml-org/llama.cpp/blob/94933c8c2eeaa9a7983e3f6c08af76bd86724094/src/llama-vocab.cpp#L286 + # 0x323b0 is one past the max codepoint in unicode categories L/N/Z (0x323af is max L) + # compact adjacent codepoints into ranges: listing them all makes re spend seconds on large prompts + def ucat_range(pre:str) -> str: + cps = enumerate(cp for cp in range(0x323b0) if unicodedata.category(chr(cp)).startswith(pre)) + runs = [list(g) for _, g in itertools.groupby(cps, lambda e: e[1]-e[0])] + return "".join(re.escape(chr(g[0][1])) + (f"-{re.escape(chr(g[-1][1]))}" if len(g) > 1 else "") for g in runs) + r_ws, r_p_N, r_p_L = r"\t\n\x0b\x0c\r\x85" + ucat_range("Z"), ucat_range("N"), ucat_range("L") + self._split_to_word = re.compile("(?i:'s|'t|'re|'ve|'m|'ll|'d)|" + \ + f"[^\\r\\n{r_p_N}{r_p_L}]?[{r_p_L}]+|[{r_p_N}]{{1,3}}| ?[^{r_ws}{r_p_N}{r_p_L}]+[\\r\\n]*|[{r_ws}]*[\\r\\n]+|[{r_ws}]+(?![^{r_ws}])|[{r_ws}]+") + self._split_to_sentence = re.compile("|".join(re.escape(tok) for tok in special_tokens.keys()) if special_tokens else r"(?!)") + + self._normal_tokens = {bytes(self._byte_decoder[c] for c in tok): tid for tok, tid in normal_tokens.items()} + self._special_tokens = special_tokens + self._tok2bytes = {tid: tok for tok, tid in self._normal_tokens.items()} | {tid: tok.encode() for tok, tid in self._special_tokens.items()} + self.preset = preset + self.bos_id, self.eos_id, self.eot_id = bos_id, eos_id, eot_id + + @staticmethod + def from_gguf_kv(kv:dict): + # https://github.com/ggml-org/llama.cpp/blob/94933c8c2eeaa9a7983e3f6c08af76bd86724094/src/llama-vocab.cpp#L1818-L1820 + vocab: typing.Iterable[tuple[str, int]] = ((tok, idx) for idx, tok in enumerate(kv["tokenizer.ggml.tokens"])) + normal_tokens, special_tokens = partition(vocab, lambda e: kv["tokenizer.ggml.token_type"][e[1]] == 1) + special_tokens_dict = dict(special_tokens) + return SimpleTokenizer(dict(normal_tokens), special_tokens_dict, kv["tokenizer.ggml.pre"], + bos_id=kv.get('tokenizer.ggml.bos_token_id') if kv.get('tokenizer.ggml.add_bos_token', True) else None, + eos_id=kv.get('tokenizer.ggml.eos_token_id', 0), eot_id=kv.get('tokenizer.ggml.eot_token_id', special_tokens_dict.get('<|im_end|>'))) + + def _encode_word(self, word:bytes) -> list[int]: + if (early_token:=self._normal_tokens.get(word)) is not None: return [early_token] + parts = [bytes([b]) for b in word] + # greedily merge any parts that we can + while True: + i = min([(sys.maxsize, -1)] + [(self._normal_tokens.get(parts[j]+parts[j+1], sys.maxsize), j) for j in range(len(parts)-1)])[1] + if i == -1: break + parts[i:i+2] = [parts[i] + parts[i+1]] + try: return [self._normal_tokens[p] for p in parts] + except KeyError: raise RuntimeError("token not found") + def _encode_sentence(self, chunk:str) -> list[int]: + return [tok for word in self._split_to_word.findall(chunk) for tok in self._encode_word(word.encode())] + def encode(self, text:str) -> list[int]: + tokens: list[int] = [] + pos = 0 + for match in self._split_to_sentence.finditer(text): + tokens.extend(self._encode_sentence(text[pos:match.start(0)]) + [self._special_tokens[text[match.start(0):match.end(0)]]]) + pos = match.end(0) + return tokens + self._encode_sentence(text[pos:]) + + def decode(self, ids:list[int]) -> str: return b''.join(self._tok2bytes[tid] for tid in ids).decode(errors='replace') + def stream_decoder(self) -> typing.Callable[..., str]: + dec = codecs.getincrementaldecoder('utf-8')('replace') + def _decode(tid:int|None=None) -> str: return dec.decode(self._tok2bytes[tid]) if tid is not None else dec.decode(b'', final=True) + return _decode + def is_end(self, token_id:int) -> bool: return token_id in (self.eos_id, self.eot_id) + +models = { + "llama3.2:1b": "https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q6_K.gguf", + "llama3.2:1b-q4": "https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q4_K_M.gguf", + "llama3.2:3b": "https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct-Q6_K.gguf", + "llama3.2:3b-f16": "https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct-f16.gguf", + "llama3.1:8b": "https://huggingface.co/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF/resolve/main/Meta-Llama-3.1-8B-Instruct-Q8_0.gguf", + "qwen3:0.6b": "https://huggingface.co/Qwen/Qwen3-0.6B-GGUF/resolve/main/Qwen3-0.6B-Q8_0.gguf", + "qwen3:1.7b": "https://huggingface.co/unsloth/Qwen3-1.7B-GGUF/resolve/main/Qwen3-1.7B-Q4_K_M.gguf", + "qwen3:8b": "https://huggingface.co/Qwen/Qwen3-8B-GGUF/resolve/main/Qwen3-8B-Q4_K_M.gguf", + "qwen3:30b-a3b": "https://huggingface.co/Qwen/Qwen3-30B-A3B-GGUF/resolve/main/Qwen3-30B-A3B-Q4_K_M.gguf", + "qwen3.5:0.8b": "https://huggingface.co/unsloth/Qwen3.5-0.8B-GGUF/resolve/main/Qwen3.5-0.8B-Q8_0.gguf", + "qwen3.5:4b": "https://huggingface.co/unsloth/Qwen3.5-4B-GGUF/resolve/main/Qwen3.5-4B-Q4_K_M.gguf", + "qwen3.5:9b": "https://huggingface.co/unsloth/Qwen3.5-9B-GGUF/resolve/main/Qwen3.5-9B-Q4_K_M.gguf", + "qwen3.6:27b": "https://huggingface.co/unsloth/Qwen3.6-27B-GGUF/resolve/main/Qwen3.6-27B-Q4_K_M.gguf", + "qwen3.6:35b-a3b": "https://huggingface.co/unsloth/Qwen3.6-35B-A3B-GGUF/resolve/main/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf", + "olmoe": "https://huggingface.co/allenai/OLMoE-1B-7B-0924-Instruct-GGUF/resolve/main/olmoe-1b-7b-0924-instruct-q4_k_m.gguf", + "moonlight": "https://huggingface.co/gabriellarson/Moonlight-16B-A3B-Instruct-GGUF/resolve/main/Moonlight-16B-A3B-Instruct-Q4_K_M.gguf", + "glm-4.7-flash": "https://huggingface.co/unsloth/GLM-4.7-Flash-GGUF/resolve/main/GLM-4.7-Flash-Q4_K_M.gguf", +} + +class FallbackTemplate: + # minimal jinja2.Template-compatible chat template without jinja2, no tool calling support + def __init__(self, tok:SimpleTokenizer): self.tok = tok + def role(self, role:str) -> str: + if self.tok.preset == 'olmo': return "<|" + role + "|>\n" # OLMoE Instruct format + if self.tok.preset == 'kimi-k2': return "<|im_" + role + "|>" + role + "<|im_middle|>" + if self.tok.preset == 'qwen2': return "<|im_start|>" + role + "\n" + if self.tok.preset == 'glm4': return "<|" + role + "|>" + if self.tok.preset == 'tekken': + if role == 'user': return "[INST]" + if role == 'assistant': return "" + raise ValueError(f"Unsupported role '{role}' for tokenizer preset '{self.tok.preset}'") + return "<|start_header_id|>" + role + "<|end_header_id|>\n\n" + def end_turn(self) -> str: + if self.tok.preset == 'olmo': return "\n" + if self.tok.preset == 'kimi-k2': return self.tok.decode([self.tok.eos_id]) + if self.tok.preset == 'qwen2': return self.tok.decode([self.tok.eos_id]) + "\n" + if self.tok.preset == 'glm4': return "" + if self.tok.preset == 'tekken': return "[/INST]" + return self.tok.decode([self.tok.eos_id]) + def render(self, messages:list[dict], tools=None, add_generation_prompt:bool=True, preserve_thinking:bool=False) -> str: + out = self.tok.decode([] if self.tok.bos_id is None else [self.tok.bos_id]) + ("" if self.tok.preset == 'glm4' else "") + for msg in messages: + out += self.role(msg["role"]) + content = msg.get("content") + if isinstance(content, str): out += content + elif isinstance(content, list): + for c in content: + if c["type"] == "text": out += c["text"] + else: raise RuntimeError(f"unhandled type: {c['type']}") + elif content is not None: raise RuntimeError(f"unknown content type: {type(content)}") + out += self.end_turn() + return out + self.role("assistant") if add_generation_prompt else out + +from tinygrad.llm.serve import LLMServer + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--model", "-m", default=list(models.keys())[0], help=f"Model choice ({', '.join(models.keys())}) or path to a local GGUF file") + parser.add_argument("--max_context", type=int, default=4096, help="Max Context Length") + parser.add_argument("--serve", nargs='?', type=int, const=8000, metavar="PORT", help="Run OpenAI compatible API (optional port, default 8000)") + parser.add_argument("--warmup", action="store_true", help="warmup the JIT") + parser.add_argument("--benchmark", nargs='?', type=int, const=20, metavar="COUNT", help="Benchmark tok/s (optional count, default 20)") + args = parser.parse_args() + + # load the model + model, kv = Transformer.from_gguf(fetch(models.get(args.model, args.model)), args.max_context) + model_name = kv.get('general.name') or kv.get('general.basename') or args.model + file_sizes = [y.nbytes() for y in UOp.sink(*[x.uop for x in nn.state.get_parameters(model)]).toposort() if y.op is Ops.BUFFER] + print(f"using model \"{model_name}\" with {sum(file_sizes):,} bytes and {sum(x.numel() for x in nn.state.get_parameters(model)):,} params, " + f"max context {args.max_context} on {nn.state.get_parameters(model)[0].device}") + + # get tokenizer + tok = SimpleTokenizer.from_gguf_kv(kv) + + # use the model's chat template if jinja2 is available (enables model-specific formatting) + template: jinja2.Template|FallbackTemplate = FallbackTemplate(tok) + if (ct := kv.get('tokenizer.chat_template')) is not None: + try: + import jinja2 + env = jinja2.Environment() + env.filters['tojson'] = lambda obj, **kwargs: json.dumps(obj, **kwargs) # jinja2's tojson escapes <>& for HTML safety + env.globals['raise_exception'] = lambda msg: (_ for _ in ()).throw(RuntimeError(msg)) + env.globals['strftime_now'] = lambda fmt: time.strftime(fmt) + env.globals['bos_token'] = tok.decode([tok.bos_id]) if tok.bos_id is not None else "" + env.globals['eos_token'] = tok.decode([tok.eos_id]) + template = env.from_string(ct) + except ImportError: print("warning: jinja2 is not installed, the model's chat template is disabled") + + # warmup the JIT + if args.warmup or args.serve: + with Context(DEBUG=max(DEBUG.value, 1)): model.warmup() + + # start server + if args.serve: LLMServer(('', args.serve), model, model_name, tok, template).serve_forever() + + # do benchmark + if args.benchmark is not None: + gen = model.generate(toks:=[tok.bos_id or 0]) + for i in range(args.benchmark): + profile_marker(f"decode @ {i}") + GlobalCounters.reset() + if (log:=getenv("BENCHMARK_LOG", "")): from extra.bench_log import WallTimeEvent, BenchEvent + with Timing(on_exit=lambda x: f", {1e9/x:6.2f} tok/s, {GlobalCounters.global_mem/x:7.2f} GB/s," + f" {GlobalCounters.global_mem//1000000}/{GlobalCounters.mem_used//1000000} MB -- "+\ + tok.decode(toks).replace("\n", "\\n")): + if log: + with WallTimeEvent(BenchEvent.STEP): next(gen) + else: next(gen) + exit(0) + + # interactive chat + messages: list[dict] = [] + while 1: + try: messages.append({"role":"user", "content":input('>>> ')}) + except EOFError: break + ids = tok.encode(template.render(messages=messages, add_generation_prompt=True)) + reply, dec = "", tok.stream_decoder() + for next_id in model.generate(ids): + if tok.is_end(next_id): + sys.stdout.write(dec() + "\n\n") + break + reply += (piece := dec(next_id)) + sys.stdout.write(piece) + sys.stdout.flush() + messages.append({"role":"assistant", "content":reply}) + +if __name__ == "__main__": main() diff --git a/artifacts/package_runtime/tinygrad/llm/gguf.py b/artifacts/package_runtime/tinygrad/llm/gguf.py new file mode 100644 index 000000000..49772dabf --- /dev/null +++ b/artifacts/package_runtime/tinygrad/llm/gguf.py @@ -0,0 +1,176 @@ +import functools, io, pathlib, re, struct +from typing import Any, Callable + +from tinygrad.tensor import Tensor +from tinygrad.dtype import dtypes +from tinygrad.helpers import prod, round_up +from tinygrad.nn.state import TensorIO + +# ggml packs each iq grid entry as N bytes (N=4 for uint32 grids, N=8 for uint64 grids) in a single word. See ggml-common.h. +@functools.lru_cache(None) +def _ggml_iq_grid(device: str, grid: tuple[int, ...], grid_shape: tuple[int, int]) -> Tensor: + values = [float((w >> (8*i)) & 0xFF) for w in grid for i in range(grid_shape[1])] + return Tensor(values, dtype=dtypes.float32, device=device).reshape(grid_shape) + +# native types {ggml_type: dtype} +_GGML_NATIVE = {0: dtypes.float32, 1: dtypes.float16, 24: dtypes.int8, 25: dtypes.int16, + 26: dtypes.int32, 27: dtypes.int64, 28: dtypes.float64, 30: dtypes.bfloat16} + +# quant types {ggml_type: (number of elements, number of bytes)} +_GGML_QUANT = {2:(32,18), 3:(32,20), 6:(32,22), 7:(32,24), 8:(32,34), + 12:(256,144), 13:(256,176), 14:(256,210), 18:(256,98), 21:(256,110), 22:(256,82), 23:(256,136), 39:(32,17), 41:(128,18)} + +def ggml_data_to_tensor(t: Tensor, n: int, ggml_type: int) -> Tensor: + """ + Converts ggml tensor data to a tinygrad tensor. + + Supported native types: float32 (id: 0), float16 (id: 1), int8 (id: 24), + int16 (id: 25), int32 (id: 26), int64 (id: 27), float64 (id: 28), bfloat16 (id: 30) + Supported quantized types: Q4_0 (id: 2), Q4_1 (id: 3), Q5_0 (id: 6), + Q5_1 (id: 7), Q8_0 (id: 8), Q4_K (id: 12), Q5_K (id: 13), + Q6_K (id: 14), IQ3_XXS (id: 18), IQ3_S (id: 21), IQ2_S (id: 22), IQ4_XS (id: 23), MXFP4 (id: 39), Q1_0 (id: 41) + """ + # https://github.com/ggerganov/ggml/blob/323951f1bdcdfbd5b5ff3a9a7c3770e63b1a560e/include/ggml.h#L356 + + if (dtype := _GGML_NATIVE.get(ggml_type)) is not None: + return t[:dtype.itemsize * n].contiguous().bitcast(dtype) + + def q_to_uint8(t: Tensor, b: int) -> Tensor: + # TODO: rewrite with arange? + shift_tensor, bitmask = Tensor.const(tuple(2**(i*b) for i in range(8//b)), t.dtype), 0xff >> (8 - b) + return t.unsqueeze(-1).div(shift_tensor, rounding_mode="trunc").bitwise_and(bitmask).transpose(-1, -2).flatten(-2) + + if (nelements_nbytes := _GGML_QUANT.get(ggml_type)) is not None: + from tinygrad.runtime.autogen import ggml_common as _ggml + blocks = t[:(n//nelements_nbytes[0])*nelements_nbytes[1]].reshape((-1, nelements_nbytes[1])).contiguous() + if ggml_type == 2: return (q_to_uint8(blocks[:,2:], 4).bitcast(dtypes.int8) - 8) * blocks[:,:2].bitcast(dtypes.float16).cast(dtypes.float32) + if ggml_type == 3: + d, m = (blocks[:,s:s+2].bitcast(dtypes.float16).cast(dtypes.float32) for s in [ 0, 2 ]) + return q_to_uint8(blocks[:,4:], 4).bitcast(dtypes.int8) * d + m + if ggml_type in (6, 7): + d = blocks[:,:2].bitcast(dtypes.float16).cast(dtypes.float32) + qh_off = 2 if ggml_type == 6 else 4 + qh = q_to_uint8(blocks[:,qh_off:qh_off+4], 1).reshape((-1, 8, 4)).transpose(-1, -2).flatten(-2).bitcast(dtypes.int8) + q = q_to_uint8(blocks[:,qh_off+4:], 4).bitcast(dtypes.int8) + qh * 16 + return q * d + (blocks[:,2:4].bitcast(dtypes.float16).cast(dtypes.float32) if ggml_type == 7 else -16 * d) + if ggml_type == 8: return blocks[:,:2].bitcast(dtypes.float16).cast(dtypes.float32) * blocks[:,2:].bitcast(dtypes.int8) + # Q4_K: 256 elements per 144-byte block (d:2, dmin:2, scales:12, qs:128) + # Q5_K: 256 elements per 176-byte block (d:2, dmin:2, scales:12, qh:32, qs:128) + if ggml_type in (12, 13): + d, dmin = (blocks[:,i:i+2].bitcast(dtypes.float16).cast(dtypes.float32).unsqueeze(-1) for i in [0, 2]) + s = blocks[:,4:16] # 12 bytes: 6-bit scales[0-3], 6-bit mins[0-3], high bits[4-7] + sc = s[:,0:4].bitwise_and(63).cat(s[:,8:12].bitwise_and(0xF).bitwise_or(s[:,0:4].rshift(6).lshift(4)), dim=-1) + mn = s[:,4:8].bitwise_and(63).cat(s[:,8:12].rshift(4).bitwise_or(s[:,4:8].rshift(6).lshift(4)), dim=-1) + qs_off = 48 if ggml_type == 13 else 16 + q = Tensor.stack((qs:=blocks[:,qs_off:qs_off+128].reshape(-1,4,32)).bitwise_and(0xF), qs.rshift(4), dim=2).reshape(-1,8,32) + if ggml_type == 13: q = q + q_to_uint8(blocks[:,16:48], 1).reshape(-1, 8, 32) * 16 + return (d * sc.unsqueeze(-1) * q - dmin * mn.unsqueeze(-1)).flatten(-2) + if ggml_type == 14: + xl, xh = q_to_uint8(blocks[:,:128].reshape((-1, 2, 64)), 4), q_to_uint8(blocks[:,128:192].reshape((-1, 2, 32)), 2).lshift(4) + scales = blocks[:,192:208].bitcast(dtypes.int8).unsqueeze(-1).expand((-1, 16, 16)).reshape((-1, 256)) + d = blocks[:,-2:].bitcast(dtypes.float16).cast(dtypes.float32) + return d * (xl.bitwise_or(xh).bitcast(dtypes.int8) - 32).flatten(-2) * scales + if ggml_type == 18: + d = blocks[:, :2].bitcast(dtypes.float16).cast(dtypes.float32).reshape((-1, 1, 1, 1)) + scale_words = blocks[:, 66:98].bitcast(dtypes.uint32) + db = d * (scale_words.rshift(28).cast(dtypes.float32) + 0.5).reshape((-1, 8, 1, 1)) * 0.5 + sign_idx = scale_words.unsqueeze(-1).rshift(Tensor.const((0, 7, 14, 21), dtypes.uint32)).bitwise_and(0x7F).reshape((-1, 32)).cast(dtypes.int32) + even_signs = Tensor([i | (0x80 if i.bit_count() % 2 else 0) for i in range(128)], dtype=dtypes.uint8, device=t.device) + signs = (q_to_uint8(even_signs[sign_idx].reshape((-1, 32, 1)), 1) == 0).where(1.0, -1.0).reshape((-1, 8, 4, 8)) + grid = _ggml_iq_grid(t.device, _ggml.iq3xxs_grid, (256, 4))[blocks[:, 2:66]].reshape((-1, 8, 4, 8)) + return (db * grid * signs).flatten(-3) + if ggml_type == 21: + d = blocks[:, :2].bitcast(dtypes.float16).cast(dtypes.float32).reshape((-1, 1, 1, 1)) + scales = (1 + 2 * q_to_uint8(blocks[:, 106:110].reshape((-1, 4, 1)), 4).reshape((-1, 8))).cast(dtypes.float32).reshape((-1, 8, 1, 1)) + qh = q_to_uint8(blocks[:, 66:74].reshape((-1, 8, 1)), 1).reshape((-1, 64)).cast(dtypes.uint16) + signs = (q_to_uint8(blocks[:, 74:106].reshape((-1, 32, 1)), 1).reshape((-1, 256)) == 0).where(1.0, -1.0).reshape((-1, 8, 4, 8)) + q = blocks[:, 2:66].cast(dtypes.uint16) + qh.lshift(8) + return (d * scales * _ggml_iq_grid(t.device, _ggml.iq3s_grid, (512, 4))[q].reshape((-1, 8, 4, 8)) * signs).flatten(-3) + if ggml_type == 22: + d = blocks[:, :2].bitcast(dtypes.float16).cast(dtypes.float32).reshape((-1, 1, 1, 1)) + db = d * (q_to_uint8(blocks[:, 74:82].reshape((-1, 8, 1)), 4).reshape((-1, 16)).cast(dtypes.float32) + 0.5).reshape((-1, 16, 1, 1)) * 0.25 + signs = (q_to_uint8(blocks[:, 34:66].reshape((-1, 32, 1)), 1) == 0).where(1.0, -1.0).reshape((-1, 16, 2, 8)) + qh = q_to_uint8(blocks[:, 66:74].reshape((-1, 8, 1)), 2).reshape((-1, 32)).cast(dtypes.uint16) + q = blocks[:, 2:34].cast(dtypes.uint16) + qh.lshift(8) + return (db * _ggml_iq_grid(t.device, _ggml.iq2s_grid, (1024, 8))[q].reshape((-1, 16, 2, 8)) * signs).flatten(-3) + if ggml_type == 23: + d = blocks[:, :2].bitcast(dtypes.float16).cast(dtypes.float32).reshape((-1, 1, 1)) + scale_shifts = Tensor.const((0, 2, 4, 6, 8, 10, 12, 14), dtypes.uint16) + iq4_xs_lut = Tensor(list(_ggml.kvalues_iq4nl), dtype=dtypes.float32, device=t.device) + scales_l = Tensor.stack((sl:=blocks[:, 4:8]).bitwise_and(0xF), sl.rshift(4), dim=2).reshape((-1, 8)) + scales_h = blocks[:, 2:4].bitcast(dtypes.uint16).unsqueeze(-1).rshift(scale_shifts).bitwise_and(0x03).reshape((-1, 8)).cast(dtypes.uint8) + scales = (scales_l.bitwise_or(scales_h.lshift(4)).bitcast(dtypes.int8) - 32).cast(dtypes.float32).reshape((-1, 8, 1)) + q = (qs:=blocks[:, 8:].reshape((-1, 8, 16))).bitwise_and(0xF).cat(qs.rshift(4), dim=2) + return (d * scales * iq4_xs_lut[q]).flatten(-2) + if ggml_type == 39: + e = blocks[:, 0].cast(dtypes.uint32) + small_bits = Tensor([0x00200000, 0x00400000], dtype=dtypes.uint32, device=t.device)[e.clip(0, 1).cast(dtypes.int32)] # e = 0 or e = 1 case + d = (e < 2).where(small_bits, (e - 1) * 0x00800000).bitcast(dtypes.float32).unsqueeze(-1) + codes = q_to_uint8(blocks[:, 1:17], 4) + fp4_lut = Tensor([0.0, 1.0, 2.0, 3.0, 4.0, 6.0, 8.0, 12.0, + -0.0,-1.0,-2.0,-3.0,-4.0,-6.0,-8.0,-12.0], + dtype=dtypes.float32, device=t.device) + fp4_val = fp4_lut[codes] + return (fp4_val * d).flatten(-2)[:n] + if ggml_type == 41: + d = blocks[:,:2].bitcast(dtypes.float16) + bits = q_to_uint8(blocks[:,2:], 1).reshape(-1, 8, 16).transpose(-1, -2).flatten(-2).bitcast(dtypes.int8) + return d * (bits * 2 - 1) + raise ValueError(f"GGML type '{ggml_type}' is not supported!") + +def _read_unpack(fmt: str, n: int, r:io.BufferedIOBase): return struct.unpack(fmt, r.read(n))[0] +def read_str(r:io.BufferedIOBase): return str(r.read(read_uint64(r)), "utf-8") +def read_arr(r:io.BufferedIOBase): + item_reader, n = readers[read_int32(r)], read_uint64(r) + return [item_reader(r) for _ in range(n)] + +readers: dict[int, Callable[[io.BufferedIOBase], Any]] = { 8: read_str, 9: read_arr, + **{ t: functools.partial(_read_unpack, "<"+f, nb) for t,f,nb in \ + [ (0,"c",1), (1,"b",1), (2,"H",2), (3,"h",2), (4,"I",4), (5,"i",4), (6,"f",4), (7,"?",1), (10,"Q",8), (11,"q",8), (12,"d",8) ] } } +read_uint32, read_int32, read_uint64, read_int64 = readers[4], readers[5], readers[10], readers[11] + +def _gguf_parse(tensor: Tensor) -> tuple[dict, dict[str, Tensor]]: + # TODO: remove the need for copy to default device + tensor = tensor.to(None).realize() + r = io.BufferedReader(TensorIO(tensor), 1_000_000) + magic, version, n_tensors, n_kv = r.read(4), read_int32(r), read_int64(r), read_int64(r) + if magic != b"GGUF" or version not in [2, 3]: raise ValueError("Invalid GGUF format!") + + kv_data = {} + for _ in range(n_kv): + k, typ = read_str(r), read_int32(r) + kv_data[k] = readers[typ](r) + + t_infos = [ (read_str(r), tuple(read_uint64(r) for _ in range(read_uint32(r))), read_int32(r), read_uint64(r)) for _ in range(n_tensors) ] + alignment, pos = kv_data.get("general.alignment", 32), r.tell() + data_start = round_up(pos, alignment) + + state_dict = {name: ggml_data_to_tensor(tensor[data_start + off:], prod(dims), typ).reshape(*reversed(dims)) for name, dims, typ, off in t_infos} + return kv_data, state_dict + +def _gguf_split_paths(path: pathlib.Path, kv: dict) -> list[pathlib.Path]: + if (total := kv.get('split.count', 1)) <= 1: return [path] + if kv.get('split.no', 0) != 0: raise ValueError(f"multi-part GGUF must be loaded from the first split, got split.no={kv['split.no']}") + if not (m := re.match(r"^(.*)-00001-of-\d{5}\.gguf$", str(path))): raise ValueError(f"first split path must end with -00001-of-NNNNN.gguf: {path}") + return [pathlib.Path(f"{m.group(1)}-{i:05d}-of-{total:05d}.gguf") for i in range(1, total+1)] + +def gguf_load(fn: Tensor|str|pathlib.Path) -> tuple[dict, dict[str, Tensor]]: + """ + Loads a .gguf file, returning the `kv_data` and `state_dict`. Multi-part splits are auto-merged when loaded by path. + + ```python + import pathlib + from tinygrad import Device, Tensor + from tinygrad.llm.gguf import gguf_load + + gguf_tensor = Tensor(pathlib.Path("Meta-Llama-3-8B-Instruct.Q4_0.gguf")).to(Device.DEFAULT) + kv_data, state_dict = gguf_load(gguf_tensor) + ``` + + NOTE: The provided tensor must be on a device that supports execution. + """ + kv, sd = _gguf_parse(fn if isinstance(fn, Tensor) else Tensor(pathlib.Path(fn))) + if kv.get('split.count', 1) <= 1: return kv, sd + if isinstance(fn, Tensor): raise ValueError("multi-part GGUF requires a path argument (got Tensor)") + for pp in _gguf_split_paths(pathlib.Path(fn), kv)[1:]: sd.update(_gguf_parse(Tensor(pp))[1]) + return kv, sd diff --git a/artifacts/package_runtime/tinygrad/llm/model.py b/artifacts/package_runtime/tinygrad/llm/model.py new file mode 100644 index 000000000..1f4feb969 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/llm/model.py @@ -0,0 +1,447 @@ +from __future__ import annotations +import functools, itertools, pathlib +from dataclasses import dataclass, replace +from tinygrad import Tensor, nn, UOp, TinyJit, getenv, function +from tinygrad.nn import Linear +from tinygrad.llm.gguf import gguf_load +from tinygrad.uop.ops import resolve + +@functools.cache +def precompute_freqs_cis(dim: int, end: int, theta: float = 10000.0, device:str|None=None) -> Tensor: + freqs = 1.0 / (theta ** (Tensor.arange(0, dim, 2)[:(dim // 2)] / dim)) + freqs = Tensor.arange(end).unsqueeze(dim=1) * freqs.unsqueeze(dim=0) + return freqs.cos().cat(freqs.sin(), dim=-1).clone(device) + +class ExpertWeights: + """Like Linear but with num_experts dimension. Weight shape: (num_experts, out_features, in_features).""" + def __init__(self, num_experts:int, in_features:int, out_features:int): + self.weight = Tensor.zeros(num_experts, out_features, in_features) + def __call__(self, sel:Tensor, x:Tensor) -> Tensor: + # sel: (B, T, k), x: (B, T, 1, in) or (B, T, k, in) -> output: (B, T, k, out) + return (x.unsqueeze(-2) @ self.weight[sel].transpose(-1, -2)).contiguous().squeeze(-2) + +def apply_rope(x:Tensor, freqs_cis:Tensor) -> Tensor: + assert x.shape[-1] % 2 == 0 + cos, sin = freqs_cis.reshape(1, 1, x.shape[2], -1).chunk(2, dim=-1) + x1, x2 = x.chunk(2, dim=-1) + return (x1 * cos - x2 * sin).cat(x2 * cos + x1 * sin, dim=-1) + +def pairwise_topk(x: Tensor, k: int) -> tuple[Tensor, Tensor]: + n = x.shape[-1] + vals = Tensor.arange(n).reshape(1,1,n).cast(x.dtype).expand(x.shape) + cmp = (x.unsqueeze(-1) > x.unsqueeze(-2)) | ((x.unsqueeze(-1) == x.unsqueeze(-2)) & \ + (Tensor.arange(n).reshape(1,1,n,1) < Tensor.arange(n).reshape(1,1,1,n))) + sel = x.const_like(0).scatter(-1, cmp.sum(axis=-1).cast('int32'), vals)[:,:,n-k:].cast('int32') + return x.gather(-1, sel), sel + +@dataclass(frozen=True) +class SSMConfig: + conv_kernel: int + state_size: int + group_count: int + time_step_rank: int + inner_size: int + kda: bool = False + +@dataclass(frozen=True) +class TransformerConfig: + num_blocks: int + dim: int + hidden_dim: int + n_heads: int + n_kv_heads: int + norm_eps: float + vocab_size: int + head_dim: int + rope_theta: float + rope_dim: int + v_head_dim: int + max_context: int = 0 + qk_norm: int = 0 + num_experts: int = 0 + num_experts_per_tok: int = 0 + norm_topk_prob: bool = False + q_lora_rank: int = 0 + kv_lora_rank: int = 0 + shared_expert_dim: int = 0 + ssm_layers: tuple[bool, ...] = () + attn_output_gate: bool = False + ssm: SSMConfig|None = None + shared_expert_gate: bool = True + leading_dense_blocks: int = 0 + dense_hidden_dim: int = 0 + routed_scaling_factor: float = 1.0 + qkv_bias: bool = False + expert_bias: bool = False + +class FFNBlock: + def __init__(self, config:TransformerConfig): + self.config = config + + # --- RMSNorms -------------------------------------------------------- + self.attn_norm = nn.RMSNorm(config.dim, config.norm_eps) + self.ffn_norm = nn.RMSNorm(config.dim, config.norm_eps) + + # --- feed-forward (MoE or dense) ------------------------------------- + if config.num_experts > 0: + self.ffn_gate_inp = Linear(config.dim, config.num_experts, bias=False) # router + if config.expert_bias: self.exp_probs_b = {"bias": Tensor.zeros(config.num_experts)} + self.ffn_gate_exps = ExpertWeights(config.num_experts, config.dim, config.hidden_dim) + self.ffn_up_exps = ExpertWeights(config.num_experts, config.dim, config.hidden_dim) + self.ffn_down_exps = ExpertWeights(config.num_experts, config.hidden_dim, config.dim) + if config.shared_expert_dim > 0: + self.ffn_gate_shexp = Linear(config.dim, config.shared_expert_dim, bias=False) + self.ffn_up_shexp = Linear(config.dim, config.shared_expert_dim, bias=False) + self.ffn_down_shexp = Linear(config.shared_expert_dim, config.dim, bias=False) + if config.shared_expert_gate: self.ffn_gate_inp_shexp = {"weight": Tensor.zeros(config.dim)} + else: + self.ffn_gate = Linear(config.dim, config.hidden_dim, bias=False) + self.ffn_up = Linear(config.dim, config.hidden_dim, bias=False) + self.ffn_down = Linear(config.hidden_dim, config.dim, bias=False) + + def _feed_forward(self, x:Tensor) -> Tensor: + if hasattr(self, 'ffn_gate_exps'): + h = x.unsqueeze(2) # (B, T, 1, D) - add expert dim for broadcasting + logits = self.ffn_gate_inp(x) + if hasattr(self, 'exp_probs_b'): + probs = logits.sigmoid() + _, sel = pairwise_topk(probs + self.exp_probs_b["bias"], self.config.num_experts_per_tok) + probs = probs.gather(-1, sel) + if self.config.norm_topk_prob: probs = probs / probs.sum(axis=-1, keepdim=True) + else: + vals, sel = pairwise_topk(logits, self.config.num_experts_per_tok) + probs = vals.softmax(-1) if self.config.norm_topk_prob else logits.softmax(-1).gather(-1, sel) + probs = probs * self.config.routed_scaling_factor + x_down = self.ffn_down_exps(sel, (self.ffn_gate_exps(sel, h).silu() * self.ffn_up_exps(sel, h)).contiguous()) # (B, T, k, D) + out = (x_down * probs.unsqueeze(-1)).sum(axis=2) # (B, T, D) + if hasattr(self, 'ffn_gate_shexp'): + shexp = self.ffn_down_shexp(self.ffn_gate_shexp(x).silu().contiguous() * self.ffn_up_shexp(x)) + if hasattr(self, 'ffn_gate_inp_shexp'): shexp = shexp * (x * self.ffn_gate_inp_shexp["weight"]).sum(axis=-1, keepdim=True).sigmoid() + out = out + shexp + return out + # TODO: remove the need for this contiguous + return self.ffn_down(self.ffn_gate(x).silu().contiguous() * self.ffn_up(x)) + + # given the token-prefix match, return how much cached state this block can still reuse + def _reusable_prefix_len(self, prefix_len:int, cached_len:int) -> int: return prefix_len + # return writes that reset this block's state after a cache mismatch + def _state_reset_ops(self) -> list[Tensor]: return [] + def _init_state(self, x:Tensor): raise NotImplementedError + def _attention(self, x:Tensor, start_pos:int|UOp) -> Tensor: raise NotImplementedError + + def __call__(self, x: Tensor, start_pos: int|UOp): + self._init_state(x) + # we pass in the weights implicitly so we unpack the GGUF on the fly + @function(precompile=True, allow_implicit=True) + def _run(x:Tensor, start_pos:int|UOp): + h = x + self._attention(self.attn_norm(x), start_pos) + return (h + self._feed_forward(self.ffn_norm(h))).contiguous() + return _run(x, start_pos) + +class TransformerBlock(FFNBlock): + def __init__(self, config:TransformerConfig): + super().__init__(config) + assert config.v_head_dim == config.head_dim, "TransformerBlock requires v_head_dim == head_dim" + + # --- attention projections (all linear, bias-free) ------------------ + q_proj_out = config.head_dim * config.n_heads * (2 if config.attn_output_gate else 1) + kv_proj_out = config.head_dim * config.n_kv_heads + self.attn_q = Linear(config.dim, q_proj_out, bias=config.qkv_bias) + self.attn_k = Linear(config.dim, kv_proj_out, bias=config.qkv_bias) + self.attn_v = Linear(config.dim, kv_proj_out, bias=config.qkv_bias) + self.attn_output = Linear(config.head_dim * config.n_heads, config.dim, bias=False) + if config.qk_norm: self.attn_q_norm, self.attn_k_norm = nn.RMSNorm(config.qk_norm, config.norm_eps), nn.RMSNorm(config.qk_norm, config.norm_eps) + + def _attention(self, x:Tensor, start_pos:int|UOp) -> Tensor: + q, k, v = self.attn_q(x), self.attn_k(x), self.attn_v(x) + if self.config.qk_norm and self.config.qk_norm != self.config.head_dim: q, k = self.attn_q_norm(q), self.attn_k_norm(k) + + B, T, _ = x.shape + if self.config.attn_output_gate: + qg = q.reshape(B, T, self.config.n_heads, 2, self.config.head_dim) + q, gate = qg[:, :, :, 0, :], qg[:, :, :, 1, :].reshape(B, T, self.config.n_heads * self.config.head_dim) + q = q.reshape(B, T, self.config.n_heads, self.config.head_dim).transpose(1, 2) # (B,H,T,Hd) + k = k.reshape(B, T, self.config.n_kv_heads, self.config.head_dim).transpose(1, 2) # (B,KvH,T,Hd) + v = v.reshape(B, T, self.config.n_kv_heads, self.config.head_dim).transpose(1, 2) # (B,KvH,T,Hd) + if self.config.qk_norm == self.config.head_dim: q, k = self.attn_q_norm(q), self.attn_k_norm(k) + + q = apply_rope(q[..., :self.config.rope_dim], self.freqs_cis[start_pos:start_pos+T]).cat(q[..., self.config.rope_dim:], dim=-1) + k = apply_rope(k[..., :self.config.rope_dim], self.freqs_cis[start_pos:start_pos+T]).cat(k[..., self.config.rope_dim:], dim=-1) + + # NOTE: we don't want to change self.cache_kv, the function API doesn't support this well + assigned_kv = Tensor(self.cache_kv.uop.after(self.cache_kv[:, :, :, start_pos:start_pos+T, :].uop.store(Tensor.stack(k, v).uop))) + k = assigned_kv[0, :, :, 0:start_pos+T, :] + v = assigned_kv[1, :, :, 0:start_pos+T, :] + + #self.cache_kv[:, :, :, start_pos:start_pos+T, :].assign(Tensor.stack(k, v)) + #k = self.cache_kv[0, :, :, 0:start_pos+T, :] + #v = self.cache_kv[1, :, :, 0:start_pos+T, :] + + # NOTE: this mask is causal_lower_right, not the causal_upper_left generated by is_casual = True + # TODO: this if statement should be removed and it shouldn't generate extra kernels + mask = Tensor.full((1, 1, T, start_pos+T), float("-inf"), dtype=x.dtype, buffer=False).triu(start_pos+1) \ + if resolve(T != 1) else None + attn = q.scaled_dot_product_attention(k, v, attn_mask=mask, enable_gqa=True) # (B,H,T,Hd) + attn = attn.transpose(1, 2).reshape(B, T, -1) # back to (B,T,D) + return self.attn_output(attn if not self.config.attn_output_gate else (attn * gate.sigmoid())) + + def _init_state(self, x:Tensor): + if not hasattr(self, "cache_kv"): + # TODO: how is the dtype of this determined? + self.cache_kv = Tensor.empty(2, x.shape[0], self.config.n_kv_heads, self.config.max_context, self.config.head_dim, device=x.device) + self.freqs_cis = precompute_freqs_cis(self.config.rope_dim, self.config.max_context, self.config.rope_theta, device=x.device) + +class MLATransformerBlock(FFNBlock): + def __init__(self, config:TransformerConfig): + super().__init__(config) + qk_nope_head_dim = config.head_dim - config.rope_dim + if config.q_lora_rank > 0: + self.attn_q_a = Linear(config.dim, config.q_lora_rank, bias=False) + self.attn_q_a_norm = nn.RMSNorm(config.q_lora_rank, config.norm_eps) + self.attn_q_b = Linear(config.q_lora_rank, config.n_heads * config.head_dim, bias=False) + else: + self.attn_q = Linear(config.dim, config.n_heads * config.head_dim, bias=False) + self.attn_kv_a_mqa = Linear(config.dim, config.kv_lora_rank + config.rope_dim, bias=False) + self.attn_kv_a_norm = nn.RMSNorm(config.kv_lora_rank, config.norm_eps) + self.attn_k_b = {"weight": Tensor.zeros(config.n_heads, config.kv_lora_rank, qk_nope_head_dim)} + self.attn_v_b = {"weight": Tensor.zeros(config.n_heads, config.v_head_dim, config.kv_lora_rank)} + self.attn_output = Linear(config.n_heads * config.v_head_dim, config.dim, bias=False) + + def _attention(self, x:Tensor, start_pos:int|UOp) -> Tensor: + B, T, _ = x.shape + q_nope_head_dim = self.config.head_dim - self.config.rope_dim + q_proj = self.attn_q_b(self.attn_q_a_norm(self.attn_q_a(x))) if self.config.q_lora_rank > 0 else self.attn_q(x) + q = q_proj.reshape(B, T, self.config.n_heads, self.config.head_dim).transpose(1, 2) + q_nope, q_rope = q[..., :q_nope_head_dim], q[..., q_nope_head_dim:] + if not self.config.ssm or not self.config.ssm.kda: q_rope = apply_rope(q_rope, self.freqs_cis[start_pos:start_pos+T]) + q = (q_nope @ self.attn_k_b["weight"].transpose(-1, -2)).cat(q_rope, dim=-1) + + kv_a = self.attn_kv_a_mqa(x) + c_kv = self.attn_kv_a_norm(kv_a[..., :self.config.kv_lora_rank]) + k_rope = kv_a[..., self.config.kv_lora_rank:].reshape(B, T, 1, self.config.rope_dim).transpose(1, 2) + if not self.config.ssm or not self.config.ssm.kda: k_rope = apply_rope(k_rope, self.freqs_cis[start_pos:start_pos+T]) + + k_store = c_kv.reshape(B, 1, T, self.config.kv_lora_rank).cat(k_rope.reshape(B, 1, T, self.config.rope_dim), dim=-1) + k = Tensor(self.cache_k.uop.after(self.cache_k[:, :, start_pos:start_pos+T, :].uop.store(k_store.uop)))[:, :, 0:start_pos+T, :] + v = k[..., :self.config.kv_lora_rank] + + mask = Tensor.full((1, 1, T, start_pos+T), float("-inf"), dtype=x.dtype, buffer=False).triu(start_pos+1) \ + if resolve(T != 1) else None + attn = q @ k.transpose(-1, -2) * (1.0 / self.config.head_dim ** 0.5) + if mask is not None: attn = attn + mask + attn = attn.softmax(-1) + attn = ((attn @ v) @ self.attn_v_b["weight"].transpose(-1, -2)).transpose(1, 2).reshape(B, T, -1) + return self.attn_output(attn) + + def _init_state(self, x:Tensor): + if not hasattr(self, "cache_k"): + self.cache_k = Tensor.empty(x.shape[0], 1, self.config.max_context, self.config.kv_lora_rank + self.config.rope_dim, device=x.device) + self.freqs_cis = precompute_freqs_cis(self.config.rope_dim, self.config.max_context, self.config.rope_theta, device=x.device) + +class GatedDeltaNetBlock(FFNBlock): + def __init__(self, config:TransformerConfig, ssm:SSMConfig): + super().__init__(config) + self.head_k_dim, self.num_k_heads, self.num_v_heads = ssm.state_size, ssm.group_count, ssm.time_step_rank + assert self.num_v_heads % self.num_k_heads == 0 + self.head_v_dim, self.ssm_conv_kernel = ssm.inner_size // ssm.time_step_rank, ssm.conv_kernel + self.conv_channels, self.q_dim = ssm.inner_size + 2*ssm.group_count*ssm.state_size, ssm.state_size*ssm.group_count + self.attn_qkv = Linear(config.dim, self.conv_channels, bias=False) + if ssm.kda: + self.ssm_g_a, self.ssm_g_b = Linear(config.dim, self.head_v_dim, bias=False), Linear(self.head_v_dim, ssm.inner_size, bias=False) + self.ssm_f_a, self.ssm_f_b = Linear(config.dim, self.head_k_dim, bias=False), Linear(self.head_k_dim, ssm.inner_size, bias=False) + else: + self.attn_gate = Linear(config.dim, ssm.inner_size, bias=False) + self.ssm_alpha = Linear(config.dim, self.num_v_heads, bias=False) + self.ssm_beta = Linear(config.dim, self.num_v_heads, bias=False) + self.ssm_conv1d = {"weight": Tensor.zeros(self.conv_channels, self.ssm_conv_kernel)} + self.ssm_dt = {"bias": Tensor.zeros(ssm.inner_size if ssm.kda else self.num_v_heads)} + self.ssm_a = Tensor.zeros(self.num_v_heads, 1) if ssm.kda else Tensor.zeros(self.num_v_heads) + self.ssm_norm, self.ssm_out = nn.RMSNorm(self.head_v_dim, config.norm_eps), Linear(ssm.inner_size, config.dim, bias=False) + + def _attention(self, x:Tensor, start_pos:int|UOp) -> Tensor: + B, T, _ = x.shape + assert T == 1, "GatedDeltaNetBlock currently only supports T=1" + + # input processing + x = x.half() + out_gate = self.ssm_g_b(self.ssm_g_a(x)) if hasattr(self, "ssm_g_a") else self.attn_gate(x) + out_gate = out_gate.reshape(B, 1, self.num_v_heads, self.head_v_dim) + beta = self.ssm_beta(x).sigmoid().reshape(B, self.num_v_heads, 1, 1) + alpha = self.ssm_f_b(self.ssm_f_a(x)) if hasattr(self, "ssm_f_a") else self.ssm_alpha(x) + alpha = ((alpha.float() + self.ssm_dt["bias"]).softplus().reshape(B, self.num_v_heads, -1) * + self.ssm_a.reshape(1, self.num_v_heads, -1)).exp().unsqueeze(-2) + + # qkv conv + conv_window = self.conv_state.cat(self.attn_qkv(x), dim=1) + conv_out = (conv_window * self.ssm_conv1d["weight"].T.unsqueeze(0)).sum(1).silu() + q, k, v = conv_out.split([self.q_dim, self.q_dim, self.conv_channels - 2*self.q_dim], dim=-1) + q = q.reshape(B, self.num_k_heads, self.head_k_dim).normalize(dim=-1).repeat(1, self.num_v_heads//self.num_k_heads, 1) + k = k.reshape(B, self.num_k_heads, self.head_k_dim).normalize(dim=-1).repeat(1, self.num_v_heads//self.num_k_heads, 1) + v = v.reshape(B, self.num_v_heads, self.head_v_dim) + q, k, v = q.mul(self.head_k_dim**-0.5).unsqueeze(-1), k.unsqueeze(-1), v.unsqueeze(-1) + + # recurrent + recurrent_state = self.recurrent_state * alpha + recurrent_state = recurrent_state + ((v - recurrent_state@k) * beta)@k.transpose(-1, -2) + + # store the updated state + conv_state_store = self.conv_state.uop.store(conv_window[:, 1:, :].cast(self.conv_state.dtype).uop) + recurrent_state_store = self.recurrent_state.uop.store(recurrent_state.cast(self.recurrent_state.dtype).uop) + recurrent_state = Tensor(self.recurrent_state.uop.after(recurrent_state_store, conv_state_store)) + + # output + core_attn_out = self.ssm_norm((recurrent_state@q).squeeze(-1).reshape(B, 1, self.num_v_heads, self.head_v_dim)) + out_gate = out_gate.sigmoid() if hasattr(self, "ssm_g_a") else out_gate.silu() + return self.ssm_out((core_attn_out * out_gate).reshape(B, 1, -1).cast(x.dtype)) + + # recurrent state can't be partially reused after divergence, force a full rebuild + def _state_reset_ops(self): + return [self.conv_state.assign(self.conv_state.const_like(0)), + self.recurrent_state.assign(self.recurrent_state.const_like(0))] if hasattr(self, "conv_state") else [] + def _reusable_prefix_len(self, prefix_len:int, cached_len:int) -> int: return 0 if prefix_len != cached_len else prefix_len + + def _init_state(self, x): + if not hasattr(self, "conv_state"): + self.conv_state = Tensor.zeros(x.shape[0], self.ssm_conv_kernel-1, self.conv_channels, device=x.device).clone() + self.recurrent_state = Tensor.zeros(x.shape[0], self.num_v_heads, self.head_v_dim, self.head_k_dim, device=x.device).clone() + +class Transformer: + def __init__(self, config:TransformerConfig): + dense_config = replace(config, num_experts=0, num_experts_per_tok=0, shared_expert_dim=0, hidden_dim=config.dense_hidden_dim or config.hidden_dim) + if config.ssm: config = replace(config, qk_norm=config.head_dim) + block_cls = MLATransformerBlock if config.kv_lora_rank > 0 else TransformerBlock + self.blk:list[FFNBlock] = [GatedDeltaNetBlock(dense_config if i < config.leading_dense_blocks else config, config.ssm) + if config.ssm and config.ssm_layers[i] else + block_cls(dense_config if i < config.leading_dense_blocks else config) for i in range(config.num_blocks)] + self.token_embd = nn.Embedding(config.vocab_size, config.dim) + self.output_norm = nn.RMSNorm(config.dim, config.norm_eps) + self.output = Linear(config.dim, config.vocab_size, bias=False) + self.max_context = config.max_context + self.has_recurrent_block = any(isinstance(b, GatedDeltaNetBlock) for b in self.blk) + self._cached_tokens: list[int] = [] + # we specialize the JIT for prefill and rollout + self.prefill_jit = TinyJit(self.forward) + self.rollout_jit = TinyJit(self.forward) + + def forward(self, tokens:Tensor, start_pos:int|UOp, temperature:Tensor) -> Tensor: + x = self.token_embd(tokens).float() # (B, T, D) + for block in self.blk: x = block(x, start_pos) + logits = self.output(self.output_norm(x))[:, -1, :] + # Gumbel-max trick: argmax(logits/temp - log(-log(uniform))) is equivalent to sampling from softmax(logits/temp) + return (logits / temperature.maximum(1e-12) - (Tensor.rand_like(logits).maximum(1e-12).log().neg()).log()).argmax(-1, keepdim=True) + + def __call__(self, tokens:Tensor, start_pos:int|UOp, temperature:Tensor) -> Tensor: + return (self.prefill_jit if resolve(tokens.shape[1] != 1) else self.rollout_jit)(tokens.contiguous(), start_pos, temperature) + + @staticmethod + def from_gguf(gguf:Tensor|str|pathlib.Path, max_context:int|None=None, + realize=bool(getenv("REALIZE", 0))) -> tuple[Transformer, dict]: + # TODO: remove the need for copy to default device + kv, state_dict = gguf_load(gguf.to(None).realize() if isinstance(gguf, Tensor) else gguf) + + # all state items should be float16, not float32 + state_dict = {k:v.cast('float16') if getenv("HALF", 1) else v for k,v in state_dict.items()} + + # some models like Llama 3.2 don't have an output.weight, they just tie to the token_embd.weight + if 'output.weight' not in state_dict: state_dict['output.weight'] = state_dict['token_embd.weight'] + + arch = kv['general.architecture'] + max_context = min(max_context, kv[f'{arch}.context_length']) if max_context is not None else kv[f'{arch}.context_length'] + n_heads, n_kv_heads = kv[f'{arch}.attention.head_count'], kv[f'{arch}.attention.head_count_kv'] + + ssm = None + ssm_layers: tuple[bool, ...] = () + if arch in ('qwen35', 'qwen35moe'): + ssm = SSMConfig(**{k: kv[f'{arch}.ssm.{k}'] for k in ('conv_kernel','state_size','group_count','time_step_rank','inner_size')}) + ssm_layers = tuple((i+1) % kv[f'{arch}.full_attention_interval'] != 0 for i in range(kv[f'{arch}.block_count'])) + elif arch == 'kimi-linear': + ssm_layers = tuple(x == 0 for x in n_kv_heads) + n_kv_heads = max(n_kv_heads) + ssm = SSMConfig(kv[f'{arch}.ssm.conv_kernel'], kv[f'{arch}.kda.head_dim'], n_heads, n_heads, n_heads*kv[f'{arch}.kda.head_dim'], kda=True) + for i, is_ssm in enumerate(ssm_layers): + if not is_ssm: continue + state_dict[f"blk.{i}.attn_qkv.weight"] = state_dict.pop(f"blk.{i}.attn_q.weight").cat( + state_dict.pop(f"blk.{i}.attn_k.weight"), state_dict.pop(f"blk.{i}.attn_v.weight"), dim=0).contiguous() + state_dict[f"blk.{i}.ssm_conv1d.weight"] = state_dict.pop(f"blk.{i}.ssm_conv1d_q.weight").cat( + state_dict.pop(f"blk.{i}.ssm_conv1d_k.weight"), state_dict.pop(f"blk.{i}.ssm_conv1d_v.weight"), dim=0).squeeze(1).contiguous() + state_dict[f"blk.{i}.ssm_out.weight"] = state_dict.pop(f"blk.{i}.attn_output.weight") + if arch in ('qwen35', 'qwen35moe', 'glm4moe'): + state_dict = {k.replace('post_attention_norm', 'ffn_norm'):v for k,v in state_dict.items()} + + kv_lora_rank = kv.get(f'{arch}.attention.kv_lora_rank', 0) + head_dim = kv.get(f'{arch}.attention.key_length_mla', kv.get(f'{arch}.attention.key_length', kv[f'{arch}.embedding_length'] // n_heads)) + rope_dim = kv.get(f'{arch}.rope.dimension_count', head_dim) + + # Permute RoPE weights from interleaved to half-split layout. + for name in state_dict: + if arch == 'kimi-linear': continue + if ('attn_q.weight' in name or 'attn_q_b.weight' in name) and (arch == 'llama' or kv_lora_rank): + w = state_dict[name].reshape(n_heads, state_dict[name].shape[0]//n_heads, -1) + prefix = head_dim-rope_dim + state_dict[name] = w[:, :prefix].cat(w[:, prefix:].rearrange("n (h two) d -> n (two h) d", two=2), dim=1).reshape(-1, w.shape[-1]) + elif arch == 'llama' and 'attn_k.weight' in name: + w = state_dict[name].reshape(n_kv_heads, state_dict[name].shape[0]//n_kv_heads, -1) + state_dict[name] = w.rearrange("n (h two) d -> n (two h) d", two=2).reshape(-1, w.shape[-1]) + elif kv_lora_rank and 'attn_kv_a_mqa.weight' in name: + state_dict[name] = state_dict[name][:kv_lora_rank].cat(state_dict[name][kv_lora_rank:].rearrange("(h two) d -> (two h) d", two=2), dim=0) + config = TransformerConfig( + num_blocks=kv[f'{arch}.block_count'] - kv.get(f'{arch}.nextn_predict_layers', 0), dim=kv[f'{arch}.embedding_length'], + hidden_dim=kv.get(f'{arch}.expert_feed_forward_length', kv.get(f'{arch}.feed_forward_length', 0)), + n_heads=n_heads, n_kv_heads=n_kv_heads, norm_eps=kv[f'{arch}.attention.layer_norm_rms_epsilon'], + vocab_size=len(kv['tokenizer.ggml.tokens']), + head_dim=head_dim, + rope_theta=kv[f'{arch}.rope.freq_base'], + rope_dim=rope_dim, + v_head_dim=kv.get(f'{arch}.attention.value_length_mla', kv.get(f'{arch}.attention.value_length', head_dim)), + max_context=max_context, + qk_norm=int(state_dict['blk.0.attn_q_norm.weight'].shape[0]) if 'blk.0.attn_q_norm.weight' in state_dict else 0, + num_experts=kv.get(f'{arch}.expert_count', 0), num_experts_per_tok=kv.get(f'{arch}.expert_used_count', 0), + norm_topk_prob=kv.get(f'{arch}.expert_weights_norm', arch in ('qwen3moe', 'qwen35moe', 'kimi-linear')), + kv_lora_rank=kv_lora_rank, q_lora_rank=kv.get(f'{arch}.attention.q_lora_rank', 0), + leading_dense_blocks=kv.get(f'{arch}.leading_dense_block_count', 0), + shared_expert_dim=kv.get( + f'{arch}.expert_shared_feed_forward_length', + kv.get(f'{arch}.expert_shared_count', 0) * kv.get(f'{arch}.expert_feed_forward_length', 0)), + shared_expert_gate=f"blk.{kv.get(f'{arch}.leading_dense_block_count', 0)}.ffn_gate_inp_shexp.weight" in state_dict, + dense_hidden_dim=kv.get(f'{arch}.feed_forward_length', 0) if kv.get(f'{arch}.leading_dense_block_count', 0) else 0, + routed_scaling_factor=kv.get(f'{arch}.expert_weights_scale', 1.0), attn_output_gate=arch in ('qwen35', 'qwen35moe'), ssm=ssm, + ssm_layers=ssm_layers, + qkv_bias='blk.0.attn_q.bias' in state_dict, + expert_bias=f"blk.{kv.get(f'{arch}.leading_dense_block_count', 0)}.exp_probs_b.bias" in state_dict) + model = Transformer(config) + nn.state.load_state_dict(model, state_dict, verbose=False, consume=True, realize=False) # NOTE: rope_freqs.weight (32,) is unused + # NOTE: without this contiguous, it unpacks the weights from the model every time. we shouldn't need this, but for now it's faster + if realize: + for s in (params:=nn.state.get_parameters(model)): s.replace(s.contiguous()) + Tensor.realize(*params) + return model, kv + + def warmup(self): + for _ in range(2): list(zip(range(2), self.generate([0]))) + + def get_start_pos(self, tokens:list[int]) -> int: + prefix_len = sum(1 for _ in itertools.takewhile(lambda ab: ab[0] == ab[1], zip(tokens[:-1], self._cached_tokens))) + return min(block._reusable_prefix_len(prefix_len, len(self._cached_tokens)) for block in self.blk) + + def generate(self, tokens:list[int], chunk_size:int=32, temperature:float=0.0): + if self.has_recurrent_block: chunk_size = 1 + v_start_pos = UOp.variable("start_pos", 0, self.max_context-1) + v_toks = UOp.variable("toks", 1, chunk_size) + # TODO: use UOp.variable for temperature once float variables are supported + temp = Tensor([temperature]) + # assign all input tokens once, then slice from start_pos for the model call + t = Tensor(tokens + [0] * (self.max_context - len(tokens)), dtype="int32").reshape(1, self.max_context) + # recompute start_pos from what's currently valid in the caches + start_pos = self.get_start_pos(tokens) + if start_pos < len(self._cached_tokens) and (resets := [r for b in self.blk for r in b._state_reset_ops()]): Tensor.realize(*resets) + out, prompt_len = None, len(tokens) + while len(tokens) < self.max_context: + n_toks = min(chunk_size, len(tokens) - start_pos) + sp, nt = v_start_pos.bind(start_pos), v_toks.bind(n_toks) + out = self(t[:, sp:sp+nt] if start_pos < prompt_len or out is None else out, sp, temp).realize() + start_pos += n_toks + # chunked prefill: keep processing until all prompt tokens are consumed + if start_pos < len(tokens): continue + tokens.append(int(out.item())) + self._cached_tokens = tokens[:-1] + yield tokens[-1] diff --git a/artifacts/package_runtime/tinygrad/llm/serve.py b/artifacts/package_runtime/tinygrad/llm/serve.py new file mode 100644 index 000000000..34e414548 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/llm/serve.py @@ -0,0 +1,167 @@ +from __future__ import annotations +import json, pathlib, re, time, typing, uuid +from typing import TYPE_CHECKING +from tinygrad.helpers import DEBUG, colored, stderr_log +from tinygrad.viz.serve import TCPServerWithReuse, HTTPRequestHandler +if TYPE_CHECKING: + from tinygrad.llm.cli import SimpleTokenizer + from tinygrad.llm.model import Transformer + +def parse_tool_call(s:str) -> tuple[str, typing.Any]|None: + s = s.strip() + if s.startswith("{"): # hermes JSON format: {"name": ..., "arguments": {...}} + try: + call = json.loads(s) + return call["name"], call.get("arguments", call.get("parameters", {})) + except (json.JSONDecodeError, KeyError): return None + # XML format: \n\nvalue\n... + if (fm := re.match(r"]+)>\s*(.*?)\s*(?:)?$", s, re.DOTALL)): + args = {} + for pm in re.finditer(r"]+)>(.*?)", fm.group(2), re.DOTALL): + value = re.sub(r"^\r?\n|\r?\n\Z", "", pm.group(2)) + try: args[pm.group(1)] = json.loads(value) + except json.JSONDecodeError: args[pm.group(1)] = value + return fm.group(1), args + return None + +def normalize_messages(messages:list[dict]) -> None: + # chat templates expect tool_call arguments as dicts (OpenAI clients send JSON strings) + for m in messages: + for tc in m.get("tool_calls") or []: + if "function" in tc and isinstance(args := tc["function"].get("arguments"), str): + try: tc["function"]["arguments"] = json.loads(args) + except json.JSONDecodeError: pass + +class StreamRouter: + # routes streamed output text to (field, text) deltas, keeping tool_call regions in .buf for the final parse + def __init__(self, reasoning:bool=False): + self.buf = "" + self.mode = "reasoning" if reasoning else "undecided" # output inside a think block is sent as reasoning_content + def split(self, tag:str, final:bool) -> tuple[str, bool]: + # split buf on the first full tag, holding back a partial tag at the end unless final + if tag in self.buf: + before, self.buf = self.buf.split(tag, 1) + return before, True + hold = max((i for i in range(1, min(len(self.buf), len(tag))+1) if tag.startswith(self.buf[-i:])), default=0) if not final else 0 + emit, self.buf = self.buf[:len(self.buf)-hold], self.buf[len(self.buf)-hold:] + return emit, False + def route(self, piece:str, final:bool=False) -> typing.Iterator[tuple[str, str]]: + self.buf += piece + if self.mode == "undecided": # decide whether the output starts with a think block + if not final and len(self.buf) < len("") and "".startswith(self.buf): return + self.mode, self.buf = ("reasoning", self.buf[len(""):]) if self.buf.startswith("") else ("content", self.buf) + if self.mode == "reasoning": + emit, done = self.split("", final) + if emit: yield "reasoning_content", emit + if not done: return + self.mode = "content" + if self.mode == "tool": return + emit, found = self.split("", final) + if emit: yield "content", emit + if found: self.mode, self.buf = "tool", "" + self.buf + +class Handler(HTTPRequestHandler): + server: LLMServer + def log_request(self, code='-', size='-'): pass + def do_GET(self): + if self.path == "/v1/models": self.send_data(json.dumps({"object":"list","data":[{"id":self.server.model_name,"object":"model"}]}).encode()) + else: self.send_data((pathlib.Path(__file__).parent / "chat.html").read_bytes(), content_type="text/html") + def run_model(self, ids:list[int], model_name:str, include_usage=False, max_tokens:int|None=None, temperature:float=0.0, + reasoning:bool=False): + model, tok = self.server.model, self.server.tok + prompt_tokens = len(ids) + cache_start_pos = model.get_start_pos(ids) + stderr_log(f"in:{colored(f'{cache_start_pos:5d}', 'green')} +{len(ids)-cache_start_pos:5d} {colored('--', 'BLACK')} ") + tmpl = {"id":f"chatcmpl-{uuid.uuid4().hex[:24]}", "object":"chat.completion.chunk", "created":int(time.time()), "model":model_name} + def chunk(d:dict): return {"choices": [{"index":0, "delta":d, "finish_reason":None}], **tmpl} + out: list[int] = [] + finish_reason = "stop" + st = pt = time.perf_counter() + dec = tok.stream_decoder() + router = StreamRouter(reasoning) + def log_stats(interrupted:bool=False): + et = time.perf_counter() + total = f"total:{et-st:6.2f}s" + stderr_log(f"gen:{len(out)/(et-pt) if len(out) > 1 else 0:4.0f} tok/s {colored('--', 'BLACK')} " + f"out:{len(out):5d} {colored('--', 'BLACK')} {colored(total, 'red') if interrupted else total}\n") + completed = False + try: + yield chunk({"role":"assistant", "content":""}) + for next_id in model.generate(ids, temperature=temperature): + if len(out) == 0: + stderr_log(f"prefill:{(prompt_tokens-cache_start_pos)/((pt:=time.perf_counter())-st):4.0f} tok/s {colored('--', 'BLACK')} ") + if tok.is_end(next_id): break + out.append(next_id) + for field, delta in router.route(dec(next_id)): yield chunk({field:delta}) + if max_tokens is not None and len(out) >= max_tokens: + finish_reason = "length" + break + for field, delta in router.route(dec(), final=True): yield chunk({field:delta}) + tool_calls: list[dict] = [] + for m in re.finditer(r"\s*(.*?)\s*(?:|$)", router.buf, re.DOTALL): + if (parsed := parse_tool_call(m.group(1))) is None: + stderr_log(f"failed to parse tool call: {m.group(1)[:200]}") + yield chunk({"content":m.group(0)}) # don't silently drop output the client can't use + else: + name, args = parsed + tool_calls.append({"index":len(tool_calls), "id":f"call_{uuid.uuid4().hex[:24]}", "type":"function", + "function":{"name":name, "arguments":args if isinstance(args, str) else json.dumps(args)}}) + if tool_calls: + yield chunk({"tool_calls":tool_calls}) + if finish_reason == "stop": finish_reason = "tool_calls" + completed = True + yield {"choices": [{"index":0, "delta":{},"finish_reason":finish_reason}], **tmpl} + if include_usage: + yield {"choices": [], "usage": {"prompt_tokens": prompt_tokens, "completion_tokens": len(out), + "total_tokens": prompt_tokens + len(out)}, **tmpl} + log_stats() + except GeneratorExit: + if not completed: log_stats(interrupted=True) + raise + + def do_POST(self): + request_st = time.perf_counter() + stderr_log(f"{self.path} {colored('--', 'BLACK')} ") + raw_body = self.rfile.read(int(self.headers.get("Content-Length", "0"))) + body: dict[str, typing.Any] = json.loads(raw_body.decode("utf-8")) + if DEBUG >= 1: print(json.dumps(body, indent=2)) + if self.path == "/v1/chat/completions": + # render and tokenize + normalize_messages(body["messages"]) + rendered = self.server.template.render(messages=body["messages"], tools=body.get("tools"), add_generation_prompt=True, preserve_thinking=True) + ids: list[int] = self.server.tok.encode(rendered) + stderr_log(f"prep:{(time.perf_counter()-request_st)*1e3:5.0f} ms {colored('--', 'BLACK')} ") + if len(ids) >= self.server.model.max_context: + stderr_log(f"{colored('context length exceeded', 'red')} in:{len(ids):5d} max:{self.server.model.max_context:5d}\n") + return self.send_data(json.dumps({"error":{"message":f"prompt has {len(ids)} tokens, but the model context is " + f"{self.server.model.max_context}", "type":"invalid_request_error", "param":"messages", "code":"context_length_exceeded"}}).encode(), + status_code=400) + + # reply + max_tokens = body.get("max_completion_tokens") or body.get("max_tokens") + chunks = self.run_model(ids, body["model"], not body.get("stream") or body.get("stream_options",{}).get("include_usage", False), + max_tokens=max_tokens, temperature=float(body.get("temperature", 0.0)), + reasoning=rendered.rstrip().endswith("")) + if body.get("stream"): self.stream_json(chunks) + else: + out, reasoning, tool_calls, finish_reason = [], [], [], "stop" + for c in chunks: + if not c["choices"]: continue + choice = c["choices"][0] + if (delta := choice.get("delta", {})): + if delta.get("content"): out.append(delta["content"]) + if delta.get("reasoning_content"): reasoning.append(delta["reasoning_content"]) + tool_calls += [{k:v for k, v in tc.items() if k != "index"} for tc in delta.get("tool_calls", [])] + if choice.get("finish_reason"): finish_reason = choice["finish_reason"] + message: dict[str, typing.Any] = {"role":"assistant", "content":"".join(out) or None} + if reasoning: message["reasoning_content"] = "".join(reasoning) + if tool_calls: message["tool_calls"] = tool_calls + self.send_data(json.dumps({**c, "object":"chat.completion", + "choices":[{"index":0, "message":message, "finish_reason":finish_reason}]}).encode()) + else: + raise RuntimeError(f"unhandled path {self.path}") + +class LLMServer(TCPServerWithReuse): + def __init__(self, server_address:tuple, model:Transformer, model_name:str, tok:SimpleTokenizer, template:typing.Any): + self.model, self.model_name, self.tok, self.template = model, model_name, tok, template + super().__init__(server_address, Handler) diff --git a/artifacts/package_runtime/tinygrad/mixin/__init__.py b/artifacts/package_runtime/tinygrad/mixin/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/mixin/creation.py b/artifacts/package_runtime/tinygrad/mixin/creation.py new file mode 100644 index 000000000..c290bceb2 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/mixin/creation.py @@ -0,0 +1,163 @@ +from typing import TYPE_CHECKING, Callable, Self +from tinygrad.dtype import ConstType, DType, DTypeLike, Invalid, dtypes, to_dtype +from tinygrad.helpers import argfix, prod +from tinygrad.mixin.dtype import DTypeMixin +from tinygrad.mixin.movement import MovementMixin + +if TYPE_CHECKING: + from tinygrad.uop.ops import sint, UOp + +class CreationMixin(DTypeMixin, MovementMixin): + @staticmethod + def const(b, dtype=None): raise NotImplementedError + + def const_like(self, b: ConstType, dtype:DType|None=None) -> Self: return self._wrap_uop(self._uop.const_like(b, dtype)) + + def _multi_like(self, fxn:'Callable[[tuple[sint, ...], str|None], Self]') -> Self: + from tinygrad.uop.ops import UOp + assert isinstance(self.device, tuple), f"_multi_like needs a multi device tensor, got {self.device}" + if self._uop.axis is None: return self._wrap_uop(fxn(self.shape, None)._uop.shard(self.device, None)) + return self._wrap_uop(UOp.mstack(*[fxn(self._uop.shard_shape, d)._uop for d in self.device]).unshard(self._uop.axis)) + + @classmethod + def empty(cls, *shape, device:str|tuple[str, ...]|None=None, dtype:DTypeLike|None=None) -> Self: + """ + Creates an empty tensor with the given shape. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.empty(2, 3) + print(t.shape) + ``` + """ + from tinygrad.uop.ops import UOp, to_max_shape + from tinygrad.device import canonicalize_device + dt = to_dtype(dtype) if dtype is not None else dtypes.default_float + new_shape = argfix(*shape) + max_shape = to_max_shape(new_shape) + u = UOp.new_buffer(canonicalize_device(device), prod(max_shape), dt).reshape(max_shape).shrink_to(new_shape) + return cls._wrap_uop(u) + + def empty_like(self, dtype: DTypeLike|None=None, device: str|tuple[str, ...]|None=None) -> Self: + """ + Creates an empty tensor with the same shape as `self`. + If `dtype` is not specified, the dtype of `self` is used. + """ + return self._wrap_uop(self._uop.empty_like(dtype, device)) + + @classmethod + def invalids(cls, *shape, device:str|tuple[str, ...]|None=None, dtype:DTypeLike|None=None) -> Self: + """ + Creates a tensor with the given shape, filled with Invalid. + + This is an alternative to Tensor.empty when you want an "anonymous" buffer. + + Eventually Tensor.empty will be replaced by this. + """ + return cls.full(argfix(*shape), Invalid, dtype=dtype, device=device) + + @classmethod + def full(cls, shape:'tuple[sint, ...]', fill_value:'ConstType|UOp', dtype:DTypeLike|None=None, + device:str|tuple[str, ...]|None=None, buffer=True) -> Self: + """ + Creates a tensor with the given shape, filled with the given value. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Pass `buffer=False` to get a broadcast const value instead of a materialized buffer. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.full((2, 3), 42).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.full((2, 3), False).numpy()) + ``` + """ + # TODO: enable this check + # if not buffer: assert device is None, "buffer=False does not support device specification" + from tinygrad.uop.ops import UOp + new_shape = argfix(shape) + dt = to_dtype(dtype) if dtype is not None else fill_value.dtype if isinstance(fill_value, UOp) else dtypes.from_py(fill_value) + val = cls.const(fill_value, dt) + val = val.reshape((1,)*len(new_shape)).expand(new_shape) + if not buffer: return val + ret = val.empty_like(dt if dtype is not None else None, device) + return cls._wrap_uop(ret._uop.after(ret._uop.store(val._uop))) + + def full_like(self, fill_value:ConstType, dtype:DTypeLike|None=None, device:str|tuple[str, ...]|None=None, buffer=True) -> Self: + """ + Creates a tensor with the same shape as `self`, filled with the given value. + If `dtype` is not specified, the dtype of `self` is used. + + You can pass in the `device` keyword argument to control device of the tensor. + Pass `buffer=False` to get a broadcast const value instead of a materialized buffer. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.ones(2, 3) + print(Tensor.full_like(t, 42).numpy()) + ``` + """ + if isinstance(self.device, tuple): + if device is not None: raise RuntimeError("cannot specify `device` on `*_like` of a multi device tensor") + return self._multi_like(lambda shape, dev: type(self).full(shape, fill_value, dtype=dtype or self.dtype, device=dev, buffer=buffer)) + return type(self).full(self.shape, fill_value, dtype=dtype or self.dtype, device=self.device if device is None else device, buffer=buffer) + + @classmethod + def zeros(cls, *shape, **kwargs) -> Self: + """ + Creates a tensor with the given shape, filled with zeros. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.zeros(2, 3).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.zeros(2, 3, dtype=dtypes.int32).numpy()) + ``` + """ + return cls.full(argfix(*shape), 0.0, **kwargs) + + def zeros_like(self, **kwargs) -> Self: + """ + Creates a tensor with the same shape as `self`, filled with zeros. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.ones(2, 3) + print(Tensor.zeros_like(t).numpy()) + ``` + """ + return self.full_like(0, **kwargs) + + @classmethod + def ones(cls, *shape, **kwargs) -> Self: + """ + Creates a tensor with the given shape, filled with ones. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.ones(2, 3).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.ones(2, 3, dtype=dtypes.int32).numpy()) + ``` + """ + return cls.full(argfix(*shape), 1.0, **kwargs) + + def ones_like(self, **kwargs) -> Self: + """ + Creates a tensor with the same shape as `self`, filled with ones. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.zeros(2, 3) + print(Tensor.ones_like(t).numpy()) + ``` + """ + return self.full_like(1, **kwargs) diff --git a/artifacts/package_runtime/tinygrad/mixin/dtype.py b/artifacts/package_runtime/tinygrad/mixin/dtype.py new file mode 100644 index 000000000..b46bac675 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/mixin/dtype.py @@ -0,0 +1,139 @@ +from typing import TYPE_CHECKING, Self +from tinygrad.dtype import DType, DTypeLike, dtypes, to_dtype +from tinygrad.uop import Ops + +if TYPE_CHECKING: + from tinygrad.uop.ops import UOp + +class DTypeMixin: + @property + def dtype(self) -> DType: raise NotImplementedError + @property + def _uop(self) -> 'UOp': raise NotImplementedError + @classmethod + def _wrap_uop(cls, u:'UOp') -> Self: raise NotImplementedError + + def cast(self, dtype:DTypeLike) -> Self: + """ + Casts `self` to the given `dtype`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([-1, 2.5, 3], dtype=dtypes.float) + print(t.dtype, t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.cast(dtypes.int32) + print(t.dtype, t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.cast(dtypes.uint8) + print(t.dtype, t.numpy()) + ``` + """ + return self if self.dtype == (dt:=to_dtype(dtype)) else self._wrap_uop(self._uop.alu(Ops.CAST, arg=dt)) + + def bitcast(self, dtype:DTypeLike) -> Self: + """ + Bitcasts `self` to the given `dtype`. If the itemsize differs, the last axis is rescaled. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([-1, 2, 3], dtype=dtypes.int32) + print(t.dtype, t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.bitcast(dtypes.uint32) + print(t.dtype, t.numpy()) + ``` + """ + dt = to_dtype(dtype) + if self.dtype in dtypes.weaks or dt in dtypes.weaks: raise RuntimeError(f"bitcast requires concrete dtypes, got {self.dtype} -> {dt}") + return self if self.dtype == dt else self._wrap_uop(self._uop.alu(Ops.BITCAST, arg=dt)) + + def element_size(self) -> int: + """ + Returns the size in bytes of an individual element in the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([5], dtype=dtypes.int16) + print(t.element_size()) + ``` + """ + if self.dtype in dtypes.weaks: raise RuntimeError(f"element_size requires a concrete dtype, got {self.dtype}") + return self.dtype.itemsize + + def is_floating_point(self) -> bool: + """ + Returns `True` if the tensor contains floating point types, i.e. is one of `dtypes.float64`, `dtypes.float32`, + `dtypes.float16`, `dtypes.bfloat16`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([8, 9], dtype=dtypes.float32) + print(t.is_floating_point()) + ``` + """ + return dtypes.is_float(self.dtype) + + def float(self) -> Self: + """ + Convenience method to cast `self` to a `float32` Tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([-1, 2, 3], dtype=dtypes.int32) + print(t.dtype, t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.float() + print(t.dtype, t.numpy()) + ``` + """ + return self.cast(dtypes.float32) + + def half(self) -> Self: + """ + Convenience method to cast `self` to a `float16` Tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([-1, 2, 3], dtype=dtypes.int32) + print(t.dtype, t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.half() + print(t.dtype, t.numpy()) + ``` + """ + return self.cast(dtypes.float16) + + def int(self) -> Self: + """ + Convenience method to cast `self` to a `int32` Tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([-1.5, -0.5, 0.0, 0.5, 1.5]) + print(t.dtype, t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.int() + print(t.dtype, t.numpy()) + ``` + """ + return self.cast(dtypes.int32) + + def bool(self) -> Self: + """ + Convenience method to cast `self` to a `bool` Tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([-1, 0, 1]) + print(t.dtype, t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.bool() + print(t.dtype, t.numpy()) + ``` + """ + return self.cast(dtypes.bool) + + def bfloat16(self) -> Self: return self.cast(dtypes.bfloat16) + def double(self) -> Self: return self.cast(dtypes.double) + def long(self) -> Self: return self.cast(dtypes.long) + def short(self) -> Self: return self.cast(dtypes.short) diff --git a/artifacts/package_runtime/tinygrad/mixin/elementwise.py b/artifacts/package_runtime/tinygrad/mixin/elementwise.py new file mode 100644 index 000000000..aa746bb45 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/mixin/elementwise.py @@ -0,0 +1,1087 @@ +import math, functools, operator +from typing import TYPE_CHECKING, Literal, Self +from tinygrad.uop import Ops +from tinygrad.dtype import dtypes, ConstType, PyConst, least_upper_dtype, least_upper_float, weak_dtype +from tinygrad.helpers import argfix, polyN +from tinygrad.mixin.creation import CreationMixin + +if TYPE_CHECKING: + from tinygrad.uop.ops import UOp, sint + + +class ElementwiseMixin(CreationMixin): + # required to implement + def alu(self, op: Ops, *src: Self) -> Self: + raise NotImplementedError + + # great functions you get! + def ufix(self, x: 'Self|ConstType|UOp') -> Self: + return x if isinstance(x, type(self)) else self._wrap_uop(self._uop.ufix(x)) + + def _broadcasted(self, y: 'Self|ConstType|UOp', reverse: bool = False) -> tuple[Self, Self]: + y = self.ufix(y) + x, y = (self, y) if not reverse else (y, self) + out_dtype = least_upper_dtype(x.dtype, y.dtype) + # keep weak CONST weak, might lift weakint -> weakfloat + def promote(t): + if t._uop.base.is_invalid: return t # invalid bool is weak const + if t.dtype in dtypes.weaks and t._uop.base.op is Ops.CONST: return t._wrap_uop(t._uop.const_like(t._uop.base.val, weak_dtype(out_dtype))) + return t.cast(out_dtype) + return promote(x), promote(y) + + def _binop(self, op: Ops, x: Self | ConstType, reverse: bool) -> Self: + lhs, rhs = self._broadcasted(x, reverse) + return lhs.alu(op, rhs) + + def usum(self, *uops) -> Self: return functools.reduce(operator.or_ if self.dtype is dtypes.bool else operator.add, argfix(*uops), self) + def uprod(self, *uops) -> Self: return functools.reduce(operator.and_ if self.dtype is dtypes.bool else operator.mul, argfix(*uops), self) + + def detach(self) -> Self: + """ + Returns a new tensor with the same data as this tensor, but detached from the autograd graph. + """ + return self.alu(Ops.DETACH) + + def logical_not(self) -> Self: + """ + Computes the logical NOT of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([False, True]).logical_not().numpy()) + ``` + """ + return self.cast(dtypes.bool).ne(True) + + def contiguous(self, **kwargs) -> Self: + """ + Returns a contiguous tensor. + """ + if self.dtype in dtypes.weaks: return self + uop = self._uop + if uop.op is Ops.CONTIGUOUS or self.device is None or uop.has_buffer_identity(): return self._wrap_uop(uop) + return self._wrap_uop(uop.alu(Ops.CONTIGUOUS, **kwargs)) + + def contiguous_backward(self) -> Self: + """ + Inserts a contiguous operation in the backward pass. + """ + return self.alu(Ops.CONTIGUOUS_BACKWARD) + + def neg(self) -> Self: + """ + Negates the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).neg().numpy()) + ``` + """ + return self.logical_not() if self.dtype == dtypes.bool else self * (-1) + + def add(self, x: Self | ConstType, reverse: bool = False) -> Self: + """ + Adds `self` and `x`. + Equivalent to `self + x`. + Supports broadcasting to a common shape, type promotion, and integer, float, boolean inputs. + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.add(20).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.add(Tensor([[2.0], [3.5]])).numpy()) + ``` + """ + return self._binop(Ops.ADD, x, reverse) + + def sub(self, x: Self | ConstType, reverse: bool = False) -> Self: + """ + Subtracts `x` from `self`. + Equivalent to `self - x`. + Supports broadcasting to a common shape, type promotion, and integer, float, boolean inputs. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.sub(20).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.sub(Tensor([[2.0], [3.5]])).numpy()) + ``` + """ + a, b = self._broadcasted(x, reverse) + return a + (-b) + + def mul(self, x: Self | ConstType, reverse: bool = False) -> Self: + """ + Multiplies `self` and `x`. + Equivalent to `self * x`. + Supports broadcasting to a common shape, type promotion, and integer, float, boolean inputs. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.mul(3).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.mul(Tensor([[-1.0], [2.0]])).numpy()) + ``` + """ + return self._binop(Ops.MUL, x, reverse) + + def bitwise_not(self) -> Self: + """ + Computes the bitwise NOT of `self`. + Equivalent to `~self`. + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([0, 2, 5, 255], dtype="int8").bitwise_not().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([True, False]).bitwise_not().numpy()) + ``` + """ + if self.dtype == dtypes.bool: return self.logical_not() + return (self ^ self.dtype.max) if dtypes.is_unsigned(self.dtype) else (self ^ -1) + + def bitwise_and(self, x: Self | ConstType, reverse: bool = False) -> Self: + """ + Computes the bitwise AND of `self` and `x`. + Equivalent to `self & x`. + Supports broadcasting to a common shape, type promotion, and integer, boolean inputs. + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([2, 5, 255]).bitwise_and(Tensor([3, 14, 16])).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([True, True, False, False]).bitwise_and(Tensor([True, False, True, False])).numpy()) + ``` + """ + return self._binop(Ops.AND, x, reverse) + + def bitwise_or(self, x: Self | ConstType, reverse: bool = False) -> Self: + """ + Computes the bitwise OR of `self` and `x`. + Equivalent to `self | x`. + Supports broadcasting to a common shape, type promotion, and integer, boolean inputs. + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([2, 5, 255]).bitwise_or(Tensor([4, 4, 4])).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([True, True, False, False]).bitwise_or(Tensor([True, False, True, False])).numpy()) + ``` + """ + return self._binop(Ops.OR, x, reverse) + + def bitwise_xor(self, x: Self | ConstType, reverse: bool = False) -> Self: + """ + Computes bitwise xor of `self` and `x`. + Equivalent to `self ^ x`. + Supports broadcasting to a common shape, type promotion, and integer, boolean inputs. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1, -2, 3]).bitwise_xor(Tensor([1, 0, 3])).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([True, True, False, False]).bitwise_xor(Tensor([True, False, True, False])).numpy()) + ``` + """ + return self._binop(Ops.XOR, x, reverse) + + def mod(self, x: Self | ConstType, reverse: bool = False) -> Self: + """ + Mod `self` by `x`. + Equivalent to `self % x`. + Supports broadcasting to a common shape, type promotion, and integer inputs. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-4, 7, 5, 4, -7, 8]).mod(Tensor([2, -3, 8, -2, 3, 5])).numpy()) + ``` + """ + a, b = self._broadcasted(x, reverse) + if dtypes.is_int(a.dtype) and dtypes.is_int(b.dtype): return a.alu(Ops.FLOORMOD, b) + return a - a.div(b, rounding_mode="floor") * b + + def fmod(self, x: Self | ConstType) -> Self: + """ + C-style remainder of `self` divided by `x` (sign follows the dividend), using truncating division. + Differs from `mod`/`%`, which uses Python floor remainder. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-4, 7, 5, 4, -7, 8]).fmod(Tensor([2, -3, 8, -2, 3, 5])).numpy()) + ``` + """ + a, b = self._broadcasted(x) + if dtypes.is_int(a.dtype) and dtypes.is_int(b.dtype): return a.alu(Ops.CMOD, b) + return a - a.div(b, rounding_mode="trunc") * b + + def div(self, x: Self | ConstType, reverse: bool = False, rounding_mode: Literal["trunc", "floor"] | None = None) -> Self: + """ + Divides `self` by `x`. + Equivalent to `self / x`. + Supports broadcasting to a common shape, type promotion, and integer, float, boolean inputs. + `div` performs true division by default; pass `rounding_mode="trunc"` for truncating toward zero + or `rounding_mode="floor"` for floor division. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.div(3).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1, 4, 10]).div(Tensor([2, 3, 4])).numpy()) + ``` + """ + a, b = self._broadcasted(x, reverse) + if dtypes.is_int(a.dtype) and dtypes.is_int(b.dtype): + if rounding_mode == "trunc": return a.alu(Ops.CDIV, b) + if rounding_mode == "floor": return a.alu(Ops.FLOORDIV, b) + a = a.cast(dtypes.default_float) + d = a * b.reciprocal() + if rounding_mode is None: return d + if rounding_mode == "trunc": return d.trunc() + if rounding_mode == "floor": return d.floor() + raise RuntimeError(f"{rounding_mode=} is not supported") + + def __neg__(self) -> Self: + return self.neg() + + def __invert__(self) -> Self: + return self.bitwise_not() + + def __add__(self, x: Self | ConstType) -> Self: + return self.add(x) + + def __sub__(self, x: Self | ConstType) -> Self: + return self.sub(x) + + def __mul__(self, x: Self | ConstType) -> Self: + return self.mul(x) + + def __truediv__(self, x: Self | ConstType) -> Self: + return self.div(x) + + def __floordiv__(self, x: Self | ConstType) -> Self: + return self.div(x, rounding_mode="floor") + + def __mod__(self, x: Self | ConstType) -> Self: + return self.mod(x) + + def __and__(self, x: Self | ConstType) -> Self: + return self.bitwise_and(x) + + def __or__(self, x: Self | ConstType) -> Self: + return self.bitwise_or(x) + + def __xor__(self, x: Self | ConstType) -> Self: + return self.bitwise_xor(x) + + def __radd__(self, x: Self | ConstType) -> Self: + return self.add(x, True) + + def __rsub__(self, x: Self | ConstType) -> Self: + return self.sub(x, True) + + def __rmul__(self, x: Self | ConstType) -> Self: + return self.mul(x, True) + + def __rtruediv__(self, x: Self | ConstType) -> Self: + return self.div(x, True) + + def __rfloordiv__(self, x: Self | ConstType) -> Self: + return self.div(x, reverse=True, rounding_mode="floor") + + def __rand__(self, x: Self | ConstType) -> Self: + return self.bitwise_and(x, True) + + def __ror__(self, x: Self | ConstType) -> Self: + return self.bitwise_or(x, True) + + def __rxor__(self, x: Self | ConstType) -> Self: + return self.bitwise_xor(x, True) + + def __rmod__(self, x: Self | ConstType) -> Self: + return self.mod(x, True) + + def __lt__(self, x: Self | ConstType) -> Self: + return self._binop(Ops.CMPLT, x, False) + + def __gt__(self, x: Self | ConstType) -> Self: + return self._binop(Ops.CMPLT, x, True) + + def __ge__(self, x: Self | ConstType) -> Self: + return (self < x).logical_not() + + def __le__(self, x: Self | ConstType) -> Self: + return (self > x).logical_not() + + def ne(self, x: Self | ConstType) -> Self: + return self._binop(Ops.CMPNE, x, False) + + def eq(self, x: Self | ConstType) -> Self: + return self.ne(x).logical_not() + + def __ne__(self, x: Self | ConstType) -> Self: # type: ignore[override] + return self.ne(x) + + # NOTE: __eq__ isn't overridden, and means the same thing as is by default + + def lshift(self, x: Self | int, reverse: bool = False) -> Self: + """ + Computes left arithmetic shift of `self` by `x` bits. `self` must have integer dtype. + Equivalent to `self << x`. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1, 3, 31], dtype=dtypes.uint8).lshift(2).numpy()) + ``` + """ + return self._binop(Ops.SHL, x, reverse) + + def rshift(self, x: Self | int, reverse: bool = False) -> Self: + """ + Computes right arithmetic shift of `self` by `x` bits. `self` must have integer dtype. + Equivalent to `self >> x`. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([4, 13, 125], dtype=dtypes.uint8).rshift(2).numpy()) + ``` + """ + return self._binop(Ops.SHR, x, reverse) + + def __lshift__(self, x: Self | int) -> Self: + return self.lshift(x) + + def __rshift__(self, x: Self | int) -> Self: + return self.rshift(x) + + def __rlshift__(self, x: Self | int) -> Self: + return self.lshift(x, True) + + def __rrshift__(self, x: Self | int) -> Self: + return self.rshift(x, True) + + def maximum(self, x: Self | ConstType) -> Self: + """ + Computes element-wise maximum of `self` and `x`. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1, 2, 3]).maximum(1).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1, 2, 3]).maximum(Tensor([-4, -2, 9])).numpy()) + ``` + """ + return self._binop(Ops.MAX, x, False) + + def _inverse(self) -> Self: return -self if self.is_floating_point() else ~self + + def minimum(self, x: Self | ConstType) -> Self: + """ + Computes element-wise minimum of `self` and `x`. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1, 2, 3]).minimum(1).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1, 2, 3]).minimum(Tensor([-4, -2, 9])).numpy()) + ``` + """ + t, x = self._broadcasted(x) + # NOTE: the int inverse is done in python, since const has weak dtype without width + # TODO: clean this up once _broadcasted does not promote dtype + if dtypes.is_float(dt:=least_upper_dtype(t.dtype, x.dtype)): return -(-t).alu(Ops.MAX, -x) + return (t ^ (k:=dt.const(dt.min+dt.max))).alu(Ops.MAX, x ^ k) ^ k + + def copysign(self, other: Self | ConstType) -> Self: + """ + Returns a tensor of with the magnitude of `self` and the sign of `other`, elementwise. + """ + # NOTE: torch always return in float, we return based on the broadcasting rule. + a, b = self._broadcasted(other) + return ((b < 0) | (b.reciprocal() < 0)).where(-(mag := a.abs()), mag) + + def logaddexp(self, other: Self | ConstType) -> Self: + """ + Calculates (self.exp()+other.exp()).log(), elementwise. + """ + a, b = self._broadcasted(other) + m = a.maximum(b) + return ((a-m).exp() + (b-m).exp()).log() + m + + def where(self, x: 'Self | ConstType | sint', y: 'Self | ConstType | sint') -> Self: + """ + Returns a tensor of elements selected from either `x` or `y`, depending on `self`. + `output_i = x_i if self_i else y_i`. + + ```python exec="true" source="above" session="tensor" result="python" + cond = Tensor([[True, True, False], [True, False, False]]) + print(cond.where(1, 3).numpy()) + ``` + """ + ref = x if isinstance(x, type(self)) else y if isinstance(y, type(self)) else self + x, y = ref.ufix(x)._broadcasted(y) + return self.alu(Ops.WHERE, x, y) + + def masked_fill(self, mask:Self, value:Self|PyConst) -> Self: + """ + Replaces `self` with `value` wherever the elements of `mask` are True. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3, 4, 5]) + mask = Tensor([True, False, True, False, False]) + print(t.masked_fill(mask, -12).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3, 4, 5]) + mask = Tensor([True, False, True, False, False]) + value = Tensor([-1, -2, -3, -4, -5]) + print(t.masked_fill(mask, value).numpy()) + ``` + """ + return mask.where(value, self) + + def threefry(self, seed: Self) -> Self: + return self.alu(Ops.THREEFRY, seed) + + def reciprocal(self) -> Self: + """ + Computes `1/x` element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1., 2., 3., 4.]).reciprocal().numpy()) + ``` + """ + return self.alu(Ops.RECIPROCAL) + + def trunc(self) -> Self: + """ + Truncates the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5]).trunc().numpy()) + ``` + """ + return self.alu(Ops.TRUNC) + + def sqrt(self) -> Self: + """ + Computes the square root of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1., 2., 3., 4.]).sqrt().numpy()) + ``` + """ + return self.alu(Ops.SQRT) + + def sin(self) -> Self: + """ + Computes the sine of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([0., math.pi/2, math.pi, 3*math.pi/2, 2*math.pi]).sin().numpy()) + ``` + """ + return self.alu(Ops.SIN) + + def cos(self) -> Self: + """ + Computes the cosine of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([0., math.pi/2, math.pi, 3*math.pi/2, 2*math.pi]).cos().numpy()) + ``` + """ + self = self.cast(least_upper_float(self.dtype)) + return ((math.pi/2)-self.cast(least_upper_dtype(self.dtype, dtypes.float32))).sin().cast(self.dtype) + + def exp(self) -> Self: + """ + Computes the exponential function element-wise. + + See: https://en.wikipedia.org/wiki/Exponential_function + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([0., 1., 2., 3.]).exp().numpy()) + ``` + """ + self = self.cast(least_upper_float(self.dtype)) + return self.cast(least_upper_dtype(self.dtype, dtypes.float32)).mul(1/math.log(2)).exp2().cast(self.dtype) + + def log2(self) -> Self: + """ + Computes the base-2 logarithm element-wise. + + See: https://en.wikipedia.org/wiki/Logarithm + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1., 2., 4., 8.]).log2().numpy()) + ``` + """ + return self.alu(Ops.LOG2) + + def exp2(self) -> Self: + """ + Computes the base-2 exponential function element-wise. + + See: https://en.wikipedia.org/wiki/Exponential_function + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([0., 1., 2., 3.]).exp2().numpy()) + ``` + """ + return self.alu(Ops.EXP2) + + def pow(self, x: Self | ConstType, reverse: bool = False) -> Self: + """ + Computes power of `self` with `x`. + Equivalent to `self ** x`. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1, 2, 3]).pow(2.0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1, 2, 3]).pow(Tensor([-1.5, 0.5, 1.5])).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print((2.0 ** Tensor([-1, 2, 3])).numpy()) + ``` + """ + base, exponent = self._broadcasted(x, reverse=reverse) + # TODO: int pow + if not dtypes.is_float(least_upper_dtype(base.dtype, exponent.dtype)) and isinstance(x, ConstType) and not (isinstance(x, int) and x >= 0): + raise RuntimeError("base needs to be float") + return base.alu(Ops.POW, exponent) + + def __pow__(self, x: Self | ConstType) -> Self: + return self.pow(x) + + def __rpow__(self, x: Self | ConstType) -> Self: + return self.pow(x, True) + + def square(self) -> Self: + """ + Squares the tensor element-wise. + Equivalent to `self*self`. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).square().numpy()) + ``` + """ + return self * self + + def clamp(self, min_=None, max_=None) -> Self: + """ + Clips (clamps) the values in the tensor between `min_` and `max_` element-wise. + If `min_` is `None`, there is no lower bound. If `max_` is None, there is no upper bound. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).clip(-1, 1).numpy()) + ``` + """ + if min_ is None and max_ is None: raise RuntimeError("at least one of 'min_' or 'max_' must not be None") + ret = (self < min_).where(min_, self) if min_ is not None else self + return (ret > max_).where(max_, ret) if max_ is not None else ret + + def clip(self, min_=None, max_=None) -> Self: + """Alias for `Tensor.clamp`.""" + return self.clamp(min_, max_) + + def isnan(self) -> Self: + """ + Checks the tensor element-wise to return True where the element is NaN, otherwise returns False + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1, float('inf'), 2, float('-inf'), float('nan')]).isnan().numpy()) + ``` + """ + return self != self + + def isinf(self, detect_positive: bool = True, detect_negative: bool = True) -> Self: + """ + Checks the tensor element-wise to return True where the element is infinity, otherwise returns False + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1, float('inf'), 2, float('-inf'), float('nan')]).isinf().numpy()) + ``` + """ + return self.eq(float("inf")) * detect_positive + self.eq(float("-inf")) * detect_negative + + def isfinite(self) -> Self: + """ + Checks the tensor element-wise to return True where the element is finite, otherwise returns False + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1, float('inf'), 2, float('-inf'), float('nan')]).isfinite().numpy()) + ``` + """ + return (self.isinf() | self.isnan()).logical_not() + + def isclose(self, other, rtol:float=1e-05, atol:float=1e-08, equal_nan=False) -> Self: + """ + Returns a new tensor with element-wise comparison of closeness to `other` within a tolerance. + + The `rtol` and `atol` keyword arguments control the relative and absolute tolerance of the comparison. + + By default, two `NaN` values are not close to each other. If `equal_nan` is `True`, two `NaN` values are considered close. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1e-7, 1e-8, 1e-9, float('nan')]).isclose(Tensor([0.0, 0.0, 0.0, float('nan')])).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([float('nan')]).isclose(Tensor([float('nan')]), equal_nan=True).numpy()) + ``` + """ + other = self.ufix(other) + is_finite_close = self.isfinite() & other.isfinite() & ((self - other).abs() <= atol + rtol * other.abs()) + is_infinite_close = (self.isinf() | other.isinf()) & self.eq(other) + is_nan_close = (self.isnan() & other.isnan()) & equal_nan + return is_finite_close | is_infinite_close | is_nan_close + + def ceil(self) -> Self: + """ + Rounds the tensor element-wise towards positive infinity. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5]).ceil().numpy()) + ``` + """ + return (self > (b := self.trunc())).where(b+1, b) + + def floor(self) -> Self: + """ + Rounds the tensor element-wise towards negative infinity. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5]).floor().numpy()) + ``` + """ + return (self < (b := self.trunc())).where(b-1, b) + + def relu(self) -> Self: + """ + Applies the Rectified Linear Unit (ReLU) function element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).relu().numpy()) + ``` + """ + # NOTE: if you write this as self.maximum(0) the gradient is wrong, passing through half when self is 0 + return (self > 0).where(self, 0) + + def sigmoid(self) -> Self: + """ + Applies the Sigmoid function element-wise. + + - Described: https://en.wikipedia.org/wiki/Sigmoid_function + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).sigmoid().numpy()) + ``` + """ + return (1 + (self * (-1/math.log(2))).exp2()).reciprocal() + + def relu6(self) -> Self: + """ + Applies the ReLU6 function element-wise. + + - Paper: https://arxiv.org/abs/1704.04861v1 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-9., -6., -3., 0., 3., 6., 9.]).relu6().numpy()) + ``` + """ + return self.relu() - (self-6).relu() + + def hardswish(self) -> Self: + """ + Applies the Hardswish function element-wise. + + - Paper: https://arxiv.org/abs/1905.02244v5 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).hardswish().numpy()) + ``` + """ + return self * (self+3).relu6() * (1/6) + + def hardsigmoid(self, alpha: float = 1/6, beta: float = 0.5) -> Self: + """ + Applies the Hardsigmoid function element-wise. + NOTE: default `alpha` and `beta` values are taken from torch + + - See: https://pytorch.org/docs/stable/generated/torch.nn.functional.hardsigmoid.html + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).hardsigmoid().numpy()) + ``` + """ + return (alpha * self + beta).relu() - (alpha * self + beta - 1).relu() + + def hardtanh(self, min_val=-1, max_val=1) -> Self: + """ + Applies the Hardtanh function element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1.5, -1.0, -0.5, 0., 0.5, 1.0, 1.5]).hardtanh().numpy()) + ``` + """ + return self.clip(min_val, max_val) + + def leaky_relu(self, neg_slope=0.01) -> Self: + """ + Applies the Leaky ReLU function element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).leaky_relu().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).leaky_relu(neg_slope=0.42).numpy()) + ``` + """ + return (self < 0).where(neg_slope*self, self) + + def tanh(self) -> Self: + """ + Applies the Hyperbolic Tangent (tanh) function element-wise. + + - Described: https://en.wikipedia.org/wiki/Hyperbolic_functions#Tanh + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).tanh().numpy()) + ``` + """ + return 2.0 * ((2.0 * self).sigmoid()) - 1.0 + + def quick_gelu(self) -> Self: + """ + Applies the Sigmoid GELU approximation element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).quick_gelu().numpy()) + ``` + """ + return self * (self * 1.702).sigmoid() + + def gelu(self, approximate:str="tanh") -> Self: + """ + Applies the Gaussian Error Linear Unit (GELU) function element-wise. + + - Paper: https://arxiv.org/abs/1606.08415v5 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).gelu().numpy()) + ``` + """ + if approximate == "tanh": + return 0.5 * self * (1 + (math.sqrt(2 / math.pi) * (self + 0.044715 * self ** 3)).tanh()) + elif approximate == "none": + return self * 0.5 * (1.0 + (self / math.sqrt(2)).erf()) + else: + raise RuntimeError(f"{approximate=} is not supported") + + def swish(self) -> Self: + """ + See `.silu()` + + - Paper: https://arxiv.org/abs/1710.05941v1 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).swish().numpy()) + ``` + """ + return self * self.sigmoid() + + def silu(self) -> Self: + """ + Applies the Sigmoid Linear Unit (SiLU) function element-wise. + + - Paper: https://arxiv.org/abs/1606.08415 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).silu().numpy()) + ``` + """ + return self.swish() # The SiLU function is also known as the swish function. + + def rsqrt(self) -> Self: + """ + Computes the reciprocal of the square root of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1., 2., 3., 4.]).rsqrt().numpy()) + ``` + """ + return self.sqrt().reciprocal() + + def log(self) -> Self: + """ + Computes the natural logarithm element-wise. + + See: https://en.wikipedia.org/wiki/Logarithm + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1., 2., 4., 8.]).log().numpy()) + ``` + """ + return self.log2()*math.log(2) + + def log10(self) -> Self: + """ + Computes the base-10 logarithm element-wise. + + See: https://en.wikipedia.org/wiki/Logarithm + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1., 2., 4., 8.]).log10().numpy()) + ``` + """ + return self.log2()*math.log10(2) + + def atanh(self) -> Self: + """ + Applies the Inverse Hyperbolic Tangent (atanh) function element-wise. + + - Described: https://en.wikipedia.org/wiki/Inverse_hyperbolic_functions#atanh + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-0.9, -0.6, -0.3, 0., 0.3, 0.6, 0.9]).atanh().numpy()) + ``` + """ + return ((1 + self)/(1 - self)).log() / 2 + + def asinh(self) -> Self: + """ + Applies the Inverse Hyperbolic Sine (asinh) function element-wise. + + - Described: https://en.wikipedia.org/wiki/Inverse_hyperbolic_functions#asinh + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).asinh().numpy()) + ``` + """ + return (self + (self.square() + 1).sqrt()).log() + + def acosh(self) -> Self: + """ + Applies the Inverse Hyperbolic Cosine (acosh) function element-wise. + + - Described: https://en.wikipedia.org/wiki/Inverse_hyperbolic_functions#acosh + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).acosh().numpy()) + ``` + """ + return (self + (self.square() - 1).sqrt()).log() + + def round(self) -> Self: + """ + Rounds the tensor element-wise with rounding half to even. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5]).round().numpy()) + ``` + """ + return ((self > 0).eq((b := self.trunc() / 2.0).trunc().eq(b))).where((self - 0.5).ceil(), (self + 0.5).floor()) + + def sign(self) -> Self: + """ + Returns the sign of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).sign().numpy()) + ``` + """ + return self.ne(0).where((self < 0).where(self.const_like(-1), self.const_like(1)), self.const_like(0)) + + def abs(self) -> Self: + """ + Computes the absolute value of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).abs().numpy()) + ``` + """ + return self * self.sign() + + def tan(self) -> Self: + """ + Computes the tangent of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([0., math.pi/4, math.pi/2, 3*math.pi/4, math.pi]).tan().numpy()) + ``` + """ + return self.sin() / self.cos() + + def asin(self) -> Self: + """ + Computes the inverse sine (arcsine) of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-0.9, -0.6, -0.3, 0., 0.3, 0.6, 0.9]).asin().numpy()) + ``` + """ + # https://personal.math.ubc.ca/~cbm/aands/page_81.htm 4.4.46 + coefficients = [-0.0012624911, 0.0066700901, -0.0170881256, 0.0308918810, -0.0501743046, 0.0889789874, -0.2145988016, 1.5707963050] + x = math.pi / 2 - (1.0 - self.abs()).sqrt() * polyN(self.abs(), coefficients) + return self.sign() * x + + def acos(self) -> Self: + """ + Computes the inverse cosine (arccosine) of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-0.9, -0.6, -0.3, 0., 0.3, 0.6, 0.9]).acos().numpy()) + ``` + """ + return math.pi / 2 - self.asin() + + def atan(self) -> Self: + """ + Computes the inverse tangent (arctan) of the tensor element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).atan().numpy()) + ``` + """ + return (self / (1 + self * self).sqrt()).asin() + + def elu(self, alpha=1.0) -> Self: + """ + Applies the Exponential Linear Unit (ELU) function element-wise. + + - Paper: https://arxiv.org/abs/1511.07289v5 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).elu().numpy()) + ``` + """ + return self.relu() - alpha*(1-self.exp()).relu() + + def celu(self, alpha=1.0) -> Self: + """ + Applies the Continuously differentiable Exponential Linear Unit (CELU) function element-wise. + + - Paper: https://arxiv.org/abs/1704.07483 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).celu().numpy()) + ``` + """ + return self.maximum(0) + (alpha * ((self / alpha).exp() - 1)).minimum(0) + + def selu(self, alpha=1.67326, gamma=1.0507) -> Self: + """ + Applies the Scaled Exponential Linear Unit (SELU) function element-wise. + + - Paper: https://arxiv.org/abs/1706.02515v5 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).selu().numpy()) + ``` + """ + return gamma * (self >= 0).where(self, alpha * (self.exp() - 1)) + + def softplus(self, beta=1.0) -> Self: + """ + Applies the Softplus function element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).softplus().numpy()) + ``` + """ + return (1/beta) * (self*beta).logaddexp(0.0) + + def mish(self) -> Self: + """ + Applies the Mish function element-wise. + + - Paper: https://arxiv.org/abs/1908.08681v3 + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).mish().numpy()) + ``` + """ + return self * self.softplus().tanh() + + def logsigmoid(self) -> Self: + """ + Applies the LogSigmoid function element-wise. + + - See: https://docs.pytorch.org/docs/stable/generated/torch.nn.functional.logsigmoid.html + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).logsigmoid().numpy()) + ``` + """ + return -(-self).softplus() + + def sinh(self) -> Self: + """ + Applies the Hyperbolic Sine (sinh) function element-wise. + + - Described: https://en.wikipedia.org/wiki/Hyperbolic_functions#Sinh + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).sinh().numpy()) + ``` + """ + return (self.exp() - self.neg().exp()) / 2 + + def cosh(self) -> Self: + """ + Applies the Hyperbolic Cosine (cosh) function element-wise. + + - Described: https://en.wikipedia.org/wiki/Hyperbolic_functions#Cosh + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).cosh().numpy()) + ``` + """ + return (self.exp() + self.neg().exp()) / 2 + + def erf(self) -> Self: + """ + Applies error function element-wise. + + - Described: https://en.wikipedia.org/wiki/Error_function + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-1.5, -1.0, -0.5, 0., 0.5, 1.0, 1.5]).erf().numpy()) + ``` + """ + # https://personal.math.ubc.ca/~cbm/aands/page_299.htm 7.1.26 + t = 1.0 / (1.0 + 0.3275911 * self.abs()) + return self.sign() * (1.0 - t * polyN(t, [1.061405429, -1.453152027, 1.421413741, -0.284496736, 0.254829592]) * (-self.square()).exp()) + + def softsign(self) -> Self: + """ + Applies the Softsign function element-wise. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([-3., -2., -1., 0., 1., 2., 3.]).softsign().numpy()) + ``` + """ + return self / (1 + self.abs()) + + def lerp(self, end: Self, weight: Self | ConstType) -> Self: + """ + Linearly interpolates between `self` and `end` by `weight`. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1., 2., 3.]).lerp(Tensor([4., 5., 6.]), 0.5).numpy()) + ``` + """ + if self.dtype == dtypes.uint8 and not isinstance(weight, ConstType): + w_i = (weight * (1<<(W_PREC:=7)) + 0.5).cast(dtypes.int16) + return (self+(((end - self).cast(dtypes.int8) * w_i + (1<> W_PREC)).cast(dtypes.uint8) + return self + (end - self) * weight diff --git a/artifacts/package_runtime/tinygrad/mixin/gradient.py b/artifacts/package_runtime/tinygrad/mixin/gradient.py new file mode 100644 index 000000000..93cc63843 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/mixin/gradient.py @@ -0,0 +1,129 @@ +from typing import cast +import math, dataclasses +from tinygrad.uop.ops import UOp, PatternMatcher, UPat, Ops, all_metadata, broadcast_axes +from tinygrad.helpers import argsort +from tinygrad.dtype import sum_acc_dtype + +def reduce_gradient(ctx:UOp, ret:UOp, op:Ops): + if op == Ops.ADD: return (ctx._broadcast_to(ret.src[0].shape),) + if op == Ops.MAX: return (((mask:=ret.src[0].eq(ret).cast(ctx.dtype))/mask._rop(Ops.ADD, tuple(range(ret.arg[1])))) * ctx,) + if op == Ops.MUL: return (ctx * ret / ret.src[0],) + +def _compact_params(body:UOp, all_args:tuple[UOp, ...]) -> tuple[UOp, tuple[UOp, ...]]: + """Remove unused PARAMs from body and return compacted (body, args).""" + used = sorted({p.arg.slot: p for p in body.toposort() if p.op is Ops.PARAM}.items()) + body = body.substitute({p: p.replace(arg=dataclasses.replace(p.arg, slot=j)) for j,(_, p) in enumerate(used)}, walk=True) + return body, tuple(all_args[i] for i,_ in used) + +def call_gradient(ctx:UOp, k:UOp, needed:set[int]) -> tuple[UOp|None, ...]: + fxn, args = k.src[0], k.src[1:] + if k.arg.grad_fxn is not None: + # put const on a device, also TODO why do we still have NOOP... + def on_dev(g, i): return g.clone(device=args[i].device if k.op is Ops.CALL else k.device) if g.device is None else g + if ctx.op is Ops.TUPLE: + real = [on_dev(g, i) for i,g in enumerate(ctx.src) if g.op is not Ops.NOOP] + return (None,) + (k.arg.grad_fxn(*real, call=k) if len(real) > 1 else k.arg.grad_fxn(real[0], k)) + return (None,) + k.arg.grad_fxn(on_dev(ctx, 0), k) + assert fxn.op is Ops.TUPLE, f"expected TUPLE body for gradient, got {fxn.op}" + params = {x.arg.slot:x for x in fxn.toposort(enter_calls=False) if x.op == Ops.PARAM} + grad_args = ctx.src + root_grad = UOp(Ops.TUPLE, src=tuple(UOp(Ops.NOOP) if g.op is Ops.NOOP else + g if g.base.op is Ops.CONST else g.param_like(len(args)+i) for i,g in enumerate(grad_args))) + grads = compute_gradient(fxn, root_grad, set(params.values())) + # for precompiled calls, substitute forward outputs with params so intermediates aren't recomputed + fwd_subs = {src: src.param_like(len(args)+len(grad_args)+i) for i, src in enumerate(fxn.src)} if k.arg.precompile else {} + fwd_outs = tuple(k.gettuple(i) for i in range(len(fxn.src))) if k.arg.precompile else () + # collect needed gradient bodies, compact unused params, create a single backward CALL + grad_bodies = [(i, grads[p]) for i in needed if (p:=params.get(i)) is not None and p in grads] + bwd_body = UOp.maketuple(*(gb for _, gb in grad_bodies)).substitute(fwd_subs, walk=True) + bwd_body, compact_args = _compact_params(bwd_body, (*args, *grad_args, *fwd_outs)) + bwd_call = bwd_body.call(*compact_args, name=(k.arg.name or "")+"_backward", precompile=k.arg.precompile_backward) + gb_map = {i: idx for idx, (i, _) in enumerate(grad_bodies)} + return (None,) + tuple(bwd_call.gettuple(gb_map[i]) if i in gb_map else None for i in range(len(args))) + +# ctx is grad_output +pm_gradient = PatternMatcher([ + (UPat(Ops.CAST, name="ret"), lambda ctx, ret: (ctx.cast(ret.src[0].dtype),)), + (UPat(Ops.RECIPROCAL, name="ret"), lambda ctx, ret: (-ctx * ret * ret,)), + (UPat(Ops.SIN, name="ret"), lambda ctx, ret: ((math.pi/2 - ret.src[0]).sin() * ctx,)), + (UPat(Ops.LOG2, name="ret"), lambda ctx, ret: (ctx / (ret.src[0] * math.log(2)),)), + (UPat(Ops.EXP2, name="ret"), lambda ctx, ret: (ret * ctx * math.log(2),)), + (UPat(Ops.SQRT, name="ret"), lambda ctx, ret: (ctx / (ret*2),)), + (UPat(Ops.TRUNC), lambda ctx: (ctx.const_like(0),)), + (UPat((Ops.CMPLT, Ops.CMPNE)), lambda: (None, None)), + (UPat(Ops.ADD), lambda ctx: (ctx, ctx)), + (UPat(Ops.POW, name="ret", src=(UPat.var("b"), UPat.var("e"))), lambda ctx, ret, b, e: + (ctx * e.eq(0).where(e, e*b.pow(e-1)), ctx * b.eq(0).where((e<0).where(ret.const_like(-math.inf), 0), ret*b.log2()*math.log(2.0)))), + (UPat(Ops.MAX, src=(UPat.var("x"), UPat.var("y"))), lambda ctx, x, y: + ((x>y).where(ctx, (x.eq(y)).where(ctx * 0.5, 0)), (x tuple[list[UOp], dict[UOp, bool]]: + # compute the target path (top down) + in_target_path: dict[UOp, bool] = {} + root.topovisit(lambda u: any(in_target_path[x] or x in targets for x in u.src), in_target_path) + # don't flow through DETACH or anything not in target path + return [node for node in in_target_path if node.op is not Ops.DETACH and in_target_path[node]], in_target_path + +def compute_gradient(root:UOp, root_grad:UOp, targets:set[UOp]) -> dict[UOp, UOp]: + walk, in_target_path = _deepwalk(root, targets) + grads: dict[UOp, UOp] = {root: root_grad} + for t0 in reversed(walk): + if t0 not in grads or grads[t0].op is Ops.NOOP: continue + # GETTUPLE: accumulate gradient into a TUPLE UOp on the FUNCTION, process when we hit the FUNCTION + if t0.op is Ops.GETTUPLE: + k = t0.src[0] # the FUNCTION + assert k.op is Ops.FUNCTION and k.src[0].op is Ops.TUPLE + n_outputs = len(k.src[0].src) + prev = grads[k].src if k in grads else tuple(UOp(Ops.NOOP) for _ in range(n_outputs)) + grads[k] = UOp.maketuple(*(prev[i] + grads[t0] if i == t0.arg and prev[i].op is not Ops.NOOP else + grads[t0] if i == t0.arg else prev[i] for i in range(n_outputs))) + continue + # FUNCTION/CALL: pass needed param set so backward only computes required gradients + # (FUNCTION uses implicit TUPLE gradient or grad_fxn; CALL requires an explicit grad_fxn) + if t0.op in {Ops.FUNCTION, Ops.CALL}: + needed = {i for i, arg in enumerate(t0.src[1:]) if arg in targets or in_target_path.get(arg, False)} + lgrads:tuple[UOp|None, ...]|None = call_gradient(grads[t0], t0, needed) + else: + lgrads = cast(tuple[UOp|None, ...]|None, pm_gradient.rewrite(t0, ctx=grads[t0])) + if lgrads is None: raise RuntimeError(f"failed to compute gradient for {t0.op}\n\nin {str(t0)[0:1000]}...") + assert len(lgrads) == len(t0.src), f"got {len(lgrads)} gradient, expected {len(t0.src)}" + for k,v in zip(t0.src, lgrads): + if v is None: continue + # a shaped edge's gradient is summed to its source's shape + if k._shape is not None and v._shape is not None and k._shape != v._shape: + v = v.cast(sum_acc_dtype(v.dtype))._rop(Ops.ADD, broadcast_axes(k.shape, v.shape)).reshape(k.shape).cast(v.dtype) + if k in grads and grads[k].op is not Ops.NOOP: + if v.op is Ops.TUPLE and grads[k].op is Ops.TUPLE: + grads[k] = UOp.maketuple(*(p + n if (p.op is not Ops.NOOP and n.op is not Ops.NOOP) else + n if p.op is Ops.NOOP else p for p, n in zip(grads[k].src, v.src))) + else: grads[k] = grads[k] + v + else: grads[k] = v + if len(forward_metadata:=all_metadata.get(t0, ())): + backward_metadata = tuple(dataclasses.replace(x, backward=True) for x in forward_metadata) + # we add the backward metadata to everything new in the graph + for bw_uop in v.toposort(lambda x: x not in (t0, *t0.src, grads[t0])): + all_metadata[bw_uop] = all_metadata.get(bw_uop, ())+backward_metadata + return grads diff --git a/artifacts/package_runtime/tinygrad/mixin/movement.py b/artifacts/package_runtime/tinygrad/mixin/movement.py new file mode 100644 index 000000000..380045497 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/mixin/movement.py @@ -0,0 +1,628 @@ +# mixins add syntactic sugar to Tensor and UOp +from __future__ import annotations +from typing import TYPE_CHECKING, Self, Sequence +from tinygrad.uop import Ops +from tinygrad.helpers import prod, argfix, argsort, flatten, dedup, make_tuple, ceildiv, round_up, all_int +from tinygrad.uop.ops import resolve, smax, _align_left, _broadcast_shape, broadcast_axes + +if TYPE_CHECKING: + from tinygrad.uop.ops import sint + + +class MovementMixin: + # required to implement + def _mop(self, op: Ops, arg) -> Self: + raise NotImplementedError + + @property + def shape(self) -> tuple[sint, ...]: + raise NotImplementedError + + @property + def device(self) -> str|tuple[str, ...]|None: + raise NotImplementedError + + # great functions you get! + @property + def ndim(self) -> int: + """ + Returns the number of dimensions in the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 2], [3, 4]]) + print(t.ndim) + ``` + """ + return len(self.shape) + + def numel(self) -> sint: + """ + Returns the total number of elements in the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) + print(t.numel()) + ``` + """ + return prod(self.shape) + + def size(self, dim:int|None=None) -> sint|tuple[sint, ...]: + """ + Returns the size of the tensor. If `dim` is specified, return the length along dimension `dim`. Otherwise return the shape of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[4, 5, 6], [7, 8, 9]]) + print(t.size()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.size(dim=1)) + ``` + """ + return self.shape if dim is None else self.shape[dim] + + def _normalize_indices(self, indices:list) -> list: + if len(ell := [i for i,x in enumerate(indices) if x is Ellipsis]) > 1: raise IndexError("indices can only have a single ellipsis") + num_real = len(indices) - len(ell) - sum(1 for i in indices if i is None) + if num_real > self.ndim: raise IndexError(f"too many indices ({num_real}) for {self.ndim}D") + fill_idx = ell[0] if ell else len(indices) + indices[fill_idx:fill_idx+1] = [slice(None)] * (self.ndim - num_real) + return indices + + def _resolve_dim(self, dim: int, *, extra: bool = False) -> int: + total = self.ndim + int(extra) + if not -max(1, total) <= dim <= max(1, total) - 1: + raise IndexError(f"{dim=} out of range {[-max(1, total), max(1, total) - 1]}") + return dim + total if dim < 0 else dim + + def _parse_view_index(self, index, size: sint) -> dict: + # parses a single slice/int/None/sint index into {boundary, stride, size, collapse_dim} + from tinygrad.uop.ops import UOp, sint + match index: + case None: return {"size":1, "boundary":(0,1), "stride":1, "collapse_dim":False} + case int() | UOp(): # sint + if resolve(index >= size, False) or resolve(index < -size, False): raise IndexError(f"{index=} is out of bounds with {size=}") + # TODO: is this right for (negative) symbolic? + b = index if resolve(index >= 0, False) else index + size + return {"size":size, "boundary":(b, b+1), "stride":1, "collapse_dim":True} + case slice(): + if not all(s is None or isinstance(s, sint) for s in (index.start, index.stop, index.step)): + raise TypeError(f"slice {index=} is not supported") + if resolve(index.step == 0, False): raise ValueError(f"{index=} cannot have 0 as step") + start, stop = 0 if index.start is None else index.start, size if index.stop is None else index.stop + step = 1 if index.step is None else index.step + # resolve negative int bounds against the (possibly symbolic) size, like slice.indices + if isinstance(start, int) and start < 0: start = start + size + if isinstance(stop, int) and stop < 0: stop = stop + size + if all_int((start, stop, step)): + # handle int slicing (clamp, stride) + *bound, stride = index.indices(int(size.vmax) if isinstance(size, UOp) else size) + bound = [0, 0] if stride * (bound[1] - bound[0]) < 0 else ([bound[1]+1, bound[0]+1] if stride < 0 else bound) + return {"size":ceildiv(bound[1]-bound[0], abs(stride)), "boundary":tuple(bound), "stride":stride, "collapse_dim":False} + if resolve(step == 1, False) and resolve((stop-start) >= 0, False): + return {"size":stop-start, "boundary":(start, stop), "stride":step, "collapse_dim":False} + raise TypeError(f"slice {index=} is not supported") + case _: raise IndexError(f"{type(index).__name__} indexing is not supported") + + def _apply_view_ops(self, mops:list) -> Self: + # applies shrink + flip + stride from a list of parsed view indices + # flip negative strides + x = self.shrink(tuple(m["boundary"] for m in mops)).flip(tuple(i for i, m in enumerate(mops) if m["stride"] < 0)) + strides = tuple(abs(m["stride"]) for m in mops) + # apply stride + if any(st != 1 for st in strides): + if not all_int(x.shape): raise RuntimeError("symbolic shape not supported") + x = x.pad_to(tuple(round_up(s, st) for s, st in zip(x.shape, strides))) + x = x.reshape(tuple(flatten((s // st, st) for s, st in zip(x.shape, strides)))) + x = x.shrink_to(tuple(flatten((s, 1) for s in x.shape[::2]))).reshape(x.shape[::2]) + return x + + def _broadcast_to(self, new_shape: tuple[sint, ...]) -> Self: + if self.shape == new_shape: + return self + if self.ndim > len(new_shape): + raise ValueError(f"cannot broadcast tensor to fewer dimensions. shape={self.shape} to {new_shape=}") + # first unsqueeze left with 1s https://data-apis.org/array-api/latest/API_specification/broadcasting.html + shape, _ = _align_left(self.shape, new_shape) + # for each dimension, check either dim is 1, or it does not change + if not all(s == ns or s == 1 for s, ns in zip(shape, new_shape)): + raise ValueError(f"cannot broadcast {self.shape} to {new_shape=}") + # EXPAND only adds dims on the left. squeeze 1s that need expanding, EXPAND on left, permute back. + n_left = len(new_shape) - len(self.shape) + expand_at = tuple(i-n_left for i in broadcast_axes(self.shape, new_shape) if i >= n_left) + kept = tuple(i for i in range(len(self.shape)) if i not in expand_at) + squeezed = self.reshape(tuple(self.shape[i] for i in kept)) + expanded = squeezed._mop(Ops.EXPAND, arg=new_shape[:n_left] + tuple(new_shape[n_left+i] for i in expand_at)) + # expanded shape = [left] + [expand_at dims] + [kept dims], permute to new_shape + perm = tuple(range(n_left)) + tuple( + n_left + (expand_at.index(i) if i in expand_at else len(expand_at) + kept.index(i)) for i in range(len(self.shape))) + return expanded.permute(perm) + + def expand(self, shape, *args) -> Self: + """ + Returns a tensor that is expanded to the shape that is specified. + Expand can also increase the number of dimensions that a tensor has. + + Passing a `-1` or `None` to a dimension means that its size will not be changed. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3]) + print(t.expand(4, -1).numpy()) + ``` + """ + new_shape = tuple(from_ if to == -1 or to is None else to for from_, to in zip(*(_align_left(self.shape, argfix(shape, *args))))) + return self._broadcast_to(new_shape) + + def reshape(self, shape, *args) -> Self: + """ + Returns a tensor with the same data as the original tensor but with a different shape. + `shape` can be passed as a tuple or as separate arguments. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(6) + print(t.reshape(2, 3).numpy()) + ``` + """ + # resolve None and args + new_shape = tuple([s if s is not None else self.shape[i] for i, s in enumerate(argfix(shape, *args))]) + # resolve -1 + if (c := new_shape.count(-1)) > 1: + raise RuntimeError(f"only one dimension can be inferred using -1, getting {new_shape}") + if c: + new_shape = tuple([-prod(self.shape) // prod(new_shape) if s == -1 else s for s in new_shape]) + if prod(self.shape) != prod(new_shape): + raise ValueError(f"size mismatch, can't reshape ({self.shape}) -> ({new_shape})") + ret = self._mop(Ops.RESHAPE, arg=new_shape) + return self if ret.shape == self.shape else ret + + def pad(self, arg:tuple[tuple[sint, sint] | None, ...]) -> Self: + if self.ndim != len(arg): + raise ValueError(f"{self.ndim=} != {len(arg)=}") + ret = self._mop(Ops.PAD, tuple((x[0], s+x[0]+x[1]) if x is not None else (0, s) for x, s in zip(arg, self.shape))) + return self if ret.shape == self.shape else ret + + def shrink(self, arg: tuple[tuple[sint, sint] | None, ...]) -> Self: + """ + Returns a tensor that shrinks the each axis based on input arg. + `arg` must have the same length as `self.ndim`. + For each axis, it can be `None`, which means no shrink, or a tuple `(start, end)` that works the same as Python slice. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(9).reshape(3, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.shrink(((None, (1, 3)))).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.shrink((((0, 2), (0, 2)))).numpy()) + ``` + """ + if self.ndim != len(arg): + raise ValueError(f"{self.ndim=} != {len(arg)=}") + ret = self._mop(Ops.SHRINK, arg=[(x[0], x[1]-x[0]) if x is not None else (0, s) for x, s in zip(arg, self.shape)]) + return self if ret.shape == self.shape else ret + + def permute(self, order, *args) -> Self: + """ + Returns a tensor that is a permutation of the original tensor. + The new tensor has the same data as the original tensor but with the dimensions permuted according to the order specified. + `order` can be passed as a tuple or as separate arguments. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.empty(2, 3, 5) + print(t.shape) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.permute(2, 0, 1).shape) + ``` + """ + order_arg = tuple(self._resolve_dim(x) for x in argfix(order, *args)) + if sorted(order_arg) != list(range(self.ndim)): + raise RuntimeError(f"order is not a valid permutation, getting {order_arg}") + return self._mop(Ops.PERMUTE, arg=order_arg) if order_arg != tuple(range(self.ndim)) else self + + def flip(self, axis, *args) -> Self: + """ + Returns a tensor that reverses the order of the original tensor along given `axis`. + `axis` can be passed as a tuple or as separate arguments. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(6).reshape(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.flip(0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.flip((0, 1)).numpy()) + ``` + """ + axis_arg = tuple(self._resolve_dim(x) for x in argfix(axis, *args)) + assert all(not isinstance(x, bool) and x >= 0 and x < self.ndim for x in axis_arg), f"flip args must be axis ints {axis_arg}" + if len(axis_arg) != len(dedup(axis_arg)): + raise RuntimeError(f"dim can appear at most once, getting {axis_arg}") + flip_arg = tuple([i in axis_arg for i in range(len(self.shape))]) + return self._mop(Ops.FLIP, arg=flip_arg) if any(flip_arg) else self + + def stack(self, *args: Self, dim: int = 0) -> Self: + """ + Concatenates self with other tensors in `args` along a new dimension specified by `dim`. + + ```python exec="true" source="above" session="tensor" result="python" + t0, t1, t2 = Tensor([1, 2]), Tensor([3, 4]), Tensor([5, 6]) + print(t0.stack(t1, t2, dim=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t0.stack(t1, t2, dim=1).numpy()) + ``` + """ + tensors = argfix(self, *args) + dim = tensors[0]._resolve_dim(dim, extra=True) + assert all(t.shape == tensors[0].shape for t in tensors), f"all shapes must match for stack, got {[t.shape for t in tensors]}" + ret = tensors[0]._mop(Ops.STACK, arg=tuple(t._uop for t in tensors[1:])) + return ret if dim == 0 else ret.permute(tuple(range(1, dim+1)) + (0,) + tuple(range(dim+1, ret.ndim))) + + # **** high level **** + + def shrink_to(self, shape, *args) -> Self: + return self.shrink(tuple([None if ns is None else (0, ns) for ns in argfix(shape, *args)])) + + def pad_to(self, shape, *args) -> Self: + return self._mop(Ops.PAD, tuple((0, s if ns is None else ns) for s,ns in zip(self.shape, argfix(shape, *args), strict=True))) + + def view(self, shape, *args) -> Self: + """`.view` is an alias for `.reshape`.""" + return self.reshape(shape, *args) + + def squeeze(self, dim: int | None = None) -> Self: + """ + Returns a tensor with specified dimensions of input of size 1 removed. + If `dim` is not specified, all dimensions with size 1 are removed. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.zeros(2, 1, 2, 1, 2) + print(t.squeeze().shape) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.squeeze(0).shape) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.squeeze(1).shape) + ``` + """ + if dim is None: + return self.reshape(tuple(dim for dim in self.shape if dim != 1)) + dim = self._resolve_dim(dim) + return self if not self.ndim or self.shape[dim] != 1 else self.reshape(self.shape[:dim] + self.shape[dim + 1 :]) + + def unsqueeze(self, dim: int) -> Self: + """ + Returns a tensor with a new dimension of size 1 inserted at the specified `dim`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3, 4]) + print(t.unsqueeze(0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.unsqueeze(1).numpy()) + ``` + """ + dim = self._resolve_dim(dim, extra=True) + return self.reshape(self.shape[:dim] + (1,) + self.shape[dim:]) + + @property + def T(self) -> Self: + """`.T` is an alias for `.transpose()`.""" + return self.transpose() + + def transpose(self, dim0=1, dim1=0) -> Self: + """ + Returns a tensor that is a transposed version of the original tensor. + The given dimensions `dim0` and `dim1` are swapped. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(6).reshape(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.transpose(0, 1).numpy()) + ``` + """ + order = list(range(self.ndim)) + order[dim0], order[dim1] = order[dim1], order[dim0] + return self.permute(order) + + def flatten(self, start_dim=0, end_dim=-1) -> Self: + """ + Flattens the tensor by reshaping it into a one-dimensional tensor. + If `start_dim` or `end_dim` are passed, only dimensions starting with `start_dim` and ending with `end_dim` are flattened. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(8).reshape(2, 2, 2) + print(t.flatten().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.flatten(start_dim=1).numpy()) + ``` + """ + start_dim, end_dim = self._resolve_dim(start_dim), self._resolve_dim(end_dim) + return self.reshape(self.shape[:start_dim] + (prod(self.shape[start_dim : end_dim + 1]),) + self.shape[end_dim + 1 :]) + + def unflatten(self, dim: int, sizes: tuple[int, ...]) -> Self: + """ + Unflattens dimension `dim` of the tensor into multiple dimensions specified by `sizes`. `Tensor.flatten()` is the inverse of this function. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.ones(3, 4, 1).unflatten(1, (2, 2)).shape) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.ones(3, 4, 1).unflatten(1, (-1, 2)).shape) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.ones(5, 12, 3).unflatten(-2, (2, 2, 3, 1, 1)).shape) + ``` + """ + dim = self._resolve_dim(dim) + return self.reshape(self.shape[:dim] + sizes + self.shape[dim + 1 :]) + + def rearrange(self, formula: str, **sizes) -> Self: + """ + Rearranges input according to formula + + See: https://einops.rocks/api/rearrange/ + + ```python exec="true" source="above" session="tensor" result="python" + x = Tensor([[1, 2], [3, 4]]) + print(Tensor.rearrange(x, "batch channel -> (batch channel)").numpy()) + ``` + """ + + def parse_side(s: str) -> tuple[list[str], list[tuple[int, int]]]: + """Parse one side of formula into (axis_names, dims) where dims are (start, end) index pairs for parens.""" + tokens = f" {s} ".replace("â€Ļ", "...").replace("(", " ( ").replace(")", " ) ").replace(" ", " ").replace(" 1 ", " ( ) ").split() + lparens, rparens = [i for i, tok in enumerate(tokens) if tok == "("], [i for i, tok in enumerate(tokens) if tok == ")"] + pairs = list(zip(lparens, rparens)) + assert len(lparens) == len(rparens) and sorted(flatten(pairs)) == flatten(pairs), "bracket mismatch" + return [tok for tok in tokens if tok not in ("(", ")")], [(lp - 2*i, rp - 1 - 2*i) for i, (lp, rp) in enumerate(pairs)] + + assert formula.count("->") == 1, 'need exactly one "->" in formula' + (lhs, unflatten_dims), (rhs, flatten_dims) = map(parse_side, formula.split("->")) + + for name in sizes: assert name in lhs, f"axis {name} is not used in transform" + assert sorted(lhs) == sorted(rhs) and len(lhs) == len(set(lhs)), f"name mismatch in {formula}" + for name in lhs+rhs: assert name == "..." or (name.isidentifier() and "_" not in (name[0], name[-1])), f"invalid axis name {name}" + assert "..." not in flatten([lhs[s:e] for s, e in unflatten_dims]), f"cannot have collapsed ellipsis (...) in lhs of {formula}" + assert lhs.count("...") <= 1, f"too many ellipses in {formula}" + + # resolve ellipsis + if "..." in lhs: + ell_len = len(self.shape) - len(lhs) + 1 + sum(e - s - 1 for s, e in unflatten_dims) + lhs, rhs = map(lambda l: l[:(i := l.index("..."))] + [f"...{j}" for j in range(ell_len)] + l[i + 1:] if "..." in l else l, (lhs, rhs)) + def newdims(side, s, e): return (s + (ell_len - 1 if "...0" in side[:s] else 0), e + (ell_len - 1 if "...0" in side[:e] else 0)) + unflatten_dims, flatten_dims = [newdims(lhs, s, e) for s, e in unflatten_dims], [newdims(rhs, s, e) for s, e in flatten_dims] + + # unflatten -> permute -> flatten + t = self + for start, end in unflatten_dims: t = t.unflatten(start, tuple(sizes.get(lhs[i], -1) for i in range(start, end))) + for i, name in enumerate(lhs): + if name in sizes: assert sizes[name] == t.shape[i], f"size provided for dimension {name} incorrect" + t = t.permute([lhs.index(name) for name in rhs]) + for start, end in reversed(flatten_dims): t = t.flatten(start, end - 1) if start < end else t.unsqueeze(start) + return t + + def split(self, sizes:int|Sequence[int], dim:int=0) -> tuple[Self, ...]: + """ + Splits the tensor into chunks along the dimension specified by `dim`. + If `sizes` is an integer, it splits into equally sized chunks if possible, otherwise the last chunk will be smaller. + If `sizes` is a list, it splits into `len(sizes)` chunks with size in `dim` according to `size`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(10).reshape(5, 2) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + split = t.split(2) + print("\\n".join([repr(x.numpy()) for x in split])) + ``` + ```python exec="true" source="above" session="tensor" result="python" + split = t.split([1, 4]) + print("\\n".join([repr(x.numpy()) for x in split])) + ``` + """ + dim = self._resolve_dim(dim) + dim_sz = self.shape[dim] + assert isinstance(dim_sz, int), f"does not support symbolic shape in split dimension {dim}: {self.shape}" + if isinstance(sizes, int): sizes = [min(sizes, dim_sz-i) for i in range(0, max(1, dim_sz), max(1, sizes))] + assert sum(sizes) == dim_sz, f"expect sizes to sum exactly to {dim_sz}, but got {sum(sizes)}" + return tuple(self.shrink(tuple((sum(sizes[:i]), sum(sizes[:i+1])) if j == dim else None for j in range(self.ndim))) for i in range(len(sizes))) + + def chunk(self, chunks:int, dim:int=0) -> list[Self]: + """ + Splits the tensor into `chunks` number of chunks along the dimension `dim`. + If the tensor size along `dim` is not divisible by `chunks`, all returned chunks will be the same size except the last one. + The function may return fewer than the specified number of chunks. + + ```python exec="true" source="above" session="tensor" result="python" + chunked = Tensor.arange(11).chunk(6) + print("\\n".join([repr(x.numpy()) for x in chunked])) + ``` + ```python exec="true" source="above" session="tensor" result="python" + chunked = Tensor.arange(12).chunk(6) + print("\\n".join([repr(x.numpy()) for x in chunked])) + ``` + ```python exec="true" source="above" session="tensor" result="python" + chunked = Tensor.arange(13).chunk(6) + print("\\n".join([repr(x.numpy()) for x in chunked])) + ``` + """ + dim = self._resolve_dim(dim) + dim_sz = self.shape[dim] + assert isinstance(dim_sz, int), f"does not support symbolic shape in split dimension {dim}: {self.shape}" + assert chunks > 0, f"expect chunks to be greater than 0, got: {chunks}" + return list(self.split(ceildiv(dim_sz, chunks) if dim_sz else [0]*chunks, dim=dim)) + + def meshgrid(self, *args, indexing:str="ij") -> tuple[Self, ...]: + """ + Generates coordinate matrices from coordinate vectors. + Input tensors can be scalars or 1D tensors. + + `indexing` determines how the output grids are aligned. + `ij` indexing follows matrix-style indexing and `xy` indexing follows Cartesian-style indexing. + + ```python exec="true" source="above" session="tensor" result="python" + x, y = Tensor([1, 2, 3]), Tensor([4, 5, 6]) + grid_x, grid_y = x.meshgrid(y) + print(grid_x.numpy()) + print(grid_y.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + grid_x, grid_y = x.meshgrid(y, indexing="xy") + print(grid_x.numpy()) + print(grid_y.numpy()) + ``` + """ + if indexing not in ("ij", "xy"): raise RuntimeError(f'indexing must be in ("ij", "xy"), got {indexing}') + if len(tensors:=(self, *args)) == 1: return tensors + basis = tuple(range(len(tensors))) if indexing == "ij" else (1, 0) + tuple(range(2, len(tensors))) + tensors = tuple(t.reshape((-1,) + (1,)*(len(args) - i)) for i,t in zip(basis, tensors)) + output_shape = _broadcast_shape(*(t.shape for t in tensors)) + return tuple(t._broadcast_to(output_shape) for t in tensors) + + def diag(self) -> Self: + """ + Returns a 2-D square tensor with the elements of input as the main diagonal. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([1, 2, 3]).diag().numpy()) + ``` + """ + if self.ndim != 1: raise ValueError(f"expect input to be 1-D, getting {self.ndim}-D") + return self.unsqueeze(-1).pad_to((None, 1+(n:=self.shape[0]))).flatten().shrink_to((n*n,)).reshape(n,n) + + def diagonal(self, offset:int=0, dim1:int=0, dim2:int=1) -> Self: + """ + Returns a view of the diagonal elements with respect to `dim1` and `dim2`. + `offset` controls which diagonal: 0 is main, positive is above, negative is below. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(9).reshape(3, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.diagonal().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.diagonal(offset=1).numpy()) + ``` + """ + if (dim1:=self._resolve_dim(dim1)) == (dim2:=self._resolve_dim(dim2)): raise RuntimeError("dim1 and dim2 cannot be the same dimension") + x = self.permute(*[i for i in range(self.ndim) if i != dim1 and i != dim2], dim1, dim2) + if offset >= 0: x = x.shrink(tuple(None for _ in x.shape[:-1]) + ((offset, x.shape[-1]),)) + else: x = x.shrink(tuple(None for _ in x.shape[:-2]) + ((-offset, x.shape[-2]), None)) + if (d := min(int(x.shape[-2]), int(x.shape[-1]))) <= 0: return x.reshape(*x.shape[:-2], 0) + nones, x = tuple(None for _ in x.shape[:-2]), x.shrink_to(tuple(None for _ in x.shape[:-2]) + (d, d)) + return x.flatten(-2).pad_to(nones+(d*(d+1),)).unflatten(-1, (d, d+1)).shrink_to(nones+(None, 1)).squeeze(-1) + + def roll(self, shifts:int|tuple[int, ...], dims:int|tuple[int, ...]|None=None) -> Self: + """ + Rolls the tensor along specified dimension(s). + The rolling operation is circular, meaning that elements that go beyond the edge are wrapped around to the beginning of the dimension. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(4) + print(t.roll(shifts=1, dims=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.roll(shifts=-1, dims=0).numpy()) + ``` + """ + if dims is None: return self.flatten().roll(shifts, 0).reshape(self.shape) + dims, shifts = tuple(self._resolve_dim(d) for d in make_tuple(dims, 1)), make_tuple(shifts, 1) + if len(dims) != len(shifts): raise RuntimeError(f"{len(dims)=} != {len(shifts)=}") + shrink_arg: list[tuple[sint, sint]|None] = [None] * self.ndim + for d, s in zip(dims, shifts): shrink_arg[d] = (delta:=self.shape[d]-s%self.shape[d], delta+self.shape[d]) + return self.repeat(*tuple(2 if i in dims else 1 for i in range(self.ndim))).shrink(tuple(shrink_arg)) + + # *** movement ops with expand *** + + def repeat_interleave(self, repeats: int, dim: int | None = None) -> Self: + """ + Repeats elements of a tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3]) + print(t.repeat_interleave(2).numpy()) + ``` + """ + x, dim = (self.flatten(), 0) if dim is None else (self, self._resolve_dim(dim)) + shp = x.shape + x = x.reshape(*shp[: dim + 1], 1, *shp[dim + 1 :]) + x = x.expand(*shp[: dim + 1], repeats, *shp[dim + 1 :]) + x = x.reshape(*shp[:dim], shp[dim] * repeats, *shp[dim + 1 :]) + return x + + def repeat(self, repeats, *args) -> Self: + """ + Repeats tensor number of times along each dimension specified by `repeats`. + `repeats` can be passed as a tuple or as separate arguments. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3]) + print(t.repeat(4, 2).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.repeat(4, 2, 1).shape) + ``` + """ + repeats = argfix(repeats, *args) + base_shape = _align_left(self.shape, repeats)[0] + unsqueezed_shape = flatten([[s] if r == 1 else [1, s] for r, s in zip(repeats, base_shape)]) + expanded_shape = flatten([[s] if r == 1 else [r, s] for r, s in zip(repeats, base_shape)]) + final_shape = [r * s for r, s in zip(repeats, base_shape)] + return self.reshape(unsqueezed_shape).expand(expanded_shape).reshape(final_shape) + + # **** pool level **** + + def _pool(self, k_: tuple[sint, ...], stride: int | tuple[int, ...] = 1, dilation: int | tuple[int, ...] = 1) -> Self: + assert len(self.shape) >= len(k_), f"can't pool {self.shape} with {k_}" + s_, d_ = make_tuple(stride, len(k_)), make_tuple(dilation, len(k_)) + assert len(k_) == len(s_) == len(d_), f"stride/dilation mismatch kernel:{k_} stride:{s_} dilation:{d_}" + noop, i_ = [None] * (self.ndim - len(k_)), self.shape[-len(k_) :] + assert all(resolve(d * (k - 1) + 1 <= i) for k, d, i in zip(k_, d_, i_)), "kernel size cannot be greater than actual input size" + o_ = [ceildiv(i - d * (k - 1), s) for i, d, k, s in zip(i_, d_, k_, s_)] + # input size scaling factor to make sure shrink for stride is possible + f_ = [smax(1, ceildiv(o * s - d, i)) for o, s, i, d in zip(o_, s_, i_, d_)] + # repeats such that we don't need padding + x = self.repeat([1] * len(noop) + [ceildiv(k * (i * f + d), i) for k, i, d, f in zip(k_, i_, d_, f_)]) + # handle dilation + x = x.shrink_to(noop + [k * (i * f + d) for k, i, d, f in zip(k_, i_, d_, f_)]) + x = x.reshape(noop + flatten((k, (i * f + d)) for k, i, d, f in zip(k_, i_, d_, f_))) + # handle stride + x = x.shrink_to(noop + flatten((k, o * s) for k, o, s in zip(k_, o_, s_))).reshape(noop + flatten((k, o, s) for k, o, s in zip(k_, o_, s_))) + x = x.shrink_to(noop + flatten((k, o, 1) for k, o in zip(k_, o_))).reshape(noop + flatten((k, o) for k, o in zip(k_, o_))) + # permute to move reduce to the end + return x.permute(*range(len(noop)), *[len(noop) + i * 2 + 1 for i in range(len(i_))], *[len(noop) + i * 2 for i in range(len(i_))]) + + def unfold(self, dim:int, size, step:int) -> Self: + """ + Unfolds the tensor along dimension `dim` into overlapping windows. + + Each window has length `size` and begins every `step` elements of `self`. + Returns the input tensor with dimension `dim` replaced by dims `(n_windows, size)` + where `n_windows = (self.shape[dim] - size) // step + 1`. + + ```python exec="true" source="above" session="tensor" result="python" + unfolded = Tensor.arange(8).unfold(0,2,2) + print("\\n".join([repr(x.numpy()) for x in unfolded])) + ``` + ```python exec="true" source="above" session="tensor" result="python" + unfolded = Tensor.arange(27).reshape(3,3,3).unfold(-1,2,3) + print("\\n".join([repr(x.numpy()) for x in unfolded])) + ``` + """ + if size < 0: raise RuntimeError(f'size must be >= 0 but got {size=}') + if step <= 0: raise RuntimeError(f'step must be > 0 but got {step=}') + if size > self.shape[dim]: raise RuntimeError(f'maximum size for tensor at dimension {dim} is {self.shape[dim]} but size is {size}') + dim = self._resolve_dim(dim) + perm_to_last = tuple(i for i in range(self.ndim) if i != dim) + (dim,) + return self.permute(perm_to_last)._pool((size,), step).permute(argsort(perm_to_last) + (self.ndim,)) diff --git a/artifacts/package_runtime/tinygrad/mixin/op.py b/artifacts/package_runtime/tinygrad/mixin/op.py new file mode 100644 index 000000000..1b86cbda4 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/mixin/op.py @@ -0,0 +1,1978 @@ +from __future__ import annotations +import functools, itertools, math, string +from typing import TYPE_CHECKING, Callable, Self, Sequence, Literal, get_args +from tinygrad.mixin.elementwise import ElementwiseMixin +from tinygrad.mixin.movement import MovementMixin +from tinygrad.mixin.reduce import ReduceMixin +from tinygrad.uop import Ops +from tinygrad.uop.ops import _broadcast_shape, resolve, smax, smin, identity_element +from tinygrad.dtype import ConstType, DType, DTypeLike, Invalid, PyConst, dtypes, least_upper_dtype, sum_acc_dtype, to_dtype +from tinygrad.helpers import all_int, argfix, argsort, ceildiv, flatten, flat_to_grouped, fully_flatten, get_shape, make_tuple, merge_dicts, prod +from tinygrad.helpers import resolve_pool_pads, round_up, IMAGE, FLOAT16, WINO + +if TYPE_CHECKING: + from tinygrad.uop.ops import sint + +ReductionStr = Literal["mean", "sum", "none"] + + +class OpMixin(ElementwiseMixin, ReduceMixin): + def data(self) -> memoryview: raise NotImplementedError("data requires Tensor realization to host memory") + + def item(self) -> PyConst: + """ + Returns the value of this tensor as a standard Python number. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor(42) + print(t.item()) + ``` + """ + assert self.numel() == 1, "must have one element for item" + return self.data()[(0,) * len(self.shape)] + + def __getitem__(self, indices) -> Self: + """ + Retrieves a sub-tensor using indexing. + + Supported Index Types: `int | slice | Tensor | None | list | tuple | Ellipsis` + + Examples: + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(12).reshape(3, 4) + print(t.numpy()) + ``` + + - Int Indexing: Select an element or sub-tensor using integers for each dimension. + ```python exec="true" source="above" session="tensor" result="python" + print(t[1, 2].numpy()) + ``` + + - Slice Indexing: Select a range of elements using slice notation (`start:end:stride`). + ```python exec="true" source="above" session="tensor" result="python" + print(t[0:2, ::2].numpy()) + ``` + + - Tensor Indexing: Use another tensor as indices for advanced indexing. Using `tuple` or `list` here also works. + ```python exec="true" source="above" session="tensor" result="python" + print(t[Tensor([2, 0, 1]), Tensor([1, 2, 3])].numpy()) + ``` + + - `None` Indexing: Add a new dimension to the tensor. + ```python exec="true" source="above" session="tensor" result="python" + print(t[:, None].shape) + ``` + + NOTE: Out-of-bounds indexing results in a value of `0`. + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3]) + print(t[Tensor([4, 3, 2])].numpy()) + ``` + """ + return self._getitem(indices) + + def _getitem(self, indices, v=None) -> Self: + from tinygrad.uop.ops import UOp + def is_adv(i): return isinstance(i,(list,tuple)) or (isinstance(i,type(self)) and (not isinstance(i,UOp) or i.shape != ())) + # wrap single index into a list + if (isinstance(indices, list) and all_int(indices)) or not isinstance(indices, (tuple, list)): indices = [indices] + indices_parsed, dim = [], 0 + for index in self._normalize_indices(list(indices)): + size = 1 if index is None else self.shape[dim] + parsed = {"size":size, "boundary":(0, size), "stride":1, "collapse_dim":False} + if isinstance(index,(list,tuple)): + flat = fully_flatten(index) + inferred = dtypes.bool if (flat and all(isinstance(s,bool) for s in flat)) else \ + (dtypes.default_int if flat and all_int(flat) else dtypes.default_float) + if not dtypes.is_int(inferred): raise IndexError(f"{index=} contains non-int element") + index = self._wrap_uop(UOp._frompy([i+size if i<0 else i for i in flat], inferred, self.device)).reshape(get_shape(index)) + elif is_adv(index): + if not dtypes.is_int(index.dtype): raise IndexError(f"index dtype {index.dtype} is not supported") + if index.device is not None and self.device is not None and index.device != self.device: + raise RuntimeError(f"expected index and self on the same device, {index.device=}, {self.device=}") + assert isinstance(size, int), "size must be an int" + index = (index < 0).where(index+size, index) # treat negative index values + else: parsed = self._parse_view_index(index, size) + indices_parsed.append({**parsed, "index":index}) + if index is not None: dim += 1 + + # apply view ops then dim injection (None) and collapse (int) + x = self._apply_view_ops(mops := [p for p in indices_parsed if p["index"] is not None]) + x_dims = [p for p in indices_parsed if not p["collapse_dim"]] + x = x.reshape(tuple(p["size"] for p in x_dims)) + + # tensor indexing + if tops := [(d, p) for d, p in enumerate(x_dims) if is_adv(p['index'])]: + dims, tensors, masks = [d for d, _ in tops], [p['index'] for _, p in tops], [] + big_shape = _broadcast_shape(*(t.shape for t in tensors)) + + # consecutive tensor indices with int shapes: use linear indexing instead of one-hot masks + consecutive = dims == list(range(dims[0], dims[0] + len(dims))) + if v is None and len(dims) > 1 and consecutive and all_int(ishp := tuple(x.shape[d] for d in dims)): + strides = tuple(prod(ishp[i+1:]) for i in range(len(dims))) + linear_idx = type(self).usum(*[t * s for t, s in zip(tensors, strides)]) + valid = type(self).uprod(*[(t >= 0) & (t < s) for t, s in zip(tensors, ishp)]) + pre, post = x.shape[:dims[0]], x.shape[dims[-1]+1:] + x = x.reshape(pre + (prod(ishp),) + post)[tuple([slice(None)] * len(pre)) + (valid.where(linear_idx, 0),)] + return valid.reshape((1,) * len(pre) + big_shape + (1,) * len(post)).where(x, 0) + + pre_reduce_shape = x.shape[:dims[0]] + big_shape + x.shape[dims[0]:] + + # create index masks + for dim, tensor in zip(dims, tensors): + try: i = tensor.reshape(tensor.shape + (1,)*(x.ndim - dims[0])).expand(pre_reduce_shape) + except ValueError as err: raise IndexError(f"cannot broadcast indices: {err}") from err + masks.append(i._one_hot_along_dim(num_classes=x.shape[dim], dim=(dim - x.ndim))) + + # reduce masks to 1 mask + mask = type(self).uprod(*masks) + + # inject 1's for the extra dims added in create masks + reshape_arg = x.shape[:dims[0]] + (1,) * len(big_shape) + x.shape[dims[0]:] + # sum reduce the extra dims introduced in create masks + x_pre = x # save collapsed shape for advanced setitem + x = (mask.where(x.reshape(reshape_arg), 0)).sum(sum_axis:=tuple(d + len(big_shape) for d in dims), dtype=x.dtype) + + # special permute case + if (permuted := dims[0] != 0 and len(dims) != 1 and tuple(dims) != tuple(range(dims[0], dims[-1]+1))): + mask, x = (y.permute(*range(dims[0], dims[0]+len(big_shape)), *range(0, dims[0]), *range(dims[0]+len(big_shape), y.ndim)) for y in (mask, x)) + + if v is None: return x # advanced getitem + # advanced setitem: resolve tensor dims in collapsed space, then fall through to basic setitem path + vb = v._broadcast_to(_broadcast_shape(x.shape, v.shape)) + for dim in sum_axis: vb = vb.unsqueeze(dim) # add back reduced dims from sum + start = dims[0] if not permuted else 0 + vb = x_pre._masked_merge(vb, mask, tuple(range(start, start + len(big_shape)))) + elif v is None: return x # basic getitem + # basic setitem: broadcast v, reshape to self.ndim (unsqueeze int dims, squeeze None dims) + else: vb = v._broadcast_to(x.shape) + vb = vb.reshape(tuple(1 if p['collapse_dim'] else p['size'] for p in indices_parsed if p['index'] is not None)) + per_dim = [] + for d, m in enumerate(mops): + (s, e), st = m['boundary'], abs(m['stride']) + if st != 1 and vb.shape[d] > 1: # un-stride: interleave with zeros + vb = vb.unsqueeze(d+1) + vb = vb.pad_to(tuple(st if j == d+1 else None for j in range(vb.ndim))) + vb = vb.reshape(vb.shape[:d] + (vb.shape[d]*vb.shape[d+1],) + vb.shape[d+2:]) + vb = vb.shrink_to(tuple(e-s if j == d else None for j in range(self.ndim))) + idx = type(self).arange(self.shape[d]).reshape([1]*d + [self.shape[d]] + [1]*(self.ndim - d - 1)) + per_dim.append((idx >= s) & (idx < e) & (((e-1-idx) if m['stride'] < 0 else (idx-s)) % st == 0)) + vb = vb.flip(tuple(d for d, m in enumerate(mops) if m['stride'] < 0)) + vb = vb.pad(tuple((m['boundary'][0], self.shape[d] - m['boundary'][1]) for d, m in enumerate(mops))) + return (type(self).uprod(*per_dim) if per_dim else type(self).const(True)).where(vb, self) + + @classmethod + def arange(cls, start, stop=None, step=1, dtype:DTypeLike|None=None) -> Self: + """ + Returns a 1-D tensor of size `ceil((stop - start) / step)` with values from `[start, stop)`, with spacing between values given by `step`. + + If `stop` is not specified, values are generated from `[0, start)` with the given `step`. + + If `stop` is specified, values are generated from `[start, stop)` with the given `step`. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.arange(5).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.arange(5, 10).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.arange(5, 10, 2).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.arange(5.5, 10, 2).numpy()) + ``` + """ + if stop is None: stop, start = start, 0 + lo, hi = (start, stop-step) if step > 0 else (stop-step, start) + if dtype is None: + dtype = dtypes.default_float if any(isinstance(x, float) for x in (start, stop, step)) else dtypes.default_int + # an int range too large for default_int picks int64 + if dtype is dtypes.default_int and (lo < dtype.min or dtype.max < hi): dtype = dtypes.int64 + if lo < (dt:=to_dtype(dtype)).min or dt.max < hi: raise OverflowError(f"arange [{start}, {stop}) is not representable in dtype {dtype}") + # NOTE: this matches numpy, torch raises RuntimeError if stop-start and step have different signs + if (output_len:=ceildiv(stop-start, step)) <= 0: return cls.full((0,), 0, dtype=dtype, buffer=False) + return (cls.full((output_len,), step, dtype=dtype, buffer=False)._cumalu(0, Ops.ADD) + (start - step)).cast(dtype) + + @classmethod + def linspace(cls, start:int|float, stop:int|float, steps:int, dtype:DTypeLike|None=None) -> Self: + """ + Returns a 1-D tensor of `steps` evenly spaced values from `start` to `stop`, inclusive. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.linspace(0, 10, 5).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.linspace(-1, 1, 5).numpy()) + ``` + """ + if steps < 0: raise ValueError("number of steps must be non-negative") + if (dtype := to_dtype(dtype or dtypes.default_float)) == dtypes.bool: raise ValueError("linspace with bool dtype is not supported") + if steps == 1: return cls.full((1,), start, dtype=dtype, buffer=False) + return (start + cls.arange(steps, dtype=dtypes.default_float) * ((stop - start) / (steps - 1))).cast(dtype) + + @classmethod + def eye(cls, n:int, m:int|None=None, dtype:DTypeLike|None=None) -> Self: + """ + Returns a 2-D tensor with `n` rows and `m` columns, with ones on the diagonal and zeros elsewhere. + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.eye(3).numpy()) + ``` + + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.eye(2, 4).numpy()) + ``` + """ + m_ = n if m is None else m + if n < 0 or m_ < 0: raise ValueError(f"cannot have negative {n=}, {m_=}") + out_dtype = to_dtype(dtype) if dtype is not None else dtypes.default_float + return cls.arange(n).unsqueeze(-1).eq(cls.arange(m_)).cast(out_dtype) + + @classmethod + def _tri(cls, r:sint, c:sint, diagonal=0) -> Self: + return cls.arange(r).unsqueeze(-1) + diagonal <= cls.arange(c) + + def triu(self, diagonal:sint=0) -> Self: + """ + Returns the upper triangular part of the tensor, the other elements are set to 0. + + The argument `diagonal` determines which diagonal is on the boundary. `diagonal = 0` means the main diagonal. + Positive `diagonal` means above the main diagonal, and negative `diagonal` means below the main diagonal. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.triu(diagonal=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.triu(diagonal=1).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.triu(diagonal=-1).numpy()) + ``` + """ + return self._tri(self.shape[-2], self.shape[-1], diagonal).where(self, self.const_like(0)) + + def tril(self, diagonal:sint=0) -> Self: + """ + Returns the lower triangular part of the tensor, the other elements are set to 0. + + The argument `diagonal` determines which diagonal is on the boundary. `diagonal = 0` means the main diagonal. + Positive `diagonal` means above the main diagonal, and negative `diagonal` means below the main diagonal. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.tril(diagonal=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.tril(diagonal=1).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.tril(diagonal=-1).numpy()) + ``` + """ + return self._tri(self.shape[-2], self.shape[-1], diagonal+1).where(self.const_like(0), self) + + def _pad_constant(self, pX, value:ConstType) -> Self: + # shrink first for negative pads, then pad with only non-negative values + pX = tuple((0, 0) if p is None else p for p in pX) + has_neg = not all(resolve(p >= 0) for p in flatten(pX)) + X = self.shrink(tuple((-smin(pB,0),smin(pA+s,s)) for (pB,pA),s in zip(pX, self.shape))) if has_neg else self + pads = tuple((smax(pB,0), smax(pA,0)) for pB,pA in pX) if has_neg else pX + base = MovementMixin.pad(X, pads) + if value == 0: return base + return MovementMixin.pad(X.const_like(True, dtypes.bool), pads).where(base, value) + + def _pad_circular(self, pX:tuple[tuple[sint, sint], ...]) -> Self: + # shrink first for negative pads, then wrap the non-negative remainder + X = self.shrink(tuple((-smin(pB,0), smin(pA+sh,sh)) for (pB,pA),sh in zip(pX, self.shape))) + pX = tuple((smax(pB,0), smax(pA,0)) for pB,pA in pX) + if any(pB>sh or pA>sh for (pB,pA),sh in zip(pX, X.shape)): raise ValueError('Padding value causes wrapping around more than once.') + orig_shape, X = X.shape, X.repeat(tuple(1 + bool(pB) + bool(pA) for pB,pA in pX)) + return X.shrink(tuple((0 if pB == 0 else osh-pB, xsh if pA == 0 else xsh-osh+pA) for (pB,pA),osh,xsh in zip(pX, orig_shape, X.shape))) + + def _pad_reflect_replicate(self, pX:tuple[tuple[sint, sint], ...], mode:str) -> Self: + X, pads = self, tuple((smax(pB,0), smax(pA,0)) for pB,pA in pX) + for d,(pB,pA) in enumerate(pads): + if mode == "reflect": + if pB >= (s:=X.shape[d]) or pA>=s: raise ValueError(f"Padding ({pB}, {pA}) should be less than the input size={s} for dim={d}.") + slcB, slcA = slice(pB,0,-1), slice(s-2, s-2-pA if s-2-pA>=0 else None, -1) + xB, xA = (X[[slc if i == d else slice(None) for i in range(X.ndim)]] if p > 0 else None for slc, p in ((slcB, pB), (slcA, pA))) + else: + shrB, shrA = tuple((0,1) if i==d else None for i in range(X.ndim)), tuple((X.shape[i]-1,X.shape[i]) if i==d else None for i in range(X.ndim)) + xB, xA = (X.shrink(shr).expand(tuple(p if i==d else None for i in range(X.ndim))) if p > 0 else None for shr, p in ((shrB, pB), (shrA, pA))) + pieces = [X_ for X_ in (xB, X, xA) if X_ is not None] + X = pieces[0].cat(*pieces[1:], dim=d) + # shrink after for negative pads (reflection/replication must see full data first) + return X.shrink(tuple((-min(pB,0), min(pA+s,s)) for (pB,pA),s in zip(pX, X.shape))) + + def pad(self, padding:Sequence[sint]|Sequence[tuple[sint, sint]|None], mode:str="constant", value:ConstType=0.0) -> Self: + """ + Returns a tensor with padding applied based on the input `padding`. + + `padding` supports two padding structures: + + 1. Flat padding: `(padding_left, padding_right, padding_top, padding_bottom, ...)` + - This structure matches PyTorch's pad. + - `padding` length must be even. + + 2. Group padding: `(..., (padding_top, padding_bottom), (padding_left, padding_right))` + - This structure matches pad for JAX, NumPy, TensorFlow, and others. + - For each axis, padding can be `None`, meaning no padding, or a tuple `(start, end)`. + - `padding` must have the same length as `self.ndim`. + + Padding values can be negative, resulting in dimension shrinks that work similarly to Python negative slices. + Padding modes is selected with `mode` which supports `constant`, `reflect` and `replicate`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(9).reshape(1, 1, 3, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.pad((1, 2, 0, -1)).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.pad(((None, None, (0, -1), (1, 2)))).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.pad((1, 2, 0, -1), value=-float('inf')).numpy()) + ``` + """ + # normalize to grouped format + pX: tuple[tuple[sint, sint], ...] + if not any(isinstance(p, (tuple, type(None))) for p in padding): + if len(padding)%2 != 0: raise ValueError("Flat padding must have even number of pads") + pX = ((0,0),)*(self.ndim - len(padding)//2) + flat_to_grouped(padding) # type: ignore[arg-type] + else: pX = tuple((0,0) if p is None else p for p in padding) # type: ignore[misc] + if len(pX) != self.ndim: raise ValueError(f"padding length is improper, {padding=} {self.ndim=}") + # dispatch + if mode == "constant": return self._pad_constant(pX, value) + assert all_int(self.shape), f"does not support symbolic shape {self.shape}" + if mode == "circular": return self._pad_circular(pX) + if mode in {"reflect", "replicate"}: return self._pad_reflect_replicate(pX, mode) + raise NotImplementedError(f"{mode=} is not supported") + + def dot(self, w:Self, dtype:DTypeLike|None=None) -> Self: + """ + Performs dot product between two tensors. + If `w` is 1-D, it's a sum product over the last axis of `self` and `w`. + If `w` is N-D with N>=2, it's a sum product over the last axis of `self` and the second-to-last axis of `w`. + + You can pass in the optional `dtype` keyword argument to control the data type of the accumulation. + + ```python exec="true" source="above" session="tensor" result="python" + a = Tensor([1, 2, 3]) + b = Tensor([1, 1, 0]) + print(a.dot(b).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + a = Tensor([[1, 2], [3, 4]]) + b = Tensor([[5, 6], [7, 8]]) + print(a.dot(b).numpy()) + ``` + """ + if IMAGE: return self.image_dot(w, dtype) + x, dx, dw = self, self.ndim, w.ndim + if not (dx > 0 and dw > 0): raise RuntimeError(f"both tensors need to be at least 1D, got {dx}D and {dw}D") + if x.shape[-1] != w.shape[axis_w:=-min(w.ndim,2)]: raise RuntimeError(f"cannot dot {x.shape} and {w.shape}") + x = x.reshape(*x.shape[0:-1], *[1]*min(dx-1, dw-1, 1), x.shape[-1]) + w = w.reshape(*w.shape[0:-2], *[1]*min(dx-1, dw-1, 1), *w.shape[axis_w:]).transpose(-1, axis_w) + return (x*w).sum(-1, dtype=dtype).cast(least_upper_dtype(x.dtype, w.dtype) if dtype is None else to_dtype(dtype)) + + def matmul(self, x:Self, reverse=False, dtype:DTypeLike|None=None) -> Self: + """ + Performs matrix multiplication between two tensors. + + You can pass in the `reverse` keyword argument to control the order of the matrix multiplication. + You can pass in the optional `dtype` keyword argument to control the data type of the accumulation. + + ```python exec="true" source="above" session="tensor" result="python" + a = Tensor([[1, 2], [3, 4]]) + b = Tensor([[5, 6], [7, 8]]) + print(a.matmul(b).numpy()) + ``` + """ + return x.dot(self, dtype=dtype) if reverse else self.dot(x, dtype=dtype) + + def __matmul__(self, x:Self) -> Self: return self.matmul(x) + def __rmatmul__(self, x:Self) -> Self: return self.matmul(x, True) + + @classmethod + def einsum(cls, formula:str, *operands:Self|Sequence[Self], dtype:DTypeLike|None=None) -> Self: + """ + Sums the product of the elements of the input tensors according to a formula based on the Einstein summation convention. + + See: https://pytorch.org/docs/stable/generated/torch.einsum.html + + ```python exec="true" source="above" session="tensor" result="python" + x = Tensor([[1, 2], [3, 4]]) + y = Tensor([[5, 6], [7, 8]]) + print(Tensor.einsum("ij,ij->", x, y).numpy()) + ``` + """ + xs, formula = list(argfix(*operands)), formula.replace(" ", "") + # expand ellipsis to letters, determine output + if "..." in formula: + ell, lhs = "".join(c for c in string.ascii_letters if c not in formula), (formula.split("->") + [""])[0] + ell_n = [max(0, x.ndim - len(s) + 3) if "..." in s else 0 for s, x in zip(lhs.split(","), xs)] + for i, (s, x) in enumerate(zip(inputs := lhs.split(","), xs)): inputs[i] = s.replace("...", ell[max(ell_n)-ell_n[i]:max(ell_n)]) + lhs, auto = ",".join(inputs), "".join(sorted(c for c in lhs if lhs.count(c) == 1 and c.isalpha() and c not in ell)) + formula = f"{lhs}->{formula.split('->')[1].replace('...', ell[:max(ell_n)]) if '->' in formula else ell[:max(ell_n)] + auto}" + lhs, rhs = formula.split("->") if "->" in formula else (formula, "".join(sorted(c for c in formula if formula.count(c)==1 and c.isalpha()))) + inputs = lhs.split(",") + if len(xs) != len(inputs): raise ValueError(f"number of operands doesn't match, expected {len(inputs)}, got {len(xs)}") + # trace: take diagonal when letter repeats in single input + for i, (s, x) in enumerate(zip(inputs, xs)): + for c in set(s): + while s.count(c) > 1: + j, k, n = s.index(c), s.index(c, s.index(c)+1), x.shape[s.index(c)] + perm = [d for d in range(x.ndim) if d not in (j,k)]+[j,k] + x = x.permute(perm).flatten(-2).pad(((0,0),)*(x.ndim-2)+((0,n),)).unflatten(-1,(n,n+1))[...,0] if x.ndim > 2 else x.diagonal() + s = s[:k] + s[k+1:] + inputs[i], xs[i] = s, x + # check sizes and build sorted alphabet + sz = merge_dicts([dict(zip(s, x.shape)) for s, x in zip(inputs, xs)]) + alpha = sorted(sz) + # align all tensors to alphabet, multiply, sum non-output, permute to output order + xs = [x.permute(*[s.index(c) for c in sorted(s)]).reshape([sz[c] if c in s else 1 for c in alpha]) if s else x + for s, x in zip(inputs, xs)] + return xs[0].uprod(*xs[1:]).sum([i for i,c in enumerate(alpha) if c not in rhs], dtype=dtype).permute(argsort(argsort(list(rhs)))) + + def gradient(self, *targets:Self, gradient:Self|None=None) -> list[Self]: + """ + Computes the gradient of the targets with respect to self. + + ```python exec="true" source="above" session="tensor" result="python" + x = Tensor.eye(3) + y = Tensor([[2.0,0,-2.0]]) + z = y.matmul(x).sum() + dx, dy = z.gradient(x, y) + + print(dx.tolist()) # dz/dx + print(dy.tolist()) # dz/dy + ``` + """ + assert gradient is not None or self.shape == tuple(), "when no gradient is provided, backward must be called on a scalar tensor" + if not (self.is_floating_point() and all(t.is_floating_point() for t in targets)): raise RuntimeError("only float Tensors have gradient") + from tinygrad.mixin.gradient import compute_gradient + if gradient is None: gradient = self.const_like(1.0) + target_uops = [t._uop for t in targets] + grads = compute_gradient(self._uop, gradient._uop, set(target_uops)) + return [self._wrap_uop(grads[x] if x in grads else x.const_like(0)) for x in target_uops] + + def min(self, axis:int|Sequence[int]|None=None, keepdim=False) -> Self: + """ + Returns the minimum value of the tensor along the specified axis or axes. + + You can pass in `axis` and `keepdim` keyword arguments to control the axis along + which the minimum is computed and whether the reduced dimensions are retained. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 0, 2], [5, 4, 3]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.min().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.min(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.min(axis=1, keepdim=True).numpy()) + ``` + """ + return self._inverse().max(axis=axis, keepdim=keepdim)._inverse() + + def mean(self, axis:int|Sequence[int]|None=None, keepdim=False) -> Self: + """ + Returns the mean value of the tensor along the specified axis or axes. + + You can pass in `axis` and `keepdim` keyword arguments to control the axis along + which the mean is computed and whether the reduced dimensions are retained. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.normal(2, 3, mean=2.5, std=0.5) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.mean().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.mean(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.mean(axis=1).numpy()) + ``` + """ + output_dtype = self.dtype if dtypes.is_float(self.dtype) else dtypes.float32 + numerator = self.cast(sum_acc_dtype(self.dtype)).sum(axis=axis, keepdim=keepdim) + denominator = prod([si for si, so in zip(self.shape, self.sum(axis=axis, keepdim=True).shape) if resolve(si != so)]) + return numerator.div(denominator).cast(output_dtype) # type: ignore[arg-type] + + def var(self, axis:int|Sequence[int]|None=None, keepdim=False, correction=1) -> Self: + """ + Returns the variance of the tensor along the specified axis or axes. + + You can pass in `axis`, `keepdim`, and `correction` keyword arguments to control the axis along + which the variance is computed, whether the reduced dimensions are retained, and the Bessel's correction applied. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.normal(2, 3, mean=2.5, std=0.5) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.var().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.var(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.var(axis=1).numpy()) + ``` + """ + squares = (self - self.mean(axis=axis, keepdim=True)).square() + n = prod([si for si, so in zip(self.shape, squares.sum(axis=axis, keepdim=True).shape) if resolve(si != so)]) + reduced = squares.sum(axis=axis, keepdim=keepdim) + denominator = reduced.const_like(n) - correction # type: ignore[arg-type] + # TODO: remove relu? + return reduced.div(denominator.relu()) + + def var_mean(self, axis:int|Sequence[int]|None=None, keepdim=False, correction=1) -> tuple[Self, Self]: + """ + Calculates the variance and mean over the dimensions specified by dim. + Syntactic sugar around `Tensor.var` and `Tensor.mean` to match `torch.var_mean`. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.normal(2, 3, mean=2.5, std=0.5) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + var, mean = t.var_mean() + print(var.numpy(), mean.numpy()) + ``` + """ + return self.var(axis, keepdim, correction), self.mean(axis, keepdim) + + def std(self, axis:int|Sequence[int]|None=None, keepdim=False, correction=1) -> Self: + """ + Returns the standard deviation of the tensor along the specified axis or axes. + + You can pass in `axis`, `keepdim`, and `correction` keyword arguments to control the axis along + which the standard deviation is computed, whether the reduced dimensions are retained, and the Bessel's correction applied. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.normal(2, 3, mean=2.5, std=0.5) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.std().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.std(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.std(axis=1).numpy()) + ``` + """ + return self.var(axis, keepdim, correction).sqrt() + + def std_mean(self, axis:int|Sequence[int]|None=None, keepdim=False, correction=1) -> tuple[Self, Self]: + """ + Calculates the standard deviation and mean over the dimensions specified by dim. + Syntactic sugar around `Tensor.std` and `Tensor.mean` to match `torch.std_mean`. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.normal(2, 3, mean=2.5, std=0.5) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + std, mean = t.std_mean() + print(std.numpy(), mean.numpy()) + ``` + """ + return self.std(axis, keepdim, correction), self.mean(axis, keepdim) + + def normalize(self, p:float=2.0, dim:int=1, eps:float=1e-12) -> Self: + """ + Performs Lp normalization of the tensor along the specified dimension. + + See: https://pytorch.org/docs/stable/generated/torch.nn.functional.normalize.html + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.normalize().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.normalize(p=1, dim=0).numpy()) + ``` + """ + den = self.ne(0).sum(dim, keepdim=True) if p == 0 else self.abs().pow(p).sum(dim, keepdim=True).pow(1/p) + return self / den.maximum(eps) + + def logsumexp(self, axis=None, keepdim=False) -> Self: + """ + Computes the log-sum-exp of the tensor along the specified axis or axes. + + The log-sum-exp function is a numerically stable way to compute the logarithm of the sum of exponentials. + + You can pass in `axis` and `keepdim` keyword arguments to control the axis along + which the log-sum-exp is computed and whether the reduced dimensions are retained. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.logsumexp().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.logsumexp(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.logsumexp(axis=1).numpy()) + ``` + """ + m = self.max(axis=axis, keepdim=True).detach() + return (self - m).exp().sum(axis=axis, keepdim=keepdim).log() + (m if keepdim else m.squeeze(axis)) + + def _softmax(self, axis, dtype:DTypeLike|None=None) -> tuple[Self, Self, Self]: + m = self - self.max(axis=axis, keepdim=True).detach() + if dtype is not None: m = m.cast(to_dtype(dtype)) + e = m.exp() + return m, e, e.sum(axis=axis, keepdim=True) + + def softmax(self, axis=-1, dtype:DTypeLike|None=None) -> Self: + """ + Applies the softmax function to the tensor along the specified axis. + + Rescales the elements of the tensor such that they lie in the range [0, 1] and sum to 1. + + You can pass in the `axis` keyword argument to control the axis along which the softmax is computed. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.softmax().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.softmax(axis=0).numpy()) + ``` + """ + _, e, ss = self._softmax(axis, dtype) + return e * ss.reciprocal() + + def log_softmax(self, axis=-1, dtype:DTypeLike|None=None) -> Self: + """ + Applies the log-softmax function to the tensor along the specified axis. + + The log-softmax function is a numerically stable alternative to the softmax function in log space. + + You can pass in the `axis` keyword argument to control the axis along which the log-softmax is computed. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.log_softmax().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.log_softmax(axis=0).numpy()) + ``` + """ + m, _, ss = self._softmax(axis, dtype) + return m - ss.log() + + def softmin(self, axis=-1, dtype:DTypeLike|None=None) -> Self: + """ + Applies the softmin function to the tensor along the specified axis. + + Rescales the elements of the tensor such that they lie in the range [0, 1] and sum to 1. + + You can pass in the `axis` keyword argument to control the axis along which the softmin is computed. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.softmin().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.softmin(axis=0).numpy()) + ``` + """ + return (-self).softmax(axis, dtype) + + def cat(self, *args:Self, dim:int=0) -> Self: + """ + Concatenates self with other tensors in `args` along an axis specified by `dim`. + All tensors must have the same shape except in the concatenating dimension. + + ```python exec="true" source="above" session="tensor" result="python" + t0, t1, t2 = Tensor([[1, 2]]), Tensor([[3, 4]]), Tensor([[5, 6]]) + print(t0.cat(t1, t2, dim=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t0.cat(t1, t2, dim=1).numpy()) + ``` + """ + dim = self._resolve_dim(dim) + for arg in args: assert arg.ndim==self.ndim and all(ti==ai for i,(ti,ai) in enumerate(zip(self.shape, arg.shape)) if i!=dim) + tensors = [self, *args] + if all(t.shape[dim] == self.shape[dim] for t in args): return self.stack(*args, dim=dim).flatten(dim, dim+1) + dim_cumsum = list(itertools.accumulate([t.shape[dim] for t in tensors], initial=0)) + padded = [t.pad(tuple((dim_cumsum[i], dim_cumsum[-1]-dim_cumsum[i+1]) if j==dim else None for j in range(t.ndim))) for i,t in enumerate(tensors)] + return padded[0].usum(*padded[1:]) + + def _cumalu(self, axis:int, op:Ops) -> Self: + assert self.shape[axis] != 0 and op in (Ops.ADD, Ops.MAX, Ops.MUL) + pads = (None,)*(self.ndim-1) + ((self.shape[axis]-1, 0),) + pooled = self.transpose(axis,-1)._pad_constant(pads, identity_element(op, self.dtype))._pool((self.shape[axis],)) + return getattr(pooled, {Ops.ADD: "sum", Ops.MAX: "max", Ops.MUL: "prod"}[op])(-1).transpose(axis, -1) + + def _split_cumalu(self, axis:int, op:Ops) -> Self: + axis = self._resolve_dim(axis) + if self.ndim == 0 or 0 in self.shape: return self.cast(self.sum().dtype) if op is Ops.ADD else self + # TODO: someday the optimizer will find this on its own + # for now this is a two stage cumsum + SPLIT = 256 + value = identity_element(op, self.dtype) + if not isinstance(s:=self.shape[axis], int) or s <= SPLIT*2: return self._cumalu(axis, op) + chunks = self.transpose(axis,-1)._pad_constant((None,)*(self.ndim-1)+((round_up(s,SPLIT)-s,0),), value).unflatten(-1,(-1,SPLIT))._cumalu(-1, op) + base = chunks[..., -1]._cumalu(-1, op)._pad_constant((None,)*(chunks.ndim-2) + ((1, -1),), value) + return chunks.alu(op, base.unsqueeze(-1)).flatten(start_dim=-2)[..., -s:].transpose(axis,-1) + + def cumsum(self, axis:int=0) -> Self: + """ + Computes the cumulative sum of the tensor along the specified `axis`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.ones(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.cumsum(1).numpy()) + ``` + """ + return self._split_cumalu(axis, Ops.ADD) + + def cumprod(self, axis:int) -> Self: + """ + Computes the cumulative product of the elements of the tensor along the specified `axis`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(1, 7).reshape(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.cumprod(axis=0).numpy()) + ``` + """ + return self._split_cumalu(axis, Ops.MUL) + + def cummax(self, axis:int=0) -> tuple[Self, Self]: + """ + Computes the cumulative max of the tensor along `axis`, returning (values, indices). + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([0, 1, -1, 2, -2, 3, -3]) + values, indices = t.cummax(0) + print(values.numpy()) + print(indices.numpy()) + ``` + """ + if self.ndim == 0: return self._split_cumalu(axis, Ops.MAX), type(self).zeros(self.shape, dtype=dtypes.int32, buffer=False) + values, n = self._split_cumalu(axis, Ops.MAX), int(self.shape[axis]) + x, values_t = self.transpose(axis, -1), values.transpose(axis, -1) + match = x.unsqueeze(-1).eq(values_t.unsqueeze(-2)) * type(self).ones(n, n, dtype=dtypes.bool, buffer=False).triu() + idx = (-(match * type(self).arange(n, 0, -1).reshape(n, 1)).max(-2) + n).cast(dtypes.int32) + return values, idx.transpose(-1, axis) + + def cummin(self, axis:int=0) -> tuple[Self, Self]: + """ + Computes the cumulative min of the tensor along `axis`, returning (values, indices). + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([0, 1, -1, 2, -2, 3, -3]) + values, indices = t.cummin(0) + print(values.numpy()) + print(indices.numpy()) + ``` + """ + values, indices = self._inverse().cummax(axis) + return values._inverse(), indices + + def logcumsumexp(self, axis=0) -> Self: + """ + Computes the log-cumsum-exp of the tensor along the specified axis or axes. + + The log-cumsum-exp function is a numerically stable way to compute the logarithm of the cumulative sum of exponentials. + + You can pass in the `axis` keyword argument to control the axis along which + the log-cumsum-exp is computed. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.logcumsumexp().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.logcumsumexp(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.logcumsumexp(axis=1).numpy()) + ``` + """ + if self.ndim == 0: return self + x = self.transpose(axis, -1) + last_dim_size = x.shape[-1] + x_unsqueezed = x.unsqueeze(-2) + x_cummax = x.cummax(-1)[0].detach() + mask = type(self).ones(last_dim_size, last_dim_size, buffer=False, dtype=dtypes.bool).tril() + ret = mask.where(x_unsqueezed - x_cummax.unsqueeze(-1), self.dtype.min).exp().sum(-1).log() + x_cummax + return ret.transpose(-1, axis) + + def argmax(self, axis=None, keepdim=False) -> Self: + """ + Returns the indices of the maximum value of the tensor along the specified axis. + + You can pass in `axis` and `keepdim` keyword arguments to control the axis along + which the maximum is computed and whether the reduced dimensions are retained. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 0, 2], [5, 4, 3]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.argmax().numpy()) # Returns the index of the maximum value in the flattened tensor. + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.argmax(axis=0).numpy()) # Returns the indices of the maximum values along axis 0. + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.argmax(axis=1).numpy()) # Returns the indices of the maximum values along axis 1. + ``` + """ + if axis is None: return self.flatten().argmax(0) + axis = self._resolve_dim(axis) + m = self.eq(self.max(axis=axis, keepdim=True)) + idx = m * type(self).arange(self.shape[axis], 0, -1).reshape(self.shape[axis], *[1]*(self.ndim-axis-1)) + return (self.shape[axis] - idx.max(axis=axis, keepdim=keepdim)).cast(dtypes.int32) + + def argmin(self, axis=None, keepdim=False) -> Self: + """ + Returns the indices of the minimum value of the tensor along the specified axis. + + You can pass in `axis` and `keepdim` keyword arguments to control the axis along + which the minimum is computed and whether the reduced dimensions are retained. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 0, 2], [5, 4, 3]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.argmin().numpy()) # Returns the index of the minimum value in the flattened tensor. + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.argmin(axis=0).numpy()) # Returns the indices of the minimum values along axis 0. + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.argmin(axis=1).numpy()) # Returns the indices of the minimum values along axis 1. + ``` + """ + return self._inverse().argmax(axis=axis, keepdim=keepdim) + + def sort(self, dim:int=-1, descending:bool=False) -> tuple[Self, Self]: + """ + Performs a bitonic sort on the tensor along the specified dimension. + + Order of indices for equivalent elements is always preserved. + + See: https://en.wikipedia.org/wiki/Bitonic_sorter + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[0.1, 0.5, 1.2, 3.4, 2.1], [2.2, 1.9, 0.3, 4.5, 0.8]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + sorted_values, indices = t.sort(dim=1, descending=True) + print(sorted_values.numpy()) + print(indices.numpy()) + ``` + """ + x, dim = self, self._resolve_dim(dim) + if (orig_len := int(x.shape[dim])) <= 1: return x, x.const_like(0, dtypes.default_int) + # pad to power of 2 + n_stages = (orig_len-1).bit_length() + pads = tuple((0, 2**n_stages - orig_len) if i == dim else None for i in range(x.ndim)) + x = x._pad_constant(pads, x.dtype.min if descending else x.dtype.max).unflatten(dim, (2,)*n_stages) + # https://en.wikipedia.org/wiki/Bitonic_sorter#/media/File:BitonicSort1.svg + for stage in range(1, n_stages+1): + if stage != n_stages: + # flip so arrows of green boxes point the same way as blue boxes + crossover_dim = dim + n_stages - stage - 1 + blue_box, green_box = x.split(1, crossover_dim) + flip_dims = tuple(-i for i in range(1, stage+1+(self.ndim-dim))) + x = (blue_box.cat(green_box.flip(flip_dims), dim=crossover_dim)).contiguous() + for substage in range(stage-1, -1, -1): + partner_dim = dim + n_stages - substage - 1 + x_top, x_bottom = x.split(1, partner_dim) + x_larger, x_smaller = x_top.maximum(x_bottom), x_top.minimum(x_bottom) + x = (x_larger.cat(x_smaller, dim=partner_dim) if descending else x_smaller.cat(x_larger, dim=partner_dim)).contiguous() + if stage != n_stages: + # flip wires back to undo the crossover + blue_box, flipped_green_box = x.split(1, crossover_dim) + x = blue_box.cat(flipped_green_box.flip(flip_dims), dim=crossover_dim) + x = x.flatten(dim, dim+n_stages-1).shrink_to(self.shape) + # compute indices for sorted values + mask = type(self).ones(orig_len, orig_len, dtype=dtypes.bool, buffer=False).tril() + mask = mask.reshape((None, None) + (1,)*(self.ndim-dim-1)) + def compute_counts(t:Self): return (mask & t.unsqueeze(dim).eq(t.unsqueeze(dim+1))).sum(dim+1) + count_orig, count_sorted = compute_counts(self), compute_counts(x) + cond = self.unsqueeze(dim+1).eq(x.unsqueeze(dim)) & count_orig.unsqueeze(dim+1).eq(count_sorted.unsqueeze(dim)) + idx = type(self).arange(orig_len).reshape(tuple(orig_len if i == dim else 1 for i in range(x.ndim))) + idx = (cond * idx.unsqueeze(dim+1)).sum(dim) + return x, idx + + def argsort(self, dim:int=-1, descending:bool=False) -> Self: + """ + Returns the indices that sort input tensor along given `dimension` in given `descending` order by value. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[2, 3, 4, 1], [1, 4, 3, 2]]) + print(t.argsort().numpy()) + ``` + """ + return self.sort(dim, descending)[1] + + def topk(self, k:int, dim:int=-1, largest:bool=True, sorted_:bool=True) -> tuple[Self, Self]: + """ + Computes the top-k elements of the tensor along the specified `dim`. + + Order of indices for equivalent elements is always preserved. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[0.1, 0.5, 1.2, 3.4, 2.1], [2.2, 1.9, 0.3, 4.5, 0.8]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + topk_values, topk_indices = t.topk(2, dim=1) + print(topk_values.numpy()) + print(topk_indices.numpy()) + ``` + """ + if not sorted_: raise NotImplementedError("topk with sorted_=False is not supported") + if k > self.shape[dim:=self._resolve_dim(dim)]: raise ValueError(f"selected index {k=} is out of range") + x, idx = self.sort(dim, descending=largest) + topk_shape = tuple(k if i == dim else None for i in range(self.ndim)) + return x.shrink_to(topk_shape), idx.shrink_to(topk_shape) + + def allclose(self, other:Self, rtol:float=1e-05, atol:float=1e-08, equal_nan=False) -> Self: + """ + Check if all self and other are close. + """ + return self.isclose(other, rtol=rtol, atol=atol, equal_nan=equal_nan).all() + + # helper function commonly used for indexing + def _one_hot_along_dim(self, num_classes:sint, dim:int=-1) -> Self: + if not dtypes.is_int(self.dtype): raise RuntimeError(f"_one_hot_along_dim expects int index tensor, getting {self.dtype}") + offset = self.ndim - self._resolve_dim(dim) - 1 + return self.eq(type(self).arange(num_classes).reshape((num_classes,) + (1,) * offset)) + + def one_hot(self, num_classes:int) -> Self: + """ + Converts `self` to a one-hot tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([0, 1, 3, 3, 4]) + print(t.one_hot(5).numpy()) + ``` + """ + if not dtypes.is_int(self.dtype): raise RuntimeError(f"expect integer dtype, getting {self.dtype=}") + if num_classes < 0: raise ValueError(f"num_classes must be non-negative, got {num_classes}") + return self[..., None]._one_hot_along_dim(num_classes).where(1, 0) + + def gather(self, dim:int, index:Self) -> Self: + """ + Gathers values along an axis specified by `dim`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 2], [3, 4]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.gather(1, Tensor([[0, 0], [1, 0]])).numpy()) + ``` + """ + if index.device is not None and self.device is not None and index.device != self.device: + raise RuntimeError(f"expected index and self on the same device, {index.device=}, {self.device=}") + if index.ndim != self.ndim: raise RuntimeError(f"self.ndim must equal index.ndim, {self.ndim=}, {index.ndim=}") + dim = self._resolve_dim(dim) + assert all(s >= i for d,(s,i) in enumerate(zip(self.shape, index.shape)) if d != dim), "requires self.shape[d] >= index.shape[d] for all d != dim" + x = self.shrink_to(tuple(i if d != dim else None for d,i in enumerate(index.shape))).unsqueeze(-1).transpose(-1, dim) + return (index.unsqueeze(-1)._one_hot_along_dim(self.shape[dim]).where(x, 0)).sum(-1, dtype=self.dtype) + + def interpolate(self, size:tuple[int, ...], mode:str="linear", align_corners:bool=False) -> Self: + """ + Downsamples or Upsamples to the input `size`, accepts 0 to N batch dimensions. + + The interpolation algorithm is selected with `mode` which currently only supports `linear`, `nearest` and `nearest-exact`. + To run `bilinear` or `trilinear`, pass in a 2D or 3D size. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 2, 3, 4], [21, 22, 23, 24], [41, 42, 43, 44]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.interpolate(size=(2,3), mode="linear").numpy()) + ``` + """ + assert isinstance(size, (tuple,list)) and all_int(size) and 0 < len(size) <= self.ndim, f"invalid {size=}" + assert mode in ("linear", "nearest", "nearest-exact"), "only supports linear, nearest or nearest-exact interpolate" + assert not (align_corners and mode != "linear"), "align_corners option can only be set with the interpolating mode linear" + x, expand = self, list(self.shape) + for i in range(-1,-len(size)-1,-1): + in_sz, reshape = int(self.shape[i]), [1] * self.ndim + reshape[i] = expand[i] = size[i] + if mode == "linear": + arr = type(self).arange(size[i]) + num, den = (arr*(in_sz-1), size[i]-1) if align_corners else ((arr*2+1)*in_sz - size[i], size[i]*2) + num = num.clip(0, (in_sz-1)*den) + low, high, perc = [y.reshape(reshape).expand(expand) for y in (num//den, (num+den-1)//den, (num % den).cast(dtypes.float32)/den)] + x = x.gather(i, low).lerp(x.gather(i, high), perc) + else: + scale, arr = in_sz / size[i], type(self).arange(size[i], dtype=dtypes.float32) + index = (scale*(arr+0.5) if mode=="nearest-exact" else scale*arr).cast(dtypes.int32).reshape(reshape).expand(expand) + x = x.gather(i, index) + return x.cast(self.dtype) + + def _pre_scatter(self, dim:int, index:Self, src:Self) -> tuple[Self, Self]: + if index.device is not None and self.device is not None and index.device != self.device: + raise RuntimeError(f"expected index and self on the same device, {index.device=}, {self.device=}") + if src.device is not None and self.device is not None and src.device != self.device: + raise RuntimeError(f"expected src and self on the same device, {src.device=}, {self.device=}") + dim = self._resolve_dim(dim) + assert index.ndim == self.ndim == src.ndim, f"self.ndim, index.ndim and src.ndim must all equal, {self.ndim=} {index.ndim=} {src.ndim=}" + assert all((d == dim or self_ >= index_) and src_ >= index_ for d,(self_,index_,src_) in enumerate(zip(self.shape, index.shape, src.shape))), \ + f"All dimensions of {index.shape=} should be <= to all dimensions of {src.shape=} and all dimensions except dimension {dim} of {self.shape=}" + if self.dtype != src.dtype: raise RuntimeError(f"expect {self.dtype=} to be equal to {src.dtype=}") + # shrink src to index shape to shrink away the unused values + src = src.shrink_to(index.shape) + # prepare src and mask for reduce with respect to dim + src = src.unsqueeze(-1).expand(*src.shape, self.shape[dim]).transpose(-1, dim) + mask = index.unsqueeze(-1)._one_hot_along_dim(self.shape[dim]).transpose(-1, dim) + # pad src and mask to self.shape so that reduce can be done with padded values as no-ops + return src.pad_to(*self.shape, None), mask.pad_to(*self.shape, None) + + def scatter_reduce(self, dim:int, index:Self, src:Self, reduce:Literal["sum", "prod", "mean", "amax", "amin"], + include_self:bool=True) -> Self: + """ + Scatters `src` values along an axis specified by `dim`. + Apply `"sum"`, `"prod"`, `"mean"`, `"amax"`, or `"amin"` reduction operations with `reduce`. + + Set `include_self=False` to exclude values in the `self` Tensor from the reduction. + + ```python exec="true" source="above" session="tensor" result="python" + src = Tensor.arange(1, 11).cast(dtypes.float).reshape(2, 5) + print(src.numpy()) + index = Tensor([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]) + print(index.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.ones(1, 5, dtype=src.dtype).scatter_reduce(0, index, src, reduce='sum').numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.ones(1, 5, dtype=src.dtype).scatter_reduce(0, index, src, reduce='prod').numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.ones(1, 5, dtype=src.dtype).scatter_reduce(0, index, src, reduce='mean', include_self=False).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([[-10, 20, 0, 5, 10]], dtype=src.dtype).scatter_reduce(0, index, src, reduce='amax').numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor([[-10, 20, 0, 5, 10]], dtype=src.dtype).scatter_reduce(0, index, src, reduce='amin').numpy()) + ``` + """ + src, mask = self._pre_scatter(dim, index, src) + def _inv_mask(a:Self|PyConst, b:Self|PyConst) -> Self: return mask.any(-1).logical_not().where(a, b) + if reduce == "sum": return mask.where(src, 0).sum(-1).add(self if include_self else _inv_mask(self, 0)) + if reduce == "prod": return mask.where(src, 1).prod(-1).mul(self if include_self else _inv_mask(self, 1)) + if reduce == "amax": return mask.where(src, m := src.dtype.min).max(-1).maximum(self if include_self else _inv_mask(self, m)) + if reduce == "amin": return mask.where(src, m := src.dtype.max).min(-1).minimum(self if include_self else _inv_mask(self, m)) + if reduce == "mean": + count = mask.where(1, 0).sum(-1).add(1 if include_self else _inv_mask(1, 0)) + return mask.where(src, 0).sum(-1).add(self if include_self else _inv_mask(self, 0)).div(count) + raise RuntimeError(f"{reduce=} must be one of 'sum', 'prod', 'mean', 'amax', 'amin'") + + def scatter(self, dim:int, index:Self, src:Self|PyConst, reduce:Literal['multiply', 'add']|None=None) -> Self: + """ + Scatters `src` values along an axis specified by `dim`. + Apply `add` or `multiply` reduction operation with `reduce`. + + NOTE: To use the `reduce` argument with a Tensor `src`, see `Tensor.scatter_reduce`. + + ```python exec="true" source="above" session="tensor" result="python" + src = Tensor.arange(1, 11).reshape(2, 5) + print(src.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + index = Tensor([[0, 1, 2, 0]]) + print(Tensor.zeros(3, 5, dtype=src.dtype).scatter(0, index, src).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + index = Tensor([[0, 1, 2], [0, 1, 4]]) + print(Tensor.zeros(3, 5, dtype=src.dtype).scatter(1, index, src).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.full((2, 4), 2.0).scatter(1, Tensor([[2], [3]]), 1.23, reduce='multiply').numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.full((2, 4), 2.0).scatter(1, Tensor([[2], [3]]), 1.23, reduce='add').numpy()) + ``` + """ + if reduce not in {None, "add", "multiply"}: raise TypeError(f"{reduce=} must be one of None, 'multiply', or 'add'") + if isinstance(src, (int, float, bool)): src = type(self).full(index.shape, src, dtype=self.dtype, buffer=False) + elif reduce: raise TypeError("non-scalar src is not supported with reduce arg. use scatter_reduce") + if reduce == "add": return self.scatter_reduce(dim, index, src, "sum", include_self=True) + if reduce == "multiply": return self.scatter_reduce(dim, index, src, "prod", include_self=True) + src, mask = self._pre_scatter(dim, index, src) + return self._masked_merge(src, mask, (-1,)) + + def _masked_merge(self, values:Self, mask:Self, axes:tuple[int, ...]) -> Self: + # reduce such that if mask contains repeated indices the last one remains + for dim in reversed(axes): + mask, values = functools.reduce(lambda x,y: (x[0]|y[0], y[0].where(y[1], x[1])), zip(mask.split(1, dim), values.split(1, dim))) + # remove extra dims from reduce + for dim in reversed(axes): mask, values = mask.squeeze(dim), values.squeeze(dim) + # select from values for each True element in mask else select from self + return mask.where(values, self) + + def masked_select(self, mask, size:int|None=None, fill_value:ConstType=0): + """ + Selects elements from `self` based on the boolean `mask`. + + With `size=None` (default), output length equals the number of `True` values (not jittable). + With `size=N`, output length is `N`, padded with `fill_value` or truncated (jittable). + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) + mask = Tensor([[True, False, True], [False, True, False], [False, False, True]]) + print(t.numpy()) + print(mask.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.masked_select(mask).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.masked_select(mask, size=6, fill_value=-1).numpy()) + ``` + """ + if not dtypes.is_bool(mask.dtype): raise RuntimeError(f"masked_select expects bool mask tensor, got {mask.dtype}") + x, mask = self.flatten(), mask._broadcast_to(self.shape).flatten() + mask_cumsum = mask.cumsum() + if size is None: + counts = type(self).zeros(mask_cumsum[-1].item() if mask.numel() else 0, dtype=dtypes.int32, buffer=False) + return x[counts.scatter(0, mask_cumsum, 1, reduce='add').cumsum()] + counts = type(self).zeros(size, dtype=dtypes.int32, buffer=False).scatter(0, mask_cumsum, 1, reduce='add') + return (type(self).arange(size) < mask.sum()).where(x[counts.cumsum()], fill_value).cast(self.dtype) + + def nonzero(self, size:int|None=None, fill_value:ConstType=0) -> Self: + """ + Returns the indices of the elements that are non-zero. + + With `size=None` (default), output shape is `(n_nonzero, ndim)` (not jittable). + With `size=N`, output shape is `(N, ndim)`, padded with `fill_value` or truncated (jittable). + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 0, 2, 0, 3]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.nonzero().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 0], [0, 2]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.nonzero().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.nonzero(size=3, fill_value=-1).numpy()) + ``` + """ + if self.ndim == 0: + return type(self).zeros(size if size is not None else int(self.ne(0).item()), 0, dtype=dtypes.int32, device=self.device) + mask = self.ne(0).flatten() + indices = type(self).stack(*[type(self).arange(s).reshape(*[1]*i, s, *[1]*(self.ndim-i-1)).expand(self.shape).flatten() + for i, s in enumerate(self.shape)], dim=-1) + return indices.masked_select(mask.unsqueeze(-1).expand(*mask.shape, self.ndim), + size=size*self.ndim if size is not None else None, fill_value=fill_value).reshape(-1, self.ndim) + + # ***** functional nn ops ***** + + def sequential(self, ll:list[Callable[[Self], Self]]) -> Self: + """ + Applies a sequence of functions to `self` chaining the output of each function to the input of the next. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3]) + print(t.sequential([lambda x: x * 2, lambda x: x + 1]).numpy()) + ``` + """ + return functools.reduce(lambda x,f: f(x), ll, self) + + def linear(self, weight:Self, bias:Self|None=None, dtype:DTypeLike|None=None) -> Self: + """ + Applies a linear transformation to `self` using `weight` and `bias`. + + See: https://pytorch.org/docs/stable/generated/torch.nn.Linear.html + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 2], [3, 4]]) + weight = Tensor([[1, 2], [3, 4]]) + bias = Tensor([1, 2]) + print(t.linear(weight, bias).numpy()) + ``` + """ + if dtype is not None: + dt = to_dtype(dtype) + return self.cast(dt).linear(weight.cast(dt), bias.cast(dt) if bias is not None else bias) + x = self.mul(weight) if len(weight.shape) == 1 else self.dot(weight) + return x.add(bias) if bias is not None else x + + def _apply_ceil_mode(self, pads:Sequence[int], k_:tuple[sint, ...], s_:int|tuple[int, ...], d_:int|tuple[int, ...]) -> list[int]: + (d_,s_), i_ = (make_tuple(x, len(k_)) for x in (d_,s_)), self.shape[-len(k_):] + grouped_pads = list(flat_to_grouped(pads)) + # https://arxiv.org/pdf/1603.07285 section 5.1, relationship 15. + o_ = [ceildiv(i+pB+pA - (d*(k-1)+1), s) + 1 for i,d,k,s,(pB,pA) in zip(i_,d_,k_,s_,grouped_pads)] + for dim,(o,i,s,k,d,(pB,pA)) in enumerate(zip(o_,i_,s_,k_,d_,grouped_pads)): + # we have to do additional padding before `_pool` so that `o_` in `_pool` is calculated correctly + # `s*(o-1) + (d*(k-1)+1) - (i+pB+pA)` -> last_sliding_window_start + full_kernel_size - padded_input_shape + # we decrease padding in the case that a sliding window starts in the end padded region, thereby decreasing `o_` in `_pool` + # `smax(s*(o-1) - (pB+i-1), 0)` -> last_sliding_window_start - (pad_before + input_size - zero_offset) + grouped_pads[dim] = (pB, pA + s*(o-1) + (d*(k-1)+1) - (i+pB+pA) - smax(s*(o-1) - (pB+i-1), 0)) + return flatten(reversed(grouped_pads)) + + # NOTE: these work for more than 2D + def avg_pool2d(self, kernel_size:tuple[int, ...]=(2,2), stride=None, dilation=1, padding:int|tuple[int, ...]=0, + ceil_mode=False, count_include_pad=True) -> Self: + """ + Applies average pooling over a tensor. + + This function supports three different types of `padding` + + 1. `int` (single value): + Applies the same padding value uniformly to all spatial dimensions. + + 2. `tuple[int, ...]` (length = number of spatial dimensions): + Specifies a distinct padding value for each spatial dimension in the form `(padding_height, padding_width, ...)`. + + 3. `tuple[int, ...]` (length = 2 * number of spatial dimensions): + Specifies explicit padding for each side of each spatial dimension in the form + `(padding_left, padding_right, padding_top, padding_bottom, ...)`. + + When `ceil_mode` is set to `True`, output shape will be determined using ceil division. + When `count_include_pad` is set to `False`, zero padding will not be included in the averaging calculation. + + NOTE: unlike PyTorch, this implementation is not limited to only 2d pooling and instead works for any number of dimensions. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(25).reshape(1, 1, 5, 5) + print(t.avg_pool2d().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.avg_pool2d(ceil_mode=True).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.avg_pool2d(padding=1).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.avg_pool2d(padding=1, count_include_pad=False).numpy()) + ``` + """ + axis = tuple(range(-len(k_ := make_tuple(kernel_size, 2)), 0)) + s_ = stride if stride is not None else k_ + def pool(x:Self, padding_:Sequence[int]) -> Self: + return x._pad_constant(((0,0),)*(x.ndim-len(k_)) + flat_to_grouped(padding_), 0.0)._pool(k_, s_, dilation) + reg_pads = resolve_pool_pads(padding, len(k_)) + pads = self._apply_ceil_mode(reg_pads, k_, s_, dilation) if ceil_mode else reg_pads + if not count_include_pad: + return pool(self, pads).sum(axis) / pool(self.const_like(1), pads).sum(axis) + if not ceil_mode: return pool(self, pads).mean(axis) + return pool(self, pads).sum(axis) / pool(self._pad_constant(((0,0),)*(self.ndim-len(k_)) + flat_to_grouped(reg_pads), 0.0).const_like(1), + tuple(cp-rp for cp,rp in zip(pads, reg_pads))).sum(axis) + + def max_pool2d(self, kernel_size:tuple[int, ...]=(2,2), stride=None, dilation=1, padding:int|tuple[int, ...]=0, + ceil_mode=False, return_indices=False) -> Self | tuple[Self, Self]: + """ + Applies max pooling over a tensor. + + This function supports three different types of `padding` + + 1. `int` (single value): + Applies the same padding value uniformly to all spatial dimensions. + + 2. `tuple[int, ...]` (length = number of spatial dimensions): + Specifies a distinct padding value for each spatial dimension in the form `(padding_height, padding_width, ...)`. + + 3. `tuple[int, ...]` (length = 2 * number of spatial dimensions): + Specifies explicit padding for each side of each spatial dimension in the form + `(padding_left, padding_right, padding_top, padding_bottom, ...)`. + + When `ceil_mode` is set to `True`, output shape will be determined using ceil division. + When `return_indices` is set to `True`, the argmax will be returned along with the max values. + + NOTE: unlike PyTorch, this implementation is not limited to only 2d pooling and instead works for any number of dimensions. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(25).reshape(1, 1, 5, 5) + print(t.max_pool2d().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.max_pool2d(ceil_mode=True).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.max_pool2d(padding=1).numpy()) + ``` + """ + axis = tuple(range(-len(k_ := make_tuple(kernel_size, 2)), 0)) + s_ = stride if stride is not None else k_ + pads = resolve_pool_pads(padding, len(k_)) + if ceil_mode: pads = self._apply_ceil_mode(pads, k_, s_, dilation) + pooled = self._pad_constant(((0,0),)*(self.ndim-len(k_)) + flat_to_grouped(pads), self.dtype.min)._pool(k_, s_, dilation) + if not return_indices: return pooled.max(axis) + spatial_sz = int(prod(spatial_shape := self.shape[-len(k_):])) + idx = type(self).arange(spatial_sz, 0, -1).reshape(spatial_shape) + m = pooled.eq(pooled.max(axis, keepdim=True)) + idx = m * idx._pad_constant(((0,0),)*(idx.ndim-len(k_)) + flat_to_grouped(pads), idx.dtype.min)._pool(k_, s_, dilation) + return pooled.max(axis), spatial_sz - idx.max(axis) + + def max_unpool2d(self, indices:Self, kernel_size:tuple[int, ...]=(2,2), stride=None, dilation=1, padding:int|tuple[int, ...]=0, + output_size=None) -> Self: + """ + Performs a partial inverse of `max_pool2d` using the indices from the argmax. + + When `output_size` is provided, the output shape disambiguates to the provided shape. + + NOTE: unlike PyTorch, this implementation is not limited to only 2d pooling and instead works for any number of dimensions. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(1, 17).reshape(1, 1, 4, 4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + output, indices = Tensor.max_pool2d(t, return_indices=True) + print(output.numpy()) + print(indices.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(Tensor.max_unpool2d(output, indices).numpy()) + ``` + """ + bs,c,*spatial_shape = self.shape + if output_size is None: + k_,d_,s_ = (make_tuple(x, len(spatial_shape)) for x in (kernel_size, dilation, stride if stride is not None else kernel_size)) + p_ = flat_to_grouped(resolve_pool_pads(padding, len(spatial_shape))) + # https://arxiv.org/pdf/1603.07285 inverse of relationship 15 in section 5.1. + output_size = tuple((i-1)*s - (pB+pA) + (d*(k-1)+1) for i,k,d,s,(pA,pB) in zip(spatial_shape,k_,d_,s_,p_)) + else: output_size = output_size[-len(spatial_shape):] + ret = (indices.reshape(bs,c,1,-1)._one_hot_along_dim(prod(output_size), 2).where(self.reshape(bs,c,1,-1), 0)).sum(3) + return ret.reshape(bs,c,*output_size) + + # winograd conv 3 kernel f(4x4,3x3) see: http://arxiv.org/abs/1509.09308 + def _apply_winograd_matrix(self, mat, dims:int) -> Self: + # apply mat along each of the first `dims` axes: the separable transform kron(mat, ..., mat) @ self + # column k of mat is a stacked-CONST vector that folds into the arithmetic, so no constant is materialized + ret = self + for dim in range(dims): + ret = ret.transpose(0, dim) + ret = sum(type(self).const(tuple(float(m[k]) for m in mat), ret.dtype).reshape((len(mat),)+(1,)*(ret.ndim-1)) * ret[k] + for k in range(len(mat[0]))) + assert not isinstance(ret, int), "sum over empty winograd matrix" + ret = ret.transpose(0, dim) + return ret + + # TODO: winograd can be a rewrite rule like split_reduceop + def _conv2d_winograd(self, weight:Self, bias:Self|None, groups:int, padding:int|Sequence[int], dtype:DTypeLike|None) -> Self: + (bs,cin_), (cout,cin), HW = self.shape[:2], weight.shape[:2], weight.shape[2:] + padding_ = resolve_pool_pads(padding, len(HW)) + assert groups*cin == cin_ and len(self.shape) == len(weight.shape),\ + f"Input Tensor shape {self.shape} does not match the shape of the weights {weight.shape}. ({groups*cin} vs. {cin_})" + rcout, oyx = cout//groups, self.pad(padding_)._pool(HW, 1, 1).shape[2:-len(HW)] + HWI, HWO = (6,) * len(HW), (4,) * len(HW) # F(4x4,3x3) winograd tiles + winograd_G = [[1/4, 0, 0], [-1/6, -1/6, -1/6], [-1/6, 1/6, -1/6], [1/24, 1/12, 1/6], [1/24, -1/12, 1/6], [0, 0, 1]] + winograd_Bt = [[4, 0, -5, 0, 1, 0], [0, -4, -4, 1, 1, 0], [0, 4, -4, -1, 1, 0], [0, -2, -1, 2, 1, 0], [0, 2, -1, -2, 1, 0], [0, 4, 0, -5, 0, 1]] + winograd_At = [[1, 1, 1, 1, 1, 0], [0, 1, -1, 2, -2, 0], [0, 1, 1, 4, 4, 0], [0, 1, -1, 8, -8, 1]] # applying At in pre-order doubles compile time + + # TODO: stride == dilation + # use padding to round up to 4x4 output tiles + # (bs, cin_, tyx, HWI) + pads = [(pB, pA + (-(s + pB + pA - 2) % 4)) for (pB, pA), s in zip(flat_to_grouped(padding_), self.shape[-len(HW):])] + d = self.pad(flatten(reversed(pads)))._pool(HWI, HWO) + # move HW to the front: # (HWI, bs, cin_, tyx); contiguous_backward keeps the input transform's adjoint out of the overlap accumulation + d = d.permute(*range(len(d.shape)-len(HW),len(d.shape)), *range(len(d.shape)-len(HW))).contiguous_backward() + tyx = d.shape[-len(HWI):] # dim of tiling + + g = weight.permute(*range(len(weight.shape)-len(HW),len(weight.shape)), *range(len(weight.shape)-len(HW))) # move HW to the front + + # compute 6x6 winograd tiles: GgGt, BtdB. contiguous so the transforms are materialized once + # (HWI, groups * rcout, cin) -> (HWI, bs=1, groups, rcout, cin, tyx=(1,1)) + gfactors = g._apply_winograd_matrix(winograd_G, len(HW)).contiguous().reshape(*HWI, 1, groups, rcout, cin, *([1]*len(tyx))) + # (HWI, bs, cin_, tyx) -> (HWI, bs, groups, 1 ,cin, *tyx) + dfactors = d._apply_winograd_matrix(winograd_Bt, len(HW)).contiguous().reshape(*HWI, bs, groups, 1, cin, *tyx) + + # matmul; sum across cin: (HWI, bs, groups, rcout, *tyx); then HWI -> HWO: (HWO, bs, groups, rcout, *tyx) + ret = (gfactors * dfactors).sum(axis=-1-len(HW), dtype=dtype)._apply_winograd_matrix(winograd_At, len(HW)) + + # interleave tyx and HWO: (bs, groups, rcout, oy, HO, ox, WO) + ret = ret.permute([*range(len(HW), len(ret.shape)-len(HW)), *[i+o for i in range(len(HW)) for o in [len(ret.shape)-len(HW),0]]]) + # merge groups and rcout, tyx and HWO: (bs, groups, cout, *yx), shrink to final + ret = ret.reshape(bs, cout, *[c * HWO[i] for i, c in enumerate(tyx)]).shrink_to(bs, cout, *oyx) + + return (ret if bias is None else ret.add(bias.reshape(1, -1, *[1 for _ in range(len(HW))]))).contiguous().contiguous_backward() + + # *** image function replacements (used when IMAGE is set) *** + + def image_dot(self, w:Self, dtype:DTypeLike|None=None) -> Self: + # NOTE: we use a 1x1 conv2d to do the matmul. mxk @ kxn = (1,k,m,1).conv2d(n,k,1,1) + if not (self.ndim > 0 and w.ndim > 0): raise RuntimeError(f"both tensors need to be at least 1D, got {self.ndim=}, {w.ndim=}") + if self.shape[-1] != w.shape[-min(w.ndim, 2)]: raise RuntimeError(f"cannot image_dot {self.shape} and {w.shape}") + + bs, groups, cin, cout = prod(self.shape[0:-2]), prod(w.shape[0:-2]), w.shape[-2], w.shape[-1] + out_shape_t = self.shape[0:-2] + (cout,-1) if len(self.shape) > 1 else (cout,) + + # NOTE: with NHWC we can remove the transposes + # bs x groups*cin x H x W + cx = self.transpose(self.ndim-1, self.ndim-2).reshape(bs//groups, groups*cin, -1, 1) + # groups*cout x cin x H, W + cw = w.transpose(w.ndim-1, w.ndim-2).reshape(groups*cout, cin, 1, 1) + return cx.image_conv2d(cw, groups=groups, dtype=dtype).reshape(out_shape_t).transpose(self.ndim-1, self.ndim-2) + + def image_conv2d(self, weight:Self, bias:Self|None=None, groups=1, stride=1, dilation=1, padding=0, dtype=None) -> Self: + dtsz = 2 if FLOAT16 else 4 + + (bs,_,_,_), (cout,cin,H,W) = self.shape, weight.shape + assert isinstance(cin, int) and isinstance(cout, int) + x, w = self, weight.reshape(groups, (rcout := cout//groups), cin, H, W) + + padding_neg, padding_pos = [min(0, p) for p in resolve_pool_pads(padding, 2)], [max(0, p) for p in resolve_pool_pads(padding, 2)] + x = x.pad(padding_neg) + iy, ix = x.shape[2:] + + # hack for non multiples of 4 on cin + if cin % 4 != 0 and not (cin == 1 and groups%4 == 0): + new_cin = round_up(cin, 4) + w = w.pad_to(None, None, new_cin, None, None) + x = x.reshape(bs, groups, cin, iy, ix) + x = x.pad_to(None, None, new_cin, None, None).reshape(bs, groups*new_cin, iy, ix) + cin = new_cin + + # hack for non multiples of 4 on rcout + added_output_channels = 0 + if rcout % 4 != 0 and not (rcout == 1 and groups%4 == 0): + added_output_channels = 4 - (rcout % 4) + rcout += added_output_channels + cout = groups * rcout + w = w.pad_to(None, rcout, None, None, None) + + # packed (note: flipping bs and iy would make the auto-padding work) + x = x.permute(0,2,3,1) + cin_last = iy == 1 and ix == 1 + if cin == 1: w = w.reshape(cout//4,4,H,W).permute(0,2,3,1) + elif cin_last: w = w.reshape(cout//4,4,cin//4,4,H,W).permute(0,4,2,5,1,3) + else: w = w.reshape(cout//4,4,cin//4,4,H,W).permute(0,4,2,5,3,1) + + def is_pow2(v): return v > 0 and v & (v - 1) == 0 + # pad dimension i to amt with invalids + def ipad(t, i, amt): + return t.pad(tuple(None if d != i else (0, amt-s) for d,s in enumerate(t.shape)), value=Invalid) if amt != t.shape[i] else t + # align a dimension, use at to specify the dimension to pad in, defaults to first + def pad_align(t, dim, at=None, force=False): + # align to 64 pixels when height is real, otherwise 64 bytes is sufficient + align = (64 // dtsz) if prod(t.shape[:dim]) == 1 or prod(t.shape) < 16384 * 4 else 256 + return ipad(t, at:=at or dim, round_up(t.shape[at] + int(force), align // math.gcd(prod(t.shape[dim:]) // t.shape[at], align))) + + # bank conflicts + bank_conflict = cin >= 8 and is_pow2(cin // 4) + if bank_conflict: + x, w = pad_align(x.reshape(bs, iy, ix, groups, cin // 4, 4), 2, at=4, force=True), pad_align(w, 1, at=2, force=True) + else: x, w = pad_align(x, 2), pad_align(w, 1) + + # contiguous creates the image, and early realize static weights (TODO: test for the static weight) + if FLOAT16: x, w = x.cast(dtypes.half).contiguous().cast(dtypes.float), w.cast(dtypes.half).contiguous().cast(dtypes.float) + else: x, w = x.contiguous(), w.contiguous() + + # undo alignment hacks + if bank_conflict: x, w = x[:, :, :, :, :cin // 4, :], w[:, :, :cin // 4, ...] + else: x, w = x[:, :, :ix, :], w[:, :H, ...] + + # expand out + rcin_hi, rcin_lo = (cin//4, 4) if cin >= 4 else (1, 1) + group_shape, rcout_expand = (groups//4, 4) if cin == 1 else (groups, 1), (rcout//4, 4) if rcout >= 4 else (1, 1) + x = x.reshape(bs, iy, -1, groups, rcin_hi, rcin_lo) + if cin_last: w = w.reshape(cout//4, H, rcin_hi, W, 4, rcin_lo) + else: w = w.reshape(cout//4, H, rcin_hi, W, rcin_lo, 4).permute(0,1,2,3,5,4) + + # prepare input + x = x.permute(0,3,4,5,1,2).pad(padding_pos)._pool((H,W), stride, dilation)# -> (bs, groups, rcin_hi, rcin_lo, oy, ox, H, W) + x = x.permute(0,4,5,1,2,3,6,7).reshape(bs, (oy := x.shape[4]), (ox := x.shape[5]), *group_shape, 1, 1, rcin_hi, rcin_lo, H, W) + + # prepare weights + w = w.permute(0,4,2,5,1,3).reshape((1, 1, 1, *group_shape, *rcout_expand, rcin_hi, rcin_lo, H, W)) + + # the conv! + ret = (x*w).cast(dtypes.float32).sum((-4, -3, -2, -1), dtype=dtype) + + ret = ret.reshape(bs, oy, ox, groups, rcout) + # undo hack for non multiples of 4 on C.rcout + if added_output_channels: ret = ret[:, :, :, :, :-added_output_channels] + # NCHW output + ret = ret.reshape(bs, oy, ox, groups * (rcout - added_output_channels)).permute(0,3,1,2) + return ret if bias is None else ret.add(bias.reshape(1, -1, 1, 1)) + + def conv2d(self, weight:Self, bias:Self|None=None, groups=1, stride=1, dilation=1, padding:int|Sequence[int]=0, + dtype:DTypeLike|None=None) -> Self: + """ + Applies a convolution over a tensor with a given `weight` and optional `bias`. + + This function supports three different types of `padding` + + 1. `int` (single value): + Applies the same padding value uniformly to all spatial dimensions. + + 2. `tuple[int, ...]` (length = number of spatial dimensions): + Specifies a distinct padding value for each spatial dimension in the form `(padding_height, padding_width, ...)`. + + 3. `tuple[int, ...]` (length = 2 * number of spatial dimensions): + Specifies explicit padding for each side of each spatial dimension in the form + `(padding_left, padding_right, padding_top, padding_bottom, ...)`. + + NOTE: unlike PyTorch, this implementation is not limited to only 2d convolutions and instead works for any number of dimensions. + + See: https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(9).reshape(1, 1, 3, 3) + w = Tensor.ones(1, 1, 2, 2) + print(t.conv2d(w).numpy()) + ``` + """ + if IMAGE: return self.image_conv2d(weight, bias, groups, stride, dilation, padding, dtype) + if WINO and all(x == 3 for x in weight.shape[2:]) and stride == dilation == 1: return self._conv2d_winograd(weight, bias, groups, padding, dtype) + (bs,cin_), (cout,cin), HW = self.shape[:2], weight.shape[:2], weight.shape[2:] + padding_ = resolve_pool_pads(padding, len(HW)) + assert groups*cin == cin_ and len(self.shape) == len(weight.shape),\ + f"Input Tensor shape {self.shape} does not match the shape of the weights {weight.shape}. ({groups*cin} vs. {cin_})" + # conv2d is a pooling op (with padding, possibly negative — _pad_constant handles the shrink) + x = self._pad_constant(((0,0),)*(self.ndim-len(HW)) + flat_to_grouped(padding_), 0.0)._pool(HW, stride, dilation) + rcout, oyx = cout//groups, x.shape[2:-len(HW)] + x = x.reshape(bs, groups, cin, 1, *oyx, *HW).expand(bs, groups, cin, rcout, *oyx, *HW)\ + .permute(0,1,3,*[4+i for i in range(len(oyx))],2,*[4+len(oyx)+i for i in range(len(HW))]) + # conv! broadcasted to (bs, groups, rcout, *oyx, cin, *HW) + ret = (x * weight.reshape(1, groups, rcout, *[1] * len(oyx), cin, *HW))\ + .sum([-1-i for i in range(1+len(oyx))], keepdim=True, dtype=dtype).reshape(bs, cout, *oyx) + return ret if bias is None else ret.add(bias.reshape(1, -1, *[1] * len(HW))) + + def conv_transpose2d(self, weight:Self, bias:Self|None=None, groups=1, stride=1, dilation=1, padding=0, output_padding=0) -> Self: + """ + Applies a transposed convolution over a tensor with a given `weight` and optional `bias`. + + This function supports three different types of `padding` + + 1. `int` (single value): + Applies the same padding value uniformly to all spatial dimensions. + + 2. `tuple[int, ...]` (length = number of spatial dimensions): + Specifies a distinct padding value for each spatial dimension in the form `(padding_height, padding_width, ...)`. + + 3. `tuple[int, ...]` (length = 2 * number of spatial dimensions): + Specifies explicit padding for each side of each spatial dimension in the form + `(padding_left, padding_right, padding_top, padding_bottom, ...)`. + + NOTE: unlike PyTorch, this implementation is not limited to only 2d transposed convolutions and instead works for any number of dimensions. + + See: https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(9).reshape(1, 1, 3, 3) + w = Tensor.ones(1, 1, 2, 2) + print(t.conv_transpose2d(w).numpy()) + ``` + """ + x, w = self, weight.unflatten(0, (groups, -1)).transpose(1, 2).flip(*range(3, len(weight.shape)+1)) + HW = weight.shape[2:] + padding = flat_to_grouped(resolve_pool_pads(padding, len(HW))) + stride, dilation, output_padding = [make_tuple(x, len(HW)) for x in (stride, dilation, output_padding)] + if any(s>1 for s in stride): + # handle strides: (k) -> reshape -> (k,1) -> pad -> (k,s) -> reshape -> (k*s) -> shrink (k-(s-1)) + x = x.reshape(None, None, *flatten((k,1) for k in x.shape[2:])) + x = x.pad((None, None, *flatten((None,(0,s-1)) for s in stride))) + x = x.reshape(None, None, *[k*s for k,s in zip(x.shape[2::2], stride)]) + x = x.shrink_to(None, None, *[k-(s-1) for k,s in zip(x.shape[2:], stride)]) + padding = flatten((((k-1)*d-pB,(k-1)*d-pA+op) for k,d,(pB,pA),op in reversed(list(zip(HW, dilation, padding, output_padding))))) + return x.conv2d(w.flatten(end_dim=1), groups=groups, bias=bias, dilation=dilation, padding=padding) + + def layernorm(self, axis:int|tuple[int,...]=-1, eps:float=1e-5) -> Self: + """ + Applies Layer Normalization over a mini-batch of inputs. + + - Paper: https://arxiv.org/abs/1607.06450v1 + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.randn(8, 10, 16) * 2 + 8 + print(t.mean().item(), t.std().item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.layernorm() + print(t.mean().item(), t.std().item()) + ``` + """ + y = (self - self.mean(axis, keepdim=True)) + return y.mul((y*y).mean(axis, keepdim=True).add(eps).rsqrt()) + + def batchnorm(self, weight:Self|None, bias:Self|None, mean:Self, invstd:Self, axis:int|tuple[int, ...]=1) -> Self: + """ + Applies Batch Normalization over a mini-batch of inputs. + + - Paper: https://arxiv.org/abs/1502.03167 + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.randn(8, 4, 16, 16) * 2 + 8 + print(t.mean().item(), t.std().item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = t.batchnorm(None, None, t.mean(axis=(0,2,3)), t.var(axis=(0,2,3)).add(1e-5).rsqrt()) + print(t.mean().item(), t.std().item()) + ``` + """ + axis_ = argfix(axis) + shape = tuple(s if ax in axis_ else 1 for ax, s in enumerate(self.shape)) + x = self - mean.reshape(shape) + if weight is not None: x = x * weight.reshape(shape) + ret = x.mul(invstd.reshape(shape) if len(invstd.shape) == len(axis_) else invstd) + return (ret + bias.reshape(shape)) if bias is not None else ret + + # ***** loss ops ***** + + def _do_reduction(self, reduction:ReductionStr="mean") -> Self: + if reduction == "none": return self + if reduction == "sum": return self.sum() + if reduction == "mean": return self.mean() + raise ValueError(f"{reduction=} must be one of {get_args(ReductionStr)}") + + def binary_crossentropy(self, Y:Self, reduction:ReductionStr="mean") -> Self: + """ + Computes the binary cross-entropy loss between `self` and `Y`. + + See: https://pytorch.org/docs/stable/generated/torch.nn.BCELoss.html + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([0.1, 0.9, 0.2]) + Y = Tensor([0, 1, 0]) + print(t.binary_crossentropy(Y).item()) + ``` + """ + return (-Y*self.log() - (1-Y)*(1-self).log())._do_reduction(reduction) + + def binary_crossentropy_logits(self, Y:Self, reduction:ReductionStr="mean", pos_weight:Self|None=None) -> Self: + """ + Computes the binary cross-entropy loss between `self` and `Y` where `self` is logits. + + See: https://pytorch.org/docs/stable/generated/torch.nn.BCEWithLogitsLoss.html + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([-1, 2, -3]) + Y = Tensor([0, 1, 0]) + print(t.binary_crossentropy_logits(Y).item()) + ``` + """ + log_p, log_1_minus_p = self.logsigmoid(), (-self).logsigmoid() + return (-((1 if pos_weight is None else pos_weight) * Y * log_p + (1-Y) * log_1_minus_p))._do_reduction(reduction) + + def sparse_categorical_crossentropy(self, Y:Self, ignore_index:int=-1, label_smoothing=0.0, reduction:ReductionStr="mean") -> Self: + """ + Computes the sparse categorical cross-entropy loss between `self` and `Y`. + + NOTE: `self` is logits and `Y` is the target labels. + NOTE: unlike PyTorch, this function expects the class axis to be -1 + + See: https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[-1, 2, -3], [1, -2, 3]]) + Y = Tensor([1, 2]) + print(t.sparse_categorical_crossentropy(Y).item()) + ``` + """ + assert 0.0 <= label_smoothing <= 1.0, "label_smoothing must be in [0.0, 1.0]" + if Y.device is not None and self.device is not None and Y.device != self.device: + raise RuntimeError(f"expected Y and self on the same device, {Y.device=}, {self.device=}") + log_probs = self.log_softmax() + loss_mask = Y.ne(ignore_index) if ignore_index != -1 else Y.const_like(True, dtypes.bool) + y = Y.unsqueeze(-1)._one_hot_along_dim(self.shape[-1], dim=-1) * loss_mask.unsqueeze(-1) + smoothing = label_smoothing * (log_probs.mean(-1) * loss_mask) + unreduced = ((1 - label_smoothing) * (log_probs * y).sum(-1) + smoothing) + return -unreduced.sum() / loss_mask.sum() if reduction == "mean" else -unreduced._do_reduction(reduction) + + def cross_entropy(self, Y:Self, reduction:ReductionStr="mean", label_smoothing:float=0.0) -> Self: + """ + Computes the cross entropy loss between input logits and target. + + NOTE: `self` are logits and `Y` are the target labels or class probabilities. + + See: https://pytorch.org/docs/stable/generated/torch.nn.functional.cross_entropy.html + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[-1, 2, -3], [1, -2, 3]]) + Y = Tensor([1, 2]) + print(t.cross_entropy(Y).item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[-1, 2, -3], [1, -2, 3]]) + Y = Tensor([1, 2]) + print(t.cross_entropy(Y, reduction='none').numpy()) + ``` + """ + assert 0.0 <= label_smoothing <= 1.0, "label_smoothing must be in [0.0, 1.0]" + classes_dim = 0 if self.ndim == 1 else 1 + if self.shape != Y.shape: + if self.max(classes_dim).shape != Y.shape: raise RuntimeError(f"shape mismatch: {self.shape=}, {Y.shape=}") + Y = Y.unsqueeze(classes_dim)._one_hot_along_dim(num_classes=self.shape[classes_dim], dim=classes_dim) + Y = (1 - label_smoothing)*Y + label_smoothing / int(Y.shape[classes_dim]) + return -self.log_softmax(classes_dim).mul(Y).sum(classes_dim)._do_reduction(reduction) + + def nll_loss(self, Y:Self, weight:Self|None=None, ignore_index:int|None=None, reduction:ReductionStr="mean") -> Self: + """ + Computes the negative log likelihood loss between log-probabilities and target labels. + + NOTE: `self` is log-probabilities and `Y` is the Y labels or class probabilities. + + See: https://pytorch.org/docs/stable/generated/torch.nn.functional.nll_loss.html + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[-1, 2, -3], [1, -2, 3]]) + Y = Tensor([1, 2]) + print(t.log_softmax().nll_loss(Y).item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[-1, 2, -3], [1, -2, 3]]) + Y = Tensor([1, 2]) + print(t.log_softmax().nll_loss(Y, reduction='none').numpy()) + ``` + """ + weight = Y.const_like(1) if weight is None else weight.gather(0, Y.flatten()).reshape(Y.shape) + masked_weight = weight if ignore_index is None else weight * Y.ne(ignore_index) + nll = -self.gather(1, Y.unsqueeze(1)).squeeze(1) * masked_weight + return nll.sum() / masked_weight.sum() if reduction == "mean" else nll._do_reduction(reduction) + + # ***** matrix ops ***** + + def qr(self) -> tuple[Self, Self]: + assert self.ndim > 1, f"expected two or more dimensions, got {self.ndim}" + b_shape, m, n = self.shape[:-2], int(self.shape[-2]), int(self.shape[-1]) + R, Q = self, type(self).eye(m, dtype=self.dtype).expand(b_shape + (m, m)) + idx = type(self).arange(m) + for i in range(min(m, n)): + # full-length Householder reflector v with zeros above row i; w = tau*v is the rank-1 update factor + at_i, x = idx.eq(i), (idx >= i).where(R[..., :, i], 0) + norm = x.square().sum(-1, keepdim=True).sqrt() + x0 = at_i.where(x, 0).sum(-1, keepdim=True) + sgn, active = x0.ne(0).where(x0.sign(), 1), norm.ne(0) + u0 = x0 + sgn * norm + v = (at_i.where(u0, x) / active.where(u0, 1)).unsqueeze(-1) + w = active.where(sgn * u0 / active.where(norm, 1), 0).unsqueeze(-1) * v + R = R - w @ (v.transpose(-2, -1) @ R) + Q = Q - (Q @ v) @ w.transpose(-2, -1) + return Q, R + + def svd(self, full_matrices = True) -> tuple[Self, Self, Self]: + #partial implementation of https://www.netlib.org/lapack/lawnspdf/lawn169.pdf , pg 26 + assert self.ndim > 1, f"expected two or more dimensions, got {self.ndim}" + b_shape, m, n = self.shape[:-2], int(self.shape[-2]), int(self.shape[-1]) + #preprocess the matrix + Q, R = (self if m >= n else self.transpose(-2, -1)).qr() + num, q_num = min(m, n), max(m, n) + # TODO: codegen infinite loop without contiguous + U = R[..., :num, :num].contiguous() + V = type(self).eye(num, dtype=self.dtype).expand(b_shape + (num, num)).contiguous() + #prepare round robin pairing: identity on first half, reversed on second half + permute = type(self).arange(num//2, dtype=dtypes.int).cat( + type(self).arange(num//2, num, dtype=dtypes.int).flip(0)) + cols, h = type(self).arange(num, dtype=dtypes.int), num // 2 + eye_num = type(self).eye(num, dtype=self.dtype).expand(b_shape + (num, num)) + def one_round_jacobi(U, V, permute): + # permutation matrix P with P[a,b] = (a == permute[b]); first 2h columns are paired-column selectors + P = cols.unsqueeze(1).eq(permute.unsqueeze(0)).cast(U.dtype) + P_pair = P[..., :2*h] # drops the runoff column for odd num + # extract paired columns to compute Jacobi rotation params + U_pair = U @ P_pair + U_left, U_right = U_pair.split(h, -1) + gamma = (U_left * U_right).sum(-2).reshape(b_shape + (1, h)) + alpha, beta = U_pair.square().sum(-2).unsqueeze(-2).split(h, -1) + rot = gamma.ne(0) + tau = (beta - alpha) / (2 * rot.where(gamma, 1)) + t = tau.ne(0).where(tau.sign(), 1) / (tau.abs() + (1 + tau.square()).sqrt()) + t = rot.where(t, 0) + c = 1 / (1 + t.square()).sqrt() + s = c * t + # build rotation matrix R: identity + sum over pairs of 2x2 rotation deltas at (i_k, j_k) positions + Mi, Mj = P_pair.transpose(-2, -1).split(h, -2) # paired-column selectors, each shape (h, num) + Mi_a, Mi_b = Mi.unsqueeze(-1), Mi.unsqueeze(-2) + Mj_a, Mj_b = Mj.unsqueeze(-1), Mj.unsqueeze(-2) + cc, ss = (c - 1).reshape(b_shape + (h, 1, 1)), s.reshape(b_shape + (h, 1, 1)) + R = eye_num + (cc * (Mi_a * Mi_b + Mj_a * Mj_b) + ss * (Mi_a * Mj_b - Mj_a * Mi_b)).sum(-3) + U, V = U @ R, V @ R + #prepare the next round robin pairings + if num % 2 == 1: permute = (permute - 1) % num + else: permute = permute[0].reshape(1).cat(((permute[1:num] - 2) % (num - 1)) + 1) + return U, V, permute + # classical Jacobi converges in ~4 sweeps; one full sweep is (num-1) rounds for even num + for _ in range(4 * num): U, V, permute = one_round_jacobi(U, V, permute) + #extract singular values and sort. construct U from Q + S, indices = U.square().sum(-2).sqrt().sort(dim=-1, descending=True) + new_indices = indices.unsqueeze(-2).expand(b_shape + (num, num)) + U = U.gather(-1, new_indices) / S.ne(0).where(S, 1).unsqueeze(-2) + V = V.gather(-1, new_indices) + # place U into the top-left num×num block of a q_num×q_num identity matrix + pad_arg = (None,) * len(b_shape) + ((0, q_num - num), (0, q_num - num)) + eye_q = type(self).eye(q_num, dtype=U.dtype).expand(b_shape + (q_num, q_num)) + eye_n = type(self).eye(num, dtype=U.dtype).expand(b_shape + (num, num)).pad(pad_arg) + U = Q @ (U.pad(pad_arg) + eye_q - eye_n) + if not full_matrices: U = U[..., 0:num] + return (U, S, V.transpose(-2, -1)) if m >= n else (V, S, U.transpose(-2, -1)) + + def newton_schulz(self, steps:int, params:tuple[int, ...], eps:float=1.0e-7) -> Self: + """ + Performs the newton-schulz algorithm for odd polynomials. The degree of the odd polynomial depends on the number of params. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.randn(4, 4) + print(t.newton_schulz(steps=5, params=(2,-1.5,0.5)).numpy()) + ``` + """ + assert self.ndim > 1, "NS only works for two or more dims" + if self.shape[-2] > self.shape[-1]: return self.transpose(-2, -1).newton_schulz(steps, params, eps).transpose(-2, -1) + G = self / (self.square().sum(axis=(-2, -1), keepdim=True).sqrt() + eps) + for _ in range(steps): + G = functools.reduce(lambda a, b: a + b, (p * functools.reduce(lambda x, y: (y @ y.transpose(-2, -1)) @ x, [G]*i, G) + for i,p in enumerate(params))) + return G + + # ***** hashing ops ***** + + def keccak(self, cfg:str|tuple[int, int]="sha3_256"): + """ + Calculates a Keccak hash over the last dimension. Uses "sha3_256" by default. + + ```python exec="false" source="above" session="tensor" result="python" + t = Tensor(b"Hello World!").keccak() + print(t.data().hex()) + ``` + """ + + # https://keccak.team/keccak_specs_summary.html + + def ctensor(l: Sequence[PyConst], dtype: DType = dtypes.uint64): + return type(self).const(tuple(l), dtype) + rot_offsets = [44, 43, 21, 14, 28, 20, 3, 45, 61, 1, 6, 25, 8, 18, 27, 36, 10, 15, 56, 62, 55, 39, 41, 2] + rot_offsets_v0, rot_offsets_v1 = ctensor([0] + [1 << v for v in rot_offsets]), ctensor([1] + [1 << (64 - v) for v in rot_offsets]) + + # calculated from Ī€ step + reorder_indexes = ctensor([0,6,12,18,24,3,9,10,16,22,1,7,13,19,20,4,5,11,17,23,2,8,14,15,21], dtype=dtypes.int32) + rnd_const_masks = [ctensor([v]).pad((0, 24)) for v in (1, 0x8082, 0x800000000000808a, 0x8000000080008000, 0x808b, 0x80000001, 0x8000000080008081, + 0x8000000000008009, 0x8a, 0x88, 0x80008009, 0x8000000a, 0x8000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003, + 0x8000000000008002, 0x8000000000000080, 0x800a, 0x800000008000000a, 0x8000000080008081, 0x8000000000008080, 0x80000001, 0x8000000080008008)] + + rate, dsbyte = {"sha3_224": (144, 6), "sha3_256": (136, 6), "shake_128": (168, 31)}[cfg] if isinstance(cfg, str) else cfg + data = self.bitcast(dtypes.uint8).reshape(prod(self.shape[:-1]), self.shape[-1]) + data_pad = rate - data.shape[-1] % rate + # pad batches then pad blocks + data = data.pad((None, (0, data_pad))).reshape(bs := data.shape[0], -1, rate).pad_to(None, None, 200) + + # create pad mask + lbe = (data.shape[1] - 1) * 200 + rate - data_pad + if data_pad == 1: mb = [(lbe, 0), (1, dsbyte ^ 0x80), (200 - rate, 0)] + else: mb = [(lbe, 0), (1, dsbyte), (data_pad - 2, 0), (1, 0x80), (200 - rate, 0)] + pad_mask = type(self).cat(*(type(self).const(v, dtypes.uint8).expand(l) for l, v in mb if l > 0)).unsqueeze(0) + + data = (data.flatten(1) ^ pad_mask).reshape(*data.shape[:2], 200).bitcast(dtypes.uint64) + + state = type(self).zeros(bs, 25, dtype=dtypes.uint64, buffer=False) + for k in range(int(data.shape[1])): + state = state ^ data[:, k] + for i in range(24): # f1600 + # θ step + p = state.reshape(bs, 5, 5).transpose(2, 1) + t1 = (p[:,:,0] ^ p[:,:,1] ^ p[:,:,2] ^ p[:,:,3] ^ p[:,:,4]).roll(-1, 1) # xor reduce + state = state ^ (t1.roll(2, 1).bitwise_xor((t1 << 1) ^ (t1 >> 63)).unsqueeze(2).expand(bs, 5, 5).transpose(2, 1).flatten(1)) + # ΁ and Ī€ steps + state = state[:, reorder_indexes] + state = (state * rot_offsets_v0).bitwise_or(state // rot_offsets_v1).reshape(bs, 5, 5) + # · and Κ step + state = state.bitwise_xor(~state.roll(shifts=-1, dims=2) & state.roll(shifts=-2, dims=2)) + state = state.flatten(1) ^ rnd_const_masks[i] + # NOTE: there was a kernelize here to prevent internal stack from growing propotional to data size, do we need something else? + return state.bitcast(dtypes.uint8)[:,:(obytes:=(200 - rate) // 2)].reshape(*self.shape[:-1], obytes) + + def _hash_1mb(self) -> Self: + assert self.dtype == dtypes.uint8, "only support uint8 tensors for hashing" + assert self.ndim == 2, "only support batched 1d tensors" + assert self.shape[1] == 1024 * 1024, "only support messages of 1mb" + return self.reshape(-1, 4096).keccak("shake_128").reshape(self.shape[0], -1).keccak("shake_128") + + def hash(self) -> Self: + """ + Calculates a 16-byte hash of the tensor. + ```python exec="false source="above" session="tensor" result="python" + t = Tensor(b"Hello World!").hash() + print(t.data().hex()) + ``` + """ + data = self.flatten().bitcast(dtypes.uint8) + n = data.shape[0] + assert isinstance(n, int), "hash requires concrete shape" + chunks = ceildiv(n, 2**20) + while chunks > 1: + data = data.pad_to(chunks * 2**20).reshape(chunks, 2**20)._hash_1mb().flatten() + chunks = ceildiv(chunks, 65536) + return data.pad_to(2**20).unsqueeze(0)._hash_1mb().flatten()[:16] + + # ***** tensor properties ***** + + def nbytes(self) -> int: + """ + Returns the total number of bytes of all elements in the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([8, 9], dtype=dtypes.float) + print(t.nbytes()) + ``` + """ + return int(self.numel()) * self.element_size() diff --git a/artifacts/package_runtime/tinygrad/mixin/rand.py b/artifacts/package_runtime/tinygrad/mixin/rand.py new file mode 100644 index 000000000..85e3b58ee --- /dev/null +++ b/artifacts/package_runtime/tinygrad/mixin/rand.py @@ -0,0 +1,327 @@ +from __future__ import annotations +import math +from typing import Self, cast +from tinygrad.dtype import DType, DTypeLike, dtypes, least_upper_dtype, to_dtype, bitcast +from tinygrad.helpers import all_int, argfix, ceildiv, prod, TRAINING +from tinygrad.mixin.op import OpMixin +from tinygrad.device import canonicalize_device + + +class RandMixin(OpMixin): + @staticmethod + def _threefry_random_bits(key, counts0, counts1): + x = (counts1.cast(dtypes.uint64) << 32) | counts0.cast(dtypes.uint64) + x = x.threefry((key[1].cast(dtypes.uint64) << 32) | key[0].cast(dtypes.uint64)) + return x.cast(dtypes.uint32).cat((x >> 32).cast(dtypes.uint32)) + + @classmethod + def random_bits(cls, key:Self, counter:Self, num:int) -> Self: + low, high = counter[0:1], counter[1:2] + bits = [] + for i in range(0, num, dtypes.uint32.max): + chunk_num = min(num - i, dtypes.uint32.max) + c_low = low + (i & 0xffffffff) + c_high = high + (i >> 32) + (c_low < low) + new_key = cls._threefry_random_bits(key, c_low, c_high) + counts0 = cls.arange(ceildiv(chunk_num, 2), dtype=dtypes.uint32) + counts1 = counts0 + ceildiv(chunk_num, 2) + bits.append(cls._threefry_random_bits(new_key, counts0, counts1)[:chunk_num]) + return bits[0].cat(*bits[1:]) if bits else counter[0:0] + + @staticmethod + def _bits_to_rand(bits, shape:tuple[int, ...], dtype:DType): + _, nmant = dtypes.finfo(dtype) + uint_dtype = {1: dtypes.uint8, 2: dtypes.uint16, 4: dtypes.uint32, 8: dtypes.uint64}[dtype.itemsize] + uint_bits = bits.bitcast(uint_dtype) + float_one_bits = bitcast(1.0, dtype, uint_dtype) + return uint_bits.rshift(dtype.bitsize - nmant).bitwise_or(float_one_bits).bitcast(dtype)[:prod(shape)].sub(1).reshape(shape) + + @classmethod + def _rand(cls, key:Self, counter:Self, shape:tuple[int, ...], dtype:DType, contiguous:bool=True) -> Self: + bits = cls.random_bits(key, counter, ceildiv(prod(shape) * dtype.itemsize, 4)) + out = cls._bits_to_rand(bits, shape, dtype) + return out.contiguous() if contiguous else out + + @staticmethod + def _next_counter(device:str, num:int): + raise NotImplementedError("_next_counter requires the stateful per-device RNG counter, only implemented on Tensor") + + @classmethod + def rand(cls, *shape, device:str|None=None, dtype:DTypeLike|None=None, contiguous:bool=True) -> Self: + """ + Creates a tensor with the given shape, filled with random values from a uniform distribution over the interval `[0, 1)`. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.rand(2, 3) + print(t.numpy()) + ``` + """ + dt = to_dtype(dtype or dtypes.default_float) + if not dtypes.is_float(dt) or dt in dtypes.weaks: raise ValueError(f"rand only supports concrete float dtypes, got {dt}") + if not all_int(shape:=argfix(*shape)) or not all(s >= 0 for s in shape): raise ValueError(f"invalid input {shape=}") + if device is not None and not isinstance(device, str): raise ValueError(f"rand only supports single device, got {device=}") + device = cast(str, canonicalize_device(device)) + key, counter = cls._next_counter(device, ceildiv(prod(shape) * dt.itemsize, 4)) + return cls._rand(key, counter, shape, dt, contiguous=contiguous) + + def rand_like(self, **kwargs) -> Self: + """ + Creates a tensor with the same shape and sharding as `self`, filled with random values from a uniform distribution over the interval `[0, 1)`. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.ones(2, 3) + print(Tensor.rand_like(t).numpy()) + ``` + """ + if isinstance(self.device, tuple): + if kwargs.pop("device", None) is not None: raise RuntimeError("cannot specify `device` on `*_like` of a multi device tensor") + dtype = kwargs.pop("dtype", self.dtype) + return self._multi_like(lambda shape, dev: type(self).rand(*shape, dtype=dtype, device=dev, **kwargs)) + return type(self).rand(*self.shape, device=kwargs.pop("device", self.device), dtype=kwargs.pop("dtype", self.dtype), **kwargs) + + def randn_like(self, dtype:DTypeLike|None=None, **kwargs) -> Self: + """ + Creates a tensor with the same shape and sharding as `self`, filled with random values from a normal distribution with mean 0 and variance 1. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.ones(2, 3) + print(Tensor.randn_like(t).numpy()) + ``` + """ + if (dt:=to_dtype(dtype or self.dtype)) in dtypes.weaks and dtype is None: raise ValueError(f"randn_like requires an explicit dtype for {dt}") + src = self.stack(self).rand_like(**{**kwargs, "dtype": dtypes.float32}) + # https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform + return src[0].mul(2*math.pi).cos().mul((1 - src[1]).log().mul(-2).sqrt()).cast(dt) + + @classmethod + def randn(cls, *shape, dtype:DTypeLike|None=None, **kwargs) -> Self: + """ + Creates a tensor with the given shape, filled with random values from a normal distribution with mean `0` and standard deviation `1`. + If `dtype` is not specified, the default type is used. + + You can pass in the `device` keyword argument to control device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.randn(2, 3).numpy()) + ``` + """ + return cls.empty(*shape, **kwargs).randn_like(dtype=dtype) # type: ignore[attr-defined] + + @classmethod + def randint(cls, *shape, low=0, high=10, dtype=dtypes.int32, **kwargs) -> Self: + """ + Creates a tensor with the given shape, filled with random integer values generated uniformly from the interval `[low, high)`. + Requires `low < high`. If `dtype` is not specified, the default type is used. + + You can pass in the `device` keyword argument to control device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.randint(2, 3, low=5, high=10).numpy()) + ``` + """ + if not all_int([low, high]): raise TypeError(f"{low=} and {high=} must be integers") + if not dtypes.is_int(dtype := to_dtype(dtype)): raise TypeError(f"{dtype=} must be int") + if low >= high: raise ValueError(f"Tensor.randint requires low < high, got {low=}, {high=}") + return cls.uniform(*shape, low=low, high=high, dtype=dtype, **kwargs) + + @classmethod + def normal(cls, *shape, mean=0.0, std=1.0, **kwargs) -> Self: + """ + Creates a tensor with the given shape, filled with random values from a normal distribution with the given `mean` and standard deviation `std`. + Requires `std >= 0`. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.normal(2, 3, mean=10, std=2).numpy()) + ``` + """ + if std < 0: raise ValueError(f"Tensor.normal requires std >= 0, got {std=}") + return std * cls.randn(*shape, **kwargs) + mean + + @classmethod + def uniform(cls, *shape, low=0.0, high=1.0, dtype:DTypeLike|None=None, **kwargs) -> Self: + """ + Creates a tensor with the given shape, filled with random values from a uniform distribution over the interval `[low, high)`. + Requires `low < high`. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.uniform(2, 3, low=2, high=10).numpy()) + ``` + """ + if not all_int(shape:=argfix(*shape)) or not all(s >= 0 for s in shape): raise ValueError(f"invalid input {shape=}") + if low >= high: raise ValueError(f"Tensor.uniform requires low < high, got {low=}, {high=}") + return ((high-low) * cls.rand(*shape, **kwargs)).cast(dtype or dtypes.default_float) + low + + @classmethod + def scaled_uniform(cls, *shape, **kwargs) -> Self: + """ + Creates a tensor with the given shape, filled with random values from a uniform distribution + over the interval `[-prod(shape)**-0.5, prod(shape)**-0.5)`. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.scaled_uniform(2, 3).numpy()) + ``` + """ + return cls.uniform(*shape, low=-1.0, high=1.0, **kwargs).mul(prod(argfix(*shape))**-0.5) + + @classmethod + def glorot_uniform(cls, *shape, **kwargs) -> Self: + """ + + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.glorot_uniform(2, 3).numpy()) + ``` + """ + bound = (6 / (argfix(*shape)[0]+prod(argfix(*shape)[1:]))) ** 0.5 + return cls.uniform(*shape, low=-bound, high=bound, **kwargs) + + @classmethod + def kaiming_uniform(cls, *shape, a:float = 0.01, **kwargs) -> Self: + """ + + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.kaiming_uniform(2, 3).numpy()) + ``` + """ + bound = (6 / (1 + a ** 2) / prod(argfix(*shape)[1:])) ** 0.5 + return cls.uniform(*shape, low=-bound, high=bound, **kwargs) + + @classmethod + def kaiming_normal(cls, *shape, a:float = 0.01, **kwargs) -> Self: + """ + + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.kaiming_normal(2, 3).numpy()) + ``` + """ + std = (2 / (1 + a ** 2) / prod(argfix(*shape)[1:])) ** 0.5 + return cls.normal(*shape, mean=0.0, std=std, **kwargs) + + @classmethod + def randperm(cls, n:int, device=None, dtype=dtypes.int32, **kwargs) -> Self: + """ + Returns a tensor with a random permutation of integers from `0` to `n-1`. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.randperm(6).numpy()) + ``` + """ + return cls.rand(n, device=device, **kwargs).argsort().cast(dtype) + + def multinomial(self, num_samples:int = 1, replacement:bool = False) -> Self: + """ + Returns a tensor with `num_samples` indices sampled from a multinomial distribution weighted by `self`. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor([1, 2, 3, 4]) + print(t.multinomial(20, replacement=True).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor([1, 2, 3, 4]) + print(t.multinomial(3, replacement=False).numpy()) + ``` + """ + assert 1 <= self.ndim <= 2 and num_samples > 0, f"{self.ndim=} must be 1 or 2 dim, {num_samples=} must be positive" + weight = self.unsqueeze(0) if self.ndim == 1 else self + assert replacement or num_samples <= weight.shape[1], "no replacement samples must not exceed population size" + if replacement or num_samples == 1: + cdf = (cw := weight.cumsum(1).float()) / cw[:, -1].unsqueeze(1) + unif_samples = type(self).rand(num_samples, cdf.shape[0], 1).to(self.device) # type: ignore[attr-defined] + indices = (unif_samples >= cdf).sum(2).permute((1, 0)) + else: + # Efraimidis-Spirakis + indices = (weight.rand_like(dtype=dtypes.float32).log2() / weight).topk(num_samples, dim=1)[1] + return (indices.squeeze(0) if self.ndim == 1 else indices).cast(dtypes.int32) + + def dropout(self, p=0.5) -> Self: + """ + Applies dropout to `self`. + + NOTE: dropout is only applied when `TRAINING` is set (e.g. inside `Context(TRAINING=1)`). + + - Paper: https://jmlr.org/papers/v15/srivastava14a.html + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + t = Tensor.randn(2, 2) + with Context(TRAINING=1): + print(t.dropout().numpy()) + ``` + """ + if not 0 <= p <= 1: raise ValueError(f"{p=} is out of range [0, 1]") + if not TRAINING or p == 0: return self + if p == 1: return self.const_like(0) + return (self.rand_like(dtype=dtypes.default_float, contiguous=False) >= p).contiguous().where(self, 0) / (1.0 - p) + + def scaled_dot_product_attention(self, key:Self, value:Self, attn_mask:Self|None=None, dropout_p:float=0.0, + is_causal:bool=False, enable_gqa:bool=False) -> Self: + """ + Computes scaled dot-product attention. + `self` is the query tensor, `key` is the key tensor, and `value` is the value tensor. + + - Paper: https://arxiv.org/abs/1706.03762v7 + + ```python exec="true" source="above" session="tensor" result="python" + q = Tensor.randn(2, 4, 8) + k = Tensor.randn(2, 4, 8) + v = Tensor.randn(2, 4, 8) + print(q.scaled_dot_product_attention(k, v).numpy()) + ``` + """ + # GQA: https://docs.pytorch.org/docs/stable/generated/torch.nn.functional.scaled_dot_product_attention.html + if enable_gqa: + key = key.repeat_interleave(int(self.shape[-3] // key.shape[-3]), dim=-3) + value = value.repeat_interleave(int(self.shape[-3] // value.shape[-3]), dim=-3) + + q = self + qk = q.matmul(key.transpose(-2,-1), dtype=least_upper_dtype(q.dtype, key.dtype, dtypes.float32)) / math.sqrt(q.shape[-1]) + # handle attention mask + if is_causal: + if attn_mask is not None: raise RuntimeError("cannot set attn_mask when is_causal=True") + attn_mask = qk.const_like(True, dtypes.bool).tril() + if attn_mask is not None: + if attn_mask.dtype == dtypes.bool: attn_mask = attn_mask.where(0, -float("inf")) + qk = qk + attn_mask + return qk.cast(self.dtype).softmax(-1).dropout(dropout_p) @ value diff --git a/artifacts/package_runtime/tinygrad/mixin/reduce.py b/artifacts/package_runtime/tinygrad/mixin/reduce.py new file mode 100644 index 000000000..78695a40e --- /dev/null +++ b/artifacts/package_runtime/tinygrad/mixin/reduce.py @@ -0,0 +1,138 @@ +from typing import Self, Sequence +from tinygrad.uop import Ops +from tinygrad.dtype import DTypeLike, dtypes, strong_dtype, sum_acc_dtype, to_dtype +from tinygrad.helpers import make_tuple +from tinygrad.mixin.dtype import DTypeMixin +from tinygrad.mixin.movement import MovementMixin + + +class ReduceMixin(DTypeMixin, MovementMixin): + def _rop(self, op: Ops, axis: tuple[int, ...]) -> Self: + raise NotImplementedError + + def _reduce(self, op:Ops, axis:int|Sequence[int]|None=None, keepdim=False) -> Self: + self = self.cast(strong_dtype(self.dtype)) + axis = tuple(self._resolve_dim(x) for x in (range(self.ndim) if axis is None else make_tuple(axis, 1))) + if self.ndim == 0: axis = () + ret = self._rop(op, axis) + return ret.reshape(tuple(1 if i in axis else s for i,s in enumerate(self.shape))) if keepdim else ret + + def sum(self, axis:int|Sequence[int]|None=None, keepdim=False, dtype:DTypeLike|None=None) -> Self: + """ + Returns the sum of the elements of the tensor along the specified axis or axes. + + You can pass in `axis` and `keepdim` keyword arguments to control the axis along + which the maximum is computed and whether the reduced dimensions are retained. + + You can pass in `dtype` keyword argument to control the data type of the accumulation. + If not specified, the accumulation data type is chosen based on the input tensor's data type. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.arange(6).reshape(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.sum().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.sum(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.sum(axis=1).numpy()) + ``` + """ + ret = self.cast(sum_acc_dtype(self.dtype) if dtype is None else to_dtype(dtype))._reduce(Ops.ADD, axis, keepdim) + return ret.cast(self.dtype) if dtype is None and self.dtype in (dtypes.float16, dtypes.bfloat16, *dtypes.fp8s) else ret + + def prod(self, axis:int|Sequence[int]|None=None, keepdim=False, dtype:DTypeLike|None=None) -> Self: + """ + Returns the product of the elements of the tensor along the specified axis or axes. + + You can pass in `axis` and `keepdim` keyword arguments to control the axis along + which the maximum is computed and whether the reduced dimensions are retained. + + You can pass in `dtype` keyword argument to control the data type of the accumulation. + If not specified, the accumulation data type is chosen based on the input tensor's data type. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([-1, -2, -3, 1, 2, 3]).reshape(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.prod().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.prod(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.prod(axis=1).numpy()) + ``` + """ + return self.cast(to_dtype(dtype) if dtype is not None else self.dtype)._reduce(Ops.MUL, axis, keepdim) + + def max(self, axis:int|Sequence[int]|None=None, keepdim=False) -> Self: + """ + Returns the maximum value of the tensor along the specified axis or axes. + + You can pass in `axis` and `keepdim` keyword arguments to control the axis along + which the maximum is computed and whether the reduced dimensions are retained. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[1, 0, 2], [5, 4, 3]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.max().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.max(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.max(axis=1, keepdim=True).numpy()) + ``` + """ + return self._reduce(Ops.MAX, axis, keepdim) + + def any(self, axis:int|Sequence[int]|None=None, keepdim=False) -> Self: + """ + Tests if any element evaluates to `True` along the specified axis or axes. + + You can pass in `axis` and `keepdim` keyword arguments to control the reduce axis and whether the reduced dimensions are retained. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[True, True], [True, False], [False, False]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.any().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.any(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.any(axis=1, keepdim=True).numpy()) + ``` + """ + return self.bool().max(axis, keepdim) + + def all(self, axis:int|Sequence[int]|None=None, keepdim=False) -> Self: + """ + Tests if all element evaluates to `True` along the specified axis or axes. + + You can pass in `axis` and `keepdim` keyword arguments to control the reduce axis and whether the reduced dimensions are retained. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([[True, True], [True, False], [False, False]]) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.all().numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.all(axis=0).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(t.all(axis=1, keepdim=True).numpy()) + ``` + """ + return self.bool().prod(axis, keepdim) diff --git a/artifacts/package_runtime/tinygrad/nn/__init__.py b/artifacts/package_runtime/tinygrad/nn/__init__.py new file mode 100644 index 000000000..e98186111 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/nn/__init__.py @@ -0,0 +1,420 @@ +from __future__ import annotations +import math, functools +from tinygrad.tensor import Tensor +from tinygrad.dtype import dtypes +from tinygrad.helpers import prod, make_tuple, flatten, USE_ATOMICS, TRAINING +from tinygrad.nn import optim, state, datasets # noqa: F401 + +class BatchNorm: + """ + Applies Batch Normalization over a 2D or 3D input. + + - Paper: https://arxiv.org/abs/1502.03167v3 + + See: `Tensor.batchnorm` + + ```python exec="true" session="tensor" + from tinygrad import Tensor, dtypes, nn + import numpy as np + np.set_printoptions(precision=4) + ``` + + ```python exec="true" source="above" session="tensor" result="python" + norm = nn.BatchNorm(3) + t = Tensor.rand(2, 3, 4, 4) + print(t.mean().item(), t.std().item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = norm(t) + print(t.mean().item(), t.std().item()) + ``` + """ + def __init__(self, sz:int, eps=1e-5, affine=True, track_running_stats=True, momentum=0.1): + self.eps, self.track_running_stats, self.momentum = eps, track_running_stats, momentum + + self.weight: Tensor|None = Tensor.ones(sz) if affine else None + self.bias: Tensor|None = Tensor.zeros(sz) if affine else None + + self.num_batches_tracked = Tensor.zeros(dtype='long').is_param_(False) + if track_running_stats: self.running_mean, self.running_var = Tensor.zeros(sz).is_param_(False), Tensor.ones(sz).is_param_(False) + + def calc_stats(self, x:Tensor) -> tuple[Tensor, Tensor]: + shape_mask: list[int] = [1, -1, *([1]*(x.ndim-2))] + if self.track_running_stats and not TRAINING: return self.running_mean, self.running_var.reshape(shape=shape_mask) + # This requires two full memory accesses to x + # https://github.com/pytorch/pytorch/blob/c618dc13d2aa23625cb0d7ada694137532a4fa33/aten/src/ATen/native/cuda/Normalization.cuh + # There's "online" algorithms that fix this, like https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_Online_algorithm + batch_mean = x.mean(axis=(reduce_axes:=tuple(x for x in range(x.ndim) if x != 1))) + y = (x - batch_mean.detach().reshape(shape=shape_mask)) # d(var)/d(mean) = 0 + batch_var = (y*y).mean(axis=reduce_axes) + return batch_mean, batch_var + + def __call__(self, x:Tensor) -> Tensor: + batch_mean, batch_var = self.calc_stats(x) + # NOTE: wow, this is done all throughout training in most PyTorch models + if self.track_running_stats and TRAINING: + self.running_mean.assign((1-self.momentum) * self.running_mean + self.momentum * batch_mean.detach()) + self.running_var.assign((1-self.momentum) * self.running_var + self.momentum * x.numel()/(x.numel()-x.shape[1]) * batch_var.detach()) + self.num_batches_tracked += 1 + return x.batchnorm(self.weight, self.bias, batch_mean, batch_var.add(self.eps).rsqrt()) +BatchNorm2d = BatchNorm3d = BatchNorm + +def Conv1d(in_channels:int, out_channels:int, kernel_size:int, stride=1, padding:int|str=0, dilation=1, groups=1, bias=True) -> Conv2d: + """ + Applies a 1D convolution over an input signal composed of several input planes. + + See: https://pytorch.org/docs/stable/generated/torch.nn.Conv1d + + ```python exec="true" source="above" session="tensor" result="python" + conv = nn.Conv1d(1, 1, 3) + t = Tensor.rand(1, 1, 4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = conv(t) + print(t.numpy()) + ``` + """ + return Conv2d(in_channels, out_channels, (kernel_size,), stride, padding, dilation, groups, bias) + +class Conv2d: + """ + Applies a 2D convolution over an input signal composed of several input planes. + + See: https://pytorch.org/docs/stable/generated/torch.nn.Conv2d + + ```python exec="true" source="above" session="tensor" result="python" + conv = nn.Conv2d(1, 1, 3) + t = Tensor.rand(1, 1, 4, 4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = conv(t) + print(t.numpy()) + ``` + """ + def __init__(self, in_channels:int, out_channels:int, kernel_size:int|tuple[int, ...], stride=1, padding:int|tuple[int, ...]|str=0, + dilation=1, groups=1, bias=True): + self.kernel_size = make_tuple(kernel_size, 2) + if isinstance(padding, str): + if padding.lower() != 'same': raise ValueError(f"Invalid padding string {padding!r}, only 'same' is supported") + if stride != 1: raise ValueError("padding='same' is not supported for strided convolutions") + pad = [(d*(k-1)//2, d*(k-1) - d*(k-1)//2) for d,k in zip(make_tuple(dilation, len(self.kernel_size)), self.kernel_size[::-1])] + padding = tuple(flatten(pad)) + self.stride, self.dilation, self.groups, self.padding = stride, dilation, groups, padding + scale = 1 / math.sqrt(in_channels * prod(self.kernel_size)) + self.weight = Tensor.uniform(out_channels, in_channels//groups, *self.kernel_size, low=-scale, high=scale) + self.bias: Tensor|None = Tensor.uniform(out_channels, low=-scale, high=scale) if bias else None + + def __call__(self, x:Tensor) -> Tensor: return x.conv2d(self.weight, self.bias, self.groups, self.stride, self.dilation, self.padding) + +def ConvTranspose1d(in_channels:int, out_channels:int, kernel_size:int, stride=1, padding=0, output_padding=0, dilation=1, + groups=1, bias=True) -> ConvTranspose2d: + """ + Applies a 1D transposed convolution operator over an input signal composed of several input planes. + + See: https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose1d + + ```python exec="true" source="above" session="tensor" result="python" + conv = nn.ConvTranspose1d(1, 1, 3) + t = Tensor.rand(1, 1, 4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = conv(t) + print(t.numpy()) + ``` + """ + return ConvTranspose2d(in_channels, out_channels, (kernel_size,), stride, padding, output_padding, dilation, groups, bias) + +class ConvTranspose2d(Conv2d): + """ + Applies a 2D transposed convolution operator over an input image. + + See: https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d + + ```python exec="true" source="above" session="tensor" result="python" + conv = nn.ConvTranspose2d(1, 1, 3) + t = Tensor.rand(1, 1, 4, 4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = conv(t) + print(t.numpy()) + ``` + """ + def __init__(self, in_channels:int, out_channels:int, kernel_size:int|tuple[int, ...], stride=1, padding=0, output_padding=0, + dilation=1, groups=1, bias=True): + super().__init__(in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias) + scale = 1 / math.sqrt(in_channels * prod(self.kernel_size)) + self.weight = Tensor.uniform(in_channels, out_channels//groups, *self.kernel_size, low=-scale, high=scale) + self.output_padding = output_padding + + def __call__(self, x:Tensor) -> Tensor: + return x.conv_transpose2d(self.weight, self.bias, self.groups, self.stride, self.dilation, self.padding, self.output_padding) + +class Linear: + """ + Applies a linear transformation to the incoming data. + + See: https://pytorch.org/docs/stable/generated/torch.nn.Linear + + ```python exec="true" source="above" session="tensor" result="python" + lin = nn.Linear(3, 4) + t = Tensor.rand(2, 3) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = lin(t) + print(t.numpy()) + ``` + """ + def __init__(self, in_features:int, out_features:int, bias=True): + bound = 1 / math.sqrt(in_features) + self.weight = Tensor.uniform(out_features, in_features, low=-bound, high=bound) + self.bias = Tensor.uniform(out_features, low=-bound, high=bound) if bias else None + + def __call__(self, x:Tensor) -> Tensor: return x.linear(self.weight.transpose(), self.bias) + +class GroupNorm: + """ + Applies Group Normalization over a mini-batch of inputs. + + - Paper: https://arxiv.org/abs/1803.08494v3 + + ```python exec="true" source="above" session="tensor" result="python" + norm = nn.GroupNorm(2, 12) + t = Tensor.rand(2, 12, 4, 4) * 2 + 1 + print(t.mean().item(), t.std().item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = norm(t) + print(t.mean().item(), t.std().item()) + ``` + """ + def __init__(self, num_groups:int, num_channels:int, eps=1e-5, affine=True): + self.num_groups, self.num_channels, self.eps = num_groups, num_channels, eps + self.weight: Tensor|None = Tensor.ones(num_channels) if affine else None + self.bias: Tensor|None = Tensor.zeros(num_channels) if affine else None + + def __call__(self, x:Tensor) -> Tensor: + # reshape for layernorm to work as group norm + # subtract mean and divide stddev + x = x.reshape(x.shape[0], self.num_groups, -1).layernorm(eps=self.eps).reshape(x.shape) + + if self.weight is None or self.bias is None: return x + # elementwise_affine on channels + return x * self.weight.reshape(1, -1, *[1] * (x.ndim-2)) + self.bias.reshape(1, -1, *[1] * (x.ndim-2)) + +class InstanceNorm: + """ + Applies Instance Normalization over a mini-batch of inputs. + + - Paper: https://arxiv.org/abs/1607.08022v3 + + ```python exec="true" source="above" session="tensor" result="python" + norm = nn.InstanceNorm(3) + t = Tensor.rand(2, 3, 4, 4) * 2 + 1 + print(t.mean().item(), t.std().item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = norm(t) + print(t.mean().item(), t.std().item()) + ``` + """ + def __init__(self, num_features:int, eps:float=1e-5, affine:bool=True): + self.num_features, self.eps = num_features, eps + self.weight: Tensor|None = Tensor.ones(num_features) if affine else None + self.bias: Tensor|None = Tensor.zeros(num_features) if affine else None + + def __call__(self, x:Tensor) -> Tensor: + x = x.reshape(x.shape[0], self.num_features, -1).layernorm(eps=self.eps).reshape(x.shape) + if self.weight is None or self.bias is None: return x + return x * self.weight.reshape(1, -1, *[1] * (x.ndim-2)) + self.bias.reshape(1, -1, *[1] * (x.ndim-2)) + +class LayerNorm: + """ + Applies Layer Normalization over a mini-batch of inputs. + + - Paper: https://arxiv.org/abs/1607.06450v1 + + ```python exec="true" source="above" session="tensor" result="python" + norm = nn.LayerNorm(3) + t = Tensor.rand(2, 5, 3) * 2 + 1 + print(t.mean().item(), t.std().item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = norm(t) + print(t.mean().item(), t.std().item()) + ``` + """ + def __init__(self, normalized_shape:int|tuple[int, ...], eps:float=1e-5, elementwise_affine:bool=True): + self.normalized_shape: tuple[int, ...] = make_tuple(normalized_shape, 1) + self.axis, self.eps = tuple(-1-i for i in range(len(self.normalized_shape))), eps + self.weight: Tensor|None = Tensor.ones(*self.normalized_shape) if elementwise_affine else None + self.bias: Tensor|None = Tensor.zeros(*self.normalized_shape) if elementwise_affine else None + + def __call__(self, x:Tensor) -> Tensor: + assert self.normalized_shape == x.shape[-len(self.normalized_shape):], f"last dimensions of {x.shape} must match {self.normalized_shape}" + x = x.layernorm(eps=self.eps, axis=self.axis) + if self.weight is None or self.bias is None: return x + return x * self.weight + self.bias + +class LayerNorm2d(LayerNorm): + """ + Applies Layer Normalization over a mini-batch of 2D inputs. + + See: `LayerNorm` + + ```python exec="true" source="above" session="tensor" result="python" + norm = nn.LayerNorm2d(3) + t = Tensor.rand(2, 3, 4, 4) * 2 + 1 + print(t.mean().item(), t.std().item()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = norm(t) + print(t.mean().item(), t.std().item()) + ``` + """ + def __call__(self, x: Tensor) -> Tensor: return super().__call__(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2) + +class RMSNorm: + """ + Applies Root Mean Square Normalization to input. + + - Paper: https://arxiv.org/abs/1910.07467 + + ```python exec="true" source="above" session="tensor" result="python" + norm = nn.RMSNorm(4) + t = Tensor.arange(12, dtype=dtypes.float).reshape(3, 4) + print(t.numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + print(norm(t).numpy()) + ``` + """ + def __init__(self, dim:int, eps=1e-6, elementwise_affine=True): + self.eps = eps + self.weight = Tensor.ones(dim) if elementwise_affine else None + + def _norm(self, x:Tensor) -> Tensor: return x * (x.square().mean(-1, keepdim=True) + self.eps).rsqrt() + + def __call__(self, x:Tensor) -> Tensor: + x = self._norm(x.float()).cast(x.dtype) + return x if self.weight is None else x * self.weight + +from tinygrad.uop.ops import UOp, KernelInfo, Ops, AxisType +def _embedding_bwd(grad_emb:UOp, call:UOp) -> tuple: + weight, idx = call.src[1:] + is_vocab_sharded = isinstance(weight.device, tuple) and weight.axis == 0 + # for multi-device: replicate grad_emb and idx on all devices + if isinstance(weight.device, tuple): + assert weight.axis is None or weight.axis == 0, "only vocab (axis=0) sharding supported on Embedding with USE_ATOMICS" + grad_emb = grad_emb.copy_to_device(weight.device) + idx = idx.copy_to_device(weight.device) + if is_vocab_sharded: + ndev = len(weight.device) + local_vocab_size = weight.shape[0] // ndev + grad_weight_uop = Tensor.empty(local_vocab_size, weight.shape[1], dtype=dtypes.float, device=weight.device).uop.unshard(axis=0) + else: + # weight is replicated (or single device), grad_weight should match + grad_weight_uop = Tensor.empty(weight.shape, dtype=dtypes.float, device=weight.device).uop + + # TODO: how do we remove this dumb kernel and use Tensor.zeros? + def _zero_kernel(out:UOp) -> UOp: + i = UOp.range(out.numel(), 0) + return out.flatten()[i].store(0).end(i).sink(arg=KernelInfo(name="zero")) + grad_weight_uop = grad_weight_uop.custom_kernel(fxn=_zero_kernel)[0] + + # TODO: do we have a universal helper for this? + device = call.device.split(":")[0] if not isinstance(call.device, tuple) else call.device[0].split(":")[0] + + # this is the real atomic kernel + def _embedding_bwd_kernel(grad_weight:UOp, grad_emb:UOp, idx:UOp) -> UOp: + idx_flat, grad_emb_flat = idx.flatten(), grad_emb.reshape((idx.numel(), grad_weight.shape[-1])) + + embed_size = grad_weight.shape[-1] + BLOCK_J = min(256, embed_size) + n_j_blocks = (embed_size + BLOCK_J - 1) // BLOCK_J + i = UOp.range(grad_emb_flat.shape[0], 0) # batch_size * sequence_length -> GLOBAL + j_inner = UOp.range(BLOCK_J, 2, AxisType.WEAK if device in ("CPU", "NULL") else AxisType.LOCAL) # BLOCK_J threads per workgroup + j_outer = UOp.range(n_j_blocks, 1) + j = j_outer * BLOCK_J + j_inner + # mask padded embed + j_ok = j < embed_size + j_idx = j.clip(0, embed_size-1) + + if is_vocab_sharded: + # each device owns [offset, offset+local_vocab_size) of the global vocabulary + dnum = UOp.range(ndev, -1, AxisType.DEVICE) + offset = dnum * local_vocab_size + global_token_id = idx_flat[i].cast(dtypes.weakint) + local_token_id = (global_token_id - offset).clip(0, grad_weight.shape[0]-1) + in_range = (global_token_id >= offset) & (global_token_id < (offset + local_vocab_size)) & j_ok + grad_val = in_range.where(grad_emb_flat[i, j_idx].load().cast(dtypes.float), 0.0) + else: + local_token_id = idx_flat[i].clip(0, grad_weight.shape[0]-1).cast(dtypes.weakint) + grad_val = j_ok.where(grad_emb_flat[i, j_idx].load().cast(dtypes.float), 0.0) + # atomic scatter-add: grad_weight[token_id, j] += grad_emb_flat[i, j] + if device in ("CPU", "NULL"): atomic_arg = "__atomic_fetch_add({0}, {1}, __ATOMIC_RELAXED);" + elif device == "AMD": atomic_arg = "__hip_atomic_fetch_add({0}, {1}, __ATOMIC_RELAXED, __HIP_MEMORY_SCOPE_AGENT);" + else: raise NotImplementedError(f"no atomics for device {device}") + atomic = UOp(Ops.CUSTOM, src=(grad_weight.index(local_token_id, j_idx), grad_val), arg = atomic_arg) + return atomic.end(i, j_outer, j_inner).sink(arg=KernelInfo(name="embedding_bwd", opts_to_apply=())) + + grad_weight_uop = grad_weight_uop.custom_kernel(grad_emb, idx, fxn=_embedding_bwd_kernel)[0] + + return (grad_weight_uop.cast(weight.dtype), None) + +def _embedding_fwd(weight:Tensor, idx:Tensor) -> Tensor: + arange = Tensor.arange(weight.shape[0]) + return (arange == idx.unsqueeze(-1)).unsqueeze(-1).where(weight, 0).sum(-2, dtype=weight.dtype) + +@functools.cache +def _embedding_fwd_fxn(wp, ip, device): + return _embedding_fwd(Tensor(wp, device=device), Tensor(ip, device=device)) + +class Embedding: + """ + A simple lookup table that stores embeddings of a fixed dictionary and size. + + See: https://pytorch.org/docs/stable/generated/torch.nn.Embedding + + ```python exec="true" source="above" session="tensor" result="python" + emb = nn.Embedding(10, 3) + print(emb(Tensor([1, 2, 3, 1])).numpy()) + ``` + """ + def __init__(self, vocab_size:int, embed_size:int): + self.weight = Tensor.glorot_uniform(vocab_size, embed_size) + + def __call__(self, idx:Tensor) -> Tensor: + if not dtypes.is_int(idx.dtype): raise TypeError(f"Expected integer dtype for index in embedding, got {idx.dtype}") + if USE_ATOMICS: + fxn = _embedding_fwd_fxn(self.weight.as_param(0).uop, idx.as_param(1).uop, self.weight.device) + return Tensor.call(self.weight, idx, fxn=fxn, grad_fxn=_embedding_bwd) + return _embedding_fwd(self.weight, idx) + +class LSTMCell: + """ + A long short-term memory (LSTM) cell. + + Args: + input_size: The number of expected features in the input `x` + hidden_size: The number of features in the hidden state `h` + bias: If ``False``, then the layer does not use bias weights `b_ih` and `b_hh` + """ + def __init__(self, input_size:int, hidden_size:int, bias:bool=True): + stdv = 1.0 / math.sqrt(hidden_size) + self.weight_ih = Tensor.uniform(hidden_size*4, input_size, low=-stdv, high=stdv) + self.weight_hh = Tensor.uniform(hidden_size*4, hidden_size, low=-stdv, high=stdv) + self.bias_ih: Tensor|None = Tensor.zeros(hidden_size*4) if bias else None + self.bias_hh: Tensor|None = Tensor.zeros(hidden_size*4) if bias else None + + def __call__(self, x:Tensor, hc:tuple[Tensor, Tensor]|None=None) -> tuple[Tensor, Tensor]: + if hc is None: hc = (Tensor.zeros(x.size(0), self.weight_hh.size(1), dtype=x.dtype, buffer=False),)*2 + gates = x.linear(self.weight_ih.T, self.bias_ih) + hc[0].linear(self.weight_hh.T, self.bias_hh) + i, f, g, o = gates.chunk(4, dim=1) + i, f, g, o = i.sigmoid(), f.sigmoid(), g.tanh(), o.sigmoid() + new_c = f * hc[1] + i * g + return o * new_c.tanh(), new_c diff --git a/artifacts/package_runtime/tinygrad/nn/datasets.py b/artifacts/package_runtime/tinygrad/nn/datasets.py new file mode 100644 index 000000000..5c482208e --- /dev/null +++ b/artifacts/package_runtime/tinygrad/nn/datasets.py @@ -0,0 +1,14 @@ +from tinygrad.tensor import Tensor +from tinygrad.nn.state import tar_extract + +def mnist(device=None, fashion=False): + base_url = "http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/" if fashion else "https://storage.googleapis.com/cvdf-datasets/mnist/" + def _mnist(file): return Tensor.from_url(base_url+file, gunzip=True) + return _mnist("train-images-idx3-ubyte.gz")[0x10:].reshape(-1,1,28,28).to(device), _mnist("train-labels-idx1-ubyte.gz")[8:].to(device), \ + _mnist("t10k-images-idx3-ubyte.gz")[0x10:].reshape(-1,1,28,28).to(device), _mnist("t10k-labels-idx1-ubyte.gz")[8:].to(device) + +def cifar(device=None): + tt = tar_extract(Tensor.from_url('https://data.brainchip.com/dataset-mirror/cifar10/cifar-10-binary.tar.gz', gunzip=True)) + train = Tensor.cat(*[tt[f"cifar-10-batches-bin/data_batch_{i}.bin"].reshape(-1, 3073).to(device) for i in range(1,6)]) + test = tt["cifar-10-batches-bin/test_batch.bin"].reshape(-1, 3073).to(device) + return train[:, 1:].reshape(-1,3,32,32), train[:, 0], test[:, 1:].reshape(-1,3,32,32), test[:, 0] diff --git a/artifacts/package_runtime/tinygrad/nn/onnx.py b/artifacts/package_runtime/tinygrad/nn/onnx.py new file mode 100644 index 000000000..a8a19f077 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/nn/onnx.py @@ -0,0 +1,1311 @@ +# pylint: disable=possibly-unused-variable +from typing import Any, Sequence, cast, Literal, NamedTuple, Generator +import dataclasses, functools, io, math, types, warnings, pathlib, sys, os, struct, enum +from tinygrad.nn.state import TensorIO +from tinygrad.tensor import Tensor, is_numpy_ndarray +from tinygrad.mixin.op import ReductionStr +from tinygrad.helpers import getenv, all_same, prod, flatten, make_tuple, argsort, get_single_element, polyN, Context +from tinygrad.dtype import DType, ConstType, dtypes, _from_np_dtype, truncate, least_upper_dtype, DTYPES_DICT +from tinygrad.device import Device +from tinygrad.uop.ops import sint, _broadcast_shape + +# ***** protobuf definitions ****** +class WireType(enum.IntEnum): + """ + Protocol Buffer wire types for decoding fields. + Reference: https://github.com/protocolbuffers/protobuf/blob/main/python/google/protobuf/internal/wire_format.py#L24-L29 + """ + VARINT = 0; FIXED64 = 1; LENGTH_DELIMITED = 2; START_GROUP = 3; END_GROUP = 4; FIXED32 = 5 # noqa: E702 + +class AttributeType(enum.IntEnum): + """ + ONNX attribute type identifiers. + Reference: https://github.com/onnx/onnx/blob/rel-1.18.0/onnx/onnx.proto3#L128-L145 + """ + FLOAT = 1; INT = 2; STRING = 3; TENSOR = 4; GRAPH = 5; FLOATS = 6; INTS = 7; STRINGS = 8 # noqa: E702 + + def to_field_name(self) -> str: return {1: "f", 2: "i", 3: "s", 4: "t", 5: "g", 6: "floats", 7: "ints", 8: "strings"}[self.value] + +class OnnxDataType(enum.IntEnum): + """ + ONNX tensor data type identifiers. + Reference: https://github.com/onnx/onnx/blob/rel-1.18.0/onnx/onnx.proto3#L500-L544 + """ + FLOAT = 1; UINT8 = 2; INT8 = 3; UINT16 = 4; INT16 = 5; INT32 = 6; INT64 = 7; BOOL = 9; FLOAT16 = 10; DOUBLE = 11; UINT32 = 12 # noqa: E702 + UINT64 = 13; BFLOAT16 = 16 # noqa: E702 + + def to_dtype(self) -> DType: return DTYPES_DICT[self.name.lower()] + +# ***** onnx spec definitions ***** +class Domain(enum.Enum): + ONNX = "ai.onnx" + ONNX_ML = "ai.onnx.ml" + AI_ONNX_TRAINING = "ai.onnx.training" + AI_ONNX_PREVIEW_TRAINING = "ai.onnx.preview.training" + MICROSOFT_CONTRIB_OPS = "com.microsoft" + MICROSOFT_NCHWC = "com.microsoft.nchwc" + MICROSOFT_EXPERIMENTAL = "com.microsoft.experimental" + PYTORCH_ATEN = "org.pytorch.aten" + @classmethod + def from_onnx(cls, domain: str | None) -> "Domain": return cls.ONNX if domain is None or domain == "" else cls(domain) + +class OpSetId(NamedTuple): + domain: Domain + version: int + +@dataclasses.dataclass(frozen=True) +class OnnxValue: + shape: tuple[str|int, ...] + dtype: DType + is_optional: bool + is_sequence: bool + +@dataclasses.dataclass(frozen=True) +class OnnxNode: + op: str + opset_id: OpSetId + inputs: tuple[str, ...] + outputs: tuple[str, ...] + opts: dict[str, Any] + +# ***** protobuf parsing ****** +class PBBufferedReader(io.BufferedReader): + def __init__(self, tensor: Tensor): + assert tensor.dtype == dtypes.uint8, tensor + super().__init__(TensorIO(tensor)) + self.len = tensor.nbytes() + + def decode_varint(self) -> int: + """Reference: https://protobuf.dev/programming-guides/encoding/#varints""" + result = 0 + shift = 0 + while True: + data = self.read(1) + if data == b"": raise EOFError("decode_varint EOF") + result |= (data[0] & 0x7F) << shift + if not (data[0] & 0x80): return result + shift += 7 + if shift >= 70: raise ValueError("Varint too long") + + def read_delimited(self, use_tensor=False): + str_len = self.decode_varint() + if not use_tensor: return self.read(str_len) + raw = self.raw + assert isinstance(raw, TensorIO) + res = raw._tensor[self.tell():(self.tell()+str_len)] + self.seek(str_len, os.SEEK_CUR) + return res + def read_string(self) -> str: return self.read_delimited().decode("utf-8") + def read_bytes(self) -> Tensor: return self.read_delimited(use_tensor=True) + def read_float(self) -> float: return struct.unpack(" Tensor: return self.read_delimited(use_tensor=True) + def read_int64(self) -> int: return truncate[dtypes.int64](self.decode_varint()) + def read_packed_int64s(self) -> list[int]: + total_bytes_len = self.decode_varint() + old_pos = self.tell() + values = [] + # need copy here because packed ints are varint + while self.tell() < total_bytes_len + old_pos: values.append(self.read_int64()) + return values + + def skip_field(self, wire_type: WireType) -> None: + """Skip a field based on its wire type.""" + match wire_type: + case WireType.VARINT: self.decode_varint() + case WireType.FIXED64: self.seek(8, os.SEEK_CUR) + case WireType.FIXED32: self.seek(4, os.SEEK_CUR) + case WireType.LENGTH_DELIMITED: self.seek(self.decode_varint(), os.SEEK_CUR) + case _: raise ValueError(f"Unknown wire type: {wire_type}") + +class OnnxPBParser: + """ + ONNX protobuf parser. + Reference: https://github.com/onnx/onnx/blob/main/onnx/onnx.proto3 + """ + def __init__(self, inp: Tensor|str|pathlib.Path, load_external_data: bool=True): + self.file_path: pathlib.Path|None = None + self.load_external_data = load_external_data + if not isinstance(inp, Tensor): + self.file_path = pathlib.Path(inp) + self.tensor = Tensor(self.file_path) + else: self.tensor = inp + self.reader = PBBufferedReader(self.tensor) + + def parse(self) -> dict: + """Parses the ONNX model into a nested dictionary. """ + return self._parse_ModelProto() + + def _parse_message(self, end_pos: int) -> Generator[tuple[int, WireType], None, None]: + while self.reader.tell() < end_pos: + tag = self.reader.decode_varint() + yield tag >> 3, WireType(tag & 0x07) + + def _decode_end_pos(self) -> int: + str_len = self.reader.decode_varint() + start_pos = self.reader.tell() + return start_pos + str_len + + def _parse_ModelProto(self) -> dict: + """Entry point for parsing the ONNX model.""" + obj: dict[str, Any] = {"opset_import": []} + for fid, wire_type in self._parse_message(self.reader.len): + match fid: + case 4: obj["domain"] = self.reader.read_string() + case 5: obj["model_version"] = self.reader.read_int64() + case 7: obj["graph"] = self._parse_GraphProto() + case 8: obj["opset_import"].append(self._parse_OperatorSetIdProto()) + case _: self.reader.skip_field(wire_type) + + # update opset version + opset_imports = {Domain.from_onnx(x.get('domain')):x.get('version', 1) for x in obj["opset_import"]} + for n in obj["graph"]["node"]: + n_ = n["parsed_node"] + n["parsed_node"] = OnnxNode(n_.op, OpSetId(n_.opset_id.domain, opset_imports.get(n_.opset_id.domain, 1)), n_.inputs, n_.outputs, n_.opts) + return obj + + def _parse_GraphProto(self) -> dict: + obj: dict[str, Any] = {"node": [], "initializer": [], "input": [], "output": []} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["node"].append(self._parse_NodeProto()) + case 2: obj["name"] = self.reader.read_string() + case 5: obj["initializer"].append(self._parse_TensorProto()) + case 11: obj["input"].append(self._parse_ValueInfoProto()) + case 12: obj["output"].append(self._parse_ValueInfoProto()) + case _: self.reader.skip_field(wire_type) + return obj + + def _parse_NodeProto(self) -> dict: + obj: dict[str, Any] = {"input": [], "output": [], "attribute": [], "domain": None} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["input"].append(self.reader.read_string()) + case 2: obj["output"].append(self.reader.read_string()) + case 3: obj["name"] = self.reader.read_string() + case 4: obj["op_type"] = self.reader.read_string() + case 5: obj["attribute"].append(self._parse_AttributeProto()) + case 6: obj["doc_string"] = self.reader.read_string() + case 7: obj["domain"] = self.reader.read_string() + case _: self.reader.skip_field(wire_type) + + # parse node + attributes = {attr_dict["name"]: attr_dict[AttributeType(attr_dict["type"]).to_field_name()] for attr_dict in obj["attribute"]} + opset_id = OpSetId(Domain.from_onnx(obj.get('domain')), 1) # default version, to be updated later in _parse_ModelProto + obj["parsed_node"] = OnnxNode(obj["op_type"], opset_id, tuple(obj["input"]), tuple(obj["output"]), attributes) + return obj + + def _parse_TensorProto(self) -> dict: + obj: dict[str, Any] = {"dims": []} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["dims"].append(self.reader.read_int64()) + case 2: obj["data_type"] = self.reader.read_int64() + case 4: obj["float_data"] = self.reader.read_packed_floats() + case 5: obj["int32_data"] = self.reader.read_packed_int64s() + case 7: obj["int64_data"] = self.reader.read_packed_int64s() + case 8: obj["name"] = self.reader.read_string() + case 9: obj["raw_data"] = self.reader.read_bytes() + case 10: obj["double_data"] = self.reader.read_packed_floats() + case 11: obj["uint64_data"] = self.reader.read_packed_int64s() + case 13: obj.setdefault("external_data", []).append(self._parse_StringStringEntryProto()) + case 14: obj["data_location"] = self.reader.read_int64() + case _: self.reader.skip_field(wire_type) + + # load external data + if self.load_external_data and obj.get("data_location", 0) == 1: + if "external_data" not in obj: raise ValueError("no external_data") + location, length, offset = None, None, 0 + for kv in obj["external_data"]: + if kv["key"] == "location": location = kv["value"] + elif kv["key"] == "offset": offset = int(kv["value"]) + elif kv["key"] == "length": length = int(kv["value"]) + if location is None: raise ValueError("no location in external_data") + + if self.file_path is None: + if isinstance(self.tensor.device, str) and self.tensor.device.startswith("DISK:"): + self.file_path = pathlib.Path(self.tensor.device[5:]) + else: raise ValueError("onnx external_data needs the origin file path, try passing onnx file path to onnx_load") + ext_path = self.file_path.parent.joinpath(location) + if not ext_path.exists(): raise FileNotFoundError(f"external location not exists: {ext_path}") + + ext_tensor = Tensor(ext_path) + obj["raw_data"] = ext_tensor[offset:offset+length] if length is not None else ext_tensor[offset:] + obj["data_location"] = 0 + + # parse tensor + dtype = OnnxDataType(obj['data_type']).to_dtype() + shape = tuple(obj['dims']) + present_fields = [field for field in ['float_data', 'int32_data', 'int64_data', 'double_data', 'uint64_data', 'raw_data'] if field in obj] + assert len(present_fields) == 1, f"only 1 data field is allowed from {obj=}" + data = obj[present_fields[0]] + if not isinstance(data, Tensor): + obj["parsed_tensor"] = Tensor(data, dtype=dtype).reshape(shape) + return obj + assert isinstance(data, Tensor) and data.dtype == dtypes.uint8, data + data = data.bitcast(dtype).reshape(shape).to(Device.DEFAULT) + # const folding + if shape == (): + if data.dtype == dtypes.float16 and sys.version_info < (3, 12): data = data.cast(dtypes.float32) + data = Tensor(data.item(), dtype=dtype).reshape(shape) + obj["parsed_tensor"] = data + return obj + + def _parse_AttributeProto(self) -> dict: + obj: dict[str, Any] = {"floats": [], "ints": [], "strings": []} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["name"] = self.reader.read_string() + case 2: obj["f"] = self.reader.read_float() + case 3: obj["i"] = self.reader.read_int64() + case 4: obj["s"] = self.reader.read_bytes().data().tobytes().decode("utf8") + case 5: obj["t"] = self._parse_TensorProto()['parsed_tensor'] + case 6: obj["g"] = OnnxRunner._from_subgraph(self._parse_GraphProto()) + case 7: obj["floats"].append(self.reader.read_float()) + case 8: obj["ints"].append(self.reader.read_int64()) + case 9: obj["strings"].append(self.reader.read_bytes().data().tobytes().decode("utf8")) + case 20: obj["type"] = self.reader.read_int64() + case _: self.reader.skip_field(wire_type) + obj["floats"], obj["ints"], obj["strings"] = tuple(obj["floats"]), tuple(obj["ints"]), tuple(obj["strings"]) + return obj + + def _parse_ValueInfoProto(self) -> dict: + obj: dict[str, Any] = {} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["name"] = self.reader.read_string() + case 2: obj["type"] = self._parse_TypeProto() + case _: self.reader.skip_field(wire_type) + + # parse type + if "type" not in obj: return {**obj, "parsed_type": None} + type_obj = obj["type"] + if is_optional := "optional_type" in type_obj: type_obj = type_obj["optional_type"]["elem_type"] + if is_sequence := "sequence_type" in type_obj: type_obj = type_obj["sequence_type"]["elem_type"] + assert "tensor_type" in type_obj, type_obj + shape_dims = type_obj['tensor_type'].get('shape', {}).get('dim', []) + obj['parsed_type'] = OnnxValue(tuple(d.get('dim_param') or d.get('dim_value') for d in shape_dims), + OnnxDataType(type_obj['tensor_type']['elem_type']).to_dtype(), is_optional, is_sequence) + return obj + + def _parse_TypeProto(self) -> dict: + obj: dict[str, Any] = {} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["tensor_type"] = self._parse_TypeProtoTensor() + case 4: obj["sequence_type"] = self._parse_TypeProtoWrapper() + case 9: obj["optional_type"] = self._parse_TypeProtoWrapper() + case _: self.reader.skip_field(wire_type) + return obj + + def _parse_TypeProtoTensor(self) -> dict: + obj: dict[str, Any] = {} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["elem_type"] = self.reader.read_int64() + case 2: obj["shape"] = self._parse_TensorShapeProto() + case _: self.reader.skip_field(wire_type) + return obj + + def _parse_TypeProtoWrapper(self) -> dict: + obj = {} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["elem_type"] = self._parse_TypeProto() + case _: self.reader.skip_field(wire_type) + return obj + + def _parse_TensorShapeProto(self) -> dict: + obj: dict[str, Any] = {"dim": []} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["dim"].append(self._parse_TensorShapeProtoDimension()) + case _: self.reader.skip_field(wire_type) + return obj + + def _parse_TensorShapeProtoDimension(self) -> dict: + obj: dict[str, Any] = {} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["dim_value"] = self.reader.read_int64() + case 2: obj["dim_param"] = self.reader.read_string() + case _: self.reader.skip_field(wire_type) + return obj + + def _parse_StringStringEntryProto(self) -> dict: + obj: dict[str, Any] = {} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["key"] = self.reader.read_string() + case 2: obj["value"] = self.reader.read_string() + case _: self.reader.skip_field(wire_type) + return obj + + def _parse_OperatorSetIdProto(self) -> dict: + obj: dict[str, Any] = {} + for fid, wire_type in self._parse_message(self._decode_end_pos()): + match fid: + case 1: obj["domain"] = self.reader.read_string() + case 2: obj["version"] = self.reader.read_int64() + case _: self.reader.skip_field(wire_type) + return obj + +# ***** python const ***** +required_input_python_consts: dict[str, tuple[int, ...]] = { + "Tile": (1,), "Range": (0,1,2), "Expand": (1,), "Reshape": (1,), "Squeeze": (1,), "Unsqueeze": (1,), "Trilu": (1,), "ConstantOfShape": (0,), + "CumSum": (1,), "TopK": (1,), "Pad": (1,2,3), "MaxUnpool": (2,), "Dropout": (1,2), "CenterCropPad": (1,), "OneHot": (1,), "Compress": (1,), + "ImageDecoder": (0,), "AffineGrid": (1,), "Resize": (1,2,3), "Upsample": (1,), "Split": (1,), "Slice": (1,2,3,4), + "HannWindow": (0,), "HammingWindow": (0,), "BlackmanWindow": (0,), + **{"Reduce"+r: (1,) for r in ("Max", "Min", "Sum", "Mean", "SumSquare", "Prod", "L1", "L2", "LogSum", "LogSumExp")}, + **{optim: (1,) for optim in ("Adam", "Adagrad", "Momentum")} +} + +def _to_python_const(t:Tensor) -> list[ConstType]|ConstType|bytes: + return t.data().tobytes() if t.dtype == dtypes.uint8 else t.tolist() + +# ***** runner ****** +debug = int(getenv("DEBUGONNX", "0")) +limit = int(getenv("ONNXLIMIT", "-1")) +class OnnxRunner: + """ + `OnnxRunner` executes an ONNX model using Tinygrad. + + Args: + model_path: The ONNX model, provided as a file path (a string or Path object) or a Tensor. + """ + def __init__(self, model_path: Tensor | str | pathlib.Path): + model = OnnxPBParser(model_path, load_external_data=True).parse() + self._init_from_graph(model["graph"]) + + def _init_from_graph(self, graph: dict, is_subgraph: bool = False): + self.is_training = any(n['parsed_node'].opset_id.domain in {Domain.AI_ONNX_TRAINING, Domain.AI_ONNX_PREVIEW_TRAINING} for n in graph["node"]) + self.graph_name = graph["name"] if is_subgraph else "" + self.graph_values = {"": None, **{i["name"]: i["parsed_tensor"] for i in graph["initializer"]}} + self.graph_inputs = {i["name"]: i["parsed_type"] for i in graph["input"] if i["name"] not in self.graph_values} + self.graph_outputs = tuple(o["name"] for o in graph["output"]) + self.graph_nodes = tuple(n["parsed_node"] for n in graph["node"]) + # track names from initializers and Constant nodes for fast path optimizations + self.const_names: set[str] = set(self.graph_values.keys()) | {o for n in self.graph_nodes if n.op == "Constant" for o in n.outputs} + + self.variable_dims: dict[str, int] = {} + self.onnx_ops = onnx_ops + self._python_const_cache: dict[str, list[ConstType]|ConstType|bytes] = {} # cache by name for JIT stability + + @classmethod + def _from_subgraph(cls, graph: dict) -> "OnnxRunner": + subgraph = cls.__new__(cls) + subgraph._init_from_graph(graph, is_subgraph=True) + return subgraph + + def _parse_input(self, name: str, value: Any, spec: OnnxValue): + if spec.is_optional and value is None: return None + if spec.is_sequence: + if not isinstance(value, Sequence): raise RuntimeError(f"input {name} received {value}, expected a sequence type") + sequence = [Tensor(v, dtype=spec.dtype) if not isinstance(v, Tensor) else v for v in value] + if not all_same(tuple(t.shape for t in sequence)): raise RuntimeError(f"Shapes for input {name} sequence must be homogeneous") + if not all(t.dtype is spec.dtype for t in sequence): warnings.warn(f"Dtypes for input {name} sequence aren't all {spec.dtype}") + return sequence + dtype = _from_np_dtype(value.dtype) if is_numpy_ndarray(value) else spec.dtype + tensor = Tensor(value, dtype=dtype) if not isinstance(value, Tensor) else value + if tensor.dtype is not spec.dtype: warnings.warn(f"input {name} has mismatch on dtype. Expected {spec.dtype}, received {tensor.dtype}.") + for dim, (onnx_dim, user_dim_input) in enumerate(zip(spec.shape, tensor.shape, strict=True)): + if isinstance(onnx_dim, str): + onnx_dim = self.variable_dims[onnx_dim] if onnx_dim in self.variable_dims else self.variable_dims.setdefault(onnx_dim, int(user_dim_input)) + if user_dim_input != onnx_dim: raise RuntimeError(f"input {name} has mismatch on {dim=}. Expected {onnx_dim}, received {user_dim_input}.") + return tensor + + def _select_op(self, op:str, required_opset:OpSetId) -> types.FunctionType: + if op not in self.onnx_ops: raise NotImplementedError(f"{op=} is not supported") + # return default implementation if no opset_id is specified + if isinstance(impl := self.onnx_ops[op], types.FunctionType): return impl + # match domain and select implementation with latest compatible version + eligible_ops = {impl_opset.version:impl_fxn for impl_opset,impl_fxn in impl.items() + if impl_opset.domain == required_opset.domain and impl_opset.version <= required_opset.version} + if not eligible_ops: raise NotImplementedError(f"{op=} is not supported for domain {required_opset.domain} and version {required_opset.version}") + return eligible_ops[max(eligible_ops.keys())] + + def to(self, device:str|None): + self.graph_values = {k: (v.to(device) if isinstance(v, Tensor) else v) for k,v in self.graph_values.items()} + self.graph_nodes = tuple(OnnxNode(n.op, n.opset_id, tuple(n.inputs), tuple(n.outputs), + {k: (v.to(device) if isinstance(v, (Tensor, OnnxRunner)) else v) for k,v in n.opts.items()}) + for n in self.graph_nodes) + return self + + def _get_python_const(self, name:str, op:str, idx:int) -> list[ConstType]|ConstType|bytes|Any: + """Convert tensor to python const with name-based caching for JIT stability.""" + t = self.graph_values[name] + if idx not in required_input_python_consts.get(op, ()) or not isinstance(t, Tensor): return t + # cache by name - safe because JIT requires fixed input shapes, so computed values (Shape ops) are deterministic + # true graph inputs that are python consts are rare; if they change across runs, cached value will be wrong + if (cached := self._python_const_cache.get(name)) is None: cached = self._python_const_cache[name] = _to_python_const(t) + return cached + + def __call__(self, inputs:dict[str, Any], debug=debug): + with Context(TRAINING=int(self.is_training)): + for name, input_spec in self.graph_inputs.items(): + if name not in inputs: raise RuntimeError(f"Please provide input data for {name}") + self.graph_values[name] = self._parse_input(name, inputs[name], input_spec) + + for num, node in enumerate(self.graph_nodes): + inps = [self._get_python_const(name, node.op, i) for i,name in enumerate(node.inputs)] + opts = node.opts + + # provide additional opts + if node.op == "Split" and 'num_outputs' not in opts: opts['num_outputs'] = len(node.outputs) + if node.op in {"Gradient", "If"}: opts['intermediate_tensors'] = self.graph_values + # for Gather, convert indices to python const if from Constant/initializer for shrink fast path + if node.op == "Gather" and len(node.inputs) > 1 and node.inputs[1] in self.const_names: + idx_name, cache = node.inputs[1], self._python_const_cache + if (cached := cache.get(idx_name)) is None: cached = cache[idx_name] = _to_python_const(self.graph_values[idx_name]) + inps[1] = cached + + if debug >= 1: print((f"[{self.graph_name}] " if self.graph_name else "") + f"{num}: op '{node.op}' opt {opts}") + if debug >= 2 and node.inputs: print("\tinputs:\n" + "\n".join(f"\t\t{x} - {i!r}" for x,i in zip(node.inputs, inps))) + ret = self._select_op(node.op, node.opset_id)(*inps, **opts) + ret = ret if isinstance(ret, tuple) else (ret,) + if debug >= 2: print("\toutputs:\n" + "\n".join(f"\t\t{x} - {o!r}" for x,o in zip(node.outputs, ret))) + + self.graph_values.update(dict(zip(node.outputs, ret[:len(node.outputs)], strict=True))) + + if num == limit: + return {name:self.graph_values[name] for name in node.outputs} + return {name:self.graph_values[name] for name in self.graph_outputs} + +#################### +##### ONNX OPS ##### +#################### +def get_onnx_ops() -> dict[str, types.FunctionType|dict[OpSetId, types.FunctionType]]: + # ***** helper functions ***** + def _resolve_const(x: Sequence[ConstType]|ConstType): return get_single_element(x) if isinstance(x, Sequence) else x + + def _axes(axes, noop_with_empty_axes): return axes or ([] if noop_with_empty_axes else None) + + # (padding_top, padding_left, ..., padding_bottom, padding_right, ...) -> (padding_left, padding_right, padding_top, padding_bottom, ...) + def _onnx_pads_to_tiny_pads(pads): + n = len(pads) // 2 + return tuple(x for i in range(n-1, -1, -1) for x in (pads[i], pads[i+n])) + + AUTO_PAD_OPTIONS = Literal["NOTSET", "SAME_UPPER", "SAME_LOWER", "VALID"] + # (padding_height, padding_width) -> (padding_top, padding_left, padding_bottom, padding_right) + def _auto_pad(pads, auto_pad: AUTO_PAD_OPTIONS): + first = [p//2 for p in pads] if auto_pad == "SAME_UPPER" else [p - p//2 for p in pads] + return first + [p - f for p, f in zip(pads, first)] + + def _resolve_pool_pads(x:Tensor, p_, k_, d_, s_, auto_pad:AUTO_PAD_OPTIONS): + if auto_pad == "VALID": return [0]*(len(k_)*2) + i_, (s_,d_,p_) = x.shape[-len(k_):], (make_tuple(x, len(k_)*2) for x in (s_, d_, p_)) + if auto_pad == "NOTSET": return _onnx_pads_to_tiny_pads(p_ if len(p_)==len(k_)*2 else p_*2) + o_ = [((i - 1) // s + 1) for i,s in zip(i_, s_)] + return _onnx_pads_to_tiny_pads(_auto_pad([(o-1)*s+k-i for o,i,k,s in zip(o_, i_, k_, s_)], auto_pad)) + + def _clamp_cast(x:Tensor, dtype:DType): return x.clamp(dtype.min, dtype.max).cast(dtype) + + def _prepare_quantize(x:Tensor, scale:Tensor, zero_point:Tensor|int, axis=1, block_size=0): + if axis < 0: axis += x.ndim + # https://github.com/onnx/onnx/blob/main/onnx/reference/ops/op_quantize_linear.py#L31 + def reshape(val:Tensor): + if val.numel() == 1: return val + if block_size == 0: return val.reshape([val.shape[0] if dim == axis else 1 for dim in range(x.ndim)]) + return val.repeat_interleave(block_size, axis) + return (reshape(scale), reshape(zero_point) if isinstance(zero_point, Tensor) else zero_point) + + def _op_integer(op, inputs:list[Tensor], zero_points:list[Tensor], **opts): + adjusted_inputs = [inp.int() - zp for inp, zp in zip(inputs, zero_points)] + return op(*adjusted_inputs, **opts) + + def _qlinearop_quantized(op, inputs:list[Tensor], zero_points:list[Tensor], scales:list[Tensor], out_scale:Tensor, out_zero_point:Tensor, **opts): + # op execution is done in quantized int + out = _op_integer(op, inputs, zero_points, **opts) + assert dtypes.is_int(out.dtype), "quantized op should've done math in int" + out_quantized = (out * prod(scales) / out_scale).round() + out_zero_point + return _clamp_cast(out_quantized, out_zero_point.dtype) + + def _qlinearop_float(op, inputs:list[Tensor], zero_points:list[Tensor], scales:list[Tensor], out_scale:Tensor, out_zero_point:Tensor, **opts): + # op execution is done in float32 + dequantized_inputs = [(inp.int() - zp) * scale for inp, zp, scale in zip(inputs, zero_points, scales)] + out = op(*dequantized_inputs, **opts) + assert dtypes.is_float(out.dtype), "op should've done math in float" + out_quantized = (out / out_scale).round() + out_zero_point + return _clamp_cast(out_quantized, out_zero_point.dtype) + + def _onnx_training(input_group_size): + def __decorator(func): + def ___wrapper(R:Tensor, T:int, *inputs:Tensor, **kwargs): + R = R.detach() + groups = len(inputs) // input_group_size + ret = [func(R, T, *inps, **kwargs) for inps in (inputs[i::groups] for i in range(groups))] + return tuple(flatten(zip(*ret))) + return ___wrapper + return __decorator + + # ***** Property/Graph Ops ***** + def If(condition:Tensor, else_branch:OnnxRunner, then_branch:OnnxRunner, intermediate_tensors:dict[str, Tensor]): + def run_branch(branch:OnnxRunner): + branch.graph_values.update(intermediate_tensors) + out = branch({k:intermediate_tensors[k] for k in branch.graph_inputs.keys()}) + # dereference intermediate tensors so Buffer can be deallocated + for k in intermediate_tensors: del branch.graph_values[k] + return out + # both branch must be ran before the condition can be evaluated + else_out, then_out = run_branch(else_branch), run_branch(then_branch) + assert len(else_out) == len(then_out), f"else_out and then_out must have the same number of outputs: {len(else_out)} != {len(then_out)}" + # can use where op when output shape is the same + if all(t.shape == e.shape for t,e in zip(then_out.values(), else_out.values())): + return tuple(condition.where(t,e) for t,e in zip(then_out.values(), else_out.values())) + # otherwise, use condition to select the output in python + cond = _resolve_const(_to_python_const(condition)) + return tuple(t if cond else e for t,e in zip(then_out.values(), else_out.values())) + + def Identity(x:Tensor): return x + def Constant(sparse_value:Tensor|None=None, value:Tensor|None=None, value_float:float|None=None, value_floats:list[float]|None=None, + value_int:int|None=None, value_ints:list[int]|None=None, value_string:str|None=None, value_strings:list[str]|None=None): + if value is not None: return value + if value_float is not None: return Tensor(value_float, dtype=dtypes.float32) + if value_floats is not None: return Tensor(list(value_floats), dtype=dtypes.float32) + if value_int is not None: return Tensor(value_int, dtype=dtypes.int64) + if value_ints is not None: return Tensor(list(value_ints), dtype=dtypes.int64) + if value_string is not None or value_strings is not None or sparse_value is not None: + raise NotImplementedError('Constant OP not implemented for value_string, value_strings and sparse_value') + + def Range(start:float|int|list[float|int], limit:float|int|list[float|int], delta:float|int|list[float|int]): + return Tensor.arange(start=_resolve_const(start), stop=_resolve_const(limit), step=_resolve_const(delta)) + + def ImageDecoder(encoded_stream:bytes, pixel_format="RGB"): + try: import PIL.Image + except ImportError as e: raise ImportError("Pillow must be installed for the ImageDecoder operator") from e + img = PIL.Image.open(io.BytesIO(encoded_stream)) + if pixel_format == "BGR": return Tensor(img.tobytes(), dtype=dtypes.uint8).reshape(*img.size, 3).flip(-1) + if pixel_format == "RGB": return Tensor(img.tobytes(), dtype=dtypes.uint8).reshape(*img.size, 3) + if pixel_format == "Grayscale": return Tensor(img.convert("L").tobytes(), dtype=dtypes.uint8).reshape(*img.size, 1) + raise ValueError(f"pixel_format={pixel_format!r} is not supported.") + + def EyeLike(x:Tensor, dtype:int|None=None, k:int=0): + ret = Tensor.eye(cast(int, min(x.shape)), dtype=OnnxDataType(dtype).to_dtype() if dtype is not None else x.dtype) + return ret if x.size(0) == x.size(1) else ret.pad(tuple(None if d == ret.size(0) else (k, d-ret.shape[0]-k) for d in x.shape)) + + def OptionalHasElement(x:Tensor|None=None): return Tensor(x is not None and x.numel() > 0) + def OptionalGetElement(x:Tensor|None=None): return x if x is not None else Tensor([]) + def ConstantOfShape(shape:list[int], value:Tensor|None=None): + if value is None: value = Tensor(0, dtype=dtypes.float32) + if shape == [0]: return Tensor([], dtype=value.dtype) + return value.expand(shape) + + def Size(data:Tensor): return data.numel() + def Shape(data:Tensor, end:int|None=None, start:int=0): return Tensor(data.shape[start:end], dtype=dtypes.int64, device=data.device) + + # ***** Unary Ops (math) ***** + def Not(x:Tensor): return x.logical_not() + def Clip(x: Tensor, min:Tensor|None=None, max:Tensor|None=None): return x if min is None and max is None else x.clip(min, max) # noqa: A002 # pylint: disable=redefined-builtin + def IsInf(x:Tensor, detect_negative:int=1, detect_positive:int=1): return x.isinf(bool(detect_positive), bool(detect_negative)) + + # ***** Unary Ops (activation) ***** + def softmax_1(x:Tensor, axis:int=1): return x.softmax(axis) + def softmax_13(x:Tensor, axis:int=-1): return x.softmax(axis) + Softmax = {OpSetId(Domain.ONNX, 1):softmax_1, OpSetId(Domain.ONNX, 13):softmax_13} + def HardSigmoid(x:Tensor, alpha:float=0.2, beta:float=0.5): return (alpha*x + beta).clip(0, 1) + def Gelu(x:Tensor, approximate:str|None=None): return x.gelu(approximate="none" if approximate is None else approximate) + def BiasGelu(x: Tensor, bias: Tensor, approximate: str | None = None) -> Tensor: return Gelu(x + bias, approximate) + def FastGelu(x:Tensor, bias:Tensor|None=None): return (x + bias).gelu() if bias is not None else x.gelu() # this is tanh approximated + def PRelu(X:Tensor, slope:Tensor): return (X > 0).where(X, X * slope) + def LeakyRelu(X:Tensor, alpha:float=0.01): return X.leaky_relu(alpha) + def ThresholdedRelu(X:Tensor, alpha:float=1.0): return (X > alpha).where(X, 0) + def LogSoftmax(x: Tensor, axis:int=-1): return x.log_softmax(axis) + def Hardmax(x:Tensor, axis:int=-1): return x.argmax(axis).unsqueeze(axis)._one_hot_along_dim(x.shape[axis], dim=axis).cast(x.dtype) + def Binarizer(x:Tensor, threshold:float=0.0): return (x > threshold).float() + def Swish(x:Tensor, alpha:float=1.0): return x * (x * alpha).sigmoid() + + # ***** Unary Ops (broadcasted) ***** + def Add(x:Tensor,y:Tensor, broadcast=None, axis=None): return x + y + def Sub(x:Tensor|int,y:Tensor): return x - y # some test has input as int + def Div(x:Tensor,y:Tensor): return x.div(y, rounding_mode='trunc' if dtypes.is_int(x.dtype) else None) + # ONNX Pow is (T, T1) -> T, the output takes the base dtype while Tensor.pow promotes base and exponent + def Pow(x:Tensor,y:Tensor): return x.pow(y).round().cast(x.dtype) if dtypes.is_int(x.dtype) else x.pow(y) + def Less(x:Tensor,y:Tensor): return x < y + def LessOrEqual(x:Tensor,y:Tensor): return x <= y + def Greater(x:Tensor,y:Tensor): return x > y + def GreaterOrEqual(x:Tensor,y:Tensor): return x >= y + def Equal(x:Tensor,y:Tensor): return x == y + def And(x:Tensor,y:Tensor): return (x==y).where(x, False) + def Or(x:Tensor,y:Tensor): return (x==y).where(x, True) + def Xor(x:Tensor,y:Tensor): return x.bool().bitwise_xor(y.bool()) + def BitwiseAnd(x:Tensor,y:Tensor): return x & y + def BitwiseOr(x:Tensor,y:Tensor): return x | y + def BitwiseXor(x:Tensor,y:Tensor): return x ^ y + def BitwiseNot(x:Tensor): return ~x + def Mod(x:Tensor,y:Tensor,fmod=0): return x.fmod(y) if fmod else x % y + + # ***** Casting Ops ***** + # NOTE: saturate only applies to FP8 types + def Cast(x:Tensor, to:int, saturate:int=1): return x.cast(OnnxDataType(to).to_dtype()) + def CastLike(x:Tensor, target_type:Tensor, saturate:int=1): return x.cast(target_type.dtype) + + # ***** Reduce Ops ***** + def Max(*data_0:Tensor): return functools.reduce(Tensor.maximum, data_0) + def Min(*data_0:Tensor): return functools.reduce(Tensor.minimum, data_0) + def Sum(*data_0:Tensor): return functools.reduce(Tensor.add, data_0) + def Mean(*data_0:Tensor): return Sum(*data_0) / len(data_0) + def ReduceMax(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return data.max(_axes(axes, noop_with_empty_axes), keepdim=keepdims) + def ReduceMin(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return data.min(_axes(axes, noop_with_empty_axes), keepdim=keepdims) + def ReduceSum(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return data.sum(_axes(axes, noop_with_empty_axes), keepdim=keepdims) + def ReduceMean(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return data.mean(_axes(axes, noop_with_empty_axes), keepdim=keepdims) + def ReduceSumSquare(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return ReduceSum(data.square(), axes, keepdims, noop_with_empty_axes) + def ReduceProd(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return data.prod(_axes(axes, noop_with_empty_axes), keepdim=keepdims) + def ReduceL1(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return ReduceSum(data.abs(), axes, keepdims, noop_with_empty_axes) + def ReduceL2(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + dtype = dtypes.float if data.dtype in (dtypes.float16, dtypes.bfloat16) else data.dtype + return ReduceSum(data.cast(dtype).square(), axes, keepdims, noop_with_empty_axes).sqrt().cast(data.dtype) + def ReduceLogSum(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return ReduceSum(data, axes, keepdims, noop_with_empty_axes).log() + def ReduceLogSumExp(data:Tensor, axes:list[int]|None=None, keepdims:int=1, noop_with_empty_axes:int=0): + return ReduceSum(data.exp(), axes, keepdims, noop_with_empty_axes).log() + def ArgMax(x:Tensor, axis:int=0, keepdims:int=1, select_last_index:int=0): + if select_last_index: return ((int(x.shape[axis])-1) - x.flip(axis).argmax(axis, keepdim=keepdims)).cast(dtypes.int64) + return x.argmax(axis, keepdim=keepdims).cast(dtypes.int64) + def ArgMin(x, axis:int=0, keepdims:int=1, select_last_index:int=0): + return ArgMax(-x, axis=axis, keepdims=keepdims, select_last_index=select_last_index) + + # ***** Movement Ops ***** + def Reshape(data:Tensor, shape:list[int], allowzero:int=0): + return data.reshape([x if x != 0 else (0 if allowzero else data.shape[i]) for i,x in enumerate(shape)]) + def Flatten(x:Tensor, axis:int=1): return x.reshape(prod(x.shape[0:axis]), -1) + def Expand(x:Tensor, shape:list[int]): return x.expand(_broadcast_shape(x.shape, tuple(shape))) + def Shrink(x:Tensor, bias:float=0.0, lambd:float=0.5): return (x < -lambd)*(x+bias) + (x > lambd)*(x-bias) + def Transpose(x:Tensor, perm:list[int]|None=None): return x.permute(order=perm or list(range(x.ndim)[::-1])) + + def Squeeze(data:Tensor, axes:list[int]|None=None): + return data.squeeze() if axes is None else functools.reduce(lambda d, dim: d.squeeze(dim), sorted(axes, reverse=True), data) + def Unsqueeze(data:Tensor, axes:list[int]): return functools.reduce(lambda d, dim: d.unsqueeze(dim), sorted(axes), data) + + def Tile(x:Tensor, repeats:list[int]): return x.repeat(repeats) + def Concat(*xs:Tensor, axis:int): return Tensor.cat(*xs, dim=axis) + def Slice(data:Tensor, starts:list[int], ends:list[int], axes:list[int]|None=None, steps:list[int]|None=None): + axes = axes or list(range(data.ndim)) + steps = steps or [1] * data.ndim + slices = [slice(None)] * data.ndim + for i, axis in enumerate(axes): slices[axis] = slice(starts[i], ends[i], steps[i]) + return data[tuple(slices)] + + def Split(data:Tensor, split:list[int]|None=None, num_outputs:int=0, axis:int=0): + sz = int(data.shape[axis]) + if split is None: split = [sz // num_outputs + (1 if i < sz % num_outputs else 0) for i in range(num_outputs)] + return data.split(split, axis) + + def Pad(x:Tensor, pads:list[int], constant_value:ConstType|None=None, axes:list[int]|None=None, + mode:Literal["constant", "reflect", "edge", "wrap"]="constant", value=0): + value = _resolve_const(value if constant_value is None else constant_value) + axes = axes or list(range(x.ndim)) + real_pads = [0] * (x.ndim*2) + for i,axis in enumerate(axes): real_pads[axis%x.ndim], real_pads[axis%x.ndim+x.ndim] = pads[i], pads[i+len(axes)] + return x.pad(padding=_onnx_pads_to_tiny_pads(real_pads), mode={"edge":"replicate", "wrap":"circular"}.get(mode, mode), value=value) + + def CenterCropPad(t:Tensor, shape:list[int], axes:list[int]|None=None): + shrink_arg:list[None|tuple[sint,sint]] = [None] * t.ndim + pad_arg:list[None|tuple[sint,sint]] = [None] * t.ndim + for s, x in zip(shape, axes or range(t.ndim)): + tx = t.shape[x] + if s < tx: shrink_arg[x] = (tx//2 - (s+1)//2, tx//2 + s//2) + elif s > tx: pad_arg[x] = ((s-tx)//2, (s-tx+1)//2) + return t.shrink(tuple(shrink_arg)).pad(tuple(pad_arg)) + + # ***** Processing Ops ***** + def AveragePool(X: Tensor, kernel_shape:list[int], auto_pad:AUTO_PAD_OPTIONS="NOTSET", ceil_mode:int=0, count_include_pad:int=0, + dilations:list[int]|int=1, pads:list[int]|int=0, strides:list[int]|int=1): + pool_pads = _resolve_pool_pads(X, pads, kernel_shape, dilations, strides, auto_pad) + return X.avg_pool2d(tuple(kernel_shape), strides, dilations, pool_pads, ceil_mode=ceil_mode, count_include_pad=count_include_pad) + + def MaxPool(X: Tensor, kernel_shape:list[int], auto_pad:AUTO_PAD_OPTIONS="NOTSET", ceil_mode:int=0, dilations:list[int]|int=1, pads:list[int]|int=0, + storage_order:int=0, strides:list[int]|int=1): + pool_pads = _resolve_pool_pads(X, pads, kernel_shape, dilations, strides, auto_pad) + out = X.max_pool2d(tuple(kernel_shape), strides, dilations, pool_pads, ceil_mode=ceil_mode, return_indices=True) + ret, idx = cast(tuple[Tensor, Tensor], out) + return ret, idx.transpose(-2, -1).cast(dtypes.int64) if storage_order else idx.cast(dtypes.int64) + + def Conv(X: Tensor, W: Tensor, B:Tensor|None=None, auto_pad:AUTO_PAD_OPTIONS="NOTSET", dilations:list[int]|int=1, group:int=1, + kernel_shape:list[int]|None=None, pads:list[int]|int=0, strides:list[int]|int=1): + return X.conv2d(W, B, stride=strides, groups=group, dilation=dilations, + padding=_resolve_pool_pads(X, pads, kernel_shape or W.shape[2:], dilations, strides, auto_pad)) + + def ConvTranspose(X: Tensor, W: Tensor, B:Tensor|None=None, auto_pad:AUTO_PAD_OPTIONS="NOTSET", dilations:list[int]|int=1, group:int=1, + kernel_shape:list[int]|None=None, pads:list[int]|None=None, output_shape:list[int]|None=None, output_padding:list[int]|int=0, + strides:list[int]|int=1): + input_shape_, kernel_shape_ = X.shape[2:], (kernel_shape or W.shape[2:]) + strides_, dilations_, output_padding_ = (make_tuple(x, len(input_shape_)) for x in (strides, dilations, output_padding)) + if output_shape is not None: # we pad according to output_shape + pads = _auto_pad([s_*(i-1) + op_ + ((k_-1)*d_+1) - os for s_,i,op_,k_,d_,os in + zip(strides_, input_shape_, output_padding_, kernel_shape_, dilations_, output_shape)], auto_pad) + if pads is None: # we generate pads + output_shape = output_shape or [int(X.shape[i+2]) * strides_[i] for i in range(len(strides_))] + pads = [int(strides_[i]*(input_shape_[i]-1)+output_padding_[i]+((kernel_shape_[i]-1)*dilations_[i]+1)-output_shape[i]) + for i in range(len(input_shape_))] + pads = _auto_pad(pads, auto_pad) if auto_pad != "NOTSET" else [0] * len(input_shape_) * 2 + pads = _onnx_pads_to_tiny_pads(pads) + return X.conv_transpose2d(W, B, group, strides_, dilations_, pads, output_padding_) + + def MaxUnpool(xT: Tensor, xI: Tensor, outshape: list[int]|None=None, kernel_shape:list[int]|None=None, pads:list[int]|int=0, + strides:list[int]|int=1): + if kernel_shape is None: kernel_shape = [] + pads_: int | tuple[int, ...] = tuple(pads) if isinstance(pads, list) else pads + return Tensor.max_unpool2d(xT, xI, tuple(kernel_shape), strides, 1, pads_, outshape if outshape is None else tuple(outshape)) + + def GlobalAveragePool(X:Tensor): return X.mean(axis=tuple(range(2, X.ndim)), keepdim=True) + def GlobalMaxPool(X:Tensor): return X.max(axis=tuple(range(2, X.ndim)), keepdim=True) + + def Gemm(A:Tensor, B:Tensor, C:Tensor|None=None, alpha:float=1.0, beta:float=1.0, transA:int=0, transB:int=0, broadcast=0): + ret = alpha * (A.transpose(transA) @ B.transpose(transB)) + if C is not None: ret = ret + beta * (C if broadcast == 0 else C.reshape([-1 if i < len(C.shape) else 1 for i in range(ret.ndim)][::-1])) + return ret + + def Einsum(*Inputs:list[Tensor], equation:str): return Tensor.einsum(equation, *Inputs) + + def CumSum(X:Tensor, axis:int|list[int], exclusive:int=0, reverse:int=0): + axis = X._resolve_dim(_resolve_const(axis)) + if reverse: X = X.flip(axis) + if exclusive: X = X.pad(tuple((1,0) if i == axis else None for i in range(X.ndim)))\ + .shrink(tuple((0,X.shape[axis]) if i == axis else None for i in range(X.ndim))) + return X.cumsum(axis).flip(axis) if reverse else X.cumsum(axis) + + def Trilu(x:Tensor, k:int|list[int]=0, upper:int=1): + k_ = _resolve_const(k) + return x.triu(k_) if upper else x.tril(k_) + + def Resize(X:Tensor, roi:list[float]|None=None, scales:list[float]|None=None, sizes:list[int]|None=None, antialias:int=0, + axes:list[int]|None=None, coordinate_transformation_mode:str='half_pixel', cubic_coeff_a:float=-0.75, exclude_outside:int=0, + extrapolation_value:float=0.0, keep_aspect_ratio_policy:str='stretch', mode:str='nearest', nearest_mode:str='round_prefer_floor'): + def _apply_transformation(input_sz, output_sz, scale_dim, mode): + index = Tensor.arange(output_sz) + if mode == "half_pixel": return (index + 0.5) / scale_dim - 0.5 + if mode == "align_corners": return index * (input_sz - 1) / (output_sz - 1) if output_sz != 1 else index.const_like(0) + if mode == "asymmetric": return index / scale_dim + if mode == "pytorch_half_pixel": return ((index + 0.5) / scale_dim - 0.5) if output_sz != 1 else index.const_like(0) + if mode == "half_pixel_symmetric": + output_dim_scaled = input_sz * scale_dim + return (input_sz / 2) * (1 - (output_sz / output_dim_scaled)) + (index + 0.5) / scale_dim - 0.5 + raise ValueError(f"invalid {coordinate_transformation_mode=}") + + if antialias: raise NotImplementedError("antialias is not implemented") + axes = axes or list(range(X.ndim)) + perm = [a for a in range(len(X.shape)) if a not in axes] + list(axes) + # we pre-permute the axes and permute back after resize + # the permute aligns X's axes to scales, sizes, and roi + X = X.permute(*perm) + + input_shape = cast(tuple[int, ...], X.shape[2:]) + if scales is not None: assert all(sc==1 for sc in scales[:-len(input_shape)]), "resizing batch_size dim or channel dim not supported" + if sizes is not None: assert tuple(sizes[:-2]) == tuple(X.shape[X.ndim-len(sizes):-2]), "resizing batch_size dim or channel dim not supported" + + scales, sizes = (None if scales is None else scales[-len(input_shape):]), (None if sizes is None else sizes[-len(input_shape):]) + if sizes is not None: + if keep_aspect_ratio_policy in ["not_larger", "not_smaller"]: + scale_fxn = min if keep_aspect_ratio_policy == "not_larger" else max + scale = scale_fxn(sz / sh for sz,sh in zip(sizes, input_shape)) + sizes, scales = [int(scale * sh + 0.5) for sh in input_shape], [scale]*len(input_shape) + else: scales = [sz / sh for sz, sh in zip(sizes, input_shape)] + else: + assert scales is not None, "either sizes or scales must be provided" + sizes = [int(sc * sh) for sc, sh in zip(scales, input_shape)] + + if all(sz == sh for sz, sh in zip(sizes, input_shape)): return X.permute(*argsort(perm)) if perm else X + + indexes = [] + for input_sz, output_sz, scale in zip(input_shape, sizes, scales): + indexes.append(_apply_transformation(input_sz, output_sz, scale, coordinate_transformation_mode)) + + if mode in ["nearest", "linear"]: indexes = [idx.clip(0, sz-1) for idx, sz in zip(indexes, input_shape)] + + if mode == "nearest": + mode_operations = { + "round_prefer_floor": lambda idx: (idx - 0.5).ceil(), + "round_prefer_ceil": lambda idx: (idx + 0.5).floor(), + "floor": lambda idx: idx.floor(), + "ceil": lambda idx: idx.ceil() + } + if nearest_mode not in mode_operations: raise ValueError(f"invalid {nearest_mode=}") + indexes = [mode_operations[nearest_mode](idx).int() for idx in indexes] + X = X[(..., *Tensor.meshgrid(*indexes))] + + if mode == "linear": + expand = list(X.shape) + for i in range(-len(sizes), 0): + reshape, index = [1] * X.ndim, indexes[i] + reshape[i] = expand[i] = sizes[i] + low, high, perc = [y.reshape(reshape).expand(expand) for y in (index.floor().int(), index.ceil().int(), index - index.floor())] + X = X.gather(i, low).lerp(X.gather(i, high), perc) + + if mode == "cubic": + A = cubic_coeff_a + + # Keys weights + # see piecewise function in: https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm + def W0_1(x:Tensor): return polyN(x, [A + 2, -(A + 3), 0, 1]) + def W1_2(x: Tensor): return polyN(x, [A, -5 * A, 8 * A, -4 * A]) + + expand = list(X.shape) + for i in range(-len(sizes), 0): + input_sz = cast(int, X.shape[i]) + reshape, index = [1] * X.ndim, indexes[i] + reshape[i] = expand[i] = sizes[i] + + p = index.floor().int() + ratio = index - p # in [0, 1] + + # Neighbor indices + idx0, idx1, idx2, idx3 = [p + d for d in [-1, 0, 1, 2]] + # Weights of distance from index and neighbor indices + c0, c1, c2, c3 = W1_2(ratio+1), W0_1(ratio), W0_1(-(ratio-1)), W1_2(-(ratio-2)) + + if exclude_outside: + c0 = ((idx0 >= 0) & (idx0 < input_sz)).where(c0, 0) + c1 = ((idx1 >= 0) & (idx1 < input_sz)).where(c1, 0) + c2 = ((idx2 >= 0) & (idx2 < input_sz)).where(c2, 0) + c3 = ((idx3 >= 0) & (idx3 < input_sz)).where(c3, 0) + + total = c0 + c1 + c2 + c3 + c0, c1, c2, c3 = c0 / (total + 1e-9), c1 / (total + 1e-9), c2 / (total + 1e-9), c3 / (total + 1e-9) + + # Reshape and expand + expanded_indices = [y.clip(0, input_sz - 1).reshape(reshape).expand(expand) for y in [idx0, idx1, idx2, idx3]] + expanded_coeffs = [y.reshape(reshape).expand(expand) for y in [c0, c1, c2, c3]] + + # Gather values and apply coefficients + gathered_values = [X.gather(i, idx) for idx in expanded_indices] + X = sum(v * c for v, c in zip(gathered_values, expanded_coeffs)) + return X.permute(*argsort(perm)) if perm else X + def Upsample(X, scales, mode): return Resize(X=X, scales=scales, mode=mode) # deprecated + + def TopK(X:Tensor, K:int|list[int], axis:int=-1, largest:int=1, sorted:int=1): # noqa: A002 # pylint: disable=redefined-builtin + val, idx = X.topk(_resolve_const(K), axis, bool(largest), bool(sorted)) + return val, idx.cast(dtypes.int64) + + # ***** Neural Network Ops ***** + def BatchNormalization(X:Tensor, scale:Tensor, B:Tensor, input_mean:Tensor, input_var:Tensor, epsilon:float=1e-05, momentum:float=0.9, + training_mode:int=0, spatial=1, is_test=0): + if training_mode: + x_detached = X.detach().cast(least_upper_dtype(X.dtype, dtypes.float32)) + current_mean = x_detached.mean(axis=(0,2,3)) + y = (x_detached - current_mean.reshape(shape=[1, -1, 1, 1])) + current_var = (y*y).mean(axis=(0,2,3)) + current_invstd = current_var.add(epsilon).rsqrt() + + running_mean = input_mean * momentum + current_mean * (1 - momentum) + running_var = input_var * momentum + current_var * (1 - momentum) + + return X.batchnorm(scale, B, current_mean, current_invstd).cast(X.dtype),running_mean.cast(input_mean.dtype),running_var.cast(input_var.dtype) + return X.batchnorm(scale, B, input_mean, (input_var + epsilon).rsqrt()) + def GroupNormalization(x:Tensor, scale:Tensor, bias:Tensor, num_groups:int, epsilon:float=1e-05, stash_type:int=1): + assert stash_type == 1, "only float32 is supported" + x = x.reshape(x.shape[0], num_groups, -1).cast(dtypes.float).layernorm(eps=epsilon).cast(x.dtype).reshape(x.shape) + return x * scale.reshape(1, -1, *[1] * (x.ndim-2)) + bias.reshape(1, -1, *[1] * (x.ndim-2)) + def InstanceNormalization(x:Tensor, scale:Tensor, bias:Tensor, epsilon:float=1e-05): + return GroupNormalization(x, scale, bias, num_groups=cast(int, x.shape[1]), epsilon=epsilon) + def LayerNormalization(x:Tensor, scale:Tensor, bias:Tensor|None=None, axis:int=-1, epsilon:float=1e-05, stash_type:int=1): + assert stash_type == 1, "only float32 is supported" + axes = tuple(i for i in range(axis if axis >= 0 else x.ndim + axis, x.ndim)) + mean = (x32:=x.cast(dtypes.float)).mean(axis=axes, keepdim=True) + inv_std_dev = (x32.sub(mean)).square().mean(axis=axes, keepdim=True).add(epsilon).rsqrt() + ret = (x32.sub(mean)*inv_std_dev).cast(x.dtype).mul(scale) + return (ret.add(bias) if bias is not None else ret), mean, inv_std_dev + def SkipLayerNormalization(x:Tensor, skip:Tensor, gamma:Tensor, beta:Tensor|None=None, bias:Tensor|None=None, epsilon:float=1e-12): + x = x + skip + if bias is not None: x = x + bias + ret = x.layernorm(eps=epsilon) * gamma + if beta is not None: ret = ret + beta + return ret, None, None, x + def EmbedLayerNormalization(input_ids: Tensor, segment_ids:Tensor, word_embedding:Tensor, position_embedding:Tensor, + segment_embedding:Tensor, gamma=None, beta=None, mask:Tensor|None=None, + position_ids:Tensor|None=None, epsilon=1e-12, mask_index_type=0): + # https://github.com/microsoft/onnxruntime/blob/main/docs/ContribOperators.md#com.microsoft.EmbedLayerNormalization + assert (segment_ids is None) is (segment_embedding is None) + assert mask is None and not mask_index_type, "functionality not supported yet" # TODO + input_shape, seq_length = input_ids.shape, input_ids.shape[1] + vocab_size, max_position_embeddings = word_embedding.shape[0], position_embedding.shape[0] + + def embedding(x:Tensor, vocab_size, weight:Tensor) -> Tensor: + return x.unsqueeze(-1).expand(*x.shape, vocab_size)._one_hot_along_dim(vocab_size) @ weight + + # bert embedding layer + if position_ids is None: position_ids = Tensor.arange(seq_length).unsqueeze(0).expand(*input_shape) + wrd_embedding_res = embedding(input_ids, vocab_size, word_embedding) + pos_embedding_res = embedding(position_ids, max_position_embeddings, position_embedding) + + embedding_sum = wrd_embedding_res + pos_embedding_res + if segment_embedding is not None: embedding_sum = embedding_sum + embedding(segment_ids, segment_embedding.shape[0], segment_embedding) + out = embedding_sum.layernorm(eps=epsilon) * gamma + beta + return out, None, embedding_sum + def MeanVarianceNormalization(x:Tensor, axis:list[int]|None=None): + if axis is None: axis = [0,2,3] + return (x - x.mean(axis, keepdim=True)) / (x.std(axis, keepdim=True, correction=0) + 1e-9) + + def LpNormalization(x:Tensor, axis:int=-1, p:int=2): + return x / (x.abs().sum(axis, keepdim=True) if p == 1 else x.square().sum(axis, keepdim=True).sqrt()) + + def OneHot(indices:Tensor, depth:float|int|list[int|float], values:Tensor, axis:int=-1): + # Scalar or Rank 1 tensor containing exactly one element + depth = int(_resolve_const(depth)) + indices = indices.int() + indices = (indices < 0).where(indices+depth, indices) + return indices.unsqueeze(axis)._one_hot_along_dim(depth, dim=axis).where(values[1], values[0]) + + def DepthToSpace(X:Tensor, blocksize:int, mode:str="DCR"): + return X.rearrange("b (c h1 w1) h w -> b c (h h1) (w w1)" if mode=="CRD" else "b (h1 w1 c) h w -> b c (h h1) (w w1)", h1=blocksize, w1=blocksize) + def SpaceToDepth(X:Tensor, blocksize:int): + return X.rearrange("b c (h h1) (w w1) -> b (h1 w1 c) h w", h1=blocksize, w1=blocksize) + + # Reimplemented here because you need legacy RNG for passing ONNX tests. + def dropout_7(data:Tensor, ratio:float=0.5, training_mode:bool=False, seed:int|None=None): + import numpy as np + if not training_mode: return data, data.const_like(True, dtypes.bool) + if seed is not None: + rand = Tensor(np.random.RandomState(seed).random(cast(tuple[int,...], data.shape)), dtype=data.dtype, device=data.device) + else: + rand = data.rand_like() + mask = rand >= ratio + return data * mask / (1.0 - ratio), mask + # 6 with 'is_test' needed for https://github.com/MTlab/onnx2caffe/raw/refs/heads/master/model/MobileNetV2.onnx + def dropout_6(data:Tensor, ratio:float=0.5, is_test=0): return dropout_7(data, ratio, training_mode=not is_test) + Dropout = {OpSetId(Domain.ONNX, 6):dropout_6, OpSetId(Domain.ONNX, 7):dropout_7} + + def _window(size, output_datatype, periodic, a): + size = int(_resolve_const(size)) + N, n = (size if periodic else size - 1), Tensor.arange(size) + w = a[0] - a[1] * (n * (2 * math.pi / N)).cos() + a[2] * (n * (4 * math.pi / N)).cos() + return w.cast(OnnxDataType(output_datatype).to_dtype()) + def HannWindow(size, output_datatype:int=1, periodic:int=1): return _window(size, output_datatype, periodic, (0.5, 0.5, 0)) + def HammingWindow(size, output_datatype:int=1, periodic:int=1): return _window(size, output_datatype, periodic, (25/46, 21/46, 0)) + def BlackmanWindow(size, output_datatype:int=1, periodic:int=1): return _window(size, output_datatype, periodic, (0.42, 0.5, 0.08)) + + def LRN(x:Tensor, size:int, alpha:float=1e-4, beta:float=0.75, bias:float=1.0): + pooled_x = (x**2).rearrange('b c h w -> b 1 c (h w)').pad((0,0,(size-1)//2, size//2)).avg_pool2d((size, 1), 1) + return x / (pooled_x.reshape(x.shape) * alpha + bias).pow(beta) + + def NegativeLogLikelihoodLoss(x:Tensor, target:Tensor, weight:Tensor|None=None, ignore_index:int|None=None, reduction:ReductionStr="mean"): + return x.nll_loss(target, weight, ignore_index, reduction) + def SoftmaxCrossEntropyLoss(scores:Tensor, labels:Tensor, weights:Tensor|None=None, ignore_index:int|None=None, reduction:ReductionStr="mean"): + log_probs = scores.log_softmax(1) + return log_probs.nll_loss(labels, weights, ignore_index, reduction), log_probs + + def AffineGrid(theta:Tensor, size:list[int], align_corners:int=0): + N, _, *spatial_dims = size + def generate_grid(steps): + if align_corners: return Tensor.linspace(-1, 1, steps) + return Tensor.linspace(-1+1/steps, 1-1/steps, steps) + grids = Tensor.meshgrid(*(generate_grid(d) for d in spatial_dims)) + base_grid = Tensor.stack(*reversed(grids), grids[0].const_like(1), dim=-1) + base_grid = base_grid.reshape(1, prod(spatial_dims), len(grids)+1).expand(N, -1, -1) + return (base_grid @ theta.transpose(1, 2)).reshape(N, *spatial_dims, -1) + + def attention_contrib(x:Tensor, weights:Tensor, bias:Tensor|None=None, mask_index:Tensor|None=None, past:Tensor|None=None, + attention_bias:Tensor|None=None, past_sequence_length:Tensor|None=None, do_rotary:int=0, mask_filter_value:float=-10000.0, + num_heads:int|None=None, past_present_share_buffer:int|None=None, qkv_hidden_sizes:list[int]|None=None, + rotary_embedding_dim:int|None=None, scale:float|None=None, unidirectional:int=0): + assert not do_rotary and not attention_bias, "TODO" + if qkv_hidden_sizes is None: qkv_hidden_sizes = [int(weights.shape[1] // 3)] * 3 + qkv = x.linear(weights, bias) + q, k, v = qkv.split(qkv_hidden_sizes, dim=2) + + batch_size, seq_len, _ = x.shape + assert num_heads is not None, "num_heads must be provided" + q_head_size, k_head_size, v_head_size = (sz // num_heads for sz in qkv_hidden_sizes) + q, k, v = (x.reshape(batch_size, seq_len, num_heads, hsz).transpose(1, 2) for x, hsz in zip((q, k, v), (q_head_size, k_head_size, v_head_size))) + + present = None + if past is not None: + k, v = past[0].cat(k, dim=2), past[1].cat(v, dim=2) + present = k.stack(v) + + if scale is None: scale = 1.0 / math.sqrt(q_head_size) + attn_scores = q @ k.transpose(-1, -2) * scale + + if mask_index is not None: + assert 4 >= mask_index.ndim >= 1, f"{mask_index.ndim=}" + assert isinstance(batch_size, int), f"{batch_size=}" + if mask_index.ndim != 1: mask = mask_index.bool() + else: + if mask_index.shape[0] == batch_size: + mask = Tensor.arange(attn_scores.shape[-1]).unsqueeze(0) < mask_index.unsqueeze(1) + elif mask_index.shape[0] == 2*batch_size: + end_positions = mask_index[:batch_size] + start_positions = mask_index[batch_size:] + arange = Tensor.arange(seq_len).unsqueeze(0) + mask = (arange < end_positions.unsqueeze(1)) & (arange >= start_positions.unsqueeze(1)) + else: raise NotImplementedError("mask_index with shape (3 * batch_size + 2) is not implemented") + while mask.ndim < 4: mask = mask.unsqueeze(1) + attn_scores = mask.where(attn_scores, mask_filter_value) + + if unidirectional: + causal_mask = Tensor.ones((seq_len, seq_len), dtype=dtypes.bool, buffer=False).tril() + attn_scores = causal_mask.where(attn_scores, mask_filter_value) + + output = attn_scores.softmax(-1) @ v + output = output.transpose(1, 2).reshape(batch_size, seq_len, -1) + return output, present + + def attention_onnx(Q:Tensor, K:Tensor, V:Tensor, attn_mask:Tensor|None=None, past_key:Tensor|None=None, past_value:Tensor|None=None, + nonpad_kv_seqlen:Tensor|None=None, is_causal:int=0, kv_num_heads:int|None=None, q_num_heads:int|None=None, + qk_matmul_output_mode:int=0, scale:float|None=None, softcap:float=0.0, softmax_precision:int|None=None): + if nonpad_kv_seqlen is not None: raise NotImplementedError("nonpad_kv_seqlen is not supported") + input_shape_len = Q.ndim + if input_shape_len == 3: + assert q_num_heads is not None and kv_num_heads is not None + Q = Q.reshape(Q.shape[0], Q.shape[1], q_num_heads, -1).permute(0, 2, 1, 3) + K = K.reshape(K.shape[0], K.shape[1], kv_num_heads, -1).permute(0, 2, 1, 3) + V = V.reshape(V.shape[0], V.shape[1], kv_num_heads, -1).permute(0, 2, 1, 3) + + if past_key is not None: K = past_key.cat(K, dim=2) + if past_value is not None: V = past_value.cat(V, dim=2) + present_key, present_value = K, V + + _q_heads, _kv_heads = q_num_heads or Q.shape[1], kv_num_heads or K.shape[1] + if _q_heads != _kv_heads: + K = K.repeat((1, _q_heads // _kv_heads, 1, 1)) + V = V.repeat((1, _q_heads // _kv_heads, 1, 1)) + + effective_scale = scale if scale is not None else 1.0 / (cast(int, Q.shape[-1]) ** 0.5) + scores = (Q @ K.transpose(-1, -2)) * effective_scale + qk_matmul_return_val = scores + + if is_causal: + causal_mask = Tensor.ones(Q.shape[-2], K.shape[-2], dtype=dtypes.bool, buffer=False).tril(0) + scores = scores.masked_fill(causal_mask.logical_not(), -float("inf")) + + if attn_mask is not None: + mask_to_add = attn_mask.where(0, -float("inf")) if attn_mask.dtype == dtypes.bool else attn_mask + scores = scores + mask_to_add + if qk_matmul_output_mode == 1: qk_matmul_return_val = scores + + if softcap > 0.0: scores = (scores / softcap).tanh() * softcap + if qk_matmul_output_mode == 2: qk_matmul_return_val = scores + + if softmax_precision: scores = scores.cast({1: dtypes.float32, 10: dtypes.float16, 16: dtypes.bfloat16}[softmax_precision]) + qk_softmax = scores.softmax(-1).cast(Q.dtype) + if qk_matmul_output_mode == 3: qk_matmul_return_val = qk_softmax + + output = (qk_softmax @ V).cast(Q.dtype) + if input_shape_len == 3: output = output.permute(0, 2, 1, 3).reshape(Q.shape[0], Q.shape[2], -1) + return output, present_key, present_value, qk_matmul_return_val + Attention = {OpSetId(Domain.ONNX, 1): attention_onnx, OpSetId(Domain.MICROSOFT_CONTRIB_OPS, 1): attention_contrib} + + def RMSNormalization(X:Tensor, scale:Tensor, axis:int=-1, epsilon:float=1e-5, stash_type:int=1): + assert stash_type == 1, "only float32 is supported" + norm = X.cast(dtypes.float).square().mean(axis=tuple(range(axis + X.ndim if axis < 0 else axis, X.ndim)), keepdim=True).add(epsilon).rsqrt() + return X * norm * scale + + def RotaryEmbedding(X:Tensor, cos_cache:Tensor, sin_cache:Tensor, position_ids:Tensor|None=None, interleaved:int=0, num_heads:int|None=None, + rotary_embedding_dim:int=0): + original_input_shape = X.shape + + if X.ndim == 4: X = X.permute(0, 2, 1, 3) + elif X.ndim == 3: + assert num_heads is not None, "num_heads must be provided for 3D input" + X = X.unflatten(-1, (num_heads, int(X.shape[-1]) // num_heads)) + + head_size = cast(int, X.shape[-1]) + rot_dim = rotary_embedding_dim or head_size + x_rotate, x_pass = X[..., :rot_dim], X[..., rot_dim:] + + cos = cos_cache[position_ids] if position_ids is not None else cos_cache[:head_size] + sin = sin_cache[position_ids] if position_ids is not None else sin_cache[:head_size] + cos = cos[..., :rot_dim//2].unsqueeze(2) + sin = sin[..., :rot_dim//2].unsqueeze(2) + + x1, x2 = (x_rotate[..., ::2], x_rotate[..., 1::2]) if interleaved else x_rotate.chunk(2, dim=-1) + real = x1 * cos - x2 * sin + imag = x1 * sin + x2 * cos + x_rotated = real.stack(imag, dim=-1).flatten(start_dim=-2) if interleaved else real.cat(imag, dim=-1) + + output = x_rotated.cat(x_pass, dim=-1) + return output.flatten(start_dim=2) if len(original_input_shape) == 3 else output.permute(0, 2, 1, 3) + + # ***** Indexing Ops ***** + def NonZero(x:Tensor): + mask = (x!=0).flatten() + flat_idx = Tensor.arange(mask.numel(), dtype=dtypes.int64).masked_select(mask) + if flat_idx.ndim == 0: flat_idx = flat_idx.reshape(1) + if x.ndim == 0: + return Tensor.zeros((0, flat_idx.shape[0]), dtype=dtypes.int64, device=x.device) + strides = [prod(int(s) for s in x.shape[i+1:]) if i+1 < x.ndim else 1 for i in range(x.ndim)] + coords = [((flat_idx // stride) % int(dim)) for stride, dim in zip(strides, x.shape)] + return Tensor.stack(*coords, dim=0) + + def ArrayFeatureExtractor(x:Tensor, indices:Tensor): return x[..., indices] + + def Gather(x:Tensor, indices:Tensor|list[int]|int, axis:int=0): + axis = x._resolve_dim(axis) + # fast path for constant indices (passed as python list/int from to_python_const) + if not isinstance(indices, Tensor): + indices_list = [indices] if isinstance(indices, int) else list(indices) + indices_shape = () if isinstance(indices, int) else (len(indices_list),) + ret_shape = x.shape[:axis] + indices_shape + x.shape[axis+1:] + index_consts = [x.shape[axis]+i if i<0 else i for i in indices_list] + args = [[(0,s) if j != axis else (i,i+1) for j, s in enumerate(x.shape)] for i in index_consts] + return x.shrink(arg=tuple(args[0])).cat(*[x.shrink(arg=tuple(arg)) for arg in args[1:]], dim=axis).reshape(ret_shape) + return x[tuple([slice(None) if i != axis else indices for i in range(x.ndim)])] + def Scatter(*args, **kwargs): return ScatterElements(*args, **kwargs) # deprecated + + def GatherND(x:Tensor, indices:Tensor, batch_dims:int=0): + if batch_dims == 0: return x[tuple(i.squeeze(-1) for i in indices.split(1, -1))] + x_shape, i_shape = x.shape, indices.shape + b = math.prod(x.shape[dim] for dim in range(batch_dims)) + # NOTE: each batched dim of both input and indices are equal + x = x.reshape(b, *x.shape[batch_dims:]) + indices = indices.reshape(b, *indices.shape[batch_dims:]) + b_idx = Tensor.arange(b).reshape(b, *(1,)*(indices.ndim - 2)).expand(*indices.shape[:-1]) + ret = x[(b_idx,) + tuple(i.squeeze(-1) for i in indices.split(1, -1))] + return ret.reshape(*x_shape[:batch_dims], *i_shape[batch_dims:-1], *ret.shape[indices.ndim-1:]) + def ScatterND(x:Tensor, indices:Tensor, updates:Tensor, reduction:Literal["none", "add", "mul", "max", "min"]='none'): + assert updates.shape == indices.shape[:-1] + x.shape[cast(int, indices.shape[-1]):] + for index, u in zip(indices.split(1, 0), updates.split(1, 0)): + i = tuple(idx.squeeze(-1) for idx in index.squeeze(0).split(1, -1)) + u = u.squeeze(0) + if reduction == "none": x[i] = u + elif reduction == "add": x[i] += u + elif reduction == "mul": x[i] *= u + elif reduction == "max": x[i] = x[i].maximum(u) + elif reduction == "min": x[i] = x[i].minimum(u) + return x + + def TensorScatter(data: Tensor, updates: Tensor, indices: Tensor, mode: str = 'default'): + # scatter updates along axis -2 at positions given by indices, for each batch + B, U, D = indices.shape[0], updates.shape[-2], int(data.shape[-2]) + orig_shape, data_flat, updates_flat = data.shape, data.reshape(-1, D, data.shape[-1]), updates.reshape(-1, U, updates.shape[-1]) + B_total = data_flat.shape[0] + batch_idx = Tensor.arange(B_total).reshape(B_total, 1).expand(B_total, U) + indices_expanded = indices.reshape(B, *([1] * (data.ndim - 3))).expand(*orig_shape[:-2]).reshape(B_total) + row_idx = indices_expanded.reshape(B_total, 1).expand(B_total, U) + Tensor.arange(U).reshape(1, U).expand(B_total, U) + if mode == 'circular': row_idx = row_idx % D + return ScatterND(data_flat, batch_idx.unsqueeze(-1).cat(row_idx.unsqueeze(-1), dim=-1), updates_flat).reshape(orig_shape) + + def ScatterElements(x: Tensor, indices: Tensor, updates: Tensor, axis=0, reduction:Literal["none", "add", "mul", "min", "max"]="none"): + indices = (indices < 0).where(x.shape[axis], 0) + indices + if reduction == "none": return x.scatter(axis, indices, updates) + reduction_map: dict[Literal["add", "mul", "min", "max"], Literal["sum", "prod", "amin", "amax"]] = \ + {"add": "sum", "mul": "prod", "min": "amin", "max": "amax"} + reduction_ = reduction_map[reduction] + return x.scatter_reduce(axis, indices, updates, reduction_) + def GatherElements(x:Tensor, indices:Tensor, axis:int): + indices = (indices < 0).where(x.shape[axis], 0) + indices + return x.gather(axis, indices) + + def Compress(inp:Tensor, condition:list[bool], axis:int|None=None): + if axis is None: + inp = inp.flatten() + axis = 0 + axis = inp._resolve_dim(axis) + con = Tensor([i for i,cond in enumerate(condition) if cond], device=inp.device) # compress in python + return inp[tuple(con if i == axis else slice(None) for i in range(inp.ndim))] + + # ***** Quantization Ops ***** + def QuantizeLinear(x:Tensor, y_scale:Tensor, y_zero_point:Tensor|int=0, axis:int=1, block_size:int=0, output_dtype:int=0, saturate=1): + if isinstance(y_zero_point, Tensor): out_dtype = y_zero_point.dtype + elif output_dtype != 0: out_dtype = OnnxDataType(output_dtype).to_dtype() + else: out_dtype = dtypes.uint8 + y_scale, y_zero_point = _prepare_quantize(x, y_scale, y_zero_point, axis, block_size) + if out_dtype == dtypes.uchar: + # this appears to work in practice, at least for uchar out_dtype. it folds with the quantize stuff + ret = _clamp_cast((x / y_scale + 0.4999999 + y_zero_point).int(), out_dtype) + else: + ret = _clamp_cast(((x / y_scale).round() + y_zero_point), out_dtype) + return ret.contiguous() + + def DynamicQuantizeLinear(x: Tensor): + # only support uint8 + qmin, qmax = dtypes.uint8.min, dtypes.uint8.max + scale = (x.max().maximum(0) + ((-x).max()).maximum(0)) / (qmax - qmin) + zero_point = _clamp_cast((qmin - x.min() / scale).round(), dtypes.uint8) + y = _clamp_cast((x / scale).round() + zero_point, dtypes.uint8) + return y, scale, zero_point + + def DequantizeLinear(x:Tensor, x_scale:Tensor, x_zero_point:Tensor|int=0, axis:int=1, block_size:int=0): + x_scale, x_zero_point = _prepare_quantize(x, x_scale, x_zero_point, axis, block_size) + return ((x.int() - x_zero_point) * x_scale).cast(x_scale.dtype) + + def QLinearConv(x:Tensor, x_scale:Tensor, x_zero_point:Tensor, w:Tensor, w_scale:Tensor, w_zero_point:Tensor, y_scale:Tensor, + y_zero_point:Tensor, B:Tensor|None=None, **opts): + # align quant params for non-scalars based on https://onnx.ai/onnx/operators/onnx__QLinearConv.html + w_zero_point = w_zero_point.reshape(-1, 1, 1, 1) + w_scale = w_scale.reshape(1, -1, 1, 1) + return _qlinearop_quantized(Conv, [x,w], [x_zero_point,w_zero_point], [x_scale,w_scale], y_scale, y_zero_point, **{"B":B, **opts}) + + def QLinearMatMul(a:Tensor, a_scale:Tensor, a_zero_point:Tensor, b:Tensor, b_scale:Tensor, b_zero_point:Tensor, y_scale:Tensor, + y_zero_point:Tensor) -> Tensor: + return _qlinearop_quantized(Tensor.matmul, [a,b], [a_zero_point,b_zero_point], [a_scale,b_scale], y_scale, y_zero_point) + + def QLinearAdd(a:Tensor, a_scale:Tensor, a_zero_point:Tensor, b:Tensor, b_scale:Tensor, b_zero_point:Tensor, c_scale:Tensor, c_zero_point:Tensor): + return _qlinearop_float(Tensor.add, [a,b], [a_zero_point,b_zero_point], [a_scale,b_scale], c_scale, c_zero_point) + + def QLinearMul(a:Tensor, a_scale:Tensor, a_zero_point:Tensor, b:Tensor, b_scale:Tensor, b_zero_point:Tensor, c_scale:Tensor, c_zero_point:Tensor): + return _qlinearop_quantized(Tensor.mul, [a,b], [a_zero_point,b_zero_point], [a_scale,b_scale], c_scale, c_zero_point) + + def QLinearGlobalAveragePool(X:Tensor, x_scale:Tensor, x_zero_point:Tensor, y_scale:Tensor, y_zero_point:Tensor, channels_last:int): + if channels_last: X = X.permute(0, X.ndim-1, *range(1, X.ndim-1)) # NHWC -> NCHW + ret = _qlinearop_float(GlobalAveragePool, [X], [x_zero_point], [x_scale], y_scale, y_zero_point) + return ret.permute(0, *range(2, ret.ndim), 1) if channels_last else ret # NCHW -> NHWC + + def ConvInteger(x: Tensor, w: Tensor, x_zero_point:Tensor = Tensor(0), w_zero_point:Tensor = Tensor(0), B: Tensor | None = None, **opts) -> Tensor: + return _op_integer(Conv, [x,w], [x_zero_point,w_zero_point], **{"B":B, **opts}) + + def MatMulInteger(A: Tensor, B: Tensor, a_zero_point: Tensor = Tensor(0), b_zero_point: Tensor = Tensor(0)) -> Tensor: + return _op_integer(Tensor.matmul, [A,B], [a_zero_point,b_zero_point]) + + # ***** Training Ops ***** + # NOTE: onnx training ops actually don't need the state for optim, all the ops work in a functional way, but we still can reuse optim.py code + @_onnx_training(3) + def Adagrad(R:Tensor, T:int, *inputs:Tensor, decay_factor:float=0.0, epsilon:float=0.0, norm_coefficient:float=0.0): + X, G, H = (i.detach() for i in inputs) + grad = norm_coefficient * X + G + H.assign(H + grad.square()) + up = grad / (H.sqrt() + epsilon) + r = R / (1 + T * decay_factor) + X.assign(X.detach() - r * up) + return [X, H] + + @_onnx_training(4) + def Adam(R:Tensor, T:int, *inputs:Tensor, alpha:float=0.9, beta:float=0.999, epsilon:float=0.0, norm_coefficient:float=0.0, + norm_coefficient_post:float=0.0): + from tinygrad.nn.optim import Adam as TinyAdam + X, G, V, H = inputs + G, V, H = G.detach(), V.detach(), H.detach() + X.grad = norm_coefficient * X.detach() + G + opt = TinyAdam([X], b1=alpha, b2=beta, eps=epsilon) + # NOTE: FUSE_OPTIM can change shapes of m and v + opt.m, opt.v, opt.lr = [V.reshape(opt.m[0].shape)], [H.reshape(opt.v[0].shape)], R + # need no-op for m_hat and v_hat if T == 0 + if T == 0: opt.b1_t, opt.b2_t = opt.b1_t.zeros_like(), opt.b2_t.zeros_like() + else: + # `T-1` since it's applied again at the start of `_step` + opt.b1_t = Tensor([alpha**(T-1)], dtype=dtypes.float32, device=X.device) + opt.b2_t = Tensor([beta**(T-1)], dtype=dtypes.float32, device=X.device) + opt.step() + X = (1 - norm_coefficient_post) * X + return [X, V, H] + + @_onnx_training(3) + def Momentum(R:Tensor, T:int, *inputs:Tensor, alpha:float, beta:float, mode:str, norm_coefficient:float): + X, G, V = (i.detach() for i in inputs) + grad = norm_coefficient * X + G + # NOTE: this beta_adjusted term makes it so we can't use SGD for nesterov + beta_adjusted = beta if T > 0 else 1 + V.assign(alpha * V + grad * beta_adjusted) + X.assign(X - R * (V if mode == "standard" else (grad + alpha * V))) + return [X, V] + + def Gradient(*inputs:Tensor, y:str, intermediate_tensors:dict[str, Tensor], **_): + return tuple(intermediate_tensors[y].gradient(*inputs)) + + return { + # Tensor ops + **{op: getattr(Tensor, op.lower()) for op in ("Neg", "Reciprocal", "Sqrt", "Sign", "Abs", "Exp", "Log", "Mish", "Sin", "Cos", "Tan", + "Asin", "Acos", "Atan", "Relu", "Sigmoid", "MatMul", "Floor", "Ceil", "IsNaN", "Softplus", "HardSwish", "Where", "Mul", "Sinh", "Cosh", + "Tanh", "Softsign", "Asinh", "Acosh", "Atanh", "Elu", "Celu", "Selu", "Round", "Erf")}, + # Implemented ops + **{name:obj for name,obj in locals().items() if isinstance(obj, types.FunctionType) and not name.startswith("_") and name[0].isupper()}, + # Version ops + **{name:obj for name,obj in locals().items() if isinstance(obj, dict)}, + } + +onnx_ops = get_onnx_ops() diff --git a/artifacts/package_runtime/tinygrad/nn/optim.py b/artifacts/package_runtime/tinygrad/nn/optim.py new file mode 100644 index 000000000..b07fd75f1 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/nn/optim.py @@ -0,0 +1,179 @@ +# sorted in order of increasing complexity +import itertools +from tinygrad.helpers import dedup, flatten, getenv, unwrap, FUSE_OPTIM, TRAINING +from tinygrad.tensor import Tensor +from tinygrad.dtype import dtypes, least_upper_dtype, to_dtype + +class Optimizer: + """ + Base class for all optimizers. + """ + def __init__(self, params: list[Tensor], lr: float, device=None, fused=FUSE_OPTIM): + if lr < 0: raise ValueError(f"Invalid learning rate: {lr}") + self.params: list[Tensor] = dedup([x for x in params if x.is_param]) + assert len(self.params) != 0, "optimizer must have at least one param" + self.buffers: list[Tensor] = dedup([x for x in params if not x.is_param]) # buffers are still realized + self.device = device or self.params[0].device + self.param_dtype = to_dtype(getenv("OPTIM_DTYPE", "float32")) + self.fused = fused + # store lr in at least float32 precision + self.lr = Tensor(lr if getenv("CONST_LR") else [lr], device=self.device, + dtype=least_upper_dtype(dtypes.default_float, dtypes.float32)) + if self.fused: self.pos_params = list(itertools.accumulate(self.params, lambda x,y: x+y.numel(), initial=0)) + + def _new_optim_param(self) -> list[Tensor]: + if self.fused: return [Tensor.zeros(self.pos_params[-1], dtype=self.param_dtype, device=self.device)] + if isinstance(self.device, tuple): return [Tensor.zeros_like(t, dtype=self.param_dtype) for t in self.params] + else: return [Tensor.zeros(t.shape, dtype=self.param_dtype, device=self.device) for t in self.params] + + def zero_grad(self): + """ + Zeroes the gradients of all the parameters. + """ + for param in self.params: param.grad = None + + def step(self): + """ + Performs a single optimization step. + """ + Tensor.realize(*self.schedule_step()) + + def schedule_step(self) -> list[Tensor]: + """ + Returns the tensors that need to be realized to perform a single optimization step. + """ + if not TRAINING: raise RuntimeError( + f"""TRAINING={TRAINING.value}, TRAINING must be enabled to use the optimizer. + - help: Consider using Context(TRAINING=1) before calling Optimizer.step().""") + if self.fused: + # optimizer fusion just concatenates all the buffers, runs the _step, then splits them back up + # NOTE: contiguous is for speed + out, extra = self._step([Tensor.cat(*[t.flatten() for t in self.params], dim=0)], + [Tensor.cat(*[unwrap(t.grad).contiguous().flatten() for t in self.params], dim=0)]) + updates = [out[0][self.pos_params[i]:self.pos_params[i+1]].reshape(tt.shape) for i, tt in enumerate(self.params)] + else: + updates, extra = self._step(self.params, [unwrap(t.grad) for t in self.params]) + for i, tt in enumerate(self.params): tt.assign(self._apply_update(tt, updates[i])) + return extra+self.params+self.buffers + + def _step(self, params:list[Tensor], grads:list[Tensor]) -> tuple[list[Tensor], list[Tensor]]: raise NotImplementedError + def _apply_update(self, t:Tensor, up:Tensor) -> Tensor: return t.detach() - up.to(t.device) + +class OptimizerGroup(Optimizer): + """ + Combines multiple optimizers into one. + """ + def __init__(self, *optimizers: Optimizer): # pylint: disable=super-init-not-called + self.optimizers = optimizers + self.params, self.buffers = flatten([o.params for o in self.optimizers]), flatten([o.buffers for o in self.optimizers]) + def __getitem__(self, i): return self.optimizers[i] + def zero_grad(self): [o.zero_grad() for o in self.optimizers] + def schedule_step(self) -> list[Tensor]: return [x for o in self.optimizers for x in o.schedule_step()] + +# LARS is essentially just trust ratio to SGD so if we just set the trust coeff 0.0 it's just standard SGD. +def SGD(params: list[Tensor], lr=0.001, momentum=0.0, weight_decay=0.0, nesterov=False, classic=False, device=None, fused=FUSE_OPTIM): + """ + Stochastic Gradient Descent (SGD) optimizer with optional momentum and weight decay. + + `classic` is a boolean flag that determines whether to use the popular momentum update rule or the classic momentum update rule. + """ + return LARS(params, lr, momentum, weight_decay, 0, None, nesterov, classic=classic, pre_wd=True, tcoef=0.0, device=device, fused=fused) + +# Muon applies the newton schulz algorithm on gradient. also can include momentum, nesterov, and weight decay +def Muon(params: list[Tensor], lr=0.001, momentum=0.95, weight_decay=0.1, ns_steps=5, ns_coefficients=(3.4445, -4.775, 2.0315), + nesterov=True, device=None, fused=FUSE_OPTIM): + """ + SGD with newton-schulz iteration and post momentum weight decay. + + - Described: https://kellerjordan.github.io/posts/muon/ + - Paper: https://arxiv.org/pdf/2502.16982 + """ + assert not fused, "FUSE_OPTIM not allowed for Muon optimizer" + return LARS(params, lr, momentum, weight_decay, ns_steps, ns_coefficients, nesterov, + classic=False, pre_wd=False, tcoef=0.0, device=device, fused=fused) + +class LARS(Optimizer): + """ + Layer-wise Adaptive Rate Scaling (LARS) optimizer with optional momentum and weight decay. + + - Paper: https://arxiv.org/abs/1708.03888v3 + """ + def __init__(self, params:list[Tensor], lr=0.001, momentum=0.9, weight_decay=1e-4, ns_steps=0, ns_coefficients=None, + nesterov=False, classic=True, pre_wd=True, tcoef=0.001, device=None, fused=FUSE_OPTIM): + if momentum < 0: raise ValueError(f"Invalid momentum value: {momentum}") + super().__init__(params, lr, device, fused) + self.momentum, self.wd, self.ns_steps, self.ns_coefficients = momentum, weight_decay, ns_steps, ns_coefficients + self.nesterov, self.classic, self.pre_wd, self.tcoef = nesterov, classic, pre_wd, tcoef + self.b = self._new_optim_param() if self.momentum else [] + + def _step(self, params:list[Tensor], grads:list[Tensor]) -> tuple[list[Tensor], list[Tensor]]: + ret = [] + for i, (t, g) in enumerate(zip(params, grads)): + if self.tcoef != 0: + r1 = t.detach().square().sum().sqrt() + r2 = g.square().sum().sqrt() + r:Tensor|float = (r1 > 0).where((r2 > 0).where(self.tcoef * r1 / (r2 + self.wd * r1), 1.0), 1.0) + else: r = 1.0 + if self.pre_wd and self.wd > 0: g = g + self.wd * t.detach() + # classic momentum does post learning rate update + if self.classic: g = g * r * self.lr + if self.momentum: + self.b[i].assign(self.momentum * self.b[i] + g) # NOTE: self.b[i] is zero on the first run, no if required + g = (g + self.momentum * self.b[i]) if self.nesterov else self.b[i] + if self.ns_coefficients: g = g.reshape(g.shape[0], -1).newton_schulz(self.ns_steps, self.ns_coefficients).reshape(g.shape) + # muon does post momentum weight decay + if not self.pre_wd and self.wd > 0: t = t.detach() * (1.0 - self.wd * self.lr) + # popular momentum does pre learning rate update + if not self.classic: g = g * r * self.lr + ret.append(g.cast(t.dtype)) + return ret, self.b + +# LAMB is essentially just the trust ratio part of LARS applied to Adam/W so if we just set the trust ratio to 1.0 it's just Adam/W. +def AdamW(params: list[Tensor], lr=0.001, b1=0.9, b2=0.999, eps=1e-8, weight_decay=0.01, device=None, fused=FUSE_OPTIM): + """ + AdamW optimizer with optional weight decay. + + - Paper: https://arxiv.org/abs/1711.05101v3 + """ + return LAMB(params, lr, b1, b2, eps, weight_decay, adam=True, device=device, fused=fused) +def Adam(params: list[Tensor], lr=0.001, b1=0.9, b2=0.999, eps=1e-8, device=None, fused=FUSE_OPTIM): + """ + Adam optimizer. + + - Paper: https://arxiv.org/abs/1412.6980 + """ + return LAMB(params, lr, b1, b2, eps, 0.0, adam=True, device=device, fused=fused) + +class LAMB(Optimizer): + """ + LAMB optimizer with optional weight decay. + + - Paper: https://arxiv.org/abs/1904.00962 + """ + def __init__(self, params: list[Tensor], lr=0.001, b1=0.9, b2=0.999, eps=1e-6, weight_decay=0.0, adam=False, device=None, fused=FUSE_OPTIM): + if weight_decay < 0: raise ValueError(f"Invalid weight_decay value: {weight_decay}") + super().__init__(params, lr, device, fused) + self.b1, self.b2, self.eps, self.wd, self.adam = b1, b2, eps, weight_decay, adam + self.b1_t, self.b2_t = (Tensor.ones((1,), dtype=dtypes.float32, device=self.device).is_param_(False) for _ in [b1, b2]) + self.m = self._new_optim_param() + self.v = self._new_optim_param() + + def _step(self, params:list[Tensor], grads:list[Tensor]) -> tuple[list[Tensor], list[Tensor]]: + ret = [] + self.b1_t *= self.b1 + self.b2_t *= self.b2 + for i, (t, g) in enumerate(zip(params, grads)): + if g.device != self.m[i].device: g = g.contiguous().to(self.m[i].device) + self.m[i].assign((self.b1 * self.m[i] + (1.0 - self.b1) * g).cast(self.m[i].dtype)) + self.v[i].assign((self.b2 * self.v[i] + (1.0 - self.b2) * (g * g)).cast(self.v[i].dtype)) + m_hat = self.m[i] / (1.0 - self.b1_t) + v_hat = self.v[i] / (1.0 - self.b2_t) + up = (m_hat / (v_hat.sqrt() + self.eps)).shard_like(t) + self.wd * t.detach() + if not self.adam: + r1 = t.detach().square().sum().sqrt() + r2 = up.square().sum().sqrt() + r: Tensor|float = Tensor.where(r1 > 0, Tensor.where(r2 > 0, r1 / r2, 1.0), 1.0) + else: + r = 1.0 + ret.append((self.lr * r * up).cast(t.dtype)) + return ret, [self.b1_t, self.b2_t] + self.m + self.v diff --git a/artifacts/package_runtime/tinygrad/nn/state.py b/artifacts/package_runtime/tinygrad/nn/state.py new file mode 100644 index 000000000..17ffc538d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/nn/state.py @@ -0,0 +1,349 @@ +import json, math, pathlib, zipfile, pickle, tarfile, struct, functools, io, zlib +from collections import OrderedDict +from typing import Any, Callable, BinaryIO, Iterable, cast +from tinygrad.tensor import Tensor +from tinygrad.dtype import dtypes +from tinygrad.helpers import prod, argsort, DEBUG, Timing, GlobalCounters, tqdm, round_up, T, strides_for_shape, CHUNK_SIZE + +class TensorIO(io.RawIOBase, BinaryIO): + def __init__(self, t: Tensor): + if t.ndim != 1 or t.dtype != dtypes.uint8: raise ValueError("Tensor must be 1d and of dtype uint8!") + self._position, self._tensor = 0, t + + def readable(self) -> bool: return True + def read(self, size: int = -1) -> bytes: + if (buf:=super().read(size)) is None: raise ValueError("io.RawIOBase.read returned None") # only happens if readinto returns None (never) + return buf + def readinto(self, buffer: Any) -> int: + data = self._tensor[self._position:self._position+len(buffer)].data() + buffer[:len(data)] = data + self._position += len(data) + return len(data) + + def seekable(self) -> bool: return True + def seek(self, offset: int, whence: int = 0) -> int: + self._position = min(len(self._tensor), max(0, [offset, self._position+offset, len(self._tensor)+offset][whence])) + return self._position + + # required to correctly implement BinaryIO + def __enter__(self): return self + def write(self, s: Any): raise io.UnsupportedOperation("TensorIO.write not supported") + def writelines(self, lines: Iterable[Any]): raise io.UnsupportedOperation("TensorIO.writelines not supported") + +safe_dtypes = {"BOOL":dtypes.bool, "I8":dtypes.int8, "U8":dtypes.uint8, "I16":dtypes.int16, "U16":dtypes.uint16, "I32":dtypes.int, "U32":dtypes.uint, + "I64":dtypes.int64, "U64":dtypes.uint64, "F8_E4M3":dtypes.fp8e4m3, "F8_E5M2":dtypes.fp8e5m2, + "F16":dtypes.float16, "BF16":dtypes.bfloat16, "F32":dtypes.float32, "F64":dtypes.float64} +inverse_safe_dtypes = {v:k for k,v in safe_dtypes.items()} + +def accept_filename(func: Callable[[Tensor], T]) -> Callable[[Tensor|str|pathlib.Path], T]: + @functools.wraps(func) + def wrapper(fn: Tensor|str|pathlib.Path) -> T: return func(Tensor(pathlib.Path(fn)) if not isinstance(fn, Tensor) else fn) + return wrapper + +@accept_filename +def safe_load_metadata(t:Tensor) -> tuple[Tensor, int, dict[str, Any]]: + """ + Loads a .safetensor file, returning the source tensor, data start position, and metadata. + """ + data_start = int.from_bytes(t[0:8].data(), "little") + 8 + return t, data_start, json.loads(t[8:data_start].data().tobytes()) + +def safe_load(fn:Tensor|str|pathlib.Path) -> dict[str, Tensor]: + """ + Loads a .safetensor file, returning the `state_dict`. + + ```python + state_dict = nn.state.safe_load("test.safetensor") + ``` + """ + t, data_start, metadata = safe_load_metadata(fn) + data = t[data_start:] + return { k: data[v['data_offsets'][0]:v['data_offsets'][1]].bitcast(safe_dtypes[v['dtype']]).reshape(v['shape']) + for k, v in metadata.items() if k != "__metadata__" } + +def safe_save(tensors:dict[str, Tensor], fn:str, metadata:dict[str, Any]|None=None): + """ + Saves a `state_dict` to disk in a .safetensor file with optional metadata. + + ```python + t = Tensor([1, 2, 3]) + nn.state.safe_save({'t':t}, "test.safetensor") + ``` + """ + if any(v.dtype in dtypes.weaks for v in tensors.values()): raise ValueError("safe_save requires concrete dtypes") + headers, offset = {}, 0 + if metadata: headers['__metadata__'] = metadata + for k,v in tensors.items(): + headers[k] = {'dtype': inverse_safe_dtypes[v.dtype], 'shape': list(v.shape), 'data_offsets':[offset, offset+v.nbytes()]} + offset += v.nbytes() + j = json.dumps(headers, separators=(',', ':')) + j += "\x20"*(round_up(len(j),8)-len(j)) + pathlib.Path(fn).unlink(missing_ok=True) + t = Tensor.empty(8+len(j)+offset, dtype=dtypes.uint8, device=f"disk:{fn}") + t[0:8].bitcast(dtypes.int64).assign([len(j)]) + t[8:8+len(j)].assign(list(j.encode('utf-8'))) + for k,v in safe_load(t).items(): v.assign(tensors[k]) + +# tinyfs + +def fs_store(t:Tensor) -> Tensor: + """ + Store a tensor to storage. + """ + # TODO: this should work locally as well + data = t.contiguous().flatten().bitcast(dtypes.uint8) + + # pad to a multiple of 1mb + if (tsize := data.shape[0]) % CHUNK_SIZE != 0: data = data.pad((0, CHUNK_SIZE - tsize % CHUNK_SIZE)) + size = data.shape[0] + + base_chunks = math.ceil(size / CHUNK_SIZE) + tree_depth = math.ceil(math.log(base_chunks, CHUNK_SIZE // 16)) + + to_device = "CPU" if isinstance(t.device, str) and t.device.startswith("DISK") else t.device + + level_chunks = base_chunks + for _ in range(tree_depth + 1): + # assign data into tinyfs:store and read back hashes + data = Tensor.empty(data.shape[0], dtype=dtypes.uint8, device="tinyfs:store").assign(data)[:level_chunks * 16].to(to_device) + if (tsize := data.shape[0]) % CHUNK_SIZE != 0: data = data.pad((0, CHUNK_SIZE - tsize % CHUNK_SIZE)) + level_chunks = math.ceil(data.shape[0] / CHUNK_SIZE) + + return data[:16].contiguous() + +def fs_load(t:Tensor, size:int) -> Tensor: + """ + Load a tensor from storage. + + t should be a tensor of the hash to load + """ + # TODO: this should work locally as well + assert t.dtype == dtypes.uint8, "hash is expected to be uint8" + h = t.contiguous().flatten() + assert h.shape[0] == 16, "expected hash" + + base_chunks = math.ceil(size / CHUNK_SIZE) + tree_depth = math.ceil(math.log(base_chunks, CHUNK_SIZE // 16)) + data, level_chunks = h, 0 + for i in reversed(range(tree_depth + 1)): + # if not last level, its still hashes + if i > 0 or tree_depth == 0: + level_chunks = max(1, math.ceil(base_chunks / (CHUNK_SIZE // 16)**(i-1))) + out_sz = 16 * level_chunks + else: out_sz = CHUNK_SIZE * level_chunks + # assign hash into tinyfs:load and read back data + (load:=Tensor.empty(out_sz, dtype=dtypes.uint8, device="tinyfs:load"))[:data.shape[0]].assign(data) + data = load + + return data.to(t.device)[:size] + +# state dict + +def get_state_dict(obj, prefix:str='', tensor_type=Tensor) -> dict[str, Tensor]: + """ + Returns a `state_dict` of the object, with optional prefix. + + ```python exec="true" source="above" session="tensor" result="python" + class Net: + def __init__(self): + self.l1 = nn.Linear(4, 5) + self.l2 = nn.Linear(5, 6) + + net = Net() + print(nn.state.get_state_dict(net).keys()) + ``` + """ + if isinstance(obj, tensor_type): return {prefix.strip('.'):obj} + if hasattr(obj, '_asdict'): return get_state_dict(obj._asdict(), prefix, tensor_type) # namedtuple + if isinstance(obj, OrderedDict): return get_state_dict(dict(obj), prefix, tensor_type) + if hasattr(obj, '__dict__'): return get_state_dict(obj.__dict__, prefix, tensor_type) + state_dict = {} + if isinstance(obj, (list, tuple)): + for i,x in enumerate(obj): state_dict.update(get_state_dict(x, f"{prefix}{str(i)}.", tensor_type)) + elif isinstance(obj, dict): + for k,v in obj.items(): state_dict.update(get_state_dict(v, f"{prefix}{str(k)}.", tensor_type)) + return state_dict + +def get_parameters(obj) -> list[Tensor]: + """ + ```python exec="true" source="above" session="tensor" result="python" + class Net: + def __init__(self): + self.l1 = nn.Linear(4, 5) + self.l2 = nn.Linear(5, 6) + + net = Net() + print(len(nn.state.get_parameters(net))) + ``` + """ + return list(get_state_dict(obj).values()) + +def load_state_dict(model, state_dict:dict[str, Tensor], strict=True, verbose=True, consume=False, realize=True) -> list[Tensor]: + """ + Loads a `state_dict` into a model. Return the loaded Tensors. + + ```python + class Net: + def __init__(self): + self.l1 = nn.Linear(4, 5) + self.l2 = nn.Linear(5, 6) + + net = Net() + state_dict = nn.state.get_state_dict(net) + nn.state.load_state_dict(net, state_dict) + ``` + """ + start_mem_used = GlobalCounters.mem_used + ret = [] + with Timing("loaded weights in ", + lambda et_ns: f", {(B:=(GlobalCounters.mem_used-start_mem_used))/1e9:.2f} GB loaded at {B/et_ns:.2f} GB/s", enabled=verbose): + model_state_dict = get_state_dict(model) + if DEBUG >= 1 and len(state_dict) > len(model_state_dict): + print("WARNING: unused weights in state_dict", sorted(list(state_dict.keys() - model_state_dict.keys()))) + for k,v in (t := tqdm(model_state_dict.items(), disable=None if verbose else True)): + t.desc = f"ram used: {GlobalCounters.mem_used/1e9:5.2f} GB, {k:50s}: " + if k not in state_dict and not strict: + if DEBUG >= 1: print(f"WARNING: not loading {k}") + continue + if v.shape != state_dict[k].shape: + if {(), (1,)} == {state_dict[k].shape, v.shape}: state_dict[k] = state_dict[k].reshape(v.shape) + else: raise ValueError(f'Shape mismatch in layer `{k}`: Expected shape {v.shape}, but found {state_dict[k].shape} in state dict.') + if isinstance(v.device, tuple): + if isinstance(state_dict[k].device, tuple): v.replace(state_dict[k]) + else: v.replace(state_dict[k].shard(v.device, v.uop.axis)) + else: v.replace(state_dict[k].to(v.device)) + if realize: v.realize() + if consume: del state_dict[k] + ret.append(v) + return ret + +@accept_filename +def zip_extract(t: Tensor) -> dict[str, Tensor]: + files: dict[str, Tensor] = {} + with zipfile.ZipFile(TensorIO(t), "r") as myzip: + # sadly, the extra length needs to be read from the local header of each file. + # this is a limitation of the zip file format + header_contents = [t[zi.header_offset+26:zi.header_offset+30].bitcast(dtypes.uint16).to('CPU') for zi in myzip.filelist] + Tensor.realize(*header_contents) + for zi, header_content in zip(myzip.filelist, header_contents): + # header_offset + sizeFileHeader + File name length + Extra field length + file_offset = zi.header_offset + 30 + sum(cast(list[int], header_content.tolist())) + files[zi.filename] = t[file_offset:file_offset+zi.compress_size] + match zi.compress_type: + case zipfile.ZIP_STORED: pass + # TODO: we need a zlib UOp so this can be lazy + case zipfile.ZIP_DEFLATED: files[zi.filename] = Tensor(zlib.decompress(files[zi.filename].data(), -15)) + case _: raise NotImplementedError(f"compression {zi.compress_type} not supported") + return files + +@accept_filename +def tar_extract(t: Tensor) -> dict[str, Tensor]: + """ + ```python + tar_extract(fn: Tensor | str | Path) -> dict[str, Tensor] + ``` + + Extracts files from a tar archive and returns them as a dictionary of names (keys) and tensors (values). + + ```python + tensors = nn.state.tar_extract(Tensor(pathlib.Path("archive.tar"))) + ``` + """ + with tarfile.open(fileobj=TensorIO(t), mode="r") as tar: + return {member.name:t[member.offset_data:member.offset_data+member.size] for member in tar if member.type == tarfile.REGTYPE} + +# torch support! + +@accept_filename +def torch_load(t:Tensor) -> dict[str, Tensor]: + """ + ```python + torch_load(fn: Tensor | str | Path) -> dict[str, Tensor] + ``` + + Loads a torch .pth file, returning the `state_dict`. + + ```python + state_dict = nn.state.torch_load("test.pth") + ``` + """ + storage_source: dict[str|int, Tensor] = {} + lens: dict[str|int, int] = {} + + def _rebuild_tensor(storage, storage_offset, size, stride): + return _rebuild_tensor_v2(storage, storage_offset, size, stride) + + def _rebuild_tensor_v2(storage, storage_offset, size, stride, requires_grad=None, backward_hooks=None, metadata=None): + #print(storage, storage_offset, size, stride, requires_grad, backward_hooks, metadata) + lens[storage[2]] = storage[4] * storage[1].itemsize + if storage[2] not in storage_source: return None + byte_start, byte_end = storage_offset*storage[1].itemsize, (storage_offset + prod(size))*storage[1].itemsize + ret = storage_source[storage[2]][byte_start:byte_end].bitcast(storage[1]) + + # 7 lines to deal with permuted tensors. NOTE: this currently requires reading off the disk + shape_strides = [(s, st) for s,st in zip(size, stride) if s != 1] + permute_indexes = [len(shape_strides)-1-y for y in argsort([x[1] for x in shape_strides])] + if tuple(permute_indexes) != tuple(range(len(permute_indexes))): + intermediate_shape = tuple([shape_strides[x][0] for x in argsort(permute_indexes)]) + assert tuple([shape_strides[i][1] for i in argsort(permute_indexes)]) == strides_for_shape(intermediate_shape), "nonpermutable strides" + if DEBUG >= 3: print(f"WARNING: this torch load is slow. to permute {intermediate_shape} with {permute_indexes}") + assert storage[1] != dtypes.bfloat16, "can't permute BF16" + # TODO: find a nice way to support all movement ops on disktensors + ret = ret.to(None).reshape(intermediate_shape).permute(permute_indexes) + + return ret.reshape(size) + + class Parameter: + def __setstate__(self, state): self.tensor = state[0] + + deserialized_objects: dict[str, Any] = {} + intercept = {"HalfStorage": dtypes.float16, "FloatStorage": dtypes.float32, "BFloat16Storage": dtypes.bfloat16, + "IntStorage": dtypes.int32, "BoolStorage": dtypes.bool, + "LongStorage": dtypes.int64, "_rebuild_tensor": _rebuild_tensor, "_rebuild_tensor_v2": _rebuild_tensor_v2, + "FloatTensor": None, "Parameter": Parameter} + whitelist = {"torch", "collections", "numpy", "_codecs"} # NOTE: this is not for security, only speed + class Dummy: pass + class TorchPickle(pickle.Unpickler): + def find_class(self, module, name): + module_root = module.split(".")[0] + if module_root not in whitelist: + if DEBUG >= 2: print(f"WARNING: returning Dummy for {module} {name}") + return Dummy + return intercept[name] if module_root == "torch" else super().find_class(module, name) + def persistent_load(self, pid): return deserialized_objects.get(pid, pid) + + fobj = io.BufferedReader(TensorIO(t)) + def passthrough_reset(v: bool): return fobj.seek(0, 0) or v + if passthrough_reset(zipfile.is_zipfile(fobj)): # NOTE: passthrough_reset required to support python < 3.14 + files = zip_extract(t) + base_name = next(iter(files)).split('/', 1)[0] + # keyed by persistent_id in pickle file + storage_source = {fn.split("/")[-1]: data for fn, data in files.items() if fn.startswith(f"{base_name}/data/") and not fn.endswith(".pkl")} + return TorchPickle(io.BufferedReader(TensorIO(files[f"{base_name}/data.pkl"]), 1_000_000)).load() + elif passthrough_reset(tarfile.is_tarfile(fobj)): # NOTE: passthrough_reset required to support python < 3.11 + files = tar_extract(t) + f = io.BufferedReader(TensorIO(files["storages"]), 1_000_000) + # slice source tensor t + for _ in range(TorchPickle(f).load()): + (key, _, storage_type), sz = TorchPickle(f).load(), struct.unpack(' Estimates: + flops: sint = 0 + lds: sint = 0 + mem: dict[tuple[UOp, Ops], sint] = {} + mults: sint = 1 + mult_stack: list[sint] = [] + excluded: set[UOp] = set() + if ignore_indexing: + for u in uops: + if u.op in {Ops.INDEX, Ops.SHRINK}: + excluded = excluded.union(set(UOp.sink(*u.src[1:]).toposort(lambda x: x.op is not Ops.END))) + for u in uops: + if u.op in {Ops.LOAD, Ops.STORE}: + buf = u + while len(buf.src) and buf.op is not Ops.PARAM: buf = buf.src[0] + if buf.op is Ops.PARAM: + # u.src[0] is INDEX, cap at buffer size for re-reads (e.g. matmul) + accessed = mem.get((buf, u.op), 0) + u.src[0].max_numel() * u.src[0].dtype.scalar().itemsize * mults + mem[(buf, u.op)] = smin(accessed, buf.max_numel() * buf.dtype.scalar().itemsize) + if u.op is Ops.RANGE: + mult_stack.append(mults) + if u.dtype is not dtypes.void: # unbounded loop, unknown trip count + mults *= cast(sint, u.src[0].ssimplify()) + # SPECIAL are already counted in mults + mults = mults.substitute({x:x.const_like(0) for x in mults.toposort() if x.op is Ops.SPECIAL}) if isinstance(mults, UOp) else mults + elif u.op is Ops.END: mults = mult_stack.pop(-1) + elif u.op is Ops.SPECIAL: mults *= cast(sint, u.src[0].ssimplify()) # NOTE: we don't push to the mult_stack here, you can't end these + elif u.op is Ops.PARAM and u.arg.addrspace == AddrSpace.ALU and u.expr == 'core_id': mults *= int(u.vmax) + 1 + elif u.op is Ops.LOAD and u.src[0].addrspace != AddrSpace.REG: + lds += u.max_numel() * u.dtype.scalar().itemsize * mults + elif u.op is Ops.STORE and u.src[0].addrspace != AddrSpace.REG: + lds += u.max_numel() * u.src[1].dtype.scalar().itemsize * mults + elif u.op in GroupOp.ALU and u not in excluded: + flops += (mults * (2 if u.op is Ops.MULACC else 1)) * u.max_numel() + elif u.op is Ops.WMMA and u not in excluded: + flops += 2 * prod(u.arg[0]) // u.arg[3] * mults + return Estimates(flops, lds, sum(mem.values())) + +class Renderer: + target: Target + suffix: str = "" + # TODO: make this generic with a list of supported types + supports_float4: bool = True + has_local: bool = True + has_threads: bool = False + has_shared: bool = True + # NOTE: these two should be in (x,y,z) order to match the max_sizes argument in get_grouped_dims + global_max: tuple[int, ...]|None = (0x8FFFFFFF,) * (3) # TODO: Ops.SPECIAL int32 indexes right now + local_max: tuple[int, ...]|None = (0x8FFFFFFF,) * (3) # TODO: Ops.SPECIAL int32 indexes right now + global_prod_max: tuple[int, ...]|None = None + shared_max: int = 32768 + tensor_cores: list[TensorCore] = [] + extra_matcher: PatternMatcher|None = None + code_for_op: dict[Ops, Callable] = {} + + compiler: Compiler = Compiler() + + def __init__(self, target:Target): self.target = target + def __reduce__(self): return self.__class__, (self.target,) + def render(self, uops:list[UOp]) -> str: raise NotImplementedError("needs a renderer") + def asm(self, prg:UOp, lin:UOp) -> bytes: raise NotImplementedError("needs an assembler") + def supported_dtypes(self) -> set[DType]: + # double can't be bitcast to anything without long support + return set(dtypes.all) - ({dtypes.double} if dtypes.long in EMULATED_DTYPES.tolist(dtypes) else set()) diff --git a/artifacts/package_runtime/tinygrad/renderer/amd/__init__.py b/artifacts/package_runtime/tinygrad/renderer/amd/__init__.py new file mode 100644 index 000000000..875005f57 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/amd/__init__.py @@ -0,0 +1,75 @@ +# Instruction format detection and decoding +from __future__ import annotations +from tinygrad.renderer.amd.dsl import Inst, FixedBitField, EnumBitField + +# SDWA/DPP variant detection: src0 field (bits 0-8) encodes the variant +# 0xf9 (249) = SDWA, 0xfa (250) = DPP16 for CDNA (GFX9) +_VARIANT_SRC0 = {"_SDWA_SDST": 0xf9, "_SDWA": 0xf9, "_DPP16": 0xfa} + +def _matches(data: bytes, cls: type[Inst]) -> bool: + """Check if data matches all FixedBitFields and op is in allowed.""" + for _, field in cls._fields: + dword_idx = field.lo // 32 + if len(data) < (dword_idx + 1) * 4: return False + word = int.from_bytes(data[dword_idx*4:(dword_idx+1)*4], 'little') + field_lo = field.lo % 32 + if isinstance(field, FixedBitField): + if ((word >> field_lo) & field.mask) != field.default: return False + if isinstance(field, EnumBitField) and field.allowed is not None: + try: opcode = field.decode((word >> field_lo) & field.mask) + except ValueError: return False # opcode not in enum + if opcode not in field.allowed: return False + # Check SDWA/DPP variant based on src0 field (bits 0-8) - only for variant classes + name = cls.__name__ + word = int.from_bytes(data[:4], 'little') + for suffix, expected_src0 in _VARIANT_SRC0.items(): + if name.endswith(suffix): return (word & 0x1ff) == expected_src0 + return True + +# Lazy-load instruction format tables to avoid circular imports (ins.py imports dsl.py which is in this package) +_FORMATS: dict[str, list[type[Inst]]] | None = None + +def _load_formats() -> dict[str, list[type[Inst]]]: + global _FORMATS + if _FORMATS is not None: return _FORMATS + from tinygrad.runtime.autogen.amd.rdna3.ins import (VOP1, VOP1_SDST, VOP1_DPP16, VOP1_LIT, VOP2, VOP2_DPP16, VOP2_LIT, VOP3, VOP3_SDST, + VOP3SD, VOP3P, VOPC, VOPC_DPP16, VOPD, VINTERP, SOP1, SOP1_LIT, SOP2, SOP2_LIT, SOPC, SOPK, SOPK_LIT, SOPP, SMEM, DS, FLAT, GLOBAL, + SCRATCH) + from tinygrad.runtime.autogen.amd.rdna4.ins import (VOP1 as R4_VOP1, VOP1_SDST as R4_VOP1_SDST, VOP1_DPP16 as R4_VOP1_DPP16, + VOP1_LIT as R4_VOP1_LIT, VOP2 as R4_VOP2, VOP2_DPP16 as R4_VOP2_DPP16, VOP2_LIT as R4_VOP2_LIT, VOP3 as R4_VOP3, + VOP3_SDST as R4_VOP3_SDST, VOP3SD as R4_VOP3SD, VOP3P as R4_VOP3P, VOPC as R4_VOPC, VOPC_DPP16 as R4_VOPC_DPP16, + VOPD as R4_VOPD, VINTERP as R4_VINTERP, SOP1 as R4_SOP1, SOP1_LIT as R4_SOP1_LIT, + SOP2 as R4_SOP2, SOP2_LIT as R4_SOP2_LIT, SOPC as R4_SOPC, SOPC_LIT as R4_SOPC_LIT, + SOPK as R4_SOPK, SOPK_LIT as R4_SOPK_LIT, SOPP as R4_SOPP, + SMEM as R4_SMEM, DS as R4_DS, VFLAT as R4_FLAT, VGLOBAL as R4_GLOBAL, VSCRATCH as R4_SCRATCH) + from tinygrad.runtime.autogen.amd.cdna.ins import (VOP1 as C_VOP1, VOP1_SDWA as C_VOP1_SDWA, VOP1_DPP16 as C_VOP1_DPP16, + VOP2 as C_VOP2, VOP2_LIT as C_VOP2_LIT, VOP2_SDWA as C_VOP2_SDWA, VOP2_DPP16 as C_VOP2_DPP16, + VOPC as C_VOPC, VOPC_SDWA_SDST as C_VOPC_SDWA_SDST, + VOP3 as C_VOP3, VOP3_SDST as C_VOP3_SDST, VOP3SD as C_VOP3SD, VOP3P as C_VOP3P, VOP3P_MFMA as C_VOP3P_MFMA, VOP3PX2 as C_VOP3PX2, + SOP1 as C_SOP1, SOP2 as C_SOP2, SOPC as C_SOPC, SOPK as C_SOPK, SOPK_LIT as C_SOPK_LIT, SOPP as C_SOPP, SMEM as C_SMEM, DS as C_DS, + FLAT as C_FLAT, GLOBAL as C_GLOBAL, SCRATCH as C_SCRATCH, MUBUF as C_MUBUF) + # Order matters: more specific encodings first, catch-alls (SOP2, VOP2) last + # Order: base before _LIT (base matches regular ops, _LIT catches lit-only ops excluded from base) + _FORMATS = { + "rdna3": [VOPD, VOP3P, VINTERP, VOP3SD, VOP3_SDST, VOP3, DS, GLOBAL, SCRATCH, FLAT, SMEM, + SOP1, SOP1_LIT, SOP2, SOP2_LIT, SOPC, SOPK, SOPK_LIT, SOPP, VOPC_DPP16, VOPC, VOP1_SDST, VOP1_DPP16, VOP1, VOP1_LIT, + VOP2_DPP16, VOP2, VOP2_LIT], + "rdna4": [R4_VOPD, R4_VOP3P, R4_VINTERP, R4_VOP3SD, R4_VOP3_SDST, R4_VOP3, R4_DS, R4_GLOBAL, R4_SCRATCH, R4_FLAT, R4_SMEM, + R4_SOP1, R4_SOP1_LIT, R4_SOPC, R4_SOPC_LIT, R4_SOPP, R4_SOPK, R4_SOPK_LIT, R4_VOPC_DPP16, R4_VOPC, R4_VOP1_SDST, + R4_VOP1_DPP16, R4_VOP1, R4_VOP1_LIT, R4_SOP2, R4_SOP2_LIT, R4_VOP2_DPP16, R4_VOP2, R4_VOP2_LIT], + "cdna": [C_VOP3PX2, C_VOP3P_MFMA, C_VOP3P, C_VOP3SD, C_VOP3_SDST, C_VOP3, C_DS, C_GLOBAL, C_SCRATCH, C_FLAT, C_MUBUF, C_SMEM, + C_SOP1, C_SOPC, C_SOPP, C_SOPK, C_SOPK_LIT, C_VOPC_SDWA_SDST, C_VOPC, + C_VOP1_DPP16, C_VOP1_SDWA, C_VOP1, C_VOP2_DPP16, C_VOP2_SDWA, C_SOP2, C_VOP2, C_VOP2_LIT], + } + return _FORMATS + +def detect_format(data: bytes, arch: str = "rdna3") -> type[Inst]: + """Detect instruction format from machine code bytes.""" + assert len(data) >= 4, f"need at least 4 bytes, got {len(data)}" + for cls in _load_formats()[arch]: + if _matches(data, cls): return cls + raise ValueError(f"unknown {arch} format word={int.from_bytes(data[:4], 'little'):#010x}") + +def decode_inst(data: bytes, arch: str = "rdna3") -> Inst: + """Decode machine code bytes into an instruction.""" + return detect_format(data, arch).from_bytes(data) diff --git a/artifacts/package_runtime/tinygrad/renderer/amd/dsl.py b/artifacts/package_runtime/tinygrad/renderer/amd/dsl.py new file mode 100644 index 000000000..6526706be --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/amd/dsl.py @@ -0,0 +1,456 @@ +# dsl.py - clean DSL for AMD assembly +from typing import Any + +# ══════════════════════════════════════════════════════════════ +# Registers - unified src encoding space (0-511) +# ══════════════════════════════════════════════════════════════ + +class Reg: + # Register names vary by arch: RDNA has NULL@124/M0@125, CDNA has M0@124/reserved@125 + # RDNA4 has DPP8@233, CDNA has SDWA@249/DPP@250/VCCZ@251/EXECZ@252 + _NAMES = {102: "FLAT_SCRATCH_LO", 103: "FLAT_SCRATCH_HI", 104: "XNACK_MASK_LO", 105: "XNACK_MASK_HI", + 106: "VCC_LO", 107: "VCC_HI", 124: "NULL", 125: "M0", 126: "EXEC_LO", 127: "EXEC_HI", + 233: "DPP8", 234: "DPP8FI", 235: "SHARED_BASE", 236: "SHARED_LIMIT", 237: "PRIVATE_BASE", 238: "PRIVATE_LIMIT", + 240: "0.5", 241: "-0.5", 242: "1.0", 243: "-1.0", 244: "2.0", 245: "-2.0", 246: "4.0", 247: "-4.0", + 248: "INV_2PI", 249: "SDWA", 250: "DPP", 251: "VCCZ", 252: "EXECZ", 253: "SCC", 254: "SRC_LDS_DIRECT", 255: "LIT"} + _PAIRS = {106: "VCC", 126: "EXEC"} + + def __init__(self, offset: int = 0, sz: int = 512, *, neg: bool = False, abs_: bool = False, hi: bool = False): + self.offset, self.sz = offset, sz + self.neg, self.abs_, self.hi = neg, abs_, hi + + def __hash__(self): return hash((self.offset, self.sz, self.neg, self.abs_, self.hi)) + def __getitem__(self, key): + if isinstance(key, slice): + start, stop = key.start or 0, key.stop or (self.sz - 1) + if start < 0 or stop >= self.sz: raise RuntimeError(f"slice [{start}:{stop}] out of bounds for size {self.sz}") + return Reg(self.offset + start, stop - start + 1) + if key < 0 or key >= self.sz: raise RuntimeError(f"index {key} out of bounds for size {self.sz}") + return Reg(self.offset + key, 1) + def __eq__(self, other): + if isinstance(other, Reg): + return (self.offset == other.offset and self.sz == other.sz and + self.neg == other.neg and self.abs_ == other.abs_ and self.hi == other.hi) + return NotImplemented + def __add__(self, other): + if isinstance(other, int): return Reg(self.offset + other, self.sz) + return NotImplemented + def __neg__(self) -> 'Reg': return Reg(self.offset, self.sz, neg=not self.neg, abs_=self.abs_, hi=self.hi) + def __abs__(self) -> 'Reg': return Reg(self.offset, self.sz, neg=self.neg, abs_=True, hi=self.hi) + @property + def h(self) -> 'Reg': return Reg(self.offset, self.sz, neg=self.neg, abs_=self.abs_, hi=True) + @property + def l(self) -> 'Reg': return Reg(self.offset, self.sz, neg=self.neg, abs_=self.abs_, hi=False) + def fmt(self, sz=None, parens=False, upper=False) -> str: + o, sz = self.offset, sz or self.sz + l, r = ("[", "]") if parens or sz > 1 else ("", "") # brackets for multi-reg or when parens=True + if 256 <= o < 512: + idx = o - 256 + base = f"v{l}{idx}{r}" if sz == 1 else f"v[{idx}:{idx + sz - 1}]" + elif o < 106: base = f"s{l}{o}{r}" if sz == 1 else f"s[{o}:{o + sz - 1}]" + elif sz == 2 and o in self._PAIRS: base = self._PAIRS[o] if upper else self._PAIRS[o].lower() + elif o in self._NAMES: base = self._NAMES[o] if upper else self._NAMES[o].lower() # special regs (any sz) + elif 108 <= o < 124: + idx = o - 108 + base = f"ttmp{l}{idx}{r}" if sz == 1 else f"ttmp[{idx}:{idx + sz - 1}]" + elif 128 <= o <= 192: base = str(o - 128) # inline int constants (0-64) + elif 193 <= o <= 208: base = str(-(o - 192)) # inline negative int constants (-1 to -16) + else: raise RuntimeError(f"unknown register: offset={o}, sz={sz}") + if self.hi: base += ".h" + if self.abs_: base = f"abs({base})" if upper else f"|{base}|" + if self.neg: base = f"-{base}" + return base + def __repr__(self): return self.fmt(parens=True, upper=True) + +# Full src encoding space +src = Reg(0, 512) + +# Slices for each region (inclusive end) +s = src[0:105] # SGPR0-105 +VCC_LO = src[106] +VCC_HI = src[107] +VCC = src[106:107] +ttmp = src[108:123] # TTMP0-15 +NULL = OFF = src[124] +M0 = src[125] +EXEC_LO = src[126] +EXEC_HI = src[127] +EXEC = src[126:127] +# 128: 0, 129-192: integers 1-64, 193-208: integers -1 to -16 +# 240-248: float constants (0.5, -0.5, 1.0, -1.0, 2.0, -2.0, 4.0, -4.0, 1/(2*PI)) +INV_2PI = src[248] +SDWA = src[249] +DPP = DPP16 = src[250] +VCCZ = src[251] +EXECZ = src[252] +SCC = src[253] +SRC_LDS_DIRECT = src[254] +LIT = src[255] # literal constant marker +v = src[256:511] # VGPR0-255 + +# ══════════════════════════════════════════════════════════════ +# BitField +# ══════════════════════════════════════════════════════════════ + +class _Bits: + """Helper for defining bit fields with slice syntax: bits[hi:lo] or bits[n].""" + def __getitem__(self, key) -> 'BitField': return BitField(key.start, key.stop) if isinstance(key, slice) else BitField(key, key) +bits = _Bits() + +class BitField: + name: str | None + def __init__(self, hi: int, lo: int, default = 0): + self.hi, self.lo, self.default, self.name, self.mask = hi, lo, default, None, (1 << (hi - lo + 1)) - 1 + def __set_name__(self, owner, name: str): self.name = name + def __eq__(self, other) -> 'FixedBitField': # type: ignore[override] + if isinstance(other, int): return FixedBitField(self.hi, self.lo, other) + raise TypeError(f"BitField.__eq__ expects int, got {type(other).__name__}") + def enum(self, enum_cls) -> 'EnumBitField': return EnumBitField(self.hi, self.lo, enum_cls) + def encode(self, val) -> int: + assert isinstance(val, int), f"BitField.encode expects int, got {type(val).__name__}" + return val + def decode(self, val): return val + def set(self, raw: int, val) -> int: + if val is None: val = self.default + encoded = self.encode(val) + # Handle signed values: convert negative to 2's complement + if encoded < 0: encoded = encoded & self.mask + if encoded < 0 or encoded > self.mask: raise RuntimeError(f"field '{self.name}': value {encoded} doesn't fit in {self.hi - self.lo + 1} bits") + return (raw & ~(self.mask << self.lo)) | (encoded << self.lo) + def __get__(self, obj, objtype=None): + if obj is None: return self + return self.decode((obj._raw >> self.lo) & self.mask) + def __set__(self, obj, val): obj._raw = self.set(obj._raw, val) + +class FixedBitField(BitField): + def set(self, raw: int, val=None) -> int: + assert val is None, f"FixedBitField does not accept values, got {val}" + return super().set(raw, self.default) + +class EnumBitField(BitField): + def __init__(self, hi: int, lo: int, enum_cls, allowed: set | None = None): + super().__init__(hi, lo) + self._enum = enum_cls + self.allowed = allowed # if set, only these enum values are valid for this encoding + def encode(self, val) -> int: + if not isinstance(val, self._enum): raise RuntimeError(f"expected {self._enum.__name__}, got {type(val).__name__}") + if self.allowed is not None and val not in self.allowed: + raise RuntimeError(f"opcode {val.name} not allowed in this encoding") + return val.value + def decode(self, raw): return self._enum(raw) + +# ══════════════════════════════════════════════════════════════ +# Typed fields +# ══════════════════════════════════════════════════════════════ + +import struct +def _f32(f: float) -> int: return struct.unpack('I', struct.pack('f', f))[0] + +class SrcField(BitField): + _valid_range = (0, 511) # inclusive + _FLOAT_ENC = {0.5: 240, -0.5: 241, 1.0: 242, -1.0: 243, 2.0: 244, -2.0: 245, 4.0: 246, -4.0: 247} + + def __init__(self, hi: int, lo: int, default=s[0]): + super().__init__(hi, lo, default) + expected_size = self._valid_range[1] - self._valid_range[0] + 1 + actual_size = 1 << (hi - lo + 1) + if actual_size != expected_size: + raise RuntimeError(f"{self.__class__.__name__}: field size {hi - lo + 1} bits ({actual_size}) " + f"doesn't match range {self._valid_range} ({expected_size})") + + def encode(self, val) -> int: + """Encode value. Returns 255 (literal marker) for out-of-range values.""" + if isinstance(val, Reg): offset = val.offset + elif isinstance(val, float): offset = self._FLOAT_ENC.get(val, 255) + elif isinstance(val, int) and 0 <= val <= 64: offset = 128 + val + elif isinstance(val, int) and -16 <= val < 0: offset = 192 - val + elif isinstance(val, int): offset = 255 # literal + else: raise TypeError(f"invalid src value {val}") + if not (self._valid_range[0] <= offset <= self._valid_range[1]): + raise TypeError(f"{self.__class__.__name__}: {val} (offset {offset}) out of range {self._valid_range}") + return offset - self._valid_range[0] + + def decode(self, raw): return src[raw + self._valid_range[0]] + + def __get__(self, obj, objtype=None): + if obj is None: return self + reg = self.decode((obj._raw >> self.lo) & self.mask) + # Resize register based on operand info (skip non-resizable special registers) + # VCC/EXEC pairs (106, 126), NULL (124), M0 (125), float constants (240-255) + if reg.offset not in (124, 125) and not 240 <= reg.offset <= 255: + # Map variant field names (vsrc0->src0, vsrc1->src1, etc.) for DPP/SDWA classes + assert self.name is not None + name = self.name[1:] if self.name.startswith('v') and self.name[1:] in obj.op_regs else self.name + if sz := obj.op_regs.get(name, 1): reg = Reg(reg.offset, sz, neg=reg.neg, abs_=reg.abs_, hi=reg.hi) + return reg + +class VGPRField(SrcField): + _valid_range = (256, 511) + def __init__(self, hi: int, lo: int, default=v[0]): super().__init__(hi, lo, default) + def encode(self, val) -> int: + if not isinstance(val, Reg): raise TypeError(f"VGPRField requires Reg, got {type(val).__name__}") + # For 8-bit vdst fields in VOP1/VOP2 16-bit ops, bit 7 is opsel for dest half + encoded = super().encode(val) + if val.hi and (self.hi - self.lo + 1) == 8: + if encoded >= 128: + raise ValueError(f"VGPRField: v[{encoded}].h not encodable in 8-bit field (v[0:127] only for .h)") + encoded |= 0x80 + return encoded +class SGPRField(SrcField): _valid_range = (0, 127) +class SSrcField(SrcField): _valid_range = (0, 255) + +class AlignedSGPRField(BitField): + """SGPR field with alignment requirement. Encoded as sgpr_index // alignment.""" + _align: int = 2 + def encode(self, val): + if isinstance(val, int) and val == 0: return 0 # default: encode as s[0] + if not isinstance(val, Reg): raise TypeError(f"{self.__class__.__name__} requires Reg, got {type(val).__name__}") + if not (0 <= val.offset < 128): raise ValueError(f"{self.__class__.__name__} requires SGPR, got offset {val.offset}") + if val.offset & (self._align - 1): raise ValueError(f"{self.__class__.__name__} requires {self._align}-aligned SGPR, got s[{val.offset}]") + return val.offset >> (self._align.bit_length() - 1) + def decode(self, raw): return src[raw << (self._align.bit_length() - 1)] + def __get__(self, obj, objtype=None): + if obj is None: return self + reg = self.decode((obj._raw >> self.lo) & self.mask) + if sz := obj.op_regs.get(self.name, 1): reg = Reg(reg.offset, sz, neg=reg.neg, abs_=reg.abs_, hi=reg.hi) + return reg + +class SBaseField(AlignedSGPRField): _align = 2 +class SRsrcField(AlignedSGPRField): _align = 4 + +class VDSTYField(BitField): + """VOPD vdsty: encoded = vgpr_idx >> 1. Actual vgpr = (encoded << 1) | ((vdstx & 1) ^ 1).""" + def encode(self, val): + if not isinstance(val, Reg): raise TypeError(f"VDSTYField requires Reg, got {type(val).__name__}") + if not (256 <= val.offset < 512): raise ValueError(f"VDSTYField requires VGPR, got offset {val.offset}") + return (val.offset - 256) >> 1 + def __get__(self, obj, objtype=None): + if obj is None: return self + raw = (obj._raw >> self.lo) & self.mask + vdstx_bit0 = (obj.vdstx.offset - 256) & 1 + vgpr_idx = (raw << 1) | (vdstx_bit0 ^ 1) + return Reg(256 + vgpr_idx, 1) + +# ══════════════════════════════════════════════════════════════ +# Operand info from XML +# ══════════════════════════════════════════════════════════════ + +import functools +from tinygrad.runtime.autogen.amd.rdna3.operands import OPERANDS as OPERANDS_RDNA3 +from tinygrad.runtime.autogen.amd.rdna4.operands import OPERANDS as OPERANDS_RDNA4 +from tinygrad.runtime.autogen.amd.cdna.operands import OPERANDS as OPERANDS_CDNA +OPERANDS = {**OPERANDS_CDNA, **OPERANDS_RDNA3, **OPERANDS_RDNA4} + +# ══════════════════════════════════════════════════════════════ +# Inst base class +# ══════════════════════════════════════════════════════════════ + +def _needs_literal(val) -> bool: + """Check if a value needs a literal constant (can't be encoded inline).""" + if val is None or isinstance(val, Reg): return False + if isinstance(val, float): return val not in SrcField._FLOAT_ENC + if isinstance(val, int): return not (0 <= val <= 64 or -16 <= val < 0) + return False + +def _get_variant(cls, suffix: str): + """Get a variant class by suffix (e.g., '_LIT') via module lookup.""" + import sys + module = sys.modules.get(cls.__module__) + return getattr(module, f"{cls.__name__}{suffix}", None) if module else None + +def _canonical_name(name: str) -> str | None: + """Map operand name to canonical name.""" + if name in ('src0', 'vsrc0', 'ssrc0'): return 's0' + if name in ('src1', 'vsrc1', 'ssrc1'): return 's1' + if name == 'src2': return 's2' + if name in ('vdst', 'sdst', 'sdata'): return 'd' + if name in ('data', 'vdata', 'data0', 'vsrc'): return 'data' + return None + +class Inst: + _fields: list[tuple[str, BitField]] + _base_size: int + + def __init_subclass__(cls): + # Collect fields from all parent classes, then override with this class's fields + inherited = {} + for base in reversed(cls.__mro__[1:]): + if hasattr(base, '_fields'): + inherited.update(dict(base._fields)) + inherited.update({name: val for name, val in cls.__dict__.items() if isinstance(val, BitField)}) + cls._fields = list(inherited.items()) + cls._base_size = (max(f.hi for _, f in cls._fields) + 8) // 8 + + def __new__(cls, *args, **kwargs): + # Auto-upgrade to variant if needed (only for base classes, not variants) + if not any(cls.__name__.endswith(sfx) for sfx in ('_LIT', '_DPP16', '_DPP8', '_SDWA', '_SDWA_SDST', '_MFMA')): + args_iter = iter(args) + for name, field in cls._fields: + if isinstance(field, FixedBitField): continue + val = kwargs.get(name) if name in kwargs else next(args_iter, None) + if not isinstance(field, SrcField): continue + if isinstance(val, Reg) and val.offset == 255 and (lit_cls := _get_variant(cls, '_LIT')): return lit_cls(*args, **kwargs) + if isinstance(val, Reg) and val.offset == 249: + if (sdwa_cls := _get_variant(cls, '_SDWA') or _get_variant(cls, '_SDWA_SDST')): return sdwa_cls(*args, **kwargs) + if isinstance(val, Reg) and val.offset == 250 and (dpp_cls := _get_variant(cls, '_DPP16')): return dpp_cls(*args, **kwargs) + if _needs_literal(val) and (lit_cls := _get_variant(cls, '_LIT')): return lit_cls(*args, **kwargs) + return object.__new__(cls) + + def __init__(self, *args, **kwargs): + self._raw = 0 + # Map positional args to field names (skip FixedBitFields) + args_iter = iter(args) + vals: dict[str, Any] = {} + for name, field in self._fields: + if isinstance(field, FixedBitField): vals[name] = None + elif name in kwargs: vals[name] = kwargs[name] + else: vals[name] = next(args_iter, None) + assert not (remaining := list(args_iter)), f"too many positional args: {remaining}" + known_field_names = [name for name,field in self._fields if not isinstance(field, FixedBitField)] + for name in kwargs: + if name not in known_field_names: raise TypeError(f"{self.__class__.__name__}() got an unexpected keyword argument {name!r}") + # Extract modifiers from Reg objects and merge into neg/abs/opsel + neg_bits, abs_bits, opsel_bits = 0, 0, 0 + for name, bit in [('src0', 0), ('src1', 1), ('src2', 2)]: + if name in vals and isinstance(vals[name], Reg): + reg = vals[name] + if reg.neg: neg_bits |= (1 << bit) + if reg.abs_: abs_bits |= (1 << bit) + if reg.hi: opsel_bits |= (1 << bit) + if 'vdst' in vals and isinstance(vals['vdst'], Reg) and vals['vdst'].hi: + opsel_bits |= (1 << 3) + if neg_bits: vals['neg'] = (vals.get('neg') or 0) | neg_bits + if abs_bits: vals['abs'] = (vals.get('abs') or 0) | abs_bits + if opsel_bits: vals['opsel'] = (vals.get('opsel') or 0) | opsel_bits + # For _LIT classes, capture literal value from SrcFields that encode to 255 + literal_val = None + for name, field in self._fields: + val = vals[name] + if isinstance(field, SrcField) and val is not None and _needs_literal(val): + literal_val = _f32(val) if isinstance(val, float) else val & 0xFFFFFFFF + if literal_val is not None and 'literal' in vals: + vals['literal'] = literal_val + # Set all field values + for name, field in self._fields: + self._raw = field.set(self._raw, vals[name]) + # Validate register sizes against operand info (skip special registers like NULL, VCC, EXEC, SDWA/DPP markers) + for name, expected in self.op_regs.items(): + if (val := vals.get(name)) is None: continue + if isinstance(val, Reg) and val.sz != expected and not (106 <= val.offset <= 127 or 249 <= val.offset <= 255): + raise TypeError(f"{name} expects {expected} register(s), got {val.sz}") + + @property + def op_name(self) -> str: return getattr(self, 'op').name + @property + def operands(self) -> dict: return OPERANDS.get(getattr(self, 'op'), {}) if hasattr(self, 'op') else {} + def _is_cdna(self) -> bool: return 'cdna' in type(self).__module__ + + @functools.cached_property + def op_bits(self) -> dict[str, int]: + """Get bit widths for each operand field, with WAVE32 and addr/saddr adjustments.""" + if not hasattr(self, 'op'): return {k: v[1] for k, v in self.operands.items()} + bits = {k: v[1] for k, v in self.operands.items()} + # RDNA (WAVE32): condition masks, carry flags, and compare results are 32-bit + if not self._is_cdna(): + name = self.op_name.lower() + if 'cndmask' in name and 'src2' in bits: bits['src2'] = 32 + if '_co_ci_' in name and 'src2' in bits: bits['src2'] = 32 # carry-in source + # VOP3SD: sdst is always wavefront-size dependent (carry-out or condition mask) + if 'VOP3SD' in type(self).__name__ and 'sdst' in bits: bits['sdst'] = 32 + if 'cmp' in name and 'vdst' in bits: bits['vdst'] = 32 + # GLOBAL/FLAT: addr is 32-bit if saddr is valid SGPR, 64-bit if saddr is NULL + # SCRATCH: addr is always 32-bit (offset from scratch base, not absolute address) + if 'addr' in bits and (saddr_field := getattr(type(self), 'saddr', None)) and type(self).__name__ not in ('SCRATCH', 'VSCRATCH'): + saddr_val = (self._raw >> saddr_field.lo) & saddr_field.mask # access _raw directly to avoid recursion + bits['addr'] = 64 if saddr_val in (124, 125) else 32 # 124=NULL, 125=M0 + # MUBUF/MTBUF: vaddr size depends on offen/idxen (1 or 2 regs) + if 'vaddr' in bits and hasattr(self, 'offen') and hasattr(self, 'idxen'): + bits['vaddr'] = max(1, self.offen + self.idxen) * 32 + # F8F6F4 MFMA: CBSZ selects matrix A format, BLGP selects matrix B format + # VGPRs: FP8/BF8(0,1)=8, FP6/BF6(2,3)=6, FP4(4)=4 + if 'f8f6f4' in getattr(self, 'op_name', '').lower(): + # Use explicit fields if available (VOP3PX2), else extract from VOP3P-MAI bit positions + cbsz = getattr(self, 'cbsz') if hasattr(type(self), 'cbsz') else (self._raw >> 8) & 0x7 + blgp = getattr(self, 'blgp') if hasattr(type(self), 'blgp') else (self._raw >> 61) & 0x7 + vgprs = {0: 8, 1: 8, 2: 6, 3: 6, 4: 4} + bits['src0'], bits['src1'] = vgprs.get(cbsz, 8) * 32, vgprs.get(blgp, 8) * 32 + return bits + @property + def op_regs(self) -> dict[str, int]: + """Get register counts for each operand field.""" + return {k: max(1, v // 32) for k, v in self.op_bits.items()} + + @functools.cached_property + def canonical_op_bits(self) -> dict[str, int]: + """Get bit widths with canonical names: {'s0', 's1', 's2', 'd', 'data'}.""" + bits = {'d': 32, 's0': 32, 's1': 32, 's2': 32, 'data': 32} + for name, val in self.op_bits.items(): + if (cn := _canonical_name(name)): bits[cn] = val + return bits + + @functools.cached_property + def canonical_operands(self) -> dict: + """Get operands with canonical names: {'s0', 's1', 's2', 'd', 'data'}.""" + result = {} + for name, val in self.operands.items(): + if (cn := _canonical_name(name)): result[cn] = val + return result + + @property + def canonical_op_regs(self) -> dict[str, int]: + """Get register counts with canonical names: {'s0', 's1', 's2', 'd', 'data'}.""" + return {k: max(1, v // 32) for k, v in self.canonical_op_bits.items()} + + def num_srcs(self) -> int: + """Get number of source operands from operand info.""" + ops = self.operands + if 'src2' in ops: return 3 + if 'src1' in ops or 'vsrc1' in ops or 'ssrc1' in ops: return 2 + if 'src0' in ops or 'vsrc0' in ops or 'ssrc0' in ops: return 1 + return 0 + @classmethod + def _size(cls) -> int: return cls._base_size + def size(self) -> int: return self._base_size + def disasm(self) -> str: raise NotImplementedError("disasm is no longer supported") + + def to_bytes(self) -> bytes: return self._raw.to_bytes(self._base_size, 'little') + + @property + def _literal(self) -> int | None: + """Get the literal value if this instruction has one.""" + return getattr(self, 'literal', None) + + def _variant_suffix(self) -> str | None: + """Check if instruction needs a variant class (_LIT, _DPP8, _DPP16, _SDWA). Returns suffix or None.""" + cls_name = type(self).__name__ + # Don't check for variants if we're already a variant class + if any(s in cls_name for s in ('_LIT', '_DPP8', '_DPP16', '_SDWA')): return None + # VOPD: FMAMK/FMAAK opcodes always require literal (check by name since enum may differ across archs) + for name in ('opx', 'opy'): + if hasattr(self, name) and any(x in getattr(self, name).name for x in ('FMAMK', 'FMAAK')): return '_LIT' + for name, field in self._fields: + if isinstance(field, SrcField): + off = getattr(self, name).offset + if off == 255: return '_LIT' + if off == 249: return '_SDWA' if self._is_cdna() else '_DPP8' + if off == 250: return '_DPP16' + return None + + @classmethod + def from_bytes(cls, data: bytes): + inst = object.__new__(cls) + inst._raw = int.from_bytes(data[:cls._base_size], 'little') + # Upgrade to variant class if needed (_LIT, _DPP8, _DPP16, _SDWA) + if (suffix := inst._variant_suffix()) and (var_cls := _get_variant(cls, suffix)) is not None: + return var_cls.from_bytes(data) + return inst + + def __eq__(self, other): return type(self) is type(other) and self._raw == other._raw + def __hash__(self): return hash((type(self), self._raw)) + + def __repr__(self): + # collect (repr, is_default) pairs, strip trailing defaults so repr roundtrips with eval + name = self.op.name.lower() if hasattr(self, 'op') else type(self).__name__ + parts = [(repr(v := getattr(self, n)), v == f.default) for n, f in self._fields if n != 'op' and not isinstance(f, FixedBitField)] + while parts and parts[-1][1]: parts.pop() + return f"{name}({', '.join(p[0] for p in parts)})" diff --git a/artifacts/package_runtime/tinygrad/renderer/amd/elf.py b/artifacts/package_runtime/tinygrad/renderer/amd/elf.py new file mode 100644 index 000000000..718700cf8 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/amd/elf.py @@ -0,0 +1,111 @@ +# minimal amdgpu elf packer +import ctypes +from tinygrad.dtype import AddrSpace +from tinygrad.helpers import ceildiv, round_up +from tinygrad.uop.ops import UOp, Ops +from tinygrad.runtime.autogen import amdgpu_kd, hsa, libc +from tinygrad.renderer.amd.dsl import Reg, FixedBitField +from tinygrad.runtime.autogen.amd.common import OpType + +# instructions used for padding +from tinygrad.runtime.autogen.amd.rdna3.ins import s_code_end # same encoding as RDNA4 +from tinygrad.runtime.autogen.amd.cdna.ins import s_nop as s_nop_cdna + +_arch_map = {"gfx9": "cdna", "gfx10": "rdna3", "gfx11": "rdna3", "gfx12": "rdna4"} +def assemble_linear(prg:UOp, lin:UOp, arch:str) -> bytes: + insts = [u.arg for u in lin.src] + + # ** scan for max vgpr/sgpr/accvgpr + max_vgpr, max_sgpr, max_accvgpr = 0, 0, 0 + _ACCVGPR_TYPES = {OpType.OPR_ACCVGPR, OpType.OPR_SRC_ACCVGPR} + for inst in insts: + # build set of field names that are AccVGPR for this instruction + accvgpr_fields: set[str] = set() + for opr_name, (_, _, opr_type) in inst.operands.items(): + if opr_type in _ACCVGPR_TYPES: accvgpr_fields.add(opr_name) + elif opr_type in {OpType.OPR_VGPR_OR_ACCVGPR, OpType.OPR_SRC_VGPR_OR_ACCVGPR, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST}: + if getattr(inst, 'acc_cd', 0) == 1: accvgpr_fields.add(opr_name) + for name, field in inst._fields: + if isinstance(field, FixedBitField): continue + val = getattr(inst, name) + if not isinstance(val, Reg): continue + if 256 <= val.offset < 512: + if name in accvgpr_fields: max_accvgpr = max(max_accvgpr, (val.offset - 256) + val.sz) + else: max_vgpr = max(max_vgpr, (val.offset - 256) + val.sz) + elif val.offset < 106: max_sgpr = max(max_sgpr, val.offset + val.sz) + + # ** scan sink for metadata + sink, param_sizes, lds_size, gids = prg.src[0], {}, 0, set() + for u in sink.toposort(): + if u.op is Ops.PARAM: param_sizes[u.arg.slot] = u.dtype.itemsize if u.addrspace is AddrSpace.ALU else 8 + elif u.op is Ops.BUFFER and u.addrspace is AddrSpace.LOCAL: lds_size += u.max_numel() * u.dtype.itemsize + elif u.op is Ops.SPECIAL and u.arg.startswith("gidx"): gids.add(int(u.arg[-1])) + code_bytes = b"".join(inst.to_bytes() for inst in insts) + arch = next(v for k, v in _arch_map.items() if arch.startswith(k)) + is_cdna, is_rdna4 = arch == "cdna", arch == "rdna4" + + # ** pad text to ISA alignment + padding_inst = (s_nop_cdna(0) if is_cdna else s_code_end()).to_bytes() + text = code_bytes + padding_inst * ((hsa.AMD_ISA_ALIGN_BYTES - len(code_bytes) % hsa.AMD_ISA_ALIGN_BYTES) % hsa.AMD_ISA_ALIGN_BYTES) + text_offset = round_up(ctypes.sizeof(libc.Elf64_Ehdr), hsa.AMD_ISA_ALIGN_BYTES) + + # ** pack kernel descriptor (rodata) + # CDNA: total VGPRs = regular VGPRs + AccVGPRs, each rounded to granularity of 4 + accum_offset = round_up(max_vgpr, 4) if max_accvgpr > 0 else 0 + next_free_vgpr = round_up(accum_offset + max_accvgpr, 8) if max_accvgpr > 0 else round_up(max_vgpr, 8) + next_free_sgpr = round_up(max_sgpr, 8) + vgpr_granule = max(0, (next_free_vgpr + 7) // 8 - 1) + # CDNA: add 6 for VCC(2) + FLAT_SCRATCH(2) + XNACK_MASK(2), next_free_sgpr is unused in RDNA. + sgpr_granule = max(0, ceildiv(next_free_sgpr + 6, 8) - 1) if is_cdna else 0 + desc = amdgpu_kd.llvm_amdhsa_kernel_descriptor_t() + desc.group_segment_fixed_size = lds_size + for sz in (param_sizes[i] for i in sorted(param_sizes)): desc.kernarg_size = round_up(desc.kernarg_size, sz) + sz + desc.kernel_code_entry_byte_offset = -len(text) + + # https://llvm.org/docs/AMDGPUUsage.html#amdgpu-amdhsa-compute-pgm-rsrc1-gfx6-gfx12-table + # NOTE: CU mode is the default + desc.compute_pgm_rsrc1 = (vgpr_granule << amdgpu_kd.COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT_SHIFT | + sgpr_granule << amdgpu_kd.COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT_SHIFT | + 3 << amdgpu_kd.COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64_SHIFT | + (0 if is_rdna4 else 1) << amdgpu_kd.COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP_SHIFT | + (0 if is_rdna4 else 1) << amdgpu_kd.COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE_SHIFT | + (0 if is_cdna else 1) << amdgpu_kd.COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED_SHIFT) + desc.compute_pgm_rsrc2 = (2 << amdgpu_kd.COMPUTE_PGM_RSRC2_USER_SGPR_COUNT_SHIFT | + int(0 in gids) << amdgpu_kd.COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X_SHIFT | + int(1 in gids) << amdgpu_kd.COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y_SHIFT | + int(2 in gids) << amdgpu_kd.COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z_SHIFT) + desc.kernel_code_properties = (1 << amdgpu_kd.KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT | + (0 if is_cdna else 1) << amdgpu_kd.KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32_SHIFT) + if is_cdna and max_accvgpr > 0: + desc.compute_pgm_rsrc3 = max(0, accum_offset // 4 - 1) << amdgpu_kd.COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_SHIFT + rodata = bytes(desc) + + # ** pack ELF + sh_names:list[int] = [] + strtab = bytearray(b"\x00") + for name in [".text", ".rodata", ".strtab"]: + sh_names.append(len(strtab)) + strtab += name.encode("ascii") + b"\x00" + + rodata_offset = round_up(text_offset + (text_size := len(text)), hsa.AMD_KERNEL_CODE_ALIGN_BYTES) + strtab_offset = rodata_offset + (rodata_size := len(rodata)) + shdr_offset = strtab_offset + (strtab_size := len(strtab)) + + sections = [(libc.SHT_PROGBITS, libc.SHF_ALLOC | libc.SHF_EXECINSTR, text_offset, text_offset, text_size), + (libc.SHT_PROGBITS, libc.SHF_ALLOC, rodata_offset, rodata_offset, rodata_size), + (libc.SHT_STRTAB, 0, 0, strtab_offset, strtab_size)] + shdrs = (libc.Elf64_Shdr * len(sections))() + for i, s in enumerate(sections): shdrs[i] = libc.Elf64_Shdr(sh_names[i], *s) + + ehdr = libc.Elf64_Ehdr() + ehdr.e_ident[:5], ehdr.e_shoff, ehdr.e_shnum, ehdr.e_shstrndx = b"\x7FELF\x02", shdr_offset, len(sections), 2 + + elf = bytearray(shdr_offset + ctypes.sizeof(shdrs)) + elf[0:ctypes.sizeof(ehdr)] = bytes(ehdr) + elf[text_offset:text_offset+text_size] = text + elf[rodata_offset:rodata_offset+rodata_size] = rodata + elf[strtab_offset:strtab_offset+strtab_size] = strtab + elf[shdr_offset:shdr_offset+ctypes.sizeof(shdrs)] = bytes(shdrs) + binary = bytes(elf) + + return binary diff --git a/artifacts/package_runtime/tinygrad/renderer/amd/generate.py b/artifacts/package_runtime/tinygrad/renderer/amd/generate.py new file mode 100644 index 000000000..b2b3d384c --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/amd/generate.py @@ -0,0 +1,531 @@ +# AMD ISA code generator - generates enum.py, ins.py, operands.py, str_pcode.py +# Sources: XML from https://gpuopen.com/download/machine-readable-isa/latest/ +# PDF manuals from AMD documentation +import re, zlib, xml.etree.ElementTree as ET, zipfile, pathlib +from tinygrad.helpers import fetch + +# ═══════════════════════════════════════════════════════════════════════════════ +# Configuration +# ═══════════════════════════════════════════════════════════════════════════════ + +ARCHS = { + "rdna3": {"xml": "amdgpu_isa_rdna3_5.xml", "pdf": "https://docs.amd.com/api/khub/documents/UVVZM22UN7tMUeiW_4ShTQ/content"}, + "rdna4": {"xml": "amdgpu_isa_rdna4.xml", "pdf": "https://docs.amd.com/api/khub/documents/uQpkEvk3pv~kfAb2x~j4uw/content"}, + "cdna": {"xml": "amdgpu_isa_cdna4.xml", "pdf": "https://www.amd.com/content/dam/amd/en/documents/instinct-tech-docs/instruction-set-architectures/amd-instinct-cdna4-instruction-set-architecture.pdf"}, +} +# Pin the September 2025 XML bundle because newer `latest` changed WMMA format bit sizes across archs and breaks generation. +XML_URL = "https://gpuopen.com/download/AMD_GPU_MR_ISA_XML_2025_09_05.zip" +# Map XML encoding names to codebase names +NAME_MAP = {"VOP3_SDST_ENC": "VOP3SD", "VOP3_SDST_ENC_LIT": "VOP3SD_LIT", "VOP3_SDST_ENC_DPP16": "VOP3SD_DPP16", + "VOP3_SDST_ENC_DPP8": "VOP3SD_DPP8", "VOPDXY": "VOPD", "VOPDXY_LIT": "VOPD_LIT", "VDS": "DS"} +# Instructions missing from XML but present in PDF +FIXES = {"rdna3": {"SOPK": {22: "S_SUBVECTOR_LOOP_BEGIN", 23: "S_SUBVECTOR_LOOP_END"}, "FLAT": {55: "FLAT_ATOMIC_CSUB_U32"}}, + "rdna4": {"SOP1": {80: "S_GET_BARRIER_STATE", 81: "S_BARRIER_INIT", 82: "S_BARRIER_JOIN"}, "SOPP": {9: "S_WAITCNT", 21: "S_BARRIER_LEAVE"}}, + "cdna": {"DS": {152: "DS_GWS_SEMA_RELEASE_ALL", 154: "DS_GWS_SEMA_V", 156: "DS_GWS_SEMA_P"}, + "VOP3P": {44: "V_MFMA_LD_SCALE_B32", 62: "V_MFMA_F32_16X16X8_XF32", 63: "V_MFMA_F32_32X32X4_XF32"}}} +# Fields missing from XML but present in hardware (format: {arch: {encoding: [(name, hi, lo), ...]}}) +FIELD_FIXES = {"cdna": {"VOP3P": [("opsel_hi2", 14, 14)]}} +# Encoding suffixes to strip (variants we don't generate separate classes for) +_ENC_SUFFIXES = ("_NSA1",) +# Encoding suffix to class suffix mapping (for variants we DO generate) +_ENC_SUFFIX_MAP = {"_INST_LITERAL": "_LIT", "_VOP_DPP16": "_DPP16", "_VOP_DPP": "_DPP16", "_VOP_DPP8": "_DPP8", + "_VOP_SDWA": "_SDWA", "_VOP_SDWA_SDST_ENC": "_SDWA_SDST", "_MFMA": "_MFMA"} +# Field name normalization +_FIELD_RENAMES = {"opsel_hi_2": "opsel_hi2", "op_sel_hi_2": "opsel_hi2", "op_sel": "opsel", "bound_ctrl": "bc", + "tgt": "target", "row_en": "row", "unorm": "unrm", "clamp": "clmp", "wait_exp": "waitexp", + "simm32": "literal", "dpp_ctrl": "dpp", "acc_cd": "acc_cd", "acc": "acc", + "dst_sel": "dst_sel", "dst_unused": "dst_unused", "src0_sel": "src0_sel", "src1_sel": "src1_sel"} +# Encoding variants to skip entirely (NSA is for MIMG graphics instructions) +_SKIP_ENCODINGS = ("NSA",) + +# ═══════════════════════════════════════════════════════════════════════════════ +# XML parsing helpers +# ═══════════════════════════════════════════════════════════════════════════════ + +def _strip_enc(name: str) -> str: + """Strip ENC_ prefix and normalize encoding suffixes.""" + name = name.removeprefix("ENC_") + for sfx in _ENC_SUFFIXES: name = name.replace(sfx, "") + # Process longer suffixes first to avoid partial matches (e.g., _VOP_DPP8 before _VOP_DPP) + for old, new in sorted(_ENC_SUFFIX_MAP.items(), key=lambda x: -len(x[0])): name = name.replace(old, new) + return name + +def _norm_field(name: str) -> str: + """Normalize field name to match expected names.""" + for old, new in _FIELD_RENAMES.items(): name = name.replace(old, new) + return name + +def _map_flat(enc_name: str, instr_name: str) -> str: + """Map FLAT/GLOBAL/SCRATCH encoding to correct enum based on instruction prefix.""" + if enc_name in ("FLAT_GLBL", "FLAT_GLOBAL"): return "GLOBAL" + if enc_name == "FLAT_SCRATCH": return "SCRATCH" + if enc_name in ("FLAT", "VFLAT", "VGLOBAL", "VSCRATCH"): + v = "V" if enc_name.startswith("V") else "" + if instr_name.startswith("GLOBAL_"): return f"{v}GLOBAL" + if instr_name.startswith("SCRATCH_"): return f"{v}SCRATCH" + return f"{v}FLAT" + return enc_name + +# ═══════════════════════════════════════════════════════════════════════════════ +# XML parsing +# ═══════════════════════════════════════════════════════════════════════════════ + +def parse_xml(filename: str): + root = ET.fromstring(zipfile.ZipFile(fetch(XML_URL)).read(filename)) + encodings, enums, types, fmts, op_types_set = {}, {}, {}, {}, set() + # Extract HWREG and MSG enums from OperandTypes + op_enum_map = {("OPR_HWREG", "ID"): "HWREG", ("OPR_SENDMSG_RTN", "MSG"): "MSG"} + for ot in root.findall(".//OperandTypes/OperandType"): + ot_name = ot.findtext("OperandTypeName") + for field in ot.findall(".//Field"): + key = (ot_name, field.findtext("FieldName")) + if (enum_name := op_enum_map.get(key)): # type: ignore[arg-type] + def _pv_val(pv: ET.Element) -> tuple[int, str]: + v, n = pv.findtext("Value"), pv.findtext("Name") + assert v is not None and n is not None + return int(v), n.upper() + enums[enum_name] = dict(_pv_val(pv) for pv in field.findall(".//PredefinedValue")) + # Extract DataFormats with BitCount + for df in root.findall("ISA/DataFormats/DataFormat"): + name, bits = df.findtext("DataFormatName"), df.findtext("BitCount") + if name and bits: fmts[name] = int(bits) + # Extract encoding definitions + for enc in root.findall("ISA/Encodings/Encoding"): + name = enc.findtext("EncodingName") + assert name is not None + is_base = name.startswith("ENC_") or name in ("VOP3_SDST_ENC", "VOPDXY") + is_variant = any(sfx in name for sfx in _ENC_SUFFIX_MAP) + if not is_base and not is_variant: continue + if any(s in name for s in _SKIP_ENCODINGS): continue + fields: list[tuple[str, int, int]] = [] + for f in enc.findall(".//MicrocodeFormat/BitMap/Field"): + br = f.find("BitLayout/Range") + if br is None: continue + fn = f.findtext("FieldName") + assert fn is not None + fields.append((_norm_field(fn.lower()), + int(br.findtext("BitOffset") or 0) + int(br.findtext("BitCount") or 0) - 1, int(br.findtext("BitOffset") or 0))) + ident_list = enc.findall("EncodingIdentifiers/EncodingIdentifier") + ident = ident_list[0] if ident_list else None + enc_field = next((f for f in fields if f[0] == "encoding"), None) + # For multi-dword formats, encoding field may be in higher dword but identifier is always in dword0; use % 32 + enc_bits: str | None = None + if ident is not None and ident.text is not None and enc_field: + enc_bits = "".join(ident.text[len(ident.text)-1-b] for b in range(enc_field[1] % 32, (enc_field[2] % 32)-1, -1)) + base_name = _strip_enc(name) + encodings[NAME_MAP.get(base_name, base_name)] = (fields, enc_bits) + # Extract instruction opcodes and operand info + # Track which encodings each opcode appears in (for detecting LIT-only ops) + opcode_encs: dict[str, dict[int, set[str]]] = {} # {base_fmt: {opcode: {enc_names}}} + for instr in root.findall("ISA/Instructions/Instruction"): + name = instr.findtext("InstructionName") + assert name is not None + for enc in instr.findall("InstructionEncodings/InstructionEncoding"): + if enc.findtext("EncodingCondition") != "default": continue + enc_enc_name = enc.findtext("EncodingName") + assert enc_enc_name is not None + base, opcode = _map_flat(_strip_enc(enc_enc_name), name), int(enc.findtext("Opcode") or 0) + enc_name = NAME_MAP.get(base, base) + # Encoding variants use the same Op enum as the base format + base_enum = enc_name + for sfx in ("_SDWA_SDST", "_DPP16", "_DPP8", "_SDWA", "_LIT", "_MFMA"): + base_enum = base_enum.replace(sfx, "") + # Track which encodings this opcode appears in + opcode_encs.setdefault(base_enum, {}).setdefault(opcode, set()).add(enc_name) + # ADDTID instructions go in both FLAT and GLOBAL enums (pcode uses FLATOp for these) + if "ADDTID" in name: + if base == "GLOBAL": enums.setdefault("FLAT", {})[opcode] = name + elif base == "VGLOBAL": enums.setdefault("VFLAT", {})[opcode] = name + enums.setdefault(base_enum, {})[opcode] = name + # Extract operand info + op_info: dict[str, tuple[str | None, int, str | None]] = {} + for op in enc.findall("Operands/Operand"): + fn = op.findtext("FieldName") + if fn: op_info[fn.lower()] = (op.findtext("DataFormatName"), int(op.findtext("OperandSize") or 0), op.findtext("OperandType")) + for fmt, _, otype in op_info.values(): + if fmt and fmt not in fmts: fmts[fmt] = 0 + if otype: op_types_set.add(otype) + if op_info: types[(name, base_enum)] = op_info + # Find opcodes that only exist in a specific variant encoding (no base format version) + suffix_only_ops: dict[str, dict[str, set[int]]] = {} # {suffix: {base_fmt: {opcodes}}} + for base_fmt, opcodes in opcode_encs.items(): + for opcode, encs in opcodes.items(): + suffix = next((s for s in _ENC_SUFFIX_MAP.values() if all(s in e for e in encs)), None) + if suffix is not None: suffix_only_ops.setdefault(suffix, {}).setdefault(base_fmt, set()).add(opcode) + return encodings, enums, types, fmts, op_types_set, suffix_only_ops + +# ═══════════════════════════════════════════════════════════════════════════════ +# PDF parsing +# ═══════════════════════════════════════════════════════════════════════════════ + +def extract_pdf_text(url: str) -> list[list[tuple[float, float, str, str]]]: + """Extract positioned text from PDF. Returns list of text elements (x, y, text, font) per page.""" + data = fetch(url).read_bytes() + # Parse xref table to locate objects + xref: dict[int, int] = {} + xref_match = re.search(rb'startxref\s+(\d+)', data) + assert xref_match is not None + pos = int(xref_match.group(1)) + 4 + while data[pos:pos+7] != b'trailer': + while data[pos:pos+1] in b' \r\n': pos += 1 + line_end = data.find(b'\n', pos) + start_obj, count = map(int, data[pos:line_end].split()[:2]) + pos = line_end + 1 + for i in range(count): + if data[pos+17:pos+18] == b'n' and (off := int(data[pos:pos+10])) > 0: xref[start_obj + i] = off + pos += 20 + + def get_stream(n: int) -> bytes: + obj = data[xref[n]:data.find(b'endobj', xref[n])] + raw = obj[obj.find(b'stream\n') + 7:obj.find(b'\nendstream')] + return zlib.decompress(raw) if b'/FlateDecode' in obj else raw + + pages = [] + for n in sorted(xref): + if b'/Type /Page' not in data[xref[n]:xref[n]+500]: continue + if not (m := re.search(rb'/Contents (\d+) 0 R', data[xref[n]:xref[n]+500])): continue + stream = get_stream(int(m.group(1))).decode('latin-1') + elements, font = [], '' + _RE_BT = (r'(/F[\d.]+) [\d.]+ Tf|([\d.+-]+) ([\d.+-]+) Td|[\d.+-]+ [\d.+-]+ [\d.+-]+ [\d.+-]+ ([\d.+-]+) ([\d.+-]+) Tm' + r'|<([0-9A-Fa-f]+)>.*?Tj|\[([^\]]+)\] TJ') + for bt in re.finditer(r'BT(.*?)ET', stream, re.S): + x, y = 0.0, 0.0 + for sm in re.finditer(_RE_BT, bt.group(1)): + if sm.group(1): font = sm.group(1) + elif sm.group(2): x, y = x + float(sm.group(2)), y + float(sm.group(3)) + elif sm.group(4): x, y = float(sm.group(4)), float(sm.group(5)) + elif sm.group(6) and (t := bytes.fromhex(sm.group(6)).decode('latin-1')).strip(): + elements.append((x, y, t, font)) + elif sm.group(7): + t = ''.join(bytes.fromhex(h).decode('latin-1') for h in re.findall(r'<([0-9A-Fa-f]+)>', sm.group(7))) + if t.strip(): elements.append((x, y, t, font)) + pages.append(sorted(elements, key=lambda e: (-e[1], e[0]))) + return pages + +def extract_pcode(pages: list[list[tuple[float, float, str, str]]], name_to_op: dict[str, int]) -> dict[tuple[str, int], str]: + """Extract pseudocode for instructions. Returns {(name, opcode): pseudocode}.""" + # First pass: find all instruction headers across all pages + all_instructions: list[tuple[int, float, str, int]] = [] # (page_idx, y, name, opcode) + for page_idx, page in enumerate(pages): + by_y: dict[int, list[tuple[float, str]]] = {} + for x, y, t, _ in page: + by_y.setdefault(round(y), []).append((x, t)) + for y, items in sorted(by_y.items(), reverse=True): + left = [(x, t) for x, t in items if 55 < x < 65] + right = [(x, t) for x, t in items if 535 < x < 550] + if left and right and left[0][1] in name_to_op and right[0][1].isdigit(): + all_instructions.append((page_idx, y, left[0][1], int(right[0][1]))) + + # Second pass: extract pseudocode between consecutive instructions + pcode: dict[tuple[str, int], str] = {} + for i, (page_idx, y, name, opcode) in enumerate(all_instructions): + if i + 1 < len(all_instructions): + next_page, next_y = all_instructions[i + 1][0], all_instructions[i + 1][1] + else: + next_page, next_y = page_idx, 0 + # Collect F6 text from current position to next instruction (pseudocode is at x ≈ 69) + lines: list[tuple[int, float, str]] = [] + for p in range(page_idx, next_page + 1): + start_y = y if p == page_idx else 800 + end_y = next_y if p == next_page else 0 + lines.extend((p, y2, t) for x, y2, t, f in pages[p] if f in ('/F6.0', '/F7.0') and end_y < y2 < start_y and 60 < x < 80) + if lines: + sorted_lines = sorted(lines, key=lambda x: (x[0], -x[1])) + # Stop at large Y gaps (>30) - indicates section break + filtered = [sorted_lines[0]] + for j in range(1, len(sorted_lines)): + prev_page, prev_y, _ = sorted_lines[j-1] + curr_page, curr_y, _ = sorted_lines[j] + if curr_page == prev_page and prev_y - curr_y > 30: break + if curr_page != prev_page and prev_y > 60 and curr_y < 730: break + filtered.append(sorted_lines[j]) + pcode_lines = [t.replace('Ê', '').strip() for _, _, t in filtered] + if pcode_lines: pcode[(name, opcode)] = '\n'.join(pcode_lines) + return pcode + +# ═══════════════════════════════════════════════════════════════════════════════ +# Code generation +# ═══════════════════════════════════════════════════════════════════════════════ + +def write_common(all_fmts: dict[str, int], all_op_types: set[str], path: pathlib.Path) -> None: + lines: list[str] = ["# autogenerated from AMD ISA XML - do not edit", "from enum import Enum, auto", ""] + lines.append("class ReprEnum(Enum):") + lines.append(' """Enum with clean repr that roundtrips with eval()."""') + lines.append(' def __repr__(self): return f"{type(self).__name__}.{self.name}"') + lines.append("") + lines.append("class Fmt(Enum):") + for fmt in sorted(all_fmts.keys()): lines.append(f" {fmt} = auto()") + lines.append("") + lines.append("FMT_BITS = {") + for fmt, bits in sorted(all_fmts.items()): lines.append(f" Fmt.{fmt}: {bits},") + lines.append("}") + lines.append("") + lines.append("class OpType(Enum):") + for ot in sorted(all_op_types): lines.append(f" {ot} = auto()") + with open(path, "w") as f: f.write("\n".join(lines)) + +def write_enum(enums, path): + lines: list[str] = ["# autogenerated from AMD ISA XML - do not edit", + "from tinygrad.runtime.autogen.amd.common import ReprEnum, Fmt, FMT_BITS, OpType # noqa: F401", ""] + for name, ops in sorted(enums.items()): + if not ops: continue + suffix = "_E32" if name in ("VOP1", "VOP2", "VOPC") else "_E64" if name == "VOP3" else "" + lines.append(f"class {name}(ReprEnum):" if name in ("HWREG", "MSG") else f"class {name}Op(ReprEnum):") + aliases = [] + for op, mem in sorted(ops.items()): + msuf = suffix if name != "VOP3" or op < 512 else "" + lines.append(f" {mem}{msuf} = {op}") + if msuf: aliases.append((mem, msuf)) + for mem, msuf in aliases: lines.append(f" {mem} = {mem}{msuf}") + lines.append("") + with open(path, "w") as f: f.write("\n".join(lines)) + +def write_ins(encodings, enums, suffix_only_ops, types, arch, path): + _VGPR_FIELDS = {"vdst", "vdstx", "vsrc0", "vsrc1", "vsrc2", "vsrc3", "vsrcx1", "vsrcy1", "vaddr", "vdata", "data", "data0", "data1", "addr", "vsrc"} + _VARIANT_SUFFIXES = ("_LIT", "_DPP16", "_DPP8", "_SDWA_SDST", "_SDWA", "_MFMA") + def get_base_fmt(fmt): + for sfx in _VARIANT_SUFFIXES: fmt = fmt.replace(sfx, "") + return fmt + def field_def(name, hi, lo, fmt, enc_bits=None): + bits = hi - lo + 1 + base_fmt = get_base_fmt(fmt) + if name == "encoding" and enc_bits: return f"FixedBitField({hi}, {lo}, 0b{enc_bits})" + if name == "op" and fmt not in ("DPP", "SDWA"): return f"EnumBitField({hi}, {lo}, {base_fmt}Op)" + if name in ("opx", "opy"): return f"EnumBitField({hi}, {lo}, VOPDOp)" + if name == "vdsty": return f"VDSTYField({hi}, {lo})" + if name in _VGPR_FIELDS and bits == 8: return f"VGPRField({hi}, {lo})" + if name == "sbase" and bits == 6: return f"SBaseField({hi}, {lo})" + if name in ("srsrc", "ssamp") and bits == 5: return f"SRsrcField({hi}, {lo})" + if name in ("sdst", "sdata") and bits == 7: return f"SGPRField({hi}, {lo})" + if name in ("soffset", "saddr") and bits == 7: return f"SGPRField({hi}, {lo}, default=NULL)" + if name.startswith("ssrc") and bits == 8: return f"SSrcField({hi}, {lo})" + if name in ("saddr", "soffset") and bits == 8: return f"SSrcField({hi}, {lo}, default=NULL)" + if name.startswith("src") and bits == 9: return f"SrcField({hi}, {lo})" + # GLOBAL/SCRATCH: offset is 13-bit signed [12:0], FLAT: 12-bit unsigned (XML has 12-bit for all) + if name == "offset" and base_fmt in ("GLOBAL", "SCRATCH"): return f"BitField(12, {lo})" + if base_fmt == "VOP3P" and name == "opsel_hi": return f"BitField({hi}, {lo}, default=3)" + if base_fmt == "VOP3P" and name == "opsel_hi2": return f"BitField({hi}, {lo}, default=1)" + return f"BitField({hi}, {lo})" + ORDER = ['encoding', 'op', 'opx', 'opy', 'vdst', 'vdstx', 'vdsty', 'sdst', 'vdata', 'sdata', 'addr', 'vaddr', 'data', 'data0', 'data1', + 'src0', 'srcx0', 'srcy0', 'vsrc0', 'ssrc0', 'src1', 'vsrc1', 'vsrcx1', 'vsrcy1', 'ssrc1', 'src2', 'vsrc2', 'src3', 'vsrc3', + 'saddr', 'sbase', 'srsrc', 'ssamp', 'soffset', 'offset', 'simm16', 'literal', 'en', 'target', 'attr', 'attr_chan', + 'omod', 'neg', 'neg_hi', 'abs', 'clmp', 'opsel', 'opsel_hi', 'waitexp', 'wait_va', + 'dmask', 'dim', 'seg', 'format', 'offen', 'idxen', 'glc', 'dlc', 'slc', 'tfe', 'unrm', 'done', 'row', + 'dpp', 'fi', 'bc', 'row_mask', 'bank_mask', 'src0_neg', 'src0_abs', 'src1_neg', 'src1_abs', + 'cbsz', 'abid', 'acc_cd', 'acc', 'blgp', 'lane_sel_0', 'lane_sel_1', 'lane_sel_2', 'lane_sel_3', + 'lane_sel_4', 'lane_sel_5', 'lane_sel_6', 'lane_sel_7', 'dst_sel', 'dst_unused', 'src0_sel', 'src1_sel'] + def sort_fields(fields): return sorted(fields, key=lambda f: (ORDER.index(f[0]) if f[0] in ORDER else 999, f[2])) + + # Separate base encodings from variants + base_encodings, variant_encodings = {}, {} + for enc_name, data in encodings.items(): + base = get_base_fmt(enc_name) + if base == enc_name: base_encodings[enc_name] = data + else: variant_encodings[enc_name] = data + + # Build sets of ops by their vdst type from operand metadata + sdst_opcodes: dict[str, set[int]] = {} # ops where vdst is OPR_SREG (writes to SGPR) + for fmt, ops in enums.items(): + for op, name in ops.items(): + op_types = types.get((name, fmt), {}) + vdst_type = op_types.get("vdst", (None, None, None))[2] + if vdst_type == "OPR_SREG": sdst_opcodes.setdefault(fmt, set()).add(op) + + # collect only the XxxOp enums that are actually referenced in this arch's instruction definitions + enum_names = sorted(f"{k}Op" for k in enums if enums[k] and k not in ("HWREG", "MSG")) + # also re-export HWREG/MSG enums (plain enums, not instruction format ops) + enum_names += sorted(k for k in enums if k in ("HWREG", "MSG") and enums[k]) + # collect DSL field types actually used by scanning generated field definitions + all_field_defs = " ".join(field_def(fn, hi, lo, enc, eb) for enc, (flds, eb) in encodings.items() for fn, hi, lo in flds) + _ALL_DSL = ["BitField", "EnumBitField", "FixedBitField", "NULL", "SBaseField", "SGPRField", "SRsrcField", + "SSrcField", "SrcField", "VDSTYField", "VGPRField"] + dsl_names = ["Inst"] + [n for n in _ALL_DSL if n in all_field_defs] + # also re-export register names so `from ins import *` still provides them to downstream users + _DSL_REGS = ["s", "v", "src", "VCC_LO", "VCC_HI", "VCC", "EXEC_LO", "EXEC_HI", "EXEC", "NULL", "OFF", "M0", + "SCC", "VCCZ", "EXECZ", "ttmp", "INV_2PI", "SDWA", "DPP", "DPP16", "LIT", "SRC_LDS_DIRECT"] + dsl_reexport = sorted(set(dsl_names + _DSL_REGS)) + lines: list[str] = ["# autogenerated from AMD ISA XML - do not edit", "# ruff: noqa: E501,F401", + f"from tinygrad.renderer.amd.dsl import {', '.join(dsl_reexport)}", + f"from tinygrad.runtime.autogen.amd.{arch}.enum import {', '.join(enum_names)}", "import functools", ""] + + def fmt_allowed(op_enum: str, ops: set[int]) -> str: + """Format allowed ops as {EnumName.MEMBER, ...}.""" + names = [f"{op_enum}.{enums[op_enum.removesuffix('Op')][op]}" for op in sorted(ops)] + return "{" + ", ".join(names) + "}" + + # Generate base classes first + for enc_name, (fields, enc_bits) in sorted(base_encodings.items()): + all_ops = set(enums.get(enc_name, {}).keys()) + # Get suffix-only ops for this format (these can't be used in base class) + base_suffix_ops = set().union(*(d.get(enc_name, set()) for d in suffix_only_ops.values())) + # Exclude SDST ops from base class (they need VOP1_SDST/VOP3_SDST/VOP3B) + base_allowed = all_ops - base_suffix_ops - sdst_opcodes.get(enc_name, set()) + # RDNA3 FLAT/GLOBAL/SCRATCH share encoding bits, differentiated by seg field + # RDNA4 VFLAT/VGLOBAL/VSCRATCH have distinct encoding bits, no seg field needed + has_seg_field = any(fn == "seg" for fn, _, _ in fields) + if enc_name in ("FLAT", "VFLAT") and has_seg_field: + prefix = "V" if enc_name == "VFLAT" else "" + flat_variants = [(f"{prefix}FLAT", 0, f"{prefix}FLATOp"), (f"{prefix}GLOBAL", 2, f"{prefix}GLOBALOp"), + (f"{prefix}SCRATCH", 1, f"{prefix}SCRATCHOp")] + for cls, seg, op_enum in flat_variants: + cls_ops = set(enums.get(cls, {}).keys()) + lines.append(f"class {cls}(Inst):") + for fn, hi, lo in sort_fields(fields): + if fn == "seg": lines.append(f" seg = FixedBitField({hi}, {lo}, {seg})") + elif fn == "op": lines.append(f" op = EnumBitField({hi}, {lo}, {op_enum}, {fmt_allowed(op_enum, cls_ops)})") + else: lines.append(f" {fn} = {field_def(fn, hi, lo, cls, enc_bits)}") + lines.append("") + elif enc_name not in ("FLAT_GLOBAL", "FLAT_SCRATCH", "FLAT_GLBL", "DPP", "SDWA"): + lines.append(f"class {enc_name}(Inst):") + for fn, hi, lo in sort_fields(fields): + if fn == "op": + base_fmt = get_base_fmt(enc_name) + lines.append(f" op = EnumBitField({hi}, {lo}, {base_fmt}Op, {fmt_allowed(f'{base_fmt}Op', base_allowed)})") + else: + lines.append(f" {fn} = {field_def(fn, hi, lo, enc_name, enc_bits if fn == 'encoding' else None)}") + lines.append("") + + # Generate variant classes that inherit from base (only add extra fields) + for enc_name, (fields, enc_bits) in sorted(variant_encodings.items()): + base = get_base_fmt(enc_name) + if base not in base_encodings: continue # skip if no base class + base_fields = {f[0] for f in base_encodings[base][0]} + extra_fields = [(fn, hi, lo) for fn, hi, lo in fields if fn not in base_fields] + # Check if this is a suffix-only variant + variant_suffix = next((sfx for sfx in _VARIANT_SUFFIXES if enc_name.endswith(sfx)), None) + is_suffix_variant = variant_suffix in suffix_only_ops + all_ops = set(enums.get(base, {}).keys()) + if extra_fields or is_suffix_variant: + lines.append(f"class {enc_name}({base}):") + op_field = next((f for f in base_encodings[base][0] if f[0] == "op"), None) + # _LIT classes: override op to allow all opcodes (base excludes lit-only ops) + # other classes override op to only suffix-only opcodes + if op_field and is_suffix_variant: + _, hi, lo = op_field + allowed_ops = all_ops if variant_suffix == "_LIT" else suffix_only_ops[variant_suffix][base] + lines.append(f" op = EnumBitField({hi}, {lo}, {base}Op, {fmt_allowed(f'{base}Op', allowed_ops)})") + for fn, hi, lo in sort_fields(extra_fields): + lines.append(f" {fn} = {field_def(fn, hi, lo, enc_name)}") + lines.append("") + + # SDST variants (special case - redefine vdst field type, restrict to SDST ops) + for base, field_hi, field_lo in [("VOP1", 24, 17), ("VOP3", 7, 0)]: + if base not in base_encodings: continue + sdst_ops = sdst_opcodes.get(base, set()) + if not sdst_ops: continue + # For VOP3, all ops < 256 (compare/cmpx ops) use SDST encoding + all_base_ops = set(enums.get(base, {}).keys()) + if base == "VOP3": sdst_ops = sdst_ops | {op for op in all_base_ops if op < 256} + op_field = next((f for f in base_encodings[base][0] if f[0] == "op"), None) + lines.append(f"class {base}_SDST({base}):") + if op_field: + _, hi, lo = op_field + lines.append(f" op = EnumBitField({hi}, {lo}, {base}Op, {fmt_allowed(f'{base}Op', sdst_ops)})") + lines.append(f" vdst = SSrcField({field_hi}, {field_lo})") + lines.append("") + # SDST_LIT class (for literals with SDST destination) - same ops, just adds literal field + lit_enc = variant_encodings.get(f"{base}_LIT") + if lit_enc: + lit_field = next((f for f in lit_enc[0] if f[0] == "literal"), None) + if lit_field: + lines.append(f"class {base}_SDST_LIT({base}_SDST):") + lines.append(f" literal = BitField({lit_field[1]}, {lit_field[2]})") + lines.append("") + + # Instruction helpers + lines.append("# instruction helpers") + for fmt, ops in sorted(enums.items()): + if fmt not in base_encodings and fmt not in ("GLOBAL", "SCRATCH", "VGLOBAL", "VSCRATCH"): continue + suffix = "_E32" if fmt in ("VOP1", "VOP2", "VOPC") else "_E64" if fmt == "VOP3" else "" + op_to_suffix = {op:suffix for suffix,ops in suffix_only_ops.items() for op in ops.get(fmt, set())} + fmt_sdst_ops = sdst_opcodes.get(fmt, set()) + for op, name in sorted(ops.items()): + # ADDTID ops are in both FLAT and GLOBAL enums (for pcode); only generate helper for GLOBAL/VGLOBAL + if "ADDTID" in name and fmt in ("FLAT", "VFLAT"): continue + msuf = suffix if fmt != "VOP3" or op < 512 else "" + # Determine class: SDST variants, suffix-specific variants (e.g., _MFMA, _LIT), or base + if fmt == "VOP1" and op in fmt_sdst_ops: cls = "VOP1_SDST" + elif fmt == "VOP3" and (op in fmt_sdst_ops or op < 256): cls = "VOP3_SDST" + elif op_to_suffix.get(op): cls = f"{fmt}{op_to_suffix[op]}" + else: cls = fmt + lines.append(f"{name.lower()}{msuf.lower()} = functools.partial({cls}, {fmt}Op.{name}{msuf})") + with open(path, "w") as f: f.write("\n".join(lines)) + +def write_operands(types: dict, enums: dict, arch: str, path: pathlib.Path) -> None: + valid = {(name, fmt) for fmt, ops in enums.items() for name in ops.values()} + # only import enums that are actually used as keys in OPERANDS + used_bases = {eb for (nm, eb) in types if (nm, eb) in valid} + enum_names = sorted(f"{k}Op" for k in used_bases) + lines: list[str] = ["# autogenerated from AMD ISA XML - do not edit", + "from tinygrad.runtime.autogen.amd.common import Fmt, OpType", + f"from tinygrad.runtime.autogen.amd.{arch}.enum import {', '.join(enum_names)}", ""] + lines.append("# instruction operand info: {Op: {field: (Fmt, size_bits, OpType)}}") + lines.append("OPERANDS = {") + def fmt_val(v): + fmt, size, otype = v + return f"({f'Fmt.{fmt}' if fmt else 'None'}, {size}, {f'OpType.{otype}' if otype else 'None'})" + for (name, enc_base), fields in sorted(types.items()): + if (name, enc_base) not in valid: continue + fstr = ", ".join(f'"{k}": {fmt_val(v)}' for k, v in sorted(fields.items())) + lines.append(f' {enc_base}Op.{name}: {{{fstr}}},') + lines.append("}") + with open(path, "w") as f: f.write("\n".join(lines)) + +def write_pcode(pcode: dict[tuple[str, int], str], enums: dict[str, dict[int, str]], arch: str, path: pathlib.Path) -> None: + """Write str_pcode.py file from extracted pseudocode.""" + entries: list[tuple[str, str, int, str]] = [] + for fmt_name, ops in enums.items(): + member_suffix = "_E32" if fmt_name in ("VOP1", "VOP2", "VOPC") else "_E64" if fmt_name == "VOP3" else "" + for opcode, name in ops.items(): + if (name, opcode) in pcode: + msuf = member_suffix if fmt_name != "VOP3" or opcode < 512 else "" + entries.append((f"{fmt_name}Op", f"{name}{msuf}", opcode, pcode[(name, opcode)])) + enum_names = sorted(set(e[0] for e in entries)) + lines = ["# autogenerated from AMD ISA PDF - do not edit", "# ruff: noqa: E501", + f"from tinygrad.runtime.autogen.amd.{arch}.enum import {', '.join(enum_names)}", "", "PCODE = {"] + for enum_name, name, opcode, code in sorted(entries, key=lambda x: (x[0], x[2])): + lines.append(f" {enum_name}.{name}: {code!r},") + lines.append("}") + with open(path, "w") as f: f.write("\n".join(lines)) + +# ═══════════════════════════════════════════════════════════════════════════════ +# Main +# ═══════════════════════════════════════════════════════════════════════════════ + +if __name__ == "__main__": + all_fmts: dict[str, int] = {} + all_op_types: set[str] = set() + arch_data: dict[str, dict] = {} + # First pass: parse XML for all architectures + for arch, cfg in ARCHS.items(): + print(f"Parsing XML: {cfg['xml']} -> {arch}") + encodings, enums, types, fmts, op_types_set, suffix_only_ops = parse_xml(cfg["xml"]) + for fmt, ops in FIXES.get(arch, {}).items(): enums.setdefault(fmt, {}).update(ops) + for fmt, fields in FIELD_FIXES.get(arch, {}).items(): + if fmt in encodings: encodings[fmt] = (encodings[fmt][0] + fields, encodings[fmt][1]) + arch_data[arch] = {"encodings": encodings, "enums": enums, "types": types, "suffix_only_ops": suffix_only_ops} + for fmt, bits in fmts.items(): + assert fmt not in all_fmts or all_fmts[fmt] == bits, f"FMT_BITS mismatch for {fmt}: {all_fmts[fmt]} vs {bits}" + all_fmts[fmt] = bits + all_op_types.update(op_types_set) + # Write common.py + autogen_base = pathlib.Path(__file__).parents[2] / "runtime" / "autogen" / "amd" + common_path = autogen_base / "common.py" + write_common(all_fmts, all_op_types, common_path) + print(f"Wrote common.py: {len(all_fmts)} formats, {len(all_op_types)} op types") + # Write per-arch files from XML + for arch, data in arch_data.items(): + base = autogen_base / arch + write_enum(data["enums"], base / "enum.py") + write_ins(data["encodings"], data["enums"], data["suffix_only_ops"], data["types"], arch, base / "ins.py") + write_operands(data["types"], data["enums"], arch, base / "operands.py") + print(f" {arch}: {len(data['encodings'])} encodings, {sum(len(v) for v in data['enums'].values())} instructions") + # Second pass: parse PDFs and write pcode + for arch, cfg in ARCHS.items(): + print(f"Parsing PDF: {arch}...") + pages = extract_pdf_text(cfg["pdf"]) + name_to_op = {name: op for ops in arch_data[arch]["enums"].values() for op, name in ops.items()} + pcode = extract_pcode(pages, name_to_op) + base = autogen_base / arch + write_pcode(pcode, arch_data[arch]["enums"], arch, base / "str_pcode.py") + print(f" {arch}: {len(pcode)} pcode entries") diff --git a/artifacts/package_runtime/tinygrad/renderer/amd/sqtt.py b/artifacts/package_runtime/tinygrad/renderer/amd/sqtt.py new file mode 100644 index 000000000..08f565b85 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/amd/sqtt.py @@ -0,0 +1,745 @@ +"""SQTT (SQ Thread Trace) packet encoder and decoder for AMD GPUs. + +This module provides encoding and decoding of raw SQTT byte streams. +The format is nibble-based with variable-width packets determined by a state machine. +Uses BitField infrastructure from dsl.py, similar to GPU instruction encoding. +""" +from __future__ import annotations +from dataclasses import dataclass +from typing import Iterator +from enum import Enum +from tinygrad.helpers import getenv, colored +from tinygrad.renderer.amd.dsl import BitField, FixedBitField, Inst, bits +from tinygrad.runtime.autogen.amd.rdna3.ins import s_endpgm # same encoding as RDNA4 + +# ═══════════════════════════════════════════════════════════════════════════════ +# FIELD ENUMS +# ═══════════════════════════════════════════════════════════════════════════════ + +class MemSrc(Enum): + LDS = 0 + LDS_ALT = 1 + VMEM = 2 + VMEM_ALT = 3 + +class AluSrc(Enum): + NONE = 0 + SALU = 1 + VALU = 2 + VALU_SALU = 3 + +# construct other SIMD instruction operation types, name becomes OTHER_{category}_{cycles} +def add_other_simd(cls:type[Enum], ranges:list[tuple[str, int, int, int]]) -> None: + for category, start, end, base_cycle in ranges: + for value in range(start, end + 1): + cls._value2member_map_[value] = obj = object.__new__(cls) + obj._value_ = value + obj._name_ = f"OTHER_{category}_{value - start + base_cycle}" + +class InstOp(Enum): + """SQTT instruction operation types for RDNA3 (gfx1100). + + Memory ops appear in two ranges depending on which SIMD executes them: + - 0x1x-0x2x range: ops on traced SIMD + - 0x5x range: ops on other SIMD (OTHER_ prefix) + + GLOBAL memory ops encoding depends on addressing mode AND size: + - Loads: 0x21 (saddr=SGPR) or 0x22 (saddr=NULL), all sizes same + - Stores: base + size_offset, where VADDR is shifted +1 from SADDR + SADDR: 0x24(32) 0x25(64) 0x26(96) 0x27(128) + VADDR: 0x25(32) 0x26(64) 0x27(96) 0x28(128) + + OTHER_ range follows same pattern but values overlap differently. + """ + SALU = 0x0 + SMEM_RD = 0x1 + JUMP = 0x3 # branch taken + JUMP_NO = 0x4 # branch not taken + CALL = 0x5 # s_call_b64 + MESSAGE = 0x9 + VALUT_4 = 0xb # transcendental: exp, log, rcp, sqrt, sin, cos + VALUB_2 = 0xd # 64-bit shifts: lshl, lshr, ashr + VALUB_4 = 0xe # 64-bit multiply-add + VALUB_16 = 0xf # 64-bit: add, mul, fma, rcp, sqrt, rounding, frexp, div helpers + VINTERP = 0x12 # interpolation: v_interp_p10_f32, v_interp_p2_f32 + BARRIER = 0x13 + + # FLAT memory ops on traced SIMD (0x1x range) + FLAT_RD_2 = 0x1c + FLAT_WR_3 = 0x1d + FLAT_WR_4 = 0x1e + FLAT_WR_5 = 0x1f + FLAT_WR_6 = 0x20 + + # GLOBAL memory ops on traced SIMD (0x2x range) + SGMEM_RD_1 = 0x21 # saddr=SGPR, all sizes + SGMEM_RD_2 = 0x22 # saddr=NULL, all sizes + SGMEM_WR_2 = 0x24 # saddr=SGPR, 32-bit + SGMEM_WR_3 = 0x25 # saddr=SGPR 64 or saddr=NULL 32 + SGMEM_WR_4 = 0x26 # saddr=SGPR 96 or saddr=NULL 64 + SGMEM_WR_5 = 0x27 # saddr=SGPR 128 or saddr=NULL 96 + SGMEM_WR_6 = 0x28 # saddr=NULL, 128-bit + + # LDS ops on traced SIMD + LDS_RD = 0x29 + LDS_WR_1 = 0x2a # ds_append, ds_consume, ds_store_addtid_b32 + LDS_WR_2 = 0x2b + LDS_WR_3 = 0x2c + LDS_WR_4 = 0x2d + LDS_WR_5 = 0x2e + + # EXEC-modifying ops (0x7x range) + SALU_WR_EXEC = 0x72 # s_*_saveexec_b32/b64 + VALU1_WR_EXEC = 0x73 # v_cmpx_* +# Memory ops on other SIMD (0x5x range) +add_other_simd(InstOp, [("LDS", 0x50, 0x54, 1), ("FLAT", 0x55, 0x59, 2), ("VMEM", 0x5a, 0x66, 1)]) + +class InstOpRDNA4(Enum): + """SQTT instruction operation types for RDNA4 (gfx1200). Different encoding from RDNA3.""" + SALU = 0x0 + SMEM = 0x1 + SMEM_WR = 0x2 + JUMP = 0x3 + JUMP_NO = 0x4 + CALL = 0x5 + SALU_NO_EXEC = 0x7 + MESSAGE = 0x9 + VALU_1 = 0xa + VALUT_4 = 0xb + VALUB_1 = 0xc + VALUB_2 = 0xd + VALUB_4 = 0xe + VALUB_16 = 0xf + VINTERP = 0x12 + BARRIER_WAIT = 0x13 + FLAT_RD_2 = 0x1c + FLAT_WR_3 = 0x1d + FLAT_WR_4 = 0x1e + FLAT_WR_5 = 0x1f + FLAT_WR_6 = 0x20 + VMEM_RD_1 = 0x21 + VMEM_RD_2 = 0x22 + VMEM_WR_1 = 0x23 + VMEM_WR_2 = 0x24 + VMEM_WR_3 = 0x25 + VMEM_WR_4 = 0x26 + VMEM_WR_5 = 0x27 + VMEM_WR_6 = 0x28 + LDS_RD = 0x29 + LDS_WR_1 = 0x2a + LDS_WR_2 = 0x2b + LDS_WR_3 = 0x2c + LDS_WR_4 = 0x2d + LDS_WR_5 = 0x2e + BUF_RD_1 = 0x2f + BUF_RD_2 = 0x30 + BUF_WR_1 = 0x31 + BUF_WR_2 = 0x32 + BUF_WR_3 = 0x33 + BUF_WR_4 = 0x34 + BUF_WR_5 = 0x35 + BUF_WR_6 = 0x36 + LDS_DIR_LOAD = 0x6e + LDS_PARAM_LOAD = 0x6f + SALU_WR_EXEC = 0x72 + VALU1_WR_EXEC = 0x73 + VALU_WR_EXEC_2 = 0x74 + OTHER_LDS_6 = 0x77 + OTHER_LDS_10 = 0x78 + BARRIER_SIGNAL = 0x7a + DYN_VGPR = 0x87 + BARRIER_JOIN = 0x8a + WMMA_8 = 0x8c + WMMA_16 = 0x8d + WMMA_32 = 0x8e + WMMA_64 = 0x8f + VALU_DPFP = 0x92 + SALU_FLOAT_3 = 0x98 + VALU_SCL_TRANS = 0x99 + SALU_2 = 0x9b + SALU_5 = 0x9c +add_other_simd(InstOpRDNA4, [("LDS", 0x50, 0x54, 1), ("FLAT", 0x55, 0x59, 2), ("VMEM", 0xbc, 0xdd, 1)]) + +class InstOpCDNA(Enum): + SMEM_RD = 0 + SALU_32 = 1 + VMEM_RD = 2 + VMEM_WR = 3 + FLAT_WR = 4 + VALU_32 = 5 + LDS = 6 + PC = 7 + JUMP = 12 + NEXT = 13 + FLAT_RD = 14 + OTHER_MSG = 15 + SMEM_WR = 16 + SALU_64 = 17 + VALU_64 = 18 + VALU_MAI = 28 + +# ═══════════════════════════════════════════════════════════════════════════════ +# PACKET TYPE BASE CLASS +# ═══════════════════════════════════════════════════════════════════════════════ + +class PacketType: + """Base class for SQTT packet types.""" + encoding: FixedBitField + _raw: int + _time: int + + def __init_subclass__(cls, **kwargs): + super().__init_subclass__(**kwargs) + cls._fields = {k: v for k, v in cls.__dict__.items() if isinstance(v, BitField)} # type: ignore[attr-defined] + cls._size_nibbles = ((max((f.hi for f in cls._fields.values()), default=0) + 4) // 4) # type: ignore[attr-defined] + + @classmethod + def from_raw(cls, raw: int, time: int = 0): + inst = object.__new__(cls) + inst._raw, inst._time = raw, time + return inst + + def __repr__(self) -> str: + fields_str = ", ".join(f"{k}={getattr(self, k)}" for k in self._fields if not k.startswith('_') and k != 'encoding') # type: ignore[attr-defined] + return f"{self.__class__.__name__}({fields_str})" + +# ═══════════════════════════════════════════════════════════════════════════════ +# TS PACKET TYPE DEFINITIONS +# ═══════════════════════════════════════════════════════════════════════════════ + +class TS_DELTA_S8_W3(PacketType): + encoding = bits[6:0] == 0b0100001 + delta = bits[10:8] + _padding = bits[71:11] + +class TS_DELTA_S5_W3(PacketType): + encoding = bits[4:0] == 0b00110 + delta = bits[7:5] + _padding = bits[51:8] + +class TS_DELTA_S5_W3_RDNA4(PacketType): # Layout 4: 52->56 bits + encoding = bits[4:0] == 0b00110 + delta = bits[9:7] + _padding = bits[55:10] + +class TS_DELTA_SHORT(PacketType): + encoding = bits[3:0] == 0b1000 + delta = bits[7:4] + +class TS_DELTA_OR_MARK(PacketType): + encoding = bits[6:0] == 0b0000001 + delta = bits[47:12] + pl = bits[8:8] + rt = bits[9:9] + @property + def is_marker(self) -> bool: return bool(self.rt and not self.pl) + +class TS_DELTA_OR_MARK_RDNA4(TS_DELTA_OR_MARK): + delta = bits[63:12] + rt = bits[7:7] + pl = bits[8:8] + tl = bits[9:9] + +class TS_DELTA_S5_W2(PacketType): + encoding = bits[4:0] == 0b11100 + delta = bits[6:5] + _padding = bits[47:7] + +class TS_DELTA_S5_W2_RDNA4(PacketType): # Layout 4: 48->40 bits + encoding = bits[4:0] == 0b11100 + delta = bits[6:5] + _padding = bits[39:7] + +# ═══════════════════════════════════════════════════════════════════════════════ +# PACKET TYPE DEFINITIONS +# ═══════════════════════════════════════════════════════════════════════════════ + +class VALUINST(PacketType): # exclude: 1 << 2 + encoding = bits[2:0] == 0b011 + delta = bits[5:3] + flag = bits[6:6] + wave = bits[11:7] + +class VMEMEXEC(PacketType): # exclude: 1 << 0 + encoding = bits[3:0] == 0b1111 + delta = bits[5:4] + src = bits[7:6].enum(MemSrc) + +class ALUEXEC(PacketType): # exclude: 1 << 1 + encoding = bits[3:0] == 0b1110 + delta = bits[5:4] + src = bits[7:6].enum(AluSrc) + +class IMMEDIATE(PacketType): # exclude: 1 << 5 + encoding = bits[3:0] == 0b1101 + delta = bits[6:4] + wave = bits[11:7] + +class IMMEDIATE_MASK(PacketType): # exclude: 1 << 5 + encoding = bits[4:0] == 0b00100 + delta = bits[7:5] + mask = bits[23:8] + +class WAVERDY(PacketType): # exclude: 1 << 3 + encoding = bits[4:0] == 0b10100 + delta = bits[7:5] + mask = bits[23:8] + +class WAVEEND(PacketType): # exclude: 1 << 4 + encoding = bits[4:0] == 0b10101 + delta = bits[7:5] + sa = bits[8:8] + simd = bits[10:9] + wgp = bits[13:11] + wave = bits[19:15] + @property + def cu(self) -> int: return self.wgp | (self.sa << 3) + +class WAVEEND_RDNA4(PacketType): + encoding = bits[4:0] == 0b10101 + delta = bits[7:5] + sa = bits[8:8] + simd = bits[10:9] + wgp = bits[14:11] + wave = bits[19:15] + @property + def cu(self) -> int: return self.wgp | (self.sa << 4) + +class WAVESTART(PacketType): # exclude: 1 << 4 + encoding = bits[4:0] == 0b01100 + delta = bits[6:5] + sa = bits[7:7] + simd = bits[9:8] + wgp = bits[12:10] + wave = bits[17:13] + id7 = bits[31:18] + @property + def cu(self) -> int: return self.wgp | (self.sa << 3) + +class WAVESTART_RDNA4(PacketType): # Layout 4: wgp is 4 bits, wave shifted to bits 15-19 + encoding = bits[4:0] == 0b01100 + delta = bits[6:5] + sa = bits[7:7] + simd = bits[9:8] + wgp = bits[13:10] + wave = bits[19:15] + id7 = bits[31:20] + @property + def cu(self) -> int: return self.wgp | (self.sa << 4) + +class WAVEALLOC(PacketType): # exclude: 1 << 10 + encoding = bits[4:0] == 0b00101 + delta = bits[7:5] + _padding = bits[19:8] + +class WAVEALLOC_RDNA4(PacketType): # Layout 4: 20->24 bits + encoding = bits[4:0] == 0b00101 + delta = bits[7:5] + _padding = bits[23:8] + +class PERF(PacketType): # exclude: 1 << 11 + encoding = bits[4:0] == 0b10110 + delta = bits[7:5] + arg = bits[27:8] + +class PERF_RDNA4(PacketType): # Layout 4: 28->32 bits + encoding = bits[4:0] == 0b10110 + delta = bits[9:7] + arg = bits[31:10] + +class NOP(PacketType): + encoding = bits[3:0] == 0b0000 + delta = None + _padding = bits[3:0] + +class TS_WAVE_STATE(PacketType): + encoding = bits[6:0] == 0b1010001 + delta = bits[15:7] + coarse = bits[23:16] + @property + def wave_interest(self) -> bool: return bool(self.coarse & 1) + @property + def terminate_all(self) -> bool: return bool(self.coarse & 8) + +class EVENT(PacketType): # exclude: 1 << 7 + encoding = bits[7:0] == 0b01100001 + delta = bits[10:8] + event = bits[23:11] + +class EVENT_BIG(PacketType): + encoding = bits[7:0] == 0b11100001 + delta = bits[10:8] + event = bits[31:11] + +class REG(PacketType): + encoding = bits[3:0] == 0b1001 + delta = bits[6:4] + slot = bits[9:7] + hi_byte = bits[15:8] + subop = bits[31:16] + val32 = bits[63:32] + @property + def is_config(self) -> bool: return bool(self.hi_byte & 0x80) + +class SNAPSHOT(PacketType): + encoding = bits[6:0] == 0b1110001 + delta = bits[9:7] + snap = bits[63:10] + +class LAYOUT_HEADER(PacketType): + encoding = bits[6:0] == 0b0010001 + delta = None + layout = bits[12:7] + simd = bits[14:13] + group = bits[17:15] + sel_a = bits[31:28] + sel_b = bits[36:33] + flag4 = bits[59:59] + _padding = bits[63:60] + +class INST(PacketType): + encoding = bits[2:0] == 0b010 + delta = bits[6:4] + flag1 = bits[3:3] + flag2 = bits[7:7] + wave = bits[12:8] + op = bits[19:13].enum(InstOp) + +class INST_RDNA4(PacketType): # Layout 4: different delta position and InstOp encoding + encoding = bits[2:0] == 0b010 + delta = bits[5:3] + w64h = bits[6:6] + wave = bits[11:7] + op = bits[19:12].enum(InstOpRDNA4) + +class UTILCTR(PacketType): + encoding = bits[6:0] == 0b0110001 + delta = bits[8:7] + ctr = bits[47:9] + +# Packet types with rocprof type IDs as keys +PACKET_TYPES_RDNA3: dict[int, type[PacketType]] = { + 1: VALUINST, 2: VMEMEXEC, 3: ALUEXEC, 4: IMMEDIATE, 5: IMMEDIATE_MASK, 6: WAVERDY, 7: TS_DELTA_S8_W3, 8: WAVEEND, + 9: WAVESTART, 10: TS_DELTA_S5_W2, 11: WAVEALLOC, 12: TS_DELTA_S5_W3, 13: PERF, 14: UTILCTR, 15: TS_DELTA_SHORT, + 16: NOP, 17: TS_WAVE_STATE, 18: EVENT, 19: EVENT_BIG, 20: REG, 21: SNAPSHOT, 22: TS_DELTA_OR_MARK, 23: LAYOUT_HEADER, 24: INST, +} +PACKET_TYPES_RDNA4: dict[int, type[PacketType]] = { + **PACKET_TYPES_RDNA3, + 8: WAVEEND_RDNA4, 9: WAVESTART_RDNA4, 10: TS_DELTA_S5_W2_RDNA4, 11: WAVEALLOC_RDNA4, + 12: TS_DELTA_S5_W3_RDNA4, 13: PERF_RDNA4, 22: TS_DELTA_OR_MARK_RDNA4, 24: INST_RDNA4, +} + +# ═══════════════════════════════════════════════════════════════════════════════ +# CDNA PACKET TYPE DEFINITIONS +# ═══════════════════════════════════════════════════════════════════════════════ + +class CDNA_MISC(PacketType): + """pkt_fmt=0: 16-bit (Misc)""" + encoding = bits[3:0] == 0 + delta = bits[11:4] + sh = bits[12:12] + misc_type = bits[15:13] + +class CDNA_TIMESTAMP(PacketType): + """pkt_fmt=1: 64-bit timestamp packet (case 0x0)""" + encoding = bits[3:0] == 1 + _reserved = bits[15:4] + timestamp = bits[63:16] # stored as (data_word >> 0x10) in low 46 bits of local_58 + +class CDNA_REG(PacketType): + """pkt_fmt=2: 64-bit (Reg)""" + encoding = bits[3:0] == 2 + pipe = bits[6:5] + _me_raw = bits[8:7] + _reserved = bits[15:9] + regaddr = bits[31:16] + regdata = bits[63:32] + +class CDNA_WAVESTART(PacketType): + """type 3: 32-bit wave start (Wave/group_id)""" + encoding = bits[3:0] == 3 + sh = bits[5:5] + cu = bits[9:6] + wave = bits[13:10] + simd = bits[15:14] + pipe = bits[17:16] + me = bits[19:18] + _reserved = bits[21:20] + count = bits[28:22] + _padding = bits[31:29] + +class CDNA_WAVEALLOC(PacketType): + """pkt_fmt=4: 16-bit (Wave)""" + encoding = bits[3:0] == 4 + sh = bits[5:5] + cu = bits[9:6] + wave = bits[13:10] + simd = bits[15:14] + +class CDNA_REG_CS(PacketType): + """type 5: 48-bit register CS write (RegCs)""" + encoding = bits[3:0] == 5 + pipe = bits[6:5] + _me_raw = bits[8:7] + regaddr = bits[15:9] + regdata = bits[47:16] + +class CDNA_WAVEEND(PacketType): + """type 6: 16-bit wave end (group_id)""" + encoding = bits[3:0] == 6 + sh = bits[5:5] + cu = bits[9:6] + wave = bits[13:10] + simd = bits[15:14] + +class CDNA_INST(PacketType): + """pkt_fmt=10: 16-bit (MsgInst)""" + encoding = bits[3:0] == 10 + wave = bits[8:5] + simd = bits[10:9] + op = bits[15:11].enum(InstOpCDNA) + +class CDNA_INST_PC(PacketType): + """pkt_fmt=11: 64-bit (MsgInstPc)""" + encoding = bits[3:0] == 11 + wave = bits[8:5] + simd = bits[10:9] + _reserved = bits[14:11] + err = bits[15:15] + pc = bits[63:16] + +class CDNA_ISSUE(PacketType): + """pkt_fmt=13: 32-bit (Issue)""" + encoding = bits[3:0] == 13 + simd = bits[6:5] + _gap = bits[7:7] + inst0 = bits[9:8] + inst1 = bits[11:10] + inst2 = bits[13:12] + inst3 = bits[15:14] + inst4 = bits[17:16] + inst5 = bits[19:18] + inst6 = bits[21:20] + inst7 = bits[23:22] + inst8 = bits[25:24] + inst9 = bits[27:26] + _padding = bits[31:28] + +class CDNA_PERF(PacketType): + """pkt_fmt=14: 64-bit (MsgPerf)""" + encoding = bits[3:0] == 14 + sh = bits[5:5] + cu = bits[9:6] + cntr_bank = bits[11:10] + cntr0 = bits[24:12] + cntr1 = bits[37:25] + cntr2 = bits[50:38] + cntr3 = bits[63:51] + +class CDNA_EVENT(PacketType): + """pkt_fmt=7: 16-bit""" + encoding = bits[3:0] == 7 + _reserved = bits[15:4] + +class CDNA_EVENT_CS(PacketType): + """pkt_fmt=8: 16-bit""" + encoding = bits[3:0] == 8 + _reserved = bits[15:4] + +class CDNA_EVENT_GFX1(PacketType): + """pkt_fmt=9: 16-bit""" + encoding = bits[3:0] == 9 + _reserved = bits[15:4] + +class CDNA_USERDATA(PacketType): + """pkt_fmt=12: 48-bit (UserData)""" + encoding = bits[3:0] == 12 + sh = bits[5:5] + cu = bits[9:6] + wave = bits[13:10] + simd = bits[15:14] + data = bits[47:16] + +class CDNA_REG_CS_PRIV(PacketType): + """pkt_fmt=15: 48-bit (RegCs)""" + encoding = bits[3:0] == 15 + pipe = bits[6:5] + _me_raw = bits[8:7] + regaddr = bits[15:9] + regdata = bits[47:16] + +PACKET_TYPES_CDNA: dict[int, type[PacketType]] = { + 0: CDNA_MISC, 1: CDNA_TIMESTAMP, 2: CDNA_REG, 3: CDNA_WAVESTART, 4: CDNA_WAVEALLOC, 5: CDNA_REG_CS, 6: CDNA_WAVEEND, + 7: CDNA_EVENT, 8: CDNA_EVENT_CS, 9: CDNA_EVENT_GFX1, 10: CDNA_INST, 11: CDNA_INST_PC, 12: CDNA_USERDATA, + 13: CDNA_ISSUE, 14: CDNA_PERF, 15: CDNA_REG_CS_PRIV, 16: LAYOUT_HEADER, +} + +# ═══════════════════════════════════════════════════════════════════════════════ +# DECODER +# ═══════════════════════════════════════════════════════════════════════════════ + +def _build_decode_tables(packet_types: dict[int, type[PacketType]]) -> tuple[dict[int, tuple], bytes]: + # Build state table: byte -> opcode. Sort by mask specificity (more bits first), NOP last + sorted_types = sorted(packet_types.items(), key=lambda x: (-bin(x[1].encoding.mask).count('1'), x[0] == 16)) + state_table = bytes(next((op for op, cls in sorted_types if (b & cls.encoding.mask) == cls.encoding.default), 16) for b in range(256)) + # Build decode info: opcode -> (pkt_cls, nib_count, delta_lo, delta_mask, special_case) + # special_case: 0=none, 1=TS_DELTA_OR_MARK (check is_marker), 2=TS_DELTA_SHORT (add 4), 3=CDNA_MISC (*4), 4=CDNA_TIMESTAMP (absolute) + _special = {TS_DELTA_OR_MARK: 1, TS_DELTA_OR_MARK_RDNA4: 1, TS_DELTA_SHORT: 2, CDNA_MISC: 3, CDNA_TIMESTAMP: 4} + decode_info = {} + for opcode, pkt_cls in packet_types.items(): + delta_field = getattr(pkt_cls, 'delta', None) + special = _special.get(pkt_cls, 0) + decode_info[opcode] = (pkt_cls, pkt_cls._size_nibbles, delta_field.lo if delta_field else 0, delta_field.mask if delta_field else 0, special) # type: ignore[attr-defined] + return decode_info, state_table + +_DECODE_INFO_RDNA3, _STATE_TABLE_RDNA3 = _build_decode_tables(PACKET_TYPES_RDNA3) +_DECODE_INFO_RDNA4, _STATE_TABLE_RDNA4 = _build_decode_tables(PACKET_TYPES_RDNA4) +_DECODE_INFO_CDNA, _STATE_TABLE_CDNA = _build_decode_tables(PACKET_TYPES_CDNA) + +def decode(data: bytes) -> Iterator[PacketType]: + """Decode raw SQTT blob, yielding packet instances. Auto-detects RDNA (layout 3/4) vs CDNA.""" + n, reg, pos, nib_off, nib_count, time, ts_offset = len(data), 0, 0, 0, 16, 0, None + decode_info, state_table = _DECODE_INFO_RDNA3, _STATE_TABLE_RDNA3 # start RDNA3, auto-detect switches if needed + + while pos + ((nib_count + nib_off + 1) >> 1) <= n: + need = nib_count - nib_off + # 1. if unaligned, read high nibble to align + if nib_off: reg, pos = (reg >> 4) | ((data[pos] >> 4) << 60), pos + 1 + # 2. read all full bytes at once + if (byte_count := need >> 1): + read_bytes = min(byte_count, 8) + chunk = int.from_bytes(data[pos:pos + read_bytes], 'little') + reg, pos = (reg >> (read_bytes * 8)) | (chunk << (64 - read_bytes * 8)), pos + byte_count + # 3. if odd, read low nibble + if (nib_off := need & 1): reg = (reg >> 4) | ((data[pos] & 0xF) << 60) + + opcode = state_table[reg & 0xFF] + pkt_cls, nib_count, delta_lo, delta_mask, special = decode_info[opcode] + delta = (reg >> delta_lo) & delta_mask + if special == 1: # TS_DELTA_OR_MARK + pkt = pkt_cls.from_raw(reg, 0) # create packet to check is_marker + if pkt.is_marker: delta = 0 + elif special == 2: delta += 4 # TS_DELTA_SHORT + elif special == 3: delta *= 4 # CDNA_DELTA + elif special == 4: # CDNA_TIMESTAMP (absolute timestamp anchoring) + if (reg >> 4) & 0xfff == 0: # unk_0 == 0 means absolute timestamp + abs_ts = reg >> 16 + if ts_offset is None: ts_offset = abs_ts - time + else: time = ((abs_ts - ts_offset) & ~3) - 4 + delta = 0 + time += delta + pkt = pkt_cls.from_raw(reg, time) + # auto-detect: first packet is always LAYOUT_HEADER (RDNA layout 3/4) or misdetected (CDNA) + if pkt_cls is LAYOUT_HEADER: + if pkt.layout == 4: decode_info, state_table = _DECODE_INFO_RDNA4, _STATE_TABLE_RDNA4 + elif pkt.layout != 3: # not a real LAYOUT_HEADER — switch to CDNA and re-decode first packet + decode_info, state_table = _DECODE_INFO_CDNA, _STATE_TABLE_CDNA + opcode = state_table[reg & 0xFF] + pkt_cls, nib_count, delta_lo, delta_mask, special = decode_info[opcode] + if special == 4 and (reg >> 4) & 0xfff == 0: # CDNA_TIMESTAMP absolute + ts_offset = (reg >> 16) - time + pkt = pkt_cls.from_raw(reg, time) + yield pkt + +# ═══════════════════════════════════════════════════════════════════════════════ +# MAPPER +# ═══════════════════════════════════════════════════════════════════════════════ + +@dataclass(frozen=True) +class InstructionInfo: + pc: int + wave: int + inst: Inst + +def map_insts(data:bytes, lib:bytes, target:str) -> Iterator[tuple[PacketType, InstructionInfo|None]]: + """maps SQTT packets to instructions, yields (packet, instruction_info or None)""" + # map pcs to insts + from tinygrad.viz.serve import amd_decode + pc_map = amd_decode(lib, target) + wave_pc:dict[int, int] = {} + # only processing packets on one [CU, SIMD] unit + def simd_select(p) -> bool: return getattr(p, "cu", 0) == 0 and getattr(p, "simd", 0) == 0 + for p in decode(data): + if not simd_select(p): continue + if isinstance(p, (WAVESTART, WAVESTART_RDNA4, CDNA_WAVESTART)): + assert p.wave not in wave_pc, "only one inflight wave per unit" + wave_pc[p.wave] = next(iter(pc_map)) + elif isinstance(p, (WAVEEND, WAVEEND_RDNA4)): + pc = wave_pc.pop(p.wave) + yield (p, InstructionInfo(pc, p.wave, s_endpgm())) + elif isinstance(p, IMMEDIATE_MASK): + # immediate mask may yield multiple times per packet + for wave in range(16): + if p.mask & (1 << wave): + inst = pc_map[pc:=wave_pc[wave]] + wave_pc[wave] += inst.size() + yield (p, InstructionInfo(pc, wave, inst)) + # map INST events on this SIMD to the program counter, we know the waves + elif isinstance(p, (VALUINST, INST, INST_RDNA4, IMMEDIATE)) and not (isinstance(p, (INST, INST_RDNA4)) and p.op.name.startswith("OTHER_")): + inst = pc_map[pc:=wave_pc[p.wave]] + # s_delay_alu, s_wait_alu and s_barrier_wait instructions are skipped + while (inst_op:=getattr(inst, 'op_name', '')) in {"S_DELAY_ALU", "S_WAIT_ALU", "S_BARRIER_WAIT"}: + wave_pc[p.wave] += inst.size() + inst = pc_map[pc:=wave_pc[p.wave]] + # assert branch always has a JUMP packet + if "BRANCH" in inst_op and not (isinstance(p, (INST, INST_RDNA4)) and p.op.name.startswith("JUMP")): + raise AssertionError(f"{inst_op} can only be followed by JUMP, got {p}") + # JUMP handling + if isinstance(p, (INST, INST_RDNA4)) and p.op in {InstOp.JUMP, InstOpRDNA4.JUMP}: + x = getattr(inst, 'simm16') & 0xffff + wave_pc[p.wave] += inst.size() + (x - 0x10000 if x & 0x8000 else x)*4 + else: + wave_pc[p.wave] += inst.size() + yield (p, InstructionInfo(pc, p.wave, inst)) + # for all other packets (VMEMEXEC, ALUEXEC, OTHER_ INST, etc.), yield with None + else: yield (p, None) + +# ═══════════════════════════════════════════════════════════════════════════════ +# PRINTER +# ═══════════════════════════════════════════════════════════════════════════════ + +PACKET_COLORS = { + "INST": "WHITE", "VALUINST": "BLACK", "VMEMEXEC": "yellow", "ALUEXEC": "yellow", + "IMMEDIATE": "YELLOW", "IMMEDIATE_MASK": "YELLOW", "WAVERDY": "cyan", "WAVEALLOC": "cyan", + "WAVEEND": "blue", "WAVESTART": "blue", "PERF": "magenta", "EVENT": "red", "EVENT_BIG": "red", + "REG": "green", "LAYOUT_HEADER": "white", "SNAPSHOT": "white", "UTILCTR": "green", +} + +def format_packet(p) -> str: + name = type(p).__name__ + if isinstance(p, (INST, INST_RDNA4)): + op_name = p.op.name if isinstance(p.op, (InstOp, InstOpRDNA4)) else f"0x{p.op:02x}" + fields = f"wave={p.wave} op={op_name}" + ((" flag1" if p.flag1 else "") + (" flag2" if p.flag2 else "") if isinstance(p, INST) else "") + elif isinstance(p, VALUINST): fields = f"wave={p.wave}" + (" flag" if p.flag else "") + elif isinstance(p, ALUEXEC): fields = f"src={p.src.name if isinstance(p.src, AluSrc) else p.src}" + elif isinstance(p, VMEMEXEC): fields = f"src={p.src.name if isinstance(p.src, MemSrc) else p.src}" + elif isinstance(p, (WAVESTART, WAVESTART_RDNA4, WAVEEND, WAVEEND_RDNA4)): fields = f"wave={p.wave} simd={p.simd} cu={p.cu}" + elif hasattr(p, '_fields'): + filt = {'delta', 'encoding'} if not isinstance(p, (TS_DELTA_OR_MARK, TS_DELTA_OR_MARK_RDNA4)) else {'encoding'} + fields = " ".join(f"{k}=0x{getattr(p, k):x}" if k in {'snap', 'val32'} else f"{k}={getattr(p, k)}" + for k in p._fields if not k.startswith('_') and k not in filt) + else: fields = "" + return f"{p._time:8}: {colored(f'{name:18}', PACKET_COLORS.get(name.replace('_RDNA4', ''), 'white'))} {fields}" + +def print_packets(packets) -> None: + skip = {"NOP", "TS_DELTA_SHORT", "TS_WAVE_STATE", "TS_DELTA_OR_MARK", + "TS_DELTA_S5_W2", "TS_DELTA_S5_W3", "TS_DELTA_S8_W3", "REG", "EVENT"} if not getenv("NOSKIP") else {"NOP"} + for data in packets: + p, inst = data if isinstance(data, tuple) else (data, None) + if type(p).__name__.replace("_RDNA4", "") not in skip: print(format_packet(p), f"inst={inst.inst}" if inst is not None else '') + +if __name__ == "__main__": + import sys, pickle + from tinygrad.helpers import temp + with open(temp("profile.pkl", append_user=True) if len(sys.argv) < 2 else sys.argv[1], "rb") as f: + data = pickle.load(f) + prg_events = {e.tag: e for e in data if type(e).__name__ == "ProfileProgramEvent" and e.tag is not None} + sqtt_events = [e for e in data if type(e).__name__ == "ProfileSQTTEvent"] + dev_targets = {e.device:f"gfx{e.props['gfx_target_version']//1000}" for e in data if type(e).__name__ == "ProfileDeviceEvent" and e.props} + evt_num = getenv("SQTT_EVENT", -1) + for i, event in enumerate(sqtt_events): + prg = prg_events.get(event.kern) + print(f"=== event {i} {prg.name if prg is not None else ''} ===") + if evt_num == -1 or i == evt_num: + print_packets(map_insts(event.blob, prg.lib, dev_targets[prg.device]) if prg is not None else decode(event.blob)) + print("\n") diff --git a/artifacts/package_runtime/tinygrad/renderer/cstyle.py b/artifacts/package_runtime/tinygrad/renderer/cstyle.py new file mode 100644 index 000000000..e25ab0c60 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/cstyle.py @@ -0,0 +1,604 @@ +from typing import Literal, Callable +import math, sys, struct +from collections import defaultdict, Counter +from tinygrad.codegen.opt import tc +from tinygrad.uop.ops import GroupOp, Ops, UOp, PatternMatcher, UPat, range_str, axis_letters +from tinygrad.helpers import strip_parens, getenv, prod, dedup, Target, NUM_CPU_THREADS, IMAGE, FLOAT16, is_image_shape +from tinygrad.dtype import dtypes, DType, AddrSpace, truncate, float_to_bf16 +from tinygrad.renderer import Renderer + + +base_rewrite = PatternMatcher([ + # local/reg buffers + (UPat(Ops.BUFFER, name="x"), lambda ctx,x: ctx.render_buffer(x)), + + # range/loop/if/endif + (UPat(Ops.RANGE, dtypes.void, name="x"), lambda ctx,x: "for (;;) {"), + (UPat(Ops.RANGE, name="x"), + lambda ctx,x: f"for ({ctx.render_dtype(x.dtype)} {ctx[x]} = 0; {ctx[x]} < {ctx[x.src[0]]}; {ctx[x]}++) {{"), + (UPat(Ops.END, src=(UPat(), UPat(Ops.RANGE), UPat(name="c", dtype=dtypes.bool))), lambda ctx,c: f" if (!({ctx[c]})) {{ break; }}\n}}"), + (UPat(Ops.IF, name="x"), lambda ctx,x: f"if ({ctx[x.src[0]]}) {{"), + (UPat((Ops.ENDIF, Ops.END)), lambda ctx: "}"), + + # casting + (UPat(Ops.CAST, name="x"), lambda ctx,x: f"__builtin_convertvector({ctx[x.src[0]]}, {ctx.render_type(x)})" \ + if x.max_numel() > 1 and x.addrspace is AddrSpace.REG else None), + (UPat(Ops.CAST, name="x"), lambda ctx,x: f"({ctx.render_cast(x, ctx[x.src[0]])})"), + (UPat(Ops.BITCAST, name="x"), lambda ctx,x: ctx[x.src[0]] if x.addrspace in (AddrSpace.GLOBAL, AddrSpace.LOCAL) else None), + (UPat(Ops.BITCAST, name="x"), lambda ctx,x: f"__builtin_bit_cast({ctx.render_type(x)}, ({ctx.render_type(x.src[0])})({ctx[x.src[0]]}))"), + + # GPU stuff + (UPat(Ops.BARRIER), lambda ctx: ctx.barrier), + (UPat(Ops.SPECIAL, name="x"), lambda ctx,x: f"{ctx.code_for_workitem[x.arg[0]](x.arg[-1])}; /* {(x.src[0]).render()} */"), + + # const + (UPat(Ops.CONST, arg=math.inf, name="x"), lambda ctx, x: f"({ctx.render_cast(x, ctx.infinity)})"), + (UPat(Ops.CONST, arg=-math.inf, name="x"), lambda ctx, x: f"({ctx.render_cast(x, f'-{ctx.infinity}')})"), + (UPat(Ops.CONST, dtype=dtypes.floats, name="x"), lambda ctx,x: f"({ctx.render_cast(x, ctx.nan)})" if math.isnan(x.val) else None), + (UPat(Ops.CONST, dtype=dtypes.float, name="x"), lambda ctx,x: f"{x.val}f"), + (UPat(Ops.CONST, dtype=dtypes.int64, name="x"), lambda ctx,x: f"{x.val}l"), + (UPat(Ops.CONST, dtype=dtypes.uint64, name="x"), lambda ctx,x: f"{truncate[x.dtype](x.val)}ul"), + (UPat(Ops.CONST, dtype=dtypes.uint32, name="x"), lambda ctx,x: f"{truncate[x.dtype](x.val)}u"), + (UPat(Ops.CONST, dtype=dtypes.bool, name="x"), lambda ctx,x: "1" if x.val else "0"), + # consts are rendered to larger type and casted + (UPat(Ops.CONST, (*dtypes.fp8s, dtypes.bfloat16, dtypes.half), name="x"), lambda ctx,x: f"({ctx.render_cast(x, f'{x.val}f')})"), + (UPat(Ops.CONST, (dtypes.uint8, dtypes.uint16), name="x"), lambda ctx,x: f"({ctx.render_cast(x, f'{x.val}u')})"), + (UPat(Ops.CONST, (dtypes.int8, dtypes.int16), name="x"), lambda ctx,x: f"({ctx.render_cast(x, str(x.val))})"), + # default const render + (UPat(Ops.CONST, name="x"), lambda ctx,x: str(x.val)), + + # SHRINK/INDEX + (UPat(Ops.INDEX, src=(UPat.var("buf"), UPat.var('idx')), name="x"), lambda ctx,**kwargs: ctx.render_index(**kwargs)), + (UPat(Ops.SHRINK, src=(UPat.var("buf"), UPat.var('idx'), UPat.cvar()), name="x"), lambda ctx,**kwargs: ctx.render_index(**kwargs)), + (UPat(Ops.STACK, name="x"), + lambda ctx,x: f"{ctx.float4.replace('float4', ctx.render_type(x))}" + \ + f"{ctx.float4_style[0]}{','.join([ctx[y] for y in x.src])}{ctx.float4_style[1]}"), + + # load/store + (UPat(Ops.LOAD, src=(UPat.var('bidx'),)), lambda ctx,bidx: f"({ctx.render_access(bidx)})"), + (UPat(Ops.LOAD, src=(UPat.var("bidx"), UPat.var("var"), UPat.var("gate"))), + lambda ctx,bidx,var,gate: f"({ctx[gate]}?{ctx.render_access(bidx)}:{ctx[var]})"), + (UPat(Ops.STORE, src=(UPat.var('bidx'), UPat.var("var"))), lambda ctx,bidx,var: f"{ctx.render_access(bidx)} = {ctx[var]};"), + + # alu/gep + (UPat(Ops.WMMA, name="x"), lambda ctx,x: f"__{_wmma_name(x)}({ctx[x.src[0]]}, {ctx[x.src[1]]}, {ctx[x.src[2]]})"), + (UPat(GroupOp.ALU, name="x"), lambda ctx,x: ctx.code_for_op[x.op]( + *([strip_parens(ctx[v]) if v.op == x.op and x.op in {Ops.ADD, Ops.MUL, Ops.XOR, Ops.OR, Ops.AND} else ctx[v] for v in x.src]), x.dtype)), + + # call an external function + (UPat(Ops.CALL, src=(UPat(),), allow_any_len=True, name="x"), lambda ctx,x: + f"((({ctx.abi}{ctx.render_dtype(x.dtype)}(*)({', '.join(ctx.render_type(y) for y in x.src[1:])}))({ctx[x.src[0]]}))" + + f"({', '.join(f'({ctx.render_type(y)})({ctx[y]})' for y in x.src[1:])}))" + (";" if x.dtype is dtypes.void else "")), + + # custom passes through with format + (UPat((Ops.CUSTOM, Ops.CUSTOMI), name="x"), lambda ctx,x: x.arg.format(*[ctx[y] for y in x.src])), +]) + +def create_non_native_float_pats(dts:tuple[DType, ...], casting:bool=True): + patterns = PatternMatcher([ + (UPat(Ops.WHERE, dtype=dts, src=(UPat.var("b"), UPat.var("x"), UPat.var("y")), name="w"), + lambda w,b,x,y: b.where(x.cast(dtypes.float), y.cast(dtypes.float)).cast(w.dtype)), + (UPat(GroupOp.ALU-{Ops.WHERE}, dtype=dts, name="x"), + lambda x: UOp(x.op, src=tuple(vv.cast(dtypes.float) for vv in x.src), arg=x.arg).cast(x.dtype)), + (UPat(GroupOp.ALU, dtypes.bool, name="alu", src=(UPat.var("x", dtype=dts), UPat.var("y", dtype=dts))), + lambda alu,x,y: UOp(alu.op, src=(x.cast(dtypes.float), y.cast(dtypes.float)), arg=alu.arg))]) + if casting: + # add float intermediate casting + patterns += PatternMatcher([ + (UPat(Ops.CAST, dts, (UPat.var("x"),), name="y"), lambda x,y: x.cast(dtypes.float).cast(y.dtype) if x.dtype!=dtypes.float else None), + (UPat(Ops.CAST, name="x", src=(UPat.var("y", dts),)), lambda x,y: y.cast(dtypes.float).cast(x.dtype) if x.dtype!=dtypes.float else None)]) + return patterns + +def cast_float_to_bf16(x: UOp) -> UOp: + assert x.dtype == dtypes.float, "cast float -> bf16 must start with float" + x = x.bitcast(dtypes.uint) + x = (-x & 0x7f800000).ne(0).where(x + ((x >> 16) & 1) + 0x7fff, (x & 0xffff).ne(0).where((x | 0x10000), x)) + return (x >> 16).cast(dtypes.ushort).bitcast(dtypes.bfloat16) + +# manual bfloat16 casting patterns (shared between LLVM, Clang, and AMD renderers to avoid compiler intrinsics) +pm_manual_bf16_cast = PatternMatcher([ + (UPat(Ops.CAST, dtypes.float, (UPat.var("x", dtypes.bfloat16),)), + lambda x: (x.bitcast(dtypes.ushort).cast(dtypes.uint)<<16).bitcast(dtypes.float)), + (UPat(Ops.CAST, dtype=dtypes.bfloat16, src=(UPat.var("x", dtype=dtypes.float),)), cast_float_to_bf16), +]) + +def uops_to_dtypes(uops:list[UOp]) -> list[tuple[DType, int]]: + return dedup((u.dtype, u.max_numel()) for u in uops if u.addrspace in (AddrSpace.ALU, None) and u.dtype != dtypes.void and u._shape is not None) + +def _wmma_name(u:UOp) -> str: + # sanitize spaces in DType.name (int8 = "signed char") + return f"WMMA_{'_'.join(map(str, u.arg[0]))}_{u.arg[1].name}_{u.dtype.scalar().name}".replace(" ", "_") + +# (name, dims, dtype_in, dtype_out, device, threads, upcast_sizes) +def wmma_args(uops:list[UOp]): + return dedup((_wmma_name(uop), uop.arg[0], uop.arg[1], uop.dtype.scalar(), *(uop.arg[2:4]), + tuple(uop.src[i].shape[-1] for i in range(3))) + for uop in uops if uop.op is Ops.WMMA) + +class CStyleLanguage(Renderer): + abi: str = "" + kernel_typedef: str = "void" + buffer_prefix: str = "" + buffer_suffix: str = "" + smem_align: str = "" + smem_prefix: str = "" + smem_prefix_for_cast: bool = True + var_prefix: str = "const " + var_suffix: str = "" + barrier: str = "" + code_for_workitem: dict[Literal["g", "l", "i"], Callable] = {} + extra_args: list[str] = [] + float4: str|None = None + float4_style: tuple[str, str] = ('(', ')') + gep_arr_threshold: int = 4 + type_map: dict[DType, str] = {} + infinity: str = "INFINITY" + nan: str = "NAN" + code_for_op: dict = { + Ops.SQRT: lambda x,dtype: f"sqrt({x})", Ops.RECIPROCAL: lambda x,dtype: f"(1/{x})", Ops.NEG: lambda x,dtype: f"-{x}", + Ops.EXP2: lambda x,dtype: f"exp2({x})", Ops.LOG2: lambda x,dtype: f"log2({x})", Ops.SIN: lambda x,dtype: f"sin({x})", + Ops.TRUNC: lambda x,dtype: f"trunc({x})", + Ops.AND: lambda a,b,dtype: f"({a}&{b})", Ops.XOR: lambda a,b,dtype: f"({a}^{b})", Ops.OR: lambda a,b,dtype: f"({a}|{b})", + Ops.ADD: lambda a,b,dtype: f"({a}+{b})", Ops.SUB: lambda a,b,dtype: f"({a}-{b})", Ops.MUL: lambda a,b,dtype: f"({a}*{b})", + Ops.CMOD: lambda a,b,dtype: f"({a}%{b})", Ops.CDIV: lambda a,b,dtype: f"({a}/{b})", Ops.CMPNE: lambda a,b,dtype: f"({a}!={b})", + Ops.SHR: lambda a,b,dtype: f"({a}>>{b})", Ops.SHL: lambda a,b,dtype: f"({a}<<{b})", Ops.CMPLT: lambda a,b,dtype: f"({a}<{b})", + Ops.WHERE: lambda a,b,c,dtype: f"({a}?{b}:{c})", Ops.CMPEQ: lambda a,b,dtype: f"({a}=={b})"} + + string_rewrite = base_rewrite + + def render_kernel(self, function_name:str, kernel:list[str], bufs:list[tuple[str,tuple[UOp,bool]]], uops:list[UOp], prefix=None) -> str: + tmp = "" + if any(is_image_shape(u._shape) for _,(u,_) in bufs): + tmp = "const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;\n" + buftypes = [(name, ("volatile " if u.arg.volatile else "")+(self.var_prefix if u.addrspace == AddrSpace.ALU else "")+ + self._render_dtype(u.dtype, sz=1, addrspace=u.addrspace, mutable=mutable, shape=u._shape)+ + (self.var_suffix if u.addrspace == AddrSpace.ALU else self.buffer_suffix)) for name,(u,mutable) in bufs] + local_dims = [u.src[0] for u in uops if u.op is Ops.SPECIAL and u.arg[0] == "l"] + launch_bounds = prod([d.vmax for d in local_dims]) + prg = ''.join([f"{self.kernel_typedef.format(launch_bounds=launch_bounds)} {function_name}(",] + + [', '.join([f'{t} {name}' for name,t in buftypes] + self.extra_args)] + + [") {\n" + tmp] + ['\n'.join(kernel), "\n}"]) + return prg if prefix is None else "\n".join(prefix)+f"\n{prg}" + + def render_index(self, x:UOp, buf:UOp, idx:UOp): + if buf.addrspace == AddrSpace.ALU: + # this is lane access in C + if idx.op is not Ops.CONST: return f"({self[buf]})[{self[idx]}]" + return self[buf]+(f"[{idx.val}]" if buf.max_numel() > self.gep_arr_threshold else f".{'xyzwabcd'[idx.val]}") + return f"({self[buf]}+{strip_parens(self[idx]) if idx.arg == Ops.ADD else self[idx]})" + + def render_buffer(self, x:UOp): + lanes = 1 + prefix = f"{self.smem_align}{self.smem_prefix}" if x.addrspace == AddrSpace.LOCAL else "" + suffix = f"[{x.max_numel()}]" + return f"{prefix}{self._render_dtype(x.dtype, sz=lanes)} {self[x]}{suffix};" + + def _render_dtype(self, dtype:DType, sz:int=1, addrspace=AddrSpace.ALU, mutable=True, override_ptr=False, shape=None): + if is_image_shape(shape): return f"{'write_only' if mutable else 'read_only'} image2d_t" + prefix, suffix = "", "" + if addrspace in (AddrSpace.LOCAL, AddrSpace.GLOBAL): + if addrspace == AddrSpace.LOCAL and self.smem_prefix_for_cast: prefix = self.smem_prefix + if addrspace == AddrSpace.GLOBAL: prefix = self.buffer_prefix + if addrspace in (AddrSpace.LOCAL, AddrSpace.GLOBAL) or override_ptr: + suffix = "*" + if sz > 1: + return prefix + self.type_map.get(scalar:=dtype.scalar(), scalar.name).replace(" ", "_") + str(sz) + suffix + return prefix + self.type_map.get(scalar:=dtype.scalar(), scalar.name) + suffix + + def render_type(self, u:UOp): return self._render_dtype(u.dtype, u.max_numel(), u.addrspace, shape=u._shape) + def render_access(self, u:UOp): + if u.max_numel() > 1 or u.dtype != u.src[0].dtype: + return f"*(({self._render_dtype(u.dtype, u.max_numel(), u.addrspace, override_ptr=True, shape=u._shape)})({self[u]}))" + else: return f"*{self[u]}" + def render_cast(self, u:UOp, val:str) -> str: return f"({self.render_type(u)})({val})" + + # LEGACY + def render_dtype(self, dt:DType, mutable=True) -> str: + return self._render_dtype(dt, 1, AddrSpace.REG) + + def __getitem__(self, key): return self.r[key] # hacky helper + def _render(self, uops:list[UOp]) -> tuple[str, list[str], list[tuple[str,tuple[UOp,bool]]]]: + r: dict[UOp, str] = {} + self.r = r + + child_count = Counter(v for ru in uops for v in ru.src) + # find which PARAMs are stored to with a single toposort + writable_params = {u for u in UOp.sink(*[u.src[0] for u in uops if u.op is Ops.STORE]).toposort(lambda u: u.op != Ops.END) if u.op is Ops.PARAM} + bufs: dict[UOp, tuple[str, tuple[UOp, bool]]] = {} + kernel = [] + depth = 1 + c: defaultdict[str, int] = defaultdict(int) + name = "test" + for u in uops: + if u.op in {Ops.NOOP, Ops.GROUP}: continue + if u.op == Ops.STACK and len(u.src) == 0: continue + if u.op is Ops.AFTER: + r[u] = r[u.src[0]] + continue + if u.op is Ops.SINK: + if u.arg is not None: name = u.arg.function_name + continue + if u.op is Ops.PARAM: + r[u] = f"data{u.arg.slot}_" + '_'.join([str(x) for x in u.shape]) + bufs[u] = (r[u], (u, u in writable_params)) + continue + + # naming + prefix = None + if u.op is Ops.SPECIAL: r[u] = u.arg + elif u.op is Ops.RANGE: r[u] = f"{axis_letters[u.arg[-1]]}idx"+range_str(u) + else: + prefix = {Ops.WMMA: "wmma", Ops.CONST: "const", Ops.BUFFER: "buf", Ops.CAST: "cast", Ops.BITCAST: "cast", Ops.STACK: "cast", + Ops.INDEX: "bidx", Ops.LOAD: "val"}.get(u.op, "alu") + r[u] = f"{prefix}{c[prefix]}" + + l: str|None = self.string_rewrite.rewrite(u, ctx=self) + assert l is not None, f"failed to render {u.op} {u.dtype} {[(x.op,x.dtype) for x in u.src]} {u.arg}" + + if u.op in {Ops.ENDIF, Ops.END}: depth -= 1 + if (u.op is not Ops.CAST or u.max_numel() == 1) and (u.op in {Ops.CONST, Ops.INDEX, Ops.SHRINK, Ops.CUSTOMI} or \ + (u.op is Ops.LOAD and u.src[0].addrspace == AddrSpace.REG and child_count[u] == 1) or \ + (u.op is Ops.CAST and u.addrspace in (AddrSpace.GLOBAL, AddrSpace.LOCAL)) or \ + (u.op in {Ops.STACK, *(GroupOp.ALU-{Ops.WHERE}), Ops.CAST, Ops.BITCAST} and child_count[u] == 1 and not getenv("EXPAND_SSA"))): + r[u] = l + else: + if u.op not in {Ops.RANGE, Ops.STORE, Ops.BUFFER} and u.dtype != dtypes.void: + l = f"{self.render_type(u)} {r[u]} = {l}" + (";" if u.op is not Ops.SPECIAL else "") + kernel.append("\n".join(" "*depth + line for line in l.split("\n"))) + if prefix: c[prefix] += 1 # if it was used, increment + if u.op in {Ops.IF, Ops.RANGE}: depth += 1 + del self.r + + # NOTE: this relies on bufs dict preserving order + return (name, kernel, list(bufs.values())) + def render(self, uops:list[UOp]) -> str: return self.render_kernel(*self._render(uops), uops) + +class ClangRenderer(CStyleLanguage): + float4 = "(float4)" + float4_style = ('{', '}') + gep_arr_threshold = 0 + has_local = False + has_threads = bool(getenv("THREADS", 1)) + global_max = (NUM_CPU_THREADS.value, 0, 0) + infinity = "__builtin_inff()" + nan = '__builtin_nanf("")' + + # language options + buffer_suffix = " restrict" + type_map = {dtypes.bool:"_Bool", dtypes.half:"__fp16"} + code_for_op = {**({k:v for k,v in CStyleLanguage.code_for_op.items() if k not in [Ops.EXP2, Ops.SIN, Ops.LOG2, Ops.TRUNC, Ops.RECIPROCAL]}), + Ops.SQRT: lambda x,dtype: f"__builtin_sqrt({x})" if dtype == dtypes.float64 else f"__builtin_sqrtf({x})", + Ops.TRUNC: lambda x,dtype: f"__builtin_trunc({x})" if dtype == dtypes.float64 else f"__builtin_truncf({x})", + Ops.FDIV: lambda a,b,dtype: f"({a}/{b})"} + + # LLVM legalizes double => half/bf16 cast on systems that don't support it natively (like x86 cpus without AVX512-FP16) into a compiler-rt libcall. + # there is also no native bfl16 <-> fp16 conversion on those CPUs + extra_matcher = PatternMatcher([(UPat.var("x", dtypes.float64).cast(dtypes.float16), lambda x: x.cast(dtypes.float32).cast(dtypes.float16)), + (UPat.var("x", dtypes.float64).cast(dtypes.bfloat16), lambda x: x.cast(dtypes.float32).cast(dtypes.bfloat16)), + (UPat.var("x", dtypes.bfloat16).cast(dtypes.float16), lambda x: x.cast(dtypes.float32).cast(dtypes.float16))]) \ + + create_non_native_float_pats((dtypes.bfloat16,)) + pm_manual_bf16_cast + + if sys.platform == 'win32': + abi = "__attribute__((ms_abi)) " + kernel_typedef = abi + "void" + def render_vector_prefix(self, dt:DType, count:int) -> str: + # round (down) to power of two (this is actually the default clang behavior) + alignment = 2**int(math.log2(dt.itemsize * count)) if getenv("ALIGNED", 1) and not dtypes.is_bool(dt) else 1 + vec = self._render_dtype(dt, count, AddrSpace.REG) + return f"typedef {self.render_dtype(dt)} {vec} __attribute__((aligned({alignment}),ext_vector_type({count})));" + + def _render_defines(self, uops) -> list[str]: return [self.render_vector_prefix(dt, count) for dt, count in uops_to_dtypes(uops) if count > 1] + def _render_body(self, function_name, kernel, bufs, uops, pref=None) -> str: return super().render_kernel(function_name, kernel, bufs, uops, pref) + def _render_entry(self, function_name:str, bufs:list[tuple[str,tuple[UOp,bool]]]) -> str: return "" + + def render_kernel(self, function_name, kernel, bufs, uops, prefix=None) -> str: + defines = '\n'.join(self._render_defines(uops)) + return defines + "\n" + self._render_body(function_name, kernel, bufs, uops, prefix) + "\n" + self._render_entry(function_name, bufs) + + def supported_dtypes(self): + return {d for d in super().supported_dtypes() if (d != dtypes.bfloat16 or self.target.arch.startswith(("x86", "arm"))) and d not in dtypes.fp8s} + + def __init__(self, target:Target): + super().__init__(target) + from tinygrad.runtime.support.compiler_cpu import ClangCompiler + self.compiler = ClangCompiler(target.arch.split(",")) + +class OpenCLRenderer(CStyleLanguage): + # language options + kernel_typedef = "__kernel void" + buffer_prefix = "__global " + smem_align = "__attribute__ ((aligned (16))) " + smem_prefix = "__local " + barrier = "barrier(CLK_LOCAL_MEM_FENCE);" + float4 = "(float4)" + code_for_workitem = {"g": lambda x: f"get_group_id({x})", "l": lambda x: f"get_local_id({x})", "i": lambda x: f"get_global_id({x})"} + type_map = { dtypes.int8: "char", dtypes.uint8: "uchar", dtypes.uint32: "uint", dtypes.uint16: "ushort", dtypes.uint64: "ulong", + dtypes.bfloat16: "ushort" } + extra_matcher = create_non_native_float_pats((dtypes.bfloat16,)) + pm_manual_bf16_cast + + string_rewrite = PatternMatcher([ + (UPat(Ops.BITCAST, name="x"), lambda ctx,x: f"as_{ctx.render_dtype(x.dtype)}(({ctx.render_dtype(x.src[0].dtype)})({ctx[x.src[0]]}))"), + # bfloat16 constants need to be rendered as their bit pattern since bf16 is stored as ushort + (UPat(Ops.CONST, dtypes.bfloat16, name="x"), + lambda ctx,x: f"{(struct.unpack('I', struct.pack('f', float_to_bf16(x.val)))[0] >> 16)}u"), + # load/store image (OpenCL) + (UPat.var('buf').index(UPat.var('idx_y'), UPat.var('idx_x')), lambda ctx,buf,idx_y,idx_x: f"IMAGE<{ctx[buf]}, {ctx[idx_y]}, {ctx[idx_x]}>"), + (UPat(Ops.LOAD, dtype=dtypes.float, src=(UPat.var('buf').index(UPat.var('idx_y'), UPat.var('idx_x')), UPat.var("var"), UPat.var("gate"))), + lambda ctx,buf,idx_y,idx_x,var,gate: f"({ctx[gate]}?read_imagef({ctx[buf]}, smp, (int2)({ctx[idx_x]},{ctx[idx_y]})):{ctx[var]})"), + (UPat(Ops.LOAD, dtype=dtypes.float, src=(UPat.var('buf').index(UPat.var('idx_y'), UPat.var('idx_x')),)), + lambda ctx,buf,idx_y,idx_x: f"read_imagef({ctx[buf]}, smp, (int2)({ctx[idx_x]},{ctx[idx_y]}))"), + (UPat(Ops.STORE, src=(UPat.var('buf').index(UPat.var('idx_y'), UPat.var('idx_x')), UPat.var("var", dtypes.float))), + lambda ctx,buf,idx_y,idx_x,var: f"write_imagef({ctx[buf]}, (int2)({ctx[idx_x]},{ctx[idx_y]}), {ctx[var]});"), + ]) + base_rewrite + + def render_kernel(self, function_name, kernel, bufs, uops, prefix=None) -> str: + if any(uop.dtype == dtypes.half for uop in uops): prefix = (["#pragma OPENCL EXTENSION cl_khr_fp16 : enable"] + (prefix or [])) + return super().render_kernel(function_name, kernel, bufs, uops, prefix) + + def supported_dtypes(self): return {d for d in super().supported_dtypes() + if (d != dtypes.half or "cl_khr_fp16" in self.target.arch) and + (d != dtypes.double or "cl_khr_fp64" in self.target.arch) and d not in dtypes.fp8s} + +class MetalRenderer(CStyleLanguage): + def __init__(self, target:Target): + super().__init__(target) + from tinygrad.runtime.ops_metal import MetalCompiler + self.compiler, self.tensor_cores = MetalCompiler(), tc.metal if target.arch.startswith("Apple") and int(target.arch[5:]) >= 7 else [] + + # language options + kernel_typedef = "kernel void" + buffer_prefix = "device " + smem_prefix = "threadgroup __attribute__((aligned(16))) " + var_prefix = "constant " + var_suffix = "&" + barrier = "threadgroup_barrier(mem_flags::mem_threadgroup);" + float4 = "float4" + code_for_workitem = {"g": lambda x: f"gid.{chr(120+int(x))}", "l": lambda x: f"lid.{chr(120+int(x))}"} + # uint3 used for gid/lid - TODO: this should probably be `ushort3 lid [[thread_position_in_threadgroup]]` + extra_args = ['uint3 gid [[threadgroup_position_in_grid]]', 'uint3 lid [[thread_position_in_threadgroup]]'] + type_map = {dtypes.uint32: "uint", dtypes.bfloat16: "bfloat"} + + # precise::sin + code_for_op = {**CStyleLanguage.code_for_op, Ops.SIN: lambda x,dtype: f"precise::sin({x})"} + + # upcast to float32 all the ops that don't support bfloat16 + extra_matcher = PatternMatcher([ + # NOTE: this is copied from PTX + (UPat((Ops.SQRT, Ops.EXP2, Ops.LOG2, Ops.SIN), dtype=dtypes.bfloat16, name="x"), + lambda x: (UOp(x.op, src=tuple(vv.cast(dtypes.float) for vv in x.src), arg=x.arg).cast(dtypes.bfloat16))), + ]) + pm_manual_bf16_cast + + string_rewrite = PatternMatcher([ + (UPat(Ops.BITCAST, name="x"), lambda ctx,x: f"as_type<{ctx.render_dtype(x.dtype)}>(({ctx.render_dtype(x.src[0].dtype)})({ctx[x.src[0]]}))"), + ]) + base_rewrite + + def render_kernel(self, function_name, kernel, bufs, uops, prefix=None): + prefix = ["#include ","using namespace metal;"] + deduped_wmma_args = dedup([(name, dtype_in, dtype_out) for name, _, dtype_in, dtype_out, _, _, _ in wmma_args(uops)]) + for name, dtype_in, dtype_out in deduped_wmma_args: + dstr_out, dstr_in = self._render_dtype(dtype_out, 2, AddrSpace.REG), self._render_dtype(dtype_in, 2, AddrSpace.REG) + prefix.append( +f"""{dstr_out} __{name}({dstr_in} a, {dstr_in} b, {dstr_out} c){{ + simdgroup_{self.render_dtype(dtype_in)}8x8 mat_a, mat_b; simdgroup_{self.render_dtype(dtype_out)}8x8 mat_c; + mat_a.thread_elements()[0] = a[0]; mat_b.thread_elements()[0] = b[0]; mat_c.thread_elements()[0] = c[0]; + mat_a.thread_elements()[1] = a[1]; mat_b.thread_elements()[1] = b[1]; mat_c.thread_elements()[1] = c[1]; + simdgroup_multiply_accumulate(mat_c, mat_a, mat_b, mat_c);\n return {dstr_out}(mat_c.thread_elements()[0], mat_c.thread_elements()[1]);\n}}""") + return super().render_kernel(function_name, kernel, bufs, uops, prefix) + + def supported_dtypes(self): + return {d for d in super().supported_dtypes() if (d != dtypes.bfloat16 or ((arch:=self.target.arch).startswith("Apple") and int(arch[5:]) >= 6)) + and d not in dtypes.fp8s+(dtypes.double,)} + +_nms = list("xyzwabcdefghijkl") + [f'v{i}' for i in range(16, 32)] + +class CUDARenderer(CStyleLanguage): + global_max = (2147483647, 65535, 65535) + local_max = (1024, 1024, 64) + shared_max = 49152 + + def __init__(self, target:Target, use_nvcc=False): + super().__init__(target) + from tinygrad.runtime.support.compiler_cuda import NVRTCCompiler, NVCCCompiler + iface, dev, arch = target.interface, target.device, target.arch + self.compiler = (NVCCCompiler if use_nvcc else NVRTCCompiler)(arch, ptx=iface.startswith("MOCK") or dev == "CUDA", cache_key=dev.lower()) + self.tensor_cores = tc.get_cuda(arch) + + # language options + # https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html + kernel_typedef = "extern \"C\" __global__ void __launch_bounds__({launch_bounds})" + smem_prefix = "__shared__ __align__(16) " + smem_prefix_for_cast = False + barrier = "__syncthreads();" + float4 = "make_float4" + gep_arr_threshold = 8 + code_for_workitem = {"g": lambda x: f"blockIdx.{chr(120+int(x))}", "l": lambda x: f"threadIdx.{chr(120+int(x))}", + "i": lambda x: f"(blockIdx.{chr(120+int(x))}*blockDim.{chr(120+int(x))}+threadIdx.{chr(120+int(x))})"} + code_for_op = { **CStyleLanguage.code_for_op, + Ops.TRUNC: lambda x,dtype: f"htrunc({x})" if dtype in (dtypes.half, dtypes.bfloat16) else f"trunc({x})", + Ops.SIN: lambda x,dtype: f"hsin({x})" if dtype in (dtypes.half, dtypes.bfloat16) else f"sin({x})", + Ops.LOG2: lambda x,dtype: f"hlog2({x})" if dtype in (dtypes.half, dtypes.bfloat16) else f"log2({x})", + Ops.EXP2: lambda x,dtype: f"hexp2({x})" if dtype in (dtypes.half, dtypes.bfloat16) else f"exp2({x})", + Ops.SQRT: lambda x,dtype: f"hsqrt({x})" if dtype in (dtypes.half, dtypes.bfloat16) else f"sqrt({x})", + Ops.RECIPROCAL: lambda x,dtype: f"hrcp({x})" if dtype in (dtypes.half, dtypes.bfloat16) else f"(1/{x})" } + type_map = {dtypes.uint32: "uint", dtypes.bfloat16: "nv_bfloat16", dtypes.fp8e4m3: "__nv_fp8_e4m3", dtypes.fp8e5m2: "__nv_fp8_e5m2"} + extra_matcher = create_non_native_float_pats(dtypes.fp8s, casting=False) + PatternMatcher([ + (UPat(Ops.CAST, dtypes.fp8s, UPat.var("x", dtypes.fp8s), name='y'), lambda x,y: x.cast(dtypes.float).cast(y.dtype) if x.dtype!=y.dtype else None), + ]) + string_rewrite = PatternMatcher([ + (UPat(Ops.BITCAST, name="x"), lambda ctx,x: f"tg_bitcast<{ctx.render_dtype(x.dtype)}>(({ctx.render_dtype(x.src[0].dtype)})({ctx[x.src[0]]}))"), + ]) + base_rewrite + + def render_vector_prefix(self, dt:DType, count:int) -> str: + vec, scal = self._render_dtype(dt, count, AddrSpace.REG), self.render_dtype(dt) + elems, header = ', '.join(_nms[:count]), ', '.join([f"{scal} {x}" for x in _nms[:count]]) + return f"struct __align__({dt.itemsize * count}) {vec} {{ {scal} {elems}; }}; " \ + f"__device__ {vec} make_{vec}({header}) {{ {vec} r={{{elems}}}; return r; }}" + + def render_kernel(self, function_name, kernel, bufs, uops, prefix=None): + # TODO: why is dtypes.bfloat16.name == "__bf16"? would be easier not override dtypes.name + prefix = ["typedef unsigned int uint;", "#define INFINITY (__int_as_float(0x7f800000))", "#define NAN (__int_as_float(0x7fffffff))", + "template __device__ __forceinline__ T tg_bitcast(F v) { union U { F f; T t; }; U u; u.f = v; return u.t; }"] + used_dtypes = uops_to_dtypes(uops) + if any(dt in dtypes.fp8s for dt, _ in used_dtypes): prefix.append("#include ") + if any(dt == dtypes.half for dt, _ in used_dtypes): prefix.append("#include ") + if any(dt == dtypes.bfloat16 for dt, _ in used_dtypes): prefix.append("#include ") + prefix += [self.render_vector_prefix(dt, count) for dt, count in used_dtypes if (count in (4,8) and dt in {dtypes.half, dtypes.bfloat16}) + or (count in (2,4,8,16) and dt in dtypes.fp8s)] + dt_map_in = { dtypes.float: "tf32", dtypes.half: "f16", dtypes.bfloat16: "bf16", dtypes.fp8e4m3: "e4m3", dtypes.fp8e5m2: "e5m2" } + dt_map_out = { dtypes.float: "f32", dtypes.half: "f16" } + for name, (N, M, K), dtype_in, dtype_out, _, _, upcast_sizes in wmma_args(uops): + wmma_dtypes = [self._render_dtype(dtype, size, AddrSpace.REG) for dtype, size in zip([dtype_in, dtype_in, dtype_out], upcast_sizes)] + n_operands = [size*dtype.itemsize//4 for dtype, size in zip([dtype_in, dtype_in, dtype_out], upcast_sizes)] # 4 => CUDA reg size in bytes + operands = [f"%{i}" for i in range(sum(n_operands))] + + # mma operands => {c}, {a}, {b}, {c} + prefix.append(f"""__device__ {wmma_dtypes[2]} __{name}({wmma_dtypes[0]} a, {wmma_dtypes[1]} b, {wmma_dtypes[2]} c){{ + int *a_pk = (int *)(&a), *b_pk = (int *)(&b), *c_pk = (int *)(&c); + asm("mma.sync.aligned.m{M}n{N}k{K}.row.col.{dt_map_out[dtype_out]}.{dt_map_in[dtype_in]}.{dt_map_in[dtype_in]}.{dt_map_out[dtype_out]}" + "{{{", ".join(operands[:n_operands[2]])}}}, {{{", ".join(operands[n_operands[2]:n_operands[2]+n_operands[0]])}}}," + "{{{", ".join(operands[-n_operands[1]:])}}}, {{{", ".join(operands[:n_operands[2]])}}};" + : {", ".join([f'"+r"(c_pk[{i}])' for i in range(n_operands[2])])} + : {", ".join([f'"r"(a_pk[{i}])' for i in range(n_operands[0])])}, {", ".join([f'"r"(b_pk[{i}])' for i in range(n_operands[1])])}); + return c;\n}}""") + + return super().render_kernel(function_name, kernel, bufs, uops, prefix=prefix) + + def supported_dtypes(self): + ver = int(self.target.arch[3:]) + return {d for d in super().supported_dtypes() if (d != dtypes.half or ver >= 53) and (d != dtypes.bfloat16 or ver >= 80) + and (d not in dtypes.fp8_ocp or ver >= 89) and d not in dtypes.fp8_fnuz} + +class NVCCRenderer(CUDARenderer): + def __init__(self, target:Target): super().__init__(target, use_nvcc=True) + +def fp8_index(dtype: DType): return (dtypes.fp8e4m3, dtypes.fp8e5m2).index(dtype.scalar()) +def _ocml(op): return lambda x,dtype: f"__ocml_{op}_f{ {dtypes.half:16, dtypes.double:64}.get(dtype, 32)}({x})" + +class HIPRenderer(CStyleLanguage): + shared_max = 65536 + # NOTE: this is only really needed on gfx12, even though gfx11 reports the same limitation + global_max = (2147483647, 65535, 65535) + global_prod_max = (0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF) + + @staticmethod + def is_cdna(arch): return arch.split(":")[0] in {"gfx942", "gfx950"} + @staticmethod + def is_cdna4(arch): return arch.split(":")[0] == "gfx950" + def __init__(self, target:Target, use_hipcc=False): # gfx942 => MI300, gfx1100 => RX 7900, gfx1201 => RX 9700 + super().__init__(target) + from tinygrad.runtime.support.compiler_amd import HIPCompiler, HIPCCCompiler + self.compiler, self.tensor_cores = (HIPCCCompiler if use_hipcc else HIPCompiler)(target.arch), tc.get_amd(target.arch) + if not self.is_cdna4(target.arch): self.extra_matcher += pm_manual_bf16_cast + if self.is_cdna(target.arch): + self.string_rewrite = PatternMatcher([ + (UPat(Ops.WMMA, name="x"), lambda ctx,x: f"__{_wmma_name(x)}({ctx[x.src[0]]}, {ctx[x.src[1]]}, {ctx[x.src[2]]}," + f" {fp8_index(x.src[0].dtype)}, {fp8_index(x.src[0].dtype)}, 0, 0, 0, 0)" if x.arg[0][2] == 128 else None), + (UPat(Ops.WMMA, name="x"), lambda ctx,x: f"__{_wmma_name(x)}({ctx[x.src[0]]}, {ctx[x.src[1]]}, {ctx[x.src[2]]}, 0, 0, 0)"), + (UPat(Ops.CONST, dtypes.fp8s, name="x"), lambda ctx,x: f"f32_to_fp8({ctx.nan}, {fp8_index(x.dtype)})" if math.isnan(x.val) else None), + (UPat(Ops.CONST, dtypes.fp8s, arg=math.inf, name="x"), lambda ctx,x: f"f32_to_fp8({ctx.infinity}, {fp8_index(x.dtype)})"), + (UPat(Ops.CONST, dtypes.fp8s, arg=-math.inf, name="x"), lambda ctx,x: f"f32_to_fp8(-{ctx.infinity}, {fp8_index(x.dtype)})"), + (UPat(Ops.CONST, dtypes.fp8s, name="x"), lambda ctx,x: f"f32_to_fp8({x.val}f, {fp8_index(x.dtype)})"), + (UPat(Ops.CAST, dtypes.fp8s, (UPat(dtype=dtypes.float),), name="x",), + lambda ctx,x: f"f32_to_fp8({ctx[x.src[0]]}, {fp8_index(x.dtype)})"), + (UPat(Ops.CAST, dtypes.float, (UPat.var("y", dtypes.fp8s),), name="x",), + lambda ctx,x,y: f"__builtin_amdgcn_cvt_f32_{('fp8', 'bf8')[fp8_index(y.dtype)]}((unsigned int){ctx[x.src[0]]}, 0)"), + ]) + base_rewrite + + # https://clang.llvm.org/docs/AttributeReference.html#amdgpu-flat-work-group-size + # NOTE: this makes hlb_cifar10 twice as fast, there may be more gains in tweaking these parameters + kernel_typedef = 'extern "C" __attribute__((global)) void __attribute__((amdgpu_flat_work_group_size(1, {launch_bounds})))' + code_for_workitem = {"g": lambda x: f"__ockl_get_group_id({x})", "l": lambda x: f"__ockl_get_local_id({x})", + "i": lambda x: f"(__ockl_get_group_id({x})*__ockl_get_local_size({x})+__ockl_get_local_id({x}))"} + code_for_op = {**CStyleLanguage.code_for_op, Ops.TRUNC: _ocml("trunc"), Ops.SIN: _ocml("sin"), + Ops.LOG2: _ocml("log2"), Ops.EXP2: _ocml("exp2"), Ops.SQRT: _ocml("sqrt")} + smem_prefix = "__attribute__((shared, aligned(16)))" + smem_prefix_for_cast: bool = False + barrier = '__builtin_amdgcn_fence(__ATOMIC_RELEASE, "workgroup");' + '__builtin_amdgcn_s_barrier();' + \ + '__builtin_amdgcn_fence(__ATOMIC_ACQUIRE, "workgroup");' + float4 = "make_float4" + type_map = {dtypes.bfloat16: "hip_bfloat16", dtypes.fp8e4m3: "hip_fp8", dtypes.fp8e5m2: "hip_bf8"} + extra_matcher = create_non_native_float_pats((dtypes.bfloat16, *dtypes.fp8s)) + PatternMatcher([ + (UPat(Ops.WMMA, name="x", dtype=dtypes.float), + lambda x: x.replace(src=(x.src[0].bitcast(dtypes.uint64), x.src[1].bitcast(dtypes.uint64), x.src[2])) + if x.src[0].max_numel() == 8 and x.src[0].dtype in dtypes.fp8_ocp else None), + # bfloat16 constant casting + (UPat.cvar('x', dtypes.bfloat16), lambda x: cast_float_to_bf16(UOp.const(x.val, dtypes.float))), + ]) + + def asm(self, prg:UOp, lin:UOp) -> bytes: + from tinygrad.renderer.amd.elf import assemble_linear + return assemble_linear(prg, lin, self.target.arch) + + def render_vector_prefix(self, dtype:DType, count:int) -> str: + vec, scal = self._render_dtype(dtype, count, AddrSpace.REG), self.render_dtype(dtype) + return f"typedef {scal} {vec} __attribute__((ext_vector_type({count})));\nstatic inline __attribute__((device)) "+ \ + f"{vec} make_{vec}({', '.join([f'{scal} {x}' for x in _nms[:count]])}) {{ return {{ {', '.join(_nms[:count])} }}; }}" + + def render_kernel(self, function_name, kernel, bufs, uops, prefix=None) -> str: + prefix, ockl = [], [] + type_map = { dtypes.bfloat16: "bf16", dtypes.float: "f32", dtypes.half: "f16", dtypes.fp8e4m3: "_fp8_fp8", dtypes.fp8e5m2: "_bf8_bf8" } + used_dtypes = uops_to_dtypes(uops) + if any(u.op is Ops.CONST and not math.isfinite(u.val) for u in uops): + prefix += ["#define INFINITY (__builtin_inff())", "#define NAN (__builtin_nanf(\"\"))"] + if any(u.op is Ops.SPECIAL for u in uops): + prefix.append("typedef long unsigned int size_t;") + ockl = [(f"__ockl_get_{name}", "unsigned int", "size_t", "const") for name in ["local_id", "group_id", "local_size"]] + ocml_ops = {Ops.EXP2: ("exp2", "pure"), Ops.LOG2: ("log2", "pure"), Ops.SQRT: ("sqrt", "const"), Ops.SIN: ("sin", ""), Ops.TRUNC: ("trunc", "")} + ocml = [(f"__ocml_{ocml_ops[op][0]}_f{dt.bitsize}", dt.name, dt.name, ocml_ops[op][1]) + for op, dt in dedup((u.op, u.dtype.scalar()) for u in uops) if op in ocml_ops and dt in (dtypes.half, dtypes.float, dtypes.double)] + if any(dt == dtypes.bfloat16 for dt, _ in used_dtypes): + prefix.append(f"typedef {'__bf16' if self.is_cdna4(self.target.arch) else 'unsigned short'} hip_bfloat16;") + if any(dt == dtypes.half for dt, _ in used_dtypes): prefix.append("#define half _Float16") + if any(dt in dtypes.fp8s for dt, _ in used_dtypes): + prefix += ["typedef unsigned char hip_bf8;", "typedef unsigned char hip_fp8;"] + if any((u.op is Ops.CAST and u.dtype in dtypes.fp8s and u.src[0].dtype == dtypes.float) or + (u.op is Ops.CONST and u.dtype in dtypes.fp8s) for u in uops): + prefix.append("""static inline __attribute__((device)) unsigned char f32_to_fp8(float v, int is_bf8) { + v = (((*(unsigned*)&v)&0x7F800000)!=0x7F800000)?__builtin_amdgcn_fmed3f(v,is_bf8?57344.0f:448.0f,is_bf8?-57344.0f:-448.0f) : v; + return (unsigned char)(is_bf8?__builtin_amdgcn_cvt_pk_bf8_f32(v,v,0,false):__builtin_amdgcn_cvt_pk_fp8_f32(v,v,0,false));\n}""") + prefix += [f'extern "C" __attribute__((device{f", {atr}" if atr else ""})) {dto} {meth}({dti});' for meth,dti,dto,atr in ockl+ocml] + prefix += [self.render_vector_prefix(dt, count) for dt, count in used_dtypes if count > 1] + + for name, (N, M, K), dtype_in, dtype_out, _, _, _ in wmma_args(uops): # TODO: handle TCs f32_bf16 and bf16_bf16 w/ wrapper + if self.is_cdna(self.target.arch): + if (N, M, K) == (16, 16, 16): type_map[dtypes.bfloat16] = 'bf16_1k' + elif (N, M, K) == (16, 16, 32): type_map = {**type_map, dtypes.bfloat16: "_bf16", dtypes.half: "_f16"} + elif (N, M, K) == (16, 16, 128): type_map = {**type_map, dtypes.fp8e4m3: "_f8f6f4", dtypes.fp8e5m2: "_f8f6f4"} + prefix.append(f"#define __{name} __builtin_amdgcn_mfma_{'scale_' if K == 128 else ''}f32_{N}x{M}x{K}{type_map[dtype_in]}") + # #define __WMMA_16_16_16_half_half __builtin_amdgcn_wmma_f16_16x16x16_f16_w32_gfx12 + elif self.tensor_cores == tc.amd_rdna4: + prefix.append(f"#define __{name} __builtin_amdgcn_wmma_{type_map[dtype_out]}_16x16x16_{type_map[dtype_in]}_w32_gfx12") + elif dtype_out == dtypes.int32: + prefix.append("typedef int wmma_int4 __attribute__((ext_vector_type(4)));\n"+ + f"static inline __attribute__((device)) int8 __{name}"+"""(signed_char16 a, signed_char16 b, int8 c) { + return __builtin_amdgcn_wmma_i32_16x16x16_iu8_w32(true, __builtin_bit_cast(wmma_int4, a), + true, __builtin_bit_cast(wmma_int4, b), c, false);\n}""") + elif dtype_out == dtypes.float: + prefix.append(f"#define __{name} __builtin_amdgcn_wmma_f32_16x16x16_{'f16' if dtype_in == dtypes.half else 'bf16'}_w32") + else: prefix.append(f"static inline __attribute__((device)) half8 __{name}"+"""(half16 a, half16 b, half8 c) { + half16 c_frag = {}; half8 d; for (int n = 0; n < 8; n++) { c_frag[n*2] = c[n]; } + c_frag = __builtin_amdgcn_wmma_f16_16x16x16_f16_w32(a, b, c_frag, false); + for (int n = 0; n < 8; n++) { d[n] = c_frag[n*2]; } return d;\n}""") + return super().render_kernel(function_name, kernel, bufs, uops, prefix) + + def supported_dtypes(self): return {d for d in super().supported_dtypes() + if (d not in dtypes.fp8_ocp or self.target.arch == "gfx950") and d not in dtypes.fp8_fnuz} + +class HIPCCRenderer(HIPRenderer): + def __init__(self, target:Target): super().__init__(target, use_hipcc=True) + +class QCOMCLRenderer(OpenCLRenderer): + def __init__(self, target:Target): + super().__init__(target) + from tinygrad.runtime.support.compiler_qcom import QCOMCompiler + self.compiler = QCOMCompiler(target.arch) + + # QCOM compiler is flaky with half + def supported_dtypes(self): + return {d for d in Renderer.supported_dtypes(self) + if (d != dtypes.float16 or (bool(IMAGE) and bool(FLOAT16))) and d not in dtypes.fp8s+(dtypes.bfloat16,dtypes.double)} + + # QCOM's load vectorizer emits invalid IR for vectorized bool loads ("Range types must match load type"), type bool buffers as uchar + def _render_dtype(self, dtype:DType, sz:int=1, addrspace=AddrSpace.ALU, mutable=True, override_ptr=False, shape=None): + if dtype == dtypes.bool and addrspace == AddrSpace.GLOBAL: dtype = dtypes.uint8 + return super()._render_dtype(dtype, sz, addrspace, mutable, override_ptr, shape) diff --git a/artifacts/package_runtime/tinygrad/renderer/isa/__init__.py b/artifacts/package_runtime/tinygrad/renderer/isa/__init__.py new file mode 100644 index 000000000..fb74f1569 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/isa/__init__.py @@ -0,0 +1,50 @@ +from __future__ import annotations +import itertools +from dataclasses import dataclass, field +from tinygrad.renderer import Renderer +from tinygrad.uop.ops import PatternMatcher, UOp, Ops, consumer_map_from_toposort + +@dataclass(frozen=True) +class Register: + name: str + index: int + _cons: tuple[Register, ...] = field(default_factory=tuple) + size: int = 8 + @property + def cons(self): return self._cons or (self,) + def __repr__(self): return self.name + +class IselContext: + def __init__(self, sink:UOp): + self.uses = consumer_map_from_toposort(sink.toposort()) + self.reg_n = itertools.count() + def arg_key(u:UOp): + if u.op is Ops.SPECIAL: return (2, u.arg) + return (0, u.arg.slot) if u.arg.addrspace is not None else (1, u.expr) + self.func_args = sorted([u for u in self.uses if u.op in {Ops.PARAM, Ops.SPECIAL}], key=arg_key) + + def vreg(self, cons:tuple[Register, ...]|Register): + return Register(f"v{next(self.reg_n)}", 0, _cons=cons if isinstance(cons, tuple) else (cons,)) + +def greg(u:UOp): + if u.op in {Ops.NOOP, Ops.AFTER} and u.src: return greg(u.src[0]) + if isinstance(u.tag, tuple): return u.tag[0] + return u.tag + +@dataclass +class PreRegAllocContext: + lock: UOp|None = None + clobbered: set[UOp] = field(default_factory=set) + +class ISARenderer(Renderer): + pre_isel_matcher: PatternMatcher + isel_matcher: PatternMatcher + pre_regalloc_matcher: PatternMatcher|None = None + post_regalloc_matcher: PatternMatcher + + def is_two_address(self, x:UOp) -> bool: return False + def stack_pointer(self) -> UOp: raise NotImplementedError("arch specific") + def copy(self, x:UOp, reg:Register) -> UOp: raise NotImplementedError("arch specific") + def spill(self, disp:UOp, x:UOp) -> UOp: raise NotImplementedError("arch specific") + def fill(self, disp:UOp, x:UOp, reg:Register) -> UOp: raise NotImplementedError("arch specific") + def asm_str(self, uops:list[UOp], function_name:str) -> str: raise NotImplementedError("arch specific") diff --git a/artifacts/package_runtime/tinygrad/renderer/isa/x86.py b/artifacts/package_runtime/tinygrad/renderer/isa/x86.py new file mode 100644 index 000000000..1346a0267 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/isa/x86.py @@ -0,0 +1,881 @@ +# flake8: noqa: E702 +# allow semicolons to put multiple ops on one line +import sys, struct, functools +from typing import cast +from tinygrad.dtype import dtypes, DType, truncate, AddrSpace +from tinygrad.uop import FastEnum, auto, Ops, GroupOp +from tinygrad.uop.ops import UOp, UPat, PatternMatcher +from tinygrad.renderer.isa import ISARenderer, IselContext, Register, PreRegAllocContext, greg +from tinygrad.helpers import getenv, NUM_CPU_THREADS, unwrap, Target + +# ***** X86 Ops ***** + +class X86Ops(FastEnum): + # NOTE: X86Ops with i suffix are variants that take an immediate, m suffix are variants that can write to memory instead of read from + # these aren't real instructions, DEFINE is a register placeholder that defines a register without emitting an instruction + FRAME_INDEX = auto(); LABEL = auto(); DEFINE = auto(); LOOP_CMP = auto() + # index + LEA = auto() + # register / memory / immediate moves + MOV = auto(); MOVm = auto(); MOVi = auto(); MOVABS = auto() + VMOVSS = auto(); VMOVSD = auto(); VMOVUPS = auto() + VMOVSSm = auto(); VMOVSDm = auto(); VMOVUPSm = auto() + # casts + MOVZX = auto(); MOVSX = auto(); MOVSXD = auto() + VPMOVZXBW = auto(); VPMOVZXBD = auto(); VPMOVZXBQ = auto() + VPMOVZXWD = auto(); VPMOVZXWQ = auto(); VPMOVZXDQ = auto() + VPMOVSXBW = auto(); VPMOVSXBD = auto(); VPMOVSXBQ = auto() + VPMOVSXWD = auto(); VPMOVSXWQ = auto(); VPMOVSXDQ = auto() + VCVTDQ2PS = auto(); VCVTDQ2PD = auto(); VCVTTPS2DQ = auto(); VCVTTPD2DQ = auto() + VCVTPH2PS = auto(); VCVTPS2PH = auto(); VCVTPS2PD = auto(); VCVTPD2PS = auto() + VCVTSS2SD = auto(); VCVTSD2SS = auto(); VCVTSI2SS = auto(); VCVTSI2SD = auto() + VCVTTSS2SI = auto(); VCVTTSD2SI = auto() + # bitcasts + VMOVD = auto(); VMOVQ = auto(); VMOVDm = auto(); VMOVQm = auto() + # comparisons + VUCOMISS = auto(); VUCOMISD = auto() + VCMPSS = auto(); VCMPSD = auto(); VCMPPS = auto(); VCMPPD = auto() + VPCMPGTB = auto(); VPCMPGTW = auto(); VPCMPGTD = auto(); VPCMPGTQ = auto() + VPCMPEQB = auto(); VPCMPEQW = auto(); VPCMPEQD = auto(); VPCMPEQQ = auto() + SETNE = auto(); SETE = auto(); SETL = auto(); SETB = auto() + # where + CMOVNE = auto(); CMOVE = auto(); CMOVL = auto(); CMOVB = auto() + VPBLENDVB = auto(); VBLENDVPS = auto(); VBLENDVPD = auto() + # jumps + JNE = auto(); JE = auto(); JL = auto(); JB = auto(); JGE = auto(); JMP = auto() + # vectorize / gep + VINSERTPS = auto(); VPSRLDQ = auto() + VPEXTRB = auto(); VPEXTRW = auto(); VPEXTRD = auto(); VPEXTRQ = auto() + VPINSRB = auto(); VPINSRW = auto(); VPINSRD = auto(); VPINSRQ = auto() + # int binary + IDIV = auto(); DIV = auto() + ADD = auto(); ADDi = auto(); SUB = auto(); SUBi = auto(); IMUL = auto(); IMULi = auto() + AND = auto(); ANDi = auto(); XOR = auto(); XORi = auto(); OR = auto(); ORi = auto() + SHL = auto(); SHLi = auto(); SHR = auto(); SHRi = auto(); SAR = auto(); SARi = auto(); CMP = auto(); CMPi = auto() + # float unary (sometimes not unary) + VROUNDSS = auto(); VROUNDSD = auto(); VROUNDPS = auto(); VROUNDPD = auto() + VSQRTSS = auto(); VSQRTSD = auto(); VSQRTPS = auto(); VSQRTPD = auto() + # float scalar / vector binary + VADDSS = auto(); VADDSD = auto(); VADDPS = auto(); VADDPD = auto() + VSUBSS = auto(); VSUBSD = auto(); VSUBPS = auto(); VSUBPD = auto() + VMULSS = auto(); VMULSD = auto(); VMULPS = auto(); VMULPD = auto() + VDIVSS = auto(); VDIVSD = auto(); VDIVPS = auto(); VDIVPD = auto() + # int vector binary + VPADDB = auto(); VPADDW = auto(); VPADDD = auto(); VPADDQ = auto() + VPSUBB = auto(); VPSUBW = auto(); VPSUBD = auto(); VPSUBQ = auto() + VPMULLW = auto(); VPMULLD = auto() + # packed bitwise + VPAND = auto(); VPOR = auto(); VPXOR = auto() + # packed variable shifts + VPSLLVD = auto(); VPSLLVQ = auto(); VPSRLVD = auto(); VPSRLVQ = auto(); VPSRAVD = auto() + # return + RET = auto() + +class X86GroupOp: + # X86Ops whose first src is also the destination + TwoAddress = {X86Ops.ADD, X86Ops.ADDi, X86Ops.AND, X86Ops.ANDi, X86Ops.XOR, X86Ops.XORi, X86Ops.OR, X86Ops.ORi, X86Ops.IMUL, + X86Ops.SUB, X86Ops.SUBi, X86Ops.SHL, X86Ops.SHLi, X86Ops.SHR, X86Ops.SHRi, X86Ops.SAR, X86Ops.SARi, + X86Ops.IDIV, X86Ops.DIV, X86Ops.CMOVNE, X86Ops.CMOVE, X86Ops.CMOVL, X86Ops.CMOVB} + + # X86Ops whose first src can read from memory + ReadMem1st = {X86Ops.MOV, X86Ops.VMOVSS, X86Ops.VMOVSD, X86Ops.VMOVUPS, X86Ops.MOVZX, X86Ops.MOVSX, X86Ops.MOVSXD, X86Ops.VMOVD, X86Ops.VMOVQ, + X86Ops.VPMOVZXBW, X86Ops.VPMOVZXBD, X86Ops.VPMOVZXBQ, X86Ops.VPMOVZXWD, X86Ops.VPMOVZXWQ, X86Ops.VPMOVZXDQ, + X86Ops.VPMOVSXBW, X86Ops.VPMOVSXBD, X86Ops.VPMOVSXBQ, X86Ops.VPMOVSXWD, X86Ops.VPMOVSXWQ, X86Ops.VPMOVSXDQ, + X86Ops.VCVTDQ2PS, X86Ops.VCVTDQ2PD, X86Ops.VCVTTPS2DQ, X86Ops.VCVTTPD2DQ, X86Ops.VCVTTSS2SI, X86Ops.VCVTTSD2SI, + X86Ops.VCVTPH2PS, X86Ops.VCVTPS2PD, X86Ops.VCVTPD2PS, X86Ops.VROUNDPS, X86Ops.VROUNDPD, X86Ops.VSQRTPS, X86Ops.VSQRTPD, + X86Ops.CMPi, X86Ops.IMULi, X86Ops.LEA} + + # X86Ops whose second src can read from memory NOTE: some of these are TwoAddress so the second src is actually the first + ReadMem2nd = {X86Ops.ADD, X86Ops.SUB, X86Ops.AND, X86Ops.OR, X86Ops.XOR, X86Ops.IMUL, X86Ops.CMP, + X86Ops.VADDSS, X86Ops.VADDSD, X86Ops.VADDPS, X86Ops.VADDPD, X86Ops.VSUBSS, X86Ops.VSUBSD, X86Ops.VSUBPS, X86Ops.VSUBPD, + X86Ops.VMULSS, X86Ops.VMULSD, X86Ops.VMULPS, X86Ops.VMULPD, X86Ops.VDIVSS, X86Ops.VDIVSD, X86Ops.VDIVPS, X86Ops.VDIVPD, + X86Ops.VPADDB, X86Ops.VPADDW, X86Ops.VPADDD, X86Ops.VPADDQ, X86Ops.VPSUBB, X86Ops.VPSUBW, X86Ops.VPSUBD, X86Ops.VPSUBQ, + X86Ops.VPCMPEQB, X86Ops.VPCMPEQW, X86Ops.VPCMPEQD, X86Ops.VPCMPEQQ, X86Ops.VPBLENDVB, X86Ops.VBLENDVPS, X86Ops.VBLENDVPD, + X86Ops.VPCMPGTB, X86Ops.VPCMPGTW, X86Ops.VPCMPGTD, X86Ops.VPCMPGTQ, X86Ops.VCMPSS, X86Ops.VCMPSD, X86Ops.VCMPPS, X86Ops.VCMPPD, + X86Ops.VPMULLW, X86Ops.VPMULLD, X86Ops.VROUNDSS, X86Ops.VROUNDSD, X86Ops.VSQRTSS, X86Ops.VSQRTSD, X86Ops.VINSERTPS, + X86Ops.VPINSRB, X86Ops.VPINSRW, X86Ops.VPINSRD, X86Ops.VPINSRQ, X86Ops.VPAND, X86Ops.VPOR, X86Ops.VPXOR, X86Ops.VPSLLVD, + X86Ops.VPSLLVQ, X86Ops.VPSRLVD, X86Ops.VPSRLVQ, X86Ops.VPSRAVD, X86Ops.CMOVNE, X86Ops.CMOVE, X86Ops.CMOVL, X86Ops.CMOVB, + X86Ops.VCVTSI2SS, X86Ops.VCVTSI2SD, X86Ops.VCVTSS2SD, X86Ops.VCVTSD2SS, X86Ops.VUCOMISS, X86Ops.VUCOMISD, X86Ops.IDIV, X86Ops.DIV} + + # X86Ops that can write to memory + WriteMem = {X86Ops.MOVm, X86Ops.MOVi, X86Ops.VMOVSSm, X86Ops.VMOVSDm, X86Ops.VMOVUPSm, X86Ops.VMOVDm, X86Ops.VMOVQm, + X86Ops.ADDi, X86Ops.SUBi, X86Ops.ANDi, X86Ops.ORi, X86Ops.XORi, X86Ops.SHL, X86Ops.SHLi, X86Ops.SHR, X86Ops.SHRi, X86Ops.SAR, + X86Ops.SARi, X86Ops.SETNE, X86Ops.SETE, X86Ops.SETL, X86Ops.SETB, + X86Ops.VCVTPS2PH, X86Ops.VPEXTRB, X86Ops.VPEXTRW, X86Ops.VPEXTRD, X86Ops.VPEXTRQ} + + # X86Ops that read flags + ReadFlags = {X86Ops.CMOVB, X86Ops.CMOVL, X86Ops.CMOVE, X86Ops.CMOVNE, X86Ops.SETB, X86Ops.SETL, X86Ops.SETE, X86Ops.SETNE, X86Ops.JB, X86Ops.JL, + X86Ops.JE, X86Ops.JNE, X86Ops.JGE} + + # X86Ops that write flags or can modify flags to undefined values + WriteFlags = {X86Ops.CMP, X86Ops.CMPi, X86Ops.ADD, X86Ops.ADDi, X86Ops.SUB, X86Ops.SUBi, X86Ops.IMUL, X86Ops.IMULi, X86Ops.IDIV, X86Ops.DIV, + X86Ops.SHL, X86Ops.SHLi, X86Ops.SHR, X86Ops.SHRi, X86Ops.SAR, X86Ops.SARi, X86Ops.AND, X86Ops.ANDi, X86Ops.XOR, X86Ops.XORi, + X86Ops.OR, X86Ops.ORi, X86Ops.VUCOMISS, X86Ops.VUCOMISD} + + # X86Ops whose first src is the rm field + Rm1st = ReadMem1st | (ReadMem2nd & TwoAddress) | {X86Ops.VPSRLDQ} + + # X86Ops whose second src is the rm field + Rm2nd = ReadMem2nd + + All = set(X86Ops) + +# ***** X86 legalization ***** + +extra_matcher = PatternMatcher([ + # bool CMPNE is XOR, bool CMPEQ is XOR+XOR, bool CMPLT is XOR+AND + (UPat.var('x', dtypes.bool).ne(UPat.var('y')), lambda x,y: x^y), + (UPat.var('x', dtypes.bool).alu(Ops.CMPEQ, UPat.var('y')), lambda x,y: (x^y)^True), + (UPat.var('x', dtypes.bool)> 1).cast(dtypes.int64).cast(x.dtype) * 2 + (y & 1).cast(dtypes.int64).cast(x.dtype)), + # no int8 mul or cmove, cast to int16 + (UPat.var("a", dtypes.int8s) * UPat.var("b"), lambda a,b: (a.cast(dtypes.int16) * b.cast(dtypes.int16)).cast(a.dtype)), + (UPat.var("m").where(UPat.var("a", (dtypes.bool,)+dtypes.int8s), UPat.var("b")), + lambda m,a,b: m.where(a.cast(dtypes.int16), b.cast(dtypes.int16)).cast(a.dtype) if a.max_numel() == 1 else None), + # float16 alus are done in float32 + (UPat(GroupOp.ALU, dtypes.float16, name="x"), lambda x: UOp(x.op, dtypes.float, + tuple(s.cast(dtypes.float) if s.dtype != dtypes.bool else s for s in x.src)).cast(x.dtype)), + (UPat(GroupOp.Comparison, src=(UPat.var("a", dtypes.float16), UPat.var("b")), name="x"), + lambda x,a,b: UOp(x.op, src=(a.cast(dtypes.float32), b.cast(dtypes.float32))).cast(x.dtype)), + # no cmpne for packed ints, y != x => !(y==x) + (UPat(Ops.CMPNE, src=(UPat.var("y", dtypes.ints), UPat.var("x")), name="cmp"), + lambda y,x,cmp: UOp(Ops.CMPEQ, src=(y,x))^True if y.max_numel() > 1 else None), + # float where expects a mask + (UPat.var("m", dtypes.bool).where(UPat.var("a", dtypes.floats), UPat.var("b")), + lambda m,a,b: m.cast(a.dtype).ne(0).where(a, b) if m.src[0].dtype not in dtypes.floats else None), + # rewrite -x -> 0 - x + (UPat(Ops.NEG, name="x"), lambda x: UOp(Ops.SUB, src=(x.const_like(0),) + x.src)), + # TODO: add support for mod, requires support for accessing the 2nd+ reg of a multi output instruction + (UPat(Ops.CMOD, src=(UPat.var("x"), UPat.var("y"))), lambda x,y: x - y * x.alu(Ops.CDIV, y)), +]) + +# ***** X86 pre instruction selection ***** + +def scratch_buffer(elem_dt:DType, count:int, slot:int) -> UOp: + return UOp.placeholder((count,), elem_dt, slot, AddrSpace.LOCAL) + +def gated_load(ctx, addr:UOp, alt:UOp, gate:UOp, x:UOp): + local = scratch_buffer(addr.src[0].dtype.scalar(), x.max_numel(), next(ctx)) + local_idx = local.index(UOp.const(0, dtypes.int32), dtype=dtypes.uint64) + # the selected address is a 64bit value, the AFTER orders the load after the scratch store and carries the element dtype for the encoder + sel = gate.where(addr.replace(dtype=dtypes.uint64), local_idx) + ptr = UOp(Ops.AFTER, addr.dtype, (sel, (local_idx if x.max_numel() == 1 else local).store(alt))) + return ptr.load(dtype=x.dtype) + +def gated_store(addr:UOp, gate:UOp, val:UOp): + local = scratch_buffer(addr.src[0].dtype.scalar(), val.max_numel(), -1) + sel = gate.where(addr.replace(dtype=dtypes.uint64), local.index(UOp.const(0, dtypes.int32), dtype=dtypes.uint64)) + return UOp(Ops.AFTER, addr.dtype, (sel,)).store(val) + +# legalize the new style graph for isel. NOTE: this runs after the spec is verified, some of these rewrites violate it +pre_isel_matcher = PatternMatcher([ + # noop casts: zero extending scalar 32bit int, same-width signed/unsigned, narrowing scalar int + (UPat.var("y", dtypes.uint32).cast(dtypes.int64s, name="x"), lambda y,x: x.replace(op=Ops.NOOP, arg=None) if y.max_numel() == 1 else None), + (UPat.var("y", dtypes.ints+(dtypes.bool,)).cast(dtypes.ints, name="x"), + lambda y,x: x.replace(op=Ops.NOOP, arg=None) if x.dtype.itemsize == y.dtype.itemsize and y.max_numel() == 1 else None), + (UPat.var("y", dtypes.ints).cast(dtypes.ints, name="x"), + lambda y,x: x.replace(op=Ops.NOOP, arg=None) if x.dtype.itemsize < y.dtype.itemsize and y.max_numel() == 1 else None), + # bitcasts between scalar floats and ints are real, rest are noops + (UPat.var("y").bitcast().named("x"), lambda y,x: None if y.dtype in dtypes.floats and x.dtype in dtypes.ints or \ + y.dtype in dtypes.ints and x.dtype in dtypes.floats else x.replace(op=Ops.NOOP, arg=None)), + # gated load/store become a conditional move on the address, the load/store are unconditional + (UPat((Ops.INDEX, Ops.SHRINK), name="addr").load(UPat.var("alt"), UPat.var("gate"), name="x"), gated_load), + (UPat((Ops.INDEX, Ops.SHRINK), name="addr").store(UPat.var("val"), UPat.var("gate")), gated_store), + # TODO: remove this once we allow all flag producing ops in cmove + # if gate in scalar int cmove is not a comparison need to add one to set the flag + # NOTE: the 0 is int so the bool gate zero-extends and compares as int (a byte compare renders different kernels) + (UPat.var("m", dtypes.bool).where(UPat.var("a"), UPat.var("b")), + lambda m,a,b: m.ne(UOp.const(0, dtypes.int)).where(a,b) if m.op not in GroupOp.Comparison else None), +]) + +# ***** X86 registers ***** + +RAX = Register("rax", 0) +RCX = Register("rcx", 1) +RDX = Register("rdx", 2) +RBX = Register("rbx", 3) +RSP = Register("rsp", 4) +RBP = Register("rbp", 5) +RSI = Register("rsi", 6) +RDI = Register("rdi", 7) +GPR = (RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI) + tuple(Register(f"r{i}", i) for i in range(8, 16)) +XMM = tuple(Register(f"xmm{i}", i, size=16) for i in range(16)) +# gprs you can write to +WGPR = tuple(r for r in GPR if r != RSP) + +CALLEE_SAVED = (RBX, RBP, GPR[12], GPR[13], GPR[14], GPR[15]) + ((RSI, RDI) + XMM[6:16] if sys.platform == "win32" else ()) + +reg_strs = {"rax": {4:"eax", 2:"ax", 1:"al"}, "rcx": {4:"ecx", 2:"cx", 1:"cl"}, "rdx": {4:"edx", 2:"dx", 1:"dl"}, "rbx": {4:"ebx", 2:"bx", 1:"bl"}, + "rsp": {4:"esp", 2:"sp", 1:"spl"}, "rbp": {4:"ebp", 2:"bp", 1:"bpl"}, "rsi": {4:"esi", 2:"si", 1:"sil"}, "rdi": {4:"edi", 2:"di", 1:"dil"}, + **{f"r{i}": {4:f"r{i}d", 2:f"r{i}w", 1:f"r{i}b"} for i in range(8, 16)}, **{f"xmm{i}": {64:f"zmm{i}", 32:f"ymm{i}"} for i in range(16)}} + +# ***** X86 instruction selection ***** +def base(x:UOp, i:int) -> UOp: return s.src[0] if (s:=x.src[i]).op is Ops.INDEX else s +def lane(x:UOp, i:int) -> int: return s.src[1].val if (s:=x.src[i]).op is Ops.INDEX else 0 +def to_int(dt:DType): return {dtypes.float16: dtypes.int16, dtypes.float32: dtypes.int32, dtypes.float64: dtypes.int64}[dt] +def def_reg(dt:DType, reg:Register|None=None) -> UOp: return UOp(Ops.INS, dt, arg=X86Ops.DEFINE, tag=None if reg is None else (reg,)) +def imm(dt:DType, v:int) -> UOp: return UOp.const(truncate[dt](v), dt).rtag() +def to_imm(c:UOp) -> UOp|None: + if c.op is not Ops.CONST: return None + if c.dtype is dtypes.int64: return imm(dtypes.int32, c.val) if not c.overflows(dtypes.int32) else None + if c.dtype is dtypes.uint64: return imm(dtypes.uint32, c.val) if not c.overflows(dtypes.uint32) else None + if c.dtype in dtypes.ints+(dtypes.bool,): return imm(c.dtype, c.val) + return None +def cmp(x:UOp) -> UOp: + if x.src[0].dtype is dtypes.float32: return x.ins(X86Ops.VUCOMISS, dtype=dtypes.void) + if x.src[0].dtype is dtypes.float64: return x.ins(X86Ops.VUCOMISD, dtype=dtypes.void) + return x.ins(X86Ops.CMP, dtype=dtypes.void) if (i:=to_imm(x.src[1])) is None else x.ins(X86Ops.CMPi, dtype=dtypes.void, src=(x.src[0], i)) +def vcmp(x:UOp) -> UOp: + v = imm(dtypes.uint8, {Ops.CMPLT: 1, Ops.CMPNE: 4, Ops.CMPEQ: 0}[x.op]) + if x.dtype.scalar() is dtypes.float32: return x.ins(X86Ops.VCMPSS if x.max_numel() == 1 else X86Ops.VCMPPS, src=x.src + (v,)) + return x.ins(X86Ops.VCMPSD if x.max_numel() == 1 else X86Ops.VCMPPD, src=x.src + (v,)) + +# vinsertps xmm2, xmm0, xmm1, imm +# inserts any 32 bit element in xmm1 into any position in xmm0 according to immm, result is written to xmm2 +# this is the fallback slow case for when you can't match more a powerful shuffle +def vinsertps(x:UOp) -> UOp: + def _insert(ret:UOp, i:int) -> UOp: + s, v = base(x, i), lane(x, i) + return x.ins(X86Ops.VINSERTPS, src=(ret, s, imm(dtypes.uint8, v << 6 | i << 4))) + return functools.reduce(_insert, range(len(x.src)), def_reg(x.dtype)) + +# vpinsq xmm2, xmm0, rax, imm +# inserts element in rax into any position in xmm0, result is written to xmm2 according to imm +def vpins(x:UOp) -> UOp: + op = {1: X86Ops.VPINSRB, 2: X86Ops.VPINSRW, 4: X86Ops.VPINSRD, 8: X86Ops.VPINSRQ}[x.dtype.scalar().itemsize] + return functools.reduce(lambda ret,i: x.ins(op, src=(ret, x.src[i], imm(dtypes.uint8, i))), range(len(x.src)), def_reg(x.dtype)) + +# we don't call ctx.vreg on the srcs to avoid duplicates, a rewrite will assign the tuple of valid registers to a vreg +def idiv(ctx:IselContext, x:UOp) -> UOp: + op = X86Ops.DIV if x.dtype in dtypes.uints else X86Ops.IDIV + # for >8bit need to zero/sign extend rax to rdx + if x.dtype in dtypes.int8s: ext = [] + elif x.dtype in dtypes.uints: ext = [x.ins(X86Ops.MOVi, src=(imm(min(dtypes.uint32, x.dtype), 0),), tag=(RDX,))] + else: ext = [x.ins(X86Ops.SARi, src=(x.src[0], imm(dtypes.uint8, x.dtype.itemsize * 8 - 1)), tag=(RDX,))] + # for 8bit need to zero/sign extend al to ah + if x.dtype is dtypes.uint8: dividend = UOp(Ops.INS, arg=X86Ops.MOVZX, dtype=dtypes.int16, src=(x.src[0],), tag=(RAX,)) + elif x.dtype is dtypes.int8: dividend = UOp(Ops.INS, arg=X86Ops.MOVSX, dtype=dtypes.int16, src=(x.src[0],), tag=(RAX,)) + else: dividend = x.ins(X86Ops.MOV, src=(x.src[0],), tag=(RAX,)) + # divisor can't be in rax or rdx + divisor = x.ins(X86Ops.MOV, src=(x.src[1],), tag=tuple(r for r in WGPR if r not in (RAX, RDX))) + # for >8bit both rax and rdx are written to + defs = (ctx.vreg(RAX),) if x.dtype in dtypes.int8s else (ctx.vreg(RAX), ctx.vreg(RDX)) + idiv = x.ins(op, src=(dividend, divisor) + tuple(ext), tag=defs) + # this move "cleanses" the register constraints (rax/rdx) of idiv as that only applies on definition and not on the uses of idiv + return x.ins(X86Ops.MOV, src=(idiv,)) + +# a variable shift count implicitly reads cl so it goes in rcx, the shifted value can't be in rcx +def shift(x:UOp, op:X86Ops) -> UOp: + val = x.ins(X86Ops.MOV, src=(x.src[0],), tag=tuple(r for r in WGPR if r is not RCX)) + return x.ins(op, src=(val, x.ins(X86Ops.MOV, src=(x.src[1],), tag=(RCX,)))) + +# a memory address operand is (base, index, displacement, size). size is the element size, it scales the index and is the memory operand width. +# it is materialized as an immediate so the address stays correct if the base register is ever spilled and refilled +def fold_address(x:UOp) -> tuple[UOp, UOp, UOp, UOp]: + def _disp(v:int) -> UOp: return imm(dtypes.int32 if abs(v) > dtypes.int8.max else dtypes.int8, v) + def _cast(v:UOp) -> UOp: return v.cast(dtypes.int64) if v.vmin < 0 else v + if x.op not in {Ops.INDEX, Ops.SHRINK}: return (x, UOp(Ops.NOOP), _disp(0), imm(dtypes.uint8, x.dtype.itemsize)) + base, idx = x.src[0], x.src[1] + # buffers are indexed by element, everything else (the stack pointer) by byte + scale = base.dtype.itemsize if base.op in {Ops.PARAM, Ops.BUFFER, Ops.AFTER} else 1 + sz = imm(dtypes.uint8, base.dtype.itemsize) + if idx.op is Ops.ADD and idx.src[1].op is Ops.CONST: return (base, _cast(idx.src[0]), _disp(idx.src[1].val * scale), sz) + if idx.op is Ops.CONST: return (base, UOp(Ops.NOOP), _disp(idx.val * scale), sz) + return (base, _cast(idx), _disp(0), sz) + +def abi(ctx:IselContext, x:UOp) -> UOp|None: + if isinstance(x.tag, tuple): return None + i = ctx.func_args.index(x) + # buffer params hold addresses, their value moves as a 64bit int + dt = dtypes.uint64 if x.op is Ops.PARAM and x.arg.addrspace is AddrSpace.GLOBAL else x.dtype + # the shape srcs of a PARAM are not values, tag them so they aren't materialized into registers + def _reg_arg(r:Register) -> tuple[UOp, ...]: return (x.replace(dtype=dt, src=tuple(s.rtag() for s in x.src), tag=(r,)),) + def _stack_arg(disp:int): + return (def_reg(dtypes.uint64, RSP), UOp(Ops.NOOP), UOp(Ops.INS, arg=X86Ops.FRAME_INDEX, dtype=dtypes.int32, tag=disp), imm(dtypes.uint8, 8)) + if sys.platform == "win32": src = _reg_arg((RCX, RDX, GPR[8], GPR[9])[i]) if i < 4 else _stack_arg((i-3)*8+32) + else: src = _reg_arg((RDI, RSI, RDX, RCX, GPR[8], GPR[9])[i]) if i < 6 else _stack_arg((i-5)*8) + # this move "cleanses" the abi register constraint + return x.ins(X86Ops.MOV, dtype=dt, src=src) + +GPR_DEST_OPS = {X86Ops.VPEXTRB, X86Ops.VPEXTRW, X86Ops.VPEXTRD, X86Ops.VPEXTRQ, X86Ops.VCVTTSS2SI, X86Ops.VCVTTSD2SI, + X86Ops.VMOVDm, X86Ops.VMOVQm} +XMM_OPS = {op for op in X86Ops if op.name.startswith('V')} - GPR_DEST_OPS + +def _is_vec_xmm(y: UOp) -> bool: + return (y.op is Ops.INS and y.arg in XMM_OPS) or (y.op not in (Ops.BUFFER, Ops.PARAM, Ops.AFTER, Ops.INS) and y.max_numel() > 1) + +def _xmm_sz(x: UOp) -> X86Ops: + bits = x.max_numel() * x.dtype.itemsize + if bits >= 16: return X86Ops.VMOVUPS + if bits >= 8: return X86Ops.VMOVSD + return X86Ops.VMOVSS + +def _xmm_sz_m(x: UOp) -> X86Ops: + bits = x.max_numel() * x.dtype.itemsize + if bits >= 16: return X86Ops.VMOVUPSm + if bits >= 8: return X86Ops.VMOVSDm + return X86Ops.VMOVSSm + +def alloc_vregs(ctx:IselContext, x:UOp) -> UOp|None: + # register placeholders with real registers + if x.arg is X86Ops.DEFINE and x.tag is not None: return None + if x.arg is X86Ops.LOOP_CMP: return None + # this is an immediate + if x.arg is X86Ops.FRAME_INDEX: return None + # no register definition + if x.dtype is dtypes.void: return None + # already allocated vregs + if isinstance(x.tag, tuple) and x.tag[0]._cons: return None + # allocate vreg definitions, the value of a BUFFER is its address so it lives in a gpr + defs = [] + if isinstance(x.tag, tuple): defs = [ctx.vreg(x.tag)] + elif x.op is Ops.BUFFER: defs = [ctx.vreg(WGPR)] + elif x.dtype in dtypes.floats or (x.op is Ops.INS and x.arg in XMM_OPS) or x.max_numel() > 1: defs = [ctx.vreg(XMM)] + elif x.dtype in dtypes.ints+(dtypes.bool,): defs = [ctx.vreg(WGPR)] + # TODO: add this once the scheduler can track register pressure + # if x.arg in X86GroupOp.WriteFlags: defs.append(ctx.vreg(RFLAGS)) + # the size src of a BUFFER is not a value, tag it so it isn't materialized into a register + if x.op is Ops.BUFFER: return x.replace(src=tuple(s.rtag() for s in x.src), tag=tuple(defs)) + return x.replace(tag=tuple(defs)) + +isel_matcher = PatternMatcher([ + # **** Op -> Op **** + # cast of void is a noop + (UPat.var("y").cast(name="x"), lambda y,x: y if y.dtype == dtypes.void else None), + # range is lowered to acc, cmp, jmp after regalloc + (UPat(Ops.RANGE, src=(UPat.cvar("c"),), allow_any_len=True, name="x"), lambda c,x: x.replace(src=(imm(c.dtype, c.val),) + x.src[1:])), + (UPat(Ops.RANGE, name="x"), lambda ctx,x: x.replace(tag=(ctx.vreg(WGPR),)) if not isinstance(x.tag, tuple) else None), + # really all a backedge END is is an IF with a tag referencing the RANGE start label + (UPat(Ops.END, src=(UPat(), UPat(), UPat(GroupOp.Comparison, name="cond")), name="x"), + lambda x,cond: cond.ins(X86Ops.LOOP_CMP, tag=cond.op, src=cond.src + x.src[:2])), + # **** Op -> X86Op **** + # add callee saved registers to the RET, these will be scheduled at the top of the kernel and will be saved/restored if they are used in regalloc + # so regalloc builds the prologue/epilogue naturally + (UPat(Ops.SINK, name="x"), lambda x: + x.replace(src=(x.ins(X86Ops.RET, src=x.src + tuple(def_reg(dtypes.uint64 if r in GPR else dtypes.float64, r) for r in CALLEE_SAVED)),)) \ + if not x.src or x.src[0].arg is not X86Ops.RET else None), + # function abi constraints + (UPat((Ops.PARAM, Ops.SPECIAL), name="x"), abi), + # constants that can't be immediates, move them to registers + (UPat.cvar("x", dtypes.int64s), lambda x: x.ins(X86Ops.MOVABS, src=(imm(x.dtype, x.val),)) if not x.tag else None), + (UPat.cvar("x", dtypes.ints+(dtypes.bool,)), lambda x: x.ins(X86Ops.MOVi, src=(imm(x.dtype, x.val),)) if not x.tag else None), + (UPat.cvar("x", dtypes.floats), lambda x: + UOp.const(struct.unpack((dt:=to_int(x.dtype)).fmt, struct.pack(x.dtype.fmt, x.val))[0], dt).bitcast(x.dtype) if not x.tag else None), + # conditional moves that use masks NOTE: these currently assume a mask producing cmp exists + (UPat.var("m").where(UPat.var("a", dtypes.int8s+dtypes.int16s+dtypes.int32s+(dtypes.int64,)), UPat.var("b")), lambda m,a,b: + a.ins(X86Ops.VPBLENDVB, src=(b, a, m.replace(dtype=m.src[0].dtype))) if a.max_numel() > 1 else None), + (UPat.var("m").where(UPat.var("a", dtypes.float32), UPat.var("b")), lambda m,a,b: + a.ins(X86Ops.VBLENDVPS, src=(b, a, m.replace(dtype=m.src[0].dtype)))), + (UPat.var("m").where(UPat.var("a", dtypes.float64), UPat.var("b")), lambda m,a,b: + a.ins(X86Ops.VBLENDVPD, src=(b, a, m.replace(dtype=m.src[0].dtype)))), + # in this case we have a mask producing comparison whose user expects a bool, so we convert to bool + (UPat(GroupOp.Comparison, dtypes.bool, (UPat.var("y", (dtypes.float32, dtypes.float64)), UPat()), name="x"), lambda y,x: + UOp(Ops.AND, src=(x.replace(dtype=y.dtype).bitcast(dt:=to_int(y.dtype)), UOp.const(1, dt))).f(Ops.NOOP, dtype=dtypes.bool)), + # conditional moves that use flags + (UPat(Ops.CMPLT, src=(UPat(dtype=dtypes.sints), UPat()), name="m").where(UPat.var("a"), UPat.var("b")), lambda m,a,b: + a.ins(X86Ops.CMOVL, src=(b, a, cmp(m)))), + (UPat(Ops.CMPLT, name="m").where(UPat.var("a"), UPat.var("b")), lambda m,a,b: a.ins(X86Ops.CMOVB, src=(b, a, cmp(m)))), + (UPat(Ops.CMPEQ, name="m").where(UPat.var("a"), UPat.var("b")), lambda m,a,b: a.ins(X86Ops.CMOVE, src=(b, a, cmp(m)))), + (UPat(Ops.CMPNE, name="m").where(UPat.var("a"), UPat.var("b")), lambda m,a,b: a.ins(X86Ops.CMOVNE, src=(b, a, cmp(m)))), + # jumps, use flags + (UPat(Ops.IF, src=(UPat(Ops.CMPLT, src=(UPat(dtype=dtypes.uints), UPat()), name="y"),), name="x"), lambda y,x: x.ins(X86Ops.JB, src=(cmp(y),))), + (UPat(Ops.IF, src=(UPat(Ops.CMPLT, name="y"),), name="x"), lambda y,x: x.ins(X86Ops.JL, src=(cmp(y),))), + (UPat(Ops.IF, src=(UPat(Ops.CMPEQ, name="y"),), name="x"), lambda y,x: x.ins(X86Ops.JE, src=(cmp(y),))), + (UPat(Ops.IF, src=(UPat(Ops.CMPNE, name="y"),), name="x"), lambda y,x: x.ins(X86Ops.JNE, src=(cmp(y),))), + # comparisons whose user doesn't use the flag, move flag result to register + (UPat(Ops.CMPLT, dtypes.bool, (UPat(dtype=dtypes.uints), UPat()), name="x"), lambda x: x.ins(X86Ops.SETB, src=(cmp(x),))), + (UPat(Ops.CMPLT, dtypes.bool, name="x"), lambda x: x.ins(X86Ops.SETL, src=(cmp(x),))), + (UPat(Ops.CMPEQ, dtypes.bool, name="x"), lambda x: x.ins(X86Ops.SETE, src=(cmp(x),))), + (UPat(Ops.CMPNE, dtypes.bool, name="x"), lambda x: x.ins(X86Ops.SETNE, src=(cmp(x),))), + # comparisons that produce masks (these aren't bool dtype) + (UPat(GroupOp.Comparison, src=(UPat(dtype=(dtypes.float32, dtypes.float64)), UPat()), name="x"), vcmp), + (UPat(Ops.CMPEQ, src=(UPat(dtype=dtypes.int8s), UPat()), name="x"), lambda x: x.ins(X86Ops.VPCMPEQB)), + (UPat(Ops.CMPEQ, src=(UPat(dtype=dtypes.int16s), UPat()), name="x"), lambda x: x.ins(X86Ops.VPCMPEQW)), + (UPat(Ops.CMPEQ, src=(UPat(dtype=dtypes.int32s), UPat()), name="x"), lambda x: x.ins(X86Ops.VPCMPEQD)), + (UPat(Ops.CMPEQ, src=(UPat(dtype=dtypes.int64s), UPat()), name="x"), lambda x: x.ins(X86Ops.VPCMPEQQ)), + (UPat(Ops.CMPLT, src=(UPat.var("a", dtypes.int8s), UPat.var("b")), name="x"), lambda a,b,x: x.ins(X86Ops.VPCMPGTB, src=(b, a))), + (UPat(Ops.CMPLT, src=(UPat.var("a", dtypes.int16s), UPat.var("b")), name="x"), lambda a,b,x: x.ins(X86Ops.VPCMPGTW, src=(b, a))), + (UPat(Ops.CMPLT, src=(UPat.var("a", dtypes.int32s), UPat.var("b")), name="x"), lambda a,b,x: x.ins(X86Ops.VPCMPGTD, src=(b, a))), + (UPat(Ops.CMPLT, src=(UPat.var("a", dtypes.int64s), UPat.var("b")), name="x"), lambda a,b,x: x.ins(X86Ops.VPCMPGTQ, src=(b, a))), + # float unary + (UPat.var("y", dtypes.float32).sqrt().named("x"), lambda y,x: x.ins(X86Ops.VSQRTSS, src=(y, y)) if x.max_numel() == 1 else x.ins(X86Ops.VSQRTPS)), + (UPat.var("y", dtypes.float64).sqrt().named("x"), lambda y,x: x.ins(X86Ops.VSQRTSD, src=(y, y)) if x.max_numel() == 1 else x.ins(X86Ops.VSQRTPD)), + (UPat.var("y", dtypes.float32).trunc().named("x"), lambda y,x: + x.ins(X86Ops.VROUNDSS, src=(y, y, imm(dtypes.uint8, 3))) if x.max_numel() == 1 else x.ins(X86Ops.VROUNDPS, src=(y, imm(dtypes.uint8, 3)))), + (UPat.var("y", dtypes.float64).trunc().named("x"), lambda y,x: + x.ins(X86Ops.VROUNDSD, src=(y, y, imm(dtypes.uint8, 3))) if x.max_numel() == 1 else x.ins(X86Ops.VROUNDPD, src=(y, imm(dtypes.uint8, 3)))), + # for float16 we route the srcs through gprs, this is suboptimal for values in xmms, in that case we want vpunpcklwd + (UPat(Ops.STACK, dtypes.float16, name="x"), lambda x: + vpins(x.replace(src=tuple(s.bitcast(dtypes.int16) for s in x.src)))), + (UPat(Ops.STACK, dtypes.float32, name="x"), vinsertps), + (UPat(Ops.STACK, dtypes.ints+(dtypes.bool,), name="x"), vpins), + # INDEX on a vector register value extracts a single element + (UPat.var("y", dtypes.int8s+(dtypes.bool,)).index(UPat.cvar("c"), name="x"), + lambda y,c,x: x.ins(X86Ops.VPEXTRB, src=(y, imm(dtypes.uint8, c.val))) if _is_vec_xmm(y) else None), + (UPat.var("y", dtypes.int16s).index(UPat.cvar("c"), name="x"), + lambda y,c,x: x.ins(X86Ops.VPEXTRW, src=(y, imm(dtypes.uint8, c.val))) if _is_vec_xmm(y) else None), + (UPat.var("y", dtypes.int32s).index(UPat.cvar("c"), name="x"), + lambda y,c,x: x.ins(X86Ops.VPEXTRD, src=(y, imm(dtypes.uint8, c.val))) if _is_vec_xmm(y) else None), + (UPat.var("y", dtypes.int64s).index(UPat.cvar("c"), name="x"), + lambda y,c,x: x.ins(X86Ops.VPEXTRQ, src=(y, imm(dtypes.uint8, c.val))) if _is_vec_xmm(y) else None), + (UPat.var("y", dtypes.floats).index(UPat.cvar("c"), name="x"), + lambda y,c,x: x.ins(X86Ops.VPSRLDQ, src=(y, imm(dtypes.uint8, c.val * x.dtype.itemsize))) if _is_vec_xmm(y) else None), + # packed bitwise + ((UPat() & UPat()).named("x"), lambda x: x.ins(X86Ops.VPAND) if x.max_numel() > 1 else None), + ((UPat() | UPat()).named("x"), lambda x: x.ins(X86Ops.VPOR) if x.max_numel() > 1 else None), + ((UPat() ^ UPat()).named("x"), lambda x: x.ins(X86Ops.VPXOR) if x.max_numel() > 1 else None), + # packed int binary + ((UPat(dtype=dtypes.int32s) << UPat()).named("x"), lambda x: x.ins(X86Ops.VPSLLVD) if x.max_numel() > 1 else None), + ((UPat(dtype=dtypes.int64s) << UPat()).named("x"), lambda x: x.ins(X86Ops.VPSLLVQ) if x.max_numel() > 1 else None), + ((UPat(dtype=dtypes.uint32) >> UPat()).named("x"), lambda x: x.ins(X86Ops.VPSRLVD) if x.max_numel() > 1 else None), + ((UPat(dtype=dtypes.uint64) >> UPat()).named("x"), lambda x: x.ins(X86Ops.VPSRLVQ) if x.max_numel() > 1 else None), + ((UPat(dtype=dtypes.int32) >> UPat()).named("x"), lambda x: x.ins(X86Ops.VPSRAVD) if x.max_numel() > 1 else None), + ((UPat(dtype=dtypes.int8s) + UPat()).named("x"), lambda x: x.ins(X86Ops.VPADDB) if x.max_numel() > 1 else None), + ((UPat(dtype=dtypes.int16s) + UPat()).named("x"), lambda x: x.ins(X86Ops.VPADDW) if x.max_numel() > 1 else None), + ((UPat(dtype=dtypes.int32s) + UPat()).named("x"), lambda x: x.ins(X86Ops.VPADDD) if x.max_numel() > 1 else None), + ((UPat(dtype=dtypes.int64s) + UPat()).named("x"), lambda x: x.ins(X86Ops.VPADDQ) if x.max_numel() > 1 else None), + (UPat(Ops.SUB, dtypes.int8s, name="x"), lambda x: x.ins(X86Ops.VPSUBB) if x.max_numel() > 1 else None), + (UPat(Ops.SUB, dtypes.int16s, name="x"), lambda x: x.ins(X86Ops.VPSUBW) if x.max_numel() > 1 else None), + (UPat(Ops.SUB, dtypes.int32s, name="x"), lambda x: x.ins(X86Ops.VPSUBD) if x.max_numel() > 1 else None), + (UPat(Ops.SUB, dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VPSUBQ) if x.max_numel() > 1 else None), + (UPat(Ops.MUL, dtypes.int16s, name="x"), lambda x: x.ins(X86Ops.VPMULLW) if x.max_numel() > 1 else None), + (UPat(Ops.MUL, dtypes.int32s, name="x"), lambda x: x.ins(X86Ops.VPMULLD) if x.max_numel() > 1 else None), + # scalar int binary + ((UPat(dtype=dtypes.ints).alu(Ops.CDIV, UPat())).named("x"), idiv), + # scalar int binary with immediate + (UPat.var("a", dtypes.ints) << UPat.cvar("c"), lambda a,c: a.ins(X86Ops.SHLi, src=(a, imm(dtypes.uint8, c.val)))), + (UPat.var("a", dtypes.uints) >> UPat.cvar("c"), lambda a,c: a.ins(X86Ops.SHRi, src=(a, imm(dtypes.uint8, c.val)))), + (UPat.var("a", dtypes.sints) >> UPat.cvar("c"), lambda a,c: a.ins(X86Ops.SARi, src=(a, imm(dtypes.uint8, c.val)))), + (UPat.var("a", dtypes.ints) + UPat.cvar("c"), lambda a,c: a.ins(X86Ops.ADDi, src=(a, i)) if (i:=to_imm(c)) is not None else None), + (UPat.var("a", dtypes.ints) * UPat.cvar("c"), lambda a,c: a.ins(X86Ops.IMULi, src=(a, i)) if (i:=to_imm(c)) is not None else None), + (UPat.var("a", dtypes.ints+(dtypes.bool,)) & UPat.cvar("c"), lambda a,c: a.ins(X86Ops.ANDi, src=(a, i)) if (i:=to_imm(c)) is not None else None), + (UPat.var("a", dtypes.ints+(dtypes.bool,)) | UPat.cvar("c"), lambda a,c: a.ins(X86Ops.ORi, src=(a, i)) if (i:=to_imm(c)) is not None else None), + (UPat.var("a", dtypes.ints+(dtypes.bool,)) ^ UPat.cvar("c"), lambda a,c: a.ins(X86Ops.XORi, src=(a, i)) if (i:=to_imm(c)) is not None else None), + (UPat(Ops.SUB, dtypes.ints, (UPat.var("a"), UPat.cvar("c"))), lambda a,c: a.ins(X86Ops.SUBi, src=(a, i)) if (i:=to_imm(c)) is not None else None), + # scalar int binary with register + ((UPat(dtype=dtypes.ints) << UPat()).named("x"), lambda x: shift(x, X86Ops.SHL)), + ((UPat(dtype=dtypes.uints) >> UPat()).named("x"), lambda x: shift(x, X86Ops.SHR)), + ((UPat(dtype=dtypes.sints) >> UPat()).named("x"), lambda x: shift(x, X86Ops.SAR)), + (UPat.var("a", dtypes.ints) + UPat.var("b"), lambda a,b: a.ins(X86Ops.ADD, src=(a, b))), + (UPat.var("a", dtypes.ints) * UPat.var("b"), lambda a,b: a.ins(X86Ops.IMUL, src=(a, b))), + (UPat.var("a", dtypes.ints+(dtypes.bool,)) & UPat.var("b"), lambda a,b: a.ins(X86Ops.AND, src=(a, b))), + (UPat.var("a", dtypes.ints+(dtypes.bool,)) | UPat.var("b"), lambda a,b: a.ins(X86Ops.OR, src=(a, b))), + (UPat.var("a", dtypes.ints+(dtypes.bool,)) ^ UPat.var("b"), lambda a,b: a.ins(X86Ops.XOR, src=(a, b))), + (UPat(Ops.SUB, dtypes.ints, (UPat.var("a"), UPat.var("b"))), lambda a,b: a.ins(X86Ops.SUB, src=(a, b))), + # float binary + ((UPat(dtype=dtypes.float32) + UPat()).named("x"), lambda x: x.ins(X86Ops.VADDSS if x.max_numel() == 1 else X86Ops.VADDPS)), + ((UPat(dtype=dtypes.float64) + UPat()).named("x"), lambda x: x.ins(X86Ops.VADDSD if x.max_numel() == 1 else X86Ops.VADDPD)), + ((UPat(dtype=dtypes.float32) * UPat()).named("x"), lambda x: x.ins(X86Ops.VMULSS if x.max_numel() == 1 else X86Ops.VMULPS)), + ((UPat(dtype=dtypes.float64) * UPat()).named("x"), lambda x: x.ins(X86Ops.VMULSD if x.max_numel() == 1 else X86Ops.VMULPD)), + (UPat(Ops.SUB, dtypes.float32, name="x"), lambda x: x.ins(X86Ops.VSUBSS if x.max_numel() == 1 else X86Ops.VSUBPS)), + (UPat(Ops.SUB, dtypes.float64, name="x"), lambda x: x.ins(X86Ops.VSUBSD if x.max_numel() == 1 else X86Ops.VSUBPD)), + (UPat(Ops.FDIV, dtypes.float32, name="x"), lambda x: x.ins(X86Ops.VDIVSS if x.max_numel() == 1 else X86Ops.VDIVPS)), + (UPat(Ops.FDIV, dtypes.float64, name="x"), lambda x: x.ins(X86Ops.VDIVSD if x.max_numel() == 1 else X86Ops.VDIVPD)), + # casts + (UPat(dtype=dtypes.int32).cast(dtypes.float32, name="x"), lambda x: x.ins(X86Ops.VCVTDQ2PS) if x.max_numel() > 1 else None), + (UPat(dtype=dtypes.int32).cast(dtypes.float64, name="x"), lambda x: x.ins(X86Ops.VCVTDQ2PD) if x.max_numel() > 1 else None), + (UPat(dtype=dtypes.float32).cast(dtypes.int32s, name="x"), lambda x: x.ins(X86Ops.VCVTTPS2DQ) if x.max_numel() > 1 else None), + (UPat(dtype=dtypes.float64).cast(dtypes.int32s, name="x"), lambda x: x.ins(X86Ops.VCVTTPD2DQ) if x.max_numel() > 1 else None), + (UPat(dtype=dtypes.float32).cast(dtypes.float64, name="x"), lambda x: x.ins(X86Ops.VCVTPS2PD) if x.max_numel() > 1 else None), + (UPat(dtype=dtypes.float64).cast(dtypes.float32, name="x"), lambda x: x.ins(X86Ops.VCVTPD2PS) if x.max_numel() > 1 else None), + (UPat(dtype=dtypes.float32).cast(dtypes.float16, name="x"), lambda x: x.ins(X86Ops.VCVTPS2PH, src=x.src + (imm(dtypes.uint8, 4),))), + (UPat(dtype=dtypes.float16).cast(dtypes.float32, name="x"), lambda x: x.ins(X86Ops.VCVTPH2PS)), + (UPat(dtype=dtypes.float32).cast(dtypes.int32s+dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VCVTTSS2SI)), + (UPat(dtype=dtypes.float64).cast(dtypes.int32s+dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VCVTTSD2SI)), + (UPat.var("y", dtypes.float32).cast(dtypes.float64, name="x"), lambda y,x: x.ins(X86Ops.VCVTSS2SD, src=(y, y))), + (UPat.var("y", dtypes.float64).cast(dtypes.float32, name="x"), lambda y,x: x.ins(X86Ops.VCVTSD2SS, src=(y, y))), + (UPat.var("y", (dtypes.int32, dtypes.int64)).cast(dtypes.float32, name="x"), lambda y,x: x.ins(X86Ops.VCVTSI2SS, src=(def_reg(x.dtype), y))), + (UPat.var("y", (dtypes.int32, dtypes.int64)).cast(dtypes.float64, name="x"), lambda y,x: x.ins(X86Ops.VCVTSI2SD, src=(def_reg(x.dtype), y))), + (UPat(dtype=dtypes.uints+(dtypes.bool,)).cast(dtypes.ints, name="x"), lambda x: + x.ins(X86Ops.MOVZX) if x.max_numel() == 1 and x.src[0].dtype.itemsize < x.dtype.itemsize else None), + (UPat(dtype=dtypes.int32).cast(dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.MOVSXD) if x.max_numel() == 1 else None), + (UPat(dtype=dtypes.sints).cast(dtypes.ints, name="x"), lambda x: + x.ins(X86Ops.MOVSX) if x.max_numel() == 1 and x.src[0].dtype.itemsize < x.dtype.itemsize else None), + (UPat(dtype=(dtypes.uint8, dtypes.bool)).cast(dtypes.int16s, name="x"), lambda x: x.ins(X86Ops.VPMOVZXBW)), + (UPat(dtype=(dtypes.uint8, dtypes.bool)).cast(dtypes.int32s, name="x"), lambda x: x.ins(X86Ops.VPMOVZXBD)), + (UPat(dtype=(dtypes.uint8, dtypes.bool)).cast(dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VPMOVZXBQ)), + (UPat(dtype=dtypes.uint16).cast(dtypes.int32s, name="x"), lambda x: x.ins(X86Ops.VPMOVZXWD)), + (UPat(dtype=dtypes.uint16).cast(dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VPMOVZXWQ)), + (UPat(dtype=dtypes.uint32).cast(dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VPMOVZXDQ)), + (UPat(dtype=dtypes.int8).cast(dtypes.int16s, name="x"), lambda x: x.ins(X86Ops.VPMOVSXBW)), + (UPat(dtype=dtypes.int8).cast(dtypes.int32s, name="x"), lambda x: x.ins(X86Ops.VPMOVSXBD)), + (UPat(dtype=dtypes.int8).cast(dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VPMOVSXBQ)), + (UPat(dtype=dtypes.int16).cast(dtypes.int32s, name="x"), lambda x: x.ins(X86Ops.VPMOVSXWD)), + (UPat(dtype=dtypes.int16).cast(dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VPMOVSXWQ)), + (UPat(dtype=dtypes.int32).cast(dtypes.int64s, name="x"), lambda x: x.ins(X86Ops.VPMOVSXDQ)), + # bitcasts between scalar floats and ints + (UPat.var("y", dtypes.float16).bitcast(dtypes.int16s).named("x"), lambda y,x: x.ins(X86Ops.VPEXTRW, src=(y, imm(dtypes.uint8, 0)))), + (UPat(dtype=dtypes.int16s).bitcast(dtypes.float16).named("x"), vpins), + (UPat(dtype=dtypes.int32s).bitcast(dtypes.float32).named("x"), lambda x: x.ins(X86Ops.VMOVD)), + (UPat(dtype=dtypes.int64s).bitcast(dtypes.float64).named("x"), lambda x: x.ins(X86Ops.VMOVQ)), + (UPat(dtype=dtypes.float32).bitcast(dtypes.int32s).named("x"), lambda x: x.ins(X86Ops.VMOVDm)), + (UPat(dtype=dtypes.float64).bitcast(dtypes.int64s).named("x"), lambda x: x.ins(X86Ops.VMOVQm)), + # index on a buffer (or the stack pointer) computes an address, addresses are 64bit values + (UPat((Ops.INDEX, Ops.SHRINK), name="x"), + lambda x: x.ins(X86Ops.LEA, dtype=dtypes.uint64, src=fold_address(x)) if not _is_vec_xmm(x.src[0]) else None), + # TODO: fuse stores, very few cases -- store cmp becomes setcc, store gep int becomes vpextr, store bitcast to int becomes vmovd/q + # copy, load, store + # NOTE: copy here violates the spec, it only happens post register allocation when a reg to reg move needs to be inserted + (UPat(Ops.COPY, dtypes.floats, name="x"), lambda x: x.ins(_xmm_sz(x))), + (UPat(Ops.COPY, dtypes.ints+(dtypes.bool,), name="x"), lambda x: x.ins(X86Ops.MOV) if x.max_numel() == 1 else x.ins(_xmm_sz(x))), + (UPat(Ops.LOAD, dtypes.floats, src=(UPat(name="a"),), name="x"), lambda x,a: + x.ins(X86Ops.VPINSRW, src=(def_reg(x.dtype, x.tag),) + fold_address(a) + (imm(dtypes.uint8, 0),)) if x.max_numel() * x.dtype.itemsize == 2 else + x.ins(_xmm_sz(x), src=fold_address(a))), + (UPat(Ops.LOAD, dtypes.ints+(dtypes.bool,), src=(UPat(name="a"),), name="x"), lambda x,a: + x.ins(X86Ops.MOV, src=fold_address(a)) if x.max_numel() == 1 else + x.ins(X86Ops.VPINSRW, src=(def_reg(x.dtype, x.tag),) + fold_address(a) + (imm(dtypes.uint8, 0),)) if x.max_numel() * x.dtype.itemsize == 2 else + x.ins(_xmm_sz(x), src=fold_address(a))), + (UPat.var("a").store(UPat.var("b", dtypes.floats), name="x"), lambda a,b,x: + x.ins(X86Ops.VPEXTRW, src=fold_address(a) + (b, imm(dtypes.uint8, 0))) if b.max_numel() * b.dtype.itemsize == 2 else + x.ins(_xmm_sz_m(b), src=fold_address(a) + (b,))), + (UPat.var("a").store(UPat.var("b", dtypes.ints+(dtypes.bool,)), name="x"), lambda a,b,x: + x.ins(X86Ops.VPEXTRW, src=fold_address(a) + (b, imm(dtypes.uint8, 0))) if b.max_numel() > 1 and b.max_numel() * b.dtype.itemsize == 2 else + x.ins(_xmm_sz_m(b), src=fold_address(a) + (b,)) if b.max_numel() > 1 else + x.ins(X86Ops.MOVm, src=fold_address(a) + (b,)) if (i:=to_imm(b)) is None else x.ins(X86Ops.MOVi, src=fold_address(a) + (i,))), + # allocate virtual registers + (UPat((Ops.INS, Ops.BUFFER), name="x"), alloc_vregs), +]) + +# ***** pre register allocation ***** +# this handles flag clobbers. Unfortunately x86 doesn't have a good way to store/restore the flag register (then regalloc would handle it) +# so we rematerialize. This is different from rematerialization you might want to do in regalloc because it is not optional, +# regalloc shouldn't rematerialize if a src of the instruction is dead, but here you need to as there's no fallback load from stack +def flag_rematerialize(ctx:PreRegAllocContext, x:UOp): + flag_def = x if x.arg in X86GroupOp.WriteFlags or x.op in (Ops.RANGE, Ops.END) else x.src[-1] if x.arg in X86GroupOp.ReadFlags else None + if flag_def is None: return None + if ctx.lock is not None and ctx.lock is not flag_def: ctx.clobbered.add(ctx.lock) + ctx.lock = flag_def + if flag_def not in ctx.clobbered: return None + ctx.clobbered.remove(flag_def) + return (x, [flag_def, x]) + +pre_regalloc_matcher = PatternMatcher([ + (UPat((Ops.INS, Ops.RANGE, Ops.END), name="x"), flag_rematerialize), +]) + +# ***** post register allocation ***** +# TODO: control flow should be overhauled so that this isn't necessary +def lower_range(ctx, x:UOp) -> tuple[UOp, list[UOp]]: + loop_label = "_".join(str(i) for i in x.arg[:-1]) + label = UOp(Ops.INS, arg=X86Ops.LABEL, tag=f".LOOP_{loop_label}") + # loop, cmp on backedge all we need is a jmp tag + if x.dtype is dtypes.void: return (label, [label]) + else: + acc = x.ins(X86Ops.MOVi, src=(imm(x.dtype, 0),) + x.src[1:]) + cmp = UOp(Ops.INS, arg=X86Ops.CMPi if x.src[0].op is Ops.CONST else X86Ops.CMP, src=(acc, x.src[0])) + jump_out = UOp(Ops.INS, arg=X86Ops.JGE, src=(cmp,), tag=f".LOOP_OUT_{loop_label}") + ctx.loop_label[acc] = loop_label + return (acc, [acc, label, cmp, jump_out]) + +def lower_end(ctx, x:UOp) -> tuple[UOp, list[UOp]]: + end_label = UOp(Ops.INS, arg=X86Ops.LABEL, tag=f".LOOP_OUT_{ctx.loop_label[x.src[1]]}") + jmp = UOp(Ops.INS, arg=X86Ops.JMP, tag=f".LOOP_{ctx.loop_label[x.src[1]]}") + inc = x.src[1].ins(X86Ops.ADDi, src=(imm(x.src[1].dtype, 1),)) + return (inc, [inc, jmp, end_label]) + +def lower_loop(ctx, x:UOp) -> tuple[UOp, list[UOp]]: + cond = x.replace(op=x.tag, src=x.src[:2]) + jmp = isel_matcher.rewrite(UOp(Ops.IF, src=(cond,))) + return (jmp.src[0], [jmp.src[0], jmp.replace(tag=x.src[3].tag)]) + +# final rewrite to match the isa spec +post_regalloc_matcher = PatternMatcher([ + # rewrite FRAME_INDEX to IMM now that the stack size is known + (UPat(Ops.INS, arg=X86Ops.FRAME_INDEX, name="x"), lambda ctx,x: (nx:=x.const_like(ctx.stack_size + x.tag), [nx])), + # expand the cmp here so we can preserve rng src edge to get label from ctx + (UPat(Ops.INS, arg=X86Ops.LOOP_CMP, name="x"), lower_loop), + # rewrite RANGE to ACC = 0 -> LABEL -> JUMP if ACC >= loop bound + (UPat(Ops.RANGE, name="x"), lower_range), + # rewrite END to ACC + 1 -> JUMP -> LABEL, also add the out of loop JUMP to the src so this becomes the jump target + (UPat(Ops.END, name="x"), lower_end), + # rewrite two address instructions to two address form, if reused src wasn't coalesced insert a move + (UPat(Ops.INS, name="x"), lambda ctx,x: (nx:=x.replace(src=x.src[1:]), + [ctx.ren.copy(x.src[0], greg(x)), nx] if greg(x) != greg(x.src[0]) else [nx]) if x.arg in X86GroupOp.TwoAddress else None), +]) + +# ***** X86 instruction encoding ***** + +def encode(x:UOp, opc:int, reg:int|None=None, pp:int=0, sel:int=0, we:int=0) -> bytes|None: + def _encode(reg_uop:UOp|None, rm_uop:UOp, idx_uop:UOp|None=None, disp_uop:UOp|None=None, sz_uop:UOp|None=None, + vvvv_uop:UOp|None=None, imm_uop:UOp|None=None) -> bytes: + nonlocal reg, opc + # get the encoding values of the different fields + reg = cast(int, cast(Register, greg(reg_uop)).index if reg_uop is not None else reg) + rm = cast(Register, greg(rm_uop)).index + idx = cast(Register, greg(idx_uop)).index if idx_uop is not None and greg(idx_uop) is not None else 4 + # for a memory operand the rm size is the element size from the address, otherwise it's the size of the value in the register + rm_sz = sz_uop.val if sz_uop is not None else rm_uop.dtype.itemsize + reg_sz = reg_uop.dtype.itemsize if reg_uop is not None else 0 + sz = reg_sz or rm_sz + + # encode instruction + inst = bytes([]) + assert 0 <= reg <= 15 and 0 <= idx <= 15 and 0 <= rm <= 15 + # r extends reg field, x extends index field, b extends rm or base field + r, _x, b = reg >> 3, idx >> 3, rm >> 3 + if sel: # VEX bytes + vvvv = cast(Register, greg(vvvv_uop)).index if vvvv_uop is not None else 0 + l = (max(reg_sz, rm_sz) > 16) & 0b1 + if sel == 1 and _x == b == we == 0: inst += bytes([0xC5, (~r & 0b1) << 7 | (~vvvv & 0b1111) << 3 | l << 2 | pp]) + else: inst += bytes([0xC4, (~r & 0b1) << 7 | (~_x & 0b1) << 6 | (~b & 0b1) << 5 | sel, we << 7 | (~vvvv & 0b1111) << 3 | l << 2 | pp]) + else: # optional PREFIX and REX bytes + # PREFIX byte signaling 16 bit variant of instruction + if sz == 2: inst += bytes([0x66]) + # bit signaling 64 bit variant of instruction + w = sz == 8 + # REX byte is required when 64 bit or an extended reg is used (index 8 - 15) or lower 8 bits of (rsp, rbp, rsi, rdi) are accessed + if w | r | _x | b | (reg_sz == 1 & reg >> 2) | (rm_sz == 1 & rm >> 2): inst += bytes([0b0100 << 4 | w << 3 | r << 2 | _x << 1 | b]) + # legacy 8bit opcode is 1 less than 16-64bit variants + if (rm_sz == 1 or reg_sz == 1) and x.arg not in X86GroupOp.ReadFlags | {X86Ops.LEA}: opc -= 1 + # OPCODE byte + inst += opc.to_bytes((opc.bit_length() + 7) // 8, 'big') + # MODRM byte + # now we only care about the lower 3 bits + idx, rm, reg = idx & 0b111, rm & 0b111, reg & 0b111 + # 0b00 -- signals memory access with no displacement + # 0b01 -- signals memory access with 8bit displacement + # 0b10 -- signals memory access with 32bit displacement + # 0b11 -- signals no memory access + if disp_uop is not None: + assert disp_uop.op is Ops.CONST, "displacement must be a constant" + assert disp_uop.dtype in (dtypes.int8, dtypes.int32), "displacement can only be 1 or 4 byte signed int" + # rbp/r13 always require a displacement + if disp_uop.val != 0 or rm == 0b101: mod = 0b01 if disp_uop.dtype.itemsize == 1 else 0b10 + else: mod = 0b00 + else: mod = 0b11 + # x 0b0 and idx 0b100 means rsp which means no index exists + # rm 0b100 (rsp/r12) signals a sib byte is required, rm then is encoded in the base field of SIB + _rm = rm if idx == 0b100 and _x == 0b0 else 0b100 + inst += bytes([mod << 6 | reg << 3 | _rm]) + # SIB byte + if _rm == 0b100 and mod != 0b11: + scale = {1: 0b00, 2: 0b01, 4: 0b10, 8: 0b11}[1 if idx == 0b100 and _x == 0b0 else rm_sz] + inst += bytes([scale << 6 | idx << 3 | rm]) + # DISP byte + if mod == 0b01 or mod == 0b10: + assert disp_uop is not None + inst += struct.pack(unwrap(disp_uop.dtype.fmt), disp_uop.val) + # IMM byte + if imm_uop is not None: + if imm_uop.op is Ops.CONST: inst += struct.pack(unwrap(imm_uop.dtype.fmt), imm_uop.val) + elif isinstance(greg(imm_uop), Register): inst += bytes([(greg(imm_uop).index & 0b1111) << 4 | 0b0000]) + return inst + + # get the encoding structure of the uop + # when a uop writes to memory it takes the form of a store, dtype is void, no definition + address:tuple[UOp|None, ...] + if x.arg in X86GroupOp.WriteMem: + if len(x.src) > 4: address, rest = x.src[:4], x.src[4:] + else: address, rest = (x, None, None, None), x.src + imm_uop = rest[:1] if rest and rest[0].op is Ops.CONST else (None,) + return _encode(rest[0], *address, *(None, *rest[1:])) if reg is None else _encode(None, *address, *(None, *imm_uop)) + + if x.arg in X86GroupOp.Rm1st: + if len(x.src) > 3: address, rest = x.src[:4], x.src[4:] + else: address, rest = (x.src[0], None, None, None), x.src[1:] + imm_uop = rest[:1] if rest and rest[0].op is Ops.CONST else (None,) + return _encode(x, *address, *(None, *imm_uop)) if reg is None else _encode(None, *address, *(x if sel else None, *imm_uop)) + + if x.arg in X86GroupOp.Rm2nd: + if len(x.src) > 4: address, rest = x.src[1:5], x.src[:1] + x.src[5:] + else: address, rest = (x.src[1], None, None, None), x.src[:1] + x.src[2:] + # cmp/vucomiss reg, rm don't define a new register + return _encode(x, *address, *rest) if x.dtype is not dtypes.void else _encode(rest[0], *address) + + return None + +# https://www.felixcloutier.com/x86/ +# legacy version -> VEX version +# prefix field: None -> 0 | 66 -> 1 | F3 -> 2 | F2 -> 3 +# opcode map select: 0F -> 1 | 0F38 -> 2 | 0F3A -> 3 +encodings = { + # moves + X86Ops.MOVABS: lambda x: + bytes([0b0100 << 4 | 0b1 << 3 | 0b00 << 2 | greg(x).index >> 3, 0xB8 + (greg(x).index & 0b111)]) + struct.pack(x.dtype.fmt, x.src[0].val), + X86Ops.MOV: lambda x: encode(x, 0x8B), X86Ops.MOVi: lambda x: encode(x, 0xC7, reg=0), + X86Ops.MOVm: lambda x: encode(x, 0x89), X86Ops.LEA: lambda x: encode(x, 0x8D), + X86Ops.VMOVSS: lambda x: encode(x, 0x10, pp=2, sel=1), X86Ops.VMOVSSm: lambda x: encode(x, 0x11, pp=2, sel=1), + X86Ops.VMOVSD: lambda x: encode(x, 0x10, pp=3, sel=1), X86Ops.VMOVSDm: lambda x: encode(x, 0x11, pp=3, sel=1), + X86Ops.VMOVUPS: lambda x: encode(x, 0x10, pp=0, sel=1), X86Ops.VMOVUPSm: lambda x: encode(x, 0x11, pp=0, sel=1), + X86Ops.VMOVD: lambda x: encode(x, 0x6E, pp=1, sel=1), X86Ops.VMOVQ: lambda x: encode(x, 0x6E, pp=1, sel=1, we=1), + X86Ops.VMOVDm: lambda x: encode(x, 0x7E, pp=1, sel=1), X86Ops.VMOVQm: lambda x: encode(x, 0x7E, pp=1, sel=1, we=1), + # casts + X86Ops.MOVZX: lambda x: encode(x, 0x0FB7), + X86Ops.MOVSX: lambda x: encode(x, 0x0FBF), X86Ops.MOVSXD: lambda x: encode(x, 0x63), + X86Ops.VPMOVZXBW: lambda x: encode(x, 0x30, pp=1, sel=2), X86Ops.VPMOVZXBD: lambda x: encode(x, 0x31, pp=1, sel=2), + X86Ops.VPMOVZXBQ: lambda x: encode(x, 0x32, pp=1, sel=2), X86Ops.VPMOVZXWD: lambda x: encode(x, 0x33, pp=1, sel=2), + X86Ops.VPMOVZXWQ: lambda x: encode(x, 0x34, pp=1, sel=2), X86Ops.VPMOVZXDQ: lambda x: encode(x, 0x35, pp=1, sel=2), + X86Ops.VPMOVSXBW: lambda x: encode(x, 0x20, pp=1, sel=2), X86Ops.VPMOVSXBD: lambda x: encode(x, 0x21, pp=1, sel=2), + X86Ops.VPMOVSXBQ: lambda x: encode(x, 0x22, pp=1, sel=2), X86Ops.VPMOVSXWD: lambda x: encode(x, 0x23, pp=1, sel=2), + X86Ops.VPMOVSXWQ: lambda x: encode(x, 0x24, pp=1, sel=2), X86Ops.VPMOVSXDQ: lambda x: encode(x, 0x25, pp=1, sel=2), + X86Ops.VCVTSS2SD: lambda x: encode(x, 0x5A, pp=2, sel=1), X86Ops.VCVTSD2SS: lambda x: encode(x, 0x5A, pp=3, sel=1), + X86Ops.VCVTPH2PS: lambda x: encode(x, 0x13, pp=1, sel=2), X86Ops.VCVTPS2PH: lambda x: encode(x, 0x1D, pp=1, sel=3), + X86Ops.VCVTDQ2PS: lambda x: encode(x, 0x5B, pp=0, sel=1), X86Ops.VCVTDQ2PD: lambda x: encode(x, 0xE6, pp=2, sel=1), + X86Ops.VCVTPS2PD: lambda x: encode(x, 0x5A, pp=0, sel=1), X86Ops.VCVTPD2PS: lambda x: encode(x, 0x5A, pp=1, sel=1), + X86Ops.VCVTTPS2DQ: lambda x: encode(x, 0x5B, pp=2, sel=1), X86Ops.VCVTTPD2DQ: lambda x: encode(x, 0xE6, pp=1, sel=1), + # the int src is the 2nd src (the rm field), if it was folded into a memory operand its width is the element size of the address + X86Ops.VCVTSI2SS: lambda x: encode(x, 0x2A, pp=2, sel=1, we=(x.src[4].val if len(x.src) > 4 else x.src[1].dtype.itemsize) == 8), + X86Ops.VCVTSI2SD: lambda x: encode(x, 0x2A, pp=3, sel=1, we=(x.src[4].val if len(x.src) > 4 else x.src[1].dtype.itemsize) == 8), + X86Ops.VCVTTSS2SI: lambda x: encode(x, 0x2C, pp=2, sel=1, we=x.dtype.itemsize == 8), + X86Ops.VCVTTSD2SI: lambda x: encode(x, 0x2C, pp=3, sel=1, we=x.dtype.itemsize == 8), + # int division + X86Ops.IDIV: lambda x: encode(x, 0xF7, reg=7), X86Ops.DIV: lambda x: encode(x, 0xF7, reg=6), + # scalar int binary + X86Ops.SHL: lambda x: encode(x, 0xD3, reg=4), X86Ops.SHLi: lambda x: encode(x, 0xC1, reg=4), + X86Ops.SHR: lambda x: encode(x, 0xD3, reg=5), X86Ops.SHRi: lambda x: encode(x, 0xC1, reg=5), + X86Ops.SAR: lambda x: encode(x, 0xD3, reg=7), X86Ops.SARi: lambda x: encode(x, 0xC1, reg=7), + X86Ops.ADD: lambda x: encode(x, 0x03), X86Ops.ADDi: lambda x: encode(x, 0x81, reg=0), + X86Ops.SUB: lambda x: encode(x, 0x2B), X86Ops.SUBi: lambda x: encode(x, 0x81, reg=5), + X86Ops.AND: lambda x: encode(x, 0x23), X86Ops.ANDi: lambda x: encode(x, 0x81, reg=4), + X86Ops.XOR: lambda x: encode(x, 0x33), X86Ops.XORi: lambda x: encode(x, 0x81, reg=6), + X86Ops.OR: lambda x: encode(x, 0x0B), X86Ops.ORi: lambda x: encode(x, 0x81, reg=1), + X86Ops.CMP: lambda x: encode(x, 0x3B), X86Ops.CMPi: lambda x: encode(x, 0x81, reg=7), + X86Ops.IMUL: lambda x: encode(x, 0x0FAF), X86Ops.IMULi: lambda x: encode(x, 0x69), + X86Ops.SETB: lambda x: encode(x, 0x0F92, reg=0), X86Ops.SETL: lambda x: encode(x, 0x0F9C, reg=0), + X86Ops.SETE: lambda x: encode(x, 0x0F94, reg=0), X86Ops.SETNE: lambda x: encode(x, 0x0F95, reg=0), + # packed bitwise NOTE: only bitwise and packed + X86Ops.VPAND: lambda x: encode(x, 0xDB, pp=1, sel=1), X86Ops.VPXOR: lambda x: encode(x, 0xEF, pp=1, sel=1), + X86Ops.VPOR: lambda x: encode(x, 0xEB, pp=1, sel=1), + # unary + X86Ops.VSQRTSS: lambda x: encode(x, 0x51, pp=2, sel=1), X86Ops.VSQRTPS: lambda x: encode(x, 0x51, pp=0, sel=1), + X86Ops.VSQRTSD: lambda x: encode(x, 0x51, pp=3, sel=1), X86Ops.VSQRTPD: lambda x: encode(x, 0x51, pp=1, sel=1), + X86Ops.VROUNDSS: lambda x: encode(x, 0x0A, pp=1, sel=3), X86Ops.VROUNDPS: lambda x: encode(x, 0x08, pp=1, sel=3), + X86Ops.VROUNDSD: lambda x: encode(x, 0x0B, pp=1, sel=3), X86Ops.VROUNDPD: lambda x: encode(x, 0x09, pp=1, sel=3), + # packed int binary + X86Ops.VPSLLVD: lambda x: encode(x, 0x47, pp=1, sel=2), X86Ops.VPSLLVQ: lambda x: encode(x, 0x47, pp=1, sel=2, we=1), + X86Ops.VPSRLVD: lambda x: encode(x, 0x45, pp=1, sel=2), X86Ops.VPSRLVQ: lambda x: encode(x, 0x45, pp=1, sel=2, we=1), + X86Ops.VPCMPGTB: lambda x: encode(x, 0x64, pp=1, sel=1), X86Ops.VPCMPGTW: lambda x: encode(x, 0x65, pp=1, sel=1), + X86Ops.VPCMPGTD: lambda x: encode(x, 0x66, pp=1, sel=1), X86Ops.VPCMPGTQ: lambda x: encode(x, 0x37, pp=1, sel=2), + X86Ops.VPCMPEQB: lambda x: encode(x, 0x74, pp=1, sel=1), X86Ops.VPCMPEQW: lambda x: encode(x, 0x75, pp=1, sel=1), + X86Ops.VPCMPEQD: lambda x: encode(x, 0x76, pp=1, sel=1), X86Ops.VPCMPEQQ: lambda x: encode(x, 0x29, pp=1, sel=2), + X86Ops.VPMULLW: lambda x: encode(x, 0xD5, pp=1, sel=1), X86Ops.VPMULLD: lambda x: encode(x, 0x40, pp=1, sel=2), + X86Ops.VPADDB: lambda x: encode(x, 0xFC, pp=1, sel=1), X86Ops.VPADDW: lambda x: encode(x, 0xFD, pp=1, sel=1), + X86Ops.VPADDD: lambda x: encode(x, 0xFE, pp=1, sel=1), X86Ops.VPADDQ: lambda x: encode(x, 0xD4, pp=1, sel=1), + X86Ops.VPSUBB: lambda x: encode(x, 0xF8, pp=1, sel=1), X86Ops.VPSUBW: lambda x: encode(x, 0xF9, pp=1, sel=1), + X86Ops.VPSUBD: lambda x: encode(x, 0xFA, pp=1, sel=1), X86Ops.VPSUBQ: lambda x: encode(x, 0xFB, pp=1, sel=1), + X86Ops.VPSRAVD: lambda x: encode(x, 0x46, pp=1, sel=2), + # float cmp + X86Ops.VUCOMISS: lambda x: encode(x, 0x2E, pp=0, sel=1), X86Ops.VUCOMISD: lambda x: encode(x, 0x2E, pp=1, sel=1), + # scalar / packed float binary + X86Ops.VADDSS: lambda x: encode(x, 0x58, pp=2, sel=1), X86Ops.VADDPS: lambda x: encode(x, 0x58, pp=0, sel=1), + X86Ops.VADDSD: lambda x: encode(x, 0x58, pp=3, sel=1), X86Ops.VADDPD: lambda x: encode(x, 0x58, pp=1, sel=1), + X86Ops.VSUBSS: lambda x: encode(x, 0x5C, pp=2, sel=1), X86Ops.VSUBPS: lambda x: encode(x, 0x5C, pp=0, sel=1), + X86Ops.VSUBSD: lambda x: encode(x, 0x5C, pp=3, sel=1), X86Ops.VSUBPD: lambda x: encode(x, 0x5C, pp=1, sel=1), + X86Ops.VMULSS: lambda x: encode(x, 0x59, pp=2, sel=1), X86Ops.VMULPS: lambda x: encode(x, 0x59, pp=0, sel=1), + X86Ops.VMULSD: lambda x: encode(x, 0x59, pp=3, sel=1), X86Ops.VMULPD: lambda x: encode(x, 0x59, pp=1, sel=1), + X86Ops.VDIVSS: lambda x: encode(x, 0x5E, pp=2, sel=1), X86Ops.VDIVPS: lambda x: encode(x, 0x5E, pp=0, sel=1), + X86Ops.VDIVSD: lambda x: encode(x, 0x5E, pp=3, sel=1), X86Ops.VDIVPD: lambda x: encode(x, 0x5E, pp=1, sel=1), + X86Ops.VCMPSS: lambda x: encode(x, 0xC2, pp=2, sel=1), X86Ops.VCMPPS: lambda x: encode(x, 0xC2, pp=0, sel=1), + X86Ops.VCMPSD: lambda x: encode(x, 0xC2, pp=3, sel=1), X86Ops.VCMPPD: lambda x: encode(x, 0xC2, pp=1, sel=1), + # ternary + X86Ops.CMOVB: lambda x: encode(x, 0x0F42), X86Ops.CMOVL: lambda x: encode(x, 0x0F4C), + X86Ops.CMOVE: lambda x: encode(x, 0x0F44), X86Ops.CMOVNE: lambda x: encode(x, 0x0F45), + X86Ops.VBLENDVPS: lambda x: encode(x, 0x4A, pp=1, sel=3), X86Ops.VBLENDVPD: lambda x: encode(x, 0x4B, pp=1, sel=3), + X86Ops.VPBLENDVB: lambda x: encode(x, 0x4C, pp=1, sel=3), + # shuffles + X86Ops.VPSRLDQ: lambda x: encode(x, 0x73, reg=3, pp=1, sel=1), + X86Ops.VPINSRB: lambda x: encode(x, 0x20, pp=1, sel=3), X86Ops.VPINSRW: lambda x: encode(x, 0xC4, pp=1, sel=1), + X86Ops.VPINSRD: lambda x: encode(x, 0x22, pp=1, sel=3), X86Ops.VPINSRQ: lambda x: encode(x, 0x22, pp=1, sel=3, we=1), + X86Ops.VINSERTPS: lambda x: encode(x, 0x21, pp=1, sel=3), + # extract + X86Ops.VPEXTRB: lambda x: encode(x, 0x14, pp=1, sel=3), X86Ops.VPEXTRW: lambda x: encode(x, 0x15, pp=1, sel=3), + X86Ops.VPEXTRD: lambda x: encode(x, 0x16, pp=1, sel=3), X86Ops.VPEXTRQ: lambda x: encode(x, 0x16, pp=1, sel=3, we=1), + # jumps are encoded with a placeholder which gets patched later once the real offset is known + X86Ops.JE: lambda x: bytes([0x0F, 0x84]) + int(0).to_bytes(4), + X86Ops.JNE: lambda x: bytes([0x0F, 0x85]) + int(0).to_bytes(4), + X86Ops.JL: lambda x: bytes([0x0F, 0x8C]) + int(0).to_bytes(4), + X86Ops.JB: lambda x: bytes([0x0F, 0x82]) + int(0).to_bytes(4), + X86Ops.JGE: lambda x: bytes([0x0F, 0x8D]) + int(0).to_bytes(4), + X86Ops.JMP: lambda x: bytes([0xE9]) + int(0).to_bytes(4), + X86Ops.RET: lambda x: bytes([0xC3]), +} + +class X86Renderer(ISARenderer): + device = "CPU" + has_local = False + has_threads = bool(getenv("THREADS", 1)) + global_max = (NUM_CPU_THREADS.value, 0, 0) + extra_matcher = extra_matcher + pre_isel_matcher = pre_isel_matcher + isel_matcher = isel_matcher + pre_regalloc_matcher = pre_regalloc_matcher + post_regalloc_matcher = post_regalloc_matcher + code_for_op = {x: lambda: None for x in (Ops.SQRT, Ops.AND, Ops.OR, Ops.SHL, Ops.SHR, Ops.NEG, Ops.SUB, Ops.FDIV, Ops.CMPLT, Ops.CMPEQ)} + def __init__(self, target:Target): + if target.arch.split(",")[0] != "x86_64": raise RuntimeError(f"X86Renderer only supports x86_64, got {target.arch}") + super().__init__(target) + from tinygrad.runtime.support.compiler_cpu import X86Compiler + self.compiler = X86Compiler() + def is_two_address(self, x:UOp) -> bool: return x.arg in X86GroupOp.TwoAddress + def stack_pointer(self) -> UOp: return def_reg(dtypes.uint64, RSP) + # the value of a BUFFER is its address, it moves through registers and the stack as a 64bit int + def copy(self, x:UOp, reg:Register): + dt = dtypes.uint64 if x.op is Ops.BUFFER else x.dtype + ret = isel_matcher.rewrite(UOp(Ops.COPY, dt, (x,), tag=reg)) + assert ret is not None, f"failed to copy {x}" + return ret + + def spill(self, disp:UOp, x:UOp) -> UOp: + if x.op is Ops.BUFFER: x = x.replace(dtype=dtypes.uint64) + is_xmm = isinstance(x.tag, tuple) and x.tag[0].cons[0].size == 16 + op = X86Ops.VMOVUPSm if is_xmm else X86Ops.MOVm + return UOp(Ops.INS, dtypes.void, fold_address(self.stack_pointer().index(disp)) + (x,), op, x.tag) + + def fill(self, disp:UOp, x:UOp, reg:Register) -> UOp: + is_xmm = reg.cons[0].size == 16 + dt = dtypes.uint64 if x.op is Ops.BUFFER else x.dtype + return UOp(Ops.INS, dt, fold_address(self.stack_pointer().index(disp)), X86Ops.VMOVUPS if is_xmm else X86Ops.MOV, (reg,)) + + def asm_str(self, uops:list[UOp], function_name:str) -> str: + def _format_op(x:UOp) -> str: return f" {(o[7:-1] if (o:=str(x.arg))[-1] in ('i', 'm') else o[7:]).lower():7s}" + def _format_operands(x:UOp) -> str: + def _format(src:tuple[UOp, ...]) -> list[str]: + return [str(s.val) if s.op is Ops.CONST else reg_strs[o].get(s.dtype.itemsize, o) if \ + (o:=str(greg(s))) in reg_strs else o for s in src if greg(s) is not None] + def _mem_adress(base:UOp, idx:UOp, disp:UOp, sz:UOp) -> list[str]: + return [f"[{greg(base)}" + (f" + {greg(idx)}*{sz.val}" if greg(idx) else "") + (f" + {disp.val}" if disp.val else "") + "]"] + + if len(x.src) > 4 and x.arg in X86GroupOp.WriteMem: ret = _mem_adress(*x.src[:4]) + _format(x.src[4:]) + elif len(x.src) > 3 and x.arg in X86GroupOp.Rm1st: ret = _format((x,)) + _mem_adress(*x.src[:4]) + _format(x.src[4:]) + elif len(x.src) > 4 and x.arg in X86GroupOp.Rm2nd: ret = _format((x, x.src[0])) + _mem_adress(*x.src[1:5]) + _format(x.src[5:]) + else: ret = _format((x,) + x.src) + return ", ".join(ret) + + asm = [f".{function_name}:"] + for u in uops: + if u.op is not Ops.INS or u.arg is X86Ops.DEFINE: continue + if u.arg is X86Ops.LABEL: asm.append(f"{str(u.tag)}:") + elif u.arg is X86Ops.RET: asm.append(_format_op(u)) + else: asm.append(_format_op(u) + " " + _format_operands(u)) + return "\n".join(asm) + + def render(self, uops:list[UOp]) -> str: + targets: dict[str, int] = {} + jumps: dict[UOp, int] = {} + binary = bytearray() + for u in uops: + if u.op is not Ops.INS or u.arg is X86Ops.DEFINE: continue + if u.arg is X86Ops.LOOP_CMP: continue + if u.arg is X86Ops.LABEL: + targets[u.tag] = len(binary) + continue + if u.arg not in encodings or (l:=encodings[u.arg](u)) is None: + raise RuntimeError(f"failed to encode {u.arg} with {u.dtype} srcs {[x.dtype for x in u.src]}") + binary.extend(l) + if u.arg in (X86Ops.JL, X86Ops.JB, X86Ops.JE, X86Ops.JNE, X86Ops.JGE, X86Ops.JMP): jumps[u] = len(binary) + # fixup jump targets now that encoding size is known + for u in uops: + if (t:=jumps.get(u)) is not None: binary[t-4:t] = (targets[u.tag] - t).to_bytes(4, 'little', signed=True) + return binary.hex() + + def supported_dtypes(self): return {d for d in super().supported_dtypes() if d not in dtypes.fp8s+(dtypes.bfloat16,)} diff --git a/artifacts/package_runtime/tinygrad/renderer/llvmir.py b/artifacts/package_runtime/tinygrad/renderer/llvmir.py new file mode 100644 index 000000000..99da4d134 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/llvmir.py @@ -0,0 +1,321 @@ +import math, struct, sys +from tinygrad.codegen.opt import tc +from tinygrad.renderer import Renderer +from tinygrad.renderer.cstyle import HIPRenderer, create_non_native_float_pats, pm_manual_bf16_cast +from tinygrad.codegen.decomp.transcendental import xexp2, xlog2 +from tinygrad.uop.ops import UOp, PatternMatcher, UPat, Ops, GroupOp, range_str +from tinygrad.dtype import dtypes, float_to_fp8, DType, truncate, AddrSpace +from tinygrad.helpers import prod, Target, NUM_CPU_THREADS, getenv, OSX + +def is_volatile(u:UOp) -> bool: return (buf:=u.buf_uop).op is Ops.PARAM and buf.arg.volatile + +def ldt(dt:DType, count=1, ptr=False): + if ptr: return ldt(dt, count) + "*" + if count > 1: return f"<{count} x {ldt(dt, 1, ptr)}>" + return {dtypes.void: "void", dtypes.bool: "i1", dtypes.int8: "i8", dtypes.int16: "i16", dtypes.int32: "i32", dtypes.int64: "i64", + dtypes.uint8: "i8", dtypes.uint16: "i16", dtypes.uint32: "i32", dtypes.uint64: "i64", dtypes.fp8e4m3: "i8", dtypes.fp8e5m2: "i8", + dtypes.float16: "half", dtypes.bfloat16: "bfloat", dtypes.float32: "float", dtypes.float64: "double"}[dt] + +def lconst(x, dtype:DType): + if dtype in dtypes.floats: + if dtype in dtypes.fp8s: return float_to_fp8(x, dtype) + if math.isinf(x) or math.isnan(x): return "0x%02X%02X%02X%02X%02X%02X%02X%02X" % tuple(struct.pack("d",x)[::-1]) + return truncate[dtype](x) + return int(x) + +def lcast(input_type:DType, output_type:DType): + if dtypes.is_float(input_type): + if dtypes.is_float(output_type): return 'fpext' if output_type.itemsize > input_type.itemsize else 'fptrunc' + if dtypes.is_int(output_type): return 'fptoui' if dtypes.is_unsigned(output_type) else 'fptosi' + if dtypes.is_unsigned(input_type) or dtypes.is_bool(input_type): + if dtypes.is_float(output_type): return 'uitofp' + if dtypes.is_int(output_type): return 'trunc' if output_type.itemsize < input_type.itemsize else 'zext' + if dtypes.is_int(input_type): + if dtypes.is_float(output_type): return 'sitofp' + if dtypes.is_int(output_type): return 'trunc' if output_type.itemsize < input_type.itemsize else 'sext' + raise NotImplementedError(f"cast from {input_type} -> {output_type} not implemented") + +def render_wmma_amd(ctx, wmma: UOp, cdna=False, rdna4=False) -> str: + dt_map = {dtypes.half: "f16", dtypes.float: "f32", dtypes.ushort: "bf16.1k" if cdna else "bf16", dtypes.bfloat16: "bf16.1k" if cdna else "bf16", + dtypes.fp8e4m3: ".fp8.fp8", dtypes.fp8e5m2: ".bf8.bf8", dtypes.int8: "iu8", dtypes.int32: "i32"} + # https://github.com/llvm/llvm-project/blob/main/clang/test/CodeGenOpenCL/builtins-amdgcn-mfma.cl + N,M,K = wmma.arg[0] + if cdna: + if K == 32: dt_map.update({dtypes.half: ".f16", dtypes.bfloat16: ".bf16"}) + scaled = K == 128 + args = [f"{ldt(w.dtype, w.max_numel())} {ctx[w]}" for w in wmma.src] + # scaled mfma call require E8M0 scale args, byte = 0x7F = 127, scale = 2^(127 - 127) = 1.0 + if scaled: + _fmt = { dtypes.fp8e5m2:1, dtypes.fp8e4m3:0 } + # (a_fp8_fmt, b_fp8_fmt, opsel, scale_a, opsel, scale_b) + args.extend([f"i32 {_fmt[wmma.arg[1]]}", f"i32 {_fmt[wmma.arg[1]]}", "i32 0", "i32 127", "i32 0", "i32 127"]) + else: args.extend(["i32 0", "i32 0", "i32 0"]) # (cbsz, blgp, ?) + + scale = "scale." if scaled else "" + dt_in = dt_map[wmma.arg[1]] if not scaled else ".f8f6f4" + return f" {ctx[wmma]} = call {ldt(wmma.dtype, wmma.max_numel())} @llvm.amdgcn.mfma.{scale}{dt_map[wmma.src[-1].dtype]}" + \ + f".{N}x{M}x{K}{dt_in}(" + ", ".join(args) + ")" + # https://github.com/llvm/llvm-project/blob/main/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.amdgcn.wmma_32.ll + # example: %wmma0 = call <8 x float> @llvm.amdgcn.wmma.f32.16x16x16.f16(<16 x half> %v99,<16 x half> %v100,<8 x float> %v101) + args = [f"{ldt(w.dtype, w.max_numel())} {ctx[w]}" for w in wmma.src] + if wmma.arg[1] == dtypes.int8: args = ["i1 true", args[0], "i1 true", args[1], args[2]] # iu8 flags A/B signed + if wmma.dtype != dtypes.float: args.append("i1 false") # opsel + def _bf16(dt:DType): return dtypes.ushort if dt is dtypes.bfloat16 else dt + suffix = f".v{wmma.max_numel()}{dt_map[_bf16(wmma.dtype)]}.v{wmma.src[0].max_numel()}{dt_map[_bf16(wmma.arg[1])]}" if rdna4 else "" + # bfloat treated as i16 in LLVM call + return f" {ctx[wmma]} = call {ldt(_bf16(wmma.dtype), wmma.max_numel())} @llvm.amdgcn.wmma.{dt_map[wmma.src[-1].dtype]}.16x16x16." + \ + f"{dt_map[wmma.arg[1]]}{suffix}(" + ", ".join(args) + ")" + +# llvm ops, lop[][] +unsigned_lop = { Ops.ADD: "add", Ops.MUL: "mul", Ops.CDIV: "udiv", Ops.CMOD: "urem", + Ops.CMPLT: "icmp ult", Ops.CMPNE: "icmp ne", Ops.CMPEQ: "icmp eq", Ops.OR: "or", Ops.AND: "and", Ops.XOR: "xor", + Ops.SHL: "shl", Ops.SHR: "lshr",} +signed_lop = {**unsigned_lop, Ops.ADD: "add nsw", Ops.CMPLT: "icmp slt", Ops.CDIV: "sdiv", Ops.CMOD: "srem", Ops.SHR: "ashr"} +flags = " nsz arcp contract afn" +float_lop = {Ops.ADD: "fadd"+flags, Ops.MUL: "fmul"+flags, Ops.CMPLT: f"fcmp{flags} olt", + Ops.CMPNE: f"fcmp{flags} une", Ops.CMPEQ: f"fcmp{flags} oeq", Ops.FDIV: "fdiv"+flags} +lop = {**{x:unsigned_lop for x in (dtypes.bool,)+dtypes.uints}, **{x:signed_lop for x in dtypes.sints}, **{x:float_lop for x in dtypes.floats}} + +base_rewrite = PatternMatcher([ + # memory load/store + (UPat((Ops.INDEX, Ops.SHRINK), src=(UPat((Ops.BUFFER, Ops.PARAM, Ops.AFTER)),), allow_any_len=True, name="x"), lambda ctx,x: + f" {ctx[x]} = getelementptr inbounds {ldt(x.dtype)}, {ldt(x.dtype, ptr=True)} {ctx[x.src[0]]}, {ldt(x.src[1].dtype)} {ctx[x.src[1]]}"), + # register index + (UPat(Ops.INDEX, src=(UPat.var("buf"), UPat.cvar("idx")), name="x"), lambda ctx,buf,idx,x: + f" {ctx[x]} = extractelement {ldt(buf.dtype, buf.max_numel())} {ctx[buf]}, i32 {idx.val}" if buf.addrspace == AddrSpace.ALU else None), + + # load/store + (UPat(Ops.LOAD, src=(UPat.var("idx"), UPat.var("alt"), UPat.var("mask")), name="x"), + lambda ctx,x,idx,alt,mask: + f" br label {ctx[x]}_entry\n{ctx[x][1:]}_entry:\n" + f" br i1 {ctx[mask]}, label {ctx[x]}_load, label {ctx[x]}_exit\n{ctx[x][1:]}_load:\n" + f" {ctx[x]}_yes = load {'volatile ' if is_volatile(idx) else ''}{ldt(idx.dtype, idx.max_numel())}, " + f"{ldt(idx.dtype, idx.max_numel(), True)} {ctx[idx]}\n" + f" br label {ctx[x]}_exit\n{ctx[x][1:]}_exit:\n" + f" {ctx[x]} = phi {ldt(x.dtype, x.max_numel())} [{ctx[x]}_yes, {ctx[x]}_load], [{ctx[alt]}, {ctx[x]}_entry]"), + (UPat.var('idx').load(name="x"), lambda ctx,x,idx: + f" {ctx[x]} = load {'volatile ' if is_volatile(idx) else ''}{ldt(idx.dtype, idx.max_numel())}, " + f"{ldt(idx.dtype, idx.max_numel(), True)} {ctx[idx]}"), + (UPat.var('idx').store(UPat.var("var")), lambda ctx,idx,var: + f" store {'volatile ' if is_volatile(idx) else ''}{ldt(var.dtype, idx.max_numel())} {ctx[var]}, " + f"{ldt(idx.dtype, idx.max_numel(), True)} {ctx[idx]}"), + + # GEP/VECTORIZE/CAST for float4 support + (UPat(Ops.STACK, name="x"), lambda ctx,x: + "\n".join([(f" {ctx[x]}_{i}" if i+1 != len(x.src) else f" {ctx[x]}")+ + f" = insertelement {ldt(x.dtype, x.max_numel())} "+(f"{ctx[x]}_{i-1}" if i != 0 else "poison")+ + f", {ldt(u.dtype)} {ctx[u]}, i32 {i}" for i,u in enumerate(x.src)])), + # unary/binary/ternary ops + (UPat(Ops.BITCAST, name="x"), lambda ctx,x: + f" {ctx[x]} = bitcast {ldt(x.src[0].dtype, x.src[0].max_numel())} {ctx[x.src[0]]} to {ldt(x.dtype, x.max_numel())}"), + (UPat(Ops.CAST, name="x"), lambda ctx,x: f" {ctx[x]} = {lcast(x.src[0].dtype, x.dtype)} {ldt(x.src[0].dtype)} {ctx[x.src[0]]} to {ldt(x.dtype)}"), + (UPat(Ops.TRUNC, name="x"), + lambda ctx,x: f" {ctx[x]} = call {ldt(x.dtype)} @llvm.trunc.{ldt(x.dtype)}({ldt(x.src[0].dtype)} {ctx[x.src[0]]})"), + (UPat(GroupOp.Binary, name="x"), lambda ctx,x: + f" {ctx[x]} = {lop[x.src[0].dtype][x.op]} {ldt(x.src[0].dtype)} {ctx[x.src[0]]}, {ctx[x.src[1]]}"), + (UPat(Ops.WHERE, name="x"), lambda ctx,x: + f" {ctx[x]} = select {ldt(x.src[0].dtype)} {ctx[x.src[0]]}, {ldt(x.src[1].dtype)} {ctx[x.src[1]]}, {ldt(x.src[2].dtype)} {ctx[x.src[2]]}"), + + # loop (a RANGE with no src is an unbounded loop header) + (UPat(Ops.RANGE, dtypes.void, name="l"), lambda ctx,l: f" br label %loop_{ctx[l][1:]}\nloop_{ctx[l][1:]}:"), + (UPat(Ops.END, src=(UPat(), UPat(Ops.RANGE, dtypes.void, name="l"), UPat(name="c"))), lambda ctx,l,c: + f" br i1 {ctx[c]}, label %loop_{ctx[l][1:]}, label %loop_exit_{ctx[l][1:]}\nloop_exit_{ctx[l][1:]}:"), + + # range + (UPat(Ops.RANGE, name="r"), lambda ctx,r: + f" br label %loop_entry_{range_str(r)}\n" + f"loop_entry_{range_str(r)}:\n" + f" br label %loop_latch_{range_str(r)}\n" + f"loop_latch_{range_str(r)}:\n" + f" {ctx[r]} = phi {ldt(r.dtype)} [ 0, %loop_entry_{range_str(r)} ], [ {ctx[r]}phi, %loop_footer_{range_str(r)} ]\n" + f" {ctx[r]}phi = add {ldt(r.dtype)} {ctx[r]}, 1\n" + f" {ctx[r]}cmp = icmp ult {ldt(r.dtype)} {ctx[r]}, {ctx[r.src[0]]}\n" + f" br i1 {ctx[r]}cmp, label %loop_body_{range_str(r)}, label %loop_exit_{range_str(r)}\n" + f"loop_body_{range_str(r)}:"), + (UPat(Ops.END, src=(UPat(), UPat(Ops.RANGE, name="r"))), lambda r: + f" br label %loop_footer_{range_str(r)}\n" + f"loop_footer_{range_str(r)}:\n" + f" br label %loop_latch_{range_str(r)}\n" + f"loop_exit_{range_str(r)}:"), + + # if + (UPat(Ops.IF, name="x"), lambda ctx,x: f" br i1 {ctx[x.src[0]]}, label %ifbody_{ctx[x][1:]}, label %ifskip_{ctx[x][1:]}\nifbody_{ctx[x][1:]}:"), + (UPat(Ops.ENDIF, name="x"), lambda ctx,x: f" br label %ifskip_{ctx[x.src[0]][1:]}\nifskip_{ctx[x.src[0]][1:]}:"), + + (UPat(Ops.BARRIER), lambda ctx: "") +]) + +class LLVMRenderer(Renderer): + abi: str | None + string_rewrite: PatternMatcher + code_for_op = {k:lambda:None for v in lop.values() for k in v.keys()} + + extra_matcher = create_non_native_float_pats((dtypes.bfloat16,)) + pm_manual_bf16_cast + def _render_fn(self, name:str, args:list[tuple[str,UOp]], kernel:list[str], prefix:list[str]|None=None) -> str: + # NOTE: CPUAllocator promises 0x20 alignment + sargs = ", ".join([f"{ldt(u.dtype, ptr=u.addrspace == AddrSpace.GLOBAL)}{' noalias align 32' if u.addrspace == AddrSpace.GLOBAL else ''} " + \ + name for name,u in args]) + return "\n".join((prefix or []) + [f"define{' ' + self.abi if self.abi else ''} void @{name}({sargs}) #0", "{"] + kernel + [" ret void\n}"]) + def _render_kernel(self, uops: list[UOp], prefix:list[str]|None=None) -> tuple[tuple[str, ...], str]: + r: dict[UOp, str] = {} + args: list[tuple[str, UOp]] = [] + kernel: list[str] = [] + vc = -1 + + local_args: list[str] = [] + name = "test" + for u in uops: + if u.op in {Ops.NOOP, Ops.GROUP}: continue + if u.op is Ops.AFTER: + r[u] = r[u.src[0]] + continue + if u.op is Ops.SINK: + if u.arg is not None: name = u.arg.function_name + continue + if u.op is Ops.PARAM: + r[u] = f"%data{u.arg.slot}" + args.append((r[u], u)) + elif u.op is Ops.BUFFER: + r[u] = f"%{'local' if u.addrspace == AddrSpace.LOCAL else 'reg'}_{str(u.arg.slot)}" + size = u.max_numel() + if u.addrspace == AddrSpace.REG: + kernel.append(f" {r[u]} = alloca [{size} x {ldt(u.dtype)}]") + elif self.has_local: + local_args.append(f"@{r[u][1:]} = internal unnamed_addr addrspace(3) global [{size} x {ldt(u.dtype)}] undef, align 16") + kernel.append(f" {r[u]} = addrspacecast [{size} x {ldt(u.dtype)}] addrspace(3)* @{r[u][1:]} to [{size} x {ldt(u.dtype)}]*") + else: + kernel.append(f" {r[u]} = alloca [{size} x {ldt(u.dtype)}], align 16") + elif u.op is Ops.CONST: r[u] = lconst(u.val, u.dtype) + elif u.op is Ops.CAST and ldt(u.dtype) == ldt(u.src[0].dtype): + r[u] = r[u.src[0]] # cast from signed to unsigned of the same size is a noop, or pointer cast + else: + # if it's an assign target, it's already preallocated + if u not in r: + vc += 1 + r[u] = f"%v{vc}" + + # do the rendering of the llvm ir code + l: str|None = self.string_rewrite.rewrite(u, ctx=r) + if l is None: + raise RuntimeError(f"failed to render {u.op} with {u.dtype} srcs {[x.dtype for x in u.src]}") + kernel.append(l) + return tuple(local_args), self._render_fn(name, args, kernel, prefix) + +class CPULLVMRenderer(LLVMRenderer): + has_local = False + has_threads = bool(getenv("THREADS", 1)) + global_max = (NUM_CPU_THREADS.value, 0, 0) + abi = 'win64cc' if sys.platform == 'win32' else None + string_rewrite = base_rewrite + def render(self, uops: list[UOp]) -> str: return "\n".join((k:=self._render_kernel(uops))[0] + (k[1], self._render_footer(uops))) + def _render_footer(self, uops: list[UOp]) -> str: return 'attributes #0 = { alwaysinline nounwind "no-builtins" "no-trapping-math"="true" }' + def __init__(self, target:Target): + super().__init__(target) + from tinygrad.runtime.support.compiler_llvm import CPULLVMCompiler + self.compiler = CPULLVMCompiler(target.arch.split(",")) + + # FIXME: fp16 works on non-osx, but only if the cpu supports it + def supported_dtypes(self): + return {d for d in super().supported_dtypes() if + (d != dtypes.bfloat16 or self.target.arch.startswith(("x86", "arm"))) and (d != dtypes.half or OSX) and d not in dtypes.fp8s} + +barrier = 'fence syncscope("workgroup") release\ntail call void @llvm.amdgcn.s.barrier()\nfence syncscope("workgroup") acquire\n' +code_for_workitem = {"g": lambda x: f"tail call i32 @llvm.amdgcn.workgroup.id.{chr(120+int(x))}()", + "l": lambda x: f"tail call i32 @llvm.amdgcn.workitem.id.{chr(120+int(x))}()"} +# https://rocm.docs.amd.com/projects/llvm-project/en/latest/LLVM/llvm/html/AMDGPUUsage.html#llvm-ir-intrinsics +llvm_intrinsics = {Ops.SQRT: "sqrt", Ops.LOG2: "log2", Ops.EXP2: "exp2"} +class AMDLLVMRenderer(LLVMRenderer): + shared_max = HIPRenderer.shared_max + global_max = HIPRenderer.global_max + global_prod_max = HIPRenderer.global_prod_max + abi = "amdgpu_kernel" + code_for_op = {**LLVMRenderer.code_for_op, **{op: lambda: None for op in llvm_intrinsics}} + string_rewrite = PatternMatcher([ + (UPat(Ops.SPECIAL, name="x"), lambda ctx, x: f" {ctx[x]} = " + f"{ code_for_workitem[x.arg[0]](x.arg[-1])}; "), + (UPat(tuple(llvm_intrinsics), name="x"), + lambda ctx, x: f" {ctx[x]} = call {ldt(x.dtype)} @llvm.{llvm_intrinsics[x.op]}.{ldt(x.dtype)}({ldt(x.src[0].dtype)} {ctx[x.src[0]]})"), + (UPat(Ops.BARRIER), lambda ctx: barrier), + (UPat(Ops.CAST, dtypes.fp8s, (UPat(dtype=dtypes.float),), name="x",), lambda ctx,x: + f" {ctx[x]} = call i8 @f32_to_fp8({ldt(x.src[0].dtype)} {ctx[x.src[0]]}, i1 {'1' if x.dtype == dtypes.fp8e5m2 else '0'})"), + (UPat(Ops.CAST, dtypes.float, (UPat.var("y", dtypes.fp8s),), name="x",), lambda ctx,x,y: + f" {ctx[x.src[0]]}_i32 = zext i8 {ctx[x.src[0]]} to i32\n" + f" {ctx[x]} = call float @llvm.amdgcn.cvt.f32.{'bf8' if y.dtype == dtypes.fp8e5m2 else 'fp8'}(i32 {ctx[x.src[0]]}_i32, i32 0)"), + ]) + base_rewrite + extra_matcher = LLVMRenderer.extra_matcher + create_non_native_float_pats(dtypes.fp8s) + PatternMatcher([ + # amd llvm intrinsics llvm.log2/llvm.exp2 don't support double + (UPat(Ops.LOG2, dtype=dtypes.double, src=(UPat.var("d"),)), xlog2), + (UPat(Ops.EXP2, dtype=dtypes.double, src=(UPat.var("d"),)), xexp2), + ]) + def asm(self, prg: UOp, lin: UOp) -> bytes: + from tinygrad.renderer.amd.elf import assemble_linear + return assemble_linear(prg, lin, self.target.arch) + def render(self, uops: list[UOp]) -> str: + prefix = ["""define i8 @f32_to_fp8(float %val, i1 %is_bf8) { +entry: %ival = bitcast float %val to i32\n %exp = and i32 %ival, 2139095040\n %is_special = icmp eq i32 %exp, 2139095040 +br i1 %is_special, label %select_clip, label %clip +clip: br i1 %is_bf8, label %bf8_clip, label %fp8_clip +bf8_clip: %clamped_bf8 = call float @llvm.amdgcn.fmed3.f32(float %val, float 57344.0, float -57344.0)\n br label %select_clip +fp8_clip: %clamped_fp8 = call float @llvm.amdgcn.fmed3.f32(float %val, float 448.0, float -448.0) \n br label %select_clip +select_clip: %phi_val = phi float [%val, %entry], [%clamped_bf8, %bf8_clip], [%clamped_fp8, %fp8_clip]\n br i1 %is_bf8, label %do_bf8, label %do_fp8 +do_bf8: %packed_bf8 = call i32 @llvm.amdgcn.cvt.pk.bf8.f32(float %phi_val, float %phi_val, i32 0, i1 false)\n br label %exit +do_fp8: %packed_fp8 = call i32 @llvm.amdgcn.cvt.pk.fp8.f32(float %phi_val, float %phi_val, i32 0, i1 false)\n br label %exit +exit: %packed = phi i32 [%packed_bf8, %do_bf8], [%packed_fp8, %do_fp8]\n %trunc = trunc i32 %packed to i8\n ret i8 %trunc +}""".replace(": ", ":\n ")] if any(u.dtype in dtypes.fp8s for u in uops) else [] + return "\n".join((k:=self._render_kernel(uops, prefix))[0] + (k[1], self._render_footer(uops))) + def _render_footer(self, uops: list[UOp]) -> str: + # TODO: this is copied from cstyle + local_dims = [u.src[0] for u in uops if u.op is Ops.SPECIAL and u.arg[0] == "l"] + requiredMaxThreadsPerBlock = prod([d.vmax for d in local_dims]) + attributes = ["alwaysinline", "nounwind", '"no-builtins"', + f'"amdgpu-flat-work-group-size"="1,{requiredMaxThreadsPerBlock}"', '"no-trapping-math"="true"'] + return 'attributes #0 = { ' + ' '.join(attributes) + ' }' + @staticmethod + def is_rdna4(arch): return arch.split(':')[0] in {'gfx1200', 'gfx1201'} + def __init__(self, target:Target): + super().__init__(target) + from tinygrad.runtime.support.compiler_llvm import AMDLLVMCompiler + self.compiler, self.tensor_cores, self.is_cdna = AMDLLVMCompiler(target.arch), tc.get_amd(target.arch), HIPRenderer.is_cdna(target.arch) + self.string_rewrite += PatternMatcher([ + (UPat(Ops.WMMA, name="wmma"), lambda ctx, wmma, rdna4=AMDLLVMRenderer.is_rdna4(target.arch), cdna=self.is_cdna: + render_wmma_amd(ctx, wmma, cdna, rdna4)) + ]) + if self.is_cdna: + self.extra_matcher += PatternMatcher([ + (UPat(Ops.WMMA, name="x", dtype=dtypes.float), + lambda x: x.replace(src=(x.src[0].bitcast(dtypes.uint32), x.src[1].bitcast(dtypes.uint32), x.src[2])) + if x.arg[0][2] == 128 and x.src[0].dtype.itemsize <= 8 else None), + (UPat(Ops.WMMA, name="x", dtype=dtypes.float), + lambda x: x.replace(src=(x.src[0].bitcast(dtypes.uint16), x.src[1].bitcast(dtypes.uint16), x.src[2])) + if x.max_numel() == 4 and x.src[0].dtype == dtypes.bfloat16 and x.src[0].max_numel() == 4 else None), + (UPat(Ops.WMMA, name="x", dtype=dtypes.float), + lambda x: x.replace(src=(x.src[0].bitcast(dtypes.uint64), x.src[1].bitcast(dtypes.uint64), x.src[2])) + if x.max_numel() == 4 and x.src[0].dtype in dtypes.fp8_ocp and x.src[0].max_numel() == 8 else None), + ]) + if target.arch in {"gfx1100", "gfx1151"}: + self.extra_matcher += PatternMatcher([ + (UPat(Ops.WMMA, name="x", dtype=dtypes.int32), lambda x: x.replace( + src=(x.src[0].bitcast(dtypes.uint32), x.src[1].bitcast(dtypes.uint32), x.src[2])) + if x.src[0].dtype == dtypes.int8 and x.src[0].max_numel() == 16 else None), + (UPat(Ops.WMMA, name="x", dtype=dtypes.half), lambda x: UOp(Ops.STACK, src=tuple(x.replace( + src=(x.src[0], x.src[1], UOp(Ops.STACK, src=tuple(x.src[2].index(UOp.const(j//2, dtypes.int16)) + if j%2 == 0 else UOp.const(0.0, x.src[2].dtype) + for j in range(x.max_numel()*2)))), + arg=(*x.arg[:4], None)).index(UOp.const(i*2, dtypes.int16)) + for i in range(x.max_numel()))) if x.max_numel() == 8 else None), + (UPat(Ops.WMMA, name="x"), lambda x: x.replace( + src=(x.src[0].bitcast(dtypes.uint16), x.src[1].bitcast(dtypes.uint16), x.src[2])) + if x.src[0].dtype == dtypes.bfloat16 and x.src[0].max_numel() == 16 else None), + ]) + if target.arch in {"gfx1200", "gfx1201"}: + self.extra_matcher += PatternMatcher([ + (UPat(Ops.WMMA, name="x", dtype=dtypes.bfloat16), lambda x: x.replace( + dtype=dtypes.uint16, + src=(x.src[0].bitcast(dtypes.uint16), x.src[1].bitcast(dtypes.uint16), x.src[2].bitcast(dtypes.uint16))) + .bitcast(dtypes.bfloat16) if x.max_numel() == 8 and x.src[0].dtype == dtypes.bfloat16 and x.src[0].max_numel() == 8 else None), + (UPat(Ops.WMMA, name="x", dtype=dtypes.float), + lambda x: x.replace(src=(x.src[0].bitcast(dtypes.uint16), x.src[1].bitcast(dtypes.uint16), x.src[2])) + if x.max_numel() == 8 and x.src[0].dtype == dtypes.bfloat16 and x.src[0].max_numel() == 8 else None) + ]) + + def supported_dtypes(self): return {d for d in super().supported_dtypes() + if (d not in dtypes.fp8_ocp or self.target.arch == "gfx950") and d not in dtypes.fp8_fnuz} diff --git a/artifacts/package_runtime/tinygrad/renderer/nir.py b/artifacts/package_runtime/tinygrad/renderer/nir.py new file mode 100644 index 000000000..b0d3a38f2 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/nir.py @@ -0,0 +1,324 @@ +from typing import Callable, Any +from tinygrad.dtype import AddrSpace, DType, dtypes, truncate +from tinygrad.helpers import DEBUG, OSX, unwrap, fromimport, Target, is_image_shape, round_up +from tinygrad.renderer import Renderer +from tinygrad.renderer.cstyle import CUDARenderer +from tinygrad.uop.ops import GroupOp, Ops, UOp, PatternMatcher, UPat, range_str +from tinygrad.runtime.autogen import mesa, libc +from tinygrad.runtime.support.c import POINTER +import base64, ctypes, struct, functools, inspect, itertools + +def g(s:str): return getattr(mesa, s) +def nsrc(d:mesa.nir_def) -> mesa.nir_src: return mesa.nir_src(ssa=ctypes.pointer(d)) + +def glsl_type(t:DType): return { + **{getattr(dtypes,k):g(f"glsl_type_builtin_{v}") for k,v in [('double','double'),('float','float'),('float16','float16_t'),('bool','uint8_t')]}, + **{d:g(f"glsl_type_builtin_{'u' * (d in dtypes.uints)}int{str(d.bitsize)+'_t' if d.itemsize != 4 else ''}") for d in dtypes.ints}}[t] + +# alu ops, aop[][] +u_aop = { Ops.ADD: "iadd", Ops.MUL: "imul", Ops.CDIV: "udiv", Ops.CMOD: "umod", Ops.CMPLT: "ult", Ops.CMPNE: "ine", Ops.CMPEQ: "ieq", Ops.OR: "ior", + Ops.AND: "iand", Ops.XOR: "ixor", Ops.WHERE: "bcsel", Ops.MAX: "umax", Ops.SHL: "ishl", Ops.SHR: "ushr"} +s_aop = {**u_aop, Ops.CMPLT: "ilt", Ops.CDIV: "idiv", Ops.CMOD: "irem", Ops.MAX: "imax", Ops.SHR: "ishr"} +f_aop = { Ops.ADD: "fadd", Ops.MUL: "fmul", Ops.CMPLT: "flt", Ops.CMPNE: "fneu", Ops.CMPEQ: "feq", Ops.FDIV: "fdiv", Ops.RECIPROCAL: "frcp", + Ops.MAX: "fmax", Ops.TRUNC: "ftrunc", Ops.SIN: "fsin", Ops.EXP2: "fexp2", Ops.LOG2: "flog2"} +aop = {**{x:u_aop for x in (dtypes.bool,)+dtypes.uints}, **{x:s_aop for x in dtypes.sints}, **{x:f_aop for x in dtypes.floats}} + +def c(t:DType, u:bool=True) -> str: return "u" if t in dtypes.uints and u else ("i" if t in dtypes.ints else ("f" if t in dtypes.floats else "b")) +def ncast(b:mesa.nir_builder, src:mesa.nir_def, it:DType, ot:DType) -> mesa.nir_def: + return nalu(b, f"{c(it)}2{c(it) if it in dtypes.ints and ot in dtypes.ints else c(ot, ot == dtypes.bool)}{ot.bitsize}", src) + +def nif(b:mesa.nir_builder, cond:mesa.nir_def, then_fn:Callable, else_fn:Callable): + nif = mesa.nir_push_if(b, cond) + t = then_fn() + mesa.nir_push_else(b, nif) + e = else_fn() + mesa.nir_pop_if(b, nif) + return t, e + +def nalu(b:mesa.nir_builder, op:str, *srcs:mesa.nir_def) -> mesa.nir_def: return g(f"nir_build_alu{len(srcs)}")(b, g(f"nir_op_{op}"), *srcs).contents + +def nir_instr(nc=1, bs=lambda: None, intrins=None, srcs=None, has_def=True, df=None, also=lambda: None, **contents): + def dec(f:Callable): + @functools.wraps(f) + def wrapper(*args, **kwargs) -> mesa.nir_def: + (ba:=inspect.signature(f).bind(*args, **kwargs)).apply_defaults() + def go(g): return g(**{nm: ba.arguments[nm] for nm in inspect.signature(g).parameters}) if callable(g) else g + + instr = f(*args, **kwargs) + if has_def: mesa.nir_def_init(instr.contents.instr, instr.contents._def, go(nc), go(bs)) + for k, v in go(intrins or {}).items(): + idx = mesa.nir_intrinsic_infos[instr.contents.intrinsic].index_map[g(f"NIR_INTRINSIC_{k}")] + assert idx > 0, "invalid intrinsic. mesa version mismatch?" + instr.contents.const_index[idx - 1] = go(v) + for i, src in enumerate(go(srcs or [])): ctypes.cast(instr.contents.src, ctypes.POINTER(mesa.nir_src))[i] = go(src) + for k,v in {k:vcomp for k,v in contents.items() if (vcomp:=go(v)) is not None}.items(): setattr(instr.contents, k, go(v)) + mesa.nir_builder_instr_insert(ba.arguments['b'], instr.contents.instr) + go(also) + return instr.contents._def if has_def else (mesa.nir_def() if df is None else go(df)) + return wrapper + return dec + +@nir_instr(nc=1, bs=lambda src: src.bit_size, exact=lambda b:b.exact, fp_fast_math=lambda b:b.fp_fast_math) +def nchannel(b:mesa.nir_builder, src:mesa.nir_def, c:int): + alu_src = mesa.nir_alu_src(src=nsrc(src)) + alu_src.swizzle[0] = c + mov = mesa.nir_alu_instr_create(b.shader, mesa.nir_op_mov) + ctypes.cast(mov.contents.src, ctypes.POINTER(mesa.nir_alu_src))[0] = alu_src + return mov + +def nimm_set(imm:mesa.nir_def, x, dtype:DType): + instr = ctypes.cast(imm.parent_instr, ctypes.POINTER(mesa.nir_load_const_instr)) + struct.pack_into(unwrap(dtype.fmt), (ctypes.c_ubyte * dtype.itemsize).from_address(ctypes.addressof(instr.contents.value)), 0, truncate[dtype](x)) + +@nir_instr(nc=1, bs=lambda dtype: dtype.bitsize) +def nimm(b:mesa.nir_builder, x, dtype:DType) -> mesa.nir_def: + nimm_set((instr:=mesa.nir_load_const_instr_create(b.shader, 1, dtype.bitsize)).contents._def, x, dtype) + return instr +@nir_instr(nc=1, bs=lambda dtype: dtype.bitsize) +def nundef(b, dtype): return mesa.nir_undef_instr_create(b.shader, 1, dtype.bitsize) + +deref_var = nir_instr(nc=1, bs=32, modes=lambda var:var.data.mode, type=lambda var:var.type, var=lambda var:ctypes.pointer(var))( # pylint: disable=W0108 + lambda b, var: mesa.nir_deref_instr_create(b.shader, mesa.nir_deref_type_var)) + +def scope(space): return 'global' if space == AddrSpace.GLOBAL else ('shared' if space == AddrSpace.LOCAL else 'deref') +nstore = nir_instr(has_def=False, df=lambda addr:addr, intrins=lambda space,val: {"WRITE_MASK":(1< mesa.nir_def: + @nir_instr(nc=1, bs=32, modes=lambda buf: buf.data.mode, type=lambda buf: mesa.glsl_get_array_element(buf.type)) + def reg(b, buf): + deref = mesa.nir_deref_instr_create(b.shader, mesa.nir_deref_type_array) + deref.contents.parent, deref.contents.arr.index = nsrc(deref_var(b, buf)), nsrc(off) + return deref + f = (functools.partial(reg, b, buf) if space == AddrSpace.REG else + lambda: nalu(b, "iadd", buf, nalu(b, "imul", off, nimm(b, itemsize, dtypes.long)))) + return if_phi(b, gate, f, lambda: buf) if gate is not None else f() + +class NIRRenderer(Renderer): + suffix = "NIR" + nir_options: bytes + global_max, local_max, shared_max = CUDARenderer.global_max, CUDARenderer.local_max, CUDARenderer.shared_max + code_for_op = {**{k:lambda:None for k in u_aop.keys()}, **{k:lambda:None for k in s_aop.keys()}, **{k:lambda:None for k in f_aop.keys()}} + + extra_matcher = PatternMatcher([ + # handle negative unsigned CONST + (UPat.cvar("x", dtypes.uints), lambda x: UOp.const(x.dtype.max+x.val+1, x.dtype) if x.val < 0 else None), + # from ptx + (UPat.var('x', dtype=dtypes.bool) uint8 + (UPat(Ops.LOAD, dtypes.bool, name="x"), + lambda x: x.replace(dtype=dtypes.uint8, src=x.src[0:1]+((x.src[1].cast(dtypes.uint8),) if len(x.src)>=2 else ())+x.src[2:]).cast(dtypes.bool)), + (UPat(Ops.STORE, src=(UPat(), UPat(dtype=dtypes.bool)), name="x", allow_any_len=True), + lambda x: x.replace(src=(x.src[0], x.src[1].cast(dtypes.uint8))+x.src[2:])), + # NIR requires shift amount to be 32 bit: https://docs.mesa3d.org/nir/alu.html#nir-alu-op-ishl + (UPat((Ops.SHL, Ops.SHR), name="x"), lambda x: x.replace(src=(x.src[0], x.src[1].cast(dtypes.uint))) if x.src[1].dtype.bitsize != 32 else None), + # OpConvertFToU is undefined if Result Type is not wide enough, cast through int32 + # ref: https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpConvertFToU + (UPat(Ops.CAST, (dtypes.uchar, dtypes.ushort), src=(UPat.var("x", dtypes.floats),), name="c"), lambda x,c: x.cast(dtypes.int32).cast(c.dtype)), + # load/store use pointer arithmetic, and the cast does nothing. NOTE: this doesn't apply to image indexing cause it's 1-D + (UPat((Ops.INDEX, Ops.SHRINK), src=(UPat.var("buf"), UPat.var("off")), allow_any_len=True, name="x"), lambda x,buf,off: x.replace( + src=(buf,off.cast(dtypes.long))+x.src[2:]) if buf.addrspace != AddrSpace.REG and not is_image_shape(buf._shape) else None), + # images need index to be int for nir (coordinates only: the INDEX keeps its access dtype) + (UPat.var("buf").index(UPat.var("idx_y"), UPat.var("idx_x"), name="x"), + lambda x,buf,idx_y,idx_x: x.replace(src=(buf, idx_y.cast(dtypes.int), idx_x.cast(dtypes.int)))), + ]) + + def_rewrite = PatternMatcher([ + (UPat(Ops.CONST, name="x"), lambda ctx,x: nimm(ctx.b, x.val, x.dtype)), + (UPat(Ops.PARAM, name="x"), lambda ctx,x: ctx.param(ctx.b, x, x.dtype.itemsize if x.addrspace is AddrSpace.ALU else 8)), + (UPat(Ops.SPECIAL, name="x"), lambda ctx,x: nchannel(ctx.b, {'g':ngid, 'l':nlid, 'i': nid}[x.arg[0]](ctx.b), int(x.arg[-1]))), + (UPat(Ops.STORE, src=(UPat((Ops.INDEX, Ops.SHRINK), src=(UPat.var("buf"),UPat.var("off")), allow_any_len=True), UPat.var("val"))), + lambda ctx,buf,off,val: nstore(ctx.b, buf.addrspace, nidx(ctx.b, ctx.r[buf], ctx.r[off], buf.addrspace, buf.dtype.itemsize), ctx.r[val])), + (UPat(Ops.LOAD, src=(UPat((Ops.INDEX, Ops.SHRINK), src=(UPat.var("buf"), UPat.var("off")), allow_any_len=True), UPat.var("alt"), + UPat.var("gate")), name="x"), + lambda ctx,x,buf,off,alt,gate: if_phi(ctx.b, ctx.r[gate], + lambda: nload(ctx.b, buf.addrspace, nidx(ctx.b, ctx.r[buf], ctx.r[off], buf.addrspace, buf.dtype.itemsize, ctx.r[gate]), x), + lambda: ctx.r[alt])), + (UPat(Ops.LOAD, src=(UPat((Ops.INDEX, Ops.SHRINK), src=(UPat.var("buf"), UPat.var("off")), allow_any_len=True),), name="x"), + lambda ctx,x,buf,off: nload(ctx.b, buf.addrspace, nidx(ctx.b, ctx.r[buf], ctx.r[off], buf.addrspace, buf.dtype.itemsize), x)), + (UPat(Ops.STACK, name="x"), lambda ctx,x: nalu(ctx.b, f"vec{x.max_numel()}", *[ctx.r[src] for src in x.src])), + (UPat(GroupOp.ALU, name="x"), lambda ctx,x: nalu(ctx.b, aop[x.src[0].dtype][x.op], *[ctx.r[src] for src in x.src])), + (UPat(Ops.CAST, name="x"), lambda ctx,x: ncast(ctx.b, ctx.r[x.src[0]], x.src[0].dtype, x.dtype)), + (UPat(Ops.BITCAST, src=(UPat.var("a"),), allow_any_len=True), lambda ctx,a: ctx.r[a]), + (UPat(Ops.BUFFER, name="x"), lambda ctx,x: mesa.nir_local_variable_create(ctx.b.impl, + mesa.glsl_array_type(glsl_type(x.dtype), x.max_numel(), 0).contents, f"acc{x.arg.slot}".encode()).contents), + (UPat(Ops.BARRIER), lambda ctx: nbarrier(ctx.b)), + (UPat(Ops.IF, name="x"), lambda ctx,x: mesa.nir_push_if(ctx.b, ctx.r[x.src[0]])), + (UPat(Ops.ENDIF, name="x"), lambda ctx,x: (lambda _: mesa.nir_def())(mesa.nir_pop_if(ctx.b, ctx.r[x.src[0]]))) + ]) + + def __init__(self, target:Target): + super().__init__(target) + self.compiler = fromimport("tinygrad.runtime.support.compiler_mesa", self.__class__.__name__.replace("Renderer", "Compiler"))(target.arch) + if hasattr(self.compiler, "nir_options"): self.nir_options = self.compiler.nir_options + mesa.glsl_type_singleton_init_or_ref() + self._deinit_types = True + + def __del__(self): + if getattr(self, "_deinit_types", False): mesa.glsl_type_singleton_decref() + + def param(self, b:mesa.nir_builder, x, sz:int) -> mesa.nir_def: raise NotImplementedError("needs param") + def prerender(self, uops:list[UOp]): + self.b = mesa.nir_builder_init_simple_shader(mesa.MESA_SHADER_COMPUTE, mesa.nir_shader_compiler_options.from_buffer_copy(self.nir_options), None) + self.b.shader.contents.info.workgroup_size_variable = any([u.op == Ops.SPECIAL and u.arg[0] == 'i' for u in uops]) + def postrender(self, uops:list[UOp]): pass + + def render(self, uops:list[UOp]): + self.prerender(uops) + for u in [u for u in uops if u.op is Ops.SPECIAL and u.arg[0] == "l"]: self.b.shader.contents.info.workgroup_size[int(u.arg[-1])] = u.src[0].val + self.r: dict[UOp, Any] = {} + self.param_idx = 0 + ranges: list[mesa.nir_def|None] = [] + + for u in uops: + if u.op in {Ops.NOOP, Ops.GROUP} or (u.op is Ops.STACK and len(u.src) == 0): pass + elif u.op in {Ops.INDEX, Ops.SHRINK}: + # INDEX on a register value picks the element, memory INDEX is handled in the LOAD/STORE patterns + if u.src[0].op not in {Ops.PARAM, Ops.BUFFER, Ops.AFTER}: self.r[u] = nchannel(self.b, self.r[u.src[0]], u.src[1].val) + elif u.op is Ops.AFTER: + self.r[u] = self.r[u.src[0]] + elif u.op == Ops.SINK: + if u.arg is not None: + self.b.shader.contents.info.name = ctypes.cast(ctypes.create_string_buffer(u.arg.function_name.encode()), POINTER[ctypes.c_char]) + elif u.op == Ops.BUFFER and u.addrspace == AddrSpace.LOCAL: + self.r[u] = nimm(self.b, self.b.shader.contents.info.shared_size, dtypes.long) + self.b.shader.contents.info.shared_size += u.max_numel()*u.dtype.itemsize + elif u.op == Ops.RANGE: + if u.dtype == dtypes.void: + # a RANGE with no bound is a loop header: just open the loop, the END adds the conditional backedge + ranges.append(None) + mesa.nir_push_loop(self.b) + else: + ranges.append(i:=deref_var(self.b, mesa.nir_local_variable_create(self.b.impl, glsl_type(u.dtype), f"idx{range_str(u)}".encode()).contents)) + nstore(self.b, AddrSpace.REG, i, nimm(self.b, 0, u.dtype)) + mesa.nir_push_loop(self.b) + self.r[u] = nload(self.b, AddrSpace.REG, i, u) + nif(self.b, nalu(self.b, "ilt", self.r[u], self.r[u.src[0]]), lambda: None, lambda: njump(self.b, mesa.nir_jump_break)) + elif u.op == Ops.END: + r = u.src[1] + if r.dtype == dtypes.void: + # loop again while the condition is true + nif(self.b, self.r[u.src[2]], lambda: None, lambda: njump(self.b, mesa.nir_jump_break)) + ranges.pop() + mesa.nir_pop_loop(self.b, None) + else: + next_i = nalu(self.b, "iadd", self.r[r], nimm(self.b, 1, r.dtype)) + # TODO: this nif should be removable ... but TestMultiTensor.test_double_matmul_shard_W_0 segfaults with it gone + nif(self.b, nalu(self.b, "ilt", next_i, self.r[r.src[0]]), lambda: None, lambda: njump(self.b, mesa.nir_jump_break)) + nstore(self.b, AddrSpace.REG, ranges.pop(), next_i), + mesa.nir_pop_loop(self.b, None) + else: + d: mesa.nir_def|None = self.def_rewrite.rewrite(u, ctx=self) + if d is None: raise RuntimeError(f"failed to render {u.op} srcs {[x.dtype for x in u.src]}") + self.r[u] = d + self.postrender(uops) + + mesa.nir_validate_shader(self.b.shader, b"after render") + if DEBUG >= 4: mesa.nir_print_shader(self.b.shader, ctypes.POINTER(mesa.struct__IO_FILE).in_dll(libc.dll, "__stdoutp" if OSX else "stdout")) + mesa.nir_serialize(blob:=mesa.struct_blob(), self.b.shader, False) + ret = base64.b64encode(ctypes.string_at(blob.data, blob.size)).decode() + + mesa.ralloc_free(self.b.shader) + ctypes.CDLL(None).free(blob.data) + del self.b, self.r + + return ret + + def supported_dtypes(self): return {d for d in Renderer.supported_dtypes(self) if d not in dtypes.fp8s+(dtypes.bfloat16,)} + +def padded_idx(param_idx:int, size:int): return round_up(param_idx, size) + size + +class NAKRenderer(NIRRenderer): + param = nir_instr(nc=1, num_components=1, bs=lambda sz:sz*8, also=lambda self,sz: setattr(self, "param_idx", padded_idx(self.param_idx, sz)), + intrins={"ALIGN_MUL":lambda sz:sz}, srcs=lambda self,b,sz: [nsrc(nimm(b,0,dtypes.int)), nsrc(nimm(b, round_up(self.param_idx,sz), dtypes.int))])( + lambda self, b, x, sz: mesa.nir_intrinsic_instr_create(b.shader, mesa.nir_intrinsic_ldc_nv)) + + def supported_dtypes(self): return {d for d in super().supported_dtypes() if (d != dtypes.half or int(self.target.arch[3:]) >= 53)} + +class LVPRenderer(NIRRenderer): + has_local = False + has_shared = False + global_max = (1, 0, 0) + nir_options = mesa.lvp_nir_options + # gallivm's exp2/log2 have "undefined behavior with infs, 0s and nans", so exp2(log2(0)*y) returns 0 instead of inf + # https://gitlab.freedesktop.org/mesa/mesa/-/blob/c200b18e876468b51fe80d9660f612dc03a5138e/src/gallium/auxiliary/gallivm/lp_bld_arit.c#L2972 + code_for_op = {k:v for k,v in NIRRenderer.code_for_op.items() if k != Ops.EXP2} + + param = nir_instr(nc=1, bs=lambda sz: sz * 8, num_components=1, intrins={"ALIGN_MUL":lambda sz: sz, "RANGE":lambda self: self.param_sz}, + srcs=lambda b,self,sz: [nsrc(nimm(b, 0, dtypes.int)), nsrc(nimm(b, round_up(self.param_idx, sz), dtypes.int))], also=lambda self, sz: + setattr(self, "param_idx", padded_idx(self.param_idx, sz)))(lambda self,b,x,sz: + mesa.nir_intrinsic_instr_create(b.shader, mesa.nir_intrinsic_load_ubo)) + + def prerender(self, uops:list[UOp]): + super().prerender(uops) + self.param_sz = functools.reduce(padded_idx, (u.element_size() if u.addrspace is AddrSpace.ALU else 8 for u in uops if u.op is Ops.PARAM), 0) + +def tovec(b, idx_y, idx_x): return nalu(b, "vec4", idx_x, idx_y, nundef(b, dtypes.int), nundef(b, dtypes.int)) +def nfloat(dtype): return mesa.nir_type_float16 if dtype == dtypes.half else mesa.nir_type_float32 +nstore_img = nir_instr(has_def=False, df=lambda img:img, num_components=lambda val:val.num_components, + intrins=lambda dtype:{'IMAGE_DIM':mesa.GLSL_SAMPLER_DIM_2D, 'ACCESS':mesa.ACCESS_CAN_REORDER, 'SRC_TYPE':nfloat(dtype)}, + srcs=lambda b,img,idx_y,idx_x,val:[nsrc(x) for x in [img, tovec(b, idx_y, idx_x), nundef(b, dtypes.int), val, nimm(b, 0, dtypes.int)]])( + lambda b,img,idx_y,idx_x,val,dtype:mesa.nir_intrinsic_instr_create(b.shader,g("nir_intrinsic_image_store"))) + +_nload_img = nir_instr(intrins=lambda dtype:{'IMAGE_DIM':mesa.GLSL_SAMPLER_DIM_2D, 'ACCESS':mesa.ACCESS_CAN_REORDER, 'DEST_TYPE':nfloat(dtype)}, + nc=4, bs=32, num_components=4, + srcs=lambda b,img,idx_y,idx_x:[nsrc(x) for x in [img, tovec(b, idx_y, idx_x), nundef(b, dtypes.int), nimm(b, 0, dtypes.int)]])( + lambda b,img,idx_y,idx_x,dtype: mesa.nir_intrinsic_instr_create(b.shader, g("nir_intrinsic_image_load"))) + +class IR3Renderer(NIRRenderer): + def nload_img(ctx,img,idx_y,idx_x): + ctx.texs.add(img) + return _nload_img(ctx.b, ctx.r[img], ctx.r[idx_y], ctx.r[idx_x], img.dtype) + + def_rewrite = PatternMatcher([ + (UPat(Ops.STORE, src=(UPat.var('img').index(UPat.var('idx_y'), UPat.var('idx_x')), UPat.var("val")), allow_any_len=True), + lambda ctx,img,idx_y,idx_x,val: nstore_img(ctx.b, ctx.r[img], ctx.r[idx_y], ctx.r[idx_x], ctx.r[val], val.dtype)), + (UPat(Ops.LOAD, src=(UPat.var('img').index(UPat.var('idx_y'), UPat.var('idx_x')), UPat.var("alt"), UPat.var("gate"))), + lambda ctx,img,idx_y,idx_x,alt,gate: if_phi(ctx.b, ctx.r[gate], lambda: ctx.nload_img(img, idx_y, idx_x), lambda: ctx.r[alt])), + (UPat(Ops.LOAD, src=(UPat.var('img').index(UPat.var('idx_y'), UPat.var('idx_x')),)), nload_img), + ]) + NIRRenderer.def_rewrite + + _param = LVPRenderer.param + def _param_img(self, x): + self.img_idx += 1 + return nimm(self.b, self.img_idx - 1, dtypes.int) + + def param(self, b, x, sz): return self._param_img(x) if is_image_shape(x._shape) else self._param(b, x, sz) + + def prerender(self, uops:list[UOp]): + super().prerender(uops) + self.texs:set[UOp] = set() + self.img_idx = 0 + self.param_sz = functools.reduce(padded_idx, (u.element_size() if u.addrspace is AddrSpace.ALU else 8 + for u in uops if u.op is Ops.PARAM and not is_image_shape(u._shape)), 0) + + def postrender(self, uops:list[UOp]): + bufs = [u for u in uops if u.op is Ops.PARAM and u.addrspace is not AddrSpace.ALU] + texs, imgs = itertools.count().__next__, itertools.count().__next__ + for b in filter(lambda b: is_image_shape(b._shape), bufs): + nimm_set(self.r[b], texs() if b in self.texs else imgs(), dtypes.int) + + self.b.shader.contents.info.num_ubos = len([u for u in bufs if not is_image_shape(u._shape)]) + self.b.shader.contents.info.num_images = texs() + imgs() + + def supported_dtypes(self): return {d for d in NIRRenderer.supported_dtypes(self) if d != dtypes.double} diff --git a/artifacts/package_runtime/tinygrad/renderer/ptx.py b/artifacts/package_runtime/tinygrad/renderer/ptx.py new file mode 100644 index 000000000..1b6b77859 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/ptx.py @@ -0,0 +1,233 @@ +from typing import cast, Callable +import struct +from collections import defaultdict +from tinygrad.codegen.opt import tc +from tinygrad.uop.ops import Ops, UOp, PatternMatcher, UPat, GroupOp +from tinygrad.dtype import dtypes, DType, AddrSpace +from tinygrad.renderer import Renderer +from tinygrad.renderer.cstyle import CUDARenderer +from tinygrad.helpers import flatten, prod, unwrap, Target + +def render_val(x, dtype): + if dtypes.is_float(dtype): + if dtype == dtypes.double: return "0d%02X%02X%02X%02X%02X%02X%02X%02X" % tuple(struct.pack("d",x)[::-1]) + if dtype == dtypes.half: return "0x%02X%02X" % tuple(struct.pack("e",x)[::-1]) + return "0f%02X%02X%02X%02X" % tuple(struct.pack("f",x)[::-1]) + return str(int(x)) + ("U" if dtypes.is_unsigned(dtype) else "") + +asm_for_op: dict[Ops, Callable] = { + Ops.RECIPROCAL: lambda d,a,dt,name: f"rcp{'.approx' if dtypes.is_float(dt) else ''}.{name} {d}, {a};", + Ops.EXP2: lambda d,a,dt,name: f"ex2.approx.{name} {d}, {a};", Ops.LOG2: lambda d,a,dt,name: f"lg2.approx.{name} {d}, {a};", + Ops.SIN: lambda d,a,dt,name: f"sin.approx.{name} {d}, {a};", Ops.SQRT: lambda d,a,dt,name: f"sqrt.approx.{name} {d}, {a};", + Ops.TRUNC: lambda d,a,dt,name: f"cvt.rzi.{name}.{name} {d}, {a};", + Ops.SHR: lambda d,a,b,dt,name: f"shr.{name} {d}, {a}, {b};", Ops.SHL: lambda d,a,b,dt,name: f"shl.b{name[1:]} {d}, {a}, {b};", + Ops.ADD: lambda d,a,b,dt,name: f"{'or' if dt == dtypes.bool else 'add'}.{name} {d}, {a}, {b};", + Ops.MUL: lambda d,a,b,dt,name: f"{'and' if dt == dtypes.bool else 'mul'}{'.lo' if dtypes.is_int(dt) else ''}.{name} {d}, {a}, {b};", + Ops.XOR: lambda d,a,b,dt,name: f"xor.pred {d}, {a}, {b};" if dt == dtypes.bool else f"xor.b{name[1:]} {d}, {a}, {b};", + Ops.AND: lambda d,a,b,dt, name: f"and.pred {d}, {a}, {b};" if dt == dtypes.bool else f"and.b{name[1:]} {d}, {a}, {b};", + Ops.OR: lambda d,a,b,dt, name: f"or.pred {d}, {a}, {b};" if dt == dtypes.bool else f"or.b{name[1:]} {d}, {a}, {b};", + Ops.CDIV: lambda d,a,b,dt,name: f"div.{name} {d}, {a}, {b};", Ops.CMOD: lambda d,a,b,dt,name: f"rem.{name} {d}, {a}, {b};", + Ops.MAX: lambda d,a,b,dt,name: f"max.{name} {d}, {a}, {b};", Ops.CMPEQ: lambda d,a,b,dt,name: f"setp.eq.{name} {d}, {a}, {b};", + Ops.CMPLT: lambda d,a,b,dt,name: f"setp.lt.{name} {d}, {a}, {b};", + Ops.CMPNE: lambda d,a,b,dt,name: f"setp.{'neu' if dtypes.is_float(dt) else 'ne'}.{name} {d}, {a}, {b};", + Ops.MULACC: lambda d,a,b,c,dt,name: f"{'fma.rn' if dtypes.is_float(dt) else 'mad.lo'}.{name} {d}, {a}, {b}, {c};", + Ops.WHERE: lambda d,a,b,c,dt,name: [f"@{a} mov.{name} {d}, {b};", f"@!{a} mov.{name} {d}, {c};"] if dt == dtypes.bool else \ + f"selp.{'b16' if name == 'f16' else name} {d}, {b}, {c}, {a};" +} + +supports_half = (Ops.EXP2, Ops.ADD, Ops.MUL, Ops.MAX, Ops.CMPLT, Ops.WHERE, Ops.TRUNC) +doesnt_support_half: tuple[Ops, ...] = tuple(op for op in asm_for_op.keys() if op not in supports_half) +ptx_matcher = PatternMatcher([ + # bool CMPNE is XOR, bool CMPLT is XOR+AND (universal makes this slow, this is for renderer only) + (UPat.var('x', dtype=dtypes.bool).ne(UPat.var('y')), lambda x,y: x^y), + (UPat.var('x', dtype=dtypes.bool).alu(Ops.CMPEQ, UPat.var('y')), lambda x,y: (x^y)^True), + (UPat.var('x', dtype=dtypes.bool) uint8 (only for memory, not registers) + (UPat(Ops.LOAD, dtypes.bool, src=(UPat(name="idx"),), name="x", allow_any_len=True), + lambda x,idx: UOp(x.op, dtypes.uint8, x.src[0:1] + ((x.src[1].cast(dtypes.uint8),) if len(x.src) >= 2 else ()) + x.src[2:]).cast(dtypes.bool) \ + if idx.addrspace != AddrSpace.REG else None), + (UPat(Ops.STORE, src=(UPat(name="idx"), UPat(dtype=dtypes.bool)), name="x", allow_any_len=True), + lambda x,idx: UOp(x.op, src=(x.src[0], x.src[1].cast(dtypes.uint8))+x.src[2:]) if idx.addrspace != AddrSpace.REG else None), + # ptx shr and shl instructions require y to be uint + (UPat.var("x") << UPat.var("y"), lambda x,y: UOp(Ops.SHL, x.dtype, (x,y.cast(dtypes.uint))) if y.dtype != dtypes.uint else None), + (UPat.var("x") >> UPat.var("y"), lambda x,y: UOp(Ops.SHR, x.dtype, (x,y.cast(dtypes.uint))) if y.dtype != dtypes.uint else None), +]) + +def mem_type(x:UOp) -> str: return 'shared' if x.addrspace == AddrSpace.LOCAL else 'global' + +def render_wmma(ctx: "PTXRenderer", wmma: UOp): + assert ctx.wmma_r, "registry values for wmma must be populated" + (N, M, K), dtype_in, dtype_out = wmma.arg[0], wmma.arg[1], wmma.dtype + + for src, regs in zip(wmma.src, ctx.wmma_r): + for i, reg in enumerate(regs): # pack input and acc registers + if (elems_per_reg := 4 // src.dtype.scalar().itemsize) == 1: yield f"mov.b32 {reg}, {ctx.r[src][i]};" + else: yield f"mov.b32 {reg}, {{{', '.join(ctx.r[src][i * elems_per_reg : (i+1) * elems_per_reg])}}};" + + dt_map_in, dt_map_out = {dtypes.float: "tf32", dtypes.half: "f16"}, {dtypes.float: "f32", dtypes.half: "f16"} + yield f'mma.sync.aligned.m{M}n{N}k{K}.row.col.{dt_map_out[dtype_out]}.{dt_map_in[dtype_in]}.{dt_map_in[dtype_in]}.{dt_map_out[dtype_out]}{" "*12}'+\ + f'{{{", ".join(ctx.wmma_r[2])}}}, {{{", ".join(ctx.wmma_r[0])}}}, {{{", ".join(ctx.wmma_r[1])}}}, {{{", ".join(ctx.wmma_r[2])}}};' + + for i, reg in enumerate(ctx.wmma_r[2]): # unpack acc registers + if (elems_per_reg := 4 // dtype_out.itemsize) == 1: yield f"mov.b32 {ctx.r[wmma][i]}, {reg};" + else: yield f"mov.b32 {{{', '.join(ctx.r[wmma][i * elems_per_reg : (i+1) * elems_per_reg])}}}, {reg};" + +def modifier(a: DType, b: DType): return '.rzi' if dtypes.is_int(a) and dtypes.is_float(b) else '.rn' if dtypes.is_float(a) and \ + (a.itemsize < b.itemsize or dtypes.is_int(b) or b == dtypes.bool) else '' + +string_rewrite = PatternMatcher([ + (UPat.cvar("x", dtypes.bool), lambda ctx, x: f"setp.ne.s16 {ctx.r[x]}, {render_val(x.val, x.dtype)}, 0;"), + (UPat.cvar("x"), lambda ctx, x: f"mov.b{ctx.types[x.dtype][1:]} {ctx.r[x]}, {render_val(x.val, x.dtype)};"), + (UPat(Ops.SPECIAL, name="x"), lambda ctx,x: f"mov.u32 %{x.arg}, %{'ctaid' if x.arg[0] == 'g' else 'tid'}.{chr(120+int(x.arg[-1]))};"), + (UPat(Ops.PARAM, name="x"), lambda ctx, x: + f"ld.param.{ctx.types[dtypes.ulong] if x.addrspace is AddrSpace.GLOBAL else ctx.mem_types[x.dtype]} {ctx.r[x]}, [data{x.arg.slot}+0];"), + # address computation: addr = buf + idx*itemsize + (UPat((Ops.INDEX, Ops.SHRINK), src=(UPat.var("buf"), UPat.var("idx")), allow_any_len=True, name="x"), lambda ctx, x, buf, idx: + [f"cvt.s64.{ctx.types[idx.dtype]} {ctx.r[x]}, {ctx.r[idx]};", f"mad.lo.s64 {ctx.r[x]}, {ctx.r[x]}, {x.dtype.itemsize}, {ctx.r[buf]};"]), + (UPat((Ops.CMPLT, Ops.CMPNE, Ops.CMPEQ), name="x", allow_any_len=True, src=(UPat.var("src0"),)), + lambda ctx, x, src0: ctx.code_for_op[x.op](ctx.r[x], *[ctx.r[v] for v in x.src], src0.dtype, ctx.types[src0.dtype])), + (UPat(GroupOp.ALU, name="x"), lambda ctx, x: ctx.code_for_op[x.op](ctx.r[x], *[ctx.r[v] for v in x.src], x.dtype, ctx.types[x.dtype])), + (UPat(Ops.BITCAST, name="x", src=(UPat.var("a"),), allow_any_len=True), lambda ctx, x, a: f"mov.b{ctx.types[x.dtype][1:]} {ctx.r[x]}, {ctx.r[a]};"), + (UPat(Ops.CAST, name="x", src=(UPat(dtype=dtypes.bool, name="a"),)), + lambda ctx, x, a: f"selp.b{ctx.types[x.dtype][1:]} {ctx.r[x]}, {render_val(1, x.dtype)}, {render_val(0, x.dtype)}, {ctx.r[a]};"), + (UPat(Ops.CAST, name="x", src=(UPat.var("a"),)), + lambda ctx, x, a: f"cvt{modifier(x.dtype, a.dtype)}.{ctx.cast_types[x.dtype]}.{ctx.cast_types[a.dtype]} {ctx.r[x]}, {ctx.r[a]};"), + # store / gated load / load + (UPat(Ops.STORE, src=(UPat(name="loc"), UPat.var("var"))), lambda ctx, loc, var: + f"mov.{'pred' if var.dtype == dtypes.bool else 'b'+ctx.types[var.dtype][1:]} {ctx.r[loc]}, {ctx.r[var]};" \ + if loc.addrspace == AddrSpace.REG else None), + (UPat(Ops.STORE, src=(UPat((Ops.INDEX, Ops.SHRINK), name="loc"), UPat.var("var"))), + lambda ctx, loc, var: f"st.{mem_type(loc)}" + \ + f"{f'.v{cnt}' if ((cnt:=var.max_numel())>1) else ''}.{ctx.mem_types[var.dtype.scalar()]} " + \ + f"[{ctx.r[loc]}+0], {('{' + ', '.join(ctx.r[var]) + '}') if var.max_numel() > 1 else ctx.r[var]};"), + (UPat(Ops.LOAD, name="x", src=(UPat((Ops.INDEX, Ops.SHRINK), name="loc"), UPat.var("alt"), UPat.var("gate"))), + lambda ctx, x, loc, alt, gate: flatten([ + [f"mov.{ctx.mem_types[x.dtype.scalar()]} {v}, {render_val(0, x.dtype.scalar())};" for v in ctx.r[x]], + [f"@{ctx.r[gate]} ld.{mem_type(loc)}.v{x.max_numel()}.{ctx.mem_types[x.dtype.scalar()]} {{{', '.join(ctx.r[x])}}}, [{ctx.r[loc]}+0];"] + ]) if alt.max_numel() > 1 else [ + f"@{ctx.r[gate]} ld.{mem_type(loc)}.{ctx.mem_types[x.dtype.scalar()]} {ctx.r[x]}, [{ctx.r[loc]}+0];", + f"@!{ctx.r[gate]} mov.b{ctx.types[x.dtype.scalar()][1:]} {ctx.r[x]}, {ctx.r[alt]};"]), + (UPat(Ops.LOAD, name="x", src=(UPat((Ops.INDEX, Ops.SHRINK), name="loc"),)), + lambda ctx, x, loc: f"ld.{mem_type(loc)}.v{x.max_numel()}.{ctx.mem_types[x.dtype.scalar()]} {{{', '.join(ctx.r[x])}}}, [{ctx.r[loc]}+0];" \ + if x.max_numel() > 1 else f"ld.{mem_type(loc)}.{ctx.mem_types[x.dtype]} {ctx.r[x]}, [{ctx.r[loc]}+0];"), + # simple + (UPat(Ops.BUFFER, name="x"), lambda ctx, x: [] if x.addrspace == AddrSpace.REG else [ + f".shared .align 16 .b8 local{x.arg.slot}[{x.max_numel()*x.dtype.itemsize}];", f"mov.u64 {ctx.r[x]}, local{x.arg.slot}[0];"]), + (UPat(Ops.RANGE, dtypes.void, name="l"), lambda ctx, l: f"WAITLOOP_{ctx.uops.index(l)}:"), + (UPat(Ops.END, src=(UPat(), UPat(Ops.RANGE, dtypes.void, name="l"), UPat(name="c"))), lambda ctx, l, c: + f"@{ctx.r[c]} bra WAITLOOP_{ctx.uops.index(l)};"), + (UPat(Ops.RANGE, name="r"), lambda ctx, r: [ + f"mov.u32 {ctx.r[r]}, -1;", + f"bra END_{ctx.r[r][1:]};", + "LOOP_" + f"{ctx.r[r][1:]}:"]), + (UPat(Ops.END, name="x", src=(UPat(), UPat(Ops.RANGE, name="r"))), lambda ctx, x, r: [ + "END_" + f"{ctx.r[r][1:]}:", + ctx.code_for_op[Ops.ADD](ctx.r[r], ctx.r[r], "1", dtypes.int, ctx.types[dtypes.int]), + ctx.code_for_op[Ops.CMPLT](ctx.r[x], ctx.r[r], ctx.r[r.src[0]], dtypes.int, ctx.types[dtypes.int]), + f"@{ctx.r[x]} bra LOOP_{ctx.r[r][1:]};"]), + (UPat(Ops.IF, name="x"), lambda ctx, x: f"@!{ctx.r[x.src[0]]} bra IF_{ctx.r[x.src[0]][1:]}_{ctx.uops.index(x)};"), + (UPat(Ops.ENDIF, name="x"), lambda ctx, x: f"IF_{ctx.r[x.src[0].src[0]][1:]}_{ctx.uops.index(x.src[0])}:"), + (UPat(Ops.WMMA, name="x"), lambda ctx, x: list(render_wmma(ctx, x))), + (UPat(Ops.BARRIER), lambda ctx: ctx.barrier), +]) + +class PTXRenderer(Renderer): + suffix = "PTX" + global_max, local_max, shared_max = CUDARenderer.global_max, CUDARenderer.local_max, CUDARenderer.shared_max + tc_sm80 = [x for x in tc.cuda_sm80 if x.dtype_in in [dtypes.half, dtypes.float]] + code_for_op = asm_for_op + extra_matcher = ptx_matcher + def __init__(self, target:Target): + super().__init__(target) + from tinygrad.runtime.support.compiler_cuda import NVPTXCompiler, PTXCompiler + self.compiler = (PTXCompiler if target.interface.startswith("MOCK") or target.device == "CUDA" else NVPTXCompiler)(target.arch) + self.tensor_cores = PTXRenderer.tc_sm80 if (ver:=int(target.arch[3:])) >= 80 else tc.cuda_sm75 if ver >= 75 else [] + if ver < 80: self.extra_matcher += PatternMatcher([(UPat((Ops.MAX, Ops.EXP2), dtype=dtypes.half, name="x"), + lambda x: UOp(x.op, src=tuple(vv.cast(dtypes.float32) for vv in x.src), arg=x.arg).cast(dtypes.half))]) + + # language options + kernel_prefix = """.version VERSION +.target TARGET +.address_size 64 +.visible .entry""" + barrier = "bar.sync\t0;" + types: dict[DType, str] = { dtypes.int8: "s16", dtypes.int16: "s16", dtypes.int32: "s32", dtypes.int64: "s64", + dtypes.uint8: "u16", dtypes.uint16: "u16", dtypes.uint32: "u32", dtypes.uint64: "u64", + dtypes.float16: "f16", dtypes.float32: "f32", dtypes.float64: "f64", dtypes.bool: "pred" } + + mem_types: dict[DType, str] = {**types, dtypes.int8: "s8", dtypes.uint8: "u8", dtypes.bool: "u8", dtypes.float16: "b16"} + cast_types: dict[DType, str] = {**types, dtypes.int8: "s8", dtypes.uint8: "u8"} + + def render_kernel(self, kernel, function_name, bufs, regs, uops) -> str: + def fmt(line): return line if line[0]=="$" else "\t" + line.replace(" ", "\t" if len(line.split(" ")[0]) > 7 else "\t\t", 1) + kernel = '\n'.join(map(fmt, [f".reg .{reg.split('_')[-2]} %{reg}<{cnt}>;" for reg,cnt in regs] + kernel + ["ret;"])) + local_dims = [u.src[0] for u in uops if u.op is Ops.SPECIAL and u.arg[0] == "l"] + launch_bounds = prod([d.vmax for d in local_dims]) + params = ',\n\t'.join([f".param .{'u64' if u.addrspace is AddrSpace.GLOBAL else self.types[u.dtype]} {name}" for name,u in bufs]) + return f"{self.kernel_prefix.format(launch_bounds=launch_bounds)} {function_name} (\n\t{params}\n)\n.maxntid {launch_bounds}\n{{\n{kernel}\n}}" + + def render(self, uops:list[UOp]) -> str: + kernel:list[str] = [] + bufs = [] + + c: defaultdict[str, int] = defaultdict(int) + r: dict[UOp, list[str]|str] = {} + self.r = r + self.uops = uops + + def ssa(prefix:str, u:UOp|None=None, dtype:str|None=None) -> str: + nonlocal c + prefix += f"_{dtype if dtype is not None else self.types[unwrap(u).dtype]}_" + c[prefix] += 1 + return f"%{prefix}{c[prefix]-1}" + + name = "test" + for u in uops: + if u.op in {Ops.NOOP, Ops.GROUP}: continue + if u.op is Ops.AFTER: + self.r[u] = self.r[u.src[0]] + continue + if u.op is Ops.SINK: + if u.arg is not None: name = u.arg.function_name + continue + if u.op is Ops.STACK: + r[u] = [cast(str,r[x]) for x in u.src] + continue + if u.op is Ops.BUFFER and u.addrspace == AddrSpace.REG: + r[u] = [ssa("reg", u, self.types[u.dtype.scalar()]) for _ in range(u.max_numel())] + continue + if u.op in {Ops.INDEX, Ops.SHRINK, Ops.LOAD} and u.src[0].addrspace in (AddrSpace.REG, AddrSpace.ALU): + # on REG, INDEX/SHRINK pick the register (must be CONST) and LOAD is a noop + if u.op is not Ops.LOAD and u.src[1].op is not Ops.CONST: + raise RuntimeError(f"PTX does not support dynamic register indexing: {u}") + r[u] = r[u.src[0]] if u.op is Ops.LOAD else r[u.src[0]][u.src[1].val] + continue + if u.op is Ops.SPECIAL: r[u] = "%" + u.arg + elif u.op is Ops.LOAD: + r[u] = [ssa('val', dtype=self.types[u.dtype.scalar()]) for _ in range(u.max_numel())] if u.max_numel() > 1 else ssa('val', u) + elif u.op is Ops.PARAM: bufs.append((f"data{u.arg.slot}", u)) + elif u.op is Ops.WMMA: + # registers for packing/unpacking input and acc + self.wmma_r = [[ssa("wmma_in", dtype="b32") for _ in range(0, len(r[u.src[0]]), 4 // u.src[0].dtype.scalar().itemsize)], + [ssa("wmma_in", dtype="b32") for _ in range(0, len(r[u.src[1]]), 4 // u.src[0].dtype.scalar().itemsize)], + [ssa("wmma_acc", dtype="b32") for _ in range(0, len(r[u.src[2]]), 4 // u.dtype.scalar().itemsize)]] + r[u] = [ssa("wmma", dtype=self.types[u.dtype.scalar()]) for _ in range(u.max_numel())] + prefix, dtype = {Ops.CAST: ("cast", None), Ops.BITCAST: ("cast", None), Ops.END: ("pred", "pred"), Ops.RANGE: ("ridx", None), + Ops.CONST: ("const", None), Ops.BUFFER: ("local", "u64"), Ops.INDEX: ("bidx", "u64"), Ops.SHRINK: ("bidx", "u64"), + Ops.PARAM: ("dat", "u64" if u.addrspace is AddrSpace.GLOBAL else None), **{op: ("alu", None) for op in GroupOp.ALU}}.get(u.op, (None, None)) + if u.op is Ops.RANGE and u.dtype == dtypes.void: prefix = None # loop headers don't have a register + if prefix: r[u] = ssa(prefix, u, dtype) + + l: str|list[str]|None = string_rewrite.rewrite(u, ctx=self) + if l is None: + raise RuntimeError(f"failed to render {u.op} with {u.dtype} srcs {[x.dtype for x in u.src]}") + kernel.extend([l] if isinstance(l, str) else l) + + if u.op is Ops.SPECIAL: kernel = [f".reg .u32 %{u.arg};"] + kernel + return self.render_kernel(kernel, name, bufs, c.items(), uops) + + def supported_dtypes(self): return {d for d in super().supported_dtypes() + if (d != dtypes.half or int(self.target.arch[3:]) >= 53) and d not in dtypes.fp8s+(dtypes.bfloat16,)} diff --git a/artifacts/package_runtime/tinygrad/renderer/wgsl.py b/artifacts/package_runtime/tinygrad/renderer/wgsl.py new file mode 100644 index 000000000..4cecf8116 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/renderer/wgsl.py @@ -0,0 +1,117 @@ +from tinygrad.dtype import DType, dtypes, truncate, AddrSpace +from tinygrad.uop.ops import UOp, Ops, PatternMatcher, UPat +from tinygrad.renderer.cstyle import CStyleLanguage, base_rewrite +from tinygrad.helpers import strip_parens + +def _mask(dt:DType): return 0xFF if dt.itemsize == 1 else 0xFFFF + +def sign_extend(val:UOp, sext_am:int): + return (UOp.where((val >> (sext_am - 1)) > 0, UOp.const(0xffffffff << sext_am, dtypes.uint32), UOp.const(0, dtypes.uint32)) \ + | val.bitcast(dtypes.uint32)).bitcast(dtypes.int) + +# store for char: buf[idx/4] <- (var << (idx%4)*8)) +def packed_store(bidx:UOp, var:UOp, gate:UOp|None=None): + elems, mask = 4//var.dtype.itemsize, _mask(var.dtype) + shift_am, div_idx = (bidx.src[1].cast(dtypes.uint32) % elems) * (8*var.dtype.itemsize), bidx.src[1] // elems + # bool does its mask math at int32: renderer rewrites run after weak dtypes are lowered, and bool & 0xFF would create a weakint const + if var.dtype == dtypes.bool: var = var.cast(dtypes.int32) + new_v, wmask = (var & mask).cast(dtypes.uint32) << shift_am, ((mask << shift_am) ^ 0xFFFFFFFF).cast(dtypes.uint32) + idx = UOp(Ops.INDEX, src=(bidx.src[0], div_idx)) + buf = UOp.load(idx, *((UOp.const(0, dtypes.uint32), gate) if gate is not None else ()), dtype=dtypes.uint32) + return UOp.store(idx, (buf & wmask) | new_v, *((gate,) if gate is not None else ())) + +# load for char: sign_extend(buf[idx/4] >> ((idx%4)*8)) +def packed_load(root:UOp, bidx:UOp, dtype:DType, var:UOp|None=None, gate:UOp|None=None): + elems, mask = 4//dtype.itemsize, _mask(dtype) + shift_am, div_idx = (bidx.src[1].cast(dtypes.uint32) % elems) * (8*dtype.itemsize), bidx.src[1] // elems + idx = UOp(Ops.INDEX, src=(bidx.src[0], div_idx)) + load = UOp.load(idx, *((var, gate) if var is not None and gate is not None else root.src[1:]), dtype=dtypes.uint32, arg=root.arg) + val = (load.cast(dtypes.uint32) >> shift_am) & mask + return sign_extend(val, 8*dtype.itemsize).cast(dtype) if dtype in [dtypes.char, dtypes.short] else val.cast(dtype) + +def is_packed(x:UOp): + if x.op is Ops.LOAD: dt, addrspace = x.dtype, x.src[0].addrspace + elif x.op is Ops.STORE: dt, addrspace = x.src[1].dtype, x.src[0].addrspace + else: dt, addrspace = x.dtype, x.addrspace + return dt.itemsize < 4 and dt != dtypes.half and addrspace != AddrSpace.REG +def _packed_size(u:UOp): return u.max_numel() // (4//u.dtype.itemsize) if is_packed(u) else u.max_numel() +def is_nan(a): + bs, (exp, mant) = a.dtype.bitsize, dtypes.finfo(a.dtype) + return (a.bitcast(getattr(dtypes, f"uint{bs}")) & ((1 << (bs - 1)) - 1)) > (((1 << exp) - 1) << mant) + +wgsl_matcher = PatternMatcher([ + (UPat((Ops.CMPLT, Ops.XOR), src=(UPat(name="a", dtype=dtypes.bool), UPat.var("b")), name="c"), + lambda a,b,c: a.cast(dtypes.int).alu(c.op, b.cast(dtypes.int)).cast(dtypes.bool)), + (UPat.load(UPat.var("b"), UPat.var("c"), UPat.var("gate"), name="l"), + lambda l,b,c,gate: packed_load(l,b,l.dtype,c.cast(dtypes.uint32),gate) if is_packed(l) else None), + (UPat.load(UPat.var("b"), name='l'), lambda l,b: packed_load(l,b,l.dtype) if is_packed(l) else None), + (UPat.store(UPat.var("b"), UPat.var("var"), UPat.var("gate"), name="s"), + lambda b,var,gate,s: packed_store(b,var,gate) if is_packed(s) else None), + (UPat.store(UPat.var("b"), UPat.var("var"), name="s"), lambda b,var,s: packed_store(b,var) if is_packed(s) else None), + (UPat.var("a") << UPat.var("b"),lambda a,b:(a.bitcast(dtypes.uint32)<> UPat.var("y"), lambda x,y: UOp(Ops.SHR, x.dtype, (x,y.cast(dtypes.uint))) if y.dtype != dtypes.uint else None), + # fix nan check: 'a != a -> is_nan()' + (UPat.var("a") != UPat.var("a"), is_nan), + ]) + +class WGSLRenderer(CStyleLanguage): + global_max = (65535, 65535, 65535) + local_max = (256, 256, 64) + code_for_workitem = {"g": lambda x: f"i32(gindex.{'xyz'[int(x)]})", "l": lambda x: f"i32(lindex.{'xyz'[int(x)]})"} + extra_matcher = wgsl_matcher + supports_float4 = False + barrier = "workgroupBarrier();" + code_for_op = {**CStyleLanguage.code_for_op, Ops.WHERE: lambda a,b,c,dtype: f"select({c},{b},{a})"} + nan = "nan()" + type_map = { dtypes.float: "f32", dtypes.uchar: "u32", dtypes.ushort: "u32", dtypes.short: "i32", + dtypes.char: "i32", dtypes.int32: "i32", dtypes.uint32: "u32", dtypes.bool: "bool", dtypes.half: "f16" } + + string_rewrite = PatternMatcher([ + (UPat(Ops.NEG, dtypes.uints, src=(UPat.var('x'))), lambda ctx,x: f"(0-{ctx[x]})"), + (UPat.cvar("x", dtype=dtypes.bool), lambda x: "true" if x.val else "false"), + (UPat(Ops.CONST, dtype=(dtypes.uchar, dtypes.ushort, dtypes.uint32), name="x"), + lambda x: f"bitcast({x.val})" if x.val < 0 else f"{x.val&0xFFFFFFFF}u"), + (UPat(Ops.CONST, dtype=dtypes.int32, name="x"), lambda ctx,x: f"{truncate[x.dtype](x.val)}"), + (UPat(Ops.BUFFER, name="x"), lambda ctx,x: + f"var{'' if x.addrspace == AddrSpace.LOCAL else ''} {ctx[x]}: array<{ctx.buf_map(x)},{_packed_size(x)}>;"), + (UPat(Ops.BITCAST, dtype=dtypes.half, name="x", src=(UPat(dtype=(dtypes.short, dtypes.ushort, dtypes.uint32),),)), + lambda ctx,x: f"bitcast>({ctx[x.src[0]]})[0]"), + (UPat(Ops.BITCAST, dtype=dtypes.uchar, name="x"), lambda ctx,x: f"bitcast({ctx[x.src[0]]}&0xFF)"), + (UPat(Ops.BITCAST, dtype=dtypes.char, name="x"), lambda ctx,x: f"((i32({ctx[x.src[0]]}&0xFF)<<24)>>24)"), + (UPat(Ops.BITCAST, dtype=dtypes.ushort, name="x"), lambda ctx,x: f"bitcast(vec2({ctx[x.src[0]]},0))" \ + if x.src[0].dtype == dtypes.half else f"bitcast({ctx[x.src[0]]}&0xFFFF)"), + (UPat(Ops.BITCAST, dtype=dtypes.short, name="x"), lambda ctx,x: f"bitcast(vec2({ctx[x.src[0]]},0))" \ + if x.src[0].dtype == dtypes.half else f"((i32({ctx[x.src[0]]}&0xFFFF)<<16)>>16)"), + (UPat(Ops.BITCAST, name="x"), lambda ctx,x: f"bitcast<{ctx.type_map[x.dtype]}>({ctx[x.src[0]]})"), + (UPat.load(UPat.var("b"), UPat.var("v"), UPat.var("gate")), + lambda ctx,b,v,gate: f"select({ctx[v]}, {ctx.render_load(ctx[b], b.src[0])}, {ctx[gate]})"), + (UPat.load(UPat.var("b")), lambda ctx, b: ctx.render_load(ctx[b], b)), + (UPat.store(UPat.var("b"), UPat.var("v")), lambda ctx,b,v:\ + # (load & mask) | var -> mask = v.src[0].src[1], var = v.src[1] + f"atomicAnd(&{ctx[b]},{ctx[v.src[0].src[1]]});\n atomicAdd(&{ctx[b]},{ctx[v.src[1]]});" if is_packed(b) \ + else f"{ctx[b]} = {ctx[v]};"), + (UPat(Ops.INDEX, src=(UPat.var("b"), UPat.var("idx"))), + lambda ctx,b,idx: f"{ctx[b]}[{strip_parens(ctx[idx]) if idx.arg is Ops.ADD else ctx[idx]}]"), + ]) + base_rewrite + + def render_cast(self, u:UOp, val: str) -> str: return f"{self.type_map[u.dtype]}({val})" + def _render_dtype(self, dtype:DType, sz:int=1, addrspace=AddrSpace.REG, mutable=True, override_ptr=False, shape=None): return "var" + def render_load(self, x:str, u:UOp) -> str: return f"atomicLoad(&{x})" if is_packed(u) else x + def buf_map(self, u:UOp) -> str: return "atomic" if is_packed(u) else self.type_map[u.dtype] + def render_kernel(self, function_name:str, kernel:list[str], bufs:list[tuple[str,tuple[UOp,bool]]], uops:list[UOp], prefix=None) -> str: + local_size = [u.src[0].ssimplify() for u in sorted([u for u in uops if u.op is Ops.SPECIAL and u.arg[0] == 'l'], key=lambda u: u.arg)] + if not local_size: local_size = [1] + bind_it = iter(range(len(bufs))) + external_local_bufs = [line.lstrip() for line in kernel if "var" in line] + kernel[:] = [line for line in kernel if "var" not in line] + prg = "enable f16;\n" if any(uop.dtype == dtypes.half for uop in uops) else "" + prg += "fn nan() -> f32 { let bits = 0xffffffffu; return bitcast(bits); }\n" + prg += "@group(0) @binding(0)\nvar INFINITY : f32;\n" + prg += "\n".join((external_local_bufs or [])+[f"@group(0) @binding({next(bind_it)+1})" + + f"{'var' if u.addrspace == AddrSpace.GLOBAL else 'var'}" + + f"{name}:{f'array<{self.buf_map(u)}>' if u.addrspace == AddrSpace.GLOBAL else self.buf_map(u)};" for name,(u,_) in bufs]) + prg += f"\n@compute @workgroup_size({','.join([str(x) for x in local_size])}) fn {function_name}(@builtin(workgroup_id) gindex: vec3," + return prg + "@builtin(local_invocation_id) lindex: vec3) {\n" + "\n".join(kernel) + "\n}" + + def supported_dtypes(self): return {dtypes.bool, dtypes.char, dtypes.uchar, dtypes.short, dtypes.ushort, dtypes.int32, dtypes.uint32, + dtypes.float, *((dtypes.half,) if "shader-f16" in self.target.arch else ())} diff --git a/artifacts/package_runtime/tinygrad/runtime/__init__.py b/artifacts/package_runtime/tinygrad/runtime/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/__init__.py b/artifacts/package_runtime/tinygrad/runtime/autogen/__init__.py new file mode 100644 index 000000000..3a1920662 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/__init__.py @@ -0,0 +1,185 @@ +import glob, importlib, os, pathlib, shutil, subprocess, tarfile, tempfile +from tinygrad.helpers import fetch, flatten, system, getenv + +root = (here:=pathlib.Path(__file__).parent).parents[2] +nv_src = {"nv_570": "https://github.com/NVIDIA/open-gpu-kernel-modules/archive/81fe4fb417c8ac3b9bdcc1d56827d116743892a5.tar.gz", + "nv_580": "https://github.com/NVIDIA/open-gpu-kernel-modules/archive/2af9f1f0f7de4988432d4ae875b5858ffdb09cc2.tar.gz", + "nv_610": "https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/610.43.03.tar.gz"} +ffmpeg_src = "https://ffmpeg.org/releases/ffmpeg-8.0.1.tar.gz" +rocr_src = "https://github.com/ROCm/rocm-systems/archive/refs/tags/rocm-7.1.1.tar.gz" +linux_headers_deb = "https://snapshot.debian.org/archive/debian/20260207T145350Z/pool/main/l/linux/linux-libc-dev_6.18.9-1_all.deb" +linux_headers_kern_deb = "https://snapshot.debian.org/archive/debian/20260207T145350Z/pool/main/l/linux/linux-headers-6.18.9+deb14-common_6.18.9-1_all.deb" +liburing_src = "https://raw.githubusercontent.com/axboe/liburing/refs/tags/liburing-2.14/src/include/liburing.h" +ggml_common_src = "https://raw.githubusercontent.com/ggml-org/ggml/d4fcfe88a8bcf5c9840be14be6c2fbf1f5b3b2db/src/ggml-common.h" +cudart_src = "https://developer.download.nvidia.com/compute/cuda/redist/cuda_cudart/linux-x86_64/cuda_cudart-linux-x86_64-12.0.146-archive.tar.xz" +nvrtc_src = "https://developer.download.nvidia.com/compute/cuda/redist/cuda_nvrtc/linux-x86_64/cuda_nvrtc-linux-x86_64-12.0.140-archive.tar.xz" +opencl_src = "https://github.com/KhronosGroup/OpenCL-Headers/archive/2e30669d48718fd460f085b4b35b160dad51ce9d.tar.gz" +macossdk = "/var/db/xcode_select_link/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" + +llvm_lib = ( + (win_llvm:=r"'C:\\Program Files\\LLVM\\bin\\LLVM-C.dll' if WIN else ") + + (mac_llvm:=repr([f'/opt/homebrew/opt/llvm@{i}/lib/libLLVM.dylib' for i in reversed(range(14, 21+1))]) + " if OSX else ") + + (other_llvm:=repr(['LLVM'] + [f'LLVM-{i}' for i in reversed(range(14, 21+1))]))) +clang_lib = win_llvm.replace("LLVM-C", "libclang") + (mac_llvm + other_llvm).replace("LLVM", "clang") + +webgpu_lib = "os.path.join(sysconfig.get_paths()['purelib'], 'pydawn', 'lib', 'libwebgpu_dawn.dll') if WIN else 'webgpu_dawn'" +tinymesa_path = "os.path.join(sysconfig.get_paths()['platlib'], 'tinymesa')" +nv_lib_path = ("[f'/{pre}/cuda/targets/{tgt}/lib' for pre in ['opt', 'usr/local'] for tgt in " + "[sysconfig.get_config_vars().get(\"MULTIARCH\", \"\").rsplit(\"-\", 1)[0], 'sbsa-linux']]") + +def load(name, files, **kwargs): + if not (f:=(root/(path:=kwargs.pop("path", __name__)).replace('.','/')/f"{name}.py")).exists() or getenv('REGEN'): + files, kwargs['args'] = files() if callable(files) else files, args() if callable(args:=kwargs.get('args', [])) else args + if (srcs:=kwargs.pop('srcs', None)): + srcpath = (td:=tempfile.TemporaryDirectory(f"autogen-src-{name.replace('/','-')}")).name + "/" + for src in (srcs if isinstance(srcs, list) else [srcs]): + if 'tar' in src: + # dangerous for arbitrary urls! + with tarfile.open(fetch(src, gunzip=src.endswith("gz"))) as tf: + tf.extractall(srcpath) + if not isinstance(srcs, list): srcpath += tf.getnames()[0] # if we just have a single tarball, make this the root + else: fetch(src, name=srcpath + src.split('/')[-1]) + files, kwargs['args'] = [str(f).format(srcpath) for f in files], [a.format(srcpath) for a in kwargs.get('args', [])] + kwargs['anon_names'] = {k.format(srcpath):v for k,v in kwargs.get('anon_names', {}).items()} + if (preprocess:=kwargs.pop('preprocess', None)): preprocess(srcpath) + files = flatten(sorted(glob.glob(p, recursive=True)) if isinstance(p, str) and '*' in p else [p] for p in files) + kwargs['epilog'] = (epi(srcpath) if srcs else epi()) if callable(epi:=kwargs.get('epilog', [])) else epi + try: f.write_text(kwargs.pop("gen", importlib.import_module("tinygrad.runtime.support.autogen").gen)(name, files, **kwargs)) + except Exception as e: raise RuntimeError(f"error while generating {name}") from e + if srcs: td.cleanup() + return importlib.import_module(f"{path}.{name.replace('/', '.')}") + +def __getattr__(nm): + match nm: + case "libc": + return load("libc", lambda: ([i for i in system("dpkg -L libc6-dev").split() if 'sys/mman.h' in i or 'bits/mman-shared.h' in i] + + ["/usr/include/string.h", "/usr/include/elf.h", "/usr/include/unistd.h", "/usr/include/stdio.h", "/usr/include/semaphore.h", + "/usr/include/asm-generic/mman-common.h"]), + args=["-D__USE_GNU", "-D_GNU_SOURCE"], dll="'c'", errno=True, recsym=True, rules=[(r'([a-z]+) = \1', '')]) # removes stdin = stdin + case "avcodec": return load("avcodec", ["{}/libavcodec/hevc/hevc.h", "{}/libavcodec/cbs_h265.h"], srcs=ffmpeg_src) + case "opencl": return load("opencl", ["{}/CL/cl.h"], dll="'OpenCL'", args=["-I{}"], srcs=opencl_src) + case "cuda": return load("cuda", ["{}/include/cuda.h"], dll="'nvcuda' if WIN else 'cuda'", args=["-D__CUDA_API_VERSION_INTERNAL"], srcs=cudart_src, macros=False, prolog=["from tinygrad.helpers import WIN"]) + case "nvrtc": return load("nvrtc", ["{}/include/nvrtc.h"], dll="'nvrtc'", paths=nv_lib_path, srcs=nvrtc_src, prolog=["import sysconfig"]) + case "nvjitlink": load("nvjitlink", [root/"extra/nvJitLink.h"], dll="'nvJitLink'", paths=nv_lib_path, prolog=["import sysconfig"]) + case "kfd": return load("kfd", [root/"extra/hip_gpu_driver/kfd_ioctl.h"]) + case "nv_570" | "nv_580" | "nv_610": + return load(nm, [ + *[root/"extra/nv_gpu_driver"/s for s in ["clc9b0.h", "clc6c0qmd.h","clcec0qmd.h", "nvdec_drv.h"]], "{}/kernel-open/common/inc/nvmisc.h", + *[f"{{}}/src/common/sdk/nvidia/inc/class/cl{s}.h" for s in ["0000", "0070", "0080", "2080", "2080_notification", "c56f", "c86f", "c96f", "c761", + "83de", "b2cc", "c6c0", "cdc0"]], + *[f"{{}}/kernel-open/nvidia-uvm/{s}.h" for s in ["clc6b5", "clc9b5", "clcfb0", "uvm_ioctl", "uvm_linux_ioctl", "hwref/ampere/ga100/dev_fault"]], + *[f"{{}}/src/nvidia/arch/nvalloc/unix/include/nv{s}.h" for s in ["_escape", "-ioctl", "-ioctl-numbers", + "-ioctl-numa", "-unix-nvos-params-wrappers"]], + *[f"{{}}/src/common/sdk/nvidia/inc/{s}.h" for s in ["alloc/alloc_channel", "nvos", "ctrl/ctrlc36f", "ctrl/ctrlcb33", + "ctrl/ctrla06c", "ctrl/ctrl90f1", "ctrl/ctrla06f/ctrla06fgpfifo"]], + *[f"{{}}/src/common/sdk/nvidia/inc/ctrl/ctrl{s}/*.h" for s in ["0000", "0080", "2080", "83de", "b0cc"]], + "{}/kernel-open/common/inc/nvstatus.h", "{}/src/nvidia/generated/g_allclasses.h" + ], args=[ + "-include", "{}/src/common/sdk/nvidia/inc/nvtypes.h", "-I{}/src/common/inc", "-I{}/kernel-open/nvidia-uvm", "-I{}/kernel-open/common/inc", + "-I{}/src/common/sdk/nvidia/inc", "-I{}/src/nvidia/arch/nvalloc/unix/include", "-I{}/src/common/sdk/nvidia/inc/ctrl" + ], rules=[(r'MW\(([^:]+):(.+)\)',r'(\1, \2)'), (r'(\d+):(\d+)', r'(\1, \2)')], srcs=nv_src[nm], anon_names={"{}/kernel-open/common/inc/nvstatus.h:37":"nv_status_codes"}) + case "nv": return load("nv", [ + *[f"{{}}/src/nvidia/inc/kernel/gpu/{s}.h" for s in ["fsp/kern_fsp_cot_payload", "gsp/gsp_init_args"]], + *[f"{{}}/src/nvidia/arch/nvalloc/common/inc/{s}.h" for s in ["gsp/gspifpub", "gsp/gsp_fw_wpr_meta", "gsp/gsp_fw_sr_meta", "rmRiscvUcode", + "fsp/fsp_nvdm_format"]], + *[f"{{}}/src/nvidia/inc/kernel/vgpu/{s}.h" for s in ["rpc_headers", "rpc_global_enums"]], + "{}/src/common/uproc/os/common/include/libos_init_args.h", "{}/src/common/shared/msgq/inc/msgq/msgq_priv.h", + "{}/src/nvidia/generated/g_rpc-structures.h", root/"extra/nv_gpu_driver/g_rpc-message-header.h", root/"extra/nv_gpu_driver/gsp_static_config.h", + *[root/f"extra/nv_gpu_driver/{s}.h" for s in ["vbios", "pci_exp_table", "fw", "hs"]] + ], args=[ + "-DRPC_MESSAGE_STRUCTURES", "-DRPC_STRUCTURES", "-include", "{}/src/common/sdk/nvidia/inc/nvtypes.h", "-I{}/src/nvidia/generated", + "-I{}/src/common/inc", "-I{}/src/nvidia/inc", "-I{}/src/nvidia/interface/", "-I{}/src/nvidia/inc/kernel", "-I{}/src/nvidia/inc/libraries", + "-I{}/src/nvidia/arch/nvalloc/common/inc", "-I{}/kernel-open/nvidia-uvm", "-I{}/kernel-open/common/inc", "-I{}/src/common/sdk/nvidia/inc", + "-I{}/src/nvidia/arch/nvalloc/unix/include", "-I{}/src/common/sdk/nvidia/inc/ctrl" + ], srcs=nv_src["nv_570"], anon_names={ + "{}/src/nvidia/inc/kernel/vgpu/rpc_global_enums.h:8": "rpc_fns", + "{}/src/nvidia/inc/kernel/vgpu/rpc_global_enums.h:244": "rpc_events" + }) + # this defines all syscall numbers. should probably unify linux autogen? + case "io_uring": + return load("io_uring", ["{}/liburing.h", "{}/usr/include/linux/io_uring.h", "{}/usr/include/asm-generic/unistd.h"], + args=["-I{}/usr/include"], srcs=[linux_headers_deb, liburing_src], rules=[('__NR', 'NR')], + preprocess=lambda path: subprocess.run(f"ar x {linux_headers_deb.split('/')[-1]} && tar xf data.tar.xz", cwd=path, shell=True, check=True)) + case "llvm": return load("llvm", lambda: [system("llvm-config-20 --includedir")+"/llvm-c/**/*.h"], dll=llvm_lib, + args=lambda: system("llvm-config-20 --cflags").split(), recsym=True, prolog=["from tinygrad.helpers import WIN, OSX"]) + case "pci": return load("pci", ["{}/usr/include/linux/pci_regs.h"], srcs=linux_headers_deb, + preprocess=lambda path: subprocess.run(f"ar x {linux_headers_deb.split('/')[-1]} && tar xf data.tar.xz", cwd=path, shell=True, check=True)) + case "vfio": return load("vfio", ["{}/usr/include/linux/vfio.h"], args=["-I{}/usr/include"], srcs=linux_headers_deb, + preprocess=lambda path: subprocess.run(f"ar x {linux_headers_deb.split('/')[-1]} && tar xf data.tar.xz", cwd=path, shell=True, check=True)) + # could add rule: WGPU_COMMA -> ',' + case "webgpu": return load("webgpu", [root/"extra/webgpu/webgpu.h"], dll=webgpu_lib, + prolog=["from tinygrad.helpers import WIN, OSX", "import sysconfig, os"]) + case "libusb": return load("libusb", ["/usr/include/libusb-1.0/libusb.h"], dll="'usb-1.0'") + case "hip": return load("hip", ["/opt/rocm/include/hip/hip_ext.h", "/opt/rocm/include/hip/hiprtc.h", + "/opt/rocm/include/hip/hip_runtime_api.h", "/opt/rocm/include/hip/driver_types.h"], + dll="os.getenv('ROCM_PATH', '/opt/rocm')+'/lib/libamdhip64.so'", + args=["-D__HIP_PLATFORM_AMD__", "-I/opt/rocm/include", "-x", "c++"], prolog=["import os"]) + case "comgr" | "comgr_3": + return load("comgr_3" if nm == "comgr_3" else "comgr", ["/opt/rocm/include/amd_comgr/amd_comgr.h"], + dll= "[os.getenv('ROCM_PATH', '/opt/rocm')+'/lib/libamd_comgr.so', 'amd_comgr']", + args=["-D__HIP_PLATFORM_AMD__", "-I/opt/rocm/include", "-x", "c++"], prolog=["import os"]) + case "hsa": return load("hsa", [*[f"{{}}/projects/rocr-runtime/runtime/hsa-runtime/core/inc/{s}.h" for s in ["registers"]], + *[f"{{}}/projects/rocr-runtime/runtime/hsa-runtime/inc/{s}.h" for s in [ + "hsa", "hsa_ext_amd", "amd_hsa_signal", "amd_hsa_queue", "amd_hsa_kernel_code", + "hsa_ext_finalize", "hsa_ext_image", "hsa_ven_amd_aqlprofile"]]], + srcs=rocr_src, args=["-DLITTLEENDIAN_CPU"], prolog=["import os"]) + case "amdgpu_kd": return load("amdgpu_kd", lambda: [f"{system('llvm-config-20 --includedir')}/llvm/Support/AMDHSAKernelDescriptor.h"], + args=lambda: system("llvm-config-20 --cflags").split() + ["-x", "c++"], recsym=True, macros=False) + case "amd_gpu": return load("amd_gpu", [root/f"extra/hip_gpu_driver/{s}.h" for s in ["sdma_registers", "nvd", "gc_11_0_0_offset", + "sienna_cichlid_ip_offset"]], + args=["-I/opt/rocm/include", "-x", "c++"]) + case "amdgpu_drm": return load("amdgpu_drm", [ "/usr/include/drm/drm.h", *[root/f"extra/hip_gpu_driver/{s}.h" for s in ["amdgpu_drm"]]]) + case "kgsl": return load("kgsl", [root/"extra/qcom_gpu_driver/msm_kgsl.h"], args=["-D__user="]) + case "qcom_dsp": + return load("qcom_dsp", [root/f"extra/dsp/include/{s}.h" for s in ["ion", "msm_ion", "adsprpc_shared", "remote_default", "apps_std"]]) + case "sqtt": return load("sqtt", [root/"extra/sqtt/sqtt.h"]) + case "rocprof": + return load("rocprof", [f"{{}}/include/{s}.h" for s in ["rocprof_trace_decoder", "trace_decoder_instrument", "trace_decoder_types"]], + dll= "['rocprof-trace-decoder', p:='/usr/local/lib/rocprof-trace-decoder.so', p.replace('so','dylib')]", + srcs="https://github.com/ROCm/rocprof-trace-decoder/archive/dd0485100971522cc4cd8ae136bdda431061a04d.tar.gz") + case "mesa": return load("mesa", [ + *[f"{{}}/src/compiler/nir/{s}.h" for s in ["nir", "nir_builder", "nir_shader_compiler_options", "nir_serialize"]], "{}/gen/nir_intrinsics.h", + *[f"{{}}/src/nouveau/{s}.h" for s in ["headers/nv_device_info", "compiler/nak"]], + *[f"{{}}/src/gallium/auxiliary/gallivm/lp_bld{s}.h" for s in ["", "_passmgr", "_misc", "_type", "_init", "_nir", "_struct", "_jit_types", + "_flow", "_const"]], + *[f"{{}}/src/freedreno/{s}.h" for s in ["common/freedreno_dev_info", "ir3/ir3_compiler", "ir3/ir3_shader", "ir3/ir3_nir"]], + "{}/src/compiler/glsl_types.h", "{}/src/util/blob.h", "{}/src/util/ralloc.h", "{}/gen/ir3-isa.h", "{}/gen/builtin_types.h", + "{}/gen/a6xx.xml.h", "{}/gen/adreno_pm4.xml.h", "{}/gen/a6xx_enums.xml.h", "{}/gen/a6xx_descriptors.xml.h"], args=lambda:[ + "-DHAVE_ENDIAN_H", "-DHAVE_STRUCT_TIMESPEC", "-DHAVE_PTHREAD", "-DHAVE_FUNC_ATTRIBUTE_PACKED", "-I{}/src", "-I{}/include", "-I{}/gen", + "-I{}/src/compiler/nir", "-I{}/src/gallium/auxiliary", "-I{}/src/gallium/include", "-I{}/src/freedreno/common", + f"-I{system('llvm-config-20 --includedir')}"], + preprocess=lambda path: subprocess.run("\n".join(["mkdir -p gen/util/format", "python3 src/compiler/builtin_types_h.py gen/builtin_types.h", + "python3 src/compiler/isaspec/decode.py --xml src/freedreno/isa/ir3.xml --out-c /dev/null --out-h gen/ir3-isa.h", + "python3 src/util/format/u_format_table.py src/util/format/u_format.yaml --enums > gen/util/format/u_format_gen.h", + *["python3 src/freedreno/registers/gen_header.py --rnn src/freedreno/registers/ --xml " + + f"src/freedreno/registers/adreno/{s}.xml c-defines > gen/{s}.xml.h" for s in ["a6xx", "adreno_pm4", "a6xx_enums", "a6xx_descriptors"]], + *[f"python3 src/compiler/{s}_h.py > gen/{s.split('/')[-1]}.h" for s in ["nir/nir_opcodes", "nir/nir_builder_opcodes"]], + *[f"python3 src/compiler/nir/nir_{s}_h.py --outdir gen" for s in ["intrinsics", "intrinsics_indices"]]]), cwd=path, shell=True, check=True), + srcs="https://gitlab.freedesktop.org/mesa/mesa/-/archive/mesa-25.2.7/mesa-25.2.7.tar.gz", + dll=f"'tinymesa_cpu' if DEV.renderer == 'LVP' else 'tinymesa', {tinymesa_path}, emsg='pip install tinymesa==25.2.7.2'", + prolog=["from tinygrad.helpers import DEV", "import gzip, base64, platform, sysconfig, os"], + epilog=lambda path: [system(f"{root}/extra/mesa/lvp_nir_options.sh {path}")]) + case "libclang": + return load("libclang", + lambda: [f"{system('llvm-config-20 --includedir')}/clang-c/{s}.h" for s in ["Index", "CXString", "CXSourceLocation", "CXFile"]], + dll=clang_lib, prolog=["from tinygrad.helpers import WIN, OSX"], args=lambda: system("llvm-config-20 --cflags").split()) + case "metal": + return load("metal", [f"{macossdk}/System/Library/Frameworks/Metal.framework/Headers/MTL{s}.h" for s in + ["ComputeCommandEncoder", "ComputePipeline", "CommandQueue", "Device", "IndirectCommandBuffer", "Resource", "CommandEncoder"]], + dll="'Metal'", args=["-xobjective-c","-isysroot",macossdk], types={"dispatch_data_t":"objc.id_"}) + case "iokit": return load("iokit", [f"{macossdk}/System/Library/Frameworks/IOKit.framework/Headers/IOKitLib.h"], dll="'IOKit'", + args=["-isysroot", macossdk]) + case "corefoundation": return load("corefoundation", + [f"{macossdk}/System/Library/Frameworks/CoreFoundation.framework/Headers/CF{s}.h" for s in ["String", "Data"]], + dll="'CoreFoundation'",args=["-isysroot", macossdk]) + case "llvm_qcom": return load("llvm_qcom", [root/"extra/tinydreno.h"], dll="'llvm-qcom'") + case "ggml_common": return load("ggml_common", ["{}/ggml-common.h"], srcs=ggml_common_src, + args=["-DGGML_COMMON_DECL_C", "-DGGML_COMMON_IMPL_C"], macros=False) + case "mlx5": + kh = "{}/usr/src/linux-headers-6.18.9+deb14-common/include/linux/mlx5" + return load("mlx5", [root/"extra/mlx_driver/mlx5.h", f"{kh}/mlx5_ifc.h"], srcs=linux_headers_kern_deb, + args=["-Du8=unsigned char", "-Du16=unsigned short", "-Du32=unsigned int", "-Du64=unsigned long long", + "-D__be16=unsigned short", "-D__be32=unsigned int", "-D__be64=unsigned long long", f"-I{kh}"], + preprocess=lambda path: subprocess.run(f"ar x {linux_headers_kern_deb.split('/')[-1]} && tar xf data.tar.xz", + cwd=path, shell=True, check=True)) + case _: raise AttributeError(f"no such autogen: {nm}") diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/__init__.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/__init__.py new file mode 100644 index 000000000..54c5f2cc9 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/__init__.py @@ -0,0 +1,102 @@ +import pathlib, hashlib, re, itertools +from tinygrad.runtime.autogen import load, root + +__all__ = ["am", "pm4_soc15", "pm4_nv", "sdma_4_0_0", "sdma_5_0_0", "sdma_6_0_0", "smu_13_0_0", "smu_13_0_6", "smu_13_0_12", "smu_14_0_2", + "fw", "navi_offsets", "vega_offsets", "regs", "soc_9", "soc_11", "soc_12", "pmc"] + +am_src="https://github.com/ROCm/ROCK-Kernel-Driver/archive/33970e1351f5e511029602454979f3de7e22260f.tar.gz" +rocm_src="https://github.com/ROCm/rocm-systems/archive/cccc350dc620e61ae2554978b62ab3532dc10bd9.tar.gz" +AMD, AMDINC = "{}/drivers/gpu/drm/amd", "{}/drivers/gpu/drm/amd/include" +inc, kern_rules = ["-include", "stdint.h"], [(r'le32_to_cpu', ''),] +fw_src="https://gitlab.com/kernel-firmware/linux-firmware/-/archive/1e2c15348485939baf1b6d1f5a7a3b799d80703d/1e2c15348485939baf1b6d1f5a7a3b799d80703d.tar.gz" +pmc_src="https://raw.githubusercontent.com/ROCm/rocm-systems/cccc350dc620e61ae2554978b62ab3532dc10bd9/projects/rocprofiler-compute/src/rocprof_compute_soc/profile_configs/counter_defs.yaml" + +reg_files = { + "gc": [(9,4,3), (11,0,0), (11,0,3), (11,5,0), (12,0,0)], + "mmhub": [(1,8,0), (3,0,0), (3,0,1), (3,0,2), (3,3,0), (4,1,0)], + "nbio": [(4,3,0), (7,2,0), (7,7,0), (7,9,0), (7,11,0)], "nbif": [(6,3,1)], + "mp": [(11,0,0), (13,0,0), (14,0,2)], "hdp": [(4,4,2), (6,0,0), (7,0,0)], + "osssys": [(4,4,2), (6,0,0), (6,1,0), (7,0,0)], "sdma": [(4,4,2)] +} + +reg_patterns = { + "gc": ["GCVM", "GCMC_VM", "CP_(HQD|MQD|MEC|ME_CNTL|PERFMON|RB_WPTR_POLL_CNTL|INT_CNTL|STAT|PFP_PRGRM|ME_PRGRM|COHER_START)", "COMPUTE_", + "(SQ|GL2C|TCC)_PERFCOUNTER", "SQ_THREAD_TRACE", "SPI_(CONFIG_CNTL|COMPUTE_QUEUE_RESET)", "GRBM", "SH_MEM", "RLC", "TCP", "GB_ADDR_CONFIG", + "SDMA[01]_(WATCHDOG_CNTL|UTCL1_(CNTL|PAGE)|MCU_CNTL|F32_CNTL|CNTL|QUEUE0_|RLC_CGCG_CTRL)", "SCRATCH_REG[67]"], + "mmhub": ["MMVM", "MMMC_VM", "MM_ATC_L2_MISC_CG"], + "nbio": (nbio:=["BIF_BX_PF[01]_GPU_HDP_FLUSH", "BIF_BX_PF0_RSMU", "BIF_BX0_(REMAP_HDP_MEM_FLUSH_CNTL|BIF_DOORBELL_INT_CNTL|PCIE_INDEX2|PCIE_DATA2)", + "BIFC_(DOORBELL_ACCESS_EN_PF|GFX_INT_MONITOR_MASK)", "XCC_DOORBELL_FENCE", "DOORBELL0_CTRL_ENTRY", "GDC_S2A0_S2A_DOORBELL_ENTRY", + "S2A_DOORBELL_ENTRY", "RCC_DEV0_EPF0_RCC_DOORBELL_APER_EN", "RCC_DEV0_EPF2_STRAP2"]), + "nbif": nbio, + "mp": ["MP([01]|ASP)_SMN_C2PMSG"], "hdp": ["HDP_MEM_POWER_CTRL"], "oss": ["IH_"], "sdma": ["SDMA_GFX", "SDMA_CNTL"] +} + +soc_patterns = ["SQ_TT", "VGT_EVENT_TYPE", "CS", "MTYPE", "SH"] + +def __getattr__(nm): + match nm: + case "am": return load("am/am", [root/f"extra/amdpci/headers/{s}.h" for s in ["v11_structs", "v12_structs", "amdgpu_vm", + "discovery", "amdgpu_ucode", "psp_gfx_if", "amdgpu_psp", "amdgpu_irq", "amdgpu_doorbell"]] + [f"{AMD}/amdkfd/soc15_int.h"] + \ + [f"{AMDINC}/ivsrcid/{s}.h" for s in [f"gfx/irqsrcs_gfx_{x}_0" for x in ('9','11_0','12_0')] + [f"sdma0/irqsrcs_sdma0_{x}_0" for x in (4,5)]] + \ + [f"{AMDINC}/{s}.h" for s in ["v9_structs", "soc15_ih_clientid"]], args=inc, srcs=am_src, rules=kern_rules) + case "pm4_soc15": return load("am/pm4_soc15", [f"{AMD}/amdkfd/kfd_pm4_headers_ai.h", f"{AMD}/amdgpu/soc15d.h"], srcs=am_src) + case "pm4_nv": return load("am/pm4_nv", [f"{AMD}/amdkfd/kfd_pm4_headers_ai.h", f"{AMD}/amdgpu/nvd.h"], srcs=am_src) + case "sdma_4_0_0": return load("am/sdma_4_0_0", [root/"extra/hip_gpu_driver/sdma_registers.h", f"{AMD}/amdgpu/vega10_sdma_pkt_open.h"], + args=["-I/opt/rocm/include", "-x", "c++"], srcs=am_src) + case "sdma_5_0_0": return load("am/sdma_5_0_0", [root/"extra/hip_gpu_driver/sdma_registers.h", f"{AMD}/amdgpu/navi10_sdma_pkt_open.h"], + args=["-I/opt/rocm/include", "-x", "c++"], srcs=am_src) + case "sdma_6_0_0": return load("am/sdma_6_0_0", [root/"extra/hip_gpu_driver/sdma_registers.h", f"{AMD}/amdgpu/sdma_v6_0_0_pkt_open.h"], + args=["-I/opt/rocm/include", "-x", "c++"], srcs=am_src) + case "smu_13_0_0": return load("am/smu_13_0_0", [f"{AMD}/pm/swsmu/inc/pmfw_if/{s}.h" for s in ["smu_v13_0_0_ppsmc","smu13_driver_if_v13_0_0"]] + +[root/"extra/amdpci/headers/amdgpu_smu.h"], args=inc, srcs=am_src) + case "smu_13_0_6": return load("am/smu_13_0_6", [f"{AMD}/pm/swsmu/inc/pmfw_if/{s}.h" for s in ["smu_v13_0_6_ppsmc","smu_v13_0_6_pmfw", \ + "smu13_driver_if_v13_0_6"]] +[root/"extra/amdpci/headers/amdgpu_smu.h"], args=inc, srcs=am_src) + case "smu_13_0_12": return load("am/smu_13_0_12", [f"{AMD}/pm/swsmu/inc/pmfw_if/{s}.h" for s in ["smu_v13_0_12_ppsmc","smu_v13_0_12_pmfw", + "smu13_driver_if_v13_0_6"]] +[root/"extra/amdpci/headers/amdgpu_smu.h"], args=inc, srcs=am_src) + case "smu_14_0_2": return load("am/smu_14_0_2", [f"{AMD}/pm/swsmu/inc/pmfw_if/{s}.h" for s in ["smu_v14_0_0_pmfw", "smu_v14_0_2_ppsmc", + "smu14_driver_if_v14_0"]]+[root/"extra/amdpci/headers/amdgpu_smu.h"], args=inc, srcs=am_src) + # firmware hashes + case "fw": + def genfw(name, files, **kwargs): return "\n".join(["hashes = {"] + [f" {p.name!r}: {hashlib.sha256(p.read_bytes()).hexdigest()!r}," + for f in files if (p:=pathlib.Path(f)).is_file()] + ["}"]) + return load("am/fw", ["{}/amdgpu/psp_*_sos.bin", "{}/amdgpu/smu_*.bin", "{}/amdgpu/sdma_*.bin"] + + [f"{{}}/amdgpu/gc_*_{x}.bin" for x in ["pfp", "me", "mec", "imu", "rlc"]], srcs=fw_src, gen=genfw) + case "navi_offsets": return load("am/navi_offsets", [f"{AMD}/include/sienna_cichlid_ip_offset.h"], srcs=am_src) + case "vega_offsets": return load("am/vega_offsets", [f"{AMD}/include/vega20_ip_offset.h"], srcs=am_src) + case "regs": + def genreg(_, files, **kwargs): + out = ["__all__ = " + repr([file.split('/')[-1] for file in files])] + for file, nm in [(file.replace("mp_11_0_0", "mp_11_0"), file.split('/')[-1]) for file in files]: + pats = reg_patterns[prefix := {"osssys": "oss"}.get(x:=nm.split("_", 1)[0], x)] + + def split_name(name): return name[:(pos:=next((i for i,c in enumerate(name) if c.isupper()), len(name)))], name[pos:] + # handle CDNA's different register names + def normalize(reg): + return s[0] + prefix.upper()[:2] + s[1] if prefix in ("gc", "mmhub") and (s:=split_name(reg))[1].startswith(("VM_", "MC_VM_")) else reg + def extract(lines, pat): return ((normalize(m.group(1)), int(m.group(2), 0)) for l in lines if (m:=re.match(pat, l))) + + offset, sh_mask = pathlib.Path(f"{file}_offset.h").read_text().splitlines(), pathlib.Path(f"{file}_sh_mask.h").read_text().splitlines() + defs = {k:v for k,v in extract(offset, r'#define\s+((?:mm|reg)\S+)\s+(0x[\da-fA-F]+|\d+)') if any(re.match("(mm|reg)"+p, k) for p in pats)} + fields = {reg: {name.split('__')[1].lower(): ((mask & -mask).bit_length() - 1, mask.bit_length() - 1) for name, mask in fs} + for reg, fs in itertools.groupby(extract(sh_mask, r'#define\s+(\S+)_MASK\s+(0x[\da-fA-F]+|\d+)'), lambda x: x[0].split('__')[0])} + + regs = {reg: (off, defs[f"{reg}_BASE_IDX"], fields.get(split_name(reg)[1], {})) for reg,off in defs.items() if f"{reg}_BASE_IDX" in defs} + print(f"defined {len(regs)} registers for {nm}") + out.extend([f"{nm} = {{"] + [f" {k!r}: {v!r}," for k,v in regs.items()] + ["}"]) + return "\n".join(out) + return load("am/regs", [AMDINC + "/asic_reg/" + {"osssys":"oss"}.get(pre, pre) + f"/{pre}_{'_'.join(map(str, ver))}" + for pre in reg_files for ver in sorted(reg_files[pre])], srcs=am_src, gen=genreg) + case "soc_9" | "soc_11" | "soc_12": + return load(f"am/{nm}", ["{}/projects/aqlprofile/linux/" + {9: "vega10", 11: "soc21", 12: "soc24"}[int(nm.split('_')[1])] + "_enum.h"], + srcs=rocm_src, patterns=soc_patterns, macros=False) + case "pmc": + def genpmc(_, files, **kwargs): + from yaml import safe_load # type: ignore + with open(files[0], "r") as f: data = safe_load(f) + out = ["counters = {"] + for counter in [c for c in data['rocprofiler-sdk']['counters'] if any('block' in d for d in c['definitions'])]: + out.extend([f" {counter['name']!r}: {{", + *[f" {a!r}: ({d['block']!r}, {d['event']})," for d in counter['definitions'] for a in d['architectures']], " },"]) + return "\n".join(out + ["}"]) + return load("am/pmc", ["{}/counter_defs.yaml"], srcs=pmc_src, gen=genpmc) + case _: raise AttributeError(f"no such autogen: {nm}") diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/am.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/am.py new file mode 100644 index 000000000..15bc876f4 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/am.py @@ -0,0 +1,4468 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class struct_v11_gfx_mqd(c.Struct): + SIZE = 2048 + shadow_base_lo: int + shadow_base_hi: int + gds_bkup_base_lo: int + gds_bkup_base_hi: int + fw_work_area_base_lo: int + fw_work_area_base_hi: int + shadow_initialized: int + ib_vmid: int + reserved_8: int + reserved_9: int + reserved_10: int + reserved_11: int + reserved_12: int + reserved_13: int + reserved_14: int + reserved_15: int + reserved_16: int + reserved_17: int + reserved_18: int + reserved_19: int + reserved_20: int + reserved_21: int + reserved_22: int + reserved_23: int + reserved_24: int + reserved_25: int + reserved_26: int + reserved_27: int + reserved_28: int + reserved_29: int + reserved_30: int + reserved_31: int + reserved_32: int + reserved_33: int + reserved_34: int + reserved_35: int + reserved_36: int + reserved_37: int + reserved_38: int + reserved_39: int + reserved_40: int + reserved_41: int + reserved_42: int + reserved_43: int + reserved_44: int + reserved_45: int + reserved_46: int + reserved_47: int + reserved_48: int + reserved_49: int + reserved_50: int + reserved_51: int + reserved_52: int + reserved_53: int + reserved_54: int + reserved_55: int + reserved_56: int + reserved_57: int + reserved_58: int + reserved_59: int + reserved_60: int + reserved_61: int + reserved_62: int + reserved_63: int + reserved_64: int + reserved_65: int + reserved_66: int + reserved_67: int + reserved_68: int + reserved_69: int + reserved_70: int + reserved_71: int + reserved_72: int + reserved_73: int + reserved_74: int + reserved_75: int + reserved_76: int + reserved_77: int + reserved_78: int + reserved_79: int + reserved_80: int + reserved_81: int + reserved_82: int + reserved_83: int + checksum_lo: int + checksum_hi: int + cp_mqd_query_time_lo: int + cp_mqd_query_time_hi: int + reserved_88: int + reserved_89: int + reserved_90: int + reserved_91: int + cp_mqd_query_wave_count: int + cp_mqd_query_gfx_hqd_rptr: int + cp_mqd_query_gfx_hqd_wptr: int + cp_mqd_query_gfx_hqd_offset: int + reserved_96: int + reserved_97: int + reserved_98: int + reserved_99: int + reserved_100: int + reserved_101: int + reserved_102: int + reserved_103: int + control_buf_addr_lo: int + control_buf_addr_hi: int + disable_queue: int + reserved_107: int + reserved_108: int + reserved_109: int + reserved_110: int + reserved_111: int + reserved_112: int + reserved_113: int + reserved_114: int + reserved_115: int + reserved_116: int + reserved_117: int + reserved_118: int + reserved_119: int + reserved_120: int + reserved_121: int + reserved_122: int + reserved_123: int + reserved_124: int + reserved_125: int + reserved_126: int + reserved_127: int + cp_mqd_base_addr: int + cp_mqd_base_addr_hi: int + cp_gfx_hqd_active: int + cp_gfx_hqd_vmid: int + reserved_131: int + reserved_132: int + cp_gfx_hqd_queue_priority: int + cp_gfx_hqd_quantum: int + cp_gfx_hqd_base: int + cp_gfx_hqd_base_hi: int + cp_gfx_hqd_rptr: int + cp_gfx_hqd_rptr_addr: int + cp_gfx_hqd_rptr_addr_hi: int + cp_rb_wptr_poll_addr_lo: int + cp_rb_wptr_poll_addr_hi: int + cp_rb_doorbell_control: int + cp_gfx_hqd_offset: int + cp_gfx_hqd_cntl: int + reserved_146: int + reserved_147: int + cp_gfx_hqd_csmd_rptr: int + cp_gfx_hqd_wptr: int + cp_gfx_hqd_wptr_hi: int + reserved_151: int + reserved_152: int + reserved_153: int + reserved_154: int + reserved_155: int + cp_gfx_hqd_mapped: int + cp_gfx_hqd_que_mgr_control: int + reserved_158: int + reserved_159: int + cp_gfx_hqd_hq_status0: int + cp_gfx_hqd_hq_control0: int + cp_gfx_mqd_control: int + reserved_163: int + reserved_164: int + reserved_165: int + reserved_166: int + reserved_167: int + reserved_168: int + reserved_169: int + cp_num_prim_needed_count0_lo: int + cp_num_prim_needed_count0_hi: int + cp_num_prim_needed_count1_lo: int + cp_num_prim_needed_count1_hi: int + cp_num_prim_needed_count2_lo: int + cp_num_prim_needed_count2_hi: int + cp_num_prim_needed_count3_lo: int + cp_num_prim_needed_count3_hi: int + cp_num_prim_written_count0_lo: int + cp_num_prim_written_count0_hi: int + cp_num_prim_written_count1_lo: int + cp_num_prim_written_count1_hi: int + cp_num_prim_written_count2_lo: int + cp_num_prim_written_count2_hi: int + cp_num_prim_written_count3_lo: int + cp_num_prim_written_count3_hi: int + reserved_186: int + reserved_187: int + reserved_188: int + reserved_189: int + mp1_smn_fps_cnt: int + sq_thread_trace_buf0_base: int + sq_thread_trace_buf0_size: int + sq_thread_trace_buf1_base: int + sq_thread_trace_buf1_size: int + sq_thread_trace_wptr: int + sq_thread_trace_mask: int + sq_thread_trace_token_mask: int + sq_thread_trace_ctrl: int + sq_thread_trace_status: int + sq_thread_trace_dropped_cntr: int + sq_thread_trace_finish_done_debug: int + sq_thread_trace_gfx_draw_cntr: int + sq_thread_trace_gfx_marker_cntr: int + sq_thread_trace_hp3d_draw_cntr: int + sq_thread_trace_hp3d_marker_cntr: int + reserved_206: int + reserved_207: int + cp_sc_psinvoc_count0_lo: int + cp_sc_psinvoc_count0_hi: int + cp_pa_cprim_count_lo: int + cp_pa_cprim_count_hi: int + cp_pa_cinvoc_count_lo: int + cp_pa_cinvoc_count_hi: int + cp_vgt_vsinvoc_count_lo: int + cp_vgt_vsinvoc_count_hi: int + cp_vgt_gsinvoc_count_lo: int + cp_vgt_gsinvoc_count_hi: int + cp_vgt_gsprim_count_lo: int + cp_vgt_gsprim_count_hi: int + cp_vgt_iaprim_count_lo: int + cp_vgt_iaprim_count_hi: int + cp_vgt_iavert_count_lo: int + cp_vgt_iavert_count_hi: int + cp_vgt_hsinvoc_count_lo: int + cp_vgt_hsinvoc_count_hi: int + cp_vgt_dsinvoc_count_lo: int + cp_vgt_dsinvoc_count_hi: int + cp_vgt_csinvoc_count_lo: int + cp_vgt_csinvoc_count_hi: int + reserved_230: int + reserved_231: int + reserved_232: int + reserved_233: int + reserved_234: int + reserved_235: int + reserved_236: int + reserved_237: int + reserved_238: int + reserved_239: int + reserved_240: int + reserved_241: int + reserved_242: int + reserved_243: int + reserved_244: int + reserved_245: int + reserved_246: int + reserved_247: int + reserved_248: int + reserved_249: int + reserved_250: int + reserved_251: int + reserved_252: int + reserved_253: int + reserved_254: int + reserved_255: int + reserved_256: int + reserved_257: int + reserved_258: int + reserved_259: int + reserved_260: int + reserved_261: int + reserved_262: int + reserved_263: int + reserved_264: int + reserved_265: int + reserved_266: int + reserved_267: int + vgt_strmout_buffer_filled_size_0: int + vgt_strmout_buffer_filled_size_1: int + vgt_strmout_buffer_filled_size_2: int + vgt_strmout_buffer_filled_size_3: int + reserved_272: int + reserved_273: int + reserved_274: int + reserved_275: int + vgt_dma_max_size: int + vgt_dma_num_instances: int + reserved_278: int + reserved_279: int + reserved_280: int + reserved_281: int + reserved_282: int + reserved_283: int + reserved_284: int + reserved_285: int + reserved_286: int + reserved_287: int + it_set_base_ib_addr_lo: int + it_set_base_ib_addr_hi: int + reserved_290: int + reserved_291: int + reserved_292: int + reserved_293: int + reserved_294: int + reserved_295: int + reserved_296: int + reserved_297: int + reserved_298: int + reserved_299: int + reserved_300: int + reserved_301: int + reserved_302: int + reserved_303: int + reserved_304: int + reserved_305: int + reserved_306: int + reserved_307: int + reserved_308: int + reserved_309: int + reserved_310: int + reserved_311: int + reserved_312: int + reserved_313: int + reserved_314: int + reserved_315: int + reserved_316: int + reserved_317: int + reserved_318: int + reserved_319: int + reserved_320: int + reserved_321: int + reserved_322: int + reserved_323: int + reserved_324: int + reserved_325: int + reserved_326: int + reserved_327: int + reserved_328: int + reserved_329: int + reserved_330: int + reserved_331: int + reserved_332: int + reserved_333: int + reserved_334: int + reserved_335: int + reserved_336: int + reserved_337: int + reserved_338: int + reserved_339: int + reserved_340: int + reserved_341: int + reserved_342: int + reserved_343: int + reserved_344: int + reserved_345: int + reserved_346: int + reserved_347: int + reserved_348: int + reserved_349: int + reserved_350: int + reserved_351: int + reserved_352: int + reserved_353: int + reserved_354: int + reserved_355: int + spi_shader_pgm_rsrc3_ps: int + spi_shader_pgm_rsrc3_vs: int + spi_shader_pgm_rsrc3_gs: int + spi_shader_pgm_rsrc3_hs: int + spi_shader_pgm_rsrc4_ps: int + spi_shader_pgm_rsrc4_vs: int + spi_shader_pgm_rsrc4_gs: int + spi_shader_pgm_rsrc4_hs: int + db_occlusion_count0_low_00: int + db_occlusion_count0_hi_00: int + db_occlusion_count1_low_00: int + db_occlusion_count1_hi_00: int + db_occlusion_count2_low_00: int + db_occlusion_count2_hi_00: int + db_occlusion_count3_low_00: int + db_occlusion_count3_hi_00: int + db_occlusion_count0_low_01: int + db_occlusion_count0_hi_01: int + db_occlusion_count1_low_01: int + db_occlusion_count1_hi_01: int + db_occlusion_count2_low_01: int + db_occlusion_count2_hi_01: int + db_occlusion_count3_low_01: int + db_occlusion_count3_hi_01: int + db_occlusion_count0_low_02: int + db_occlusion_count0_hi_02: int + db_occlusion_count1_low_02: int + db_occlusion_count1_hi_02: int + db_occlusion_count2_low_02: int + db_occlusion_count2_hi_02: int + db_occlusion_count3_low_02: int + db_occlusion_count3_hi_02: int + db_occlusion_count0_low_03: int + db_occlusion_count0_hi_03: int + db_occlusion_count1_low_03: int + db_occlusion_count1_hi_03: int + db_occlusion_count2_low_03: int + db_occlusion_count2_hi_03: int + db_occlusion_count3_low_03: int + db_occlusion_count3_hi_03: int + db_occlusion_count0_low_04: int + db_occlusion_count0_hi_04: int + db_occlusion_count1_low_04: int + db_occlusion_count1_hi_04: int + db_occlusion_count2_low_04: int + db_occlusion_count2_hi_04: int + db_occlusion_count3_low_04: int + db_occlusion_count3_hi_04: int + db_occlusion_count0_low_05: int + db_occlusion_count0_hi_05: int + db_occlusion_count1_low_05: int + db_occlusion_count1_hi_05: int + db_occlusion_count2_low_05: int + db_occlusion_count2_hi_05: int + db_occlusion_count3_low_05: int + db_occlusion_count3_hi_05: int + db_occlusion_count0_low_06: int + db_occlusion_count0_hi_06: int + db_occlusion_count1_low_06: int + db_occlusion_count1_hi_06: int + db_occlusion_count2_low_06: int + db_occlusion_count2_hi_06: int + db_occlusion_count3_low_06: int + db_occlusion_count3_hi_06: int + db_occlusion_count0_low_07: int + db_occlusion_count0_hi_07: int + db_occlusion_count1_low_07: int + db_occlusion_count1_hi_07: int + db_occlusion_count2_low_07: int + db_occlusion_count2_hi_07: int + db_occlusion_count3_low_07: int + db_occlusion_count3_hi_07: int + db_occlusion_count0_low_10: int + db_occlusion_count0_hi_10: int + db_occlusion_count1_low_10: int + db_occlusion_count1_hi_10: int + db_occlusion_count2_low_10: int + db_occlusion_count2_hi_10: int + db_occlusion_count3_low_10: int + db_occlusion_count3_hi_10: int + db_occlusion_count0_low_11: int + db_occlusion_count0_hi_11: int + db_occlusion_count1_low_11: int + db_occlusion_count1_hi_11: int + db_occlusion_count2_low_11: int + db_occlusion_count2_hi_11: int + db_occlusion_count3_low_11: int + db_occlusion_count3_hi_11: int + db_occlusion_count0_low_12: int + db_occlusion_count0_hi_12: int + db_occlusion_count1_low_12: int + db_occlusion_count1_hi_12: int + db_occlusion_count2_low_12: int + db_occlusion_count2_hi_12: int + db_occlusion_count3_low_12: int + db_occlusion_count3_hi_12: int + db_occlusion_count0_low_13: int + db_occlusion_count0_hi_13: int + db_occlusion_count1_low_13: int + db_occlusion_count1_hi_13: int + db_occlusion_count2_low_13: int + db_occlusion_count2_hi_13: int + db_occlusion_count3_low_13: int + db_occlusion_count3_hi_13: int + db_occlusion_count0_low_14: int + db_occlusion_count0_hi_14: int + db_occlusion_count1_low_14: int + db_occlusion_count1_hi_14: int + db_occlusion_count2_low_14: int + db_occlusion_count2_hi_14: int + db_occlusion_count3_low_14: int + db_occlusion_count3_hi_14: int + db_occlusion_count0_low_15: int + db_occlusion_count0_hi_15: int + db_occlusion_count1_low_15: int + db_occlusion_count1_hi_15: int + db_occlusion_count2_low_15: int + db_occlusion_count2_hi_15: int + db_occlusion_count3_low_15: int + db_occlusion_count3_hi_15: int + db_occlusion_count0_low_16: int + db_occlusion_count0_hi_16: int + db_occlusion_count1_low_16: int + db_occlusion_count1_hi_16: int + db_occlusion_count2_low_16: int + db_occlusion_count2_hi_16: int + db_occlusion_count3_low_16: int + db_occlusion_count3_hi_16: int + db_occlusion_count0_low_17: int + db_occlusion_count0_hi_17: int + db_occlusion_count1_low_17: int + db_occlusion_count1_hi_17: int + db_occlusion_count2_low_17: int + db_occlusion_count2_hi_17: int + db_occlusion_count3_low_17: int + db_occlusion_count3_hi_17: int + reserved_492: int + reserved_493: int + reserved_494: int + reserved_495: int + reserved_496: int + reserved_497: int + reserved_498: int + reserved_499: int + reserved_500: int + reserved_501: int + reserved_502: int + reserved_503: int + reserved_504: int + reserved_505: int + reserved_506: int + reserved_507: int + reserved_508: int + reserved_509: int + reserved_510: int + reserved_511: int +struct_v11_gfx_mqd.register_fields([('shadow_base_lo', ctypes.c_uint32, 0), ('shadow_base_hi', ctypes.c_uint32, 4), ('gds_bkup_base_lo', ctypes.c_uint32, 8), ('gds_bkup_base_hi', ctypes.c_uint32, 12), ('fw_work_area_base_lo', ctypes.c_uint32, 16), ('fw_work_area_base_hi', ctypes.c_uint32, 20), ('shadow_initialized', ctypes.c_uint32, 24), ('ib_vmid', ctypes.c_uint32, 28), ('reserved_8', ctypes.c_uint32, 32), ('reserved_9', ctypes.c_uint32, 36), ('reserved_10', ctypes.c_uint32, 40), ('reserved_11', ctypes.c_uint32, 44), ('reserved_12', ctypes.c_uint32, 48), ('reserved_13', ctypes.c_uint32, 52), ('reserved_14', ctypes.c_uint32, 56), ('reserved_15', ctypes.c_uint32, 60), ('reserved_16', ctypes.c_uint32, 64), ('reserved_17', ctypes.c_uint32, 68), ('reserved_18', ctypes.c_uint32, 72), ('reserved_19', ctypes.c_uint32, 76), ('reserved_20', ctypes.c_uint32, 80), ('reserved_21', ctypes.c_uint32, 84), ('reserved_22', ctypes.c_uint32, 88), ('reserved_23', ctypes.c_uint32, 92), ('reserved_24', ctypes.c_uint32, 96), ('reserved_25', ctypes.c_uint32, 100), ('reserved_26', ctypes.c_uint32, 104), ('reserved_27', ctypes.c_uint32, 108), ('reserved_28', ctypes.c_uint32, 112), ('reserved_29', ctypes.c_uint32, 116), ('reserved_30', ctypes.c_uint32, 120), ('reserved_31', ctypes.c_uint32, 124), ('reserved_32', ctypes.c_uint32, 128), ('reserved_33', ctypes.c_uint32, 132), ('reserved_34', ctypes.c_uint32, 136), ('reserved_35', ctypes.c_uint32, 140), ('reserved_36', ctypes.c_uint32, 144), ('reserved_37', ctypes.c_uint32, 148), ('reserved_38', ctypes.c_uint32, 152), ('reserved_39', ctypes.c_uint32, 156), ('reserved_40', ctypes.c_uint32, 160), ('reserved_41', ctypes.c_uint32, 164), ('reserved_42', ctypes.c_uint32, 168), ('reserved_43', ctypes.c_uint32, 172), ('reserved_44', ctypes.c_uint32, 176), ('reserved_45', ctypes.c_uint32, 180), ('reserved_46', ctypes.c_uint32, 184), ('reserved_47', ctypes.c_uint32, 188), ('reserved_48', ctypes.c_uint32, 192), ('reserved_49', ctypes.c_uint32, 196), ('reserved_50', ctypes.c_uint32, 200), ('reserved_51', ctypes.c_uint32, 204), ('reserved_52', ctypes.c_uint32, 208), ('reserved_53', ctypes.c_uint32, 212), ('reserved_54', ctypes.c_uint32, 216), ('reserved_55', ctypes.c_uint32, 220), ('reserved_56', ctypes.c_uint32, 224), ('reserved_57', ctypes.c_uint32, 228), ('reserved_58', ctypes.c_uint32, 232), ('reserved_59', ctypes.c_uint32, 236), ('reserved_60', ctypes.c_uint32, 240), ('reserved_61', ctypes.c_uint32, 244), ('reserved_62', ctypes.c_uint32, 248), ('reserved_63', ctypes.c_uint32, 252), ('reserved_64', ctypes.c_uint32, 256), ('reserved_65', ctypes.c_uint32, 260), ('reserved_66', ctypes.c_uint32, 264), ('reserved_67', ctypes.c_uint32, 268), ('reserved_68', ctypes.c_uint32, 272), ('reserved_69', ctypes.c_uint32, 276), ('reserved_70', ctypes.c_uint32, 280), ('reserved_71', ctypes.c_uint32, 284), ('reserved_72', ctypes.c_uint32, 288), ('reserved_73', ctypes.c_uint32, 292), ('reserved_74', ctypes.c_uint32, 296), ('reserved_75', ctypes.c_uint32, 300), ('reserved_76', ctypes.c_uint32, 304), ('reserved_77', ctypes.c_uint32, 308), ('reserved_78', ctypes.c_uint32, 312), ('reserved_79', ctypes.c_uint32, 316), ('reserved_80', ctypes.c_uint32, 320), ('reserved_81', ctypes.c_uint32, 324), ('reserved_82', ctypes.c_uint32, 328), ('reserved_83', ctypes.c_uint32, 332), ('checksum_lo', ctypes.c_uint32, 336), ('checksum_hi', ctypes.c_uint32, 340), ('cp_mqd_query_time_lo', ctypes.c_uint32, 344), ('cp_mqd_query_time_hi', ctypes.c_uint32, 348), ('reserved_88', ctypes.c_uint32, 352), ('reserved_89', ctypes.c_uint32, 356), ('reserved_90', ctypes.c_uint32, 360), ('reserved_91', ctypes.c_uint32, 364), ('cp_mqd_query_wave_count', ctypes.c_uint32, 368), ('cp_mqd_query_gfx_hqd_rptr', ctypes.c_uint32, 372), ('cp_mqd_query_gfx_hqd_wptr', ctypes.c_uint32, 376), ('cp_mqd_query_gfx_hqd_offset', ctypes.c_uint32, 380), ('reserved_96', ctypes.c_uint32, 384), ('reserved_97', ctypes.c_uint32, 388), ('reserved_98', ctypes.c_uint32, 392), ('reserved_99', ctypes.c_uint32, 396), ('reserved_100', ctypes.c_uint32, 400), ('reserved_101', ctypes.c_uint32, 404), ('reserved_102', ctypes.c_uint32, 408), ('reserved_103', ctypes.c_uint32, 412), ('control_buf_addr_lo', ctypes.c_uint32, 416), ('control_buf_addr_hi', ctypes.c_uint32, 420), ('disable_queue', ctypes.c_uint32, 424), ('reserved_107', ctypes.c_uint32, 428), ('reserved_108', ctypes.c_uint32, 432), ('reserved_109', ctypes.c_uint32, 436), ('reserved_110', ctypes.c_uint32, 440), ('reserved_111', ctypes.c_uint32, 444), ('reserved_112', ctypes.c_uint32, 448), ('reserved_113', ctypes.c_uint32, 452), ('reserved_114', ctypes.c_uint32, 456), ('reserved_115', ctypes.c_uint32, 460), ('reserved_116', ctypes.c_uint32, 464), ('reserved_117', ctypes.c_uint32, 468), ('reserved_118', ctypes.c_uint32, 472), ('reserved_119', ctypes.c_uint32, 476), ('reserved_120', ctypes.c_uint32, 480), ('reserved_121', ctypes.c_uint32, 484), ('reserved_122', ctypes.c_uint32, 488), ('reserved_123', ctypes.c_uint32, 492), ('reserved_124', ctypes.c_uint32, 496), ('reserved_125', ctypes.c_uint32, 500), ('reserved_126', ctypes.c_uint32, 504), ('reserved_127', ctypes.c_uint32, 508), ('cp_mqd_base_addr', ctypes.c_uint32, 512), ('cp_mqd_base_addr_hi', ctypes.c_uint32, 516), ('cp_gfx_hqd_active', ctypes.c_uint32, 520), ('cp_gfx_hqd_vmid', ctypes.c_uint32, 524), ('reserved_131', ctypes.c_uint32, 528), ('reserved_132', ctypes.c_uint32, 532), ('cp_gfx_hqd_queue_priority', ctypes.c_uint32, 536), ('cp_gfx_hqd_quantum', ctypes.c_uint32, 540), ('cp_gfx_hqd_base', ctypes.c_uint32, 544), ('cp_gfx_hqd_base_hi', ctypes.c_uint32, 548), ('cp_gfx_hqd_rptr', ctypes.c_uint32, 552), ('cp_gfx_hqd_rptr_addr', ctypes.c_uint32, 556), ('cp_gfx_hqd_rptr_addr_hi', ctypes.c_uint32, 560), ('cp_rb_wptr_poll_addr_lo', ctypes.c_uint32, 564), ('cp_rb_wptr_poll_addr_hi', ctypes.c_uint32, 568), ('cp_rb_doorbell_control', ctypes.c_uint32, 572), ('cp_gfx_hqd_offset', ctypes.c_uint32, 576), ('cp_gfx_hqd_cntl', ctypes.c_uint32, 580), ('reserved_146', ctypes.c_uint32, 584), ('reserved_147', ctypes.c_uint32, 588), ('cp_gfx_hqd_csmd_rptr', ctypes.c_uint32, 592), ('cp_gfx_hqd_wptr', ctypes.c_uint32, 596), ('cp_gfx_hqd_wptr_hi', ctypes.c_uint32, 600), ('reserved_151', ctypes.c_uint32, 604), ('reserved_152', ctypes.c_uint32, 608), ('reserved_153', ctypes.c_uint32, 612), ('reserved_154', ctypes.c_uint32, 616), ('reserved_155', ctypes.c_uint32, 620), ('cp_gfx_hqd_mapped', ctypes.c_uint32, 624), ('cp_gfx_hqd_que_mgr_control', ctypes.c_uint32, 628), ('reserved_158', ctypes.c_uint32, 632), ('reserved_159', ctypes.c_uint32, 636), ('cp_gfx_hqd_hq_status0', ctypes.c_uint32, 640), ('cp_gfx_hqd_hq_control0', ctypes.c_uint32, 644), ('cp_gfx_mqd_control', ctypes.c_uint32, 648), ('reserved_163', ctypes.c_uint32, 652), ('reserved_164', ctypes.c_uint32, 656), ('reserved_165', ctypes.c_uint32, 660), ('reserved_166', ctypes.c_uint32, 664), ('reserved_167', ctypes.c_uint32, 668), ('reserved_168', ctypes.c_uint32, 672), ('reserved_169', ctypes.c_uint32, 676), ('cp_num_prim_needed_count0_lo', ctypes.c_uint32, 680), ('cp_num_prim_needed_count0_hi', ctypes.c_uint32, 684), ('cp_num_prim_needed_count1_lo', ctypes.c_uint32, 688), ('cp_num_prim_needed_count1_hi', ctypes.c_uint32, 692), ('cp_num_prim_needed_count2_lo', ctypes.c_uint32, 696), ('cp_num_prim_needed_count2_hi', ctypes.c_uint32, 700), ('cp_num_prim_needed_count3_lo', ctypes.c_uint32, 704), ('cp_num_prim_needed_count3_hi', ctypes.c_uint32, 708), ('cp_num_prim_written_count0_lo', ctypes.c_uint32, 712), ('cp_num_prim_written_count0_hi', ctypes.c_uint32, 716), ('cp_num_prim_written_count1_lo', ctypes.c_uint32, 720), ('cp_num_prim_written_count1_hi', ctypes.c_uint32, 724), ('cp_num_prim_written_count2_lo', ctypes.c_uint32, 728), ('cp_num_prim_written_count2_hi', ctypes.c_uint32, 732), ('cp_num_prim_written_count3_lo', ctypes.c_uint32, 736), ('cp_num_prim_written_count3_hi', ctypes.c_uint32, 740), ('reserved_186', ctypes.c_uint32, 744), ('reserved_187', ctypes.c_uint32, 748), ('reserved_188', ctypes.c_uint32, 752), ('reserved_189', ctypes.c_uint32, 756), ('mp1_smn_fps_cnt', ctypes.c_uint32, 760), ('sq_thread_trace_buf0_base', ctypes.c_uint32, 764), ('sq_thread_trace_buf0_size', ctypes.c_uint32, 768), ('sq_thread_trace_buf1_base', ctypes.c_uint32, 772), ('sq_thread_trace_buf1_size', ctypes.c_uint32, 776), ('sq_thread_trace_wptr', ctypes.c_uint32, 780), ('sq_thread_trace_mask', ctypes.c_uint32, 784), ('sq_thread_trace_token_mask', ctypes.c_uint32, 788), ('sq_thread_trace_ctrl', ctypes.c_uint32, 792), ('sq_thread_trace_status', ctypes.c_uint32, 796), ('sq_thread_trace_dropped_cntr', ctypes.c_uint32, 800), ('sq_thread_trace_finish_done_debug', ctypes.c_uint32, 804), ('sq_thread_trace_gfx_draw_cntr', ctypes.c_uint32, 808), ('sq_thread_trace_gfx_marker_cntr', ctypes.c_uint32, 812), ('sq_thread_trace_hp3d_draw_cntr', ctypes.c_uint32, 816), ('sq_thread_trace_hp3d_marker_cntr', ctypes.c_uint32, 820), ('reserved_206', ctypes.c_uint32, 824), ('reserved_207', ctypes.c_uint32, 828), ('cp_sc_psinvoc_count0_lo', ctypes.c_uint32, 832), ('cp_sc_psinvoc_count0_hi', ctypes.c_uint32, 836), ('cp_pa_cprim_count_lo', ctypes.c_uint32, 840), ('cp_pa_cprim_count_hi', ctypes.c_uint32, 844), ('cp_pa_cinvoc_count_lo', ctypes.c_uint32, 848), ('cp_pa_cinvoc_count_hi', ctypes.c_uint32, 852), ('cp_vgt_vsinvoc_count_lo', ctypes.c_uint32, 856), ('cp_vgt_vsinvoc_count_hi', ctypes.c_uint32, 860), ('cp_vgt_gsinvoc_count_lo', ctypes.c_uint32, 864), ('cp_vgt_gsinvoc_count_hi', ctypes.c_uint32, 868), ('cp_vgt_gsprim_count_lo', ctypes.c_uint32, 872), ('cp_vgt_gsprim_count_hi', ctypes.c_uint32, 876), ('cp_vgt_iaprim_count_lo', ctypes.c_uint32, 880), ('cp_vgt_iaprim_count_hi', ctypes.c_uint32, 884), ('cp_vgt_iavert_count_lo', ctypes.c_uint32, 888), ('cp_vgt_iavert_count_hi', ctypes.c_uint32, 892), ('cp_vgt_hsinvoc_count_lo', ctypes.c_uint32, 896), ('cp_vgt_hsinvoc_count_hi', ctypes.c_uint32, 900), ('cp_vgt_dsinvoc_count_lo', ctypes.c_uint32, 904), ('cp_vgt_dsinvoc_count_hi', ctypes.c_uint32, 908), ('cp_vgt_csinvoc_count_lo', ctypes.c_uint32, 912), ('cp_vgt_csinvoc_count_hi', ctypes.c_uint32, 916), ('reserved_230', ctypes.c_uint32, 920), ('reserved_231', ctypes.c_uint32, 924), ('reserved_232', ctypes.c_uint32, 928), ('reserved_233', ctypes.c_uint32, 932), ('reserved_234', ctypes.c_uint32, 936), ('reserved_235', ctypes.c_uint32, 940), ('reserved_236', ctypes.c_uint32, 944), ('reserved_237', ctypes.c_uint32, 948), ('reserved_238', ctypes.c_uint32, 952), ('reserved_239', ctypes.c_uint32, 956), ('reserved_240', ctypes.c_uint32, 960), ('reserved_241', ctypes.c_uint32, 964), ('reserved_242', ctypes.c_uint32, 968), ('reserved_243', ctypes.c_uint32, 972), ('reserved_244', ctypes.c_uint32, 976), ('reserved_245', ctypes.c_uint32, 980), ('reserved_246', ctypes.c_uint32, 984), ('reserved_247', ctypes.c_uint32, 988), ('reserved_248', ctypes.c_uint32, 992), ('reserved_249', ctypes.c_uint32, 996), ('reserved_250', ctypes.c_uint32, 1000), ('reserved_251', ctypes.c_uint32, 1004), ('reserved_252', ctypes.c_uint32, 1008), ('reserved_253', ctypes.c_uint32, 1012), ('reserved_254', ctypes.c_uint32, 1016), ('reserved_255', ctypes.c_uint32, 1020), ('reserved_256', ctypes.c_uint32, 1024), ('reserved_257', ctypes.c_uint32, 1028), ('reserved_258', ctypes.c_uint32, 1032), ('reserved_259', ctypes.c_uint32, 1036), ('reserved_260', ctypes.c_uint32, 1040), ('reserved_261', ctypes.c_uint32, 1044), ('reserved_262', ctypes.c_uint32, 1048), ('reserved_263', ctypes.c_uint32, 1052), ('reserved_264', ctypes.c_uint32, 1056), ('reserved_265', ctypes.c_uint32, 1060), ('reserved_266', ctypes.c_uint32, 1064), ('reserved_267', ctypes.c_uint32, 1068), ('vgt_strmout_buffer_filled_size_0', ctypes.c_uint32, 1072), ('vgt_strmout_buffer_filled_size_1', ctypes.c_uint32, 1076), ('vgt_strmout_buffer_filled_size_2', ctypes.c_uint32, 1080), ('vgt_strmout_buffer_filled_size_3', ctypes.c_uint32, 1084), ('reserved_272', ctypes.c_uint32, 1088), ('reserved_273', ctypes.c_uint32, 1092), ('reserved_274', ctypes.c_uint32, 1096), ('reserved_275', ctypes.c_uint32, 1100), ('vgt_dma_max_size', ctypes.c_uint32, 1104), ('vgt_dma_num_instances', ctypes.c_uint32, 1108), ('reserved_278', ctypes.c_uint32, 1112), ('reserved_279', ctypes.c_uint32, 1116), ('reserved_280', ctypes.c_uint32, 1120), ('reserved_281', ctypes.c_uint32, 1124), ('reserved_282', ctypes.c_uint32, 1128), ('reserved_283', ctypes.c_uint32, 1132), ('reserved_284', ctypes.c_uint32, 1136), ('reserved_285', ctypes.c_uint32, 1140), ('reserved_286', ctypes.c_uint32, 1144), ('reserved_287', ctypes.c_uint32, 1148), ('it_set_base_ib_addr_lo', ctypes.c_uint32, 1152), ('it_set_base_ib_addr_hi', ctypes.c_uint32, 1156), ('reserved_290', ctypes.c_uint32, 1160), ('reserved_291', ctypes.c_uint32, 1164), ('reserved_292', ctypes.c_uint32, 1168), ('reserved_293', ctypes.c_uint32, 1172), ('reserved_294', ctypes.c_uint32, 1176), ('reserved_295', ctypes.c_uint32, 1180), ('reserved_296', ctypes.c_uint32, 1184), ('reserved_297', ctypes.c_uint32, 1188), ('reserved_298', ctypes.c_uint32, 1192), ('reserved_299', ctypes.c_uint32, 1196), ('reserved_300', ctypes.c_uint32, 1200), ('reserved_301', ctypes.c_uint32, 1204), ('reserved_302', ctypes.c_uint32, 1208), ('reserved_303', ctypes.c_uint32, 1212), ('reserved_304', ctypes.c_uint32, 1216), ('reserved_305', ctypes.c_uint32, 1220), ('reserved_306', ctypes.c_uint32, 1224), ('reserved_307', ctypes.c_uint32, 1228), ('reserved_308', ctypes.c_uint32, 1232), ('reserved_309', ctypes.c_uint32, 1236), ('reserved_310', ctypes.c_uint32, 1240), ('reserved_311', ctypes.c_uint32, 1244), ('reserved_312', ctypes.c_uint32, 1248), ('reserved_313', ctypes.c_uint32, 1252), ('reserved_314', ctypes.c_uint32, 1256), ('reserved_315', ctypes.c_uint32, 1260), ('reserved_316', ctypes.c_uint32, 1264), ('reserved_317', ctypes.c_uint32, 1268), ('reserved_318', ctypes.c_uint32, 1272), ('reserved_319', ctypes.c_uint32, 1276), ('reserved_320', ctypes.c_uint32, 1280), ('reserved_321', ctypes.c_uint32, 1284), ('reserved_322', ctypes.c_uint32, 1288), ('reserved_323', ctypes.c_uint32, 1292), ('reserved_324', ctypes.c_uint32, 1296), ('reserved_325', ctypes.c_uint32, 1300), ('reserved_326', ctypes.c_uint32, 1304), ('reserved_327', ctypes.c_uint32, 1308), ('reserved_328', ctypes.c_uint32, 1312), ('reserved_329', ctypes.c_uint32, 1316), ('reserved_330', ctypes.c_uint32, 1320), ('reserved_331', ctypes.c_uint32, 1324), ('reserved_332', ctypes.c_uint32, 1328), ('reserved_333', ctypes.c_uint32, 1332), ('reserved_334', ctypes.c_uint32, 1336), ('reserved_335', ctypes.c_uint32, 1340), ('reserved_336', ctypes.c_uint32, 1344), ('reserved_337', ctypes.c_uint32, 1348), ('reserved_338', ctypes.c_uint32, 1352), ('reserved_339', ctypes.c_uint32, 1356), ('reserved_340', ctypes.c_uint32, 1360), ('reserved_341', ctypes.c_uint32, 1364), ('reserved_342', ctypes.c_uint32, 1368), ('reserved_343', ctypes.c_uint32, 1372), ('reserved_344', ctypes.c_uint32, 1376), ('reserved_345', ctypes.c_uint32, 1380), ('reserved_346', ctypes.c_uint32, 1384), ('reserved_347', ctypes.c_uint32, 1388), ('reserved_348', ctypes.c_uint32, 1392), ('reserved_349', ctypes.c_uint32, 1396), ('reserved_350', ctypes.c_uint32, 1400), ('reserved_351', ctypes.c_uint32, 1404), ('reserved_352', ctypes.c_uint32, 1408), ('reserved_353', ctypes.c_uint32, 1412), ('reserved_354', ctypes.c_uint32, 1416), ('reserved_355', ctypes.c_uint32, 1420), ('spi_shader_pgm_rsrc3_ps', ctypes.c_uint32, 1424), ('spi_shader_pgm_rsrc3_vs', ctypes.c_uint32, 1428), ('spi_shader_pgm_rsrc3_gs', ctypes.c_uint32, 1432), ('spi_shader_pgm_rsrc3_hs', ctypes.c_uint32, 1436), ('spi_shader_pgm_rsrc4_ps', ctypes.c_uint32, 1440), ('spi_shader_pgm_rsrc4_vs', ctypes.c_uint32, 1444), ('spi_shader_pgm_rsrc4_gs', ctypes.c_uint32, 1448), ('spi_shader_pgm_rsrc4_hs', ctypes.c_uint32, 1452), ('db_occlusion_count0_low_00', ctypes.c_uint32, 1456), ('db_occlusion_count0_hi_00', ctypes.c_uint32, 1460), ('db_occlusion_count1_low_00', ctypes.c_uint32, 1464), ('db_occlusion_count1_hi_00', ctypes.c_uint32, 1468), ('db_occlusion_count2_low_00', ctypes.c_uint32, 1472), ('db_occlusion_count2_hi_00', ctypes.c_uint32, 1476), ('db_occlusion_count3_low_00', ctypes.c_uint32, 1480), ('db_occlusion_count3_hi_00', ctypes.c_uint32, 1484), ('db_occlusion_count0_low_01', ctypes.c_uint32, 1488), ('db_occlusion_count0_hi_01', ctypes.c_uint32, 1492), ('db_occlusion_count1_low_01', ctypes.c_uint32, 1496), ('db_occlusion_count1_hi_01', ctypes.c_uint32, 1500), ('db_occlusion_count2_low_01', ctypes.c_uint32, 1504), ('db_occlusion_count2_hi_01', ctypes.c_uint32, 1508), ('db_occlusion_count3_low_01', ctypes.c_uint32, 1512), ('db_occlusion_count3_hi_01', ctypes.c_uint32, 1516), ('db_occlusion_count0_low_02', ctypes.c_uint32, 1520), ('db_occlusion_count0_hi_02', ctypes.c_uint32, 1524), ('db_occlusion_count1_low_02', ctypes.c_uint32, 1528), ('db_occlusion_count1_hi_02', ctypes.c_uint32, 1532), ('db_occlusion_count2_low_02', ctypes.c_uint32, 1536), ('db_occlusion_count2_hi_02', ctypes.c_uint32, 1540), ('db_occlusion_count3_low_02', ctypes.c_uint32, 1544), ('db_occlusion_count3_hi_02', ctypes.c_uint32, 1548), ('db_occlusion_count0_low_03', ctypes.c_uint32, 1552), ('db_occlusion_count0_hi_03', ctypes.c_uint32, 1556), ('db_occlusion_count1_low_03', ctypes.c_uint32, 1560), ('db_occlusion_count1_hi_03', ctypes.c_uint32, 1564), ('db_occlusion_count2_low_03', ctypes.c_uint32, 1568), ('db_occlusion_count2_hi_03', ctypes.c_uint32, 1572), ('db_occlusion_count3_low_03', ctypes.c_uint32, 1576), ('db_occlusion_count3_hi_03', ctypes.c_uint32, 1580), ('db_occlusion_count0_low_04', ctypes.c_uint32, 1584), ('db_occlusion_count0_hi_04', ctypes.c_uint32, 1588), ('db_occlusion_count1_low_04', ctypes.c_uint32, 1592), ('db_occlusion_count1_hi_04', ctypes.c_uint32, 1596), ('db_occlusion_count2_low_04', ctypes.c_uint32, 1600), ('db_occlusion_count2_hi_04', ctypes.c_uint32, 1604), ('db_occlusion_count3_low_04', ctypes.c_uint32, 1608), ('db_occlusion_count3_hi_04', ctypes.c_uint32, 1612), ('db_occlusion_count0_low_05', ctypes.c_uint32, 1616), ('db_occlusion_count0_hi_05', ctypes.c_uint32, 1620), ('db_occlusion_count1_low_05', ctypes.c_uint32, 1624), ('db_occlusion_count1_hi_05', ctypes.c_uint32, 1628), ('db_occlusion_count2_low_05', ctypes.c_uint32, 1632), ('db_occlusion_count2_hi_05', ctypes.c_uint32, 1636), ('db_occlusion_count3_low_05', ctypes.c_uint32, 1640), ('db_occlusion_count3_hi_05', ctypes.c_uint32, 1644), ('db_occlusion_count0_low_06', ctypes.c_uint32, 1648), ('db_occlusion_count0_hi_06', ctypes.c_uint32, 1652), ('db_occlusion_count1_low_06', ctypes.c_uint32, 1656), ('db_occlusion_count1_hi_06', ctypes.c_uint32, 1660), ('db_occlusion_count2_low_06', ctypes.c_uint32, 1664), ('db_occlusion_count2_hi_06', ctypes.c_uint32, 1668), ('db_occlusion_count3_low_06', ctypes.c_uint32, 1672), ('db_occlusion_count3_hi_06', ctypes.c_uint32, 1676), ('db_occlusion_count0_low_07', ctypes.c_uint32, 1680), ('db_occlusion_count0_hi_07', ctypes.c_uint32, 1684), ('db_occlusion_count1_low_07', ctypes.c_uint32, 1688), ('db_occlusion_count1_hi_07', ctypes.c_uint32, 1692), ('db_occlusion_count2_low_07', ctypes.c_uint32, 1696), ('db_occlusion_count2_hi_07', ctypes.c_uint32, 1700), ('db_occlusion_count3_low_07', ctypes.c_uint32, 1704), ('db_occlusion_count3_hi_07', ctypes.c_uint32, 1708), ('db_occlusion_count0_low_10', ctypes.c_uint32, 1712), ('db_occlusion_count0_hi_10', ctypes.c_uint32, 1716), ('db_occlusion_count1_low_10', ctypes.c_uint32, 1720), ('db_occlusion_count1_hi_10', ctypes.c_uint32, 1724), ('db_occlusion_count2_low_10', ctypes.c_uint32, 1728), ('db_occlusion_count2_hi_10', ctypes.c_uint32, 1732), ('db_occlusion_count3_low_10', ctypes.c_uint32, 1736), ('db_occlusion_count3_hi_10', ctypes.c_uint32, 1740), ('db_occlusion_count0_low_11', ctypes.c_uint32, 1744), ('db_occlusion_count0_hi_11', ctypes.c_uint32, 1748), ('db_occlusion_count1_low_11', ctypes.c_uint32, 1752), ('db_occlusion_count1_hi_11', ctypes.c_uint32, 1756), ('db_occlusion_count2_low_11', ctypes.c_uint32, 1760), ('db_occlusion_count2_hi_11', ctypes.c_uint32, 1764), ('db_occlusion_count3_low_11', ctypes.c_uint32, 1768), ('db_occlusion_count3_hi_11', ctypes.c_uint32, 1772), ('db_occlusion_count0_low_12', ctypes.c_uint32, 1776), ('db_occlusion_count0_hi_12', ctypes.c_uint32, 1780), ('db_occlusion_count1_low_12', ctypes.c_uint32, 1784), ('db_occlusion_count1_hi_12', ctypes.c_uint32, 1788), ('db_occlusion_count2_low_12', ctypes.c_uint32, 1792), ('db_occlusion_count2_hi_12', ctypes.c_uint32, 1796), ('db_occlusion_count3_low_12', ctypes.c_uint32, 1800), ('db_occlusion_count3_hi_12', ctypes.c_uint32, 1804), ('db_occlusion_count0_low_13', ctypes.c_uint32, 1808), ('db_occlusion_count0_hi_13', ctypes.c_uint32, 1812), ('db_occlusion_count1_low_13', ctypes.c_uint32, 1816), ('db_occlusion_count1_hi_13', ctypes.c_uint32, 1820), ('db_occlusion_count2_low_13', ctypes.c_uint32, 1824), ('db_occlusion_count2_hi_13', ctypes.c_uint32, 1828), ('db_occlusion_count3_low_13', ctypes.c_uint32, 1832), ('db_occlusion_count3_hi_13', ctypes.c_uint32, 1836), ('db_occlusion_count0_low_14', ctypes.c_uint32, 1840), ('db_occlusion_count0_hi_14', ctypes.c_uint32, 1844), ('db_occlusion_count1_low_14', ctypes.c_uint32, 1848), ('db_occlusion_count1_hi_14', ctypes.c_uint32, 1852), ('db_occlusion_count2_low_14', ctypes.c_uint32, 1856), ('db_occlusion_count2_hi_14', ctypes.c_uint32, 1860), ('db_occlusion_count3_low_14', ctypes.c_uint32, 1864), ('db_occlusion_count3_hi_14', ctypes.c_uint32, 1868), ('db_occlusion_count0_low_15', ctypes.c_uint32, 1872), ('db_occlusion_count0_hi_15', ctypes.c_uint32, 1876), ('db_occlusion_count1_low_15', ctypes.c_uint32, 1880), ('db_occlusion_count1_hi_15', ctypes.c_uint32, 1884), ('db_occlusion_count2_low_15', ctypes.c_uint32, 1888), ('db_occlusion_count2_hi_15', ctypes.c_uint32, 1892), ('db_occlusion_count3_low_15', ctypes.c_uint32, 1896), ('db_occlusion_count3_hi_15', ctypes.c_uint32, 1900), ('db_occlusion_count0_low_16', ctypes.c_uint32, 1904), ('db_occlusion_count0_hi_16', ctypes.c_uint32, 1908), ('db_occlusion_count1_low_16', ctypes.c_uint32, 1912), ('db_occlusion_count1_hi_16', ctypes.c_uint32, 1916), ('db_occlusion_count2_low_16', ctypes.c_uint32, 1920), ('db_occlusion_count2_hi_16', ctypes.c_uint32, 1924), ('db_occlusion_count3_low_16', ctypes.c_uint32, 1928), ('db_occlusion_count3_hi_16', ctypes.c_uint32, 1932), ('db_occlusion_count0_low_17', ctypes.c_uint32, 1936), ('db_occlusion_count0_hi_17', ctypes.c_uint32, 1940), ('db_occlusion_count1_low_17', ctypes.c_uint32, 1944), ('db_occlusion_count1_hi_17', ctypes.c_uint32, 1948), ('db_occlusion_count2_low_17', ctypes.c_uint32, 1952), ('db_occlusion_count2_hi_17', ctypes.c_uint32, 1956), ('db_occlusion_count3_low_17', ctypes.c_uint32, 1960), ('db_occlusion_count3_hi_17', ctypes.c_uint32, 1964), ('reserved_492', ctypes.c_uint32, 1968), ('reserved_493', ctypes.c_uint32, 1972), ('reserved_494', ctypes.c_uint32, 1976), ('reserved_495', ctypes.c_uint32, 1980), ('reserved_496', ctypes.c_uint32, 1984), ('reserved_497', ctypes.c_uint32, 1988), ('reserved_498', ctypes.c_uint32, 1992), ('reserved_499', ctypes.c_uint32, 1996), ('reserved_500', ctypes.c_uint32, 2000), ('reserved_501', ctypes.c_uint32, 2004), ('reserved_502', ctypes.c_uint32, 2008), ('reserved_503', ctypes.c_uint32, 2012), ('reserved_504', ctypes.c_uint32, 2016), ('reserved_505', ctypes.c_uint32, 2020), ('reserved_506', ctypes.c_uint32, 2024), ('reserved_507', ctypes.c_uint32, 2028), ('reserved_508', ctypes.c_uint32, 2032), ('reserved_509', ctypes.c_uint32, 2036), ('reserved_510', ctypes.c_uint32, 2040), ('reserved_511', ctypes.c_uint32, 2044)]) +@c.record +class struct_v11_sdma_mqd(c.Struct): + SIZE = 512 + sdmax_rlcx_rb_cntl: int + sdmax_rlcx_rb_base: int + sdmax_rlcx_rb_base_hi: int + sdmax_rlcx_rb_rptr: int + sdmax_rlcx_rb_rptr_hi: int + sdmax_rlcx_rb_wptr: int + sdmax_rlcx_rb_wptr_hi: int + sdmax_rlcx_rb_rptr_addr_hi: int + sdmax_rlcx_rb_rptr_addr_lo: int + sdmax_rlcx_ib_cntl: int + sdmax_rlcx_ib_rptr: int + sdmax_rlcx_ib_offset: int + sdmax_rlcx_ib_base_lo: int + sdmax_rlcx_ib_base_hi: int + sdmax_rlcx_ib_size: int + sdmax_rlcx_skip_cntl: int + sdmax_rlcx_context_status: int + sdmax_rlcx_doorbell: int + sdmax_rlcx_doorbell_log: int + sdmax_rlcx_doorbell_offset: int + sdmax_rlcx_csa_addr_lo: int + sdmax_rlcx_csa_addr_hi: int + sdmax_rlcx_sched_cntl: int + sdmax_rlcx_ib_sub_remain: int + sdmax_rlcx_preempt: int + sdmax_rlcx_dummy_reg: int + sdmax_rlcx_rb_wptr_poll_addr_hi: int + sdmax_rlcx_rb_wptr_poll_addr_lo: int + sdmax_rlcx_rb_aql_cntl: int + sdmax_rlcx_minor_ptr_update: int + sdmax_rlcx_rb_preempt: int + sdmax_rlcx_midcmd_data0: int + sdmax_rlcx_midcmd_data1: int + sdmax_rlcx_midcmd_data2: int + sdmax_rlcx_midcmd_data3: int + sdmax_rlcx_midcmd_data4: int + sdmax_rlcx_midcmd_data5: int + sdmax_rlcx_midcmd_data6: int + sdmax_rlcx_midcmd_data7: int + sdmax_rlcx_midcmd_data8: int + sdmax_rlcx_midcmd_data9: int + sdmax_rlcx_midcmd_data10: int + sdmax_rlcx_midcmd_cntl: int + sdmax_rlcx_f32_dbg0: int + sdmax_rlcx_f32_dbg1: int + reserved_45: int + reserved_46: int + reserved_47: int + reserved_48: int + reserved_49: int + reserved_50: int + reserved_51: int + reserved_52: int + reserved_53: int + reserved_54: int + reserved_55: int + reserved_56: int + reserved_57: int + reserved_58: int + reserved_59: int + reserved_60: int + reserved_61: int + reserved_62: int + reserved_63: int + reserved_64: int + reserved_65: int + reserved_66: int + reserved_67: int + reserved_68: int + reserved_69: int + reserved_70: int + reserved_71: int + reserved_72: int + reserved_73: int + reserved_74: int + reserved_75: int + reserved_76: int + reserved_77: int + reserved_78: int + reserved_79: int + reserved_80: int + reserved_81: int + reserved_82: int + reserved_83: int + reserved_84: int + reserved_85: int + reserved_86: int + reserved_87: int + reserved_88: int + reserved_89: int + reserved_90: int + reserved_91: int + reserved_92: int + reserved_93: int + reserved_94: int + reserved_95: int + reserved_96: int + reserved_97: int + reserved_98: int + reserved_99: int + reserved_100: int + reserved_101: int + reserved_102: int + reserved_103: int + reserved_104: int + reserved_105: int + reserved_106: int + reserved_107: int + reserved_108: int + reserved_109: int + reserved_110: int + reserved_111: int + reserved_112: int + reserved_113: int + reserved_114: int + reserved_115: int + reserved_116: int + reserved_117: int + reserved_118: int + reserved_119: int + reserved_120: int + reserved_121: int + reserved_122: int + reserved_123: int + reserved_124: int + reserved_125: int + sdma_engine_id: int + sdma_queue_id: int +struct_v11_sdma_mqd.register_fields([('sdmax_rlcx_rb_cntl', ctypes.c_uint32, 0), ('sdmax_rlcx_rb_base', ctypes.c_uint32, 4), ('sdmax_rlcx_rb_base_hi', ctypes.c_uint32, 8), ('sdmax_rlcx_rb_rptr', ctypes.c_uint32, 12), ('sdmax_rlcx_rb_rptr_hi', ctypes.c_uint32, 16), ('sdmax_rlcx_rb_wptr', ctypes.c_uint32, 20), ('sdmax_rlcx_rb_wptr_hi', ctypes.c_uint32, 24), ('sdmax_rlcx_rb_rptr_addr_hi', ctypes.c_uint32, 28), ('sdmax_rlcx_rb_rptr_addr_lo', ctypes.c_uint32, 32), ('sdmax_rlcx_ib_cntl', ctypes.c_uint32, 36), ('sdmax_rlcx_ib_rptr', ctypes.c_uint32, 40), ('sdmax_rlcx_ib_offset', ctypes.c_uint32, 44), ('sdmax_rlcx_ib_base_lo', ctypes.c_uint32, 48), ('sdmax_rlcx_ib_base_hi', ctypes.c_uint32, 52), ('sdmax_rlcx_ib_size', ctypes.c_uint32, 56), ('sdmax_rlcx_skip_cntl', ctypes.c_uint32, 60), ('sdmax_rlcx_context_status', ctypes.c_uint32, 64), ('sdmax_rlcx_doorbell', ctypes.c_uint32, 68), ('sdmax_rlcx_doorbell_log', ctypes.c_uint32, 72), ('sdmax_rlcx_doorbell_offset', ctypes.c_uint32, 76), ('sdmax_rlcx_csa_addr_lo', ctypes.c_uint32, 80), ('sdmax_rlcx_csa_addr_hi', ctypes.c_uint32, 84), ('sdmax_rlcx_sched_cntl', ctypes.c_uint32, 88), ('sdmax_rlcx_ib_sub_remain', ctypes.c_uint32, 92), ('sdmax_rlcx_preempt', ctypes.c_uint32, 96), ('sdmax_rlcx_dummy_reg', ctypes.c_uint32, 100), ('sdmax_rlcx_rb_wptr_poll_addr_hi', ctypes.c_uint32, 104), ('sdmax_rlcx_rb_wptr_poll_addr_lo', ctypes.c_uint32, 108), ('sdmax_rlcx_rb_aql_cntl', ctypes.c_uint32, 112), ('sdmax_rlcx_minor_ptr_update', ctypes.c_uint32, 116), ('sdmax_rlcx_rb_preempt', ctypes.c_uint32, 120), ('sdmax_rlcx_midcmd_data0', ctypes.c_uint32, 124), ('sdmax_rlcx_midcmd_data1', ctypes.c_uint32, 128), ('sdmax_rlcx_midcmd_data2', ctypes.c_uint32, 132), ('sdmax_rlcx_midcmd_data3', ctypes.c_uint32, 136), ('sdmax_rlcx_midcmd_data4', ctypes.c_uint32, 140), ('sdmax_rlcx_midcmd_data5', ctypes.c_uint32, 144), ('sdmax_rlcx_midcmd_data6', ctypes.c_uint32, 148), ('sdmax_rlcx_midcmd_data7', ctypes.c_uint32, 152), ('sdmax_rlcx_midcmd_data8', ctypes.c_uint32, 156), ('sdmax_rlcx_midcmd_data9', ctypes.c_uint32, 160), ('sdmax_rlcx_midcmd_data10', ctypes.c_uint32, 164), ('sdmax_rlcx_midcmd_cntl', ctypes.c_uint32, 168), ('sdmax_rlcx_f32_dbg0', ctypes.c_uint32, 172), ('sdmax_rlcx_f32_dbg1', ctypes.c_uint32, 176), ('reserved_45', ctypes.c_uint32, 180), ('reserved_46', ctypes.c_uint32, 184), ('reserved_47', ctypes.c_uint32, 188), ('reserved_48', ctypes.c_uint32, 192), ('reserved_49', ctypes.c_uint32, 196), ('reserved_50', ctypes.c_uint32, 200), ('reserved_51', ctypes.c_uint32, 204), ('reserved_52', ctypes.c_uint32, 208), ('reserved_53', ctypes.c_uint32, 212), ('reserved_54', ctypes.c_uint32, 216), ('reserved_55', ctypes.c_uint32, 220), ('reserved_56', ctypes.c_uint32, 224), ('reserved_57', ctypes.c_uint32, 228), ('reserved_58', ctypes.c_uint32, 232), ('reserved_59', ctypes.c_uint32, 236), ('reserved_60', ctypes.c_uint32, 240), ('reserved_61', ctypes.c_uint32, 244), ('reserved_62', ctypes.c_uint32, 248), ('reserved_63', ctypes.c_uint32, 252), ('reserved_64', ctypes.c_uint32, 256), ('reserved_65', ctypes.c_uint32, 260), ('reserved_66', ctypes.c_uint32, 264), ('reserved_67', ctypes.c_uint32, 268), ('reserved_68', ctypes.c_uint32, 272), ('reserved_69', ctypes.c_uint32, 276), ('reserved_70', ctypes.c_uint32, 280), ('reserved_71', ctypes.c_uint32, 284), ('reserved_72', ctypes.c_uint32, 288), ('reserved_73', ctypes.c_uint32, 292), ('reserved_74', ctypes.c_uint32, 296), ('reserved_75', ctypes.c_uint32, 300), ('reserved_76', ctypes.c_uint32, 304), ('reserved_77', ctypes.c_uint32, 308), ('reserved_78', ctypes.c_uint32, 312), ('reserved_79', ctypes.c_uint32, 316), ('reserved_80', ctypes.c_uint32, 320), ('reserved_81', ctypes.c_uint32, 324), ('reserved_82', ctypes.c_uint32, 328), ('reserved_83', ctypes.c_uint32, 332), ('reserved_84', ctypes.c_uint32, 336), ('reserved_85', ctypes.c_uint32, 340), ('reserved_86', ctypes.c_uint32, 344), ('reserved_87', ctypes.c_uint32, 348), ('reserved_88', ctypes.c_uint32, 352), ('reserved_89', ctypes.c_uint32, 356), ('reserved_90', ctypes.c_uint32, 360), ('reserved_91', ctypes.c_uint32, 364), ('reserved_92', ctypes.c_uint32, 368), ('reserved_93', ctypes.c_uint32, 372), ('reserved_94', ctypes.c_uint32, 376), ('reserved_95', ctypes.c_uint32, 380), ('reserved_96', ctypes.c_uint32, 384), ('reserved_97', ctypes.c_uint32, 388), ('reserved_98', ctypes.c_uint32, 392), ('reserved_99', ctypes.c_uint32, 396), ('reserved_100', ctypes.c_uint32, 400), ('reserved_101', ctypes.c_uint32, 404), ('reserved_102', ctypes.c_uint32, 408), ('reserved_103', ctypes.c_uint32, 412), ('reserved_104', ctypes.c_uint32, 416), ('reserved_105', ctypes.c_uint32, 420), ('reserved_106', ctypes.c_uint32, 424), ('reserved_107', ctypes.c_uint32, 428), ('reserved_108', ctypes.c_uint32, 432), ('reserved_109', ctypes.c_uint32, 436), ('reserved_110', ctypes.c_uint32, 440), ('reserved_111', ctypes.c_uint32, 444), ('reserved_112', ctypes.c_uint32, 448), ('reserved_113', ctypes.c_uint32, 452), ('reserved_114', ctypes.c_uint32, 456), ('reserved_115', ctypes.c_uint32, 460), ('reserved_116', ctypes.c_uint32, 464), ('reserved_117', ctypes.c_uint32, 468), ('reserved_118', ctypes.c_uint32, 472), ('reserved_119', ctypes.c_uint32, 476), ('reserved_120', ctypes.c_uint32, 480), ('reserved_121', ctypes.c_uint32, 484), ('reserved_122', ctypes.c_uint32, 488), ('reserved_123', ctypes.c_uint32, 492), ('reserved_124', ctypes.c_uint32, 496), ('reserved_125', ctypes.c_uint32, 500), ('sdma_engine_id', ctypes.c_uint32, 504), ('sdma_queue_id', ctypes.c_uint32, 508)]) +@c.record +class struct_v11_compute_mqd(c.Struct): + SIZE = 2048 + header: int + compute_dispatch_initiator: int + compute_dim_x: int + compute_dim_y: int + compute_dim_z: int + compute_start_x: int + compute_start_y: int + compute_start_z: int + compute_num_thread_x: int + compute_num_thread_y: int + compute_num_thread_z: int + compute_pipelinestat_enable: int + compute_perfcount_enable: int + compute_pgm_lo: int + compute_pgm_hi: int + compute_dispatch_pkt_addr_lo: int + compute_dispatch_pkt_addr_hi: int + compute_dispatch_scratch_base_lo: int + compute_dispatch_scratch_base_hi: int + compute_pgm_rsrc1: int + compute_pgm_rsrc2: int + compute_vmid: int + compute_resource_limits: int + compute_static_thread_mgmt_se0: int + compute_static_thread_mgmt_se1: int + compute_tmpring_size: int + compute_static_thread_mgmt_se2: int + compute_static_thread_mgmt_se3: int + compute_restart_x: int + compute_restart_y: int + compute_restart_z: int + compute_thread_trace_enable: int + compute_misc_reserved: int + compute_dispatch_id: int + compute_threadgroup_id: int + compute_req_ctrl: int + reserved_36: int + compute_user_accum_0: int + compute_user_accum_1: int + compute_user_accum_2: int + compute_user_accum_3: int + compute_pgm_rsrc3: int + compute_ddid_index: int + compute_shader_chksum: int + compute_static_thread_mgmt_se4: int + compute_static_thread_mgmt_se5: int + compute_static_thread_mgmt_se6: int + compute_static_thread_mgmt_se7: int + compute_dispatch_interleave: int + compute_relaunch: int + compute_wave_restore_addr_lo: int + compute_wave_restore_addr_hi: int + compute_wave_restore_control: int + reserved_53: int + reserved_54: int + reserved_55: int + reserved_56: int + reserved_57: int + reserved_58: int + reserved_59: int + reserved_60: int + reserved_61: int + reserved_62: int + reserved_63: int + reserved_64: int + compute_user_data_0: int + compute_user_data_1: int + compute_user_data_2: int + compute_user_data_3: int + compute_user_data_4: int + compute_user_data_5: int + compute_user_data_6: int + compute_user_data_7: int + compute_user_data_8: int + compute_user_data_9: int + compute_user_data_10: int + compute_user_data_11: int + compute_user_data_12: int + compute_user_data_13: int + compute_user_data_14: int + compute_user_data_15: int + cp_compute_csinvoc_count_lo: int + cp_compute_csinvoc_count_hi: int + reserved_83: int + reserved_84: int + reserved_85: int + cp_mqd_query_time_lo: int + cp_mqd_query_time_hi: int + cp_mqd_connect_start_time_lo: int + cp_mqd_connect_start_time_hi: int + cp_mqd_connect_end_time_lo: int + cp_mqd_connect_end_time_hi: int + cp_mqd_connect_end_wf_count: int + cp_mqd_connect_end_pq_rptr: int + cp_mqd_connect_end_pq_wptr: int + cp_mqd_connect_end_ib_rptr: int + cp_mqd_readindex_lo: int + cp_mqd_readindex_hi: int + cp_mqd_save_start_time_lo: int + cp_mqd_save_start_time_hi: int + cp_mqd_save_end_time_lo: int + cp_mqd_save_end_time_hi: int + cp_mqd_restore_start_time_lo: int + cp_mqd_restore_start_time_hi: int + cp_mqd_restore_end_time_lo: int + cp_mqd_restore_end_time_hi: int + disable_queue: int + reserved_107: int + gds_cs_ctxsw_cnt0: int + gds_cs_ctxsw_cnt1: int + gds_cs_ctxsw_cnt2: int + gds_cs_ctxsw_cnt3: int + reserved_112: int + reserved_113: int + cp_pq_exe_status_lo: int + cp_pq_exe_status_hi: int + cp_packet_id_lo: int + cp_packet_id_hi: int + cp_packet_exe_status_lo: int + cp_packet_exe_status_hi: int + gds_save_base_addr_lo: int + gds_save_base_addr_hi: int + gds_save_mask_lo: int + gds_save_mask_hi: int + ctx_save_base_addr_lo: int + ctx_save_base_addr_hi: int + reserved_126: int + reserved_127: int + cp_mqd_base_addr_lo: int + cp_mqd_base_addr_hi: int + cp_hqd_active: int + cp_hqd_vmid: int + cp_hqd_persistent_state: int + cp_hqd_pipe_priority: int + cp_hqd_queue_priority: int + cp_hqd_quantum: int + cp_hqd_pq_base_lo: int + cp_hqd_pq_base_hi: int + cp_hqd_pq_rptr: int + cp_hqd_pq_rptr_report_addr_lo: int + cp_hqd_pq_rptr_report_addr_hi: int + cp_hqd_pq_wptr_poll_addr_lo: int + cp_hqd_pq_wptr_poll_addr_hi: int + cp_hqd_pq_doorbell_control: int + reserved_144: int + cp_hqd_pq_control: int + cp_hqd_ib_base_addr_lo: int + cp_hqd_ib_base_addr_hi: int + cp_hqd_ib_rptr: int + cp_hqd_ib_control: int + cp_hqd_iq_timer: int + cp_hqd_iq_rptr: int + cp_hqd_dequeue_request: int + cp_hqd_dma_offload: int + cp_hqd_sema_cmd: int + cp_hqd_msg_type: int + cp_hqd_atomic0_preop_lo: int + cp_hqd_atomic0_preop_hi: int + cp_hqd_atomic1_preop_lo: int + cp_hqd_atomic1_preop_hi: int + cp_hqd_hq_status0: int + cp_hqd_hq_control0: int + cp_mqd_control: int + cp_hqd_hq_status1: int + cp_hqd_hq_control1: int + cp_hqd_eop_base_addr_lo: int + cp_hqd_eop_base_addr_hi: int + cp_hqd_eop_control: int + cp_hqd_eop_rptr: int + cp_hqd_eop_wptr: int + cp_hqd_eop_done_events: int + cp_hqd_ctx_save_base_addr_lo: int + cp_hqd_ctx_save_base_addr_hi: int + cp_hqd_ctx_save_control: int + cp_hqd_cntl_stack_offset: int + cp_hqd_cntl_stack_size: int + cp_hqd_wg_state_offset: int + cp_hqd_ctx_save_size: int + cp_hqd_gds_resource_state: int + cp_hqd_error: int + cp_hqd_eop_wptr_mem: int + cp_hqd_aql_control: int + cp_hqd_pq_wptr_lo: int + cp_hqd_pq_wptr_hi: int + reserved_184: int + reserved_185: int + reserved_186: int + reserved_187: int + reserved_188: int + reserved_189: int + reserved_190: int + reserved_191: int + iqtimer_pkt_header: int + iqtimer_pkt_dw0: int + iqtimer_pkt_dw1: int + iqtimer_pkt_dw2: int + iqtimer_pkt_dw3: int + iqtimer_pkt_dw4: int + iqtimer_pkt_dw5: int + iqtimer_pkt_dw6: int + iqtimer_pkt_dw7: int + iqtimer_pkt_dw8: int + iqtimer_pkt_dw9: int + iqtimer_pkt_dw10: int + iqtimer_pkt_dw11: int + iqtimer_pkt_dw12: int + iqtimer_pkt_dw13: int + iqtimer_pkt_dw14: int + iqtimer_pkt_dw15: int + iqtimer_pkt_dw16: int + iqtimer_pkt_dw17: int + iqtimer_pkt_dw18: int + iqtimer_pkt_dw19: int + iqtimer_pkt_dw20: int + iqtimer_pkt_dw21: int + iqtimer_pkt_dw22: int + iqtimer_pkt_dw23: int + iqtimer_pkt_dw24: int + iqtimer_pkt_dw25: int + iqtimer_pkt_dw26: int + iqtimer_pkt_dw27: int + iqtimer_pkt_dw28: int + iqtimer_pkt_dw29: int + iqtimer_pkt_dw30: int + iqtimer_pkt_dw31: int + reserved_225: int + reserved_226: int + reserved_227: int + set_resources_header: int + set_resources_dw1: int + set_resources_dw2: int + set_resources_dw3: int + set_resources_dw4: int + set_resources_dw5: int + set_resources_dw6: int + set_resources_dw7: int + reserved_236: int + reserved_237: int + reserved_238: int + reserved_239: int + queue_doorbell_id0: int + queue_doorbell_id1: int + queue_doorbell_id2: int + queue_doorbell_id3: int + queue_doorbell_id4: int + queue_doorbell_id5: int + queue_doorbell_id6: int + queue_doorbell_id7: int + queue_doorbell_id8: int + queue_doorbell_id9: int + queue_doorbell_id10: int + queue_doorbell_id11: int + queue_doorbell_id12: int + queue_doorbell_id13: int + queue_doorbell_id14: int + queue_doorbell_id15: int + control_buf_addr_lo: int + control_buf_addr_hi: int + control_buf_wptr_lo: int + control_buf_wptr_hi: int + control_buf_dptr_lo: int + control_buf_dptr_hi: int + control_buf_num_entries: int + draw_ring_addr_lo: int + draw_ring_addr_hi: int + reserved_265: int + reserved_266: int + reserved_267: int + reserved_268: int + reserved_269: int + reserved_270: int + reserved_271: int + reserved_272: int + reserved_273: int + reserved_274: int + reserved_275: int + reserved_276: int + reserved_277: int + reserved_278: int + reserved_279: int + reserved_280: int + reserved_281: int + reserved_282: int + reserved_283: int + reserved_284: int + reserved_285: int + reserved_286: int + reserved_287: int + reserved_288: int + reserved_289: int + reserved_290: int + reserved_291: int + reserved_292: int + reserved_293: int + reserved_294: int + reserved_295: int + reserved_296: int + reserved_297: int + reserved_298: int + reserved_299: int + reserved_300: int + reserved_301: int + reserved_302: int + reserved_303: int + reserved_304: int + reserved_305: int + reserved_306: int + reserved_307: int + reserved_308: int + reserved_309: int + reserved_310: int + reserved_311: int + reserved_312: int + reserved_313: int + reserved_314: int + reserved_315: int + reserved_316: int + reserved_317: int + reserved_318: int + reserved_319: int + reserved_320: int + reserved_321: int + reserved_322: int + reserved_323: int + reserved_324: int + reserved_325: int + reserved_326: int + reserved_327: int + reserved_328: int + reserved_329: int + reserved_330: int + reserved_331: int + reserved_332: int + reserved_333: int + reserved_334: int + reserved_335: int + reserved_336: int + reserved_337: int + reserved_338: int + reserved_339: int + reserved_340: int + reserved_341: int + reserved_342: int + reserved_343: int + reserved_344: int + reserved_345: int + reserved_346: int + reserved_347: int + reserved_348: int + reserved_349: int + reserved_350: int + reserved_351: int + reserved_352: int + reserved_353: int + reserved_354: int + reserved_355: int + reserved_356: int + reserved_357: int + reserved_358: int + reserved_359: int + reserved_360: int + reserved_361: int + reserved_362: int + reserved_363: int + reserved_364: int + reserved_365: int + reserved_366: int + reserved_367: int + reserved_368: int + reserved_369: int + reserved_370: int + reserved_371: int + reserved_372: int + reserved_373: int + reserved_374: int + reserved_375: int + reserved_376: int + reserved_377: int + reserved_378: int + reserved_379: int + reserved_380: int + reserved_381: int + reserved_382: int + reserved_383: int + reserved_384: int + reserved_385: int + reserved_386: int + reserved_387: int + reserved_388: int + reserved_389: int + reserved_390: int + reserved_391: int + reserved_392: int + reserved_393: int + reserved_394: int + reserved_395: int + reserved_396: int + reserved_397: int + reserved_398: int + reserved_399: int + reserved_400: int + reserved_401: int + reserved_402: int + reserved_403: int + reserved_404: int + reserved_405: int + reserved_406: int + reserved_407: int + reserved_408: int + reserved_409: int + reserved_410: int + reserved_411: int + reserved_412: int + reserved_413: int + reserved_414: int + reserved_415: int + reserved_416: int + reserved_417: int + reserved_418: int + reserved_419: int + reserved_420: int + reserved_421: int + reserved_422: int + reserved_423: int + reserved_424: int + reserved_425: int + reserved_426: int + reserved_427: int + reserved_428: int + reserved_429: int + reserved_430: int + reserved_431: int + reserved_432: int + reserved_433: int + reserved_434: int + reserved_435: int + reserved_436: int + reserved_437: int + reserved_438: int + reserved_439: int + reserved_440: int + reserved_441: int + reserved_442: int + reserved_443: int + reserved_444: int + reserved_445: int + reserved_446: int + reserved_447: int + gws_0_val: int + gws_1_val: int + gws_2_val: int + gws_3_val: int + gws_4_val: int + gws_5_val: int + gws_6_val: int + gws_7_val: int + gws_8_val: int + gws_9_val: int + gws_10_val: int + gws_11_val: int + gws_12_val: int + gws_13_val: int + gws_14_val: int + gws_15_val: int + gws_16_val: int + gws_17_val: int + gws_18_val: int + gws_19_val: int + gws_20_val: int + gws_21_val: int + gws_22_val: int + gws_23_val: int + gws_24_val: int + gws_25_val: int + gws_26_val: int + gws_27_val: int + gws_28_val: int + gws_29_val: int + gws_30_val: int + gws_31_val: int + gws_32_val: int + gws_33_val: int + gws_34_val: int + gws_35_val: int + gws_36_val: int + gws_37_val: int + gws_38_val: int + gws_39_val: int + gws_40_val: int + gws_41_val: int + gws_42_val: int + gws_43_val: int + gws_44_val: int + gws_45_val: int + gws_46_val: int + gws_47_val: int + gws_48_val: int + gws_49_val: int + gws_50_val: int + gws_51_val: int + gws_52_val: int + gws_53_val: int + gws_54_val: int + gws_55_val: int + gws_56_val: int + gws_57_val: int + gws_58_val: int + gws_59_val: int + gws_60_val: int + gws_61_val: int + gws_62_val: int + gws_63_val: int +struct_v11_compute_mqd.register_fields([('header', ctypes.c_uint32, 0), ('compute_dispatch_initiator', ctypes.c_uint32, 4), ('compute_dim_x', ctypes.c_uint32, 8), ('compute_dim_y', ctypes.c_uint32, 12), ('compute_dim_z', ctypes.c_uint32, 16), ('compute_start_x', ctypes.c_uint32, 20), ('compute_start_y', ctypes.c_uint32, 24), ('compute_start_z', ctypes.c_uint32, 28), ('compute_num_thread_x', ctypes.c_uint32, 32), ('compute_num_thread_y', ctypes.c_uint32, 36), ('compute_num_thread_z', ctypes.c_uint32, 40), ('compute_pipelinestat_enable', ctypes.c_uint32, 44), ('compute_perfcount_enable', ctypes.c_uint32, 48), ('compute_pgm_lo', ctypes.c_uint32, 52), ('compute_pgm_hi', ctypes.c_uint32, 56), ('compute_dispatch_pkt_addr_lo', ctypes.c_uint32, 60), ('compute_dispatch_pkt_addr_hi', ctypes.c_uint32, 64), ('compute_dispatch_scratch_base_lo', ctypes.c_uint32, 68), ('compute_dispatch_scratch_base_hi', ctypes.c_uint32, 72), ('compute_pgm_rsrc1', ctypes.c_uint32, 76), ('compute_pgm_rsrc2', ctypes.c_uint32, 80), ('compute_vmid', ctypes.c_uint32, 84), ('compute_resource_limits', ctypes.c_uint32, 88), ('compute_static_thread_mgmt_se0', ctypes.c_uint32, 92), ('compute_static_thread_mgmt_se1', ctypes.c_uint32, 96), ('compute_tmpring_size', ctypes.c_uint32, 100), ('compute_static_thread_mgmt_se2', ctypes.c_uint32, 104), ('compute_static_thread_mgmt_se3', ctypes.c_uint32, 108), ('compute_restart_x', ctypes.c_uint32, 112), ('compute_restart_y', ctypes.c_uint32, 116), ('compute_restart_z', ctypes.c_uint32, 120), ('compute_thread_trace_enable', ctypes.c_uint32, 124), ('compute_misc_reserved', ctypes.c_uint32, 128), ('compute_dispatch_id', ctypes.c_uint32, 132), ('compute_threadgroup_id', ctypes.c_uint32, 136), ('compute_req_ctrl', ctypes.c_uint32, 140), ('reserved_36', ctypes.c_uint32, 144), ('compute_user_accum_0', ctypes.c_uint32, 148), ('compute_user_accum_1', ctypes.c_uint32, 152), ('compute_user_accum_2', ctypes.c_uint32, 156), ('compute_user_accum_3', ctypes.c_uint32, 160), ('compute_pgm_rsrc3', ctypes.c_uint32, 164), ('compute_ddid_index', ctypes.c_uint32, 168), ('compute_shader_chksum', ctypes.c_uint32, 172), ('compute_static_thread_mgmt_se4', ctypes.c_uint32, 176), ('compute_static_thread_mgmt_se5', ctypes.c_uint32, 180), ('compute_static_thread_mgmt_se6', ctypes.c_uint32, 184), ('compute_static_thread_mgmt_se7', ctypes.c_uint32, 188), ('compute_dispatch_interleave', ctypes.c_uint32, 192), ('compute_relaunch', ctypes.c_uint32, 196), ('compute_wave_restore_addr_lo', ctypes.c_uint32, 200), ('compute_wave_restore_addr_hi', ctypes.c_uint32, 204), ('compute_wave_restore_control', ctypes.c_uint32, 208), ('reserved_53', ctypes.c_uint32, 212), ('reserved_54', ctypes.c_uint32, 216), ('reserved_55', ctypes.c_uint32, 220), ('reserved_56', ctypes.c_uint32, 224), ('reserved_57', ctypes.c_uint32, 228), ('reserved_58', ctypes.c_uint32, 232), ('reserved_59', ctypes.c_uint32, 236), ('reserved_60', ctypes.c_uint32, 240), ('reserved_61', ctypes.c_uint32, 244), ('reserved_62', ctypes.c_uint32, 248), ('reserved_63', ctypes.c_uint32, 252), ('reserved_64', ctypes.c_uint32, 256), ('compute_user_data_0', ctypes.c_uint32, 260), ('compute_user_data_1', ctypes.c_uint32, 264), ('compute_user_data_2', ctypes.c_uint32, 268), ('compute_user_data_3', ctypes.c_uint32, 272), ('compute_user_data_4', ctypes.c_uint32, 276), ('compute_user_data_5', ctypes.c_uint32, 280), ('compute_user_data_6', ctypes.c_uint32, 284), ('compute_user_data_7', ctypes.c_uint32, 288), ('compute_user_data_8', ctypes.c_uint32, 292), ('compute_user_data_9', ctypes.c_uint32, 296), ('compute_user_data_10', ctypes.c_uint32, 300), ('compute_user_data_11', ctypes.c_uint32, 304), ('compute_user_data_12', ctypes.c_uint32, 308), ('compute_user_data_13', ctypes.c_uint32, 312), ('compute_user_data_14', ctypes.c_uint32, 316), ('compute_user_data_15', ctypes.c_uint32, 320), ('cp_compute_csinvoc_count_lo', ctypes.c_uint32, 324), ('cp_compute_csinvoc_count_hi', ctypes.c_uint32, 328), ('reserved_83', ctypes.c_uint32, 332), ('reserved_84', ctypes.c_uint32, 336), ('reserved_85', ctypes.c_uint32, 340), ('cp_mqd_query_time_lo', ctypes.c_uint32, 344), ('cp_mqd_query_time_hi', ctypes.c_uint32, 348), ('cp_mqd_connect_start_time_lo', ctypes.c_uint32, 352), ('cp_mqd_connect_start_time_hi', ctypes.c_uint32, 356), ('cp_mqd_connect_end_time_lo', ctypes.c_uint32, 360), ('cp_mqd_connect_end_time_hi', ctypes.c_uint32, 364), ('cp_mqd_connect_end_wf_count', ctypes.c_uint32, 368), ('cp_mqd_connect_end_pq_rptr', ctypes.c_uint32, 372), ('cp_mqd_connect_end_pq_wptr', ctypes.c_uint32, 376), ('cp_mqd_connect_end_ib_rptr', ctypes.c_uint32, 380), ('cp_mqd_readindex_lo', ctypes.c_uint32, 384), ('cp_mqd_readindex_hi', ctypes.c_uint32, 388), ('cp_mqd_save_start_time_lo', ctypes.c_uint32, 392), ('cp_mqd_save_start_time_hi', ctypes.c_uint32, 396), ('cp_mqd_save_end_time_lo', ctypes.c_uint32, 400), ('cp_mqd_save_end_time_hi', ctypes.c_uint32, 404), ('cp_mqd_restore_start_time_lo', ctypes.c_uint32, 408), ('cp_mqd_restore_start_time_hi', ctypes.c_uint32, 412), ('cp_mqd_restore_end_time_lo', ctypes.c_uint32, 416), ('cp_mqd_restore_end_time_hi', ctypes.c_uint32, 420), ('disable_queue', ctypes.c_uint32, 424), ('reserved_107', ctypes.c_uint32, 428), ('gds_cs_ctxsw_cnt0', ctypes.c_uint32, 432), ('gds_cs_ctxsw_cnt1', ctypes.c_uint32, 436), ('gds_cs_ctxsw_cnt2', ctypes.c_uint32, 440), ('gds_cs_ctxsw_cnt3', ctypes.c_uint32, 444), ('reserved_112', ctypes.c_uint32, 448), ('reserved_113', ctypes.c_uint32, 452), ('cp_pq_exe_status_lo', ctypes.c_uint32, 456), ('cp_pq_exe_status_hi', ctypes.c_uint32, 460), ('cp_packet_id_lo', ctypes.c_uint32, 464), ('cp_packet_id_hi', ctypes.c_uint32, 468), ('cp_packet_exe_status_lo', ctypes.c_uint32, 472), ('cp_packet_exe_status_hi', ctypes.c_uint32, 476), ('gds_save_base_addr_lo', ctypes.c_uint32, 480), ('gds_save_base_addr_hi', ctypes.c_uint32, 484), ('gds_save_mask_lo', ctypes.c_uint32, 488), ('gds_save_mask_hi', ctypes.c_uint32, 492), ('ctx_save_base_addr_lo', ctypes.c_uint32, 496), ('ctx_save_base_addr_hi', ctypes.c_uint32, 500), ('reserved_126', ctypes.c_uint32, 504), ('reserved_127', ctypes.c_uint32, 508), ('cp_mqd_base_addr_lo', ctypes.c_uint32, 512), ('cp_mqd_base_addr_hi', ctypes.c_uint32, 516), ('cp_hqd_active', ctypes.c_uint32, 520), ('cp_hqd_vmid', ctypes.c_uint32, 524), ('cp_hqd_persistent_state', ctypes.c_uint32, 528), ('cp_hqd_pipe_priority', ctypes.c_uint32, 532), ('cp_hqd_queue_priority', ctypes.c_uint32, 536), ('cp_hqd_quantum', ctypes.c_uint32, 540), ('cp_hqd_pq_base_lo', ctypes.c_uint32, 544), ('cp_hqd_pq_base_hi', ctypes.c_uint32, 548), ('cp_hqd_pq_rptr', ctypes.c_uint32, 552), ('cp_hqd_pq_rptr_report_addr_lo', ctypes.c_uint32, 556), ('cp_hqd_pq_rptr_report_addr_hi', ctypes.c_uint32, 560), ('cp_hqd_pq_wptr_poll_addr_lo', ctypes.c_uint32, 564), ('cp_hqd_pq_wptr_poll_addr_hi', ctypes.c_uint32, 568), ('cp_hqd_pq_doorbell_control', ctypes.c_uint32, 572), ('reserved_144', ctypes.c_uint32, 576), ('cp_hqd_pq_control', ctypes.c_uint32, 580), ('cp_hqd_ib_base_addr_lo', ctypes.c_uint32, 584), ('cp_hqd_ib_base_addr_hi', ctypes.c_uint32, 588), ('cp_hqd_ib_rptr', ctypes.c_uint32, 592), ('cp_hqd_ib_control', ctypes.c_uint32, 596), ('cp_hqd_iq_timer', ctypes.c_uint32, 600), ('cp_hqd_iq_rptr', ctypes.c_uint32, 604), ('cp_hqd_dequeue_request', ctypes.c_uint32, 608), ('cp_hqd_dma_offload', ctypes.c_uint32, 612), ('cp_hqd_sema_cmd', ctypes.c_uint32, 616), ('cp_hqd_msg_type', ctypes.c_uint32, 620), ('cp_hqd_atomic0_preop_lo', ctypes.c_uint32, 624), ('cp_hqd_atomic0_preop_hi', ctypes.c_uint32, 628), ('cp_hqd_atomic1_preop_lo', ctypes.c_uint32, 632), ('cp_hqd_atomic1_preop_hi', ctypes.c_uint32, 636), ('cp_hqd_hq_status0', ctypes.c_uint32, 640), ('cp_hqd_hq_control0', ctypes.c_uint32, 644), ('cp_mqd_control', ctypes.c_uint32, 648), ('cp_hqd_hq_status1', ctypes.c_uint32, 652), ('cp_hqd_hq_control1', ctypes.c_uint32, 656), ('cp_hqd_eop_base_addr_lo', ctypes.c_uint32, 660), ('cp_hqd_eop_base_addr_hi', ctypes.c_uint32, 664), ('cp_hqd_eop_control', ctypes.c_uint32, 668), ('cp_hqd_eop_rptr', ctypes.c_uint32, 672), ('cp_hqd_eop_wptr', ctypes.c_uint32, 676), ('cp_hqd_eop_done_events', ctypes.c_uint32, 680), ('cp_hqd_ctx_save_base_addr_lo', ctypes.c_uint32, 684), ('cp_hqd_ctx_save_base_addr_hi', ctypes.c_uint32, 688), ('cp_hqd_ctx_save_control', ctypes.c_uint32, 692), ('cp_hqd_cntl_stack_offset', ctypes.c_uint32, 696), ('cp_hqd_cntl_stack_size', ctypes.c_uint32, 700), ('cp_hqd_wg_state_offset', ctypes.c_uint32, 704), ('cp_hqd_ctx_save_size', ctypes.c_uint32, 708), ('cp_hqd_gds_resource_state', ctypes.c_uint32, 712), ('cp_hqd_error', ctypes.c_uint32, 716), ('cp_hqd_eop_wptr_mem', ctypes.c_uint32, 720), ('cp_hqd_aql_control', ctypes.c_uint32, 724), ('cp_hqd_pq_wptr_lo', ctypes.c_uint32, 728), ('cp_hqd_pq_wptr_hi', ctypes.c_uint32, 732), ('reserved_184', ctypes.c_uint32, 736), ('reserved_185', ctypes.c_uint32, 740), ('reserved_186', ctypes.c_uint32, 744), ('reserved_187', ctypes.c_uint32, 748), ('reserved_188', ctypes.c_uint32, 752), ('reserved_189', ctypes.c_uint32, 756), ('reserved_190', ctypes.c_uint32, 760), ('reserved_191', ctypes.c_uint32, 764), ('iqtimer_pkt_header', ctypes.c_uint32, 768), ('iqtimer_pkt_dw0', ctypes.c_uint32, 772), ('iqtimer_pkt_dw1', ctypes.c_uint32, 776), ('iqtimer_pkt_dw2', ctypes.c_uint32, 780), ('iqtimer_pkt_dw3', ctypes.c_uint32, 784), ('iqtimer_pkt_dw4', ctypes.c_uint32, 788), ('iqtimer_pkt_dw5', ctypes.c_uint32, 792), ('iqtimer_pkt_dw6', ctypes.c_uint32, 796), ('iqtimer_pkt_dw7', ctypes.c_uint32, 800), ('iqtimer_pkt_dw8', ctypes.c_uint32, 804), ('iqtimer_pkt_dw9', ctypes.c_uint32, 808), ('iqtimer_pkt_dw10', ctypes.c_uint32, 812), ('iqtimer_pkt_dw11', ctypes.c_uint32, 816), ('iqtimer_pkt_dw12', ctypes.c_uint32, 820), ('iqtimer_pkt_dw13', ctypes.c_uint32, 824), ('iqtimer_pkt_dw14', ctypes.c_uint32, 828), ('iqtimer_pkt_dw15', ctypes.c_uint32, 832), ('iqtimer_pkt_dw16', ctypes.c_uint32, 836), ('iqtimer_pkt_dw17', ctypes.c_uint32, 840), ('iqtimer_pkt_dw18', ctypes.c_uint32, 844), ('iqtimer_pkt_dw19', ctypes.c_uint32, 848), ('iqtimer_pkt_dw20', ctypes.c_uint32, 852), ('iqtimer_pkt_dw21', ctypes.c_uint32, 856), ('iqtimer_pkt_dw22', ctypes.c_uint32, 860), ('iqtimer_pkt_dw23', ctypes.c_uint32, 864), ('iqtimer_pkt_dw24', ctypes.c_uint32, 868), ('iqtimer_pkt_dw25', ctypes.c_uint32, 872), ('iqtimer_pkt_dw26', ctypes.c_uint32, 876), ('iqtimer_pkt_dw27', ctypes.c_uint32, 880), ('iqtimer_pkt_dw28', ctypes.c_uint32, 884), ('iqtimer_pkt_dw29', ctypes.c_uint32, 888), ('iqtimer_pkt_dw30', ctypes.c_uint32, 892), ('iqtimer_pkt_dw31', ctypes.c_uint32, 896), ('reserved_225', ctypes.c_uint32, 900), ('reserved_226', ctypes.c_uint32, 904), ('reserved_227', ctypes.c_uint32, 908), ('set_resources_header', ctypes.c_uint32, 912), ('set_resources_dw1', ctypes.c_uint32, 916), ('set_resources_dw2', ctypes.c_uint32, 920), ('set_resources_dw3', ctypes.c_uint32, 924), ('set_resources_dw4', ctypes.c_uint32, 928), ('set_resources_dw5', ctypes.c_uint32, 932), ('set_resources_dw6', ctypes.c_uint32, 936), ('set_resources_dw7', ctypes.c_uint32, 940), ('reserved_236', ctypes.c_uint32, 944), ('reserved_237', ctypes.c_uint32, 948), ('reserved_238', ctypes.c_uint32, 952), ('reserved_239', ctypes.c_uint32, 956), ('queue_doorbell_id0', ctypes.c_uint32, 960), ('queue_doorbell_id1', ctypes.c_uint32, 964), ('queue_doorbell_id2', ctypes.c_uint32, 968), ('queue_doorbell_id3', ctypes.c_uint32, 972), ('queue_doorbell_id4', ctypes.c_uint32, 976), ('queue_doorbell_id5', ctypes.c_uint32, 980), ('queue_doorbell_id6', ctypes.c_uint32, 984), ('queue_doorbell_id7', ctypes.c_uint32, 988), ('queue_doorbell_id8', ctypes.c_uint32, 992), ('queue_doorbell_id9', ctypes.c_uint32, 996), ('queue_doorbell_id10', ctypes.c_uint32, 1000), ('queue_doorbell_id11', ctypes.c_uint32, 1004), ('queue_doorbell_id12', ctypes.c_uint32, 1008), ('queue_doorbell_id13', ctypes.c_uint32, 1012), ('queue_doorbell_id14', ctypes.c_uint32, 1016), ('queue_doorbell_id15', ctypes.c_uint32, 1020), ('control_buf_addr_lo', ctypes.c_uint32, 1024), ('control_buf_addr_hi', ctypes.c_uint32, 1028), ('control_buf_wptr_lo', ctypes.c_uint32, 1032), ('control_buf_wptr_hi', ctypes.c_uint32, 1036), ('control_buf_dptr_lo', ctypes.c_uint32, 1040), ('control_buf_dptr_hi', ctypes.c_uint32, 1044), ('control_buf_num_entries', ctypes.c_uint32, 1048), ('draw_ring_addr_lo', ctypes.c_uint32, 1052), ('draw_ring_addr_hi', ctypes.c_uint32, 1056), ('reserved_265', ctypes.c_uint32, 1060), ('reserved_266', ctypes.c_uint32, 1064), ('reserved_267', ctypes.c_uint32, 1068), ('reserved_268', ctypes.c_uint32, 1072), ('reserved_269', ctypes.c_uint32, 1076), ('reserved_270', ctypes.c_uint32, 1080), ('reserved_271', ctypes.c_uint32, 1084), ('reserved_272', ctypes.c_uint32, 1088), ('reserved_273', ctypes.c_uint32, 1092), ('reserved_274', ctypes.c_uint32, 1096), ('reserved_275', ctypes.c_uint32, 1100), ('reserved_276', ctypes.c_uint32, 1104), ('reserved_277', ctypes.c_uint32, 1108), ('reserved_278', ctypes.c_uint32, 1112), ('reserved_279', ctypes.c_uint32, 1116), ('reserved_280', ctypes.c_uint32, 1120), ('reserved_281', ctypes.c_uint32, 1124), ('reserved_282', ctypes.c_uint32, 1128), ('reserved_283', ctypes.c_uint32, 1132), ('reserved_284', ctypes.c_uint32, 1136), ('reserved_285', ctypes.c_uint32, 1140), ('reserved_286', ctypes.c_uint32, 1144), ('reserved_287', ctypes.c_uint32, 1148), ('reserved_288', ctypes.c_uint32, 1152), ('reserved_289', ctypes.c_uint32, 1156), ('reserved_290', ctypes.c_uint32, 1160), ('reserved_291', ctypes.c_uint32, 1164), ('reserved_292', ctypes.c_uint32, 1168), ('reserved_293', ctypes.c_uint32, 1172), ('reserved_294', ctypes.c_uint32, 1176), ('reserved_295', ctypes.c_uint32, 1180), ('reserved_296', ctypes.c_uint32, 1184), ('reserved_297', ctypes.c_uint32, 1188), ('reserved_298', ctypes.c_uint32, 1192), ('reserved_299', ctypes.c_uint32, 1196), ('reserved_300', ctypes.c_uint32, 1200), ('reserved_301', ctypes.c_uint32, 1204), ('reserved_302', ctypes.c_uint32, 1208), ('reserved_303', ctypes.c_uint32, 1212), ('reserved_304', ctypes.c_uint32, 1216), ('reserved_305', ctypes.c_uint32, 1220), ('reserved_306', ctypes.c_uint32, 1224), ('reserved_307', ctypes.c_uint32, 1228), ('reserved_308', ctypes.c_uint32, 1232), ('reserved_309', ctypes.c_uint32, 1236), ('reserved_310', ctypes.c_uint32, 1240), ('reserved_311', ctypes.c_uint32, 1244), ('reserved_312', ctypes.c_uint32, 1248), ('reserved_313', ctypes.c_uint32, 1252), ('reserved_314', ctypes.c_uint32, 1256), ('reserved_315', ctypes.c_uint32, 1260), ('reserved_316', ctypes.c_uint32, 1264), ('reserved_317', ctypes.c_uint32, 1268), ('reserved_318', ctypes.c_uint32, 1272), ('reserved_319', ctypes.c_uint32, 1276), ('reserved_320', ctypes.c_uint32, 1280), ('reserved_321', ctypes.c_uint32, 1284), ('reserved_322', ctypes.c_uint32, 1288), ('reserved_323', ctypes.c_uint32, 1292), ('reserved_324', ctypes.c_uint32, 1296), ('reserved_325', ctypes.c_uint32, 1300), ('reserved_326', ctypes.c_uint32, 1304), ('reserved_327', ctypes.c_uint32, 1308), ('reserved_328', ctypes.c_uint32, 1312), ('reserved_329', ctypes.c_uint32, 1316), ('reserved_330', ctypes.c_uint32, 1320), ('reserved_331', ctypes.c_uint32, 1324), ('reserved_332', ctypes.c_uint32, 1328), ('reserved_333', ctypes.c_uint32, 1332), ('reserved_334', ctypes.c_uint32, 1336), ('reserved_335', ctypes.c_uint32, 1340), ('reserved_336', ctypes.c_uint32, 1344), ('reserved_337', ctypes.c_uint32, 1348), ('reserved_338', ctypes.c_uint32, 1352), ('reserved_339', ctypes.c_uint32, 1356), ('reserved_340', ctypes.c_uint32, 1360), ('reserved_341', ctypes.c_uint32, 1364), ('reserved_342', ctypes.c_uint32, 1368), ('reserved_343', ctypes.c_uint32, 1372), ('reserved_344', ctypes.c_uint32, 1376), ('reserved_345', ctypes.c_uint32, 1380), ('reserved_346', ctypes.c_uint32, 1384), ('reserved_347', ctypes.c_uint32, 1388), ('reserved_348', ctypes.c_uint32, 1392), ('reserved_349', ctypes.c_uint32, 1396), ('reserved_350', ctypes.c_uint32, 1400), ('reserved_351', ctypes.c_uint32, 1404), ('reserved_352', ctypes.c_uint32, 1408), ('reserved_353', ctypes.c_uint32, 1412), ('reserved_354', ctypes.c_uint32, 1416), ('reserved_355', ctypes.c_uint32, 1420), ('reserved_356', ctypes.c_uint32, 1424), ('reserved_357', ctypes.c_uint32, 1428), ('reserved_358', ctypes.c_uint32, 1432), ('reserved_359', ctypes.c_uint32, 1436), ('reserved_360', ctypes.c_uint32, 1440), ('reserved_361', ctypes.c_uint32, 1444), ('reserved_362', ctypes.c_uint32, 1448), ('reserved_363', ctypes.c_uint32, 1452), ('reserved_364', ctypes.c_uint32, 1456), ('reserved_365', ctypes.c_uint32, 1460), ('reserved_366', ctypes.c_uint32, 1464), ('reserved_367', ctypes.c_uint32, 1468), ('reserved_368', ctypes.c_uint32, 1472), ('reserved_369', ctypes.c_uint32, 1476), ('reserved_370', ctypes.c_uint32, 1480), ('reserved_371', ctypes.c_uint32, 1484), ('reserved_372', ctypes.c_uint32, 1488), ('reserved_373', ctypes.c_uint32, 1492), ('reserved_374', ctypes.c_uint32, 1496), ('reserved_375', ctypes.c_uint32, 1500), ('reserved_376', ctypes.c_uint32, 1504), ('reserved_377', ctypes.c_uint32, 1508), ('reserved_378', ctypes.c_uint32, 1512), ('reserved_379', ctypes.c_uint32, 1516), ('reserved_380', ctypes.c_uint32, 1520), ('reserved_381', ctypes.c_uint32, 1524), ('reserved_382', ctypes.c_uint32, 1528), ('reserved_383', ctypes.c_uint32, 1532), ('reserved_384', ctypes.c_uint32, 1536), ('reserved_385', ctypes.c_uint32, 1540), ('reserved_386', ctypes.c_uint32, 1544), ('reserved_387', ctypes.c_uint32, 1548), ('reserved_388', ctypes.c_uint32, 1552), ('reserved_389', ctypes.c_uint32, 1556), ('reserved_390', ctypes.c_uint32, 1560), ('reserved_391', ctypes.c_uint32, 1564), ('reserved_392', ctypes.c_uint32, 1568), ('reserved_393', ctypes.c_uint32, 1572), ('reserved_394', ctypes.c_uint32, 1576), ('reserved_395', ctypes.c_uint32, 1580), ('reserved_396', ctypes.c_uint32, 1584), ('reserved_397', ctypes.c_uint32, 1588), ('reserved_398', ctypes.c_uint32, 1592), ('reserved_399', ctypes.c_uint32, 1596), ('reserved_400', ctypes.c_uint32, 1600), ('reserved_401', ctypes.c_uint32, 1604), ('reserved_402', ctypes.c_uint32, 1608), ('reserved_403', ctypes.c_uint32, 1612), ('reserved_404', ctypes.c_uint32, 1616), ('reserved_405', ctypes.c_uint32, 1620), ('reserved_406', ctypes.c_uint32, 1624), ('reserved_407', ctypes.c_uint32, 1628), ('reserved_408', ctypes.c_uint32, 1632), ('reserved_409', ctypes.c_uint32, 1636), ('reserved_410', ctypes.c_uint32, 1640), ('reserved_411', ctypes.c_uint32, 1644), ('reserved_412', ctypes.c_uint32, 1648), ('reserved_413', ctypes.c_uint32, 1652), ('reserved_414', ctypes.c_uint32, 1656), ('reserved_415', ctypes.c_uint32, 1660), ('reserved_416', ctypes.c_uint32, 1664), ('reserved_417', ctypes.c_uint32, 1668), ('reserved_418', ctypes.c_uint32, 1672), ('reserved_419', ctypes.c_uint32, 1676), ('reserved_420', ctypes.c_uint32, 1680), ('reserved_421', ctypes.c_uint32, 1684), ('reserved_422', ctypes.c_uint32, 1688), ('reserved_423', ctypes.c_uint32, 1692), ('reserved_424', ctypes.c_uint32, 1696), ('reserved_425', ctypes.c_uint32, 1700), ('reserved_426', ctypes.c_uint32, 1704), ('reserved_427', ctypes.c_uint32, 1708), ('reserved_428', ctypes.c_uint32, 1712), ('reserved_429', ctypes.c_uint32, 1716), ('reserved_430', ctypes.c_uint32, 1720), ('reserved_431', ctypes.c_uint32, 1724), ('reserved_432', ctypes.c_uint32, 1728), ('reserved_433', ctypes.c_uint32, 1732), ('reserved_434', ctypes.c_uint32, 1736), ('reserved_435', ctypes.c_uint32, 1740), ('reserved_436', ctypes.c_uint32, 1744), ('reserved_437', ctypes.c_uint32, 1748), ('reserved_438', ctypes.c_uint32, 1752), ('reserved_439', ctypes.c_uint32, 1756), ('reserved_440', ctypes.c_uint32, 1760), ('reserved_441', ctypes.c_uint32, 1764), ('reserved_442', ctypes.c_uint32, 1768), ('reserved_443', ctypes.c_uint32, 1772), ('reserved_444', ctypes.c_uint32, 1776), ('reserved_445', ctypes.c_uint32, 1780), ('reserved_446', ctypes.c_uint32, 1784), ('reserved_447', ctypes.c_uint32, 1788), ('gws_0_val', ctypes.c_uint32, 1792), ('gws_1_val', ctypes.c_uint32, 1796), ('gws_2_val', ctypes.c_uint32, 1800), ('gws_3_val', ctypes.c_uint32, 1804), ('gws_4_val', ctypes.c_uint32, 1808), ('gws_5_val', ctypes.c_uint32, 1812), ('gws_6_val', ctypes.c_uint32, 1816), ('gws_7_val', ctypes.c_uint32, 1820), ('gws_8_val', ctypes.c_uint32, 1824), ('gws_9_val', ctypes.c_uint32, 1828), ('gws_10_val', ctypes.c_uint32, 1832), ('gws_11_val', ctypes.c_uint32, 1836), ('gws_12_val', ctypes.c_uint32, 1840), ('gws_13_val', ctypes.c_uint32, 1844), ('gws_14_val', ctypes.c_uint32, 1848), ('gws_15_val', ctypes.c_uint32, 1852), ('gws_16_val', ctypes.c_uint32, 1856), ('gws_17_val', ctypes.c_uint32, 1860), ('gws_18_val', ctypes.c_uint32, 1864), ('gws_19_val', ctypes.c_uint32, 1868), ('gws_20_val', ctypes.c_uint32, 1872), ('gws_21_val', ctypes.c_uint32, 1876), ('gws_22_val', ctypes.c_uint32, 1880), ('gws_23_val', ctypes.c_uint32, 1884), ('gws_24_val', ctypes.c_uint32, 1888), ('gws_25_val', ctypes.c_uint32, 1892), ('gws_26_val', ctypes.c_uint32, 1896), ('gws_27_val', ctypes.c_uint32, 1900), ('gws_28_val', ctypes.c_uint32, 1904), ('gws_29_val', ctypes.c_uint32, 1908), ('gws_30_val', ctypes.c_uint32, 1912), ('gws_31_val', ctypes.c_uint32, 1916), ('gws_32_val', ctypes.c_uint32, 1920), ('gws_33_val', ctypes.c_uint32, 1924), ('gws_34_val', ctypes.c_uint32, 1928), ('gws_35_val', ctypes.c_uint32, 1932), ('gws_36_val', ctypes.c_uint32, 1936), ('gws_37_val', ctypes.c_uint32, 1940), ('gws_38_val', ctypes.c_uint32, 1944), ('gws_39_val', ctypes.c_uint32, 1948), ('gws_40_val', ctypes.c_uint32, 1952), ('gws_41_val', ctypes.c_uint32, 1956), ('gws_42_val', ctypes.c_uint32, 1960), ('gws_43_val', ctypes.c_uint32, 1964), ('gws_44_val', ctypes.c_uint32, 1968), ('gws_45_val', ctypes.c_uint32, 1972), ('gws_46_val', ctypes.c_uint32, 1976), ('gws_47_val', ctypes.c_uint32, 1980), ('gws_48_val', ctypes.c_uint32, 1984), ('gws_49_val', ctypes.c_uint32, 1988), ('gws_50_val', ctypes.c_uint32, 1992), ('gws_51_val', ctypes.c_uint32, 1996), ('gws_52_val', ctypes.c_uint32, 2000), ('gws_53_val', ctypes.c_uint32, 2004), ('gws_54_val', ctypes.c_uint32, 2008), ('gws_55_val', ctypes.c_uint32, 2012), ('gws_56_val', ctypes.c_uint32, 2016), ('gws_57_val', ctypes.c_uint32, 2020), ('gws_58_val', ctypes.c_uint32, 2024), ('gws_59_val', ctypes.c_uint32, 2028), ('gws_60_val', ctypes.c_uint32, 2032), ('gws_61_val', ctypes.c_uint32, 2036), ('gws_62_val', ctypes.c_uint32, 2040), ('gws_63_val', ctypes.c_uint32, 2044)]) +@c.record +class struct_v12_gfx_mqd(c.Struct): + SIZE = 2048 + shadow_base_lo: int + shadow_base_hi: int + reserved_2: int + reserved_3: int + fw_work_area_base_lo: int + fw_work_area_base_hi: int + shadow_initialized: int + ib_vmid: int + reserved_8: int + reserved_9: int + reserved_10: int + reserved_11: int + reserved_12: int + reserved_13: int + reserved_14: int + reserved_15: int + reserved_16: int + reserved_17: int + reserved_18: int + reserved_19: int + reserved_20: int + reserved_21: int + reserved_22: int + reserved_23: int + reserved_24: int + reserved_25: int + reserved_26: int + reserved_27: int + reserved_28: int + reserved_29: int + reserved_30: int + reserved_31: int + reserved_32: int + reserved_33: int + reserved_34: int + reserved_35: int + reserved_36: int + reserved_37: int + reserved_38: int + reserved_39: int + reserved_40: int + reserved_41: int + reserved_42: int + reserved_43: int + reserved_44: int + reserved_45: int + reserved_46: int + reserved_47: int + reserved_48: int + reserved_49: int + reserved_50: int + reserved_51: int + reserved_52: int + reserved_53: int + reserved_54: int + reserved_55: int + reserved_56: int + reserved_57: int + reserved_58: int + reserved_59: int + reserved_60: int + reserved_61: int + reserved_62: int + reserved_63: int + reserved_64: int + reserved_65: int + reserved_66: int + reserved_67: int + reserved_68: int + reserved_69: int + reserved_70: int + reserved_71: int + reserved_72: int + reserved_73: int + reserved_74: int + reserved_75: int + reserved_76: int + reserved_77: int + reserved_78: int + reserved_79: int + reserved_80: int + reserved_81: int + reserved_82: int + reserved_83: int + checksum_lo: int + checksum_hi: int + cp_mqd_query_time_lo: int + cp_mqd_query_time_hi: int + reserved_88: int + reserved_89: int + reserved_90: int + reserved_91: int + cp_mqd_query_wave_count: int + cp_mqd_query_gfx_hqd_rptr: int + cp_mqd_query_gfx_hqd_wptr: int + cp_mqd_query_gfx_hqd_offset: int + reserved_96: int + reserved_97: int + reserved_98: int + reserved_99: int + reserved_100: int + reserved_101: int + reserved_102: int + reserved_103: int + task_shader_control_buf_addr_lo: int + task_shader_control_buf_addr_hi: int + task_shader_read_rptr_lo: int + task_shader_read_rptr_hi: int + task_shader_num_entries: int + task_shader_num_entries_bits: int + task_shader_ring_buffer_addr_lo: int + task_shader_ring_buffer_addr_hi: int + reserved_112: int + reserved_113: int + reserved_114: int + reserved_115: int + reserved_116: int + reserved_117: int + reserved_118: int + reserved_119: int + reserved_120: int + reserved_121: int + reserved_122: int + reserved_123: int + reserved_124: int + reserved_125: int + reserved_126: int + reserved_127: int + cp_mqd_base_addr: int + cp_mqd_base_addr_hi: int + cp_gfx_hqd_active: int + cp_gfx_hqd_vmid: int + reserved_132: int + reserved_133: int + cp_gfx_hqd_queue_priority: int + cp_gfx_hqd_quantum: int + cp_gfx_hqd_base: int + cp_gfx_hqd_base_hi: int + cp_gfx_hqd_rptr: int + cp_gfx_hqd_rptr_addr: int + cp_gfx_hqd_rptr_addr_hi: int + cp_rb_wptr_poll_addr_lo: int + cp_rb_wptr_poll_addr_hi: int + cp_rb_doorbell_control: int + cp_gfx_hqd_offset: int + cp_gfx_hqd_cntl: int + reserved_146: int + reserved_147: int + cp_gfx_hqd_csmd_rptr: int + cp_gfx_hqd_wptr: int + cp_gfx_hqd_wptr_hi: int + reserved_151: int + reserved_152: int + reserved_153: int + reserved_154: int + reserved_155: int + cp_gfx_hqd_mapped: int + cp_gfx_hqd_que_mgr_control: int + reserved_158: int + reserved_159: int + cp_gfx_hqd_hq_status0: int + cp_gfx_hqd_hq_control0: int + cp_gfx_mqd_control: int + reserved_163: int + reserved_164: int + reserved_165: int + reserved_166: int + reserved_167: int + reserved_168: int + reserved_169: int + reserved_170: int + reserved_171: int + reserved_172: int + reserved_173: int + reserved_174: int + reserved_175: int + reserved_176: int + reserved_177: int + reserved_178: int + reserved_179: int + reserved_180: int + reserved_181: int + reserved_182: int + reserved_183: int + reserved_184: int + reserved_185: int + reserved_186: int + reserved_187: int + reserved_188: int + reserved_189: int + reserved_190: int + reserved_191: int + reserved_192: int + reserved_193: int + reserved_194: int + reserved_195: int + reserved_196: int + reserved_197: int + reserved_198: int + reserved_199: int + reserved_200: int + reserved_201: int + reserved_202: int + reserved_203: int + reserved_204: int + reserved_205: int + reserved_206: int + reserved_207: int + reserved_208: int + reserved_209: int + reserved_210: int + reserved_211: int + reserved_212: int + reserved_213: int + reserved_214: int + reserved_215: int + reserved_216: int + reserved_217: int + reserved_218: int + reserved_219: int + reserved_220: int + reserved_221: int + reserved_222: int + reserved_223: int + reserved_224: int + reserved_225: int + reserved_226: int + reserved_227: int + reserved_228: int + reserved_229: int + reserved_230: int + reserved_231: int + reserved_232: int + reserved_233: int + reserved_234: int + reserved_235: int + reserved_236: int + reserved_237: int + reserved_238: int + reserved_239: int + reserved_240: int + reserved_241: int + reserved_242: int + reserved_243: int + reserved_244: int + reserved_245: int + reserved_246: int + reserved_247: int + reserved_248: int + reserved_249: int + reserved_250: int + reserved_251: int + reserved_252: int + reserved_253: int + reserved_254: int + reserved_255: int + reserved_256: int + reserved_257: int + reserved_258: int + reserved_259: int + reserved_260: int + reserved_261: int + reserved_262: int + reserved_263: int + reserved_264: int + reserved_265: int + reserved_266: int + reserved_267: int + reserved_268: int + reserved_269: int + reserved_270: int + reserved_271: int + dfwx_flags: int + dfwx_slot: int + dfwx_client_data_addr_lo: int + dfwx_client_data_addr_hi: int + reserved_276: int + reserved_277: int + reserved_278: int + reserved_279: int + reserved_280: int + reserved_281: int + reserved_282: int + reserved_283: int + reserved_284: int + reserved_285: int + reserved_286: int + reserved_287: int + reserved_288: int + reserved_289: int + reserved_290: int + reserved_291: int + reserved_292: int + reserved_293: int + reserved_294: int + reserved_295: int + reserved_296: int + reserved_297: int + reserved_298: int + reserved_299: int + reserved_300: int + reserved_301: int + reserved_302: int + reserved_303: int + reserved_304: int + reserved_305: int + reserved_306: int + reserved_307: int + reserved_308: int + reserved_309: int + reserved_310: int + reserved_311: int + reserved_312: int + reserved_313: int + reserved_314: int + reserved_315: int + reserved_316: int + reserved_317: int + reserved_318: int + reserved_319: int + reserved_320: int + reserved_321: int + reserved_322: int + reserved_323: int + reserved_324: int + reserved_325: int + reserved_326: int + reserved_327: int + reserved_328: int + reserved_329: int + reserved_330: int + reserved_331: int + reserved_332: int + reserved_333: int + reserved_334: int + reserved_335: int + reserved_336: int + reserved_337: int + reserved_338: int + reserved_339: int + reserved_340: int + reserved_341: int + reserved_342: int + reserved_343: int + reserved_344: int + reserved_345: int + reserved_346: int + reserved_347: int + reserved_348: int + reserved_349: int + reserved_350: int + reserved_351: int + reserved_352: int + reserved_353: int + reserved_354: int + reserved_355: int + reserved_356: int + reserved_357: int + reserved_358: int + reserved_359: int + reserved_360: int + reserved_361: int + reserved_362: int + reserved_363: int + reserved_364: int + reserved_365: int + reserved_366: int + reserved_367: int + reserved_368: int + reserved_369: int + reserved_370: int + reserved_371: int + reserved_372: int + reserved_373: int + reserved_374: int + reserved_375: int + reserved_376: int + reserved_377: int + reserved_378: int + reserved_379: int + reserved_380: int + reserved_381: int + reserved_382: int + reserved_383: int + reserved_384: int + reserved_385: int + reserved_386: int + reserved_387: int + reserved_388: int + reserved_389: int + reserved_390: int + reserved_391: int + reserved_392: int + reserved_393: int + reserved_394: int + reserved_395: int + reserved_396: int + reserved_397: int + reserved_398: int + reserved_399: int + reserved_400: int + reserved_401: int + reserved_402: int + reserved_403: int + reserved_404: int + reserved_405: int + reserved_406: int + reserved_407: int + reserved_408: int + reserved_409: int + reserved_410: int + reserved_411: int + reserved_412: int + reserved_413: int + reserved_414: int + reserved_415: int + reserved_416: int + reserved_417: int + reserved_418: int + reserved_419: int + reserved_420: int + reserved_421: int + reserved_422: int + reserved_423: int + reserved_424: int + reserved_425: int + reserved_426: int + reserved_427: int + reserved_428: int + reserved_429: int + reserved_430: int + reserved_431: int + reserved_432: int + reserved_433: int + reserved_434: int + reserved_435: int + reserved_436: int + reserved_437: int + reserved_438: int + reserved_439: int + reserved_440: int + reserved_441: int + reserved_442: int + reserved_443: int + reserved_444: int + reserved_445: int + reserved_446: int + reserved_447: int + reserved_448: int + reserved_449: int + reserved_450: int + reserved_451: int + reserved_452: int + reserved_453: int + reserved_454: int + reserved_455: int + reserved_456: int + reserved_457: int + reserved_458: int + reserved_459: int + reserved_460: int + reserved_461: int + reserved_462: int + reserved_463: int + reserved_464: int + reserved_465: int + reserved_466: int + reserved_467: int + reserved_468: int + reserved_469: int + reserved_470: int + reserved_471: int + reserved_472: int + reserved_473: int + reserved_474: int + reserved_475: int + reserved_476: int + reserved_477: int + reserved_478: int + reserved_479: int + reserved_480: int + reserved_481: int + reserved_482: int + reserved_483: int + reserved_484: int + reserved_485: int + reserved_486: int + reserved_487: int + reserved_488: int + reserved_489: int + reserved_490: int + reserved_491: int + reserved_492: int + reserved_493: int + reserved_494: int + reserved_495: int + reserved_496: int + reserved_497: int + reserved_498: int + reserved_499: int + reserved_500: int + reserved_501: int + reserved_502: int + reserved_503: int + reserved_504: int + reserved_505: int + reserved_506: int + reserved_507: int + reserved_508: int + reserved_509: int + reserved_510: int + reserved_511: int +uint32_t: TypeAlias = ctypes.c_uint32 +struct_v12_gfx_mqd.register_fields([('shadow_base_lo', uint32_t, 0), ('shadow_base_hi', uint32_t, 4), ('reserved_2', uint32_t, 8), ('reserved_3', uint32_t, 12), ('fw_work_area_base_lo', uint32_t, 16), ('fw_work_area_base_hi', uint32_t, 20), ('shadow_initialized', uint32_t, 24), ('ib_vmid', uint32_t, 28), ('reserved_8', uint32_t, 32), ('reserved_9', uint32_t, 36), ('reserved_10', uint32_t, 40), ('reserved_11', uint32_t, 44), ('reserved_12', uint32_t, 48), ('reserved_13', uint32_t, 52), ('reserved_14', uint32_t, 56), ('reserved_15', uint32_t, 60), ('reserved_16', uint32_t, 64), ('reserved_17', uint32_t, 68), ('reserved_18', uint32_t, 72), ('reserved_19', uint32_t, 76), ('reserved_20', uint32_t, 80), ('reserved_21', uint32_t, 84), ('reserved_22', uint32_t, 88), ('reserved_23', uint32_t, 92), ('reserved_24', uint32_t, 96), ('reserved_25', uint32_t, 100), ('reserved_26', uint32_t, 104), ('reserved_27', uint32_t, 108), ('reserved_28', uint32_t, 112), ('reserved_29', uint32_t, 116), ('reserved_30', uint32_t, 120), ('reserved_31', uint32_t, 124), ('reserved_32', uint32_t, 128), ('reserved_33', uint32_t, 132), ('reserved_34', uint32_t, 136), ('reserved_35', uint32_t, 140), ('reserved_36', uint32_t, 144), ('reserved_37', uint32_t, 148), ('reserved_38', uint32_t, 152), ('reserved_39', uint32_t, 156), ('reserved_40', uint32_t, 160), ('reserved_41', uint32_t, 164), ('reserved_42', uint32_t, 168), ('reserved_43', uint32_t, 172), ('reserved_44', uint32_t, 176), ('reserved_45', uint32_t, 180), ('reserved_46', uint32_t, 184), ('reserved_47', uint32_t, 188), ('reserved_48', uint32_t, 192), ('reserved_49', uint32_t, 196), ('reserved_50', uint32_t, 200), ('reserved_51', uint32_t, 204), ('reserved_52', uint32_t, 208), ('reserved_53', uint32_t, 212), ('reserved_54', uint32_t, 216), ('reserved_55', uint32_t, 220), ('reserved_56', uint32_t, 224), ('reserved_57', uint32_t, 228), ('reserved_58', uint32_t, 232), ('reserved_59', uint32_t, 236), ('reserved_60', uint32_t, 240), ('reserved_61', uint32_t, 244), ('reserved_62', uint32_t, 248), ('reserved_63', uint32_t, 252), ('reserved_64', uint32_t, 256), ('reserved_65', uint32_t, 260), ('reserved_66', uint32_t, 264), ('reserved_67', uint32_t, 268), ('reserved_68', uint32_t, 272), ('reserved_69', uint32_t, 276), ('reserved_70', uint32_t, 280), ('reserved_71', uint32_t, 284), ('reserved_72', uint32_t, 288), ('reserved_73', uint32_t, 292), ('reserved_74', uint32_t, 296), ('reserved_75', uint32_t, 300), ('reserved_76', uint32_t, 304), ('reserved_77', uint32_t, 308), ('reserved_78', uint32_t, 312), ('reserved_79', uint32_t, 316), ('reserved_80', uint32_t, 320), ('reserved_81', uint32_t, 324), ('reserved_82', uint32_t, 328), ('reserved_83', uint32_t, 332), ('checksum_lo', uint32_t, 336), ('checksum_hi', uint32_t, 340), ('cp_mqd_query_time_lo', uint32_t, 344), ('cp_mqd_query_time_hi', uint32_t, 348), ('reserved_88', uint32_t, 352), ('reserved_89', uint32_t, 356), ('reserved_90', uint32_t, 360), ('reserved_91', uint32_t, 364), ('cp_mqd_query_wave_count', uint32_t, 368), ('cp_mqd_query_gfx_hqd_rptr', uint32_t, 372), ('cp_mqd_query_gfx_hqd_wptr', uint32_t, 376), ('cp_mqd_query_gfx_hqd_offset', uint32_t, 380), ('reserved_96', uint32_t, 384), ('reserved_97', uint32_t, 388), ('reserved_98', uint32_t, 392), ('reserved_99', uint32_t, 396), ('reserved_100', uint32_t, 400), ('reserved_101', uint32_t, 404), ('reserved_102', uint32_t, 408), ('reserved_103', uint32_t, 412), ('task_shader_control_buf_addr_lo', uint32_t, 416), ('task_shader_control_buf_addr_hi', uint32_t, 420), ('task_shader_read_rptr_lo', uint32_t, 424), ('task_shader_read_rptr_hi', uint32_t, 428), ('task_shader_num_entries', uint32_t, 432), ('task_shader_num_entries_bits', uint32_t, 436), ('task_shader_ring_buffer_addr_lo', uint32_t, 440), ('task_shader_ring_buffer_addr_hi', uint32_t, 444), ('reserved_112', uint32_t, 448), ('reserved_113', uint32_t, 452), ('reserved_114', uint32_t, 456), ('reserved_115', uint32_t, 460), ('reserved_116', uint32_t, 464), ('reserved_117', uint32_t, 468), ('reserved_118', uint32_t, 472), ('reserved_119', uint32_t, 476), ('reserved_120', uint32_t, 480), ('reserved_121', uint32_t, 484), ('reserved_122', uint32_t, 488), ('reserved_123', uint32_t, 492), ('reserved_124', uint32_t, 496), ('reserved_125', uint32_t, 500), ('reserved_126', uint32_t, 504), ('reserved_127', uint32_t, 508), ('cp_mqd_base_addr', uint32_t, 512), ('cp_mqd_base_addr_hi', uint32_t, 516), ('cp_gfx_hqd_active', uint32_t, 520), ('cp_gfx_hqd_vmid', uint32_t, 524), ('reserved_132', uint32_t, 528), ('reserved_133', uint32_t, 532), ('cp_gfx_hqd_queue_priority', uint32_t, 536), ('cp_gfx_hqd_quantum', uint32_t, 540), ('cp_gfx_hqd_base', uint32_t, 544), ('cp_gfx_hqd_base_hi', uint32_t, 548), ('cp_gfx_hqd_rptr', uint32_t, 552), ('cp_gfx_hqd_rptr_addr', uint32_t, 556), ('cp_gfx_hqd_rptr_addr_hi', uint32_t, 560), ('cp_rb_wptr_poll_addr_lo', uint32_t, 564), ('cp_rb_wptr_poll_addr_hi', uint32_t, 568), ('cp_rb_doorbell_control', uint32_t, 572), ('cp_gfx_hqd_offset', uint32_t, 576), ('cp_gfx_hqd_cntl', uint32_t, 580), ('reserved_146', uint32_t, 584), ('reserved_147', uint32_t, 588), ('cp_gfx_hqd_csmd_rptr', uint32_t, 592), ('cp_gfx_hqd_wptr', uint32_t, 596), ('cp_gfx_hqd_wptr_hi', uint32_t, 600), ('reserved_151', uint32_t, 604), ('reserved_152', uint32_t, 608), ('reserved_153', uint32_t, 612), ('reserved_154', uint32_t, 616), ('reserved_155', uint32_t, 620), ('cp_gfx_hqd_mapped', uint32_t, 624), ('cp_gfx_hqd_que_mgr_control', uint32_t, 628), ('reserved_158', uint32_t, 632), ('reserved_159', uint32_t, 636), ('cp_gfx_hqd_hq_status0', uint32_t, 640), ('cp_gfx_hqd_hq_control0', uint32_t, 644), ('cp_gfx_mqd_control', uint32_t, 648), ('reserved_163', uint32_t, 652), ('reserved_164', uint32_t, 656), ('reserved_165', uint32_t, 660), ('reserved_166', uint32_t, 664), ('reserved_167', uint32_t, 668), ('reserved_168', uint32_t, 672), ('reserved_169', uint32_t, 676), ('reserved_170', uint32_t, 680), ('reserved_171', uint32_t, 684), ('reserved_172', uint32_t, 688), ('reserved_173', uint32_t, 692), ('reserved_174', uint32_t, 696), ('reserved_175', uint32_t, 700), ('reserved_176', uint32_t, 704), ('reserved_177', uint32_t, 708), ('reserved_178', uint32_t, 712), ('reserved_179', uint32_t, 716), ('reserved_180', uint32_t, 720), ('reserved_181', uint32_t, 724), ('reserved_182', uint32_t, 728), ('reserved_183', uint32_t, 732), ('reserved_184', uint32_t, 736), ('reserved_185', uint32_t, 740), ('reserved_186', uint32_t, 744), ('reserved_187', uint32_t, 748), ('reserved_188', uint32_t, 752), ('reserved_189', uint32_t, 756), ('reserved_190', uint32_t, 760), ('reserved_191', uint32_t, 764), ('reserved_192', uint32_t, 768), ('reserved_193', uint32_t, 772), ('reserved_194', uint32_t, 776), ('reserved_195', uint32_t, 780), ('reserved_196', uint32_t, 784), ('reserved_197', uint32_t, 788), ('reserved_198', uint32_t, 792), ('reserved_199', uint32_t, 796), ('reserved_200', uint32_t, 800), ('reserved_201', uint32_t, 804), ('reserved_202', uint32_t, 808), ('reserved_203', uint32_t, 812), ('reserved_204', uint32_t, 816), ('reserved_205', uint32_t, 820), ('reserved_206', uint32_t, 824), ('reserved_207', uint32_t, 828), ('reserved_208', uint32_t, 832), ('reserved_209', uint32_t, 836), ('reserved_210', uint32_t, 840), ('reserved_211', uint32_t, 844), ('reserved_212', uint32_t, 848), ('reserved_213', uint32_t, 852), ('reserved_214', uint32_t, 856), ('reserved_215', uint32_t, 860), ('reserved_216', uint32_t, 864), ('reserved_217', uint32_t, 868), ('reserved_218', uint32_t, 872), ('reserved_219', uint32_t, 876), ('reserved_220', uint32_t, 880), ('reserved_221', uint32_t, 884), ('reserved_222', uint32_t, 888), ('reserved_223', uint32_t, 892), ('reserved_224', uint32_t, 896), ('reserved_225', uint32_t, 900), ('reserved_226', uint32_t, 904), ('reserved_227', uint32_t, 908), ('reserved_228', uint32_t, 912), ('reserved_229', uint32_t, 916), ('reserved_230', uint32_t, 920), ('reserved_231', uint32_t, 924), ('reserved_232', uint32_t, 928), ('reserved_233', uint32_t, 932), ('reserved_234', uint32_t, 936), ('reserved_235', uint32_t, 940), ('reserved_236', uint32_t, 944), ('reserved_237', uint32_t, 948), ('reserved_238', uint32_t, 952), ('reserved_239', uint32_t, 956), ('reserved_240', uint32_t, 960), ('reserved_241', uint32_t, 964), ('reserved_242', uint32_t, 968), ('reserved_243', uint32_t, 972), ('reserved_244', uint32_t, 976), ('reserved_245', uint32_t, 980), ('reserved_246', uint32_t, 984), ('reserved_247', uint32_t, 988), ('reserved_248', uint32_t, 992), ('reserved_249', uint32_t, 996), ('reserved_250', uint32_t, 1000), ('reserved_251', uint32_t, 1004), ('reserved_252', uint32_t, 1008), ('reserved_253', uint32_t, 1012), ('reserved_254', uint32_t, 1016), ('reserved_255', uint32_t, 1020), ('reserved_256', uint32_t, 1024), ('reserved_257', uint32_t, 1028), ('reserved_258', uint32_t, 1032), ('reserved_259', uint32_t, 1036), ('reserved_260', uint32_t, 1040), ('reserved_261', uint32_t, 1044), ('reserved_262', uint32_t, 1048), ('reserved_263', uint32_t, 1052), ('reserved_264', uint32_t, 1056), ('reserved_265', uint32_t, 1060), ('reserved_266', uint32_t, 1064), ('reserved_267', uint32_t, 1068), ('reserved_268', uint32_t, 1072), ('reserved_269', uint32_t, 1076), ('reserved_270', uint32_t, 1080), ('reserved_271', uint32_t, 1084), ('dfwx_flags', uint32_t, 1088), ('dfwx_slot', uint32_t, 1092), ('dfwx_client_data_addr_lo', uint32_t, 1096), ('dfwx_client_data_addr_hi', uint32_t, 1100), ('reserved_276', uint32_t, 1104), ('reserved_277', uint32_t, 1108), ('reserved_278', uint32_t, 1112), ('reserved_279', uint32_t, 1116), ('reserved_280', uint32_t, 1120), ('reserved_281', uint32_t, 1124), ('reserved_282', uint32_t, 1128), ('reserved_283', uint32_t, 1132), ('reserved_284', uint32_t, 1136), ('reserved_285', uint32_t, 1140), ('reserved_286', uint32_t, 1144), ('reserved_287', uint32_t, 1148), ('reserved_288', uint32_t, 1152), ('reserved_289', uint32_t, 1156), ('reserved_290', uint32_t, 1160), ('reserved_291', uint32_t, 1164), ('reserved_292', uint32_t, 1168), ('reserved_293', uint32_t, 1172), ('reserved_294', uint32_t, 1176), ('reserved_295', uint32_t, 1180), ('reserved_296', uint32_t, 1184), ('reserved_297', uint32_t, 1188), ('reserved_298', uint32_t, 1192), ('reserved_299', uint32_t, 1196), ('reserved_300', uint32_t, 1200), ('reserved_301', uint32_t, 1204), ('reserved_302', uint32_t, 1208), ('reserved_303', uint32_t, 1212), ('reserved_304', uint32_t, 1216), ('reserved_305', uint32_t, 1220), ('reserved_306', uint32_t, 1224), ('reserved_307', uint32_t, 1228), ('reserved_308', uint32_t, 1232), ('reserved_309', uint32_t, 1236), ('reserved_310', uint32_t, 1240), ('reserved_311', uint32_t, 1244), ('reserved_312', uint32_t, 1248), ('reserved_313', uint32_t, 1252), ('reserved_314', uint32_t, 1256), ('reserved_315', uint32_t, 1260), ('reserved_316', uint32_t, 1264), ('reserved_317', uint32_t, 1268), ('reserved_318', uint32_t, 1272), ('reserved_319', uint32_t, 1276), ('reserved_320', uint32_t, 1280), ('reserved_321', uint32_t, 1284), ('reserved_322', uint32_t, 1288), ('reserved_323', uint32_t, 1292), ('reserved_324', uint32_t, 1296), ('reserved_325', uint32_t, 1300), ('reserved_326', uint32_t, 1304), ('reserved_327', uint32_t, 1308), ('reserved_328', uint32_t, 1312), ('reserved_329', uint32_t, 1316), ('reserved_330', uint32_t, 1320), ('reserved_331', uint32_t, 1324), ('reserved_332', uint32_t, 1328), ('reserved_333', uint32_t, 1332), ('reserved_334', uint32_t, 1336), ('reserved_335', uint32_t, 1340), ('reserved_336', uint32_t, 1344), ('reserved_337', uint32_t, 1348), ('reserved_338', uint32_t, 1352), ('reserved_339', uint32_t, 1356), ('reserved_340', uint32_t, 1360), ('reserved_341', uint32_t, 1364), ('reserved_342', uint32_t, 1368), ('reserved_343', uint32_t, 1372), ('reserved_344', uint32_t, 1376), ('reserved_345', uint32_t, 1380), ('reserved_346', uint32_t, 1384), ('reserved_347', uint32_t, 1388), ('reserved_348', uint32_t, 1392), ('reserved_349', uint32_t, 1396), ('reserved_350', uint32_t, 1400), ('reserved_351', uint32_t, 1404), ('reserved_352', uint32_t, 1408), ('reserved_353', uint32_t, 1412), ('reserved_354', uint32_t, 1416), ('reserved_355', uint32_t, 1420), ('reserved_356', uint32_t, 1424), ('reserved_357', uint32_t, 1428), ('reserved_358', uint32_t, 1432), ('reserved_359', uint32_t, 1436), ('reserved_360', uint32_t, 1440), ('reserved_361', uint32_t, 1444), ('reserved_362', uint32_t, 1448), ('reserved_363', uint32_t, 1452), ('reserved_364', uint32_t, 1456), ('reserved_365', uint32_t, 1460), ('reserved_366', uint32_t, 1464), ('reserved_367', uint32_t, 1468), ('reserved_368', uint32_t, 1472), ('reserved_369', uint32_t, 1476), ('reserved_370', uint32_t, 1480), ('reserved_371', uint32_t, 1484), ('reserved_372', uint32_t, 1488), ('reserved_373', uint32_t, 1492), ('reserved_374', uint32_t, 1496), ('reserved_375', uint32_t, 1500), ('reserved_376', uint32_t, 1504), ('reserved_377', uint32_t, 1508), ('reserved_378', uint32_t, 1512), ('reserved_379', uint32_t, 1516), ('reserved_380', uint32_t, 1520), ('reserved_381', uint32_t, 1524), ('reserved_382', uint32_t, 1528), ('reserved_383', uint32_t, 1532), ('reserved_384', uint32_t, 1536), ('reserved_385', uint32_t, 1540), ('reserved_386', uint32_t, 1544), ('reserved_387', uint32_t, 1548), ('reserved_388', uint32_t, 1552), ('reserved_389', uint32_t, 1556), ('reserved_390', uint32_t, 1560), ('reserved_391', uint32_t, 1564), ('reserved_392', uint32_t, 1568), ('reserved_393', uint32_t, 1572), ('reserved_394', uint32_t, 1576), ('reserved_395', uint32_t, 1580), ('reserved_396', uint32_t, 1584), ('reserved_397', uint32_t, 1588), ('reserved_398', uint32_t, 1592), ('reserved_399', uint32_t, 1596), ('reserved_400', uint32_t, 1600), ('reserved_401', uint32_t, 1604), ('reserved_402', uint32_t, 1608), ('reserved_403', uint32_t, 1612), ('reserved_404', uint32_t, 1616), ('reserved_405', uint32_t, 1620), ('reserved_406', uint32_t, 1624), ('reserved_407', uint32_t, 1628), ('reserved_408', uint32_t, 1632), ('reserved_409', uint32_t, 1636), ('reserved_410', uint32_t, 1640), ('reserved_411', uint32_t, 1644), ('reserved_412', uint32_t, 1648), ('reserved_413', uint32_t, 1652), ('reserved_414', uint32_t, 1656), ('reserved_415', uint32_t, 1660), ('reserved_416', uint32_t, 1664), ('reserved_417', uint32_t, 1668), ('reserved_418', uint32_t, 1672), ('reserved_419', uint32_t, 1676), ('reserved_420', uint32_t, 1680), ('reserved_421', uint32_t, 1684), ('reserved_422', uint32_t, 1688), ('reserved_423', uint32_t, 1692), ('reserved_424', uint32_t, 1696), ('reserved_425', uint32_t, 1700), ('reserved_426', uint32_t, 1704), ('reserved_427', uint32_t, 1708), ('reserved_428', uint32_t, 1712), ('reserved_429', uint32_t, 1716), ('reserved_430', uint32_t, 1720), ('reserved_431', uint32_t, 1724), ('reserved_432', uint32_t, 1728), ('reserved_433', uint32_t, 1732), ('reserved_434', uint32_t, 1736), ('reserved_435', uint32_t, 1740), ('reserved_436', uint32_t, 1744), ('reserved_437', uint32_t, 1748), ('reserved_438', uint32_t, 1752), ('reserved_439', uint32_t, 1756), ('reserved_440', uint32_t, 1760), ('reserved_441', uint32_t, 1764), ('reserved_442', uint32_t, 1768), ('reserved_443', uint32_t, 1772), ('reserved_444', uint32_t, 1776), ('reserved_445', uint32_t, 1780), ('reserved_446', uint32_t, 1784), ('reserved_447', uint32_t, 1788), ('reserved_448', uint32_t, 1792), ('reserved_449', uint32_t, 1796), ('reserved_450', uint32_t, 1800), ('reserved_451', uint32_t, 1804), ('reserved_452', uint32_t, 1808), ('reserved_453', uint32_t, 1812), ('reserved_454', uint32_t, 1816), ('reserved_455', uint32_t, 1820), ('reserved_456', uint32_t, 1824), ('reserved_457', uint32_t, 1828), ('reserved_458', uint32_t, 1832), ('reserved_459', uint32_t, 1836), ('reserved_460', uint32_t, 1840), ('reserved_461', uint32_t, 1844), ('reserved_462', uint32_t, 1848), ('reserved_463', uint32_t, 1852), ('reserved_464', uint32_t, 1856), ('reserved_465', uint32_t, 1860), ('reserved_466', uint32_t, 1864), ('reserved_467', uint32_t, 1868), ('reserved_468', uint32_t, 1872), ('reserved_469', uint32_t, 1876), ('reserved_470', uint32_t, 1880), ('reserved_471', uint32_t, 1884), ('reserved_472', uint32_t, 1888), ('reserved_473', uint32_t, 1892), ('reserved_474', uint32_t, 1896), ('reserved_475', uint32_t, 1900), ('reserved_476', uint32_t, 1904), ('reserved_477', uint32_t, 1908), ('reserved_478', uint32_t, 1912), ('reserved_479', uint32_t, 1916), ('reserved_480', uint32_t, 1920), ('reserved_481', uint32_t, 1924), ('reserved_482', uint32_t, 1928), ('reserved_483', uint32_t, 1932), ('reserved_484', uint32_t, 1936), ('reserved_485', uint32_t, 1940), ('reserved_486', uint32_t, 1944), ('reserved_487', uint32_t, 1948), ('reserved_488', uint32_t, 1952), ('reserved_489', uint32_t, 1956), ('reserved_490', uint32_t, 1960), ('reserved_491', uint32_t, 1964), ('reserved_492', uint32_t, 1968), ('reserved_493', uint32_t, 1972), ('reserved_494', uint32_t, 1976), ('reserved_495', uint32_t, 1980), ('reserved_496', uint32_t, 1984), ('reserved_497', uint32_t, 1988), ('reserved_498', uint32_t, 1992), ('reserved_499', uint32_t, 1996), ('reserved_500', uint32_t, 2000), ('reserved_501', uint32_t, 2004), ('reserved_502', uint32_t, 2008), ('reserved_503', uint32_t, 2012), ('reserved_504', uint32_t, 2016), ('reserved_505', uint32_t, 2020), ('reserved_506', uint32_t, 2024), ('reserved_507', uint32_t, 2028), ('reserved_508', uint32_t, 2032), ('reserved_509', uint32_t, 2036), ('reserved_510', uint32_t, 2040), ('reserved_511', uint32_t, 2044)]) +@c.record +class struct_v12_sdma_mqd(c.Struct): + SIZE = 512 + sdmax_rlcx_rb_cntl: int + sdmax_rlcx_rb_base: int + sdmax_rlcx_rb_base_hi: int + sdmax_rlcx_rb_rptr: int + sdmax_rlcx_rb_rptr_hi: int + sdmax_rlcx_rb_wptr: int + sdmax_rlcx_rb_wptr_hi: int + sdmax_rlcx_rb_rptr_addr_lo: int + sdmax_rlcx_rb_rptr_addr_hi: int + sdmax_rlcx_ib_cntl: int + sdmax_rlcx_ib_rptr: int + sdmax_rlcx_ib_offset: int + sdmax_rlcx_ib_base_lo: int + sdmax_rlcx_ib_base_hi: int + sdmax_rlcx_ib_size: int + sdmax_rlcx_doorbell: int + sdmax_rlcx_doorbell_log: int + sdmax_rlcx_doorbell_offset: int + sdmax_rlcx_csa_addr_lo: int + sdmax_rlcx_csa_addr_hi: int + sdmax_rlcx_sched_cntl: int + sdmax_rlcx_ib_sub_remain: int + sdmax_rlcx_preempt: int + sdmax_rlcx_dummy_reg: int + sdmax_rlcx_rb_wptr_poll_addr_lo: int + sdmax_rlcx_rb_wptr_poll_addr_hi: int + sdmax_rlcx_rb_aql_cntl: int + sdmax_rlcx_minor_ptr_update: int + sdmax_rlcx_mcu_dbg0: int + sdmax_rlcx_mcu_dbg1: int + sdmax_rlcx_context_switch_status: int + sdmax_rlcx_midcmd_cntl: int + sdmax_rlcx_midcmd_data0: int + sdmax_rlcx_midcmd_data1: int + sdmax_rlcx_midcmd_data2: int + sdmax_rlcx_midcmd_data3: int + sdmax_rlcx_midcmd_data4: int + sdmax_rlcx_midcmd_data5: int + sdmax_rlcx_midcmd_data6: int + sdmax_rlcx_midcmd_data7: int + sdmax_rlcx_midcmd_data8: int + sdmax_rlcx_midcmd_data9: int + sdmax_rlcx_midcmd_data10: int + sdmax_rlcx_wait_unsatisfied_thd: int + sdmax_rlcx_mqd_base_addr_lo: int + sdmax_rlcx_mqd_base_addr_hi: int + sdmax_rlcx_mqd_control: int + reserved_47: int + reserved_48: int + reserved_49: int + reserved_50: int + reserved_51: int + reserved_52: int + reserved_53: int + reserved_54: int + reserved_55: int + reserved_56: int + reserved_57: int + reserved_58: int + reserved_59: int + reserved_60: int + reserved_61: int + reserved_62: int + reserved_63: int + reserved_64: int + reserved_65: int + reserved_66: int + reserved_67: int + reserved_68: int + reserved_69: int + reserved_70: int + reserved_71: int + reserved_72: int + reserved_73: int + reserved_74: int + reserved_75: int + reserved_76: int + reserved_77: int + reserved_78: int + reserved_79: int + reserved_80: int + reserved_81: int + reserved_82: int + reserved_83: int + reserved_84: int + reserved_85: int + reserved_86: int + reserved_87: int + reserved_88: int + reserved_89: int + reserved_90: int + reserved_91: int + reserved_92: int + reserved_93: int + reserved_94: int + reserved_95: int + reserved_96: int + reserved_97: int + reserved_98: int + reserved_99: int + reserved_100: int + reserved_101: int + reserved_102: int + reserved_103: int + reserved_104: int + reserved_105: int + reserved_106: int + reserved_107: int + reserved_108: int + reserved_109: int + reserved_110: int + reserved_111: int + reserved_112: int + reserved_113: int + reserved_114: int + reserved_115: int + reserved_116: int + reserved_117: int + reserved_118: int + reserved_119: int + reserved_120: int + reserved_121: int + reserved_122: int + reserved_123: int + reserved_124: int + reserved_125: int + sdma_engine_id: int + sdma_queue_id: int +struct_v12_sdma_mqd.register_fields([('sdmax_rlcx_rb_cntl', uint32_t, 0), ('sdmax_rlcx_rb_base', uint32_t, 4), ('sdmax_rlcx_rb_base_hi', uint32_t, 8), ('sdmax_rlcx_rb_rptr', uint32_t, 12), ('sdmax_rlcx_rb_rptr_hi', uint32_t, 16), ('sdmax_rlcx_rb_wptr', uint32_t, 20), ('sdmax_rlcx_rb_wptr_hi', uint32_t, 24), ('sdmax_rlcx_rb_rptr_addr_lo', uint32_t, 28), ('sdmax_rlcx_rb_rptr_addr_hi', uint32_t, 32), ('sdmax_rlcx_ib_cntl', uint32_t, 36), ('sdmax_rlcx_ib_rptr', uint32_t, 40), ('sdmax_rlcx_ib_offset', uint32_t, 44), ('sdmax_rlcx_ib_base_lo', uint32_t, 48), ('sdmax_rlcx_ib_base_hi', uint32_t, 52), ('sdmax_rlcx_ib_size', uint32_t, 56), ('sdmax_rlcx_doorbell', uint32_t, 60), ('sdmax_rlcx_doorbell_log', uint32_t, 64), ('sdmax_rlcx_doorbell_offset', uint32_t, 68), ('sdmax_rlcx_csa_addr_lo', uint32_t, 72), ('sdmax_rlcx_csa_addr_hi', uint32_t, 76), ('sdmax_rlcx_sched_cntl', uint32_t, 80), ('sdmax_rlcx_ib_sub_remain', uint32_t, 84), ('sdmax_rlcx_preempt', uint32_t, 88), ('sdmax_rlcx_dummy_reg', uint32_t, 92), ('sdmax_rlcx_rb_wptr_poll_addr_lo', uint32_t, 96), ('sdmax_rlcx_rb_wptr_poll_addr_hi', uint32_t, 100), ('sdmax_rlcx_rb_aql_cntl', uint32_t, 104), ('sdmax_rlcx_minor_ptr_update', uint32_t, 108), ('sdmax_rlcx_mcu_dbg0', uint32_t, 112), ('sdmax_rlcx_mcu_dbg1', uint32_t, 116), ('sdmax_rlcx_context_switch_status', uint32_t, 120), ('sdmax_rlcx_midcmd_cntl', uint32_t, 124), ('sdmax_rlcx_midcmd_data0', uint32_t, 128), ('sdmax_rlcx_midcmd_data1', uint32_t, 132), ('sdmax_rlcx_midcmd_data2', uint32_t, 136), ('sdmax_rlcx_midcmd_data3', uint32_t, 140), ('sdmax_rlcx_midcmd_data4', uint32_t, 144), ('sdmax_rlcx_midcmd_data5', uint32_t, 148), ('sdmax_rlcx_midcmd_data6', uint32_t, 152), ('sdmax_rlcx_midcmd_data7', uint32_t, 156), ('sdmax_rlcx_midcmd_data8', uint32_t, 160), ('sdmax_rlcx_midcmd_data9', uint32_t, 164), ('sdmax_rlcx_midcmd_data10', uint32_t, 168), ('sdmax_rlcx_wait_unsatisfied_thd', uint32_t, 172), ('sdmax_rlcx_mqd_base_addr_lo', uint32_t, 176), ('sdmax_rlcx_mqd_base_addr_hi', uint32_t, 180), ('sdmax_rlcx_mqd_control', uint32_t, 184), ('reserved_47', uint32_t, 188), ('reserved_48', uint32_t, 192), ('reserved_49', uint32_t, 196), ('reserved_50', uint32_t, 200), ('reserved_51', uint32_t, 204), ('reserved_52', uint32_t, 208), ('reserved_53', uint32_t, 212), ('reserved_54', uint32_t, 216), ('reserved_55', uint32_t, 220), ('reserved_56', uint32_t, 224), ('reserved_57', uint32_t, 228), ('reserved_58', uint32_t, 232), ('reserved_59', uint32_t, 236), ('reserved_60', uint32_t, 240), ('reserved_61', uint32_t, 244), ('reserved_62', uint32_t, 248), ('reserved_63', uint32_t, 252), ('reserved_64', uint32_t, 256), ('reserved_65', uint32_t, 260), ('reserved_66', uint32_t, 264), ('reserved_67', uint32_t, 268), ('reserved_68', uint32_t, 272), ('reserved_69', uint32_t, 276), ('reserved_70', uint32_t, 280), ('reserved_71', uint32_t, 284), ('reserved_72', uint32_t, 288), ('reserved_73', uint32_t, 292), ('reserved_74', uint32_t, 296), ('reserved_75', uint32_t, 300), ('reserved_76', uint32_t, 304), ('reserved_77', uint32_t, 308), ('reserved_78', uint32_t, 312), ('reserved_79', uint32_t, 316), ('reserved_80', uint32_t, 320), ('reserved_81', uint32_t, 324), ('reserved_82', uint32_t, 328), ('reserved_83', uint32_t, 332), ('reserved_84', uint32_t, 336), ('reserved_85', uint32_t, 340), ('reserved_86', uint32_t, 344), ('reserved_87', uint32_t, 348), ('reserved_88', uint32_t, 352), ('reserved_89', uint32_t, 356), ('reserved_90', uint32_t, 360), ('reserved_91', uint32_t, 364), ('reserved_92', uint32_t, 368), ('reserved_93', uint32_t, 372), ('reserved_94', uint32_t, 376), ('reserved_95', uint32_t, 380), ('reserved_96', uint32_t, 384), ('reserved_97', uint32_t, 388), ('reserved_98', uint32_t, 392), ('reserved_99', uint32_t, 396), ('reserved_100', uint32_t, 400), ('reserved_101', uint32_t, 404), ('reserved_102', uint32_t, 408), ('reserved_103', uint32_t, 412), ('reserved_104', uint32_t, 416), ('reserved_105', uint32_t, 420), ('reserved_106', uint32_t, 424), ('reserved_107', uint32_t, 428), ('reserved_108', uint32_t, 432), ('reserved_109', uint32_t, 436), ('reserved_110', uint32_t, 440), ('reserved_111', uint32_t, 444), ('reserved_112', uint32_t, 448), ('reserved_113', uint32_t, 452), ('reserved_114', uint32_t, 456), ('reserved_115', uint32_t, 460), ('reserved_116', uint32_t, 464), ('reserved_117', uint32_t, 468), ('reserved_118', uint32_t, 472), ('reserved_119', uint32_t, 476), ('reserved_120', uint32_t, 480), ('reserved_121', uint32_t, 484), ('reserved_122', uint32_t, 488), ('reserved_123', uint32_t, 492), ('reserved_124', uint32_t, 496), ('reserved_125', uint32_t, 500), ('sdma_engine_id', uint32_t, 504), ('sdma_queue_id', uint32_t, 508)]) +@c.record +class struct_v12_compute_mqd(c.Struct): + SIZE = 2048 + header: int + compute_dispatch_initiator: int + compute_dim_x: int + compute_dim_y: int + compute_dim_z: int + compute_start_x: int + compute_start_y: int + compute_start_z: int + compute_num_thread_x: int + compute_num_thread_y: int + compute_num_thread_z: int + compute_pipelinestat_enable: int + compute_perfcount_enable: int + compute_pgm_lo: int + compute_pgm_hi: int + compute_dispatch_pkt_addr_lo: int + compute_dispatch_pkt_addr_hi: int + compute_dispatch_scratch_base_lo: int + compute_dispatch_scratch_base_hi: int + compute_pgm_rsrc1: int + compute_pgm_rsrc2: int + compute_vmid: int + compute_resource_limits: int + compute_static_thread_mgmt_se0: int + compute_static_thread_mgmt_se1: int + compute_tmpring_size: int + compute_static_thread_mgmt_se2: int + compute_static_thread_mgmt_se3: int + compute_restart_x: int + compute_restart_y: int + compute_restart_z: int + compute_thread_trace_enable: int + compute_misc_reserved: int + compute_dispatch_id: int + compute_threadgroup_id: int + compute_req_ctrl: int + reserved_36: int + compute_user_accum_0: int + compute_user_accum_1: int + compute_user_accum_2: int + compute_user_accum_3: int + compute_pgm_rsrc3: int + compute_ddid_index: int + compute_shader_chksum: int + compute_static_thread_mgmt_se4: int + compute_static_thread_mgmt_se5: int + compute_static_thread_mgmt_se6: int + compute_static_thread_mgmt_se7: int + compute_dispatch_interleave: int + compute_relaunch: int + compute_wave_restore_addr_lo: int + compute_wave_restore_addr_hi: int + compute_wave_restore_control: int + reserved_53: int + reserved_54: int + reserved_55: int + reserved_56: int + reserved_57: int + reserved_58: int + compute_static_thread_mgmt_se8: int + reserved_60: int + reserved_61: int + reserved_62: int + reserved_63: int + reserved_64: int + compute_user_data_0: int + compute_user_data_1: int + compute_user_data_2: int + compute_user_data_3: int + compute_user_data_4: int + compute_user_data_5: int + compute_user_data_6: int + compute_user_data_7: int + compute_user_data_8: int + compute_user_data_9: int + compute_user_data_10: int + compute_user_data_11: int + compute_user_data_12: int + compute_user_data_13: int + compute_user_data_14: int + compute_user_data_15: int + cp_compute_csinvoc_count_lo: int + cp_compute_csinvoc_count_hi: int + reserved_83: int + reserved_84: int + reserved_85: int + cp_mqd_query_time_lo: int + cp_mqd_query_time_hi: int + cp_mqd_connect_start_time_lo: int + cp_mqd_connect_start_time_hi: int + cp_mqd_connect_end_time_lo: int + cp_mqd_connect_end_time_hi: int + cp_mqd_connect_end_wf_count: int + cp_mqd_connect_end_pq_rptr: int + cp_mqd_connect_end_pq_wptr: int + cp_mqd_connect_end_ib_rptr: int + cp_mqd_readindex_lo: int + cp_mqd_readindex_hi: int + cp_mqd_save_start_time_lo: int + cp_mqd_save_start_time_hi: int + cp_mqd_save_end_time_lo: int + cp_mqd_save_end_time_hi: int + cp_mqd_restore_start_time_lo: int + cp_mqd_restore_start_time_hi: int + cp_mqd_restore_end_time_lo: int + cp_mqd_restore_end_time_hi: int + disable_queue: int + reserved_107: int + reserved_108: int + reserved_109: int + reserved_110: int + reserved_111: int + reserved_112: int + reserved_113: int + cp_pq_exe_status_lo: int + cp_pq_exe_status_hi: int + cp_packet_id_lo: int + cp_packet_id_hi: int + cp_packet_exe_status_lo: int + cp_packet_exe_status_hi: int + reserved_120: int + reserved_121: int + reserved_122: int + reserved_123: int + ctx_save_base_addr_lo: int + ctx_save_base_addr_hi: int + reserved_126: int + reserved_127: int + cp_mqd_base_addr_lo: int + cp_mqd_base_addr_hi: int + cp_hqd_active: int + cp_hqd_vmid: int + cp_hqd_persistent_state: int + cp_hqd_pipe_priority: int + cp_hqd_queue_priority: int + cp_hqd_quantum: int + cp_hqd_pq_base_lo: int + cp_hqd_pq_base_hi: int + cp_hqd_pq_rptr: int + cp_hqd_pq_rptr_report_addr_lo: int + cp_hqd_pq_rptr_report_addr_hi: int + cp_hqd_pq_wptr_poll_addr_lo: int + cp_hqd_pq_wptr_poll_addr_hi: int + cp_hqd_pq_doorbell_control: int + reserved_144: int + cp_hqd_pq_control: int + cp_hqd_ib_base_addr_lo: int + cp_hqd_ib_base_addr_hi: int + cp_hqd_ib_rptr: int + cp_hqd_ib_control: int + cp_hqd_iq_timer: int + cp_hqd_iq_rptr: int + cp_hqd_dequeue_request: int + cp_hqd_dma_offload: int + cp_hqd_sema_cmd: int + cp_hqd_msg_type: int + cp_hqd_atomic0_preop_lo: int + cp_hqd_atomic0_preop_hi: int + cp_hqd_atomic1_preop_lo: int + cp_hqd_atomic1_preop_hi: int + cp_hqd_hq_status0: int + cp_hqd_hq_control0: int + cp_mqd_control: int + cp_hqd_hq_status1: int + cp_hqd_hq_control1: int + cp_hqd_eop_base_addr_lo: int + cp_hqd_eop_base_addr_hi: int + cp_hqd_eop_control: int + cp_hqd_eop_rptr: int + cp_hqd_eop_wptr: int + cp_hqd_eop_done_events: int + cp_hqd_ctx_save_base_addr_lo: int + cp_hqd_ctx_save_base_addr_hi: int + cp_hqd_ctx_save_control: int + cp_hqd_cntl_stack_offset: int + cp_hqd_cntl_stack_size: int + cp_hqd_wg_state_offset: int + cp_hqd_ctx_save_size: int + reserved_178: int + cp_hqd_error: int + cp_hqd_eop_wptr_mem: int + cp_hqd_aql_control: int + cp_hqd_pq_wptr_lo: int + cp_hqd_pq_wptr_hi: int + reserved_184: int + reserved_185: int + reserved_186: int + reserved_187: int + reserved_188: int + reserved_189: int + reserved_190: int + reserved_191: int + iqtimer_pkt_header: int + iqtimer_pkt_dw0: int + iqtimer_pkt_dw1: int + iqtimer_pkt_dw2: int + iqtimer_pkt_dw3: int + iqtimer_pkt_dw4: int + iqtimer_pkt_dw5: int + iqtimer_pkt_dw6: int + iqtimer_pkt_dw7: int + iqtimer_pkt_dw8: int + iqtimer_pkt_dw9: int + iqtimer_pkt_dw10: int + iqtimer_pkt_dw11: int + iqtimer_pkt_dw12: int + iqtimer_pkt_dw13: int + iqtimer_pkt_dw14: int + iqtimer_pkt_dw15: int + iqtimer_pkt_dw16: int + iqtimer_pkt_dw17: int + iqtimer_pkt_dw18: int + iqtimer_pkt_dw19: int + iqtimer_pkt_dw20: int + iqtimer_pkt_dw21: int + iqtimer_pkt_dw22: int + iqtimer_pkt_dw23: int + iqtimer_pkt_dw24: int + iqtimer_pkt_dw25: int + iqtimer_pkt_dw26: int + iqtimer_pkt_dw27: int + iqtimer_pkt_dw28: int + iqtimer_pkt_dw29: int + iqtimer_pkt_dw30: int + iqtimer_pkt_dw31: int + reserved_225: int + reserved_226: int + reserved_227: int + set_resources_header: int + set_resources_dw1: int + set_resources_dw2: int + set_resources_dw3: int + set_resources_dw4: int + set_resources_dw5: int + set_resources_dw6: int + set_resources_dw7: int + reserved_236: int + reserved_237: int + reserved_238: int + reserved_239: int + queue_doorbell_id0: int + queue_doorbell_id1: int + queue_doorbell_id2: int + queue_doorbell_id3: int + queue_doorbell_id4: int + queue_doorbell_id5: int + queue_doorbell_id6: int + queue_doorbell_id7: int + queue_doorbell_id8: int + queue_doorbell_id9: int + queue_doorbell_id10: int + queue_doorbell_id11: int + queue_doorbell_id12: int + queue_doorbell_id13: int + queue_doorbell_id14: int + queue_doorbell_id15: int + control_buf_addr_lo: int + control_buf_addr_hi: int + control_buf_wptr_lo: int + control_buf_wptr_hi: int + control_buf_dptr_lo: int + control_buf_dptr_hi: int + control_buf_num_entries: int + draw_ring_addr_lo: int + draw_ring_addr_hi: int + reserved_265: int + reserved_266: int + reserved_267: int + reserved_268: int + reserved_269: int + reserved_270: int + reserved_271: int + dfwx_flags: int + dfwx_slot: int + dfwx_client_data_addr_lo: int + dfwx_client_data_addr_hi: int + reserved_276: int + reserved_277: int + reserved_278: int + reserved_279: int + reserved_280: int + reserved_281: int + reserved_282: int + reserved_283: int + reserved_284: int + reserved_285: int + reserved_286: int + reserved_287: int + reserved_288: int + reserved_289: int + reserved_290: int + reserved_291: int + reserved_292: int + reserved_293: int + reserved_294: int + reserved_295: int + reserved_296: int + reserved_297: int + reserved_298: int + reserved_299: int + reserved_300: int + reserved_301: int + reserved_302: int + reserved_303: int + reserved_304: int + reserved_305: int + reserved_306: int + reserved_307: int + reserved_308: int + reserved_309: int + reserved_310: int + reserved_311: int + reserved_312: int + reserved_313: int + reserved_314: int + reserved_315: int + reserved_316: int + reserved_317: int + reserved_318: int + reserved_319: int + reserved_320: int + reserved_321: int + reserved_322: int + reserved_323: int + reserved_324: int + reserved_325: int + reserved_326: int + reserved_327: int + reserved_328: int + reserved_329: int + reserved_330: int + reserved_331: int + reserved_332: int + reserved_333: int + reserved_334: int + reserved_335: int + reserved_336: int + reserved_337: int + reserved_338: int + reserved_339: int + reserved_340: int + reserved_341: int + reserved_342: int + reserved_343: int + reserved_344: int + reserved_345: int + reserved_346: int + reserved_347: int + reserved_348: int + reserved_349: int + reserved_350: int + reserved_351: int + reserved_352: int + reserved_353: int + reserved_354: int + reserved_355: int + reserved_356: int + reserved_357: int + reserved_358: int + reserved_359: int + reserved_360: int + reserved_361: int + reserved_362: int + reserved_363: int + reserved_364: int + reserved_365: int + reserved_366: int + reserved_367: int + reserved_368: int + reserved_369: int + reserved_370: int + reserved_371: int + reserved_372: int + reserved_373: int + reserved_374: int + reserved_375: int + reserved_376: int + reserved_377: int + reserved_378: int + reserved_379: int + reserved_380: int + reserved_381: int + reserved_382: int + reserved_383: int + reserved_384: int + reserved_385: int + reserved_386: int + reserved_387: int + reserved_388: int + reserved_389: int + reserved_390: int + reserved_391: int + reserved_392: int + reserved_393: int + reserved_394: int + reserved_395: int + reserved_396: int + reserved_397: int + reserved_398: int + reserved_399: int + reserved_400: int + reserved_401: int + reserved_402: int + reserved_403: int + reserved_404: int + reserved_405: int + reserved_406: int + reserved_407: int + reserved_408: int + reserved_409: int + reserved_410: int + reserved_411: int + reserved_412: int + reserved_413: int + reserved_414: int + reserved_415: int + reserved_416: int + reserved_417: int + reserved_418: int + reserved_419: int + reserved_420: int + reserved_421: int + reserved_422: int + reserved_423: int + reserved_424: int + reserved_425: int + reserved_426: int + reserved_427: int + reserved_428: int + reserved_429: int + reserved_430: int + reserved_431: int + reserved_432: int + reserved_433: int + reserved_434: int + reserved_435: int + reserved_436: int + reserved_437: int + reserved_438: int + reserved_439: int + reserved_440: int + reserved_441: int + reserved_442: int + reserved_443: int + reserved_444: int + reserved_445: int + reserved_446: int + reserved_447: int + gws_0_val: int + gws_1_val: int + gws_2_val: int + gws_3_val: int + gws_4_val: int + gws_5_val: int + gws_6_val: int + gws_7_val: int + gws_8_val: int + gws_9_val: int + gws_10_val: int + gws_11_val: int + gws_12_val: int + gws_13_val: int + gws_14_val: int + gws_15_val: int + gws_16_val: int + gws_17_val: int + gws_18_val: int + gws_19_val: int + gws_20_val: int + gws_21_val: int + gws_22_val: int + gws_23_val: int + gws_24_val: int + gws_25_val: int + gws_26_val: int + gws_27_val: int + gws_28_val: int + gws_29_val: int + gws_30_val: int + gws_31_val: int + gws_32_val: int + gws_33_val: int + gws_34_val: int + gws_35_val: int + gws_36_val: int + gws_37_val: int + gws_38_val: int + gws_39_val: int + gws_40_val: int + gws_41_val: int + gws_42_val: int + gws_43_val: int + gws_44_val: int + gws_45_val: int + gws_46_val: int + gws_47_val: int + gws_48_val: int + gws_49_val: int + gws_50_val: int + gws_51_val: int + gws_52_val: int + gws_53_val: int + gws_54_val: int + gws_55_val: int + gws_56_val: int + gws_57_val: int + gws_58_val: int + gws_59_val: int + gws_60_val: int + gws_61_val: int + gws_62_val: int + gws_63_val: int +struct_v12_compute_mqd.register_fields([('header', uint32_t, 0), ('compute_dispatch_initiator', uint32_t, 4), ('compute_dim_x', uint32_t, 8), ('compute_dim_y', uint32_t, 12), ('compute_dim_z', uint32_t, 16), ('compute_start_x', uint32_t, 20), ('compute_start_y', uint32_t, 24), ('compute_start_z', uint32_t, 28), ('compute_num_thread_x', uint32_t, 32), ('compute_num_thread_y', uint32_t, 36), ('compute_num_thread_z', uint32_t, 40), ('compute_pipelinestat_enable', uint32_t, 44), ('compute_perfcount_enable', uint32_t, 48), ('compute_pgm_lo', uint32_t, 52), ('compute_pgm_hi', uint32_t, 56), ('compute_dispatch_pkt_addr_lo', uint32_t, 60), ('compute_dispatch_pkt_addr_hi', uint32_t, 64), ('compute_dispatch_scratch_base_lo', uint32_t, 68), ('compute_dispatch_scratch_base_hi', uint32_t, 72), ('compute_pgm_rsrc1', uint32_t, 76), ('compute_pgm_rsrc2', uint32_t, 80), ('compute_vmid', uint32_t, 84), ('compute_resource_limits', uint32_t, 88), ('compute_static_thread_mgmt_se0', uint32_t, 92), ('compute_static_thread_mgmt_se1', uint32_t, 96), ('compute_tmpring_size', uint32_t, 100), ('compute_static_thread_mgmt_se2', uint32_t, 104), ('compute_static_thread_mgmt_se3', uint32_t, 108), ('compute_restart_x', uint32_t, 112), ('compute_restart_y', uint32_t, 116), ('compute_restart_z', uint32_t, 120), ('compute_thread_trace_enable', uint32_t, 124), ('compute_misc_reserved', uint32_t, 128), ('compute_dispatch_id', uint32_t, 132), ('compute_threadgroup_id', uint32_t, 136), ('compute_req_ctrl', uint32_t, 140), ('reserved_36', uint32_t, 144), ('compute_user_accum_0', uint32_t, 148), ('compute_user_accum_1', uint32_t, 152), ('compute_user_accum_2', uint32_t, 156), ('compute_user_accum_3', uint32_t, 160), ('compute_pgm_rsrc3', uint32_t, 164), ('compute_ddid_index', uint32_t, 168), ('compute_shader_chksum', uint32_t, 172), ('compute_static_thread_mgmt_se4', uint32_t, 176), ('compute_static_thread_mgmt_se5', uint32_t, 180), ('compute_static_thread_mgmt_se6', uint32_t, 184), ('compute_static_thread_mgmt_se7', uint32_t, 188), ('compute_dispatch_interleave', uint32_t, 192), ('compute_relaunch', uint32_t, 196), ('compute_wave_restore_addr_lo', uint32_t, 200), ('compute_wave_restore_addr_hi', uint32_t, 204), ('compute_wave_restore_control', uint32_t, 208), ('reserved_53', uint32_t, 212), ('reserved_54', uint32_t, 216), ('reserved_55', uint32_t, 220), ('reserved_56', uint32_t, 224), ('reserved_57', uint32_t, 228), ('reserved_58', uint32_t, 232), ('compute_static_thread_mgmt_se8', uint32_t, 236), ('reserved_60', uint32_t, 240), ('reserved_61', uint32_t, 244), ('reserved_62', uint32_t, 248), ('reserved_63', uint32_t, 252), ('reserved_64', uint32_t, 256), ('compute_user_data_0', uint32_t, 260), ('compute_user_data_1', uint32_t, 264), ('compute_user_data_2', uint32_t, 268), ('compute_user_data_3', uint32_t, 272), ('compute_user_data_4', uint32_t, 276), ('compute_user_data_5', uint32_t, 280), ('compute_user_data_6', uint32_t, 284), ('compute_user_data_7', uint32_t, 288), ('compute_user_data_8', uint32_t, 292), ('compute_user_data_9', uint32_t, 296), ('compute_user_data_10', uint32_t, 300), ('compute_user_data_11', uint32_t, 304), ('compute_user_data_12', uint32_t, 308), ('compute_user_data_13', uint32_t, 312), ('compute_user_data_14', uint32_t, 316), ('compute_user_data_15', uint32_t, 320), ('cp_compute_csinvoc_count_lo', uint32_t, 324), ('cp_compute_csinvoc_count_hi', uint32_t, 328), ('reserved_83', uint32_t, 332), ('reserved_84', uint32_t, 336), ('reserved_85', uint32_t, 340), ('cp_mqd_query_time_lo', uint32_t, 344), ('cp_mqd_query_time_hi', uint32_t, 348), ('cp_mqd_connect_start_time_lo', uint32_t, 352), ('cp_mqd_connect_start_time_hi', uint32_t, 356), ('cp_mqd_connect_end_time_lo', uint32_t, 360), ('cp_mqd_connect_end_time_hi', uint32_t, 364), ('cp_mqd_connect_end_wf_count', uint32_t, 368), ('cp_mqd_connect_end_pq_rptr', uint32_t, 372), ('cp_mqd_connect_end_pq_wptr', uint32_t, 376), ('cp_mqd_connect_end_ib_rptr', uint32_t, 380), ('cp_mqd_readindex_lo', uint32_t, 384), ('cp_mqd_readindex_hi', uint32_t, 388), ('cp_mqd_save_start_time_lo', uint32_t, 392), ('cp_mqd_save_start_time_hi', uint32_t, 396), ('cp_mqd_save_end_time_lo', uint32_t, 400), ('cp_mqd_save_end_time_hi', uint32_t, 404), ('cp_mqd_restore_start_time_lo', uint32_t, 408), ('cp_mqd_restore_start_time_hi', uint32_t, 412), ('cp_mqd_restore_end_time_lo', uint32_t, 416), ('cp_mqd_restore_end_time_hi', uint32_t, 420), ('disable_queue', uint32_t, 424), ('reserved_107', uint32_t, 428), ('reserved_108', uint32_t, 432), ('reserved_109', uint32_t, 436), ('reserved_110', uint32_t, 440), ('reserved_111', uint32_t, 444), ('reserved_112', uint32_t, 448), ('reserved_113', uint32_t, 452), ('cp_pq_exe_status_lo', uint32_t, 456), ('cp_pq_exe_status_hi', uint32_t, 460), ('cp_packet_id_lo', uint32_t, 464), ('cp_packet_id_hi', uint32_t, 468), ('cp_packet_exe_status_lo', uint32_t, 472), ('cp_packet_exe_status_hi', uint32_t, 476), ('reserved_120', uint32_t, 480), ('reserved_121', uint32_t, 484), ('reserved_122', uint32_t, 488), ('reserved_123', uint32_t, 492), ('ctx_save_base_addr_lo', uint32_t, 496), ('ctx_save_base_addr_hi', uint32_t, 500), ('reserved_126', uint32_t, 504), ('reserved_127', uint32_t, 508), ('cp_mqd_base_addr_lo', uint32_t, 512), ('cp_mqd_base_addr_hi', uint32_t, 516), ('cp_hqd_active', uint32_t, 520), ('cp_hqd_vmid', uint32_t, 524), ('cp_hqd_persistent_state', uint32_t, 528), ('cp_hqd_pipe_priority', uint32_t, 532), ('cp_hqd_queue_priority', uint32_t, 536), ('cp_hqd_quantum', uint32_t, 540), ('cp_hqd_pq_base_lo', uint32_t, 544), ('cp_hqd_pq_base_hi', uint32_t, 548), ('cp_hqd_pq_rptr', uint32_t, 552), ('cp_hqd_pq_rptr_report_addr_lo', uint32_t, 556), ('cp_hqd_pq_rptr_report_addr_hi', uint32_t, 560), ('cp_hqd_pq_wptr_poll_addr_lo', uint32_t, 564), ('cp_hqd_pq_wptr_poll_addr_hi', uint32_t, 568), ('cp_hqd_pq_doorbell_control', uint32_t, 572), ('reserved_144', uint32_t, 576), ('cp_hqd_pq_control', uint32_t, 580), ('cp_hqd_ib_base_addr_lo', uint32_t, 584), ('cp_hqd_ib_base_addr_hi', uint32_t, 588), ('cp_hqd_ib_rptr', uint32_t, 592), ('cp_hqd_ib_control', uint32_t, 596), ('cp_hqd_iq_timer', uint32_t, 600), ('cp_hqd_iq_rptr', uint32_t, 604), ('cp_hqd_dequeue_request', uint32_t, 608), ('cp_hqd_dma_offload', uint32_t, 612), ('cp_hqd_sema_cmd', uint32_t, 616), ('cp_hqd_msg_type', uint32_t, 620), ('cp_hqd_atomic0_preop_lo', uint32_t, 624), ('cp_hqd_atomic0_preop_hi', uint32_t, 628), ('cp_hqd_atomic1_preop_lo', uint32_t, 632), ('cp_hqd_atomic1_preop_hi', uint32_t, 636), ('cp_hqd_hq_status0', uint32_t, 640), ('cp_hqd_hq_control0', uint32_t, 644), ('cp_mqd_control', uint32_t, 648), ('cp_hqd_hq_status1', uint32_t, 652), ('cp_hqd_hq_control1', uint32_t, 656), ('cp_hqd_eop_base_addr_lo', uint32_t, 660), ('cp_hqd_eop_base_addr_hi', uint32_t, 664), ('cp_hqd_eop_control', uint32_t, 668), ('cp_hqd_eop_rptr', uint32_t, 672), ('cp_hqd_eop_wptr', uint32_t, 676), ('cp_hqd_eop_done_events', uint32_t, 680), ('cp_hqd_ctx_save_base_addr_lo', uint32_t, 684), ('cp_hqd_ctx_save_base_addr_hi', uint32_t, 688), ('cp_hqd_ctx_save_control', uint32_t, 692), ('cp_hqd_cntl_stack_offset', uint32_t, 696), ('cp_hqd_cntl_stack_size', uint32_t, 700), ('cp_hqd_wg_state_offset', uint32_t, 704), ('cp_hqd_ctx_save_size', uint32_t, 708), ('reserved_178', uint32_t, 712), ('cp_hqd_error', uint32_t, 716), ('cp_hqd_eop_wptr_mem', uint32_t, 720), ('cp_hqd_aql_control', uint32_t, 724), ('cp_hqd_pq_wptr_lo', uint32_t, 728), ('cp_hqd_pq_wptr_hi', uint32_t, 732), ('reserved_184', uint32_t, 736), ('reserved_185', uint32_t, 740), ('reserved_186', uint32_t, 744), ('reserved_187', uint32_t, 748), ('reserved_188', uint32_t, 752), ('reserved_189', uint32_t, 756), ('reserved_190', uint32_t, 760), ('reserved_191', uint32_t, 764), ('iqtimer_pkt_header', uint32_t, 768), ('iqtimer_pkt_dw0', uint32_t, 772), ('iqtimer_pkt_dw1', uint32_t, 776), ('iqtimer_pkt_dw2', uint32_t, 780), ('iqtimer_pkt_dw3', uint32_t, 784), ('iqtimer_pkt_dw4', uint32_t, 788), ('iqtimer_pkt_dw5', uint32_t, 792), ('iqtimer_pkt_dw6', uint32_t, 796), ('iqtimer_pkt_dw7', uint32_t, 800), ('iqtimer_pkt_dw8', uint32_t, 804), ('iqtimer_pkt_dw9', uint32_t, 808), ('iqtimer_pkt_dw10', uint32_t, 812), ('iqtimer_pkt_dw11', uint32_t, 816), ('iqtimer_pkt_dw12', uint32_t, 820), ('iqtimer_pkt_dw13', uint32_t, 824), ('iqtimer_pkt_dw14', uint32_t, 828), ('iqtimer_pkt_dw15', uint32_t, 832), ('iqtimer_pkt_dw16', uint32_t, 836), ('iqtimer_pkt_dw17', uint32_t, 840), ('iqtimer_pkt_dw18', uint32_t, 844), ('iqtimer_pkt_dw19', uint32_t, 848), ('iqtimer_pkt_dw20', uint32_t, 852), ('iqtimer_pkt_dw21', uint32_t, 856), ('iqtimer_pkt_dw22', uint32_t, 860), ('iqtimer_pkt_dw23', uint32_t, 864), ('iqtimer_pkt_dw24', uint32_t, 868), ('iqtimer_pkt_dw25', uint32_t, 872), ('iqtimer_pkt_dw26', uint32_t, 876), ('iqtimer_pkt_dw27', uint32_t, 880), ('iqtimer_pkt_dw28', uint32_t, 884), ('iqtimer_pkt_dw29', uint32_t, 888), ('iqtimer_pkt_dw30', uint32_t, 892), ('iqtimer_pkt_dw31', uint32_t, 896), ('reserved_225', uint32_t, 900), ('reserved_226', uint32_t, 904), ('reserved_227', uint32_t, 908), ('set_resources_header', uint32_t, 912), ('set_resources_dw1', uint32_t, 916), ('set_resources_dw2', uint32_t, 920), ('set_resources_dw3', uint32_t, 924), ('set_resources_dw4', uint32_t, 928), ('set_resources_dw5', uint32_t, 932), ('set_resources_dw6', uint32_t, 936), ('set_resources_dw7', uint32_t, 940), ('reserved_236', uint32_t, 944), ('reserved_237', uint32_t, 948), ('reserved_238', uint32_t, 952), ('reserved_239', uint32_t, 956), ('queue_doorbell_id0', uint32_t, 960), ('queue_doorbell_id1', uint32_t, 964), ('queue_doorbell_id2', uint32_t, 968), ('queue_doorbell_id3', uint32_t, 972), ('queue_doorbell_id4', uint32_t, 976), ('queue_doorbell_id5', uint32_t, 980), ('queue_doorbell_id6', uint32_t, 984), ('queue_doorbell_id7', uint32_t, 988), ('queue_doorbell_id8', uint32_t, 992), ('queue_doorbell_id9', uint32_t, 996), ('queue_doorbell_id10', uint32_t, 1000), ('queue_doorbell_id11', uint32_t, 1004), ('queue_doorbell_id12', uint32_t, 1008), ('queue_doorbell_id13', uint32_t, 1012), ('queue_doorbell_id14', uint32_t, 1016), ('queue_doorbell_id15', uint32_t, 1020), ('control_buf_addr_lo', uint32_t, 1024), ('control_buf_addr_hi', uint32_t, 1028), ('control_buf_wptr_lo', uint32_t, 1032), ('control_buf_wptr_hi', uint32_t, 1036), ('control_buf_dptr_lo', uint32_t, 1040), ('control_buf_dptr_hi', uint32_t, 1044), ('control_buf_num_entries', uint32_t, 1048), ('draw_ring_addr_lo', uint32_t, 1052), ('draw_ring_addr_hi', uint32_t, 1056), ('reserved_265', uint32_t, 1060), ('reserved_266', uint32_t, 1064), ('reserved_267', uint32_t, 1068), ('reserved_268', uint32_t, 1072), ('reserved_269', uint32_t, 1076), ('reserved_270', uint32_t, 1080), ('reserved_271', uint32_t, 1084), ('dfwx_flags', uint32_t, 1088), ('dfwx_slot', uint32_t, 1092), ('dfwx_client_data_addr_lo', uint32_t, 1096), ('dfwx_client_data_addr_hi', uint32_t, 1100), ('reserved_276', uint32_t, 1104), ('reserved_277', uint32_t, 1108), ('reserved_278', uint32_t, 1112), ('reserved_279', uint32_t, 1116), ('reserved_280', uint32_t, 1120), ('reserved_281', uint32_t, 1124), ('reserved_282', uint32_t, 1128), ('reserved_283', uint32_t, 1132), ('reserved_284', uint32_t, 1136), ('reserved_285', uint32_t, 1140), ('reserved_286', uint32_t, 1144), ('reserved_287', uint32_t, 1148), ('reserved_288', uint32_t, 1152), ('reserved_289', uint32_t, 1156), ('reserved_290', uint32_t, 1160), ('reserved_291', uint32_t, 1164), ('reserved_292', uint32_t, 1168), ('reserved_293', uint32_t, 1172), ('reserved_294', uint32_t, 1176), ('reserved_295', uint32_t, 1180), ('reserved_296', uint32_t, 1184), ('reserved_297', uint32_t, 1188), ('reserved_298', uint32_t, 1192), ('reserved_299', uint32_t, 1196), ('reserved_300', uint32_t, 1200), ('reserved_301', uint32_t, 1204), ('reserved_302', uint32_t, 1208), ('reserved_303', uint32_t, 1212), ('reserved_304', uint32_t, 1216), ('reserved_305', uint32_t, 1220), ('reserved_306', uint32_t, 1224), ('reserved_307', uint32_t, 1228), ('reserved_308', uint32_t, 1232), ('reserved_309', uint32_t, 1236), ('reserved_310', uint32_t, 1240), ('reserved_311', uint32_t, 1244), ('reserved_312', uint32_t, 1248), ('reserved_313', uint32_t, 1252), ('reserved_314', uint32_t, 1256), ('reserved_315', uint32_t, 1260), ('reserved_316', uint32_t, 1264), ('reserved_317', uint32_t, 1268), ('reserved_318', uint32_t, 1272), ('reserved_319', uint32_t, 1276), ('reserved_320', uint32_t, 1280), ('reserved_321', uint32_t, 1284), ('reserved_322', uint32_t, 1288), ('reserved_323', uint32_t, 1292), ('reserved_324', uint32_t, 1296), ('reserved_325', uint32_t, 1300), ('reserved_326', uint32_t, 1304), ('reserved_327', uint32_t, 1308), ('reserved_328', uint32_t, 1312), ('reserved_329', uint32_t, 1316), ('reserved_330', uint32_t, 1320), ('reserved_331', uint32_t, 1324), ('reserved_332', uint32_t, 1328), ('reserved_333', uint32_t, 1332), ('reserved_334', uint32_t, 1336), ('reserved_335', uint32_t, 1340), ('reserved_336', uint32_t, 1344), ('reserved_337', uint32_t, 1348), ('reserved_338', uint32_t, 1352), ('reserved_339', uint32_t, 1356), ('reserved_340', uint32_t, 1360), ('reserved_341', uint32_t, 1364), ('reserved_342', uint32_t, 1368), ('reserved_343', uint32_t, 1372), ('reserved_344', uint32_t, 1376), ('reserved_345', uint32_t, 1380), ('reserved_346', uint32_t, 1384), ('reserved_347', uint32_t, 1388), ('reserved_348', uint32_t, 1392), ('reserved_349', uint32_t, 1396), ('reserved_350', uint32_t, 1400), ('reserved_351', uint32_t, 1404), ('reserved_352', uint32_t, 1408), ('reserved_353', uint32_t, 1412), ('reserved_354', uint32_t, 1416), ('reserved_355', uint32_t, 1420), ('reserved_356', uint32_t, 1424), ('reserved_357', uint32_t, 1428), ('reserved_358', uint32_t, 1432), ('reserved_359', uint32_t, 1436), ('reserved_360', uint32_t, 1440), ('reserved_361', uint32_t, 1444), ('reserved_362', uint32_t, 1448), ('reserved_363', uint32_t, 1452), ('reserved_364', uint32_t, 1456), ('reserved_365', uint32_t, 1460), ('reserved_366', uint32_t, 1464), ('reserved_367', uint32_t, 1468), ('reserved_368', uint32_t, 1472), ('reserved_369', uint32_t, 1476), ('reserved_370', uint32_t, 1480), ('reserved_371', uint32_t, 1484), ('reserved_372', uint32_t, 1488), ('reserved_373', uint32_t, 1492), ('reserved_374', uint32_t, 1496), ('reserved_375', uint32_t, 1500), ('reserved_376', uint32_t, 1504), ('reserved_377', uint32_t, 1508), ('reserved_378', uint32_t, 1512), ('reserved_379', uint32_t, 1516), ('reserved_380', uint32_t, 1520), ('reserved_381', uint32_t, 1524), ('reserved_382', uint32_t, 1528), ('reserved_383', uint32_t, 1532), ('reserved_384', uint32_t, 1536), ('reserved_385', uint32_t, 1540), ('reserved_386', uint32_t, 1544), ('reserved_387', uint32_t, 1548), ('reserved_388', uint32_t, 1552), ('reserved_389', uint32_t, 1556), ('reserved_390', uint32_t, 1560), ('reserved_391', uint32_t, 1564), ('reserved_392', uint32_t, 1568), ('reserved_393', uint32_t, 1572), ('reserved_394', uint32_t, 1576), ('reserved_395', uint32_t, 1580), ('reserved_396', uint32_t, 1584), ('reserved_397', uint32_t, 1588), ('reserved_398', uint32_t, 1592), ('reserved_399', uint32_t, 1596), ('reserved_400', uint32_t, 1600), ('reserved_401', uint32_t, 1604), ('reserved_402', uint32_t, 1608), ('reserved_403', uint32_t, 1612), ('reserved_404', uint32_t, 1616), ('reserved_405', uint32_t, 1620), ('reserved_406', uint32_t, 1624), ('reserved_407', uint32_t, 1628), ('reserved_408', uint32_t, 1632), ('reserved_409', uint32_t, 1636), ('reserved_410', uint32_t, 1640), ('reserved_411', uint32_t, 1644), ('reserved_412', uint32_t, 1648), ('reserved_413', uint32_t, 1652), ('reserved_414', uint32_t, 1656), ('reserved_415', uint32_t, 1660), ('reserved_416', uint32_t, 1664), ('reserved_417', uint32_t, 1668), ('reserved_418', uint32_t, 1672), ('reserved_419', uint32_t, 1676), ('reserved_420', uint32_t, 1680), ('reserved_421', uint32_t, 1684), ('reserved_422', uint32_t, 1688), ('reserved_423', uint32_t, 1692), ('reserved_424', uint32_t, 1696), ('reserved_425', uint32_t, 1700), ('reserved_426', uint32_t, 1704), ('reserved_427', uint32_t, 1708), ('reserved_428', uint32_t, 1712), ('reserved_429', uint32_t, 1716), ('reserved_430', uint32_t, 1720), ('reserved_431', uint32_t, 1724), ('reserved_432', uint32_t, 1728), ('reserved_433', uint32_t, 1732), ('reserved_434', uint32_t, 1736), ('reserved_435', uint32_t, 1740), ('reserved_436', uint32_t, 1744), ('reserved_437', uint32_t, 1748), ('reserved_438', uint32_t, 1752), ('reserved_439', uint32_t, 1756), ('reserved_440', uint32_t, 1760), ('reserved_441', uint32_t, 1764), ('reserved_442', uint32_t, 1768), ('reserved_443', uint32_t, 1772), ('reserved_444', uint32_t, 1776), ('reserved_445', uint32_t, 1780), ('reserved_446', uint32_t, 1784), ('reserved_447', uint32_t, 1788), ('gws_0_val', uint32_t, 1792), ('gws_1_val', uint32_t, 1796), ('gws_2_val', uint32_t, 1800), ('gws_3_val', uint32_t, 1804), ('gws_4_val', uint32_t, 1808), ('gws_5_val', uint32_t, 1812), ('gws_6_val', uint32_t, 1816), ('gws_7_val', uint32_t, 1820), ('gws_8_val', uint32_t, 1824), ('gws_9_val', uint32_t, 1828), ('gws_10_val', uint32_t, 1832), ('gws_11_val', uint32_t, 1836), ('gws_12_val', uint32_t, 1840), ('gws_13_val', uint32_t, 1844), ('gws_14_val', uint32_t, 1848), ('gws_15_val', uint32_t, 1852), ('gws_16_val', uint32_t, 1856), ('gws_17_val', uint32_t, 1860), ('gws_18_val', uint32_t, 1864), ('gws_19_val', uint32_t, 1868), ('gws_20_val', uint32_t, 1872), ('gws_21_val', uint32_t, 1876), ('gws_22_val', uint32_t, 1880), ('gws_23_val', uint32_t, 1884), ('gws_24_val', uint32_t, 1888), ('gws_25_val', uint32_t, 1892), ('gws_26_val', uint32_t, 1896), ('gws_27_val', uint32_t, 1900), ('gws_28_val', uint32_t, 1904), ('gws_29_val', uint32_t, 1908), ('gws_30_val', uint32_t, 1912), ('gws_31_val', uint32_t, 1916), ('gws_32_val', uint32_t, 1920), ('gws_33_val', uint32_t, 1924), ('gws_34_val', uint32_t, 1928), ('gws_35_val', uint32_t, 1932), ('gws_36_val', uint32_t, 1936), ('gws_37_val', uint32_t, 1940), ('gws_38_val', uint32_t, 1944), ('gws_39_val', uint32_t, 1948), ('gws_40_val', uint32_t, 1952), ('gws_41_val', uint32_t, 1956), ('gws_42_val', uint32_t, 1960), ('gws_43_val', uint32_t, 1964), ('gws_44_val', uint32_t, 1968), ('gws_45_val', uint32_t, 1972), ('gws_46_val', uint32_t, 1976), ('gws_47_val', uint32_t, 1980), ('gws_48_val', uint32_t, 1984), ('gws_49_val', uint32_t, 1988), ('gws_50_val', uint32_t, 1992), ('gws_51_val', uint32_t, 1996), ('gws_52_val', uint32_t, 2000), ('gws_53_val', uint32_t, 2004), ('gws_54_val', uint32_t, 2008), ('gws_55_val', uint32_t, 2012), ('gws_56_val', uint32_t, 2016), ('gws_57_val', uint32_t, 2020), ('gws_58_val', uint32_t, 2024), ('gws_59_val', uint32_t, 2028), ('gws_60_val', uint32_t, 2032), ('gws_61_val', uint32_t, 2036), ('gws_62_val', uint32_t, 2040), ('gws_63_val', uint32_t, 2044)]) +enum_amdgpu_vm_level: dict[int, str] = {(AMDGPU_VM_PDB2:=0): 'AMDGPU_VM_PDB2', (AMDGPU_VM_PDB1:=1): 'AMDGPU_VM_PDB1', (AMDGPU_VM_PDB0:=2): 'AMDGPU_VM_PDB0', (AMDGPU_VM_PTB:=3): 'AMDGPU_VM_PTB'} +table: dict[int, str] = {(IP_DISCOVERY:=0): 'IP_DISCOVERY', (GC:=1): 'GC', (HARVEST_INFO:=2): 'HARVEST_INFO', (VCN_INFO:=3): 'VCN_INFO', (MALL_INFO:=4): 'MALL_INFO', (NPS_INFO:=5): 'NPS_INFO', (TOTAL_TABLES:=6): 'TOTAL_TABLES'} +@c.record +class struct_table_info(c.Struct): + SIZE = 8 + offset: int + checksum: int + size: int + padding: int +uint16_t: TypeAlias = ctypes.c_uint16 +struct_table_info.register_fields([('offset', uint16_t, 0), ('checksum', uint16_t, 2), ('size', uint16_t, 4), ('padding', uint16_t, 6)]) +table_info: TypeAlias = struct_table_info +@c.record +class struct_binary_header(c.Struct): + SIZE = 60 + binary_signature: int + version_major: int + version_minor: int + binary_checksum: int + binary_size: int + table_list: c.Array[struct_table_info, Literal[6]] +struct_binary_header.register_fields([('binary_signature', uint32_t, 0), ('version_major', uint16_t, 4), ('version_minor', uint16_t, 6), ('binary_checksum', uint16_t, 8), ('binary_size', uint16_t, 10), ('table_list', c.Array[table_info, Literal[6]], 12)]) +binary_header: TypeAlias = struct_binary_header +@c.record +class struct_die_info(c.Struct): + SIZE = 4 + die_id: int + die_offset: int +struct_die_info.register_fields([('die_id', uint16_t, 0), ('die_offset', uint16_t, 2)]) +die_info: TypeAlias = struct_die_info +@c.record +class struct_ip_discovery_header(c.Struct): + SIZE = 80 + signature: int + version: int + size: int + id: int + num_dies: int + die_info: c.Array[struct_die_info, Literal[16]] + padding: c.Array[ctypes.c_uint16, Literal[1]] + base_addr_64_bit: int + reserved: int + reserved2: int +uint8_t: TypeAlias = ctypes.c_ubyte +struct_ip_discovery_header.register_fields([('signature', uint32_t, 0), ('version', uint16_t, 4), ('size', uint16_t, 6), ('id', uint32_t, 8), ('num_dies', uint16_t, 12), ('die_info', c.Array[die_info, Literal[16]], 14), ('padding', c.Array[uint16_t, Literal[1]], 78), ('base_addr_64_bit', uint8_t, 78, 1, 0), ('reserved', uint8_t, 78, 7, 1), ('reserved2', uint8_t, 79)]) +ip_discovery_header: TypeAlias = struct_ip_discovery_header +@c.record +class struct_ip(c.Struct): + SIZE = 8 + hw_id: int + number_instance: int + num_base_address: int + major: int + minor: int + revision: int + harvest: int + reserved: int + base_address: c.Array[ctypes.c_uint32, Literal[0]] +struct_ip.register_fields([('hw_id', uint16_t, 0), ('number_instance', uint8_t, 2), ('num_base_address', uint8_t, 3), ('major', uint8_t, 4), ('minor', uint8_t, 5), ('revision', uint8_t, 6), ('harvest', uint8_t, 7, 4, 0), ('reserved', uint8_t, 7, 4, 4), ('base_address', c.Array[uint32_t, Literal[0]], 8)]) +ip: TypeAlias = struct_ip +@c.record +class struct_ip_v3(c.Struct): + SIZE = 8 + hw_id: int + instance_number: int + num_base_address: int + major: int + minor: int + revision: int + sub_revision: int + variant: int + base_address: c.Array[ctypes.c_uint32, Literal[0]] +struct_ip_v3.register_fields([('hw_id', uint16_t, 0), ('instance_number', uint8_t, 2), ('num_base_address', uint8_t, 3), ('major', uint8_t, 4), ('minor', uint8_t, 5), ('revision', uint8_t, 6), ('sub_revision', uint8_t, 7, 4, 0), ('variant', uint8_t, 7, 4, 4), ('base_address', c.Array[uint32_t, Literal[0]], 8)]) +ip_v3: TypeAlias = struct_ip_v3 +@c.record +class struct_ip_v4(c.Struct): + SIZE = 7 + hw_id: int + instance_number: int + num_base_address: int + major: int + minor: int + revision: int +struct_ip_v4.register_fields([('hw_id', uint16_t, 0), ('instance_number', uint8_t, 2), ('num_base_address', uint8_t, 3), ('major', uint8_t, 4), ('minor', uint8_t, 5), ('revision', uint8_t, 6)]) +ip_v4: TypeAlias = struct_ip_v4 +@c.record +class struct_die_header(c.Struct): + SIZE = 4 + die_id: int + num_ips: int +struct_die_header.register_fields([('die_id', uint16_t, 0), ('num_ips', uint16_t, 2)]) +die_header: TypeAlias = struct_die_header +@c.record +class struct_ip_structure(c.Struct): + SIZE = 24 + header: c.POINTER[struct_ip_discovery_header] + die: struct_die +@c.record +class struct_die(c.Struct): + SIZE = 16 + die_header: c.POINTER[struct_die_header] + ip_list: c.POINTER[struct_ip] + ip_v3_list: c.POINTER[struct_ip_v3] + ip_v4_list: c.POINTER[struct_ip_v4] +struct_die.register_fields([('die_header', c.POINTER[die_header], 0), ('ip_list', c.POINTER[ip], 8), ('ip_v3_list', c.POINTER[ip_v3], 8), ('ip_v4_list', c.POINTER[ip_v4], 8)]) +struct_ip_structure.register_fields([('header', c.POINTER[ip_discovery_header], 0), ('die', struct_die, 8)]) +ip_structure: TypeAlias = struct_ip_structure +@c.record +class struct_gpu_info_header(c.Struct): + SIZE = 12 + table_id: int + version_major: int + version_minor: int + size: int +struct_gpu_info_header.register_fields([('table_id', uint32_t, 0), ('version_major', uint16_t, 4), ('version_minor', uint16_t, 6), ('size', uint32_t, 8)]) +@c.record +class struct_gc_info_v1_0(c.Struct): + SIZE = 88 + header: struct_gpu_info_header + gc_num_se: int + gc_num_wgp0_per_sa: int + gc_num_wgp1_per_sa: int + gc_num_rb_per_se: int + gc_num_gl2c: int + gc_num_gprs: int + gc_num_max_gs_thds: int + gc_gs_table_depth: int + gc_gsprim_buff_depth: int + gc_parameter_cache_depth: int + gc_double_offchip_lds_buffer: int + gc_wave_size: int + gc_max_waves_per_simd: int + gc_max_scratch_slots_per_cu: int + gc_lds_size: int + gc_num_sc_per_se: int + gc_num_sa_per_se: int + gc_num_packer_per_sc: int + gc_num_gl2a: int +struct_gc_info_v1_0.register_fields([('header', struct_gpu_info_header, 0), ('gc_num_se', uint32_t, 12), ('gc_num_wgp0_per_sa', uint32_t, 16), ('gc_num_wgp1_per_sa', uint32_t, 20), ('gc_num_rb_per_se', uint32_t, 24), ('gc_num_gl2c', uint32_t, 28), ('gc_num_gprs', uint32_t, 32), ('gc_num_max_gs_thds', uint32_t, 36), ('gc_gs_table_depth', uint32_t, 40), ('gc_gsprim_buff_depth', uint32_t, 44), ('gc_parameter_cache_depth', uint32_t, 48), ('gc_double_offchip_lds_buffer', uint32_t, 52), ('gc_wave_size', uint32_t, 56), ('gc_max_waves_per_simd', uint32_t, 60), ('gc_max_scratch_slots_per_cu', uint32_t, 64), ('gc_lds_size', uint32_t, 68), ('gc_num_sc_per_se', uint32_t, 72), ('gc_num_sa_per_se', uint32_t, 76), ('gc_num_packer_per_sc', uint32_t, 80), ('gc_num_gl2a', uint32_t, 84)]) +@c.record +class struct_gc_info_v1_1(c.Struct): + SIZE = 100 + header: struct_gpu_info_header + gc_num_se: int + gc_num_wgp0_per_sa: int + gc_num_wgp1_per_sa: int + gc_num_rb_per_se: int + gc_num_gl2c: int + gc_num_gprs: int + gc_num_max_gs_thds: int + gc_gs_table_depth: int + gc_gsprim_buff_depth: int + gc_parameter_cache_depth: int + gc_double_offchip_lds_buffer: int + gc_wave_size: int + gc_max_waves_per_simd: int + gc_max_scratch_slots_per_cu: int + gc_lds_size: int + gc_num_sc_per_se: int + gc_num_sa_per_se: int + gc_num_packer_per_sc: int + gc_num_gl2a: int + gc_num_tcp_per_sa: int + gc_num_sdp_interface: int + gc_num_tcps: int +struct_gc_info_v1_1.register_fields([('header', struct_gpu_info_header, 0), ('gc_num_se', uint32_t, 12), ('gc_num_wgp0_per_sa', uint32_t, 16), ('gc_num_wgp1_per_sa', uint32_t, 20), ('gc_num_rb_per_se', uint32_t, 24), ('gc_num_gl2c', uint32_t, 28), ('gc_num_gprs', uint32_t, 32), ('gc_num_max_gs_thds', uint32_t, 36), ('gc_gs_table_depth', uint32_t, 40), ('gc_gsprim_buff_depth', uint32_t, 44), ('gc_parameter_cache_depth', uint32_t, 48), ('gc_double_offchip_lds_buffer', uint32_t, 52), ('gc_wave_size', uint32_t, 56), ('gc_max_waves_per_simd', uint32_t, 60), ('gc_max_scratch_slots_per_cu', uint32_t, 64), ('gc_lds_size', uint32_t, 68), ('gc_num_sc_per_se', uint32_t, 72), ('gc_num_sa_per_se', uint32_t, 76), ('gc_num_packer_per_sc', uint32_t, 80), ('gc_num_gl2a', uint32_t, 84), ('gc_num_tcp_per_sa', uint32_t, 88), ('gc_num_sdp_interface', uint32_t, 92), ('gc_num_tcps', uint32_t, 96)]) +@c.record +class struct_gc_info_v1_2(c.Struct): + SIZE = 132 + header: struct_gpu_info_header + gc_num_se: int + gc_num_wgp0_per_sa: int + gc_num_wgp1_per_sa: int + gc_num_rb_per_se: int + gc_num_gl2c: int + gc_num_gprs: int + gc_num_max_gs_thds: int + gc_gs_table_depth: int + gc_gsprim_buff_depth: int + gc_parameter_cache_depth: int + gc_double_offchip_lds_buffer: int + gc_wave_size: int + gc_max_waves_per_simd: int + gc_max_scratch_slots_per_cu: int + gc_lds_size: int + gc_num_sc_per_se: int + gc_num_sa_per_se: int + gc_num_packer_per_sc: int + gc_num_gl2a: int + gc_num_tcp_per_sa: int + gc_num_sdp_interface: int + gc_num_tcps: int + gc_num_tcp_per_wpg: int + gc_tcp_l1_size: int + gc_num_sqc_per_wgp: int + gc_l1_instruction_cache_size_per_sqc: int + gc_l1_data_cache_size_per_sqc: int + gc_gl1c_per_sa: int + gc_gl1c_size_per_instance: int + gc_gl2c_per_gpu: int +struct_gc_info_v1_2.register_fields([('header', struct_gpu_info_header, 0), ('gc_num_se', uint32_t, 12), ('gc_num_wgp0_per_sa', uint32_t, 16), ('gc_num_wgp1_per_sa', uint32_t, 20), ('gc_num_rb_per_se', uint32_t, 24), ('gc_num_gl2c', uint32_t, 28), ('gc_num_gprs', uint32_t, 32), ('gc_num_max_gs_thds', uint32_t, 36), ('gc_gs_table_depth', uint32_t, 40), ('gc_gsprim_buff_depth', uint32_t, 44), ('gc_parameter_cache_depth', uint32_t, 48), ('gc_double_offchip_lds_buffer', uint32_t, 52), ('gc_wave_size', uint32_t, 56), ('gc_max_waves_per_simd', uint32_t, 60), ('gc_max_scratch_slots_per_cu', uint32_t, 64), ('gc_lds_size', uint32_t, 68), ('gc_num_sc_per_se', uint32_t, 72), ('gc_num_sa_per_se', uint32_t, 76), ('gc_num_packer_per_sc', uint32_t, 80), ('gc_num_gl2a', uint32_t, 84), ('gc_num_tcp_per_sa', uint32_t, 88), ('gc_num_sdp_interface', uint32_t, 92), ('gc_num_tcps', uint32_t, 96), ('gc_num_tcp_per_wpg', uint32_t, 100), ('gc_tcp_l1_size', uint32_t, 104), ('gc_num_sqc_per_wgp', uint32_t, 108), ('gc_l1_instruction_cache_size_per_sqc', uint32_t, 112), ('gc_l1_data_cache_size_per_sqc', uint32_t, 116), ('gc_gl1c_per_sa', uint32_t, 120), ('gc_gl1c_size_per_instance', uint32_t, 124), ('gc_gl2c_per_gpu', uint32_t, 128)]) +@c.record +class struct_gc_info_v1_3(c.Struct): + SIZE = 164 + header: struct_gpu_info_header + gc_num_se: int + gc_num_wgp0_per_sa: int + gc_num_wgp1_per_sa: int + gc_num_rb_per_se: int + gc_num_gl2c: int + gc_num_gprs: int + gc_num_max_gs_thds: int + gc_gs_table_depth: int + gc_gsprim_buff_depth: int + gc_parameter_cache_depth: int + gc_double_offchip_lds_buffer: int + gc_wave_size: int + gc_max_waves_per_simd: int + gc_max_scratch_slots_per_cu: int + gc_lds_size: int + gc_num_sc_per_se: int + gc_num_sa_per_se: int + gc_num_packer_per_sc: int + gc_num_gl2a: int + gc_num_tcp_per_sa: int + gc_num_sdp_interface: int + gc_num_tcps: int + gc_num_tcp_per_wpg: int + gc_tcp_l1_size: int + gc_num_sqc_per_wgp: int + gc_l1_instruction_cache_size_per_sqc: int + gc_l1_data_cache_size_per_sqc: int + gc_gl1c_per_sa: int + gc_gl1c_size_per_instance: int + gc_gl2c_per_gpu: int + gc_tcp_size_per_cu: int + gc_tcp_cache_line_size: int + gc_instruction_cache_size_per_sqc: int + gc_instruction_cache_line_size: int + gc_scalar_data_cache_size_per_sqc: int + gc_scalar_data_cache_line_size: int + gc_tcc_size: int + gc_tcc_cache_line_size: int +struct_gc_info_v1_3.register_fields([('header', struct_gpu_info_header, 0), ('gc_num_se', uint32_t, 12), ('gc_num_wgp0_per_sa', uint32_t, 16), ('gc_num_wgp1_per_sa', uint32_t, 20), ('gc_num_rb_per_se', uint32_t, 24), ('gc_num_gl2c', uint32_t, 28), ('gc_num_gprs', uint32_t, 32), ('gc_num_max_gs_thds', uint32_t, 36), ('gc_gs_table_depth', uint32_t, 40), ('gc_gsprim_buff_depth', uint32_t, 44), ('gc_parameter_cache_depth', uint32_t, 48), ('gc_double_offchip_lds_buffer', uint32_t, 52), ('gc_wave_size', uint32_t, 56), ('gc_max_waves_per_simd', uint32_t, 60), ('gc_max_scratch_slots_per_cu', uint32_t, 64), ('gc_lds_size', uint32_t, 68), ('gc_num_sc_per_se', uint32_t, 72), ('gc_num_sa_per_se', uint32_t, 76), ('gc_num_packer_per_sc', uint32_t, 80), ('gc_num_gl2a', uint32_t, 84), ('gc_num_tcp_per_sa', uint32_t, 88), ('gc_num_sdp_interface', uint32_t, 92), ('gc_num_tcps', uint32_t, 96), ('gc_num_tcp_per_wpg', uint32_t, 100), ('gc_tcp_l1_size', uint32_t, 104), ('gc_num_sqc_per_wgp', uint32_t, 108), ('gc_l1_instruction_cache_size_per_sqc', uint32_t, 112), ('gc_l1_data_cache_size_per_sqc', uint32_t, 116), ('gc_gl1c_per_sa', uint32_t, 120), ('gc_gl1c_size_per_instance', uint32_t, 124), ('gc_gl2c_per_gpu', uint32_t, 128), ('gc_tcp_size_per_cu', uint32_t, 132), ('gc_tcp_cache_line_size', uint32_t, 136), ('gc_instruction_cache_size_per_sqc', uint32_t, 140), ('gc_instruction_cache_line_size', uint32_t, 144), ('gc_scalar_data_cache_size_per_sqc', uint32_t, 148), ('gc_scalar_data_cache_line_size', uint32_t, 152), ('gc_tcc_size', uint32_t, 156), ('gc_tcc_cache_line_size', uint32_t, 160)]) +@c.record +class struct_gc_info_v2_0(c.Struct): + SIZE = 80 + header: struct_gpu_info_header + gc_num_se: int + gc_num_cu_per_sh: int + gc_num_sh_per_se: int + gc_num_rb_per_se: int + gc_num_tccs: int + gc_num_gprs: int + gc_num_max_gs_thds: int + gc_gs_table_depth: int + gc_gsprim_buff_depth: int + gc_parameter_cache_depth: int + gc_double_offchip_lds_buffer: int + gc_wave_size: int + gc_max_waves_per_simd: int + gc_max_scratch_slots_per_cu: int + gc_lds_size: int + gc_num_sc_per_se: int + gc_num_packer_per_sc: int +struct_gc_info_v2_0.register_fields([('header', struct_gpu_info_header, 0), ('gc_num_se', uint32_t, 12), ('gc_num_cu_per_sh', uint32_t, 16), ('gc_num_sh_per_se', uint32_t, 20), ('gc_num_rb_per_se', uint32_t, 24), ('gc_num_tccs', uint32_t, 28), ('gc_num_gprs', uint32_t, 32), ('gc_num_max_gs_thds', uint32_t, 36), ('gc_gs_table_depth', uint32_t, 40), ('gc_gsprim_buff_depth', uint32_t, 44), ('gc_parameter_cache_depth', uint32_t, 48), ('gc_double_offchip_lds_buffer', uint32_t, 52), ('gc_wave_size', uint32_t, 56), ('gc_max_waves_per_simd', uint32_t, 60), ('gc_max_scratch_slots_per_cu', uint32_t, 64), ('gc_lds_size', uint32_t, 68), ('gc_num_sc_per_se', uint32_t, 72), ('gc_num_packer_per_sc', uint32_t, 76)]) +@c.record +class struct_gc_info_v2_1(c.Struct): + SIZE = 108 + header: struct_gpu_info_header + gc_num_se: int + gc_num_cu_per_sh: int + gc_num_sh_per_se: int + gc_num_rb_per_se: int + gc_num_tccs: int + gc_num_gprs: int + gc_num_max_gs_thds: int + gc_gs_table_depth: int + gc_gsprim_buff_depth: int + gc_parameter_cache_depth: int + gc_double_offchip_lds_buffer: int + gc_wave_size: int + gc_max_waves_per_simd: int + gc_max_scratch_slots_per_cu: int + gc_lds_size: int + gc_num_sc_per_se: int + gc_num_packer_per_sc: int + gc_num_tcp_per_sh: int + gc_tcp_size_per_cu: int + gc_num_sdp_interface: int + gc_num_cu_per_sqc: int + gc_instruction_cache_size_per_sqc: int + gc_scalar_data_cache_size_per_sqc: int + gc_tcc_size: int +struct_gc_info_v2_1.register_fields([('header', struct_gpu_info_header, 0), ('gc_num_se', uint32_t, 12), ('gc_num_cu_per_sh', uint32_t, 16), ('gc_num_sh_per_se', uint32_t, 20), ('gc_num_rb_per_se', uint32_t, 24), ('gc_num_tccs', uint32_t, 28), ('gc_num_gprs', uint32_t, 32), ('gc_num_max_gs_thds', uint32_t, 36), ('gc_gs_table_depth', uint32_t, 40), ('gc_gsprim_buff_depth', uint32_t, 44), ('gc_parameter_cache_depth', uint32_t, 48), ('gc_double_offchip_lds_buffer', uint32_t, 52), ('gc_wave_size', uint32_t, 56), ('gc_max_waves_per_simd', uint32_t, 60), ('gc_max_scratch_slots_per_cu', uint32_t, 64), ('gc_lds_size', uint32_t, 68), ('gc_num_sc_per_se', uint32_t, 72), ('gc_num_packer_per_sc', uint32_t, 76), ('gc_num_tcp_per_sh', uint32_t, 80), ('gc_tcp_size_per_cu', uint32_t, 84), ('gc_num_sdp_interface', uint32_t, 88), ('gc_num_cu_per_sqc', uint32_t, 92), ('gc_instruction_cache_size_per_sqc', uint32_t, 96), ('gc_scalar_data_cache_size_per_sqc', uint32_t, 100), ('gc_tcc_size', uint32_t, 104)]) +@c.record +class struct_harvest_info_header(c.Struct): + SIZE = 8 + signature: int + version: int +struct_harvest_info_header.register_fields([('signature', uint32_t, 0), ('version', uint32_t, 4)]) +harvest_info_header: TypeAlias = struct_harvest_info_header +@c.record +class struct_harvest_info(c.Struct): + SIZE = 4 + hw_id: int + number_instance: int + reserved: int +struct_harvest_info.register_fields([('hw_id', uint16_t, 0), ('number_instance', uint8_t, 2), ('reserved', uint8_t, 3)]) +harvest_info: TypeAlias = struct_harvest_info +@c.record +class struct_harvest_table(c.Struct): + SIZE = 136 + header: struct_harvest_info_header + list: c.Array[struct_harvest_info, Literal[32]] +struct_harvest_table.register_fields([('header', harvest_info_header, 0), ('list', c.Array[harvest_info, Literal[32]], 8)]) +harvest_table: TypeAlias = struct_harvest_table +@c.record +class struct_mall_info_header(c.Struct): + SIZE = 12 + table_id: int + version_major: int + version_minor: int + size_bytes: int +struct_mall_info_header.register_fields([('table_id', uint32_t, 0), ('version_major', uint16_t, 4), ('version_minor', uint16_t, 6), ('size_bytes', uint32_t, 8)]) +@c.record +class struct_mall_info_v1_0(c.Struct): + SIZE = 48 + header: struct_mall_info_header + mall_size_per_m: int + m_s_present: int + m_half_use: int + m_mall_config: int + reserved: c.Array[ctypes.c_uint32, Literal[5]] +struct_mall_info_v1_0.register_fields([('header', struct_mall_info_header, 0), ('mall_size_per_m', uint32_t, 12), ('m_s_present', uint32_t, 16), ('m_half_use', uint32_t, 20), ('m_mall_config', uint32_t, 24), ('reserved', c.Array[uint32_t, Literal[5]], 28)]) +@c.record +class struct_mall_info_v2_0(c.Struct): + SIZE = 48 + header: struct_mall_info_header + mall_size_per_umc: int + reserved: c.Array[ctypes.c_uint32, Literal[8]] +struct_mall_info_v2_0.register_fields([('header', struct_mall_info_header, 0), ('mall_size_per_umc', uint32_t, 12), ('reserved', c.Array[uint32_t, Literal[8]], 16)]) +@c.record +class struct_vcn_info_header(c.Struct): + SIZE = 12 + table_id: int + version_major: int + version_minor: int + size_bytes: int +struct_vcn_info_header.register_fields([('table_id', uint32_t, 0), ('version_major', uint16_t, 4), ('version_minor', uint16_t, 6), ('size_bytes', uint32_t, 8)]) +@c.record +class struct_vcn_instance_info_v1_0(c.Struct): + SIZE = 16 + instance_num: int + fuse_data: union__fuse_data + reserved: c.Array[ctypes.c_uint32, Literal[2]] +@c.record +class union__fuse_data(c.Struct): + SIZE = 4 + bits: union__fuse_data_bits + all_bits: int +@c.record +class union__fuse_data_bits(c.Struct): + SIZE = 4 + av1_disabled: int + vp9_disabled: int + hevc_disabled: int + h264_disabled: int + reserved: int +union__fuse_data_bits.register_fields([('av1_disabled', uint32_t, 0, 1, 0), ('vp9_disabled', uint32_t, 0, 1, 1), ('hevc_disabled', uint32_t, 0, 1, 2), ('h264_disabled', uint32_t, 0, 1, 3), ('reserved', uint32_t, 0, 28, 4)]) +union__fuse_data.register_fields([('bits', union__fuse_data_bits, 0), ('all_bits', uint32_t, 0)]) +struct_vcn_instance_info_v1_0.register_fields([('instance_num', uint32_t, 0), ('fuse_data', union__fuse_data, 4), ('reserved', c.Array[uint32_t, Literal[2]], 8)]) +@c.record +class struct_vcn_info_v1_0(c.Struct): + SIZE = 96 + header: struct_vcn_info_header + num_of_instances: int + instance_info: c.Array[struct_vcn_instance_info_v1_0, Literal[4]] + reserved: c.Array[ctypes.c_uint32, Literal[4]] +struct_vcn_info_v1_0.register_fields([('header', struct_vcn_info_header, 0), ('num_of_instances', uint32_t, 12), ('instance_info', c.Array[struct_vcn_instance_info_v1_0, Literal[4]], 16), ('reserved', c.Array[uint32_t, Literal[4]], 80)]) +@c.record +class struct_nps_info_header(c.Struct): + SIZE = 12 + table_id: int + version_major: int + version_minor: int + size_bytes: int +struct_nps_info_header.register_fields([('table_id', uint32_t, 0), ('version_major', uint16_t, 4), ('version_minor', uint16_t, 6), ('size_bytes', uint32_t, 8)]) +@c.record +class struct_nps_instance_info_v1_0(c.Struct): + SIZE = 16 + base_address: int + limit_address: int +uint64_t: TypeAlias = ctypes.c_uint64 +struct_nps_instance_info_v1_0.register_fields([('base_address', uint64_t, 0), ('limit_address', uint64_t, 8)]) +@c.record +class struct_nps_info_v1_0(c.Struct): + SIZE = 212 + header: struct_nps_info_header + nps_type: int + count: int + instance_info: c.Array[struct_nps_instance_info_v1_0, Literal[12]] +struct_nps_info_v1_0.register_fields([('header', struct_nps_info_header, 0), ('nps_type', uint32_t, 12), ('count', uint32_t, 16), ('instance_info', c.Array[struct_nps_instance_info_v1_0, Literal[12]], 20)]) +enum_amd_hw_ip_block_type: dict[int, str] = {(GC_HWIP:=1): 'GC_HWIP', (HDP_HWIP:=2): 'HDP_HWIP', (SDMA0_HWIP:=3): 'SDMA0_HWIP', (SDMA1_HWIP:=4): 'SDMA1_HWIP', (SDMA2_HWIP:=5): 'SDMA2_HWIP', (SDMA3_HWIP:=6): 'SDMA3_HWIP', (SDMA4_HWIP:=7): 'SDMA4_HWIP', (SDMA5_HWIP:=8): 'SDMA5_HWIP', (SDMA6_HWIP:=9): 'SDMA6_HWIP', (SDMA7_HWIP:=10): 'SDMA7_HWIP', (LSDMA_HWIP:=11): 'LSDMA_HWIP', (MMHUB_HWIP:=12): 'MMHUB_HWIP', (ATHUB_HWIP:=13): 'ATHUB_HWIP', (NBIO_HWIP:=14): 'NBIO_HWIP', (MP0_HWIP:=15): 'MP0_HWIP', (MP1_HWIP:=16): 'MP1_HWIP', (UVD_HWIP:=17): 'UVD_HWIP', (VCN_HWIP:=17): 'VCN_HWIP', (JPEG_HWIP:=17): 'JPEG_HWIP', (VCN1_HWIP:=18): 'VCN1_HWIP', (VCE_HWIP:=19): 'VCE_HWIP', (VPE_HWIP:=20): 'VPE_HWIP', (DF_HWIP:=21): 'DF_HWIP', (DCE_HWIP:=22): 'DCE_HWIP', (OSSSYS_HWIP:=23): 'OSSSYS_HWIP', (SMUIO_HWIP:=24): 'SMUIO_HWIP', (PWR_HWIP:=25): 'PWR_HWIP', (NBIF_HWIP:=26): 'NBIF_HWIP', (THM_HWIP:=27): 'THM_HWIP', (CLK_HWIP:=28): 'CLK_HWIP', (UMC_HWIP:=29): 'UMC_HWIP', (RSMU_HWIP:=30): 'RSMU_HWIP', (XGMI_HWIP:=31): 'XGMI_HWIP', (DCI_HWIP:=32): 'DCI_HWIP', (PCIE_HWIP:=33): 'PCIE_HWIP', (ISP_HWIP:=34): 'ISP_HWIP', (MAX_HWIP:=35): 'MAX_HWIP'} +@c.record +class struct_common_firmware_header(c.Struct): + SIZE = 32 + size_bytes: int + header_size_bytes: int + header_version_major: int + header_version_minor: int + ip_version_major: int + ip_version_minor: int + ucode_version: int + ucode_size_bytes: int + ucode_array_offset_bytes: int + crc32: int +struct_common_firmware_header.register_fields([('size_bytes', uint32_t, 0), ('header_size_bytes', uint32_t, 4), ('header_version_major', uint16_t, 8), ('header_version_minor', uint16_t, 10), ('ip_version_major', uint16_t, 12), ('ip_version_minor', uint16_t, 14), ('ucode_version', uint32_t, 16), ('ucode_size_bytes', uint32_t, 20), ('ucode_array_offset_bytes', uint32_t, 24), ('crc32', uint32_t, 28)]) +@c.record +class struct_mc_firmware_header_v1_0(c.Struct): + SIZE = 40 + header: struct_common_firmware_header + io_debug_size_bytes: int + io_debug_array_offset_bytes: int +struct_mc_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('io_debug_size_bytes', uint32_t, 32), ('io_debug_array_offset_bytes', uint32_t, 36)]) +@c.record +class struct_smc_firmware_header_v1_0(c.Struct): + SIZE = 36 + header: struct_common_firmware_header + ucode_start_addr: int +struct_smc_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_start_addr', uint32_t, 32)]) +@c.record +class struct_smc_firmware_header_v2_0(c.Struct): + SIZE = 44 + v1_0: struct_smc_firmware_header_v1_0 + ppt_offset_bytes: int + ppt_size_bytes: int +struct_smc_firmware_header_v2_0.register_fields([('v1_0', struct_smc_firmware_header_v1_0, 0), ('ppt_offset_bytes', uint32_t, 36), ('ppt_size_bytes', uint32_t, 40)]) +@c.record +class struct_smc_soft_pptable_entry(c.Struct): + SIZE = 12 + id: int + ppt_offset_bytes: int + ppt_size_bytes: int +struct_smc_soft_pptable_entry.register_fields([('id', uint32_t, 0), ('ppt_offset_bytes', uint32_t, 4), ('ppt_size_bytes', uint32_t, 8)]) +@c.record +class struct_smc_firmware_header_v2_1(c.Struct): + SIZE = 44 + v1_0: struct_smc_firmware_header_v1_0 + pptable_count: int + pptable_entry_offset: int +struct_smc_firmware_header_v2_1.register_fields([('v1_0', struct_smc_firmware_header_v1_0, 0), ('pptable_count', uint32_t, 36), ('pptable_entry_offset', uint32_t, 40)]) +@c.record +class struct_psp_fw_legacy_bin_desc(c.Struct): + SIZE = 12 + fw_version: int + offset_bytes: int + size_bytes: int +struct_psp_fw_legacy_bin_desc.register_fields([('fw_version', uint32_t, 0), ('offset_bytes', uint32_t, 4), ('size_bytes', uint32_t, 8)]) +@c.record +class struct_psp_firmware_header_v1_0(c.Struct): + SIZE = 44 + header: struct_common_firmware_header + sos: struct_psp_fw_legacy_bin_desc +struct_psp_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('sos', struct_psp_fw_legacy_bin_desc, 32)]) +@c.record +class struct_psp_firmware_header_v1_1(c.Struct): + SIZE = 68 + v1_0: struct_psp_firmware_header_v1_0 + toc: struct_psp_fw_legacy_bin_desc + kdb: struct_psp_fw_legacy_bin_desc +struct_psp_firmware_header_v1_1.register_fields([('v1_0', struct_psp_firmware_header_v1_0, 0), ('toc', struct_psp_fw_legacy_bin_desc, 44), ('kdb', struct_psp_fw_legacy_bin_desc, 56)]) +@c.record +class struct_psp_firmware_header_v1_2(c.Struct): + SIZE = 68 + v1_0: struct_psp_firmware_header_v1_0 + res: struct_psp_fw_legacy_bin_desc + kdb: struct_psp_fw_legacy_bin_desc +struct_psp_firmware_header_v1_2.register_fields([('v1_0', struct_psp_firmware_header_v1_0, 0), ('res', struct_psp_fw_legacy_bin_desc, 44), ('kdb', struct_psp_fw_legacy_bin_desc, 56)]) +@c.record +class struct_psp_firmware_header_v1_3(c.Struct): + SIZE = 116 + v1_1: struct_psp_firmware_header_v1_1 + spl: struct_psp_fw_legacy_bin_desc + rl: struct_psp_fw_legacy_bin_desc + sys_drv_aux: struct_psp_fw_legacy_bin_desc + sos_aux: struct_psp_fw_legacy_bin_desc +struct_psp_firmware_header_v1_3.register_fields([('v1_1', struct_psp_firmware_header_v1_1, 0), ('spl', struct_psp_fw_legacy_bin_desc, 68), ('rl', struct_psp_fw_legacy_bin_desc, 80), ('sys_drv_aux', struct_psp_fw_legacy_bin_desc, 92), ('sos_aux', struct_psp_fw_legacy_bin_desc, 104)]) +@c.record +class struct_psp_fw_bin_desc(c.Struct): + SIZE = 16 + fw_type: int + fw_version: int + offset_bytes: int + size_bytes: int +struct_psp_fw_bin_desc.register_fields([('fw_type', uint32_t, 0), ('fw_version', uint32_t, 4), ('offset_bytes', uint32_t, 8), ('size_bytes', uint32_t, 12)]) +enum_psp_fw_type: dict[int, str] = {(PSP_FW_TYPE_UNKOWN:=0): 'PSP_FW_TYPE_UNKOWN', (PSP_FW_TYPE_PSP_SOS:=1): 'PSP_FW_TYPE_PSP_SOS', (PSP_FW_TYPE_PSP_SYS_DRV:=2): 'PSP_FW_TYPE_PSP_SYS_DRV', (PSP_FW_TYPE_PSP_KDB:=3): 'PSP_FW_TYPE_PSP_KDB', (PSP_FW_TYPE_PSP_TOC:=4): 'PSP_FW_TYPE_PSP_TOC', (PSP_FW_TYPE_PSP_SPL:=5): 'PSP_FW_TYPE_PSP_SPL', (PSP_FW_TYPE_PSP_RL:=6): 'PSP_FW_TYPE_PSP_RL', (PSP_FW_TYPE_PSP_SOC_DRV:=7): 'PSP_FW_TYPE_PSP_SOC_DRV', (PSP_FW_TYPE_PSP_INTF_DRV:=8): 'PSP_FW_TYPE_PSP_INTF_DRV', (PSP_FW_TYPE_PSP_DBG_DRV:=9): 'PSP_FW_TYPE_PSP_DBG_DRV', (PSP_FW_TYPE_PSP_RAS_DRV:=10): 'PSP_FW_TYPE_PSP_RAS_DRV', (PSP_FW_TYPE_PSP_IPKEYMGR_DRV:=11): 'PSP_FW_TYPE_PSP_IPKEYMGR_DRV', (PSP_FW_TYPE_MAX_INDEX:=12): 'PSP_FW_TYPE_MAX_INDEX'} +@c.record +class struct_psp_firmware_header_v2_0(c.Struct): + SIZE = 52 + header: struct_common_firmware_header + psp_fw_bin_count: int + psp_fw_bin: c.Array[struct_psp_fw_bin_desc, Literal[1]] +struct_psp_firmware_header_v2_0.register_fields([('header', struct_common_firmware_header, 0), ('psp_fw_bin_count', uint32_t, 32), ('psp_fw_bin', c.Array[struct_psp_fw_bin_desc, Literal[1]], 36)]) +@c.record +class struct_psp_firmware_header_v2_1(c.Struct): + SIZE = 56 + header: struct_common_firmware_header + psp_fw_bin_count: int + psp_aux_fw_bin_index: int + psp_fw_bin: c.Array[struct_psp_fw_bin_desc, Literal[1]] +struct_psp_firmware_header_v2_1.register_fields([('header', struct_common_firmware_header, 0), ('psp_fw_bin_count', uint32_t, 32), ('psp_aux_fw_bin_index', uint32_t, 36), ('psp_fw_bin', c.Array[struct_psp_fw_bin_desc, Literal[1]], 40)]) +@c.record +class struct_ta_firmware_header_v1_0(c.Struct): + SIZE = 92 + header: struct_common_firmware_header + xgmi: struct_psp_fw_legacy_bin_desc + ras: struct_psp_fw_legacy_bin_desc + hdcp: struct_psp_fw_legacy_bin_desc + dtm: struct_psp_fw_legacy_bin_desc + securedisplay: struct_psp_fw_legacy_bin_desc +struct_ta_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('xgmi', struct_psp_fw_legacy_bin_desc, 32), ('ras', struct_psp_fw_legacy_bin_desc, 44), ('hdcp', struct_psp_fw_legacy_bin_desc, 56), ('dtm', struct_psp_fw_legacy_bin_desc, 68), ('securedisplay', struct_psp_fw_legacy_bin_desc, 80)]) +enum_ta_fw_type: dict[int, str] = {(TA_FW_TYPE_UNKOWN:=0): 'TA_FW_TYPE_UNKOWN', (TA_FW_TYPE_PSP_ASD:=1): 'TA_FW_TYPE_PSP_ASD', (TA_FW_TYPE_PSP_XGMI:=2): 'TA_FW_TYPE_PSP_XGMI', (TA_FW_TYPE_PSP_RAS:=3): 'TA_FW_TYPE_PSP_RAS', (TA_FW_TYPE_PSP_HDCP:=4): 'TA_FW_TYPE_PSP_HDCP', (TA_FW_TYPE_PSP_DTM:=5): 'TA_FW_TYPE_PSP_DTM', (TA_FW_TYPE_PSP_RAP:=6): 'TA_FW_TYPE_PSP_RAP', (TA_FW_TYPE_PSP_SECUREDISPLAY:=7): 'TA_FW_TYPE_PSP_SECUREDISPLAY', (TA_FW_TYPE_MAX_INDEX:=8): 'TA_FW_TYPE_MAX_INDEX'} +@c.record +class struct_ta_firmware_header_v2_0(c.Struct): + SIZE = 52 + header: struct_common_firmware_header + ta_fw_bin_count: int + ta_fw_bin: c.Array[struct_psp_fw_bin_desc, Literal[1]] +struct_ta_firmware_header_v2_0.register_fields([('header', struct_common_firmware_header, 0), ('ta_fw_bin_count', uint32_t, 32), ('ta_fw_bin', c.Array[struct_psp_fw_bin_desc, Literal[1]], 36)]) +@c.record +class struct_gfx_firmware_header_v1_0(c.Struct): + SIZE = 44 + header: struct_common_firmware_header + ucode_feature_version: int + jt_offset: int + jt_size: int +struct_gfx_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_feature_version', uint32_t, 32), ('jt_offset', uint32_t, 36), ('jt_size', uint32_t, 40)]) +@c.record +class struct_gfx_firmware_header_v2_0(c.Struct): + SIZE = 60 + header: struct_common_firmware_header + ucode_feature_version: int + ucode_size_bytes: int + ucode_offset_bytes: int + data_size_bytes: int + data_offset_bytes: int + ucode_start_addr_lo: int + ucode_start_addr_hi: int +struct_gfx_firmware_header_v2_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_feature_version', uint32_t, 32), ('ucode_size_bytes', uint32_t, 36), ('ucode_offset_bytes', uint32_t, 40), ('data_size_bytes', uint32_t, 44), ('data_offset_bytes', uint32_t, 48), ('ucode_start_addr_lo', uint32_t, 52), ('ucode_start_addr_hi', uint32_t, 56)]) +@c.record +class struct_mes_firmware_header_v1_0(c.Struct): + SIZE = 72 + header: struct_common_firmware_header + mes_ucode_version: int + mes_ucode_size_bytes: int + mes_ucode_offset_bytes: int + mes_ucode_data_version: int + mes_ucode_data_size_bytes: int + mes_ucode_data_offset_bytes: int + mes_uc_start_addr_lo: int + mes_uc_start_addr_hi: int + mes_data_start_addr_lo: int + mes_data_start_addr_hi: int +struct_mes_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('mes_ucode_version', uint32_t, 32), ('mes_ucode_size_bytes', uint32_t, 36), ('mes_ucode_offset_bytes', uint32_t, 40), ('mes_ucode_data_version', uint32_t, 44), ('mes_ucode_data_size_bytes', uint32_t, 48), ('mes_ucode_data_offset_bytes', uint32_t, 52), ('mes_uc_start_addr_lo', uint32_t, 56), ('mes_uc_start_addr_hi', uint32_t, 60), ('mes_data_start_addr_lo', uint32_t, 64), ('mes_data_start_addr_hi', uint32_t, 68)]) +@c.record +class struct_rlc_firmware_header_v1_0(c.Struct): + SIZE = 52 + header: struct_common_firmware_header + ucode_feature_version: int + save_and_restore_offset: int + clear_state_descriptor_offset: int + avail_scratch_ram_locations: int + master_pkt_description_offset: int +struct_rlc_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_feature_version', uint32_t, 32), ('save_and_restore_offset', uint32_t, 36), ('clear_state_descriptor_offset', uint32_t, 40), ('avail_scratch_ram_locations', uint32_t, 44), ('master_pkt_description_offset', uint32_t, 48)]) +@c.record +class struct_rlc_firmware_header_v2_0(c.Struct): + SIZE = 104 + header: struct_common_firmware_header + ucode_feature_version: int + jt_offset: int + jt_size: int + save_and_restore_offset: int + clear_state_descriptor_offset: int + avail_scratch_ram_locations: int + reg_restore_list_size: int + reg_list_format_start: int + reg_list_format_separate_start: int + starting_offsets_start: int + reg_list_format_size_bytes: int + reg_list_format_array_offset_bytes: int + reg_list_size_bytes: int + reg_list_array_offset_bytes: int + reg_list_format_separate_size_bytes: int + reg_list_format_separate_array_offset_bytes: int + reg_list_separate_size_bytes: int + reg_list_separate_array_offset_bytes: int +struct_rlc_firmware_header_v2_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_feature_version', uint32_t, 32), ('jt_offset', uint32_t, 36), ('jt_size', uint32_t, 40), ('save_and_restore_offset', uint32_t, 44), ('clear_state_descriptor_offset', uint32_t, 48), ('avail_scratch_ram_locations', uint32_t, 52), ('reg_restore_list_size', uint32_t, 56), ('reg_list_format_start', uint32_t, 60), ('reg_list_format_separate_start', uint32_t, 64), ('starting_offsets_start', uint32_t, 68), ('reg_list_format_size_bytes', uint32_t, 72), ('reg_list_format_array_offset_bytes', uint32_t, 76), ('reg_list_size_bytes', uint32_t, 80), ('reg_list_array_offset_bytes', uint32_t, 84), ('reg_list_format_separate_size_bytes', uint32_t, 88), ('reg_list_format_separate_array_offset_bytes', uint32_t, 92), ('reg_list_separate_size_bytes', uint32_t, 96), ('reg_list_separate_array_offset_bytes', uint32_t, 100)]) +@c.record +class struct_rlc_firmware_header_v2_1(c.Struct): + SIZE = 156 + v2_0: struct_rlc_firmware_header_v2_0 + reg_list_format_direct_reg_list_length: int + save_restore_list_cntl_ucode_ver: int + save_restore_list_cntl_feature_ver: int + save_restore_list_cntl_size_bytes: int + save_restore_list_cntl_offset_bytes: int + save_restore_list_gpm_ucode_ver: int + save_restore_list_gpm_feature_ver: int + save_restore_list_gpm_size_bytes: int + save_restore_list_gpm_offset_bytes: int + save_restore_list_srm_ucode_ver: int + save_restore_list_srm_feature_ver: int + save_restore_list_srm_size_bytes: int + save_restore_list_srm_offset_bytes: int +struct_rlc_firmware_header_v2_1.register_fields([('v2_0', struct_rlc_firmware_header_v2_0, 0), ('reg_list_format_direct_reg_list_length', uint32_t, 104), ('save_restore_list_cntl_ucode_ver', uint32_t, 108), ('save_restore_list_cntl_feature_ver', uint32_t, 112), ('save_restore_list_cntl_size_bytes', uint32_t, 116), ('save_restore_list_cntl_offset_bytes', uint32_t, 120), ('save_restore_list_gpm_ucode_ver', uint32_t, 124), ('save_restore_list_gpm_feature_ver', uint32_t, 128), ('save_restore_list_gpm_size_bytes', uint32_t, 132), ('save_restore_list_gpm_offset_bytes', uint32_t, 136), ('save_restore_list_srm_ucode_ver', uint32_t, 140), ('save_restore_list_srm_feature_ver', uint32_t, 144), ('save_restore_list_srm_size_bytes', uint32_t, 148), ('save_restore_list_srm_offset_bytes', uint32_t, 152)]) +@c.record +class struct_rlc_firmware_header_v2_2(c.Struct): + SIZE = 172 + v2_1: struct_rlc_firmware_header_v2_1 + rlc_iram_ucode_size_bytes: int + rlc_iram_ucode_offset_bytes: int + rlc_dram_ucode_size_bytes: int + rlc_dram_ucode_offset_bytes: int +struct_rlc_firmware_header_v2_2.register_fields([('v2_1', struct_rlc_firmware_header_v2_1, 0), ('rlc_iram_ucode_size_bytes', uint32_t, 156), ('rlc_iram_ucode_offset_bytes', uint32_t, 160), ('rlc_dram_ucode_size_bytes', uint32_t, 164), ('rlc_dram_ucode_offset_bytes', uint32_t, 168)]) +@c.record +class struct_rlc_firmware_header_v2_3(c.Struct): + SIZE = 204 + v2_2: struct_rlc_firmware_header_v2_2 + rlcp_ucode_version: int + rlcp_ucode_feature_version: int + rlcp_ucode_size_bytes: int + rlcp_ucode_offset_bytes: int + rlcv_ucode_version: int + rlcv_ucode_feature_version: int + rlcv_ucode_size_bytes: int + rlcv_ucode_offset_bytes: int +struct_rlc_firmware_header_v2_3.register_fields([('v2_2', struct_rlc_firmware_header_v2_2, 0), ('rlcp_ucode_version', uint32_t, 172), ('rlcp_ucode_feature_version', uint32_t, 176), ('rlcp_ucode_size_bytes', uint32_t, 180), ('rlcp_ucode_offset_bytes', uint32_t, 184), ('rlcv_ucode_version', uint32_t, 188), ('rlcv_ucode_feature_version', uint32_t, 192), ('rlcv_ucode_size_bytes', uint32_t, 196), ('rlcv_ucode_offset_bytes', uint32_t, 200)]) +@c.record +class struct_rlc_firmware_header_v2_4(c.Struct): + SIZE = 244 + v2_3: struct_rlc_firmware_header_v2_3 + global_tap_delays_ucode_size_bytes: int + global_tap_delays_ucode_offset_bytes: int + se0_tap_delays_ucode_size_bytes: int + se0_tap_delays_ucode_offset_bytes: int + se1_tap_delays_ucode_size_bytes: int + se1_tap_delays_ucode_offset_bytes: int + se2_tap_delays_ucode_size_bytes: int + se2_tap_delays_ucode_offset_bytes: int + se3_tap_delays_ucode_size_bytes: int + se3_tap_delays_ucode_offset_bytes: int +struct_rlc_firmware_header_v2_4.register_fields([('v2_3', struct_rlc_firmware_header_v2_3, 0), ('global_tap_delays_ucode_size_bytes', uint32_t, 204), ('global_tap_delays_ucode_offset_bytes', uint32_t, 208), ('se0_tap_delays_ucode_size_bytes', uint32_t, 212), ('se0_tap_delays_ucode_offset_bytes', uint32_t, 216), ('se1_tap_delays_ucode_size_bytes', uint32_t, 220), ('se1_tap_delays_ucode_offset_bytes', uint32_t, 224), ('se2_tap_delays_ucode_size_bytes', uint32_t, 228), ('se2_tap_delays_ucode_offset_bytes', uint32_t, 232), ('se3_tap_delays_ucode_size_bytes', uint32_t, 236), ('se3_tap_delays_ucode_offset_bytes', uint32_t, 240)]) +@c.record +class struct_sdma_firmware_header_v1_0(c.Struct): + SIZE = 48 + header: struct_common_firmware_header + ucode_feature_version: int + ucode_change_version: int + jt_offset: int + jt_size: int +struct_sdma_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_feature_version', uint32_t, 32), ('ucode_change_version', uint32_t, 36), ('jt_offset', uint32_t, 40), ('jt_size', uint32_t, 44)]) +@c.record +class struct_sdma_firmware_header_v1_1(c.Struct): + SIZE = 52 + v1_0: struct_sdma_firmware_header_v1_0 + digest_size: int +struct_sdma_firmware_header_v1_1.register_fields([('v1_0', struct_sdma_firmware_header_v1_0, 0), ('digest_size', uint32_t, 48)]) +@c.record +class struct_sdma_firmware_header_v2_0(c.Struct): + SIZE = 64 + header: struct_common_firmware_header + ucode_feature_version: int + ctx_ucode_size_bytes: int + ctx_jt_offset: int + ctx_jt_size: int + ctl_ucode_offset: int + ctl_ucode_size_bytes: int + ctl_jt_offset: int + ctl_jt_size: int +struct_sdma_firmware_header_v2_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_feature_version', uint32_t, 32), ('ctx_ucode_size_bytes', uint32_t, 36), ('ctx_jt_offset', uint32_t, 40), ('ctx_jt_size', uint32_t, 44), ('ctl_ucode_offset', uint32_t, 48), ('ctl_ucode_size_bytes', uint32_t, 52), ('ctl_jt_offset', uint32_t, 56), ('ctl_jt_size', uint32_t, 60)]) +@c.record +class struct_vpe_firmware_header_v1_0(c.Struct): + SIZE = 64 + header: struct_common_firmware_header + ucode_feature_version: int + ctx_ucode_size_bytes: int + ctx_jt_offset: int + ctx_jt_size: int + ctl_ucode_offset: int + ctl_ucode_size_bytes: int + ctl_jt_offset: int + ctl_jt_size: int +struct_vpe_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_feature_version', uint32_t, 32), ('ctx_ucode_size_bytes', uint32_t, 36), ('ctx_jt_offset', uint32_t, 40), ('ctx_jt_size', uint32_t, 44), ('ctl_ucode_offset', uint32_t, 48), ('ctl_ucode_size_bytes', uint32_t, 52), ('ctl_jt_offset', uint32_t, 56), ('ctl_jt_size', uint32_t, 60)]) +@c.record +class struct_umsch_mm_firmware_header_v1_0(c.Struct): + SIZE = 80 + header: struct_common_firmware_header + umsch_mm_ucode_version: int + umsch_mm_ucode_size_bytes: int + umsch_mm_ucode_offset_bytes: int + umsch_mm_ucode_data_version: int + umsch_mm_ucode_data_size_bytes: int + umsch_mm_ucode_data_offset_bytes: int + umsch_mm_irq_start_addr_lo: int + umsch_mm_irq_start_addr_hi: int + umsch_mm_uc_start_addr_lo: int + umsch_mm_uc_start_addr_hi: int + umsch_mm_data_start_addr_lo: int + umsch_mm_data_start_addr_hi: int +struct_umsch_mm_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('umsch_mm_ucode_version', uint32_t, 32), ('umsch_mm_ucode_size_bytes', uint32_t, 36), ('umsch_mm_ucode_offset_bytes', uint32_t, 40), ('umsch_mm_ucode_data_version', uint32_t, 44), ('umsch_mm_ucode_data_size_bytes', uint32_t, 48), ('umsch_mm_ucode_data_offset_bytes', uint32_t, 52), ('umsch_mm_irq_start_addr_lo', uint32_t, 56), ('umsch_mm_irq_start_addr_hi', uint32_t, 60), ('umsch_mm_uc_start_addr_lo', uint32_t, 64), ('umsch_mm_uc_start_addr_hi', uint32_t, 68), ('umsch_mm_data_start_addr_lo', uint32_t, 72), ('umsch_mm_data_start_addr_hi', uint32_t, 76)]) +@c.record +class struct_sdma_firmware_header_v3_0(c.Struct): + SIZE = 44 + header: struct_common_firmware_header + ucode_feature_version: int + ucode_offset_bytes: int + ucode_size_bytes: int +struct_sdma_firmware_header_v3_0.register_fields([('header', struct_common_firmware_header, 0), ('ucode_feature_version', uint32_t, 32), ('ucode_offset_bytes', uint32_t, 36), ('ucode_size_bytes', uint32_t, 40)]) +@c.record +class struct_gpu_info_firmware_v1_0(c.Struct): + SIZE = 60 + gc_num_se: int + gc_num_cu_per_sh: int + gc_num_sh_per_se: int + gc_num_rb_per_se: int + gc_num_tccs: int + gc_num_gprs: int + gc_num_max_gs_thds: int + gc_gs_table_depth: int + gc_gsprim_buff_depth: int + gc_parameter_cache_depth: int + gc_double_offchip_lds_buffer: int + gc_wave_size: int + gc_max_waves_per_simd: int + gc_max_scratch_slots_per_cu: int + gc_lds_size: int +struct_gpu_info_firmware_v1_0.register_fields([('gc_num_se', uint32_t, 0), ('gc_num_cu_per_sh', uint32_t, 4), ('gc_num_sh_per_se', uint32_t, 8), ('gc_num_rb_per_se', uint32_t, 12), ('gc_num_tccs', uint32_t, 16), ('gc_num_gprs', uint32_t, 20), ('gc_num_max_gs_thds', uint32_t, 24), ('gc_gs_table_depth', uint32_t, 28), ('gc_gsprim_buff_depth', uint32_t, 32), ('gc_parameter_cache_depth', uint32_t, 36), ('gc_double_offchip_lds_buffer', uint32_t, 40), ('gc_wave_size', uint32_t, 44), ('gc_max_waves_per_simd', uint32_t, 48), ('gc_max_scratch_slots_per_cu', uint32_t, 52), ('gc_lds_size', uint32_t, 56)]) +@c.record +class struct_gpu_info_firmware_v1_1(c.Struct): + SIZE = 68 + v1_0: struct_gpu_info_firmware_v1_0 + num_sc_per_sh: int + num_packer_per_sc: int +struct_gpu_info_firmware_v1_1.register_fields([('v1_0', struct_gpu_info_firmware_v1_0, 0), ('num_sc_per_sh', uint32_t, 60), ('num_packer_per_sc', uint32_t, 64)]) +@c.record +class struct_gpu_info_firmware_header_v1_0(c.Struct): + SIZE = 36 + header: struct_common_firmware_header + version_major: int + version_minor: int +struct_gpu_info_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('version_major', uint16_t, 32), ('version_minor', uint16_t, 34)]) +@c.record +class struct_dmcu_firmware_header_v1_0(c.Struct): + SIZE = 40 + header: struct_common_firmware_header + intv_offset_bytes: int + intv_size_bytes: int +struct_dmcu_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('intv_offset_bytes', uint32_t, 32), ('intv_size_bytes', uint32_t, 36)]) +@c.record +class struct_dmcub_firmware_header_v1_0(c.Struct): + SIZE = 40 + header: struct_common_firmware_header + inst_const_bytes: int + bss_data_bytes: int +struct_dmcub_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('inst_const_bytes', uint32_t, 32), ('bss_data_bytes', uint32_t, 36)]) +@c.record +class struct_imu_firmware_header_v1_0(c.Struct): + SIZE = 48 + header: struct_common_firmware_header + imu_iram_ucode_size_bytes: int + imu_iram_ucode_offset_bytes: int + imu_dram_ucode_size_bytes: int + imu_dram_ucode_offset_bytes: int +struct_imu_firmware_header_v1_0.register_fields([('header', struct_common_firmware_header, 0), ('imu_iram_ucode_size_bytes', uint32_t, 32), ('imu_iram_ucode_offset_bytes', uint32_t, 36), ('imu_dram_ucode_size_bytes', uint32_t, 40), ('imu_dram_ucode_offset_bytes', uint32_t, 44)]) +@c.record +class union_amdgpu_firmware_header(c.Struct): + SIZE = 256 + common: struct_common_firmware_header + mc: struct_mc_firmware_header_v1_0 + smc: struct_smc_firmware_header_v1_0 + smc_v2_0: struct_smc_firmware_header_v2_0 + psp: struct_psp_firmware_header_v1_0 + psp_v1_1: struct_psp_firmware_header_v1_1 + psp_v1_3: struct_psp_firmware_header_v1_3 + psp_v2_0: struct_psp_firmware_header_v2_0 + psp_v2_1: struct_psp_firmware_header_v2_0 + ta: struct_ta_firmware_header_v1_0 + ta_v2_0: struct_ta_firmware_header_v2_0 + gfx: struct_gfx_firmware_header_v1_0 + gfx_v2_0: struct_gfx_firmware_header_v2_0 + rlc: struct_rlc_firmware_header_v1_0 + rlc_v2_0: struct_rlc_firmware_header_v2_0 + rlc_v2_1: struct_rlc_firmware_header_v2_1 + rlc_v2_2: struct_rlc_firmware_header_v2_2 + rlc_v2_3: struct_rlc_firmware_header_v2_3 + rlc_v2_4: struct_rlc_firmware_header_v2_4 + sdma: struct_sdma_firmware_header_v1_0 + sdma_v1_1: struct_sdma_firmware_header_v1_1 + sdma_v2_0: struct_sdma_firmware_header_v2_0 + sdma_v3_0: struct_sdma_firmware_header_v3_0 + gpu_info: struct_gpu_info_firmware_header_v1_0 + dmcu: struct_dmcu_firmware_header_v1_0 + dmcub: struct_dmcub_firmware_header_v1_0 + imu: struct_imu_firmware_header_v1_0 + raw: c.Array[ctypes.c_ubyte, Literal[256]] +union_amdgpu_firmware_header.register_fields([('common', struct_common_firmware_header, 0), ('mc', struct_mc_firmware_header_v1_0, 0), ('smc', struct_smc_firmware_header_v1_0, 0), ('smc_v2_0', struct_smc_firmware_header_v2_0, 0), ('psp', struct_psp_firmware_header_v1_0, 0), ('psp_v1_1', struct_psp_firmware_header_v1_1, 0), ('psp_v1_3', struct_psp_firmware_header_v1_3, 0), ('psp_v2_0', struct_psp_firmware_header_v2_0, 0), ('psp_v2_1', struct_psp_firmware_header_v2_0, 0), ('ta', struct_ta_firmware_header_v1_0, 0), ('ta_v2_0', struct_ta_firmware_header_v2_0, 0), ('gfx', struct_gfx_firmware_header_v1_0, 0), ('gfx_v2_0', struct_gfx_firmware_header_v2_0, 0), ('rlc', struct_rlc_firmware_header_v1_0, 0), ('rlc_v2_0', struct_rlc_firmware_header_v2_0, 0), ('rlc_v2_1', struct_rlc_firmware_header_v2_1, 0), ('rlc_v2_2', struct_rlc_firmware_header_v2_2, 0), ('rlc_v2_3', struct_rlc_firmware_header_v2_3, 0), ('rlc_v2_4', struct_rlc_firmware_header_v2_4, 0), ('sdma', struct_sdma_firmware_header_v1_0, 0), ('sdma_v1_1', struct_sdma_firmware_header_v1_1, 0), ('sdma_v2_0', struct_sdma_firmware_header_v2_0, 0), ('sdma_v3_0', struct_sdma_firmware_header_v3_0, 0), ('gpu_info', struct_gpu_info_firmware_header_v1_0, 0), ('dmcu', struct_dmcu_firmware_header_v1_0, 0), ('dmcub', struct_dmcub_firmware_header_v1_0, 0), ('imu', struct_imu_firmware_header_v1_0, 0), ('raw', c.Array[uint8_t, Literal[256]], 0)]) +enum_AMDGPU_UCODE_ID: dict[int, str] = {(AMDGPU_UCODE_ID_CAP:=0): 'AMDGPU_UCODE_ID_CAP', (AMDGPU_UCODE_ID_SDMA0:=1): 'AMDGPU_UCODE_ID_SDMA0', (AMDGPU_UCODE_ID_SDMA1:=2): 'AMDGPU_UCODE_ID_SDMA1', (AMDGPU_UCODE_ID_SDMA2:=3): 'AMDGPU_UCODE_ID_SDMA2', (AMDGPU_UCODE_ID_SDMA3:=4): 'AMDGPU_UCODE_ID_SDMA3', (AMDGPU_UCODE_ID_SDMA4:=5): 'AMDGPU_UCODE_ID_SDMA4', (AMDGPU_UCODE_ID_SDMA5:=6): 'AMDGPU_UCODE_ID_SDMA5', (AMDGPU_UCODE_ID_SDMA6:=7): 'AMDGPU_UCODE_ID_SDMA6', (AMDGPU_UCODE_ID_SDMA7:=8): 'AMDGPU_UCODE_ID_SDMA7', (AMDGPU_UCODE_ID_SDMA_UCODE_TH0:=9): 'AMDGPU_UCODE_ID_SDMA_UCODE_TH0', (AMDGPU_UCODE_ID_SDMA_UCODE_TH1:=10): 'AMDGPU_UCODE_ID_SDMA_UCODE_TH1', (AMDGPU_UCODE_ID_SDMA_RS64:=11): 'AMDGPU_UCODE_ID_SDMA_RS64', (AMDGPU_UCODE_ID_CP_CE:=12): 'AMDGPU_UCODE_ID_CP_CE', (AMDGPU_UCODE_ID_CP_PFP:=13): 'AMDGPU_UCODE_ID_CP_PFP', (AMDGPU_UCODE_ID_CP_ME:=14): 'AMDGPU_UCODE_ID_CP_ME', (AMDGPU_UCODE_ID_CP_RS64_PFP:=15): 'AMDGPU_UCODE_ID_CP_RS64_PFP', (AMDGPU_UCODE_ID_CP_RS64_ME:=16): 'AMDGPU_UCODE_ID_CP_RS64_ME', (AMDGPU_UCODE_ID_CP_RS64_MEC:=17): 'AMDGPU_UCODE_ID_CP_RS64_MEC', (AMDGPU_UCODE_ID_CP_RS64_PFP_P0_STACK:=18): 'AMDGPU_UCODE_ID_CP_RS64_PFP_P0_STACK', (AMDGPU_UCODE_ID_CP_RS64_PFP_P1_STACK:=19): 'AMDGPU_UCODE_ID_CP_RS64_PFP_P1_STACK', (AMDGPU_UCODE_ID_CP_RS64_ME_P0_STACK:=20): 'AMDGPU_UCODE_ID_CP_RS64_ME_P0_STACK', (AMDGPU_UCODE_ID_CP_RS64_ME_P1_STACK:=21): 'AMDGPU_UCODE_ID_CP_RS64_ME_P1_STACK', (AMDGPU_UCODE_ID_CP_RS64_MEC_P0_STACK:=22): 'AMDGPU_UCODE_ID_CP_RS64_MEC_P0_STACK', (AMDGPU_UCODE_ID_CP_RS64_MEC_P1_STACK:=23): 'AMDGPU_UCODE_ID_CP_RS64_MEC_P1_STACK', (AMDGPU_UCODE_ID_CP_RS64_MEC_P2_STACK:=24): 'AMDGPU_UCODE_ID_CP_RS64_MEC_P2_STACK', (AMDGPU_UCODE_ID_CP_RS64_MEC_P3_STACK:=25): 'AMDGPU_UCODE_ID_CP_RS64_MEC_P3_STACK', (AMDGPU_UCODE_ID_CP_MEC1:=26): 'AMDGPU_UCODE_ID_CP_MEC1', (AMDGPU_UCODE_ID_CP_MEC1_JT:=27): 'AMDGPU_UCODE_ID_CP_MEC1_JT', (AMDGPU_UCODE_ID_CP_MEC2:=28): 'AMDGPU_UCODE_ID_CP_MEC2', (AMDGPU_UCODE_ID_CP_MEC2_JT:=29): 'AMDGPU_UCODE_ID_CP_MEC2_JT', (AMDGPU_UCODE_ID_CP_MES:=30): 'AMDGPU_UCODE_ID_CP_MES', (AMDGPU_UCODE_ID_CP_MES_DATA:=31): 'AMDGPU_UCODE_ID_CP_MES_DATA', (AMDGPU_UCODE_ID_CP_MES1:=32): 'AMDGPU_UCODE_ID_CP_MES1', (AMDGPU_UCODE_ID_CP_MES1_DATA:=33): 'AMDGPU_UCODE_ID_CP_MES1_DATA', (AMDGPU_UCODE_ID_IMU_I:=34): 'AMDGPU_UCODE_ID_IMU_I', (AMDGPU_UCODE_ID_IMU_D:=35): 'AMDGPU_UCODE_ID_IMU_D', (AMDGPU_UCODE_ID_GLOBAL_TAP_DELAYS:=36): 'AMDGPU_UCODE_ID_GLOBAL_TAP_DELAYS', (AMDGPU_UCODE_ID_SE0_TAP_DELAYS:=37): 'AMDGPU_UCODE_ID_SE0_TAP_DELAYS', (AMDGPU_UCODE_ID_SE1_TAP_DELAYS:=38): 'AMDGPU_UCODE_ID_SE1_TAP_DELAYS', (AMDGPU_UCODE_ID_SE2_TAP_DELAYS:=39): 'AMDGPU_UCODE_ID_SE2_TAP_DELAYS', (AMDGPU_UCODE_ID_SE3_TAP_DELAYS:=40): 'AMDGPU_UCODE_ID_SE3_TAP_DELAYS', (AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL:=41): 'AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL', (AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM:=42): 'AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM', (AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM:=43): 'AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM', (AMDGPU_UCODE_ID_RLC_IRAM:=44): 'AMDGPU_UCODE_ID_RLC_IRAM', (AMDGPU_UCODE_ID_RLC_DRAM:=45): 'AMDGPU_UCODE_ID_RLC_DRAM', (AMDGPU_UCODE_ID_RLC_P:=46): 'AMDGPU_UCODE_ID_RLC_P', (AMDGPU_UCODE_ID_RLC_V:=47): 'AMDGPU_UCODE_ID_RLC_V', (AMDGPU_UCODE_ID_RLC_G:=48): 'AMDGPU_UCODE_ID_RLC_G', (AMDGPU_UCODE_ID_STORAGE:=49): 'AMDGPU_UCODE_ID_STORAGE', (AMDGPU_UCODE_ID_SMC:=50): 'AMDGPU_UCODE_ID_SMC', (AMDGPU_UCODE_ID_PPTABLE:=51): 'AMDGPU_UCODE_ID_PPTABLE', (AMDGPU_UCODE_ID_UVD:=52): 'AMDGPU_UCODE_ID_UVD', (AMDGPU_UCODE_ID_UVD1:=53): 'AMDGPU_UCODE_ID_UVD1', (AMDGPU_UCODE_ID_VCE:=54): 'AMDGPU_UCODE_ID_VCE', (AMDGPU_UCODE_ID_VCN:=55): 'AMDGPU_UCODE_ID_VCN', (AMDGPU_UCODE_ID_VCN1:=56): 'AMDGPU_UCODE_ID_VCN1', (AMDGPU_UCODE_ID_DMCU_ERAM:=57): 'AMDGPU_UCODE_ID_DMCU_ERAM', (AMDGPU_UCODE_ID_DMCU_INTV:=58): 'AMDGPU_UCODE_ID_DMCU_INTV', (AMDGPU_UCODE_ID_VCN0_RAM:=59): 'AMDGPU_UCODE_ID_VCN0_RAM', (AMDGPU_UCODE_ID_VCN1_RAM:=60): 'AMDGPU_UCODE_ID_VCN1_RAM', (AMDGPU_UCODE_ID_DMCUB:=61): 'AMDGPU_UCODE_ID_DMCUB', (AMDGPU_UCODE_ID_VPE_CTX:=62): 'AMDGPU_UCODE_ID_VPE_CTX', (AMDGPU_UCODE_ID_VPE_CTL:=63): 'AMDGPU_UCODE_ID_VPE_CTL', (AMDGPU_UCODE_ID_VPE:=64): 'AMDGPU_UCODE_ID_VPE', (AMDGPU_UCODE_ID_UMSCH_MM_UCODE:=65): 'AMDGPU_UCODE_ID_UMSCH_MM_UCODE', (AMDGPU_UCODE_ID_UMSCH_MM_DATA:=66): 'AMDGPU_UCODE_ID_UMSCH_MM_DATA', (AMDGPU_UCODE_ID_UMSCH_MM_CMD_BUFFER:=67): 'AMDGPU_UCODE_ID_UMSCH_MM_CMD_BUFFER', (AMDGPU_UCODE_ID_P2S_TABLE:=68): 'AMDGPU_UCODE_ID_P2S_TABLE', (AMDGPU_UCODE_ID_JPEG_RAM:=69): 'AMDGPU_UCODE_ID_JPEG_RAM', (AMDGPU_UCODE_ID_ISP:=70): 'AMDGPU_UCODE_ID_ISP', (AMDGPU_UCODE_ID_MAXIMUM:=71): 'AMDGPU_UCODE_ID_MAXIMUM'} +enum_AMDGPU_UCODE_STATUS: dict[int, str] = {(AMDGPU_UCODE_STATUS_INVALID:=0): 'AMDGPU_UCODE_STATUS_INVALID', (AMDGPU_UCODE_STATUS_NOT_LOADED:=1): 'AMDGPU_UCODE_STATUS_NOT_LOADED', (AMDGPU_UCODE_STATUS_LOADED:=2): 'AMDGPU_UCODE_STATUS_LOADED'} +enum_amdgpu_firmware_load_type: dict[int, str] = {(AMDGPU_FW_LOAD_DIRECT:=0): 'AMDGPU_FW_LOAD_DIRECT', (AMDGPU_FW_LOAD_PSP:=1): 'AMDGPU_FW_LOAD_PSP', (AMDGPU_FW_LOAD_SMU:=2): 'AMDGPU_FW_LOAD_SMU', (AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO:=3): 'AMDGPU_FW_LOAD_RLC_BACKDOOR_AUTO'} +@c.record +class struct_amdgpu_firmware_info(c.Struct): + SIZE = 48 + ucode_id: int + fw: c.POINTER[struct_firmware] + mc_addr: int + kaddr: ctypes.c_void_p + ucode_size: int + tmr_mc_addr_lo: int + tmr_mc_addr_hi: int +class struct_firmware(c.Struct): pass +struct_amdgpu_firmware_info.register_fields([('ucode_id', ctypes.c_uint32, 0), ('fw', c.POINTER[struct_firmware], 8), ('mc_addr', uint64_t, 16), ('kaddr', ctypes.c_void_p, 24), ('ucode_size', uint32_t, 32), ('tmr_mc_addr_lo', uint32_t, 36), ('tmr_mc_addr_hi', uint32_t, 40)]) +enum_psp_gfx_crtl_cmd_id: dict[int, str] = {(GFX_CTRL_CMD_ID_INIT_RBI_RING:=65536): 'GFX_CTRL_CMD_ID_INIT_RBI_RING', (GFX_CTRL_CMD_ID_INIT_GPCOM_RING:=131072): 'GFX_CTRL_CMD_ID_INIT_GPCOM_RING', (GFX_CTRL_CMD_ID_DESTROY_RINGS:=196608): 'GFX_CTRL_CMD_ID_DESTROY_RINGS', (GFX_CTRL_CMD_ID_CAN_INIT_RINGS:=262144): 'GFX_CTRL_CMD_ID_CAN_INIT_RINGS', (GFX_CTRL_CMD_ID_ENABLE_INT:=327680): 'GFX_CTRL_CMD_ID_ENABLE_INT', (GFX_CTRL_CMD_ID_DISABLE_INT:=393216): 'GFX_CTRL_CMD_ID_DISABLE_INT', (GFX_CTRL_CMD_ID_MODE1_RST:=458752): 'GFX_CTRL_CMD_ID_MODE1_RST', (GFX_CTRL_CMD_ID_GBR_IH_SET:=524288): 'GFX_CTRL_CMD_ID_GBR_IH_SET', (GFX_CTRL_CMD_ID_CONSUME_CMD:=589824): 'GFX_CTRL_CMD_ID_CONSUME_CMD', (GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING:=786432): 'GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING', (GFX_CTRL_CMD_ID_MAX:=983040): 'GFX_CTRL_CMD_ID_MAX'} +@c.record +class struct_psp_gfx_ctrl(c.Struct): + SIZE = 32 + cmd_resp: int + rbi_wptr: int + rbi_rptr: int + gpcom_wptr: int + gpcom_rptr: int + ring_addr_lo: int + ring_addr_hi: int + ring_buf_size: int +struct_psp_gfx_ctrl.register_fields([('cmd_resp', ctypes.c_uint32, 0), ('rbi_wptr', ctypes.c_uint32, 4), ('rbi_rptr', ctypes.c_uint32, 8), ('gpcom_wptr', ctypes.c_uint32, 12), ('gpcom_rptr', ctypes.c_uint32, 16), ('ring_addr_lo', ctypes.c_uint32, 20), ('ring_addr_hi', ctypes.c_uint32, 24), ('ring_buf_size', ctypes.c_uint32, 28)]) +enum_psp_gfx_cmd_id: dict[int, str] = {(GFX_CMD_ID_LOAD_TA:=1): 'GFX_CMD_ID_LOAD_TA', (GFX_CMD_ID_UNLOAD_TA:=2): 'GFX_CMD_ID_UNLOAD_TA', (GFX_CMD_ID_INVOKE_CMD:=3): 'GFX_CMD_ID_INVOKE_CMD', (GFX_CMD_ID_LOAD_ASD:=4): 'GFX_CMD_ID_LOAD_ASD', (GFX_CMD_ID_SETUP_TMR:=5): 'GFX_CMD_ID_SETUP_TMR', (GFX_CMD_ID_LOAD_IP_FW:=6): 'GFX_CMD_ID_LOAD_IP_FW', (GFX_CMD_ID_DESTROY_TMR:=7): 'GFX_CMD_ID_DESTROY_TMR', (GFX_CMD_ID_SAVE_RESTORE:=8): 'GFX_CMD_ID_SAVE_RESTORE', (GFX_CMD_ID_SETUP_VMR:=9): 'GFX_CMD_ID_SETUP_VMR', (GFX_CMD_ID_DESTROY_VMR:=10): 'GFX_CMD_ID_DESTROY_VMR', (GFX_CMD_ID_PROG_REG:=11): 'GFX_CMD_ID_PROG_REG', (GFX_CMD_ID_GET_FW_ATTESTATION:=15): 'GFX_CMD_ID_GET_FW_ATTESTATION', (GFX_CMD_ID_LOAD_TOC:=32): 'GFX_CMD_ID_LOAD_TOC', (GFX_CMD_ID_AUTOLOAD_RLC:=33): 'GFX_CMD_ID_AUTOLOAD_RLC', (GFX_CMD_ID_BOOT_CFG:=34): 'GFX_CMD_ID_BOOT_CFG', (GFX_CMD_ID_SRIOV_SPATIAL_PART:=39): 'GFX_CMD_ID_SRIOV_SPATIAL_PART'} +enum_psp_gfx_boot_config_cmd: dict[int, str] = {(BOOTCFG_CMD_SET:=1): 'BOOTCFG_CMD_SET', (BOOTCFG_CMD_GET:=2): 'BOOTCFG_CMD_GET', (BOOTCFG_CMD_INVALIDATE:=3): 'BOOTCFG_CMD_INVALIDATE'} +enum_psp_gfx_boot_config: dict[int, str] = {(BOOT_CONFIG_GECC:=1): 'BOOT_CONFIG_GECC'} +@c.record +class struct_psp_gfx_cmd_load_ta(c.Struct): + SIZE = 24 + app_phy_addr_lo: int + app_phy_addr_hi: int + app_len: int + cmd_buf_phy_addr_lo: int + cmd_buf_phy_addr_hi: int + cmd_buf_len: int +struct_psp_gfx_cmd_load_ta.register_fields([('app_phy_addr_lo', ctypes.c_uint32, 0), ('app_phy_addr_hi', ctypes.c_uint32, 4), ('app_len', ctypes.c_uint32, 8), ('cmd_buf_phy_addr_lo', ctypes.c_uint32, 12), ('cmd_buf_phy_addr_hi', ctypes.c_uint32, 16), ('cmd_buf_len', ctypes.c_uint32, 20)]) +@c.record +class struct_psp_gfx_cmd_unload_ta(c.Struct): + SIZE = 4 + session_id: int +struct_psp_gfx_cmd_unload_ta.register_fields([('session_id', ctypes.c_uint32, 0)]) +@c.record +class struct_psp_gfx_buf_desc(c.Struct): + SIZE = 12 + buf_phy_addr_lo: int + buf_phy_addr_hi: int + buf_size: int +struct_psp_gfx_buf_desc.register_fields([('buf_phy_addr_lo', ctypes.c_uint32, 0), ('buf_phy_addr_hi', ctypes.c_uint32, 4), ('buf_size', ctypes.c_uint32, 8)]) +@c.record +class struct_psp_gfx_buf_list(c.Struct): + SIZE = 776 + num_desc: int + total_size: int + buf_desc: c.Array[struct_psp_gfx_buf_desc, Literal[64]] +struct_psp_gfx_buf_list.register_fields([('num_desc', ctypes.c_uint32, 0), ('total_size', ctypes.c_uint32, 4), ('buf_desc', c.Array[struct_psp_gfx_buf_desc, Literal[64]], 8)]) +@c.record +class struct_psp_gfx_cmd_invoke_cmd(c.Struct): + SIZE = 784 + session_id: int + ta_cmd_id: int + buf: struct_psp_gfx_buf_list +struct_psp_gfx_cmd_invoke_cmd.register_fields([('session_id', ctypes.c_uint32, 0), ('ta_cmd_id', ctypes.c_uint32, 4), ('buf', struct_psp_gfx_buf_list, 8)]) +@c.record +class struct_psp_gfx_cmd_setup_tmr(c.Struct): + SIZE = 24 + buf_phy_addr_lo: int + buf_phy_addr_hi: int + buf_size: int + bitfield: struct_psp_gfx_cmd_setup_tmr_bitfield + tmr_flags: int + system_phy_addr_lo: int + system_phy_addr_hi: int +@c.record +class struct_psp_gfx_cmd_setup_tmr_bitfield(c.Struct): + SIZE = 4 + sriov_enabled: int + virt_phy_addr: int + reserved: int +struct_psp_gfx_cmd_setup_tmr_bitfield.register_fields([('sriov_enabled', ctypes.c_uint32, 0, 1, 0), ('virt_phy_addr', ctypes.c_uint32, 0, 1, 1), ('reserved', ctypes.c_uint32, 0, 30, 2)]) +struct_psp_gfx_cmd_setup_tmr.register_fields([('buf_phy_addr_lo', ctypes.c_uint32, 0), ('buf_phy_addr_hi', ctypes.c_uint32, 4), ('buf_size', ctypes.c_uint32, 8), ('bitfield', struct_psp_gfx_cmd_setup_tmr_bitfield, 12), ('tmr_flags', ctypes.c_uint32, 12), ('system_phy_addr_lo', ctypes.c_uint32, 16), ('system_phy_addr_hi', ctypes.c_uint32, 20)]) +enum_psp_gfx_fw_type: dict[int, str] = {(GFX_FW_TYPE_NONE:=0): 'GFX_FW_TYPE_NONE', (GFX_FW_TYPE_CP_ME:=1): 'GFX_FW_TYPE_CP_ME', (GFX_FW_TYPE_CP_PFP:=2): 'GFX_FW_TYPE_CP_PFP', (GFX_FW_TYPE_CP_CE:=3): 'GFX_FW_TYPE_CP_CE', (GFX_FW_TYPE_CP_MEC:=4): 'GFX_FW_TYPE_CP_MEC', (GFX_FW_TYPE_CP_MEC_ME1:=5): 'GFX_FW_TYPE_CP_MEC_ME1', (GFX_FW_TYPE_CP_MEC_ME2:=6): 'GFX_FW_TYPE_CP_MEC_ME2', (GFX_FW_TYPE_RLC_V:=7): 'GFX_FW_TYPE_RLC_V', (GFX_FW_TYPE_RLC_G:=8): 'GFX_FW_TYPE_RLC_G', (GFX_FW_TYPE_SDMA0:=9): 'GFX_FW_TYPE_SDMA0', (GFX_FW_TYPE_SDMA1:=10): 'GFX_FW_TYPE_SDMA1', (GFX_FW_TYPE_DMCU_ERAM:=11): 'GFX_FW_TYPE_DMCU_ERAM', (GFX_FW_TYPE_DMCU_ISR:=12): 'GFX_FW_TYPE_DMCU_ISR', (GFX_FW_TYPE_VCN:=13): 'GFX_FW_TYPE_VCN', (GFX_FW_TYPE_UVD:=14): 'GFX_FW_TYPE_UVD', (GFX_FW_TYPE_VCE:=15): 'GFX_FW_TYPE_VCE', (GFX_FW_TYPE_ISP:=16): 'GFX_FW_TYPE_ISP', (GFX_FW_TYPE_ACP:=17): 'GFX_FW_TYPE_ACP', (GFX_FW_TYPE_SMU:=18): 'GFX_FW_TYPE_SMU', (GFX_FW_TYPE_MMSCH:=19): 'GFX_FW_TYPE_MMSCH', (GFX_FW_TYPE_RLC_RESTORE_LIST_GPM_MEM:=20): 'GFX_FW_TYPE_RLC_RESTORE_LIST_GPM_MEM', (GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM:=21): 'GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_MEM', (GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_CNTL:=22): 'GFX_FW_TYPE_RLC_RESTORE_LIST_SRM_CNTL', (GFX_FW_TYPE_UVD1:=23): 'GFX_FW_TYPE_UVD1', (GFX_FW_TYPE_TOC:=24): 'GFX_FW_TYPE_TOC', (GFX_FW_TYPE_RLC_P:=25): 'GFX_FW_TYPE_RLC_P', (GFX_FW_TYPE_RLC_IRAM:=26): 'GFX_FW_TYPE_RLC_IRAM', (GFX_FW_TYPE_GLOBAL_TAP_DELAYS:=27): 'GFX_FW_TYPE_GLOBAL_TAP_DELAYS', (GFX_FW_TYPE_SE0_TAP_DELAYS:=28): 'GFX_FW_TYPE_SE0_TAP_DELAYS', (GFX_FW_TYPE_SE1_TAP_DELAYS:=29): 'GFX_FW_TYPE_SE1_TAP_DELAYS', (GFX_FW_TYPE_GLOBAL_SE0_SE1_SKEW_DELAYS:=30): 'GFX_FW_TYPE_GLOBAL_SE0_SE1_SKEW_DELAYS', (GFX_FW_TYPE_SDMA0_JT:=31): 'GFX_FW_TYPE_SDMA0_JT', (GFX_FW_TYPE_SDMA1_JT:=32): 'GFX_FW_TYPE_SDMA1_JT', (GFX_FW_TYPE_CP_MES:=33): 'GFX_FW_TYPE_CP_MES', (GFX_FW_TYPE_MES_STACK:=34): 'GFX_FW_TYPE_MES_STACK', (GFX_FW_TYPE_RLC_SRM_DRAM_SR:=35): 'GFX_FW_TYPE_RLC_SRM_DRAM_SR', (GFX_FW_TYPE_RLCG_SCRATCH_SR:=36): 'GFX_FW_TYPE_RLCG_SCRATCH_SR', (GFX_FW_TYPE_RLCP_SCRATCH_SR:=37): 'GFX_FW_TYPE_RLCP_SCRATCH_SR', (GFX_FW_TYPE_RLCV_SCRATCH_SR:=38): 'GFX_FW_TYPE_RLCV_SCRATCH_SR', (GFX_FW_TYPE_RLX6_DRAM_SR:=39): 'GFX_FW_TYPE_RLX6_DRAM_SR', (GFX_FW_TYPE_SDMA0_PG_CONTEXT:=40): 'GFX_FW_TYPE_SDMA0_PG_CONTEXT', (GFX_FW_TYPE_SDMA1_PG_CONTEXT:=41): 'GFX_FW_TYPE_SDMA1_PG_CONTEXT', (GFX_FW_TYPE_GLOBAL_MUX_SELECT_RAM:=42): 'GFX_FW_TYPE_GLOBAL_MUX_SELECT_RAM', (GFX_FW_TYPE_SE0_MUX_SELECT_RAM:=43): 'GFX_FW_TYPE_SE0_MUX_SELECT_RAM', (GFX_FW_TYPE_SE1_MUX_SELECT_RAM:=44): 'GFX_FW_TYPE_SE1_MUX_SELECT_RAM', (GFX_FW_TYPE_ACCUM_CTRL_RAM:=45): 'GFX_FW_TYPE_ACCUM_CTRL_RAM', (GFX_FW_TYPE_RLCP_CAM:=46): 'GFX_FW_TYPE_RLCP_CAM', (GFX_FW_TYPE_RLC_SPP_CAM_EXT:=47): 'GFX_FW_TYPE_RLC_SPP_CAM_EXT', (GFX_FW_TYPE_RLC_DRAM_BOOT:=48): 'GFX_FW_TYPE_RLC_DRAM_BOOT', (GFX_FW_TYPE_VCN0_RAM:=49): 'GFX_FW_TYPE_VCN0_RAM', (GFX_FW_TYPE_VCN1_RAM:=50): 'GFX_FW_TYPE_VCN1_RAM', (GFX_FW_TYPE_DMUB:=51): 'GFX_FW_TYPE_DMUB', (GFX_FW_TYPE_SDMA2:=52): 'GFX_FW_TYPE_SDMA2', (GFX_FW_TYPE_SDMA3:=53): 'GFX_FW_TYPE_SDMA3', (GFX_FW_TYPE_SDMA4:=54): 'GFX_FW_TYPE_SDMA4', (GFX_FW_TYPE_SDMA5:=55): 'GFX_FW_TYPE_SDMA5', (GFX_FW_TYPE_SDMA6:=56): 'GFX_FW_TYPE_SDMA6', (GFX_FW_TYPE_SDMA7:=57): 'GFX_FW_TYPE_SDMA7', (GFX_FW_TYPE_VCN1:=58): 'GFX_FW_TYPE_VCN1', (GFX_FW_TYPE_CAP:=62): 'GFX_FW_TYPE_CAP', (GFX_FW_TYPE_SE2_TAP_DELAYS:=65): 'GFX_FW_TYPE_SE2_TAP_DELAYS', (GFX_FW_TYPE_SE3_TAP_DELAYS:=66): 'GFX_FW_TYPE_SE3_TAP_DELAYS', (GFX_FW_TYPE_REG_LIST:=67): 'GFX_FW_TYPE_REG_LIST', (GFX_FW_TYPE_IMU_I:=68): 'GFX_FW_TYPE_IMU_I', (GFX_FW_TYPE_IMU_D:=69): 'GFX_FW_TYPE_IMU_D', (GFX_FW_TYPE_LSDMA:=70): 'GFX_FW_TYPE_LSDMA', (GFX_FW_TYPE_SDMA_UCODE_TH0:=71): 'GFX_FW_TYPE_SDMA_UCODE_TH0', (GFX_FW_TYPE_SDMA_UCODE_TH1:=72): 'GFX_FW_TYPE_SDMA_UCODE_TH1', (GFX_FW_TYPE_PPTABLE:=73): 'GFX_FW_TYPE_PPTABLE', (GFX_FW_TYPE_DISCRETE_USB4:=74): 'GFX_FW_TYPE_DISCRETE_USB4', (GFX_FW_TYPE_TA:=75): 'GFX_FW_TYPE_TA', (GFX_FW_TYPE_RS64_MES:=76): 'GFX_FW_TYPE_RS64_MES', (GFX_FW_TYPE_RS64_MES_STACK:=77): 'GFX_FW_TYPE_RS64_MES_STACK', (GFX_FW_TYPE_RS64_KIQ:=78): 'GFX_FW_TYPE_RS64_KIQ', (GFX_FW_TYPE_RS64_KIQ_STACK:=79): 'GFX_FW_TYPE_RS64_KIQ_STACK', (GFX_FW_TYPE_ISP_DATA:=80): 'GFX_FW_TYPE_ISP_DATA', (GFX_FW_TYPE_CP_MES_KIQ:=81): 'GFX_FW_TYPE_CP_MES_KIQ', (GFX_FW_TYPE_MES_KIQ_STACK:=82): 'GFX_FW_TYPE_MES_KIQ_STACK', (GFX_FW_TYPE_UMSCH_DATA:=83): 'GFX_FW_TYPE_UMSCH_DATA', (GFX_FW_TYPE_UMSCH_UCODE:=84): 'GFX_FW_TYPE_UMSCH_UCODE', (GFX_FW_TYPE_UMSCH_CMD_BUFFER:=85): 'GFX_FW_TYPE_UMSCH_CMD_BUFFER', (GFX_FW_TYPE_USB_DP_COMBO_PHY:=86): 'GFX_FW_TYPE_USB_DP_COMBO_PHY', (GFX_FW_TYPE_RS64_PFP:=87): 'GFX_FW_TYPE_RS64_PFP', (GFX_FW_TYPE_RS64_ME:=88): 'GFX_FW_TYPE_RS64_ME', (GFX_FW_TYPE_RS64_MEC:=89): 'GFX_FW_TYPE_RS64_MEC', (GFX_FW_TYPE_RS64_PFP_P0_STACK:=90): 'GFX_FW_TYPE_RS64_PFP_P0_STACK', (GFX_FW_TYPE_RS64_PFP_P1_STACK:=91): 'GFX_FW_TYPE_RS64_PFP_P1_STACK', (GFX_FW_TYPE_RS64_ME_P0_STACK:=92): 'GFX_FW_TYPE_RS64_ME_P0_STACK', (GFX_FW_TYPE_RS64_ME_P1_STACK:=93): 'GFX_FW_TYPE_RS64_ME_P1_STACK', (GFX_FW_TYPE_RS64_MEC_P0_STACK:=94): 'GFX_FW_TYPE_RS64_MEC_P0_STACK', (GFX_FW_TYPE_RS64_MEC_P1_STACK:=95): 'GFX_FW_TYPE_RS64_MEC_P1_STACK', (GFX_FW_TYPE_RS64_MEC_P2_STACK:=96): 'GFX_FW_TYPE_RS64_MEC_P2_STACK', (GFX_FW_TYPE_RS64_MEC_P3_STACK:=97): 'GFX_FW_TYPE_RS64_MEC_P3_STACK', (GFX_FW_TYPE_VPEC_FW1:=100): 'GFX_FW_TYPE_VPEC_FW1', (GFX_FW_TYPE_VPEC_FW2:=101): 'GFX_FW_TYPE_VPEC_FW2', (GFX_FW_TYPE_VPE:=102): 'GFX_FW_TYPE_VPE', (GFX_FW_TYPE_JPEG_RAM:=128): 'GFX_FW_TYPE_JPEG_RAM', (GFX_FW_TYPE_P2S_TABLE:=129): 'GFX_FW_TYPE_P2S_TABLE', (GFX_FW_TYPE_MAX:=130): 'GFX_FW_TYPE_MAX'} +@c.record +class struct_psp_gfx_cmd_load_ip_fw(c.Struct): + SIZE = 16 + fw_phy_addr_lo: int + fw_phy_addr_hi: int + fw_size: int + fw_type: int +struct_psp_gfx_cmd_load_ip_fw.register_fields([('fw_phy_addr_lo', ctypes.c_uint32, 0), ('fw_phy_addr_hi', ctypes.c_uint32, 4), ('fw_size', ctypes.c_uint32, 8), ('fw_type', ctypes.c_uint32, 12)]) +@c.record +class struct_psp_gfx_cmd_save_restore_ip_fw(c.Struct): + SIZE = 20 + save_fw: int + save_restore_addr_lo: int + save_restore_addr_hi: int + buf_size: int + fw_type: int +struct_psp_gfx_cmd_save_restore_ip_fw.register_fields([('save_fw', ctypes.c_uint32, 0), ('save_restore_addr_lo', ctypes.c_uint32, 4), ('save_restore_addr_hi', ctypes.c_uint32, 8), ('buf_size', ctypes.c_uint32, 12), ('fw_type', ctypes.c_uint32, 16)]) +@c.record +class struct_psp_gfx_cmd_reg_prog(c.Struct): + SIZE = 8 + reg_value: int + reg_id: int +struct_psp_gfx_cmd_reg_prog.register_fields([('reg_value', ctypes.c_uint32, 0), ('reg_id', ctypes.c_uint32, 4)]) +@c.record +class struct_psp_gfx_cmd_load_toc(c.Struct): + SIZE = 12 + toc_phy_addr_lo: int + toc_phy_addr_hi: int + toc_size: int +struct_psp_gfx_cmd_load_toc.register_fields([('toc_phy_addr_lo', ctypes.c_uint32, 0), ('toc_phy_addr_hi', ctypes.c_uint32, 4), ('toc_size', ctypes.c_uint32, 8)]) +@c.record +class struct_psp_gfx_cmd_boot_cfg(c.Struct): + SIZE = 16 + timestamp: int + sub_cmd: int + boot_config: int + boot_config_valid: int +struct_psp_gfx_cmd_boot_cfg.register_fields([('timestamp', ctypes.c_uint32, 0), ('sub_cmd', ctypes.c_uint32, 4), ('boot_config', ctypes.c_uint32, 8), ('boot_config_valid', ctypes.c_uint32, 12)]) +@c.record +class struct_psp_gfx_cmd_sriov_spatial_part(c.Struct): + SIZE = 16 + mode: int + override_ips: int + override_xcds_avail: int + override_this_aid: int +struct_psp_gfx_cmd_sriov_spatial_part.register_fields([('mode', ctypes.c_uint32, 0), ('override_ips', ctypes.c_uint32, 4), ('override_xcds_avail', ctypes.c_uint32, 8), ('override_this_aid', ctypes.c_uint32, 12)]) +@c.record +class union_psp_gfx_commands(c.Struct): + SIZE = 784 + cmd_load_ta: struct_psp_gfx_cmd_load_ta + cmd_unload_ta: struct_psp_gfx_cmd_unload_ta + cmd_invoke_cmd: struct_psp_gfx_cmd_invoke_cmd + cmd_setup_tmr: struct_psp_gfx_cmd_setup_tmr + cmd_load_ip_fw: struct_psp_gfx_cmd_load_ip_fw + cmd_save_restore_ip_fw: struct_psp_gfx_cmd_save_restore_ip_fw + cmd_setup_reg_prog: struct_psp_gfx_cmd_reg_prog + cmd_setup_vmr: struct_psp_gfx_cmd_setup_tmr + cmd_load_toc: struct_psp_gfx_cmd_load_toc + boot_cfg: struct_psp_gfx_cmd_boot_cfg + cmd_spatial_part: struct_psp_gfx_cmd_sriov_spatial_part +union_psp_gfx_commands.register_fields([('cmd_load_ta', struct_psp_gfx_cmd_load_ta, 0), ('cmd_unload_ta', struct_psp_gfx_cmd_unload_ta, 0), ('cmd_invoke_cmd', struct_psp_gfx_cmd_invoke_cmd, 0), ('cmd_setup_tmr', struct_psp_gfx_cmd_setup_tmr, 0), ('cmd_load_ip_fw', struct_psp_gfx_cmd_load_ip_fw, 0), ('cmd_save_restore_ip_fw', struct_psp_gfx_cmd_save_restore_ip_fw, 0), ('cmd_setup_reg_prog', struct_psp_gfx_cmd_reg_prog, 0), ('cmd_setup_vmr', struct_psp_gfx_cmd_setup_tmr, 0), ('cmd_load_toc', struct_psp_gfx_cmd_load_toc, 0), ('boot_cfg', struct_psp_gfx_cmd_boot_cfg, 0), ('cmd_spatial_part', struct_psp_gfx_cmd_sriov_spatial_part, 0)]) +@c.record +class struct_psp_gfx_uresp_reserved(c.Struct): + SIZE = 32 + reserved: c.Array[ctypes.c_uint32, Literal[8]] +struct_psp_gfx_uresp_reserved.register_fields([('reserved', c.Array[ctypes.c_uint32, Literal[8]], 0)]) +@c.record +class struct_psp_gfx_uresp_fwar_db_info(c.Struct): + SIZE = 8 + fwar_db_addr_lo: int + fwar_db_addr_hi: int +struct_psp_gfx_uresp_fwar_db_info.register_fields([('fwar_db_addr_lo', ctypes.c_uint32, 0), ('fwar_db_addr_hi', ctypes.c_uint32, 4)]) +@c.record +class struct_psp_gfx_uresp_bootcfg(c.Struct): + SIZE = 4 + boot_cfg: int +struct_psp_gfx_uresp_bootcfg.register_fields([('boot_cfg', ctypes.c_uint32, 0)]) +@c.record +class union_psp_gfx_uresp(c.Struct): + SIZE = 32 + reserved: struct_psp_gfx_uresp_reserved + boot_cfg: struct_psp_gfx_uresp_bootcfg + fwar_db_info: struct_psp_gfx_uresp_fwar_db_info +union_psp_gfx_uresp.register_fields([('reserved', struct_psp_gfx_uresp_reserved, 0), ('boot_cfg', struct_psp_gfx_uresp_bootcfg, 0), ('fwar_db_info', struct_psp_gfx_uresp_fwar_db_info, 0)]) +@c.record +class struct_psp_gfx_resp(c.Struct): + SIZE = 96 + status: int + session_id: int + fw_addr_lo: int + fw_addr_hi: int + tmr_size: int + reserved: c.Array[ctypes.c_uint32, Literal[11]] + uresp: union_psp_gfx_uresp +struct_psp_gfx_resp.register_fields([('status', ctypes.c_uint32, 0), ('session_id', ctypes.c_uint32, 4), ('fw_addr_lo', ctypes.c_uint32, 8), ('fw_addr_hi', ctypes.c_uint32, 12), ('tmr_size', ctypes.c_uint32, 16), ('reserved', c.Array[ctypes.c_uint32, Literal[11]], 20), ('uresp', union_psp_gfx_uresp, 64)]) +@c.record +class struct_psp_gfx_cmd_resp(c.Struct): + SIZE = 1024 + buf_size: int + buf_version: int + cmd_id: int + resp_buf_addr_lo: int + resp_buf_addr_hi: int + resp_offset: int + resp_buf_size: int + cmd: union_psp_gfx_commands + reserved_1: c.Array[ctypes.c_ubyte, Literal[52]] + resp: struct_psp_gfx_resp + reserved_2: c.Array[ctypes.c_ubyte, Literal[64]] +struct_psp_gfx_cmd_resp.register_fields([('buf_size', ctypes.c_uint32, 0), ('buf_version', ctypes.c_uint32, 4), ('cmd_id', ctypes.c_uint32, 8), ('resp_buf_addr_lo', ctypes.c_uint32, 12), ('resp_buf_addr_hi', ctypes.c_uint32, 16), ('resp_offset', ctypes.c_uint32, 20), ('resp_buf_size', ctypes.c_uint32, 24), ('cmd', union_psp_gfx_commands, 28), ('reserved_1', c.Array[ctypes.c_ubyte, Literal[52]], 812), ('resp', struct_psp_gfx_resp, 864), ('reserved_2', c.Array[ctypes.c_ubyte, Literal[64]], 960)]) +@c.record +class struct_psp_gfx_rb_frame(c.Struct): + SIZE = 64 + cmd_buf_addr_lo: int + cmd_buf_addr_hi: int + cmd_buf_size: int + fence_addr_lo: int + fence_addr_hi: int + fence_value: int + sid_lo: int + sid_hi: int + vmid: int + frame_type: int + reserved1: c.Array[ctypes.c_ubyte, Literal[2]] + reserved2: c.Array[ctypes.c_uint32, Literal[7]] +struct_psp_gfx_rb_frame.register_fields([('cmd_buf_addr_lo', ctypes.c_uint32, 0), ('cmd_buf_addr_hi', ctypes.c_uint32, 4), ('cmd_buf_size', ctypes.c_uint32, 8), ('fence_addr_lo', ctypes.c_uint32, 12), ('fence_addr_hi', ctypes.c_uint32, 16), ('fence_value', ctypes.c_uint32, 20), ('sid_lo', ctypes.c_uint32, 24), ('sid_hi', ctypes.c_uint32, 28), ('vmid', ctypes.c_ubyte, 32), ('frame_type', ctypes.c_ubyte, 33), ('reserved1', c.Array[ctypes.c_ubyte, Literal[2]], 34), ('reserved2', c.Array[ctypes.c_uint32, Literal[7]], 36)]) +enum_tee_error_code: dict[int, str] = {(TEE_SUCCESS:=0): 'TEE_SUCCESS', (TEE_ERROR_NOT_SUPPORTED:=4294901770): 'TEE_ERROR_NOT_SUPPORTED'} +enum_psp_shared_mem_size: dict[int, str] = {(PSP_ASD_SHARED_MEM_SIZE:=0): 'PSP_ASD_SHARED_MEM_SIZE', (PSP_XGMI_SHARED_MEM_SIZE:=16384): 'PSP_XGMI_SHARED_MEM_SIZE', (PSP_RAS_SHARED_MEM_SIZE:=16384): 'PSP_RAS_SHARED_MEM_SIZE', (PSP_HDCP_SHARED_MEM_SIZE:=16384): 'PSP_HDCP_SHARED_MEM_SIZE', (PSP_DTM_SHARED_MEM_SIZE:=16384): 'PSP_DTM_SHARED_MEM_SIZE', (PSP_RAP_SHARED_MEM_SIZE:=16384): 'PSP_RAP_SHARED_MEM_SIZE', (PSP_SECUREDISPLAY_SHARED_MEM_SIZE:=16384): 'PSP_SECUREDISPLAY_SHARED_MEM_SIZE'} +enum_ta_type_id: dict[int, str] = {(TA_TYPE_XGMI:=1): 'TA_TYPE_XGMI', (TA_TYPE_RAS:=2): 'TA_TYPE_RAS', (TA_TYPE_HDCP:=3): 'TA_TYPE_HDCP', (TA_TYPE_DTM:=4): 'TA_TYPE_DTM', (TA_TYPE_RAP:=5): 'TA_TYPE_RAP', (TA_TYPE_SECUREDISPLAY:=6): 'TA_TYPE_SECUREDISPLAY', (TA_TYPE_MAX_INDEX:=7): 'TA_TYPE_MAX_INDEX'} +class struct_psp_context(c.Struct): pass +class struct_psp_xgmi_node_info(c.Struct): pass +class struct_psp_xgmi_topology_info(c.Struct): pass +class struct_psp_bin_desc(c.Struct): pass +enum_psp_bootloader_cmd: dict[int, str] = {(PSP_BL__LOAD_SYSDRV:=65536): 'PSP_BL__LOAD_SYSDRV', (PSP_BL__LOAD_SOSDRV:=131072): 'PSP_BL__LOAD_SOSDRV', (PSP_BL__LOAD_KEY_DATABASE:=524288): 'PSP_BL__LOAD_KEY_DATABASE', (PSP_BL__LOAD_SOCDRV:=720896): 'PSP_BL__LOAD_SOCDRV', (PSP_BL__LOAD_DBGDRV:=786432): 'PSP_BL__LOAD_DBGDRV', (PSP_BL__LOAD_HADDRV:=786432): 'PSP_BL__LOAD_HADDRV', (PSP_BL__LOAD_INTFDRV:=851968): 'PSP_BL__LOAD_INTFDRV', (PSP_BL__LOAD_RASDRV:=917504): 'PSP_BL__LOAD_RASDRV', (PSP_BL__LOAD_IPKEYMGRDRV:=983040): 'PSP_BL__LOAD_IPKEYMGRDRV', (PSP_BL__DRAM_LONG_TRAIN:=1048576): 'PSP_BL__DRAM_LONG_TRAIN', (PSP_BL__DRAM_SHORT_TRAIN:=2097152): 'PSP_BL__DRAM_SHORT_TRAIN', (PSP_BL__LOAD_TOS_SPL_TABLE:=268435456): 'PSP_BL__LOAD_TOS_SPL_TABLE'} +enum_psp_ring_type: dict[int, str] = {(PSP_RING_TYPE__INVALID:=0): 'PSP_RING_TYPE__INVALID', (PSP_RING_TYPE__UM:=1): 'PSP_RING_TYPE__UM', (PSP_RING_TYPE__KM:=2): 'PSP_RING_TYPE__KM'} +enum_psp_reg_prog_id: dict[int, str] = {(PSP_REG_IH_RB_CNTL:=0): 'PSP_REG_IH_RB_CNTL', (PSP_REG_IH_RB_CNTL_RING1:=1): 'PSP_REG_IH_RB_CNTL_RING1', (PSP_REG_IH_RB_CNTL_RING2:=2): 'PSP_REG_IH_RB_CNTL_RING2', (PSP_REG_LAST:=3): 'PSP_REG_LAST'} +enum_psp_memory_training_init_flag: dict[int, str] = {(PSP_MEM_TRAIN_NOT_SUPPORT:=0): 'PSP_MEM_TRAIN_NOT_SUPPORT', (PSP_MEM_TRAIN_SUPPORT:=1): 'PSP_MEM_TRAIN_SUPPORT', (PSP_MEM_TRAIN_INIT_FAILED:=2): 'PSP_MEM_TRAIN_INIT_FAILED', (PSP_MEM_TRAIN_RESERVE_SUCCESS:=4): 'PSP_MEM_TRAIN_RESERVE_SUCCESS', (PSP_MEM_TRAIN_INIT_SUCCESS:=8): 'PSP_MEM_TRAIN_INIT_SUCCESS'} +enum_psp_memory_training_ops: dict[int, str] = {(PSP_MEM_TRAIN_SEND_LONG_MSG:=1): 'PSP_MEM_TRAIN_SEND_LONG_MSG', (PSP_MEM_TRAIN_SAVE:=2): 'PSP_MEM_TRAIN_SAVE', (PSP_MEM_TRAIN_RESTORE:=4): 'PSP_MEM_TRAIN_RESTORE', (PSP_MEM_TRAIN_SEND_SHORT_MSG:=8): 'PSP_MEM_TRAIN_SEND_SHORT_MSG', (PSP_MEM_TRAIN_COLD_BOOT:=1): 'PSP_MEM_TRAIN_COLD_BOOT', (PSP_MEM_TRAIN_RESUME:=8): 'PSP_MEM_TRAIN_RESUME'} +enum_psp_runtime_entry_type: dict[int, str] = {(PSP_RUNTIME_ENTRY_TYPE_INVALID:=0): 'PSP_RUNTIME_ENTRY_TYPE_INVALID', (PSP_RUNTIME_ENTRY_TYPE_TEST:=1): 'PSP_RUNTIME_ENTRY_TYPE_TEST', (PSP_RUNTIME_ENTRY_TYPE_MGPU_COMMON:=2): 'PSP_RUNTIME_ENTRY_TYPE_MGPU_COMMON', (PSP_RUNTIME_ENTRY_TYPE_MGPU_WAFL:=3): 'PSP_RUNTIME_ENTRY_TYPE_MGPU_WAFL', (PSP_RUNTIME_ENTRY_TYPE_MGPU_XGMI:=4): 'PSP_RUNTIME_ENTRY_TYPE_MGPU_XGMI', (PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG:=5): 'PSP_RUNTIME_ENTRY_TYPE_BOOT_CONFIG', (PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS:=6): 'PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS'} +enum_psp_runtime_boot_cfg_feature: dict[int, str] = {(BOOT_CFG_FEATURE_GECC:=1): 'BOOT_CFG_FEATURE_GECC', (BOOT_CFG_FEATURE_TWO_STAGE_DRAM_TRAINING:=2): 'BOOT_CFG_FEATURE_TWO_STAGE_DRAM_TRAINING'} +enum_psp_runtime_scpm_authentication: dict[int, str] = {(SCPM_DISABLE:=0): 'SCPM_DISABLE', (SCPM_ENABLE:=1): 'SCPM_ENABLE', (SCPM_ENABLE_WITH_SCPM_ERR:=2): 'SCPM_ENABLE_WITH_SCPM_ERR'} +class struct_amdgpu_device(c.Struct): pass +enum_amdgpu_interrupt_state: dict[int, str] = {(AMDGPU_IRQ_STATE_DISABLE:=0): 'AMDGPU_IRQ_STATE_DISABLE', (AMDGPU_IRQ_STATE_ENABLE:=1): 'AMDGPU_IRQ_STATE_ENABLE'} +@c.record +class struct_amdgpu_iv_entry(c.Struct): + SIZE = 72 + client_id: int + src_id: int + ring_id: int + vmid: int + vmid_src: int + timestamp: int + timestamp_src: int + pasid: int + node_id: int + src_data: c.Array[ctypes.c_uint32, Literal[4]] + iv_entry: c.POINTER[ctypes.c_uint32] +struct_amdgpu_iv_entry.register_fields([('client_id', ctypes.c_uint32, 0), ('src_id', ctypes.c_uint32, 4), ('ring_id', ctypes.c_uint32, 8), ('vmid', ctypes.c_uint32, 12), ('vmid_src', ctypes.c_uint32, 16), ('timestamp', uint64_t, 24), ('timestamp_src', ctypes.c_uint32, 32), ('pasid', ctypes.c_uint32, 36), ('node_id', ctypes.c_uint32, 40), ('src_data', c.Array[ctypes.c_uint32, Literal[4]], 44), ('iv_entry', c.POINTER[uint32_t], 64)]) +enum_interrupt_node_id_per_aid: dict[int, str] = {(AID0_NODEID:=0): 'AID0_NODEID', (XCD0_NODEID:=1): 'XCD0_NODEID', (XCD1_NODEID:=2): 'XCD1_NODEID', (AID1_NODEID:=4): 'AID1_NODEID', (XCD2_NODEID:=5): 'XCD2_NODEID', (XCD3_NODEID:=6): 'XCD3_NODEID', (AID2_NODEID:=8): 'AID2_NODEID', (XCD4_NODEID:=9): 'XCD4_NODEID', (XCD5_NODEID:=10): 'XCD5_NODEID', (AID3_NODEID:=12): 'AID3_NODEID', (XCD6_NODEID:=13): 'XCD6_NODEID', (XCD7_NODEID:=14): 'XCD7_NODEID', (NODEID_MAX:=15): 'NODEID_MAX'} +enum_AMDGPU_DOORBELL_ASSIGNMENT: dict[int, str] = {(AMDGPU_DOORBELL_KIQ:=0): 'AMDGPU_DOORBELL_KIQ', (AMDGPU_DOORBELL_HIQ:=1): 'AMDGPU_DOORBELL_HIQ', (AMDGPU_DOORBELL_DIQ:=2): 'AMDGPU_DOORBELL_DIQ', (AMDGPU_DOORBELL_MEC_RING0:=16): 'AMDGPU_DOORBELL_MEC_RING0', (AMDGPU_DOORBELL_MEC_RING1:=17): 'AMDGPU_DOORBELL_MEC_RING1', (AMDGPU_DOORBELL_MEC_RING2:=18): 'AMDGPU_DOORBELL_MEC_RING2', (AMDGPU_DOORBELL_MEC_RING3:=19): 'AMDGPU_DOORBELL_MEC_RING3', (AMDGPU_DOORBELL_MEC_RING4:=20): 'AMDGPU_DOORBELL_MEC_RING4', (AMDGPU_DOORBELL_MEC_RING5:=21): 'AMDGPU_DOORBELL_MEC_RING5', (AMDGPU_DOORBELL_MEC_RING6:=22): 'AMDGPU_DOORBELL_MEC_RING6', (AMDGPU_DOORBELL_MEC_RING7:=23): 'AMDGPU_DOORBELL_MEC_RING7', (AMDGPU_DOORBELL_GFX_RING0:=32): 'AMDGPU_DOORBELL_GFX_RING0', (AMDGPU_DOORBELL_sDMA_ENGINE0:=480): 'AMDGPU_DOORBELL_sDMA_ENGINE0', (AMDGPU_DOORBELL_sDMA_ENGINE1:=481): 'AMDGPU_DOORBELL_sDMA_ENGINE1', (AMDGPU_DOORBELL_IH:=488): 'AMDGPU_DOORBELL_IH', (AMDGPU_DOORBELL_MAX_ASSIGNMENT:=1023): 'AMDGPU_DOORBELL_MAX_ASSIGNMENT', (AMDGPU_DOORBELL_INVALID:=65535): 'AMDGPU_DOORBELL_INVALID'} +enum_AMDGPU_VEGA20_DOORBELL_ASSIGNMENT: dict[int, str] = {(AMDGPU_VEGA20_DOORBELL_KIQ:=0): 'AMDGPU_VEGA20_DOORBELL_KIQ', (AMDGPU_VEGA20_DOORBELL_HIQ:=1): 'AMDGPU_VEGA20_DOORBELL_HIQ', (AMDGPU_VEGA20_DOORBELL_DIQ:=2): 'AMDGPU_VEGA20_DOORBELL_DIQ', (AMDGPU_VEGA20_DOORBELL_MEC_RING0:=3): 'AMDGPU_VEGA20_DOORBELL_MEC_RING0', (AMDGPU_VEGA20_DOORBELL_MEC_RING1:=4): 'AMDGPU_VEGA20_DOORBELL_MEC_RING1', (AMDGPU_VEGA20_DOORBELL_MEC_RING2:=5): 'AMDGPU_VEGA20_DOORBELL_MEC_RING2', (AMDGPU_VEGA20_DOORBELL_MEC_RING3:=6): 'AMDGPU_VEGA20_DOORBELL_MEC_RING3', (AMDGPU_VEGA20_DOORBELL_MEC_RING4:=7): 'AMDGPU_VEGA20_DOORBELL_MEC_RING4', (AMDGPU_VEGA20_DOORBELL_MEC_RING5:=8): 'AMDGPU_VEGA20_DOORBELL_MEC_RING5', (AMDGPU_VEGA20_DOORBELL_MEC_RING6:=9): 'AMDGPU_VEGA20_DOORBELL_MEC_RING6', (AMDGPU_VEGA20_DOORBELL_MEC_RING7:=10): 'AMDGPU_VEGA20_DOORBELL_MEC_RING7', (AMDGPU_VEGA20_DOORBELL_USERQUEUE_START:=11): 'AMDGPU_VEGA20_DOORBELL_USERQUEUE_START', (AMDGPU_VEGA20_DOORBELL_USERQUEUE_END:=138): 'AMDGPU_VEGA20_DOORBELL_USERQUEUE_END', (AMDGPU_VEGA20_DOORBELL_GFX_RING0:=139): 'AMDGPU_VEGA20_DOORBELL_GFX_RING0', (AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE0:=256): 'AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE0', (AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE1:=266): 'AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE1', (AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE2:=276): 'AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE2', (AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE3:=286): 'AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE3', (AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE4:=296): 'AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE4', (AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE5:=306): 'AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE5', (AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE6:=316): 'AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE6', (AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE7:=326): 'AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE7', (AMDGPU_VEGA20_DOORBELL_IH:=376): 'AMDGPU_VEGA20_DOORBELL_IH', (AMDGPU_VEGA20_DOORBELL64_VCN0_1:=392): 'AMDGPU_VEGA20_DOORBELL64_VCN0_1', (AMDGPU_VEGA20_DOORBELL64_VCN2_3:=393): 'AMDGPU_VEGA20_DOORBELL64_VCN2_3', (AMDGPU_VEGA20_DOORBELL64_VCN4_5:=394): 'AMDGPU_VEGA20_DOORBELL64_VCN4_5', (AMDGPU_VEGA20_DOORBELL64_VCN6_7:=395): 'AMDGPU_VEGA20_DOORBELL64_VCN6_7', (AMDGPU_VEGA20_DOORBELL64_VCN8_9:=396): 'AMDGPU_VEGA20_DOORBELL64_VCN8_9', (AMDGPU_VEGA20_DOORBELL64_VCNa_b:=397): 'AMDGPU_VEGA20_DOORBELL64_VCNa_b', (AMDGPU_VEGA20_DOORBELL64_VCNc_d:=398): 'AMDGPU_VEGA20_DOORBELL64_VCNc_d', (AMDGPU_VEGA20_DOORBELL64_VCNe_f:=399): 'AMDGPU_VEGA20_DOORBELL64_VCNe_f', (AMDGPU_VEGA20_DOORBELL64_UVD_RING0_1:=392): 'AMDGPU_VEGA20_DOORBELL64_UVD_RING0_1', (AMDGPU_VEGA20_DOORBELL64_UVD_RING2_3:=393): 'AMDGPU_VEGA20_DOORBELL64_UVD_RING2_3', (AMDGPU_VEGA20_DOORBELL64_UVD_RING4_5:=394): 'AMDGPU_VEGA20_DOORBELL64_UVD_RING4_5', (AMDGPU_VEGA20_DOORBELL64_UVD_RING6_7:=395): 'AMDGPU_VEGA20_DOORBELL64_UVD_RING6_7', (AMDGPU_VEGA20_DOORBELL64_VCE_RING0_1:=396): 'AMDGPU_VEGA20_DOORBELL64_VCE_RING0_1', (AMDGPU_VEGA20_DOORBELL64_VCE_RING2_3:=397): 'AMDGPU_VEGA20_DOORBELL64_VCE_RING2_3', (AMDGPU_VEGA20_DOORBELL64_VCE_RING4_5:=398): 'AMDGPU_VEGA20_DOORBELL64_VCE_RING4_5', (AMDGPU_VEGA20_DOORBELL64_VCE_RING6_7:=399): 'AMDGPU_VEGA20_DOORBELL64_VCE_RING6_7', (AMDGPU_VEGA20_DOORBELL64_FIRST_NON_CP:=256): 'AMDGPU_VEGA20_DOORBELL64_FIRST_NON_CP', (AMDGPU_VEGA20_DOORBELL64_LAST_NON_CP:=399): 'AMDGPU_VEGA20_DOORBELL64_LAST_NON_CP', (AMDGPU_VEGA20_DOORBELL_XCC1_KIQ_START:=400): 'AMDGPU_VEGA20_DOORBELL_XCC1_KIQ_START', (AMDGPU_VEGA20_DOORBELL_XCC1_MEC_RING0_START:=407): 'AMDGPU_VEGA20_DOORBELL_XCC1_MEC_RING0_START', (AMDGPU_VEGA20_DOORBELL_AID1_sDMA_START:=464): 'AMDGPU_VEGA20_DOORBELL_AID1_sDMA_START', (AMDGPU_VEGA20_DOORBELL_MAX_ASSIGNMENT:=503): 'AMDGPU_VEGA20_DOORBELL_MAX_ASSIGNMENT', (AMDGPU_VEGA20_DOORBELL_INVALID:=65535): 'AMDGPU_VEGA20_DOORBELL_INVALID'} +enum_AMDGPU_NAVI10_DOORBELL_ASSIGNMENT: dict[int, str] = {(AMDGPU_NAVI10_DOORBELL_KIQ:=0): 'AMDGPU_NAVI10_DOORBELL_KIQ', (AMDGPU_NAVI10_DOORBELL_HIQ:=1): 'AMDGPU_NAVI10_DOORBELL_HIQ', (AMDGPU_NAVI10_DOORBELL_DIQ:=2): 'AMDGPU_NAVI10_DOORBELL_DIQ', (AMDGPU_NAVI10_DOORBELL_MEC_RING0:=3): 'AMDGPU_NAVI10_DOORBELL_MEC_RING0', (AMDGPU_NAVI10_DOORBELL_MEC_RING1:=4): 'AMDGPU_NAVI10_DOORBELL_MEC_RING1', (AMDGPU_NAVI10_DOORBELL_MEC_RING2:=5): 'AMDGPU_NAVI10_DOORBELL_MEC_RING2', (AMDGPU_NAVI10_DOORBELL_MEC_RING3:=6): 'AMDGPU_NAVI10_DOORBELL_MEC_RING3', (AMDGPU_NAVI10_DOORBELL_MEC_RING4:=7): 'AMDGPU_NAVI10_DOORBELL_MEC_RING4', (AMDGPU_NAVI10_DOORBELL_MEC_RING5:=8): 'AMDGPU_NAVI10_DOORBELL_MEC_RING5', (AMDGPU_NAVI10_DOORBELL_MEC_RING6:=9): 'AMDGPU_NAVI10_DOORBELL_MEC_RING6', (AMDGPU_NAVI10_DOORBELL_MEC_RING7:=10): 'AMDGPU_NAVI10_DOORBELL_MEC_RING7', (AMDGPU_NAVI10_DOORBELL_MES_RING0:=11): 'AMDGPU_NAVI10_DOORBELL_MES_RING0', (AMDGPU_NAVI10_DOORBELL_MES_RING1:=12): 'AMDGPU_NAVI10_DOORBELL_MES_RING1', (AMDGPU_NAVI10_DOORBELL_USERQUEUE_START:=13): 'AMDGPU_NAVI10_DOORBELL_USERQUEUE_START', (AMDGPU_NAVI10_DOORBELL_USERQUEUE_END:=138): 'AMDGPU_NAVI10_DOORBELL_USERQUEUE_END', (AMDGPU_NAVI10_DOORBELL_GFX_RING0:=139): 'AMDGPU_NAVI10_DOORBELL_GFX_RING0', (AMDGPU_NAVI10_DOORBELL_GFX_RING1:=140): 'AMDGPU_NAVI10_DOORBELL_GFX_RING1', (AMDGPU_NAVI10_DOORBELL_GFX_USERQUEUE_START:=141): 'AMDGPU_NAVI10_DOORBELL_GFX_USERQUEUE_START', (AMDGPU_NAVI10_DOORBELL_GFX_USERQUEUE_END:=255): 'AMDGPU_NAVI10_DOORBELL_GFX_USERQUEUE_END', (AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0:=256): 'AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0', (AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE1:=266): 'AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE1', (AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE2:=276): 'AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE2', (AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE3:=286): 'AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE3', (AMDGPU_NAVI10_DOORBELL_IH:=376): 'AMDGPU_NAVI10_DOORBELL_IH', (AMDGPU_NAVI10_DOORBELL64_VCN0_1:=392): 'AMDGPU_NAVI10_DOORBELL64_VCN0_1', (AMDGPU_NAVI10_DOORBELL64_VCN2_3:=393): 'AMDGPU_NAVI10_DOORBELL64_VCN2_3', (AMDGPU_NAVI10_DOORBELL64_VCN4_5:=394): 'AMDGPU_NAVI10_DOORBELL64_VCN4_5', (AMDGPU_NAVI10_DOORBELL64_VCN6_7:=395): 'AMDGPU_NAVI10_DOORBELL64_VCN6_7', (AMDGPU_NAVI10_DOORBELL64_VCN8_9:=396): 'AMDGPU_NAVI10_DOORBELL64_VCN8_9', (AMDGPU_NAVI10_DOORBELL64_VCNa_b:=397): 'AMDGPU_NAVI10_DOORBELL64_VCNa_b', (AMDGPU_NAVI10_DOORBELL64_VCNc_d:=398): 'AMDGPU_NAVI10_DOORBELL64_VCNc_d', (AMDGPU_NAVI10_DOORBELL64_VCNe_f:=399): 'AMDGPU_NAVI10_DOORBELL64_VCNe_f', (AMDGPU_NAVI10_DOORBELL64_VPE:=400): 'AMDGPU_NAVI10_DOORBELL64_VPE', (AMDGPU_NAVI10_DOORBELL64_FIRST_NON_CP:=256): 'AMDGPU_NAVI10_DOORBELL64_FIRST_NON_CP', (AMDGPU_NAVI10_DOORBELL64_LAST_NON_CP:=400): 'AMDGPU_NAVI10_DOORBELL64_LAST_NON_CP', (AMDGPU_NAVI10_DOORBELL_MAX_ASSIGNMENT:=400): 'AMDGPU_NAVI10_DOORBELL_MAX_ASSIGNMENT', (AMDGPU_NAVI10_DOORBELL_INVALID:=65535): 'AMDGPU_NAVI10_DOORBELL_INVALID'} +enum_AMDGPU_DOORBELL64_ASSIGNMENT: dict[int, str] = {(AMDGPU_DOORBELL64_KIQ:=0): 'AMDGPU_DOORBELL64_KIQ', (AMDGPU_DOORBELL64_HIQ:=1): 'AMDGPU_DOORBELL64_HIQ', (AMDGPU_DOORBELL64_DIQ:=2): 'AMDGPU_DOORBELL64_DIQ', (AMDGPU_DOORBELL64_MEC_RING0:=3): 'AMDGPU_DOORBELL64_MEC_RING0', (AMDGPU_DOORBELL64_MEC_RING1:=4): 'AMDGPU_DOORBELL64_MEC_RING1', (AMDGPU_DOORBELL64_MEC_RING2:=5): 'AMDGPU_DOORBELL64_MEC_RING2', (AMDGPU_DOORBELL64_MEC_RING3:=6): 'AMDGPU_DOORBELL64_MEC_RING3', (AMDGPU_DOORBELL64_MEC_RING4:=7): 'AMDGPU_DOORBELL64_MEC_RING4', (AMDGPU_DOORBELL64_MEC_RING5:=8): 'AMDGPU_DOORBELL64_MEC_RING5', (AMDGPU_DOORBELL64_MEC_RING6:=9): 'AMDGPU_DOORBELL64_MEC_RING6', (AMDGPU_DOORBELL64_MEC_RING7:=10): 'AMDGPU_DOORBELL64_MEC_RING7', (AMDGPU_DOORBELL64_USERQUEUE_START:=11): 'AMDGPU_DOORBELL64_USERQUEUE_START', (AMDGPU_DOORBELL64_USERQUEUE_END:=138): 'AMDGPU_DOORBELL64_USERQUEUE_END', (AMDGPU_DOORBELL64_GFX_RING0:=139): 'AMDGPU_DOORBELL64_GFX_RING0', (AMDGPU_DOORBELL64_sDMA_ENGINE0:=240): 'AMDGPU_DOORBELL64_sDMA_ENGINE0', (AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE0:=241): 'AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE0', (AMDGPU_DOORBELL64_sDMA_ENGINE1:=242): 'AMDGPU_DOORBELL64_sDMA_ENGINE1', (AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE1:=243): 'AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE1', (AMDGPU_DOORBELL64_IH:=244): 'AMDGPU_DOORBELL64_IH', (AMDGPU_DOORBELL64_IH_RING1:=245): 'AMDGPU_DOORBELL64_IH_RING1', (AMDGPU_DOORBELL64_IH_RING2:=246): 'AMDGPU_DOORBELL64_IH_RING2', (AMDGPU_DOORBELL64_VCN0_1:=248): 'AMDGPU_DOORBELL64_VCN0_1', (AMDGPU_DOORBELL64_VCN2_3:=249): 'AMDGPU_DOORBELL64_VCN2_3', (AMDGPU_DOORBELL64_VCN4_5:=250): 'AMDGPU_DOORBELL64_VCN4_5', (AMDGPU_DOORBELL64_VCN6_7:=251): 'AMDGPU_DOORBELL64_VCN6_7', (AMDGPU_DOORBELL64_UVD_RING0_1:=248): 'AMDGPU_DOORBELL64_UVD_RING0_1', (AMDGPU_DOORBELL64_UVD_RING2_3:=249): 'AMDGPU_DOORBELL64_UVD_RING2_3', (AMDGPU_DOORBELL64_UVD_RING4_5:=250): 'AMDGPU_DOORBELL64_UVD_RING4_5', (AMDGPU_DOORBELL64_UVD_RING6_7:=251): 'AMDGPU_DOORBELL64_UVD_RING6_7', (AMDGPU_DOORBELL64_VCE_RING0_1:=252): 'AMDGPU_DOORBELL64_VCE_RING0_1', (AMDGPU_DOORBELL64_VCE_RING2_3:=253): 'AMDGPU_DOORBELL64_VCE_RING2_3', (AMDGPU_DOORBELL64_VCE_RING4_5:=254): 'AMDGPU_DOORBELL64_VCE_RING4_5', (AMDGPU_DOORBELL64_VCE_RING6_7:=255): 'AMDGPU_DOORBELL64_VCE_RING6_7', (AMDGPU_DOORBELL64_FIRST_NON_CP:=240): 'AMDGPU_DOORBELL64_FIRST_NON_CP', (AMDGPU_DOORBELL64_LAST_NON_CP:=255): 'AMDGPU_DOORBELL64_LAST_NON_CP', (AMDGPU_DOORBELL64_MAX_ASSIGNMENT:=255): 'AMDGPU_DOORBELL64_MAX_ASSIGNMENT', (AMDGPU_DOORBELL64_INVALID:=65535): 'AMDGPU_DOORBELL64_INVALID'} +enum_AMDGPU_DOORBELL_ASSIGNMENT_LAYOUT1: dict[int, str] = {(AMDGPU_DOORBELL_LAYOUT1_KIQ_START:=0): 'AMDGPU_DOORBELL_LAYOUT1_KIQ_START', (AMDGPU_DOORBELL_LAYOUT1_HIQ:=1): 'AMDGPU_DOORBELL_LAYOUT1_HIQ', (AMDGPU_DOORBELL_LAYOUT1_DIQ:=2): 'AMDGPU_DOORBELL_LAYOUT1_DIQ', (AMDGPU_DOORBELL_LAYOUT1_MEC_RING_START:=8): 'AMDGPU_DOORBELL_LAYOUT1_MEC_RING_START', (AMDGPU_DOORBELL_LAYOUT1_MEC_RING_END:=15): 'AMDGPU_DOORBELL_LAYOUT1_MEC_RING_END', (AMDGPU_DOORBELL_LAYOUT1_USERQUEUE_START:=16): 'AMDGPU_DOORBELL_LAYOUT1_USERQUEUE_START', (AMDGPU_DOORBELL_LAYOUT1_USERQUEUE_END:=31): 'AMDGPU_DOORBELL_LAYOUT1_USERQUEUE_END', (AMDGPU_DOORBELL_LAYOUT1_XCC_RANGE:=32): 'AMDGPU_DOORBELL_LAYOUT1_XCC_RANGE', (AMDGPU_DOORBELL_LAYOUT1_sDMA_ENGINE_START:=256): 'AMDGPU_DOORBELL_LAYOUT1_sDMA_ENGINE_START', (AMDGPU_DOORBELL_LAYOUT1_sDMA_ENGINE_END:=415): 'AMDGPU_DOORBELL_LAYOUT1_sDMA_ENGINE_END', (AMDGPU_DOORBELL_LAYOUT1_IH:=416): 'AMDGPU_DOORBELL_LAYOUT1_IH', (AMDGPU_DOORBELL_LAYOUT1_VCN_START:=432): 'AMDGPU_DOORBELL_LAYOUT1_VCN_START', (AMDGPU_DOORBELL_LAYOUT1_VCN_END:=488): 'AMDGPU_DOORBELL_LAYOUT1_VCN_END', (AMDGPU_DOORBELL_LAYOUT1_FIRST_NON_CP:=256): 'AMDGPU_DOORBELL_LAYOUT1_FIRST_NON_CP', (AMDGPU_DOORBELL_LAYOUT1_LAST_NON_CP:=488): 'AMDGPU_DOORBELL_LAYOUT1_LAST_NON_CP', (AMDGPU_DOORBELL_LAYOUT1_MAX_ASSIGNMENT:=488): 'AMDGPU_DOORBELL_LAYOUT1_MAX_ASSIGNMENT', (AMDGPU_DOORBELL_LAYOUT1_INVALID:=65535): 'AMDGPU_DOORBELL_LAYOUT1_INVALID'} +@c.record +class struct_v9_sdma_mqd(c.Struct): + SIZE = 512 + sdmax_rlcx_rb_cntl: int + sdmax_rlcx_rb_base: int + sdmax_rlcx_rb_base_hi: int + sdmax_rlcx_rb_rptr: int + sdmax_rlcx_rb_rptr_hi: int + sdmax_rlcx_rb_wptr: int + sdmax_rlcx_rb_wptr_hi: int + sdmax_rlcx_rb_wptr_poll_cntl: int + sdmax_rlcx_rb_rptr_addr_hi: int + sdmax_rlcx_rb_rptr_addr_lo: int + sdmax_rlcx_ib_cntl: int + sdmax_rlcx_ib_rptr: int + sdmax_rlcx_ib_offset: int + sdmax_rlcx_ib_base_lo: int + sdmax_rlcx_ib_base_hi: int + sdmax_rlcx_ib_size: int + sdmax_rlcx_skip_cntl: int + sdmax_rlcx_context_status: int + sdmax_rlcx_doorbell: int + sdmax_rlcx_status: int + sdmax_rlcx_doorbell_log: int + sdmax_rlcx_watermark: int + sdmax_rlcx_doorbell_offset: int + sdmax_rlcx_csa_addr_lo: int + sdmax_rlcx_csa_addr_hi: int + sdmax_rlcx_ib_sub_remain: int + sdmax_rlcx_preempt: int + sdmax_rlcx_dummy_reg: int + sdmax_rlcx_rb_wptr_poll_addr_hi: int + sdmax_rlcx_rb_wptr_poll_addr_lo: int + sdmax_rlcx_rb_aql_cntl: int + sdmax_rlcx_minor_ptr_update: int + sdmax_rlcx_midcmd_data0: int + sdmax_rlcx_midcmd_data1: int + sdmax_rlcx_midcmd_data2: int + sdmax_rlcx_midcmd_data3: int + sdmax_rlcx_midcmd_data4: int + sdmax_rlcx_midcmd_data5: int + sdmax_rlcx_midcmd_data6: int + sdmax_rlcx_midcmd_data7: int + sdmax_rlcx_midcmd_data8: int + sdmax_rlcx_midcmd_cntl: int + reserved_42: int + reserved_43: int + reserved_44: int + reserved_45: int + reserved_46: int + reserved_47: int + reserved_48: int + reserved_49: int + reserved_50: int + reserved_51: int + reserved_52: int + reserved_53: int + reserved_54: int + reserved_55: int + reserved_56: int + reserved_57: int + reserved_58: int + reserved_59: int + reserved_60: int + reserved_61: int + reserved_62: int + reserved_63: int + reserved_64: int + reserved_65: int + reserved_66: int + reserved_67: int + reserved_68: int + reserved_69: int + reserved_70: int + reserved_71: int + reserved_72: int + reserved_73: int + reserved_74: int + reserved_75: int + reserved_76: int + reserved_77: int + reserved_78: int + reserved_79: int + reserved_80: int + reserved_81: int + reserved_82: int + reserved_83: int + reserved_84: int + reserved_85: int + reserved_86: int + reserved_87: int + reserved_88: int + reserved_89: int + reserved_90: int + reserved_91: int + reserved_92: int + reserved_93: int + reserved_94: int + reserved_95: int + reserved_96: int + reserved_97: int + reserved_98: int + reserved_99: int + reserved_100: int + reserved_101: int + reserved_102: int + reserved_103: int + reserved_104: int + reserved_105: int + reserved_106: int + reserved_107: int + reserved_108: int + reserved_109: int + reserved_110: int + reserved_111: int + reserved_112: int + reserved_113: int + reserved_114: int + reserved_115: int + reserved_116: int + reserved_117: int + reserved_118: int + reserved_119: int + reserved_120: int + reserved_121: int + reserved_122: int + reserved_123: int + reserved_124: int + reserved_125: int + sdma_engine_id: int + sdma_queue_id: int +struct_v9_sdma_mqd.register_fields([('sdmax_rlcx_rb_cntl', uint32_t, 0), ('sdmax_rlcx_rb_base', uint32_t, 4), ('sdmax_rlcx_rb_base_hi', uint32_t, 8), ('sdmax_rlcx_rb_rptr', uint32_t, 12), ('sdmax_rlcx_rb_rptr_hi', uint32_t, 16), ('sdmax_rlcx_rb_wptr', uint32_t, 20), ('sdmax_rlcx_rb_wptr_hi', uint32_t, 24), ('sdmax_rlcx_rb_wptr_poll_cntl', uint32_t, 28), ('sdmax_rlcx_rb_rptr_addr_hi', uint32_t, 32), ('sdmax_rlcx_rb_rptr_addr_lo', uint32_t, 36), ('sdmax_rlcx_ib_cntl', uint32_t, 40), ('sdmax_rlcx_ib_rptr', uint32_t, 44), ('sdmax_rlcx_ib_offset', uint32_t, 48), ('sdmax_rlcx_ib_base_lo', uint32_t, 52), ('sdmax_rlcx_ib_base_hi', uint32_t, 56), ('sdmax_rlcx_ib_size', uint32_t, 60), ('sdmax_rlcx_skip_cntl', uint32_t, 64), ('sdmax_rlcx_context_status', uint32_t, 68), ('sdmax_rlcx_doorbell', uint32_t, 72), ('sdmax_rlcx_status', uint32_t, 76), ('sdmax_rlcx_doorbell_log', uint32_t, 80), ('sdmax_rlcx_watermark', uint32_t, 84), ('sdmax_rlcx_doorbell_offset', uint32_t, 88), ('sdmax_rlcx_csa_addr_lo', uint32_t, 92), ('sdmax_rlcx_csa_addr_hi', uint32_t, 96), ('sdmax_rlcx_ib_sub_remain', uint32_t, 100), ('sdmax_rlcx_preempt', uint32_t, 104), ('sdmax_rlcx_dummy_reg', uint32_t, 108), ('sdmax_rlcx_rb_wptr_poll_addr_hi', uint32_t, 112), ('sdmax_rlcx_rb_wptr_poll_addr_lo', uint32_t, 116), ('sdmax_rlcx_rb_aql_cntl', uint32_t, 120), ('sdmax_rlcx_minor_ptr_update', uint32_t, 124), ('sdmax_rlcx_midcmd_data0', uint32_t, 128), ('sdmax_rlcx_midcmd_data1', uint32_t, 132), ('sdmax_rlcx_midcmd_data2', uint32_t, 136), ('sdmax_rlcx_midcmd_data3', uint32_t, 140), ('sdmax_rlcx_midcmd_data4', uint32_t, 144), ('sdmax_rlcx_midcmd_data5', uint32_t, 148), ('sdmax_rlcx_midcmd_data6', uint32_t, 152), ('sdmax_rlcx_midcmd_data7', uint32_t, 156), ('sdmax_rlcx_midcmd_data8', uint32_t, 160), ('sdmax_rlcx_midcmd_cntl', uint32_t, 164), ('reserved_42', uint32_t, 168), ('reserved_43', uint32_t, 172), ('reserved_44', uint32_t, 176), ('reserved_45', uint32_t, 180), ('reserved_46', uint32_t, 184), ('reserved_47', uint32_t, 188), ('reserved_48', uint32_t, 192), ('reserved_49', uint32_t, 196), ('reserved_50', uint32_t, 200), ('reserved_51', uint32_t, 204), ('reserved_52', uint32_t, 208), ('reserved_53', uint32_t, 212), ('reserved_54', uint32_t, 216), ('reserved_55', uint32_t, 220), ('reserved_56', uint32_t, 224), ('reserved_57', uint32_t, 228), ('reserved_58', uint32_t, 232), ('reserved_59', uint32_t, 236), ('reserved_60', uint32_t, 240), ('reserved_61', uint32_t, 244), ('reserved_62', uint32_t, 248), ('reserved_63', uint32_t, 252), ('reserved_64', uint32_t, 256), ('reserved_65', uint32_t, 260), ('reserved_66', uint32_t, 264), ('reserved_67', uint32_t, 268), ('reserved_68', uint32_t, 272), ('reserved_69', uint32_t, 276), ('reserved_70', uint32_t, 280), ('reserved_71', uint32_t, 284), ('reserved_72', uint32_t, 288), ('reserved_73', uint32_t, 292), ('reserved_74', uint32_t, 296), ('reserved_75', uint32_t, 300), ('reserved_76', uint32_t, 304), ('reserved_77', uint32_t, 308), ('reserved_78', uint32_t, 312), ('reserved_79', uint32_t, 316), ('reserved_80', uint32_t, 320), ('reserved_81', uint32_t, 324), ('reserved_82', uint32_t, 328), ('reserved_83', uint32_t, 332), ('reserved_84', uint32_t, 336), ('reserved_85', uint32_t, 340), ('reserved_86', uint32_t, 344), ('reserved_87', uint32_t, 348), ('reserved_88', uint32_t, 352), ('reserved_89', uint32_t, 356), ('reserved_90', uint32_t, 360), ('reserved_91', uint32_t, 364), ('reserved_92', uint32_t, 368), ('reserved_93', uint32_t, 372), ('reserved_94', uint32_t, 376), ('reserved_95', uint32_t, 380), ('reserved_96', uint32_t, 384), ('reserved_97', uint32_t, 388), ('reserved_98', uint32_t, 392), ('reserved_99', uint32_t, 396), ('reserved_100', uint32_t, 400), ('reserved_101', uint32_t, 404), ('reserved_102', uint32_t, 408), ('reserved_103', uint32_t, 412), ('reserved_104', uint32_t, 416), ('reserved_105', uint32_t, 420), ('reserved_106', uint32_t, 424), ('reserved_107', uint32_t, 428), ('reserved_108', uint32_t, 432), ('reserved_109', uint32_t, 436), ('reserved_110', uint32_t, 440), ('reserved_111', uint32_t, 444), ('reserved_112', uint32_t, 448), ('reserved_113', uint32_t, 452), ('reserved_114', uint32_t, 456), ('reserved_115', uint32_t, 460), ('reserved_116', uint32_t, 464), ('reserved_117', uint32_t, 468), ('reserved_118', uint32_t, 472), ('reserved_119', uint32_t, 476), ('reserved_120', uint32_t, 480), ('reserved_121', uint32_t, 484), ('reserved_122', uint32_t, 488), ('reserved_123', uint32_t, 492), ('reserved_124', uint32_t, 496), ('reserved_125', uint32_t, 500), ('sdma_engine_id', uint32_t, 504), ('sdma_queue_id', uint32_t, 508)]) +@c.record +class struct_v9_mqd(c.Struct): + SIZE = 2048 + header: int + compute_dispatch_initiator: int + compute_dim_x: int + compute_dim_y: int + compute_dim_z: int + compute_start_x: int + compute_start_y: int + compute_start_z: int + compute_num_thread_x: int + compute_num_thread_y: int + compute_num_thread_z: int + compute_pipelinestat_enable: int + compute_perfcount_enable: int + compute_pgm_lo: int + compute_pgm_hi: int + compute_tba_lo: int + compute_tba_hi: int + compute_tma_lo: int + compute_tma_hi: int + compute_pgm_rsrc1: int + compute_pgm_rsrc2: int + compute_vmid: int + compute_resource_limits: int + compute_static_thread_mgmt_se0: int + compute_static_thread_mgmt_se1: int + compute_tmpring_size: int + compute_static_thread_mgmt_se2: int + compute_static_thread_mgmt_se3: int + compute_restart_x: int + compute_restart_y: int + compute_restart_z: int + compute_thread_trace_enable: int + compute_misc_reserved: int + compute_dispatch_id: int + compute_threadgroup_id: int + compute_relaunch: int + compute_wave_restore_addr_lo: int + compute_wave_restore_addr_hi: int + compute_wave_restore_control: int + compute_static_thread_mgmt_se4: int + compute_static_thread_mgmt_se5: int + compute_static_thread_mgmt_se6: int + compute_static_thread_mgmt_se7: int + compute_current_logic_xcc_id: int + compute_restart_cg_tg_id: int + compute_tg_chunk_size: int + compute_restore_tg_chunk_size: int + reserved_43: int + reserved_44: int + reserved_45: int + reserved_46: int + reserved_47: int + reserved_48: int + reserved_49: int + reserved_50: int + reserved_51: int + reserved_52: int + reserved_53: int + reserved_54: int + reserved_55: int + reserved_56: int + reserved_57: int + reserved_58: int + reserved_59: int + reserved_60: int + reserved_61: int + reserved_62: int + reserved_63: int + reserved_64: int + compute_user_data_0: int + compute_user_data_1: int + compute_user_data_2: int + compute_user_data_3: int + compute_user_data_4: int + compute_user_data_5: int + compute_user_data_6: int + compute_user_data_7: int + compute_user_data_8: int + compute_user_data_9: int + compute_user_data_10: int + compute_user_data_11: int + compute_user_data_12: int + compute_user_data_13: int + compute_user_data_14: int + compute_user_data_15: int + cp_compute_csinvoc_count_lo: int + cp_compute_csinvoc_count_hi: int + reserved_83: int + reserved_84: int + reserved_85: int + cp_mqd_query_time_lo: int + cp_mqd_query_time_hi: int + cp_mqd_connect_start_time_lo: int + cp_mqd_connect_start_time_hi: int + cp_mqd_connect_end_time_lo: int + cp_mqd_connect_end_time_hi: int + cp_mqd_connect_end_wf_count: int + cp_mqd_connect_end_pq_rptr: int + cp_mqd_connect_end_pq_wptr: int + cp_mqd_connect_end_ib_rptr: int + cp_mqd_readindex_lo: int + cp_mqd_readindex_hi: int + cp_mqd_save_start_time_lo: int + cp_mqd_save_start_time_hi: int + cp_mqd_save_end_time_lo: int + cp_mqd_save_end_time_hi: int + cp_mqd_restore_start_time_lo: int + cp_mqd_restore_start_time_hi: int + cp_mqd_restore_end_time_lo: int + cp_mqd_restore_end_time_hi: int + disable_queue: int + reserved_107: int + gds_cs_ctxsw_cnt0: int + gds_cs_ctxsw_cnt1: int + gds_cs_ctxsw_cnt2: int + gds_cs_ctxsw_cnt3: int + reserved_112: int + reserved_113: int + cp_pq_exe_status_lo: int + cp_pq_exe_status_hi: int + cp_packet_id_lo: int + cp_packet_id_hi: int + cp_packet_exe_status_lo: int + cp_packet_exe_status_hi: int + gds_save_base_addr_lo: int + gds_save_base_addr_hi: int + gds_save_mask_lo: int + gds_save_mask_hi: int + ctx_save_base_addr_lo: int + ctx_save_base_addr_hi: int + dynamic_cu_mask_addr_lo: int + dynamic_cu_mask_addr_hi: int + cp_mqd_base_addr_lo: int + cp_mqd_base_addr_hi: int + cp_hqd_active: int + cp_hqd_vmid: int + cp_hqd_persistent_state: int + cp_hqd_pipe_priority: int + cp_hqd_queue_priority: int + cp_hqd_quantum: int + cp_hqd_pq_base_lo: int + cp_hqd_pq_base_hi: int + cp_hqd_pq_rptr: int + cp_hqd_pq_rptr_report_addr_lo: int + cp_hqd_pq_rptr_report_addr_hi: int + cp_hqd_pq_wptr_poll_addr_lo: int + cp_hqd_pq_wptr_poll_addr_hi: int + cp_hqd_pq_doorbell_control: int + reserved_144: int + cp_hqd_pq_control: int + cp_hqd_ib_base_addr_lo: int + cp_hqd_ib_base_addr_hi: int + cp_hqd_ib_rptr: int + cp_hqd_ib_control: int + cp_hqd_iq_timer: int + cp_hqd_iq_rptr: int + cp_hqd_dequeue_request: int + cp_hqd_dma_offload: int + cp_hqd_sema_cmd: int + cp_hqd_msg_type: int + cp_hqd_atomic0_preop_lo: int + cp_hqd_atomic0_preop_hi: int + cp_hqd_atomic1_preop_lo: int + cp_hqd_atomic1_preop_hi: int + cp_hqd_hq_status0: int + cp_hqd_hq_control0: int + cp_mqd_control: int + cp_hqd_hq_status1: int + cp_hqd_hq_control1: int + cp_hqd_eop_base_addr_lo: int + cp_hqd_eop_base_addr_hi: int + cp_hqd_eop_control: int + cp_hqd_eop_rptr: int + cp_hqd_eop_wptr: int + cp_hqd_eop_done_events: int + cp_hqd_ctx_save_base_addr_lo: int + cp_hqd_ctx_save_base_addr_hi: int + cp_hqd_ctx_save_control: int + cp_hqd_cntl_stack_offset: int + cp_hqd_cntl_stack_size: int + cp_hqd_wg_state_offset: int + cp_hqd_ctx_save_size: int + cp_hqd_gds_resource_state: int + cp_hqd_error: int + cp_hqd_eop_wptr_mem: int + cp_hqd_aql_control: int + cp_hqd_pq_wptr_lo: int + cp_hqd_pq_wptr_hi: int + reserved_184: int + reserved_185: int + reserved_186: int + reserved_187: int + reserved_188: int + reserved_189: int + reserved_190: int + reserved_191: int + iqtimer_pkt_header: int + iqtimer_pkt_dw0: int + iqtimer_pkt_dw1: int + iqtimer_pkt_dw2: int + iqtimer_pkt_dw3: int + iqtimer_pkt_dw4: int + iqtimer_pkt_dw5: int + iqtimer_pkt_dw6: int + iqtimer_pkt_dw7: int + iqtimer_pkt_dw8: int + iqtimer_pkt_dw9: int + iqtimer_pkt_dw10: int + iqtimer_pkt_dw11: int + iqtimer_pkt_dw12: int + iqtimer_pkt_dw13: int + iqtimer_pkt_dw14: int + iqtimer_pkt_dw15: int + iqtimer_pkt_dw16: int + iqtimer_pkt_dw17: int + iqtimer_pkt_dw18: int + iqtimer_pkt_dw19: int + iqtimer_pkt_dw20: int + iqtimer_pkt_dw21: int + iqtimer_pkt_dw22: int + iqtimer_pkt_dw23: int + iqtimer_pkt_dw24: int + iqtimer_pkt_dw25: int + iqtimer_pkt_dw26: int + iqtimer_pkt_dw27: int + iqtimer_pkt_dw28: int + iqtimer_pkt_dw29: int + iqtimer_pkt_dw30: int + iqtimer_pkt_dw31: int + reserved_225: int + reserved_226: int + pm4_target_xcc_in_xcp: int + cp_mqd_stride_size: int + reserved_227: int + set_resources_header: int + set_resources_dw1: int + set_resources_dw2: int + set_resources_dw3: int + set_resources_dw4: int + set_resources_dw5: int + set_resources_dw6: int + set_resources_dw7: int + reserved_236: int + reserved_237: int + reserved_238: int + reserved_239: int + queue_doorbell_id0: int + queue_doorbell_id1: int + queue_doorbell_id2: int + queue_doorbell_id3: int + queue_doorbell_id4: int + queue_doorbell_id5: int + queue_doorbell_id6: int + queue_doorbell_id7: int + queue_doorbell_id8: int + queue_doorbell_id9: int + queue_doorbell_id10: int + queue_doorbell_id11: int + queue_doorbell_id12: int + queue_doorbell_id13: int + queue_doorbell_id14: int + queue_doorbell_id15: int + reserved_256: int + reserved_257: int + reserved_258: int + reserved_259: int + reserved_260: int + reserved_261: int + reserved_262: int + reserved_263: int + reserved_264: int + reserved_265: int + reserved_266: int + reserved_267: int + reserved_268: int + reserved_269: int + reserved_270: int + reserved_271: int + reserved_272: int + reserved_273: int + reserved_274: int + reserved_275: int + reserved_276: int + reserved_277: int + reserved_278: int + reserved_279: int + reserved_280: int + reserved_281: int + reserved_282: int + reserved_283: int + reserved_284: int + reserved_285: int + reserved_286: int + reserved_287: int + reserved_288: int + reserved_289: int + reserved_290: int + reserved_291: int + reserved_292: int + reserved_293: int + reserved_294: int + reserved_295: int + reserved_296: int + reserved_297: int + reserved_298: int + reserved_299: int + reserved_300: int + reserved_301: int + reserved_302: int + reserved_303: int + reserved_304: int + reserved_305: int + reserved_306: int + reserved_307: int + reserved_308: int + reserved_309: int + reserved_310: int + reserved_311: int + reserved_312: int + reserved_313: int + reserved_314: int + reserved_315: int + reserved_316: int + reserved_317: int + reserved_318: int + reserved_319: int + reserved_320: int + reserved_321: int + reserved_322: int + reserved_323: int + reserved_324: int + reserved_325: int + reserved_326: int + reserved_327: int + reserved_328: int + reserved_329: int + reserved_330: int + reserved_331: int + reserved_332: int + reserved_333: int + reserved_334: int + reserved_335: int + reserved_336: int + reserved_337: int + reserved_338: int + reserved_339: int + reserved_340: int + reserved_341: int + reserved_342: int + reserved_343: int + reserved_344: int + reserved_345: int + reserved_346: int + reserved_347: int + reserved_348: int + reserved_349: int + reserved_350: int + reserved_351: int + reserved_352: int + reserved_353: int + reserved_354: int + reserved_355: int + reserved_356: int + reserved_357: int + reserved_358: int + reserved_359: int + reserved_360: int + reserved_361: int + reserved_362: int + reserved_363: int + reserved_364: int + reserved_365: int + reserved_366: int + reserved_367: int + reserved_368: int + reserved_369: int + reserved_370: int + reserved_371: int + reserved_372: int + reserved_373: int + reserved_374: int + reserved_375: int + reserved_376: int + reserved_377: int + reserved_378: int + reserved_379: int + reserved_380: int + reserved_381: int + reserved_382: int + reserved_383: int + reserved_384: int + reserved_385: int + reserved_386: int + reserved_387: int + reserved_388: int + reserved_389: int + reserved_390: int + reserved_391: int + reserved_392: int + reserved_393: int + reserved_394: int + reserved_395: int + reserved_396: int + reserved_397: int + reserved_398: int + reserved_399: int + reserved_400: int + reserved_401: int + reserved_402: int + reserved_403: int + reserved_404: int + reserved_405: int + reserved_406: int + reserved_407: int + reserved_408: int + reserved_409: int + reserved_410: int + reserved_411: int + reserved_412: int + reserved_413: int + reserved_414: int + reserved_415: int + reserved_416: int + reserved_417: int + reserved_418: int + reserved_419: int + reserved_420: int + reserved_421: int + reserved_422: int + reserved_423: int + reserved_424: int + reserved_425: int + reserved_426: int + reserved_427: int + reserved_428: int + reserved_429: int + reserved_430: int + reserved_431: int + reserved_432: int + reserved_433: int + reserved_434: int + reserved_435: int + reserved_436: int + reserved_437: int + reserved_438: int + reserved_439: int + reserved_440: int + reserved_441: int + reserved_442: int + reserved_443: int + reserved_444: int + reserved_445: int + reserved_446: int + reserved_447: int + reserved_448: int + reserved_449: int + reserved_450: int + reserved_451: int + reserved_452: int + reserved_453: int + reserved_454: int + reserved_455: int + reserved_456: int + reserved_457: int + reserved_458: int + reserved_459: int + reserved_460: int + reserved_461: int + reserved_462: int + reserved_463: int + reserved_464: int + reserved_465: int + reserved_466: int + reserved_467: int + reserved_468: int + reserved_469: int + reserved_470: int + reserved_471: int + reserved_472: int + reserved_473: int + reserved_474: int + reserved_475: int + reserved_476: int + reserved_477: int + reserved_478: int + reserved_479: int + reserved_480: int + reserved_481: int + reserved_482: int + reserved_483: int + reserved_484: int + reserved_485: int + reserved_486: int + reserved_487: int + reserved_488: int + reserved_489: int + reserved_490: int + reserved_491: int + reserved_492: int + reserved_493: int + reserved_494: int + reserved_495: int + reserved_496: int + reserved_497: int + reserved_498: int + reserved_499: int + reserved_500: int + reserved_501: int + reserved_502: int + reserved_503: int + reserved_504: int + reserved_505: int + reserved_506: int + reserved_507: int + reserved_508: int + reserved_509: int + reserved_510: int + reserved_511: int +struct_v9_mqd.register_fields([('header', uint32_t, 0), ('compute_dispatch_initiator', uint32_t, 4), ('compute_dim_x', uint32_t, 8), ('compute_dim_y', uint32_t, 12), ('compute_dim_z', uint32_t, 16), ('compute_start_x', uint32_t, 20), ('compute_start_y', uint32_t, 24), ('compute_start_z', uint32_t, 28), ('compute_num_thread_x', uint32_t, 32), ('compute_num_thread_y', uint32_t, 36), ('compute_num_thread_z', uint32_t, 40), ('compute_pipelinestat_enable', uint32_t, 44), ('compute_perfcount_enable', uint32_t, 48), ('compute_pgm_lo', uint32_t, 52), ('compute_pgm_hi', uint32_t, 56), ('compute_tba_lo', uint32_t, 60), ('compute_tba_hi', uint32_t, 64), ('compute_tma_lo', uint32_t, 68), ('compute_tma_hi', uint32_t, 72), ('compute_pgm_rsrc1', uint32_t, 76), ('compute_pgm_rsrc2', uint32_t, 80), ('compute_vmid', uint32_t, 84), ('compute_resource_limits', uint32_t, 88), ('compute_static_thread_mgmt_se0', uint32_t, 92), ('compute_static_thread_mgmt_se1', uint32_t, 96), ('compute_tmpring_size', uint32_t, 100), ('compute_static_thread_mgmt_se2', uint32_t, 104), ('compute_static_thread_mgmt_se3', uint32_t, 108), ('compute_restart_x', uint32_t, 112), ('compute_restart_y', uint32_t, 116), ('compute_restart_z', uint32_t, 120), ('compute_thread_trace_enable', uint32_t, 124), ('compute_misc_reserved', uint32_t, 128), ('compute_dispatch_id', uint32_t, 132), ('compute_threadgroup_id', uint32_t, 136), ('compute_relaunch', uint32_t, 140), ('compute_wave_restore_addr_lo', uint32_t, 144), ('compute_wave_restore_addr_hi', uint32_t, 148), ('compute_wave_restore_control', uint32_t, 152), ('compute_static_thread_mgmt_se4', uint32_t, 156), ('compute_static_thread_mgmt_se5', uint32_t, 160), ('compute_static_thread_mgmt_se6', uint32_t, 164), ('compute_static_thread_mgmt_se7', uint32_t, 168), ('compute_current_logic_xcc_id', uint32_t, 156), ('compute_restart_cg_tg_id', uint32_t, 160), ('compute_tg_chunk_size', uint32_t, 164), ('compute_restore_tg_chunk_size', uint32_t, 168), ('reserved_43', uint32_t, 172), ('reserved_44', uint32_t, 176), ('reserved_45', uint32_t, 180), ('reserved_46', uint32_t, 184), ('reserved_47', uint32_t, 188), ('reserved_48', uint32_t, 192), ('reserved_49', uint32_t, 196), ('reserved_50', uint32_t, 200), ('reserved_51', uint32_t, 204), ('reserved_52', uint32_t, 208), ('reserved_53', uint32_t, 212), ('reserved_54', uint32_t, 216), ('reserved_55', uint32_t, 220), ('reserved_56', uint32_t, 224), ('reserved_57', uint32_t, 228), ('reserved_58', uint32_t, 232), ('reserved_59', uint32_t, 236), ('reserved_60', uint32_t, 240), ('reserved_61', uint32_t, 244), ('reserved_62', uint32_t, 248), ('reserved_63', uint32_t, 252), ('reserved_64', uint32_t, 256), ('compute_user_data_0', uint32_t, 260), ('compute_user_data_1', uint32_t, 264), ('compute_user_data_2', uint32_t, 268), ('compute_user_data_3', uint32_t, 272), ('compute_user_data_4', uint32_t, 276), ('compute_user_data_5', uint32_t, 280), ('compute_user_data_6', uint32_t, 284), ('compute_user_data_7', uint32_t, 288), ('compute_user_data_8', uint32_t, 292), ('compute_user_data_9', uint32_t, 296), ('compute_user_data_10', uint32_t, 300), ('compute_user_data_11', uint32_t, 304), ('compute_user_data_12', uint32_t, 308), ('compute_user_data_13', uint32_t, 312), ('compute_user_data_14', uint32_t, 316), ('compute_user_data_15', uint32_t, 320), ('cp_compute_csinvoc_count_lo', uint32_t, 324), ('cp_compute_csinvoc_count_hi', uint32_t, 328), ('reserved_83', uint32_t, 332), ('reserved_84', uint32_t, 336), ('reserved_85', uint32_t, 340), ('cp_mqd_query_time_lo', uint32_t, 344), ('cp_mqd_query_time_hi', uint32_t, 348), ('cp_mqd_connect_start_time_lo', uint32_t, 352), ('cp_mqd_connect_start_time_hi', uint32_t, 356), ('cp_mqd_connect_end_time_lo', uint32_t, 360), ('cp_mqd_connect_end_time_hi', uint32_t, 364), ('cp_mqd_connect_end_wf_count', uint32_t, 368), ('cp_mqd_connect_end_pq_rptr', uint32_t, 372), ('cp_mqd_connect_end_pq_wptr', uint32_t, 376), ('cp_mqd_connect_end_ib_rptr', uint32_t, 380), ('cp_mqd_readindex_lo', uint32_t, 384), ('cp_mqd_readindex_hi', uint32_t, 388), ('cp_mqd_save_start_time_lo', uint32_t, 392), ('cp_mqd_save_start_time_hi', uint32_t, 396), ('cp_mqd_save_end_time_lo', uint32_t, 400), ('cp_mqd_save_end_time_hi', uint32_t, 404), ('cp_mqd_restore_start_time_lo', uint32_t, 408), ('cp_mqd_restore_start_time_hi', uint32_t, 412), ('cp_mqd_restore_end_time_lo', uint32_t, 416), ('cp_mqd_restore_end_time_hi', uint32_t, 420), ('disable_queue', uint32_t, 424), ('reserved_107', uint32_t, 428), ('gds_cs_ctxsw_cnt0', uint32_t, 432), ('gds_cs_ctxsw_cnt1', uint32_t, 436), ('gds_cs_ctxsw_cnt2', uint32_t, 440), ('gds_cs_ctxsw_cnt3', uint32_t, 444), ('reserved_112', uint32_t, 448), ('reserved_113', uint32_t, 452), ('cp_pq_exe_status_lo', uint32_t, 456), ('cp_pq_exe_status_hi', uint32_t, 460), ('cp_packet_id_lo', uint32_t, 464), ('cp_packet_id_hi', uint32_t, 468), ('cp_packet_exe_status_lo', uint32_t, 472), ('cp_packet_exe_status_hi', uint32_t, 476), ('gds_save_base_addr_lo', uint32_t, 480), ('gds_save_base_addr_hi', uint32_t, 484), ('gds_save_mask_lo', uint32_t, 488), ('gds_save_mask_hi', uint32_t, 492), ('ctx_save_base_addr_lo', uint32_t, 496), ('ctx_save_base_addr_hi', uint32_t, 500), ('dynamic_cu_mask_addr_lo', uint32_t, 504), ('dynamic_cu_mask_addr_hi', uint32_t, 508), ('cp_mqd_base_addr_lo', uint32_t, 512), ('cp_mqd_base_addr_hi', uint32_t, 516), ('cp_hqd_active', uint32_t, 520), ('cp_hqd_vmid', uint32_t, 524), ('cp_hqd_persistent_state', uint32_t, 528), ('cp_hqd_pipe_priority', uint32_t, 532), ('cp_hqd_queue_priority', uint32_t, 536), ('cp_hqd_quantum', uint32_t, 540), ('cp_hqd_pq_base_lo', uint32_t, 544), ('cp_hqd_pq_base_hi', uint32_t, 548), ('cp_hqd_pq_rptr', uint32_t, 552), ('cp_hqd_pq_rptr_report_addr_lo', uint32_t, 556), ('cp_hqd_pq_rptr_report_addr_hi', uint32_t, 560), ('cp_hqd_pq_wptr_poll_addr_lo', uint32_t, 564), ('cp_hqd_pq_wptr_poll_addr_hi', uint32_t, 568), ('cp_hqd_pq_doorbell_control', uint32_t, 572), ('reserved_144', uint32_t, 576), ('cp_hqd_pq_control', uint32_t, 580), ('cp_hqd_ib_base_addr_lo', uint32_t, 584), ('cp_hqd_ib_base_addr_hi', uint32_t, 588), ('cp_hqd_ib_rptr', uint32_t, 592), ('cp_hqd_ib_control', uint32_t, 596), ('cp_hqd_iq_timer', uint32_t, 600), ('cp_hqd_iq_rptr', uint32_t, 604), ('cp_hqd_dequeue_request', uint32_t, 608), ('cp_hqd_dma_offload', uint32_t, 612), ('cp_hqd_sema_cmd', uint32_t, 616), ('cp_hqd_msg_type', uint32_t, 620), ('cp_hqd_atomic0_preop_lo', uint32_t, 624), ('cp_hqd_atomic0_preop_hi', uint32_t, 628), ('cp_hqd_atomic1_preop_lo', uint32_t, 632), ('cp_hqd_atomic1_preop_hi', uint32_t, 636), ('cp_hqd_hq_status0', uint32_t, 640), ('cp_hqd_hq_control0', uint32_t, 644), ('cp_mqd_control', uint32_t, 648), ('cp_hqd_hq_status1', uint32_t, 652), ('cp_hqd_hq_control1', uint32_t, 656), ('cp_hqd_eop_base_addr_lo', uint32_t, 660), ('cp_hqd_eop_base_addr_hi', uint32_t, 664), ('cp_hqd_eop_control', uint32_t, 668), ('cp_hqd_eop_rptr', uint32_t, 672), ('cp_hqd_eop_wptr', uint32_t, 676), ('cp_hqd_eop_done_events', uint32_t, 680), ('cp_hqd_ctx_save_base_addr_lo', uint32_t, 684), ('cp_hqd_ctx_save_base_addr_hi', uint32_t, 688), ('cp_hqd_ctx_save_control', uint32_t, 692), ('cp_hqd_cntl_stack_offset', uint32_t, 696), ('cp_hqd_cntl_stack_size', uint32_t, 700), ('cp_hqd_wg_state_offset', uint32_t, 704), ('cp_hqd_ctx_save_size', uint32_t, 708), ('cp_hqd_gds_resource_state', uint32_t, 712), ('cp_hqd_error', uint32_t, 716), ('cp_hqd_eop_wptr_mem', uint32_t, 720), ('cp_hqd_aql_control', uint32_t, 724), ('cp_hqd_pq_wptr_lo', uint32_t, 728), ('cp_hqd_pq_wptr_hi', uint32_t, 732), ('reserved_184', uint32_t, 736), ('reserved_185', uint32_t, 740), ('reserved_186', uint32_t, 744), ('reserved_187', uint32_t, 748), ('reserved_188', uint32_t, 752), ('reserved_189', uint32_t, 756), ('reserved_190', uint32_t, 760), ('reserved_191', uint32_t, 764), ('iqtimer_pkt_header', uint32_t, 768), ('iqtimer_pkt_dw0', uint32_t, 772), ('iqtimer_pkt_dw1', uint32_t, 776), ('iqtimer_pkt_dw2', uint32_t, 780), ('iqtimer_pkt_dw3', uint32_t, 784), ('iqtimer_pkt_dw4', uint32_t, 788), ('iqtimer_pkt_dw5', uint32_t, 792), ('iqtimer_pkt_dw6', uint32_t, 796), ('iqtimer_pkt_dw7', uint32_t, 800), ('iqtimer_pkt_dw8', uint32_t, 804), ('iqtimer_pkt_dw9', uint32_t, 808), ('iqtimer_pkt_dw10', uint32_t, 812), ('iqtimer_pkt_dw11', uint32_t, 816), ('iqtimer_pkt_dw12', uint32_t, 820), ('iqtimer_pkt_dw13', uint32_t, 824), ('iqtimer_pkt_dw14', uint32_t, 828), ('iqtimer_pkt_dw15', uint32_t, 832), ('iqtimer_pkt_dw16', uint32_t, 836), ('iqtimer_pkt_dw17', uint32_t, 840), ('iqtimer_pkt_dw18', uint32_t, 844), ('iqtimer_pkt_dw19', uint32_t, 848), ('iqtimer_pkt_dw20', uint32_t, 852), ('iqtimer_pkt_dw21', uint32_t, 856), ('iqtimer_pkt_dw22', uint32_t, 860), ('iqtimer_pkt_dw23', uint32_t, 864), ('iqtimer_pkt_dw24', uint32_t, 868), ('iqtimer_pkt_dw25', uint32_t, 872), ('iqtimer_pkt_dw26', uint32_t, 876), ('iqtimer_pkt_dw27', uint32_t, 880), ('iqtimer_pkt_dw28', uint32_t, 884), ('iqtimer_pkt_dw29', uint32_t, 888), ('iqtimer_pkt_dw30', uint32_t, 892), ('iqtimer_pkt_dw31', uint32_t, 896), ('reserved_225', uint32_t, 900), ('reserved_226', uint32_t, 904), ('pm4_target_xcc_in_xcp', uint32_t, 900), ('cp_mqd_stride_size', uint32_t, 904), ('reserved_227', uint32_t, 908), ('set_resources_header', uint32_t, 912), ('set_resources_dw1', uint32_t, 916), ('set_resources_dw2', uint32_t, 920), ('set_resources_dw3', uint32_t, 924), ('set_resources_dw4', uint32_t, 928), ('set_resources_dw5', uint32_t, 932), ('set_resources_dw6', uint32_t, 936), ('set_resources_dw7', uint32_t, 940), ('reserved_236', uint32_t, 944), ('reserved_237', uint32_t, 948), ('reserved_238', uint32_t, 952), ('reserved_239', uint32_t, 956), ('queue_doorbell_id0', uint32_t, 960), ('queue_doorbell_id1', uint32_t, 964), ('queue_doorbell_id2', uint32_t, 968), ('queue_doorbell_id3', uint32_t, 972), ('queue_doorbell_id4', uint32_t, 976), ('queue_doorbell_id5', uint32_t, 980), ('queue_doorbell_id6', uint32_t, 984), ('queue_doorbell_id7', uint32_t, 988), ('queue_doorbell_id8', uint32_t, 992), ('queue_doorbell_id9', uint32_t, 996), ('queue_doorbell_id10', uint32_t, 1000), ('queue_doorbell_id11', uint32_t, 1004), ('queue_doorbell_id12', uint32_t, 1008), ('queue_doorbell_id13', uint32_t, 1012), ('queue_doorbell_id14', uint32_t, 1016), ('queue_doorbell_id15', uint32_t, 1020), ('reserved_256', uint32_t, 1024), ('reserved_257', uint32_t, 1028), ('reserved_258', uint32_t, 1032), ('reserved_259', uint32_t, 1036), ('reserved_260', uint32_t, 1040), ('reserved_261', uint32_t, 1044), ('reserved_262', uint32_t, 1048), ('reserved_263', uint32_t, 1052), ('reserved_264', uint32_t, 1056), ('reserved_265', uint32_t, 1060), ('reserved_266', uint32_t, 1064), ('reserved_267', uint32_t, 1068), ('reserved_268', uint32_t, 1072), ('reserved_269', uint32_t, 1076), ('reserved_270', uint32_t, 1080), ('reserved_271', uint32_t, 1084), ('reserved_272', uint32_t, 1088), ('reserved_273', uint32_t, 1092), ('reserved_274', uint32_t, 1096), ('reserved_275', uint32_t, 1100), ('reserved_276', uint32_t, 1104), ('reserved_277', uint32_t, 1108), ('reserved_278', uint32_t, 1112), ('reserved_279', uint32_t, 1116), ('reserved_280', uint32_t, 1120), ('reserved_281', uint32_t, 1124), ('reserved_282', uint32_t, 1128), ('reserved_283', uint32_t, 1132), ('reserved_284', uint32_t, 1136), ('reserved_285', uint32_t, 1140), ('reserved_286', uint32_t, 1144), ('reserved_287', uint32_t, 1148), ('reserved_288', uint32_t, 1152), ('reserved_289', uint32_t, 1156), ('reserved_290', uint32_t, 1160), ('reserved_291', uint32_t, 1164), ('reserved_292', uint32_t, 1168), ('reserved_293', uint32_t, 1172), ('reserved_294', uint32_t, 1176), ('reserved_295', uint32_t, 1180), ('reserved_296', uint32_t, 1184), ('reserved_297', uint32_t, 1188), ('reserved_298', uint32_t, 1192), ('reserved_299', uint32_t, 1196), ('reserved_300', uint32_t, 1200), ('reserved_301', uint32_t, 1204), ('reserved_302', uint32_t, 1208), ('reserved_303', uint32_t, 1212), ('reserved_304', uint32_t, 1216), ('reserved_305', uint32_t, 1220), ('reserved_306', uint32_t, 1224), ('reserved_307', uint32_t, 1228), ('reserved_308', uint32_t, 1232), ('reserved_309', uint32_t, 1236), ('reserved_310', uint32_t, 1240), ('reserved_311', uint32_t, 1244), ('reserved_312', uint32_t, 1248), ('reserved_313', uint32_t, 1252), ('reserved_314', uint32_t, 1256), ('reserved_315', uint32_t, 1260), ('reserved_316', uint32_t, 1264), ('reserved_317', uint32_t, 1268), ('reserved_318', uint32_t, 1272), ('reserved_319', uint32_t, 1276), ('reserved_320', uint32_t, 1280), ('reserved_321', uint32_t, 1284), ('reserved_322', uint32_t, 1288), ('reserved_323', uint32_t, 1292), ('reserved_324', uint32_t, 1296), ('reserved_325', uint32_t, 1300), ('reserved_326', uint32_t, 1304), ('reserved_327', uint32_t, 1308), ('reserved_328', uint32_t, 1312), ('reserved_329', uint32_t, 1316), ('reserved_330', uint32_t, 1320), ('reserved_331', uint32_t, 1324), ('reserved_332', uint32_t, 1328), ('reserved_333', uint32_t, 1332), ('reserved_334', uint32_t, 1336), ('reserved_335', uint32_t, 1340), ('reserved_336', uint32_t, 1344), ('reserved_337', uint32_t, 1348), ('reserved_338', uint32_t, 1352), ('reserved_339', uint32_t, 1356), ('reserved_340', uint32_t, 1360), ('reserved_341', uint32_t, 1364), ('reserved_342', uint32_t, 1368), ('reserved_343', uint32_t, 1372), ('reserved_344', uint32_t, 1376), ('reserved_345', uint32_t, 1380), ('reserved_346', uint32_t, 1384), ('reserved_347', uint32_t, 1388), ('reserved_348', uint32_t, 1392), ('reserved_349', uint32_t, 1396), ('reserved_350', uint32_t, 1400), ('reserved_351', uint32_t, 1404), ('reserved_352', uint32_t, 1408), ('reserved_353', uint32_t, 1412), ('reserved_354', uint32_t, 1416), ('reserved_355', uint32_t, 1420), ('reserved_356', uint32_t, 1424), ('reserved_357', uint32_t, 1428), ('reserved_358', uint32_t, 1432), ('reserved_359', uint32_t, 1436), ('reserved_360', uint32_t, 1440), ('reserved_361', uint32_t, 1444), ('reserved_362', uint32_t, 1448), ('reserved_363', uint32_t, 1452), ('reserved_364', uint32_t, 1456), ('reserved_365', uint32_t, 1460), ('reserved_366', uint32_t, 1464), ('reserved_367', uint32_t, 1468), ('reserved_368', uint32_t, 1472), ('reserved_369', uint32_t, 1476), ('reserved_370', uint32_t, 1480), ('reserved_371', uint32_t, 1484), ('reserved_372', uint32_t, 1488), ('reserved_373', uint32_t, 1492), ('reserved_374', uint32_t, 1496), ('reserved_375', uint32_t, 1500), ('reserved_376', uint32_t, 1504), ('reserved_377', uint32_t, 1508), ('reserved_378', uint32_t, 1512), ('reserved_379', uint32_t, 1516), ('reserved_380', uint32_t, 1520), ('reserved_381', uint32_t, 1524), ('reserved_382', uint32_t, 1528), ('reserved_383', uint32_t, 1532), ('reserved_384', uint32_t, 1536), ('reserved_385', uint32_t, 1540), ('reserved_386', uint32_t, 1544), ('reserved_387', uint32_t, 1548), ('reserved_388', uint32_t, 1552), ('reserved_389', uint32_t, 1556), ('reserved_390', uint32_t, 1560), ('reserved_391', uint32_t, 1564), ('reserved_392', uint32_t, 1568), ('reserved_393', uint32_t, 1572), ('reserved_394', uint32_t, 1576), ('reserved_395', uint32_t, 1580), ('reserved_396', uint32_t, 1584), ('reserved_397', uint32_t, 1588), ('reserved_398', uint32_t, 1592), ('reserved_399', uint32_t, 1596), ('reserved_400', uint32_t, 1600), ('reserved_401', uint32_t, 1604), ('reserved_402', uint32_t, 1608), ('reserved_403', uint32_t, 1612), ('reserved_404', uint32_t, 1616), ('reserved_405', uint32_t, 1620), ('reserved_406', uint32_t, 1624), ('reserved_407', uint32_t, 1628), ('reserved_408', uint32_t, 1632), ('reserved_409', uint32_t, 1636), ('reserved_410', uint32_t, 1640), ('reserved_411', uint32_t, 1644), ('reserved_412', uint32_t, 1648), ('reserved_413', uint32_t, 1652), ('reserved_414', uint32_t, 1656), ('reserved_415', uint32_t, 1660), ('reserved_416', uint32_t, 1664), ('reserved_417', uint32_t, 1668), ('reserved_418', uint32_t, 1672), ('reserved_419', uint32_t, 1676), ('reserved_420', uint32_t, 1680), ('reserved_421', uint32_t, 1684), ('reserved_422', uint32_t, 1688), ('reserved_423', uint32_t, 1692), ('reserved_424', uint32_t, 1696), ('reserved_425', uint32_t, 1700), ('reserved_426', uint32_t, 1704), ('reserved_427', uint32_t, 1708), ('reserved_428', uint32_t, 1712), ('reserved_429', uint32_t, 1716), ('reserved_430', uint32_t, 1720), ('reserved_431', uint32_t, 1724), ('reserved_432', uint32_t, 1728), ('reserved_433', uint32_t, 1732), ('reserved_434', uint32_t, 1736), ('reserved_435', uint32_t, 1740), ('reserved_436', uint32_t, 1744), ('reserved_437', uint32_t, 1748), ('reserved_438', uint32_t, 1752), ('reserved_439', uint32_t, 1756), ('reserved_440', uint32_t, 1760), ('reserved_441', uint32_t, 1764), ('reserved_442', uint32_t, 1768), ('reserved_443', uint32_t, 1772), ('reserved_444', uint32_t, 1776), ('reserved_445', uint32_t, 1780), ('reserved_446', uint32_t, 1784), ('reserved_447', uint32_t, 1788), ('reserved_448', uint32_t, 1792), ('reserved_449', uint32_t, 1796), ('reserved_450', uint32_t, 1800), ('reserved_451', uint32_t, 1804), ('reserved_452', uint32_t, 1808), ('reserved_453', uint32_t, 1812), ('reserved_454', uint32_t, 1816), ('reserved_455', uint32_t, 1820), ('reserved_456', uint32_t, 1824), ('reserved_457', uint32_t, 1828), ('reserved_458', uint32_t, 1832), ('reserved_459', uint32_t, 1836), ('reserved_460', uint32_t, 1840), ('reserved_461', uint32_t, 1844), ('reserved_462', uint32_t, 1848), ('reserved_463', uint32_t, 1852), ('reserved_464', uint32_t, 1856), ('reserved_465', uint32_t, 1860), ('reserved_466', uint32_t, 1864), ('reserved_467', uint32_t, 1868), ('reserved_468', uint32_t, 1872), ('reserved_469', uint32_t, 1876), ('reserved_470', uint32_t, 1880), ('reserved_471', uint32_t, 1884), ('reserved_472', uint32_t, 1888), ('reserved_473', uint32_t, 1892), ('reserved_474', uint32_t, 1896), ('reserved_475', uint32_t, 1900), ('reserved_476', uint32_t, 1904), ('reserved_477', uint32_t, 1908), ('reserved_478', uint32_t, 1912), ('reserved_479', uint32_t, 1916), ('reserved_480', uint32_t, 1920), ('reserved_481', uint32_t, 1924), ('reserved_482', uint32_t, 1928), ('reserved_483', uint32_t, 1932), ('reserved_484', uint32_t, 1936), ('reserved_485', uint32_t, 1940), ('reserved_486', uint32_t, 1944), ('reserved_487', uint32_t, 1948), ('reserved_488', uint32_t, 1952), ('reserved_489', uint32_t, 1956), ('reserved_490', uint32_t, 1960), ('reserved_491', uint32_t, 1964), ('reserved_492', uint32_t, 1968), ('reserved_493', uint32_t, 1972), ('reserved_494', uint32_t, 1976), ('reserved_495', uint32_t, 1980), ('reserved_496', uint32_t, 1984), ('reserved_497', uint32_t, 1988), ('reserved_498', uint32_t, 1992), ('reserved_499', uint32_t, 1996), ('reserved_500', uint32_t, 2000), ('reserved_501', uint32_t, 2004), ('reserved_502', uint32_t, 2008), ('reserved_503', uint32_t, 2012), ('reserved_504', uint32_t, 2016), ('reserved_505', uint32_t, 2020), ('reserved_506', uint32_t, 2024), ('reserved_507', uint32_t, 2028), ('reserved_508', uint32_t, 2032), ('reserved_509', uint32_t, 2036), ('reserved_510', uint32_t, 2040), ('reserved_511', uint32_t, 2044)]) +@c.record +class struct_v9_mqd_allocation(c.Struct): + SIZE = 2064 + mqd: struct_v9_mqd + wptr_poll_mem: int + rptr_report_mem: int + dynamic_cu_mask: int + dynamic_rb_mask: int +struct_v9_mqd_allocation.register_fields([('mqd', struct_v9_mqd, 0), ('wptr_poll_mem', uint32_t, 2048), ('rptr_report_mem', uint32_t, 2052), ('dynamic_cu_mask', uint32_t, 2056), ('dynamic_rb_mask', uint32_t, 2060)]) +@c.record +class struct_v9_ce_ib_state(c.Struct): + SIZE = 40 + ce_ib_completion_status: int + ce_constegnine_count: int + ce_ibOffset_ib1: int + ce_ibOffset_ib2: int + ce_chainib_addrlo_ib1: int + ce_chainib_addrlo_ib2: int + ce_chainib_addrhi_ib1: int + ce_chainib_addrhi_ib2: int + ce_chainib_size_ib1: int + ce_chainib_size_ib2: int +struct_v9_ce_ib_state.register_fields([('ce_ib_completion_status', uint32_t, 0), ('ce_constegnine_count', uint32_t, 4), ('ce_ibOffset_ib1', uint32_t, 8), ('ce_ibOffset_ib2', uint32_t, 12), ('ce_chainib_addrlo_ib1', uint32_t, 16), ('ce_chainib_addrlo_ib2', uint32_t, 20), ('ce_chainib_addrhi_ib1', uint32_t, 24), ('ce_chainib_addrhi_ib2', uint32_t, 28), ('ce_chainib_size_ib1', uint32_t, 32), ('ce_chainib_size_ib2', uint32_t, 36)]) +@c.record +class struct_v9_de_ib_state(c.Struct): + SIZE = 108 + ib_completion_status: int + de_constEngine_count: int + ib_offset_ib1: int + ib_offset_ib2: int + chain_ib_addrlo_ib1: int + chain_ib_addrlo_ib2: int + chain_ib_addrhi_ib1: int + chain_ib_addrhi_ib2: int + chain_ib_size_ib1: int + chain_ib_size_ib2: int + preamble_begin_ib1: int + preamble_begin_ib2: int + preamble_end_ib1: int + preamble_end_ib2: int + chain_ib_pream_addrlo_ib1: int + chain_ib_pream_addrlo_ib2: int + chain_ib_pream_addrhi_ib1: int + chain_ib_pream_addrhi_ib2: int + draw_indirect_baseLo: int + draw_indirect_baseHi: int + disp_indirect_baseLo: int + disp_indirect_baseHi: int + gds_backup_addrlo: int + gds_backup_addrhi: int + index_base_addrlo: int + index_base_addrhi: int + sample_cntl: int +struct_v9_de_ib_state.register_fields([('ib_completion_status', uint32_t, 0), ('de_constEngine_count', uint32_t, 4), ('ib_offset_ib1', uint32_t, 8), ('ib_offset_ib2', uint32_t, 12), ('chain_ib_addrlo_ib1', uint32_t, 16), ('chain_ib_addrlo_ib2', uint32_t, 20), ('chain_ib_addrhi_ib1', uint32_t, 24), ('chain_ib_addrhi_ib2', uint32_t, 28), ('chain_ib_size_ib1', uint32_t, 32), ('chain_ib_size_ib2', uint32_t, 36), ('preamble_begin_ib1', uint32_t, 40), ('preamble_begin_ib2', uint32_t, 44), ('preamble_end_ib1', uint32_t, 48), ('preamble_end_ib2', uint32_t, 52), ('chain_ib_pream_addrlo_ib1', uint32_t, 56), ('chain_ib_pream_addrlo_ib2', uint32_t, 60), ('chain_ib_pream_addrhi_ib1', uint32_t, 64), ('chain_ib_pream_addrhi_ib2', uint32_t, 68), ('draw_indirect_baseLo', uint32_t, 72), ('draw_indirect_baseHi', uint32_t, 76), ('disp_indirect_baseLo', uint32_t, 80), ('disp_indirect_baseHi', uint32_t, 84), ('gds_backup_addrlo', uint32_t, 88), ('gds_backup_addrhi', uint32_t, 92), ('index_base_addrlo', uint32_t, 96), ('index_base_addrhi', uint32_t, 100), ('sample_cntl', uint32_t, 104)]) +@c.record +class struct_v9_gfx_meta_data(c.Struct): + SIZE = 4096 + ce_payload: struct_v9_ce_ib_state + reserved1: c.Array[ctypes.c_uint32, Literal[54]] + de_payload: struct_v9_de_ib_state + DeIbBaseAddrLo: int + DeIbBaseAddrHi: int + reserved2: c.Array[ctypes.c_uint32, Literal[931]] +struct_v9_gfx_meta_data.register_fields([('ce_payload', struct_v9_ce_ib_state, 0), ('reserved1', c.Array[uint32_t, Literal[54]], 40), ('de_payload', struct_v9_de_ib_state, 256), ('DeIbBaseAddrLo', uint32_t, 364), ('DeIbBaseAddrHi', uint32_t, 368), ('reserved2', c.Array[uint32_t, Literal[931]], 372)]) +enum_soc15_ih_clientid: dict[int, str] = {(SOC15_IH_CLIENTID_IH:=0): 'SOC15_IH_CLIENTID_IH', (SOC15_IH_CLIENTID_ACP:=1): 'SOC15_IH_CLIENTID_ACP', (SOC15_IH_CLIENTID_ATHUB:=2): 'SOC15_IH_CLIENTID_ATHUB', (SOC15_IH_CLIENTID_BIF:=3): 'SOC15_IH_CLIENTID_BIF', (SOC15_IH_CLIENTID_DCE:=4): 'SOC15_IH_CLIENTID_DCE', (SOC15_IH_CLIENTID_ISP:=5): 'SOC15_IH_CLIENTID_ISP', (SOC15_IH_CLIENTID_PCIE0:=6): 'SOC15_IH_CLIENTID_PCIE0', (SOC15_IH_CLIENTID_RLC:=7): 'SOC15_IH_CLIENTID_RLC', (SOC15_IH_CLIENTID_SDMA0:=8): 'SOC15_IH_CLIENTID_SDMA0', (SOC15_IH_CLIENTID_SDMA1:=9): 'SOC15_IH_CLIENTID_SDMA1', (SOC15_IH_CLIENTID_SE0SH:=10): 'SOC15_IH_CLIENTID_SE0SH', (SOC15_IH_CLIENTID_SE1SH:=11): 'SOC15_IH_CLIENTID_SE1SH', (SOC15_IH_CLIENTID_SE2SH:=12): 'SOC15_IH_CLIENTID_SE2SH', (SOC15_IH_CLIENTID_SE3SH:=13): 'SOC15_IH_CLIENTID_SE3SH', (SOC15_IH_CLIENTID_UVD1:=14): 'SOC15_IH_CLIENTID_UVD1', (SOC15_IH_CLIENTID_THM:=15): 'SOC15_IH_CLIENTID_THM', (SOC15_IH_CLIENTID_UVD:=16): 'SOC15_IH_CLIENTID_UVD', (SOC15_IH_CLIENTID_VCE0:=17): 'SOC15_IH_CLIENTID_VCE0', (SOC15_IH_CLIENTID_VMC:=18): 'SOC15_IH_CLIENTID_VMC', (SOC15_IH_CLIENTID_XDMA:=19): 'SOC15_IH_CLIENTID_XDMA', (SOC15_IH_CLIENTID_GRBM_CP:=20): 'SOC15_IH_CLIENTID_GRBM_CP', (SOC15_IH_CLIENTID_ATS:=21): 'SOC15_IH_CLIENTID_ATS', (SOC15_IH_CLIENTID_ROM_SMUIO:=22): 'SOC15_IH_CLIENTID_ROM_SMUIO', (SOC15_IH_CLIENTID_DF:=23): 'SOC15_IH_CLIENTID_DF', (SOC15_IH_CLIENTID_VCE1:=24): 'SOC15_IH_CLIENTID_VCE1', (SOC15_IH_CLIENTID_PWR:=25): 'SOC15_IH_CLIENTID_PWR', (SOC15_IH_CLIENTID_RESERVED:=26): 'SOC15_IH_CLIENTID_RESERVED', (SOC15_IH_CLIENTID_UTCL2:=27): 'SOC15_IH_CLIENTID_UTCL2', (SOC15_IH_CLIENTID_EA:=28): 'SOC15_IH_CLIENTID_EA', (SOC15_IH_CLIENTID_UTCL2LOG:=29): 'SOC15_IH_CLIENTID_UTCL2LOG', (SOC15_IH_CLIENTID_MP0:=30): 'SOC15_IH_CLIENTID_MP0', (SOC15_IH_CLIENTID_MP1:=31): 'SOC15_IH_CLIENTID_MP1', (SOC15_IH_CLIENTID_MAX:=32): 'SOC15_IH_CLIENTID_MAX', (SOC15_IH_CLIENTID_VCN:=16): 'SOC15_IH_CLIENTID_VCN', (SOC15_IH_CLIENTID_VCN1:=14): 'SOC15_IH_CLIENTID_VCN1', (SOC15_IH_CLIENTID_SDMA2:=1): 'SOC15_IH_CLIENTID_SDMA2', (SOC15_IH_CLIENTID_SDMA3:=4): 'SOC15_IH_CLIENTID_SDMA3', (SOC15_IH_CLIENTID_SDMA3_Sienna_Cichlid:=5): 'SOC15_IH_CLIENTID_SDMA3_Sienna_Cichlid', (SOC15_IH_CLIENTID_SDMA4:=5): 'SOC15_IH_CLIENTID_SDMA4', (SOC15_IH_CLIENTID_SDMA5:=17): 'SOC15_IH_CLIENTID_SDMA5', (SOC15_IH_CLIENTID_SDMA6:=19): 'SOC15_IH_CLIENTID_SDMA6', (SOC15_IH_CLIENTID_SDMA7:=24): 'SOC15_IH_CLIENTID_SDMA7', (SOC15_IH_CLIENTID_VMC1:=6): 'SOC15_IH_CLIENTID_VMC1'} +enum_soc21_ih_clientid: dict[int, str] = {(SOC21_IH_CLIENTID_IH:=0): 'SOC21_IH_CLIENTID_IH', (SOC21_IH_CLIENTID_ATHUB:=2): 'SOC21_IH_CLIENTID_ATHUB', (SOC21_IH_CLIENTID_BIF:=3): 'SOC21_IH_CLIENTID_BIF', (SOC21_IH_CLIENTID_DCN:=4): 'SOC21_IH_CLIENTID_DCN', (SOC21_IH_CLIENTID_ISP:=5): 'SOC21_IH_CLIENTID_ISP', (SOC21_IH_CLIENTID_MP3:=6): 'SOC21_IH_CLIENTID_MP3', (SOC21_IH_CLIENTID_RLC:=7): 'SOC21_IH_CLIENTID_RLC', (SOC21_IH_CLIENTID_GFX:=10): 'SOC21_IH_CLIENTID_GFX', (SOC21_IH_CLIENTID_IMU:=11): 'SOC21_IH_CLIENTID_IMU', (SOC21_IH_CLIENTID_VCN1:=14): 'SOC21_IH_CLIENTID_VCN1', (SOC21_IH_CLIENTID_THM:=15): 'SOC21_IH_CLIENTID_THM', (SOC21_IH_CLIENTID_VCN:=16): 'SOC21_IH_CLIENTID_VCN', (SOC21_IH_CLIENTID_VPE1:=17): 'SOC21_IH_CLIENTID_VPE1', (SOC21_IH_CLIENTID_VMC:=18): 'SOC21_IH_CLIENTID_VMC', (SOC21_IH_CLIENTID_GRBM_CP:=20): 'SOC21_IH_CLIENTID_GRBM_CP', (SOC21_IH_CLIENTID_ROM_SMUIO:=22): 'SOC21_IH_CLIENTID_ROM_SMUIO', (SOC21_IH_CLIENTID_DF:=23): 'SOC21_IH_CLIENTID_DF', (SOC21_IH_CLIENTID_VPE:=24): 'SOC21_IH_CLIENTID_VPE', (SOC21_IH_CLIENTID_PWR:=25): 'SOC21_IH_CLIENTID_PWR', (SOC21_IH_CLIENTID_LSDMA:=26): 'SOC21_IH_CLIENTID_LSDMA', (SOC21_IH_CLIENTID_MP0:=30): 'SOC21_IH_CLIENTID_MP0', (SOC21_IH_CLIENTID_MP1:=31): 'SOC21_IH_CLIENTID_MP1', (SOC21_IH_CLIENTID_MAX:=32): 'SOC21_IH_CLIENTID_MAX'} +AMDGPU_VM_MAX_UPDATE_SIZE = 0x3FFFF +AMDGPU_PTE_VALID = (1 << 0) +AMDGPU_PTE_SYSTEM = (1 << 1) +AMDGPU_PTE_SNOOPED = (1 << 2) +AMDGPU_PTE_TMZ = (1 << 3) +AMDGPU_PTE_EXECUTABLE = (1 << 4) +AMDGPU_PTE_READABLE = (1 << 5) +AMDGPU_PTE_WRITEABLE = (1 << 6) +AMDGPU_PTE_FRAG = lambda x: ((x & 0x1f) << 7) # type: ignore +AMDGPU_PTE_PRT = (1 << 51) +AMDGPU_PDE_PTE = (1 << 54) +AMDGPU_PTE_LOG = (1 << 55) +AMDGPU_PTE_TF = (1 << 56) +AMDGPU_PTE_NOALLOC = (1 << 58) +AMDGPU_PDE_BFS = lambda a: (a << 59) # type: ignore +AMDGPU_VM_NORETRY_FLAGS = (AMDGPU_PTE_EXECUTABLE | AMDGPU_PDE_PTE | AMDGPU_PTE_TF) +AMDGPU_VM_NORETRY_FLAGS_TF = (AMDGPU_PTE_VALID | AMDGPU_PTE_SYSTEM | AMDGPU_PTE_PRT) +AMDGPU_PTE_MTYPE_VG10_SHIFT = lambda mtype: ((mtype) << 57) # type: ignore +AMDGPU_PTE_MTYPE_VG10_MASK = AMDGPU_PTE_MTYPE_VG10_SHIFT(3) +AMDGPU_PTE_MTYPE_VG10 = lambda flags,mtype: (((flags) & (~AMDGPU_PTE_MTYPE_VG10_MASK)) | AMDGPU_PTE_MTYPE_VG10_SHIFT(mtype)) # type: ignore +AMDGPU_MTYPE_NC = 0 +AMDGPU_MTYPE_CC = 2 +AMDGPU_PTE_MTYPE_NV10_SHIFT = lambda mtype: ((mtype) << 48) # type: ignore +AMDGPU_PTE_MTYPE_NV10_MASK = AMDGPU_PTE_MTYPE_NV10_SHIFT(7) +AMDGPU_PTE_MTYPE_NV10 = lambda flags,mtype: (((flags) & (~AMDGPU_PTE_MTYPE_NV10_MASK)) | AMDGPU_PTE_MTYPE_NV10_SHIFT(mtype)) # type: ignore +AMDGPU_PTE_PRT_GFX12 = (1 << 56) +AMDGPU_PTE_MTYPE_GFX12_SHIFT = lambda mtype: ((mtype) << 54) # type: ignore +AMDGPU_PTE_MTYPE_GFX12_MASK = AMDGPU_PTE_MTYPE_GFX12_SHIFT(3) +AMDGPU_PTE_MTYPE_GFX12 = lambda flags,mtype: (((flags) & (~AMDGPU_PTE_MTYPE_GFX12_MASK)) | AMDGPU_PTE_MTYPE_GFX12_SHIFT(mtype)) # type: ignore +AMDGPU_PTE_IS_PTE = (1 << 63) +AMDGPU_PDE_BFS_GFX12 = lambda a: (((a) & 0x1f) << 58) # type: ignore +AMDGPU_PDE_PTE_GFX12 = (1 << 63) +AMDGPU_VM_FAULT_STOP_NEVER = 0 +AMDGPU_VM_FAULT_STOP_FIRST = 1 +AMDGPU_VM_FAULT_STOP_ALWAYS = 2 +AMDGPU_VM_RESERVED_VRAM = (8 << 20) +AMDGPU_MAX_VMHUBS = 13 +AMDGPU_GFXHUB_START = 0 +AMDGPU_MMHUB0_START = 8 +AMDGPU_MMHUB1_START = 12 +AMDGPU_GFXHUB = lambda x: (AMDGPU_GFXHUB_START + (x)) # type: ignore +AMDGPU_MMHUB0 = lambda x: (AMDGPU_MMHUB0_START + (x)) # type: ignore +AMDGPU_MMHUB1 = lambda x: (AMDGPU_MMHUB1_START + (x)) # type: ignore +AMDGPU_IS_GFXHUB = lambda x: ((x) >= AMDGPU_GFXHUB_START and (x) < AMDGPU_MMHUB0_START) # type: ignore +AMDGPU_IS_MMHUB0 = lambda x: ((x) >= AMDGPU_MMHUB0_START and (x) < AMDGPU_MMHUB1_START) # type: ignore +AMDGPU_IS_MMHUB1 = lambda x: ((x) >= AMDGPU_MMHUB1_START and (x) < AMDGPU_MAX_VMHUBS) # type: ignore +AMDGPU_VA_RESERVED_CSA_SIZE = (2 << 20) +AMDGPU_VA_RESERVED_SEQ64_SIZE = (2 << 20) +AMDGPU_VA_RESERVED_SEQ64_START = lambda adev: (AMDGPU_VA_RESERVED_CSA_START(adev) - AMDGPU_VA_RESERVED_SEQ64_SIZE) # type: ignore +AMDGPU_VA_RESERVED_TRAP_SIZE = (2 << 12) +AMDGPU_VA_RESERVED_TRAP_START = lambda adev: (AMDGPU_VA_RESERVED_SEQ64_START(adev) - AMDGPU_VA_RESERVED_TRAP_SIZE) # type: ignore +AMDGPU_VA_RESERVED_BOTTOM = (1 << 16) +AMDGPU_VA_RESERVED_TOP = (AMDGPU_VA_RESERVED_TRAP_SIZE + AMDGPU_VA_RESERVED_SEQ64_SIZE + AMDGPU_VA_RESERVED_CSA_SIZE) +AMDGPU_VM_USE_CPU_FOR_GFX = (1 << 0) +AMDGPU_VM_USE_CPU_FOR_COMPUTE = (1 << 1) +PSP_HEADER_SIZE = 256 +BINARY_SIGNATURE = 0x28211407 +DISCOVERY_TABLE_SIGNATURE = 0x53445049 +GC_TABLE_ID = 0x4347 +HARVEST_TABLE_SIGNATURE = 0x56524148 +VCN_INFO_TABLE_ID = 0x004E4356 +MALL_INFO_TABLE_ID = 0x4C4C414D +NPS_INFO_TABLE_ID = 0x0053504E +VCN_INFO_TABLE_MAX_NUM_INSTANCES = 4 +NPS_INFO_TABLE_MAX_NUM_INSTANCES = 12 +HWIP_MAX_INSTANCE = 44 +HW_ID_MAX = 300 +MP1_HWID = 1 +MP2_HWID = 2 +THM_HWID = 3 +SMUIO_HWID = 4 +FUSE_HWID = 5 +CLKA_HWID = 6 +PWR_HWID = 10 +GC_HWID = 11 +UVD_HWID = 12 +VCN_HWID = UVD_HWID +AUDIO_AZ_HWID = 13 +ACP_HWID = 14 +DCI_HWID = 15 +DMU_HWID = 271 +DCO_HWID = 16 +DIO_HWID = 272 +XDMA_HWID = 17 +DCEAZ_HWID = 18 +DAZ_HWID = 274 +SDPMUX_HWID = 19 +NTB_HWID = 20 +VPE_HWID = 21 +IOHC_HWID = 24 +L2IMU_HWID = 28 +VCE_HWID = 32 +MMHUB_HWID = 34 +ATHUB_HWID = 35 +DBGU_NBIO_HWID = 36 +DFX_HWID = 37 +DBGU0_HWID = 38 +DBGU1_HWID = 39 +OSSSYS_HWID = 40 +HDP_HWID = 41 +SDMA0_HWID = 42 +SDMA1_HWID = 43 +ISP_HWID = 44 +DBGU_IO_HWID = 45 +DF_HWID = 46 +CLKB_HWID = 47 +FCH_HWID = 48 +DFX_DAP_HWID = 49 +L1IMU_PCIE_HWID = 50 +L1IMU_NBIF_HWID = 51 +L1IMU_IOAGR_HWID = 52 +L1IMU3_HWID = 53 +L1IMU4_HWID = 54 +L1IMU5_HWID = 55 +L1IMU6_HWID = 56 +L1IMU7_HWID = 57 +L1IMU8_HWID = 58 +L1IMU9_HWID = 59 +L1IMU10_HWID = 60 +L1IMU11_HWID = 61 +L1IMU12_HWID = 62 +L1IMU13_HWID = 63 +L1IMU14_HWID = 64 +L1IMU15_HWID = 65 +WAFLC_HWID = 66 +FCH_USB_PD_HWID = 67 +SDMA2_HWID = 68 +SDMA3_HWID = 69 +PCIE_HWID = 70 +PCS_HWID = 80 +DDCL_HWID = 89 +SST_HWID = 90 +LSDMA_HWID = 91 +IOAGR_HWID = 100 +NBIF_HWID = 108 +IOAPIC_HWID = 124 +SYSTEMHUB_HWID = 128 +NTBCCP_HWID = 144 +UMC_HWID = 150 +SATA_HWID = 168 +USB_HWID = 170 +CCXSEC_HWID = 176 +XGMI_HWID = 200 +XGBE_HWID = 216 +MP0_HWID = 255 +hw_id_map = {GC_HWIP:GC_HWID,HDP_HWIP:HDP_HWID,SDMA0_HWIP:SDMA0_HWID,SDMA1_HWIP:SDMA1_HWID,SDMA2_HWIP:SDMA2_HWID,SDMA3_HWIP:SDMA3_HWID,LSDMA_HWIP:LSDMA_HWID,MMHUB_HWIP:MMHUB_HWID,ATHUB_HWIP:ATHUB_HWID,NBIO_HWIP:NBIF_HWID,MP0_HWIP:MP0_HWID,MP1_HWIP:MP1_HWID,UVD_HWIP:UVD_HWID,VCE_HWIP:VCE_HWID,DF_HWIP:DF_HWID,DCE_HWIP:DMU_HWID,OSSSYS_HWIP:OSSSYS_HWID,SMUIO_HWIP:SMUIO_HWID,PWR_HWIP:PWR_HWID,NBIF_HWIP:NBIF_HWID,THM_HWIP:THM_HWID,CLK_HWIP:CLKA_HWID,UMC_HWIP:UMC_HWID,XGMI_HWIP:XGMI_HWID,DCI_HWIP:DCI_HWID,PCIE_HWIP:PCIE_HWID,VPE_HWIP:VPE_HWID,ISP_HWIP:ISP_HWID} +AMDGPU_SDMA0_UCODE_LOADED = 0x00000001 +AMDGPU_SDMA1_UCODE_LOADED = 0x00000002 +AMDGPU_CPCE_UCODE_LOADED = 0x00000004 +AMDGPU_CPPFP_UCODE_LOADED = 0x00000008 +AMDGPU_CPME_UCODE_LOADED = 0x00000010 +AMDGPU_CPMEC1_UCODE_LOADED = 0x00000020 +AMDGPU_CPMEC2_UCODE_LOADED = 0x00000040 +AMDGPU_CPRLC_UCODE_LOADED = 0x00000100 +PSP_GFX_CMD_BUF_VERSION = 0x00000001 +GFX_CMD_STATUS_MASK = 0x0000FFFF +GFX_CMD_ID_MASK = 0x000F0000 +GFX_CMD_RESERVED_MASK = 0x7FF00000 +GFX_CMD_RESPONSE_MASK = 0x80000000 +C2PMSG_CMD_GFX_USB_PD_FW_VER = 0x2000000 +GFX_FLAG_RESPONSE = 0x80000000 +GFX_BUF_MAX_DESC = 64 +FRAME_TYPE_DESTROY = 1 +PSP_ERR_UNKNOWN_COMMAND = 0x00000100 +PSP_FENCE_BUFFER_SIZE = 0x1000 +PSP_CMD_BUFFER_SIZE = 0x1000 +PSP_1_MEG = 0x100000 +PSP_TMR_ALIGNMENT = 0x100000 +PSP_FW_NAME_LEN = 0x24 +AMDGPU_XGMI_MAX_CONNECTED_NODES = 64 +MEM_TRAIN_SYSTEM_SIGNATURE = 0x54534942 +GDDR6_MEM_TRAINING_DATA_SIZE_IN_BYTES = 0x1000 +GDDR6_MEM_TRAINING_OFFSET = 0x8000 +BIST_MEM_TRAINING_ENCROACHED_SIZE = 0x2000000 +PSP_RUNTIME_DB_SIZE_IN_BYTES = 0x10000 +PSP_RUNTIME_DB_OFFSET = 0x100000 +PSP_RUNTIME_DB_COOKIE_ID = 0x0ed5 +PSP_RUNTIME_DB_VER_1 = 0x0100 +PSP_RUNTIME_DB_DIAG_ENTRY_MAX_COUNT = 0x40 +AMDGPU_MAX_IRQ_SRC_ID = 0x100 +AMDGPU_MAX_IRQ_CLIENT_ID = 0x100 +AMDGPU_IRQ_CLIENTID_LEGACY = 0 +AMDGPU_IRQ_CLIENTID_MAX = SOC15_IH_CLIENTID_MAX +AMDGPU_IRQ_SRC_DATA_MAX_SIZE_DW = 4 +SOC15_INTSRC_CP_END_OF_PIPE = 181 +SOC15_INTSRC_CP_BAD_OPCODE = 183 +SOC15_INTSRC_SQ_INTERRUPT_MSG = 239 +SOC15_INTSRC_VMC_FAULT = 0 +SOC15_INTSRC_VMC_UTCL2_POISON = 1 +SOC15_INTSRC_SDMA_TRAP = 224 +SOC15_INTSRC_SDMA_ECC = 220 +SOC21_INTSRC_SDMA_TRAP = 49 +SOC21_INTSRC_SDMA_ECC = 62 +SOC15_CLIENT_ID_FROM_IH_ENTRY = lambda entry: ((entry[0]) & 0xff) # type: ignore +SOC15_SOURCE_ID_FROM_IH_ENTRY = lambda entry: ((entry[0]) >> 8 & 0xff) # type: ignore +SOC15_RING_ID_FROM_IH_ENTRY = lambda entry: ((entry[0]) >> 16 & 0xff) # type: ignore +SOC15_VMID_FROM_IH_ENTRY = lambda entry: ((entry[0]) >> 24 & 0xf) # type: ignore +SOC15_VMID_TYPE_FROM_IH_ENTRY = lambda entry: ((entry[0]) >> 31 & 0x1) # type: ignore +SOC15_PASID_FROM_IH_ENTRY = lambda entry: ((entry[3]) & 0xffff) # type: ignore +SOC15_NODEID_FROM_IH_ENTRY = lambda entry: ((entry[3]) >> 16 & 0xff) # type: ignore +SOC15_CONTEXT_ID0_FROM_IH_ENTRY = lambda entry: ((entry[4])) # type: ignore +SOC15_CONTEXT_ID1_FROM_IH_ENTRY = lambda entry: ((entry[5])) # type: ignore +SOC15_CONTEXT_ID2_FROM_IH_ENTRY = lambda entry: ((entry[6])) # type: ignore +SOC15_CONTEXT_ID3_FROM_IH_ENTRY = lambda entry: ((entry[7])) # type: ignore +GFX_9_0__SRCID__CP_RB_INTERRUPT_PKT = 176 +GFX_9_0__SRCID__CP_IB1_INTERRUPT_PKT = 177 +GFX_9_0__SRCID__CP_IB2_INTERRUPT_PKT = 178 +GFX_9_0__SRCID__CP_PM4_PKT_RSVD_BIT_ERROR = 180 +GFX_9_0__SRCID__CP_EOP_INTERRUPT = 181 +GFX_9_0__SRCID__CP_BAD_OPCODE_ERROR = 183 +GFX_9_0__SRCID__CP_PRIV_REG_FAULT = 184 +GFX_9_0__SRCID__CP_PRIV_INSTR_FAULT = 185 +GFX_9_0__SRCID__CP_WAIT_MEM_SEM_FAULT = 186 +GFX_9_0__SRCID__CP_CTX_EMPTY_INTERRUPT = 187 +GFX_9_0__SRCID__CP_CTX_BUSY_INTERRUPT = 188 +GFX_9_0__SRCID__CP_ME_WAIT_REG_MEM_POLL_TIMEOUT = 192 +GFX_9_0__SRCID__CP_SIG_INCOMPLETE = 193 +GFX_9_0__SRCID__CP_PREEMPT_ACK = 194 +GFX_9_0__SRCID__CP_GPF = 195 +GFX_9_0__SRCID__CP_GDS_ALLOC_ERROR = 196 +GFX_9_0__SRCID__CP_ECC_ERROR = 197 +GFX_9_0__SRCID__CP_COMPUTE_QUERY_STATUS = 199 +GFX_9_0__SRCID__CP_VM_DOORBELL = 200 +GFX_9_0__SRCID__CP_FUE_ERROR = 201 +GFX_9_0__SRCID__RLC_STRM_PERF_MONITOR_INTERRUPT = 202 +GFX_9_0__SRCID__GRBM_RD_TIMEOUT_ERROR = 232 +GFX_9_0__SRCID__GRBM_REG_GUI_IDLE = 233 +GFX_9_0__SRCID__SQ_INTERRUPT_ID = 239 +GFX_11_0_0__SRCID__UTCL2_FAULT = 0 +GFX_11_0_0__SRCID__UTCL2_DATA_POISONING = 1 +GFX_11_0_0__SRCID__MEM_ACCES_MON = 10 +GFX_11_0_0__SRCID__SDMA_ATOMIC_RTN_DONE = 48 +GFX_11_0_0__SRCID__SDMA_TRAP = 49 +GFX_11_0_0__SRCID__SDMA_SRBMWRITE = 50 +GFX_11_0_0__SRCID__SDMA_CTXEMPTY = 51 +GFX_11_0_0__SRCID__SDMA_PREEMPT = 52 +GFX_11_0_0__SRCID__SDMA_IB_PREEMPT = 53 +GFX_11_0_0__SRCID__SDMA_DOORBELL_INVALID = 54 +GFX_11_0_0__SRCID__SDMA_QUEUE_HANG = 55 +GFX_11_0_0__SRCID__SDMA_ATOMIC_TIMEOUT = 56 +GFX_11_0_0__SRCID__SDMA_POLL_TIMEOUT = 57 +GFX_11_0_0__SRCID__SDMA_PAGE_TIMEOUT = 58 +GFX_11_0_0__SRCID__SDMA_PAGE_NULL = 59 +GFX_11_0_0__SRCID__SDMA_PAGE_FAULT = 60 +GFX_11_0_0__SRCID__SDMA_VM_HOLE = 61 +GFX_11_0_0__SRCID__SDMA_ECC = 62 +GFX_11_0_0__SRCID__SDMA_FROZEN = 63 +GFX_11_0_0__SRCID__SDMA_SRAM_ECC = 64 +GFX_11_0_0__SRCID__SDMA_SEM_INCOMPLETE_TIMEOUT = 65 +GFX_11_0_0__SRCID__SDMA_SEM_WAIT_FAIL_TIMEOUT = 66 +GFX_11_0_0__SRCID__SDMA_FENCE = 67 +GFX_11_0_0__SRCID__RLC_GC_FED_INTERRUPT = 128 +GFX_11_0_0__SRCID__CP_GENERIC_INT = 177 +GFX_11_0_0__SRCID__CP_PM4_PKT_RSVD_BIT_ERROR = 180 +GFX_11_0_0__SRCID__CP_EOP_INTERRUPT = 181 +GFX_11_0_0__SRCID__CP_BAD_OPCODE_ERROR = 183 +GFX_11_0_0__SRCID__CP_PRIV_REG_FAULT = 184 +GFX_11_0_0__SRCID__CP_PRIV_INSTR_FAULT = 185 +GFX_11_0_0__SRCID__CP_WAIT_MEM_SEM_FAULT = 186 +GFX_11_0_0__SRCID__CP_CTX_EMPTY_INTERRUPT = 187 +GFX_11_0_0__SRCID__CP_CTX_BUSY_INTERRUPT = 188 +GFX_11_0_0__SRCID__CP_ME_WAIT_REG_MEM_POLL_TIMEOUT = 192 +GFX_11_0_0__SRCID__CP_SIG_INCOMPLETE = 193 +GFX_11_0_0__SRCID__CP_PREEMPT_ACK = 194 +GFX_11_0_0__SRCID__CP_GPF = 195 +GFX_11_0_0__SRCID__CP_GDS_ALLOC_ERROR = 196 +GFX_11_0_0__SRCID__CP_ECC_ERROR = 197 +GFX_11_0_0__SRCID__CP_COMPUTE_QUERY_STATUS = 199 +GFX_11_0_0__SRCID__CP_VM_DOORBELL = 200 +GFX_11_0_0__SRCID__CP_FUE_ERROR = 201 +GFX_11_0_0__SRCID__RLC_STRM_PERF_MONITOR_INTERRUPT = 202 +GFX_11_0_0__SRCID__GRBM_RD_TIMEOUT_ERROR = 232 +GFX_11_0_0__SRCID__GRBM_REG_GUI_IDLE = 233 +GFX_11_0_0__SRCID__SQ_INTERRUPT_ID = 239 +GFX_12_0_0__SRCID__UTCL2_FAULT = 0 +GFX_12_0_0__SRCID__UTCL2_DATA_POISONING = 1 +GFX_12_0_0__SRCID__MEM_ACCES_MON = 10 +GFX_12_0_0__SRCID__SDMA_ATOMIC_RTN_DONE = 48 +GFX_12_0_0__SRCID__SDMA_TRAP = 49 +GFX_12_0_0__SRCID__SDMA_SRBMWRITE = 50 +GFX_12_0_0__SRCID__SDMA_CTXEMPTY = 51 +GFX_12_0_0__SRCID__SDMA_PREEMPT = 52 +GFX_12_0_0__SRCID__SDMA_IB_PREEMPT = 53 +GFX_12_0_0__SRCID__SDMA_DOORBELL_INVALID = 54 +GFX_12_0_0__SRCID__SDMA_QUEUE_HANG = 55 +GFX_12_0_0__SRCID__SDMA_ATOMIC_TIMEOUT = 56 +GFX_12_0_0__SRCID__SDMA_POLL_TIMEOUT = 57 +GFX_12_0_0__SRCID__SDMA_PAGE_TIMEOUT = 58 +GFX_12_0_0__SRCID__SDMA_PAGE_NULL = 59 +GFX_12_0_0__SRCID__SDMA_PAGE_FAULT = 60 +GFX_12_0_0__SRCID__SDMA_VM_HOLE = 61 +GFX_12_0_0__SRCID__SDMA_ECC = 62 +GFX_12_0_0__SRCID__SDMA_FROZEN = 63 +GFX_12_0_0__SRCID__SDMA_SRAM_ECC = 64 +GFX_12_0_0__SRCID__SDMA_SEM_INCOMPLETE_TIMEOUT = 65 +GFX_12_0_0__SRCID__SDMA_SEM_WAIT_FAIL_TIMEOUT = 66 +GFX_12_0_0__SRCID__SDMA_FENCE = 70 +GFX_12_0_0__SRCID__RLC_GC_FED_INTERRUPT = 128 +GFX_12_0_0__SRCID__CP_GENERIC_INT = 177 +GFX_12_0_0__SRCID__CP_PM4_PKT_RSVD_BIT_ERROR = 180 +GFX_12_0_0__SRCID__CP_EOP_INTERRUPT = 181 +GFX_12_0_0__SRCID__CP_BAD_OPCODE_ERROR = 183 +GFX_12_0_0__SRCID__CP_PRIV_REG_FAULT = 184 +GFX_12_0_0__SRCID__CP_PRIV_INSTR_FAULT = 185 +GFX_12_0_0__SRCID__CP_WAIT_MEM_SEM_FAULT = 186 +GFX_12_0_0__SRCID__CP_CTX_EMPTY_INTERRUPT = 187 +GFX_12_0_0__SRCID__CP_CTX_BUSY_INTERRUPT = 188 +GFX_12_0_0__SRCID__CP_ME_WAIT_REG_MEM_POLL_TIMEOUT = 192 +GFX_12_0_0__SRCID__CP_SIG_INCOMPLETE = 193 +GFX_12_0_0__SRCID__CP_PREEMPT_ACK = 194 +GFX_12_0_0__SRCID__CP_GPF = 195 +GFX_12_0_0__SRCID__CP_GDS_ALLOC_ERROR = 196 +GFX_12_0_0__SRCID__CP_ECC_ERROR = 197 +GFX_12_0_0__SRCID__CP_COMPUTE_QUERY_STATUS = 199 +GFX_12_0_0__SRCID__CP_VM_DOORBELL = 200 +GFX_12_0_0__SRCID__CP_FUE_ERROR = 201 +GFX_12_0_0__SRCID__RLC_STRM_PERF_MONITOR_INTERRUPT = 202 +GFX_12_0_0__SRCID__GRBM_RD_TIMEOUT_ERROR = 232 +GFX_12_0_0__SRCID__GRBM_REG_GUI_IDLE = 233 +GFX_12_0_0__SRCID__SQ_INTERRUPT_ID = 239 +SDMA0_4_0__SRCID__SDMA_ATOMIC_RTN_DONE = 217 +SDMA0_4_0__SRCID__SDMA_ATOMIC_TIMEOUT = 218 +SDMA0_4_0__SRCID__SDMA_IB_PREEMPT = 219 +SDMA0_4_0__SRCID__SDMA_ECC = 220 +SDMA0_4_0__SRCID__SDMA_PAGE_FAULT = 221 +SDMA0_4_0__SRCID__SDMA_PAGE_NULL = 222 +SDMA0_4_0__SRCID__SDMA_XNACK = 223 +SDMA0_4_0__SRCID__SDMA_TRAP = 224 +SDMA0_4_0__SRCID__SDMA_SEM_INCOMPLETE_TIMEOUT = 225 +SDMA0_4_0__SRCID__SDMA_SEM_WAIT_FAIL_TIMEOUT = 226 +SDMA0_4_0__SRCID__SDMA_SRAM_ECC = 228 +SDMA0_4_0__SRCID__SDMA_PREEMPT = 240 +SDMA0_4_0__SRCID__SDMA_VM_HOLE = 242 +SDMA0_4_0__SRCID__SDMA_CTXEMPTY = 243 +SDMA0_4_0__SRCID__SDMA_DOORBELL_INVALID = 244 +SDMA0_4_0__SRCID__SDMA_FROZEN = 245 +SDMA0_4_0__SRCID__SDMA_POLL_TIMEOUT = 246 +SDMA0_4_0__SRCID__SDMA_SRBMWRITE = 247 +SDMA0_5_0__SRCID__SDMA_ATOMIC_RTN_DONE = 217 +SDMA0_5_0__SRCID__SDMA_ATOMIC_TIMEOUT = 218 +SDMA0_5_0__SRCID__SDMA_IB_PREEMPT = 219 +SDMA0_5_0__SRCID__SDMA_ECC = 220 +SDMA0_5_0__SRCID__SDMA_PAGE_FAULT = 221 +SDMA0_5_0__SRCID__SDMA_PAGE_NULL = 222 +SDMA0_5_0__SRCID__SDMA_XNACK = 223 +SDMA0_5_0__SRCID__SDMA_TRAP = 224 +SDMA0_5_0__SRCID__SDMA_SEM_INCOMPLETE_TIMEOUT = 225 +SDMA0_5_0__SRCID__SDMA_SEM_WAIT_FAIL_TIMEOUT = 226 +SDMA0_5_0__SRCID__SDMA_SRAM_ECC = 228 +SDMA0_5_0__SRCID__SDMA_PREEMPT = 240 +SDMA0_5_0__SRCID__SDMA_VM_HOLE = 242 +SDMA0_5_0__SRCID__SDMA_CTXEMPTY = 243 +SDMA0_5_0__SRCID__SDMA_DOORBELL_INVALID = 244 +SDMA0_5_0__SRCID__SDMA_FROZEN = 245 +SDMA0_5_0__SRCID__SDMA_POLL_TIMEOUT = 246 +SDMA0_5_0__SRCID__SDMA_SRBMWRITE = 247 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/fw.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/fw.py new file mode 100644 index 000000000..4b6d62e14 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/fw.py @@ -0,0 +1,106 @@ +hashes = { + 'psp_13_0_0_sos.bin': 'b5592f46885585b935e013f46c949db8ff2f15c0b346caf70e7fcd2776623d13', + 'psp_13_0_10_sos.bin': '0bcaaad9cd8578d3841ae69155a6bd4fc3ceae8f4fb5a6ba4f576e7ace94d1d9', + 'psp_13_0_12_sos.bin': '89da90bf4286b38678b1fd175c78462a426afa3d258d15872cd14072d7098b9b', + 'psp_13_0_14_sos.bin': 'a4f0d5f76d27b77409ec0b71d7cc6a848ddfd29f8c84f3003edf74ad3999fb7d', + 'psp_13_0_6_sos.bin': '27657daa0f91ad8095d3610224a7de748b8b348a4cb211ecb5fccabe47369716', + 'psp_13_0_7_sos.bin': 'ef1af0ecea38abbac6f85cce71789f19848c498d0cb8ef13748dab2d65b23c31', + 'psp_14_0_2_sos.bin': '7b538448b57d4f9dd06b2eea90d4f86a16e65e3027cdecee8db71c2c5f1fa243', + 'psp_14_0_3_sos.bin': '23bea01a0c6f36d00759d0765d46cb4cb4aa87398b2fbccacbf547a890c0bf51', + 'smu_13_0_0.bin': '2ffac37fd8534965eeba19755db0e5ec80278213487dc4af0fbc8453befb64b1', + 'smu_13_0_0_kicker.bin': '7f83656a2a89b7fce1c8a85e96d91cd8265a91fe883a7027f1a0ed18ced501de', + 'smu_13_0_10.bin': 'daedb9cbdf48942be7ffe00d31b7c16bb36e11ff5a9d7495f218e95c07717b71', + 'smu_13_0_14.bin': 'a4f36de75fdcecd8000246762e027b4be489b6787afea57675225b0b39d35625', + 'smu_13_0_6.bin': 'ad7232264e8c57c2094244fbdd5a55d7a4575ffe9b44d229884bc0b6a44fb0b1', + 'smu_13_0_7.bin': 'ccecc0fd0196b9613c920a51c2fd9436e739ff19dda5bdf74d97562387231732', + 'smu_14_0_2.bin': '6951995d1d606f4dc60c895f19d34ed18aa40e62129f83d8510c45e8aa9ae2fc', + 'smu_14_0_3.bin': 'df230947ddb7bbfd6e77d1280001db886e69adf2b2a448b47fa668a48bc0009f', + 'smu_14_0_3_kicker.bin': '8ddc1da5b4e1619796c2cc81f19f388a35bf7d78bfe476cee559625589cb4dc7', + 'sdma_4_4_2.bin': '456061b814268425843537da6f2191c8861d4e1a18d4c5d90c44ea6be18c78ff', + 'sdma_4_4_4.bin': 'af47a2940e72b932d3e3a7e8f34f7a182624e5e433f7c56dff939ca5549cd33a', + 'sdma_4_4_5.bin': '6127baabea3de7b18db3868c983b02c0fbf2cd75997f7f11241a5b1be27e5134', + 'sdma_5_2_6.bin': '3a163db00eb7e4752be8adbd61cf7dd8f08d924e59a6f798ced7dfcd89f340ed', + 'sdma_5_2_7.bin': '16fe80dc866b323e15a06f51646ef0f036878ad34da66921fcdb8167207d6b2b', + 'sdma_6_0_0.bin': '0f3da6b211f376356335b41be07149f650c10cfa4e23f7e25d53836006ed11f5', + 'sdma_6_0_1.bin': 'ff565d3c215a30737560d4e3df6fc2c637738407e91d212fb200fdfb185b6744', + 'sdma_6_0_2.bin': '398380184bb69113ef4c8964a3b55f6184deb0c1ffd96c9683490a3eec3ba8f3', + 'sdma_6_0_3.bin': '0e8a83513087db865ba926f8b65cfb003fd41098f707e178d7a7ae2941fed0b1', + 'sdma_6_1_0.bin': '22e55d0ad5f0247a7f0fffc67cfd3161b39f24ad6062ff3c91ec7ff38bd7e1e1', + 'sdma_6_1_1.bin': '74533a581b8e3e2743b3c9c803d0666405e80898c4a630acefed82cb6b516ba2', + 'sdma_6_1_2.bin': '4fe04b0286ec739b0414e8aee17e62e85e691f0246d1d9b56bc18a1219072314', + 'sdma_6_1_3.bin': '35c9ed7e3a237c0d4a83b4975c63b62488f72aeafbb648342f384618e103f66b', + 'sdma_7_0_0.bin': 'beaafb53993a106edd392392d5896245ae2a957c6d0f495d0002eec72ad8ad38', + 'sdma_7_0_1.bin': '73c29e1c1714ebc95d2221ba56e187910902891593010653bf9518937e414a59', + 'gc_10_3_6_pfp.bin': '793d678427887a0e724c79e356440aec33e6d1301f2a4e63543500249ebec064', + 'gc_10_3_7_pfp.bin': '3ae29aac3f424f7de97f82ce7158beba69509afb2dcbf1a428dc315df474a524', + 'gc_11_0_0_pfp.bin': 'e175cb0f580a38c961a6f7366142c08e413995f57f78f39795368b15442df8a3', + 'gc_11_0_1_pfp.bin': 'f5bf21dfbd9e72a30b4caf4704282c27854710c1b7c4affbb2a19530466b12a8', + 'gc_11_0_2_pfp.bin': '001c4dec1119e29314d725cc1280fc4f0cd9cabdf61ea5ee2260cfd4e62ec141', + 'gc_11_0_3_pfp.bin': '0488034c85be97125e39e860308d33c3f76a01df8250092a32d4d55acb2526fd', + 'gc_11_0_4_pfp.bin': '5ae8b7bb6316f87ae8b978354c088e3bd8c890959382d72886377cda25b1ffd1', + 'gc_11_5_0_pfp.bin': '0124f540871a7759fa8aaae046d458dfb34aeea12a1183ff962c3f1a33067d5a', + 'gc_11_5_1_pfp.bin': '7794ea46d0d3cf9cb3f7938affbdf09dd7a9970340da5cd02b774cb393436d24', + 'gc_11_5_2_pfp.bin': '55e64741de28c506524959f7f696713a72aafe46f49ccd827781d67a9475b386', + 'gc_11_5_3_pfp.bin': 'ce805040fb347fddbc89b2715e66b446865dda9e2056a9b233269b72bc09c387', + 'gc_12_0_0_pfp.bin': '16bfd64c10fe73b5e760055069a60e5841dba16c0ed4edb56c20d675e23901f6', + 'gc_12_0_1_pfp.bin': '49efb319305c5fffd90ac1eef7d7a0bdec72998ecb5cf4526996311788a53dc3', + 'gc_10_3_6_me.bin': '141b59faad3f2f1be16a2178833b7ca8e97519e1e844c8fda6689572c3767902', + 'gc_10_3_7_me.bin': '9eb0b56e9bcc9dad5d53437b162226fcb37e5df102832260f1232832f3658edf', + 'gc_11_0_0_me.bin': 'f8fba8a63dd4293b8fc1e4aab78b6fac630e575d1d62838c7996d9210f82aea1', + 'gc_11_0_1_me.bin': '5030040b00955de94876341ec64ea43b96640413d7a03dc460a83c8386bf76e0', + 'gc_11_0_2_me.bin': '0f21fd43f1dfbc6ccced9a2b3774de25c993c61a689aabab8b45333937b7945e', + 'gc_11_0_3_me.bin': '3acb5061dba342ade81d329d1932f19ec01f0c5bf44e6e3568008a951a351bac', + 'gc_11_0_4_me.bin': 'e4f1f6abcd213d54ad9e885d9f550083b0e2f67d983566015e8a53981e1cb155', + 'gc_11_5_0_me.bin': '8f906b64d0a29503daa662c93ec44d076fcac11b78f70cd50ce0af2b500a05a6', + 'gc_11_5_1_me.bin': '7e42602bcbaf1e511f8b4f6ed2246844ad1f6e351ce2b663d89062a7be263663', + 'gc_11_5_2_me.bin': 'aae26255d8efff81e0e3bbcb727efb8b837d8e25fe85c708545f5328f1077b50', + 'gc_11_5_3_me.bin': '93cd588348b16fe432609fe8da6e6b5da0a52da5c5884882aecf7b1001f72700', + 'gc_12_0_0_me.bin': 'd7eba5197f2580f32b8256b1d9cb68e723e9e644293a34446a7913e3c093cba5', + 'gc_12_0_1_me.bin': '365e7f193b39cbb10d3af44905fefaca0e9844721801755276baebac7b19c1ea', + 'gc_10_3_6_mec.bin': '247943415658159704a21f670dd7b3e7cb2d2fc0c17b000a5098715979c8d95e', + 'gc_10_3_7_mec.bin': 'ee58a523375bcf5b89400b32b801f95e182b632a26bce4f2bed5c07928d486dc', + 'gc_11_0_0_mec.bin': '801a09c9bf06188260db9b51ad8f978f15d84c72ca91b90643a2ef8af4074776', + 'gc_11_0_1_mec.bin': '6afadcb7504bb11bcc9d4a205cdf73f7934a615e28f178fcf7285971df2ccd05', + 'gc_11_0_2_mec.bin': '0da0edee28c73a6fa1191f77853d380ec2503cbf43e0aaae4617f32f1f8a48fa', + 'gc_11_0_3_mec.bin': '323cfa6658b6b5169830f852e2ff0552acae8dfb9e44b42c63de7b2900d3fd9e', + 'gc_11_0_4_mec.bin': '5d89cf6b60354f3746c2cbd1ff0cb1a741556ca20d72745242cb69b553d0985c', + 'gc_11_5_0_mec.bin': 'a01c324ab14ec89792449a621a541829b9af26865019027a411a14b910145dfa', + 'gc_11_5_1_mec.bin': 'eab05719371caa68df09d4f7574e3958a3c4f5044ab3c7b0d2b214add0c6d1c4', + 'gc_11_5_2_mec.bin': 'a374b2335802e24f8b9a3ce40000a1d37a52a14eb87099bebcc6680c27cc93e5', + 'gc_11_5_3_mec.bin': '165025437cba80dd32c19ebbc83b756fa7adac7053ff7780ba4aa2f8089c6a3f', + 'gc_12_0_0_mec.bin': '1931593440b8f9423580d9e2cdc5b34e7c682cdffe1ca4b74b0c2f6a0420236d', + 'gc_12_0_1_mec.bin': 'f57541688a5108730bf210663f1137ffc2121f3acfe614a6de09ec1982c69a2f', + 'gc_9_4_3_mec.bin': '3159176e72301fb88dc416721fb3d0ab82ece484cf93a43c3f37430c7e6673a1', + 'gc_9_4_3_sjt_mec.bin': 'd19468dbb47849640bd0e6cdc8d7e25a3c8442c7ca2ca81357702e0d6baab50f', + 'gc_9_4_4_mec.bin': '5004f73e43db2dd45e77d65942e33d4a69e7157618cfd23944c30f801c77a0f3', + 'gc_9_4_4_sjt_mec.bin': '627a9e98102e70fe3bf0947eb764187f29f5e775d1130c7310e0ba5fc0502dbe', + 'gc_9_5_0_mec.bin': 'c5eca4311a6f6e8f81cf41c2c46941d5dcf90789ee8326901da2dfc86ac14c31', + 'gc_9_5_0_sjt_mec.bin': 'f162e509379288e3f3b1eead541b315c2262d625d433287ecd34ca185614d312', + 'gc_11_0_0_imu.bin': 'b4f8fc056b45709a6abf48e7885fb1b4ab8d3cc092cbfa2c554a78564a6403bc', + 'gc_11_0_1_imu.bin': 'ac71f4eec713fc35b4a1fe27531e3eb04edd81eeac2cef64df01ac50d8510805', + 'gc_11_0_2_imu.bin': '9befca62b0b0cfd252c3df4a9edca295526f4d43821cd99a6326454995a6ca2d', + 'gc_11_0_3_imu.bin': 'beaf704d5acdf4623456b0d0cbcea8b8e428058340cd922a259a9045f5c457a3', + 'gc_11_0_4_imu.bin': 'ac71f4eec713fc35b4a1fe27531e3eb04edd81eeac2cef64df01ac50d8510805', + 'gc_11_5_0_imu.bin': '469add57cafead90ab1953d6039cd8e39bc50dfd78aa5fd78f019ccf66a0af41', + 'gc_11_5_1_imu.bin': '0aaca8a01b2237fca1b3c0cd082b5e12a271df334ff368bbf8e2be17f192b785', + 'gc_11_5_2_imu.bin': 'fb684842839c61a0706a19df8e15eb8afc17e20c14267eb71e7d7d824c180acf', + 'gc_11_5_3_imu.bin': 'fb684842839c61a0706a19df8e15eb8afc17e20c14267eb71e7d7d824c180acf', + 'gc_12_0_0_imu.bin': 'aa15e5b3156bffc45e0c50bccbcd364fbd3f958531b695b7487a803d780b8328', + 'gc_12_0_1_imu.bin': 'b3b301fb636efc77b63ce4d2ced0f90c851d03c19681852faa45598e6f5773fd', + 'gc_10_3_6_rlc.bin': 'acfbac75c0dcfbfe40e222640ef17eb3dc8d206d30bc3863f275f2dd1cb132a5', + 'gc_10_3_7_rlc.bin': 'a02585ebe3b36d942e883057119572d9497600c52fc65b8a523487eb65d874f2', + 'gc_11_0_0_rlc.bin': 'dabd49039772d02f5fd5e48dc21d35ad52a6b1283b470dabca86ca159c4c7c8e', + 'gc_11_0_1_rlc.bin': '86145719a58e9428562930c6b5ee3b6ced4701d34a80d0b4d84d6026c93134f2', + 'gc_11_0_2_rlc.bin': 'b43eb2fd0600f50a1a5796bc9983d6b39b5c20960234920f5e89cb362193e0b8', + 'gc_11_0_3_rlc.bin': '29b0b456f5b53076ddffa6f09de3bb697219e8e7b33504bf6c197e8b858426dc', + 'gc_11_0_4_rlc.bin': '823573078b608108fbe4dd8176c396ec582632913db9c59a512d82b068f8eba0', + 'gc_11_5_0_rlc.bin': '68cd85567f4f2f8d6b80db294988806d956bf826979c3597daccb71c7ee6aadd', + 'gc_11_5_1_rlc.bin': '92731ecabbeb77865fb71787b4268dc738a58779f1190bdc2056482cb88a08f6', + 'gc_11_5_2_rlc.bin': 'ef3a9209d3eccfbe18fce9e972c146ac283719798bb788096c176b796dc9aee5', + 'gc_11_5_3_rlc.bin': '10a68940c6258d5818d9c05fd98eb0ccc8d5aee99b2769fbad30e5abd0d9327e', + 'gc_12_0_0_rlc.bin': '6436b582734a413456fff3d3c7195e71cc9e78a7ed31ee21c83ffd6fae1ad186', + 'gc_12_0_1_rlc.bin': '6ba4459532246a5c415d3cb33c9b1248294e48f67b827e2accb292a8d1a5c0ec', + 'gc_9_4_3_rlc.bin': '5345d388712d547b0ae16f199ad5ccadb65643584b3efa7817049ddeb3fdcd12', + 'gc_9_4_4_rlc.bin': 'e0c3585c72f8136670ca63e607fba32c1ae4948f493f13e33fc4d466bd6318a8', + 'gc_9_5_0_rlc.bin': '9b1268f5751153fe57f527c9acb417bfa53ed42c9bc083c9d3da2ba61fe5fdc4', +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/navi_offsets.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/navi_offsets.py new file mode 100644 index 000000000..021799563 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/navi_offsets.py @@ -0,0 +1,823 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class struct_IP_BASE_INSTANCE(c.Struct): + SIZE = 20 + segment: c.Array[ctypes.c_uint32, Literal[5]] +struct_IP_BASE_INSTANCE.register_fields([('segment', c.Array[ctypes.c_uint32, Literal[5]], 0)]) +@c.record +class struct_IP_BASE(c.Struct): + SIZE = 140 + instance: c.Array[struct_IP_BASE_INSTANCE, Literal[7]] +struct_IP_BASE.register_fields([('instance', c.Array[struct_IP_BASE_INSTANCE, Literal[7]], 0)]) +MAX_INSTANCE = 7 +MAX_SEGMENT = 5 +ATHUB_BASE__INST0_SEG0 = 0x00000C00 +ATHUB_BASE__INST0_SEG1 = 0x02408C00 +ATHUB_BASE__INST0_SEG2 = 0 +ATHUB_BASE__INST0_SEG3 = 0 +ATHUB_BASE__INST0_SEG4 = 0 +ATHUB_BASE__INST1_SEG0 = 0 +ATHUB_BASE__INST1_SEG1 = 0 +ATHUB_BASE__INST1_SEG2 = 0 +ATHUB_BASE__INST1_SEG3 = 0 +ATHUB_BASE__INST1_SEG4 = 0 +ATHUB_BASE__INST2_SEG0 = 0 +ATHUB_BASE__INST2_SEG1 = 0 +ATHUB_BASE__INST2_SEG2 = 0 +ATHUB_BASE__INST2_SEG3 = 0 +ATHUB_BASE__INST2_SEG4 = 0 +ATHUB_BASE__INST3_SEG0 = 0 +ATHUB_BASE__INST3_SEG1 = 0 +ATHUB_BASE__INST3_SEG2 = 0 +ATHUB_BASE__INST3_SEG3 = 0 +ATHUB_BASE__INST3_SEG4 = 0 +ATHUB_BASE__INST4_SEG0 = 0 +ATHUB_BASE__INST4_SEG1 = 0 +ATHUB_BASE__INST4_SEG2 = 0 +ATHUB_BASE__INST4_SEG3 = 0 +ATHUB_BASE__INST4_SEG4 = 0 +ATHUB_BASE__INST5_SEG0 = 0 +ATHUB_BASE__INST5_SEG1 = 0 +ATHUB_BASE__INST5_SEG2 = 0 +ATHUB_BASE__INST5_SEG3 = 0 +ATHUB_BASE__INST5_SEG4 = 0 +ATHUB_BASE__INST6_SEG0 = 0 +ATHUB_BASE__INST6_SEG1 = 0 +ATHUB_BASE__INST6_SEG2 = 0 +ATHUB_BASE__INST6_SEG3 = 0 +ATHUB_BASE__INST6_SEG4 = 0 +CLK_BASE__INST0_SEG0 = 0x00016C00 +CLK_BASE__INST0_SEG1 = 0x02401800 +CLK_BASE__INST0_SEG2 = 0 +CLK_BASE__INST0_SEG3 = 0 +CLK_BASE__INST0_SEG4 = 0 +CLK_BASE__INST1_SEG0 = 0x00016E00 +CLK_BASE__INST1_SEG1 = 0x02401C00 +CLK_BASE__INST1_SEG2 = 0 +CLK_BASE__INST1_SEG3 = 0 +CLK_BASE__INST1_SEG4 = 0 +CLK_BASE__INST2_SEG0 = 0x00017000 +CLK_BASE__INST2_SEG1 = 0x02402000 +CLK_BASE__INST2_SEG2 = 0 +CLK_BASE__INST2_SEG3 = 0 +CLK_BASE__INST2_SEG4 = 0 +CLK_BASE__INST3_SEG0 = 0x00017200 +CLK_BASE__INST3_SEG1 = 0x02402400 +CLK_BASE__INST3_SEG2 = 0 +CLK_BASE__INST3_SEG3 = 0 +CLK_BASE__INST3_SEG4 = 0 +CLK_BASE__INST4_SEG0 = 0x0001B000 +CLK_BASE__INST4_SEG1 = 0x0242D800 +CLK_BASE__INST4_SEG2 = 0 +CLK_BASE__INST4_SEG3 = 0 +CLK_BASE__INST4_SEG4 = 0 +CLK_BASE__INST5_SEG0 = 0x0001B200 +CLK_BASE__INST5_SEG1 = 0x0242DC00 +CLK_BASE__INST5_SEG2 = 0 +CLK_BASE__INST5_SEG3 = 0 +CLK_BASE__INST5_SEG4 = 0 +CLK_BASE__INST6_SEG0 = 0x0001B400 +CLK_BASE__INST6_SEG1 = 0x0242E000 +CLK_BASE__INST6_SEG2 = 0 +CLK_BASE__INST6_SEG3 = 0 +CLK_BASE__INST6_SEG4 = 0 +DF_BASE__INST0_SEG0 = 0x00007000 +DF_BASE__INST0_SEG1 = 0x0240B800 +DF_BASE__INST0_SEG2 = 0 +DF_BASE__INST0_SEG3 = 0 +DF_BASE__INST0_SEG4 = 0 +DF_BASE__INST1_SEG0 = 0 +DF_BASE__INST1_SEG1 = 0 +DF_BASE__INST1_SEG2 = 0 +DF_BASE__INST1_SEG3 = 0 +DF_BASE__INST1_SEG4 = 0 +DF_BASE__INST2_SEG0 = 0 +DF_BASE__INST2_SEG1 = 0 +DF_BASE__INST2_SEG2 = 0 +DF_BASE__INST2_SEG3 = 0 +DF_BASE__INST2_SEG4 = 0 +DF_BASE__INST3_SEG0 = 0 +DF_BASE__INST3_SEG1 = 0 +DF_BASE__INST3_SEG2 = 0 +DF_BASE__INST3_SEG3 = 0 +DF_BASE__INST3_SEG4 = 0 +DF_BASE__INST4_SEG0 = 0 +DF_BASE__INST4_SEG1 = 0 +DF_BASE__INST4_SEG2 = 0 +DF_BASE__INST4_SEG3 = 0 +DF_BASE__INST4_SEG4 = 0 +DF_BASE__INST5_SEG0 = 0 +DF_BASE__INST5_SEG1 = 0 +DF_BASE__INST5_SEG2 = 0 +DF_BASE__INST5_SEG3 = 0 +DF_BASE__INST5_SEG4 = 0 +DF_BASE__INST6_SEG0 = 0 +DF_BASE__INST6_SEG1 = 0 +DF_BASE__INST6_SEG2 = 0 +DF_BASE__INST6_SEG3 = 0 +DF_BASE__INST6_SEG4 = 0 +DIO_BASE__INST0_SEG0 = 0x02404000 +DIO_BASE__INST0_SEG1 = 0 +DIO_BASE__INST0_SEG2 = 0 +DIO_BASE__INST0_SEG3 = 0 +DIO_BASE__INST0_SEG4 = 0 +DIO_BASE__INST1_SEG0 = 0 +DIO_BASE__INST1_SEG1 = 0 +DIO_BASE__INST1_SEG2 = 0 +DIO_BASE__INST1_SEG3 = 0 +DIO_BASE__INST1_SEG4 = 0 +DIO_BASE__INST2_SEG0 = 0 +DIO_BASE__INST2_SEG1 = 0 +DIO_BASE__INST2_SEG2 = 0 +DIO_BASE__INST2_SEG3 = 0 +DIO_BASE__INST2_SEG4 = 0 +DIO_BASE__INST3_SEG0 = 0 +DIO_BASE__INST3_SEG1 = 0 +DIO_BASE__INST3_SEG2 = 0 +DIO_BASE__INST3_SEG3 = 0 +DIO_BASE__INST3_SEG4 = 0 +DIO_BASE__INST4_SEG0 = 0 +DIO_BASE__INST4_SEG1 = 0 +DIO_BASE__INST4_SEG2 = 0 +DIO_BASE__INST4_SEG3 = 0 +DIO_BASE__INST4_SEG4 = 0 +DIO_BASE__INST5_SEG0 = 0 +DIO_BASE__INST5_SEG1 = 0 +DIO_BASE__INST5_SEG2 = 0 +DIO_BASE__INST5_SEG3 = 0 +DIO_BASE__INST5_SEG4 = 0 +DIO_BASE__INST6_SEG0 = 0 +DIO_BASE__INST6_SEG1 = 0 +DIO_BASE__INST6_SEG2 = 0 +DIO_BASE__INST6_SEG3 = 0 +DIO_BASE__INST6_SEG4 = 0 +DCN_BASE__INST0_SEG0 = 0x00000012 +DCN_BASE__INST0_SEG1 = 0x000000C0 +DCN_BASE__INST0_SEG2 = 0x000034C0 +DCN_BASE__INST0_SEG3 = 0x00009000 +DCN_BASE__INST0_SEG4 = 0x02403C00 +DCN_BASE__INST1_SEG0 = 0 +DCN_BASE__INST1_SEG1 = 0 +DCN_BASE__INST1_SEG2 = 0 +DCN_BASE__INST1_SEG3 = 0 +DCN_BASE__INST1_SEG4 = 0 +DCN_BASE__INST2_SEG0 = 0 +DCN_BASE__INST2_SEG1 = 0 +DCN_BASE__INST2_SEG2 = 0 +DCN_BASE__INST2_SEG3 = 0 +DCN_BASE__INST2_SEG4 = 0 +DCN_BASE__INST3_SEG0 = 0 +DCN_BASE__INST3_SEG1 = 0 +DCN_BASE__INST3_SEG2 = 0 +DCN_BASE__INST3_SEG3 = 0 +DCN_BASE__INST3_SEG4 = 0 +DCN_BASE__INST4_SEG0 = 0 +DCN_BASE__INST4_SEG1 = 0 +DCN_BASE__INST4_SEG2 = 0 +DCN_BASE__INST4_SEG3 = 0 +DCN_BASE__INST4_SEG4 = 0 +DCN_BASE__INST5_SEG0 = 0 +DCN_BASE__INST5_SEG1 = 0 +DCN_BASE__INST5_SEG2 = 0 +DCN_BASE__INST5_SEG3 = 0 +DCN_BASE__INST5_SEG4 = 0 +DCN_BASE__INST6_SEG0 = 0 +DCN_BASE__INST6_SEG1 = 0 +DCN_BASE__INST6_SEG2 = 0 +DCN_BASE__INST6_SEG3 = 0 +DCN_BASE__INST6_SEG4 = 0 +DPCS_BASE__INST0_SEG0 = 0x00000012 +DPCS_BASE__INST0_SEG1 = 0x000000C0 +DPCS_BASE__INST0_SEG2 = 0x000034C0 +DPCS_BASE__INST0_SEG3 = 0x00009000 +DPCS_BASE__INST0_SEG4 = 0x02403C00 +DPCS_BASE__INST1_SEG0 = 0 +DPCS_BASE__INST1_SEG1 = 0 +DPCS_BASE__INST1_SEG2 = 0 +DPCS_BASE__INST1_SEG3 = 0 +DPCS_BASE__INST1_SEG4 = 0 +DPCS_BASE__INST2_SEG0 = 0 +DPCS_BASE__INST2_SEG1 = 0 +DPCS_BASE__INST2_SEG2 = 0 +DPCS_BASE__INST2_SEG3 = 0 +DPCS_BASE__INST2_SEG4 = 0 +DPCS_BASE__INST3_SEG0 = 0 +DPCS_BASE__INST3_SEG1 = 0 +DPCS_BASE__INST3_SEG2 = 0 +DPCS_BASE__INST3_SEG3 = 0 +DPCS_BASE__INST3_SEG4 = 0 +DPCS_BASE__INST4_SEG0 = 0 +DPCS_BASE__INST4_SEG1 = 0 +DPCS_BASE__INST4_SEG2 = 0 +DPCS_BASE__INST4_SEG3 = 0 +DPCS_BASE__INST4_SEG4 = 0 +DPCS_BASE__INST5_SEG0 = 0 +DPCS_BASE__INST5_SEG1 = 0 +DPCS_BASE__INST5_SEG2 = 0 +DPCS_BASE__INST5_SEG3 = 0 +DPCS_BASE__INST5_SEG4 = 0 +DPCS_BASE__INST6_SEG0 = 0 +DPCS_BASE__INST6_SEG1 = 0 +DPCS_BASE__INST6_SEG2 = 0 +DPCS_BASE__INST6_SEG3 = 0 +DPCS_BASE__INST6_SEG4 = 0 +FUSE_BASE__INST0_SEG0 = 0x00017400 +FUSE_BASE__INST0_SEG1 = 0x02401400 +FUSE_BASE__INST0_SEG2 = 0 +FUSE_BASE__INST0_SEG3 = 0 +FUSE_BASE__INST0_SEG4 = 0 +FUSE_BASE__INST1_SEG0 = 0 +FUSE_BASE__INST1_SEG1 = 0 +FUSE_BASE__INST1_SEG2 = 0 +FUSE_BASE__INST1_SEG3 = 0 +FUSE_BASE__INST1_SEG4 = 0 +FUSE_BASE__INST2_SEG0 = 0 +FUSE_BASE__INST2_SEG1 = 0 +FUSE_BASE__INST2_SEG2 = 0 +FUSE_BASE__INST2_SEG3 = 0 +FUSE_BASE__INST2_SEG4 = 0 +FUSE_BASE__INST3_SEG0 = 0 +FUSE_BASE__INST3_SEG1 = 0 +FUSE_BASE__INST3_SEG2 = 0 +FUSE_BASE__INST3_SEG3 = 0 +FUSE_BASE__INST3_SEG4 = 0 +FUSE_BASE__INST4_SEG0 = 0 +FUSE_BASE__INST4_SEG1 = 0 +FUSE_BASE__INST4_SEG2 = 0 +FUSE_BASE__INST4_SEG3 = 0 +FUSE_BASE__INST4_SEG4 = 0 +FUSE_BASE__INST5_SEG0 = 0 +FUSE_BASE__INST5_SEG1 = 0 +FUSE_BASE__INST5_SEG2 = 0 +FUSE_BASE__INST5_SEG3 = 0 +FUSE_BASE__INST5_SEG4 = 0 +FUSE_BASE__INST6_SEG0 = 0 +FUSE_BASE__INST6_SEG1 = 0 +FUSE_BASE__INST6_SEG2 = 0 +FUSE_BASE__INST6_SEG3 = 0 +FUSE_BASE__INST6_SEG4 = 0 +GC_BASE__INST0_SEG0 = 0x00001260 +GC_BASE__INST0_SEG1 = 0x0000A000 +GC_BASE__INST0_SEG2 = 0x0001C000 +GC_BASE__INST0_SEG3 = 0x02402C00 +GC_BASE__INST0_SEG4 = 0 +GC_BASE__INST1_SEG0 = 0 +GC_BASE__INST1_SEG1 = 0 +GC_BASE__INST1_SEG2 = 0 +GC_BASE__INST1_SEG3 = 0 +GC_BASE__INST1_SEG4 = 0 +GC_BASE__INST2_SEG0 = 0 +GC_BASE__INST2_SEG1 = 0 +GC_BASE__INST2_SEG2 = 0 +GC_BASE__INST2_SEG3 = 0 +GC_BASE__INST2_SEG4 = 0 +GC_BASE__INST3_SEG0 = 0 +GC_BASE__INST3_SEG1 = 0 +GC_BASE__INST3_SEG2 = 0 +GC_BASE__INST3_SEG3 = 0 +GC_BASE__INST3_SEG4 = 0 +GC_BASE__INST4_SEG0 = 0 +GC_BASE__INST4_SEG1 = 0 +GC_BASE__INST4_SEG2 = 0 +GC_BASE__INST4_SEG3 = 0 +GC_BASE__INST4_SEG4 = 0 +GC_BASE__INST5_SEG0 = 0 +GC_BASE__INST5_SEG1 = 0 +GC_BASE__INST5_SEG2 = 0 +GC_BASE__INST5_SEG3 = 0 +GC_BASE__INST5_SEG4 = 0 +GC_BASE__INST6_SEG0 = 0 +GC_BASE__INST6_SEG1 = 0 +GC_BASE__INST6_SEG2 = 0 +GC_BASE__INST6_SEG3 = 0 +GC_BASE__INST6_SEG4 = 0 +HDA_BASE__INST0_SEG0 = 0x004C0000 +HDA_BASE__INST0_SEG1 = 0x02404800 +HDA_BASE__INST0_SEG2 = 0 +HDA_BASE__INST0_SEG3 = 0 +HDA_BASE__INST0_SEG4 = 0 +HDA_BASE__INST1_SEG0 = 0 +HDA_BASE__INST1_SEG1 = 0 +HDA_BASE__INST1_SEG2 = 0 +HDA_BASE__INST1_SEG3 = 0 +HDA_BASE__INST1_SEG4 = 0 +HDA_BASE__INST2_SEG0 = 0 +HDA_BASE__INST2_SEG1 = 0 +HDA_BASE__INST2_SEG2 = 0 +HDA_BASE__INST2_SEG3 = 0 +HDA_BASE__INST2_SEG4 = 0 +HDA_BASE__INST3_SEG0 = 0 +HDA_BASE__INST3_SEG1 = 0 +HDA_BASE__INST3_SEG2 = 0 +HDA_BASE__INST3_SEG3 = 0 +HDA_BASE__INST3_SEG4 = 0 +HDA_BASE__INST4_SEG0 = 0 +HDA_BASE__INST4_SEG1 = 0 +HDA_BASE__INST4_SEG2 = 0 +HDA_BASE__INST4_SEG3 = 0 +HDA_BASE__INST4_SEG4 = 0 +HDA_BASE__INST5_SEG0 = 0 +HDA_BASE__INST5_SEG1 = 0 +HDA_BASE__INST5_SEG2 = 0 +HDA_BASE__INST5_SEG3 = 0 +HDA_BASE__INST5_SEG4 = 0 +HDA_BASE__INST6_SEG0 = 0 +HDA_BASE__INST6_SEG1 = 0 +HDA_BASE__INST6_SEG2 = 0 +HDA_BASE__INST6_SEG3 = 0 +HDA_BASE__INST6_SEG4 = 0 +HDP_BASE__INST0_SEG0 = 0x00000F20 +HDP_BASE__INST0_SEG1 = 0x0240A400 +HDP_BASE__INST0_SEG2 = 0 +HDP_BASE__INST0_SEG3 = 0 +HDP_BASE__INST0_SEG4 = 0 +HDP_BASE__INST1_SEG0 = 0 +HDP_BASE__INST1_SEG1 = 0 +HDP_BASE__INST1_SEG2 = 0 +HDP_BASE__INST1_SEG3 = 0 +HDP_BASE__INST1_SEG4 = 0 +HDP_BASE__INST2_SEG0 = 0 +HDP_BASE__INST2_SEG1 = 0 +HDP_BASE__INST2_SEG2 = 0 +HDP_BASE__INST2_SEG3 = 0 +HDP_BASE__INST2_SEG4 = 0 +HDP_BASE__INST3_SEG0 = 0 +HDP_BASE__INST3_SEG1 = 0 +HDP_BASE__INST3_SEG2 = 0 +HDP_BASE__INST3_SEG3 = 0 +HDP_BASE__INST3_SEG4 = 0 +HDP_BASE__INST4_SEG0 = 0 +HDP_BASE__INST4_SEG1 = 0 +HDP_BASE__INST4_SEG2 = 0 +HDP_BASE__INST4_SEG3 = 0 +HDP_BASE__INST4_SEG4 = 0 +HDP_BASE__INST5_SEG0 = 0 +HDP_BASE__INST5_SEG1 = 0 +HDP_BASE__INST5_SEG2 = 0 +HDP_BASE__INST5_SEG3 = 0 +HDP_BASE__INST5_SEG4 = 0 +HDP_BASE__INST6_SEG0 = 0 +HDP_BASE__INST6_SEG1 = 0 +HDP_BASE__INST6_SEG2 = 0 +HDP_BASE__INST6_SEG3 = 0 +HDP_BASE__INST6_SEG4 = 0 +MMHUB_BASE__INST0_SEG0 = 0x0001A000 +MMHUB_BASE__INST0_SEG1 = 0x02408800 +MMHUB_BASE__INST0_SEG2 = 0 +MMHUB_BASE__INST0_SEG3 = 0 +MMHUB_BASE__INST0_SEG4 = 0 +MMHUB_BASE__INST1_SEG0 = 0 +MMHUB_BASE__INST1_SEG1 = 0 +MMHUB_BASE__INST1_SEG2 = 0 +MMHUB_BASE__INST1_SEG3 = 0 +MMHUB_BASE__INST1_SEG4 = 0 +MMHUB_BASE__INST2_SEG0 = 0 +MMHUB_BASE__INST2_SEG1 = 0 +MMHUB_BASE__INST2_SEG2 = 0 +MMHUB_BASE__INST2_SEG3 = 0 +MMHUB_BASE__INST2_SEG4 = 0 +MMHUB_BASE__INST3_SEG0 = 0 +MMHUB_BASE__INST3_SEG1 = 0 +MMHUB_BASE__INST3_SEG2 = 0 +MMHUB_BASE__INST3_SEG3 = 0 +MMHUB_BASE__INST3_SEG4 = 0 +MMHUB_BASE__INST4_SEG0 = 0 +MMHUB_BASE__INST4_SEG1 = 0 +MMHUB_BASE__INST4_SEG2 = 0 +MMHUB_BASE__INST4_SEG3 = 0 +MMHUB_BASE__INST4_SEG4 = 0 +MMHUB_BASE__INST5_SEG0 = 0 +MMHUB_BASE__INST5_SEG1 = 0 +MMHUB_BASE__INST5_SEG2 = 0 +MMHUB_BASE__INST5_SEG3 = 0 +MMHUB_BASE__INST5_SEG4 = 0 +MMHUB_BASE__INST6_SEG0 = 0 +MMHUB_BASE__INST6_SEG1 = 0 +MMHUB_BASE__INST6_SEG2 = 0 +MMHUB_BASE__INST6_SEG3 = 0 +MMHUB_BASE__INST6_SEG4 = 0 +MP0_BASE__INST0_SEG0 = 0x00016000 +MP0_BASE__INST0_SEG1 = 0x00DC0000 +MP0_BASE__INST0_SEG2 = 0x00E00000 +MP0_BASE__INST0_SEG3 = 0x00E40000 +MP0_BASE__INST0_SEG4 = 0x0243FC00 +MP0_BASE__INST1_SEG0 = 0 +MP0_BASE__INST1_SEG1 = 0 +MP0_BASE__INST1_SEG2 = 0 +MP0_BASE__INST1_SEG3 = 0 +MP0_BASE__INST1_SEG4 = 0 +MP0_BASE__INST2_SEG0 = 0 +MP0_BASE__INST2_SEG1 = 0 +MP0_BASE__INST2_SEG2 = 0 +MP0_BASE__INST2_SEG3 = 0 +MP0_BASE__INST2_SEG4 = 0 +MP0_BASE__INST3_SEG0 = 0 +MP0_BASE__INST3_SEG1 = 0 +MP0_BASE__INST3_SEG2 = 0 +MP0_BASE__INST3_SEG3 = 0 +MP0_BASE__INST3_SEG4 = 0 +MP0_BASE__INST4_SEG0 = 0 +MP0_BASE__INST4_SEG1 = 0 +MP0_BASE__INST4_SEG2 = 0 +MP0_BASE__INST4_SEG3 = 0 +MP0_BASE__INST4_SEG4 = 0 +MP0_BASE__INST5_SEG0 = 0 +MP0_BASE__INST5_SEG1 = 0 +MP0_BASE__INST5_SEG2 = 0 +MP0_BASE__INST5_SEG3 = 0 +MP0_BASE__INST5_SEG4 = 0 +MP0_BASE__INST6_SEG0 = 0 +MP0_BASE__INST6_SEG1 = 0 +MP0_BASE__INST6_SEG2 = 0 +MP0_BASE__INST6_SEG3 = 0 +MP0_BASE__INST6_SEG4 = 0 +MP1_BASE__INST0_SEG0 = 0x00016000 +MP1_BASE__INST0_SEG1 = 0x00DC0000 +MP1_BASE__INST0_SEG2 = 0x00E00000 +MP1_BASE__INST0_SEG3 = 0x00E40000 +MP1_BASE__INST0_SEG4 = 0x0243FC00 +MP1_BASE__INST1_SEG0 = 0 +MP1_BASE__INST1_SEG1 = 0 +MP1_BASE__INST1_SEG2 = 0 +MP1_BASE__INST1_SEG3 = 0 +MP1_BASE__INST1_SEG4 = 0 +MP1_BASE__INST2_SEG0 = 0 +MP1_BASE__INST2_SEG1 = 0 +MP1_BASE__INST2_SEG2 = 0 +MP1_BASE__INST2_SEG3 = 0 +MP1_BASE__INST2_SEG4 = 0 +MP1_BASE__INST3_SEG0 = 0 +MP1_BASE__INST3_SEG1 = 0 +MP1_BASE__INST3_SEG2 = 0 +MP1_BASE__INST3_SEG3 = 0 +MP1_BASE__INST3_SEG4 = 0 +MP1_BASE__INST4_SEG0 = 0 +MP1_BASE__INST4_SEG1 = 0 +MP1_BASE__INST4_SEG2 = 0 +MP1_BASE__INST4_SEG3 = 0 +MP1_BASE__INST4_SEG4 = 0 +MP1_BASE__INST5_SEG0 = 0 +MP1_BASE__INST5_SEG1 = 0 +MP1_BASE__INST5_SEG2 = 0 +MP1_BASE__INST5_SEG3 = 0 +MP1_BASE__INST5_SEG4 = 0 +MP1_BASE__INST6_SEG0 = 0 +MP1_BASE__INST6_SEG1 = 0 +MP1_BASE__INST6_SEG2 = 0 +MP1_BASE__INST6_SEG3 = 0 +MP1_BASE__INST6_SEG4 = 0 +NBIO_BASE__INST0_SEG0 = 0x00000000 +NBIO_BASE__INST0_SEG1 = 0x00000014 +NBIO_BASE__INST0_SEG2 = 0x00000D20 +NBIO_BASE__INST0_SEG3 = 0x00010400 +NBIO_BASE__INST0_SEG4 = 0x0241B000 +NBIO_BASE__INST1_SEG0 = 0 +NBIO_BASE__INST1_SEG1 = 0 +NBIO_BASE__INST1_SEG2 = 0 +NBIO_BASE__INST1_SEG3 = 0 +NBIO_BASE__INST1_SEG4 = 0 +NBIO_BASE__INST2_SEG0 = 0 +NBIO_BASE__INST2_SEG1 = 0 +NBIO_BASE__INST2_SEG2 = 0 +NBIO_BASE__INST2_SEG3 = 0 +NBIO_BASE__INST2_SEG4 = 0 +NBIO_BASE__INST3_SEG0 = 0 +NBIO_BASE__INST3_SEG1 = 0 +NBIO_BASE__INST3_SEG2 = 0 +NBIO_BASE__INST3_SEG3 = 0 +NBIO_BASE__INST3_SEG4 = 0 +NBIO_BASE__INST4_SEG0 = 0 +NBIO_BASE__INST4_SEG1 = 0 +NBIO_BASE__INST4_SEG2 = 0 +NBIO_BASE__INST4_SEG3 = 0 +NBIO_BASE__INST4_SEG4 = 0 +NBIO_BASE__INST5_SEG0 = 0 +NBIO_BASE__INST5_SEG1 = 0 +NBIO_BASE__INST5_SEG2 = 0 +NBIO_BASE__INST5_SEG3 = 0 +NBIO_BASE__INST5_SEG4 = 0 +NBIO_BASE__INST6_SEG0 = 0 +NBIO_BASE__INST6_SEG1 = 0 +NBIO_BASE__INST6_SEG2 = 0 +NBIO_BASE__INST6_SEG3 = 0 +NBIO_BASE__INST6_SEG4 = 0 +OSSSYS_BASE__INST0_SEG0 = 0x000010A0 +OSSSYS_BASE__INST0_SEG1 = 0x0240A000 +OSSSYS_BASE__INST0_SEG2 = 0 +OSSSYS_BASE__INST0_SEG3 = 0 +OSSSYS_BASE__INST0_SEG4 = 0 +OSSSYS_BASE__INST1_SEG0 = 0 +OSSSYS_BASE__INST1_SEG1 = 0 +OSSSYS_BASE__INST1_SEG2 = 0 +OSSSYS_BASE__INST1_SEG3 = 0 +OSSSYS_BASE__INST1_SEG4 = 0 +OSSSYS_BASE__INST2_SEG0 = 0 +OSSSYS_BASE__INST2_SEG1 = 0 +OSSSYS_BASE__INST2_SEG2 = 0 +OSSSYS_BASE__INST2_SEG3 = 0 +OSSSYS_BASE__INST2_SEG4 = 0 +OSSSYS_BASE__INST3_SEG0 = 0 +OSSSYS_BASE__INST3_SEG1 = 0 +OSSSYS_BASE__INST3_SEG2 = 0 +OSSSYS_BASE__INST3_SEG3 = 0 +OSSSYS_BASE__INST3_SEG4 = 0 +OSSSYS_BASE__INST4_SEG0 = 0 +OSSSYS_BASE__INST4_SEG1 = 0 +OSSSYS_BASE__INST4_SEG2 = 0 +OSSSYS_BASE__INST4_SEG3 = 0 +OSSSYS_BASE__INST4_SEG4 = 0 +OSSSYS_BASE__INST5_SEG0 = 0 +OSSSYS_BASE__INST5_SEG1 = 0 +OSSSYS_BASE__INST5_SEG2 = 0 +OSSSYS_BASE__INST5_SEG3 = 0 +OSSSYS_BASE__INST5_SEG4 = 0 +OSSSYS_BASE__INST6_SEG0 = 0 +OSSSYS_BASE__INST6_SEG1 = 0 +OSSSYS_BASE__INST6_SEG2 = 0 +OSSSYS_BASE__INST6_SEG3 = 0 +OSSSYS_BASE__INST6_SEG4 = 0 +PCIE0_BASE__INST0_SEG0 = 0x00000000 +PCIE0_BASE__INST0_SEG1 = 0x00000014 +PCIE0_BASE__INST0_SEG2 = 0x00000D20 +PCIE0_BASE__INST0_SEG3 = 0x00010400 +PCIE0_BASE__INST0_SEG4 = 0x0241B000 +PCIE0_BASE__INST1_SEG0 = 0 +PCIE0_BASE__INST1_SEG1 = 0 +PCIE0_BASE__INST1_SEG2 = 0 +PCIE0_BASE__INST1_SEG3 = 0 +PCIE0_BASE__INST1_SEG4 = 0 +PCIE0_BASE__INST2_SEG0 = 0 +PCIE0_BASE__INST2_SEG1 = 0 +PCIE0_BASE__INST2_SEG2 = 0 +PCIE0_BASE__INST2_SEG3 = 0 +PCIE0_BASE__INST2_SEG4 = 0 +PCIE0_BASE__INST3_SEG0 = 0 +PCIE0_BASE__INST3_SEG1 = 0 +PCIE0_BASE__INST3_SEG2 = 0 +PCIE0_BASE__INST3_SEG3 = 0 +PCIE0_BASE__INST3_SEG4 = 0 +PCIE0_BASE__INST4_SEG0 = 0 +PCIE0_BASE__INST4_SEG1 = 0 +PCIE0_BASE__INST4_SEG2 = 0 +PCIE0_BASE__INST4_SEG3 = 0 +PCIE0_BASE__INST4_SEG4 = 0 +PCIE0_BASE__INST5_SEG0 = 0 +PCIE0_BASE__INST5_SEG1 = 0 +PCIE0_BASE__INST5_SEG2 = 0 +PCIE0_BASE__INST5_SEG3 = 0 +PCIE0_BASE__INST5_SEG4 = 0 +PCIE0_BASE__INST6_SEG0 = 0 +PCIE0_BASE__INST6_SEG1 = 0 +PCIE0_BASE__INST6_SEG2 = 0 +PCIE0_BASE__INST6_SEG3 = 0 +PCIE0_BASE__INST6_SEG4 = 0 +SDMA0_BASE__INST0_SEG0 = 0x00001260 +SDMA0_BASE__INST0_SEG1 = 0x0000A000 +SDMA0_BASE__INST0_SEG2 = 0x0001C000 +SDMA0_BASE__INST0_SEG3 = 0x02402C00 +SDMA0_BASE__INST0_SEG4 = 0 +SDMA0_BASE__INST1_SEG0 = 0 +SDMA0_BASE__INST1_SEG1 = 0 +SDMA0_BASE__INST1_SEG2 = 0 +SDMA0_BASE__INST1_SEG3 = 0 +SDMA0_BASE__INST1_SEG4 = 0 +SDMA0_BASE__INST2_SEG0 = 0 +SDMA0_BASE__INST2_SEG1 = 0 +SDMA0_BASE__INST2_SEG2 = 0 +SDMA0_BASE__INST2_SEG3 = 0 +SDMA0_BASE__INST2_SEG4 = 0 +SDMA0_BASE__INST3_SEG0 = 0 +SDMA0_BASE__INST3_SEG1 = 0 +SDMA0_BASE__INST3_SEG2 = 0 +SDMA0_BASE__INST3_SEG3 = 0 +SDMA0_BASE__INST3_SEG4 = 0 +SDMA0_BASE__INST4_SEG0 = 0 +SDMA0_BASE__INST4_SEG1 = 0 +SDMA0_BASE__INST4_SEG2 = 0 +SDMA0_BASE__INST4_SEG3 = 0 +SDMA0_BASE__INST4_SEG4 = 0 +SDMA0_BASE__INST5_SEG0 = 0 +SDMA0_BASE__INST5_SEG1 = 0 +SDMA0_BASE__INST5_SEG2 = 0 +SDMA0_BASE__INST5_SEG3 = 0 +SDMA0_BASE__INST5_SEG4 = 0 +SDMA0_BASE__INST6_SEG0 = 0 +SDMA0_BASE__INST6_SEG1 = 0 +SDMA0_BASE__INST6_SEG2 = 0 +SDMA0_BASE__INST6_SEG3 = 0 +SDMA0_BASE__INST6_SEG4 = 0 +SDMA1_BASE__INST0_SEG0 = 0x00001260 +SDMA1_BASE__INST0_SEG1 = 0x0000A000 +SDMA1_BASE__INST0_SEG2 = 0x0001C000 +SDMA1_BASE__INST0_SEG3 = 0x02402C00 +SDMA1_BASE__INST0_SEG4 = 0 +SDMA1_BASE__INST1_SEG0 = 0 +SDMA1_BASE__INST1_SEG1 = 0 +SDMA1_BASE__INST1_SEG2 = 0 +SDMA1_BASE__INST1_SEG3 = 0 +SDMA1_BASE__INST1_SEG4 = 0 +SDMA1_BASE__INST2_SEG0 = 0 +SDMA1_BASE__INST2_SEG1 = 0 +SDMA1_BASE__INST2_SEG2 = 0 +SDMA1_BASE__INST2_SEG3 = 0 +SDMA1_BASE__INST2_SEG4 = 0 +SDMA1_BASE__INST3_SEG0 = 0 +SDMA1_BASE__INST3_SEG1 = 0 +SDMA1_BASE__INST3_SEG2 = 0 +SDMA1_BASE__INST3_SEG3 = 0 +SDMA1_BASE__INST3_SEG4 = 0 +SDMA1_BASE__INST4_SEG0 = 0 +SDMA1_BASE__INST4_SEG1 = 0 +SDMA1_BASE__INST4_SEG2 = 0 +SDMA1_BASE__INST4_SEG3 = 0 +SDMA1_BASE__INST4_SEG4 = 0 +SDMA1_BASE__INST5_SEG0 = 0 +SDMA1_BASE__INST5_SEG1 = 0 +SDMA1_BASE__INST5_SEG2 = 0 +SDMA1_BASE__INST5_SEG3 = 0 +SDMA1_BASE__INST5_SEG4 = 0 +SDMA1_BASE__INST6_SEG0 = 0 +SDMA1_BASE__INST6_SEG1 = 0 +SDMA1_BASE__INST6_SEG2 = 0 +SDMA1_BASE__INST6_SEG3 = 0 +SDMA1_BASE__INST6_SEG4 = 0 +SMUIO_BASE__INST0_SEG0 = 0x00016800 +SMUIO_BASE__INST0_SEG1 = 0x00016A00 +SMUIO_BASE__INST0_SEG2 = 0x00440000 +SMUIO_BASE__INST0_SEG3 = 0x02401000 +SMUIO_BASE__INST0_SEG4 = 0 +SMUIO_BASE__INST1_SEG0 = 0 +SMUIO_BASE__INST1_SEG1 = 0 +SMUIO_BASE__INST1_SEG2 = 0 +SMUIO_BASE__INST1_SEG3 = 0 +SMUIO_BASE__INST1_SEG4 = 0 +SMUIO_BASE__INST2_SEG0 = 0 +SMUIO_BASE__INST2_SEG1 = 0 +SMUIO_BASE__INST2_SEG2 = 0 +SMUIO_BASE__INST2_SEG3 = 0 +SMUIO_BASE__INST2_SEG4 = 0 +SMUIO_BASE__INST3_SEG0 = 0 +SMUIO_BASE__INST3_SEG1 = 0 +SMUIO_BASE__INST3_SEG2 = 0 +SMUIO_BASE__INST3_SEG3 = 0 +SMUIO_BASE__INST3_SEG4 = 0 +SMUIO_BASE__INST4_SEG0 = 0 +SMUIO_BASE__INST4_SEG1 = 0 +SMUIO_BASE__INST4_SEG2 = 0 +SMUIO_BASE__INST4_SEG3 = 0 +SMUIO_BASE__INST4_SEG4 = 0 +SMUIO_BASE__INST5_SEG0 = 0 +SMUIO_BASE__INST5_SEG1 = 0 +SMUIO_BASE__INST5_SEG2 = 0 +SMUIO_BASE__INST5_SEG3 = 0 +SMUIO_BASE__INST5_SEG4 = 0 +SMUIO_BASE__INST6_SEG0 = 0 +SMUIO_BASE__INST6_SEG1 = 0 +SMUIO_BASE__INST6_SEG2 = 0 +SMUIO_BASE__INST6_SEG3 = 0 +SMUIO_BASE__INST6_SEG4 = 0 +THM_BASE__INST0_SEG0 = 0x00016600 +THM_BASE__INST0_SEG1 = 0x02400C00 +THM_BASE__INST0_SEG2 = 0 +THM_BASE__INST0_SEG3 = 0 +THM_BASE__INST0_SEG4 = 0 +THM_BASE__INST1_SEG0 = 0 +THM_BASE__INST1_SEG1 = 0 +THM_BASE__INST1_SEG2 = 0 +THM_BASE__INST1_SEG3 = 0 +THM_BASE__INST1_SEG4 = 0 +THM_BASE__INST2_SEG0 = 0 +THM_BASE__INST2_SEG1 = 0 +THM_BASE__INST2_SEG2 = 0 +THM_BASE__INST2_SEG3 = 0 +THM_BASE__INST2_SEG4 = 0 +THM_BASE__INST3_SEG0 = 0 +THM_BASE__INST3_SEG1 = 0 +THM_BASE__INST3_SEG2 = 0 +THM_BASE__INST3_SEG3 = 0 +THM_BASE__INST3_SEG4 = 0 +THM_BASE__INST4_SEG0 = 0 +THM_BASE__INST4_SEG1 = 0 +THM_BASE__INST4_SEG2 = 0 +THM_BASE__INST4_SEG3 = 0 +THM_BASE__INST4_SEG4 = 0 +THM_BASE__INST5_SEG0 = 0 +THM_BASE__INST5_SEG1 = 0 +THM_BASE__INST5_SEG2 = 0 +THM_BASE__INST5_SEG3 = 0 +THM_BASE__INST5_SEG4 = 0 +THM_BASE__INST6_SEG0 = 0 +THM_BASE__INST6_SEG1 = 0 +THM_BASE__INST6_SEG2 = 0 +THM_BASE__INST6_SEG3 = 0 +THM_BASE__INST6_SEG4 = 0 +UMC_BASE__INST0_SEG0 = 0x00014000 +UMC_BASE__INST0_SEG1 = 0x02425800 +UMC_BASE__INST0_SEG2 = 0 +UMC_BASE__INST0_SEG3 = 0 +UMC_BASE__INST0_SEG4 = 0 +UMC_BASE__INST1_SEG0 = 0x00054000 +UMC_BASE__INST1_SEG1 = 0x02425C00 +UMC_BASE__INST1_SEG2 = 0 +UMC_BASE__INST1_SEG3 = 0 +UMC_BASE__INST1_SEG4 = 0 +UMC_BASE__INST2_SEG0 = 0x00094000 +UMC_BASE__INST2_SEG1 = 0x02426000 +UMC_BASE__INST2_SEG2 = 0 +UMC_BASE__INST2_SEG3 = 0 +UMC_BASE__INST2_SEG4 = 0 +UMC_BASE__INST3_SEG0 = 0x000D4000 +UMC_BASE__INST3_SEG1 = 0x02426400 +UMC_BASE__INST3_SEG2 = 0 +UMC_BASE__INST3_SEG3 = 0 +UMC_BASE__INST3_SEG4 = 0 +UMC_BASE__INST4_SEG0 = 0x00114000 +UMC_BASE__INST4_SEG1 = 0x02426800 +UMC_BASE__INST4_SEG2 = 0 +UMC_BASE__INST4_SEG3 = 0 +UMC_BASE__INST4_SEG4 = 0 +UMC_BASE__INST5_SEG0 = 0x00154000 +UMC_BASE__INST5_SEG1 = 0x02426C00 +UMC_BASE__INST5_SEG2 = 0 +UMC_BASE__INST5_SEG3 = 0 +UMC_BASE__INST5_SEG4 = 0 +UMC_BASE__INST6_SEG0 = 0x00194000 +UMC_BASE__INST6_SEG1 = 0x02427000 +UMC_BASE__INST6_SEG2 = 0 +UMC_BASE__INST6_SEG3 = 0 +UMC_BASE__INST6_SEG4 = 0 +USB0_BASE__INST0_SEG0 = 0x0242A800 +USB0_BASE__INST0_SEG1 = 0x05B00000 +USB0_BASE__INST0_SEG2 = 0 +USB0_BASE__INST0_SEG3 = 0 +USB0_BASE__INST0_SEG4 = 0 +USB0_BASE__INST1_SEG0 = 0 +USB0_BASE__INST1_SEG1 = 0 +USB0_BASE__INST1_SEG2 = 0 +USB0_BASE__INST1_SEG3 = 0 +USB0_BASE__INST1_SEG4 = 0 +USB0_BASE__INST2_SEG0 = 0 +USB0_BASE__INST2_SEG1 = 0 +USB0_BASE__INST2_SEG2 = 0 +USB0_BASE__INST2_SEG3 = 0 +USB0_BASE__INST2_SEG4 = 0 +USB0_BASE__INST3_SEG0 = 0 +USB0_BASE__INST3_SEG1 = 0 +USB0_BASE__INST3_SEG2 = 0 +USB0_BASE__INST3_SEG3 = 0 +USB0_BASE__INST3_SEG4 = 0 +USB0_BASE__INST4_SEG0 = 0 +USB0_BASE__INST4_SEG1 = 0 +USB0_BASE__INST4_SEG2 = 0 +USB0_BASE__INST4_SEG3 = 0 +USB0_BASE__INST4_SEG4 = 0 +USB0_BASE__INST5_SEG0 = 0 +USB0_BASE__INST5_SEG1 = 0 +USB0_BASE__INST5_SEG2 = 0 +USB0_BASE__INST5_SEG3 = 0 +USB0_BASE__INST5_SEG4 = 0 +USB0_BASE__INST6_SEG0 = 0 +USB0_BASE__INST6_SEG1 = 0 +USB0_BASE__INST6_SEG2 = 0 +USB0_BASE__INST6_SEG3 = 0 +USB0_BASE__INST6_SEG4 = 0 +VCN_BASE__INST0_SEG0 = 0x00007800 +VCN_BASE__INST0_SEG1 = 0x00007E00 +VCN_BASE__INST0_SEG2 = 0x02403000 +VCN_BASE__INST0_SEG3 = 0 +VCN_BASE__INST0_SEG4 = 0 +VCN_BASE__INST1_SEG0 = 0x00007B00 +VCN_BASE__INST1_SEG1 = 0x00012000 +VCN_BASE__INST1_SEG2 = 0x02445000 +VCN_BASE__INST1_SEG3 = 0 +VCN_BASE__INST1_SEG4 = 0 +VCN_BASE__INST2_SEG0 = 0 +VCN_BASE__INST2_SEG1 = 0 +VCN_BASE__INST2_SEG2 = 0 +VCN_BASE__INST2_SEG3 = 0 +VCN_BASE__INST2_SEG4 = 0 +VCN_BASE__INST3_SEG0 = 0 +VCN_BASE__INST3_SEG1 = 0 +VCN_BASE__INST3_SEG2 = 0 +VCN_BASE__INST3_SEG3 = 0 +VCN_BASE__INST3_SEG4 = 0 +VCN_BASE__INST4_SEG0 = 0 +VCN_BASE__INST4_SEG1 = 0 +VCN_BASE__INST4_SEG2 = 0 +VCN_BASE__INST4_SEG3 = 0 +VCN_BASE__INST4_SEG4 = 0 +VCN_BASE__INST5_SEG0 = 0 +VCN_BASE__INST5_SEG1 = 0 +VCN_BASE__INST5_SEG2 = 0 +VCN_BASE__INST5_SEG3 = 0 +VCN_BASE__INST5_SEG4 = 0 +VCN_BASE__INST6_SEG0 = 0 +VCN_BASE__INST6_SEG1 = 0 +VCN_BASE__INST6_SEG2 = 0 +VCN_BASE__INST6_SEG3 = 0 +VCN_BASE__INST6_SEG4 = 0 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/pm4_nv.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/pm4_nv.py new file mode 100644 index 000000000..05662ed62 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/pm4_nv.py @@ -0,0 +1,487 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +class union_PM4_MES_TYPE_3_HEADER(c.Struct): pass +enum_mes_set_resources_queue_type_enum: dict[int, str] = {(queue_type__mes_set_resources__kernel_interface_queue_kiq:=0): 'queue_type__mes_set_resources__kernel_interface_queue_kiq', (queue_type__mes_set_resources__hsa_interface_queue_hiq:=1): 'queue_type__mes_set_resources__hsa_interface_queue_hiq', (queue_type__mes_set_resources__hsa_debug_interface_queue:=4): 'queue_type__mes_set_resources__hsa_debug_interface_queue'} +class struct_pm4_mes_set_resources(c.Struct): pass +class struct_pm4_mes_runlist(c.Struct): pass +class struct_pm4_mes_map_process(c.Struct): pass +class struct_PM4_MES_MAP_PROCESS_VM(c.Struct): pass +enum_mes_map_queues_queue_sel_enum: dict[int, str] = {(queue_sel__mes_map_queues__map_to_specified_queue_slots_vi:=0): 'queue_sel__mes_map_queues__map_to_specified_queue_slots_vi', (queue_sel__mes_map_queues__map_to_hws_determined_queue_slots_vi:=1): 'queue_sel__mes_map_queues__map_to_hws_determined_queue_slots_vi'} +enum_mes_map_queues_queue_type_enum: dict[int, str] = {(queue_type__mes_map_queues__normal_compute_vi:=0): 'queue_type__mes_map_queues__normal_compute_vi', (queue_type__mes_map_queues__debug_interface_queue_vi:=1): 'queue_type__mes_map_queues__debug_interface_queue_vi', (queue_type__mes_map_queues__normal_latency_static_queue_vi:=2): 'queue_type__mes_map_queues__normal_latency_static_queue_vi', (queue_type__mes_map_queues__low_latency_static_queue_vi:=3): 'queue_type__mes_map_queues__low_latency_static_queue_vi'} +enum_mes_map_queues_engine_sel_enum: dict[int, str] = {(engine_sel__mes_map_queues__compute_vi:=0): 'engine_sel__mes_map_queues__compute_vi', (engine_sel__mes_map_queues__sdma0_vi:=2): 'engine_sel__mes_map_queues__sdma0_vi', (engine_sel__mes_map_queues__sdma1_vi:=3): 'engine_sel__mes_map_queues__sdma1_vi'} +enum_mes_map_queues_extended_engine_sel_enum: dict[int, str] = {(extended_engine_sel__mes_map_queues__legacy_engine_sel:=0): 'extended_engine_sel__mes_map_queues__legacy_engine_sel', (extended_engine_sel__mes_map_queues__sdma0_to_7_sel:=1): 'extended_engine_sel__mes_map_queues__sdma0_to_7_sel', (extended_engine_sel__mes_map_queues__sdma8_to_15_sel:=2): 'extended_engine_sel__mes_map_queues__sdma8_to_15_sel'} +class struct_pm4_mes_map_queues(c.Struct): pass +enum_mes_query_status_interrupt_sel_enum: dict[int, str] = {(interrupt_sel__mes_query_status__completion_status:=0): 'interrupt_sel__mes_query_status__completion_status', (interrupt_sel__mes_query_status__process_status:=1): 'interrupt_sel__mes_query_status__process_status', (interrupt_sel__mes_query_status__queue_status:=2): 'interrupt_sel__mes_query_status__queue_status'} +enum_mes_query_status_command_enum: dict[int, str] = {(command__mes_query_status__interrupt_only:=0): 'command__mes_query_status__interrupt_only', (command__mes_query_status__fence_only_immediate:=1): 'command__mes_query_status__fence_only_immediate', (command__mes_query_status__fence_only_after_write_ack:=2): 'command__mes_query_status__fence_only_after_write_ack', (command__mes_query_status__fence_wait_for_write_ack_send_interrupt:=3): 'command__mes_query_status__fence_wait_for_write_ack_send_interrupt'} +enum_mes_query_status_engine_sel_enum: dict[int, str] = {(engine_sel__mes_query_status__compute:=0): 'engine_sel__mes_query_status__compute', (engine_sel__mes_query_status__sdma0_queue:=2): 'engine_sel__mes_query_status__sdma0_queue', (engine_sel__mes_query_status__sdma1_queue:=3): 'engine_sel__mes_query_status__sdma1_queue'} +class struct_pm4_mes_query_status(c.Struct): pass +enum_mes_unmap_queues_action_enum: dict[int, str] = {(action__mes_unmap_queues__preempt_queues:=0): 'action__mes_unmap_queues__preempt_queues', (action__mes_unmap_queues__reset_queues:=1): 'action__mes_unmap_queues__reset_queues', (action__mes_unmap_queues__disable_process_queues:=2): 'action__mes_unmap_queues__disable_process_queues', (action__mes_unmap_queues__reserved:=3): 'action__mes_unmap_queues__reserved'} +enum_mes_unmap_queues_queue_sel_enum: dict[int, str] = {(queue_sel__mes_unmap_queues__perform_request_on_specified_queues:=0): 'queue_sel__mes_unmap_queues__perform_request_on_specified_queues', (queue_sel__mes_unmap_queues__perform_request_on_pasid_queues:=1): 'queue_sel__mes_unmap_queues__perform_request_on_pasid_queues', (queue_sel__mes_unmap_queues__unmap_all_queues:=2): 'queue_sel__mes_unmap_queues__unmap_all_queues', (queue_sel__mes_unmap_queues__unmap_all_non_static_queues:=3): 'queue_sel__mes_unmap_queues__unmap_all_non_static_queues'} +enum_mes_unmap_queues_engine_sel_enum: dict[int, str] = {(engine_sel__mes_unmap_queues__compute:=0): 'engine_sel__mes_unmap_queues__compute', (engine_sel__mes_unmap_queues__sdma0:=2): 'engine_sel__mes_unmap_queues__sdma0', (engine_sel__mes_unmap_queues__sdmal:=3): 'engine_sel__mes_unmap_queues__sdmal'} +enum_mes_unmap_queues_extended_engine_sel_enum: dict[int, str] = {(extended_engine_sel__mes_unmap_queues__legacy_engine_sel:=0): 'extended_engine_sel__mes_unmap_queues__legacy_engine_sel', (extended_engine_sel__mes_unmap_queues__sdma0_to_7_sel:=1): 'extended_engine_sel__mes_unmap_queues__sdma0_to_7_sel'} +class struct_pm4_mes_unmap_queues(c.Struct): pass +enum_mec_release_mem_event_index_enum: dict[int, str] = {(event_index__mec_release_mem__end_of_pipe:=5): 'event_index__mec_release_mem__end_of_pipe', (event_index__mec_release_mem__shader_done:=6): 'event_index__mec_release_mem__shader_done'} +enum_mec_release_mem_cache_policy_enum: dict[int, str] = {(cache_policy__mec_release_mem__lru:=0): 'cache_policy__mec_release_mem__lru', (cache_policy__mec_release_mem__stream:=1): 'cache_policy__mec_release_mem__stream'} +enum_mec_release_mem_pq_exe_status_enum: dict[int, str] = {(pq_exe_status__mec_release_mem__default:=0): 'pq_exe_status__mec_release_mem__default', (pq_exe_status__mec_release_mem__phase_update:=1): 'pq_exe_status__mec_release_mem__phase_update'} +enum_mec_release_mem_dst_sel_enum: dict[int, str] = {(dst_sel__mec_release_mem__memory_controller:=0): 'dst_sel__mec_release_mem__memory_controller', (dst_sel__mec_release_mem__tc_l2:=1): 'dst_sel__mec_release_mem__tc_l2', (dst_sel__mec_release_mem__queue_write_pointer_register:=2): 'dst_sel__mec_release_mem__queue_write_pointer_register', (dst_sel__mec_release_mem__queue_write_pointer_poll_mask_bit:=3): 'dst_sel__mec_release_mem__queue_write_pointer_poll_mask_bit'} +enum_mec_release_mem_int_sel_enum: dict[int, str] = {(int_sel__mec_release_mem__none:=0): 'int_sel__mec_release_mem__none', (int_sel__mec_release_mem__send_interrupt_only:=1): 'int_sel__mec_release_mem__send_interrupt_only', (int_sel__mec_release_mem__send_interrupt_after_write_confirm:=2): 'int_sel__mec_release_mem__send_interrupt_after_write_confirm', (int_sel__mec_release_mem__send_data_after_write_confirm:=3): 'int_sel__mec_release_mem__send_data_after_write_confirm', (int_sel__mec_release_mem__unconditionally_send_int_ctxid:=4): 'int_sel__mec_release_mem__unconditionally_send_int_ctxid', (int_sel__mec_release_mem__conditionally_send_int_ctxid_based_on_32_bit_compare:=5): 'int_sel__mec_release_mem__conditionally_send_int_ctxid_based_on_32_bit_compare', (int_sel__mec_release_mem__conditionally_send_int_ctxid_based_on_64_bit_compare:=6): 'int_sel__mec_release_mem__conditionally_send_int_ctxid_based_on_64_bit_compare'} +enum_mec_release_mem_data_sel_enum: dict[int, str] = {(data_sel__mec_release_mem__none:=0): 'data_sel__mec_release_mem__none', (data_sel__mec_release_mem__send_32_bit_low:=1): 'data_sel__mec_release_mem__send_32_bit_low', (data_sel__mec_release_mem__send_64_bit_data:=2): 'data_sel__mec_release_mem__send_64_bit_data', (data_sel__mec_release_mem__send_gpu_clock_counter:=3): 'data_sel__mec_release_mem__send_gpu_clock_counter', (data_sel__mec_release_mem__send_cp_perfcounter_hi_lo:=4): 'data_sel__mec_release_mem__send_cp_perfcounter_hi_lo', (data_sel__mec_release_mem__store_gds_data_to_memory:=5): 'data_sel__mec_release_mem__store_gds_data_to_memory'} +class struct_pm4_mec_release_mem(c.Struct): pass +enum_WRITE_DATA_dst_sel_enum: dict[int, str] = {(dst_sel___write_data__mem_mapped_register:=0): 'dst_sel___write_data__mem_mapped_register', (dst_sel___write_data__tc_l2:=2): 'dst_sel___write_data__tc_l2', (dst_sel___write_data__gds:=3): 'dst_sel___write_data__gds', (dst_sel___write_data__memory:=5): 'dst_sel___write_data__memory', (dst_sel___write_data__memory_mapped_adc_persistent_state:=6): 'dst_sel___write_data__memory_mapped_adc_persistent_state'} +enum_WRITE_DATA_addr_incr_enum: dict[int, str] = {(addr_incr___write_data__increment_address:=0): 'addr_incr___write_data__increment_address', (addr_incr___write_data__do_not_increment_address:=1): 'addr_incr___write_data__do_not_increment_address'} +enum_WRITE_DATA_wr_confirm_enum: dict[int, str] = {(wr_confirm___write_data__do_not_wait_for_write_confirmation:=0): 'wr_confirm___write_data__do_not_wait_for_write_confirmation', (wr_confirm___write_data__wait_for_write_confirmation:=1): 'wr_confirm___write_data__wait_for_write_confirmation'} +enum_WRITE_DATA_cache_policy_enum: dict[int, str] = {(cache_policy___write_data__lru:=0): 'cache_policy___write_data__lru', (cache_policy___write_data__stream:=1): 'cache_policy___write_data__stream'} +class struct_pm4_mec_write_data_mmio(c.Struct): pass +_anonenum0: dict[int, str] = {(CACHE_FLUSH_AND_INV_TS_EVENT:=20): 'CACHE_FLUSH_AND_INV_TS_EVENT'} +PACKET_TYPE0 = 0 +PACKET_TYPE1 = 1 +PACKET_TYPE2 = 2 +PACKET_TYPE3 = 3 +CP_PACKET_GET_TYPE = lambda h: (((h) >> 30) & 3) # type: ignore +CP_PACKET_GET_COUNT = lambda h: (((h) >> 16) & 0x3FFF) # type: ignore +CP_PACKET0_GET_REG = lambda h: ((h) & 0xFFFF) # type: ignore +CP_PACKET3_GET_OPCODE = lambda h: (((h) >> 8) & 0xFF) # type: ignore +PACKET0 = lambda reg,n: ((PACKET_TYPE0 << 30) | ((reg) & 0xFFFF) | ((n) & 0x3FFF) << 16) # type: ignore +CP_PACKET2 = 0x80000000 +PACKET2_PAD_SHIFT = 0 +PACKET2_PAD_MASK = (0x3fffffff << 0) +PACKET2 = lambda v: (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) # type: ignore +PACKET3 = lambda op,n: ((PACKET_TYPE3 << 30) | (((op) & 0xFF) << 8) | ((n) & 0x3FFF) << 16) # type: ignore +PACKET3_COMPUTE = lambda op,n: (PACKET3(op, n) | 1 << 1) # type: ignore +PACKET3_NOP = 0x10 +PACKET3_SET_BASE = 0x11 +PACKET3_BASE_INDEX = lambda x: ((x) << 0) # type: ignore +CE_PARTITION_BASE = 3 +PACKET3_CLEAR_STATE = 0x12 +PACKET3_INDEX_BUFFER_SIZE = 0x13 +PACKET3_DISPATCH_DIRECT = 0x15 +PACKET3_DISPATCH_INDIRECT = 0x16 +PACKET3_INDIRECT_BUFFER_END = 0x17 +PACKET3_INDIRECT_BUFFER_CNST_END = 0x19 +PACKET3_ATOMIC_GDS = 0x1D +PACKET3_ATOMIC_MEM = 0x1E +PACKET3_ATOMIC_MEM__ATOMIC = lambda x: ((((unsigned)(x)) & 0x7F) << 0) # type: ignore +PACKET3_ATOMIC_MEM__COMMAND = lambda x: ((((unsigned)(x)) & 0xF) << 8) # type: ignore +PACKET3_ATOMIC_MEM__CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_ATOMIC_MEM__ADDR_LO = lambda x: (((unsigned)(x))) # type: ignore +PACKET3_ATOMIC_MEM__ADDR_HI = lambda x: (((unsigned)(x))) # type: ignore +PACKET3_ATOMIC_MEM__SRC_DATA_LO = lambda x: (((unsigned)(x))) # type: ignore +PACKET3_ATOMIC_MEM__SRC_DATA_HI = lambda x: (((unsigned)(x))) # type: ignore +PACKET3_ATOMIC_MEM__CMP_DATA_LO = lambda x: (((unsigned)(x))) # type: ignore +PACKET3_ATOMIC_MEM__CMP_DATA_HI = lambda x: (((unsigned)(x))) # type: ignore +PACKET3_ATOMIC_MEM__LOOP_INTERVAL = lambda x: ((((unsigned)(x)) & 0x1FFF) << 0) # type: ignore +PACKET3_ATOMIC_MEM__COMMAND__SINGLE_PASS_ATOMIC = 0 +PACKET3_ATOMIC_MEM__COMMAND__LOOP_UNTIL_COMPARE_SATISFIED = 1 +PACKET3_ATOMIC_MEM__COMMAND__WAIT_FOR_WRITE_CONFIRMATION = 2 +PACKET3_ATOMIC_MEM__COMMAND__SEND_AND_CONTINUE = 3 +PACKET3_ATOMIC_MEM__CACHE_POLICY__LRU = 0 +PACKET3_ATOMIC_MEM__CACHE_POLICY__STREAM = 1 +PACKET3_ATOMIC_MEM__CACHE_POLICY__NOA = 2 +PACKET3_ATOMIC_MEM__CACHE_POLICY__BYPASS = 3 +PACKET3_OCCLUSION_QUERY = 0x1F +PACKET3_SET_PREDICATION = 0x20 +PACKET3_REG_RMW = 0x21 +PACKET3_COND_EXEC = 0x22 +PACKET3_PRED_EXEC = 0x23 +PACKET3_DRAW_INDIRECT = 0x24 +PACKET3_DRAW_INDEX_INDIRECT = 0x25 +PACKET3_INDEX_BASE = 0x26 +PACKET3_DRAW_INDEX_2 = 0x27 +PACKET3_CONTEXT_CONTROL = 0x28 +PACKET3_INDEX_TYPE = 0x2A +PACKET3_DRAW_INDIRECT_MULTI = 0x2C +PACKET3_DRAW_INDEX_AUTO = 0x2D +PACKET3_NUM_INSTANCES = 0x2F +PACKET3_DRAW_INDEX_MULTI_AUTO = 0x30 +PACKET3_INDIRECT_BUFFER_PRIV = 0x32 +PACKET3_INDIRECT_BUFFER_CNST = 0x33 +PACKET3_COND_INDIRECT_BUFFER_CNST = 0x33 +PACKET3_STRMOUT_BUFFER_UPDATE = 0x34 +PACKET3_DRAW_INDEX_OFFSET_2 = 0x35 +PACKET3_DRAW_PREAMBLE = 0x36 +PACKET3_WRITE_DATA = 0x37 +WRITE_DATA_DST_SEL = lambda x: ((x) << 8) # type: ignore +WR_ONE_ADDR = (1 << 16) +WR_CONFIRM = (1 << 20) +WRITE_DATA_CACHE_POLICY = lambda x: ((x) << 25) # type: ignore +WRITE_DATA_ENGINE_SEL = lambda x: ((x) << 30) # type: ignore +PACKET3_WRITE_DATA__DST_SEL = lambda x: ((((unsigned)(x)) & 0xF) << 8) # type: ignore +PACKET3_WRITE_DATA__ADDR_INCR = lambda x: ((((unsigned)(x)) & 0x1) << 16) # type: ignore +PACKET3_WRITE_DATA__WR_CONFIRM = lambda x: ((((unsigned)(x)) & 0x1) << 20) # type: ignore +PACKET3_WRITE_DATA__CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_WRITE_DATA__DST_MMREG_ADDR = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_WRITE_DATA__DST_GDS_ADDR = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_WRITE_DATA__DST_MEM_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_WRITE_DATA__DST_MEM_ADDR_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WRITE_DATA__MODE = lambda x: ((((unsigned)(x)) & 0x1) << 21) # type: ignore +PACKET3_WRITE_DATA__AID_ID = lambda x: ((((unsigned)(x)) & 0x3) << 22) # type: ignore +PACKET3_WRITE_DATA__TEMPORAL = lambda x: ((((unsigned)(x)) & 0x3) << 24) # type: ignore +PACKET3_WRITE_DATA__DST_MMREG_ADDR_LO = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WRITE_DATA__DST_MMREG_ADDR_HI = lambda x: ((((unsigned)(x)) & 0xFF) << 0) # type: ignore +PACKET3_WRITE_DATA__DST_SEL__MEM_MAPPED_REGISTER = 0 +PACKET3_WRITE_DATA__DST_SEL__TC_L2 = 2 +PACKET3_WRITE_DATA__DST_SEL__GDS = 3 +PACKET3_WRITE_DATA__DST_SEL__MEMORY = 5 +PACKET3_WRITE_DATA__DST_SEL__MEMORY_MAPPED_ADC_PERSISTENT_STATE = 6 +PACKET3_WRITE_DATA__ADDR_INCR__INCREMENT_ADDRESS = 0 +PACKET3_WRITE_DATA__ADDR_INCR__DO_NOT_INCREMENT_ADDRESS = 1 +PACKET3_WRITE_DATA__WR_CONFIRM__DO_NOT_WAIT_FOR_WRITE_CONFIRMATION = 0 +PACKET3_WRITE_DATA__WR_CONFIRM__WAIT_FOR_WRITE_CONFIRMATION = 1 +PACKET3_WRITE_DATA__MODE__PF_VF_DISABLED = 0 +PACKET3_WRITE_DATA__MODE__PF_VF_ENABLED = 1 +PACKET3_WRITE_DATA__TEMPORAL__RT = 0 +PACKET3_WRITE_DATA__TEMPORAL__NT = 1 +PACKET3_WRITE_DATA__TEMPORAL__HT = 2 +PACKET3_WRITE_DATA__TEMPORAL__LU = 3 +PACKET3_WRITE_DATA__CACHE_POLICY__LRU = 0 +PACKET3_WRITE_DATA__CACHE_POLICY__STREAM = 1 +PACKET3_WRITE_DATA__CACHE_POLICY__NOA = 2 +PACKET3_WRITE_DATA__CACHE_POLICY__BYPASS = 3 +PACKET3_DRAW_INDEX_INDIRECT_MULTI = 0x38 +PACKET3_MEM_SEMAPHORE = 0x39 +PACKET3_SEM_USE_MAILBOX = (0x1 << 16) +PACKET3_SEM_SEL_SIGNAL_TYPE = (0x1 << 20) +PACKET3_SEM_SEL_SIGNAL = (0x6 << 29) +PACKET3_SEM_SEL_WAIT = (0x7 << 29) +PACKET3_DRAW_INDEX_MULTI_INST = 0x3A +PACKET3_COPY_DW = 0x3B +PACKET3_WAIT_REG_MEM = 0x3C +WAIT_REG_MEM_FUNCTION = lambda x: ((x) << 0) # type: ignore +WAIT_REG_MEM_MEM_SPACE = lambda x: ((x) << 4) # type: ignore +WAIT_REG_MEM_OPERATION = lambda x: ((x) << 6) # type: ignore +WAIT_REG_MEM_ENGINE = lambda x: ((x) << 8) # type: ignore +PACKET3_WAIT_REG_MEM__FUNCTION = lambda x: ((((unsigned)(x)) & 0x7) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__MEM_SPACE = lambda x: ((((unsigned)(x)) & 0x3) << 4) # type: ignore +PACKET3_WAIT_REG_MEM__OPERATION = lambda x: ((((unsigned)(x)) & 0x3) << 6) # type: ignore +PACKET3_WAIT_REG_MEM__MES_INTR_PIPE = lambda x: ((((unsigned)(x)) & 0x3) << 22) # type: ignore +PACKET3_WAIT_REG_MEM__MES_ACTION = lambda x: ((((unsigned)(x)) & 0x1) << 24) # type: ignore +PACKET3_WAIT_REG_MEM__CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_WAIT_REG_MEM__TEMPORAL = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_WAIT_REG_MEM__MEM_POLL_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_WAIT_REG_MEM__REG_POLL_ADDR = lambda x: ((((unsigned)(x)) & 0X3FFFF) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__REG_WRITE_ADDR1 = lambda x: ((((unsigned)(x)) & 0X3FFFF) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__MEM_POLL_ADDR_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WAIT_REG_MEM__REG_WRITE_ADDR2 = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__REFERENCE = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WAIT_REG_MEM__MASK = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WAIT_REG_MEM__POLL_INTERVAL = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__OPTIMIZE_ACE_OFFLOAD_MODE = lambda x: ((((unsigned)(x)) & 0x1) << 31) # type: ignore +PACKET3_WAIT_REG_MEM__FUNCTION__ALWAYS_PASS = 0 +PACKET3_WAIT_REG_MEM__FUNCTION__LESS_THAN_REF_VALUE = 1 +PACKET3_WAIT_REG_MEM__FUNCTION__LESS_THAN_EQUAL_TO_THE_REF_VALUE = 2 +PACKET3_WAIT_REG_MEM__FUNCTION__EQUAL_TO_THE_REFERENCE_VALUE = 3 +PACKET3_WAIT_REG_MEM__FUNCTION__NOT_EQUAL_REFERENCE_VALUE = 4 +PACKET3_WAIT_REG_MEM__FUNCTION__GREATER_THAN_OR_EQUAL_REFERENCE_VALUE = 5 +PACKET3_WAIT_REG_MEM__FUNCTION__GREATER_THAN_REFERENCE_VALUE = 6 +PACKET3_WAIT_REG_MEM__MEM_SPACE__REGISTER_SPACE = 0 +PACKET3_WAIT_REG_MEM__MEM_SPACE__MEMORY_SPACE = 1 +PACKET3_WAIT_REG_MEM__OPERATION__WAIT_REG_MEM = 0 +PACKET3_WAIT_REG_MEM__OPERATION__WR_WAIT_WR_REG = 1 +PACKET3_WAIT_REG_MEM__OPERATION__WAIT_MEM_PREEMPTABLE = 3 +PACKET3_WAIT_REG_MEM__CACHE_POLICY__LRU = 0 +PACKET3_WAIT_REG_MEM__CACHE_POLICY__STREAM = 1 +PACKET3_WAIT_REG_MEM__CACHE_POLICY__NOA = 2 +PACKET3_WAIT_REG_MEM__CACHE_POLICY__BYPASS = 3 +PACKET3_WAIT_REG_MEM__TEMPORAL__RT = 0 +PACKET3_WAIT_REG_MEM__TEMPORAL__NT = 1 +PACKET3_WAIT_REG_MEM__TEMPORAL__HT = 2 +PACKET3_WAIT_REG_MEM__TEMPORAL__LU = 3 +PACKET3_INDIRECT_BUFFER = 0x3F +INDIRECT_BUFFER_VALID = (1 << 23) +INDIRECT_BUFFER_CACHE_POLICY = lambda x: ((x) << 28) # type: ignore +INDIRECT_BUFFER_PRE_ENB = lambda x: ((x) << 21) # type: ignore +INDIRECT_BUFFER_PRE_RESUME = lambda x: ((x) << 30) # type: ignore +PACKET3_INDIRECT_BUFFER__IB_BASE_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_INDIRECT_BUFFER__IB_BASE_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_INDIRECT_BUFFER__IB_SIZE = lambda x: ((((unsigned)(x)) & 0xFFFFF) << 0) # type: ignore +PACKET3_INDIRECT_BUFFER__CHAIN = lambda x: ((((unsigned)(x)) & 0x1) << 20) # type: ignore +PACKET3_INDIRECT_BUFFER__OFFLOAD_POLLING = lambda x: ((((unsigned)(x)) & 0x1) << 21) # type: ignore +PACKET3_INDIRECT_BUFFER__VALID = lambda x: ((((unsigned)(x)) & 0x1) << 23) # type: ignore +PACKET3_INDIRECT_BUFFER__VMID = lambda x: ((((unsigned)(x)) & 0xF) << 24) # type: ignore +PACKET3_INDIRECT_BUFFER__CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 28) # type: ignore +PACKET3_INDIRECT_BUFFER__TEMPORAL = lambda x: ((((unsigned)(x)) & 0x3) << 28) # type: ignore +PACKET3_INDIRECT_BUFFER__PRIV = lambda x: ((((unsigned)(x)) & 0x1) << 31) # type: ignore +PACKET3_INDIRECT_BUFFER__TEMPORAL__RT = 0 +PACKET3_INDIRECT_BUFFER__TEMPORAL__NT = 1 +PACKET3_INDIRECT_BUFFER__TEMPORAL__HT = 2 +PACKET3_INDIRECT_BUFFER__TEMPORAL__LU = 3 +PACKET3_INDIRECT_BUFFER__CACHE_POLICY__LRU = 0 +PACKET3_INDIRECT_BUFFER__CACHE_POLICY__STREAM = 1 +PACKET3_INDIRECT_BUFFER__CACHE_POLICY__NOA = 2 +PACKET3_INDIRECT_BUFFER__CACHE_POLICY__BYPASS = 3 +PACKET3_COND_INDIRECT_BUFFER = 0x3F +PACKET3_COPY_DATA = 0x40 +PACKET3_COPY_DATA__SRC_SEL = lambda x: ((((unsigned)(x)) & 0xF) << 0) # type: ignore +PACKET3_COPY_DATA__DST_SEL = lambda x: ((((unsigned)(x)) & 0xF) << 8) # type: ignore +PACKET3_COPY_DATA__SRC_CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 13) # type: ignore +PACKET3_COPY_DATA__SRC_TEMPORAL = lambda x: ((((unsigned)(x)) & 0x3) << 13) # type: ignore +PACKET3_COPY_DATA__COUNT_SEL = lambda x: ((((unsigned)(x)) & 0x1) << 16) # type: ignore +PACKET3_COPY_DATA__WR_CONFIRM = lambda x: ((((unsigned)(x)) & 0x1) << 20) # type: ignore +PACKET3_COPY_DATA__DST_CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_COPY_DATA__PQ_EXE_STATUS = lambda x: ((((unsigned)(x)) & 0x1) << 29) # type: ignore +PACKET3_COPY_DATA__SRC_REG_OFFSET = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_COPY_DATA__SRC_32B_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_COPY_DATA__SRC_64B_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x1FFFFFFF) << 3) # type: ignore +PACKET3_COPY_DATA__SRC_GDS_ADDR_LO = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_COPY_DATA__IMM_DATA = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__SRC_MEMTC_ADDR_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__SRC_IMM_DATA = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__DST_REG_OFFSET = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_COPY_DATA__DST_32B_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_COPY_DATA__DST_64B_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x1FFFFFFF) << 3) # type: ignore +PACKET3_COPY_DATA__DST_GDS_ADDR_LO = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_COPY_DATA__DST_ADDR_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__MODE = lambda x: ((((unsigned)(x)) & 0x1) << 21) # type: ignore +PACKET3_COPY_DATA__AID_ID = lambda x: ((((unsigned)(x)) & 0x3) << 23) # type: ignore +PACKET3_COPY_DATA__DST_TEMPORAL = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_COPY_DATA__SRC_REG_OFFSET_LO = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__SRC_REG_OFFSET_HI = lambda x: ((((unsigned)(x)) & 0xFF) << 0) # type: ignore +PACKET3_COPY_DATA__DST_REG_OFFSET_LO = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__DST_REG_OFFSET_HI = lambda x: ((((unsigned)(x)) & 0xFF) << 0) # type: ignore +PACKET3_COPY_DATA__SRC_SEL__MEM_MAPPED_REGISTER = 0 +PACKET3_COPY_DATA__SRC_SEL__TC_L2_OBSOLETE = 1 +PACKET3_COPY_DATA__SRC_SEL__TC_L2 = 2 +PACKET3_COPY_DATA__SRC_SEL__GDS = 3 +PACKET3_COPY_DATA__SRC_SEL__PERFCOUNTERS = 4 +PACKET3_COPY_DATA__SRC_SEL__IMMEDIATE_DATA = 5 +PACKET3_COPY_DATA__SRC_SEL__ATOMIC_RETURN_DATA = 6 +PACKET3_COPY_DATA__SRC_SEL__GDS_ATOMIC_RETURN_DATA0 = 7 +PACKET3_COPY_DATA__SRC_SEL__GDS_ATOMIC_RETURN_DATA1 = 8 +PACKET3_COPY_DATA__SRC_SEL__GPU_CLOCK_COUNT = 9 +PACKET3_COPY_DATA__SRC_SEL__SYSTEM_CLOCK_COUNT = 10 +PACKET3_COPY_DATA__DST_SEL__MEM_MAPPED_REGISTER = 0 +PACKET3_COPY_DATA__DST_SEL__TC_L2 = 2 +PACKET3_COPY_DATA__DST_SEL__GDS = 3 +PACKET3_COPY_DATA__DST_SEL__PERFCOUNTERS = 4 +PACKET3_COPY_DATA__DST_SEL__TC_L2_OBSOLETE = 5 +PACKET3_COPY_DATA__DST_SEL__MEM_MAPPED_REG_DC = 6 +PACKET3_COPY_DATA__SRC_TEMPORAL__RT = 0 +PACKET3_COPY_DATA__SRC_TEMPORAL__NT = 1 +PACKET3_COPY_DATA__SRC_TEMPORAL__HT = 2 +PACKET3_COPY_DATA__SRC_TEMPORAL__LU = 3 +PACKET3_COPY_DATA__SRC_CACHE_POLICY__LRU = 0 +PACKET3_COPY_DATA__SRC_CACHE_POLICY__STREAM = 1 +PACKET3_COPY_DATA__SRC_CACHE_POLICY__NOA = 2 +PACKET3_COPY_DATA__SRC_CACHE_POLICY__BYPASS = 3 +PACKET3_COPY_DATA__COUNT_SEL__32_BITS_OF_DATA = 0 +PACKET3_COPY_DATA__COUNT_SEL__64_BITS_OF_DATA = 1 +PACKET3_COPY_DATA__WR_CONFIRM__DO_NOT_WAIT_FOR_CONFIRMATION = 0 +PACKET3_COPY_DATA__WR_CONFIRM__WAIT_FOR_CONFIRMATION = 1 +PACKET3_COPY_DATA__MODE__PF_VF_DISABLED = 0 +PACKET3_COPY_DATA__MODE__PF_VF_ENABLED = 1 +PACKET3_COPY_DATA__DST_TEMPORAL__RT = 0 +PACKET3_COPY_DATA__DST_TEMPORAL__NT = 1 +PACKET3_COPY_DATA__DST_TEMPORAL__HT = 2 +PACKET3_COPY_DATA__DST_TEMPORAL__LU = 3 +PACKET3_COPY_DATA__DST_CACHE_POLICY__LRU = 0 +PACKET3_COPY_DATA__DST_CACHE_POLICY__STREAM = 1 +PACKET3_COPY_DATA__DST_CACHE_POLICY__NOA = 2 +PACKET3_COPY_DATA__DST_CACHE_POLICY__BYPASS = 3 +PACKET3_COPY_DATA__PQ_EXE_STATUS__DEFAULT = 0 +PACKET3_COPY_DATA__PQ_EXE_STATUS__PHASE_UPDATE = 1 +PACKET3_CP_DMA = 0x41 +PACKET3_PFP_SYNC_ME = 0x42 +PACKET3_SURFACE_SYNC = 0x43 +PACKET3_ME_INITIALIZE = 0x44 +PACKET3_COND_WRITE = 0x45 +PACKET3_EVENT_WRITE = 0x46 +EVENT_TYPE = lambda x: ((x) << 0) # type: ignore +EVENT_INDEX = lambda x: ((x) << 8) # type: ignore +PACKET3_EVENT_WRITE__EVENT_TYPE = lambda x: ((((unsigned)(x)) & 0x3F) << 0) # type: ignore +PACKET3_EVENT_WRITE__EVENT_INDEX = lambda x: ((((unsigned)(x)) & 0xF) << 8) # type: ignore +PACKET3_EVENT_WRITE__SAMP_PLST_CNTR_MODE = lambda x: ((((unsigned)(x)) & 0x3) << 29) # type: ignore +PACKET3_EVENT_WRITE__OFFLOAD_ENABLE = lambda x: ((((unsigned)(x)) & 0x1) << 0) # type: ignore +PACKET3_EVENT_WRITE__ADDRESS_LO = lambda x: ((((unsigned)(x)) & 0x1FFFFFFF) << 3) # type: ignore +PACKET3_EVENT_WRITE__ADDRESS_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_EVENT_WRITE__EVENT_INDEX__OTHER = 0 +PACKET3_EVENT_WRITE__EVENT_INDEX__SAMPLE_PIPELINESTAT = 2 +PACKET3_EVENT_WRITE__EVENT_INDEX__CS_PARTIAL_FLUSH = 4 +PACKET3_EVENT_WRITE__EVENT_INDEX__SAMPLE_STREAMOUTSTATS = 8 +PACKET3_EVENT_WRITE__EVENT_INDEX__SAMPLE_STREAMOUTSTATS1 = 9 +PACKET3_EVENT_WRITE__EVENT_INDEX__SAMPLE_STREAMOUTSTATS2 = 10 +PACKET3_EVENT_WRITE__EVENT_INDEX__SAMPLE_STREAMOUTSTATS3 = 11 +PACKET3_EVENT_WRITE__SAMP_PLST_CNTR_MODE__LEGACY_MODE = 0 +PACKET3_EVENT_WRITE__SAMP_PLST_CNTR_MODE__MIXED_MODE1 = 1 +PACKET3_EVENT_WRITE__SAMP_PLST_CNTR_MODE__NEW_MODE = 2 +PACKET3_EVENT_WRITE__SAMP_PLST_CNTR_MODE__MIXED_MODE3 = 3 +PACKET3_EVENT_WRITE_EOP = 0x47 +PACKET3_EVENT_WRITE_EOS = 0x48 +PACKET3_RELEASE_MEM = 0x49 +PACKET3_RELEASE_MEM_EVENT_TYPE = lambda x: ((x) << 0) # type: ignore +PACKET3_RELEASE_MEM_EVENT_INDEX = lambda x: ((x) << 8) # type: ignore +PACKET3_RELEASE_MEM_GCR_GLM_WB = (1 << 12) +PACKET3_RELEASE_MEM_GCR_GLM_INV = (1 << 13) +PACKET3_RELEASE_MEM_GCR_GLV_INV = (1 << 14) +PACKET3_RELEASE_MEM_GCR_GL1_INV = (1 << 15) +PACKET3_RELEASE_MEM_GCR_GL2_US = (1 << 16) +PACKET3_RELEASE_MEM_GCR_GL2_RANGE = (1 << 17) +PACKET3_RELEASE_MEM_GCR_GL2_DISCARD = (1 << 19) +PACKET3_RELEASE_MEM_GCR_GL2_INV = (1 << 20) +PACKET3_RELEASE_MEM_GCR_GL2_WB = (1 << 21) +PACKET3_RELEASE_MEM_GCR_SEQ = (1 << 22) +PACKET3_RELEASE_MEM_CACHE_POLICY = lambda x: ((x) << 25) # type: ignore +PACKET3_RELEASE_MEM_EXECUTE = (1 << 28) +PACKET3_RELEASE_MEM_DATA_SEL = lambda x: ((x) << 29) # type: ignore +PACKET3_RELEASE_MEM_INT_SEL = lambda x: ((x) << 24) # type: ignore +PACKET3_RELEASE_MEM_DST_SEL = lambda x: ((x) << 16) # type: ignore +PACKET3_PREAMBLE_CNTL = 0x4A +PACKET3_PREAMBLE_BEGIN_CLEAR_STATE = (2 << 28) +PACKET3_PREAMBLE_END_CLEAR_STATE = (3 << 28) +PACKET3_DMA_DATA = 0x50 +PACKET3_DMA_DATA_ENGINE = lambda x: ((x) << 0) # type: ignore +PACKET3_DMA_DATA_SRC_CACHE_POLICY = lambda x: ((x) << 13) # type: ignore +PACKET3_DMA_DATA_DST_SEL = lambda x: ((x) << 20) # type: ignore +PACKET3_DMA_DATA_DST_CACHE_POLICY = lambda x: ((x) << 25) # type: ignore +PACKET3_DMA_DATA_SRC_SEL = lambda x: ((x) << 29) # type: ignore +PACKET3_DMA_DATA_CP_SYNC = (1 << 31) +PACKET3_DMA_DATA_CMD_SAS = (1 << 26) +PACKET3_DMA_DATA_CMD_DAS = (1 << 27) +PACKET3_DMA_DATA_CMD_SAIC = (1 << 28) +PACKET3_DMA_DATA_CMD_DAIC = (1 << 29) +PACKET3_DMA_DATA_CMD_RAW_WAIT = (1 << 30) +PACKET3_CONTEXT_REG_RMW = 0x51 +PACKET3_GFX_CNTX_UPDATE = 0x52 +PACKET3_BLK_CNTX_UPDATE = 0x53 +PACKET3_INCR_UPDT_STATE = 0x55 +PACKET3_ACQUIRE_MEM = 0x58 +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLI_INV = lambda x: ((x) << 0) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL1_RANGE = lambda x: ((x) << 2) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_WB = lambda x: ((x) << 4) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_INV = lambda x: ((x) << 5) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_WB = lambda x: ((x) << 6) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_INV = lambda x: ((x) << 7) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLV_INV = lambda x: ((x) << 8) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL1_INV = lambda x: ((x) << 9) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_US = lambda x: ((x) << 10) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_RANGE = lambda x: ((x) << 11) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_DISCARD = lambda x: ((x) << 13) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_INV = lambda x: ((x) << 14) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_WB = lambda x: ((x) << 15) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_SEQ = lambda x: ((x) << 16) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_RANGE_IS_PA = (1 << 18) +PACKET3_ACQUIRE_MEM__COHER_SIZE = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_ACQUIRE_MEM__COHER_SIZE_HI = lambda x: ((((unsigned)(x)) & 0xFF) << 0) # type: ignore +PACKET3_ACQUIRE_MEM__COHER_BASE_LO = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_ACQUIRE_MEM__COHER_BASE_HI = lambda x: ((((unsigned)(x)) & 0xFFFFFF) << 0) # type: ignore +PACKET3_ACQUIRE_MEM__POLL_INTERVAL = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_ACQUIRE_MEM__GCR_CNTL = lambda x: ((((unsigned)(x)) & 0x7FFFF) << 0) # type: ignore +PACKET3_REWIND = 0x59 +PACKET3_INTERRUPT = 0x5A +PACKET3_GEN_PDEPTE = 0x5B +PACKET3_INDIRECT_BUFFER_PASID = 0x5C +PACKET3_PRIME_UTCL2 = 0x5D +PACKET3_LOAD_UCONFIG_REG = 0x5E +PACKET3_LOAD_SH_REG = 0x5F +PACKET3_LOAD_CONFIG_REG = 0x60 +PACKET3_LOAD_CONTEXT_REG = 0x61 +PACKET3_LOAD_COMPUTE_STATE = 0x62 +PACKET3_LOAD_SH_REG_INDEX = 0x63 +PACKET3_SET_CONFIG_REG = 0x68 +PACKET3_SET_CONFIG_REG_START = 0x00002000 +PACKET3_SET_CONFIG_REG_END = 0x00002c00 +PACKET3_SET_CONTEXT_REG = 0x69 +PACKET3_SET_CONTEXT_REG_START = 0x0000a000 +PACKET3_SET_CONTEXT_REG_END = 0x0000a400 +PACKET3_SET_CONTEXT_REG_INDEX = 0x6A +PACKET3_SET_VGPR_REG_DI_MULTI = 0x71 +PACKET3_SET_SH_REG_DI = 0x72 +PACKET3_SET_CONTEXT_REG_INDIRECT = 0x73 +PACKET3_SET_SH_REG_DI_MULTI = 0x74 +PACKET3_GFX_PIPE_LOCK = 0x75 +PACKET3_SET_SH_REG = 0x76 +PACKET3_SET_SH_REG_START = 0x00002c00 +PACKET3_SET_SH_REG_END = 0x00003000 +PACKET3_SET_SH_REG__REG_OFFSET = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_SET_SH_REG__VMID_SHIFT = lambda x: ((((unsigned)(x)) & 0x1F) << 23) # type: ignore +PACKET3_SET_SH_REG__INDEX = lambda x: ((((unsigned)(x)) & 0xF) << 28) # type: ignore +PACKET3_SET_SH_REG__INDEX__DEFAULT = 0 +PACKET3_SET_SH_REG__INDEX__INSERT_VMID = 1 +PACKET3_SET_SH_REG_OFFSET = 0x77 +PACKET3_SET_QUEUE_REG = 0x78 +PACKET3_SET_UCONFIG_REG = 0x79 +PACKET3_SET_UCONFIG_REG_START = 0x0000c000 +PACKET3_SET_UCONFIG_REG_END = 0x0000c400 +PACKET3_SET_UCONFIG_REG__REG_OFFSET = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_SET_UCONFIG_REG_INDEX = 0x7A +PACKET3_FORWARD_HEADER = 0x7C +PACKET3_SCRATCH_RAM_WRITE = 0x7D +PACKET3_SCRATCH_RAM_READ = 0x7E +PACKET3_LOAD_CONST_RAM = 0x80 +PACKET3_WRITE_CONST_RAM = 0x81 +PACKET3_DUMP_CONST_RAM = 0x83 +PACKET3_INCREMENT_CE_COUNTER = 0x84 +PACKET3_INCREMENT_DE_COUNTER = 0x85 +PACKET3_WAIT_ON_CE_COUNTER = 0x86 +PACKET3_WAIT_ON_DE_COUNTER_DIFF = 0x88 +PACKET3_SWITCH_BUFFER = 0x8B +PACKET3_DISPATCH_DRAW_PREAMBLE = 0x8C +PACKET3_DISPATCH_DRAW_PREAMBLE_ACE = 0x8C +PACKET3_DISPATCH_DRAW = 0x8D +PACKET3_DISPATCH_DRAW_ACE = 0x8D +PACKET3_GET_LOD_STATS = 0x8E +PACKET3_DRAW_MULTI_PREAMBLE = 0x8F +PACKET3_FRAME_CONTROL = 0x90 +FRAME_TMZ = (1 << 0) +FRAME_CMD = lambda x: ((x) << 28) # type: ignore +PACKET3_INDEX_ATTRIBUTES_INDIRECT = 0x91 +PACKET3_WAIT_REG_MEM64 = 0x93 +PACKET3_COND_PREEMPT = 0x94 +PACKET3_HDP_FLUSH = 0x95 +PACKET3_COPY_DATA_RB = 0x96 +PACKET3_INVALIDATE_TLBS = 0x98 +PACKET3_INVALIDATE_TLBS_DST_SEL = lambda x: ((x) << 0) # type: ignore +PACKET3_INVALIDATE_TLBS_ALL_HUB = lambda x: ((x) << 4) # type: ignore +PACKET3_INVALIDATE_TLBS_PASID = lambda x: ((x) << 5) # type: ignore +PACKET3_INVALIDATE_TLBS_FLUSH_TYPE = lambda x: ((x) << 29) # type: ignore +PACKET3_AQL_PACKET = 0x99 +PACKET3_DMA_DATA_FILL_MULTI = 0x9A +PACKET3_SET_SH_REG_INDEX = 0x9B +PACKET3_DRAW_INDIRECT_COUNT_MULTI = 0x9C +PACKET3_DRAW_INDEX_INDIRECT_COUNT_MULTI = 0x9D +PACKET3_DUMP_CONST_RAM_OFFSET = 0x9E +PACKET3_LOAD_CONTEXT_REG_INDEX = 0x9F +PACKET3_SET_RESOURCES = 0xA0 +PACKET3_SET_RESOURCES_VMID_MASK = lambda x: ((x) << 0) # type: ignore +PACKET3_SET_RESOURCES_UNMAP_LATENTY = lambda x: ((x) << 16) # type: ignore +PACKET3_SET_RESOURCES_QUEUE_TYPE = lambda x: ((x) << 29) # type: ignore +PACKET3_MAP_PROCESS = 0xA1 +PACKET3_MAP_QUEUES = 0xA2 +PACKET3_MAP_QUEUES_QUEUE_SEL = lambda x: ((x) << 4) # type: ignore +PACKET3_MAP_QUEUES_VMID = lambda x: ((x) << 8) # type: ignore +PACKET3_MAP_QUEUES_QUEUE = lambda x: ((x) << 13) # type: ignore +PACKET3_MAP_QUEUES_PIPE = lambda x: ((x) << 16) # type: ignore +PACKET3_MAP_QUEUES_ME = lambda x: ((x) << 18) # type: ignore +PACKET3_MAP_QUEUES_QUEUE_TYPE = lambda x: ((x) << 21) # type: ignore +PACKET3_MAP_QUEUES_ALLOC_FORMAT = lambda x: ((x) << 24) # type: ignore +PACKET3_MAP_QUEUES_ENGINE_SEL = lambda x: ((x) << 26) # type: ignore +PACKET3_MAP_QUEUES_NUM_QUEUES = lambda x: ((x) << 29) # type: ignore +PACKET3_MAP_QUEUES_CHECK_DISABLE = lambda x: ((x) << 1) # type: ignore +PACKET3_MAP_QUEUES_DOORBELL_OFFSET = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES = 0xA3 +PACKET3_UNMAP_QUEUES_ACTION = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_QUEUE_SEL = lambda x: ((x) << 4) # type: ignore +PACKET3_UNMAP_QUEUES_ENGINE_SEL = lambda x: ((x) << 26) # type: ignore +PACKET3_UNMAP_QUEUES_NUM_QUEUES = lambda x: ((x) << 29) # type: ignore +PACKET3_UNMAP_QUEUES_PASID = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET1 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_RB_WPTR = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET2 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET3 = lambda x: ((x) << 2) # type: ignore +PACKET3_QUERY_STATUS = 0xA4 +PACKET3_QUERY_STATUS_CONTEXT_ID = lambda x: ((x) << 0) # type: ignore +PACKET3_QUERY_STATUS_INTERRUPT_SEL = lambda x: ((x) << 28) # type: ignore +PACKET3_QUERY_STATUS_COMMAND = lambda x: ((x) << 30) # type: ignore +PACKET3_QUERY_STATUS_PASID = lambda x: ((x) << 0) # type: ignore +PACKET3_QUERY_STATUS_DOORBELL_OFFSET = lambda x: ((x) << 2) # type: ignore +PACKET3_QUERY_STATUS_ENG_SEL = lambda x: ((x) << 25) # type: ignore +PACKET3_RUN_LIST = 0xA5 +PACKET3_MAP_PROCESS_VM = 0xA6 +PACKET3_RUN_CLEANER_SHADER = 0xD2 +PACKET3_SET_Q_PREEMPTION_MODE = 0xF0 +PACKET3_SET_Q_PREEMPTION_MODE_IB_VMID = lambda x: ((x) << 0) # type: ignore +PACKET3_SET_Q_PREEMPTION_MODE_INIT_SHADOW_MEM = (1 << 0) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/pm4_soc15.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/pm4_soc15.py new file mode 100644 index 000000000..f0d4917d6 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/pm4_soc15.py @@ -0,0 +1,412 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +class union_PM4_MES_TYPE_3_HEADER(c.Struct): pass +enum_mes_set_resources_queue_type_enum: dict[int, str] = {(queue_type__mes_set_resources__kernel_interface_queue_kiq:=0): 'queue_type__mes_set_resources__kernel_interface_queue_kiq', (queue_type__mes_set_resources__hsa_interface_queue_hiq:=1): 'queue_type__mes_set_resources__hsa_interface_queue_hiq', (queue_type__mes_set_resources__hsa_debug_interface_queue:=4): 'queue_type__mes_set_resources__hsa_debug_interface_queue'} +class struct_pm4_mes_set_resources(c.Struct): pass +class struct_pm4_mes_runlist(c.Struct): pass +class struct_pm4_mes_map_process(c.Struct): pass +class struct_PM4_MES_MAP_PROCESS_VM(c.Struct): pass +enum_mes_map_queues_queue_sel_enum: dict[int, str] = {(queue_sel__mes_map_queues__map_to_specified_queue_slots_vi:=0): 'queue_sel__mes_map_queues__map_to_specified_queue_slots_vi', (queue_sel__mes_map_queues__map_to_hws_determined_queue_slots_vi:=1): 'queue_sel__mes_map_queues__map_to_hws_determined_queue_slots_vi'} +enum_mes_map_queues_queue_type_enum: dict[int, str] = {(queue_type__mes_map_queues__normal_compute_vi:=0): 'queue_type__mes_map_queues__normal_compute_vi', (queue_type__mes_map_queues__debug_interface_queue_vi:=1): 'queue_type__mes_map_queues__debug_interface_queue_vi', (queue_type__mes_map_queues__normal_latency_static_queue_vi:=2): 'queue_type__mes_map_queues__normal_latency_static_queue_vi', (queue_type__mes_map_queues__low_latency_static_queue_vi:=3): 'queue_type__mes_map_queues__low_latency_static_queue_vi'} +enum_mes_map_queues_engine_sel_enum: dict[int, str] = {(engine_sel__mes_map_queues__compute_vi:=0): 'engine_sel__mes_map_queues__compute_vi', (engine_sel__mes_map_queues__sdma0_vi:=2): 'engine_sel__mes_map_queues__sdma0_vi', (engine_sel__mes_map_queues__sdma1_vi:=3): 'engine_sel__mes_map_queues__sdma1_vi'} +enum_mes_map_queues_extended_engine_sel_enum: dict[int, str] = {(extended_engine_sel__mes_map_queues__legacy_engine_sel:=0): 'extended_engine_sel__mes_map_queues__legacy_engine_sel', (extended_engine_sel__mes_map_queues__sdma0_to_7_sel:=1): 'extended_engine_sel__mes_map_queues__sdma0_to_7_sel', (extended_engine_sel__mes_map_queues__sdma8_to_15_sel:=2): 'extended_engine_sel__mes_map_queues__sdma8_to_15_sel'} +class struct_pm4_mes_map_queues(c.Struct): pass +enum_mes_query_status_interrupt_sel_enum: dict[int, str] = {(interrupt_sel__mes_query_status__completion_status:=0): 'interrupt_sel__mes_query_status__completion_status', (interrupt_sel__mes_query_status__process_status:=1): 'interrupt_sel__mes_query_status__process_status', (interrupt_sel__mes_query_status__queue_status:=2): 'interrupt_sel__mes_query_status__queue_status'} +enum_mes_query_status_command_enum: dict[int, str] = {(command__mes_query_status__interrupt_only:=0): 'command__mes_query_status__interrupt_only', (command__mes_query_status__fence_only_immediate:=1): 'command__mes_query_status__fence_only_immediate', (command__mes_query_status__fence_only_after_write_ack:=2): 'command__mes_query_status__fence_only_after_write_ack', (command__mes_query_status__fence_wait_for_write_ack_send_interrupt:=3): 'command__mes_query_status__fence_wait_for_write_ack_send_interrupt'} +enum_mes_query_status_engine_sel_enum: dict[int, str] = {(engine_sel__mes_query_status__compute:=0): 'engine_sel__mes_query_status__compute', (engine_sel__mes_query_status__sdma0_queue:=2): 'engine_sel__mes_query_status__sdma0_queue', (engine_sel__mes_query_status__sdma1_queue:=3): 'engine_sel__mes_query_status__sdma1_queue'} +class struct_pm4_mes_query_status(c.Struct): pass +enum_mes_unmap_queues_action_enum: dict[int, str] = {(action__mes_unmap_queues__preempt_queues:=0): 'action__mes_unmap_queues__preempt_queues', (action__mes_unmap_queues__reset_queues:=1): 'action__mes_unmap_queues__reset_queues', (action__mes_unmap_queues__disable_process_queues:=2): 'action__mes_unmap_queues__disable_process_queues', (action__mes_unmap_queues__reserved:=3): 'action__mes_unmap_queues__reserved'} +enum_mes_unmap_queues_queue_sel_enum: dict[int, str] = {(queue_sel__mes_unmap_queues__perform_request_on_specified_queues:=0): 'queue_sel__mes_unmap_queues__perform_request_on_specified_queues', (queue_sel__mes_unmap_queues__perform_request_on_pasid_queues:=1): 'queue_sel__mes_unmap_queues__perform_request_on_pasid_queues', (queue_sel__mes_unmap_queues__unmap_all_queues:=2): 'queue_sel__mes_unmap_queues__unmap_all_queues', (queue_sel__mes_unmap_queues__unmap_all_non_static_queues:=3): 'queue_sel__mes_unmap_queues__unmap_all_non_static_queues'} +enum_mes_unmap_queues_engine_sel_enum: dict[int, str] = {(engine_sel__mes_unmap_queues__compute:=0): 'engine_sel__mes_unmap_queues__compute', (engine_sel__mes_unmap_queues__sdma0:=2): 'engine_sel__mes_unmap_queues__sdma0', (engine_sel__mes_unmap_queues__sdmal:=3): 'engine_sel__mes_unmap_queues__sdmal'} +enum_mes_unmap_queues_extended_engine_sel_enum: dict[int, str] = {(extended_engine_sel__mes_unmap_queues__legacy_engine_sel:=0): 'extended_engine_sel__mes_unmap_queues__legacy_engine_sel', (extended_engine_sel__mes_unmap_queues__sdma0_to_7_sel:=1): 'extended_engine_sel__mes_unmap_queues__sdma0_to_7_sel'} +class struct_pm4_mes_unmap_queues(c.Struct): pass +enum_mec_release_mem_event_index_enum: dict[int, str] = {(event_index__mec_release_mem__end_of_pipe:=5): 'event_index__mec_release_mem__end_of_pipe', (event_index__mec_release_mem__shader_done:=6): 'event_index__mec_release_mem__shader_done'} +enum_mec_release_mem_cache_policy_enum: dict[int, str] = {(cache_policy__mec_release_mem__lru:=0): 'cache_policy__mec_release_mem__lru', (cache_policy__mec_release_mem__stream:=1): 'cache_policy__mec_release_mem__stream'} +enum_mec_release_mem_pq_exe_status_enum: dict[int, str] = {(pq_exe_status__mec_release_mem__default:=0): 'pq_exe_status__mec_release_mem__default', (pq_exe_status__mec_release_mem__phase_update:=1): 'pq_exe_status__mec_release_mem__phase_update'} +enum_mec_release_mem_dst_sel_enum: dict[int, str] = {(dst_sel__mec_release_mem__memory_controller:=0): 'dst_sel__mec_release_mem__memory_controller', (dst_sel__mec_release_mem__tc_l2:=1): 'dst_sel__mec_release_mem__tc_l2', (dst_sel__mec_release_mem__queue_write_pointer_register:=2): 'dst_sel__mec_release_mem__queue_write_pointer_register', (dst_sel__mec_release_mem__queue_write_pointer_poll_mask_bit:=3): 'dst_sel__mec_release_mem__queue_write_pointer_poll_mask_bit'} +enum_mec_release_mem_int_sel_enum: dict[int, str] = {(int_sel__mec_release_mem__none:=0): 'int_sel__mec_release_mem__none', (int_sel__mec_release_mem__send_interrupt_only:=1): 'int_sel__mec_release_mem__send_interrupt_only', (int_sel__mec_release_mem__send_interrupt_after_write_confirm:=2): 'int_sel__mec_release_mem__send_interrupt_after_write_confirm', (int_sel__mec_release_mem__send_data_after_write_confirm:=3): 'int_sel__mec_release_mem__send_data_after_write_confirm', (int_sel__mec_release_mem__unconditionally_send_int_ctxid:=4): 'int_sel__mec_release_mem__unconditionally_send_int_ctxid', (int_sel__mec_release_mem__conditionally_send_int_ctxid_based_on_32_bit_compare:=5): 'int_sel__mec_release_mem__conditionally_send_int_ctxid_based_on_32_bit_compare', (int_sel__mec_release_mem__conditionally_send_int_ctxid_based_on_64_bit_compare:=6): 'int_sel__mec_release_mem__conditionally_send_int_ctxid_based_on_64_bit_compare'} +enum_mec_release_mem_data_sel_enum: dict[int, str] = {(data_sel__mec_release_mem__none:=0): 'data_sel__mec_release_mem__none', (data_sel__mec_release_mem__send_32_bit_low:=1): 'data_sel__mec_release_mem__send_32_bit_low', (data_sel__mec_release_mem__send_64_bit_data:=2): 'data_sel__mec_release_mem__send_64_bit_data', (data_sel__mec_release_mem__send_gpu_clock_counter:=3): 'data_sel__mec_release_mem__send_gpu_clock_counter', (data_sel__mec_release_mem__send_cp_perfcounter_hi_lo:=4): 'data_sel__mec_release_mem__send_cp_perfcounter_hi_lo', (data_sel__mec_release_mem__store_gds_data_to_memory:=5): 'data_sel__mec_release_mem__store_gds_data_to_memory'} +class struct_pm4_mec_release_mem(c.Struct): pass +enum_WRITE_DATA_dst_sel_enum: dict[int, str] = {(dst_sel___write_data__mem_mapped_register:=0): 'dst_sel___write_data__mem_mapped_register', (dst_sel___write_data__tc_l2:=2): 'dst_sel___write_data__tc_l2', (dst_sel___write_data__gds:=3): 'dst_sel___write_data__gds', (dst_sel___write_data__memory:=5): 'dst_sel___write_data__memory', (dst_sel___write_data__memory_mapped_adc_persistent_state:=6): 'dst_sel___write_data__memory_mapped_adc_persistent_state'} +enum_WRITE_DATA_addr_incr_enum: dict[int, str] = {(addr_incr___write_data__increment_address:=0): 'addr_incr___write_data__increment_address', (addr_incr___write_data__do_not_increment_address:=1): 'addr_incr___write_data__do_not_increment_address'} +enum_WRITE_DATA_wr_confirm_enum: dict[int, str] = {(wr_confirm___write_data__do_not_wait_for_write_confirmation:=0): 'wr_confirm___write_data__do_not_wait_for_write_confirmation', (wr_confirm___write_data__wait_for_write_confirmation:=1): 'wr_confirm___write_data__wait_for_write_confirmation'} +enum_WRITE_DATA_cache_policy_enum: dict[int, str] = {(cache_policy___write_data__lru:=0): 'cache_policy___write_data__lru', (cache_policy___write_data__stream:=1): 'cache_policy___write_data__stream'} +class struct_pm4_mec_write_data_mmio(c.Struct): pass +_anonenum0: dict[int, str] = {(CACHE_FLUSH_AND_INV_TS_EVENT:=20): 'CACHE_FLUSH_AND_INV_TS_EVENT'} +GFX9_NUM_GFX_RINGS = 1 +GFX9_NUM_COMPUTE_RINGS = 8 +PACKET_TYPE0 = 0 +PACKET_TYPE1 = 1 +PACKET_TYPE2 = 2 +PACKET_TYPE3 = 3 +CP_PACKET_GET_TYPE = lambda h: (((h) >> 30) & 3) # type: ignore +CP_PACKET_GET_COUNT = lambda h: (((h) >> 16) & 0x3FFF) # type: ignore +CP_PACKET0_GET_REG = lambda h: ((h) & 0xFFFF) # type: ignore +CP_PACKET3_GET_OPCODE = lambda h: (((h) >> 8) & 0xFF) # type: ignore +PACKET0 = lambda reg,n: ((PACKET_TYPE0 << 30) | ((reg) & 0xFFFF) | ((n) & 0x3FFF) << 16) # type: ignore +CP_PACKET2 = 0x80000000 +PACKET2_PAD_SHIFT = 0 +PACKET2_PAD_MASK = (0x3fffffff << 0) +PACKET2 = lambda v: (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) # type: ignore +PACKET3 = lambda op,n: ((PACKET_TYPE3 << 30) | (((op) & 0xFF) << 8) | ((n) & 0x3FFF) << 16) # type: ignore +PACKET3_COMPUTE = lambda op,n: (PACKET3(op, n) | 1 << 1) # type: ignore +PACKETJ_CONDITION_CHECK0 = 0 +PACKETJ_CONDITION_CHECK1 = 1 +PACKETJ_CONDITION_CHECK2 = 2 +PACKETJ_CONDITION_CHECK3 = 3 +PACKETJ_CONDITION_CHECK4 = 4 +PACKETJ_CONDITION_CHECK5 = 5 +PACKETJ_CONDITION_CHECK6 = 6 +PACKETJ_CONDITION_CHECK7 = 7 +PACKETJ_TYPE0 = 0 +PACKETJ_TYPE1 = 1 +PACKETJ_TYPE2 = 2 +PACKETJ_TYPE3 = 3 +PACKETJ_TYPE4 = 4 +PACKETJ_TYPE5 = 5 +PACKETJ_TYPE6 = 6 +PACKETJ_TYPE7 = 7 +PACKETJ = lambda reg,r,cond,type: ((reg & 0x3FFFF) | ((r & 0x3F) << 18) | ((cond & 0xF) << 24) | ((type & 0xF) << 28)) # type: ignore +CP_PACKETJ_NOP = 0x60000000 +CP_PACKETJ_GET_REG = lambda x: ((x) & 0x3FFFF) # type: ignore +CP_PACKETJ_GET_RES = lambda x: (((x) >> 18) & 0x3F) # type: ignore +CP_PACKETJ_GET_COND = lambda x: (((x) >> 24) & 0xF) # type: ignore +CP_PACKETJ_GET_TYPE = lambda x: (((x) >> 28) & 0xF) # type: ignore +PACKET3_NOP = 0x10 +PACKET3_SET_BASE = 0x11 +PACKET3_BASE_INDEX = lambda x: ((x) << 0) # type: ignore +CE_PARTITION_BASE = 3 +PACKET3_CLEAR_STATE = 0x12 +PACKET3_INDEX_BUFFER_SIZE = 0x13 +PACKET3_DISPATCH_DIRECT = 0x15 +PACKET3_DISPATCH_INDIRECT = 0x16 +PACKET3_ATOMIC_GDS = 0x1D +PACKET3_ATOMIC_MEM = 0x1E +PACKET3_ATOMIC_MEM__ATOMIC = lambda x: ((((unsigned)(x)) & 0x3F) << 0) # type: ignore +PACKET3_ATOMIC_MEM__COMMAND = lambda x: ((((unsigned)(x)) & 0xF) << 8) # type: ignore +PACKET3_ATOMIC_MEM__CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_ATOMIC_MEM__ADDR_LO = lambda x: (((unsigned)(x)) << 0) # type: ignore +PACKET3_ATOMIC_MEM__ADDR_HI = lambda x: (((unsigned)(x)) << 0) # type: ignore +PACKET3_ATOMIC_MEM__SRC_DATA_LO = lambda x: (((unsigned)(x)) << 0) # type: ignore +PACKET3_ATOMIC_MEM__SRC_DATA_HI = lambda x: (((unsigned)(x)) << 0) # type: ignore +PACKET3_ATOMIC_MEM__CMP_DATA_LO = lambda x: (((unsigned)(x)) << 0) # type: ignore +PACKET3_ATOMIC_MEM__CMP_DATA_HI = lambda x: (((unsigned)(x)) << 0) # type: ignore +PACKET3_ATOMIC_MEM__LOOP_INTERVAL = lambda x: ((((unsigned)(x)) & 0x1FFF) << 0) # type: ignore +PACKET3_ATOMIC_MEM__COMMAND__SINGLE_PASS_ATOMIC = 0 +PACKET3_ATOMIC_MEM__COMMAND__LOOP_UNTIL_COMPARE_SATISFIED = 1 +PACKET3_OCCLUSION_QUERY = 0x1F +PACKET3_SET_PREDICATION = 0x20 +PACKET3_REG_RMW = 0x21 +PACKET3_COND_EXEC = 0x22 +PACKET3_PRED_EXEC = 0x23 +PACKET3_PRED_EXEC__EXEC_COUNT = lambda x: ((((unsigned)(x)) & 0x3FFF) << 0) # type: ignore +PACKET3_PRED_EXEC__VIRTUAL_XCC_ID_SELECT = lambda x: ((((unsigned)(x)) & 0xFF) << 24) # type: ignore +PACKET3_DRAW_INDIRECT = 0x24 +PACKET3_DRAW_INDEX_INDIRECT = 0x25 +PACKET3_INDEX_BASE = 0x26 +PACKET3_DRAW_INDEX_2 = 0x27 +PACKET3_CONTEXT_CONTROL = 0x28 +PACKET3_INDEX_TYPE = 0x2A +PACKET3_DRAW_INDIRECT_MULTI = 0x2C +PACKET3_DRAW_INDEX_AUTO = 0x2D +PACKET3_NUM_INSTANCES = 0x2F +PACKET3_DRAW_INDEX_MULTI_AUTO = 0x30 +PACKET3_INDIRECT_BUFFER_CONST = 0x33 +PACKET3_STRMOUT_BUFFER_UPDATE = 0x34 +PACKET3_DRAW_INDEX_OFFSET_2 = 0x35 +PACKET3_DRAW_PREAMBLE = 0x36 +PACKET3_WRITE_DATA = 0x37 +WRITE_DATA_DST_SEL = lambda x: ((x) << 8) # type: ignore +WR_ONE_ADDR = (1 << 16) +WR_CONFIRM = (1 << 20) +WRITE_DATA_CACHE_POLICY = lambda x: ((x) << 25) # type: ignore +WRITE_DATA_ENGINE_SEL = lambda x: ((x) << 30) # type: ignore +PACKET3_WRITE_DATA__DST_SEL = lambda x: ((((unsigned)(x)) & 0xF) << 8) # type: ignore +PACKET3_WRITE_DATA__ADDR_INCR = lambda x: ((((unsigned)(x)) & 0x1) << 16) # type: ignore +PACKET3_WRITE_DATA__RESUME_VF_MI300 = lambda x: ((((unsigned)(x)) & 0x1) << 19) # type: ignore +PACKET3_WRITE_DATA__WR_CONFIRM = lambda x: ((((unsigned)(x)) & 0x1) << 20) # type: ignore +PACKET3_WRITE_DATA__CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_WRITE_DATA__DST_MMREG_ADDR = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_WRITE_DATA__DST_GDS_ADDR = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_WRITE_DATA__DST_MEM_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_WRITE_DATA__DST_MEM_ADDR_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WRITE_DATA__DST_SEL__MEM_MAPPED_REGISTER = 0 +PACKET3_WRITE_DATA__DST_SEL__TC_L2 = 2 +PACKET3_WRITE_DATA__DST_SEL__GDS = 3 +PACKET3_WRITE_DATA__DST_SEL__MEMORY = 5 +PACKET3_WRITE_DATA__DST_SEL__MEMORY_MAPPED_ADC_PERSISTENT_STATE = 6 +PACKET3_WRITE_DATA__ADDR_INCR__INCREMENT_ADDRESS = 0 +PACKET3_WRITE_DATA__ADDR_INCR__DO_NOT_INCREMENT_ADDRESS = 1 +PACKET3_WRITE_DATA__WR_CONFIRM__DO_NOT_WAIT_FOR_WRITE_CONFIRMATION = 0 +PACKET3_WRITE_DATA__WR_CONFIRM__WAIT_FOR_WRITE_CONFIRMATION = 1 +PACKET3_WRITE_DATA__CACHE_POLICY__LRU = 0 +PACKET3_WRITE_DATA__CACHE_POLICY__STREAM = 1 +PACKET3_WRITE_DATA__CACHE_POLICY__NOA = 2 +PACKET3_WRITE_DATA__CACHE_POLICY__BYPASS = 3 +PACKET3_DRAW_INDEX_INDIRECT_MULTI = 0x38 +PACKET3_MEM_SEMAPHORE = 0x39 +PACKET3_SEM_USE_MAILBOX = (0x1 << 16) +PACKET3_SEM_SEL_SIGNAL_TYPE = (0x1 << 20) +PACKET3_SEM_SEL_SIGNAL = (0x6 << 29) +PACKET3_SEM_SEL_WAIT = (0x7 << 29) +PACKET3_WAIT_REG_MEM = 0x3C +WAIT_REG_MEM_FUNCTION = lambda x: ((x) << 0) # type: ignore +WAIT_REG_MEM_MEM_SPACE = lambda x: ((x) << 4) # type: ignore +WAIT_REG_MEM_OPERATION = lambda x: ((x) << 6) # type: ignore +WAIT_REG_MEM_ENGINE = lambda x: ((x) << 8) # type: ignore +PACKET3_WAIT_REG_MEM__FUNCTION = lambda x: ((((unsigned)(x)) & 0x7) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__MEM_SPACE = lambda x: ((((unsigned)(x)) & 0x3) << 4) # type: ignore +PACKET3_WAIT_REG_MEM__OPERATION = lambda x: ((((unsigned)(x)) & 0x3) << 6) # type: ignore +PACKET3_WAIT_REG_MEM__MES_INTR_PIPE = lambda x: ((((unsigned)(x)) & 0x3) << 22) # type: ignore +PACKET3_WAIT_REG_MEM__MES_ACTION = lambda x: ((((unsigned)(x)) & 0x1) << 24) # type: ignore +PACKET3_WAIT_REG_MEM__CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_WAIT_REG_MEM__MEM_POLL_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_WAIT_REG_MEM__REG_POLL_ADDR = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__REG_WRITE_ADDR1 = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__MEM_POLL_ADDR_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WAIT_REG_MEM__REG_WRITE_ADDR2 = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__REFERENCE = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WAIT_REG_MEM__MASK = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_WAIT_REG_MEM__POLL_INTERVAL = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_WAIT_REG_MEM__OPTIMIZE_ACE_OFFLOAD_MODE = lambda x: ((((unsigned)(x)) & 0x1) << 31) # type: ignore +PACKET3_WAIT_REG_MEM__FUNCTION__ALWAYS_PASS = 0 +PACKET3_WAIT_REG_MEM__FUNCTION__LESS_THAN_REF_VALUE = 1 +PACKET3_WAIT_REG_MEM__FUNCTION__LESS_THAN_EQUAL_TO_THE_REF_VALUE = 2 +PACKET3_WAIT_REG_MEM__FUNCTION__EQUAL_TO_THE_REFERENCE_VALUE = 3 +PACKET3_WAIT_REG_MEM__FUNCTION__NOT_EQUAL_REFERENCE_VALUE = 4 +PACKET3_WAIT_REG_MEM__FUNCTION__GREATER_THAN_OR_EQUAL_REFERENCE_VALUE = 5 +PACKET3_WAIT_REG_MEM__FUNCTION__GREATER_THAN_REFERENCE_VALUE = 6 +PACKET3_WAIT_REG_MEM__MEM_SPACE__REGISTER_SPACE = 0 +PACKET3_WAIT_REG_MEM__MEM_SPACE__MEMORY_SPACE = 1 +PACKET3_WAIT_REG_MEM__OPERATION__WAIT_REG_MEM = 0 +PACKET3_WAIT_REG_MEM__OPERATION__WR_WAIT_WR_REG = 1 +PACKET3_WAIT_REG_MEM__OPERATION__WAIT_MEM_PREEMPTABLE = 3 +PACKET3_INDIRECT_BUFFER = 0x3F +INDIRECT_BUFFER_VALID = (1 << 23) +INDIRECT_BUFFER_CACHE_POLICY = lambda x: ((x) << 28) # type: ignore +INDIRECT_BUFFER_PRE_ENB = lambda x: ((x) << 21) # type: ignore +INDIRECT_BUFFER_PRE_RESUME = lambda x: ((x) << 30) # type: ignore +PACKET3_INDIRECT_BUFFER__IB_BASE_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_INDIRECT_BUFFER__IB_BASE_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_INDIRECT_BUFFER__IB_SIZE = lambda x: ((((unsigned)(x)) & 0xFFFFF) << 0) # type: ignore +PACKET3_INDIRECT_BUFFER__CHAIN = lambda x: ((((unsigned)(x)) & 0x1) << 20) # type: ignore +PACKET3_INDIRECT_BUFFER__OFFLOAD_POLLING = lambda x: ((((unsigned)(x)) & 0x1) << 21) # type: ignore +PACKET3_INDIRECT_BUFFER__VALID = lambda x: ((((unsigned)(x)) & 0x1) << 23) # type: ignore +PACKET3_INDIRECT_BUFFER__VMID = lambda x: ((((unsigned)(x)) & 0xF) << 24) # type: ignore +PACKET3_INDIRECT_BUFFER__CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 28) # type: ignore +PACKET3_INDIRECT_BUFFER__PRIV = lambda x: ((((unsigned)(x)) & 0x1) << 31) # type: ignore +PACKET3_INDIRECT_BUFFER__CACHE_POLICY__LRU = 0 +PACKET3_INDIRECT_BUFFER__CACHE_POLICY__STREAM = 1 +PACKET3_COPY_DATA = 0x40 +PACKET3_COPY_DATA__SRC_SEL = lambda x: ((((unsigned)(x)) & 0xF) << 0) # type: ignore +PACKET3_COPY_DATA__DST_SEL = lambda x: ((((unsigned)(x)) & 0xF) << 8) # type: ignore +PACKET3_COPY_DATA__SRC_CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 13) # type: ignore +PACKET3_COPY_DATA__COUNT_SEL = lambda x: ((((unsigned)(x)) & 0x1) << 16) # type: ignore +PACKET3_COPY_DATA__WR_CONFIRM = lambda x: ((((unsigned)(x)) & 0x1) << 20) # type: ignore +PACKET3_COPY_DATA__DST_CACHE_POLICY = lambda x: ((((unsigned)(x)) & 0x3) << 25) # type: ignore +PACKET3_COPY_DATA__PQ_EXE_STATUS = lambda x: ((((unsigned)(x)) & 0x1) << 29) # type: ignore +PACKET3_COPY_DATA__SRC_REG_OFFSET = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_COPY_DATA__SRC_32B_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_COPY_DATA__SRC_64B_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x1FFFFFFF) << 3) # type: ignore +PACKET3_COPY_DATA__SRC_GDS_ADDR_LO = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_COPY_DATA__IMM_DATA = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__SRC_MEMTC_ADDR_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__SRC_IMM_DATA = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__DST_REG_OFFSET = lambda x: ((((unsigned)(x)) & 0x3FFFF) << 0) # type: ignore +PACKET3_COPY_DATA__DST_32B_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x3FFFFFFF) << 2) # type: ignore +PACKET3_COPY_DATA__DST_64B_ADDR_LO = lambda x: ((((unsigned)(x)) & 0x1FFFFFFF) << 3) # type: ignore +PACKET3_COPY_DATA__DST_GDS_ADDR_LO = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_COPY_DATA__DST_ADDR_HI = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_COPY_DATA__SRC_SEL__MEM_MAPPED_REGISTER = 0 +PACKET3_COPY_DATA__SRC_SEL__MEMORY = 1 +PACKET3_COPY_DATA__SRC_SEL__TC_L2 = 2 +PACKET3_COPY_DATA__SRC_SEL__GDS = 3 +PACKET3_COPY_DATA__SRC_SEL__PERFCOUNTERS = 4 +PACKET3_COPY_DATA__SRC_SEL__IMMEDIATE_DATA = 5 +PACKET3_COPY_DATA__SRC_SEL__ATOMIC_RETURN_DATA = 6 +PACKET3_COPY_DATA__SRC_SEL__GDS_ATOMIC_RETURN_DATA0 = 7 +PACKET3_COPY_DATA__SRC_SEL__GDS_ATOMIC_RETURN_DATA1 = 8 +PACKET3_COPY_DATA__SRC_SEL__GPU_CLOCK_COUNT = 9 +PACKET3_COPY_DATA__DST_SEL__MEM_MAPPED_REGISTER = 0 +PACKET3_COPY_DATA__DST_SEL__TC_L2 = 2 +PACKET3_COPY_DATA__DST_SEL__GDS = 3 +PACKET3_COPY_DATA__DST_SEL__PERFCOUNTERS = 4 +PACKET3_COPY_DATA__DST_SEL__MEMORY = 5 +PACKET3_COPY_DATA__DST_SEL__MEM_MAPPED_REG_DC = 6 +PACKET3_COPY_DATA__SRC_CACHE_POLICY__LRU = 0 +PACKET3_COPY_DATA__SRC_CACHE_POLICY__STREAM = 1 +PACKET3_COPY_DATA__COUNT_SEL__32_BITS_OF_DATA = 0 +PACKET3_COPY_DATA__COUNT_SEL__64_BITS_OF_DATA = 1 +PACKET3_COPY_DATA__WR_CONFIRM__DO_NOT_WAIT_FOR_CONFIRMATION = 0 +PACKET3_COPY_DATA__WR_CONFIRM__WAIT_FOR_CONFIRMATION = 1 +PACKET3_COPY_DATA__DST_CACHE_POLICY__LRU = 0 +PACKET3_COPY_DATA__DST_CACHE_POLICY__STREAM = 1 +PACKET3_COPY_DATA__PQ_EXE_STATUS__DEFAULT = 0 +PACKET3_COPY_DATA__PQ_EXE_STATUS__PHASE_UPDATE = 1 +PACKET3_PFP_SYNC_ME = 0x42 +PACKET3_COND_WRITE = 0x45 +PACKET3_EVENT_WRITE = 0x46 +EVENT_TYPE = lambda x: ((x) << 0) # type: ignore +EVENT_INDEX = lambda x: ((x) << 8) # type: ignore +PACKET3_EVENT_WRITE__EVENT_TYPE = lambda x: ((((unsigned)(x)) & 0x3F) << 0) # type: ignore +PACKET3_EVENT_WRITE__EVENT_INDEX = lambda x: ((((unsigned)(x)) & 0xF) << 8) # type: ignore +PACKET3_EVENT_WRITE__OFFLOAD_ENABLE = lambda x: ((((unsigned)(x)) & 0x1) << 31) # type: ignore +PACKET3_EVENT_WRITE__SAMP_PLST_CNTR_MODE = lambda x: ((((unsigned)(x)) & 0x3) << 29) # type: ignore +PACKET3_EVENT_WRITE__ADDRESS_LO = lambda x: ((((unsigned)(x)) & 0x1FFFFFFF) << 3) # type: ignore +PACKET3_EVENT_WRITE__ADDRESS_HI = lambda x: (((unsigned)(x)) << 0) # type: ignore +PACKET3_EVENT_WRITE__EVENT_INDEX__OTHER = 0 +PACKET3_EVENT_WRITE__EVENT_INDEX__SAMPLE_PIPELINESTATS = 2 +PACKET3_EVENT_WRITE__EVENT_INDEX__CS_PARTIAL_FLUSH = 4 +PACKET3_RELEASE_MEM = 0x49 +EVENT_TYPE = lambda x: ((x) << 0) # type: ignore +EVENT_INDEX = lambda x: ((x) << 8) # type: ignore +EOP_TCL1_VOL_ACTION_EN = (1 << 12) +EOP_TC_VOL_ACTION_EN = (1 << 13) +EOP_TC_WB_ACTION_EN = (1 << 15) +EOP_TCL1_ACTION_EN = (1 << 16) +EOP_TC_ACTION_EN = (1 << 17) +EOP_TC_NC_ACTION_EN = (1 << 19) +EOP_TC_MD_ACTION_EN = (1 << 21) +EOP_EXEC = (1 << 28) +DATA_SEL = lambda x: ((x) << 29) # type: ignore +INT_SEL = lambda x: ((x) << 24) # type: ignore +DST_SEL = lambda x: ((x) << 16) # type: ignore +PACKET3_PREAMBLE_CNTL = 0x4A +PACKET3_PREAMBLE_BEGIN_CLEAR_STATE = (2 << 28) +PACKET3_PREAMBLE_END_CLEAR_STATE = (3 << 28) +PACKET3_DMA_DATA = 0x50 +PACKET3_DMA_DATA_ENGINE = lambda x: ((x) << 0) # type: ignore +PACKET3_DMA_DATA_SRC_CACHE_POLICY = lambda x: ((x) << 13) # type: ignore +PACKET3_DMA_DATA_DST_SEL = lambda x: ((x) << 20) # type: ignore +PACKET3_DMA_DATA_DST_CACHE_POLICY = lambda x: ((x) << 25) # type: ignore +PACKET3_DMA_DATA_SRC_SEL = lambda x: ((x) << 29) # type: ignore +PACKET3_DMA_DATA_CP_SYNC = (1 << 31) +PACKET3_DMA_DATA_CMD_SAS = (1 << 26) +PACKET3_DMA_DATA_CMD_DAS = (1 << 27) +PACKET3_DMA_DATA_CMD_SAIC = (1 << 28) +PACKET3_DMA_DATA_CMD_DAIC = (1 << 29) +PACKET3_DMA_DATA_CMD_RAW_WAIT = (1 << 30) +PACKET3_ACQUIRE_MEM = 0x58 +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_NC_ACTION_ENA = lambda x: ((x) << 3) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WC_ACTION_ENA = lambda x: ((x) << 4) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_INV_METADATA_ACTION_ENA = lambda x: ((x) << 5) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_VOL_ACTION_ENA = lambda x: ((x) << 15) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WB_ACTION_ENA = lambda x: ((x) << 18) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_ACTION_ENA = lambda x: ((x) << 22) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_ACTION_ENA = lambda x: ((x) << 23) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_CB_ACTION_ENA = lambda x: ((x) << 25) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_DB_ACTION_ENA = lambda x: ((x) << 26) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_ACTION_ENA = lambda x: ((x) << 27) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_VOL_ACTION_ENA = lambda x: ((x) << 28) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_ICACHE_ACTION_ENA = lambda x: ((x) << 29) # type: ignore +PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_WB_ACTION_ENA = lambda x: ((x) << 30) # type: ignore +PACKET3_REWIND = 0x59 +PACKET3_ACQUIRE_MEM__COHER_SIZE = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_ACQUIRE_MEM__COHER_SIZE_HI = lambda x: ((((unsigned)(x)) & 0xFF) << 0) # type: ignore +PACKET3_ACQUIRE_MEM__COHER_SIZE_HI_VG10 = lambda x: ((((unsigned)(x)) & 0xFFFFFF) << 0) # type: ignore +PACKET3_ACQUIRE_MEM__COHER_BASE_LO = lambda x: ((unsigned)(x)) # type: ignore +PACKET3_ACQUIRE_MEM__COHER_BASE_HI = lambda x: ((((unsigned)(x)) & 0xFFFFFF) << 0) # type: ignore +PACKET3_ACQUIRE_MEM__POLL_INTERVAL = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_ACQUIRE_MEM__GCR_CNTL = lambda x: ((((unsigned)(x)) & 0x7FF) << 0) # type: ignore +PACKET3_LOAD_UCONFIG_REG = 0x5E +PACKET3_LOAD_SH_REG = 0x5F +PACKET3_LOAD_CONFIG_REG = 0x60 +PACKET3_LOAD_CONTEXT_REG = 0x61 +PACKET3_SET_CONFIG_REG = 0x68 +PACKET3_SET_CONFIG_REG_START = 0x00002000 +PACKET3_SET_CONFIG_REG_END = 0x00002c00 +PACKET3_SET_CONTEXT_REG = 0x69 +PACKET3_SET_CONTEXT_REG_START = 0x0000a000 +PACKET3_SET_CONTEXT_REG_END = 0x0000a400 +PACKET3_SET_CONTEXT_REG_INDIRECT = 0x73 +PACKET3_SET_SH_REG = 0x76 +PACKET3_SET_SH_REG_START = 0x00002c00 +PACKET3_SET_SH_REG_END = 0x00003000 +PACKET3_SET_SH_REG__REG_OFFSET = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_SET_SH_REG__VMID_SHIFT = lambda x: ((((unsigned)(x)) & 0x1F) << 23) # type: ignore +PACKET3_SET_SH_REG__INDEX = lambda x: ((((unsigned)(x)) & 0xF) << 28) # type: ignore +PACKET3_SET_SH_REG_OFFSET = 0x77 +PACKET3_SET_QUEUE_REG = 0x78 +PACKET3_SET_UCONFIG_REG = 0x79 +PACKET3_SET_UCONFIG_REG_START = 0x0000c000 +PACKET3_SET_UCONFIG_REG_END = 0x0000c400 +PACKET3_SET_UCONFIG_REG_INDEX_TYPE = (2 << 28) +PACKET3_SET_UCONFIG_REG__REG_OFFSET = lambda x: ((((unsigned)(x)) & 0xFFFF) << 0) # type: ignore +PACKET3_SCRATCH_RAM_WRITE = 0x7D +PACKET3_SCRATCH_RAM_READ = 0x7E +PACKET3_LOAD_CONST_RAM = 0x80 +PACKET3_WRITE_CONST_RAM = 0x81 +PACKET3_DUMP_CONST_RAM = 0x83 +PACKET3_INCREMENT_CE_COUNTER = 0x84 +PACKET3_INCREMENT_DE_COUNTER = 0x85 +PACKET3_WAIT_ON_CE_COUNTER = 0x86 +PACKET3_WAIT_ON_DE_COUNTER_DIFF = 0x88 +PACKET3_SWITCH_BUFFER = 0x8B +PACKET3_FRAME_CONTROL = 0x90 +FRAME_TMZ = (1 << 0) +FRAME_CMD = lambda x: ((x) << 28) # type: ignore +PACKET3_INVALIDATE_TLBS = 0x98 +PACKET3_INVALIDATE_TLBS_DST_SEL = lambda x: ((x) << 0) # type: ignore +PACKET3_INVALIDATE_TLBS_ALL_HUB = lambda x: ((x) << 4) # type: ignore +PACKET3_INVALIDATE_TLBS_PASID = lambda x: ((x) << 5) # type: ignore +PACKET3_INVALIDATE_TLBS_FLUSH_TYPE = lambda x: ((x) << 29) # type: ignore +PACKET3_SET_RESOURCES = 0xA0 +PACKET3_SET_RESOURCES_VMID_MASK = lambda x: ((x) << 0) # type: ignore +PACKET3_SET_RESOURCES_UNMAP_LATENTY = lambda x: ((x) << 16) # type: ignore +PACKET3_SET_RESOURCES_QUEUE_TYPE = lambda x: ((x) << 29) # type: ignore +PACKET3_MAP_QUEUES = 0xA2 +PACKET3_MAP_QUEUES_QUEUE_SEL = lambda x: ((x) << 4) # type: ignore +PACKET3_MAP_QUEUES_VMID = lambda x: ((x) << 8) # type: ignore +PACKET3_MAP_QUEUES_QUEUE = lambda x: ((x) << 13) # type: ignore +PACKET3_MAP_QUEUES_PIPE = lambda x: ((x) << 16) # type: ignore +PACKET3_MAP_QUEUES_ME = lambda x: ((x) << 18) # type: ignore +PACKET3_MAP_QUEUES_QUEUE_TYPE = lambda x: ((x) << 21) # type: ignore +PACKET3_MAP_QUEUES_ALLOC_FORMAT = lambda x: ((x) << 24) # type: ignore +PACKET3_MAP_QUEUES_ENGINE_SEL = lambda x: ((x) << 26) # type: ignore +PACKET3_MAP_QUEUES_NUM_QUEUES = lambda x: ((x) << 29) # type: ignore +PACKET3_MAP_QUEUES_CHECK_DISABLE = lambda x: ((x) << 1) # type: ignore +PACKET3_MAP_QUEUES_DOORBELL_OFFSET = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES = 0xA3 +PACKET3_UNMAP_QUEUES_ACTION = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_QUEUE_SEL = lambda x: ((x) << 4) # type: ignore +PACKET3_UNMAP_QUEUES_ENGINE_SEL = lambda x: ((x) << 26) # type: ignore +PACKET3_UNMAP_QUEUES_NUM_QUEUES = lambda x: ((x) << 29) # type: ignore +PACKET3_UNMAP_QUEUES_PASID = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET1 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_RB_WPTR = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET2 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET3 = lambda x: ((x) << 2) # type: ignore +PACKET3_QUERY_STATUS = 0xA4 +PACKET3_QUERY_STATUS_CONTEXT_ID = lambda x: ((x) << 0) # type: ignore +PACKET3_QUERY_STATUS_INTERRUPT_SEL = lambda x: ((x) << 28) # type: ignore +PACKET3_QUERY_STATUS_COMMAND = lambda x: ((x) << 30) # type: ignore +PACKET3_QUERY_STATUS_PASID = lambda x: ((x) << 0) # type: ignore +PACKET3_QUERY_STATUS_DOORBELL_OFFSET = lambda x: ((x) << 2) # type: ignore +PACKET3_QUERY_STATUS_ENG_SEL = lambda x: ((x) << 25) # type: ignore +PACKET3_RUN_CLEANER_SHADER_9_0 = 0xD7 +PACKET3_RUN_CLEANER_SHADER = 0xD2 +VCE_CMD_NO_OP = 0x00000000 +VCE_CMD_END = 0x00000001 +VCE_CMD_IB = 0x00000002 +VCE_CMD_FENCE = 0x00000003 +VCE_CMD_TRAP = 0x00000004 +VCE_CMD_IB_AUTO = 0x00000005 +VCE_CMD_SEMAPHORE = 0x00000006 +VCE_CMD_IB_VM = 0x00000102 +VCE_CMD_WAIT_GE = 0x00000106 +VCE_CMD_UPDATE_PTB = 0x00000107 +VCE_CMD_FLUSH_TLB = 0x00000108 +VCE_CMD_REG_WRITE = 0x00000109 +VCE_CMD_REG_WAIT = 0x0000010a +HEVC_ENC_CMD_NO_OP = 0x00000000 +HEVC_ENC_CMD_END = 0x00000001 +HEVC_ENC_CMD_FENCE = 0x00000003 +HEVC_ENC_CMD_TRAP = 0x00000004 +HEVC_ENC_CMD_IB_VM = 0x00000102 +HEVC_ENC_CMD_REG_WRITE = 0x00000109 +HEVC_ENC_CMD_REG_WAIT = 0x0000010a \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/pmc.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/pmc.py new file mode 100644 index 000000000..ee8658e08 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/pmc.py @@ -0,0 +1,3350 @@ +counters = { + 'CPC_CPC_STAT_BUSY': { + 'gfx90a': ('CPC', 25), + 'gfx908': ('CPC', 25), + 'gfx940': ('CPC', 25), + 'gfx941': ('CPC', 25), + 'gfx942': ('CPC', 25), + 'gfx950': ('CPC', 25), + }, + 'CPC_CPC_STAT_IDLE': { + 'gfx90a': ('CPC', 26), + 'gfx908': ('CPC', 26), + 'gfx940': ('CPC', 26), + 'gfx941': ('CPC', 26), + 'gfx942': ('CPC', 26), + 'gfx950': ('CPC', 26), + }, + 'CPC_CPC_STAT_STALL': { + 'gfx90a': ('CPC', 27), + 'gfx908': ('CPC', 27), + 'gfx940': ('CPC', 27), + 'gfx941': ('CPC', 27), + 'gfx942': ('CPC', 27), + 'gfx950': ('CPC', 27), + }, + 'CPC_CPC_TCIU_BUSY': { + 'gfx90a': ('CPC', 28), + 'gfx908': ('CPC', 28), + 'gfx940': ('CPC', 28), + 'gfx941': ('CPC', 28), + 'gfx942': ('CPC', 28), + 'gfx950': ('CPC', 28), + }, + 'CPC_CPC_TCIU_IDLE': { + 'gfx90a': ('CPC', 29), + 'gfx908': ('CPC', 29), + 'gfx940': ('CPC', 29), + 'gfx941': ('CPC', 29), + 'gfx942': ('CPC', 29), + 'gfx950': ('CPC', 29), + }, + 'CPC_CPC_UTCL2IU_BUSY': { + 'gfx90a': ('CPC', 30), + 'gfx908': ('CPC', 30), + 'gfx940': ('CPC', 30), + 'gfx941': ('CPC', 30), + 'gfx942': ('CPC', 30), + 'gfx950': ('CPC', 30), + }, + 'CPC_CPC_UTCL2IU_IDLE': { + 'gfx90a': ('CPC', 31), + 'gfx908': ('CPC', 31), + 'gfx940': ('CPC', 31), + 'gfx941': ('CPC', 31), + 'gfx942': ('CPC', 31), + 'gfx950': ('CPC', 31), + }, + 'CPC_CPC_UTCL2IU_STALL': { + 'gfx90a': ('CPC', 32), + 'gfx908': ('CPC', 32), + 'gfx940': ('CPC', 32), + 'gfx941': ('CPC', 32), + 'gfx942': ('CPC', 32), + 'gfx950': ('CPC', 32), + }, + 'CPC_ME1_BUSY_FOR_PACKET_DECODE': { + 'gfx90a': ('CPC', 13), + 'gfx908': ('CPC', 13), + 'gfx940': ('CPC', 13), + 'gfx941': ('CPC', 13), + 'gfx942': ('CPC', 13), + 'gfx950': ('CPC', 13), + }, + 'CPC_ME1_DC0_SPI_BUSY': { + 'gfx90a': ('CPC', 33), + 'gfx908': ('CPC', 33), + 'gfx940': ('CPC', 33), + 'gfx941': ('CPC', 33), + 'gfx942': ('CPC', 33), + 'gfx950': ('CPC', 33), + }, + 'CPC_UTCL1_STALL_ON_TRANSLATION': { + 'gfx90a': ('CPC', 24), + 'gfx908': ('CPC', 24), + 'gfx940': ('CPC', 24), + 'gfx941': ('CPC', 24), + 'gfx942': ('CPC', 24), + 'gfx950': ('CPC', 24), + }, + 'CPC_ALWAYS_COUNT': { + 'gfx950': ('CPC', 0), + }, + 'CPC_ADC_VALID_CHUNK_NOT_AVAIL': { + 'gfx950': ('CPC', 3), + }, + 'CPC_ADC_DISPATCH_ALLOC_DONE': { + 'gfx950': ('CPC', 4), + }, + 'CPC_ADC_VALID_CHUNK_END': { + 'gfx950': ('CPC', 9), + }, + 'CPC_SYNC_FIFO_FULL_LEVEL': { + 'gfx950': ('CPC', 43), + }, + 'CPC_SYNC_FIFO_FULL': { + 'gfx950': ('CPC', 44), + }, + 'CPC_GD_BUSY': { + 'gfx950': ('CPC', 61), + }, + 'CPC_TG_SEND': { + 'gfx950': ('CPC', 62), + }, + 'CPC_WALK_NEXT_CHUNK': { + 'gfx950': ('CPC', 63), + }, + 'CPC_STALLED_BY_SE0_SPI': { + 'gfx950': ('CPC', 64), + }, + 'CPC_STALLED_BY_SE1_SPI': { + 'gfx950': ('CPC', 65), + }, + 'CPC_STALLED_BY_SE2_SPI': { + 'gfx950': ('CPC', 66), + }, + 'CPC_STALLED_BY_SE3_SPI': { + 'gfx950': ('CPC', 67), + }, + 'CPC_LTE_ALL': { + 'gfx950': ('CPC', 68), + }, + 'CPC_SYNC_WRREQ_FIFO_BUSY': { + 'gfx950': ('CPC', 69), + }, + 'CPC_CANE_BUSY': { + 'gfx950': ('CPC', 70), + }, + 'CPC_CANE_STALL': { + 'gfx950': ('CPC', 71), + }, + 'CPF_CMP_UTCL1_STALL_ON_TRANSLATION': { + 'gfx90a': ('CPF', 20), + 'gfx908': ('CPF', 20), + 'gfx940': ('CPF', 20), + 'gfx941': ('CPF', 20), + 'gfx942': ('CPF', 20), + 'gfx950': ('CPF', 20), + }, + 'CPF_CPF_STAT_BUSY': { + 'gfx90a': ('CPF', 23), + 'gfx908': ('CPF', 23), + 'gfx940': ('CPF', 23), + 'gfx941': ('CPF', 23), + 'gfx942': ('CPF', 23), + 'gfx950': ('CPF', 23), + }, + 'CPF_CPF_STAT_IDLE': { + 'gfx90a': ('CPF', 24), + 'gfx908': ('CPF', 24), + 'gfx940': ('CPF', 24), + 'gfx941': ('CPF', 24), + 'gfx942': ('CPF', 24), + 'gfx950': ('CPF', 24), + }, + 'CPF_CPF_STAT_STALL': { + 'gfx90a': ('CPF', 25), + 'gfx908': ('CPF', 25), + 'gfx940': ('CPF', 25), + 'gfx941': ('CPF', 25), + 'gfx942': ('CPF', 25), + 'gfx950': ('CPF', 25), + }, + 'CPF_CPF_TCIU_BUSY': { + 'gfx90a': ('CPF', 26), + 'gfx908': ('CPF', 26), + 'gfx940': ('CPF', 26), + 'gfx941': ('CPF', 26), + 'gfx942': ('CPF', 26), + 'gfx950': ('CPF', 26), + }, + 'CPF_CPF_TCIU_IDLE': { + 'gfx90a': ('CPF', 27), + 'gfx908': ('CPF', 27), + 'gfx940': ('CPF', 27), + 'gfx941': ('CPF', 27), + 'gfx942': ('CPF', 27), + 'gfx950': ('CPF', 27), + }, + 'CPF_CPF_TCIU_STALL': { + 'gfx90a': ('CPF', 28), + 'gfx908': ('CPF', 28), + 'gfx940': ('CPF', 28), + 'gfx941': ('CPF', 28), + 'gfx942': ('CPF', 28), + 'gfx950': ('CPF', 28), + }, + 'GL2C_EA_RDREQ': { + 'gfx12': ('GL2C', 140), + 'gfx1200': ('GL2C', 140), + 'gfx1201': ('GL2C', 140), + }, + 'GL2C_EA_RDREQ_128B': { + 'gfx10': ('GL2C', 102), + 'gfx1010': ('GL2C', 102), + 'gfx1030': ('GL2C', 102), + 'gfx1031': ('GL2C', 102), + 'gfx1032': ('GL2C', 102), + 'gfx11': ('GL2C', 102), + 'gfx1100': ('GL2C', 102), + 'gfx1101': ('GL2C', 102), + 'gfx1102': ('GL2C', 102), + 'gfx12': ('GL2C', 148), + 'gfx1200': ('GL2C', 148), + 'gfx1201': ('GL2C', 148), + }, + 'GL2C_EA_RDREQ_32B': { + 'gfx10': ('GL2C', 99), + 'gfx1010': ('GL2C', 99), + 'gfx1030': ('GL2C', 99), + 'gfx1031': ('GL2C', 99), + 'gfx1032': ('GL2C', 99), + 'gfx11': ('GL2C', 99), + 'gfx1100': ('GL2C', 99), + 'gfx1101': ('GL2C', 99), + 'gfx1102': ('GL2C', 99), + 'gfx12': ('GL2C', 146), + 'gfx1200': ('GL2C', 146), + 'gfx1201': ('GL2C', 146), + }, + 'GL2C_EA_RDREQ_64B': { + 'gfx10': ('GL2C', 100), + 'gfx1010': ('GL2C', 100), + 'gfx1030': ('GL2C', 100), + 'gfx1031': ('GL2C', 100), + 'gfx1032': ('GL2C', 100), + 'gfx11': ('GL2C', 100), + 'gfx1100': ('GL2C', 100), + 'gfx1101': ('GL2C', 100), + 'gfx1102': ('GL2C', 100), + 'gfx12': ('GL2C', 147), + 'gfx1200': ('GL2C', 147), + 'gfx1201': ('GL2C', 147), + }, + 'GL2C_EA_RDREQ_96B': { + 'gfx10': ('GL2C', 101), + 'gfx1010': ('GL2C', 101), + 'gfx1030': ('GL2C', 101), + 'gfx1031': ('GL2C', 101), + 'gfx1032': ('GL2C', 101), + 'gfx11': ('GL2C', 101), + 'gfx1100': ('GL2C', 101), + 'gfx1101': ('GL2C', 101), + 'gfx1102': ('GL2C', 101), + }, + 'GL2C_EA_WRREQ': { + 'gfx12': ('GL2C', 108), + 'gfx1200': ('GL2C', 108), + 'gfx1201': ('GL2C', 108), + }, + 'GL2C_EA_WRREQ_STALL': { + 'gfx12': ('GL2C', 122), + 'gfx1200': ('GL2C', 122), + 'gfx1201': ('GL2C', 122), + }, + 'GL2C_EA_WRREQ_64B': { + 'gfx10': ('GL2C', 85), + 'gfx1010': ('GL2C', 85), + 'gfx1030': ('GL2C', 85), + 'gfx1031': ('GL2C', 85), + 'gfx1032': ('GL2C', 85), + 'gfx11': ('GL2C', 85), + 'gfx1100': ('GL2C', 85), + 'gfx1101': ('GL2C', 85), + 'gfx1102': ('GL2C', 85), + 'gfx12': ('GL2C', 114), + 'gfx1200': ('GL2C', 114), + 'gfx1201': ('GL2C', 114), + }, + 'GL2C_HIT': { + 'gfx10': ('GL2C', 42), + 'gfx1010': ('GL2C', 42), + 'gfx1030': ('GL2C', 42), + 'gfx1031': ('GL2C', 42), + 'gfx1032': ('GL2C', 42), + 'gfx11': ('GL2C', 42), + 'gfx1100': ('GL2C', 42), + 'gfx1101': ('GL2C', 42), + 'gfx1102': ('GL2C', 42), + 'gfx12': ('GL2C', 41), + 'gfx1200': ('GL2C', 41), + 'gfx1201': ('GL2C', 41), + }, + 'GL2C_MC_RDREQ': { + 'gfx10': ('GL2C', 96), + 'gfx1010': ('GL2C', 96), + 'gfx1030': ('GL2C', 96), + 'gfx1031': ('GL2C', 96), + 'gfx1032': ('GL2C', 96), + 'gfx11': ('GL2C', 96), + 'gfx1100': ('GL2C', 96), + 'gfx1101': ('GL2C', 96), + 'gfx1102': ('GL2C', 96), + }, + 'GL2C_MC_WRREQ': { + 'gfx10': ('GL2C', 83), + 'gfx1010': ('GL2C', 83), + 'gfx1030': ('GL2C', 83), + 'gfx1031': ('GL2C', 83), + 'gfx1032': ('GL2C', 83), + 'gfx11': ('GL2C', 83), + 'gfx1100': ('GL2C', 83), + 'gfx1101': ('GL2C', 83), + 'gfx1102': ('GL2C', 83), + }, + 'GL2C_MC_WRREQ_STALL': { + 'gfx10': ('GL2C', 88), + 'gfx1010': ('GL2C', 88), + 'gfx1030': ('GL2C', 88), + 'gfx1031': ('GL2C', 88), + 'gfx1032': ('GL2C', 88), + 'gfx11': ('GL2C', 88), + 'gfx1100': ('GL2C', 88), + 'gfx1101': ('GL2C', 88), + 'gfx1102': ('GL2C', 88), + }, + 'GL2C_MISS': { + 'gfx10': ('GL2C', 43), + 'gfx1010': ('GL2C', 43), + 'gfx1030': ('GL2C', 43), + 'gfx1031': ('GL2C', 43), + 'gfx1032': ('GL2C', 43), + 'gfx11': ('GL2C', 43), + 'gfx1100': ('GL2C', 43), + 'gfx1101': ('GL2C', 43), + 'gfx1102': ('GL2C', 43), + 'gfx12': ('GL2C', 42), + 'gfx1200': ('GL2C', 42), + 'gfx1201': ('GL2C', 42), + }, + 'GRBM_COUNT': { + 'gfx10': ('GRBM', 0), + 'gfx1010': ('GRBM', 0), + 'gfx1030': ('GRBM', 0), + 'gfx1031': ('GRBM', 0), + 'gfx1032': ('GRBM', 0), + 'gfx11': ('GRBM', 0), + 'gfx1100': ('GRBM', 0), + 'gfx1101': ('GRBM', 0), + 'gfx1102': ('GRBM', 0), + 'gfx12': ('GRBM', 0), + 'gfx1200': ('GRBM', 0), + 'gfx1201': ('GRBM', 0), + 'gfx9': ('GRBM', 0), + 'gfx900': ('GRBM', 0), + 'gfx906': ('GRBM', 0), + 'gfx908': ('GRBM', 0), + 'gfx90a': ('GRBM', 0), + 'gfx940': ('GRBM', 0), + 'gfx941': ('GRBM', 0), + 'gfx942': ('GRBM', 0), + 'gfx950': ('GRBM', 0), + }, + 'GRBM_CPC_BUSY': { + 'gfx90a': ('GRBM', 30), + 'gfx908': ('GRBM', 30), + 'gfx940': ('GRBM', 30), + 'gfx941': ('GRBM', 30), + 'gfx942': ('GRBM', 30), + 'gfx950': ('GRBM', 30), + }, + 'GRBM_CPF_BUSY': { + 'gfx90a': ('GRBM', 31), + 'gfx908': ('GRBM', 31), + 'gfx940': ('GRBM', 31), + 'gfx941': ('GRBM', 31), + 'gfx942': ('GRBM', 31), + 'gfx950': ('GRBM', 31), + }, + 'GRBM_CP_BUSY': { + 'gfx10': ('GRBM', 3), + 'gfx1010': ('GRBM', 3), + 'gfx1030': ('GRBM', 3), + 'gfx1031': ('GRBM', 3), + 'gfx1032': ('GRBM', 3), + 'gfx90a': ('GRBM', 3), + 'gfx908': ('GRBM', 3), + 'gfx940': ('GRBM', 3), + 'gfx941': ('GRBM', 3), + 'gfx942': ('GRBM', 3), + 'gfx950': ('GRBM', 3), + }, + 'GRBM_EA_BUSY': { + 'gfx10': ('GRBM', 35), + 'gfx1010': ('GRBM', 35), + 'gfx1030': ('GRBM', 35), + 'gfx1031': ('GRBM', 35), + 'gfx1032': ('GRBM', 35), + 'gfx90a': ('GRBM', 35), + 'gfx908': ('GRBM', 35), + 'gfx940': ('GRBM', 35), + 'gfx941': ('GRBM', 35), + 'gfx942': ('GRBM', 35), + 'gfx950': ('GRBM', 35), + }, + 'GRBM_GDS_BUSY': { + 'gfx10': ('GRBM', 25), + 'gfx1010': ('GRBM', 25), + 'gfx1030': ('GRBM', 25), + 'gfx1031': ('GRBM', 25), + 'gfx1032': ('GRBM', 25), + }, + 'GRBM_GL2CC_BUSY': { + 'gfx10': ('GRBM', 40), + 'gfx1010': ('GRBM', 40), + 'gfx1030': ('GRBM', 40), + 'gfx1031': ('GRBM', 40), + 'gfx1032': ('GRBM', 40), + }, + 'GRBM_GUI_ACTIVE': { + 'gfx10': ('GRBM', 2), + 'gfx1010': ('GRBM', 2), + 'gfx1030': ('GRBM', 2), + 'gfx1031': ('GRBM', 2), + 'gfx1032': ('GRBM', 2), + 'gfx11': ('GRBM', 2), + 'gfx1100': ('GRBM', 2), + 'gfx1101': ('GRBM', 2), + 'gfx1102': ('GRBM', 2), + 'gfx12': ('GRBM', 2), + 'gfx1200': ('GRBM', 2), + 'gfx1201': ('GRBM', 2), + 'gfx9': ('GRBM', 2), + 'gfx900': ('GRBM', 2), + 'gfx906': ('GRBM', 2), + 'gfx908': ('GRBM', 2), + 'gfx90a': ('GRBM', 2), + 'gfx940': ('GRBM', 2), + 'gfx941': ('GRBM', 2), + 'gfx942': ('GRBM', 2), + 'gfx950': ('GRBM', 2), + }, + 'GRBM_SPI_BUSY': { + 'gfx10': ('GRBM', 11), + 'gfx1010': ('GRBM', 11), + 'gfx1030': ('GRBM', 11), + 'gfx1031': ('GRBM', 11), + 'gfx1032': ('GRBM', 11), + 'gfx90a': ('GRBM', 11), + 'gfx908': ('GRBM', 11), + 'gfx940': ('GRBM', 11), + 'gfx941': ('GRBM', 11), + 'gfx942': ('GRBM', 11), + 'gfx950': ('GRBM', 11), + }, + 'GRBM_TA_BUSY': { + 'gfx10': ('GRBM', 13), + 'gfx1010': ('GRBM', 13), + 'gfx1030': ('GRBM', 13), + 'gfx1031': ('GRBM', 13), + 'gfx1032': ('GRBM', 13), + 'gfx90a': ('GRBM', 13), + 'gfx908': ('GRBM', 13), + 'gfx940': ('GRBM', 13), + 'gfx941': ('GRBM', 13), + 'gfx942': ('GRBM', 13), + 'gfx950': ('GRBM', 13), + }, + 'GRBM_TC_BUSY': { + 'gfx90a': ('GRBM', 28), + 'gfx908': ('GRBM', 28), + 'gfx940': ('GRBM', 28), + 'gfx941': ('GRBM', 28), + 'gfx942': ('GRBM', 28), + 'gfx950': ('GRBM', 28), + }, + 'GRBM_UTCL2_BUSY': { + 'gfx90a': ('GRBM', 34), + 'gfx908': ('GRBM', 34), + 'gfx940': ('GRBM', 34), + 'gfx941': ('GRBM', 34), + 'gfx942': ('GRBM', 34), + 'gfx950': ('GRBM', 34), + }, + 'SPI_CSN_BUSY': { + 'gfx90a': ('SPI', 48), + 'gfx908': ('SPI', 48), + 'gfx940': ('SPI', 48), + 'gfx941': ('SPI', 48), + 'gfx942': ('SPI', 48), + 'gfx950': ('SPI', 48), + }, + 'SPI_CSN_NUM_THREADGROUPS': { + 'gfx90a': ('SPI', 49), + 'gfx908': ('SPI', 49), + 'gfx940': ('SPI', 49), + 'gfx941': ('SPI', 49), + 'gfx942': ('SPI', 49), + 'gfx950': ('SPI', 49), + }, + 'SPI_CSN_WAVE': { + 'gfx90a': ('SPI', 52), + 'gfx908': ('SPI', 52), + 'gfx940': ('SPI', 52), + 'gfx941': ('SPI', 52), + 'gfx942': ('SPI', 52), + 'gfx950': ('SPI', 52), + }, + 'SPI_CSN_WINDOW_VALID': { + 'gfx90a': ('SPI', 47), + 'gfx908': ('SPI', 47), + 'gfx940': ('SPI', 47), + 'gfx941': ('SPI', 47), + 'gfx942': ('SPI', 47), + 'gfx950': ('SPI', 47), + }, + 'SPI_RA_BAR_CU_FULL_CSN': { + 'gfx90a': ('SPI', 123), + 'gfx908': ('SPI', 123), + 'gfx940': ('SPI', 123), + 'gfx941': ('SPI', 123), + 'gfx942': ('SPI', 123), + 'gfx950': ('SPI', 123), + }, + 'SPI_RA_BULKY_CU_FULL_CSN': { + 'gfx90a': ('SPI', 125), + 'gfx908': ('SPI', 125), + 'gfx940': ('SPI', 125), + 'gfx941': ('SPI', 125), + 'gfx942': ('SPI', 125), + 'gfx950': ('SPI', 125), + }, + 'SPI_RA_LDS_CU_FULL_CSN': { + 'gfx90a': ('SPI', 120), + 'gfx908': ('SPI', 120), + 'gfx940': ('SPI', 120), + 'gfx941': ('SPI', 120), + 'gfx942': ('SPI', 120), + 'gfx950': ('SPI', 120), + }, + 'SPI_RA_REQ_NO_ALLOC': { + 'gfx90a': ('SPI', 79), + 'gfx908': ('SPI', 79), + 'gfx940': ('SPI', 79), + 'gfx941': ('SPI', 79), + 'gfx942': ('SPI', 79), + 'gfx950': ('SPI', 79), + }, + 'SPI_RA_REQ_NO_ALLOC_CSN': { + 'gfx90a': ('SPI', 85), + 'gfx908': ('SPI', 85), + 'gfx940': ('SPI', 85), + 'gfx941': ('SPI', 85), + 'gfx942': ('SPI', 85), + 'gfx950': ('SPI', 85), + }, + 'SPI_RA_RES_STALL_CSN': { + 'gfx90a': ('SPI', 91), + 'gfx908': ('SPI', 91), + 'gfx940': ('SPI', 91), + 'gfx941': ('SPI', 91), + 'gfx942': ('SPI', 91), + 'gfx950': ('SPI', 91), + }, + 'SPI_RA_SGPR_SIMD_FULL_CSN': { + 'gfx90a': ('SPI', 115), + 'gfx908': ('SPI', 115), + 'gfx940': ('SPI', 115), + 'gfx941': ('SPI', 115), + 'gfx942': ('SPI', 115), + 'gfx950': ('SPI', 115), + }, + 'SPI_RA_TGLIM_CU_FULL_CSN': { + 'gfx90a': ('SPI', 127), + 'gfx908': ('SPI', 127), + 'gfx940': ('SPI', 127), + 'gfx941': ('SPI', 127), + 'gfx942': ('SPI', 127), + 'gfx950': ('SPI', 127), + }, + 'SPI_RA_TMP_STALL_CSN': { + 'gfx90a': ('SPI', 97), + 'gfx908': ('SPI', 97), + 'gfx940': ('SPI', 97), + 'gfx941': ('SPI', 97), + 'gfx942': ('SPI', 97), + 'gfx950': ('SPI', 97), + }, + 'SPI_RA_VGPR_SIMD_FULL_CSN': { + 'gfx90a': ('SPI', 109), + 'gfx908': ('SPI', 109), + 'gfx940': ('SPI', 109), + 'gfx941': ('SPI', 109), + 'gfx942': ('SPI', 109), + 'gfx950': ('SPI', 109), + }, + 'SPI_RA_WAVE_SIMD_FULL_CSN': { + 'gfx90a': ('SPI', 103), + 'gfx908': ('SPI', 103), + 'gfx940': ('SPI', 103), + 'gfx941': ('SPI', 103), + 'gfx942': ('SPI', 103), + 'gfx950': ('SPI', 103), + }, + 'SPI_RA_WVLIM_STALL_CSN': { + 'gfx90a': ('SPI', 133), + 'gfx908': ('SPI', 133), + 'gfx940': ('SPI', 133), + 'gfx941': ('SPI', 133), + 'gfx942': ('SPI', 133), + 'gfx950': ('SPI', 133), + }, + 'SPI_SWC_CSC_WR': { + 'gfx90a': ('SPI', 189), + 'gfx908': ('SPI', 189), + 'gfx940': ('SPI', 189), + 'gfx941': ('SPI', 189), + 'gfx942': ('SPI', 189), + 'gfx950': ('SPI', 189), + }, + 'SPI_VWC_CSC_WR': { + 'gfx90a': ('SPI', 195), + 'gfx908': ('SPI', 195), + 'gfx940': ('SPI', 195), + 'gfx941': ('SPI', 195), + 'gfx942': ('SPI', 195), + 'gfx950': ('SPI', 195), + }, + 'SPI_CS0_WINDOW_VALID': { + 'gfx950': ('SPI', 0), + }, + 'SPI_CS0_BUSY': { + 'gfx950': ('SPI', 1), + }, + 'SPI_CS0_NUM_THREADGROUPS': { + 'gfx950': ('SPI', 2), + }, + 'SPI_CS0_CRAWLER_STALL': { + 'gfx950': ('SPI', 3), + }, + 'SPI_CS0_EVENT_WAVE': { + 'gfx950': ('SPI', 4), + }, + 'SPI_CS0_WAVE': { + 'gfx950': ('SPI', 5), + }, + 'SPI_CS1_WINDOW_VALID': { + 'gfx950': ('SPI', 6), + }, + 'SPI_CS1_BUSY': { + 'gfx950': ('SPI', 7), + }, + 'SPI_CS1_NUM_THREADGROUPS': { + 'gfx950': ('SPI', 8), + }, + 'SPI_CS1_CRAWLER_STALL': { + 'gfx950': ('SPI', 9), + }, + 'SPI_CS1_EVENT_WAVE': { + 'gfx950': ('SPI', 10), + }, + 'SPI_CS1_WAVE': { + 'gfx950': ('SPI', 11), + }, + 'SPI_CS2_WINDOW_VALID': { + 'gfx950': ('SPI', 12), + }, + 'SPI_CS2_BUSY': { + 'gfx950': ('SPI', 13), + }, + 'SPI_CS2_NUM_THREADGROUPS': { + 'gfx950': ('SPI', 14), + }, + 'SPI_CS2_CRAWLER_STALL': { + 'gfx950': ('SPI', 15), + }, + 'SPI_CS2_EVENT_WAVE': { + 'gfx950': ('SPI', 16), + }, + 'SPI_CS2_WAVE': { + 'gfx950': ('SPI', 17), + }, + 'SPI_CS3_WINDOW_VALID': { + 'gfx950': ('SPI', 18), + }, + 'SPI_CS3_BUSY': { + 'gfx950': ('SPI', 19), + }, + 'SPI_CS3_NUM_THREADGROUPS': { + 'gfx950': ('SPI', 20), + }, + 'SPI_CS3_CRAWLER_STALL': { + 'gfx950': ('SPI', 21), + }, + 'SPI_CS3_EVENT_WAVE': { + 'gfx950': ('SPI', 22), + }, + 'SPI_CS3_WAVE': { + 'gfx950': ('SPI', 23), + }, + 'SPI_CSQ_P0_Q0_OCCUPANCY': { + 'gfx950': ('SPI', 140), + }, + 'SPI_CSQ_P0_Q1_OCCUPANCY': { + 'gfx950': ('SPI', 141), + }, + 'SPI_CSQ_P0_Q2_OCCUPANCY': { + 'gfx950': ('SPI', 142), + }, + 'SPI_CSQ_P0_Q3_OCCUPANCY': { + 'gfx950': ('SPI', 143), + }, + 'SPI_CSQ_P0_Q4_OCCUPANCY': { + 'gfx950': ('SPI', 144), + }, + 'SPI_CSQ_P0_Q5_OCCUPANCY': { + 'gfx950': ('SPI', 145), + }, + 'SPI_CSQ_P0_Q6_OCCUPANCY': { + 'gfx950': ('SPI', 146), + }, + 'SPI_CSQ_P0_Q7_OCCUPANCY': { + 'gfx950': ('SPI', 147), + }, + 'SPI_CSQ_P1_Q0_OCCUPANCY': { + 'gfx950': ('SPI', 148), + }, + 'SPI_CSQ_P1_Q1_OCCUPANCY': { + 'gfx950': ('SPI', 149), + }, + 'SPI_CSQ_P1_Q2_OCCUPANCY': { + 'gfx950': ('SPI', 150), + }, + 'SPI_CSQ_P1_Q3_OCCUPANCY': { + 'gfx950': ('SPI', 151), + }, + 'SPI_CSQ_P1_Q4_OCCUPANCY': { + 'gfx950': ('SPI', 152), + }, + 'SPI_CSQ_P1_Q5_OCCUPANCY': { + 'gfx950': ('SPI', 153), + }, + 'SPI_CSQ_P1_Q6_OCCUPANCY': { + 'gfx950': ('SPI', 154), + }, + 'SPI_CSQ_P1_Q7_OCCUPANCY': { + 'gfx950': ('SPI', 155), + }, + 'SPI_CSQ_P2_Q0_OCCUPANCY': { + 'gfx950': ('SPI', 156), + }, + 'SPI_CSQ_P2_Q1_OCCUPANCY': { + 'gfx950': ('SPI', 157), + }, + 'SPI_CSQ_P2_Q2_OCCUPANCY': { + 'gfx950': ('SPI', 158), + }, + 'SPI_CSQ_P2_Q3_OCCUPANCY': { + 'gfx950': ('SPI', 159), + }, + 'SPI_CSQ_P2_Q4_OCCUPANCY': { + 'gfx950': ('SPI', 160), + }, + 'SPI_CSQ_P2_Q5_OCCUPANCY': { + 'gfx950': ('SPI', 161), + }, + 'SPI_CSQ_P2_Q6_OCCUPANCY': { + 'gfx950': ('SPI', 162), + }, + 'SPI_CSQ_P2_Q7_OCCUPANCY': { + 'gfx950': ('SPI', 163), + }, + 'SPI_CSQ_P3_Q0_OCCUPANCY': { + 'gfx950': ('SPI', 164), + }, + 'SPI_CSQ_P3_Q1_OCCUPANCY': { + 'gfx950': ('SPI', 165), + }, + 'SPI_CSQ_P3_Q2_OCCUPANCY': { + 'gfx950': ('SPI', 166), + }, + 'SPI_CSQ_P3_Q3_OCCUPANCY': { + 'gfx950': ('SPI', 167), + }, + 'SPI_CSQ_P3_Q4_OCCUPANCY': { + 'gfx950': ('SPI', 168), + }, + 'SPI_CSQ_P3_Q5_OCCUPANCY': { + 'gfx950': ('SPI', 169), + }, + 'SPI_CSQ_P3_Q6_OCCUPANCY': { + 'gfx950': ('SPI', 170), + }, + 'SPI_CSQ_P3_Q7_OCCUPANCY': { + 'gfx950': ('SPI', 171), + }, + 'SPI_CSQ_P0_OCCUPANCY': { + 'gfx950': ('SPI', 172), + }, + 'SPI_CSQ_P1_OCCUPANCY': { + 'gfx950': ('SPI', 173), + }, + 'SPI_CSQ_P2_OCCUPANCY': { + 'gfx950': ('SPI', 174), + }, + 'SPI_CSQ_P3_OCCUPANCY': { + 'gfx950': ('SPI', 175), + }, + 'SPI_VWC0_VDATA_VALID_WR': { + 'gfx950': ('SPI', 193), + }, + 'SPI_VWC1_VDATA_VALID_WR': { + 'gfx950': ('SPI', 194), + }, + 'SPI_CSC_WAVE_CNT_BUSY': { + 'gfx950': ('SPI', 225), + }, + 'SQC_DCACHE_ATOMIC': { + 'gfx90a': ('SQ', 298), + 'gfx908': ('SQ', 298), + 'gfx940': ('SQ', 298), + 'gfx941': ('SQ', 298), + 'gfx942': ('SQ', 298), + 'gfx950': ('SQ', 298), + }, + 'SQC_DCACHE_BUSY_CYCLES': { + 'gfx940': ('SQ', 289), + 'gfx941': ('SQ', 289), + 'gfx942': ('SQ', 289), + 'gfx950': ('SQ', 289), + }, + 'SQC_DCACHE_HITS': { + 'gfx90a': ('SQ', 291), + 'gfx908': ('SQ', 291), + 'gfx940': ('SQ', 291), + 'gfx941': ('SQ', 291), + 'gfx942': ('SQ', 291), + 'gfx950': ('SQ', 291), + }, + 'SQC_DCACHE_INPUT_VALID_READYB': { + 'gfx90a': ('SQ', 260), + 'gfx908': ('SQ', 260), + 'gfx940': ('SQ', 260), + 'gfx941': ('SQ', 260), + 'gfx942': ('SQ', 260), + 'gfx950': ('SQ', 260), + }, + 'SQC_DCACHE_MISSES': { + 'gfx90a': ('SQ', 292), + 'gfx908': ('SQ', 292), + 'gfx940': ('SQ', 292), + 'gfx941': ('SQ', 292), + 'gfx942': ('SQ', 292), + 'gfx950': ('SQ', 292), + }, + 'SQC_DCACHE_MISSES_DUPLICATE': { + 'gfx90a': ('SQ', 293), + 'gfx908': ('SQ', 293), + 'gfx940': ('SQ', 293), + 'gfx941': ('SQ', 293), + 'gfx942': ('SQ', 293), + 'gfx950': ('SQ', 293), + }, + 'SQC_DCACHE_REQ': { + 'gfx90a': ('SQ', 290), + 'gfx908': ('SQ', 290), + 'gfx940': ('SQ', 290), + 'gfx941': ('SQ', 290), + 'gfx942': ('SQ', 290), + 'gfx950': ('SQ', 290), + }, + 'SQC_DCACHE_REQ_READ_1': { + 'gfx90a': ('SQ', 323), + 'gfx908': ('SQ', 323), + 'gfx940': ('SQ', 323), + 'gfx941': ('SQ', 323), + 'gfx942': ('SQ', 323), + 'gfx950': ('SQ', 323), + }, + 'SQC_DCACHE_REQ_READ_16': { + 'gfx90a': ('SQ', 327), + 'gfx908': ('SQ', 327), + 'gfx940': ('SQ', 327), + 'gfx941': ('SQ', 327), + 'gfx942': ('SQ', 327), + 'gfx950': ('SQ', 327), + }, + 'SQC_DCACHE_REQ_READ_2': { + 'gfx90a': ('SQ', 324), + 'gfx908': ('SQ', 324), + 'gfx940': ('SQ', 324), + 'gfx941': ('SQ', 324), + 'gfx942': ('SQ', 324), + 'gfx950': ('SQ', 324), + }, + 'SQC_DCACHE_REQ_READ_4': { + 'gfx90a': ('SQ', 325), + 'gfx908': ('SQ', 325), + 'gfx940': ('SQ', 325), + 'gfx941': ('SQ', 325), + 'gfx942': ('SQ', 325), + 'gfx950': ('SQ', 325), + }, + 'SQC_DCACHE_REQ_READ_8': { + 'gfx90a': ('SQ', 326), + 'gfx908': ('SQ', 326), + 'gfx940': ('SQ', 326), + 'gfx941': ('SQ', 326), + 'gfx942': ('SQ', 326), + 'gfx950': ('SQ', 326), + }, + 'SQC_ICACHE_BUSY_CYCLES': { + 'gfx940': ('SQ', 269), + 'gfx941': ('SQ', 269), + 'gfx942': ('SQ', 269), + 'gfx950': ('SQ', 269), + }, + 'SQC_ICACHE_HITS': { + 'gfx90a': ('SQ', 271), + 'gfx908': ('SQ', 271), + 'gfx940': ('SQ', 271), + 'gfx941': ('SQ', 271), + 'gfx942': ('SQ', 271), + 'gfx950': ('SQ', 271), + 'gfx12': ('SQ', 302), + 'gfx1200': ('SQ', 302), + 'gfx1201': ('SQ', 302), + }, + 'SQC_ICACHE_INPUT_VALID_READYB': { + 'gfx940': ('SQ', 257), + 'gfx941': ('SQ', 257), + 'gfx942': ('SQ', 257), + 'gfx950': ('SQ', 257), + }, + 'SQC_ICACHE_MISSES': { + 'gfx90a': ('SQ', 272), + 'gfx908': ('SQ', 272), + 'gfx940': ('SQ', 272), + 'gfx941': ('SQ', 272), + 'gfx942': ('SQ', 272), + 'gfx950': ('SQ', 272), + 'gfx12': ('SQ', 303), + 'gfx1200': ('SQ', 303), + 'gfx1201': ('SQ', 303), + }, + 'SQC_ICACHE_MISSES_DUPLICATE': { + 'gfx90a': ('SQ', 273), + 'gfx908': ('SQ', 273), + 'gfx940': ('SQ', 273), + 'gfx941': ('SQ', 273), + 'gfx942': ('SQ', 273), + 'gfx950': ('SQ', 273), + }, + 'SQC_ICACHE_REQ': { + 'gfx90a': ('SQ', 270), + 'gfx908': ('SQ', 270), + 'gfx940': ('SQ', 270), + 'gfx941': ('SQ', 270), + 'gfx942': ('SQ', 270), + 'gfx950': ('SQ', 270), + 'gfx12': ('SQ', 301), + 'gfx1200': ('SQ', 301), + 'gfx1201': ('SQ', 301), + }, + 'SQC_LDS_BANK_CONFLICT': { + 'gfx10': ('SQ', 285), + 'gfx1010': ('SQ', 285), + 'gfx1030': ('SQ', 285), + 'gfx1031': ('SQ', 285), + 'gfx1032': ('SQ', 285), + 'gfx11': ('SQ', 256), + 'gfx1100': ('SQ', 256), + 'gfx1101': ('SQ', 256), + 'gfx1102': ('SQ', 256), + 'gfx12': ('SQ', 288), + 'gfx1200': ('SQ', 288), + 'gfx1201': ('SQ', 288), + }, + 'SQC_LDS_IDX_ACTIVE': { + 'gfx10': ('SQ', 290), + 'gfx1010': ('SQ', 290), + 'gfx1030': ('SQ', 290), + 'gfx1031': ('SQ', 290), + 'gfx1032': ('SQ', 290), + 'gfx11': ('SQ', 261), + 'gfx1100': ('SQ', 261), + 'gfx1101': ('SQ', 261), + 'gfx1102': ('SQ', 261), + 'gfx12': ('SQ', 293), + 'gfx1200': ('SQ', 293), + 'gfx1201': ('SQ', 293), + }, + 'SQC_TC_DATA_ATOMIC_REQ': { + 'gfx90a': ('SQ', 266), + 'gfx908': ('SQ', 266), + 'gfx940': ('SQ', 266), + 'gfx941': ('SQ', 266), + 'gfx942': ('SQ', 266), + 'gfx950': ('SQ', 266), + }, + 'SQC_TC_DATA_READ_REQ': { + 'gfx90a': ('SQ', 264), + 'gfx908': ('SQ', 264), + 'gfx940': ('SQ', 264), + 'gfx941': ('SQ', 264), + 'gfx942': ('SQ', 264), + 'gfx950': ('SQ', 264), + }, + 'SQC_TC_DATA_WRITE_REQ': { + 'gfx90a': ('SQ', 265), + 'gfx908': ('SQ', 265), + 'gfx940': ('SQ', 265), + 'gfx941': ('SQ', 265), + 'gfx942': ('SQ', 265), + 'gfx950': ('SQ', 265), + }, + 'SQC_TC_INST_REQ': { + 'gfx90a': ('SQ', 263), + 'gfx908': ('SQ', 263), + 'gfx940': ('SQ', 263), + 'gfx941': ('SQ', 263), + 'gfx942': ('SQ', 263), + 'gfx950': ('SQ', 263), + }, + 'SQC_TC_REQ': { + 'gfx90a': ('SQ', 262), + 'gfx908': ('SQ', 262), + 'gfx940': ('SQ', 262), + 'gfx941': ('SQ', 262), + 'gfx942': ('SQ', 262), + 'gfx950': ('SQ', 262), + }, + 'SQC_TC_STALL': { + 'gfx90a': ('SQ', 267), + 'gfx908': ('SQ', 267), + 'gfx940': ('SQ', 267), + 'gfx941': ('SQ', 267), + 'gfx942': ('SQ', 267), + 'gfx950': ('SQ', 267), + }, + 'SQ_ACCUM_PREV': { + 'gfx10': ('SQ', 1), + 'gfx1010': ('SQ', 1), + 'gfx1030': ('SQ', 1), + 'gfx1031': ('SQ', 1), + 'gfx1032': ('SQ', 1), + 'gfx11': ('SQ', 1), + 'gfx1100': ('SQ', 1), + 'gfx1101': ('SQ', 1), + 'gfx1102': ('SQ', 1), + 'gfx12': ('SQ', 1), + 'gfx1200': ('SQ', 1), + 'gfx1201': ('SQ', 1), + 'gfx90a': ('SQ', 1), + 'gfx908': ('SQ', 1), + 'gfx940': ('SQ', 1), + 'gfx941': ('SQ', 1), + 'gfx942': ('SQ', 1), + 'gfx950': ('SQ', 1), + }, + 'SQ_ACCUM_PREV_HIRES': { + 'gfx90a': ('SQ', 185), + 'gfx908': ('SQ', 158), + 'gfx940': ('SQ', 184), + 'gfx941': ('SQ', 184), + 'gfx942': ('SQ', 184), + 'gfx950': ('SQ', 200), + }, + 'SQ_ACTIVE_INST_ANY': { + 'gfx90a': ('SQ', 96), + 'gfx908': ('SQ', 69), + 'gfx940': ('SQ', 101), + 'gfx941': ('SQ', 101), + 'gfx942': ('SQ', 101), + 'gfx950': ('SQ', 117), + }, + 'SQ_ACTIVE_INST_EXP_GDS': { + 'gfx90a': ('SQ', 101), + 'gfx908': ('SQ', 74), + 'gfx940': ('SQ', 106), + 'gfx941': ('SQ', 106), + 'gfx942': ('SQ', 106), + 'gfx950': ('SQ', 122), + }, + 'SQ_ACTIVE_INST_FLAT': { + 'gfx90a': ('SQ', 103), + 'gfx908': ('SQ', 76), + 'gfx940': ('SQ', 108), + 'gfx941': ('SQ', 108), + 'gfx942': ('SQ', 108), + 'gfx950': ('SQ', 124), + }, + 'SQ_ACTIVE_INST_LDS': { + 'gfx90a': ('SQ', 98), + 'gfx908': ('SQ', 71), + 'gfx940': ('SQ', 103), + 'gfx941': ('SQ', 103), + 'gfx942': ('SQ', 103), + 'gfx950': ('SQ', 119), + }, + 'SQ_ACTIVE_INST_MISC': { + 'gfx90a': ('SQ', 102), + 'gfx908': ('SQ', 75), + 'gfx940': ('SQ', 107), + 'gfx941': ('SQ', 107), + 'gfx942': ('SQ', 107), + 'gfx950': ('SQ', 123), + }, + 'SQ_ACTIVE_INST_SCA': { + 'gfx90a': ('SQ', 100), + 'gfx908': ('SQ', 73), + 'gfx940': ('SQ', 105), + 'gfx941': ('SQ', 105), + 'gfx942': ('SQ', 105), + 'gfx950': ('SQ', 121), + }, + 'SQ_ACTIVE_INST_VALU': { + 'gfx9': ('SQ', 71), + 'gfx900': ('SQ', 71), + 'gfx906': ('SQ', 71), + 'gfx908': ('SQ', 72), + 'gfx90a': ('SQ', 99), + 'gfx940': ('SQ', 104), + 'gfx941': ('SQ', 104), + 'gfx942': ('SQ', 104), + 'gfx950': ('SQ', 120), + }, + 'SQ_ACTIVE_INST_VMEM': { + 'gfx90a': ('SQ', 97), + 'gfx908': ('SQ', 70), + 'gfx940': ('SQ', 102), + 'gfx941': ('SQ', 102), + 'gfx942': ('SQ', 102), + 'gfx950': ('SQ', 118), + }, + 'SQ_BUSY_CU_CYCLES': { + 'gfx90a': ('SQ', 13), + 'gfx908': ('SQ', 13), + 'gfx940': ('SQ', 13), + 'gfx941': ('SQ', 13), + 'gfx942': ('SQ', 13), + 'gfx950': ('SQ', 13), + }, + 'SQ_BUSY_CYCLES': { + 'gfx10': ('SQ', 3), + 'gfx1010': ('SQ', 3), + 'gfx1030': ('SQ', 3), + 'gfx1031': ('SQ', 3), + 'gfx1032': ('SQ', 3), + 'gfx11': ('SQ', 3), + 'gfx1100': ('SQ', 3), + 'gfx1101': ('SQ', 3), + 'gfx1102': ('SQ', 3), + 'gfx12': ('SQ', 3), + 'gfx1200': ('SQ', 3), + 'gfx1201': ('SQ', 3), + 'gfx90a': ('SQ', 3), + 'gfx908': ('SQ', 3), + 'gfx940': ('SQ', 3), + 'gfx941': ('SQ', 3), + 'gfx942': ('SQ', 3), + 'gfx950': ('SQ', 3), + }, + 'SQ_CYCLES': { + 'gfx90a': ('SQ', 2), + 'gfx908': ('SQ', 2), + 'gfx940': ('SQ', 2), + 'gfx941': ('SQ', 2), + 'gfx942': ('SQ', 2), + 'gfx950': ('SQ', 2), + }, + 'SQ_IFETCH': { + 'gfx90a': ('SQ', 115), + 'gfx908': ('SQ', 88), + 'gfx940': ('SQ', 120), + 'gfx941': ('SQ', 120), + 'gfx942': ('SQ', 120), + 'gfx950': ('SQ', 136), + }, + 'SQ_IFETCH_LEVEL': { + 'gfx90a': ('SQ', 116), + 'gfx908': ('SQ', 89), + 'gfx940': ('SQ', 121), + 'gfx941': ('SQ', 121), + 'gfx942': ('SQ', 121), + 'gfx950': ('SQ', 137), + }, + 'SQ_INSTS': { + 'gfx90a': ('SQ', 25), + 'gfx908': ('SQ', 25), + 'gfx940': ('SQ', 25), + 'gfx941': ('SQ', 25), + 'gfx942': ('SQ', 25), + 'gfx950': ('SQ', 25), + }, + 'SQ_INSTS_BRANCH': { + 'gfx90a': ('SQ', 64), + 'gfx908': ('SQ', 39), + 'gfx940': ('SQ', 69), + 'gfx941': ('SQ', 69), + 'gfx942': ('SQ', 69), + 'gfx950': ('SQ', 71), + }, + 'SQ_INSTS_EXP_GDS': { + 'gfx90a': ('SQ', 63), + 'gfx908': ('SQ', 38), + 'gfx940': ('SQ', 68), + 'gfx941': ('SQ', 68), + 'gfx942': ('SQ', 68), + 'gfx950': ('SQ', 70), + }, + 'SQ_INSTS_FLAT': { + 'gfx10': ('SQ', 57), + 'gfx1010': ('SQ', 57), + 'gfx1030': ('SQ', 57), + 'gfx1031': ('SQ', 57), + 'gfx1032': ('SQ', 57), + 'gfx9': ('SQ', 32), + 'gfx900': ('SQ', 32), + 'gfx906': ('SQ', 32), + 'gfx908': ('SQ', 33), + 'gfx90a': ('SQ', 58), + 'gfx940': ('SQ', 62), + 'gfx941': ('SQ', 62), + 'gfx942': ('SQ', 62), + 'gfx11': ('SQ', 56), + 'gfx1100': ('SQ', 56), + 'gfx1101': ('SQ', 56), + 'gfx1102': ('SQ', 56), + 'gfx12': ('SQ', 44), + 'gfx1200': ('SQ', 44), + 'gfx1201': ('SQ', 44), + 'gfx950': ('SQ', 64), + }, + 'SQ_INSTS_FLAT_LDS_ONLY': { + 'gfx9': ('SQ', 33), + 'gfx900': ('SQ', 33), + 'gfx906': ('SQ', 33), + 'gfx908': ('SQ', 34), + 'gfx90a': ('SQ', 59), + }, + 'SQ_INSTS_GDS': { + 'gfx10': ('SQ', 55), + 'gfx1010': ('SQ', 55), + 'gfx1030': ('SQ', 55), + 'gfx1031': ('SQ', 55), + 'gfx1032': ('SQ', 55), + 'gfx9': ('SQ', 35), + 'gfx900': ('SQ', 35), + 'gfx906': ('SQ', 35), + 'gfx908': ('SQ', 36), + 'gfx90a': ('SQ', 61), + 'gfx940': ('SQ', 66), + 'gfx941': ('SQ', 66), + 'gfx942': ('SQ', 66), + 'gfx11': ('SQ', 54), + 'gfx1100': ('SQ', 54), + 'gfx1101': ('SQ', 54), + 'gfx1102': ('SQ', 54), + 'gfx950': ('SQ', 68), + }, + 'SQ_INSTS_LDS': { + 'gfx10': ('SQ', 59), + 'gfx1010': ('SQ', 59), + 'gfx1030': ('SQ', 59), + 'gfx1031': ('SQ', 59), + 'gfx1032': ('SQ', 59), + 'gfx9': ('SQ', 34), + 'gfx900': ('SQ', 34), + 'gfx906': ('SQ', 34), + 'gfx908': ('SQ', 35), + 'gfx90a': ('SQ', 60), + 'gfx940': ('SQ', 65), + 'gfx941': ('SQ', 65), + 'gfx942': ('SQ', 65), + 'gfx11': ('SQ', 57), + 'gfx1100': ('SQ', 57), + 'gfx1101': ('SQ', 57), + 'gfx1102': ('SQ', 57), + 'gfx12': ('SQ', 45), + 'gfx1200': ('SQ', 45), + 'gfx1201': ('SQ', 45), + 'gfx950': ('SQ', 67), + }, + 'SQ_INSTS_MFMA': { + 'gfx90a': ('SQ', 52), + 'gfx908': ('SQ', 27), + 'gfx940': ('SQ', 56), + 'gfx941': ('SQ', 56), + 'gfx942': ('SQ', 56), + 'gfx950': ('SQ', 58), + }, + 'SQ_INSTS_SALU': { + 'gfx9': ('SQ', 30), + 'gfx900': ('SQ', 30), + 'gfx906': ('SQ', 30), + 'gfx908': ('SQ', 31), + 'gfx90a': ('SQ', 56), + 'gfx10': ('SQ', 60), + 'gfx1010': ('SQ', 60), + 'gfx1030': ('SQ', 60), + 'gfx1031': ('SQ', 60), + 'gfx1032': ('SQ', 60), + 'gfx940': ('SQ', 60), + 'gfx941': ('SQ', 60), + 'gfx942': ('SQ', 60), + 'gfx11': ('SQ', 58), + 'gfx1100': ('SQ', 58), + 'gfx1101': ('SQ', 58), + 'gfx1102': ('SQ', 58), + 'gfx12': ('SQ', 46), + 'gfx1200': ('SQ', 46), + 'gfx1201': ('SQ', 46), + 'gfx950': ('SQ', 62), + }, + 'SQ_INSTS_SENDMSG': { + 'gfx90a': ('SQ', 65), + 'gfx908': ('SQ', 40), + 'gfx940': ('SQ', 70), + 'gfx941': ('SQ', 70), + 'gfx942': ('SQ', 70), + 'gfx950': ('SQ', 72), + }, + 'SQ_INSTS_SMEM': { + 'gfx9': ('SQ', 31), + 'gfx900': ('SQ', 31), + 'gfx906': ('SQ', 31), + 'gfx908': ('SQ', 32), + 'gfx90a': ('SQ', 57), + 'gfx10': ('SQ', 61), + 'gfx1010': ('SQ', 61), + 'gfx1030': ('SQ', 61), + 'gfx1031': ('SQ', 61), + 'gfx1032': ('SQ', 61), + 'gfx940': ('SQ', 61), + 'gfx941': ('SQ', 61), + 'gfx942': ('SQ', 61), + 'gfx11': ('SQ', 59), + 'gfx1100': ('SQ', 59), + 'gfx1101': ('SQ', 59), + 'gfx1102': ('SQ', 59), + 'gfx12': ('SQ', 47), + 'gfx1200': ('SQ', 47), + 'gfx1201': ('SQ', 47), + 'gfx950': ('SQ', 63), + }, + 'SQ_INSTS_SMEM_NORM': { + 'gfx90a': ('SQ', 188), + 'gfx908': ('SQ', 161), + 'gfx940': ('SQ', 187), + 'gfx941': ('SQ', 187), + 'gfx942': ('SQ', 187), + 'gfx950': ('SQ', 203), + }, + 'SQ_INSTS_TEX_LOAD': { + 'gfx11': ('SQ', 66), + 'gfx1100': ('SQ', 66), + 'gfx1101': ('SQ', 66), + 'gfx1102': ('SQ', 66), + 'gfx12': ('SQ', 54), + 'gfx1200': ('SQ', 54), + 'gfx1201': ('SQ', 54), + }, + 'SQ_INSTS_TEX_STORE': { + 'gfx11': ('SQ', 67), + 'gfx1100': ('SQ', 67), + 'gfx1101': ('SQ', 67), + 'gfx1102': ('SQ', 67), + 'gfx12': ('SQ', 55), + 'gfx1200': ('SQ', 55), + 'gfx1201': ('SQ', 55), + }, + 'SQ_INSTS_VALU': { + 'gfx10': ('SQ', 64), + 'gfx1010': ('SQ', 64), + 'gfx1030': ('SQ', 64), + 'gfx1031': ('SQ', 64), + 'gfx1032': ('SQ', 64), + 'gfx9': ('SQ', 26), + 'gfx900': ('SQ', 26), + 'gfx906': ('SQ', 26), + 'gfx908': ('SQ', 26), + 'gfx90a': ('SQ', 26), + 'gfx940': ('SQ', 26), + 'gfx941': ('SQ', 26), + 'gfx942': ('SQ', 26), + 'gfx950': ('SQ', 26), + 'gfx11': ('SQ', 62), + 'gfx1100': ('SQ', 62), + 'gfx1101': ('SQ', 62), + 'gfx1102': ('SQ', 62), + 'gfx12': ('SQ', 50), + 'gfx1200': ('SQ', 50), + 'gfx1201': ('SQ', 50), + }, + 'SQ_INSTS_VALU_ADD_F16': { + 'gfx90a': ('SQ', 27), + 'gfx940': ('SQ', 27), + 'gfx941': ('SQ', 27), + 'gfx942': ('SQ', 27), + 'gfx950': ('SQ', 27), + }, + 'SQ_INSTS_VALU_ADD_F32': { + 'gfx90a': ('SQ', 31), + 'gfx940': ('SQ', 31), + 'gfx941': ('SQ', 31), + 'gfx942': ('SQ', 31), + 'gfx950': ('SQ', 31), + }, + 'SQ_INSTS_VALU_ADD_F64': { + 'gfx90a': ('SQ', 35), + 'gfx940': ('SQ', 35), + 'gfx941': ('SQ', 35), + 'gfx942': ('SQ', 35), + 'gfx950': ('SQ', 35), + }, + 'SQ_INSTS_VALU_CVT': { + 'gfx90a': ('SQ', 41), + 'gfx940': ('SQ', 41), + 'gfx941': ('SQ', 41), + 'gfx942': ('SQ', 41), + 'gfx950': ('SQ', 41), + }, + 'SQ_INSTS_VALU_FMA_F16': { + 'gfx90a': ('SQ', 29), + 'gfx940': ('SQ', 29), + 'gfx941': ('SQ', 29), + 'gfx942': ('SQ', 29), + 'gfx950': ('SQ', 29), + }, + 'SQ_INSTS_VALU_FMA_F32': { + 'gfx90a': ('SQ', 33), + 'gfx940': ('SQ', 33), + 'gfx941': ('SQ', 33), + 'gfx942': ('SQ', 33), + 'gfx950': ('SQ', 33), + }, + 'SQ_INSTS_VALU_FMA_F64': { + 'gfx90a': ('SQ', 37), + 'gfx940': ('SQ', 37), + 'gfx941': ('SQ', 37), + 'gfx942': ('SQ', 37), + 'gfx950': ('SQ', 37), + }, + 'SQ_INSTS_VALU_INT32': { + 'gfx90a': ('SQ', 39), + 'gfx940': ('SQ', 39), + 'gfx941': ('SQ', 39), + 'gfx942': ('SQ', 39), + 'gfx950': ('SQ', 39), + }, + 'SQ_INSTS_VALU_INT64': { + 'gfx90a': ('SQ', 40), + 'gfx940': ('SQ', 40), + 'gfx941': ('SQ', 40), + 'gfx942': ('SQ', 40), + 'gfx950': ('SQ', 40), + }, + 'SQ_INSTS_VALU_MFMA_BF16': { + 'gfx90a': ('SQ', 44), + 'gfx940': ('SQ', 44), + 'gfx941': ('SQ', 44), + 'gfx942': ('SQ', 44), + 'gfx950': ('SQ', 44), + }, + 'SQ_INSTS_VALU_MFMA_F16': { + 'gfx90a': ('SQ', 43), + 'gfx940': ('SQ', 43), + 'gfx941': ('SQ', 43), + 'gfx942': ('SQ', 43), + 'gfx950': ('SQ', 43), + }, + 'SQ_INSTS_VALU_MFMA_F32': { + 'gfx90a': ('SQ', 45), + 'gfx940': ('SQ', 45), + 'gfx941': ('SQ', 45), + 'gfx942': ('SQ', 45), + 'gfx950': ('SQ', 45), + }, + 'SQ_INSTS_VALU_MFMA_F64': { + 'gfx90a': ('SQ', 46), + 'gfx940': ('SQ', 46), + 'gfx941': ('SQ', 46), + 'gfx942': ('SQ', 46), + 'gfx950': ('SQ', 46), + }, + 'SQ_INSTS_VALU_MFMA_I8': { + 'gfx90a': ('SQ', 42), + 'gfx940': ('SQ', 42), + 'gfx941': ('SQ', 42), + 'gfx942': ('SQ', 42), + 'gfx950': ('SQ', 42), + }, + 'SQ_INSTS_VALU_MFMA_F8': { + 'gfx940': ('SQ', 48), + 'gfx941': ('SQ', 48), + 'gfx942': ('SQ', 48), + 'gfx950': ('SQ', 48), + }, + 'SQ_INSTS_VALU_MFMA_XF32': { + 'gfx950': ('SQ', 47), + }, + 'SQ_INSTS_VALU_MFMA_MOPS_BF16': { + 'gfx90a': ('SQ', 49), + 'gfx940': ('SQ', 51), + 'gfx941': ('SQ', 51), + 'gfx942': ('SQ', 51), + 'gfx950': ('SQ', 52), + }, + 'SQ_INSTS_VALU_MFMA_MOPS_F16': { + 'gfx90a': ('SQ', 48), + 'gfx940': ('SQ', 50), + 'gfx941': ('SQ', 50), + 'gfx942': ('SQ', 50), + 'gfx950': ('SQ', 51), + }, + 'SQ_INSTS_VALU_MFMA_MOPS_F32': { + 'gfx90a': ('SQ', 50), + 'gfx940': ('SQ', 52), + 'gfx941': ('SQ', 52), + 'gfx942': ('SQ', 52), + 'gfx950': ('SQ', 53), + }, + 'SQ_INSTS_VALU_MFMA_MOPS_F64': { + 'gfx90a': ('SQ', 51), + 'gfx940': ('SQ', 53), + 'gfx941': ('SQ', 53), + 'gfx942': ('SQ', 53), + 'gfx950': ('SQ', 54), + }, + 'SQ_INSTS_VALU_MFMA_MOPS_I8': { + 'gfx90a': ('SQ', 47), + 'gfx940': ('SQ', 49), + 'gfx941': ('SQ', 49), + 'gfx942': ('SQ', 49), + 'gfx950': ('SQ', 50), + }, + 'SQ_INSTS_VALU_MFMA_MOPS_F8': { + 'gfx940': ('SQ', 55), + 'gfx941': ('SQ', 55), + 'gfx942': ('SQ', 55), + 'gfx950': ('SQ', 56), + }, + 'SQ_INSTS_VALU_MFMA_MOPS_XF32': { + 'gfx950': ('SQ', 55), + }, + 'SQ_VALU_MFMA_COEXEC_CYCLES': { + 'gfx950': ('SQ', 94), + }, + 'SQ_INSTS_VALU_MUL_F16': { + 'gfx90a': ('SQ', 28), + 'gfx940': ('SQ', 28), + 'gfx941': ('SQ', 28), + 'gfx942': ('SQ', 28), + 'gfx950': ('SQ', 28), + }, + 'SQ_INSTS_VALU_MUL_F32': { + 'gfx90a': ('SQ', 32), + 'gfx940': ('SQ', 32), + 'gfx941': ('SQ', 32), + 'gfx942': ('SQ', 32), + 'gfx950': ('SQ', 32), + }, + 'SQ_INSTS_VALU_MUL_F64': { + 'gfx90a': ('SQ', 36), + 'gfx940': ('SQ', 36), + 'gfx941': ('SQ', 36), + 'gfx942': ('SQ', 36), + 'gfx950': ('SQ', 36), + }, + 'SQ_INSTS_VALU_TRANS_F16': { + 'gfx90a': ('SQ', 30), + 'gfx940': ('SQ', 30), + 'gfx941': ('SQ', 30), + 'gfx942': ('SQ', 30), + 'gfx950': ('SQ', 30), + }, + 'SQ_INSTS_VALU_TRANS_F32': { + 'gfx90a': ('SQ', 34), + 'gfx940': ('SQ', 34), + 'gfx941': ('SQ', 34), + 'gfx942': ('SQ', 34), + 'gfx950': ('SQ', 34), + }, + 'SQ_INSTS_VALU_TRANS_F64': { + 'gfx90a': ('SQ', 38), + 'gfx940': ('SQ', 38), + 'gfx941': ('SQ', 38), + 'gfx942': ('SQ', 38), + 'gfx950': ('SQ', 38), + }, + 'SQ_INSTS_VMEM': { + 'gfx90a': ('SQ', 55), + 'gfx908': ('SQ', 30), + 'gfx940': ('SQ', 59), + 'gfx941': ('SQ', 59), + 'gfx942': ('SQ', 59), + 'gfx950': ('SQ', 61), + }, + 'SQ_INSTS_VMEM_RD': { + 'gfx9': ('SQ', 28), + 'gfx900': ('SQ', 28), + 'gfx906': ('SQ', 28), + 'gfx908': ('SQ', 29), + 'gfx90a': ('SQ', 54), + 'gfx940': ('SQ', 58), + 'gfx941': ('SQ', 58), + 'gfx942': ('SQ', 58), + 'gfx950': ('SQ', 60), + }, + 'SQ_INSTS_VMEM_WR': { + 'gfx9': ('SQ', 27), + 'gfx900': ('SQ', 27), + 'gfx906': ('SQ', 27), + 'gfx908': ('SQ', 28), + 'gfx90a': ('SQ', 53), + 'gfx940': ('SQ', 57), + 'gfx941': ('SQ', 57), + 'gfx942': ('SQ', 57), + 'gfx950': ('SQ', 59), + }, + 'SQ_INSTS_VSKIPPED': { + 'gfx90a': ('SQ', 66), + 'gfx908': ('SQ', 41), + 'gfx940': ('SQ', 71), + 'gfx941': ('SQ', 71), + 'gfx942': ('SQ', 71), + 'gfx950': ('SQ', 73), + }, + 'SQ_INSTS_WAVE32': { + 'gfx10': ('SQ', 71), + 'gfx1010': ('SQ', 71), + 'gfx1030': ('SQ', 71), + 'gfx1031': ('SQ', 71), + 'gfx1032': ('SQ', 71), + 'gfx11': ('SQ', 70), + 'gfx1100': ('SQ', 70), + 'gfx1101': ('SQ', 70), + 'gfx1102': ('SQ', 70), + 'gfx12': ('SQ', 58), + 'gfx1200': ('SQ', 58), + 'gfx1201': ('SQ', 58), + }, + 'SQ_INSTS_WAVE32_LDS': { + 'gfx10': ('SQ', 74), + 'gfx1010': ('SQ', 74), + 'gfx1030': ('SQ', 74), + 'gfx1031': ('SQ', 74), + 'gfx1032': ('SQ', 74), + 'gfx11': ('SQ', 72), + 'gfx1100': ('SQ', 72), + 'gfx1101': ('SQ', 72), + 'gfx1102': ('SQ', 72), + 'gfx12': ('SQ', 60), + 'gfx1200': ('SQ', 60), + 'gfx1201': ('SQ', 60), + }, + 'SQ_INSTS_WAVE32_VALU': { + 'gfx10': ('SQ', 75), + 'gfx1010': ('SQ', 75), + 'gfx1030': ('SQ', 75), + 'gfx1031': ('SQ', 75), + 'gfx1032': ('SQ', 75), + 'gfx11': ('SQ', 73), + 'gfx1100': ('SQ', 73), + 'gfx1101': ('SQ', 73), + 'gfx1102': ('SQ', 73), + 'gfx12': ('SQ', 61), + 'gfx1200': ('SQ', 61), + 'gfx1201': ('SQ', 61), + }, + 'SQ_INST_CYCLES_VALU': { + 'gfx12': ('SQ', 99), + 'gfx1200': ('SQ', 99), + 'gfx1201': ('SQ', 99), + }, + 'SQ_INST_CYCLES_SALU': { + 'gfx9': ('SQ', 84), + 'gfx900': ('SQ', 84), + 'gfx906': ('SQ', 84), + 'gfx908': ('SQ', 85), + 'gfx90a': ('SQ', 112), + 'gfx940': ('SQ', 117), + 'gfx941': ('SQ', 117), + 'gfx942': ('SQ', 117), + 'gfx950': ('SQ', 133), + }, + 'SQ_INST_CYCLES_SMEM': { + 'gfx90a': ('SQ', 111), + 'gfx908': ('SQ', 84), + 'gfx940': ('SQ', 116), + 'gfx941': ('SQ', 116), + 'gfx942': ('SQ', 116), + 'gfx950': ('SQ', 132), + }, + 'SQ_INST_CYCLES_VMEM': { + 'gfx10': ('SQ', 120), + 'gfx1010': ('SQ', 120), + 'gfx1030': ('SQ', 120), + 'gfx1031': ('SQ', 120), + 'gfx1032': ('SQ', 120), + 'gfx11': ('SQ', 106), + 'gfx1100': ('SQ', 106), + 'gfx1101': ('SQ', 106), + 'gfx1102': ('SQ', 106), + 'gfx12': ('SQ', 102), + 'gfx1200': ('SQ', 102), + 'gfx1201': ('SQ', 102), + }, + 'SQ_INST_CYCLES_VMEM_RD': { + 'gfx90a': ('SQ', 105), + 'gfx908': ('SQ', 78), + 'gfx940': ('SQ', 110), + 'gfx941': ('SQ', 110), + 'gfx942': ('SQ', 110), + 'gfx950': ('SQ', 126), + }, + 'SQ_INST_CYCLES_VMEM_WR': { + 'gfx90a': ('SQ', 104), + 'gfx908': ('SQ', 77), + 'gfx940': ('SQ', 109), + 'gfx941': ('SQ', 109), + 'gfx942': ('SQ', 109), + 'gfx950': ('SQ', 125), + }, + 'SQ_INST_LEVEL_GDS': { + 'gfx10': ('SQ', 98), + 'gfx1010': ('SQ', 98), + 'gfx1030': ('SQ', 98), + 'gfx1031': ('SQ', 98), + 'gfx1032': ('SQ', 98), + 'gfx11': ('SQ', 87), + 'gfx1100': ('SQ', 87), + 'gfx1101': ('SQ', 87), + 'gfx1102': ('SQ', 87), + }, + 'SQ_INST_LEVEL_LDS': { + 'gfx10': ('SQ', 99), + 'gfx1010': ('SQ', 99), + 'gfx1030': ('SQ', 99), + 'gfx1031': ('SQ', 99), + 'gfx1032': ('SQ', 99), + 'gfx90a': ('SQ', 69), + 'gfx908': ('SQ', 44), + 'gfx940': ('SQ', 74), + 'gfx941': ('SQ', 74), + 'gfx942': ('SQ', 74), + 'gfx11': ('SQ', 88), + 'gfx1100': ('SQ', 88), + 'gfx1101': ('SQ', 88), + 'gfx1102': ('SQ', 88), + 'gfx12': ('SQ', 75), + 'gfx1200': ('SQ', 75), + 'gfx1201': ('SQ', 75), + 'gfx950': ('SQ', 90), + }, + 'SQ_INST_LEVEL_SMEM': { + 'gfx90a': ('SQ', 68), + 'gfx908': ('SQ', 43), + 'gfx940': ('SQ', 73), + 'gfx941': ('SQ', 73), + 'gfx942': ('SQ', 73), + 'gfx950': ('SQ', 89), + }, + 'SQ_INST_LEVEL_VMEM': { + 'gfx90a': ('SQ', 67), + 'gfx908': ('SQ', 42), + 'gfx940': ('SQ', 72), + 'gfx941': ('SQ', 72), + 'gfx942': ('SQ', 72), + 'gfx950': ('SQ', 88), + }, + 'SQ_ITEMS': { + 'gfx90a': ('SQ', 14), + 'gfx908': ('SQ', 14), + 'gfx940': ('SQ', 14), + 'gfx941': ('SQ', 14), + 'gfx942': ('SQ', 14), + 'gfx950': ('SQ', 14), + }, + 'SQ_LDS_ADDR_CONFLICT': { + 'gfx90a': ('SQ', 122), + 'gfx908': ('SQ', 95), + 'gfx940': ('SQ', 127), + 'gfx941': ('SQ', 127), + 'gfx942': ('SQ', 127), + 'gfx950': ('SQ', 143), + }, + 'SQ_LDS_ATOMIC_RETURN': { + 'gfx90a': ('SQ', 125), + 'gfx908': ('SQ', 98), + 'gfx940': ('SQ', 130), + 'gfx941': ('SQ', 130), + 'gfx942': ('SQ', 130), + 'gfx950': ('SQ', 146), + }, + 'SQ_LDS_BANK_CONFLICT': { + 'gfx9': ('SQ', 93), + 'gfx900': ('SQ', 93), + 'gfx906': ('SQ', 93), + 'gfx908': ('SQ', 94), + 'gfx90a': ('SQ', 121), + 'gfx940': ('SQ', 126), + 'gfx941': ('SQ', 126), + 'gfx942': ('SQ', 126), + 'gfx950': ('SQ', 142), + }, + 'SQ_LDS_IDX_ACTIVE': { + 'gfx90a': ('SQ', 126), + 'gfx908': ('SQ', 99), + 'gfx940': ('SQ', 131), + 'gfx941': ('SQ', 131), + 'gfx942': ('SQ', 131), + 'gfx950': ('SQ', 147), + }, + 'SQ_LDS_MEM_VIOLATIONS': { + 'gfx90a': ('SQ', 124), + 'gfx908': ('SQ', 97), + 'gfx940': ('SQ', 129), + 'gfx941': ('SQ', 129), + 'gfx942': ('SQ', 129), + 'gfx950': ('SQ', 145), + }, + 'SQ_LDS_UNALIGNED_STALL': { + 'gfx90a': ('SQ', 123), + 'gfx908': ('SQ', 96), + 'gfx940': ('SQ', 128), + 'gfx941': ('SQ', 128), + 'gfx942': ('SQ', 128), + 'gfx950': ('SQ', 144), + }, + 'SQ_LEVEL_WAVES': { + 'gfx10': ('SQ', 7), + 'gfx1010': ('SQ', 7), + 'gfx1030': ('SQ', 7), + 'gfx1031': ('SQ', 7), + 'gfx1032': ('SQ', 7), + 'gfx90a': ('SQ', 5), + 'gfx908': ('SQ', 5), + 'gfx940': ('SQ', 5), + 'gfx941': ('SQ', 5), + 'gfx942': ('SQ', 5), + 'gfx950': ('SQ', 5), + }, + 'SQ_THREAD_CYCLES_VALU': { + 'gfx9': ('SQ', 85), + 'gfx900': ('SQ', 85), + 'gfx906': ('SQ', 85), + 'gfx908': ('SQ', 86), + 'gfx90a': ('SQ', 113), + 'gfx940': ('SQ', 118), + 'gfx941': ('SQ', 118), + 'gfx942': ('SQ', 118), + 'gfx950': ('SQ', 134), + }, + 'SQ_VALU_MFMA_BUSY_CYCLES': { + 'gfx90a': ('SQ', 72), + 'gfx940': ('SQ', 77), + 'gfx941': ('SQ', 77), + 'gfx942': ('SQ', 77), + 'gfx950': ('SQ', 93), + }, + 'SQ_WAIT_ANY': { + 'gfx10': ('SQ', 37), + 'gfx1010': ('SQ', 37), + 'gfx1030': ('SQ', 37), + 'gfx1031': ('SQ', 37), + 'gfx1032': ('SQ', 37), + 'gfx90a': ('SQ', 85), + 'gfx908': ('SQ', 58), + 'gfx940': ('SQ', 90), + 'gfx941': ('SQ', 90), + 'gfx942': ('SQ', 90), + 'gfx11': ('SQ', 35), + 'gfx1100': ('SQ', 35), + 'gfx1101': ('SQ', 35), + 'gfx1102': ('SQ', 35), + 'gfx12': ('SQ', 27), + 'gfx1200': ('SQ', 27), + 'gfx1201': ('SQ', 27), + 'gfx950': ('SQ', 106), + }, + 'SQ_WAIT_INST_ANY': { + 'gfx10': ('SQ', 28), + 'gfx1010': ('SQ', 28), + 'gfx1030': ('SQ', 28), + 'gfx1031': ('SQ', 28), + 'gfx1032': ('SQ', 28), + 'gfx90a': ('SQ', 88), + 'gfx908': ('SQ', 61), + 'gfx940': ('SQ', 93), + 'gfx941': ('SQ', 93), + 'gfx942': ('SQ', 93), + 'gfx11': ('SQ', 26), + 'gfx1100': ('SQ', 26), + 'gfx1101': ('SQ', 26), + 'gfx1102': ('SQ', 26), + 'gfx12': ('SQ', 26), + 'gfx1200': ('SQ', 26), + 'gfx1201': ('SQ', 26), + 'gfx950': ('SQ', 109), + }, + 'SQ_WAIT_INST_LDS': { + 'gfx10': ('SQ', 31), + 'gfx1010': ('SQ', 31), + 'gfx1030': ('SQ', 31), + 'gfx1031': ('SQ', 31), + 'gfx1032': ('SQ', 31), + 'gfx9': ('SQ', 63), + 'gfx900': ('SQ', 63), + 'gfx906': ('SQ', 63), + 'gfx908': ('SQ', 64), + 'gfx90a': ('SQ', 91), + 'gfx940': ('SQ', 96), + 'gfx941': ('SQ', 96), + 'gfx942': ('SQ', 96), + 'gfx11': ('SQ', 29), + 'gfx1100': ('SQ', 29), + 'gfx1101': ('SQ', 29), + 'gfx1102': ('SQ', 29), + 'gfx950': ('SQ', 112), + }, + 'SQ_WAVE32_INSTS': { + 'gfx10': ('SQ', 84), + 'gfx1010': ('SQ', 84), + 'gfx1030': ('SQ', 84), + 'gfx1031': ('SQ', 84), + 'gfx1032': ('SQ', 84), + 'gfx11': ('SQ', 82), + 'gfx1100': ('SQ', 82), + 'gfx1101': ('SQ', 82), + 'gfx1102': ('SQ', 82), + 'gfx12': ('SQ', 70), + 'gfx1200': ('SQ', 70), + 'gfx1201': ('SQ', 70), + }, + 'SQ_WAVE64_INSTS': { + 'gfx10': ('SQ', 85), + 'gfx1010': ('SQ', 85), + 'gfx1030': ('SQ', 85), + 'gfx1031': ('SQ', 85), + 'gfx1032': ('SQ', 85), + 'gfx11': ('SQ', 83), + 'gfx1100': ('SQ', 83), + 'gfx1101': ('SQ', 83), + 'gfx1102': ('SQ', 83), + 'gfx12': ('SQ', 71), + 'gfx1200': ('SQ', 71), + 'gfx1201': ('SQ', 71), + }, + 'SQ_WAVES': { + 'gfx10': ('SQ', 4), + 'gfx1010': ('SQ', 4), + 'gfx1030': ('SQ', 4), + 'gfx1031': ('SQ', 4), + 'gfx1032': ('SQ', 4), + 'gfx11': ('SQ', 4), + 'gfx1100': ('SQ', 4), + 'gfx1101': ('SQ', 4), + 'gfx1102': ('SQ', 4), + 'gfx12': ('SQ', 4), + 'gfx1200': ('SQ', 4), + 'gfx1201': ('SQ', 4), + 'gfx9': ('SQ', 4), + 'gfx900': ('SQ', 4), + 'gfx906': ('SQ', 4), + 'gfx908': ('SQ', 4), + 'gfx90a': ('SQ', 4), + 'gfx940': ('SQ', 4), + 'gfx941': ('SQ', 4), + 'gfx942': ('SQ', 4), + 'gfx950': ('SQ', 4), + }, + 'SQ_WAVES_EQ_64': { + 'gfx90a': ('SQ', 6), + 'gfx908': ('SQ', 6), + 'gfx940': ('SQ', 6), + 'gfx941': ('SQ', 6), + 'gfx942': ('SQ', 6), + 'gfx950': ('SQ', 6), + }, + 'SQ_WAVES_LT_16': { + 'gfx90a': ('SQ', 10), + 'gfx908': ('SQ', 10), + 'gfx940': ('SQ', 10), + 'gfx941': ('SQ', 10), + 'gfx942': ('SQ', 10), + 'gfx950': ('SQ', 10), + }, + 'SQ_WAVES_LT_32': { + 'gfx90a': ('SQ', 9), + 'gfx908': ('SQ', 9), + 'gfx940': ('SQ', 9), + 'gfx941': ('SQ', 9), + 'gfx942': ('SQ', 9), + 'gfx950': ('SQ', 9), + }, + 'SQ_WAVES_LT_48': { + 'gfx90a': ('SQ', 8), + 'gfx908': ('SQ', 8), + 'gfx940': ('SQ', 8), + 'gfx941': ('SQ', 8), + 'gfx942': ('SQ', 8), + 'gfx950': ('SQ', 8), + }, + 'SQ_WAVES_LT_64': { + 'gfx90a': ('SQ', 7), + 'gfx908': ('SQ', 7), + 'gfx940': ('SQ', 7), + 'gfx941': ('SQ', 7), + 'gfx942': ('SQ', 7), + 'gfx950': ('SQ', 7), + }, + 'SQ_WAVES_RESTORED': { + 'gfx90a': ('SQ', 186), + 'gfx908': ('SQ', 159), + 'gfx940': ('SQ', 185), + 'gfx941': ('SQ', 185), + 'gfx942': ('SQ', 185), + 'gfx950': ('SQ', 201), + }, + 'SQ_WAVES_SAVED': { + 'gfx90a': ('SQ', 187), + 'gfx908': ('SQ', 160), + 'gfx940': ('SQ', 186), + 'gfx941': ('SQ', 186), + 'gfx942': ('SQ', 186), + 'gfx950': ('SQ', 202), + }, + 'SQ_WAVE_CYCLES': { + 'gfx10': ('SQ', 26), + 'gfx1010': ('SQ', 26), + 'gfx1030': ('SQ', 26), + 'gfx1031': ('SQ', 26), + 'gfx1032': ('SQ', 26), + 'gfx90a': ('SQ', 74), + 'gfx908': ('SQ', 47), + 'gfx940': ('SQ', 79), + 'gfx941': ('SQ', 79), + 'gfx942': ('SQ', 79), + 'gfx11': ('SQ', 24), + 'gfx1100': ('SQ', 24), + 'gfx1101': ('SQ', 24), + 'gfx1102': ('SQ', 24), + 'gfx12': ('SQ', 24), + 'gfx1200': ('SQ', 24), + 'gfx1201': ('SQ', 24), + 'gfx950': ('SQ', 95), + }, + 'SQ_INSTS_VEC32_LEVEL_LDS': { + 'gfx12': ('SQ', 250), + 'gfx1200': ('SQ', 250), + 'gfx1201': ('SQ', 250), + }, + 'SQ_INSTS_VALU_FLOPS_FP16': { + 'gfx950': ('SQ', 81), + }, + 'SQ_INSTS_VALU_FLOPS_FP32': { + 'gfx950': ('SQ', 82), + }, + 'SQ_INSTS_VALU_FLOPS_FP64': { + 'gfx950': ('SQ', 83), + }, + 'SQ_INSTS_VALU_FLOPS_FP16_TRANS': { + 'gfx950': ('SQ', 84), + }, + 'SQ_INSTS_VALU_FLOPS_FP32_TRANS': { + 'gfx950': ('SQ', 85), + }, + 'SQ_INSTS_VALU_FLOPS_FP64_TRANS': { + 'gfx950': ('SQ', 86), + }, + 'SQ_INSTS_VALU_MFMA_F6F4': { + 'gfx950': ('SQ', 49), + }, + 'SQ_INSTS_VALU_MFMA_MOPS_F6F4': { + 'gfx950': ('SQ', 57), + }, + 'SQ_ACTIVE_INST_VALU2': { + 'gfx950': ('SQ', 74), + }, + 'SQ_INSTS_LDS_LOAD': { + 'gfx950': ('SQ', 75), + }, + 'SQ_INSTS_LDS_STORE': { + 'gfx950': ('SQ', 76), + }, + 'SQ_INSTS_LDS_ATOMIC': { + 'gfx950': ('SQ', 77), + }, + 'SQ_INSTS_LDS_LOAD_BANDWIDTH': { + 'gfx950': ('SQ', 78), + }, + 'SQ_INSTS_LDS_STORE_BANDWIDTH': { + 'gfx950': ('SQ', 79), + }, + 'SQ_INSTS_LDS_ATOMIC_BANDWIDTH': { + 'gfx950': ('SQ', 80), + }, + 'SQ_INSTS_VALU_IOPS': { + 'gfx950': ('SQ', 87), + }, + 'SQ_LDS_DATA_FIFO_FULL': { + 'gfx950': ('SQ', 152), + }, + 'SQ_LDS_CMD_FIFO_FULL': { + 'gfx950': ('SQ', 153), + }, + 'SQ_VMEM_TA_ADDR_FIFO_FULL': { + 'gfx90a': ('SQ', 133), + 'gfx942': ('SQ', 138), + 'gfx950': ('SQ', 154), + }, + 'SQ_VMEM_TA_CMD_FIFO_FULL': { + 'gfx90a': ('SQ', 134), + 'gfx942': ('SQ', 139), + 'gfx950': ('SQ', 155), + }, + 'SQ_VMEM_WR_TA_DATA_FIFO_FULL': { + 'gfx90a': ('SQ', 136), + 'gfx942': ('SQ', 141), + 'gfx950': ('SQ', 157), + }, + 'SQ_INSTS_FLAT_FLATSEG': { + 'gfx950': ('SQ', 65), + }, + 'SQ_INSTS_FLAT_NO_LDS': { + 'gfx950': ('SQ', 66), + }, + 'SQ_INSTS_EXP': { + 'gfx950': ('SQ', 69), + }, + 'SQ_EVENTS': { + 'gfx950': ('SQ', 16), + }, + 'TA_ADDR_STALLED_BY_TC_CYCLES': { + 'gfx90a': ('TA', 54), + 'gfx908': ('TA', 54), + 'gfx940': ('TA', 42), + 'gfx941': ('TA', 42), + 'gfx942': ('TA', 42), + 'gfx950': ('TA', 42), + }, + 'TA_ADDR_STALLED_BY_TD_CYCLES': { + 'gfx90a': ('TA', 55), + 'gfx908': ('TA', 55), + 'gfx940': ('TA', 43), + 'gfx941': ('TA', 43), + 'gfx942': ('TA', 43), + 'gfx950': ('TA', 43), + }, + 'TA_BUFFER_ATOMIC_WAVEFRONTS': { + 'gfx90a': ('TA', 47), + 'gfx908': ('TA', 47), + 'gfx940': ('TA', 35), + 'gfx941': ('TA', 35), + 'gfx942': ('TA', 35), + 'gfx950': ('TA', 35), + }, + 'TA_BUFFER_COALESCED_READ_CYCLES': { + 'gfx90a': ('TA', 52), + 'gfx908': ('TA', 52), + 'gfx940': ('TA', 40), + 'gfx941': ('TA', 40), + 'gfx942': ('TA', 40), + 'gfx950': ('TA', 40), + }, + 'TA_BUFFER_COALESCED_WRITE_CYCLES': { + 'gfx90a': ('TA', 53), + 'gfx908': ('TA', 53), + 'gfx940': ('TA', 41), + 'gfx941': ('TA', 41), + 'gfx942': ('TA', 41), + 'gfx950': ('TA', 41), + }, + 'TA_BUFFER_LOAD_WAVEFRONTS': { + 'gfx11': ('TA', 45), + 'gfx1100': ('TA', 45), + 'gfx1101': ('TA', 45), + 'gfx1102': ('TA', 45), + 'gfx12': ('TA', 45), + 'gfx1200': ('TA', 45), + 'gfx1201': ('TA', 45), + }, + 'TA_BUFFER_READ_WAVEFRONTS': { + 'gfx90a': ('TA', 45), + 'gfx908': ('TA', 45), + 'gfx940': ('TA', 33), + 'gfx941': ('TA', 33), + 'gfx942': ('TA', 33), + 'gfx950': ('TA', 33), + }, + 'TA_BUFFER_STORE_WAVEFRONTS': { + 'gfx11': ('TA', 46), + 'gfx1100': ('TA', 46), + 'gfx1101': ('TA', 46), + 'gfx1102': ('TA', 46), + 'gfx12': ('TA', 46), + 'gfx1200': ('TA', 46), + 'gfx1201': ('TA', 46), + }, + 'TA_BUFFER_TOTAL_CYCLES': { + 'gfx90a': ('TA', 49), + 'gfx908': ('TA', 49), + 'gfx940': ('TA', 37), + 'gfx941': ('TA', 37), + 'gfx942': ('TA', 37), + 'gfx950': ('TA', 37), + }, + 'TA_BUFFER_WAVEFRONTS': { + 'gfx90a': ('TA', 44), + 'gfx908': ('TA', 44), + 'gfx940': ('TA', 32), + 'gfx941': ('TA', 32), + 'gfx942': ('TA', 32), + 'gfx950': ('TA', 32), + }, + 'TA_BUFFER_WRITE_WAVEFRONTS': { + 'gfx90a': ('TA', 46), + 'gfx908': ('TA', 46), + 'gfx940': ('TA', 34), + 'gfx941': ('TA', 34), + 'gfx942': ('TA', 34), + 'gfx950': ('TA', 34), + }, + 'TA_DATA_STALLED_BY_TC_CYCLES': { + 'gfx90a': ('TA', 56), + 'gfx908': ('TA', 56), + 'gfx940': ('TA', 44), + 'gfx941': ('TA', 44), + 'gfx942': ('TA', 44), + 'gfx950': ('TA', 44), + }, + 'TA_FLAT_ATOMIC_WAVEFRONTS': { + 'gfx90a': ('TA', 103), + 'gfx908': ('TA', 103), + 'gfx940': ('TA', 54), + 'gfx941': ('TA', 54), + 'gfx942': ('TA', 54), + 'gfx950': ('TA', 54), + }, + 'TA_FLAT_LOAD_WAVEFRONTS': { + 'gfx10': ('TA', 101), + 'gfx1010': ('TA', 101), + 'gfx1030': ('TA', 101), + 'gfx1031': ('TA', 101), + 'gfx1032': ('TA', 101), + }, + 'TA_FLAT_READ_WAVEFRONTS': { + 'gfx9': ('TA', 101), + 'gfx900': ('TA', 101), + 'gfx906': ('TA', 101), + 'gfx908': ('TA', 101), + 'gfx90a': ('TA', 101), + 'gfx940': ('TA', 52), + 'gfx941': ('TA', 52), + 'gfx942': ('TA', 52), + 'gfx950': ('TA', 52), + }, + 'TA_FLAT_STORE_WAVEFRONTS': { + 'gfx10': ('TA', 102), + 'gfx1010': ('TA', 102), + 'gfx1030': ('TA', 102), + 'gfx1031': ('TA', 102), + 'gfx1032': ('TA', 102), + }, + 'TA_FLAT_WAVEFRONTS': { + 'gfx90a': ('TA', 100), + 'gfx908': ('TA', 100), + 'gfx940': ('TA', 51), + 'gfx941': ('TA', 51), + 'gfx942': ('TA', 51), + 'gfx950': ('TA', 51), + }, + 'TA_FLAT_WRITE_WAVEFRONTS': { + 'gfx9': ('TA', 102), + 'gfx900': ('TA', 102), + 'gfx906': ('TA', 102), + 'gfx908': ('TA', 102), + 'gfx90a': ('TA', 102), + 'gfx940': ('TA', 53), + 'gfx941': ('TA', 53), + 'gfx942': ('TA', 53), + 'gfx950': ('TA', 53), + }, + 'TA_TA_BUSY': { + 'gfx10': ('TA', 15), + 'gfx1010': ('TA', 15), + 'gfx1030': ('TA', 15), + 'gfx1031': ('TA', 15), + 'gfx1032': ('TA', 15), + 'gfx11': ('TA', 15), + 'gfx1100': ('TA', 15), + 'gfx1101': ('TA', 15), + 'gfx1102': ('TA', 15), + 'gfx12': ('TA', 15), + 'gfx1200': ('TA', 15), + 'gfx1201': ('TA', 15), + 'gfx9': ('TA', 15), + 'gfx900': ('TA', 15), + 'gfx906': ('TA', 15), + 'gfx908': ('TA', 15), + 'gfx90a': ('TA', 15), + 'gfx940': ('TA', 13), + 'gfx941': ('TA', 13), + 'gfx942': ('TA', 13), + 'gfx950': ('TA', 13), + }, + 'TA_TOTAL_WAVEFRONTS': { + 'gfx90a': ('TA', 32), + 'gfx908': ('TA', 32), + 'gfx940': ('TA', 29), + 'gfx941': ('TA', 29), + 'gfx942': ('TA', 29), + 'gfx950': ('TA', 29), + }, + 'TA_BUFFER_READ_LDS_WAVEFRONTS': { + 'gfx950': ('TA', 70), + }, + 'TA_FLAT_READ_LDS_WAVEFRONTS': { + 'gfx950': ('TA', 71), + }, + 'TA_BUFFER_COALESCEABLE_WAVEFRONTS': { + 'gfx950': ('TA', 36), + }, + 'TA_FLAT_COALESCEABLE_WAVEFRONTS': { + 'gfx950': ('TA', 55), + }, + 'TCA_BUSY': { + 'gfx90a': ('TCA', 2), + 'gfx908': ('TCA', 2), + 'gfx940': ('TCA', 2), + 'gfx941': ('TCA', 2), + 'gfx942': ('TCA', 2), + 'gfx950': ('TCA', 2), + }, + 'TCA_CYCLE': { + 'gfx90a': ('TCA', 1), + 'gfx908': ('TCA', 1), + 'gfx940': ('TCA', 1), + 'gfx941': ('TCA', 1), + 'gfx942': ('TCA', 1), + 'gfx950': ('TCA', 1), + }, + 'TCC_ALL_TC_OP_INV_EVICT': { + 'gfx90a': ('TCC', 80), + 'gfx908': ('TCC', 80), + 'gfx940': ('TCC', 80), + 'gfx941': ('TCC', 80), + 'gfx942': ('TCC', 80), + 'gfx950': ('TCC', 86), + }, + 'TCC_ALL_TC_OP_WB_WRITEBACK': { + 'gfx90a': ('TCC', 73), + 'gfx908': ('TCC', 73), + 'gfx940': ('TCC', 73), + 'gfx941': ('TCC', 73), + 'gfx942': ('TCC', 73), + 'gfx950': ('TCC', 79), + }, + 'TCC_ATOMIC': { + 'gfx90a': ('TCC', 14), + 'gfx908': ('TCC', 14), + 'gfx940': ('TCC', 14), + 'gfx941': ('TCC', 14), + 'gfx942': ('TCC', 14), + 'gfx950': ('TCC', 18), + }, + 'TCC_BUSY': { + 'gfx90a': ('TCC', 2), + 'gfx908': ('TCC', 2), + 'gfx940': ('TCC', 2), + 'gfx941': ('TCC', 2), + 'gfx942': ('TCC', 2), + 'gfx950': ('TCC', 2), + }, + 'TCC_CC_REQ': { + 'gfx90a': ('TCC', 7), + 'gfx908': ('TCC', 7), + 'gfx940': ('TCC', 7), + 'gfx941': ('TCC', 7), + 'gfx942': ('TCC', 7), + 'gfx950': ('TCC', 11), + }, + 'TCC_CYCLE': { + 'gfx90a': ('TCC', 1), + 'gfx908': ('TCC', 1), + 'gfx940': ('TCC', 1), + 'gfx941': ('TCC', 1), + 'gfx942': ('TCC', 1), + 'gfx950': ('TCC', 1), + }, + 'TCC_EA0_ATOMIC': { + 'gfx908': ('TCC', 36), + 'gfx940': ('TCC', 36), + 'gfx941': ('TCC', 36), + 'gfx942': ('TCC', 36), + 'gfx950': ('TCC', 40), + }, + 'TCC_EA0_ATOMIC_LEVEL': { + 'gfx908': ('TCC', 37), + 'gfx940': ('TCC', 37), + 'gfx941': ('TCC', 37), + 'gfx942': ('TCC', 37), + 'gfx950': ('TCC', 41), + }, + 'TCC_EA0_RDREQ': { + 'gfx908': ('TCC', 38), + 'gfx940': ('TCC', 38), + 'gfx941': ('TCC', 38), + 'gfx942': ('TCC', 38), + 'gfx950': ('TCC', 42), + }, + 'TCC_EA0_RDREQ_32B': { + 'gfx908': ('TCC', 39), + 'gfx940': ('TCC', 39), + 'gfx941': ('TCC', 39), + 'gfx942': ('TCC', 39), + 'gfx950': ('TCC', 43), + }, + 'TCC_EA0_RDREQ_DRAM': { + 'gfx908': ('TCC', 102), + 'gfx940': ('TCC', 102), + 'gfx941': ('TCC', 102), + 'gfx942': ('TCC', 102), + 'gfx950': ('TCC', 108), + }, + 'TCC_EA0_RDREQ_DRAM_CREDIT_STALL': { + 'gfx908': ('TCC', 43), + 'gfx940': ('TCC', 43), + 'gfx941': ('TCC', 43), + 'gfx942': ('TCC', 43), + 'gfx950': ('TCC', 49), + }, + 'TCC_EA0_RDREQ_GMI_CREDIT_STALL': { + 'gfx908': ('TCC', 42), + 'gfx940': ('TCC', 42), + 'gfx941': ('TCC', 42), + 'gfx942': ('TCC', 42), + 'gfx950': ('TCC', 48), + }, + 'TCC_EA0_RDREQ_IO_CREDIT_STALL': { + 'gfx908': ('TCC', 41), + 'gfx940': ('TCC', 41), + 'gfx941': ('TCC', 41), + 'gfx942': ('TCC', 41), + 'gfx950': ('TCC', 47), + }, + 'TCC_EA0_RDREQ_LEVEL': { + 'gfx908': ('TCC', 44), + 'gfx940': ('TCC', 44), + 'gfx941': ('TCC', 44), + 'gfx942': ('TCC', 44), + 'gfx950': ('TCC', 50), + }, + 'TCC_EA0_RD_UNCACHED_32B': { + 'gfx908': ('TCC', 40), + 'gfx940': ('TCC', 40), + 'gfx941': ('TCC', 40), + 'gfx942': ('TCC', 40), + 'gfx950': ('TCC', 46), + }, + 'TCC_EA0_WRREQ': { + 'gfx908': ('TCC', 26), + 'gfx90a': ('TCC', 26), + 'gfx940': ('TCC', 26), + 'gfx941': ('TCC', 26), + 'gfx942': ('TCC', 26), + 'gfx950': ('TCC', 30), + }, + 'TCC_EA0_WRREQ_64B': { + 'gfx908': ('TCC', 27), + 'gfx90a': ('TCC', 27), + 'gfx940': ('TCC', 27), + 'gfx941': ('TCC', 27), + 'gfx942': ('TCC', 27), + 'gfx950': ('TCC', 31), + }, + 'TCC_EA0_WRREQ_DRAM': { + 'gfx908': ('TCC', 103), + 'gfx940': ('TCC', 103), + 'gfx941': ('TCC', 103), + 'gfx942': ('TCC', 103), + 'gfx950': ('TCC', 109), + }, + 'TCC_EA0_WRREQ_DRAM_CREDIT_STALL': { + 'gfx908': ('TCC', 33), + 'gfx940': ('TCC', 33), + 'gfx941': ('TCC', 33), + 'gfx942': ('TCC', 33), + 'gfx950': ('TCC', 37), + }, + 'TCC_EA0_WRREQ_GMI_CREDIT_STALL': { + 'gfx908': ('TCC', 32), + 'gfx940': ('TCC', 32), + 'gfx941': ('TCC', 32), + 'gfx942': ('TCC', 32), + 'gfx950': ('TCC', 36), + }, + 'TCC_EA0_WRREQ_IO_CREDIT_STALL': { + 'gfx908': ('TCC', 31), + 'gfx940': ('TCC', 31), + 'gfx941': ('TCC', 31), + 'gfx942': ('TCC', 31), + 'gfx950': ('TCC', 35), + }, + 'TCC_EA0_WRREQ_LEVEL': { + 'gfx908': ('TCC', 35), + 'gfx940': ('TCC', 35), + 'gfx941': ('TCC', 35), + 'gfx942': ('TCC', 35), + 'gfx950': ('TCC', 39), + }, + 'TCC_EA0_WRREQ_PROBE_COMMAND': { + 'gfx940': ('TCC', 28), + 'gfx941': ('TCC', 28), + 'gfx942': ('TCC', 28), + 'gfx950': ('TCC', 32), + }, + 'TCC_EA0_WRREQ_STALL': { + 'gfx908': ('TCC', 30), + 'gfx940': ('TCC', 30), + 'gfx941': ('TCC', 30), + 'gfx942': ('TCC', 30), + 'gfx950': ('TCC', 34), + }, + 'TCC_EA0_WR_UNCACHED_32B': { + 'gfx908': ('TCC', 29), + 'gfx940': ('TCC', 29), + 'gfx941': ('TCC', 29), + 'gfx942': ('TCC', 29), + 'gfx950': ('TCC', 33), + }, + 'TCC_EA1_RDREQ': { + 'gfx906': ('TCC', 267), + }, + 'TCC_EA1_RDREQ_32B': { + 'gfx906': ('TCC', 268), + }, + 'TCC_EA1_WRREQ': { + 'gfx906': ('TCC', 256), + }, + 'TCC_EA1_WRREQ_64B': { + 'gfx906': ('TCC', 257), + }, + 'TCC_EA1_WRREQ_STALL': { + 'gfx906': ('TCC', 260), + }, + 'TCC_EA_ATOMIC': { + 'gfx90a': ('TCC', 36), + }, + 'TCC_EA_ATOMIC_LEVEL': { + 'gfx90a': ('TCC', 37), + }, + 'TCC_EA_RDREQ': { + 'gfx9': ('TCC', 41), + 'gfx900': ('TCC', 41), + 'gfx906': ('TCC', 41), + 'gfx908': ('TCC', 38), + 'gfx90a': ('TCC', 38), + }, + 'TCC_EA_RDREQ_32B': { + 'gfx9': ('TCC', 42), + 'gfx900': ('TCC', 42), + 'gfx906': ('TCC', 42), + 'gfx908': ('TCC', 39), + 'gfx90a': ('TCC', 39), + }, + 'TCC_EA_RDREQ_DRAM': { + 'gfx90a': ('TCC', 102), + }, + 'TCC_EA_RDREQ_DRAM_CREDIT_STALL': { + 'gfx90a': ('TCC', 43), + }, + 'TCC_EA_RDREQ_GMI_CREDIT_STALL': { + 'gfx90a': ('TCC', 42), + }, + 'TCC_EA_RDREQ_IO_CREDIT_STALL': { + 'gfx90a': ('TCC', 41), + }, + 'TCC_EA_RDREQ_LEVEL': { + 'gfx90a': ('TCC', 44), + }, + 'TCC_EA_RD_UNCACHED_32B': { + 'gfx90a': ('TCC', 40), + }, + 'TCC_EA_WRREQ': { + 'gfx9': ('TCC', 29), + 'gfx900': ('TCC', 29), + 'gfx906': ('TCC', 29), + 'gfx908': ('TCC', 26), + 'gfx90a': ('TCC', 26), + }, + 'TCC_EA_WRREQ_64B': { + 'gfx9': ('TCC', 30), + 'gfx900': ('TCC', 30), + 'gfx906': ('TCC', 30), + 'gfx908': ('TCC', 27), + 'gfx90a': ('TCC', 27), + }, + 'TCC_EA_WRREQ_DRAM': { + 'gfx90a': ('TCC', 103), + }, + 'TCC_EA_WRREQ_DRAM_CREDIT_STALL': { + 'gfx90a': ('TCC', 33), + }, + 'TCC_EA_WRREQ_GMI_CREDIT_STALL': { + 'gfx90a': ('TCC', 32), + }, + 'TCC_EA_WRREQ_IO_CREDIT_STALL': { + 'gfx90a': ('TCC', 31), + }, + 'TCC_EA_WRREQ_LEVEL': { + 'gfx90a': ('TCC', 35), + }, + 'TCC_EA_WRREQ_STALL': { + 'gfx9': ('TCC', 33), + 'gfx900': ('TCC', 33), + 'gfx906': ('TCC', 33), + 'gfx908': ('TCC', 30), + 'gfx90a': ('TCC', 30), + }, + 'TCC_EA_WR_UNCACHED_32B': { + 'gfx90a': ('TCC', 29), + }, + 'TCC_HIT': { + 'gfx9': ('TCC', 20), + 'gfx900': ('TCC', 20), + 'gfx906': ('TCC', 20), + 'gfx908': ('TCC', 17), + 'gfx90a': ('TCC', 17), + 'gfx940': ('TCC', 17), + 'gfx941': ('TCC', 17), + 'gfx942': ('TCC', 17), + 'gfx950': ('TCC', 21), + }, + 'TCC_INTERNAL_PROBE': { + 'gfx940': ('TCC', 11), + 'gfx941': ('TCC', 11), + 'gfx942': ('TCC', 11), + 'gfx950': ('TCC', 15), + }, + 'TCC_MISS': { + 'gfx9': ('TCC', 22), + 'gfx900': ('TCC', 22), + 'gfx906': ('TCC', 22), + 'gfx908': ('TCC', 19), + 'gfx90a': ('TCC', 19), + 'gfx940': ('TCC', 19), + 'gfx941': ('TCC', 19), + 'gfx942': ('TCC', 19), + 'gfx950': ('TCC', 23), + }, + 'TCC_NC_REQ': { + 'gfx908': ('TCC', 5), + 'gfx90a': ('TCC', 5), + 'gfx940': ('TCC', 5), + 'gfx941': ('TCC', 5), + 'gfx942': ('TCC', 5), + 'gfx950': ('TCC', 9), + }, + 'TCC_NORMAL_EVICT': { + 'gfx90a': ('TCC', 74), + 'gfx908': ('TCC', 74), + 'gfx940': ('TCC', 74), + 'gfx941': ('TCC', 74), + 'gfx942': ('TCC', 74), + 'gfx950': ('TCC', 80), + }, + 'TCC_NORMAL_WRITEBACK': { + 'gfx908': ('TCC', 68), + 'gfx90a': ('TCC', 68), + 'gfx940': ('TCC', 68), + 'gfx941': ('TCC', 68), + 'gfx942': ('TCC', 68), + 'gfx950': ('TCC', 74), + }, + 'TCC_PROBE': { + 'gfx90a': ('TCC', 9), + 'gfx908': ('TCC', 9), + 'gfx940': ('TCC', 9), + 'gfx941': ('TCC', 9), + 'gfx942': ('TCC', 9), + 'gfx950': ('TCC', 13), + }, + 'TCC_PROBE_ALL': { + 'gfx90a': ('TCC', 10), + 'gfx908': ('TCC', 10), + 'gfx940': ('TCC', 10), + 'gfx941': ('TCC', 10), + 'gfx942': ('TCC', 10), + 'gfx950': ('TCC', 14), + }, + 'TCC_PROBE_EVICT': { + 'gfx940': ('TCC', 81), + 'gfx941': ('TCC', 81), + 'gfx942': ('TCC', 81), + 'gfx950': ('TCC', 87), + }, + 'TCC_READ': { + 'gfx90a': ('TCC', 12), + 'gfx908': ('TCC', 12), + 'gfx940': ('TCC', 12), + 'gfx941': ('TCC', 12), + 'gfx942': ('TCC', 12), + 'gfx950': ('TCC', 16), + }, + 'TCC_REQ': { + 'gfx90a': ('TCC', 3), + 'gfx908': ('TCC', 3), + 'gfx940': ('TCC', 3), + 'gfx941': ('TCC', 3), + 'gfx942': ('TCC', 3), + 'gfx950': ('TCC', 6), + }, + 'TCC_RW_REQ': { + 'gfx90a': ('TCC', 8), + 'gfx908': ('TCC', 8), + 'gfx940': ('TCC', 8), + 'gfx941': ('TCC', 8), + 'gfx942': ('TCC', 8), + 'gfx950': ('TCC', 12), + }, + 'TCC_STREAMING_REQ': { + 'gfx90a': ('TCC', 4), + 'gfx908': ('TCC', 4), + 'gfx940': ('TCC', 4), + 'gfx941': ('TCC', 4), + 'gfx942': ('TCC', 4), + 'gfx950': ('TCC', 7), + }, + 'TCC_TAG_STALL': { + 'gfx90a': ('TCC', 45), + 'gfx908': ('TCC', 45), + 'gfx940': ('TCC', 45), + 'gfx941': ('TCC', 45), + 'gfx942': ('TCC', 45), + 'gfx950': ('TCC', 51), + }, + 'TCC_TOO_MANY_EA_WRREQS_STALL': { + 'gfx90a': ('TCC', 34), + 'gfx908': ('TCC', 34), + 'gfx940': ('TCC', 34), + 'gfx941': ('TCC', 34), + 'gfx942': ('TCC', 34), + 'gfx950': ('TCC', 38), + }, + 'TCC_UC_REQ': { + 'gfx90a': ('TCC', 6), + 'gfx908': ('TCC', 6), + 'gfx940': ('TCC', 6), + 'gfx941': ('TCC', 6), + 'gfx942': ('TCC', 6), + 'gfx950': ('TCC', 10), + }, + 'TCC_WRITE': { + 'gfx90a': ('TCC', 13), + 'gfx908': ('TCC', 13), + 'gfx940': ('TCC', 13), + 'gfx941': ('TCC', 13), + 'gfx942': ('TCC', 13), + 'gfx950': ('TCC', 17), + }, + 'TCC_WRITEBACK': { + 'gfx90a': ('TCC', 22), + 'gfx908': ('TCC', 22), + 'gfx940': ('TCC', 22), + 'gfx941': ('TCC', 22), + 'gfx942': ('TCC', 22), + 'gfx950': ('TCC', 26), + }, + 'TCC_BUBBLE': { + 'gfx90a': ('TCC', 56), + 'gfx908': ('TCC', 56), + 'gfx940': ('TCC', 56), + 'gfx941': ('TCC', 56), + 'gfx942': ('TCC', 56), + 'gfx950': ('TCC', 62), + }, + 'TCC_EA0_RDREQ_DRAM_32B': { + 'gfx950': ('TCC', 112), + }, + 'TCC_EA0_RDREQ_GMI_32B': { + 'gfx950': ('TCC', 113), + }, + 'TCC_EA0_RDREQ_IO_32B': { + 'gfx950': ('TCC', 114), + }, + 'TCC_EA0_WRREQ_WRITE_DRAM_32B': { + 'gfx950': ('TCC', 115), + }, + 'TCC_EA0_WRREQ_WRITE_ATOMIC_32B': { + 'gfx950': ('TCC', 116), + }, + 'TCC_EA0_WRREQ_WRITE_GMI_32B': { + 'gfx950': ('TCC', 117), + }, + 'TCC_EA0_WRREQ_ATOMIC_GMI_32B': { + 'gfx950': ('TCC', 118), + }, + 'TCC_EA0_WRREQ_WRITE_IO_32B': { + 'gfx950': ('TCC', 119), + }, + 'TCC_EA0_WRREQ_ATOMIC_IO_32B': { + 'gfx950': ('TCC', 120), + }, + 'TCC_READ_SECTORS': { + 'gfx950': ('TCC', 3), + }, + 'TCC_WRITE_SECTORS': { + 'gfx950': ('TCC', 4), + }, + 'TCC_ATOMIC_SECTORS': { + 'gfx950': ('TCC', 5), + }, + 'TCC_BYPASS_REQ': { + 'gfx950': ('TCC', 8), + }, + 'TCC_LATENCY_FIFO_FULL': { + 'gfx950': ('TCC', 27), + }, + 'TCC_SRC_FIFO_FULL': { + 'gfx950': ('TCC', 28), + }, + 'TCC_EA0_RDREQ_64B': { + 'gfx950': ('TCC', 44), + }, + 'TCC_EA0_RDREQ_128B': { + 'gfx950': ('TCC', 45), + }, + 'TCC_IB_REQ': { + 'gfx950': ('TCC', 67), + }, + 'TCC_IB_STALL': { + 'gfx950': ('TCC', 68), + }, + 'TCC_EA0_WRREQ_ATOMIC_DRAM': { + 'gfx950': ('TCC', 111), + }, + 'TCC_EA0_WRREQ_WRITE_DRAM': { + 'gfx950': ('TCC', 110), + }, + 'TCC_EA0_WRREQ_ATOMIC_DRAM_32B': { + 'gfx950': ('TCC', 116), + }, + 'TCC_CLIENT184_REQ': { + 'gfx908': ('TCC', 312), + }, + 'TCC_CLIENT185_REQ': { + 'gfx908': ('TCC', 313), + }, + 'TCC_CLIENT186_REQ': { + 'gfx908': ('TCC', 314), + }, + 'TCC_CLIENT187_REQ': { + 'gfx908': ('TCC', 315), + }, + 'TCC_CLIENT188_REQ': { + 'gfx908': ('TCC', 316), + }, + 'TCC_CLIENT189_REQ': { + 'gfx908': ('TCC', 317), + }, + 'TCC_CLIENT190_REQ': { + 'gfx908': ('TCC', 318), + }, + 'TCC_CLIENT191_REQ': { + 'gfx908': ('TCC', 319), + }, + 'TCP_REQ': { + 'gfx12': ('TCP', 9), + 'gfx1200': ('TCP', 9), + 'gfx1201': ('TCP', 9), + }, + 'TCP_REQ_MISS': { + 'gfx12': ('TCP', 17), + 'gfx1200': ('TCP', 17), + 'gfx1201': ('TCP', 17), + }, + 'TCP_ATOMIC_TAGCONFLICT_STALL_CYCLES': { + 'gfx90a': ('TCP', 13), + 'gfx908': ('TCP', 13), + 'gfx940': ('TCP', 12), + 'gfx941': ('TCP', 12), + 'gfx942': ('TCP', 12), + 'gfx950': ('TCP', 12), + }, + 'TCP_GATE_EN1': { + 'gfx90a': ('TCP', 0), + 'gfx908': ('TCP', 0), + 'gfx940': ('TCP', 0), + 'gfx941': ('TCP', 0), + 'gfx942': ('TCP', 0), + 'gfx950': ('TCP', 0), + }, + 'TCP_GATE_EN2': { + 'gfx90a': ('TCP', 1), + 'gfx908': ('TCP', 1), + 'gfx940': ('TCP', 1), + 'gfx941': ('TCP', 1), + 'gfx942': ('TCP', 1), + 'gfx950': ('TCP', 1), + }, + 'TCP_PENDING_STALL_CYCLES': { + 'gfx90a': ('TCP', 22), + 'gfx908': ('TCP', 22), + 'gfx940': ('TCP', 21), + 'gfx941': ('TCP', 21), + 'gfx942': ('TCP', 21), + 'gfx950': ('TCP', 21), + }, + 'TCP_READ_TAGCONFLICT_STALL_CYCLES': { + 'gfx90a': ('TCP', 11), + 'gfx908': ('TCP', 11), + 'gfx940': ('TCP', 10), + 'gfx941': ('TCP', 10), + 'gfx942': ('TCP', 10), + 'gfx950': ('TCP', 10), + }, + 'TCP_TA_TCP_STATE_READ': { + 'gfx90a': ('TCP', 27), + 'gfx908': ('TCP', 27), + 'gfx940': ('TCP', 25), + 'gfx941': ('TCP', 25), + 'gfx942': ('TCP', 25), + 'gfx950': ('TCP', 25), + }, + 'TCP_TCC_ATOMIC_WITHOUT_RET_REQ': { + 'gfx90a': ('TCP', 72), + 'gfx908': ('TCP', 72), + 'gfx940': ('TCP', 68), + 'gfx941': ('TCP', 68), + 'gfx942': ('TCP', 68), + 'gfx950': ('TCP', 71), + }, + 'TCP_TCC_ATOMIC_WITH_RET_REQ': { + 'gfx90a': ('TCP', 71), + 'gfx908': ('TCP', 71), + 'gfx940': ('TCP', 67), + 'gfx941': ('TCP', 67), + 'gfx942': ('TCP', 67), + 'gfx950': ('TCP', 70), + }, + 'TCP_TCC_CC_ATOMIC_REQ': { + 'gfx90a': ('TCP', 83), + 'gfx908': ('TCP', 83), + 'gfx940': ('TCP', 79), + 'gfx941': ('TCP', 79), + 'gfx942': ('TCP', 79), + 'gfx950': ('TCP', 82), + }, + 'TCP_TCC_CC_READ_REQ': { + 'gfx90a': ('TCP', 81), + 'gfx908': ('TCP', 81), + 'gfx940': ('TCP', 77), + 'gfx941': ('TCP', 77), + 'gfx942': ('TCP', 77), + 'gfx950': ('TCP', 80), + }, + 'TCP_TCC_CC_WRITE_REQ': { + 'gfx90a': ('TCP', 82), + 'gfx908': ('TCP', 82), + 'gfx940': ('TCP', 78), + 'gfx941': ('TCP', 78), + 'gfx942': ('TCP', 78), + 'gfx950': ('TCP', 81), + }, + 'TCP_TCC_NC_ATOMIC_REQ': { + 'gfx90a': ('TCP', 77), + 'gfx908': ('TCP', 77), + 'gfx940': ('TCP', 73), + 'gfx941': ('TCP', 73), + 'gfx942': ('TCP', 73), + 'gfx950': ('TCP', 76), + }, + 'TCP_TCC_NC_READ_REQ': { + 'gfx90a': ('TCP', 75), + 'gfx908': ('TCP', 75), + 'gfx940': ('TCP', 71), + 'gfx941': ('TCP', 71), + 'gfx942': ('TCP', 71), + 'gfx950': ('TCP', 74), + }, + 'TCP_TCC_NC_WRITE_REQ': { + 'gfx90a': ('TCP', 76), + 'gfx908': ('TCP', 76), + 'gfx940': ('TCP', 72), + 'gfx941': ('TCP', 72), + 'gfx942': ('TCP', 72), + 'gfx950': ('TCP', 75), + }, + 'TCP_TCC_READ_REQ': { + 'gfx90a': ('TCP', 69), + 'gfx908': ('TCP', 69), + 'gfx940': ('TCP', 65), + 'gfx941': ('TCP', 65), + 'gfx942': ('TCP', 65), + 'gfx950': ('TCP', 68), + }, + 'TCP_TCC_READ_REQ_LATENCY': { + 'gfx90a': ('TCP', 66), + 'gfx908': ('TCP', 66), + 'gfx950': ('TCP', 65), + }, + 'TCP_TCC_RW_ATOMIC_REQ': { + 'gfx90a': ('TCP', 87), + 'gfx908': ('TCP', 87), + 'gfx940': ('TCP', 82), + 'gfx941': ('TCP', 82), + 'gfx942': ('TCP', 82), + 'gfx950': ('TCP', 85), + }, + 'TCP_TCC_RW_READ_REQ': { + 'gfx90a': ('TCP', 85), + 'gfx908': ('TCP', 85), + 'gfx940': ('TCP', 80), + 'gfx941': ('TCP', 80), + 'gfx942': ('TCP', 80), + 'gfx950': ('TCP', 83), + }, + 'TCP_TCC_RW_WRITE_REQ': { + 'gfx90a': ('TCP', 86), + 'gfx908': ('TCP', 86), + 'gfx940': ('TCP', 81), + 'gfx941': ('TCP', 81), + 'gfx942': ('TCP', 81), + 'gfx950': ('TCP', 84), + }, + 'TCP_TCC_UC_ATOMIC_REQ': { + 'gfx90a': ('TCP', 80), + 'gfx908': ('TCP', 80), + 'gfx940': ('TCP', 76), + 'gfx941': ('TCP', 76), + 'gfx942': ('TCP', 76), + 'gfx950': ('TCP', 79), + }, + 'TCP_TCC_UC_READ_REQ': { + 'gfx90a': ('TCP', 78), + 'gfx908': ('TCP', 78), + 'gfx940': ('TCP', 74), + 'gfx941': ('TCP', 74), + 'gfx942': ('TCP', 74), + 'gfx950': ('TCP', 77), + }, + 'TCP_TCC_UC_WRITE_REQ': { + 'gfx90a': ('TCP', 79), + 'gfx908': ('TCP', 79), + 'gfx940': ('TCP', 75), + 'gfx941': ('TCP', 75), + 'gfx942': ('TCP', 75), + 'gfx950': ('TCP', 78), + }, + 'TCP_TCC_WRITE_REQ': { + 'gfx90a': ('TCP', 70), + 'gfx908': ('TCP', 70), + 'gfx940': ('TCP', 66), + 'gfx941': ('TCP', 66), + 'gfx942': ('TCP', 66), + 'gfx950': ('TCP', 69), + }, + 'TCP_TCC_WRITE_REQ_LATENCY': { + 'gfx90a': ('TCP', 67), + 'gfx908': ('TCP', 67), + 'gfx950': ('TCP', 66), + }, + 'TCP_TCP_LATENCY': { + 'gfx90a': ('TCP', 65), + 'gfx908': ('TCP', 65), + 'gfx950': ('TCP', 64), + }, + 'TCP_TCP_TA_DATA_STALL_CYCLES': { + 'gfx9': ('TCP', 6), + 'gfx900': ('TCP', 6), + 'gfx906': ('TCP', 6), + 'gfx908': ('TCP', 6), + 'gfx90a': ('TCP', 6), + 'gfx940': ('TCP', 6), + 'gfx941': ('TCP', 6), + 'gfx942': ('TCP', 6), + 'gfx950': ('TCP', 6), + }, + 'TCP_TCR_TCP_STALL_CYCLES': { + 'gfx90a': ('TCP', 8), + 'gfx908': ('TCP', 8), + 'gfx940': ('TCP', 8), + 'gfx941': ('TCP', 8), + 'gfx942': ('TCP', 8), + 'gfx950': ('TCP', 8), + }, + 'TCP_TD_TCP_STALL_CYCLES': { + 'gfx90a': ('TCP', 7), + 'gfx908': ('TCP', 7), + 'gfx940': ('TCP', 7), + 'gfx941': ('TCP', 7), + 'gfx942': ('TCP', 7), + 'gfx950': ('TCP', 7), + }, + 'TCP_TOTAL_ACCESSES': { + 'gfx90a': ('TCP', 29), + 'gfx908': ('TCP', 29), + 'gfx940': ('TCP', 27), + 'gfx941': ('TCP', 27), + 'gfx942': ('TCP', 27), + 'gfx950': ('TCP', 27), + }, + 'TCP_TOTAL_ATOMIC_WITHOUT_RET': { + 'gfx90a': ('TCP', 39), + 'gfx908': ('TCP', 39), + 'gfx940': ('TCP', 37), + 'gfx941': ('TCP', 37), + 'gfx942': ('TCP', 37), + 'gfx950': ('TCP', 37), + }, + 'TCP_TOTAL_ATOMIC_WITH_RET': { + 'gfx90a': ('TCP', 38), + 'gfx908': ('TCP', 38), + 'gfx940': ('TCP', 36), + 'gfx941': ('TCP', 36), + 'gfx942': ('TCP', 36), + 'gfx950': ('TCP', 36), + }, + 'TCP_TOTAL_CACHE_ACCESSES': { + 'gfx90a': ('TCP', 60), + 'gfx908': ('TCP', 60), + 'gfx940': ('TCP', 60), + 'gfx941': ('TCP', 60), + 'gfx942': ('TCP', 60), + 'gfx950': ('TCP', 58), + }, + 'TCP_TOTAL_READ': { + 'gfx90a': ('TCP', 30), + 'gfx908': ('TCP', 30), + 'gfx940': ('TCP', 28), + 'gfx941': ('TCP', 28), + 'gfx942': ('TCP', 28), + 'gfx950': ('TCP', 28), + }, + 'TCP_TOTAL_WRITE': { + 'gfx90a': ('TCP', 32), + 'gfx908': ('TCP', 32), + 'gfx940': ('TCP', 30), + 'gfx941': ('TCP', 30), + 'gfx942': ('TCP', 30), + 'gfx950': ('TCP', 30), + }, + 'TCP_TOTAL_WRITEBACK_INVALIDATES': { + 'gfx90a': ('TCP', 45), + 'gfx908': ('TCP', 45), + 'gfx940': ('TCP', 43), + 'gfx941': ('TCP', 43), + 'gfx942': ('TCP', 43), + 'gfx950': ('TCP', 41), + }, + 'TCP_UTCL1_PERMISSION_MISS': { + 'gfx90a': ('TCP', 50), + 'gfx908': ('TCP', 50), + 'gfx940': ('TCP', 49), + 'gfx941': ('TCP', 49), + 'gfx942': ('TCP', 49), + 'gfx950': ('TCP', 47), + }, + 'TCP_UTCL1_REQUEST': { + 'gfx90a': ('TCP', 47), + 'gfx908': ('TCP', 47), + 'gfx940': ('TCP', 45), + 'gfx941': ('TCP', 45), + 'gfx942': ('TCP', 45), + 'gfx950': ('TCP', 43), + }, + 'TCP_UTCL1_TRANSLATION_HIT': { + 'gfx90a': ('TCP', 49), + 'gfx908': ('TCP', 49), + 'gfx940': ('TCP', 48), + 'gfx941': ('TCP', 48), + 'gfx942': ('TCP', 48), + 'gfx950': ('TCP', 46), + }, + 'TCP_UTCL1_TRANSLATION_MISS': { + 'gfx90a': ('TCP', 48), + 'gfx908': ('TCP', 48), + 'gfx940': ('TCP', 47), + 'gfx941': ('TCP', 47), + 'gfx942': ('TCP', 47), + 'gfx950': ('TCP', 45), + }, + 'TCP_VOLATILE': { + 'gfx90a': ('TCP', 28), + 'gfx908': ('TCP', 28), + 'gfx940': ('TCP', 26), + 'gfx941': ('TCP', 26), + 'gfx942': ('TCP', 26), + 'gfx950': ('TCP', 26), + }, + 'TCP_WRITE_TAGCONFLICT_STALL_CYCLES': { + 'gfx90a': ('TCP', 12), + 'gfx908': ('TCP', 12), + 'gfx940': ('TCP', 11), + 'gfx941': ('TCP', 11), + 'gfx942': ('TCP', 11), + 'gfx950': ('TCP', 11), + }, + 'TCP_CACHE_MISS': { + 'gfx950': ('TCP', 63), + }, + 'TCP_TCP_TA_ADDR_STALL_CYCLES': { + 'gfx950': ('TCP', 5), + }, + 'TCP_LFIFO_STALL_CYCLES': { + 'gfx950': ('TCP', 15), + }, + 'TCP_RFIFO_STALL_CYCLES': { + 'gfx950': ('TCP', 16), + }, + 'TCP_TCR_RDRET_STALL': { + 'gfx950': ('TCP', 17), + }, + 'TCP_UTCL1_SERIALIZATION_STALL': { + 'gfx950': ('TCP', 23), + }, + 'TCP_UTCL1_THRASHING_STALL': { + 'gfx950': ('TCP', 44), + }, + 'TCP_UTCL1_TRANSLATION_MISS_UNDER_MISS': { + 'gfx950': ('TCP', 48), + }, + 'TCP_UTCL1_STALL_INFLIGHT_MAX': { + 'gfx950': ('TCP', 49), + }, + 'TCP_UTCL1_STALL_LRU_INFLIGHT': { + 'gfx950': ('TCP', 50), + }, + 'TCP_UTCL1_STALL_MULTI_MISS': { + 'gfx950': ('TCP', 51), + }, + 'TCP_UTCL1_LFIFO_FULL': { + 'gfx950': ('TCP', 52), + }, + 'TCP_UTCL1_STALL_LFIFO_NOT_RES': { + 'gfx950': ('TCP', 53), + }, + 'TCP_UTCL1_STALL_UTCL2_REQ_OUT_OF_CREDITS': { + 'gfx950': ('TCP', 54), + }, + 'TCP_CLIENT_UTCL1_INFLIGHT': { + 'gfx950': ('TCP', 55), + }, + 'TCP_TAGRAM0_REQ': { + 'gfx950': ('TCP', 59), + }, + 'TCP_TAGRAM1_REQ': { + 'gfx950': ('TCP', 60), + }, + 'TCP_TAGRAM2_REQ': { + 'gfx950': ('TCP', 61), + }, + 'TCP_TAGRAM3_REQ': { + 'gfx950': ('TCP', 62), + }, + 'TCP_TCC_WRITE_REQ_HOLE_LATENCY': { + 'gfx950': ('TCP', 67), + }, + 'TCP_TOTAL_WBINVL1_VOL': { + 'gfx950': ('TCP', 38), + }, + 'TCP_SQ_TCP_INVALIDATE_VOL': { + 'gfx950': ('TCP', 39), + }, + 'TCP_CP_TCP_INVALIDATE_VOL': { + 'gfx950': ('TCP', 40), + }, + 'TCP_UTCL1_STALL_LFIFO_NO_RES': { + 'gfx950': ('TCP', 53), + }, + 'TD_ATOMIC_WAVEFRONT': { + 'gfx90a': ('TD', 26), + 'gfx908': ('TD', 26), + 'gfx940': ('TD', 17), + 'gfx941': ('TD', 17), + 'gfx942': ('TD', 17), + 'gfx950': ('TD', 17), + }, + 'TD_COALESCABLE_WAVEFRONT': { + 'gfx90a': ('TD', 32), + 'gfx908': ('TD', 32), + 'gfx940': ('TD', 21), + 'gfx941': ('TD', 21), + 'gfx942': ('TD', 21), + 'gfx950': ('TD', 21), + }, + 'TD_LOAD_WAVEFRONT': { + 'gfx90a': ('TD', 25), + 'gfx908': ('TD', 25), + 'gfx940': ('TD', 16), + 'gfx941': ('TD', 16), + 'gfx942': ('TD', 16), + 'gfx950': ('TD', 16), + }, + 'TD_SPI_STALL': { + 'gfx90a': ('TD', 18), + 'gfx940': ('TD', 15), + 'gfx941': ('TD', 15), + 'gfx942': ('TD', 15), + 'gfx950': ('TD', 15), + }, + 'TD_STORE_WAVEFRONT': { + 'gfx90a': ('TD', 27), + 'gfx908': ('TD', 27), + 'gfx940': ('TD', 18), + 'gfx941': ('TD', 18), + 'gfx942': ('TD', 18), + 'gfx950': ('TD', 18), + }, + 'TD_TC_STALL': { + 'gfx90a': ('TD', 15), + 'gfx908': ('TD', 15), + 'gfx940': ('TD', 12), + 'gfx941': ('TD', 12), + 'gfx942': ('TD', 12), + 'gfx950': ('TD', 12), + }, + 'TD_TD_BUSY': { + 'gfx90a': ('TD', 1), + 'gfx908': ('TD', 1), + 'gfx940': ('TD', 1), + 'gfx941': ('TD', 1), + 'gfx942': ('TD', 1), + 'gfx950': ('TD', 1), + }, + 'TD_WRITE_ACKT_WAVEFRONT': { + 'gfx950': ('TD', 27), + }, + 'TD_TD_SP_TRAFFIC': { + 'gfx950': ('TD', 29), + }, + 'SQC_DCACHE_INFLIGHT_LEVEL': { + 'gfx90a': ('SQ', 337), + 'gfx908': ('SQ', 337), + 'gfx940': ('SQ', 337), + 'gfx941': ('SQ', 337), + 'gfx942': ('SQ', 337), + 'gfx950': ('SQ', 337), + }, + 'SQC_ICACHE_INFLIGHT_LEVEL': { + 'gfx90a': ('SQ', 336), + 'gfx908': ('SQ', 336), + 'gfx940': ('SQ', 336), + 'gfx941': ('SQ', 336), + 'gfx942': ('SQ', 336), + 'gfx950': ('SQ', 336), + }, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/regs.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/regs.py new file mode 100644 index 000000000..6cb6f94e0 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/regs.py @@ -0,0 +1,10160 @@ +__all__ = ['gc_9_4_3', 'gc_11_0_0', 'gc_11_0_3', 'gc_11_5_0', 'gc_12_0_0', 'mmhub_1_8_0', 'mmhub_3_0_0', 'mmhub_3_0_1', 'mmhub_3_0_2', 'mmhub_3_3_0', 'mmhub_4_1_0', 'nbio_4_3_0', 'nbio_7_2_0', 'nbio_7_7_0', 'nbio_7_9_0', 'nbio_7_11_0', 'nbif_6_3_1', 'mp_11_0_0', 'mp_13_0_0', 'mp_14_0_2', 'hdp_4_4_2', 'hdp_6_0_0', 'hdp_7_0_0', 'osssys_4_4_2', 'osssys_6_0_0', 'osssys_6_1_0', 'osssys_7_0_0', 'sdma_4_4_2'] +gc_9_4_3 = { + 'regGRBM_CNTL': (0, 0, {'read_timeout': (0, 7), 'report_last_rderr': (31, 31)}), + 'regGRBM_SKEW_CNTL': (1, 0, {'skew_top_threshold': (0, 5), 'skew_count': (6, 11)}), + 'regGRBM_STATUS2': (2, 0, {'me0pipe1_cmdfifo_avail': (0, 3), 'me0pipe1_cf_rq_pending': (4, 4), 'me0pipe1_pf_rq_pending': (5, 5), 'me1pipe0_rq_pending': (6, 6), 'me1pipe1_rq_pending': (7, 7), 'me1pipe2_rq_pending': (8, 8), 'me1pipe3_rq_pending': (9, 9), 'me2pipe0_rq_pending': (10, 10), 'me2pipe1_rq_pending': (11, 11), 'me2pipe2_rq_pending': (12, 12), 'me2pipe3_rq_pending': (13, 13), 'rlc_rq_pending': (14, 14), 'utcl2_busy': (15, 15), 'ea_busy': (16, 16), 'rmi_busy': (17, 17), 'utcl2_rq_pending': (18, 18), 'cpf_rq_pending': (19, 19), 'ea_link_busy': (20, 20), 'cane_busy': (21, 21), 'cane_link_busy': (22, 22), 'rlc_busy': (24, 24), 'tc_busy': (25, 25), 'tcc_cc_resident': (26, 26), 'cpf_busy': (28, 28), 'cpc_busy': (29, 29), 'cpg_busy': (30, 30), 'cpaxi_busy': (31, 31)}), + 'regGRBM_PWR_CNTL': (3, 0, {'all_req_type': (0, 1), 'gfx_req_type': (2, 3), 'all_rsp_type': (4, 5), 'gfx_rsp_type': (6, 7), 'gfx_req_en': (14, 14), 'all_req_en': (15, 15)}), + 'regGRBM_STATUS': (4, 0, {'me0pipe0_cmdfifo_avail': (0, 3), 'rsmu_rq_pending': (5, 5), 'me0pipe0_cf_rq_pending': (7, 7), 'me0pipe0_pf_rq_pending': (8, 8), 'gds_dma_rq_pending': (9, 9), 'db_clean': (12, 12), 'cb_clean': (13, 13), 'ta_busy': (14, 14), 'gds_busy': (15, 15), 'wd_busy_no_dma': (16, 16), 'vgt_busy': (17, 17), 'ia_busy_no_dma': (18, 18), 'ia_busy': (19, 19), 'sx_busy': (20, 20), 'wd_busy': (21, 21), 'spi_busy': (22, 22), 'bci_busy': (23, 23), 'sc_busy': (24, 24), 'pa_busy': (25, 25), 'db_busy': (26, 26), 'cp_coherency_busy': (28, 28), 'cp_busy': (29, 29), 'cb_busy': (30, 30), 'gui_active': (31, 31)}), + 'regGRBM_STATUS_SE0': (5, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'vgt_busy': (23, 23), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE1': (6, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'vgt_busy': (23, 23), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_SOFT_RESET': (8, 0, {'soft_reset_cp': (0, 0), 'soft_reset_rlc': (2, 2), 'soft_reset_gfx': (16, 16), 'soft_reset_cpf': (17, 17), 'soft_reset_cpc': (18, 18), 'soft_reset_cpg': (19, 19), 'soft_reset_cac': (20, 20), 'soft_reset_cane': (21, 21), 'soft_reset_ea': (22, 22), 'soft_reset_utcl2': (23, 23)}), + 'regGRBM_GFX_CLKEN_CNTL': (12, 0, {'prefix_delay_cnt': (0, 3), 'post_delay_cnt': (8, 12)}), + 'regGRBM_WAIT_IDLE_CLOCKS': (13, 0, {'wait_idle_clocks': (0, 7)}), + 'regGRBM_STATUS_SE2': (14, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'vgt_busy': (23, 23), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE3': (15, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'vgt_busy': (23, 23), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_READ_ERROR': (22, 0, {'read_address': (2, 17), 'read_pipeid': (20, 21), 'read_meid': (22, 23), 'read_error': (31, 31)}), + 'regGRBM_READ_ERROR2': (23, 0, {'read_requester_cpf': (16, 16), 'read_requester_rsmu': (17, 17), 'read_requester_rlc': (18, 18), 'read_requester_gds_dma': (19, 19), 'read_requester_me0pipe0_cf': (20, 20), 'read_requester_me0pipe0_pf': (21, 21), 'read_requester_me0pipe1_cf': (22, 22), 'read_requester_me0pipe1_pf': (23, 23), 'read_requester_me1pipe0': (24, 24), 'read_requester_me1pipe1': (25, 25), 'read_requester_me1pipe2': (26, 26), 'read_requester_me1pipe3': (27, 27), 'read_requester_me2pipe0': (28, 28), 'read_requester_me2pipe1': (29, 29), 'read_requester_me2pipe2': (30, 30), 'read_requester_me2pipe3': (31, 31)}), + 'regGRBM_INT_CNTL': (24, 0, {'rderr_int_enable': (0, 0), 'gui_idle_int_enable': (19, 19)}), + 'regGRBM_TRAP_OP': (25, 0, {'rw': (0, 0)}), + 'regGRBM_TRAP_ADDR': (26, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_ADDR_MSK': (27, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_WD': (28, 0, {'data': (0, 31)}), + 'regGRBM_TRAP_WD_MSK': (29, 0, {'data': (0, 31)}), + 'regGRBM_WRITE_ERROR': (31, 0, {'write_requester_rlc': (0, 0), 'write_requester_rsmu': (1, 1), 'write_ssrcid': (2, 4), 'write_vfid': (5, 8), 'write_vf': (12, 12), 'write_vmid': (13, 16), 'tmz': (17, 17), 'cp_secure_wr_illegal': (18, 18), 'write_pipeid': (20, 21), 'write_meid': (22, 23), 'write_error': (31, 31)}), + 'regGRBM_IOV_ERROR': (32, 0, {'iov_addr': (2, 19), 'iov_vfid': (20, 25), 'iov_vf': (26, 26), 'iov_op': (27, 27), 'iov_error': (31, 31)}), + 'regGRBM_CHIP_REVISION': (33, 0, {'chip_revision': (0, 7)}), + 'regGRBM_GFX_CNTL': (34, 0, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10)}), + 'regGRBM_RSMU_CFG': (35, 0, {'aperture_id': (0, 11), 'qos': (12, 15), 'posted_wr': (16, 16), 'debug_mask': (17, 17)}), + 'regGRBM_IH_CREDIT': (36, 0, {'credit_value': (0, 1), 'ih_client_id': (16, 23)}), + 'regGRBM_PWR_CNTL2': (37, 0, {'pwr_request_halt': (16, 16), 'pwr_gfx3d_request_halt': (20, 20)}), + 'regGRBM_UTCL2_INVAL_RANGE_START': (38, 0, {'data': (0, 17)}), + 'regGRBM_UTCL2_INVAL_RANGE_END': (39, 0, {'data': (0, 17)}), + 'regGRBM_RSMU_READ_ERROR': (40, 0, {'rsmu_read_address': (2, 19), 'rsmu_read_vf': (20, 20), 'rsmu_read_vfid': (21, 26), 'rsmu_read_error_type': (27, 27), 'rsmu_read_error': (31, 31)}), + 'regGRBM_CHICKEN_BITS': (41, 0, {'disable_cp_vmid_reset_req': (0, 0)}), + 'regGRBM_FENCE_RANGE0': (42, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_FENCE_RANGE1': (43, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_IOV_READ_ERROR': (44, 0, {'iov_addr': (2, 19), 'iov_vfid': (20, 25), 'iov_vf': (26, 26), 'iov_op': (27, 27), 'iov_error': (31, 31)}), + 'regGRBM_NOWHERE': (63, 0, {'data': (0, 31)}), + 'regGRBM_SCRATCH_REG0': (64, 0, {'scratch_reg0': (0, 31)}), + 'regGRBM_SCRATCH_REG1': (65, 0, {'scratch_reg1': (0, 31)}), + 'regGRBM_SCRATCH_REG2': (66, 0, {'scratch_reg2': (0, 31)}), + 'regGRBM_SCRATCH_REG3': (67, 0, {'scratch_reg3': (0, 31)}), + 'regGRBM_SCRATCH_REG4': (68, 0, {'scratch_reg4': (0, 31)}), + 'regGRBM_SCRATCH_REG5': (69, 0, {'scratch_reg5': (0, 31)}), + 'regGRBM_SCRATCH_REG6': (70, 0, {'scratch_reg6': (0, 31)}), + 'regGRBM_SCRATCH_REG7': (71, 0, {'scratch_reg7': (0, 31)}), + 'regCP_MEC_CNTL': (141, 0, {'mec_invalidate_icache': (4, 4), 'mec_me1_pipe0_reset': (16, 16), 'mec_me1_pipe1_reset': (17, 17), 'mec_me1_pipe2_reset': (18, 18), 'mec_me1_pipe3_reset': (19, 19), 'mec_me2_pipe0_reset': (20, 20), 'mec_me2_pipe1_reset': (21, 21), 'mec_me2_halt': (28, 28), 'mec_me2_step': (29, 29), 'mec_me1_halt': (30, 30), 'mec_me1_step': (31, 31)}), + 'regCP_MEC_ME1_HEADER_DUMP': (142, 0, {'header_dump': (0, 31)}), + 'regCP_MEC_ME2_HEADER_DUMP': (143, 0, {'header_dump': (0, 31)}), + 'regCP_STAT': (416, 0, {'roq_ring_busy': (9, 9), 'roq_indirect1_busy': (10, 10), 'roq_indirect2_busy': (11, 11), 'roq_state_busy': (12, 12), 'dc_busy': (13, 13), 'utcl2iu_busy': (14, 14), 'pfp_busy': (15, 15), 'meq_busy': (16, 16), 'me_busy': (17, 17), 'query_busy': (18, 18), 'semaphore_busy': (19, 19), 'interrupt_busy': (20, 20), 'surface_sync_busy': (21, 21), 'dma_busy': (22, 22), 'rciu_busy': (23, 23), 'scratch_ram_busy': (24, 24), 'ce_busy': (26, 26), 'tciu_busy': (27, 27), 'roq_ce_ring_busy': (28, 28), 'roq_ce_indirect1_busy': (29, 29), 'roq_ce_indirect2_busy': (30, 30), 'cp_busy': (31, 31)}), + 'regCP_MEC1_INSTR_PNTR': (424, 0, {'instr_pntr': (0, 15)}), + 'regCP_MEC2_INSTR_PNTR': (425, 0, {'instr_pntr': (0, 15)}), + 'regCP_ME_CNTL': (438, 0, {'ce_invalidate_icache': (4, 4), 'pfp_invalidate_icache': (6, 6), 'me_invalidate_icache': (8, 8), 'ce_pipe0_reset': (16, 16), 'ce_pipe1_reset': (17, 17), 'pfp_pipe0_reset': (18, 18), 'pfp_pipe1_reset': (19, 19), 'me_pipe0_reset': (20, 20), 'me_pipe1_reset': (21, 21), 'ce_halt': (24, 24), 'ce_step': (25, 25), 'pfp_halt': (26, 26), 'pfp_step': (27, 27), 'me_halt': (28, 28), 'me_step': (29, 29)}), + 'regCP_RB_WPTR_POLL_CNTL': (450, 0, {'poll_frequency': (0, 15), 'idle_poll_count': (16, 31)}), + 'regSH_MEM_BASES': (778, 0, {'private_base': (0, 15), 'shared_base': (16, 31)}), + 'regSH_MEM_CONFIG': (781, 0, {'address_mode': (0, 0), 'alignment_mode': (3, 4), 'f8_mode': (8, 8), 'precision_mode': (9, 9), 'retry_disable': (12, 12), 'private_nv': (13, 13)}), + 'regSQ_THREAD_TRACE_WORD_CMN': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4)}), + 'regSQ_THREAD_TRACE_WORD_EVENT': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'sh_id': (5, 5), 'stage': (6, 8), 'event_type': (10, 15)}), + 'regSQ_THREAD_TRACE_WORD_INST': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'wave_id': (5, 8), 'simd_id': (9, 10), 'inst_type': (11, 15)}), + 'regSQ_THREAD_TRACE_WORD_INST_PC_1_OF_2': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'wave_id': (5, 8), 'simd_id': (9, 10), 'trap_error': (15, 15), 'pc_lo': (16, 31)}), + 'regSQ_THREAD_TRACE_WORD_INST_USERDATA_1_OF_2': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'priv': (5, 5), 'cu_id': (6, 9), 'wave_id': (10, 13), 'simd_id': (14, 15), 'data_lo': (16, 31)}), + 'regSQ_THREAD_TRACE_WORD_ISSUE': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'simd_id': (5, 6), 'inst0': (8, 9), 'inst1': (10, 11), 'inst2': (12, 13), 'inst3': (14, 15), 'inst4': (16, 17), 'inst5': (18, 19), 'inst6': (20, 21), 'inst7': (22, 23), 'inst8': (24, 25), 'inst9': (26, 27)}), + 'regSQ_THREAD_TRACE_WORD_MISC': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 11), 'sh_id': (12, 12), 'misc_token_type': (13, 15)}), + 'regSQ_THREAD_TRACE_WORD_PERF_1_OF_2': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'sh_id': (5, 5), 'cu_id': (6, 9), 'cntr_bank': (10, 11), 'cntr0': (12, 24), 'cntr1_lo': (25, 31)}), + 'regSQ_THREAD_TRACE_WORD_REG_1_OF_2': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'pipe_id': (5, 6), 'me_id': (7, 8), 'reg_dropped_prev': (9, 9), 'reg_type': (10, 12), 'reg_priv': (14, 14), 'reg_op': (15, 15), 'reg_addr': (16, 31)}), + 'regSQ_THREAD_TRACE_WORD_REG_2_OF_2': (944, 0, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_WORD_REG_CS_1_OF_2': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'pipe_id': (5, 6), 'me_id': (7, 8), 'reg_addr': (9, 15), 'data_lo': (16, 31)}), + 'regSQ_THREAD_TRACE_WORD_REG_CS_2_OF_2': (944, 0, {'data_hi': (0, 15)}), + 'regSQ_THREAD_TRACE_WORD_TIMESTAMP_1_OF_2': (944, 0, {'token_type': (0, 3), 'time_lo': (16, 31)}), + 'regSQ_THREAD_TRACE_WORD_WAVE': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'sh_id': (5, 5), 'cu_id': (6, 9), 'wave_id': (10, 13), 'simd_id': (14, 15)}), + 'regSQ_THREAD_TRACE_WORD_WAVE_START': (944, 0, {'token_type': (0, 3), 'time_delta': (4, 4), 'sh_id': (5, 5), 'cu_id': (6, 9), 'wave_id': (10, 13), 'simd_id': (14, 15), 'dispatcher': (16, 20), 'vs_no_alloc_or_grouped': (21, 21), 'count': (22, 28), 'tg_id': (29, 31)}), + 'regSQ_THREAD_TRACE_WORD_INST_PC_2_OF_2': (945, 0, {'pc_hi': (0, 23)}), + 'regSQ_THREAD_TRACE_WORD_INST_USERDATA_2_OF_2': (945, 0, {'data_hi': (0, 15)}), + 'regSQ_THREAD_TRACE_WORD_PERF_2_OF_2': (945, 0, {'cntr1_hi': (0, 5), 'cntr2': (6, 18), 'cntr3': (19, 31)}), + 'regSQ_THREAD_TRACE_WORD_TIMESTAMP_2_OF_2': (945, 0, {'time_hi': (0, 31)}), + 'regGB_ADDR_CONFIG': (1598, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'bank_interleave_size': (8, 10), 'num_banks': (12, 14), 'shader_engine_tile_size': (16, 18), 'num_shader_engines': (19, 20), 'num_gpus': (21, 23), 'multi_gpu_tile_size': (24, 25), 'num_rb_per_se': (26, 27), 'row_size': (28, 29), 'num_lower_pipes': (30, 30), 'se_enable': (31, 31)}), + 'regGB_ADDR_CONFIG_READ': (1602, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'bank_interleave_size': (8, 10), 'num_banks': (12, 14), 'shader_engine_tile_size': (16, 18), 'num_shader_engines': (19, 20), 'num_gpus': (21, 23), 'multi_gpu_tile_size': (24, 25), 'num_rb_per_se': (26, 27), 'row_size': (28, 29), 'num_lower_pipes': (30, 30), 'se_enable': (31, 31)}), + 'regGCVM_L2_CNTL': (2080, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regGCVM_L2_CNTL2': (2081, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regGCVM_L2_CNTL3': (2082, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regGCVM_L2_STATUS': (2083, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regGCVM_DUMMY_PAGE_FAULT_CNTL': (2084, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_LO32': (2085, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_HI32': (2086, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL': (2087, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL2': (2088, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL3': (2089, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL4': (2090, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_STATUS': (2091, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'uce': (29, 29), 'fed': (30, 30)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_LO32': (2092, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_HI32': (2093, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (2094, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (2095, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (2097, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (2098, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (2099, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (2100, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (2101, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (2102, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regGCVM_L2_CNTL4': (2103, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30)}), + 'regGCVM_L2_CNTL5': (2104, 0, {'walker_fetch_pde_mtype_enable': (0, 0), 'walker_fetch_pde_noalloc_enable': (1, 1)}), + 'regGCVM_L2_MM_GROUP_RT_CLASSES': (2105, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID': (2106, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID2': (2107, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25)}), + 'regGCVM_L2_CACHE_PARITY_CNTL': (2108, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regGCVM_L2_CGTT_CLK_CTRL': (2109, 0, {'on_delay': (0, 3), 'off_hysteresis': (4, 11), 'mgls_override': (15, 15), 'soft_stall_override': (16, 23), 'soft_override': (24, 31)}), + 'regGCVM_L2_CGTT_BUSY_CTRL': (2110, 0, {'read_delay': (0, 3), 'always_busy': (4, 4)}), + 'regGCVM_CONTEXT0_CNTL': (2144, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT1_CNTL': (2145, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT2_CNTL': (2146, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT3_CNTL': (2147, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT4_CNTL': (2148, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT5_CNTL': (2149, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT6_CNTL': (2150, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT7_CNTL': (2151, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT8_CNTL': (2152, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT9_CNTL': (2153, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT10_CNTL': (2154, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT11_CNTL': (2155, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT12_CNTL': (2156, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT13_CNTL': (2157, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT14_CNTL': (2158, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT15_CNTL': (2159, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXTS_DISABLE': (2160, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regGCVM_INVALIDATE_ENG0_SEM': (2161, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG1_SEM': (2162, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG2_SEM': (2163, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG3_SEM': (2164, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG4_SEM': (2165, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG5_SEM': (2166, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG6_SEM': (2167, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG7_SEM': (2168, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG8_SEM': (2169, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG9_SEM': (2170, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG10_SEM': (2171, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG11_SEM': (2172, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG12_SEM': (2173, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG13_SEM': (2174, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG14_SEM': (2175, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG15_SEM': (2176, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG16_SEM': (2177, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG17_SEM': (2178, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG0_REQ': (2179, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG1_REQ': (2180, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG2_REQ': (2181, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG3_REQ': (2182, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG4_REQ': (2183, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG5_REQ': (2184, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG6_REQ': (2185, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG7_REQ': (2186, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG8_REQ': (2187, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG9_REQ': (2188, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG10_REQ': (2189, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG11_REQ': (2190, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG12_REQ': (2191, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG13_REQ': (2192, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG14_REQ': (2193, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG15_REQ': (2194, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG16_REQ': (2195, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG17_REQ': (2196, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regGCVM_INVALIDATE_ENG0_ACK': (2197, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG1_ACK': (2198, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG2_ACK': (2199, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG3_ACK': (2200, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG4_ACK': (2201, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG5_ACK': (2202, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG6_ACK': (2203, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG7_ACK': (2204, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG8_ACK': (2205, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG9_ACK': (2206, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG10_ACK': (2207, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG11_ACK': (2208, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG12_ACK': (2209, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG13_ACK': (2210, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG14_ACK': (2211, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG15_ACK': (2212, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG16_ACK': (2213, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG17_ACK': (2214, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (2215, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (2216, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (2217, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (2218, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (2219, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (2220, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (2221, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (2222, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (2223, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (2224, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (2225, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (2226, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (2227, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (2228, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (2229, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (2230, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (2231, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (2232, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (2233, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (2234, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (2235, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (2236, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (2237, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (2238, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (2239, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (2240, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (2241, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (2242, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (2243, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (2244, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (2245, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (2246, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (2247, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (2248, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (2249, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (2250, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (2251, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (2252, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (2253, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (2254, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (2255, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (2256, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (2257, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (2258, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (2259, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (2260, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (2261, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (2262, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (2263, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (2264, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (2265, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (2266, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (2267, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (2268, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (2269, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (2270, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (2271, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (2272, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (2273, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (2274, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (2275, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (2276, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (2277, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (2278, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (2279, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (2280, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (2281, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (2282, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (2283, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (2284, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (2285, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (2286, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (2287, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (2288, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (2289, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (2290, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (2291, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (2292, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (2293, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (2294, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (2295, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (2296, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (2297, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (2298, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (2299, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (2300, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (2301, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (2302, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (2303, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (2304, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (2305, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (2306, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (2307, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (2308, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (2309, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (2310, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (2311, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (2312, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (2313, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (2314, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (2315, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (2316, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (2317, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (2318, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (2319, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (2320, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (2321, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (2322, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (2323, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (2324, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (2325, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (2326, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (2327, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (2328, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (2329, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (2330, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (2331, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (2332, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (2333, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (2334, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (2335, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (2336, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (2337, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (2338, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (2339, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (2340, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (2341, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (2342, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (2343, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (2344, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (2345, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (2346, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCMC_VM_NB_MMIOBASE': (2368, 0, {'mmiobase': (0, 31)}), + 'regGCMC_VM_NB_MMIOLIMIT': (2369, 0, {'mmiolimit': (0, 31)}), + 'regGCMC_VM_NB_PCI_CTRL': (2370, 0, {'mmioenable': (23, 23)}), + 'regGCMC_VM_NB_PCI_ARB': (2371, 0, {'vga_hole': (3, 3)}), + 'regGCMC_VM_NB_TOP_OF_DRAM_SLOT1': (2372, 0, {'top_of_dram': (23, 31)}), + 'regGCMC_VM_NB_LOWER_TOP_OF_DRAM2': (2373, 0, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regGCMC_VM_NB_UPPER_TOP_OF_DRAM2': (2374, 0, {'upper_tom2': (0, 15)}), + 'regGCMC_VM_FB_OFFSET': (2375, 0, {'fb_offset': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (2376, 0, {'physical_page_number_lsb': (0, 31)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (2377, 0, {'physical_page_number_msb': (0, 3)}), + 'regGCMC_VM_STEERING': (2378, 0, {'default_steering': (0, 1)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_START': (2381, 0, {'address': (0, 23)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_END': (2382, 0, {'address': (0, 23)}), + 'regGCMC_VM_APT_CNTL': (2385, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'check_is_local': (2, 2), 'perms_granted': (3, 3), 'local_sysmem_aperture_cntl': (4, 5)}), + 'regGCMC_VM_LOCAL_HBM_ADDRESS_START': (2386, 0, {'address': (0, 23)}), + 'regGCMC_VM_LOCAL_HBM_ADDRESS_END': (2387, 0, {'address': (0, 23)}), + 'regGCMC_VM_LOCAL_HBM_ADDRESS_LOCK_CNTL': (2388, 0, {'lock': (0, 0)}), + 'regGCMC_VM_XGMI_LFB_CNTL': (2391, 0, {'pf_lfb_region': (0, 3), 'pf_max_region': (4, 7)}), + 'regGCMC_VM_XGMI_LFB_SIZE': (2392, 0, {'pf_lfb_size': (0, 16)}), + 'regGCMC_VM_CACHEABLE_DRAM_CNTL': (2393, 0, {'enable_cacheable_dram_address_aperture': (0, 0)}), + 'regGCMC_VM_HOST_MAPPING': (2394, 0, {'mode': (0, 0)}), + 'regGCMC_VM_FB_LOCATION_BASE': (2396, 0, {'fb_base': (0, 23)}), + 'regGCMC_VM_FB_LOCATION_TOP': (2397, 0, {'fb_top': (0, 23)}), + 'regGCMC_VM_AGP_TOP': (2398, 0, {'agp_top': (0, 23)}), + 'regGCMC_VM_AGP_BOT': (2399, 0, {'agp_bot': (0, 23)}), + 'regGCMC_VM_AGP_BASE': (2400, 0, {'agp_base': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_LOW_ADDR': (2401, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (2402, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_MX_L1_TLB_CNTL': (2403, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 12), 'atc_en': (13, 13)}), + 'regTCP_INVALIDATE': (2816, 0, {'start': (0, 0)}), + 'regTCP_STATUS': (2817, 0, {'tcp_busy': (0, 0), 'input_busy': (1, 1), 'adrs_busy': (2, 2), 'tagrams_busy': (3, 3), 'cntrl_busy': (4, 4), 'lfifo_busy': (5, 5), 'read_busy': (6, 6), 'format_busy': (7, 7), 'vm_busy': (8, 8)}), + 'regTCP_CNTL': (2818, 0, {'force_hit': (0, 0), 'force_miss': (1, 1), 'l1_size': (2, 3), 'flat_buf_hash_enable': (4, 4), 'flat_buf_cache_swizzle': (5, 5), 'force_eow_total_cnt': (15, 20), 'force_eow_tagram_cnt': (22, 27), 'disable_z_map': (28, 28)}), + 'regTCP_CHAN_STEER_0': (2819, 0, {'chan0': (0, 3), 'chan1': (4, 7), 'chan2': (8, 11), 'chan3': (12, 15), 'chan4': (16, 19), 'chan5': (20, 23), 'chan6': (24, 27), 'chan7': (28, 31)}), + 'regTCP_CHAN_STEER_1': (2820, 0, {'chan8': (0, 3), 'chan9': (4, 7), 'chana': (8, 11), 'chanb': (12, 15), 'chanc': (16, 19), 'chand': (20, 23), 'chane': (24, 27), 'chanf': (28, 31)}), + 'regTCP_ADDR_CONFIG': (2821, 0, {'num_tcc_banks': (0, 4), 'enable64khash': (11, 11), 'enable2mhash': (12, 12), 'enable1ghash': (13, 13), 'enable1thash': (14, 14), 'enable4khash': (15, 15)}), + 'regTCP_CREDIT': (2822, 0, {'lfifo_credit': (0, 10), 'req_fifo_credit': (16, 22), 'td_credit': (29, 31)}), + 'regTCP_BUFFER_ADDR_HASH_CNTL': (2838, 0, {'channel_bits': (0, 2), 'bank_bits': (8, 10), 'channel_xor_count': (16, 18), 'bank_xor_count': (24, 26)}), + 'regTCP_UE_EDC_HI_REG': (2900, 0, {'ecc': (0, 0), 'parity': (1, 1), 'err_info_valid_flag': (2, 2), 'err_info': (3, 22), 'ue_cnt': (23, 25), 'fed_cnt': (26, 28), 'reserved': (29, 31)}), + 'regTCP_UE_EDC_LO_REG': (2901, 0, {'status_valid_flag': (0, 0), 'address_info_valid_flag': (1, 1), 'address': (2, 23), 'mem_id': (24, 31)}), + 'regTCP_CE_EDC_HI_REG': (2902, 0, {'ecc': (0, 0), 'err_info_valid_flag': (2, 2), 'err_info': (3, 22), 'ce_cnt': (23, 25), 'poison': (26, 26), 'reserved': (27, 31)}), + 'regTCP_CE_EDC_LO_REG': (2903, 0, {'status_valid_flag': (0, 0), 'address_info_valid_flag': (1, 1), 'address': (2, 23), 'mem_id': (24, 31)}), + 'regCOMPUTE_DISPATCH_INITIATOR': (3584, 0, {'compute_shader_en': (0, 0), 'partial_tg_en': (1, 1), 'force_start_at_000': (2, 2), 'ordered_append_enbl': (3, 3), 'ordered_append_mode': (4, 4), 'use_thread_dimensions': (5, 5), 'order_mode': (6, 6), 'scalar_l1_inv_vol': (10, 10), 'vector_l1_inv_vol': (11, 11), 'reserved': (12, 12), 'restore': (14, 14)}), + 'regCOMPUTE_DIM_X': (3585, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Y': (3586, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Z': (3587, 0, {'size': (0, 31)}), + 'regCOMPUTE_START_X': (3588, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Y': (3589, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Z': (3590, 0, {'start': (0, 31)}), + 'regCOMPUTE_NUM_THREAD_X': (3591, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Y': (3592, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Z': (3593, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_PIPELINESTAT_ENABLE': (3594, 0, {'pipelinestat_enable': (0, 0)}), + 'regCOMPUTE_PERFCOUNT_ENABLE': (3595, 0, {'perfcount_enable': (0, 0)}), + 'regCOMPUTE_PGM_LO': (3596, 0, {'data': (0, 31)}), + 'regCOMPUTE_PGM_HI': (3597, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_LO': (3598, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_HI': (3599, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_LO': (3600, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_HI': (3601, 0, {'data': (0, 7)}), + 'regCOMPUTE_PGM_RSRC1': (3602, 0, {'vgprs': (0, 5), 'sgprs': (6, 9), 'priority': (10, 11), 'float_mode': (12, 19), 'priv': (20, 20), 'dx10_clamp': (21, 21), 'debug_mode': (22, 22), 'ieee_mode': (23, 23), 'bulky': (24, 24), 'cdbg_user': (25, 25), 'fp16_ovfl': (26, 26)}), + 'regCOMPUTE_PGM_RSRC2': (3603, 0, {'scratch_en': (0, 0), 'user_sgpr': (1, 5), 'trap_present': (6, 6), 'tgid_x_en': (7, 7), 'tgid_y_en': (8, 8), 'tgid_z_en': (9, 9), 'tg_size_en': (10, 10), 'tidig_comp_cnt': (11, 12), 'excp_en_msb': (13, 14), 'lds_size': (15, 23), 'excp_en': (24, 30), 'skip_usgpr0': (31, 31)}), + 'regCOMPUTE_VMID': (3604, 0, {'data': (0, 3)}), + 'regCOMPUTE_RESOURCE_LIMITS': (3605, 0, {'waves_per_sh': (0, 9), 'tg_per_cu': (12, 15), 'lock_threshold': (16, 21), 'simd_dest_cntl': (22, 22), 'force_simd_dist': (23, 23), 'cu_group_count': (24, 26), 'simd_disable': (27, 30)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE0': (3606, 0, {'sh0_cu_en': (0, 15), 'sh1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE1': (3607, 0, {'sh0_cu_en': (0, 15), 'sh1_cu_en': (16, 31)}), + 'regCOMPUTE_TMPRING_SIZE': (3608, 0, {'waves': (0, 11), 'wavesize': (12, 24)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE2': (3609, 0, {'sh0_cu_en': (0, 15), 'sh1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE3': (3610, 0, {'sh0_cu_en': (0, 15), 'sh1_cu_en': (16, 31)}), + 'regCOMPUTE_RESTART_X': (3611, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Y': (3612, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Z': (3613, 0, {'restart': (0, 31)}), + 'regCOMPUTE_THREAD_TRACE_ENABLE': (3614, 0, {'thread_trace_enable': (0, 0)}), + 'regCOMPUTE_MISC_RESERVED': (3615, 0, {'send_seid': (0, 1), 'wave_id_base': (5, 16)}), + 'regCOMPUTE_DISPATCH_ID': (3616, 0, {'dispatch_id': (0, 31)}), + 'regCOMPUTE_THREADGROUP_ID': (3617, 0, {'threadgroup_id': (0, 31)}), + 'regCOMPUTE_RELAUNCH': (3618, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_LO': (3619, 0, {'addr': (0, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_HI': (3620, 0, {'addr': (0, 15)}), + 'regCOMPUTE_TG_CHUNK_SIZE': (3623, 0, {'tg_chunk_size': (0, 15)}), + 'regCOMPUTE_SHADER_CHKSUM': (3628, 0, {'checksum': (0, 31)}), + 'regCOMPUTE_PGM_RSRC3': (3629, 0, {'accum_offset': (0, 5), 'trap_on_start': (10, 10), 'trap_on_end': (11, 11), 'tg_split': (16, 16)}), + 'regCOMPUTE_USER_DATA_0': (3648, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_1': (3649, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_2': (3650, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_3': (3651, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_4': (3652, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_5': (3653, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_6': (3654, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_7': (3655, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_8': (3656, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_9': (3657, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_10': (3658, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_11': (3659, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_12': (3660, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_13': (3661, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_14': (3662, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_15': (3663, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_END': (3710, 0, {'data': (0, 31)}), + 'regCOMPUTE_NOWHERE': (3711, 0, {'data': (0, 31)}), + 'regCP_INT_CNTL': (4169, 0, {'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC_DOORBELL_RANGE_LOWER': (4188, 0, {'doorbell_range_lower': (2, 27)}), + 'regCP_MEC_DOORBELL_RANGE_UPPER': (4189, 0, {'doorbell_range_upper': (2, 27)}), + 'regCP_INT_CNTL_RING0': (4202, 0, {'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_INT_CNTL_RING1': (4203, 0, {'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_INT_CNTL_RING2': (4204, 0, {'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC1_F32_INTERRUPT': (4214, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_MEC2_F32_INTERRUPT': (4215, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_PFP_PRGRM_CNTR_START': (4260, 0, {'ip_start': (0, 12)}), + 'regCP_ME_PRGRM_CNTR_START': (4261, 0, {'ip_start': (0, 11)}), + 'regCP_MEC1_PRGRM_CNTR_START': (4262, 0, {'ip_start': (0, 15)}), + 'regCP_MEC2_PRGRM_CNTR_START': (4263, 0, {'ip_start': (0, 15)}), + 'regCP_MEC1_INTR_ROUTINE_START': (4267, 0, {'ir_start': (0, 15)}), + 'regCP_MEC2_INTR_ROUTINE_START': (4268, 0, {'ir_start': (0, 15)}), + 'regCP_MEC1_F32_INT_DIS': (4285, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_MEC2_F32_INT_DIS': (4286, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regSPI_COMPUTE_QUEUE_RESET': (4571, 0, {'reset': (0, 0)}), + 'regCP_HQD_GFX_CONTROL': (4670, 0, {'message': (0, 3), 'misc': (4, 14), 'db_updated_msg_en': (15, 15)}), + 'regCP_HQD_GFX_STATUS': (4671, 0, {'status': (0, 15)}), + 'regCP_MQD_BASE_ADDR': (4677, 0, {'base_addr': (2, 31)}), + 'regCP_MQD_BASE_ADDR_HI': (4678, 0, {'base_addr_hi': (0, 15)}), + 'regCP_HQD_ACTIVE': (4679, 0, {'active': (0, 0), 'busy_gate': (1, 1)}), + 'regCP_HQD_VMID': (4680, 0, {'vmid': (0, 3), 'ib_vmid': (8, 11), 'vqid': (16, 25)}), + 'regCP_HQD_PERSISTENT_STATE': (4681, 0, {'preload_req': (0, 0), 'preload_size': (8, 17), 'wpp_switch_qos_en': (21, 21), 'iq_switch_qos_en': (22, 22), 'ib_switch_qos_en': (23, 23), 'eop_switch_qos_en': (24, 24), 'pq_switch_qos_en': (25, 25), 'tc_offload_qos_en': (26, 26), 'cache_full_packet_en': (27, 27), 'restore_active': (28, 28), 'relaunch_waves': (29, 29), 'qswitch_mode': (30, 30), 'disp_active': (31, 31)}), + 'regCP_HQD_PIPE_PRIORITY': (4682, 0, {'pipe_priority': (0, 1)}), + 'regCP_HQD_QUEUE_PRIORITY': (4683, 0, {'priority_level': (0, 3)}), + 'regCP_HQD_QUANTUM': (4684, 0, {'quantum_en': (0, 0), 'quantum_scale': (4, 4), 'quantum_duration': (8, 13), 'quantum_active': (31, 31)}), + 'regCP_HQD_PQ_BASE': (4685, 0, {'addr': (0, 31)}), + 'regCP_HQD_PQ_BASE_HI': (4686, 0, {'addr_hi': (0, 7)}), + 'regCP_HQD_PQ_RPTR': (4687, 0, {'consumed_offset': (0, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR': (4688, 0, {'rptr_report_addr': (2, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR_HI': (4689, 0, {'rptr_report_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR': (4690, 0, {'wptr_addr': (3, 31)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR_HI': (4691, 0, {'wptr_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_DOORBELL_CONTROL': (4692, 0, {'doorbell_mode': (0, 0), 'doorbell_bif_drop': (1, 1), 'doorbell_offset': (2, 27), 'doorbell_source': (28, 28), 'doorbell_schd_hit': (29, 29), 'doorbell_en': (30, 30), 'doorbell_hit': (31, 31)}), + 'regCP_HQD_PQ_CONTROL': (4694, 0, {'queue_size': (0, 5), 'wptr_carry': (6, 6), 'rptr_carry': (7, 7), 'rptr_block_size': (8, 13), 'queue_full_en': (14, 14), 'pq_empty': (15, 15), 'wpp_clamp_en': (16, 16), 'endian_swap': (17, 18), 'min_avail_size': (20, 21), 'tmz': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 24), 'slot_based_wptr': (25, 26), 'no_update_rptr': (27, 27), 'unord_dispatch': (28, 28), 'roq_pq_ib_flip': (29, 29), 'priv_state': (30, 30), 'kmd_queue': (31, 31)}), + 'regCP_HQD_IB_BASE_ADDR': (4695, 0, {'ib_base_addr': (2, 31)}), + 'regCP_HQD_IB_BASE_ADDR_HI': (4696, 0, {'ib_base_addr_hi': (0, 15)}), + 'regCP_HQD_IB_RPTR': (4697, 0, {'consumed_offset': (0, 19)}), + 'regCP_HQD_IB_CONTROL': (4698, 0, {'ib_size': (0, 19), 'min_ib_avail_size': (20, 21), 'ib_exe_disable': (23, 23), 'ib_cache_policy': (24, 24), 'ib_priv_state': (30, 30), 'processing_ib': (31, 31)}), + 'regCP_HQD_IQ_TIMER': (4699, 0, {'wait_time': (0, 7), 'retry_type': (8, 10), 'immediate_expire': (11, 11), 'interrupt_type': (12, 13), 'clock_count': (14, 15), 'interrupt_size': (16, 21), 'quantum_timer': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 24), 'queue_type': (25, 25), 'rearm_timer': (28, 28), 'process_iq_en': (29, 29), 'processing_iq': (30, 30), 'active': (31, 31)}), + 'regCP_HQD_IQ_RPTR': (4700, 0, {'offset': (0, 5)}), + 'regCP_HQD_DEQUEUE_REQUEST': (4701, 0, {'dequeue_req': (0, 2), 'iq_req_pend': (4, 4), 'dequeue_int': (8, 8), 'iq_req_pend_en': (9, 9), 'dequeue_req_en': (10, 10)}), + 'regCP_HQD_DMA_OFFLOAD': (4702, 0, {'dma_offload': (0, 0)}), + 'regCP_HQD_OFFLOAD': (4702, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_SEMA_CMD': (4703, 0, {'retry': (0, 0), 'result': (1, 2)}), + 'regCP_HQD_MSG_TYPE': (4704, 0, {'action': (0, 2), 'save_state': (4, 6)}), + 'regCP_HQD_ATOMIC0_PREOP_LO': (4705, 0, {'atomic0_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC0_PREOP_HI': (4706, 0, {'atomic0_preop_hi': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_LO': (4707, 0, {'atomic1_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_HI': (4708, 0, {'atomic1_preop_hi': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER0': (4709, 0, {'scheduler': (0, 31)}), + 'regCP_HQD_HQ_STATUS0': (4709, 0, {'dequeue_status': (0, 1), 'dequeue_retry_cnt': (2, 3), 'rsv_6_4': (4, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'pg_activated': (9, 9), 'rsvr_29_10': (10, 29), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_CONTROL0': (4710, 0, {'control': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER1': (4710, 0, {'scheduler': (0, 31)}), + 'regCP_MQD_CONTROL': (4711, 0, {'vmid': (0, 3), 'priv_state': (8, 8), 'processing_mqd': (12, 12), 'processing_mqd_en': (13, 13), 'exe_disable': (23, 23), 'cache_policy': (24, 24)}), + 'regCP_HQD_HQ_STATUS1': (4712, 0, {'status': (0, 31)}), + 'regCP_HQD_HQ_CONTROL1': (4713, 0, {'control': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR': (4714, 0, {'base_addr': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR_HI': (4715, 0, {'base_addr_hi': (0, 7)}), + 'regCP_HQD_EOP_CONTROL': (4716, 0, {'eop_size': (0, 5), 'processing_eop': (8, 8), 'process_eop_en': (12, 12), 'processing_eopib': (13, 13), 'process_eopib_en': (14, 14), 'halt_fetcher': (21, 21), 'halt_fetcher_en': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 24), 'sig_sem_result': (29, 30), 'pend_sig_sem': (31, 31)}), + 'regCP_HQD_EOP_RPTR': (4717, 0, {'rptr': (0, 12), 'reset_fetcher': (28, 28), 'dequeue_pend': (29, 29), 'rptr_eq_csmd_wptr': (30, 30), 'init_fetcher': (31, 31)}), + 'regCP_HQD_EOP_WPTR': (4718, 0, {'wptr': (0, 12), 'eop_empty': (15, 15), 'eop_avail': (16, 28)}), + 'regCP_HQD_EOP_EVENTS': (4719, 0, {'event_count': (0, 11), 'cs_partial_flush_pend': (16, 16)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_LO': (4720, 0, {'addr': (12, 31)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_HI': (4721, 0, {'addr_hi': (0, 15)}), + 'regCP_HQD_CTX_SAVE_CONTROL': (4722, 0, {'policy': (3, 3), 'exe_disable': (23, 23)}), + 'regCP_HQD_CNTL_STACK_OFFSET': (4723, 0, {'offset': (2, 15)}), + 'regCP_HQD_CNTL_STACK_SIZE': (4724, 0, {'size': (12, 15)}), + 'regCP_HQD_WG_STATE_OFFSET': (4725, 0, {'offset': (2, 26)}), + 'regCP_HQD_CTX_SAVE_SIZE': (4726, 0, {'size': (12, 26)}), + 'regCP_HQD_GDS_RESOURCE_STATE': (4727, 0, {'oa_required': (0, 0), 'oa_acquired': (1, 1), 'gws_size': (4, 9), 'gws_pntr': (12, 17)}), + 'regCP_HQD_ERROR': (4728, 0, {'edc_error_id': (0, 3), 'sua_error': (4, 4), 'aql_error': (5, 5), 'pq_utcl1_error': (8, 8), 'ib_utcl1_error': (9, 9), 'eop_utcl1_error': (10, 10), 'iq_utcl1_error': (11, 11), 'rrpt_utcl1_error': (12, 12), 'wpp_utcl1_error': (13, 13), 'sem_utcl1_error': (14, 14), 'dma_src_utcl1_error': (15, 15), 'dma_dst_utcl1_error': (16, 16), 'sr_utcl1_error': (17, 17), 'qu_utcl1_error': (18, 18), 'tc_utcl1_error': (19, 19)}), + 'regCP_HQD_EOP_WPTR_MEM': (4729, 0, {'wptr': (0, 12)}), + 'regCP_HQD_AQL_CONTROL': (4730, 0, {'control0': (0, 14), 'control0_en': (15, 15), 'control1': (16, 30), 'control1_en': (31, 31)}), + 'regCP_HQD_PQ_WPTR_LO': (4731, 0, {'offset': (0, 31)}), + 'regCP_HQD_PQ_WPTR_HI': (4732, 0, {'data': (0, 31)}), + 'regCP_HQD_AQL_CONTROL_1': (4733, 0, {'reserved': (0, 31)}), + 'regCP_HQD_AQL_DISPATCH_ID': (4734, 0, {'consumed_offset': (0, 31)}), + 'regCP_HQD_AQL_DISPATCH_ID_HI': (4735, 0, {'consumed_offset': (0, 31)}), + 'regTCP_WATCH0_ADDR_H': (4768, 0, {'addr': (0, 15)}), + 'regTCP_WATCH0_ADDR_L': (4769, 0, {'addr': (7, 31)}), + 'regTCP_WATCH0_CNTL': (4770, 0, {'mask': (0, 23), 'vmid': (24, 27), 'atc': (28, 28), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH1_ADDR_H': (4771, 0, {'addr': (0, 15)}), + 'regTCP_WATCH1_ADDR_L': (4772, 0, {'addr': (7, 31)}), + 'regTCP_WATCH1_CNTL': (4773, 0, {'mask': (0, 23), 'vmid': (24, 27), 'atc': (28, 28), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH2_ADDR_H': (4774, 0, {'addr': (0, 15)}), + 'regTCP_WATCH2_ADDR_L': (4775, 0, {'addr': (7, 31)}), + 'regTCP_WATCH2_CNTL': (4776, 0, {'mask': (0, 23), 'vmid': (24, 27), 'atc': (28, 28), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH3_ADDR_H': (4777, 0, {'addr': (0, 15)}), + 'regTCP_WATCH3_ADDR_L': (4778, 0, {'addr': (7, 31)}), + 'regTCP_WATCH3_CNTL': (4779, 0, {'mask': (0, 23), 'vmid': (24, 27), 'atc': (28, 28), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_GATCL1_CNTL': (4784, 0, {'invalidate_all_vmid': (25, 25), 'force_miss': (26, 26), 'force_in_order': (27, 27), 'reduce_fifo_depth_by_2': (28, 29), 'reduce_cache_size_by_2': (30, 31)}), + 'regTCP_ATC_EDC_GATCL1_CNT': (4785, 0, {'data_sec': (0, 7)}), + 'regTCP_GATCL1_DSM_CNTL': (4786, 0, {'sel_dsm_tcp_gatcl1_irritator_data_a0': (0, 0), 'sel_dsm_tcp_gatcl1_irritator_data_a1': (1, 1), 'tcp_gatcl1_enable_single_write_a': (2, 2)}), + 'regTCP_DSM_CNTL': (4787, 0, {'cache_ram_irritator_data_sel': (0, 1), 'cache_ram_irritator_single_write': (2, 2), 'lfifo_ram_irritator_data_sel': (3, 4), 'lfifo_ram_irritator_single_write': (5, 5), 'cmd_fifo_irritator_data_sel': (6, 7), 'cmd_fifo_irritator_single_write': (8, 8), 'vm_fifo_irritator_data_sel': (9, 10), 'vm_fifo_irritator_single_write': (11, 11), 'db_ram_irritator_data_sel': (12, 13), 'db_ram_irritator_single_write': (14, 14), 'utcl1_lfifo0_irritator_data_sel': (15, 16), 'utcl1_lfifo0_irritator_single_write': (17, 17), 'utcl1_lfifo1_irritator_data_sel': (18, 19), 'utcl1_lfifo1_irritator_single_write': (20, 20)}), + 'regTCP_CNTL2': (4788, 0, {'ls_disable_clocks': (0, 7), 'tcpf_fmt_mgcg_disable': (8, 8), 'tcpi_new_mgcg_ctrl_bit': (10, 10), 'miss_clk_disable': (11, 11), 'adrs_clk_disable': (12, 12), 'vm_clk_disable': (13, 13), 'tagram_clk_disable': (14, 14), 'legacy_mgcg_disable': (15, 15), 'mem_mid_gate_mgcg_disable': (19, 19), 'utcl1_mid_gate_mgcg_disable': (20, 20)}), + 'regTCP_UTCL1_CNTL1': (4789, 0, {'force_4k_l2_resp': (0, 0), 'gpuvm_64k_default': (1, 1), 'gpuvm_perm_mode': (2, 2), 'resp_mode': (3, 4), 'resp_fault_mode': (5, 6), 'clientid': (7, 15), 'utcl1_fgcg_repeater_disable': (16, 16), 'reg_inv_vmid': (19, 22), 'reg_inv_all_vmid': (23, 23), 'reg_inv_toggle': (24, 24), 'client_invalidate_all_vmid': (25, 25), 'force_miss': (26, 26), 'reduce_fifo_depth_by_2': (28, 29), 'reduce_cache_size_by_2': (30, 31)}), + 'regTCP_UTCL1_CNTL2': (4790, 0, {'spare': (0, 7), 'mtype_ovrd_dis': (9, 9), 'any_line_valid': (10, 10), 'gpuvm_inv_mode': (12, 12), 'force_snoop': (14, 14), 'force_gpuvm_inv_ack': (15, 15), 'force_frag_2m_to_64k': (26, 26), 'thrashing_timeout_protect_enable': (27, 27), 'thrashing_enable': (28, 28)}), + 'regTCP_UTCL1_STATUS': (4791, 0, {'fault_detected': (0, 0), 'retry_detected': (1, 1), 'prt_detected': (2, 2), 'timeout_detected': (3, 3)}), + 'regTCP_DSM_CNTL2': (4792, 0, {'cache_ram_enable_error_inject': (0, 1), 'cache_ram_select_inject_delay': (2, 2), 'lfifo_ram_enable_error_inject': (3, 4), 'lfifo_ram_select_inject_delay': (5, 5), 'cmd_fifo_enable_error_inject': (6, 7), 'cmd_fifo_select_inject_delay': (8, 8), 'vm_fifo_enable_error_inject': (9, 10), 'vm_fifo_select_inject_delay': (11, 11), 'db_ram_enable_error_inject': (12, 13), 'db_ram_select_inject_delay': (14, 14), 'utcl1_lfifo0_enable_error_inject': (15, 16), 'utcl1_lfifo0_select_inject_delay': (17, 17), 'utcl1_lfifo1_enable_error_inject': (18, 19), 'utcl1_lfifo1_select_inject_delay': (20, 20), 'tcp_inject_delay': (26, 31)}), + 'regTCP_PERFCOUNTER_FILTER': (4793, 0, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 4), 'data_format': (5, 10), 'num_format': (11, 14), 'sw_mode': (15, 19), 'num_samples': (20, 21), 'opcode_type': (22, 24), 'glc': (25, 25), 'slc': (26, 26), 'compression_enable': (27, 27), 'addr_mode': (28, 30)}), + 'regTCP_PERFCOUNTER_FILTER_EN': (4794, 0, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 2), 'data_format': (3, 3), 'num_format': (4, 4), 'sw_mode': (5, 5), 'num_samples': (6, 6), 'opcode_type': (7, 7), 'glc': (8, 8), 'slc': (9, 9), 'compression_enable': (10, 10), 'addr_mode': (11, 11)}), + 'regCP_PERFMON_CNTX_CNTL': (216, 1, {'perfmon_enable': (31, 31)}), + 'regSCRATCH_REG6': (8262, 1, {'scratch_reg6': (0, 31)}), + 'regSCRATCH_REG7': (8263, 1, {'scratch_reg7': (0, 31)}), + 'regCP_COHER_START_DELAY': (8315, 1, {'start_delay_count': (0, 5)}), + 'regRLC_GPM_PERF_COUNT_0': (8512, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sh_index': (8, 11), 'cu_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_PERF_COUNT_1': (8513, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sh_index': (8, 11), 'cu_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regGRBM_GFX_INDEX': (8704, 1, {'instance_index': (0, 7), 'sh_index': (8, 15), 'se_index': (16, 23), 'sh_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regSQ_THREAD_TRACE_BASE': (9008, 1, {'addr': (0, 31)}), + 'regSQ_THREAD_TRACE_SIZE': (9009, 1, {'size': (0, 21)}), + 'regSQ_THREAD_TRACE_MASK': (9010, 1, {'cu_sel': (0, 4), 'sh_sel': (5, 5), 'reg_stall_en': (7, 7), 'simd_en': (8, 11), 'vm_id_mask': (12, 13), 'spi_stall_en': (14, 14), 'sq_stall_en': (15, 15)}), + 'regSQ_THREAD_TRACE_TOKEN_MASK': (9011, 1, {'token_mask': (0, 15), 'reg_mask': (16, 23), 'reg_drop_on_stall': (24, 24)}), + 'regSQ_THREAD_TRACE_PERF_MASK': (9012, 1, {'sh0_mask': (0, 15), 'sh1_mask': (16, 31)}), + 'regSQ_THREAD_TRACE_CTRL': (9013, 1, {'reset_buffer': (31, 31)}), + 'regSQ_THREAD_TRACE_MODE': (9014, 1, {'mask_ps': (0, 2), 'mask_vs': (3, 5), 'mask_gs': (6, 8), 'mask_es': (9, 11), 'mask_hs': (12, 14), 'mask_ls': (15, 17), 'mask_cs': (18, 20), 'mode': (21, 22), 'capture_mode': (23, 24), 'autoflush_en': (25, 25), 'tc_perf_en': (26, 26), 'issue_mask': (27, 28), 'test_mode': (29, 29), 'interrupt_en': (30, 30), 'wrap': (31, 31)}), + 'regSQ_THREAD_TRACE_BASE2': (9015, 1, {'addr_hi': (0, 3)}), + 'regSQ_THREAD_TRACE_TOKEN_MASK2': (9016, 1, {'inst_mask': (0, 31)}), + 'regSQ_THREAD_TRACE_WPTR': (9017, 1, {'wptr': (0, 29), 'read_offset': (30, 31)}), + 'regSQ_THREAD_TRACE_STATUS': (9018, 1, {'finish_pending': (0, 9), 'finish_done': (16, 25), 'utc_error': (28, 28), 'new_buf': (29, 29), 'busy': (30, 30), 'full': (31, 31)}), + 'regSQ_THREAD_TRACE_HIWATER': (9019, 1, {'hiwater': (0, 2)}), + 'regSQ_THREAD_TRACE_CNTR': (9020, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_0': (9024, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_1': (9025, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_2': (9026, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_3': (9027, 1, {'data': (0, 31)}), + 'regSPI_CONFIG_CNTL': (9280, 1, {'gpr_write_priority': (0, 20), 'exp_priority_order': (21, 23), 'enable_sqg_top_events': (24, 24), 'enable_sqg_bop_events': (25, 25), 'rsrc_mgmt_reset': (26, 26), 'ttrace_stall_all': (27, 27), 'alloc_arb_lru_ena': (28, 28), 'exp_arb_lru_ena': (29, 29), 'ps_pkr_priority_cntl': (30, 31)}), + 'regSPI_CONFIG_CNTL_1': (9281, 1, {'vtx_done_delay': (0, 3), 'interp_one_prim_per_row': (4, 4), 'baton_reset_disable': (5, 5), 'pc_limit_enable': (6, 6), 'pc_limit_strict': (7, 7), 'crc_simd_id_waddr_disable': (8, 8), 'lbpw_cu_chk_mode': (9, 9), 'lbpw_cu_chk_cnt': (10, 13), 'csc_pwr_save_disable': (14, 14), 'csg_pwr_save_disable': (15, 15), 'pc_limit_size': (16, 31)}), + 'regSPI_CONFIG_CNTL_2': (9282, 1, {'context_save_wait_gds_request_cycle_ovhd': (0, 3), 'context_save_wait_gds_grant_cycle_ovhd': (4, 7)}), + 'regGRBM_PERFCOUNTER0_LO': (12352, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER0_HI': (12353, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_PERFCOUNTER1_LO': (12355, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER1_HI': (12356, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE0_PERFCOUNTER_LO': (12357, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE0_PERFCOUNTER_HI': (12358, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE1_PERFCOUNTER_LO': (12359, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE1_PERFCOUNTER_HI': (12360, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE2_PERFCOUNTER_LO': (12361, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE2_PERFCOUNTER_HI': (12362, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE3_PERFCOUNTER_LO': (12363, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE3_PERFCOUNTER_HI': (12364, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER0_LO': (12736, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER0_HI': (12737, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER1_LO': (12738, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER1_HI': (12739, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER2_LO': (12740, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER2_HI': (12741, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER3_LO': (12742, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER3_HI': (12743, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER4_LO': (12744, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER4_HI': (12745, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER5_LO': (12746, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER5_HI': (12747, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER6_LO': (12748, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER6_HI': (12749, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER7_LO': (12750, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER7_HI': (12751, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER8_LO': (12752, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER8_HI': (12753, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER9_LO': (12754, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER9_HI': (12755, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER10_LO': (12756, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER10_HI': (12757, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER11_LO': (12758, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER11_HI': (12759, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER12_LO': (12760, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER12_HI': (12761, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER13_LO': (12762, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER13_HI': (12763, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER14_LO': (12764, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER14_HI': (12765, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER15_LO': (12766, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER15_HI': (12767, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER0_LO': (13120, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_HI': (13121, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER1_LO': (13122, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER1_HI': (13123, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER2_LO': (13124, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER2_HI': (13125, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER3_LO': (13126, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER3_HI': (13127, 1, {'perfcounter_hi': (0, 31)}), + 'regTCC_PERFCOUNTER0_LO': (13184, 1, {'perfcounter_lo': (0, 31)}), + 'regTCC_PERFCOUNTER0_HI': (13185, 1, {'perfcounter_hi': (0, 31)}), + 'regTCC_PERFCOUNTER1_LO': (13186, 1, {'perfcounter_lo': (0, 31)}), + 'regTCC_PERFCOUNTER1_HI': (13187, 1, {'perfcounter_hi': (0, 31)}), + 'regTCC_PERFCOUNTER2_LO': (13188, 1, {'perfcounter_lo': (0, 31)}), + 'regTCC_PERFCOUNTER2_HI': (13189, 1, {'perfcounter_hi': (0, 31)}), + 'regTCC_PERFCOUNTER3_LO': (13190, 1, {'perfcounter_lo': (0, 31)}), + 'regTCC_PERFCOUNTER3_HI': (13191, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER0_LO': (13440, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER0_HI': (13441, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER1_LO': (13442, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER1_HI': (13443, 1, {'perfcounter_hi': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_LO': (13570, 1, {'counter_lo': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_HI': (13571, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regCP_PERFMON_CNTL': (14344, 1, {'perfmon_state': (0, 3), 'spm_perfmon_state': (4, 7), 'perfmon_enable_mode': (8, 9), 'perfmon_sample_enable': (10, 10)}), + 'regGRBM_PERFCOUNTER0_SELECT': (14400, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'vgt_busy_user_defined_mask': (12, 12), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'ia_busy_user_defined_mask': (23, 23), 'gds_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tc_busy_user_defined_mask': (27, 27), 'wd_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30), 'rmi_busy_user_defined_mask': (31, 31)}), + 'regGRBM_PERFCOUNTER1_SELECT': (14401, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'vgt_busy_user_defined_mask': (12, 12), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'ia_busy_user_defined_mask': (23, 23), 'gds_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tc_busy_user_defined_mask': (27, 27), 'wd_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30), 'rmi_busy_user_defined_mask': (31, 31)}), + 'regGRBM_SE0_PERFCOUNTER_SELECT': (14402, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'vgt_busy_user_defined_mask': (19, 19), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22)}), + 'regGRBM_SE1_PERFCOUNTER_SELECT': (14403, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'vgt_busy_user_defined_mask': (19, 19), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22)}), + 'regGRBM_SE2_PERFCOUNTER_SELECT': (14404, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'vgt_busy_user_defined_mask': (19, 19), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22)}), + 'regGRBM_SE3_PERFCOUNTER_SELECT': (14405, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'vgt_busy_user_defined_mask': (19, 19), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22)}), + 'regSQ_PERFCOUNTER0_SELECT': (14784, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER1_SELECT': (14785, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER2_SELECT': (14786, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER3_SELECT': (14787, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER4_SELECT': (14788, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER5_SELECT': (14789, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER6_SELECT': (14790, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER7_SELECT': (14791, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER8_SELECT': (14792, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER9_SELECT': (14793, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER10_SELECT': (14794, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER11_SELECT': (14795, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER12_SELECT': (14796, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER13_SELECT': (14797, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER14_SELECT': (14798, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER15_SELECT': (14799, 1, {'perf_sel': (0, 8), 'sqc_bank_mask': (12, 15), 'sqc_client_mask': (16, 19), 'spm_mode': (20, 23), 'simd_mask': (24, 27), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER_CTRL': (14816, 1, {'ps_en': (0, 0), 'vs_en': (1, 1), 'gs_en': (2, 2), 'es_en': (3, 3), 'hs_en': (4, 4), 'ls_en': (5, 5), 'cs_en': (6, 6), 'cntr_rate': (8, 12), 'disable_flush': (13, 13), 'vmid_mask': (16, 31)}), + 'regSQ_PERFCOUNTER_MASK': (14817, 1, {'sh0_mask': (0, 15), 'sh1_mask': (16, 31)}), + 'regSQ_PERFCOUNTER_CTRL2': (14818, 1, {'force_en': (0, 0)}), + 'regTCP_PERFCOUNTER0_SELECT': (15168, 1, {'perf_sel': (0, 6), 'perf_sel1': (10, 16), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER0_SELECT1': (15169, 1, {'perf_sel2': (0, 6), 'perf_sel3': (10, 16), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT': (15170, 1, {'perf_sel': (0, 6), 'perf_sel1': (10, 16), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT1': (15171, 1, {'perf_sel2': (0, 6), 'perf_sel3': (10, 16), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER2_SELECT': (15172, 1, {'perf_sel': (0, 6), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER3_SELECT': (15173, 1, {'perf_sel': (0, 6), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regTCC_PERFCOUNTER0_SELECT': (15232, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCC_PERFCOUNTER0_SELECT1': (15233, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regTCC_PERFCOUNTER1_SELECT': (15234, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCC_PERFCOUNTER1_SELECT1': (15235, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regTCC_PERFCOUNTER2_SELECT': (15236, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regTCC_PERFCOUNTER3_SELECT': (15237, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regRLC_SPM_PERFMON_CNTL': (15488, 1, {'reserved1': (0, 11), 'perfmon_ring_mode': (12, 13), 'reserved': (14, 15), 'perfmon_sample_interval': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_LO': (15489, 1, {'ring_base_lo': (0, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_HI': (15490, 1, {'ring_base_hi': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_SIZE': (15491, 1, {'ring_base_size': (0, 31)}), + 'regRLC_SPM_PERFMON_SEGMENT_SIZE': (15492, 1, {'perfmon_segment_size': (0, 7), 'reserved1': (8, 10), 'global_num_line': (11, 15), 'se0_num_line': (16, 20), 'se1_num_line': (21, 25), 'se2_num_line': (26, 30), 'reserved': (31, 31)}), + 'regRLC_SPM_SE_MUXSEL_ADDR': (15493, 1, {'perfmon_sel_addr': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_SE_MUXSEL_DATA': (15494, 1, {'perfmon_sel_data': (0, 31)}), + 'regRLC_SPM_CPG_PERFMON_SAMPLE_DELAY': (15495, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_CPC_PERFMON_SAMPLE_DELAY': (15496, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_CPF_PERFMON_SAMPLE_DELAY': (15497, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_CB_PERFMON_SAMPLE_DELAY': (15498, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_DB_PERFMON_SAMPLE_DELAY': (15499, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_PA_PERFMON_SAMPLE_DELAY': (15500, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_GDS_PERFMON_SAMPLE_DELAY': (15501, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_IA_PERFMON_SAMPLE_DELAY': (15502, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_SC_PERFMON_SAMPLE_DELAY': (15504, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_TCC_PERFMON_SAMPLE_DELAY': (15505, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_TCA_PERFMON_SAMPLE_DELAY': (15506, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_TCP_PERFMON_SAMPLE_DELAY': (15507, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_TA_PERFMON_SAMPLE_DELAY': (15508, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_TD_PERFMON_SAMPLE_DELAY': (15509, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_VGT_PERFMON_SAMPLE_DELAY': (15510, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_SPI_PERFMON_SAMPLE_DELAY': (15511, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_SQG_PERFMON_SAMPLE_DELAY': (15512, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_SX_PERFMON_SAMPLE_DELAY': (15514, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_GLOBAL_MUXSEL_ADDR': (15515, 1, {'perfmon_sel_addr': (0, 6), 'reserved': (7, 31)}), + 'regRLC_SPM_GLOBAL_MUXSEL_DATA': (15516, 1, {'perfmon_sel_data': (0, 31)}), + 'regRLC_SPM_RING_RDPTR': (15517, 1, {'perfmon_ring_rdptr': (0, 31)}), + 'regRLC_SPM_SEGMENT_THRESHOLD': (15518, 1, {'num_segment_threshold': (0, 31)}), + 'regRLC_SPM_RMI_PERFMON_SAMPLE_DELAY': (15523, 1, {'perfmon_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_PERFMON_SAMPLE_DELAY_MAX': (15524, 1, {'perfmon_max_sample_delay': (0, 7), 'reserved': (8, 31)}), + 'regRLC_PERFMON_CNTL': (15552, 1, {'perfmon_state': (0, 2), 'perfmon_sample_enable': (10, 10)}), + 'regRLC_PERFCOUNTER0_SELECT': (15553, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_PERFCOUNTER1_SELECT': (15554, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_GPU_IOV_PERF_CNT_CNTL': (15555, 1, {'enable': (0, 0), 'mode_select': (1, 1), 'reset': (2, 2), 'reserved': (3, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_WR_ADDR': (15556, 1, {'vfid': (0, 3), 'cnt_id': (4, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_WR_DATA': (15557, 1, {'data': (0, 3)}), + 'regRLC_GPU_IOV_PERF_CNT_RD_ADDR': (15558, 1, {'vfid': (0, 3), 'cnt_id': (4, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_RD_DATA': (15559, 1, {'data': (0, 3)}), + 'regGCMC_VM_L2_PERFCOUNTER0_CFG': (15686, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER1_CFG': (15687, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER2_CFG': (15688, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER3_CFG': (15689, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER4_CFG': (15690, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER5_CFG': (15691, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER6_CFG': (15692, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER7_CFG': (15693, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (15702, 1, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regRLC_CNTL': (19456, 1, {'rlc_enable_f32': (0, 0), 'force_retry': (1, 1), 'read_cache_disable': (2, 2), 'rlc_step_f32': (3, 3), 'reserved': (4, 31)}), + 'regRLC_CGCG_CGLS_CTRL_2': (19459, 1, {'cane_stat_busy_mask': (0, 0), 'reserved': (1, 31)}), + 'regRLC_STAT': (19460, 1, {'rlc_busy': (0, 0), 'rlc_srm_busy': (1, 1), 'rlc_gpm_busy': (2, 2), 'rlc_spm_busy': (3, 3), 'mc_busy': (4, 4), 'rlc_thread_0_busy': (5, 5), 'rlc_thread_1_busy': (6, 6), 'rlc_thread_2_busy': (7, 7), 'reserved': (8, 31)}), + 'regRLC_SAFE_MODE': (19461, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_MEM_SLP_CNTL': (19462, 1, {'rlc_mem_ls_en': (0, 0), 'rlc_mem_ds_en': (1, 1), 'reserved': (2, 6), 'rlc_ls_ds_busy_override': (7, 7), 'rlc_mem_ls_on_delay': (8, 15), 'rlc_mem_ls_off_delay': (16, 23), 'reserved1': (24, 31)}), + 'regRLC_RLCV_SAFE_MODE': (19464, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SMU_SAFE_MODE': (19465, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_RLCV_COMMAND': (19466, 1, {'cmd': (0, 3), 'reserved': (4, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_LSB': (19468, 1, {'timestamp_lsb': (0, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_MSB': (19469, 1, {'timestamp_msb': (0, 31)}), + 'regRLC_GPM_TIMER_INT_0': (19470, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_1': (19471, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_2': (19472, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_CTRL': (19473, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_2_en': (2, 2), 'timer_3_en': (3, 3), 'reserved': (4, 31)}), + 'regRLC_LB_CNTR_MAX': (19474, 1, {'lb_cntr_max': (0, 31)}), + 'regRLC_GPM_TIMER_STAT': (19475, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'timer_2_stat': (2, 2), 'timer_3_stat': (3, 3), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_2_enable_sync': (10, 10), 'timer_3_enable_sync': (11, 11), 'reserved': (12, 31)}), + 'regRLC_GPM_TIMER_INT_3': (19477, 1, {'timer': (0, 31)}), + 'regRLC_SERDES_WR_NONCU_MASTER_MASK_1': (19478, 1, {'se_master_mask_1': (0, 15), 'gc_master_mask_1': (16, 16), 'gc_gfx_master_mask_1': (17, 17), 'tc0_1_master_mask': (18, 18), 'reserved_1': (19, 19), 'spare4_master_mask': (20, 20), 'spare5_master_mask': (21, 21), 'spare6_master_mask': (22, 22), 'spare7_master_mask': (23, 23), 'ea_1_master_mask': (24, 24), 'reserved': (25, 31)}), + 'regRLC_SERDES_NONCU_MASTER_BUSY_1': (19479, 1, {'se_master_busy_1': (0, 15), 'gc_master_busy_1': (16, 16), 'gc_gfx_master_busy_1': (17, 17), 'tc0_master_busy_1': (18, 18), 'reserved_1': (19, 19), 'spare4_master_busy': (20, 20), 'spare5_master_busy': (21, 21), 'spare6_master_busy': (22, 22), 'spare7_master_busy': (23, 23), 'ea_1_master_busy': (24, 24), 'reserved': (25, 31)}), + 'regRLC_INT_STAT': (19480, 1, {'last_cp_rlc_int_id': (0, 7), 'cp_rlc_int_pending': (8, 8), 'reserved': (9, 31)}), + 'regRLC_LB_CNTL': (19481, 1, {'load_balance_enable': (0, 0), 'lb_cnt_cp_busy': (1, 1), 'lb_cnt_spim_active': (2, 2), 'lb_cnt_reg_inc': (3, 3), 'cu_mask_used_off_hyst': (4, 11), 'reserved': (12, 31)}), + 'regRLC_MGCG_CTRL': (19482, 1, {'mgcg_en': (0, 0), 'silicon_en': (1, 1), 'simulation_en': (2, 2), 'on_delay': (3, 6), 'off_hysteresis': (7, 14), 'gc_cac_mgcg_clk_cntl': (15, 15), 'se_cac_mgcg_clk_cntl': (16, 16), 'spare': (17, 31)}), + 'regRLC_LB_CNTR_INIT': (19483, 1, {'lb_cntr_init': (0, 31)}), + 'regRLC_LOAD_BALANCE_CNTR': (19484, 1, {'rlc_load_balance_cntr': (0, 31)}), + 'regRLC_JUMP_TABLE_RESTORE': (19486, 1, {'addr': (0, 31)}), + 'regRLC_PG_DELAY_2': (19487, 1, {'serdes_timeout_value': (0, 7), 'serdes_cmd_delay': (8, 15), 'percu_timeout_value': (16, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB': (19492, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB': (19493, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT': (19494, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_UCODE_CNTL': (19495, 1, {'rlc_ucode_flags': (0, 31)}), + 'regRLC_GPM_THREAD_RESET': (19496, 1, {'thread0_reset': (0, 0), 'thread1_reset': (1, 1), 'thread2_reset': (2, 2), 'thread3_reset': (3, 3), 'reserved': (4, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T0': (19497, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T1': (19498, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_FIREWALL_VIOLATION': (19499, 1, {'addr': (0, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_LSB': (19504, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_MSB': (19505, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_LSB': (19506, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_MSB': (19507, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_CTRL': (19508, 1, {'gfxclk_run': (0, 0), 'gfxclk_reset': (1, 1), 'gfxclk_sample': (2, 2), 'refclk_run': (3, 3), 'refclk_reset': (4, 4), 'refclk_sample': (5, 5)}), + 'regRLC_CLK_COUNT_STAT': (19509, 1, {'gfxclk_valid': (0, 0), 'refclk_valid': (1, 1), 'refclk_run_resync': (2, 2), 'refclk_reset_resync': (3, 3), 'refclk_sample_resync': (4, 4), 'reserved': (5, 31)}), + 'regRLC_GPM_STAT': (19520, 1, {'rlc_busy': (0, 0), 'gfx_power_status': (1, 1), 'gfx_clock_status': (2, 2), 'gfx_ls_status': (3, 3), 'gfx_pipeline_power_status': (4, 4), 'cntx_idle_being_processed': (5, 5), 'cntx_busy_being_processed': (6, 6), 'gfx_idle_being_processed': (7, 7), 'cmp_busy_being_processed': (8, 8), 'saving_registers': (9, 9), 'restoring_registers': (10, 10), 'gfx3d_blocks_changing_power_state': (11, 11), 'cmp_blocks_changing_power_state': (12, 12), 'static_cu_powering_up': (13, 13), 'static_cu_powering_down': (14, 14), 'dyn_cu_powering_up': (15, 15), 'dyn_cu_powering_down': (16, 16), 'aborted_pd_sequence': (17, 17), 'cmp_power_status': (18, 18), 'reserved_1': (19, 20), 'mgcg_override_status': (21, 21), 'rlc_exec_rom_code': (22, 22), 'fgcg_override_status': (23, 23), 'pg_error_status': (24, 31)}), + 'regRLC_GPU_CLOCK_32_RES_SEL': (19521, 1, {'res_sel': (0, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_CLOCK_32': (19522, 1, {'gpu_clock_32': (0, 31)}), + 'regRLC_PG_CNTL': (19523, 1, {'gfx_power_gating_enable': (0, 0), 'gfx_power_gating_src': (1, 1), 'dyn_per_cu_pg_enable': (2, 2), 'static_per_cu_pg_enable': (3, 3), 'gfx_pipeline_pg_enable': (4, 4), 'reserved': (5, 13), 'pg_override': (14, 14), 'cp_pg_disable': (15, 15), 'chub_handshake_enable': (16, 16), 'smu_clk_slowdown_on_pu_enable': (17, 17), 'smu_clk_slowdown_on_pd_enable': (18, 18), 'reserved1': (19, 20), 'ultra_low_voltage_enable': (21, 21), 'reserved2': (22, 22), 'smu_handshake_disable': (23, 23)}), + 'regRLC_GPM_THREAD_PRIORITY': (19524, 1, {'thread0_priority': (0, 7), 'thread1_priority': (8, 15), 'thread2_priority': (16, 23), 'thread3_priority': (24, 31)}), + 'regRLC_GPM_THREAD_ENABLE': (19525, 1, {'thread0_enable': (0, 0), 'thread1_enable': (1, 1), 'thread2_enable': (2, 2), 'thread3_enable': (3, 3), 'reserved': (4, 31)}), + 'regRLC_CGTT_MGCG_OVERRIDE': (19528, 1, {'reserved_0': (0, 0), 'rlc_cgtt_sclk_override': (1, 1), 'gfxip_mgcg_override': (2, 2), 'gfxip_cgcg_override': (3, 3), 'gfxip_cgls_override': (4, 4), 'grbm_cgtt_sclk_override': (5, 5), 'gfxip_mgls_override': (6, 6), 'gfxip_gfx3d_cg_override': (7, 7), 'gfxip_fgcg_override': (8, 8), 'gfxip_rep_fgcg_override': (9, 9), 'gfxip_perf_clk_en': (10, 10), 'reserved_15_11': (11, 15), 'enable_cgts_legacy': (16, 16), 'reserved_31_17': (17, 31)}), + 'regRLC_CGCG_CGLS_CTRL': (19529, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL': (19530, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_DYN_PG_STATUS': (19531, 1, {'pg_status_cu_mask': (0, 31)}), + 'regRLC_DYN_PG_REQUEST': (19532, 1, {'pg_request_cu_mask': (0, 31)}), + 'regRLC_PG_DELAY': (19533, 1, {'power_up_delay': (0, 7), 'power_down_delay': (8, 15), 'cmd_propagate_delay': (16, 23), 'mem_sleep_delay': (24, 31)}), + 'regRLC_CU_STATUS': (19534, 1, {'work_pending': (0, 31)}), + 'regRLC_LB_INIT_CU_MASK': (19535, 1, {'init_cu_mask': (0, 31)}), + 'regRLC_LB_ALWAYS_ACTIVE_CU_MASK': (19536, 1, {'always_active_cu_mask': (0, 31)}), + 'regRLC_LB_PARAMS': (19537, 1, {'skip_l2_check': (0, 0), 'fifo_samples': (1, 7), 'pg_idle_samples': (8, 15), 'pg_idle_sample_interval': (16, 31)}), + 'regRLC_THREAD1_DELAY': (19538, 1, {'cu_idel_delay': (0, 7), 'lbpw_inner_loop_delay': (8, 15), 'lbpw_outer_loop_delay': (16, 23), 'spare': (24, 31)}), + 'regRLC_PG_ALWAYS_ON_CU_MASK': (19539, 1, {'aon_cu_mask': (0, 31)}), + 'regRLC_MAX_PG_CU': (19540, 1, {'max_powered_up_cu': (0, 7), 'spare': (8, 31)}), + 'regRLC_AUTO_PG_CTRL': (19541, 1, {'auto_pg_en': (0, 0), 'auto_grbm_reg_save_on_idle_en': (1, 1), 'auto_wake_up_en': (2, 2), 'grbm_reg_save_gfx_idle_threshold': (3, 18), 'pg_after_grbm_reg_save_threshold': (19, 31)}), + 'regRLC_SMU_GRBM_REG_SAVE_CTRL': (19542, 1, {'start_grbm_reg_save': (0, 0), 'spare': (1, 31)}), + 'regRLC_SERDES_RD_PENDING': (19544, 1, {'rd_pending': (0, 0)}), + 'regRLC_SERDES_RD_MASTER_INDEX': (19545, 1, {'cu_id': (0, 3), 'sh_id': (4, 5), 'se_id': (6, 8), 'se_noncu_id': (9, 11), 'se_noncu': (12, 12), 'non_se': (13, 16), 'data_reg_id': (17, 18), 'spare': (19, 31)}), + 'regRLC_SERDES_RD_DATA_0': (19546, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_1': (19547, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_2': (19548, 1, {'data': (0, 31)}), + 'regRLC_SERDES_WR_CU_MASTER_MASK': (19549, 1, {'master_mask': (0, 31)}), + 'regRLC_SERDES_WR_NONCU_MASTER_MASK': (19550, 1, {'se_master_mask': (0, 15), 'gc_master_mask': (16, 16), 'gc_gfx_master_mask': (17, 17), 'tc0_master_mask': (18, 18), 'tc1_master_mask': (19, 19), 'spare0_master_mask': (20, 20), 'spare1_master_mask': (21, 21), 'spare2_master_mask': (22, 22), 'spare3_master_mask': (23, 23), 'ea_0_master_mask': (24, 24), 'tc2_master_mask': (25, 25), 'reserved': (26, 31)}), + 'regRLC_SERDES_WR_CTRL': (19551, 1, {'bpm_addr': (0, 7), 'power_down': (8, 8), 'power_up': (9, 9), 'p1_select': (10, 10), 'p2_select': (11, 11), 'write_command': (12, 12), 'read_command': (13, 13), 'rddata_reset': (14, 14), 'short_format': (15, 15), 'bpm_data': (16, 25), 'srbm_override': (26, 26), 'rsvd_bpm_addr': (27, 27), 'reg_addr': (28, 31)}), + 'regRLC_SERDES_WR_DATA': (19552, 1, {'data': (0, 31)}), + 'regRLC_SERDES_CU_MASTER_BUSY': (19553, 1, {'busy_busy': (0, 31)}), + 'regRLC_SERDES_NONCU_MASTER_BUSY': (19554, 1, {'se_master_busy': (0, 15), 'gc_master_busy': (16, 16), 'gc_gfx_master_busy': (17, 17), 'tc0_master_busy': (18, 18), 'tc1_master_busy': (19, 19), 'spare0_master_busy': (20, 20), 'spare1_master_busy': (21, 21), 'spare2_master_busy': (22, 22), 'spare3_master_busy': (23, 23), 'ea_0_master_busy': (24, 24), 'tc2_master_busy': (25, 25), 'reserved': (26, 31)}), + 'regRLC_GPM_GENERAL_0': (19555, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_1': (19556, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_2': (19557, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_3': (19558, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_4': (19559, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_5': (19560, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_6': (19561, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_7': (19562, 1, {'data': (0, 31)}), + 'regRLC_GPM_SCRATCH_ADDR': (19564, 1, {'addr': (0, 8), 'reserved': (9, 31)}), + 'regRLC_GPM_SCRATCH_DATA': (19565, 1, {'data': (0, 31)}), + 'regRLC_STATIC_PG_STATUS': (19566, 1, {'pg_status_cu_mask': (0, 31)}), + 'regRLC_SPM_MC_CNTL': (19569, 1, {'rlc_spm_vmid': (0, 3), 'rlc_spm_policy': (4, 4), 'rlc_spm_perf_cntr': (5, 5), 'rlc_spm_fed': (6, 6), 'rlc_spm_mtype_over': (7, 7), 'rlc_spm_mtype': (8, 9), 'reserved': (10, 31)}), + 'regRLC_SPM_INT_CNTL': (19570, 1, {'rlc_spm_int_cntl': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_STATUS': (19571, 1, {'rlc_spm_int_status': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SMU_MESSAGE': (19574, 1, {'cmd': (0, 31)}), + 'regRLC_GPM_LOG_SIZE': (19575, 1, {'size': (0, 31)}), + 'regRLC_PG_DELAY_3': (19576, 1, {'cgcg_active_before_cgpg': (0, 7), 'reserved': (8, 31)}), + 'regRLC_GPR_REG1': (19577, 1, {'data': (0, 31)}), + 'regRLC_GPR_REG2': (19578, 1, {'data': (0, 31)}), + 'regRLC_GPM_LOG_CONT': (19579, 1, {'cont': (0, 31)}), + 'regRLC_GPM_INT_DISABLE_TH0': (19580, 1, {'disable': (0, 31)}), + 'regRLC_GPM_INT_FORCE_TH0': (19582, 1, {'force': (0, 31)}), + 'regRLC_GPM_INT_FORCE_TH1': (19583, 1, {'force': (0, 31)}), + 'regRLC_SRM_CNTL': (19584, 1, {'srm_enable': (0, 0), 'auto_incr_addr': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_ARAM_ADDR': (19587, 1, {'addr': (0, 10), 'reserved': (11, 31)}), + 'regRLC_SRM_ARAM_DATA': (19588, 1, {'data': (0, 31)}), + 'regRLC_SRM_DRAM_ADDR': (19589, 1, {'addr': (0, 10), 'reserved': (11, 31)}), + 'regRLC_SRM_DRAM_DATA': (19590, 1, {'data': (0, 31)}), + 'regRLC_SRM_GPM_COMMAND': (19591, 1, {'op': (0, 0), 'index_cntl': (1, 1), 'index_cntl_num': (2, 4), 'size': (5, 15), 'reserved_16': (16, 16), 'start_offset': (17, 27), 'reserved_30_29': (29, 30), 'dest_memory': (31, 31)}), + 'regRLC_SRM_GPM_COMMAND_STATUS': (19592, 1, {'fifo_empty': (0, 0), 'fifo_full': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_RLCV_COMMAND': (19593, 1, {'op': (0, 0), 'index_cntl': (1, 1), 'index_cntl_num': (2, 4), 'size': (5, 15), 'reserved_16': (16, 16), 'start_offset': (17, 27), 'reserved1': (28, 30), 'dest_memory': (31, 31)}), + 'regRLC_SRM_RLCV_COMMAND_STATUS': (19594, 1, {'fifo_empty': (0, 0), 'fifo_full': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_0': (19595, 1, {'address': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_1': (19596, 1, {'address': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_2': (19597, 1, {'address': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_3': (19598, 1, {'address': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_4': (19599, 1, {'address': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_5': (19600, 1, {'address': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_6': (19601, 1, {'address': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_7': (19602, 1, {'address': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_0': (19603, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_1': (19604, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_2': (19605, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_3': (19606, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_4': (19607, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_5': (19608, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_6': (19609, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_7': (19610, 1, {'data': (0, 31)}), + 'regRLC_SRM_STAT': (19611, 1, {'srm_busy': (0, 0), 'srm_busy_delay': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_GPM_ABORT': (19612, 1, {'abort': (0, 0), 'reserved': (1, 31)}), + 'regRLC_CSIB_ADDR_LO': (19618, 1, {'address': (0, 31)}), + 'regRLC_CSIB_ADDR_HI': (19619, 1, {'address': (0, 15)}), + 'regRLC_CSIB_LENGTH': (19620, 1, {'length': (0, 31)}), + 'regRLC_SMU_COMMAND': (19625, 1, {'cmd': (0, 31)}), + 'regRLC_CP_SCHEDULERS': (19626, 1, {'scheduler0': (0, 7), 'scheduler1': (8, 15), 'scheduler2': (16, 23), 'scheduler3': (24, 31)}), + 'regRLC_SMU_ARGUMENT_1': (19627, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_2': (19628, 1, {'arg': (0, 31)}), + 'regRLC_GPM_GENERAL_8': (19629, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_9': (19630, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_10': (19631, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_11': (19632, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_12': (19633, 1, {'data': (0, 31)}), + 'regRLC_GPM_UTCL1_CNTL_0': (19634, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'reserved': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28)}), + 'regRLC_GPM_UTCL1_CNTL_1': (19635, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'reserved': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28)}), + 'regRLC_GPM_UTCL1_CNTL_2': (19636, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'reserved': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28)}), + 'regRLC_SPM_UTCL1_CNTL': (19637, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'reserved': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28)}), + 'regRLC_UTCL1_STATUS_2': (19638, 1, {'gpm_th0_utcl1_busy': (0, 0), 'gpm_th1_utcl1_busy': (1, 1), 'gpm_th2_utcl1_busy': (2, 2), 'spm_utcl1_busy': (3, 3), 'prewalker_utcl1_busy': (4, 4), 'gpm_th0_utcl1_stallontrans': (5, 5), 'gpm_th1_utcl1_stallontrans': (6, 6), 'gpm_th2_utcl1_stallontrans': (7, 7), 'spm_utcl1_stallontrans': (8, 8), 'prewalker_utcl1_stallontrans': (9, 9), 'reserved': (10, 31)}), + 'regRLC_LB_THR_CONFIG_2': (19640, 1, {'data': (0, 31)}), + 'regRLC_LB_THR_CONFIG_3': (19641, 1, {'data': (0, 31)}), + 'regRLC_LB_THR_CONFIG_4': (19642, 1, {'data': (0, 31)}), + 'regRLC_SPM_UTCL1_ERROR_1': (19644, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_SPM_UTCL1_ERROR_2': (19645, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_1': (19646, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_LB_THR_CONFIG_1': (19647, 1, {'data': (0, 31)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_2': (19648, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH1_ERROR_1': (19649, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH1_ERROR_2': (19650, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH2_ERROR_1': (19651, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH2_ERROR_2': (19652, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_SEMAPHORE_0': (19655, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_1': (19656, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_CP_EOF_INT': (19658, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_CP_EOF_INT_CNT': (19659, 1, {'cnt': (0, 31)}), + 'regRLC_SPARE_INT': (19660, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_PREWALKER_UTCL1_CNTL': (19661, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'reserved': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28)}), + 'regRLC_PREWALKER_UTCL1_TRIG': (19662, 1, {'valid': (0, 0), 'vmid': (1, 4), 'prime_mode': (5, 5), 'read_perm': (6, 6), 'write_perm': (7, 7), 'exec_perm': (8, 8), 'reserved': (9, 30), 'ready': (31, 31)}), + 'regRLC_PREWALKER_UTCL1_ADDR_LSB': (19663, 1, {'addr_lsb': (0, 31)}), + 'regRLC_PREWALKER_UTCL1_ADDR_MSB': (19664, 1, {'addr_msb': (0, 15)}), + 'regRLC_PREWALKER_UTCL1_SIZE_LSB': (19665, 1, {'size_lsb': (0, 31)}), + 'regRLC_PREWALKER_UTCL1_SIZE_MSB': (19666, 1, {'size_msb': (0, 1)}), + 'regRLC_DSM_TRIG': (19667, 1, {'start': (0, 0)}), + 'regRLC_UTCL1_STATUS': (19668, 1, {'fault_detected': (0, 0), 'retry_detected': (1, 1), 'prt_detected': (2, 2), 'reserved': (3, 7), 'fault_utcl1id': (8, 13), 'reserved_1': (14, 15), 'retry_utcl1id': (16, 21), 'reserved_2': (22, 23), 'prt_utcl1id': (24, 29), 'reserved_3': (30, 31)}), + 'regRLC_R2I_CNTL_0': (19669, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_1': (19670, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_2': (19671, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_3': (19672, 1, {'data': (0, 31)}), + 'regRLC_UTCL2_CNTL': (19673, 1, {'mtype_no_pte_mode': (0, 0), 'ignore_pte_permission': (1, 1), 'reserved': (2, 31)}), + 'regRLC_LBPW_CU_STAT': (19674, 1, {'max_cu': (0, 15), 'on_cu': (16, 31)}), + 'regRLC_DS_CNTL': (19675, 1, {'gfx_clk_ds_rlc_busy_mask': (0, 0), 'gfx_clk_ds_cp_busy_mask': (1, 1), 'gfx_clk_tcc_rlc_grbm_cc_resident_mask': (2, 2), 'gfx_clk_ea_rlc_grbm_stat_busy_mask': (3, 3), 'resrved': (4, 13), 'soc_clk_tcc_rlc_grbm_cc_resident_mask': (14, 14), 'soc_clk_ea_rlc_grbm_stat_busy_mask': (15, 15), 'soc_clk_ds_rlc_busy_mask': (16, 16), 'soc_clk_ds_cp_busy_mask': (17, 17), 'resrved_1': (18, 31)}), + 'regRLC_GPM_INT_STAT_TH0': (19676, 1, {'status': (0, 31)}), + 'regRLC_GPM_GENERAL_13': (19677, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_14': (19678, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_15': (19679, 1, {'data': (0, 31)}), + 'regRLC_SPARE_INT_1': (19680, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCV_SPARE_INT_1': (19681, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SEMAPHORE_2': (19683, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_3': (19684, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SMU_ARGUMENT_3': (19685, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_4': (19686, 1, {'arg': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_1': (19688, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_1': (19689, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_1': (19690, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_2': (19691, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_2': (19692, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_2': (19695, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_CPG_STAT_INVAL': (19721, 1, {'cpg_stat_inval': (0, 0)}), + 'regRLC_UE_ERR_STATUS_LOW': (19776, 1, {'err_status_valid_flag': (0, 0), 'address_valid_flag': (1, 1), 'address': (2, 23), 'memory_id': (24, 31)}), + 'regRLC_UE_ERR_STATUS_HIGH': (19777, 1, {'ecc': (0, 0), 'parity': (1, 1), 'err_info_valid_flag': (2, 2), 'err_info': (3, 22), 'ue_cnt': (23, 25), 'fed_cnt': (26, 28), 'reserved': (29, 31)}), + 'regRLC_DSM_CNTL': (19778, 1, {'rlcg_instr_ram_irritator_data_sel': (0, 1), 'rlcg_instr_ram_irritator_single_write': (2, 2), 'rlcg_scratch_ram_irritator_data_sel': (3, 4), 'rlcg_scratch_ram_irritator_single_write': (5, 5), 'rlcv_instr_ram_irritator_data_sel': (6, 7), 'rlcv_instr_ram_irritator_single_write': (8, 8), 'rlcv_scratch_ram_irritator_data_sel': (9, 10), 'rlcv_scratch_ram_irritator_single_write': (11, 11), 'rlc_tctag_ram_irritator_data_sel': (12, 13), 'rlc_tctag_ram_irritator_single_write': (14, 14), 'rlc_spm_scratch_ram_irritator_data_sel': (15, 16), 'rlc_spm_scratch_ram_irritator_single_write': (17, 17), 'rlc_srm_data_ram_irritator_data_sel': (18, 19), 'rlc_srm_data_ram_irritator_single_write': (20, 20), 'rlc_srm_addr_ram_irritator_data_sel': (21, 22), 'rlc_srm_addr_ram_irritator_single_write': (23, 23)}), + 'regRLC_DSM_CNTLA': (19779, 1, {'rlc_spm_se0_scratch_ram_irritator_data_sel': (0, 1), 'rlc_spm_se0_scratch_ram_irritator_single_write': (2, 2), 'rlc_spm_se1_scratch_ram_irritator_data_sel': (3, 4), 'rlc_spm_se1_scratch_ram_irritator_single_write': (5, 5), 'rlc_spm_se2_scratch_ram_irritator_data_sel': (6, 7), 'rlc_spm_se2_scratch_ram_irritator_single_write': (8, 8), 'rlc_spm_se3_scratch_ram_irritator_data_sel': (9, 10), 'rlc_spm_se3_scratch_ram_irritator_single_write': (11, 11)}), + 'regRLC_DSM_CNTL2': (19780, 1, {'rlcg_instr_ram_enable_error_inject': (0, 1), 'rlcg_instr_ram_select_inject_delay': (2, 2), 'rlcg_scratch_ram_enable_error_inject': (3, 4), 'rlcg_scratch_ram_select_inject_delay': (5, 5), 'rlcv_instr_ram_enable_error_inject': (6, 7), 'rlcv_instr_ram_select_inject_delay': (8, 8), 'rlcv_scratch_ram_enable_error_inject': (9, 10), 'rlcv_scratch_ram_select_inject_delay': (11, 11), 'rlc_tctag_ram_enable_error_inject': (12, 13), 'rlc_tctag_ram_select_inject_delay': (14, 14), 'rlc_spm_scratch_ram_enable_error_inject': (15, 16), 'rlc_spm_scratch_ram_select_inject_delay': (17, 17), 'rlc_srm_data_ram_enable_error_inject': (18, 19), 'rlc_srm_data_ram_select_inject_delay': (20, 20), 'rlc_srm_addr_ram_enable_error_inject': (21, 22), 'rlc_srm_addr_ram_select_inject_delay': (23, 23), 'inject_delay': (26, 31)}), + 'regRLC_DSM_CNTL2A': (19781, 1, {'rlc_spm_se0_scratch_ram_enable_error_inject': (0, 1), 'rlc_spm_se0_scratch_ram_select_inject_delay': (2, 2), 'rlc_spm_se1_scratch_ram_enable_error_inject': (3, 4), 'rlc_spm_se1_scratch_ram_select_inject_delay': (5, 5), 'rlc_spm_se2_scratch_ram_enable_error_inject': (6, 7), 'rlc_spm_se2_scratch_ram_select_inject_delay': (8, 8), 'rlc_spm_se3_scratch_ram_enable_error_inject': (9, 10), 'rlc_spm_se3_scratch_ram_select_inject_delay': (11, 11)}), + 'regRLC_CE_ERR_STATUS_LOW': (19785, 1, {'err_status_valid_flag': (0, 0), 'address_valid_flag': (1, 1), 'address': (2, 23), 'memory_id': (24, 31)}), + 'regRLC_CE_ERR_STATUS_HIGH': (19786, 1, {'ecc': (0, 0), 'other': (1, 1), 'err_info_valid_flag': (2, 2), 'err_info': (3, 22), 'ce_cnt': (23, 25), 'poison': (26, 26), 'reserved': (27, 31)}), + 'regRLC_RLCV_SPARE_INT': (20272, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SMU_CLK_REQ': (20375, 1, {'valid': (0, 0)}), + 'regRLC_GFX_RM_CNTL': (20662, 1, {'rlc_gfx_rm_valid': (0, 0), 'reserved': (1, 31)}), + 'regCP_MEC_ME1_UCODE_ADDR': (22554, 1, {'ucode_addr': (0, 16)}), + 'regCP_MEC_ME1_UCODE_DATA': (22555, 1, {'ucode_data': (0, 31)}), + 'regCP_MEC_ME2_UCODE_ADDR': (22556, 1, {'ucode_addr': (0, 16)}), + 'regCP_MEC_ME2_UCODE_DATA': (22557, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPM_UCODE_ADDR': (22588, 1, {'ucode_addr': (0, 13), 'reserved': (14, 31)}), + 'regRLC_GPM_UCODE_DATA': (22589, 1, {'ucode_data': (0, 31)}), + 'regGRBM_GFX_INDEX_SR_SELECT': (23040, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_INDEX_SR_DATA': (23041, 1, {'instance_index': (0, 7), 'sh_index': (8, 15), 'se_index': (16, 23), 'sh_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_SELECT': (23042, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_DATA': (23043, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10)}), + 'regGRBM_MCM_ADDR': (23047, 1, {'mcm_addr_ih': (0, 7)}), + 'regRLC_GPU_IOV_VF_ENABLE': (23296, 1, {'vf_enable': (0, 0), 'reserved': (1, 15), 'vf_num': (16, 31)}), + 'regRLC_GPU_IOV_CFG_REG6': (23302, 1, {'cntxt_size': (0, 6), 'cntxt_location': (7, 7), 'reserved': (8, 9), 'cntxt_offset': (10, 31)}), + 'regRLC_GPU_IOV_CFG_REG8': (23328, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_RLCV_TIMER_INT_0': (23333, 1, {'timer': (0, 31)}), + 'regRLC_RLCV_TIMER_CTRL': (23334, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCV_TIMER_STAT': (23335, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'reserved': (2, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS': (23338, 1, {'vf_doorbell_status': (0, 15), 'reserved': (16, 30), 'pf_doorbell_status': (31, 31)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS_SET': (23339, 1, {'vf_doorbell_status_set': (0, 15), 'reserved': (16, 30), 'pf_doorbell_status_set': (31, 31)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS_CLR': (23340, 1, {'vf_doorbell_status_clr': (0, 15), 'reserved': (16, 30), 'pf_doorbell_status_clr': (31, 31)}), + 'regRLC_GPU_IOV_VF_MASK': (23341, 1, {'vf_mask': (0, 15), 'reserved': (16, 31)}), + 'regRLC_HYP_SEMAPHORE_0': (23342, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_HYP_SEMAPHORE_1': (23343, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_CLK_CNTL': (23345, 1, {'rlc_srm_clk_cntl': (0, 1), 'rlc_spm_clk_cntl': (2, 3), 'rlc_gpm_clk_cntl': (4, 4), 'rlc_cmn_clk_cntl': (5, 5), 'rlc_tc_clk_cntl': (6, 6), 'rlc_spp_clk_cntl': (7, 7), 'rlc_sram_clk_gater_override': (8, 8), 'rlc_edc_override': (9, 9), 'reserved_11_10': (10, 11), 'rlc_tc_fgcg_rep_override': (12, 12), 'rlc_dfll_clk_cntl': (13, 13), 'dbgbus_clk_active_override': (14, 14), 'rlc_cac2_clk_cntl': (15, 16), 'reserved_1': (17, 17), 'rlc_utcl2_fgcg_override': (18, 18), 'reserved': (19, 31)}), + 'regRLC_GPU_IOV_SCH_BLOCK': (23348, 1, {'sch_block_id': (0, 3), 'sch_block_ver': (4, 7), 'sch_block_size': (8, 14), 'reserved': (16, 30)}), + 'regRLC_GPU_IOV_CFG_REG1': (23349, 1, {'cmd_type': (0, 3), 'cmd_execute': (4, 4), 'cmd_execute_intr_en': (5, 5), 'reserved': (6, 7), 'fcn_id': (8, 15), 'next_fcn_id': (16, 23), 'reserved1': (24, 31)}), + 'regRLC_GPU_IOV_CFG_REG2': (23350, 1, {'cmd_status': (0, 3), 'reserved': (4, 31)}), + 'regRLC_GPU_IOV_VM_BUSY_STATUS': (23351, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SCH_0': (23352, 1, {'active_functions': (0, 31)}), + 'regRLC_GPU_IOV_ACTIVE_FCN_ID': (23353, 1, {'vf_id': (0, 3), 'reserved': (4, 30), 'pf_vf': (31, 31)}), + 'regRLC_GPU_IOV_SCH_3': (23354, 1, {'time_quanta_def': (0, 31)}), + 'regRLC_GPU_IOV_SCH_1': (23355, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_SCH_2': (23356, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_INT_STAT': (23359, 1, {'status': (0, 31)}), + 'regRLC_RLCV_TIMER_INT_1': (23360, 1, {'timer': (0, 31)}), + 'regRLC_GPU_IOV_UCODE_ADDR': (23362, 1, {'ucode_addr': (0, 11), 'reserved': (12, 31)}), + 'regRLC_GPU_IOV_UCODE_DATA': (23363, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPU_IOV_SCRATCH_ADDR': (23364, 1, {'addr': (0, 8), 'reserved': (9, 31)}), + 'regRLC_GPU_IOV_SCRATCH_DATA': (23365, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_F32_CNTL': (23366, 1, {'enable': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_IOV_F32_RESET': (23367, 1, {'reset': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_IOV_SDMA0_STATUS': (23368, 1, {'preempted': (0, 0), 'reserved': (1, 7), 'saved': (8, 8), 'reserved1': (9, 11), 'restored': (12, 12), 'reserved2': (13, 31)}), + 'regRLC_GPU_IOV_SDMA1_STATUS': (23369, 1, {'preempted': (0, 0), 'reserved': (1, 7), 'saved': (8, 8), 'reserved1': (9, 11), 'restored': (12, 12), 'reserved2': (13, 31)}), + 'regRLC_GPU_IOV_SMU_RESPONSE': (23370, 1, {'resp': (0, 31)}), + 'regRLC_GPU_IOV_VIRT_RESET_REQ': (23372, 1, {'vf_flr': (0, 15), 'reserved': (16, 30), 'soft_pf_flr': (31, 31)}), + 'regRLC_GPU_IOV_RLC_RESPONSE': (23373, 1, {'resp': (0, 31)}), + 'regRLC_GPU_IOV_INT_DISABLE': (23374, 1, {'disable': (0, 31)}), + 'regRLC_GPU_IOV_INT_FORCE': (23375, 1, {'force': (0, 31)}), + 'regRLC_GPU_IOV_SDMA0_BUSY_STATUS': (23376, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA1_BUSY_STATUS': (23377, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_HYP_SEMAPHORE_2': (23378, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_HYP_SEMAPHORE_3': (23379, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_GPU_IOV_SDMA2_STATUS': (23380, 1, {'preempted': (0, 0), 'reserved': (1, 7), 'saved': (8, 8), 'reserved1': (9, 11), 'restored': (12, 12), 'reserved2': (13, 31)}), + 'regRLC_GPU_IOV_SDMA3_STATUS': (23381, 1, {'preempted': (0, 0), 'reserved': (1, 7), 'saved': (8, 8), 'reserved1': (9, 11), 'restored': (12, 12), 'reserved2': (13, 31)}), + 'regRLC_GPU_IOV_SDMA4_STATUS': (23382, 1, {'preempted': (0, 0), 'reserved': (1, 7), 'saved': (8, 8), 'reserved1': (9, 11), 'restored': (12, 12), 'reserved2': (13, 31)}), + 'regRLC_GPU_IOV_SDMA5_STATUS': (23383, 1, {'preempted': (0, 0), 'reserved': (1, 7), 'saved': (8, 8), 'reserved1': (9, 11), 'restored': (12, 12), 'reserved2': (13, 31)}), + 'regRLC_GPU_IOV_SDMA6_STATUS': (23384, 1, {'preempted': (0, 0), 'reserved': (1, 7), 'saved': (8, 8), 'reserved1': (9, 11), 'restored': (12, 12), 'reserved2': (13, 31)}), + 'regRLC_GPU_IOV_SDMA7_STATUS': (23385, 1, {'preempted': (0, 0), 'reserved': (1, 7), 'saved': (8, 8), 'reserved1': (9, 11), 'restored': (12, 12), 'reserved2': (13, 31)}), + 'regRLC_GPU_IOV_SDMA2_BUSY_STATUS': (23386, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA3_BUSY_STATUS': (23387, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA4_BUSY_STATUS': (23388, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA5_BUSY_STATUS': (23389, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA6_BUSY_STATUS': (23390, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA7_BUSY_STATUS': (23391, 1, {'vm_busy_status': (0, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF0': (23168, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF1': (23169, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF2': (23170, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF3': (23171, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF4': (23172, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF5': (23173, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF6': (23174, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF7': (23175, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF8': (23176, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF9': (23177, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF10': (23178, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF11': (23179, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF12': (23180, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF13': (23181, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF14': (23182, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF15': (23183, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCVM_IOMMU_MMIO_CNTRL_1': (23184, 1, {'marc_en': (8, 8)}), + 'regGCMC_VM_MARC_BASE_LO_0': (23185, 1, {'marc_base_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_1': (23186, 1, {'marc_base_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_2': (23187, 1, {'marc_base_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_3': (23188, 1, {'marc_base_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_BASE_HI_0': (23189, 1, {'marc_base_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_1': (23190, 1, {'marc_base_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_2': (23191, 1, {'marc_base_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_3': (23192, 1, {'marc_base_hi_3': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_LO_0': (23193, 1, {'marc_enable_0': (0, 0), 'marc_readonly_0': (1, 1), 'marc_reloc_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_1': (23194, 1, {'marc_enable_1': (0, 0), 'marc_readonly_1': (1, 1), 'marc_reloc_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_2': (23195, 1, {'marc_enable_2': (0, 0), 'marc_readonly_2': (1, 1), 'marc_reloc_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_3': (23196, 1, {'marc_enable_3': (0, 0), 'marc_readonly_3': (1, 1), 'marc_reloc_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_HI_0': (23197, 1, {'marc_reloc_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_1': (23198, 1, {'marc_reloc_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_2': (23199, 1, {'marc_reloc_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_3': (23200, 1, {'marc_reloc_hi_3': (0, 19)}), + 'regGCMC_VM_MARC_LEN_LO_0': (23201, 1, {'marc_len_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_1': (23202, 1, {'marc_len_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_2': (23203, 1, {'marc_len_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_3': (23204, 1, {'marc_len_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_LEN_HI_0': (23205, 1, {'marc_len_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_1': (23206, 1, {'marc_len_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_2': (23207, 1, {'marc_len_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_3': (23208, 1, {'marc_len_hi_3': (0, 19)}), + 'regGCVM_IOMMU_CONTROL_REGISTER': (23209, 1, {'iommuen': (0, 0)}), + 'regGCVM_IOMMU_PERFORMANCE_OPTIMIZATION_CONTROL_REGISTER': (23210, 1, {'perfopten': (13, 13)}), + 'regGCVM_PCIE_ATS_CNTL': (23211, 1, {'stu': (16, 20), 'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_0': (23212, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_1': (23213, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_2': (23214, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_3': (23215, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_4': (23216, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_5': (23217, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_6': (23218, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_7': (23219, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_8': (23220, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_9': (23221, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_10': (23222, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_11': (23223, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_12': (23224, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_13': (23225, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_14': (23226, 1, {'atc_enable': (31, 31)}), + 'regGCVM_PCIE_ATS_CNTL_VF_15': (23227, 1, {'atc_enable': (31, 31)}), + 'regGCMC_VM_XGMI_GPUIOV_ENABLE': (23229, 1, {'enable_vf0': (0, 0), 'enable_vf1': (1, 1), 'enable_vf2': (2, 2), 'enable_vf3': (3, 3), 'enable_vf4': (4, 4), 'enable_vf5': (5, 5), 'enable_vf6': (6, 6), 'enable_vf7': (7, 7), 'enable_vf8': (8, 8), 'enable_vf9': (9, 9), 'enable_vf10': (10, 10), 'enable_vf11': (11, 11), 'enable_vf12': (12, 12), 'enable_vf13': (13, 13), 'enable_vf14': (14, 14), 'enable_vf15': (15, 15), 'enable_pf': (31, 31)}), + 'regGRBM_SEC_CNTL': (24075, 1, {'debug_enable': (0, 0)}), + 'regGRBM_IOV_ERROR_FIFO_DATA': (24082, 1, {'iov_addr': (0, 17), 'iov_vfid': (18, 23), 'iov_ssrcid': (24, 27), 'iov_op': (28, 28), 'iov_vf': (29, 29), 'iov_overflow': (30, 30), 'iov_read_valid': (31, 31)}), + 'regGRBM_DSM_BYPASS': (24083, 1, {'bypass_bits': (0, 1), 'bypass_en': (2, 2)}), + 'regGRBM_CAM_INDEX': (24086, 1, {'cam_index': (0, 2)}), + 'regGRBM_HYP_CAM_INDEX': (24086, 1, {'cam_index': (0, 2)}), + 'regGRBM_CAM_DATA': (24087, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regGRBM_HYP_CAM_DATA': (24087, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regRLC_FWL_FIRST_VIOL_ADDR': (24375, 1, {'viol_status': (0, 0), 'viol_op': (1, 1), 'viol_addr': (2, 19), 'viol_aperture_id': (20, 31)}), +} +gc_11_0_0 = { + 'regSDMA0_CNTL': (28, 0, {'trap_enable': (0, 0), 'sem_wait_int_enable': (2, 2), 'data_swap_enable': (3, 3), 'fence_swap_enable': (4, 4), 'midcmd_preempt_enable': (5, 5), 'pio_done_ack_enable': (6, 6), 'tmz_midcmd_preempt_enable': (8, 8), 'midcmd_expire_enable': (9, 9), 'cp_mes_int_enable': (10, 10), 'page_retry_timeout_int_enable': (11, 11), 'page_null_int_enable': (12, 12), 'page_fault_int_enable': (13, 13), 'ch_perfcnt_enable': (16, 16), 'midcmd_worldswitch_enable': (17, 17), 'ctxempty_int_enable': (28, 28), 'frozen_int_enable': (29, 29), 'ib_preempt_int_enable': (30, 30), 'rb_preempt_int_enable': (31, 31)}), + 'regSDMA0_CNTL1': (39, 0, {'wptr_poll_frequency': (2, 15)}), + 'regSDMA0_WATCHDOG_CNTL': (46, 0, {'queue_hang_count': (0, 7), 'cmd_timeout_count': (8, 15)}), + 'regSDMA0_UTCL1_CNTL': (60, 0, {'redo_delay': (0, 4), 'page_wait_delay': (5, 8), 'resp_mode': (9, 10), 'force_invalidation': (14, 14), 'force_invreq_heavy': (15, 15), 'wr_exe_perms_ctrl': (16, 16), 'rd_exe_perms_ctrl': (17, 17), 'invack_delay': (18, 21), 'reql2_credit': (24, 29)}), + 'regSDMA0_UTCL1_PAGE': (63, 0, {'vm_hole': (0, 0), 'req_type': (1, 4), 'use_mtype': (6, 9), 'use_pt_snoop': (10, 10), 'use_io': (11, 11), 'rd_l2_policy': (12, 13), 'wr_l2_policy': (14, 15), 'dma_page_size': (16, 21), 'use_bc': (22, 22), 'addr_is_pa': (23, 23), 'llc_noalloc': (24, 24)}), + 'regSDMA0_RLC_CGCG_CTRL': (92, 0, {'cgcg_int_enable': (1, 1), 'cgcg_idle_hysteresis': (16, 31)}), + 'regSDMA0_QUEUE0_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_poll_enable': (8, 8), 'rb_swap_enable': (9, 9), 'wptr_poll_swap_enable': (10, 10), 'f32_wptr_poll_enable': (11, 11), 'rptr_writeback_enable': (12, 12), 'rptr_writeback_swap_enable': (13, 13), 'rptr_writeback_timer': (16, 20), 'rb_priv': (23, 23), 'rb_vmid': (24, 27)}), + 'regSDMA0_QUEUE0_RB_BASE': (129, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_BASE_HI': (130, 0, {'addr': (0, 23)}), + 'regSDMA0_QUEUE0_RB_RPTR': (131, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_HI': (132, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR': (133, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_HI': (134, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_ADDR_HI': (136, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_ADDR_LO': (137, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_IB_CNTL': (138, 0, {'ib_enable': (0, 0), 'ib_swap_enable': (4, 4), 'switch_inside_ib': (8, 8), 'cmd_vmid': (16, 19)}), + 'regSDMA0_QUEUE0_IB_RPTR': (139, 0, {'offset': (2, 21)}), + 'regSDMA0_QUEUE0_IB_OFFSET': (140, 0, {'offset': (2, 21)}), + 'regSDMA0_QUEUE0_IB_BASE_LO': (141, 0, {'addr': (5, 31)}), + 'regSDMA0_QUEUE0_IB_BASE_HI': (142, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_IB_SIZE': (143, 0, {'size': (0, 19)}), + 'regSDMA0_QUEUE0_SKIP_CNTL': (144, 0, {'skip_count': (0, 19)}), + 'regSDMA0_QUEUE0_CONTEXT_STATUS': (145, 0, {'selected': (0, 0), 'use_ib': (1, 1), 'idle': (2, 2), 'expired': (3, 3), 'exception': (4, 6), 'ctxsw_able': (7, 7), 'preempt_disable': (10, 10), 'rptr_wb_idle': (11, 11), 'wptr_update_pending': (12, 12), 'wptr_update_fail_count': (16, 23)}), + 'regSDMA0_QUEUE0_DOORBELL': (146, 0, {'enable': (28, 28), 'captured': (30, 30)}), + 'regSDMA0_QUEUE0_DOORBELL_LOG': (169, 0, {'be_error': (0, 0), 'data': (2, 31)}), + 'regSDMA0_QUEUE0_DOORBELL_OFFSET': (171, 0, {'offset': (2, 27)}), + 'regSDMA0_QUEUE0_CSA_ADDR_LO': (172, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_CSA_ADDR_HI': (173, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_SCHEDULE_CNTL': (174, 0, {'global_id': (0, 1), 'process_id': (2, 4), 'local_id': (6, 7), 'context_quantum': (8, 15)}), + 'regSDMA0_QUEUE0_IB_SUB_REMAIN': (175, 0, {'size': (0, 13)}), + 'regSDMA0_QUEUE0_PREEMPT': (176, 0, {'ib_preempt': (0, 0)}), + 'regSDMA0_QUEUE0_DUMMY_REG': (177, 0, {'dummy': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_HI': (178, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_LO': (179, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_RB_AQL_CNTL': (180, 0, {'aql_enable': (0, 0), 'aql_packet_size': (1, 7), 'packet_step': (8, 15), 'midcmd_preempt_enable': (16, 16), 'midcmd_preempt_data_restore': (17, 17), 'overlap_enable': (18, 18)}), + 'regSDMA0_QUEUE0_MINOR_PTR_UPDATE': (181, 0, {'enable': (0, 0)}), + 'regSDMA0_QUEUE0_RB_PREEMPT': (182, 0, {'preempt_req': (0, 0)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA0': (192, 0, {'data0': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA1': (193, 0, {'data1': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA2': (194, 0, {'data2': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA3': (195, 0, {'data3': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA4': (196, 0, {'data4': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA5': (197, 0, {'data5': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA6': (198, 0, {'data6': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA7': (199, 0, {'data7': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA8': (200, 0, {'data8': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA9': (201, 0, {'data9': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA10': (202, 0, {'data10': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_CNTL': (203, 0, {'data_valid': (0, 0), 'copy_mode': (1, 1), 'split_state': (4, 7), 'allow_preempt': (8, 8)}), + 'regSDMA1_CNTL': (1564, 0, {'trap_enable': (0, 0), 'sem_wait_int_enable': (2, 2), 'data_swap_enable': (3, 3), 'fence_swap_enable': (4, 4), 'midcmd_preempt_enable': (5, 5), 'pio_done_ack_enable': (6, 6), 'tmz_midcmd_preempt_enable': (8, 8), 'midcmd_expire_enable': (9, 9), 'cp_mes_int_enable': (10, 10), 'page_retry_timeout_int_enable': (11, 11), 'page_null_int_enable': (12, 12), 'page_fault_int_enable': (13, 13), 'ch_perfcnt_enable': (16, 16), 'midcmd_worldswitch_enable': (17, 17), 'ctxempty_int_enable': (28, 28), 'frozen_int_enable': (29, 29), 'ib_preempt_int_enable': (30, 30), 'rb_preempt_int_enable': (31, 31)}), + 'regSDMA1_CNTL1': (1575, 0, {'wptr_poll_frequency': (2, 15)}), + 'regSDMA1_WATCHDOG_CNTL': (1582, 0, {'queue_hang_count': (0, 7), 'cmd_timeout_count': (8, 15)}), + 'regSDMA1_UTCL1_CNTL': (1596, 0, {'redo_delay': (0, 4), 'page_wait_delay': (5, 8), 'resp_mode': (9, 10), 'force_invalidation': (14, 14), 'force_invreq_heavy': (15, 15), 'wr_exe_perms_ctrl': (16, 16), 'rd_exe_perms_ctrl': (17, 17), 'invack_delay': (18, 21), 'reql2_credit': (24, 29)}), + 'regSDMA1_UTCL1_PAGE': (1599, 0, {'vm_hole': (0, 0), 'req_type': (1, 4), 'use_mtype': (6, 9), 'use_pt_snoop': (10, 10), 'use_io': (11, 11), 'rd_l2_policy': (12, 13), 'wr_l2_policy': (14, 15), 'dma_page_size': (16, 21), 'use_bc': (22, 22), 'addr_is_pa': (23, 23), 'llc_noalloc': (24, 24)}), + 'regSDMA1_RLC_CGCG_CTRL': (1628, 0, {'cgcg_int_enable': (1, 1), 'cgcg_idle_hysteresis': (16, 31)}), + 'regSDMA1_QUEUE0_RB_CNTL': (1664, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_poll_enable': (8, 8), 'rb_swap_enable': (9, 9), 'wptr_poll_swap_enable': (10, 10), 'f32_wptr_poll_enable': (11, 11), 'rptr_writeback_enable': (12, 12), 'rptr_writeback_swap_enable': (13, 13), 'rptr_writeback_timer': (16, 20), 'rb_priv': (23, 23), 'rb_vmid': (24, 27)}), + 'regSDMA1_QUEUE0_RB_BASE': (1665, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_RB_BASE_HI': (1666, 0, {'addr': (0, 23)}), + 'regSDMA1_QUEUE0_RB_RPTR': (1667, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_HI': (1668, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR': (1669, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_HI': (1670, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_ADDR_HI': (1672, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_ADDR_LO': (1673, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_IB_CNTL': (1674, 0, {'ib_enable': (0, 0), 'ib_swap_enable': (4, 4), 'switch_inside_ib': (8, 8), 'cmd_vmid': (16, 19)}), + 'regSDMA1_QUEUE0_IB_RPTR': (1675, 0, {'offset': (2, 21)}), + 'regSDMA1_QUEUE0_IB_OFFSET': (1676, 0, {'offset': (2, 21)}), + 'regSDMA1_QUEUE0_IB_BASE_LO': (1677, 0, {'addr': (5, 31)}), + 'regSDMA1_QUEUE0_IB_BASE_HI': (1678, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_IB_SIZE': (1679, 0, {'size': (0, 19)}), + 'regSDMA1_QUEUE0_SKIP_CNTL': (1680, 0, {'skip_count': (0, 19)}), + 'regSDMA1_QUEUE0_CONTEXT_STATUS': (1681, 0, {'selected': (0, 0), 'use_ib': (1, 1), 'idle': (2, 2), 'expired': (3, 3), 'exception': (4, 6), 'ctxsw_able': (7, 7), 'preempt_disable': (10, 10), 'rptr_wb_idle': (11, 11), 'wptr_update_pending': (12, 12), 'wptr_update_fail_count': (16, 23)}), + 'regSDMA1_QUEUE0_DOORBELL': (1682, 0, {'enable': (28, 28), 'captured': (30, 30)}), + 'regSDMA1_QUEUE0_DOORBELL_LOG': (1705, 0, {'be_error': (0, 0), 'data': (2, 31)}), + 'regSDMA1_QUEUE0_DOORBELL_OFFSET': (1707, 0, {'offset': (2, 27)}), + 'regSDMA1_QUEUE0_CSA_ADDR_LO': (1708, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_CSA_ADDR_HI': (1709, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_SCHEDULE_CNTL': (1710, 0, {'global_id': (0, 1), 'process_id': (2, 4), 'local_id': (6, 7), 'context_quantum': (8, 15)}), + 'regSDMA1_QUEUE0_IB_SUB_REMAIN': (1711, 0, {'size': (0, 13)}), + 'regSDMA1_QUEUE0_PREEMPT': (1712, 0, {'ib_preempt': (0, 0)}), + 'regSDMA1_QUEUE0_DUMMY_REG': (1713, 0, {'dummy': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_HI': (1714, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_LO': (1715, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_RB_AQL_CNTL': (1716, 0, {'aql_enable': (0, 0), 'aql_packet_size': (1, 7), 'packet_step': (8, 15), 'midcmd_preempt_enable': (16, 16), 'midcmd_preempt_data_restore': (17, 17), 'overlap_enable': (18, 18)}), + 'regSDMA1_QUEUE0_MINOR_PTR_UPDATE': (1717, 0, {'enable': (0, 0)}), + 'regSDMA1_QUEUE0_RB_PREEMPT': (1718, 0, {'preempt_req': (0, 0)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA0': (1728, 0, {'data0': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA1': (1729, 0, {'data1': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA2': (1730, 0, {'data2': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA3': (1731, 0, {'data3': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA4': (1732, 0, {'data4': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA5': (1733, 0, {'data5': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA6': (1734, 0, {'data6': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA7': (1735, 0, {'data7': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA8': (1736, 0, {'data8': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA9': (1737, 0, {'data9': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA10': (1738, 0, {'data10': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_CNTL': (1739, 0, {'data_valid': (0, 0), 'copy_mode': (1, 1), 'split_state': (4, 7), 'allow_preempt': (8, 8)}), + 'regSDMA0_F32_CNTL': (22682, 1, {'halt': (0, 0), 'th0_checksum_clr': (8, 8), 'th0_reset': (9, 9), 'th0_enable': (10, 10), 'th1_checksum_clr': (12, 12), 'th1_reset': (13, 13), 'th1_enable': (14, 14), 'th0_priority': (16, 23), 'th1_priority': (24, 31)}), + 'regSDMA1_F32_CNTL': (22714, 1, {'halt': (0, 0), 'th0_checksum_clr': (8, 8), 'th0_reset': (9, 9), 'th0_enable': (10, 10), 'th1_checksum_clr': (12, 12), 'th1_reset': (13, 13), 'th1_enable': (14, 14), 'th0_priority': (16, 23), 'th1_priority': (24, 31)}), + 'regGRBM_CNTL': (3488, 0, {'read_timeout': (0, 7), 'report_last_rderr': (31, 31)}), + 'regGRBM_SKEW_CNTL': (3489, 0, {'skew_top_threshold': (0, 5), 'skew_count': (6, 11)}), + 'regGRBM_STATUS2': (3490, 0, {'me0pipe1_cmdfifo_avail': (0, 3), 'me0pipe1_cf_rq_pending': (4, 4), 'me0pipe1_pf_rq_pending': (5, 5), 'me1pipe0_rq_pending': (6, 6), 'me1pipe1_rq_pending': (7, 7), 'me1pipe2_rq_pending': (8, 8), 'me1pipe3_rq_pending': (9, 9), 'rlc_rq_pending': (14, 14), 'utcl2_busy': (15, 15), 'ea_busy': (16, 16), 'rmi_busy': (17, 17), 'utcl2_rq_pending': (18, 18), 'sdma_sch_rq_pending': (19, 19), 'ea_link_busy': (20, 20), 'sdma_busy': (21, 21), 'sdma0_rq_pending': (22, 22), 'sdma1_rq_pending': (23, 23), 'rlc_busy': (26, 26), 'tcp_busy': (27, 27), 'cpf_busy': (28, 28), 'cpc_busy': (29, 29), 'cpg_busy': (30, 30)}), + 'regGRBM_PWR_CNTL': (3491, 0, {'all_req_type': (0, 1), 'gfx_req_type': (2, 3), 'all_rsp_type': (4, 5), 'gfx_rsp_type': (6, 7), 'gfx_req_en': (14, 14), 'all_req_en': (15, 15)}), + 'regGRBM_STATUS': (3492, 0, {'me0pipe0_cmdfifo_avail': (0, 3), 'sdma_rq_pending': (6, 6), 'me0pipe0_cf_rq_pending': (7, 7), 'me0pipe0_pf_rq_pending': (8, 8), 'gds_dma_rq_pending': (9, 9), 'db_clean': (12, 12), 'cb_clean': (13, 13), 'ta_busy': (14, 14), 'gds_busy': (15, 15), 'ge_busy_no_dma': (16, 16), 'sx_busy': (20, 20), 'ge_busy': (21, 21), 'spi_busy': (22, 22), 'bci_busy': (23, 23), 'sc_busy': (24, 24), 'pa_busy': (25, 25), 'db_busy': (26, 26), 'any_active': (27, 27), 'cp_coherency_busy': (28, 28), 'cp_busy': (29, 29), 'cb_busy': (30, 30), 'gui_active': (31, 31)}), + 'regGRBM_STATUS_SE0': (3493, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE1': (3494, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS3': (3495, 0, {'grbm_rlc_intr_credit_pending': (5, 5), 'grbm_cpf_intr_credit_pending': (7, 7), 'mespipe0_rq_pending': (8, 8), 'mespipe1_rq_pending': (9, 9), 'ph_busy': (13, 13), 'ch_busy': (14, 14), 'gl2cc_busy': (15, 15), 'gl1cc_busy': (16, 16), 'sedc_busy': (25, 25), 'pc_busy': (26, 26), 'gl1h_busy': (27, 27), 'gus_link_busy': (28, 28), 'gus_busy': (29, 29), 'utcl1_busy': (30, 30), 'pmm_busy': (31, 31)}), + 'regGRBM_SOFT_RESET': (3496, 0, {'soft_reset_cp': (0, 0), 'soft_reset_rlc': (2, 2), 'soft_reset_utcl2': (15, 15), 'soft_reset_gfx': (16, 16), 'soft_reset_cpf': (17, 17), 'soft_reset_cpc': (18, 18), 'soft_reset_cpg': (19, 19), 'soft_reset_cac': (20, 20), 'soft_reset_ea': (22, 22), 'soft_reset_sdma0': (23, 23), 'soft_reset_sdma1': (24, 24)}), + 'regGRBM_GFX_CLKEN_CNTL': (3500, 0, {'prefix_delay_cnt': (0, 3), 'post_delay_cnt': (8, 12)}), + 'regGRBM_WAIT_IDLE_CLOCKS': (3501, 0, {'wait_idle_clocks': (0, 7)}), + 'regGRBM_STATUS_SE2': (3502, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE3': (3503, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE4': (3504, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE5': (3505, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_READ_ERROR': (3510, 0, {'read_address': (2, 19), 'read_pipeid': (20, 21), 'read_meid': (22, 23), 'read_error': (31, 31)}), + 'regGRBM_READ_ERROR2': (3511, 0, {'read_requester_mespipe0': (9, 9), 'read_requester_mespipe1': (10, 10), 'read_requester_mespipe2': (11, 11), 'read_requester_mespipe3': (12, 12), 'read_requester_sdma0': (13, 13), 'read_requester_sdma1': (14, 14), 'read_requester_rlc': (18, 18), 'read_requester_gds_dma': (19, 19), 'read_requester_me0pipe0_cf': (20, 20), 'read_requester_me0pipe0_pf': (21, 21), 'read_requester_me0pipe1_cf': (22, 22), 'read_requester_me0pipe1_pf': (23, 23), 'read_requester_me1pipe0': (24, 24), 'read_requester_me1pipe1': (25, 25), 'read_requester_me1pipe2': (26, 26), 'read_requester_me1pipe3': (27, 27), 'read_requester_me2pipe0': (28, 28), 'read_requester_me2pipe1': (29, 29), 'read_requester_me2pipe2': (30, 30), 'read_requester_me2pipe3': (31, 31)}), + 'regGRBM_INT_CNTL': (3512, 0, {'rderr_int_enable': (0, 0), 'gui_idle_int_enable': (19, 19)}), + 'regGRBM_TRAP_OP': (3513, 0, {'rw': (0, 0)}), + 'regGRBM_TRAP_ADDR': (3514, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_ADDR_MSK': (3515, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_WD': (3516, 0, {'data': (0, 31)}), + 'regGRBM_TRAP_WD_MSK': (3517, 0, {'data': (0, 31)}), + 'regGRBM_DSM_BYPASS': (3518, 0, {'bypass_bits': (0, 1), 'bypass_en': (2, 2)}), + 'regGRBM_WRITE_ERROR': (3519, 0, {'write_requester_rlc': (0, 0), 'write_ssrcid': (2, 5), 'write_vfid': (8, 11), 'write_vf': (12, 12), 'write_vmid': (13, 16), 'tmz': (17, 17), 'write_pipeid': (20, 21), 'write_meid': (22, 23), 'write_error': (31, 31)}), + 'regGRBM_CHIP_REVISION': (3521, 0, {'chip_revision': (0, 7)}), + 'regGRBM_IH_CREDIT': (3524, 0, {'credit_value': (0, 1), 'ih_client_id': (16, 23)}), + 'regGRBM_PWR_CNTL2': (3525, 0, {'pwr_request_halt': (16, 16), 'pwr_gfx3d_request_halt': (20, 20)}), + 'regGRBM_UTCL2_INVAL_RANGE_START': (3526, 0, {'data': (0, 17)}), + 'regGRBM_UTCL2_INVAL_RANGE_END': (3527, 0, {'data': (0, 17)}), + 'regGRBM_INVALID_PIPE': (3529, 0, {'addr': (2, 19), 'pipeid': (20, 21), 'meid': (22, 23), 'queueid': (24, 26), 'ssrcid': (27, 30), 'invalid_pipe': (31, 31)}), + 'regGRBM_FENCE_RANGE0': (3530, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_FENCE_RANGE1': (3531, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_SCRATCH_REG0': (3552, 0, {'scratch_reg0': (0, 31)}), + 'regGRBM_SCRATCH_REG1': (3553, 0, {'scratch_reg1': (0, 31)}), + 'regGRBM_SCRATCH_REG2': (3554, 0, {'scratch_reg2': (0, 31)}), + 'regGRBM_SCRATCH_REG3': (3555, 0, {'scratch_reg3': (0, 31)}), + 'regGRBM_SCRATCH_REG4': (3556, 0, {'scratch_reg4': (0, 31)}), + 'regGRBM_SCRATCH_REG5': (3557, 0, {'scratch_reg5': (0, 31)}), + 'regGRBM_SCRATCH_REG6': (3558, 0, {'scratch_reg6': (0, 31)}), + 'regGRBM_SCRATCH_REG7': (3559, 0, {'scratch_reg7': (0, 31)}), + 'regCP_MEC_ME1_HEADER_DUMP': (3630, 0, {'header_dump': (0, 31)}), + 'regCP_MEC_ME2_HEADER_DUMP': (3631, 0, {'header_dump': (0, 31)}), + 'regCP_STAT': (3904, 0, {'roq_db_busy': (5, 5), 'roq_ce_db_busy': (6, 6), 'roq_ring_busy': (9, 9), 'roq_indirect1_busy': (10, 10), 'roq_indirect2_busy': (11, 11), 'roq_state_busy': (12, 12), 'dc_busy': (13, 13), 'utcl2iu_busy': (14, 14), 'pfp_busy': (15, 15), 'meq_busy': (16, 16), 'me_busy': (17, 17), 'query_busy': (18, 18), 'semaphore_busy': (19, 19), 'interrupt_busy': (20, 20), 'surface_sync_busy': (21, 21), 'dma_busy': (22, 22), 'rciu_busy': (23, 23), 'scratch_ram_busy': (24, 24), 'gcriu_busy': (25, 25), 'ce_busy': (26, 26), 'tciu_busy': (27, 27), 'roq_ce_ring_busy': (28, 28), 'roq_ce_indirect1_busy': (29, 29), 'roq_ce_indirect2_busy': (30, 30), 'cp_busy': (31, 31)}), + 'regCP_MEC1_INSTR_PNTR': (3912, 0, {'instr_pntr': (0, 15)}), + 'regCP_MEC2_INSTR_PNTR': (3913, 0, {'instr_pntr': (0, 15)}), + 'regCP_RB_WPTR_POLL_CNTL': (3938, 0, {'poll_frequency': (0, 15), 'idle_poll_count': (16, 31)}), + 'regGB_ADDR_CONFIG': (5086, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 20), 'num_rb_per_se': (26, 27)}), + 'regGB_ADDR_CONFIG_READ': (5090, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 20), 'num_rb_per_se': (26, 27)}), + 'regGCMC_VM_NB_TOP_OF_DRAM_SLOT1': (5540, 0, {'top_of_dram': (23, 31)}), + 'regGCMC_VM_NB_LOWER_TOP_OF_DRAM2': (5541, 0, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regGCMC_VM_NB_UPPER_TOP_OF_DRAM2': (5542, 0, {'upper_tom2': (0, 11)}), + 'regGCMC_VM_FB_OFFSET': (5543, 0, {'fb_offset': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (5544, 0, {'physical_page_number_lsb': (0, 31)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (5545, 0, {'physical_page_number_msb': (0, 3)}), + 'regGCMC_VM_STEERING': (5546, 0, {'default_steering': (0, 1)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_START': (5549, 0, {'address': (0, 19)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_END': (5550, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_SYSMEM_ADDRESS_START': (5551, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_SYSMEM_ADDRESS_END': (5552, 0, {'address': (0, 19)}), + 'regGCMC_VM_APT_CNTL': (5553, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_START': (5554, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_END': (5555, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (5556, 0, {'lock': (0, 0)}), + 'regGCMC_VM_FB_NOALLOC_CNTL': (5560, 0, {'local_fb_noalloc_nopte': (0, 0), 'remote_fb_noalloc_nopte': (1, 1), 'fb_noalloc_walker_fetch': (2, 2), 'router_atcl2_noalloc': (3, 3), 'router_gpa_mode2_noalloc': (4, 4), 'router_gpa_mode3_noalloc': (5, 5)}), + 'regGCVM_L2_CNTL': (5564, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regGCVM_L2_CNTL2': (5565, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regGCVM_L2_CNTL3': (5566, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regGCVM_L2_STATUS': (5567, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regGCVM_DUMMY_PAGE_FAULT_CNTL': (5568, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_LO32': (5569, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_HI32': (5570, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regGCVM_INVALIDATE_CNTL': (5571, 0, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL': (5572, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL2': (5573, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL3': (5574, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL4': (5575, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_STATUS': (5576, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'prt': (29, 29)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_LO32': (5577, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_HI32': (5578, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (5579, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (5580, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (5582, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (5583, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (5584, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (5585, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (5586, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (5587, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regGCVM_L2_CNTL4': (5588, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regGCVM_L2_MM_GROUP_RT_CLASSES': (5589, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID': (5590, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID2': (5591, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regGCVM_L2_CACHE_PARITY_CNTL': (5592, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regGCVM_L2_ICG_CTRL': (5593, 0, {'off_hysteresis': (0, 3), 'dynamic_clock_override': (4, 4), 'static_clock_override': (5, 5), 'aon_clock_override': (6, 6), 'perfmon_clock_override': (7, 7)}), + 'regGCVM_L2_CNTL5': (5594, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'utcl2_atc_req_fgcg_off': (16, 16)}), + 'regGCVM_L2_GCR_CNTL': (5595, 0, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regGCVML2_WALKER_MACRO_THROTTLE_TIME': (5596, 0, {'time': (0, 23)}), + 'regGCVML2_WALKER_MACRO_THROTTLE_FETCH_LIMIT': (5597, 0, {'limit': (1, 15)}), + 'regGCVML2_WALKER_MICRO_THROTTLE_TIME': (5598, 0, {'time': (0, 23)}), + 'regGCVML2_WALKER_MICRO_THROTTLE_FETCH_LIMIT': (5599, 0, {'limit': (1, 15)}), + 'regGCVM_L2_CGTT_BUSY_CTRL': (5600, 0, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regGCVM_L2_PTE_CACHE_DUMP_CNTL': (5601, 0, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regGCVM_L2_PTE_CACHE_DUMP_READ': (5602, 0, {'data': (0, 31)}), + 'regGCVM_L2_BANK_SELECT_MASKS': (5609, 0, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regGCVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (5613, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regGCVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (5614, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regGCMC_VM_FB_LOCATION_BASE': (5752, 0, {'fb_base': (0, 23)}), + 'regGCMC_VM_FB_LOCATION_TOP': (5753, 0, {'fb_top': (0, 23)}), + 'regGCMC_VM_AGP_TOP': (5754, 0, {'agp_top': (0, 23)}), + 'regGCMC_VM_AGP_BOT': (5755, 0, {'agp_bot': (0, 23)}), + 'regGCMC_VM_AGP_BASE': (5756, 0, {'agp_base': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_LOW_ADDR': (5757, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (5758, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_MX_L1_TLB_CNTL': (5759, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 13)}), + 'regGCVM_CONTEXT0_CNTL': (5768, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT1_CNTL': (5769, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT2_CNTL': (5770, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT3_CNTL': (5771, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT4_CNTL': (5772, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT5_CNTL': (5773, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT6_CNTL': (5774, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT7_CNTL': (5775, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT8_CNTL': (5776, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT9_CNTL': (5777, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT10_CNTL': (5778, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT11_CNTL': (5779, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT12_CNTL': (5780, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT13_CNTL': (5781, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT14_CNTL': (5782, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT15_CNTL': (5783, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXTS_DISABLE': (5784, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regGCVM_INVALIDATE_ENG0_SEM': (5785, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG1_SEM': (5786, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG2_SEM': (5787, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG3_SEM': (5788, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG4_SEM': (5789, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG5_SEM': (5790, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG6_SEM': (5791, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG7_SEM': (5792, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG8_SEM': (5793, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG9_SEM': (5794, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG10_SEM': (5795, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG11_SEM': (5796, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG12_SEM': (5797, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG13_SEM': (5798, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG14_SEM': (5799, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG15_SEM': (5800, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG16_SEM': (5801, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG17_SEM': (5802, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG0_REQ': (5803, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG1_REQ': (5804, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG2_REQ': (5805, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG3_REQ': (5806, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG4_REQ': (5807, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG5_REQ': (5808, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG6_REQ': (5809, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG7_REQ': (5810, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG8_REQ': (5811, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG9_REQ': (5812, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG10_REQ': (5813, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG11_REQ': (5814, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG12_REQ': (5815, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG13_REQ': (5816, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG14_REQ': (5817, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG15_REQ': (5818, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG16_REQ': (5819, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG17_REQ': (5820, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG0_ACK': (5821, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG1_ACK': (5822, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG2_ACK': (5823, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG3_ACK': (5824, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG4_ACK': (5825, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG5_ACK': (5826, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG6_ACK': (5827, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG7_ACK': (5828, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG8_ACK': (5829, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG9_ACK': (5830, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG10_ACK': (5831, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG11_ACK': (5832, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG12_ACK': (5833, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG13_ACK': (5834, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG14_ACK': (5835, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG15_ACK': (5836, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG16_ACK': (5837, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG17_ACK': (5838, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (5839, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (5840, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (5841, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (5842, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (5843, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (5844, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (5845, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (5846, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (5847, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (5848, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (5849, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (5850, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (5851, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (5852, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (5853, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (5854, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (5855, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (5856, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (5857, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (5858, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (5859, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (5860, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (5861, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (5862, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (5863, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (5864, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (5865, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (5866, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (5867, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (5868, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (5869, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (5870, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (5871, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (5872, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (5873, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (5874, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (5875, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (5876, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (5877, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (5878, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (5879, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (5880, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (5881, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (5882, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (5883, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (5884, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (5885, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (5886, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (5887, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (5888, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (5889, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (5890, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (5891, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (5892, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (5893, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (5894, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (5895, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (5896, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (5897, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (5898, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (5899, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (5900, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (5901, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (5902, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (5903, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (5904, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (5905, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (5906, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (5907, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (5908, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (5909, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (5910, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (5911, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (5912, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (5913, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (5914, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (5915, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (5916, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (5917, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (5918, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (5919, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (5920, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (5921, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (5922, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (5923, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (5924, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (5925, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (5926, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (5927, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (5928, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (5929, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (5930, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (5931, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (5932, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (5933, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (5934, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (5935, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (5936, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (5937, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (5938, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (5939, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (5940, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (5941, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (5942, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (5943, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (5944, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (5945, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (5946, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (5947, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (5948, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (5949, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (5950, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (5951, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (5952, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (5953, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (5954, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (5955, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (5956, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (5957, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (5958, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (5959, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (5960, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (5961, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (5962, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (5963, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (5964, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (5965, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (5966, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (5967, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (5968, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (5969, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (5970, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5971, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5972, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5973, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5974, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5975, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5976, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5977, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5978, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5979, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5980, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5981, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5982, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5983, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5984, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5985, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5986, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5987, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVML2_PERFCOUNTER2_0_LO': (13536, 1, {'perfcounter_lo': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_1_LO': (13537, 1, {'perfcounter_lo': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_0_HI': (13538, 1, {'perfcounter_hi': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_1_HI': (13539, 1, {'perfcounter_hi': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_LO': (13540, 1, {'counter_lo': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_HI': (13541, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regGCVML2_PERFCOUNTER2_0_SELECT': (15648, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_1_SELECT': (15649, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_0_SELECT1': (15650, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_1_SELECT1': (15651, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_0_MODE': (15652, 1, {'compare_mode0': (0, 1), 'compare_mode1': (2, 3), 'compare_mode2': (4, 5), 'compare_mode3': (6, 7), 'compare_value0': (8, 11), 'compare_value1': (12, 15), 'compare_value2': (16, 19), 'compare_value3': (20, 23)}), + 'regGCVML2_PERFCOUNTER2_1_MODE': (15653, 1, {'compare_mode0': (0, 1), 'compare_mode1': (2, 3), 'compare_mode2': (4, 5), 'compare_mode3': (6, 7), 'compare_value0': (8, 11), 'compare_value1': (12, 15), 'compare_value2': (16, 19), 'compare_value3': (20, 23)}), + 'regGCMC_VM_L2_PERFCOUNTER0_CFG': (15664, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER1_CFG': (15665, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER2_CFG': (15666, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER3_CFG': (15667, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER4_CFG': (15668, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER5_CFG': (15669, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER6_CFG': (15670, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER7_CFG': (15671, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (15672, 1, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF0': (23168, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF1': (23169, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF2': (23170, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF3': (23171, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF4': (23172, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF5': (23173, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF6': (23174, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF7': (23175, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF8': (23176, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF9': (23177, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF10': (23178, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF11': (23179, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF12': (23180, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF13': (23181, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF14': (23182, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF15': (23183, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_MARC_BASE_LO_0': (24136, 1, {'marc_base_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_1': (24137, 1, {'marc_base_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_2': (24138, 1, {'marc_base_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_3': (24139, 1, {'marc_base_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_4': (24140, 1, {'marc_base_lo_4': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_5': (24141, 1, {'marc_base_lo_5': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_6': (24142, 1, {'marc_base_lo_6': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_7': (24143, 1, {'marc_base_lo_7': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_8': (24144, 1, {'marc_base_lo_8': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_9': (24145, 1, {'marc_base_lo_9': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_10': (24146, 1, {'marc_base_lo_10': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_11': (24147, 1, {'marc_base_lo_11': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_12': (24148, 1, {'marc_base_lo_12': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_13': (24149, 1, {'marc_base_lo_13': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_14': (24150, 1, {'marc_base_lo_14': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_15': (24151, 1, {'marc_base_lo_15': (12, 31)}), + 'regGCMC_VM_MARC_BASE_HI_0': (24152, 1, {'marc_base_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_1': (24153, 1, {'marc_base_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_2': (24154, 1, {'marc_base_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_3': (24155, 1, {'marc_base_hi_3': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_4': (24156, 1, {'marc_base_hi_4': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_5': (24157, 1, {'marc_base_hi_5': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_6': (24158, 1, {'marc_base_hi_6': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_7': (24159, 1, {'marc_base_hi_7': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_8': (24160, 1, {'marc_base_hi_8': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_9': (24161, 1, {'marc_base_hi_9': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_10': (24162, 1, {'marc_base_hi_10': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_11': (24163, 1, {'marc_base_hi_11': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_12': (24164, 1, {'marc_base_hi_12': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_13': (24165, 1, {'marc_base_hi_13': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_14': (24166, 1, {'marc_base_hi_14': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_15': (24167, 1, {'marc_base_hi_15': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_LO_0': (24168, 1, {'marc_enable_0': (0, 0), 'marc_readonly_0': (1, 1), 'marc_reloc_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_1': (24169, 1, {'marc_enable_1': (0, 0), 'marc_readonly_1': (1, 1), 'marc_reloc_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_2': (24170, 1, {'marc_enable_2': (0, 0), 'marc_readonly_2': (1, 1), 'marc_reloc_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_3': (24171, 1, {'marc_enable_3': (0, 0), 'marc_readonly_3': (1, 1), 'marc_reloc_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_4': (24172, 1, {'marc_enable_4': (0, 0), 'marc_readonly_4': (1, 1), 'marc_reloc_lo_4': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_5': (24173, 1, {'marc_enable_5': (0, 0), 'marc_readonly_5': (1, 1), 'marc_reloc_lo_5': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_6': (24174, 1, {'marc_enable_6': (0, 0), 'marc_readonly_6': (1, 1), 'marc_reloc_lo_6': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_7': (24175, 1, {'marc_enable_7': (0, 0), 'marc_readonly_7': (1, 1), 'marc_reloc_lo_7': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_8': (24176, 1, {'marc_enable_8': (0, 0), 'marc_readonly_8': (1, 1), 'marc_reloc_lo_8': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_9': (24177, 1, {'marc_enable_9': (0, 0), 'marc_readonly_9': (1, 1), 'marc_reloc_lo_9': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_10': (24178, 1, {'marc_enable_10': (0, 0), 'marc_readonly_10': (1, 1), 'marc_reloc_lo_10': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_11': (24179, 1, {'marc_enable_11': (0, 0), 'marc_readonly_11': (1, 1), 'marc_reloc_lo_11': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_12': (24180, 1, {'marc_enable_12': (0, 0), 'marc_readonly_12': (1, 1), 'marc_reloc_lo_12': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_13': (24181, 1, {'marc_enable_13': (0, 0), 'marc_readonly_13': (1, 1), 'marc_reloc_lo_13': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_14': (24182, 1, {'marc_enable_14': (0, 0), 'marc_readonly_14': (1, 1), 'marc_reloc_lo_14': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_15': (24183, 1, {'marc_enable_15': (0, 0), 'marc_readonly_15': (1, 1), 'marc_reloc_lo_15': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_HI_0': (24184, 1, {'marc_reloc_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_1': (24185, 1, {'marc_reloc_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_2': (24186, 1, {'marc_reloc_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_3': (24187, 1, {'marc_reloc_hi_3': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_4': (24188, 1, {'marc_reloc_hi_4': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_5': (24189, 1, {'marc_reloc_hi_5': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_6': (24190, 1, {'marc_reloc_hi_6': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_7': (24191, 1, {'marc_reloc_hi_7': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_8': (24192, 1, {'marc_reloc_hi_8': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_9': (24193, 1, {'marc_reloc_hi_9': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_10': (24194, 1, {'marc_reloc_hi_10': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_11': (24195, 1, {'marc_reloc_hi_11': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_12': (24196, 1, {'marc_reloc_hi_12': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_13': (24197, 1, {'marc_reloc_hi_13': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_14': (24198, 1, {'marc_reloc_hi_14': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_15': (24199, 1, {'marc_reloc_hi_15': (0, 19)}), + 'regGCMC_VM_MARC_LEN_LO_0': (24200, 1, {'marc_len_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_1': (24201, 1, {'marc_len_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_2': (24202, 1, {'marc_len_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_3': (24203, 1, {'marc_len_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_4': (24204, 1, {'marc_len_lo_4': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_5': (24205, 1, {'marc_len_lo_5': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_6': (24206, 1, {'marc_len_lo_6': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_7': (24207, 1, {'marc_len_lo_7': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_8': (24208, 1, {'marc_len_lo_8': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_9': (24209, 1, {'marc_len_lo_9': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_10': (24210, 1, {'marc_len_lo_10': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_11': (24211, 1, {'marc_len_lo_11': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_12': (24212, 1, {'marc_len_lo_12': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_13': (24213, 1, {'marc_len_lo_13': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_14': (24214, 1, {'marc_len_lo_14': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_15': (24215, 1, {'marc_len_lo_15': (12, 31)}), + 'regGCMC_VM_MARC_LEN_HI_0': (24216, 1, {'marc_len_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_1': (24217, 1, {'marc_len_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_2': (24218, 1, {'marc_len_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_3': (24219, 1, {'marc_len_hi_3': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_4': (24220, 1, {'marc_len_hi_4': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_5': (24221, 1, {'marc_len_hi_5': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_6': (24222, 1, {'marc_len_hi_6': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_7': (24223, 1, {'marc_len_hi_7': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_8': (24224, 1, {'marc_len_hi_8': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_9': (24225, 1, {'marc_len_hi_9': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_10': (24226, 1, {'marc_len_hi_10': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_11': (24227, 1, {'marc_len_hi_11': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_12': (24228, 1, {'marc_len_hi_12': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_13': (24229, 1, {'marc_len_hi_13': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_14': (24230, 1, {'marc_len_hi_14': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_15': (24231, 1, {'marc_len_hi_15': (0, 19)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_0': (24232, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_1': (24233, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_2': (24234, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_3': (24235, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_4': (24236, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_5': (24237, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_6': (24238, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_7': (24239, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_8': (24240, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_9': (24241, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_10': (24242, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_11': (24243, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_12': (24244, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_13': (24245, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_14': (24246, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_15': (24247, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regCOMPUTE_DISPATCH_INITIATOR': (7072, 0, {'compute_shader_en': (0, 0), 'partial_tg_en': (1, 1), 'force_start_at_000': (2, 2), 'ordered_append_enbl': (3, 3), 'ordered_append_mode': (4, 4), 'use_thread_dimensions': (5, 5), 'order_mode': (6, 6), 'scalar_l1_inv_vol': (10, 10), 'vector_l1_inv_vol': (11, 11), 'reserved': (12, 12), 'tunnel_enable': (13, 13), 'restore': (14, 14), 'cs_w32_en': (15, 15), 'amp_shader_en': (16, 16), 'disable_disp_prempt_en': (17, 17)}), + 'regCOMPUTE_DIM_X': (7073, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Y': (7074, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Z': (7075, 0, {'size': (0, 31)}), + 'regCOMPUTE_START_X': (7076, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Y': (7077, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Z': (7078, 0, {'start': (0, 31)}), + 'regCOMPUTE_NUM_THREAD_X': (7079, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Y': (7080, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Z': (7081, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_PIPELINESTAT_ENABLE': (7082, 0, {'pipelinestat_enable': (0, 0)}), + 'regCOMPUTE_PERFCOUNT_ENABLE': (7083, 0, {'perfcount_enable': (0, 0)}), + 'regCOMPUTE_PGM_LO': (7084, 0, {'data': (0, 31)}), + 'regCOMPUTE_PGM_HI': (7085, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_LO': (7086, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_HI': (7087, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_LO': (7088, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_HI': (7089, 0, {'data': (0, 7)}), + 'regCOMPUTE_PGM_RSRC1': (7090, 0, {'vgprs': (0, 5), 'sgprs': (6, 9), 'priority': (10, 11), 'float_mode': (12, 19), 'priv': (20, 20), 'dx10_clamp': (21, 21), 'ieee_mode': (23, 23), 'bulky': (24, 24), 'fp16_ovfl': (26, 26), 'wgp_mode': (29, 29), 'mem_ordered': (30, 30), 'fwd_progress': (31, 31)}), + 'regCOMPUTE_PGM_RSRC2': (7091, 0, {'scratch_en': (0, 0), 'user_sgpr': (1, 5), 'trap_present': (6, 6), 'tgid_x_en': (7, 7), 'tgid_y_en': (8, 8), 'tgid_z_en': (9, 9), 'tg_size_en': (10, 10), 'tidig_comp_cnt': (11, 12), 'excp_en_msb': (13, 14), 'lds_size': (15, 23), 'excp_en': (24, 30)}), + 'regCOMPUTE_VMID': (7092, 0, {'data': (0, 3)}), + 'regCOMPUTE_RESOURCE_LIMITS': (7093, 0, {'waves_per_sh': (0, 9), 'tg_per_cu': (12, 15), 'lock_threshold': (16, 21), 'simd_dest_cntl': (22, 22), 'force_simd_dist': (23, 23), 'cu_group_count': (24, 26)}), + 'regCOMPUTE_DESTINATION_EN_SE0': (7094, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE0': (7094, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DESTINATION_EN_SE1': (7095, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE1': (7095, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_TMPRING_SIZE': (7096, 0, {'waves': (0, 11), 'wavesize': (12, 26)}), + 'regCOMPUTE_DESTINATION_EN_SE2': (7097, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE2': (7097, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DESTINATION_EN_SE3': (7098, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE3': (7098, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_RESTART_X': (7099, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Y': (7100, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Z': (7101, 0, {'restart': (0, 31)}), + 'regCOMPUTE_THREAD_TRACE_ENABLE': (7102, 0, {'thread_trace_enable': (0, 0)}), + 'regCOMPUTE_MISC_RESERVED': (7103, 0, {'send_seid': (0, 2), 'reserved3': (3, 3), 'reserved4': (4, 4), 'wave_id_base': (5, 16)}), + 'regCOMPUTE_DISPATCH_ID': (7104, 0, {'dispatch_id': (0, 31)}), + 'regCOMPUTE_THREADGROUP_ID': (7105, 0, {'threadgroup_id': (0, 31)}), + 'regCOMPUTE_REQ_CTRL': (7106, 0, {'soft_grouping_en': (0, 0), 'number_of_requests_per_cu': (1, 4), 'soft_grouping_allocation_timeout': (5, 8), 'hard_lock_hysteresis': (9, 9), 'hard_lock_low_threshold': (10, 14), 'producer_request_lockout': (15, 15), 'global_scanning_en': (16, 16), 'allocation_rate_throttling_threshold': (17, 19), 'dedicated_preallocation_buffer_limit': (20, 26)}), + 'regCOMPUTE_USER_ACCUM_0': (7108, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_1': (7109, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_2': (7110, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_3': (7111, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_PGM_RSRC3': (7112, 0, {'shared_vgpr_cnt': (0, 3), 'inst_pref_size': (4, 9), 'trap_on_start': (10, 10), 'trap_on_end': (11, 11), 'image_op': (31, 31)}), + 'regCOMPUTE_DDID_INDEX': (7113, 0, {'index': (0, 10)}), + 'regCOMPUTE_SHADER_CHKSUM': (7114, 0, {'checksum': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE4': (7115, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE5': (7116, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE6': (7117, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE7': (7118, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DISPATCH_INTERLEAVE': (7119, 0, {'interleave': (0, 9)}), + 'regCOMPUTE_RELAUNCH': (7120, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_LO': (7121, 0, {'addr': (0, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_HI': (7122, 0, {'addr': (0, 15)}), + 'regCOMPUTE_RELAUNCH2': (7123, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_USER_DATA_0': (7136, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_1': (7137, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_2': (7138, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_3': (7139, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_4': (7140, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_5': (7141, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_6': (7142, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_7': (7143, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_8': (7144, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_9': (7145, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_10': (7146, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_11': (7147, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_12': (7148, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_13': (7149, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_14': (7150, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_15': (7151, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_TUNNEL': (7197, 0, {'off_delay': (0, 9), 'immediate': (10, 10)}), + 'regCOMPUTE_DISPATCH_END': (7198, 0, {'data': (0, 31)}), + 'regCOMPUTE_NOWHERE': (7199, 0, {'data': (0, 31)}), + 'regCP_INT_CNTL': (7657, 0, {'resume_int_enable': (8, 8), 'suspend_int_enable': (9, 9), 'dma_watch_int_enable': (10, 10), 'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC_DOORBELL_RANGE_LOWER': (7676, 0, {'doorbell_range_lower': (2, 11)}), + 'regCP_MEC_DOORBELL_RANGE_UPPER': (7677, 0, {'doorbell_range_upper': (2, 11)}), + 'regCP_INT_CNTL_RING0': (7690, 0, {'resume_int_enable': (8, 8), 'suspend_int_enable': (9, 9), 'dma_watch_int_enable': (10, 10), 'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_INT_CNTL_RING1': (7691, 0, {'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC1_F32_INTERRUPT': (7702, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_MEC2_F32_INTERRUPT': (7703, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_PFP_PRGRM_CNTR_START': (7748, 0, {'ip_start': (0, 31)}), + 'regCP_ME_PRGRM_CNTR_START': (7749, 0, {'ip_start': (0, 31)}), + 'regCP_MEC1_PRGRM_CNTR_START': (7750, 0, {'ip_start': (0, 19)}), + 'regCP_MEC2_PRGRM_CNTR_START': (7751, 0, {'ip_start': (0, 19)}), + 'regCP_MEC1_INTR_ROUTINE_START': (7755, 0, {'ir_start': (0, 19)}), + 'regCP_MEC2_INTR_ROUTINE_START': (7756, 0, {'ir_start': (0, 19)}), + 'regCP_PFP_PRGRM_CNTR_START_HI': (7769, 0, {'ip_start': (0, 29)}), + 'regCP_MEC1_F32_INT_DIS': (7773, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_MEC2_F32_INT_DIS': (7774, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_ME_PRGRM_CNTR_START_HI': (7801, 0, {'ip_start': (0, 29)}), + 'regCP_HQD_GFX_CONTROL': (7839, 0, {'message': (0, 3), 'misc': (4, 14), 'db_updated_msg_en': (15, 15)}), + 'regCP_HQD_GFX_STATUS': (7840, 0, {'status': (0, 15)}), + 'regCP_MEC_JT_STAT': (7893, 0, {'jt_loaded': (0, 7), 'wr_mask': (16, 23)}), + 'regSPI_COMPUTE_QUEUE_RESET': (8051, 0, {'reset': (0, 0)}), + 'regCP_MQD_BASE_ADDR': (8105, 0, {'base_addr': (2, 31)}), + 'regCP_MQD_BASE_ADDR_HI': (8106, 0, {'base_addr_hi': (0, 15)}), + 'regCP_HQD_ACTIVE': (8107, 0, {'active': (0, 0), 'busy_gate': (1, 1)}), + 'regCP_HQD_VMID': (8108, 0, {'vmid': (0, 3), 'ib_vmid': (8, 11), 'vqid': (16, 25)}), + 'regCP_HQD_PERSISTENT_STATE': (8109, 0, {'preload_req': (0, 0), 'tmz_connect_override': (1, 1), 'suspend_status': (7, 7), 'preload_size': (8, 17), 'tmz_switch_exempt': (18, 18), 'tmz_match_dis': (19, 19), 'wpp_clamp_en': (20, 20), 'wpp_switch_qos_en': (21, 21), 'iq_switch_qos_en': (22, 22), 'ib_switch_qos_en': (23, 23), 'eop_switch_qos_en': (24, 24), 'pq_switch_qos_en': (25, 25), 'tc_offload_qos_en': (26, 26), 'cache_full_packet_en': (27, 27), 'restore_active': (28, 28), 'relaunch_waves': (29, 29), 'qswitch_mode': (30, 30), 'disp_active': (31, 31)}), + 'regCP_HQD_PIPE_PRIORITY': (8110, 0, {'pipe_priority': (0, 1)}), + 'regCP_HQD_QUEUE_PRIORITY': (8111, 0, {'priority_level': (0, 3)}), + 'regCP_HQD_QUANTUM': (8112, 0, {'quantum_en': (0, 0), 'quantum_scale': (4, 4), 'quantum_duration': (8, 13), 'quantum_active': (31, 31)}), + 'regCP_HQD_PQ_BASE': (8113, 0, {'addr': (0, 31)}), + 'regCP_HQD_PQ_BASE_HI': (8114, 0, {'addr_hi': (0, 7)}), + 'regCP_HQD_PQ_RPTR': (8115, 0, {'consumed_offset': (0, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR': (8116, 0, {'rptr_report_addr': (2, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR_HI': (8117, 0, {'rptr_report_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR': (8118, 0, {'wptr_addr': (3, 31)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR_HI': (8119, 0, {'wptr_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_DOORBELL_CONTROL': (8120, 0, {'doorbell_mode': (0, 0), 'doorbell_bif_drop': (1, 1), 'doorbell_offset': (2, 27), 'doorbell_source': (28, 28), 'doorbell_schd_hit': (29, 29), 'doorbell_en': (30, 30), 'doorbell_hit': (31, 31)}), + 'regCP_HQD_PQ_CONTROL': (8122, 0, {'queue_size': (0, 5), 'wptr_carry': (6, 6), 'rptr_carry': (7, 7), 'rptr_block_size': (8, 13), 'queue_full_en': (14, 14), 'pq_empty': (15, 15), 'slot_based_wptr': (18, 19), 'min_avail_size': (20, 21), 'tmz': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'pq_volatile': (26, 26), 'no_update_rptr': (27, 27), 'unord_dispatch': (28, 28), 'tunnel_dispatch': (29, 29), 'priv_state': (30, 30), 'kmd_queue': (31, 31)}), + 'regCP_HQD_IB_BASE_ADDR': (8123, 0, {'ib_base_addr': (2, 31)}), + 'regCP_HQD_IB_BASE_ADDR_HI': (8124, 0, {'ib_base_addr_hi': (0, 15)}), + 'regCP_HQD_IB_RPTR': (8125, 0, {'consumed_offset': (0, 19)}), + 'regCP_HQD_IB_CONTROL': (8126, 0, {'ib_size': (0, 19), 'min_ib_avail_size': (20, 21), 'ib_exe_disable': (23, 23), 'ib_cache_policy': (24, 25), 'ib_volatile': (26, 26), 'processing_ib': (31, 31)}), + 'regCP_HQD_IQ_TIMER': (8127, 0, {'wait_time': (0, 7), 'retry_type': (8, 10), 'immediate_expire': (11, 11), 'interrupt_type': (12, 13), 'clock_count': (14, 15), 'interrupt_size': (16, 21), 'quantum_timer': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'iq_volatile': (26, 26), 'queue_type': (27, 27), 'rearm_timer': (28, 28), 'process_iq_en': (29, 29), 'processing_iq': (30, 30), 'active': (31, 31)}), + 'regCP_HQD_IQ_RPTR': (8128, 0, {'offset': (0, 5)}), + 'regCP_HQD_DEQUEUE_REQUEST': (8129, 0, {'dequeue_req': (0, 3), 'iq_req_pend': (4, 4), 'dequeue_int': (8, 8), 'iq_req_pend_en': (9, 9), 'dequeue_req_en': (10, 10)}), + 'regCP_HQD_DMA_OFFLOAD': (8130, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_OFFLOAD': (8130, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_SEMA_CMD': (8131, 0, {'retry': (0, 0), 'result': (1, 2), 'polling_dis': (8, 8), 'message_en': (9, 9)}), + 'regCP_HQD_MSG_TYPE': (8132, 0, {'action': (0, 2), 'save_state': (4, 6)}), + 'regCP_HQD_ATOMIC0_PREOP_LO': (8133, 0, {'atomic0_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC0_PREOP_HI': (8134, 0, {'atomic0_preop_hi': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_LO': (8135, 0, {'atomic1_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_HI': (8136, 0, {'atomic1_preop_hi': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER0': (8137, 0, {'cwsr': (0, 0), 'save_status': (1, 1), 'rsrv': (2, 2), 'static_queue': (3, 5), 'queue_run_once': (6, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'c_inherit_vmid': (9, 9), 'queue_scheduler_type': (10, 12), 'c_queue_use_gws': (13, 13), 'queue_slot_connected': (15, 15), 'mes_interrupt_enabled': (20, 20), 'mes_interrupt_pipe': (21, 22), 'concurrent_process_count': (24, 27), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_STATUS0': (8137, 0, {'cwsr': (0, 0), 'save_status': (1, 1), 'rsrv': (2, 2), 'static_queue': (3, 5), 'queue_run_once': (6, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'c_inherit_vmid': (9, 9), 'queue_scheduler_type': (10, 12), 'c_queue_use_gws': (13, 13), 'queue_slot_connected': (15, 15), 'mes_interrupt_enabled': (20, 20), 'mes_interrupt_pipe': (21, 22), 'concurrent_process_count': (24, 27), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_CONTROL0': (8138, 0, {'control': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER1': (8138, 0, {'scheduler': (0, 31)}), + 'regCP_MQD_CONTROL': (8139, 0, {'vmid': (0, 3), 'priv_state': (8, 8), 'processing_mqd': (12, 12), 'processing_mqd_en': (13, 13), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'mqd_volatile': (26, 26)}), + 'regCP_HQD_HQ_STATUS1': (8140, 0, {'status': (0, 31)}), + 'regCP_HQD_HQ_CONTROL1': (8141, 0, {'control': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR': (8142, 0, {'base_addr': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR_HI': (8143, 0, {'base_addr_hi': (0, 7)}), + 'regCP_HQD_EOP_CONTROL': (8144, 0, {'eop_size': (0, 5), 'processing_eop': (8, 8), 'process_eop_en': (12, 12), 'processing_eopib': (13, 13), 'process_eopib_en': (14, 14), 'halt_fetcher': (21, 21), 'halt_fetcher_en': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'eop_volatile': (26, 26), 'sig_sem_result': (29, 30), 'pend_sig_sem': (31, 31)}), + 'regCP_HQD_EOP_RPTR': (8145, 0, {'rptr': (0, 12), 'reset_fetcher': (28, 28), 'dequeue_pend': (29, 29), 'rptr_eq_csmd_wptr': (30, 30), 'init_fetcher': (31, 31)}), + 'regCP_HQD_EOP_WPTR': (8146, 0, {'wptr': (0, 12), 'eop_empty': (15, 15), 'eop_avail': (16, 28)}), + 'regCP_HQD_EOP_EVENTS': (8147, 0, {'event_count': (0, 11), 'cs_partial_flush_pend': (16, 16)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_LO': (8148, 0, {'addr': (12, 31)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_HI': (8149, 0, {'addr_hi': (0, 15)}), + 'regCP_HQD_CTX_SAVE_CONTROL': (8150, 0, {'policy': (3, 4), 'exe_disable': (23, 23)}), + 'regCP_HQD_CNTL_STACK_OFFSET': (8151, 0, {'offset': (2, 15)}), + 'regCP_HQD_CNTL_STACK_SIZE': (8152, 0, {'size': (12, 15)}), + 'regCP_HQD_WG_STATE_OFFSET': (8153, 0, {'offset': (2, 25)}), + 'regCP_HQD_CTX_SAVE_SIZE': (8154, 0, {'size': (12, 25)}), + 'regCP_HQD_GDS_RESOURCE_STATE': (8155, 0, {'oa_required': (0, 0), 'oa_acquired': (1, 1), 'gws_size': (4, 9), 'gws_pntr': (12, 17)}), + 'regCP_HQD_ERROR': (8156, 0, {'edc_error_id': (0, 3), 'sua_error': (4, 4), 'aql_error': (5, 5), 'pq_utcl1_error': (8, 8), 'ib_utcl1_error': (9, 9), 'eop_utcl1_error': (10, 10), 'iq_utcl1_error': (11, 11), 'rrpt_utcl1_error': (12, 12), 'wpp_utcl1_error': (13, 13), 'sem_utcl1_error': (14, 14), 'dma_src_utcl1_error': (15, 15), 'dma_dst_utcl1_error': (16, 16), 'sr_utcl1_error': (17, 17), 'qu_utcl1_error': (18, 18), 'tc_utcl1_error': (19, 19)}), + 'regCP_HQD_EOP_WPTR_MEM': (8157, 0, {'wptr': (0, 12)}), + 'regCP_HQD_AQL_CONTROL': (8158, 0, {'control0': (0, 14), 'control0_en': (15, 15), 'control1': (16, 30), 'control1_en': (31, 31)}), + 'regCP_HQD_PQ_WPTR_LO': (8159, 0, {'offset': (0, 31)}), + 'regCP_HQD_PQ_WPTR_HI': (8160, 0, {'data': (0, 31)}), + 'regCP_HQD_SUSPEND_CNTL_STACK_OFFSET': (8161, 0, {'offset': (2, 15)}), + 'regCP_HQD_SUSPEND_CNTL_STACK_DW_CNT': (8162, 0, {'cnt': (0, 13)}), + 'regCP_HQD_SUSPEND_WG_STATE_OFFSET': (8163, 0, {'offset': (2, 25)}), + 'regCP_HQD_DDID_RPTR': (8164, 0, {'rptr': (0, 10)}), + 'regCP_HQD_DDID_WPTR': (8165, 0, {'wptr': (0, 10)}), + 'regCP_HQD_DDID_INFLIGHT_COUNT': (8166, 0, {'count': (0, 15)}), + 'regCP_HQD_DDID_DELTA_RPT_COUNT': (8167, 0, {'count': (0, 7)}), + 'regCP_HQD_DEQUEUE_STATUS': (8168, 0, {'dequeue_stat': (0, 3), 'suspend_req_pend': (4, 4), 'suspend_req_pend_en': (9, 9), 'dequeue_stat_en': (10, 10)}), + 'regTCP_WATCH0_ADDR_H': (8264, 0, {'addr': (0, 15)}), + 'regTCP_WATCH0_ADDR_L': (8265, 0, {'addr': (7, 31)}), + 'regTCP_WATCH0_CNTL': (8266, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH1_ADDR_H': (8267, 0, {'addr': (0, 15)}), + 'regTCP_WATCH1_ADDR_L': (8268, 0, {'addr': (7, 31)}), + 'regTCP_WATCH1_CNTL': (8269, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH2_ADDR_H': (8270, 0, {'addr': (0, 15)}), + 'regTCP_WATCH2_ADDR_L': (8271, 0, {'addr': (7, 31)}), + 'regTCP_WATCH2_CNTL': (8272, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH3_ADDR_H': (8273, 0, {'addr': (0, 15)}), + 'regTCP_WATCH3_ADDR_L': (8274, 0, {'addr': (7, 31)}), + 'regTCP_WATCH3_CNTL': (8275, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regCP_PERFMON_CNTX_CNTL': (216, 1, {'perfmon_enable': (31, 31)}), + 'regCP_MEC_CNTL': (2050, 1, {'mec_me1_pipe0_reset': (16, 16), 'mec_me1_pipe1_reset': (17, 17), 'mec_me1_pipe2_reset': (18, 18), 'mec_me1_pipe3_reset': (19, 19), 'mec_me2_pipe0_reset': (20, 20), 'mec_me2_pipe1_reset': (21, 21), 'mec_me2_pipe2_reset': (22, 22), 'mec_me2_pipe3_reset': (23, 23), 'mec_invalidate_icache': (27, 27), 'mec_me2_halt': (28, 28), 'mec_me2_step': (29, 29), 'mec_me1_halt': (30, 30), 'mec_me1_step': (31, 31)}), + 'regCP_ME_CNTL': (2051, 1, {'ce_invalidate_icache': (4, 4), 'pfp_invalidate_icache': (6, 6), 'me_invalidate_icache': (8, 8), 'pfp_pipe0_disable': (12, 12), 'pfp_pipe1_disable': (13, 13), 'me_pipe0_disable': (14, 14), 'me_pipe1_disable': (15, 15), 'ce_pipe0_reset': (16, 16), 'ce_pipe1_reset': (17, 17), 'pfp_pipe0_reset': (18, 18), 'pfp_pipe1_reset': (19, 19), 'me_pipe0_reset': (20, 20), 'me_pipe1_reset': (21, 21), 'ce_halt': (24, 24), 'ce_step': (25, 25), 'pfp_halt': (26, 26), 'pfp_step': (27, 27), 'me_halt': (28, 28), 'me_step': (29, 29)}), + 'regGRBM_GFX_CNTL': (2304, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10), 'ctxid': (11, 13)}), + 'regGRBM_NOWHERE': (2305, 1, {'data': (0, 31)}), + 'regSH_MEM_BASES': (2531, 1, {'private_base': (0, 15), 'shared_base': (16, 31)}), + 'regSH_MEM_CONFIG': (2532, 1, {'address_mode': (0, 0), 'alignment_mode': (2, 3), 'initial_inst_prefetch': (14, 15), 'icache_use_gl1': (18, 18)}), + 'regTCP_INVALIDATE': (6560, 1, {'start': (0, 0)}), + 'regTCP_STATUS': (6561, 1, {'tcp_busy': (0, 0), 'input_busy': (1, 1), 'adrs_busy': (2, 2), 'tagrams_busy': (3, 3), 'cntrl_busy': (4, 4), 'lfifo_busy': (5, 5), 'read_busy': (6, 6), 'format_busy': (7, 7), 'vm_busy': (8, 8), 'memif_busy': (9, 9), 'gcr_busy': (10, 10), 'ofifo_busy': (11, 11), 'ofifo_queue_busy': (12, 13), 'xnack_prt': (15, 15)}), + 'regTCP_CNTL': (6562, 1, {}), + 'regTCP_CNTL2': (6563, 1, {'ls_disable_clocks': (0, 7), 'tcp_fmt_mgcg_disable': (8, 8), 'tcpf_latency_bypass_disable': (9, 9), 'tcp_write_data_mgcg_disable': (10, 10), 'tcp_inner_block_mgcg_disable': (11, 11), 'tcp_adrs_img_calc_mgcg_disable': (12, 12), 'v64_combine_enable': (13, 13), 'tagram_addr_swizzle_disable': (14, 14), 'return_order_override': (15, 15), 'power_opt_disable': (16, 16), 'gcr_rsp_fgcg_disable': (17, 17), 'perf_en_override': (18, 19), 'tc_td_ram_clken_disable': (20, 20), 'tc_td_data_clken_disable': (21, 21), 'tcp_gl1_req_clken_disable': (22, 22), 'tcp_gl1r_src_clken_disable': (23, 23), 'spare_bit': (26, 26), 'tagram_xy_bias_override': (27, 28), 'tcp_req_mgcg_disable': (29, 29), 'tcp_miss_mgcg_disable': (30, 30), 'disable_mipmap_param_calc_self_gating': (31, 31)}), + 'regTCP_DEBUG_INDEX': (6565, 1, {'index': (0, 4)}), + 'regTCP_DEBUG_DATA': (6566, 1, {'data': (0, 17)}), + 'regSCRATCH_REG6': (8262, 1, {'scratch_reg6': (0, 31)}), + 'regSCRATCH_REG7': (8263, 1, {'scratch_reg7': (0, 31)}), + 'regRLC_GPM_PERF_COUNT_0': (8512, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sa_index': (8, 11), 'wgp_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_PERF_COUNT_1': (8513, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sa_index': (8, 11), 'wgp_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regGRBM_GFX_INDEX': (8704, 1, {'instance_index': (0, 7), 'sa_index': (8, 15), 'se_index': (16, 23), 'sa_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_0': (9024, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_1': (9025, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_2': (9026, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_3': (9027, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_4': (9028, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_5': (9029, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_6': (9030, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_7': (9031, 1, {'data': (0, 31)}), + 'regSPI_CONFIG_CNTL': (9280, 1, {'gpr_write_priority': (0, 20), 'exp_priority_order': (21, 23), 'enable_sqg_top_events': (24, 24), 'enable_sqg_bop_events': (25, 25), 'alloc_arb_lru_ena': (28, 28), 'exp_arb_lru_ena': (29, 29), 'ps_pkr_priority_cntl': (30, 31)}), + 'regSPI_CONFIG_CNTL_1': (9281, 1, {'vtx_done_delay': (0, 3), 'interp_one_prim_per_row': (4, 4), 'pc_limit_enable': (5, 6), 'pc_limit_strict': (7, 7), 'ps_group_timeout_mode': (8, 8), 'oreo_expalloc_stall': (9, 9), 'lbpw_cu_chk_cnt': (10, 13), 'csc_pwr_save_disable': (14, 14), 'csg_pwr_save_disable': (15, 15), 'max_vtx_sync_cnt': (16, 20), 'en_user_accum': (21, 21), 'sa_screen_map': (22, 22), 'ps_group_timeout': (23, 31)}), + 'regSPI_CONFIG_CNTL_2': (9282, 1, {'context_save_wait_gds_request_cycle_ovhd': (0, 3), 'context_save_wait_gds_grant_cycle_ovhd': (4, 7), 'pws_csg_wait_disable': (8, 8), 'pws_hs_wait_disable': (9, 9), 'pws_gs_wait_disable': (10, 10), 'pws_ps_wait_disable': (11, 11), 'csc_halt_ack_delay': (12, 16)}), + 'regCP_MEC_RS64_PRGRM_CNTR_START': (10496, 1, {'ip_start': (0, 31)}), + 'regCP_MEC_MTVEC_LO': (10497, 1, {'addr_lo': (0, 31)}), + 'regCP_MEC_MTVEC_HI': (10498, 1, {'addr_lo': (0, 31)}), + 'regCP_MEC_ISA_CNTL': (10499, 1, {'isa_mode': (0, 0)}), + 'regCP_MEC_RS64_CNTL': (10500, 1, {'mec_invalidate_icache': (4, 4), 'mec_pipe0_reset': (16, 16), 'mec_pipe1_reset': (17, 17), 'mec_pipe2_reset': (18, 18), 'mec_pipe3_reset': (19, 19), 'mec_pipe0_active': (26, 26), 'mec_pipe1_active': (27, 27), 'mec_pipe2_active': (28, 28), 'mec_pipe3_active': (29, 29), 'mec_halt': (30, 30), 'mec_step': (31, 31)}), + 'regCP_MEC_MIE_LO': (10501, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_MIE_HI': (10502, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT': (10503, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_RS64_INSTR_PNTR': (10504, 1, {'instr_pntr': (0, 19)}), + 'regCP_MEC_MIP_LO': (10505, 1, {'mip_lo': (0, 31)}), + 'regCP_MEC_MIP_HI': (10506, 1, {'mip_hi': (0, 31)}), + 'regCP_MEC_DC_BASE_CNTL': (10507, 1, {'vmid': (0, 3), 'cache_policy': (24, 25)}), + 'regCP_MEC_DC_OP_CNTL': (10508, 1, {'invalidate_dcache': (0, 0), 'invalidate_dcache_complete': (1, 1), 'bypass_all': (2, 2)}), + 'regCP_MEC_MTIMECMP_LO': (10509, 1, {'time_lo': (0, 31)}), + 'regCP_MEC_MTIMECMP_HI': (10510, 1, {'time_hi': (0, 31)}), + 'regCP_MEC_GP0_LO': (10512, 1, {'pg_virt_halted': (0, 0), 'data': (1, 31)}), + 'regCP_MEC_GP0_HI': (10513, 1, {'m_ret_addr': (0, 31)}), + 'regCP_MEC_GP1_LO': (10514, 1, {'rd_wr_select_lo': (0, 31)}), + 'regCP_MEC_GP1_HI': (10515, 1, {'rd_wr_select_hi': (0, 31)}), + 'regCP_MEC_GP2_LO': (10516, 1, {'stack_pntr_lo': (0, 31)}), + 'regCP_MEC_GP2_HI': (10517, 1, {'stack_pntr_hi': (0, 31)}), + 'regCP_MEC_GP3_LO': (10518, 1, {'data': (0, 31)}), + 'regCP_MEC_GP3_HI': (10519, 1, {'data': (0, 31)}), + 'regCP_MEC_GP4_LO': (10520, 1, {'data': (0, 31)}), + 'regCP_MEC_GP4_HI': (10521, 1, {'data': (0, 31)}), + 'regCP_MEC_GP5_LO': (10522, 1, {'pg_virt_halted': (0, 0), 'data': (1, 31)}), + 'regCP_MEC_GP5_HI': (10523, 1, {'m_ret_addr': (0, 31)}), + 'regCP_MEC_GP6_LO': (10524, 1, {'rd_wr_select_lo': (0, 31)}), + 'regCP_MEC_GP6_HI': (10525, 1, {'rd_wr_select_hi': (0, 31)}), + 'regCP_MEC_GP7_LO': (10526, 1, {'stack_pntr_lo': (0, 31)}), + 'regCP_MEC_GP7_HI': (10527, 1, {'stack_pntr_hi': (0, 31)}), + 'regCP_MEC_GP8_LO': (10528, 1, {'data': (0, 31)}), + 'regCP_MEC_GP8_HI': (10529, 1, {'data': (0, 31)}), + 'regCP_MEC_GP9_LO': (10530, 1, {'data': (0, 31)}), + 'regCP_MEC_GP9_HI': (10531, 1, {'data': (0, 31)}), + 'regCP_MEC_LOCAL_BASE0_LO': (10535, 1, {'base0_lo': (16, 31)}), + 'regCP_MEC_LOCAL_BASE0_HI': (10536, 1, {'base0_hi': (0, 15)}), + 'regCP_MEC_LOCAL_MASK0_LO': (10537, 1, {'mask0_lo': (16, 31)}), + 'regCP_MEC_LOCAL_MASK0_HI': (10538, 1, {'mask0_hi': (0, 15)}), + 'regCP_MEC_LOCAL_APERTURE': (10539, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_INSTR_BASE_LO': (10540, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_LOCAL_INSTR_BASE_HI': (10541, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_LOCAL_INSTR_MASK_LO': (10542, 1, {'mask_lo': (16, 31)}), + 'regCP_MEC_LOCAL_INSTR_MASK_HI': (10543, 1, {'mask_hi': (0, 15)}), + 'regCP_MEC_LOCAL_INSTR_APERTURE': (10544, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_SCRATCH_APERTURE': (10545, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_SCRATCH_BASE_LO': (10546, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_LOCAL_SCRATCH_BASE_HI': (10547, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_RS64_PERFCOUNT_CNTL': (10548, 1, {'event_sel': (0, 4)}), + 'regCP_MEC_RS64_PENDING_INTERRUPT': (10549, 1, {'pending_interrupt': (0, 31)}), + 'regCP_MEC_RS64_PRGRM_CNTR_START_HI': (10552, 1, {'ip_start': (0, 29)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_16': (10554, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_17': (10555, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_18': (10556, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_19': (10557, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_20': (10558, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_21': (10559, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_22': (10560, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_23': (10561, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_24': (10562, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_25': (10563, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_26': (10564, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_27': (10565, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_28': (10566, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_29': (10567, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_30': (10568, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_31': (10569, 1, {'data': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_BASE': (10570, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_MASK': (10571, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_CNTL': (10572, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE1_BASE': (10573, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE1_MASK': (10574, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE1_CNTL': (10575, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE2_BASE': (10576, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE2_MASK': (10577, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE2_CNTL': (10578, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE3_BASE': (10579, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE3_MASK': (10580, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE3_CNTL': (10581, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE4_BASE': (10582, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE4_MASK': (10583, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE4_CNTL': (10584, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE5_BASE': (10585, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE5_MASK': (10586, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE5_CNTL': (10587, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE6_BASE': (10588, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE6_MASK': (10589, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE6_CNTL': (10590, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE7_BASE': (10591, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE7_MASK': (10592, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE7_CNTL': (10593, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE8_BASE': (10594, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE8_MASK': (10595, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE8_CNTL': (10596, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE9_BASE': (10597, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE9_MASK': (10598, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE9_CNTL': (10599, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE10_BASE': (10600, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE10_MASK': (10601, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE10_CNTL': (10602, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE11_BASE': (10603, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE11_MASK': (10604, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE11_CNTL': (10605, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE12_BASE': (10606, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE12_MASK': (10607, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE12_CNTL': (10608, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE13_BASE': (10609, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE13_MASK': (10610, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE13_CNTL': (10611, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE14_BASE': (10612, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE14_MASK': (10613, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE14_CNTL': (10614, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE15_BASE': (10615, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE15_MASK': (10616, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE15_CNTL': (10617, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regGRBM_PERFCOUNTER0_LO': (12352, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER0_HI': (12353, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_PERFCOUNTER1_LO': (12355, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER1_HI': (12356, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE0_PERFCOUNTER_LO': (12357, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE0_PERFCOUNTER_HI': (12358, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE1_PERFCOUNTER_LO': (12359, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE1_PERFCOUNTER_HI': (12360, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE2_PERFCOUNTER_LO': (12361, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE2_PERFCOUNTER_HI': (12362, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE3_PERFCOUNTER_LO': (12363, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE3_PERFCOUNTER_HI': (12364, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE4_PERFCOUNTER_LO': (12365, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE4_PERFCOUNTER_HI': (12366, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE5_PERFCOUNTER_LO': (12367, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE5_PERFCOUNTER_HI': (12368, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE6_PERFCOUNTER_LO': (12369, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE6_PERFCOUNTER_HI': (12370, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER0_LO': (12736, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER1_LO': (12738, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER2_LO': (12740, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER3_LO': (12742, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER4_LO': (12744, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER5_LO': (12746, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER6_LO': (12748, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER7_LO': (12750, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_LO': (13120, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_HI': (13121, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER1_LO': (13122, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER1_HI': (13123, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER2_LO': (13124, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER2_HI': (13125, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER3_LO': (13126, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER3_HI': (13127, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER_FILTER': (13128, 1, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 4), 'data_format': (5, 11), 'num_format': (13, 16), 'sw_mode': (17, 21), 'num_samples': (22, 23), 'opcode_type': (24, 26), 'slc': (27, 27), 'dlc': (28, 28), 'glc': (29, 29), 'compression_enable': (30, 30)}), + 'regTCP_PERFCOUNTER_FILTER2': (13129, 1, {'req_mode': (0, 2)}), + 'regTCP_PERFCOUNTER_FILTER_EN': (13130, 1, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 2), 'data_format': (3, 3), 'num_format': (4, 4), 'sw_mode': (5, 5), 'num_samples': (6, 6), 'opcode_type': (7, 7), 'slc': (8, 8), 'dlc': (9, 9), 'glc': (10, 10), 'compression_enable': (11, 11), 'req_mode': (12, 12)}), + 'regGL2C_PERFCOUNTER0_LO': (13184, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER0_HI': (13185, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER1_LO': (13186, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER1_HI': (13187, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER2_LO': (13188, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER2_HI': (13189, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER3_LO': (13190, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER3_HI': (13191, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER0_LO': (13440, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER0_HI': (13441, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER1_LO': (13442, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER1_HI': (13443, 1, {'perfcounter_hi': (0, 31)}), + 'regCP_PERFMON_CNTL': (14344, 1, {'perfmon_state': (0, 3), 'spm_perfmon_state': (4, 7), 'perfmon_enable_mode': (8, 9), 'perfmon_sample_enable': (10, 10)}), + 'regGRBM_PERFCOUNTER0_SELECT': (14400, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'gds_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30), 'rmi_busy_user_defined_mask': (31, 31)}), + 'regGRBM_PERFCOUNTER1_SELECT': (14401, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'gds_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30), 'rmi_busy_user_defined_mask': (31, 31)}), + 'regGRBM_SE0_PERFCOUNTER_SELECT': (14402, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE1_PERFCOUNTER_SELECT': (14403, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE2_PERFCOUNTER_SELECT': (14404, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE3_PERFCOUNTER_SELECT': (14405, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE4_PERFCOUNTER_SELECT': (14406, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE5_PERFCOUNTER_SELECT': (14407, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE6_PERFCOUNTER_SELECT': (14408, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_PERFCOUNTER0_SELECT_HI': (14413, 1, {'utcl1_busy_user_defined_mask': (1, 1), 'gl2cc_busy_user_defined_mask': (2, 2), 'sdma_busy_user_defined_mask': (3, 3), 'ch_busy_user_defined_mask': (4, 4), 'ph_busy_user_defined_mask': (5, 5), 'pmm_busy_user_defined_mask': (6, 6), 'gus_busy_user_defined_mask': (7, 7), 'gl1cc_busy_user_defined_mask': (8, 8), 'gl1h_busy_user_defined_mask': (9, 9)}), + 'regGRBM_PERFCOUNTER1_SELECT_HI': (14414, 1, {'utcl1_busy_user_defined_mask': (1, 1), 'gl2cc_busy_user_defined_mask': (2, 2), 'sdma_busy_user_defined_mask': (3, 3), 'ch_busy_user_defined_mask': (4, 4), 'ph_busy_user_defined_mask': (5, 5), 'pmm_busy_user_defined_mask': (6, 6), 'gus_busy_user_defined_mask': (7, 7), 'gl1cc_busy_user_defined_mask': (8, 8), 'gl1h_busy_user_defined_mask': (9, 9)}), + 'regSQ_PERFCOUNTER0_SELECT': (14784, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER1_SELECT': (14785, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER2_SELECT': (14786, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER3_SELECT': (14787, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER4_SELECT': (14788, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER5_SELECT': (14789, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER6_SELECT': (14790, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER7_SELECT': (14791, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER8_SELECT': (14792, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER9_SELECT': (14793, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER10_SELECT': (14794, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER11_SELECT': (14795, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER12_SELECT': (14796, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER13_SELECT': (14797, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER14_SELECT': (14798, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER15_SELECT': (14799, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER_CTRL': (14816, 1, {'ps_en': (0, 0), 'gs_en': (2, 2), 'hs_en': (4, 4), 'cs_en': (6, 6), 'disable_me0pipe0_perf': (14, 14), 'disable_me0pipe1_perf': (15, 15), 'disable_me1pipe0_perf': (16, 16), 'disable_me1pipe1_perf': (17, 17), 'disable_me1pipe2_perf': (18, 18), 'disable_me1pipe3_perf': (19, 19)}), + 'regSQ_PERFCOUNTER_CTRL2': (14818, 1, {'force_en': (0, 0), 'vmid_en': (1, 16)}), + 'regSQ_THREAD_TRACE_BUF0_BASE': (14824, 1, {'base_lo': (0, 31)}), + 'regSQ_THREAD_TRACE_BUF0_SIZE': (14825, 1, {'base_hi': (0, 3), 'size': (8, 29)}), + 'regSQ_THREAD_TRACE_BUF1_BASE': (14826, 1, {'base_lo': (0, 31)}), + 'regSQ_THREAD_TRACE_BUF1_SIZE': (14827, 1, {'base_hi': (0, 3), 'size': (8, 29)}), + 'regSQ_THREAD_TRACE_CTRL': (14828, 1, {'mode': (0, 1), 'all_vmid': (2, 2), 'gl1_perf_en': (3, 3), 'interrupt_en': (4, 4), 'double_buffer': (5, 5), 'hiwater': (6, 8), 'reg_at_hwm': (9, 10), 'spi_stall_en': (11, 11), 'sq_stall_en': (12, 12), 'util_timer': (13, 13), 'wavestart_mode': (14, 15), 'rt_freq': (16, 17), 'sync_count_markers': (18, 18), 'sync_count_draws': (19, 19), 'lowater_offset': (20, 22), 'auto_flush_padding_dis': (28, 28), 'auto_flush_mode': (29, 29), 'draw_event_en': (31, 31)}), + 'regSQ_THREAD_TRACE_MASK': (14829, 1, {'simd_sel': (0, 1), 'wgp_sel': (4, 7), 'sa_sel': (9, 9), 'wtype_include': (10, 16), 'exclude_nondetail_shaderdata': (17, 17)}), + 'regSQ_THREAD_TRACE_TOKEN_MASK': (14830, 1, {'token_exclude': (0, 10), 'ttrace_exec': (11, 11), 'bop_events_token_include': (12, 12), 'reg_include': (16, 23), 'inst_exclude': (24, 25), 'reg_exclude': (26, 28), 'reg_detail_all': (31, 31)}), + 'regSQ_THREAD_TRACE_WPTR': (14831, 1, {'offset': (0, 28), 'buffer_id': (31, 31)}), + 'regSQ_THREAD_TRACE_STATUS': (14836, 1, {'finish_pending': (0, 11), 'finish_done': (12, 23), 'write_error': (24, 24), 'busy': (25, 25), 'owner_vmid': (28, 31)}), + 'regSQ_THREAD_TRACE_STATUS2': (14837, 1, {'buf0_full': (0, 0), 'buf1_full': (1, 1), 'packet_lost_buf_no_lockdown': (4, 4), 'buf_issue_status': (8, 12), 'buf_issue': (13, 13), 'write_buf_full': (14, 14)}), + 'regSQ_THREAD_TRACE_GFX_DRAW_CNTR': (14838, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_GFX_MARKER_CNTR': (14839, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_HP3D_DRAW_CNTR': (14840, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_HP3D_MARKER_CNTR': (14841, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_DROPPED_CNTR': (14842, 1, {'cntr': (0, 31)}), + 'regTCP_PERFCOUNTER0_SELECT': (15168, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER0_SELECT1': (15169, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT': (15170, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT1': (15171, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER2_SELECT': (15172, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER3_SELECT': (15173, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER0_SELECT': (15232, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER0_SELECT1': (15233, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER1_SELECT': (15234, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER1_SELECT1': (15235, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER2_SELECT': (15236, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER3_SELECT': (15237, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regRLC_SPM_PERFMON_CNTL': (15488, 1, {'reserved1': (0, 11), 'perfmon_ring_mode': (12, 13), 'disable_gfxclock_count': (14, 14), 'reserved': (15, 15), 'perfmon_sample_interval': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_LO': (15489, 1, {'ring_base_lo': (0, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_HI': (15490, 1, {'ring_base_hi': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_SIZE': (15491, 1, {'ring_base_size': (0, 31)}), + 'regRLC_SPM_RING_WRPTR': (15492, 1, {'reserved': (0, 4), 'perfmon_ring_wrptr': (5, 31)}), + 'regRLC_SPM_RING_RDPTR': (15493, 1, {'perfmon_ring_rdptr': (0, 31)}), + 'regRLC_SPM_SEGMENT_THRESHOLD': (15494, 1, {'num_segment_threshold': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_PERFMON_SEGMENT_SIZE': (15495, 1, {'total_num_segment': (0, 15), 'global_num_segment': (16, 23), 'se_num_segment': (24, 31)}), + 'regRLC_SPM_GLOBAL_MUXSEL_ADDR': (15496, 1, {'addr': (0, 11)}), + 'regRLC_SPM_GLOBAL_MUXSEL_DATA': (15497, 1, {'sel0': (0, 15), 'sel1': (16, 31)}), + 'regRLC_SPM_SE_MUXSEL_ADDR': (15498, 1, {'addr': (0, 11)}), + 'regRLC_SPM_SE_MUXSEL_DATA': (15499, 1, {'sel0': (0, 15), 'sel1': (16, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_ADDR': (15506, 1, {'addr': (0, 6), 'reserved': (7, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_DATA': (15507, 1, {'data': (0, 31)}), + 'regRLC_SPM_ACCUM_SWA_DATARAM_ADDR': (15508, 1, {'addr': (0, 6), 'reserved': (7, 31)}), + 'regRLC_SPM_ACCUM_SWA_DATARAM_DATA': (15509, 1, {'data': (0, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_ADDR': (15510, 1, {'addr': (0, 10), 'reserved': (11, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_DATA': (15511, 1, {'data': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_ADDR_OFFSET': (15512, 1, {'global_offset': (0, 7), 'spmwithaccum_se_offset': (8, 15), 'spmwithaccum_global_offset': (16, 23), 'reserved': (24, 31)}), + 'regRLC_SPM_ACCUM_STATUS': (15513, 1, {'numbsamplescompleted': (0, 7), 'accumdone': (8, 8), 'spmdone': (9, 9), 'accumoverflow': (10, 10), 'accumarmed': (11, 11), 'sequenceinprogress': (12, 12), 'finalsequenceinprogress': (13, 13), 'allfifosempty': (14, 14), 'fsmisidle': (15, 15), 'swaaccumdone': (16, 16), 'swaspmdone': (17, 17), 'swaaccumoverflow': (18, 18), 'swaaccumarmed': (19, 19), 'allsegsdone': (20, 20), 'rearmswapending': (21, 21), 'rearmspppending': (22, 22), 'multisampleaborted': (23, 23), 'reserved': (24, 31)}), + 'regRLC_SPM_ACCUM_CTRL': (15514, 1, {'stroberesetperfmonitors': (0, 0), 'strobestartaccumulation': (1, 1), 'stroberearmaccum': (2, 2), 'stroberesetspmblock': (3, 3), 'strobestartspm': (4, 7), 'stroberearmswaaccum': (8, 8), 'strobestartswa': (9, 9), 'strobeperfmonsamplewires': (10, 10), 'reserved': (11, 31)}), + 'regRLC_SPM_ACCUM_MODE': (15515, 1, {'enableaccum': (0, 0), 'enablespmwithaccummode': (1, 1), 'enablesppmode': (2, 2), 'autoresetperfmondisable': (3, 3), 'autoaccumen': (5, 5), 'swaautoaccumen': (6, 6), 'autospmen': (7, 7), 'swaautospmen': (8, 8), 'globals_loadoverride': (9, 9), 'globals_swaloadoverride': (10, 10), 'se0_loadoverride': (11, 11), 'se0_swaloadoverride': (12, 12), 'se1_loadoverride': (13, 13), 'se1_swaloadoverride': (14, 14), 'se2_loadoverride': (15, 15), 'se2_swaloadoverride': (16, 16), 'se3_loadoverride': (17, 17), 'se3_swaloadoverride': (18, 18), 'se4_loadoverride': (19, 19), 'se4_swaloadoverride': (20, 20), 'se5_loadoverride': (21, 21), 'se5_swaloadoverride': (22, 22)}), + 'regRLC_SPM_ACCUM_THRESHOLD': (15516, 1, {'threshold': (0, 15)}), + 'regRLC_SPM_ACCUM_SAMPLES_REQUESTED': (15517, 1, {'samplesrequested': (0, 7)}), + 'regRLC_SPM_ACCUM_DATARAM_WRCOUNT': (15518, 1, {'dataramwrcount': (0, 18), 'reserved': (19, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_32BITCNTRS_REGIONS': (15519, 1, {'spp_addr_region': (0, 7), 'swa_addr_region': (8, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_PAUSE': (15522, 1, {'pause': (0, 0), 'paused': (1, 1)}), + 'regRLC_SPM_STATUS': (15523, 1, {'ctl_busy': (0, 0), 'rspm_reg_busy': (1, 1), 'spm_rspm_busy': (2, 2), 'spm_rspm_io_busy': (3, 3), 'se_rspm_io_busy': (4, 11), 'accum_busy': (15, 15), 'fsm_master_state': (16, 19), 'fsm_memory_state': (20, 23), 'ctl_req_state': (24, 25), 'ctl_ret_state': (26, 26)}), + 'regRLC_SPM_GFXCLOCK_LOWCOUNT': (15524, 1, {'gfxclock_lowcount': (0, 31)}), + 'regRLC_SPM_GFXCLOCK_HIGHCOUNT': (15525, 1, {'gfxclock_highcount': (0, 31)}), + 'regRLC_SPM_MODE': (15533, 1, {'mode': (0, 0)}), + 'regRLC_SPM_RSPM_REQ_DATA_LO': (15534, 1, {'data': (0, 31)}), + 'regRLC_SPM_RSPM_REQ_DATA_HI': (15535, 1, {'data': (0, 11)}), + 'regRLC_SPM_RSPM_REQ_OP': (15536, 1, {'op': (0, 3)}), + 'regRLC_SPM_RSPM_RET_DATA': (15537, 1, {'data': (0, 31)}), + 'regRLC_SPM_RSPM_RET_OP': (15538, 1, {'op': (0, 3), 'valid': (8, 8)}), + 'regRLC_SPM_SE_RSPM_REQ_DATA_LO': (15539, 1, {'data': (0, 31)}), + 'regRLC_SPM_SE_RSPM_REQ_DATA_HI': (15540, 1, {'data': (0, 11)}), + 'regRLC_SPM_SE_RSPM_REQ_OP': (15541, 1, {'op': (0, 3)}), + 'regRLC_SPM_SE_RSPM_RET_DATA': (15542, 1, {'data': (0, 31)}), + 'regRLC_SPM_SE_RSPM_RET_OP': (15543, 1, {'op': (0, 3), 'valid': (8, 8)}), + 'regRLC_SPM_RSPM_CMD': (15544, 1, {'cmd': (0, 3)}), + 'regRLC_SPM_RSPM_CMD_ACK': (15545, 1, {'se0_ack': (0, 0), 'se1_ack': (1, 1), 'se2_ack': (2, 2), 'se3_ack': (3, 3), 'se4_ack': (4, 4), 'se5_ack': (5, 5), 'se6_ack': (6, 6), 'se7_ack': (7, 7), 'spm_ack': (8, 8)}), + 'regRLC_SPM_SPARE': (15551, 1, {'spare': (0, 31)}), + 'regRLC_PERFMON_CNTL': (15552, 1, {'perfmon_state': (0, 2), 'perfmon_sample_enable': (10, 10)}), + 'regRLC_PERFCOUNTER0_SELECT': (15553, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_PERFCOUNTER1_SELECT': (15554, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_GPU_IOV_PERF_CNT_CNTL': (15555, 1, {'enable': (0, 0), 'mode_select': (1, 1), 'reset': (2, 2), 'reserved': (3, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_WR_ADDR': (15556, 1, {'vfid': (0, 3), 'cnt_id': (4, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_WR_DATA': (15557, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_RD_ADDR': (15558, 1, {'vfid': (0, 3), 'cnt_id': (4, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_RD_DATA': (15559, 1, {'data': (0, 31)}), + 'regCP_MEC_ME1_UCODE_ADDR': (22554, 1, {'ucode_addr': (0, 19)}), + 'regCP_MEC_ME1_UCODE_DATA': (22555, 1, {'ucode_data': (0, 31)}), + 'regCP_MEC_ME2_UCODE_ADDR': (22556, 1, {'ucode_addr': (0, 19)}), + 'regCP_MEC_ME2_UCODE_DATA': (22557, 1, {'ucode_data': (0, 31)}), + 'regCP_MEC_DC_BASE_LO': (22640, 1, {'dc_base_lo': (16, 31)}), + 'regCP_MEC_MDBASE_LO': (22640, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_DC_BASE_HI': (22641, 1, {'dc_base_hi': (0, 15)}), + 'regCP_MEC_MDBASE_HI': (22641, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_MIBOUND_LO': (22642, 1, {'bound_lo': (0, 31)}), + 'regCP_MEC_MIBOUND_HI': (22643, 1, {'bound_hi': (0, 31)}), + 'regCP_MEC_MDBOUND_LO': (22644, 1, {'bound_lo': (0, 31)}), + 'regCP_MEC_MDBOUND_HI': (22645, 1, {'bound_hi': (0, 31)}), + 'regRLC_CNTL': (19456, 1, {'rlc_enable_f32': (0, 0), 'force_retry': (1, 1), 'read_cache_disable': (2, 2), 'rlc_step_f32': (3, 3), 'reserved': (4, 31)}), + 'regRLC_F32_UCODE_VERSION': (19459, 1, {'thread0_version': (0, 9), 'thread1_version': (10, 19), 'thread2_version': (20, 29)}), + 'regRLC_STAT': (19460, 1, {'rlc_busy': (0, 0), 'rlc_srm_busy': (1, 1), 'rlc_gpm_busy': (2, 2), 'rlc_spm_busy': (3, 3), 'mc_busy': (4, 4), 'rlc_thread_0_busy': (5, 5), 'rlc_thread_1_busy': (6, 6), 'rlc_thread_2_busy': (7, 7), 'reserved': (8, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_LSB': (19468, 1, {'timestamp_lsb': (0, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_MSB': (19469, 1, {'timestamp_msb': (0, 31)}), + 'regRLC_GPM_TIMER_INT_0': (19470, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_1': (19471, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_2': (19472, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_3': (19473, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_4': (19474, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_CTRL': (19475, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_2_en': (2, 2), 'timer_3_en': (3, 3), 'timer_4_en': (4, 4), 'reserved_1': (5, 7), 'timer_0_auto_rearm': (8, 8), 'timer_1_auto_rearm': (9, 9), 'timer_2_auto_rearm': (10, 10), 'timer_3_auto_rearm': (11, 11), 'timer_4_auto_rearm': (12, 12), 'reserved_2': (13, 15), 'timer_0_int_clear': (16, 16), 'timer_1_int_clear': (17, 17), 'timer_2_int_clear': (18, 18), 'timer_3_int_clear': (19, 19), 'timer_4_int_clear': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_TIMER_STAT': (19476, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'timer_2_stat': (2, 2), 'timer_3_stat': (3, 3), 'timer_4_stat': (4, 4), 'reserved_1': (5, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_2_enable_sync': (10, 10), 'timer_3_enable_sync': (11, 11), 'timer_4_enable_sync': (12, 12), 'reserved_2': (13, 15), 'timer_0_auto_rearm_sync': (16, 16), 'timer_1_auto_rearm_sync': (17, 17), 'timer_2_auto_rearm_sync': (18, 18), 'timer_3_auto_rearm_sync': (19, 19), 'timer_4_auto_rearm_sync': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_LEGACY_INT_STAT': (19478, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3)}), + 'regRLC_GPM_LEGACY_INT_CLEAR': (19479, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3)}), + 'regRLC_INT_STAT': (19480, 1, {'last_cp_rlc_int_id': (0, 7), 'cp_rlc_int_pending': (8, 8), 'reserved': (9, 31)}), + 'regRLC_MGCG_CTRL': (19482, 1, {'mgcg_en': (0, 0), 'silicon_en': (1, 1), 'simulation_en': (2, 2), 'on_delay': (3, 6), 'off_hysteresis': (7, 14), 'spare': (15, 31)}), + 'regRLC_JUMP_TABLE_RESTORE': (19486, 1, {'addr': (0, 31)}), + 'regRLC_PG_DELAY_2': (19487, 1, {'serdes_timeout_value': (0, 7), 'serdes_cmd_delay': (8, 15), 'perwgp_timeout_value': (16, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB': (19492, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB': (19493, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT': (19494, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_UCODE_CNTL': (19495, 1, {'rlc_ucode_flags': (0, 31)}), + 'regRLC_GPM_THREAD_RESET': (19496, 1, {'thread0_reset': (0, 0), 'thread1_reset': (1, 1), 'thread2_reset': (2, 2), 'thread3_reset': (3, 3), 'reserved': (4, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T0': (19497, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T1': (19498, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_THREAD_INVALIDATE_CACHE': (19499, 1, {'thread0_invalidate_cache': (0, 0), 'thread1_invalidate_cache': (1, 1), 'thread2_invalidate_cache': (2, 2), 'thread3_invalidate_cache': (3, 3), 'reserved': (4, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_LSB': (19504, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_MSB': (19505, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_LSB': (19506, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_MSB': (19507, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_CTRL': (19508, 1, {'gfxclk_run': (0, 0), 'gfxclk_reset': (1, 1), 'gfxclk_sample': (2, 2), 'refclk_run': (3, 3), 'refclk_reset': (4, 4), 'refclk_sample': (5, 5)}), + 'regRLC_CLK_COUNT_STAT': (19509, 1, {'gfxclk_valid': (0, 0), 'refclk_valid': (1, 1), 'refclk_run_resync': (2, 2), 'refclk_reset_resync': (3, 3), 'refclk_sample_resync': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCG_DOORBELL_CNTL': (19510, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21), 'reserved': (22, 31)}), + 'regRLC_RLCG_DOORBELL_STAT': (19511, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCG_DOORBELL_0_DATA_LO': (19512, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_0_DATA_HI': (19513, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_1_DATA_LO': (19514, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_1_DATA_HI': (19515, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_2_DATA_LO': (19516, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_2_DATA_HI': (19517, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_3_DATA_LO': (19518, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_3_DATA_HI': (19519, 1, {'data': (0, 31)}), + 'regRLC_GPU_CLOCK_32_RES_SEL': (19521, 1, {'res_sel': (0, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_CLOCK_32': (19522, 1, {'gpu_clock_32': (0, 31)}), + 'regRLC_PG_CNTL': (19523, 1, {'gfx_power_gating_enable': (0, 0), 'gfx_power_gating_src': (1, 1), 'dyn_per_wgp_pg_enable': (2, 2), 'static_per_wgp_pg_enable': (3, 3), 'gfx_pipeline_pg_enable': (4, 4), 'reserved': (5, 12), 'mem_ds_disable': (13, 13), 'pg_override': (14, 14), 'cp_pg_disable': (15, 15), 'chub_handshake_enable': (16, 16), 'smu_clk_slowdown_on_pu_enable': (17, 17), 'smu_clk_slowdown_on_pd_enable': (18, 18), 'reserved1': (19, 20), 'ultra_low_voltage_enable': (21, 21), 'reserved2': (22, 22), 'smu_handshake_disable': (23, 23)}), + 'regRLC_GPM_THREAD_PRIORITY': (19524, 1, {'thread0_priority': (0, 7), 'thread1_priority': (8, 15), 'thread2_priority': (16, 23), 'thread3_priority': (24, 31)}), + 'regRLC_GPM_THREAD_ENABLE': (19525, 1, {'thread0_enable': (0, 0), 'thread1_enable': (1, 1), 'thread2_enable': (2, 2), 'thread3_enable': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCG_DOORBELL_RANGE': (19527, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_CGTT_MGCG_OVERRIDE': (19528, 1, {'rlc_repeater_fgcg_override': (0, 0), 'rlc_cgtt_sclk_override': (1, 1), 'gfxip_mgcg_override': (2, 2), 'gfxip_cgcg_override': (3, 3), 'gfxip_cgls_override': (4, 4), 'grbm_cgtt_sclk_override': (5, 5), 'gfxip_mgls_override': (6, 6), 'gfxip_gfx3d_cg_override': (7, 7), 'gfxip_fgcg_override': (8, 8), 'gfxip_repeater_fgcg_override': (9, 9), 'perfmon_clock_state': (10, 10), 'reserved_16_11': (11, 16), 'gc_cac_mgcg_clk_cntl': (17, 17), 'se_cac_mgcg_clk_cntl': (18, 18), 'reserved_31_19': (19, 31)}), + 'regRLC_CGCG_CGLS_CTRL': (19529, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL': (19530, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_DYN_PG_STATUS': (19531, 1, {'pg_status_wgp_mask': (0, 31)}), + 'regRLC_DYN_PG_REQUEST': (19532, 1, {'pg_request_wgp_mask': (0, 31)}), + 'regRLC_PG_DELAY': (19533, 1, {'power_up_delay': (0, 7), 'power_down_delay': (8, 15), 'cmd_propagate_delay': (16, 23), 'mem_sleep_delay': (24, 31)}), + 'regRLC_WGP_STATUS': (19534, 1, {'work_pending': (0, 31)}), + 'regRLC_PG_ALWAYS_ON_WGP_MASK': (19539, 1, {'aon_wgp_mask': (0, 31)}), + 'regRLC_MAX_PG_WGP': (19540, 1, {'max_powered_up_wgp': (0, 7), 'spare': (8, 31)}), + 'regRLC_AUTO_PG_CTRL': (19541, 1, {'auto_pg_en': (0, 0), 'auto_grbm_reg_save_on_idle_en': (1, 1), 'auto_wake_up_en': (2, 2), 'grbm_reg_save_gfx_idle_threshold': (3, 18), 'pg_after_grbm_reg_save_threshold': (19, 31)}), + 'regRLC_SERDES_RD_INDEX': (19545, 1, {'data_reg_id': (0, 1), 'spare': (2, 31)}), + 'regRLC_SERDES_RD_DATA_0': (19546, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_1': (19547, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_2': (19548, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_3': (19549, 1, {'data': (0, 31)}), + 'regRLC_SERDES_MASK': (19550, 1, {'gc_center_hub_0': (0, 0), 'gc_center_hub_1': (1, 1), 'reserved': (2, 15), 'gc_se_0': (16, 16), 'gc_se_1': (17, 17), 'gc_se_2': (18, 18), 'gc_se_3': (19, 19), 'gc_se_4': (20, 20), 'gc_se_5': (21, 21), 'gc_se_6': (22, 22), 'gc_se_7': (23, 23), 'reserved_31_24': (24, 31)}), + 'regRLC_SERDES_CTRL': (19551, 1, {'bpm_broadcast': (0, 0), 'bpm_reg_write': (1, 1), 'bpm_long_cmd': (2, 2), 'bpm_addr': (3, 15), 'reg_addr': (16, 23)}), + 'regRLC_SERDES_DATA': (19552, 1, {'data': (0, 31)}), + 'regRLC_SERDES_BUSY': (19553, 1, {'gc_center_hub_0': (0, 0), 'gc_center_hub_1': (1, 1), 'reserved': (2, 15), 'gc_se_0': (16, 16), 'gc_se_1': (17, 17), 'gc_se_2': (18, 18), 'gc_se_3': (19, 19), 'gc_se_4': (20, 20), 'gc_se_5': (21, 21), 'gc_se_6': (22, 22), 'gc_se_7': (23, 23), 'reserved_29_24': (24, 29), 'rd_fifo_not_empty': (30, 30), 'rd_pending': (31, 31)}), + 'regRLC_GPM_GENERAL_0': (19555, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_1': (19556, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_2': (19557, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_3': (19558, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_4': (19559, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_5': (19560, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_6': (19561, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_7': (19562, 1, {'data': (0, 31)}), + 'regRLC_STATIC_PG_STATUS': (19566, 1, {'pg_status_wgp_mask': (0, 31)}), + 'regRLC_GPM_GENERAL_16': (19574, 1, {'data': (0, 31)}), + 'regRLC_PG_DELAY_3': (19576, 1, {'cgcg_active_before_cgpg': (0, 7), 'reserved': (8, 31)}), + 'regRLC_GPR_REG1': (19577, 1, {'data': (0, 31)}), + 'regRLC_GPR_REG2': (19578, 1, {'data': (0, 31)}), + 'regRLC_GPM_INT_DISABLE_TH0': (19580, 1, {'disable_int': (0, 31)}), + 'regRLC_GPM_LEGACY_INT_DISABLE': (19581, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3)}), + 'regRLC_GPM_INT_FORCE_TH0': (19582, 1, {'force_int': (0, 31)}), + 'regRLC_SRM_CNTL': (19584, 1, {'srm_enable': (0, 0), 'auto_incr_addr': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_GPM_COMMAND_STATUS': (19592, 1, {'fifo_empty': (0, 0), 'fifo_full': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_0': (19595, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_1': (19596, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_2': (19597, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_3': (19598, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_4': (19599, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_5': (19600, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_6': (19601, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_7': (19602, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_DATA_0': (19603, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_1': (19604, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_2': (19605, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_3': (19606, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_4': (19607, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_5': (19608, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_6': (19609, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_7': (19610, 1, {'data': (0, 31)}), + 'regRLC_SRM_STAT': (19611, 1, {'srm_busy': (0, 0), 'srm_busy_delay': (1, 1), 'reserved': (2, 31)}), + 'regRLC_GPM_GENERAL_8': (19629, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_9': (19630, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_10': (19631, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_11': (19632, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_12': (19633, 1, {'data': (0, 31)}), + 'regRLC_GPM_UTCL1_CNTL_0': (19634, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_GPM_UTCL1_CNTL_1': (19635, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_GPM_UTCL1_CNTL_2': (19636, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_SPM_UTCL1_CNTL': (19637, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_UTCL1_STATUS_2': (19638, 1, {'gpm_th0_utcl1_busy': (0, 0), 'gpm_th1_utcl1_busy': (1, 1), 'gpm_th2_utcl1_busy': (2, 2), 'spm_utcl1_busy': (3, 3), 'reserved_1': (4, 4), 'gpm_th0_utcl1_stallontrans': (5, 5), 'gpm_th1_utcl1_stallontrans': (6, 6), 'gpm_th2_utcl1_stallontrans': (7, 7), 'spm_utcl1_stallontrans': (8, 8), 'reserved': (9, 31)}), + 'regRLC_SPM_UTCL1_ERROR_1': (19644, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_SPM_UTCL1_ERROR_2': (19645, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_1': (19646, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_2': (19648, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH1_ERROR_1': (19649, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH1_ERROR_2': (19650, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH2_ERROR_1': (19651, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH2_ERROR_2': (19652, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_CGCG_CGLS_CTRL_3D': (19653, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL_3D': (19654, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_SEMAPHORE_0': (19655, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_1': (19656, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_2': (19657, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_3': (19658, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_PACE_INT_STAT': (19660, 1, {'status': (0, 31)}), + 'regRLC_UTCL1_STATUS': (19668, 1, {'fault_detected': (0, 0), 'retry_detected': (1, 1), 'prt_detected': (2, 2), 'reserved': (3, 7), 'fault_utcl1id': (8, 13), 'reserved_1': (14, 15), 'retry_utcl1id': (16, 21), 'reserved_2': (22, 23), 'prt_utcl1id': (24, 29), 'reserved_3': (30, 31)}), + 'regRLC_R2I_CNTL_0': (19669, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_1': (19670, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_2': (19671, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_3': (19672, 1, {'data': (0, 31)}), + 'regRLC_GPM_INT_STAT_TH0': (19676, 1, {'status': (0, 31)}), + 'regRLC_GPM_GENERAL_13': (19677, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_14': (19678, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_15': (19679, 1, {'data': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_1': (19690, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_2': (19691, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_2': (19692, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_PACE_INT_DISABLE': (19693, 1, {'disable_int': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_2': (19695, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCV_DOORBELL_RANGE': (19696, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_RLCV_DOORBELL_CNTL': (19697, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21)}), + 'regRLC_RLCV_DOORBELL_STAT': (19698, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCV_DOORBELL_0_DATA_LO': (19699, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_0_DATA_HI': (19700, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_1_DATA_LO': (19701, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_1_DATA_HI': (19702, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_2_DATA_LO': (19703, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_2_DATA_HI': (19704, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_3_DATA_LO': (19705, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_3_DATA_HI': (19706, 1, {'data': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_1': (19707, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_1': (19708, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_RLCV_SPARE_INT': (19712, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_PACE_TIMER_INT_0': (19716, 1, {'timer': (0, 31)}), + 'regRLC_PACE_TIMER_INT_1': (19717, 1, {'timer': (0, 31)}), + 'regRLC_PACE_TIMER_CTRL': (19718, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_0_auto_rearm': (2, 2), 'timer_1_auto_rearm': (3, 3), 'timer_0_int_clear': (4, 4), 'timer_1_int_clear': (5, 5), 'reserved': (6, 31)}), + 'regRLC_SMU_CLK_REQ': (19720, 1, {'valid': (0, 0)}), + 'regRLC_CP_STAT_INVAL_STAT': (19721, 1, {'cpg_stat_inval_pend': (0, 0), 'cpc_stat_inval_pend': (1, 1), 'cpf_stat_inval_pend': (2, 2), 'cpg_stat_inval_pend_changed': (3, 3), 'cpc_stat_inval_pend_changed': (4, 4), 'cpf_stat_inval_pend_changed': (5, 5)}), + 'regRLC_CP_STAT_INVAL_CTRL': (19722, 1, {'cpg_stat_inval_pend_en': (0, 0), 'cpc_stat_inval_pend_en': (1, 1), 'cpf_stat_inval_pend_en': (2, 2)}), + 'regRLC_SPARE': (19723, 1, {'spare': (0, 31)}), + 'regRLC_SPP_CTRL': (19724, 1, {'enable': (0, 0), 'enable_pprof': (1, 1), 'enable_pwr_opt': (2, 2), 'pause': (3, 3)}), + 'regRLC_SPP_SHADER_PROFILE_EN': (19725, 1, {'ps_enable': (0, 0), 'reserved_1': (1, 1), 'gs_enable': (2, 2), 'hs_enable': (3, 3), 'csg_enable': (4, 4), 'cs_enable': (5, 5), 'ps_stop_condition': (6, 6), 'reserved_7': (7, 7), 'gs_stop_condition': (8, 8), 'hs_stop_condition': (9, 9), 'csg_stop_condition': (10, 10), 'cs_stop_condition': (11, 11), 'ps_start_condition': (12, 12), 'cs_start_condition': (13, 13), 'force_miss': (14, 14), 'force_unlocked': (15, 15), 'enable_prof_info_lock': (16, 16)}), + 'regRLC_SPP_SSF_CAPTURE_EN': (19726, 1, {'ps_enable': (0, 0), 'reserved_1': (1, 1), 'gs_enable': (2, 2), 'hs_enable': (3, 3), 'csg_enable': (4, 4), 'cs_enable': (5, 5)}), + 'regRLC_SPP_SSF_THRESHOLD_0': (19727, 1, {'ps_threshold': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SPP_SSF_THRESHOLD_1': (19728, 1, {'gs_threshold': (0, 15), 'hs_threshold': (16, 31)}), + 'regRLC_SPP_SSF_THRESHOLD_2': (19729, 1, {'csg_threshold': (0, 15), 'cs_threshold': (16, 31)}), + 'regRLC_SPP_INFLIGHT_RD_ADDR': (19730, 1, {'addr': (0, 4)}), + 'regRLC_SPP_INFLIGHT_RD_DATA': (19731, 1, {'data': (0, 31)}), + 'regRLC_SPP_PROF_INFO_1': (19736, 1, {'sh_id': (0, 31)}), + 'regRLC_SPP_PROF_INFO_2': (19737, 1, {'sh_type': (0, 3), 'cam_hit': (4, 4), 'cam_lock': (5, 5), 'cam_conflict': (6, 6)}), + 'regRLC_SPP_GLOBAL_SH_ID': (19738, 1, {'sh_id': (0, 31)}), + 'regRLC_SPP_GLOBAL_SH_ID_VALID': (19739, 1, {'valid': (0, 0)}), + 'regRLC_SPP_STATUS': (19740, 1, {'reserved_0': (0, 0), 'ssf_busy': (1, 1), 'event_arb_busy': (2, 2), 'spp_busy': (31, 31)}), + 'regRLC_SPP_PVT_STAT_0': (19741, 1, {'level_0_counter': (0, 5), 'level_1_counter': (6, 11), 'level_2_counter': (12, 17), 'level_3_counter': (18, 23), 'level_4_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_1': (19742, 1, {'level_5_counter': (0, 5), 'level_6_counter': (6, 11), 'level_7_counter': (12, 17), 'level_8_counter': (18, 23), 'level_9_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_2': (19743, 1, {'level_10_counter': (0, 5), 'level_11_counter': (6, 11), 'level_12_counter': (12, 17), 'level_13_counter': (18, 23), 'level_14_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_3': (19744, 1, {'level_15_counter': (0, 5)}), + 'regRLC_SPP_PVT_LEVEL_MAX': (19745, 1, {'level': (0, 3)}), + 'regRLC_SPP_STALL_STATE_UPDATE': (19746, 1, {'stall': (0, 0), 'enable': (1, 1)}), + 'regRLC_SPP_PBB_INFO': (19747, 1, {'pipe0_override': (0, 0), 'pipe0_override_valid': (1, 1), 'pipe1_override': (2, 2), 'pipe1_override_valid': (3, 3)}), + 'regRLC_SPP_RESET': (19748, 1, {'ssf_reset': (0, 0), 'event_arb_reset': (1, 1), 'cam_reset': (2, 2), 'pvt_reset': (3, 3)}), + 'regRLC_RLCP_DOORBELL_RANGE': (19750, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_RLCP_DOORBELL_CNTL': (19751, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21)}), + 'regRLC_RLCP_DOORBELL_STAT': (19752, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCP_DOORBELL_0_DATA_LO': (19753, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_0_DATA_HI': (19754, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_1_DATA_LO': (19755, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_1_DATA_HI': (19756, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_2_DATA_LO': (19757, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_2_DATA_HI': (19758, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_3_DATA_LO': (19759, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_3_DATA_HI': (19760, 1, {'data': (0, 31)}), + 'regRLC_CAC_MASK_CNTL': (19781, 1, {'rlc_cac_mask': (0, 31)}), + 'regRLC_POWER_RESIDENCY_CNTR_CTRL': (19784, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_CLK_RESIDENCY_CNTR_CTRL': (19785, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_DS_RESIDENCY_CNTR_CTRL': (19786, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_ULV_RESIDENCY_CNTR_CTRL': (19787, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_PCC_RESIDENCY_CNTR_CTRL': (19788, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'event_sel': (5, 8), 'reserved': (9, 31)}), + 'regRLC_GENERAL_RESIDENCY_CNTR_CTRL': (19789, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_POWER_RESIDENCY_EVENT_CNTR': (19792, 1, {'data': (0, 31)}), + 'regRLC_CLK_RESIDENCY_EVENT_CNTR': (19793, 1, {'data': (0, 31)}), + 'regRLC_DS_RESIDENCY_EVENT_CNTR': (19794, 1, {'data': (0, 31)}), + 'regRLC_ULV_RESIDENCY_EVENT_CNTR': (19795, 1, {'data': (0, 31)}), + 'regRLC_PCC_RESIDENCY_EVENT_CNTR': (19796, 1, {'data': (0, 31)}), + 'regRLC_GENERAL_RESIDENCY_EVENT_CNTR': (19797, 1, {'data': (0, 31)}), + 'regRLC_POWER_RESIDENCY_REF_CNTR': (19800, 1, {'data': (0, 31)}), + 'regRLC_CLK_RESIDENCY_REF_CNTR': (19801, 1, {'data': (0, 31)}), + 'regRLC_DS_RESIDENCY_REF_CNTR': (19802, 1, {'data': (0, 31)}), + 'regRLC_ULV_RESIDENCY_REF_CNTR': (19803, 1, {'data': (0, 31)}), + 'regRLC_PCC_RESIDENCY_REF_CNTR': (19804, 1, {'data': (0, 31)}), + 'regRLC_GENERAL_RESIDENCY_REF_CNTR': (19805, 1, {'data': (0, 31)}), + 'regRLC_GFX_IH_CLIENT_CTRL': (19806, 1, {'se_interrupt_mask': (0, 7), 'sdma_interrupt_mask': (8, 11), 'utcl2_interrupt_mask': (12, 12), 'pmm_interrupt_mask': (13, 13), 'reserved_15_14': (14, 15), 'se_interrupt_error_clear': (16, 23), 'sdma_interrupt_error_clear': (24, 27), 'utcl2_interrupt_error_clear': (28, 28), 'pmm_interrupt_error_clear': (29, 29), 'reserved_31_30': (30, 31)}), + 'regRLC_GFX_IH_ARBITER_STAT': (19807, 1, {'client_granted': (0, 15), 'reserved': (16, 27), 'last_client_granted': (28, 31)}), + 'regRLC_GFX_IH_CLIENT_SE_STAT_L': (19808, 1, {'se0_buffer_level': (0, 3), 'se0_buffer_loading': (4, 4), 'se0_buffer_overflow': (5, 5), 'se0_protocol_error': (6, 6), 'se0_reserved': (7, 7), 'se1_buffer_level': (8, 11), 'se1_buffer_loading': (12, 12), 'se1_buffer_overflow': (13, 13), 'se1_protocol_error': (14, 14), 'se1_reserved': (15, 15), 'se2_buffer_level': (16, 19), 'se2_buffer_loading': (20, 20), 'se2_buffer_overflow': (21, 21), 'se2_protocol_error': (22, 22), 'se2_reserved': (23, 23), 'se3_buffer_level': (24, 27), 'se3_buffer_loading': (28, 28), 'se3_buffer_overflow': (29, 29), 'se3_protocol_error': (30, 30), 'se3_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_SE_STAT_H': (19809, 1, {'se4_buffer_level': (0, 3), 'se4_buffer_loading': (4, 4), 'se4_buffer_overflow': (5, 5), 'se4_protocol_error': (6, 6), 'se4_reserved': (7, 7), 'se5_buffer_level': (8, 11), 'se5_buffer_loading': (12, 12), 'se5_buffer_overflow': (13, 13), 'se5_protocol_error': (14, 14), 'se5_reserved': (15, 15), 'se6_buffer_level': (16, 19), 'se6_buffer_loading': (20, 20), 'se6_buffer_overflow': (21, 21), 'se6_protocol_error': (22, 22), 'se6_reserved': (23, 23), 'se7_buffer_level': (24, 27), 'se7_buffer_loading': (28, 28), 'se7_buffer_overflow': (29, 29), 'se7_protocol_error': (30, 30), 'se7_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_SDMA_STAT': (19810, 1, {'sdma0_buffer_level': (0, 3), 'sdma0_buffer_loading': (4, 4), 'sdma0_buffer_overflow': (5, 5), 'sdma0_protocol_error': (6, 6), 'sdma0_reserved': (7, 7), 'sdma1_buffer_level': (8, 11), 'sdma1_buffer_loading': (12, 12), 'sdma1_buffer_overflow': (13, 13), 'sdma1_protocol_error': (14, 14), 'sdma1_reserved': (15, 15), 'sdma2_buffer_level': (16, 19), 'sdma2_buffer_loading': (20, 20), 'sdma2_buffer_overflow': (21, 21), 'sdma2_protocol_error': (22, 22), 'sdma2_reserved': (23, 23), 'sdma3_buffer_level': (24, 27), 'sdma3_buffer_loading': (28, 28), 'sdma3_buffer_overflow': (29, 29), 'sdma3_protocol_error': (30, 30), 'sdma3_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_OTHER_STAT': (19811, 1, {'utcl2_buffer_level': (0, 3), 'utcl2_buffer_loading': (4, 4), 'utcl2_buffer_overflow': (5, 5), 'utcl2_protocol_error': (6, 6), 'utcl2_reserved': (7, 7), 'pmm_buffer_level': (8, 11), 'pmm_buffer_loading': (12, 12), 'pmm_buffer_overflow': (13, 13), 'pmm_protocol_error': (14, 14), 'pmm_reserved': (15, 15), 'reserved_31_16': (16, 31)}), + 'regRLC_SPM_GLOBAL_DELAY_IND_ADDR': (19812, 1, {'addr': (0, 11)}), + 'regRLC_SPM_GLOBAL_DELAY_IND_DATA': (19813, 1, {'data': (0, 5)}), + 'regRLC_SPM_SE_DELAY_IND_ADDR': (19814, 1, {'addr': (0, 11)}), + 'regRLC_SPM_SE_DELAY_IND_DATA': (19815, 1, {'data': (0, 5)}), + 'regRLC_LX6_CNTL': (19840, 1, {'breset': (0, 0), 'runstall': (1, 1), 'pdebug_enable': (2, 2), 'stat_vector_sel': (3, 3)}), + 'regRLC_XT_CORE_STATUS': (19924, 1, {'p_wait_mode': (0, 0), 'p_fatal_error': (1, 1), 'double_exception_error': (2, 2)}), + 'regRLC_XT_CORE_INTERRUPT': (19925, 1, {'extint1': (0, 25), 'extint2': (26, 26), 'nmi': (27, 27)}), + 'regRLC_XT_CORE_FAULT_INFO': (19926, 1, {'fault_info': (0, 31)}), + 'regRLC_XT_CORE_ALT_RESET_VEC': (19927, 1, {'alt_reset_vec': (0, 31)}), + 'regRLC_XT_CORE_RESERVED': (19928, 1, {'reserved': (0, 31)}), + 'regRLC_XT_INT_VEC_FORCE': (19929, 1, {'num_0': (0, 0), 'num_1': (1, 1), 'num_2': (2, 2), 'num_3': (3, 3), 'num_4': (4, 4), 'num_5': (5, 5), 'num_6': (6, 6), 'num_7': (7, 7), 'num_8': (8, 8), 'num_9': (9, 9), 'num_10': (10, 10), 'num_11': (11, 11), 'num_12': (12, 12), 'num_13': (13, 13), 'num_14': (14, 14), 'num_15': (15, 15), 'num_16': (16, 16), 'num_17': (17, 17), 'num_18': (18, 18), 'num_19': (19, 19), 'num_20': (20, 20), 'num_21': (21, 21), 'num_22': (22, 22), 'num_23': (23, 23), 'num_24': (24, 24), 'num_25': (25, 25)}), + 'regRLC_XT_INT_VEC_CLEAR': (19930, 1, {'num_0': (0, 0), 'num_1': (1, 1), 'num_2': (2, 2), 'num_3': (3, 3), 'num_4': (4, 4), 'num_5': (5, 5), 'num_6': (6, 6), 'num_7': (7, 7), 'num_8': (8, 8), 'num_9': (9, 9), 'num_10': (10, 10), 'num_11': (11, 11), 'num_12': (12, 12), 'num_13': (13, 13), 'num_14': (14, 14), 'num_15': (15, 15), 'num_16': (16, 16), 'num_17': (17, 17), 'num_18': (18, 18), 'num_19': (19, 19), 'num_20': (20, 20), 'num_21': (21, 21), 'num_22': (22, 22), 'num_23': (23, 23), 'num_24': (24, 24), 'num_25': (25, 25)}), + 'regRLC_XT_INT_VEC_MUX_SEL': (19931, 1, {'mux_sel': (0, 4)}), + 'regRLC_XT_INT_VEC_MUX_INT_SEL': (19932, 1, {'int_sel': (0, 5)}), + 'regRLC_GPU_CLOCK_COUNT_SPM_LSB': (19940, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_SPM_MSB': (19941, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_SPM_THREAD_TRACE_CTRL': (19942, 1, {'thread_trace_int_en': (0, 0)}), + 'regRLC_SPP_CAM_ADDR': (19944, 1, {'addr': (0, 7)}), + 'regRLC_SPP_CAM_DATA': (19945, 1, {'data': (0, 7), 'tag': (8, 31)}), + 'regRLC_SPP_CAM_EXT_ADDR': (19946, 1, {'addr': (0, 7)}), + 'regRLC_SPP_CAM_EXT_DATA': (19947, 1, {'valid': (0, 0), 'lock': (1, 1)}), + 'regRLC_XT_DOORBELL_RANGE': (19957, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_XT_DOORBELL_CNTL': (19958, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21)}), + 'regRLC_XT_DOORBELL_STAT': (19959, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_XT_DOORBELL_0_DATA_LO': (19960, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_0_DATA_HI': (19961, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_1_DATA_LO': (19962, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_1_DATA_HI': (19963, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_2_DATA_LO': (19964, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_2_DATA_HI': (19965, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_3_DATA_LO': (19966, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_3_DATA_HI': (19967, 1, {'data': (0, 31)}), + 'regRLC_MEM_SLP_CNTL': (19968, 1, {'rlc_mem_ls_en': (0, 0), 'rlc_mem_ds_en': (1, 1), 'rlc_srm_mem_ls_override': (2, 2), 'rlc_srm_mem_ds_override': (3, 3), 'rlc_spm_mem_ls_override': (4, 4), 'rlc_spm_mem_ds_override': (5, 5), 'reserved': (6, 6), 'rlc_ls_ds_busy_override': (7, 7), 'rlc_mem_ls_on_delay': (8, 15), 'rlc_mem_ls_off_delay': (16, 23), 'rlc_spp_mem_ls_override': (24, 24), 'rlc_spp_mem_ds_override': (25, 25), 'reserved1': (26, 31)}), + 'regRLC_RLCV_SAFE_MODE': (19970, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SMU_SAFE_MODE': (19971, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_RLCV_COMMAND': (19972, 1, {'cmd': (0, 3), 'reserved': (4, 31)}), + 'regRLC_SMU_MESSAGE': (19973, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_MESSAGE_1': (19974, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_MESSAGE_2': (19975, 1, {'cmd': (0, 31)}), + 'regRLC_SRM_GPM_COMMAND': (19976, 1, {'op': (0, 0), 'index_cntl': (1, 1), 'index_cntl_num': (2, 4), 'size': (5, 17), 'start_offset': (18, 30), 'dest_memory': (31, 31)}), + 'regRLC_SRM_GPM_ABORT': (19977, 1, {'abort': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SMU_COMMAND': (19978, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_ARGUMENT_1': (19979, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_2': (19980, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_3': (19981, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_4': (19982, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_5': (19983, 1, {'arg': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_ADDR_HI': (19984, 1, {'addr_hi': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_ADDR_LO': (19985, 1, {'addr_lo': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_SIZE': (19986, 1, {'size': (0, 25), 'reserved': (26, 31)}), + 'regRLC_IMU_MISC': (19990, 1, {'throttle_gfx': (0, 0), 'early_mgcg': (1, 1), 'reserved': (2, 31)}), + 'regRLC_IMU_RESET_VECTOR': (19991, 1, {'cold_boot_exit': (0, 0), 'vddgfx_exit': (1, 1), 'vector': (2, 7), 'reserved': (8, 31)}), + 'regRLC_RLCS_DEC_START': (20064, 1, {}), + 'regRLC_RLCS_DEC_DUMP_ADDR': (20065, 1, {}), + 'regRLC_RLCS_EXCEPTION_REG_1': (20066, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_2': (20067, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_3': (20068, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_4': (20069, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_CGCG_REQUEST': (20070, 1, {'cgcg_request': (0, 0), 'cgcg_request_3d': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_CGCG_STATUS': (20071, 1, {'cgcg_ramp_status': (0, 1), 'gfx_clk_status': (2, 2), 'cgcg_ramp_status_3d': (3, 4), 'gfx_clk_status_3d': (5, 5), 'reserved': (6, 31)}), + 'regRLC_RLCS_SOC_DS_CNTL': (20072, 1, {'soc_clk_ds_allow': (0, 0), 'soc_clk_ds_rlc_busy_mask': (1, 1), 'soc_clk_ds_cp_busy_mask': (2, 2), 'soc_clk_ds_gfx_pwr_stalled_mask': (6, 6), 'soc_clk_ds_non3d_pwr_stalled_mask': (7, 7), 'soc_clk_ds_sdma_0_busy_mask': (16, 16), 'soc_clk_ds_sdma_1_busy_mask': (17, 17), 'soc_clk_ds_sdma_2_busy_mask': (18, 18), 'soc_clk_ds_sdma_3_busy_mask': (19, 19), 'soc_clk_ds_sdma_4_busy_mask': (20, 20), 'soc_clk_ds_sdma_5_busy_mask': (21, 21), 'soc_clk_ds_sdma_6_busy_mask': (22, 22), 'soc_clk_ds_sdma_7_busy_mask': (23, 23)}), + 'regRLC_RLCS_GFX_DS_CNTL': (20073, 1, {'gfx_clk_ds_allow': (0, 0), 'gfx_clk_ds_rlc_busy_mask': (1, 1), 'gfx_clk_ds_cp_busy_mask': (2, 2), 'gfx_clk_ds_gfx_pwr_stalled_mask': (6, 6), 'gfx_clk_ds_non3d_pwr_stalled_mask': (7, 7), 'gfx_clk_ds_imu_disable_mask': (8, 8), 'gfx_clk_ds_sdma_0_busy_mask': (16, 16), 'gfx_clk_ds_sdma_1_busy_mask': (17, 17), 'gfx_clk_ds_sdma_2_busy_mask': (18, 18), 'gfx_clk_ds_sdma_3_busy_mask': (19, 19), 'gfx_clk_ds_sdma_4_busy_mask': (20, 20), 'gfx_clk_ds_sdma_5_busy_mask': (21, 21), 'gfx_clk_ds_sdma_6_busy_mask': (22, 22), 'gfx_clk_ds_sdma_7_busy_mask': (23, 23)}), + 'regRLC_RLCS_GFX_DS_ALLOW_MASK_CNTL': (20074, 1, {}), + 'regRLC_GPM_STAT': (20075, 1, {'rlc_busy': (0, 0), 'gfx_power_status': (1, 1), 'gfx_clock_status': (2, 2), 'gfx_ls_status': (3, 3), 'gfx_pipeline_power_status': (4, 4), 'cntx_idle_being_processed': (5, 5), 'cntx_busy_being_processed': (6, 6), 'gfx_idle_being_processed': (7, 7), 'cmp_busy_being_processed': (8, 8), 'saving_registers': (9, 9), 'restoring_registers': (10, 10), 'gfx3d_blocks_changing_power_state': (11, 11), 'cmp_blocks_changing_power_state': (12, 12), 'static_wgp_powering_up': (13, 13), 'static_wgp_powering_down': (14, 14), 'dyn_wgp_powering_up': (15, 15), 'dyn_wgp_powering_down': (16, 16), 'aborted_pd_sequence': (17, 17), 'cmp_power_status': (18, 18), 'gfx_ls_status_3d': (19, 19), 'gfx_clock_status_3d': (20, 20), 'mgcg_override_status': (21, 21), 'rlc_exec_rom_code': (22, 22), 'fgcg_override_status': (23, 23), 'pg_error_status': (24, 31)}), + 'regRLC_RLCS_GPM_STAT': (20075, 1, {'rlc_busy': (0, 0), 'gfx_power_status': (1, 1), 'gfx_clock_status': (2, 2), 'gfx_ls_status': (3, 3), 'gfx_pipeline_power_status': (4, 4), 'cntx_idle_being_processed': (5, 5), 'cntx_busy_being_processed': (6, 6), 'gfx_idle_being_processed': (7, 7), 'cmp_busy_being_processed': (8, 8), 'saving_registers': (9, 9), 'restoring_registers': (10, 10), 'gfx3d_blocks_changing_power_state': (11, 11), 'cmp_blocks_changing_power_state': (12, 12), 'static_wgp_powering_up': (13, 13), 'static_wgp_powering_down': (14, 14), 'dyn_wgp_powering_up': (15, 15), 'dyn_wgp_powering_down': (16, 16), 'aborted_pd_sequence': (17, 17), 'cmp_power_status': (18, 18), 'gfx_ls_status_3d': (19, 19), 'gfx_clock_status_3d': (20, 20), 'mgcg_override_status': (21, 21), 'rlc_exec_rom_code': (22, 22), 'fgcg_override_status': (23, 23), 'pg_error_status': (24, 31)}), + 'regRLC_RLCS_ABORTED_PD_SEQUENCE': (20076, 1, {'aps': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_DIDT_FORCE_STALL': (20077, 1, {'dfs': (0, 2), 'valid': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_IOV_CMD_STATUS': (20078, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IOV_CNTX_LOC_SIZE': (20079, 1, {'data': (0, 7), 'reserved': (8, 31)}), + 'regRLC_RLCS_IOV_SCH_BLOCK': (20080, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IOV_VM_BUSY_STATUS': (20081, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GPM_STAT_2': (20082, 1, {'tc_trans_error': (0, 0), 'rlc_pwr_non3d_stalled': (1, 1), 'gfx_pwr_stalled_status': (2, 2), 'gfx_ulv_status': (3, 3), 'gfx_general_status': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_GRBM_SOFT_RESET': (20083, 1, {'reset': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_PG_CHANGE_STATUS': (20084, 1, {'pg_cntl_changed': (0, 0), 'pg_reg_changed': (1, 1), 'dyn_pg_status_changed': (2, 2), 'dyn_pg_req_changed': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_PG_CHANGE_READ': (20085, 1, {'reserved': (0, 0), 'pg_reg_changed': (1, 1), 'dyn_pg_status_changed': (2, 2), 'dyn_pg_req_changed': (3, 3)}), + 'regRLC_RLCS_IH_SEMAPHORE': (20086, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_IH_COOKIE_SEMAPHORE': (20087, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_WGP_STATUS': (20088, 1, {'cs_work_active': (0, 0), 'static_wgp_status_changed': (1, 1), 'dymanic_wgp_status_changed': (2, 2), 'static_perwgp_pd_incomplete': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_WGP_READ': (20089, 1, {'cs_work_active': (0, 0), 'static_wgp_status_changed': (1, 1), 'dymanic_wgp_status_changed': (2, 2), 'reserved': (3, 31)}), + 'regRLC_RLCS_CP_INT_CTRL_1': (20090, 1, {'interrupt_ack': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_CP_INT_CTRL_2': (20091, 1, {'idle_auto_ack_en': (0, 0), 'busy_auto_ack_en': (1, 1), 'idle_auto_ack_active': (2, 2), 'busy_auto_ack_active': (3, 3), 'interrupt_pending': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_CP_INT_INFO_1': (20092, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_RLCS_CP_INT_INFO_2': (20093, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 24), 'reserved': (25, 31)}), + 'regRLC_RLCS_SPM_INT_CTRL': (20094, 1, {'interrupt_ack': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_SPM_INT_INFO_1': (20095, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_RLCS_SPM_INT_INFO_2': (20096, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 24), 'reserved': (25, 31)}), + 'regRLC_RLCS_DSM_TRIG': (20097, 1, {'start': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_BOOTLOAD_STATUS': (20098, 1, {'gfx_init_done': (0, 0), 'rlc_gpm_iram_loaded': (3, 3), 'rlc_gpm_iram_done': (4, 4), 'reserved': (5, 30), 'bootload_complete': (31, 31)}), + 'regRLC_RLCS_POWER_BRAKE_CNTL': (20099, 1, {'power_brake': (0, 0), 'int_clear': (1, 1), 'max_hysteresis': (2, 9), 'hysteresis_cnt': (10, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_POWER_BRAKE_CNTL_TH1': (20100, 1, {'power_brake': (0, 0), 'int_clear': (1, 1), 'max_hysteresis': (2, 9), 'hysteresis_cnt': (10, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_GRBM_IDLE_BUSY_STAT': (20101, 1, {'grbm_rlc_gc_stat_idle': (0, 1), 'sdma_0_busy': (16, 16), 'sdma_1_busy': (17, 17), 'sdma_2_busy': (18, 18), 'sdma_3_busy': (19, 19), 'sdma_4_busy': (20, 20), 'sdma_5_busy': (21, 21), 'sdma_6_busy': (22, 22), 'sdma_7_busy': (23, 23), 'sdma_0_busy_changed': (24, 24), 'sdma_1_busy_changed': (25, 25), 'sdma_2_busy_changed': (26, 26), 'sdma_3_busy_changed': (27, 27), 'sdma_4_busy_changed': (28, 28), 'sdma_5_busy_changed': (29, 29), 'sdma_6_busy_changed': (30, 30), 'sdma_7_busy_changed': (31, 31)}), + 'regRLC_RLCS_GRBM_IDLE_BUSY_INT_CNTL': (20102, 1, {'sdma0_busy_int_clear': (0, 0), 'sdma1_busy_int_clear': (1, 1), 'sdma2_busy_int_clear': (2, 2), 'sdma3_busy_int_clear': (3, 3), 'sdma4_busy_int_clear': (4, 4), 'sdma5_busy_int_clear': (5, 5), 'sdma6_busy_int_clear': (6, 6), 'sdma7_busy_int_clear': (7, 7)}), + 'regRLC_RLCS_CMP_IDLE_CNTL': (20103, 1, {'int_clear': (0, 0), 'cmp_idle_hyst': (1, 1), 'cmp_idle': (2, 2), 'max_hysteresis': (3, 10), 'hysteresis_cnt': (11, 18), 'reserved': (19, 31)}), + 'regRLC_RLCS_GENERAL_0': (20104, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_1': (20105, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_2': (20106, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_3': (20107, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_4': (20108, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_5': (20109, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_6': (20110, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_7': (20111, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_8': (20112, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_9': (20113, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_10': (20114, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_11': (20115, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_12': (20116, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_13': (20117, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_14': (20118, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_15': (20119, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_16': (20120, 1, {'data': (0, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_1': (20165, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_2': (20166, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_3': (20167, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_4': (20168, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_SPM_SQTT_MODE': (20169, 1, {'mode': (0, 0)}), + 'regRLC_RLCS_CP_DMA_SRCID_OVER': (20170, 1, {'srcid_override': (0, 0)}), + 'regRLC_RLCS_BOOTLOAD_ID_STATUS1': (20171, 1, {'id_0_loaded': (0, 0), 'id_1_loaded': (1, 1), 'id_2_loaded': (2, 2), 'id_3_loaded': (3, 3), 'id_4_loaded': (4, 4), 'id_5_loaded': (5, 5), 'id_6_loaded': (6, 6), 'id_7_loaded': (7, 7), 'id_8_loaded': (8, 8), 'id_9_loaded': (9, 9), 'id_10_loaded': (10, 10), 'id_11_loaded': (11, 11), 'id_12_loaded': (12, 12), 'id_13_loaded': (13, 13), 'id_14_loaded': (14, 14), 'id_15_loaded': (15, 15), 'id_16_loaded': (16, 16), 'id_17_loaded': (17, 17), 'id_18_loaded': (18, 18), 'id_19_loaded': (19, 19), 'id_20_loaded': (20, 20), 'id_21_loaded': (21, 21), 'id_22_loaded': (22, 22), 'id_23_loaded': (23, 23), 'id_24_loaded': (24, 24), 'id_25_loaded': (25, 25), 'id_26_loaded': (26, 26), 'id_27_loaded': (27, 27), 'id_28_loaded': (28, 28), 'id_29_loaded': (29, 29), 'id_30_loaded': (30, 30), 'id_31_loaded': (31, 31)}), + 'regRLC_RLCS_BOOTLOAD_ID_STATUS2': (20172, 1, {'id_32_loaded': (0, 0), 'id_33_loaded': (1, 1), 'id_34_loaded': (2, 2), 'id_35_loaded': (3, 3), 'id_36_loaded': (4, 4), 'id_37_loaded': (5, 5), 'id_38_loaded': (6, 6), 'id_39_loaded': (7, 7), 'id_40_loaded': (8, 8), 'id_41_loaded': (9, 9), 'id_42_loaded': (10, 10), 'id_43_loaded': (11, 11), 'id_44_loaded': (12, 12), 'id_45_loaded': (13, 13), 'id_46_loaded': (14, 14), 'id_47_loaded': (15, 15), 'id_48_loaded': (16, 16), 'id_49_loaded': (17, 17), 'id_50_loaded': (18, 18), 'id_51_loaded': (19, 19), 'id_52_loaded': (20, 20), 'id_53_loaded': (21, 21), 'id_54_loaded': (22, 22), 'id_55_loaded': (23, 23), 'id_56_loaded': (24, 24), 'id_57_loaded': (25, 25), 'id_58_loaded': (26, 26), 'id_59_loaded': (27, 27), 'id_60_loaded': (28, 28), 'id_61_loaded': (29, 29), 'id_62_loaded': (30, 30), 'id_63_loaded': (31, 31)}), + 'regRLC_RLCS_IMU_VIDCHG_CNTL': (20173, 1, {'req': (0, 0), 'data': (1, 9), 'psien': (10, 10), 'ack': (11, 11), 'reserved': (12, 31)}), + 'regRLC_RLCS_EDC_INT_CNTL': (20174, 1, {'edc_event_int_clear': (0, 0)}), + 'regRLC_RLCS_KMD_LOG_CNTL1': (20175, 1, {'data': (0, 31)}), + 'regRLC_RLCS_KMD_LOG_CNTL2': (20176, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GPM_LEGACY_INT_STAT': (20177, 1, {'gc_cac_edc_event_changed': (0, 0), 'gfx_power_brake_changed': (1, 1)}), + 'regRLC_RLCS_GPM_LEGACY_INT_DISABLE': (20178, 1, {'gc_cac_edc_event_changed': (0, 0), 'gfx_power_brake_changed': (1, 1)}), + 'regRLC_RLCS_SRM_SRCID_CNTL': (20179, 1, {'srcid': (0, 2)}), + 'regRLC_RLCS_GCR_DATA_0': (20180, 1, {'phase_0': (0, 15), 'phase_1': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_1': (20181, 1, {'phase_2': (0, 15), 'phase_3': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_2': (20182, 1, {'phase_4': (0, 15), 'phase_5': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_3': (20183, 1, {'phase_6': (0, 15), 'phase_7': (16, 31)}), + 'regRLC_RLCS_GCR_STATUS': (20184, 1, {'gcr_busy': (0, 0), 'gcr_out_count': (1, 4), 'reserved_2': (5, 7), 'gcriu_cli_rsp_tag': (8, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_PERFMON_CLK_CNTL_UCODE': (20185, 1, {'perfmon_clock_state': (0, 0)}), + 'regRLC_RLCS_UTCL2_CNTL': (20186, 1, {'mtype_no_pte_mode': (0, 0), 'gpa_override': (1, 1), 'vf_override': (2, 2), 'gpa_override_value': (3, 4), 'vf_override_value': (5, 5), 'ignore_pte_permission': (6, 6), 'reserved': (7, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA0': (20187, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA1': (20188, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA2': (20189, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA3': (20190, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA4': (20191, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_CONTROL': (20192, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_CNTL': (20193, 1, {'donetog': (0, 0), 'chgtog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_DATA0': (20194, 1, {'data': (0, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_CONTROL': (20195, 1, {'data': (0, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_CNTL': (20196, 1, {'chgtog': (0, 0), 'donetog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_0': (20197, 1, {'current': (0, 15), 'voltage': (16, 31)}), + 'regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_1': (20198, 1, {'temperature1': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_IMU_RLC_MUTEX_CNTL': (20199, 1, {'req': (0, 0), 'acquire': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_RLC_STATUS': (20200, 1, {'allow_gfxoff': (0, 0), 'allow_fa_dcs': (1, 1), 'reserved_14_2': (2, 14), 'disable_gfxclk_ds': (15, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_RLC_IMU_STATUS': (20201, 1, {'pwr_down_active': (0, 0), 'rlc_alive': (1, 1), 'reserved_3_2': (2, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_IMU_RAM_DATA_1': (20202, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_1_LSB': (20203, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_1_MSB': (20204, 1, {'data': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_IMU_RAM_DATA_0': (20205, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_0_LSB': (20206, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_0_MSB': (20207, 1, {'data': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_IMU_RAM_CNTL': (20208, 1, {'reqtog': (0, 0), 'acktog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_GFX_DOORBELL_FENCE': (20209, 1, {'enable': (0, 0), 'ack': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_CNTL_1': (20211, 1, {'interrupt_ack': (0, 0), 'resp_id': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_CNTL_2': (20212, 1, {'auto_ack_en': (0, 0), 'auto_ack_active': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_STAT': (20213, 1, {'req_idle_hist': (0, 7), 'req_busy_hist': (8, 15), 'last_sdma_rlc_int_id': (16, 16), 'sdma_rlc_int_pending': (17, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_SDMA_INT_INFO': (20214, 1, {'req_idle_to_fw': (0, 7), 'req_busy_to_fw': (8, 15), 'interrupt_id': (16, 16), 'reserved': (17, 31)}), + 'regRLC_RLCS_PMM_CGCG_CNTL': (20215, 1, {'valid': (0, 0), 'clean': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_GFX_MEM_POWER_CTRL_LO': (20216, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GFX_RM_CNTL': (20218, 1, {'rlc_gfx_rm_valid': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_DEC_END': (20479, 1, {}), + 'regRLC_SAFE_MODE': (2432, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SPM_SAMPLE_CNT': (2433, 1, {'count': (0, 31)}), + 'regRLC_SPM_MC_CNTL': (2434, 1, {'rlc_spm_vmid': (0, 3), 'rlc_spm_policy': (4, 5), 'rlc_spm_perf_cntr': (6, 6), 'rlc_spm_fed': (7, 7), 'rlc_spm_mtype_over': (8, 8), 'rlc_spm_mtype': (9, 11), 'rlc_spm_bc': (12, 12), 'rlc_spm_ro': (13, 13), 'rlc_spm_vol': (14, 14), 'rlc_spm_nofill': (15, 15), 'reserved_3': (16, 17), 'rlc_spm_llc_noalloc': (18, 18), 'rlc_spm_llc_noalloc_over': (19, 19), 'reserved': (20, 31)}), + 'regRLC_SPM_INT_CNTL': (2435, 1, {'rlc_spm_int_cntl': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_STATUS': (2436, 1, {'rlc_spm_int_status': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_INFO_1': (2437, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_SPM_INT_INFO_2': (2438, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 23), 'reserved': (24, 31)}), + 'regRLC_CSIB_ADDR_LO': (2439, 1, {'address': (0, 31)}), + 'regRLC_CSIB_ADDR_HI': (2440, 1, {'address': (0, 15)}), + 'regRLC_CSIB_LENGTH': (2441, 1, {'length': (0, 31)}), + 'regRLC_CP_SCHEDULERS': (2442, 1, {'scheduler0': (0, 7), 'scheduler1': (8, 15)}), + 'regRLC_CP_EOF_INT': (2443, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_CP_EOF_INT_CNT': (2444, 1, {'cnt': (0, 31)}), + 'regRLC_SPARE_INT_0': (2445, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_SPARE_INT_1': (2446, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_SPARE_INT_2': (2447, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_PACE_SPARE_INT': (2448, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_PACE_SPARE_INT_1': (2449, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCV_SPARE_INT_1': (2450, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regGRBM_GFX_INDEX_SR_SELECT': (23040, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_INDEX_SR_DATA': (23041, 1, {'instance_index': (0, 7), 'sa_index': (8, 15), 'se_index': (16, 23), 'sa_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_SELECT': (23042, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_DATA': (23043, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10)}), + 'regGRBM_SE_REMAP_CNTL': (23048, 1, {'se0_remap_en': (0, 0), 'se0_remap': (1, 3), 'se1_remap_en': (4, 4), 'se1_remap': (5, 7), 'se2_remap_en': (8, 8), 'se2_remap': (9, 11), 'se3_remap_en': (12, 12), 'se3_remap': (13, 15), 'se4_remap_en': (16, 16), 'se4_remap': (17, 19), 'se5_remap_en': (20, 20), 'se5_remap': (21, 23), 'se6_remap_en': (24, 24), 'se6_remap': (25, 27), 'se7_remap_en': (28, 28), 'se7_remap': (29, 31)}), + 'regRLC_GPU_IOV_VF_ENABLE': (23296, 1, {'vf_enable': (0, 0), 'reserved': (1, 15), 'vf_num': (16, 31)}), + 'regRLC_GPU_IOV_CFG_REG6': (23302, 1, {'cntxt_size': (0, 6), 'cntxt_location': (7, 7), 'reserved': (8, 9), 'cntxt_offset': (10, 31)}), + 'regRLC_SDMA0_STATUS': (23320, 1, {'status': (0, 31)}), + 'regRLC_SDMA1_STATUS': (23321, 1, {'status': (0, 31)}), + 'regRLC_SDMA2_STATUS': (23322, 1, {'status': (0, 31)}), + 'regRLC_SDMA3_STATUS': (23323, 1, {'status': (0, 31)}), + 'regRLC_SDMA0_BUSY_STATUS': (23324, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA1_BUSY_STATUS': (23325, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA2_BUSY_STATUS': (23326, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA3_BUSY_STATUS': (23327, 1, {'busy_status': (0, 31)}), + 'regRLC_GPU_IOV_CFG_REG8': (23328, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_RLCV_TIMER_INT_0': (23333, 1, {'timer': (0, 31)}), + 'regRLC_RLCV_TIMER_INT_1': (23334, 1, {'timer': (0, 31)}), + 'regRLC_RLCV_TIMER_CTRL': (23335, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_0_auto_rearm': (2, 2), 'timer_1_auto_rearm': (3, 3), 'timer_0_int_clear': (4, 4), 'timer_1_int_clear': (5, 5), 'reserved': (6, 31)}), + 'regRLC_RLCV_TIMER_STAT': (23336, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'reserved': (2, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_0_auto_rearm_sync': (10, 10), 'timer_1_auto_rearm_sync': (11, 11)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS': (23338, 1, {'vf_doorbell_status': (0, 30), 'pf_doorbell_status': (31, 31)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS_SET': (23339, 1, {'vf_doorbell_status_set': (0, 30), 'pf_doorbell_status_set': (31, 31)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS_CLR': (23340, 1, {'vf_doorbell_status_clr': (0, 30), 'pf_doorbell_status_clr': (31, 31)}), + 'regRLC_GPU_IOV_VF_MASK': (23341, 1, {'vf_mask': (0, 30)}), + 'regRLC_HYP_SEMAPHORE_0': (23342, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_HYP_SEMAPHORE_1': (23343, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_BUSY_CLK_CNTL': (23344, 1, {'busy_off_latency': (0, 5), 'grbm_busy_off_latency': (8, 13)}), + 'regRLC_CLK_CNTL': (23345, 1, {'rlc_srm_icg_override': (0, 0), 'rlc_imu_icg_override': (1, 1), 'rlc_spm_icg_override': (2, 2), 'rlc_spm_rspm_icg_override': (3, 3), 'rlc_gpm_icg_override': (4, 4), 'rlc_cmn_icg_override': (5, 5), 'rlc_tc_icg_override': (6, 6), 'rlc_reg_icg_override': (7, 7), 'rlc_sram_clk_gater_override': (8, 8), 'reserved_9': (9, 9), 'rlc_spp_icg_override': (10, 10), 'reserved_11': (11, 11), 'rlc_tc_fgcg_rep_override': (12, 12), 'reserved_15': (15, 15), 'rlc_utcl2_fgcg_override': (18, 18), 'rlc_ih_gasket_icg_override': (19, 19), 'reserved': (20, 31)}), + 'regRLC_PACE_TIMER_STAT': (23347, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'reserved': (2, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_0_auto_rearm_sync': (10, 10), 'timer_1_auto_rearm_sync': (11, 11)}), + 'regRLC_GPU_IOV_SCH_BLOCK': (23348, 1, {'sch_block_id': (0, 3), 'sch_block_ver': (4, 7), 'sch_block_size': (8, 15), 'reserved': (16, 31)}), + 'regRLC_GPU_IOV_CFG_REG1': (23349, 1, {'cmd_type': (0, 3), 'cmd_execute': (4, 4), 'cmd_execute_intr_en': (5, 5), 'reserved': (6, 7), 'fcn_id': (8, 15), 'next_fcn_id': (16, 23), 'reserved1': (24, 31)}), + 'regRLC_GPU_IOV_CFG_REG2': (23350, 1, {'cmd_status': (0, 3), 'reserved': (4, 31)}), + 'regRLC_GPU_IOV_VM_BUSY_STATUS': (23351, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SCH_0': (23352, 1, {'active_functions': (0, 31)}), + 'regRLC_GPU_IOV_SCH_3': (23354, 1, {'time_quanta_def': (0, 31)}), + 'regRLC_GPU_IOV_SCH_1': (23355, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_SCH_2': (23356, 1, {'data': (0, 31)}), + 'regRLC_PACE_INT_FORCE': (23357, 1, {'force_int': (0, 31)}), + 'regRLC_PACE_INT_CLEAR': (23358, 1, {'smu_stretch_pcc_clear': (0, 0), 'smu_pcc_clear': (1, 1)}), + 'regRLC_GPU_IOV_INT_STAT': (23359, 1, {'status': (0, 31)}), + 'regRLC_IH_COOKIE': (23361, 1, {'data': (0, 31)}), + 'regRLC_IH_COOKIE_CNTL': (23362, 1, {'credit': (0, 1), 'reset_counter': (2, 2)}), + 'regRLC_HYP_RLCG_UCODE_CHKSUM': (23363, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_HYP_RLCP_UCODE_CHKSUM': (23364, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_HYP_RLCV_UCODE_CHKSUM': (23365, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_GPU_IOV_F32_CNTL': (23366, 1, {'enable': (0, 0)}), + 'regRLC_GPU_IOV_F32_RESET': (23367, 1, {'reset': (0, 0)}), + 'regRLC_GPU_IOV_UCODE_ADDR': (23368, 1, {'ucode_addr': (0, 11), 'reserved': (12, 31)}), + 'regRLC_GPU_IOV_UCODE_DATA': (23369, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPU_IOV_SMU_RESPONSE': (23370, 1, {'resp': (0, 31)}), + 'regRLC_GPU_IOV_F32_INVALIDATE_CACHE': (23371, 1, {'invalidate_cache': (0, 0)}), + 'regRLC_GPU_IOV_RLC_RESPONSE': (23373, 1, {'resp': (0, 31)}), + 'regRLC_GPU_IOV_INT_DISABLE': (23374, 1, {'disable_int': (0, 31)}), + 'regRLC_GPU_IOV_INT_FORCE': (23375, 1, {'force_int': (0, 31)}), + 'regRLC_GPU_IOV_SCRATCH_ADDR': (23376, 1, {'addr': (0, 15)}), + 'regRLC_GPU_IOV_SCRATCH_DATA': (23377, 1, {'data': (0, 31)}), + 'regRLC_HYP_SEMAPHORE_2': (23378, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_HYP_SEMAPHORE_3': (23379, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_GPM_UCODE_ADDR': (23392, 1, {'ucode_addr': (0, 13), 'reserved': (14, 31)}), + 'regRLC_GPM_UCODE_DATA': (23393, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPM_IRAM_ADDR': (23394, 1, {'addr': (0, 31)}), + 'regRLC_GPM_IRAM_DATA': (23395, 1, {'data': (0, 31)}), + 'regRLC_RLCP_IRAM_ADDR': (23396, 1, {'addr': (0, 31)}), + 'regRLC_RLCP_IRAM_DATA': (23397, 1, {'data': (0, 31)}), + 'regRLC_RLCV_IRAM_ADDR': (23398, 1, {'addr': (0, 31)}), + 'regRLC_RLCV_IRAM_DATA': (23399, 1, {'data': (0, 31)}), + 'regRLC_LX6_DRAM_ADDR': (23400, 1, {'addr': (0, 10)}), + 'regRLC_LX6_DRAM_DATA': (23401, 1, {'data': (0, 31)}), + 'regRLC_LX6_IRAM_ADDR': (23402, 1, {'addr': (0, 11)}), + 'regRLC_LX6_IRAM_DATA': (23403, 1, {'data': (0, 31)}), + 'regRLC_PACE_UCODE_ADDR': (23404, 1, {'ucode_addr': (0, 11), 'reserved': (12, 31)}), + 'regRLC_PACE_UCODE_DATA': (23405, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPM_SCRATCH_ADDR': (23406, 1, {'addr': (0, 15)}), + 'regRLC_GPM_SCRATCH_DATA': (23407, 1, {'data': (0, 31)}), + 'regRLC_SRM_DRAM_ADDR': (23409, 1, {'addr': (0, 12), 'reserved': (13, 31)}), + 'regRLC_SRM_DRAM_DATA': (23410, 1, {'data': (0, 31)}), + 'regRLC_SRM_ARAM_ADDR': (23411, 1, {'addr': (0, 12), 'reserved': (13, 31)}), + 'regRLC_SRM_ARAM_DATA': (23412, 1, {'data': (0, 31)}), + 'regRLC_PACE_SCRATCH_ADDR': (23415, 1, {'addr': (0, 15)}), + 'regRLC_PACE_SCRATCH_DATA': (23416, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_LSB': (23417, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_MSB': (23418, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_SDMA0_STATUS': (23488, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA1_STATUS': (23489, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA2_STATUS': (23490, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA3_STATUS': (23491, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA4_STATUS': (23492, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA5_STATUS': (23493, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA6_STATUS': (23494, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA7_STATUS': (23495, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA0_BUSY_STATUS': (23496, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA1_BUSY_STATUS': (23497, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA2_BUSY_STATUS': (23498, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA3_BUSY_STATUS': (23499, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA4_BUSY_STATUS': (23500, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA5_BUSY_STATUS': (23501, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA6_BUSY_STATUS': (23502, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA7_BUSY_STATUS': (23503, 1, {'vm_busy_status': (0, 31)}), + 'regCP_MEC_DM_INDEX_ADDR': (23554, 1, {'addr': (0, 31)}), + 'regCP_MEC_DM_INDEX_DATA': (23555, 1, {'data': (0, 31)}), + 'regGRBM_SEC_CNTL': (24077, 1, {}), + 'regGRBM_CAM_INDEX': (24080, 1, {'cam_index': (0, 3)}), + 'regGRBM_HYP_CAM_INDEX': (24080, 1, {'cam_index': (0, 3)}), + 'regGRBM_CAM_DATA': (24081, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regGRBM_HYP_CAM_DATA': (24081, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regGRBM_CAM_DATA_UPPER': (24082, 1, {'cam_addr': (0, 1), 'cam_remapaddr': (16, 17)}), + 'regGRBM_HYP_CAM_DATA_UPPER': (24082, 1, {'cam_addr': (0, 1), 'cam_remapaddr': (16, 17)}), + 'regRLC_FWL_FIRST_VIOL_ADDR': (24358, 1, {'viol_addr': (0, 17), 'viol_aperture_id': (18, 29), 'viol_op': (30, 30), 'reserved': (31, 31)}), + 'regRLC_GFX_IMU_DATA_0': (16466, 1, {'data': (0, 31)}), + 'regRLC_GFX_IMU_CMD': (16467, 1, {'cmd': (0, 31)}), +} +gc_11_0_3 = { + 'regSDMA0_CNTL': (28, 0, {'trap_enable': (0, 0), 'sem_wait_int_enable': (2, 2), 'data_swap_enable': (3, 3), 'fence_swap_enable': (4, 4), 'midcmd_preempt_enable': (5, 5), 'pio_done_ack_enable': (6, 6), 'tmz_midcmd_preempt_enable': (8, 8), 'midcmd_expire_enable': (9, 9), 'cp_mes_int_enable': (10, 10), 'page_retry_timeout_int_enable': (11, 11), 'page_null_int_enable': (12, 12), 'page_fault_int_enable': (13, 13), 'ch_perfcnt_enable': (16, 16), 'midcmd_worldswitch_enable': (17, 17), 'drm_restore_enable': (19, 19), 'ctxempty_int_enable': (28, 28), 'frozen_int_enable': (29, 29), 'ib_preempt_int_enable': (30, 30), 'rb_preempt_int_enable': (31, 31)}), + 'regSDMA0_CNTL1': (39, 0, {'wptr_poll_frequency': (2, 15)}), + 'regSDMA0_WATCHDOG_CNTL': (46, 0, {'queue_hang_count': (0, 7), 'cmd_timeout_count': (8, 15)}), + 'regSDMA0_UTCL1_CNTL': (60, 0, {'redo_delay': (0, 4), 'page_wait_delay': (5, 8), 'resp_mode': (9, 10), 'force_invalidation': (14, 14), 'force_invreq_heavy': (15, 15), 'wr_exe_perms_ctrl': (16, 16), 'rd_exe_perms_ctrl': (17, 17), 'invack_delay': (18, 21), 'reql2_credit': (24, 29)}), + 'regSDMA0_UTCL1_PAGE': (63, 0, {'vm_hole': (0, 0), 'req_type': (1, 4), 'tmz_enable': (5, 5), 'use_mtype': (6, 9), 'use_pt_snoop': (10, 10), 'use_io': (11, 11), 'rd_l2_policy': (12, 13), 'wr_l2_policy': (14, 15), 'dma_page_size': (16, 21), 'use_bc': (22, 22), 'addr_is_pa': (23, 23), 'llc_noalloc': (24, 24)}), + 'regSDMA0_RLC_CGCG_CTRL': (92, 0, {'cgcg_int_enable': (1, 1), 'cgcg_idle_hysteresis': (16, 31)}), + 'regSDMA0_QUEUE0_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_poll_enable': (8, 8), 'rb_swap_enable': (9, 9), 'wptr_poll_swap_enable': (10, 10), 'f32_wptr_poll_enable': (11, 11), 'rptr_writeback_enable': (12, 12), 'rptr_writeback_swap_enable': (13, 13), 'rptr_writeback_timer': (16, 20), 'rb_priv': (23, 23), 'rb_vmid': (24, 27)}), + 'regSDMA0_QUEUE0_RB_BASE': (129, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_BASE_HI': (130, 0, {'addr': (0, 23)}), + 'regSDMA0_QUEUE0_RB_RPTR': (131, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_HI': (132, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR': (133, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_HI': (134, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_ADDR_HI': (136, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_ADDR_LO': (137, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_IB_CNTL': (138, 0, {'ib_enable': (0, 0), 'ib_swap_enable': (4, 4), 'switch_inside_ib': (8, 8), 'cmd_vmid': (16, 19), 'ib_priv': (31, 31)}), + 'regSDMA0_QUEUE0_IB_RPTR': (139, 0, {'offset': (2, 21)}), + 'regSDMA0_QUEUE0_IB_OFFSET': (140, 0, {'offset': (2, 21)}), + 'regSDMA0_QUEUE0_IB_BASE_LO': (141, 0, {'addr': (5, 31)}), + 'regSDMA0_QUEUE0_IB_BASE_HI': (142, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_IB_SIZE': (143, 0, {'size': (0, 19)}), + 'regSDMA0_QUEUE0_SKIP_CNTL': (144, 0, {'skip_count': (0, 19)}), + 'regSDMA0_QUEUE0_CONTEXT_STATUS': (145, 0, {'selected': (0, 0), 'use_ib': (1, 1), 'idle': (2, 2), 'expired': (3, 3), 'exception': (4, 6), 'ctxsw_able': (7, 7), 'preempt_disable': (10, 10), 'rptr_wb_idle': (11, 11), 'wptr_update_pending': (12, 12), 'wptr_update_fail_count': (16, 23)}), + 'regSDMA0_QUEUE0_DOORBELL': (146, 0, {'enable': (28, 28), 'captured': (30, 30)}), + 'regSDMA0_QUEUE0_DOORBELL_LOG': (169, 0, {'be_error': (0, 0), 'data': (2, 31)}), + 'regSDMA0_QUEUE0_DOORBELL_OFFSET': (171, 0, {'offset': (2, 27)}), + 'regSDMA0_QUEUE0_CSA_ADDR_LO': (172, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_CSA_ADDR_HI': (173, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_SCHEDULE_CNTL': (174, 0, {'global_id': (0, 1), 'process_id': (2, 4), 'local_id': (6, 7), 'context_quantum': (8, 15)}), + 'regSDMA0_QUEUE0_IB_SUB_REMAIN': (175, 0, {'size': (0, 13)}), + 'regSDMA0_QUEUE0_PREEMPT': (176, 0, {'ib_preempt': (0, 0)}), + 'regSDMA0_QUEUE0_DUMMY_REG': (177, 0, {'dummy': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_HI': (178, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_LO': (179, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_RB_AQL_CNTL': (180, 0, {'aql_enable': (0, 0), 'aql_packet_size': (1, 7), 'packet_step': (8, 15), 'midcmd_preempt_enable': (16, 16), 'midcmd_preempt_data_restore': (17, 17), 'overlap_enable': (18, 18)}), + 'regSDMA0_QUEUE0_MINOR_PTR_UPDATE': (181, 0, {'enable': (0, 0)}), + 'regSDMA0_QUEUE0_RB_PREEMPT': (182, 0, {'preempt_req': (0, 0)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA0': (192, 0, {'data0': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA1': (193, 0, {'data1': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA2': (194, 0, {'data2': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA3': (195, 0, {'data3': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA4': (196, 0, {'data4': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA5': (197, 0, {'data5': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA6': (198, 0, {'data6': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA7': (199, 0, {'data7': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA8': (200, 0, {'data8': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA9': (201, 0, {'data9': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA10': (202, 0, {'data10': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_CNTL': (203, 0, {'data_valid': (0, 0), 'copy_mode': (1, 1), 'split_state': (4, 7), 'allow_preempt': (8, 8)}), + 'regSDMA1_CNTL': (1564, 0, {'trap_enable': (0, 0), 'sem_wait_int_enable': (2, 2), 'data_swap_enable': (3, 3), 'fence_swap_enable': (4, 4), 'midcmd_preempt_enable': (5, 5), 'pio_done_ack_enable': (6, 6), 'tmz_midcmd_preempt_enable': (8, 8), 'midcmd_expire_enable': (9, 9), 'cp_mes_int_enable': (10, 10), 'page_retry_timeout_int_enable': (11, 11), 'page_null_int_enable': (12, 12), 'page_fault_int_enable': (13, 13), 'ch_perfcnt_enable': (16, 16), 'midcmd_worldswitch_enable': (17, 17), 'drm_restore_enable': (19, 19), 'ctxempty_int_enable': (28, 28), 'frozen_int_enable': (29, 29), 'ib_preempt_int_enable': (30, 30), 'rb_preempt_int_enable': (31, 31)}), + 'regSDMA1_CNTL1': (1575, 0, {'wptr_poll_frequency': (2, 15)}), + 'regSDMA1_WATCHDOG_CNTL': (1582, 0, {'queue_hang_count': (0, 7), 'cmd_timeout_count': (8, 15)}), + 'regSDMA1_UTCL1_CNTL': (1596, 0, {'redo_delay': (0, 4), 'page_wait_delay': (5, 8), 'resp_mode': (9, 10), 'force_invalidation': (14, 14), 'force_invreq_heavy': (15, 15), 'wr_exe_perms_ctrl': (16, 16), 'rd_exe_perms_ctrl': (17, 17), 'invack_delay': (18, 21), 'reql2_credit': (24, 29)}), + 'regSDMA1_UTCL1_PAGE': (1599, 0, {'vm_hole': (0, 0), 'req_type': (1, 4), 'tmz_enable': (5, 5), 'use_mtype': (6, 9), 'use_pt_snoop': (10, 10), 'use_io': (11, 11), 'rd_l2_policy': (12, 13), 'wr_l2_policy': (14, 15), 'dma_page_size': (16, 21), 'use_bc': (22, 22), 'addr_is_pa': (23, 23), 'llc_noalloc': (24, 24)}), + 'regSDMA1_RLC_CGCG_CTRL': (1628, 0, {'cgcg_int_enable': (1, 1), 'cgcg_idle_hysteresis': (16, 31)}), + 'regSDMA1_QUEUE0_RB_CNTL': (1664, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_poll_enable': (8, 8), 'rb_swap_enable': (9, 9), 'wptr_poll_swap_enable': (10, 10), 'f32_wptr_poll_enable': (11, 11), 'rptr_writeback_enable': (12, 12), 'rptr_writeback_swap_enable': (13, 13), 'rptr_writeback_timer': (16, 20), 'rb_priv': (23, 23), 'rb_vmid': (24, 27)}), + 'regSDMA1_QUEUE0_RB_BASE': (1665, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_RB_BASE_HI': (1666, 0, {'addr': (0, 23)}), + 'regSDMA1_QUEUE0_RB_RPTR': (1667, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_HI': (1668, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR': (1669, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_HI': (1670, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_ADDR_HI': (1672, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_ADDR_LO': (1673, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_IB_CNTL': (1674, 0, {'ib_enable': (0, 0), 'ib_swap_enable': (4, 4), 'switch_inside_ib': (8, 8), 'cmd_vmid': (16, 19), 'ib_priv': (31, 31)}), + 'regSDMA1_QUEUE0_IB_RPTR': (1675, 0, {'offset': (2, 21)}), + 'regSDMA1_QUEUE0_IB_OFFSET': (1676, 0, {'offset': (2, 21)}), + 'regSDMA1_QUEUE0_IB_BASE_LO': (1677, 0, {'addr': (5, 31)}), + 'regSDMA1_QUEUE0_IB_BASE_HI': (1678, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_IB_SIZE': (1679, 0, {'size': (0, 19)}), + 'regSDMA1_QUEUE0_SKIP_CNTL': (1680, 0, {'skip_count': (0, 19)}), + 'regSDMA1_QUEUE0_CONTEXT_STATUS': (1681, 0, {'selected': (0, 0), 'use_ib': (1, 1), 'idle': (2, 2), 'expired': (3, 3), 'exception': (4, 6), 'ctxsw_able': (7, 7), 'preempt_disable': (10, 10), 'rptr_wb_idle': (11, 11), 'wptr_update_pending': (12, 12), 'wptr_update_fail_count': (16, 23)}), + 'regSDMA1_QUEUE0_DOORBELL': (1682, 0, {'enable': (28, 28), 'captured': (30, 30)}), + 'regSDMA1_QUEUE0_DOORBELL_LOG': (1705, 0, {'be_error': (0, 0), 'data': (2, 31)}), + 'regSDMA1_QUEUE0_DOORBELL_OFFSET': (1707, 0, {'offset': (2, 27)}), + 'regSDMA1_QUEUE0_CSA_ADDR_LO': (1708, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_CSA_ADDR_HI': (1709, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_SCHEDULE_CNTL': (1710, 0, {'global_id': (0, 1), 'process_id': (2, 4), 'local_id': (6, 7), 'context_quantum': (8, 15)}), + 'regSDMA1_QUEUE0_IB_SUB_REMAIN': (1711, 0, {'size': (0, 13)}), + 'regSDMA1_QUEUE0_PREEMPT': (1712, 0, {'ib_preempt': (0, 0)}), + 'regSDMA1_QUEUE0_DUMMY_REG': (1713, 0, {'dummy': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_HI': (1714, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_LO': (1715, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_RB_AQL_CNTL': (1716, 0, {'aql_enable': (0, 0), 'aql_packet_size': (1, 7), 'packet_step': (8, 15), 'midcmd_preempt_enable': (16, 16), 'midcmd_preempt_data_restore': (17, 17), 'overlap_enable': (18, 18)}), + 'regSDMA1_QUEUE0_MINOR_PTR_UPDATE': (1717, 0, {'enable': (0, 0)}), + 'regSDMA1_QUEUE0_RB_PREEMPT': (1718, 0, {'preempt_req': (0, 0)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA0': (1728, 0, {'data0': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA1': (1729, 0, {'data1': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA2': (1730, 0, {'data2': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA3': (1731, 0, {'data3': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA4': (1732, 0, {'data4': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA5': (1733, 0, {'data5': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA6': (1734, 0, {'data6': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA7': (1735, 0, {'data7': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA8': (1736, 0, {'data8': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA9': (1737, 0, {'data9': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA10': (1738, 0, {'data10': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_CNTL': (1739, 0, {'data_valid': (0, 0), 'copy_mode': (1, 1), 'split_state': (4, 7), 'allow_preempt': (8, 8)}), + 'regSDMA0_F32_CNTL': (22682, 1, {'halt': (0, 0), 'dbg_select_bits': (2, 7), 'th0_checksum_clr': (8, 8), 'th0_reset': (9, 9), 'th0_enable': (10, 10), 'th1_checksum_clr': (12, 12), 'th1_reset': (13, 13), 'th1_enable': (14, 14), 'th0_priority': (16, 23), 'th1_priority': (24, 31)}), + 'regSDMA1_F32_CNTL': (22714, 1, {'halt': (0, 0), 'dbg_select_bits': (2, 7), 'th0_checksum_clr': (8, 8), 'th0_reset': (9, 9), 'th0_enable': (10, 10), 'th1_checksum_clr': (12, 12), 'th1_reset': (13, 13), 'th1_enable': (14, 14), 'th0_priority': (16, 23), 'th1_priority': (24, 31)}), + 'regGRBM_CNTL': (3488, 0, {'read_timeout': (0, 7), 'report_last_rderr': (31, 31)}), + 'regGRBM_SKEW_CNTL': (3489, 0, {'skew_top_threshold': (0, 5), 'skew_count': (6, 11)}), + 'regGRBM_STATUS2': (3490, 0, {'me0pipe1_cmdfifo_avail': (0, 3), 'me0pipe1_cf_rq_pending': (4, 4), 'me0pipe1_pf_rq_pending': (5, 5), 'me1pipe0_rq_pending': (6, 6), 'me1pipe1_rq_pending': (7, 7), 'me1pipe2_rq_pending': (8, 8), 'me1pipe3_rq_pending': (9, 9), 'rlc_rq_pending': (14, 14), 'utcl2_busy': (15, 15), 'ea_busy': (16, 16), 'rmi_busy': (17, 17), 'utcl2_rq_pending': (18, 18), 'sdma_sch_rq_pending': (19, 19), 'ea_link_busy': (20, 20), 'sdma_busy': (21, 21), 'sdma0_rq_pending': (22, 22), 'sdma1_rq_pending': (23, 23), 'rlc_busy': (26, 26), 'tcp_busy': (27, 27), 'cpf_busy': (28, 28), 'cpc_busy': (29, 29), 'cpg_busy': (30, 30), 'cpaxi_busy': (31, 31)}), + 'regGRBM_PWR_CNTL': (3491, 0, {'all_req_type': (0, 1), 'gfx_req_type': (2, 3), 'all_rsp_type': (4, 5), 'gfx_rsp_type': (6, 7), 'gfx_req_en': (14, 14), 'all_req_en': (15, 15)}), + 'regGRBM_STATUS': (3492, 0, {'me0pipe0_cmdfifo_avail': (0, 3), 'rsmu_rq_pending': (5, 5), 'sdma_rq_pending': (6, 6), 'me0pipe0_cf_rq_pending': (7, 7), 'me0pipe0_pf_rq_pending': (8, 8), 'gds_dma_rq_pending': (9, 9), 'db_clean': (12, 12), 'cb_clean': (13, 13), 'ta_busy': (14, 14), 'gds_busy': (15, 15), 'ge_busy_no_dma': (16, 16), 'sx_busy': (20, 20), 'ge_busy': (21, 21), 'spi_busy': (22, 22), 'bci_busy': (23, 23), 'sc_busy': (24, 24), 'pa_busy': (25, 25), 'db_busy': (26, 26), 'any_active': (27, 27), 'cp_coherency_busy': (28, 28), 'cp_busy': (29, 29), 'cb_busy': (30, 30), 'gui_active': (31, 31)}), + 'regGRBM_STATUS_SE0': (3493, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE1': (3494, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS3': (3495, 0, {'grbm_rlc_intr_credit_pending': (5, 5), 'grbm_cpf_intr_credit_pending': (7, 7), 'mespipe0_rq_pending': (8, 8), 'mespipe1_rq_pending': (9, 9), 'ph_busy': (13, 13), 'ch_busy': (14, 14), 'gl2cc_busy': (15, 15), 'gl1cc_busy': (16, 16), 'sedc_busy': (25, 25), 'pc_busy': (26, 26), 'gl1h_busy': (27, 27), 'gus_link_busy': (28, 28), 'gus_busy': (29, 29), 'utcl1_busy': (30, 30), 'pmm_busy': (31, 31)}), + 'regGRBM_SOFT_RESET': (3496, 0, {'soft_reset_cp': (0, 0), 'soft_reset_rlc': (2, 2), 'soft_reset_utcl2': (15, 15), 'soft_reset_gfx': (16, 16), 'soft_reset_cpf': (17, 17), 'soft_reset_cpc': (18, 18), 'soft_reset_cpg': (19, 19), 'soft_reset_cac': (20, 20), 'soft_reset_cpaxi': (21, 21), 'soft_reset_ea': (22, 22), 'soft_reset_sdma0': (23, 23), 'soft_reset_sdma1': (24, 24)}), + 'regGRBM_GFX_CLKEN_CNTL': (3500, 0, {'prefix_delay_cnt': (0, 3), 'post_delay_cnt': (8, 12)}), + 'regGRBM_WAIT_IDLE_CLOCKS': (3501, 0, {'wait_idle_clocks': (0, 7)}), + 'regGRBM_STATUS_SE2': (3502, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'sedc_busy': (8, 8), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_READ_ERROR': (3510, 0, {'read_address': (2, 19), 'read_pipeid': (20, 21), 'read_meid': (22, 23), 'read_error': (31, 31)}), + 'regGRBM_READ_ERROR2': (3511, 0, {'read_requester_mespipe0': (9, 9), 'read_requester_mespipe1': (10, 10), 'read_requester_mespipe2': (11, 11), 'read_requester_mespipe3': (12, 12), 'read_requester_sdma0': (13, 13), 'read_requester_sdma1': (14, 14), 'read_requester_rsmu': (17, 17), 'read_requester_rlc': (18, 18), 'read_requester_gds_dma': (19, 19), 'read_requester_me0pipe0_cf': (20, 20), 'read_requester_me0pipe0_pf': (21, 21), 'read_requester_me0pipe1_cf': (22, 22), 'read_requester_me0pipe1_pf': (23, 23), 'read_requester_me1pipe0': (24, 24), 'read_requester_me1pipe1': (25, 25), 'read_requester_me1pipe2': (26, 26), 'read_requester_me1pipe3': (27, 27), 'read_requester_me2pipe0': (28, 28), 'read_requester_me2pipe1': (29, 29), 'read_requester_me2pipe2': (30, 30), 'read_requester_me2pipe3': (31, 31)}), + 'regGRBM_INT_CNTL': (3512, 0, {'rderr_int_enable': (0, 0), 'gui_idle_int_enable': (19, 19)}), + 'regGRBM_TRAP_OP': (3513, 0, {'rw': (0, 0)}), + 'regGRBM_TRAP_ADDR': (3514, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_ADDR_MSK': (3515, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_WD': (3516, 0, {'data': (0, 31)}), + 'regGRBM_TRAP_WD_MSK': (3517, 0, {'data': (0, 31)}), + 'regGRBM_DSM_BYPASS': (3518, 0, {'bypass_bits': (0, 1), 'bypass_en': (2, 2)}), + 'regGRBM_WRITE_ERROR': (3519, 0, {'write_requester_rlc': (0, 0), 'write_requester_rsmu': (1, 1), 'write_ssrcid': (2, 5), 'write_vfid': (8, 11), 'write_vf': (12, 12), 'write_vmid': (13, 16), 'tmz': (17, 17), 'cp_secure_wr_illegal': (18, 18), 'write_pipeid': (20, 21), 'write_meid': (22, 23), 'write_error': (31, 31)}), + 'regGRBM_CHIP_REVISION': (3521, 0, {'chip_revision': (0, 7)}), + 'regGRBM_RSMU_CFG': (3523, 0, {'aperture_id': (0, 11), 'qos': (12, 15), 'posted_wr': (16, 16), 'debug_mask': (17, 17)}), + 'regGRBM_IH_CREDIT': (3524, 0, {'credit_value': (0, 1), 'ih_client_id': (16, 23)}), + 'regGRBM_PWR_CNTL2': (3525, 0, {'pwr_request_halt': (16, 16), 'pwr_gfx3d_request_halt': (20, 20)}), + 'regGRBM_UTCL2_INVAL_RANGE_START': (3526, 0, {'data': (0, 17)}), + 'regGRBM_UTCL2_INVAL_RANGE_END': (3527, 0, {'data': (0, 17)}), + 'regGRBM_RSMU_READ_ERROR': (3528, 0, {'rsmu_read_address': (2, 19), 'rsmu_read_vf': (20, 20), 'rsmu_read_vfid': (21, 26), 'rsmu_read_error_type': (27, 27), 'rsmu_read_error': (31, 31)}), + 'regGRBM_INVALID_PIPE': (3529, 0, {'addr': (2, 19), 'pipeid': (20, 21), 'meid': (22, 23), 'queueid': (24, 26), 'ssrcid': (27, 30), 'invalid_pipe': (31, 31)}), + 'regGRBM_FENCE_RANGE0': (3530, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_FENCE_RANGE1': (3531, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_SCRATCH_REG0': (3552, 0, {'scratch_reg0': (0, 31)}), + 'regGRBM_SCRATCH_REG1': (3553, 0, {'scratch_reg1': (0, 31)}), + 'regGRBM_SCRATCH_REG2': (3554, 0, {'scratch_reg2': (0, 31)}), + 'regGRBM_SCRATCH_REG3': (3555, 0, {'scratch_reg3': (0, 31)}), + 'regGRBM_SCRATCH_REG4': (3556, 0, {'scratch_reg4': (0, 31)}), + 'regGRBM_SCRATCH_REG5': (3557, 0, {'scratch_reg5': (0, 31)}), + 'regGRBM_SCRATCH_REG6': (3558, 0, {'scratch_reg6': (0, 31)}), + 'regGRBM_SCRATCH_REG7': (3559, 0, {'scratch_reg7': (0, 31)}), + 'regCP_MEC_ME1_HEADER_DUMP': (3630, 0, {'header_dump': (0, 31)}), + 'regCP_MEC_ME2_HEADER_DUMP': (3631, 0, {'header_dump': (0, 31)}), + 'regCP_STAT': (3904, 0, {'roq_db_busy': (5, 5), 'roq_ce_db_busy': (6, 6), 'roq_ring_busy': (9, 9), 'roq_indirect1_busy': (10, 10), 'roq_indirect2_busy': (11, 11), 'roq_state_busy': (12, 12), 'dc_busy': (13, 13), 'utcl2iu_busy': (14, 14), 'pfp_busy': (15, 15), 'meq_busy': (16, 16), 'me_busy': (17, 17), 'query_busy': (18, 18), 'semaphore_busy': (19, 19), 'interrupt_busy': (20, 20), 'surface_sync_busy': (21, 21), 'dma_busy': (22, 22), 'rciu_busy': (23, 23), 'scratch_ram_busy': (24, 24), 'gcriu_busy': (25, 25), 'ce_busy': (26, 26), 'tciu_busy': (27, 27), 'roq_ce_ring_busy': (28, 28), 'roq_ce_indirect1_busy': (29, 29), 'roq_ce_indirect2_busy': (30, 30), 'cp_busy': (31, 31)}), + 'regCP_MEC1_INSTR_PNTR': (3912, 0, {'instr_pntr': (0, 15)}), + 'regCP_MEC2_INSTR_PNTR': (3913, 0, {'instr_pntr': (0, 15)}), + 'regCP_RB_WPTR_POLL_CNTL': (3938, 0, {'poll_frequency': (0, 15), 'idle_poll_count': (16, 31)}), + 'regGB_ADDR_CONFIG': (5086, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 20), 'num_rb_per_se': (26, 27)}), + 'regGB_ADDR_CONFIG_READ': (5090, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 20), 'num_rb_per_se': (26, 27)}), + 'regGCMC_VM_NB_MMIOBASE': (5536, 0, {'mmiobase': (0, 31)}), + 'regGCMC_VM_NB_MMIOLIMIT': (5537, 0, {'mmiolimit': (0, 31)}), + 'regGCMC_VM_NB_PCI_CTRL': (5538, 0, {'mmioenable': (23, 23)}), + 'regGCMC_VM_NB_PCI_ARB': (5539, 0, {'vga_hole': (3, 3)}), + 'regGCMC_VM_NB_TOP_OF_DRAM_SLOT1': (5540, 0, {'top_of_dram': (23, 31)}), + 'regGCMC_VM_NB_LOWER_TOP_OF_DRAM2': (5541, 0, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regGCMC_VM_NB_UPPER_TOP_OF_DRAM2': (5542, 0, {'upper_tom2': (0, 11)}), + 'regGCMC_VM_FB_OFFSET': (5543, 0, {'fb_offset': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (5544, 0, {'physical_page_number_lsb': (0, 31)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (5545, 0, {'physical_page_number_msb': (0, 3)}), + 'regGCMC_VM_STEERING': (5546, 0, {'default_steering': (0, 1)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_START': (5549, 0, {'address': (0, 19)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_END': (5550, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_SYSMEM_ADDRESS_START': (5551, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_SYSMEM_ADDRESS_END': (5552, 0, {'address': (0, 19)}), + 'regGCMC_VM_APT_CNTL': (5553, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_START': (5554, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_END': (5555, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (5556, 0, {'lock': (0, 0)}), + 'regGCMC_VM_FB_NOALLOC_CNTL': (5560, 0, {'local_fb_noalloc_nopte': (0, 0), 'remote_fb_noalloc_nopte': (1, 1), 'fb_noalloc_walker_fetch': (2, 2), 'router_atcl2_noalloc': (3, 3), 'router_gpa_mode2_noalloc': (4, 4), 'router_gpa_mode3_noalloc': (5, 5)}), + 'regGCVM_L2_CNTL': (5568, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regGCVM_L2_CNTL2': (5569, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regGCVM_L2_CNTL3': (5570, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regGCVM_L2_STATUS': (5571, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regGCVM_DUMMY_PAGE_FAULT_CNTL': (5572, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_LO32': (5573, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_HI32': (5574, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regGCVM_INVALIDATE_CNTL': (5575, 0, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL': (5576, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL2': (5577, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL3': (5578, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL4': (5579, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_STATUS': (5580, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'prt': (29, 29), 'fed': (30, 30)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_LO32': (5581, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_HI32': (5582, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (5583, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (5584, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (5586, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (5587, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (5588, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (5589, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (5590, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (5591, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regGCVM_L2_CNTL4': (5592, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regGCVM_L2_MM_GROUP_RT_CLASSES': (5593, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID': (5594, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID2': (5595, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regGCVM_L2_CACHE_PARITY_CNTL': (5596, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regGCVM_L2_ICG_CTRL': (5597, 0, {'off_hysteresis': (0, 3), 'dynamic_clock_override': (4, 4), 'static_clock_override': (5, 5), 'aon_clock_override': (6, 6), 'perfmon_clock_override': (7, 7)}), + 'regGCVM_L2_CNTL5': (5598, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'utcl2_atc_req_fgcg_off': (16, 16)}), + 'regGCVM_L2_GCR_CNTL': (5599, 0, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regGCVML2_WALKER_MACRO_THROTTLE_TIME': (5600, 0, {'time': (0, 23)}), + 'regGCVML2_WALKER_MACRO_THROTTLE_FETCH_LIMIT': (5601, 0, {'limit': (1, 15)}), + 'regGCVML2_WALKER_MICRO_THROTTLE_TIME': (5602, 0, {'time': (0, 23)}), + 'regGCVML2_WALKER_MICRO_THROTTLE_FETCH_LIMIT': (5603, 0, {'limit': (1, 15)}), + 'regGCVM_L2_CGTT_BUSY_CTRL': (5604, 0, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regGCVM_L2_PTE_CACHE_DUMP_CNTL': (5605, 0, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regGCVM_L2_PTE_CACHE_DUMP_READ': (5606, 0, {'data': (0, 31)}), + 'regGCVM_L2_BANK_SELECT_MASKS': (5609, 0, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regGCVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (5613, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regGCVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (5614, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regGCMC_VM_FB_LOCATION_BASE': (5768, 0, {'fb_base': (0, 23)}), + 'regGCMC_VM_FB_LOCATION_TOP': (5769, 0, {'fb_top': (0, 23)}), + 'regGCMC_VM_AGP_TOP': (5770, 0, {'agp_top': (0, 23)}), + 'regGCMC_VM_AGP_BOT': (5771, 0, {'agp_bot': (0, 23)}), + 'regGCMC_VM_AGP_BASE': (5772, 0, {'agp_base': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_LOW_ADDR': (5773, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (5774, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_MX_L1_TLB_CNTL': (5775, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 13)}), + 'regGCVM_CONTEXT0_CNTL': (5784, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT1_CNTL': (5785, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT2_CNTL': (5786, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT3_CNTL': (5787, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT4_CNTL': (5788, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT5_CNTL': (5789, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT6_CNTL': (5790, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT7_CNTL': (5791, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT8_CNTL': (5792, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT9_CNTL': (5793, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT10_CNTL': (5794, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT11_CNTL': (5795, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT12_CNTL': (5796, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT13_CNTL': (5797, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT14_CNTL': (5798, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXT15_CNTL': (5799, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regGCVM_CONTEXTS_DISABLE': (5800, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regGCVM_INVALIDATE_ENG0_SEM': (5801, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG1_SEM': (5802, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG2_SEM': (5803, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG3_SEM': (5804, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG4_SEM': (5805, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG5_SEM': (5806, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG6_SEM': (5807, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG7_SEM': (5808, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG8_SEM': (5809, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG9_SEM': (5810, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG10_SEM': (5811, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG11_SEM': (5812, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG12_SEM': (5813, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG13_SEM': (5814, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG14_SEM': (5815, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG15_SEM': (5816, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG16_SEM': (5817, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG17_SEM': (5818, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG0_REQ': (5819, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG1_REQ': (5820, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG2_REQ': (5821, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG3_REQ': (5822, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG4_REQ': (5823, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG5_REQ': (5824, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG6_REQ': (5825, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG7_REQ': (5826, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG8_REQ': (5827, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG9_REQ': (5828, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG10_REQ': (5829, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG11_REQ': (5830, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG12_REQ': (5831, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG13_REQ': (5832, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG14_REQ': (5833, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG15_REQ': (5834, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG16_REQ': (5835, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG17_REQ': (5836, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG0_ACK': (5837, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG1_ACK': (5838, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG2_ACK': (5839, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG3_ACK': (5840, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG4_ACK': (5841, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG5_ACK': (5842, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG6_ACK': (5843, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG7_ACK': (5844, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG8_ACK': (5845, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG9_ACK': (5846, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG10_ACK': (5847, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG11_ACK': (5848, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG12_ACK': (5849, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG13_ACK': (5850, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG14_ACK': (5851, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG15_ACK': (5852, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG16_ACK': (5853, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG17_ACK': (5854, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (5855, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (5856, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (5857, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (5858, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (5859, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (5860, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (5861, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (5862, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (5863, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (5864, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (5865, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (5866, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (5867, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (5868, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (5869, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (5870, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (5871, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (5872, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (5873, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (5874, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (5875, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (5876, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (5877, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (5878, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (5879, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (5880, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (5881, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (5882, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (5883, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (5884, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (5885, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (5886, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (5887, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (5888, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (5889, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (5890, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (5891, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (5892, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (5893, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (5894, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (5895, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (5896, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (5897, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (5898, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (5899, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (5900, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (5901, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (5902, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (5903, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (5904, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (5905, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (5906, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (5907, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (5908, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (5909, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (5910, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (5911, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (5912, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (5913, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (5914, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (5915, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (5916, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (5917, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (5918, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (5919, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (5920, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (5921, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (5922, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (5923, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (5924, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (5925, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (5926, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (5927, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (5928, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (5929, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (5930, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (5931, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (5932, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (5933, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (5934, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (5935, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (5936, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (5937, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (5938, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (5939, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (5940, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (5941, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (5942, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (5943, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (5944, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (5945, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (5946, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (5947, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (5948, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (5949, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (5950, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (5951, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (5952, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (5953, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (5954, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (5955, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (5956, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (5957, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (5958, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (5959, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (5960, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (5961, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (5962, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (5963, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (5964, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (5965, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (5966, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (5967, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (5968, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (5969, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (5970, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (5971, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (5972, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (5973, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (5974, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (5975, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (5976, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (5977, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (5978, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (5979, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (5980, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (5981, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (5982, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (5983, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (5984, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (5985, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (5986, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5987, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5988, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5989, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5990, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5991, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5992, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5993, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5994, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5995, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5996, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5997, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5998, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5999, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (6000, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (6001, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (6002, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (6003, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVML2_PERFCOUNTER2_0_LO': (13536, 1, {'perfcounter_lo': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_1_LO': (13537, 1, {'perfcounter_lo': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_0_HI': (13538, 1, {'perfcounter_hi': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_1_HI': (13539, 1, {'perfcounter_hi': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_LO': (13540, 1, {'counter_lo': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_HI': (13541, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regGCVML2_PERFCOUNTER2_0_SELECT': (15648, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_1_SELECT': (15649, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_0_SELECT1': (15650, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_1_SELECT1': (15651, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_0_MODE': (15652, 1, {'compare_mode0': (0, 1), 'compare_mode1': (2, 3), 'compare_mode2': (4, 5), 'compare_mode3': (6, 7), 'compare_value0': (8, 11), 'compare_value1': (12, 15), 'compare_value2': (16, 19), 'compare_value3': (20, 23)}), + 'regGCVML2_PERFCOUNTER2_1_MODE': (15653, 1, {'compare_mode0': (0, 1), 'compare_mode1': (2, 3), 'compare_mode2': (4, 5), 'compare_mode3': (6, 7), 'compare_value0': (8, 11), 'compare_value1': (12, 15), 'compare_value2': (16, 19), 'compare_value3': (20, 23)}), + 'regGCMC_VM_L2_PERFCOUNTER0_CFG': (15664, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER1_CFG': (15665, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER2_CFG': (15666, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER3_CFG': (15667, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER4_CFG': (15668, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER5_CFG': (15669, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER6_CFG': (15670, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER7_CFG': (15671, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (15672, 1, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regRLC_RLCS_FED_STATUS_0': (20223, 1, {'rlc_fed_err': (0, 0), 'utcl2_fed_err': (1, 1), 'ge_fed_err': (2, 2), 'cpc_fed_err': (3, 3), 'cpf_fed_err': (4, 4), 'cpg_fed_err': (5, 5), 'sdma0_fed_err': (6, 6), 'sdma1_fed_err': (7, 7)}), + 'regRLC_RLCS_FED_STATUS_1': (20224, 1, {'gl2c0_fed_err': (0, 0), 'gl2c1_fed_err': (1, 1), 'gl2c2_fed_err': (2, 2), 'gl2c3_fed_err': (3, 3), 'gl2c4_fed_err': (4, 4), 'gl2c5_fed_err': (5, 5), 'gl2c6_fed_err': (6, 6), 'gl2c7_fed_err': (7, 7), 'gl2c8_fed_err': (8, 8), 'gl2c9_fed_err': (9, 9), 'gl2c10_fed_err': (10, 10), 'gl2c11_fed_err': (11, 11), 'gl2c12_fed_err': (12, 12), 'gl2c13_fed_err': (13, 13), 'gl2c14_fed_err': (14, 14), 'gl2c15_fed_err': (15, 15)}), + 'regGCVM_IOMMU_GPU_HOST_TRANSLATION_ENABLE': (24131, 1, {'gpu_host_translation_enable': (0, 0)}), + 'regGCVM_IOMMU_CONTROL_REGISTER': (24132, 1, {'iommuen': (0, 0)}), + 'regGCVM_IOMMU_PERFORMANCE_OPTIMIZATION_CONTROL_REGISTER': (24133, 1, {'perfopten': (13, 13)}), + 'regGCVM_IOMMU_MMIO_CNTRL_1': (24134, 1, {'marc_en': (8, 8)}), + 'regGCMC_VM_MARC_BASE_LO_0': (24135, 1, {'marc_base_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_1': (24136, 1, {'marc_base_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_2': (24137, 1, {'marc_base_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_3': (24138, 1, {'marc_base_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_4': (24139, 1, {'marc_base_lo_4': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_5': (24140, 1, {'marc_base_lo_5': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_6': (24141, 1, {'marc_base_lo_6': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_7': (24142, 1, {'marc_base_lo_7': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_8': (24143, 1, {'marc_base_lo_8': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_9': (24144, 1, {'marc_base_lo_9': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_10': (24145, 1, {'marc_base_lo_10': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_11': (24146, 1, {'marc_base_lo_11': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_12': (24147, 1, {'marc_base_lo_12': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_13': (24148, 1, {'marc_base_lo_13': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_14': (24149, 1, {'marc_base_lo_14': (12, 31)}), + 'regGCMC_VM_MARC_BASE_LO_15': (24150, 1, {'marc_base_lo_15': (12, 31)}), + 'regGCMC_VM_MARC_BASE_HI_0': (24151, 1, {'marc_base_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_1': (24152, 1, {'marc_base_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_2': (24153, 1, {'marc_base_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_3': (24154, 1, {'marc_base_hi_3': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_4': (24155, 1, {'marc_base_hi_4': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_5': (24156, 1, {'marc_base_hi_5': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_6': (24157, 1, {'marc_base_hi_6': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_7': (24158, 1, {'marc_base_hi_7': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_8': (24159, 1, {'marc_base_hi_8': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_9': (24160, 1, {'marc_base_hi_9': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_10': (24161, 1, {'marc_base_hi_10': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_11': (24162, 1, {'marc_base_hi_11': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_12': (24163, 1, {'marc_base_hi_12': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_13': (24164, 1, {'marc_base_hi_13': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_14': (24165, 1, {'marc_base_hi_14': (0, 19)}), + 'regGCMC_VM_MARC_BASE_HI_15': (24166, 1, {'marc_base_hi_15': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_LO_0': (24167, 1, {'marc_enable_0': (0, 0), 'marc_readonly_0': (1, 1), 'marc_reloc_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_1': (24168, 1, {'marc_enable_1': (0, 0), 'marc_readonly_1': (1, 1), 'marc_reloc_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_2': (24169, 1, {'marc_enable_2': (0, 0), 'marc_readonly_2': (1, 1), 'marc_reloc_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_3': (24170, 1, {'marc_enable_3': (0, 0), 'marc_readonly_3': (1, 1), 'marc_reloc_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_4': (24171, 1, {'marc_enable_4': (0, 0), 'marc_readonly_4': (1, 1), 'marc_reloc_lo_4': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_5': (24172, 1, {'marc_enable_5': (0, 0), 'marc_readonly_5': (1, 1), 'marc_reloc_lo_5': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_6': (24173, 1, {'marc_enable_6': (0, 0), 'marc_readonly_6': (1, 1), 'marc_reloc_lo_6': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_7': (24174, 1, {'marc_enable_7': (0, 0), 'marc_readonly_7': (1, 1), 'marc_reloc_lo_7': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_8': (24175, 1, {'marc_enable_8': (0, 0), 'marc_readonly_8': (1, 1), 'marc_reloc_lo_8': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_9': (24176, 1, {'marc_enable_9': (0, 0), 'marc_readonly_9': (1, 1), 'marc_reloc_lo_9': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_10': (24177, 1, {'marc_enable_10': (0, 0), 'marc_readonly_10': (1, 1), 'marc_reloc_lo_10': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_11': (24178, 1, {'marc_enable_11': (0, 0), 'marc_readonly_11': (1, 1), 'marc_reloc_lo_11': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_12': (24179, 1, {'marc_enable_12': (0, 0), 'marc_readonly_12': (1, 1), 'marc_reloc_lo_12': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_13': (24180, 1, {'marc_enable_13': (0, 0), 'marc_readonly_13': (1, 1), 'marc_reloc_lo_13': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_14': (24181, 1, {'marc_enable_14': (0, 0), 'marc_readonly_14': (1, 1), 'marc_reloc_lo_14': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_LO_15': (24182, 1, {'marc_enable_15': (0, 0), 'marc_readonly_15': (1, 1), 'marc_reloc_lo_15': (12, 31)}), + 'regGCMC_VM_MARC_RELOC_HI_0': (24183, 1, {'marc_reloc_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_1': (24184, 1, {'marc_reloc_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_2': (24185, 1, {'marc_reloc_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_3': (24186, 1, {'marc_reloc_hi_3': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_4': (24187, 1, {'marc_reloc_hi_4': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_5': (24188, 1, {'marc_reloc_hi_5': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_6': (24189, 1, {'marc_reloc_hi_6': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_7': (24190, 1, {'marc_reloc_hi_7': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_8': (24191, 1, {'marc_reloc_hi_8': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_9': (24192, 1, {'marc_reloc_hi_9': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_10': (24193, 1, {'marc_reloc_hi_10': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_11': (24194, 1, {'marc_reloc_hi_11': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_12': (24195, 1, {'marc_reloc_hi_12': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_13': (24196, 1, {'marc_reloc_hi_13': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_14': (24197, 1, {'marc_reloc_hi_14': (0, 19)}), + 'regGCMC_VM_MARC_RELOC_HI_15': (24198, 1, {'marc_reloc_hi_15': (0, 19)}), + 'regGCMC_VM_MARC_LEN_LO_0': (24199, 1, {'marc_len_lo_0': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_1': (24200, 1, {'marc_len_lo_1': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_2': (24201, 1, {'marc_len_lo_2': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_3': (24202, 1, {'marc_len_lo_3': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_4': (24203, 1, {'marc_len_lo_4': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_5': (24204, 1, {'marc_len_lo_5': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_6': (24205, 1, {'marc_len_lo_6': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_7': (24206, 1, {'marc_len_lo_7': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_8': (24207, 1, {'marc_len_lo_8': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_9': (24208, 1, {'marc_len_lo_9': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_10': (24209, 1, {'marc_len_lo_10': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_11': (24210, 1, {'marc_len_lo_11': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_12': (24211, 1, {'marc_len_lo_12': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_13': (24212, 1, {'marc_len_lo_13': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_14': (24213, 1, {'marc_len_lo_14': (12, 31)}), + 'regGCMC_VM_MARC_LEN_LO_15': (24214, 1, {'marc_len_lo_15': (12, 31)}), + 'regGCMC_VM_MARC_LEN_HI_0': (24215, 1, {'marc_len_hi_0': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_1': (24216, 1, {'marc_len_hi_1': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_2': (24217, 1, {'marc_len_hi_2': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_3': (24218, 1, {'marc_len_hi_3': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_4': (24219, 1, {'marc_len_hi_4': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_5': (24220, 1, {'marc_len_hi_5': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_6': (24221, 1, {'marc_len_hi_6': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_7': (24222, 1, {'marc_len_hi_7': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_8': (24223, 1, {'marc_len_hi_8': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_9': (24224, 1, {'marc_len_hi_9': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_10': (24225, 1, {'marc_len_hi_10': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_11': (24226, 1, {'marc_len_hi_11': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_12': (24227, 1, {'marc_len_hi_12': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_13': (24228, 1, {'marc_len_hi_13': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_14': (24229, 1, {'marc_len_hi_14': (0, 19)}), + 'regGCMC_VM_MARC_LEN_HI_15': (24230, 1, {'marc_len_hi_15': (0, 19)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_0': (24231, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_1': (24232, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_2': (24233, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_3': (24234, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_4': (24235, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_5': (24236, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_6': (24237, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_7': (24238, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_8': (24239, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_9': (24240, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_10': (24241, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_11': (24242, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_12': (24243, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_13': (24244, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_14': (24245, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regGCMC_VM_MARC_PFVF_MAPPING_15': (24246, 1, {'enable_vfs': (0, 15), 'enable_pf': (16, 16)}), + 'regCOMPUTE_DISPATCH_INITIATOR': (7072, 0, {'compute_shader_en': (0, 0), 'partial_tg_en': (1, 1), 'force_start_at_000': (2, 2), 'ordered_append_enbl': (3, 3), 'ordered_append_mode': (4, 4), 'use_thread_dimensions': (5, 5), 'order_mode': (6, 6), 'scalar_l1_inv_vol': (10, 10), 'vector_l1_inv_vol': (11, 11), 'reserved': (12, 12), 'tunnel_enable': (13, 13), 'restore': (14, 14), 'cs_w32_en': (15, 15), 'amp_shader_en': (16, 16), 'disable_disp_prempt_en': (17, 17)}), + 'regCOMPUTE_DIM_X': (7073, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Y': (7074, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Z': (7075, 0, {'size': (0, 31)}), + 'regCOMPUTE_START_X': (7076, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Y': (7077, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Z': (7078, 0, {'start': (0, 31)}), + 'regCOMPUTE_NUM_THREAD_X': (7079, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Y': (7080, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Z': (7081, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_PIPELINESTAT_ENABLE': (7082, 0, {'pipelinestat_enable': (0, 0)}), + 'regCOMPUTE_PERFCOUNT_ENABLE': (7083, 0, {'perfcount_enable': (0, 0)}), + 'regCOMPUTE_PGM_LO': (7084, 0, {'data': (0, 31)}), + 'regCOMPUTE_PGM_HI': (7085, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_LO': (7086, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_HI': (7087, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_LO': (7088, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_HI': (7089, 0, {'data': (0, 7)}), + 'regCOMPUTE_PGM_RSRC1': (7090, 0, {'vgprs': (0, 5), 'sgprs': (6, 9), 'priority': (10, 11), 'float_mode': (12, 19), 'priv': (20, 20), 'dx10_clamp': (21, 21), 'debug_mode': (22, 22), 'ieee_mode': (23, 23), 'bulky': (24, 24), 'cdbg_user': (25, 25), 'fp16_ovfl': (26, 26), 'wgp_mode': (29, 29), 'mem_ordered': (30, 30), 'fwd_progress': (31, 31)}), + 'regCOMPUTE_PGM_RSRC2': (7091, 0, {'scratch_en': (0, 0), 'user_sgpr': (1, 5), 'trap_present': (6, 6), 'tgid_x_en': (7, 7), 'tgid_y_en': (8, 8), 'tgid_z_en': (9, 9), 'tg_size_en': (10, 10), 'tidig_comp_cnt': (11, 12), 'excp_en_msb': (13, 14), 'lds_size': (15, 23), 'excp_en': (24, 30)}), + 'regCOMPUTE_VMID': (7092, 0, {'data': (0, 3)}), + 'regCOMPUTE_RESOURCE_LIMITS': (7093, 0, {'waves_per_sh': (0, 9), 'tg_per_cu': (12, 15), 'lock_threshold': (16, 21), 'simd_dest_cntl': (22, 22), 'force_simd_dist': (23, 23), 'cu_group_count': (24, 26)}), + 'regCOMPUTE_DESTINATION_EN_SE0': (7094, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE0': (7094, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DESTINATION_EN_SE1': (7095, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE1': (7095, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_TMPRING_SIZE': (7096, 0, {'waves': (0, 11), 'wavesize': (12, 26)}), + 'regCOMPUTE_DESTINATION_EN_SE2': (7097, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE2': (7097, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DESTINATION_EN_SE3': (7098, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE3': (7098, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_RESTART_X': (7099, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Y': (7100, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Z': (7101, 0, {'restart': (0, 31)}), + 'regCOMPUTE_THREAD_TRACE_ENABLE': (7102, 0, {'thread_trace_enable': (0, 0)}), + 'regCOMPUTE_MISC_RESERVED': (7103, 0, {'send_seid': (0, 2), 'reserved3': (3, 3), 'reserved4': (4, 4), 'wave_id_base': (5, 16)}), + 'regCOMPUTE_DISPATCH_ID': (7104, 0, {'dispatch_id': (0, 31)}), + 'regCOMPUTE_THREADGROUP_ID': (7105, 0, {'threadgroup_id': (0, 31)}), + 'regCOMPUTE_REQ_CTRL': (7106, 0, {'soft_grouping_en': (0, 0), 'number_of_requests_per_cu': (1, 4), 'soft_grouping_allocation_timeout': (5, 8), 'hard_lock_hysteresis': (9, 9), 'hard_lock_low_threshold': (10, 14), 'producer_request_lockout': (15, 15), 'global_scanning_en': (16, 16), 'allocation_rate_throttling_threshold': (17, 19), 'dedicated_preallocation_buffer_limit': (20, 26)}), + 'regCOMPUTE_USER_ACCUM_0': (7108, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_1': (7109, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_2': (7110, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_3': (7111, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_PGM_RSRC3': (7112, 0, {'shared_vgpr_cnt': (0, 3), 'inst_pref_size': (4, 9), 'trap_on_start': (10, 10), 'trap_on_end': (11, 11), 'image_op': (31, 31)}), + 'regCOMPUTE_DDID_INDEX': (7113, 0, {'index': (0, 10)}), + 'regCOMPUTE_SHADER_CHKSUM': (7114, 0, {'checksum': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE4': (7115, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE5': (7116, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE6': (7117, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE7': (7118, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DISPATCH_INTERLEAVE': (7119, 0, {'interleave': (0, 9)}), + 'regCOMPUTE_RELAUNCH': (7120, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_LO': (7121, 0, {'addr': (0, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_HI': (7122, 0, {'addr': (0, 15)}), + 'regCOMPUTE_RELAUNCH2': (7123, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_USER_DATA_0': (7136, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_1': (7137, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_2': (7138, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_3': (7139, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_4': (7140, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_5': (7141, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_6': (7142, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_7': (7143, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_8': (7144, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_9': (7145, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_10': (7146, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_11': (7147, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_12': (7148, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_13': (7149, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_14': (7150, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_15': (7151, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_TUNNEL': (7197, 0, {'off_delay': (0, 9), 'immediate': (10, 10)}), + 'regCOMPUTE_DISPATCH_END': (7198, 0, {'data': (0, 31)}), + 'regCOMPUTE_NOWHERE': (7199, 0, {'data': (0, 31)}), + 'regCP_INT_CNTL': (7657, 0, {'resume_int_enable': (8, 8), 'suspend_int_enable': (9, 9), 'dma_watch_int_enable': (10, 10), 'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC_DOORBELL_RANGE_LOWER': (7676, 0, {'doorbell_range_lower': (2, 11)}), + 'regCP_MEC_DOORBELL_RANGE_UPPER': (7677, 0, {'doorbell_range_upper': (2, 11)}), + 'regCP_INT_CNTL_RING0': (7690, 0, {'resume_int_enable': (8, 8), 'suspend_int_enable': (9, 9), 'dma_watch_int_enable': (10, 10), 'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_INT_CNTL_RING1': (7691, 0, {'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC1_F32_INTERRUPT': (7702, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_MEC2_F32_INTERRUPT': (7703, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_PFP_PRGRM_CNTR_START': (7748, 0, {'ip_start': (0, 31)}), + 'regCP_ME_PRGRM_CNTR_START': (7749, 0, {'ip_start': (0, 31)}), + 'regCP_MEC1_PRGRM_CNTR_START': (7750, 0, {'ip_start': (0, 19)}), + 'regCP_MEC2_PRGRM_CNTR_START': (7751, 0, {'ip_start': (0, 19)}), + 'regCP_MEC1_INTR_ROUTINE_START': (7755, 0, {'ir_start': (0, 19)}), + 'regCP_MEC2_INTR_ROUTINE_START': (7756, 0, {'ir_start': (0, 19)}), + 'regCP_PFP_PRGRM_CNTR_START_HI': (7769, 0, {'ip_start': (0, 29)}), + 'regCP_MEC1_F32_INT_DIS': (7773, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_MEC2_F32_INT_DIS': (7774, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_ME_PRGRM_CNTR_START_HI': (7801, 0, {'ip_start': (0, 29)}), + 'regCP_HQD_GFX_CONTROL': (7839, 0, {'message': (0, 3), 'misc': (4, 14), 'db_updated_msg_en': (15, 15)}), + 'regCP_HQD_GFX_STATUS': (7840, 0, {'status': (0, 15)}), + 'regCP_MEC_JT_STAT': (7893, 0, {'jt_loaded': (0, 7), 'wr_mask': (16, 23)}), + 'regSPI_COMPUTE_QUEUE_RESET': (8051, 0, {'reset': (0, 0)}), + 'regCP_MQD_BASE_ADDR': (8105, 0, {'base_addr': (2, 31)}), + 'regCP_MQD_BASE_ADDR_HI': (8106, 0, {'base_addr_hi': (0, 15)}), + 'regCP_HQD_ACTIVE': (8107, 0, {'active': (0, 0), 'busy_gate': (1, 1)}), + 'regCP_HQD_VMID': (8108, 0, {'vmid': (0, 3), 'ib_vmid': (8, 11), 'vqid': (16, 25)}), + 'regCP_HQD_PERSISTENT_STATE': (8109, 0, {'preload_req': (0, 0), 'tmz_connect_override': (1, 1), 'suspend_status': (7, 7), 'preload_size': (8, 17), 'tmz_switch_exempt': (18, 18), 'tmz_match_dis': (19, 19), 'wpp_clamp_en': (20, 20), 'wpp_switch_qos_en': (21, 21), 'iq_switch_qos_en': (22, 22), 'ib_switch_qos_en': (23, 23), 'eop_switch_qos_en': (24, 24), 'pq_switch_qos_en': (25, 25), 'tc_offload_qos_en': (26, 26), 'cache_full_packet_en': (27, 27), 'restore_active': (28, 28), 'relaunch_waves': (29, 29), 'qswitch_mode': (30, 30), 'disp_active': (31, 31)}), + 'regCP_HQD_PIPE_PRIORITY': (8110, 0, {'pipe_priority': (0, 1)}), + 'regCP_HQD_QUEUE_PRIORITY': (8111, 0, {'priority_level': (0, 3)}), + 'regCP_HQD_QUANTUM': (8112, 0, {'quantum_en': (0, 0), 'quantum_scale': (4, 4), 'quantum_duration': (8, 13), 'quantum_active': (31, 31)}), + 'regCP_HQD_PQ_BASE': (8113, 0, {'addr': (0, 31)}), + 'regCP_HQD_PQ_BASE_HI': (8114, 0, {'addr_hi': (0, 7)}), + 'regCP_HQD_PQ_RPTR': (8115, 0, {'consumed_offset': (0, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR': (8116, 0, {'rptr_report_addr': (2, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR_HI': (8117, 0, {'rptr_report_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR': (8118, 0, {'wptr_addr': (3, 31)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR_HI': (8119, 0, {'wptr_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_DOORBELL_CONTROL': (8120, 0, {'doorbell_mode': (0, 0), 'doorbell_bif_drop': (1, 1), 'doorbell_offset': (2, 27), 'doorbell_source': (28, 28), 'doorbell_schd_hit': (29, 29), 'doorbell_en': (30, 30), 'doorbell_hit': (31, 31)}), + 'regCP_HQD_PQ_CONTROL': (8122, 0, {'queue_size': (0, 5), 'wptr_carry': (6, 6), 'rptr_carry': (7, 7), 'rptr_block_size': (8, 13), 'queue_full_en': (14, 14), 'pq_empty': (15, 15), 'slot_based_wptr': (18, 19), 'min_avail_size': (20, 21), 'tmz': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'pq_volatile': (26, 26), 'no_update_rptr': (27, 27), 'unord_dispatch': (28, 28), 'tunnel_dispatch': (29, 29), 'priv_state': (30, 30), 'kmd_queue': (31, 31)}), + 'regCP_HQD_IB_BASE_ADDR': (8123, 0, {'ib_base_addr': (2, 31)}), + 'regCP_HQD_IB_BASE_ADDR_HI': (8124, 0, {'ib_base_addr_hi': (0, 15)}), + 'regCP_HQD_IB_RPTR': (8125, 0, {'consumed_offset': (0, 19)}), + 'regCP_HQD_IB_CONTROL': (8126, 0, {'ib_size': (0, 19), 'min_ib_avail_size': (20, 21), 'ib_exe_disable': (23, 23), 'ib_cache_policy': (24, 25), 'ib_volatile': (26, 26), 'ib_priv_state': (30, 30), 'processing_ib': (31, 31)}), + 'regCP_HQD_IQ_TIMER': (8127, 0, {'wait_time': (0, 7), 'retry_type': (8, 10), 'immediate_expire': (11, 11), 'interrupt_type': (12, 13), 'clock_count': (14, 15), 'interrupt_size': (16, 21), 'quantum_timer': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'iq_volatile': (26, 26), 'queue_type': (27, 27), 'rearm_timer': (28, 28), 'process_iq_en': (29, 29), 'processing_iq': (30, 30), 'active': (31, 31)}), + 'regCP_HQD_IQ_RPTR': (8128, 0, {'offset': (0, 5)}), + 'regCP_HQD_DEQUEUE_REQUEST': (8129, 0, {'dequeue_req': (0, 3), 'iq_req_pend': (4, 4), 'dequeue_int': (8, 8), 'iq_req_pend_en': (9, 9), 'dequeue_req_en': (10, 10)}), + 'regCP_HQD_DMA_OFFLOAD': (8130, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_OFFLOAD': (8130, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_SEMA_CMD': (8131, 0, {'retry': (0, 0), 'result': (1, 2), 'polling_dis': (8, 8), 'message_en': (9, 9)}), + 'regCP_HQD_MSG_TYPE': (8132, 0, {'action': (0, 2), 'save_state': (4, 6)}), + 'regCP_HQD_ATOMIC0_PREOP_LO': (8133, 0, {'atomic0_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC0_PREOP_HI': (8134, 0, {'atomic0_preop_hi': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_LO': (8135, 0, {'atomic1_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_HI': (8136, 0, {'atomic1_preop_hi': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER0': (8137, 0, {'cwsr': (0, 0), 'save_status': (1, 1), 'rsrv': (2, 2), 'static_queue': (3, 5), 'queue_run_once': (6, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'c_inherit_vmid': (9, 9), 'queue_scheduler_type': (10, 12), 'c_queue_use_gws': (13, 13), 'c_queue_debug_en': (14, 14), 'queue_slot_connected': (15, 15), 'mes_interrupt_enabled': (20, 20), 'mes_interrupt_pipe': (21, 22), 'concurrent_process_count': (24, 27), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_STATUS0': (8137, 0, {'cwsr': (0, 0), 'save_status': (1, 1), 'rsrv': (2, 2), 'static_queue': (3, 5), 'queue_run_once': (6, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'c_inherit_vmid': (9, 9), 'queue_scheduler_type': (10, 12), 'c_queue_use_gws': (13, 13), 'c_queue_debug_en': (14, 14), 'queue_slot_connected': (15, 15), 'mes_interrupt_enabled': (20, 20), 'mes_interrupt_pipe': (21, 22), 'concurrent_process_count': (24, 27), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_CONTROL0': (8138, 0, {'control': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER1': (8138, 0, {'scheduler': (0, 31)}), + 'regCP_MQD_CONTROL': (8139, 0, {'vmid': (0, 3), 'priv_state': (8, 8), 'processing_mqd': (12, 12), 'processing_mqd_en': (13, 13), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'mqd_volatile': (26, 26)}), + 'regCP_HQD_HQ_STATUS1': (8140, 0, {'status': (0, 31)}), + 'regCP_HQD_HQ_CONTROL1': (8141, 0, {'control': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR': (8142, 0, {'base_addr': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR_HI': (8143, 0, {'base_addr_hi': (0, 7)}), + 'regCP_HQD_EOP_CONTROL': (8144, 0, {'eop_size': (0, 5), 'processing_eop': (8, 8), 'process_eop_en': (12, 12), 'processing_eopib': (13, 13), 'process_eopib_en': (14, 14), 'halt_fetcher': (21, 21), 'halt_fetcher_en': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'eop_volatile': (26, 26), 'sig_sem_result': (29, 30), 'pend_sig_sem': (31, 31)}), + 'regCP_HQD_EOP_RPTR': (8145, 0, {'rptr': (0, 12), 'reset_fetcher': (28, 28), 'dequeue_pend': (29, 29), 'rptr_eq_csmd_wptr': (30, 30), 'init_fetcher': (31, 31)}), + 'regCP_HQD_EOP_WPTR': (8146, 0, {'wptr': (0, 12), 'eop_empty': (15, 15), 'eop_avail': (16, 28)}), + 'regCP_HQD_EOP_EVENTS': (8147, 0, {'event_count': (0, 11), 'cs_partial_flush_pend': (16, 16)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_LO': (8148, 0, {'addr': (12, 31)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_HI': (8149, 0, {'addr_hi': (0, 15)}), + 'regCP_HQD_CTX_SAVE_CONTROL': (8150, 0, {'policy': (3, 4), 'exe_disable': (23, 23)}), + 'regCP_HQD_CNTL_STACK_OFFSET': (8151, 0, {'offset': (2, 15)}), + 'regCP_HQD_CNTL_STACK_SIZE': (8152, 0, {'size': (12, 15)}), + 'regCP_HQD_WG_STATE_OFFSET': (8153, 0, {'offset': (2, 25)}), + 'regCP_HQD_CTX_SAVE_SIZE': (8154, 0, {'size': (12, 25)}), + 'regCP_HQD_GDS_RESOURCE_STATE': (8155, 0, {'oa_required': (0, 0), 'oa_acquired': (1, 1), 'gws_size': (4, 9), 'gws_pntr': (12, 17)}), + 'regCP_HQD_ERROR': (8156, 0, {'edc_error_id': (0, 3), 'sua_error': (4, 4), 'aql_error': (5, 5), 'pq_utcl1_error': (8, 8), 'ib_utcl1_error': (9, 9), 'eop_utcl1_error': (10, 10), 'iq_utcl1_error': (11, 11), 'rrpt_utcl1_error': (12, 12), 'wpp_utcl1_error': (13, 13), 'sem_utcl1_error': (14, 14), 'dma_src_utcl1_error': (15, 15), 'dma_dst_utcl1_error': (16, 16), 'sr_utcl1_error': (17, 17), 'qu_utcl1_error': (18, 18), 'tc_utcl1_error': (19, 19)}), + 'regCP_HQD_EOP_WPTR_MEM': (8157, 0, {'wptr': (0, 12)}), + 'regCP_HQD_AQL_CONTROL': (8158, 0, {'control0': (0, 14), 'control0_en': (15, 15), 'control1': (16, 30), 'control1_en': (31, 31)}), + 'regCP_HQD_PQ_WPTR_LO': (8159, 0, {'offset': (0, 31)}), + 'regCP_HQD_PQ_WPTR_HI': (8160, 0, {'data': (0, 31)}), + 'regCP_HQD_SUSPEND_CNTL_STACK_OFFSET': (8161, 0, {'offset': (2, 15)}), + 'regCP_HQD_SUSPEND_CNTL_STACK_DW_CNT': (8162, 0, {'cnt': (0, 13)}), + 'regCP_HQD_SUSPEND_WG_STATE_OFFSET': (8163, 0, {'offset': (2, 25)}), + 'regCP_HQD_DDID_RPTR': (8164, 0, {'rptr': (0, 10)}), + 'regCP_HQD_DDID_WPTR': (8165, 0, {'wptr': (0, 10)}), + 'regCP_HQD_DDID_INFLIGHT_COUNT': (8166, 0, {'count': (0, 15)}), + 'regCP_HQD_DDID_DELTA_RPT_COUNT': (8167, 0, {'count': (0, 7)}), + 'regCP_HQD_DEQUEUE_STATUS': (8168, 0, {'dequeue_stat': (0, 3), 'suspend_req_pend': (4, 4), 'suspend_req_pend_en': (9, 9), 'dequeue_stat_en': (10, 10)}), + 'regTCP_WATCH0_ADDR_H': (8264, 0, {'addr': (0, 15)}), + 'regTCP_WATCH0_ADDR_L': (8265, 0, {'addr': (7, 31)}), + 'regTCP_WATCH0_CNTL': (8266, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH1_ADDR_H': (8267, 0, {'addr': (0, 15)}), + 'regTCP_WATCH1_ADDR_L': (8268, 0, {'addr': (7, 31)}), + 'regTCP_WATCH1_CNTL': (8269, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH2_ADDR_H': (8270, 0, {'addr': (0, 15)}), + 'regTCP_WATCH2_ADDR_L': (8271, 0, {'addr': (7, 31)}), + 'regTCP_WATCH2_CNTL': (8272, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH3_ADDR_H': (8273, 0, {'addr': (0, 15)}), + 'regTCP_WATCH3_ADDR_L': (8274, 0, {'addr': (7, 31)}), + 'regTCP_WATCH3_CNTL': (8275, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regCP_PERFMON_CNTX_CNTL': (216, 1, {'perfmon_enable': (31, 31)}), + 'regCP_MEC_CNTL': (2050, 1, {'mec_me1_pipe0_reset': (16, 16), 'mec_me1_pipe1_reset': (17, 17), 'mec_me1_pipe2_reset': (18, 18), 'mec_me1_pipe3_reset': (19, 19), 'mec_me2_pipe0_reset': (20, 20), 'mec_me2_pipe1_reset': (21, 21), 'mec_me2_pipe2_reset': (22, 22), 'mec_me2_pipe3_reset': (23, 23), 'mec_invalidate_icache': (27, 27), 'mec_me2_halt': (28, 28), 'mec_me2_step': (29, 29), 'mec_me1_halt': (30, 30), 'mec_me1_step': (31, 31)}), + 'regCP_ME_CNTL': (2051, 1, {'ce_invalidate_icache': (4, 4), 'pfp_invalidate_icache': (6, 6), 'me_invalidate_icache': (8, 8), 'pfp_pipe0_disable': (12, 12), 'pfp_pipe1_disable': (13, 13), 'me_pipe0_disable': (14, 14), 'me_pipe1_disable': (15, 15), 'ce_pipe0_reset': (16, 16), 'ce_pipe1_reset': (17, 17), 'pfp_pipe0_reset': (18, 18), 'pfp_pipe1_reset': (19, 19), 'me_pipe0_reset': (20, 20), 'me_pipe1_reset': (21, 21), 'ce_halt': (24, 24), 'ce_step': (25, 25), 'pfp_halt': (26, 26), 'pfp_step': (27, 27), 'me_halt': (28, 28), 'me_step': (29, 29)}), + 'regGRBM_GFX_CNTL': (2304, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10), 'ctxid': (11, 13)}), + 'regGRBM_NOWHERE': (2305, 1, {'data': (0, 31)}), + 'regSH_MEM_BASES': (2531, 1, {'private_base': (0, 15), 'shared_base': (16, 31)}), + 'regSH_MEM_CONFIG': (2532, 1, {'address_mode': (0, 0), 'alignment_mode': (2, 3), 'initial_inst_prefetch': (14, 15), 'icache_use_gl1': (18, 18)}), + 'regTCP_INVALIDATE': (6560, 1, {'start': (0, 0)}), + 'regTCP_STATUS': (6561, 1, {'tcp_busy': (0, 0), 'input_busy': (1, 1), 'adrs_busy': (2, 2), 'tagrams_busy': (3, 3), 'cntrl_busy': (4, 4), 'lfifo_busy': (5, 5), 'read_busy': (6, 6), 'format_busy': (7, 7), 'vm_busy': (8, 8), 'memif_busy': (9, 9), 'gcr_busy': (10, 10), 'ofifo_busy': (11, 11), 'ofifo_queue_busy': (12, 13), 'xnack_prt': (15, 15)}), + 'regTCP_CNTL': (6562, 1, {'force_hit': (0, 0), 'force_miss': (1, 1), 'flat_buf_cache_swizzle': (5, 5), 'td_data_en_override': (6, 6), 'enable_128b_dcc_comp_read_for_indep64': (7, 7), 'disable_write_combining': (9, 9), 'force_eow_total_cnt': (15, 20), 'force_eow_set_cnt': (22, 26), 'disable_z_map': (28, 28), 'force_order_between_read_write_to_same_address': (29, 29), 'astc_ve_msb_tolerant': (31, 31)}), + 'regTCP_CNTL2': (6563, 1, {'ls_disable_clocks': (0, 7), 'tcp_fmt_mgcg_disable': (8, 8), 'tcpf_latency_bypass_disable': (9, 9), 'tcp_write_data_mgcg_disable': (10, 10), 'tcp_inner_block_mgcg_disable': (11, 11), 'tcp_adrs_img_calc_mgcg_disable': (12, 12), 'v64_combine_enable': (13, 13), 'tagram_addr_swizzle_disable': (14, 14), 'return_order_override': (15, 15), 'power_opt_disable': (16, 16), 'gcr_rsp_fgcg_disable': (17, 17), 'perf_en_override': (18, 19), 'tc_td_ram_clken_disable': (20, 20), 'tc_td_data_clken_disable': (21, 21), 'tcp_gl1_req_clken_disable': (22, 22), 'tcp_gl1r_src_clken_disable': (23, 23), 'spare_bit': (26, 26), 'tagram_xy_bias_override': (27, 28), 'tcp_req_mgcg_disable': (29, 29), 'tcp_miss_mgcg_disable': (30, 30), 'disable_mipmap_param_calc_self_gating': (31, 31)}), + 'regTCP_CREDIT': (6564, 1, {'lfifo_ram_depth': (0, 9), 'gl1_req_credit': (10, 15), 'req_fifo_credit': (16, 22), 'td_ram_credit': (23, 27), 'td_data_credit': (29, 31)}), + 'regSCRATCH_REG6': (8262, 1, {'scratch_reg6': (0, 31)}), + 'regSCRATCH_REG7': (8263, 1, {'scratch_reg7': (0, 31)}), + 'regRLC_GPM_PERF_COUNT_0': (8512, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sa_index': (8, 11), 'wgp_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_PERF_COUNT_1': (8513, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sa_index': (8, 11), 'wgp_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regGRBM_GFX_INDEX': (8704, 1, {'instance_index': (0, 7), 'sa_index': (8, 15), 'se_index': (16, 23), 'sa_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_0': (9024, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_1': (9025, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_2': (9026, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_3': (9027, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_4': (9028, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_5': (9029, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_6': (9030, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_7': (9031, 1, {'data': (0, 31)}), + 'regSPI_CONFIG_CNTL': (9280, 1, {'gpr_write_priority': (0, 20), 'exp_priority_order': (21, 23), 'enable_sqg_top_events': (24, 24), 'enable_sqg_bop_events': (25, 25), 'alloc_arb_lru_ena': (28, 28), 'exp_arb_lru_ena': (29, 29), 'ps_pkr_priority_cntl': (30, 31)}), + 'regSPI_CONFIG_CNTL_1': (9281, 1, {'vtx_done_delay': (0, 3), 'interp_one_prim_per_row': (4, 4), 'pc_limit_enable': (5, 6), 'pc_limit_strict': (7, 7), 'ps_group_timeout_mode': (8, 8), 'oreo_expalloc_stall': (9, 9), 'lbpw_cu_chk_cnt': (10, 13), 'csc_pwr_save_disable': (14, 14), 'csg_pwr_save_disable': (15, 15), 'max_vtx_sync_cnt': (16, 20), 'en_user_accum': (21, 21), 'sa_screen_map': (22, 22), 'ps_group_timeout': (23, 31)}), + 'regSPI_CONFIG_CNTL_2': (9282, 1, {'context_save_wait_gds_request_cycle_ovhd': (0, 3), 'context_save_wait_gds_grant_cycle_ovhd': (4, 7), 'pws_csg_wait_disable': (8, 8), 'pws_hs_wait_disable': (9, 9), 'pws_gs_wait_disable': (10, 10), 'pws_ps_wait_disable': (11, 11), 'csc_halt_ack_delay': (12, 16)}), + 'regCP_MEC_RS64_PRGRM_CNTR_START': (10496, 1, {'ip_start': (0, 31)}), + 'regCP_MEC_MTVEC_LO': (10497, 1, {'addr_lo': (0, 31)}), + 'regCP_MEC_MTVEC_HI': (10498, 1, {'addr_lo': (0, 31)}), + 'regCP_MEC_ISA_CNTL': (10499, 1, {'isa_mode': (0, 0)}), + 'regCP_MEC_RS64_CNTL': (10500, 1, {'mec_invalidate_icache': (4, 4), 'mec_pipe0_reset': (16, 16), 'mec_pipe1_reset': (17, 17), 'mec_pipe2_reset': (18, 18), 'mec_pipe3_reset': (19, 19), 'mec_pipe0_active': (26, 26), 'mec_pipe1_active': (27, 27), 'mec_pipe2_active': (28, 28), 'mec_pipe3_active': (29, 29), 'mec_halt': (30, 30), 'mec_step': (31, 31)}), + 'regCP_MEC_MIE_LO': (10501, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_MIE_HI': (10502, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT': (10503, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_RS64_INSTR_PNTR': (10504, 1, {'instr_pntr': (0, 19)}), + 'regCP_MEC_MIP_LO': (10505, 1, {'mip_lo': (0, 31)}), + 'regCP_MEC_MIP_HI': (10506, 1, {'mip_hi': (0, 31)}), + 'regCP_MEC_DC_BASE_CNTL': (10507, 1, {'vmid': (0, 3), 'cache_policy': (24, 25)}), + 'regCP_MEC_DC_OP_CNTL': (10508, 1, {'invalidate_dcache': (0, 0), 'invalidate_dcache_complete': (1, 1), 'bypass_all': (2, 2)}), + 'regCP_MEC_MTIMECMP_LO': (10509, 1, {'time_lo': (0, 31)}), + 'regCP_MEC_MTIMECMP_HI': (10510, 1, {'time_hi': (0, 31)}), + 'regCP_MEC_GP0_LO': (10512, 1, {'pg_virt_halted': (0, 0), 'data': (1, 31)}), + 'regCP_MEC_GP0_HI': (10513, 1, {'m_ret_addr': (0, 31)}), + 'regCP_MEC_GP1_LO': (10514, 1, {'rd_wr_select_lo': (0, 31)}), + 'regCP_MEC_GP1_HI': (10515, 1, {'rd_wr_select_hi': (0, 31)}), + 'regCP_MEC_GP2_LO': (10516, 1, {'stack_pntr_lo': (0, 31)}), + 'regCP_MEC_GP2_HI': (10517, 1, {'stack_pntr_hi': (0, 31)}), + 'regCP_MEC_GP3_LO': (10518, 1, {'data': (0, 31)}), + 'regCP_MEC_GP3_HI': (10519, 1, {'data': (0, 31)}), + 'regCP_MEC_GP4_LO': (10520, 1, {'data': (0, 31)}), + 'regCP_MEC_GP4_HI': (10521, 1, {'data': (0, 31)}), + 'regCP_MEC_GP5_LO': (10522, 1, {'pg_virt_halted': (0, 0), 'data': (1, 31)}), + 'regCP_MEC_GP5_HI': (10523, 1, {'m_ret_addr': (0, 31)}), + 'regCP_MEC_GP6_LO': (10524, 1, {'rd_wr_select_lo': (0, 31)}), + 'regCP_MEC_GP6_HI': (10525, 1, {'rd_wr_select_hi': (0, 31)}), + 'regCP_MEC_GP7_LO': (10526, 1, {'stack_pntr_lo': (0, 31)}), + 'regCP_MEC_GP7_HI': (10527, 1, {'stack_pntr_hi': (0, 31)}), + 'regCP_MEC_GP8_LO': (10528, 1, {'data': (0, 31)}), + 'regCP_MEC_GP8_HI': (10529, 1, {'data': (0, 31)}), + 'regCP_MEC_GP9_LO': (10530, 1, {'data': (0, 31)}), + 'regCP_MEC_GP9_HI': (10531, 1, {'data': (0, 31)}), + 'regCP_MEC_LOCAL_BASE0_LO': (10535, 1, {'base0_lo': (16, 31)}), + 'regCP_MEC_LOCAL_BASE0_HI': (10536, 1, {'base0_hi': (0, 15)}), + 'regCP_MEC_LOCAL_MASK0_LO': (10537, 1, {'mask0_lo': (16, 31)}), + 'regCP_MEC_LOCAL_MASK0_HI': (10538, 1, {'mask0_hi': (0, 15)}), + 'regCP_MEC_LOCAL_APERTURE': (10539, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_INSTR_BASE_LO': (10540, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_LOCAL_INSTR_BASE_HI': (10541, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_LOCAL_INSTR_MASK_LO': (10542, 1, {'mask_lo': (16, 31)}), + 'regCP_MEC_LOCAL_INSTR_MASK_HI': (10543, 1, {'mask_hi': (0, 15)}), + 'regCP_MEC_LOCAL_INSTR_APERTURE': (10544, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_SCRATCH_APERTURE': (10545, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_SCRATCH_BASE_LO': (10546, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_LOCAL_SCRATCH_BASE_HI': (10547, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_RS64_PERFCOUNT_CNTL': (10548, 1, {'event_sel': (0, 4)}), + 'regCP_MEC_RS64_PENDING_INTERRUPT': (10549, 1, {'pending_interrupt': (0, 31)}), + 'regCP_MEC_RS64_PRGRM_CNTR_START_HI': (10552, 1, {'ip_start': (0, 29)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_16': (10554, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_17': (10555, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_18': (10556, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_19': (10557, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_20': (10558, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_21': (10559, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_22': (10560, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_23': (10561, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_24': (10562, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_25': (10563, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_26': (10564, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_27': (10565, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_28': (10566, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_29': (10567, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_30': (10568, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_31': (10569, 1, {'data': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_BASE': (10570, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_MASK': (10571, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_CNTL': (10572, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE1_BASE': (10573, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE1_MASK': (10574, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE1_CNTL': (10575, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE2_BASE': (10576, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE2_MASK': (10577, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE2_CNTL': (10578, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE3_BASE': (10579, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE3_MASK': (10580, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE3_CNTL': (10581, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE4_BASE': (10582, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE4_MASK': (10583, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE4_CNTL': (10584, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE5_BASE': (10585, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE5_MASK': (10586, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE5_CNTL': (10587, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE6_BASE': (10588, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE6_MASK': (10589, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE6_CNTL': (10590, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE7_BASE': (10591, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE7_MASK': (10592, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE7_CNTL': (10593, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE8_BASE': (10594, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE8_MASK': (10595, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE8_CNTL': (10596, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE9_BASE': (10597, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE9_MASK': (10598, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE9_CNTL': (10599, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE10_BASE': (10600, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE10_MASK': (10601, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE10_CNTL': (10602, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE11_BASE': (10603, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE11_MASK': (10604, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE11_CNTL': (10605, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE12_BASE': (10606, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE12_MASK': (10607, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE12_CNTL': (10608, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE13_BASE': (10609, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE13_MASK': (10610, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE13_CNTL': (10611, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE14_BASE': (10612, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE14_MASK': (10613, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE14_CNTL': (10614, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE15_BASE': (10615, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE15_MASK': (10616, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE15_CNTL': (10617, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regGRBM_PERFCOUNTER0_LO': (12352, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER0_HI': (12353, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_PERFCOUNTER1_LO': (12355, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER1_HI': (12356, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE0_PERFCOUNTER_LO': (12357, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE0_PERFCOUNTER_HI': (12358, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE1_PERFCOUNTER_LO': (12359, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE1_PERFCOUNTER_HI': (12360, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE2_PERFCOUNTER_LO': (12361, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE2_PERFCOUNTER_HI': (12362, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE3_PERFCOUNTER_LO': (12363, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE3_PERFCOUNTER_HI': (12364, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER0_LO': (12736, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER1_LO': (12738, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER2_LO': (12740, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER3_LO': (12742, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER4_LO': (12744, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER5_LO': (12746, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER6_LO': (12748, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER7_LO': (12750, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_LO': (13120, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_HI': (13121, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER1_LO': (13122, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER1_HI': (13123, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER2_LO': (13124, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER2_HI': (13125, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER3_LO': (13126, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER3_HI': (13127, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER_FILTER': (13128, 1, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 4), 'data_format': (5, 11), 'num_format': (13, 16), 'sw_mode': (17, 21), 'num_samples': (22, 23), 'opcode_type': (24, 26), 'slc': (27, 27), 'dlc': (28, 28), 'glc': (29, 29), 'compression_enable': (30, 30)}), + 'regTCP_PERFCOUNTER_FILTER2': (13129, 1, {'req_mode': (0, 2)}), + 'regTCP_PERFCOUNTER_FILTER_EN': (13130, 1, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 2), 'data_format': (3, 3), 'num_format': (4, 4), 'sw_mode': (5, 5), 'num_samples': (6, 6), 'opcode_type': (7, 7), 'slc': (8, 8), 'dlc': (9, 9), 'glc': (10, 10), 'compression_enable': (11, 11), 'req_mode': (12, 12)}), + 'regGL2C_PERFCOUNTER0_LO': (13184, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER0_HI': (13185, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER1_LO': (13186, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER1_HI': (13187, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER2_LO': (13188, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER2_HI': (13189, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER3_LO': (13190, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER3_HI': (13191, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER0_LO': (13440, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER0_HI': (13441, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER1_LO': (13442, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER1_HI': (13443, 1, {'perfcounter_hi': (0, 31)}), + 'regCP_PERFMON_CNTL': (14344, 1, {'perfmon_state': (0, 3), 'spm_perfmon_state': (4, 7), 'perfmon_enable_mode': (8, 9), 'perfmon_sample_enable': (10, 10)}), + 'regGRBM_PERFCOUNTER0_SELECT': (14400, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'gds_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30), 'rmi_busy_user_defined_mask': (31, 31)}), + 'regGRBM_PERFCOUNTER1_SELECT': (14401, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'gds_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30), 'rmi_busy_user_defined_mask': (31, 31)}), + 'regGRBM_SE0_PERFCOUNTER_SELECT': (14402, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE1_PERFCOUNTER_SELECT': (14403, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE2_PERFCOUNTER_SELECT': (14404, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_SE3_PERFCOUNTER_SELECT': (14405, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27), 'sedc_busy_user_defined_mask': (28, 28)}), + 'regGRBM_PERFCOUNTER0_SELECT_HI': (14413, 1, {'utcl1_busy_user_defined_mask': (1, 1), 'gl2cc_busy_user_defined_mask': (2, 2), 'sdma_busy_user_defined_mask': (3, 3), 'ch_busy_user_defined_mask': (4, 4), 'ph_busy_user_defined_mask': (5, 5), 'pmm_busy_user_defined_mask': (6, 6), 'gus_busy_user_defined_mask': (7, 7), 'gl1cc_busy_user_defined_mask': (8, 8), 'gl1h_busy_user_defined_mask': (9, 9)}), + 'regGRBM_PERFCOUNTER1_SELECT_HI': (14414, 1, {'utcl1_busy_user_defined_mask': (1, 1), 'gl2cc_busy_user_defined_mask': (2, 2), 'sdma_busy_user_defined_mask': (3, 3), 'ch_busy_user_defined_mask': (4, 4), 'ph_busy_user_defined_mask': (5, 5), 'pmm_busy_user_defined_mask': (6, 6), 'gus_busy_user_defined_mask': (7, 7), 'gl1cc_busy_user_defined_mask': (8, 8), 'gl1h_busy_user_defined_mask': (9, 9)}), + 'regSQ_PERFCOUNTER0_SELECT': (14784, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER1_SELECT': (14785, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER2_SELECT': (14786, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER3_SELECT': (14787, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER4_SELECT': (14788, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER5_SELECT': (14789, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER6_SELECT': (14790, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER7_SELECT': (14791, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER8_SELECT': (14792, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER9_SELECT': (14793, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER10_SELECT': (14794, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER11_SELECT': (14795, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER12_SELECT': (14796, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER13_SELECT': (14797, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER14_SELECT': (14798, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER15_SELECT': (14799, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER_CTRL': (14816, 1, {'ps_en': (0, 0), 'gs_en': (2, 2), 'hs_en': (4, 4), 'cs_en': (6, 6), 'disable_me0pipe0_perf': (14, 14), 'disable_me0pipe1_perf': (15, 15), 'disable_me1pipe0_perf': (16, 16), 'disable_me1pipe1_perf': (17, 17), 'disable_me1pipe2_perf': (18, 18), 'disable_me1pipe3_perf': (19, 19)}), + 'regSQ_PERFCOUNTER_CTRL2': (14818, 1, {'force_en': (0, 0), 'vmid_en': (1, 16)}), + 'regSQ_THREAD_TRACE_BUF0_BASE': (14824, 1, {'base_lo': (0, 31)}), + 'regSQ_THREAD_TRACE_BUF0_SIZE': (14825, 1, {'base_hi': (0, 3), 'size': (8, 29)}), + 'regSQ_THREAD_TRACE_BUF1_BASE': (14826, 1, {'base_lo': (0, 31)}), + 'regSQ_THREAD_TRACE_BUF1_SIZE': (14827, 1, {'base_hi': (0, 3), 'size': (8, 29)}), + 'regSQ_THREAD_TRACE_CTRL': (14828, 1, {'mode': (0, 1), 'all_vmid': (2, 2), 'gl1_perf_en': (3, 3), 'interrupt_en': (4, 4), 'double_buffer': (5, 5), 'hiwater': (6, 8), 'reg_at_hwm': (9, 10), 'spi_stall_en': (11, 11), 'sq_stall_en': (12, 12), 'util_timer': (13, 13), 'wavestart_mode': (14, 15), 'rt_freq': (16, 17), 'sync_count_markers': (18, 18), 'sync_count_draws': (19, 19), 'lowater_offset': (20, 22), 'auto_flush_padding_dis': (28, 28), 'auto_flush_mode': (29, 29), 'draw_event_en': (31, 31)}), + 'regSQ_THREAD_TRACE_MASK': (14829, 1, {'simd_sel': (0, 1), 'wgp_sel': (4, 7), 'sa_sel': (9, 9), 'wtype_include': (10, 16), 'exclude_nondetail_shaderdata': (17, 17)}), + 'regSQ_THREAD_TRACE_TOKEN_MASK': (14830, 1, {'token_exclude': (0, 10), 'ttrace_exec': (11, 11), 'bop_events_token_include': (12, 12), 'reg_include': (16, 23), 'inst_exclude': (24, 25), 'reg_exclude': (26, 28), 'reg_detail_all': (31, 31)}), + 'regSQ_THREAD_TRACE_WPTR': (14831, 1, {'offset': (0, 28), 'buffer_id': (31, 31)}), + 'regSQ_THREAD_TRACE_STATUS': (14836, 1, {'finish_pending': (0, 11), 'finish_done': (12, 23), 'write_error': (24, 24), 'busy': (25, 25), 'owner_vmid': (28, 31)}), + 'regSQ_THREAD_TRACE_STATUS2': (14837, 1, {'buf0_full': (0, 0), 'buf1_full': (1, 1), 'packet_lost_buf_no_lockdown': (4, 4), 'buf_issue_status': (8, 12), 'buf_issue': (13, 13), 'write_buf_full': (14, 14)}), + 'regSQ_THREAD_TRACE_GFX_DRAW_CNTR': (14838, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_GFX_MARKER_CNTR': (14839, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_HP3D_DRAW_CNTR': (14840, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_HP3D_MARKER_CNTR': (14841, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_DROPPED_CNTR': (14842, 1, {'cntr': (0, 31)}), + 'regTCP_PERFCOUNTER0_SELECT': (15168, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER0_SELECT1': (15169, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT': (15170, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT1': (15171, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER2_SELECT': (15172, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER3_SELECT': (15173, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER0_SELECT': (15232, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER0_SELECT1': (15233, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER1_SELECT': (15234, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER1_SELECT1': (15235, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER2_SELECT': (15236, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER3_SELECT': (15237, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regRLC_SPM_PERFMON_CNTL': (15488, 1, {'reserved1': (0, 11), 'perfmon_ring_mode': (12, 13), 'disable_gfxclock_count': (14, 14), 'reserved': (15, 15), 'perfmon_sample_interval': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_LO': (15489, 1, {'ring_base_lo': (0, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_HI': (15490, 1, {'ring_base_hi': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_SIZE': (15491, 1, {'ring_base_size': (0, 31)}), + 'regRLC_SPM_RING_WRPTR': (15492, 1, {'reserved': (0, 4), 'perfmon_ring_wrptr': (5, 31)}), + 'regRLC_SPM_RING_RDPTR': (15493, 1, {'perfmon_ring_rdptr': (0, 31)}), + 'regRLC_SPM_SEGMENT_THRESHOLD': (15494, 1, {'num_segment_threshold': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_PERFMON_SEGMENT_SIZE': (15495, 1, {'total_num_segment': (0, 15), 'global_num_segment': (16, 23), 'se_num_segment': (24, 31)}), + 'regRLC_SPM_GLOBAL_MUXSEL_ADDR': (15496, 1, {'addr': (0, 11)}), + 'regRLC_SPM_GLOBAL_MUXSEL_DATA': (15497, 1, {'sel0': (0, 15), 'sel1': (16, 31)}), + 'regRLC_SPM_SE_MUXSEL_ADDR': (15498, 1, {'addr': (0, 11)}), + 'regRLC_SPM_SE_MUXSEL_DATA': (15499, 1, {'sel0': (0, 15), 'sel1': (16, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_ADDR': (15506, 1, {'addr': (0, 6), 'reserved': (7, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_DATA': (15507, 1, {'data': (0, 31)}), + 'regRLC_SPM_ACCUM_SWA_DATARAM_ADDR': (15508, 1, {'addr': (0, 6), 'reserved': (7, 31)}), + 'regRLC_SPM_ACCUM_SWA_DATARAM_DATA': (15509, 1, {'data': (0, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_ADDR': (15510, 1, {'addr': (0, 10), 'reserved': (11, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_DATA': (15511, 1, {'data': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_ADDR_OFFSET': (15512, 1, {'global_offset': (0, 7), 'spmwithaccum_se_offset': (8, 15), 'spmwithaccum_global_offset': (16, 23), 'reserved': (24, 31)}), + 'regRLC_SPM_ACCUM_STATUS': (15513, 1, {'numbsamplescompleted': (0, 7), 'accumdone': (8, 8), 'spmdone': (9, 9), 'accumoverflow': (10, 10), 'accumarmed': (11, 11), 'sequenceinprogress': (12, 12), 'finalsequenceinprogress': (13, 13), 'allfifosempty': (14, 14), 'fsmisidle': (15, 15), 'swaaccumdone': (16, 16), 'swaspmdone': (17, 17), 'swaaccumoverflow': (18, 18), 'swaaccumarmed': (19, 19), 'allsegsdone': (20, 20), 'rearmswapending': (21, 21), 'rearmspppending': (22, 22), 'multisampleaborted': (23, 23), 'reserved': (24, 31)}), + 'regRLC_SPM_ACCUM_CTRL': (15514, 1, {'stroberesetperfmonitors': (0, 0), 'strobestartaccumulation': (1, 1), 'stroberearmaccum': (2, 2), 'stroberesetspmblock': (3, 3), 'strobestartspm': (4, 7), 'stroberearmswaaccum': (8, 8), 'strobestartswa': (9, 9), 'strobeperfmonsamplewires': (10, 10), 'reserved': (11, 31)}), + 'regRLC_SPM_ACCUM_MODE': (15515, 1, {'enableaccum': (0, 0), 'enablespmwithaccummode': (1, 1), 'enablesppmode': (2, 2), 'autoresetperfmondisable': (3, 3), 'autoaccumen': (5, 5), 'swaautoaccumen': (6, 6), 'autospmen': (7, 7), 'swaautospmen': (8, 8), 'globals_loadoverride': (9, 9), 'globals_swaloadoverride': (10, 10), 'se0_loadoverride': (11, 11), 'se0_swaloadoverride': (12, 12), 'se1_loadoverride': (13, 13), 'se1_swaloadoverride': (14, 14), 'se2_loadoverride': (15, 15), 'se2_swaloadoverride': (16, 16)}), + 'regRLC_SPM_ACCUM_THRESHOLD': (15516, 1, {'threshold': (0, 15)}), + 'regRLC_SPM_ACCUM_SAMPLES_REQUESTED': (15517, 1, {'samplesrequested': (0, 7)}), + 'regRLC_SPM_ACCUM_DATARAM_WRCOUNT': (15518, 1, {'dataramwrcount': (0, 18), 'reserved': (19, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_32BITCNTRS_REGIONS': (15519, 1, {'spp_addr_region': (0, 7), 'swa_addr_region': (8, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_PAUSE': (15522, 1, {'pause': (0, 0), 'paused': (1, 1)}), + 'regRLC_SPM_STATUS': (15523, 1, {'ctl_busy': (0, 0), 'rspm_reg_busy': (1, 1), 'spm_rspm_busy': (2, 2), 'spm_rspm_io_busy': (3, 3), 'se_rspm_io_busy': (4, 11), 'accum_busy': (15, 15), 'fsm_master_state': (16, 19), 'fsm_memory_state': (20, 23), 'ctl_req_state': (24, 25), 'ctl_ret_state': (26, 26)}), + 'regRLC_SPM_GFXCLOCK_LOWCOUNT': (15524, 1, {'gfxclock_lowcount': (0, 31)}), + 'regRLC_SPM_GFXCLOCK_HIGHCOUNT': (15525, 1, {'gfxclock_highcount': (0, 31)}), + 'regRLC_SPM_MODE': (15533, 1, {'mode': (0, 0)}), + 'regRLC_SPM_RSPM_REQ_DATA_LO': (15534, 1, {'data': (0, 31)}), + 'regRLC_SPM_RSPM_REQ_DATA_HI': (15535, 1, {'data': (0, 11)}), + 'regRLC_SPM_RSPM_REQ_OP': (15536, 1, {'op': (0, 3)}), + 'regRLC_SPM_RSPM_RET_DATA': (15537, 1, {'data': (0, 31)}), + 'regRLC_SPM_RSPM_RET_OP': (15538, 1, {'op': (0, 3), 'valid': (8, 8)}), + 'regRLC_SPM_SE_RSPM_REQ_DATA_LO': (15539, 1, {'data': (0, 31)}), + 'regRLC_SPM_SE_RSPM_REQ_DATA_HI': (15540, 1, {'data': (0, 11)}), + 'regRLC_SPM_SE_RSPM_REQ_OP': (15541, 1, {'op': (0, 3)}), + 'regRLC_SPM_SE_RSPM_RET_DATA': (15542, 1, {'data': (0, 31)}), + 'regRLC_SPM_SE_RSPM_RET_OP': (15543, 1, {'op': (0, 3), 'valid': (8, 8)}), + 'regRLC_SPM_RSPM_CMD': (15544, 1, {'cmd': (0, 3)}), + 'regRLC_SPM_RSPM_CMD_ACK': (15545, 1, {'se0_ack': (0, 0), 'se1_ack': (1, 1), 'se2_ack': (2, 2), 'se3_ack': (3, 3), 'se4_ack': (4, 4), 'se5_ack': (5, 5), 'se6_ack': (6, 6), 'se7_ack': (7, 7), 'spm_ack': (8, 8)}), + 'regRLC_SPM_SPARE': (15551, 1, {'spare': (0, 31)}), + 'regRLC_PERFMON_CNTL': (15552, 1, {'perfmon_state': (0, 2), 'perfmon_sample_enable': (10, 10)}), + 'regRLC_PERFCOUNTER0_SELECT': (15553, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_PERFCOUNTER1_SELECT': (15554, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_GPU_IOV_PERF_CNT_CNTL': (15555, 1, {'enable': (0, 0), 'mode_select': (1, 1), 'reset': (2, 2), 'reserved': (3, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_WR_ADDR': (15556, 1, {'vfid': (0, 3), 'cnt_id': (4, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_WR_DATA': (15557, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_RD_ADDR': (15558, 1, {'vfid': (0, 3), 'cnt_id': (4, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_IOV_PERF_CNT_RD_DATA': (15559, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_VF_ENABLE': (23296, 1, {'vf_enable': (0, 0), 'reserved': (1, 15), 'vf_num': (16, 31)}), + 'regRLC_GPU_IOV_CFG_REG6': (23302, 1, {'cntxt_size': (0, 6), 'cntxt_location': (7, 7), 'reserved': (8, 9), 'cntxt_offset': (10, 31)}), + 'regRLC_SDMA0_STATUS': (23320, 1, {'status': (0, 31)}), + 'regRLC_SDMA1_STATUS': (23321, 1, {'status': (0, 31)}), + 'regRLC_SDMA2_STATUS': (23322, 1, {'status': (0, 31)}), + 'regRLC_SDMA3_STATUS': (23323, 1, {'status': (0, 31)}), + 'regRLC_SDMA0_BUSY_STATUS': (23324, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA1_BUSY_STATUS': (23325, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA2_BUSY_STATUS': (23326, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA3_BUSY_STATUS': (23327, 1, {'busy_status': (0, 31)}), + 'regRLC_GPU_IOV_CFG_REG8': (23328, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_RLCV_TIMER_INT_0': (23333, 1, {'timer': (0, 31)}), + 'regRLC_RLCV_TIMER_INT_1': (23334, 1, {'timer': (0, 31)}), + 'regRLC_RLCV_TIMER_CTRL': (23335, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_0_auto_rearm': (2, 2), 'timer_1_auto_rearm': (3, 3), 'timer_0_int_clear': (4, 4), 'timer_1_int_clear': (5, 5), 'reserved': (6, 31)}), + 'regRLC_RLCV_TIMER_STAT': (23336, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'reserved': (2, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_0_auto_rearm_sync': (10, 10), 'timer_1_auto_rearm_sync': (11, 11)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS': (23338, 1, {'vf_doorbell_status': (0, 30), 'pf_doorbell_status': (31, 31)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS_SET': (23339, 1, {'vf_doorbell_status_set': (0, 30), 'pf_doorbell_status_set': (31, 31)}), + 'regRLC_GPU_IOV_VF_DOORBELL_STATUS_CLR': (23340, 1, {'vf_doorbell_status_clr': (0, 30), 'pf_doorbell_status_clr': (31, 31)}), + 'regRLC_GPU_IOV_VF_MASK': (23341, 1, {'vf_mask': (0, 30)}), + 'regRLC_HYP_SEMAPHORE_0': (23342, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_HYP_SEMAPHORE_1': (23343, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_BUSY_CLK_CNTL': (23344, 1, {'busy_off_latency': (0, 5), 'grbm_busy_off_latency': (8, 13)}), + 'regRLC_CLK_CNTL': (23345, 1, {'rlc_srm_icg_override': (0, 0), 'rlc_imu_icg_override': (1, 1), 'rlc_spm_icg_override': (2, 2), 'rlc_spm_rspm_icg_override': (3, 3), 'rlc_gpm_icg_override': (4, 4), 'rlc_cmn_icg_override': (5, 5), 'rlc_tc_icg_override': (6, 6), 'rlc_reg_icg_override': (7, 7), 'rlc_sram_clk_gater_override': (8, 8), 'reserved_9': (9, 9), 'rlc_spp_icg_override': (10, 10), 'reserved_11': (11, 11), 'rlc_tc_fgcg_rep_override': (12, 12), 'rlc_dfll_icg_override': (13, 13), 'reserved_15': (15, 15), 'rlc_lx6_core_icg_override': (16, 16), 'rlc_lx6_icg_override': (17, 17), 'rlc_utcl2_fgcg_override': (18, 18), 'rlc_ih_gasket_icg_override': (19, 19), 'reserved': (20, 31)}), + 'regRLC_PACE_TIMER_STAT': (23347, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'reserved': (2, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_0_auto_rearm_sync': (10, 10), 'timer_1_auto_rearm_sync': (11, 11)}), + 'regRLC_GPU_IOV_SCH_BLOCK': (23348, 1, {'sch_block_id': (0, 3), 'sch_block_ver': (4, 7), 'sch_block_size': (8, 15), 'reserved': (16, 31)}), + 'regRLC_GPU_IOV_CFG_REG1': (23349, 1, {'cmd_type': (0, 3), 'cmd_execute': (4, 4), 'cmd_execute_intr_en': (5, 5), 'reserved': (6, 7), 'fcn_id': (8, 15), 'next_fcn_id': (16, 23), 'reserved1': (24, 31)}), + 'regRLC_GPU_IOV_CFG_REG2': (23350, 1, {'cmd_status': (0, 3), 'reserved': (4, 31)}), + 'regRLC_GPU_IOV_VM_BUSY_STATUS': (23351, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SCH_0': (23352, 1, {'active_functions': (0, 31)}), + 'regRLC_GPU_IOV_ACTIVE_FCN_ID': (23353, 1, {'vf_id': (0, 3), 'reserved_7_4': (4, 7), 'active_fcn_id_status': (8, 11), 'reserved_30_12': (12, 30), 'pf_vf': (31, 31)}), + 'regRLC_GPU_IOV_SCH_3': (23354, 1, {'time_quanta_def': (0, 31)}), + 'regRLC_GPU_IOV_SCH_1': (23355, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_SCH_2': (23356, 1, {'data': (0, 31)}), + 'regRLC_PACE_INT_FORCE': (23357, 1, {'force_int': (0, 31)}), + 'regRLC_PACE_INT_CLEAR': (23358, 1, {'smu_stretch_pcc_clear': (0, 0), 'smu_pcc_clear': (1, 1)}), + 'regRLC_GPU_IOV_INT_STAT': (23359, 1, {'status': (0, 31)}), + 'regRLC_IH_COOKIE': (23361, 1, {'data': (0, 31)}), + 'regRLC_IH_COOKIE_CNTL': (23362, 1, {'credit': (0, 1), 'reset_counter': (2, 2)}), + 'regRLC_HYP_RLCG_UCODE_CHKSUM': (23363, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_HYP_RLCP_UCODE_CHKSUM': (23364, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_HYP_RLCV_UCODE_CHKSUM': (23365, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_GPU_IOV_F32_CNTL': (23366, 1, {'enable': (0, 0)}), + 'regRLC_GPU_IOV_F32_RESET': (23367, 1, {'reset': (0, 0)}), + 'regRLC_GPU_IOV_UCODE_ADDR': (23368, 1, {'ucode_addr': (0, 11), 'reserved': (12, 31)}), + 'regRLC_GPU_IOV_UCODE_DATA': (23369, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPU_IOV_SMU_RESPONSE': (23370, 1, {'resp': (0, 31)}), + 'regRLC_GPU_IOV_F32_INVALIDATE_CACHE': (23371, 1, {'invalidate_cache': (0, 0)}), + 'regRLC_GPU_IOV_VIRT_RESET_REQ': (23372, 1, {'vf_flr': (0, 30), 'soft_pf_flr': (31, 31)}), + 'regRLC_GPU_IOV_RLC_RESPONSE': (23373, 1, {'resp': (0, 31)}), + 'regRLC_GPU_IOV_INT_DISABLE': (23374, 1, {'disable_int': (0, 31)}), + 'regRLC_GPU_IOV_INT_FORCE': (23375, 1, {'force_int': (0, 31)}), + 'regRLC_GPU_IOV_SCRATCH_ADDR': (23376, 1, {'addr': (0, 15)}), + 'regRLC_GPU_IOV_SCRATCH_DATA': (23377, 1, {'data': (0, 31)}), + 'regRLC_HYP_SEMAPHORE_2': (23378, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_HYP_SEMAPHORE_3': (23379, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_LX6_SCRATCH_ADDR': (23385, 1, {'addr': (0, 7)}), + 'regRLC_LX6_CORE1_SCRATCH_ADDR': (23387, 1, {'addr': (0, 7)}), + 'regRLC_GPM_UCODE_ADDR': (23392, 1, {'ucode_addr': (0, 13), 'reserved': (14, 31)}), + 'regRLC_GPM_UCODE_DATA': (23393, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPM_IRAM_ADDR': (23394, 1, {'addr': (0, 31)}), + 'regRLC_GPM_IRAM_DATA': (23395, 1, {'data': (0, 31)}), + 'regRLC_RLCP_IRAM_ADDR': (23396, 1, {'addr': (0, 31)}), + 'regRLC_RLCP_IRAM_DATA': (23397, 1, {'data': (0, 31)}), + 'regRLC_RLCV_IRAM_ADDR': (23398, 1, {'addr': (0, 31)}), + 'regRLC_RLCV_IRAM_DATA': (23399, 1, {'data': (0, 31)}), + 'regRLC_LX6_DRAM_ADDR': (23400, 1, {'addr': (0, 10)}), + 'regRLC_LX6_DRAM_DATA': (23401, 1, {'data': (0, 31)}), + 'regRLC_LX6_IRAM_ADDR': (23402, 1, {'addr': (0, 11)}), + 'regRLC_LX6_IRAM_DATA': (23403, 1, {'data': (0, 31)}), + 'regRLC_PACE_UCODE_ADDR': (23404, 1, {'ucode_addr': (0, 11), 'reserved': (12, 31)}), + 'regRLC_PACE_UCODE_DATA': (23405, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPM_SCRATCH_ADDR': (23406, 1, {'addr': (0, 15)}), + 'regRLC_GPM_SCRATCH_DATA': (23407, 1, {'data': (0, 31)}), + 'regRLC_SRM_DRAM_ADDR': (23409, 1, {'addr': (0, 12), 'reserved': (13, 31)}), + 'regRLC_SRM_DRAM_DATA': (23410, 1, {'data': (0, 31)}), + 'regRLC_SRM_ARAM_ADDR': (23411, 1, {'addr': (0, 12), 'reserved': (13, 31)}), + 'regRLC_SRM_ARAM_DATA': (23412, 1, {'data': (0, 31)}), + 'regRLC_PACE_SCRATCH_ADDR': (23415, 1, {'addr': (0, 15)}), + 'regRLC_PACE_SCRATCH_DATA': (23416, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_LSB': (23417, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_MSB': (23418, 1, {'data': (0, 31)}), + 'regRLC_GPU_IOV_SDMA0_STATUS': (23488, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA1_STATUS': (23489, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA2_STATUS': (23490, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA3_STATUS': (23491, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA4_STATUS': (23492, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA5_STATUS': (23493, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA6_STATUS': (23494, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA7_STATUS': (23495, 1, {'status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA0_BUSY_STATUS': (23496, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA1_BUSY_STATUS': (23497, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA2_BUSY_STATUS': (23498, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA3_BUSY_STATUS': (23499, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA4_BUSY_STATUS': (23500, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA5_BUSY_STATUS': (23501, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA6_BUSY_STATUS': (23502, 1, {'vm_busy_status': (0, 31)}), + 'regRLC_GPU_IOV_SDMA7_BUSY_STATUS': (23503, 1, {'vm_busy_status': (0, 31)}), + 'regCP_MEC_ME1_UCODE_ADDR': (22554, 1, {'ucode_addr': (0, 19)}), + 'regCP_MEC_ME1_UCODE_DATA': (22555, 1, {'ucode_data': (0, 31)}), + 'regCP_MEC_ME2_UCODE_ADDR': (22556, 1, {'ucode_addr': (0, 19)}), + 'regCP_MEC_ME2_UCODE_DATA': (22557, 1, {'ucode_data': (0, 31)}), + 'regCP_MEC_DC_BASE_LO': (22640, 1, {'dc_base_lo': (16, 31)}), + 'regCP_MEC_MDBASE_LO': (22640, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_DC_BASE_HI': (22641, 1, {'dc_base_hi': (0, 15)}), + 'regCP_MEC_MDBASE_HI': (22641, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_MIBOUND_LO': (22642, 1, {'bound_lo': (0, 31)}), + 'regCP_MEC_MIBOUND_HI': (22643, 1, {'bound_hi': (0, 31)}), + 'regCP_MEC_MDBOUND_LO': (22644, 1, {'bound_lo': (0, 31)}), + 'regCP_MEC_MDBOUND_HI': (22645, 1, {'bound_hi': (0, 31)}), + 'regGRBM_GFX_INDEX_SR_SELECT': (23040, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_INDEX_SR_DATA': (23041, 1, {'instance_index': (0, 7), 'sa_index': (8, 15), 'se_index': (16, 23), 'sa_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_SELECT': (23042, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_DATA': (23043, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10)}), + 'regGRBM_SE_REMAP_CNTL': (23048, 1, {'se0_remap_en': (0, 0), 'se0_remap': (1, 3), 'se1_remap_en': (4, 4), 'se1_remap': (5, 7), 'se2_remap_en': (8, 8), 'se2_remap': (9, 11), 'se3_remap_en': (12, 12), 'se3_remap': (13, 15), 'se4_remap_en': (16, 16), 'se4_remap': (17, 19), 'se5_remap_en': (20, 20), 'se5_remap': (21, 23), 'se6_remap_en': (24, 24), 'se6_remap': (25, 27), 'se7_remap_en': (28, 28), 'se7_remap': (29, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF0': (23168, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF1': (23169, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF2': (23170, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF3': (23171, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF4': (23172, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF5': (23173, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF6': (23174, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF7': (23175, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF8': (23176, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF9': (23177, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF10': (23178, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF11': (23179, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF12': (23180, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF13': (23181, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF14': (23182, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regGCMC_VM_FB_SIZE_OFFSET_VF15': (23183, 1, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regRLC_CNTL': (19456, 1, {'rlc_enable_f32': (0, 0), 'force_retry': (1, 1), 'read_cache_disable': (2, 2), 'rlc_step_f32': (3, 3), 'reserved': (4, 31)}), + 'regRLC_F32_UCODE_VERSION': (19459, 1, {'thread0_version': (0, 9), 'thread1_version': (10, 19), 'thread2_version': (20, 29)}), + 'regRLC_STAT': (19460, 1, {'rlc_busy': (0, 0), 'rlc_srm_busy': (1, 1), 'rlc_gpm_busy': (2, 2), 'rlc_spm_busy': (3, 3), 'mc_busy': (4, 4), 'rlc_thread_0_busy': (5, 5), 'rlc_thread_1_busy': (6, 6), 'rlc_thread_2_busy': (7, 7), 'reserved': (8, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_LSB': (19468, 1, {'timestamp_lsb': (0, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_MSB': (19469, 1, {'timestamp_msb': (0, 31)}), + 'regRLC_GPM_TIMER_INT_0': (19470, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_1': (19471, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_2': (19472, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_3': (19473, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_4': (19474, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_CTRL': (19475, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_2_en': (2, 2), 'timer_3_en': (3, 3), 'timer_4_en': (4, 4), 'reserved_1': (5, 7), 'timer_0_auto_rearm': (8, 8), 'timer_1_auto_rearm': (9, 9), 'timer_2_auto_rearm': (10, 10), 'timer_3_auto_rearm': (11, 11), 'timer_4_auto_rearm': (12, 12), 'reserved_2': (13, 15), 'timer_0_int_clear': (16, 16), 'timer_1_int_clear': (17, 17), 'timer_2_int_clear': (18, 18), 'timer_3_int_clear': (19, 19), 'timer_4_int_clear': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_TIMER_STAT': (19476, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'timer_2_stat': (2, 2), 'timer_3_stat': (3, 3), 'timer_4_stat': (4, 4), 'reserved_1': (5, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_2_enable_sync': (10, 10), 'timer_3_enable_sync': (11, 11), 'timer_4_enable_sync': (12, 12), 'reserved_2': (13, 15), 'timer_0_auto_rearm_sync': (16, 16), 'timer_1_auto_rearm_sync': (17, 17), 'timer_2_auto_rearm_sync': (18, 18), 'timer_3_auto_rearm_sync': (19, 19), 'timer_4_auto_rearm_sync': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_LEGACY_INT_STAT': (19478, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3), 'store_load_timer3_expired_t0': (4, 4)}), + 'regRLC_GPM_LEGACY_INT_CLEAR': (19479, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3), 'reserved_4': (4, 4)}), + 'regRLC_INT_STAT': (19480, 1, {'last_cp_rlc_int_id': (0, 7), 'cp_rlc_int_pending': (8, 8), 'reserved': (9, 31)}), + 'regRLC_MGCG_CTRL': (19482, 1, {'mgcg_en': (0, 0), 'silicon_en': (1, 1), 'simulation_en': (2, 2), 'on_delay': (3, 6), 'off_hysteresis': (7, 14), 'spare': (15, 31)}), + 'regRLC_JUMP_TABLE_RESTORE': (19486, 1, {'addr': (0, 31)}), + 'regRLC_PG_DELAY_2': (19487, 1, {'serdes_timeout_value': (0, 7), 'serdes_cmd_delay': (8, 15), 'perwgp_timeout_value': (16, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB': (19492, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB': (19493, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT': (19494, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_UCODE_CNTL': (19495, 1, {'rlc_ucode_flags': (0, 31)}), + 'regRLC_GPM_THREAD_RESET': (19496, 1, {'thread0_reset': (0, 0), 'thread1_reset': (1, 1), 'thread2_reset': (2, 2), 'thread3_reset': (3, 3), 'reserved': (4, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T0': (19497, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T1': (19498, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_THREAD_INVALIDATE_CACHE': (19499, 1, {'thread0_invalidate_cache': (0, 0), 'thread1_invalidate_cache': (1, 1), 'thread2_invalidate_cache': (2, 2), 'thread3_invalidate_cache': (3, 3), 'reserved': (4, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_LSB': (19504, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_MSB': (19505, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_LSB': (19506, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_MSB': (19507, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_CTRL': (19508, 1, {'gfxclk_run': (0, 0), 'gfxclk_reset': (1, 1), 'gfxclk_sample': (2, 2), 'refclk_run': (3, 3), 'refclk_reset': (4, 4), 'refclk_sample': (5, 5)}), + 'regRLC_CLK_COUNT_STAT': (19509, 1, {'gfxclk_valid': (0, 0), 'refclk_valid': (1, 1), 'refclk_run_resync': (2, 2), 'refclk_reset_resync': (3, 3), 'refclk_sample_resync': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCG_DOORBELL_CNTL': (19510, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21), 'reserved': (22, 31)}), + 'regRLC_RLCG_DOORBELL_STAT': (19511, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCG_DOORBELL_0_DATA_LO': (19512, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_0_DATA_HI': (19513, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_1_DATA_LO': (19514, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_1_DATA_HI': (19515, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_2_DATA_LO': (19516, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_2_DATA_HI': (19517, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_3_DATA_LO': (19518, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_3_DATA_HI': (19519, 1, {'data': (0, 31)}), + 'regRLC_GPU_CLOCK_32_RES_SEL': (19521, 1, {'res_sel': (0, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_CLOCK_32': (19522, 1, {'gpu_clock_32': (0, 31)}), + 'regRLC_PG_CNTL': (19523, 1, {'gfx_power_gating_enable': (0, 0), 'gfx_power_gating_src': (1, 1), 'dyn_per_wgp_pg_enable': (2, 2), 'static_per_wgp_pg_enable': (3, 3), 'gfx_pipeline_pg_enable': (4, 4), 'reserved': (5, 12), 'mem_ds_disable': (13, 13), 'pg_override': (14, 14), 'cp_pg_disable': (15, 15), 'chub_handshake_enable': (16, 16), 'smu_clk_slowdown_on_pu_enable': (17, 17), 'smu_clk_slowdown_on_pd_enable': (18, 18), 'reserved1': (19, 20), 'ultra_low_voltage_enable': (21, 21), 'reserved2': (22, 22), 'smu_handshake_disable': (23, 23)}), + 'regRLC_GPM_THREAD_PRIORITY': (19524, 1, {'thread0_priority': (0, 7), 'thread1_priority': (8, 15), 'thread2_priority': (16, 23), 'thread3_priority': (24, 31)}), + 'regRLC_GPM_THREAD_ENABLE': (19525, 1, {'thread0_enable': (0, 0), 'thread1_enable': (1, 1), 'thread2_enable': (2, 2), 'thread3_enable': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCG_DOORBELL_RANGE': (19527, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_CGTT_MGCG_OVERRIDE': (19528, 1, {'rlc_repeater_fgcg_override': (0, 0), 'rlc_cgtt_sclk_override': (1, 1), 'gfxip_mgcg_override': (2, 2), 'gfxip_cgcg_override': (3, 3), 'gfxip_cgls_override': (4, 4), 'grbm_cgtt_sclk_override': (5, 5), 'gfxip_mgls_override': (6, 6), 'gfxip_gfx3d_cg_override': (7, 7), 'gfxip_fgcg_override': (8, 8), 'gfxip_repeater_fgcg_override': (9, 9), 'perfmon_clock_state': (10, 10), 'reserved_16_11': (11, 16), 'gc_cac_mgcg_clk_cntl': (17, 17), 'se_cac_mgcg_clk_cntl': (18, 18), 'reserved_31_19': (19, 31)}), + 'regRLC_CGCG_CGLS_CTRL': (19529, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL': (19530, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_DYN_PG_STATUS': (19531, 1, {'pg_status_wgp_mask': (0, 31)}), + 'regRLC_DYN_PG_REQUEST': (19532, 1, {'pg_request_wgp_mask': (0, 31)}), + 'regRLC_PG_DELAY': (19533, 1, {'power_up_delay': (0, 7), 'power_down_delay': (8, 15), 'cmd_propagate_delay': (16, 23), 'mem_sleep_delay': (24, 31)}), + 'regRLC_WGP_STATUS': (19534, 1, {'work_pending': (0, 31)}), + 'regRLC_PG_ALWAYS_ON_WGP_MASK': (19539, 1, {'aon_wgp_mask': (0, 31)}), + 'regRLC_MAX_PG_WGP': (19540, 1, {'max_powered_up_wgp': (0, 7), 'spare': (8, 31)}), + 'regRLC_AUTO_PG_CTRL': (19541, 1, {'auto_pg_en': (0, 0), 'auto_grbm_reg_save_on_idle_en': (1, 1), 'auto_wake_up_en': (2, 2), 'grbm_reg_save_gfx_idle_threshold': (3, 18), 'pg_after_grbm_reg_save_threshold': (19, 31)}), + 'regRLC_SERDES_RD_INDEX': (19545, 1, {'data_reg_id': (0, 1), 'spare': (2, 31)}), + 'regRLC_SERDES_RD_DATA_0': (19546, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_1': (19547, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_2': (19548, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_3': (19549, 1, {'data': (0, 31)}), + 'regRLC_SERDES_MASK': (19550, 1, {'gc_center_hub_0': (0, 0), 'gc_center_hub_1': (1, 1), 'reserved': (2, 15), 'gc_se_0': (16, 16), 'gc_se_1': (17, 17), 'gc_se_2': (18, 18), 'gc_se_3': (19, 19), 'gc_se_4': (20, 20), 'gc_se_5': (21, 21), 'gc_se_6': (22, 22), 'gc_se_7': (23, 23), 'reserved_31_24': (24, 31)}), + 'regRLC_SERDES_CTRL': (19551, 1, {'bpm_broadcast': (0, 0), 'bpm_reg_write': (1, 1), 'bpm_long_cmd': (2, 2), 'bpm_addr': (3, 15), 'reg_addr': (16, 23)}), + 'regRLC_SERDES_DATA': (19552, 1, {'data': (0, 31)}), + 'regRLC_SERDES_BUSY': (19553, 1, {'gc_center_hub_0': (0, 0), 'gc_center_hub_1': (1, 1), 'reserved': (2, 15), 'gc_se_0': (16, 16), 'gc_se_1': (17, 17), 'gc_se_2': (18, 18), 'gc_se_3': (19, 19), 'gc_se_4': (20, 20), 'gc_se_5': (21, 21), 'gc_se_6': (22, 22), 'gc_se_7': (23, 23), 'reserved_29_24': (24, 29), 'rd_fifo_not_empty': (30, 30), 'rd_pending': (31, 31)}), + 'regRLC_GPM_GENERAL_0': (19555, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_1': (19556, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_2': (19557, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_3': (19558, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_4': (19559, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_5': (19560, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_6': (19561, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_7': (19562, 1, {'data': (0, 31)}), + 'regRLC_STATIC_PG_STATUS': (19566, 1, {'pg_status_wgp_mask': (0, 31)}), + 'regRLC_GPM_GENERAL_16': (19574, 1, {'data': (0, 31)}), + 'regRLC_PG_DELAY_3': (19576, 1, {'cgcg_active_before_cgpg': (0, 7), 'reserved': (8, 31)}), + 'regRLC_GPR_REG1': (19577, 1, {'data': (0, 31)}), + 'regRLC_GPR_REG2': (19578, 1, {'data': (0, 31)}), + 'regRLC_GPM_INT_DISABLE_TH0': (19580, 1, {'disable_int': (0, 31)}), + 'regRLC_GPM_LEGACY_INT_DISABLE': (19581, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3), 'store_load_timer3_expired_t0': (4, 4)}), + 'regRLC_GPM_INT_FORCE_TH0': (19582, 1, {'force_int': (0, 31)}), + 'regRLC_SRM_CNTL': (19584, 1, {'srm_enable': (0, 0), 'auto_incr_addr': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_GPM_COMMAND_STATUS': (19592, 1, {'fifo_empty': (0, 0), 'fifo_full': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_0': (19595, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_1': (19596, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_2': (19597, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_3': (19598, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_4': (19599, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_5': (19600, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_6': (19601, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_7': (19602, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_DATA_0': (19603, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_1': (19604, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_2': (19605, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_3': (19606, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_4': (19607, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_5': (19608, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_6': (19609, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_7': (19610, 1, {'data': (0, 31)}), + 'regRLC_SRM_STAT': (19611, 1, {'srm_busy': (0, 0), 'srm_busy_delay': (1, 1), 'reserved': (2, 31)}), + 'regRLC_GPM_GENERAL_8': (19629, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_9': (19630, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_10': (19631, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_11': (19632, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_12': (19633, 1, {'data': (0, 31)}), + 'regRLC_GPM_UTCL1_CNTL_0': (19634, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_GPM_UTCL1_CNTL_1': (19635, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_GPM_UTCL1_CNTL_2': (19636, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_SPM_UTCL1_CNTL': (19637, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_UTCL1_STATUS_2': (19638, 1, {'gpm_th0_utcl1_busy': (0, 0), 'gpm_th1_utcl1_busy': (1, 1), 'gpm_th2_utcl1_busy': (2, 2), 'spm_utcl1_busy': (3, 3), 'reserved_1': (4, 4), 'gpm_th0_utcl1_stallontrans': (5, 5), 'gpm_th1_utcl1_stallontrans': (6, 6), 'gpm_th2_utcl1_stallontrans': (7, 7), 'spm_utcl1_stallontrans': (8, 8), 'reserved': (9, 31)}), + 'regRLC_SPM_UTCL1_ERROR_1': (19644, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_SPM_UTCL1_ERROR_2': (19645, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_1': (19646, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_2': (19648, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH1_ERROR_1': (19649, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH1_ERROR_2': (19650, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH2_ERROR_1': (19651, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH2_ERROR_2': (19652, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_CGCG_CGLS_CTRL_3D': (19653, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL_3D': (19654, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_SEMAPHORE_0': (19655, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_1': (19656, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_2': (19657, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_3': (19658, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_PACE_INT_STAT': (19660, 1, {'status': (0, 31)}), + 'regRLC_UTCL1_STATUS': (19668, 1, {'fault_detected': (0, 0), 'retry_detected': (1, 1), 'prt_detected': (2, 2), 'reserved': (3, 7), 'fault_utcl1id': (8, 13), 'reserved_1': (14, 15), 'retry_utcl1id': (16, 21), 'reserved_2': (22, 23), 'prt_utcl1id': (24, 29), 'reserved_3': (30, 31)}), + 'regRLC_R2I_CNTL_0': (19669, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_1': (19670, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_2': (19671, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_3': (19672, 1, {'data': (0, 31)}), + 'regRLC_GPM_INT_STAT_TH0': (19676, 1, {'status': (0, 31)}), + 'regRLC_GPM_GENERAL_13': (19677, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_14': (19678, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_15': (19679, 1, {'data': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_1': (19690, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_2': (19691, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_2': (19692, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_PACE_INT_DISABLE': (19693, 1, {'disable_int': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_2': (19695, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCV_DOORBELL_RANGE': (19696, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_RLCV_DOORBELL_CNTL': (19697, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21)}), + 'regRLC_RLCV_DOORBELL_STAT': (19698, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCV_DOORBELL_0_DATA_LO': (19699, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_0_DATA_HI': (19700, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_1_DATA_LO': (19701, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_1_DATA_HI': (19702, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_2_DATA_LO': (19703, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_2_DATA_HI': (19704, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_3_DATA_LO': (19705, 1, {'data': (0, 31)}), + 'regRLC_RLCV_DOORBELL_3_DATA_HI': (19706, 1, {'data': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_1': (19707, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_1': (19708, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_RLCV_SPARE_INT': (19712, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_FIREWALL_VIOLATION': (19714, 1, {'addr': (0, 31)}), + 'regRLC_PACE_TIMER_INT_0': (19716, 1, {'timer': (0, 31)}), + 'regRLC_PACE_TIMER_INT_1': (19717, 1, {'timer': (0, 31)}), + 'regRLC_PACE_TIMER_CTRL': (19718, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_0_auto_rearm': (2, 2), 'timer_1_auto_rearm': (3, 3), 'timer_0_int_clear': (4, 4), 'timer_1_int_clear': (5, 5), 'reserved': (6, 31)}), + 'regRLC_SMU_CLK_REQ': (19720, 1, {'valid': (0, 0)}), + 'regRLC_CP_STAT_INVAL_STAT': (19721, 1, {'cpg_stat_inval_pend': (0, 0), 'cpc_stat_inval_pend': (1, 1), 'cpf_stat_inval_pend': (2, 2), 'cpg_stat_inval_pend_changed': (3, 3), 'cpc_stat_inval_pend_changed': (4, 4), 'cpf_stat_inval_pend_changed': (5, 5)}), + 'regRLC_CP_STAT_INVAL_CTRL': (19722, 1, {'cpg_stat_inval_pend_en': (0, 0), 'cpc_stat_inval_pend_en': (1, 1), 'cpf_stat_inval_pend_en': (2, 2)}), + 'regRLC_SPARE': (19723, 1, {'spare': (0, 31)}), + 'regRLC_SPP_CTRL': (19724, 1, {'enable': (0, 0), 'enable_pprof': (1, 1), 'enable_pwr_opt': (2, 2), 'pause': (3, 3)}), + 'regRLC_SPP_SHADER_PROFILE_EN': (19725, 1, {'ps_enable': (0, 0), 'reserved_1': (1, 1), 'gs_enable': (2, 2), 'hs_enable': (3, 3), 'csg_enable': (4, 4), 'cs_enable': (5, 5), 'ps_stop_condition': (6, 6), 'reserved_7': (7, 7), 'gs_stop_condition': (8, 8), 'hs_stop_condition': (9, 9), 'csg_stop_condition': (10, 10), 'cs_stop_condition': (11, 11), 'ps_start_condition': (12, 12), 'cs_start_condition': (13, 13), 'force_miss': (14, 14), 'force_unlocked': (15, 15), 'enable_prof_info_lock': (16, 16)}), + 'regRLC_SPP_SSF_CAPTURE_EN': (19726, 1, {'ps_enable': (0, 0), 'reserved_1': (1, 1), 'gs_enable': (2, 2), 'hs_enable': (3, 3), 'csg_enable': (4, 4), 'cs_enable': (5, 5)}), + 'regRLC_SPP_SSF_THRESHOLD_0': (19727, 1, {'ps_threshold': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SPP_SSF_THRESHOLD_1': (19728, 1, {'gs_threshold': (0, 15), 'hs_threshold': (16, 31)}), + 'regRLC_SPP_SSF_THRESHOLD_2': (19729, 1, {'csg_threshold': (0, 15), 'cs_threshold': (16, 31)}), + 'regRLC_SPP_INFLIGHT_RD_ADDR': (19730, 1, {'addr': (0, 4)}), + 'regRLC_SPP_INFLIGHT_RD_DATA': (19731, 1, {'data': (0, 31)}), + 'regRLC_SPP_PROF_INFO_1': (19736, 1, {'sh_id': (0, 31)}), + 'regRLC_SPP_PROF_INFO_2': (19737, 1, {'sh_type': (0, 3), 'cam_hit': (4, 4), 'cam_lock': (5, 5), 'cam_conflict': (6, 6)}), + 'regRLC_SPP_GLOBAL_SH_ID': (19738, 1, {'sh_id': (0, 31)}), + 'regRLC_SPP_GLOBAL_SH_ID_VALID': (19739, 1, {'valid': (0, 0)}), + 'regRLC_SPP_STATUS': (19740, 1, {'reserved_0': (0, 0), 'ssf_busy': (1, 1), 'event_arb_busy': (2, 2), 'spp_busy': (31, 31)}), + 'regRLC_SPP_PVT_STAT_0': (19741, 1, {'level_0_counter': (0, 7), 'level_1_counter': (8, 15), 'level_2_counter': (16, 23), 'level_3_counter': (24, 31)}), + 'regRLC_SPP_PVT_STAT_1': (19742, 1, {'level_4_counter': (0, 7), 'level_5_counter': (8, 15), 'level_6_counter': (16, 23), 'level_7_counter': (24, 31)}), + 'regRLC_SPP_PVT_STAT_2': (19743, 1, {'level_8_counter': (0, 7), 'level_9_counter': (8, 15), 'level_10_counter': (16, 23), 'level_11_counter': (24, 31)}), + 'regRLC_SPP_PVT_STAT_3': (19744, 1, {'level_12_counter': (0, 7), 'level_13_counter': (8, 15), 'level_14_counter': (16, 23), 'level_15_counter': (24, 31)}), + 'regRLC_SPP_PVT_LEVEL_MAX': (19745, 1, {'level': (0, 3)}), + 'regRLC_SPP_STALL_STATE_UPDATE': (19746, 1, {'stall': (0, 0), 'enable': (1, 1)}), + 'regRLC_SPP_PBB_INFO': (19747, 1, {'pipe0_override': (0, 0), 'pipe0_override_valid': (1, 1), 'pipe1_override': (2, 2), 'pipe1_override_valid': (3, 3)}), + 'regRLC_SPP_RESET': (19748, 1, {'ssf_reset': (0, 0), 'event_arb_reset': (1, 1), 'cam_reset': (2, 2), 'pvt_reset': (3, 3)}), + 'regRLC_RLCP_DOORBELL_RANGE': (19750, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_RLCP_DOORBELL_CNTL': (19751, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21)}), + 'regRLC_RLCP_DOORBELL_STAT': (19752, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCP_DOORBELL_0_DATA_LO': (19753, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_0_DATA_HI': (19754, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_1_DATA_LO': (19755, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_1_DATA_HI': (19756, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_2_DATA_LO': (19757, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_2_DATA_HI': (19758, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_3_DATA_LO': (19759, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_3_DATA_HI': (19760, 1, {'data': (0, 31)}), + 'regRLC_CAC_MASK_CNTL': (19781, 1, {'rlc_cac_mask': (0, 31)}), + 'regRLC_POWER_RESIDENCY_CNTR_CTRL': (19784, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_CLK_RESIDENCY_CNTR_CTRL': (19785, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_DS_RESIDENCY_CNTR_CTRL': (19786, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_ULV_RESIDENCY_CNTR_CTRL': (19787, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_PCC_RESIDENCY_CNTR_CTRL': (19788, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'event_sel': (5, 8), 'reserved': (9, 31)}), + 'regRLC_GENERAL_RESIDENCY_CNTR_CTRL': (19789, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_POWER_RESIDENCY_EVENT_CNTR': (19792, 1, {'data': (0, 31)}), + 'regRLC_CLK_RESIDENCY_EVENT_CNTR': (19793, 1, {'data': (0, 31)}), + 'regRLC_DS_RESIDENCY_EVENT_CNTR': (19794, 1, {'data': (0, 31)}), + 'regRLC_ULV_RESIDENCY_EVENT_CNTR': (19795, 1, {'data': (0, 31)}), + 'regRLC_PCC_RESIDENCY_EVENT_CNTR': (19796, 1, {'data': (0, 31)}), + 'regRLC_GENERAL_RESIDENCY_EVENT_CNTR': (19797, 1, {'data': (0, 31)}), + 'regRLC_POWER_RESIDENCY_REF_CNTR': (19800, 1, {'data': (0, 31)}), + 'regRLC_CLK_RESIDENCY_REF_CNTR': (19801, 1, {'data': (0, 31)}), + 'regRLC_DS_RESIDENCY_REF_CNTR': (19802, 1, {'data': (0, 31)}), + 'regRLC_ULV_RESIDENCY_REF_CNTR': (19803, 1, {'data': (0, 31)}), + 'regRLC_PCC_RESIDENCY_REF_CNTR': (19804, 1, {'data': (0, 31)}), + 'regRLC_GENERAL_RESIDENCY_REF_CNTR': (19805, 1, {'data': (0, 31)}), + 'regRLC_GFX_IH_CLIENT_CTRL': (19806, 1, {'se_interrupt_mask': (0, 7), 'sdma_interrupt_mask': (8, 11), 'utcl2_interrupt_mask': (12, 12), 'pmm_interrupt_mask': (13, 13), 'fed_interrupt_mask': (14, 14), 'reserved_15': (15, 15), 'se_interrupt_error_clear': (16, 23), 'sdma_interrupt_error_clear': (24, 27), 'utcl2_interrupt_error_clear': (28, 28), 'pmm_interrupt_error_clear': (29, 29), 'fed_interrupt_error_clear': (30, 30), 'reserved_31': (31, 31)}), + 'regRLC_GFX_IH_ARBITER_STAT': (19807, 1, {'client_granted': (0, 15), 'reserved': (16, 27), 'last_client_granted': (28, 31)}), + 'regRLC_GFX_IH_CLIENT_SE_STAT_L': (19808, 1, {'se0_buffer_level': (0, 3), 'se0_buffer_loading': (4, 4), 'se0_buffer_overflow': (5, 5), 'se0_protocol_error': (6, 6), 'se0_reserved': (7, 7), 'se1_buffer_level': (8, 11), 'se1_buffer_loading': (12, 12), 'se1_buffer_overflow': (13, 13), 'se1_protocol_error': (14, 14), 'se1_reserved': (15, 15), 'se2_buffer_level': (16, 19), 'se2_buffer_loading': (20, 20), 'se2_buffer_overflow': (21, 21), 'se2_protocol_error': (22, 22), 'se2_reserved': (23, 23), 'se3_buffer_level': (24, 27), 'se3_buffer_loading': (28, 28), 'se3_buffer_overflow': (29, 29), 'se3_protocol_error': (30, 30), 'se3_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_SE_STAT_H': (19809, 1, {'se4_buffer_level': (0, 3), 'se4_buffer_loading': (4, 4), 'se4_buffer_overflow': (5, 5), 'se4_protocol_error': (6, 6), 'se4_reserved': (7, 7), 'se5_buffer_level': (8, 11), 'se5_buffer_loading': (12, 12), 'se5_buffer_overflow': (13, 13), 'se5_protocol_error': (14, 14), 'se5_reserved': (15, 15), 'se6_buffer_level': (16, 19), 'se6_buffer_loading': (20, 20), 'se6_buffer_overflow': (21, 21), 'se6_protocol_error': (22, 22), 'se6_reserved': (23, 23), 'se7_buffer_level': (24, 27), 'se7_buffer_loading': (28, 28), 'se7_buffer_overflow': (29, 29), 'se7_protocol_error': (30, 30), 'se7_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_SDMA_STAT': (19810, 1, {'sdma0_buffer_level': (0, 3), 'sdma0_buffer_loading': (4, 4), 'sdma0_buffer_overflow': (5, 5), 'sdma0_protocol_error': (6, 6), 'sdma0_reserved': (7, 7), 'sdma1_buffer_level': (8, 11), 'sdma1_buffer_loading': (12, 12), 'sdma1_buffer_overflow': (13, 13), 'sdma1_protocol_error': (14, 14), 'sdma1_reserved': (15, 15), 'sdma2_buffer_level': (16, 19), 'sdma2_buffer_loading': (20, 20), 'sdma2_buffer_overflow': (21, 21), 'sdma2_protocol_error': (22, 22), 'sdma2_reserved': (23, 23), 'sdma3_buffer_level': (24, 27), 'sdma3_buffer_loading': (28, 28), 'sdma3_buffer_overflow': (29, 29), 'sdma3_protocol_error': (30, 30), 'sdma3_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_OTHER_STAT': (19811, 1, {'utcl2_buffer_level': (0, 3), 'utcl2_buffer_loading': (4, 4), 'utcl2_buffer_overflow': (5, 5), 'utcl2_protocol_error': (6, 6), 'utcl2_reserved': (7, 7), 'pmm_buffer_level': (8, 11), 'pmm_buffer_loading': (12, 12), 'pmm_buffer_overflow': (13, 13), 'pmm_protocol_error': (14, 14), 'pmm_reserved': (15, 15), 'fed_buffer_level': (16, 19), 'fed_buffer_loading': (20, 20), 'fed_buffer_overflow': (21, 21), 'fed_protocol_error': (22, 22), 'fed_reserved': (23, 23), 'reserved_31_24': (24, 31)}), + 'regRLC_SPM_GLOBAL_DELAY_IND_ADDR': (19812, 1, {'addr': (0, 11)}), + 'regRLC_SPM_GLOBAL_DELAY_IND_DATA': (19813, 1, {'data': (0, 5)}), + 'regRLC_SPM_SE_DELAY_IND_ADDR': (19814, 1, {'addr': (0, 11)}), + 'regRLC_SPM_SE_DELAY_IND_DATA': (19815, 1, {'data': (0, 5)}), + 'regRLC_LX6_CNTL': (19840, 1, {'breset': (0, 0), 'runstall': (1, 1), 'pdebug_enable': (2, 2), 'stat_vector_sel': (3, 3)}), + 'regRLC_XT_CORE_STATUS': (19924, 1, {'p_wait_mode': (0, 0), 'p_fatal_error': (1, 1), 'double_exception_error': (2, 2)}), + 'regRLC_XT_CORE_INTERRUPT': (19925, 1, {'extint1': (0, 25), 'extint2': (26, 26), 'nmi': (27, 27)}), + 'regRLC_XT_CORE_FAULT_INFO': (19926, 1, {'fault_info': (0, 31)}), + 'regRLC_XT_CORE_ALT_RESET_VEC': (19927, 1, {'alt_reset_vec': (0, 31)}), + 'regRLC_XT_CORE_RESERVED': (19928, 1, {'reserved': (0, 31)}), + 'regRLC_XT_INT_VEC_FORCE': (19929, 1, {'num_0': (0, 0), 'num_1': (1, 1), 'num_2': (2, 2), 'num_3': (3, 3), 'num_4': (4, 4), 'num_5': (5, 5), 'num_6': (6, 6), 'num_7': (7, 7), 'num_8': (8, 8), 'num_9': (9, 9), 'num_10': (10, 10), 'num_11': (11, 11), 'num_12': (12, 12), 'num_13': (13, 13), 'num_14': (14, 14), 'num_15': (15, 15), 'num_16': (16, 16), 'num_17': (17, 17), 'num_18': (18, 18), 'num_19': (19, 19), 'num_20': (20, 20), 'num_21': (21, 21), 'num_22': (22, 22), 'num_23': (23, 23), 'num_24': (24, 24), 'num_25': (25, 25)}), + 'regRLC_XT_INT_VEC_CLEAR': (19930, 1, {'num_0': (0, 0), 'num_1': (1, 1), 'num_2': (2, 2), 'num_3': (3, 3), 'num_4': (4, 4), 'num_5': (5, 5), 'num_6': (6, 6), 'num_7': (7, 7), 'num_8': (8, 8), 'num_9': (9, 9), 'num_10': (10, 10), 'num_11': (11, 11), 'num_12': (12, 12), 'num_13': (13, 13), 'num_14': (14, 14), 'num_15': (15, 15), 'num_16': (16, 16), 'num_17': (17, 17), 'num_18': (18, 18), 'num_19': (19, 19), 'num_20': (20, 20), 'num_21': (21, 21), 'num_22': (22, 22), 'num_23': (23, 23), 'num_24': (24, 24), 'num_25': (25, 25)}), + 'regRLC_XT_INT_VEC_MUX_SEL': (19931, 1, {'mux_sel': (0, 4)}), + 'regRLC_XT_INT_VEC_MUX_INT_SEL': (19932, 1, {'int_sel': (0, 5)}), + 'regRLC_GPU_CLOCK_COUNT_SPM_LSB': (19940, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_SPM_MSB': (19941, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_SPM_THREAD_TRACE_CTRL': (19942, 1, {'thread_trace_int_en': (0, 0)}), + 'regRLC_SPP_CAM_ADDR': (19944, 1, {'addr': (0, 7)}), + 'regRLC_SPP_CAM_DATA': (19945, 1, {'data': (0, 7), 'tag': (8, 31)}), + 'regRLC_SPP_CAM_EXT_ADDR': (19946, 1, {'addr': (0, 7)}), + 'regRLC_SPP_CAM_EXT_DATA': (19947, 1, {'valid': (0, 0), 'lock': (1, 1)}), + 'regRLC_CPAXI_DOORBELL_MON_CTRL': (19953, 1, {'en': (0, 0), 'id': (1, 5)}), + 'regRLC_CPAXI_DOORBELL_MON_STAT': (19954, 1, {'id_match': (0, 0), 'match_clear': (1, 1), 'addr': (2, 27)}), + 'regRLC_CPAXI_DOORBELL_MON_DATA_LSB': (19955, 1, {'data': (0, 31)}), + 'regRLC_CPAXI_DOORBELL_MON_DATA_MSB': (19956, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_RANGE': (19957, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_XT_DOORBELL_CNTL': (19958, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21)}), + 'regRLC_XT_DOORBELL_STAT': (19959, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_XT_DOORBELL_0_DATA_LO': (19960, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_0_DATA_HI': (19961, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_1_DATA_LO': (19962, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_1_DATA_HI': (19963, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_2_DATA_LO': (19964, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_2_DATA_HI': (19965, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_3_DATA_LO': (19966, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_3_DATA_HI': (19967, 1, {'data': (0, 31)}), + 'regRLC_MEM_SLP_CNTL': (19968, 1, {'rlc_mem_ls_en': (0, 0), 'rlc_mem_ds_en': (1, 1), 'rlc_srm_mem_ls_override': (2, 2), 'rlc_srm_mem_ds_override': (3, 3), 'rlc_spm_mem_ls_override': (4, 4), 'rlc_spm_mem_ds_override': (5, 5), 'reserved': (6, 6), 'rlc_ls_ds_busy_override': (7, 7), 'rlc_mem_ls_on_delay': (8, 15), 'rlc_mem_ls_off_delay': (16, 23), 'rlc_spp_mem_ls_override': (24, 24), 'rlc_spp_mem_ds_override': (25, 25), 'reserved1': (26, 31)}), + 'regRLC_RLCV_SAFE_MODE': (19970, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SMU_SAFE_MODE': (19971, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_RLCV_COMMAND': (19972, 1, {'cmd': (0, 3), 'reserved': (4, 31)}), + 'regRLC_SMU_MESSAGE': (19973, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_MESSAGE_1': (19974, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_MESSAGE_2': (19975, 1, {'cmd': (0, 31)}), + 'regRLC_SRM_GPM_COMMAND': (19976, 1, {'op': (0, 0), 'index_cntl': (1, 1), 'index_cntl_num': (2, 4), 'size': (5, 17), 'start_offset': (18, 30), 'dest_memory': (31, 31)}), + 'regRLC_SRM_GPM_ABORT': (19977, 1, {'abort': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SMU_COMMAND': (19978, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_ARGUMENT_1': (19979, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_2': (19980, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_3': (19981, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_4': (19982, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_5': (19983, 1, {'arg': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_ADDR_HI': (19984, 1, {'addr_hi': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_ADDR_LO': (19985, 1, {'addr_lo': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_SIZE': (19986, 1, {'size': (0, 25), 'reserved': (26, 31)}), + 'regRLC_IMU_MISC': (19990, 1, {'throttle_gfx': (0, 0), 'early_mgcg': (1, 1), 'reserved': (2, 31)}), + 'regRLC_IMU_RESET_VECTOR': (19991, 1, {'cold_boot_exit': (0, 0), 'vddgfx_exit': (1, 1), 'vector': (2, 7), 'reserved': (8, 31)}), + 'regRLC_RLCS_DEC_START': (20064, 1, {}), + 'regRLC_RLCS_DEC_DUMP_ADDR': (20065, 1, {}), + 'regRLC_RLCS_EXCEPTION_REG_1': (20066, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_2': (20067, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_3': (20068, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_4': (20069, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_CGCG_REQUEST': (20070, 1, {'cgcg_request': (0, 0), 'cgcg_request_3d': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_CGCG_STATUS': (20071, 1, {'cgcg_ramp_status': (0, 1), 'gfx_clk_status': (2, 2), 'cgcg_ramp_status_3d': (3, 4), 'gfx_clk_status_3d': (5, 5), 'reserved': (6, 31)}), + 'regRLC_RLCS_SOC_DS_CNTL': (20072, 1, {'soc_clk_ds_allow': (0, 0), 'soc_clk_ds_rlc_busy_mask': (1, 1), 'soc_clk_ds_cp_busy_mask': (2, 2), 'soc_clk_ds_gfx_pwr_stalled_mask': (6, 6), 'soc_clk_ds_non3d_pwr_stalled_mask': (7, 7), 'soc_clk_ds_sdma_0_busy_mask': (16, 16), 'soc_clk_ds_sdma_1_busy_mask': (17, 17), 'soc_clk_ds_sdma_2_busy_mask': (18, 18), 'soc_clk_ds_sdma_3_busy_mask': (19, 19), 'soc_clk_ds_sdma_4_busy_mask': (20, 20), 'soc_clk_ds_sdma_5_busy_mask': (21, 21), 'soc_clk_ds_sdma_6_busy_mask': (22, 22), 'soc_clk_ds_sdma_7_busy_mask': (23, 23)}), + 'regRLC_RLCS_GFX_DS_CNTL': (20073, 1, {'gfx_clk_ds_allow': (0, 0), 'gfx_clk_ds_rlc_busy_mask': (1, 1), 'gfx_clk_ds_cp_busy_mask': (2, 2), 'gfx_clk_ds_gfx_pwr_stalled_mask': (6, 6), 'gfx_clk_ds_non3d_pwr_stalled_mask': (7, 7), 'gfx_clk_ds_imu_disable_mask': (8, 8), 'gfx_clk_ds_sdma_0_busy_mask': (16, 16), 'gfx_clk_ds_sdma_1_busy_mask': (17, 17), 'gfx_clk_ds_sdma_2_busy_mask': (18, 18), 'gfx_clk_ds_sdma_3_busy_mask': (19, 19), 'gfx_clk_ds_sdma_4_busy_mask': (20, 20), 'gfx_clk_ds_sdma_5_busy_mask': (21, 21), 'gfx_clk_ds_sdma_6_busy_mask': (22, 22), 'gfx_clk_ds_sdma_7_busy_mask': (23, 23)}), + 'regRLC_RLCS_GFX_DS_ALLOW_MASK_CNTL': (20074, 1, {'gfx_clk_ds_allow_mask_gdfll': (0, 0), 'gfx_clk_ds_allow_mask_gdfll_se0': (1, 1), 'gfx_clk_ds_allow_mask_gdfll_se1': (2, 2), 'gfx_clk_ds_allow_mask_gdfll_se2': (3, 3)}), + 'regRLC_GPM_STAT': (20075, 1, {'rlc_busy': (0, 0), 'gfx_power_status': (1, 1), 'gfx_clock_status': (2, 2), 'gfx_ls_status': (3, 3), 'gfx_pipeline_power_status': (4, 4), 'cntx_idle_being_processed': (5, 5), 'cntx_busy_being_processed': (6, 6), 'gfx_idle_being_processed': (7, 7), 'cmp_busy_being_processed': (8, 8), 'saving_registers': (9, 9), 'restoring_registers': (10, 10), 'gfx3d_blocks_changing_power_state': (11, 11), 'cmp_blocks_changing_power_state': (12, 12), 'static_wgp_powering_up': (13, 13), 'static_wgp_powering_down': (14, 14), 'dyn_wgp_powering_up': (15, 15), 'dyn_wgp_powering_down': (16, 16), 'aborted_pd_sequence': (17, 17), 'cmp_power_status': (18, 18), 'gfx_ls_status_3d': (19, 19), 'gfx_clock_status_3d': (20, 20), 'mgcg_override_status': (21, 21), 'rlc_exec_rom_code': (22, 22), 'fgcg_override_status': (23, 23), 'pg_error_status': (24, 31)}), + 'regRLC_RLCS_GPM_STAT': (20075, 1, {'rlc_busy': (0, 0), 'gfx_power_status': (1, 1), 'gfx_clock_status': (2, 2), 'gfx_ls_status': (3, 3), 'gfx_pipeline_power_status': (4, 4), 'cntx_idle_being_processed': (5, 5), 'cntx_busy_being_processed': (6, 6), 'gfx_idle_being_processed': (7, 7), 'cmp_busy_being_processed': (8, 8), 'saving_registers': (9, 9), 'restoring_registers': (10, 10), 'gfx3d_blocks_changing_power_state': (11, 11), 'cmp_blocks_changing_power_state': (12, 12), 'static_wgp_powering_up': (13, 13), 'static_wgp_powering_down': (14, 14), 'dyn_wgp_powering_up': (15, 15), 'dyn_wgp_powering_down': (16, 16), 'aborted_pd_sequence': (17, 17), 'cmp_power_status': (18, 18), 'gfx_ls_status_3d': (19, 19), 'gfx_clock_status_3d': (20, 20), 'mgcg_override_status': (21, 21), 'rlc_exec_rom_code': (22, 22), 'fgcg_override_status': (23, 23), 'pg_error_status': (24, 31)}), + 'regRLC_RLCS_ABORTED_PD_SEQUENCE': (20076, 1, {'aps': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_DIDT_FORCE_STALL': (20077, 1, {'dfs': (0, 2), 'valid': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_IOV_CMD_STATUS': (20078, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IOV_CNTX_LOC_SIZE': (20079, 1, {'data': (0, 7), 'reserved': (8, 31)}), + 'regRLC_RLCS_IOV_SCH_BLOCK': (20080, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IOV_VM_BUSY_STATUS': (20081, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GPM_STAT_2': (20082, 1, {'tc_trans_error': (0, 0), 'rlc_pwr_non3d_stalled': (1, 1), 'gfx_pwr_stalled_status': (2, 2), 'gfx_ulv_status': (3, 3), 'gfx_general_status': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_GRBM_SOFT_RESET': (20083, 1, {'reset': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_PG_CHANGE_STATUS': (20084, 1, {'pg_cntl_changed': (0, 0), 'pg_reg_changed': (1, 1), 'dyn_pg_status_changed': (2, 2), 'dyn_pg_req_changed': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_PG_CHANGE_READ': (20085, 1, {'reserved': (0, 0), 'pg_reg_changed': (1, 1), 'dyn_pg_status_changed': (2, 2), 'dyn_pg_req_changed': (3, 3)}), + 'regRLC_RLCS_IH_SEMAPHORE': (20086, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_IH_COOKIE_SEMAPHORE': (20087, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_WGP_STATUS': (20088, 1, {'cs_work_active': (0, 0), 'static_wgp_status_changed': (1, 1), 'dymanic_wgp_status_changed': (2, 2), 'static_perwgp_pd_incomplete': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_WGP_READ': (20089, 1, {'cs_work_active': (0, 0), 'static_wgp_status_changed': (1, 1), 'dymanic_wgp_status_changed': (2, 2), 'reserved': (3, 31)}), + 'regRLC_RLCS_CP_INT_CTRL_1': (20090, 1, {'interrupt_ack': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_CP_INT_CTRL_2': (20091, 1, {'idle_auto_ack_en': (0, 0), 'busy_auto_ack_en': (1, 1), 'idle_auto_ack_active': (2, 2), 'busy_auto_ack_active': (3, 3), 'interrupt_pending': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_CP_INT_INFO_1': (20092, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_RLCS_CP_INT_INFO_2': (20093, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 24), 'reserved': (25, 31)}), + 'regRLC_RLCS_SPM_INT_CTRL': (20094, 1, {'interrupt_ack': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_SPM_INT_INFO_1': (20095, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_RLCS_SPM_INT_INFO_2': (20096, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 24), 'reserved': (25, 31)}), + 'regRLC_RLCS_DSM_TRIG': (20097, 1, {'start': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_BOOTLOAD_STATUS': (20098, 1, {'gfx_init_done': (0, 0), 'gfx_security_policy_loaded': (1, 1), 'gfx_security_policy_done': (2, 2), 'rlc_gpm_iram_loaded': (3, 3), 'rlc_gpm_iram_done': (4, 4), 'reserved': (5, 30), 'bootload_complete': (31, 31)}), + 'regRLC_RLCS_POWER_BRAKE_CNTL': (20099, 1, {'power_brake': (0, 0), 'int_clear': (1, 1), 'max_hysteresis': (2, 9), 'hysteresis_cnt': (10, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_POWER_BRAKE_CNTL_TH1': (20100, 1, {'power_brake': (0, 0), 'int_clear': (1, 1), 'max_hysteresis': (2, 9), 'hysteresis_cnt': (10, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_GRBM_IDLE_BUSY_STAT': (20101, 1, {'grbm_rlc_gc_stat_idle': (0, 1), 'sdma_0_busy': (16, 16), 'sdma_1_busy': (17, 17), 'sdma_2_busy': (18, 18), 'sdma_3_busy': (19, 19), 'sdma_4_busy': (20, 20), 'sdma_5_busy': (21, 21), 'sdma_6_busy': (22, 22), 'sdma_7_busy': (23, 23), 'sdma_0_busy_changed': (24, 24), 'sdma_1_busy_changed': (25, 25), 'sdma_2_busy_changed': (26, 26), 'sdma_3_busy_changed': (27, 27), 'sdma_4_busy_changed': (28, 28), 'sdma_5_busy_changed': (29, 29), 'sdma_6_busy_changed': (30, 30), 'sdma_7_busy_changed': (31, 31)}), + 'regRLC_RLCS_GRBM_IDLE_BUSY_INT_CNTL': (20102, 1, {'sdma0_busy_int_clear': (0, 0), 'sdma1_busy_int_clear': (1, 1), 'sdma2_busy_int_clear': (2, 2), 'sdma3_busy_int_clear': (3, 3), 'sdma4_busy_int_clear': (4, 4), 'sdma5_busy_int_clear': (5, 5), 'sdma6_busy_int_clear': (6, 6), 'sdma7_busy_int_clear': (7, 7)}), + 'regRLC_RLCS_CMP_IDLE_CNTL': (20103, 1, {'int_clear': (0, 0), 'cmp_idle_hyst': (1, 1), 'cmp_idle': (2, 2), 'max_hysteresis': (3, 10), 'hysteresis_cnt': (11, 18), 'reserved': (19, 31)}), + 'regRLC_RLCS_GENERAL_0': (20104, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_1': (20105, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_2': (20106, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_3': (20107, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_4': (20108, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_5': (20109, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_6': (20110, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_7': (20111, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_8': (20112, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_9': (20113, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_10': (20114, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_11': (20115, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_12': (20116, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_13': (20117, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_14': (20118, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_15': (20119, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_16': (20120, 1, {'data': (0, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_1': (20165, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_2': (20166, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_3': (20167, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_4': (20168, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_SPM_SQTT_MODE': (20169, 1, {'mode': (0, 0)}), + 'regRLC_RLCS_CP_DMA_SRCID_OVER': (20170, 1, {'srcid_override': (0, 0)}), + 'regRLC_RLCS_BOOTLOAD_ID_STATUS1': (20171, 1, {'id_0_loaded': (0, 0), 'id_1_loaded': (1, 1), 'id_2_loaded': (2, 2), 'id_3_loaded': (3, 3), 'id_4_loaded': (4, 4), 'id_5_loaded': (5, 5), 'id_6_loaded': (6, 6), 'id_7_loaded': (7, 7), 'id_8_loaded': (8, 8), 'id_9_loaded': (9, 9), 'id_10_loaded': (10, 10), 'id_11_loaded': (11, 11), 'id_12_loaded': (12, 12), 'id_13_loaded': (13, 13), 'id_14_loaded': (14, 14), 'id_15_loaded': (15, 15), 'id_16_loaded': (16, 16), 'id_17_loaded': (17, 17), 'id_18_loaded': (18, 18), 'id_19_loaded': (19, 19), 'id_20_loaded': (20, 20), 'id_21_loaded': (21, 21), 'id_22_loaded': (22, 22), 'id_23_loaded': (23, 23), 'id_24_loaded': (24, 24), 'id_25_loaded': (25, 25), 'id_26_loaded': (26, 26), 'id_27_loaded': (27, 27), 'id_28_loaded': (28, 28), 'id_29_loaded': (29, 29), 'id_30_loaded': (30, 30), 'id_31_loaded': (31, 31)}), + 'regRLC_RLCS_BOOTLOAD_ID_STATUS2': (20172, 1, {'id_32_loaded': (0, 0), 'id_33_loaded': (1, 1), 'id_34_loaded': (2, 2), 'id_35_loaded': (3, 3), 'id_36_loaded': (4, 4), 'id_37_loaded': (5, 5), 'id_38_loaded': (6, 6), 'id_39_loaded': (7, 7), 'id_40_loaded': (8, 8), 'id_41_loaded': (9, 9), 'id_42_loaded': (10, 10), 'id_43_loaded': (11, 11), 'id_44_loaded': (12, 12), 'id_45_loaded': (13, 13), 'id_46_loaded': (14, 14), 'id_47_loaded': (15, 15), 'id_48_loaded': (16, 16), 'id_49_loaded': (17, 17), 'id_50_loaded': (18, 18), 'id_51_loaded': (19, 19), 'id_52_loaded': (20, 20), 'id_53_loaded': (21, 21), 'id_54_loaded': (22, 22), 'id_55_loaded': (23, 23), 'id_56_loaded': (24, 24), 'id_57_loaded': (25, 25), 'id_58_loaded': (26, 26), 'id_59_loaded': (27, 27), 'id_60_loaded': (28, 28), 'id_61_loaded': (29, 29), 'id_62_loaded': (30, 30), 'id_63_loaded': (31, 31)}), + 'regRLC_RLCS_IMU_VIDCHG_CNTL': (20173, 1, {'req': (0, 0), 'data': (1, 9), 'psien': (10, 10), 'ack': (11, 11), 'reserved': (12, 31)}), + 'regRLC_RLCS_EDC_INT_CNTL': (20174, 1, {'edc_event_int_clear': (0, 0)}), + 'regRLC_RLCS_KMD_LOG_CNTL1': (20175, 1, {'data': (0, 31)}), + 'regRLC_RLCS_KMD_LOG_CNTL2': (20176, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GPM_LEGACY_INT_STAT': (20177, 1, {'gc_cac_edc_event_changed': (0, 0), 'gfx_power_brake_changed': (1, 1)}), + 'regRLC_RLCS_GPM_LEGACY_INT_DISABLE': (20178, 1, {'gc_cac_edc_event_changed': (0, 0), 'gfx_power_brake_changed': (1, 1)}), + 'regRLC_RLCS_SRM_SRCID_CNTL': (20179, 1, {'srcid': (0, 2)}), + 'regRLC_RLCS_GCR_DATA_0': (20180, 1, {'phase_0': (0, 15), 'phase_1': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_1': (20181, 1, {'phase_2': (0, 15), 'phase_3': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_2': (20182, 1, {'phase_4': (0, 15), 'phase_5': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_3': (20183, 1, {'phase_6': (0, 15), 'phase_7': (16, 31)}), + 'regRLC_RLCS_GCR_STATUS': (20184, 1, {'gcr_busy': (0, 0), 'gcr_out_count': (1, 4), 'reserved_2': (5, 7), 'gcriu_cli_rsp_tag': (8, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_PERFMON_CLK_CNTL_UCODE': (20185, 1, {'perfmon_clock_state': (0, 0)}), + 'regRLC_RLCS_UTCL2_CNTL': (20186, 1, {'mtype_no_pte_mode': (0, 0), 'gpa_override': (1, 1), 'vf_override': (2, 2), 'gpa_override_value': (3, 4), 'vf_override_value': (5, 5), 'ignore_pte_permission': (6, 6), 'reserved': (7, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA0': (20187, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA1': (20188, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA2': (20189, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA3': (20190, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA4': (20191, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_CONTROL': (20192, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_CNTL': (20193, 1, {'donetog': (0, 0), 'chgtog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_DATA0': (20194, 1, {'data': (0, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_CONTROL': (20195, 1, {'data': (0, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_CNTL': (20196, 1, {'chgtog': (0, 0), 'donetog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_0': (20197, 1, {'current': (0, 15), 'voltage': (16, 31)}), + 'regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_1': (20198, 1, {'temperature1': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_IMU_RLC_MUTEX_CNTL': (20199, 1, {'req': (0, 0), 'acquire': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_RLC_STATUS': (20200, 1, {'allow_gfxoff': (0, 0), 'allow_fa_dcs': (1, 1), 'reserved_14_2': (2, 14), 'disable_gfxclk_ds': (15, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_RLC_IMU_STATUS': (20201, 1, {'pwr_down_active': (0, 0), 'rlc_alive': (1, 1), 'reserved_3_2': (2, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_IMU_RAM_DATA_1': (20202, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_1_LSB': (20203, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_1_MSB': (20204, 1, {'data': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_IMU_RAM_DATA_0': (20205, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_0_LSB': (20206, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_0_MSB': (20207, 1, {'data': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_IMU_RAM_CNTL': (20208, 1, {'reqtog': (0, 0), 'acktog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_GFX_DOORBELL_FENCE': (20209, 1, {'enable': (0, 0), 'ack': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_CNTL_1': (20211, 1, {'interrupt_ack': (0, 0), 'resp_id': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_CNTL_2': (20212, 1, {'auto_ack_en': (0, 0), 'auto_ack_active': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_STAT': (20213, 1, {'req_idle_hist': (0, 7), 'req_busy_hist': (8, 15), 'last_sdma_rlc_int_id': (16, 16), 'sdma_rlc_int_pending': (17, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_SDMA_INT_INFO': (20214, 1, {'req_idle_to_fw': (0, 7), 'req_busy_to_fw': (8, 15), 'interrupt_id': (16, 16), 'reserved': (17, 31)}), + 'regRLC_RLCS_PMM_CGCG_CNTL': (20215, 1, {'valid': (0, 0), 'clean': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_GFX_MEM_POWER_CTRL_LO': (20216, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GFX_RM_CNTL': (20218, 1, {'rlc_gfx_rm_valid': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_IH_CTRL_1': (20219, 1, {'ih_context_id_1': (0, 31)}), + 'regRLC_RLCS_IH_CTRL_2': (20220, 1, {'ih_context_id_2': (0, 7), 'ih_ring_id': (8, 15), 'ih_vm_id': (16, 19), 'reserved': (20, 31)}), + 'regRLC_RLCS_IH_CTRL_3': (20221, 1, {'ih_source_id': (0, 7), 'ih_vf_id': (8, 12), 'ih_vf': (13, 13), 'reserved': (14, 31)}), + 'regRLC_RLCS_IH_STATUS': (20222, 1, {'ih_credit_count': (0, 5), 'ih_busy': (6, 6), 'ih_write_done': (7, 7), 'reserved': (8, 31)}), + 'regRLC_RLCS_DEC_END': (20479, 1, {}), + 'regRLC_SAFE_MODE': (2432, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SPM_SAMPLE_CNT': (2433, 1, {'count': (0, 31)}), + 'regRLC_SPM_MC_CNTL': (2434, 1, {'rlc_spm_vmid': (0, 3), 'rlc_spm_policy': (4, 5), 'rlc_spm_perf_cntr': (6, 6), 'rlc_spm_fed': (7, 7), 'rlc_spm_mtype_over': (8, 8), 'rlc_spm_mtype': (9, 11), 'rlc_spm_bc': (12, 12), 'rlc_spm_ro': (13, 13), 'rlc_spm_vol': (14, 14), 'rlc_spm_nofill': (15, 15), 'reserved_3': (16, 17), 'rlc_spm_llc_noalloc': (18, 18), 'rlc_spm_llc_noalloc_over': (19, 19), 'reserved': (20, 31)}), + 'regRLC_SPM_INT_CNTL': (2435, 1, {'rlc_spm_int_cntl': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_STATUS': (2436, 1, {'rlc_spm_int_status': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_INFO_1': (2437, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_SPM_INT_INFO_2': (2438, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 23), 'reserved': (24, 31)}), + 'regRLC_CSIB_ADDR_LO': (2439, 1, {'address': (0, 31)}), + 'regRLC_CSIB_ADDR_HI': (2440, 1, {'address': (0, 15)}), + 'regRLC_CSIB_LENGTH': (2441, 1, {'length': (0, 31)}), + 'regRLC_CP_SCHEDULERS': (2442, 1, {'scheduler0': (0, 7), 'scheduler1': (8, 15)}), + 'regRLC_CP_EOF_INT': (2443, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_CP_EOF_INT_CNT': (2444, 1, {'cnt': (0, 31)}), + 'regRLC_SPARE_INT_0': (2445, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_SPARE_INT_1': (2446, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_SPARE_INT_2': (2447, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_PACE_SPARE_INT': (2448, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_PACE_SPARE_INT_1': (2449, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCV_SPARE_INT_1': (2450, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regCP_MEC_DM_INDEX_ADDR': (23554, 1, {'addr': (0, 31)}), + 'regCP_MEC_DM_INDEX_DATA': (23555, 1, {'data': (0, 31)}), + 'regGRBM_IOV_ERROR_FIFO': (24071, 1, {'iov_addr': (0, 17), 'iov_vfid': (18, 23), 'iov_ssrcid': (24, 27), 'iov_op': (28, 28), 'iov_vf': (29, 29), 'fifo_overflow': (30, 30), 'read_valid': (31, 31)}), + 'regGRBM_SEC_CNTL': (24077, 1, {'debug_enable': (0, 0)}), + 'regGRBM_CAM_INDEX': (24080, 1, {'cam_index': (0, 3)}), + 'regGRBM_HYP_CAM_INDEX': (24080, 1, {'cam_index': (0, 3)}), + 'regGRBM_CAM_DATA': (24081, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regGRBM_HYP_CAM_DATA': (24081, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regGRBM_CAM_DATA_UPPER': (24082, 1, {'cam_addr': (0, 1), 'cam_remapaddr': (16, 17)}), + 'regGRBM_HYP_CAM_DATA_UPPER': (24082, 1, {'cam_addr': (0, 1), 'cam_remapaddr': (16, 17)}), + 'regRLC_FWL_FIRST_VIOL_ADDR': (24358, 1, {'viol_addr': (0, 17), 'viol_aperture_id': (18, 29), 'viol_op': (30, 30), 'reserved': (31, 31)}), + 'regRLC_GFX_IMU_DATA_0': (16466, 1, {'data': (0, 31)}), + 'regRLC_GFX_IMU_CMD': (16467, 1, {'cmd': (0, 31)}), +} +gc_11_5_0 = { + 'regSDMA0_CNTL': (28, 0, {'trap_enable': (0, 0), 'sem_wait_int_enable': (2, 2), 'data_swap_enable': (3, 3), 'fence_swap_enable': (4, 4), 'midcmd_preempt_enable': (5, 5), 'pio_done_ack_enable': (6, 6), 'tmz_midcmd_preempt_enable': (8, 8), 'midcmd_expire_enable': (9, 9), 'cp_mes_int_enable': (10, 10), 'page_retry_timeout_int_enable': (11, 11), 'page_null_int_enable': (12, 12), 'page_fault_int_enable': (13, 13), 'ch_perfcnt_enable': (16, 16), 'midcmd_worldswitch_enable': (17, 17), 'ctxempty_int_enable': (28, 28), 'frozen_int_enable': (29, 29), 'ib_preempt_int_enable': (30, 30), 'rb_preempt_int_enable': (31, 31)}), + 'regSDMA0_CNTL1': (39, 0, {'wptr_poll_frequency': (2, 15)}), + 'regSDMA0_WATCHDOG_CNTL': (46, 0, {'queue_hang_count': (0, 7), 'cmd_timeout_count': (8, 15)}), + 'regSDMA0_UTCL1_CNTL': (60, 0, {'redo_delay': (0, 4), 'page_wait_delay': (5, 8), 'resp_mode': (9, 10), 'force_invalidation': (14, 14), 'force_invreq_heavy': (15, 15), 'wr_exe_perms_ctrl': (16, 16), 'rd_exe_perms_ctrl': (17, 17), 'invack_delay': (18, 21), 'reql2_credit': (24, 29)}), + 'regSDMA0_UTCL1_PAGE': (63, 0, {'vm_hole': (0, 0), 'req_type': (1, 4), 'use_mtype': (6, 9), 'use_pt_snoop': (10, 10), 'use_io': (11, 11), 'rd_l2_policy': (12, 13), 'wr_l2_policy': (14, 15), 'dma_page_size': (16, 21), 'use_bc': (22, 22), 'addr_is_pa': (23, 23), 'llc_noalloc': (24, 24)}), + 'regSDMA0_RLC_CGCG_CTRL': (92, 0, {'cgcg_int_enable': (1, 1), 'cgcg_idle_hysteresis': (16, 31)}), + 'regSDMA0_QUEUE0_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_poll_enable': (8, 8), 'rb_swap_enable': (9, 9), 'wptr_poll_swap_enable': (10, 10), 'f32_wptr_poll_enable': (11, 11), 'rptr_writeback_enable': (12, 12), 'rptr_writeback_swap_enable': (13, 13), 'rptr_writeback_timer': (16, 20), 'rb_priv': (23, 23), 'rb_vmid': (24, 27)}), + 'regSDMA0_QUEUE0_RB_BASE': (129, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_BASE_HI': (130, 0, {'addr': (0, 23)}), + 'regSDMA0_QUEUE0_RB_RPTR': (131, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_HI': (132, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR': (133, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_HI': (134, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_ADDR_HI': (136, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_ADDR_LO': (137, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_IB_CNTL': (138, 0, {'ib_enable': (0, 0), 'ib_swap_enable': (4, 4), 'switch_inside_ib': (8, 8), 'cmd_vmid': (16, 19)}), + 'regSDMA0_QUEUE0_IB_RPTR': (139, 0, {'offset': (2, 21)}), + 'regSDMA0_QUEUE0_IB_OFFSET': (140, 0, {'offset': (2, 21)}), + 'regSDMA0_QUEUE0_IB_BASE_LO': (141, 0, {'addr': (5, 31)}), + 'regSDMA0_QUEUE0_IB_BASE_HI': (142, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_IB_SIZE': (143, 0, {'size': (0, 19)}), + 'regSDMA0_QUEUE0_SKIP_CNTL': (144, 0, {'skip_count': (0, 19)}), + 'regSDMA0_QUEUE0_CONTEXT_STATUS': (145, 0, {'selected': (0, 0), 'use_ib': (1, 1), 'idle': (2, 2), 'expired': (3, 3), 'exception': (4, 6), 'ctxsw_able': (7, 7), 'preempt_disable': (10, 10), 'rptr_wb_idle': (11, 11), 'wptr_update_pending': (12, 12), 'wptr_update_fail_count': (16, 23)}), + 'regSDMA0_QUEUE0_DOORBELL': (146, 0, {'enable': (28, 28), 'captured': (30, 30)}), + 'regSDMA0_QUEUE0_DOORBELL_LOG': (169, 0, {}), + 'regSDMA0_QUEUE0_DOORBELL_OFFSET': (171, 0, {'offset': (2, 27)}), + 'regSDMA0_QUEUE0_CSA_ADDR_LO': (172, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_CSA_ADDR_HI': (173, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_SCHEDULE_CNTL': (174, 0, {'global_id': (0, 1), 'process_id': (2, 4), 'local_id': (6, 7), 'context_quantum': (8, 15)}), + 'regSDMA0_QUEUE0_IB_SUB_REMAIN': (175, 0, {'size': (0, 13)}), + 'regSDMA0_QUEUE0_PREEMPT': (176, 0, {'ib_preempt': (0, 0)}), + 'regSDMA0_QUEUE0_DUMMY_REG': (177, 0, {'dummy': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_HI': (178, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_LO': (179, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_RB_AQL_CNTL': (180, 0, {'aql_enable': (0, 0), 'aql_packet_size': (1, 7), 'packet_step': (8, 15), 'midcmd_preempt_enable': (16, 16), 'midcmd_preempt_data_restore': (17, 17), 'overlap_enable': (18, 18)}), + 'regSDMA0_QUEUE0_MINOR_PTR_UPDATE': (181, 0, {'enable': (0, 0)}), + 'regSDMA0_QUEUE0_RB_PREEMPT': (182, 0, {'preempt_req': (0, 0)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA0': (192, 0, {'data0': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA1': (193, 0, {'data1': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA2': (194, 0, {'data2': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA3': (195, 0, {'data3': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA4': (196, 0, {'data4': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA5': (197, 0, {'data5': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA6': (198, 0, {'data6': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA7': (199, 0, {'data7': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA8': (200, 0, {'data8': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA9': (201, 0, {'data9': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA10': (202, 0, {'data10': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_CNTL': (203, 0, {'data_valid': (0, 0), 'copy_mode': (1, 1), 'split_state': (4, 7), 'allow_preempt': (8, 8)}), + 'regSDMA0_F32_CNTL': (22682, 1, {'halt': (0, 0), 'th0_checksum_clr': (8, 8), 'th0_reset': (9, 9), 'th0_enable': (10, 10), 'th1_checksum_clr': (12, 12), 'th1_reset': (13, 13), 'th1_enable': (14, 14), 'th0_priority': (16, 23), 'th1_priority': (24, 31)}), + 'regGRBM_CNTL': (3488, 0, {'read_timeout': (0, 7), 'report_last_rderr': (31, 31)}), + 'regGRBM_SKEW_CNTL': (3489, 0, {'skew_top_threshold': (0, 5), 'skew_count': (6, 11)}), + 'regGRBM_STATUS2': (3490, 0, {'me0pipe1_cmdfifo_avail': (0, 3), 'me0pipe1_cf_rq_pending': (4, 4), 'me0pipe1_pf_rq_pending': (5, 5), 'me1pipe0_rq_pending': (6, 6), 'me1pipe1_rq_pending': (7, 7), 'me1pipe2_rq_pending': (8, 8), 'me1pipe3_rq_pending': (9, 9), 'rlc_rq_pending': (14, 14), 'utcl2_busy': (15, 15), 'ea_busy': (16, 16), 'rmi_busy': (17, 17), 'utcl2_rq_pending': (18, 18), 'sdma_sch_rq_pending': (19, 19), 'ea_link_busy': (20, 20), 'sdma_busy': (21, 21), 'sdma0_rq_pending': (22, 22), 'rlc_busy': (26, 26), 'tcp_busy': (27, 27), 'cpf_busy': (28, 28), 'cpc_busy': (29, 29), 'cpg_busy': (30, 30), 'cpaxi_busy': (31, 31)}), + 'regGRBM_PWR_CNTL': (3491, 0, {'all_req_type': (0, 1), 'gfx_req_type': (2, 3), 'all_rsp_type': (4, 5), 'gfx_rsp_type': (6, 7), 'gfx_req_en': (14, 14), 'all_req_en': (15, 15)}), + 'regGRBM_STATUS': (3492, 0, {'me0pipe0_cmdfifo_avail': (0, 3), 'sdma_rq_pending': (6, 6), 'me0pipe0_cf_rq_pending': (7, 7), 'me0pipe0_pf_rq_pending': (8, 8), 'gds_dma_rq_pending': (9, 9), 'db_clean': (12, 12), 'cb_clean': (13, 13), 'ta_busy': (14, 14), 'gds_busy': (15, 15), 'ge_busy_no_dma': (16, 16), 'sx_busy': (20, 20), 'ge_busy': (21, 21), 'spi_busy': (22, 22), 'bci_busy': (23, 23), 'sc_busy': (24, 24), 'pa_busy': (25, 25), 'db_busy': (26, 26), 'any_active': (27, 27), 'cp_coherency_busy': (28, 28), 'cp_busy': (29, 29), 'cb_busy': (30, 30), 'gui_active': (31, 31)}), + 'regGRBM_STATUS_SE0': (3493, 0, {'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1h_busy': (6, 6), 'pc_busy': (7, 7), 'rmi_busy': (21, 21), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS3': (3495, 0, {'grbm_rlc_intr_credit_pending': (5, 5), 'grbm_cpf_intr_credit_pending': (7, 7), 'mespipe0_rq_pending': (8, 8), 'mespipe1_rq_pending': (9, 9), 'ph_busy': (13, 13), 'ch_busy': (14, 14), 'gl2cc_busy': (15, 15), 'gl1cc_busy': (16, 16), 'pc_busy': (26, 26), 'gl1h_busy': (27, 27), 'gus_link_busy': (28, 28), 'gus_busy': (29, 29), 'utcl1_busy': (30, 30), 'pmm_busy': (31, 31)}), + 'regGRBM_SOFT_RESET': (3496, 0, {'soft_reset_cp': (0, 0), 'soft_reset_rlc': (2, 2), 'soft_reset_utcl2': (15, 15), 'soft_reset_gfx': (16, 16), 'soft_reset_cpf': (17, 17), 'soft_reset_cpc': (18, 18), 'soft_reset_cpg': (19, 19), 'soft_reset_cac': (20, 20), 'soft_reset_cpaxi': (21, 21), 'soft_reset_ea': (22, 22), 'soft_reset_sdma0': (23, 23)}), + 'regGRBM_GFX_CLKEN_CNTL': (3500, 0, {'prefix_delay_cnt': (0, 3), 'post_delay_cnt': (8, 12)}), + 'regGRBM_WAIT_IDLE_CLOCKS': (3501, 0, {'wait_idle_clocks': (0, 7)}), + 'regGRBM_READ_ERROR': (3510, 0, {'read_address': (2, 19), 'read_pipeid': (20, 21), 'read_meid': (22, 23), 'read_error': (31, 31)}), + 'regGRBM_READ_ERROR2': (3511, 0, {'read_requester_mespipe0': (9, 9), 'read_requester_mespipe1': (10, 10), 'read_requester_mespipe2': (11, 11), 'read_requester_mespipe3': (12, 12), 'read_requester_sdma0': (13, 13), 'read_requester_rlc': (18, 18), 'read_requester_gds_dma': (19, 19), 'read_requester_me0pipe0_cf': (20, 20), 'read_requester_me0pipe0_pf': (21, 21), 'read_requester_me0pipe1_cf': (22, 22), 'read_requester_me0pipe1_pf': (23, 23), 'read_requester_me1pipe0': (24, 24), 'read_requester_me1pipe1': (25, 25), 'read_requester_me1pipe2': (26, 26), 'read_requester_me1pipe3': (27, 27), 'read_requester_me2pipe0': (28, 28), 'read_requester_me2pipe1': (29, 29), 'read_requester_me2pipe2': (30, 30), 'read_requester_me2pipe3': (31, 31)}), + 'regGRBM_INT_CNTL': (3512, 0, {'rderr_int_enable': (0, 0), 'gui_idle_int_enable': (19, 19)}), + 'regGRBM_TRAP_OP': (3513, 0, {'rw': (0, 0)}), + 'regGRBM_TRAP_ADDR': (3514, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_ADDR_MSK': (3515, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_WD': (3516, 0, {'data': (0, 31)}), + 'regGRBM_TRAP_WD_MSK': (3517, 0, {'data': (0, 31)}), + 'regGRBM_WRITE_ERROR': (3519, 0, {'write_requester_rlc': (0, 0), 'write_ssrcid': (2, 5), 'write_vfid': (8, 11), 'write_vf': (12, 12), 'write_vmid': (13, 16), 'tmz': (17, 17), 'write_pipeid': (20, 21), 'write_meid': (22, 23), 'write_error': (31, 31)}), + 'regGRBM_CHIP_REVISION': (3521, 0, {'chip_revision': (0, 7)}), + 'regGRBM_IH_CREDIT': (3524, 0, {'credit_value': (0, 1), 'ih_client_id': (16, 23)}), + 'regGRBM_PWR_CNTL2': (3525, 0, {'pwr_request_halt': (16, 16), 'pwr_gfx3d_request_halt': (20, 20)}), + 'regGRBM_UTCL2_INVAL_RANGE_START': (3526, 0, {'data': (0, 17)}), + 'regGRBM_UTCL2_INVAL_RANGE_END': (3527, 0, {'data': (0, 17)}), + 'regGRBM_INVALID_PIPE': (3529, 0, {'addr': (2, 19), 'pipeid': (20, 21), 'meid': (22, 23), 'queueid': (24, 26), 'ssrcid': (27, 30), 'invalid_pipe': (31, 31)}), + 'regGRBM_FENCE_RANGE0': (3530, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_FENCE_RANGE1': (3531, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_SCRATCH_REG0': (3552, 0, {'scratch_reg0': (0, 31)}), + 'regGRBM_SCRATCH_REG1': (3553, 0, {'scratch_reg1': (0, 31)}), + 'regGRBM_SCRATCH_REG2': (3554, 0, {'scratch_reg2': (0, 31)}), + 'regGRBM_SCRATCH_REG3': (3555, 0, {'scratch_reg3': (0, 31)}), + 'regGRBM_SCRATCH_REG4': (3556, 0, {'scratch_reg4': (0, 31)}), + 'regGRBM_SCRATCH_REG5': (3557, 0, {'scratch_reg5': (0, 31)}), + 'regGRBM_SCRATCH_REG6': (3558, 0, {'scratch_reg6': (0, 31)}), + 'regGRBM_SCRATCH_REG7': (3559, 0, {'scratch_reg7': (0, 31)}), + 'regCP_MEC_ME1_HEADER_DUMP': (3630, 0, {'header_dump': (0, 31)}), + 'regCP_MEC_ME2_HEADER_DUMP': (3631, 0, {'header_dump': (0, 31)}), + 'regCP_STAT': (3904, 0, {'roq_db_busy': (5, 5), 'roq_ce_db_busy': (6, 6), 'roq_ring_busy': (9, 9), 'roq_indirect1_busy': (10, 10), 'roq_indirect2_busy': (11, 11), 'roq_state_busy': (12, 12), 'dc_busy': (13, 13), 'utcl2iu_busy': (14, 14), 'pfp_busy': (15, 15), 'meq_busy': (16, 16), 'me_busy': (17, 17), 'query_busy': (18, 18), 'semaphore_busy': (19, 19), 'interrupt_busy': (20, 20), 'surface_sync_busy': (21, 21), 'dma_busy': (22, 22), 'rciu_busy': (23, 23), 'scratch_ram_busy': (24, 24), 'gcriu_busy': (25, 25), 'ce_busy': (26, 26), 'tciu_busy': (27, 27), 'roq_ce_ring_busy': (28, 28), 'roq_ce_indirect1_busy': (29, 29), 'roq_ce_indirect2_busy': (30, 30), 'cp_busy': (31, 31)}), + 'regCP_MEC1_INSTR_PNTR': (3912, 0, {'instr_pntr': (0, 15)}), + 'regCP_MEC2_INSTR_PNTR': (3913, 0, {'instr_pntr': (0, 15)}), + 'regCP_RB_WPTR_POLL_CNTL': (3938, 0, {'poll_frequency': (0, 15), 'idle_poll_count': (16, 31)}), + 'regGB_ADDR_CONFIG': (5086, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 20), 'num_rb_per_se': (26, 27)}), + 'regGB_ADDR_CONFIG_READ': (5090, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 20), 'num_rb_per_se': (26, 27)}), + 'regGCMC_VM_NB_MMIOBASE': (5536, 0, {'mmiobase': (0, 31)}), + 'regGCMC_VM_NB_MMIOLIMIT': (5537, 0, {'mmiolimit': (0, 31)}), + 'regGCMC_VM_NB_PCI_CTRL': (5538, 0, {'mmioenable': (23, 23)}), + 'regGCMC_VM_NB_PCI_ARB': (5539, 0, {'vga_hole': (3, 3)}), + 'regGCMC_VM_NB_TOP_OF_DRAM_SLOT1': (5540, 0, {'top_of_dram': (23, 31)}), + 'regGCMC_VM_NB_LOWER_TOP_OF_DRAM2': (5541, 0, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regGCMC_VM_NB_UPPER_TOP_OF_DRAM2': (5542, 0, {'upper_tom2': (0, 11)}), + 'regGCMC_VM_FB_OFFSET': (5543, 0, {'fb_offset': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (5544, 0, {'physical_page_number_lsb': (0, 31)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (5545, 0, {'physical_page_number_msb': (0, 3)}), + 'regGCMC_VM_STEERING': (5546, 0, {'default_steering': (0, 1)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_START': (5549, 0, {'address': (0, 19)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_END': (5550, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_SYSMEM_ADDRESS_START': (5551, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_SYSMEM_ADDRESS_END': (5552, 0, {'address': (0, 19)}), + 'regGCMC_VM_APT_CNTL': (5553, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_START': (5554, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_END': (5555, 0, {'address': (0, 19)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (5556, 0, {'lock': (0, 0)}), + 'regGCMC_VM_VA_1TB_CNTL': (5559, 0, {'va_1tb_vmids': (0, 15)}), + 'regGCMC_VM_FB_NOALLOC_CNTL': (5561, 0, {'local_fb_noalloc_nopte': (0, 0), 'remote_fb_noalloc_nopte': (1, 1), 'fb_noalloc_walker_fetch': (2, 2), 'router_atcl2_noalloc': (3, 3), 'router_gpa_mode2_noalloc': (4, 4), 'router_gpa_mode3_noalloc': (5, 5)}), + 'regGCVM_L2_CNTL': (5568, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regGCVM_L2_CNTL2': (5569, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regGCVM_L2_CNTL3': (5570, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regGCVM_L2_STATUS': (5571, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regGCVM_DUMMY_PAGE_FAULT_CNTL': (5572, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_LO32': (5573, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_HI32': (5574, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regGCVM_INVALIDATE_CNTL': (5575, 0, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL': (5576, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL2': (5577, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL3': (5578, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL4': (5579, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_STATUS': (5580, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'prt': (29, 29), 'fed': (30, 30)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_LO32': (5581, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_HI32': (5582, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (5583, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (5584, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (5586, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (5587, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (5588, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (5589, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (5590, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (5591, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regGCVM_L2_CNTL4': (5592, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regGCVM_L2_MM_GROUP_RT_CLASSES': (5593, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID': (5594, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID2': (5595, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regGCVM_L2_CACHE_PARITY_CNTL': (5596, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regGCVM_L2_ICG_CTRL': (5597, 0, {'off_hysteresis': (0, 3), 'dynamic_clock_override': (4, 4), 'static_clock_override': (5, 5), 'aon_clock_override': (6, 6), 'perfmon_clock_override': (7, 7)}), + 'regGCVM_L2_CNTL5': (5598, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'utcl2_atc_req_fgcg_off': (16, 16)}), + 'regGCVM_L2_GCR_CNTL': (5599, 0, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regGCVML2_WALKER_MACRO_THROTTLE_TIME': (5600, 0, {'time': (0, 23)}), + 'regGCVML2_WALKER_MACRO_THROTTLE_FETCH_LIMIT': (5601, 0, {'limit': (1, 15)}), + 'regGCVML2_WALKER_MICRO_THROTTLE_TIME': (5602, 0, {'time': (0, 23)}), + 'regGCVML2_WALKER_MICRO_THROTTLE_FETCH_LIMIT': (5603, 0, {'limit': (1, 15)}), + 'regGCVM_L2_CGTT_BUSY_CTRL': (5604, 0, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regGCVM_L2_PTE_CACHE_DUMP_CNTL': (5605, 0, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regGCVM_L2_PTE_CACHE_DUMP_READ': (5606, 0, {'data': (0, 31)}), + 'regGCVM_L2_BANK_SELECT_MASKS': (5609, 0, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regGCVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (5613, 0, {'update': (10, 10)}), + 'regGCVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (5614, 0, {'update': (10, 10)}), + 'regGCMC_VM_FB_LOCATION_BASE': (5756, 0, {'fb_base': (0, 23)}), + 'regGCMC_VM_FB_LOCATION_TOP': (5757, 0, {'fb_top': (0, 23)}), + 'regGCMC_VM_AGP_TOP': (5758, 0, {'agp_top': (0, 23)}), + 'regGCMC_VM_AGP_BOT': (5759, 0, {'agp_bot': (0, 23)}), + 'regGCMC_VM_AGP_BASE': (5760, 0, {'agp_base': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_LOW_ADDR': (5761, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (5762, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_MX_L1_TLB_CNTL': (5763, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 13)}), + 'regGCVM_CONTEXT0_CNTL': (5772, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT1_CNTL': (5773, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT2_CNTL': (5774, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT3_CNTL': (5775, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT4_CNTL': (5776, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT5_CNTL': (5777, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT6_CNTL': (5778, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT7_CNTL': (5779, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT8_CNTL': (5780, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT9_CNTL': (5781, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT10_CNTL': (5782, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT11_CNTL': (5783, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT12_CNTL': (5784, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT13_CNTL': (5785, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT14_CNTL': (5786, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXT15_CNTL': (5787, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regGCVM_CONTEXTS_DISABLE': (5788, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regGCVM_INVALIDATE_ENG0_SEM': (5789, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG1_SEM': (5790, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG2_SEM': (5791, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG3_SEM': (5792, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG4_SEM': (5793, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG5_SEM': (5794, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG6_SEM': (5795, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG7_SEM': (5796, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG8_SEM': (5797, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG9_SEM': (5798, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG10_SEM': (5799, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG11_SEM': (5800, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG12_SEM': (5801, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG13_SEM': (5802, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG14_SEM': (5803, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG15_SEM': (5804, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG16_SEM': (5805, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG17_SEM': (5806, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG0_REQ': (5807, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG1_REQ': (5808, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG2_REQ': (5809, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG3_REQ': (5810, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG4_REQ': (5811, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG5_REQ': (5812, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG6_REQ': (5813, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG7_REQ': (5814, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG8_REQ': (5815, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG9_REQ': (5816, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG10_REQ': (5817, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG11_REQ': (5818, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG12_REQ': (5819, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG13_REQ': (5820, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG14_REQ': (5821, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG15_REQ': (5822, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG16_REQ': (5823, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG17_REQ': (5824, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG0_ACK': (5825, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG1_ACK': (5826, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG2_ACK': (5827, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG3_ACK': (5828, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG4_ACK': (5829, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG5_ACK': (5830, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG6_ACK': (5831, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG7_ACK': (5832, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG8_ACK': (5833, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG9_ACK': (5834, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG10_ACK': (5835, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG11_ACK': (5836, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG12_ACK': (5837, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG13_ACK': (5838, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG14_ACK': (5839, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG15_ACK': (5840, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG16_ACK': (5841, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG17_ACK': (5842, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (5843, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (5844, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (5845, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (5846, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (5847, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (5848, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (5849, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (5850, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (5851, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (5852, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (5853, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (5854, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (5855, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (5856, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (5857, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (5858, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (5859, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (5860, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (5861, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (5862, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (5863, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (5864, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (5865, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (5866, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (5867, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (5868, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (5869, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (5870, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (5871, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (5872, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (5873, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (5874, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (5875, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (5876, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (5877, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (5878, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (5879, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (5880, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (5881, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (5882, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (5883, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (5884, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (5885, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (5886, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (5887, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (5888, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (5889, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (5890, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (5891, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (5892, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (5893, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (5894, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (5895, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (5896, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (5897, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (5898, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (5899, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (5900, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (5901, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (5902, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (5903, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (5904, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (5905, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (5906, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (5907, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (5908, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (5909, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (5910, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (5911, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (5912, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (5913, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (5914, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (5915, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (5916, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (5917, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (5918, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (5919, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (5920, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (5921, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (5922, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (5923, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (5924, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (5925, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (5926, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (5927, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (5928, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (5929, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (5930, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (5931, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (5932, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (5933, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (5934, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (5935, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (5936, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (5937, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (5938, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (5939, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (5940, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (5941, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (5942, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (5943, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (5944, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (5945, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (5946, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (5947, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (5948, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (5949, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (5950, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (5951, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (5952, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (5953, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (5954, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (5955, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (5956, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (5957, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (5958, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (5959, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (5960, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (5961, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (5962, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (5963, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (5964, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (5965, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (5966, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (5967, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (5968, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (5969, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (5970, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (5971, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (5972, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (5973, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (5974, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5975, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5976, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5977, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5978, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5979, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5980, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5981, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5982, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5983, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5984, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5985, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5986, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5987, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5988, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5989, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5990, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5991, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVML2_PERFCOUNTER2_0_LO': (13536, 1, {'perfcounter_lo': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_1_LO': (13537, 1, {'perfcounter_lo': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_0_HI': (13538, 1, {'perfcounter_hi': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_1_HI': (13539, 1, {'perfcounter_hi': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_LO': (13540, 1, {'counter_lo': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_HI': (13541, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regGCVML2_PERFCOUNTER2_0_SELECT': (15648, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_1_SELECT': (15649, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_0_SELECT1': (15650, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_1_SELECT1': (15651, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_0_MODE': (15652, 1, {'compare_mode0': (0, 1), 'compare_mode1': (2, 3), 'compare_mode2': (4, 5), 'compare_mode3': (6, 7), 'compare_value0': (8, 11), 'compare_value1': (12, 15), 'compare_value2': (16, 19), 'compare_value3': (20, 23)}), + 'regGCVML2_PERFCOUNTER2_1_MODE': (15653, 1, {'compare_mode0': (0, 1), 'compare_mode1': (2, 3), 'compare_mode2': (4, 5), 'compare_mode3': (6, 7), 'compare_value0': (8, 11), 'compare_value1': (12, 15), 'compare_value2': (16, 19), 'compare_value3': (20, 23)}), + 'regGCMC_VM_L2_PERFCOUNTER0_CFG': (15664, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER1_CFG': (15665, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER2_CFG': (15666, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER3_CFG': (15667, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER4_CFG': (15668, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER5_CFG': (15669, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER6_CFG': (15670, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER7_CFG': (15671, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (15672, 1, {'perf_counter_select': (0, 3), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regGCVM_PCIE_ATS_CNTL': (23168, 1, {'stu': (16, 20), 'atc_enable': (31, 31)}), + 'regGCVM_IOMMU_GPU_HOST_TRANSLATION_ENABLE': (24131, 1, {'gpu_host_translation_enable': (0, 0)}), + 'regGCVM_IOMMU_CONTROL_REGISTER': (24132, 1, {'iommuen': (0, 0)}), + 'regGCVM_IOMMU_PERFORMANCE_OPTIMIZATION_CONTROL_REGISTER': (24133, 1, {'perfopten': (13, 13)}), + 'regCOMPUTE_DISPATCH_INITIATOR': (7072, 0, {'compute_shader_en': (0, 0), 'partial_tg_en': (1, 1), 'force_start_at_000': (2, 2), 'ordered_append_enbl': (3, 3), 'ordered_append_mode': (4, 4), 'use_thread_dimensions': (5, 5), 'order_mode': (6, 6), 'scalar_l1_inv_vol': (10, 10), 'vector_l1_inv_vol': (11, 11), 'reserved': (12, 12), 'tunnel_enable': (13, 13), 'restore': (14, 14), 'cs_w32_en': (15, 15), 'amp_shader_en': (16, 16), 'disable_disp_prempt_en': (17, 17)}), + 'regCOMPUTE_DIM_X': (7073, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Y': (7074, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Z': (7075, 0, {'size': (0, 31)}), + 'regCOMPUTE_START_X': (7076, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Y': (7077, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Z': (7078, 0, {'start': (0, 31)}), + 'regCOMPUTE_NUM_THREAD_X': (7079, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Y': (7080, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Z': (7081, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_PIPELINESTAT_ENABLE': (7082, 0, {'pipelinestat_enable': (0, 0)}), + 'regCOMPUTE_PERFCOUNT_ENABLE': (7083, 0, {'perfcount_enable': (0, 0)}), + 'regCOMPUTE_PGM_LO': (7084, 0, {'data': (0, 31)}), + 'regCOMPUTE_PGM_HI': (7085, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_LO': (7086, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_HI': (7087, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_LO': (7088, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_HI': (7089, 0, {'data': (0, 7)}), + 'regCOMPUTE_PGM_RSRC1': (7090, 0, {'vgprs': (0, 5), 'sgprs': (6, 9), 'priority': (10, 11), 'float_mode': (12, 19), 'priv': (20, 20), 'dx10_clamp': (21, 21), 'ieee_mode': (23, 23), 'bulky': (24, 24), 'fp16_ovfl': (26, 26), 'wgp_mode': (29, 29), 'mem_ordered': (30, 30), 'fwd_progress': (31, 31)}), + 'regCOMPUTE_PGM_RSRC2': (7091, 0, {'scratch_en': (0, 0), 'user_sgpr': (1, 5), 'trap_present': (6, 6), 'tgid_x_en': (7, 7), 'tgid_y_en': (8, 8), 'tgid_z_en': (9, 9), 'tg_size_en': (10, 10), 'tidig_comp_cnt': (11, 12), 'excp_en_msb': (13, 14), 'lds_size': (15, 23), 'excp_en': (24, 30)}), + 'regCOMPUTE_VMID': (7092, 0, {'data': (0, 3)}), + 'regCOMPUTE_RESOURCE_LIMITS': (7093, 0, {'waves_per_sh': (0, 9), 'tg_per_cu': (12, 15), 'lock_threshold': (16, 21), 'simd_dest_cntl': (22, 22), 'force_simd_dist': (23, 23), 'cu_group_count': (24, 26)}), + 'regCOMPUTE_DESTINATION_EN_SE0': (7094, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE0': (7094, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DESTINATION_EN_SE1': (7095, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE1': (7095, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_TMPRING_SIZE': (7096, 0, {'waves': (0, 11), 'wavesize': (12, 26)}), + 'regCOMPUTE_DESTINATION_EN_SE2': (7097, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE2': (7097, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DESTINATION_EN_SE3': (7098, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE3': (7098, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_RESTART_X': (7099, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Y': (7100, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Z': (7101, 0, {'restart': (0, 31)}), + 'regCOMPUTE_THREAD_TRACE_ENABLE': (7102, 0, {'thread_trace_enable': (0, 0)}), + 'regCOMPUTE_MISC_RESERVED': (7103, 0, {'send_seid': (0, 2), 'reserved3': (3, 3), 'reserved4': (4, 4), 'wave_id_base': (5, 16)}), + 'regCOMPUTE_DISPATCH_ID': (7104, 0, {'dispatch_id': (0, 31)}), + 'regCOMPUTE_THREADGROUP_ID': (7105, 0, {'threadgroup_id': (0, 31)}), + 'regCOMPUTE_REQ_CTRL': (7106, 0, {'soft_grouping_en': (0, 0), 'number_of_requests_per_cu': (1, 4), 'soft_grouping_allocation_timeout': (5, 8), 'hard_lock_hysteresis': (9, 9), 'hard_lock_low_threshold': (10, 14), 'producer_request_lockout': (15, 15), 'global_scanning_en': (16, 16), 'allocation_rate_throttling_threshold': (17, 19), 'dedicated_preallocation_buffer_limit': (20, 26)}), + 'regCOMPUTE_USER_ACCUM_0': (7108, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_1': (7109, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_2': (7110, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_3': (7111, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_PGM_RSRC3': (7112, 0, {'shared_vgpr_cnt': (0, 3), 'inst_pref_size': (4, 9), 'trap_on_start': (10, 10), 'trap_on_end': (11, 11), 'image_op': (31, 31)}), + 'regCOMPUTE_DDID_INDEX': (7113, 0, {'index': (0, 10)}), + 'regCOMPUTE_SHADER_CHKSUM': (7114, 0, {'checksum': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE4': (7115, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE5': (7116, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE6': (7117, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE7': (7118, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DISPATCH_INTERLEAVE': (7119, 0, {'interleave': (0, 9)}), + 'regCOMPUTE_RELAUNCH': (7120, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_LO': (7121, 0, {'addr': (0, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_HI': (7122, 0, {'addr': (0, 15)}), + 'regCOMPUTE_RELAUNCH2': (7123, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_USER_DATA_0': (7136, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_1': (7137, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_2': (7138, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_3': (7139, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_4': (7140, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_5': (7141, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_6': (7142, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_7': (7143, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_8': (7144, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_9': (7145, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_10': (7146, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_11': (7147, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_12': (7148, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_13': (7149, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_14': (7150, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_15': (7151, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_TUNNEL': (7197, 0, {'off_delay': (0, 9), 'immediate': (10, 10)}), + 'regCOMPUTE_DISPATCH_END': (7198, 0, {'data': (0, 31)}), + 'regCOMPUTE_NOWHERE': (7199, 0, {'data': (0, 31)}), + 'regCP_INT_CNTL': (7657, 0, {'resume_int_enable': (8, 8), 'suspend_int_enable': (9, 9), 'dma_watch_int_enable': (10, 10), 'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC_DOORBELL_RANGE_LOWER': (7676, 0, {'doorbell_range_lower': (2, 11)}), + 'regCP_MEC_DOORBELL_RANGE_UPPER': (7677, 0, {'doorbell_range_upper': (2, 11)}), + 'regCP_INT_CNTL_RING0': (7690, 0, {'resume_int_enable': (8, 8), 'suspend_int_enable': (9, 9), 'dma_watch_int_enable': (10, 10), 'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_INT_CNTL_RING1': (7691, 0, {'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_PFP_PRGRM_CNTR_START': (7748, 0, {'ip_start': (0, 31)}), + 'regCP_ME_PRGRM_CNTR_START': (7749, 0, {'ip_start': (0, 31)}), + 'regCP_MEC1_PRGRM_CNTR_START': (7750, 0, {'ip_start': (0, 19)}), + 'regCP_MEC2_PRGRM_CNTR_START': (7751, 0, {'ip_start': (0, 19)}), + 'regCP_MEC1_INTR_ROUTINE_START': (7755, 0, {'ir_start': (0, 19)}), + 'regCP_MEC2_INTR_ROUTINE_START': (7756, 0, {'ir_start': (0, 19)}), + 'regCP_PFP_PRGRM_CNTR_START_HI': (7769, 0, {'ip_start': (0, 29)}), + 'regCP_MEC1_F32_INT_DIS': (7773, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_MEC2_F32_INT_DIS': (7774, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_ME_PRGRM_CNTR_START_HI': (7801, 0, {'ip_start': (0, 29)}), + 'regCP_HQD_GFX_CONTROL': (7839, 0, {'message': (0, 3), 'misc': (4, 14), 'db_updated_msg_en': (15, 15)}), + 'regCP_HQD_GFX_STATUS': (7840, 0, {'status': (0, 15)}), + 'regCP_MEC_JT_STAT': (7893, 0, {'jt_loaded': (0, 7), 'wr_mask': (16, 23)}), + 'regSPI_COMPUTE_QUEUE_RESET': (8051, 0, {'reset': (0, 0)}), + 'regCP_MQD_BASE_ADDR': (8105, 0, {'base_addr': (2, 31)}), + 'regCP_MQD_BASE_ADDR_HI': (8106, 0, {'base_addr_hi': (0, 15)}), + 'regCP_HQD_ACTIVE': (8107, 0, {'active': (0, 0), 'busy_gate': (1, 1)}), + 'regCP_HQD_VMID': (8108, 0, {'vmid': (0, 3), 'ib_vmid': (8, 11), 'vqid': (16, 25)}), + 'regCP_HQD_PERSISTENT_STATE': (8109, 0, {'preload_req': (0, 0), 'tmz_connect_override': (1, 1), 'suspend_status': (7, 7), 'preload_size': (8, 17), 'tmz_switch_exempt': (18, 18), 'tmz_match_dis': (19, 19), 'wpp_clamp_en': (20, 20), 'wpp_switch_qos_en': (21, 21), 'iq_switch_qos_en': (22, 22), 'ib_switch_qos_en': (23, 23), 'eop_switch_qos_en': (24, 24), 'pq_switch_qos_en': (25, 25), 'tc_offload_qos_en': (26, 26), 'cache_full_packet_en': (27, 27), 'restore_active': (28, 28), 'relaunch_waves': (29, 29), 'qswitch_mode': (30, 30), 'disp_active': (31, 31)}), + 'regCP_HQD_PIPE_PRIORITY': (8110, 0, {'pipe_priority': (0, 1)}), + 'regCP_HQD_QUEUE_PRIORITY': (8111, 0, {'priority_level': (0, 3)}), + 'regCP_HQD_QUANTUM': (8112, 0, {'quantum_en': (0, 0), 'quantum_scale': (4, 4), 'quantum_duration': (8, 13), 'quantum_active': (31, 31)}), + 'regCP_HQD_PQ_BASE': (8113, 0, {'addr': (0, 31)}), + 'regCP_HQD_PQ_BASE_HI': (8114, 0, {'addr_hi': (0, 7)}), + 'regCP_HQD_PQ_RPTR': (8115, 0, {'consumed_offset': (0, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR': (8116, 0, {'rptr_report_addr': (2, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR_HI': (8117, 0, {'rptr_report_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR': (8118, 0, {'wptr_addr': (3, 31)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR_HI': (8119, 0, {'wptr_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_DOORBELL_CONTROL': (8120, 0, {'doorbell_mode': (0, 0), 'doorbell_bif_drop': (1, 1), 'doorbell_offset': (2, 27), 'doorbell_source': (28, 28), 'doorbell_schd_hit': (29, 29), 'doorbell_en': (30, 30), 'doorbell_hit': (31, 31)}), + 'regCP_HQD_PQ_CONTROL': (8122, 0, {'queue_size': (0, 5), 'wptr_carry': (6, 6), 'rptr_carry': (7, 7), 'rptr_block_size': (8, 13), 'queue_full_en': (14, 14), 'pq_empty': (15, 15), 'slot_based_wptr': (18, 19), 'min_avail_size': (20, 21), 'tmz': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'pq_volatile': (26, 26), 'no_update_rptr': (27, 27), 'unord_dispatch': (28, 28), 'tunnel_dispatch': (29, 29), 'priv_state': (30, 30), 'kmd_queue': (31, 31)}), + 'regCP_HQD_IB_BASE_ADDR': (8123, 0, {'ib_base_addr': (2, 31)}), + 'regCP_HQD_IB_BASE_ADDR_HI': (8124, 0, {'ib_base_addr_hi': (0, 15)}), + 'regCP_HQD_IB_RPTR': (8125, 0, {'consumed_offset': (0, 19)}), + 'regCP_HQD_IB_CONTROL': (8126, 0, {'ib_size': (0, 19), 'min_ib_avail_size': (20, 21), 'ib_exe_disable': (23, 23), 'ib_cache_policy': (24, 25), 'ib_volatile': (26, 26), 'processing_ib': (31, 31)}), + 'regCP_HQD_IQ_TIMER': (8127, 0, {'wait_time': (0, 7), 'retry_type': (8, 10), 'immediate_expire': (11, 11), 'interrupt_type': (12, 13), 'clock_count': (14, 15), 'interrupt_size': (16, 21), 'quantum_timer': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'iq_volatile': (26, 26), 'queue_type': (27, 27), 'rearm_timer': (28, 28), 'process_iq_en': (29, 29), 'processing_iq': (30, 30), 'active': (31, 31)}), + 'regCP_HQD_IQ_RPTR': (8128, 0, {'offset': (0, 5)}), + 'regCP_HQD_DEQUEUE_REQUEST': (8129, 0, {'dequeue_req': (0, 3), 'iq_req_pend': (4, 4), 'dequeue_int': (8, 8), 'iq_req_pend_en': (9, 9), 'dequeue_req_en': (10, 10)}), + 'regCP_HQD_DMA_OFFLOAD': (8130, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_OFFLOAD': (8130, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_SEMA_CMD': (8131, 0, {'retry': (0, 0), 'result': (1, 2), 'polling_dis': (8, 8), 'message_en': (9, 9)}), + 'regCP_HQD_MSG_TYPE': (8132, 0, {'action': (0, 2), 'save_state': (4, 6)}), + 'regCP_HQD_ATOMIC0_PREOP_LO': (8133, 0, {'atomic0_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC0_PREOP_HI': (8134, 0, {'atomic0_preop_hi': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_LO': (8135, 0, {'atomic1_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_HI': (8136, 0, {'atomic1_preop_hi': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER0': (8137, 0, {'cwsr': (0, 0), 'save_status': (1, 1), 'rsrv': (2, 2), 'static_queue': (3, 5), 'queue_run_once': (6, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'c_inherit_vmid': (9, 9), 'queue_scheduler_type': (10, 12), 'c_queue_use_gws': (13, 13), 'queue_slot_connected': (15, 15), 'mes_interrupt_enabled': (20, 20), 'mes_interrupt_pipe': (21, 22), 'concurrent_process_count': (24, 27), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_STATUS0': (8137, 0, {'cwsr': (0, 0), 'save_status': (1, 1), 'rsrv': (2, 2), 'static_queue': (3, 5), 'queue_run_once': (6, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'c_inherit_vmid': (9, 9), 'queue_scheduler_type': (10, 12), 'c_queue_use_gws': (13, 13), 'queue_slot_connected': (15, 15), 'mes_interrupt_enabled': (20, 20), 'mes_interrupt_pipe': (21, 22), 'concurrent_process_count': (24, 27), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_CONTROL0': (8138, 0, {'control': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER1': (8138, 0, {'scheduler': (0, 31)}), + 'regCP_MQD_CONTROL': (8139, 0, {'vmid': (0, 3), 'priv_state': (8, 8), 'processing_mqd': (12, 12), 'processing_mqd_en': (13, 13), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'mqd_volatile': (26, 26)}), + 'regCP_HQD_HQ_STATUS1': (8140, 0, {'status': (0, 31)}), + 'regCP_HQD_HQ_CONTROL1': (8141, 0, {'control': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR': (8142, 0, {'base_addr': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR_HI': (8143, 0, {'base_addr_hi': (0, 7)}), + 'regCP_HQD_EOP_CONTROL': (8144, 0, {'eop_size': (0, 5), 'processing_eop': (8, 8), 'process_eop_en': (12, 12), 'processing_eopib': (13, 13), 'process_eopib_en': (14, 14), 'halt_fetcher': (21, 21), 'halt_fetcher_en': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'eop_volatile': (26, 26), 'sig_sem_result': (29, 30), 'pend_sig_sem': (31, 31)}), + 'regCP_HQD_EOP_RPTR': (8145, 0, {'rptr': (0, 12), 'reset_fetcher': (28, 28), 'dequeue_pend': (29, 29), 'rptr_eq_csmd_wptr': (30, 30), 'init_fetcher': (31, 31)}), + 'regCP_HQD_EOP_WPTR': (8146, 0, {'wptr': (0, 12), 'eop_empty': (15, 15), 'eop_avail': (16, 28)}), + 'regCP_HQD_EOP_EVENTS': (8147, 0, {'event_count': (0, 11), 'cs_partial_flush_pend': (16, 16)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_LO': (8148, 0, {'addr': (12, 31)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_HI': (8149, 0, {'addr_hi': (0, 15)}), + 'regCP_HQD_CTX_SAVE_CONTROL': (8150, 0, {'policy': (3, 4), 'exe_disable': (23, 23)}), + 'regCP_HQD_CNTL_STACK_OFFSET': (8151, 0, {'offset': (2, 15)}), + 'regCP_HQD_CNTL_STACK_SIZE': (8152, 0, {'size': (12, 15)}), + 'regCP_HQD_WG_STATE_OFFSET': (8153, 0, {'offset': (2, 25)}), + 'regCP_HQD_CTX_SAVE_SIZE': (8154, 0, {'size': (12, 25)}), + 'regCP_HQD_GDS_RESOURCE_STATE': (8155, 0, {'oa_required': (0, 0), 'oa_acquired': (1, 1), 'gws_size': (4, 9), 'gws_pntr': (12, 17)}), + 'regCP_HQD_ERROR': (8156, 0, {'edc_error_id': (0, 3), 'sua_error': (4, 4), 'aql_error': (5, 5), 'pq_utcl1_error': (8, 8), 'ib_utcl1_error': (9, 9), 'eop_utcl1_error': (10, 10), 'iq_utcl1_error': (11, 11), 'rrpt_utcl1_error': (12, 12), 'wpp_utcl1_error': (13, 13), 'sem_utcl1_error': (14, 14), 'dma_src_utcl1_error': (15, 15), 'dma_dst_utcl1_error': (16, 16), 'sr_utcl1_error': (17, 17), 'qu_utcl1_error': (18, 18), 'tc_utcl1_error': (19, 19)}), + 'regCP_HQD_EOP_WPTR_MEM': (8157, 0, {'wptr': (0, 12)}), + 'regCP_HQD_AQL_CONTROL': (8158, 0, {'control0': (0, 14), 'control0_en': (15, 15), 'control1': (16, 30), 'control1_en': (31, 31)}), + 'regCP_HQD_PQ_WPTR_LO': (8159, 0, {'offset': (0, 31)}), + 'regCP_HQD_PQ_WPTR_HI': (8160, 0, {'data': (0, 31)}), + 'regCP_HQD_SUSPEND_CNTL_STACK_OFFSET': (8161, 0, {'offset': (2, 15)}), + 'regCP_HQD_SUSPEND_CNTL_STACK_DW_CNT': (8162, 0, {'cnt': (0, 13)}), + 'regCP_HQD_SUSPEND_WG_STATE_OFFSET': (8163, 0, {'offset': (2, 25)}), + 'regCP_HQD_DDID_RPTR': (8164, 0, {'rptr': (0, 10)}), + 'regCP_HQD_DDID_WPTR': (8165, 0, {'wptr': (0, 10)}), + 'regCP_HQD_DDID_INFLIGHT_COUNT': (8166, 0, {'count': (0, 15)}), + 'regCP_HQD_DDID_DELTA_RPT_COUNT': (8167, 0, {'count': (0, 7)}), + 'regCP_HQD_DEQUEUE_STATUS': (8168, 0, {'dequeue_stat': (0, 3), 'suspend_req_pend': (4, 4), 'suspend_req_pend_en': (9, 9), 'dequeue_stat_en': (10, 10)}), + 'regTCP_WATCH0_ADDR_H': (8264, 0, {'addr': (0, 15)}), + 'regTCP_WATCH0_ADDR_L': (8265, 0, {'addr': (7, 31)}), + 'regTCP_WATCH0_CNTL': (8266, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH1_ADDR_H': (8267, 0, {'addr': (0, 15)}), + 'regTCP_WATCH1_ADDR_L': (8268, 0, {'addr': (7, 31)}), + 'regTCP_WATCH1_CNTL': (8269, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH2_ADDR_H': (8270, 0, {'addr': (0, 15)}), + 'regTCP_WATCH2_ADDR_L': (8271, 0, {'addr': (7, 31)}), + 'regTCP_WATCH2_CNTL': (8272, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH3_ADDR_H': (8273, 0, {'addr': (0, 15)}), + 'regTCP_WATCH3_ADDR_L': (8274, 0, {'addr': (7, 31)}), + 'regTCP_WATCH3_CNTL': (8275, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regCP_PERFMON_CNTX_CNTL': (216, 1, {'perfmon_enable': (31, 31)}), + 'regCP_MEC_CNTL': (2050, 1, {'mec_me1_pipe0_reset': (16, 16), 'mec_me1_pipe1_reset': (17, 17), 'mec_me1_pipe2_reset': (18, 18), 'mec_me1_pipe3_reset': (19, 19), 'mec_me2_pipe0_reset': (20, 20), 'mec_me2_pipe1_reset': (21, 21), 'mec_me2_pipe2_reset': (22, 22), 'mec_me2_pipe3_reset': (23, 23), 'mec_invalidate_icache': (27, 27), 'mec_me2_halt': (28, 28), 'mec_me2_step': (29, 29), 'mec_me1_halt': (30, 30), 'mec_me1_step': (31, 31)}), + 'regCP_ME_CNTL': (2051, 1, {'ce_invalidate_icache': (4, 4), 'pfp_invalidate_icache': (6, 6), 'me_invalidate_icache': (8, 8), 'pfp_pipe0_disable': (12, 12), 'pfp_pipe1_disable': (13, 13), 'me_pipe0_disable': (14, 14), 'me_pipe1_disable': (15, 15), 'ce_pipe0_reset': (16, 16), 'ce_pipe1_reset': (17, 17), 'pfp_pipe0_reset': (18, 18), 'pfp_pipe1_reset': (19, 19), 'me_pipe0_reset': (20, 20), 'me_pipe1_reset': (21, 21), 'ce_halt': (24, 24), 'ce_step': (25, 25), 'pfp_halt': (26, 26), 'pfp_step': (27, 27), 'me_halt': (28, 28), 'me_step': (29, 29)}), + 'regGRBM_GFX_CNTL': (2304, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10), 'ctxid': (11, 13)}), + 'regGRBM_NOWHERE': (2305, 1, {'data': (0, 31)}), + 'regSH_MEM_BASES': (2531, 1, {'private_base': (0, 15), 'shared_base': (16, 31)}), + 'regSH_MEM_CONFIG': (2532, 1, {'address_mode': (0, 0), 'alignment_mode': (2, 3), 'initial_inst_prefetch': (14, 15), 'icache_use_gl1': (18, 18)}), + 'regTCP_INVALIDATE': (6560, 1, {'start': (0, 0)}), + 'regTCP_STATUS': (6561, 1, {'tcp_busy': (0, 0), 'input_busy': (1, 1), 'adrs_busy': (2, 2), 'tagrams_busy': (3, 3), 'cntrl_busy': (4, 4), 'lfifo_busy': (5, 5), 'read_busy': (6, 6), 'format_busy': (7, 7), 'vm_busy': (8, 8), 'memif_busy': (9, 9), 'gcr_busy': (10, 10), 'ofifo_busy': (11, 11), 'ofifo_queue_busy': (12, 13), 'xnack_prt': (15, 15)}), + 'regTCP_CNTL': (6562, 1, {'force_hit': (0, 0), 'force_miss': (1, 1), 'flat_buf_cache_swizzle': (5, 5), 'td_data_en_override': (6, 6), 'enable_128b_dcc_comp_read_for_indep64': (7, 7), 'disable_decompression_power_opt': (8, 8), 'disable_write_combining': (9, 9), 'force_eow_total_cnt': (15, 20), 'force_eow_set_cnt': (22, 26), 'disable_z_map': (28, 28), 'force_order_between_read_write_to_same_address': (29, 29), 'astc_ve_msb_tolerant': (31, 31)}), + 'regTCP_CNTL2': (6563, 1, {'ls_disable_clocks': (0, 7), 'tcp_fmt_mgcg_disable': (8, 8), 'tcpf_latency_bypass_disable': (9, 9), 'tcp_write_data_mgcg_disable': (10, 10), 'tcp_inner_block_mgcg_disable': (11, 11), 'tcp_adrs_img_calc_mgcg_disable': (12, 12), 'v64_combine_enable': (13, 13), 'tagram_addr_swizzle_disable': (14, 14), 'return_order_override': (15, 15), 'power_opt_disable': (16, 16), 'gcr_rsp_fgcg_disable': (17, 17), 'perf_en_override': (18, 19), 'tcp_gl1_req_clken_disable': (22, 22), 'tcp_gl1r_src_clken_disable': (23, 23), 'tcp_force_2x_to_load': (24, 24), 'spare_bit': (26, 26), 'tagram_xy_bias_override': (27, 28), 'tcp_req_mgcg_disable': (29, 29), 'tcp_miss_mgcg_disable': (30, 30), 'disable_mipmap_param_calc_self_gating': (31, 31)}), + 'regSCRATCH_REG6': (8262, 1, {'scratch_reg6': (0, 31)}), + 'regSCRATCH_REG7': (8263, 1, {'scratch_reg7': (0, 31)}), + 'regRLC_GPM_PERF_COUNT_0': (8512, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sa_index': (8, 11), 'wgp_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_PERF_COUNT_1': (8513, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sa_index': (8, 11), 'wgp_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regGRBM_GFX_INDEX': (8704, 1, {'instance_index': (0, 6), 'sa_index': (8, 15), 'se_index': (16, 23), 'sa_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_0': (9024, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_1': (9025, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_2': (9026, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_3': (9027, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_4': (9028, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_5': (9029, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_6': (9030, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_7': (9031, 1, {'data': (0, 31)}), + 'regSPI_CONFIG_CNTL': (9280, 1, {'gpr_write_priority': (0, 20), 'exp_priority_order': (21, 23), 'enable_sqg_top_events': (24, 24), 'enable_sqg_bop_events': (25, 25), 'alloc_arb_lru_ena': (28, 28), 'exp_arb_lru_ena': (29, 29), 'ps_pkr_priority_cntl': (30, 31)}), + 'regSPI_CONFIG_CNTL_1': (9281, 1, {'vtx_done_delay': (0, 3), 'interp_one_prim_per_row': (4, 4), 'pc_limit_enable': (5, 6), 'pc_limit_strict': (7, 7), 'ps_group_timeout_mode': (8, 8), 'oreo_expalloc_stall': (9, 9), 'lbpw_cu_chk_cnt': (10, 13), 'csc_pwr_save_disable': (14, 14), 'csg_pwr_save_disable': (15, 15), 'max_vtx_sync_cnt': (16, 20), 'en_user_accum': (21, 21), 'sa_screen_map': (22, 22), 'ps_group_timeout': (23, 31)}), + 'regSPI_CONFIG_CNTL_2': (9282, 1, {'context_save_wait_gds_request_cycle_ovhd': (0, 3), 'context_save_wait_gds_grant_cycle_ovhd': (4, 7), 'pws_csg_wait_disable': (8, 8), 'pws_hs_wait_disable': (9, 9), 'pws_gs_wait_disable': (10, 10), 'pws_ps_wait_disable': (11, 11), 'csc_halt_ack_delay': (12, 16)}), + 'regCP_MEC_RS64_PRGRM_CNTR_START': (10496, 1, {'ip_start': (0, 31)}), + 'regCP_MEC_MTVEC_LO': (10497, 1, {'addr_lo': (0, 31)}), + 'regCP_MEC_MTVEC_HI': (10498, 1, {'addr_lo': (0, 31)}), + 'regCP_MEC_ISA_CNTL': (10499, 1, {'isa_mode': (0, 0)}), + 'regCP_MEC_RS64_CNTL': (10500, 1, {'mec_invalidate_icache': (4, 4), 'mec_pipe0_reset': (16, 16), 'mec_pipe1_reset': (17, 17), 'mec_pipe2_reset': (18, 18), 'mec_pipe3_reset': (19, 19), 'mec_pipe0_active': (26, 26), 'mec_pipe1_active': (27, 27), 'mec_pipe2_active': (28, 28), 'mec_pipe3_active': (29, 29), 'mec_halt': (30, 30), 'mec_step': (31, 31)}), + 'regCP_MEC_MIE_LO': (10501, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_MIE_HI': (10502, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT': (10503, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_RS64_INSTR_PNTR': (10504, 1, {'instr_pntr': (0, 19)}), + 'regCP_MEC_MIP_LO': (10505, 1, {'mip_lo': (0, 31)}), + 'regCP_MEC_MIP_HI': (10506, 1, {'mip_hi': (0, 31)}), + 'regCP_MEC_DC_BASE_CNTL': (10507, 1, {'vmid': (0, 3), 'cache_policy': (24, 25)}), + 'regCP_MEC_DC_OP_CNTL': (10508, 1, {'invalidate_dcache': (0, 0), 'invalidate_dcache_complete': (1, 1), 'bypass_all': (2, 2)}), + 'regCP_MEC_MTIMECMP_LO': (10509, 1, {'time_lo': (0, 31)}), + 'regCP_MEC_MTIMECMP_HI': (10510, 1, {'time_hi': (0, 31)}), + 'regCP_MEC_GP0_LO': (10512, 1, {'pg_virt_halted': (0, 0), 'data': (1, 31)}), + 'regCP_MEC_GP0_HI': (10513, 1, {'m_ret_addr': (0, 31)}), + 'regCP_MEC_GP1_LO': (10514, 1, {'rd_wr_select_lo': (0, 31)}), + 'regCP_MEC_GP1_HI': (10515, 1, {'rd_wr_select_hi': (0, 31)}), + 'regCP_MEC_GP2_LO': (10516, 1, {'stack_pntr_lo': (0, 31)}), + 'regCP_MEC_GP2_HI': (10517, 1, {'stack_pntr_hi': (0, 31)}), + 'regCP_MEC_GP3_LO': (10518, 1, {'data': (0, 31)}), + 'regCP_MEC_GP3_HI': (10519, 1, {'data': (0, 31)}), + 'regCP_MEC_GP4_LO': (10520, 1, {'data': (0, 31)}), + 'regCP_MEC_GP4_HI': (10521, 1, {'data': (0, 31)}), + 'regCP_MEC_GP5_LO': (10522, 1, {'pg_virt_halted': (0, 0), 'data': (1, 31)}), + 'regCP_MEC_GP5_HI': (10523, 1, {'m_ret_addr': (0, 31)}), + 'regCP_MEC_GP6_LO': (10524, 1, {'rd_wr_select_lo': (0, 31)}), + 'regCP_MEC_GP6_HI': (10525, 1, {'rd_wr_select_hi': (0, 31)}), + 'regCP_MEC_GP7_LO': (10526, 1, {'stack_pntr_lo': (0, 31)}), + 'regCP_MEC_GP7_HI': (10527, 1, {'stack_pntr_hi': (0, 31)}), + 'regCP_MEC_GP8_LO': (10528, 1, {'data': (0, 31)}), + 'regCP_MEC_GP8_HI': (10529, 1, {'data': (0, 31)}), + 'regCP_MEC_GP9_LO': (10530, 1, {'data': (0, 31)}), + 'regCP_MEC_GP9_HI': (10531, 1, {'data': (0, 31)}), + 'regCP_MEC_LOCAL_BASE0_LO': (10535, 1, {'base0_lo': (16, 31)}), + 'regCP_MEC_LOCAL_BASE0_HI': (10536, 1, {'base0_hi': (0, 15)}), + 'regCP_MEC_LOCAL_MASK0_LO': (10537, 1, {'mask0_lo': (16, 31)}), + 'regCP_MEC_LOCAL_MASK0_HI': (10538, 1, {'mask0_hi': (0, 15)}), + 'regCP_MEC_LOCAL_APERTURE': (10539, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_INSTR_BASE_LO': (10540, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_LOCAL_INSTR_BASE_HI': (10541, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_LOCAL_INSTR_MASK_LO': (10542, 1, {'mask_lo': (16, 31)}), + 'regCP_MEC_LOCAL_INSTR_MASK_HI': (10543, 1, {'mask_hi': (0, 15)}), + 'regCP_MEC_LOCAL_INSTR_APERTURE': (10544, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_SCRATCH_APERTURE': (10545, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_SCRATCH_BASE_LO': (10546, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_LOCAL_SCRATCH_BASE_HI': (10547, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_RS64_PERFCOUNT_CNTL': (10548, 1, {'event_sel': (0, 4)}), + 'regCP_MEC_RS64_PENDING_INTERRUPT': (10549, 1, {'pending_interrupt': (0, 31)}), + 'regCP_MEC_RS64_PRGRM_CNTR_START_HI': (10552, 1, {'ip_start': (0, 29)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_16': (10554, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_17': (10555, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_18': (10556, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_19': (10557, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_20': (10558, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_21': (10559, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_22': (10560, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_23': (10561, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_24': (10562, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_25': (10563, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_26': (10564, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_27': (10565, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_28': (10566, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_29': (10567, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_30': (10568, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_31': (10569, 1, {'data': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_BASE': (10570, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_MASK': (10571, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_CNTL': (10572, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE1_BASE': (10573, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE1_MASK': (10574, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE1_CNTL': (10575, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE2_BASE': (10576, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE2_MASK': (10577, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE2_CNTL': (10578, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE3_BASE': (10579, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE3_MASK': (10580, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE3_CNTL': (10581, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE4_BASE': (10582, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE4_MASK': (10583, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE4_CNTL': (10584, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE5_BASE': (10585, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE5_MASK': (10586, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE5_CNTL': (10587, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE6_BASE': (10588, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE6_MASK': (10589, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE6_CNTL': (10590, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE7_BASE': (10591, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE7_MASK': (10592, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE7_CNTL': (10593, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE8_BASE': (10594, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE8_MASK': (10595, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE8_CNTL': (10596, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE9_BASE': (10597, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE9_MASK': (10598, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE9_CNTL': (10599, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE10_BASE': (10600, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE10_MASK': (10601, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE10_CNTL': (10602, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE11_BASE': (10603, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE11_MASK': (10604, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE11_CNTL': (10605, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE12_BASE': (10606, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE12_MASK': (10607, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE12_CNTL': (10608, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE13_BASE': (10609, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE13_MASK': (10610, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE13_CNTL': (10611, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE14_BASE': (10612, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE14_MASK': (10613, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE14_CNTL': (10614, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regCP_MEC_DC_APERTURE15_BASE': (10615, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE15_MASK': (10616, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE15_CNTL': (10617, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4)}), + 'regGRBM_PERFCOUNTER0_LO': (12352, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER0_HI': (12353, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_PERFCOUNTER1_LO': (12355, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER1_HI': (12356, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE0_PERFCOUNTER_LO': (12357, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE0_PERFCOUNTER_HI': (12358, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_SE1_PERFCOUNTER_LO': (12359, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_SE1_PERFCOUNTER_HI': (12360, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER0_LO': (12736, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER1_LO': (12738, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER2_LO': (12740, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER3_LO': (12742, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER4_LO': (12744, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER5_LO': (12746, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER6_LO': (12748, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER7_LO': (12750, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_LO': (13120, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_HI': (13121, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER1_LO': (13122, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER1_HI': (13123, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER2_LO': (13124, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER2_HI': (13125, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER3_LO': (13126, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER3_HI': (13127, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER_FILTER': (13128, 1, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 4), 'data_format': (5, 11), 'num_format': (13, 16), 'sw_mode': (17, 21), 'num_samples': (22, 23), 'opcode_type': (24, 26), 'slc': (27, 27), 'dlc': (28, 28), 'glc': (29, 29), 'compression_enable': (30, 30)}), + 'regTCP_PERFCOUNTER_FILTER2': (13129, 1, {'req_mode': (0, 2)}), + 'regTCP_PERFCOUNTER_FILTER_EN': (13130, 1, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 2), 'data_format': (3, 3), 'num_format': (4, 4), 'sw_mode': (5, 5), 'num_samples': (6, 6), 'opcode_type': (7, 7), 'slc': (8, 8), 'dlc': (9, 9), 'glc': (10, 10), 'compression_enable': (11, 11), 'req_mode': (12, 12)}), + 'regGL2C_PERFCOUNTER0_LO': (13184, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER0_HI': (13185, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER1_LO': (13186, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER1_HI': (13187, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER2_LO': (13188, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER2_HI': (13189, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER3_LO': (13190, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER3_HI': (13191, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER0_LO': (13440, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER0_HI': (13441, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER1_LO': (13442, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER1_HI': (13443, 1, {'perfcounter_hi': (0, 31)}), + 'regCP_PERFMON_CNTL': (14344, 1, {'perfmon_state': (0, 3), 'spm_perfmon_state': (4, 7), 'perfmon_enable_mode': (8, 9), 'perfmon_sample_enable': (10, 10)}), + 'regGRBM_PERFCOUNTER0_SELECT': (14400, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'gds_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30), 'rmi_busy_user_defined_mask': (31, 31)}), + 'regGRBM_PERFCOUNTER1_SELECT': (14401, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'gds_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30), 'rmi_busy_user_defined_mask': (31, 31)}), + 'regGRBM_SE0_PERFCOUNTER_SELECT': (14402, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27)}), + 'regGRBM_SE1_PERFCOUNTER_SELECT': (14403, 1, {'perf_sel': (0, 5), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (12, 12), 'sx_busy_user_defined_mask': (13, 13), 'spi_busy_user_defined_mask': (15, 15), 'sc_busy_user_defined_mask': (16, 16), 'db_busy_user_defined_mask': (17, 17), 'cb_busy_user_defined_mask': (18, 18), 'pa_busy_user_defined_mask': (20, 20), 'bci_busy_user_defined_mask': (21, 21), 'rmi_busy_user_defined_mask': (22, 22), 'utcl1_busy_user_defined_mask': (23, 23), 'tcp_busy_user_defined_mask': (24, 24), 'gl1cc_busy_user_defined_mask': (25, 25), 'gl1h_busy_user_defined_mask': (26, 26), 'pc_busy_user_defined_mask': (27, 27)}), + 'regGRBM_PERFCOUNTER0_SELECT_HI': (14413, 1, {'utcl1_busy_user_defined_mask': (1, 1), 'gl2cc_busy_user_defined_mask': (2, 2), 'sdma_busy_user_defined_mask': (3, 3), 'ch_busy_user_defined_mask': (4, 4), 'ph_busy_user_defined_mask': (5, 5), 'pmm_busy_user_defined_mask': (6, 6), 'gus_busy_user_defined_mask': (7, 7), 'gl1cc_busy_user_defined_mask': (8, 8), 'gl1h_busy_user_defined_mask': (9, 9)}), + 'regGRBM_PERFCOUNTER1_SELECT_HI': (14414, 1, {'utcl1_busy_user_defined_mask': (1, 1), 'gl2cc_busy_user_defined_mask': (2, 2), 'sdma_busy_user_defined_mask': (3, 3), 'ch_busy_user_defined_mask': (4, 4), 'ph_busy_user_defined_mask': (5, 5), 'pmm_busy_user_defined_mask': (6, 6), 'gus_busy_user_defined_mask': (7, 7), 'gl1cc_busy_user_defined_mask': (8, 8), 'gl1h_busy_user_defined_mask': (9, 9)}), + 'regSQ_PERFCOUNTER0_SELECT': (14784, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER1_SELECT': (14785, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER2_SELECT': (14786, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER3_SELECT': (14787, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER4_SELECT': (14788, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER5_SELECT': (14789, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER6_SELECT': (14790, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER7_SELECT': (14791, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER8_SELECT': (14792, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER9_SELECT': (14793, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER10_SELECT': (14794, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER11_SELECT': (14795, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER12_SELECT': (14796, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER13_SELECT': (14797, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER14_SELECT': (14798, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER15_SELECT': (14799, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER_CTRL': (14816, 1, {'ps_en': (0, 0), 'gs_en': (2, 2), 'hs_en': (4, 4), 'cs_en': (6, 6), 'disable_me0pipe0_perf': (14, 14), 'disable_me0pipe1_perf': (15, 15), 'disable_me1pipe0_perf': (16, 16), 'disable_me1pipe1_perf': (17, 17), 'disable_me1pipe2_perf': (18, 18), 'disable_me1pipe3_perf': (19, 19)}), + 'regSQ_PERFCOUNTER_CTRL2': (14818, 1, {'force_en': (0, 0), 'vmid_en': (1, 16)}), + 'regSQ_THREAD_TRACE_BUF0_BASE': (14824, 1, {'base_lo': (0, 31)}), + 'regSQ_THREAD_TRACE_BUF0_SIZE': (14825, 1, {'base_hi': (0, 3), 'size': (8, 29)}), + 'regSQ_THREAD_TRACE_BUF1_BASE': (14826, 1, {'base_lo': (0, 31)}), + 'regSQ_THREAD_TRACE_BUF1_SIZE': (14827, 1, {'base_hi': (0, 3), 'size': (8, 29)}), + 'regSQ_THREAD_TRACE_CTRL': (14828, 1, {'mode': (0, 1), 'all_vmid': (2, 2), 'gl1_perf_en': (3, 3), 'interrupt_en': (4, 4), 'double_buffer': (5, 5), 'hiwater': (6, 8), 'reg_at_hwm': (9, 10), 'spi_stall_en': (11, 11), 'sq_stall_en': (12, 12), 'util_timer': (13, 13), 'wavestart_mode': (14, 15), 'rt_freq': (16, 17), 'sync_count_markers': (18, 18), 'sync_count_draws': (19, 19), 'lowater_offset': (20, 22), 'auto_flush_padding_dis': (28, 28), 'auto_flush_mode': (29, 29), 'draw_event_en': (31, 31)}), + 'regSQ_THREAD_TRACE_MASK': (14829, 1, {'simd_sel': (0, 1), 'wgp_sel': (4, 7), 'sa_sel': (9, 9), 'wtype_include': (10, 16), 'exclude_nondetail_shaderdata': (17, 17)}), + 'regSQ_THREAD_TRACE_TOKEN_MASK': (14830, 1, {'token_exclude': (0, 10), 'ttrace_exec': (11, 11), 'bop_events_token_include': (12, 12), 'reg_include': (16, 23), 'inst_exclude': (24, 25), 'reg_exclude': (26, 28), 'reg_detail_all': (31, 31)}), + 'regSQ_THREAD_TRACE_WPTR': (14831, 1, {'offset': (0, 28), 'buffer_id': (31, 31)}), + 'regSQ_THREAD_TRACE_STATUS': (14836, 1, {'finish_pending': (0, 11), 'finish_done': (12, 23), 'write_error': (24, 24), 'busy': (25, 25), 'owner_vmid': (28, 31)}), + 'regSQ_THREAD_TRACE_STATUS2': (14837, 1, {'buf0_full': (0, 0), 'buf1_full': (1, 1), 'packet_lost_buf_no_lockdown': (4, 4), 'buf_issue_status': (8, 12), 'buf_issue': (13, 13), 'write_buf_full': (14, 14)}), + 'regSQ_THREAD_TRACE_GFX_DRAW_CNTR': (14838, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_GFX_MARKER_CNTR': (14839, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_HP3D_DRAW_CNTR': (14840, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_HP3D_MARKER_CNTR': (14841, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_DROPPED_CNTR': (14842, 1, {'cntr': (0, 31)}), + 'regTCP_PERFCOUNTER0_SELECT': (15168, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER0_SELECT1': (15169, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT': (15170, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT1': (15171, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER2_SELECT': (15172, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER3_SELECT': (15173, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER0_SELECT': (15232, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER0_SELECT1': (15233, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER1_SELECT': (15234, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER1_SELECT1': (15235, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER2_SELECT': (15236, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER3_SELECT': (15237, 1, {'perf_sel': (0, 9), 'cntr_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regRLC_SPM_PERFMON_CNTL': (15488, 1, {'reserved1': (0, 11), 'perfmon_ring_mode': (12, 13), 'disable_gfxclock_count': (14, 14), 'reserved': (15, 15), 'perfmon_sample_interval': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_LO': (15489, 1, {'ring_base_lo': (0, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_HI': (15490, 1, {'ring_base_hi': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_SIZE': (15491, 1, {'ring_base_size': (0, 31)}), + 'regRLC_SPM_RING_WRPTR': (15492, 1, {'reserved': (0, 4), 'perfmon_ring_wrptr': (5, 31)}), + 'regRLC_SPM_RING_RDPTR': (15493, 1, {'perfmon_ring_rdptr': (0, 31)}), + 'regRLC_SPM_SEGMENT_THRESHOLD': (15494, 1, {'num_segment_threshold': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_PERFMON_SEGMENT_SIZE': (15495, 1, {'total_num_segment': (0, 15), 'global_num_segment': (16, 23), 'se_num_segment': (24, 31)}), + 'regRLC_SPM_GLOBAL_MUXSEL_ADDR': (15496, 1, {'addr': (0, 11)}), + 'regRLC_SPM_GLOBAL_MUXSEL_DATA': (15497, 1, {'sel0': (0, 15), 'sel1': (16, 31)}), + 'regRLC_SPM_SE_MUXSEL_ADDR': (15498, 1, {'addr': (0, 11)}), + 'regRLC_SPM_SE_MUXSEL_DATA': (15499, 1, {'sel0': (0, 15), 'sel1': (16, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_ADDR': (15506, 1, {'addr': (0, 6), 'reserved': (7, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_DATA': (15507, 1, {'data': (0, 31)}), + 'regRLC_SPM_ACCUM_SWA_DATARAM_ADDR': (15508, 1, {'addr': (0, 6), 'reserved': (7, 31)}), + 'regRLC_SPM_ACCUM_SWA_DATARAM_DATA': (15509, 1, {'data': (0, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_ADDR': (15510, 1, {'addr': (0, 8), 'reserved': (9, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_DATA': (15511, 1, {'data': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_ADDR_OFFSET': (15512, 1, {'global_offset': (0, 7), 'spmwithaccum_se_offset': (8, 15), 'spmwithaccum_global_offset': (16, 23), 'reserved': (24, 31)}), + 'regRLC_SPM_ACCUM_STATUS': (15513, 1, {'numbsamplescompleted': (0, 7), 'accumdone': (8, 8), 'spmdone': (9, 9), 'accumoverflow': (10, 10), 'accumarmed': (11, 11), 'sequenceinprogress': (12, 12), 'finalsequenceinprogress': (13, 13), 'allfifosempty': (14, 14), 'fsmisidle': (15, 15), 'swaaccumdone': (16, 16), 'swaspmdone': (17, 17), 'swaaccumoverflow': (18, 18), 'swaaccumarmed': (19, 19), 'allsegsdone': (20, 20), 'rearmswapending': (21, 21), 'rearmspppending': (22, 22), 'multisampleaborted': (23, 23), 'reserved': (24, 31)}), + 'regRLC_SPM_ACCUM_CTRL': (15514, 1, {'stroberesetperfmonitors': (0, 0), 'strobestartaccumulation': (1, 1), 'stroberearmaccum': (2, 2), 'stroberesetspmblock': (3, 3), 'strobestartspm': (4, 7), 'stroberearmswaaccum': (8, 8), 'strobestartswa': (9, 9), 'strobeperfmonsamplewires': (10, 10), 'reserved': (11, 31)}), + 'regRLC_SPM_ACCUM_MODE': (15515, 1, {'enableaccum': (0, 0), 'enablespmwithaccummode': (1, 1), 'enablesppmode': (2, 2), 'autoresetperfmondisable': (3, 3), 'autoaccumen': (5, 5), 'swaautoaccumen': (6, 6), 'autospmen': (7, 7), 'swaautospmen': (8, 8), 'globals_loadoverride': (9, 9), 'globals_swaloadoverride': (10, 10), 'se0_loadoverride': (11, 11), 'se0_swaloadoverride': (12, 12)}), + 'regRLC_SPM_ACCUM_THRESHOLD': (15516, 1, {'threshold': (0, 15)}), + 'regRLC_SPM_ACCUM_SAMPLES_REQUESTED': (15517, 1, {'samplesrequested': (0, 7)}), + 'regRLC_SPM_ACCUM_DATARAM_WRCOUNT': (15518, 1, {'dataramwrcount': (0, 18), 'reserved': (19, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_32BITCNTRS_REGIONS': (15519, 1, {'spp_addr_region': (0, 7), 'swa_addr_region': (8, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_PAUSE': (15522, 1, {'pause': (0, 0), 'paused': (1, 1)}), + 'regRLC_SPM_STATUS': (15523, 1, {'ctl_busy': (0, 0), 'rspm_reg_busy': (1, 1), 'spm_rspm_busy': (2, 2), 'spm_rspm_io_busy': (3, 3), 'se_rspm_io_busy': (4, 11), 'accum_busy': (15, 15), 'fsm_master_state': (16, 19), 'fsm_memory_state': (20, 23), 'ctl_req_state': (24, 25), 'ctl_ret_state': (26, 26)}), + 'regRLC_SPM_GFXCLOCK_LOWCOUNT': (15524, 1, {'gfxclock_lowcount': (0, 31)}), + 'regRLC_SPM_GFXCLOCK_HIGHCOUNT': (15525, 1, {'gfxclock_highcount': (0, 31)}), + 'regRLC_SPM_MODE': (15533, 1, {'mode': (0, 0)}), + 'regRLC_SPM_RSPM_REQ_DATA_LO': (15534, 1, {'data': (0, 31)}), + 'regRLC_SPM_RSPM_REQ_DATA_HI': (15535, 1, {'data': (0, 11)}), + 'regRLC_SPM_RSPM_REQ_OP': (15536, 1, {'op': (0, 3)}), + 'regRLC_SPM_RSPM_RET_DATA': (15537, 1, {'data': (0, 31)}), + 'regRLC_SPM_RSPM_RET_OP': (15538, 1, {'op': (0, 3), 'valid': (8, 8)}), + 'regRLC_SPM_SE_RSPM_REQ_DATA_LO': (15539, 1, {'data': (0, 31)}), + 'regRLC_SPM_SE_RSPM_REQ_DATA_HI': (15540, 1, {'data': (0, 11)}), + 'regRLC_SPM_SE_RSPM_REQ_OP': (15541, 1, {'op': (0, 3)}), + 'regRLC_SPM_SE_RSPM_RET_DATA': (15542, 1, {'data': (0, 31)}), + 'regRLC_SPM_SE_RSPM_RET_OP': (15543, 1, {'op': (0, 3), 'valid': (8, 8)}), + 'regRLC_SPM_RSPM_CMD': (15544, 1, {'cmd': (0, 3)}), + 'regRLC_SPM_RSPM_CMD_ACK': (15545, 1, {'se0_ack': (0, 0), 'se1_ack': (1, 1), 'se2_ack': (2, 2), 'se3_ack': (3, 3), 'se4_ack': (4, 4), 'se5_ack': (5, 5), 'se6_ack': (6, 6), 'se7_ack': (7, 7), 'spm_ack': (8, 8)}), + 'regRLC_SPM_SPARE': (15551, 1, {'spare': (0, 31)}), + 'regRLC_PERFMON_CNTL': (15552, 1, {'perfmon_state': (0, 2), 'perfmon_sample_enable': (10, 10)}), + 'regRLC_PERFCOUNTER0_SELECT': (15553, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_PERFCOUNTER1_SELECT': (15554, 1, {'perfcounter_select': (0, 7)}), + 'regCP_MEC_ME1_UCODE_ADDR': (22554, 1, {'ucode_addr': (0, 19)}), + 'regCP_MEC_ME1_UCODE_DATA': (22555, 1, {'ucode_data': (0, 31)}), + 'regCP_MEC_ME2_UCODE_ADDR': (22556, 1, {'ucode_addr': (0, 19)}), + 'regCP_MEC_ME2_UCODE_DATA': (22557, 1, {'ucode_data': (0, 31)}), + 'regCP_MEC_DC_BASE_LO': (22640, 1, {'dc_base_lo': (16, 31)}), + 'regCP_MEC_MDBASE_LO': (22640, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_DC_BASE_HI': (22641, 1, {'dc_base_hi': (0, 15)}), + 'regCP_MEC_MDBASE_HI': (22641, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_MIBOUND_LO': (22642, 1, {'bound_lo': (0, 31)}), + 'regCP_MEC_MIBOUND_HI': (22643, 1, {'bound_hi': (0, 31)}), + 'regCP_MEC_MDBOUND_LO': (22644, 1, {'bound_lo': (0, 31)}), + 'regCP_MEC_MDBOUND_HI': (22645, 1, {'bound_hi': (0, 31)}), + 'regRLC_CNTL': (19456, 1, {'rlc_enable_f32': (0, 0), 'force_retry': (1, 1), 'read_cache_disable': (2, 2), 'rlc_step_f32': (3, 3), 'reserved': (4, 31)}), + 'regRLC_F32_UCODE_VERSION': (19459, 1, {'thread0_version': (0, 9), 'thread1_version': (10, 19), 'thread2_version': (20, 29)}), + 'regRLC_STAT': (19460, 1, {'rlc_busy': (0, 0), 'rlc_srm_busy': (1, 1), 'rlc_gpm_busy': (2, 2), 'rlc_spm_busy': (3, 3), 'mc_busy': (4, 4), 'rlc_thread_0_busy': (5, 5), 'rlc_thread_1_busy': (6, 6), 'rlc_thread_2_busy': (7, 7), 'reserved': (8, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_LSB': (19468, 1, {'timestamp_lsb': (0, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_MSB': (19469, 1, {'timestamp_msb': (0, 31)}), + 'regRLC_GPM_TIMER_INT_0': (19470, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_1': (19471, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_2': (19472, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_3': (19473, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_4': (19474, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_CTRL': (19475, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_2_en': (2, 2), 'timer_3_en': (3, 3), 'timer_4_en': (4, 4), 'reserved_1': (5, 7), 'timer_0_auto_rearm': (8, 8), 'timer_1_auto_rearm': (9, 9), 'timer_2_auto_rearm': (10, 10), 'timer_3_auto_rearm': (11, 11), 'timer_4_auto_rearm': (12, 12), 'reserved_2': (13, 15), 'timer_0_int_clear': (16, 16), 'timer_1_int_clear': (17, 17), 'timer_2_int_clear': (18, 18), 'timer_3_int_clear': (19, 19), 'timer_4_int_clear': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_TIMER_STAT': (19476, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'timer_2_stat': (2, 2), 'timer_3_stat': (3, 3), 'timer_4_stat': (4, 4), 'reserved_1': (5, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_2_enable_sync': (10, 10), 'timer_3_enable_sync': (11, 11), 'timer_4_enable_sync': (12, 12), 'reserved_2': (13, 15), 'timer_0_auto_rearm_sync': (16, 16), 'timer_1_auto_rearm_sync': (17, 17), 'timer_2_auto_rearm_sync': (18, 18), 'timer_3_auto_rearm_sync': (19, 19), 'timer_4_auto_rearm_sync': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_LEGACY_INT_STAT': (19478, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3)}), + 'regRLC_GPM_LEGACY_INT_CLEAR': (19479, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3)}), + 'regRLC_INT_STAT': (19480, 1, {'last_cp_rlc_int_id': (0, 7), 'cp_rlc_int_pending': (8, 8), 'reserved': (9, 31)}), + 'regRLC_MGCG_CTRL': (19482, 1, {'mgcg_en': (0, 0), 'silicon_en': (1, 1), 'simulation_en': (2, 2), 'on_delay': (3, 6), 'off_hysteresis': (7, 14), 'spare': (15, 31)}), + 'regRLC_JUMP_TABLE_RESTORE': (19486, 1, {'addr': (0, 31)}), + 'regRLC_PG_DELAY_2': (19487, 1, {'serdes_timeout_value': (0, 7), 'serdes_cmd_delay': (8, 15), 'perwgp_timeout_value': (16, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB': (19492, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB': (19493, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT': (19494, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_UCODE_CNTL': (19495, 1, {'rlc_ucode_flags': (0, 31)}), + 'regRLC_GPM_THREAD_RESET': (19496, 1, {'thread0_reset': (0, 0), 'thread1_reset': (1, 1), 'thread2_reset': (2, 2), 'thread3_reset': (3, 3), 'reserved': (4, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T0': (19497, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T1': (19498, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_THREAD_INVALIDATE_CACHE': (19499, 1, {'thread0_invalidate_cache': (0, 0), 'thread1_invalidate_cache': (1, 1), 'thread2_invalidate_cache': (2, 2), 'thread3_invalidate_cache': (3, 3), 'reserved': (4, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_LSB': (19504, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_MSB': (19505, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_LSB': (19506, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_MSB': (19507, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_CTRL': (19508, 1, {'gfxclk_run': (0, 0), 'gfxclk_reset': (1, 1), 'gfxclk_sample': (2, 2), 'refclk_run': (3, 3), 'refclk_reset': (4, 4), 'refclk_sample': (5, 5)}), + 'regRLC_CLK_COUNT_STAT': (19509, 1, {'gfxclk_valid': (0, 0), 'refclk_valid': (1, 1), 'refclk_run_resync': (2, 2), 'refclk_reset_resync': (3, 3), 'refclk_sample_resync': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCG_DOORBELL_CNTL': (19510, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21), 'reserved': (22, 31)}), + 'regRLC_RLCG_DOORBELL_STAT': (19511, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCG_DOORBELL_0_DATA_LO': (19512, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_0_DATA_HI': (19513, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_1_DATA_LO': (19514, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_1_DATA_HI': (19515, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_2_DATA_LO': (19516, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_2_DATA_HI': (19517, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_3_DATA_LO': (19518, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_3_DATA_HI': (19519, 1, {'data': (0, 31)}), + 'regRLC_GPU_CLOCK_32_RES_SEL': (19521, 1, {'res_sel': (0, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_CLOCK_32': (19522, 1, {'gpu_clock_32': (0, 31)}), + 'regRLC_PG_CNTL': (19523, 1, {'gfx_power_gating_enable': (0, 0), 'gfx_power_gating_src': (1, 1), 'dyn_per_wgp_pg_enable': (2, 2), 'static_per_wgp_pg_enable': (3, 3), 'gfx_pipeline_pg_enable': (4, 4), 'reserved': (5, 12), 'mem_ds_disable': (13, 13), 'pg_override': (14, 14), 'cp_pg_disable': (15, 15), 'chub_handshake_enable': (16, 16), 'smu_clk_slowdown_on_pu_enable': (17, 17), 'smu_clk_slowdown_on_pd_enable': (18, 18), 'reserved1': (19, 20), 'ultra_low_voltage_enable': (21, 21), 'reserved2': (22, 22), 'smu_handshake_disable': (23, 23)}), + 'regRLC_GPM_THREAD_PRIORITY': (19524, 1, {'thread0_priority': (0, 7), 'thread1_priority': (8, 15), 'thread2_priority': (16, 23), 'thread3_priority': (24, 31)}), + 'regRLC_GPM_THREAD_ENABLE': (19525, 1, {'thread0_enable': (0, 0), 'thread1_enable': (1, 1), 'thread2_enable': (2, 2), 'thread3_enable': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCG_DOORBELL_RANGE': (19527, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_CGTT_MGCG_OVERRIDE': (19528, 1, {'rlc_repeater_fgcg_override': (0, 0), 'rlc_cgtt_sclk_override': (1, 1), 'gfxip_mgcg_override': (2, 2), 'gfxip_cgcg_override': (3, 3), 'gfxip_cgls_override': (4, 4), 'grbm_cgtt_sclk_override': (5, 5), 'gfxip_mgls_override': (6, 6), 'gfxip_gfx3d_cg_override': (7, 7), 'gfxip_fgcg_override': (8, 8), 'gfxip_repeater_fgcg_override': (9, 9), 'perfmon_clock_state': (10, 10), 'reserved_16_11': (11, 16), 'gc_cac_mgcg_clk_cntl': (17, 17), 'se_cac_mgcg_clk_cntl': (18, 18), 'reserved_31_19': (19, 31)}), + 'regRLC_CGCG_CGLS_CTRL': (19529, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL': (19530, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_DYN_PG_STATUS': (19531, 1, {'pg_status_wgp_mask': (0, 31)}), + 'regRLC_DYN_PG_REQUEST': (19532, 1, {'pg_request_wgp_mask': (0, 31)}), + 'regRLC_PG_DELAY': (19533, 1, {'power_up_delay': (0, 7), 'power_down_delay': (8, 15), 'cmd_propagate_delay': (16, 23), 'mem_sleep_delay': (24, 31)}), + 'regRLC_WGP_STATUS': (19534, 1, {'work_pending': (0, 31)}), + 'regRLC_PG_ALWAYS_ON_WGP_MASK': (19539, 1, {'aon_wgp_mask': (0, 31)}), + 'regRLC_MAX_PG_WGP': (19540, 1, {'max_powered_up_wgp': (0, 7), 'spare': (8, 31)}), + 'regRLC_AUTO_PG_CTRL': (19541, 1, {'auto_pg_en': (0, 0), 'auto_grbm_reg_save_on_idle_en': (1, 1), 'auto_wake_up_en': (2, 2), 'grbm_reg_save_gfx_idle_threshold': (3, 18), 'pg_after_grbm_reg_save_threshold': (19, 31)}), + 'regRLC_SERDES_RD_INDEX': (19545, 1, {'data_reg_id': (0, 1), 'spare': (2, 31)}), + 'regRLC_SERDES_RD_DATA_0': (19546, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_1': (19547, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_2': (19548, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_3': (19549, 1, {'data': (0, 31)}), + 'regRLC_SERDES_MASK': (19550, 1, {'gc_center_hub_0': (0, 0), 'gc_center_hub_1': (1, 1), 'reserved': (2, 15), 'gc_se_0': (16, 16), 'gc_se_1': (17, 17), 'gc_se_2': (18, 18), 'gc_se_3': (19, 19), 'gc_se_4': (20, 20), 'gc_se_5': (21, 21), 'gc_se_6': (22, 22), 'gc_se_7': (23, 23), 'reserved_31_24': (24, 31)}), + 'regRLC_SERDES_CTRL': (19551, 1, {'bpm_broadcast': (0, 0), 'bpm_reg_write': (1, 1), 'bpm_long_cmd': (2, 2), 'bpm_addr': (3, 15), 'reg_addr': (16, 23)}), + 'regRLC_SERDES_DATA': (19552, 1, {'data': (0, 31)}), + 'regRLC_SERDES_BUSY': (19553, 1, {'gc_center_hub_0': (0, 0), 'gc_center_hub_1': (1, 1), 'reserved': (2, 15), 'gc_se_0': (16, 16), 'gc_se_1': (17, 17), 'gc_se_2': (18, 18), 'gc_se_3': (19, 19), 'gc_se_4': (20, 20), 'gc_se_5': (21, 21), 'gc_se_6': (22, 22), 'gc_se_7': (23, 23), 'reserved_29_24': (24, 29), 'rd_fifo_not_empty': (30, 30), 'rd_pending': (31, 31)}), + 'regRLC_GPM_GENERAL_0': (19555, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_1': (19556, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_2': (19557, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_3': (19558, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_4': (19559, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_5': (19560, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_6': (19561, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_7': (19562, 1, {'data': (0, 31)}), + 'regRLC_STATIC_PG_STATUS': (19566, 1, {'pg_status_wgp_mask': (0, 31)}), + 'regRLC_GPM_GENERAL_16': (19574, 1, {'data': (0, 31)}), + 'regRLC_PG_DELAY_3': (19576, 1, {'cgcg_active_before_cgpg': (0, 7), 'reserved': (8, 31)}), + 'regRLC_GPR_REG1': (19577, 1, {'data': (0, 31)}), + 'regRLC_GPR_REG2': (19578, 1, {'data': (0, 31)}), + 'regRLC_GPM_INT_DISABLE_TH0': (19580, 1, {'disable_int': (0, 31)}), + 'regRLC_GPM_LEGACY_INT_DISABLE': (19581, 1, {'spp_pvt_int_changed': (0, 0), 'cp_rlc_stat_inval_pend_changed': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3)}), + 'regRLC_GPM_INT_FORCE_TH0': (19582, 1, {'force_int': (0, 31)}), + 'regRLC_SRM_CNTL': (19584, 1, {'srm_enable': (0, 0), 'auto_incr_addr': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_GPM_COMMAND_STATUS': (19592, 1, {'fifo_empty': (0, 0), 'fifo_full': (1, 1), 'reserved': (2, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_0': (19595, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_1': (19596, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_2': (19597, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_3': (19598, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_4': (19599, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_5': (19600, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_6': (19601, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_7': (19602, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_DATA_0': (19603, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_1': (19604, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_2': (19605, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_3': (19606, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_4': (19607, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_5': (19608, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_6': (19609, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_7': (19610, 1, {'data': (0, 31)}), + 'regRLC_SRM_STAT': (19611, 1, {'srm_busy': (0, 0), 'srm_busy_delay': (1, 1), 'reserved': (2, 31)}), + 'regRLC_GPM_GENERAL_8': (19629, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_9': (19630, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_10': (19631, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_11': (19632, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_12': (19633, 1, {'data': (0, 31)}), + 'regRLC_GPM_UTCL1_CNTL_0': (19634, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_GPM_UTCL1_CNTL_1': (19635, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_SPM_UTCL1_CNTL': (19637, 1, {'xnack_redo_timer_cnt': (0, 19), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (30, 31)}), + 'regRLC_UTCL1_STATUS_2': (19638, 1, {'gpm_th0_utcl1_busy': (0, 0), 'gpm_th1_utcl1_busy': (1, 1), 'gpm_th2_utcl1_busy': (2, 2), 'spm_utcl1_busy': (3, 3), 'reserved_1': (4, 4), 'gpm_th0_utcl1_stallontrans': (5, 5), 'gpm_th1_utcl1_stallontrans': (6, 6), 'gpm_th2_utcl1_stallontrans': (7, 7), 'spm_utcl1_stallontrans': (8, 8), 'reserved': (9, 31)}), + 'regRLC_SPM_UTCL1_ERROR_1': (19644, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_SPM_UTCL1_ERROR_2': (19645, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_1': (19646, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_2': (19648, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH1_ERROR_1': (19649, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH1_ERROR_2': (19650, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_CGCG_CGLS_CTRL_3D': (19653, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL_3D': (19654, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_SEMAPHORE_0': (19655, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_1': (19656, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_2': (19657, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_SEMAPHORE_3': (19658, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_PACE_INT_STAT': (19660, 1, {'status': (0, 31)}), + 'regRLC_UTCL1_STATUS': (19668, 1, {'fault_detected': (0, 0), 'retry_detected': (1, 1), 'prt_detected': (2, 2), 'reserved': (3, 7), 'fault_utcl1id': (8, 13), 'reserved_1': (14, 15), 'retry_utcl1id': (16, 21), 'reserved_2': (22, 23), 'prt_utcl1id': (24, 29), 'reserved_3': (30, 31)}), + 'regRLC_R2I_CNTL_0': (19669, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_1': (19670, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_2': (19671, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_3': (19672, 1, {'data': (0, 31)}), + 'regRLC_GPM_INT_STAT_TH0': (19676, 1, {'status': (0, 31)}), + 'regRLC_GPM_GENERAL_13': (19677, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_14': (19678, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_15': (19679, 1, {'data': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_1': (19690, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_2': (19691, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_2': (19692, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_PACE_INT_DISABLE': (19693, 1, {'disable_int': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_2': (19695, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_1': (19707, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_1': (19708, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_RLCV_SPARE_INT': (19712, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_PACE_TIMER_INT_0': (19716, 1, {'timer': (0, 31)}), + 'regRLC_PACE_TIMER_INT_1': (19717, 1, {'timer': (0, 31)}), + 'regRLC_PACE_TIMER_CTRL': (19718, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_0_auto_rearm': (2, 2), 'timer_1_auto_rearm': (3, 3), 'timer_0_int_clear': (4, 4), 'timer_1_int_clear': (5, 5), 'reserved': (6, 31)}), + 'regRLC_SMU_CLK_REQ': (19720, 1, {'valid': (0, 0)}), + 'regRLC_CP_STAT_INVAL_STAT': (19721, 1, {'cpg_stat_inval_pend': (0, 0), 'cpc_stat_inval_pend': (1, 1), 'cpf_stat_inval_pend': (2, 2), 'cpg_stat_inval_pend_changed': (3, 3), 'cpc_stat_inval_pend_changed': (4, 4), 'cpf_stat_inval_pend_changed': (5, 5)}), + 'regRLC_CP_STAT_INVAL_CTRL': (19722, 1, {'cpg_stat_inval_pend_en': (0, 0), 'cpc_stat_inval_pend_en': (1, 1), 'cpf_stat_inval_pend_en': (2, 2)}), + 'regRLC_SPARE': (19723, 1, {'spare': (0, 31)}), + 'regRLC_SPP_CTRL': (19724, 1, {'enable': (0, 0), 'enable_pprof': (1, 1), 'enable_pwr_opt': (2, 2), 'pause': (3, 3)}), + 'regRLC_SPP_SHADER_PROFILE_EN': (19725, 1, {'ps_enable': (0, 0), 'reserved_1': (1, 1), 'gs_enable': (2, 2), 'hs_enable': (3, 3), 'csg_enable': (4, 4), 'cs_enable': (5, 5), 'ps_stop_condition': (6, 6), 'reserved_7': (7, 7), 'gs_stop_condition': (8, 8), 'hs_stop_condition': (9, 9), 'csg_stop_condition': (10, 10), 'cs_stop_condition': (11, 11), 'ps_start_condition': (12, 12), 'cs_start_condition': (13, 13), 'force_miss': (14, 14), 'force_unlocked': (15, 15), 'enable_prof_info_lock': (16, 16)}), + 'regRLC_SPP_SSF_CAPTURE_EN': (19726, 1, {'ps_enable': (0, 0), 'reserved_1': (1, 1), 'gs_enable': (2, 2), 'hs_enable': (3, 3), 'csg_enable': (4, 4), 'cs_enable': (5, 5)}), + 'regRLC_SPP_SSF_THRESHOLD_0': (19727, 1, {'ps_threshold': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SPP_SSF_THRESHOLD_1': (19728, 1, {'gs_threshold': (0, 15), 'hs_threshold': (16, 31)}), + 'regRLC_SPP_SSF_THRESHOLD_2': (19729, 1, {'csg_threshold': (0, 15), 'cs_threshold': (16, 31)}), + 'regRLC_SPP_INFLIGHT_RD_ADDR': (19730, 1, {'addr': (0, 4)}), + 'regRLC_SPP_INFLIGHT_RD_DATA': (19731, 1, {'data': (0, 31)}), + 'regRLC_SPP_PROF_INFO_1': (19736, 1, {'sh_id': (0, 31)}), + 'regRLC_SPP_PROF_INFO_2': (19737, 1, {'sh_type': (0, 3), 'cam_hit': (4, 4), 'cam_lock': (5, 5), 'cam_conflict': (6, 6)}), + 'regRLC_SPP_GLOBAL_SH_ID': (19738, 1, {'sh_id': (0, 31)}), + 'regRLC_SPP_GLOBAL_SH_ID_VALID': (19739, 1, {'valid': (0, 0)}), + 'regRLC_SPP_STATUS': (19740, 1, {'reserved_0': (0, 0), 'ssf_busy': (1, 1), 'event_arb_busy': (2, 2), 'spp_busy': (31, 31)}), + 'regRLC_SPP_PVT_STAT_0': (19741, 1, {'level_0_counter': (0, 5), 'level_1_counter': (6, 11), 'level_2_counter': (12, 17), 'level_3_counter': (18, 23), 'level_4_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_1': (19742, 1, {'level_5_counter': (0, 5), 'level_6_counter': (6, 11), 'level_7_counter': (12, 17), 'level_8_counter': (18, 23), 'level_9_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_2': (19743, 1, {'level_10_counter': (0, 5), 'level_11_counter': (6, 11), 'level_12_counter': (12, 17), 'level_13_counter': (18, 23), 'level_14_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_3': (19744, 1, {'level_15_counter': (0, 5)}), + 'regRLC_SPP_PVT_LEVEL_MAX': (19745, 1, {'level': (0, 3)}), + 'regRLC_SPP_STALL_STATE_UPDATE': (19746, 1, {'stall': (0, 0), 'enable': (1, 1)}), + 'regRLC_SPP_PBB_INFO': (19747, 1, {'pipe0_override': (0, 0), 'pipe0_override_valid': (1, 1), 'pipe1_override': (2, 2), 'pipe1_override_valid': (3, 3)}), + 'regRLC_SPP_RESET': (19748, 1, {'ssf_reset': (0, 0), 'event_arb_reset': (1, 1), 'cam_reset': (2, 2), 'pvt_reset': (3, 3)}), + 'regRLC_RLCP_DOORBELL_RANGE': (19750, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_RLCP_DOORBELL_CNTL': (19751, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21)}), + 'regRLC_RLCP_DOORBELL_STAT': (19752, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCP_DOORBELL_0_DATA_LO': (19753, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_0_DATA_HI': (19754, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_1_DATA_LO': (19755, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_1_DATA_HI': (19756, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_2_DATA_LO': (19757, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_2_DATA_HI': (19758, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_3_DATA_LO': (19759, 1, {'data': (0, 31)}), + 'regRLC_RLCP_DOORBELL_3_DATA_HI': (19760, 1, {'data': (0, 31)}), + 'regRLC_CAC_MASK_CNTL': (19781, 1, {'rlc_cac_mask': (0, 31)}), + 'regRLC_POWER_RESIDENCY_CNTR_CTRL': (19784, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_CLK_RESIDENCY_CNTR_CTRL': (19785, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_DS_RESIDENCY_CNTR_CTRL': (19786, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_ULV_RESIDENCY_CNTR_CTRL': (19787, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_PCC_RESIDENCY_CNTR_CTRL': (19788, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'event_sel': (5, 8), 'reserved': (9, 31)}), + 'regRLC_GENERAL_RESIDENCY_CNTR_CTRL': (19789, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_POWER_RESIDENCY_EVENT_CNTR': (19792, 1, {'data': (0, 31)}), + 'regRLC_CLK_RESIDENCY_EVENT_CNTR': (19793, 1, {'data': (0, 31)}), + 'regRLC_DS_RESIDENCY_EVENT_CNTR': (19794, 1, {'data': (0, 31)}), + 'regRLC_ULV_RESIDENCY_EVENT_CNTR': (19795, 1, {'data': (0, 31)}), + 'regRLC_PCC_RESIDENCY_EVENT_CNTR': (19796, 1, {'data': (0, 31)}), + 'regRLC_GENERAL_RESIDENCY_EVENT_CNTR': (19797, 1, {'data': (0, 31)}), + 'regRLC_POWER_RESIDENCY_REF_CNTR': (19800, 1, {'data': (0, 31)}), + 'regRLC_CLK_RESIDENCY_REF_CNTR': (19801, 1, {'data': (0, 31)}), + 'regRLC_DS_RESIDENCY_REF_CNTR': (19802, 1, {'data': (0, 31)}), + 'regRLC_ULV_RESIDENCY_REF_CNTR': (19803, 1, {'data': (0, 31)}), + 'regRLC_PCC_RESIDENCY_REF_CNTR': (19804, 1, {'data': (0, 31)}), + 'regRLC_GENERAL_RESIDENCY_REF_CNTR': (19805, 1, {'data': (0, 31)}), + 'regRLC_GFX_IH_CLIENT_CTRL': (19806, 1, {'se_interrupt_mask': (0, 7), 'sdma_interrupt_mask': (8, 11), 'utcl2_interrupt_mask': (12, 12), 'reserved_13': (13, 13), 'reserved_15_14': (14, 15), 'se_interrupt_error_clear': (16, 23), 'sdma_interrupt_error_clear': (24, 27), 'utcl2_interrupt_error_clear': (28, 28), 'reserved_29': (29, 29), 'reserved_31_30': (30, 31)}), + 'regRLC_GFX_IH_ARBITER_STAT': (19807, 1, {'client_granted': (0, 15), 'reserved': (16, 27), 'last_client_granted': (28, 31)}), + 'regRLC_GFX_IH_CLIENT_SE_STAT_L': (19808, 1, {'se0_buffer_level': (0, 3), 'se0_buffer_loading': (4, 4), 'se0_buffer_overflow': (5, 5), 'se0_protocol_error': (6, 6), 'se0_reserved': (7, 7), 'se1_buffer_level': (8, 11), 'se1_buffer_loading': (12, 12), 'se1_buffer_overflow': (13, 13), 'se1_protocol_error': (14, 14), 'se1_reserved': (15, 15), 'se2_buffer_level': (16, 19), 'se2_buffer_loading': (20, 20), 'se2_buffer_overflow': (21, 21), 'se2_protocol_error': (22, 22), 'se2_reserved': (23, 23), 'se3_buffer_level': (24, 27), 'se3_buffer_loading': (28, 28), 'se3_buffer_overflow': (29, 29), 'se3_protocol_error': (30, 30), 'se3_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_SE_STAT_H': (19809, 1, {'se4_buffer_level': (0, 3), 'se4_buffer_loading': (4, 4), 'se4_buffer_overflow': (5, 5), 'se4_protocol_error': (6, 6), 'se4_reserved': (7, 7), 'se5_buffer_level': (8, 11), 'se5_buffer_loading': (12, 12), 'se5_buffer_overflow': (13, 13), 'se5_protocol_error': (14, 14), 'se5_reserved': (15, 15), 'se6_buffer_level': (16, 19), 'se6_buffer_loading': (20, 20), 'se6_buffer_overflow': (21, 21), 'se6_protocol_error': (22, 22), 'se6_reserved': (23, 23), 'se7_buffer_level': (24, 27), 'se7_buffer_loading': (28, 28), 'se7_buffer_overflow': (29, 29), 'se7_protocol_error': (30, 30), 'se7_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_SDMA_STAT': (19810, 1, {'sdma0_buffer_level': (0, 3), 'sdma0_buffer_loading': (4, 4), 'sdma0_buffer_overflow': (5, 5), 'sdma0_protocol_error': (6, 6), 'sdma0_reserved': (7, 7), 'sdma1_buffer_level': (8, 11), 'sdma1_buffer_loading': (12, 12), 'sdma1_buffer_overflow': (13, 13), 'sdma1_protocol_error': (14, 14), 'sdma1_reserved': (15, 15), 'sdma2_buffer_level': (16, 19), 'sdma2_buffer_loading': (20, 20), 'sdma2_buffer_overflow': (21, 21), 'sdma2_protocol_error': (22, 22), 'sdma2_reserved': (23, 23), 'sdma3_buffer_level': (24, 27), 'sdma3_buffer_loading': (28, 28), 'sdma3_buffer_overflow': (29, 29), 'sdma3_protocol_error': (30, 30), 'sdma3_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_OTHER_STAT': (19811, 1, {'utcl2_buffer_level': (0, 3), 'utcl2_buffer_loading': (4, 4), 'utcl2_buffer_overflow': (5, 5), 'utcl2_protocol_error': (6, 6), 'utcl2_reserved': (7, 7), 'pmm_reserved': (8, 15), 'reserved_31_16': (16, 31)}), + 'regRLC_SPM_GLOBAL_DELAY_IND_ADDR': (19812, 1, {'addr': (0, 11)}), + 'regRLC_SPM_GLOBAL_DELAY_IND_DATA': (19813, 1, {'data': (0, 5)}), + 'regRLC_SPM_SE_DELAY_IND_ADDR': (19814, 1, {'addr': (0, 11)}), + 'regRLC_SPM_SE_DELAY_IND_DATA': (19815, 1, {'data': (0, 5)}), + 'regRLC_LX6_CNTL': (19840, 1, {'breset': (0, 0), 'runstall': (1, 1), 'pdebug_enable': (2, 2), 'stat_vector_sel': (3, 3)}), + 'regRLC_XT_CORE_STATUS': (19924, 1, {'p_wait_mode': (0, 0), 'p_fatal_error': (1, 1), 'double_exception_error': (2, 2)}), + 'regRLC_XT_CORE_INTERRUPT': (19925, 1, {'extint1': (0, 25), 'extint2': (26, 26), 'nmi': (27, 27)}), + 'regRLC_XT_CORE_FAULT_INFO': (19926, 1, {'fault_info': (0, 31)}), + 'regRLC_XT_CORE_ALT_RESET_VEC': (19927, 1, {'alt_reset_vec': (0, 31)}), + 'regRLC_XT_CORE_RESERVED': (19928, 1, {'reserved': (0, 31)}), + 'regRLC_XT_INT_VEC_FORCE': (19929, 1, {'num_0': (0, 0), 'num_1': (1, 1), 'num_2': (2, 2), 'num_3': (3, 3), 'num_4': (4, 4), 'num_5': (5, 5), 'num_6': (6, 6), 'num_7': (7, 7), 'num_8': (8, 8), 'num_9': (9, 9), 'num_10': (10, 10), 'num_11': (11, 11), 'num_12': (12, 12), 'num_13': (13, 13), 'num_14': (14, 14), 'num_15': (15, 15), 'num_16': (16, 16), 'num_17': (17, 17), 'num_18': (18, 18), 'num_19': (19, 19), 'num_20': (20, 20), 'num_21': (21, 21), 'num_22': (22, 22), 'num_23': (23, 23), 'num_24': (24, 24), 'num_25': (25, 25)}), + 'regRLC_XT_INT_VEC_CLEAR': (19930, 1, {'num_0': (0, 0), 'num_1': (1, 1), 'num_2': (2, 2), 'num_3': (3, 3), 'num_4': (4, 4), 'num_5': (5, 5), 'num_6': (6, 6), 'num_7': (7, 7), 'num_8': (8, 8), 'num_9': (9, 9), 'num_10': (10, 10), 'num_11': (11, 11), 'num_12': (12, 12), 'num_13': (13, 13), 'num_14': (14, 14), 'num_15': (15, 15), 'num_16': (16, 16), 'num_17': (17, 17), 'num_18': (18, 18), 'num_19': (19, 19), 'num_20': (20, 20), 'num_21': (21, 21), 'num_22': (22, 22), 'num_23': (23, 23), 'num_24': (24, 24), 'num_25': (25, 25)}), + 'regRLC_XT_INT_VEC_MUX_SEL': (19931, 1, {'mux_sel': (0, 4)}), + 'regRLC_XT_INT_VEC_MUX_INT_SEL': (19932, 1, {'int_sel': (0, 5)}), + 'regRLC_GPU_CLOCK_COUNT_SPM_LSB': (19940, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_SPM_MSB': (19941, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_SPM_THREAD_TRACE_CTRL': (19942, 1, {'thread_trace_int_en': (0, 0)}), + 'regRLC_SPP_CAM_ADDR': (19944, 1, {'addr': (0, 7)}), + 'regRLC_SPP_CAM_DATA': (19945, 1, {'data': (0, 7), 'tag': (8, 31)}), + 'regRLC_SPP_CAM_EXT_ADDR': (19946, 1, {'addr': (0, 7)}), + 'regRLC_SPP_CAM_EXT_DATA': (19947, 1, {'valid': (0, 0), 'lock': (1, 1)}), + 'regRLC_CPAXI_DOORBELL_MON_CTRL': (19953, 1, {'en': (0, 0), 'id': (1, 5)}), + 'regRLC_CPAXI_DOORBELL_MON_STAT': (19954, 1, {'id_match': (0, 0), 'match_clear': (1, 1), 'addr': (2, 27)}), + 'regRLC_CPAXI_DOORBELL_MON_DATA_LSB': (19955, 1, {'data': (0, 31)}), + 'regRLC_CPAXI_DOORBELL_MON_DATA_MSB': (19956, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_RANGE': (19957, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27)}), + 'regRLC_XT_DOORBELL_CNTL': (19958, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21)}), + 'regRLC_XT_DOORBELL_STAT': (19959, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_XT_DOORBELL_0_DATA_LO': (19960, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_0_DATA_HI': (19961, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_1_DATA_LO': (19962, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_1_DATA_HI': (19963, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_2_DATA_LO': (19964, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_2_DATA_HI': (19965, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_3_DATA_LO': (19966, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_3_DATA_HI': (19967, 1, {'data': (0, 31)}), + 'regRLC_MEM_SLP_CNTL': (19968, 1, {'rlc_mem_ls_en': (0, 0), 'rlc_mem_ds_en': (1, 1), 'rlc_srm_mem_ls_override': (2, 2), 'rlc_srm_mem_ds_override': (3, 3), 'rlc_spm_mem_ls_override': (4, 4), 'rlc_spm_mem_ds_override': (5, 5), 'reserved': (6, 6), 'rlc_ls_ds_busy_override': (7, 7), 'rlc_mem_ls_on_delay': (8, 15), 'rlc_mem_ls_off_delay': (16, 23), 'rlc_spp_mem_ls_override': (24, 24), 'rlc_spp_mem_ds_override': (25, 25), 'reserved1': (26, 31)}), + 'regRLC_RLCV_SAFE_MODE': (19970, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SMU_SAFE_MODE': (19971, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_RLCV_COMMAND': (19972, 1, {'cmd': (0, 3), 'reserved': (4, 31)}), + 'regRLC_SMU_MESSAGE': (19973, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_MESSAGE_1': (19974, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_MESSAGE_2': (19975, 1, {'cmd': (0, 31)}), + 'regRLC_SRM_GPM_COMMAND': (19976, 1, {'op': (0, 0), 'index_cntl': (1, 1), 'index_cntl_num': (2, 4), 'size': (5, 17), 'start_offset': (18, 30), 'dest_memory': (31, 31)}), + 'regRLC_SRM_GPM_ABORT': (19977, 1, {'abort': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SMU_COMMAND': (19978, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_ARGUMENT_1': (19979, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_2': (19980, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_3': (19981, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_4': (19982, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_5': (19983, 1, {'arg': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_ADDR_HI': (19984, 1, {'addr_hi': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_ADDR_LO': (19985, 1, {'addr_lo': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_SIZE': (19986, 1, {'size': (0, 25), 'reserved': (26, 31)}), + 'regRLC_IMU_MISC': (19990, 1, {'throttle_gfx': (0, 0), 'early_mgcg': (1, 1), 'reserved': (2, 31)}), + 'regRLC_IMU_RESET_VECTOR': (19991, 1, {'cold_boot_exit': (0, 0), 'vddgfx_exit': (1, 1), 'vector_3_2': (2, 3), 'fastgfxoff_exit': (4, 4), 'fastgfxoff_exit_to_fullgfxoff': (5, 5), 'vector_7_6': (6, 7), 'reserved': (8, 31)}), + 'regRLC_GPM_STAT': (20075, 1, {'rlc_busy': (0, 0), 'gfx_power_status': (1, 1), 'gfx_clock_status': (2, 2), 'gfx_ls_status': (3, 3), 'gfx_pipeline_power_status': (4, 4), 'cntx_idle_being_processed': (5, 5), 'cntx_busy_being_processed': (6, 6), 'gfx_idle_being_processed': (7, 7), 'cmp_busy_being_processed': (8, 8), 'saving_registers': (9, 9), 'restoring_registers': (10, 10), 'gfx3d_blocks_changing_power_state': (11, 11), 'cmp_blocks_changing_power_state': (12, 12), 'static_wgp_powering_up': (13, 13), 'static_wgp_powering_down': (14, 14), 'dyn_wgp_powering_up': (15, 15), 'dyn_wgp_powering_down': (16, 16), 'aborted_pd_sequence': (17, 17), 'cmp_power_status': (18, 18), 'gfx_ls_status_3d': (19, 19), 'gfx_clock_status_3d': (20, 20), 'mgcg_override_status': (21, 21), 'rlc_exec_rom_code': (22, 22), 'fgcg_override_status': (23, 23), 'pg_error_status': (24, 31)}), + 'regRLC_SAFE_MODE': (2432, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SPM_SAMPLE_CNT': (2433, 1, {'count': (0, 31)}), + 'regRLC_SPM_MC_CNTL': (2434, 1, {'rlc_spm_vmid': (0, 3), 'rlc_spm_policy': (4, 5), 'rlc_spm_perf_cntr': (6, 6), 'rlc_spm_fed': (7, 7), 'rlc_spm_mtype_over': (8, 8), 'rlc_spm_mtype': (9, 11), 'rlc_spm_bc': (12, 12), 'reserved_2': (13, 13), 'rlc_spm_vol': (14, 14), 'rlc_spm_nofill': (15, 15), 'reserved_3': (16, 17), 'rlc_spm_llc_noalloc': (18, 18), 'rlc_spm_llc_noalloc_over': (19, 19), 'reserved': (20, 31)}), + 'regRLC_SPM_INT_CNTL': (2435, 1, {'rlc_spm_int_cntl': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_STATUS': (2436, 1, {'rlc_spm_int_status': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_INFO_1': (2437, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_SPM_INT_INFO_2': (2438, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 23), 'reserved': (24, 31)}), + 'regRLC_CSIB_ADDR_LO': (2439, 1, {'address': (0, 31)}), + 'regRLC_CSIB_ADDR_HI': (2440, 1, {'address': (0, 15)}), + 'regRLC_CSIB_LENGTH': (2441, 1, {'length': (0, 31)}), + 'regRLC_CP_SCHEDULERS': (2442, 1, {'scheduler0': (0, 7), 'scheduler1': (8, 15)}), + 'regRLC_CP_EOF_INT': (2443, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_CP_EOF_INT_CNT': (2444, 1, {'cnt': (0, 31)}), + 'regRLC_SPARE_INT_0': (2445, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_SPARE_INT_1': (2446, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_SPARE_INT_2': (2447, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_PACE_SPARE_INT': (2448, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_PACE_SPARE_INT_1': (2449, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCV_SPARE_INT_1': (2450, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regGRBM_GFX_INDEX_SR_SELECT': (23040, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_INDEX_SR_DATA': (23041, 1, {'instance_index': (0, 7), 'sa_index': (8, 15), 'se_index': (16, 23), 'sa_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_SELECT': (23042, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_DATA': (23043, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10)}), + 'regGRBM_SE_REMAP_CNTL': (23048, 1, {'se0_remap_en': (0, 0), 'se0_remap': (1, 3), 'se1_remap_en': (4, 4), 'se1_remap': (5, 7), 'se2_remap_en': (8, 8), 'se2_remap': (9, 11), 'se3_remap_en': (12, 12), 'se3_remap': (13, 15), 'se4_remap_en': (16, 16), 'se4_remap': (17, 19), 'se5_remap_en': (20, 20), 'se5_remap': (21, 23), 'se6_remap_en': (24, 24), 'se6_remap': (25, 27), 'se7_remap_en': (28, 28), 'se7_remap': (29, 31)}), + 'regGRBM_SA_REMAP_CNTL': (23049, 1, {'se0_sa_remap': (0, 1), 'se1_sa_remap': (2, 3), 'se2_sa_remap': (4, 5), 'se3_sa_remap': (6, 7), 'se4_sa_remap': (8, 9), 'se5_sa_remap': (10, 11), 'se6_sa_remap': (12, 13), 'se7_sa_remap': (14, 15)}), + 'regGRBMH_WGP_REMAP_CNTL': (23050, 1, {'wgp0_remap_en': (0, 0), 'wgp0_remap': (1, 3), 'wgp1_remap_en': (4, 4), 'wgp1_remap': (5, 7), 'wgp2_remap_en': (8, 8), 'wgp2_remap': (9, 11), 'wgp3_remap_en': (12, 12), 'wgp3_remap': (13, 15), 'wgp4_remap_en': (16, 16), 'wgp4_remap': (17, 19), 'wgp5_remap_en': (20, 20), 'wgp5_remap': (21, 23), 'wgp6_remap_en': (24, 24), 'wgp6_remap': (25, 27), 'wgp7_remap_en': (28, 28), 'wgp7_remap': (29, 31)}), + 'regGRBMH_RB_REMAP_CNTL': (23051, 1, {'rb0_remap_en': (0, 0), 'rb0_remap': (1, 3), 'rb1_remap_en': (4, 4), 'rb1_remap': (5, 7), 'rb2_remap_en': (8, 8), 'rb2_remap': (9, 11), 'rb3_remap_en': (12, 12), 'rb3_remap': (13, 15)}), + 'regRLC_SDMA0_STATUS': (23320, 1, {'status': (0, 31)}), + 'regRLC_SDMA1_STATUS': (23321, 1, {'status': (0, 31)}), + 'regRLC_SDMA2_STATUS': (23322, 1, {'status': (0, 31)}), + 'regRLC_SDMA3_STATUS': (23323, 1, {'status': (0, 31)}), + 'regRLC_SDMA0_BUSY_STATUS': (23324, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA1_BUSY_STATUS': (23325, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA2_BUSY_STATUS': (23326, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA3_BUSY_STATUS': (23327, 1, {'busy_status': (0, 31)}), + 'regRLC_HYP_SEMAPHORE_0': (23342, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_HYP_SEMAPHORE_1': (23343, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_BUSY_CLK_CNTL': (23344, 1, {'busy_off_latency': (0, 5), 'grbm_busy_off_latency': (8, 13)}), + 'regRLC_CLK_CNTL': (23345, 1, {'rlc_srm_icg_override': (0, 0), 'rlc_imu_icg_override': (1, 1), 'rlc_spm_icg_override': (2, 2), 'rlc_spm_rspm_icg_override': (3, 3), 'rlc_gpm_icg_override': (4, 4), 'rlc_cmn_icg_override': (5, 5), 'rlc_tc_icg_override': (6, 6), 'rlc_reg_icg_override': (7, 7), 'rlc_sram_clk_gater_override': (8, 8), 'rlc_dgbu_fgcg_override': (9, 9), 'rlc_spp_icg_override': (10, 10), 'reserved_11': (11, 11), 'rlc_tc_fgcg_rep_override': (12, 12), 'reserved_15': (15, 15), 'rlc_utcl2_fgcg_override': (18, 18), 'rlc_ih_gasket_icg_override': (19, 19), 'reserved': (20, 31)}), + 'regRLC_PACE_TIMER_STAT': (23347, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'reserved': (2, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_0_auto_rearm_sync': (10, 10), 'timer_1_auto_rearm_sync': (11, 11)}), + 'regRLC_PACE_INT_FORCE': (23357, 1, {'force_int': (0, 31)}), + 'regRLC_PACE_INT_CLEAR': (23358, 1, {'smu_stretch_pcc_clear': (0, 0), 'smu_pcc_clear': (1, 1)}), + 'regRLC_IH_COOKIE': (23361, 1, {'data': (0, 31)}), + 'regRLC_IH_COOKIE_CNTL': (23362, 1, {'credit': (0, 1), 'reset_counter': (2, 2)}), + 'regRLC_HYP_RLCG_UCODE_CHKSUM': (23363, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_HYP_RLCP_UCODE_CHKSUM': (23364, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_HYP_SEMAPHORE_2': (23378, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_HYP_SEMAPHORE_3': (23379, 1, {'client_id': (0, 4), 'reserved': (5, 31)}), + 'regRLC_GPM_UCODE_ADDR': (23392, 1, {'ucode_addr': (0, 13), 'reserved': (14, 31)}), + 'regRLC_GPM_UCODE_DATA': (23393, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPM_IRAM_ADDR': (23394, 1, {'addr': (0, 31)}), + 'regRLC_GPM_IRAM_DATA': (23395, 1, {'data': (0, 31)}), + 'regRLC_RLCP_IRAM_ADDR': (23396, 1, {'addr': (0, 31)}), + 'regRLC_RLCP_IRAM_DATA': (23397, 1, {'data': (0, 31)}), + 'regRLC_RLCV_IRAM_ADDR': (23398, 1, {'addr': (0, 31)}), + 'regRLC_RLCV_IRAM_DATA': (23399, 1, {'data': (0, 31)}), + 'regRLC_LX6_DRAM_ADDR': (23400, 1, {'addr': (0, 10)}), + 'regRLC_LX6_DRAM_DATA': (23401, 1, {'data': (0, 31)}), + 'regRLC_LX6_IRAM_ADDR': (23402, 1, {'addr': (0, 11)}), + 'regRLC_LX6_IRAM_DATA': (23403, 1, {'data': (0, 31)}), + 'regRLC_PACE_UCODE_ADDR': (23404, 1, {'ucode_addr': (0, 11), 'reserved': (12, 31)}), + 'regRLC_PACE_UCODE_DATA': (23405, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPM_SCRATCH_ADDR': (23406, 1, {'addr': (0, 15)}), + 'regRLC_GPM_SCRATCH_DATA': (23407, 1, {'data': (0, 31)}), + 'regRLC_SRM_DRAM_ADDR': (23409, 1, {'addr': (0, 11), 'reserved': (12, 31)}), + 'regRLC_SRM_DRAM_DATA': (23410, 1, {'data': (0, 31)}), + 'regRLC_SRM_ARAM_ADDR': (23411, 1, {'addr': (0, 11), 'reserved': (12, 31)}), + 'regRLC_SRM_ARAM_DATA': (23412, 1, {'data': (0, 31)}), + 'regRLC_PACE_SCRATCH_ADDR': (23415, 1, {'addr': (0, 15)}), + 'regRLC_PACE_SCRATCH_DATA': (23416, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_LSB': (23417, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_MSB': (23418, 1, {'data': (0, 31)}), + 'regCP_MEC_DM_INDEX_ADDR': (23554, 1, {'addr': (0, 31)}), + 'regCP_MEC_DM_INDEX_DATA': (23555, 1, {'data': (0, 31)}), + 'regGRBM_SEC_CNTL': (24077, 1, {}), + 'regGRBM_CAM_INDEX': (24080, 1, {'cam_index': (0, 3)}), + 'regGRBM_HYP_CAM_INDEX': (24080, 1, {'cam_index': (0, 3)}), + 'regGRBM_CAM_DATA': (24081, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regGRBM_HYP_CAM_DATA': (24081, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regGRBM_CAM_DATA_UPPER': (24082, 1, {'cam_addr': (0, 1), 'cam_remapaddr': (16, 17)}), + 'regGRBM_HYP_CAM_DATA_UPPER': (24082, 1, {'cam_addr': (0, 1), 'cam_remapaddr': (16, 17)}), + 'regRLC_GFX_IMU_DATA_0': (16466, 1, {'data': (0, 31)}), + 'regRLC_GFX_IMU_CMD': (16467, 1, {'cmd': (0, 31)}), +} +gc_12_0_0 = { + 'regSDMA0_CNTL': (13, 0, {'trap_enable': (0, 0), 'reserved': (2, 2), 'data_swap_enable': (3, 3), 'fence_swap_enable': (4, 4), 'midcmd_preempt_enable': (5, 5), 'pio_done_ack_enable': (6, 6), 'tmz_midcmd_preempt_enable': (8, 8), 'midcmd_expire_enable': (9, 9), 'cp_mes_int_enable': (10, 10), 'page_retry_timeout_int_enable': (11, 11), 'page_null_int_enable': (12, 12), 'page_fault_int_enable': (13, 13), 'ch_perfcnt_enable': (16, 16), 'midcmd_worldswitch_enable': (17, 17), 'ctxempty_int_enable': (28, 28), 'frozen_int_enable': (29, 29), 'ib_preempt_int_enable': (30, 30), 'rb_preempt_int_enable': (31, 31)}), + 'regSDMA0_CNTL1': (38, 0, {'wptr_poll_frequency': (2, 15)}), + 'regSDMA0_WATCHDOG_CNTL': (43, 0, {'queue_hang_count': (0, 7), 'cmd_timeout_count': (8, 15)}), + 'regSDMA0_UTCL1_CNTL': (53, 0, {'redo_delay': (0, 4), 'page_wait_delay': (5, 8), 'resp_mode': (9, 10), 'force_invalidation': (14, 14), 'force_invreq_heavy': (15, 15), 'wr_exe_perms_ctrl': (16, 16), 'rd_exe_perms_ctrl': (17, 17), 'invack_delay': (18, 21), 'reql2_credit': (24, 29)}), + 'regSDMA0_UTCL1_PAGE': (56, 0, {'invalid_addr': (0, 0), 'req_type': (1, 4), 'use_mtype': (6, 9), 'use_pt_snoop': (10, 10), 'use_io': (11, 11), 'rd_l2_policy': (12, 13), 'wr_l2_policy': (14, 15), 'dma_page_size': (16, 21), 'use_bc': (22, 22), 'addr_is_pa': (23, 23)}), + 'regSDMA0_RLC_CGCG_CTRL': (85, 0, {'cgcg_int_enable': (1, 1), 'mcu_cgcg_allow': (4, 4), 'cgcg_idle_hysteresis': (16, 31)}), + 'regSDMA0_QUEUE0_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_poll_enable': (8, 8), 'rb_swap_enable': (9, 9), 'wptr_poll_swap_enable': (10, 10), 'mcu_wptr_poll_enable': (11, 11), 'rptr_writeback_enable': (12, 12), 'rptr_writeback_swap_enable': (13, 13), 'rptr_writeback_timer': (16, 20), 'rb_priv': (23, 23), 'rb_vmid': (24, 27)}), + 'regSDMA0_QUEUE0_RB_BASE': (129, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_BASE_HI': (130, 0, {'addr': (0, 23)}), + 'regSDMA0_QUEUE0_RB_RPTR': (131, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_HI': (132, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR': (133, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_HI': (134, 0, {'offset': (0, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_ADDR_LO': (135, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_RB_RPTR_ADDR_HI': (136, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_IB_CNTL': (137, 0, {'ib_enable': (0, 0), 'ib_swap_enable': (4, 4), 'switch_inside_ib': (8, 8), 'cmd_vmid': (16, 19)}), + 'regSDMA0_QUEUE0_IB_RPTR': (138, 0, {'offset': (2, 21)}), + 'regSDMA0_QUEUE0_IB_OFFSET': (139, 0, {'offset': (2, 21)}), + 'regSDMA0_QUEUE0_IB_BASE_LO': (140, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_IB_BASE_HI': (141, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_IB_SIZE': (142, 0, {'size': (0, 19)}), + 'regSDMA0_QUEUE0_DOORBELL': (143, 0, {'enable': (28, 28), 'captured': (30, 30)}), + 'regSDMA0_QUEUE0_DOORBELL_LOG': (144, 0, {'be_error': (0, 0), 'data': (2, 31)}), + 'regSDMA0_QUEUE0_DOORBELL_OFFSET': (145, 0, {'offset': (2, 27)}), + 'regSDMA0_QUEUE0_CSA_ADDR_LO': (146, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_CSA_ADDR_HI': (147, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_SCHEDULE_CNTL': (148, 0, {'global_id': (0, 1), 'process_id': (2, 4), 'local_id': (6, 7), 'context_quantum': (8, 15)}), + 'regSDMA0_QUEUE0_IB_SUB_REMAIN': (149, 0, {'size': (0, 13)}), + 'regSDMA0_QUEUE0_PREEMPT': (150, 0, {'ib_preempt': (0, 0)}), + 'regSDMA0_QUEUE0_DUMMY_REG': (151, 0, {'dummy': (0, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_LO': (152, 0, {'addr': (2, 31)}), + 'regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_HI': (153, 0, {'addr': (0, 31)}), + 'regSDMA0_QUEUE0_RB_AQL_CNTL': (154, 0, {'aql_enable': (0, 0), 'aql_packet_size': (1, 7), 'packet_step': (8, 15), 'midcmd_preempt_enable': (16, 16), 'midcmd_preempt_data_restore': (17, 17), 'overlap_enable': (18, 18)}), + 'regSDMA0_QUEUE0_MINOR_PTR_UPDATE': (155, 0, {'enable': (0, 0)}), + 'regSDMA0_QUEUE0_CONTEXT_SWITCH_STATUS': (158, 0, {'rb_preempt_status': (0, 0), 'vm_hole_exception': (1, 1), 'page_exception': (2, 2), 'queue_hang_exception': (5, 5), 'doorbell_error_exception': (6, 6), 'sram_ecc_exception': (7, 7), 'dram_ecc_exception': (8, 8), 'wptr_lt_rptr_exception': (9, 9)}), + 'regSDMA0_QUEUE0_MIDCMD_CNTL': (159, 0, {'data_valid': (0, 0), 'copy_mode': (1, 1), 'split_state': (4, 7), 'allow_preempt': (8, 8)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA0': (160, 0, {'data0': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA1': (161, 0, {'data1': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA2': (162, 0, {'data2': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA3': (163, 0, {'data3': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA4': (164, 0, {'data4': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA5': (165, 0, {'data5': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA6': (166, 0, {'data6': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA7': (167, 0, {'data7': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA8': (168, 0, {'data8': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA9': (169, 0, {'data9': (0, 31)}), + 'regSDMA0_QUEUE0_MIDCMD_DATA10': (170, 0, {'data10': (0, 31)}), + 'regSDMA0_QUEUE0_WAIT_UNSATISFIED_THD': (171, 0, {'threshold': (0, 4)}), + 'regSDMA0_QUEUE0_MQD_BASE_ADDR_LO': (172, 0, {'base_addr_lo': (2, 31)}), + 'regSDMA0_QUEUE0_MQD_BASE_ADDR_HI': (173, 0, {'base_addr_hi': (0, 31)}), + 'regSDMA0_QUEUE0_MQD_CONTROL': (174, 0, {'vmid': (0, 3)}), + 'regSDMA0_QUEUE0_DEQUEUE_REQUEST': (175, 0, {'dequeue_req': (0, 0)}), + 'regSDMA0_QUEUE0_CONTEXT_STATUS': (176, 0, {'selected': (0, 0), 'use_ib': (1, 1), 'idle': (2, 2), 'expired': (3, 3), 'exception': (4, 6), 'ctxsw_able': (7, 7), 'vf_status': (8, 8), 'priv_exception': (9, 9), 'preempt_disable': (10, 10), 'rptr_wb_idle': (11, 11), 'wptr_update_pending': (12, 12), 'wptr_update_fail_count': (16, 23)}), + 'regSDMA0_MCU_CNTL': (22670, 1, {'halt': (0, 0), 'reset': (1, 1), 'dbg_select_bits': (2, 7)}), + 'regSDMA1_CNTL': (1549, 0, {'trap_enable': (0, 0), 'reserved': (2, 2), 'data_swap_enable': (3, 3), 'fence_swap_enable': (4, 4), 'midcmd_preempt_enable': (5, 5), 'pio_done_ack_enable': (6, 6), 'tmz_midcmd_preempt_enable': (8, 8), 'midcmd_expire_enable': (9, 9), 'cp_mes_int_enable': (10, 10), 'page_retry_timeout_int_enable': (11, 11), 'page_null_int_enable': (12, 12), 'page_fault_int_enable': (13, 13), 'ch_perfcnt_enable': (16, 16), 'midcmd_worldswitch_enable': (17, 17), 'ctxempty_int_enable': (28, 28), 'frozen_int_enable': (29, 29), 'ib_preempt_int_enable': (30, 30), 'rb_preempt_int_enable': (31, 31)}), + 'regSDMA1_CNTL1': (1574, 0, {'wptr_poll_frequency': (2, 15)}), + 'regSDMA1_WATCHDOG_CNTL': (1579, 0, {'queue_hang_count': (0, 7), 'cmd_timeout_count': (8, 15)}), + 'regSDMA1_UTCL1_CNTL': (1589, 0, {'redo_delay': (0, 4), 'page_wait_delay': (5, 8), 'resp_mode': (9, 10), 'force_invalidation': (14, 14), 'force_invreq_heavy': (15, 15), 'wr_exe_perms_ctrl': (16, 16), 'rd_exe_perms_ctrl': (17, 17), 'invack_delay': (18, 21), 'reql2_credit': (24, 29)}), + 'regSDMA1_UTCL1_PAGE': (1592, 0, {'invalid_addr': (0, 0), 'req_type': (1, 4), 'use_mtype': (6, 9), 'use_pt_snoop': (10, 10), 'use_io': (11, 11), 'rd_l2_policy': (12, 13), 'wr_l2_policy': (14, 15), 'dma_page_size': (16, 21), 'use_bc': (22, 22), 'addr_is_pa': (23, 23)}), + 'regSDMA1_RLC_CGCG_CTRL': (1621, 0, {'cgcg_int_enable': (1, 1), 'mcu_cgcg_allow': (4, 4), 'cgcg_idle_hysteresis': (16, 31)}), + 'regSDMA1_QUEUE0_RB_CNTL': (1664, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_poll_enable': (8, 8), 'rb_swap_enable': (9, 9), 'wptr_poll_swap_enable': (10, 10), 'mcu_wptr_poll_enable': (11, 11), 'rptr_writeback_enable': (12, 12), 'rptr_writeback_swap_enable': (13, 13), 'rptr_writeback_timer': (16, 20), 'rb_priv': (23, 23), 'rb_vmid': (24, 27)}), + 'regSDMA1_QUEUE0_RB_BASE': (1665, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_RB_BASE_HI': (1666, 0, {'addr': (0, 23)}), + 'regSDMA1_QUEUE0_RB_RPTR': (1667, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_HI': (1668, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR': (1669, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_HI': (1670, 0, {'offset': (0, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_ADDR_LO': (1671, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_RB_RPTR_ADDR_HI': (1672, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_IB_CNTL': (1673, 0, {'ib_enable': (0, 0), 'ib_swap_enable': (4, 4), 'switch_inside_ib': (8, 8), 'cmd_vmid': (16, 19)}), + 'regSDMA1_QUEUE0_IB_RPTR': (1674, 0, {'offset': (2, 21)}), + 'regSDMA1_QUEUE0_IB_OFFSET': (1675, 0, {'offset': (2, 21)}), + 'regSDMA1_QUEUE0_IB_BASE_LO': (1676, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_IB_BASE_HI': (1677, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_IB_SIZE': (1678, 0, {'size': (0, 19)}), + 'regSDMA1_QUEUE0_DOORBELL': (1679, 0, {'enable': (28, 28), 'captured': (30, 30)}), + 'regSDMA1_QUEUE0_DOORBELL_LOG': (1680, 0, {'be_error': (0, 0), 'data': (2, 31)}), + 'regSDMA1_QUEUE0_DOORBELL_OFFSET': (1681, 0, {'offset': (2, 27)}), + 'regSDMA1_QUEUE0_CSA_ADDR_LO': (1682, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_CSA_ADDR_HI': (1683, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_SCHEDULE_CNTL': (1684, 0, {'global_id': (0, 1), 'process_id': (2, 4), 'local_id': (6, 7), 'context_quantum': (8, 15)}), + 'regSDMA1_QUEUE0_IB_SUB_REMAIN': (1685, 0, {'size': (0, 13)}), + 'regSDMA1_QUEUE0_PREEMPT': (1686, 0, {'ib_preempt': (0, 0)}), + 'regSDMA1_QUEUE0_DUMMY_REG': (1687, 0, {'dummy': (0, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_LO': (1688, 0, {'addr': (2, 31)}), + 'regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_HI': (1689, 0, {'addr': (0, 31)}), + 'regSDMA1_QUEUE0_RB_AQL_CNTL': (1690, 0, {'aql_enable': (0, 0), 'aql_packet_size': (1, 7), 'packet_step': (8, 15), 'midcmd_preempt_enable': (16, 16), 'midcmd_preempt_data_restore': (17, 17), 'overlap_enable': (18, 18)}), + 'regSDMA1_QUEUE0_MINOR_PTR_UPDATE': (1691, 0, {'enable': (0, 0)}), + 'regSDMA1_QUEUE0_CONTEXT_SWITCH_STATUS': (1694, 0, {'rb_preempt_status': (0, 0), 'vm_hole_exception': (1, 1), 'page_exception': (2, 2), 'queue_hang_exception': (5, 5), 'doorbell_error_exception': (6, 6), 'sram_ecc_exception': (7, 7), 'dram_ecc_exception': (8, 8), 'wptr_lt_rptr_exception': (9, 9)}), + 'regSDMA1_QUEUE0_MIDCMD_CNTL': (1695, 0, {'data_valid': (0, 0), 'copy_mode': (1, 1), 'split_state': (4, 7), 'allow_preempt': (8, 8)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA0': (1696, 0, {'data0': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA1': (1697, 0, {'data1': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA2': (1698, 0, {'data2': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA3': (1699, 0, {'data3': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA4': (1700, 0, {'data4': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA5': (1701, 0, {'data5': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA6': (1702, 0, {'data6': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA7': (1703, 0, {'data7': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA8': (1704, 0, {'data8': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA9': (1705, 0, {'data9': (0, 31)}), + 'regSDMA1_QUEUE0_MIDCMD_DATA10': (1706, 0, {'data10': (0, 31)}), + 'regSDMA1_QUEUE0_WAIT_UNSATISFIED_THD': (1707, 0, {'threshold': (0, 4)}), + 'regSDMA1_QUEUE0_MQD_BASE_ADDR_LO': (1708, 0, {'base_addr_lo': (2, 31)}), + 'regSDMA1_QUEUE0_MQD_BASE_ADDR_HI': (1709, 0, {'base_addr_hi': (0, 31)}), + 'regSDMA1_QUEUE0_MQD_CONTROL': (1710, 0, {'vmid': (0, 3)}), + 'regSDMA1_QUEUE0_DEQUEUE_REQUEST': (1711, 0, {'dequeue_req': (0, 0)}), + 'regSDMA1_QUEUE0_CONTEXT_STATUS': (1712, 0, {'selected': (0, 0), 'use_ib': (1, 1), 'idle': (2, 2), 'expired': (3, 3), 'exception': (4, 6), 'ctxsw_able': (7, 7), 'vf_status': (8, 8), 'priv_exception': (9, 9), 'preempt_disable': (10, 10), 'rptr_wb_idle': (11, 11), 'wptr_update_pending': (12, 12), 'wptr_update_fail_count': (16, 23)}), + 'regSDMA1_MCU_CNTL': (22702, 1, {'halt': (0, 0), 'reset': (1, 1), 'dbg_select_bits': (2, 7)}), + 'regGRBM_CNTL': (3488, 0, {'read_timeout': (0, 11), 'sed_read_timeout': (16, 27), 'report_last_rderr': (31, 31)}), + 'regGRBM_SKEW_CNTL': (3489, 0, {'skew_top_threshold': (0, 5), 'skew_count': (6, 11)}), + 'regGRBM_STATUS2': (3490, 0, {'me0pipe1_cmdfifo_avail': (0, 3), 'me0pipe1_cf_rq_pending': (4, 4), 'me0pipe1_pf_rq_pending': (5, 5), 'me1pipe0_rq_pending': (6, 6), 'me1pipe1_rq_pending': (7, 7), 'rlc_rq_pending': (14, 14), 'utcl2_busy': (15, 15), 'ea_busy': (16, 16), 'utcl2_rq_pending': (18, 18), 'sdma_sch_rq_pending': (19, 19), 'ea_link_busy': (20, 20), 'sdma_busy': (21, 21), 'sdma0_rq_pending': (22, 22), 'sdma1_rq_pending': (23, 23), 'rlc_busy': (26, 26), 'tcp_busy': (27, 27), 'cpf_busy': (28, 28), 'cpc_busy': (29, 29), 'cpg_busy': (30, 30)}), + 'regGRBM_PWR_CNTL': (3491, 0, {'all_req_type': (0, 1), 'gfx_req_type': (2, 3), 'all_rsp_type': (4, 5), 'gfx_rsp_type': (6, 7), 'gfx_req_en': (14, 14), 'all_req_en': (15, 15)}), + 'regGRBM_STATUS': (3492, 0, {'me0pipe0_cmdfifo_avail': (0, 3), 'sdma_rq_pending': (6, 6), 'me0pipe0_cf_rq_pending': (7, 7), 'me0pipe0_pf_rq_pending': (8, 8), 'sc_clean': (11, 11), 'db_clean': (12, 12), 'cb_clean': (13, 13), 'ta_busy': (14, 14), 'ge_busy_no_dma': (16, 16), 'sx_busy': (20, 20), 'ge_busy': (21, 21), 'spi_busy': (22, 22), 'bci_busy': (23, 23), 'sc_busy': (24, 24), 'pa_busy': (25, 25), 'db_busy': (26, 26), 'any_active': (27, 27), 'cp_coherency_busy': (28, 28), 'cp_busy': (29, 29), 'cb_busy': (30, 30), 'gui_active': (31, 31)}), + 'regGRBM_STATUS_SE0': (3493, 0, {'sc_clean': (0, 0), 'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1xcc_busy': (6, 6), 'pc_busy': (7, 7), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE1': (3494, 0, {'sc_clean': (0, 0), 'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1xcc_busy': (6, 6), 'pc_busy': (7, 7), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS3': (3495, 0, {'grbm_rlc_intr_credit_pending': (5, 5), 'grbm_cpf_intr_credit_pending': (7, 7), 'mespipe0_rq_pending': (8, 8), 'mespipe1_rq_pending': (9, 9), 'ch_busy': (14, 14), 'gl2cc_busy': (15, 15), 'gl1cc_busy': (16, 16), 'pc_busy': (26, 26), 'gl1xcc_busy': (27, 27), 'utcl1_busy': (30, 30), 'pmm_busy': (31, 31)}), + 'regGRBM_SOFT_RESET': (3496, 0, {'soft_reset_cp': (0, 0), 'soft_reset_rlc': (2, 2), 'soft_reset_utcl2': (15, 15), 'soft_reset_gfx': (16, 16), 'soft_reset_cpf': (17, 17), 'soft_reset_cpc': (18, 18), 'soft_reset_cpg': (19, 19), 'soft_reset_cac': (20, 20), 'soft_reset_ea': (22, 22), 'soft_reset_sdma0': (23, 23), 'soft_reset_sdma1': (24, 24)}), + 'regGRBM_GFX_CLKEN_CNTL': (3500, 0, {'prefix_delay_cnt': (0, 3), 'post_delay_cnt': (8, 12)}), + 'regGRBM_WAIT_IDLE_CLOCKS': (3501, 0, {'wait_idle_clocks': (0, 7)}), + 'regGRBM_STATUS_SE2': (3502, 0, {'sc_clean': (0, 0), 'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1xcc_busy': (6, 6), 'pc_busy': (7, 7), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_STATUS_SE3': (3503, 0, {'sc_clean': (0, 0), 'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1xcc_busy': (6, 6), 'pc_busy': (7, 7), 'bci_busy': (22, 22), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'sc_busy': (29, 29), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBM_READ_ERROR': (3510, 0, {'read_address': (2, 19), 'read_pipeid': (20, 21), 'read_meid': (22, 23), 'read_error': (31, 31)}), + 'regGRBM_READ_ERROR2': (3511, 0, {'read_requester_mespipe0': (9, 9), 'read_requester_mespipe1': (10, 10), 'read_requester_mespipe2': (11, 11), 'read_requester_mespipe3': (12, 12), 'read_requester_sdma0': (13, 13), 'read_requester_sdma1': (14, 14), 'read_requester_rlc': (18, 18), 'read_requester_gds_dma': (19, 19), 'read_requester_me0pipe0_cf': (20, 20), 'read_requester_me0pipe0_pf': (21, 21), 'read_requester_me0pipe1_cf': (22, 22), 'read_requester_me0pipe1_pf': (23, 23), 'read_requester_me1pipe0': (24, 24), 'read_requester_me1pipe1': (25, 25), 'read_requester_me1pipe2': (26, 26), 'read_requester_me1pipe3': (27, 27), 'read_requester_me2pipe0': (28, 28), 'read_requester_me2pipe1': (29, 29), 'read_requester_me2pipe2': (30, 30), 'read_requester_me2pipe3': (31, 31)}), + 'regGRBM_INT_CNTL': (3512, 0, {'rderr_int_enable': (0, 0), 'gui_idle_int_enable': (19, 19)}), + 'regGRBM_TRAP_OP': (3513, 0, {'rw': (0, 0)}), + 'regGRBM_TRAP_ADDR': (3514, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_ADDR_MSK': (3515, 0, {'data': (0, 17)}), + 'regGRBM_TRAP_WD': (3516, 0, {'data': (0, 31)}), + 'regGRBM_TRAP_WD_MSK': (3517, 0, {'data': (0, 31)}), + 'regGRBM_DSM_BYPASS': (3518, 0, {'bypass_bits': (0, 1), 'bypass_en': (2, 2)}), + 'regGRBM_WRITE_ERROR': (3519, 0, {'write_requester_rlc': (0, 0), 'write_ssrcid': (2, 5), 'write_vfid': (7, 11), 'write_vf': (12, 12), 'write_vmid': (13, 16), 'tmz': (17, 17), 'cp_secure_wr_illegal': (18, 18), 'write_pipeid': (20, 21), 'write_meid': (22, 23), 'write_error': (31, 31)}), + 'regGRBM_CHIP_REVISION': (3521, 0, {'chip_revision': (0, 7)}), + 'regGRBM_IH_CREDIT': (3524, 0, {'credit_value': (0, 1), 'ih_client_id': (16, 23)}), + 'regGRBM_PWR_CNTL2': (3525, 0, {'pwr_request_halt': (16, 16), 'pwr_gfx3d_request_halt': (20, 20)}), + 'regGRBM_UTCL2_INVAL_RANGE_START': (3526, 0, {'data': (0, 17)}), + 'regGRBM_UTCL2_INVAL_RANGE_END': (3527, 0, {'data': (0, 17)}), + 'regGRBM_INVALID_PIPE': (3529, 0, {'addr': (2, 19), 'pipeid': (20, 21), 'meid': (22, 23), 'queueid': (24, 26), 'ssrcid': (27, 30), 'invalid_pipe': (31, 31)}), + 'regGRBM_FENCE_RANGE0': (3530, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_FENCE_RANGE1': (3531, 0, {'start': (0, 15), 'end': (16, 31)}), + 'regGRBM_CHICKEN_BITS0': (3532, 0, {'grbm_sdma0_reg_fgcg_chick_bit': (0, 0), 'grbm_sdma1_reg_fgcg_chick_bit': (1, 1), 'grbm_cpg_reg_fgcg_chick_bit': (2, 2), 'grbm_cpf_reg_fgcg_chick_bit': (3, 3), 'grbm_utcl2_reg_fgcg_chick_bit': (5, 5), 'grbm_targ0_mcd_reg_clken_chick_bit': (6, 6), 'grbm_targ1_targvf_reg_clken_chick_bit': (7, 7), 'grbm_targ2_targvf_reg_clken_chick_bit': (8, 8), 'grbm_targ3_targvf_reg_clken_chick_bit': (9, 9), 'grbm_targ4_targvf_reg_clken_chick_bit': (10, 10), 'grbm_targ5_reg_clken_chick_bit': (11, 11), 'grbm_targ6_reg_clken_chick_bit': (12, 12), 'grbm_targ7_reg_clken_chick_bit': (13, 13), 'grbm_targ8_reg_clken_chick_bit': (14, 14), 'grbm_targ9_reg_clken_chick_bit': (15, 15), 'grbm_targ10_reg_clken_chick_bit': (16, 16), 'grbm_targ11_reg_clken_chick_bit': (17, 17), 'grbm_grbmhse0_reg_clken_chick_bit': (18, 18), 'grbm_grbmhse1_reg_clken_chick_bit': (19, 19), 'grbm_grbmhse2_reg_clken_chick_bit': (20, 20), 'grbm_grbmhse3_reg_clken_chick_bit': (21, 21), 'grbm_grbmhse4_reg_clken_chick_bit': (22, 22), 'grbm_grbmhse5_reg_clken_chick_bit': (23, 23), 'grbm_grbmhse6_reg_clken_chick_bit': (24, 24), 'grbm_grbmhse7_reg_clken_chick_bit': (25, 25), 'grbm_cpc_reg_clken_chick_bit': (28, 28), 'grbm_gdfll_reg_clken_chick_bit': (30, 30), 'grbm_rlc_reg_clken_chick_bit': (31, 31)}), + 'regGRBM_CHICKEN_BITS1': (3533, 0, {}), + 'regGRBM_SCRATCH_REG0': (3552, 0, {'scratch_reg0': (0, 31)}), + 'regGRBM_SCRATCH_REG1': (3553, 0, {'scratch_reg1': (0, 31)}), + 'regGRBM_SCRATCH_REG2': (3554, 0, {'scratch_reg2': (0, 31)}), + 'regGRBM_SCRATCH_REG3': (3555, 0, {'scratch_reg3': (0, 31)}), + 'regGRBM_SCRATCH_REG4': (3556, 0, {'scratch_reg4': (0, 31)}), + 'regGRBM_SCRATCH_REG5': (3557, 0, {'scratch_reg5': (0, 31)}), + 'regGRBM_SCRATCH_REG6': (3558, 0, {'scratch_reg6': (0, 31)}), + 'regGRBM_SCRATCH_REG7': (3559, 0, {'scratch_reg7': (0, 31)}), + 'regGRBM_INTF_CNTL': (3574, 0, {'grbm_bridge_disable': (0, 0)}), + 'regCP_MEC_ME1_HEADER_DUMP': (3630, 0, {'header_dump': (0, 31)}), + 'regCP_STAT': (3904, 0, {'roq_db_busy': (5, 5), 'roq_ce_db_busy': (6, 6), 'roq_ring_busy': (9, 9), 'roq_indirect1_busy': (10, 10), 'roq_indirect2_busy': (11, 11), 'roq_state_busy': (12, 12), 'dc_busy': (13, 13), 'utcl2iu_busy': (14, 14), 'pfp_busy': (15, 15), 'meq_busy': (16, 16), 'me_busy': (17, 17), 'query_busy': (18, 18), 'interrupt_busy': (20, 20), 'surface_sync_busy': (21, 21), 'dma_busy': (22, 22), 'rciu_busy': (23, 23), 'scratch_ram_busy': (24, 24), 'gcriu_busy': (25, 25), 'ce_busy': (26, 26), 'tciu_busy': (27, 27), 'roq_ce_ring_busy': (28, 28), 'roq_ce_indirect1_busy': (29, 29), 'roq_ce_indirect2_busy': (30, 30), 'cp_busy': (31, 31)}), + 'regCP_RB_WPTR_POLL_CNTL': (3938, 0, {'poll_frequency': (0, 15), 'idle_poll_count': (16, 31)}), + 'regGRBM_CC_GC_SA_UNIT_DISABLE': (4073, 0, {'sa_disable': (8, 23)}), + 'regCOMPUTE_DISPATCH_INITIATOR': (7072, 0, {'compute_shader_en': (0, 0), 'partial_tg_en': (1, 1), 'force_start_at_000': (2, 2), 'ordered_append_enbl': (3, 3), 'ordered_append_mode': (4, 4), 'use_thread_dimensions': (5, 5), 'order_mode': (6, 6), 'scalar_l1_inv_vol': (10, 10), 'vector_l1_inv_vol': (11, 11), 'ping_pong_en': (12, 12), 'tunnel_enable': (13, 13), 'restore': (14, 14), 'cs_w32_en': (15, 15), 'amp_shader_en': (16, 16), 'disable_disp_prempt_en': (17, 17), 'interleave_2d_en': (18, 18), 'ttrace_queue_id': (29, 31)}), + 'regCOMPUTE_DIM_X': (7073, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Y': (7074, 0, {'size': (0, 31)}), + 'regCOMPUTE_DIM_Z': (7075, 0, {'size': (0, 31)}), + 'regCOMPUTE_START_X': (7076, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Y': (7077, 0, {'start': (0, 31)}), + 'regCOMPUTE_START_Z': (7078, 0, {'start': (0, 31)}), + 'regCOMPUTE_NUM_THREAD_X': (7079, 0, {'num_thread_full': (0, 12), 'interleave_bits_x': (13, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Y': (7080, 0, {'num_thread_full': (0, 12), 'interleave_bits_y': (13, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_NUM_THREAD_Z': (7081, 0, {'num_thread_full': (0, 15), 'num_thread_partial': (16, 31)}), + 'regCOMPUTE_PIPELINESTAT_ENABLE': (7082, 0, {'pipelinestat_enable': (0, 0)}), + 'regCOMPUTE_PERFCOUNT_ENABLE': (7083, 0, {'perfcount_enable': (0, 0)}), + 'regCOMPUTE_PGM_LO': (7084, 0, {'data': (0, 31)}), + 'regCOMPUTE_PGM_HI': (7085, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_LO': (7086, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_PKT_ADDR_HI': (7087, 0, {'data': (0, 7)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_LO': (7088, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_SCRATCH_BASE_HI': (7089, 0, {'data': (0, 7)}), + 'regCOMPUTE_PGM_RSRC1': (7090, 0, {'vgprs': (0, 5), 'sgprs': (6, 9), 'priority': (10, 11), 'float_mode': (12, 19), 'priv': (20, 20), 'wg_rr_en': (21, 21), 'debug_mode': (22, 22), 'disable_perf': (23, 23), 'bulky': (24, 24), 'cdbg_user': (25, 25), 'fp16_ovfl': (26, 26), 'wgp_mode': (29, 29), 'mem_ordered': (30, 30), 'fwd_progress': (31, 31)}), + 'regCOMPUTE_PGM_RSRC2': (7091, 0, {'scratch_en': (0, 0), 'user_sgpr': (1, 5), 'dynamic_vgpr': (6, 6), 'tgid_x_en': (7, 7), 'tgid_y_en': (8, 8), 'tgid_z_en': (9, 9), 'tg_size_en': (10, 10), 'tidig_comp_cnt': (11, 12), 'excp_en_msb': (13, 14), 'lds_size': (15, 23), 'excp_en': (24, 30), 'wgp_takeover': (31, 31)}), + 'regCOMPUTE_VMID': (7092, 0, {'data': (0, 3)}), + 'regCOMPUTE_RESOURCE_LIMITS': (7093, 0, {'waves_per_sh': (0, 9), 'tg_per_cu': (12, 15), 'lock_threshold': (16, 21), 'simd_dest_cntl': (22, 22), 'force_simd_dist': (23, 23), 'cu_group_count': (24, 26)}), + 'regCOMPUTE_DESTINATION_EN_SE0': (7094, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE0': (7094, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DESTINATION_EN_SE1': (7095, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE1': (7095, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_TMPRING_SIZE': (7096, 0, {'waves': (0, 11), 'wavesize': (12, 29)}), + 'regCOMPUTE_DESTINATION_EN_SE2': (7097, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE2': (7097, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DESTINATION_EN_SE3': (7098, 0, {'cu_en': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE3': (7098, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_RESTART_X': (7099, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Y': (7100, 0, {'restart': (0, 31)}), + 'regCOMPUTE_RESTART_Z': (7101, 0, {'restart': (0, 31)}), + 'regCOMPUTE_THREAD_TRACE_ENABLE': (7102, 0, {'thread_trace_enable': (0, 0)}), + 'regCOMPUTE_MISC_RESERVED': (7103, 0, {'send_seid': (0, 3), 'reserved4': (4, 4), 'wave_id_base': (5, 16)}), + 'regCOMPUTE_DISPATCH_ID': (7104, 0, {'dispatch_id': (0, 31)}), + 'regCOMPUTE_THREADGROUP_ID': (7105, 0, {'threadgroup_id': (0, 31)}), + 'regCOMPUTE_REQ_CTRL': (7106, 0, {'soft_grouping_en': (0, 0), 'number_of_requests_per_cu': (1, 4), 'soft_grouping_allocation_timeout': (5, 8), 'hard_lock_hysteresis': (9, 9), 'hard_lock_low_threshold': (10, 14), 'producer_request_lockout': (15, 15), 'global_scanning_en': (16, 16), 'allocation_rate_throttling_threshold': (17, 19), 'dedicated_preallocation_buffer_limit': (20, 26)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE8': (7107, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_USER_ACCUM_0': (7108, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_1': (7109, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_2': (7110, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_USER_ACCUM_3': (7111, 0, {'contribution': (0, 6)}), + 'regCOMPUTE_PGM_RSRC3': (7112, 0, {'shared_vgpr_cnt': (0, 3), 'inst_pref_size': (4, 11), 'glg_en': (13, 13), 'image_op': (31, 31)}), + 'regCOMPUTE_DDID_INDEX': (7113, 0, {'index': (0, 10)}), + 'regCOMPUTE_SHADER_CHKSUM': (7114, 0, {'checksum': (0, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE4': (7115, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE5': (7116, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE6': (7117, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_STATIC_THREAD_MGMT_SE7': (7118, 0, {'sa0_cu_en': (0, 15), 'sa1_cu_en': (16, 31)}), + 'regCOMPUTE_DISPATCH_INTERLEAVE': (7119, 0, {'interleave_1d': (0, 9), 'interleave_2d_x_size': (16, 19), 'interleave_2d_y_size': (24, 27)}), + 'regCOMPUTE_RELAUNCH': (7120, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_LO': (7121, 0, {'addr': (0, 31)}), + 'regCOMPUTE_WAVE_RESTORE_ADDR_HI': (7122, 0, {'addr': (0, 15)}), + 'regCOMPUTE_RELAUNCH2': (7123, 0, {'payload': (0, 29), 'is_event': (30, 30), 'is_state': (31, 31)}), + 'regCOMPUTE_PRESCALED_DIM_X': (7125, 0, {'size': (0, 31)}), + 'regCOMPUTE_PRESCALED_DIM_Y': (7126, 0, {'size': (0, 31)}), + 'regCOMPUTE_PRESCALED_DIM_Z': (7127, 0, {'size': (0, 31)}), + 'regCOMPUTE_USER_DATA_0': (7136, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_1': (7137, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_2': (7138, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_3': (7139, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_4': (7140, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_5': (7141, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_6': (7142, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_7': (7143, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_8': (7144, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_9': (7145, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_10': (7146, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_11': (7147, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_12': (7148, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_13': (7149, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_14': (7150, 0, {'data': (0, 31)}), + 'regCOMPUTE_USER_DATA_15': (7151, 0, {'data': (0, 31)}), + 'regCOMPUTE_DISPATCH_TUNNEL': (7197, 0, {'off_delay': (0, 12)}), + 'regCOMPUTE_DISPATCH_END': (7198, 0, {'data': (0, 31)}), + 'regCOMPUTE_NOWHERE': (7199, 0, {'data': (0, 31)}), + 'regGCMC_VM_NB_MMIOBASE': (5536, 0, {'mmiobase': (0, 31)}), + 'regGCMC_VM_NB_MMIOLIMIT': (5537, 0, {'mmiolimit': (0, 31)}), + 'regGCMC_VM_NB_PCI_CTRL': (5538, 0, {'mmioenable': (23, 23)}), + 'regGCMC_VM_NB_PCI_ARB': (5539, 0, {'vga_hole': (3, 3)}), + 'regGCMC_VM_NB_TOP_OF_DRAM_SLOT1': (5540, 0, {'top_of_dram': (23, 31)}), + 'regGCMC_VM_NB_LOWER_TOP_OF_DRAM2': (5541, 0, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regGCMC_VM_NB_UPPER_TOP_OF_DRAM2': (5542, 0, {'upper_tom2': (0, 15)}), + 'regGCMC_VM_FB_OFFSET': (5543, 0, {'fb_offset': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (5544, 0, {'physical_page_number_lsb': (0, 31)}), + 'regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (5545, 0, {'physical_page_number_msb': (0, 3)}), + 'regGCMC_VM_STEERING': (5546, 0, {'default_steering': (0, 1)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_START': (5548, 0, {'address': (0, 23)}), + 'regGCMC_VM_CACHEABLE_DRAM_ADDRESS_END': (5549, 0, {'address': (0, 23)}), + 'regGCMC_VM_LOCAL_SYSMEM_ADDRESS_START': (5550, 0, {'address': (0, 23)}), + 'regGCMC_VM_LOCAL_SYSMEM_ADDRESS_END': (5551, 0, {'address': (0, 23)}), + 'regGCMC_VM_APT_CNTL': (5552, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_START': (5553, 0, {'address': (0, 23)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_END': (5554, 0, {'address': (0, 23)}), + 'regGCMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (5555, 0, {'lock': (0, 0)}), + 'regGCVM_L2_CNTL': (5572, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regGCVM_L2_CNTL2': (5573, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regGCVM_L2_CNTL3': (5574, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regGCVM_L2_STATUS': (5575, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regGCVM_DUMMY_PAGE_FAULT_CNTL': (5576, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_LO32': (5577, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regGCVM_DUMMY_PAGE_FAULT_ADDR_HI32': (5578, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regGCVM_INVALIDATE_CNTL': (5579, 0, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL': (5580, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_CNTL2': (5581, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL3': (5582, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_MM_CNTL4': (5583, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_STATUS_LO32': (5584, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 29), 'prt': (30, 30), 'uce': (31, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_STATUS_HI32': (5585, 0, {'fed': (0, 0)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_LO32': (5586, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_ADDR_HI32': (5587, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (5588, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (5589, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (5591, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (5592, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (5593, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (5594, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (5595, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (5596, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regGCVM_L2_CNTL4': (5597, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regGCVM_L2_MM_GROUP_RT_CLASSES': (5598, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID': (5599, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regGCVM_L2_BANK_SELECT_RESERVED_CID2': (5600, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regGCVM_L2_CACHE_PARITY_CNTL': (5601, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regGCVM_L2_ICG_CTRL': (5602, 0, {'off_hysteresis': (0, 3), 'dynamic_clock_override': (4, 4), 'static_clock_override': (5, 5), 'aon_clock_override': (6, 6), 'perfmon_clock_override': (7, 7)}), + 'regGCVM_L2_CNTL5': (5603, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'utcl2_atc_req_fgcg_off': (16, 16), 'utcl2_atc_invreq_repeater_fgcg_off': (17, 17), 'utcl2_one_outstanding_atc_invreq': (18, 18)}), + 'regGCVM_L2_GCR_CNTL': (5604, 0, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regGCVML2_WALKER_MACRO_THROTTLE_TIME': (5605, 0, {'time': (0, 23)}), + 'regGCVML2_WALKER_MACRO_THROTTLE_FETCH_LIMIT': (5606, 0, {'limit': (1, 15)}), + 'regGCVML2_WALKER_MICRO_THROTTLE_TIME': (5607, 0, {'time': (0, 23)}), + 'regGCVML2_WALKER_MICRO_THROTTLE_FETCH_LIMIT': (5608, 0, {'limit': (1, 15)}), + 'regGCVM_L2_CGTT_BUSY_CTRL': (5609, 0, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regGCVM_L2_PTE_CACHE_DUMP_CNTL': (5610, 0, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regGCVM_L2_PTE_CACHE_DUMP_READ': (5611, 0, {'data': (0, 31)}), + 'regGCVM_L2_BANK_SELECT_MASKS': (5620, 0, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regGCVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (5624, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regGCVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (5625, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regGCMC_VM_FB_LOCATION_BASE': (5652, 0, {'fb_base': (0, 23)}), + 'regGCMC_VM_FB_LOCATION_TOP': (5653, 0, {'fb_top': (0, 23)}), + 'regGCMC_VM_AGP_TOP': (5654, 0, {'agp_top': (0, 23)}), + 'regGCMC_VM_AGP_BOT': (5655, 0, {'agp_bot': (0, 23)}), + 'regGCMC_VM_AGP_BASE': (5656, 0, {'agp_base': (0, 23)}), + 'regGCMC_VM_SYSTEM_APERTURE_LOW_ADDR': (5657, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (5658, 0, {'logical_addr': (0, 29)}), + 'regGCMC_VM_MX_L1_TLB_CNTL': (5659, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 12)}), + 'regGCVM_CONTEXT0_CNTL': (5668, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT1_CNTL': (5669, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT2_CNTL': (5670, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT3_CNTL': (5671, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT4_CNTL': (5672, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT5_CNTL': (5673, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT6_CNTL': (5674, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT7_CNTL': (5675, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT8_CNTL': (5676, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT9_CNTL': (5677, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT10_CNTL': (5678, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT11_CNTL': (5679, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT12_CNTL': (5680, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT13_CNTL': (5681, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT14_CNTL': (5682, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXT15_CNTL': (5683, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23)}), + 'regGCVM_CONTEXTS_DISABLE': (5684, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regGCVM_INVALIDATE_ENG0_SEM': (5685, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG1_SEM': (5686, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG2_SEM': (5687, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG3_SEM': (5688, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG4_SEM': (5689, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG5_SEM': (5690, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG6_SEM': (5691, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG7_SEM': (5692, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG8_SEM': (5693, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG9_SEM': (5694, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG10_SEM': (5695, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG11_SEM': (5696, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG12_SEM': (5697, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG13_SEM': (5698, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG14_SEM': (5699, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG15_SEM': (5700, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG16_SEM': (5701, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG17_SEM': (5702, 0, {'semaphore': (0, 0)}), + 'regGCVM_INVALIDATE_ENG0_REQ': (5703, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG1_REQ': (5704, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG2_REQ': (5705, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG3_REQ': (5706, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG4_REQ': (5707, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG5_REQ': (5708, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG6_REQ': (5709, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG7_REQ': (5710, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG8_REQ': (5711, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG9_REQ': (5712, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG10_REQ': (5713, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG11_REQ': (5714, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG12_REQ': (5715, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG13_REQ': (5716, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG14_REQ': (5717, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG15_REQ': (5718, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG16_REQ': (5719, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG17_REQ': (5720, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regGCVM_INVALIDATE_ENG0_ACK': (5721, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG1_ACK': (5722, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG2_ACK': (5723, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG3_ACK': (5724, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG4_ACK': (5725, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG5_ACK': (5726, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG6_ACK': (5727, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG7_ACK': (5728, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG8_ACK': (5729, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG9_ACK': (5730, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG10_ACK': (5731, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG11_ACK': (5732, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG12_ACK': (5733, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG13_ACK': (5734, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG14_ACK': (5735, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG15_ACK': (5736, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG16_ACK': (5737, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG17_ACK': (5738, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (5739, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (5740, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (5741, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (5742, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (5743, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (5744, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (5745, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (5746, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (5747, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (5748, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (5749, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (5750, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (5751, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (5752, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (5753, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (5754, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (5755, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (5756, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (5757, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (5758, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (5759, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (5760, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (5761, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (5762, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (5763, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (5764, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (5765, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (5766, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (5767, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (5768, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (5769, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (5770, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (5771, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (5772, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (5773, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regGCVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (5774, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (5775, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (5776, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (5777, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (5778, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (5779, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (5780, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (5781, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (5782, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (5783, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (5784, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (5785, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (5786, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (5787, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (5788, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (5789, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (5790, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (5791, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (5792, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (5793, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (5794, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (5795, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (5796, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (5797, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (5798, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (5799, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (5800, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (5801, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (5802, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (5803, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (5804, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (5805, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (5806, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (5807, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (5808, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (5809, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (5810, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (5811, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (5812, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (5813, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (5814, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (5815, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (5816, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (5817, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (5818, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (5819, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (5820, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (5821, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (5822, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (5823, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (5824, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (5825, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (5826, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (5827, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (5828, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (5829, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (5830, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (5831, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (5832, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (5833, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (5834, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (5835, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (5836, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (5837, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (5838, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (5839, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (5840, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (5841, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (5842, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (5843, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (5844, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (5845, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (5846, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (5847, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (5848, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (5849, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (5850, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (5851, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (5852, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (5853, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (5854, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (5855, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (5856, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (5857, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (5858, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (5859, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (5860, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (5861, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (5862, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (5863, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (5864, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (5865, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (5866, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (5867, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (5868, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (5869, 0, {'logical_page_number_lo32': (0, 31)}), + 'regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (5870, 0, {'logical_page_number_hi4': (0, 3)}), + 'regGCVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5871, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5872, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5873, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5874, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5875, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5876, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5877, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5878, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5879, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5880, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5881, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5882, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5883, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5884, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5885, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5886, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (5887, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regGCVML2_PERFCOUNTER2_0_LO': (13536, 1, {'perfcounter_lo': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_1_LO': (13537, 1, {'perfcounter_lo': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_0_HI': (13538, 1, {'perfcounter_hi': (0, 31)}), + 'regGCVML2_PERFCOUNTER2_1_HI': (13539, 1, {'perfcounter_hi': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_LO': (13540, 1, {'counter_lo': (0, 31)}), + 'regGCMC_VM_L2_PERFCOUNTER_HI': (13541, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regGCVML2_PERFCOUNTER2_0_SELECT': (15648, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_1_SELECT': (15649, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_0_SELECT1': (15650, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_1_SELECT1': (15651, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regGCVML2_PERFCOUNTER2_0_MODE': (15652, 1, {'compare_mode0': (0, 1), 'compare_mode1': (2, 3), 'compare_mode2': (4, 5), 'compare_mode3': (6, 7), 'compare_value0': (8, 11), 'compare_value1': (12, 15), 'compare_value2': (16, 19), 'compare_value3': (20, 23)}), + 'regGCVML2_PERFCOUNTER2_1_MODE': (15653, 1, {'compare_mode0': (0, 1), 'compare_mode1': (2, 3), 'compare_mode2': (4, 5), 'compare_mode3': (6, 7), 'compare_value0': (8, 11), 'compare_value1': (12, 15), 'compare_value2': (16, 19), 'compare_value3': (20, 23)}), + 'regGCMC_VM_L2_PERFCOUNTER0_CFG': (15664, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER1_CFG': (15665, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER2_CFG': (15666, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER3_CFG': (15667, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER4_CFG': (15668, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER5_CFG': (15669, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER6_CFG': (15670, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER7_CFG': (15671, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regGCMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (15672, 1, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regGCVM_IOMMU_GPU_HOST_TRANSLATION_ENABLE': (24131, 1, {'gpu_host_translation_enable': (0, 0)}), + 'regGCVM_IOMMU_CONTROL_REGISTER': (24133, 1, {'iommuen': (0, 0)}), + 'regGCVM_IOMMU_PERFORMANCE_OPTIMIZATION_CONTROL_REGISTER': (24134, 1, {'perfopten': (13, 13)}), + 'regCP_INT_CNTL': (7657, 0, {'resume_int_enable': (8, 8), 'suspend_int_enable': (9, 9), 'dma_watch_int_enable': (10, 10), 'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC_DOORBELL_RANGE_LOWER': (7676, 0, {'doorbell_range_lower': (2, 11)}), + 'regCP_MEC_DOORBELL_RANGE_UPPER': (7677, 0, {'doorbell_range_upper': (2, 11)}), + 'regCP_INT_CNTL_RING0': (7690, 0, {'resume_int_enable': (8, 8), 'suspend_int_enable': (9, 9), 'dma_watch_int_enable': (10, 10), 'cp_vm_doorbell_wr_int_enable': (11, 11), 'cp_ecc_error_int_enable': (14, 14), 'gpf_int_enable': (16, 16), 'wrm_poll_timeout_int_enable': (17, 17), 'cmp_busy_int_enable': (18, 18), 'cntx_busy_int_enable': (19, 19), 'cntx_empty_int_enable': (20, 20), 'gfx_idle_int_enable': (21, 21), 'priv_instr_int_enable': (22, 22), 'priv_reg_int_enable': (23, 23), 'opcode_error_int_enable': (24, 24), 'time_stamp_int_enable': (26, 26), 'reserved_bit_error_int_enable': (27, 27), 'generic2_int_enable': (29, 29), 'generic1_int_enable': (30, 30), 'generic0_int_enable': (31, 31)}), + 'regCP_MEC1_F32_INTERRUPT': (7702, 0, {'edc_roq_fed_int': (0, 0), 'priv_reg_int': (1, 1), 'reserved_bit_err_int': (2, 2), 'edc_tc_fed_int': (3, 3), 'edc_gds_fed_int': (4, 4), 'edc_scratch_fed_int': (5, 5), 'wave_restore_int': (6, 6), 'sua_violation_int': (7, 7), 'edc_dma_fed_int': (8, 8), 'iq_timer_int': (9, 9), 'gpf_int_cpf': (10, 10), 'gpf_int_dma': (11, 11), 'gpf_int_cpc': (12, 12), 'edc_sr_mem_fed_int': (13, 13), 'queue_message_int': (14, 14), 'fatal_edc_error_int': (15, 15)}), + 'regCP_PFP_PRGRM_CNTR_START': (7748, 0, {'ip_start': (0, 31)}), + 'regCP_ME_PRGRM_CNTR_START': (7749, 0, {'ip_start': (0, 31)}), + 'regCP_MEC1_PRGRM_CNTR_START': (7750, 0, {'ip_start': (0, 19)}), + 'regCP_MEC1_INTR_ROUTINE_START': (7755, 0, {'ir_start': (0, 19)}), + 'regCP_PFP_PRGRM_CNTR_START_HI': (7769, 0, {'ip_start': (0, 29)}), + 'regCP_ME_PRGRM_CNTR_START_HI': (7801, 0, {'ip_start': (0, 29)}), + 'regCP_HQD_GFX_CONTROL': (7839, 0, {'message': (0, 3), 'misc': (4, 14), 'db_updated_msg_en': (15, 15)}), + 'regCP_HQD_GFX_STATUS': (7840, 0, {'status': (0, 15)}), + 'regCP_MEC_JT_STAT': (7893, 0, {'jt_loaded': (0, 7), 'wr_mask': (16, 23)}), + 'regCP_MQD_BASE_ADDR': (8105, 0, {'base_addr': (2, 31)}), + 'regCP_MQD_BASE_ADDR_HI': (8106, 0, {'base_addr_hi': (0, 15)}), + 'regCP_HQD_ACTIVE': (8107, 0, {'active': (0, 0), 'busy_gate': (1, 1)}), + 'regCP_HQD_VMID': (8108, 0, {'vmid': (0, 3), 'ib_vmid': (8, 11), 'vqid': (16, 25)}), + 'regCP_HQD_PERSISTENT_STATE': (8109, 0, {'preload_req': (0, 0), 'tmz_connect_override': (1, 1), 'suspend_status': (7, 7), 'preload_size': (8, 17), 'tmz_switch_exempt': (18, 18), 'tmz_match_dis': (19, 19), 'wpp_clamp_en': (20, 20), 'wpp_switch_qos_en': (21, 21), 'iq_switch_qos_en': (22, 22), 'ib_switch_qos_en': (23, 23), 'eop_switch_qos_en': (24, 24), 'pq_switch_qos_en': (25, 25), 'tc_offload_qos_en': (26, 26), 'cache_full_packet_en': (27, 27), 'restore_active': (28, 28), 'relaunch_waves': (29, 29), 'qswitch_mode': (30, 30), 'disp_active': (31, 31)}), + 'regCP_HQD_PIPE_PRIORITY': (8110, 0, {'pipe_priority': (0, 1)}), + 'regCP_HQD_QUEUE_PRIORITY': (8111, 0, {'priority_level': (0, 3)}), + 'regCP_HQD_QUANTUM': (8112, 0, {'quantum_en': (0, 0), 'quantum_scale': (4, 4), 'quantum_duration': (8, 13), 'quantum_active': (31, 31)}), + 'regCP_HQD_PQ_BASE': (8113, 0, {'addr': (0, 31)}), + 'regCP_HQD_PQ_BASE_HI': (8114, 0, {'addr_hi': (0, 7)}), + 'regCP_HQD_PQ_RPTR': (8115, 0, {'consumed_offset': (0, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR': (8116, 0, {'rptr_report_addr': (2, 31)}), + 'regCP_HQD_PQ_RPTR_REPORT_ADDR_HI': (8117, 0, {'rptr_report_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR': (8118, 0, {'wptr_addr': (3, 31)}), + 'regCP_HQD_PQ_WPTR_POLL_ADDR_HI': (8119, 0, {'wptr_addr_hi': (0, 15)}), + 'regCP_HQD_PQ_DOORBELL_CONTROL': (8120, 0, {'doorbell_mode': (0, 0), 'doorbell_bif_drop': (1, 1), 'doorbell_offset': (2, 27), 'doorbell_source': (28, 28), 'doorbell_schd_hit': (29, 29), 'doorbell_en': (30, 30), 'doorbell_hit': (31, 31)}), + 'regCP_HQD_PQ_CONTROL': (8122, 0, {'queue_size': (0, 5), 'wptr_carry': (6, 6), 'rptr_carry': (7, 7), 'rptr_block_size': (8, 13), 'queue_full_en': (14, 14), 'pq_empty': (15, 15), 'slot_based_wptr': (18, 19), 'min_avail_size': (20, 21), 'tmz': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'no_update_rptr': (27, 27), 'unord_dispatch': (28, 28), 'tunnel_dispatch': (29, 29), 'priv_state': (30, 30), 'kmd_queue': (31, 31)}), + 'regCP_HQD_IB_BASE_ADDR': (8123, 0, {'ib_base_addr': (2, 31)}), + 'regCP_HQD_IB_BASE_ADDR_HI': (8124, 0, {'ib_base_addr_hi': (0, 15)}), + 'regCP_HQD_IB_RPTR': (8125, 0, {'consumed_offset': (0, 19)}), + 'regCP_HQD_IB_CONTROL': (8126, 0, {'ib_size': (0, 19), 'min_ib_avail_size': (20, 21), 'ib_exe_disable': (23, 23), 'ib_cache_policy': (24, 25), 'ib_priv_state': (30, 30), 'processing_ib': (31, 31)}), + 'regCP_HQD_IQ_TIMER': (8127, 0, {'wait_time': (0, 7), 'retry_type': (8, 10), 'immediate_expire': (11, 11), 'interrupt_type': (12, 13), 'clock_count': (14, 15), 'interrupt_size': (16, 21), 'quantum_timer': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25), 'queue_type': (27, 27), 'rearm_timer': (28, 28), 'process_iq_en': (29, 29), 'processing_iq': (30, 30), 'active': (31, 31)}), + 'regCP_HQD_IQ_RPTR': (8128, 0, {'offset': (0, 5)}), + 'regCP_HQD_DEQUEUE_REQUEST': (8129, 0, {'dequeue_req': (0, 3), 'iq_req_pend': (4, 4), 'dequeue_int': (8, 8), 'iq_req_pend_en': (9, 9), 'dequeue_req_en': (10, 10)}), + 'regCP_HQD_DMA_OFFLOAD': (8130, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_OFFLOAD': (8130, 0, {'dma_offload': (0, 0), 'dma_offload_en': (1, 1), 'aql_offload': (2, 2), 'aql_offload_en': (3, 3), 'eop_offload': (4, 4), 'eop_offload_en': (5, 5)}), + 'regCP_HQD_MSG_TYPE': (8132, 0, {'action': (0, 2), 'save_state': (4, 6)}), + 'regCP_HQD_ATOMIC0_PREOP_LO': (8133, 0, {'atomic0_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC0_PREOP_HI': (8134, 0, {'atomic0_preop_hi': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_LO': (8135, 0, {'atomic1_preop_lo': (0, 31)}), + 'regCP_HQD_ATOMIC1_PREOP_HI': (8136, 0, {'atomic1_preop_hi': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER0': (8137, 0, {'cwsr': (0, 0), 'save_status': (1, 1), 'rsrv': (2, 2), 'static_queue': (3, 5), 'queue_run_once': (6, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'c_inherit_vmid': (9, 9), 'queue_scheduler_type': (10, 12), 'c_queue_use_gws': (13, 13), 'c_queue_debug_en': (14, 14), 'queue_slot_connected': (15, 15), 'mes_interrupt_enabled': (20, 20), 'mes_interrupt_pipe': (21, 22), 'concurrent_process_count': (24, 27), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_STATUS0': (8137, 0, {'cwsr': (0, 0), 'save_status': (1, 1), 'rsrv': (2, 2), 'static_queue': (3, 5), 'queue_run_once': (6, 6), 'scratch_ram_init': (7, 7), 'tcl2_dirty': (8, 8), 'c_inherit_vmid': (9, 9), 'queue_scheduler_type': (10, 12), 'c_queue_use_gws': (13, 13), 'c_queue_debug_en': (14, 14), 'queue_slot_connected': (15, 15), 'mes_interrupt_enabled': (20, 20), 'mes_interrupt_pipe': (21, 22), 'concurrent_process_count': (24, 27), 'queue_idle': (30, 30), 'db_updated_msg_en': (31, 31)}), + 'regCP_HQD_HQ_CONTROL0': (8138, 0, {'control': (0, 31)}), + 'regCP_HQD_HQ_SCHEDULER1': (8138, 0, {'scheduler': (0, 31)}), + 'regCP_MQD_CONTROL': (8139, 0, {'vmid': (0, 3), 'priv_state': (8, 8), 'processing_mqd': (12, 12), 'processing_mqd_en': (13, 13), 'exe_disable': (23, 23), 'cache_policy': (24, 25)}), + 'regCP_HQD_HQ_STATUS1': (8140, 0, {'status': (0, 31)}), + 'regCP_HQD_HQ_CONTROL1': (8141, 0, {'control': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR': (8142, 0, {'base_addr': (0, 31)}), + 'regCP_HQD_EOP_BASE_ADDR_HI': (8143, 0, {'base_addr_hi': (0, 7)}), + 'regCP_HQD_EOP_CONTROL': (8144, 0, {'eop_size': (0, 5), 'processing_eop': (8, 8), 'process_eop_en': (12, 12), 'processing_eopib': (13, 13), 'process_eopib_en': (14, 14), 'halt_fetcher': (21, 21), 'halt_fetcher_en': (22, 22), 'exe_disable': (23, 23), 'cache_policy': (24, 25)}), + 'regCP_HQD_EOP_RPTR': (8145, 0, {'rptr': (0, 12), 'reset_fetcher': (28, 28), 'dequeue_pend': (29, 29), 'rptr_eq_csmd_wptr': (30, 30), 'init_fetcher': (31, 31)}), + 'regCP_HQD_EOP_WPTR': (8146, 0, {'wptr': (0, 12), 'eop_empty': (15, 15), 'eop_avail': (16, 28)}), + 'regCP_HQD_EOP_EVENTS': (8147, 0, {'event_count': (0, 11), 'cs_partial_flush_pend': (16, 16)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_LO': (8148, 0, {'addr': (12, 31)}), + 'regCP_HQD_CTX_SAVE_BASE_ADDR_HI': (8149, 0, {'addr_hi': (0, 15)}), + 'regCP_HQD_CTX_SAVE_CONTROL': (8150, 0, {'policy': (3, 4), 'exe_disable': (23, 23)}), + 'regCP_HQD_CNTL_STACK_OFFSET': (8151, 0, {'offset': (2, 15)}), + 'regCP_HQD_CNTL_STACK_SIZE': (8152, 0, {'size': (12, 15)}), + 'regCP_HQD_WG_STATE_OFFSET': (8153, 0, {'offset': (2, 25)}), + 'regCP_HQD_CTX_SAVE_SIZE': (8154, 0, {'size': (12, 25)}), + 'regCP_HQD_GDS_RESOURCE_STATE': (8155, 0, {'oa_required': (0, 0), 'oa_acquired': (1, 1), 'gws_size': (4, 9), 'gws_pntr': (12, 17)}), + 'regCP_HQD_ERROR': (8156, 0, {'edc_error_id': (0, 3), 'sua_error': (4, 4), 'aql_error': (5, 5), 'pq_utcl1_error': (8, 8), 'ib_utcl1_error': (9, 9), 'eop_utcl1_error': (10, 10), 'iq_utcl1_error': (11, 11), 'rrpt_utcl1_error': (12, 12), 'wpp_utcl1_error': (13, 13), 'dma_src_utcl1_error': (15, 15), 'dma_dst_utcl1_error': (16, 16), 'sr_utcl1_error': (17, 17), 'qu_utcl1_error': (18, 18), 'tc_utcl1_error': (19, 19)}), + 'regCP_HQD_EOP_WPTR_MEM': (8157, 0, {'wptr': (0, 12)}), + 'regCP_HQD_AQL_CONTROL': (8158, 0, {'control0': (0, 14), 'control0_en': (15, 15), 'control1': (16, 30), 'control1_en': (31, 31)}), + 'regCP_HQD_PQ_WPTR_LO': (8159, 0, {'offset': (0, 31)}), + 'regCP_HQD_PQ_WPTR_HI': (8160, 0, {'data': (0, 31)}), + 'regCP_HQD_SUSPEND_CNTL_STACK_OFFSET': (8161, 0, {'offset': (2, 15)}), + 'regCP_HQD_SUSPEND_CNTL_STACK_DW_CNT': (8162, 0, {'cnt': (0, 13)}), + 'regCP_HQD_SUSPEND_WG_STATE_OFFSET': (8163, 0, {'offset': (2, 25)}), + 'regCP_HQD_DDID_RPTR': (8164, 0, {'rptr': (0, 10)}), + 'regCP_HQD_DDID_WPTR': (8165, 0, {'wptr': (0, 10)}), + 'regCP_HQD_DDID_INFLIGHT_COUNT': (8166, 0, {'count': (0, 15)}), + 'regCP_HQD_DDID_DELTA_RPT_COUNT': (8167, 0, {'count': (0, 7)}), + 'regCP_HQD_DEQUEUE_STATUS': (8168, 0, {'dequeue_stat': (0, 3), 'suspend_req_pend': (4, 4), 'suspend_req_pend_en': (9, 9), 'dequeue_stat_en': (10, 10)}), + 'regCP_PERFMON_CNTX_CNTL': (216, 1, {'perfmon_enable': (31, 31)}), + 'regCP_MEC_CNTL': (2050, 1, {'mec_me1_pipe0_reset': (16, 16), 'mec_me1_pipe1_reset': (17, 17), 'mec_invalidate_icache': (27, 27), 'mec_me1_halt': (30, 30), 'mec_me1_step': (31, 31)}), + 'regCP_ME_CNTL': (2051, 1, {'ce_invalidate_icache': (4, 4), 'pfp_invalidate_icache': (6, 6), 'me_invalidate_icache': (8, 8), 'pfp_pipe0_disable': (12, 12), 'pfp_pipe1_disable': (13, 13), 'me_pipe0_disable': (14, 14), 'me_pipe1_disable': (15, 15), 'ce_pipe0_reset': (16, 16), 'ce_pipe1_reset': (17, 17), 'pfp_pipe0_reset': (18, 18), 'pfp_pipe1_reset': (19, 19), 'me_pipe0_reset': (20, 20), 'me_pipe1_reset': (21, 21), 'ce_halt': (24, 24), 'ce_step': (25, 25), 'pfp_halt': (26, 26), 'pfp_step': (27, 27), 'me_halt': (28, 28), 'me_step': (29, 29)}), + 'regGRBM_GFX_CNTL': (2304, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10), 'ctxid': (11, 13)}), + 'regGRBM_NOWHERE': (2305, 1, {'data': (0, 31)}), + 'regSCRATCH_REG6': (8262, 1, {'scratch_reg6': (0, 31)}), + 'regSCRATCH_REG7': (8263, 1, {'scratch_reg7': (0, 31)}), + 'regRLC_GPM_PERF_COUNT_0': (8512, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sa_index': (8, 11), 'wgp_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_PERF_COUNT_1': (8513, 1, {'feature_sel': (0, 3), 'se_index': (4, 7), 'sa_index': (8, 11), 'wgp_index': (12, 15), 'event_sel': (16, 17), 'unused': (18, 19), 'enable': (20, 20), 'reserved': (21, 31)}), + 'regGRBM_GFX_INDEX': (8704, 1, {'instance_index': (0, 6), 'sa_index': (8, 9), 'se_index': (16, 19), 'sa_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regGRBM_NOWHERE_2': (8705, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_PRGRM_CNTR_START': (10496, 1, {'ip_start': (0, 31)}), + 'regCP_MEC_MTVEC_LO': (10497, 1, {'addr_lo': (0, 31)}), + 'regCP_MEC_MTVEC_HI': (10498, 1, {'addr_lo': (0, 31)}), + 'regCP_MEC_RS64_CNTL': (10500, 1, {'spare': (0, 3), 'mec_invalidate_icache': (4, 4), 'mec_pipe0_reset': (16, 16), 'mec_pipe1_reset': (17, 17), 'mec_pipe2_reset': (18, 18), 'mec_pipe3_reset': (19, 19), 'mec_pipe0_active': (26, 26), 'mec_pipe1_active': (27, 27), 'mec_pipe2_active': (28, 28), 'mec_pipe3_active': (29, 29), 'mec_halt': (30, 30), 'mec_step': (31, 31)}), + 'regCP_MEC_MIE_LO': (10501, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_MIE_HI': (10502, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT': (10503, 1, {'mec_int': (0, 31)}), + 'regCP_MEC_RS64_INSTR_PNTR': (10504, 1, {'instr_pntr': (0, 19)}), + 'regCP_MEC_MIP_LO': (10505, 1, {'mip_lo': (0, 31)}), + 'regCP_MEC_MIP_HI': (10506, 1, {'mip_hi': (0, 31)}), + 'regCP_MEC_DC_BASE_CNTL': (10507, 1, {'vmid': (0, 3), 'cache_policy': (24, 25)}), + 'regCP_MEC_DC_OP_CNTL': (10508, 1, {'invalidate_dcache': (0, 0), 'invalidate_dcache_complete': (1, 1), 'bypass_all': (2, 2)}), + 'regCP_MEC_MTIMECMP_LO': (10509, 1, {'time_lo': (0, 31)}), + 'regCP_MEC_MTIMECMP_HI': (10510, 1, {'time_hi': (0, 31)}), + 'regCP_MEC_GP0_LO': (10512, 1, {'pg_virt_halted': (0, 0), 'data': (1, 31)}), + 'regCP_MEC_GP0_HI': (10513, 1, {'m_ret_addr': (0, 31)}), + 'regCP_MEC_GP1_LO': (10514, 1, {'rd_wr_select_lo': (0, 31)}), + 'regCP_MEC_GP1_HI': (10515, 1, {'rd_wr_select_hi': (0, 31)}), + 'regCP_MEC_GP2_LO': (10516, 1, {'stack_pntr_lo': (0, 31)}), + 'regCP_MEC_GP2_HI': (10517, 1, {'stack_pntr_hi': (0, 31)}), + 'regCP_MEC_GP3_LO': (10518, 1, {'data': (0, 31)}), + 'regCP_MEC_GP3_HI': (10519, 1, {'data': (0, 31)}), + 'regCP_MEC_GP4_LO': (10520, 1, {'data': (0, 31)}), + 'regCP_MEC_GP4_HI': (10521, 1, {'data': (0, 31)}), + 'regCP_MEC_GP5_LO': (10522, 1, {'pg_virt_halted': (0, 0), 'data': (1, 31)}), + 'regCP_MEC_GP5_HI': (10523, 1, {'m_ret_addr': (0, 31)}), + 'regCP_MEC_GP6_LO': (10524, 1, {'rd_wr_select_lo': (0, 31)}), + 'regCP_MEC_GP6_HI': (10525, 1, {'rd_wr_select_hi': (0, 31)}), + 'regCP_MEC_GP7_LO': (10526, 1, {'stack_pntr_lo': (0, 31)}), + 'regCP_MEC_GP7_HI': (10527, 1, {'stack_pntr_hi': (0, 31)}), + 'regCP_MEC_GP8_LO': (10528, 1, {'data': (0, 31)}), + 'regCP_MEC_GP8_HI': (10529, 1, {'data': (0, 31)}), + 'regCP_MEC_GP9_LO': (10530, 1, {'data': (0, 31)}), + 'regCP_MEC_GP9_HI': (10531, 1, {'data': (0, 31)}), + 'regCP_MEC_LOCAL_BASE0_LO': (10535, 1, {'base0_lo': (16, 31)}), + 'regCP_MEC_LOCAL_BASE0_HI': (10536, 1, {'base0_hi': (0, 15)}), + 'regCP_MEC_LOCAL_MASK0_LO': (10537, 1, {'mask0_lo': (16, 31)}), + 'regCP_MEC_LOCAL_MASK0_HI': (10538, 1, {'mask0_hi': (0, 15)}), + 'regCP_MEC_LOCAL_APERTURE': (10539, 1, {'aperture': (0, 2), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_LOCAL_INSTR_BASE_LO': (10540, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_LOCAL_INSTR_BASE_HI': (10541, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_LOCAL_INSTR_MASK_LO': (10542, 1, {'mask_lo': (16, 31)}), + 'regCP_MEC_LOCAL_INSTR_MASK_HI': (10543, 1, {'mask_hi': (0, 15)}), + 'regCP_MEC_LOCAL_INSTR_APERTURE': (10544, 1, {'aperture': (0, 2), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_LOCAL_SCRATCH_APERTURE': (10545, 1, {'aperture': (0, 2)}), + 'regCP_MEC_LOCAL_SCRATCH_BASE_LO': (10546, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_LOCAL_SCRATCH_BASE_HI': (10547, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_RS64_PERFCOUNT_CNTL': (10548, 1, {'event_sel': (0, 4)}), + 'regCP_MEC_RS64_PENDING_INTERRUPT': (10549, 1, {'pending_interrupt': (0, 31)}), + 'regCP_MEC_RS64_EXCEPTION_STATUS': (10551, 1, {'rs64_exception_illegal_instruction': (0, 0), 'rs64_exception_misaligned_addr': (1, 1), 'rs64_exception_unaligned_instrutcion': (2, 2), 'rs64_exception_page_fault': (3, 3), 'rs64_exception_instruction_addr': (4, 26)}), + 'regCP_MEC_RS64_PRGRM_CNTR_START_HI': (10552, 1, {'ip_start': (0, 29)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_16': (10554, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_17': (10555, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_18': (10556, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_19': (10557, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_20': (10558, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_21': (10559, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_22': (10560, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_23': (10561, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_24': (10562, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_25': (10563, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_26': (10564, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_27': (10565, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_28': (10566, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_29': (10567, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_30': (10568, 1, {'data': (0, 31)}), + 'regCP_MEC_RS64_INTERRUPT_DATA_31': (10569, 1, {'data': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_BASE': (10570, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_MASK': (10571, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE0_CNTL': (10572, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE1_BASE': (10573, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE1_MASK': (10574, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE1_CNTL': (10575, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE2_BASE': (10576, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE2_MASK': (10577, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE2_CNTL': (10578, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE3_BASE': (10579, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE3_MASK': (10580, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE3_CNTL': (10581, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE4_BASE': (10582, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE4_MASK': (10583, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE4_CNTL': (10584, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE5_BASE': (10585, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE5_MASK': (10586, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE5_CNTL': (10587, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE6_BASE': (10588, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE6_MASK': (10589, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE6_CNTL': (10590, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE7_BASE': (10591, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE7_MASK': (10592, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE7_CNTL': (10593, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE8_BASE': (10594, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE8_MASK': (10595, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE8_CNTL': (10596, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE9_BASE': (10597, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE9_MASK': (10598, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE9_CNTL': (10599, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE10_BASE': (10600, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE10_MASK': (10601, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE10_CNTL': (10602, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE11_BASE': (10603, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE11_MASK': (10604, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE11_CNTL': (10605, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE12_BASE': (10606, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE12_MASK': (10607, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE12_CNTL': (10608, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE13_BASE': (10609, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE13_MASK': (10610, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE13_CNTL': (10611, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE14_BASE': (10612, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE14_MASK': (10613, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE14_CNTL': (10614, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regCP_MEC_DC_APERTURE15_BASE': (10615, 1, {'base': (0, 31)}), + 'regCP_MEC_DC_APERTURE15_MASK': (10616, 1, {'mask': (0, 31)}), + 'regCP_MEC_DC_APERTURE15_CNTL': (10617, 1, {'vmid': (0, 3), 'bypass_mode': (4, 4), 'enable': (5, 5), 'scope': (6, 7), 'temporal': (8, 10)}), + 'regGRBM_PERFCOUNTER0_LO': (12352, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER0_HI': (12353, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_PERFCOUNTER1_LO': (12355, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBM_PERFCOUNTER1_HI': (12356, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER0_LO': (13184, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER0_HI': (13185, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER1_LO': (13186, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER1_HI': (13187, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER2_LO': (13188, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER2_HI': (13189, 1, {'perfcounter_hi': (0, 31)}), + 'regGL2C_PERFCOUNTER3_LO': (13190, 1, {'perfcounter_lo': (0, 31)}), + 'regGL2C_PERFCOUNTER3_HI': (13191, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER0_LO': (13440, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER0_HI': (13441, 1, {'perfcounter_hi': (0, 31)}), + 'regRLC_PERFCOUNTER1_LO': (13442, 1, {'perfcounter_lo': (0, 31)}), + 'regRLC_PERFCOUNTER1_HI': (13443, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBM_PERFCOUNTER0_SELECT': (14400, 1, {'perf_sel': (0, 5), 'sc_clean_user_defined_mask': (9, 9), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30)}), + 'regGRBM_PERFCOUNTER1_SELECT': (14401, 1, {'perf_sel': (0, 5), 'sc_clean_user_defined_mask': (9, 9), 'db_clean_user_defined_mask': (10, 10), 'cb_clean_user_defined_mask': (11, 11), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'grbm_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'cp_busy_user_defined_mask': (22, 22), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl2_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30)}), + 'regGRBM_PERFCOUNTER0_SELECT_HI': (14413, 1, {'utcl1_busy_user_defined_mask': (1, 1), 'gl2cc_busy_user_defined_mask': (2, 2), 'sdma_busy_user_defined_mask': (3, 3), 'ch_busy_user_defined_mask': (4, 4), 'pmm_busy_user_defined_mask': (6, 6), 'gl1cc_busy_user_defined_mask': (8, 8), 'gl1xcc_busy_user_defined_mask': (9, 9), 'pc_busy_user_defined_mask': (10, 10), 'ea_stat_link_busy_user_defined_mask': (13, 13)}), + 'regGRBM_PERFCOUNTER1_SELECT_HI': (14414, 1, {'utcl1_busy_user_defined_mask': (1, 1), 'gl2cc_busy_user_defined_mask': (2, 2), 'sdma_busy_user_defined_mask': (3, 3), 'ch_busy_user_defined_mask': (4, 4), 'pmm_busy_user_defined_mask': (6, 6), 'gl1cc_busy_user_defined_mask': (8, 8), 'gl1xcc_busy_user_defined_mask': (9, 9), 'pc_busy_user_defined_mask': (10, 10), 'ea_stat_link_busy_user_defined_mask': (13, 13)}), + 'regGL2C_PERFCOUNTER0_SELECT': (15232, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER0_SELECT1': (15233, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER1_SELECT': (15234, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER1_SELECT1': (15235, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER2_SELECT': (15236, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER2_SELECT1': (15237, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regGL2C_PERFCOUNTER3_SELECT': (15238, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regGL2C_PERFCOUNTER3_SELECT1': (15239, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode2': (24, 27), 'perf_mode3': (28, 31)}), + 'regRLC_SPM_PERFMON_CNTL': (15488, 1, {'reserved': (0, 11), 'perfmon_ring_mode': (12, 13), 'perfmon_sample_interval_start_mode': (14, 14), 'perfmon_sample_interval_type': (15, 15), 'perfmon_sample_interval': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_LO': (15489, 1, {'ring_base_lo': (0, 31)}), + 'regRLC_SPM_PERFMON_RING_BASE_HI': (15490, 1, {'ring_base_hi': (0, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_PERFMON_RING_SIZE': (15491, 1, {'ring_base_size': (0, 31)}), + 'regRLC_SPM_RING_WRPTR': (15492, 1, {'reserved': (0, 4), 'perfmon_ring_wrptr': (5, 31)}), + 'regRLC_SPM_RING_RDPTR': (15493, 1, {'perfmon_ring_rdptr': (0, 31)}), + 'regRLC_SPM_SEGMENT_THRESHOLD': (15494, 1, {'num_segment_threshold': (0, 7), 'reserved': (8, 31)}), + 'regRLC_SPM_PERFMON_SEGMENT_SIZE': (15495, 1, {'total_num_segment': (0, 15), 'global_num_segment': (16, 23), 'se_num_segment': (24, 31)}), + 'regRLC_SPM_GLOBAL_MUXSEL_ADDR': (15496, 1, {'addr': (0, 9)}), + 'regRLC_SPM_GLOBAL_MUXSEL_DATA': (15497, 1, {'sel0': (0, 15), 'sel1': (16, 31)}), + 'regRLC_SPM_SE_MUXSEL_ADDR': (15498, 1, {'addr': (0, 9)}), + 'regRLC_SPM_SE_MUXSEL_DATA': (15499, 1, {'sel0': (0, 15), 'sel1': (16, 31)}), + 'regRLC_SPM_ACCUM_DATARAM_ADDR': (15506, 1, {'addr': (0, 6)}), + 'regRLC_SPM_ACCUM_DATARAM_DATA': (15507, 1, {'data': (0, 31)}), + 'regRLC_SPM_ACCUM_SWA_DATARAM_ADDR': (15508, 1, {'addr': (0, 6)}), + 'regRLC_SPM_ACCUM_SWA_DATARAM_DATA': (15509, 1, {'data': (0, 31)}), + 'regRLC_SPM_ACCUM_CTRLRAM_ADDR': (15510, 1, {'addr': (0, 10)}), + 'regRLC_SPM_ACCUM_CTRLRAM_DATA': (15511, 1, {'data': (0, 7)}), + 'regRLC_SPM_ACCUM_CTRLRAM_ADDR_OFFSET': (15512, 1, {'global_offset': (0, 7), 'spmwithaccum_se_offset': (8, 15), 'spmwithaccum_global_offset': (16, 23)}), + 'regRLC_SPM_ACCUM_STATUS': (15513, 1, {'numbsamplescompleted': (0, 7), 'accumdone': (8, 8), 'spmdone': (9, 9), 'accumoverflow': (10, 10), 'accumarmed': (11, 11), 'sequenceinprogress': (12, 12), 'finalsequenceinprogress': (13, 13), 'allfifosempty': (14, 14), 'fsmisidle': (15, 15), 'swaaccumdone': (16, 16), 'swaspmdone': (17, 17), 'swaaccumoverflow': (18, 18), 'swaaccumarmed': (19, 19), 'allsegsdone': (20, 20), 'rearmswapending': (21, 21), 'rearmspppending': (22, 22), 'multisampleaborted': (23, 23)}), + 'regRLC_SPM_ACCUM_CTRL': (15514, 1, {'stroberesetperfmonitors': (0, 0), 'strobestartaccumulation': (1, 1), 'stroberearmaccum': (2, 2), 'stroberesetspmblock': (3, 3), 'strobestartspm': (4, 7), 'stroberearmswaaccum': (8, 8), 'strobestartswa': (9, 9), 'strobeperfmonsamplewires': (10, 10)}), + 'regRLC_SPM_ACCUM_MODE': (15515, 1, {'enableaccum': (0, 0), 'enablespmwithaccummode': (1, 1), 'enablesppmode': (2, 2), 'autoresetperfmondisable': (3, 3), 'reserved_4': (4, 4), 'autoaccumen': (5, 5), 'swaautoaccumen': (6, 6), 'autospmen': (7, 7), 'swaautospmen': (8, 8), 'globals_loadoverride': (9, 9), 'globals_swaloadoverride': (10, 10), 'se0_loadoverride': (11, 11), 'se0_swaloadoverride': (12, 12), 'se1_loadoverride': (13, 13), 'se1_swaloadoverride': (14, 14), 'se2_loadoverride': (15, 15), 'se2_swaloadoverride': (16, 16), 'se3_loadoverride': (17, 17), 'se3_swaloadoverride': (18, 18), 'reserved_20_19': (19, 20), 'reserved_22_21': (21, 22), 'reserved_24_23': (23, 24), 'reserved_26_25': (25, 26), 'reserved_31_27': (27, 31)}), + 'regRLC_SPM_ACCUM_THRESHOLD': (15516, 1, {'threshold': (0, 15)}), + 'regRLC_SPM_ACCUM_SAMPLES_REQUESTED': (15517, 1, {'samplesrequested': (0, 7)}), + 'regRLC_SPM_ACCUM_DATARAM_WRCOUNT': (15518, 1, {'dataramwrcount': (0, 18)}), + 'regRLC_SPM_ACCUM_DATARAM_32BITCNTRS_REGIONS': (15519, 1, {'spp_addr_region': (0, 7), 'swa_addr_region': (8, 15)}), + 'regRLC_SPM_PAUSE': (15522, 1, {'pause': (0, 0), 'paused': (1, 1)}), + 'regRLC_SPM_STATUS': (15523, 1, {'ctl_busy': (0, 0), 'rspm_reg_busy': (1, 1), 'spm_rspm_busy': (2, 2), 'spm_rspm_io_busy': (3, 3), 'se_rspm_io_busy': (4, 11), 'accum_busy': (15, 15), 'fsm_master_state': (16, 19), 'fsm_memory_state': (20, 23), 'ctl_req_state': (24, 25), 'ctl_ret_state': (26, 26)}), + 'regRLC_SPM_GFXCLOCK_LOWCOUNT': (15524, 1, {'gfxclock_lowcount': (0, 31)}), + 'regRLC_SPM_GFXCLOCK_HIGHCOUNT': (15525, 1, {'gfxclock_highcount': (0, 31)}), + 'regRLC_SPM_GTS_TRIGGER_VALUE_LO': (15526, 1, {'value_lo': (0, 31)}), + 'regRLC_SPM_GTS_TRIGGER_VALUE_HI': (15527, 1, {'value_hi': (0, 23)}), + 'regRLC_SPM_MODE': (15533, 1, {'mode': (0, 0)}), + 'regRLC_SPM_RSPM_REQ_DATA': (15534, 1, {'data': (0, 3)}), + 'regRLC_SPM_RSPM_REQ_OP': (15536, 1, {'op': (0, 3)}), + 'regRLC_SPM_RSPM_RET_DATA': (15537, 1, {'data': (0, 31)}), + 'regRLC_SPM_RSPM_RET_OP': (15538, 1, {'op': (0, 3), 'valid': (8, 8)}), + 'regRLC_SPM_SE_RSPM_REQ_DATA': (15539, 1, {'data': (0, 3)}), + 'regRLC_SPM_SE_RSPM_REQ_OP': (15541, 1, {'op': (0, 3)}), + 'regRLC_SPM_SE_RSPM_RET_DATA': (15542, 1, {'data': (0, 31)}), + 'regRLC_SPM_SE_RSPM_RET_OP': (15543, 1, {'op': (0, 3), 'valid': (8, 8)}), + 'regRLC_SPM_RSPM_CMD': (15544, 1, {'cmd': (0, 3)}), + 'regRLC_SPM_RSPM_CMD_ACK': (15545, 1, {'se0_ack': (0, 0), 'se1_ack': (1, 1), 'se2_ack': (2, 2), 'se3_ack': (3, 3), 'se4_ack': (4, 4), 'se5_ack': (5, 5), 'se6_ack': (6, 6), 'se7_ack': (7, 7), 'spm_ack': (8, 8)}), + 'regRLC_SPM_SPARE': (15551, 1, {'spare': (0, 31)}), + 'regRLC_PERFMON_CNTL': (15552, 1, {'perfmon_state': (0, 2), 'reserved_9_3': (3, 9), 'perfmon_sample_enable': (10, 10), 'reserved': (11, 31)}), + 'regRLC_PERFCOUNTER0_SELECT': (15553, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_PERFCOUNTER1_SELECT': (15554, 1, {'perfcounter_select': (0, 7)}), + 'regRLC_SDMA0_STATUS': (23320, 1, {'status': (0, 31)}), + 'regRLC_SDMA1_STATUS': (23321, 1, {'status': (0, 31)}), + 'regRLC_SDMA2_STATUS': (23322, 1, {'status': (0, 31)}), + 'regRLC_SDMA3_STATUS': (23323, 1, {'status': (0, 31)}), + 'regRLC_SDMA0_BUSY_STATUS': (23324, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA1_BUSY_STATUS': (23325, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA2_BUSY_STATUS': (23326, 1, {'busy_status': (0, 31)}), + 'regRLC_SDMA3_BUSY_STATUS': (23327, 1, {'busy_status': (0, 31)}), + 'regRLC_HYP_SEMAPHORE_0': (23342, 1, {'client_id': (0, 4)}), + 'regRLC_HYP_SEMAPHORE_1': (23343, 1, {'client_id': (0, 4)}), + 'regRLC_BUSY_CLK_CNTL': (23344, 1, {'busy_off_latency': (0, 5), 'reserved': (6, 7), 'grbm_busy_off_latency': (8, 13)}), + 'regRLC_CLK_CNTL': (23345, 1, {'rlc_srm_icg_override': (0, 0), 'rlc_imu_icg_override': (1, 1), 'rlc_spm_icg_override': (2, 2), 'rlc_spm_rspm_icg_override': (3, 3), 'rlc_gpm_icg_override': (4, 4), 'rlc_cmn_icg_override': (5, 5), 'rlc_tc_icg_override': (6, 6), 'rlc_reg_icg_override': (7, 7), 'rlc_sram_clk_gater_override': (8, 8), 'reserved_9': (9, 9), 'rlc_spp_icg_override': (10, 10), 'reserved_11': (11, 11), 'rlc_tc_fgcg_rep_override': (12, 12), 'rlc_dfll_icg_override': (13, 13), 'reserved_15': (15, 15), 'rlc_lx6_core_icg_override': (16, 16), 'rlc_lx6_icg_override': (17, 17), 'rlc_utcl2_fgcg_override': (18, 18), 'rlc_ih_gasket_icg_override': (19, 19), 'rlc_bridge_icg_override': (20, 20), 'reserved': (22, 31)}), + 'regRLC_IH_COOKIE': (23361, 1, {'data': (0, 31)}), + 'regRLC_IH_COOKIE_CNTL': (23362, 1, {'credit': (0, 1), 'reset_counter': (2, 2)}), + 'regRLC_HYP_RLCG_UCODE_CHKSUM': (23363, 1, {'ucode_chksum': (0, 31)}), + 'regRLC_HYP_SEMAPHORE_2': (23378, 1, {'client_id': (0, 4)}), + 'regRLC_HYP_SEMAPHORE_3': (23379, 1, {'client_id': (0, 4)}), + 'regRLC_GPM_UCODE_ADDR': (23392, 1, {'ucode_addr': (0, 13), 'reserved': (14, 31)}), + 'regRLC_GPM_UCODE_DATA': (23393, 1, {'ucode_data': (0, 31)}), + 'regRLC_GPM_IRAM_ADDR': (23394, 1, {'addr': (0, 31)}), + 'regRLC_GPM_IRAM_DATA': (23395, 1, {'data': (0, 31)}), + 'regRLC_LX6_DRAM_ADDR': (23400, 1, {'addr': (0, 10)}), + 'regRLC_LX6_DRAM_DATA': (23401, 1, {'data': (0, 31)}), + 'regRLC_LX6_IRAM_ADDR': (23402, 1, {'addr': (0, 11)}), + 'regRLC_LX6_IRAM_DATA': (23403, 1, {'data': (0, 31)}), + 'regRLC_GPM_SCRATCH_ADDR': (23406, 1, {'addr': (0, 15)}), + 'regRLC_GPM_SCRATCH_DATA': (23407, 1, {'data': (0, 31)}), + 'regRLC_SRM_DRAM_ADDR': (23409, 1, {'addr': (0, 12), 'reserved': (13, 31)}), + 'regRLC_SRM_DRAM_DATA': (23410, 1, {'data': (0, 31)}), + 'regRLC_SRM_ARAM_ADDR': (23411, 1, {'addr': (0, 12), 'reserved': (13, 31)}), + 'regRLC_SRM_ARAM_DATA': (23412, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_LSB': (23417, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_MSB': (23418, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_SNAP_LSB': (23419, 1, {'data': (0, 31)}), + 'regRLC_GTS_OFFSET_SNAP_MSB': (23420, 1, {'data': (0, 31)}), + 'regGRBM_GC_USER_SA_UNIT_DISABLE': (23442, 1, {'sa_disable': (8, 23)}), + 'regCP_MEC_ME1_UCODE_ADDR': (22554, 1, {'ucode_addr': (0, 7), 'pipe_sel': (31, 31)}), + 'regCP_MEC_ME1_UCODE_DATA': (22555, 1, {'ucode_data': (0, 31)}), + 'regCP_MEC_DC_BASE_LO': (22640, 1, {'dc_base_lo': (16, 31)}), + 'regCP_MEC_MDBASE_LO': (22640, 1, {'base_lo': (16, 31)}), + 'regCP_MEC_DC_BASE_HI': (22641, 1, {'dc_base_hi': (0, 15)}), + 'regCP_MEC_MDBASE_HI': (22641, 1, {'base_hi': (0, 15)}), + 'regCP_MEC_MIBOUND_LO': (22642, 1, {'bound_lo': (0, 31)}), + 'regCP_MEC_MIBOUND_HI': (22643, 1, {'bound_hi': (0, 31)}), + 'regCP_MEC_MDBOUND_LO': (22644, 1, {'bound_lo': (0, 31)}), + 'regCP_MEC_MDBOUND_HI': (22645, 1, {'bound_hi': (0, 31)}), + 'regGRBM_GFX_INDEX_SR_SELECT': (23040, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_INDEX_SR_DATA': (23041, 1, {'instance_index': (0, 6), 'sa_index': (8, 9), 'se_index': (16, 19), 'sa_broadcast_writes': (29, 29), 'instance_broadcast_writes': (30, 30), 'se_broadcast_writes': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_SELECT': (23042, 1, {'index': (0, 2), 'vf_pf': (31, 31)}), + 'regGRBM_GFX_CNTL_SR_DATA': (23043, 1, {'pipeid': (0, 1), 'meid': (2, 3), 'vmid': (4, 7), 'queueid': (8, 10)}), + 'regGRBM_SE_REMAP_CNTL': (23048, 1, {'se0_remap_en': (0, 0), 'se0_remap': (1, 3), 'se1_remap_en': (4, 4), 'se1_remap': (5, 7), 'se2_remap_en': (8, 8), 'se2_remap': (9, 11), 'se3_remap_en': (12, 12), 'se3_remap': (13, 15), 'se4_remap_en': (16, 16), 'se4_remap': (17, 19), 'se5_remap_en': (20, 20), 'se5_remap': (21, 23), 'se6_remap_en': (24, 24), 'se6_remap': (25, 27), 'se7_remap_en': (28, 28), 'se7_remap': (29, 31)}), + 'regGRBM_GRBM_SA_REMAP_CNTL': (23049, 1, {'se0_sa_remap': (0, 1), 'se1_sa_remap': (2, 3), 'se2_sa_remap': (4, 5), 'se3_sa_remap': (6, 7), 'se4_sa_remap': (8, 9), 'se5_sa_remap': (10, 11), 'se6_sa_remap': (12, 13), 'se7_sa_remap': (14, 15)}), + 'regRLC_CNTL': (19456, 1, {'rlc_enable_f32': (0, 0), 'force_retry': (1, 1), 'read_cache_disable': (2, 2), 'rlc_step_f32': (3, 3), 'reserved': (4, 31)}), + 'regRLC_F32_UCODE_VERSION': (19459, 1, {'thread0_version': (0, 9), 'thread1_version': (10, 19), 'thread2_version': (20, 29)}), + 'regRLC_STAT': (19460, 1, {'rlc_busy': (0, 0), 'rlc_srm_busy': (1, 1), 'rlc_gpm_busy': (2, 2), 'rlc_spm_busy': (3, 3), 'mc_busy': (4, 4), 'rlc_thread_0_busy': (5, 5), 'rlc_thread_1_busy': (6, 6), 'rlc_thread_2_busy': (7, 7), 'reserved': (9, 31)}), + 'regRLC_ACTIVE_MASK': (19461, 1, {'se': (0, 7)}), + 'regRLC_GFX_SE_STATUS': (19462, 1, {'sqg_ttrace_halt': (0, 3)}), + 'regRLC_REFCLOCK_TIMESTAMP_LSB': (19468, 1, {'timestamp_lsb': (0, 31)}), + 'regRLC_REFCLOCK_TIMESTAMP_MSB': (19469, 1, {'timestamp_msb': (0, 31)}), + 'regRLC_GPM_TIMER_INT_0': (19470, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_1': (19471, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_2': (19472, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_3': (19473, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_INT_4': (19474, 1, {'timer': (0, 31)}), + 'regRLC_GPM_TIMER_CTRL': (19475, 1, {'timer_0_en': (0, 0), 'timer_1_en': (1, 1), 'timer_2_en': (2, 2), 'timer_3_en': (3, 3), 'timer_4_en': (4, 4), 'reserved_1': (5, 7), 'timer_0_auto_rearm': (8, 8), 'timer_1_auto_rearm': (9, 9), 'timer_2_auto_rearm': (10, 10), 'timer_3_auto_rearm': (11, 11), 'timer_4_auto_rearm': (12, 12), 'reserved_2': (13, 15), 'timer_0_int_clear': (16, 16), 'timer_1_int_clear': (17, 17), 'timer_2_int_clear': (18, 18), 'timer_3_int_clear': (19, 19), 'timer_4_int_clear': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_TIMER_STAT': (19476, 1, {'timer_0_stat': (0, 0), 'timer_1_stat': (1, 1), 'timer_2_stat': (2, 2), 'timer_3_stat': (3, 3), 'timer_4_stat': (4, 4), 'reserved_1': (5, 7), 'timer_0_enable_sync': (8, 8), 'timer_1_enable_sync': (9, 9), 'timer_2_enable_sync': (10, 10), 'timer_3_enable_sync': (11, 11), 'timer_4_enable_sync': (12, 12), 'reserved_2': (13, 15), 'timer_0_auto_rearm_sync': (16, 16), 'timer_1_auto_rearm_sync': (17, 17), 'timer_2_auto_rearm_sync': (18, 18), 'timer_3_auto_rearm_sync': (19, 19), 'timer_4_auto_rearm_sync': (20, 20), 'reserved': (21, 31)}), + 'regRLC_GPM_LEGACY_INT_STAT': (19478, 1, {'spp_pvt_int_changed': (0, 0), 'reserved': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3), 'store_load_timer3_expired_t0': (4, 4)}), + 'regRLC_GPM_LEGACY_INT_CLEAR': (19479, 1, {'spp_pvt_int_changed': (0, 0), 'reserved': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3), 'reserved_4': (4, 4)}), + 'regRLC_INT_STAT': (19480, 1, {'last_cp_rlc_int_id': (0, 7), 'cp_rlc_int_pending': (8, 8), 'reserved': (9, 31)}), + 'regRLC_MGCG_CTRL': (19482, 1, {'mgcg_en': (0, 0), 'silicon_en': (1, 1), 'simulation_en': (2, 2), 'on_delay': (3, 6), 'off_hysteresis': (7, 14), 'spare': (15, 31)}), + 'regRLC_JUMP_TABLE_RESTORE': (19486, 1, {'addr': (0, 31)}), + 'regRLC_PG_DELAY_2': (19487, 1, {'serdes_timeout_value': (0, 7), 'serdes_cmd_delay': (8, 15), 'perwgp_timeout_value': (16, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB': (19492, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB': (19493, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT': (19494, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_UCODE_CNTL': (19495, 1, {'rlc_ucode_flags': (0, 31)}), + 'regRLC_GPM_THREAD_RESET': (19496, 1, {'thread0_reset': (0, 0), 'thread1_reset': (1, 1), 'thread2_reset': (2, 2), 'thread3_reset': (3, 3), 'reserved': (4, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T0': (19497, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_CP_DMA_COMPLETE_T1': (19498, 1, {'data': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPM_THREAD_INVALIDATE_CACHE': (19499, 1, {'thread0_invalidate_cache': (0, 0), 'thread1_invalidate_cache': (1, 1), 'thread2_invalidate_cache': (2, 2), 'thread3_invalidate_cache': (3, 3), 'reserved': (4, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_LSB': (19504, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_GFXCLK_MSB': (19505, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_LSB': (19506, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_REFCLK_MSB': (19507, 1, {'counter': (0, 31)}), + 'regRLC_CLK_COUNT_CTRL': (19508, 1, {'gfxclk_run': (0, 0), 'gfxclk_reset': (1, 1), 'gfxclk_sample': (2, 2), 'refclk_run': (3, 3), 'refclk_reset': (4, 4), 'refclk_sample': (5, 5)}), + 'regRLC_CLK_COUNT_STAT': (19509, 1, {'gfxclk_valid': (0, 0), 'refclk_valid': (1, 1), 'refclk_run_resync': (2, 2), 'refclk_reset_resync': (3, 3), 'refclk_sample_resync': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCG_DOORBELL_CNTL': (19510, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'reserved': (8, 15), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21), 'reserved_31_22': (22, 31)}), + 'regRLC_RLCG_DOORBELL_STAT': (19511, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_RLCG_DOORBELL_0_DATA_LO': (19512, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_0_DATA_HI': (19513, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_1_DATA_LO': (19514, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_1_DATA_HI': (19515, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_2_DATA_LO': (19516, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_2_DATA_HI': (19517, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_3_DATA_LO': (19518, 1, {'data': (0, 31)}), + 'regRLC_RLCG_DOORBELL_3_DATA_HI': (19519, 1, {'data': (0, 31)}), + 'regRLC_GPU_CLOCK_32_RES_SEL': (19521, 1, {'res_sel': (0, 5), 'reserved': (6, 31)}), + 'regRLC_GPU_CLOCK_32': (19522, 1, {'gpu_clock_32': (0, 31)}), + 'regRLC_PG_CNTL': (19523, 1, {'gfx_power_gating_enable': (0, 0), 'gfx_power_gating_src': (1, 1), 'dyn_per_wgp_pg_enable': (2, 2), 'static_per_wgp_pg_enable': (3, 3), 'gfx_pipeline_pg_enable': (4, 4), 'reserved': (5, 12), 'mem_ds_disable': (13, 13), 'pg_override': (14, 14), 'cp_pg_disable': (15, 15), 'chub_handshake_enable': (16, 16), 'smu_clk_slowdown_on_pu_enable': (17, 17), 'smu_clk_slowdown_on_pd_enable': (18, 18), 'reserved1': (19, 20), 'ultra_low_voltage_enable': (21, 21), 'reserved2': (22, 22), 'smu_handshake_disable': (23, 23)}), + 'regRLC_GPM_THREAD_PRIORITY': (19524, 1, {'thread0_priority': (0, 7), 'thread1_priority': (8, 15), 'thread2_priority': (16, 23), 'thread3_priority': (24, 31)}), + 'regRLC_GPM_THREAD_ENABLE': (19525, 1, {'thread0_enable': (0, 0), 'thread1_enable': (1, 1), 'thread2_enable': (2, 2), 'thread3_enable': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCG_DOORBELL_RANGE': (19527, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'reserved_15_12': (12, 15), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27), 'reserved_31_28': (28, 31)}), + 'regRLC_CGTT_MGCG_OVERRIDE': (19528, 1, {'rlc_repeater_fgcg_override': (0, 0), 'rlc_cgtt_sclk_override': (1, 1), 'gfxip_mgcg_override': (2, 2), 'gfxip_cgcg_override': (3, 3), 'gfxip_cgls_override': (4, 4), 'grbm_cgtt_sclk_override': (5, 5), 'gfxip_mgls_override': (6, 6), 'gfxip_gfx3d_cg_override': (7, 7), 'gfxip_fgcg_override': (8, 8), 'gfxip_repeater_fgcg_override': (9, 9), 'perfmon_clock_state': (10, 10), 'reserved_31_11': (11, 31)}), + 'regRLC_CGCG_CGLS_CTRL': (19529, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL': (19530, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_DYN_PG_STATUS': (19531, 1, {'pg_status_wgp_mask': (0, 31)}), + 'regRLC_DYN_PG_REQUEST': (19532, 1, {'pg_request_wgp_mask': (0, 31)}), + 'regRLC_PG_DELAY': (19533, 1, {'power_up_delay': (0, 7), 'power_down_delay': (8, 15), 'cmd_propagate_delay': (16, 23), 'mem_sleep_delay': (24, 31)}), + 'regRLC_PG_ALWAYS_ON_WGP_MASK': (19539, 1, {'aon_wgp_mask': (0, 31)}), + 'regRLC_MAX_PG_WGP': (19540, 1, {'max_powered_up_wgp': (0, 7), 'spare': (8, 31)}), + 'regRLC_AUTO_PG_CTRL': (19541, 1, {'auto_pg_en': (0, 0), 'auto_grbm_reg_save_on_idle_en': (1, 1), 'auto_wake_up_en': (2, 2), 'grbm_reg_save_gfx_idle_threshold': (3, 18), 'pg_after_grbm_reg_save_threshold': (19, 31)}), + 'regRLC_SERDES_RD_INDEX': (19545, 1, {'data_reg_id': (0, 1), 'spare': (2, 31)}), + 'regRLC_SERDES_RD_DATA_0': (19546, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_1': (19547, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_2': (19548, 1, {'data': (0, 31)}), + 'regRLC_SERDES_RD_DATA_3': (19549, 1, {'data': (0, 31)}), + 'regRLC_SERDES_MASK': (19550, 1, {'gc_center_hub_0': (0, 0), 'gc_center_hub_1': (1, 1)}), + 'regRLC_SERDES_CTRL': (19551, 1, {'bpm_broadcast': (0, 0), 'bpm_reg_write': (1, 1), 'bpm_long_cmd': (2, 2), 'bpm_addr': (4, 14), 'reg_addr': (16, 23)}), + 'regRLC_SERDES_DATA': (19552, 1, {'data': (0, 31)}), + 'regRLC_SERDES_BUSY': (19553, 1, {'gc_center_hub_0': (0, 0), 'gc_center_hub_1': (1, 1), 'reserved': (2, 29), 'rd_fifo_not_empty': (30, 30), 'rd_pending': (31, 31)}), + 'regRLC_GPM_GENERAL_0': (19555, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_1': (19556, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_2': (19557, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_3': (19558, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_4': (19559, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_5': (19560, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_6': (19561, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_7': (19562, 1, {'data': (0, 31)}), + 'regRLC_STATIC_PG_STATUS': (19566, 1, {'pg_status_wgp_mask': (0, 31)}), + 'regRLC_GPM_GENERAL_16': (19574, 1, {'data': (0, 31)}), + 'regRLC_PG_DELAY_3': (19576, 1, {'cgcg_active_before_cgpg': (0, 31)}), + 'regRLC_GPR_REG1': (19577, 1, {'data': (0, 31)}), + 'regRLC_GPR_REG2': (19578, 1, {'data': (0, 31)}), + 'regRLC_GPM_INT_DISABLE_TH0': (19580, 1, {'disable_int': (0, 31)}), + 'regRLC_GPM_LEGACY_INT_DISABLE': (19581, 1, {'spp_pvt_int_changed': (0, 0), 'reserved': (1, 1), 'rlc_eof_int_changed': (2, 2), 'rlc_pg_cntl_changed': (3, 3), 'store_load_timer3_expired_t0': (4, 4)}), + 'regRLC_GPM_INT_FORCE_TH0': (19582, 1, {'force_int': (0, 31)}), + 'regRLC_SRM_CNTL': (19584, 1, {'srm_enable': (0, 0), 'auto_incr_addr': (1, 1), 'srm_gpm_fifo_reset': (2, 2), 'reserved': (3, 31)}), + 'regRLC_SRM_GPM_COMMAND_STATUS': (19592, 1, {'fifo_empty': (0, 0), 'fifo_full': (1, 1), 'fifo_overflow': (2, 2), 'reserved': (3, 31)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_0': (19595, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_1': (19596, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_2': (19597, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_3': (19598, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_4': (19599, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_5': (19600, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_6': (19601, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_ADDR_7': (19602, 1, {'address': (0, 17)}), + 'regRLC_SRM_INDEX_CNTL_DATA_0': (19603, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_1': (19604, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_2': (19605, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_3': (19606, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_4': (19607, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_5': (19608, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_6': (19609, 1, {'data': (0, 31)}), + 'regRLC_SRM_INDEX_CNTL_DATA_7': (19610, 1, {'data': (0, 31)}), + 'regRLC_SRM_STAT': (19611, 1, {'srm_busy': (0, 0), 'reserved': (1, 31)}), + 'regRLC_LX6_UTCL1_ERROR_2': (19624, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_GENERAL_8': (19629, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_9': (19630, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_10': (19631, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_11': (19632, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_12': (19633, 1, {'data': (0, 31)}), + 'regRLC_GPM_UTCL1_CNTL_0': (19634, 1, {'xnack_redo_timer_cnt': (0, 19), 'reserved_23_20': (20, 23), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (29, 31)}), + 'regRLC_SPM_UTCL1_CNTL': (19637, 1, {'xnack_redo_timer_cnt': (0, 19), 'reserved_23_20': (20, 23), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (29, 31)}), + 'regRLC_UTCL1_STATUS_2': (19638, 1, {'gpm_th0_utcl1_busy': (0, 0), 'gpm_th1_utcl1_busy': (1, 1), 'gpm_th2_utcl1_busy': (2, 2), 'spm_utcl1_busy': (3, 3), 'lx6_utcl1_busy': (4, 4), 'dma_utcl1_busy': (5, 5), 'srm_utcl1_busy': (6, 6), 'dlg_utcl1_busy': (7, 7), 'gpm_th0_utcl1_stallontrans': (8, 8), 'gpm_th1_utcl1_stallontrans': (9, 9), 'gpm_th2_utcl1_stallontrans': (10, 10), 'spm_utcl1_stallontrans': (11, 11), 'lx6_utcl1_stallontrans': (12, 12), 'dma_utcl1_stallontrans': (13, 13), 'srm_utcl1_stallontrans': (14, 14), 'dlg_utcl1_stallontrans': (15, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_UTCL1_ERROR_1': (19644, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_SPM_UTCL1_ERROR_2': (19645, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_1': (19646, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_GPM_UTCL1_TH0_ERROR_2': (19648, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_CGCG_CGLS_CTRL_3D': (19653, 1, {'cgcg_en': (0, 0), 'cgls_en': (1, 1), 'cgls_rep_compansat_delay': (2, 7), 'cgcg_gfx_idle_threshold': (8, 26), 'cgcg_controller': (27, 27), 'cgcg_reg_ctrl': (28, 28), 'sleep_mode': (29, 30), 'sim_silicon_en': (31, 31)}), + 'regRLC_CGCG_RAMP_CTRL_3D': (19654, 1, {'down_div_start_unit': (0, 3), 'down_div_step_unit': (4, 7), 'up_div_start_unit': (8, 11), 'up_div_step_unit': (12, 15), 'step_delay_cnt': (16, 27), 'step_delay_unit': (28, 31)}), + 'regRLC_SEMAPHORE_0': (19655, 1, {'client_id': (0, 4)}), + 'regRLC_SEMAPHORE_1': (19656, 1, {'client_id': (0, 4)}), + 'regRLC_SEMAPHORE_2': (19657, 1, {'client_id': (0, 4)}), + 'regRLC_SEMAPHORE_3': (19658, 1, {'client_id': (0, 4)}), + 'regRLC_SRM_UTCL1_CNTL': (19660, 1, {'xnack_redo_timer_cnt': (0, 19), 'reserved_23_20': (20, 23), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (29, 31)}), + 'regRLC_SRM_UTCL1_ERROR_1': (19661, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_SRM_UTCL1_ERROR_2': (19662, 1, {'translated_reqerroraddr_lsb': (0, 31)}), + 'regRLC_UTCL1_STATUS': (19668, 1, {'fault_detected': (0, 0), 'retry_detected': (1, 1), 'prt_detected': (2, 2), 'reserved': (3, 7), 'fault_utcl1id': (8, 13), 'reserved_1': (14, 15), 'retry_utcl1id': (16, 21), 'reserved_2': (22, 23), 'prt_utcl1id': (24, 29), 'reserved_3': (30, 31)}), + 'regRLC_R2I_CNTL_0': (19669, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_1': (19670, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_2': (19671, 1, {'data': (0, 31)}), + 'regRLC_R2I_CNTL_3': (19672, 1, {'data': (0, 31)}), + 'regRLC_GPM_INT_STAT_TH0': (19676, 1, {'status': (0, 31)}), + 'regRLC_GPM_GENERAL_13': (19677, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_14': (19678, 1, {'data': (0, 31)}), + 'regRLC_GPM_GENERAL_15': (19679, 1, {'data': (0, 31)}), + 'regRLC_LX6_UTCL1_ERROR_1': (19683, 1, {'translated_reqerror': (0, 1), 'translated_reqerrorvmid': (2, 5), 'translated_reqerroraddr_msb': (6, 9)}), + 'regRLC_LX6_UTCL1_CNTL': (19684, 1, {'xnack_redo_timer_cnt': (0, 19), 'reserved_23_20': (20, 23), 'drop_mode': (24, 24), 'bypass': (25, 25), 'invalidate': (26, 26), 'frag_limit_mode': (27, 27), 'force_snoop': (28, 28), 'reserved': (29, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_1': (19690, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_2': (19691, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_2': (19692, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_CAPTURE_GPU_CLOCK_COUNT_2': (19695, 1, {'capture': (0, 0), 'reserved': (1, 31)}), + 'regRLC_GPU_CLOCK_COUNT_LSB_1': (19707, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_MSB_1': (19708, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_RLCV_SPARE_INT': (19712, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SMU_CLK_REQ': (19720, 1, {'valid': (0, 0)}), + 'regRLC_SPARE': (19723, 1, {'spare': (0, 31)}), + 'regRLC_SPP_CTRL': (19724, 1, {'enable': (0, 0), 'enable_pprof': (1, 1), 'enable_pwr_opt': (2, 2), 'pause': (3, 3)}), + 'regRLC_SPP_SHADER_PROFILE_EN': (19725, 1, {'ps_enable': (0, 0), 'gs_enable': (2, 2), 'hs_enable': (3, 3), 'csg_enable': (4, 4), 'cs_enable': (5, 5), 'ps_start_condition': (11, 11), 'csg_start_condition': (12, 12), 'cs_start_condition': (13, 13), 'force_miss': (14, 14), 'force_unlocked': (15, 15), 'enable_prof_info_lock': (16, 16)}), + 'regRLC_SPP_SSF_CAPTURE_EN': (19726, 1, {'ps_enable': (0, 0), 'gs_enable': (2, 2), 'hs_enable': (3, 3), 'csg_enable': (4, 4), 'cs_enable': (5, 5)}), + 'regRLC_SPP_SSF_THRESHOLD_0': (19727, 1, {'ps_threshold': (0, 15)}), + 'regRLC_SPP_SSF_THRESHOLD_1': (19728, 1, {'gs_threshold': (0, 15), 'hs_threshold': (16, 31)}), + 'regRLC_SPP_SSF_THRESHOLD_2': (19729, 1, {'csg_threshold': (0, 15), 'cs_threshold': (16, 31)}), + 'regRLC_SPP_INFLIGHT_RD_ADDR': (19730, 1, {'addr': (0, 4)}), + 'regRLC_SPP_INFLIGHT_RD_DATA': (19731, 1, {'data': (0, 31)}), + 'regRLC_SPP_PROF_INFO_1': (19736, 1, {'sh_id': (0, 31)}), + 'regRLC_SPP_PROF_INFO_2': (19737, 1, {'sh_type': (0, 4), 'cam_hit': (5, 5), 'cam_lock': (6, 6), 'cam_conflict': (7, 7)}), + 'regRLC_SPP_GLOBAL_SH_ID': (19738, 1, {'sh_id': (0, 31)}), + 'regRLC_SPP_GLOBAL_SH_ID_VALID': (19739, 1, {'valid': (0, 0)}), + 'regRLC_SPP_STATUS': (19740, 1, {'reserved_0': (0, 0), 'ssf_busy': (1, 1), 'event_arb_busy': (2, 2), 'spp_busy': (31, 31)}), + 'regRLC_SPP_PVT_STAT_0': (19741, 1, {'level_0_counter': (0, 6), 'level_1_counter': (8, 14), 'level_2_counter': (16, 22), 'level_3_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_1': (19742, 1, {'level_4_counter': (0, 6), 'level_5_counter': (8, 14), 'level_6_counter': (16, 22), 'level_7_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_2': (19743, 1, {'level_8_counter': (0, 6), 'level_9_counter': (8, 14), 'level_10_counter': (16, 22), 'level_11_counter': (24, 30)}), + 'regRLC_SPP_PVT_STAT_3': (19744, 1, {'level_12_counter': (0, 6), 'level_13_counter': (8, 14), 'level_14_counter': (16, 22), 'level_15_counter': (24, 30)}), + 'regRLC_SPP_PVT_LEVEL_MAX': (19745, 1, {'level': (0, 3)}), + 'regRLC_SPP_STALL_STATE_UPDATE': (19746, 1, {'stall': (0, 0), 'enable': (1, 1)}), + 'regRLC_SPP_PBB_INFO': (19747, 1, {'pipe0_override': (0, 0), 'pipe0_override_valid': (1, 1), 'pipe1_override': (2, 2), 'pipe1_override_valid': (3, 3)}), + 'regRLC_SPP_RESET': (19748, 1, {'ssf_reset': (0, 0), 'event_arb_reset': (1, 1), 'cam_reset': (2, 2), 'pvt_reset': (3, 3)}), + 'regRLC_CAC_MASK_CNTL': (19781, 1, {'rlc_cac_mask': (0, 31)}), + 'regRLC_POWER_RESIDENCY_CNTR_CTRL': (19784, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_CLK_RESIDENCY_CNTR_CTRL': (19785, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_DS_RESIDENCY_CNTR_CTRL': (19786, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_ULV_RESIDENCY_CNTR_CTRL': (19787, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_PCC_RESIDENCY_CNTR_CTRL': (19788, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_GENERAL_RESIDENCY_CNTR_CTRL': (19789, 1, {'reset': (0, 0), 'enable': (1, 1), 'reset_ack': (2, 2), 'enable_ack': (3, 3), 'counter_overflow': (4, 4), 'reserved': (5, 31)}), + 'regRLC_POWER_RESIDENCY_EVENT_CNTR': (19792, 1, {'data': (0, 31)}), + 'regRLC_CLK_RESIDENCY_EVENT_CNTR': (19793, 1, {'data': (0, 31)}), + 'regRLC_DS_RESIDENCY_EVENT_CNTR': (19794, 1, {'data': (0, 31)}), + 'regRLC_ULV_RESIDENCY_EVENT_CNTR': (19795, 1, {'data': (0, 31)}), + 'regRLC_PCC_RESIDENCY_EVENT_CNTR': (19796, 1, {'data': (0, 31)}), + 'regRLC_GENERAL_RESIDENCY_EVENT_CNTR': (19797, 1, {'data': (0, 31)}), + 'regRLC_POWER_RESIDENCY_REF_CNTR': (19800, 1, {'data': (0, 31)}), + 'regRLC_CLK_RESIDENCY_REF_CNTR': (19801, 1, {'data': (0, 31)}), + 'regRLC_DS_RESIDENCY_REF_CNTR': (19802, 1, {'data': (0, 31)}), + 'regRLC_ULV_RESIDENCY_REF_CNTR': (19803, 1, {'data': (0, 31)}), + 'regRLC_PCC_RESIDENCY_REF_CNTR': (19804, 1, {'data': (0, 31)}), + 'regRLC_GENERAL_RESIDENCY_REF_CNTR': (19805, 1, {'data': (0, 31)}), + 'regRLC_GFX_IH_CLIENT_CTRL': (19806, 1, {'se_interrupt_mask': (0, 7), 'sdma_interrupt_mask': (8, 11), 'utcl2_interrupt_mask': (12, 12), 'pmm_interrupt_mask': (13, 13), 'reserved_15_14': (14, 15), 'se_interrupt_error_clear': (16, 23), 'sdma_interrupt_error_clear': (24, 27), 'utcl2_interrupt_error_clear': (28, 28), 'pmm_interrupt_error_clear': (29, 29), 'reserved_31_30': (30, 31)}), + 'regRLC_GFX_IH_ARBITER_STAT': (19807, 1, {'client_granted': (0, 15), 'reserved': (16, 27), 'last_client_granted': (28, 31)}), + 'regRLC_GFX_IH_CLIENT_SE_STAT_L': (19808, 1, {'se0_buffer_level': (0, 3), 'se0_buffer_loading': (4, 4), 'se0_protocol_error': (5, 5), 'se0_buffer_overflow': (6, 6), 'se0_reserved': (7, 7), 'se1_buffer_level': (8, 11), 'se1_buffer_loading': (12, 12), 'se1_protocol_error': (13, 13), 'se1_buffer_overflow': (14, 14), 'se1_reserved': (15, 15), 'se2_buffer_level': (16, 19), 'se2_buffer_loading': (20, 20), 'se2_protocol_error': (21, 21), 'se2_buffer_overflow': (22, 22), 'se2_reserved': (23, 23), 'se3_buffer_level': (24, 27), 'se3_buffer_loading': (28, 28), 'se3_protocol_error': (29, 29), 'se3_buffer_overflow': (30, 30), 'se3_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_SE_STAT_H': (19809, 1, {'se4_buffer_level': (0, 3), 'se4_buffer_loading': (4, 4), 'se4_protocol_error': (5, 5), 'se4_buffer_overflow': (6, 6), 'se4_reserved': (7, 7), 'se5_buffer_level': (8, 11), 'se5_buffer_loading': (12, 12), 'se5_protocol_error': (13, 13), 'se5_buffer_overflow': (14, 14), 'se5_reserved': (15, 15), 'se6_buffer_level': (16, 19), 'se6_buffer_loading': (20, 20), 'se6_protocol_error': (21, 21), 'se6_buffer_overflow': (22, 22), 'se6_reserved': (23, 23), 'se7_buffer_level': (24, 27), 'se7_buffer_loading': (28, 28), 'se7_protocol_error': (29, 29), 'se7_buffer_overflow': (30, 30), 'se7_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_SDMA_STAT': (19810, 1, {'sdma0_buffer_level': (0, 3), 'sdma0_buffer_loading': (4, 4), 'sdma0_protocol_error': (5, 5), 'sdma0_buffer_overflow': (6, 6), 'sdma0_reserved': (7, 7), 'sdma1_buffer_level': (8, 11), 'sdma1_buffer_loading': (12, 12), 'sdma1_protocol_error': (13, 13), 'sdma1_buffer_overflow': (14, 14), 'sdma1_reserved': (15, 15), 'sdma2_buffer_level': (16, 19), 'sdma2_buffer_loading': (20, 20), 'sdma2_protocol_error': (21, 21), 'sdma2_buffer_overflow': (22, 22), 'sdma2_reserved': (23, 23), 'sdma3_buffer_level': (24, 27), 'sdma3_buffer_loading': (28, 28), 'sdma3_protocol_error': (29, 29), 'sdma3_buffer_overflow': (30, 30), 'sdma3_reserved': (31, 31)}), + 'regRLC_GFX_IH_CLIENT_OTHER_STAT': (19811, 1, {'utcl2_buffer_level': (0, 3), 'utcl2_buffer_loading': (4, 4), 'utcl2_protocol_error': (5, 5), 'utcl2_buffer_overflow': (6, 6), 'utcl2_reserved': (7, 7), 'pmm_buffer_level': (8, 11), 'pmm_buffer_loading': (12, 12), 'pmm_protocol_error': (13, 13), 'pmm_buffer_overflow': (14, 14), 'pmm_reserved': (15, 15), 'reserved_31_16': (16, 31)}), + 'regRLC_SPM_GLOBAL_DELAY_IND_ADDR': (19812, 1, {'addr': (0, 11)}), + 'regRLC_SPM_GLOBAL_DELAY_IND_DATA': (19813, 1, {'data': (0, 5)}), + 'regRLC_SPM_SE_DELAY_IND_ADDR': (19814, 1, {'addr': (0, 11)}), + 'regRLC_SPM_SE_DELAY_IND_DATA': (19815, 1, {'data': (0, 5)}), + 'regRLC_SPM_SE_BLK_EN_MASK_IND_ADDR': (19818, 1, {'addr': (0, 11)}), + 'regRLC_SPM_SE_BLK_EN_MASK_IND_DATA': (19819, 1, {'data': (0, 31)}), + 'regRLC_LX6_CNTL': (19840, 1, {'breset': (0, 0), 'runstall': (1, 1), 'pdebug_enable': (2, 2), 'stat_vector_sel': (3, 3)}), + 'regRLC_LX6_STATUS': (19841, 1, {'core0_core_busy': (0, 0), 'core0_pif_gasket_busy': (1, 1), 'core0_int_pending': (2, 2), 'core0_grbmt_busy': (3, 3), 'grbmt_busy': (8, 8)}), + 'regRLC_LX6_FW_STATUS': (19915, 1, {'status': (0, 31)}), + 'regRLC_LX6_FW_VERSION': (19916, 1, {'version': (0, 31)}), + 'regRLC_XT_CORE_STATUS': (19924, 1, {'p_wait_mode': (0, 0), 'p_fatal_error': (1, 1), 'double_exception_error': (2, 2)}), + 'regRLC_XT_CORE_INTERRUPT': (19925, 1, {'extint1': (0, 25), 'extint2': (26, 26), 'nmi': (27, 27)}), + 'regRLC_XT_CORE_FAULT_INFO': (19926, 1, {'fault_info': (0, 31)}), + 'regRLC_XT_CORE_ALT_RESET_VEC': (19927, 1, {'alt_reset_vec': (0, 31)}), + 'regRLC_XT_CORE_RESERVED': (19928, 1, {'reserved': (0, 31)}), + 'regRLC_XT_INT_VEC_FORCE': (19929, 1, {'num_0': (0, 0), 'num_1': (1, 1), 'num_2': (2, 2), 'num_3': (3, 3), 'num_4': (4, 4), 'num_5': (5, 5), 'num_6': (6, 6), 'num_7': (7, 7), 'num_8': (8, 8), 'num_9': (9, 9), 'num_10': (10, 10), 'num_11': (11, 11), 'num_12': (12, 12), 'num_13': (13, 13), 'num_14': (14, 14), 'num_15': (15, 15), 'num_16': (16, 16), 'num_17': (17, 17), 'num_18': (18, 18), 'num_19': (19, 19), 'num_20': (20, 20), 'num_21': (21, 21), 'num_22': (22, 22), 'num_23': (23, 23), 'num_24': (24, 24), 'num_25': (25, 25)}), + 'regRLC_XT_INT_VEC_CLEAR': (19930, 1, {'num_0': (0, 0), 'num_1': (1, 1), 'num_2': (2, 2), 'num_3': (3, 3), 'num_4': (4, 4), 'num_5': (5, 5), 'num_6': (6, 6), 'num_7': (7, 7), 'num_8': (8, 8), 'num_9': (9, 9), 'num_10': (10, 10), 'num_11': (11, 11), 'num_12': (12, 12), 'num_13': (13, 13), 'num_14': (14, 14), 'num_15': (15, 15), 'num_16': (16, 16), 'num_17': (17, 17), 'num_18': (18, 18), 'num_19': (19, 19), 'num_20': (20, 20), 'num_21': (21, 21), 'num_22': (22, 22), 'num_23': (23, 23), 'num_24': (24, 24), 'num_25': (25, 25)}), + 'regRLC_XT_INT_VEC_MUX_SEL': (19931, 1, {'mux_sel': (0, 4)}), + 'regRLC_XT_INT_VEC_MUX_INT_SEL': (19932, 1, {'int_sel': (0, 5)}), + 'regRLC_GPU_CLOCK_COUNT_SPM_LSB': (19940, 1, {'gpu_clocks_lsb': (0, 31)}), + 'regRLC_GPU_CLOCK_COUNT_SPM_MSB': (19941, 1, {'gpu_clocks_msb': (0, 31)}), + 'regRLC_SPM_THREAD_TRACE_CTRL': (19942, 1, {'thread_trace_int_en': (0, 0)}), + 'regRLC_SPP_CAM_ADDR': (19944, 1, {'addr': (0, 7)}), + 'regRLC_SPP_CAM_DATA': (19945, 1, {'data': (0, 7), 'tag': (8, 31)}), + 'regRLC_SPP_CAM_EXT_ADDR': (19946, 1, {'addr': (0, 7)}), + 'regRLC_SPP_CAM_EXT_DATA': (19947, 1, {'valid': (0, 0), 'lock': (1, 1)}), + 'regRLC_CPAXI_DOORBELL_MON_CTRL': (19953, 1, {'en': (0, 0), 'id': (1, 5)}), + 'regRLC_CPAXI_DOORBELL_MON_STAT': (19954, 1, {'id_match': (0, 0), 'match_clear': (1, 1), 'addr': (2, 27)}), + 'regRLC_CPAXI_DOORBELL_MON_DATA_LSB': (19955, 1, {'data': (0, 31)}), + 'regRLC_CPAXI_DOORBELL_MON_DATA_MSB': (19956, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_RANGE': (19957, 1, {'lower_addr_reserved': (0, 1), 'lower_addr': (2, 11), 'reserved_15_12': (12, 15), 'upper_addr_reserved': (16, 17), 'upper_addr': (18, 27), 'reserved_31_28': (28, 31)}), + 'regRLC_XT_DOORBELL_CNTL': (19958, 1, {'doorbell_0_mode': (0, 1), 'doorbell_1_mode': (2, 3), 'doorbell_2_mode': (4, 5), 'doorbell_3_mode': (6, 7), 'reserved_15_8': (8, 15), 'doorbell_id': (16, 20), 'doorbell_id_en': (21, 21), 'reserved_31_22': (22, 31)}), + 'regRLC_XT_DOORBELL_STAT': (19959, 1, {'doorbell_0_valid': (0, 0), 'doorbell_1_valid': (1, 1), 'doorbell_2_valid': (2, 2), 'doorbell_3_valid': (3, 3)}), + 'regRLC_XT_DOORBELL_0_DATA_LO': (19960, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_0_DATA_HI': (19961, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_1_DATA_LO': (19962, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_1_DATA_HI': (19963, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_2_DATA_LO': (19964, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_2_DATA_HI': (19965, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_3_DATA_LO': (19966, 1, {'data': (0, 31)}), + 'regRLC_XT_DOORBELL_3_DATA_HI': (19967, 1, {'data': (0, 31)}), + 'regRLC_MEM_SLP_CNTL': (19968, 1, {'rlc_mem_ls_en': (0, 0), 'rlc_mem_ds_en': (1, 1), 'rlc_srm_mem_ls_override': (2, 2), 'rlc_srm_mem_ds_override': (3, 3), 'rlc_spm_mem_ls_override': (4, 4), 'rlc_spm_mem_ds_override': (5, 5), 'reserved': (6, 6), 'rlc_ls_ds_busy_override': (7, 7), 'rlc_mem_ls_on_delay': (8, 15), 'rlc_mem_ls_off_delay': (16, 23), 'rlc_spp_mem_ls_override': (24, 24), 'rlc_spp_mem_ds_override': (25, 25), 'rlc_tc_mem_ls_override': (28, 28), 'rlc_tc_mem_ds_override': (29, 29), 'reserved1': (30, 31)}), + 'regRLC_RLCV_SAFE_MODE': (19970, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SMU_SAFE_MODE': (19971, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_RLCV_COMMAND': (19972, 1, {'cmd': (0, 3), 'reserved': (4, 31)}), + 'regRLC_SMU_MESSAGE': (19973, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_MESSAGE_1': (19974, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_MESSAGE_2': (19975, 1, {'cmd': (0, 31)}), + 'regRLC_SRM_GPM_COMMAND': (19976, 1, {'op': (0, 0), 'index_cntl': (1, 1), 'index_cntl_num': (2, 4), 'size': (5, 17), 'start_offset': (18, 30), 'reserved': (31, 31)}), + 'regRLC_SRM_GPM_ABORT': (19977, 1, {'abort': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SMU_COMMAND': (19978, 1, {'cmd': (0, 31)}), + 'regRLC_SMU_ARGUMENT_1': (19979, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_2': (19980, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_3': (19981, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_4': (19982, 1, {'arg': (0, 31)}), + 'regRLC_SMU_ARGUMENT_5': (19983, 1, {'arg': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_ADDR_HI': (19984, 1, {'addr_hi': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_ADDR_LO': (19985, 1, {'addr_lo': (0, 31)}), + 'regRLC_IMU_BOOTLOAD_SIZE': (19986, 1, {'size': (0, 25), 'reserved': (26, 31)}), + 'regRLC_IMU_MISC': (19990, 1, {'throttle_gfx': (0, 0), 'early_mgcg': (1, 1), 'reserved': (2, 31)}), + 'regRLC_IMU_RESET_VECTOR': (19991, 1, {'cold_boot_exit': (0, 0), 'vddgfx_exit': (1, 1), 'vector': (2, 7), 'reserved': (8, 31)}), + 'regRLC_RLCS_DEC_START': (20064, 1, {}), + 'regRLC_RLCS_DEC_DUMP_ADDR': (20065, 1, {}), + 'regRLC_RLCS_EXCEPTION_REG_1': (20066, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_2': (20067, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_3': (20068, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_EXCEPTION_REG_4': (20069, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_CGCG_REQUEST': (20071, 1, {'cgcg_request': (0, 0), 'cgcg_request_3d': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_CGCG_STATUS': (20072, 1, {'cgcg_ramp_status': (0, 1), 'gfx_clk_status': (2, 2), 'cgcg_ramp_status_3d': (3, 4), 'gfx_clk_status_3d': (5, 5), 'reserved': (6, 31)}), + 'regRLC_RLCS_SOC_DS_CNTL': (20073, 1, {'soc_clk_ds_allow': (0, 0), 'soc_clk_ds_rlc_busy_mask': (1, 1), 'soc_clk_ds_cp_busy_mask': (2, 2), 'reserved_4_3': (3, 4), 'reserved_5': (5, 5), 'soc_clk_ds_gfx_pwr_stalled_mask': (6, 6), 'soc_clk_ds_non3d_pwr_stalled_mask': (7, 7), 'soc_clk_ds_sdma_0_busy_mask': (16, 16), 'soc_clk_ds_sdma_1_busy_mask': (17, 17), 'soc_clk_ds_sdma_2_busy_mask': (18, 18), 'soc_clk_ds_sdma_3_busy_mask': (19, 19), 'soc_clk_ds_sdma_4_busy_mask': (20, 20), 'soc_clk_ds_sdma_5_busy_mask': (21, 21), 'soc_clk_ds_sdma_6_busy_mask': (22, 22), 'soc_clk_ds_sdma_7_busy_mask': (23, 23), 'reserved_31_24': (24, 31)}), + 'regRLC_RLCS_GFX_DS_CNTL': (20074, 1, {'gfx_clk_ds_allow': (0, 0), 'gfx_clk_ds_rlc_busy_mask': (1, 1), 'gfx_clk_ds_cp_busy_mask': (2, 2), 'reserved_4_3': (3, 4), 'reserved_5': (5, 5), 'gfx_clk_ds_gfx_pwr_stalled_mask': (6, 6), 'gfx_clk_ds_non3d_pwr_stalled_mask': (7, 7), 'gfx_clk_ds_imu_disable_mask': (8, 8), 'reserved_15_9': (9, 15), 'gfx_clk_ds_sdma_0_busy_mask': (16, 16), 'gfx_clk_ds_sdma_1_busy_mask': (17, 17), 'gfx_clk_ds_sdma_2_busy_mask': (18, 18), 'gfx_clk_ds_sdma_3_busy_mask': (19, 19), 'gfx_clk_ds_sdma_4_busy_mask': (20, 20), 'gfx_clk_ds_sdma_5_busy_mask': (21, 21), 'gfx_clk_ds_sdma_6_busy_mask': (22, 22), 'gfx_clk_ds_sdma_7_busy_mask': (23, 23), 'reserved': (24, 31)}), + 'regRLC_RLCS_GFX_DS_ALLOW_MASK_CNTL': (20075, 1, {'gfx_clk_ds_allow_mask_gdfll': (0, 0), 'gfx_clk_ds_allow_mask_gdfll_se0': (1, 1), 'gfx_clk_ds_allow_mask_gdfll_se1': (2, 2), 'gfx_clk_ds_allow_mask_gdfll_se2': (3, 3), 'gfx_clk_ds_allow_mask_gdfll_se3': (4, 4)}), + 'regRLC_GPM_STAT': (20076, 1, {'rlc_busy': (0, 0), 'gfx_power_status': (1, 1), 'gfx_clock_status': (2, 2), 'gfx_ls_status': (3, 3), 'gfx_pipeline_power_status': (4, 4), 'cntx_idle_being_processed': (5, 5), 'cntx_busy_being_processed': (6, 6), 'gfx_idle_being_processed': (7, 7), 'cmp_busy_being_processed': (8, 8), 'saving_registers': (9, 9), 'restoring_registers': (10, 10), 'gfx3d_blocks_changing_power_state': (11, 11), 'cmp_blocks_changing_power_state': (12, 12), 'static_wgp_powering_up': (13, 13), 'static_wgp_powering_down': (14, 14), 'dyn_wgp_powering_up': (15, 15), 'dyn_wgp_powering_down': (16, 16), 'aborted_pd_sequence': (17, 17), 'cmp_power_status': (18, 18), 'gfx_ls_status_3d': (19, 19), 'gfx_clock_status_3d': (20, 20), 'mgcg_override_status': (21, 21), 'rlc_exec_rom_code': (22, 22), 'fgcg_override_status': (23, 23), 'pg_error_status': (24, 31)}), + 'regRLC_RLCS_GPM_STAT': (20076, 1, {'rlc_busy': (0, 0), 'gfx_power_status': (1, 1), 'gfx_clock_status': (2, 2), 'gfx_ls_status': (3, 3), 'gfx_pipeline_power_status': (4, 4), 'cntx_idle_being_processed': (5, 5), 'cntx_busy_being_processed': (6, 6), 'gfx_idle_being_processed': (7, 7), 'cmp_busy_being_processed': (8, 8), 'saving_registers': (9, 9), 'restoring_registers': (10, 10), 'gfx3d_blocks_changing_power_state': (11, 11), 'cmp_blocks_changing_power_state': (12, 12), 'static_wgp_powering_up': (13, 13), 'static_wgp_powering_down': (14, 14), 'dyn_wgp_powering_up': (15, 15), 'dyn_wgp_powering_down': (16, 16), 'aborted_pd_sequence': (17, 17), 'cmp_power_status': (18, 18), 'gfx_ls_status_3d': (19, 19), 'gfx_clock_status_3d': (20, 20), 'mgcg_override_status': (21, 21), 'rlc_exec_rom_code': (22, 22), 'fgcg_override_status': (23, 23), 'pg_error_status': (24, 31)}), + 'regRLC_RLCS_ABORTED_PD_SEQUENCE': (20077, 1, {'aps': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_GPM_STAT_2': (20078, 1, {'tc_trans_error': (0, 0), 'rlc_pwr_non3d_stalled': (1, 1), 'gfx_pwr_stalled_status': (2, 2), 'gfx_ulv_status': (3, 3), 'gfx_general_status': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_GRBM_SOFT_RESET': (20079, 1, {'reset': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_PG_CHANGE_STATUS': (20080, 1, {'pg_cntl_changed': (0, 0), 'pg_reg_changed': (1, 1), 'dyn_pg_status_changed': (2, 2), 'dyn_pg_req_changed': (3, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_PG_CHANGE_READ': (20081, 1, {'reserved': (0, 0), 'pg_reg_changed': (1, 1), 'dyn_pg_status_changed': (2, 2), 'dyn_pg_req_changed': (3, 3)}), + 'regRLC_RLCS_IH_SEMAPHORE': (20082, 1, {'client_id': (0, 4)}), + 'regRLC_RLCS_IH_COOKIE_SEMAPHORE': (20083, 1, {'client_id': (0, 4)}), + 'regRLC_RLCS_CP_INT_CTRL_1': (20084, 1, {'interrupt_ack': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_CP_INT_CTRL_2': (20085, 1, {'idle_auto_ack_en': (0, 0), 'busy_auto_ack_en': (1, 1), 'idle_auto_ack_active': (2, 2), 'busy_auto_ack_active': (3, 3), 'interrupt_pending': (4, 4), 'reserved': (5, 31)}), + 'regRLC_RLCS_CP_INT_INFO_1': (20086, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_RLCS_CP_INT_INFO_2': (20087, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 24), 'reserved': (25, 31)}), + 'regRLC_RLCS_SPM_INT_CTRL': (20088, 1, {'interrupt_ack': (0, 0), 'reserved': (1, 31)}), + 'regRLC_RLCS_SPM_INT_INFO_1': (20089, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_RLCS_SPM_INT_INFO_2': (20090, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 24), 'reserved': (25, 31)}), + 'regRLC_RLCS_BOOTLOAD_STATUS': (20092, 1, {'gfx_fuse_dist_done': (0, 0), 'gfx_init_done': (1, 1), 'gfx_security_policy_loaded': (2, 2), 'gfx_security_policy_done': (3, 3), 'rlc_gpm_iram_loaded': (4, 4), 'rlc_gpm_iram_done': (5, 5), 'status_6_30': (6, 30), 'bootload_complete': (31, 31)}), + 'regRLC_RLCS_GRBM_IDLE_BUSY_STAT': (20093, 1, {'grbm_rlc_gc_stat_idle': (0, 1), 'sdma_0_busy': (16, 16), 'sdma_1_busy': (17, 17), 'sdma_2_busy': (18, 18), 'sdma_3_busy': (19, 19), 'sdma_4_busy': (20, 20), 'sdma_5_busy': (21, 21), 'sdma_6_busy': (22, 22), 'sdma_7_busy': (23, 23), 'sdma_0_busy_changed': (24, 24), 'sdma_1_busy_changed': (25, 25), 'sdma_2_busy_changed': (26, 26), 'sdma_3_busy_changed': (27, 27), 'sdma_4_busy_changed': (28, 28), 'sdma_5_busy_changed': (29, 29), 'sdma_6_busy_changed': (30, 30), 'sdma_7_busy_changed': (31, 31)}), + 'regRLC_RLCS_GRBM_IDLE_BUSY_INT_CNTL': (20094, 1, {'sdma0_busy_int_clear': (0, 0), 'sdma1_busy_int_clear': (1, 1), 'sdma2_busy_int_clear': (2, 2), 'sdma3_busy_int_clear': (3, 3), 'sdma4_busy_int_clear': (4, 4), 'sdma5_busy_int_clear': (5, 5), 'sdma6_busy_int_clear': (6, 6), 'sdma7_busy_int_clear': (7, 7)}), + 'regRLC_RLCS_CMP_IDLE_CNTL': (20095, 1, {'int_clear': (0, 0), 'cmp_idle_hyst': (1, 1), 'cmp_idle': (2, 2), 'max_hysteresis': (3, 10), 'hysteresis_cnt': (11, 18), 'reserved': (19, 31)}), + 'regRLC_RLCS_GENERAL_0': (20096, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_1': (20097, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_2': (20098, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_3': (20099, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_4': (20100, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_5': (20101, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_6': (20102, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_7': (20103, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_8': (20104, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_9': (20105, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_10': (20106, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_11': (20107, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_12': (20108, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_13': (20109, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_14': (20110, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_15': (20111, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GENERAL_16': (20112, 1, {'data': (0, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_1': (20157, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_2': (20158, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_3': (20159, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_AUXILIARY_REG_4': (20160, 1, {'addr': (0, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_SPM_SQTT_MODE': (20161, 1, {'mode': (0, 0)}), + 'regRLC_RLCS_CP_DMA_SRCID_OVER': (20162, 1, {'srcid_override': (0, 0)}), + 'regRLC_RLCS_BOOTLOAD_ID_STATUS1': (20163, 1, {'id_0_loaded': (0, 0), 'id_1_loaded': (1, 1), 'id_2_loaded': (2, 2), 'id_3_loaded': (3, 3), 'id_4_loaded': (4, 4), 'id_5_loaded': (5, 5), 'id_6_loaded': (6, 6), 'id_7_loaded': (7, 7), 'id_8_loaded': (8, 8), 'id_9_loaded': (9, 9), 'id_10_loaded': (10, 10), 'id_11_loaded': (11, 11), 'id_12_loaded': (12, 12), 'id_13_loaded': (13, 13), 'id_14_loaded': (14, 14), 'id_15_loaded': (15, 15), 'id_16_loaded': (16, 16), 'id_17_loaded': (17, 17), 'id_18_loaded': (18, 18), 'id_19_loaded': (19, 19), 'id_20_loaded': (20, 20), 'id_21_loaded': (21, 21), 'id_22_loaded': (22, 22), 'id_23_loaded': (23, 23), 'id_24_loaded': (24, 24), 'id_25_loaded': (25, 25), 'id_26_loaded': (26, 26), 'id_27_loaded': (27, 27), 'id_28_loaded': (28, 28), 'id_29_loaded': (29, 29), 'id_30_loaded': (30, 30), 'id_31_loaded': (31, 31)}), + 'regRLC_RLCS_BOOTLOAD_ID_STATUS2': (20164, 1, {'id_32_loaded': (0, 0), 'id_33_loaded': (1, 1), 'id_34_loaded': (2, 2), 'id_35_loaded': (3, 3), 'id_36_loaded': (4, 4), 'id_37_loaded': (5, 5), 'id_38_loaded': (6, 6), 'id_39_loaded': (7, 7), 'id_40_loaded': (8, 8), 'id_41_loaded': (9, 9), 'id_42_loaded': (10, 10), 'id_43_loaded': (11, 11), 'id_44_loaded': (12, 12), 'id_45_loaded': (13, 13), 'id_46_loaded': (14, 14), 'id_47_loaded': (15, 15), 'id_48_loaded': (16, 16), 'id_49_loaded': (17, 17), 'id_50_loaded': (18, 18), 'id_51_loaded': (19, 19), 'id_52_loaded': (20, 20), 'id_53_loaded': (21, 21), 'id_54_loaded': (22, 22), 'id_55_loaded': (23, 23), 'id_56_loaded': (24, 24), 'id_57_loaded': (25, 25), 'id_58_loaded': (26, 26), 'id_59_loaded': (27, 27), 'id_60_loaded': (28, 28), 'id_61_loaded': (29, 29), 'id_62_loaded': (30, 30), 'id_63_loaded': (31, 31)}), + 'regRLC_RLCS_IMU_VIDCHG_CNTL': (20165, 1, {'req': (0, 0), 'data': (1, 9), 'psien': (10, 10), 'ack': (11, 11), 'reserved': (12, 31)}), + 'regRLC_RLCS_KMD_LOG_CNTL1': (20166, 1, {'data': (0, 31)}), + 'regRLC_RLCS_KMD_LOG_CNTL2': (20167, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GPM_LEGACY_INT_STAT': (20168, 1, {'reserved': (0, 0)}), + 'regRLC_RLCS_GPM_LEGACY_INT_DISABLE': (20169, 1, {'reserved': (0, 0)}), + 'regRLC_RLCS_GCR_DATA_0': (20176, 1, {'phase_0': (0, 15), 'phase_1': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_1': (20177, 1, {'phase_2': (0, 15), 'phase_3': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_2': (20178, 1, {'phase_4': (0, 15), 'phase_5': (16, 31)}), + 'regRLC_RLCS_GCR_DATA_3': (20179, 1, {'phase_6': (0, 15), 'phase_7': (16, 31)}), + 'regRLC_RLCS_GCR_STATUS': (20180, 1, {'gcr_busy': (0, 0), 'gcr_out_count': (1, 4), 'reserved_2': (5, 7), 'gcriu_cli_rsp_tag': (8, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_PERFMON_CLK_CNTL_UCODE': (20181, 1, {'perfmon_clock_state': (0, 0)}), + 'regRLC_RLCS_UTCL2_CNTL': (20182, 1, {'mtype_no_pte_mode': (0, 0), 'gpa_override': (1, 1), 'vf_override': (2, 2), 'gpa_override_value': (3, 4), 'vf_override_value': (5, 5), 'ignore_pte_permission': (6, 6), 'reserved': (7, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA0': (20183, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA1': (20184, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA2': (20185, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA3': (20186, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_DATA4': (20187, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_CONTROL': (20188, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RLC_MSG_CNTL': (20189, 1, {'donetog': (0, 0), 'chgtog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_DATA0': (20190, 1, {'data': (0, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_CONTROL': (20191, 1, {'data': (0, 31)}), + 'regRLC_RLCS_RLC_IMU_MSG_CNTL': (20192, 1, {'chgtog': (0, 0), 'donetog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_0': (20193, 1, {'current': (0, 15), 'voltage': (16, 31)}), + 'regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_1': (20194, 1, {'temperature1': (0, 15), 'rail': (16, 16), 'reserved': (17, 31)}), + 'regRLC_RLCS_IMU_RLC_MUTEX_CNTL': (20195, 1, {'req': (0, 0), 'acquire': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_RLC_STATUS': (20196, 1, {'allow_gfxoff': (0, 0), 'allow_fa_dcs': (1, 1), 'status_14_2': (2, 14), 'disable_gfxclk_ds': (15, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_RLC_IMU_STATUS': (20197, 1, {'pwr_down_active': (0, 0), 'rlc_alive': (1, 1), 'status_3_2': (2, 3), 'reserved': (4, 31)}), + 'regRLC_RLCS_IMU_RAM_DATA_1': (20198, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_1_LSB': (20199, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_1_MSB': (20200, 1, {'data': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_IMU_RAM_DATA_0': (20201, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_0_LSB': (20202, 1, {'data': (0, 31)}), + 'regRLC_RLCS_IMU_RAM_ADDR_0_MSB': (20203, 1, {'data': (0, 15), 'reserved': (16, 31)}), + 'regRLC_RLCS_IMU_RAM_CNTL': (20204, 1, {'reqtog': (0, 0), 'acktog': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_IMU_GFX_DOORBELL_FENCE': (20205, 1, {'enable': (0, 0), 'ack': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_CNTL_1': (20207, 1, {'interrupt_ack': (0, 0), 'resp_id': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_CNTL_2': (20208, 1, {'auto_ack_en': (0, 0), 'auto_ack_active': (1, 1), 'reserved': (2, 31)}), + 'regRLC_RLCS_SDMA_INT_STAT': (20209, 1, {'req_idle_hist': (0, 7), 'req_busy_hist': (8, 15), 'last_sdma_rlc_int_id': (16, 16), 'sdma_rlc_int_pending': (17, 17), 'reserved': (18, 31)}), + 'regRLC_RLCS_SDMA_INT_INFO': (20210, 1, {'req_idle_to_fw': (0, 7), 'req_busy_to_fw': (8, 15), 'interrupt_id': (16, 16), 'reserved': (17, 31)}), + 'regRLC_RLCS_GFX_MEM_POWER_CTRL_0': (20211, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GFX_MEM_POWER_CTRL_1': (20212, 1, {'data': (0, 31)}), + 'regRLC_RLCS_GFX_MEM_POWER_CTRL_2': (20213, 1, {'data': (0, 31)}), + 'regRLC_RLCS_SE_PWR_CTRL': (20223, 1, {'se_gfxclk_clken': (0, 3), 'se_gfx_hard_resetb': (8, 11), 'se_ea_hard_resetb': (16, 19)}), + 'regRLC_RLCS_UTCL2_BUSY_CNTL': (20338, 1, {'auto_hdshk': (0, 0), 'ack': (1, 1), 'spare': (2, 3), 'hw_chk_dis': (4, 6)}), + 'regRLC_RLCS_UTCL2_BUSY_STAT': (20339, 1, {'req_status': (0, 0), 'ack_status': (1, 1)}), + 'regRLC_RLCS_DEC_END': (20479, 1, {}), + 'regRLC_SAFE_MODE': (2432, 1, {'cmd': (0, 0), 'message': (1, 4), 'reserved1': (5, 7), 'response': (8, 11), 'reserved': (12, 31)}), + 'regRLC_SPM_SAMPLE_CNT': (2433, 1, {'count': (0, 31)}), + 'regRLC_SPM_MC_CNTL': (2434, 1, {'rlc_spm_vmid': (0, 3), 'rlc_spm_sdr': (4, 5), 'rlc_spm_perf_cntr': (6, 6), 'rlc_spm_fed': (7, 7), 'rlc_spm_temporal': (8, 10), 'rlc_spm_comp': (11, 12), 'rlc_spm_comp_over': (13, 13), 'rlc_spm_ro': (14, 14), 'rlc_spm_nofill': (15, 15), 'reserved': (16, 31)}), + 'regRLC_SPM_INT_CNTL': (2435, 1, {'rlc_spm_int_cntl': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_STATUS': (2436, 1, {'rlc_spm_int_status': (0, 0), 'reserved': (1, 31)}), + 'regRLC_SPM_INT_INFO_1': (2437, 1, {'interrupt_info_1': (0, 31)}), + 'regRLC_SPM_INT_INFO_2': (2438, 1, {'interrupt_info_2': (0, 15), 'interrupt_id': (16, 23), 'reserved': (24, 31)}), + 'regRLC_CSIB_ADDR_LO': (2439, 1, {'address': (0, 31)}), + 'regRLC_CSIB_ADDR_HI': (2440, 1, {'address': (0, 15)}), + 'regRLC_CSIB_LENGTH': (2441, 1, {'length': (0, 31)}), + 'regRLC_CP_SCHEDULERS': (2442, 1, {'scheduler0': (0, 7), 'scheduler1': (8, 15)}), + 'regRLC_CP_EOF_INT': (2443, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regRLC_CP_EOF_INT_CNTL': (2444, 1, {'data': (0, 31)}), + 'regRLC_SPARE_INT_0': (2445, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_SPARE_INT_1': (2446, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_SPARE_INT_2': (2447, 1, {'data': (0, 29), 'processing': (30, 30), 'complete': (31, 31)}), + 'regRLC_RLCV_SPARE_INT_1': (2450, 1, {'interrupt': (0, 0), 'reserved': (1, 31)}), + 'regCP_MEC_DM_INDEX_ADDR': (23554, 1, {'addr': (0, 31)}), + 'regCP_MEC_DM_INDEX_DATA': (23555, 1, {'data': (0, 31)}), + 'regGRBM_SEC_CNTL': (24077, 1, {'debug_enable': (0, 0)}), + 'regGRBM_CAM_INDEX': (24080, 1, {'cam_index': (0, 3)}), + 'regGRBM_CAM_DATA': (24081, 1, {'cam_addr': (0, 15), 'cam_remapaddr': (16, 31)}), + 'regGRBM_CAM_DATA_UPPER': (24082, 1, {'cam_addr': (0, 1), 'cam_remapaddr': (16, 17)}), + 'regRLC_REG_SEC_INT_STATUS': (24381, 1, {'fwl_viol_count': (0, 15), 'fwl_viol_count_overflow': (16, 16), 'reserved': (17, 31)}), + 'regRLC_UTC_BYPASS_CNTL': (24386, 1, {'spm': (0, 0), 'th0': (1, 1), 'th1': (2, 2), 'th2': (3, 3), 'lx6': (4, 4), 'dma': (5, 5), 'srm': (6, 6), 'dlg': (7, 7), 'reserved': (8, 31)}), + 'regGRBMH_CNTL': (3584, 0, {'read_timeout': (0, 7), 'report_last_rderr': (31, 31)}), + 'regGRBMH_INTF_CNTL': (3585, 0, {'rsmuse_path_disable': (0, 0), 'grbm_path_disable': (1, 1)}), + 'regGRBMH_STATUS': (3586, 0, {'sc_clean': (0, 0), 'db_clean': (1, 1), 'cb_clean': (2, 2), 'utcl1_busy': (3, 3), 'tcp_busy': (4, 4), 'gl1cc_busy': (5, 5), 'gl1xcc_busy': (6, 6), 'pc_busy': (7, 7), 'ge_busy': (9, 9), 'rlc_busy': (10, 10), 'ea_link_busy': (12, 12), 'ea_busy': (13, 13), 'gl2c_busy': (14, 14), 'gl2a_busy': (15, 15), 'sc_busy': (17, 17), 'gl1a_busy': (18, 18), 'bci_busy': (20, 20), 'sqg_busy': (23, 23), 'pa_busy': (24, 24), 'ta_busy': (25, 25), 'sx_busy': (26, 26), 'spi_busy': (27, 27), 'db_busy': (30, 30), 'cb_busy': (31, 31)}), + 'regGRBMH_FGCG0_TARG': (3588, 0, {'fgcg_grbmh_targ0_chick_bit': (0, 0), 'fgcg_grbmh_targ1_chick_bit': (1, 1), 'fgcg_grbmh_targ2_chick_bit': (2, 2), 'fgcg_grbmh_targ3_chick_bit': (3, 3), 'fgcg_grbmh_targ4_chick_bit': (4, 4), 'fgcg_grbmh_targ5_chick_bit': (5, 5), 'fgcg_grbmh_targ6_chick_bit': (6, 6), 'fgcg_grbmh_targ7_chick_bit': (7, 7), 'fgcg_grbmh_targ8_chick_bit': (8, 8), 'fgcg_grbmh_targ9_chick_bit': (9, 9), 'fgcg_grbmh_targ10_chick_bit': (10, 10), 'fgcg_grbmh_targ11_chick_bit': (11, 11), 'fgcg_grbmh_targ12_chick_bit': (12, 12), 'fgcg_grbmh_targ13_chick_bit': (13, 13), 'fgcg_grbmh_targ14_chick_bit': (14, 14), 'fgcg_grbmh_targ15_chick_bit': (15, 15), 'fgcg_grbmh_targ16_chick_bit': (16, 16), 'fgcg_grbmh_targ17_chick_bit': (17, 17), 'fgcg_grbmh_targ18_chick_bit': (18, 18), 'fgcg_grbmh_targ19_chick_bit': (19, 19), 'fgcg_grbmh_targ20_chick_bit': (20, 20), 'fgcg_grbmh_targ21_chick_bit': (21, 21), 'fgcg_grbmh_targ22_chick_bit': (22, 22), 'fgcg_grbmh_targ23_chick_bit': (23, 23), 'fgcg_grbmh_targ24_chick_bit': (24, 24), 'fgcg_grbmh_targ25_chick_bit': (25, 25), 'fgcg_grbmh_targ26_chick_bit': (26, 26), 'fgcg_grbmh_targ27_chick_bit': (27, 27), 'fgcg_grbmh_targ28_chick_bit': (28, 28), 'fgcg_grbmh_targ29_chick_bit': (29, 29), 'fgcg_grbmh_targ30_chick_bit': (30, 30), 'fgcg_grbmh_targ31_chick_bit': (31, 31)}), + 'regGRBMH_SOFT_RESET': (3589, 0, {'soft_reset_gfx': (0, 0), 'soft_reset_sx': (1, 1), 'soft_reset_ea': (2, 2), 'soft_reset_rlcse': (5, 5), 'soft_reset_wgpcac': (6, 6), 'soft_reset_cac': (7, 7), 'soft_reset_ta': (9, 9)}), + 'regGRBMH_READ_ERROR': (3590, 0, {'read_address': (2, 19), 'read_pipeid': (20, 21), 'read_meid': (22, 23), 'read_requester_rlc': (27, 27), 'read_requester_aid_gfx_pipe0': (28, 28), 'read_requester_aid_nbp_pipe': (30, 30), 'read_error': (31, 31)}), + 'regGRBMH_GFX_CLKEN_CNTL': (3597, 0, {'prefix_delay_cnt': (0, 3), 'post_delay_cnt': (8, 12)}), + 'regGRBMH_FGCG2_MISC': (3598, 0, {'fgcg_grbmh_spi_chick_bit': (0, 0), 'fgcg_grbmh_sqg_chick_bit': (1, 1), 'fgcg_grbmh_gese_chick_bit': (3, 3), 'fgcg_grbmh_wgp0_chick_bit': (4, 4), 'fgcg_grbmh_wgp1_chick_bit': (5, 5), 'fgcg_grbmh_wgp2_chick_bit': (6, 6), 'fgcg_grbmh_wgp3_chick_bit': (7, 7), 'fgcg_grbmh_wgp4_chick_bit': (8, 8), 'fgcg_grbmh_wgp5_chick_bit': (9, 9), 'fgcg_grbmh_wgp6_chick_bit': (10, 10), 'fgcg_grbmh_wgp7_chick_bit': (11, 11), 'fgcg_grbmh_rb0_chick_bit': (12, 12), 'fgcg_grbmh_rb1_chick_bit': (13, 13), 'fgcg_grbmh_rb2_chick_bit': (14, 14), 'fgcg_grbmh_rb3_chick_bit': (15, 15), 'fgcg_grbmh_rb4_chick_bit': (16, 16), 'fgcg_grbmh_rb5_chick_bit': (17, 17), 'fgcg_grbmh_rb6_chick_bit': (18, 18), 'fgcg_grbmh_rb7_chick_bit': (19, 19)}), + 'regGRBMH_FGCG1_TARGVF': (3599, 0, {'fgcg_grbmh_targvf0_chick_bit': (0, 0), 'fgcg_grbmh_targvf1_chick_bit': (1, 1), 'fgcg_grbmh_targvf2_chick_bit': (2, 2), 'fgcg_grbmh_targvf3_chick_bit': (3, 3), 'fgcg_grbmh_targvf4_chick_bit': (4, 4), 'fgcg_grbmh_targvf5_chick_bit': (5, 5), 'fgcg_grbmh_targvf6_chick_bit': (6, 6), 'fgcg_grbmh_targvf7_chick_bit': (7, 7), 'fgcg_grbmh_targvf8_chick_bit': (8, 8), 'fgcg_grbmh_targvf9_chick_bit': (9, 9), 'fgcg_grbmh_targvf10_chick_bit': (10, 10), 'fgcg_grbmh_targvf11_chick_bit': (11, 11), 'fgcg_grbmh_targvf12_chick_bit': (12, 12), 'fgcg_grbmh_targvf13_chick_bit': (13, 13), 'fgcg_grbmh_targvf14_chick_bit': (14, 14), 'fgcg_grbmh_targvf15_chick_bit': (15, 15), 'fgcg_grbmh_targvf16_chick_bit': (16, 16), 'fgcg_grbmh_targvf17_chick_bit': (17, 17), 'fgcg_grbmh_targvf18_chick_bit': (18, 18), 'fgcg_grbmh_targvf19_chick_bit': (19, 19), 'fgcg_grbmh_targvf20_chick_bit': (20, 20), 'fgcg_grbmh_targvf21_chick_bit': (21, 21), 'fgcg_grbmh_targvf22_chick_bit': (22, 22), 'aid_read_error_chick_bit': (23, 23), 'se_strap_match_enable_chick_bit': (24, 24), 'grbmh_rlcse_reg_clken_chick_bit': (25, 25), 'grbm_grbmh_reg_clken_chick_bit': (26, 26), 'aid_fgcg_chick_bit': (27, 27), 'grbmh_grbm_fgcg_chick_bit': (28, 28), 'grbmh_spi_reg_clken_chick_bit': (29, 29), 'grbmh_alwayson_reg_clken_chick_bit': (31, 31)}), + 'regGRBMH_NOWHERE': (3600, 0, {'data': (0, 31)}), + 'regGRBMH_INVALID_PIPE': (3602, 0, {'addr': (2, 19), 'pipeid': (20, 21), 'meid': (22, 23), 'queueid': (24, 26), 'ssrcid': (27, 30), 'invalid_pipe': (31, 31)}), + 'regGRBMH_SYNC': (3603, 0, {'gfx_pipe0_perfmon_sync': (0, 0), 'gfx_pipe0_sync': (16, 16), 'gfx_sync_set_clr': (31, 31)}), + 'regGRBMH_CC_GC_SA_UNIT_DISABLE': (4073, 0, {'sa_disable': (8, 23)}), + 'regGB_ADDR_CONFIG': (5086, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 22), 'num_rb_per_se': (26, 27)}), + 'regGB_ADDR_CONFIG_1': (5086, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 22), 'num_rb_per_se': (26, 27)}), + 'regGB_ADDR_CONFIG_READ': (5090, 0, {'num_pipes': (0, 2), 'pipe_interleave_size': (3, 5), 'max_compressed_frags': (6, 7), 'num_pkrs': (8, 10), 'num_shader_engines': (19, 22), 'num_rb_per_se': (26, 27)}), + 'regSPI_COMPUTE_QUEUE_RESET': (8051, 0, {'reset': (0, 0)}), + 'regTCP_WATCH0_ADDR_H': (8264, 0, {'addr': (0, 15)}), + 'regTCP_WATCH0_ADDR_L': (8265, 0, {'addr': (7, 31)}), + 'regTCP_WATCH0_CNTL': (8266, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH1_ADDR_H': (8267, 0, {'addr': (0, 15)}), + 'regTCP_WATCH1_ADDR_L': (8268, 0, {'addr': (7, 31)}), + 'regTCP_WATCH1_CNTL': (8269, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH2_ADDR_H': (8270, 0, {'addr': (0, 15)}), + 'regTCP_WATCH2_ADDR_L': (8271, 0, {'addr': (7, 31)}), + 'regTCP_WATCH2_CNTL': (8272, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regTCP_WATCH3_ADDR_H': (8273, 0, {'addr': (0, 15)}), + 'regTCP_WATCH3_ADDR_L': (8274, 0, {'addr': (7, 31)}), + 'regTCP_WATCH3_CNTL': (8275, 0, {'mask': (0, 22), 'vmid': (24, 27), 'mode': (29, 30), 'valid': (31, 31)}), + 'regSH_MEM_BASES': (2531, 1, {'private_base': (0, 15), 'shared_base': (16, 31)}), + 'regSH_MEM_CONFIG': (2532, 1, {'address_mode': (0, 0), 'alignment_mode': (2, 3), 'f8_mode': (8, 8), 'initial_inst_prefetch': (14, 15), 'icache_use_gl1': (18, 18)}), + 'regTCP_INVALIDATE': (6560, 1, {'start': (0, 0)}), + 'regTCP_STATUS': (6561, 1, {'tcp_busy': (0, 0), 'input_busy': (1, 1), 'adrs_busy': (2, 2), 'tagrams_busy': (3, 3), 'cntrl_busy': (4, 4), 'lfifo_busy': (5, 5), 'read_busy': (6, 6), 'format_busy': (7, 7), 'vm_busy': (8, 8), 'memif_busy': (9, 9), 'gcr_busy': (10, 10), 'ofifo_busy': (11, 11), 'ofifo_queue_busy': (12, 13), 'xnack_prt': (15, 15)}), + 'regTCP_CNTL': (6562, 1, {'force_hit': (0, 0), 'force_miss': (1, 1), 'store_atomic_collapse_clause_limit': (2, 4), 'flat_buf_cache_swizzle': (5, 5), 'td_data_en_override': (6, 6), 'disable_write_combining': (9, 9), 'force_scope_eow': (10, 10), 'force_temporal_eow': (11, 11), 'force_eow_total_cnt': (15, 20), 'force_eow_set_cnt': (22, 26), 'disable_full_cl_access': (27, 27), 'disable_z_map': (28, 28), 'astc_ve_msb_tolerant': (31, 31)}), + 'regTCP_CNTL2': (6563, 1, {'tcp_fmt_mgcg_disable': (8, 8), 'tcpf_latency_bypass_disable': (9, 9), 'tcp_write_data_mgcg_disable': (10, 10), 'tcp_inner_block_mgcg_disable': (11, 11), 'tcp_adrs_img_calc_mgcg_disable': (12, 12), 'v64_combine_enable': (13, 13), 'tagram_addr_swizzle_disable': (14, 14), 'power_opt_disable': (16, 16), 'gcr_rsp_fgcg_disable': (17, 17), 'perf_en_override': (18, 19), 'tcp_gl1_req_clken_disable': (22, 22), 'tcp_gl1r_src_clken_disable': (23, 23), 'tcp_force_2x_to_load': (24, 24), 'disable_flat_buf_dataram_swizzle': (25, 25), 'spare_bit': (26, 26), 'tagram_xy_bias_override': (27, 28), 'tcp_req_mgcg_disable': (29, 29), 'tcp_miss_mgcg_disable': (30, 30), 'disable_mipmap_param_calc_self_gating': (31, 31)}), + 'regTCP_CREDIT': (6564, 1, {'lfifo_ram_depth': (0, 9), 'gl1_req_credit': (10, 15), 'req_fifo_credit': (16, 22), 'td_ram_credit': (23, 27), 'td_data_credit': (29, 31)}), + 'regTCP_COMPRESSION_CNTL': (6567, 1, {'image_compression_override': (0, 0), 'image_bypass_compression': (1, 1), 'image_write_compression_disable': (2, 2), 'buffer_compression_override': (3, 3), 'buffer_bypass_compression': (4, 4), 'buffer_write_compression_disable': (5, 5), 'flat_compression_override': (6, 6), 'flat_bypass_compression': (7, 7), 'flat_write_compression_disable': (8, 8), 'bvh_bypass_compression': (9, 9), 'buf_speculative_data_read': (10, 11), 'buf_max_comp_block_size': (12, 13), 'buf_max_uncomp_block_size': (14, 14), 'bvh_speculative_data_read': (15, 16), 'bvh_max_comp_block_size': (17, 18), 'bvh_max_uncomp_block_size': (19, 19)}), + 'regTCP_ARB': (6568, 1, {'weight': (0, 2), 'end_clause': (3, 3)}), + 'regSQ_THREAD_TRACE_USERDATA_0': (9024, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_1': (9025, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_2': (9026, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_3': (9027, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_4': (9028, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_5': (9029, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_6': (9030, 1, {'data': (0, 31)}), + 'regSQ_THREAD_TRACE_USERDATA_7': (9031, 1, {'data': (0, 31)}), + 'regSPI_CONFIG_CNTL': (9280, 1, {'gpr_write_priority': (0, 20), 'exp_priority_order': (21, 23), 'enable_sqg_top_events': (24, 24), 'enable_sqg_bop_events': (25, 25), 'alloc_arb_lru_ena': (28, 28), 'exp_arb_lru_ena': (29, 29), 'ps_pkr_priority_cntl': (30, 31)}), + 'regSPI_CONFIG_CNTL_1': (9281, 1, {'vtx_done_delay': (0, 3), 'interp_one_prim_per_row': (4, 4), 'pc_limit_enable': (5, 6), 'pc_limit_strict': (7, 7), 'ps_group_timeout_mode': (8, 8), 'oreo_expalloc_stall': (9, 9), 'lbpw_cu_chk_cnt': (10, 13), 'csc_pwr_save_disable': (14, 14), 'csg_pwr_save_disable': (15, 15), 'max_vtx_sync_cnt': (16, 20), 'en_user_accum': (21, 21), 'sa_screen_map': (22, 22), 'ps_group_timeout': (23, 31)}), + 'regSPI_CONFIG_CNTL_2': (9282, 1, {'context_save_wait_gds_request_cycle_ovhd': (0, 3), 'context_save_wait_gds_grant_cycle_ovhd': (4, 7), 'pws_csg_wait_disable': (8, 8), 'pws_hs_wait_disable': (9, 9), 'pws_gs_wait_disable': (10, 10), 'pws_ps_wait_disable': (11, 11), 'csc_halt_ack_delay': (12, 16), 'spp_timeout_ctr': (17, 20), 'pc_context_done_sync_enable': (21, 21)}), + 'regGRBMH_PERFCOUNTER0_LO': (12538, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBMH_PERFCOUNTER0_HI': (12539, 1, {'perfcounter_hi': (0, 31)}), + 'regGRBMH_PERFCOUNTER1_LO': (12540, 1, {'perfcounter_lo': (0, 31)}), + 'regGRBMH_PERFCOUNTER1_HI': (12541, 1, {'perfcounter_hi': (0, 31)}), + 'regSQ_PERFCOUNTER0_LO': (12736, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER1_LO': (12738, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER2_LO': (12740, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER3_LO': (12742, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER4_LO': (12744, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER5_LO': (12746, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER6_LO': (12748, 1, {'perfcounter_lo': (0, 31)}), + 'regSQ_PERFCOUNTER7_LO': (12750, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_LO': (13120, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER0_HI': (13121, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER1_LO': (13122, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER1_HI': (13123, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER2_LO': (13124, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER2_HI': (13125, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER3_LO': (13126, 1, {'perfcounter_lo': (0, 31)}), + 'regTCP_PERFCOUNTER3_HI': (13127, 1, {'perfcounter_hi': (0, 31)}), + 'regTCP_PERFCOUNTER_FILTER': (13128, 1, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 4), 'data_format': (5, 11), 'compression_enable': (12, 12), 'num_format': (13, 16), 'sw_mode': (17, 21), 'num_samples': (22, 23), 'opcode_type': (24, 26), 'tmprl': (27, 29), 'scope': (30, 31)}), + 'regTCP_PERFCOUNTER_FILTER2': (13129, 1, {'req_mode': (0, 2)}), + 'regTCP_PERFCOUNTER_FILTER_EN': (13130, 1, {'buffer': (0, 0), 'flat': (1, 1), 'dim': (2, 2), 'data_format': (3, 3), 'num_format': (4, 4), 'sw_mode': (5, 5), 'num_samples': (6, 6), 'opcode_type': (7, 7), 'tmprl': (8, 8), 'compression_enable': (11, 11), 'req_mode': (12, 12), 'scope': (13, 13)}), + 'regGRBMH_CP_PERFMON_CNTL': (14344, 1, {'perfmon_state': (0, 3), 'spm_perfmon_state': (4, 7), 'perfmon_enable_mode': (8, 9), 'perfmon_sample_enable': (10, 10)}), + 'regCP_PERFMON_CNTL_1': (14344, 1, {'perfmon_state': (0, 3), 'spm_perfmon_state': (4, 7), 'perfmon_enable_mode': (8, 9), 'perfmon_sample_enable': (10, 10)}), + 'regGRBMH_PERFCOUNTER0_SELECT': (14584, 1, {'perf_sel': (0, 5), 'gl1cc_busy_user_defined_mask': (6, 6), 'gl1xcc_busy_user_defined_mask': (7, 7), 'sqg_busy_user_defined_mask': (8, 8), 'sc_clean_user_defined_mask': (9, 9), 'db_clean_user_defined_mask': (11, 11), 'cb_clean_user_defined_mask': (12, 12), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'gl2c_busy_user_defined_mask': (15, 15), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'gl2a_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'pc_busy_user_defined_mask': (22, 22), 'ea_link_busy_user_defined_mask': (23, 23), 'gl1a_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl1_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30)}), + 'regGRBMH_PERFCOUNTER1_SELECT': (14585, 1, {'perf_sel': (0, 5), 'gl1cc_busy_user_defined_mask': (6, 6), 'gl1xcc_busy_user_defined_mask': (7, 7), 'sqg_busy_user_defined_mask': (8, 8), 'sc_clean_user_defined_mask': (9, 9), 'db_clean_user_defined_mask': (11, 11), 'cb_clean_user_defined_mask': (12, 12), 'ta_busy_user_defined_mask': (13, 13), 'sx_busy_user_defined_mask': (14, 14), 'gl2c_busy_user_defined_mask': (15, 15), 'spi_busy_user_defined_mask': (16, 16), 'sc_busy_user_defined_mask': (17, 17), 'pa_busy_user_defined_mask': (18, 18), 'gl2a_busy_user_defined_mask': (19, 19), 'db_busy_user_defined_mask': (20, 20), 'cb_busy_user_defined_mask': (21, 21), 'pc_busy_user_defined_mask': (22, 22), 'ea_link_busy_user_defined_mask': (23, 23), 'gl1a_busy_user_defined_mask': (24, 24), 'bci_busy_user_defined_mask': (25, 25), 'rlc_busy_user_defined_mask': (26, 26), 'tcp_busy_user_defined_mask': (27, 27), 'ge_busy_user_defined_mask': (28, 28), 'utcl1_busy_user_defined_mask': (29, 29), 'ea_busy_user_defined_mask': (30, 30)}), + 'regSQ_PERFCOUNTER0_SELECT': (14784, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER1_SELECT': (14785, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER2_SELECT': (14786, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER3_SELECT': (14787, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER4_SELECT': (14788, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER5_SELECT': (14789, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER6_SELECT': (14790, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER7_SELECT': (14791, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER8_SELECT': (14792, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER9_SELECT': (14793, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER10_SELECT': (14794, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER11_SELECT': (14795, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER12_SELECT': (14796, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER13_SELECT': (14797, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER14_SELECT': (14798, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER15_SELECT': (14799, 1, {'perf_sel': (0, 8), 'spm_mode': (20, 23), 'perf_mode': (28, 31)}), + 'regSQ_PERFCOUNTER_CTRL': (14816, 1, {'ps_en': (0, 0), 'gs_en': (2, 2), 'hs_en': (4, 4), 'cs_en': (6, 6), 'disable_me0pipe0_perf': (14, 14), 'disable_me0pipe1_perf': (15, 15), 'disable_me1pipe0_perf': (16, 16), 'disable_me1pipe1_perf': (17, 17), 'disable_me1pipe2_perf': (18, 18), 'disable_me1pipe3_perf': (19, 19)}), + 'regSQ_PERFCOUNTER_CTRL2': (14818, 1, {'force_en': (0, 0), 'vmid_en': (1, 16)}), + 'regSQ_THREAD_TRACE_BUF0_SIZE': (14822, 1, {'size': (0, 21)}), + 'regSQ_THREAD_TRACE_BUF0_BASE_LO': (14823, 1, {'base_lo': (0, 31)}), + 'regSQ_THREAD_TRACE_BUF0_BASE_HI': (14824, 1, {'base_hi': (0, 12)}), + 'regSQ_THREAD_TRACE_BUF1_SIZE': (14825, 1, {'size': (0, 21)}), + 'regSQ_THREAD_TRACE_BUF1_BASE_LO': (14826, 1, {'base_lo': (0, 31)}), + 'regSQ_THREAD_TRACE_BUF1_BASE_HI': (14827, 1, {'base_hi': (0, 12)}), + 'regSQ_THREAD_TRACE_CTRL': (14828, 1, {'mode': (0, 1), 'gl1_perf_en': (3, 3), 'interrupt_en': (4, 4), 'double_buffer': (5, 5), 'hiwater': (6, 8), 'reg_at_hwm': (9, 10), 'spi_stall_en': (11, 11), 'sq_stall_en': (12, 12), 'stall_all_simds': (13, 13), 'util_timer': (14, 14), 'wavestart_mode': (15, 16), 'sync_count_markers': (18, 18), 'sync_count_draws': (19, 19), 'lowater_offset': (20, 22), 'gl1x_prefetch_page': (23, 26), 'auto_flush_padding_dis': (28, 28), 'auto_flush_mode': (29, 29), 'ncp_reg_token_en': (30, 30), 'draw_event_en': (31, 31)}), + 'regSQ_THREAD_TRACE_MASK': (14829, 1, {'simd_sel': (0, 1), 'wgp_sel': (4, 7), 'sa_sel': (9, 9), 'wtype_include': (10, 16), 'exclude_nondetail_shaderdata': (17, 17), 'exclude_nondetail_wavestart_ext': (18, 18), 'exclude_nondetail_alloc': (19, 19)}), + 'regSQ_THREAD_TRACE_TOKEN_MASK': (14830, 1, {'token_exclude': (0, 11), 'ttrace_exec': (12, 12), 'bop_events_token_include': (13, 13), 'exclude_barrier_wait': (14, 14), 'reg_include': (16, 23), 'inst_exclude': (24, 25), 'reg_exclude': (26, 28), 'reg_detail_all': (31, 31)}), + 'regSQ_THREAD_TRACE_WPTR': (14831, 1, {'offset': (0, 28), 'buffer_id': (31, 31)}), + 'regSQ_THREAD_TRACE_HALT': (14832, 1, {'enter_cgcg': (0, 0), 'cgcg_ready': (1, 1), 'enter_poweroff': (2, 2), 'poweroff_ready': (3, 3)}), + 'regSQ_THREAD_TRACE_POWEROFF_RESTORE_1': (14833, 1, {'states': (0, 31)}), + 'regSQ_THREAD_TRACE_STATUS': (14836, 1, {'finish_pending': (0, 11), 'finish_done': (12, 23), 'write_error': (24, 24), 'busy': (25, 25), 'owner_vmid': (28, 31)}), + 'regSQ_THREAD_TRACE_STATUS2': (14837, 1, {'buf0_full': (0, 0), 'buf1_full': (1, 1), 'packet_lost_buf_no_lockdown': (4, 4), 'buf_issue_status': (8, 12), 'buf_issue': (13, 13), 'write_buf_full': (14, 14)}), + 'regSQ_THREAD_TRACE_GFX_DRAW_CNTR': (14838, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_GFX_MARKER_CNTR': (14839, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_HP3D_DRAW_CNTR': (14840, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_HP3D_MARKER_CNTR': (14841, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_DROPPED_CNTR': (14842, 1, {'cntr': (0, 31)}), + 'regSQ_THREAD_TRACE_FINISH_DONE_DEBUG': (14843, 1, {'gfx': (0, 9), 'exp': (10, 15)}), + 'regTCP_PERFCOUNTER0_SELECT': (15168, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER0_SELECT1': (15169, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT': (15170, 1, {'perf_sel': (0, 9), 'perf_sel1': (10, 19), 'cntr_mode': (20, 23), 'perf_mode1': (24, 27), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER1_SELECT1': (15171, 1, {'perf_sel2': (0, 9), 'perf_sel3': (10, 19), 'perf_mode3': (24, 27), 'perf_mode2': (28, 31)}), + 'regTCP_PERFCOUNTER2_SELECT': (15172, 1, {'perf_sel': (0, 9), 'perf_mode': (28, 31)}), + 'regTCP_PERFCOUNTER3_SELECT': (15173, 1, {'perf_sel': (0, 9), 'perf_mode': (28, 31)}), + 'regGRBMH_GC_USER_SA_UNIT_DISABLE': (23442, 1, {'sa_disable': (8, 23)}), + 'regGRBMH_WGP_SA0_REMAP_CNTL': (22816, 1, {'side0_wgp0_sa0_remap_en': (0, 0), 'side0_wgp1_sa0_remap_en': (1, 1), 'side0_wgp2_sa0_remap_en': (2, 2), 'side0_wgp3_sa0_remap_en': (3, 3), 'side0_wgp4_sa0_remap_en': (4, 4), 'side0_wgp5_sa0_remap_en': (5, 5), 'side0_wgp6_sa0_remap_en': (6, 6), 'side0_wgp7_sa0_remap_en': (7, 7), 'side0_sa0_remap_to_side': (8, 8), 'side0_sa0_remap_to_wgp': (9, 11), 'side1_wgp0_sa0_remap_en': (16, 16), 'side1_wgp1_sa0_remap_en': (17, 17), 'side1_wgp2_sa0_remap_en': (18, 18), 'side1_wgp3_sa0_remap_en': (19, 19), 'side1_wgp4_sa0_remap_en': (20, 20), 'side1_wgp5_sa0_remap_en': (21, 21), 'side1_wgp6_sa0_remap_en': (22, 22), 'side1_wgp7_sa0_remap_en': (23, 23), 'side1_sa0_remap_to_side': (24, 24), 'side1_sa0_remap_to_wgp': (25, 27)}), + 'regGRBMH_WGP_SA1_REMAP_CNTL': (22817, 1, {'side0_wgp0_sa1_remap_en': (0, 0), 'side0_wgp1_sa1_remap_en': (1, 1), 'side0_wgp2_sa1_remap_en': (2, 2), 'side0_wgp3_sa1_remap_en': (3, 3), 'side0_wgp4_sa1_remap_en': (4, 4), 'side0_wgp5_sa1_remap_en': (5, 5), 'side0_wgp6_sa1_remap_en': (6, 6), 'side0_wgp7_sa1_remap_en': (7, 7), 'side0_sa1_remap_to_side': (8, 8), 'side0_sa1_remap_to_wgp': (9, 11), 'side1_wgp0_sa1_remap_en': (16, 16), 'side1_wgp1_sa1_remap_en': (17, 17), 'side1_wgp2_sa1_remap_en': (18, 18), 'side1_wgp3_sa1_remap_en': (19, 19), 'side1_wgp4_sa1_remap_en': (20, 20), 'side1_wgp5_sa1_remap_en': (21, 21), 'side1_wgp6_sa1_remap_en': (22, 22), 'side1_wgp7_sa1_remap_en': (23, 23), 'side1_sa1_remap_to_side': (24, 24), 'side1_sa1_remap_to_wgp': (25, 27)}), + 'regGRBMH_RB_SA0_REMAP_CNTL': (22818, 1, {'rb0_remap_en': (0, 0), 'rb0_remap': (1, 3), 'rb1_remap_en': (4, 4), 'rb1_remap': (5, 7), 'rb2_remap_en': (8, 8), 'rb2_remap': (9, 11), 'rb3_remap_en': (12, 12), 'rb3_remap': (13, 15)}), + 'regGRBMH_RB_SA1_REMAP_CNTL': (22819, 1, {'rb0_remap_en': (0, 0), 'rb0_remap': (1, 3), 'rb1_remap_en': (4, 4), 'rb1_remap': (5, 7), 'rb2_remap_en': (8, 8), 'rb2_remap': (9, 11), 'rb3_remap_en': (12, 12), 'rb3_remap': (13, 15)}), + 'regGRBMH_GRBM_SA_REMAP_CNTL': (23049, 1, {'se0_sa_remap': (0, 1), 'se1_sa_remap': (2, 3), 'se2_sa_remap': (4, 5), 'se3_sa_remap': (6, 7), 'se4_sa_remap': (8, 9), 'se5_sa_remap': (10, 11), 'se6_sa_remap': (12, 13), 'se7_sa_remap': (14, 15)}), +} +mmhub_1_8_0 = { + 'regMMMC_VM_MX_L1_TLB0_STATUS': (2824, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB1_STATUS': (2825, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB2_STATUS': (2826, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB3_STATUS': (2827, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB4_STATUS': (2828, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB5_STATUS': (2829, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB6_STATUS': (2830, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB7_STATUS': (2831, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER0_CFG': (2848, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER1_CFG': (2849, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER2_CFG': (2850, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER3_CFG': (2851, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_RSLT_CNTL': (2852, 0, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_LO': (2864, 0, {'counter_lo': (0, 31)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_HI': (2865, 0, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMVM_L2_CNTL': (2912, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regMMVM_L2_CNTL2': (2913, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regMMVM_L2_CNTL3': (2914, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regMMVM_L2_STATUS': (2915, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regMMVM_DUMMY_PAGE_FAULT_CNTL': (2916, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_LO32': (2917, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_HI32': (2918, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL': (2919, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL2': (2920, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL3': (2921, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL4': (2922, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_STATUS': (2923, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'uce': (29, 29), 'fed': (30, 30)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_LO32': (2924, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_HI32': (2925, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (2926, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (2927, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (2929, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (2930, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (2931, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (2932, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (2933, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (2934, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regMMVM_L2_CNTL4': (2935, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30)}), + 'regMMVM_L2_CNTL5': (2936, 0, {'walker_fetch_pde_mtype_enable': (0, 0), 'walker_fetch_pde_noalloc_enable': (1, 1)}), + 'regMMVM_L2_MM_GROUP_RT_CLASSES': (2937, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID': (2938, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID2': (2939, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25)}), + 'regMMVM_L2_CACHE_PARITY_CNTL': (2940, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regMMVM_L2_CGTT_CLK_CTRL': (2941, 0, {'on_delay': (0, 3), 'off_hysteresis': (4, 11), 'mgls_override': (15, 15), 'soft_stall_override': (16, 23), 'soft_override': (24, 31)}), + 'regMMVM_L2_CGTT_BUSY_CTRL': (2942, 0, {'read_delay': (0, 3), 'always_busy': (4, 4)}), + 'regMMVM_CONTEXT0_CNTL': (2976, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT1_CNTL': (2977, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT2_CNTL': (2978, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT3_CNTL': (2979, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT4_CNTL': (2980, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT5_CNTL': (2981, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT6_CNTL': (2982, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT7_CNTL': (2983, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT8_CNTL': (2984, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT9_CNTL': (2985, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT10_CNTL': (2986, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT11_CNTL': (2987, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT12_CNTL': (2988, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT13_CNTL': (2989, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT14_CNTL': (2990, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT15_CNTL': (2991, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXTS_DISABLE': (2992, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regMMVM_INVALIDATE_ENG0_SEM': (2993, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG1_SEM': (2994, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG2_SEM': (2995, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG3_SEM': (2996, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG4_SEM': (2997, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG5_SEM': (2998, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG6_SEM': (2999, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG7_SEM': (3000, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG8_SEM': (3001, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG9_SEM': (3002, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG10_SEM': (3003, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG11_SEM': (3004, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG12_SEM': (3005, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG13_SEM': (3006, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG14_SEM': (3007, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG15_SEM': (3008, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG16_SEM': (3009, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG17_SEM': (3010, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG0_REQ': (3011, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG1_REQ': (3012, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG2_REQ': (3013, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG3_REQ': (3014, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG4_REQ': (3015, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG5_REQ': (3016, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG6_REQ': (3017, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG7_REQ': (3018, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG8_REQ': (3019, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG9_REQ': (3020, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG10_REQ': (3021, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG11_REQ': (3022, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG12_REQ': (3023, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG13_REQ': (3024, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG14_REQ': (3025, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG15_REQ': (3026, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG16_REQ': (3027, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG17_REQ': (3028, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 17), 'invalidate_l2_ptes': (18, 18), 'invalidate_l2_pde0': (19, 19), 'invalidate_l2_pde1': (20, 20), 'invalidate_l2_pde2': (21, 21), 'invalidate_l1_ptes': (22, 22), 'clear_protection_fault_status_addr': (23, 23), 'log_request': (24, 24)}), + 'regMMVM_INVALIDATE_ENG0_ACK': (3029, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG1_ACK': (3030, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG2_ACK': (3031, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG3_ACK': (3032, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG4_ACK': (3033, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG5_ACK': (3034, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG6_ACK': (3035, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG7_ACK': (3036, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG8_ACK': (3037, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG9_ACK': (3038, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG10_ACK': (3039, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG11_ACK': (3040, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG12_ACK': (3041, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG13_ACK': (3042, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG14_ACK': (3043, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG15_ACK': (3044, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG16_ACK': (3045, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG17_ACK': (3046, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (3047, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (3048, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (3049, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (3050, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (3051, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (3052, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (3053, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (3054, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (3055, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (3056, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (3057, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (3058, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (3059, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (3060, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (3061, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (3062, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (3063, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (3064, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (3065, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (3066, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (3067, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (3068, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (3069, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (3070, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (3071, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (3072, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (3073, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (3074, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (3075, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (3076, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (3077, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (3078, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (3079, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (3080, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (3081, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (3082, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (3083, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (3084, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (3085, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (3086, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (3087, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (3088, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (3089, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (3090, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (3091, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (3092, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (3093, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (3094, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (3095, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (3096, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (3097, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (3098, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (3099, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (3100, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (3101, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (3102, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (3103, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (3104, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (3105, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (3106, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (3107, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (3108, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (3109, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (3110, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (3111, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (3112, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (3113, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (3114, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (3115, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (3116, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (3117, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (3118, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (3119, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (3120, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (3121, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (3122, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (3123, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (3124, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (3125, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (3126, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (3127, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (3128, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (3129, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (3130, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (3131, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (3132, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (3133, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (3134, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (3135, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (3136, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (3137, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (3138, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (3139, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (3140, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (3141, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (3142, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (3143, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (3144, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (3145, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (3146, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (3147, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (3148, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (3149, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (3150, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (3151, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (3152, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (3153, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (3154, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (3155, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (3156, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (3157, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (3158, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (3159, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (3160, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (3161, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (3162, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (3163, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (3164, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (3165, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (3166, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (3167, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (3168, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (3169, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (3170, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (3171, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (3172, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (3173, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (3174, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (3175, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (3176, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (3177, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (3178, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMMC_VM_NB_MMIOBASE': (3200, 0, {'mmiobase': (0, 31)}), + 'regMMMC_VM_NB_MMIOLIMIT': (3201, 0, {'mmiolimit': (0, 31)}), + 'regMMMC_VM_NB_PCI_CTRL': (3202, 0, {'mmioenable': (23, 23)}), + 'regMMMC_VM_NB_PCI_ARB': (3203, 0, {'vga_hole': (3, 3)}), + 'regMMMC_VM_NB_TOP_OF_DRAM_SLOT1': (3204, 0, {'top_of_dram': (23, 31)}), + 'regMMMC_VM_NB_LOWER_TOP_OF_DRAM2': (3205, 0, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regMMMC_VM_NB_UPPER_TOP_OF_DRAM2': (3206, 0, {'upper_tom2': (0, 15)}), + 'regMMMC_VM_FB_OFFSET': (3207, 0, {'fb_offset': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (3208, 0, {'physical_page_number_lsb': (0, 31)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (3209, 0, {'physical_page_number_msb': (0, 3)}), + 'regMMMC_VM_STEERING': (3210, 0, {'default_steering': (0, 1)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_START': (3213, 0, {'address': (0, 23)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_END': (3214, 0, {'address': (0, 23)}), + 'regMMMC_VM_APT_CNTL': (3217, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'check_is_local': (2, 2), 'perms_granted': (3, 3), 'local_sysmem_aperture_cntl': (4, 5)}), + 'regMMMC_VM_LOCAL_HBM_ADDRESS_START': (3218, 0, {'address': (0, 23)}), + 'regMMMC_VM_LOCAL_HBM_ADDRESS_END': (3219, 0, {'address': (0, 23)}), + 'regMMMC_VM_LOCAL_HBM_ADDRESS_LOCK_CNTL': (3220, 0, {'lock': (0, 0)}), + 'regMMMC_VM_XGMI_LFB_CNTL': (3223, 0, {'pf_lfb_region': (0, 3), 'pf_max_region': (4, 7)}), + 'regMMMC_VM_XGMI_LFB_SIZE': (3224, 0, {'pf_lfb_size': (0, 16)}), + 'regMMMC_VM_CACHEABLE_DRAM_CNTL': (3225, 0, {'enable_cacheable_dram_address_aperture': (0, 0)}), + 'regMMMC_VM_HOST_MAPPING': (3226, 0, {'mode': (0, 0)}), + 'regMMMC_VM_FB_LOCATION_BASE': (3228, 0, {'fb_base': (0, 23)}), + 'regMMMC_VM_FB_LOCATION_TOP': (3229, 0, {'fb_top': (0, 23)}), + 'regMMMC_VM_AGP_TOP': (3230, 0, {'agp_top': (0, 23)}), + 'regMMMC_VM_AGP_BOT': (3231, 0, {'agp_bot': (0, 23)}), + 'regMMMC_VM_AGP_BASE': (3232, 0, {'agp_base': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR': (3233, 0, {'logical_addr': (0, 29)}), + 'regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (3234, 0, {'logical_addr': (0, 29)}), + 'regMMMC_VM_MX_L1_TLB_CNTL': (3235, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 12), 'atc_en': (13, 13)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF0': (3244, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF1': (3245, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF2': (3246, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF3': (3247, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF4': (3248, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF5': (3249, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF6': (3250, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF7': (3251, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF8': (3252, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF9': (3253, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF10': (3254, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF11': (3255, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF12': (3256, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF13': (3257, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF14': (3258, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF15': (3259, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMVM_IOMMU_MMIO_CNTRL_1': (3260, 0, {'marc_en': (8, 8)}), + 'regMMMC_VM_MARC_BASE_LO_0': (3261, 0, {'marc_base_lo_0': (12, 31)}), + 'regMMMC_VM_MARC_BASE_LO_1': (3262, 0, {'marc_base_lo_1': (12, 31)}), + 'regMMMC_VM_MARC_BASE_LO_2': (3263, 0, {'marc_base_lo_2': (12, 31)}), + 'regMMMC_VM_MARC_BASE_LO_3': (3264, 0, {'marc_base_lo_3': (12, 31)}), + 'regMMMC_VM_MARC_BASE_HI_0': (3265, 0, {'marc_base_hi_0': (0, 19)}), + 'regMMMC_VM_MARC_BASE_HI_1': (3266, 0, {'marc_base_hi_1': (0, 19)}), + 'regMMMC_VM_MARC_BASE_HI_2': (3267, 0, {'marc_base_hi_2': (0, 19)}), + 'regMMMC_VM_MARC_BASE_HI_3': (3268, 0, {'marc_base_hi_3': (0, 19)}), + 'regMMMC_VM_MARC_RELOC_LO_0': (3269, 0, {'marc_enable_0': (0, 0), 'marc_readonly_0': (1, 1), 'marc_reloc_lo_0': (12, 31)}), + 'regMMMC_VM_MARC_RELOC_LO_1': (3270, 0, {'marc_enable_1': (0, 0), 'marc_readonly_1': (1, 1), 'marc_reloc_lo_1': (12, 31)}), + 'regMMMC_VM_MARC_RELOC_LO_2': (3271, 0, {'marc_enable_2': (0, 0), 'marc_readonly_2': (1, 1), 'marc_reloc_lo_2': (12, 31)}), + 'regMMMC_VM_MARC_RELOC_LO_3': (3272, 0, {'marc_enable_3': (0, 0), 'marc_readonly_3': (1, 1), 'marc_reloc_lo_3': (12, 31)}), + 'regMMMC_VM_MARC_RELOC_HI_0': (3273, 0, {'marc_reloc_hi_0': (0, 19)}), + 'regMMMC_VM_MARC_RELOC_HI_1': (3274, 0, {'marc_reloc_hi_1': (0, 19)}), + 'regMMMC_VM_MARC_RELOC_HI_2': (3275, 0, {'marc_reloc_hi_2': (0, 19)}), + 'regMMMC_VM_MARC_RELOC_HI_3': (3276, 0, {'marc_reloc_hi_3': (0, 19)}), + 'regMMMC_VM_MARC_LEN_LO_0': (3277, 0, {'marc_len_lo_0': (12, 31)}), + 'regMMMC_VM_MARC_LEN_LO_1': (3278, 0, {'marc_len_lo_1': (12, 31)}), + 'regMMMC_VM_MARC_LEN_LO_2': (3279, 0, {'marc_len_lo_2': (12, 31)}), + 'regMMMC_VM_MARC_LEN_LO_3': (3280, 0, {'marc_len_lo_3': (12, 31)}), + 'regMMMC_VM_MARC_LEN_HI_0': (3281, 0, {'marc_len_hi_0': (0, 19)}), + 'regMMMC_VM_MARC_LEN_HI_1': (3282, 0, {'marc_len_hi_1': (0, 19)}), + 'regMMMC_VM_MARC_LEN_HI_2': (3283, 0, {'marc_len_hi_2': (0, 19)}), + 'regMMMC_VM_MARC_LEN_HI_3': (3284, 0, {'marc_len_hi_3': (0, 19)}), + 'regMMVM_IOMMU_CONTROL_REGISTER': (3285, 0, {'iommuen': (0, 0)}), + 'regMMVM_IOMMU_PERFORMANCE_OPTIMIZATION_CONTROL_REGISTER': (3286, 0, {'perfopten': (13, 13)}), + 'regMMVM_PCIE_ATS_CNTL': (3287, 0, {'stu': (16, 20), 'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_0': (3288, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_1': (3289, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_2': (3290, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_3': (3291, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_4': (3292, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_5': (3293, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_6': (3294, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_7': (3295, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_8': (3296, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_9': (3297, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_10': (3298, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_11': (3299, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_12': (3300, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_13': (3301, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_14': (3302, 0, {'atc_enable': (31, 31)}), + 'regMMVM_PCIE_ATS_CNTL_VF_15': (3303, 0, {'atc_enable': (31, 31)}), + 'regMMMC_VM_XGMI_GPUIOV_ENABLE': (3305, 0, {'enable_vf0': (0, 0), 'enable_vf1': (1, 1), 'enable_vf2': (2, 2), 'enable_vf3': (3, 3), 'enable_vf4': (4, 4), 'enable_vf5': (5, 5), 'enable_vf6': (6, 6), 'enable_vf7': (7, 7), 'enable_vf8': (8, 8), 'enable_vf9': (9, 9), 'enable_vf10': (10, 10), 'enable_vf11': (11, 11), 'enable_vf12': (12, 12), 'enable_vf13': (13, 13), 'enable_vf14': (14, 14), 'enable_vf15': (15, 15), 'enable_pf': (31, 31)}), + 'regMMMC_VM_L2_PERFCOUNTER0_CFG': (3316, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER1_CFG': (3317, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER2_CFG': (3318, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER3_CFG': (3319, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER4_CFG': (3320, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER5_CFG': (3321, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER6_CFG': (3322, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER7_CFG': (3323, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (3332, 0, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_L2_PERFCOUNTER_LO': (3340, 0, {'counter_lo': (0, 31)}), + 'regMMMC_VM_L2_PERFCOUNTER_HI': (3341, 0, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), +} +mmhub_3_0_0 = { + 'regMMMC_VM_MX_L1_TLB0_STATUS': (1414, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB1_STATUS': (1415, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB2_STATUS': (1416, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB3_STATUS': (1417, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB4_STATUS': (1418, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB5_STATUS': (1419, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER0_CFG': (1436, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER1_CFG': (1437, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER2_CFG': (1438, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER3_CFG': (1439, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_RSLT_CNTL': (1440, 0, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_LO': (1444, 0, {'counter_lo': (0, 31)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_HI': (1445, 0, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMM_ATC_L2_MISC_CG': (1741, 0, {'offdly': (6, 11), 'enable': (18, 18), 'mem_ls_enable': (19, 19)}), + 'regMMVM_L2_CNTL': (1792, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regMMVM_L2_CNTL2': (1793, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regMMVM_L2_CNTL3': (1794, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regMMVM_L2_STATUS': (1795, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regMMVM_DUMMY_PAGE_FAULT_CNTL': (1796, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_LO32': (1797, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_HI32': (1798, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regMMVM_INVALIDATE_CNTL': (1799, 0, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL': (1800, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL2': (1801, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL3': (1802, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL4': (1803, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_STATUS': (1804, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'prt': (29, 29)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_LO32': (1805, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_HI32': (1806, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (1807, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (1808, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (1810, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (1811, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (1812, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (1813, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (1814, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (1815, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regMMVM_L2_CNTL4': (1816, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regMMVM_L2_MM_GROUP_RT_CLASSES': (1817, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID': (1818, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID2': (1819, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_CACHE_PARITY_CNTL': (1820, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regMMVM_L2_CGTT_CLK_CTRL': (1821, 0, {'on_delay': (0, 4), 'off_hysteresis': (5, 12), 'ls_assert_hysteresis': (13, 28), 'ls_disable': (30, 30), 'busy_override': (31, 31)}), + 'regMMVM_L2_CNTL5': (1822, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'mm_client_ret_fgcg_off': (16, 16), 'utcl2_atc_req_fgcg_off': (17, 17)}), + 'regMMVM_L2_GCR_CNTL': (1823, 0, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regMMVM_L2_CGTT_BUSY_CTRL': (1824, 0, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regMMVM_L2_PTE_CACHE_DUMP_CNTL': (1825, 0, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regMMVM_L2_PTE_CACHE_DUMP_READ': (1826, 0, {'data': (0, 31)}), + 'regMMVM_L2_BANK_SELECT_MASKS': (1829, 0, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regMMVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (1833, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (1834, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVM_CONTEXT0_CNTL': (1856, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT1_CNTL': (1857, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT2_CNTL': (1858, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT3_CNTL': (1859, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT4_CNTL': (1860, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT5_CNTL': (1861, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT6_CNTL': (1862, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT7_CNTL': (1863, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT8_CNTL': (1864, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT9_CNTL': (1865, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT10_CNTL': (1866, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT11_CNTL': (1867, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT12_CNTL': (1868, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT13_CNTL': (1869, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT14_CNTL': (1870, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT15_CNTL': (1871, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXTS_DISABLE': (1872, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regMMVM_INVALIDATE_ENG0_SEM': (1873, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG1_SEM': (1874, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG2_SEM': (1875, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG3_SEM': (1876, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG4_SEM': (1877, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG5_SEM': (1878, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG6_SEM': (1879, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG7_SEM': (1880, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG8_SEM': (1881, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG9_SEM': (1882, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG10_SEM': (1883, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG11_SEM': (1884, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG12_SEM': (1885, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG13_SEM': (1886, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG14_SEM': (1887, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG15_SEM': (1888, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG16_SEM': (1889, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG17_SEM': (1890, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG0_REQ': (1891, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG1_REQ': (1892, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG2_REQ': (1893, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG3_REQ': (1894, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG4_REQ': (1895, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG5_REQ': (1896, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG6_REQ': (1897, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG7_REQ': (1898, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG8_REQ': (1899, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG9_REQ': (1900, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG10_REQ': (1901, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG11_REQ': (1902, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG12_REQ': (1903, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG13_REQ': (1904, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG14_REQ': (1905, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG15_REQ': (1906, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG16_REQ': (1907, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG17_REQ': (1908, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG0_ACK': (1909, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG1_ACK': (1910, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG2_ACK': (1911, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG3_ACK': (1912, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG4_ACK': (1913, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG5_ACK': (1914, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG6_ACK': (1915, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG7_ACK': (1916, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG8_ACK': (1917, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG9_ACK': (1918, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG10_ACK': (1919, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG11_ACK': (1920, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG12_ACK': (1921, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG13_ACK': (1922, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG14_ACK': (1923, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG15_ACK': (1924, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG16_ACK': (1925, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG17_ACK': (1926, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (1927, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (1928, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (1929, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (1930, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (1931, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (1932, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (1933, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (1934, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (1935, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (1936, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (1937, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (1938, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (1939, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (1940, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (1941, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (1942, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (1943, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (1944, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (1945, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (1946, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (1947, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (1948, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (1949, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (1950, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (1951, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (1952, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (1953, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (1954, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (1955, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (1956, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (1957, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (1958, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (1959, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (1960, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (1961, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (1962, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (1963, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (1964, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (1965, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (1966, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (1967, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (1968, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (1969, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (1970, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (1971, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (1972, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (1973, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (1974, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (1975, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (1976, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (1977, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (1978, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (1979, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (1980, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (1981, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (1982, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (1983, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (1984, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (1985, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (1986, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (1987, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (1988, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (1989, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (1990, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (1991, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (1992, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (1993, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (1994, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (1995, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (1996, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (1997, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (1998, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (1999, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (2000, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (2001, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (2002, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (2003, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (2004, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (2005, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (2006, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (2007, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (2008, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (2009, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (2010, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (2011, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (2012, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (2013, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (2014, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (2015, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (2016, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (2017, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (2018, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (2019, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (2020, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (2021, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (2022, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (2023, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (2024, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (2025, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (2026, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (2027, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (2028, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (2029, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (2030, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (2031, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (2032, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (2033, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (2034, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (2035, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (2036, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (2037, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (2038, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (2039, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (2040, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (2041, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (2042, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (2043, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (2044, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (2045, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (2046, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (2047, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (2048, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (2049, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (2050, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (2051, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (2052, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (2053, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (2054, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (2055, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (2056, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (2057, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (2058, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2059, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2060, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2061, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2062, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2063, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2064, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2065, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2066, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2067, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2068, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2069, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2070, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2071, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2072, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2073, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2074, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2075, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMMC_VM_L2_PERFCOUNTER0_CFG': (2084, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER1_CFG': (2085, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER2_CFG': (2086, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER3_CFG': (2087, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER4_CFG': (2088, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER5_CFG': (2089, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER6_CFG': (2090, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER7_CFG': (2091, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (2092, 0, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_L2_PERFCOUNTER_LO': (2104, 0, {'counter_lo': (0, 31)}), + 'regMMMC_VM_L2_PERFCOUNTER_HI': (2105, 0, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF0': (2124, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF1': (2125, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF2': (2126, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF3': (2127, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF4': (2128, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF5': (2129, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF6': (2130, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF7': (2131, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF8': (2132, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF9': (2133, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF10': (2134, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF11': (2135, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF12': (2136, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF13': (2137, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF14': (2138, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF15': (2139, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_OFFSET': (2263, 0, {'fb_offset': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (2264, 0, {'physical_page_number_lsb': (0, 31)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (2265, 0, {'physical_page_number_msb': (0, 3)}), + 'regMMMC_VM_STEERING': (2266, 0, {'default_steering': (0, 1)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_START': (2269, 0, {'address': (0, 19)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_END': (2270, 0, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_START': (2271, 0, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_END': (2272, 0, {'address': (0, 19)}), + 'regMMMC_VM_APT_CNTL': (2273, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_START': (2274, 0, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_END': (2275, 0, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (2276, 0, {'lock': (0, 0)}), + 'regMMMC_VM_FB_NOALLOC_CNTL': (2280, 0, {'local_fb_noalloc_nopte': (0, 0), 'remote_fb_noalloc_nopte': (1, 1), 'router_atcl2_noalloc': (2, 2), 'router_gpa_mode2_noalloc': (3, 3), 'router_gpa_mode3_noalloc': (4, 4)}), + 'regMMMC_VM_FB_LOCATION_BASE': (2284, 0, {'fb_base': (0, 23)}), + 'regMMMC_VM_FB_LOCATION_TOP': (2285, 0, {'fb_top': (0, 23)}), + 'regMMMC_VM_AGP_TOP': (2286, 0, {'agp_top': (0, 23)}), + 'regMMMC_VM_AGP_BOT': (2287, 0, {'agp_bot': (0, 23)}), + 'regMMMC_VM_AGP_BASE': (2288, 0, {'agp_base': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR': (2289, 0, {'logical_addr': (0, 29)}), + 'regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (2290, 0, {'logical_addr': (0, 29)}), + 'regMMMC_VM_MX_L1_TLB_CNTL': (2291, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 13)}), +} +mmhub_3_0_1 = { + 'regMMMC_VM_MX_L1_TLB0_STATUS': (1416, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB1_STATUS': (1417, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB2_STATUS': (1418, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB3_STATUS': (1419, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB4_STATUS': (1420, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB5_STATUS': (1421, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB6_STATUS': (1422, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB7_STATUS': (1423, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER0_CFG': (1436, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER1_CFG': (1437, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER2_CFG': (1438, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER3_CFG': (1439, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_RSLT_CNTL': (1440, 1, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_LO': (1444, 1, {'counter_lo': (0, 31)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_HI': (1445, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL': (1456, 1, {'prefetch_count': (0, 3), 'clear_protection_fault_status_addr': (4, 4), 'allow_subsequent_protection_fault_status_addr_updates': (5, 5), 'iomgr_snoop_select': (6, 7), 'iomgr_default_system': (8, 8), 'iomgr_default_snoop': (9, 9), 'debug_eco_bits': (16, 31)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL0': (1457, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL1': (1458, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL2': (1459, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL3': (1460, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL4': (1461, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL5': (1462, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL6': (1463, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL7': (1464, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL8': (1465, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL9': (1466, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL10': (1467, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL11': (1468, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL12': (1469, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL13': (1470, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL14': (1471, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL15': (1472, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL16': (1473, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL17': (1474, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL18': (1475, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL19': (1476, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL20': (1477, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL21': (1478, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL22': (1479, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL23': (1480, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL24': (1481, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL25': (1482, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL26': (1483, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL27': (1484, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL28': (1485, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL29': (1486, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL30': (1487, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL31': (1488, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL32': (1489, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL33': (1490, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL34': (1491, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL35': (1492, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL36': (1493, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_CNTL37': (1494, 1, {'req_stream_id': (0, 8), 'en': (12, 12), 'prefetch_done': (13, 13)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR0_LO32': (1495, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR0_HI32': (1496, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR1_LO32': (1497, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR1_HI32': (1498, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR2_LO32': (1499, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR2_HI32': (1500, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR3_LO32': (1501, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR3_HI32': (1502, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR4_LO32': (1503, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR4_HI32': (1504, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR5_LO32': (1505, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR5_HI32': (1506, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR6_LO32': (1507, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR6_HI32': (1508, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR7_LO32': (1509, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR7_HI32': (1510, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR8_LO32': (1511, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR8_HI32': (1512, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR9_LO32': (1513, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR9_HI32': (1514, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR10_LO32': (1515, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR10_HI32': (1516, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR11_LO32': (1517, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR11_HI32': (1518, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR12_LO32': (1519, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR12_HI32': (1520, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR13_LO32': (1521, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR13_HI32': (1522, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR14_LO32': (1523, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR14_HI32': (1524, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR15_LO32': (1525, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR15_HI32': (1526, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR16_LO32': (1527, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR16_HI32': (1528, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR17_LO32': (1529, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR17_HI32': (1530, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR18_LO32': (1531, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR18_HI32': (1532, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR19_LO32': (1533, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR19_HI32': (1534, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR20_LO32': (1535, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR20_HI32': (1536, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR21_LO32': (1537, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR21_HI32': (1538, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR22_LO32': (1539, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR22_HI32': (1540, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR23_LO32': (1541, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR23_HI32': (1542, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR24_LO32': (1543, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR24_HI32': (1544, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR25_LO32': (1545, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR25_HI32': (1546, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR26_LO32': (1547, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR26_HI32': (1548, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR27_LO32': (1549, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR27_HI32': (1550, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR28_LO32': (1551, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR28_HI32': (1552, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR29_LO32': (1553, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR29_HI32': (1554, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR30_LO32': (1555, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR30_HI32': (1556, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR31_LO32': (1557, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR31_HI32': (1558, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR32_LO32': (1559, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR32_HI32': (1560, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR33_LO32': (1561, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR33_HI32': (1562, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR34_LO32': (1563, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR34_HI32': (1564, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR35_LO32': (1565, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR35_HI32': (1566, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR36_LO32': (1567, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR36_HI32': (1568, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR37_LO32': (1569, 1, {'start_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_START_ADDR37_HI32': (1570, 1, {'start_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR0_LO32': (1571, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR0_HI32': (1572, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR1_LO32': (1573, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR1_HI32': (1574, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR2_LO32': (1575, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR2_HI32': (1576, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR3_LO32': (1577, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR3_HI32': (1578, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR4_LO32': (1579, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR4_HI32': (1580, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR5_LO32': (1581, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR5_HI32': (1582, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR6_LO32': (1583, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR6_HI32': (1584, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR7_LO32': (1585, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR7_HI32': (1586, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR8_LO32': (1587, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR8_HI32': (1588, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR9_LO32': (1589, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR9_HI32': (1590, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR10_LO32': (1591, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR10_HI32': (1592, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR11_LO32': (1593, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR11_HI32': (1594, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR12_LO32': (1595, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR12_HI32': (1596, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR13_LO32': (1597, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR13_HI32': (1598, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR14_LO32': (1599, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR14_HI32': (1600, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR15_LO32': (1601, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR15_HI32': (1602, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR16_LO32': (1603, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR16_HI32': (1604, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR17_LO32': (1605, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR17_HI32': (1606, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR18_LO32': (1607, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR18_HI32': (1608, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR19_LO32': (1609, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR19_HI32': (1610, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR20_LO32': (1611, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR20_HI32': (1612, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR21_LO32': (1613, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR21_HI32': (1614, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR22_LO32': (1615, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR22_HI32': (1616, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR23_LO32': (1617, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR23_HI32': (1618, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR24_LO32': (1619, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR24_HI32': (1620, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR25_LO32': (1621, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR25_HI32': (1622, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR26_LO32': (1623, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR26_HI32': (1624, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR27_LO32': (1625, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR27_HI32': (1626, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR28_LO32': (1627, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR28_HI32': (1628, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR29_LO32': (1629, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR29_HI32': (1630, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR30_LO32': (1631, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR30_HI32': (1632, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR31_LO32': (1633, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR31_HI32': (1634, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR32_LO32': (1635, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR32_HI32': (1636, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR33_LO32': (1637, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR33_HI32': (1638, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR34_LO32': (1639, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR34_HI32': (1640, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR35_LO32': (1641, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR35_HI32': (1642, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR36_LO32': (1643, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR36_HI32': (1644, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR37_LO32': (1645, 1, {'end_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_END_ADDR37_HI32': (1646, 1, {'end_addr_hi4': (0, 3)}), + 'regMMMC_VM_MX_L1_TLS0_INVALIDATE_STREAM_LO32': (1647, 1, {'invalidate_stream_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_INVALIDATE_STREAM_HI32': (1648, 1, {'invalidate_stream_hi6': (0, 5)}), + 'regMMMC_VM_MX_L1_TLS0_INVALIDATE_REQUEST_PENDING_LO32': (1649, 1, {'invalidate_request_pending_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_INVALIDATE_REQUEST_PENDING_HI32': (1650, 1, {'invalidate_request_pending_hi6': (0, 5)}), + 'regMMMC_VM_MX_L1_TLS0_PROTECTION_FAULT_STATUS': (1651, 1, {'protections': (0, 7), 'memory_client_id': (12, 20), 'memory_client_rw': (24, 24), 'vmid': (25, 28), 'atomic': (29, 29)}), + 'regMMMC_VM_MX_L1_TLS0_PROTECTION_FAULT_ADDR_LO32': (1652, 1, {'logical_page_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_PROTECTION_FAULT_ADDR_HI32': (1653, 1, {'logical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_SAW_CNTL': (1654, 1, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_cache_4k_swap_tag_index_lsbs': (26, 27), 'l2_cache_bigk_swap_tag_index_lsbs': (28, 30)}), + 'regMMVM_L2_SAW_CNTL2': (1655, 1, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_cache_bigk_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regMMVM_L2_SAW_CNTL3': (1656, 1, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regMMVM_L2_SAW_CNTL4': (1657, 1, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_context0_pde_request_physical': (6, 6), 'vmc_tap_context0_pde_request_shared': (7, 7), 'vmc_tap_context0_pde_request_snoop': (8, 8), 'vmc_tap_context0_pte_request_physical': (9, 9), 'vmc_tap_context0_pte_request_shared': (10, 10), 'vmc_tap_context0_pte_request_snoop': (11, 11), 'vmc_tap_context1_pde_request_physical': (12, 12), 'vmc_tap_context1_pde_request_shared': (13, 13), 'vmc_tap_context1_pde_request_snoop': (14, 14), 'vmc_tap_context1_pte_request_physical': (15, 15), 'vmc_tap_context1_pte_request_shared': (16, 16), 'vmc_tap_context1_pte_request_snoop': (17, 17), 'l2_cache_4k_lru_addr_matching': (18, 18)}), + 'regMMVM_L2_SAW_CONTEXT0_CNTL': (1658, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'range_protection_fault_enable_interrupt': (3, 3), 'range_protection_fault_enable_default': (4, 4), 'dummy_page_protection_fault_enable_interrupt': (6, 6), 'dummy_page_protection_fault_enable_default': (7, 7), 'pde0_protection_fault_enable_interrupt': (9, 9), 'pde0_protection_fault_enable_default': (10, 10), 'pde0_protection_fault_enable_save': (11, 11), 'valid_protection_fault_enable_interrupt': (12, 12), 'valid_protection_fault_enable_default': (13, 13), 'valid_protection_fault_enable_save': (14, 14), 'read_protection_fault_enable_interrupt': (15, 15), 'read_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_save': (17, 17), 'write_protection_fault_enable_interrupt': (18, 18), 'write_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_save': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'execute_protection_fault_enable_save': (23, 23), 'page_table_block_size': (24, 27), 'secure_protection_fault_enable_interrupt': (28, 28), 'secure_protection_fault_enable_default': (29, 29)}), + 'regMMVM_L2_SAW_CONTEXT0_CNTL2': (1659, 1, {'clear_protection_fault_status_addr': (0, 0), 'enable_clear_protection_fault_status_addr_when_invalidate_context': (1, 1), 'enable_interrupt_processing_for_subsequent_faults_per_context': (2, 2), 'allow_subsequent_protection_fault_status_addr_updates': (3, 3), 'wait_for_idle_when_invalidate': (4, 4)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (1660, 1, {'physical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (1661, 1, {'physical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (1662, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (1663, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (1664, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (1665, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_SAW_CONTEXTS_DISABLE': (1666, 1, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regMMVM_L2_SAW_PIPES_BUSY_LO32': (1667, 1, {'pipes_busy_lo32': (0, 31)}), + 'regMMVM_L2_SAW_PIPES_BUSY_HI32': (1668, 1, {'pipes_busy_hi32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_IOMMU_FAULT_STATUS': (1669, 1, {'more_faults': (0, 0), 'abort_status': (1, 2), 'stream_id': (3, 8)}), + 'regMMMC_VM_MX_L1_TLS0_IOMMU_FAULT_GVADDR_LO32': (1670, 1, {'logical_page_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_IOMMU_FAULT_GVADDR_HI32': (1671, 1, {'logical_page_addr_hi4': (0, 3)}), + 'regMM_ATC_L2_MISC_CG': (1741, 1, {'offdly': (6, 11), 'enable': (18, 18), 'mem_ls_enable': (19, 19)}), + 'regMMVM_L2_CNTL': (1792, 1, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regMMVM_L2_CNTL2': (1793, 1, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regMMVM_L2_CNTL3': (1794, 1, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regMMVM_L2_STATUS': (1795, 1, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regMMVM_DUMMY_PAGE_FAULT_CNTL': (1796, 1, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_LO32': (1797, 1, {'dummy_page_addr_lo32': (0, 31)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_HI32': (1798, 1, {'dummy_page_addr_hi4': (0, 3)}), + 'regMMVM_INVALIDATE_CNTL': (1799, 1, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL': (1800, 1, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL2': (1801, 1, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL3': (1802, 1, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL4': (1803, 1, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_STATUS': (1804, 1, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'prt': (29, 29)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_LO32': (1805, 1, {'logical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_HI32': (1806, 1, {'logical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (1807, 1, {'physical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (1808, 1, {'physical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (1810, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (1811, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (1812, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (1813, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (1814, 1, {'physical_page_offset_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (1815, 1, {'physical_page_offset_hi4': (0, 3)}), + 'regMMVM_L2_CNTL4': (1816, 1, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regMMVM_L2_MM_GROUP_RT_CLASSES': (1817, 1, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID': (1818, 1, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID2': (1819, 1, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_CACHE_PARITY_CNTL': (1820, 1, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regMMVM_L2_CGTT_CLK_CTRL': (1821, 1, {'on_delay': (0, 4), 'off_hysteresis': (5, 12), 'ls_assert_hysteresis': (13, 28), 'ls_disable': (30, 30), 'busy_override': (31, 31)}), + 'regMMVM_L2_CNTL5': (1822, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'mm_client_ret_fgcg_off': (16, 16), 'utcl2_atc_req_fgcg_off': (17, 17)}), + 'regMMVM_L2_GCR_CNTL': (1823, 1, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regMMVM_L2_CGTT_BUSY_CTRL': (1824, 1, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regMMVM_L2_PTE_CACHE_DUMP_CNTL': (1825, 1, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regMMVM_L2_PTE_CACHE_DUMP_READ': (1826, 1, {'data': (0, 31)}), + 'regMMVM_L2_BANK_SELECT_MASKS': (1829, 1, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regMMVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (1833, 1, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (1834, 1, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVM_CONTEXT0_CNTL': (1856, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT1_CNTL': (1857, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT2_CNTL': (1858, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT3_CNTL': (1859, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT4_CNTL': (1860, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT5_CNTL': (1861, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT6_CNTL': (1862, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT7_CNTL': (1863, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT8_CNTL': (1864, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT9_CNTL': (1865, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT10_CNTL': (1866, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT11_CNTL': (1867, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT12_CNTL': (1868, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT13_CNTL': (1869, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT14_CNTL': (1870, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT15_CNTL': (1871, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXTS_DISABLE': (1872, 1, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regMMVM_INVALIDATE_ENG0_SEM': (1873, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG1_SEM': (1874, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG2_SEM': (1875, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG3_SEM': (1876, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG4_SEM': (1877, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG5_SEM': (1878, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG6_SEM': (1879, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG7_SEM': (1880, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG8_SEM': (1881, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG9_SEM': (1882, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG10_SEM': (1883, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG11_SEM': (1884, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG12_SEM': (1885, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG13_SEM': (1886, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG14_SEM': (1887, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG15_SEM': (1888, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG16_SEM': (1889, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG17_SEM': (1890, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG0_REQ': (1891, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG1_REQ': (1892, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG2_REQ': (1893, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG3_REQ': (1894, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG4_REQ': (1895, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG5_REQ': (1896, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG6_REQ': (1897, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG7_REQ': (1898, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG8_REQ': (1899, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG9_REQ': (1900, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG10_REQ': (1901, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG11_REQ': (1902, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG12_REQ': (1903, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG13_REQ': (1904, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG14_REQ': (1905, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG15_REQ': (1906, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG16_REQ': (1907, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG17_REQ': (1908, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG0_ACK': (1909, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG1_ACK': (1910, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG2_ACK': (1911, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG3_ACK': (1912, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG4_ACK': (1913, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG5_ACK': (1914, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG6_ACK': (1915, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG7_ACK': (1916, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG8_ACK': (1917, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG9_ACK': (1918, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG10_ACK': (1919, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG11_ACK': (1920, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG12_ACK': (1921, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG13_ACK': (1922, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG14_ACK': (1923, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG15_ACK': (1924, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG16_ACK': (1925, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG17_ACK': (1926, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (1927, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (1928, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (1929, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (1930, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (1931, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (1932, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (1933, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (1934, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (1935, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (1936, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (1937, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (1938, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (1939, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (1940, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (1941, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (1942, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (1943, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (1944, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (1945, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (1946, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (1947, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (1948, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (1949, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (1950, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (1951, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (1952, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (1953, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (1954, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (1955, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (1956, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (1957, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (1958, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (1959, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (1960, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (1961, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (1962, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (1963, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (1964, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (1965, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (1966, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (1967, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (1968, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (1969, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (1970, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (1971, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (1972, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (1973, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (1974, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (1975, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (1976, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (1977, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (1978, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (1979, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (1980, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (1981, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (1982, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (1983, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (1984, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (1985, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (1986, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (1987, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (1988, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (1989, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (1990, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (1991, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (1992, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (1993, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (1994, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (1995, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (1996, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (1997, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (1998, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (1999, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (2000, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (2001, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (2002, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (2003, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (2004, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (2005, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (2006, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (2007, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (2008, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (2009, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (2010, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (2011, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (2012, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (2013, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (2014, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (2015, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (2016, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (2017, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (2018, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (2019, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (2020, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (2021, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (2022, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (2023, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (2024, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (2025, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (2026, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (2027, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (2028, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (2029, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (2030, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (2031, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (2032, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (2033, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (2034, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (2035, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (2036, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (2037, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (2038, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (2039, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (2040, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (2041, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (2042, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (2043, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (2044, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (2045, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (2046, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (2047, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (2048, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (2049, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (2050, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (2051, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (2052, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (2053, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (2054, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (2055, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (2056, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (2057, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (2058, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2059, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2060, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2061, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2062, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2063, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2064, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2065, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2066, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2067, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2068, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2069, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2070, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2071, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2072, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2073, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2074, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2075, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMMC_VM_L2_PERFCOUNTER0_CFG': (2084, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER1_CFG': (2085, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER2_CFG': (2086, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER3_CFG': (2087, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER4_CFG': (2088, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER5_CFG': (2089, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER6_CFG': (2090, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER7_CFG': (2091, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (2092, 1, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_L2_PERFCOUNTER_LO': (2104, 1, {'counter_lo': (0, 31)}), + 'regMMMC_VM_L2_PERFCOUNTER_HI': (2105, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMVM_PCIE_ATS_CNTL': (2124, 1, {'stu': (16, 20), 'atc_enable': (31, 31)}), + 'regMMMC_VM_NB_MMIOBASE': (2256, 1, {'mmiobase': (0, 31)}), + 'regMMMC_VM_NB_MMIOLIMIT': (2257, 1, {'mmiolimit': (0, 31)}), + 'regMMMC_VM_NB_PCI_CTRL': (2258, 1, {'mmioenable': (23, 23)}), + 'regMMMC_VM_NB_PCI_ARB': (2259, 1, {'vga_hole': (3, 3)}), + 'regMMMC_VM_NB_TOP_OF_DRAM_SLOT1': (2260, 1, {'top_of_dram': (23, 31)}), + 'regMMMC_VM_NB_LOWER_TOP_OF_DRAM2': (2261, 1, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regMMMC_VM_NB_UPPER_TOP_OF_DRAM2': (2262, 1, {'upper_tom2': (0, 11)}), + 'regMMMC_VM_FB_OFFSET': (2263, 1, {'fb_offset': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (2264, 1, {'physical_page_number_lsb': (0, 31)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (2265, 1, {'physical_page_number_msb': (0, 3)}), + 'regMMMC_VM_STEERING': (2266, 1, {'default_steering': (0, 1)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_START': (2269, 1, {'address': (0, 19)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_END': (2270, 1, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_START': (2271, 1, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_END': (2272, 1, {'address': (0, 19)}), + 'regMMMC_VM_APT_CNTL': (2273, 1, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_START': (2274, 1, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_END': (2275, 1, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (2276, 1, {'lock': (0, 0)}), + 'regMMMC_VM_FB_LOCATION_BASE': (2284, 1, {'fb_base': (0, 23)}), + 'regMMMC_VM_FB_LOCATION_TOP': (2285, 1, {'fb_top': (0, 23)}), + 'regMMMC_VM_AGP_TOP': (2286, 1, {'agp_top': (0, 23)}), + 'regMMMC_VM_AGP_BOT': (2287, 1, {'agp_bot': (0, 23)}), + 'regMMMC_VM_AGP_BASE': (2288, 1, {'agp_base': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR': (2289, 1, {'logical_addr': (0, 29)}), + 'regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (2290, 1, {'logical_addr': (0, 29)}), + 'regMMMC_VM_MX_L1_TLB_CNTL': (2291, 1, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 13)}), + 'regMMVM_IOMMU_CONTROL_REGISTER': (2711, 1, {'iommuen': (0, 0)}), + 'regMMVM_IOMMU_PERFORMANCE_OPTIMIZATION_CONTROL_REGISTER': (2712, 1, {'perfopten': (13, 13)}), +} +mmhub_3_0_2 = { + 'regMMMC_VM_MX_L1_TLB0_STATUS': (1414, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB1_STATUS': (1415, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB2_STATUS': (1416, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB3_STATUS': (1417, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB4_STATUS': (1418, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_TLB5_STATUS': (1419, 0, {'busy': (0, 0), 'found_parity_errors': (1, 1)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER0_CFG': (1436, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER1_CFG': (1437, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER2_CFG': (1438, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER3_CFG': (1439, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_RSLT_CNTL': (1440, 0, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_LO': (1444, 0, {'counter_lo': (0, 31)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_HI': (1445, 0, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMVM_L2_CNTL': (1664, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regMMVM_L2_CNTL2': (1665, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regMMVM_L2_CNTL3': (1666, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regMMVM_L2_STATUS': (1667, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regMMVM_DUMMY_PAGE_FAULT_CNTL': (1668, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_LO32': (1669, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_HI32': (1670, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regMMVM_INVALIDATE_CNTL': (1671, 0, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL': (1672, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL2': (1673, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL3': (1674, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL4': (1675, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_STATUS': (1676, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'prt': (29, 29)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_LO32': (1677, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_HI32': (1678, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (1679, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (1680, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (1682, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (1683, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (1684, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (1685, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (1686, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (1687, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regMMVM_L2_CNTL4': (1688, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regMMVM_L2_MM_GROUP_RT_CLASSES': (1689, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID': (1690, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID2': (1691, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_CACHE_PARITY_CNTL': (1692, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regMMVM_L2_CGTT_CLK_CTRL': (1693, 0, {'on_delay': (0, 4), 'off_hysteresis': (5, 12), 'ls_assert_hysteresis': (13, 28), 'ls_disable': (30, 30), 'busy_override': (31, 31)}), + 'regMMVM_L2_CNTL5': (1694, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'mm_client_ret_fgcg_off': (16, 16), 'utcl2_atc_req_fgcg_off': (17, 17)}), + 'regMMVM_L2_GCR_CNTL': (1695, 0, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regMMVM_L2_CGTT_BUSY_CTRL': (1696, 0, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regMMVM_L2_PTE_CACHE_DUMP_CNTL': (1697, 0, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regMMVM_L2_PTE_CACHE_DUMP_READ': (1698, 0, {'data': (0, 31)}), + 'regMMVM_L2_BANK_SELECT_MASKS': (1705, 0, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regMMVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (1709, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (1710, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVM_CONTEXT0_CNTL': (1728, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT1_CNTL': (1729, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT2_CNTL': (1730, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT3_CNTL': (1731, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT4_CNTL': (1732, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT5_CNTL': (1733, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT6_CNTL': (1734, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT7_CNTL': (1735, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT8_CNTL': (1736, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT9_CNTL': (1737, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT10_CNTL': (1738, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT11_CNTL': (1739, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT12_CNTL': (1740, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT13_CNTL': (1741, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT14_CNTL': (1742, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXT15_CNTL': (1743, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'secure_protection_fault_enable_interrupt': (23, 23), 'secure_protection_fault_enable_default': (24, 24)}), + 'regMMVM_CONTEXTS_DISABLE': (1744, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regMMVM_INVALIDATE_ENG0_SEM': (1745, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG1_SEM': (1746, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG2_SEM': (1747, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG3_SEM': (1748, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG4_SEM': (1749, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG5_SEM': (1750, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG6_SEM': (1751, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG7_SEM': (1752, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG8_SEM': (1753, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG9_SEM': (1754, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG10_SEM': (1755, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG11_SEM': (1756, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG12_SEM': (1757, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG13_SEM': (1758, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG14_SEM': (1759, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG15_SEM': (1760, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG16_SEM': (1761, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG17_SEM': (1762, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG0_REQ': (1763, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG1_REQ': (1764, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG2_REQ': (1765, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG3_REQ': (1766, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG4_REQ': (1767, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG5_REQ': (1768, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG6_REQ': (1769, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG7_REQ': (1770, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG8_REQ': (1771, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG9_REQ': (1772, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG10_REQ': (1773, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG11_REQ': (1774, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG12_REQ': (1775, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG13_REQ': (1776, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG14_REQ': (1777, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG15_REQ': (1778, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG16_REQ': (1779, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG17_REQ': (1780, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG0_ACK': (1781, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG1_ACK': (1782, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG2_ACK': (1783, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG3_ACK': (1784, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG4_ACK': (1785, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG5_ACK': (1786, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG6_ACK': (1787, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG7_ACK': (1788, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG8_ACK': (1789, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG9_ACK': (1790, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG10_ACK': (1791, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG11_ACK': (1792, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG12_ACK': (1793, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG13_ACK': (1794, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG14_ACK': (1795, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG15_ACK': (1796, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG16_ACK': (1797, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG17_ACK': (1798, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (1799, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (1800, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (1801, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (1802, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (1803, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (1804, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (1805, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (1806, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (1807, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (1808, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (1809, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (1810, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (1811, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (1812, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (1813, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (1814, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (1815, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (1816, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (1817, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (1818, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (1819, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (1820, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (1821, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (1822, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (1823, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (1824, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (1825, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (1826, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (1827, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (1828, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (1829, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (1830, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (1831, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (1832, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (1833, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (1834, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (1835, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (1836, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (1837, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (1838, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (1839, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (1840, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (1841, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (1842, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (1843, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (1844, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (1845, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (1846, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (1847, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (1848, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (1849, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (1850, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (1851, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (1852, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (1853, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (1854, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (1855, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (1856, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (1857, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (1858, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (1859, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (1860, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (1861, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (1862, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (1863, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (1864, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (1865, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (1866, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (1867, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (1868, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (1869, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (1870, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (1871, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (1872, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (1873, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (1874, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (1875, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (1876, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (1877, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (1878, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (1879, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (1880, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (1881, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (1882, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (1883, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (1884, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (1885, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (1886, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (1887, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (1888, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (1889, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (1890, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (1891, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (1892, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (1893, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (1894, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (1895, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (1896, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (1897, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (1898, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (1899, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (1900, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (1901, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (1902, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (1903, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (1904, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (1905, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (1906, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (1907, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (1908, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (1909, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (1910, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (1911, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (1912, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (1913, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (1914, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (1915, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (1916, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (1917, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (1918, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (1919, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (1920, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (1921, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (1922, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (1923, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (1924, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (1925, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (1926, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (1927, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (1928, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (1929, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (1930, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1931, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1932, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1933, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1934, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1935, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1936, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1937, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1938, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1939, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1940, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1941, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1942, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1943, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1944, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1945, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1946, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1947, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMMC_VM_L2_PERFCOUNTER0_CFG': (1956, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER1_CFG': (1957, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER2_CFG': (1958, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER3_CFG': (1959, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER4_CFG': (1960, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER5_CFG': (1961, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER6_CFG': (1962, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER7_CFG': (1963, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (1964, 0, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_L2_PERFCOUNTER_LO': (1976, 0, {'counter_lo': (0, 31)}), + 'regMMMC_VM_L2_PERFCOUNTER_HI': (1977, 0, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF0': (1996, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF1': (1997, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF2': (1998, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF3': (1999, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF4': (2000, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF5': (2001, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF6': (2002, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF7': (2003, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF8': (2004, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF9': (2005, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF10': (2006, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF11': (2007, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF12': (2008, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF13': (2009, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF14': (2010, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_SIZE_OFFSET_VF15': (2011, 0, {'vf_fb_size': (0, 15), 'vf_fb_offset': (16, 31)}), + 'regMMMC_VM_FB_OFFSET': (2135, 0, {'fb_offset': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (2136, 0, {'physical_page_number_lsb': (0, 31)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (2137, 0, {'physical_page_number_msb': (0, 3)}), + 'regMMMC_VM_STEERING': (2138, 0, {'default_steering': (0, 1)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_START': (2141, 0, {'address': (0, 19)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_END': (2142, 0, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_START': (2143, 0, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_END': (2144, 0, {'address': (0, 19)}), + 'regMMMC_VM_APT_CNTL': (2145, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_START': (2146, 0, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_END': (2147, 0, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (2148, 0, {'lock': (0, 0)}), + 'regMMMC_VM_FB_NOALLOC_CNTL': (2152, 0, {'local_fb_noalloc_nopte': (0, 0), 'remote_fb_noalloc_nopte': (1, 1), 'router_atcl2_noalloc': (2, 2), 'router_gpa_mode2_noalloc': (3, 3), 'router_gpa_mode3_noalloc': (4, 4)}), + 'regMMMC_VM_FB_LOCATION_BASE': (2156, 0, {'fb_base': (0, 23)}), + 'regMMMC_VM_FB_LOCATION_TOP': (2157, 0, {'fb_top': (0, 23)}), + 'regMMMC_VM_AGP_TOP': (2158, 0, {'agp_top': (0, 23)}), + 'regMMMC_VM_AGP_BOT': (2159, 0, {'agp_bot': (0, 23)}), + 'regMMMC_VM_AGP_BASE': (2160, 0, {'agp_base': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR': (2161, 0, {'logical_addr': (0, 29)}), + 'regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (2162, 0, {'logical_addr': (0, 29)}), + 'regMMMC_VM_MX_L1_TLB_CNTL': (2163, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 13)}), +} +mmhub_3_3_0 = { + 'regMMMC_VM_MX_L1_TLB0_STATUS': (1416, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB1_STATUS': (1417, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB2_STATUS': (1418, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB3_STATUS': (1419, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB4_STATUS': (1420, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB5_STATUS': (1421, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB6_STATUS': (1422, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_TLB7_STATUS': (1423, 1, {'busy': (0, 0), 'found_parity_errors': (1, 1), 'found_aperture_faults': (2, 2)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER0_CFG': (1436, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER1_CFG': (1437, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER2_CFG': (1438, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER3_CFG': (1439, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_RSLT_CNTL': (1440, 1, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_LO': (1444, 1, {'counter_lo': (0, 31)}), + 'regMMMC_VM_MX_L1_PERFCOUNTER_HI': (1445, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMMC_VM_MX_L1_TLS0_PROTECTION_FAULT_STATUS': (1793, 1, {'protections': (0, 7), 'memory_client_id': (12, 20), 'memory_client_rw': (24, 24), 'vmid': (25, 28), 'atomic': (29, 29)}), + 'regMMMC_VM_MX_L1_TLS0_PROTECTION_FAULT_ADDR_LO32': (1794, 1, {'logical_page_addr_lo32': (0, 31)}), + 'regMMMC_VM_MX_L1_TLS0_PROTECTION_FAULT_ADDR_HI32': (1795, 1, {'logical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_SAW_CNTL': (1796, 1, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_cache_4k_swap_tag_index_lsbs': (26, 27), 'l2_cache_bigk_swap_tag_index_lsbs': (28, 30)}), + 'regMMVM_L2_SAW_CNTL2': (1797, 1, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_cache_bigk_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regMMVM_L2_SAW_CNTL3': (1798, 1, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regMMVM_L2_SAW_CNTL4': (1799, 1, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_context0_pde_request_physical': (6, 6), 'vmc_tap_context0_pde_request_shared': (7, 7), 'vmc_tap_context0_pde_request_snoop': (8, 8), 'vmc_tap_context0_pte_request_physical': (9, 9), 'vmc_tap_context0_pte_request_shared': (10, 10), 'vmc_tap_context0_pte_request_snoop': (11, 11), 'vmc_tap_context1_pde_request_physical': (12, 12), 'vmc_tap_context1_pde_request_shared': (13, 13), 'vmc_tap_context1_pde_request_snoop': (14, 14), 'vmc_tap_context1_pte_request_physical': (15, 15), 'vmc_tap_context1_pte_request_shared': (16, 16), 'vmc_tap_context1_pte_request_snoop': (17, 17), 'l2_cache_4k_lru_addr_matching': (18, 18)}), + 'regMMVM_L2_SAW_CONTEXT0_CNTL': (1800, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'range_protection_fault_enable_interrupt': (3, 3), 'range_protection_fault_enable_default': (4, 4), 'dummy_page_protection_fault_enable_interrupt': (6, 6), 'dummy_page_protection_fault_enable_default': (7, 7), 'pde0_protection_fault_enable_interrupt': (9, 9), 'pde0_protection_fault_enable_default': (10, 10), 'pde0_protection_fault_enable_save': (11, 11), 'valid_protection_fault_enable_interrupt': (12, 12), 'valid_protection_fault_enable_default': (13, 13), 'valid_protection_fault_enable_save': (14, 14), 'read_protection_fault_enable_interrupt': (15, 15), 'read_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_save': (17, 17), 'write_protection_fault_enable_interrupt': (18, 18), 'write_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_save': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22), 'execute_protection_fault_enable_save': (23, 23), 'page_table_block_size': (24, 27)}), + 'regMMVM_L2_SAW_CONTEXT0_CNTL2': (1801, 1, {'clear_protection_fault_status_addr': (0, 0), 'enable_clear_protection_fault_status_addr_when_invalidate_context': (1, 1), 'enable_interrupt_processing_for_subsequent_faults_per_context': (2, 2), 'allow_subsequent_protection_fault_status_addr_updates': (3, 3), 'wait_for_idle_when_invalidate': (4, 4)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (1802, 1, {'physical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (1803, 1, {'physical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (1804, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (1805, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (1806, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_SAW_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (1807, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_SAW_CONTEXTS_DISABLE': (1808, 1, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regMMVM_L2_SAW_PIPES_BUSY_LO32': (1809, 1, {'pipes_busy_lo32': (0, 31)}), + 'regMMVM_L2_SAW_PIPES_BUSY_HI32': (1810, 1, {'pipes_busy_hi32': (0, 31)}), + 'regMMVM_L2_SAW_PIPES_BUSY_1_LO32': (1811, 1, {'pipes_busy_lo32': (0, 31)}), + 'regMMVM_L2_SAW_PIPES_BUSY_1_HI32': (1812, 1, {'pipes_busy_hi32': (0, 31)}), + 'regMM_ATC_L2_MISC_CG': (1997, 1, {'offdly': (6, 11), 'enable': (18, 18), 'mem_ls_enable': (19, 19)}), + 'regMMVM_L2_CNTL': (2048, 1, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regMMVM_L2_CNTL2': (2049, 1, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regMMVM_L2_CNTL3': (2050, 1, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regMMVM_L2_STATUS': (2051, 1, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regMMVM_DUMMY_PAGE_FAULT_CNTL': (2052, 1, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_LO32': (2053, 1, {'dummy_page_addr_lo32': (0, 31)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_HI32': (2054, 1, {'dummy_page_addr_hi4': (0, 3)}), + 'regMMVM_INVALIDATE_CNTL': (2055, 1, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL': (2056, 1, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL2': (2057, 1, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL3': (2058, 1, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL4': (2059, 1, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_STATUS': (2060, 1, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 28), 'prt': (29, 29), 'fed': (30, 30)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_LO32': (2061, 1, {'logical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_HI32': (2062, 1, {'logical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (2063, 1, {'physical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (2064, 1, {'physical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (2066, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (2067, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (2068, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (2069, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (2070, 1, {'physical_page_offset_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (2071, 1, {'physical_page_offset_hi4': (0, 3)}), + 'regMMVM_L2_CNTL4': (2072, 1, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regMMVM_L2_MM_GROUP_RT_CLASSES': (2073, 1, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID': (2074, 1, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID2': (2075, 1, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_CACHE_PARITY_CNTL': (2076, 1, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regMMVM_L2_CGTT_CLK_CTRL': (2077, 1, {'on_delay': (0, 4), 'off_hysteresis': (5, 12), 'ls_assert_hysteresis': (13, 25), 'min_mgls': (26, 28), 'cgls_disable': (29, 29), 'ls_disable': (30, 30), 'busy_override': (31, 31)}), + 'regMMVM_L2_CNTL5': (2078, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'mm_client_ret_fgcg_off': (16, 16), 'utcl2_atc_req_fgcg_off': (17, 17)}), + 'regMMVM_L2_GCR_CNTL': (2079, 1, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regMMVM_L2_CGTT_BUSY_CTRL': (2080, 1, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regMMVM_L2_PTE_CACHE_DUMP_CNTL': (2081, 1, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regMMVM_L2_PTE_CACHE_DUMP_READ': (2082, 1, {'data': (0, 31)}), + 'regMMVM_L2_BANK_SELECT_MASKS': (2085, 1, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regMMVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (2089, 1, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (2090, 1, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVM_CONTEXT0_CNTL': (2112, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT1_CNTL': (2113, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT2_CNTL': (2114, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT3_CNTL': (2115, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT4_CNTL': (2116, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT5_CNTL': (2117, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT6_CNTL': (2118, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT7_CNTL': (2119, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT8_CNTL': (2120, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT9_CNTL': (2121, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT10_CNTL': (2122, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT11_CNTL': (2123, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT12_CNTL': (2124, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT13_CNTL': (2125, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT14_CNTL': (2126, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXT15_CNTL': (2127, 1, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (3, 6), 'retry_permission_or_invalid_page_fault': (7, 7), 'retry_other_fault': (8, 8), 'range_protection_fault_enable_interrupt': (9, 9), 'range_protection_fault_enable_default': (10, 10), 'dummy_page_protection_fault_enable_interrupt': (11, 11), 'dummy_page_protection_fault_enable_default': (12, 12), 'pde0_protection_fault_enable_interrupt': (13, 13), 'pde0_protection_fault_enable_default': (14, 14), 'valid_protection_fault_enable_interrupt': (15, 15), 'valid_protection_fault_enable_default': (16, 16), 'read_protection_fault_enable_interrupt': (17, 17), 'read_protection_fault_enable_default': (18, 18), 'write_protection_fault_enable_interrupt': (19, 19), 'write_protection_fault_enable_default': (20, 20), 'execute_protection_fault_enable_interrupt': (21, 21), 'execute_protection_fault_enable_default': (22, 22)}), + 'regMMVM_CONTEXTS_DISABLE': (2128, 1, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regMMVM_INVALIDATE_ENG0_SEM': (2129, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG1_SEM': (2130, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG2_SEM': (2131, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG3_SEM': (2132, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG4_SEM': (2133, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG5_SEM': (2134, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG6_SEM': (2135, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG7_SEM': (2136, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG8_SEM': (2137, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG9_SEM': (2138, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG10_SEM': (2139, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG11_SEM': (2140, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG12_SEM': (2141, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG13_SEM': (2142, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG14_SEM': (2143, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG15_SEM': (2144, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG16_SEM': (2145, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG17_SEM': (2146, 1, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG0_REQ': (2147, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG1_REQ': (2148, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG2_REQ': (2149, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG3_REQ': (2150, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG4_REQ': (2151, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG5_REQ': (2152, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG6_REQ': (2153, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG7_REQ': (2154, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG8_REQ': (2155, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG9_REQ': (2156, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG10_REQ': (2157, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG11_REQ': (2158, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG12_REQ': (2159, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG13_REQ': (2160, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG14_REQ': (2161, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG15_REQ': (2162, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG16_REQ': (2163, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG17_REQ': (2164, 1, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG0_ACK': (2165, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG1_ACK': (2166, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG2_ACK': (2167, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG3_ACK': (2168, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG4_ACK': (2169, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG5_ACK': (2170, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG6_ACK': (2171, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG7_ACK': (2172, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG8_ACK': (2173, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG9_ACK': (2174, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG10_ACK': (2175, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG11_ACK': (2176, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG12_ACK': (2177, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG13_ACK': (2178, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG14_ACK': (2179, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG15_ACK': (2180, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG16_ACK': (2181, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG17_ACK': (2182, 1, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (2183, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (2184, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (2185, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (2186, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (2187, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (2188, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (2189, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (2190, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (2191, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (2192, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (2193, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (2194, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (2195, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (2196, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (2197, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (2198, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (2199, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (2200, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (2201, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (2202, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (2203, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (2204, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (2205, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (2206, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (2207, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (2208, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (2209, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (2210, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (2211, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (2212, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (2213, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (2214, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (2215, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (2216, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (2217, 1, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (2218, 1, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (2219, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (2220, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (2221, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (2222, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (2223, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (2224, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (2225, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (2226, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (2227, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (2228, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (2229, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (2230, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (2231, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (2232, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (2233, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (2234, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (2235, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (2236, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (2237, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (2238, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (2239, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (2240, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (2241, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (2242, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (2243, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (2244, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (2245, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (2246, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (2247, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (2248, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (2249, 1, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (2250, 1, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (2251, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (2252, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (2253, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (2254, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (2255, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (2256, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (2257, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (2258, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (2259, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (2260, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (2261, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (2262, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (2263, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (2264, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (2265, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (2266, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (2267, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (2268, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (2269, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (2270, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (2271, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (2272, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (2273, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (2274, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (2275, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (2276, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (2277, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (2278, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (2279, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (2280, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (2281, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (2282, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (2283, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (2284, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (2285, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (2286, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (2287, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (2288, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (2289, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (2290, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (2291, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (2292, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (2293, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (2294, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (2295, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (2296, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (2297, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (2298, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (2299, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (2300, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (2301, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (2302, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (2303, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (2304, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (2305, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (2306, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (2307, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (2308, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (2309, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (2310, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (2311, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (2312, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (2313, 1, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (2314, 1, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2315, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2316, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2317, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2318, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2319, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2320, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2321, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2322, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2323, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2324, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2325, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2326, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2327, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2328, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2329, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2330, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (2331, 1, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMMC_VM_L2_PERFCOUNTER0_CFG': (2340, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER1_CFG': (2341, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER2_CFG': (2342, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER3_CFG': (2343, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER4_CFG': (2344, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER5_CFG': (2345, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER6_CFG': (2346, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER7_CFG': (2347, 1, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (2348, 1, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_L2_PERFCOUNTER_LO': (2360, 1, {'counter_lo': (0, 31)}), + 'regMMMC_VM_L2_PERFCOUNTER_HI': (2361, 1, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMVM_PCIE_ATS_CNTL': (2380, 1, {'stu': (16, 20), 'atc_enable': (31, 31)}), + 'regMMMC_VM_NB_MMIOBASE': (2512, 1, {'mmiobase': (0, 31)}), + 'regMMMC_VM_NB_MMIOLIMIT': (2513, 1, {'mmiolimit': (0, 31)}), + 'regMMMC_VM_NB_PCI_CTRL': (2514, 1, {'mmioenable': (23, 23)}), + 'regMMMC_VM_NB_PCI_ARB': (2515, 1, {'vga_hole': (3, 3)}), + 'regMMMC_VM_NB_TOP_OF_DRAM_SLOT1': (2516, 1, {'top_of_dram': (23, 31)}), + 'regMMMC_VM_NB_LOWER_TOP_OF_DRAM2': (2517, 1, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regMMMC_VM_NB_UPPER_TOP_OF_DRAM2': (2518, 1, {'upper_tom2': (0, 11)}), + 'regMMMC_VM_FB_OFFSET': (2519, 1, {'fb_offset': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (2520, 1, {'physical_page_number_lsb': (0, 31)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (2521, 1, {'physical_page_number_msb': (0, 3)}), + 'regMMMC_VM_STEERING': (2522, 1, {'default_steering': (0, 1)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_START': (2525, 1, {'address': (0, 19)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_END': (2526, 1, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_START': (2527, 1, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_END': (2528, 1, {'address': (0, 19)}), + 'regMMMC_VM_APT_CNTL': (2529, 1, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_START': (2530, 1, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_END': (2531, 1, {'address': (0, 19)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (2532, 1, {'lock': (0, 0)}), + 'regMMMC_VM_FB_NOALLOC_CNTL': (2536, 1, {'local_fb_noalloc_nopte': (0, 0), 'remote_fb_noalloc_nopte': (1, 1), 'router_atcl2_noalloc': (2, 2), 'router_gpa_mode2_noalloc': (3, 3), 'router_gpa_mode3_noalloc': (4, 4)}), + 'regMMMC_VM_FB_LOCATION_BASE': (2540, 1, {'fb_base': (0, 23)}), + 'regMMMC_VM_FB_LOCATION_TOP': (2541, 1, {'fb_top': (0, 23)}), + 'regMMMC_VM_AGP_TOP': (2542, 1, {'agp_top': (0, 23)}), + 'regMMMC_VM_AGP_BOT': (2543, 1, {'agp_bot': (0, 23)}), + 'regMMMC_VM_AGP_BASE': (2544, 1, {'agp_base': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR': (2545, 1, {'logical_addr': (0, 29)}), + 'regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (2546, 1, {'logical_addr': (0, 29)}), + 'regMMMC_VM_MX_L1_TLB_CNTL': (2547, 1, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 13)}), + 'regMMVM_IOMMU_GPU_HOST_TRANSLATION_ENABLE': (2966, 1, {'gpu_host_translation_enable': (0, 0)}), + 'regMMVM_IOMMU_CONTROL_REGISTER': (2967, 1, {'iommuen': (0, 0)}), + 'regMMVM_IOMMU_PERFORMANCE_OPTIMIZATION_CONTROL_REGISTER': (2968, 1, {'perfopten': (13, 13)}), +} +mmhub_4_1_0 = { + 'regMMMC_VM_NB_MMIOBASE': (1216, 0, {'mmiobase': (0, 31)}), + 'regMMMC_VM_NB_MMIOLIMIT': (1217, 0, {'mmiolimit': (0, 31)}), + 'regMMMC_VM_NB_PCI_CTRL': (1218, 0, {'mmioenable': (23, 23)}), + 'regMMMC_VM_NB_PCI_ARB': (1219, 0, {'vga_hole': (3, 3)}), + 'regMMMC_VM_NB_TOP_OF_DRAM_SLOT1': (1220, 0, {'top_of_dram': (23, 31)}), + 'regMMMC_VM_NB_LOWER_TOP_OF_DRAM2': (1221, 0, {'enable': (0, 0), 'lower_tom2': (23, 31)}), + 'regMMMC_VM_NB_UPPER_TOP_OF_DRAM2': (1222, 0, {'upper_tom2': (0, 15)}), + 'regMMMC_VM_FB_OFFSET': (1223, 0, {'fb_offset': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB': (1224, 0, {'physical_page_number_lsb': (0, 31)}), + 'regMMMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB': (1225, 0, {'physical_page_number_msb': (0, 3)}), + 'regMMMC_VM_STEERING': (1226, 0, {'default_steering': (0, 1)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_START': (1228, 0, {'address': (0, 23)}), + 'regMMMC_VM_CACHEABLE_DRAM_ADDRESS_END': (1229, 0, {'address': (0, 23)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_START': (1230, 0, {'address': (0, 23)}), + 'regMMMC_VM_LOCAL_SYSMEM_ADDRESS_END': (1231, 0, {'address': (0, 23)}), + 'regMMMC_VM_APT_CNTL': (1232, 0, {'force_mtype_uc': (0, 0), 'direct_system_en': (1, 1), 'frag_apt_intxn_mode': (2, 3), 'check_is_local': (4, 4), 'cap_frag_size_2m': (5, 5), 'local_sysmem_aperture_cntl': (6, 7)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_START': (1233, 0, {'address': (0, 23)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_END': (1234, 0, {'address': (0, 23)}), + 'regMMMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL': (1235, 0, {'lock': (0, 0)}), + 'regMMVM_L2_CNTL': (1252, 0, {'enable_l2_cache': (0, 0), 'enable_l2_fragment_processing': (1, 1), 'l2_cache_pte_endian_swap_mode': (2, 3), 'l2_cache_pde_endian_swap_mode': (4, 5), 'l2_pde0_cache_tag_generation_mode': (8, 8), 'enable_l2_pte_cache_lru_update_by_write': (9, 9), 'enable_l2_pde0_cache_lru_update_by_write': (10, 10), 'enable_default_page_out_to_system_memory': (11, 11), 'l2_pde0_cache_split_mode': (12, 14), 'effective_l2_queue_size': (15, 17), 'pde_fault_classification': (18, 18), 'context1_identity_access_mode': (19, 20), 'identity_mode_fragment_size': (21, 25), 'l2_pte_cache_addr_mode': (26, 27)}), + 'regMMVM_L2_CNTL2': (1253, 0, {'invalidate_all_l1_tlbs': (0, 0), 'invalidate_l2_cache': (1, 1), 'disable_invalidate_per_domain': (21, 21), 'disable_bigk_cache_optimization': (22, 22), 'l2_pte_cache_vmid_mode': (23, 25), 'invalidate_cache_mode': (26, 27), 'pde_cache_effective_size': (28, 30)}), + 'regMMVM_L2_CNTL3': (1254, 0, {'bank_select': (0, 5), 'l2_cache_update_mode': (6, 7), 'l2_cache_update_wildcard_reference_value': (8, 12), 'l2_cache_bigk_fragment_size': (15, 19), 'l2_cache_bigk_associativity': (20, 20), 'l2_cache_4k_effective_size': (21, 23), 'l2_cache_bigk_effective_size': (24, 27), 'l2_cache_4k_force_miss': (28, 28), 'l2_cache_bigk_force_miss': (29, 29), 'pde_cache_force_miss': (30, 30), 'l2_cache_4k_associativity': (31, 31)}), + 'regMMVM_L2_STATUS': (1255, 0, {'l2_busy': (0, 0), 'context_domain_busy': (1, 16), 'found_4k_pte_cache_parity_errors': (17, 17), 'found_bigk_pte_cache_parity_errors': (18, 18), 'found_pde0_cache_parity_errors': (19, 19), 'found_pde1_cache_parity_errors': (20, 20), 'found_pde2_cache_parity_errors': (21, 21)}), + 'regMMVM_DUMMY_PAGE_FAULT_CNTL': (1256, 0, {'dummy_page_fault_enable': (0, 0), 'dummy_page_address_logical': (1, 1), 'dummy_page_compare_msbs': (2, 7)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_LO32': (1257, 0, {'dummy_page_addr_lo32': (0, 31)}), + 'regMMVM_DUMMY_PAGE_FAULT_ADDR_HI32': (1258, 0, {'dummy_page_addr_hi4': (0, 3)}), + 'regMMVM_INVALIDATE_CNTL': (1259, 0, {'pri_reg_alternating': (0, 7), 'max_reg_outstanding': (8, 15)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL': (1260, 0, {'clear_protection_fault_status_addr': (0, 0), 'allow_subsequent_protection_fault_status_addr_updates': (1, 1), 'range_protection_fault_enable_default': (2, 2), 'pde0_protection_fault_enable_default': (3, 3), 'pde1_protection_fault_enable_default': (4, 4), 'pde2_protection_fault_enable_default': (5, 5), 'translate_further_protection_fault_enable_default': (6, 6), 'nack_protection_fault_enable_default': (7, 7), 'dummy_page_protection_fault_enable_default': (8, 8), 'valid_protection_fault_enable_default': (9, 9), 'read_protection_fault_enable_default': (10, 10), 'write_protection_fault_enable_default': (11, 11), 'execute_protection_fault_enable_default': (12, 12), 'client_id_no_retry_fault_interrupt': (13, 28), 'other_client_id_no_retry_fault_interrupt': (29, 29), 'crash_on_no_retry_fault': (30, 30), 'crash_on_retry_fault': (31, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_CNTL2': (1261, 0, {'client_id_prt_fault_interrupt': (0, 15), 'other_client_id_prt_fault_interrupt': (16, 16), 'active_page_migration_pte': (17, 17), 'active_page_migration_pte_read_retry': (18, 18), 'enable_retry_fault_interrupt': (19, 19)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL3': (1262, 0, {'vml1_read_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_MM_CNTL4': (1263, 0, {'vml1_write_client_id_no_retry_fault_interrupt': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_STATUS_LO32': (1264, 0, {'more_faults': (0, 0), 'walker_error': (1, 3), 'permission_faults': (4, 7), 'mapping_error': (8, 8), 'cid': (9, 17), 'rw': (18, 18), 'atomic': (19, 19), 'vmid': (20, 23), 'vf': (24, 24), 'vfid': (25, 29), 'prt': (30, 30), 'uce': (31, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_STATUS_HI32': (1265, 0, {'fed': (0, 0)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_LO32': (1266, 0, {'logical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_ADDR_HI32': (1267, 0, {'logical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32': (1268, 0, {'physical_page_addr_lo32': (0, 31)}), + 'regMMVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32': (1269, 0, {'physical_page_addr_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32': (1271, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32': (1272, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32': (1273, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32': (1274, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32': (1275, 0, {'physical_page_offset_lo32': (0, 31)}), + 'regMMVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32': (1276, 0, {'physical_page_offset_hi4': (0, 3)}), + 'regMMVM_L2_CNTL4': (1277, 0, {'l2_cache_4k_partition_count': (0, 5), 'vmc_tap_pde_request_physical': (6, 6), 'vmc_tap_pte_request_physical': (7, 7), 'mm_nonrt_ififo_active_transaction_limit': (8, 17), 'mm_softrt_ififo_active_transaction_limit': (18, 27), 'bpm_cgcgls_override': (28, 28), 'gc_ch_fgcg_off': (29, 29), 'vfifo_head_of_queue': (30, 30), 'vfifo_visible_bank_silos': (31, 31)}), + 'regMMVM_L2_MM_GROUP_RT_CLASSES': (1278, 0, {'group_0_rt_class': (0, 0), 'group_1_rt_class': (1, 1), 'group_2_rt_class': (2, 2), 'group_3_rt_class': (3, 3), 'group_4_rt_class': (4, 4), 'group_5_rt_class': (5, 5), 'group_6_rt_class': (6, 6), 'group_7_rt_class': (7, 7), 'group_8_rt_class': (8, 8), 'group_9_rt_class': (9, 9), 'group_10_rt_class': (10, 10), 'group_11_rt_class': (11, 11), 'group_12_rt_class': (12, 12), 'group_13_rt_class': (13, 13), 'group_14_rt_class': (14, 14), 'group_15_rt_class': (15, 15), 'group_16_rt_class': (16, 16), 'group_17_rt_class': (17, 17), 'group_18_rt_class': (18, 18), 'group_19_rt_class': (19, 19), 'group_20_rt_class': (20, 20), 'group_21_rt_class': (21, 21), 'group_22_rt_class': (22, 22), 'group_23_rt_class': (23, 23), 'group_24_rt_class': (24, 24), 'group_25_rt_class': (25, 25), 'group_26_rt_class': (26, 26), 'group_27_rt_class': (27, 27), 'group_28_rt_class': (28, 28), 'group_29_rt_class': (29, 29), 'group_30_rt_class': (30, 30), 'group_31_rt_class': (31, 31)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID': (1279, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_BANK_SELECT_RESERVED_CID2': (1280, 0, {'reserved_read_client_id': (0, 8), 'reserved_write_client_id': (10, 18), 'enable': (20, 20), 'reserved_cache_invalidation_mode': (24, 24), 'reserved_cache_private_invalidation': (25, 25), 'reserved_cache_fragment_size': (26, 30)}), + 'regMMVM_L2_CACHE_PARITY_CNTL': (1281, 0, {'enable_parity_checks_in_4k_pte_caches': (0, 0), 'enable_parity_checks_in_bigk_pte_caches': (1, 1), 'enable_parity_checks_in_pde_caches': (2, 2), 'force_parity_mismatch_in_4k_pte_cache': (3, 3), 'force_parity_mismatch_in_bigk_pte_cache': (4, 4), 'force_parity_mismatch_in_pde_cache': (5, 5), 'force_cache_bank': (6, 8), 'force_cache_number': (9, 11), 'force_cache_assoc': (12, 15)}), + 'regMMVM_L2_CGTT_CLK_CTRL': (1282, 0, {'on_delay': (0, 4), 'off_hysteresis': (5, 12), 'ls_assert_hysteresis': (13, 25), 'min_mgls': (26, 28), 'cgls_disable': (29, 29), 'ls_disable': (30, 30), 'busy_override': (31, 31)}), + 'regMMVM_L2_CNTL5': (1283, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'walker_priority_client_id': (5, 13), 'walker_fetch_pde_noalloc_enable': (14, 14), 'walker_fetch_pde_mtype_enable': (15, 15), 'mm_client_ret_fgcg_off': (16, 16), 'utcl2_atc_req_fgcg_off': (17, 17)}), + 'regMMVM_L2_GCR_CNTL': (1284, 0, {'gcr_enable': (0, 0), 'gcr_client_id': (1, 9)}), + 'regMMVM_L2_CGTT_BUSY_CTRL': (1285, 0, {'read_delay': (0, 4), 'always_busy': (5, 5)}), + 'regMMVM_L2_PTE_CACHE_DUMP_CNTL': (1286, 0, {'enable': (0, 0), 'ready': (1, 1), 'bank': (4, 7), 'cache': (8, 11), 'assoc': (12, 15), 'index': (16, 31)}), + 'regMMVM_L2_PTE_CACHE_DUMP_READ': (1287, 0, {'data': (0, 31)}), + 'regMMVM_L2_BANK_SELECT_MASKS': (1296, 0, {'mask0': (0, 3), 'mask1': (4, 7), 'mask2': (8, 11), 'mask3': (12, 15)}), + 'regMMVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT': (1300, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ': (1301, 0, {'credits': (0, 9), 'update': (10, 10)}), + 'regMMMC_VM_L2_PERFCOUNTER_LO': (1332, 0, {'counter_lo': (0, 31)}), + 'regMMMC_VM_L2_PERFCOUNTER_HI': (1333, 0, {'counter_hi': (0, 15), 'compare_value': (16, 31)}), + 'regMMMC_VM_L2_PERFCOUNTER0_CFG': (1348, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER1_CFG': (1349, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER2_CFG': (1350, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER3_CFG': (1351, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER4_CFG': (1352, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER5_CFG': (1353, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER6_CFG': (1354, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER7_CFG': (1355, 0, {'perf_sel': (0, 7), 'perf_sel_end': (8, 15), 'perf_mode': (24, 27), 'enable': (28, 28), 'clear': (29, 29)}), + 'regMMMC_VM_L2_PERFCOUNTER_RSLT_CNTL': (1356, 0, {'perf_counter_select': (0, 3), 'start_trigger': (8, 15), 'stop_trigger': (16, 23), 'enable_any': (24, 24), 'clear_all': (25, 25), 'stop_all_on_saturate': (26, 26)}), + 'regMMMC_VM_FB_LOCATION_BASE': (1364, 0, {'fb_base': (0, 23)}), + 'regMMMC_VM_FB_LOCATION_TOP': (1365, 0, {'fb_top': (0, 23)}), + 'regMMMC_VM_AGP_TOP': (1366, 0, {'agp_top': (0, 23)}), + 'regMMMC_VM_AGP_BOT': (1367, 0, {'agp_bot': (0, 23)}), + 'regMMMC_VM_AGP_BASE': (1368, 0, {'agp_base': (0, 23)}), + 'regMMMC_VM_SYSTEM_APERTURE_LOW_ADDR': (1369, 0, {'logical_addr': (0, 29)}), + 'regMMMC_VM_SYSTEM_APERTURE_HIGH_ADDR': (1370, 0, {'logical_addr': (0, 29)}), + 'regMMMC_VM_MX_L1_TLB_CNTL': (1371, 0, {'enable_l1_tlb': (0, 0), 'system_access_mode': (3, 4), 'system_aperture_unmapped_access': (5, 5), 'enable_advanced_driver_model': (6, 6), 'eco_bits': (7, 10), 'mtype': (11, 12)}), + 'regMMVM_CONTEXT0_CNTL': (1380, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT1_CNTL': (1381, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT2_CNTL': (1382, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT3_CNTL': (1383, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT4_CNTL': (1384, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT5_CNTL': (1385, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT6_CNTL': (1386, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT7_CNTL': (1387, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT8_CNTL': (1388, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT9_CNTL': (1389, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT10_CNTL': (1390, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT11_CNTL': (1391, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT12_CNTL': (1392, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT13_CNTL': (1393, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT14_CNTL': (1394, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXT15_CNTL': (1395, 0, {'enable_context': (0, 0), 'page_table_depth': (1, 2), 'page_table_block_size': (4, 7), 'retry_permission_or_invalid_page_fault': (8, 8), 'retry_other_fault': (9, 9), 'range_protection_fault_enable_interrupt': (10, 10), 'range_protection_fault_enable_default': (11, 11), 'dummy_page_protection_fault_enable_interrupt': (12, 12), 'dummy_page_protection_fault_enable_default': (13, 13), 'pde0_protection_fault_enable_interrupt': (14, 14), 'pde0_protection_fault_enable_default': (15, 15), 'valid_protection_fault_enable_interrupt': (16, 16), 'valid_protection_fault_enable_default': (17, 17), 'read_protection_fault_enable_interrupt': (18, 18), 'read_protection_fault_enable_default': (19, 19), 'write_protection_fault_enable_interrupt': (20, 20), 'write_protection_fault_enable_default': (21, 21), 'execute_protection_fault_enable_interrupt': (22, 22), 'execute_protection_fault_enable_default': (23, 23), 'secure_protection_fault_enable_interrupt': (24, 24), 'secure_protection_fault_enable_default': (25, 25)}), + 'regMMVM_CONTEXTS_DISABLE': (1396, 0, {'disable_context_0': (0, 0), 'disable_context_1': (1, 1), 'disable_context_2': (2, 2), 'disable_context_3': (3, 3), 'disable_context_4': (4, 4), 'disable_context_5': (5, 5), 'disable_context_6': (6, 6), 'disable_context_7': (7, 7), 'disable_context_8': (8, 8), 'disable_context_9': (9, 9), 'disable_context_10': (10, 10), 'disable_context_11': (11, 11), 'disable_context_12': (12, 12), 'disable_context_13': (13, 13), 'disable_context_14': (14, 14), 'disable_context_15': (15, 15)}), + 'regMMVM_INVALIDATE_ENG0_SEM': (1397, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG1_SEM': (1398, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG2_SEM': (1399, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG3_SEM': (1400, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG4_SEM': (1401, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG5_SEM': (1402, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG6_SEM': (1403, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG7_SEM': (1404, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG8_SEM': (1405, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG9_SEM': (1406, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG10_SEM': (1407, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG11_SEM': (1408, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG12_SEM': (1409, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG13_SEM': (1410, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG14_SEM': (1411, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG15_SEM': (1412, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG16_SEM': (1413, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG17_SEM': (1414, 0, {'semaphore': (0, 0)}), + 'regMMVM_INVALIDATE_ENG0_REQ': (1415, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG1_REQ': (1416, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG2_REQ': (1417, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG3_REQ': (1418, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG4_REQ': (1419, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG5_REQ': (1420, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG6_REQ': (1421, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG7_REQ': (1422, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG8_REQ': (1423, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG9_REQ': (1424, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG10_REQ': (1425, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG11_REQ': (1426, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG12_REQ': (1427, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG13_REQ': (1428, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG14_REQ': (1429, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG15_REQ': (1430, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG16_REQ': (1431, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG17_REQ': (1432, 0, {'per_vmid_invalidate_req': (0, 15), 'flush_type': (16, 18), 'invalidate_l2_ptes': (19, 19), 'invalidate_l2_pde0': (20, 20), 'invalidate_l2_pde1': (21, 21), 'invalidate_l2_pde2': (22, 22), 'invalidate_l1_ptes': (23, 23), 'clear_protection_fault_status_addr': (24, 24), 'log_request': (25, 25), 'invalidate_4k_pages_only': (26, 26)}), + 'regMMVM_INVALIDATE_ENG0_ACK': (1433, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG1_ACK': (1434, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG2_ACK': (1435, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG3_ACK': (1436, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG4_ACK': (1437, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG5_ACK': (1438, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG6_ACK': (1439, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG7_ACK': (1440, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG8_ACK': (1441, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG9_ACK': (1442, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG10_ACK': (1443, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG11_ACK': (1444, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG12_ACK': (1445, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG13_ACK': (1446, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG14_ACK': (1447, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG15_ACK': (1448, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG16_ACK': (1449, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG17_ACK': (1450, 0, {'per_vmid_invalidate_ack': (0, 15), 'semaphore': (16, 16)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32': (1451, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32': (1452, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_LO32': (1453, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG1_ADDR_RANGE_HI32': (1454, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_LO32': (1455, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG2_ADDR_RANGE_HI32': (1456, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_LO32': (1457, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG3_ADDR_RANGE_HI32': (1458, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_LO32': (1459, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG4_ADDR_RANGE_HI32': (1460, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_LO32': (1461, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG5_ADDR_RANGE_HI32': (1462, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_LO32': (1463, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG6_ADDR_RANGE_HI32': (1464, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_LO32': (1465, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG7_ADDR_RANGE_HI32': (1466, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_LO32': (1467, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG8_ADDR_RANGE_HI32': (1468, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_LO32': (1469, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG9_ADDR_RANGE_HI32': (1470, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_LO32': (1471, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG10_ADDR_RANGE_HI32': (1472, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_LO32': (1473, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG11_ADDR_RANGE_HI32': (1474, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_LO32': (1475, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG12_ADDR_RANGE_HI32': (1476, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_LO32': (1477, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG13_ADDR_RANGE_HI32': (1478, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_LO32': (1479, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG14_ADDR_RANGE_HI32': (1480, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_LO32': (1481, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG15_ADDR_RANGE_HI32': (1482, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_LO32': (1483, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG16_ADDR_RANGE_HI32': (1484, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_LO32': (1485, 0, {'s_bit': (0, 0), 'logi_page_addr_range_lo31': (1, 31)}), + 'regMMVM_INVALIDATE_ENG17_ADDR_RANGE_HI32': (1486, 0, {'logi_page_addr_range_hi5': (0, 4)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32': (1487, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32': (1488, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32': (1489, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32': (1490, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32': (1491, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32': (1492, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32': (1493, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32': (1494, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32': (1495, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32': (1496, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32': (1497, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32': (1498, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32': (1499, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32': (1500, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32': (1501, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32': (1502, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32': (1503, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32': (1504, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32': (1505, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32': (1506, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32': (1507, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32': (1508, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32': (1509, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32': (1510, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32': (1511, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32': (1512, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32': (1513, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32': (1514, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32': (1515, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32': (1516, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32': (1517, 0, {'page_directory_entry_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32': (1518, 0, {'page_directory_entry_hi32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32': (1519, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32': (1520, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32': (1521, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32': (1522, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32': (1523, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32': (1524, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32': (1525, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32': (1526, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32': (1527, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32': (1528, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32': (1529, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32': (1530, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32': (1531, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32': (1532, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32': (1533, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32': (1534, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32': (1535, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32': (1536, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32': (1537, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32': (1538, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32': (1539, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32': (1540, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32': (1541, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32': (1542, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32': (1543, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32': (1544, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32': (1545, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32': (1546, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32': (1547, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32': (1548, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32': (1549, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32': (1550, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32': (1551, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32': (1552, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32': (1553, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32': (1554, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32': (1555, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32': (1556, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32': (1557, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32': (1558, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32': (1559, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32': (1560, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32': (1561, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32': (1562, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32': (1563, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32': (1564, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32': (1565, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32': (1566, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32': (1567, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32': (1568, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32': (1569, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32': (1570, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32': (1571, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32': (1572, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32': (1573, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32': (1574, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32': (1575, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32': (1576, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32': (1577, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32': (1578, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32': (1579, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32': (1580, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32': (1581, 0, {'logical_page_number_lo32': (0, 31)}), + 'regMMVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32': (1582, 0, {'logical_page_number_hi4': (0, 3)}), + 'regMMVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1583, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1584, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1585, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1586, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1587, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1588, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1589, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1590, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1591, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1592, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1593, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1594, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1595, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1596, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1597, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1598, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES': (1599, 0, {'l2_cache_smallk_fragment_size': (0, 4), 'l2_cache_bigk_fragment_size': (5, 9), 'bank_select': (10, 15)}), + 'regMMVM_IOMMU_GPU_HOST_TRANSLATION_ENABLE': (1734, 0, {'gpu_host_translation_enable': (0, 0)}), + 'regMMVM_IOMMU_CONTROL_REGISTER': (1736, 0, {'iommuen': (0, 0)}), + 'regMMVM_IOMMU_PERFORMANCE_OPTIMIZATION_CONTROL_REGISTER': (1737, 0, {'perfopten': (13, 13)}), +} +nbio_4_3_0 = { + 'regBIF_BX0_PCIE_INDEX2': (14, 0, {'pcie_index2': (0, 31)}), + 'regBIF_BX0_PCIE_DATA2': (15, 0, {'pcie_data2': (0, 31)}), + 'regBIF_BX0_PCIE_INDEX2_HI': (17, 0, {'pcie_index2_hi': (0, 7)}), + 'regBIF_BX_PF0_RSMU_INDEX': (0, 1, {}), + 'regBIF_BX_PF0_RSMU_DATA': (1, 1, {}), + 'regBIF_BX_PF0_RSMU_INDEX_HI': (2, 1, {}), + 'regBIF_BX0_BIF_DOORBELL_INT_CNTL': (254, 2, {'doorbell_interrupt_status': (0, 0), 'ras_cntlr_interrupt_status': (1, 1), 'ras_athub_err_event_interrupt_status': (2, 2), 'doorbell_interrupt_clear': (16, 16), 'ras_cntlr_interrupt_clear': (17, 17), 'ras_athub_err_event_interrupt_clear': (18, 18), 'ras_cntlr_err_event_interrupt_enable': (23, 23), 'doorbell_interrupt_disable': (24, 24), 'ras_cntlr_interrupt_disable': (25, 25), 'ras_athub_err_event_interrupt_disable': (26, 26), 'set_db_intr_status_when_rb_enable': (28, 28), 'set_ioh_ras_intr_status_when_rb_enable': (29, 29), 'set_ath_ras_intr_status_when_rb_enable': (30, 30), 'timeout_err_event_interrupt_enable': (31, 31)}), + 'regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL': (301, 2, {'address': (2, 18)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_REQ': (262, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_DONE': (263, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regRCC_DEV0_EPF0_RCC_DOORBELL_APER_EN': (192, 2, {'bif_doorbell_aper_en': (0, 0)}), + 'regRCC_DEV0_EPF2_STRAP2': (53506, 5, {'strap_no_soft_reset_dev0_f2': (7, 7), 'strap_resize_bar_en_dev0_f2': (8, 8), 'strap_max_pasid_width_dev0_f2': (9, 13), 'strap_msi_pervector_mask_cap_dev0_f2': (14, 14), 'strap_aer_en_dev0_f2': (16, 16), 'strap_acs_en_dev0_f2': (17, 17), 'strap_cpl_abort_err_en_dev0_f2': (20, 20), 'strap_dpa_en_dev0_f2': (21, 21), 'strap_vc_en_dev0_f2': (23, 23), 'strap_msi_multi_cap_dev0_f2': (24, 26), 'strap_pasid_en_dev0_f2': (28, 28), 'strap_pasid_exe_permission_supported_dev0_f2': (29, 29), 'strap_pasid_global_invalidate_supported_dev0_f2': (30, 30), 'strap_pasid_priv_mode_supported_dev0_f2': (31, 31)}), + 'regRCC_DEV0_EPF2_STRAP20': (53524, 5, {}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_REQ': (36390, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_DONE': (36391, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regS2A_DOORBELL_ENTRY_0_CTRL': (5207616, 3, {'s2a_doorbell_port0_enable': (0, 0), 's2a_doorbell_port0_awid': (1, 5), 's2a_doorbell_port0_fence_enable': (6, 6), 's2a_doorbell_port0_range_offset': (7, 16), 's2a_doorbell_port0_range_size': (17, 24), 's2a_doorbell_port0_64bit_support_dis': (25, 25), 's2a_doorbell_port0_need_deduct_range_offset': (26, 26), 's2a_doorbell_port0_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_1_CTRL': (5207617, 3, {'s2a_doorbell_port1_enable': (0, 0), 's2a_doorbell_port1_awid': (1, 5), 's2a_doorbell_port1_fence_enable': (6, 6), 's2a_doorbell_port1_range_offset': (7, 16), 's2a_doorbell_port1_range_size': (17, 24), 's2a_doorbell_port1_64bit_support_dis': (25, 25), 's2a_doorbell_port1_need_deduct_range_offset': (26, 26), 's2a_doorbell_port1_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_2_CTRL': (5207618, 3, {'s2a_doorbell_port2_enable': (0, 0), 's2a_doorbell_port2_awid': (1, 5), 's2a_doorbell_port2_fence_enable': (6, 6), 's2a_doorbell_port2_range_offset': (7, 16), 's2a_doorbell_port2_range_size': (17, 24), 's2a_doorbell_port2_64bit_support_dis': (25, 25), 's2a_doorbell_port2_need_deduct_range_offset': (26, 26), 's2a_doorbell_port2_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_3_CTRL': (5207619, 3, {'s2a_doorbell_port3_enable': (0, 0), 's2a_doorbell_port3_awid': (1, 5), 's2a_doorbell_port3_fence_enable': (6, 6), 's2a_doorbell_port3_range_offset': (7, 16), 's2a_doorbell_port3_range_size': (17, 24), 's2a_doorbell_port3_64bit_support_dis': (25, 25), 's2a_doorbell_port3_need_deduct_range_offset': (26, 26), 's2a_doorbell_port3_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_4_CTRL': (5207620, 3, {'s2a_doorbell_port4_enable': (0, 0), 's2a_doorbell_port4_awid': (1, 5), 's2a_doorbell_port4_fence_enable': (6, 6), 's2a_doorbell_port4_range_offset': (7, 16), 's2a_doorbell_port4_range_size': (17, 24), 's2a_doorbell_port4_64bit_support_dis': (25, 25), 's2a_doorbell_port4_need_deduct_range_offset': (26, 26), 's2a_doorbell_port4_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_5_CTRL': (5207621, 3, {'s2a_doorbell_port5_enable': (0, 0), 's2a_doorbell_port5_awid': (1, 5), 's2a_doorbell_port5_fence_enable': (6, 6), 's2a_doorbell_port5_range_offset': (7, 16), 's2a_doorbell_port5_range_size': (17, 24), 's2a_doorbell_port5_64bit_support_dis': (25, 25), 's2a_doorbell_port5_need_deduct_range_offset': (26, 26), 's2a_doorbell_port5_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_6_CTRL': (5207622, 3, {'s2a_doorbell_port6_enable': (0, 0), 's2a_doorbell_port6_awid': (1, 5), 's2a_doorbell_port6_fence_enable': (6, 6), 's2a_doorbell_port6_range_offset': (7, 16), 's2a_doorbell_port6_range_size': (17, 24), 's2a_doorbell_port6_64bit_support_dis': (25, 25), 's2a_doorbell_port6_need_deduct_range_offset': (26, 26), 's2a_doorbell_port6_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_7_CTRL': (5207623, 3, {'s2a_doorbell_port7_enable': (0, 0), 's2a_doorbell_port7_awid': (1, 5), 's2a_doorbell_port7_fence_enable': (6, 6), 's2a_doorbell_port7_range_offset': (7, 16), 's2a_doorbell_port7_range_size': (17, 24), 's2a_doorbell_port7_64bit_support_dis': (25, 25), 's2a_doorbell_port7_need_deduct_range_offset': (26, 26), 's2a_doorbell_port7_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_8_CTRL': (5207624, 3, {'s2a_doorbell_port8_enable': (0, 0), 's2a_doorbell_port8_awid': (1, 5), 's2a_doorbell_port8_fence_enable': (6, 6), 's2a_doorbell_port8_range_offset': (7, 16), 's2a_doorbell_port8_range_size': (17, 24), 's2a_doorbell_port8_64bit_support_dis': (25, 25), 's2a_doorbell_port8_need_deduct_range_offset': (26, 26), 's2a_doorbell_port8_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_9_CTRL': (5207625, 3, {'s2a_doorbell_port9_enable': (0, 0), 's2a_doorbell_port9_awid': (1, 5), 's2a_doorbell_port9_fence_enable': (6, 6), 's2a_doorbell_port9_range_offset': (7, 16), 's2a_doorbell_port9_range_size': (17, 24), 's2a_doorbell_port9_64bit_support_dis': (25, 25), 's2a_doorbell_port9_need_deduct_range_offset': (26, 26), 's2a_doorbell_port9_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_10_CTRL': (5207626, 3, {'s2a_doorbell_port10_enable': (0, 0), 's2a_doorbell_port10_awid': (1, 5), 's2a_doorbell_port10_fence_enable': (6, 6), 's2a_doorbell_port10_range_offset': (7, 16), 's2a_doorbell_port10_range_size': (17, 24), 's2a_doorbell_port10_64bit_support_dis': (25, 25), 's2a_doorbell_port10_need_deduct_range_offset': (26, 26), 's2a_doorbell_port10_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_11_CTRL': (5207627, 3, {'s2a_doorbell_port11_enable': (0, 0), 's2a_doorbell_port11_awid': (1, 5), 's2a_doorbell_port11_fence_enable': (6, 6), 's2a_doorbell_port11_range_offset': (7, 16), 's2a_doorbell_port11_range_size': (17, 24), 's2a_doorbell_port11_64bit_support_dis': (25, 25), 's2a_doorbell_port11_need_deduct_range_offset': (26, 26), 's2a_doorbell_port11_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_12_CTRL': (5207628, 3, {'s2a_doorbell_port12_enable': (0, 0), 's2a_doorbell_port12_awid': (1, 5), 's2a_doorbell_port12_fence_enable': (6, 6), 's2a_doorbell_port12_range_offset': (7, 16), 's2a_doorbell_port12_range_size': (17, 24), 's2a_doorbell_port12_64bit_support_dis': (25, 25), 's2a_doorbell_port12_need_deduct_range_offset': (26, 26), 's2a_doorbell_port12_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_13_CTRL': (5207629, 3, {'s2a_doorbell_port13_enable': (0, 0), 's2a_doorbell_port13_awid': (1, 5), 's2a_doorbell_port13_fence_enable': (6, 6), 's2a_doorbell_port13_range_offset': (7, 16), 's2a_doorbell_port13_range_size': (17, 24), 's2a_doorbell_port13_64bit_support_dis': (25, 25), 's2a_doorbell_port13_need_deduct_range_offset': (26, 26), 's2a_doorbell_port13_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_14_CTRL': (5207630, 3, {'s2a_doorbell_port14_enable': (0, 0), 's2a_doorbell_port14_awid': (1, 5), 's2a_doorbell_port14_fence_enable': (6, 6), 's2a_doorbell_port14_range_offset': (7, 16), 's2a_doorbell_port14_range_size': (17, 24), 's2a_doorbell_port14_64bit_support_dis': (25, 25), 's2a_doorbell_port14_need_deduct_range_offset': (26, 26), 's2a_doorbell_port14_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_15_CTRL': (5207631, 3, {'s2a_doorbell_port15_enable': (0, 0), 's2a_doorbell_port15_awid': (1, 5), 's2a_doorbell_port15_fence_enable': (6, 6), 's2a_doorbell_port15_range_offset': (7, 16), 's2a_doorbell_port15_range_size': (17, 24), 's2a_doorbell_port15_64bit_support_dis': (25, 25), 's2a_doorbell_port15_need_deduct_range_offset': (26, 26), 's2a_doorbell_port15_awaddr_31_28_value': (28, 31)}), +} +nbio_7_2_0 = { + 'regBIF_BX_PF0_RSMU_INDEX': (0, 1, {'rsmu_index': (0, 31)}), + 'regBIF_BX_PF0_RSMU_DATA': (1, 1, {'rsmu_data': (0, 31)}), + 'regBIF_BX0_PCIE_INDEX2': (14, 0, {'pcie_index2': (0, 31)}), + 'regBIF_BX0_PCIE_DATA2': (15, 0, {'pcie_data2': (0, 31)}), + 'regBIF_BX0_BIF_DOORBELL_INT_CNTL': (253, 2, {'doorbell_interrupt_status': (0, 0), 'ras_cntlr_interrupt_status': (1, 1), 'ras_athub_err_event_interrupt_status': (2, 2), 'doorbell_interrupt_clear': (16, 16), 'ras_cntlr_interrupt_clear': (17, 17), 'ras_athub_err_event_interrupt_clear': (18, 18), 'doorbell_interrupt_disable': (24, 24), 'ras_cntlr_interrupt_disable': (25, 25), 'ras_athub_err_event_interrupt_disable': (26, 26), 'set_db_intr_status_when_rb_enable': (28, 28), 'set_ioh_ras_intr_status_when_rb_enable': (29, 29), 'set_ath_ras_intr_status_when_rb_enable': (30, 30)}), + 'regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL': (301, 2, {'address': (2, 18)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_ONLY_REQ': (260, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_REQ': (262, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_DONE': (263, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_ONLY_REQ': (36388, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_REQ': (36390, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_DONE': (36391, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regRCC_DEV0_EPF2_STRAP2': (53506, 5, {'strap_no_soft_reset_dev0_f2': (7, 7), 'strap_resize_bar_en_dev0_f2': (8, 8), 'strap_max_pasid_width_dev0_f2': (9, 13), 'strap_msi_pervector_mask_cap_dev0_f2': (14, 14), 'strap_aer_en_dev0_f2': (16, 16), 'strap_acs_en_dev0_f2': (17, 17), 'strap_cpl_abort_err_en_dev0_f2': (20, 20), 'strap_dpa_en_dev0_f2': (21, 21), 'strap_vc_en_dev0_f2': (23, 23), 'strap_msi_multi_cap_dev0_f2': (24, 26), 'strap_pasid_en_dev0_f2': (28, 28), 'strap_pasid_exe_permission_supported_dev0_f2': (29, 29), 'strap_pasid_global_invalidate_supported_dev0_f2': (30, 30), 'strap_pasid_priv_mode_supported_dev0_f2': (31, 31)}), +} +nbio_7_7_0 = { + 'regBIF_BX_PF0_RSMU_INDEX': (0, 1, {'rsmu_index': (0, 31)}), + 'regBIF_BX_PF0_RSMU_DATA': (1, 1, {'rsmu_data': (0, 31)}), + 'regBIF_BX0_PCIE_INDEX2': (14, 0, {'pcie_index2': (0, 31)}), + 'regBIF_BX0_PCIE_DATA2': (15, 0, {'pcie_data2': (0, 31)}), + 'regBIF_BX0_BIF_DOORBELL_INT_CNTL': (254, 2, {'doorbell_interrupt_status': (0, 0), 'ras_cntlr_interrupt_status': (1, 1), 'ras_athub_err_event_interrupt_status': (2, 2), 'doorbell_interrupt_clear': (16, 16), 'ras_cntlr_interrupt_clear': (17, 17), 'ras_athub_err_event_interrupt_clear': (18, 18), 'doorbell_interrupt_disable': (24, 24), 'ras_cntlr_interrupt_disable': (25, 25), 'ras_athub_err_event_interrupt_disable': (26, 26), 'set_db_intr_status_when_rb_enable': (28, 28), 'set_ioh_ras_intr_status_when_rb_enable': (29, 29), 'set_ath_ras_intr_status_when_rb_enable': (30, 30), 'timeout_err_event_interrupt_enable': (31, 31)}), + 'regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL': (301, 2, {'address': (2, 18)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_ONLY_REQ': (260, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_REQ': (262, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_DONE': (263, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_ONLY_REQ': (36388, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_REQ': (36390, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_DONE': (36391, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regRCC_DEV0_EPF2_STRAP2': (53506, 5, {'strap_no_soft_reset_dev0_f2': (7, 7), 'strap_resize_bar_en_dev0_f2': (8, 8), 'strap_max_pasid_width_dev0_f2': (9, 13), 'strap_msi_pervector_mask_cap_dev0_f2': (14, 14), 'strap_aer_en_dev0_f2': (16, 16), 'strap_acs_en_dev0_f2': (17, 17), 'strap_cpl_abort_err_en_dev0_f2': (20, 20), 'strap_dpa_en_dev0_f2': (21, 21), 'strap_vc_en_dev0_f2': (23, 23), 'strap_msi_multi_cap_dev0_f2': (24, 26), 'strap_pasid_en_dev0_f2': (28, 28), 'strap_pasid_exe_permission_supported_dev0_f2': (29, 29), 'strap_pasid_global_invalidate_supported_dev0_f2': (30, 30), 'strap_pasid_priv_mode_supported_dev0_f2': (31, 31)}), +} +nbio_7_9_0 = { + 'regBIF_BX0_PCIE_INDEX2': (14, 0, {'pcie_index2': (0, 31)}), + 'regBIF_BX0_PCIE_DATA2': (15, 0, {'pcie_data2': (0, 31)}), + 'regBIF_BX0_PCIE_INDEX2_HI': (17, 0, {'pcie_index2_hi': (0, 7)}), + 'regBIF_BX_PF0_RSMU_INDEX': (0, 1, {'rsmu_index': (0, 31)}), + 'regBIF_BX_PF0_RSMU_DATA': (1, 1, {'rsmu_data': (0, 31)}), + 'regBIF_BX_PF0_RSMU_INDEX_HI': (2, 1, {'rsmu_index_hi': (0, 7)}), + 'regBIF_BX0_BIF_DOORBELL_INT_CNTL': (254, 2, {'doorbell_interrupt_status': (0, 0), 'ras_cntlr_interrupt_status': (1, 1), 'ras_athub_err_event_interrupt_status': (2, 2), 'doorbell_interrupt_clear': (16, 16), 'ras_cntlr_interrupt_clear': (17, 17), 'ras_athub_err_event_interrupt_clear': (18, 18), 'ras_cntlr_err_event_interrupt_enable': (23, 23), 'doorbell_interrupt_disable': (24, 24), 'ras_cntlr_interrupt_disable': (25, 25), 'ras_athub_err_event_interrupt_disable': (26, 26), 'set_db_intr_status_when_rb_enable': (28, 28), 'set_ioh_ras_intr_status_when_rb_enable': (29, 29), 'set_ath_ras_intr_status_when_rb_enable': (30, 30), 'timeout_err_event_interrupt_enable': (31, 31)}), + 'regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL': (301, 2, {'address': (2, 18)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_REQ': (262, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_DONE': (263, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regRCC_DEV0_EPF0_RCC_DOORBELL_APER_EN': (192, 2, {'bif_doorbell_aper_en': (0, 0)}), + 'regRCC_DEV0_EPF2_STRAP2': (53506, 8, {}), + 'regRCC_DEV0_EPF2_STRAP20': (53524, 8, {}), + 'regDOORBELL0_CTRL_ENTRY_0': (52480, 8, {'bif_doorbell0_range_offset_entry': (0, 9), 'bif_doorbell0_range_size_entry': (10, 14), 'doorbell0_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_1': (52481, 8, {'bif_doorbell1_range_offset_entry': (0, 9), 'bif_doorbell1_range_size_entry': (10, 14), 'doorbell1_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_2': (52482, 8, {'bif_doorbell2_range_offset_entry': (0, 9), 'bif_doorbell2_range_size_entry': (10, 14), 'doorbell2_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_3': (52483, 8, {'bif_doorbell3_range_offset_entry': (0, 9), 'bif_doorbell3_range_size_entry': (10, 14), 'doorbell3_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_4': (52484, 8, {'bif_doorbell4_range_offset_entry': (0, 9), 'bif_doorbell4_range_size_entry': (10, 14), 'doorbell4_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_5': (52485, 8, {'bif_doorbell5_range_offset_entry': (0, 9), 'bif_doorbell5_range_size_entry': (10, 14), 'doorbell5_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_6': (52486, 8, {'bif_doorbell6_range_offset_entry': (0, 9), 'bif_doorbell6_range_size_entry': (10, 14), 'doorbell6_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_7': (52487, 8, {'bif_doorbell7_range_offset_entry': (0, 9), 'bif_doorbell7_range_size_entry': (10, 14), 'doorbell7_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_8': (52488, 8, {'bif_doorbell8_range_offset_entry': (0, 9), 'bif_doorbell8_range_size_entry': (10, 14), 'doorbell8_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_9': (52489, 8, {'bif_doorbell9_range_offset_entry': (0, 9), 'bif_doorbell9_range_size_entry': (10, 14), 'doorbell9_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_10': (52490, 8, {'bif_doorbell10_range_offset_entry': (0, 9), 'bif_doorbell10_range_size_entry': (10, 14), 'doorbell10_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_11': (52491, 8, {'bif_doorbell11_range_offset_entry': (0, 9), 'bif_doorbell11_range_size_entry': (10, 14), 'doorbell11_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_12': (52492, 8, {'bif_doorbell12_range_offset_entry': (0, 9), 'bif_doorbell12_range_size_entry': (10, 14), 'doorbell12_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_13': (52493, 8, {'bif_doorbell13_range_offset_entry': (0, 9), 'bif_doorbell13_range_size_entry': (10, 14), 'doorbell13_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_14': (52494, 8, {'bif_doorbell14_range_offset_entry': (0, 9), 'bif_doorbell14_range_size_entry': (10, 14), 'doorbell14_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_15': (52495, 8, {'bif_doorbell15_range_offset_entry': (0, 9), 'bif_doorbell15_range_size_entry': (10, 14), 'doorbell15_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_16': (52496, 8, {'bif_doorbell16_range_offset_entry': (0, 9), 'bif_doorbell16_range_size_entry': (10, 14), 'doorbell16_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_17': (52497, 8, {'bif_doorbell17_range_offset_entry': (0, 9), 'bif_doorbell17_range_size_entry': (10, 14), 'doorbell17_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_18': (52498, 8, {'bif_doorbell18_range_offset_entry': (0, 9), 'bif_doorbell18_range_size_entry': (10, 14), 'doorbell18_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_19': (52499, 8, {'bif_doorbell19_range_offset_entry': (0, 9), 'bif_doorbell19_range_size_entry': (10, 14), 'doorbell19_fence_enable_entry': (16, 20)}), + 'regDOORBELL0_CTRL_ENTRY_20': (52500, 8, {'bif_doorbell20_range_offset_entry': (0, 9), 'bif_doorbell20_range_size_entry': (10, 14), 'doorbell20_fence_enable_entry': (16, 20)}), + 'regBIFC_DOORBELL_ACCESS_EN_PF': (53102, 8, {'bifc_doorbell_access_en_pf': (0, 19)}), + 'regBIFC_GFX_INT_MONITOR_MASK': (59565, 8, {}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_REQ': (36390, 8, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_DONE': (36391, 8, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regS2A_DOORBELL_ENTRY_0_CTRL': (31360, 5, {'s2a_doorbell_port0_enable': (0, 0), 's2a_doorbell_port0_awid': (1, 5), 's2a_doorbell_port0_fence_enable': (6, 6), 's2a_doorbell_port0_range_offset': (7, 16), 's2a_doorbell_port0_range_size': (17, 24), 's2a_doorbell_port0_64bit_support_dis': (25, 25), 's2a_doorbell_port0_need_deduct_range_offset': (26, 26), 's2a_doorbell_port0_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_1_CTRL': (31361, 5, {'s2a_doorbell_port1_enable': (0, 0), 's2a_doorbell_port1_awid': (1, 5), 's2a_doorbell_port1_fence_enable': (6, 6), 's2a_doorbell_port1_range_offset': (7, 16), 's2a_doorbell_port1_range_size': (17, 24), 's2a_doorbell_port1_64bit_support_dis': (25, 25), 's2a_doorbell_port1_need_deduct_range_offset': (26, 26), 's2a_doorbell_port1_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_2_CTRL': (31362, 5, {'s2a_doorbell_port2_enable': (0, 0), 's2a_doorbell_port2_awid': (1, 5), 's2a_doorbell_port2_fence_enable': (6, 6), 's2a_doorbell_port2_range_offset': (7, 16), 's2a_doorbell_port2_range_size': (17, 24), 's2a_doorbell_port2_64bit_support_dis': (25, 25), 's2a_doorbell_port2_need_deduct_range_offset': (26, 26), 's2a_doorbell_port2_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_3_CTRL': (31363, 5, {'s2a_doorbell_port3_enable': (0, 0), 's2a_doorbell_port3_awid': (1, 5), 's2a_doorbell_port3_fence_enable': (6, 6), 's2a_doorbell_port3_range_offset': (7, 16), 's2a_doorbell_port3_range_size': (17, 24), 's2a_doorbell_port3_64bit_support_dis': (25, 25), 's2a_doorbell_port3_need_deduct_range_offset': (26, 26), 's2a_doorbell_port3_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_4_CTRL': (31364, 5, {'s2a_doorbell_port4_enable': (0, 0), 's2a_doorbell_port4_awid': (1, 5), 's2a_doorbell_port4_fence_enable': (6, 6), 's2a_doorbell_port4_range_offset': (7, 16), 's2a_doorbell_port4_range_size': (17, 24), 's2a_doorbell_port4_64bit_support_dis': (25, 25), 's2a_doorbell_port4_need_deduct_range_offset': (26, 26), 's2a_doorbell_port4_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_5_CTRL': (31365, 5, {'s2a_doorbell_port5_enable': (0, 0), 's2a_doorbell_port5_awid': (1, 5), 's2a_doorbell_port5_fence_enable': (6, 6), 's2a_doorbell_port5_range_offset': (7, 16), 's2a_doorbell_port5_range_size': (17, 24), 's2a_doorbell_port5_64bit_support_dis': (25, 25), 's2a_doorbell_port5_need_deduct_range_offset': (26, 26), 's2a_doorbell_port5_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_6_CTRL': (31366, 5, {'s2a_doorbell_port6_enable': (0, 0), 's2a_doorbell_port6_awid': (1, 5), 's2a_doorbell_port6_fence_enable': (6, 6), 's2a_doorbell_port6_range_offset': (7, 16), 's2a_doorbell_port6_range_size': (17, 24), 's2a_doorbell_port6_64bit_support_dis': (25, 25), 's2a_doorbell_port6_need_deduct_range_offset': (26, 26), 's2a_doorbell_port6_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_7_CTRL': (31367, 5, {'s2a_doorbell_port7_enable': (0, 0), 's2a_doorbell_port7_awid': (1, 5), 's2a_doorbell_port7_fence_enable': (6, 6), 's2a_doorbell_port7_range_offset': (7, 16), 's2a_doorbell_port7_range_size': (17, 24), 's2a_doorbell_port7_64bit_support_dis': (25, 25), 's2a_doorbell_port7_need_deduct_range_offset': (26, 26), 's2a_doorbell_port7_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_8_CTRL': (31368, 5, {'s2a_doorbell_port8_enable': (0, 0), 's2a_doorbell_port8_awid': (1, 5), 's2a_doorbell_port8_fence_enable': (6, 6), 's2a_doorbell_port8_range_offset': (7, 16), 's2a_doorbell_port8_range_size': (17, 24), 's2a_doorbell_port8_64bit_support_dis': (25, 25), 's2a_doorbell_port8_need_deduct_range_offset': (26, 26), 's2a_doorbell_port8_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_9_CTRL': (31369, 5, {'s2a_doorbell_port9_enable': (0, 0), 's2a_doorbell_port9_awid': (1, 5), 's2a_doorbell_port9_fence_enable': (6, 6), 's2a_doorbell_port9_range_offset': (7, 16), 's2a_doorbell_port9_range_size': (17, 24), 's2a_doorbell_port9_64bit_support_dis': (25, 25), 's2a_doorbell_port9_need_deduct_range_offset': (26, 26), 's2a_doorbell_port9_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_10_CTRL': (31370, 5, {'s2a_doorbell_port10_enable': (0, 0), 's2a_doorbell_port10_awid': (1, 5), 's2a_doorbell_port10_fence_enable': (6, 6), 's2a_doorbell_port10_range_offset': (7, 16), 's2a_doorbell_port10_range_size': (17, 24), 's2a_doorbell_port10_64bit_support_dis': (25, 25), 's2a_doorbell_port10_need_deduct_range_offset': (26, 26), 's2a_doorbell_port10_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_11_CTRL': (31371, 5, {'s2a_doorbell_port11_enable': (0, 0), 's2a_doorbell_port11_awid': (1, 5), 's2a_doorbell_port11_fence_enable': (6, 6), 's2a_doorbell_port11_range_offset': (7, 16), 's2a_doorbell_port11_range_size': (17, 24), 's2a_doorbell_port11_64bit_support_dis': (25, 25), 's2a_doorbell_port11_need_deduct_range_offset': (26, 26), 's2a_doorbell_port11_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_12_CTRL': (31372, 5, {'s2a_doorbell_port12_enable': (0, 0), 's2a_doorbell_port12_awid': (1, 5), 's2a_doorbell_port12_fence_enable': (6, 6), 's2a_doorbell_port12_range_offset': (7, 16), 's2a_doorbell_port12_range_size': (17, 24), 's2a_doorbell_port12_64bit_support_dis': (25, 25), 's2a_doorbell_port12_need_deduct_range_offset': (26, 26), 's2a_doorbell_port12_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_13_CTRL': (31373, 5, {'s2a_doorbell_port13_enable': (0, 0), 's2a_doorbell_port13_awid': (1, 5), 's2a_doorbell_port13_fence_enable': (6, 6), 's2a_doorbell_port13_range_offset': (7, 16), 's2a_doorbell_port13_range_size': (17, 24), 's2a_doorbell_port13_64bit_support_dis': (25, 25), 's2a_doorbell_port13_need_deduct_range_offset': (26, 26), 's2a_doorbell_port13_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_14_CTRL': (31374, 5, {'s2a_doorbell_port14_enable': (0, 0), 's2a_doorbell_port14_awid': (1, 5), 's2a_doorbell_port14_fence_enable': (6, 6), 's2a_doorbell_port14_range_offset': (7, 16), 's2a_doorbell_port14_range_size': (17, 24), 's2a_doorbell_port14_64bit_support_dis': (25, 25), 's2a_doorbell_port14_need_deduct_range_offset': (26, 26), 's2a_doorbell_port14_awaddr_31_28_value': (28, 31)}), + 'regS2A_DOORBELL_ENTRY_15_CTRL': (31375, 5, {'s2a_doorbell_port15_enable': (0, 0), 's2a_doorbell_port15_awid': (1, 5), 's2a_doorbell_port15_fence_enable': (6, 6), 's2a_doorbell_port15_range_offset': (7, 16), 's2a_doorbell_port15_range_size': (17, 24), 's2a_doorbell_port15_64bit_support_dis': (25, 25), 's2a_doorbell_port15_need_deduct_range_offset': (26, 26), 's2a_doorbell_port15_awaddr_31_28_value': (28, 31)}), + 'regXCC_DOORBELL_FENCE': (29708, 5, {'xcc_0_doorbell_fence': (0, 0), 'xcc_1_doorbell_fence': (1, 1), 'xcc_2_doorbell_fence': (2, 2), 'xcc_3_doorbell_fence': (3, 3), 'xcc_4_doorbell_fence': (4, 4), 'xcc_5_doorbell_fence': (5, 5), 'xcc_6_doorbell_fence': (6, 6), 'xcc_7_doorbell_fence': (7, 7), 'shub_slv_mode': (16, 16), 'rmote_cp_sent': (17, 17), 'cp_0_sent': (18, 18), 'cp_1_sent': (19, 19), 'cp_2_sent': (20, 20), 'cp_3_sent': (21, 21), 'cp_4_sent': (22, 22), 'cp_5_sent': (23, 23), 'cp_6_sent': (24, 24), 'cp_7_sent': (25, 25), 'remote_client_sent': (26, 26), 'remote_client_clr_pending': (27, 27)}), +} +nbio_7_11_0 = { + 'regBIF_BX0_PCIE_INDEX2': (32782, 0, {'pcie_index2': (0, 31)}), + 'regBIF_BX0_PCIE_DATA2': (32783, 0, {'pcie_data2': (0, 31)}), + 'regBIF_BX_PF0_RSMU_INDEX': (32788, 5, {'rsmu_index': (0, 31)}), + 'regBIF_BX_PF0_RSMU_DATA': (32789, 5, {'rsmu_data': (0, 31)}), + 'regBIF_BX0_BIF_DOORBELL_INT_CNTL': (36382, 5, {'doorbell_interrupt_status': (0, 0), 'ras_cntlr_interrupt_status': (1, 1), 'ras_athub_err_event_interrupt_status': (2, 2), 'doorbell_interrupt_clear': (16, 16), 'ras_cntlr_interrupt_clear': (17, 17), 'ras_athub_err_event_interrupt_clear': (18, 18), 'doorbell_interrupt_disable': (24, 24), 'ras_cntlr_interrupt_disable': (25, 25), 'ras_athub_err_event_interrupt_disable': (26, 26), 'set_db_intr_status_when_rb_enable': (28, 28), 'set_ioh_ras_intr_status_when_rb_enable': (29, 29), 'set_ath_ras_intr_status_when_rb_enable': (30, 30), 'timeout_err_event_interrupt_enable': (31, 31)}), + 'regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL': (36429, 5, {'address': (2, 18)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_ONLY_REQ': (36388, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_REQ': (36390, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_DONE': (36391, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_ONLY_REQ': (260, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_REQ': (262, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_DONE': (263, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), +} +nbif_6_3_1 = { + 'regBIF_BX_PF0_RSMU_INDEX': (0, 1, {'rsmu_index': (0, 31)}), + 'regBIF_BX_PF0_RSMU_DATA': (1, 1, {'rsmu_data': (0, 31)}), + 'regBIF_BX_PF0_RSMU_INDEX_HI': (2, 1, {'rsmu_index_hi': (0, 7)}), + 'regBIF_BX0_PCIE_INDEX2': (14, 0, {'pcie_index2': (0, 31)}), + 'regBIF_BX0_PCIE_DATA2': (15, 0, {'pcie_data2': (0, 31)}), + 'regBIF_BX0_PCIE_INDEX2_HI': (17, 0, {'pcie_index2_hi': (0, 7)}), + 'regBIF_BX0_BIF_DOORBELL_INT_CNTL': (254, 2, {'doorbell_interrupt_status': (0, 0), 'ras_cntlr_interrupt_status': (1, 1), 'ras_athub_err_event_interrupt_status': (2, 2), 'doorbell_interrupt_clear': (16, 16), 'ras_cntlr_interrupt_clear': (17, 17), 'ras_athub_err_event_interrupt_clear': (18, 18), 'ras_cntlr_err_event_interrupt_enable': (23, 23), 'doorbell_interrupt_disable': (24, 24), 'ras_cntlr_interrupt_disable': (25, 25), 'ras_athub_err_event_interrupt_disable': (26, 26), 'set_db_intr_status_when_rb_enable': (28, 28), 'set_ioh_ras_intr_status_when_rb_enable': (29, 29), 'set_ath_ras_intr_status_when_rb_enable': (30, 30), 'timeout_err_event_interrupt_enable': (31, 31)}), + 'regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL': (301, 2, {'address': (2, 18)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_REQ': (262, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF0_GPU_HDP_FLUSH_DONE': (263, 2, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regRCC_DEV0_EPF0_RCC_DOORBELL_APER_EN': (192, 2, {'bif_doorbell_aper_en': (0, 0)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_0_CTRL': (459, 2, {'s2a_doorbell_port0_enable': (0, 0), 's2a_doorbell_port0_awid': (1, 5), 's2a_doorbell_port0_fence_enable': (6, 6), 's2a_doorbell_port0_range_offset': (7, 16), 's2a_doorbell_port0_range_size': (17, 24), 's2a_doorbell_port0_64bit_support_dis': (25, 25), 's2a_doorbell_port0_need_deduct_range_offset': (26, 26), 's2a_doorbell_port0_drop_en': (27, 27), 's2a_doorbell_port0_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_1_CTRL': (460, 2, {'s2a_doorbell_port1_enable': (0, 0), 's2a_doorbell_port1_awid': (1, 5), 's2a_doorbell_port1_fence_enable': (6, 6), 's2a_doorbell_port1_range_offset': (7, 16), 's2a_doorbell_port1_range_size': (17, 24), 's2a_doorbell_port1_64bit_support_dis': (25, 25), 's2a_doorbell_port1_need_deduct_range_offset': (26, 26), 's2a_doorbell_port1_drop_en': (27, 27), 's2a_doorbell_port1_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_2_CTRL': (461, 2, {'s2a_doorbell_port2_enable': (0, 0), 's2a_doorbell_port2_awid': (1, 5), 's2a_doorbell_port2_fence_enable': (6, 6), 's2a_doorbell_port2_range_offset': (7, 16), 's2a_doorbell_port2_range_size': (17, 24), 's2a_doorbell_port2_64bit_support_dis': (25, 25), 's2a_doorbell_port2_need_deduct_range_offset': (26, 26), 's2a_doorbell_port2_drop_en': (27, 27), 's2a_doorbell_port2_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_3_CTRL': (462, 2, {'s2a_doorbell_port3_enable': (0, 0), 's2a_doorbell_port3_awid': (1, 5), 's2a_doorbell_port3_fence_enable': (6, 6), 's2a_doorbell_port3_range_offset': (7, 16), 's2a_doorbell_port3_range_size': (17, 24), 's2a_doorbell_port3_64bit_support_dis': (25, 25), 's2a_doorbell_port3_need_deduct_range_offset': (26, 26), 's2a_doorbell_port3_drop_en': (27, 27), 's2a_doorbell_port3_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_4_CTRL': (463, 2, {'s2a_doorbell_port4_enable': (0, 0), 's2a_doorbell_port4_awid': (1, 5), 's2a_doorbell_port4_fence_enable': (6, 6), 's2a_doorbell_port4_range_offset': (7, 16), 's2a_doorbell_port4_range_size': (17, 24), 's2a_doorbell_port4_64bit_support_dis': (25, 25), 's2a_doorbell_port4_need_deduct_range_offset': (26, 26), 's2a_doorbell_port4_drop_en': (27, 27), 's2a_doorbell_port4_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_5_CTRL': (464, 2, {'s2a_doorbell_port5_enable': (0, 0), 's2a_doorbell_port5_awid': (1, 5), 's2a_doorbell_port5_fence_enable': (6, 6), 's2a_doorbell_port5_range_offset': (7, 16), 's2a_doorbell_port5_range_size': (17, 24), 's2a_doorbell_port5_64bit_support_dis': (25, 25), 's2a_doorbell_port5_need_deduct_range_offset': (26, 26), 's2a_doorbell_port5_drop_en': (27, 27), 's2a_doorbell_port5_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_6_CTRL': (465, 2, {'s2a_doorbell_port6_enable': (0, 0), 's2a_doorbell_port6_awid': (1, 5), 's2a_doorbell_port6_fence_enable': (6, 6), 's2a_doorbell_port6_range_offset': (7, 16), 's2a_doorbell_port6_range_size': (17, 24), 's2a_doorbell_port6_64bit_support_dis': (25, 25), 's2a_doorbell_port6_need_deduct_range_offset': (26, 26), 's2a_doorbell_port6_drop_en': (27, 27), 's2a_doorbell_port6_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_7_CTRL': (466, 2, {'s2a_doorbell_port7_enable': (0, 0), 's2a_doorbell_port7_awid': (1, 5), 's2a_doorbell_port7_fence_enable': (6, 6), 's2a_doorbell_port7_range_offset': (7, 16), 's2a_doorbell_port7_range_size': (17, 24), 's2a_doorbell_port7_64bit_support_dis': (25, 25), 's2a_doorbell_port7_need_deduct_range_offset': (26, 26), 's2a_doorbell_port7_drop_en': (27, 27), 's2a_doorbell_port7_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_8_CTRL': (467, 2, {'s2a_doorbell_port8_enable': (0, 0), 's2a_doorbell_port8_awid': (1, 5), 's2a_doorbell_port8_fence_enable': (6, 6), 's2a_doorbell_port8_range_offset': (7, 16), 's2a_doorbell_port8_range_size': (17, 24), 's2a_doorbell_port8_64bit_support_dis': (25, 25), 's2a_doorbell_port8_need_deduct_range_offset': (26, 26), 's2a_doorbell_port8_drop_en': (27, 27), 's2a_doorbell_port8_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_9_CTRL': (468, 2, {'s2a_doorbell_port9_enable': (0, 0), 's2a_doorbell_port9_awid': (1, 5), 's2a_doorbell_port9_fence_enable': (6, 6), 's2a_doorbell_port9_range_offset': (7, 16), 's2a_doorbell_port9_range_size': (17, 24), 's2a_doorbell_port9_64bit_support_dis': (25, 25), 's2a_doorbell_port9_need_deduct_range_offset': (26, 26), 's2a_doorbell_port9_drop_en': (27, 27), 's2a_doorbell_port9_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_10_CTRL': (469, 2, {'s2a_doorbell_port10_enable': (0, 0), 's2a_doorbell_port10_awid': (1, 5), 's2a_doorbell_port10_fence_enable': (6, 6), 's2a_doorbell_port10_range_offset': (7, 16), 's2a_doorbell_port10_range_size': (17, 24), 's2a_doorbell_port10_64bit_support_dis': (25, 25), 's2a_doorbell_port10_need_deduct_range_offset': (26, 26), 's2a_doorbell_port10_drop_en': (27, 27), 's2a_doorbell_port10_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_11_CTRL': (470, 2, {'s2a_doorbell_port11_enable': (0, 0), 's2a_doorbell_port11_awid': (1, 5), 's2a_doorbell_port11_fence_enable': (6, 6), 's2a_doorbell_port11_range_offset': (7, 16), 's2a_doorbell_port11_range_size': (17, 24), 's2a_doorbell_port11_64bit_support_dis': (25, 25), 's2a_doorbell_port11_need_deduct_range_offset': (26, 26), 's2a_doorbell_port11_drop_en': (27, 27), 's2a_doorbell_port11_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_12_CTRL': (471, 2, {'s2a_doorbell_port12_enable': (0, 0), 's2a_doorbell_port12_awid': (1, 5), 's2a_doorbell_port12_fence_enable': (6, 6), 's2a_doorbell_port12_range_offset': (7, 16), 's2a_doorbell_port12_range_size': (17, 24), 's2a_doorbell_port12_64bit_support_dis': (25, 25), 's2a_doorbell_port12_need_deduct_range_offset': (26, 26), 's2a_doorbell_port12_drop_en': (27, 27), 's2a_doorbell_port12_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_13_CTRL': (472, 2, {'s2a_doorbell_port13_enable': (0, 0), 's2a_doorbell_port13_awid': (1, 5), 's2a_doorbell_port13_fence_enable': (6, 6), 's2a_doorbell_port13_range_offset': (7, 16), 's2a_doorbell_port13_range_size': (17, 24), 's2a_doorbell_port13_64bit_support_dis': (25, 25), 's2a_doorbell_port13_need_deduct_range_offset': (26, 26), 's2a_doorbell_port13_drop_en': (27, 27), 's2a_doorbell_port13_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_14_CTRL': (473, 2, {'s2a_doorbell_port14_enable': (0, 0), 's2a_doorbell_port14_awid': (1, 5), 's2a_doorbell_port14_fence_enable': (6, 6), 's2a_doorbell_port14_range_offset': (7, 16), 's2a_doorbell_port14_range_size': (17, 24), 's2a_doorbell_port14_64bit_support_dis': (25, 25), 's2a_doorbell_port14_need_deduct_range_offset': (26, 26), 's2a_doorbell_port14_drop_en': (27, 27), 's2a_doorbell_port14_awaddr_31_28_value': (28, 31)}), + 'regGDC_S2A0_S2A_DOORBELL_ENTRY_15_CTRL': (474, 2, {'s2a_doorbell_port15_enable': (0, 0), 's2a_doorbell_port15_awid': (1, 5), 's2a_doorbell_port15_fence_enable': (6, 6), 's2a_doorbell_port15_range_offset': (7, 16), 's2a_doorbell_port15_range_size': (17, 24), 's2a_doorbell_port15_64bit_support_dis': (25, 25), 's2a_doorbell_port15_need_deduct_range_offset': (26, 26), 's2a_doorbell_port15_drop_en': (27, 27), 's2a_doorbell_port15_awaddr_31_28_value': (28, 31)}), + 'regRCC_DEV0_EPF2_STRAP2': (53506, 5, {'strap_no_soft_reset_dev0_f2': (7, 7), 'strap_resize_bar_en_dev0_f2': (8, 8), 'strap_max_pasid_width_dev0_f2': (9, 13), 'strap_msi_pervector_mask_cap_dev0_f2': (14, 14), 'strap_aer_en_dev0_f2': (16, 16), 'strap_acs_en_dev0_f2': (17, 17), 'strap_cpl_abort_err_en_dev0_f2': (20, 20), 'strap_dpa_en_dev0_f2': (21, 21), 'strap_msi_multi_cap_dev0_f2': (24, 26), 'strap_pasid_en_dev0_f2': (28, 28), 'strap_pasid_exe_permission_supported_dev0_f2': (29, 29), 'strap_pasid_global_invalidate_supported_dev0_f2': (30, 30), 'strap_pasid_priv_mode_supported_dev0_f2': (31, 31)}), + 'regRCC_DEV0_EPF2_STRAP20': (53524, 5, {}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_REQ': (36390, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), + 'regBIF_BX_PF1_GPU_HDP_FLUSH_DONE': (36391, 5, {'cp0': (0, 0), 'cp1': (1, 1), 'cp2': (2, 2), 'cp3': (3, 3), 'cp4': (4, 4), 'cp5': (5, 5), 'cp6': (6, 6), 'cp7': (7, 7), 'cp8': (8, 8), 'cp9': (9, 9), 'sdma0': (10, 10), 'sdma1': (11, 11), 'rsvd_eng0': (12, 12), 'rsvd_eng1': (13, 13), 'rsvd_eng2': (14, 14), 'rsvd_eng3': (15, 15), 'rsvd_eng4': (16, 16), 'rsvd_eng5': (17, 17), 'rsvd_eng6': (18, 18), 'rsvd_eng7': (19, 19), 'rsvd_eng8': (20, 20), 'rsvd_eng9': (21, 21), 'rsvd_eng10': (22, 22), 'rsvd_eng11': (23, 23), 'rsvd_eng12': (24, 24), 'rsvd_eng13': (25, 25), 'rsvd_eng14': (26, 26), 'rsvd_eng15': (27, 27), 'rsvd_eng16': (28, 28), 'rsvd_eng17': (29, 29), 'rsvd_eng18': (30, 30), 'rsvd_eng19': (31, 31)}), +} +mp_11_0_0 = { + 'mmMP0_SMN_C2PMSG_32': (96, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_33': (97, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_34': (98, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_35': (99, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_36': (100, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_37': (101, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_38': (102, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_39': (103, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_40': (104, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_41': (105, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_42': (106, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_43': (107, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_44': (108, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_45': (109, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_46': (110, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_47': (111, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_48': (112, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_49': (113, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_50': (114, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_51': (115, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_52': (116, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_53': (117, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_54': (118, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_55': (119, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_56': (120, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_57': (121, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_58': (122, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_59': (123, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_60': (124, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_61': (125, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_62': (126, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_63': (127, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_64': (128, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_65': (129, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_66': (130, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_67': (131, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_68': (132, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_69': (133, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_70': (134, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_71': (135, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_72': (136, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_73': (137, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_74': (138, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_75': (139, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_76': (140, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_77': (141, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_78': (142, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_79': (143, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_80': (144, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_81': (145, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_82': (146, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_83': (147, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_84': (148, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_85': (149, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_86': (150, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_87': (151, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_88': (152, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_89': (153, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_90': (154, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_91': (155, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_92': (156, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_93': (157, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_94': (158, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_95': (159, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_96': (160, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_97': (161, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_98': (162, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_99': (163, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_100': (164, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_101': (165, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_102': (166, 0, {'content': (0, 31)}), + 'mmMP0_SMN_C2PMSG_103': (167, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_32': (608, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_33': (609, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_34': (610, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_35': (611, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_36': (612, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_37': (613, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_38': (614, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_39': (615, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_40': (616, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_41': (617, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_42': (618, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_43': (619, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_44': (620, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_45': (621, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_46': (622, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_47': (623, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_48': (624, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_49': (625, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_50': (626, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_51': (627, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_52': (628, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_53': (629, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_54': (630, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_55': (631, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_56': (632, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_57': (633, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_58': (634, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_59': (635, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_60': (636, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_61': (637, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_62': (638, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_63': (639, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_64': (640, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_65': (641, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_66': (642, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_67': (643, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_68': (644, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_69': (645, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_70': (646, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_71': (647, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_72': (648, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_73': (649, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_74': (650, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_75': (651, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_76': (652, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_77': (653, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_78': (654, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_79': (655, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_80': (656, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_81': (657, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_82': (658, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_83': (659, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_84': (660, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_85': (661, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_86': (662, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_87': (663, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_88': (664, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_89': (665, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_90': (666, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_91': (667, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_92': (668, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_93': (669, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_94': (670, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_95': (671, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_96': (672, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_97': (673, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_98': (674, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_99': (675, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_100': (676, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_101': (677, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_102': (678, 0, {'content': (0, 31)}), + 'mmMP1_SMN_C2PMSG_103': (679, 0, {'content': (0, 31)}), +} +mp_13_0_0 = { + 'regMP0_SMN_C2PMSG_32': (96, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_33': (97, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_34': (98, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_35': (99, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_36': (100, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_37': (101, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_38': (102, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_39': (103, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_40': (104, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_41': (105, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_42': (106, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_43': (107, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_44': (108, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_45': (109, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_46': (110, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_47': (111, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_48': (112, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_49': (113, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_50': (114, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_51': (115, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_52': (116, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_53': (117, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_54': (118, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_55': (119, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_56': (120, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_57': (121, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_58': (122, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_59': (123, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_60': (124, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_61': (125, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_62': (126, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_63': (127, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_64': (128, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_65': (129, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_66': (130, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_67': (131, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_68': (132, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_69': (133, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_70': (134, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_71': (135, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_72': (136, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_73': (137, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_74': (138, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_75': (139, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_76': (140, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_77': (141, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_78': (142, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_79': (143, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_80': (144, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_81': (145, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_82': (146, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_83': (147, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_84': (148, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_85': (149, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_86': (150, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_87': (151, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_88': (152, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_89': (153, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_90': (154, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_91': (155, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_92': (156, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_93': (157, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_94': (158, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_95': (159, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_96': (160, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_97': (161, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_98': (162, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_99': (163, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_100': (164, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_101': (165, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_102': (166, 0, {'content': (0, 31)}), + 'regMP0_SMN_C2PMSG_103': (167, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_32': (608, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_33': (609, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_34': (610, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_35': (611, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_36': (612, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_37': (613, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_38': (614, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_39': (615, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_40': (616, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_41': (617, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_42': (618, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_43': (619, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_44': (620, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_45': (621, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_46': (622, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_47': (623, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_48': (624, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_49': (625, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_50': (626, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_51': (627, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_52': (628, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_53': (629, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_54': (630, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_55': (631, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_56': (632, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_57': (633, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_58': (634, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_59': (635, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_60': (636, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_61': (637, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_62': (638, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_63': (639, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_64': (640, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_65': (641, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_66': (642, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_67': (643, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_68': (644, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_69': (645, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_70': (646, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_71': (647, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_72': (648, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_73': (649, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_74': (650, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_75': (651, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_76': (652, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_77': (653, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_78': (654, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_79': (655, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_80': (656, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_81': (657, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_82': (658, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_83': (659, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_84': (660, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_85': (661, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_86': (662, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_87': (663, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_88': (664, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_89': (665, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_90': (666, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_91': (667, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_92': (668, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_93': (669, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_94': (670, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_95': (671, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_96': (672, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_97': (673, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_98': (674, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_99': (675, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_100': (676, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_101': (677, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_102': (678, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_103': (679, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_104': (680, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_105': (681, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_106': (682, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_107': (683, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_108': (684, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_109': (685, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_110': (686, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_111': (687, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_112': (688, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_113': (689, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_114': (690, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_115': (691, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_116': (692, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_117': (693, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_118': (694, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_119': (695, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_120': (696, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_121': (697, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_122': (698, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_123': (699, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_124': (700, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_125': (701, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_126': (702, 0, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_127': (703, 0, {'content': (0, 31)}), +} +mp_14_0_2 = { + 'regMP1_SMN_C2PMSG_0': (64, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_1': (65, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_2': (66, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_3': (67, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_4': (68, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_5': (69, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_6': (70, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_7': (71, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_8': (72, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_9': (73, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_10': (74, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_11': (75, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_12': (76, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_13': (77, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_14': (78, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_15': (79, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_16': (80, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_17': (81, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_18': (82, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_19': (83, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_20': (84, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_21': (85, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_22': (86, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_23': (87, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_24': (88, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_25': (89, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_26': (90, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_27': (91, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_28': (92, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_29': (93, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_30': (94, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_31': (95, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_32': (96, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_33': (97, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_34': (98, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_35': (99, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_36': (100, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_37': (101, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_38': (102, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_39': (103, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_40': (104, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_41': (105, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_42': (106, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_43': (107, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_44': (108, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_45': (109, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_46': (110, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_47': (111, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_48': (112, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_49': (113, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_50': (114, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_51': (115, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_52': (116, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_53': (117, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_54': (118, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_55': (119, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_56': (120, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_57': (121, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_58': (122, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_59': (123, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_60': (124, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_61': (125, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_62': (126, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_63': (127, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_64': (128, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_65': (129, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_66': (130, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_67': (131, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_68': (132, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_69': (133, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_70': (134, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_71': (135, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_72': (136, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_73': (137, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_74': (138, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_75': (139, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_76': (140, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_77': (141, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_78': (142, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_79': (143, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_80': (144, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_81': (145, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_82': (146, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_83': (147, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_84': (148, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_85': (149, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_86': (150, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_87': (151, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_88': (152, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_89': (153, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_90': (154, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_91': (155, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_92': (156, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_93': (157, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_94': (158, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_95': (159, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_96': (160, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_97': (161, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_98': (162, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_99': (163, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_100': (164, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_101': (165, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_102': (166, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_103': (167, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_104': (168, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_105': (169, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_106': (170, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_107': (171, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_108': (172, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_109': (173, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_110': (174, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_111': (175, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_112': (176, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_113': (177, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_114': (178, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_115': (179, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_116': (180, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_117': (181, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_118': (182, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_119': (183, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_120': (184, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_121': (185, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_122': (186, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_123': (187, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_124': (188, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_125': (189, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_126': (190, 1, {'content': (0, 31)}), + 'regMP1_SMN_C2PMSG_127': (191, 1, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_32': (96, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_33': (97, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_34': (98, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_35': (99, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_36': (100, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_37': (101, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_38': (102, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_39': (103, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_60': (124, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_61': (125, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_62': (126, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_63': (127, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_64': (128, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_65': (129, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_66': (130, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_67': (131, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_68': (132, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_69': (133, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_70': (134, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_71': (135, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_72': (136, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_73': (137, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_74': (138, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_75': (139, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_76': (140, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_77': (141, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_78': (142, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_79': (143, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_80': (144, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_81': (145, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_82': (146, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_83': (147, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_84': (148, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_85': (149, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_86': (150, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_87': (151, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_88': (152, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_89': (153, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_100': (164, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_101': (165, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_102': (166, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_103': (167, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_109': (173, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_115': (179, 0, {'content': (0, 31)}), + 'regMPASP_SMN_C2PMSG_116': (180, 0, {'content': (0, 31)}), +} +hdp_4_4_2 = { + 'regHDP_MEM_POWER_CTRL': (212, 0, {'iph_mem_power_ctrl_en': (0, 0), 'iph_mem_power_ls_en': (1, 1), 'iph_mem_power_ds_en': (2, 2), 'iph_mem_power_sd_en': (3, 3), 'iph_mem_idle_hysteresis': (4, 6), 'iph_mem_power_up_recover_delay': (8, 13), 'iph_mem_power_down_ls_enter_delay': (14, 15), 'rc_mem_power_ctrl_en': (16, 16), 'rc_mem_power_ls_en': (17, 17), 'rc_mem_power_ds_en': (18, 18), 'rc_mem_power_sd_en': (19, 19), 'rc_mem_idle_hysteresis': (20, 22), 'rc_mem_power_up_recover_delay': (24, 29), 'rc_mem_power_down_ls_enter_delay': (30, 31)}), +} +hdp_6_0_0 = { + 'regHDP_MEM_POWER_CTRL': (212, 0, {'atomic_mem_power_ctrl_en': (0, 0), 'atomic_mem_power_ls_en': (1, 1), 'atomic_mem_power_ds_en': (2, 2), 'atomic_mem_power_sd_en': (3, 3), 'atomic_mem_idle_hysteresis': (4, 6), 'atomic_mem_power_up_recover_delay': (8, 13), 'atomic_mem_power_down_enter_delay': (14, 15), 'rc_mem_power_ctrl_en': (16, 16), 'rc_mem_power_ls_en': (17, 17), 'rc_mem_power_ds_en': (18, 18), 'rc_mem_power_sd_en': (19, 19), 'rc_mem_idle_hysteresis': (20, 22), 'rc_mem_power_up_recover_delay': (24, 29), 'rc_mem_power_down_enter_delay': (30, 31)}), +} +hdp_7_0_0 = { + 'regHDP_MEM_POWER_CTRL': (212, 0, {'atomic_mem_power_ctrl_en': (0, 0), 'atomic_mem_power_ls_en': (1, 1), 'atomic_mem_power_ds_en': (2, 2), 'atomic_mem_power_sd_en': (3, 3), 'atomic_mem_idle_hysteresis': (4, 6), 'atomic_mem_power_up_recover_delay': (8, 13), 'atomic_mem_power_down_enter_delay': (14, 15), 'rc_mem_power_ctrl_en': (16, 16), 'rc_mem_power_ls_en': (17, 17), 'rc_mem_power_ds_en': (18, 18), 'rc_mem_power_sd_en': (19, 19), 'rc_mem_idle_hysteresis': (20, 22), 'rc_mem_power_up_recover_delay': (24, 29), 'rc_mem_power_down_enter_delay': (30, 31)}), +} +osssys_4_4_2 = { + 'regIH_VMID_0_LUT': (0, 0, {'pasid': (0, 15)}), + 'regIH_VMID_1_LUT': (1, 0, {'pasid': (0, 15)}), + 'regIH_VMID_2_LUT': (2, 0, {'pasid': (0, 15)}), + 'regIH_VMID_3_LUT': (3, 0, {'pasid': (0, 15)}), + 'regIH_VMID_4_LUT': (4, 0, {'pasid': (0, 15)}), + 'regIH_VMID_5_LUT': (5, 0, {'pasid': (0, 15)}), + 'regIH_VMID_6_LUT': (6, 0, {'pasid': (0, 15)}), + 'regIH_VMID_7_LUT': (7, 0, {'pasid': (0, 15)}), + 'regIH_VMID_8_LUT': (8, 0, {'pasid': (0, 15)}), + 'regIH_VMID_9_LUT': (9, 0, {'pasid': (0, 15)}), + 'regIH_VMID_10_LUT': (10, 0, {'pasid': (0, 15)}), + 'regIH_VMID_11_LUT': (11, 0, {'pasid': (0, 15)}), + 'regIH_VMID_12_LUT': (12, 0, {'pasid': (0, 15)}), + 'regIH_VMID_13_LUT': (13, 0, {'pasid': (0, 15)}), + 'regIH_VMID_14_LUT': (14, 0, {'pasid': (0, 15)}), + 'regIH_VMID_15_LUT': (15, 0, {'pasid': (0, 15)}), + 'regIH_VMID_0_LUT_MM': (16, 0, {'pasid': (0, 15)}), + 'regIH_VMID_1_LUT_MM': (17, 0, {'pasid': (0, 15)}), + 'regIH_VMID_2_LUT_MM': (18, 0, {'pasid': (0, 15)}), + 'regIH_VMID_3_LUT_MM': (19, 0, {'pasid': (0, 15)}), + 'regIH_VMID_4_LUT_MM': (20, 0, {'pasid': (0, 15)}), + 'regIH_VMID_5_LUT_MM': (21, 0, {'pasid': (0, 15)}), + 'regIH_VMID_6_LUT_MM': (22, 0, {'pasid': (0, 15)}), + 'regIH_VMID_7_LUT_MM': (23, 0, {'pasid': (0, 15)}), + 'regIH_VMID_8_LUT_MM': (24, 0, {'pasid': (0, 15)}), + 'regIH_VMID_9_LUT_MM': (25, 0, {'pasid': (0, 15)}), + 'regIH_VMID_10_LUT_MM': (26, 0, {'pasid': (0, 15)}), + 'regIH_VMID_11_LUT_MM': (27, 0, {'pasid': (0, 15)}), + 'regIH_VMID_12_LUT_MM': (28, 0, {'pasid': (0, 15)}), + 'regIH_VMID_13_LUT_MM': (29, 0, {'pasid': (0, 15)}), + 'regIH_VMID_14_LUT_MM': (30, 0, {'pasid': (0, 15)}), + 'regIH_VMID_15_LUT_MM': (31, 0, {'pasid': (0, 15)}), + 'regIH_COOKIE_0': (32, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'ring_id': (16, 23), 'vm_id': (24, 27), 'reserved': (28, 30), 'vmid_type': (31, 31)}), + 'regIH_COOKIE_1': (33, 0, {'timestamp_31_0': (0, 31)}), + 'regIH_COOKIE_2': (34, 0, {'timestamp_47_32': (0, 15), 'reserved': (16, 30), 'timestamp_src': (31, 31)}), + 'regIH_COOKIE_3': (35, 0, {'pas_id': (0, 15), 'reserved': (16, 30), 'pasid_src': (31, 31)}), + 'regIH_COOKIE_4': (36, 0, {'context_id_31_0': (0, 31)}), + 'regIH_COOKIE_5': (37, 0, {'context_id_63_32': (0, 31)}), + 'regIH_COOKIE_6': (38, 0, {'context_id_95_64': (0, 31)}), + 'regIH_COOKIE_7': (39, 0, {'context_id_128_96': (0, 31)}), + 'regIH_REGISTER_LAST_PART0': (63, 0, {'reserved': (0, 31)}), + 'regIH_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'rb_gpu_ts_enable': (7, 7), 'wptr_writeback_enable': (8, 8), 'rb_full_drain_enable': (9, 9), 'full_drain_clear': (10, 10), 'page_rb_clear': (11, 11), 'rb_used_int_threshold': (12, 15), 'wptr_overflow_enable': (16, 16), 'enable_intr': (17, 17), 'mc_swap': (18, 19), 'mc_snoop': (20, 20), 'rptr_rearm': (21, 21), 'mc_ro': (22, 22), 'mc_vmid': (24, 27), 'mc_space': (28, 30), 'wptr_overflow_clear': (31, 31)}), + 'regIH_RB_BASE': (129, 0, {'addr': (0, 31)}), + 'regIH_RB_BASE_HI': (130, 0, {'addr': (0, 7)}), + 'regIH_RB_RPTR': (131, 0, {'offset': (2, 17)}), + 'regIH_RB_WPTR': (132, 0, {'rb_overflow': (0, 0), 'offset': (2, 17), 'rb_left_none': (18, 18), 'rb_may_overflow': (19, 19)}), + 'regIH_RB_WPTR_ADDR_HI': (133, 0, {'addr': (0, 15)}), + 'regIH_RB_WPTR_ADDR_LO': (134, 0, {'addr': (2, 31)}), + 'regIH_DOORBELL_RPTR': (135, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_DOORBELL_RETRY_CAM': (136, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_RB_CNTL_RING1': (140, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'rb_gpu_ts_enable': (7, 7), 'rb_full_drain_enable': (9, 9), 'full_drain_clear': (10, 10), 'page_rb_clear': (11, 11), 'rb_used_int_threshold': (12, 15), 'wptr_overflow_enable': (16, 16), 'mc_swap': (18, 19), 'mc_snoop': (20, 20), 'mc_ro': (22, 22), 'mc_vmid': (24, 27), 'mc_space': (28, 30), 'wptr_overflow_clear': (31, 31)}), + 'regIH_RB_BASE_RING1': (141, 0, {'addr': (0, 31)}), + 'regIH_RB_BASE_HI_RING1': (142, 0, {'addr': (0, 7)}), + 'regIH_RB_RPTR_RING1': (143, 0, {'offset': (2, 17)}), + 'regIH_RB_WPTR_RING1': (144, 0, {'rb_overflow': (0, 0), 'offset': (2, 17), 'rb_left_none': (18, 18), 'rb_may_overflow': (19, 19)}), + 'regIH_DOORBELL_RPTR_RING1': (147, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_RETRY_CAM_ACK': (164, 0, {'index': (0, 9)}), + 'regIH_VERSION': (165, 0, {'minver': (0, 6), 'majver': (8, 14), 'rev': (16, 21)}), + 'regIH_CNTL': (192, 0, {'wptr_writeback_timer': (0, 4), 'ih_idle_hysteresis_cntl': (6, 7), 'ih_fifo_highwater': (8, 14), 'mc_wr_clean_cnt': (20, 24), 'sram_ecc_enable': (25, 25), 'fed_enable': (26, 26)}), + 'regIH_CNTL2': (193, 0, {'self_iv_force_wptr_update_timeout': (0, 4), 'self_iv_force_wptr_update_enable': (8, 8)}), + 'regIH_STATUS': (194, 0, {'idle': (0, 0), 'input_idle': (1, 1), 'buffer_idle': (2, 2), 'rb_full': (3, 3), 'rb_full_drain': (4, 4), 'rb_overflow': (5, 5), 'mc_wr_idle': (6, 6), 'mc_wr_stall': (7, 7), 'mc_wr_clean_pending': (8, 8), 'mc_wr_clean_stall': (9, 9), 'bif_interrupt_line': (10, 10), 'switch_ready': (11, 11), 'rb1_full': (12, 12), 'rb1_full_drain': (13, 13), 'rb1_overflow': (14, 14), 'self_int_gen_idle': (18, 18), 'retry_int_cam_idle': (19, 19), 'ih_buffer_mem_power_gated': (20, 20), 'ih_retry_int_cam_mem_power_gated': (21, 21), 'ih_pasid_lut_mem_power_gated': (22, 22)}), + 'regIH_PERFMON_CNTL': (195, 0, {'enable0': (0, 0), 'clear0': (1, 1), 'perf_sel0': (2, 11), 'enable1': (16, 16), 'clear1': (17, 17), 'perf_sel1': (18, 27)}), + 'regIH_PERFCOUNTER0_RESULT': (196, 0, {'perf_count': (0, 31)}), + 'regIH_PERFCOUNTER1_RESULT': (197, 0, {'perf_count': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_31_0': (199, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_63_32': (200, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_95_64': (201, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_FIELD_CONTROL': (202, 0, {'src_en': (0, 0), 'fcnid_en': (1, 1), 'timestamp_en': (2, 2), 'ringid_en': (3, 3), 'vmid_en': (4, 4), 'pasid_en': (5, 5), 'client_id_en': (6, 6), 'dieid_en': (7, 7)}), + 'regIH_DSM_MATCH_DATA_CONTROL': (203, 0, {'value': (0, 27)}), + 'regIH_DSM_MATCH_FCN_ID': (204, 0, {'pf_vf': (0, 0), 'vf_id': (1, 3)}), + 'regIH_LIMIT_INT_RATE_CNTL': (205, 0, {'limit_enable': (0, 0), 'perf_interval': (1, 4), 'perf_threshold': (5, 15), 'return_delay': (17, 20), 'perf_result': (21, 31)}), + 'regIH_VF_RB_STATUS': (206, 0, {'rb_full_drain_vf': (0, 7), 'rb_overflow_vf': (16, 23)}), + 'regIH_VF_RB_STATUS2': (207, 0, {'rb_full_vf': (0, 7), 'bif_interrupt_line_vf': (16, 23)}), + 'regIH_VF_RB1_STATUS': (208, 0, {'rb_full_drain_vf': (0, 7), 'rb_overflow_vf': (16, 23)}), + 'regIH_VF_RB1_STATUS2': (209, 0, {'rb_full_vf': (0, 7)}), + 'regIH_INT_FLOOD_CNTL': (213, 0, {'highwater': (0, 2), 'flood_cntl_enable': (3, 3), 'clear_int_flood_status': (4, 4)}), + 'regIH_RB0_INT_FLOOD_STATUS': (214, 0, {'rb_int_dropped_vf': (0, 7), 'rb_int_dropped': (31, 31)}), + 'regIH_RB1_INT_FLOOD_STATUS': (215, 0, {'rb_int_dropped_vf': (0, 7), 'rb_int_dropped': (31, 31)}), + 'regIH_INT_FLOOD_STATUS': (217, 0, {'int_drop_cnt': (0, 7), 'first_drop_int_client_id': (8, 15), 'first_drop_int_source_id': (16, 23), 'first_drop_int_vf_id': (24, 26), 'first_drop_int_vf': (28, 28), 'int_dropped': (30, 30)}), + 'regIH_STORM_CLIENT_LIST_CNTL': (218, 0, {'client1_is_storm_client': (1, 1), 'client2_is_storm_client': (2, 2), 'client3_is_storm_client': (3, 3), 'client4_is_storm_client': (4, 4), 'client5_is_storm_client': (5, 5), 'client6_is_storm_client': (6, 6), 'client7_is_storm_client': (7, 7), 'client8_is_storm_client': (8, 8), 'client9_is_storm_client': (9, 9), 'client10_is_storm_client': (10, 10), 'client11_is_storm_client': (11, 11), 'client12_is_storm_client': (12, 12), 'client13_is_storm_client': (13, 13), 'client14_is_storm_client': (14, 14), 'client15_is_storm_client': (15, 15), 'client16_is_storm_client': (16, 16), 'client17_is_storm_client': (17, 17), 'client18_is_storm_client': (18, 18), 'client19_is_storm_client': (19, 19), 'client20_is_storm_client': (20, 20), 'client21_is_storm_client': (21, 21), 'client22_is_storm_client': (22, 22), 'client23_is_storm_client': (23, 23), 'client24_is_storm_client': (24, 24), 'client25_is_storm_client': (25, 25), 'client26_is_storm_client': (26, 26), 'client27_is_storm_client': (27, 27), 'client28_is_storm_client': (28, 28), 'client29_is_storm_client': (29, 29), 'client30_is_storm_client': (30, 30), 'client31_is_storm_client': (31, 31)}), + 'regIH_CLK_CTRL': (219, 0, {'ih_pasid_lut_mem_clk_soft_override': (23, 23), 'ih_ras_clk_soft_override': (24, 24), 'ih_retry_int_cam_mem_clk_soft_override': (25, 25), 'ih_buffer_mem_clk_soft_override': (26, 26), 'dbus_mux_clk_soft_override': (27, 27), 'osssys_share_clk_soft_override': (28, 28), 'limit_smn_clk_soft_override': (29, 29), 'dyn_clk_soft_override': (30, 30), 'reg_clk_soft_override': (31, 31)}), + 'regIH_INT_FLAGS': (220, 0, {'client_0_flag': (0, 0), 'client_1_flag': (1, 1), 'client_2_flag': (2, 2), 'client_3_flag': (3, 3), 'client_4_flag': (4, 4), 'client_5_flag': (5, 5), 'client_6_flag': (6, 6), 'client_7_flag': (7, 7), 'client_8_flag': (8, 8), 'client_9_flag': (9, 9), 'client_10_flag': (10, 10), 'client_11_flag': (11, 11), 'client_12_flag': (12, 12), 'client_13_flag': (13, 13), 'client_14_flag': (14, 14), 'client_15_flag': (15, 15), 'client_16_flag': (16, 16), 'client_17_flag': (17, 17), 'client_18_flag': (18, 18), 'client_19_flag': (19, 19), 'client_20_flag': (20, 20), 'client_21_flag': (21, 21), 'client_22_flag': (22, 22), 'client_23_flag': (23, 23), 'client_24_flag': (24, 24), 'client_25_flag': (25, 25), 'client_26_flag': (26, 26), 'client_27_flag': (27, 27), 'client_28_flag': (28, 28), 'client_29_flag': (29, 29), 'client_30_flag': (30, 30), 'client_31_flag': (31, 31)}), + 'regIH_LAST_INT_INFO0': (221, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'ring_id': (16, 23), 'vm_id': (24, 27), 'vmid_type': (31, 31)}), + 'regIH_LAST_INT_INFO1': (222, 0, {'context_id': (0, 31)}), + 'regIH_LAST_INT_INFO2': (223, 0, {'pas_id': (0, 15), 'vf_id': (16, 18), 'vf': (20, 20)}), + 'regIH_SCRATCH': (224, 0, {'data': (0, 31)}), + 'regIH_CLIENT_CREDIT_ERROR': (225, 0, {'clear': (0, 0), 'client_1_error': (1, 1), 'client_2_error': (2, 2), 'client_3_error': (3, 3), 'client_4_error': (4, 4), 'client_5_error': (5, 5), 'client_6_error': (6, 6), 'client_7_error': (7, 7), 'client_8_error': (8, 8), 'client_9_error': (9, 9), 'client_10_error': (10, 10), 'client_11_error': (11, 11), 'client_12_error': (12, 12), 'client_13_error': (13, 13), 'client_14_error': (14, 14), 'client_15_error': (15, 15), 'client_16_error': (16, 16), 'client_17_error': (17, 17), 'client_18_error': (18, 18), 'client_19_error': (19, 19), 'client_20_error': (20, 20), 'client_21_error': (21, 21), 'client_22_error': (22, 22), 'client_23_error': (23, 23), 'client_24_error': (24, 24), 'client_25_error': (25, 25), 'client_26_error': (26, 26), 'client_27_error': (27, 27), 'client_28_error': (28, 28), 'client_29_error': (29, 29), 'client_30_error': (30, 30), 'client_31_error': (31, 31)}), + 'regIH_GPU_IOV_VIOLATION_LOG': (226, 0, {'violation_status': (0, 0), 'multiple_violation_status': (1, 1), 'address': (2, 17), 'opcode': (18, 18), 'vf': (19, 19), 'vf_id': (20, 22)}), + 'regIH_GPU_IOV_VIOLATION_LOG2': (227, 0, {'initiator_id': (0, 9)}), + 'regIH_COOKIE_REC_VIOLATION_LOG': (228, 0, {'violation_status': (0, 0), 'client_id': (8, 15), 'initiator_id': (16, 25), 'die_id': (26, 29)}), + 'regIH_CREDIT_STATUS': (229, 0, {'client_1_credit_returned': (1, 1), 'client_2_credit_returned': (2, 2), 'client_3_credit_returned': (3, 3), 'client_4_credit_returned': (4, 4), 'client_5_credit_returned': (5, 5), 'client_6_credit_returned': (6, 6), 'client_7_credit_returned': (7, 7), 'client_8_credit_returned': (8, 8), 'client_9_credit_returned': (9, 9), 'client_10_credit_returned': (10, 10), 'client_11_credit_returned': (11, 11), 'client_12_credit_returned': (12, 12), 'client_13_credit_returned': (13, 13), 'client_14_credit_returned': (14, 14), 'client_15_credit_returned': (15, 15), 'client_16_credit_returned': (16, 16), 'client_17_credit_returned': (17, 17), 'client_18_credit_returned': (18, 18), 'client_19_credit_returned': (19, 19), 'client_20_credit_returned': (20, 20), 'client_21_credit_returned': (21, 21), 'client_22_credit_returned': (22, 22), 'client_23_credit_returned': (23, 23), 'client_24_credit_returned': (24, 24), 'client_25_credit_returned': (25, 25), 'client_26_credit_returned': (26, 26), 'client_27_credit_returned': (27, 27), 'client_28_credit_returned': (28, 28), 'client_29_credit_returned': (29, 29), 'client_30_credit_returned': (30, 30), 'client_31_credit_returned': (31, 31)}), + 'regIH_MMHUB_ERROR': (230, 0, {'ih_bresp_01': (1, 1), 'ih_bresp_10': (2, 2), 'ih_bresp_11': (3, 3), 'ih_buser_nack_01': (5, 5), 'ih_buser_nack_10': (6, 6), 'ih_buser_nack_11': (7, 7), 'ih_buser_fed': (8, 8)}), + 'regIH_MEM_POWER_CTRL': (233, 0, {'ih_buffer_mem_power_ctrl_en': (0, 0), 'ih_buffer_mem_power_ls_en': (1, 1), 'ih_buffer_mem_power_ds_en': (2, 2), 'ih_buffer_mem_power_sd_en': (3, 3), 'ih_buffer_mem_idle_hysteresis': (4, 6), 'ih_buffer_mem_power_up_recover_delay': (8, 13), 'ih_buffer_mem_power_down_ls_enter_delay': (14, 15), 'ih_retry_int_cam_mem_power_ctrl_en': (16, 16), 'ih_retry_int_cam_mem_power_ls_en': (17, 17), 'ih_retry_int_cam_mem_power_ds_en': (18, 18), 'ih_retry_int_cam_mem_power_sd_en': (19, 19), 'ih_retry_int_cam_mem_idle_hysteresis': (20, 22), 'ih_retry_int_cam_mem_power_up_recover_delay': (24, 29), 'ih_retry_int_cam_mem_power_down_ls_enter_delay': (30, 31)}), + 'regIH_RETRY_INT_CAM_CNTL': (234, 0, {'cam_size': (0, 4), 'back_pressure_skid_value': (8, 14), 'enable': (16, 16), 'back_pressure_enable': (17, 17), 'per_vf_entry_size': (20, 21)}), + 'regIH_VMID_LUT_INDEX': (236, 0, {'index': (0, 3)}), + 'regIH_MEM_POWER_CTRL2': (241, 0, {'ih_pasid_lut_mem_power_ctrl_en': (0, 0), 'ih_pasid_lut_mem_power_ls_en': (1, 1), 'ih_pasid_lut_mem_power_ds_en': (2, 2), 'ih_pasid_lut_mem_power_sd_en': (3, 3), 'ih_pasid_lut_mem_idle_hysteresis': (4, 6), 'ih_pasid_lut_mem_power_up_recover_delay': (8, 13), 'ih_pasid_lut_mem_power_down_ls_enter_delay': (14, 15)}), + 'regIH_REGISTER_LAST_PART2': (255, 0, {'reserved': (0, 31)}), + 'regIH_ACTIVE_FCN_ID': (384, 0, {'vf_id': (0, 2), 'reserved': (3, 30), 'pf_vf': (31, 31)}), + 'regIH_VIRT_RESET_REQ': (385, 0, {'vf': (0, 7), 'pf': (31, 31)}), + 'regIH_CLIENT_CFG': (388, 0, {'total_client_num': (0, 6)}), + 'regIH_CLIENT_CFG_INDEX': (392, 0, {'index': (0, 4)}), + 'regIH_CLIENT_CFG_DATA': (393, 0, {'client_type': (19, 19), 'ring_id': (20, 21), 'vf_rb_select': (22, 23), 'overwrite_ring_id_with_active_fcn_id': (24, 24), 'interface_type': (25, 25), 'die_type': (26, 26)}), + 'regIH_CLIENT_CFG_DATA2': (394, 0, {'credit_return_addr': (0, 31)}), + 'regIH_CID_REMAP_INDEX': (395, 0, {'index': (0, 2)}), + 'regIH_CID_REMAP_DATA': (396, 0, {'client_id': (0, 7), 'initiator_id': (8, 17), 'client_id_remap': (24, 31)}), + 'regIH_CHICKEN': (397, 0, {'active_fcn_id_prot_enable': (0, 0), 'mc_space_fbpa_enable': (3, 3), 'mc_space_gpa_enable': (4, 4), 'reg_firewall_enable': (5, 5)}), + 'regIH_INT_DROP_CNTL': (399, 0, {'int_drop_en': (0, 0), 'client_id_match_en': (1, 1), 'source_id_match_en': (2, 2), 'vf_id_match_en': (3, 3), 'vf_match_en': (4, 4), 'context_id_match_en': (5, 5), 'int_drop_mode': (6, 7), 'utcl2_retry_int_drop_en': (8, 8), 'int_dropped': (16, 16)}), + 'regIH_INT_DROP_MATCH_VALUE0': (400, 0, {'client_id_match_value': (0, 7), 'source_id_match_value': (8, 15), 'vf_id_match_value': (16, 19), 'vf_match_value': (23, 23), 'context_id_39_32_match_value': (24, 31)}), + 'regIH_INT_DROP_MATCH_VALUE1': (401, 0, {'context_id_31_0_match_value': (0, 31)}), + 'regIH_INT_DROP_MATCH_MASK0': (402, 0, {'client_id_match_mask': (0, 7), 'source_id_match_mask': (8, 15), 'vf_id_match_mask': (16, 19), 'vf_match_mask': (23, 23), 'context_id_39_32_match_mask': (24, 31)}), + 'regIH_INT_DROP_MATCH_MASK1': (403, 0, {'context_id_31_0_match_mask': (0, 31)}), + 'regIH_MMHUB_CNTL': (414, 0, {'unitid': (0, 5), 'iv_tlvl': (8, 11), 'wptr_wb_tlvl': (12, 15)}), + 'regIH_REGISTER_LAST_PART1': (415, 0, {'reserved': (0, 31)}), +} +osssys_6_0_0 = { + 'regIH_VMID_0_LUT': (0, 0, {'pasid': (0, 15)}), + 'regIH_VMID_1_LUT': (1, 0, {'pasid': (0, 15)}), + 'regIH_VMID_2_LUT': (2, 0, {'pasid': (0, 15)}), + 'regIH_VMID_3_LUT': (3, 0, {'pasid': (0, 15)}), + 'regIH_VMID_4_LUT': (4, 0, {'pasid': (0, 15)}), + 'regIH_VMID_5_LUT': (5, 0, {'pasid': (0, 15)}), + 'regIH_VMID_6_LUT': (6, 0, {'pasid': (0, 15)}), + 'regIH_VMID_7_LUT': (7, 0, {'pasid': (0, 15)}), + 'regIH_VMID_8_LUT': (8, 0, {'pasid': (0, 15)}), + 'regIH_VMID_9_LUT': (9, 0, {'pasid': (0, 15)}), + 'regIH_VMID_10_LUT': (10, 0, {'pasid': (0, 15)}), + 'regIH_VMID_11_LUT': (11, 0, {'pasid': (0, 15)}), + 'regIH_VMID_12_LUT': (12, 0, {'pasid': (0, 15)}), + 'regIH_VMID_13_LUT': (13, 0, {'pasid': (0, 15)}), + 'regIH_VMID_14_LUT': (14, 0, {'pasid': (0, 15)}), + 'regIH_VMID_15_LUT': (15, 0, {'pasid': (0, 15)}), + 'regIH_VMID_0_LUT_MM': (16, 0, {'pasid': (0, 15)}), + 'regIH_VMID_1_LUT_MM': (17, 0, {'pasid': (0, 15)}), + 'regIH_VMID_2_LUT_MM': (18, 0, {'pasid': (0, 15)}), + 'regIH_VMID_3_LUT_MM': (19, 0, {'pasid': (0, 15)}), + 'regIH_VMID_4_LUT_MM': (20, 0, {'pasid': (0, 15)}), + 'regIH_VMID_5_LUT_MM': (21, 0, {'pasid': (0, 15)}), + 'regIH_VMID_6_LUT_MM': (22, 0, {'pasid': (0, 15)}), + 'regIH_VMID_7_LUT_MM': (23, 0, {'pasid': (0, 15)}), + 'regIH_VMID_8_LUT_MM': (24, 0, {'pasid': (0, 15)}), + 'regIH_VMID_9_LUT_MM': (25, 0, {'pasid': (0, 15)}), + 'regIH_VMID_10_LUT_MM': (26, 0, {'pasid': (0, 15)}), + 'regIH_VMID_11_LUT_MM': (27, 0, {'pasid': (0, 15)}), + 'regIH_VMID_12_LUT_MM': (28, 0, {'pasid': (0, 15)}), + 'regIH_VMID_13_LUT_MM': (29, 0, {'pasid': (0, 15)}), + 'regIH_VMID_14_LUT_MM': (30, 0, {'pasid': (0, 15)}), + 'regIH_VMID_15_LUT_MM': (31, 0, {'pasid': (0, 15)}), + 'regIH_COOKIE_0': (32, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'ring_id': (16, 23), 'vm_id': (24, 27), 'reserved': (28, 30), 'vmid_type': (31, 31)}), + 'regIH_COOKIE_1': (33, 0, {'timestamp_31_0': (0, 31)}), + 'regIH_COOKIE_2': (34, 0, {'timestamp_47_32': (0, 15), 'reserved': (16, 30), 'timestamp_src': (31, 31)}), + 'regIH_COOKIE_3': (35, 0, {'pas_id': (0, 15), 'reserved': (16, 30), 'pasid_src': (31, 31)}), + 'regIH_COOKIE_4': (36, 0, {'context_id_31_0': (0, 31)}), + 'regIH_COOKIE_5': (37, 0, {'context_id_63_32': (0, 31)}), + 'regIH_COOKIE_6': (38, 0, {'context_id_95_64': (0, 31)}), + 'regIH_COOKIE_7': (39, 0, {'context_id_128_96': (0, 31)}), + 'regIH_REGISTER_LAST_PART0': (63, 0, {'reserved': (0, 31)}), + 'regIH_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_writeback_enable': (8, 8), 'rb_full_drain_enable': (9, 9), 'full_drain_clear': (10, 10), 'page_rb_clear': (11, 11), 'rb_used_int_threshold': (12, 15), 'wptr_overflow_enable': (16, 16), 'enable_intr': (17, 17), 'mc_swap': (18, 19), 'mc_snoop': (20, 20), 'rptr_rearm': (21, 21), 'mc_ro': (22, 22), 'mc_vmid': (24, 27), 'mc_space': (28, 30), 'wptr_overflow_clear': (31, 31)}), + 'regIH_RB_BASE': (129, 0, {'addr': (0, 31)}), + 'regIH_RB_BASE_HI': (130, 0, {'addr': (0, 7)}), + 'regIH_RB_RPTR': (131, 0, {'offset': (2, 17)}), + 'regIH_RB_WPTR': (132, 0, {'rb_overflow': (0, 0), 'offset': (2, 17), 'rb_left_none': (18, 18), 'rb_may_overflow': (19, 19)}), + 'regIH_RB_WPTR_ADDR_HI': (133, 0, {'addr': (0, 15)}), + 'regIH_RB_WPTR_ADDR_LO': (134, 0, {'addr': (2, 31)}), + 'regIH_DOORBELL_RPTR': (135, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_DOORBELL_RETRY_CAM': (136, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_RB_CNTL_RING1': (140, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'rb_full_drain_enable': (9, 9), 'full_drain_clear': (10, 10), 'page_rb_clear': (11, 11), 'rb_used_int_threshold': (12, 15), 'wptr_overflow_enable': (16, 16), 'mc_swap': (18, 19), 'mc_snoop': (20, 20), 'mc_ro': (22, 22), 'mc_vmid': (24, 27), 'mc_space': (28, 30), 'wptr_overflow_clear': (31, 31)}), + 'regIH_RB_BASE_RING1': (141, 0, {'addr': (0, 31)}), + 'regIH_RB_BASE_HI_RING1': (142, 0, {'addr': (0, 7)}), + 'regIH_RB_RPTR_RING1': (143, 0, {'offset': (2, 17)}), + 'regIH_RB_WPTR_RING1': (144, 0, {'rb_overflow': (0, 0), 'offset': (2, 17), 'rb_left_none': (18, 18), 'rb_may_overflow': (19, 19)}), + 'regIH_DOORBELL_RPTR_RING1': (147, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_RETRY_CAM_ACK': (164, 0, {'index': (0, 9)}), + 'regIH_VERSION': (165, 0, {'minver': (0, 6), 'majver': (8, 14), 'rev': (16, 21)}), + 'regIH_CNTL': (192, 0, {'wptr_writeback_timer': (0, 4), 'ih_idle_hysteresis_cntl': (6, 7), 'ih_fifo_highwater': (8, 14), 'mc_wr_clean_cnt': (20, 24)}), + 'regIH_CNTL2': (193, 0, {'self_iv_force_wptr_update_timeout': (0, 4), 'self_iv_force_wptr_update_enable': (8, 8)}), + 'regIH_STATUS': (194, 0, {'idle': (0, 0), 'input_idle': (1, 1), 'buffer_idle': (2, 2), 'rb_full': (3, 3), 'rb_full_drain': (4, 4), 'rb_overflow': (5, 5), 'mc_wr_idle': (6, 6), 'mc_wr_stall': (7, 7), 'mc_wr_clean_pending': (8, 8), 'mc_wr_clean_stall': (9, 9), 'bif_interrupt_line': (10, 10), 'switch_ready': (11, 11), 'rb1_full': (12, 12), 'rb1_full_drain': (13, 13), 'rb1_overflow': (14, 14), 'self_int_gen_idle': (18, 18), 'retry_int_cam_idle': (19, 19), 'zstates_fence': (20, 20), 'ih_buffer_mem_power_gated': (21, 21), 'ih_retry_int_cam_mem_power_gated': (22, 22), 'ih_pasid_lut_mem_power_gated': (23, 23)}), + 'regIH_PERFMON_CNTL': (195, 0, {'enable0': (0, 0), 'clear0': (1, 1), 'perf_sel0': (2, 11), 'enable1': (16, 16), 'clear1': (17, 17), 'perf_sel1': (18, 27)}), + 'regIH_PERFCOUNTER0_RESULT': (196, 0, {'perf_count': (0, 31)}), + 'regIH_PERFCOUNTER1_RESULT': (197, 0, {'perf_count': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_31_0': (199, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_63_32': (200, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_95_64': (201, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_FIELD_CONTROL': (202, 0, {'src_en': (0, 0), 'fcnid_en': (1, 1), 'timestamp_en': (2, 2), 'ringid_en': (3, 3), 'vmid_en': (4, 4), 'pasid_en': (5, 5), 'client_id_en': (6, 6)}), + 'regIH_DSM_MATCH_DATA_CONTROL': (203, 0, {'value': (0, 27)}), + 'regIH_DSM_MATCH_FCN_ID': (204, 0, {'vf_id': (0, 3), 'pf_vf': (7, 7)}), + 'regIH_LIMIT_INT_RATE_CNTL': (205, 0, {'limit_enable': (0, 0), 'perf_interval': (1, 4), 'perf_threshold': (5, 15), 'return_delay': (17, 20), 'perf_result': (21, 31)}), + 'regIH_VF_RB_STATUS': (206, 0, {'rb_full_drain_vf': (0, 15)}), + 'regIH_VF_RB_STATUS2': (207, 0, {'rb_full_vf': (0, 15)}), + 'regIH_VF_RB1_STATUS': (208, 0, {'rb_full_drain_vf': (0, 15)}), + 'regIH_VF_RB1_STATUS2': (209, 0, {'rb_full_vf': (0, 15)}), + 'regIH_RB_STATUS': (212, 0, {'rb_full': (0, 0), 'rb_full_drain': (1, 1), 'rb_overflow': (2, 2), 'rb1_full': (4, 4), 'rb1_full_drain': (5, 5), 'rb1_overflow': (6, 6)}), + 'regIH_INT_FLOOD_CNTL': (213, 0, {'highwater': (0, 2), 'flood_cntl_enable': (3, 3), 'clear_int_flood_status': (4, 4)}), + 'regIH_RB0_INT_FLOOD_STATUS': (214, 0, {'rb_int_dropped_vf': (0, 15), 'rb_int_dropped': (31, 31)}), + 'regIH_RB1_INT_FLOOD_STATUS': (215, 0, {'rb_int_dropped_vf': (0, 15), 'rb_int_dropped': (31, 31)}), + 'regIH_INT_FLOOD_STATUS': (217, 0, {'int_drop_cnt': (0, 7), 'first_drop_int_client_id': (8, 15), 'first_drop_int_source_id': (16, 23), 'first_drop_int_vf_id': (24, 27), 'first_drop_int_vf': (29, 29), 'int_dropped': (30, 30)}), + 'regIH_STORM_CLIENT_LIST_CNTL': (218, 0, {'client1_is_storm_client': (1, 1), 'client2_is_storm_client': (2, 2), 'client3_is_storm_client': (3, 3), 'client4_is_storm_client': (4, 4), 'client5_is_storm_client': (5, 5), 'client6_is_storm_client': (6, 6), 'client7_is_storm_client': (7, 7), 'client8_is_storm_client': (8, 8), 'client9_is_storm_client': (9, 9), 'client10_is_storm_client': (10, 10), 'client11_is_storm_client': (11, 11), 'client12_is_storm_client': (12, 12), 'client13_is_storm_client': (13, 13), 'client14_is_storm_client': (14, 14), 'client15_is_storm_client': (15, 15), 'client16_is_storm_client': (16, 16), 'client17_is_storm_client': (17, 17), 'client18_is_storm_client': (18, 18), 'client19_is_storm_client': (19, 19), 'client20_is_storm_client': (20, 20), 'client21_is_storm_client': (21, 21), 'client22_is_storm_client': (22, 22), 'client23_is_storm_client': (23, 23), 'client24_is_storm_client': (24, 24), 'client25_is_storm_client': (25, 25), 'client26_is_storm_client': (26, 26), 'client27_is_storm_client': (27, 27), 'client28_is_storm_client': (28, 28), 'client29_is_storm_client': (29, 29), 'client30_is_storm_client': (30, 30), 'client31_is_storm_client': (31, 31)}), + 'regIH_CLK_CTRL': (219, 0, {'ih_pasid_lut_mem_clk_soft_override': (23, 23), 'msi_storm_counter_clk_soft_override': (24, 24), 'ih_retry_int_cam_mem_clk_soft_override': (25, 25), 'ih_buffer_mem_clk_soft_override': (26, 26), 'dbus_mux_clk_soft_override': (27, 27), 'osssys_share_clk_soft_override': (28, 28), 'limit_smn_clk_soft_override': (29, 29), 'dyn_clk_soft_override': (30, 30), 'reg_clk_soft_override': (31, 31)}), + 'regIH_INT_FLAGS': (220, 0, {'client_0_flag': (0, 0), 'client_1_flag': (1, 1), 'client_2_flag': (2, 2), 'client_3_flag': (3, 3), 'client_4_flag': (4, 4), 'client_5_flag': (5, 5), 'client_6_flag': (6, 6), 'client_7_flag': (7, 7), 'client_8_flag': (8, 8), 'client_9_flag': (9, 9), 'client_10_flag': (10, 10), 'client_11_flag': (11, 11), 'client_12_flag': (12, 12), 'client_13_flag': (13, 13), 'client_14_flag': (14, 14), 'client_15_flag': (15, 15), 'client_16_flag': (16, 16), 'client_17_flag': (17, 17), 'client_18_flag': (18, 18), 'client_19_flag': (19, 19), 'client_20_flag': (20, 20), 'client_21_flag': (21, 21), 'client_22_flag': (22, 22), 'client_23_flag': (23, 23), 'client_24_flag': (24, 24), 'client_25_flag': (25, 25), 'client_26_flag': (26, 26), 'client_27_flag': (27, 27), 'client_28_flag': (28, 28), 'client_29_flag': (29, 29), 'client_30_flag': (30, 30), 'client_31_flag': (31, 31)}), + 'regIH_LAST_INT_INFO0': (221, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'ring_id': (16, 23), 'vm_id': (24, 27), 'vmid_type': (31, 31)}), + 'regIH_LAST_INT_INFO1': (222, 0, {'context_id': (0, 31)}), + 'regIH_LAST_INT_INFO2': (223, 0, {'pas_id': (0, 15), 'vf_id': (16, 19), 'vf': (23, 23)}), + 'regIH_SCRATCH': (224, 0, {'data': (0, 31)}), + 'regIH_CLIENT_CREDIT_ERROR': (225, 0, {'clear': (0, 0), 'client_1_error': (1, 1), 'client_2_error': (2, 2), 'client_3_error': (3, 3), 'client_4_error': (4, 4), 'client_5_error': (5, 5), 'client_6_error': (6, 6), 'client_7_error': (7, 7), 'client_8_error': (8, 8), 'client_9_error': (9, 9), 'client_10_error': (10, 10), 'client_11_error': (11, 11), 'client_12_error': (12, 12), 'client_13_error': (13, 13), 'client_14_error': (14, 14), 'client_15_error': (15, 15), 'client_16_error': (16, 16), 'client_17_error': (17, 17), 'client_18_error': (18, 18), 'client_19_error': (19, 19), 'client_20_error': (20, 20), 'client_21_error': (21, 21), 'client_22_error': (22, 22), 'client_23_error': (23, 23), 'client_24_error': (24, 24), 'client_25_error': (25, 25), 'client_26_error': (26, 26), 'client_27_error': (27, 27), 'client_28_error': (28, 28), 'client_29_error': (29, 29), 'client_30_error': (30, 30), 'client_31_error': (31, 31)}), + 'regIH_COOKIE_REC_VIOLATION_LOG': (228, 0, {'violation_status': (0, 0), 'client_id': (8, 15), 'initiator_id': (16, 25)}), + 'regIH_CREDIT_STATUS': (229, 0, {'client_1_credit_returned': (1, 1), 'client_2_credit_returned': (2, 2), 'client_3_credit_returned': (3, 3), 'client_4_credit_returned': (4, 4), 'client_5_credit_returned': (5, 5), 'client_6_credit_returned': (6, 6), 'client_7_credit_returned': (7, 7), 'client_8_credit_returned': (8, 8), 'client_9_credit_returned': (9, 9), 'client_10_credit_returned': (10, 10), 'client_11_credit_returned': (11, 11), 'client_12_credit_returned': (12, 12), 'client_13_credit_returned': (13, 13), 'client_14_credit_returned': (14, 14), 'client_15_credit_returned': (15, 15), 'client_16_credit_returned': (16, 16), 'client_17_credit_returned': (17, 17), 'client_18_credit_returned': (18, 18), 'client_19_credit_returned': (19, 19), 'client_20_credit_returned': (20, 20), 'client_21_credit_returned': (21, 21), 'client_22_credit_returned': (22, 22), 'client_23_credit_returned': (23, 23), 'client_24_credit_returned': (24, 24), 'client_25_credit_returned': (25, 25), 'client_26_credit_returned': (26, 26), 'client_27_credit_returned': (27, 27), 'client_28_credit_returned': (28, 28), 'client_29_credit_returned': (29, 29), 'client_30_credit_returned': (30, 30), 'client_31_credit_returned': (31, 31)}), + 'regIH_MMHUB_ERROR': (230, 0, {'ih_bresp_01': (1, 1), 'ih_bresp_10': (2, 2), 'ih_bresp_11': (3, 3), 'ih_buser_nack_01': (5, 5), 'ih_buser_nack_10': (6, 6), 'ih_buser_nack_11': (7, 7)}), + 'regIH_MEM_POWER_CTRL': (233, 0, {'ih_buffer_mem_power_ctrl_en': (0, 0), 'ih_buffer_mem_power_ls_en': (1, 1), 'ih_buffer_mem_power_ds_en': (2, 2), 'ih_buffer_mem_power_sd_en': (3, 3), 'ih_buffer_mem_idle_hysteresis': (4, 6), 'ih_buffer_mem_power_up_recover_delay': (8, 13), 'ih_buffer_mem_power_down_enter_delay': (14, 15), 'ih_retry_int_cam_mem_power_ctrl_en': (16, 16), 'ih_retry_int_cam_mem_power_ls_en': (17, 17), 'ih_retry_int_cam_mem_power_ds_en': (18, 18), 'ih_retry_int_cam_mem_power_sd_en': (19, 19), 'ih_retry_int_cam_mem_idle_hysteresis': (20, 22), 'ih_retry_int_cam_mem_power_up_recover_delay': (24, 29), 'ih_retry_int_cam_mem_power_down_enter_delay': (30, 31)}), + 'regIH_VF_RB_STATUS3': (234, 0, {'rb_overflow_vf': (0, 15)}), + 'regIH_VF_RB_STATUS4': (235, 0, {'bif_interrupt_line_vf': (0, 15)}), + 'regIH_VF_RB1_STATUS3': (236, 0, {'rb_overflow_vf': (0, 15)}), + 'regIH_RETRY_INT_CAM_CNTL': (239, 0, {'cam_size': (0, 4), 'back_pressure_skid_value': (8, 13), 'enable': (16, 16), 'mm_back_pressure_enable': (17, 17), 'gc_back_pressure_enable': (18, 18), 'per_vf_entry_size': (20, 21)}), + 'regIH_MEM_POWER_CTRL2': (240, 0, {'ih_pasid_lut_mem_power_ctrl_en': (0, 0), 'ih_pasid_lut_mem_power_ls_en': (1, 1), 'ih_pasid_lut_mem_power_ds_en': (2, 2), 'ih_pasid_lut_mem_power_sd_en': (3, 3), 'ih_pasid_lut_mem_idle_hysteresis': (4, 6), 'ih_pasid_lut_mem_power_up_recover_delay': (8, 13), 'ih_pasid_lut_mem_power_down_enter_delay': (14, 15)}), + 'regIH_MSI_STORM_CTRL': (241, 0, {'delay': (0, 11)}), + 'regIH_MSI_STORM_CLIENT_INDEX': (242, 0, {'index': (0, 2)}), + 'regIH_MSI_STORM_CLIENT_DATA': (243, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'source_id_match_enable': (16, 16), 'utcl2_page_fault_match_enable': (17, 17), 'entry_valid': (31, 31)}), + 'regIH_REGISTER_LAST_PART2': (255, 0, {'reserved': (0, 31)}), + 'regIH_CLIENT_CFG': (388, 0, {'total_client_num': (0, 5)}), + 'regIH_RING1_CLIENT_CFG_INDEX': (389, 0, {'index': (0, 2)}), + 'regIH_RING1_CLIENT_CFG_DATA': (390, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'source_id_match_enable': (16, 16)}), + 'regIH_CLIENT_CFG_INDEX': (392, 0, {'index': (0, 4)}), + 'regIH_CLIENT_CFG_DATA': (393, 0, {'client_type': (18, 19), 'vf_rb_select': (22, 23), 'interface_type': (25, 25)}), + 'regIH_CID_REMAP_INDEX': (395, 0, {'index': (0, 1)}), + 'regIH_CID_REMAP_DATA': (396, 0, {'client_id': (0, 7), 'initiator_id': (8, 17), 'client_id_remap': (24, 31)}), + 'regIH_CHICKEN': (397, 0, {'cross_trigger_enable': (2, 2), 'mc_space_fbpa_enable': (3, 3), 'mc_space_gpa_enable': (4, 4)}), + 'regIH_INT_DROP_CNTL': (399, 0, {'int_drop_en': (0, 0), 'client_id_match_en': (1, 1), 'source_id_match_en': (2, 2), 'vf_id_match_en': (3, 3), 'vf_match_en': (4, 4), 'context_id_match_en': (5, 5), 'int_drop_mode': (6, 7), 'utcl2_retry_int_drop_en': (8, 8), 'int_dropped': (16, 16)}), + 'regIH_INT_DROP_MATCH_VALUE0': (400, 0, {'client_id_match_value': (0, 7), 'source_id_match_value': (8, 15), 'vf_id_match_value': (16, 20), 'vf_match_value': (23, 23), 'context_id_39_32_match_value': (24, 31)}), + 'regIH_INT_DROP_MATCH_VALUE1': (401, 0, {'context_id_31_0_match_value': (0, 31)}), + 'regIH_INT_DROP_MATCH_MASK0': (402, 0, {'client_id_match_mask': (0, 7), 'source_id_match_mask': (8, 15), 'vf_id_match_mask': (16, 20), 'vf_match_mask': (23, 23), 'context_id_39_32_match_mask': (24, 31)}), + 'regIH_INT_DROP_MATCH_MASK1': (403, 0, {'context_id_31_0_match_mask': (0, 31)}), + 'regIH_REGISTER_LAST_PART1': (415, 0, {'reserved': (0, 31)}), +} +osssys_6_1_0 = { + 'regIH_VMID_0_LUT': (0, 0, {'pasid': (0, 15)}), + 'regIH_VMID_1_LUT': (1, 0, {'pasid': (0, 15)}), + 'regIH_VMID_2_LUT': (2, 0, {'pasid': (0, 15)}), + 'regIH_VMID_3_LUT': (3, 0, {'pasid': (0, 15)}), + 'regIH_VMID_4_LUT': (4, 0, {'pasid': (0, 15)}), + 'regIH_VMID_5_LUT': (5, 0, {'pasid': (0, 15)}), + 'regIH_VMID_6_LUT': (6, 0, {'pasid': (0, 15)}), + 'regIH_VMID_7_LUT': (7, 0, {'pasid': (0, 15)}), + 'regIH_VMID_8_LUT': (8, 0, {'pasid': (0, 15)}), + 'regIH_VMID_9_LUT': (9, 0, {'pasid': (0, 15)}), + 'regIH_VMID_10_LUT': (10, 0, {'pasid': (0, 15)}), + 'regIH_VMID_11_LUT': (11, 0, {'pasid': (0, 15)}), + 'regIH_VMID_12_LUT': (12, 0, {'pasid': (0, 15)}), + 'regIH_VMID_13_LUT': (13, 0, {'pasid': (0, 15)}), + 'regIH_VMID_14_LUT': (14, 0, {'pasid': (0, 15)}), + 'regIH_VMID_15_LUT': (15, 0, {'pasid': (0, 15)}), + 'regIH_VMID_0_LUT_MM': (16, 0, {'pasid': (0, 15)}), + 'regIH_VMID_1_LUT_MM': (17, 0, {'pasid': (0, 15)}), + 'regIH_VMID_2_LUT_MM': (18, 0, {'pasid': (0, 15)}), + 'regIH_VMID_3_LUT_MM': (19, 0, {'pasid': (0, 15)}), + 'regIH_VMID_4_LUT_MM': (20, 0, {'pasid': (0, 15)}), + 'regIH_VMID_5_LUT_MM': (21, 0, {'pasid': (0, 15)}), + 'regIH_VMID_6_LUT_MM': (22, 0, {'pasid': (0, 15)}), + 'regIH_VMID_7_LUT_MM': (23, 0, {'pasid': (0, 15)}), + 'regIH_VMID_8_LUT_MM': (24, 0, {'pasid': (0, 15)}), + 'regIH_VMID_9_LUT_MM': (25, 0, {'pasid': (0, 15)}), + 'regIH_VMID_10_LUT_MM': (26, 0, {'pasid': (0, 15)}), + 'regIH_VMID_11_LUT_MM': (27, 0, {'pasid': (0, 15)}), + 'regIH_VMID_12_LUT_MM': (28, 0, {'pasid': (0, 15)}), + 'regIH_VMID_13_LUT_MM': (29, 0, {'pasid': (0, 15)}), + 'regIH_VMID_14_LUT_MM': (30, 0, {'pasid': (0, 15)}), + 'regIH_VMID_15_LUT_MM': (31, 0, {'pasid': (0, 15)}), + 'regIH_COOKIE_0': (32, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'ring_id': (16, 23), 'vm_id': (24, 27), 'reserved': (28, 30), 'vmid_type': (31, 31)}), + 'regIH_COOKIE_1': (33, 0, {'timestamp_31_0': (0, 31)}), + 'regIH_COOKIE_2': (34, 0, {'timestamp_47_32': (0, 15), 'reserved': (16, 30), 'timestamp_src': (31, 31)}), + 'regIH_COOKIE_3': (35, 0, {'pas_id': (0, 15), 'reserved': (16, 30), 'pasid_src': (31, 31)}), + 'regIH_COOKIE_4': (36, 0, {'context_id_31_0': (0, 31)}), + 'regIH_COOKIE_5': (37, 0, {'context_id_63_32': (0, 31)}), + 'regIH_COOKIE_6': (38, 0, {'context_id_95_64': (0, 31)}), + 'regIH_COOKIE_7': (39, 0, {'context_id_128_96': (0, 31)}), + 'regIH_REGISTER_LAST_PART0': (63, 0, {'reserved': (0, 31)}), + 'regIH_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_writeback_enable': (8, 8), 'rb_full_drain_enable': (9, 9), 'full_drain_clear': (10, 10), 'page_rb_clear': (11, 11), 'rb_used_int_threshold': (12, 15), 'wptr_overflow_enable': (16, 16), 'enable_intr': (17, 17), 'mc_swap': (18, 19), 'mc_snoop': (20, 20), 'rptr_rearm': (21, 21), 'mc_ro': (22, 22), 'mc_vmid': (24, 27), 'mc_space': (28, 30), 'wptr_overflow_clear': (31, 31)}), + 'regIH_RB_RPTR': (129, 0, {'offset': (2, 17)}), + 'regIH_RB_WPTR': (130, 0, {'rb_overflow': (0, 0), 'offset': (2, 17), 'rb_left_none': (18, 18), 'rb_may_overflow': (19, 19)}), + 'regIH_RB_BASE': (131, 0, {'addr': (0, 31)}), + 'regIH_RB_BASE_HI': (132, 0, {'addr': (0, 7)}), + 'regIH_RB_WPTR_ADDR_HI': (133, 0, {'addr': (0, 15)}), + 'regIH_RB_WPTR_ADDR_LO': (134, 0, {'addr': (2, 31)}), + 'regIH_DOORBELL_RPTR': (135, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_DOORBELL_RETRY_CAM': (136, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_RB_CNTL_RING1': (140, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'rb_full_drain_enable': (9, 9), 'full_drain_clear': (10, 10), 'page_rb_clear': (11, 11), 'rb_used_int_threshold': (12, 15), 'wptr_overflow_enable': (16, 16), 'mc_swap': (18, 19), 'mc_snoop': (20, 20), 'mc_ro': (22, 22), 'mc_vmid': (24, 27), 'mc_space': (28, 30), 'wptr_overflow_clear': (31, 31)}), + 'regIH_RB_RPTR_RING1': (141, 0, {'offset': (2, 17)}), + 'regIH_RB_WPTR_RING1': (142, 0, {'rb_overflow': (0, 0), 'offset': (2, 17), 'rb_left_none': (18, 18), 'rb_may_overflow': (19, 19)}), + 'regIH_RB_BASE_RING1': (143, 0, {'addr': (0, 31)}), + 'regIH_RB_BASE_HI_RING1': (144, 0, {'addr': (0, 7)}), + 'regIH_DOORBELL_RPTR_RING1': (147, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_RETRY_CAM_ACK': (164, 0, {'index': (0, 9)}), + 'regIH_VERSION': (165, 0, {'minver': (0, 6), 'majver': (8, 14), 'rev': (16, 21)}), + 'regIH_CNTL': (168, 0, {'wptr_writeback_timer': (0, 4), 'ih_idle_hysteresis_cntl': (6, 7), 'ih_fifo_highwater': (8, 14), 'mc_wr_clean_cnt': (20, 24)}), + 'regIH_CLK_CTRL': (169, 0, {'ih_pasid_lut_mem_clk_soft_override': (23, 23), 'msi_storm_counter_clk_soft_override': (24, 24), 'ih_retry_int_cam_mem_clk_soft_override': (25, 25), 'ih_buffer_mem_clk_soft_override': (26, 26), 'dbus_mux_clk_soft_override': (27, 27), 'osssys_share_clk_soft_override': (28, 28), 'limit_smn_clk_soft_override': (29, 29), 'dyn_clk_soft_override': (30, 30), 'reg_clk_soft_override': (31, 31)}), + 'regIH_STORM_CLIENT_LIST_CNTL': (170, 0, {'client1_is_storm_client': (1, 1), 'client2_is_storm_client': (2, 2), 'client3_is_storm_client': (3, 3), 'client4_is_storm_client': (4, 4), 'client5_is_storm_client': (5, 5), 'client6_is_storm_client': (6, 6), 'client7_is_storm_client': (7, 7), 'client8_is_storm_client': (8, 8), 'client9_is_storm_client': (9, 9), 'client10_is_storm_client': (10, 10), 'client11_is_storm_client': (11, 11), 'client12_is_storm_client': (12, 12), 'client13_is_storm_client': (13, 13), 'client14_is_storm_client': (14, 14), 'client15_is_storm_client': (15, 15), 'client16_is_storm_client': (16, 16), 'client17_is_storm_client': (17, 17), 'client18_is_storm_client': (18, 18), 'client19_is_storm_client': (19, 19), 'client20_is_storm_client': (20, 20), 'client21_is_storm_client': (21, 21), 'client22_is_storm_client': (22, 22), 'client23_is_storm_client': (23, 23), 'client24_is_storm_client': (24, 24), 'client25_is_storm_client': (25, 25), 'client26_is_storm_client': (26, 26), 'client27_is_storm_client': (27, 27), 'client28_is_storm_client': (28, 28), 'client29_is_storm_client': (29, 29), 'client30_is_storm_client': (30, 30), 'client31_is_storm_client': (31, 31)}), + 'regIH_LIMIT_INT_RATE_CNTL': (171, 0, {'limit_enable': (0, 0), 'perf_interval': (1, 4), 'perf_threshold': (5, 15), 'return_delay': (17, 20), 'perf_result': (21, 31)}), + 'regIH_RETRY_INT_CAM_CNTL': (172, 0, {'cam_size': (0, 4), 'back_pressure_skid_value': (8, 13), 'per_vf_entry_size': (20, 21)}), + 'regIH_MEM_POWER_CTRL': (173, 0, {'ih_buffer_mem_power_ctrl_en': (0, 0), 'ih_buffer_mem_power_ls_en': (1, 1), 'ih_buffer_mem_power_ds_en': (2, 2), 'ih_buffer_mem_power_sd_en': (3, 3), 'ih_buffer_mem_idle_hysteresis': (4, 6), 'ih_buffer_mem_power_up_recover_delay': (8, 13), 'ih_buffer_mem_power_down_enter_delay': (14, 15), 'ih_retry_int_cam_mem_power_ctrl_en': (16, 16), 'ih_retry_int_cam_mem_power_ls_en': (17, 17), 'ih_retry_int_cam_mem_power_ds_en': (18, 18), 'ih_retry_int_cam_mem_power_sd_en': (19, 19), 'ih_retry_int_cam_mem_idle_hysteresis': (20, 22), 'ih_retry_int_cam_mem_power_up_recover_delay': (24, 29), 'ih_retry_int_cam_mem_power_down_enter_delay': (30, 31)}), + 'regIH_MEM_POWER_CTRL2': (174, 0, {'ih_pasid_lut_mem_power_ctrl_en': (0, 0), 'ih_pasid_lut_mem_power_ls_en': (1, 1), 'ih_pasid_lut_mem_power_ds_en': (2, 2), 'ih_pasid_lut_mem_power_sd_en': (3, 3), 'ih_pasid_lut_mem_idle_hysteresis': (4, 6), 'ih_pasid_lut_mem_power_up_recover_delay': (8, 13), 'ih_pasid_lut_mem_power_down_enter_delay': (14, 15)}), + 'regIH_CNTL2': (193, 0, {'self_iv_force_wptr_update_timeout': (0, 4), 'self_iv_force_wptr_update_enable': (8, 8)}), + 'regIH_STATUS': (194, 0, {'idle': (0, 0), 'input_idle': (1, 1), 'buffer_idle': (2, 2), 'rb_full': (3, 3), 'rb_full_drain': (4, 4), 'rb_overflow': (5, 5), 'mc_wr_idle': (6, 6), 'mc_wr_stall': (7, 7), 'mc_wr_clean_pending': (8, 8), 'mc_wr_clean_stall': (9, 9), 'bif_interrupt_line': (10, 10), 'switch_ready': (11, 11), 'rb1_full': (12, 12), 'rb1_full_drain': (13, 13), 'rb1_overflow': (14, 14), 'self_int_gen_idle': (18, 18), 'retry_int_cam_idle': (19, 19), 'zstates_fence': (20, 20), 'ih_buffer_mem_power_gated': (21, 21), 'ih_retry_int_cam_mem_power_gated': (22, 22), 'ih_pasid_lut_mem_power_gated': (23, 23)}), + 'regIH_PERFMON_CNTL': (195, 0, {'enable0': (0, 0), 'clear0': (1, 1), 'perf_sel0': (2, 11), 'enable1': (16, 16), 'clear1': (17, 17), 'perf_sel1': (18, 27)}), + 'regIH_PERFCOUNTER0_RESULT': (196, 0, {'perf_count': (0, 31)}), + 'regIH_PERFCOUNTER1_RESULT': (197, 0, {'perf_count': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_31_0': (199, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_63_32': (200, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_95_64': (201, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_FIELD_CONTROL': (202, 0, {'src_en': (0, 0), 'fcnid_en': (1, 1), 'timestamp_en': (2, 2), 'ringid_en': (3, 3), 'vmid_en': (4, 4), 'pasid_en': (5, 5), 'client_id_en': (6, 6)}), + 'regIH_DSM_MATCH_DATA_CONTROL': (203, 0, {'value': (0, 27)}), + 'regIH_DSM_MATCH_FCN_ID': (204, 0, {'vf_id': (0, 3), 'pf_vf': (7, 7)}), + 'regIH_VF_RB_STATUS': (206, 0, {'rb_full_drain_vf': (0, 15)}), + 'regIH_VF_RB_STATUS2': (207, 0, {'rb_full_vf': (0, 15)}), + 'regIH_VF_RB1_STATUS': (208, 0, {'rb_full_drain_vf': (0, 15)}), + 'regIH_VF_RB1_STATUS2': (209, 0, {'rb_full_vf': (0, 15)}), + 'regIH_RB_STATUS': (212, 0, {'rb_full': (0, 0), 'rb_full_drain': (1, 1), 'rb_overflow': (2, 2), 'rb1_full': (4, 4), 'rb1_full_drain': (5, 5), 'rb1_overflow': (6, 6)}), + 'regIH_INT_FLOOD_CNTL': (213, 0, {'highwater': (0, 2), 'flood_cntl_enable': (3, 3), 'clear_int_flood_status': (4, 4)}), + 'regIH_RB0_INT_FLOOD_STATUS': (214, 0, {'rb_int_dropped_vf': (0, 15), 'rb_int_dropped': (31, 31)}), + 'regIH_RB1_INT_FLOOD_STATUS': (215, 0, {'rb_int_dropped_vf': (0, 15), 'rb_int_dropped': (31, 31)}), + 'regIH_INT_FLOOD_STATUS': (217, 0, {'int_drop_cnt': (0, 7), 'first_drop_int_client_id': (8, 15), 'first_drop_int_source_id': (16, 23), 'first_drop_int_vf_id': (24, 27), 'first_drop_int_vf': (29, 29), 'int_dropped': (30, 30)}), + 'regIH_INT_FLAGS': (220, 0, {'client_0_flag': (0, 0), 'client_1_flag': (1, 1), 'client_2_flag': (2, 2), 'client_3_flag': (3, 3), 'client_4_flag': (4, 4), 'client_5_flag': (5, 5), 'client_6_flag': (6, 6), 'client_7_flag': (7, 7), 'client_8_flag': (8, 8), 'client_9_flag': (9, 9), 'client_10_flag': (10, 10), 'client_11_flag': (11, 11), 'client_12_flag': (12, 12), 'client_13_flag': (13, 13), 'client_14_flag': (14, 14), 'client_15_flag': (15, 15), 'client_16_flag': (16, 16), 'client_17_flag': (17, 17), 'client_18_flag': (18, 18), 'client_19_flag': (19, 19), 'client_20_flag': (20, 20), 'client_21_flag': (21, 21), 'client_22_flag': (22, 22), 'client_23_flag': (23, 23), 'client_24_flag': (24, 24), 'client_25_flag': (25, 25), 'client_26_flag': (26, 26), 'client_27_flag': (27, 27), 'client_28_flag': (28, 28), 'client_29_flag': (29, 29), 'client_30_flag': (30, 30), 'client_31_flag': (31, 31)}), + 'regIH_LAST_INT_INFO0': (221, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'ring_id': (16, 23), 'vm_id': (24, 27), 'vmid_type': (31, 31)}), + 'regIH_LAST_INT_INFO1': (222, 0, {'context_id': (0, 31)}), + 'regIH_LAST_INT_INFO2': (223, 0, {'pas_id': (0, 15), 'vf_id': (16, 19), 'vf': (23, 23)}), + 'regIH_SCRATCH': (224, 0, {'data': (0, 31)}), + 'regIH_CLIENT_CREDIT_ERROR': (225, 0, {'clear': (0, 0), 'client_1_error': (1, 1), 'client_2_error': (2, 2), 'client_3_error': (3, 3), 'client_4_error': (4, 4), 'client_5_error': (5, 5), 'client_6_error': (6, 6), 'client_7_error': (7, 7), 'client_8_error': (8, 8), 'client_9_error': (9, 9), 'client_10_error': (10, 10), 'client_11_error': (11, 11), 'client_12_error': (12, 12), 'client_13_error': (13, 13), 'client_14_error': (14, 14), 'client_15_error': (15, 15), 'client_16_error': (16, 16), 'client_17_error': (17, 17), 'client_18_error': (18, 18), 'client_19_error': (19, 19), 'client_20_error': (20, 20), 'client_21_error': (21, 21), 'client_22_error': (22, 22), 'client_23_error': (23, 23), 'client_24_error': (24, 24), 'client_25_error': (25, 25), 'client_26_error': (26, 26), 'client_27_error': (27, 27), 'client_28_error': (28, 28), 'client_29_error': (29, 29), 'client_30_error': (30, 30), 'client_31_error': (31, 31)}), + 'regIH_GPU_IOV_VIOLATION_LOG': (226, 0, {'violation_status': (0, 0), 'multiple_violation_status': (1, 1), 'address': (2, 19), 'opcode': (22, 22), 'vf': (23, 23), 'vf_id': (24, 27)}), + 'regIH_GPU_IOV_VIOLATION_LOG2': (227, 0, {'initiator_id': (0, 9)}), + 'regIH_COOKIE_REC_VIOLATION_LOG': (228, 0, {'violation_status': (0, 0), 'client_id': (8, 15), 'initiator_id': (16, 25)}), + 'regIH_CREDIT_STATUS': (229, 0, {'client_1_credit_returned': (1, 1), 'client_2_credit_returned': (2, 2), 'client_3_credit_returned': (3, 3), 'client_4_credit_returned': (4, 4), 'client_5_credit_returned': (5, 5), 'client_6_credit_returned': (6, 6), 'client_7_credit_returned': (7, 7), 'client_8_credit_returned': (8, 8), 'client_9_credit_returned': (9, 9), 'client_10_credit_returned': (10, 10), 'client_11_credit_returned': (11, 11), 'client_12_credit_returned': (12, 12), 'client_13_credit_returned': (13, 13), 'client_14_credit_returned': (14, 14), 'client_15_credit_returned': (15, 15), 'client_16_credit_returned': (16, 16), 'client_17_credit_returned': (17, 17), 'client_18_credit_returned': (18, 18), 'client_19_credit_returned': (19, 19), 'client_20_credit_returned': (20, 20), 'client_21_credit_returned': (21, 21), 'client_22_credit_returned': (22, 22), 'client_23_credit_returned': (23, 23), 'client_24_credit_returned': (24, 24), 'client_25_credit_returned': (25, 25), 'client_26_credit_returned': (26, 26), 'client_27_credit_returned': (27, 27), 'client_28_credit_returned': (28, 28), 'client_29_credit_returned': (29, 29), 'client_30_credit_returned': (30, 30), 'client_31_credit_returned': (31, 31)}), + 'regIH_MMHUB_ERROR': (230, 0, {'ih_bresp_01': (1, 1), 'ih_bresp_10': (2, 2), 'ih_bresp_11': (3, 3), 'ih_buser_nack_01': (5, 5), 'ih_buser_nack_10': (6, 6), 'ih_buser_nack_11': (7, 7)}), + 'regIH_VF_RB_STATUS3': (234, 0, {'rb_overflow_vf': (0, 15)}), + 'regIH_VF_RB_STATUS4': (235, 0, {'bif_interrupt_line_vf': (0, 15)}), + 'regIH_VF_RB1_STATUS3': (236, 0, {'rb_overflow_vf': (0, 15)}), + 'regIH_MSI_STORM_CTRL': (241, 0, {'delay': (0, 11)}), + 'regIH_MSI_STORM_CLIENT_INDEX': (242, 0, {'index': (0, 2)}), + 'regIH_MSI_STORM_CLIENT_DATA': (243, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'source_id_match_enable': (16, 16), 'utcl2_page_fault_match_enable': (17, 17), 'entry_valid': (31, 31)}), + 'regIH_REGISTER_LAST_PART2': (255, 0, {'reserved': (0, 31)}), + 'regIH_ACTIVE_FCN_ID': (384, 0, {'vf_id': (0, 3), 'reserved': (4, 30), 'pf_vf': (31, 31)}), + 'regIH_VIRT_RESET_REQ': (385, 0, {'vf': (0, 15), 'pf': (31, 31)}), + 'regIH_CLIENT_CFG': (388, 0, {'total_client_num': (0, 5)}), + 'regIH_RING1_CLIENT_CFG_INDEX': (389, 0, {'index': (0, 2)}), + 'regIH_RING1_CLIENT_CFG_DATA': (390, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'source_id_match_enable': (16, 16)}), + 'regIH_CLIENT_CFG_INDEX': (392, 0, {'index': (0, 4)}), + 'regIH_CLIENT_CFG_DATA': (393, 0, {'client_type': (18, 19), 'vf_rb_select': (22, 23), 'overwrite_ring_id_with_active_fcn_id': (24, 24), 'interface_type': (25, 25)}), + 'regIH_CLIENT_CFG_DATA2': (394, 0, {'credit_return_addr': (0, 31)}), + 'regIH_CID_REMAP_INDEX': (395, 0, {'index': (0, 1)}), + 'regIH_CID_REMAP_DATA': (396, 0, {'client_id': (0, 7), 'initiator_id': (8, 17), 'client_id_remap': (24, 31)}), + 'regIH_CHICKEN': (397, 0, {'active_fcn_id_prot_enable': (0, 0), 'dbgu_trigger_enable': (1, 1), 'cross_trigger_enable': (2, 2), 'mc_space_fbpa_enable': (3, 3), 'mc_space_gpa_enable': (4, 4), 'reg_firewall_enable': (5, 5)}), + 'regIH_MMHUB_CNTL': (398, 0, {'unitid': (0, 5), 'iv_tlvl': (8, 11), 'wptr_wb_tlvl': (12, 15)}), + 'regIH_INT_DROP_CNTL': (399, 0, {'int_drop_en': (0, 0), 'client_id_match_en': (1, 1), 'source_id_match_en': (2, 2), 'vf_id_match_en': (3, 3), 'vf_match_en': (4, 4), 'context_id_match_en': (5, 5), 'int_drop_mode': (6, 7), 'utcl2_retry_int_drop_en': (8, 8), 'int_dropped': (16, 16)}), + 'regIH_INT_DROP_MATCH_VALUE0': (400, 0, {'client_id_match_value': (0, 7), 'source_id_match_value': (8, 15), 'vf_id_match_value': (16, 20), 'vf_match_value': (23, 23), 'context_id_39_32_match_value': (24, 31)}), + 'regIH_INT_DROP_MATCH_VALUE1': (401, 0, {'context_id_31_0_match_value': (0, 31)}), + 'regIH_INT_DROP_MATCH_MASK0': (402, 0, {'client_id_match_mask': (0, 7), 'source_id_match_mask': (8, 15), 'vf_id_match_mask': (16, 20), 'vf_match_mask': (23, 23), 'context_id_39_32_match_mask': (24, 31)}), + 'regIH_INT_DROP_MATCH_MASK1': (403, 0, {'context_id_31_0_match_mask': (0, 31)}), + 'regIH_REGISTER_LAST_PART1': (415, 0, {'reserved': (0, 31)}), +} +osssys_7_0_0 = { + 'regIH_VMID_0_LUT': (0, 0, {'pasid': (0, 15)}), + 'regIH_VMID_1_LUT': (1, 0, {'pasid': (0, 15)}), + 'regIH_VMID_2_LUT': (2, 0, {'pasid': (0, 15)}), + 'regIH_VMID_3_LUT': (3, 0, {'pasid': (0, 15)}), + 'regIH_VMID_4_LUT': (4, 0, {'pasid': (0, 15)}), + 'regIH_VMID_5_LUT': (5, 0, {'pasid': (0, 15)}), + 'regIH_VMID_6_LUT': (6, 0, {'pasid': (0, 15)}), + 'regIH_VMID_7_LUT': (7, 0, {'pasid': (0, 15)}), + 'regIH_VMID_8_LUT': (8, 0, {'pasid': (0, 15)}), + 'regIH_VMID_9_LUT': (9, 0, {'pasid': (0, 15)}), + 'regIH_VMID_10_LUT': (10, 0, {'pasid': (0, 15)}), + 'regIH_VMID_11_LUT': (11, 0, {'pasid': (0, 15)}), + 'regIH_VMID_12_LUT': (12, 0, {'pasid': (0, 15)}), + 'regIH_VMID_13_LUT': (13, 0, {'pasid': (0, 15)}), + 'regIH_VMID_14_LUT': (14, 0, {'pasid': (0, 15)}), + 'regIH_VMID_15_LUT': (15, 0, {'pasid': (0, 15)}), + 'regIH_VMID_0_LUT_MM': (16, 0, {'pasid': (0, 15)}), + 'regIH_VMID_1_LUT_MM': (17, 0, {'pasid': (0, 15)}), + 'regIH_VMID_2_LUT_MM': (18, 0, {'pasid': (0, 15)}), + 'regIH_VMID_3_LUT_MM': (19, 0, {'pasid': (0, 15)}), + 'regIH_VMID_4_LUT_MM': (20, 0, {'pasid': (0, 15)}), + 'regIH_VMID_5_LUT_MM': (21, 0, {'pasid': (0, 15)}), + 'regIH_VMID_6_LUT_MM': (22, 0, {'pasid': (0, 15)}), + 'regIH_VMID_7_LUT_MM': (23, 0, {'pasid': (0, 15)}), + 'regIH_VMID_8_LUT_MM': (24, 0, {'pasid': (0, 15)}), + 'regIH_VMID_9_LUT_MM': (25, 0, {'pasid': (0, 15)}), + 'regIH_VMID_10_LUT_MM': (26, 0, {'pasid': (0, 15)}), + 'regIH_VMID_11_LUT_MM': (27, 0, {'pasid': (0, 15)}), + 'regIH_VMID_12_LUT_MM': (28, 0, {'pasid': (0, 15)}), + 'regIH_VMID_13_LUT_MM': (29, 0, {'pasid': (0, 15)}), + 'regIH_VMID_14_LUT_MM': (30, 0, {'pasid': (0, 15)}), + 'regIH_VMID_15_LUT_MM': (31, 0, {'pasid': (0, 15)}), + 'regIH_COOKIE_0': (32, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'ring_id': (16, 23), 'vm_id': (24, 27), 'reserved': (28, 30), 'vmid_type': (31, 31)}), + 'regIH_COOKIE_1': (33, 0, {'timestamp_31_0': (0, 31)}), + 'regIH_COOKIE_2': (34, 0, {'timestamp_47_32': (0, 15), 'reserved': (16, 30), 'timestamp_src': (31, 31)}), + 'regIH_COOKIE_3': (35, 0, {'pas_id': (0, 15), 'reserved': (16, 30), 'pasid_src': (31, 31)}), + 'regIH_COOKIE_4': (36, 0, {'context_id_31_0': (0, 31)}), + 'regIH_COOKIE_5': (37, 0, {'context_id_63_32': (0, 31)}), + 'regIH_COOKIE_6': (38, 0, {'context_id_95_64': (0, 31)}), + 'regIH_COOKIE_7': (39, 0, {'context_id_128_96': (0, 31)}), + 'regIH_REGISTER_LAST_PART0': (63, 0, {'reserved': (0, 31)}), + 'regIH_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'wptr_writeback_enable': (8, 8), 'rb_full_drain_enable': (9, 9), 'full_drain_clear': (10, 10), 'page_rb_clear': (11, 11), 'rb_used_int_threshold': (12, 15), 'wptr_overflow_enable': (16, 16), 'enable_intr': (17, 17), 'mc_swap': (18, 19), 'mc_snoop': (20, 20), 'rptr_rearm': (21, 21), 'mc_ro': (22, 22), 'mc_vmid': (24, 27), 'mc_space': (28, 30), 'wptr_overflow_clear': (31, 31)}), + 'regIH_RB_RPTR': (129, 0, {'offset': (2, 17)}), + 'regIH_RB_WPTR': (130, 0, {'rb_overflow': (0, 0), 'offset': (2, 17), 'rb_left_none': (18, 18), 'rb_may_overflow': (19, 19)}), + 'regIH_RB_BASE': (131, 0, {'addr': (0, 31)}), + 'regIH_RB_BASE_HI': (132, 0, {'addr': (0, 7)}), + 'regIH_RB_WPTR_ADDR_HI': (133, 0, {'addr': (0, 15)}), + 'regIH_RB_WPTR_ADDR_LO': (134, 0, {'addr': (2, 31)}), + 'regIH_DOORBELL_RPTR': (135, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_DOORBELL_RETRY_CAM': (136, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_RB_CNTL_RING1': (140, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'rb_full_drain_enable': (9, 9), 'full_drain_clear': (10, 10), 'page_rb_clear': (11, 11), 'rb_used_int_threshold': (12, 15), 'wptr_overflow_enable': (16, 16), 'mc_swap': (18, 19), 'mc_snoop': (20, 20), 'mc_ro': (22, 22), 'mc_vmid': (24, 27), 'mc_space': (28, 30), 'wptr_overflow_clear': (31, 31)}), + 'regIH_RB_RPTR_RING1': (141, 0, {'offset': (2, 17)}), + 'regIH_RB_WPTR_RING1': (142, 0, {'rb_overflow': (0, 0), 'offset': (2, 17), 'rb_left_none': (18, 18), 'rb_may_overflow': (19, 19)}), + 'regIH_RB_BASE_RING1': (143, 0, {'addr': (0, 31)}), + 'regIH_RB_BASE_HI_RING1': (144, 0, {'addr': (0, 7)}), + 'regIH_DOORBELL_RPTR_RING1': (147, 0, {'offset': (0, 25), 'enable': (28, 28)}), + 'regIH_RETRY_CAM_ACK': (164, 0, {'index': (0, 9)}), + 'regIH_VERSION': (165, 0, {'minver': (0, 6), 'majver': (8, 14), 'rev': (16, 21)}), + 'regIH_CNTL': (168, 0, {'wptr_writeback_timer': (0, 4), 'ih_idle_hysteresis_cntl': (6, 7), 'ih_fifo_highwater': (8, 14), 'mc_wr_clean_cnt': (20, 24)}), + 'regIH_CLK_CTRL': (169, 0, {'ih_pasid_lut_mem_clk_soft_override': (23, 23), 'msi_storm_counter_clk_soft_override': (24, 24), 'ih_retry_int_cam_mem_clk_soft_override': (25, 25), 'ih_buffer_mem_clk_soft_override': (26, 26), 'dbus_mux_clk_soft_override': (27, 27), 'osssys_share_clk_soft_override': (28, 28), 'limit_smn_clk_soft_override': (29, 29), 'dyn_clk_soft_override': (30, 30), 'reg_clk_soft_override': (31, 31)}), + 'regIH_STORM_CLIENT_LIST_CNTL': (170, 0, {'client1_is_storm_client': (1, 1), 'client2_is_storm_client': (2, 2), 'client3_is_storm_client': (3, 3), 'client4_is_storm_client': (4, 4), 'client5_is_storm_client': (5, 5), 'client6_is_storm_client': (6, 6), 'client7_is_storm_client': (7, 7), 'client8_is_storm_client': (8, 8), 'client9_is_storm_client': (9, 9), 'client10_is_storm_client': (10, 10), 'client11_is_storm_client': (11, 11), 'client12_is_storm_client': (12, 12), 'client13_is_storm_client': (13, 13), 'client14_is_storm_client': (14, 14), 'client15_is_storm_client': (15, 15), 'client16_is_storm_client': (16, 16), 'client17_is_storm_client': (17, 17), 'client18_is_storm_client': (18, 18), 'client19_is_storm_client': (19, 19), 'client20_is_storm_client': (20, 20), 'client21_is_storm_client': (21, 21), 'client22_is_storm_client': (22, 22), 'client23_is_storm_client': (23, 23), 'client24_is_storm_client': (24, 24), 'client25_is_storm_client': (25, 25), 'client26_is_storm_client': (26, 26), 'client27_is_storm_client': (27, 27), 'client28_is_storm_client': (28, 28), 'client29_is_storm_client': (29, 29), 'client30_is_storm_client': (30, 30), 'client31_is_storm_client': (31, 31)}), + 'regIH_LIMIT_INT_RATE_CNTL': (171, 0, {'limit_enable': (0, 0), 'perf_interval': (1, 4), 'perf_threshold': (5, 15), 'return_delay': (17, 20), 'perf_result': (21, 31)}), + 'regIH_RETRY_INT_CAM_CNTL': (172, 0, {'cam_size': (0, 4), 'back_pressure_skid_value': (8, 13), 'enable': (16, 16), 'mm_back_pressure_enable': (17, 17), 'gc_back_pressure_enable': (18, 18), 'per_vf_entry_size': (20, 21)}), + 'regIH_MEM_POWER_CTRL': (173, 0, {'ih_buffer_mem_power_ctrl_en': (0, 0), 'ih_buffer_mem_power_ls_en': (1, 1), 'ih_buffer_mem_power_ds_en': (2, 2), 'ih_buffer_mem_power_sd_en': (3, 3), 'ih_buffer_mem_idle_hysteresis': (4, 6), 'ih_buffer_mem_power_up_recover_delay': (8, 13), 'ih_buffer_mem_power_down_enter_delay': (14, 15), 'ih_retry_int_cam_mem_power_ctrl_en': (16, 16), 'ih_retry_int_cam_mem_power_ls_en': (17, 17), 'ih_retry_int_cam_mem_power_ds_en': (18, 18), 'ih_retry_int_cam_mem_power_sd_en': (19, 19), 'ih_retry_int_cam_mem_idle_hysteresis': (20, 22), 'ih_retry_int_cam_mem_power_up_recover_delay': (24, 29), 'ih_retry_int_cam_mem_power_down_enter_delay': (30, 31)}), + 'regIH_MEM_POWER_CTRL2': (174, 0, {'ih_pasid_lut_mem_power_ctrl_en': (0, 0), 'ih_pasid_lut_mem_power_ls_en': (1, 1), 'ih_pasid_lut_mem_power_ds_en': (2, 2), 'ih_pasid_lut_mem_power_sd_en': (3, 3), 'ih_pasid_lut_mem_idle_hysteresis': (4, 6), 'ih_pasid_lut_mem_power_up_recover_delay': (8, 13), 'ih_pasid_lut_mem_power_down_enter_delay': (14, 15)}), + 'regIH_CNTL2': (193, 0, {'self_iv_force_wptr_update_timeout': (0, 4), 'self_iv_force_wptr_update_enable': (8, 8)}), + 'regIH_STATUS': (194, 0, {'idle': (0, 0), 'input_idle': (1, 1), 'buffer_idle': (2, 2), 'rb_full': (3, 3), 'rb_full_drain': (4, 4), 'rb_overflow': (5, 5), 'mc_wr_idle': (6, 6), 'mc_wr_stall': (7, 7), 'mc_wr_clean_pending': (8, 8), 'mc_wr_clean_stall': (9, 9), 'bif_interrupt_line': (10, 10), 'switch_ready': (11, 11), 'rb1_full': (12, 12), 'rb1_full_drain': (13, 13), 'rb1_overflow': (14, 14), 'self_int_gen_idle': (18, 18), 'retry_int_cam_idle': (19, 19), 'zstates_fence': (20, 20), 'ih_buffer_mem_power_gated': (21, 21), 'ih_retry_int_cam_mem_power_gated': (22, 22), 'ih_pasid_lut_mem_power_gated': (23, 23)}), + 'regIH_PERFMON_CNTL': (195, 0, {'enable0': (0, 0), 'clear0': (1, 1), 'perf_sel0': (2, 11), 'enable1': (16, 16), 'clear1': (17, 17), 'perf_sel1': (18, 27)}), + 'regIH_PERFCOUNTER0_RESULT': (196, 0, {'perf_count': (0, 31)}), + 'regIH_PERFCOUNTER1_RESULT': (197, 0, {'perf_count': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_31_0': (199, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_63_32': (200, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_VALUE_BIT_95_64': (201, 0, {'value': (0, 31)}), + 'regIH_DSM_MATCH_FIELD_CONTROL': (202, 0, {'src_en': (0, 0), 'fcnid_en': (1, 1), 'timestamp_en': (2, 2), 'ringid_en': (3, 3), 'vmid_en': (4, 4), 'pasid_en': (5, 5), 'client_id_en': (6, 6), 'dieid_en': (7, 7)}), + 'regIH_DSM_MATCH_DATA_CONTROL': (203, 0, {'value': (0, 27)}), + 'regIH_DSM_MATCH_FCN_ID': (204, 0, {'vf_id': (0, 4), 'pf_vf': (7, 7)}), + 'regIH_VF_RB_STATUS': (206, 0, {'rb_full_drain_vf': (0, 23)}), + 'regIH_VF_RB_STATUS2': (207, 0, {'rb_full_vf': (0, 23)}), + 'regIH_VF_RB1_STATUS': (208, 0, {'rb_full_drain_vf': (0, 23)}), + 'regIH_VF_RB1_STATUS2': (209, 0, {'rb_full_vf': (0, 23)}), + 'regIH_RB_STATUS': (212, 0, {'rb_full': (0, 0), 'rb_full_drain': (1, 1), 'rb_overflow': (2, 2), 'rb1_full': (4, 4), 'rb1_full_drain': (5, 5), 'rb1_overflow': (6, 6)}), + 'regIH_INT_FLOOD_CNTL': (213, 0, {'highwater': (0, 2), 'flood_cntl_enable': (3, 3), 'clear_int_flood_status': (4, 4)}), + 'regIH_RB0_INT_FLOOD_STATUS': (214, 0, {'rb_int_dropped_vf': (0, 23), 'rb_int_dropped': (31, 31)}), + 'regIH_RB1_INT_FLOOD_STATUS': (215, 0, {'rb_int_dropped_vf': (0, 23), 'rb_int_dropped': (31, 31)}), + 'regIH_INT_FLOOD_STATUS': (217, 0, {'int_drop_cnt': (0, 7), 'first_drop_int_client_id': (8, 15), 'first_drop_int_source_id': (16, 23), 'first_drop_int_vf_id': (24, 28), 'first_drop_int_vf': (29, 29), 'int_dropped': (30, 30)}), + 'regIH_INT_FLAGS': (220, 0, {'client_0_flag': (0, 0), 'client_1_flag': (1, 1), 'client_2_flag': (2, 2), 'client_3_flag': (3, 3), 'client_4_flag': (4, 4), 'client_5_flag': (5, 5), 'client_6_flag': (6, 6), 'client_7_flag': (7, 7), 'client_8_flag': (8, 8), 'client_9_flag': (9, 9), 'client_10_flag': (10, 10), 'client_11_flag': (11, 11), 'client_12_flag': (12, 12), 'client_13_flag': (13, 13), 'client_14_flag': (14, 14), 'client_15_flag': (15, 15), 'client_16_flag': (16, 16), 'client_17_flag': (17, 17), 'client_18_flag': (18, 18), 'client_19_flag': (19, 19), 'client_20_flag': (20, 20), 'client_21_flag': (21, 21), 'client_22_flag': (22, 22), 'client_23_flag': (23, 23), 'client_24_flag': (24, 24), 'client_25_flag': (25, 25), 'client_26_flag': (26, 26), 'client_27_flag': (27, 27), 'client_28_flag': (28, 28), 'client_29_flag': (29, 29), 'client_30_flag': (30, 30), 'client_31_flag': (31, 31)}), + 'regIH_SCRATCH': (224, 0, {'data': (0, 31)}), + 'regIH_CLIENT_CREDIT_ERROR': (225, 0, {'clear': (0, 0), 'client_1_error': (1, 1), 'client_2_error': (2, 2), 'client_3_error': (3, 3), 'client_4_error': (4, 4), 'client_5_error': (5, 5), 'client_6_error': (6, 6), 'client_7_error': (7, 7), 'client_8_error': (8, 8), 'client_9_error': (9, 9), 'client_10_error': (10, 10), 'client_11_error': (11, 11), 'client_12_error': (12, 12), 'client_13_error': (13, 13), 'client_14_error': (14, 14), 'client_15_error': (15, 15), 'client_16_error': (16, 16), 'client_17_error': (17, 17), 'client_18_error': (18, 18), 'client_19_error': (19, 19), 'client_20_error': (20, 20), 'client_21_error': (21, 21), 'client_22_error': (22, 22), 'client_23_error': (23, 23), 'client_24_error': (24, 24), 'client_25_error': (25, 25), 'client_26_error': (26, 26), 'client_27_error': (27, 27), 'client_28_error': (28, 28), 'client_29_error': (29, 29), 'client_30_error': (30, 30), 'client_31_error': (31, 31)}), + 'regIH_GPU_IOV_VIOLATION_LOG': (226, 0, {'violation_status': (0, 0), 'multiple_violation_status': (1, 1), 'address': (2, 19), 'opcode': (22, 22), 'vf': (23, 23), 'vf_id': (24, 28)}), + 'regIH_GPU_IOV_VIOLATION_LOG2': (227, 0, {'initiator_id': (0, 9)}), + 'regIH_COOKIE_REC_VIOLATION_LOG': (228, 0, {'violation_status': (0, 0), 'client_id': (8, 15), 'initiator_id': (16, 25), 'die_id': (26, 29)}), + 'regIH_CREDIT_STATUS': (229, 0, {'client_1_credit_returned': (1, 1), 'client_2_credit_returned': (2, 2), 'client_3_credit_returned': (3, 3), 'client_4_credit_returned': (4, 4), 'client_5_credit_returned': (5, 5), 'client_6_credit_returned': (6, 6), 'client_7_credit_returned': (7, 7), 'client_8_credit_returned': (8, 8), 'client_9_credit_returned': (9, 9), 'client_10_credit_returned': (10, 10), 'client_11_credit_returned': (11, 11), 'client_12_credit_returned': (12, 12), 'client_13_credit_returned': (13, 13), 'client_14_credit_returned': (14, 14), 'client_15_credit_returned': (15, 15), 'client_16_credit_returned': (16, 16), 'client_17_credit_returned': (17, 17), 'client_18_credit_returned': (18, 18), 'client_19_credit_returned': (19, 19), 'client_20_credit_returned': (20, 20), 'client_21_credit_returned': (21, 21), 'client_22_credit_returned': (22, 22), 'client_23_credit_returned': (23, 23), 'client_24_credit_returned': (24, 24), 'client_25_credit_returned': (25, 25), 'client_26_credit_returned': (26, 26), 'client_27_credit_returned': (27, 27), 'client_28_credit_returned': (28, 28), 'client_29_credit_returned': (29, 29), 'client_30_credit_returned': (30, 30), 'client_31_credit_returned': (31, 31)}), + 'regIH_MMHUB_ERROR': (230, 0, {'ih_bresp_01': (1, 1), 'ih_bresp_10': (2, 2), 'ih_bresp_11': (3, 3), 'ih_buser_nack_01': (5, 5), 'ih_buser_nack_10': (6, 6), 'ih_buser_nack_11': (7, 7)}), + 'regIH_VF_RB_STATUS3': (234, 0, {'rb_overflow_vf': (0, 23)}), + 'regIH_VF_RB_STATUS4': (235, 0, {'bif_interrupt_line_vf': (0, 23)}), + 'regIH_VF_RB1_STATUS3': (236, 0, {'rb_overflow_vf': (0, 23)}), + 'regIH_MSI_STORM_CTRL': (241, 0, {'delay': (0, 11)}), + 'regIH_MSI_STORM_CLIENT_INDEX': (242, 0, {'index': (0, 2)}), + 'regIH_MSI_STORM_CLIENT_DATA': (243, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'source_id_match_enable': (16, 16), 'utcl2_page_fault_match_enable': (17, 17), 'entry_valid': (31, 31)}), + 'regIH_LAST_INT_INFO0': (249, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'ring_id': (16, 23), 'vm_id': (24, 27), 'vmid_type': (31, 31)}), + 'regIH_LAST_INT_INFO1': (250, 0, {'context_id': (0, 31)}), + 'regIH_LAST_INT_INFO2': (251, 0, {'pas_id': (0, 15), 'vf_id': (16, 20), 'vf': (23, 23)}), + 'regIH_REGISTER_LAST_PART2': (255, 0, {'reserved': (0, 31)}), + 'regIH_ACTIVE_FCN_ID': (384, 0, {'vf_id': (0, 4), 'reserved': (5, 30), 'pf_vf': (31, 31)}), + 'regIH_VIRT_RESET_REQ': (385, 0, {'vf': (0, 23), 'pf': (31, 31)}), + 'regIH_CLIENT_CFG': (386, 0, {'total_client_num': (0, 4)}), + 'regIH_RING1_CLIENT_CFG_INDEX': (387, 0, {'index': (0, 2)}), + 'regIH_RING1_CLIENT_CFG_DATA': (388, 0, {'client_id': (0, 7), 'source_id': (8, 15), 'source_id_match_enable': (16, 16)}), + 'regIH_CLIENT_CFG_INDEX': (389, 0, {'index': (0, 4)}), + 'regIH_CLIENT_CFG_DATA': (390, 0, {'client_type': (18, 19), 'vf_rb_select': (22, 23), 'overwrite_ring_id_with_active_fcn_id': (24, 24), 'interface_type': (25, 25)}), + 'regIH_CLIENT_CFG_DATA2': (391, 0, {'credit_return_addr': (0, 31)}), + 'regIH_CID_REMAP_INDEX': (392, 0, {'index': (0, 1)}), + 'regIH_CID_REMAP_DATA': (393, 0, {'client_id': (0, 7), 'initiator_id': (8, 17), 'client_id_remap': (24, 31)}), + 'regIH_CHICKEN': (394, 0, {'active_fcn_id_prot_enable': (0, 0), 'dbgu_trigger_enable': (1, 1), 'cross_trigger_enable': (2, 2), 'mc_space_fbpa_enable': (3, 3), 'mc_space_gpa_enable': (4, 4), 'reg_firewall_enable': (5, 5)}), + 'regIH_INT_DROP_CNTL': (396, 0, {'int_drop_en': (0, 0), 'client_id_match_en': (1, 1), 'source_id_match_en': (2, 2), 'vf_id_match_en': (3, 3), 'vf_match_en': (4, 4), 'context_id_match_en': (5, 5), 'int_drop_mode': (6, 7), 'utcl2_retry_int_drop_en': (8, 8), 'int_dropped': (16, 16)}), + 'regIH_INT_DROP_MATCH_VALUE0': (397, 0, {'client_id_match_value': (0, 7), 'source_id_match_value': (8, 15), 'vf_id_match_value': (16, 20), 'vf_match_value': (23, 23), 'context_id_39_32_match_value': (24, 31)}), + 'regIH_INT_DROP_MATCH_VALUE1': (398, 0, {'context_id_31_0_match_value': (0, 31)}), + 'regIH_INT_DROP_MATCH_MASK0': (399, 0, {'client_id_match_mask': (0, 7), 'source_id_match_mask': (8, 15), 'vf_id_match_mask': (16, 20), 'vf_match_mask': (23, 23), 'context_id_39_32_match_mask': (24, 31)}), + 'regIH_INT_DROP_MATCH_MASK1': (400, 0, {'context_id_31_0_match_mask': (0, 31)}), + 'regIH_MMHUB_CNTL': (423, 0, {'unitid': (0, 5), 'iv_tlvl': (8, 11), 'wptr_wb_tlvl': (12, 15)}), + 'regIH_REGISTER_LAST_PART1': (424, 0, {'reserved': (0, 31)}), +} +sdma_4_4_2 = { + 'regSDMA_CNTL': (109, 0, {'trap_enable': (0, 0), 'utc_l1_enable': (1, 1), 'sem_wait_int_enable': (2, 2), 'data_swap_enable': (3, 3), 'fence_swap_enable': (4, 4), 'midcmd_preempt_enable': (5, 5), 'midcmd_expire_enable': (6, 6), 'reg_write_protect_int_enable': (7, 7), 'invalid_doorbell_int_enable': (8, 8), 'vm_hole_int_enable': (9, 9), 'dram_ecc_int_enable': (10, 10), 'page_retry_timeout_int_enable': (11, 11), 'page_null_int_enable': (12, 12), 'page_fault_int_enable': (13, 13), 'nack_gen_err_int_enable': (14, 14), 'midcmd_worldswitch_enable': (17, 17), 'auto_ctxsw_enable': (18, 18), 'drm_restore_enable': (19, 19), 'ctxempty_int_enable': (28, 28), 'frozen_int_enable': (29, 29), 'ib_preempt_int_enable': (30, 30), 'rb_preempt_int_enable': (31, 31)}), + 'regSDMA_GFX_RB_CNTL': (128, 0, {'rb_enable': (0, 0), 'rb_size': (1, 5), 'rb_swap_enable': (9, 9), 'rptr_writeback_enable': (12, 12), 'rptr_writeback_swap_enable': (13, 13), 'rptr_writeback_timer': (16, 20), 'rb_priv': (23, 23), 'rb_vmid': (24, 27)}), + 'regSDMA_GFX_RB_BASE': (129, 0, {'addr': (0, 31)}), + 'regSDMA_GFX_RB_BASE_HI': (130, 0, {'addr': (0, 23)}), + 'regSDMA_GFX_RB_RPTR': (131, 0, {'offset': (0, 31)}), + 'regSDMA_GFX_RB_RPTR_HI': (132, 0, {'offset': (0, 31)}), + 'regSDMA_GFX_RB_WPTR': (133, 0, {'offset': (0, 31)}), + 'regSDMA_GFX_RB_WPTR_HI': (134, 0, {'offset': (0, 31)}), + 'regSDMA_GFX_RB_WPTR_POLL_CNTL': (135, 0, {'enable': (0, 0), 'swap_enable': (1, 1), 'f32_poll_enable': (2, 2), 'frequency': (4, 15), 'idle_poll_count': (16, 31)}), + 'regSDMA_GFX_RB_RPTR_ADDR_HI': (136, 0, {'addr': (0, 31)}), + 'regSDMA_GFX_RB_RPTR_ADDR_LO': (137, 0, {'rptr_wb_idle': (0, 0), 'addr': (2, 31)}), + 'regSDMA_GFX_IB_CNTL': (138, 0, {'ib_enable': (0, 0), 'ib_swap_enable': (4, 4), 'switch_inside_ib': (8, 8), 'cmd_vmid': (16, 19), 'ib_priv': (31, 31)}), + 'regSDMA_GFX_IB_RPTR': (139, 0, {'offset': (2, 21)}), + 'regSDMA_GFX_IB_OFFSET': (140, 0, {'offset': (2, 21)}), + 'regSDMA_GFX_IB_BASE_LO': (141, 0, {'addr': (5, 31)}), + 'regSDMA_GFX_IB_BASE_HI': (142, 0, {'addr': (0, 31)}), + 'regSDMA_GFX_IB_SIZE': (143, 0, {'size': (0, 19)}), + 'regSDMA_GFX_SKIP_CNTL': (144, 0, {'skip_count': (0, 19)}), + 'regSDMA_GFX_CONTEXT_STATUS': (145, 0, {'selected': (0, 0), 'idle': (2, 2), 'expired': (3, 3), 'exception': (4, 6), 'ctxsw_able': (7, 7), 'ctxsw_ready': (8, 8), 'preempted': (9, 9), 'preempt_disable': (10, 10)}), + 'regSDMA_GFX_DOORBELL': (146, 0, {'enable': (28, 28), 'captured': (30, 30)}), + 'regSDMA_GFX_CONTEXT_CNTL': (147, 0, {'resume_ctx': (16, 16), 'session_sel': (24, 27)}), + 'regSDMA_GFX_STATUS': (168, 0, {'wptr_update_fail_count': (0, 7), 'wptr_update_pending': (8, 8)}), + 'regSDMA_GFX_DOORBELL_LOG': (169, 0, {'be_error': (0, 0), 'data': (2, 31)}), + 'regSDMA_GFX_WATERMARK': (170, 0, {'rd_outstanding': (0, 11), 'wr_outstanding': (16, 25)}), + 'regSDMA_GFX_DOORBELL_OFFSET': (171, 0, {'offset': (2, 27)}), + 'regSDMA_GFX_CSA_ADDR_LO': (172, 0, {'addr': (2, 31)}), + 'regSDMA_GFX_CSA_ADDR_HI': (173, 0, {'addr': (0, 31)}), + 'regSDMA_GFX_IB_SUB_REMAIN': (175, 0, {'size': (0, 19)}), + 'regSDMA_GFX_PREEMPT': (176, 0, {'ib_preempt': (0, 0)}), + 'regSDMA_GFX_DUMMY_REG': (177, 0, {'dummy': (0, 31)}), + 'regSDMA_GFX_RB_WPTR_POLL_ADDR_HI': (178, 0, {'addr': (0, 31)}), + 'regSDMA_GFX_RB_WPTR_POLL_ADDR_LO': (179, 0, {'addr': (2, 31)}), + 'regSDMA_GFX_RB_AQL_CNTL': (180, 0, {'aql_enable': (0, 0), 'aql_packet_size': (1, 7), 'packet_step': (8, 15)}), + 'regSDMA_GFX_MINOR_PTR_UPDATE': (181, 0, {'enable': (0, 0)}), + 'regSDMA_GFX_MIDCMD_DATA0': (192, 0, {'data0': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA1': (193, 0, {'data1': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA2': (194, 0, {'data2': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA3': (195, 0, {'data3': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA4': (196, 0, {'data4': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA5': (197, 0, {'data5': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA6': (198, 0, {'data6': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA7': (199, 0, {'data7': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA8': (200, 0, {'data8': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA9': (201, 0, {'data9': (0, 31)}), + 'regSDMA_GFX_MIDCMD_DATA10': (202, 0, {'data10': (0, 31)}), + 'regSDMA_GFX_MIDCMD_CNTL': (203, 0, {'data_valid': (0, 0), 'copy_mode': (1, 1), 'split_state': (4, 7), 'allow_preempt': (8, 8)}), +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_4_0_0.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_4_0_0.py new file mode 100644 index 000000000..ff2760c23 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_4_0_0.py @@ -0,0 +1,2434 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG(c.Struct): + SIZE = 28 + HEADER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION + COUNT_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION + PARAMETER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION + SRC_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION + SRC_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + extra_info: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('extra_info', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION(c.Struct): + SIZE = 4 + count: int + reserved_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION.register_fields([('count', ctypes.c_uint32, 0, 22, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 6), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION(c.Struct): + SIZE = 4 + reserved_0: int + dst_swap: int + reserved_1: int + src_swap: int + reserved_2: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION.register_fields([('reserved_0', ctypes.c_uint32, 0, 16, 0), ('dst_swap', ctypes.c_uint32, 2, 2, 0), ('reserved_1', ctypes.c_uint32, 2, 6, 2), ('src_swap', ctypes.c_uint32, 3, 2, 0), ('reserved_2', ctypes.c_uint32, 3, 6, 2), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION(c.Struct): + SIZE = 4 + src_addr_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION.register_fields([('src_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION(c.Struct): + SIZE = 4 + src_addr_63_32: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION.register_fields([('src_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION, 0), ('COUNT_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION, 4), ('PARAMETER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION, 8), ('SRC_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION, 12), ('SRC_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION, 16), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION, 20), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION, 24)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR: TypeAlias = rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG(c.Struct): + SIZE = 52 + HEADER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION + SRC_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION + SRC_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION + SRC_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION + SRC_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION + SRC_PARAMETER_3_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION + DST_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION + DST_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION + DST_PARAMETER_3_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION + RECT_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION + RECT_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved: int + element: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved', ctypes.c_uint32, 2, 13, 0), ('element', ctypes.c_uint32, 3, 3, 5), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION(c.Struct): + SIZE = 4 + src_addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION.register_fields([('src_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION(c.Struct): + SIZE = 4 + src_addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION.register_fields([('src_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + src_offset_x: int + reserved_1: int + src_offset_y: int + reserved_2: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION.register_fields([('src_offset_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('src_offset_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + src_offset_z: int + reserved_1: int + src_pitch: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION.register_fields([('src_offset_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 3), ('src_pitch', ctypes.c_uint32, 1, 19, 5), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION(c.Struct): + SIZE = 4 + src_slice_pitch: int + reserved_1: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION.register_fields([('src_slice_pitch', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_7_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_7_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + dst_offset_x: int + reserved_1: int + dst_offset_y: int + reserved_2: int + DW_8_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION.register_fields([('dst_offset_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('dst_offset_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_8_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + dst_offset_z: int + reserved_1: int + dst_pitch: int + DW_9_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION.register_fields([('dst_offset_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 3), ('dst_pitch', ctypes.c_uint32, 1, 19, 5), ('DW_9_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION(c.Struct): + SIZE = 4 + dst_slice_pitch: int + reserved_1: int + DW_10_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION.register_fields([('dst_slice_pitch', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_10_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + rect_x: int + reserved_1: int + rect_y: int + reserved_2: int + DW_11_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION.register_fields([('rect_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('rect_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_11_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + rect_z: int + reserved_1: int + dst_swap: int + reserved_2: int + src_swap: int + reserved_3: int + DW_12_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION.register_fields([('rect_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 5, 3), ('dst_swap', ctypes.c_uint32, 2, 2, 0), ('reserved_2', ctypes.c_uint32, 2, 6, 2), ('src_swap', ctypes.c_uint32, 3, 2, 0), ('reserved_3', ctypes.c_uint32, 3, 6, 2), ('DW_12_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION, 0), ('SRC_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION, 4), ('SRC_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION, 8), ('SRC_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION, 12), ('SRC_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION, 16), ('SRC_PARAMETER_3_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION, 20), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION, 24), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION, 28), ('DST_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION, 32), ('DST_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION, 36), ('DST_PARAMETER_3_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION, 40), ('RECT_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION, 44), ('RECT_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION, 48)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT: TypeAlias = rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG(c.Struct): + SIZE = 20 + HEADER_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION + DATA_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION + COUNT_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + sw: int + reserved_0: int + fillsize: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('sw', ctypes.c_uint32, 2, 2, 0), ('reserved_0', ctypes.c_uint32, 2, 12, 2), ('fillsize', ctypes.c_uint32, 3, 2, 6), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION(c.Struct): + SIZE = 4 + src_data_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION.register_fields([('src_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION(c.Struct): + SIZE = 4 + count: int + reserved_0: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION.register_fields([('count', ctypes.c_uint32, 0, 22, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 6), ('DW_4_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION, 0), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION, 4), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION, 8), ('DATA_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION, 12), ('COUNT_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION, 16)]) +rocr_AMD_SDMA_PKT_CONSTANT_FILL: TypeAlias = rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG(c.Struct): + SIZE = 16 + HEADER_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION + DATA_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + mtype: int + gcc: int + sys: int + pad1: int + snp: int + gpa: int + l2_policy: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('mtype', ctypes.c_uint32, 2, 3, 0), ('gcc', ctypes.c_uint32, 2, 1, 3), ('sys', ctypes.c_uint32, 2, 1, 4), ('pad1', ctypes.c_uint32, 2, 1, 5), ('snp', ctypes.c_uint32, 2, 1, 6), ('gpa', ctypes.c_uint32, 2, 1, 7), ('l2_policy', ctypes.c_uint32, 3, 2, 0), ('reserved_0', ctypes.c_uint32, 3, 6, 2), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION(c.Struct): + SIZE = 4 + data: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION.register_fields([('data', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_FENCE_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION, 8), ('DATA_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION, 12)]) +rocr_AMD_SDMA_PKT_FENCE: TypeAlias = rocr_AMD_SDMA_PKT_FENCE_TAG +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG(c.Struct): + SIZE = 24 + HEADER_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION + VALUE_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION + MASK_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION + DW5_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + hdp_flush: int + reserved_1: int + func: int + mem_poll: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 0), ('hdp_flush', ctypes.c_uint32, 3, 1, 2), ('reserved_1', ctypes.c_uint32, 3, 1, 3), ('func', ctypes.c_uint32, 3, 3, 4), ('mem_poll', ctypes.c_uint32, 3, 1, 7), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION(c.Struct): + SIZE = 4 + value: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION.register_fields([('value', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION(c.Struct): + SIZE = 4 + mask: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION.register_fields([('mask', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION(c.Struct): + SIZE = 4 + interval: int + retry_count: int + reserved_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION.register_fields([('interval', ctypes.c_uint32, 0, 16, 0), ('retry_count', ctypes.c_uint32, 2, 12, 0), ('reserved_0', ctypes.c_uint32, 3, 4, 4), ('DW_5_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION, 8), ('VALUE_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION, 12), ('MASK_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION, 16), ('DW5_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION, 20)]) +rocr_AMD_SDMA_PKT_POLL_REGMEM: TypeAlias = rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG(c.Struct): + SIZE = 32 + HEADER_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION + SRC_DATA_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION + SRC_DATA_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION + CMP_DATA_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION + CMP_DATA_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION + LOOP_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + l: int + reserved_0: int + operation: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('l', ctypes.c_uint32, 2, 1, 0), ('reserved_0', ctypes.c_uint32, 2, 8, 1), ('operation', ctypes.c_uint32, 3, 7, 1), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION(c.Struct): + SIZE = 4 + src_data_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION.register_fields([('src_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION(c.Struct): + SIZE = 4 + src_data_63_32: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION.register_fields([('src_data_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION(c.Struct): + SIZE = 4 + cmp_data_31_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION.register_fields([('cmp_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION(c.Struct): + SIZE = 4 + cmp_data_63_32: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION.register_fields([('cmp_data_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION(c.Struct): + SIZE = 4 + loop_interval: int + reserved_0: int + DW_7_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION.register_fields([('loop_interval', ctypes.c_uint32, 0, 13, 0), ('reserved_0', ctypes.c_uint32, 1, 19, 5), ('DW_7_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_ATOMIC_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION, 8), ('SRC_DATA_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION, 12), ('SRC_DATA_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION, 16), ('CMP_DATA_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION, 20), ('CMP_DATA_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION, 24), ('LOOP_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION, 28)]) +rocr_AMD_SDMA_PKT_ATOMIC: TypeAlias = rocr_AMD_SDMA_PKT_ATOMIC_TAG +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG(c.Struct): + SIZE = 12 + HEADER_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION, 8)]) +rocr_AMD_SDMA_PKT_TIMESTAMP: TypeAlias = rocr_AMD_SDMA_PKT_TIMESTAMP_TAG +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG(c.Struct): + SIZE = 8 + HEADER_UNION: rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION + INT_CONTEXT_UNION: rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION(c.Struct): + SIZE = 4 + int_ctx: int + reserved_1: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION.register_fields([('int_ctx', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_1_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_TRAP_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION, 0), ('INT_CONTEXT_UNION', rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION, 4)]) +rocr_AMD_SDMA_PKT_TRAP: TypeAlias = rocr_AMD_SDMA_PKT_TRAP_TAG +@c.record +class rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG(c.Struct): + SIZE = 24 + DW_0_DATA: int + DW_1_DATA: int + DW_2_DATA: int + DW_3_DATA: int + DW_4_DATA: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG.register_fields([('DW_0_DATA', ctypes.c_uint32, 0), ('DW_1_DATA', ctypes.c_uint32, 4), ('DW_2_DATA', ctypes.c_uint32, 8), ('DW_3_DATA', ctypes.c_uint32, 12), ('DW_4_DATA', ctypes.c_uint32, 16), ('DW_5_DATA', ctypes.c_uint32, 20)]) +rocr_AMD_SDMA_PKT_HDP_FLUSH: TypeAlias = rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG(c.Struct): + SIZE = 20 + HEADER_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION + WORD1_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION + WORD2_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION + WORD3_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION + WORD4_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION(c.Struct): + SIZE = 4 + BaseVA_LO: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION.register_fields([('BaseVA_LO', ctypes.c_uint32, 0, 25, 7), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION(c.Struct): + SIZE = 4 + BaseVA_HI: int + GCR_CONTROL_GLI_INV: int + GCR_CONTROL_GL1_RANGE: int + GCR_CONTROL_GLM_WB: int + GCR_CONTROL_GLM_INV: int + GCR_CONTROL_GLK_WB: int + GCR_CONTROL_GLK_INV: int + GCR_CONTROL_GLV_INV: int + GCR_CONTROL_GL1_INV: int + GCR_CONTROL_GL2_US: int + GCR_CONTROL_GL2_RANGE: int + GCR_CONTROL_GL2_DISCARD: int + GCR_CONTROL_GL2_INV: int + GCR_CONTROL_GL2_WB: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION.register_fields([('BaseVA_HI', ctypes.c_uint32, 0, 16, 0), ('GCR_CONTROL_GLI_INV', ctypes.c_uint32, 2, 2, 0), ('GCR_CONTROL_GL1_RANGE', ctypes.c_uint32, 2, 2, 2), ('GCR_CONTROL_GLM_WB', ctypes.c_uint32, 2, 1, 4), ('GCR_CONTROL_GLM_INV', ctypes.c_uint32, 2, 1, 5), ('GCR_CONTROL_GLK_WB', ctypes.c_uint32, 2, 1, 6), ('GCR_CONTROL_GLK_INV', ctypes.c_uint32, 2, 1, 7), ('GCR_CONTROL_GLV_INV', ctypes.c_uint32, 3, 1, 0), ('GCR_CONTROL_GL1_INV', ctypes.c_uint32, 3, 1, 1), ('GCR_CONTROL_GL2_US', ctypes.c_uint32, 3, 1, 2), ('GCR_CONTROL_GL2_RANGE', ctypes.c_uint32, 3, 2, 3), ('GCR_CONTROL_GL2_DISCARD', ctypes.c_uint32, 3, 1, 5), ('GCR_CONTROL_GL2_INV', ctypes.c_uint32, 3, 1, 6), ('GCR_CONTROL_GL2_WB', ctypes.c_uint32, 3, 1, 7), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION(c.Struct): + SIZE = 4 + GCR_CONTROL_RANGE_IS_PA: int + GCR_CONTROL_SEQ: int + LimitVA_LO: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION.register_fields([('GCR_CONTROL_RANGE_IS_PA', ctypes.c_uint32, 0, 1, 0), ('GCR_CONTROL_SEQ', ctypes.c_uint32, 0, 2, 1), ('LimitVA_LO', ctypes.c_uint32, 0, 25, 7), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION(c.Struct): + SIZE = 4 + LimitVA_HI: int + VMID: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION.register_fields([('LimitVA_HI', ctypes.c_uint32, 0, 16, 0), ('VMID', ctypes.c_uint32, 3, 4, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_GCR_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION, 0), ('WORD1_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION, 4), ('WORD2_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION, 8), ('WORD3_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION, 12), ('WORD4_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION, 16)]) +rocr_AMD_SDMA_PKT_GCR: TypeAlias = rocr_AMD_SDMA_PKT_GCR_TAG +SDMA_OP_COPY = 1 +SDMA_OP_FENCE = 5 +SDMA_OP_TRAP = 6 +SDMA_OP_POLL_REGMEM = 8 +SDMA_OP_ATOMIC = 10 +SDMA_OP_CONST_FILL = 11 +SDMA_OP_TIMESTAMP = 13 +SDMA_OP_GCR = 17 +SDMA_SUBOP_COPY_LINEAR = 0 +SDMA_SUBOP_COPY_LINEAR_RECT = 4 +SDMA_SUBOP_TIMESTAMP_GET_GLOBAL = 2 +SDMA_SUBOP_USER_GCR = 1 +SDMA_ATOMIC_ADD64 = 47 +SDMA_OP_NOP = 0 +SDMA_OP_COPY = 1 +SDMA_OP_WRITE = 2 +SDMA_OP_INDIRECT = 4 +SDMA_OP_FENCE = 5 +SDMA_OP_TRAP = 6 +SDMA_OP_SEM = 7 +SDMA_OP_POLL_REGMEM = 8 +SDMA_OP_COND_EXE = 9 +SDMA_OP_ATOMIC = 10 +SDMA_OP_CONST_FILL = 11 +SDMA_OP_PTEPDE = 12 +SDMA_OP_TIMESTAMP = 13 +SDMA_OP_SRBM_WRITE = 14 +SDMA_OP_PRE_EXE = 15 +SDMA_OP_DUMMY_TRAP = 16 +SDMA_SUBOP_TIMESTAMP_SET = 0 +SDMA_SUBOP_TIMESTAMP_GET = 1 +SDMA_SUBOP_TIMESTAMP_GET_GLOBAL = 2 +SDMA_SUBOP_COPY_LINEAR = 0 +SDMA_SUBOP_COPY_LINEAR_SUB_WIND = 4 +SDMA_SUBOP_COPY_TILED = 1 +SDMA_SUBOP_COPY_TILED_SUB_WIND = 5 +SDMA_SUBOP_COPY_T2T_SUB_WIND = 6 +SDMA_SUBOP_COPY_SOA = 3 +SDMA_SUBOP_COPY_DIRTY_PAGE = 7 +SDMA_SUBOP_COPY_LINEAR_PHY = 8 +SDMA_SUBOP_WRITE_LINEAR = 0 +SDMA_SUBOP_WRITE_TILED = 1 +SDMA_SUBOP_PTEPDE_GEN = 0 +SDMA_SUBOP_PTEPDE_COPY = 1 +SDMA_SUBOP_PTEPDE_RMW = 2 +SDMA_SUBOP_PTEPDE_COPY_BACKWARDS = 3 +SDMA_SUBOP_DATA_FILL_MULTI = 1 +SDMA_SUBOP_POLL_REG_WRITE_MEM = 1 +SDMA_SUBOP_POLL_DBIT_WRITE_MEM = 2 +SDMA_SUBOP_POLL_MEM_VERIFY = 3 +HEADER_AGENT_DISPATCH = 4 +HEADER_BARRIER = 5 +SDMA_OP_AQL_COPY = 0 +SDMA_OP_AQL_BARRIER_OR = 0 +SDMA_PKT_HEADER_op_offset = 0 +SDMA_PKT_HEADER_op_mask = 0x000000FF +SDMA_PKT_HEADER_op_shift = 0 +SDMA_PKT_HEADER_OP = lambda x: (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift) # type: ignore +SDMA_PKT_HEADER_sub_op_offset = 0 +SDMA_PKT_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_HEADER_sub_op_shift = 8 +SDMA_PKT_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_HEADER_sub_op_mask) << SDMA_PKT_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_LINEAR_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_encrypt_mask) << SDMA_PKT_COPY_LINEAR_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_LINEAR_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_broadcast_mask) << SDMA_PKT_COPY_LINEAR_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_shift = 31 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_ALL = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_offset = 1 +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_mask) << SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_shift = 19 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_GCC = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_shift = 20 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SYS = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_shift = 22 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_shift = 23 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_GPA = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_shift = 28 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SYS = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_shift = 30 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_shift = 31 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_GPA = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_shift = 19 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_GCC = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_shift = 20 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SYS = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_shift = 21 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_LOG = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_shift = 22 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_shift = 23 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_GPA = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_shift = 27 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_GCC = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_shift = 28 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SYS = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_shift = 30 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_shift = 31 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_GPA = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_shift = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_DST2_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_shift = 16 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_DST1_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_offset = 5 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_DST1_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_offset = 6 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_DST1_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_offset = 7 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_DST2_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_offset = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_DST2_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_shift = 29 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_ELEMENTSIZE = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_SRC_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_offset = 5 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_SRC_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_offset = 6 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_offset = 7 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_DST_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_DST_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_offset = 10 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_DST_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_op_mask) << SDMA_PKT_COPY_TILED_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_TILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_encrypt_mask) << SDMA_PKT_COPY_TILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_TILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_tmz_mask) << SDMA_PKT_COPY_TILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_mip_max_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_TILED_HEADER_mip_max_shift = 20 +SDMA_PKT_COPY_TILED_HEADER_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_mip_max_mask) << SDMA_PKT_COPY_TILED_HEADER_mip_max_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_3_width_offset = 3 +SDMA_PKT_COPY_TILED_DW_3_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_3_width_shift = 0 +SDMA_PKT_COPY_TILED_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_3_width_mask) << SDMA_PKT_COPY_TILED_DW_3_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_4_height_offset = 4 +SDMA_PKT_COPY_TILED_DW_4_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_4_height_shift = 0 +SDMA_PKT_COPY_TILED_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_4_height_mask) << SDMA_PKT_COPY_TILED_DW_4_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_4_depth_offset = 4 +SDMA_PKT_COPY_TILED_DW_4_depth_mask = 0x000007FF +SDMA_PKT_COPY_TILED_DW_4_depth_shift = 16 +SDMA_PKT_COPY_TILED_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_4_depth_mask) << SDMA_PKT_COPY_TILED_DW_4_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_element_size_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_DW_5_element_size_shift = 0 +SDMA_PKT_COPY_TILED_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_element_size_mask) << SDMA_PKT_COPY_TILED_DW_5_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_shift = 3 +SDMA_PKT_COPY_TILED_DW_5_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_mask) << SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_dimension_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_dimension_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_5_dimension_shift = 9 +SDMA_PKT_COPY_TILED_DW_5_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_dimension_mask) << SDMA_PKT_COPY_TILED_DW_5_dimension_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_epitch_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_epitch_mask = 0x0000FFFF +SDMA_PKT_COPY_TILED_DW_5_epitch_shift = 16 +SDMA_PKT_COPY_TILED_DW_5_EPITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_epitch_mask) << SDMA_PKT_COPY_TILED_DW_5_epitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_6_x_offset = 6 +SDMA_PKT_COPY_TILED_DW_6_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_6_x_shift = 0 +SDMA_PKT_COPY_TILED_DW_6_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_6_x_mask) << SDMA_PKT_COPY_TILED_DW_6_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_6_y_offset = 6 +SDMA_PKT_COPY_TILED_DW_6_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_6_y_shift = 16 +SDMA_PKT_COPY_TILED_DW_6_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_6_y_mask) << SDMA_PKT_COPY_TILED_DW_6_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_z_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_DW_7_z_shift = 0 +SDMA_PKT_COPY_TILED_DW_7_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_z_mask) << SDMA_PKT_COPY_TILED_DW_7_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_linear_sw_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_7_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_DW_7_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_linear_sw_mask) << SDMA_PKT_COPY_TILED_DW_7_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_tile_sw_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_7_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_DW_7_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_tile_sw_mask) << SDMA_PKT_COPY_TILED_DW_7_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_offset = 8 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_offset = 9 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_PITCH_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_mask) << SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_COUNT_count_offset = 12 +SDMA_PKT_COPY_TILED_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_COPY_TILED_COUNT_count_shift = 0 +SDMA_PKT_COPY_TILED_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_TILED_COUNT_count_mask) << SDMA_PKT_COPY_TILED_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_mip_max_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_mip_max_shift = 20 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_mip_max_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_mip_max_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_shift = 26 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_VIDEOCOPY = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_offset = 1 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_TILED_ADDR0_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_offset = 2 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_TILED_ADDR0_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_offset = 3 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_TILED_ADDR1_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_offset = 4 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_TILED_ADDR1_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_offset = 5 +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_offset = 6 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_offset = 6 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_mask = 0x000007FF +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_mask = 0x00000007 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_shift = 3 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_shift = 9 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_epitch_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_epitch_mask = 0x0000FFFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_epitch_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_EPITCH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_epitch_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_epitch_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_offset = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_X = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_offset = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_Y = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_offset = 9 +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_mask = 0x000007FF +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_Z = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_shift = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_DST2_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_shift = 24 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_offset = 11 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_offset = 12 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_offset = 13 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_offset = 14 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_offset = 15 +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_mask) << SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_op_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_HEADER_op_shift = 0 +SDMA_PKT_COPY_T2T_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_op_mask) << SDMA_PKT_COPY_T2T_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_T2T_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_sub_op_mask) << SDMA_PKT_COPY_T2T_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_T2T_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_T2T_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_tmz_mask) << SDMA_PKT_COPY_T2T_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_mip_max_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_T2T_HEADER_mip_max_shift = 20 +SDMA_PKT_COPY_T2T_HEADER_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_mip_max_mask) << SDMA_PKT_COPY_T2T_HEADER_mip_max_shift) # type: ignore +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_T2T_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_3_src_x_mask) << SDMA_PKT_COPY_T2T_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_T2T_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_3_src_y_mask) << SDMA_PKT_COPY_T2T_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_T2T_DW_4_src_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_4_src_z_mask) << SDMA_PKT_COPY_T2T_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_4_src_width_offset = 4 +SDMA_PKT_COPY_T2T_DW_4_src_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_4_src_width_shift = 16 +SDMA_PKT_COPY_T2T_DW_4_SRC_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_4_src_width_mask) << SDMA_PKT_COPY_T2T_DW_4_src_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_5_src_height_offset = 5 +SDMA_PKT_COPY_T2T_DW_5_src_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_5_src_height_shift = 0 +SDMA_PKT_COPY_T2T_DW_5_SRC_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_5_src_height_mask) << SDMA_PKT_COPY_T2T_DW_5_src_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_5_src_depth_offset = 5 +SDMA_PKT_COPY_T2T_DW_5_src_depth_mask = 0x000007FF +SDMA_PKT_COPY_T2T_DW_5_src_depth_shift = 16 +SDMA_PKT_COPY_T2T_DW_5_SRC_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_5_src_depth_mask) << SDMA_PKT_COPY_T2T_DW_5_src_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_element_size_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_DW_6_src_element_size_shift = 0 +SDMA_PKT_COPY_T2T_DW_6_SRC_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_element_size_mask) << SDMA_PKT_COPY_T2T_DW_6_src_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_shift = 3 +SDMA_PKT_COPY_T2T_DW_6_SRC_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_mask) << SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_dimension_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_dimension_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_6_src_dimension_shift = 9 +SDMA_PKT_COPY_T2T_DW_6_SRC_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_dimension_mask) << SDMA_PKT_COPY_T2T_DW_6_src_dimension_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_epitch_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_epitch_mask = 0x0000FFFF +SDMA_PKT_COPY_T2T_DW_6_src_epitch_shift = 16 +SDMA_PKT_COPY_T2T_DW_6_SRC_EPITCH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_epitch_mask) << SDMA_PKT_COPY_T2T_DW_6_src_epitch_shift) # type: ignore +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_offset = 7 +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_offset = 8 +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_9_dst_x_offset = 9 +SDMA_PKT_COPY_T2T_DW_9_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_9_dst_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_9_DST_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_9_dst_x_mask) << SDMA_PKT_COPY_T2T_DW_9_dst_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_9_dst_y_offset = 9 +SDMA_PKT_COPY_T2T_DW_9_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_9_dst_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_9_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_9_dst_y_mask) << SDMA_PKT_COPY_T2T_DW_9_dst_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_10_dst_z_offset = 10 +SDMA_PKT_COPY_T2T_DW_10_dst_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_DW_10_dst_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_10_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_10_dst_z_mask) << SDMA_PKT_COPY_T2T_DW_10_dst_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_10_dst_width_offset = 10 +SDMA_PKT_COPY_T2T_DW_10_dst_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_10_dst_width_shift = 16 +SDMA_PKT_COPY_T2T_DW_10_DST_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_10_dst_width_mask) << SDMA_PKT_COPY_T2T_DW_10_dst_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_11_dst_height_offset = 11 +SDMA_PKT_COPY_T2T_DW_11_dst_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_11_dst_height_shift = 0 +SDMA_PKT_COPY_T2T_DW_11_DST_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_11_dst_height_mask) << SDMA_PKT_COPY_T2T_DW_11_dst_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_11_dst_depth_offset = 11 +SDMA_PKT_COPY_T2T_DW_11_dst_depth_mask = 0x000007FF +SDMA_PKT_COPY_T2T_DW_11_dst_depth_shift = 16 +SDMA_PKT_COPY_T2T_DW_11_DST_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_11_dst_depth_mask) << SDMA_PKT_COPY_T2T_DW_11_dst_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_shift = 0 +SDMA_PKT_COPY_T2T_DW_12_DST_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_element_size_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_shift = 3 +SDMA_PKT_COPY_T2T_DW_12_DST_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_shift = 9 +SDMA_PKT_COPY_T2T_DW_12_DST_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_dimension_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_dimension_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_epitch_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_epitch_mask = 0x0000FFFF +SDMA_PKT_COPY_T2T_DW_12_dst_epitch_shift = 16 +SDMA_PKT_COPY_T2T_DW_12_DST_EPITCH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_epitch_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_epitch_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_13_rect_x_offset = 13 +SDMA_PKT_COPY_T2T_DW_13_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_13_rect_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_13_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_13_rect_x_mask) << SDMA_PKT_COPY_T2T_DW_13_rect_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_13_rect_y_offset = 13 +SDMA_PKT_COPY_T2T_DW_13_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_13_rect_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_13_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_13_rect_y_mask) << SDMA_PKT_COPY_T2T_DW_13_rect_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_rect_z_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_DW_14_rect_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_14_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_rect_z_mask) << SDMA_PKT_COPY_T2T_DW_14_rect_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_dst_sw_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_14_dst_sw_shift = 16 +SDMA_PKT_COPY_T2T_DW_14_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_dst_sw_mask) << SDMA_PKT_COPY_T2T_DW_14_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_src_sw_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_14_src_sw_shift = 24 +SDMA_PKT_COPY_T2T_DW_14_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_src_sw_mask) << SDMA_PKT_COPY_T2T_DW_14_src_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_max_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_max_shift = 20 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_max_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_max_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_id_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_id_mask = 0x0000000F +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_id_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_MIP_ID = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_id_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_mip_id_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_TILED_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_TILED_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_TILED_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_shift = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_shift = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_epitch_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_epitch_mask = 0x0000FFFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_epitch_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_EPITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_epitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_epitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_offset = 7 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_offset = 8 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_LINEAR_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_LINEAR_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_LINEAR_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_op_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_STRUCT_HEADER_op_shift = 0 +SDMA_PKT_COPY_STRUCT_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_op_mask) << SDMA_PKT_COPY_STRUCT_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_STRUCT_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_sub_op_mask) << SDMA_PKT_COPY_STRUCT_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_STRUCT_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_STRUCT_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_tmz_mask) << SDMA_PKT_COPY_STRUCT_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_detile_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_STRUCT_HEADER_detile_shift = 31 +SDMA_PKT_COPY_STRUCT_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_detile_mask) << SDMA_PKT_COPY_STRUCT_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_offset = 1 +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_shift = 0 +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_SB_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_mask) << SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_offset = 2 +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_shift = 0 +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_SB_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_mask) << SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_offset = 3 +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_shift = 0 +SDMA_PKT_COPY_STRUCT_START_INDEX_START_INDEX = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_mask) << SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_COUNT_count_offset = 4 +SDMA_PKT_COPY_STRUCT_COUNT_count_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_COUNT_count_shift = 0 +SDMA_PKT_COPY_STRUCT_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_COUNT_count_mask) << SDMA_PKT_COPY_STRUCT_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_stride_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_stride_mask = 0x000007FF +SDMA_PKT_COPY_STRUCT_DW_5_stride_shift = 0 +SDMA_PKT_COPY_STRUCT_DW_5_STRIDE = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_stride_mask) << SDMA_PKT_COPY_STRUCT_DW_5_stride_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_shift = 16 +SDMA_PKT_COPY_STRUCT_DW_5_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_mask) << SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_mask = 0x00000003 +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_shift = 24 +SDMA_PKT_COPY_STRUCT_DW_5_STRUCT_SW = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_mask) << SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_offset = 6 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_offset = 7 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_op_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_UNTILED_HEADER_op_shift = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_op_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_UNTILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_shift = 16 +SDMA_PKT_WRITE_UNTILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_shift = 18 +SDMA_PKT_WRITE_UNTILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_tmz_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DW_3_count_offset = 3 +SDMA_PKT_WRITE_UNTILED_DW_3_count_mask = 0x000FFFFF +SDMA_PKT_WRITE_UNTILED_DW_3_count_shift = 0 +SDMA_PKT_WRITE_UNTILED_DW_3_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DW_3_count_mask) << SDMA_PKT_WRITE_UNTILED_DW_3_count_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DW_3_sw_offset = 3 +SDMA_PKT_WRITE_UNTILED_DW_3_sw_mask = 0x00000003 +SDMA_PKT_WRITE_UNTILED_DW_3_sw_shift = 24 +SDMA_PKT_WRITE_UNTILED_DW_3_SW = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DW_3_sw_mask) << SDMA_PKT_WRITE_UNTILED_DW_3_sw_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DATA0_data0_offset = 4 +SDMA_PKT_WRITE_UNTILED_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DATA0_data0_shift = 0 +SDMA_PKT_WRITE_UNTILED_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DATA0_data0_mask) << SDMA_PKT_WRITE_UNTILED_DATA0_data0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_op_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_HEADER_op_shift = 0 +SDMA_PKT_WRITE_TILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_op_mask) << SDMA_PKT_WRITE_TILED_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_TILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_sub_op_mask) << SDMA_PKT_WRITE_TILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_encrypt_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_WRITE_TILED_HEADER_encrypt_shift = 16 +SDMA_PKT_WRITE_TILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_encrypt_mask) << SDMA_PKT_WRITE_TILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_tmz_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_WRITE_TILED_HEADER_tmz_shift = 18 +SDMA_PKT_WRITE_TILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_tmz_mask) << SDMA_PKT_WRITE_TILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_mip_max_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_mip_max_mask = 0x0000000F +SDMA_PKT_WRITE_TILED_HEADER_mip_max_shift = 20 +SDMA_PKT_WRITE_TILED_HEADER_MIP_MAX = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_mip_max_mask) << SDMA_PKT_WRITE_TILED_HEADER_mip_max_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_3_width_offset = 3 +SDMA_PKT_WRITE_TILED_DW_3_width_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_3_width_shift = 0 +SDMA_PKT_WRITE_TILED_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_3_width_mask) << SDMA_PKT_WRITE_TILED_DW_3_width_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_4_height_offset = 4 +SDMA_PKT_WRITE_TILED_DW_4_height_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_4_height_shift = 0 +SDMA_PKT_WRITE_TILED_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_4_height_mask) << SDMA_PKT_WRITE_TILED_DW_4_height_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_4_depth_offset = 4 +SDMA_PKT_WRITE_TILED_DW_4_depth_mask = 0x000007FF +SDMA_PKT_WRITE_TILED_DW_4_depth_shift = 16 +SDMA_PKT_WRITE_TILED_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_4_depth_mask) << SDMA_PKT_WRITE_TILED_DW_4_depth_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_element_size_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_DW_5_element_size_shift = 0 +SDMA_PKT_WRITE_TILED_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_element_size_mask) << SDMA_PKT_WRITE_TILED_DW_5_element_size_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_mask = 0x0000001F +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_shift = 3 +SDMA_PKT_WRITE_TILED_DW_5_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_mask) << SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_dimension_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_dimension_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_DW_5_dimension_shift = 9 +SDMA_PKT_WRITE_TILED_DW_5_DIMENSION = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_dimension_mask) << SDMA_PKT_WRITE_TILED_DW_5_dimension_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_epitch_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_epitch_mask = 0x0000FFFF +SDMA_PKT_WRITE_TILED_DW_5_epitch_shift = 16 +SDMA_PKT_WRITE_TILED_DW_5_EPITCH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_epitch_mask) << SDMA_PKT_WRITE_TILED_DW_5_epitch_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_6_x_offset = 6 +SDMA_PKT_WRITE_TILED_DW_6_x_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_6_x_shift = 0 +SDMA_PKT_WRITE_TILED_DW_6_X = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_6_x_mask) << SDMA_PKT_WRITE_TILED_DW_6_x_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_6_y_offset = 6 +SDMA_PKT_WRITE_TILED_DW_6_y_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_6_y_shift = 16 +SDMA_PKT_WRITE_TILED_DW_6_Y = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_6_y_mask) << SDMA_PKT_WRITE_TILED_DW_6_y_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_7_z_offset = 7 +SDMA_PKT_WRITE_TILED_DW_7_z_mask = 0x000007FF +SDMA_PKT_WRITE_TILED_DW_7_z_shift = 0 +SDMA_PKT_WRITE_TILED_DW_7_Z = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_7_z_mask) << SDMA_PKT_WRITE_TILED_DW_7_z_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_7_sw_offset = 7 +SDMA_PKT_WRITE_TILED_DW_7_sw_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_DW_7_sw_shift = 24 +SDMA_PKT_WRITE_TILED_DW_7_SW = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_7_sw_mask) << SDMA_PKT_WRITE_TILED_DW_7_sw_shift) # type: ignore +SDMA_PKT_WRITE_TILED_COUNT_count_offset = 8 +SDMA_PKT_WRITE_TILED_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_WRITE_TILED_COUNT_count_shift = 0 +SDMA_PKT_WRITE_TILED_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_COUNT_count_mask) << SDMA_PKT_WRITE_TILED_COUNT_count_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DATA0_data0_offset = 9 +SDMA_PKT_WRITE_TILED_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DATA0_data0_shift = 0 +SDMA_PKT_WRITE_TILED_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DATA0_data0_mask) << SDMA_PKT_WRITE_TILED_DATA0_data0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_COPY_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_shift = 31 +SDMA_PKT_PTEPDE_COPY_HEADER_PTEPDE_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_offset = 5 +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_shift = 0 +SDMA_PKT_PTEPDE_COPY_MASK_DW0_MASK_DW0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_mask) << SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_offset = 6 +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_shift = 0 +SDMA_PKT_PTEPDE_COPY_MASK_DW1_MASK_DW1 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_mask) << SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_COUNT_count_offset = 7 +SDMA_PKT_PTEPDE_COPY_COUNT_count_mask = 0x0007FFFF +SDMA_PKT_PTEPDE_COPY_COUNT_count_shift = 0 +SDMA_PKT_PTEPDE_COPY_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_COUNT_count_mask) << SDMA_PKT_PTEPDE_COPY_COUNT_count_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_mask = 0x00000003 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_shift = 28 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_PTE_SIZE = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_shift = 30 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_DIRECTION = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_shift = 31 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_PTEPDE_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_offset = 5 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_MASK_FIRST_XFER = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_offset = 5 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_shift = 8 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_MASK_LAST_XFER = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_offset = 6 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_mask = 0x0001FFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_COUNT = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_RMW_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_op_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_RMW_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_shift = 19 +SDMA_PKT_PTEPDE_RMW_HEADER_GCC = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_gcc_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_gcc_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_sys_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_sys_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_sys_shift = 20 +SDMA_PKT_PTEPDE_RMW_HEADER_SYS = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_sys_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_sys_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_snp_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_snp_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_snp_shift = 22 +SDMA_PKT_PTEPDE_RMW_HEADER_SNP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_snp_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_snp_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_shift = 23 +SDMA_PKT_PTEPDE_RMW_HEADER_GPA = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_gpa_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_gpa_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_mask) << SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_mask) << SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_offset = 3 +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_MASK_LO_MASK_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_mask) << SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_offset = 4 +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_MASK_HI_MASK_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_mask) << SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_offset = 5 +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_VALUE_LO_VALUE_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_mask) << SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_offset = 6 +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_VALUE_HI_VALUE_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_mask) << SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_shift) # type: ignore +SDMA_PKT_WRITE_INCR_HEADER_op_offset = 0 +SDMA_PKT_WRITE_INCR_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_INCR_HEADER_op_shift = 0 +SDMA_PKT_WRITE_INCR_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_INCR_HEADER_op_mask) << SDMA_PKT_WRITE_INCR_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_INCR_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_INCR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_INCR_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_INCR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_INCR_HEADER_sub_op_mask) << SDMA_PKT_WRITE_INCR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_offset = 3 +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_MASK_DW0_MASK_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_mask) << SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_offset = 4 +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_MASK_DW1_MASK_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_mask) << SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_offset = 5 +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_INIT_DW0_INIT_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_mask) << SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_offset = 6 +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_INIT_DW1_INIT_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_mask) << SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_offset = 7 +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_INCR_DW0_INCR_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_mask) << SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_offset = 8 +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_INCR_DW1_INCR_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_mask) << SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_COUNT_count_offset = 9 +SDMA_PKT_WRITE_INCR_COUNT_count_mask = 0x0007FFFF +SDMA_PKT_WRITE_INCR_COUNT_count_shift = 0 +SDMA_PKT_WRITE_INCR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_INCR_COUNT_count_mask) << SDMA_PKT_WRITE_INCR_COUNT_count_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_op_offset = 0 +SDMA_PKT_INDIRECT_HEADER_op_mask = 0x000000FF +SDMA_PKT_INDIRECT_HEADER_op_shift = 0 +SDMA_PKT_INDIRECT_HEADER_OP = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_op_mask) << SDMA_PKT_INDIRECT_HEADER_op_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_sub_op_offset = 0 +SDMA_PKT_INDIRECT_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_INDIRECT_HEADER_sub_op_shift = 8 +SDMA_PKT_INDIRECT_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_sub_op_mask) << SDMA_PKT_INDIRECT_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_vmid_offset = 0 +SDMA_PKT_INDIRECT_HEADER_vmid_mask = 0x0000000F +SDMA_PKT_INDIRECT_HEADER_vmid_shift = 16 +SDMA_PKT_INDIRECT_HEADER_VMID = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_vmid_mask) << SDMA_PKT_INDIRECT_HEADER_vmid_shift) # type: ignore +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_offset = 1 +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_shift = 0 +SDMA_PKT_INDIRECT_BASE_LO_IB_BASE_31_0 = lambda x: (((x) & SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_mask) << SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_shift) # type: ignore +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_offset = 2 +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_shift = 0 +SDMA_PKT_INDIRECT_BASE_HI_IB_BASE_63_32 = lambda x: (((x) & SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_mask) << SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_shift) # type: ignore +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_offset = 3 +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_mask = 0x000FFFFF +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_shift = 0 +SDMA_PKT_INDIRECT_IB_SIZE_IB_SIZE = lambda x: (((x) & SDMA_PKT_INDIRECT_IB_SIZE_ib_size_mask) << SDMA_PKT_INDIRECT_IB_SIZE_ib_size_shift) # type: ignore +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_offset = 4 +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_shift = 0 +SDMA_PKT_INDIRECT_CSA_ADDR_LO_CSA_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_mask) << SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_shift) # type: ignore +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_offset = 5 +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_shift = 0 +SDMA_PKT_INDIRECT_CSA_ADDR_HI_CSA_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_mask) << SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_op_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_op_mask = 0x000000FF +SDMA_PKT_SEMAPHORE_HEADER_op_shift = 0 +SDMA_PKT_SEMAPHORE_HEADER_OP = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_op_mask) << SDMA_PKT_SEMAPHORE_HEADER_op_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_sub_op_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_SEMAPHORE_HEADER_sub_op_shift = 8 +SDMA_PKT_SEMAPHORE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_sub_op_mask) << SDMA_PKT_SEMAPHORE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_write_one_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_write_one_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_write_one_shift = 29 +SDMA_PKT_SEMAPHORE_HEADER_WRITE_ONE = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_write_one_mask) << SDMA_PKT_SEMAPHORE_HEADER_write_one_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_signal_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_signal_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_signal_shift = 30 +SDMA_PKT_SEMAPHORE_HEADER_SIGNAL = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_signal_mask) << SDMA_PKT_SEMAPHORE_HEADER_signal_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_mailbox_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_mailbox_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_mailbox_shift = 31 +SDMA_PKT_SEMAPHORE_HEADER_MAILBOX = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_mailbox_mask) << SDMA_PKT_SEMAPHORE_HEADER_mailbox_shift) # type: ignore +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_SEMAPHORE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_SEMAPHORE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_op_offset = 0 +SDMA_PKT_FENCE_HEADER_op_mask = 0x000000FF +SDMA_PKT_FENCE_HEADER_op_shift = 0 +SDMA_PKT_FENCE_HEADER_OP = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_op_mask) << SDMA_PKT_FENCE_HEADER_op_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_sub_op_offset = 0 +SDMA_PKT_FENCE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_FENCE_HEADER_sub_op_shift = 8 +SDMA_PKT_FENCE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_sub_op_mask) << SDMA_PKT_FENCE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_FENCE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_FENCE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_FENCE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_FENCE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_FENCE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_FENCE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_FENCE_DATA_data_offset = 3 +SDMA_PKT_FENCE_DATA_data_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_DATA_data_shift = 0 +SDMA_PKT_FENCE_DATA_DATA = lambda x: (((x) & SDMA_PKT_FENCE_DATA_data_mask) << SDMA_PKT_FENCE_DATA_data_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_op_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_op_mask = 0x000000FF +SDMA_PKT_SRBM_WRITE_HEADER_op_shift = 0 +SDMA_PKT_SRBM_WRITE_HEADER_OP = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_op_mask) << SDMA_PKT_SRBM_WRITE_HEADER_op_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_shift = 8 +SDMA_PKT_SRBM_WRITE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_sub_op_mask) << SDMA_PKT_SRBM_WRITE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_mask = 0x0000000F +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_shift = 28 +SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_byte_en_mask) << SDMA_PKT_SRBM_WRITE_HEADER_byte_en_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_ADDR_addr_offset = 1 +SDMA_PKT_SRBM_WRITE_ADDR_addr_mask = 0x0003FFFF +SDMA_PKT_SRBM_WRITE_ADDR_addr_shift = 0 +SDMA_PKT_SRBM_WRITE_ADDR_ADDR = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_ADDR_addr_mask) << SDMA_PKT_SRBM_WRITE_ADDR_addr_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_DATA_data_offset = 2 +SDMA_PKT_SRBM_WRITE_DATA_data_mask = 0xFFFFFFFF +SDMA_PKT_SRBM_WRITE_DATA_data_shift = 0 +SDMA_PKT_SRBM_WRITE_DATA_DATA = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_DATA_data_mask) << SDMA_PKT_SRBM_WRITE_DATA_data_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_op_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_op_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_op_shift = 0 +SDMA_PKT_PRE_EXE_HEADER_OP = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_op_mask) << SDMA_PKT_PRE_EXE_HEADER_op_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_sub_op_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_sub_op_shift = 8 +SDMA_PKT_PRE_EXE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_sub_op_mask) << SDMA_PKT_PRE_EXE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_dev_sel_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_dev_sel_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_dev_sel_shift = 16 +SDMA_PKT_PRE_EXE_HEADER_DEV_SEL = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_dev_sel_mask) << SDMA_PKT_PRE_EXE_HEADER_dev_sel_shift) # type: ignore +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_offset = 1 +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_mask = 0x00003FFF +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_shift = 0 +SDMA_PKT_PRE_EXE_EXEC_COUNT_EXEC_COUNT = lambda x: (((x) & SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_mask) << SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_shift) # type: ignore +SDMA_PKT_COND_EXE_HEADER_op_offset = 0 +SDMA_PKT_COND_EXE_HEADER_op_mask = 0x000000FF +SDMA_PKT_COND_EXE_HEADER_op_shift = 0 +SDMA_PKT_COND_EXE_HEADER_OP = lambda x: (((x) & SDMA_PKT_COND_EXE_HEADER_op_mask) << SDMA_PKT_COND_EXE_HEADER_op_shift) # type: ignore +SDMA_PKT_COND_EXE_HEADER_sub_op_offset = 0 +SDMA_PKT_COND_EXE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COND_EXE_HEADER_sub_op_shift = 8 +SDMA_PKT_COND_EXE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COND_EXE_HEADER_sub_op_mask) << SDMA_PKT_COND_EXE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_COND_EXE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_COND_EXE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_COND_EXE_REFERENCE_reference_offset = 3 +SDMA_PKT_COND_EXE_REFERENCE_reference_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_REFERENCE_reference_shift = 0 +SDMA_PKT_COND_EXE_REFERENCE_REFERENCE = lambda x: (((x) & SDMA_PKT_COND_EXE_REFERENCE_reference_mask) << SDMA_PKT_COND_EXE_REFERENCE_reference_shift) # type: ignore +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_offset = 4 +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_mask = 0x00003FFF +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_shift = 0 +SDMA_PKT_COND_EXE_EXEC_COUNT_EXEC_COUNT = lambda x: (((x) & SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_mask) << SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_op_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_op_mask = 0x000000FF +SDMA_PKT_CONSTANT_FILL_HEADER_op_shift = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_OP = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_op_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_op_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_shift = 8 +SDMA_PKT_CONSTANT_FILL_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_sw_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_sw_mask = 0x00000003 +SDMA_PKT_CONSTANT_FILL_HEADER_sw_shift = 16 +SDMA_PKT_CONSTANT_FILL_HEADER_SW = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_sw_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_sw_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_mask = 0x00000003 +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_shift = 30 +SDMA_PKT_CONSTANT_FILL_HEADER_FILLSIZE = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_offset = 3 +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_shift = 0 +SDMA_PKT_CONSTANT_FILL_DATA_SRC_DATA_31_0 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_mask) << SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_COUNT_count_offset = 4 +SDMA_PKT_CONSTANT_FILL_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_CONSTANT_FILL_COUNT_count_shift = 0 +SDMA_PKT_CONSTANT_FILL_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_COUNT_count_mask) << SDMA_PKT_CONSTANT_FILL_COUNT_count_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_mask = 0x000000FF +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_OP = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_op_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_op_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_shift = 8 +SDMA_PKT_DATA_FILL_MULTI_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_mask = 0x00000001 +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_shift = 31 +SDMA_PKT_DATA_FILL_MULTI_HEADER_MEMLOG_CLR = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_offset = 1 +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_BYTE_STRIDE = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_mask) << SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_offset = 2 +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_DMA_COUNT = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_mask) << SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_offset = 5 +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_mask = 0x03FFFFFF +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_mask) << SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_REGMEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_REGMEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_op_mask) << SDMA_PKT_POLL_REGMEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_REGMEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_REGMEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_mask = 0x00000001 +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_shift = 26 +SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_mask) << SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_func_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_func_mask = 0x00000007 +SDMA_PKT_POLL_REGMEM_HEADER_func_shift = 28 +SDMA_PKT_POLL_REGMEM_HEADER_FUNC = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_func_mask) << SDMA_PKT_POLL_REGMEM_HEADER_func_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_mask = 0x00000001 +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_shift = 31 +SDMA_PKT_POLL_REGMEM_HEADER_MEM_POLL = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_mask) << SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_REGMEM_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_REGMEM_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_VALUE_value_offset = 3 +SDMA_PKT_POLL_REGMEM_VALUE_value_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_VALUE_value_shift = 0 +SDMA_PKT_POLL_REGMEM_VALUE_VALUE = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_VALUE_value_mask) << SDMA_PKT_POLL_REGMEM_VALUE_value_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_MASK_mask_offset = 4 +SDMA_PKT_POLL_REGMEM_MASK_mask_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_MASK_mask_shift = 0 +SDMA_PKT_POLL_REGMEM_MASK_MASK = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_MASK_mask_mask) << SDMA_PKT_POLL_REGMEM_MASK_mask_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_DW5_interval_offset = 5 +SDMA_PKT_POLL_REGMEM_DW5_interval_mask = 0x0000FFFF +SDMA_PKT_POLL_REGMEM_DW5_interval_shift = 0 +SDMA_PKT_POLL_REGMEM_DW5_INTERVAL = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_DW5_interval_mask) << SDMA_PKT_POLL_REGMEM_DW5_interval_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_DW5_retry_count_offset = 5 +SDMA_PKT_POLL_REGMEM_DW5_retry_count_mask = 0x00000FFF +SDMA_PKT_POLL_REGMEM_DW5_retry_count_shift = 16 +SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_DW5_retry_count_mask) << SDMA_PKT_POLL_REGMEM_DW5_retry_count_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_offset = 1 +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_mask = 0x3FFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_shift = 2 +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_ADDR_31_2 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_offset = 2 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_offset = 3 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_mask = 0x00000003 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_shift = 16 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_EA = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_offset = 3 +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_mask = 0x0FFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_shift = 4 +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_ADDR_31_4 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_offset = 4 +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_PAGE_NUM_31_0 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_mask = 0x00000001 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_shift = 31 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_MODE = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_offset = 1 +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_PATTERN = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_mask) << SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_offset = 2 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_CMP0_START_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_offset = 3 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_CMP0_START_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_offset = 4 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_CMP1_END_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_offset = 5 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_CMP1_END_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_offset = 6 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_CMP1_START_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_offset = 7 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_CMP1_START_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_offset = 8 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_CMP1_END_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_offset = 9 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_CMP1_END_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_offset = 10 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_REC_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_offset = 11 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_REC_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_offset = 12 +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_RESERVED = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_mask) << SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_op_offset = 0 +SDMA_PKT_ATOMIC_HEADER_op_mask = 0x000000FF +SDMA_PKT_ATOMIC_HEADER_op_shift = 0 +SDMA_PKT_ATOMIC_HEADER_OP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_op_mask) << SDMA_PKT_ATOMIC_HEADER_op_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_loop_offset = 0 +SDMA_PKT_ATOMIC_HEADER_loop_mask = 0x00000001 +SDMA_PKT_ATOMIC_HEADER_loop_shift = 16 +SDMA_PKT_ATOMIC_HEADER_LOOP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_loop_mask) << SDMA_PKT_ATOMIC_HEADER_loop_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_tmz_offset = 0 +SDMA_PKT_ATOMIC_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_ATOMIC_HEADER_tmz_shift = 18 +SDMA_PKT_ATOMIC_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_tmz_mask) << SDMA_PKT_ATOMIC_HEADER_tmz_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_atomic_op_offset = 0 +SDMA_PKT_ATOMIC_HEADER_atomic_op_mask = 0x0000007F +SDMA_PKT_ATOMIC_HEADER_atomic_op_shift = 25 +SDMA_PKT_ATOMIC_HEADER_ATOMIC_OP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_atomic_op_mask) << SDMA_PKT_ATOMIC_HEADER_atomic_op_shift) # type: ignore +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_ATOMIC_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_mask) << SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_ATOMIC_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_mask) << SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_offset = 3 +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_shift = 0 +SDMA_PKT_ATOMIC_SRC_DATA_LO_SRC_DATA_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_mask) << SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_offset = 4 +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_shift = 0 +SDMA_PKT_ATOMIC_SRC_DATA_HI_SRC_DATA_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_mask) << SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_offset = 5 +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_shift = 0 +SDMA_PKT_ATOMIC_CMP_DATA_LO_CMP_DATA_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_mask) << SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_offset = 6 +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_shift = 0 +SDMA_PKT_ATOMIC_CMP_DATA_HI_CMP_DATA_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_mask) << SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_offset = 7 +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_mask = 0x00001FFF +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_shift = 0 +SDMA_PKT_ATOMIC_LOOP_INTERVAL_LOOP_INTERVAL = lambda x: (((x) & SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_mask) << SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_SET_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_SET_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_SET_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_offset = 1 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_shift = 0 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_INIT_DATA_31_0 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_mask) << SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_INIT_DATA_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_mask) << SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_GET_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_offset = 1 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_mask = 0x1FFFFFFF +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_shift = 3 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_WRITE_ADDR_31_3 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_mask) << SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_WRITE_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_mask) << SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_offset = 1 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_mask = 0x1FFFFFFF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_shift = 3 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_WRITE_ADDR_31_3 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_WRITE_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_shift) # type: ignore +SDMA_PKT_TRAP_HEADER_op_offset = 0 +SDMA_PKT_TRAP_HEADER_op_mask = 0x000000FF +SDMA_PKT_TRAP_HEADER_op_shift = 0 +SDMA_PKT_TRAP_HEADER_OP = lambda x: (((x) & SDMA_PKT_TRAP_HEADER_op_mask) << SDMA_PKT_TRAP_HEADER_op_shift) # type: ignore +SDMA_PKT_TRAP_HEADER_sub_op_offset = 0 +SDMA_PKT_TRAP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TRAP_HEADER_sub_op_shift = 8 +SDMA_PKT_TRAP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TRAP_HEADER_sub_op_mask) << SDMA_PKT_TRAP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TRAP_INT_CONTEXT_int_context_offset = 1 +SDMA_PKT_TRAP_INT_CONTEXT_int_context_mask = 0x0FFFFFFF +SDMA_PKT_TRAP_INT_CONTEXT_int_context_shift = 0 +SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT = lambda x: (((x) & SDMA_PKT_TRAP_INT_CONTEXT_int_context_mask) << SDMA_PKT_TRAP_INT_CONTEXT_int_context_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_HEADER_op_offset = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_op_mask = 0x000000FF +SDMA_PKT_DUMMY_TRAP_HEADER_op_shift = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_OP = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_HEADER_op_mask) << SDMA_PKT_DUMMY_TRAP_HEADER_op_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_offset = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_shift = 8 +SDMA_PKT_DUMMY_TRAP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_mask) << SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_offset = 1 +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_mask = 0x0FFFFFFF +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_shift = 0 +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_INT_CONTEXT = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_mask) << SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_shift) # type: ignore +SDMA_PKT_NOP_HEADER_op_offset = 0 +SDMA_PKT_NOP_HEADER_op_mask = 0x000000FF +SDMA_PKT_NOP_HEADER_op_shift = 0 +SDMA_PKT_NOP_HEADER_OP = lambda x: (((x) & SDMA_PKT_NOP_HEADER_op_mask) << SDMA_PKT_NOP_HEADER_op_shift) # type: ignore +SDMA_PKT_NOP_HEADER_sub_op_offset = 0 +SDMA_PKT_NOP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_NOP_HEADER_sub_op_shift = 8 +SDMA_PKT_NOP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_NOP_HEADER_sub_op_mask) << SDMA_PKT_NOP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_NOP_HEADER_count_offset = 0 +SDMA_PKT_NOP_HEADER_count_mask = 0x00003FFF +SDMA_PKT_NOP_HEADER_count_shift = 16 +SDMA_PKT_NOP_HEADER_COUNT = lambda x: (((x) & SDMA_PKT_NOP_HEADER_count_mask) << SDMA_PKT_NOP_HEADER_count_shift) # type: ignore +SDMA_PKT_NOP_DATA0_data0_offset = 1 +SDMA_PKT_NOP_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_NOP_DATA0_data0_shift = 0 +SDMA_PKT_NOP_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_NOP_DATA0_data0_mask) << SDMA_PKT_NOP_DATA0_data0_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_format_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_HEADER_HEADER_format_shift = 0 +SDMA_AQL_PKT_HEADER_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_format_mask) << SDMA_AQL_PKT_HEADER_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_HEADER_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_HEADER_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_barrier_mask) << SDMA_AQL_PKT_HEADER_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_HEADER_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_HEADER_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_HEADER_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_HEADER_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_reserved_mask) << SDMA_AQL_PKT_HEADER_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_op_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_HEADER_HEADER_op_shift = 16 +SDMA_AQL_PKT_HEADER_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_op_mask) << SDMA_AQL_PKT_HEADER_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_subop_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_HEADER_HEADER_subop_shift = 20 +SDMA_AQL_PKT_HEADER_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_subop_mask) << SDMA_AQL_PKT_HEADER_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_shift = 16 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_shift = 20 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_offset = 1 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_RESERVED_DW1 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_offset = 2 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_RETURN_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_offset = 3 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_RETURN_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_offset = 4 +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_mask) << SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_offset = 5 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift = 16 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask) << SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_offset = 5 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_mask) << SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 6 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 7 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 8 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 9 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_offset = 10 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_RESERVED_DW10 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_offset = 11 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_RESERVED_DW11 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_offset = 12 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_RESERVED_DW12 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_offset = 13 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_RESERVED_DW13 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_offset = 14 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_COMPLETION_SIGNAL_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_offset = 15 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_format_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_BARRIER_OR_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_BARRIER_OR_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_BARRIER_OR_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_BARRIER_OR_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_shift = 16 +SDMA_AQL_PKT_BARRIER_OR_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_op_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_shift = 20 +SDMA_AQL_PKT_BARRIER_OR_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_offset = 1 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_RESERVED_DW1 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_mask) << SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_offset = 2 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_DEPENDENT_ADDR_0_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_offset = 3 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_DEPENDENT_ADDR_0_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_offset = 4 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_DEPENDENT_ADDR_1_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_offset = 5 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_DEPENDENT_ADDR_1_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_offset = 6 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_DEPENDENT_ADDR_2_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_offset = 7 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_DEPENDENT_ADDR_2_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_offset = 8 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_DEPENDENT_ADDR_3_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_offset = 9 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_DEPENDENT_ADDR_3_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_offset = 10 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_DEPENDENT_ADDR_4_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_offset = 11 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_DEPENDENT_ADDR_4_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_offset = 12 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_RESERVED_DW12 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_mask) << SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_offset = 13 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_RESERVED_DW13 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_mask) << SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_offset = 14 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_COMPLETION_SIGNAL_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_offset = 15 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift) # type: ignore \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_5_0_0.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_5_0_0.py new file mode 100644 index 000000000..10763a9c1 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_5_0_0.py @@ -0,0 +1,3386 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG(c.Struct): + SIZE = 28 + HEADER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION + COUNT_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION + PARAMETER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION + SRC_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION + SRC_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + extra_info: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('extra_info', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION(c.Struct): + SIZE = 4 + count: int + reserved_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION.register_fields([('count', ctypes.c_uint32, 0, 22, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 6), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION(c.Struct): + SIZE = 4 + reserved_0: int + dst_swap: int + reserved_1: int + src_swap: int + reserved_2: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION.register_fields([('reserved_0', ctypes.c_uint32, 0, 16, 0), ('dst_swap', ctypes.c_uint32, 2, 2, 0), ('reserved_1', ctypes.c_uint32, 2, 6, 2), ('src_swap', ctypes.c_uint32, 3, 2, 0), ('reserved_2', ctypes.c_uint32, 3, 6, 2), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION(c.Struct): + SIZE = 4 + src_addr_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION.register_fields([('src_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION(c.Struct): + SIZE = 4 + src_addr_63_32: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION.register_fields([('src_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION, 0), ('COUNT_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION, 4), ('PARAMETER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION, 8), ('SRC_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION, 12), ('SRC_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION, 16), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION, 20), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION, 24)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR: TypeAlias = rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG(c.Struct): + SIZE = 52 + HEADER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION + SRC_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION + SRC_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION + SRC_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION + SRC_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION + SRC_PARAMETER_3_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION + DST_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION + DST_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION + DST_PARAMETER_3_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION + RECT_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION + RECT_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved: int + element: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved', ctypes.c_uint32, 2, 13, 0), ('element', ctypes.c_uint32, 3, 3, 5), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION(c.Struct): + SIZE = 4 + src_addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION.register_fields([('src_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION(c.Struct): + SIZE = 4 + src_addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION.register_fields([('src_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + src_offset_x: int + reserved_1: int + src_offset_y: int + reserved_2: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION.register_fields([('src_offset_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('src_offset_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + src_offset_z: int + reserved_1: int + src_pitch: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION.register_fields([('src_offset_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 3), ('src_pitch', ctypes.c_uint32, 1, 19, 5), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION(c.Struct): + SIZE = 4 + src_slice_pitch: int + reserved_1: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION.register_fields([('src_slice_pitch', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_7_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_7_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + dst_offset_x: int + reserved_1: int + dst_offset_y: int + reserved_2: int + DW_8_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION.register_fields([('dst_offset_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('dst_offset_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_8_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + dst_offset_z: int + reserved_1: int + dst_pitch: int + DW_9_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION.register_fields([('dst_offset_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 3), ('dst_pitch', ctypes.c_uint32, 1, 19, 5), ('DW_9_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION(c.Struct): + SIZE = 4 + dst_slice_pitch: int + reserved_1: int + DW_10_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION.register_fields([('dst_slice_pitch', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_10_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + rect_x: int + reserved_1: int + rect_y: int + reserved_2: int + DW_11_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION.register_fields([('rect_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('rect_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_11_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + rect_z: int + reserved_1: int + dst_swap: int + reserved_2: int + src_swap: int + reserved_3: int + DW_12_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION.register_fields([('rect_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 5, 3), ('dst_swap', ctypes.c_uint32, 2, 2, 0), ('reserved_2', ctypes.c_uint32, 2, 6, 2), ('src_swap', ctypes.c_uint32, 3, 2, 0), ('reserved_3', ctypes.c_uint32, 3, 6, 2), ('DW_12_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION, 0), ('SRC_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION, 4), ('SRC_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION, 8), ('SRC_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION, 12), ('SRC_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION, 16), ('SRC_PARAMETER_3_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION, 20), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION, 24), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION, 28), ('DST_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION, 32), ('DST_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION, 36), ('DST_PARAMETER_3_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION, 40), ('RECT_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION, 44), ('RECT_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION, 48)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT: TypeAlias = rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG(c.Struct): + SIZE = 20 + HEADER_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION + DATA_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION + COUNT_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + sw: int + reserved_0: int + fillsize: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('sw', ctypes.c_uint32, 2, 2, 0), ('reserved_0', ctypes.c_uint32, 2, 12, 2), ('fillsize', ctypes.c_uint32, 3, 2, 6), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION(c.Struct): + SIZE = 4 + src_data_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION.register_fields([('src_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION(c.Struct): + SIZE = 4 + count: int + reserved_0: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION.register_fields([('count', ctypes.c_uint32, 0, 22, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 6), ('DW_4_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION, 0), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION, 4), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION, 8), ('DATA_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION, 12), ('COUNT_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION, 16)]) +rocr_AMD_SDMA_PKT_CONSTANT_FILL: TypeAlias = rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG(c.Struct): + SIZE = 16 + HEADER_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION + DATA_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + mtype: int + gcc: int + sys: int + pad1: int + snp: int + gpa: int + l2_policy: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('mtype', ctypes.c_uint32, 2, 3, 0), ('gcc', ctypes.c_uint32, 2, 1, 3), ('sys', ctypes.c_uint32, 2, 1, 4), ('pad1', ctypes.c_uint32, 2, 1, 5), ('snp', ctypes.c_uint32, 2, 1, 6), ('gpa', ctypes.c_uint32, 2, 1, 7), ('l2_policy', ctypes.c_uint32, 3, 2, 0), ('reserved_0', ctypes.c_uint32, 3, 6, 2), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION(c.Struct): + SIZE = 4 + data: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION.register_fields([('data', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_FENCE_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION, 8), ('DATA_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION, 12)]) +rocr_AMD_SDMA_PKT_FENCE: TypeAlias = rocr_AMD_SDMA_PKT_FENCE_TAG +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG(c.Struct): + SIZE = 24 + HEADER_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION + VALUE_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION + MASK_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION + DW5_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + hdp_flush: int + reserved_1: int + func: int + mem_poll: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 0), ('hdp_flush', ctypes.c_uint32, 3, 1, 2), ('reserved_1', ctypes.c_uint32, 3, 1, 3), ('func', ctypes.c_uint32, 3, 3, 4), ('mem_poll', ctypes.c_uint32, 3, 1, 7), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION(c.Struct): + SIZE = 4 + value: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION.register_fields([('value', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION(c.Struct): + SIZE = 4 + mask: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION.register_fields([('mask', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION(c.Struct): + SIZE = 4 + interval: int + retry_count: int + reserved_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION.register_fields([('interval', ctypes.c_uint32, 0, 16, 0), ('retry_count', ctypes.c_uint32, 2, 12, 0), ('reserved_0', ctypes.c_uint32, 3, 4, 4), ('DW_5_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION, 8), ('VALUE_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION, 12), ('MASK_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION, 16), ('DW5_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION, 20)]) +rocr_AMD_SDMA_PKT_POLL_REGMEM: TypeAlias = rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG(c.Struct): + SIZE = 32 + HEADER_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION + SRC_DATA_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION + SRC_DATA_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION + CMP_DATA_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION + CMP_DATA_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION + LOOP_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + l: int + reserved_0: int + operation: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('l', ctypes.c_uint32, 2, 1, 0), ('reserved_0', ctypes.c_uint32, 2, 8, 1), ('operation', ctypes.c_uint32, 3, 7, 1), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION(c.Struct): + SIZE = 4 + src_data_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION.register_fields([('src_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION(c.Struct): + SIZE = 4 + src_data_63_32: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION.register_fields([('src_data_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION(c.Struct): + SIZE = 4 + cmp_data_31_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION.register_fields([('cmp_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION(c.Struct): + SIZE = 4 + cmp_data_63_32: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION.register_fields([('cmp_data_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION(c.Struct): + SIZE = 4 + loop_interval: int + reserved_0: int + DW_7_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION.register_fields([('loop_interval', ctypes.c_uint32, 0, 13, 0), ('reserved_0', ctypes.c_uint32, 1, 19, 5), ('DW_7_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_ATOMIC_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION, 8), ('SRC_DATA_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION, 12), ('SRC_DATA_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION, 16), ('CMP_DATA_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION, 20), ('CMP_DATA_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION, 24), ('LOOP_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION, 28)]) +rocr_AMD_SDMA_PKT_ATOMIC: TypeAlias = rocr_AMD_SDMA_PKT_ATOMIC_TAG +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG(c.Struct): + SIZE = 12 + HEADER_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION, 8)]) +rocr_AMD_SDMA_PKT_TIMESTAMP: TypeAlias = rocr_AMD_SDMA_PKT_TIMESTAMP_TAG +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG(c.Struct): + SIZE = 8 + HEADER_UNION: rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION + INT_CONTEXT_UNION: rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION(c.Struct): + SIZE = 4 + int_ctx: int + reserved_1: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION.register_fields([('int_ctx', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_1_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_TRAP_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION, 0), ('INT_CONTEXT_UNION', rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION, 4)]) +rocr_AMD_SDMA_PKT_TRAP: TypeAlias = rocr_AMD_SDMA_PKT_TRAP_TAG +@c.record +class rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG(c.Struct): + SIZE = 24 + DW_0_DATA: int + DW_1_DATA: int + DW_2_DATA: int + DW_3_DATA: int + DW_4_DATA: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG.register_fields([('DW_0_DATA', ctypes.c_uint32, 0), ('DW_1_DATA', ctypes.c_uint32, 4), ('DW_2_DATA', ctypes.c_uint32, 8), ('DW_3_DATA', ctypes.c_uint32, 12), ('DW_4_DATA', ctypes.c_uint32, 16), ('DW_5_DATA', ctypes.c_uint32, 20)]) +rocr_AMD_SDMA_PKT_HDP_FLUSH: TypeAlias = rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG(c.Struct): + SIZE = 20 + HEADER_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION + WORD1_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION + WORD2_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION + WORD3_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION + WORD4_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION(c.Struct): + SIZE = 4 + BaseVA_LO: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION.register_fields([('BaseVA_LO', ctypes.c_uint32, 0, 25, 7), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION(c.Struct): + SIZE = 4 + BaseVA_HI: int + GCR_CONTROL_GLI_INV: int + GCR_CONTROL_GL1_RANGE: int + GCR_CONTROL_GLM_WB: int + GCR_CONTROL_GLM_INV: int + GCR_CONTROL_GLK_WB: int + GCR_CONTROL_GLK_INV: int + GCR_CONTROL_GLV_INV: int + GCR_CONTROL_GL1_INV: int + GCR_CONTROL_GL2_US: int + GCR_CONTROL_GL2_RANGE: int + GCR_CONTROL_GL2_DISCARD: int + GCR_CONTROL_GL2_INV: int + GCR_CONTROL_GL2_WB: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION.register_fields([('BaseVA_HI', ctypes.c_uint32, 0, 16, 0), ('GCR_CONTROL_GLI_INV', ctypes.c_uint32, 2, 2, 0), ('GCR_CONTROL_GL1_RANGE', ctypes.c_uint32, 2, 2, 2), ('GCR_CONTROL_GLM_WB', ctypes.c_uint32, 2, 1, 4), ('GCR_CONTROL_GLM_INV', ctypes.c_uint32, 2, 1, 5), ('GCR_CONTROL_GLK_WB', ctypes.c_uint32, 2, 1, 6), ('GCR_CONTROL_GLK_INV', ctypes.c_uint32, 2, 1, 7), ('GCR_CONTROL_GLV_INV', ctypes.c_uint32, 3, 1, 0), ('GCR_CONTROL_GL1_INV', ctypes.c_uint32, 3, 1, 1), ('GCR_CONTROL_GL2_US', ctypes.c_uint32, 3, 1, 2), ('GCR_CONTROL_GL2_RANGE', ctypes.c_uint32, 3, 2, 3), ('GCR_CONTROL_GL2_DISCARD', ctypes.c_uint32, 3, 1, 5), ('GCR_CONTROL_GL2_INV', ctypes.c_uint32, 3, 1, 6), ('GCR_CONTROL_GL2_WB', ctypes.c_uint32, 3, 1, 7), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION(c.Struct): + SIZE = 4 + GCR_CONTROL_RANGE_IS_PA: int + GCR_CONTROL_SEQ: int + LimitVA_LO: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION.register_fields([('GCR_CONTROL_RANGE_IS_PA', ctypes.c_uint32, 0, 1, 0), ('GCR_CONTROL_SEQ', ctypes.c_uint32, 0, 2, 1), ('LimitVA_LO', ctypes.c_uint32, 0, 25, 7), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION(c.Struct): + SIZE = 4 + LimitVA_HI: int + VMID: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION.register_fields([('LimitVA_HI', ctypes.c_uint32, 0, 16, 0), ('VMID', ctypes.c_uint32, 3, 4, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_GCR_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION, 0), ('WORD1_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION, 4), ('WORD2_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION, 8), ('WORD3_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION, 12), ('WORD4_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION, 16)]) +rocr_AMD_SDMA_PKT_GCR: TypeAlias = rocr_AMD_SDMA_PKT_GCR_TAG +SDMA_OP_COPY = 1 +SDMA_OP_FENCE = 5 +SDMA_OP_TRAP = 6 +SDMA_OP_POLL_REGMEM = 8 +SDMA_OP_ATOMIC = 10 +SDMA_OP_CONST_FILL = 11 +SDMA_OP_TIMESTAMP = 13 +SDMA_OP_GCR = 17 +SDMA_SUBOP_COPY_LINEAR = 0 +SDMA_SUBOP_COPY_LINEAR_RECT = 4 +SDMA_SUBOP_TIMESTAMP_GET_GLOBAL = 2 +SDMA_SUBOP_USER_GCR = 1 +SDMA_ATOMIC_ADD64 = 47 +SDMA_OP_NOP = 0 +SDMA_OP_COPY = 1 +SDMA_OP_WRITE = 2 +SDMA_OP_INDIRECT = 4 +SDMA_OP_FENCE = 5 +SDMA_OP_TRAP = 6 +SDMA_OP_SEM = 7 +SDMA_OP_POLL_REGMEM = 8 +SDMA_OP_COND_EXE = 9 +SDMA_OP_ATOMIC = 10 +SDMA_OP_CONST_FILL = 11 +SDMA_OP_PTEPDE = 12 +SDMA_OP_TIMESTAMP = 13 +SDMA_OP_SRBM_WRITE = 14 +SDMA_OP_PRE_EXE = 15 +SDMA_OP_GPUVM_INV = 16 +SDMA_OP_GCR_REQ = 17 +SDMA_OP_DUMMY_TRAP = 32 +SDMA_SUBOP_TIMESTAMP_SET = 0 +SDMA_SUBOP_TIMESTAMP_GET = 1 +SDMA_SUBOP_TIMESTAMP_GET_GLOBAL = 2 +SDMA_SUBOP_COPY_LINEAR = 0 +SDMA_SUBOP_COPY_LINEAR_SUB_WIND = 4 +SDMA_SUBOP_COPY_TILED = 1 +SDMA_SUBOP_COPY_TILED_SUB_WIND = 5 +SDMA_SUBOP_COPY_T2T_SUB_WIND = 6 +SDMA_SUBOP_COPY_SOA = 3 +SDMA_SUBOP_COPY_DIRTY_PAGE = 7 +SDMA_SUBOP_COPY_LINEAR_PHY = 8 +SDMA_SUBOP_COPY_LINEAR_BC = 16 +SDMA_SUBOP_COPY_TILED_BC = 17 +SDMA_SUBOP_COPY_LINEAR_SUB_WIND_BC = 20 +SDMA_SUBOP_COPY_TILED_SUB_WIND_BC = 21 +SDMA_SUBOP_COPY_T2T_SUB_WIND_BC = 22 +SDMA_SUBOP_WRITE_LINEAR = 0 +SDMA_SUBOP_WRITE_TILED = 1 +SDMA_SUBOP_WRITE_TILED_BC = 17 +SDMA_SUBOP_PTEPDE_GEN = 0 +SDMA_SUBOP_PTEPDE_COPY = 1 +SDMA_SUBOP_PTEPDE_RMW = 2 +SDMA_SUBOP_PTEPDE_COPY_BACKWARDS = 3 +SDMA_SUBOP_DATA_FILL_MULTI = 1 +SDMA_SUBOP_POLL_REG_WRITE_MEM = 1 +SDMA_SUBOP_POLL_DBIT_WRITE_MEM = 2 +SDMA_SUBOP_POLL_MEM_VERIFY = 3 +SDMA_SUBOP_VM_INVALIDATION = 4 +HEADER_AGENT_DISPATCH = 4 +HEADER_BARRIER = 5 +SDMA_OP_AQL_COPY = 0 +SDMA_OP_AQL_BARRIER_OR = 0 +SDMA_GCR_RANGE_IS_PA = (1 << 18) +SDMA_GCR_SEQ = lambda x: (((x) & 0x3) << 16) # type: ignore +SDMA_GCR_GL2_WB = (1 << 15) +SDMA_GCR_GL2_INV = (1 << 14) +SDMA_GCR_GL2_DISCARD = (1 << 13) +SDMA_GCR_GL2_RANGE = lambda x: (((x) & 0x3) << 11) # type: ignore +SDMA_GCR_GL2_US = (1 << 10) +SDMA_GCR_GL1_INV = (1 << 9) +SDMA_GCR_GLV_INV = (1 << 8) +SDMA_GCR_GLK_INV = (1 << 7) +SDMA_GCR_GLK_WB = (1 << 6) +SDMA_GCR_GLM_INV = (1 << 5) +SDMA_GCR_GLM_WB = (1 << 4) +SDMA_GCR_GL1_RANGE = lambda x: (((x) & 0x3) << 2) # type: ignore +SDMA_GCR_GLI_INV = lambda x: (((x) & 0x3) << 0) # type: ignore +SDMA_PKT_HEADER_op_offset = 0 +SDMA_PKT_HEADER_op_mask = 0x000000FF +SDMA_PKT_HEADER_op_shift = 0 +SDMA_PKT_HEADER_OP = lambda x: (((x) & SDMA_PKT_HEADER_op_mask) << SDMA_PKT_HEADER_op_shift) # type: ignore +SDMA_PKT_HEADER_sub_op_offset = 0 +SDMA_PKT_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_HEADER_sub_op_shift = 8 +SDMA_PKT_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_HEADER_sub_op_mask) << SDMA_PKT_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_LINEAR_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_encrypt_mask) << SDMA_PKT_COPY_LINEAR_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_backwards_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_backwards_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_backwards_shift = 25 +SDMA_PKT_COPY_LINEAR_HEADER_BACKWARDS = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_backwards_mask) << SDMA_PKT_COPY_LINEAR_HEADER_backwards_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_LINEAR_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_broadcast_mask) << SDMA_PKT_COPY_LINEAR_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_COUNT_count_offset = 1 +SDMA_PKT_COPY_LINEAR_BC_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_LINEAR_BC_COUNT_count_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_COUNT_count_mask) << SDMA_PKT_COPY_LINEAR_BC_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_offset = 2 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_shift = 22 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_DST_HA = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_mask) << SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_offset = 2 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_shift = 30 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_SRC_HA = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_mask) << SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_shift = 31 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_ALL = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_offset = 1 +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_mask) << SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_mask = 0x00000007 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_shift = 3 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_MTYPE = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_shift = 6 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_L2_POLICY = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_mask = 0x00000007 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_shift = 11 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_MTYPE = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_shift = 14 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_L2_POLICY = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_shift = 19 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_GCC = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_shift = 20 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SYS = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_shift = 22 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_shift = 23 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_GPA = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_shift = 28 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SYS = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_shift = 30 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_shift = 31 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_GPA = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_mask = 0x00000007 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_shift = 3 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_MTYPE = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_shift = 6 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_L2_POLICY = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_mask = 0x00000007 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_shift = 11 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_MTYPE = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_shift = 14 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_L2_POLICY = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_shift = 19 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_GCC = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_shift = 20 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SYS = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_shift = 21 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_LOG = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_shift = 22 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_shift = 23 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_GPA = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_shift = 27 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_GCC = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_shift = 28 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SYS = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_shift = 30 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_shift = 31 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_GPA = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_shift = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_DST2_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_shift = 16 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_DST1_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_offset = 5 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_DST1_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_offset = 6 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_DST1_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_offset = 7 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_DST2_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_offset = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_DST2_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_shift = 29 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_ELEMENTSIZE = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_mask = 0x00001FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_SRC_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_offset = 5 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_SRC_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_offset = 6 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_offset = 7 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_DST_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_mask = 0x00001FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_DST_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_offset = 10 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_DST_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_mask = 0x00001FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_shift = 29 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_ELEMENTSIZE = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_SRC_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_offset = 5 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_SRC_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_offset = 6 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_offset = 7 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_DST_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_DST_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_offset = 10 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_DST_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_shift = 22 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_DST_HA = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_shift = 30 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_SRC_HA = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_op_mask) << SDMA_PKT_COPY_TILED_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_TILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_encrypt_mask) << SDMA_PKT_COPY_TILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_TILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_tmz_mask) << SDMA_PKT_COPY_TILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_3_width_offset = 3 +SDMA_PKT_COPY_TILED_DW_3_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_3_width_shift = 0 +SDMA_PKT_COPY_TILED_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_3_width_mask) << SDMA_PKT_COPY_TILED_DW_3_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_4_height_offset = 4 +SDMA_PKT_COPY_TILED_DW_4_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_4_height_shift = 0 +SDMA_PKT_COPY_TILED_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_4_height_mask) << SDMA_PKT_COPY_TILED_DW_4_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_4_depth_offset = 4 +SDMA_PKT_COPY_TILED_DW_4_depth_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_DW_4_depth_shift = 16 +SDMA_PKT_COPY_TILED_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_4_depth_mask) << SDMA_PKT_COPY_TILED_DW_4_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_element_size_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_DW_5_element_size_shift = 0 +SDMA_PKT_COPY_TILED_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_element_size_mask) << SDMA_PKT_COPY_TILED_DW_5_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_shift = 3 +SDMA_PKT_COPY_TILED_DW_5_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_mask) << SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_dimension_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_dimension_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_5_dimension_shift = 9 +SDMA_PKT_COPY_TILED_DW_5_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_dimension_mask) << SDMA_PKT_COPY_TILED_DW_5_dimension_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_mip_max_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_TILED_DW_5_mip_max_shift = 16 +SDMA_PKT_COPY_TILED_DW_5_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_mip_max_mask) << SDMA_PKT_COPY_TILED_DW_5_mip_max_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_6_x_offset = 6 +SDMA_PKT_COPY_TILED_DW_6_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_6_x_shift = 0 +SDMA_PKT_COPY_TILED_DW_6_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_6_x_mask) << SDMA_PKT_COPY_TILED_DW_6_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_6_y_offset = 6 +SDMA_PKT_COPY_TILED_DW_6_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_6_y_shift = 16 +SDMA_PKT_COPY_TILED_DW_6_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_6_y_mask) << SDMA_PKT_COPY_TILED_DW_6_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_z_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_z_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_DW_7_z_shift = 0 +SDMA_PKT_COPY_TILED_DW_7_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_z_mask) << SDMA_PKT_COPY_TILED_DW_7_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_linear_sw_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_7_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_DW_7_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_linear_sw_mask) << SDMA_PKT_COPY_TILED_DW_7_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_linear_cc_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_linear_cc_mask = 0x00000001 +SDMA_PKT_COPY_TILED_DW_7_linear_cc_shift = 20 +SDMA_PKT_COPY_TILED_DW_7_LINEAR_CC = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_linear_cc_mask) << SDMA_PKT_COPY_TILED_DW_7_linear_cc_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_tile_sw_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_7_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_DW_7_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_tile_sw_mask) << SDMA_PKT_COPY_TILED_DW_7_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_offset = 8 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_offset = 9 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_PITCH_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_mask) << SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_COUNT_count_offset = 12 +SDMA_PKT_COPY_TILED_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_TILED_COUNT_count_shift = 0 +SDMA_PKT_COPY_TILED_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_TILED_COUNT_count_mask) << SDMA_PKT_COPY_TILED_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_HEADER_op_mask) << SDMA_PKT_COPY_TILED_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_BC_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_BC_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_BC_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_BC_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_3_width_offset = 3 +SDMA_PKT_COPY_TILED_BC_DW_3_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_BC_DW_3_width_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_3_width_mask) << SDMA_PKT_COPY_TILED_BC_DW_3_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_4_height_offset = 4 +SDMA_PKT_COPY_TILED_BC_DW_4_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_BC_DW_4_height_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_4_height_mask) << SDMA_PKT_COPY_TILED_BC_DW_4_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_4_depth_offset = 4 +SDMA_PKT_COPY_TILED_BC_DW_4_depth_mask = 0x000007FF +SDMA_PKT_COPY_TILED_BC_DW_4_depth_shift = 16 +SDMA_PKT_COPY_TILED_BC_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_4_depth_mask) << SDMA_PKT_COPY_TILED_BC_DW_4_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_element_size_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_BC_DW_5_element_size_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_element_size_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_mask = 0x0000000F +SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_shift = 3 +SDMA_PKT_COPY_TILED_BC_DW_5_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_mask = 0x00000007 +SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_shift = 8 +SDMA_PKT_COPY_TILED_BC_DW_5_MIT_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_shift = 11 +SDMA_PKT_COPY_TILED_BC_DW_5_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_shift = 15 +SDMA_PKT_COPY_TILED_BC_DW_5_BANK_W = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_shift = 18 +SDMA_PKT_COPY_TILED_BC_DW_5_BANK_H = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_shift = 21 +SDMA_PKT_COPY_TILED_BC_DW_5_NUM_BANK = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_shift = 24 +SDMA_PKT_COPY_TILED_BC_DW_5_MAT_ASPT = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_mask = 0x0000001F +SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_shift = 26 +SDMA_PKT_COPY_TILED_BC_DW_5_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_6_x_offset = 6 +SDMA_PKT_COPY_TILED_BC_DW_6_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_BC_DW_6_x_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_6_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_6_x_mask) << SDMA_PKT_COPY_TILED_BC_DW_6_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_6_y_offset = 6 +SDMA_PKT_COPY_TILED_BC_DW_6_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_BC_DW_6_y_shift = 16 +SDMA_PKT_COPY_TILED_BC_DW_6_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_6_y_mask) << SDMA_PKT_COPY_TILED_BC_DW_6_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_7_z_offset = 7 +SDMA_PKT_COPY_TILED_BC_DW_7_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_BC_DW_7_z_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_7_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_7_z_mask) << SDMA_PKT_COPY_TILED_BC_DW_7_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_offset = 7 +SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_BC_DW_7_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_mask) << SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_offset = 7 +SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_BC_DW_7_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_mask) << SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_offset = 8 +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_offset = 9 +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_shift = 0 +SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_mask) << SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_COUNT_count_offset = 11 +SDMA_PKT_COPY_TILED_BC_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_COPY_TILED_BC_COUNT_count_shift = 2 +SDMA_PKT_COPY_TILED_BC_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_COUNT_count_mask) << SDMA_PKT_COPY_TILED_BC_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_shift = 26 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_VIDEOCOPY = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_offset = 1 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_TILED_ADDR0_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_offset = 2 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_TILED_ADDR0_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_offset = 3 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_TILED_ADDR1_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_offset = 4 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_TILED_ADDR1_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_offset = 5 +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_offset = 6 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_offset = 6 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_mask = 0x00001FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_mask = 0x00000007 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_shift = 3 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_shift = 9 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_offset = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_X = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_offset = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_Y = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_offset = 9 +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_mask = 0x00001FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_Z = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_shift = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_DST2_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_shift = 24 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_offset = 11 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_offset = 12 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_offset = 13 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_offset = 14 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_offset = 15 +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_mask) << SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_op_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_HEADER_op_shift = 0 +SDMA_PKT_COPY_T2T_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_op_mask) << SDMA_PKT_COPY_T2T_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_T2T_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_sub_op_mask) << SDMA_PKT_COPY_T2T_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_T2T_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_T2T_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_tmz_mask) << SDMA_PKT_COPY_T2T_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_dcc_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_dcc_mask = 0x00000001 +SDMA_PKT_COPY_T2T_HEADER_dcc_shift = 19 +SDMA_PKT_COPY_T2T_HEADER_DCC = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_dcc_mask) << SDMA_PKT_COPY_T2T_HEADER_dcc_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_dcc_dir_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_dcc_dir_mask = 0x00000001 +SDMA_PKT_COPY_T2T_HEADER_dcc_dir_shift = 31 +SDMA_PKT_COPY_T2T_HEADER_DCC_DIR = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_dcc_dir_mask) << SDMA_PKT_COPY_T2T_HEADER_dcc_dir_shift) # type: ignore +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_T2T_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_3_src_x_mask) << SDMA_PKT_COPY_T2T_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_T2T_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_3_src_y_mask) << SDMA_PKT_COPY_T2T_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_T2T_DW_4_src_z_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_4_src_z_mask) << SDMA_PKT_COPY_T2T_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_4_src_width_offset = 4 +SDMA_PKT_COPY_T2T_DW_4_src_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_4_src_width_shift = 16 +SDMA_PKT_COPY_T2T_DW_4_SRC_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_4_src_width_mask) << SDMA_PKT_COPY_T2T_DW_4_src_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_5_src_height_offset = 5 +SDMA_PKT_COPY_T2T_DW_5_src_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_5_src_height_shift = 0 +SDMA_PKT_COPY_T2T_DW_5_SRC_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_5_src_height_mask) << SDMA_PKT_COPY_T2T_DW_5_src_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_5_src_depth_offset = 5 +SDMA_PKT_COPY_T2T_DW_5_src_depth_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_5_src_depth_shift = 16 +SDMA_PKT_COPY_T2T_DW_5_SRC_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_5_src_depth_mask) << SDMA_PKT_COPY_T2T_DW_5_src_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_element_size_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_DW_6_src_element_size_shift = 0 +SDMA_PKT_COPY_T2T_DW_6_SRC_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_element_size_mask) << SDMA_PKT_COPY_T2T_DW_6_src_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_shift = 3 +SDMA_PKT_COPY_T2T_DW_6_SRC_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_mask) << SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_dimension_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_dimension_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_6_src_dimension_shift = 9 +SDMA_PKT_COPY_T2T_DW_6_SRC_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_dimension_mask) << SDMA_PKT_COPY_T2T_DW_6_src_dimension_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_mip_max_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_T2T_DW_6_src_mip_max_shift = 16 +SDMA_PKT_COPY_T2T_DW_6_SRC_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_mip_max_mask) << SDMA_PKT_COPY_T2T_DW_6_src_mip_max_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_mip_id_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_mip_id_mask = 0x0000000F +SDMA_PKT_COPY_T2T_DW_6_src_mip_id_shift = 20 +SDMA_PKT_COPY_T2T_DW_6_SRC_MIP_ID = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_mip_id_mask) << SDMA_PKT_COPY_T2T_DW_6_src_mip_id_shift) # type: ignore +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_offset = 7 +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_offset = 8 +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_9_dst_x_offset = 9 +SDMA_PKT_COPY_T2T_DW_9_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_9_dst_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_9_DST_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_9_dst_x_mask) << SDMA_PKT_COPY_T2T_DW_9_dst_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_9_dst_y_offset = 9 +SDMA_PKT_COPY_T2T_DW_9_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_9_dst_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_9_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_9_dst_y_mask) << SDMA_PKT_COPY_T2T_DW_9_dst_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_10_dst_z_offset = 10 +SDMA_PKT_COPY_T2T_DW_10_dst_z_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_10_dst_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_10_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_10_dst_z_mask) << SDMA_PKT_COPY_T2T_DW_10_dst_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_10_dst_width_offset = 10 +SDMA_PKT_COPY_T2T_DW_10_dst_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_10_dst_width_shift = 16 +SDMA_PKT_COPY_T2T_DW_10_DST_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_10_dst_width_mask) << SDMA_PKT_COPY_T2T_DW_10_dst_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_11_dst_height_offset = 11 +SDMA_PKT_COPY_T2T_DW_11_dst_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_11_dst_height_shift = 0 +SDMA_PKT_COPY_T2T_DW_11_DST_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_11_dst_height_mask) << SDMA_PKT_COPY_T2T_DW_11_dst_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_11_dst_depth_offset = 11 +SDMA_PKT_COPY_T2T_DW_11_dst_depth_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_11_dst_depth_shift = 16 +SDMA_PKT_COPY_T2T_DW_11_DST_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_11_dst_depth_mask) << SDMA_PKT_COPY_T2T_DW_11_dst_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_shift = 0 +SDMA_PKT_COPY_T2T_DW_12_DST_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_element_size_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_shift = 3 +SDMA_PKT_COPY_T2T_DW_12_DST_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_shift = 9 +SDMA_PKT_COPY_T2T_DW_12_DST_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_dimension_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_dimension_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_shift = 16 +SDMA_PKT_COPY_T2T_DW_12_DST_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_mask = 0x0000000F +SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_shift = 20 +SDMA_PKT_COPY_T2T_DW_12_DST_MIP_ID = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_13_rect_x_offset = 13 +SDMA_PKT_COPY_T2T_DW_13_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_13_rect_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_13_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_13_rect_x_mask) << SDMA_PKT_COPY_T2T_DW_13_rect_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_13_rect_y_offset = 13 +SDMA_PKT_COPY_T2T_DW_13_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_13_rect_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_13_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_13_rect_y_mask) << SDMA_PKT_COPY_T2T_DW_13_rect_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_rect_z_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_rect_z_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_14_rect_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_14_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_rect_z_mask) << SDMA_PKT_COPY_T2T_DW_14_rect_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_dst_sw_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_14_dst_sw_shift = 16 +SDMA_PKT_COPY_T2T_DW_14_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_dst_sw_mask) << SDMA_PKT_COPY_T2T_DW_14_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_src_sw_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_14_src_sw_shift = 24 +SDMA_PKT_COPY_T2T_DW_14_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_src_sw_mask) << SDMA_PKT_COPY_T2T_DW_14_src_sw_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_offset = 15 +SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_META_ADDR_LO_META_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_mask) << SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_offset = 16 +SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_META_ADDR_HI_META_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_mask) << SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_data_format_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_data_format_mask = 0x0000007F +SDMA_PKT_COPY_T2T_META_CONFIG_data_format_shift = 0 +SDMA_PKT_COPY_T2T_META_CONFIG_DATA_FORMAT = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_data_format_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_data_format_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_shift = 7 +SDMA_PKT_COPY_T2T_META_CONFIG_COLOR_TRANSFORM_DISABLE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_shift = 8 +SDMA_PKT_COPY_T2T_META_CONFIG_ALPHA_IS_ON_MSB = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_number_type_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_number_type_mask = 0x00000007 +SDMA_PKT_COPY_T2T_META_CONFIG_number_type_shift = 9 +SDMA_PKT_COPY_T2T_META_CONFIG_NUMBER_TYPE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_number_type_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_number_type_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_mask = 0x00000003 +SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_shift = 12 +SDMA_PKT_COPY_T2T_META_CONFIG_SURFACE_TYPE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_mask = 0x00000003 +SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_shift = 24 +SDMA_PKT_COPY_T2T_META_CONFIG_MAX_COMP_BLOCK_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_mask = 0x00000003 +SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_shift = 26 +SDMA_PKT_COPY_T2T_META_CONFIG_MAX_UNCOMP_BLOCK_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_shift = 28 +SDMA_PKT_COPY_T2T_META_CONFIG_WRITE_COMPRESS_ENABLE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_shift = 29 +SDMA_PKT_COPY_T2T_META_CONFIG_META_TMZ = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_T2T_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_T2T_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_HEADER_op_mask) << SDMA_PKT_COPY_T2T_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_T2T_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_T2T_BC_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_3_src_x_mask) << SDMA_PKT_COPY_T2T_BC_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_T2T_BC_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_3_src_y_mask) << SDMA_PKT_COPY_T2T_BC_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_T2T_BC_DW_4_src_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_BC_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_4_src_z_mask) << SDMA_PKT_COPY_T2T_BC_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_4_src_width_offset = 4 +SDMA_PKT_COPY_T2T_BC_DW_4_src_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_4_src_width_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_4_SRC_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_4_src_width_mask) << SDMA_PKT_COPY_T2T_BC_DW_4_src_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_5_src_height_offset = 5 +SDMA_PKT_COPY_T2T_BC_DW_5_src_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_5_src_height_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_5_SRC_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_5_src_height_mask) << SDMA_PKT_COPY_T2T_BC_DW_5_src_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_offset = 5 +SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_mask = 0x000007FF +SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_5_SRC_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_mask) << SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_mask = 0x0000000F +SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_shift = 3 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_shift = 8 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_MIT_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_shift = 11 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_shift = 15 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_BANK_W = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_shift = 18 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_BANK_H = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_shift = 21 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_NUM_BANK = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_shift = 24 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_MAT_ASPT = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_mask = 0x0000001F +SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_shift = 26 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_offset = 7 +SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_offset = 8 +SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_offset = 9 +SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_9_DST_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_mask) << SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_offset = 9 +SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_9_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_mask) << SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_offset = 10 +SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_10_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_mask) << SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_offset = 10 +SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_10_DST_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_mask) << SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_offset = 11 +SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_11_DST_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_mask) << SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_offset = 11 +SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_mask = 0x00000FFF +SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_11_DST_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_mask) << SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_mask = 0x0000000F +SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_shift = 3 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_shift = 8 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_MIT_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_shift = 11 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_shift = 15 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_BANK_W = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_shift = 18 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_BANK_H = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_shift = 21 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_NUM_BANK = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_shift = 24 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_MAT_ASPT = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_mask = 0x0000001F +SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_shift = 26 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_offset = 13 +SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_13_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_mask) << SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_offset = 13 +SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_13_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_mask) << SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_offset = 14 +SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_14_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_mask) << SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_offset = 14 +SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_14_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_mask) << SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_offset = 14 +SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_shift = 24 +SDMA_PKT_COPY_T2T_BC_DW_14_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_mask) << SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_shift = 19 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_DCC = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_TILED_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_TILED_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_TILED_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_shift = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_shift = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_mask = 0x0000000F +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_shift = 20 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_MIP_ID = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_offset = 7 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_offset = 8 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_LINEAR_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_LINEAR_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_LINEAR_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_offset = 14 +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_META_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_offset = 15 +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_META_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_mask = 0x0000007F +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_DATA_FORMAT = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_shift = 7 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_COLOR_TRANSFORM_DISABLE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_ALPHA_IS_ON_MSB = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_shift = 9 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_NUMBER_TYPE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_shift = 12 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_SURFACE_TYPE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_MAX_COMP_BLOCK_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_shift = 26 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_MAX_UNCOMP_BLOCK_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_shift = 28 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_WRITE_COMPRESS_ENABLE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_shift = 29 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_META_TMZ = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_TILED_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_TILED_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_TILED_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_mask = 0x0000000F +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_shift = 3 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_MIT_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_shift = 11 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_shift = 15 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_BANK_W = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_shift = 18 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_BANK_H = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_shift = 21 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_NUM_BANK = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_MAT_ASPT = lambda x: ((x & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_mask = 0x0000001F +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_shift = 26 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_offset = 7 +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_offset = 8 +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_LINEAR_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_LINEAR_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_LINEAR_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_op_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_STRUCT_HEADER_op_shift = 0 +SDMA_PKT_COPY_STRUCT_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_op_mask) << SDMA_PKT_COPY_STRUCT_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_STRUCT_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_sub_op_mask) << SDMA_PKT_COPY_STRUCT_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_STRUCT_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_STRUCT_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_tmz_mask) << SDMA_PKT_COPY_STRUCT_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_detile_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_STRUCT_HEADER_detile_shift = 31 +SDMA_PKT_COPY_STRUCT_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_detile_mask) << SDMA_PKT_COPY_STRUCT_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_offset = 1 +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_shift = 0 +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_SB_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_mask) << SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_offset = 2 +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_shift = 0 +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_SB_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_mask) << SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_offset = 3 +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_shift = 0 +SDMA_PKT_COPY_STRUCT_START_INDEX_START_INDEX = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_mask) << SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_COUNT_count_offset = 4 +SDMA_PKT_COPY_STRUCT_COUNT_count_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_COUNT_count_shift = 0 +SDMA_PKT_COPY_STRUCT_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_COUNT_count_mask) << SDMA_PKT_COPY_STRUCT_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_stride_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_stride_mask = 0x000007FF +SDMA_PKT_COPY_STRUCT_DW_5_stride_shift = 0 +SDMA_PKT_COPY_STRUCT_DW_5_STRIDE = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_stride_mask) << SDMA_PKT_COPY_STRUCT_DW_5_stride_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_shift = 16 +SDMA_PKT_COPY_STRUCT_DW_5_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_mask) << SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_mask = 0x00000003 +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_shift = 24 +SDMA_PKT_COPY_STRUCT_DW_5_STRUCT_SW = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_mask) << SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_offset = 6 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_offset = 7 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_op_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_UNTILED_HEADER_op_shift = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_op_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_UNTILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_shift = 16 +SDMA_PKT_WRITE_UNTILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_shift = 18 +SDMA_PKT_WRITE_UNTILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_tmz_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DW_3_count_offset = 3 +SDMA_PKT_WRITE_UNTILED_DW_3_count_mask = 0x000FFFFF +SDMA_PKT_WRITE_UNTILED_DW_3_count_shift = 0 +SDMA_PKT_WRITE_UNTILED_DW_3_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DW_3_count_mask) << SDMA_PKT_WRITE_UNTILED_DW_3_count_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DW_3_sw_offset = 3 +SDMA_PKT_WRITE_UNTILED_DW_3_sw_mask = 0x00000003 +SDMA_PKT_WRITE_UNTILED_DW_3_sw_shift = 24 +SDMA_PKT_WRITE_UNTILED_DW_3_SW = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DW_3_sw_mask) << SDMA_PKT_WRITE_UNTILED_DW_3_sw_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DATA0_data0_offset = 4 +SDMA_PKT_WRITE_UNTILED_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DATA0_data0_shift = 0 +SDMA_PKT_WRITE_UNTILED_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DATA0_data0_mask) << SDMA_PKT_WRITE_UNTILED_DATA0_data0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_op_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_HEADER_op_shift = 0 +SDMA_PKT_WRITE_TILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_op_mask) << SDMA_PKT_WRITE_TILED_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_TILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_sub_op_mask) << SDMA_PKT_WRITE_TILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_encrypt_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_WRITE_TILED_HEADER_encrypt_shift = 16 +SDMA_PKT_WRITE_TILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_encrypt_mask) << SDMA_PKT_WRITE_TILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_tmz_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_WRITE_TILED_HEADER_tmz_shift = 18 +SDMA_PKT_WRITE_TILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_tmz_mask) << SDMA_PKT_WRITE_TILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_3_width_offset = 3 +SDMA_PKT_WRITE_TILED_DW_3_width_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_3_width_shift = 0 +SDMA_PKT_WRITE_TILED_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_3_width_mask) << SDMA_PKT_WRITE_TILED_DW_3_width_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_4_height_offset = 4 +SDMA_PKT_WRITE_TILED_DW_4_height_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_4_height_shift = 0 +SDMA_PKT_WRITE_TILED_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_4_height_mask) << SDMA_PKT_WRITE_TILED_DW_4_height_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_4_depth_offset = 4 +SDMA_PKT_WRITE_TILED_DW_4_depth_mask = 0x00001FFF +SDMA_PKT_WRITE_TILED_DW_4_depth_shift = 16 +SDMA_PKT_WRITE_TILED_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_4_depth_mask) << SDMA_PKT_WRITE_TILED_DW_4_depth_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_element_size_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_DW_5_element_size_shift = 0 +SDMA_PKT_WRITE_TILED_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_element_size_mask) << SDMA_PKT_WRITE_TILED_DW_5_element_size_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_mask = 0x0000001F +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_shift = 3 +SDMA_PKT_WRITE_TILED_DW_5_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_mask) << SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_dimension_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_dimension_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_DW_5_dimension_shift = 9 +SDMA_PKT_WRITE_TILED_DW_5_DIMENSION = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_dimension_mask) << SDMA_PKT_WRITE_TILED_DW_5_dimension_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_mip_max_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_mip_max_mask = 0x0000000F +SDMA_PKT_WRITE_TILED_DW_5_mip_max_shift = 16 +SDMA_PKT_WRITE_TILED_DW_5_MIP_MAX = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_mip_max_mask) << SDMA_PKT_WRITE_TILED_DW_5_mip_max_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_6_x_offset = 6 +SDMA_PKT_WRITE_TILED_DW_6_x_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_6_x_shift = 0 +SDMA_PKT_WRITE_TILED_DW_6_X = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_6_x_mask) << SDMA_PKT_WRITE_TILED_DW_6_x_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_6_y_offset = 6 +SDMA_PKT_WRITE_TILED_DW_6_y_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_6_y_shift = 16 +SDMA_PKT_WRITE_TILED_DW_6_Y = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_6_y_mask) << SDMA_PKT_WRITE_TILED_DW_6_y_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_7_z_offset = 7 +SDMA_PKT_WRITE_TILED_DW_7_z_mask = 0x00001FFF +SDMA_PKT_WRITE_TILED_DW_7_z_shift = 0 +SDMA_PKT_WRITE_TILED_DW_7_Z = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_7_z_mask) << SDMA_PKT_WRITE_TILED_DW_7_z_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_7_sw_offset = 7 +SDMA_PKT_WRITE_TILED_DW_7_sw_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_DW_7_sw_shift = 24 +SDMA_PKT_WRITE_TILED_DW_7_SW = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_7_sw_mask) << SDMA_PKT_WRITE_TILED_DW_7_sw_shift) # type: ignore +SDMA_PKT_WRITE_TILED_COUNT_count_offset = 8 +SDMA_PKT_WRITE_TILED_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_WRITE_TILED_COUNT_count_shift = 0 +SDMA_PKT_WRITE_TILED_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_COUNT_count_mask) << SDMA_PKT_WRITE_TILED_COUNT_count_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DATA0_data0_offset = 9 +SDMA_PKT_WRITE_TILED_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DATA0_data0_shift = 0 +SDMA_PKT_WRITE_TILED_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DATA0_data0_mask) << SDMA_PKT_WRITE_TILED_DATA0_data0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_HEADER_op_offset = 0 +SDMA_PKT_WRITE_TILED_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_BC_HEADER_op_shift = 0 +SDMA_PKT_WRITE_TILED_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_HEADER_op_mask) << SDMA_PKT_WRITE_TILED_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_TILED_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_mask) << SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_3_width_offset = 3 +SDMA_PKT_WRITE_TILED_BC_DW_3_width_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_BC_DW_3_width_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_3_width_mask) << SDMA_PKT_WRITE_TILED_BC_DW_3_width_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_4_height_offset = 4 +SDMA_PKT_WRITE_TILED_BC_DW_4_height_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_BC_DW_4_height_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_4_height_mask) << SDMA_PKT_WRITE_TILED_BC_DW_4_height_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_4_depth_offset = 4 +SDMA_PKT_WRITE_TILED_BC_DW_4_depth_mask = 0x000007FF +SDMA_PKT_WRITE_TILED_BC_DW_4_depth_shift = 16 +SDMA_PKT_WRITE_TILED_BC_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_4_depth_mask) << SDMA_PKT_WRITE_TILED_BC_DW_4_depth_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_mask = 0x0000000F +SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_shift = 3 +SDMA_PKT_WRITE_TILED_BC_DW_5_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_shift = 8 +SDMA_PKT_WRITE_TILED_BC_DW_5_MIT_MODE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_shift = 11 +SDMA_PKT_WRITE_TILED_BC_DW_5_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_shift = 15 +SDMA_PKT_WRITE_TILED_BC_DW_5_BANK_W = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_shift = 18 +SDMA_PKT_WRITE_TILED_BC_DW_5_BANK_H = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_shift = 21 +SDMA_PKT_WRITE_TILED_BC_DW_5_NUM_BANK = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_shift = 24 +SDMA_PKT_WRITE_TILED_BC_DW_5_MAT_ASPT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_mask = 0x0000001F +SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_shift = 26 +SDMA_PKT_WRITE_TILED_BC_DW_5_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_6_x_offset = 6 +SDMA_PKT_WRITE_TILED_BC_DW_6_x_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_BC_DW_6_x_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_6_X = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_6_x_mask) << SDMA_PKT_WRITE_TILED_BC_DW_6_x_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_6_y_offset = 6 +SDMA_PKT_WRITE_TILED_BC_DW_6_y_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_BC_DW_6_y_shift = 16 +SDMA_PKT_WRITE_TILED_BC_DW_6_Y = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_6_y_mask) << SDMA_PKT_WRITE_TILED_BC_DW_6_y_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_7_z_offset = 7 +SDMA_PKT_WRITE_TILED_BC_DW_7_z_mask = 0x000007FF +SDMA_PKT_WRITE_TILED_BC_DW_7_z_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_7_Z = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_7_z_mask) << SDMA_PKT_WRITE_TILED_BC_DW_7_z_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_7_sw_offset = 7 +SDMA_PKT_WRITE_TILED_BC_DW_7_sw_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_7_sw_shift = 24 +SDMA_PKT_WRITE_TILED_BC_DW_7_SW = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_7_sw_mask) << SDMA_PKT_WRITE_TILED_BC_DW_7_sw_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_COUNT_count_offset = 8 +SDMA_PKT_WRITE_TILED_BC_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_WRITE_TILED_BC_COUNT_count_shift = 2 +SDMA_PKT_WRITE_TILED_BC_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_COUNT_count_mask) << SDMA_PKT_WRITE_TILED_BC_COUNT_count_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DATA0_data0_offset = 9 +SDMA_PKT_WRITE_TILED_BC_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_BC_DATA0_data0_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DATA0_data0_mask) << SDMA_PKT_WRITE_TILED_BC_DATA0_data0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_COPY_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_tmz_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_HEADER_tmz_shift = 18 +SDMA_PKT_PTEPDE_COPY_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_tmz_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_tmz_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_shift = 31 +SDMA_PKT_PTEPDE_COPY_HEADER_PTEPDE_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_offset = 5 +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_shift = 0 +SDMA_PKT_PTEPDE_COPY_MASK_DW0_MASK_DW0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_mask) << SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_offset = 6 +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_shift = 0 +SDMA_PKT_PTEPDE_COPY_MASK_DW1_MASK_DW1 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_mask) << SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_COUNT_count_offset = 7 +SDMA_PKT_PTEPDE_COPY_COUNT_count_mask = 0x0007FFFF +SDMA_PKT_PTEPDE_COPY_COUNT_count_shift = 0 +SDMA_PKT_PTEPDE_COPY_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_COUNT_count_mask) << SDMA_PKT_PTEPDE_COPY_COUNT_count_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_mask = 0x00000003 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_shift = 28 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_PTE_SIZE = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_shift = 30 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_DIRECTION = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_shift = 31 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_PTEPDE_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_offset = 5 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_MASK_FIRST_XFER = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_offset = 5 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_shift = 8 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_MASK_LAST_XFER = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_offset = 6 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_mask = 0x0001FFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_COUNT = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_RMW_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_op_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_RMW_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_mtype_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_mtype_mask = 0x00000007 +SDMA_PKT_PTEPDE_RMW_HEADER_mtype_shift = 16 +SDMA_PKT_PTEPDE_RMW_HEADER_MTYPE = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_mtype_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_mtype_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_shift = 19 +SDMA_PKT_PTEPDE_RMW_HEADER_GCC = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_gcc_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_gcc_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_sys_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_sys_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_sys_shift = 20 +SDMA_PKT_PTEPDE_RMW_HEADER_SYS = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_sys_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_sys_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_snp_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_snp_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_snp_shift = 22 +SDMA_PKT_PTEPDE_RMW_HEADER_SNP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_snp_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_snp_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_shift = 23 +SDMA_PKT_PTEPDE_RMW_HEADER_GPA = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_gpa_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_gpa_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_mask = 0x00000003 +SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_shift = 24 +SDMA_PKT_PTEPDE_RMW_HEADER_L2_POLICY = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_mask) << SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_mask) << SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_offset = 3 +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_MASK_LO_MASK_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_mask) << SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_offset = 4 +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_MASK_HI_MASK_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_mask) << SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_offset = 5 +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_VALUE_LO_VALUE_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_mask) << SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_offset = 6 +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_VALUE_HI_VALUE_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_mask) << SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_shift) # type: ignore +SDMA_PKT_WRITE_INCR_HEADER_op_offset = 0 +SDMA_PKT_WRITE_INCR_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_INCR_HEADER_op_shift = 0 +SDMA_PKT_WRITE_INCR_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_INCR_HEADER_op_mask) << SDMA_PKT_WRITE_INCR_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_INCR_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_INCR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_INCR_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_INCR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_INCR_HEADER_sub_op_mask) << SDMA_PKT_WRITE_INCR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_offset = 3 +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_MASK_DW0_MASK_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_mask) << SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_offset = 4 +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_MASK_DW1_MASK_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_mask) << SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_offset = 5 +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_INIT_DW0_INIT_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_mask) << SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_offset = 6 +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_INIT_DW1_INIT_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_mask) << SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_offset = 7 +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_INCR_DW0_INCR_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_mask) << SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_offset = 8 +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_INCR_DW1_INCR_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_mask) << SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_COUNT_count_offset = 9 +SDMA_PKT_WRITE_INCR_COUNT_count_mask = 0x0007FFFF +SDMA_PKT_WRITE_INCR_COUNT_count_shift = 0 +SDMA_PKT_WRITE_INCR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_INCR_COUNT_count_mask) << SDMA_PKT_WRITE_INCR_COUNT_count_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_op_offset = 0 +SDMA_PKT_INDIRECT_HEADER_op_mask = 0x000000FF +SDMA_PKT_INDIRECT_HEADER_op_shift = 0 +SDMA_PKT_INDIRECT_HEADER_OP = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_op_mask) << SDMA_PKT_INDIRECT_HEADER_op_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_sub_op_offset = 0 +SDMA_PKT_INDIRECT_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_INDIRECT_HEADER_sub_op_shift = 8 +SDMA_PKT_INDIRECT_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_sub_op_mask) << SDMA_PKT_INDIRECT_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_vmid_offset = 0 +SDMA_PKT_INDIRECT_HEADER_vmid_mask = 0x0000000F +SDMA_PKT_INDIRECT_HEADER_vmid_shift = 16 +SDMA_PKT_INDIRECT_HEADER_VMID = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_vmid_mask) << SDMA_PKT_INDIRECT_HEADER_vmid_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_priv_offset = 0 +SDMA_PKT_INDIRECT_HEADER_priv_mask = 0x00000001 +SDMA_PKT_INDIRECT_HEADER_priv_shift = 31 +SDMA_PKT_INDIRECT_HEADER_PRIV = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_priv_mask) << SDMA_PKT_INDIRECT_HEADER_priv_shift) # type: ignore +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_offset = 1 +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_shift = 0 +SDMA_PKT_INDIRECT_BASE_LO_IB_BASE_31_0 = lambda x: (((x) & SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_mask) << SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_shift) # type: ignore +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_offset = 2 +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_shift = 0 +SDMA_PKT_INDIRECT_BASE_HI_IB_BASE_63_32 = lambda x: (((x) & SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_mask) << SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_shift) # type: ignore +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_offset = 3 +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_mask = 0x000FFFFF +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_shift = 0 +SDMA_PKT_INDIRECT_IB_SIZE_IB_SIZE = lambda x: (((x) & SDMA_PKT_INDIRECT_IB_SIZE_ib_size_mask) << SDMA_PKT_INDIRECT_IB_SIZE_ib_size_shift) # type: ignore +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_offset = 4 +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_shift = 0 +SDMA_PKT_INDIRECT_CSA_ADDR_LO_CSA_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_mask) << SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_shift) # type: ignore +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_offset = 5 +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_shift = 0 +SDMA_PKT_INDIRECT_CSA_ADDR_HI_CSA_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_mask) << SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_op_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_op_mask = 0x000000FF +SDMA_PKT_SEMAPHORE_HEADER_op_shift = 0 +SDMA_PKT_SEMAPHORE_HEADER_OP = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_op_mask) << SDMA_PKT_SEMAPHORE_HEADER_op_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_sub_op_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_SEMAPHORE_HEADER_sub_op_shift = 8 +SDMA_PKT_SEMAPHORE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_sub_op_mask) << SDMA_PKT_SEMAPHORE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_write_one_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_write_one_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_write_one_shift = 29 +SDMA_PKT_SEMAPHORE_HEADER_WRITE_ONE = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_write_one_mask) << SDMA_PKT_SEMAPHORE_HEADER_write_one_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_signal_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_signal_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_signal_shift = 30 +SDMA_PKT_SEMAPHORE_HEADER_SIGNAL = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_signal_mask) << SDMA_PKT_SEMAPHORE_HEADER_signal_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_mailbox_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_mailbox_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_mailbox_shift = 31 +SDMA_PKT_SEMAPHORE_HEADER_MAILBOX = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_mailbox_mask) << SDMA_PKT_SEMAPHORE_HEADER_mailbox_shift) # type: ignore +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_SEMAPHORE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_SEMAPHORE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_op_offset = 0 +SDMA_PKT_FENCE_HEADER_op_mask = 0x000000FF +SDMA_PKT_FENCE_HEADER_op_shift = 0 +SDMA_PKT_FENCE_HEADER_OP = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_op_mask) << SDMA_PKT_FENCE_HEADER_op_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_sub_op_offset = 0 +SDMA_PKT_FENCE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_FENCE_HEADER_sub_op_shift = 8 +SDMA_PKT_FENCE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_sub_op_mask) << SDMA_PKT_FENCE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_mtype_offset = 0 +SDMA_PKT_FENCE_HEADER_mtype_mask = 0x00000007 +SDMA_PKT_FENCE_HEADER_mtype_shift = 16 +SDMA_PKT_FENCE_HEADER_MTYPE = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_mtype_mask) << SDMA_PKT_FENCE_HEADER_mtype_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_gcc_offset = 0 +SDMA_PKT_FENCE_HEADER_gcc_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_gcc_shift = 19 +SDMA_PKT_FENCE_HEADER_GCC = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_gcc_mask) << SDMA_PKT_FENCE_HEADER_gcc_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_sys_offset = 0 +SDMA_PKT_FENCE_HEADER_sys_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_sys_shift = 20 +SDMA_PKT_FENCE_HEADER_SYS = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_sys_mask) << SDMA_PKT_FENCE_HEADER_sys_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_snp_offset = 0 +SDMA_PKT_FENCE_HEADER_snp_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_snp_shift = 22 +SDMA_PKT_FENCE_HEADER_SNP = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_snp_mask) << SDMA_PKT_FENCE_HEADER_snp_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_gpa_offset = 0 +SDMA_PKT_FENCE_HEADER_gpa_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_gpa_shift = 23 +SDMA_PKT_FENCE_HEADER_GPA = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_gpa_mask) << SDMA_PKT_FENCE_HEADER_gpa_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_l2_policy_offset = 0 +SDMA_PKT_FENCE_HEADER_l2_policy_mask = 0x00000003 +SDMA_PKT_FENCE_HEADER_l2_policy_shift = 24 +SDMA_PKT_FENCE_HEADER_L2_POLICY = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_l2_policy_mask) << SDMA_PKT_FENCE_HEADER_l2_policy_shift) # type: ignore +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_FENCE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_FENCE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_FENCE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_FENCE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_FENCE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_FENCE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_FENCE_DATA_data_offset = 3 +SDMA_PKT_FENCE_DATA_data_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_DATA_data_shift = 0 +SDMA_PKT_FENCE_DATA_DATA = lambda x: (((x) & SDMA_PKT_FENCE_DATA_data_mask) << SDMA_PKT_FENCE_DATA_data_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_op_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_op_mask = 0x000000FF +SDMA_PKT_SRBM_WRITE_HEADER_op_shift = 0 +SDMA_PKT_SRBM_WRITE_HEADER_OP = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_op_mask) << SDMA_PKT_SRBM_WRITE_HEADER_op_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_shift = 8 +SDMA_PKT_SRBM_WRITE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_sub_op_mask) << SDMA_PKT_SRBM_WRITE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_mask = 0x0000000F +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_shift = 28 +SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_byte_en_mask) << SDMA_PKT_SRBM_WRITE_HEADER_byte_en_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_ADDR_addr_offset = 1 +SDMA_PKT_SRBM_WRITE_ADDR_addr_mask = 0x0003FFFF +SDMA_PKT_SRBM_WRITE_ADDR_addr_shift = 0 +SDMA_PKT_SRBM_WRITE_ADDR_ADDR = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_ADDR_addr_mask) << SDMA_PKT_SRBM_WRITE_ADDR_addr_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_ADDR_apertureid_offset = 1 +SDMA_PKT_SRBM_WRITE_ADDR_apertureid_mask = 0x00000FFF +SDMA_PKT_SRBM_WRITE_ADDR_apertureid_shift = 20 +SDMA_PKT_SRBM_WRITE_ADDR_APERTUREID = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_ADDR_apertureid_mask) << SDMA_PKT_SRBM_WRITE_ADDR_apertureid_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_DATA_data_offset = 2 +SDMA_PKT_SRBM_WRITE_DATA_data_mask = 0xFFFFFFFF +SDMA_PKT_SRBM_WRITE_DATA_data_shift = 0 +SDMA_PKT_SRBM_WRITE_DATA_DATA = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_DATA_data_mask) << SDMA_PKT_SRBM_WRITE_DATA_data_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_op_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_op_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_op_shift = 0 +SDMA_PKT_PRE_EXE_HEADER_OP = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_op_mask) << SDMA_PKT_PRE_EXE_HEADER_op_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_sub_op_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_sub_op_shift = 8 +SDMA_PKT_PRE_EXE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_sub_op_mask) << SDMA_PKT_PRE_EXE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_dev_sel_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_dev_sel_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_dev_sel_shift = 16 +SDMA_PKT_PRE_EXE_HEADER_DEV_SEL = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_dev_sel_mask) << SDMA_PKT_PRE_EXE_HEADER_dev_sel_shift) # type: ignore +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_offset = 1 +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_mask = 0x00003FFF +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_shift = 0 +SDMA_PKT_PRE_EXE_EXEC_COUNT_EXEC_COUNT = lambda x: (((x) & SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_mask) << SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_shift) # type: ignore +SDMA_PKT_COND_EXE_HEADER_op_offset = 0 +SDMA_PKT_COND_EXE_HEADER_op_mask = 0x000000FF +SDMA_PKT_COND_EXE_HEADER_op_shift = 0 +SDMA_PKT_COND_EXE_HEADER_OP = lambda x: (((x) & SDMA_PKT_COND_EXE_HEADER_op_mask) << SDMA_PKT_COND_EXE_HEADER_op_shift) # type: ignore +SDMA_PKT_COND_EXE_HEADER_sub_op_offset = 0 +SDMA_PKT_COND_EXE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COND_EXE_HEADER_sub_op_shift = 8 +SDMA_PKT_COND_EXE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COND_EXE_HEADER_sub_op_mask) << SDMA_PKT_COND_EXE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_COND_EXE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_COND_EXE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_COND_EXE_REFERENCE_reference_offset = 3 +SDMA_PKT_COND_EXE_REFERENCE_reference_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_REFERENCE_reference_shift = 0 +SDMA_PKT_COND_EXE_REFERENCE_REFERENCE = lambda x: (((x) & SDMA_PKT_COND_EXE_REFERENCE_reference_mask) << SDMA_PKT_COND_EXE_REFERENCE_reference_shift) # type: ignore +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_offset = 4 +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_mask = 0x00003FFF +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_shift = 0 +SDMA_PKT_COND_EXE_EXEC_COUNT_EXEC_COUNT = lambda x: (((x) & SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_mask) << SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_op_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_op_mask = 0x000000FF +SDMA_PKT_CONSTANT_FILL_HEADER_op_shift = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_OP = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_op_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_op_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_shift = 8 +SDMA_PKT_CONSTANT_FILL_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_sw_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_sw_mask = 0x00000003 +SDMA_PKT_CONSTANT_FILL_HEADER_sw_shift = 16 +SDMA_PKT_CONSTANT_FILL_HEADER_SW = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_sw_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_sw_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_mask = 0x00000003 +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_shift = 30 +SDMA_PKT_CONSTANT_FILL_HEADER_FILLSIZE = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_offset = 3 +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_shift = 0 +SDMA_PKT_CONSTANT_FILL_DATA_SRC_DATA_31_0 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_mask) << SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_COUNT_count_offset = 4 +SDMA_PKT_CONSTANT_FILL_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_CONSTANT_FILL_COUNT_count_shift = 0 +SDMA_PKT_CONSTANT_FILL_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_COUNT_count_mask) << SDMA_PKT_CONSTANT_FILL_COUNT_count_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_mask = 0x000000FF +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_OP = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_op_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_op_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_shift = 8 +SDMA_PKT_DATA_FILL_MULTI_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_mask = 0x00000001 +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_shift = 31 +SDMA_PKT_DATA_FILL_MULTI_HEADER_MEMLOG_CLR = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_offset = 1 +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_BYTE_STRIDE = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_mask) << SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_offset = 2 +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_DMA_COUNT = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_mask) << SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_offset = 5 +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_mask = 0x03FFFFFF +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_mask) << SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_REGMEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_REGMEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_op_mask) << SDMA_PKT_POLL_REGMEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_REGMEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_REGMEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_mask = 0x00000001 +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_shift = 26 +SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_mask) << SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_func_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_func_mask = 0x00000007 +SDMA_PKT_POLL_REGMEM_HEADER_func_shift = 28 +SDMA_PKT_POLL_REGMEM_HEADER_FUNC = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_func_mask) << SDMA_PKT_POLL_REGMEM_HEADER_func_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_mask = 0x00000001 +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_shift = 31 +SDMA_PKT_POLL_REGMEM_HEADER_MEM_POLL = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_mask) << SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_REGMEM_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_REGMEM_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_VALUE_value_offset = 3 +SDMA_PKT_POLL_REGMEM_VALUE_value_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_VALUE_value_shift = 0 +SDMA_PKT_POLL_REGMEM_VALUE_VALUE = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_VALUE_value_mask) << SDMA_PKT_POLL_REGMEM_VALUE_value_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_MASK_mask_offset = 4 +SDMA_PKT_POLL_REGMEM_MASK_mask_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_MASK_mask_shift = 0 +SDMA_PKT_POLL_REGMEM_MASK_MASK = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_MASK_mask_mask) << SDMA_PKT_POLL_REGMEM_MASK_mask_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_DW5_interval_offset = 5 +SDMA_PKT_POLL_REGMEM_DW5_interval_mask = 0x0000FFFF +SDMA_PKT_POLL_REGMEM_DW5_interval_shift = 0 +SDMA_PKT_POLL_REGMEM_DW5_INTERVAL = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_DW5_interval_mask) << SDMA_PKT_POLL_REGMEM_DW5_interval_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_DW5_retry_count_offset = 5 +SDMA_PKT_POLL_REGMEM_DW5_retry_count_mask = 0x00000FFF +SDMA_PKT_POLL_REGMEM_DW5_retry_count_shift = 16 +SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_DW5_retry_count_mask) << SDMA_PKT_POLL_REGMEM_DW5_retry_count_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_offset = 1 +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_mask = 0x3FFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_shift = 2 +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_ADDR_31_2 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_offset = 2 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_offset = 3 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_mask = 0x00000003 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_shift = 16 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_EA = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_offset = 3 +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_mask = 0x0FFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_shift = 4 +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_ADDR_31_4 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_offset = 4 +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_PAGE_NUM_31_0 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_mask = 0x00000001 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_shift = 31 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_MODE = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_offset = 1 +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_PATTERN = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_mask) << SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_offset = 2 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_CMP0_START_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_offset = 3 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_CMP0_START_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_offset = 4 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_CMP1_END_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp1_end_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_offset = 5 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_CMP1_END_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp1_end_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_offset = 6 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_CMP1_START_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_offset = 7 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_CMP1_START_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_offset = 8 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_CMP1_END_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_offset = 9 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_CMP1_END_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_offset = 10 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_REC_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_offset = 11 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_REC_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_offset = 12 +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_RESERVED = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_mask) << SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_HEADER_op_offset = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_op_mask = 0x000000FF +SDMA_PKT_VM_INVALIDATION_HEADER_op_shift = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_OP = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_HEADER_op_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_op_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_offset = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_shift = 8 +SDMA_PKT_VM_INVALIDATION_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_offset = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_mask = 0x0000001F +SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_shift = 16 +SDMA_PKT_VM_INVALIDATION_HEADER_GFX_ENG_ID = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_offset = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_mask = 0x0000001F +SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_shift = 24 +SDMA_PKT_VM_INVALIDATION_HEADER_MM_ENG_ID = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_offset = 1 +SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_mask = 0xFFFFFFFF +SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_shift = 0 +SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_INVALIDATEREQ = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_mask) << SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_offset = 2 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_mask = 0xFFFFFFFF +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_shift = 0 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_ADDRESSRANGELO = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_offset = 3 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_mask = 0x0000FFFF +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_shift = 0 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_INVALIDATEACK = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_offset = 3 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_mask = 0x0000001F +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_shift = 16 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_ADDRESSRANGEHI = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_offset = 3 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_mask = 0x000001FF +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_shift = 23 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_RESERVED = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_op_offset = 0 +SDMA_PKT_ATOMIC_HEADER_op_mask = 0x000000FF +SDMA_PKT_ATOMIC_HEADER_op_shift = 0 +SDMA_PKT_ATOMIC_HEADER_OP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_op_mask) << SDMA_PKT_ATOMIC_HEADER_op_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_loop_offset = 0 +SDMA_PKT_ATOMIC_HEADER_loop_mask = 0x00000001 +SDMA_PKT_ATOMIC_HEADER_loop_shift = 16 +SDMA_PKT_ATOMIC_HEADER_LOOP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_loop_mask) << SDMA_PKT_ATOMIC_HEADER_loop_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_tmz_offset = 0 +SDMA_PKT_ATOMIC_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_ATOMIC_HEADER_tmz_shift = 18 +SDMA_PKT_ATOMIC_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_tmz_mask) << SDMA_PKT_ATOMIC_HEADER_tmz_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_atomic_op_offset = 0 +SDMA_PKT_ATOMIC_HEADER_atomic_op_mask = 0x0000007F +SDMA_PKT_ATOMIC_HEADER_atomic_op_shift = 25 +SDMA_PKT_ATOMIC_HEADER_ATOMIC_OP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_atomic_op_mask) << SDMA_PKT_ATOMIC_HEADER_atomic_op_shift) # type: ignore +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_ATOMIC_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_mask) << SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_ATOMIC_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_mask) << SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_offset = 3 +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_shift = 0 +SDMA_PKT_ATOMIC_SRC_DATA_LO_SRC_DATA_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_mask) << SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_offset = 4 +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_shift = 0 +SDMA_PKT_ATOMIC_SRC_DATA_HI_SRC_DATA_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_mask) << SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_offset = 5 +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_shift = 0 +SDMA_PKT_ATOMIC_CMP_DATA_LO_CMP_DATA_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_mask) << SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_offset = 6 +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_shift = 0 +SDMA_PKT_ATOMIC_CMP_DATA_HI_CMP_DATA_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_mask) << SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_offset = 7 +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_mask = 0x00001FFF +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_shift = 0 +SDMA_PKT_ATOMIC_LOOP_INTERVAL_LOOP_INTERVAL = lambda x: (((x) & SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_mask) << SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_SET_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_SET_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_SET_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_offset = 1 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_shift = 0 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_INIT_DATA_31_0 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_mask) << SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_INIT_DATA_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_mask) << SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_GET_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_offset = 1 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_mask = 0x1FFFFFFF +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_shift = 3 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_WRITE_ADDR_31_3 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_mask) << SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_WRITE_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_mask) << SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_offset = 1 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_mask = 0x1FFFFFFF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_shift = 3 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_WRITE_ADDR_31_3 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_WRITE_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_shift) # type: ignore +SDMA_PKT_TRAP_HEADER_op_offset = 0 +SDMA_PKT_TRAP_HEADER_op_mask = 0x000000FF +SDMA_PKT_TRAP_HEADER_op_shift = 0 +SDMA_PKT_TRAP_HEADER_OP = lambda x: (((x) & SDMA_PKT_TRAP_HEADER_op_mask) << SDMA_PKT_TRAP_HEADER_op_shift) # type: ignore +SDMA_PKT_TRAP_HEADER_sub_op_offset = 0 +SDMA_PKT_TRAP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TRAP_HEADER_sub_op_shift = 8 +SDMA_PKT_TRAP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TRAP_HEADER_sub_op_mask) << SDMA_PKT_TRAP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TRAP_INT_CONTEXT_int_context_offset = 1 +SDMA_PKT_TRAP_INT_CONTEXT_int_context_mask = 0x0FFFFFFF +SDMA_PKT_TRAP_INT_CONTEXT_int_context_shift = 0 +SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT = lambda x: (((x) & SDMA_PKT_TRAP_INT_CONTEXT_int_context_mask) << SDMA_PKT_TRAP_INT_CONTEXT_int_context_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_HEADER_op_offset = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_op_mask = 0x000000FF +SDMA_PKT_DUMMY_TRAP_HEADER_op_shift = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_OP = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_HEADER_op_mask) << SDMA_PKT_DUMMY_TRAP_HEADER_op_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_offset = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_shift = 8 +SDMA_PKT_DUMMY_TRAP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_mask) << SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_offset = 1 +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_mask = 0x0FFFFFFF +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_shift = 0 +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_INT_CONTEXT = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_mask) << SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_shift) # type: ignore +SDMA_PKT_GPUVM_INV_HEADER_op_offset = 0 +SDMA_PKT_GPUVM_INV_HEADER_op_mask = 0x000000FF +SDMA_PKT_GPUVM_INV_HEADER_op_shift = 0 +SDMA_PKT_GPUVM_INV_HEADER_OP = lambda x: (((x) & SDMA_PKT_GPUVM_INV_HEADER_op_mask) << SDMA_PKT_GPUVM_INV_HEADER_op_shift) # type: ignore +SDMA_PKT_GPUVM_INV_HEADER_sub_op_offset = 0 +SDMA_PKT_GPUVM_INV_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_GPUVM_INV_HEADER_sub_op_shift = 8 +SDMA_PKT_GPUVM_INV_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_GPUVM_INV_HEADER_sub_op_mask) << SDMA_PKT_GPUVM_INV_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_mask = 0x0000FFFF +SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_shift = 0 +SDMA_PKT_GPUVM_INV_PAYLOAD1_PER_VMID_INV_REQ = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_mask = 0x00000007 +SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_shift = 16 +SDMA_PKT_GPUVM_INV_PAYLOAD1_FLUSH_TYPE = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_shift = 19 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L2_PTES = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_shift = 20 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L2_PDE0 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_shift = 21 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L2_PDE1 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_shift = 22 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L2_PDE2 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_shift = 23 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L1_PTES = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_shift = 24 +SDMA_PKT_GPUVM_INV_PAYLOAD1_CLR_PROTECTION_FAULT_STATUS_ADDR = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_shift = 25 +SDMA_PKT_GPUVM_INV_PAYLOAD1_LOG_REQUEST = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_shift = 26 +SDMA_PKT_GPUVM_INV_PAYLOAD1_FOUR_KILOBYTES = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD2_s_offset = 2 +SDMA_PKT_GPUVM_INV_PAYLOAD2_s_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD2_s_shift = 0 +SDMA_PKT_GPUVM_INV_PAYLOAD2_S = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD2_s_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD2_s_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_offset = 2 +SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_mask = 0x7FFFFFFF +SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_shift = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD2_PAGE_VA_42_12 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_offset = 3 +SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_mask = 0x0000003F +SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_shift = 0 +SDMA_PKT_GPUVM_INV_PAYLOAD3_PAGE_VA_47_43 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_shift) # type: ignore +SDMA_PKT_GCR_REQ_HEADER_op_offset = 0 +SDMA_PKT_GCR_REQ_HEADER_op_mask = 0x000000FF +SDMA_PKT_GCR_REQ_HEADER_op_shift = 0 +SDMA_PKT_GCR_REQ_HEADER_OP = lambda x: (((x) & SDMA_PKT_GCR_REQ_HEADER_op_mask) << SDMA_PKT_GCR_REQ_HEADER_op_shift) # type: ignore +SDMA_PKT_GCR_REQ_HEADER_sub_op_offset = 0 +SDMA_PKT_GCR_REQ_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_GCR_REQ_HEADER_sub_op_shift = 8 +SDMA_PKT_GCR_REQ_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_GCR_REQ_HEADER_sub_op_mask) << SDMA_PKT_GCR_REQ_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_offset = 1 +SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_mask = 0x01FFFFFF +SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_shift = 7 +SDMA_PKT_GCR_REQ_PAYLOAD1_BASE_VA_31_7 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_mask) << SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_offset = 2 +SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_mask = 0x0000FFFF +SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_shift = 0 +SDMA_PKT_GCR_REQ_PAYLOAD2_BASE_VA_47_32 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_mask) << SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_offset = 2 +SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_mask = 0x0000FFFF +SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_shift = 16 +SDMA_PKT_GCR_REQ_PAYLOAD2_GCR_CONTROL_15_0 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_mask) << SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_offset = 3 +SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_mask = 0x00000007 +SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_shift = 0 +SDMA_PKT_GCR_REQ_PAYLOAD3_GCR_CONTROL_18_16 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_mask) << SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_offset = 3 +SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_mask = 0x01FFFFFF +SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_shift = 7 +SDMA_PKT_GCR_REQ_PAYLOAD3_LIMIT_VA_31_7 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_mask) << SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_offset = 4 +SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_mask = 0x0000FFFF +SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_shift = 0 +SDMA_PKT_GCR_REQ_PAYLOAD4_LIMIT_VA_47_32 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_mask) << SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_offset = 4 +SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_mask = 0x0000000F +SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_shift = 24 +SDMA_PKT_GCR_REQ_PAYLOAD4_VMID = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_mask) << SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_shift) # type: ignore +SDMA_PKT_NOP_HEADER_op_offset = 0 +SDMA_PKT_NOP_HEADER_op_mask = 0x000000FF +SDMA_PKT_NOP_HEADER_op_shift = 0 +SDMA_PKT_NOP_HEADER_OP = lambda x: (((x) & SDMA_PKT_NOP_HEADER_op_mask) << SDMA_PKT_NOP_HEADER_op_shift) # type: ignore +SDMA_PKT_NOP_HEADER_sub_op_offset = 0 +SDMA_PKT_NOP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_NOP_HEADER_sub_op_shift = 8 +SDMA_PKT_NOP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_NOP_HEADER_sub_op_mask) << SDMA_PKT_NOP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_NOP_HEADER_count_offset = 0 +SDMA_PKT_NOP_HEADER_count_mask = 0x00003FFF +SDMA_PKT_NOP_HEADER_count_shift = 16 +SDMA_PKT_NOP_HEADER_COUNT = lambda x: (((x) & SDMA_PKT_NOP_HEADER_count_mask) << SDMA_PKT_NOP_HEADER_count_shift) # type: ignore +SDMA_PKT_NOP_DATA0_data0_offset = 1 +SDMA_PKT_NOP_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_NOP_DATA0_data0_shift = 0 +SDMA_PKT_NOP_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_NOP_DATA0_data0_mask) << SDMA_PKT_NOP_DATA0_data0_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_format_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_HEADER_HEADER_format_shift = 0 +SDMA_AQL_PKT_HEADER_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_format_mask) << SDMA_AQL_PKT_HEADER_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_HEADER_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_HEADER_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_barrier_mask) << SDMA_AQL_PKT_HEADER_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_HEADER_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_HEADER_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_HEADER_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_HEADER_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_reserved_mask) << SDMA_AQL_PKT_HEADER_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_op_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_HEADER_HEADER_op_shift = 16 +SDMA_AQL_PKT_HEADER_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_op_mask) << SDMA_AQL_PKT_HEADER_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_subop_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_HEADER_HEADER_subop_shift = 20 +SDMA_AQL_PKT_HEADER_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_subop_mask) << SDMA_AQL_PKT_HEADER_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_shift = 16 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_shift = 20 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_offset = 1 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_RESERVED_DW1 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_offset = 2 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_RETURN_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_offset = 3 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_RETURN_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_offset = 4 +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_mask) << SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_offset = 5 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift = 16 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask) << SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_offset = 5 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_mask) << SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 6 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 7 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 8 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 9 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_offset = 10 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_RESERVED_DW10 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_offset = 11 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_RESERVED_DW11 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_offset = 12 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_RESERVED_DW12 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_offset = 13 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_RESERVED_DW13 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_offset = 14 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_COMPLETION_SIGNAL_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_offset = 15 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_format_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_BARRIER_OR_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_BARRIER_OR_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_BARRIER_OR_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_BARRIER_OR_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_shift = 16 +SDMA_AQL_PKT_BARRIER_OR_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_op_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_shift = 20 +SDMA_AQL_PKT_BARRIER_OR_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_offset = 1 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_RESERVED_DW1 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_mask) << SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_offset = 2 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_DEPENDENT_ADDR_0_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_offset = 3 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_DEPENDENT_ADDR_0_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_offset = 4 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_DEPENDENT_ADDR_1_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_offset = 5 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_DEPENDENT_ADDR_1_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_offset = 6 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_DEPENDENT_ADDR_2_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_offset = 7 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_DEPENDENT_ADDR_2_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_offset = 8 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_DEPENDENT_ADDR_3_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_offset = 9 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_DEPENDENT_ADDR_3_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_offset = 10 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_DEPENDENT_ADDR_4_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_offset = 11 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_DEPENDENT_ADDR_4_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_offset = 12 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_RESERVED_DW12 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_mask) << SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW12_reserved_dw12_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_offset = 13 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_RESERVED_DW13 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_mask) << SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_offset = 14 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_COMPLETION_SIGNAL_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_offset = 15 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift) # type: ignore \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_6_0_0.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_6_0_0.py new file mode 100644 index 000000000..88e85ebd0 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/sdma_6_0_0.py @@ -0,0 +1,3882 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG(c.Struct): + SIZE = 28 + HEADER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION + COUNT_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION + PARAMETER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION + SRC_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION + SRC_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + extra_info: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('extra_info', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION(c.Struct): + SIZE = 4 + count: int + reserved_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION.register_fields([('count', ctypes.c_uint32, 0, 22, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 6), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION(c.Struct): + SIZE = 4 + reserved_0: int + dst_swap: int + reserved_1: int + src_swap: int + reserved_2: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION.register_fields([('reserved_0', ctypes.c_uint32, 0, 16, 0), ('dst_swap', ctypes.c_uint32, 2, 2, 0), ('reserved_1', ctypes.c_uint32, 2, 6, 2), ('src_swap', ctypes.c_uint32, 3, 2, 0), ('reserved_2', ctypes.c_uint32, 3, 6, 2), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION(c.Struct): + SIZE = 4 + src_addr_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION.register_fields([('src_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION(c.Struct): + SIZE = 4 + src_addr_63_32: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION.register_fields([('src_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION, 0), ('COUNT_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION, 4), ('PARAMETER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION, 8), ('SRC_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION, 12), ('SRC_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION, 16), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION, 20), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION, 24)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR: TypeAlias = rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG(c.Struct): + SIZE = 52 + HEADER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION + SRC_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION + SRC_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION + SRC_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION + SRC_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION + SRC_PARAMETER_3_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION + DST_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION + DST_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION + DST_PARAMETER_3_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION + RECT_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION + RECT_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved: int + element: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved', ctypes.c_uint32, 2, 13, 0), ('element', ctypes.c_uint32, 3, 3, 5), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION(c.Struct): + SIZE = 4 + src_addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION.register_fields([('src_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION(c.Struct): + SIZE = 4 + src_addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION.register_fields([('src_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + src_offset_x: int + reserved_1: int + src_offset_y: int + reserved_2: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION.register_fields([('src_offset_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('src_offset_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + src_offset_z: int + reserved_1: int + src_pitch: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION.register_fields([('src_offset_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 3), ('src_pitch', ctypes.c_uint32, 1, 19, 5), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION(c.Struct): + SIZE = 4 + src_slice_pitch: int + reserved_1: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION.register_fields([('src_slice_pitch', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_7_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_7_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + dst_offset_x: int + reserved_1: int + dst_offset_y: int + reserved_2: int + DW_8_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION.register_fields([('dst_offset_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('dst_offset_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_8_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + dst_offset_z: int + reserved_1: int + dst_pitch: int + DW_9_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION.register_fields([('dst_offset_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 3), ('dst_pitch', ctypes.c_uint32, 1, 19, 5), ('DW_9_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION(c.Struct): + SIZE = 4 + dst_slice_pitch: int + reserved_1: int + DW_10_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION.register_fields([('dst_slice_pitch', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_10_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + rect_x: int + reserved_1: int + rect_y: int + reserved_2: int + DW_11_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION.register_fields([('rect_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('rect_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_11_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + rect_z: int + reserved_1: int + dst_swap: int + reserved_2: int + src_swap: int + reserved_3: int + DW_12_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION.register_fields([('rect_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 5, 3), ('dst_swap', ctypes.c_uint32, 2, 2, 0), ('reserved_2', ctypes.c_uint32, 2, 6, 2), ('src_swap', ctypes.c_uint32, 3, 2, 0), ('reserved_3', ctypes.c_uint32, 3, 6, 2), ('DW_12_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION, 0), ('SRC_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION, 4), ('SRC_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION, 8), ('SRC_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION, 12), ('SRC_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION, 16), ('SRC_PARAMETER_3_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION, 20), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION, 24), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION, 28), ('DST_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION, 32), ('DST_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION, 36), ('DST_PARAMETER_3_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION, 40), ('RECT_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION, 44), ('RECT_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION, 48)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT: TypeAlias = rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG(c.Struct): + SIZE = 20 + HEADER_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION + DATA_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION + COUNT_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + sw: int + reserved_0: int + fillsize: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('sw', ctypes.c_uint32, 2, 2, 0), ('reserved_0', ctypes.c_uint32, 2, 12, 2), ('fillsize', ctypes.c_uint32, 3, 2, 6), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION(c.Struct): + SIZE = 4 + src_data_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION.register_fields([('src_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION(c.Struct): + SIZE = 4 + count: int + reserved_0: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION.register_fields([('count', ctypes.c_uint32, 0, 22, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 6), ('DW_4_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION, 0), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION, 4), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION, 8), ('DATA_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION, 12), ('COUNT_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION, 16)]) +rocr_AMD_SDMA_PKT_CONSTANT_FILL: TypeAlias = rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG(c.Struct): + SIZE = 16 + HEADER_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION + DATA_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + mtype: int + gcc: int + sys: int + pad1: int + snp: int + gpa: int + l2_policy: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('mtype', ctypes.c_uint32, 2, 3, 0), ('gcc', ctypes.c_uint32, 2, 1, 3), ('sys', ctypes.c_uint32, 2, 1, 4), ('pad1', ctypes.c_uint32, 2, 1, 5), ('snp', ctypes.c_uint32, 2, 1, 6), ('gpa', ctypes.c_uint32, 2, 1, 7), ('l2_policy', ctypes.c_uint32, 3, 2, 0), ('reserved_0', ctypes.c_uint32, 3, 6, 2), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION(c.Struct): + SIZE = 4 + data: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION.register_fields([('data', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_FENCE_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION, 8), ('DATA_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION, 12)]) +rocr_AMD_SDMA_PKT_FENCE: TypeAlias = rocr_AMD_SDMA_PKT_FENCE_TAG +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG(c.Struct): + SIZE = 24 + HEADER_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION + VALUE_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION + MASK_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION + DW5_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + hdp_flush: int + reserved_1: int + func: int + mem_poll: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 0), ('hdp_flush', ctypes.c_uint32, 3, 1, 2), ('reserved_1', ctypes.c_uint32, 3, 1, 3), ('func', ctypes.c_uint32, 3, 3, 4), ('mem_poll', ctypes.c_uint32, 3, 1, 7), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION(c.Struct): + SIZE = 4 + value: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION.register_fields([('value', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION(c.Struct): + SIZE = 4 + mask: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION.register_fields([('mask', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION(c.Struct): + SIZE = 4 + interval: int + retry_count: int + reserved_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION.register_fields([('interval', ctypes.c_uint32, 0, 16, 0), ('retry_count', ctypes.c_uint32, 2, 12, 0), ('reserved_0', ctypes.c_uint32, 3, 4, 4), ('DW_5_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION, 8), ('VALUE_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION, 12), ('MASK_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION, 16), ('DW5_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION, 20)]) +rocr_AMD_SDMA_PKT_POLL_REGMEM: TypeAlias = rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG(c.Struct): + SIZE = 32 + HEADER_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION + SRC_DATA_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION + SRC_DATA_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION + CMP_DATA_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION + CMP_DATA_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION + LOOP_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + l: int + reserved_0: int + operation: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('l', ctypes.c_uint32, 2, 1, 0), ('reserved_0', ctypes.c_uint32, 2, 8, 1), ('operation', ctypes.c_uint32, 3, 7, 1), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION(c.Struct): + SIZE = 4 + src_data_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION.register_fields([('src_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION(c.Struct): + SIZE = 4 + src_data_63_32: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION.register_fields([('src_data_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION(c.Struct): + SIZE = 4 + cmp_data_31_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION.register_fields([('cmp_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION(c.Struct): + SIZE = 4 + cmp_data_63_32: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION.register_fields([('cmp_data_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION(c.Struct): + SIZE = 4 + loop_interval: int + reserved_0: int + DW_7_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION.register_fields([('loop_interval', ctypes.c_uint32, 0, 13, 0), ('reserved_0', ctypes.c_uint32, 1, 19, 5), ('DW_7_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_ATOMIC_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION, 8), ('SRC_DATA_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION, 12), ('SRC_DATA_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION, 16), ('CMP_DATA_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION, 20), ('CMP_DATA_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION, 24), ('LOOP_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION, 28)]) +rocr_AMD_SDMA_PKT_ATOMIC: TypeAlias = rocr_AMD_SDMA_PKT_ATOMIC_TAG +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG(c.Struct): + SIZE = 12 + HEADER_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION, 8)]) +rocr_AMD_SDMA_PKT_TIMESTAMP: TypeAlias = rocr_AMD_SDMA_PKT_TIMESTAMP_TAG +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG(c.Struct): + SIZE = 8 + HEADER_UNION: rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION + INT_CONTEXT_UNION: rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION(c.Struct): + SIZE = 4 + int_ctx: int + reserved_1: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION.register_fields([('int_ctx', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_1_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_TRAP_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION, 0), ('INT_CONTEXT_UNION', rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION, 4)]) +rocr_AMD_SDMA_PKT_TRAP: TypeAlias = rocr_AMD_SDMA_PKT_TRAP_TAG +@c.record +class rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG(c.Struct): + SIZE = 24 + DW_0_DATA: int + DW_1_DATA: int + DW_2_DATA: int + DW_3_DATA: int + DW_4_DATA: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG.register_fields([('DW_0_DATA', ctypes.c_uint32, 0), ('DW_1_DATA', ctypes.c_uint32, 4), ('DW_2_DATA', ctypes.c_uint32, 8), ('DW_3_DATA', ctypes.c_uint32, 12), ('DW_4_DATA', ctypes.c_uint32, 16), ('DW_5_DATA', ctypes.c_uint32, 20)]) +rocr_AMD_SDMA_PKT_HDP_FLUSH: TypeAlias = rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG(c.Struct): + SIZE = 20 + HEADER_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION + WORD1_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION + WORD2_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION + WORD3_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION + WORD4_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION(c.Struct): + SIZE = 4 + BaseVA_LO: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION.register_fields([('BaseVA_LO', ctypes.c_uint32, 0, 25, 7), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION(c.Struct): + SIZE = 4 + BaseVA_HI: int + GCR_CONTROL_GLI_INV: int + GCR_CONTROL_GL1_RANGE: int + GCR_CONTROL_GLM_WB: int + GCR_CONTROL_GLM_INV: int + GCR_CONTROL_GLK_WB: int + GCR_CONTROL_GLK_INV: int + GCR_CONTROL_GLV_INV: int + GCR_CONTROL_GL1_INV: int + GCR_CONTROL_GL2_US: int + GCR_CONTROL_GL2_RANGE: int + GCR_CONTROL_GL2_DISCARD: int + GCR_CONTROL_GL2_INV: int + GCR_CONTROL_GL2_WB: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION.register_fields([('BaseVA_HI', ctypes.c_uint32, 0, 16, 0), ('GCR_CONTROL_GLI_INV', ctypes.c_uint32, 2, 2, 0), ('GCR_CONTROL_GL1_RANGE', ctypes.c_uint32, 2, 2, 2), ('GCR_CONTROL_GLM_WB', ctypes.c_uint32, 2, 1, 4), ('GCR_CONTROL_GLM_INV', ctypes.c_uint32, 2, 1, 5), ('GCR_CONTROL_GLK_WB', ctypes.c_uint32, 2, 1, 6), ('GCR_CONTROL_GLK_INV', ctypes.c_uint32, 2, 1, 7), ('GCR_CONTROL_GLV_INV', ctypes.c_uint32, 3, 1, 0), ('GCR_CONTROL_GL1_INV', ctypes.c_uint32, 3, 1, 1), ('GCR_CONTROL_GL2_US', ctypes.c_uint32, 3, 1, 2), ('GCR_CONTROL_GL2_RANGE', ctypes.c_uint32, 3, 2, 3), ('GCR_CONTROL_GL2_DISCARD', ctypes.c_uint32, 3, 1, 5), ('GCR_CONTROL_GL2_INV', ctypes.c_uint32, 3, 1, 6), ('GCR_CONTROL_GL2_WB', ctypes.c_uint32, 3, 1, 7), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION(c.Struct): + SIZE = 4 + GCR_CONTROL_RANGE_IS_PA: int + GCR_CONTROL_SEQ: int + LimitVA_LO: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION.register_fields([('GCR_CONTROL_RANGE_IS_PA', ctypes.c_uint32, 0, 1, 0), ('GCR_CONTROL_SEQ', ctypes.c_uint32, 0, 2, 1), ('LimitVA_LO', ctypes.c_uint32, 0, 25, 7), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION(c.Struct): + SIZE = 4 + LimitVA_HI: int + VMID: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION.register_fields([('LimitVA_HI', ctypes.c_uint32, 0, 16, 0), ('VMID', ctypes.c_uint32, 3, 4, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_GCR_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION, 0), ('WORD1_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION, 4), ('WORD2_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION, 8), ('WORD3_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION, 12), ('WORD4_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION, 16)]) +rocr_AMD_SDMA_PKT_GCR: TypeAlias = rocr_AMD_SDMA_PKT_GCR_TAG +SDMA_OP_COPY = 1 +SDMA_OP_FENCE = 5 +SDMA_OP_TRAP = 6 +SDMA_OP_POLL_REGMEM = 8 +SDMA_OP_ATOMIC = 10 +SDMA_OP_CONST_FILL = 11 +SDMA_OP_TIMESTAMP = 13 +SDMA_OP_GCR = 17 +SDMA_SUBOP_COPY_LINEAR = 0 +SDMA_SUBOP_COPY_LINEAR_RECT = 4 +SDMA_SUBOP_TIMESTAMP_GET_GLOBAL = 2 +SDMA_SUBOP_USER_GCR = 1 +SDMA_ATOMIC_ADD64 = 47 +SDMA_OP_NOP = 0 +SDMA_OP_COPY = 1 +SDMA_OP_WRITE = 2 +SDMA_OP_INDIRECT = 4 +SDMA_OP_FENCE = 5 +SDMA_OP_TRAP = 6 +SDMA_OP_SEM = 7 +SDMA_OP_POLL_REGMEM = 8 +SDMA_OP_COND_EXE = 9 +SDMA_OP_ATOMIC = 10 +SDMA_OP_CONST_FILL = 11 +SDMA_OP_PTEPDE = 12 +SDMA_OP_TIMESTAMP = 13 +SDMA_OP_SRBM_WRITE = 14 +SDMA_OP_PRE_EXE = 15 +SDMA_OP_GPUVM_INV = 16 +SDMA_OP_GCR_REQ = 17 +SDMA_OP_DUMMY_TRAP = 32 +SDMA_SUBOP_TIMESTAMP_SET = 0 +SDMA_SUBOP_TIMESTAMP_GET = 1 +SDMA_SUBOP_TIMESTAMP_GET_GLOBAL = 2 +SDMA_SUBOP_COPY_LINEAR = 0 +SDMA_SUBOP_COPY_LINEAR_SUB_WIND = 4 +SDMA_SUBOP_COPY_TILED = 1 +SDMA_SUBOP_COPY_TILED_SUB_WIND = 5 +SDMA_SUBOP_COPY_T2T_SUB_WIND = 6 +SDMA_SUBOP_COPY_SOA = 3 +SDMA_SUBOP_COPY_DIRTY_PAGE = 7 +SDMA_SUBOP_COPY_LINEAR_PHY = 8 +SDMA_SUBOP_COPY_LINEAR_SUB_WIND_LARGE = 36 +SDMA_SUBOP_COPY_LINEAR_BC = 16 +SDMA_SUBOP_COPY_TILED_BC = 17 +SDMA_SUBOP_COPY_LINEAR_SUB_WIND_BC = 20 +SDMA_SUBOP_COPY_TILED_SUB_WIND_BC = 21 +SDMA_SUBOP_COPY_T2T_SUB_WIND_BC = 22 +SDMA_SUBOP_WRITE_LINEAR = 0 +SDMA_SUBOP_WRITE_TILED = 1 +SDMA_SUBOP_WRITE_TILED_BC = 17 +SDMA_SUBOP_PTEPDE_GEN = 0 +SDMA_SUBOP_PTEPDE_COPY = 1 +SDMA_SUBOP_PTEPDE_RMW = 2 +SDMA_SUBOP_PTEPDE_COPY_BACKWARDS = 3 +SDMA_SUBOP_MEM_INCR = 1 +SDMA_SUBOP_DATA_FILL_MULTI = 1 +SDMA_SUBOP_POLL_REG_WRITE_MEM = 1 +SDMA_SUBOP_POLL_DBIT_WRITE_MEM = 2 +SDMA_SUBOP_POLL_MEM_VERIFY = 3 +SDMA_SUBOP_VM_INVALIDATION = 4 +HEADER_AGENT_DISPATCH = 4 +HEADER_BARRIER = 5 +SDMA_OP_AQL_COPY = 0 +SDMA_OP_AQL_BARRIER_OR = 0 +SDMA_GCR_RANGE_IS_PA = (1 << 18) +SDMA_GCR_SEQ = lambda x: (((x) & 0x3) << 16) # type: ignore +SDMA_GCR_GL2_WB = (1 << 15) +SDMA_GCR_GL2_INV = (1 << 14) +SDMA_GCR_GL2_DISCARD = (1 << 13) +SDMA_GCR_GL2_RANGE = lambda x: (((x) & 0x3) << 11) # type: ignore +SDMA_GCR_GL2_US = (1 << 10) +SDMA_GCR_GL1_INV = (1 << 9) +SDMA_GCR_GLV_INV = (1 << 8) +SDMA_GCR_GLK_INV = (1 << 7) +SDMA_GCR_GLK_WB = (1 << 6) +SDMA_GCR_GLM_INV = (1 << 5) +SDMA_GCR_GLM_WB = (1 << 4) +SDMA_GCR_GL1_RANGE = lambda x: (((x) & 0x3) << 2) # type: ignore +SDMA_GCR_GLI_INV = lambda x: (((x) & 0x3) << 0) # type: ignore +SDMA_DCC_DATA_FORMAT = lambda x: ((x) & 0x3f) # type: ignore +SDMA_DCC_NUM_TYPE = lambda x: (((x) & 0x7) << 9) # type: ignore +SDMA_DCC_READ_CM = lambda x: (((x) & 0x3) << 16) # type: ignore +SDMA_DCC_WRITE_CM = lambda x: (((x) & 0x3) << 18) # type: ignore +SDMA_DCC_MAX_COM = lambda x: (((x) & 0x3) << 24) # type: ignore +SDMA_DCC_MAX_UCOM = lambda x: (((x) & 0x1) << 26) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_LINEAR_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_encrypt_mask) << SDMA_PKT_COPY_LINEAR_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_cpv_shift = 19 +SDMA_PKT_COPY_LINEAR_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_cpv_mask) << SDMA_PKT_COPY_LINEAR_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_backwards_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_backwards_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_backwards_shift = 25 +SDMA_PKT_COPY_LINEAR_HEADER_BACKWARDS = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_backwards_mask) << SDMA_PKT_COPY_LINEAR_HEADER_backwards_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_LINEAR_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_HEADER_broadcast_mask) << SDMA_PKT_COPY_LINEAR_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_LINEAR_COUNT_count_mask = 0x3FFFFFFF +SDMA_PKT_COPY_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_offset = 2 +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_shift = 18 +SDMA_PKT_COPY_LINEAR_PARAMETER_DST_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_mask) << SDMA_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_offset = 2 +SDMA_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_shift = 26 +SDMA_PKT_COPY_LINEAR_PARAMETER_SRC_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_mask) << SDMA_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_COUNT_count_offset = 1 +SDMA_PKT_COPY_LINEAR_BC_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_LINEAR_BC_COUNT_count_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_COUNT_count_mask) << SDMA_PKT_COPY_LINEAR_BC_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_offset = 2 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_shift = 19 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_DST_HA = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_mask) << SDMA_PKT_COPY_LINEAR_BC_PARAMETER_dst_ha_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_offset = 2 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_shift = 27 +SDMA_PKT_COPY_LINEAR_BC_PARAMETER_SRC_HA = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_mask) << SDMA_PKT_COPY_LINEAR_BC_PARAMETER_src_ha_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_BC_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_BC_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_cpv_shift = 19 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_cpv_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_offset = 0 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_shift = 31 +SDMA_PKT_COPY_DIRTY_PAGE_HEADER_ALL = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_mask) << SDMA_PKT_COPY_DIRTY_PAGE_HEADER_all_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_offset = 1 +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_mask) << SDMA_PKT_COPY_DIRTY_PAGE_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_mask = 0x00000007 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_shift = 3 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_MTYPE = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_mtype_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_shift = 6 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_L2_POLICY = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_l2_policy_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_llc_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_llc_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_llc_shift = 8 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_LLC = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_llc_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_llc_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_mask = 0x00000007 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_shift = 11 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_MTYPE = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_mtype_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_shift = 14 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_L2_POLICY = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_l2_policy_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_llc_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_llc_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_llc_shift = 16 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_LLC = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_llc_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_llc_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_shift = 17 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_shift = 19 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_GCC = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gcc_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_shift = 20 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SYS = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_sys_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_shift = 22 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_snoop_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_shift = 23 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_DST_GPA = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_dst_gpa_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_shift = 28 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SYS = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_sys_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_shift = 30 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_snoop_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_offset = 2 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_mask = 0x00000001 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_shift = 31 +SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_SRC_GPA = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_mask) << SDMA_PKT_COPY_DIRTY_PAGE_PARAMETER_src_gpa_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_DIRTY_PAGE_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_DIRTY_PAGE_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_cpv_shift = 19 +SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_cpv_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_addr_pair_num_offset = 1 +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_addr_pair_num_mask = 0x000000FF +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_addr_pair_num_shift = 24 +SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_ADDR_PAIR_NUM = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_addr_pair_num_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_COUNT_addr_pair_num_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_mask = 0x00000007 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_shift = 3 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_MTYPE = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_mtype_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_shift = 6 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_L2_POLICY = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_l2_policy_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_llc_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_llc_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_llc_shift = 8 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_LLC = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_llc_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_llc_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_mask = 0x00000007 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_shift = 11 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_MTYPE = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_mtype_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_shift = 14 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_L2_POLICY = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_l2_policy_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_llc_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_llc_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_llc_shift = 16 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_LLC = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_llc_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_llc_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_shift = 17 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_shift = 19 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_GCC = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gcc_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_shift = 20 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SYS = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_sys_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_shift = 21 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_LOG = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_log_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_shift = 22 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_snoop_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_shift = 23 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_DST_GPA = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_dst_gpa_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_shift = 27 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_GCC = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gcc_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_shift = 28 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SYS = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_sys_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_shift = 30 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_SNOOP = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_snoop_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_offset = 2 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_mask = 0x00000001 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_shift = 31 +SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_SRC_GPA = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_PARAMETER_src_gpa_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 5 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 6 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_PHYSICAL_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_cpv_shift = 19 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_cpv_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_offset = 1 +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_mask = 0x3FFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_shift = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_DST2_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_cache_policy_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_cache_policy_shift = 10 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_DST2_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_cache_policy_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst2_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_shift = 16 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_DST1_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_cache_policy_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_cache_policy_shift = 18 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_DST1_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_cache_policy_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_dst1_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_cache_policy_offset = 2 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_cache_policy_shift = 26 +SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_SRC_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_cache_policy_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_PARAMETER_src_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 3 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 4 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_offset = 5 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_DST1_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_LO_dst1_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_offset = 6 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_DST1_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST1_ADDR_HI_dst1_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_offset = 7 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_DST2_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_LO_dst2_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_offset = 8 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_shift = 0 +SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_DST2_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_mask) << SDMA_PKT_COPY_BROADCAST_LINEAR_DST2_ADDR_HI_dst2_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_cpv_shift = 19 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_cpv_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_shift = 29 +SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_ELEMENTSIZE = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_HEADER_elementsize_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_mask = 0x00001FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_SRC_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_4_src_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_offset = 5 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_SRC_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_5_src_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_offset = 6 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_offset = 7 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_DST_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_8_dst_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_mask = 0x00001FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_DST_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_9_dst_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_offset = 10 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_DST_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_10_dst_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_11_rect_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_mask = 0x00001FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_rect_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_cache_policy_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_cache_policy_shift = 18 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_DST_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_cache_policy_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_dst_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_cache_policy_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_cache_policy_shift = 26 +SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_SRC_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_cache_policy_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_DW_12_src_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_tmz_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_cpv_shift = 19 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_cpv_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_3_src_x_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_3_src_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_4_src_y_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_4_src_y_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_4_src_y_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_4_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_4_src_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_4_src_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_5_src_z_offset = 5 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_5_src_z_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_5_src_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_5_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_5_src_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_5_src_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_6_src_pitch_offset = 6 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_6_src_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_6_src_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_6_SRC_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_6_src_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_6_src_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_7_src_slice_pitch_31_0_offset = 7 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_7_src_slice_pitch_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_7_src_slice_pitch_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_7_SRC_SLICE_PITCH_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_7_src_slice_pitch_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_7_src_slice_pitch_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_8_src_slice_pitch_47_32_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_8_src_slice_pitch_47_32_mask = 0x0000FFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_8_src_slice_pitch_47_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_8_SRC_SLICE_PITCH_47_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_8_src_slice_pitch_47_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_8_src_slice_pitch_47_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_LO_dst_addr_31_0_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_HI_dst_addr_63_32_offset = 10 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_11_dst_x_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_11_dst_x_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_11_dst_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_11_DST_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_11_dst_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_11_dst_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_12_dst_y_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_12_dst_y_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_12_dst_y_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_12_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_12_dst_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_12_dst_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_13_dst_z_offset = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_13_dst_z_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_13_dst_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_13_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_13_dst_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_13_dst_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_14_dst_pitch_offset = 14 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_14_dst_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_14_dst_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_14_DST_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_14_dst_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_14_dst_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_15_dst_slice_pitch_31_0_offset = 15 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_15_dst_slice_pitch_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_15_dst_slice_pitch_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_15_DST_SLICE_PITCH_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_15_dst_slice_pitch_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_15_dst_slice_pitch_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_slice_pitch_47_32_offset = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_slice_pitch_47_32_mask = 0x0000FFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_slice_pitch_47_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_DST_SLICE_PITCH_47_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_slice_pitch_47_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_slice_pitch_47_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_sw_offset = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_policy_offset = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_policy_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_policy_shift = 18 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_DST_POLICY = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_policy_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_dst_policy_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_sw_offset = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_policy_offset = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_policy_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_policy_shift = 26 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_SRC_POLICY = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_policy_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_16_src_policy_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_17_rect_x_offset = 17 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_17_rect_x_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_17_rect_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_17_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_17_rect_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_17_rect_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_18_rect_y_offset = 18 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_18_rect_y_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_18_rect_y_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_18_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_18_rect_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_18_rect_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_19_rect_z_offset = 19 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_19_rect_z_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_19_rect_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_19_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_19_rect_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_LARGE_DW_19_rect_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_offset = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_mask = 0x00000007 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_shift = 29 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_ELEMENTSIZE = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_HEADER_elementsize_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_offset = 4 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_SRC_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_4_src_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_offset = 5 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_SRC_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_5_src_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_offset = 6 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_offset = 7 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_DST_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_offset = 8 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_8_dst_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_offset = 9 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_shift = 13 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_DST_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_9_dst_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_offset = 10 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_DST_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_10_dst_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_x_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_offset = 11 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_11_rect_y_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_shift = 0 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_rect_z_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_shift = 16 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_shift = 19 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_DST_HA = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_dst_ha_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_shift = 24 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_sw_shift) # type: ignore +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_offset = 12 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_mask = 0x00000001 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_shift = 27 +SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_SRC_HA = lambda x: (((x) & SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_mask) << SDMA_PKT_COPY_LINEAR_SUBWIN_BC_DW_12_src_ha_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_op_mask) << SDMA_PKT_COPY_TILED_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_TILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_encrypt_mask) << SDMA_PKT_COPY_TILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_TILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_tmz_mask) << SDMA_PKT_COPY_TILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_cpv_shift = 19 +SDMA_PKT_COPY_TILED_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_cpv_mask) << SDMA_PKT_COPY_TILED_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_TILED_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_3_width_offset = 3 +SDMA_PKT_COPY_TILED_DW_3_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_3_width_shift = 0 +SDMA_PKT_COPY_TILED_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_3_width_mask) << SDMA_PKT_COPY_TILED_DW_3_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_4_height_offset = 4 +SDMA_PKT_COPY_TILED_DW_4_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_4_height_shift = 0 +SDMA_PKT_COPY_TILED_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_4_height_mask) << SDMA_PKT_COPY_TILED_DW_4_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_4_depth_offset = 4 +SDMA_PKT_COPY_TILED_DW_4_depth_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_DW_4_depth_shift = 16 +SDMA_PKT_COPY_TILED_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_4_depth_mask) << SDMA_PKT_COPY_TILED_DW_4_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_element_size_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_DW_5_element_size_shift = 0 +SDMA_PKT_COPY_TILED_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_element_size_mask) << SDMA_PKT_COPY_TILED_DW_5_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_shift = 3 +SDMA_PKT_COPY_TILED_DW_5_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_mask) << SDMA_PKT_COPY_TILED_DW_5_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_dimension_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_dimension_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_5_dimension_shift = 9 +SDMA_PKT_COPY_TILED_DW_5_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_dimension_mask) << SDMA_PKT_COPY_TILED_DW_5_dimension_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_5_mip_max_offset = 5 +SDMA_PKT_COPY_TILED_DW_5_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_TILED_DW_5_mip_max_shift = 16 +SDMA_PKT_COPY_TILED_DW_5_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_5_mip_max_mask) << SDMA_PKT_COPY_TILED_DW_5_mip_max_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_6_x_offset = 6 +SDMA_PKT_COPY_TILED_DW_6_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_6_x_shift = 0 +SDMA_PKT_COPY_TILED_DW_6_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_6_x_mask) << SDMA_PKT_COPY_TILED_DW_6_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_6_y_offset = 6 +SDMA_PKT_COPY_TILED_DW_6_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_DW_6_y_shift = 16 +SDMA_PKT_COPY_TILED_DW_6_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_6_y_mask) << SDMA_PKT_COPY_TILED_DW_6_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_z_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_z_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_DW_7_z_shift = 0 +SDMA_PKT_COPY_TILED_DW_7_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_z_mask) << SDMA_PKT_COPY_TILED_DW_7_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_linear_sw_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_7_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_DW_7_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_linear_sw_mask) << SDMA_PKT_COPY_TILED_DW_7_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_linear_cache_policy_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_linear_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_TILED_DW_7_linear_cache_policy_shift = 18 +SDMA_PKT_COPY_TILED_DW_7_LINEAR_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_linear_cache_policy_mask) << SDMA_PKT_COPY_TILED_DW_7_linear_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_tile_sw_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_DW_7_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_DW_7_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_tile_sw_mask) << SDMA_PKT_COPY_TILED_DW_7_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_DW_7_tile_cache_policy_offset = 7 +SDMA_PKT_COPY_TILED_DW_7_tile_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_TILED_DW_7_tile_cache_policy_shift = 26 +SDMA_PKT_COPY_TILED_DW_7_TILE_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_TILED_DW_7_tile_cache_policy_mask) << SDMA_PKT_COPY_TILED_DW_7_tile_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_offset = 8 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_offset = 9 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_PITCH_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_mask) << SDMA_PKT_COPY_TILED_LINEAR_PITCH_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_LINEAR_SLICE_PITCH_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_COUNT_count_offset = 12 +SDMA_PKT_COPY_TILED_COUNT_count_mask = 0x3FFFFFFF +SDMA_PKT_COPY_TILED_COUNT_count_shift = 0 +SDMA_PKT_COPY_TILED_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_TILED_COUNT_count_mask) << SDMA_PKT_COPY_TILED_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_HEADER_op_mask) << SDMA_PKT_COPY_TILED_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_BC_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_BC_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_BC_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_BC_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_BC_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_BC_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_3_width_offset = 3 +SDMA_PKT_COPY_TILED_BC_DW_3_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_BC_DW_3_width_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_3_width_mask) << SDMA_PKT_COPY_TILED_BC_DW_3_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_4_height_offset = 4 +SDMA_PKT_COPY_TILED_BC_DW_4_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_BC_DW_4_height_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_4_height_mask) << SDMA_PKT_COPY_TILED_BC_DW_4_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_4_depth_offset = 4 +SDMA_PKT_COPY_TILED_BC_DW_4_depth_mask = 0x000007FF +SDMA_PKT_COPY_TILED_BC_DW_4_depth_shift = 16 +SDMA_PKT_COPY_TILED_BC_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_4_depth_mask) << SDMA_PKT_COPY_TILED_BC_DW_4_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_element_size_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_BC_DW_5_element_size_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_element_size_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_mask = 0x0000000F +SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_shift = 3 +SDMA_PKT_COPY_TILED_BC_DW_5_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_array_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_mask = 0x00000007 +SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_shift = 8 +SDMA_PKT_COPY_TILED_BC_DW_5_MIT_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_mit_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_shift = 11 +SDMA_PKT_COPY_TILED_BC_DW_5_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_tilesplit_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_shift = 15 +SDMA_PKT_COPY_TILED_BC_DW_5_BANK_W = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_bank_w_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_shift = 18 +SDMA_PKT_COPY_TILED_BC_DW_5_BANK_H = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_bank_h_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_shift = 21 +SDMA_PKT_COPY_TILED_BC_DW_5_NUM_BANK = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_num_bank_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_shift = 24 +SDMA_PKT_COPY_TILED_BC_DW_5_MAT_ASPT = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_mat_aspt_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_offset = 5 +SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_mask = 0x0000001F +SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_shift = 26 +SDMA_PKT_COPY_TILED_BC_DW_5_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_mask) << SDMA_PKT_COPY_TILED_BC_DW_5_pipe_config_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_6_x_offset = 6 +SDMA_PKT_COPY_TILED_BC_DW_6_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_BC_DW_6_x_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_6_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_6_x_mask) << SDMA_PKT_COPY_TILED_BC_DW_6_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_6_y_offset = 6 +SDMA_PKT_COPY_TILED_BC_DW_6_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_BC_DW_6_y_shift = 16 +SDMA_PKT_COPY_TILED_BC_DW_6_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_6_y_mask) << SDMA_PKT_COPY_TILED_BC_DW_6_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_7_z_offset = 7 +SDMA_PKT_COPY_TILED_BC_DW_7_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_BC_DW_7_z_shift = 0 +SDMA_PKT_COPY_TILED_BC_DW_7_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_7_z_mask) << SDMA_PKT_COPY_TILED_BC_DW_7_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_offset = 7 +SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_BC_DW_7_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_mask) << SDMA_PKT_COPY_TILED_BC_DW_7_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_offset = 7 +SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_BC_DW_7_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_mask) << SDMA_PKT_COPY_TILED_BC_DW_7_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_offset = 8 +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_offset = 9 +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_BC_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_shift = 0 +SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_mask) << SDMA_PKT_COPY_TILED_BC_LINEAR_PITCH_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_LINEAR_SLICE_PITCH_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_BC_LINEAR_SLICE_PITCH_linear_slice_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_BC_LINEAR_SLICE_PITCH_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_BC_LINEAR_SLICE_PITCH_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_LINEAR_SLICE_PITCH_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_BC_LINEAR_SLICE_PITCH_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_BC_COUNT_count_offset = 12 +SDMA_PKT_COPY_TILED_BC_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_COPY_TILED_BC_COUNT_count_shift = 2 +SDMA_PKT_COPY_TILED_BC_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_TILED_BC_COUNT_count_mask) << SDMA_PKT_COPY_TILED_BC_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_cpv_shift = 19 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_cpv_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_shift = 26 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_VIDEOCOPY = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_videocopy_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_offset = 0 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_mask = 0x00000001 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_shift = 27 +SDMA_PKT_COPY_L2T_BROADCAST_HEADER_BROADCAST = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_mask) << SDMA_PKT_COPY_L2T_BROADCAST_HEADER_broadcast_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_offset = 1 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_TILED_ADDR0_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_0_tiled_addr0_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_offset = 2 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_TILED_ADDR0_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_0_tiled_addr0_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_offset = 3 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_TILED_ADDR1_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_LO_1_tiled_addr1_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_offset = 4 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_TILED_ADDR1_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_TILED_ADDR_HI_1_tiled_addr1_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_offset = 5 +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_5_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_5_width_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_offset = 6 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_6_height_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_offset = 6 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_mask = 0x00001FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_6_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_6_depth_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_mask = 0x00000007 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_element_size_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_shift = 3 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_shift = 9 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_dimension_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_offset = 7 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_7_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_7_mip_max_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_offset = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_X = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_8_x_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_offset = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_mask = 0x00003FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_8_Y = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_8_y_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_offset = 9 +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_mask = 0x00001FFF +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_DW_9_Z = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_9_z_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_shift = 8 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_DST2_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_cache_policy_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_cache_policy_shift = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_DST2_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_cache_policy_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_dst2_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_shift = 16 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_cache_policy_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_cache_policy_shift = 18 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_LINEAR_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_cache_policy_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_linear_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_shift = 24 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_cache_policy_offset = 10 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_cache_policy_shift = 26 +SDMA_PKT_COPY_L2T_BROADCAST_DW_10_TILE_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_cache_policy_mask) << SDMA_PKT_COPY_L2T_BROADCAST_DW_10_tile_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_offset = 11 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_offset = 12 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_offset = 13 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_mask = 0x0007FFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_PITCH_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_offset = 14 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_mask = 0xFFFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_mask) << SDMA_PKT_COPY_L2T_BROADCAST_LINEAR_SLICE_PITCH_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_offset = 15 +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_mask = 0x3FFFFFFF +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_shift = 0 +SDMA_PKT_COPY_L2T_BROADCAST_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_mask) << SDMA_PKT_COPY_L2T_BROADCAST_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_op_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_HEADER_op_shift = 0 +SDMA_PKT_COPY_T2T_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_op_mask) << SDMA_PKT_COPY_T2T_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_T2T_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_sub_op_mask) << SDMA_PKT_COPY_T2T_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_T2T_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_T2T_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_tmz_mask) << SDMA_PKT_COPY_T2T_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_dcc_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_dcc_mask = 0x00000001 +SDMA_PKT_COPY_T2T_HEADER_dcc_shift = 19 +SDMA_PKT_COPY_T2T_HEADER_DCC = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_dcc_mask) << SDMA_PKT_COPY_T2T_HEADER_dcc_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_T2T_HEADER_cpv_shift = 28 +SDMA_PKT_COPY_T2T_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_cpv_mask) << SDMA_PKT_COPY_T2T_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_T2T_HEADER_dcc_dir_offset = 0 +SDMA_PKT_COPY_T2T_HEADER_dcc_dir_mask = 0x00000001 +SDMA_PKT_COPY_T2T_HEADER_dcc_dir_shift = 31 +SDMA_PKT_COPY_T2T_HEADER_DCC_DIR = lambda x: (((x) & SDMA_PKT_COPY_T2T_HEADER_dcc_dir_mask) << SDMA_PKT_COPY_T2T_HEADER_dcc_dir_shift) # type: ignore +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_T2T_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_T2T_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_T2T_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_3_src_x_mask) << SDMA_PKT_COPY_T2T_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_T2T_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_3_src_y_mask) << SDMA_PKT_COPY_T2T_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_T2T_DW_4_src_z_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_4_src_z_mask) << SDMA_PKT_COPY_T2T_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_4_src_width_offset = 4 +SDMA_PKT_COPY_T2T_DW_4_src_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_4_src_width_shift = 16 +SDMA_PKT_COPY_T2T_DW_4_SRC_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_4_src_width_mask) << SDMA_PKT_COPY_T2T_DW_4_src_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_5_src_height_offset = 5 +SDMA_PKT_COPY_T2T_DW_5_src_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_5_src_height_shift = 0 +SDMA_PKT_COPY_T2T_DW_5_SRC_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_5_src_height_mask) << SDMA_PKT_COPY_T2T_DW_5_src_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_5_src_depth_offset = 5 +SDMA_PKT_COPY_T2T_DW_5_src_depth_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_5_src_depth_shift = 16 +SDMA_PKT_COPY_T2T_DW_5_SRC_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_5_src_depth_mask) << SDMA_PKT_COPY_T2T_DW_5_src_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_element_size_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_DW_6_src_element_size_shift = 0 +SDMA_PKT_COPY_T2T_DW_6_SRC_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_element_size_mask) << SDMA_PKT_COPY_T2T_DW_6_src_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_shift = 3 +SDMA_PKT_COPY_T2T_DW_6_SRC_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_mask) << SDMA_PKT_COPY_T2T_DW_6_src_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_dimension_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_dimension_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_6_src_dimension_shift = 9 +SDMA_PKT_COPY_T2T_DW_6_SRC_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_dimension_mask) << SDMA_PKT_COPY_T2T_DW_6_src_dimension_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_mip_max_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_T2T_DW_6_src_mip_max_shift = 16 +SDMA_PKT_COPY_T2T_DW_6_SRC_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_mip_max_mask) << SDMA_PKT_COPY_T2T_DW_6_src_mip_max_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_6_src_mip_id_offset = 6 +SDMA_PKT_COPY_T2T_DW_6_src_mip_id_mask = 0x0000000F +SDMA_PKT_COPY_T2T_DW_6_src_mip_id_shift = 20 +SDMA_PKT_COPY_T2T_DW_6_SRC_MIP_ID = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_6_src_mip_id_mask) << SDMA_PKT_COPY_T2T_DW_6_src_mip_id_shift) # type: ignore +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_offset = 7 +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_T2T_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_offset = 8 +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_T2T_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_9_dst_x_offset = 9 +SDMA_PKT_COPY_T2T_DW_9_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_9_dst_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_9_DST_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_9_dst_x_mask) << SDMA_PKT_COPY_T2T_DW_9_dst_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_9_dst_y_offset = 9 +SDMA_PKT_COPY_T2T_DW_9_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_9_dst_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_9_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_9_dst_y_mask) << SDMA_PKT_COPY_T2T_DW_9_dst_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_10_dst_z_offset = 10 +SDMA_PKT_COPY_T2T_DW_10_dst_z_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_10_dst_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_10_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_10_dst_z_mask) << SDMA_PKT_COPY_T2T_DW_10_dst_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_10_dst_width_offset = 10 +SDMA_PKT_COPY_T2T_DW_10_dst_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_10_dst_width_shift = 16 +SDMA_PKT_COPY_T2T_DW_10_DST_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_10_dst_width_mask) << SDMA_PKT_COPY_T2T_DW_10_dst_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_11_dst_height_offset = 11 +SDMA_PKT_COPY_T2T_DW_11_dst_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_11_dst_height_shift = 0 +SDMA_PKT_COPY_T2T_DW_11_DST_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_11_dst_height_mask) << SDMA_PKT_COPY_T2T_DW_11_dst_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_11_dst_depth_offset = 11 +SDMA_PKT_COPY_T2T_DW_11_dst_depth_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_11_dst_depth_shift = 16 +SDMA_PKT_COPY_T2T_DW_11_DST_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_11_dst_depth_mask) << SDMA_PKT_COPY_T2T_DW_11_dst_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_DW_12_dst_element_size_shift = 0 +SDMA_PKT_COPY_T2T_DW_12_DST_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_element_size_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_shift = 3 +SDMA_PKT_COPY_T2T_DW_12_DST_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_12_dst_dimension_shift = 9 +SDMA_PKT_COPY_T2T_DW_12_DST_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_dimension_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_dimension_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_shift = 16 +SDMA_PKT_COPY_T2T_DW_12_DST_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_mip_max_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_offset = 12 +SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_mask = 0x0000000F +SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_shift = 20 +SDMA_PKT_COPY_T2T_DW_12_DST_MIP_ID = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_mask) << SDMA_PKT_COPY_T2T_DW_12_dst_mip_id_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_13_rect_x_offset = 13 +SDMA_PKT_COPY_T2T_DW_13_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_13_rect_x_shift = 0 +SDMA_PKT_COPY_T2T_DW_13_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_13_rect_x_mask) << SDMA_PKT_COPY_T2T_DW_13_rect_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_13_rect_y_offset = 13 +SDMA_PKT_COPY_T2T_DW_13_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_DW_13_rect_y_shift = 16 +SDMA_PKT_COPY_T2T_DW_13_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_13_rect_y_mask) << SDMA_PKT_COPY_T2T_DW_13_rect_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_rect_z_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_rect_z_mask = 0x00001FFF +SDMA_PKT_COPY_T2T_DW_14_rect_z_shift = 0 +SDMA_PKT_COPY_T2T_DW_14_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_rect_z_mask) << SDMA_PKT_COPY_T2T_DW_14_rect_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_dst_sw_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_14_dst_sw_shift = 16 +SDMA_PKT_COPY_T2T_DW_14_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_dst_sw_mask) << SDMA_PKT_COPY_T2T_DW_14_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_dst_cache_policy_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_dst_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_T2T_DW_14_dst_cache_policy_shift = 18 +SDMA_PKT_COPY_T2T_DW_14_DST_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_dst_cache_policy_mask) << SDMA_PKT_COPY_T2T_DW_14_dst_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_src_sw_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_DW_14_src_sw_shift = 24 +SDMA_PKT_COPY_T2T_DW_14_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_src_sw_mask) << SDMA_PKT_COPY_T2T_DW_14_src_sw_shift) # type: ignore +SDMA_PKT_COPY_T2T_DW_14_src_cache_policy_offset = 14 +SDMA_PKT_COPY_T2T_DW_14_src_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_T2T_DW_14_src_cache_policy_shift = 26 +SDMA_PKT_COPY_T2T_DW_14_SRC_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_T2T_DW_14_src_cache_policy_mask) << SDMA_PKT_COPY_T2T_DW_14_src_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_offset = 15 +SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_META_ADDR_LO_META_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_mask) << SDMA_PKT_COPY_T2T_META_ADDR_LO_meta_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_offset = 16 +SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_META_ADDR_HI_META_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_mask) << SDMA_PKT_COPY_T2T_META_ADDR_HI_meta_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_data_format_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_data_format_mask = 0x0000007F +SDMA_PKT_COPY_T2T_META_CONFIG_data_format_shift = 0 +SDMA_PKT_COPY_T2T_META_CONFIG_DATA_FORMAT = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_data_format_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_data_format_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_shift = 7 +SDMA_PKT_COPY_T2T_META_CONFIG_COLOR_TRANSFORM_DISABLE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_color_transform_disable_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_shift = 8 +SDMA_PKT_COPY_T2T_META_CONFIG_ALPHA_IS_ON_MSB = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_alpha_is_on_msb_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_number_type_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_number_type_mask = 0x00000007 +SDMA_PKT_COPY_T2T_META_CONFIG_number_type_shift = 9 +SDMA_PKT_COPY_T2T_META_CONFIG_NUMBER_TYPE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_number_type_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_number_type_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_mask = 0x00000003 +SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_shift = 12 +SDMA_PKT_COPY_T2T_META_CONFIG_SURFACE_TYPE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_surface_type_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_meta_llc_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_meta_llc_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_meta_llc_shift = 14 +SDMA_PKT_COPY_T2T_META_CONFIG_META_LLC = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_meta_llc_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_meta_llc_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_mask = 0x00000003 +SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_shift = 24 +SDMA_PKT_COPY_T2T_META_CONFIG_MAX_COMP_BLOCK_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_max_comp_block_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_mask = 0x00000003 +SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_shift = 26 +SDMA_PKT_COPY_T2T_META_CONFIG_MAX_UNCOMP_BLOCK_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_max_uncomp_block_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_shift = 28 +SDMA_PKT_COPY_T2T_META_CONFIG_WRITE_COMPRESS_ENABLE = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_write_compress_enable_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_shift = 29 +SDMA_PKT_COPY_T2T_META_CONFIG_META_TMZ = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_meta_tmz_shift) # type: ignore +SDMA_PKT_COPY_T2T_META_CONFIG_pipe_aligned_offset = 17 +SDMA_PKT_COPY_T2T_META_CONFIG_pipe_aligned_mask = 0x00000001 +SDMA_PKT_COPY_T2T_META_CONFIG_pipe_aligned_shift = 31 +SDMA_PKT_COPY_T2T_META_CONFIG_PIPE_ALIGNED = lambda x: (((x) & SDMA_PKT_COPY_T2T_META_CONFIG_pipe_aligned_mask) << SDMA_PKT_COPY_T2T_META_CONFIG_pipe_aligned_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_T2T_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_T2T_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_HEADER_op_mask) << SDMA_PKT_COPY_T2T_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_T2T_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_T2T_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_COPY_T2T_BC_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_COPY_T2T_BC_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_3_src_x_offset = 3 +SDMA_PKT_COPY_T2T_BC_DW_3_src_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_3_src_x_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_3_SRC_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_3_src_x_mask) << SDMA_PKT_COPY_T2T_BC_DW_3_src_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_3_src_y_offset = 3 +SDMA_PKT_COPY_T2T_BC_DW_3_src_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_3_src_y_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_3_SRC_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_3_src_y_mask) << SDMA_PKT_COPY_T2T_BC_DW_3_src_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_4_src_z_offset = 4 +SDMA_PKT_COPY_T2T_BC_DW_4_src_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_BC_DW_4_src_z_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_4_SRC_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_4_src_z_mask) << SDMA_PKT_COPY_T2T_BC_DW_4_src_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_4_src_width_offset = 4 +SDMA_PKT_COPY_T2T_BC_DW_4_src_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_4_src_width_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_4_SRC_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_4_src_width_mask) << SDMA_PKT_COPY_T2T_BC_DW_4_src_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_5_src_height_offset = 5 +SDMA_PKT_COPY_T2T_BC_DW_5_src_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_5_src_height_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_5_SRC_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_5_src_height_mask) << SDMA_PKT_COPY_T2T_BC_DW_5_src_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_offset = 5 +SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_mask = 0x000007FF +SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_5_SRC_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_mask) << SDMA_PKT_COPY_T2T_BC_DW_5_src_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_mask = 0x0000000F +SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_shift = 3 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_array_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_shift = 8 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_MIT_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_mit_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_shift = 11 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_tilesplit_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_shift = 15 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_BANK_W = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_w_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_shift = 18 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_BANK_H = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_bank_h_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_shift = 21 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_NUM_BANK = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_num_bank_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_shift = 24 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_MAT_ASPT = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_mat_aspt_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_offset = 6 +SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_mask = 0x0000001F +SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_shift = 26 +SDMA_PKT_COPY_T2T_BC_DW_6_SRC_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_mask) << SDMA_PKT_COPY_T2T_BC_DW_6_src_pipe_config_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_offset = 7 +SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_COPY_T2T_BC_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_offset = 8 +SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_COPY_T2T_BC_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_offset = 9 +SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_9_DST_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_mask) << SDMA_PKT_COPY_T2T_BC_DW_9_dst_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_offset = 9 +SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_9_DST_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_mask) << SDMA_PKT_COPY_T2T_BC_DW_9_dst_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_offset = 10 +SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_10_DST_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_mask) << SDMA_PKT_COPY_T2T_BC_DW_10_dst_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_offset = 10 +SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_10_DST_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_mask) << SDMA_PKT_COPY_T2T_BC_DW_10_dst_width_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_offset = 11 +SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_11_DST_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_mask) << SDMA_PKT_COPY_T2T_BC_DW_11_dst_height_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_offset = 11 +SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_mask = 0x00000FFF +SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_11_DST_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_mask) << SDMA_PKT_COPY_T2T_BC_DW_11_dst_depth_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_element_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_mask = 0x0000000F +SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_shift = 3 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_array_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_shift = 8 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_MIT_MODE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_mit_mode_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_mask = 0x00000007 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_shift = 11 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_tilesplit_size_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_shift = 15 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_BANK_W = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_w_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_shift = 18 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_BANK_H = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_bank_h_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_shift = 21 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_NUM_BANK = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_num_bank_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_shift = 24 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_MAT_ASPT = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_mat_aspt_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_offset = 12 +SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_mask = 0x0000001F +SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_shift = 26 +SDMA_PKT_COPY_T2T_BC_DW_12_DST_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_mask) << SDMA_PKT_COPY_T2T_BC_DW_12_dst_pipe_config_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_offset = 13 +SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_13_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_mask) << SDMA_PKT_COPY_T2T_BC_DW_13_rect_x_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_offset = 13 +SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_13_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_mask) << SDMA_PKT_COPY_T2T_BC_DW_13_rect_y_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_offset = 14 +SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_shift = 0 +SDMA_PKT_COPY_T2T_BC_DW_14_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_mask) << SDMA_PKT_COPY_T2T_BC_DW_14_rect_z_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_offset = 14 +SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_shift = 16 +SDMA_PKT_COPY_T2T_BC_DW_14_DST_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_mask) << SDMA_PKT_COPY_T2T_BC_DW_14_dst_sw_shift) # type: ignore +SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_offset = 14 +SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_mask = 0x00000003 +SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_shift = 24 +SDMA_PKT_COPY_T2T_BC_DW_14_SRC_SW = lambda x: (((x) & SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_mask) << SDMA_PKT_COPY_T2T_BC_DW_14_src_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_shift = 19 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_DCC = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_dcc_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_cpv_shift = 28 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_cpv_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_SUBWIN_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_SUBWIN_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_TILED_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_3_TILED_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_3_tiled_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_TILED_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_4_tiled_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_4_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_4_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_5_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_5_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_5_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_mask = 0x0000001F +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_shift = 3 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_swizzle_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_shift = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_DIMENSION = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_dimension_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_mask = 0x0000000F +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_MIP_MAX = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_max_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_mask = 0x0000000F +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_shift = 20 +SDMA_PKT_COPY_TILED_SUBWIN_DW_6_MIP_ID = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_6_mip_id_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_offset = 7 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_offset = 8 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_LINEAR_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_9_LINEAR_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_9_linear_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_LINEAR_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_10_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_10_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_11_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_11_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_12_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_12_rect_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_mask = 0x00001FFF +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_rect_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_cache_policy_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_cache_policy_shift = 18 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_LINEAR_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_cache_policy_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_linear_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_cache_policy_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_cache_policy_shift = 26 +SDMA_PKT_COPY_TILED_SUBWIN_DW_13_TILE_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_cache_policy_mask) << SDMA_PKT_COPY_TILED_SUBWIN_DW_13_tile_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_offset = 14 +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_META_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_LO_meta_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_offset = 15 +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_META_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_ADDR_HI_meta_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_mask = 0x0000007F +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_DATA_FORMAT = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_data_format_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_shift = 7 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_COLOR_TRANSFORM_DISABLE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_color_transform_disable_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_ALPHA_IS_ON_MSB = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_alpha_is_on_msb_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_shift = 9 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_NUMBER_TYPE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_number_type_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_shift = 12 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_SURFACE_TYPE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_surface_type_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_llc_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_llc_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_llc_shift = 14 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_META_LLC = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_llc_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_llc_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_MAX_COMP_BLOCK_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_comp_block_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_shift = 26 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_MAX_UNCOMP_BLOCK_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_max_uncomp_block_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_shift = 28 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_WRITE_COMPRESS_ENABLE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_write_compress_enable_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_shift = 29 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_META_TMZ = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_meta_tmz_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_pipe_aligned_offset = 16 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_pipe_aligned_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_pipe_aligned_shift = 31 +SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_PIPE_ALIGNED = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_pipe_aligned_mask) << SDMA_PKT_COPY_TILED_SUBWIN_META_CONFIG_pipe_aligned_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_offset = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_shift = 31 +SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_offset = 1 +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_TILED_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_LO_tiled_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_offset = 2 +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_TILED_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_TILED_ADDR_HI_tiled_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_TILED_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_offset = 3 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_TILED_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_3_tiled_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_TILED_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_tiled_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_offset = 4 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_WIDTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_4_width_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_HEIGHT = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_height_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_offset = 5 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_DEPTH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_5_depth_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_element_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_mask = 0x0000000F +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_shift = 3 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_array_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_shift = 8 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_MIT_MODE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mit_mode_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_mask = 0x00000007 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_shift = 11 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_tilesplit_size_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_shift = 15 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_BANK_W = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_w_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_shift = 18 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_BANK_H = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_bank_h_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_shift = 21 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_NUM_BANK = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_num_bank_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_MAT_ASPT = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_mat_aspt_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_offset = 6 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_mask = 0x0000001F +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_shift = 26 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_6_pipe_config_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_offset = 7 +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_offset = 8 +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_LINEAR_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_offset = 9 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_LINEAR_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_9_linear_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_LINEAR_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_offset = 10 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_LINEAR_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_10_linear_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_offset = 11 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_mask = 0x0FFFFFFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_LINEAR_SLICE_PITCH = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_11_linear_slice_pitch_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_RECT_X = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_x_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_offset = 12 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_mask = 0x00003FFF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_RECT_Y = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_12_rect_y_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_mask = 0x000007FF +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_shift = 0 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_RECT_Z = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_rect_z_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_shift = 16 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_offset = 13 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_mask = 0x00000003 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_shift = 24 +SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_TILE_SW = lambda x: (((x) & SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_mask) << SDMA_PKT_COPY_TILED_SUBWIN_BC_DW_13_tile_sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_op_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_op_mask = 0x000000FF +SDMA_PKT_COPY_STRUCT_HEADER_op_shift = 0 +SDMA_PKT_COPY_STRUCT_HEADER_OP = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_op_mask) << SDMA_PKT_COPY_STRUCT_HEADER_op_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COPY_STRUCT_HEADER_sub_op_shift = 8 +SDMA_PKT_COPY_STRUCT_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_sub_op_mask) << SDMA_PKT_COPY_STRUCT_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_tmz_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_COPY_STRUCT_HEADER_tmz_shift = 18 +SDMA_PKT_COPY_STRUCT_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_tmz_mask) << SDMA_PKT_COPY_STRUCT_HEADER_tmz_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_cpv_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COPY_STRUCT_HEADER_cpv_shift = 28 +SDMA_PKT_COPY_STRUCT_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_cpv_mask) << SDMA_PKT_COPY_STRUCT_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_HEADER_detile_offset = 0 +SDMA_PKT_COPY_STRUCT_HEADER_detile_mask = 0x00000001 +SDMA_PKT_COPY_STRUCT_HEADER_detile_shift = 31 +SDMA_PKT_COPY_STRUCT_HEADER_DETILE = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_HEADER_detile_mask) << SDMA_PKT_COPY_STRUCT_HEADER_detile_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_offset = 1 +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_shift = 0 +SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_SB_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_mask) << SDMA_PKT_COPY_STRUCT_SB_ADDR_LO_sb_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_offset = 2 +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_shift = 0 +SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_SB_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_mask) << SDMA_PKT_COPY_STRUCT_SB_ADDR_HI_sb_addr_63_32_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_offset = 3 +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_shift = 0 +SDMA_PKT_COPY_STRUCT_START_INDEX_START_INDEX = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_mask) << SDMA_PKT_COPY_STRUCT_START_INDEX_start_index_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_COUNT_count_offset = 4 +SDMA_PKT_COPY_STRUCT_COUNT_count_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_COUNT_count_shift = 0 +SDMA_PKT_COPY_STRUCT_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_COUNT_count_mask) << SDMA_PKT_COPY_STRUCT_COUNT_count_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_stride_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_stride_mask = 0x000007FF +SDMA_PKT_COPY_STRUCT_DW_5_stride_shift = 0 +SDMA_PKT_COPY_STRUCT_DW_5_STRIDE = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_stride_mask) << SDMA_PKT_COPY_STRUCT_DW_5_stride_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_mask = 0x00000003 +SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_shift = 16 +SDMA_PKT_COPY_STRUCT_DW_5_LINEAR_SW = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_mask) << SDMA_PKT_COPY_STRUCT_DW_5_linear_sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_linear_cache_policy_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_linear_cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_STRUCT_DW_5_linear_cache_policy_shift = 18 +SDMA_PKT_COPY_STRUCT_DW_5_LINEAR_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_linear_cache_policy_mask) << SDMA_PKT_COPY_STRUCT_DW_5_linear_cache_policy_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_mask = 0x00000003 +SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_shift = 24 +SDMA_PKT_COPY_STRUCT_DW_5_STRUCT_SW = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_mask) << SDMA_PKT_COPY_STRUCT_DW_5_struct__sw_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_DW_5_struct__cache_policy_offset = 5 +SDMA_PKT_COPY_STRUCT_DW_5_struct__cache_policy_mask = 0x00000007 +SDMA_PKT_COPY_STRUCT_DW_5_struct__cache_policy_shift = 26 +SDMA_PKT_COPY_STRUCT_DW_5_STRUCT_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_DW_5_struct__cache_policy_mask) << SDMA_PKT_COPY_STRUCT_DW_5_struct__cache_policy_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_offset = 6 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_shift = 0 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_LINEAR_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_mask) << SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_LO_linear_addr_31_0_shift) # type: ignore +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_offset = 7 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_shift = 0 +SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_LINEAR_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_mask) << SDMA_PKT_COPY_STRUCT_LINEAR_ADDR_HI_linear_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_op_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_UNTILED_HEADER_op_shift = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_op_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_UNTILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_shift = 16 +SDMA_PKT_WRITE_UNTILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_WRITE_UNTILED_HEADER_tmz_shift = 18 +SDMA_PKT_WRITE_UNTILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_tmz_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_HEADER_cpv_offset = 0 +SDMA_PKT_WRITE_UNTILED_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_WRITE_UNTILED_HEADER_cpv_shift = 28 +SDMA_PKT_WRITE_UNTILED_HEADER_CPV = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_HEADER_cpv_mask) << SDMA_PKT_WRITE_UNTILED_HEADER_cpv_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_UNTILED_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_UNTILED_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DW_3_count_offset = 3 +SDMA_PKT_WRITE_UNTILED_DW_3_count_mask = 0x000FFFFF +SDMA_PKT_WRITE_UNTILED_DW_3_count_shift = 0 +SDMA_PKT_WRITE_UNTILED_DW_3_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DW_3_count_mask) << SDMA_PKT_WRITE_UNTILED_DW_3_count_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DW_3_sw_offset = 3 +SDMA_PKT_WRITE_UNTILED_DW_3_sw_mask = 0x00000003 +SDMA_PKT_WRITE_UNTILED_DW_3_sw_shift = 24 +SDMA_PKT_WRITE_UNTILED_DW_3_SW = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DW_3_sw_mask) << SDMA_PKT_WRITE_UNTILED_DW_3_sw_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DW_3_cache_policy_offset = 3 +SDMA_PKT_WRITE_UNTILED_DW_3_cache_policy_mask = 0x00000007 +SDMA_PKT_WRITE_UNTILED_DW_3_cache_policy_shift = 26 +SDMA_PKT_WRITE_UNTILED_DW_3_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DW_3_cache_policy_mask) << SDMA_PKT_WRITE_UNTILED_DW_3_cache_policy_shift) # type: ignore +SDMA_PKT_WRITE_UNTILED_DATA0_data0_offset = 4 +SDMA_PKT_WRITE_UNTILED_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_UNTILED_DATA0_data0_shift = 0 +SDMA_PKT_WRITE_UNTILED_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_WRITE_UNTILED_DATA0_data0_mask) << SDMA_PKT_WRITE_UNTILED_DATA0_data0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_op_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_HEADER_op_shift = 0 +SDMA_PKT_WRITE_TILED_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_op_mask) << SDMA_PKT_WRITE_TILED_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_TILED_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_sub_op_mask) << SDMA_PKT_WRITE_TILED_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_encrypt_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_encrypt_mask = 0x00000001 +SDMA_PKT_WRITE_TILED_HEADER_encrypt_shift = 16 +SDMA_PKT_WRITE_TILED_HEADER_ENCRYPT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_encrypt_mask) << SDMA_PKT_WRITE_TILED_HEADER_encrypt_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_tmz_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_WRITE_TILED_HEADER_tmz_shift = 18 +SDMA_PKT_WRITE_TILED_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_tmz_mask) << SDMA_PKT_WRITE_TILED_HEADER_tmz_shift) # type: ignore +SDMA_PKT_WRITE_TILED_HEADER_cpv_offset = 0 +SDMA_PKT_WRITE_TILED_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_WRITE_TILED_HEADER_cpv_shift = 28 +SDMA_PKT_WRITE_TILED_HEADER_CPV = lambda x: (((x) & SDMA_PKT_WRITE_TILED_HEADER_cpv_mask) << SDMA_PKT_WRITE_TILED_HEADER_cpv_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_TILED_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_TILED_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_TILED_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_TILED_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_3_width_offset = 3 +SDMA_PKT_WRITE_TILED_DW_3_width_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_3_width_shift = 0 +SDMA_PKT_WRITE_TILED_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_3_width_mask) << SDMA_PKT_WRITE_TILED_DW_3_width_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_4_height_offset = 4 +SDMA_PKT_WRITE_TILED_DW_4_height_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_4_height_shift = 0 +SDMA_PKT_WRITE_TILED_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_4_height_mask) << SDMA_PKT_WRITE_TILED_DW_4_height_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_4_depth_offset = 4 +SDMA_PKT_WRITE_TILED_DW_4_depth_mask = 0x00001FFF +SDMA_PKT_WRITE_TILED_DW_4_depth_shift = 16 +SDMA_PKT_WRITE_TILED_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_4_depth_mask) << SDMA_PKT_WRITE_TILED_DW_4_depth_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_element_size_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_DW_5_element_size_shift = 0 +SDMA_PKT_WRITE_TILED_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_element_size_mask) << SDMA_PKT_WRITE_TILED_DW_5_element_size_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_mask = 0x0000001F +SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_shift = 3 +SDMA_PKT_WRITE_TILED_DW_5_SWIZZLE_MODE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_mask) << SDMA_PKT_WRITE_TILED_DW_5_swizzle_mode_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_dimension_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_dimension_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_DW_5_dimension_shift = 9 +SDMA_PKT_WRITE_TILED_DW_5_DIMENSION = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_dimension_mask) << SDMA_PKT_WRITE_TILED_DW_5_dimension_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_5_mip_max_offset = 5 +SDMA_PKT_WRITE_TILED_DW_5_mip_max_mask = 0x0000000F +SDMA_PKT_WRITE_TILED_DW_5_mip_max_shift = 16 +SDMA_PKT_WRITE_TILED_DW_5_MIP_MAX = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_5_mip_max_mask) << SDMA_PKT_WRITE_TILED_DW_5_mip_max_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_6_x_offset = 6 +SDMA_PKT_WRITE_TILED_DW_6_x_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_6_x_shift = 0 +SDMA_PKT_WRITE_TILED_DW_6_X = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_6_x_mask) << SDMA_PKT_WRITE_TILED_DW_6_x_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_6_y_offset = 6 +SDMA_PKT_WRITE_TILED_DW_6_y_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_DW_6_y_shift = 16 +SDMA_PKT_WRITE_TILED_DW_6_Y = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_6_y_mask) << SDMA_PKT_WRITE_TILED_DW_6_y_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_7_z_offset = 7 +SDMA_PKT_WRITE_TILED_DW_7_z_mask = 0x00001FFF +SDMA_PKT_WRITE_TILED_DW_7_z_shift = 0 +SDMA_PKT_WRITE_TILED_DW_7_Z = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_7_z_mask) << SDMA_PKT_WRITE_TILED_DW_7_z_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_7_sw_offset = 7 +SDMA_PKT_WRITE_TILED_DW_7_sw_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_DW_7_sw_shift = 24 +SDMA_PKT_WRITE_TILED_DW_7_SW = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_7_sw_mask) << SDMA_PKT_WRITE_TILED_DW_7_sw_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DW_7_cache_policy_offset = 7 +SDMA_PKT_WRITE_TILED_DW_7_cache_policy_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_DW_7_cache_policy_shift = 26 +SDMA_PKT_WRITE_TILED_DW_7_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DW_7_cache_policy_mask) << SDMA_PKT_WRITE_TILED_DW_7_cache_policy_shift) # type: ignore +SDMA_PKT_WRITE_TILED_COUNT_count_offset = 8 +SDMA_PKT_WRITE_TILED_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_WRITE_TILED_COUNT_count_shift = 0 +SDMA_PKT_WRITE_TILED_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_COUNT_count_mask) << SDMA_PKT_WRITE_TILED_COUNT_count_shift) # type: ignore +SDMA_PKT_WRITE_TILED_DATA0_data0_offset = 9 +SDMA_PKT_WRITE_TILED_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_DATA0_data0_shift = 0 +SDMA_PKT_WRITE_TILED_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_DATA0_data0_mask) << SDMA_PKT_WRITE_TILED_DATA0_data0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_HEADER_op_offset = 0 +SDMA_PKT_WRITE_TILED_BC_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_BC_HEADER_op_shift = 0 +SDMA_PKT_WRITE_TILED_BC_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_HEADER_op_mask) << SDMA_PKT_WRITE_TILED_BC_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_TILED_BC_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_mask) << SDMA_PKT_WRITE_TILED_BC_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_TILED_BC_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_TILED_BC_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_3_width_offset = 3 +SDMA_PKT_WRITE_TILED_BC_DW_3_width_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_BC_DW_3_width_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_3_WIDTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_3_width_mask) << SDMA_PKT_WRITE_TILED_BC_DW_3_width_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_4_height_offset = 4 +SDMA_PKT_WRITE_TILED_BC_DW_4_height_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_BC_DW_4_height_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_4_HEIGHT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_4_height_mask) << SDMA_PKT_WRITE_TILED_BC_DW_4_height_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_4_depth_offset = 4 +SDMA_PKT_WRITE_TILED_BC_DW_4_depth_mask = 0x000007FF +SDMA_PKT_WRITE_TILED_BC_DW_4_depth_shift = 16 +SDMA_PKT_WRITE_TILED_BC_DW_4_DEPTH = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_4_depth_mask) << SDMA_PKT_WRITE_TILED_BC_DW_4_depth_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_5_ELEMENT_SIZE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_element_size_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_mask = 0x0000000F +SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_shift = 3 +SDMA_PKT_WRITE_TILED_BC_DW_5_ARRAY_MODE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_array_mode_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_shift = 8 +SDMA_PKT_WRITE_TILED_BC_DW_5_MIT_MODE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_mit_mode_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_mask = 0x00000007 +SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_shift = 11 +SDMA_PKT_WRITE_TILED_BC_DW_5_TILESPLIT_SIZE = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_tilesplit_size_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_shift = 15 +SDMA_PKT_WRITE_TILED_BC_DW_5_BANK_W = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_bank_w_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_shift = 18 +SDMA_PKT_WRITE_TILED_BC_DW_5_BANK_H = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_bank_h_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_shift = 21 +SDMA_PKT_WRITE_TILED_BC_DW_5_NUM_BANK = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_num_bank_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_shift = 24 +SDMA_PKT_WRITE_TILED_BC_DW_5_MAT_ASPT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_mat_aspt_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_offset = 5 +SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_mask = 0x0000001F +SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_shift = 26 +SDMA_PKT_WRITE_TILED_BC_DW_5_PIPE_CONFIG = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_mask) << SDMA_PKT_WRITE_TILED_BC_DW_5_pipe_config_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_6_x_offset = 6 +SDMA_PKT_WRITE_TILED_BC_DW_6_x_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_BC_DW_6_x_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_6_X = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_6_x_mask) << SDMA_PKT_WRITE_TILED_BC_DW_6_x_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_6_y_offset = 6 +SDMA_PKT_WRITE_TILED_BC_DW_6_y_mask = 0x00003FFF +SDMA_PKT_WRITE_TILED_BC_DW_6_y_shift = 16 +SDMA_PKT_WRITE_TILED_BC_DW_6_Y = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_6_y_mask) << SDMA_PKT_WRITE_TILED_BC_DW_6_y_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_7_z_offset = 7 +SDMA_PKT_WRITE_TILED_BC_DW_7_z_mask = 0x000007FF +SDMA_PKT_WRITE_TILED_BC_DW_7_z_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DW_7_Z = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_7_z_mask) << SDMA_PKT_WRITE_TILED_BC_DW_7_z_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DW_7_sw_offset = 7 +SDMA_PKT_WRITE_TILED_BC_DW_7_sw_mask = 0x00000003 +SDMA_PKT_WRITE_TILED_BC_DW_7_sw_shift = 24 +SDMA_PKT_WRITE_TILED_BC_DW_7_SW = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DW_7_sw_mask) << SDMA_PKT_WRITE_TILED_BC_DW_7_sw_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_COUNT_count_offset = 8 +SDMA_PKT_WRITE_TILED_BC_COUNT_count_mask = 0x000FFFFF +SDMA_PKT_WRITE_TILED_BC_COUNT_count_shift = 2 +SDMA_PKT_WRITE_TILED_BC_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_COUNT_count_mask) << SDMA_PKT_WRITE_TILED_BC_COUNT_count_shift) # type: ignore +SDMA_PKT_WRITE_TILED_BC_DATA0_data0_offset = 9 +SDMA_PKT_WRITE_TILED_BC_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_TILED_BC_DATA0_data0_shift = 0 +SDMA_PKT_WRITE_TILED_BC_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_WRITE_TILED_BC_DATA0_data0_mask) << SDMA_PKT_WRITE_TILED_BC_DATA0_data0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_COPY_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_tmz_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_HEADER_tmz_shift = 18 +SDMA_PKT_PTEPDE_COPY_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_tmz_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_tmz_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_cpv_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_HEADER_cpv_shift = 28 +SDMA_PKT_PTEPDE_COPY_HEADER_CPV = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_cpv_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_cpv_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_shift = 31 +SDMA_PKT_PTEPDE_COPY_HEADER_PTEPDE_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_mask) << SDMA_PKT_PTEPDE_COPY_HEADER_ptepde_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_offset = 5 +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_shift = 0 +SDMA_PKT_PTEPDE_COPY_MASK_DW0_MASK_DW0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_mask) << SDMA_PKT_PTEPDE_COPY_MASK_DW0_mask_dw0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_offset = 6 +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_shift = 0 +SDMA_PKT_PTEPDE_COPY_MASK_DW1_MASK_DW1 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_mask) << SDMA_PKT_PTEPDE_COPY_MASK_DW1_mask_dw1_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_COUNT_count_offset = 7 +SDMA_PKT_PTEPDE_COPY_COUNT_count_mask = 0x0007FFFF +SDMA_PKT_PTEPDE_COPY_COUNT_count_shift = 0 +SDMA_PKT_PTEPDE_COPY_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_COUNT_count_mask) << SDMA_PKT_PTEPDE_COPY_COUNT_count_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_COUNT_dst_cache_policy_offset = 7 +SDMA_PKT_PTEPDE_COPY_COUNT_dst_cache_policy_mask = 0x00000007 +SDMA_PKT_PTEPDE_COPY_COUNT_dst_cache_policy_shift = 22 +SDMA_PKT_PTEPDE_COPY_COUNT_DST_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_COUNT_dst_cache_policy_mask) << SDMA_PKT_PTEPDE_COPY_COUNT_dst_cache_policy_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_COUNT_src_cache_policy_offset = 7 +SDMA_PKT_PTEPDE_COPY_COUNT_src_cache_policy_mask = 0x00000007 +SDMA_PKT_PTEPDE_COPY_COUNT_src_cache_policy_shift = 29 +SDMA_PKT_PTEPDE_COPY_COUNT_SRC_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_COUNT_src_cache_policy_mask) << SDMA_PKT_PTEPDE_COPY_COUNT_src_cache_policy_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_mask = 0x00000003 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_shift = 28 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_PTE_SIZE = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_pte_size_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_shift = 30 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_DIRECTION = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_direction_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_offset = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_mask = 0x00000001 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_shift = 31 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_PTEPDE_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_HEADER_ptepde_op_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_offset = 5 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_MASK_FIRST_XFER = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_first_xfer_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_offset = 5 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_mask = 0x000000FF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_shift = 8 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_MASK_LAST_XFER = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_MASK_BIT_FOR_DW_mask_last_xfer_shift) # type: ignore +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_offset = 6 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_mask = 0x0001FFFF +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_shift = 0 +SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_COUNT = lambda x: (((x) & SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_mask) << SDMA_PKT_PTEPDE_COPY_BACKWARDS_COUNT_IN_32B_XFER_count_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_op_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_RMW_HEADER_op_shift = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_op_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_op_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_shift = 8 +SDMA_PKT_PTEPDE_RMW_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_mtype_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_mtype_mask = 0x00000007 +SDMA_PKT_PTEPDE_RMW_HEADER_mtype_shift = 16 +SDMA_PKT_PTEPDE_RMW_HEADER_MTYPE = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_mtype_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_mtype_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_gcc_shift = 19 +SDMA_PKT_PTEPDE_RMW_HEADER_GCC = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_gcc_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_gcc_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_sys_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_sys_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_sys_shift = 20 +SDMA_PKT_PTEPDE_RMW_HEADER_SYS = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_sys_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_sys_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_snp_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_snp_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_snp_shift = 22 +SDMA_PKT_PTEPDE_RMW_HEADER_SNP = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_snp_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_snp_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_gpa_shift = 23 +SDMA_PKT_PTEPDE_RMW_HEADER_GPA = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_gpa_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_gpa_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_mask = 0x00000003 +SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_shift = 24 +SDMA_PKT_PTEPDE_RMW_HEADER_L2_POLICY = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_l2_policy_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_llc_policy_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_llc_policy_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_llc_policy_shift = 26 +SDMA_PKT_PTEPDE_RMW_HEADER_LLC_POLICY = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_llc_policy_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_llc_policy_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_HEADER_cpv_offset = 0 +SDMA_PKT_PTEPDE_RMW_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_PTEPDE_RMW_HEADER_cpv_shift = 28 +SDMA_PKT_PTEPDE_RMW_HEADER_CPV = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_HEADER_cpv_mask) << SDMA_PKT_PTEPDE_RMW_HEADER_cpv_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_mask) << SDMA_PKT_PTEPDE_RMW_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_mask) << SDMA_PKT_PTEPDE_RMW_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_offset = 3 +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_MASK_LO_MASK_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_mask) << SDMA_PKT_PTEPDE_RMW_MASK_LO_mask_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_offset = 4 +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_MASK_HI_MASK_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_mask) << SDMA_PKT_PTEPDE_RMW_MASK_HI_mask_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_offset = 5 +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_shift = 0 +SDMA_PKT_PTEPDE_RMW_VALUE_LO_VALUE_31_0 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_mask) << SDMA_PKT_PTEPDE_RMW_VALUE_LO_value_31_0_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_offset = 6 +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_shift = 0 +SDMA_PKT_PTEPDE_RMW_VALUE_HI_VALUE_63_32 = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_mask) << SDMA_PKT_PTEPDE_RMW_VALUE_HI_value_63_32_shift) # type: ignore +SDMA_PKT_PTEPDE_RMW_COUNT_num_of_pte_offset = 7 +SDMA_PKT_PTEPDE_RMW_COUNT_num_of_pte_mask = 0xFFFFFFFF +SDMA_PKT_PTEPDE_RMW_COUNT_num_of_pte_shift = 0 +SDMA_PKT_PTEPDE_RMW_COUNT_NUM_OF_PTE = lambda x: (((x) & SDMA_PKT_PTEPDE_RMW_COUNT_num_of_pte_mask) << SDMA_PKT_PTEPDE_RMW_COUNT_num_of_pte_shift) # type: ignore +SDMA_PKT_REGISTER_RMW_HEADER_op_offset = 0 +SDMA_PKT_REGISTER_RMW_HEADER_op_mask = 0x000000FF +SDMA_PKT_REGISTER_RMW_HEADER_op_shift = 0 +SDMA_PKT_REGISTER_RMW_HEADER_OP = lambda x: (((x) & SDMA_PKT_REGISTER_RMW_HEADER_op_mask) << SDMA_PKT_REGISTER_RMW_HEADER_op_shift) # type: ignore +SDMA_PKT_REGISTER_RMW_HEADER_sub_op_offset = 0 +SDMA_PKT_REGISTER_RMW_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_REGISTER_RMW_HEADER_sub_op_shift = 8 +SDMA_PKT_REGISTER_RMW_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_REGISTER_RMW_HEADER_sub_op_mask) << SDMA_PKT_REGISTER_RMW_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_REGISTER_RMW_ADDR_addr_offset = 1 +SDMA_PKT_REGISTER_RMW_ADDR_addr_mask = 0x000FFFFF +SDMA_PKT_REGISTER_RMW_ADDR_addr_shift = 0 +SDMA_PKT_REGISTER_RMW_ADDR_ADDR = lambda x: (((x) & SDMA_PKT_REGISTER_RMW_ADDR_addr_mask) << SDMA_PKT_REGISTER_RMW_ADDR_addr_shift) # type: ignore +SDMA_PKT_REGISTER_RMW_ADDR_aperture_id_offset = 1 +SDMA_PKT_REGISTER_RMW_ADDR_aperture_id_mask = 0x00000FFF +SDMA_PKT_REGISTER_RMW_ADDR_aperture_id_shift = 20 +SDMA_PKT_REGISTER_RMW_ADDR_APERTURE_ID = lambda x: (((x) & SDMA_PKT_REGISTER_RMW_ADDR_aperture_id_mask) << SDMA_PKT_REGISTER_RMW_ADDR_aperture_id_shift) # type: ignore +SDMA_PKT_REGISTER_RMW_MASK_mask_offset = 2 +SDMA_PKT_REGISTER_RMW_MASK_mask_mask = 0xFFFFFFFF +SDMA_PKT_REGISTER_RMW_MASK_mask_shift = 0 +SDMA_PKT_REGISTER_RMW_MASK_MASK = lambda x: (((x) & SDMA_PKT_REGISTER_RMW_MASK_mask_mask) << SDMA_PKT_REGISTER_RMW_MASK_mask_shift) # type: ignore +SDMA_PKT_REGISTER_RMW_VALUE_value_offset = 3 +SDMA_PKT_REGISTER_RMW_VALUE_value_mask = 0xFFFFFFFF +SDMA_PKT_REGISTER_RMW_VALUE_value_shift = 0 +SDMA_PKT_REGISTER_RMW_VALUE_VALUE = lambda x: (((x) & SDMA_PKT_REGISTER_RMW_VALUE_value_mask) << SDMA_PKT_REGISTER_RMW_VALUE_value_shift) # type: ignore +SDMA_PKT_REGISTER_RMW_MISC_stride_offset = 4 +SDMA_PKT_REGISTER_RMW_MISC_stride_mask = 0x000FFFFF +SDMA_PKT_REGISTER_RMW_MISC_stride_shift = 0 +SDMA_PKT_REGISTER_RMW_MISC_STRIDE = lambda x: (((x) & SDMA_PKT_REGISTER_RMW_MISC_stride_mask) << SDMA_PKT_REGISTER_RMW_MISC_stride_shift) # type: ignore +SDMA_PKT_REGISTER_RMW_MISC_num_of_reg_offset = 4 +SDMA_PKT_REGISTER_RMW_MISC_num_of_reg_mask = 0x00000FFF +SDMA_PKT_REGISTER_RMW_MISC_num_of_reg_shift = 20 +SDMA_PKT_REGISTER_RMW_MISC_NUM_OF_REG = lambda x: (((x) & SDMA_PKT_REGISTER_RMW_MISC_num_of_reg_mask) << SDMA_PKT_REGISTER_RMW_MISC_num_of_reg_shift) # type: ignore +SDMA_PKT_WRITE_INCR_HEADER_op_offset = 0 +SDMA_PKT_WRITE_INCR_HEADER_op_mask = 0x000000FF +SDMA_PKT_WRITE_INCR_HEADER_op_shift = 0 +SDMA_PKT_WRITE_INCR_HEADER_OP = lambda x: (((x) & SDMA_PKT_WRITE_INCR_HEADER_op_mask) << SDMA_PKT_WRITE_INCR_HEADER_op_shift) # type: ignore +SDMA_PKT_WRITE_INCR_HEADER_sub_op_offset = 0 +SDMA_PKT_WRITE_INCR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_WRITE_INCR_HEADER_sub_op_shift = 8 +SDMA_PKT_WRITE_INCR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_WRITE_INCR_HEADER_sub_op_mask) << SDMA_PKT_WRITE_INCR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_WRITE_INCR_HEADER_cache_policy_offset = 0 +SDMA_PKT_WRITE_INCR_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_WRITE_INCR_HEADER_cache_policy_shift = 24 +SDMA_PKT_WRITE_INCR_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_WRITE_INCR_HEADER_cache_policy_mask) << SDMA_PKT_WRITE_INCR_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_WRITE_INCR_HEADER_cpv_offset = 0 +SDMA_PKT_WRITE_INCR_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_WRITE_INCR_HEADER_cpv_shift = 28 +SDMA_PKT_WRITE_INCR_HEADER_CPV = lambda x: (((x) & SDMA_PKT_WRITE_INCR_HEADER_cpv_mask) << SDMA_PKT_WRITE_INCR_HEADER_cpv_shift) # type: ignore +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_WRITE_INCR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_WRITE_INCR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_WRITE_INCR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_WRITE_INCR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_offset = 3 +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_MASK_DW0_MASK_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_mask) << SDMA_PKT_WRITE_INCR_MASK_DW0_mask_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_offset = 4 +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_MASK_DW1_MASK_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_mask) << SDMA_PKT_WRITE_INCR_MASK_DW1_mask_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_offset = 5 +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_INIT_DW0_INIT_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_mask) << SDMA_PKT_WRITE_INCR_INIT_DW0_init_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_offset = 6 +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_INIT_DW1_INIT_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_mask) << SDMA_PKT_WRITE_INCR_INIT_DW1_init_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_offset = 7 +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_shift = 0 +SDMA_PKT_WRITE_INCR_INCR_DW0_INCR_DW0 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_mask) << SDMA_PKT_WRITE_INCR_INCR_DW0_incr_dw0_shift) # type: ignore +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_offset = 8 +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_mask = 0xFFFFFFFF +SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_shift = 0 +SDMA_PKT_WRITE_INCR_INCR_DW1_INCR_DW1 = lambda x: (((x) & SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_mask) << SDMA_PKT_WRITE_INCR_INCR_DW1_incr_dw1_shift) # type: ignore +SDMA_PKT_WRITE_INCR_COUNT_count_offset = 9 +SDMA_PKT_WRITE_INCR_COUNT_count_mask = 0x0007FFFF +SDMA_PKT_WRITE_INCR_COUNT_count_shift = 0 +SDMA_PKT_WRITE_INCR_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_WRITE_INCR_COUNT_count_mask) << SDMA_PKT_WRITE_INCR_COUNT_count_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_op_offset = 0 +SDMA_PKT_INDIRECT_HEADER_op_mask = 0x000000FF +SDMA_PKT_INDIRECT_HEADER_op_shift = 0 +SDMA_PKT_INDIRECT_HEADER_OP = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_op_mask) << SDMA_PKT_INDIRECT_HEADER_op_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_sub_op_offset = 0 +SDMA_PKT_INDIRECT_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_INDIRECT_HEADER_sub_op_shift = 8 +SDMA_PKT_INDIRECT_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_sub_op_mask) << SDMA_PKT_INDIRECT_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_vmid_offset = 0 +SDMA_PKT_INDIRECT_HEADER_vmid_mask = 0x0000000F +SDMA_PKT_INDIRECT_HEADER_vmid_shift = 16 +SDMA_PKT_INDIRECT_HEADER_VMID = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_vmid_mask) << SDMA_PKT_INDIRECT_HEADER_vmid_shift) # type: ignore +SDMA_PKT_INDIRECT_HEADER_priv_offset = 0 +SDMA_PKT_INDIRECT_HEADER_priv_mask = 0x00000001 +SDMA_PKT_INDIRECT_HEADER_priv_shift = 31 +SDMA_PKT_INDIRECT_HEADER_PRIV = lambda x: (((x) & SDMA_PKT_INDIRECT_HEADER_priv_mask) << SDMA_PKT_INDIRECT_HEADER_priv_shift) # type: ignore +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_offset = 1 +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_shift = 0 +SDMA_PKT_INDIRECT_BASE_LO_IB_BASE_31_0 = lambda x: (((x) & SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_mask) << SDMA_PKT_INDIRECT_BASE_LO_ib_base_31_0_shift) # type: ignore +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_offset = 2 +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_shift = 0 +SDMA_PKT_INDIRECT_BASE_HI_IB_BASE_63_32 = lambda x: (((x) & SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_mask) << SDMA_PKT_INDIRECT_BASE_HI_ib_base_63_32_shift) # type: ignore +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_offset = 3 +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_mask = 0x000FFFFF +SDMA_PKT_INDIRECT_IB_SIZE_ib_size_shift = 0 +SDMA_PKT_INDIRECT_IB_SIZE_IB_SIZE = lambda x: (((x) & SDMA_PKT_INDIRECT_IB_SIZE_ib_size_mask) << SDMA_PKT_INDIRECT_IB_SIZE_ib_size_shift) # type: ignore +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_offset = 4 +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_shift = 0 +SDMA_PKT_INDIRECT_CSA_ADDR_LO_CSA_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_mask) << SDMA_PKT_INDIRECT_CSA_ADDR_LO_csa_addr_31_0_shift) # type: ignore +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_offset = 5 +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_shift = 0 +SDMA_PKT_INDIRECT_CSA_ADDR_HI_CSA_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_mask) << SDMA_PKT_INDIRECT_CSA_ADDR_HI_csa_addr_63_32_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_op_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_op_mask = 0x000000FF +SDMA_PKT_SEMAPHORE_HEADER_op_shift = 0 +SDMA_PKT_SEMAPHORE_HEADER_OP = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_op_mask) << SDMA_PKT_SEMAPHORE_HEADER_op_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_sub_op_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_SEMAPHORE_HEADER_sub_op_shift = 8 +SDMA_PKT_SEMAPHORE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_sub_op_mask) << SDMA_PKT_SEMAPHORE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_write_one_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_write_one_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_write_one_shift = 29 +SDMA_PKT_SEMAPHORE_HEADER_WRITE_ONE = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_write_one_mask) << SDMA_PKT_SEMAPHORE_HEADER_write_one_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_signal_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_signal_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_signal_shift = 30 +SDMA_PKT_SEMAPHORE_HEADER_SIGNAL = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_signal_mask) << SDMA_PKT_SEMAPHORE_HEADER_signal_shift) # type: ignore +SDMA_PKT_SEMAPHORE_HEADER_mailbox_offset = 0 +SDMA_PKT_SEMAPHORE_HEADER_mailbox_mask = 0x00000001 +SDMA_PKT_SEMAPHORE_HEADER_mailbox_shift = 31 +SDMA_PKT_SEMAPHORE_HEADER_MAILBOX = lambda x: (((x) & SDMA_PKT_SEMAPHORE_HEADER_mailbox_mask) << SDMA_PKT_SEMAPHORE_HEADER_mailbox_shift) # type: ignore +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_SEMAPHORE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_SEMAPHORE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_SEMAPHORE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_SEMAPHORE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_MEM_INCR_HEADER_op_offset = 0 +SDMA_PKT_MEM_INCR_HEADER_op_mask = 0x000000FF +SDMA_PKT_MEM_INCR_HEADER_op_shift = 0 +SDMA_PKT_MEM_INCR_HEADER_OP = lambda x: (((x) & SDMA_PKT_MEM_INCR_HEADER_op_mask) << SDMA_PKT_MEM_INCR_HEADER_op_shift) # type: ignore +SDMA_PKT_MEM_INCR_HEADER_sub_op_offset = 0 +SDMA_PKT_MEM_INCR_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_MEM_INCR_HEADER_sub_op_shift = 8 +SDMA_PKT_MEM_INCR_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_MEM_INCR_HEADER_sub_op_mask) << SDMA_PKT_MEM_INCR_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_MEM_INCR_HEADER_l2_policy_offset = 0 +SDMA_PKT_MEM_INCR_HEADER_l2_policy_mask = 0x00000003 +SDMA_PKT_MEM_INCR_HEADER_l2_policy_shift = 24 +SDMA_PKT_MEM_INCR_HEADER_L2_POLICY = lambda x: (((x) & SDMA_PKT_MEM_INCR_HEADER_l2_policy_mask) << SDMA_PKT_MEM_INCR_HEADER_l2_policy_shift) # type: ignore +SDMA_PKT_MEM_INCR_HEADER_llc_policy_offset = 0 +SDMA_PKT_MEM_INCR_HEADER_llc_policy_mask = 0x00000001 +SDMA_PKT_MEM_INCR_HEADER_llc_policy_shift = 26 +SDMA_PKT_MEM_INCR_HEADER_LLC_POLICY = lambda x: (((x) & SDMA_PKT_MEM_INCR_HEADER_llc_policy_mask) << SDMA_PKT_MEM_INCR_HEADER_llc_policy_shift) # type: ignore +SDMA_PKT_MEM_INCR_HEADER_cpv_offset = 0 +SDMA_PKT_MEM_INCR_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_MEM_INCR_HEADER_cpv_shift = 28 +SDMA_PKT_MEM_INCR_HEADER_CPV = lambda x: (((x) & SDMA_PKT_MEM_INCR_HEADER_cpv_mask) << SDMA_PKT_MEM_INCR_HEADER_cpv_shift) # type: ignore +SDMA_PKT_MEM_INCR_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_MEM_INCR_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_MEM_INCR_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_MEM_INCR_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_MEM_INCR_ADDR_LO_addr_31_0_mask) << SDMA_PKT_MEM_INCR_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_MEM_INCR_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_MEM_INCR_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_MEM_INCR_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_MEM_INCR_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_MEM_INCR_ADDR_HI_addr_63_32_mask) << SDMA_PKT_MEM_INCR_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_HEADER_op_offset = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_op_mask = 0x000000FF +SDMA_PKT_VM_INVALIDATION_HEADER_op_shift = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_OP = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_HEADER_op_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_op_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_offset = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_shift = 8 +SDMA_PKT_VM_INVALIDATION_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_offset = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_mask = 0x0000001F +SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_shift = 16 +SDMA_PKT_VM_INVALIDATION_HEADER_GFX_ENG_ID = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_gfx_eng_id_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_offset = 0 +SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_mask = 0x0000001F +SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_shift = 24 +SDMA_PKT_VM_INVALIDATION_HEADER_MM_ENG_ID = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_mask) << SDMA_PKT_VM_INVALIDATION_HEADER_mm_eng_id_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_offset = 1 +SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_mask = 0xFFFFFFFF +SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_shift = 0 +SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_INVALIDATEREQ = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_mask) << SDMA_PKT_VM_INVALIDATION_INVALIDATEREQ_invalidatereq_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_offset = 2 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_mask = 0xFFFFFFFF +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_shift = 0 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_ADDRESSRANGELO = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGELO_addressrangelo_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_offset = 3 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_mask = 0x0000FFFF +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_shift = 0 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_INVALIDATEACK = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_invalidateack_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_offset = 3 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_mask = 0x0000001F +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_shift = 16 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_ADDRESSRANGEHI = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_addressrangehi_shift) # type: ignore +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_offset = 3 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_mask = 0x000001FF +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_shift = 23 +SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_RESERVED = lambda x: (((x) & SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_mask) << SDMA_PKT_VM_INVALIDATION_ADDRESSRANGEHI_reserved_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_op_offset = 0 +SDMA_PKT_FENCE_HEADER_op_mask = 0x000000FF +SDMA_PKT_FENCE_HEADER_op_shift = 0 +SDMA_PKT_FENCE_HEADER_OP = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_op_mask) << SDMA_PKT_FENCE_HEADER_op_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_sub_op_offset = 0 +SDMA_PKT_FENCE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_FENCE_HEADER_sub_op_shift = 8 +SDMA_PKT_FENCE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_sub_op_mask) << SDMA_PKT_FENCE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_mtype_offset = 0 +SDMA_PKT_FENCE_HEADER_mtype_mask = 0x00000007 +SDMA_PKT_FENCE_HEADER_mtype_shift = 16 +SDMA_PKT_FENCE_HEADER_MTYPE = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_mtype_mask) << SDMA_PKT_FENCE_HEADER_mtype_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_gcc_offset = 0 +SDMA_PKT_FENCE_HEADER_gcc_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_gcc_shift = 19 +SDMA_PKT_FENCE_HEADER_GCC = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_gcc_mask) << SDMA_PKT_FENCE_HEADER_gcc_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_sys_offset = 0 +SDMA_PKT_FENCE_HEADER_sys_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_sys_shift = 20 +SDMA_PKT_FENCE_HEADER_SYS = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_sys_mask) << SDMA_PKT_FENCE_HEADER_sys_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_snp_offset = 0 +SDMA_PKT_FENCE_HEADER_snp_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_snp_shift = 22 +SDMA_PKT_FENCE_HEADER_SNP = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_snp_mask) << SDMA_PKT_FENCE_HEADER_snp_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_gpa_offset = 0 +SDMA_PKT_FENCE_HEADER_gpa_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_gpa_shift = 23 +SDMA_PKT_FENCE_HEADER_GPA = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_gpa_mask) << SDMA_PKT_FENCE_HEADER_gpa_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_l2_policy_offset = 0 +SDMA_PKT_FENCE_HEADER_l2_policy_mask = 0x00000003 +SDMA_PKT_FENCE_HEADER_l2_policy_shift = 24 +SDMA_PKT_FENCE_HEADER_L2_POLICY = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_l2_policy_mask) << SDMA_PKT_FENCE_HEADER_l2_policy_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_llc_policy_offset = 0 +SDMA_PKT_FENCE_HEADER_llc_policy_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_llc_policy_shift = 26 +SDMA_PKT_FENCE_HEADER_LLC_POLICY = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_llc_policy_mask) << SDMA_PKT_FENCE_HEADER_llc_policy_shift) # type: ignore +SDMA_PKT_FENCE_HEADER_cpv_offset = 0 +SDMA_PKT_FENCE_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_FENCE_HEADER_cpv_shift = 28 +SDMA_PKT_FENCE_HEADER_CPV = lambda x: (((x) & SDMA_PKT_FENCE_HEADER_cpv_mask) << SDMA_PKT_FENCE_HEADER_cpv_shift) # type: ignore +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_FENCE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_FENCE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_FENCE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_FENCE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_FENCE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_FENCE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_FENCE_DATA_data_offset = 3 +SDMA_PKT_FENCE_DATA_data_mask = 0xFFFFFFFF +SDMA_PKT_FENCE_DATA_data_shift = 0 +SDMA_PKT_FENCE_DATA_DATA = lambda x: (((x) & SDMA_PKT_FENCE_DATA_data_mask) << SDMA_PKT_FENCE_DATA_data_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_op_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_op_mask = 0x000000FF +SDMA_PKT_SRBM_WRITE_HEADER_op_shift = 0 +SDMA_PKT_SRBM_WRITE_HEADER_OP = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_op_mask) << SDMA_PKT_SRBM_WRITE_HEADER_op_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_SRBM_WRITE_HEADER_sub_op_shift = 8 +SDMA_PKT_SRBM_WRITE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_sub_op_mask) << SDMA_PKT_SRBM_WRITE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_offset = 0 +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_mask = 0x0000000F +SDMA_PKT_SRBM_WRITE_HEADER_byte_en_shift = 28 +SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_HEADER_byte_en_mask) << SDMA_PKT_SRBM_WRITE_HEADER_byte_en_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_ADDR_addr_offset = 1 +SDMA_PKT_SRBM_WRITE_ADDR_addr_mask = 0x0003FFFF +SDMA_PKT_SRBM_WRITE_ADDR_addr_shift = 0 +SDMA_PKT_SRBM_WRITE_ADDR_ADDR = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_ADDR_addr_mask) << SDMA_PKT_SRBM_WRITE_ADDR_addr_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_ADDR_apertureid_offset = 1 +SDMA_PKT_SRBM_WRITE_ADDR_apertureid_mask = 0x00000FFF +SDMA_PKT_SRBM_WRITE_ADDR_apertureid_shift = 20 +SDMA_PKT_SRBM_WRITE_ADDR_APERTUREID = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_ADDR_apertureid_mask) << SDMA_PKT_SRBM_WRITE_ADDR_apertureid_shift) # type: ignore +SDMA_PKT_SRBM_WRITE_DATA_data_offset = 2 +SDMA_PKT_SRBM_WRITE_DATA_data_mask = 0xFFFFFFFF +SDMA_PKT_SRBM_WRITE_DATA_data_shift = 0 +SDMA_PKT_SRBM_WRITE_DATA_DATA = lambda x: (((x) & SDMA_PKT_SRBM_WRITE_DATA_data_mask) << SDMA_PKT_SRBM_WRITE_DATA_data_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_op_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_op_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_op_shift = 0 +SDMA_PKT_PRE_EXE_HEADER_OP = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_op_mask) << SDMA_PKT_PRE_EXE_HEADER_op_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_sub_op_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_sub_op_shift = 8 +SDMA_PKT_PRE_EXE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_sub_op_mask) << SDMA_PKT_PRE_EXE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_PRE_EXE_HEADER_dev_sel_offset = 0 +SDMA_PKT_PRE_EXE_HEADER_dev_sel_mask = 0x000000FF +SDMA_PKT_PRE_EXE_HEADER_dev_sel_shift = 16 +SDMA_PKT_PRE_EXE_HEADER_DEV_SEL = lambda x: (((x) & SDMA_PKT_PRE_EXE_HEADER_dev_sel_mask) << SDMA_PKT_PRE_EXE_HEADER_dev_sel_shift) # type: ignore +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_offset = 1 +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_mask = 0x00003FFF +SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_shift = 0 +SDMA_PKT_PRE_EXE_EXEC_COUNT_EXEC_COUNT = lambda x: (((x) & SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_mask) << SDMA_PKT_PRE_EXE_EXEC_COUNT_exec_count_shift) # type: ignore +SDMA_PKT_COND_EXE_HEADER_op_offset = 0 +SDMA_PKT_COND_EXE_HEADER_op_mask = 0x000000FF +SDMA_PKT_COND_EXE_HEADER_op_shift = 0 +SDMA_PKT_COND_EXE_HEADER_OP = lambda x: (((x) & SDMA_PKT_COND_EXE_HEADER_op_mask) << SDMA_PKT_COND_EXE_HEADER_op_shift) # type: ignore +SDMA_PKT_COND_EXE_HEADER_sub_op_offset = 0 +SDMA_PKT_COND_EXE_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_COND_EXE_HEADER_sub_op_shift = 8 +SDMA_PKT_COND_EXE_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_COND_EXE_HEADER_sub_op_mask) << SDMA_PKT_COND_EXE_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_COND_EXE_HEADER_cache_policy_offset = 0 +SDMA_PKT_COND_EXE_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_COND_EXE_HEADER_cache_policy_shift = 24 +SDMA_PKT_COND_EXE_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_COND_EXE_HEADER_cache_policy_mask) << SDMA_PKT_COND_EXE_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_COND_EXE_HEADER_cpv_offset = 0 +SDMA_PKT_COND_EXE_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_COND_EXE_HEADER_cpv_shift = 28 +SDMA_PKT_COND_EXE_HEADER_CPV = lambda x: (((x) & SDMA_PKT_COND_EXE_HEADER_cpv_mask) << SDMA_PKT_COND_EXE_HEADER_cpv_shift) # type: ignore +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_COND_EXE_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_mask) << SDMA_PKT_COND_EXE_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_COND_EXE_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_mask) << SDMA_PKT_COND_EXE_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_COND_EXE_REFERENCE_reference_offset = 3 +SDMA_PKT_COND_EXE_REFERENCE_reference_mask = 0xFFFFFFFF +SDMA_PKT_COND_EXE_REFERENCE_reference_shift = 0 +SDMA_PKT_COND_EXE_REFERENCE_REFERENCE = lambda x: (((x) & SDMA_PKT_COND_EXE_REFERENCE_reference_mask) << SDMA_PKT_COND_EXE_REFERENCE_reference_shift) # type: ignore +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_offset = 4 +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_mask = 0x00003FFF +SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_shift = 0 +SDMA_PKT_COND_EXE_EXEC_COUNT_EXEC_COUNT = lambda x: (((x) & SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_mask) << SDMA_PKT_COND_EXE_EXEC_COUNT_exec_count_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_op_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_op_mask = 0x000000FF +SDMA_PKT_CONSTANT_FILL_HEADER_op_shift = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_OP = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_op_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_op_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_shift = 8 +SDMA_PKT_CONSTANT_FILL_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_sw_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_sw_mask = 0x00000003 +SDMA_PKT_CONSTANT_FILL_HEADER_sw_shift = 16 +SDMA_PKT_CONSTANT_FILL_HEADER_SW = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_sw_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_sw_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_cache_policy_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_CONSTANT_FILL_HEADER_cache_policy_shift = 24 +SDMA_PKT_CONSTANT_FILL_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_cache_policy_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_cpv_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_CONSTANT_FILL_HEADER_cpv_shift = 28 +SDMA_PKT_CONSTANT_FILL_HEADER_CPV = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_cpv_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_cpv_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_offset = 0 +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_mask = 0x00000003 +SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_shift = 30 +SDMA_PKT_CONSTANT_FILL_HEADER_FILLSIZE = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_mask) << SDMA_PKT_CONSTANT_FILL_HEADER_fillsize_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_offset = 1 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_CONSTANT_FILL_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_offset = 2 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_CONSTANT_FILL_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_offset = 3 +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_shift = 0 +SDMA_PKT_CONSTANT_FILL_DATA_SRC_DATA_31_0 = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_mask) << SDMA_PKT_CONSTANT_FILL_DATA_src_data_31_0_shift) # type: ignore +SDMA_PKT_CONSTANT_FILL_COUNT_count_offset = 4 +SDMA_PKT_CONSTANT_FILL_COUNT_count_mask = 0x3FFFFFFF +SDMA_PKT_CONSTANT_FILL_COUNT_count_shift = 0 +SDMA_PKT_CONSTANT_FILL_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_CONSTANT_FILL_COUNT_count_mask) << SDMA_PKT_CONSTANT_FILL_COUNT_count_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_mask = 0x000000FF +SDMA_PKT_DATA_FILL_MULTI_HEADER_op_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_OP = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_op_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_op_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_shift = 8 +SDMA_PKT_DATA_FILL_MULTI_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_cache_policy_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_DATA_FILL_MULTI_HEADER_cache_policy_shift = 24 +SDMA_PKT_DATA_FILL_MULTI_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_cache_policy_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_cpv_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_DATA_FILL_MULTI_HEADER_cpv_shift = 28 +SDMA_PKT_DATA_FILL_MULTI_HEADER_CPV = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_cpv_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_cpv_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_offset = 0 +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_mask = 0x00000001 +SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_shift = 31 +SDMA_PKT_DATA_FILL_MULTI_HEADER_MEMLOG_CLR = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_mask) << SDMA_PKT_DATA_FILL_MULTI_HEADER_memlog_clr_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_offset = 1 +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_BYTE_STRIDE = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_mask) << SDMA_PKT_DATA_FILL_MULTI_BYTE_STRIDE_byte_stride_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_offset = 2 +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_DMA_COUNT = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_mask) << SDMA_PKT_DATA_FILL_MULTI_DMA_COUNT_dma_count_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_offset = 3 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_offset = 4 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_PKT_DATA_FILL_MULTI_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_offset = 5 +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_mask = 0x03FFFFFF +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_shift = 0 +SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_COUNT = lambda x: (((x) & SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_mask) << SDMA_PKT_DATA_FILL_MULTI_BYTE_COUNT_count_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_REGMEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_REGMEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_op_mask) << SDMA_PKT_POLL_REGMEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_REGMEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_REGMEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_REGMEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_cache_policy_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_POLL_REGMEM_HEADER_cache_policy_shift = 20 +SDMA_PKT_POLL_REGMEM_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_cache_policy_mask) << SDMA_PKT_POLL_REGMEM_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_cpv_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_POLL_REGMEM_HEADER_cpv_shift = 24 +SDMA_PKT_POLL_REGMEM_HEADER_CPV = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_cpv_mask) << SDMA_PKT_POLL_REGMEM_HEADER_cpv_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_mask = 0x00000001 +SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_shift = 26 +SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_mask) << SDMA_PKT_POLL_REGMEM_HEADER_hdp_flush_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_func_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_func_mask = 0x00000007 +SDMA_PKT_POLL_REGMEM_HEADER_func_shift = 28 +SDMA_PKT_POLL_REGMEM_HEADER_FUNC = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_func_mask) << SDMA_PKT_POLL_REGMEM_HEADER_func_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_offset = 0 +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_mask = 0x00000001 +SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_shift = 31 +SDMA_PKT_POLL_REGMEM_HEADER_MEM_POLL = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_mask) << SDMA_PKT_POLL_REGMEM_HEADER_mem_poll_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_REGMEM_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_REGMEM_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_REGMEM_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_REGMEM_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_VALUE_value_offset = 3 +SDMA_PKT_POLL_REGMEM_VALUE_value_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_VALUE_value_shift = 0 +SDMA_PKT_POLL_REGMEM_VALUE_VALUE = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_VALUE_value_mask) << SDMA_PKT_POLL_REGMEM_VALUE_value_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_MASK_mask_offset = 4 +SDMA_PKT_POLL_REGMEM_MASK_mask_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REGMEM_MASK_mask_shift = 0 +SDMA_PKT_POLL_REGMEM_MASK_MASK = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_MASK_mask_mask) << SDMA_PKT_POLL_REGMEM_MASK_mask_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_DW5_interval_offset = 5 +SDMA_PKT_POLL_REGMEM_DW5_interval_mask = 0x0000FFFF +SDMA_PKT_POLL_REGMEM_DW5_interval_shift = 0 +SDMA_PKT_POLL_REGMEM_DW5_INTERVAL = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_DW5_interval_mask) << SDMA_PKT_POLL_REGMEM_DW5_interval_shift) # type: ignore +SDMA_PKT_POLL_REGMEM_DW5_retry_count_offset = 5 +SDMA_PKT_POLL_REGMEM_DW5_retry_count_mask = 0x00000FFF +SDMA_PKT_POLL_REGMEM_DW5_retry_count_shift = 16 +SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT = lambda x: (((x) & SDMA_PKT_POLL_REGMEM_DW5_retry_count_mask) << SDMA_PKT_POLL_REGMEM_DW5_retry_count_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cache_policy_offset = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cache_policy_shift = 24 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cache_policy_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cpv_offset = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cpv_shift = 28 +SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_CPV = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cpv_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_HEADER_cpv_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_offset = 1 +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_mask = 0x3FFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_shift = 2 +SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_ADDR_31_2 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_SRC_ADDR_addr_31_2_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_offset = 2 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_offset = 3 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_REG_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_mask = 0x00000003 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_shift = 16 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_EA = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_ea_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cache_policy_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cache_policy_shift = 24 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cache_policy_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cpv_offset = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cpv_shift = 28 +SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_CPV = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cpv_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_HEADER_cpv_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_DST_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_offset = 3 +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_mask = 0x0FFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_shift = 4 +SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_ADDR_31_4 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_START_PAGE_addr_31_4_shift) # type: ignore +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_offset = 4 +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_shift = 0 +SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_PAGE_NUM_31_0 = lambda x: (((x) & SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_mask) << SDMA_PKT_POLL_DBIT_WRITE_MEM_PAGE_NUM_page_num_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_mask = 0x000000FF +SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_OP = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_op_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_shift = 8 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_cache_policy_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_cache_policy_shift = 24 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_cache_policy_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_cpv_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_cpv_shift = 28 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_CPV = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_cpv_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_cpv_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_offset = 0 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_mask = 0x00000001 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_shift = 31 +SDMA_PKT_POLL_MEM_VERIFY_HEADER_MODE = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_mask) << SDMA_PKT_POLL_MEM_VERIFY_HEADER_mode_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_offset = 1 +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_PATTERN_PATTERN = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_mask) << SDMA_PKT_POLL_MEM_VERIFY_PATTERN_pattern_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_offset = 2 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_CMP0_START_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_LO_cmp0_start_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_offset = 3 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_CMP0_START_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_START_HI_cmp0_start_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp0_end_31_0_offset = 4 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp0_end_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp0_end_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_CMP0_END_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp0_end_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_LO_cmp0_end_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp0_end_63_32_offset = 5 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp0_end_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp0_end_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_CMP0_END_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp0_end_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP0_ADDR_END_HI_cmp0_end_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_offset = 6 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_CMP1_START_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_LO_cmp1_start_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_offset = 7 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_CMP1_START_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_START_HI_cmp1_start_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_offset = 8 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_CMP1_END_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_LO_cmp1_end_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_offset = 9 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_CMP1_END_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_CMP1_ADDR_END_HI_cmp1_end_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_offset = 10 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_REC_31_0 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_mask) << SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_LO_rec_31_0_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_offset = 11 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_REC_63_32 = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_mask) << SDMA_PKT_POLL_MEM_VERIFY_REC_ADDR_HI_rec_63_32_shift) # type: ignore +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_offset = 12 +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_mask = 0xFFFFFFFF +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_shift = 0 +SDMA_PKT_POLL_MEM_VERIFY_RESERVED_RESERVED = lambda x: (((x) & SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_mask) << SDMA_PKT_POLL_MEM_VERIFY_RESERVED_reserved_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_op_offset = 0 +SDMA_PKT_ATOMIC_HEADER_op_mask = 0x000000FF +SDMA_PKT_ATOMIC_HEADER_op_shift = 0 +SDMA_PKT_ATOMIC_HEADER_OP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_op_mask) << SDMA_PKT_ATOMIC_HEADER_op_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_loop_offset = 0 +SDMA_PKT_ATOMIC_HEADER_loop_mask = 0x00000001 +SDMA_PKT_ATOMIC_HEADER_loop_shift = 16 +SDMA_PKT_ATOMIC_HEADER_LOOP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_loop_mask) << SDMA_PKT_ATOMIC_HEADER_loop_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_tmz_offset = 0 +SDMA_PKT_ATOMIC_HEADER_tmz_mask = 0x00000001 +SDMA_PKT_ATOMIC_HEADER_tmz_shift = 18 +SDMA_PKT_ATOMIC_HEADER_TMZ = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_tmz_mask) << SDMA_PKT_ATOMIC_HEADER_tmz_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_cache_policy_offset = 0 +SDMA_PKT_ATOMIC_HEADER_cache_policy_mask = 0x00000007 +SDMA_PKT_ATOMIC_HEADER_cache_policy_shift = 20 +SDMA_PKT_ATOMIC_HEADER_CACHE_POLICY = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_cache_policy_mask) << SDMA_PKT_ATOMIC_HEADER_cache_policy_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_cpv_offset = 0 +SDMA_PKT_ATOMIC_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_ATOMIC_HEADER_cpv_shift = 24 +SDMA_PKT_ATOMIC_HEADER_CPV = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_cpv_mask) << SDMA_PKT_ATOMIC_HEADER_cpv_shift) # type: ignore +SDMA_PKT_ATOMIC_HEADER_atomic_op_offset = 0 +SDMA_PKT_ATOMIC_HEADER_atomic_op_mask = 0x0000007F +SDMA_PKT_ATOMIC_HEADER_atomic_op_shift = 25 +SDMA_PKT_ATOMIC_HEADER_ATOMIC_OP = lambda x: (((x) & SDMA_PKT_ATOMIC_HEADER_atomic_op_mask) << SDMA_PKT_ATOMIC_HEADER_atomic_op_shift) # type: ignore +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_offset = 1 +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_shift = 0 +SDMA_PKT_ATOMIC_ADDR_LO_ADDR_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_mask) << SDMA_PKT_ATOMIC_ADDR_LO_addr_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_offset = 2 +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_shift = 0 +SDMA_PKT_ATOMIC_ADDR_HI_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_mask) << SDMA_PKT_ATOMIC_ADDR_HI_addr_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_offset = 3 +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_shift = 0 +SDMA_PKT_ATOMIC_SRC_DATA_LO_SRC_DATA_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_mask) << SDMA_PKT_ATOMIC_SRC_DATA_LO_src_data_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_offset = 4 +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_shift = 0 +SDMA_PKT_ATOMIC_SRC_DATA_HI_SRC_DATA_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_mask) << SDMA_PKT_ATOMIC_SRC_DATA_HI_src_data_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_offset = 5 +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_shift = 0 +SDMA_PKT_ATOMIC_CMP_DATA_LO_CMP_DATA_31_0 = lambda x: (((x) & SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_mask) << SDMA_PKT_ATOMIC_CMP_DATA_LO_cmp_data_31_0_shift) # type: ignore +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_offset = 6 +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_shift = 0 +SDMA_PKT_ATOMIC_CMP_DATA_HI_CMP_DATA_63_32 = lambda x: (((x) & SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_mask) << SDMA_PKT_ATOMIC_CMP_DATA_HI_cmp_data_63_32_shift) # type: ignore +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_offset = 7 +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_mask = 0x00001FFF +SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_shift = 0 +SDMA_PKT_ATOMIC_LOOP_INTERVAL_LOOP_INTERVAL = lambda x: (((x) & SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_mask) << SDMA_PKT_ATOMIC_LOOP_INTERVAL_loop_interval_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_SET_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_SET_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_SET_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_SET_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_offset = 1 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_shift = 0 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_INIT_DATA_31_0 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_mask) << SDMA_PKT_TIMESTAMP_SET_INIT_DATA_LO_init_data_31_0_shift) # type: ignore +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_INIT_DATA_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_mask) << SDMA_PKT_TIMESTAMP_SET_INIT_DATA_HI_init_data_63_32_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_GET_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_l2_policy_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_l2_policy_mask = 0x00000003 +SDMA_PKT_TIMESTAMP_GET_HEADER_l2_policy_shift = 24 +SDMA_PKT_TIMESTAMP_GET_HEADER_L2_POLICY = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_l2_policy_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_l2_policy_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_llc_policy_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_llc_policy_mask = 0x00000001 +SDMA_PKT_TIMESTAMP_GET_HEADER_llc_policy_shift = 26 +SDMA_PKT_TIMESTAMP_GET_HEADER_LLC_POLICY = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_llc_policy_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_llc_policy_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_HEADER_cpv_offset = 0 +SDMA_PKT_TIMESTAMP_GET_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_TIMESTAMP_GET_HEADER_cpv_shift = 28 +SDMA_PKT_TIMESTAMP_GET_HEADER_CPV = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_HEADER_cpv_mask) << SDMA_PKT_TIMESTAMP_GET_HEADER_cpv_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_offset = 1 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_mask = 0x1FFFFFFF +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_shift = 3 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_WRITE_ADDR_31_3 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_mask) << SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_LO_write_addr_31_3_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_WRITE_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_mask) << SDMA_PKT_TIMESTAMP_GET_WRITE_ADDR_HI_write_addr_63_32_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_shift = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_shift = 8 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_l2_policy_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_l2_policy_mask = 0x00000003 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_l2_policy_shift = 24 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_L2_POLICY = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_l2_policy_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_l2_policy_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_llc_policy_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_llc_policy_mask = 0x00000001 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_llc_policy_shift = 26 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_LLC_POLICY = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_llc_policy_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_llc_policy_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_cpv_offset = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_cpv_mask = 0x00000001 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_cpv_shift = 28 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_CPV = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_cpv_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_HEADER_cpv_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_offset = 1 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_mask = 0x1FFFFFFF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_shift = 3 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_WRITE_ADDR_31_3 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_LO_write_addr_31_3_shift) # type: ignore +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_offset = 2 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_mask = 0xFFFFFFFF +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_shift = 0 +SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_WRITE_ADDR_63_32 = lambda x: (((x) & SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_mask) << SDMA_PKT_TIMESTAMP_GET_GLOBAL_WRITE_ADDR_HI_write_addr_63_32_shift) # type: ignore +SDMA_PKT_TRAP_HEADER_op_offset = 0 +SDMA_PKT_TRAP_HEADER_op_mask = 0x000000FF +SDMA_PKT_TRAP_HEADER_op_shift = 0 +SDMA_PKT_TRAP_HEADER_OP = lambda x: (((x) & SDMA_PKT_TRAP_HEADER_op_mask) << SDMA_PKT_TRAP_HEADER_op_shift) # type: ignore +SDMA_PKT_TRAP_HEADER_sub_op_offset = 0 +SDMA_PKT_TRAP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_TRAP_HEADER_sub_op_shift = 8 +SDMA_PKT_TRAP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_TRAP_HEADER_sub_op_mask) << SDMA_PKT_TRAP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_TRAP_INT_CONTEXT_int_context_offset = 1 +SDMA_PKT_TRAP_INT_CONTEXT_int_context_mask = 0x0FFFFFFF +SDMA_PKT_TRAP_INT_CONTEXT_int_context_shift = 0 +SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT = lambda x: (((x) & SDMA_PKT_TRAP_INT_CONTEXT_int_context_mask) << SDMA_PKT_TRAP_INT_CONTEXT_int_context_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_HEADER_op_offset = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_op_mask = 0x000000FF +SDMA_PKT_DUMMY_TRAP_HEADER_op_shift = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_OP = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_HEADER_op_mask) << SDMA_PKT_DUMMY_TRAP_HEADER_op_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_offset = 0 +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_shift = 8 +SDMA_PKT_DUMMY_TRAP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_mask) << SDMA_PKT_DUMMY_TRAP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_offset = 1 +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_mask = 0x0FFFFFFF +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_shift = 0 +SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_INT_CONTEXT = lambda x: (((x) & SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_mask) << SDMA_PKT_DUMMY_TRAP_INT_CONTEXT_int_context_shift) # type: ignore +SDMA_PKT_GPUVM_INV_HEADER_op_offset = 0 +SDMA_PKT_GPUVM_INV_HEADER_op_mask = 0x000000FF +SDMA_PKT_GPUVM_INV_HEADER_op_shift = 0 +SDMA_PKT_GPUVM_INV_HEADER_OP = lambda x: (((x) & SDMA_PKT_GPUVM_INV_HEADER_op_mask) << SDMA_PKT_GPUVM_INV_HEADER_op_shift) # type: ignore +SDMA_PKT_GPUVM_INV_HEADER_sub_op_offset = 0 +SDMA_PKT_GPUVM_INV_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_GPUVM_INV_HEADER_sub_op_shift = 8 +SDMA_PKT_GPUVM_INV_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_GPUVM_INV_HEADER_sub_op_mask) << SDMA_PKT_GPUVM_INV_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_mask = 0x0000FFFF +SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_shift = 0 +SDMA_PKT_GPUVM_INV_PAYLOAD1_PER_VMID_INV_REQ = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_per_vmid_inv_req_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_mask = 0x00000007 +SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_shift = 16 +SDMA_PKT_GPUVM_INV_PAYLOAD1_FLUSH_TYPE = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_flush_type_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_shift = 19 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L2_PTES = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_ptes_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_shift = 20 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L2_PDE0 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde0_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_shift = 21 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L2_PDE1 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde1_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_shift = 22 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L2_PDE2 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l2_pde2_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_shift = 23 +SDMA_PKT_GPUVM_INV_PAYLOAD1_L1_PTES = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_l1_ptes_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_shift = 24 +SDMA_PKT_GPUVM_INV_PAYLOAD1_CLR_PROTECTION_FAULT_STATUS_ADDR = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_clr_protection_fault_status_addr_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_shift = 25 +SDMA_PKT_GPUVM_INV_PAYLOAD1_LOG_REQUEST = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_log_request_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_offset = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_shift = 26 +SDMA_PKT_GPUVM_INV_PAYLOAD1_FOUR_KILOBYTES = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD1_four_kilobytes_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD2_s_offset = 2 +SDMA_PKT_GPUVM_INV_PAYLOAD2_s_mask = 0x00000001 +SDMA_PKT_GPUVM_INV_PAYLOAD2_s_shift = 0 +SDMA_PKT_GPUVM_INV_PAYLOAD2_S = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD2_s_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD2_s_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_offset = 2 +SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_mask = 0x7FFFFFFF +SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_shift = 1 +SDMA_PKT_GPUVM_INV_PAYLOAD2_PAGE_VA_42_12 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD2_page_va_42_12_shift) # type: ignore +SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_offset = 3 +SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_mask = 0x0000003F +SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_shift = 0 +SDMA_PKT_GPUVM_INV_PAYLOAD3_PAGE_VA_47_43 = lambda x: (((x) & SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_mask) << SDMA_PKT_GPUVM_INV_PAYLOAD3_page_va_47_43_shift) # type: ignore +SDMA_PKT_GCR_REQ_HEADER_op_offset = 0 +SDMA_PKT_GCR_REQ_HEADER_op_mask = 0x000000FF +SDMA_PKT_GCR_REQ_HEADER_op_shift = 0 +SDMA_PKT_GCR_REQ_HEADER_OP = lambda x: (((x) & SDMA_PKT_GCR_REQ_HEADER_op_mask) << SDMA_PKT_GCR_REQ_HEADER_op_shift) # type: ignore +SDMA_PKT_GCR_REQ_HEADER_sub_op_offset = 0 +SDMA_PKT_GCR_REQ_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_GCR_REQ_HEADER_sub_op_shift = 8 +SDMA_PKT_GCR_REQ_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_GCR_REQ_HEADER_sub_op_mask) << SDMA_PKT_GCR_REQ_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_offset = 1 +SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_mask = 0x01FFFFFF +SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_shift = 7 +SDMA_PKT_GCR_REQ_PAYLOAD1_BASE_VA_31_7 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_mask) << SDMA_PKT_GCR_REQ_PAYLOAD1_base_va_31_7_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_offset = 2 +SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_mask = 0x0000FFFF +SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_shift = 0 +SDMA_PKT_GCR_REQ_PAYLOAD2_BASE_VA_47_32 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_mask) << SDMA_PKT_GCR_REQ_PAYLOAD2_base_va_47_32_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_offset = 2 +SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_mask = 0x0000FFFF +SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_shift = 16 +SDMA_PKT_GCR_REQ_PAYLOAD2_GCR_CONTROL_15_0 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_mask) << SDMA_PKT_GCR_REQ_PAYLOAD2_gcr_control_15_0_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_offset = 3 +SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_mask = 0x00000007 +SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_shift = 0 +SDMA_PKT_GCR_REQ_PAYLOAD3_GCR_CONTROL_18_16 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_mask) << SDMA_PKT_GCR_REQ_PAYLOAD3_gcr_control_18_16_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_offset = 3 +SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_mask = 0x01FFFFFF +SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_shift = 7 +SDMA_PKT_GCR_REQ_PAYLOAD3_LIMIT_VA_31_7 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_mask) << SDMA_PKT_GCR_REQ_PAYLOAD3_limit_va_31_7_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_offset = 4 +SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_mask = 0x0000FFFF +SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_shift = 0 +SDMA_PKT_GCR_REQ_PAYLOAD4_LIMIT_VA_47_32 = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_mask) << SDMA_PKT_GCR_REQ_PAYLOAD4_limit_va_47_32_shift) # type: ignore +SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_offset = 4 +SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_mask = 0x0000000F +SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_shift = 24 +SDMA_PKT_GCR_REQ_PAYLOAD4_VMID = lambda x: (((x) & SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_mask) << SDMA_PKT_GCR_REQ_PAYLOAD4_vmid_shift) # type: ignore +SDMA_PKT_NOP_HEADER_op_offset = 0 +SDMA_PKT_NOP_HEADER_op_mask = 0x000000FF +SDMA_PKT_NOP_HEADER_op_shift = 0 +SDMA_PKT_NOP_HEADER_OP = lambda x: (((x) & SDMA_PKT_NOP_HEADER_op_mask) << SDMA_PKT_NOP_HEADER_op_shift) # type: ignore +SDMA_PKT_NOP_HEADER_sub_op_offset = 0 +SDMA_PKT_NOP_HEADER_sub_op_mask = 0x000000FF +SDMA_PKT_NOP_HEADER_sub_op_shift = 8 +SDMA_PKT_NOP_HEADER_SUB_OP = lambda x: (((x) & SDMA_PKT_NOP_HEADER_sub_op_mask) << SDMA_PKT_NOP_HEADER_sub_op_shift) # type: ignore +SDMA_PKT_NOP_HEADER_count_offset = 0 +SDMA_PKT_NOP_HEADER_count_mask = 0x00003FFF +SDMA_PKT_NOP_HEADER_count_shift = 16 +SDMA_PKT_NOP_HEADER_COUNT = lambda x: (((x) & SDMA_PKT_NOP_HEADER_count_mask) << SDMA_PKT_NOP_HEADER_count_shift) # type: ignore +SDMA_PKT_NOP_DATA0_data0_offset = 1 +SDMA_PKT_NOP_DATA0_data0_mask = 0xFFFFFFFF +SDMA_PKT_NOP_DATA0_data0_shift = 0 +SDMA_PKT_NOP_DATA0_DATA0 = lambda x: (((x) & SDMA_PKT_NOP_DATA0_data0_mask) << SDMA_PKT_NOP_DATA0_data0_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_format_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_HEADER_HEADER_format_shift = 0 +SDMA_AQL_PKT_HEADER_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_format_mask) << SDMA_AQL_PKT_HEADER_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_HEADER_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_HEADER_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_barrier_mask) << SDMA_AQL_PKT_HEADER_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_HEADER_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_HEADER_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_HEADER_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_HEADER_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_HEADER_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_HEADER_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_reserved_mask) << SDMA_AQL_PKT_HEADER_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_op_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_HEADER_HEADER_op_shift = 16 +SDMA_AQL_PKT_HEADER_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_op_mask) << SDMA_AQL_PKT_HEADER_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_subop_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_HEADER_HEADER_subop_shift = 20 +SDMA_AQL_PKT_HEADER_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_subop_mask) << SDMA_AQL_PKT_HEADER_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_HEADER_HEADER_cpv_offset = 0 +SDMA_AQL_PKT_HEADER_HEADER_cpv_mask = 0x00000001 +SDMA_AQL_PKT_HEADER_HEADER_cpv_shift = 28 +SDMA_AQL_PKT_HEADER_HEADER_CPV = lambda x: (((x) & SDMA_AQL_PKT_HEADER_HEADER_cpv_mask) << SDMA_AQL_PKT_HEADER_HEADER_cpv_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_shift = 16 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_shift = 20 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_HEADER_cpv_offset = 0 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_cpv_mask = 0x00000001 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_cpv_shift = 28 +SDMA_AQL_PKT_COPY_LINEAR_HEADER_CPV = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_HEADER_cpv_mask) << SDMA_AQL_PKT_COPY_LINEAR_HEADER_cpv_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_offset = 1 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_RESERVED_DW1 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW1_reserved_dw1_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_offset = 2 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_RETURN_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_LO_return_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_offset = 3 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_RETURN_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_RETURN_ADDR_HI_return_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_offset = 4 +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_mask = 0x003FFFFF +SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COUNT_COUNT = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_mask) << SDMA_AQL_PKT_COPY_LINEAR_COUNT_count_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_offset = 5 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift = 16 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_DST_SW = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_mask) << SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_sw_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_offset = 5 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_mask = 0x00000007 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_shift = 18 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_DST_CACHE_POLICY = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_mask) << SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_dst_cache_policy_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_offset = 5 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_mask = 0x00000003 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_shift = 24 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_SRC_SW = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_mask) << SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_sw_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_offset = 5 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_mask = 0x00000007 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_shift = 26 +SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_SRC_CACHE_POLICY = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_mask) << SDMA_AQL_PKT_COPY_LINEAR_PARAMETER_src_cache_policy_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_offset = 6 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_SRC_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_LO_src_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_offset = 7 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_SRC_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_SRC_ADDR_HI_src_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_offset = 8 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_DST_ADDR_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_LO_dst_addr_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_offset = 9 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_DST_ADDR_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_DST_ADDR_HI_dst_addr_63_32_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_offset = 10 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_RESERVED_DW10 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW10_reserved_dw10_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_offset = 11 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_RESERVED_DW11 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW11_reserved_dw11_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_offset = 12 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_RESERVED_DW12 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW12_reserved_dw12_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_offset = 13 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_RESERVED_DW13 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_mask) << SDMA_AQL_PKT_COPY_LINEAR_RESERVED_DW13_reserved_dw13_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_offset = 14 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_COMPLETION_SIGNAL_31_0 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask) << SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift) # type: ignore +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_offset = 15 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift = 0 +SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32 = lambda x: (((x) & SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_COPY_LINEAR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_mask = 0x000000FF +SDMA_AQL_PKT_BARRIER_OR_HEADER_format_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_FORMAT = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_format_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_format_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_mask = 0x00000001 +SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_shift = 8 +SDMA_AQL_PKT_BARRIER_OR_HEADER_BARRIER = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_barrier_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_shift = 9 +SDMA_AQL_PKT_BARRIER_OR_HEADER_ACQUIRE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_acquire_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_mask = 0x00000003 +SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_shift = 11 +SDMA_AQL_PKT_BARRIER_OR_HEADER_RELEASE_FENCE_SCOPE = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_release_fence_scope_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_shift = 13 +SDMA_AQL_PKT_BARRIER_OR_HEADER_RESERVED = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_reserved_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_mask = 0x0000000F +SDMA_AQL_PKT_BARRIER_OR_HEADER_op_shift = 16 +SDMA_AQL_PKT_BARRIER_OR_HEADER_OP = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_op_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_op_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_shift = 20 +SDMA_AQL_PKT_BARRIER_OR_HEADER_SUBOP = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_subop_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_HEADER_cpv_offset = 0 +SDMA_AQL_PKT_BARRIER_OR_HEADER_cpv_mask = 0x00000001 +SDMA_AQL_PKT_BARRIER_OR_HEADER_cpv_shift = 28 +SDMA_AQL_PKT_BARRIER_OR_HEADER_CPV = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_HEADER_cpv_mask) << SDMA_AQL_PKT_BARRIER_OR_HEADER_cpv_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_offset = 1 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_RESERVED_DW1 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_mask) << SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW1_reserved_dw1_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_offset = 2 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_DEPENDENT_ADDR_0_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_LO_dependent_addr_0_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_offset = 3 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_DEPENDENT_ADDR_0_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_0_HI_dependent_addr_0_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_offset = 4 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_DEPENDENT_ADDR_1_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_LO_dependent_addr_1_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_offset = 5 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_DEPENDENT_ADDR_1_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_1_HI_dependent_addr_1_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_offset = 6 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_DEPENDENT_ADDR_2_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_LO_dependent_addr_2_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_offset = 7 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_DEPENDENT_ADDR_2_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_2_HI_dependent_addr_2_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_offset = 8 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_DEPENDENT_ADDR_3_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_LO_dependent_addr_3_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_offset = 9 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_DEPENDENT_ADDR_3_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_3_HI_dependent_addr_3_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_offset = 10 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_DEPENDENT_ADDR_4_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_LO_dependent_addr_4_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_offset = 11 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_DEPENDENT_ADDR_4_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_DEPENDENT_ADDR_4_HI_dependent_addr_4_63_32_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy0_offset = 12 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy0_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_CACHE_POLICY0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy0_mask) << SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy1_offset = 12 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy1_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy1_shift = 5 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_CACHE_POLICY1 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy1_mask) << SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy1_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy2_offset = 12 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy2_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy2_shift = 10 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_CACHE_POLICY2 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy2_mask) << SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy2_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy3_offset = 12 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy3_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy3_shift = 15 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_CACHE_POLICY3 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy3_mask) << SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy3_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy4_offset = 12 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy4_mask = 0x00000007 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy4_shift = 20 +SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_CACHE_POLICY4 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy4_mask) << SDMA_AQL_PKT_BARRIER_OR_CACHE_POLICY_cache_policy4_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_offset = 13 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_RESERVED_DW13 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_mask) << SDMA_AQL_PKT_BARRIER_OR_RESERVED_DW13_reserved_dw13_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_offset = 14 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_COMPLETION_SIGNAL_31_0 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_LO_completion_signal_31_0_shift) # type: ignore +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_offset = 15 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask = 0xFFFFFFFF +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift = 0 +SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_COMPLETION_SIGNAL_63_32 = lambda x: (((x) & SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_mask) << SDMA_AQL_PKT_BARRIER_OR_COMPLETION_SIGNAL_HI_completion_signal_63_32_shift) # type: ignore \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_0.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_0.py new file mode 100644 index 000000000..4ca7aad9c --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_0.py @@ -0,0 +1,1225 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +FEATURE_PWR_DOMAIN_e: dict[int, str] = {(FEATURE_PWR_ALL:=0): 'FEATURE_PWR_ALL', (FEATURE_PWR_S5:=1): 'FEATURE_PWR_S5', (FEATURE_PWR_BACO:=2): 'FEATURE_PWR_BACO', (FEATURE_PWR_SOC:=3): 'FEATURE_PWR_SOC', (FEATURE_PWR_GFX:=4): 'FEATURE_PWR_GFX', (FEATURE_PWR_DOMAIN_COUNT:=5): 'FEATURE_PWR_DOMAIN_COUNT'} +SVI_PSI_e: dict[int, str] = {(SVI_PSI_0:=0): 'SVI_PSI_0', (SVI_PSI_1:=1): 'SVI_PSI_1', (SVI_PSI_2:=2): 'SVI_PSI_2', (SVI_PSI_3:=3): 'SVI_PSI_3', (SVI_PSI_4:=4): 'SVI_PSI_4', (SVI_PSI_5:=5): 'SVI_PSI_5', (SVI_PSI_6:=6): 'SVI_PSI_6', (SVI_PSI_7:=7): 'SVI_PSI_7'} +SMARTSHIFT_VERSION_e: dict[int, str] = {(SMARTSHIFT_VERSION_1:=0): 'SMARTSHIFT_VERSION_1', (SMARTSHIFT_VERSION_2:=1): 'SMARTSHIFT_VERSION_2', (SMARTSHIFT_VERSION_3:=2): 'SMARTSHIFT_VERSION_3'} +FOPT_CALC_e: dict[int, str] = {(FOPT_CALC_AC_CALC_DC:=0): 'FOPT_CALC_AC_CALC_DC', (FOPT_PPTABLE_AC_CALC_DC:=1): 'FOPT_PPTABLE_AC_CALC_DC', (FOPT_CALC_AC_PPTABLE_DC:=2): 'FOPT_CALC_AC_PPTABLE_DC', (FOPT_PPTABLE_AC_PPTABLE_DC:=3): 'FOPT_PPTABLE_AC_PPTABLE_DC'} +DRAM_BIT_WIDTH_TYPE_e: dict[int, str] = {(DRAM_BIT_WIDTH_DISABLED:=0): 'DRAM_BIT_WIDTH_DISABLED', (DRAM_BIT_WIDTH_X_8:=8): 'DRAM_BIT_WIDTH_X_8', (DRAM_BIT_WIDTH_X_16:=16): 'DRAM_BIT_WIDTH_X_16', (DRAM_BIT_WIDTH_X_32:=32): 'DRAM_BIT_WIDTH_X_32', (DRAM_BIT_WIDTH_X_64:=64): 'DRAM_BIT_WIDTH_X_64', (DRAM_BIT_WIDTH_X_128:=128): 'DRAM_BIT_WIDTH_X_128', (DRAM_BIT_WIDTH_COUNT:=129): 'DRAM_BIT_WIDTH_COUNT'} +I2cControllerPort_e: dict[int, str] = {(I2C_CONTROLLER_PORT_0:=0): 'I2C_CONTROLLER_PORT_0', (I2C_CONTROLLER_PORT_1:=1): 'I2C_CONTROLLER_PORT_1', (I2C_CONTROLLER_PORT_COUNT:=2): 'I2C_CONTROLLER_PORT_COUNT'} +I2cControllerName_e: dict[int, str] = {(I2C_CONTROLLER_NAME_VR_GFX:=0): 'I2C_CONTROLLER_NAME_VR_GFX', (I2C_CONTROLLER_NAME_VR_SOC:=1): 'I2C_CONTROLLER_NAME_VR_SOC', (I2C_CONTROLLER_NAME_VR_VMEMP:=2): 'I2C_CONTROLLER_NAME_VR_VMEMP', (I2C_CONTROLLER_NAME_VR_VDDIO:=3): 'I2C_CONTROLLER_NAME_VR_VDDIO', (I2C_CONTROLLER_NAME_LIQUID0:=4): 'I2C_CONTROLLER_NAME_LIQUID0', (I2C_CONTROLLER_NAME_LIQUID1:=5): 'I2C_CONTROLLER_NAME_LIQUID1', (I2C_CONTROLLER_NAME_PLX:=6): 'I2C_CONTROLLER_NAME_PLX', (I2C_CONTROLLER_NAME_FAN_INTAKE:=7): 'I2C_CONTROLLER_NAME_FAN_INTAKE', (I2C_CONTROLLER_NAME_COUNT:=8): 'I2C_CONTROLLER_NAME_COUNT'} +I2cControllerThrottler_e: dict[int, str] = {(I2C_CONTROLLER_THROTTLER_TYPE_NONE:=0): 'I2C_CONTROLLER_THROTTLER_TYPE_NONE', (I2C_CONTROLLER_THROTTLER_VR_GFX:=1): 'I2C_CONTROLLER_THROTTLER_VR_GFX', (I2C_CONTROLLER_THROTTLER_VR_SOC:=2): 'I2C_CONTROLLER_THROTTLER_VR_SOC', (I2C_CONTROLLER_THROTTLER_VR_VMEMP:=3): 'I2C_CONTROLLER_THROTTLER_VR_VMEMP', (I2C_CONTROLLER_THROTTLER_VR_VDDIO:=4): 'I2C_CONTROLLER_THROTTLER_VR_VDDIO', (I2C_CONTROLLER_THROTTLER_LIQUID0:=5): 'I2C_CONTROLLER_THROTTLER_LIQUID0', (I2C_CONTROLLER_THROTTLER_LIQUID1:=6): 'I2C_CONTROLLER_THROTTLER_LIQUID1', (I2C_CONTROLLER_THROTTLER_PLX:=7): 'I2C_CONTROLLER_THROTTLER_PLX', (I2C_CONTROLLER_THROTTLER_FAN_INTAKE:=8): 'I2C_CONTROLLER_THROTTLER_FAN_INTAKE', (I2C_CONTROLLER_THROTTLER_INA3221:=9): 'I2C_CONTROLLER_THROTTLER_INA3221', (I2C_CONTROLLER_THROTTLER_COUNT:=10): 'I2C_CONTROLLER_THROTTLER_COUNT'} +I2cControllerProtocol_e: dict[int, str] = {(I2C_CONTROLLER_PROTOCOL_VR_XPDE132G5:=0): 'I2C_CONTROLLER_PROTOCOL_VR_XPDE132G5', (I2C_CONTROLLER_PROTOCOL_VR_IR35217:=1): 'I2C_CONTROLLER_PROTOCOL_VR_IR35217', (I2C_CONTROLLER_PROTOCOL_TMP_MAX31875:=2): 'I2C_CONTROLLER_PROTOCOL_TMP_MAX31875', (I2C_CONTROLLER_PROTOCOL_INA3221:=3): 'I2C_CONTROLLER_PROTOCOL_INA3221', (I2C_CONTROLLER_PROTOCOL_TMP_MAX6604:=4): 'I2C_CONTROLLER_PROTOCOL_TMP_MAX6604', (I2C_CONTROLLER_PROTOCOL_COUNT:=5): 'I2C_CONTROLLER_PROTOCOL_COUNT'} +@c.record +class I2cControllerConfig_t(c.Struct): + SIZE = 8 + Enabled: int + Speed: int + SlaveAddress: int + ControllerPort: int + ControllerName: int + ThermalThrotter: int + I2cProtocol: int + PaddingConfig: int +uint8_t: TypeAlias = ctypes.c_ubyte +I2cControllerConfig_t.register_fields([('Enabled', uint8_t, 0), ('Speed', uint8_t, 1), ('SlaveAddress', uint8_t, 2), ('ControllerPort', uint8_t, 3), ('ControllerName', uint8_t, 4), ('ThermalThrotter', uint8_t, 5), ('I2cProtocol', uint8_t, 6), ('PaddingConfig', uint8_t, 7)]) +I2cPort_e: dict[int, str] = {(I2C_PORT_SVD_SCL:=0): 'I2C_PORT_SVD_SCL', (I2C_PORT_GPIO:=1): 'I2C_PORT_GPIO'} +I2cSpeed_e: dict[int, str] = {(I2C_SPEED_FAST_50K:=0): 'I2C_SPEED_FAST_50K', (I2C_SPEED_FAST_100K:=1): 'I2C_SPEED_FAST_100K', (I2C_SPEED_FAST_400K:=2): 'I2C_SPEED_FAST_400K', (I2C_SPEED_FAST_PLUS_1M:=3): 'I2C_SPEED_FAST_PLUS_1M', (I2C_SPEED_HIGH_1M:=4): 'I2C_SPEED_HIGH_1M', (I2C_SPEED_HIGH_2M:=5): 'I2C_SPEED_HIGH_2M', (I2C_SPEED_COUNT:=6): 'I2C_SPEED_COUNT'} +I2cCmdType_e: dict[int, str] = {(I2C_CMD_READ:=0): 'I2C_CMD_READ', (I2C_CMD_WRITE:=1): 'I2C_CMD_WRITE', (I2C_CMD_COUNT:=2): 'I2C_CMD_COUNT'} +@c.record +class SwI2cCmd_t(c.Struct): + SIZE = 2 + ReadWriteData: int + CmdConfig: int +SwI2cCmd_t.register_fields([('ReadWriteData', uint8_t, 0), ('CmdConfig', uint8_t, 1)]) +@c.record +class SwI2cRequest_t(c.Struct): + SIZE = 52 + I2CcontrollerPort: int + I2CSpeed: int + SlaveAddress: int + NumCmds: int + SwI2cCmds: c.Array[SwI2cCmd_t, Literal[24]] +SwI2cRequest_t.register_fields([('I2CcontrollerPort', uint8_t, 0), ('I2CSpeed', uint8_t, 1), ('SlaveAddress', uint8_t, 2), ('NumCmds', uint8_t, 3), ('SwI2cCmds', c.Array[SwI2cCmd_t, Literal[24]], 4)]) +@c.record +class SwI2cRequestExternal_t(c.Struct): + SIZE = 116 + SwI2cRequest: SwI2cRequest_t + Spare: c.Array[ctypes.c_uint32, Literal[8]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +uint32_t: TypeAlias = ctypes.c_uint32 +SwI2cRequestExternal_t.register_fields([('SwI2cRequest', SwI2cRequest_t, 0), ('Spare', c.Array[uint32_t, Literal[8]], 52), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 84)]) +@c.record +class EccInfo_t(c.Struct): + SIZE = 24 + mca_umc_status: int + mca_umc_addr: int + ce_count_lo_chip: int + ce_count_hi_chip: int + eccPadding: int +uint64_t: TypeAlias = ctypes.c_uint64 +uint16_t: TypeAlias = ctypes.c_uint16 +EccInfo_t.register_fields([('mca_umc_status', uint64_t, 0), ('mca_umc_addr', uint64_t, 8), ('ce_count_lo_chip', uint16_t, 16), ('ce_count_hi_chip', uint16_t, 18), ('eccPadding', uint32_t, 20)]) +@c.record +class EccInfoTable_t(c.Struct): + SIZE = 576 + EccInfo: c.Array[EccInfo_t, Literal[24]] +EccInfoTable_t.register_fields([('EccInfo', c.Array[EccInfo_t, Literal[24]], 0)]) +D3HOTSequence_e: dict[int, str] = {(BACO_SEQUENCE:=0): 'BACO_SEQUENCE', (MSR_SEQUENCE:=1): 'MSR_SEQUENCE', (BAMACO_SEQUENCE:=2): 'BAMACO_SEQUENCE', (ULPS_SEQUENCE:=3): 'ULPS_SEQUENCE', (D3HOT_SEQUENCE_COUNT:=4): 'D3HOT_SEQUENCE_COUNT'} +PowerGatingMode_e: dict[int, str] = {(PG_DYNAMIC_MODE:=0): 'PG_DYNAMIC_MODE', (PG_STATIC_MODE:=1): 'PG_STATIC_MODE'} +PowerGatingSettings_e: dict[int, str] = {(PG_POWER_DOWN:=0): 'PG_POWER_DOWN', (PG_POWER_UP:=1): 'PG_POWER_UP'} +@c.record +class QuadraticInt_t(c.Struct): + SIZE = 12 + a: int + b: int + c: int +QuadraticInt_t.register_fields([('a', uint32_t, 0), ('b', uint32_t, 4), ('c', uint32_t, 8)]) +@c.record +class LinearInt_t(c.Struct): + SIZE = 8 + m: int + b: int +LinearInt_t.register_fields([('m', uint32_t, 0), ('b', uint32_t, 4)]) +@c.record +class DroopInt_t(c.Struct): + SIZE = 12 + a: int + b: int + c: int +DroopInt_t.register_fields([('a', uint32_t, 0), ('b', uint32_t, 4), ('c', uint32_t, 8)]) +DCS_ARCH_e: dict[int, str] = {(DCS_ARCH_DISABLED:=0): 'DCS_ARCH_DISABLED', (DCS_ARCH_FADCS:=1): 'DCS_ARCH_FADCS', (DCS_ARCH_ASYNC:=2): 'DCS_ARCH_ASYNC'} +PPCLK_e: dict[int, str] = {(PPCLK_GFXCLK:=0): 'PPCLK_GFXCLK', (PPCLK_SOCCLK:=1): 'PPCLK_SOCCLK', (PPCLK_UCLK:=2): 'PPCLK_UCLK', (PPCLK_FCLK:=3): 'PPCLK_FCLK', (PPCLK_DCLK_0:=4): 'PPCLK_DCLK_0', (PPCLK_VCLK_0:=5): 'PPCLK_VCLK_0', (PPCLK_DCLK_1:=6): 'PPCLK_DCLK_1', (PPCLK_VCLK_1:=7): 'PPCLK_VCLK_1', (PPCLK_DISPCLK:=8): 'PPCLK_DISPCLK', (PPCLK_DPPCLK:=9): 'PPCLK_DPPCLK', (PPCLK_DPREFCLK:=10): 'PPCLK_DPREFCLK', (PPCLK_DCFCLK:=11): 'PPCLK_DCFCLK', (PPCLK_DTBCLK:=12): 'PPCLK_DTBCLK', (PPCLK_COUNT:=13): 'PPCLK_COUNT'} +VOLTAGE_MODE_e: dict[int, str] = {(VOLTAGE_MODE_PPTABLE:=0): 'VOLTAGE_MODE_PPTABLE', (VOLTAGE_MODE_FUSES:=1): 'VOLTAGE_MODE_FUSES', (VOLTAGE_MODE_COUNT:=2): 'VOLTAGE_MODE_COUNT'} +AVFS_VOLTAGE_TYPE_e: dict[int, str] = {(AVFS_VOLTAGE_GFX:=0): 'AVFS_VOLTAGE_GFX', (AVFS_VOLTAGE_SOC:=1): 'AVFS_VOLTAGE_SOC', (AVFS_VOLTAGE_COUNT:=2): 'AVFS_VOLTAGE_COUNT'} +AVFS_TEMP_e: dict[int, str] = {(AVFS_TEMP_COLD:=0): 'AVFS_TEMP_COLD', (AVFS_TEMP_HOT:=1): 'AVFS_TEMP_HOT', (AVFS_TEMP_COUNT:=2): 'AVFS_TEMP_COUNT'} +AVFS_D_e: dict[int, str] = {(AVFS_D_G:=0): 'AVFS_D_G', (AVFS_D_M_B:=1): 'AVFS_D_M_B', (AVFS_D_M_S:=2): 'AVFS_D_M_S', (AVFS_D_COUNT:=3): 'AVFS_D_COUNT'} +UCLK_DIV_e: dict[int, str] = {(UCLK_DIV_BY_1:=0): 'UCLK_DIV_BY_1', (UCLK_DIV_BY_2:=1): 'UCLK_DIV_BY_2', (UCLK_DIV_BY_4:=2): 'UCLK_DIV_BY_4', (UCLK_DIV_BY_8:=3): 'UCLK_DIV_BY_8'} +GpioIntPolarity_e: dict[int, str] = {(GPIO_INT_POLARITY_ACTIVE_LOW:=0): 'GPIO_INT_POLARITY_ACTIVE_LOW', (GPIO_INT_POLARITY_ACTIVE_HIGH:=1): 'GPIO_INT_POLARITY_ACTIVE_HIGH'} +PwrConfig_e: dict[int, str] = {(PWR_CONFIG_TDP:=0): 'PWR_CONFIG_TDP', (PWR_CONFIG_TGP:=1): 'PWR_CONFIG_TGP', (PWR_CONFIG_TCP_ESTIMATED:=2): 'PWR_CONFIG_TCP_ESTIMATED', (PWR_CONFIG_TCP_MEASURED:=3): 'PWR_CONFIG_TCP_MEASURED'} +@c.record +class DpmDescriptor_t(c.Struct): + SIZE = 32 + Padding: int + SnapToDiscrete: int + NumDiscreteLevels: int + CalculateFopt: int + ConversionToAvfsClk: LinearInt_t + Padding3: c.Array[ctypes.c_uint32, Literal[3]] + Padding4: int + FoptimalDc: int + FoptimalAc: int + Padding2: int +DpmDescriptor_t.register_fields([('Padding', uint8_t, 0), ('SnapToDiscrete', uint8_t, 1), ('NumDiscreteLevels', uint8_t, 2), ('CalculateFopt', uint8_t, 3), ('ConversionToAvfsClk', LinearInt_t, 4), ('Padding3', c.Array[uint32_t, Literal[3]], 12), ('Padding4', uint16_t, 24), ('FoptimalDc', uint16_t, 26), ('FoptimalAc', uint16_t, 28), ('Padding2', uint16_t, 30)]) +PPT_THROTTLER_e: dict[int, str] = {(PPT_THROTTLER_PPT0:=0): 'PPT_THROTTLER_PPT0', (PPT_THROTTLER_PPT1:=1): 'PPT_THROTTLER_PPT1', (PPT_THROTTLER_PPT2:=2): 'PPT_THROTTLER_PPT2', (PPT_THROTTLER_PPT3:=3): 'PPT_THROTTLER_PPT3', (PPT_THROTTLER_COUNT:=4): 'PPT_THROTTLER_COUNT'} +TEMP_e: dict[int, str] = {(TEMP_EDGE:=0): 'TEMP_EDGE', (TEMP_HOTSPOT:=1): 'TEMP_HOTSPOT', (TEMP_HOTSPOT_G:=2): 'TEMP_HOTSPOT_G', (TEMP_HOTSPOT_M:=3): 'TEMP_HOTSPOT_M', (TEMP_MEM:=4): 'TEMP_MEM', (TEMP_VR_GFX:=5): 'TEMP_VR_GFX', (TEMP_VR_MEM0:=6): 'TEMP_VR_MEM0', (TEMP_VR_MEM1:=7): 'TEMP_VR_MEM1', (TEMP_VR_SOC:=8): 'TEMP_VR_SOC', (TEMP_VR_U:=9): 'TEMP_VR_U', (TEMP_LIQUID0:=10): 'TEMP_LIQUID0', (TEMP_LIQUID1:=11): 'TEMP_LIQUID1', (TEMP_PLX:=12): 'TEMP_PLX', (TEMP_COUNT:=13): 'TEMP_COUNT'} +TDC_THROTTLER_e: dict[int, str] = {(TDC_THROTTLER_GFX:=0): 'TDC_THROTTLER_GFX', (TDC_THROTTLER_SOC:=1): 'TDC_THROTTLER_SOC', (TDC_THROTTLER_U:=2): 'TDC_THROTTLER_U', (TDC_THROTTLER_COUNT:=3): 'TDC_THROTTLER_COUNT'} +SVI_PLANE_e: dict[int, str] = {(SVI_PLANE_GFX:=0): 'SVI_PLANE_GFX', (SVI_PLANE_SOC:=1): 'SVI_PLANE_SOC', (SVI_PLANE_VMEMP:=2): 'SVI_PLANE_VMEMP', (SVI_PLANE_VDDIO_MEM:=3): 'SVI_PLANE_VDDIO_MEM', (SVI_PLANE_U:=4): 'SVI_PLANE_U', (SVI_PLANE_COUNT:=5): 'SVI_PLANE_COUNT'} +PMFW_VOLT_PLANE_e: dict[int, str] = {(PMFW_VOLT_PLANE_GFX:=0): 'PMFW_VOLT_PLANE_GFX', (PMFW_VOLT_PLANE_SOC:=1): 'PMFW_VOLT_PLANE_SOC', (PMFW_VOLT_PLANE_COUNT:=2): 'PMFW_VOLT_PLANE_COUNT'} +CUSTOMER_VARIANT_e: dict[int, str] = {(CUSTOMER_VARIANT_ROW:=0): 'CUSTOMER_VARIANT_ROW', (CUSTOMER_VARIANT_FALCON:=1): 'CUSTOMER_VARIANT_FALCON', (CUSTOMER_VARIANT_COUNT:=2): 'CUSTOMER_VARIANT_COUNT'} +POWER_SOURCE_e: dict[int, str] = {(POWER_SOURCE_AC:=0): 'POWER_SOURCE_AC', (POWER_SOURCE_DC:=1): 'POWER_SOURCE_DC', (POWER_SOURCE_COUNT:=2): 'POWER_SOURCE_COUNT'} +MEM_VENDOR_e: dict[int, str] = {(MEM_VENDOR_PLACEHOLDER0:=0): 'MEM_VENDOR_PLACEHOLDER0', (MEM_VENDOR_SAMSUNG:=1): 'MEM_VENDOR_SAMSUNG', (MEM_VENDOR_INFINEON:=2): 'MEM_VENDOR_INFINEON', (MEM_VENDOR_ELPIDA:=3): 'MEM_VENDOR_ELPIDA', (MEM_VENDOR_ETRON:=4): 'MEM_VENDOR_ETRON', (MEM_VENDOR_NANYA:=5): 'MEM_VENDOR_NANYA', (MEM_VENDOR_HYNIX:=6): 'MEM_VENDOR_HYNIX', (MEM_VENDOR_MOSEL:=7): 'MEM_VENDOR_MOSEL', (MEM_VENDOR_WINBOND:=8): 'MEM_VENDOR_WINBOND', (MEM_VENDOR_ESMT:=9): 'MEM_VENDOR_ESMT', (MEM_VENDOR_PLACEHOLDER1:=10): 'MEM_VENDOR_PLACEHOLDER1', (MEM_VENDOR_PLACEHOLDER2:=11): 'MEM_VENDOR_PLACEHOLDER2', (MEM_VENDOR_PLACEHOLDER3:=12): 'MEM_VENDOR_PLACEHOLDER3', (MEM_VENDOR_PLACEHOLDER4:=13): 'MEM_VENDOR_PLACEHOLDER4', (MEM_VENDOR_PLACEHOLDER5:=14): 'MEM_VENDOR_PLACEHOLDER5', (MEM_VENDOR_MICRON:=15): 'MEM_VENDOR_MICRON', (MEM_VENDOR_COUNT:=16): 'MEM_VENDOR_COUNT'} +PP_GRTAVFS_HW_FUSE_e: dict[int, str] = {(PP_GRTAVFS_HW_CPO_CTL_ZONE0:=0): 'PP_GRTAVFS_HW_CPO_CTL_ZONE0', (PP_GRTAVFS_HW_CPO_CTL_ZONE1:=1): 'PP_GRTAVFS_HW_CPO_CTL_ZONE1', (PP_GRTAVFS_HW_CPO_CTL_ZONE2:=2): 'PP_GRTAVFS_HW_CPO_CTL_ZONE2', (PP_GRTAVFS_HW_CPO_CTL_ZONE3:=3): 'PP_GRTAVFS_HW_CPO_CTL_ZONE3', (PP_GRTAVFS_HW_CPO_CTL_ZONE4:=4): 'PP_GRTAVFS_HW_CPO_CTL_ZONE4', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE0:=5): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE0', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE0:=6): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE0', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE1:=7): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE1', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE1:=8): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE1', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE2:=9): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE2', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE2:=10): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE2', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE3:=11): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE3', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE3:=12): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE3', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE4:=13): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE4', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE4:=14): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE4', (PP_GRTAVFS_HW_ZONE0_VF:=15): 'PP_GRTAVFS_HW_ZONE0_VF', (PP_GRTAVFS_HW_ZONE1_VF1:=16): 'PP_GRTAVFS_HW_ZONE1_VF1', (PP_GRTAVFS_HW_ZONE2_VF2:=17): 'PP_GRTAVFS_HW_ZONE2_VF2', (PP_GRTAVFS_HW_ZONE3_VF3:=18): 'PP_GRTAVFS_HW_ZONE3_VF3', (PP_GRTAVFS_HW_VOLTAGE_GB:=19): 'PP_GRTAVFS_HW_VOLTAGE_GB', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE0:=20): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE0', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE1:=21): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE1', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE2:=22): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE2', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE3:=23): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE3', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE4:=24): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE4', (PP_GRTAVFS_HW_RESERVED_0:=25): 'PP_GRTAVFS_HW_RESERVED_0', (PP_GRTAVFS_HW_RESERVED_1:=26): 'PP_GRTAVFS_HW_RESERVED_1', (PP_GRTAVFS_HW_RESERVED_2:=27): 'PP_GRTAVFS_HW_RESERVED_2', (PP_GRTAVFS_HW_RESERVED_3:=28): 'PP_GRTAVFS_HW_RESERVED_3', (PP_GRTAVFS_HW_RESERVED_4:=29): 'PP_GRTAVFS_HW_RESERVED_4', (PP_GRTAVFS_HW_RESERVED_5:=30): 'PP_GRTAVFS_HW_RESERVED_5', (PP_GRTAVFS_HW_RESERVED_6:=31): 'PP_GRTAVFS_HW_RESERVED_6', (PP_GRTAVFS_HW_FUSE_COUNT:=32): 'PP_GRTAVFS_HW_FUSE_COUNT'} +PP_GRTAVFS_FW_COMMON_FUSE_e: dict[int, str] = {(PP_GRTAVFS_FW_COMMON_PPVMIN_Z1_HOT_T0:=0): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z1_HOT_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z1_COLD_T0:=1): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z1_COLD_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z2_HOT_T0:=2): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z2_HOT_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z2_COLD_T0:=3): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z2_COLD_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z3_HOT_T0:=4): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z3_HOT_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z3_COLD_T0:=5): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z3_COLD_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z4_HOT_T0:=6): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z4_HOT_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z4_COLD_T0:=7): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z4_COLD_T0', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z0:=8): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z0', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z1:=9): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z1', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z2:=10): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z2', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z3:=11): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z3', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z4:=12): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z4', (PP_GRTAVFS_FW_COMMON_FUSE_COUNT:=13): 'PP_GRTAVFS_FW_COMMON_FUSE_COUNT'} +PP_GRTAVFS_FW_SEP_FUSE_e: dict[int, str] = {(PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_NEG_1:=0): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_NEG_1', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_0:=1): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_0', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_1:=2): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_1', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_2:=3): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_2', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_3:=4): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_3', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_4:=5): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_4', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_NEG_1:=6): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_NEG_1', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_0:=7): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_0', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_1:=8): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_1', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_2:=9): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_2', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_3:=10): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_3', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_4:=11): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_4', (PP_GRTAVFS_FW_SEP_FUSE_VF_NEG_1_FREQUENCY:=12): 'PP_GRTAVFS_FW_SEP_FUSE_VF_NEG_1_FREQUENCY', (PP_GRTAVFS_FW_SEP_FUSE_VF4_FREQUENCY:=13): 'PP_GRTAVFS_FW_SEP_FUSE_VF4_FREQUENCY', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_0:=14): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_0', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_1:=15): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_1', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_2:=16): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_2', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_3:=17): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_3', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_4:=18): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_4', (PP_GRTAVFS_FW_SEP_FUSE_COUNT:=19): 'PP_GRTAVFS_FW_SEP_FUSE_COUNT'} +@c.record +class SviTelemetryScale_t(c.Struct): + SIZE = 4 + Offset: int + Padding: int + MaxCurrent: int +int8_t: TypeAlias = ctypes.c_byte +SviTelemetryScale_t.register_fields([('Offset', int8_t, 0), ('Padding', uint8_t, 1), ('MaxCurrent', uint16_t, 2)]) +FanMode_e: dict[int, str] = {(FAN_MODE_AUTO:=0): 'FAN_MODE_AUTO', (FAN_MODE_MANUAL_LINEAR:=1): 'FAN_MODE_MANUAL_LINEAR'} +@c.record +class OverDriveTable_t(c.Struct): + SIZE = 140 + FeatureCtrlMask: int + VoltageOffsetPerZoneBoundary: c.Array[ctypes.c_int16, Literal[6]] + Reserved: int + GfxclkFmin: int + GfxclkFmax: int + UclkFmin: int + UclkFmax: int + Ppt: int + Tdc: int + FanLinearPwmPoints: c.Array[ctypes.c_ubyte, Literal[6]] + FanLinearTempPoints: c.Array[ctypes.c_ubyte, Literal[6]] + FanMinimumPwm: int + AcousticTargetRpmThreshold: int + AcousticLimitRpmThreshold: int + FanTargetTemperature: int + FanZeroRpmEnable: int + FanZeroRpmStopTemp: int + FanMode: int + MaxOpTemp: int + Spare: c.Array[ctypes.c_uint32, Literal[13]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +int16_t: TypeAlias = ctypes.c_int16 +OverDriveTable_t.register_fields([('FeatureCtrlMask', uint32_t, 0), ('VoltageOffsetPerZoneBoundary', c.Array[int16_t, Literal[6]], 4), ('Reserved', uint32_t, 16), ('GfxclkFmin', int16_t, 20), ('GfxclkFmax', int16_t, 22), ('UclkFmin', uint16_t, 24), ('UclkFmax', uint16_t, 26), ('Ppt', int16_t, 28), ('Tdc', int16_t, 30), ('FanLinearPwmPoints', c.Array[uint8_t, Literal[6]], 32), ('FanLinearTempPoints', c.Array[uint8_t, Literal[6]], 38), ('FanMinimumPwm', uint16_t, 44), ('AcousticTargetRpmThreshold', uint16_t, 46), ('AcousticLimitRpmThreshold', uint16_t, 48), ('FanTargetTemperature', uint16_t, 50), ('FanZeroRpmEnable', uint8_t, 52), ('FanZeroRpmStopTemp', uint8_t, 53), ('FanMode', uint8_t, 54), ('MaxOpTemp', uint8_t, 55), ('Spare', c.Array[uint32_t, Literal[13]], 56), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 108)]) +@c.record +class OverDriveTableExternal_t(c.Struct): + SIZE = 140 + OverDriveTable: OverDriveTable_t +OverDriveTableExternal_t.register_fields([('OverDriveTable', OverDriveTable_t, 0)]) +@c.record +class OverDriveLimits_t(c.Struct): + SIZE = 88 + FeatureCtrlMask: int + VoltageOffsetPerZoneBoundary: int + Reserved1: int + Reserved2: int + GfxclkFmin: int + GfxclkFmax: int + UclkFmin: int + UclkFmax: int + Ppt: int + Tdc: int + FanLinearPwmPoints: int + FanLinearTempPoints: int + FanMinimumPwm: int + AcousticTargetRpmThreshold: int + AcousticLimitRpmThreshold: int + FanTargetTemperature: int + FanZeroRpmEnable: int + FanZeroRpmStopTemp: int + FanMode: int + MaxOpTemp: int + Spare: c.Array[ctypes.c_uint32, Literal[13]] +OverDriveLimits_t.register_fields([('FeatureCtrlMask', uint32_t, 0), ('VoltageOffsetPerZoneBoundary', int16_t, 4), ('Reserved1', uint16_t, 6), ('Reserved2', uint16_t, 8), ('GfxclkFmin', int16_t, 10), ('GfxclkFmax', int16_t, 12), ('UclkFmin', uint16_t, 14), ('UclkFmax', uint16_t, 16), ('Ppt', int16_t, 18), ('Tdc', int16_t, 20), ('FanLinearPwmPoints', uint8_t, 22), ('FanLinearTempPoints', uint8_t, 23), ('FanMinimumPwm', uint16_t, 24), ('AcousticTargetRpmThreshold', uint16_t, 26), ('AcousticLimitRpmThreshold', uint16_t, 28), ('FanTargetTemperature', uint16_t, 30), ('FanZeroRpmEnable', uint8_t, 32), ('FanZeroRpmStopTemp', uint8_t, 33), ('FanMode', uint8_t, 34), ('MaxOpTemp', uint8_t, 35), ('Spare', c.Array[uint32_t, Literal[13]], 36)]) +BOARD_GPIO_TYPE_e: dict[int, str] = {(BOARD_GPIO_SMUIO_0:=0): 'BOARD_GPIO_SMUIO_0', (BOARD_GPIO_SMUIO_1:=1): 'BOARD_GPIO_SMUIO_1', (BOARD_GPIO_SMUIO_2:=2): 'BOARD_GPIO_SMUIO_2', (BOARD_GPIO_SMUIO_3:=3): 'BOARD_GPIO_SMUIO_3', (BOARD_GPIO_SMUIO_4:=4): 'BOARD_GPIO_SMUIO_4', (BOARD_GPIO_SMUIO_5:=5): 'BOARD_GPIO_SMUIO_5', (BOARD_GPIO_SMUIO_6:=6): 'BOARD_GPIO_SMUIO_6', (BOARD_GPIO_SMUIO_7:=7): 'BOARD_GPIO_SMUIO_7', (BOARD_GPIO_SMUIO_8:=8): 'BOARD_GPIO_SMUIO_8', (BOARD_GPIO_SMUIO_9:=9): 'BOARD_GPIO_SMUIO_9', (BOARD_GPIO_SMUIO_10:=10): 'BOARD_GPIO_SMUIO_10', (BOARD_GPIO_SMUIO_11:=11): 'BOARD_GPIO_SMUIO_11', (BOARD_GPIO_SMUIO_12:=12): 'BOARD_GPIO_SMUIO_12', (BOARD_GPIO_SMUIO_13:=13): 'BOARD_GPIO_SMUIO_13', (BOARD_GPIO_SMUIO_14:=14): 'BOARD_GPIO_SMUIO_14', (BOARD_GPIO_SMUIO_15:=15): 'BOARD_GPIO_SMUIO_15', (BOARD_GPIO_SMUIO_16:=16): 'BOARD_GPIO_SMUIO_16', (BOARD_GPIO_SMUIO_17:=17): 'BOARD_GPIO_SMUIO_17', (BOARD_GPIO_SMUIO_18:=18): 'BOARD_GPIO_SMUIO_18', (BOARD_GPIO_SMUIO_19:=19): 'BOARD_GPIO_SMUIO_19', (BOARD_GPIO_SMUIO_20:=20): 'BOARD_GPIO_SMUIO_20', (BOARD_GPIO_SMUIO_21:=21): 'BOARD_GPIO_SMUIO_21', (BOARD_GPIO_SMUIO_22:=22): 'BOARD_GPIO_SMUIO_22', (BOARD_GPIO_SMUIO_23:=23): 'BOARD_GPIO_SMUIO_23', (BOARD_GPIO_SMUIO_24:=24): 'BOARD_GPIO_SMUIO_24', (BOARD_GPIO_SMUIO_25:=25): 'BOARD_GPIO_SMUIO_25', (BOARD_GPIO_SMUIO_26:=26): 'BOARD_GPIO_SMUIO_26', (BOARD_GPIO_SMUIO_27:=27): 'BOARD_GPIO_SMUIO_27', (BOARD_GPIO_SMUIO_28:=28): 'BOARD_GPIO_SMUIO_28', (BOARD_GPIO_SMUIO_29:=29): 'BOARD_GPIO_SMUIO_29', (BOARD_GPIO_SMUIO_30:=30): 'BOARD_GPIO_SMUIO_30', (BOARD_GPIO_SMUIO_31:=31): 'BOARD_GPIO_SMUIO_31', (MAX_BOARD_GPIO_SMUIO_NUM:=32): 'MAX_BOARD_GPIO_SMUIO_NUM', (BOARD_GPIO_DC_GEN_A:=33): 'BOARD_GPIO_DC_GEN_A', (BOARD_GPIO_DC_GEN_B:=34): 'BOARD_GPIO_DC_GEN_B', (BOARD_GPIO_DC_GEN_C:=35): 'BOARD_GPIO_DC_GEN_C', (BOARD_GPIO_DC_GEN_D:=36): 'BOARD_GPIO_DC_GEN_D', (BOARD_GPIO_DC_GEN_E:=37): 'BOARD_GPIO_DC_GEN_E', (BOARD_GPIO_DC_GEN_F:=38): 'BOARD_GPIO_DC_GEN_F', (BOARD_GPIO_DC_GEN_G:=39): 'BOARD_GPIO_DC_GEN_G', (BOARD_GPIO_DC_GENLK_CLK:=40): 'BOARD_GPIO_DC_GENLK_CLK', (BOARD_GPIO_DC_GENLK_VSYNC:=41): 'BOARD_GPIO_DC_GENLK_VSYNC', (BOARD_GPIO_DC_SWAPLOCK_A:=42): 'BOARD_GPIO_DC_SWAPLOCK_A', (BOARD_GPIO_DC_SWAPLOCK_B:=43): 'BOARD_GPIO_DC_SWAPLOCK_B'} +@c.record +class BootValues_t(c.Struct): + SIZE = 112 + InitGfxclk_bypass: int + InitSocclk: int + InitMp0clk: int + InitMpioclk: int + InitSmnclk: int + InitUcpclk: int + InitCsrclk: int + InitDprefclk: int + InitDcfclk: int + InitDtbclk: int + InitDclk: int + InitVclk: int + InitUsbdfsclk: int + InitMp1clk: int + InitLclk: int + InitBaco400clk_bypass: int + InitBaco1200clk_bypass: int + InitBaco700clk_bypass: int + InitFclk: int + InitGfxclk_clkb: int + InitUclkDPMState: int + Padding: c.Array[ctypes.c_ubyte, Literal[3]] + InitVcoFreqPll0: int + InitVcoFreqPll1: int + InitVcoFreqPll2: int + InitVcoFreqPll3: int + InitVcoFreqPll4: int + InitVcoFreqPll5: int + InitVcoFreqPll6: int + InitGfx: int + InitSoc: int + InitU: int + Padding2: int + Spare: c.Array[ctypes.c_uint32, Literal[8]] +BootValues_t.register_fields([('InitGfxclk_bypass', uint16_t, 0), ('InitSocclk', uint16_t, 2), ('InitMp0clk', uint16_t, 4), ('InitMpioclk', uint16_t, 6), ('InitSmnclk', uint16_t, 8), ('InitUcpclk', uint16_t, 10), ('InitCsrclk', uint16_t, 12), ('InitDprefclk', uint16_t, 14), ('InitDcfclk', uint16_t, 16), ('InitDtbclk', uint16_t, 18), ('InitDclk', uint16_t, 20), ('InitVclk', uint16_t, 22), ('InitUsbdfsclk', uint16_t, 24), ('InitMp1clk', uint16_t, 26), ('InitLclk', uint16_t, 28), ('InitBaco400clk_bypass', uint16_t, 30), ('InitBaco1200clk_bypass', uint16_t, 32), ('InitBaco700clk_bypass', uint16_t, 34), ('InitFclk', uint16_t, 36), ('InitGfxclk_clkb', uint16_t, 38), ('InitUclkDPMState', uint8_t, 40), ('Padding', c.Array[uint8_t, Literal[3]], 41), ('InitVcoFreqPll0', uint32_t, 44), ('InitVcoFreqPll1', uint32_t, 48), ('InitVcoFreqPll2', uint32_t, 52), ('InitVcoFreqPll3', uint32_t, 56), ('InitVcoFreqPll4', uint32_t, 60), ('InitVcoFreqPll5', uint32_t, 64), ('InitVcoFreqPll6', uint32_t, 68), ('InitGfx', uint16_t, 72), ('InitSoc', uint16_t, 74), ('InitU', uint16_t, 76), ('Padding2', uint16_t, 78), ('Spare', c.Array[uint32_t, Literal[8]], 80)]) +@c.record +class MsgLimits_t(c.Struct): + SIZE = 120 + Power: c.Array[c.Array[ctypes.c_uint16, Literal[2]], Literal[4]] + Tdc: c.Array[ctypes.c_uint16, Literal[3]] + Temperature: c.Array[ctypes.c_uint16, Literal[13]] + PwmLimitMin: int + PwmLimitMax: int + FanTargetTemperature: int + Spare1: c.Array[ctypes.c_ubyte, Literal[1]] + AcousticTargetRpmThresholdMin: int + AcousticTargetRpmThresholdMax: int + AcousticLimitRpmThresholdMin: int + AcousticLimitRpmThresholdMax: int + PccLimitMin: int + PccLimitMax: int + FanStopTempMin: int + FanStopTempMax: int + FanStartTempMin: int + FanStartTempMax: int + PowerMinPpt0: c.Array[ctypes.c_uint16, Literal[2]] + Spare: c.Array[ctypes.c_uint32, Literal[11]] +MsgLimits_t.register_fields([('Power', c.Array[c.Array[uint16_t, Literal[2]], Literal[4]], 0), ('Tdc', c.Array[uint16_t, Literal[3]], 16), ('Temperature', c.Array[uint16_t, Literal[13]], 22), ('PwmLimitMin', uint8_t, 48), ('PwmLimitMax', uint8_t, 49), ('FanTargetTemperature', uint8_t, 50), ('Spare1', c.Array[uint8_t, Literal[1]], 51), ('AcousticTargetRpmThresholdMin', uint16_t, 52), ('AcousticTargetRpmThresholdMax', uint16_t, 54), ('AcousticLimitRpmThresholdMin', uint16_t, 56), ('AcousticLimitRpmThresholdMax', uint16_t, 58), ('PccLimitMin', uint16_t, 60), ('PccLimitMax', uint16_t, 62), ('FanStopTempMin', uint16_t, 64), ('FanStopTempMax', uint16_t, 66), ('FanStartTempMin', uint16_t, 68), ('FanStartTempMax', uint16_t, 70), ('PowerMinPpt0', c.Array[uint16_t, Literal[2]], 72), ('Spare', c.Array[uint32_t, Literal[11]], 76)]) +@c.record +class DriverReportedClocks_t(c.Struct): + SIZE = 28 + BaseClockAc: int + GameClockAc: int + BoostClockAc: int + BaseClockDc: int + GameClockDc: int + BoostClockDc: int + Reserved: c.Array[ctypes.c_uint32, Literal[4]] +DriverReportedClocks_t.register_fields([('BaseClockAc', uint16_t, 0), ('GameClockAc', uint16_t, 2), ('BoostClockAc', uint16_t, 4), ('BaseClockDc', uint16_t, 6), ('GameClockDc', uint16_t, 8), ('BoostClockDc', uint16_t, 10), ('Reserved', c.Array[uint32_t, Literal[4]], 12)]) +@c.record +class AvfsDcBtcParams_t(c.Struct): + SIZE = 20 + DcBtcEnabled: int + Padding: c.Array[ctypes.c_ubyte, Literal[3]] + DcTol: int + DcBtcGb: int + DcBtcMin: int + DcBtcMax: int + DcBtcGbScalar: LinearInt_t +AvfsDcBtcParams_t.register_fields([('DcBtcEnabled', uint8_t, 0), ('Padding', c.Array[uint8_t, Literal[3]], 1), ('DcTol', uint16_t, 4), ('DcBtcGb', uint16_t, 6), ('DcBtcMin', uint16_t, 8), ('DcBtcMax', uint16_t, 10), ('DcBtcGbScalar', LinearInt_t, 12)]) +@c.record +class AvfsFuseOverride_t(c.Struct): + SIZE = 56 + AvfsTemp: c.Array[ctypes.c_uint16, Literal[2]] + VftFMin: int + VInversion: int + qVft: c.Array[QuadraticInt_t, Literal[2]] + qAvfsGb: QuadraticInt_t + qAvfsGb2: QuadraticInt_t +AvfsFuseOverride_t.register_fields([('AvfsTemp', c.Array[uint16_t, Literal[2]], 0), ('VftFMin', uint16_t, 4), ('VInversion', uint16_t, 6), ('qVft', c.Array[QuadraticInt_t, Literal[2]], 8), ('qAvfsGb', QuadraticInt_t, 32), ('qAvfsGb2', QuadraticInt_t, 44)]) +@c.record +class SkuTable_t(c.Struct): + SIZE = 3484 + Version: int + FeaturesToRun: c.Array[ctypes.c_uint32, Literal[2]] + TotalPowerConfig: int + CustomerVariant: int + MemoryTemperatureTypeMask: int + SmartShiftVersion: int + SocketPowerLimitAc: c.Array[ctypes.c_uint16, Literal[4]] + SocketPowerLimitDc: c.Array[ctypes.c_uint16, Literal[4]] + SocketPowerLimitSmartShift2: int + EnableLegacyPptLimit: int + UseInputTelemetry: int + SmartShiftMinReportedPptinDcs: int + PaddingPpt: c.Array[ctypes.c_ubyte, Literal[1]] + VrTdcLimit: c.Array[ctypes.c_uint16, Literal[3]] + PlatformTdcLimit: c.Array[ctypes.c_uint16, Literal[3]] + TemperatureLimit: c.Array[ctypes.c_uint16, Literal[13]] + HwCtfTempLimit: int + PaddingInfra: int + FitControllerFailureRateLimit: int + FitControllerGfxDutyCycle: int + FitControllerSocDutyCycle: int + FitControllerSocOffset: int + GfxApccPlusResidencyLimit: int + ThrottlerControlMask: int + FwDStateMask: int + UlvVoltageOffset: c.Array[ctypes.c_uint16, Literal[2]] + UlvVoltageOffsetU: int + DeepUlvVoltageOffsetSoc: int + DefaultMaxVoltage: c.Array[ctypes.c_uint16, Literal[2]] + BoostMaxVoltage: c.Array[ctypes.c_uint16, Literal[2]] + VminTempHystersis: c.Array[ctypes.c_int16, Literal[2]] + VminTempThreshold: c.Array[ctypes.c_int16, Literal[2]] + Vmin_Hot_T0: c.Array[ctypes.c_uint16, Literal[2]] + Vmin_Cold_T0: c.Array[ctypes.c_uint16, Literal[2]] + Vmin_Hot_Eol: c.Array[ctypes.c_uint16, Literal[2]] + Vmin_Cold_Eol: c.Array[ctypes.c_uint16, Literal[2]] + Vmin_Aging_Offset: c.Array[ctypes.c_uint16, Literal[2]] + Spare_Vmin_Plat_Offset_Hot: c.Array[ctypes.c_uint16, Literal[2]] + Spare_Vmin_Plat_Offset_Cold: c.Array[ctypes.c_uint16, Literal[2]] + VcBtcFixedVminAgingOffset: c.Array[ctypes.c_uint16, Literal[2]] + VcBtcVmin2PsmDegrationGb: c.Array[ctypes.c_uint16, Literal[2]] + VcBtcPsmA: c.Array[ctypes.c_uint32, Literal[2]] + VcBtcPsmB: c.Array[ctypes.c_uint32, Literal[2]] + VcBtcVminA: c.Array[ctypes.c_uint32, Literal[2]] + VcBtcVminB: c.Array[ctypes.c_uint32, Literal[2]] + PerPartVminEnabled: c.Array[ctypes.c_ubyte, Literal[2]] + VcBtcEnabled: c.Array[ctypes.c_ubyte, Literal[2]] + SocketPowerLimitAcTau: c.Array[ctypes.c_uint16, Literal[4]] + SocketPowerLimitDcTau: c.Array[ctypes.c_uint16, Literal[4]] + Vmin_droop: QuadraticInt_t + SpareVmin: c.Array[ctypes.c_uint32, Literal[9]] + DpmDescriptor: c.Array[DpmDescriptor_t, Literal[13]] + FreqTableGfx: c.Array[ctypes.c_uint16, Literal[16]] + FreqTableVclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableSocclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableUclk: c.Array[ctypes.c_uint16, Literal[4]] + FreqTableDispclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDppClk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDprefclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDcfclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDtbclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableFclk: c.Array[ctypes.c_uint16, Literal[8]] + DcModeMaxFreq: c.Array[ctypes.c_uint32, Literal[13]] + Mp0clkFreq: c.Array[ctypes.c_uint16, Literal[2]] + Mp0DpmVoltage: c.Array[ctypes.c_uint16, Literal[2]] + GfxclkSpare: c.Array[ctypes.c_ubyte, Literal[2]] + GfxclkFreqCap: int + GfxclkFgfxoffEntry: int + GfxclkFgfxoffExitImu: int + GfxclkFgfxoffExitRlc: int + GfxclkThrottleClock: int + EnableGfxPowerStagesGpio: int + GfxIdlePadding: int + SmsRepairWRCKClkDivEn: int + SmsRepairWRCKClkDivVal: int + GfxOffEntryEarlyMGCGEn: int + GfxOffEntryForceCGCGEn: int + GfxOffEntryForceCGCGDelayEn: int + GfxOffEntryForceCGCGDelayVal: int + GfxclkFreqGfxUlv: int + GfxIdlePadding2: c.Array[ctypes.c_ubyte, Literal[2]] + GfxOffEntryHysteresis: int + GfxoffSpare: c.Array[ctypes.c_uint32, Literal[15]] + DfllBtcMasterScalerM: int + DfllBtcMasterScalerB: int + DfllBtcSlaveScalerM: int + DfllBtcSlaveScalerB: int + DfllPccAsWaitCtrl: int + DfllPccAsStepCtrl: int + DfllL2FrequencyBoostM: int + DfllL2FrequencyBoostB: int + GfxGpoSpare: c.Array[ctypes.c_uint32, Literal[8]] + DcsGfxOffVoltage: int + PaddingDcs: int + DcsMinGfxOffTime: int + DcsMaxGfxOffTime: int + DcsMinCreditAccum: int + DcsExitHysteresis: int + DcsTimeout: int + FoptEnabled: int + DcsSpare2: c.Array[ctypes.c_ubyte, Literal[3]] + DcsFoptM: int + DcsFoptB: int + DcsSpare: c.Array[ctypes.c_uint32, Literal[11]] + ShadowFreqTableUclk: c.Array[ctypes.c_uint16, Literal[4]] + UseStrobeModeOptimizations: int + PaddingMem: c.Array[ctypes.c_ubyte, Literal[3]] + UclkDpmPstates: c.Array[ctypes.c_ubyte, Literal[4]] + FreqTableUclkDiv: c.Array[ctypes.c_ubyte, Literal[4]] + MemVmempVoltage: c.Array[ctypes.c_uint16, Literal[4]] + MemVddioVoltage: c.Array[ctypes.c_uint16, Literal[4]] + FclkDpmUPstates: c.Array[ctypes.c_ubyte, Literal[8]] + FclkDpmVddU: c.Array[ctypes.c_uint16, Literal[8]] + FclkDpmUSpeed: c.Array[ctypes.c_uint16, Literal[8]] + FclkDpmDisallowPstateFreq: int + PaddingFclk: int + PcieGenSpeed: c.Array[ctypes.c_ubyte, Literal[3]] + PcieLaneCount: c.Array[ctypes.c_ubyte, Literal[3]] + LclkFreq: c.Array[ctypes.c_uint16, Literal[3]] + FanStopTemp: c.Array[ctypes.c_uint16, Literal[13]] + FanStartTemp: c.Array[ctypes.c_uint16, Literal[13]] + FanGain: c.Array[ctypes.c_uint16, Literal[13]] + FanGainPadding: int + FanPwmMin: int + AcousticTargetRpmThreshold: int + AcousticLimitRpmThreshold: int + FanMaximumRpm: int + MGpuAcousticLimitRpmThreshold: int + FanTargetGfxclk: int + TempInputSelectMask: int + FanZeroRpmEnable: int + FanTachEdgePerRev: int + FanTargetTemperature: c.Array[ctypes.c_uint16, Literal[13]] + FuzzyFan_ErrorSetDelta: int + FuzzyFan_ErrorRateSetDelta: int + FuzzyFan_PwmSetDelta: int + FuzzyFan_Reserved: int + FwCtfLimit: c.Array[ctypes.c_uint16, Literal[13]] + IntakeTempEnableRPM: int + IntakeTempOffsetTemp: int + IntakeTempReleaseTemp: int + IntakeTempHighIntakeAcousticLimit: int + IntakeTempAcouticLimitReleaseRate: int + FanAbnormalTempLimitOffset: int + FanStalledTriggerRpm: int + FanAbnormalTriggerRpmCoeff: int + FanAbnormalDetectionEnable: int + FanIntakeSensorSupport: int + FanIntakePadding: c.Array[ctypes.c_ubyte, Literal[3]] + FanSpare: c.Array[ctypes.c_uint32, Literal[13]] + OverrideGfxAvfsFuses: int + GfxAvfsPadding: c.Array[ctypes.c_ubyte, Literal[3]] + L2HwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[32]] + SeHwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[32]] + CommonRtAvfs: c.Array[ctypes.c_uint32, Literal[13]] + L2FwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[19]] + SeFwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[19]] + Droop_PWL_F: c.Array[ctypes.c_uint32, Literal[5]] + Droop_PWL_a: c.Array[ctypes.c_uint32, Literal[5]] + Droop_PWL_b: c.Array[ctypes.c_uint32, Literal[5]] + Droop_PWL_c: c.Array[ctypes.c_uint32, Literal[5]] + Static_PWL_Offset: c.Array[ctypes.c_uint32, Literal[5]] + dGbV_dT_vmin: int + dGbV_dT_vmax: int + V2F_vmin_range_low: int + V2F_vmin_range_high: int + V2F_vmax_range_low: int + V2F_vmax_range_high: int + DcBtcGfxParams: AvfsDcBtcParams_t + GfxAvfsSpare: c.Array[ctypes.c_uint32, Literal[32]] + OverrideSocAvfsFuses: int + MinSocAvfsRevision: int + SocAvfsPadding: c.Array[ctypes.c_ubyte, Literal[2]] + SocAvfsFuseOverride: c.Array[AvfsFuseOverride_t, Literal[3]] + dBtcGbSoc: c.Array[DroopInt_t, Literal[3]] + qAgingGb: c.Array[LinearInt_t, Literal[3]] + qStaticVoltageOffset: c.Array[QuadraticInt_t, Literal[3]] + DcBtcSocParams: c.Array[AvfsDcBtcParams_t, Literal[3]] + SocAvfsSpare: c.Array[ctypes.c_uint32, Literal[32]] + BootValues: BootValues_t + DriverReportedClocks: DriverReportedClocks_t + MsgLimits: MsgLimits_t + OverDriveLimitsMin: OverDriveLimits_t + OverDriveLimitsBasicMax: OverDriveLimits_t + reserved: c.Array[ctypes.c_uint32, Literal[22]] + DebugOverrides: int + TotalBoardPowerSupport: int + TotalBoardPowerPadding: c.Array[ctypes.c_ubyte, Literal[3]] + TotalIdleBoardPowerM: int + TotalIdleBoardPowerB: int + TotalBoardPowerM: int + TotalBoardPowerB: int + qFeffCoeffGameClock: c.Array[QuadraticInt_t, Literal[2]] + qFeffCoeffBaseClock: c.Array[QuadraticInt_t, Literal[2]] + qFeffCoeffBoostClock: c.Array[QuadraticInt_t, Literal[2]] + TemperatureLimit_Hynix: int + TemperatureLimit_Micron: int + TemperatureFwCtfLimit_Hynix: int + TemperatureFwCtfLimit_Micron: int + Spare: c.Array[ctypes.c_uint32, Literal[41]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +int32_t: TypeAlias = ctypes.c_int32 +SkuTable_t.register_fields([('Version', uint32_t, 0), ('FeaturesToRun', c.Array[uint32_t, Literal[2]], 4), ('TotalPowerConfig', uint8_t, 12), ('CustomerVariant', uint8_t, 13), ('MemoryTemperatureTypeMask', uint8_t, 14), ('SmartShiftVersion', uint8_t, 15), ('SocketPowerLimitAc', c.Array[uint16_t, Literal[4]], 16), ('SocketPowerLimitDc', c.Array[uint16_t, Literal[4]], 24), ('SocketPowerLimitSmartShift2', uint16_t, 32), ('EnableLegacyPptLimit', uint8_t, 34), ('UseInputTelemetry', uint8_t, 35), ('SmartShiftMinReportedPptinDcs', uint8_t, 36), ('PaddingPpt', c.Array[uint8_t, Literal[1]], 37), ('VrTdcLimit', c.Array[uint16_t, Literal[3]], 38), ('PlatformTdcLimit', c.Array[uint16_t, Literal[3]], 44), ('TemperatureLimit', c.Array[uint16_t, Literal[13]], 50), ('HwCtfTempLimit', uint16_t, 76), ('PaddingInfra', uint16_t, 78), ('FitControllerFailureRateLimit', uint32_t, 80), ('FitControllerGfxDutyCycle', uint32_t, 84), ('FitControllerSocDutyCycle', uint32_t, 88), ('FitControllerSocOffset', uint32_t, 92), ('GfxApccPlusResidencyLimit', uint32_t, 96), ('ThrottlerControlMask', uint32_t, 100), ('FwDStateMask', uint32_t, 104), ('UlvVoltageOffset', c.Array[uint16_t, Literal[2]], 108), ('UlvVoltageOffsetU', uint16_t, 112), ('DeepUlvVoltageOffsetSoc', uint16_t, 114), ('DefaultMaxVoltage', c.Array[uint16_t, Literal[2]], 116), ('BoostMaxVoltage', c.Array[uint16_t, Literal[2]], 120), ('VminTempHystersis', c.Array[int16_t, Literal[2]], 124), ('VminTempThreshold', c.Array[int16_t, Literal[2]], 128), ('Vmin_Hot_T0', c.Array[uint16_t, Literal[2]], 132), ('Vmin_Cold_T0', c.Array[uint16_t, Literal[2]], 136), ('Vmin_Hot_Eol', c.Array[uint16_t, Literal[2]], 140), ('Vmin_Cold_Eol', c.Array[uint16_t, Literal[2]], 144), ('Vmin_Aging_Offset', c.Array[uint16_t, Literal[2]], 148), ('Spare_Vmin_Plat_Offset_Hot', c.Array[uint16_t, Literal[2]], 152), ('Spare_Vmin_Plat_Offset_Cold', c.Array[uint16_t, Literal[2]], 156), ('VcBtcFixedVminAgingOffset', c.Array[uint16_t, Literal[2]], 160), ('VcBtcVmin2PsmDegrationGb', c.Array[uint16_t, Literal[2]], 164), ('VcBtcPsmA', c.Array[uint32_t, Literal[2]], 168), ('VcBtcPsmB', c.Array[uint32_t, Literal[2]], 176), ('VcBtcVminA', c.Array[uint32_t, Literal[2]], 184), ('VcBtcVminB', c.Array[uint32_t, Literal[2]], 192), ('PerPartVminEnabled', c.Array[uint8_t, Literal[2]], 200), ('VcBtcEnabled', c.Array[uint8_t, Literal[2]], 202), ('SocketPowerLimitAcTau', c.Array[uint16_t, Literal[4]], 204), ('SocketPowerLimitDcTau', c.Array[uint16_t, Literal[4]], 212), ('Vmin_droop', QuadraticInt_t, 220), ('SpareVmin', c.Array[uint32_t, Literal[9]], 232), ('DpmDescriptor', c.Array[DpmDescriptor_t, Literal[13]], 268), ('FreqTableGfx', c.Array[uint16_t, Literal[16]], 684), ('FreqTableVclk', c.Array[uint16_t, Literal[8]], 716), ('FreqTableDclk', c.Array[uint16_t, Literal[8]], 732), ('FreqTableSocclk', c.Array[uint16_t, Literal[8]], 748), ('FreqTableUclk', c.Array[uint16_t, Literal[4]], 764), ('FreqTableDispclk', c.Array[uint16_t, Literal[8]], 772), ('FreqTableDppClk', c.Array[uint16_t, Literal[8]], 788), ('FreqTableDprefclk', c.Array[uint16_t, Literal[8]], 804), ('FreqTableDcfclk', c.Array[uint16_t, Literal[8]], 820), ('FreqTableDtbclk', c.Array[uint16_t, Literal[8]], 836), ('FreqTableFclk', c.Array[uint16_t, Literal[8]], 852), ('DcModeMaxFreq', c.Array[uint32_t, Literal[13]], 868), ('Mp0clkFreq', c.Array[uint16_t, Literal[2]], 920), ('Mp0DpmVoltage', c.Array[uint16_t, Literal[2]], 924), ('GfxclkSpare', c.Array[uint8_t, Literal[2]], 928), ('GfxclkFreqCap', uint16_t, 930), ('GfxclkFgfxoffEntry', uint16_t, 932), ('GfxclkFgfxoffExitImu', uint16_t, 934), ('GfxclkFgfxoffExitRlc', uint16_t, 936), ('GfxclkThrottleClock', uint16_t, 938), ('EnableGfxPowerStagesGpio', uint8_t, 940), ('GfxIdlePadding', uint8_t, 941), ('SmsRepairWRCKClkDivEn', uint8_t, 942), ('SmsRepairWRCKClkDivVal', uint8_t, 943), ('GfxOffEntryEarlyMGCGEn', uint8_t, 944), ('GfxOffEntryForceCGCGEn', uint8_t, 945), ('GfxOffEntryForceCGCGDelayEn', uint8_t, 946), ('GfxOffEntryForceCGCGDelayVal', uint8_t, 947), ('GfxclkFreqGfxUlv', uint16_t, 948), ('GfxIdlePadding2', c.Array[uint8_t, Literal[2]], 950), ('GfxOffEntryHysteresis', uint32_t, 952), ('GfxoffSpare', c.Array[uint32_t, Literal[15]], 956), ('DfllBtcMasterScalerM', uint32_t, 1016), ('DfllBtcMasterScalerB', int32_t, 1020), ('DfllBtcSlaveScalerM', uint32_t, 1024), ('DfllBtcSlaveScalerB', int32_t, 1028), ('DfllPccAsWaitCtrl', uint32_t, 1032), ('DfllPccAsStepCtrl', uint32_t, 1036), ('DfllL2FrequencyBoostM', uint32_t, 1040), ('DfllL2FrequencyBoostB', uint32_t, 1044), ('GfxGpoSpare', c.Array[uint32_t, Literal[8]], 1048), ('DcsGfxOffVoltage', uint16_t, 1080), ('PaddingDcs', uint16_t, 1082), ('DcsMinGfxOffTime', uint16_t, 1084), ('DcsMaxGfxOffTime', uint16_t, 1086), ('DcsMinCreditAccum', uint32_t, 1088), ('DcsExitHysteresis', uint16_t, 1092), ('DcsTimeout', uint16_t, 1094), ('FoptEnabled', uint8_t, 1096), ('DcsSpare2', c.Array[uint8_t, Literal[3]], 1097), ('DcsFoptM', uint32_t, 1100), ('DcsFoptB', uint32_t, 1104), ('DcsSpare', c.Array[uint32_t, Literal[11]], 1108), ('ShadowFreqTableUclk', c.Array[uint16_t, Literal[4]], 1152), ('UseStrobeModeOptimizations', uint8_t, 1160), ('PaddingMem', c.Array[uint8_t, Literal[3]], 1161), ('UclkDpmPstates', c.Array[uint8_t, Literal[4]], 1164), ('FreqTableUclkDiv', c.Array[uint8_t, Literal[4]], 1168), ('MemVmempVoltage', c.Array[uint16_t, Literal[4]], 1172), ('MemVddioVoltage', c.Array[uint16_t, Literal[4]], 1180), ('FclkDpmUPstates', c.Array[uint8_t, Literal[8]], 1188), ('FclkDpmVddU', c.Array[uint16_t, Literal[8]], 1196), ('FclkDpmUSpeed', c.Array[uint16_t, Literal[8]], 1212), ('FclkDpmDisallowPstateFreq', uint16_t, 1228), ('PaddingFclk', uint16_t, 1230), ('PcieGenSpeed', c.Array[uint8_t, Literal[3]], 1232), ('PcieLaneCount', c.Array[uint8_t, Literal[3]], 1235), ('LclkFreq', c.Array[uint16_t, Literal[3]], 1238), ('FanStopTemp', c.Array[uint16_t, Literal[13]], 1244), ('FanStartTemp', c.Array[uint16_t, Literal[13]], 1270), ('FanGain', c.Array[uint16_t, Literal[13]], 1296), ('FanGainPadding', uint16_t, 1322), ('FanPwmMin', uint16_t, 1324), ('AcousticTargetRpmThreshold', uint16_t, 1326), ('AcousticLimitRpmThreshold', uint16_t, 1328), ('FanMaximumRpm', uint16_t, 1330), ('MGpuAcousticLimitRpmThreshold', uint16_t, 1332), ('FanTargetGfxclk', uint16_t, 1334), ('TempInputSelectMask', uint32_t, 1336), ('FanZeroRpmEnable', uint8_t, 1340), ('FanTachEdgePerRev', uint8_t, 1341), ('FanTargetTemperature', c.Array[uint16_t, Literal[13]], 1342), ('FuzzyFan_ErrorSetDelta', int16_t, 1368), ('FuzzyFan_ErrorRateSetDelta', int16_t, 1370), ('FuzzyFan_PwmSetDelta', int16_t, 1372), ('FuzzyFan_Reserved', uint16_t, 1374), ('FwCtfLimit', c.Array[uint16_t, Literal[13]], 1376), ('IntakeTempEnableRPM', uint16_t, 1402), ('IntakeTempOffsetTemp', int16_t, 1404), ('IntakeTempReleaseTemp', uint16_t, 1406), ('IntakeTempHighIntakeAcousticLimit', uint16_t, 1408), ('IntakeTempAcouticLimitReleaseRate', uint16_t, 1410), ('FanAbnormalTempLimitOffset', int16_t, 1412), ('FanStalledTriggerRpm', uint16_t, 1414), ('FanAbnormalTriggerRpmCoeff', uint16_t, 1416), ('FanAbnormalDetectionEnable', uint16_t, 1418), ('FanIntakeSensorSupport', uint8_t, 1420), ('FanIntakePadding', c.Array[uint8_t, Literal[3]], 1421), ('FanSpare', c.Array[uint32_t, Literal[13]], 1424), ('OverrideGfxAvfsFuses', uint8_t, 1476), ('GfxAvfsPadding', c.Array[uint8_t, Literal[3]], 1477), ('L2HwRtAvfsFuses', c.Array[uint32_t, Literal[32]], 1480), ('SeHwRtAvfsFuses', c.Array[uint32_t, Literal[32]], 1608), ('CommonRtAvfs', c.Array[uint32_t, Literal[13]], 1736), ('L2FwRtAvfsFuses', c.Array[uint32_t, Literal[19]], 1788), ('SeFwRtAvfsFuses', c.Array[uint32_t, Literal[19]], 1864), ('Droop_PWL_F', c.Array[uint32_t, Literal[5]], 1940), ('Droop_PWL_a', c.Array[uint32_t, Literal[5]], 1960), ('Droop_PWL_b', c.Array[uint32_t, Literal[5]], 1980), ('Droop_PWL_c', c.Array[uint32_t, Literal[5]], 2000), ('Static_PWL_Offset', c.Array[uint32_t, Literal[5]], 2020), ('dGbV_dT_vmin', uint32_t, 2040), ('dGbV_dT_vmax', uint32_t, 2044), ('V2F_vmin_range_low', uint32_t, 2048), ('V2F_vmin_range_high', uint32_t, 2052), ('V2F_vmax_range_low', uint32_t, 2056), ('V2F_vmax_range_high', uint32_t, 2060), ('DcBtcGfxParams', AvfsDcBtcParams_t, 2064), ('GfxAvfsSpare', c.Array[uint32_t, Literal[32]], 2084), ('OverrideSocAvfsFuses', uint8_t, 2212), ('MinSocAvfsRevision', uint8_t, 2213), ('SocAvfsPadding', c.Array[uint8_t, Literal[2]], 2214), ('SocAvfsFuseOverride', c.Array[AvfsFuseOverride_t, Literal[3]], 2216), ('dBtcGbSoc', c.Array[DroopInt_t, Literal[3]], 2384), ('qAgingGb', c.Array[LinearInt_t, Literal[3]], 2420), ('qStaticVoltageOffset', c.Array[QuadraticInt_t, Literal[3]], 2444), ('DcBtcSocParams', c.Array[AvfsDcBtcParams_t, Literal[3]], 2480), ('SocAvfsSpare', c.Array[uint32_t, Literal[32]], 2540), ('BootValues', BootValues_t, 2668), ('DriverReportedClocks', DriverReportedClocks_t, 2780), ('MsgLimits', MsgLimits_t, 2808), ('OverDriveLimitsMin', OverDriveLimits_t, 2928), ('OverDriveLimitsBasicMax', OverDriveLimits_t, 3016), ('reserved', c.Array[uint32_t, Literal[22]], 3104), ('DebugOverrides', uint32_t, 3192), ('TotalBoardPowerSupport', uint8_t, 3196), ('TotalBoardPowerPadding', c.Array[uint8_t, Literal[3]], 3197), ('TotalIdleBoardPowerM', int16_t, 3200), ('TotalIdleBoardPowerB', int16_t, 3202), ('TotalBoardPowerM', int16_t, 3204), ('TotalBoardPowerB', int16_t, 3206), ('qFeffCoeffGameClock', c.Array[QuadraticInt_t, Literal[2]], 3208), ('qFeffCoeffBaseClock', c.Array[QuadraticInt_t, Literal[2]], 3232), ('qFeffCoeffBoostClock', c.Array[QuadraticInt_t, Literal[2]], 3256), ('TemperatureLimit_Hynix', uint16_t, 3280), ('TemperatureLimit_Micron', uint16_t, 3282), ('TemperatureFwCtfLimit_Hynix', uint16_t, 3284), ('TemperatureFwCtfLimit_Micron', uint16_t, 3286), ('Spare', c.Array[uint32_t, Literal[41]], 3288), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 3452)]) +@c.record +class BoardTable_t(c.Struct): + SIZE = 488 + Version: int + I2cControllers: c.Array[I2cControllerConfig_t, Literal[8]] + VddGfxVrMapping: int + VddSocVrMapping: int + VddMem0VrMapping: int + VddMem1VrMapping: int + GfxUlvPhaseSheddingMask: int + SocUlvPhaseSheddingMask: int + VmempUlvPhaseSheddingMask: int + VddioUlvPhaseSheddingMask: int + SlaveAddrMapping: c.Array[ctypes.c_ubyte, Literal[5]] + VrPsiSupport: c.Array[ctypes.c_ubyte, Literal[5]] + PaddingPsi: c.Array[ctypes.c_ubyte, Literal[5]] + EnablePsi6: c.Array[ctypes.c_ubyte, Literal[5]] + SviTelemetryScale: c.Array[SviTelemetryScale_t, Literal[5]] + VoltageTelemetryRatio: c.Array[ctypes.c_uint32, Literal[5]] + DownSlewRateVr: c.Array[ctypes.c_ubyte, Literal[5]] + LedOffGpio: int + FanOffGpio: int + GfxVrPowerStageOffGpio: int + AcDcGpio: int + AcDcPolarity: int + VR0HotGpio: int + VR0HotPolarity: int + GthrGpio: int + GthrPolarity: int + LedPin0: int + LedPin1: int + LedPin2: int + LedEnableMask: int + LedPcie: int + LedError: int + UclkTrainingModeSpreadPercent: int + UclkSpreadPadding: int + UclkSpreadFreq: int + UclkSpreadPercent: c.Array[ctypes.c_ubyte, Literal[16]] + GfxclkSpreadEnable: int + FclkSpreadPercent: int + FclkSpreadFreq: int + DramWidth: int + PaddingMem1: c.Array[ctypes.c_ubyte, Literal[7]] + HsrEnabled: int + VddqOffEnabled: int + PaddingUmcFlags: c.Array[ctypes.c_ubyte, Literal[2]] + PostVoltageSetBacoDelay: int + BacoEntryDelay: int + FuseWritePowerMuxPresent: int + FuseWritePadding: c.Array[ctypes.c_ubyte, Literal[3]] + BoardSpare: c.Array[ctypes.c_uint32, Literal[63]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +BoardTable_t.register_fields([('Version', uint32_t, 0), ('I2cControllers', c.Array[I2cControllerConfig_t, Literal[8]], 4), ('VddGfxVrMapping', uint8_t, 68), ('VddSocVrMapping', uint8_t, 69), ('VddMem0VrMapping', uint8_t, 70), ('VddMem1VrMapping', uint8_t, 71), ('GfxUlvPhaseSheddingMask', uint8_t, 72), ('SocUlvPhaseSheddingMask', uint8_t, 73), ('VmempUlvPhaseSheddingMask', uint8_t, 74), ('VddioUlvPhaseSheddingMask', uint8_t, 75), ('SlaveAddrMapping', c.Array[uint8_t, Literal[5]], 76), ('VrPsiSupport', c.Array[uint8_t, Literal[5]], 81), ('PaddingPsi', c.Array[uint8_t, Literal[5]], 86), ('EnablePsi6', c.Array[uint8_t, Literal[5]], 91), ('SviTelemetryScale', c.Array[SviTelemetryScale_t, Literal[5]], 96), ('VoltageTelemetryRatio', c.Array[uint32_t, Literal[5]], 116), ('DownSlewRateVr', c.Array[uint8_t, Literal[5]], 136), ('LedOffGpio', uint8_t, 141), ('FanOffGpio', uint8_t, 142), ('GfxVrPowerStageOffGpio', uint8_t, 143), ('AcDcGpio', uint8_t, 144), ('AcDcPolarity', uint8_t, 145), ('VR0HotGpio', uint8_t, 146), ('VR0HotPolarity', uint8_t, 147), ('GthrGpio', uint8_t, 148), ('GthrPolarity', uint8_t, 149), ('LedPin0', uint8_t, 150), ('LedPin1', uint8_t, 151), ('LedPin2', uint8_t, 152), ('LedEnableMask', uint8_t, 153), ('LedPcie', uint8_t, 154), ('LedError', uint8_t, 155), ('UclkTrainingModeSpreadPercent', uint8_t, 156), ('UclkSpreadPadding', uint8_t, 157), ('UclkSpreadFreq', uint16_t, 158), ('UclkSpreadPercent', c.Array[uint8_t, Literal[16]], 160), ('GfxclkSpreadEnable', uint8_t, 176), ('FclkSpreadPercent', uint8_t, 177), ('FclkSpreadFreq', uint16_t, 178), ('DramWidth', uint8_t, 180), ('PaddingMem1', c.Array[uint8_t, Literal[7]], 181), ('HsrEnabled', uint8_t, 188), ('VddqOffEnabled', uint8_t, 189), ('PaddingUmcFlags', c.Array[uint8_t, Literal[2]], 190), ('PostVoltageSetBacoDelay', uint32_t, 192), ('BacoEntryDelay', uint32_t, 196), ('FuseWritePowerMuxPresent', uint8_t, 200), ('FuseWritePadding', c.Array[uint8_t, Literal[3]], 201), ('BoardSpare', c.Array[uint32_t, Literal[63]], 204), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 456)]) +@c.record +class PPTable_t(c.Struct): + SIZE = 3972 + SkuTable: SkuTable_t + BoardTable: BoardTable_t +PPTable_t.register_fields([('SkuTable', SkuTable_t, 0), ('BoardTable', BoardTable_t, 3484)]) +@c.record +class DriverSmuConfig_t(c.Struct): + SIZE = 16 + GfxclkAverageLpfTau: int + FclkAverageLpfTau: int + UclkAverageLpfTau: int + GfxActivityLpfTau: int + UclkActivityLpfTau: int + SocketPowerLpfTau: int + VcnClkAverageLpfTau: int + VcnUsageAverageLpfTau: int +DriverSmuConfig_t.register_fields([('GfxclkAverageLpfTau', uint16_t, 0), ('FclkAverageLpfTau', uint16_t, 2), ('UclkAverageLpfTau', uint16_t, 4), ('GfxActivityLpfTau', uint16_t, 6), ('UclkActivityLpfTau', uint16_t, 8), ('SocketPowerLpfTau', uint16_t, 10), ('VcnClkAverageLpfTau', uint16_t, 12), ('VcnUsageAverageLpfTau', uint16_t, 14)]) +@c.record +class DriverSmuConfigExternal_t(c.Struct): + SIZE = 80 + DriverSmuConfig: DriverSmuConfig_t + Spare: c.Array[ctypes.c_uint32, Literal[8]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +DriverSmuConfigExternal_t.register_fields([('DriverSmuConfig', DriverSmuConfig_t, 0), ('Spare', c.Array[uint32_t, Literal[8]], 16), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 48)]) +@c.record +class DriverInfoTable_t(c.Struct): + SIZE = 372 + FreqTableGfx: c.Array[ctypes.c_uint16, Literal[16]] + FreqTableVclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableSocclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableUclk: c.Array[ctypes.c_uint16, Literal[4]] + FreqTableDispclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDppClk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDprefclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDcfclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDtbclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableFclk: c.Array[ctypes.c_uint16, Literal[8]] + DcModeMaxFreq: c.Array[ctypes.c_uint16, Literal[13]] + Padding: int + Spare: c.Array[ctypes.c_uint32, Literal[32]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +DriverInfoTable_t.register_fields([('FreqTableGfx', c.Array[uint16_t, Literal[16]], 0), ('FreqTableVclk', c.Array[uint16_t, Literal[8]], 32), ('FreqTableDclk', c.Array[uint16_t, Literal[8]], 48), ('FreqTableSocclk', c.Array[uint16_t, Literal[8]], 64), ('FreqTableUclk', c.Array[uint16_t, Literal[4]], 80), ('FreqTableDispclk', c.Array[uint16_t, Literal[8]], 88), ('FreqTableDppClk', c.Array[uint16_t, Literal[8]], 104), ('FreqTableDprefclk', c.Array[uint16_t, Literal[8]], 120), ('FreqTableDcfclk', c.Array[uint16_t, Literal[8]], 136), ('FreqTableDtbclk', c.Array[uint16_t, Literal[8]], 152), ('FreqTableFclk', c.Array[uint16_t, Literal[8]], 168), ('DcModeMaxFreq', c.Array[uint16_t, Literal[13]], 184), ('Padding', uint16_t, 210), ('Spare', c.Array[uint32_t, Literal[32]], 212), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 340)]) +@c.record +class SmuMetrics_t(c.Struct): + SIZE = 244 + CurrClock: c.Array[ctypes.c_uint32, Literal[13]] + AverageGfxclkFrequencyTarget: int + AverageGfxclkFrequencyPreDs: int + AverageGfxclkFrequencyPostDs: int + AverageFclkFrequencyPreDs: int + AverageFclkFrequencyPostDs: int + AverageMemclkFrequencyPreDs: int + AverageMemclkFrequencyPostDs: int + AverageVclk0Frequency: int + AverageDclk0Frequency: int + AverageVclk1Frequency: int + AverageDclk1Frequency: int + PCIeBusy: int + dGPU_W_MAX: int + padding: int + MetricsCounter: int + AvgVoltage: c.Array[ctypes.c_uint16, Literal[5]] + AvgCurrent: c.Array[ctypes.c_uint16, Literal[5]] + AverageGfxActivity: int + AverageUclkActivity: int + Vcn0ActivityPercentage: int + Vcn1ActivityPercentage: int + EnergyAccumulator: int + AverageSocketPower: int + AverageTotalBoardPower: int + AvgTemperature: c.Array[ctypes.c_uint16, Literal[13]] + AvgTemperatureFanIntake: int + PcieRate: int + PcieWidth: int + AvgFanPwm: int + Padding: c.Array[ctypes.c_ubyte, Literal[1]] + AvgFanRpm: int + ThrottlingPercentage: c.Array[ctypes.c_ubyte, Literal[22]] + VmaxThrottlingPercentage: int + Padding1: c.Array[ctypes.c_ubyte, Literal[3]] + D3HotEntryCountPerMode: c.Array[ctypes.c_uint32, Literal[4]] + D3HotExitCountPerMode: c.Array[ctypes.c_uint32, Literal[4]] + ArmMsgReceivedCountPerMode: c.Array[ctypes.c_uint32, Literal[4]] + ApuSTAPMSmartShiftLimit: int + ApuSTAPMLimit: int + AvgApuSocketPower: int + AverageUclkActivity_MAX: int + PublicSerialNumberLower: int + PublicSerialNumberUpper: int +SmuMetrics_t.register_fields([('CurrClock', c.Array[uint32_t, Literal[13]], 0), ('AverageGfxclkFrequencyTarget', uint16_t, 52), ('AverageGfxclkFrequencyPreDs', uint16_t, 54), ('AverageGfxclkFrequencyPostDs', uint16_t, 56), ('AverageFclkFrequencyPreDs', uint16_t, 58), ('AverageFclkFrequencyPostDs', uint16_t, 60), ('AverageMemclkFrequencyPreDs', uint16_t, 62), ('AverageMemclkFrequencyPostDs', uint16_t, 64), ('AverageVclk0Frequency', uint16_t, 66), ('AverageDclk0Frequency', uint16_t, 68), ('AverageVclk1Frequency', uint16_t, 70), ('AverageDclk1Frequency', uint16_t, 72), ('PCIeBusy', uint16_t, 74), ('dGPU_W_MAX', uint16_t, 76), ('padding', uint16_t, 78), ('MetricsCounter', uint32_t, 80), ('AvgVoltage', c.Array[uint16_t, Literal[5]], 84), ('AvgCurrent', c.Array[uint16_t, Literal[5]], 94), ('AverageGfxActivity', uint16_t, 104), ('AverageUclkActivity', uint16_t, 106), ('Vcn0ActivityPercentage', uint16_t, 108), ('Vcn1ActivityPercentage', uint16_t, 110), ('EnergyAccumulator', uint32_t, 112), ('AverageSocketPower', uint16_t, 116), ('AverageTotalBoardPower', uint16_t, 118), ('AvgTemperature', c.Array[uint16_t, Literal[13]], 120), ('AvgTemperatureFanIntake', uint16_t, 146), ('PcieRate', uint8_t, 148), ('PcieWidth', uint8_t, 149), ('AvgFanPwm', uint8_t, 150), ('Padding', c.Array[uint8_t, Literal[1]], 151), ('AvgFanRpm', uint16_t, 152), ('ThrottlingPercentage', c.Array[uint8_t, Literal[22]], 154), ('VmaxThrottlingPercentage', uint8_t, 176), ('Padding1', c.Array[uint8_t, Literal[3]], 177), ('D3HotEntryCountPerMode', c.Array[uint32_t, Literal[4]], 180), ('D3HotExitCountPerMode', c.Array[uint32_t, Literal[4]], 196), ('ArmMsgReceivedCountPerMode', c.Array[uint32_t, Literal[4]], 212), ('ApuSTAPMSmartShiftLimit', uint16_t, 228), ('ApuSTAPMLimit', uint16_t, 230), ('AvgApuSocketPower', uint16_t, 232), ('AverageUclkActivity_MAX', uint16_t, 234), ('PublicSerialNumberLower', uint32_t, 236), ('PublicSerialNumberUpper', uint32_t, 240)]) +@c.record +class SmuMetricsExternal_t(c.Struct): + SIZE = 392 + SmuMetrics: SmuMetrics_t + Spare: c.Array[ctypes.c_uint32, Literal[29]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +SmuMetricsExternal_t.register_fields([('SmuMetrics', SmuMetrics_t, 0), ('Spare', c.Array[uint32_t, Literal[29]], 244), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 360)]) +@c.record +class WatermarkRowGeneric_t(c.Struct): + SIZE = 4 + WmSetting: int + Flags: int + Padding: c.Array[ctypes.c_ubyte, Literal[2]] +WatermarkRowGeneric_t.register_fields([('WmSetting', uint8_t, 0), ('Flags', uint8_t, 1), ('Padding', c.Array[uint8_t, Literal[2]], 2)]) +WATERMARKS_FLAGS_e: dict[int, str] = {(WATERMARKS_CLOCK_RANGE:=0): 'WATERMARKS_CLOCK_RANGE', (WATERMARKS_DUMMY_PSTATE:=1): 'WATERMARKS_DUMMY_PSTATE', (WATERMARKS_MALL:=2): 'WATERMARKS_MALL', (WATERMARKS_COUNT:=3): 'WATERMARKS_COUNT'} +@c.record +class Watermarks_t(c.Struct): + SIZE = 16 + WatermarkRow: c.Array[WatermarkRowGeneric_t, Literal[4]] +Watermarks_t.register_fields([('WatermarkRow', c.Array[WatermarkRowGeneric_t, Literal[4]], 0)]) +@c.record +class WatermarksExternal_t(c.Struct): + SIZE = 112 + Watermarks: Watermarks_t + Spare: c.Array[ctypes.c_uint32, Literal[16]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +WatermarksExternal_t.register_fields([('Watermarks', Watermarks_t, 0), ('Spare', c.Array[uint32_t, Literal[16]], 16), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 80)]) +@c.record +class AvfsDebugTable_t(c.Struct): + SIZE = 2568 + avgPsmCount: c.Array[ctypes.c_uint16, Literal[214]] + minPsmCount: c.Array[ctypes.c_uint16, Literal[214]] + avgPsmVoltage: c.Array[ctypes.c_float, Literal[214]] + minPsmVoltage: c.Array[ctypes.c_float, Literal[214]] +AvfsDebugTable_t.register_fields([('avgPsmCount', c.Array[uint16_t, Literal[214]], 0), ('minPsmCount', c.Array[uint16_t, Literal[214]], 428), ('avgPsmVoltage', c.Array[ctypes.c_float, Literal[214]], 856), ('minPsmVoltage', c.Array[ctypes.c_float, Literal[214]], 1712)]) +@c.record +class AvfsDebugTableExternal_t(c.Struct): + SIZE = 2600 + AvfsDebugTable: AvfsDebugTable_t + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +AvfsDebugTableExternal_t.register_fields([('AvfsDebugTable', AvfsDebugTable_t, 0), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 2568)]) +@c.record +class DpmActivityMonitorCoeffInt_t(c.Struct): + SIZE = 92 + Gfx_ActiveHystLimit: int + Gfx_IdleHystLimit: int + Gfx_FPS: int + Gfx_MinActiveFreqType: int + Gfx_BoosterFreqType: int + PaddingGfx: int + Gfx_MinActiveFreq: int + Gfx_BoosterFreq: int + Gfx_PD_Data_time_constant: int + Gfx_PD_Data_limit_a: int + Gfx_PD_Data_limit_b: int + Gfx_PD_Data_limit_c: int + Gfx_PD_Data_error_coeff: int + Gfx_PD_Data_error_rate_coeff: int + Fclk_ActiveHystLimit: int + Fclk_IdleHystLimit: int + Fclk_FPS: int + Fclk_MinActiveFreqType: int + Fclk_BoosterFreqType: int + PaddingFclk: int + Fclk_MinActiveFreq: int + Fclk_BoosterFreq: int + Fclk_PD_Data_time_constant: int + Fclk_PD_Data_limit_a: int + Fclk_PD_Data_limit_b: int + Fclk_PD_Data_limit_c: int + Fclk_PD_Data_error_coeff: int + Fclk_PD_Data_error_rate_coeff: int + Mem_UpThreshold_Limit: c.Array[ctypes.c_uint32, Literal[4]] + Mem_UpHystLimit: c.Array[ctypes.c_ubyte, Literal[4]] + Mem_DownHystLimit: c.Array[ctypes.c_ubyte, Literal[4]] + Mem_Fps: int + padding: c.Array[ctypes.c_ubyte, Literal[2]] +DpmActivityMonitorCoeffInt_t.register_fields([('Gfx_ActiveHystLimit', uint8_t, 0), ('Gfx_IdleHystLimit', uint8_t, 1), ('Gfx_FPS', uint8_t, 2), ('Gfx_MinActiveFreqType', uint8_t, 3), ('Gfx_BoosterFreqType', uint8_t, 4), ('PaddingGfx', uint8_t, 5), ('Gfx_MinActiveFreq', uint16_t, 6), ('Gfx_BoosterFreq', uint16_t, 8), ('Gfx_PD_Data_time_constant', uint16_t, 10), ('Gfx_PD_Data_limit_a', uint32_t, 12), ('Gfx_PD_Data_limit_b', uint32_t, 16), ('Gfx_PD_Data_limit_c', uint32_t, 20), ('Gfx_PD_Data_error_coeff', uint32_t, 24), ('Gfx_PD_Data_error_rate_coeff', uint32_t, 28), ('Fclk_ActiveHystLimit', uint8_t, 32), ('Fclk_IdleHystLimit', uint8_t, 33), ('Fclk_FPS', uint8_t, 34), ('Fclk_MinActiveFreqType', uint8_t, 35), ('Fclk_BoosterFreqType', uint8_t, 36), ('PaddingFclk', uint8_t, 37), ('Fclk_MinActiveFreq', uint16_t, 38), ('Fclk_BoosterFreq', uint16_t, 40), ('Fclk_PD_Data_time_constant', uint16_t, 42), ('Fclk_PD_Data_limit_a', uint32_t, 44), ('Fclk_PD_Data_limit_b', uint32_t, 48), ('Fclk_PD_Data_limit_c', uint32_t, 52), ('Fclk_PD_Data_error_coeff', uint32_t, 56), ('Fclk_PD_Data_error_rate_coeff', uint32_t, 60), ('Mem_UpThreshold_Limit', c.Array[uint32_t, Literal[4]], 64), ('Mem_UpHystLimit', c.Array[uint8_t, Literal[4]], 80), ('Mem_DownHystLimit', c.Array[uint8_t, Literal[4]], 84), ('Mem_Fps', uint16_t, 88), ('padding', c.Array[uint8_t, Literal[2]], 90)]) +@c.record +class DpmActivityMonitorCoeffIntExternal_t(c.Struct): + SIZE = 124 + DpmActivityMonitorCoeffInt: DpmActivityMonitorCoeffInt_t + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +DpmActivityMonitorCoeffIntExternal_t.register_fields([('DpmActivityMonitorCoeffInt', DpmActivityMonitorCoeffInt_t, 0), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 92)]) +@c.record +class struct_smu_hw_power_state(c.Struct): + SIZE = 4 + magic: int +struct_smu_hw_power_state.register_fields([('magic', ctypes.c_uint32, 0)]) +class struct_smu_power_state(c.Struct): pass +enum_smu_state_ui_label: dict[int, str] = {(SMU_STATE_UI_LABEL_NONE:=0): 'SMU_STATE_UI_LABEL_NONE', (SMU_STATE_UI_LABEL_BATTERY:=1): 'SMU_STATE_UI_LABEL_BATTERY', (SMU_STATE_UI_TABEL_MIDDLE_LOW:=2): 'SMU_STATE_UI_TABEL_MIDDLE_LOW', (SMU_STATE_UI_LABEL_BALLANCED:=3): 'SMU_STATE_UI_LABEL_BALLANCED', (SMU_STATE_UI_LABEL_MIDDLE_HIGHT:=4): 'SMU_STATE_UI_LABEL_MIDDLE_HIGHT', (SMU_STATE_UI_LABEL_PERFORMANCE:=5): 'SMU_STATE_UI_LABEL_PERFORMANCE', (SMU_STATE_UI_LABEL_BACO:=6): 'SMU_STATE_UI_LABEL_BACO'} +enum_smu_state_classification_flag: dict[int, str] = {(SMU_STATE_CLASSIFICATION_FLAG_BOOT:=1): 'SMU_STATE_CLASSIFICATION_FLAG_BOOT', (SMU_STATE_CLASSIFICATION_FLAG_THERMAL:=2): 'SMU_STATE_CLASSIFICATION_FLAG_THERMAL', (SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE:=4): 'SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE', (SMU_STATE_CLASSIFICATION_FLAG_RESET:=8): 'SMU_STATE_CLASSIFICATION_FLAG_RESET', (SMU_STATE_CLASSIFICATION_FLAG_FORCED:=16): 'SMU_STATE_CLASSIFICATION_FLAG_FORCED', (SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE:=32): 'SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE:=64): 'SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE:=128): 'SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE:=256): 'SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE', (SMU_STATE_CLASSIFICATION_FLAG_UVD:=512): 'SMU_STATE_CLASSIFICATION_FLAG_UVD', (SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW:=1024): 'SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW', (SMU_STATE_CLASSIFICATION_FLAG_ACPI:=2048): 'SMU_STATE_CLASSIFICATION_FLAG_ACPI', (SMU_STATE_CLASSIFICATION_FLAG_HD2:=4096): 'SMU_STATE_CLASSIFICATION_FLAG_HD2', (SMU_STATE_CLASSIFICATION_FLAG_UVD_HD:=8192): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_HD', (SMU_STATE_CLASSIFICATION_FLAG_UVD_SD:=16384): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_SD', (SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE:=32768): 'SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE:=65536): 'SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE', (SMU_STATE_CLASSIFICATION_FLAG_BACO:=131072): 'SMU_STATE_CLASSIFICATION_FLAG_BACO', (SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2:=262144): 'SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2', (SMU_STATE_CLASSIFICATION_FLAG_ULV:=524288): 'SMU_STATE_CLASSIFICATION_FLAG_ULV', (SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC:=1048576): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC'} +@c.record +class struct_smu_state_classification_block(c.Struct): + SIZE = 16 + ui_label: int + flags: int + bios_index: int + temporary_state: bool + to_be_deleted: bool +struct_smu_state_classification_block.register_fields([('ui_label', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('bios_index', ctypes.c_int32, 8), ('temporary_state', ctypes.c_bool, 12), ('to_be_deleted', ctypes.c_bool, 13)]) +@c.record +class struct_smu_state_pcie_block(c.Struct): + SIZE = 4 + lanes: int +struct_smu_state_pcie_block.register_fields([('lanes', ctypes.c_uint32, 0)]) +enum_smu_refreshrate_source: dict[int, str] = {(SMU_REFRESHRATE_SOURCE_EDID:=0): 'SMU_REFRESHRATE_SOURCE_EDID', (SMU_REFRESHRATE_SOURCE_EXPLICIT:=1): 'SMU_REFRESHRATE_SOURCE_EXPLICIT'} +@c.record +class struct_smu_state_display_block(c.Struct): + SIZE = 20 + disable_frame_modulation: bool + limit_refreshrate: bool + refreshrate_source: int + explicit_refreshrate: int + edid_refreshrate_index: int + enable_vari_bright: bool +struct_smu_state_display_block.register_fields([('disable_frame_modulation', ctypes.c_bool, 0), ('limit_refreshrate', ctypes.c_bool, 1), ('refreshrate_source', ctypes.c_uint32, 4), ('explicit_refreshrate', ctypes.c_int32, 8), ('edid_refreshrate_index', ctypes.c_int32, 12), ('enable_vari_bright', ctypes.c_bool, 16)]) +@c.record +class struct_smu_state_memory_block(c.Struct): + SIZE = 5 + dll_off: bool + m3arb: int + unused: c.Array[ctypes.c_ubyte, Literal[3]] +struct_smu_state_memory_block.register_fields([('dll_off', ctypes.c_bool, 0), ('m3arb', uint8_t, 1), ('unused', c.Array[uint8_t, Literal[3]], 2)]) +@c.record +class struct_smu_state_software_algorithm_block(c.Struct): + SIZE = 2 + disable_load_balancing: bool + enable_sleep_for_timestamps: bool +struct_smu_state_software_algorithm_block.register_fields([('disable_load_balancing', ctypes.c_bool, 0), ('enable_sleep_for_timestamps', ctypes.c_bool, 1)]) +@c.record +class struct_smu_temperature_range(c.Struct): + SIZE = 44 + min: int + max: int + edge_emergency_max: int + hotspot_min: int + hotspot_crit_max: int + hotspot_emergency_max: int + mem_min: int + mem_crit_max: int + mem_emergency_max: int + software_shutdown_temp: int + software_shutdown_temp_offset: int +struct_smu_temperature_range.register_fields([('min', ctypes.c_int32, 0), ('max', ctypes.c_int32, 4), ('edge_emergency_max', ctypes.c_int32, 8), ('hotspot_min', ctypes.c_int32, 12), ('hotspot_crit_max', ctypes.c_int32, 16), ('hotspot_emergency_max', ctypes.c_int32, 20), ('mem_min', ctypes.c_int32, 24), ('mem_crit_max', ctypes.c_int32, 28), ('mem_emergency_max', ctypes.c_int32, 32), ('software_shutdown_temp', ctypes.c_int32, 36), ('software_shutdown_temp_offset', ctypes.c_int32, 40)]) +@c.record +class struct_smu_state_validation_block(c.Struct): + SIZE = 3 + single_display_only: bool + disallow_on_dc: bool + supported_power_levels: int +struct_smu_state_validation_block.register_fields([('single_display_only', ctypes.c_bool, 0), ('disallow_on_dc', ctypes.c_bool, 1), ('supported_power_levels', uint8_t, 2)]) +@c.record +class struct_smu_uvd_clocks(c.Struct): + SIZE = 8 + vclk: int + dclk: int +struct_smu_uvd_clocks.register_fields([('vclk', uint32_t, 0), ('dclk', uint32_t, 4)]) +enum_smu_power_src_type: dict[int, str] = {(SMU_POWER_SOURCE_AC:=0): 'SMU_POWER_SOURCE_AC', (SMU_POWER_SOURCE_DC:=1): 'SMU_POWER_SOURCE_DC', (SMU_POWER_SOURCE_COUNT:=2): 'SMU_POWER_SOURCE_COUNT'} +enum_smu_ppt_limit_type: dict[int, str] = {(SMU_DEFAULT_PPT_LIMIT:=0): 'SMU_DEFAULT_PPT_LIMIT', (SMU_FAST_PPT_LIMIT:=1): 'SMU_FAST_PPT_LIMIT'} +enum_smu_ppt_limit_level: dict[int, str] = {(SMU_PPT_LIMIT_MIN:=-1): 'SMU_PPT_LIMIT_MIN', (SMU_PPT_LIMIT_CURRENT:=0): 'SMU_PPT_LIMIT_CURRENT', (SMU_PPT_LIMIT_DEFAULT:=1): 'SMU_PPT_LIMIT_DEFAULT', (SMU_PPT_LIMIT_MAX:=2): 'SMU_PPT_LIMIT_MAX'} +enum_smu_memory_pool_size: dict[int, str] = {(SMU_MEMORY_POOL_SIZE_ZERO:=0): 'SMU_MEMORY_POOL_SIZE_ZERO', (SMU_MEMORY_POOL_SIZE_256_MB:=268435456): 'SMU_MEMORY_POOL_SIZE_256_MB', (SMU_MEMORY_POOL_SIZE_512_MB:=536870912): 'SMU_MEMORY_POOL_SIZE_512_MB', (SMU_MEMORY_POOL_SIZE_1_GB:=1073741824): 'SMU_MEMORY_POOL_SIZE_1_GB', (SMU_MEMORY_POOL_SIZE_2_GB:=2147483648): 'SMU_MEMORY_POOL_SIZE_2_GB'} +enum_smu_clk_type: dict[int, str] = {(SMU_GFXCLK:=0): 'SMU_GFXCLK', (SMU_VCLK:=1): 'SMU_VCLK', (SMU_DCLK:=2): 'SMU_DCLK', (SMU_VCLK1:=3): 'SMU_VCLK1', (SMU_DCLK1:=4): 'SMU_DCLK1', (SMU_ECLK:=5): 'SMU_ECLK', (SMU_SOCCLK:=6): 'SMU_SOCCLK', (SMU_UCLK:=7): 'SMU_UCLK', (SMU_DCEFCLK:=8): 'SMU_DCEFCLK', (SMU_DISPCLK:=9): 'SMU_DISPCLK', (SMU_PIXCLK:=10): 'SMU_PIXCLK', (SMU_PHYCLK:=11): 'SMU_PHYCLK', (SMU_FCLK:=12): 'SMU_FCLK', (SMU_SCLK:=13): 'SMU_SCLK', (SMU_MCLK:=14): 'SMU_MCLK', (SMU_PCIE:=15): 'SMU_PCIE', (SMU_LCLK:=16): 'SMU_LCLK', (SMU_OD_CCLK:=17): 'SMU_OD_CCLK', (SMU_OD_SCLK:=18): 'SMU_OD_SCLK', (SMU_OD_MCLK:=19): 'SMU_OD_MCLK', (SMU_OD_VDDC_CURVE:=20): 'SMU_OD_VDDC_CURVE', (SMU_OD_RANGE:=21): 'SMU_OD_RANGE', (SMU_OD_VDDGFX_OFFSET:=22): 'SMU_OD_VDDGFX_OFFSET', (SMU_OD_FAN_CURVE:=23): 'SMU_OD_FAN_CURVE', (SMU_OD_ACOUSTIC_LIMIT:=24): 'SMU_OD_ACOUSTIC_LIMIT', (SMU_OD_ACOUSTIC_TARGET:=25): 'SMU_OD_ACOUSTIC_TARGET', (SMU_OD_FAN_TARGET_TEMPERATURE:=26): 'SMU_OD_FAN_TARGET_TEMPERATURE', (SMU_OD_FAN_MINIMUM_PWM:=27): 'SMU_OD_FAN_MINIMUM_PWM', (SMU_CLK_COUNT:=28): 'SMU_CLK_COUNT'} +@c.record +class struct_smu_user_dpm_profile(c.Struct): + SIZE = 140 + fan_mode: int + power_limit: int + fan_speed_pwm: int + fan_speed_rpm: int + flags: int + user_od: int + clk_mask: c.Array[ctypes.c_uint32, Literal[28]] + clk_dependency: int +struct_smu_user_dpm_profile.register_fields([('fan_mode', uint32_t, 0), ('power_limit', uint32_t, 4), ('fan_speed_pwm', uint32_t, 8), ('fan_speed_rpm', uint32_t, 12), ('flags', uint32_t, 16), ('user_od', uint32_t, 20), ('clk_mask', c.Array[uint32_t, Literal[28]], 24), ('clk_dependency', uint32_t, 136)]) +@c.record +class struct_smu_table(c.Struct): + SIZE = 48 + size: int + align: int + domain: int + mc_address: int + cpu_addr: ctypes.c_void_p + bo: c.POINTER[struct_amdgpu_bo] + version: int +class struct_amdgpu_bo(c.Struct): pass +struct_smu_table.register_fields([('size', uint64_t, 0), ('align', uint32_t, 8), ('domain', uint8_t, 12), ('mc_address', uint64_t, 16), ('cpu_addr', ctypes.c_void_p, 24), ('bo', c.POINTER[struct_amdgpu_bo], 32), ('version', uint32_t, 40)]) +enum_smu_perf_level_designation: dict[int, str] = {(PERF_LEVEL_ACTIVITY:=0): 'PERF_LEVEL_ACTIVITY', (PERF_LEVEL_POWER_CONTAINMENT:=1): 'PERF_LEVEL_POWER_CONTAINMENT'} +@c.record +class struct_smu_performance_level(c.Struct): + SIZE = 24 + core_clock: int + memory_clock: int + vddc: int + vddci: int + non_local_mem_freq: int + non_local_mem_width: int +struct_smu_performance_level.register_fields([('core_clock', uint32_t, 0), ('memory_clock', uint32_t, 4), ('vddc', uint32_t, 8), ('vddci', uint32_t, 12), ('non_local_mem_freq', uint32_t, 16), ('non_local_mem_width', uint32_t, 20)]) +@c.record +class struct_smu_clock_info(c.Struct): + SIZE = 24 + min_mem_clk: int + max_mem_clk: int + min_eng_clk: int + max_eng_clk: int + min_bus_bandwidth: int + max_bus_bandwidth: int +struct_smu_clock_info.register_fields([('min_mem_clk', uint32_t, 0), ('max_mem_clk', uint32_t, 4), ('min_eng_clk', uint32_t, 8), ('max_eng_clk', uint32_t, 12), ('min_bus_bandwidth', uint32_t, 16), ('max_bus_bandwidth', uint32_t, 20)]) +@c.record +class struct_smu_bios_boot_up_values(c.Struct): + SIZE = 68 + revision: int + gfxclk: int + uclk: int + socclk: int + dcefclk: int + eclk: int + vclk: int + dclk: int + vddc: int + vddci: int + mvddc: int + vdd_gfx: int + cooling_id: int + pp_table_id: int + format_revision: int + content_revision: int + fclk: int + lclk: int + firmware_caps: int +struct_smu_bios_boot_up_values.register_fields([('revision', uint32_t, 0), ('gfxclk', uint32_t, 4), ('uclk', uint32_t, 8), ('socclk', uint32_t, 12), ('dcefclk', uint32_t, 16), ('eclk', uint32_t, 20), ('vclk', uint32_t, 24), ('dclk', uint32_t, 28), ('vddc', uint16_t, 32), ('vddci', uint16_t, 34), ('mvddc', uint16_t, 36), ('vdd_gfx', uint16_t, 38), ('cooling_id', uint8_t, 40), ('pp_table_id', uint32_t, 44), ('format_revision', uint32_t, 48), ('content_revision', uint32_t, 52), ('fclk', uint32_t, 56), ('lclk', uint32_t, 60), ('firmware_caps', uint32_t, 64)]) +enum_smu_table_id: dict[int, str] = {(SMU_TABLE_PPTABLE:=0): 'SMU_TABLE_PPTABLE', (SMU_TABLE_WATERMARKS:=1): 'SMU_TABLE_WATERMARKS', (SMU_TABLE_CUSTOM_DPM:=2): 'SMU_TABLE_CUSTOM_DPM', (SMU_TABLE_DPMCLOCKS:=3): 'SMU_TABLE_DPMCLOCKS', (SMU_TABLE_AVFS:=4): 'SMU_TABLE_AVFS', (SMU_TABLE_AVFS_PSM_DEBUG:=5): 'SMU_TABLE_AVFS_PSM_DEBUG', (SMU_TABLE_AVFS_FUSE_OVERRIDE:=6): 'SMU_TABLE_AVFS_FUSE_OVERRIDE', (SMU_TABLE_PMSTATUSLOG:=7): 'SMU_TABLE_PMSTATUSLOG', (SMU_TABLE_SMU_METRICS:=8): 'SMU_TABLE_SMU_METRICS', (SMU_TABLE_DRIVER_SMU_CONFIG:=9): 'SMU_TABLE_DRIVER_SMU_CONFIG', (SMU_TABLE_ACTIVITY_MONITOR_COEFF:=10): 'SMU_TABLE_ACTIVITY_MONITOR_COEFF', (SMU_TABLE_OVERDRIVE:=11): 'SMU_TABLE_OVERDRIVE', (SMU_TABLE_I2C_COMMANDS:=12): 'SMU_TABLE_I2C_COMMANDS', (SMU_TABLE_PACE:=13): 'SMU_TABLE_PACE', (SMU_TABLE_ECCINFO:=14): 'SMU_TABLE_ECCINFO', (SMU_TABLE_COMBO_PPTABLE:=15): 'SMU_TABLE_COMBO_PPTABLE', (SMU_TABLE_WIFIBAND:=16): 'SMU_TABLE_WIFIBAND', (SMU_TABLE_COUNT:=17): 'SMU_TABLE_COUNT'} +PPSMC_VERSION = 0x1 +DEBUGSMC_VERSION = 0x1 +PPSMC_Result_OK = 0x1 +PPSMC_Result_Failed = 0xFF +PPSMC_Result_UnknownCmd = 0xFE +PPSMC_Result_CmdRejectedPrereq = 0xFD +PPSMC_Result_CmdRejectedBusy = 0xFC +PPSMC_MSG_TestMessage = 0x1 +PPSMC_MSG_GetSmuVersion = 0x2 +PPSMC_MSG_GetDriverIfVersion = 0x3 +PPSMC_MSG_SetAllowedFeaturesMaskLow = 0x4 +PPSMC_MSG_SetAllowedFeaturesMaskHigh = 0x5 +PPSMC_MSG_EnableAllSmuFeatures = 0x6 +PPSMC_MSG_DisableAllSmuFeatures = 0x7 +PPSMC_MSG_EnableSmuFeaturesLow = 0x8 +PPSMC_MSG_EnableSmuFeaturesHigh = 0x9 +PPSMC_MSG_DisableSmuFeaturesLow = 0xA +PPSMC_MSG_DisableSmuFeaturesHigh = 0xB +PPSMC_MSG_GetRunningSmuFeaturesLow = 0xC +PPSMC_MSG_GetRunningSmuFeaturesHigh = 0xD +PPSMC_MSG_SetDriverDramAddrHigh = 0xE +PPSMC_MSG_SetDriverDramAddrLow = 0xF +PPSMC_MSG_SetToolsDramAddrHigh = 0x10 +PPSMC_MSG_SetToolsDramAddrLow = 0x11 +PPSMC_MSG_TransferTableSmu2Dram = 0x12 +PPSMC_MSG_TransferTableDram2Smu = 0x13 +PPSMC_MSG_UseDefaultPPTable = 0x14 +PPSMC_MSG_EnterBaco = 0x15 +PPSMC_MSG_ExitBaco = 0x16 +PPSMC_MSG_ArmD3 = 0x17 +PPSMC_MSG_BacoAudioD3PME = 0x18 +PPSMC_MSG_SetSoftMinByFreq = 0x19 +PPSMC_MSG_SetSoftMaxByFreq = 0x1A +PPSMC_MSG_SetHardMinByFreq = 0x1B +PPSMC_MSG_SetHardMaxByFreq = 0x1C +PPSMC_MSG_GetMinDpmFreq = 0x1D +PPSMC_MSG_GetMaxDpmFreq = 0x1E +PPSMC_MSG_GetDpmFreqByIndex = 0x1F +PPSMC_MSG_OverridePcieParameters = 0x20 +PPSMC_MSG_DramLogSetDramAddrHigh = 0x21 +PPSMC_MSG_DramLogSetDramAddrLow = 0x22 +PPSMC_MSG_DramLogSetDramSize = 0x23 +PPSMC_MSG_SetWorkloadMask = 0x24 +PPSMC_MSG_GetVoltageByDpm = 0x25 +PPSMC_MSG_SetVideoFps = 0x26 +PPSMC_MSG_GetDcModeMaxDpmFreq = 0x27 +PPSMC_MSG_AllowGfxOff = 0x28 +PPSMC_MSG_DisallowGfxOff = 0x29 +PPSMC_MSG_PowerUpVcn = 0x2A +PPSMC_MSG_PowerDownVcn = 0x2B +PPSMC_MSG_PowerUpJpeg = 0x2C +PPSMC_MSG_PowerDownJpeg = 0x2D +PPSMC_MSG_PrepareMp1ForUnload = 0x2E +PPSMC_MSG_Mode1Reset = 0x2F +PPSMC_MSG_Mode2Reset = 0x4F +PPSMC_MSG_SetSystemVirtualDramAddrHigh = 0x30 +PPSMC_MSG_SetSystemVirtualDramAddrLow = 0x31 +PPSMC_MSG_SetPptLimit = 0x32 +PPSMC_MSG_GetPptLimit = 0x33 +PPSMC_MSG_ReenableAcDcInterrupt = 0x34 +PPSMC_MSG_NotifyPowerSource = 0x35 +PPSMC_MSG_RunDcBtc = 0x36 +PPSMC_MSG_GetDebugData = 0x37 +PPSMC_MSG_SetTemperatureInputSelect = 0x38 +PPSMC_MSG_SetFwDstatesMask = 0x39 +PPSMC_MSG_SetThrottlerMask = 0x3A +PPSMC_MSG_SetExternalClientDfCstateAllow = 0x3B +PPSMC_MSG_SetMGpuFanBoostLimitRpm = 0x3C +PPSMC_MSG_DumpSTBtoDram = 0x3D +PPSMC_MSG_STBtoDramLogSetDramAddrHigh = 0x3E +PPSMC_MSG_STBtoDramLogSetDramAddrLow = 0x3F +PPSMC_MSG_STBtoDramLogSetDramSize = 0x40 +PPSMC_MSG_SetGpoAllow = 0x41 +PPSMC_MSG_AllowGfxDcs = 0x42 +PPSMC_MSG_DisallowGfxDcs = 0x43 +PPSMC_MSG_EnableAudioStutterWA = 0x44 +PPSMC_MSG_PowerUpUmsch = 0x45 +PPSMC_MSG_PowerDownUmsch = 0x46 +PPSMC_MSG_SetDcsArch = 0x47 +PPSMC_MSG_TriggerVFFLR = 0x48 +PPSMC_MSG_SetNumBadMemoryPagesRetired = 0x49 +PPSMC_MSG_SetBadMemoryPagesRetiredFlagsPerChannel = 0x4A +PPSMC_MSG_SetPriorityDeltaGain = 0x4B +PPSMC_MSG_AllowIHHostInterrupt = 0x4C +PPSMC_MSG_DALNotPresent = 0x4E +PPSMC_MSG_EnableUCLKShadow = 0x51 +PPSMC_Message_Count = 0x52 +DEBUGSMC_MSG_TestMessage = 0x1 +DEBUGSMC_MSG_GetDebugData = 0x2 +DEBUGSMC_MSG_DebugDumpExit = 0x3 +DEBUGSMC_Message_Count = 0x4 +SMU13_0_0_DRIVER_IF_VERSION = 0x3D +PPTABLE_VERSION = 0x2B +NUM_GFXCLK_DPM_LEVELS = 16 +NUM_SOCCLK_DPM_LEVELS = 8 +NUM_MP0CLK_DPM_LEVELS = 2 +NUM_DCLK_DPM_LEVELS = 8 +NUM_VCLK_DPM_LEVELS = 8 +NUM_DISPCLK_DPM_LEVELS = 8 +NUM_DPPCLK_DPM_LEVELS = 8 +NUM_DPREFCLK_DPM_LEVELS = 8 +NUM_DCFCLK_DPM_LEVELS = 8 +NUM_DTBCLK_DPM_LEVELS = 8 +NUM_UCLK_DPM_LEVELS = 4 +NUM_LINK_LEVELS = 3 +NUM_FCLK_DPM_LEVELS = 8 +NUM_OD_FAN_MAX_POINTS = 6 +FEATURE_FW_DATA_READ_BIT = 0 +FEATURE_DPM_GFXCLK_BIT = 1 +FEATURE_DPM_GFX_POWER_OPTIMIZER_BIT = 2 +FEATURE_DPM_UCLK_BIT = 3 +FEATURE_DPM_FCLK_BIT = 4 +FEATURE_DPM_SOCCLK_BIT = 5 +FEATURE_DPM_MP0CLK_BIT = 6 +FEATURE_DPM_LINK_BIT = 7 +FEATURE_DPM_DCN_BIT = 8 +FEATURE_VMEMP_SCALING_BIT = 9 +FEATURE_VDDIO_MEM_SCALING_BIT = 10 +FEATURE_DS_GFXCLK_BIT = 11 +FEATURE_DS_SOCCLK_BIT = 12 +FEATURE_DS_FCLK_BIT = 13 +FEATURE_DS_LCLK_BIT = 14 +FEATURE_DS_DCFCLK_BIT = 15 +FEATURE_DS_UCLK_BIT = 16 +FEATURE_GFX_ULV_BIT = 17 +FEATURE_FW_DSTATE_BIT = 18 +FEATURE_GFXOFF_BIT = 19 +FEATURE_BACO_BIT = 20 +FEATURE_MM_DPM_BIT = 21 +FEATURE_SOC_MPCLK_DS_BIT = 22 +FEATURE_BACO_MPCLK_DS_BIT = 23 +FEATURE_THROTTLERS_BIT = 24 +FEATURE_SMARTSHIFT_BIT = 25 +FEATURE_GTHR_BIT = 26 +FEATURE_ACDC_BIT = 27 +FEATURE_VR0HOT_BIT = 28 +FEATURE_FW_CTF_BIT = 29 +FEATURE_FAN_CONTROL_BIT = 30 +FEATURE_GFX_DCS_BIT = 31 +FEATURE_GFX_READ_MARGIN_BIT = 32 +FEATURE_LED_DISPLAY_BIT = 33 +FEATURE_GFXCLK_SPREAD_SPECTRUM_BIT = 34 +FEATURE_OUT_OF_BAND_MONITOR_BIT = 35 +FEATURE_OPTIMIZED_VMIN_BIT = 36 +FEATURE_GFX_IMU_BIT = 37 +FEATURE_BOOT_TIME_CAL_BIT = 38 +FEATURE_GFX_PCC_DFLL_BIT = 39 +FEATURE_SOC_CG_BIT = 40 +FEATURE_DF_CSTATE_BIT = 41 +FEATURE_GFX_EDC_BIT = 42 +FEATURE_BOOT_POWER_OPT_BIT = 43 +FEATURE_CLOCK_POWER_DOWN_BYPASS_BIT = 44 +FEATURE_DS_VCN_BIT = 45 +FEATURE_BACO_CG_BIT = 46 +FEATURE_MEM_TEMP_READ_BIT = 47 +FEATURE_ATHUB_MMHUB_PG_BIT = 48 +FEATURE_SOC_PCC_BIT = 49 +FEATURE_EDC_PWRBRK_BIT = 50 +FEATURE_BOMXCO_SVI3_PROG_BIT = 51 +FEATURE_SPARE_52_BIT = 52 +FEATURE_SPARE_53_BIT = 53 +FEATURE_SPARE_54_BIT = 54 +FEATURE_SPARE_55_BIT = 55 +FEATURE_SPARE_56_BIT = 56 +FEATURE_SPARE_57_BIT = 57 +FEATURE_SPARE_58_BIT = 58 +FEATURE_SPARE_59_BIT = 59 +FEATURE_SPARE_60_BIT = 60 +FEATURE_SPARE_61_BIT = 61 +FEATURE_SPARE_62_BIT = 62 +FEATURE_SPARE_63_BIT = 63 +NUM_FEATURES = 64 +ALLOWED_FEATURE_CTRL_DEFAULT = 0xFFFFFFFFFFFFFFFF +ALLOWED_FEATURE_CTRL_SCPM = ((1 << FEATURE_DPM_GFXCLK_BIT) | (1 << FEATURE_DPM_GFX_POWER_OPTIMIZER_BIT) | (1 << FEATURE_DPM_UCLK_BIT) | (1 << FEATURE_DPM_FCLK_BIT) | (1 << FEATURE_DPM_SOCCLK_BIT) | (1 << FEATURE_DPM_MP0CLK_BIT) | (1 << FEATURE_DPM_LINK_BIT) | (1 << FEATURE_DPM_DCN_BIT) | (1 << FEATURE_DS_GFXCLK_BIT) | (1 << FEATURE_DS_SOCCLK_BIT) | (1 << FEATURE_DS_FCLK_BIT) | (1 << FEATURE_DS_LCLK_BIT) | (1 << FEATURE_DS_DCFCLK_BIT) | (1 << FEATURE_DS_UCLK_BIT) | (1 << FEATURE_DS_VCN_BIT)) +DEBUG_OVERRIDE_DISABLE_VOLT_LINK_VCN_FCLK = 0x00000001 +DEBUG_OVERRIDE_DISABLE_VOLT_LINK_DCN_FCLK = 0x00000002 +DEBUG_OVERRIDE_DISABLE_VOLT_LINK_MP0_FCLK = 0x00000004 +DEBUG_OVERRIDE_DISABLE_VOLT_LINK_VCN_DCFCLK = 0x00000008 +DEBUG_OVERRIDE_DISABLE_FAST_FCLK_TIMER = 0x00000010 +DEBUG_OVERRIDE_DISABLE_VCN_PG = 0x00000020 +DEBUG_OVERRIDE_DISABLE_FMAX_VMAX = 0x00000040 +DEBUG_OVERRIDE_DISABLE_IMU_FW_CHECKS = 0x00000080 +DEBUG_OVERRIDE_DISABLE_D0i2_REENTRY_HSR_TIMER_CHECK = 0x00000100 +DEBUG_OVERRIDE_DISABLE_DFLL = 0x00000200 +DEBUG_OVERRIDE_ENABLE_RLC_VF_BRINGUP_MODE = 0x00000400 +DEBUG_OVERRIDE_DFLL_MASTER_MODE = 0x00000800 +DEBUG_OVERRIDE_ENABLE_PROFILING_MODE = 0x00001000 +VR_MAPPING_VR_SELECT_MASK = 0x01 +VR_MAPPING_VR_SELECT_SHIFT = 0x00 +VR_MAPPING_PLANE_SELECT_MASK = 0x02 +VR_MAPPING_PLANE_SELECT_SHIFT = 0x01 +PSI_SEL_VR0_PLANE0_PSI0 = 0x01 +PSI_SEL_VR0_PLANE0_PSI1 = 0x02 +PSI_SEL_VR0_PLANE1_PSI0 = 0x04 +PSI_SEL_VR0_PLANE1_PSI1 = 0x08 +PSI_SEL_VR1_PLANE0_PSI0 = 0x10 +PSI_SEL_VR1_PLANE0_PSI1 = 0x20 +PSI_SEL_VR1_PLANE1_PSI0 = 0x40 +PSI_SEL_VR1_PLANE1_PSI1 = 0x80 +THROTTLER_TEMP_EDGE_BIT = 0 +THROTTLER_TEMP_HOTSPOT_BIT = 1 +THROTTLER_TEMP_HOTSPOT_G_BIT = 2 +THROTTLER_TEMP_HOTSPOT_M_BIT = 3 +THROTTLER_TEMP_MEM_BIT = 4 +THROTTLER_TEMP_VR_GFX_BIT = 5 +THROTTLER_TEMP_VR_MEM0_BIT = 6 +THROTTLER_TEMP_VR_MEM1_BIT = 7 +THROTTLER_TEMP_VR_SOC_BIT = 8 +THROTTLER_TEMP_VR_U_BIT = 9 +THROTTLER_TEMP_LIQUID0_BIT = 10 +THROTTLER_TEMP_LIQUID1_BIT = 11 +THROTTLER_TEMP_PLX_BIT = 12 +THROTTLER_TDC_GFX_BIT = 13 +THROTTLER_TDC_SOC_BIT = 14 +THROTTLER_TDC_U_BIT = 15 +THROTTLER_PPT0_BIT = 16 +THROTTLER_PPT1_BIT = 17 +THROTTLER_PPT2_BIT = 18 +THROTTLER_PPT3_BIT = 19 +THROTTLER_FIT_BIT = 20 +THROTTLER_GFX_APCC_PLUS_BIT = 21 +THROTTLER_COUNT = 22 +FW_DSTATE_SOC_ULV_BIT = 0 +FW_DSTATE_G6_HSR_BIT = 1 +FW_DSTATE_G6_PHY_VMEMP_OFF_BIT = 2 +FW_DSTATE_SMN_DS_BIT = 3 +FW_DSTATE_MP1_WHISPER_MODE_BIT = 4 +FW_DSTATE_SOC_LIV_MIN_BIT = 5 +FW_DSTATE_SOC_PLL_PWRDN_BIT = 6 +FW_DSTATE_MEM_PLL_PWRDN_BIT = 7 +FW_DSTATE_MALL_ALLOC_BIT = 8 +FW_DSTATE_MEM_PSI_BIT = 9 +FW_DSTATE_HSR_NON_STROBE_BIT = 10 +FW_DSTATE_MP0_ENTER_WFI_BIT = 11 +FW_DSTATE_U_ULV_BIT = 12 +FW_DSTATE_MALL_FLUSH_BIT = 13 +FW_DSTATE_SOC_PSI_BIT = 14 +FW_DSTATE_U_PSI_BIT = 15 +FW_DSTATE_UCP_DS_BIT = 16 +FW_DSTATE_CSRCLK_DS_BIT = 17 +FW_DSTATE_MMHUB_INTERLOCK_BIT = 18 +FW_DSTATE_D0i3_2_QUIET_FW_BIT = 19 +FW_DSTATE_CLDO_PRG_BIT = 20 +FW_DSTATE_DF_PLL_PWRDN_BIT = 21 +FW_DSTATE_U_LOW_PWR_MODE_EN_BIT = 22 +FW_DSTATE_GFX_PSI6_BIT = 23 +FW_DSTATE_GFX_VR_PWR_STAGE_BIT = 24 +LED_DISPLAY_GFX_DPM_BIT = 0 +LED_DISPLAY_PCIE_BIT = 1 +LED_DISPLAY_ERROR_BIT = 2 +MEM_TEMP_READ_OUT_OF_BAND_BIT = 0 +MEM_TEMP_READ_IN_BAND_REFRESH_BIT = 1 +MEM_TEMP_READ_IN_BAND_DUMMY_PSTATE_BIT = 2 +NUM_I2C_CONTROLLERS = 8 +I2C_CONTROLLER_ENABLED = 1 +I2C_CONTROLLER_DISABLED = 0 +MAX_SW_I2C_COMMANDS = 24 +CMDCONFIG_STOP_BIT = 0 +CMDCONFIG_RESTART_BIT = 1 +CMDCONFIG_READWRITE_BIT = 2 +CMDCONFIG_STOP_MASK = (1 << CMDCONFIG_STOP_BIT) +CMDCONFIG_RESTART_MASK = (1 << CMDCONFIG_RESTART_BIT) +CMDCONFIG_READWRITE_MASK = (1 << CMDCONFIG_READWRITE_BIT) +PP_NUM_RTAVFS_PWL_ZONES = 5 +PP_OD_FEATURE_GFX_VF_CURVE_BIT = 0 +PP_OD_FEATURE_PPT_BIT = 2 +PP_OD_FEATURE_FAN_CURVE_BIT = 3 +PP_OD_FEATURE_GFXCLK_BIT = 7 +PP_OD_FEATURE_UCLK_BIT = 8 +PP_OD_FEATURE_ZERO_FAN_BIT = 9 +PP_OD_FEATURE_TEMPERATURE_BIT = 10 +PP_OD_FEATURE_COUNT = 13 +PP_NUM_OD_VF_CURVE_POINTS = PP_NUM_RTAVFS_PWL_ZONES + 1 +INVALID_BOARD_GPIO = 0xFF +MARKETING_BASE_CLOCKS = 0 +MARKETING_GAME_CLOCKS = 1 +MARKETING_BOOST_CLOCKS = 2 +NUM_WM_RANGES = 4 +WORKLOAD_PPLIB_DEFAULT_BIT = 0 +WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT = 1 +WORKLOAD_PPLIB_POWER_SAVING_BIT = 2 +WORKLOAD_PPLIB_VIDEO_BIT = 3 +WORKLOAD_PPLIB_VR_BIT = 4 +WORKLOAD_PPLIB_COMPUTE_BIT = 5 +WORKLOAD_PPLIB_CUSTOM_BIT = 6 +WORKLOAD_PPLIB_WINDOW_3D_BIT = 7 +WORKLOAD_PPLIB_COUNT = 8 +TABLE_TRANSFER_OK = 0x0 +TABLE_TRANSFER_FAILED = 0xFF +TABLE_TRANSFER_PENDING = 0xAB +TABLE_PPTABLE = 0 +TABLE_COMBO_PPTABLE = 1 +TABLE_WATERMARKS = 2 +TABLE_AVFS_PSM_DEBUG = 3 +TABLE_PMSTATUSLOG = 4 +TABLE_SMU_METRICS = 5 +TABLE_DRIVER_SMU_CONFIG = 6 +TABLE_ACTIVITY_MONITOR_COEFF = 7 +TABLE_OVERDRIVE = 8 +TABLE_I2C_COMMANDS = 9 +TABLE_DRIVER_INFO = 10 +TABLE_ECCINFO = 11 +TABLE_WIFIBAND = 12 +TABLE_COUNT = 13 +IH_INTERRUPT_ID_TO_DRIVER = 0xFE +IH_INTERRUPT_CONTEXT_ID_BACO = 0x2 +IH_INTERRUPT_CONTEXT_ID_AC = 0x3 +IH_INTERRUPT_CONTEXT_ID_DC = 0x4 +IH_INTERRUPT_CONTEXT_ID_AUDIO_D0 = 0x5 +IH_INTERRUPT_CONTEXT_ID_AUDIO_D3 = 0x6 +IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING = 0x7 +IH_INTERRUPT_CONTEXT_ID_FAN_ABNORMAL = 0x8 +IH_INTERRUPT_CONTEXT_ID_FAN_RECOVERY = 0x9 +SMU_THERMAL_MINIMUM_ALERT_TEMP = 0 +SMU_THERMAL_MAXIMUM_ALERT_TEMP = 255 +SMU_TEMPERATURE_UNITS_PER_CENTIGRADES = 1000 +SMU_FW_NAME_LEN = 0x24 +SMU_DPM_USER_PROFILE_RESTORE = (1 << 0) +SMU_CUSTOM_FAN_SPEED_RPM = (1 << 1) +SMU_CUSTOM_FAN_SPEED_PWM = (1 << 2) +SMU_THROTTLER_PPT0_BIT = 0 +SMU_THROTTLER_PPT1_BIT = 1 +SMU_THROTTLER_PPT2_BIT = 2 +SMU_THROTTLER_PPT3_BIT = 3 +SMU_THROTTLER_SPL_BIT = 4 +SMU_THROTTLER_FPPT_BIT = 5 +SMU_THROTTLER_SPPT_BIT = 6 +SMU_THROTTLER_SPPT_APU_BIT = 7 +SMU_THROTTLER_TDC_GFX_BIT = 16 +SMU_THROTTLER_TDC_SOC_BIT = 17 +SMU_THROTTLER_TDC_MEM_BIT = 18 +SMU_THROTTLER_TDC_VDD_BIT = 19 +SMU_THROTTLER_TDC_CVIP_BIT = 20 +SMU_THROTTLER_EDC_CPU_BIT = 21 +SMU_THROTTLER_EDC_GFX_BIT = 22 +SMU_THROTTLER_APCC_BIT = 23 +SMU_THROTTLER_TEMP_GPU_BIT = 32 +SMU_THROTTLER_TEMP_CORE_BIT = 33 +SMU_THROTTLER_TEMP_MEM_BIT = 34 +SMU_THROTTLER_TEMP_EDGE_BIT = 35 +SMU_THROTTLER_TEMP_HOTSPOT_BIT = 36 +SMU_THROTTLER_TEMP_SOC_BIT = 37 +SMU_THROTTLER_TEMP_VR_GFX_BIT = 38 +SMU_THROTTLER_TEMP_VR_SOC_BIT = 39 +SMU_THROTTLER_TEMP_VR_MEM0_BIT = 40 +SMU_THROTTLER_TEMP_VR_MEM1_BIT = 41 +SMU_THROTTLER_TEMP_LIQUID0_BIT = 42 +SMU_THROTTLER_TEMP_LIQUID1_BIT = 43 +SMU_THROTTLER_VRHOT0_BIT = 44 +SMU_THROTTLER_VRHOT1_BIT = 45 +SMU_THROTTLER_PROCHOT_CPU_BIT = 46 +SMU_THROTTLER_PROCHOT_GFX_BIT = 47 +SMU_THROTTLER_PPM_BIT = 56 +SMU_THROTTLER_FIT_BIT = 57 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_12.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_12.py new file mode 100644 index 000000000..3a8fe4374 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_12.py @@ -0,0 +1,532 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +PPSMC_Result: TypeAlias = ctypes.c_uint32 +PPSMC_MSG: TypeAlias = ctypes.c_uint32 +FEATURE_LIST_e: dict[int, str] = {(FEATURE_DATA_CALCULATION:=0): 'FEATURE_DATA_CALCULATION', (FEATURE_DPM_FCLK:=1): 'FEATURE_DPM_FCLK', (FEATURE_DPM_GFXCLK:=2): 'FEATURE_DPM_GFXCLK', (FEATURE_DPM_LCLK:=3): 'FEATURE_DPM_LCLK', (FEATURE_DPM_SOCCLK:=4): 'FEATURE_DPM_SOCCLK', (FEATURE_DPM_UCLK:=5): 'FEATURE_DPM_UCLK', (FEATURE_DPM_VCN:=6): 'FEATURE_DPM_VCN', (FEATURE_DPM_XGMI:=7): 'FEATURE_DPM_XGMI', (FEATURE_DS_FCLK:=8): 'FEATURE_DS_FCLK', (FEATURE_DS_GFXCLK:=9): 'FEATURE_DS_GFXCLK', (FEATURE_DS_LCLK:=10): 'FEATURE_DS_LCLK', (FEATURE_DS_MP0CLK:=11): 'FEATURE_DS_MP0CLK', (FEATURE_DS_MP1CLK:=12): 'FEATURE_DS_MP1CLK', (FEATURE_DS_MPIOCLK:=13): 'FEATURE_DS_MPIOCLK', (FEATURE_DS_SOCCLK:=14): 'FEATURE_DS_SOCCLK', (FEATURE_DS_VCN:=15): 'FEATURE_DS_VCN', (FEATURE_APCC_DFLL:=16): 'FEATURE_APCC_DFLL', (FEATURE_APCC_PLUS:=17): 'FEATURE_APCC_PLUS', (FEATURE_PPT:=18): 'FEATURE_PPT', (FEATURE_TDC:=19): 'FEATURE_TDC', (FEATURE_THERMAL:=20): 'FEATURE_THERMAL', (FEATURE_SOC_PCC:=21): 'FEATURE_SOC_PCC', (FEATURE_PROCHOT:=22): 'FEATURE_PROCHOT', (FEATURE_FDD_AID_HBM:=23): 'FEATURE_FDD_AID_HBM', (FEATURE_FDD_AID_SOC:=24): 'FEATURE_FDD_AID_SOC', (FEATURE_FDD_XCD_EDC:=25): 'FEATURE_FDD_XCD_EDC', (FEATURE_FDD_XCD_XVMIN:=26): 'FEATURE_FDD_XCD_XVMIN', (FEATURE_FW_CTF:=27): 'FEATURE_FW_CTF', (FEATURE_SMU_CG:=28): 'FEATURE_SMU_CG', (FEATURE_PSI7:=29): 'FEATURE_PSI7', (FEATURE_XGMI_PER_LINK_PWR_DOWN:=30): 'FEATURE_XGMI_PER_LINK_PWR_DOWN', (FEATURE_SOC_DC_RTC:=31): 'FEATURE_SOC_DC_RTC', (FEATURE_GFX_DC_RTC:=32): 'FEATURE_GFX_DC_RTC', (FEATURE_DVM_MIN_PSM:=33): 'FEATURE_DVM_MIN_PSM', (FEATURE_PRC:=34): 'FEATURE_PRC', (FEATURE_PSM_SQ_THROTTLER:=35): 'FEATURE_PSM_SQ_THROTTLER', (FEATURE_PIT:=36): 'FEATURE_PIT', (FEATURE_DVO:=37): 'FEATURE_DVO', (FEATURE_XVMINORPSM_CLKSTOP_DS:=38): 'FEATURE_XVMINORPSM_CLKSTOP_DS', (FEATURE_GLOBAL_DPM:=39): 'FEATURE_GLOBAL_DPM', (FEATURE_HROM_EN:=40): 'FEATURE_HROM_EN', (NUM_FEATURES:=41): 'NUM_FEATURES'} +PCIE_LINK_SPEED_INDEX_TABLE_e: dict[int, str] = {(PCIE_LINK_SPEED_INDEX_TABLE_RESERVED:=0): 'PCIE_LINK_SPEED_INDEX_TABLE_RESERVED', (PCIE_LINK_SPEED_INDEX_TABLE_GEN1:=1): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN1', (PCIE_LINK_SPEED_INDEX_TABLE_GEN2:=2): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN2', (PCIE_LINK_SPEED_INDEX_TABLE_GEN3:=3): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN3', (PCIE_LINK_SPEED_INDEX_TABLE_GEN4:=4): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN4', (PCIE_LINK_SPEED_INDEX_TABLE_GEN5:=5): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN5', (PCIE_LINK_SPEED_INDEX_TABLE_COUNT:=6): 'PCIE_LINK_SPEED_INDEX_TABLE_COUNT'} +GFX_GUARDBAND_OFFSET_e: dict[int, str] = {(GFX_GUARDBAND_OFFSET_0:=0): 'GFX_GUARDBAND_OFFSET_0', (GFX_GUARDBAND_OFFSET_1:=1): 'GFX_GUARDBAND_OFFSET_1', (GFX_GUARDBAND_OFFSET_2:=2): 'GFX_GUARDBAND_OFFSET_2', (GFX_GUARDBAND_OFFSET_3:=3): 'GFX_GUARDBAND_OFFSET_3', (GFX_GUARDBAND_OFFSET_4:=4): 'GFX_GUARDBAND_OFFSET_4', (GFX_GUARDBAND_OFFSET_5:=5): 'GFX_GUARDBAND_OFFSET_5', (GFX_GUARDBAND_OFFSET_6:=6): 'GFX_GUARDBAND_OFFSET_6', (GFX_GUARDBAND_OFFSET_7:=7): 'GFX_GUARDBAND_OFFSET_7', (GFX_GUARDBAND_OFFSET_COUNT:=8): 'GFX_GUARDBAND_OFFSET_COUNT'} +GFX_DVM_MARGIN_e: dict[int, str] = {(GFX_DVM_MARGINHI_0:=0): 'GFX_DVM_MARGINHI_0', (GFX_DVM_MARGINHI_1:=1): 'GFX_DVM_MARGINHI_1', (GFX_DVM_MARGINHI_2:=2): 'GFX_DVM_MARGINHI_2', (GFX_DVM_MARGINHI_3:=3): 'GFX_DVM_MARGINHI_3', (GFX_DVM_MARGINHI_4:=4): 'GFX_DVM_MARGINHI_4', (GFX_DVM_MARGINHI_5:=5): 'GFX_DVM_MARGINHI_5', (GFX_DVM_MARGINHI_6:=6): 'GFX_DVM_MARGINHI_6', (GFX_DVM_MARGINHI_7:=7): 'GFX_DVM_MARGINHI_7', (GFX_DVM_MARGINLO_0:=8): 'GFX_DVM_MARGINLO_0', (GFX_DVM_MARGINLO_1:=9): 'GFX_DVM_MARGINLO_1', (GFX_DVM_MARGINLO_2:=10): 'GFX_DVM_MARGINLO_2', (GFX_DVM_MARGINLO_3:=11): 'GFX_DVM_MARGINLO_3', (GFX_DVM_MARGINLO_4:=12): 'GFX_DVM_MARGINLO_4', (GFX_DVM_MARGINLO_5:=13): 'GFX_DVM_MARGINLO_5', (GFX_DVM_MARGINLO_6:=14): 'GFX_DVM_MARGINLO_6', (GFX_DVM_MARGINLO_7:=15): 'GFX_DVM_MARGINLO_7', (GFX_DVM_MARGIN_COUNT:=16): 'GFX_DVM_MARGIN_COUNT'} +SYSTEM_TEMP_e: dict[int, str] = {(SYSTEM_TEMP_UBB_FPGA:=0): 'SYSTEM_TEMP_UBB_FPGA', (SYSTEM_TEMP_UBB_FRONT:=1): 'SYSTEM_TEMP_UBB_FRONT', (SYSTEM_TEMP_UBB_BACK:=2): 'SYSTEM_TEMP_UBB_BACK', (SYSTEM_TEMP_UBB_OAM7:=3): 'SYSTEM_TEMP_UBB_OAM7', (SYSTEM_TEMP_UBB_IBC:=4): 'SYSTEM_TEMP_UBB_IBC', (SYSTEM_TEMP_UBB_UFPGA:=5): 'SYSTEM_TEMP_UBB_UFPGA', (SYSTEM_TEMP_UBB_OAM1:=6): 'SYSTEM_TEMP_UBB_OAM1', (SYSTEM_TEMP_OAM_0_1_HSC:=7): 'SYSTEM_TEMP_OAM_0_1_HSC', (SYSTEM_TEMP_OAM_2_3_HSC:=8): 'SYSTEM_TEMP_OAM_2_3_HSC', (SYSTEM_TEMP_OAM_4_5_HSC:=9): 'SYSTEM_TEMP_OAM_4_5_HSC', (SYSTEM_TEMP_OAM_6_7_HSC:=10): 'SYSTEM_TEMP_OAM_6_7_HSC', (SYSTEM_TEMP_UBB_FPGA_0V72_VR:=11): 'SYSTEM_TEMP_UBB_FPGA_0V72_VR', (SYSTEM_TEMP_UBB_FPGA_3V3_VR:=12): 'SYSTEM_TEMP_UBB_FPGA_3V3_VR', (SYSTEM_TEMP_RETIMER_0_1_2_3_1V2_VR:=13): 'SYSTEM_TEMP_RETIMER_0_1_2_3_1V2_VR', (SYSTEM_TEMP_RETIMER_4_5_6_7_1V2_VR:=14): 'SYSTEM_TEMP_RETIMER_4_5_6_7_1V2_VR', (SYSTEM_TEMP_RETIMER_0_1_0V9_VR:=15): 'SYSTEM_TEMP_RETIMER_0_1_0V9_VR', (SYSTEM_TEMP_RETIMER_4_5_0V9_VR:=16): 'SYSTEM_TEMP_RETIMER_4_5_0V9_VR', (SYSTEM_TEMP_RETIMER_2_3_0V9_VR:=17): 'SYSTEM_TEMP_RETIMER_2_3_0V9_VR', (SYSTEM_TEMP_RETIMER_6_7_0V9_VR:=18): 'SYSTEM_TEMP_RETIMER_6_7_0V9_VR', (SYSTEM_TEMP_OAM_0_1_2_3_3V3_VR:=19): 'SYSTEM_TEMP_OAM_0_1_2_3_3V3_VR', (SYSTEM_TEMP_OAM_4_5_6_7_3V3_VR:=20): 'SYSTEM_TEMP_OAM_4_5_6_7_3V3_VR', (SYSTEM_TEMP_IBC_HSC:=21): 'SYSTEM_TEMP_IBC_HSC', (SYSTEM_TEMP_IBC:=22): 'SYSTEM_TEMP_IBC', (SYSTEM_TEMP_MAX_ENTRIES:=32): 'SYSTEM_TEMP_MAX_ENTRIES'} +NODE_TEMP_e: dict[int, str] = {(NODE_TEMP_RETIMER:=0): 'NODE_TEMP_RETIMER', (NODE_TEMP_IBC_TEMP:=1): 'NODE_TEMP_IBC_TEMP', (NODE_TEMP_IBC_2_TEMP:=2): 'NODE_TEMP_IBC_2_TEMP', (NODE_TEMP_VDD18_VR_TEMP:=3): 'NODE_TEMP_VDD18_VR_TEMP', (NODE_TEMP_04_HBM_B_VR_TEMP:=4): 'NODE_TEMP_04_HBM_B_VR_TEMP', (NODE_TEMP_04_HBM_D_VR_TEMP:=5): 'NODE_TEMP_04_HBM_D_VR_TEMP', (NODE_TEMP_MAX_TEMP_ENTRIES:=12): 'NODE_TEMP_MAX_TEMP_ENTRIES'} +SVI_TEMP_e: dict[int, str] = {(SVI_VDDCR_VDD0_TEMP:=0): 'SVI_VDDCR_VDD0_TEMP', (SVI_VDDCR_VDD1_TEMP:=1): 'SVI_VDDCR_VDD1_TEMP', (SVI_VDDCR_VDD2_TEMP:=2): 'SVI_VDDCR_VDD2_TEMP', (SVI_VDDCR_VDD3_TEMP:=3): 'SVI_VDDCR_VDD3_TEMP', (SVI_VDDCR_SOC_A_TEMP:=4): 'SVI_VDDCR_SOC_A_TEMP', (SVI_VDDCR_SOC_C_TEMP:=5): 'SVI_VDDCR_SOC_C_TEMP', (SVI_VDDCR_SOCIO_A_TEMP:=6): 'SVI_VDDCR_SOCIO_A_TEMP', (SVI_VDDCR_SOCIO_C_TEMP:=7): 'SVI_VDDCR_SOCIO_C_TEMP', (SVI_VDD_085_HBM_TEMP:=8): 'SVI_VDD_085_HBM_TEMP', (SVI_VDDCR_11_HBM_B_TEMP:=9): 'SVI_VDDCR_11_HBM_B_TEMP', (SVI_VDDCR_11_HBM_D_TEMP:=10): 'SVI_VDDCR_11_HBM_D_TEMP', (SVI_VDD_USR_TEMP:=11): 'SVI_VDD_USR_TEMP', (SVI_VDDIO_11_E32_TEMP:=12): 'SVI_VDDIO_11_E32_TEMP', (SVI_MAX_TEMP_ENTRIES:=13): 'SVI_MAX_TEMP_ENTRIES'} +@c.record +class MetricsTable_t(c.Struct): + SIZE = 1284 + AccumulationCounter: int + MaxSocketTemperature: int + MaxVrTemperature: int + MaxHbmTemperature: int + MaxSocketTemperatureAcc: int + MaxVrTemperatureAcc: int + MaxHbmTemperatureAcc: int + SocketPowerLimit: int + SocketPower: int + Timestamp: int + SocketEnergyAcc: int + XcdEnergyAcc: int + AidEnergyAcc: int + HbmEnergyAcc: int + GfxclkFrequencyLimit: int + FclkFrequency: int + UclkFrequency: int + SocclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + VclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + DclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + LclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + GfxclkFrequencyAcc: c.Array[ctypes.c_uint64, Literal[8]] + MaxLclkDpmRange: int + MinLclkDpmRange: int + XgmiWidth: int + XgmiBitrate: int + XgmiReadBandwidthAcc: c.Array[ctypes.c_uint64, Literal[8]] + XgmiWriteBandwidthAcc: c.Array[ctypes.c_uint64, Literal[8]] + SocketGfxBusy: int + DramBandwidthUtilization: int + SocketGfxBusyAcc: int + DramBandwidthAcc: int + MaxDramBandwidth: int + DramBandwidthUtilizationAcc: int + PcieBandwidthAcc: c.Array[ctypes.c_uint64, Literal[4]] + ProchotResidencyAcc: int + PptResidencyAcc: int + SocketThmResidencyAcc: int + VrThmResidencyAcc: int + HbmThmResidencyAcc: int + GfxLockXCDMak: int + GfxclkFrequency: c.Array[ctypes.c_uint32, Literal[8]] + XgmiReadDataSizeAcc: c.Array[ctypes.c_uint64, Literal[8]] + XgmiWriteDataSizeAcc: c.Array[ctypes.c_uint64, Literal[8]] + PcieBandwidth: c.Array[ctypes.c_uint32, Literal[4]] + PCIeL0ToRecoveryCountAcc: int + PCIenReplayAAcc: int + PCIenReplayARolloverCountAcc: int + PCIeNAKSentCountAcc: int + PCIeNAKReceivedCountAcc: int + VcnBusy: c.Array[ctypes.c_uint32, Literal[4]] + JpegBusy: c.Array[ctypes.c_uint32, Literal[40]] + PCIeLinkSpeed: int + PCIeLinkWidth: int + GfxBusy: c.Array[ctypes.c_uint32, Literal[8]] + GfxBusyAcc: c.Array[ctypes.c_uint64, Literal[8]] + PCIeOtherEndRecoveryAcc: int + GfxclkBelowHostLimitPptAcc: c.Array[ctypes.c_uint64, Literal[8]] + GfxclkBelowHostLimitThmAcc: c.Array[ctypes.c_uint64, Literal[8]] + GfxclkBelowHostLimitTotalAcc: c.Array[ctypes.c_uint64, Literal[8]] + GfxclkLowUtilizationAcc: c.Array[ctypes.c_uint64, Literal[8]] + AidTemperature: c.Array[ctypes.c_uint32, Literal[4]] + XcdTemperature: c.Array[ctypes.c_uint32, Literal[8]] + HbmTemperature: c.Array[ctypes.c_uint32, Literal[8]] +uint64_t: TypeAlias = ctypes.c_uint64 +uint32_t: TypeAlias = ctypes.c_uint32 +MetricsTable_t.register_fields([('AccumulationCounter', uint64_t, 0), ('MaxSocketTemperature', uint32_t, 8), ('MaxVrTemperature', uint32_t, 12), ('MaxHbmTemperature', uint32_t, 16), ('MaxSocketTemperatureAcc', uint64_t, 20), ('MaxVrTemperatureAcc', uint64_t, 28), ('MaxHbmTemperatureAcc', uint64_t, 36), ('SocketPowerLimit', uint32_t, 44), ('SocketPower', uint32_t, 48), ('Timestamp', uint64_t, 52), ('SocketEnergyAcc', uint64_t, 60), ('XcdEnergyAcc', uint64_t, 68), ('AidEnergyAcc', uint64_t, 76), ('HbmEnergyAcc', uint64_t, 84), ('GfxclkFrequencyLimit', uint32_t, 92), ('FclkFrequency', uint32_t, 96), ('UclkFrequency', uint32_t, 100), ('SocclkFrequency', c.Array[uint32_t, Literal[4]], 104), ('VclkFrequency', c.Array[uint32_t, Literal[4]], 120), ('DclkFrequency', c.Array[uint32_t, Literal[4]], 136), ('LclkFrequency', c.Array[uint32_t, Literal[4]], 152), ('GfxclkFrequencyAcc', c.Array[uint64_t, Literal[8]], 168), ('MaxLclkDpmRange', uint32_t, 232), ('MinLclkDpmRange', uint32_t, 236), ('XgmiWidth', uint32_t, 240), ('XgmiBitrate', uint32_t, 244), ('XgmiReadBandwidthAcc', c.Array[uint64_t, Literal[8]], 248), ('XgmiWriteBandwidthAcc', c.Array[uint64_t, Literal[8]], 312), ('SocketGfxBusy', uint32_t, 376), ('DramBandwidthUtilization', uint32_t, 380), ('SocketGfxBusyAcc', uint64_t, 384), ('DramBandwidthAcc', uint64_t, 392), ('MaxDramBandwidth', uint32_t, 400), ('DramBandwidthUtilizationAcc', uint64_t, 404), ('PcieBandwidthAcc', c.Array[uint64_t, Literal[4]], 412), ('ProchotResidencyAcc', uint32_t, 444), ('PptResidencyAcc', uint32_t, 448), ('SocketThmResidencyAcc', uint32_t, 452), ('VrThmResidencyAcc', uint32_t, 456), ('HbmThmResidencyAcc', uint32_t, 460), ('GfxLockXCDMak', uint32_t, 464), ('GfxclkFrequency', c.Array[uint32_t, Literal[8]], 468), ('XgmiReadDataSizeAcc', c.Array[uint64_t, Literal[8]], 500), ('XgmiWriteDataSizeAcc', c.Array[uint64_t, Literal[8]], 564), ('PcieBandwidth', c.Array[uint32_t, Literal[4]], 628), ('PCIeL0ToRecoveryCountAcc', uint32_t, 644), ('PCIenReplayAAcc', uint32_t, 648), ('PCIenReplayARolloverCountAcc', uint32_t, 652), ('PCIeNAKSentCountAcc', uint32_t, 656), ('PCIeNAKReceivedCountAcc', uint32_t, 660), ('VcnBusy', c.Array[uint32_t, Literal[4]], 664), ('JpegBusy', c.Array[uint32_t, Literal[40]], 680), ('PCIeLinkSpeed', uint32_t, 840), ('PCIeLinkWidth', uint32_t, 844), ('GfxBusy', c.Array[uint32_t, Literal[8]], 848), ('GfxBusyAcc', c.Array[uint64_t, Literal[8]], 880), ('PCIeOtherEndRecoveryAcc', uint32_t, 944), ('GfxclkBelowHostLimitPptAcc', c.Array[uint64_t, Literal[8]], 948), ('GfxclkBelowHostLimitThmAcc', c.Array[uint64_t, Literal[8]], 1012), ('GfxclkBelowHostLimitTotalAcc', c.Array[uint64_t, Literal[8]], 1076), ('GfxclkLowUtilizationAcc', c.Array[uint64_t, Literal[8]], 1140), ('AidTemperature', c.Array[uint32_t, Literal[4]], 1204), ('XcdTemperature', c.Array[uint32_t, Literal[8]], 1220), ('HbmTemperature', c.Array[uint32_t, Literal[8]], 1252)]) +@c.record +class SystemMetricsTable_t(c.Struct): + SIZE = 152 + AccumulationCounter: int + LabelVersion: int + NodeIdentifier: int + SystemTemperatures: c.Array[ctypes.c_int16, Literal[32]] + NodeTemperatures: c.Array[ctypes.c_int16, Literal[12]] + VrTemperatures: c.Array[ctypes.c_int16, Literal[13]] + spare: c.Array[ctypes.c_int16, Literal[7]] + NodePowerLimit: int + NodePower: int + GlobalPPTResidencyAcc: int +uint16_t: TypeAlias = ctypes.c_uint16 +int16_t: TypeAlias = ctypes.c_int16 +SystemMetricsTable_t.register_fields([('AccumulationCounter', uint64_t, 0), ('LabelVersion', uint16_t, 8), ('NodeIdentifier', uint16_t, 10), ('SystemTemperatures', c.Array[int16_t, Literal[32]], 12), ('NodeTemperatures', c.Array[int16_t, Literal[12]], 76), ('VrTemperatures', c.Array[int16_t, Literal[13]], 100), ('spare', c.Array[int16_t, Literal[7]], 126), ('NodePowerLimit', uint32_t, 140), ('NodePower', uint32_t, 144), ('GlobalPPTResidencyAcc', uint32_t, 148)]) +@c.record +class VfMetricsTable_t(c.Struct): + SIZE = 56 + AccumulationCounter: int + InstGfxclk_TargFreq: int + AccGfxclk_TargFreq: int + AccGfxRsmuDpm_Busy: int + AccGfxclkBelowHostLimitPpt: int + AccGfxclkBelowHostLimitThm: int + AccGfxclkBelowHostLimitTotal: int + AccGfxclkLowUtilization: int +VfMetricsTable_t.register_fields([('AccumulationCounter', uint32_t, 0), ('InstGfxclk_TargFreq', uint32_t, 4), ('AccGfxclk_TargFreq', uint64_t, 8), ('AccGfxRsmuDpm_Busy', uint64_t, 16), ('AccGfxclkBelowHostLimitPpt', uint64_t, 24), ('AccGfxclkBelowHostLimitThm', uint64_t, 32), ('AccGfxclkBelowHostLimitTotal', uint64_t, 40), ('AccGfxclkLowUtilization', uint64_t, 48)]) +@c.record +class FRUProductInfo_t(c.Struct): + SIZE = 168 + ModelNumber: c.Array[ctypes.c_ubyte, Literal[20]] + Name: c.Array[ctypes.c_ubyte, Literal[64]] + Serial: c.Array[ctypes.c_ubyte, Literal[20]] + ManufacturerName: c.Array[ctypes.c_ubyte, Literal[32]] + FruId: c.Array[ctypes.c_ubyte, Literal[32]] +uint8_t: TypeAlias = ctypes.c_ubyte +FRUProductInfo_t.register_fields([('ModelNumber', c.Array[uint8_t, Literal[20]], 0), ('Name', c.Array[uint8_t, Literal[64]], 20), ('Serial', c.Array[uint8_t, Literal[20]], 84), ('ManufacturerName', c.Array[uint8_t, Literal[32]], 104), ('FruId', c.Array[uint8_t, Literal[32]], 136)]) +@c.record +class StaticMetricsTable_t(c.Struct): + SIZE = 408 + ProductInfo: FRUProductInfo_t + MaxSocketPowerLimit: int + MaxGfxclkFrequency: int + MinGfxclkFrequency: int + FclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + UclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + SocclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + VclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + DclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + LclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + PublicSerialNumber_AID: c.Array[ctypes.c_uint64, Literal[4]] + PublicSerialNumber_XCD: c.Array[ctypes.c_uint64, Literal[8]] + MaxXgmiWidth: int + MaxXgmiBitrate: int + InputTelemetryVoltageInmV: int + pldmVersion: c.Array[ctypes.c_uint32, Literal[2]] + MaxNodePowerLimit: int + PPT1Max: int + PPT1Min: int + PPT1Default: int +StaticMetricsTable_t.register_fields([('ProductInfo', FRUProductInfo_t, 0), ('MaxSocketPowerLimit', uint32_t, 168), ('MaxGfxclkFrequency', uint32_t, 172), ('MinGfxclkFrequency', uint32_t, 176), ('FclkFrequencyTable', c.Array[uint32_t, Literal[4]], 180), ('UclkFrequencyTable', c.Array[uint32_t, Literal[4]], 196), ('SocclkFrequencyTable', c.Array[uint32_t, Literal[4]], 212), ('VclkFrequencyTable', c.Array[uint32_t, Literal[4]], 228), ('DclkFrequencyTable', c.Array[uint32_t, Literal[4]], 244), ('LclkFrequencyTable', c.Array[uint32_t, Literal[4]], 260), ('PublicSerialNumber_AID', c.Array[uint64_t, Literal[4]], 276), ('PublicSerialNumber_XCD', c.Array[uint64_t, Literal[8]], 308), ('MaxXgmiWidth', uint32_t, 372), ('MaxXgmiBitrate', uint32_t, 376), ('InputTelemetryVoltageInmV', uint32_t, 380), ('pldmVersion', c.Array[uint32_t, Literal[2]], 384), ('MaxNodePowerLimit', uint32_t, 392), ('PPT1Max', uint32_t, 396), ('PPT1Min', uint32_t, 400), ('PPT1Default', uint32_t, 404)]) +I2cControllerPort_e: dict[int, str] = {(I2C_CONTROLLER_PORT_0:=0): 'I2C_CONTROLLER_PORT_0', (I2C_CONTROLLER_PORT_1:=1): 'I2C_CONTROLLER_PORT_1', (I2C_CONTROLLER_PORT_COUNT:=2): 'I2C_CONTROLLER_PORT_COUNT'} +I2cSpeed_e: dict[int, str] = {(UNSUPPORTED_1:=0): 'UNSUPPORTED_1', (I2C_SPEED_STANDARD_100K:=1): 'I2C_SPEED_STANDARD_100K', (I2C_SPEED_FAST_400K:=2): 'I2C_SPEED_FAST_400K', (I2C_SPEED_FAST_PLUS_1M:=3): 'I2C_SPEED_FAST_PLUS_1M', (UNSUPPORTED_2:=4): 'UNSUPPORTED_2', (UNSUPPORTED_3:=5): 'UNSUPPORTED_3', (I2C_SPEED_COUNT:=6): 'I2C_SPEED_COUNT'} +I2cCmdType_e: dict[int, str] = {(I2C_CMD_READ:=0): 'I2C_CMD_READ', (I2C_CMD_WRITE:=1): 'I2C_CMD_WRITE', (I2C_CMD_COUNT:=2): 'I2C_CMD_COUNT'} +ERR_CODE_e: dict[int, str] = {(CODE_DAGB0:=0): 'CODE_DAGB0', (CODE_EA0:=5): 'CODE_EA0', (CODE_UTCL2_ROUTER:=10): 'CODE_UTCL2_ROUTER', (CODE_VML2:=11): 'CODE_VML2', (CODE_VML2_WALKER:=12): 'CODE_VML2_WALKER', (CODE_MMCANE:=13): 'CODE_MMCANE', (CODE_VIDD:=14): 'CODE_VIDD', (CODE_VIDV:=15): 'CODE_VIDV', (CODE_JPEG0S:=16): 'CODE_JPEG0S', (CODE_JPEG0D:=17): 'CODE_JPEG0D', (CODE_JPEG1S:=18): 'CODE_JPEG1S', (CODE_JPEG1D:=19): 'CODE_JPEG1D', (CODE_JPEG2S:=20): 'CODE_JPEG2S', (CODE_JPEG2D:=21): 'CODE_JPEG2D', (CODE_JPEG3S:=22): 'CODE_JPEG3S', (CODE_JPEG3D:=23): 'CODE_JPEG3D', (CODE_JPEG4S:=24): 'CODE_JPEG4S', (CODE_JPEG4D:=25): 'CODE_JPEG4D', (CODE_JPEG5S:=26): 'CODE_JPEG5S', (CODE_JPEG5D:=27): 'CODE_JPEG5D', (CODE_JPEG6S:=28): 'CODE_JPEG6S', (CODE_JPEG6D:=29): 'CODE_JPEG6D', (CODE_JPEG7S:=30): 'CODE_JPEG7S', (CODE_JPEG7D:=31): 'CODE_JPEG7D', (CODE_MMSCHD:=32): 'CODE_MMSCHD', (CODE_SDMA0:=33): 'CODE_SDMA0', (CODE_SDMA1:=34): 'CODE_SDMA1', (CODE_SDMA2:=35): 'CODE_SDMA2', (CODE_SDMA3:=36): 'CODE_SDMA3', (CODE_HDP:=37): 'CODE_HDP', (CODE_ATHUB:=38): 'CODE_ATHUB', (CODE_IH:=39): 'CODE_IH', (CODE_XHUB_POISON:=40): 'CODE_XHUB_POISON', (CODE_SMN_SLVERR:=40): 'CODE_SMN_SLVERR', (CODE_WDT:=41): 'CODE_WDT', (CODE_UNKNOWN:=42): 'CODE_UNKNOWN', (CODE_COUNT:=43): 'CODE_COUNT'} +GC_ERROR_CODE_e: dict[int, str] = {(SH_FED_CODE:=0): 'SH_FED_CODE', (GCEA_CODE:=1): 'GCEA_CODE', (SQ_CODE:=2): 'SQ_CODE', (LDS_CODE:=3): 'LDS_CODE', (GDS_CODE:=4): 'GDS_CODE', (SP0_CODE:=5): 'SP0_CODE', (SP1_CODE:=6): 'SP1_CODE', (TCC_CODE:=7): 'TCC_CODE', (TCA_CODE:=8): 'TCA_CODE', (TCX_CODE:=9): 'TCX_CODE', (CPC_CODE:=10): 'CPC_CODE', (CPF_CODE:=11): 'CPF_CODE', (CPG_CODE:=12): 'CPG_CODE', (SPI_CODE:=13): 'SPI_CODE', (RLC_CODE:=14): 'RLC_CODE', (SQC_CODE:=15): 'SQC_CODE', (TA_CODE:=16): 'TA_CODE', (TD_CODE:=17): 'TD_CODE', (TCP_CODE:=18): 'TCP_CODE', (TCI_CODE:=19): 'TCI_CODE', (GC_ROUTER_CODE:=20): 'GC_ROUTER_CODE', (VML2_CODE:=21): 'VML2_CODE', (VML2_WALKER_CODE:=22): 'VML2_WALKER_CODE', (ATCL2_CODE:=23): 'ATCL2_CODE', (GC_CANE_CODE:=24): 'GC_CANE_CODE', (MP5_CODE_SMN_SLVERR:=40): 'MP5_CODE_SMN_SLVERR', (MP5_CODE_UNKNOWN:=42): 'MP5_CODE_UNKNOWN'} +@c.record +class SwI2cCmd_t(c.Struct): + SIZE = 2 + ReadWriteData: int + CmdConfig: int +SwI2cCmd_t.register_fields([('ReadWriteData', uint8_t, 0), ('CmdConfig', uint8_t, 1)]) +@c.record +class SwI2cRequest_t(c.Struct): + SIZE = 52 + I2CcontrollerPort: int + I2CSpeed: int + SlaveAddress: int + NumCmds: int + SwI2cCmds: c.Array[SwI2cCmd_t, Literal[24]] +SwI2cRequest_t.register_fields([('I2CcontrollerPort', uint8_t, 0), ('I2CSpeed', uint8_t, 1), ('SlaveAddress', uint8_t, 2), ('NumCmds', uint8_t, 3), ('SwI2cCmds', c.Array[SwI2cCmd_t, Literal[24]], 4)]) +@c.record +class SwI2cRequestExternal_t(c.Struct): + SIZE = 116 + SwI2cRequest: SwI2cRequest_t + Spare: c.Array[ctypes.c_uint32, Literal[8]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +SwI2cRequestExternal_t.register_fields([('SwI2cRequest', SwI2cRequest_t, 0), ('Spare', c.Array[uint32_t, Literal[8]], 52), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 84)]) +PPCLK_e: dict[int, str] = {(PPCLK_VCLK:=0): 'PPCLK_VCLK', (PPCLK_DCLK:=1): 'PPCLK_DCLK', (PPCLK_SOCCLK:=2): 'PPCLK_SOCCLK', (PPCLK_UCLK:=3): 'PPCLK_UCLK', (PPCLK_FCLK:=4): 'PPCLK_FCLK', (PPCLK_LCLK:=5): 'PPCLK_LCLK', (PPCLK_COUNT:=6): 'PPCLK_COUNT'} +GpioIntPolarity_e: dict[int, str] = {(GPIO_INT_POLARITY_ACTIVE_LOW:=0): 'GPIO_INT_POLARITY_ACTIVE_LOW', (GPIO_INT_POLARITY_ACTIVE_HIGH:=1): 'GPIO_INT_POLARITY_ACTIVE_HIGH'} +UCLK_DPM_MODE_e: dict[int, str] = {(UCLK_DPM_MODE_BANDWIDTH:=0): 'UCLK_DPM_MODE_BANDWIDTH', (UCLK_DPM_MODE_LATENCY:=1): 'UCLK_DPM_MODE_LATENCY'} +@c.record +class AvfsDebugTableAid_t(c.Struct): + SIZE = 360 + avgPsmCount: c.Array[ctypes.c_uint16, Literal[30]] + minPsmCount: c.Array[ctypes.c_uint16, Literal[30]] + avgPsmVoltage: c.Array[ctypes.c_float, Literal[30]] + minPsmVoltage: c.Array[ctypes.c_float, Literal[30]] +AvfsDebugTableAid_t.register_fields([('avgPsmCount', c.Array[uint16_t, Literal[30]], 0), ('minPsmCount', c.Array[uint16_t, Literal[30]], 60), ('avgPsmVoltage', c.Array[ctypes.c_float, Literal[30]], 120), ('minPsmVoltage', c.Array[ctypes.c_float, Literal[30]], 240)]) +@c.record +class AvfsDebugTableXcd_t(c.Struct): + SIZE = 360 + avgPsmCount: c.Array[ctypes.c_uint16, Literal[30]] + minPsmCount: c.Array[ctypes.c_uint16, Literal[30]] + avgPsmVoltage: c.Array[ctypes.c_float, Literal[30]] + minPsmVoltage: c.Array[ctypes.c_float, Literal[30]] +AvfsDebugTableXcd_t.register_fields([('avgPsmCount', c.Array[uint16_t, Literal[30]], 0), ('minPsmCount', c.Array[uint16_t, Literal[30]], 60), ('avgPsmVoltage', c.Array[ctypes.c_float, Literal[30]], 120), ('minPsmVoltage', c.Array[ctypes.c_float, Literal[30]], 240)]) +@c.record +class struct_smu_hw_power_state(c.Struct): + SIZE = 4 + magic: int +struct_smu_hw_power_state.register_fields([('magic', ctypes.c_uint32, 0)]) +class struct_smu_power_state(c.Struct): pass +enum_smu_state_ui_label: dict[int, str] = {(SMU_STATE_UI_LABEL_NONE:=0): 'SMU_STATE_UI_LABEL_NONE', (SMU_STATE_UI_LABEL_BATTERY:=1): 'SMU_STATE_UI_LABEL_BATTERY', (SMU_STATE_UI_TABEL_MIDDLE_LOW:=2): 'SMU_STATE_UI_TABEL_MIDDLE_LOW', (SMU_STATE_UI_LABEL_BALLANCED:=3): 'SMU_STATE_UI_LABEL_BALLANCED', (SMU_STATE_UI_LABEL_MIDDLE_HIGHT:=4): 'SMU_STATE_UI_LABEL_MIDDLE_HIGHT', (SMU_STATE_UI_LABEL_PERFORMANCE:=5): 'SMU_STATE_UI_LABEL_PERFORMANCE', (SMU_STATE_UI_LABEL_BACO:=6): 'SMU_STATE_UI_LABEL_BACO'} +enum_smu_state_classification_flag: dict[int, str] = {(SMU_STATE_CLASSIFICATION_FLAG_BOOT:=1): 'SMU_STATE_CLASSIFICATION_FLAG_BOOT', (SMU_STATE_CLASSIFICATION_FLAG_THERMAL:=2): 'SMU_STATE_CLASSIFICATION_FLAG_THERMAL', (SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE:=4): 'SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE', (SMU_STATE_CLASSIFICATION_FLAG_RESET:=8): 'SMU_STATE_CLASSIFICATION_FLAG_RESET', (SMU_STATE_CLASSIFICATION_FLAG_FORCED:=16): 'SMU_STATE_CLASSIFICATION_FLAG_FORCED', (SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE:=32): 'SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE:=64): 'SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE:=128): 'SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE:=256): 'SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE', (SMU_STATE_CLASSIFICATION_FLAG_UVD:=512): 'SMU_STATE_CLASSIFICATION_FLAG_UVD', (SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW:=1024): 'SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW', (SMU_STATE_CLASSIFICATION_FLAG_ACPI:=2048): 'SMU_STATE_CLASSIFICATION_FLAG_ACPI', (SMU_STATE_CLASSIFICATION_FLAG_HD2:=4096): 'SMU_STATE_CLASSIFICATION_FLAG_HD2', (SMU_STATE_CLASSIFICATION_FLAG_UVD_HD:=8192): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_HD', (SMU_STATE_CLASSIFICATION_FLAG_UVD_SD:=16384): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_SD', (SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE:=32768): 'SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE:=65536): 'SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE', (SMU_STATE_CLASSIFICATION_FLAG_BACO:=131072): 'SMU_STATE_CLASSIFICATION_FLAG_BACO', (SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2:=262144): 'SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2', (SMU_STATE_CLASSIFICATION_FLAG_ULV:=524288): 'SMU_STATE_CLASSIFICATION_FLAG_ULV', (SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC:=1048576): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC'} +@c.record +class struct_smu_state_classification_block(c.Struct): + SIZE = 16 + ui_label: int + flags: int + bios_index: int + temporary_state: bool + to_be_deleted: bool +struct_smu_state_classification_block.register_fields([('ui_label', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('bios_index', ctypes.c_int32, 8), ('temporary_state', ctypes.c_bool, 12), ('to_be_deleted', ctypes.c_bool, 13)]) +@c.record +class struct_smu_state_pcie_block(c.Struct): + SIZE = 4 + lanes: int +struct_smu_state_pcie_block.register_fields([('lanes', ctypes.c_uint32, 0)]) +enum_smu_refreshrate_source: dict[int, str] = {(SMU_REFRESHRATE_SOURCE_EDID:=0): 'SMU_REFRESHRATE_SOURCE_EDID', (SMU_REFRESHRATE_SOURCE_EXPLICIT:=1): 'SMU_REFRESHRATE_SOURCE_EXPLICIT'} +@c.record +class struct_smu_state_display_block(c.Struct): + SIZE = 20 + disable_frame_modulation: bool + limit_refreshrate: bool + refreshrate_source: int + explicit_refreshrate: int + edid_refreshrate_index: int + enable_vari_bright: bool +struct_smu_state_display_block.register_fields([('disable_frame_modulation', ctypes.c_bool, 0), ('limit_refreshrate', ctypes.c_bool, 1), ('refreshrate_source', ctypes.c_uint32, 4), ('explicit_refreshrate', ctypes.c_int32, 8), ('edid_refreshrate_index', ctypes.c_int32, 12), ('enable_vari_bright', ctypes.c_bool, 16)]) +@c.record +class struct_smu_state_memory_block(c.Struct): + SIZE = 5 + dll_off: bool + m3arb: int + unused: c.Array[ctypes.c_ubyte, Literal[3]] +struct_smu_state_memory_block.register_fields([('dll_off', ctypes.c_bool, 0), ('m3arb', uint8_t, 1), ('unused', c.Array[uint8_t, Literal[3]], 2)]) +@c.record +class struct_smu_state_software_algorithm_block(c.Struct): + SIZE = 2 + disable_load_balancing: bool + enable_sleep_for_timestamps: bool +struct_smu_state_software_algorithm_block.register_fields([('disable_load_balancing', ctypes.c_bool, 0), ('enable_sleep_for_timestamps', ctypes.c_bool, 1)]) +@c.record +class struct_smu_temperature_range(c.Struct): + SIZE = 44 + min: int + max: int + edge_emergency_max: int + hotspot_min: int + hotspot_crit_max: int + hotspot_emergency_max: int + mem_min: int + mem_crit_max: int + mem_emergency_max: int + software_shutdown_temp: int + software_shutdown_temp_offset: int +struct_smu_temperature_range.register_fields([('min', ctypes.c_int32, 0), ('max', ctypes.c_int32, 4), ('edge_emergency_max', ctypes.c_int32, 8), ('hotspot_min', ctypes.c_int32, 12), ('hotspot_crit_max', ctypes.c_int32, 16), ('hotspot_emergency_max', ctypes.c_int32, 20), ('mem_min', ctypes.c_int32, 24), ('mem_crit_max', ctypes.c_int32, 28), ('mem_emergency_max', ctypes.c_int32, 32), ('software_shutdown_temp', ctypes.c_int32, 36), ('software_shutdown_temp_offset', ctypes.c_int32, 40)]) +@c.record +class struct_smu_state_validation_block(c.Struct): + SIZE = 3 + single_display_only: bool + disallow_on_dc: bool + supported_power_levels: int +struct_smu_state_validation_block.register_fields([('single_display_only', ctypes.c_bool, 0), ('disallow_on_dc', ctypes.c_bool, 1), ('supported_power_levels', uint8_t, 2)]) +@c.record +class struct_smu_uvd_clocks(c.Struct): + SIZE = 8 + vclk: int + dclk: int +struct_smu_uvd_clocks.register_fields([('vclk', uint32_t, 0), ('dclk', uint32_t, 4)]) +enum_smu_power_src_type: dict[int, str] = {(SMU_POWER_SOURCE_AC:=0): 'SMU_POWER_SOURCE_AC', (SMU_POWER_SOURCE_DC:=1): 'SMU_POWER_SOURCE_DC', (SMU_POWER_SOURCE_COUNT:=2): 'SMU_POWER_SOURCE_COUNT'} +enum_smu_ppt_limit_type: dict[int, str] = {(SMU_DEFAULT_PPT_LIMIT:=0): 'SMU_DEFAULT_PPT_LIMIT', (SMU_FAST_PPT_LIMIT:=1): 'SMU_FAST_PPT_LIMIT'} +enum_smu_ppt_limit_level: dict[int, str] = {(SMU_PPT_LIMIT_MIN:=-1): 'SMU_PPT_LIMIT_MIN', (SMU_PPT_LIMIT_CURRENT:=0): 'SMU_PPT_LIMIT_CURRENT', (SMU_PPT_LIMIT_DEFAULT:=1): 'SMU_PPT_LIMIT_DEFAULT', (SMU_PPT_LIMIT_MAX:=2): 'SMU_PPT_LIMIT_MAX'} +enum_smu_memory_pool_size: dict[int, str] = {(SMU_MEMORY_POOL_SIZE_ZERO:=0): 'SMU_MEMORY_POOL_SIZE_ZERO', (SMU_MEMORY_POOL_SIZE_256_MB:=268435456): 'SMU_MEMORY_POOL_SIZE_256_MB', (SMU_MEMORY_POOL_SIZE_512_MB:=536870912): 'SMU_MEMORY_POOL_SIZE_512_MB', (SMU_MEMORY_POOL_SIZE_1_GB:=1073741824): 'SMU_MEMORY_POOL_SIZE_1_GB', (SMU_MEMORY_POOL_SIZE_2_GB:=2147483648): 'SMU_MEMORY_POOL_SIZE_2_GB'} +enum_smu_clk_type: dict[int, str] = {(SMU_GFXCLK:=0): 'SMU_GFXCLK', (SMU_VCLK:=1): 'SMU_VCLK', (SMU_DCLK:=2): 'SMU_DCLK', (SMU_VCLK1:=3): 'SMU_VCLK1', (SMU_DCLK1:=4): 'SMU_DCLK1', (SMU_ECLK:=5): 'SMU_ECLK', (SMU_SOCCLK:=6): 'SMU_SOCCLK', (SMU_UCLK:=7): 'SMU_UCLK', (SMU_DCEFCLK:=8): 'SMU_DCEFCLK', (SMU_DISPCLK:=9): 'SMU_DISPCLK', (SMU_PIXCLK:=10): 'SMU_PIXCLK', (SMU_PHYCLK:=11): 'SMU_PHYCLK', (SMU_FCLK:=12): 'SMU_FCLK', (SMU_SCLK:=13): 'SMU_SCLK', (SMU_MCLK:=14): 'SMU_MCLK', (SMU_PCIE:=15): 'SMU_PCIE', (SMU_LCLK:=16): 'SMU_LCLK', (SMU_OD_CCLK:=17): 'SMU_OD_CCLK', (SMU_OD_SCLK:=18): 'SMU_OD_SCLK', (SMU_OD_MCLK:=19): 'SMU_OD_MCLK', (SMU_OD_VDDC_CURVE:=20): 'SMU_OD_VDDC_CURVE', (SMU_OD_RANGE:=21): 'SMU_OD_RANGE', (SMU_OD_VDDGFX_OFFSET:=22): 'SMU_OD_VDDGFX_OFFSET', (SMU_OD_FAN_CURVE:=23): 'SMU_OD_FAN_CURVE', (SMU_OD_ACOUSTIC_LIMIT:=24): 'SMU_OD_ACOUSTIC_LIMIT', (SMU_OD_ACOUSTIC_TARGET:=25): 'SMU_OD_ACOUSTIC_TARGET', (SMU_OD_FAN_TARGET_TEMPERATURE:=26): 'SMU_OD_FAN_TARGET_TEMPERATURE', (SMU_OD_FAN_MINIMUM_PWM:=27): 'SMU_OD_FAN_MINIMUM_PWM', (SMU_CLK_COUNT:=28): 'SMU_CLK_COUNT'} +@c.record +class struct_smu_user_dpm_profile(c.Struct): + SIZE = 140 + fan_mode: int + power_limit: int + fan_speed_pwm: int + fan_speed_rpm: int + flags: int + user_od: int + clk_mask: c.Array[ctypes.c_uint32, Literal[28]] + clk_dependency: int +struct_smu_user_dpm_profile.register_fields([('fan_mode', uint32_t, 0), ('power_limit', uint32_t, 4), ('fan_speed_pwm', uint32_t, 8), ('fan_speed_rpm', uint32_t, 12), ('flags', uint32_t, 16), ('user_od', uint32_t, 20), ('clk_mask', c.Array[uint32_t, Literal[28]], 24), ('clk_dependency', uint32_t, 136)]) +@c.record +class struct_smu_table(c.Struct): + SIZE = 48 + size: int + align: int + domain: int + mc_address: int + cpu_addr: ctypes.c_void_p + bo: c.POINTER[struct_amdgpu_bo] + version: int +class struct_amdgpu_bo(c.Struct): pass +struct_smu_table.register_fields([('size', uint64_t, 0), ('align', uint32_t, 8), ('domain', uint8_t, 12), ('mc_address', uint64_t, 16), ('cpu_addr', ctypes.c_void_p, 24), ('bo', c.POINTER[struct_amdgpu_bo], 32), ('version', uint32_t, 40)]) +enum_smu_perf_level_designation: dict[int, str] = {(PERF_LEVEL_ACTIVITY:=0): 'PERF_LEVEL_ACTIVITY', (PERF_LEVEL_POWER_CONTAINMENT:=1): 'PERF_LEVEL_POWER_CONTAINMENT'} +@c.record +class struct_smu_performance_level(c.Struct): + SIZE = 24 + core_clock: int + memory_clock: int + vddc: int + vddci: int + non_local_mem_freq: int + non_local_mem_width: int +struct_smu_performance_level.register_fields([('core_clock', uint32_t, 0), ('memory_clock', uint32_t, 4), ('vddc', uint32_t, 8), ('vddci', uint32_t, 12), ('non_local_mem_freq', uint32_t, 16), ('non_local_mem_width', uint32_t, 20)]) +@c.record +class struct_smu_clock_info(c.Struct): + SIZE = 24 + min_mem_clk: int + max_mem_clk: int + min_eng_clk: int + max_eng_clk: int + min_bus_bandwidth: int + max_bus_bandwidth: int +struct_smu_clock_info.register_fields([('min_mem_clk', uint32_t, 0), ('max_mem_clk', uint32_t, 4), ('min_eng_clk', uint32_t, 8), ('max_eng_clk', uint32_t, 12), ('min_bus_bandwidth', uint32_t, 16), ('max_bus_bandwidth', uint32_t, 20)]) +@c.record +class struct_smu_bios_boot_up_values(c.Struct): + SIZE = 68 + revision: int + gfxclk: int + uclk: int + socclk: int + dcefclk: int + eclk: int + vclk: int + dclk: int + vddc: int + vddci: int + mvddc: int + vdd_gfx: int + cooling_id: int + pp_table_id: int + format_revision: int + content_revision: int + fclk: int + lclk: int + firmware_caps: int +struct_smu_bios_boot_up_values.register_fields([('revision', uint32_t, 0), ('gfxclk', uint32_t, 4), ('uclk', uint32_t, 8), ('socclk', uint32_t, 12), ('dcefclk', uint32_t, 16), ('eclk', uint32_t, 20), ('vclk', uint32_t, 24), ('dclk', uint32_t, 28), ('vddc', uint16_t, 32), ('vddci', uint16_t, 34), ('mvddc', uint16_t, 36), ('vdd_gfx', uint16_t, 38), ('cooling_id', uint8_t, 40), ('pp_table_id', uint32_t, 44), ('format_revision', uint32_t, 48), ('content_revision', uint32_t, 52), ('fclk', uint32_t, 56), ('lclk', uint32_t, 60), ('firmware_caps', uint32_t, 64)]) +enum_smu_table_id: dict[int, str] = {(SMU_TABLE_PPTABLE:=0): 'SMU_TABLE_PPTABLE', (SMU_TABLE_WATERMARKS:=1): 'SMU_TABLE_WATERMARKS', (SMU_TABLE_CUSTOM_DPM:=2): 'SMU_TABLE_CUSTOM_DPM', (SMU_TABLE_DPMCLOCKS:=3): 'SMU_TABLE_DPMCLOCKS', (SMU_TABLE_AVFS:=4): 'SMU_TABLE_AVFS', (SMU_TABLE_AVFS_PSM_DEBUG:=5): 'SMU_TABLE_AVFS_PSM_DEBUG', (SMU_TABLE_AVFS_FUSE_OVERRIDE:=6): 'SMU_TABLE_AVFS_FUSE_OVERRIDE', (SMU_TABLE_PMSTATUSLOG:=7): 'SMU_TABLE_PMSTATUSLOG', (SMU_TABLE_SMU_METRICS:=8): 'SMU_TABLE_SMU_METRICS', (SMU_TABLE_DRIVER_SMU_CONFIG:=9): 'SMU_TABLE_DRIVER_SMU_CONFIG', (SMU_TABLE_ACTIVITY_MONITOR_COEFF:=10): 'SMU_TABLE_ACTIVITY_MONITOR_COEFF', (SMU_TABLE_OVERDRIVE:=11): 'SMU_TABLE_OVERDRIVE', (SMU_TABLE_I2C_COMMANDS:=12): 'SMU_TABLE_I2C_COMMANDS', (SMU_TABLE_PACE:=13): 'SMU_TABLE_PACE', (SMU_TABLE_ECCINFO:=14): 'SMU_TABLE_ECCINFO', (SMU_TABLE_COMBO_PPTABLE:=15): 'SMU_TABLE_COMBO_PPTABLE', (SMU_TABLE_WIFIBAND:=16): 'SMU_TABLE_WIFIBAND', (SMU_TABLE_COUNT:=17): 'SMU_TABLE_COUNT'} +PPSMC_Result_OK = 0x1 +PPSMC_Result_Failed = 0xFF +PPSMC_Result_UnknownCmd = 0xFE +PPSMC_Result_CmdRejectedPrereq = 0xFD +PPSMC_Result_CmdRejectedBusy = 0xFC +PPSMC_MSG_TestMessage = 0x1 +PPSMC_MSG_GetSmuVersion = 0x2 +PPSMC_MSG_GfxDriverReset = 0x3 +PPSMC_MSG_GetDriverIfVersion = 0x4 +PPSMC_MSG_EnableAllSmuFeatures = 0x5 +PPSMC_MSG_DisableAllSmuFeatures = 0x6 +PPSMC_MSG_RequestI2cTransaction = 0x7 +PPSMC_MSG_GetMetricsVersion = 0x8 +PPSMC_MSG_GetMetricsTable = 0x9 +PPSMC_MSG_GetEccInfoTable = 0xA +PPSMC_MSG_GetEnabledSmuFeaturesLow = 0xB +PPSMC_MSG_GetEnabledSmuFeaturesHigh = 0xC +PPSMC_MSG_SetDriverDramAddrHigh = 0xD +PPSMC_MSG_SetDriverDramAddrLow = 0xE +PPSMC_MSG_SetToolsDramAddrHigh = 0xF +PPSMC_MSG_SetToolsDramAddrLow = 0x10 +PPSMC_MSG_SetSystemVirtualDramAddrHigh = 0x11 +PPSMC_MSG_SetSystemVirtualDramAddrLow = 0x12 +PPSMC_MSG_SetSoftMinByFreq = 0x13 +PPSMC_MSG_SetSoftMaxByFreq = 0x14 +PPSMC_MSG_GetMinDpmFreq = 0x15 +PPSMC_MSG_GetMaxDpmFreq = 0x16 +PPSMC_MSG_GetDpmFreqByIndex = 0x17 +PPSMC_MSG_SetPptLimit = 0x18 +PPSMC_MSG_GetPptLimit = 0x19 +PPSMC_MSG_DramLogSetDramAddrHigh = 0x1A +PPSMC_MSG_DramLogSetDramAddrLow = 0x1B +PPSMC_MSG_DramLogSetDramSize = 0x1C +PPSMC_MSG_GetDebugData = 0x1D +PPSMC_MSG_HeavySBR = 0x1E +PPSMC_MSG_SetNumBadHbmPagesRetired = 0x1F +PPSMC_MSG_DFCstateControl = 0x20 +PPSMC_MSG_GetGmiPwrDnHyst = 0x21 +PPSMC_MSG_SetGmiPwrDnHyst = 0x22 +PPSMC_MSG_GmiPwrDnControl = 0x23 +PPSMC_MSG_EnterGfxoff = 0x24 +PPSMC_MSG_ExitGfxoff = 0x25 +PPSMC_MSG_EnableDeterminism = 0x26 +PPSMC_MSG_DisableDeterminism = 0x27 +PPSMC_MSG_DumpSTBtoDram = 0x28 +PPSMC_MSG_STBtoDramLogSetDramAddrHigh = 0x29 +PPSMC_MSG_STBtoDramLogSetDramAddrLow = 0x2A +PPSMC_MSG_STBtoDramLogSetDramSize = 0x2B +PPSMC_MSG_SetSystemVirtualSTBtoDramAddrHigh = 0x2C +PPSMC_MSG_SetSystemVirtualSTBtoDramAddrLow = 0x2D +PPSMC_MSG_GfxDriverResetRecovery = 0x2E +PPSMC_MSG_TriggerVFFLR = 0x2F +PPSMC_MSG_SetSoftMinGfxClk = 0x30 +PPSMC_MSG_SetSoftMaxGfxClk = 0x31 +PPSMC_MSG_GetMinGfxDpmFreq = 0x32 +PPSMC_MSG_GetMaxGfxDpmFreq = 0x33 +PPSMC_MSG_PrepareForDriverUnload = 0x34 +PPSMC_MSG_ReadThrottlerLimit = 0x35 +PPSMC_MSG_QueryValidMcaCount = 0x36 +PPSMC_MSG_McaBankDumpDW = 0x37 +PPSMC_MSG_GetCTFLimit = 0x38 +PPSMC_MSG_ClearMcaOnRead = 0x39 +PPSMC_MSG_QueryValidMcaCeCount = 0x3A +PPSMC_MSG_McaBankCeDumpDW = 0x3B +PPSMC_MSG_SelectPLPDMode = 0x40 +PPSMC_MSG_PmLogReadSample = 0x41 +PPSMC_MSG_PmLogGetTableVersion = 0x42 +PPSMC_MSG_RmaDueToBadPageThreshold = 0x43 +PPSMC_MSG_SetThrottlingPolicy = 0x44 +PPSMC_MSG_SetPhaseDetectCSBWThreshold = 0x45 +PPSMC_MSG_SetPhaseDetectFreqHigh = 0x46 +PPSMC_MSG_SetPhaseDetectFreqLow = 0x47 +PPSMC_MSG_SetPhaseDetectDownHysterisis = 0x48 +PPSMC_MSG_SetPhaseDetectAlphaX1e6 = 0x49 +PPSMC_MSG_SetPhaseDetectOnOff = 0x4A +PPSMC_MSG_GetPhaseDetectResidency = 0x4B +PPSMC_MSG_UpdatePccWaitDecMaxStr = 0x4C +PPSMC_MSG_ResetSDMA = 0x4D +PPSMC_MSG_GetRasTableVersion = 0x4E +PPSMC_MSG_GetBadPageCount = 0x50 +PPSMC_MSG_GetBadPageMcaAddress = 0x51 +PPSMC_MSG_SetTimestamp = 0x53 +PPSMC_MSG_SetTimestampHi = 0x54 +PPSMC_MSG_GetTimestamp = 0x55 +PPSMC_MSG_GetBadPageIpIdLoHi = 0x57 +PPSMC_MSG_EraseRasTable = 0x58 +PPSMC_MSG_GetStaticMetricsTable = 0x59 +PPSMC_MSG_ResetVfArbitersByIndex = 0x5A +PPSMC_MSG_GetSystemMetricsTable = 0x5C +PPSMC_MSG_GetSystemMetricsVersion = 0x5D +PPSMC_MSG_ResetVCN = 0x5E +PPSMC_MSG_SetFastPptLimit = 0x5F +PPSMC_MSG_GetFastPptLimit = 0x60 +PPSMC_Message_Count = 0x61 +PPSMC_RESET_TYPE_DRIVER_MODE_1_RESET = 0x1 +PPSMC_RESET_TYPE_DRIVER_MODE_2_RESET = 0x2 +PPSMC_RESET_TYPE_DRIVER_MODE_3_RESET = 0x3 +PPSMC_THROTTLING_LIMIT_TYPE_SOCKET = 0x1 +PPSMC_THROTTLING_LIMIT_TYPE_HBM = 0x2 +PPSMC_AID_THM_TYPE = 0x1 +PPSMC_CCD_THM_TYPE = 0x2 +PPSMC_XCD_THM_TYPE = 0x3 +PPSMC_HBM_THM_TYPE = 0x4 +PPSMC_PLPD_MODE_DEFAULT = 0x1 +PPSMC_PLPD_MODE_OPTIMIZED = 0x2 +NUM_VCLK_DPM_LEVELS = 4 +NUM_DCLK_DPM_LEVELS = 4 +NUM_SOCCLK_DPM_LEVELS = 4 +NUM_LCLK_DPM_LEVELS = 4 +NUM_UCLK_DPM_LEVELS = 4 +NUM_FCLK_DPM_LEVELS = 4 +NUM_XGMI_DPM_LEVELS = 2 +NUM_CXL_BITRATES = 4 +NUM_PCIE_BITRATES = 4 +NUM_XGMI_BITRATES = 4 +NUM_XGMI_WIDTHS = 3 +NUM_TDP_GROUPS = 4 +NUM_SOC_P2S_TABLES = 6 +NUM_GFX_P2S_TABLES = 8 +NUM_PSM_DIDT_THRESHOLDS = 3 +NUM_XVMIN_VMIN_THRESHOLDS = 3 +PRODUCT_MODEL_NUMBER_LEN = 20 +PRODUCT_NAME_LEN = 64 +PRODUCT_SERIAL_LEN = 20 +PRODUCT_MANUFACTURER_NAME_LEN = 32 +PRODUCT_FRU_ID_LEN = 32 +SMU_METRICS_TABLE_VERSION = 0x15 +SMU_SYSTEM_METRICS_TABLE_VERSION = 0x1 +SMU_VF_METRICS_TABLE_MASK = (1 << 31) +SMU_VF_METRICS_TABLE_VERSION = (0x6 | SMU_VF_METRICS_TABLE_MASK) +SMU13_0_6_DRIVER_IF_VERSION = 0x08042024 +NUM_I2C_CONTROLLERS = 8 +I2C_CONTROLLER_ENABLED = 1 +I2C_CONTROLLER_DISABLED = 0 +MAX_SW_I2C_COMMANDS = 24 +CMDCONFIG_STOP_BIT = 0 +CMDCONFIG_RESTART_BIT = 1 +CMDCONFIG_READWRITE_BIT = 2 +CMDCONFIG_STOP_MASK = (1 << CMDCONFIG_STOP_BIT) +CMDCONFIG_RESTART_MASK = (1 << CMDCONFIG_RESTART_BIT) +CMDCONFIG_READWRITE_MASK = (1 << CMDCONFIG_READWRITE_BIT) +IH_INTERRUPT_ID_TO_DRIVER = 0xFE +IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING = 0x7 +THROTTLER_PROCHOT_BIT = 0 +THROTTLER_PPT_BIT = 1 +THROTTLER_THERMAL_SOCKET_BIT = 2 +THROTTLER_THERMAL_VR_BIT = 3 +THROTTLER_THERMAL_HBM_BIT = 4 +ClearMcaOnRead_UE_FLAG_MASK = 0x1 +ClearMcaOnRead_CE_POLL_MASK = 0x2 +SMU_THERMAL_MINIMUM_ALERT_TEMP = 0 +SMU_THERMAL_MAXIMUM_ALERT_TEMP = 255 +SMU_TEMPERATURE_UNITS_PER_CENTIGRADES = 1000 +SMU_FW_NAME_LEN = 0x24 +SMU_DPM_USER_PROFILE_RESTORE = (1 << 0) +SMU_CUSTOM_FAN_SPEED_RPM = (1 << 1) +SMU_CUSTOM_FAN_SPEED_PWM = (1 << 2) +SMU_THROTTLER_PPT0_BIT = 0 +SMU_THROTTLER_PPT1_BIT = 1 +SMU_THROTTLER_PPT2_BIT = 2 +SMU_THROTTLER_PPT3_BIT = 3 +SMU_THROTTLER_SPL_BIT = 4 +SMU_THROTTLER_FPPT_BIT = 5 +SMU_THROTTLER_SPPT_BIT = 6 +SMU_THROTTLER_SPPT_APU_BIT = 7 +SMU_THROTTLER_TDC_GFX_BIT = 16 +SMU_THROTTLER_TDC_SOC_BIT = 17 +SMU_THROTTLER_TDC_MEM_BIT = 18 +SMU_THROTTLER_TDC_VDD_BIT = 19 +SMU_THROTTLER_TDC_CVIP_BIT = 20 +SMU_THROTTLER_EDC_CPU_BIT = 21 +SMU_THROTTLER_EDC_GFX_BIT = 22 +SMU_THROTTLER_APCC_BIT = 23 +SMU_THROTTLER_TEMP_GPU_BIT = 32 +SMU_THROTTLER_TEMP_CORE_BIT = 33 +SMU_THROTTLER_TEMP_MEM_BIT = 34 +SMU_THROTTLER_TEMP_EDGE_BIT = 35 +SMU_THROTTLER_TEMP_HOTSPOT_BIT = 36 +SMU_THROTTLER_TEMP_SOC_BIT = 37 +SMU_THROTTLER_TEMP_VR_GFX_BIT = 38 +SMU_THROTTLER_TEMP_VR_SOC_BIT = 39 +SMU_THROTTLER_TEMP_VR_MEM0_BIT = 40 +SMU_THROTTLER_TEMP_VR_MEM1_BIT = 41 +SMU_THROTTLER_TEMP_LIQUID0_BIT = 42 +SMU_THROTTLER_TEMP_LIQUID1_BIT = 43 +SMU_THROTTLER_VRHOT0_BIT = 44 +SMU_THROTTLER_VRHOT1_BIT = 45 +SMU_THROTTLER_PROCHOT_CPU_BIT = 46 +SMU_THROTTLER_PROCHOT_GFX_BIT = 47 +SMU_THROTTLER_PPM_BIT = 56 +SMU_THROTTLER_FIT_BIT = 57 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_6.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_6.py new file mode 100644 index 000000000..ad0f55741 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_13_0_6.py @@ -0,0 +1,617 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +PPSMC_Result: TypeAlias = ctypes.c_uint32 +PPSMC_MSG: TypeAlias = ctypes.c_uint32 +FEATURE_LIST_e: dict[int, str] = {(FEATURE_DATA_CALCULATION:=0): 'FEATURE_DATA_CALCULATION', (FEATURE_DPM_CCLK:=1): 'FEATURE_DPM_CCLK', (FEATURE_DPM_FCLK:=2): 'FEATURE_DPM_FCLK', (FEATURE_DPM_GFXCLK:=3): 'FEATURE_DPM_GFXCLK', (FEATURE_DPM_LCLK:=4): 'FEATURE_DPM_LCLK', (FEATURE_DPM_SOCCLK:=5): 'FEATURE_DPM_SOCCLK', (FEATURE_DPM_UCLK:=6): 'FEATURE_DPM_UCLK', (FEATURE_DPM_VCN:=7): 'FEATURE_DPM_VCN', (FEATURE_DPM_XGMI:=8): 'FEATURE_DPM_XGMI', (FEATURE_DS_FCLK:=9): 'FEATURE_DS_FCLK', (FEATURE_DS_GFXCLK:=10): 'FEATURE_DS_GFXCLK', (FEATURE_DS_LCLK:=11): 'FEATURE_DS_LCLK', (FEATURE_DS_MP0CLK:=12): 'FEATURE_DS_MP0CLK', (FEATURE_DS_MP1CLK:=13): 'FEATURE_DS_MP1CLK', (FEATURE_DS_MPIOCLK:=14): 'FEATURE_DS_MPIOCLK', (FEATURE_DS_SOCCLK:=15): 'FEATURE_DS_SOCCLK', (FEATURE_DS_VCN:=16): 'FEATURE_DS_VCN', (FEATURE_APCC_DFLL:=17): 'FEATURE_APCC_DFLL', (FEATURE_APCC_PLUS:=18): 'FEATURE_APCC_PLUS', (FEATURE_DF_CSTATE:=19): 'FEATURE_DF_CSTATE', (FEATURE_CC6:=20): 'FEATURE_CC6', (FEATURE_PC6:=21): 'FEATURE_PC6', (FEATURE_CPPC:=22): 'FEATURE_CPPC', (FEATURE_PPT:=23): 'FEATURE_PPT', (FEATURE_TDC:=24): 'FEATURE_TDC', (FEATURE_THERMAL:=25): 'FEATURE_THERMAL', (FEATURE_SOC_PCC:=26): 'FEATURE_SOC_PCC', (FEATURE_CCD_PCC:=27): 'FEATURE_CCD_PCC', (FEATURE_CCD_EDC:=28): 'FEATURE_CCD_EDC', (FEATURE_PROCHOT:=29): 'FEATURE_PROCHOT', (FEATURE_DVO_CCLK:=30): 'FEATURE_DVO_CCLK', (FEATURE_FDD_AID_HBM:=31): 'FEATURE_FDD_AID_HBM', (FEATURE_FDD_AID_SOC:=32): 'FEATURE_FDD_AID_SOC', (FEATURE_FDD_XCD_EDC:=33): 'FEATURE_FDD_XCD_EDC', (FEATURE_FDD_XCD_XVMIN:=34): 'FEATURE_FDD_XCD_XVMIN', (FEATURE_FW_CTF:=35): 'FEATURE_FW_CTF', (FEATURE_GFXOFF:=36): 'FEATURE_GFXOFF', (FEATURE_SMU_CG:=37): 'FEATURE_SMU_CG', (FEATURE_PSI7:=38): 'FEATURE_PSI7', (FEATURE_CSTATE_BOOST:=39): 'FEATURE_CSTATE_BOOST', (FEATURE_XGMI_PER_LINK_PWR_DOWN:=40): 'FEATURE_XGMI_PER_LINK_PWR_DOWN', (FEATURE_CXL_QOS:=41): 'FEATURE_CXL_QOS', (FEATURE_SOC_DC_RTC:=42): 'FEATURE_SOC_DC_RTC', (FEATURE_GFX_DC_RTC:=43): 'FEATURE_GFX_DC_RTC', (FEATURE_DVM_MIN_PSM:=44): 'FEATURE_DVM_MIN_PSM', (FEATURE_PRC:=45): 'FEATURE_PRC', (NUM_FEATURES:=46): 'NUM_FEATURES'} +PCIE_LINK_SPEED_INDEX_TABLE_e: dict[int, str] = {(PCIE_LINK_SPEED_INDEX_TABLE_GEN1:=0): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN1', (PCIE_LINK_SPEED_INDEX_TABLE_GEN2:=1): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN2', (PCIE_LINK_SPEED_INDEX_TABLE_GEN3:=2): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN3', (PCIE_LINK_SPEED_INDEX_TABLE_GEN4:=3): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN4', (PCIE_LINK_SPEED_INDEX_TABLE_GEN4_ESM:=4): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN4_ESM', (PCIE_LINK_SPEED_INDEX_TABLE_GEN5:=5): 'PCIE_LINK_SPEED_INDEX_TABLE_GEN5', (PCIE_LINK_SPEED_INDEX_TABLE_COUNT:=6): 'PCIE_LINK_SPEED_INDEX_TABLE_COUNT'} +GFX_GUARDBAND_e: dict[int, str] = {(VOLTAGE_COLD_0:=0): 'VOLTAGE_COLD_0', (VOLTAGE_COLD_1:=1): 'VOLTAGE_COLD_1', (VOLTAGE_COLD_2:=2): 'VOLTAGE_COLD_2', (VOLTAGE_COLD_3:=3): 'VOLTAGE_COLD_3', (VOLTAGE_COLD_4:=4): 'VOLTAGE_COLD_4', (VOLTAGE_COLD_5:=5): 'VOLTAGE_COLD_5', (VOLTAGE_COLD_6:=6): 'VOLTAGE_COLD_6', (VOLTAGE_COLD_7:=7): 'VOLTAGE_COLD_7', (VOLTAGE_MID_0:=8): 'VOLTAGE_MID_0', (VOLTAGE_MID_1:=9): 'VOLTAGE_MID_1', (VOLTAGE_MID_2:=10): 'VOLTAGE_MID_2', (VOLTAGE_MID_3:=11): 'VOLTAGE_MID_3', (VOLTAGE_MID_4:=12): 'VOLTAGE_MID_4', (VOLTAGE_MID_5:=13): 'VOLTAGE_MID_5', (VOLTAGE_MID_6:=14): 'VOLTAGE_MID_6', (VOLTAGE_MID_7:=15): 'VOLTAGE_MID_7', (VOLTAGE_HOT_0:=16): 'VOLTAGE_HOT_0', (VOLTAGE_HOT_1:=17): 'VOLTAGE_HOT_1', (VOLTAGE_HOT_2:=18): 'VOLTAGE_HOT_2', (VOLTAGE_HOT_3:=19): 'VOLTAGE_HOT_3', (VOLTAGE_HOT_4:=20): 'VOLTAGE_HOT_4', (VOLTAGE_HOT_5:=21): 'VOLTAGE_HOT_5', (VOLTAGE_HOT_6:=22): 'VOLTAGE_HOT_6', (VOLTAGE_HOT_7:=23): 'VOLTAGE_HOT_7', (VOLTAGE_GUARDBAND_COUNT:=24): 'VOLTAGE_GUARDBAND_COUNT'} +@c.record +class MetricsTableV0_t(c.Struct): + SIZE = 2268 + AccumulationCounter: int + MaxSocketTemperature: int + MaxVrTemperature: int + MaxHbmTemperature: int + MaxSocketTemperatureAcc: int + MaxVrTemperatureAcc: int + MaxHbmTemperatureAcc: int + SocketPowerLimit: int + MaxSocketPowerLimit: int + SocketPower: int + Timestamp: int + SocketEnergyAcc: int + CcdEnergyAcc: int + XcdEnergyAcc: int + AidEnergyAcc: int + HbmEnergyAcc: int + CclkFrequencyLimit: int + GfxclkFrequencyLimit: int + FclkFrequency: int + UclkFrequency: int + SocclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + VclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + DclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + LclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + GfxclkFrequencyAcc: c.Array[ctypes.c_uint64, Literal[8]] + CclkFrequencyAcc: c.Array[ctypes.c_uint64, Literal[96]] + MaxCclkFrequency: int + MinCclkFrequency: int + MaxGfxclkFrequency: int + MinGfxclkFrequency: int + FclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + UclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + SocclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + VclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + DclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + LclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + MaxLclkDpmRange: int + MinLclkDpmRange: int + XgmiWidth: int + XgmiBitrate: int + XgmiReadBandwidthAcc: c.Array[ctypes.c_uint64, Literal[8]] + XgmiWriteBandwidthAcc: c.Array[ctypes.c_uint64, Literal[8]] + SocketC0Residency: int + SocketGfxBusy: int + DramBandwidthUtilization: int + SocketC0ResidencyAcc: int + SocketGfxBusyAcc: int + DramBandwidthAcc: int + MaxDramBandwidth: int + DramBandwidthUtilizationAcc: int + PcieBandwidthAcc: c.Array[ctypes.c_uint64, Literal[4]] + ProchotResidencyAcc: int + PptResidencyAcc: int + SocketThmResidencyAcc: int + VrThmResidencyAcc: int + HbmThmResidencyAcc: int + GfxLockXCDMak: int + GfxclkFrequency: c.Array[ctypes.c_uint32, Literal[8]] + PublicSerialNumber_AID: c.Array[ctypes.c_uint64, Literal[4]] + PublicSerialNumber_XCD: c.Array[ctypes.c_uint64, Literal[8]] + PublicSerialNumber_CCD: c.Array[ctypes.c_uint64, Literal[12]] + XgmiReadDataSizeAcc: c.Array[ctypes.c_uint64, Literal[8]] + XgmiWriteDataSizeAcc: c.Array[ctypes.c_uint64, Literal[8]] + PcieBandwidth: c.Array[ctypes.c_uint32, Literal[4]] + PCIeL0ToRecoveryCountAcc: int + PCIenReplayAAcc: int + PCIenReplayARolloverCountAcc: int + PCIeNAKSentCountAcc: int + PCIeNAKReceivedCountAcc: int + VcnBusy: c.Array[ctypes.c_uint32, Literal[4]] + JpegBusy: c.Array[ctypes.c_uint32, Literal[32]] + PCIeLinkSpeed: int + PCIeLinkWidth: int + GfxBusy: c.Array[ctypes.c_uint32, Literal[8]] + GfxBusyAcc: c.Array[ctypes.c_uint64, Literal[8]] + PCIeOtherEndRecoveryAcc: int + GfxclkBelowHostLimitPptAcc: c.Array[ctypes.c_uint64, Literal[8]] + GfxclkBelowHostLimitThmAcc: c.Array[ctypes.c_uint64, Literal[8]] + GfxclkBelowHostLimitTotalAcc: c.Array[ctypes.c_uint64, Literal[8]] + GfxclkLowUtilizationAcc: c.Array[ctypes.c_uint64, Literal[8]] +uint32_t: TypeAlias = ctypes.c_uint32 +uint64_t: TypeAlias = ctypes.c_uint64 +MetricsTableV0_t.register_fields([('AccumulationCounter', uint32_t, 0), ('MaxSocketTemperature', uint32_t, 4), ('MaxVrTemperature', uint32_t, 8), ('MaxHbmTemperature', uint32_t, 12), ('MaxSocketTemperatureAcc', uint64_t, 16), ('MaxVrTemperatureAcc', uint64_t, 24), ('MaxHbmTemperatureAcc', uint64_t, 32), ('SocketPowerLimit', uint32_t, 40), ('MaxSocketPowerLimit', uint32_t, 44), ('SocketPower', uint32_t, 48), ('Timestamp', uint64_t, 52), ('SocketEnergyAcc', uint64_t, 60), ('CcdEnergyAcc', uint64_t, 68), ('XcdEnergyAcc', uint64_t, 76), ('AidEnergyAcc', uint64_t, 84), ('HbmEnergyAcc', uint64_t, 92), ('CclkFrequencyLimit', uint32_t, 100), ('GfxclkFrequencyLimit', uint32_t, 104), ('FclkFrequency', uint32_t, 108), ('UclkFrequency', uint32_t, 112), ('SocclkFrequency', c.Array[uint32_t, Literal[4]], 116), ('VclkFrequency', c.Array[uint32_t, Literal[4]], 132), ('DclkFrequency', c.Array[uint32_t, Literal[4]], 148), ('LclkFrequency', c.Array[uint32_t, Literal[4]], 164), ('GfxclkFrequencyAcc', c.Array[uint64_t, Literal[8]], 180), ('CclkFrequencyAcc', c.Array[uint64_t, Literal[96]], 244), ('MaxCclkFrequency', uint32_t, 1012), ('MinCclkFrequency', uint32_t, 1016), ('MaxGfxclkFrequency', uint32_t, 1020), ('MinGfxclkFrequency', uint32_t, 1024), ('FclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1028), ('UclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1044), ('SocclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1060), ('VclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1076), ('DclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1092), ('LclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1108), ('MaxLclkDpmRange', uint32_t, 1124), ('MinLclkDpmRange', uint32_t, 1128), ('XgmiWidth', uint32_t, 1132), ('XgmiBitrate', uint32_t, 1136), ('XgmiReadBandwidthAcc', c.Array[uint64_t, Literal[8]], 1140), ('XgmiWriteBandwidthAcc', c.Array[uint64_t, Literal[8]], 1204), ('SocketC0Residency', uint32_t, 1268), ('SocketGfxBusy', uint32_t, 1272), ('DramBandwidthUtilization', uint32_t, 1276), ('SocketC0ResidencyAcc', uint64_t, 1280), ('SocketGfxBusyAcc', uint64_t, 1288), ('DramBandwidthAcc', uint64_t, 1296), ('MaxDramBandwidth', uint32_t, 1304), ('DramBandwidthUtilizationAcc', uint64_t, 1308), ('PcieBandwidthAcc', c.Array[uint64_t, Literal[4]], 1316), ('ProchotResidencyAcc', uint32_t, 1348), ('PptResidencyAcc', uint32_t, 1352), ('SocketThmResidencyAcc', uint32_t, 1356), ('VrThmResidencyAcc', uint32_t, 1360), ('HbmThmResidencyAcc', uint32_t, 1364), ('GfxLockXCDMak', uint32_t, 1368), ('GfxclkFrequency', c.Array[uint32_t, Literal[8]], 1372), ('PublicSerialNumber_AID', c.Array[uint64_t, Literal[4]], 1404), ('PublicSerialNumber_XCD', c.Array[uint64_t, Literal[8]], 1436), ('PublicSerialNumber_CCD', c.Array[uint64_t, Literal[12]], 1500), ('XgmiReadDataSizeAcc', c.Array[uint64_t, Literal[8]], 1596), ('XgmiWriteDataSizeAcc', c.Array[uint64_t, Literal[8]], 1660), ('PcieBandwidth', c.Array[uint32_t, Literal[4]], 1724), ('PCIeL0ToRecoveryCountAcc', uint32_t, 1740), ('PCIenReplayAAcc', uint32_t, 1744), ('PCIenReplayARolloverCountAcc', uint32_t, 1748), ('PCIeNAKSentCountAcc', uint32_t, 1752), ('PCIeNAKReceivedCountAcc', uint32_t, 1756), ('VcnBusy', c.Array[uint32_t, Literal[4]], 1760), ('JpegBusy', c.Array[uint32_t, Literal[32]], 1776), ('PCIeLinkSpeed', uint32_t, 1904), ('PCIeLinkWidth', uint32_t, 1908), ('GfxBusy', c.Array[uint32_t, Literal[8]], 1912), ('GfxBusyAcc', c.Array[uint64_t, Literal[8]], 1944), ('PCIeOtherEndRecoveryAcc', uint32_t, 2008), ('GfxclkBelowHostLimitPptAcc', c.Array[uint64_t, Literal[8]], 2012), ('GfxclkBelowHostLimitThmAcc', c.Array[uint64_t, Literal[8]], 2076), ('GfxclkBelowHostLimitTotalAcc', c.Array[uint64_t, Literal[8]], 2140), ('GfxclkLowUtilizationAcc', c.Array[uint64_t, Literal[8]], 2204)]) +@c.record +class MetricsTableV1_t(c.Struct): + SIZE = 1868 + AccumulationCounter: int + MaxSocketTemperature: int + MaxVrTemperature: int + MaxHbmTemperature: int + MaxSocketTemperatureAcc: int + MaxVrTemperatureAcc: int + MaxHbmTemperatureAcc: int + SocketPowerLimit: int + MaxSocketPowerLimit: int + SocketPower: int + Timestamp: int + SocketEnergyAcc: int + CcdEnergyAcc: int + XcdEnergyAcc: int + AidEnergyAcc: int + HbmEnergyAcc: int + CclkFrequencyLimit: int + GfxclkFrequencyLimit: int + FclkFrequency: int + UclkFrequency: int + SocclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + VclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + DclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + LclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + GfxclkFrequencyAcc: c.Array[ctypes.c_uint64, Literal[8]] + CclkFrequencyAcc: c.Array[ctypes.c_uint64, Literal[96]] + MaxCclkFrequency: int + MinCclkFrequency: int + MaxGfxclkFrequency: int + MinGfxclkFrequency: int + FclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + UclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + SocclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + VclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + DclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + LclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + MaxLclkDpmRange: int + MinLclkDpmRange: int + XgmiWidth: int + XgmiBitrate: int + XgmiReadBandwidthAcc: c.Array[ctypes.c_uint64, Literal[8]] + XgmiWriteBandwidthAcc: c.Array[ctypes.c_uint64, Literal[8]] + SocketC0Residency: int + SocketGfxBusy: int + DramBandwidthUtilization: int + SocketC0ResidencyAcc: int + SocketGfxBusyAcc: int + DramBandwidthAcc: int + MaxDramBandwidth: int + DramBandwidthUtilizationAcc: int + PcieBandwidthAcc: c.Array[ctypes.c_uint64, Literal[4]] + ProchotResidencyAcc: int + PptResidencyAcc: int + SocketThmResidencyAcc: int + VrThmResidencyAcc: int + HbmThmResidencyAcc: int + GfxLockXCDMak: int + GfxclkFrequency: c.Array[ctypes.c_uint32, Literal[8]] + PublicSerialNumber_AID: c.Array[ctypes.c_uint64, Literal[4]] + PublicSerialNumber_XCD: c.Array[ctypes.c_uint64, Literal[8]] + PublicSerialNumber_CCD: c.Array[ctypes.c_uint64, Literal[12]] + XgmiReadDataSizeAcc: c.Array[ctypes.c_uint64, Literal[8]] + XgmiWriteDataSizeAcc: c.Array[ctypes.c_uint64, Literal[8]] + VcnBusy: c.Array[ctypes.c_uint32, Literal[4]] + JpegBusy: c.Array[ctypes.c_uint32, Literal[32]] +MetricsTableV1_t.register_fields([('AccumulationCounter', uint32_t, 0), ('MaxSocketTemperature', uint32_t, 4), ('MaxVrTemperature', uint32_t, 8), ('MaxHbmTemperature', uint32_t, 12), ('MaxSocketTemperatureAcc', uint64_t, 16), ('MaxVrTemperatureAcc', uint64_t, 24), ('MaxHbmTemperatureAcc', uint64_t, 32), ('SocketPowerLimit', uint32_t, 40), ('MaxSocketPowerLimit', uint32_t, 44), ('SocketPower', uint32_t, 48), ('Timestamp', uint64_t, 52), ('SocketEnergyAcc', uint64_t, 60), ('CcdEnergyAcc', uint64_t, 68), ('XcdEnergyAcc', uint64_t, 76), ('AidEnergyAcc', uint64_t, 84), ('HbmEnergyAcc', uint64_t, 92), ('CclkFrequencyLimit', uint32_t, 100), ('GfxclkFrequencyLimit', uint32_t, 104), ('FclkFrequency', uint32_t, 108), ('UclkFrequency', uint32_t, 112), ('SocclkFrequency', c.Array[uint32_t, Literal[4]], 116), ('VclkFrequency', c.Array[uint32_t, Literal[4]], 132), ('DclkFrequency', c.Array[uint32_t, Literal[4]], 148), ('LclkFrequency', c.Array[uint32_t, Literal[4]], 164), ('GfxclkFrequencyAcc', c.Array[uint64_t, Literal[8]], 180), ('CclkFrequencyAcc', c.Array[uint64_t, Literal[96]], 244), ('MaxCclkFrequency', uint32_t, 1012), ('MinCclkFrequency', uint32_t, 1016), ('MaxGfxclkFrequency', uint32_t, 1020), ('MinGfxclkFrequency', uint32_t, 1024), ('FclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1028), ('UclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1044), ('SocclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1060), ('VclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1076), ('DclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1092), ('LclkFrequencyTable', c.Array[uint32_t, Literal[4]], 1108), ('MaxLclkDpmRange', uint32_t, 1124), ('MinLclkDpmRange', uint32_t, 1128), ('XgmiWidth', uint32_t, 1132), ('XgmiBitrate', uint32_t, 1136), ('XgmiReadBandwidthAcc', c.Array[uint64_t, Literal[8]], 1140), ('XgmiWriteBandwidthAcc', c.Array[uint64_t, Literal[8]], 1204), ('SocketC0Residency', uint32_t, 1268), ('SocketGfxBusy', uint32_t, 1272), ('DramBandwidthUtilization', uint32_t, 1276), ('SocketC0ResidencyAcc', uint64_t, 1280), ('SocketGfxBusyAcc', uint64_t, 1288), ('DramBandwidthAcc', uint64_t, 1296), ('MaxDramBandwidth', uint32_t, 1304), ('DramBandwidthUtilizationAcc', uint64_t, 1308), ('PcieBandwidthAcc', c.Array[uint64_t, Literal[4]], 1316), ('ProchotResidencyAcc', uint32_t, 1348), ('PptResidencyAcc', uint32_t, 1352), ('SocketThmResidencyAcc', uint32_t, 1356), ('VrThmResidencyAcc', uint32_t, 1360), ('HbmThmResidencyAcc', uint32_t, 1364), ('GfxLockXCDMak', uint32_t, 1368), ('GfxclkFrequency', c.Array[uint32_t, Literal[8]], 1372), ('PublicSerialNumber_AID', c.Array[uint64_t, Literal[4]], 1404), ('PublicSerialNumber_XCD', c.Array[uint64_t, Literal[8]], 1436), ('PublicSerialNumber_CCD', c.Array[uint64_t, Literal[12]], 1500), ('XgmiReadDataSizeAcc', c.Array[uint64_t, Literal[8]], 1596), ('XgmiWriteDataSizeAcc', c.Array[uint64_t, Literal[8]], 1660), ('VcnBusy', c.Array[uint32_t, Literal[4]], 1724), ('JpegBusy', c.Array[uint32_t, Literal[32]], 1740)]) +@c.record +class MetricsTableV2_t(c.Struct): + SIZE = 1200 + AccumulationCounter: int + MaxSocketTemperature: int + MaxVrTemperature: int + MaxHbmTemperature: int + MaxSocketTemperatureAcc: int + MaxVrTemperatureAcc: int + MaxHbmTemperatureAcc: int + SocketPowerLimit: int + MaxSocketPowerLimit: int + SocketPower: int + Timestamp: int + SocketEnergyAcc: int + CcdEnergyAcc: int + XcdEnergyAcc: int + AidEnergyAcc: int + HbmEnergyAcc: int + GfxclkFrequencyLimit: int + FclkFrequency: int + UclkFrequency: int + SocclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + VclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + DclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + LclkFrequency: c.Array[ctypes.c_uint32, Literal[4]] + GfxclkFrequencyAcc: c.Array[ctypes.c_uint64, Literal[8]] + MaxGfxclkFrequency: int + MinGfxclkFrequency: int + FclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + UclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + SocclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + VclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + DclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + LclkFrequencyTable: c.Array[ctypes.c_uint32, Literal[4]] + MaxLclkDpmRange: int + MinLclkDpmRange: int + XgmiWidth: int + XgmiBitrate: int + XgmiReadBandwidthAcc: c.Array[ctypes.c_uint64, Literal[8]] + XgmiWriteBandwidthAcc: c.Array[ctypes.c_uint64, Literal[8]] + SocketGfxBusy: int + DramBandwidthUtilization: int + SocketC0ResidencyAcc: int + SocketGfxBusyAcc: int + DramBandwidthAcc: int + MaxDramBandwidth: int + DramBandwidthUtilizationAcc: int + PcieBandwidthAcc: c.Array[ctypes.c_uint64, Literal[4]] + ProchotResidencyAcc: int + PptResidencyAcc: int + SocketThmResidencyAcc: int + VrThmResidencyAcc: int + HbmThmResidencyAcc: int + GfxLockXCDMak: int + GfxclkFrequency: c.Array[ctypes.c_uint32, Literal[8]] + PublicSerialNumber_AID: c.Array[ctypes.c_uint64, Literal[4]] + PublicSerialNumber_XCD: c.Array[ctypes.c_uint64, Literal[8]] + XgmiReadDataSizeAcc: c.Array[ctypes.c_uint64, Literal[8]] + XgmiWriteDataSizeAcc: c.Array[ctypes.c_uint64, Literal[8]] + PcieBandwidth: c.Array[ctypes.c_uint32, Literal[4]] + PCIeL0ToRecoveryCountAcc: int + PCIenReplayAAcc: int + PCIenReplayARolloverCountAcc: int + PCIeNAKSentCountAcc: int + PCIeNAKReceivedCountAcc: int + VcnBusy: c.Array[ctypes.c_uint32, Literal[4]] + JpegBusy: c.Array[ctypes.c_uint32, Literal[32]] + PCIeLinkSpeed: int + PCIeLinkWidth: int + GfxBusy: c.Array[ctypes.c_uint32, Literal[8]] + GfxBusyAcc: c.Array[ctypes.c_uint64, Literal[8]] + PCIeOtherEndRecoveryAcc: int + GfxclkBelowHostLimitAcc: c.Array[ctypes.c_uint64, Literal[8]] +MetricsTableV2_t.register_fields([('AccumulationCounter', uint64_t, 0), ('MaxSocketTemperature', uint32_t, 8), ('MaxVrTemperature', uint32_t, 12), ('MaxHbmTemperature', uint32_t, 16), ('MaxSocketTemperatureAcc', uint64_t, 20), ('MaxVrTemperatureAcc', uint64_t, 28), ('MaxHbmTemperatureAcc', uint64_t, 36), ('SocketPowerLimit', uint32_t, 44), ('MaxSocketPowerLimit', uint32_t, 48), ('SocketPower', uint32_t, 52), ('Timestamp', uint64_t, 56), ('SocketEnergyAcc', uint64_t, 64), ('CcdEnergyAcc', uint64_t, 72), ('XcdEnergyAcc', uint64_t, 80), ('AidEnergyAcc', uint64_t, 88), ('HbmEnergyAcc', uint64_t, 96), ('GfxclkFrequencyLimit', uint32_t, 104), ('FclkFrequency', uint32_t, 108), ('UclkFrequency', uint32_t, 112), ('SocclkFrequency', c.Array[uint32_t, Literal[4]], 116), ('VclkFrequency', c.Array[uint32_t, Literal[4]], 132), ('DclkFrequency', c.Array[uint32_t, Literal[4]], 148), ('LclkFrequency', c.Array[uint32_t, Literal[4]], 164), ('GfxclkFrequencyAcc', c.Array[uint64_t, Literal[8]], 180), ('MaxGfxclkFrequency', uint32_t, 244), ('MinGfxclkFrequency', uint32_t, 248), ('FclkFrequencyTable', c.Array[uint32_t, Literal[4]], 252), ('UclkFrequencyTable', c.Array[uint32_t, Literal[4]], 268), ('SocclkFrequencyTable', c.Array[uint32_t, Literal[4]], 284), ('VclkFrequencyTable', c.Array[uint32_t, Literal[4]], 300), ('DclkFrequencyTable', c.Array[uint32_t, Literal[4]], 316), ('LclkFrequencyTable', c.Array[uint32_t, Literal[4]], 332), ('MaxLclkDpmRange', uint32_t, 348), ('MinLclkDpmRange', uint32_t, 352), ('XgmiWidth', uint32_t, 356), ('XgmiBitrate', uint32_t, 360), ('XgmiReadBandwidthAcc', c.Array[uint64_t, Literal[8]], 364), ('XgmiWriteBandwidthAcc', c.Array[uint64_t, Literal[8]], 428), ('SocketGfxBusy', uint32_t, 492), ('DramBandwidthUtilization', uint32_t, 496), ('SocketC0ResidencyAcc', uint64_t, 500), ('SocketGfxBusyAcc', uint64_t, 508), ('DramBandwidthAcc', uint64_t, 516), ('MaxDramBandwidth', uint32_t, 524), ('DramBandwidthUtilizationAcc', uint64_t, 528), ('PcieBandwidthAcc', c.Array[uint64_t, Literal[4]], 536), ('ProchotResidencyAcc', uint32_t, 568), ('PptResidencyAcc', uint32_t, 572), ('SocketThmResidencyAcc', uint32_t, 576), ('VrThmResidencyAcc', uint32_t, 580), ('HbmThmResidencyAcc', uint32_t, 584), ('GfxLockXCDMak', uint32_t, 588), ('GfxclkFrequency', c.Array[uint32_t, Literal[8]], 592), ('PublicSerialNumber_AID', c.Array[uint64_t, Literal[4]], 624), ('PublicSerialNumber_XCD', c.Array[uint64_t, Literal[8]], 656), ('XgmiReadDataSizeAcc', c.Array[uint64_t, Literal[8]], 720), ('XgmiWriteDataSizeAcc', c.Array[uint64_t, Literal[8]], 784), ('PcieBandwidth', c.Array[uint32_t, Literal[4]], 848), ('PCIeL0ToRecoveryCountAcc', uint32_t, 864), ('PCIenReplayAAcc', uint32_t, 868), ('PCIenReplayARolloverCountAcc', uint32_t, 872), ('PCIeNAKSentCountAcc', uint32_t, 876), ('PCIeNAKReceivedCountAcc', uint32_t, 880), ('VcnBusy', c.Array[uint32_t, Literal[4]], 884), ('JpegBusy', c.Array[uint32_t, Literal[32]], 900), ('PCIeLinkSpeed', uint32_t, 1028), ('PCIeLinkWidth', uint32_t, 1032), ('GfxBusy', c.Array[uint32_t, Literal[8]], 1036), ('GfxBusyAcc', c.Array[uint64_t, Literal[8]], 1068), ('PCIeOtherEndRecoveryAcc', uint32_t, 1132), ('GfxclkBelowHostLimitAcc', c.Array[uint64_t, Literal[8]], 1136)]) +@c.record +class VfMetricsTable_t(c.Struct): + SIZE = 32 + AccumulationCounter: int + InstGfxclk_TargFreq: int + AccGfxclk_TargFreq: int + AccGfxRsmuDpm_Busy: int + AccGfxclkBelowHostLimit: int +VfMetricsTable_t.register_fields([('AccumulationCounter', uint32_t, 0), ('InstGfxclk_TargFreq', uint32_t, 4), ('AccGfxclk_TargFreq', uint64_t, 8), ('AccGfxRsmuDpm_Busy', uint64_t, 16), ('AccGfxclkBelowHostLimit', uint64_t, 24)]) +@c.record +class StaticMetricsTable_t(c.Struct): + SIZE = 12 + InputTelemetryVoltageInmV: int + pldmVersion: c.Array[ctypes.c_uint32, Literal[2]] +StaticMetricsTable_t.register_fields([('InputTelemetryVoltageInmV', uint32_t, 0), ('pldmVersion', c.Array[uint32_t, Literal[2]], 4)]) +I2cControllerPort_e: dict[int, str] = {(I2C_CONTROLLER_PORT_0:=0): 'I2C_CONTROLLER_PORT_0', (I2C_CONTROLLER_PORT_1:=1): 'I2C_CONTROLLER_PORT_1', (I2C_CONTROLLER_PORT_COUNT:=2): 'I2C_CONTROLLER_PORT_COUNT'} +I2cSpeed_e: dict[int, str] = {(UNSUPPORTED_1:=0): 'UNSUPPORTED_1', (I2C_SPEED_STANDARD_100K:=1): 'I2C_SPEED_STANDARD_100K', (I2C_SPEED_FAST_400K:=2): 'I2C_SPEED_FAST_400K', (I2C_SPEED_FAST_PLUS_1M:=3): 'I2C_SPEED_FAST_PLUS_1M', (UNSUPPORTED_2:=4): 'UNSUPPORTED_2', (UNSUPPORTED_3:=5): 'UNSUPPORTED_3', (I2C_SPEED_COUNT:=6): 'I2C_SPEED_COUNT'} +I2cCmdType_e: dict[int, str] = {(I2C_CMD_READ:=0): 'I2C_CMD_READ', (I2C_CMD_WRITE:=1): 'I2C_CMD_WRITE', (I2C_CMD_COUNT:=2): 'I2C_CMD_COUNT'} +ERR_CODE_e: dict[int, str] = {(CODE_DAGB0:=0): 'CODE_DAGB0', (CODE_EA0:=5): 'CODE_EA0', (CODE_UTCL2_ROUTER:=10): 'CODE_UTCL2_ROUTER', (CODE_VML2:=11): 'CODE_VML2', (CODE_VML2_WALKER:=12): 'CODE_VML2_WALKER', (CODE_MMCANE:=13): 'CODE_MMCANE', (CODE_VIDD:=14): 'CODE_VIDD', (CODE_VIDV:=15): 'CODE_VIDV', (CODE_JPEG0S:=16): 'CODE_JPEG0S', (CODE_JPEG0D:=17): 'CODE_JPEG0D', (CODE_JPEG1S:=18): 'CODE_JPEG1S', (CODE_JPEG1D:=19): 'CODE_JPEG1D', (CODE_JPEG2S:=20): 'CODE_JPEG2S', (CODE_JPEG2D:=21): 'CODE_JPEG2D', (CODE_JPEG3S:=22): 'CODE_JPEG3S', (CODE_JPEG3D:=23): 'CODE_JPEG3D', (CODE_JPEG4S:=24): 'CODE_JPEG4S', (CODE_JPEG4D:=25): 'CODE_JPEG4D', (CODE_JPEG5S:=26): 'CODE_JPEG5S', (CODE_JPEG5D:=27): 'CODE_JPEG5D', (CODE_JPEG6S:=28): 'CODE_JPEG6S', (CODE_JPEG6D:=29): 'CODE_JPEG6D', (CODE_JPEG7S:=30): 'CODE_JPEG7S', (CODE_JPEG7D:=31): 'CODE_JPEG7D', (CODE_MMSCHD:=32): 'CODE_MMSCHD', (CODE_SDMA0:=33): 'CODE_SDMA0', (CODE_SDMA1:=34): 'CODE_SDMA1', (CODE_SDMA2:=35): 'CODE_SDMA2', (CODE_SDMA3:=36): 'CODE_SDMA3', (CODE_HDP:=37): 'CODE_HDP', (CODE_ATHUB:=38): 'CODE_ATHUB', (CODE_IH:=39): 'CODE_IH', (CODE_XHUB_POISON:=40): 'CODE_XHUB_POISON', (CODE_SMN_SLVERR:=40): 'CODE_SMN_SLVERR', (CODE_WDT:=41): 'CODE_WDT', (CODE_UNKNOWN:=42): 'CODE_UNKNOWN', (CODE_COUNT:=43): 'CODE_COUNT'} +GC_ERROR_CODE_e: dict[int, str] = {(SH_FED_CODE:=0): 'SH_FED_CODE', (GCEA_CODE:=1): 'GCEA_CODE', (SQ_CODE:=2): 'SQ_CODE', (LDS_CODE:=3): 'LDS_CODE', (GDS_CODE:=4): 'GDS_CODE', (SP0_CODE:=5): 'SP0_CODE', (SP1_CODE:=6): 'SP1_CODE', (TCC_CODE:=7): 'TCC_CODE', (TCA_CODE:=8): 'TCA_CODE', (TCX_CODE:=9): 'TCX_CODE', (CPC_CODE:=10): 'CPC_CODE', (CPF_CODE:=11): 'CPF_CODE', (CPG_CODE:=12): 'CPG_CODE', (SPI_CODE:=13): 'SPI_CODE', (RLC_CODE:=14): 'RLC_CODE', (SQC_CODE:=15): 'SQC_CODE', (TA_CODE:=16): 'TA_CODE', (TD_CODE:=17): 'TD_CODE', (TCP_CODE:=18): 'TCP_CODE', (TCI_CODE:=19): 'TCI_CODE', (GC_ROUTER_CODE:=20): 'GC_ROUTER_CODE', (VML2_CODE:=21): 'VML2_CODE', (VML2_WALKER_CODE:=22): 'VML2_WALKER_CODE', (ATCL2_CODE:=23): 'ATCL2_CODE', (GC_CANE_CODE:=24): 'GC_CANE_CODE', (MP5_CODE_SMN_SLVERR:=40): 'MP5_CODE_SMN_SLVERR', (MP5_CODE_UNKNOWN:=42): 'MP5_CODE_UNKNOWN'} +@c.record +class SwI2cCmd_t(c.Struct): + SIZE = 2 + ReadWriteData: int + CmdConfig: int +uint8_t: TypeAlias = ctypes.c_ubyte +SwI2cCmd_t.register_fields([('ReadWriteData', uint8_t, 0), ('CmdConfig', uint8_t, 1)]) +@c.record +class SwI2cRequest_t(c.Struct): + SIZE = 52 + I2CcontrollerPort: int + I2CSpeed: int + SlaveAddress: int + NumCmds: int + SwI2cCmds: c.Array[SwI2cCmd_t, Literal[24]] +SwI2cRequest_t.register_fields([('I2CcontrollerPort', uint8_t, 0), ('I2CSpeed', uint8_t, 1), ('SlaveAddress', uint8_t, 2), ('NumCmds', uint8_t, 3), ('SwI2cCmds', c.Array[SwI2cCmd_t, Literal[24]], 4)]) +@c.record +class SwI2cRequestExternal_t(c.Struct): + SIZE = 116 + SwI2cRequest: SwI2cRequest_t + Spare: c.Array[ctypes.c_uint32, Literal[8]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +SwI2cRequestExternal_t.register_fields([('SwI2cRequest', SwI2cRequest_t, 0), ('Spare', c.Array[uint32_t, Literal[8]], 52), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 84)]) +PPCLK_e: dict[int, str] = {(PPCLK_VCLK:=0): 'PPCLK_VCLK', (PPCLK_DCLK:=1): 'PPCLK_DCLK', (PPCLK_SOCCLK:=2): 'PPCLK_SOCCLK', (PPCLK_UCLK:=3): 'PPCLK_UCLK', (PPCLK_FCLK:=4): 'PPCLK_FCLK', (PPCLK_LCLK:=5): 'PPCLK_LCLK', (PPCLK_COUNT:=6): 'PPCLK_COUNT'} +GpioIntPolarity_e: dict[int, str] = {(GPIO_INT_POLARITY_ACTIVE_LOW:=0): 'GPIO_INT_POLARITY_ACTIVE_LOW', (GPIO_INT_POLARITY_ACTIVE_HIGH:=1): 'GPIO_INT_POLARITY_ACTIVE_HIGH'} +UCLK_DPM_MODE_e: dict[int, str] = {(UCLK_DPM_MODE_BANDWIDTH:=0): 'UCLK_DPM_MODE_BANDWIDTH', (UCLK_DPM_MODE_LATENCY:=1): 'UCLK_DPM_MODE_LATENCY'} +@c.record +class AvfsDebugTableAid_t(c.Struct): + SIZE = 360 + avgPsmCount: c.Array[ctypes.c_uint16, Literal[30]] + minPsmCount: c.Array[ctypes.c_uint16, Literal[30]] + avgPsmVoltage: c.Array[ctypes.c_float, Literal[30]] + minPsmVoltage: c.Array[ctypes.c_float, Literal[30]] +uint16_t: TypeAlias = ctypes.c_uint16 +AvfsDebugTableAid_t.register_fields([('avgPsmCount', c.Array[uint16_t, Literal[30]], 0), ('minPsmCount', c.Array[uint16_t, Literal[30]], 60), ('avgPsmVoltage', c.Array[ctypes.c_float, Literal[30]], 120), ('minPsmVoltage', c.Array[ctypes.c_float, Literal[30]], 240)]) +@c.record +class AvfsDebugTableXcd_t(c.Struct): + SIZE = 360 + avgPsmCount: c.Array[ctypes.c_uint16, Literal[30]] + minPsmCount: c.Array[ctypes.c_uint16, Literal[30]] + avgPsmVoltage: c.Array[ctypes.c_float, Literal[30]] + minPsmVoltage: c.Array[ctypes.c_float, Literal[30]] +AvfsDebugTableXcd_t.register_fields([('avgPsmCount', c.Array[uint16_t, Literal[30]], 0), ('minPsmCount', c.Array[uint16_t, Literal[30]], 60), ('avgPsmVoltage', c.Array[ctypes.c_float, Literal[30]], 120), ('minPsmVoltage', c.Array[ctypes.c_float, Literal[30]], 240)]) +@c.record +class struct_smu_hw_power_state(c.Struct): + SIZE = 4 + magic: int +struct_smu_hw_power_state.register_fields([('magic', ctypes.c_uint32, 0)]) +class struct_smu_power_state(c.Struct): pass +enum_smu_state_ui_label: dict[int, str] = {(SMU_STATE_UI_LABEL_NONE:=0): 'SMU_STATE_UI_LABEL_NONE', (SMU_STATE_UI_LABEL_BATTERY:=1): 'SMU_STATE_UI_LABEL_BATTERY', (SMU_STATE_UI_TABEL_MIDDLE_LOW:=2): 'SMU_STATE_UI_TABEL_MIDDLE_LOW', (SMU_STATE_UI_LABEL_BALLANCED:=3): 'SMU_STATE_UI_LABEL_BALLANCED', (SMU_STATE_UI_LABEL_MIDDLE_HIGHT:=4): 'SMU_STATE_UI_LABEL_MIDDLE_HIGHT', (SMU_STATE_UI_LABEL_PERFORMANCE:=5): 'SMU_STATE_UI_LABEL_PERFORMANCE', (SMU_STATE_UI_LABEL_BACO:=6): 'SMU_STATE_UI_LABEL_BACO'} +enum_smu_state_classification_flag: dict[int, str] = {(SMU_STATE_CLASSIFICATION_FLAG_BOOT:=1): 'SMU_STATE_CLASSIFICATION_FLAG_BOOT', (SMU_STATE_CLASSIFICATION_FLAG_THERMAL:=2): 'SMU_STATE_CLASSIFICATION_FLAG_THERMAL', (SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE:=4): 'SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE', (SMU_STATE_CLASSIFICATION_FLAG_RESET:=8): 'SMU_STATE_CLASSIFICATION_FLAG_RESET', (SMU_STATE_CLASSIFICATION_FLAG_FORCED:=16): 'SMU_STATE_CLASSIFICATION_FLAG_FORCED', (SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE:=32): 'SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE:=64): 'SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE:=128): 'SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE:=256): 'SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE', (SMU_STATE_CLASSIFICATION_FLAG_UVD:=512): 'SMU_STATE_CLASSIFICATION_FLAG_UVD', (SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW:=1024): 'SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW', (SMU_STATE_CLASSIFICATION_FLAG_ACPI:=2048): 'SMU_STATE_CLASSIFICATION_FLAG_ACPI', (SMU_STATE_CLASSIFICATION_FLAG_HD2:=4096): 'SMU_STATE_CLASSIFICATION_FLAG_HD2', (SMU_STATE_CLASSIFICATION_FLAG_UVD_HD:=8192): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_HD', (SMU_STATE_CLASSIFICATION_FLAG_UVD_SD:=16384): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_SD', (SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE:=32768): 'SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE:=65536): 'SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE', (SMU_STATE_CLASSIFICATION_FLAG_BACO:=131072): 'SMU_STATE_CLASSIFICATION_FLAG_BACO', (SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2:=262144): 'SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2', (SMU_STATE_CLASSIFICATION_FLAG_ULV:=524288): 'SMU_STATE_CLASSIFICATION_FLAG_ULV', (SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC:=1048576): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC'} +@c.record +class struct_smu_state_classification_block(c.Struct): + SIZE = 16 + ui_label: int + flags: int + bios_index: int + temporary_state: bool + to_be_deleted: bool +struct_smu_state_classification_block.register_fields([('ui_label', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('bios_index', ctypes.c_int32, 8), ('temporary_state', ctypes.c_bool, 12), ('to_be_deleted', ctypes.c_bool, 13)]) +@c.record +class struct_smu_state_pcie_block(c.Struct): + SIZE = 4 + lanes: int +struct_smu_state_pcie_block.register_fields([('lanes', ctypes.c_uint32, 0)]) +enum_smu_refreshrate_source: dict[int, str] = {(SMU_REFRESHRATE_SOURCE_EDID:=0): 'SMU_REFRESHRATE_SOURCE_EDID', (SMU_REFRESHRATE_SOURCE_EXPLICIT:=1): 'SMU_REFRESHRATE_SOURCE_EXPLICIT'} +@c.record +class struct_smu_state_display_block(c.Struct): + SIZE = 20 + disable_frame_modulation: bool + limit_refreshrate: bool + refreshrate_source: int + explicit_refreshrate: int + edid_refreshrate_index: int + enable_vari_bright: bool +struct_smu_state_display_block.register_fields([('disable_frame_modulation', ctypes.c_bool, 0), ('limit_refreshrate', ctypes.c_bool, 1), ('refreshrate_source', ctypes.c_uint32, 4), ('explicit_refreshrate', ctypes.c_int32, 8), ('edid_refreshrate_index', ctypes.c_int32, 12), ('enable_vari_bright', ctypes.c_bool, 16)]) +@c.record +class struct_smu_state_memory_block(c.Struct): + SIZE = 5 + dll_off: bool + m3arb: int + unused: c.Array[ctypes.c_ubyte, Literal[3]] +struct_smu_state_memory_block.register_fields([('dll_off', ctypes.c_bool, 0), ('m3arb', uint8_t, 1), ('unused', c.Array[uint8_t, Literal[3]], 2)]) +@c.record +class struct_smu_state_software_algorithm_block(c.Struct): + SIZE = 2 + disable_load_balancing: bool + enable_sleep_for_timestamps: bool +struct_smu_state_software_algorithm_block.register_fields([('disable_load_balancing', ctypes.c_bool, 0), ('enable_sleep_for_timestamps', ctypes.c_bool, 1)]) +@c.record +class struct_smu_temperature_range(c.Struct): + SIZE = 44 + min: int + max: int + edge_emergency_max: int + hotspot_min: int + hotspot_crit_max: int + hotspot_emergency_max: int + mem_min: int + mem_crit_max: int + mem_emergency_max: int + software_shutdown_temp: int + software_shutdown_temp_offset: int +struct_smu_temperature_range.register_fields([('min', ctypes.c_int32, 0), ('max', ctypes.c_int32, 4), ('edge_emergency_max', ctypes.c_int32, 8), ('hotspot_min', ctypes.c_int32, 12), ('hotspot_crit_max', ctypes.c_int32, 16), ('hotspot_emergency_max', ctypes.c_int32, 20), ('mem_min', ctypes.c_int32, 24), ('mem_crit_max', ctypes.c_int32, 28), ('mem_emergency_max', ctypes.c_int32, 32), ('software_shutdown_temp', ctypes.c_int32, 36), ('software_shutdown_temp_offset', ctypes.c_int32, 40)]) +@c.record +class struct_smu_state_validation_block(c.Struct): + SIZE = 3 + single_display_only: bool + disallow_on_dc: bool + supported_power_levels: int +struct_smu_state_validation_block.register_fields([('single_display_only', ctypes.c_bool, 0), ('disallow_on_dc', ctypes.c_bool, 1), ('supported_power_levels', uint8_t, 2)]) +@c.record +class struct_smu_uvd_clocks(c.Struct): + SIZE = 8 + vclk: int + dclk: int +struct_smu_uvd_clocks.register_fields([('vclk', uint32_t, 0), ('dclk', uint32_t, 4)]) +enum_smu_power_src_type: dict[int, str] = {(SMU_POWER_SOURCE_AC:=0): 'SMU_POWER_SOURCE_AC', (SMU_POWER_SOURCE_DC:=1): 'SMU_POWER_SOURCE_DC', (SMU_POWER_SOURCE_COUNT:=2): 'SMU_POWER_SOURCE_COUNT'} +enum_smu_ppt_limit_type: dict[int, str] = {(SMU_DEFAULT_PPT_LIMIT:=0): 'SMU_DEFAULT_PPT_LIMIT', (SMU_FAST_PPT_LIMIT:=1): 'SMU_FAST_PPT_LIMIT'} +enum_smu_ppt_limit_level: dict[int, str] = {(SMU_PPT_LIMIT_MIN:=-1): 'SMU_PPT_LIMIT_MIN', (SMU_PPT_LIMIT_CURRENT:=0): 'SMU_PPT_LIMIT_CURRENT', (SMU_PPT_LIMIT_DEFAULT:=1): 'SMU_PPT_LIMIT_DEFAULT', (SMU_PPT_LIMIT_MAX:=2): 'SMU_PPT_LIMIT_MAX'} +enum_smu_memory_pool_size: dict[int, str] = {(SMU_MEMORY_POOL_SIZE_ZERO:=0): 'SMU_MEMORY_POOL_SIZE_ZERO', (SMU_MEMORY_POOL_SIZE_256_MB:=268435456): 'SMU_MEMORY_POOL_SIZE_256_MB', (SMU_MEMORY_POOL_SIZE_512_MB:=536870912): 'SMU_MEMORY_POOL_SIZE_512_MB', (SMU_MEMORY_POOL_SIZE_1_GB:=1073741824): 'SMU_MEMORY_POOL_SIZE_1_GB', (SMU_MEMORY_POOL_SIZE_2_GB:=2147483648): 'SMU_MEMORY_POOL_SIZE_2_GB'} +enum_smu_clk_type: dict[int, str] = {(SMU_GFXCLK:=0): 'SMU_GFXCLK', (SMU_VCLK:=1): 'SMU_VCLK', (SMU_DCLK:=2): 'SMU_DCLK', (SMU_VCLK1:=3): 'SMU_VCLK1', (SMU_DCLK1:=4): 'SMU_DCLK1', (SMU_ECLK:=5): 'SMU_ECLK', (SMU_SOCCLK:=6): 'SMU_SOCCLK', (SMU_UCLK:=7): 'SMU_UCLK', (SMU_DCEFCLK:=8): 'SMU_DCEFCLK', (SMU_DISPCLK:=9): 'SMU_DISPCLK', (SMU_PIXCLK:=10): 'SMU_PIXCLK', (SMU_PHYCLK:=11): 'SMU_PHYCLK', (SMU_FCLK:=12): 'SMU_FCLK', (SMU_SCLK:=13): 'SMU_SCLK', (SMU_MCLK:=14): 'SMU_MCLK', (SMU_PCIE:=15): 'SMU_PCIE', (SMU_LCLK:=16): 'SMU_LCLK', (SMU_OD_CCLK:=17): 'SMU_OD_CCLK', (SMU_OD_SCLK:=18): 'SMU_OD_SCLK', (SMU_OD_MCLK:=19): 'SMU_OD_MCLK', (SMU_OD_VDDC_CURVE:=20): 'SMU_OD_VDDC_CURVE', (SMU_OD_RANGE:=21): 'SMU_OD_RANGE', (SMU_OD_VDDGFX_OFFSET:=22): 'SMU_OD_VDDGFX_OFFSET', (SMU_OD_FAN_CURVE:=23): 'SMU_OD_FAN_CURVE', (SMU_OD_ACOUSTIC_LIMIT:=24): 'SMU_OD_ACOUSTIC_LIMIT', (SMU_OD_ACOUSTIC_TARGET:=25): 'SMU_OD_ACOUSTIC_TARGET', (SMU_OD_FAN_TARGET_TEMPERATURE:=26): 'SMU_OD_FAN_TARGET_TEMPERATURE', (SMU_OD_FAN_MINIMUM_PWM:=27): 'SMU_OD_FAN_MINIMUM_PWM', (SMU_CLK_COUNT:=28): 'SMU_CLK_COUNT'} +@c.record +class struct_smu_user_dpm_profile(c.Struct): + SIZE = 140 + fan_mode: int + power_limit: int + fan_speed_pwm: int + fan_speed_rpm: int + flags: int + user_od: int + clk_mask: c.Array[ctypes.c_uint32, Literal[28]] + clk_dependency: int +struct_smu_user_dpm_profile.register_fields([('fan_mode', uint32_t, 0), ('power_limit', uint32_t, 4), ('fan_speed_pwm', uint32_t, 8), ('fan_speed_rpm', uint32_t, 12), ('flags', uint32_t, 16), ('user_od', uint32_t, 20), ('clk_mask', c.Array[uint32_t, Literal[28]], 24), ('clk_dependency', uint32_t, 136)]) +@c.record +class struct_smu_table(c.Struct): + SIZE = 48 + size: int + align: int + domain: int + mc_address: int + cpu_addr: ctypes.c_void_p + bo: c.POINTER[struct_amdgpu_bo] + version: int +class struct_amdgpu_bo(c.Struct): pass +struct_smu_table.register_fields([('size', uint64_t, 0), ('align', uint32_t, 8), ('domain', uint8_t, 12), ('mc_address', uint64_t, 16), ('cpu_addr', ctypes.c_void_p, 24), ('bo', c.POINTER[struct_amdgpu_bo], 32), ('version', uint32_t, 40)]) +enum_smu_perf_level_designation: dict[int, str] = {(PERF_LEVEL_ACTIVITY:=0): 'PERF_LEVEL_ACTIVITY', (PERF_LEVEL_POWER_CONTAINMENT:=1): 'PERF_LEVEL_POWER_CONTAINMENT'} +@c.record +class struct_smu_performance_level(c.Struct): + SIZE = 24 + core_clock: int + memory_clock: int + vddc: int + vddci: int + non_local_mem_freq: int + non_local_mem_width: int +struct_smu_performance_level.register_fields([('core_clock', uint32_t, 0), ('memory_clock', uint32_t, 4), ('vddc', uint32_t, 8), ('vddci', uint32_t, 12), ('non_local_mem_freq', uint32_t, 16), ('non_local_mem_width', uint32_t, 20)]) +@c.record +class struct_smu_clock_info(c.Struct): + SIZE = 24 + min_mem_clk: int + max_mem_clk: int + min_eng_clk: int + max_eng_clk: int + min_bus_bandwidth: int + max_bus_bandwidth: int +struct_smu_clock_info.register_fields([('min_mem_clk', uint32_t, 0), ('max_mem_clk', uint32_t, 4), ('min_eng_clk', uint32_t, 8), ('max_eng_clk', uint32_t, 12), ('min_bus_bandwidth', uint32_t, 16), ('max_bus_bandwidth', uint32_t, 20)]) +@c.record +class struct_smu_bios_boot_up_values(c.Struct): + SIZE = 68 + revision: int + gfxclk: int + uclk: int + socclk: int + dcefclk: int + eclk: int + vclk: int + dclk: int + vddc: int + vddci: int + mvddc: int + vdd_gfx: int + cooling_id: int + pp_table_id: int + format_revision: int + content_revision: int + fclk: int + lclk: int + firmware_caps: int +struct_smu_bios_boot_up_values.register_fields([('revision', uint32_t, 0), ('gfxclk', uint32_t, 4), ('uclk', uint32_t, 8), ('socclk', uint32_t, 12), ('dcefclk', uint32_t, 16), ('eclk', uint32_t, 20), ('vclk', uint32_t, 24), ('dclk', uint32_t, 28), ('vddc', uint16_t, 32), ('vddci', uint16_t, 34), ('mvddc', uint16_t, 36), ('vdd_gfx', uint16_t, 38), ('cooling_id', uint8_t, 40), ('pp_table_id', uint32_t, 44), ('format_revision', uint32_t, 48), ('content_revision', uint32_t, 52), ('fclk', uint32_t, 56), ('lclk', uint32_t, 60), ('firmware_caps', uint32_t, 64)]) +enum_smu_table_id: dict[int, str] = {(SMU_TABLE_PPTABLE:=0): 'SMU_TABLE_PPTABLE', (SMU_TABLE_WATERMARKS:=1): 'SMU_TABLE_WATERMARKS', (SMU_TABLE_CUSTOM_DPM:=2): 'SMU_TABLE_CUSTOM_DPM', (SMU_TABLE_DPMCLOCKS:=3): 'SMU_TABLE_DPMCLOCKS', (SMU_TABLE_AVFS:=4): 'SMU_TABLE_AVFS', (SMU_TABLE_AVFS_PSM_DEBUG:=5): 'SMU_TABLE_AVFS_PSM_DEBUG', (SMU_TABLE_AVFS_FUSE_OVERRIDE:=6): 'SMU_TABLE_AVFS_FUSE_OVERRIDE', (SMU_TABLE_PMSTATUSLOG:=7): 'SMU_TABLE_PMSTATUSLOG', (SMU_TABLE_SMU_METRICS:=8): 'SMU_TABLE_SMU_METRICS', (SMU_TABLE_DRIVER_SMU_CONFIG:=9): 'SMU_TABLE_DRIVER_SMU_CONFIG', (SMU_TABLE_ACTIVITY_MONITOR_COEFF:=10): 'SMU_TABLE_ACTIVITY_MONITOR_COEFF', (SMU_TABLE_OVERDRIVE:=11): 'SMU_TABLE_OVERDRIVE', (SMU_TABLE_I2C_COMMANDS:=12): 'SMU_TABLE_I2C_COMMANDS', (SMU_TABLE_PACE:=13): 'SMU_TABLE_PACE', (SMU_TABLE_ECCINFO:=14): 'SMU_TABLE_ECCINFO', (SMU_TABLE_COMBO_PPTABLE:=15): 'SMU_TABLE_COMBO_PPTABLE', (SMU_TABLE_WIFIBAND:=16): 'SMU_TABLE_WIFIBAND', (SMU_TABLE_COUNT:=17): 'SMU_TABLE_COUNT'} +PPSMC_Result_OK = 0x1 +PPSMC_Result_Failed = 0xFF +PPSMC_Result_UnknownCmd = 0xFE +PPSMC_Result_CmdRejectedPrereq = 0xFD +PPSMC_Result_CmdRejectedBusy = 0xFC +PPSMC_MSG_TestMessage = 0x1 +PPSMC_MSG_GetSmuVersion = 0x2 +PPSMC_MSG_GfxDriverReset = 0x3 +PPSMC_MSG_GetDriverIfVersion = 0x4 +PPSMC_MSG_EnableAllSmuFeatures = 0x5 +PPSMC_MSG_DisableAllSmuFeatures = 0x6 +PPSMC_MSG_RequestI2cTransaction = 0x7 +PPSMC_MSG_GetMetricsVersion = 0x8 +PPSMC_MSG_GetMetricsTable = 0x9 +PPSMC_MSG_GetEccInfoTable = 0xA +PPSMC_MSG_GetEnabledSmuFeaturesLow = 0xB +PPSMC_MSG_GetEnabledSmuFeaturesHigh = 0xC +PPSMC_MSG_SetDriverDramAddrHigh = 0xD +PPSMC_MSG_SetDriverDramAddrLow = 0xE +PPSMC_MSG_SetToolsDramAddrHigh = 0xF +PPSMC_MSG_SetToolsDramAddrLow = 0x10 +PPSMC_MSG_SetSystemVirtualDramAddrHigh = 0x11 +PPSMC_MSG_SetSystemVirtualDramAddrLow = 0x12 +PPSMC_MSG_SetSoftMinByFreq = 0x13 +PPSMC_MSG_SetSoftMaxByFreq = 0x14 +PPSMC_MSG_GetMinDpmFreq = 0x15 +PPSMC_MSG_GetMaxDpmFreq = 0x16 +PPSMC_MSG_GetDpmFreqByIndex = 0x17 +PPSMC_MSG_SetPptLimit = 0x18 +PPSMC_MSG_GetPptLimit = 0x19 +PPSMC_MSG_DramLogSetDramAddrHigh = 0x1A +PPSMC_MSG_DramLogSetDramAddrLow = 0x1B +PPSMC_MSG_DramLogSetDramSize = 0x1C +PPSMC_MSG_GetDebugData = 0x1D +PPSMC_MSG_HeavySBR = 0x1E +PPSMC_MSG_SetNumBadHbmPagesRetired = 0x1F +PPSMC_MSG_DFCstateControl = 0x20 +PPSMC_MSG_GetGmiPwrDnHyst = 0x21 +PPSMC_MSG_SetGmiPwrDnHyst = 0x22 +PPSMC_MSG_GmiPwrDnControl = 0x23 +PPSMC_MSG_EnterGfxoff = 0x24 +PPSMC_MSG_ExitGfxoff = 0x25 +PPSMC_MSG_EnableDeterminism = 0x26 +PPSMC_MSG_DisableDeterminism = 0x27 +PPSMC_MSG_DumpSTBtoDram = 0x28 +PPSMC_MSG_STBtoDramLogSetDramAddrHigh = 0x29 +PPSMC_MSG_STBtoDramLogSetDramAddrLow = 0x2A +PPSMC_MSG_STBtoDramLogSetDramSize = 0x2B +PPSMC_MSG_SetSystemVirtualSTBtoDramAddrHigh = 0x2C +PPSMC_MSG_SetSystemVirtualSTBtoDramAddrLow = 0x2D +PPSMC_MSG_GfxDriverResetRecovery = 0x2E +PPSMC_MSG_TriggerVFFLR = 0x2F +PPSMC_MSG_SetSoftMinGfxClk = 0x30 +PPSMC_MSG_SetSoftMaxGfxClk = 0x31 +PPSMC_MSG_GetMinGfxDpmFreq = 0x32 +PPSMC_MSG_GetMaxGfxDpmFreq = 0x33 +PPSMC_MSG_PrepareForDriverUnload = 0x34 +PPSMC_MSG_ReadThrottlerLimit = 0x35 +PPSMC_MSG_QueryValidMcaCount = 0x36 +PPSMC_MSG_McaBankDumpDW = 0x37 +PPSMC_MSG_GetCTFLimit = 0x38 +PPSMC_MSG_ClearMcaOnRead = 0x39 +PPSMC_MSG_QueryValidMcaCeCount = 0x3A +PPSMC_MSG_McaBankCeDumpDW = 0x3B +PPSMC_MSG_SelectPLPDMode = 0x40 +PPSMC_MSG_RmaDueToBadPageThreshold = 0x43 +PPSMC_MSG_SetThrottlingPolicy = 0x44 +PPSMC_MSG_SetPhsDetWRbwThreshold = 0x45 +PPSMC_MSG_SetPhsDetWRbwFreqHigh = 0x46 +PPSMC_MSG_SetPhsDetWRbwFreqLow = 0x47 +PPSMC_MSG_SetPhsDetWRbwHystDown = 0x48 +PPSMC_MSG_SetPhsDetWRbwAlpha = 0x49 +PPSMC_MSG_SetPhsDetOnOff = 0x4A +PPSMC_MSG_GetPhsDetResidency = 0x4B +PPSMC_MSG_ResetSDMA = 0x4D +PPSMC_MSG_GetStaticMetricsTable = 0x59 +PPSMC_MSG_ResetVCN = 0x5B +PPSMC_Message_Count = 0x5C +PPSMC_RESET_TYPE_DRIVER_MODE_1_RESET = 0x1 +PPSMC_RESET_TYPE_DRIVER_MODE_2_RESET = 0x2 +PPSMC_RESET_TYPE_DRIVER_MODE_3_RESET = 0x3 +PPSMC_THROTTLING_LIMIT_TYPE_SOCKET = 0x1 +PPSMC_THROTTLING_LIMIT_TYPE_HBM = 0x2 +PPSMC_AID_THM_TYPE = 0x1 +PPSMC_CCD_THM_TYPE = 0x2 +PPSMC_XCD_THM_TYPE = 0x3 +PPSMC_HBM_THM_TYPE = 0x4 +PPSMC_PLPD_MODE_DEFAULT = 0x1 +PPSMC_PLPD_MODE_OPTIMIZED = 0x2 +NUM_VCLK_DPM_LEVELS = 4 +NUM_DCLK_DPM_LEVELS = 4 +NUM_SOCCLK_DPM_LEVELS = 4 +NUM_LCLK_DPM_LEVELS = 4 +NUM_UCLK_DPM_LEVELS = 4 +NUM_FCLK_DPM_LEVELS = 4 +NUM_XGMI_DPM_LEVELS = 2 +NUM_CXL_BITRATES = 4 +NUM_PCIE_BITRATES = 4 +NUM_XGMI_BITRATES = 4 +NUM_XGMI_WIDTHS = 3 +NUM_SOC_P2S_TABLES = 3 +NUM_TDP_GROUPS = 4 +SMU_METRICS_TABLE_VERSION = 0x11 +SMU_VF_METRICS_TABLE_VERSION = 0x5 +SMU13_0_6_DRIVER_IF_VERSION = 0x08042024 +NUM_I2C_CONTROLLERS = 8 +I2C_CONTROLLER_ENABLED = 1 +I2C_CONTROLLER_DISABLED = 0 +MAX_SW_I2C_COMMANDS = 24 +CMDCONFIG_STOP_BIT = 0 +CMDCONFIG_RESTART_BIT = 1 +CMDCONFIG_READWRITE_BIT = 2 +CMDCONFIG_STOP_MASK = (1 << CMDCONFIG_STOP_BIT) +CMDCONFIG_RESTART_MASK = (1 << CMDCONFIG_RESTART_BIT) +CMDCONFIG_READWRITE_MASK = (1 << CMDCONFIG_READWRITE_BIT) +IH_INTERRUPT_ID_TO_DRIVER = 0xFE +IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING = 0x7 +THROTTLER_PROCHOT_BIT = 0 +THROTTLER_PPT_BIT = 1 +THROTTLER_THERMAL_SOCKET_BIT = 2 +THROTTLER_THERMAL_VR_BIT = 3 +THROTTLER_THERMAL_HBM_BIT = 4 +ClearMcaOnRead_UE_FLAG_MASK = 0x1 +ClearMcaOnRead_CE_POLL_MASK = 0x2 +SMU_THERMAL_MINIMUM_ALERT_TEMP = 0 +SMU_THERMAL_MAXIMUM_ALERT_TEMP = 255 +SMU_TEMPERATURE_UNITS_PER_CENTIGRADES = 1000 +SMU_FW_NAME_LEN = 0x24 +SMU_DPM_USER_PROFILE_RESTORE = (1 << 0) +SMU_CUSTOM_FAN_SPEED_RPM = (1 << 1) +SMU_CUSTOM_FAN_SPEED_PWM = (1 << 2) +SMU_THROTTLER_PPT0_BIT = 0 +SMU_THROTTLER_PPT1_BIT = 1 +SMU_THROTTLER_PPT2_BIT = 2 +SMU_THROTTLER_PPT3_BIT = 3 +SMU_THROTTLER_SPL_BIT = 4 +SMU_THROTTLER_FPPT_BIT = 5 +SMU_THROTTLER_SPPT_BIT = 6 +SMU_THROTTLER_SPPT_APU_BIT = 7 +SMU_THROTTLER_TDC_GFX_BIT = 16 +SMU_THROTTLER_TDC_SOC_BIT = 17 +SMU_THROTTLER_TDC_MEM_BIT = 18 +SMU_THROTTLER_TDC_VDD_BIT = 19 +SMU_THROTTLER_TDC_CVIP_BIT = 20 +SMU_THROTTLER_EDC_CPU_BIT = 21 +SMU_THROTTLER_EDC_GFX_BIT = 22 +SMU_THROTTLER_APCC_BIT = 23 +SMU_THROTTLER_TEMP_GPU_BIT = 32 +SMU_THROTTLER_TEMP_CORE_BIT = 33 +SMU_THROTTLER_TEMP_MEM_BIT = 34 +SMU_THROTTLER_TEMP_EDGE_BIT = 35 +SMU_THROTTLER_TEMP_HOTSPOT_BIT = 36 +SMU_THROTTLER_TEMP_SOC_BIT = 37 +SMU_THROTTLER_TEMP_VR_GFX_BIT = 38 +SMU_THROTTLER_TEMP_VR_SOC_BIT = 39 +SMU_THROTTLER_TEMP_VR_MEM0_BIT = 40 +SMU_THROTTLER_TEMP_VR_MEM1_BIT = 41 +SMU_THROTTLER_TEMP_LIQUID0_BIT = 42 +SMU_THROTTLER_TEMP_LIQUID1_BIT = 43 +SMU_THROTTLER_VRHOT0_BIT = 44 +SMU_THROTTLER_VRHOT1_BIT = 45 +SMU_THROTTLER_PROCHOT_CPU_BIT = 46 +SMU_THROTTLER_PROCHOT_GFX_BIT = 47 +SMU_THROTTLER_PPM_BIT = 56 +SMU_THROTTLER_FIT_BIT = 57 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_14_0_2.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_14_0_2.py new file mode 100644 index 000000000..138a52289 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/smu_14_0_2.py @@ -0,0 +1,1563 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class struct_SMU14_Firmware_Footer(c.Struct): + SIZE = 4 + Signature: int +uint32_t: TypeAlias = ctypes.c_uint32 +struct_SMU14_Firmware_Footer.register_fields([('Signature', uint32_t, 0)]) +SMU14_Firmware_Footer: TypeAlias = struct_SMU14_Firmware_Footer +@c.record +class SMU_Firmware_Header(c.Struct): + SIZE = 256 + ImageVersion: int + ImageVersion2: int + Padding0: c.Array[ctypes.c_uint32, Literal[3]] + SizeFWSigned: int + Padding1: c.Array[ctypes.c_uint32, Literal[25]] + FirmwareType: int + Filler: c.Array[ctypes.c_uint32, Literal[32]] +SMU_Firmware_Header.register_fields([('ImageVersion', uint32_t, 0), ('ImageVersion2', uint32_t, 4), ('Padding0', c.Array[uint32_t, Literal[3]], 8), ('SizeFWSigned', uint32_t, 20), ('Padding1', c.Array[uint32_t, Literal[25]], 24), ('FirmwareType', uint32_t, 124), ('Filler', c.Array[uint32_t, Literal[32]], 128)]) +@c.record +class FwStatus_t(c.Struct): + SIZE = 24 + DpmHandlerID: int + ActivityMonitorID: int + DpmTimerID: int + DpmHubID: int + DpmHubTask: int + CclkSyncStatus: int + Ccx0CpuOff: int + Ccx1CpuOff: int + GfxOffStatus: int + VddOff: int + InWhisperMode: int + ZstateStatus: int + spare0: int + DstateFun: int + DstateDev: int + P2JobHandler: int + RsmuPmiP2PendingCnt: int + PostCode: int + MsgPortBusy: int + RsmuPmiP1Pending: int + DfCstateExitPending: int + Ccx0Pc6ExitPending: int + Ccx1Pc6ExitPending: int + WarmResetPending: int + spare1: int + IdleMask: int +FwStatus_t.register_fields([('DpmHandlerID', uint32_t, 0, 8, 0), ('ActivityMonitorID', uint32_t, 1, 8, 0), ('DpmTimerID', uint32_t, 2, 8, 0), ('DpmHubID', uint32_t, 3, 4, 0), ('DpmHubTask', uint32_t, 3, 4, 4), ('CclkSyncStatus', uint32_t, 4, 8, 0), ('Ccx0CpuOff', uint32_t, 5, 2, 0), ('Ccx1CpuOff', uint32_t, 5, 2, 2), ('GfxOffStatus', uint32_t, 5, 2, 4), ('VddOff', uint32_t, 5, 1, 6), ('InWhisperMode', uint32_t, 5, 1, 7), ('ZstateStatus', uint32_t, 6, 4, 0), ('spare0', uint32_t, 6, 4, 4), ('DstateFun', uint32_t, 7, 4, 0), ('DstateDev', uint32_t, 7, 4, 4), ('P2JobHandler', uint32_t, 8, 24, 0), ('RsmuPmiP2PendingCnt', uint32_t, 11, 8, 0), ('PostCode', uint32_t, 12, 32, 0), ('MsgPortBusy', uint32_t, 16, 24, 0), ('RsmuPmiP1Pending', uint32_t, 19, 1, 0), ('DfCstateExitPending', uint32_t, 19, 1, 1), ('Ccx0Pc6ExitPending', uint32_t, 19, 1, 2), ('Ccx1Pc6ExitPending', uint32_t, 19, 1, 3), ('WarmResetPending', uint32_t, 19, 1, 4), ('spare1', uint32_t, 19, 3, 5), ('IdleMask', uint32_t, 20, 32, 0)]) +@c.record +class FwStatus_t_v14_0_1(c.Struct): + SIZE = 24 + DpmHandlerID: int + ActivityMonitorID: int + DpmTimerID: int + DpmHubID: int + DpmHubTask: int + CclkSyncStatus: int + ZstateStatus: int + Cpu1VddOff: int + DstateFun: int + DstateDev: int + GfxOffStatus: int + Cpu0Off: int + Cpu1Off: int + Cpu0VddOff: int + P2JobHandler: int + PostCode: int + MsgPortBusy: int + RsmuPmiP1Pending: int + RsmuPmiP2PendingCnt: int + DfCstateExitPending: int + Pc6EntryPending: int + Pc6ExitPending: int + WarmResetPending: int + Mp0ClkPending: int + InWhisperMode: int + spare2: int + IdleMask: int +FwStatus_t_v14_0_1.register_fields([('DpmHandlerID', uint32_t, 0, 8, 0), ('ActivityMonitorID', uint32_t, 1, 8, 0), ('DpmTimerID', uint32_t, 2, 8, 0), ('DpmHubID', uint32_t, 3, 4, 0), ('DpmHubTask', uint32_t, 3, 4, 4), ('CclkSyncStatus', uint32_t, 4, 8, 0), ('ZstateStatus', uint32_t, 5, 4, 0), ('Cpu1VddOff', uint32_t, 5, 4, 4), ('DstateFun', uint32_t, 6, 4, 0), ('DstateDev', uint32_t, 6, 4, 4), ('GfxOffStatus', uint32_t, 7, 2, 0), ('Cpu0Off', uint32_t, 7, 2, 2), ('Cpu1Off', uint32_t, 7, 2, 4), ('Cpu0VddOff', uint32_t, 7, 2, 6), ('P2JobHandler', uint32_t, 8, 32, 0), ('PostCode', uint32_t, 12, 32, 0), ('MsgPortBusy', uint32_t, 16, 15, 0), ('RsmuPmiP1Pending', uint32_t, 17, 1, 7), ('RsmuPmiP2PendingCnt', uint32_t, 18, 8, 0), ('DfCstateExitPending', uint32_t, 19, 1, 0), ('Pc6EntryPending', uint32_t, 19, 1, 1), ('Pc6ExitPending', uint32_t, 19, 1, 2), ('WarmResetPending', uint32_t, 19, 1, 3), ('Mp0ClkPending', uint32_t, 19, 1, 4), ('InWhisperMode', uint32_t, 19, 1, 5), ('spare2', uint32_t, 19, 2, 6), ('IdleMask', uint32_t, 20, 32, 0)]) +FEATURE_PWR_DOMAIN_e: dict[int, str] = {(FEATURE_PWR_ALL:=0): 'FEATURE_PWR_ALL', (FEATURE_PWR_S5:=1): 'FEATURE_PWR_S5', (FEATURE_PWR_BACO:=2): 'FEATURE_PWR_BACO', (FEATURE_PWR_SOC:=3): 'FEATURE_PWR_SOC', (FEATURE_PWR_GFX:=4): 'FEATURE_PWR_GFX', (FEATURE_PWR_DOMAIN_COUNT:=5): 'FEATURE_PWR_DOMAIN_COUNT'} +FEATURE_BTC_e: dict[int, str] = {(FEATURE_BTC_NOP:=0): 'FEATURE_BTC_NOP', (FEATURE_BTC_SAVE:=1): 'FEATURE_BTC_SAVE', (FEATURE_BTC_RESTORE:=2): 'FEATURE_BTC_RESTORE', (FEATURE_BTC_COUNT:=3): 'FEATURE_BTC_COUNT'} +SVI_PSI_e: dict[int, str] = {(SVI_PSI_0:=0): 'SVI_PSI_0', (SVI_PSI_1:=1): 'SVI_PSI_1', (SVI_PSI_2:=2): 'SVI_PSI_2', (SVI_PSI_3:=3): 'SVI_PSI_3', (SVI_PSI_4:=4): 'SVI_PSI_4', (SVI_PSI_5:=5): 'SVI_PSI_5', (SVI_PSI_6:=6): 'SVI_PSI_6', (SVI_PSI_7:=7): 'SVI_PSI_7'} +SMARTSHIFT_VERSION_e: dict[int, str] = {(SMARTSHIFT_VERSION_1:=0): 'SMARTSHIFT_VERSION_1', (SMARTSHIFT_VERSION_2:=1): 'SMARTSHIFT_VERSION_2', (SMARTSHIFT_VERSION_3:=2): 'SMARTSHIFT_VERSION_3'} +FOPT_CALC_e: dict[int, str] = {(FOPT_CALC_AC_CALC_DC:=0): 'FOPT_CALC_AC_CALC_DC', (FOPT_PPTABLE_AC_CALC_DC:=1): 'FOPT_PPTABLE_AC_CALC_DC', (FOPT_CALC_AC_PPTABLE_DC:=2): 'FOPT_CALC_AC_PPTABLE_DC', (FOPT_PPTABLE_AC_PPTABLE_DC:=3): 'FOPT_PPTABLE_AC_PPTABLE_DC'} +DRAM_BIT_WIDTH_TYPE_e: dict[int, str] = {(DRAM_BIT_WIDTH_DISABLED:=0): 'DRAM_BIT_WIDTH_DISABLED', (DRAM_BIT_WIDTH_X_8:=8): 'DRAM_BIT_WIDTH_X_8', (DRAM_BIT_WIDTH_X_16:=16): 'DRAM_BIT_WIDTH_X_16', (DRAM_BIT_WIDTH_X_32:=32): 'DRAM_BIT_WIDTH_X_32', (DRAM_BIT_WIDTH_X_64:=64): 'DRAM_BIT_WIDTH_X_64', (DRAM_BIT_WIDTH_X_128:=128): 'DRAM_BIT_WIDTH_X_128', (DRAM_BIT_WIDTH_COUNT:=129): 'DRAM_BIT_WIDTH_COUNT'} +I2cControllerPort_e: dict[int, str] = {(I2C_CONTROLLER_PORT_0:=0): 'I2C_CONTROLLER_PORT_0', (I2C_CONTROLLER_PORT_1:=1): 'I2C_CONTROLLER_PORT_1', (I2C_CONTROLLER_PORT_COUNT:=2): 'I2C_CONTROLLER_PORT_COUNT'} +I2cControllerName_e: dict[int, str] = {(I2C_CONTROLLER_NAME_VR_GFX:=0): 'I2C_CONTROLLER_NAME_VR_GFX', (I2C_CONTROLLER_NAME_VR_SOC:=1): 'I2C_CONTROLLER_NAME_VR_SOC', (I2C_CONTROLLER_NAME_VR_VMEMP:=2): 'I2C_CONTROLLER_NAME_VR_VMEMP', (I2C_CONTROLLER_NAME_VR_VDDIO:=3): 'I2C_CONTROLLER_NAME_VR_VDDIO', (I2C_CONTROLLER_NAME_LIQUID0:=4): 'I2C_CONTROLLER_NAME_LIQUID0', (I2C_CONTROLLER_NAME_LIQUID1:=5): 'I2C_CONTROLLER_NAME_LIQUID1', (I2C_CONTROLLER_NAME_PLX:=6): 'I2C_CONTROLLER_NAME_PLX', (I2C_CONTROLLER_NAME_FAN_INTAKE:=7): 'I2C_CONTROLLER_NAME_FAN_INTAKE', (I2C_CONTROLLER_NAME_COUNT:=8): 'I2C_CONTROLLER_NAME_COUNT'} +I2cControllerThrottler_e: dict[int, str] = {(I2C_CONTROLLER_THROTTLER_TYPE_NONE:=0): 'I2C_CONTROLLER_THROTTLER_TYPE_NONE', (I2C_CONTROLLER_THROTTLER_VR_GFX:=1): 'I2C_CONTROLLER_THROTTLER_VR_GFX', (I2C_CONTROLLER_THROTTLER_VR_SOC:=2): 'I2C_CONTROLLER_THROTTLER_VR_SOC', (I2C_CONTROLLER_THROTTLER_VR_VMEMP:=3): 'I2C_CONTROLLER_THROTTLER_VR_VMEMP', (I2C_CONTROLLER_THROTTLER_VR_VDDIO:=4): 'I2C_CONTROLLER_THROTTLER_VR_VDDIO', (I2C_CONTROLLER_THROTTLER_LIQUID0:=5): 'I2C_CONTROLLER_THROTTLER_LIQUID0', (I2C_CONTROLLER_THROTTLER_LIQUID1:=6): 'I2C_CONTROLLER_THROTTLER_LIQUID1', (I2C_CONTROLLER_THROTTLER_PLX:=7): 'I2C_CONTROLLER_THROTTLER_PLX', (I2C_CONTROLLER_THROTTLER_FAN_INTAKE:=8): 'I2C_CONTROLLER_THROTTLER_FAN_INTAKE', (I2C_CONTROLLER_THROTTLER_INA3221:=9): 'I2C_CONTROLLER_THROTTLER_INA3221', (I2C_CONTROLLER_THROTTLER_COUNT:=10): 'I2C_CONTROLLER_THROTTLER_COUNT'} +I2cControllerProtocol_e: dict[int, str] = {(I2C_CONTROLLER_PROTOCOL_VR_XPDE132G5:=0): 'I2C_CONTROLLER_PROTOCOL_VR_XPDE132G5', (I2C_CONTROLLER_PROTOCOL_VR_IR35217:=1): 'I2C_CONTROLLER_PROTOCOL_VR_IR35217', (I2C_CONTROLLER_PROTOCOL_TMP_MAX31875:=2): 'I2C_CONTROLLER_PROTOCOL_TMP_MAX31875', (I2C_CONTROLLER_PROTOCOL_INA3221:=3): 'I2C_CONTROLLER_PROTOCOL_INA3221', (I2C_CONTROLLER_PROTOCOL_TMP_MAX6604:=4): 'I2C_CONTROLLER_PROTOCOL_TMP_MAX6604', (I2C_CONTROLLER_PROTOCOL_COUNT:=5): 'I2C_CONTROLLER_PROTOCOL_COUNT'} +@c.record +class I2cControllerConfig_t(c.Struct): + SIZE = 8 + Enabled: int + Speed: int + SlaveAddress: int + ControllerPort: int + ControllerName: int + ThermalThrotter: int + I2cProtocol: int + PaddingConfig: int +uint8_t: TypeAlias = ctypes.c_ubyte +I2cControllerConfig_t.register_fields([('Enabled', uint8_t, 0), ('Speed', uint8_t, 1), ('SlaveAddress', uint8_t, 2), ('ControllerPort', uint8_t, 3), ('ControllerName', uint8_t, 4), ('ThermalThrotter', uint8_t, 5), ('I2cProtocol', uint8_t, 6), ('PaddingConfig', uint8_t, 7)]) +I2cPort_e: dict[int, str] = {(I2C_PORT_SVD_SCL:=0): 'I2C_PORT_SVD_SCL', (I2C_PORT_GPIO:=1): 'I2C_PORT_GPIO'} +I2cSpeed_e: dict[int, str] = {(I2C_SPEED_FAST_50K:=0): 'I2C_SPEED_FAST_50K', (I2C_SPEED_FAST_100K:=1): 'I2C_SPEED_FAST_100K', (I2C_SPEED_FAST_400K:=2): 'I2C_SPEED_FAST_400K', (I2C_SPEED_FAST_PLUS_1M:=3): 'I2C_SPEED_FAST_PLUS_1M', (I2C_SPEED_HIGH_1M:=4): 'I2C_SPEED_HIGH_1M', (I2C_SPEED_HIGH_2M:=5): 'I2C_SPEED_HIGH_2M', (I2C_SPEED_COUNT:=6): 'I2C_SPEED_COUNT'} +I2cCmdType_e: dict[int, str] = {(I2C_CMD_READ:=0): 'I2C_CMD_READ', (I2C_CMD_WRITE:=1): 'I2C_CMD_WRITE', (I2C_CMD_COUNT:=2): 'I2C_CMD_COUNT'} +@c.record +class SwI2cCmd_t(c.Struct): + SIZE = 2 + ReadWriteData: int + CmdConfig: int +SwI2cCmd_t.register_fields([('ReadWriteData', uint8_t, 0), ('CmdConfig', uint8_t, 1)]) +@c.record +class SwI2cRequest_t(c.Struct): + SIZE = 52 + I2CcontrollerPort: int + I2CSpeed: int + SlaveAddress: int + NumCmds: int + SwI2cCmds: c.Array[SwI2cCmd_t, Literal[24]] +SwI2cRequest_t.register_fields([('I2CcontrollerPort', uint8_t, 0), ('I2CSpeed', uint8_t, 1), ('SlaveAddress', uint8_t, 2), ('NumCmds', uint8_t, 3), ('SwI2cCmds', c.Array[SwI2cCmd_t, Literal[24]], 4)]) +@c.record +class SwI2cRequestExternal_t(c.Struct): + SIZE = 116 + SwI2cRequest: SwI2cRequest_t + Spare: c.Array[ctypes.c_uint32, Literal[8]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +SwI2cRequestExternal_t.register_fields([('SwI2cRequest', SwI2cRequest_t, 0), ('Spare', c.Array[uint32_t, Literal[8]], 52), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 84)]) +@c.record +class EccInfo_t(c.Struct): + SIZE = 24 + mca_umc_status: int + mca_umc_addr: int + ce_count_lo_chip: int + ce_count_hi_chip: int + eccPadding: int +uint64_t: TypeAlias = ctypes.c_uint64 +uint16_t: TypeAlias = ctypes.c_uint16 +EccInfo_t.register_fields([('mca_umc_status', uint64_t, 0), ('mca_umc_addr', uint64_t, 8), ('ce_count_lo_chip', uint16_t, 16), ('ce_count_hi_chip', uint16_t, 18), ('eccPadding', uint32_t, 20)]) +@c.record +class EccInfoTable_t(c.Struct): + SIZE = 576 + EccInfo: c.Array[EccInfo_t, Literal[24]] +EccInfoTable_t.register_fields([('EccInfo', c.Array[EccInfo_t, Literal[24]], 0)]) +EPCS_STATUS_e: dict[int, str] = {(EPCS_SHORTED_LIMIT:=0): 'EPCS_SHORTED_LIMIT', (EPCS_LOW_POWER_LIMIT:=1): 'EPCS_LOW_POWER_LIMIT', (EPCS_NORMAL_POWER_LIMIT:=2): 'EPCS_NORMAL_POWER_LIMIT', (EPCS_HIGH_POWER_LIMIT:=3): 'EPCS_HIGH_POWER_LIMIT', (EPCS_NOT_CONFIGURED:=4): 'EPCS_NOT_CONFIGURED', (EPCS_STATUS_COUNT:=5): 'EPCS_STATUS_COUNT'} +D3HOTSequence_e: dict[int, str] = {(BACO_SEQUENCE:=0): 'BACO_SEQUENCE', (MSR_SEQUENCE:=1): 'MSR_SEQUENCE', (BAMACO_SEQUENCE:=2): 'BAMACO_SEQUENCE', (ULPS_SEQUENCE:=3): 'ULPS_SEQUENCE', (D3HOT_SEQUENCE_COUNT:=4): 'D3HOT_SEQUENCE_COUNT'} +PowerGatingMode_e: dict[int, str] = {(PG_DYNAMIC_MODE:=0): 'PG_DYNAMIC_MODE', (PG_STATIC_MODE:=1): 'PG_STATIC_MODE'} +PowerGatingSettings_e: dict[int, str] = {(PG_POWER_DOWN:=0): 'PG_POWER_DOWN', (PG_POWER_UP:=1): 'PG_POWER_UP'} +@c.record +class QuadraticInt_t(c.Struct): + SIZE = 12 + a: int + b: int + c: int +QuadraticInt_t.register_fields([('a', uint32_t, 0), ('b', uint32_t, 4), ('c', uint32_t, 8)]) +@c.record +class LinearInt_t(c.Struct): + SIZE = 8 + m: int + b: int +LinearInt_t.register_fields([('m', uint32_t, 0), ('b', uint32_t, 4)]) +@c.record +class DroopInt_t(c.Struct): + SIZE = 12 + a: int + b: int + c: int +DroopInt_t.register_fields([('a', uint32_t, 0), ('b', uint32_t, 4), ('c', uint32_t, 8)]) +DCS_ARCH_e: dict[int, str] = {(DCS_ARCH_DISABLED:=0): 'DCS_ARCH_DISABLED', (DCS_ARCH_FADCS:=1): 'DCS_ARCH_FADCS', (DCS_ARCH_ASYNC:=2): 'DCS_ARCH_ASYNC'} +PPCLK_e: dict[int, str] = {(PPCLK_GFXCLK:=0): 'PPCLK_GFXCLK', (PPCLK_SOCCLK:=1): 'PPCLK_SOCCLK', (PPCLK_UCLK:=2): 'PPCLK_UCLK', (PPCLK_FCLK:=3): 'PPCLK_FCLK', (PPCLK_DCLK_0:=4): 'PPCLK_DCLK_0', (PPCLK_VCLK_0:=5): 'PPCLK_VCLK_0', (PPCLK_DISPCLK:=6): 'PPCLK_DISPCLK', (PPCLK_DPPCLK:=7): 'PPCLK_DPPCLK', (PPCLK_DPREFCLK:=8): 'PPCLK_DPREFCLK', (PPCLK_DCFCLK:=9): 'PPCLK_DCFCLK', (PPCLK_DTBCLK:=10): 'PPCLK_DTBCLK', (PPCLK_COUNT:=11): 'PPCLK_COUNT'} +VOLTAGE_MODE_e: dict[int, str] = {(VOLTAGE_MODE_PPTABLE:=0): 'VOLTAGE_MODE_PPTABLE', (VOLTAGE_MODE_FUSES:=1): 'VOLTAGE_MODE_FUSES', (VOLTAGE_MODE_COUNT:=2): 'VOLTAGE_MODE_COUNT'} +AVFS_VOLTAGE_TYPE_e: dict[int, str] = {(AVFS_VOLTAGE_GFX:=0): 'AVFS_VOLTAGE_GFX', (AVFS_VOLTAGE_SOC:=1): 'AVFS_VOLTAGE_SOC', (AVFS_VOLTAGE_COUNT:=2): 'AVFS_VOLTAGE_COUNT'} +AVFS_TEMP_e: dict[int, str] = {(AVFS_TEMP_COLD:=0): 'AVFS_TEMP_COLD', (AVFS_TEMP_HOT:=1): 'AVFS_TEMP_HOT', (AVFS_TEMP_COUNT:=2): 'AVFS_TEMP_COUNT'} +AVFS_D_e: dict[int, str] = {(AVFS_D_G:=0): 'AVFS_D_G', (AVFS_D_COUNT:=1): 'AVFS_D_COUNT'} +UCLK_DIV_e: dict[int, str] = {(UCLK_DIV_BY_1:=0): 'UCLK_DIV_BY_1', (UCLK_DIV_BY_2:=1): 'UCLK_DIV_BY_2', (UCLK_DIV_BY_4:=2): 'UCLK_DIV_BY_4', (UCLK_DIV_BY_8:=3): 'UCLK_DIV_BY_8'} +GpioIntPolarity_e: dict[int, str] = {(GPIO_INT_POLARITY_ACTIVE_LOW:=0): 'GPIO_INT_POLARITY_ACTIVE_LOW', (GPIO_INT_POLARITY_ACTIVE_HIGH:=1): 'GPIO_INT_POLARITY_ACTIVE_HIGH'} +PwrConfig_e: dict[int, str] = {(PWR_CONFIG_TDP:=0): 'PWR_CONFIG_TDP', (PWR_CONFIG_TGP:=1): 'PWR_CONFIG_TGP', (PWR_CONFIG_TCP_ESTIMATED:=2): 'PWR_CONFIG_TCP_ESTIMATED', (PWR_CONFIG_TCP_MEASURED:=3): 'PWR_CONFIG_TCP_MEASURED', (PWR_CONFIG_TBP_DESKTOP:=4): 'PWR_CONFIG_TBP_DESKTOP', (PWR_CONFIG_TBP_MOBILE:=5): 'PWR_CONFIG_TBP_MOBILE'} +@c.record +class DpmDescriptor_t(c.Struct): + SIZE = 32 + Padding: int + SnapToDiscrete: int + NumDiscreteLevels: int + CalculateFopt: int + ConversionToAvfsClk: LinearInt_t + Padding3: c.Array[ctypes.c_uint32, Literal[3]] + Padding4: int + FoptimalDc: int + FoptimalAc: int + Padding2: int +DpmDescriptor_t.register_fields([('Padding', uint8_t, 0), ('SnapToDiscrete', uint8_t, 1), ('NumDiscreteLevels', uint8_t, 2), ('CalculateFopt', uint8_t, 3), ('ConversionToAvfsClk', LinearInt_t, 4), ('Padding3', c.Array[uint32_t, Literal[3]], 12), ('Padding4', uint16_t, 24), ('FoptimalDc', uint16_t, 26), ('FoptimalAc', uint16_t, 28), ('Padding2', uint16_t, 30)]) +PPT_THROTTLER_e: dict[int, str] = {(PPT_THROTTLER_PPT0:=0): 'PPT_THROTTLER_PPT0', (PPT_THROTTLER_PPT1:=1): 'PPT_THROTTLER_PPT1', (PPT_THROTTLER_PPT2:=2): 'PPT_THROTTLER_PPT2', (PPT_THROTTLER_PPT3:=3): 'PPT_THROTTLER_PPT3', (PPT_THROTTLER_COUNT:=4): 'PPT_THROTTLER_COUNT'} +TEMP_e: dict[int, str] = {(TEMP_EDGE:=0): 'TEMP_EDGE', (TEMP_HOTSPOT:=1): 'TEMP_HOTSPOT', (TEMP_HOTSPOT_GFX:=2): 'TEMP_HOTSPOT_GFX', (TEMP_HOTSPOT_SOC:=3): 'TEMP_HOTSPOT_SOC', (TEMP_MEM:=4): 'TEMP_MEM', (TEMP_VR_GFX:=5): 'TEMP_VR_GFX', (TEMP_VR_SOC:=6): 'TEMP_VR_SOC', (TEMP_VR_MEM0:=7): 'TEMP_VR_MEM0', (TEMP_VR_MEM1:=8): 'TEMP_VR_MEM1', (TEMP_LIQUID0:=9): 'TEMP_LIQUID0', (TEMP_LIQUID1:=10): 'TEMP_LIQUID1', (TEMP_PLX:=11): 'TEMP_PLX', (TEMP_COUNT:=12): 'TEMP_COUNT'} +TDC_THROTTLER_e: dict[int, str] = {(TDC_THROTTLER_GFX:=0): 'TDC_THROTTLER_GFX', (TDC_THROTTLER_SOC:=1): 'TDC_THROTTLER_SOC', (TDC_THROTTLER_COUNT:=2): 'TDC_THROTTLER_COUNT'} +SVI_PLANE_e: dict[int, str] = {(SVI_PLANE_VDD_GFX:=0): 'SVI_PLANE_VDD_GFX', (SVI_PLANE_VDD_SOC:=1): 'SVI_PLANE_VDD_SOC', (SVI_PLANE_VDDCI_MEM:=2): 'SVI_PLANE_VDDCI_MEM', (SVI_PLANE_VDDIO_MEM:=3): 'SVI_PLANE_VDDIO_MEM', (SVI_PLANE_COUNT:=4): 'SVI_PLANE_COUNT'} +PMFW_VOLT_PLANE_e: dict[int, str] = {(PMFW_VOLT_PLANE_GFX:=0): 'PMFW_VOLT_PLANE_GFX', (PMFW_VOLT_PLANE_SOC:=1): 'PMFW_VOLT_PLANE_SOC', (PMFW_VOLT_PLANE_COUNT:=2): 'PMFW_VOLT_PLANE_COUNT'} +CUSTOMER_VARIANT_e: dict[int, str] = {(CUSTOMER_VARIANT_ROW:=0): 'CUSTOMER_VARIANT_ROW', (CUSTOMER_VARIANT_FALCON:=1): 'CUSTOMER_VARIANT_FALCON', (CUSTOMER_VARIANT_COUNT:=2): 'CUSTOMER_VARIANT_COUNT'} +POWER_SOURCE_e: dict[int, str] = {(POWER_SOURCE_AC:=0): 'POWER_SOURCE_AC', (POWER_SOURCE_DC:=1): 'POWER_SOURCE_DC', (POWER_SOURCE_COUNT:=2): 'POWER_SOURCE_COUNT'} +MEM_VENDOR_e: dict[int, str] = {(MEM_VENDOR_PLACEHOLDER0:=0): 'MEM_VENDOR_PLACEHOLDER0', (MEM_VENDOR_SAMSUNG:=1): 'MEM_VENDOR_SAMSUNG', (MEM_VENDOR_INFINEON:=2): 'MEM_VENDOR_INFINEON', (MEM_VENDOR_ELPIDA:=3): 'MEM_VENDOR_ELPIDA', (MEM_VENDOR_ETRON:=4): 'MEM_VENDOR_ETRON', (MEM_VENDOR_NANYA:=5): 'MEM_VENDOR_NANYA', (MEM_VENDOR_HYNIX:=6): 'MEM_VENDOR_HYNIX', (MEM_VENDOR_MOSEL:=7): 'MEM_VENDOR_MOSEL', (MEM_VENDOR_WINBOND:=8): 'MEM_VENDOR_WINBOND', (MEM_VENDOR_ESMT:=9): 'MEM_VENDOR_ESMT', (MEM_VENDOR_PLACEHOLDER1:=10): 'MEM_VENDOR_PLACEHOLDER1', (MEM_VENDOR_PLACEHOLDER2:=11): 'MEM_VENDOR_PLACEHOLDER2', (MEM_VENDOR_PLACEHOLDER3:=12): 'MEM_VENDOR_PLACEHOLDER3', (MEM_VENDOR_PLACEHOLDER4:=13): 'MEM_VENDOR_PLACEHOLDER4', (MEM_VENDOR_PLACEHOLDER5:=14): 'MEM_VENDOR_PLACEHOLDER5', (MEM_VENDOR_MICRON:=15): 'MEM_VENDOR_MICRON', (MEM_VENDOR_COUNT:=16): 'MEM_VENDOR_COUNT'} +PP_GRTAVFS_HW_FUSE_e: dict[int, str] = {(PP_GRTAVFS_HW_CPO_CTL_ZONE0:=0): 'PP_GRTAVFS_HW_CPO_CTL_ZONE0', (PP_GRTAVFS_HW_CPO_CTL_ZONE1:=1): 'PP_GRTAVFS_HW_CPO_CTL_ZONE1', (PP_GRTAVFS_HW_CPO_CTL_ZONE2:=2): 'PP_GRTAVFS_HW_CPO_CTL_ZONE2', (PP_GRTAVFS_HW_CPO_CTL_ZONE3:=3): 'PP_GRTAVFS_HW_CPO_CTL_ZONE3', (PP_GRTAVFS_HW_CPO_CTL_ZONE4:=4): 'PP_GRTAVFS_HW_CPO_CTL_ZONE4', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE0:=5): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE0', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE0:=6): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE0', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE1:=7): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE1', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE1:=8): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE1', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE2:=9): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE2', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE2:=10): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE2', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE3:=11): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE3', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE3:=12): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE3', (PP_GRTAVFS_HW_CPO_EN_0_31_ZONE4:=13): 'PP_GRTAVFS_HW_CPO_EN_0_31_ZONE4', (PP_GRTAVFS_HW_CPO_EN_32_63_ZONE4:=14): 'PP_GRTAVFS_HW_CPO_EN_32_63_ZONE4', (PP_GRTAVFS_HW_ZONE0_VF:=15): 'PP_GRTAVFS_HW_ZONE0_VF', (PP_GRTAVFS_HW_ZONE1_VF1:=16): 'PP_GRTAVFS_HW_ZONE1_VF1', (PP_GRTAVFS_HW_ZONE2_VF2:=17): 'PP_GRTAVFS_HW_ZONE2_VF2', (PP_GRTAVFS_HW_ZONE3_VF3:=18): 'PP_GRTAVFS_HW_ZONE3_VF3', (PP_GRTAVFS_HW_VOLTAGE_GB:=19): 'PP_GRTAVFS_HW_VOLTAGE_GB', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE0:=20): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE0', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE1:=21): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE1', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE2:=22): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE2', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE3:=23): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE3', (PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE4:=24): 'PP_GRTAVFS_HW_CPOSCALINGCTRL_ZONE4', (PP_GRTAVFS_HW_RESERVED_0:=25): 'PP_GRTAVFS_HW_RESERVED_0', (PP_GRTAVFS_HW_RESERVED_1:=26): 'PP_GRTAVFS_HW_RESERVED_1', (PP_GRTAVFS_HW_RESERVED_2:=27): 'PP_GRTAVFS_HW_RESERVED_2', (PP_GRTAVFS_HW_RESERVED_3:=28): 'PP_GRTAVFS_HW_RESERVED_3', (PP_GRTAVFS_HW_RESERVED_4:=29): 'PP_GRTAVFS_HW_RESERVED_4', (PP_GRTAVFS_HW_RESERVED_5:=30): 'PP_GRTAVFS_HW_RESERVED_5', (PP_GRTAVFS_HW_RESERVED_6:=31): 'PP_GRTAVFS_HW_RESERVED_6', (PP_GRTAVFS_HW_FUSE_COUNT:=32): 'PP_GRTAVFS_HW_FUSE_COUNT'} +PP_GRTAVFS_FW_COMMON_FUSE_e: dict[int, str] = {(PP_GRTAVFS_FW_COMMON_PPVMIN_Z1_HOT_T0:=0): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z1_HOT_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z1_COLD_T0:=1): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z1_COLD_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z2_HOT_T0:=2): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z2_HOT_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z2_COLD_T0:=3): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z2_COLD_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z3_HOT_T0:=4): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z3_HOT_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z3_COLD_T0:=5): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z3_COLD_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z4_HOT_T0:=6): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z4_HOT_T0', (PP_GRTAVFS_FW_COMMON_PPVMIN_Z4_COLD_T0:=7): 'PP_GRTAVFS_FW_COMMON_PPVMIN_Z4_COLD_T0', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z0:=8): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z0', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z1:=9): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z1', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z2:=10): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z2', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z3:=11): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z3', (PP_GRTAVFS_FW_COMMON_SRAM_RM_Z4:=12): 'PP_GRTAVFS_FW_COMMON_SRAM_RM_Z4', (PP_GRTAVFS_FW_COMMON_FUSE_COUNT:=13): 'PP_GRTAVFS_FW_COMMON_FUSE_COUNT'} +PP_GRTAVFS_FW_SEP_FUSE_e: dict[int, str] = {(PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_NEG_1:=0): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_NEG_1', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_0:=1): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_0', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_1:=2): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_1', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_2:=3): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_2', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_3:=4): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_3', (PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_4:=5): 'PP_GRTAVFS_FW_SEP_FUSE_GB1_PWL_VOLTAGE_4', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_NEG_1:=6): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_NEG_1', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_0:=7): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_0', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_1:=8): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_1', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_2:=9): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_2', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_3:=10): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_3', (PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_4:=11): 'PP_GRTAVFS_FW_SEP_FUSE_GB2_PWL_VOLTAGE_4', (PP_GRTAVFS_FW_SEP_FUSE_VF_NEG_1_FREQUENCY:=12): 'PP_GRTAVFS_FW_SEP_FUSE_VF_NEG_1_FREQUENCY', (PP_GRTAVFS_FW_SEP_FUSE_VF4_FREQUENCY:=13): 'PP_GRTAVFS_FW_SEP_FUSE_VF4_FREQUENCY', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_0:=14): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_0', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_1:=15): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_1', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_2:=16): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_2', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_3:=17): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_3', (PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_4:=18): 'PP_GRTAVFS_FW_SEP_FUSE_FREQUENCY_TO_COUNT_SCALER_4', (PP_GRTAVFS_FW_SEP_FUSE_COUNT:=19): 'PP_GRTAVFS_FW_SEP_FUSE_COUNT'} +@c.record +class SviTelemetryScale_t(c.Struct): + SIZE = 4 + Offset: int + Padding: int + MaxCurrent: int +int8_t: TypeAlias = ctypes.c_byte +SviTelemetryScale_t.register_fields([('Offset', int8_t, 0), ('Padding', uint8_t, 1), ('MaxCurrent', uint16_t, 2)]) +PP_OD_POWER_FEATURE_e: dict[int, str] = {(PP_OD_POWER_FEATURE_ALWAYS_ENABLED:=0): 'PP_OD_POWER_FEATURE_ALWAYS_ENABLED', (PP_OD_POWER_FEATURE_DISABLED_WHILE_GAMING:=1): 'PP_OD_POWER_FEATURE_DISABLED_WHILE_GAMING', (PP_OD_POWER_FEATURE_ALWAYS_DISABLED:=2): 'PP_OD_POWER_FEATURE_ALWAYS_DISABLED'} +FanMode_e: dict[int, str] = {(FAN_MODE_AUTO:=0): 'FAN_MODE_AUTO', (FAN_MODE_MANUAL_LINEAR:=1): 'FAN_MODE_MANUAL_LINEAR'} +OD_FAIL_e: dict[int, str] = {(OD_NO_ERROR:=0): 'OD_NO_ERROR', (OD_REQUEST_ADVANCED_NOT_SUPPORTED:=1): 'OD_REQUEST_ADVANCED_NOT_SUPPORTED', (OD_UNSUPPORTED_FEATURE:=2): 'OD_UNSUPPORTED_FEATURE', (OD_INVALID_FEATURE_COMBO_ERROR:=3): 'OD_INVALID_FEATURE_COMBO_ERROR', (OD_GFXCLK_VF_CURVE_OFFSET_ERROR:=4): 'OD_GFXCLK_VF_CURVE_OFFSET_ERROR', (OD_VDD_GFX_VMAX_ERROR:=5): 'OD_VDD_GFX_VMAX_ERROR', (OD_VDD_SOC_VMAX_ERROR:=6): 'OD_VDD_SOC_VMAX_ERROR', (OD_PPT_ERROR:=7): 'OD_PPT_ERROR', (OD_FAN_MIN_PWM_ERROR:=8): 'OD_FAN_MIN_PWM_ERROR', (OD_FAN_ACOUSTIC_TARGET_ERROR:=9): 'OD_FAN_ACOUSTIC_TARGET_ERROR', (OD_FAN_ACOUSTIC_LIMIT_ERROR:=10): 'OD_FAN_ACOUSTIC_LIMIT_ERROR', (OD_FAN_TARGET_TEMP_ERROR:=11): 'OD_FAN_TARGET_TEMP_ERROR', (OD_FAN_ZERO_RPM_STOP_TEMP_ERROR:=12): 'OD_FAN_ZERO_RPM_STOP_TEMP_ERROR', (OD_FAN_CURVE_PWM_ERROR:=13): 'OD_FAN_CURVE_PWM_ERROR', (OD_FAN_CURVE_TEMP_ERROR:=14): 'OD_FAN_CURVE_TEMP_ERROR', (OD_FULL_CTRL_GFXCLK_ERROR:=15): 'OD_FULL_CTRL_GFXCLK_ERROR', (OD_FULL_CTRL_UCLK_ERROR:=16): 'OD_FULL_CTRL_UCLK_ERROR', (OD_FULL_CTRL_FCLK_ERROR:=17): 'OD_FULL_CTRL_FCLK_ERROR', (OD_FULL_CTRL_VDD_GFX_ERROR:=18): 'OD_FULL_CTRL_VDD_GFX_ERROR', (OD_FULL_CTRL_VDD_SOC_ERROR:=19): 'OD_FULL_CTRL_VDD_SOC_ERROR', (OD_TDC_ERROR:=20): 'OD_TDC_ERROR', (OD_GFXCLK_ERROR:=21): 'OD_GFXCLK_ERROR', (OD_UCLK_ERROR:=22): 'OD_UCLK_ERROR', (OD_FCLK_ERROR:=23): 'OD_FCLK_ERROR', (OD_OP_TEMP_ERROR:=24): 'OD_OP_TEMP_ERROR', (OD_OP_GFX_EDC_ERROR:=25): 'OD_OP_GFX_EDC_ERROR', (OD_OP_GFX_PCC_ERROR:=26): 'OD_OP_GFX_PCC_ERROR', (OD_POWER_FEATURE_CTRL_ERROR:=27): 'OD_POWER_FEATURE_CTRL_ERROR'} +@c.record +class OverDriveTable_t(c.Struct): + SIZE = 156 + FeatureCtrlMask: int + VoltageOffsetPerZoneBoundary: c.Array[ctypes.c_int16, Literal[6]] + VddGfxVmax: int + VddSocVmax: int + IdlePwrSavingFeaturesCtrl: int + RuntimePwrSavingFeaturesCtrl: int + Padding: int + GfxclkFoffset: int + Padding1: int + UclkFmin: int + UclkFmax: int + FclkFmin: int + FclkFmax: int + Ppt: int + Tdc: int + FanLinearPwmPoints: c.Array[ctypes.c_ubyte, Literal[6]] + FanLinearTempPoints: c.Array[ctypes.c_ubyte, Literal[6]] + FanMinimumPwm: int + AcousticTargetRpmThreshold: int + AcousticLimitRpmThreshold: int + FanTargetTemperature: int + FanZeroRpmEnable: int + FanZeroRpmStopTemp: int + FanMode: int + MaxOpTemp: int + AdvancedOdModeEnabled: int + Padding2: c.Array[ctypes.c_ubyte, Literal[3]] + GfxVoltageFullCtrlMode: int + SocVoltageFullCtrlMode: int + GfxclkFullCtrlMode: int + UclkFullCtrlMode: int + FclkFullCtrlMode: int + Padding3: int + GfxEdc: int + GfxPccLimitControl: int + GfxclkFmaxVmax: int + GfxclkFmaxVmaxTemperature: int + Padding4: c.Array[ctypes.c_ubyte, Literal[1]] + Spare: c.Array[ctypes.c_uint32, Literal[9]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +int16_t: TypeAlias = ctypes.c_int16 +OverDriveTable_t.register_fields([('FeatureCtrlMask', uint32_t, 0), ('VoltageOffsetPerZoneBoundary', c.Array[int16_t, Literal[6]], 4), ('VddGfxVmax', uint16_t, 16), ('VddSocVmax', uint16_t, 18), ('IdlePwrSavingFeaturesCtrl', uint8_t, 20), ('RuntimePwrSavingFeaturesCtrl', uint8_t, 21), ('Padding', uint16_t, 22), ('GfxclkFoffset', int16_t, 24), ('Padding1', uint16_t, 26), ('UclkFmin', uint16_t, 28), ('UclkFmax', uint16_t, 30), ('FclkFmin', uint16_t, 32), ('FclkFmax', uint16_t, 34), ('Ppt', int16_t, 36), ('Tdc', int16_t, 38), ('FanLinearPwmPoints', c.Array[uint8_t, Literal[6]], 40), ('FanLinearTempPoints', c.Array[uint8_t, Literal[6]], 46), ('FanMinimumPwm', uint16_t, 52), ('AcousticTargetRpmThreshold', uint16_t, 54), ('AcousticLimitRpmThreshold', uint16_t, 56), ('FanTargetTemperature', uint16_t, 58), ('FanZeroRpmEnable', uint8_t, 60), ('FanZeroRpmStopTemp', uint8_t, 61), ('FanMode', uint8_t, 62), ('MaxOpTemp', uint8_t, 63), ('AdvancedOdModeEnabled', uint8_t, 64), ('Padding2', c.Array[uint8_t, Literal[3]], 65), ('GfxVoltageFullCtrlMode', uint16_t, 68), ('SocVoltageFullCtrlMode', uint16_t, 70), ('GfxclkFullCtrlMode', uint16_t, 72), ('UclkFullCtrlMode', uint16_t, 74), ('FclkFullCtrlMode', uint16_t, 76), ('Padding3', uint16_t, 78), ('GfxEdc', int16_t, 80), ('GfxPccLimitControl', int16_t, 82), ('GfxclkFmaxVmax', uint16_t, 84), ('GfxclkFmaxVmaxTemperature', uint8_t, 86), ('Padding4', c.Array[uint8_t, Literal[1]], 87), ('Spare', c.Array[uint32_t, Literal[9]], 88), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 124)]) +@c.record +class OverDriveTableExternal_t(c.Struct): + SIZE = 156 + OverDriveTable: OverDriveTable_t +OverDriveTableExternal_t.register_fields([('OverDriveTable', OverDriveTable_t, 0)]) +@c.record +class OverDriveLimits_t(c.Struct): + SIZE = 96 + FeatureCtrlMask: int + VoltageOffsetPerZoneBoundary: c.Array[ctypes.c_int16, Literal[6]] + VddGfxVmax: int + VddSocVmax: int + GfxclkFoffset: int + Padding: int + UclkFmin: int + UclkFmax: int + FclkFmin: int + FclkFmax: int + Ppt: int + Tdc: int + FanLinearPwmPoints: c.Array[ctypes.c_ubyte, Literal[6]] + FanLinearTempPoints: c.Array[ctypes.c_ubyte, Literal[6]] + FanMinimumPwm: int + AcousticTargetRpmThreshold: int + AcousticLimitRpmThreshold: int + FanTargetTemperature: int + FanZeroRpmEnable: int + MaxOpTemp: int + Padding1: c.Array[ctypes.c_ubyte, Literal[2]] + GfxVoltageFullCtrlMode: int + SocVoltageFullCtrlMode: int + GfxclkFullCtrlMode: int + UclkFullCtrlMode: int + FclkFullCtrlMode: int + GfxEdc: int + GfxPccLimitControl: int + Padding2: int + Spare: c.Array[ctypes.c_uint32, Literal[5]] +OverDriveLimits_t.register_fields([('FeatureCtrlMask', uint32_t, 0), ('VoltageOffsetPerZoneBoundary', c.Array[int16_t, Literal[6]], 4), ('VddGfxVmax', uint16_t, 16), ('VddSocVmax', uint16_t, 18), ('GfxclkFoffset', int16_t, 20), ('Padding', uint16_t, 22), ('UclkFmin', uint16_t, 24), ('UclkFmax', uint16_t, 26), ('FclkFmin', uint16_t, 28), ('FclkFmax', uint16_t, 30), ('Ppt', int16_t, 32), ('Tdc', int16_t, 34), ('FanLinearPwmPoints', c.Array[uint8_t, Literal[6]], 36), ('FanLinearTempPoints', c.Array[uint8_t, Literal[6]], 42), ('FanMinimumPwm', uint16_t, 48), ('AcousticTargetRpmThreshold', uint16_t, 50), ('AcousticLimitRpmThreshold', uint16_t, 52), ('FanTargetTemperature', uint16_t, 54), ('FanZeroRpmEnable', uint8_t, 56), ('MaxOpTemp', uint8_t, 57), ('Padding1', c.Array[uint8_t, Literal[2]], 58), ('GfxVoltageFullCtrlMode', uint16_t, 60), ('SocVoltageFullCtrlMode', uint16_t, 62), ('GfxclkFullCtrlMode', uint16_t, 64), ('UclkFullCtrlMode', uint16_t, 66), ('FclkFullCtrlMode', uint16_t, 68), ('GfxEdc', int16_t, 70), ('GfxPccLimitControl', int16_t, 72), ('Padding2', int16_t, 74), ('Spare', c.Array[uint32_t, Literal[5]], 76)]) +BOARD_GPIO_TYPE_e: dict[int, str] = {(BOARD_GPIO_SMUIO_0:=0): 'BOARD_GPIO_SMUIO_0', (BOARD_GPIO_SMUIO_1:=1): 'BOARD_GPIO_SMUIO_1', (BOARD_GPIO_SMUIO_2:=2): 'BOARD_GPIO_SMUIO_2', (BOARD_GPIO_SMUIO_3:=3): 'BOARD_GPIO_SMUIO_3', (BOARD_GPIO_SMUIO_4:=4): 'BOARD_GPIO_SMUIO_4', (BOARD_GPIO_SMUIO_5:=5): 'BOARD_GPIO_SMUIO_5', (BOARD_GPIO_SMUIO_6:=6): 'BOARD_GPIO_SMUIO_6', (BOARD_GPIO_SMUIO_7:=7): 'BOARD_GPIO_SMUIO_7', (BOARD_GPIO_SMUIO_8:=8): 'BOARD_GPIO_SMUIO_8', (BOARD_GPIO_SMUIO_9:=9): 'BOARD_GPIO_SMUIO_9', (BOARD_GPIO_SMUIO_10:=10): 'BOARD_GPIO_SMUIO_10', (BOARD_GPIO_SMUIO_11:=11): 'BOARD_GPIO_SMUIO_11', (BOARD_GPIO_SMUIO_12:=12): 'BOARD_GPIO_SMUIO_12', (BOARD_GPIO_SMUIO_13:=13): 'BOARD_GPIO_SMUIO_13', (BOARD_GPIO_SMUIO_14:=14): 'BOARD_GPIO_SMUIO_14', (BOARD_GPIO_SMUIO_15:=15): 'BOARD_GPIO_SMUIO_15', (BOARD_GPIO_SMUIO_16:=16): 'BOARD_GPIO_SMUIO_16', (BOARD_GPIO_SMUIO_17:=17): 'BOARD_GPIO_SMUIO_17', (BOARD_GPIO_SMUIO_18:=18): 'BOARD_GPIO_SMUIO_18', (BOARD_GPIO_SMUIO_19:=19): 'BOARD_GPIO_SMUIO_19', (BOARD_GPIO_SMUIO_20:=20): 'BOARD_GPIO_SMUIO_20', (BOARD_GPIO_SMUIO_21:=21): 'BOARD_GPIO_SMUIO_21', (BOARD_GPIO_SMUIO_22:=22): 'BOARD_GPIO_SMUIO_22', (BOARD_GPIO_SMUIO_23:=23): 'BOARD_GPIO_SMUIO_23', (BOARD_GPIO_SMUIO_24:=24): 'BOARD_GPIO_SMUIO_24', (BOARD_GPIO_SMUIO_25:=25): 'BOARD_GPIO_SMUIO_25', (BOARD_GPIO_SMUIO_26:=26): 'BOARD_GPIO_SMUIO_26', (BOARD_GPIO_SMUIO_27:=27): 'BOARD_GPIO_SMUIO_27', (BOARD_GPIO_SMUIO_28:=28): 'BOARD_GPIO_SMUIO_28', (BOARD_GPIO_SMUIO_29:=29): 'BOARD_GPIO_SMUIO_29', (BOARD_GPIO_SMUIO_30:=30): 'BOARD_GPIO_SMUIO_30', (BOARD_GPIO_SMUIO_31:=31): 'BOARD_GPIO_SMUIO_31', (MAX_BOARD_GPIO_SMUIO_NUM:=32): 'MAX_BOARD_GPIO_SMUIO_NUM', (BOARD_GPIO_DC_GEN_A:=33): 'BOARD_GPIO_DC_GEN_A', (BOARD_GPIO_DC_GEN_B:=34): 'BOARD_GPIO_DC_GEN_B', (BOARD_GPIO_DC_GEN_C:=35): 'BOARD_GPIO_DC_GEN_C', (BOARD_GPIO_DC_GEN_D:=36): 'BOARD_GPIO_DC_GEN_D', (BOARD_GPIO_DC_GEN_E:=37): 'BOARD_GPIO_DC_GEN_E', (BOARD_GPIO_DC_GEN_F:=38): 'BOARD_GPIO_DC_GEN_F', (BOARD_GPIO_DC_GEN_G:=39): 'BOARD_GPIO_DC_GEN_G', (BOARD_GPIO_DC_GENLK_CLK:=40): 'BOARD_GPIO_DC_GENLK_CLK', (BOARD_GPIO_DC_GENLK_VSYNC:=41): 'BOARD_GPIO_DC_GENLK_VSYNC', (BOARD_GPIO_DC_SWAPLOCK_A:=42): 'BOARD_GPIO_DC_SWAPLOCK_A', (BOARD_GPIO_DC_SWAPLOCK_B:=43): 'BOARD_GPIO_DC_SWAPLOCK_B', (MAX_BOARD_DC_GPIO_NUM:=44): 'MAX_BOARD_DC_GPIO_NUM', (BOARD_GPIO_LV_EN:=45): 'BOARD_GPIO_LV_EN'} +@c.record +class BootValues_t(c.Struct): + SIZE = 124 + InitImuClk: int + InitSocclk: int + InitMpioclk: int + InitSmnclk: int + InitDispClk: int + InitDppClk: int + InitDprefclk: int + InitDcfclk: int + InitDtbclk: int + InitDbguSocClk: int + InitGfxclk_bypass: int + InitMp1clk: int + InitLclk: int + InitDbguBacoClk: int + InitBaco400clk: int + InitBaco1200clk_bypass: int + InitBaco700clk_bypass: int + InitBaco500clk: int + InitDclk0: int + InitVclk0: int + InitFclk: int + Padding1: int + InitUclkLevel: int + Padding: c.Array[ctypes.c_ubyte, Literal[3]] + InitVcoFreqPll0: int + InitVcoFreqPll1: int + InitVcoFreqPll2: int + InitVcoFreqPll3: int + InitVcoFreqPll4: int + InitVcoFreqPll5: int + InitVcoFreqPll6: int + InitVcoFreqPll7: int + InitVcoFreqPll8: int + InitGfx: int + InitSoc: int + InitVddIoMem: int + InitVddCiMem: int + Spare: c.Array[ctypes.c_uint32, Literal[8]] +BootValues_t.register_fields([('InitImuClk', uint16_t, 0), ('InitSocclk', uint16_t, 2), ('InitMpioclk', uint16_t, 4), ('InitSmnclk', uint16_t, 6), ('InitDispClk', uint16_t, 8), ('InitDppClk', uint16_t, 10), ('InitDprefclk', uint16_t, 12), ('InitDcfclk', uint16_t, 14), ('InitDtbclk', uint16_t, 16), ('InitDbguSocClk', uint16_t, 18), ('InitGfxclk_bypass', uint16_t, 20), ('InitMp1clk', uint16_t, 22), ('InitLclk', uint16_t, 24), ('InitDbguBacoClk', uint16_t, 26), ('InitBaco400clk', uint16_t, 28), ('InitBaco1200clk_bypass', uint16_t, 30), ('InitBaco700clk_bypass', uint16_t, 32), ('InitBaco500clk', uint16_t, 34), ('InitDclk0', uint16_t, 36), ('InitVclk0', uint16_t, 38), ('InitFclk', uint16_t, 40), ('Padding1', uint16_t, 42), ('InitUclkLevel', uint8_t, 44), ('Padding', c.Array[uint8_t, Literal[3]], 45), ('InitVcoFreqPll0', uint32_t, 48), ('InitVcoFreqPll1', uint32_t, 52), ('InitVcoFreqPll2', uint32_t, 56), ('InitVcoFreqPll3', uint32_t, 60), ('InitVcoFreqPll4', uint32_t, 64), ('InitVcoFreqPll5', uint32_t, 68), ('InitVcoFreqPll6', uint32_t, 72), ('InitVcoFreqPll7', uint32_t, 76), ('InitVcoFreqPll8', uint32_t, 80), ('InitGfx', uint16_t, 84), ('InitSoc', uint16_t, 86), ('InitVddIoMem', uint16_t, 88), ('InitVddCiMem', uint16_t, 90), ('Spare', c.Array[uint32_t, Literal[8]], 92)]) +@c.record +class MsgLimits_t(c.Struct): + SIZE = 116 + Power: c.Array[c.Array[ctypes.c_uint16, Literal[2]], Literal[4]] + Tdc: c.Array[ctypes.c_uint16, Literal[2]] + Temperature: c.Array[ctypes.c_uint16, Literal[12]] + PwmLimitMin: int + PwmLimitMax: int + FanTargetTemperature: int + Spare1: c.Array[ctypes.c_ubyte, Literal[1]] + AcousticTargetRpmThresholdMin: int + AcousticTargetRpmThresholdMax: int + AcousticLimitRpmThresholdMin: int + AcousticLimitRpmThresholdMax: int + PccLimitMin: int + PccLimitMax: int + FanStopTempMin: int + FanStopTempMax: int + FanStartTempMin: int + FanStartTempMax: int + PowerMinPpt0: c.Array[ctypes.c_uint16, Literal[2]] + Spare: c.Array[ctypes.c_uint32, Literal[11]] +MsgLimits_t.register_fields([('Power', c.Array[c.Array[uint16_t, Literal[2]], Literal[4]], 0), ('Tdc', c.Array[uint16_t, Literal[2]], 16), ('Temperature', c.Array[uint16_t, Literal[12]], 20), ('PwmLimitMin', uint8_t, 44), ('PwmLimitMax', uint8_t, 45), ('FanTargetTemperature', uint8_t, 46), ('Spare1', c.Array[uint8_t, Literal[1]], 47), ('AcousticTargetRpmThresholdMin', uint16_t, 48), ('AcousticTargetRpmThresholdMax', uint16_t, 50), ('AcousticLimitRpmThresholdMin', uint16_t, 52), ('AcousticLimitRpmThresholdMax', uint16_t, 54), ('PccLimitMin', uint16_t, 56), ('PccLimitMax', uint16_t, 58), ('FanStopTempMin', uint16_t, 60), ('FanStopTempMax', uint16_t, 62), ('FanStartTempMin', uint16_t, 64), ('FanStartTempMax', uint16_t, 66), ('PowerMinPpt0', c.Array[uint16_t, Literal[2]], 68), ('Spare', c.Array[uint32_t, Literal[11]], 72)]) +@c.record +class DriverReportedClocks_t(c.Struct): + SIZE = 28 + BaseClockAc: int + GameClockAc: int + BoostClockAc: int + BaseClockDc: int + GameClockDc: int + BoostClockDc: int + MaxReportedClock: int + Padding: int + Reserved: c.Array[ctypes.c_uint32, Literal[3]] +DriverReportedClocks_t.register_fields([('BaseClockAc', uint16_t, 0), ('GameClockAc', uint16_t, 2), ('BoostClockAc', uint16_t, 4), ('BaseClockDc', uint16_t, 6), ('GameClockDc', uint16_t, 8), ('BoostClockDc', uint16_t, 10), ('MaxReportedClock', uint16_t, 12), ('Padding', uint16_t, 14), ('Reserved', c.Array[uint32_t, Literal[3]], 16)]) +@c.record +class AvfsDcBtcParams_t(c.Struct): + SIZE = 20 + DcBtcEnabled: int + Padding: c.Array[ctypes.c_ubyte, Literal[3]] + DcTol: int + DcBtcGb: int + DcBtcMin: int + DcBtcMax: int + DcBtcGbScalar: LinearInt_t +AvfsDcBtcParams_t.register_fields([('DcBtcEnabled', uint8_t, 0), ('Padding', c.Array[uint8_t, Literal[3]], 1), ('DcTol', uint16_t, 4), ('DcBtcGb', uint16_t, 6), ('DcBtcMin', uint16_t, 8), ('DcBtcMax', uint16_t, 10), ('DcBtcGbScalar', LinearInt_t, 12)]) +@c.record +class AvfsFuseOverride_t(c.Struct): + SIZE = 56 + AvfsTemp: c.Array[ctypes.c_uint16, Literal[2]] + VftFMin: int + VInversion: int + qVft: c.Array[QuadraticInt_t, Literal[2]] + qAvfsGb: QuadraticInt_t + qAvfsGb2: QuadraticInt_t +AvfsFuseOverride_t.register_fields([('AvfsTemp', c.Array[uint16_t, Literal[2]], 0), ('VftFMin', uint16_t, 4), ('VInversion', uint16_t, 6), ('qVft', c.Array[QuadraticInt_t, Literal[2]], 8), ('qAvfsGb', QuadraticInt_t, 32), ('qAvfsGb2', QuadraticInt_t, 44)]) +@c.record +class PFE_Settings_t(c.Struct): + SIZE = 28 + Version: int + Spare8: c.Array[ctypes.c_ubyte, Literal[3]] + FeaturesToRun: c.Array[ctypes.c_uint32, Literal[2]] + FwDStateMask: int + DebugOverrides: int + Spare: c.Array[ctypes.c_uint32, Literal[2]] +PFE_Settings_t.register_fields([('Version', uint8_t, 0), ('Spare8', c.Array[uint8_t, Literal[3]], 1), ('FeaturesToRun', c.Array[uint32_t, Literal[2]], 4), ('FwDStateMask', uint32_t, 12), ('DebugOverrides', uint32_t, 16), ('Spare', c.Array[uint32_t, Literal[2]], 20)]) +@c.record +class SkuTable_t(c.Struct): + SIZE = 3552 + Version: int + TotalPowerConfig: int + CustomerVariant: int + MemoryTemperatureTypeMask: int + SmartShiftVersion: int + SocketPowerLimitSpare: c.Array[ctypes.c_ubyte, Literal[10]] + EnableLegacyPptLimit: int + UseInputTelemetry: int + SmartShiftMinReportedPptinDcs: int + PaddingPpt: c.Array[ctypes.c_ubyte, Literal[7]] + HwCtfTempLimit: int + PaddingInfra: int + FitControllerFailureRateLimit: int + FitControllerGfxDutyCycle: int + FitControllerSocDutyCycle: int + FitControllerSocOffset: int + GfxApccPlusResidencyLimit: int + ThrottlerControlMask: int + UlvVoltageOffset: c.Array[ctypes.c_uint16, Literal[2]] + Padding: c.Array[ctypes.c_ubyte, Literal[2]] + DeepUlvVoltageOffsetSoc: int + DefaultMaxVoltage: c.Array[ctypes.c_uint16, Literal[2]] + BoostMaxVoltage: c.Array[ctypes.c_uint16, Literal[2]] + VminTempHystersis: c.Array[ctypes.c_int16, Literal[2]] + VminTempThreshold: c.Array[ctypes.c_int16, Literal[2]] + Vmin_Hot_T0: c.Array[ctypes.c_uint16, Literal[2]] + Vmin_Cold_T0: c.Array[ctypes.c_uint16, Literal[2]] + Vmin_Hot_Eol: c.Array[ctypes.c_uint16, Literal[2]] + Vmin_Cold_Eol: c.Array[ctypes.c_uint16, Literal[2]] + Vmin_Aging_Offset: c.Array[ctypes.c_uint16, Literal[2]] + Spare_Vmin_Plat_Offset_Hot: c.Array[ctypes.c_uint16, Literal[2]] + Spare_Vmin_Plat_Offset_Cold: c.Array[ctypes.c_uint16, Literal[2]] + VcBtcFixedVminAgingOffset: c.Array[ctypes.c_uint16, Literal[2]] + VcBtcVmin2PsmDegrationGb: c.Array[ctypes.c_uint16, Literal[2]] + VcBtcPsmA: c.Array[ctypes.c_uint32, Literal[2]] + VcBtcPsmB: c.Array[ctypes.c_uint32, Literal[2]] + VcBtcVminA: c.Array[ctypes.c_uint32, Literal[2]] + VcBtcVminB: c.Array[ctypes.c_uint32, Literal[2]] + PerPartVminEnabled: c.Array[ctypes.c_ubyte, Literal[2]] + VcBtcEnabled: c.Array[ctypes.c_ubyte, Literal[2]] + SocketPowerLimitAcTau: c.Array[ctypes.c_uint16, Literal[4]] + SocketPowerLimitDcTau: c.Array[ctypes.c_uint16, Literal[4]] + Gfx_Vmin_droop: QuadraticInt_t + Soc_Vmin_droop: QuadraticInt_t + SpareVmin: c.Array[ctypes.c_uint32, Literal[6]] + DpmDescriptor: c.Array[DpmDescriptor_t, Literal[11]] + FreqTableGfx: c.Array[ctypes.c_uint16, Literal[16]] + FreqTableVclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableSocclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableUclk: c.Array[ctypes.c_uint16, Literal[6]] + FreqTableShadowUclk: c.Array[ctypes.c_uint16, Literal[6]] + FreqTableDispclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDppClk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDprefclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDcfclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDtbclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableFclk: c.Array[ctypes.c_uint16, Literal[8]] + DcModeMaxFreq: c.Array[ctypes.c_uint32, Literal[11]] + GfxclkAibFmax: int + GfxDpmPadding: int + GfxclkFgfxoffEntry: int + GfxclkFgfxoffExitImu: int + GfxclkFgfxoffExitRlc: int + GfxclkThrottleClock: int + EnableGfxPowerStagesGpio: int + GfxIdlePadding: int + SmsRepairWRCKClkDivEn: int + SmsRepairWRCKClkDivVal: int + GfxOffEntryEarlyMGCGEn: int + GfxOffEntryForceCGCGEn: int + GfxOffEntryForceCGCGDelayEn: int + GfxOffEntryForceCGCGDelayVal: int + GfxclkFreqGfxUlv: int + GfxIdlePadding2: c.Array[ctypes.c_ubyte, Literal[2]] + GfxOffEntryHysteresis: int + GfxoffSpare: c.Array[ctypes.c_uint32, Literal[15]] + DfllMstrOscConfigA: int + DfllSlvOscConfigA: int + DfllBtcMasterScalerM: int + DfllBtcMasterScalerB: int + DfllBtcSlaveScalerM: int + DfllBtcSlaveScalerB: int + DfllPccAsWaitCtrl: int + DfllPccAsStepCtrl: int + GfxDfllSpare: c.Array[ctypes.c_uint32, Literal[9]] + DvoPsmDownThresholdVoltage: int + DvoPsmUpThresholdVoltage: int + DvoFmaxLowScaler: int + PaddingDcs: int + DcsMinGfxOffTime: int + DcsMaxGfxOffTime: int + DcsMinCreditAccum: int + DcsExitHysteresis: int + DcsTimeout: int + DcsPfGfxFopt: int + DcsPfUclkFopt: int + FoptEnabled: int + DcsSpare2: c.Array[ctypes.c_ubyte, Literal[3]] + DcsFoptM: int + DcsFoptB: int + DcsSpare: c.Array[ctypes.c_uint32, Literal[9]] + UseStrobeModeOptimizations: int + PaddingMem: c.Array[ctypes.c_ubyte, Literal[3]] + UclkDpmPstates: c.Array[ctypes.c_ubyte, Literal[6]] + UclkDpmShadowPstates: c.Array[ctypes.c_ubyte, Literal[6]] + FreqTableUclkDiv: c.Array[ctypes.c_ubyte, Literal[6]] + FreqTableShadowUclkDiv: c.Array[ctypes.c_ubyte, Literal[6]] + MemVmempVoltage: c.Array[ctypes.c_uint16, Literal[6]] + MemVddioVoltage: c.Array[ctypes.c_uint16, Literal[6]] + DalDcModeMaxUclkFreq: int + PaddingsMem: c.Array[ctypes.c_ubyte, Literal[2]] + PaddingFclk: int + PcieGenSpeed: c.Array[ctypes.c_ubyte, Literal[3]] + PcieLaneCount: c.Array[ctypes.c_ubyte, Literal[3]] + LclkFreq: c.Array[ctypes.c_uint16, Literal[3]] + OverrideGfxAvfsFuses: int + GfxAvfsPadding: c.Array[ctypes.c_ubyte, Literal[1]] + DroopGBStDev: int + SocHwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[32]] + GfxL2HwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[32]] + PsmDidt_Vcross: c.Array[ctypes.c_uint16, Literal[2]] + PsmDidt_StaticDroop_A: c.Array[ctypes.c_uint32, Literal[3]] + PsmDidt_StaticDroop_B: c.Array[ctypes.c_uint32, Literal[3]] + PsmDidt_DynDroop_A: c.Array[ctypes.c_uint32, Literal[3]] + PsmDidt_DynDroop_B: c.Array[ctypes.c_uint32, Literal[3]] + spare_HwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[19]] + SocCommonRtAvfs: c.Array[ctypes.c_uint32, Literal[13]] + GfxCommonRtAvfs: c.Array[ctypes.c_uint32, Literal[13]] + SocFwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[19]] + GfxL2FwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[19]] + spare_FwRtAvfsFuses: c.Array[ctypes.c_uint32, Literal[19]] + Soc_Droop_PWL_F: c.Array[ctypes.c_uint32, Literal[5]] + Soc_Droop_PWL_a: c.Array[ctypes.c_uint32, Literal[5]] + Soc_Droop_PWL_b: c.Array[ctypes.c_uint32, Literal[5]] + Soc_Droop_PWL_c: c.Array[ctypes.c_uint32, Literal[5]] + Gfx_Droop_PWL_F: c.Array[ctypes.c_uint32, Literal[5]] + Gfx_Droop_PWL_a: c.Array[ctypes.c_uint32, Literal[5]] + Gfx_Droop_PWL_b: c.Array[ctypes.c_uint32, Literal[5]] + Gfx_Droop_PWL_c: c.Array[ctypes.c_uint32, Literal[5]] + Gfx_Static_PWL_Offset: c.Array[ctypes.c_uint32, Literal[5]] + Soc_Static_PWL_Offset: c.Array[ctypes.c_uint32, Literal[5]] + dGbV_dT_vmin: int + dGbV_dT_vmax: int + PaddingV2F: c.Array[ctypes.c_uint32, Literal[4]] + DcBtcGfxParams: AvfsDcBtcParams_t + SSCurve_GFX: QuadraticInt_t + GfxAvfsSpare: c.Array[ctypes.c_uint32, Literal[29]] + OverrideSocAvfsFuses: int + MinSocAvfsRevision: int + SocAvfsPadding: c.Array[ctypes.c_ubyte, Literal[2]] + SocAvfsFuseOverride: c.Array[AvfsFuseOverride_t, Literal[1]] + dBtcGbSoc: c.Array[DroopInt_t, Literal[1]] + qAgingGb: c.Array[LinearInt_t, Literal[1]] + qStaticVoltageOffset: c.Array[QuadraticInt_t, Literal[1]] + DcBtcSocParams: c.Array[AvfsDcBtcParams_t, Literal[1]] + SSCurve_SOC: QuadraticInt_t + SocAvfsSpare: c.Array[ctypes.c_uint32, Literal[29]] + BootValues: BootValues_t + DriverReportedClocks: DriverReportedClocks_t + MsgLimits: MsgLimits_t + OverDriveLimitsBasicMin: OverDriveLimits_t + OverDriveLimitsBasicMax: OverDriveLimits_t + OverDriveLimitsAdvancedMin: OverDriveLimits_t + OverDriveLimitsAdvancedMax: OverDriveLimits_t + TotalBoardPowerSupport: int + TotalBoardPowerPadding: c.Array[ctypes.c_ubyte, Literal[1]] + TotalBoardPowerRoc: int + qFeffCoeffGameClock: c.Array[QuadraticInt_t, Literal[2]] + qFeffCoeffBaseClock: c.Array[QuadraticInt_t, Literal[2]] + qFeffCoeffBoostClock: c.Array[QuadraticInt_t, Literal[2]] + AptUclkGfxclkLookup: c.Array[c.Array[ctypes.c_int32, Literal[6]], Literal[2]] + AptUclkGfxclkLookupHyst: c.Array[c.Array[ctypes.c_uint32, Literal[6]], Literal[2]] + AptPadding: int + GfxXvminDidtDroopThresh: QuadraticInt_t + GfxXvminDidtResetDDWait: int + GfxXvminDidtClkStopWait: int + GfxXvminDidtFcsStepCtrl: int + GfxXvminDidtFcsWaitCtrl: int + PsmModeEnabled: int + P2v_a: int + P2v_b: int + P2v_c: int + T2p_a: int + T2p_b: int + T2p_c: int + P2vTemp: int + PsmDidtStaticSettings: QuadraticInt_t + PsmDidtDynamicSettings: QuadraticInt_t + PsmDidtAvgDiv: int + PsmDidtForceStall: int + PsmDidtReleaseTimer: int + PsmDidtStallPattern: int + CacEdcCacLeakageC0: int + CacEdcCacLeakageC1: int + CacEdcCacLeakageC2: int + CacEdcCacLeakageC3: int + CacEdcCacLeakageC4: int + CacEdcCacLeakageC5: int + CacEdcGfxClkScalar: int + CacEdcGfxClkIntercept: int + CacEdcCac_m: int + CacEdcCac_b: int + CacEdcCurrLimitGuardband: int + CacEdcDynToTotalCacRatio: int + XVmin_Gfx_EdcThreshScalar: int + XVmin_Gfx_EdcEnableFreq: int + XVmin_Gfx_EdcPccAsStepCtrl: int + XVmin_Gfx_EdcPccAsWaitCtrl: int + XVmin_Gfx_EdcThreshold: int + XVmin_Gfx_EdcFiltHysWaitCtrl: int + XVmin_Soc_EdcThreshScalar: int + XVmin_Soc_EdcEnableFreq: int + XVmin_Soc_EdcThreshold: int + XVmin_Soc_EdcStepUpTime: int + XVmin_Soc_EdcStepDownTime: int + XVmin_Soc_EdcInitPccStep: int + PaddingSocEdc: c.Array[ctypes.c_ubyte, Literal[3]] + GfxXvminFuseOverride: int + SocXvminFuseOverride: int + PaddingXvminFuseOverride: c.Array[ctypes.c_ubyte, Literal[2]] + GfxXvminFddTempLow: int + GfxXvminFddTempHigh: int + SocXvminFddTempLow: int + SocXvminFddTempHigh: int + GfxXvminFddVolt0: int + GfxXvminFddVolt1: int + GfxXvminFddVolt2: int + SocXvminFddVolt0: int + SocXvminFddVolt1: int + SocXvminFddVolt2: int + GfxXvminDsFddDsm: c.Array[ctypes.c_uint16, Literal[6]] + GfxXvminEdcFddDsm: c.Array[ctypes.c_uint16, Literal[6]] + SocXvminEdcFddDsm: c.Array[ctypes.c_uint16, Literal[6]] + Spare: int + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +int32_t: TypeAlias = ctypes.c_int32 +SkuTable_t.register_fields([('Version', uint32_t, 0), ('TotalPowerConfig', uint8_t, 4), ('CustomerVariant', uint8_t, 5), ('MemoryTemperatureTypeMask', uint8_t, 6), ('SmartShiftVersion', uint8_t, 7), ('SocketPowerLimitSpare', c.Array[uint8_t, Literal[10]], 8), ('EnableLegacyPptLimit', uint8_t, 18), ('UseInputTelemetry', uint8_t, 19), ('SmartShiftMinReportedPptinDcs', uint8_t, 20), ('PaddingPpt', c.Array[uint8_t, Literal[7]], 21), ('HwCtfTempLimit', uint16_t, 28), ('PaddingInfra', uint16_t, 30), ('FitControllerFailureRateLimit', uint32_t, 32), ('FitControllerGfxDutyCycle', uint32_t, 36), ('FitControllerSocDutyCycle', uint32_t, 40), ('FitControllerSocOffset', uint32_t, 44), ('GfxApccPlusResidencyLimit', uint32_t, 48), ('ThrottlerControlMask', uint32_t, 52), ('UlvVoltageOffset', c.Array[uint16_t, Literal[2]], 56), ('Padding', c.Array[uint8_t, Literal[2]], 60), ('DeepUlvVoltageOffsetSoc', uint16_t, 62), ('DefaultMaxVoltage', c.Array[uint16_t, Literal[2]], 64), ('BoostMaxVoltage', c.Array[uint16_t, Literal[2]], 68), ('VminTempHystersis', c.Array[int16_t, Literal[2]], 72), ('VminTempThreshold', c.Array[int16_t, Literal[2]], 76), ('Vmin_Hot_T0', c.Array[uint16_t, Literal[2]], 80), ('Vmin_Cold_T0', c.Array[uint16_t, Literal[2]], 84), ('Vmin_Hot_Eol', c.Array[uint16_t, Literal[2]], 88), ('Vmin_Cold_Eol', c.Array[uint16_t, Literal[2]], 92), ('Vmin_Aging_Offset', c.Array[uint16_t, Literal[2]], 96), ('Spare_Vmin_Plat_Offset_Hot', c.Array[uint16_t, Literal[2]], 100), ('Spare_Vmin_Plat_Offset_Cold', c.Array[uint16_t, Literal[2]], 104), ('VcBtcFixedVminAgingOffset', c.Array[uint16_t, Literal[2]], 108), ('VcBtcVmin2PsmDegrationGb', c.Array[uint16_t, Literal[2]], 112), ('VcBtcPsmA', c.Array[uint32_t, Literal[2]], 116), ('VcBtcPsmB', c.Array[uint32_t, Literal[2]], 124), ('VcBtcVminA', c.Array[uint32_t, Literal[2]], 132), ('VcBtcVminB', c.Array[uint32_t, Literal[2]], 140), ('PerPartVminEnabled', c.Array[uint8_t, Literal[2]], 148), ('VcBtcEnabled', c.Array[uint8_t, Literal[2]], 150), ('SocketPowerLimitAcTau', c.Array[uint16_t, Literal[4]], 152), ('SocketPowerLimitDcTau', c.Array[uint16_t, Literal[4]], 160), ('Gfx_Vmin_droop', QuadraticInt_t, 168), ('Soc_Vmin_droop', QuadraticInt_t, 180), ('SpareVmin', c.Array[uint32_t, Literal[6]], 192), ('DpmDescriptor', c.Array[DpmDescriptor_t, Literal[11]], 216), ('FreqTableGfx', c.Array[uint16_t, Literal[16]], 568), ('FreqTableVclk', c.Array[uint16_t, Literal[8]], 600), ('FreqTableDclk', c.Array[uint16_t, Literal[8]], 616), ('FreqTableSocclk', c.Array[uint16_t, Literal[8]], 632), ('FreqTableUclk', c.Array[uint16_t, Literal[6]], 648), ('FreqTableShadowUclk', c.Array[uint16_t, Literal[6]], 660), ('FreqTableDispclk', c.Array[uint16_t, Literal[8]], 672), ('FreqTableDppClk', c.Array[uint16_t, Literal[8]], 688), ('FreqTableDprefclk', c.Array[uint16_t, Literal[8]], 704), ('FreqTableDcfclk', c.Array[uint16_t, Literal[8]], 720), ('FreqTableDtbclk', c.Array[uint16_t, Literal[8]], 736), ('FreqTableFclk', c.Array[uint16_t, Literal[8]], 752), ('DcModeMaxFreq', c.Array[uint32_t, Literal[11]], 768), ('GfxclkAibFmax', uint16_t, 812), ('GfxDpmPadding', uint16_t, 814), ('GfxclkFgfxoffEntry', uint16_t, 816), ('GfxclkFgfxoffExitImu', uint16_t, 818), ('GfxclkFgfxoffExitRlc', uint16_t, 820), ('GfxclkThrottleClock', uint16_t, 822), ('EnableGfxPowerStagesGpio', uint8_t, 824), ('GfxIdlePadding', uint8_t, 825), ('SmsRepairWRCKClkDivEn', uint8_t, 826), ('SmsRepairWRCKClkDivVal', uint8_t, 827), ('GfxOffEntryEarlyMGCGEn', uint8_t, 828), ('GfxOffEntryForceCGCGEn', uint8_t, 829), ('GfxOffEntryForceCGCGDelayEn', uint8_t, 830), ('GfxOffEntryForceCGCGDelayVal', uint8_t, 831), ('GfxclkFreqGfxUlv', uint16_t, 832), ('GfxIdlePadding2', c.Array[uint8_t, Literal[2]], 834), ('GfxOffEntryHysteresis', uint32_t, 836), ('GfxoffSpare', c.Array[uint32_t, Literal[15]], 840), ('DfllMstrOscConfigA', uint16_t, 900), ('DfllSlvOscConfigA', uint16_t, 902), ('DfllBtcMasterScalerM', uint32_t, 904), ('DfllBtcMasterScalerB', int32_t, 908), ('DfllBtcSlaveScalerM', uint32_t, 912), ('DfllBtcSlaveScalerB', int32_t, 916), ('DfllPccAsWaitCtrl', uint32_t, 920), ('DfllPccAsStepCtrl', uint32_t, 924), ('GfxDfllSpare', c.Array[uint32_t, Literal[9]], 928), ('DvoPsmDownThresholdVoltage', uint32_t, 964), ('DvoPsmUpThresholdVoltage', uint32_t, 968), ('DvoFmaxLowScaler', uint32_t, 972), ('PaddingDcs', uint32_t, 976), ('DcsMinGfxOffTime', uint16_t, 980), ('DcsMaxGfxOffTime', uint16_t, 982), ('DcsMinCreditAccum', uint32_t, 984), ('DcsExitHysteresis', uint16_t, 988), ('DcsTimeout', uint16_t, 990), ('DcsPfGfxFopt', uint32_t, 992), ('DcsPfUclkFopt', uint32_t, 996), ('FoptEnabled', uint8_t, 1000), ('DcsSpare2', c.Array[uint8_t, Literal[3]], 1001), ('DcsFoptM', uint32_t, 1004), ('DcsFoptB', uint32_t, 1008), ('DcsSpare', c.Array[uint32_t, Literal[9]], 1012), ('UseStrobeModeOptimizations', uint8_t, 1048), ('PaddingMem', c.Array[uint8_t, Literal[3]], 1049), ('UclkDpmPstates', c.Array[uint8_t, Literal[6]], 1052), ('UclkDpmShadowPstates', c.Array[uint8_t, Literal[6]], 1058), ('FreqTableUclkDiv', c.Array[uint8_t, Literal[6]], 1064), ('FreqTableShadowUclkDiv', c.Array[uint8_t, Literal[6]], 1070), ('MemVmempVoltage', c.Array[uint16_t, Literal[6]], 1076), ('MemVddioVoltage', c.Array[uint16_t, Literal[6]], 1088), ('DalDcModeMaxUclkFreq', uint16_t, 1100), ('PaddingsMem', c.Array[uint8_t, Literal[2]], 1102), ('PaddingFclk', uint32_t, 1104), ('PcieGenSpeed', c.Array[uint8_t, Literal[3]], 1108), ('PcieLaneCount', c.Array[uint8_t, Literal[3]], 1111), ('LclkFreq', c.Array[uint16_t, Literal[3]], 1114), ('OverrideGfxAvfsFuses', uint8_t, 1120), ('GfxAvfsPadding', c.Array[uint8_t, Literal[1]], 1121), ('DroopGBStDev', uint16_t, 1122), ('SocHwRtAvfsFuses', c.Array[uint32_t, Literal[32]], 1124), ('GfxL2HwRtAvfsFuses', c.Array[uint32_t, Literal[32]], 1252), ('PsmDidt_Vcross', c.Array[uint16_t, Literal[2]], 1380), ('PsmDidt_StaticDroop_A', c.Array[uint32_t, Literal[3]], 1384), ('PsmDidt_StaticDroop_B', c.Array[uint32_t, Literal[3]], 1396), ('PsmDidt_DynDroop_A', c.Array[uint32_t, Literal[3]], 1408), ('PsmDidt_DynDroop_B', c.Array[uint32_t, Literal[3]], 1420), ('spare_HwRtAvfsFuses', c.Array[uint32_t, Literal[19]], 1432), ('SocCommonRtAvfs', c.Array[uint32_t, Literal[13]], 1508), ('GfxCommonRtAvfs', c.Array[uint32_t, Literal[13]], 1560), ('SocFwRtAvfsFuses', c.Array[uint32_t, Literal[19]], 1612), ('GfxL2FwRtAvfsFuses', c.Array[uint32_t, Literal[19]], 1688), ('spare_FwRtAvfsFuses', c.Array[uint32_t, Literal[19]], 1764), ('Soc_Droop_PWL_F', c.Array[uint32_t, Literal[5]], 1840), ('Soc_Droop_PWL_a', c.Array[uint32_t, Literal[5]], 1860), ('Soc_Droop_PWL_b', c.Array[uint32_t, Literal[5]], 1880), ('Soc_Droop_PWL_c', c.Array[uint32_t, Literal[5]], 1900), ('Gfx_Droop_PWL_F', c.Array[uint32_t, Literal[5]], 1920), ('Gfx_Droop_PWL_a', c.Array[uint32_t, Literal[5]], 1940), ('Gfx_Droop_PWL_b', c.Array[uint32_t, Literal[5]], 1960), ('Gfx_Droop_PWL_c', c.Array[uint32_t, Literal[5]], 1980), ('Gfx_Static_PWL_Offset', c.Array[uint32_t, Literal[5]], 2000), ('Soc_Static_PWL_Offset', c.Array[uint32_t, Literal[5]], 2020), ('dGbV_dT_vmin', uint32_t, 2040), ('dGbV_dT_vmax', uint32_t, 2044), ('PaddingV2F', c.Array[uint32_t, Literal[4]], 2048), ('DcBtcGfxParams', AvfsDcBtcParams_t, 2064), ('SSCurve_GFX', QuadraticInt_t, 2084), ('GfxAvfsSpare', c.Array[uint32_t, Literal[29]], 2096), ('OverrideSocAvfsFuses', uint8_t, 2212), ('MinSocAvfsRevision', uint8_t, 2213), ('SocAvfsPadding', c.Array[uint8_t, Literal[2]], 2214), ('SocAvfsFuseOverride', c.Array[AvfsFuseOverride_t, Literal[1]], 2216), ('dBtcGbSoc', c.Array[DroopInt_t, Literal[1]], 2272), ('qAgingGb', c.Array[LinearInt_t, Literal[1]], 2284), ('qStaticVoltageOffset', c.Array[QuadraticInt_t, Literal[1]], 2292), ('DcBtcSocParams', c.Array[AvfsDcBtcParams_t, Literal[1]], 2304), ('SSCurve_SOC', QuadraticInt_t, 2324), ('SocAvfsSpare', c.Array[uint32_t, Literal[29]], 2336), ('BootValues', BootValues_t, 2452), ('DriverReportedClocks', DriverReportedClocks_t, 2576), ('MsgLimits', MsgLimits_t, 2604), ('OverDriveLimitsBasicMin', OverDriveLimits_t, 2720), ('OverDriveLimitsBasicMax', OverDriveLimits_t, 2816), ('OverDriveLimitsAdvancedMin', OverDriveLimits_t, 2912), ('OverDriveLimitsAdvancedMax', OverDriveLimits_t, 3008), ('TotalBoardPowerSupport', uint8_t, 3104), ('TotalBoardPowerPadding', c.Array[uint8_t, Literal[1]], 3105), ('TotalBoardPowerRoc', uint16_t, 3106), ('qFeffCoeffGameClock', c.Array[QuadraticInt_t, Literal[2]], 3108), ('qFeffCoeffBaseClock', c.Array[QuadraticInt_t, Literal[2]], 3132), ('qFeffCoeffBoostClock', c.Array[QuadraticInt_t, Literal[2]], 3156), ('AptUclkGfxclkLookup', c.Array[c.Array[int32_t, Literal[6]], Literal[2]], 3180), ('AptUclkGfxclkLookupHyst', c.Array[c.Array[uint32_t, Literal[6]], Literal[2]], 3228), ('AptPadding', uint32_t, 3276), ('GfxXvminDidtDroopThresh', QuadraticInt_t, 3280), ('GfxXvminDidtResetDDWait', uint32_t, 3292), ('GfxXvminDidtClkStopWait', uint32_t, 3296), ('GfxXvminDidtFcsStepCtrl', uint32_t, 3300), ('GfxXvminDidtFcsWaitCtrl', uint32_t, 3304), ('PsmModeEnabled', uint32_t, 3308), ('P2v_a', uint32_t, 3312), ('P2v_b', uint32_t, 3316), ('P2v_c', uint32_t, 3320), ('T2p_a', uint32_t, 3324), ('T2p_b', uint32_t, 3328), ('T2p_c', uint32_t, 3332), ('P2vTemp', uint32_t, 3336), ('PsmDidtStaticSettings', QuadraticInt_t, 3340), ('PsmDidtDynamicSettings', QuadraticInt_t, 3352), ('PsmDidtAvgDiv', uint8_t, 3364), ('PsmDidtForceStall', uint8_t, 3365), ('PsmDidtReleaseTimer', uint16_t, 3366), ('PsmDidtStallPattern', uint32_t, 3368), ('CacEdcCacLeakageC0', uint32_t, 3372), ('CacEdcCacLeakageC1', uint32_t, 3376), ('CacEdcCacLeakageC2', uint32_t, 3380), ('CacEdcCacLeakageC3', uint32_t, 3384), ('CacEdcCacLeakageC4', uint32_t, 3388), ('CacEdcCacLeakageC5', uint32_t, 3392), ('CacEdcGfxClkScalar', uint32_t, 3396), ('CacEdcGfxClkIntercept', uint32_t, 3400), ('CacEdcCac_m', uint32_t, 3404), ('CacEdcCac_b', uint32_t, 3408), ('CacEdcCurrLimitGuardband', uint32_t, 3412), ('CacEdcDynToTotalCacRatio', uint32_t, 3416), ('XVmin_Gfx_EdcThreshScalar', uint32_t, 3420), ('XVmin_Gfx_EdcEnableFreq', uint32_t, 3424), ('XVmin_Gfx_EdcPccAsStepCtrl', uint32_t, 3428), ('XVmin_Gfx_EdcPccAsWaitCtrl', uint32_t, 3432), ('XVmin_Gfx_EdcThreshold', uint16_t, 3436), ('XVmin_Gfx_EdcFiltHysWaitCtrl', uint16_t, 3438), ('XVmin_Soc_EdcThreshScalar', uint32_t, 3440), ('XVmin_Soc_EdcEnableFreq', uint32_t, 3444), ('XVmin_Soc_EdcThreshold', uint32_t, 3448), ('XVmin_Soc_EdcStepUpTime', uint16_t, 3452), ('XVmin_Soc_EdcStepDownTime', uint16_t, 3454), ('XVmin_Soc_EdcInitPccStep', uint8_t, 3456), ('PaddingSocEdc', c.Array[uint8_t, Literal[3]], 3457), ('GfxXvminFuseOverride', uint8_t, 3460), ('SocXvminFuseOverride', uint8_t, 3461), ('PaddingXvminFuseOverride', c.Array[uint8_t, Literal[2]], 3462), ('GfxXvminFddTempLow', uint8_t, 3464), ('GfxXvminFddTempHigh', uint8_t, 3465), ('SocXvminFddTempLow', uint8_t, 3466), ('SocXvminFddTempHigh', uint8_t, 3467), ('GfxXvminFddVolt0', uint16_t, 3468), ('GfxXvminFddVolt1', uint16_t, 3470), ('GfxXvminFddVolt2', uint16_t, 3472), ('SocXvminFddVolt0', uint16_t, 3474), ('SocXvminFddVolt1', uint16_t, 3476), ('SocXvminFddVolt2', uint16_t, 3478), ('GfxXvminDsFddDsm', c.Array[uint16_t, Literal[6]], 3480), ('GfxXvminEdcFddDsm', c.Array[uint16_t, Literal[6]], 3492), ('SocXvminEdcFddDsm', c.Array[uint16_t, Literal[6]], 3504), ('Spare', uint32_t, 3516), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 3520)]) +@c.record +class Svi3RegulatorSettings_t(c.Struct): + SIZE = 28 + SlewRateConditions: int + LoadLineAdjust: int + VoutOffset: int + VidMax: int + VidMin: int + TenBitTelEn: int + SixteenBitTelEn: int + OcpThresh: int + OcpWarnThresh: int + OcpSettings: int + VrhotThresh: int + OtpThresh: int + UvpOvpDeltaRef: int + PhaseShed: int + Padding: c.Array[ctypes.c_ubyte, Literal[10]] + SettingOverrideMask: int +Svi3RegulatorSettings_t.register_fields([('SlewRateConditions', uint8_t, 0), ('LoadLineAdjust', uint8_t, 1), ('VoutOffset', uint8_t, 2), ('VidMax', uint8_t, 3), ('VidMin', uint8_t, 4), ('TenBitTelEn', uint8_t, 5), ('SixteenBitTelEn', uint8_t, 6), ('OcpThresh', uint8_t, 7), ('OcpWarnThresh', uint8_t, 8), ('OcpSettings', uint8_t, 9), ('VrhotThresh', uint8_t, 10), ('OtpThresh', uint8_t, 11), ('UvpOvpDeltaRef', uint8_t, 12), ('PhaseShed', uint8_t, 13), ('Padding', c.Array[uint8_t, Literal[10]], 14), ('SettingOverrideMask', uint32_t, 24)]) +@c.record +class BoardTable_t(c.Struct): + SIZE = 528 + Version: int + I2cControllers: c.Array[I2cControllerConfig_t, Literal[8]] + SlaveAddrMapping: c.Array[ctypes.c_ubyte, Literal[4]] + VrPsiSupport: c.Array[ctypes.c_ubyte, Literal[4]] + Svi3SvcSpeed: int + EnablePsi6: c.Array[ctypes.c_ubyte, Literal[4]] + Svi3RegSettings: c.Array[Svi3RegulatorSettings_t, Literal[4]] + LedOffGpio: int + FanOffGpio: int + GfxVrPowerStageOffGpio: int + AcDcGpio: int + AcDcPolarity: int + VR0HotGpio: int + VR0HotPolarity: int + GthrGpio: int + GthrPolarity: int + LedPin0: int + LedPin1: int + LedPin2: int + LedEnableMask: int + LedPcie: int + LedError: int + PaddingLed: int + UclkTrainingModeSpreadPercent: int + UclkSpreadPadding: int + UclkSpreadFreq: int + UclkSpreadPercent: c.Array[ctypes.c_ubyte, Literal[16]] + GfxclkSpreadEnable: int + FclkSpreadPercent: int + FclkSpreadFreq: int + DramWidth: int + PaddingMem1: c.Array[ctypes.c_ubyte, Literal[7]] + HsrEnabled: int + VddqOffEnabled: int + PaddingUmcFlags: c.Array[ctypes.c_ubyte, Literal[2]] + Paddign1: int + BacoEntryDelay: int + FuseWritePowerMuxPresent: int + FuseWritePadding: c.Array[ctypes.c_ubyte, Literal[3]] + LoadlineGfx: int + LoadlineSoc: int + GfxEdcLimit: int + SocEdcLimit: int + RestBoardPower: int + ConnectorsImpedance: int + EpcsSens0: int + EpcsSens1: int + PaddingEpcs: c.Array[ctypes.c_ubyte, Literal[2]] + BoardSpare: c.Array[ctypes.c_uint32, Literal[52]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +BoardTable_t.register_fields([('Version', uint32_t, 0), ('I2cControllers', c.Array[I2cControllerConfig_t, Literal[8]], 4), ('SlaveAddrMapping', c.Array[uint8_t, Literal[4]], 68), ('VrPsiSupport', c.Array[uint8_t, Literal[4]], 72), ('Svi3SvcSpeed', uint32_t, 76), ('EnablePsi6', c.Array[uint8_t, Literal[4]], 80), ('Svi3RegSettings', c.Array[Svi3RegulatorSettings_t, Literal[4]], 84), ('LedOffGpio', uint8_t, 196), ('FanOffGpio', uint8_t, 197), ('GfxVrPowerStageOffGpio', uint8_t, 198), ('AcDcGpio', uint8_t, 199), ('AcDcPolarity', uint8_t, 200), ('VR0HotGpio', uint8_t, 201), ('VR0HotPolarity', uint8_t, 202), ('GthrGpio', uint8_t, 203), ('GthrPolarity', uint8_t, 204), ('LedPin0', uint8_t, 205), ('LedPin1', uint8_t, 206), ('LedPin2', uint8_t, 207), ('LedEnableMask', uint8_t, 208), ('LedPcie', uint8_t, 209), ('LedError', uint8_t, 210), ('PaddingLed', uint8_t, 211), ('UclkTrainingModeSpreadPercent', uint8_t, 212), ('UclkSpreadPadding', uint8_t, 213), ('UclkSpreadFreq', uint16_t, 214), ('UclkSpreadPercent', c.Array[uint8_t, Literal[16]], 216), ('GfxclkSpreadEnable', uint8_t, 232), ('FclkSpreadPercent', uint8_t, 233), ('FclkSpreadFreq', uint16_t, 234), ('DramWidth', uint8_t, 236), ('PaddingMem1', c.Array[uint8_t, Literal[7]], 237), ('HsrEnabled', uint8_t, 244), ('VddqOffEnabled', uint8_t, 245), ('PaddingUmcFlags', c.Array[uint8_t, Literal[2]], 246), ('Paddign1', uint32_t, 248), ('BacoEntryDelay', uint32_t, 252), ('FuseWritePowerMuxPresent', uint8_t, 256), ('FuseWritePadding', c.Array[uint8_t, Literal[3]], 257), ('LoadlineGfx', uint32_t, 260), ('LoadlineSoc', uint32_t, 264), ('GfxEdcLimit', uint32_t, 268), ('SocEdcLimit', uint32_t, 272), ('RestBoardPower', uint32_t, 276), ('ConnectorsImpedance', uint32_t, 280), ('EpcsSens0', uint8_t, 284), ('EpcsSens1', uint8_t, 285), ('PaddingEpcs', c.Array[uint8_t, Literal[2]], 286), ('BoardSpare', c.Array[uint32_t, Literal[52]], 288), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 496)]) +@c.record +class CustomSkuTable_t(c.Struct): + SIZE = 360 + SocketPowerLimitAc: c.Array[ctypes.c_uint16, Literal[4]] + VrTdcLimit: c.Array[ctypes.c_uint16, Literal[2]] + TotalIdleBoardPowerM: int + TotalIdleBoardPowerB: int + TotalBoardPowerM: int + TotalBoardPowerB: int + TemperatureLimit: c.Array[ctypes.c_uint16, Literal[12]] + FanStopTemp: c.Array[ctypes.c_uint16, Literal[12]] + FanStartTemp: c.Array[ctypes.c_uint16, Literal[12]] + FanGain: c.Array[ctypes.c_uint16, Literal[12]] + FanPwmMin: int + AcousticTargetRpmThreshold: int + AcousticLimitRpmThreshold: int + FanMaximumRpm: int + MGpuAcousticLimitRpmThreshold: int + FanTargetGfxclk: int + TempInputSelectMask: int + FanZeroRpmEnable: int + FanTachEdgePerRev: int + FanPadding: int + FanTargetTemperature: c.Array[ctypes.c_uint16, Literal[12]] + FuzzyFan_ErrorSetDelta: int + FuzzyFan_ErrorRateSetDelta: int + FuzzyFan_PwmSetDelta: int + FanPadding2: int + FwCtfLimit: c.Array[ctypes.c_uint16, Literal[12]] + IntakeTempEnableRPM: int + IntakeTempOffsetTemp: int + IntakeTempReleaseTemp: int + IntakeTempHighIntakeAcousticLimit: int + IntakeTempAcouticLimitReleaseRate: int + FanAbnormalTempLimitOffset: int + FanStalledTriggerRpm: int + FanAbnormalTriggerRpmCoeff: int + FanSpare: c.Array[ctypes.c_uint16, Literal[1]] + FanIntakeSensorSupport: int + FanIntakePadding: int + FanSpare2: c.Array[ctypes.c_uint32, Literal[12]] + ODFeatureCtrlMask: int + TemperatureLimit_Hynix: int + TemperatureLimit_Micron: int + TemperatureFwCtfLimit_Hynix: int + TemperatureFwCtfLimit_Micron: int + PlatformTdcLimit: c.Array[ctypes.c_uint16, Literal[2]] + SocketPowerLimitDc: c.Array[ctypes.c_uint16, Literal[4]] + SocketPowerLimitSmartShift2: int + CustomSkuSpare16b: int + CustomSkuSpare32b: c.Array[ctypes.c_uint32, Literal[10]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +CustomSkuTable_t.register_fields([('SocketPowerLimitAc', c.Array[uint16_t, Literal[4]], 0), ('VrTdcLimit', c.Array[uint16_t, Literal[2]], 8), ('TotalIdleBoardPowerM', int16_t, 12), ('TotalIdleBoardPowerB', int16_t, 14), ('TotalBoardPowerM', int16_t, 16), ('TotalBoardPowerB', int16_t, 18), ('TemperatureLimit', c.Array[uint16_t, Literal[12]], 20), ('FanStopTemp', c.Array[uint16_t, Literal[12]], 44), ('FanStartTemp', c.Array[uint16_t, Literal[12]], 68), ('FanGain', c.Array[uint16_t, Literal[12]], 92), ('FanPwmMin', uint16_t, 116), ('AcousticTargetRpmThreshold', uint16_t, 118), ('AcousticLimitRpmThreshold', uint16_t, 120), ('FanMaximumRpm', uint16_t, 122), ('MGpuAcousticLimitRpmThreshold', uint16_t, 124), ('FanTargetGfxclk', uint16_t, 126), ('TempInputSelectMask', uint32_t, 128), ('FanZeroRpmEnable', uint8_t, 132), ('FanTachEdgePerRev', uint8_t, 133), ('FanPadding', uint16_t, 134), ('FanTargetTemperature', c.Array[uint16_t, Literal[12]], 136), ('FuzzyFan_ErrorSetDelta', int16_t, 160), ('FuzzyFan_ErrorRateSetDelta', int16_t, 162), ('FuzzyFan_PwmSetDelta', int16_t, 164), ('FanPadding2', uint16_t, 166), ('FwCtfLimit', c.Array[uint16_t, Literal[12]], 168), ('IntakeTempEnableRPM', uint16_t, 192), ('IntakeTempOffsetTemp', int16_t, 194), ('IntakeTempReleaseTemp', uint16_t, 196), ('IntakeTempHighIntakeAcousticLimit', uint16_t, 198), ('IntakeTempAcouticLimitReleaseRate', uint16_t, 200), ('FanAbnormalTempLimitOffset', int16_t, 202), ('FanStalledTriggerRpm', uint16_t, 204), ('FanAbnormalTriggerRpmCoeff', uint16_t, 206), ('FanSpare', c.Array[uint16_t, Literal[1]], 208), ('FanIntakeSensorSupport', uint8_t, 210), ('FanIntakePadding', uint8_t, 211), ('FanSpare2', c.Array[uint32_t, Literal[12]], 212), ('ODFeatureCtrlMask', uint32_t, 260), ('TemperatureLimit_Hynix', uint16_t, 264), ('TemperatureLimit_Micron', uint16_t, 266), ('TemperatureFwCtfLimit_Hynix', uint16_t, 268), ('TemperatureFwCtfLimit_Micron', uint16_t, 270), ('PlatformTdcLimit', c.Array[uint16_t, Literal[2]], 272), ('SocketPowerLimitDc', c.Array[uint16_t, Literal[4]], 276), ('SocketPowerLimitSmartShift2', uint16_t, 284), ('CustomSkuSpare16b', uint16_t, 286), ('CustomSkuSpare32b', c.Array[uint32_t, Literal[10]], 288), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 328)]) +@c.record +class PPTable_t(c.Struct): + SIZE = 4468 + PFE_Settings: PFE_Settings_t + SkuTable: SkuTable_t + CustomSkuTable: CustomSkuTable_t + BoardTable: BoardTable_t +PPTable_t.register_fields([('PFE_Settings', PFE_Settings_t, 0), ('SkuTable', SkuTable_t, 28), ('CustomSkuTable', CustomSkuTable_t, 3580), ('BoardTable', BoardTable_t, 3940)]) +@c.record +class DriverSmuConfig_t(c.Struct): + SIZE = 20 + GfxclkAverageLpfTau: int + FclkAverageLpfTau: int + UclkAverageLpfTau: int + GfxActivityLpfTau: int + UclkActivityLpfTau: int + UclkMaxActivityLpfTau: int + SocketPowerLpfTau: int + VcnClkAverageLpfTau: int + VcnUsageAverageLpfTau: int + PcieActivityLpTau: int +DriverSmuConfig_t.register_fields([('GfxclkAverageLpfTau', uint16_t, 0), ('FclkAverageLpfTau', uint16_t, 2), ('UclkAverageLpfTau', uint16_t, 4), ('GfxActivityLpfTau', uint16_t, 6), ('UclkActivityLpfTau', uint16_t, 8), ('UclkMaxActivityLpfTau', uint16_t, 10), ('SocketPowerLpfTau', uint16_t, 12), ('VcnClkAverageLpfTau', uint16_t, 14), ('VcnUsageAverageLpfTau', uint16_t, 16), ('PcieActivityLpTau', uint16_t, 18)]) +@c.record +class DriverSmuConfigExternal_t(c.Struct): + SIZE = 84 + DriverSmuConfig: DriverSmuConfig_t + Spare: c.Array[ctypes.c_uint32, Literal[8]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +DriverSmuConfigExternal_t.register_fields([('DriverSmuConfig', DriverSmuConfig_t, 0), ('Spare', c.Array[uint32_t, Literal[8]], 20), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 52)]) +@c.record +class DriverInfoTable_t(c.Struct): + SIZE = 372 + FreqTableGfx: c.Array[ctypes.c_uint16, Literal[16]] + FreqTableVclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableSocclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableUclk: c.Array[ctypes.c_uint16, Literal[6]] + FreqTableDispclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDppClk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDprefclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDcfclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableDtbclk: c.Array[ctypes.c_uint16, Literal[8]] + FreqTableFclk: c.Array[ctypes.c_uint16, Literal[8]] + DcModeMaxFreq: c.Array[ctypes.c_uint16, Literal[11]] + Padding: int + Spare: c.Array[ctypes.c_uint32, Literal[32]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +DriverInfoTable_t.register_fields([('FreqTableGfx', c.Array[uint16_t, Literal[16]], 0), ('FreqTableVclk', c.Array[uint16_t, Literal[8]], 32), ('FreqTableDclk', c.Array[uint16_t, Literal[8]], 48), ('FreqTableSocclk', c.Array[uint16_t, Literal[8]], 64), ('FreqTableUclk', c.Array[uint16_t, Literal[6]], 80), ('FreqTableDispclk', c.Array[uint16_t, Literal[8]], 92), ('FreqTableDppClk', c.Array[uint16_t, Literal[8]], 108), ('FreqTableDprefclk', c.Array[uint16_t, Literal[8]], 124), ('FreqTableDcfclk', c.Array[uint16_t, Literal[8]], 140), ('FreqTableDtbclk', c.Array[uint16_t, Literal[8]], 156), ('FreqTableFclk', c.Array[uint16_t, Literal[8]], 172), ('DcModeMaxFreq', c.Array[uint16_t, Literal[11]], 188), ('Padding', uint16_t, 210), ('Spare', c.Array[uint32_t, Literal[32]], 212), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 340)]) +@c.record +class SmuMetrics_t(c.Struct): + SIZE = 260 + CurrClock: c.Array[ctypes.c_uint32, Literal[11]] + AverageGfxclkFrequencyTarget: int + AverageGfxclkFrequencyPreDs: int + AverageGfxclkFrequencyPostDs: int + AverageFclkFrequencyPreDs: int + AverageFclkFrequencyPostDs: int + AverageMemclkFrequencyPreDs: int + AverageMemclkFrequencyPostDs: int + AverageVclk0Frequency: int + AverageDclk0Frequency: int + AverageVclk1Frequency: int + AverageDclk1Frequency: int + AveragePCIeBusy: int + dGPU_W_MAX: int + padding: int + MovingAverageGfxclkFrequencyTarget: int + MovingAverageGfxclkFrequencyPreDs: int + MovingAverageGfxclkFrequencyPostDs: int + MovingAverageFclkFrequencyPreDs: int + MovingAverageFclkFrequencyPostDs: int + MovingAverageMemclkFrequencyPreDs: int + MovingAverageMemclkFrequencyPostDs: int + MovingAverageVclk0Frequency: int + MovingAverageDclk0Frequency: int + MovingAverageGfxActivity: int + MovingAverageUclkActivity: int + MovingAverageVcn0ActivityPercentage: int + MovingAveragePCIeBusy: int + MovingAverageUclkActivity_MAX: int + MovingAverageSocketPower: int + MovingAveragePadding: int + MetricsCounter: int + AvgVoltage: c.Array[ctypes.c_uint16, Literal[4]] + AvgCurrent: c.Array[ctypes.c_uint16, Literal[4]] + AverageGfxActivity: int + AverageUclkActivity: int + AverageVcn0ActivityPercentage: int + Vcn1ActivityPercentage: int + EnergyAccumulator: int + AverageSocketPower: int + AverageTotalBoardPower: int + AvgTemperature: c.Array[ctypes.c_uint16, Literal[12]] + AvgTemperatureFanIntake: int + PcieRate: int + PcieWidth: int + AvgFanPwm: int + Padding: c.Array[ctypes.c_ubyte, Literal[1]] + AvgFanRpm: int + ThrottlingPercentage: c.Array[ctypes.c_ubyte, Literal[21]] + VmaxThrottlingPercentage: int + padding1: c.Array[ctypes.c_ubyte, Literal[2]] + D3HotEntryCountPerMode: c.Array[ctypes.c_uint32, Literal[4]] + D3HotExitCountPerMode: c.Array[ctypes.c_uint32, Literal[4]] + ArmMsgReceivedCountPerMode: c.Array[ctypes.c_uint32, Literal[4]] + ApuSTAPMSmartShiftLimit: int + ApuSTAPMLimit: int + AvgApuSocketPower: int + AverageUclkActivity_MAX: int + PublicSerialNumberLower: int + PublicSerialNumberUpper: int +SmuMetrics_t.register_fields([('CurrClock', c.Array[uint32_t, Literal[11]], 0), ('AverageGfxclkFrequencyTarget', uint16_t, 44), ('AverageGfxclkFrequencyPreDs', uint16_t, 46), ('AverageGfxclkFrequencyPostDs', uint16_t, 48), ('AverageFclkFrequencyPreDs', uint16_t, 50), ('AverageFclkFrequencyPostDs', uint16_t, 52), ('AverageMemclkFrequencyPreDs', uint16_t, 54), ('AverageMemclkFrequencyPostDs', uint16_t, 56), ('AverageVclk0Frequency', uint16_t, 58), ('AverageDclk0Frequency', uint16_t, 60), ('AverageVclk1Frequency', uint16_t, 62), ('AverageDclk1Frequency', uint16_t, 64), ('AveragePCIeBusy', uint16_t, 66), ('dGPU_W_MAX', uint16_t, 68), ('padding', uint16_t, 70), ('MovingAverageGfxclkFrequencyTarget', uint16_t, 72), ('MovingAverageGfxclkFrequencyPreDs', uint16_t, 74), ('MovingAverageGfxclkFrequencyPostDs', uint16_t, 76), ('MovingAverageFclkFrequencyPreDs', uint16_t, 78), ('MovingAverageFclkFrequencyPostDs', uint16_t, 80), ('MovingAverageMemclkFrequencyPreDs', uint16_t, 82), ('MovingAverageMemclkFrequencyPostDs', uint16_t, 84), ('MovingAverageVclk0Frequency', uint16_t, 86), ('MovingAverageDclk0Frequency', uint16_t, 88), ('MovingAverageGfxActivity', uint16_t, 90), ('MovingAverageUclkActivity', uint16_t, 92), ('MovingAverageVcn0ActivityPercentage', uint16_t, 94), ('MovingAveragePCIeBusy', uint16_t, 96), ('MovingAverageUclkActivity_MAX', uint16_t, 98), ('MovingAverageSocketPower', uint16_t, 100), ('MovingAveragePadding', uint16_t, 102), ('MetricsCounter', uint32_t, 104), ('AvgVoltage', c.Array[uint16_t, Literal[4]], 108), ('AvgCurrent', c.Array[uint16_t, Literal[4]], 116), ('AverageGfxActivity', uint16_t, 124), ('AverageUclkActivity', uint16_t, 126), ('AverageVcn0ActivityPercentage', uint16_t, 128), ('Vcn1ActivityPercentage', uint16_t, 130), ('EnergyAccumulator', uint32_t, 132), ('AverageSocketPower', uint16_t, 136), ('AverageTotalBoardPower', uint16_t, 138), ('AvgTemperature', c.Array[uint16_t, Literal[12]], 140), ('AvgTemperatureFanIntake', uint16_t, 164), ('PcieRate', uint8_t, 166), ('PcieWidth', uint8_t, 167), ('AvgFanPwm', uint8_t, 168), ('Padding', c.Array[uint8_t, Literal[1]], 169), ('AvgFanRpm', uint16_t, 170), ('ThrottlingPercentage', c.Array[uint8_t, Literal[21]], 172), ('VmaxThrottlingPercentage', uint8_t, 193), ('padding1', c.Array[uint8_t, Literal[2]], 194), ('D3HotEntryCountPerMode', c.Array[uint32_t, Literal[4]], 196), ('D3HotExitCountPerMode', c.Array[uint32_t, Literal[4]], 212), ('ArmMsgReceivedCountPerMode', c.Array[uint32_t, Literal[4]], 228), ('ApuSTAPMSmartShiftLimit', uint16_t, 244), ('ApuSTAPMLimit', uint16_t, 246), ('AvgApuSocketPower', uint16_t, 248), ('AverageUclkActivity_MAX', uint16_t, 250), ('PublicSerialNumberLower', uint32_t, 252), ('PublicSerialNumberUpper', uint32_t, 256)]) +@c.record +class SmuMetricsExternal_t(c.Struct): + SIZE = 412 + SmuMetrics: SmuMetrics_t + Spare: c.Array[ctypes.c_uint32, Literal[30]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +SmuMetricsExternal_t.register_fields([('SmuMetrics', SmuMetrics_t, 0), ('Spare', c.Array[uint32_t, Literal[30]], 260), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 380)]) +@c.record +class WatermarkRowGeneric_t(c.Struct): + SIZE = 4 + WmSetting: int + Flags: int + Padding: c.Array[ctypes.c_ubyte, Literal[2]] +WatermarkRowGeneric_t.register_fields([('WmSetting', uint8_t, 0), ('Flags', uint8_t, 1), ('Padding', c.Array[uint8_t, Literal[2]], 2)]) +WATERMARKS_FLAGS_e: dict[int, str] = {(WATERMARKS_CLOCK_RANGE:=0): 'WATERMARKS_CLOCK_RANGE', (WATERMARKS_DUMMY_PSTATE:=1): 'WATERMARKS_DUMMY_PSTATE', (WATERMARKS_MALL:=2): 'WATERMARKS_MALL', (WATERMARKS_COUNT:=3): 'WATERMARKS_COUNT'} +@c.record +class Watermarks_t(c.Struct): + SIZE = 16 + WatermarkRow: c.Array[WatermarkRowGeneric_t, Literal[4]] +Watermarks_t.register_fields([('WatermarkRow', c.Array[WatermarkRowGeneric_t, Literal[4]], 0)]) +@c.record +class WatermarksExternal_t(c.Struct): + SIZE = 112 + Watermarks: Watermarks_t + Spare: c.Array[ctypes.c_uint32, Literal[16]] + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +WatermarksExternal_t.register_fields([('Watermarks', Watermarks_t, 0), ('Spare', c.Array[uint32_t, Literal[16]], 16), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 80)]) +@c.record +class AvfsDebugTable_t(c.Struct): + SIZE = 1368 + avgPsmCount: c.Array[ctypes.c_uint16, Literal[76]] + minPsmCount: c.Array[ctypes.c_uint16, Literal[76]] + maxPsmCount: c.Array[ctypes.c_uint16, Literal[76]] + avgPsmVoltage: c.Array[ctypes.c_float, Literal[76]] + minPsmVoltage: c.Array[ctypes.c_float, Literal[76]] + maxPsmVoltage: c.Array[ctypes.c_float, Literal[76]] +AvfsDebugTable_t.register_fields([('avgPsmCount', c.Array[uint16_t, Literal[76]], 0), ('minPsmCount', c.Array[uint16_t, Literal[76]], 152), ('maxPsmCount', c.Array[uint16_t, Literal[76]], 304), ('avgPsmVoltage', c.Array[ctypes.c_float, Literal[76]], 456), ('minPsmVoltage', c.Array[ctypes.c_float, Literal[76]], 760), ('maxPsmVoltage', c.Array[ctypes.c_float, Literal[76]], 1064)]) +@c.record +class AvfsDebugTableExternal_t(c.Struct): + SIZE = 1400 + AvfsDebugTable: AvfsDebugTable_t + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +AvfsDebugTableExternal_t.register_fields([('AvfsDebugTable', AvfsDebugTable_t, 0), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 1368)]) +@c.record +class DpmActivityMonitorCoeffInt_t(c.Struct): + SIZE = 108 + Gfx_ActiveHystLimit: int + Gfx_IdleHystLimit: int + Gfx_FPS: int + Gfx_MinActiveFreqType: int + Gfx_BoosterFreqType: int + PaddingGfx: int + Gfx_MinActiveFreq: int + Gfx_BoosterFreq: int + Gfx_PD_Data_time_constant: int + Gfx_PD_Data_limit_a: int + Gfx_PD_Data_limit_b: int + Gfx_PD_Data_limit_c: int + Gfx_PD_Data_error_coeff: int + Gfx_PD_Data_error_rate_coeff: int + Fclk_ActiveHystLimit: int + Fclk_IdleHystLimit: int + Fclk_FPS: int + Fclk_MinActiveFreqType: int + Fclk_BoosterFreqType: int + PaddingFclk: int + Fclk_MinActiveFreq: int + Fclk_BoosterFreq: int + Fclk_PD_Data_time_constant: int + Fclk_PD_Data_limit_a: int + Fclk_PD_Data_limit_b: int + Fclk_PD_Data_limit_c: int + Fclk_PD_Data_error_coeff: int + Fclk_PD_Data_error_rate_coeff: int + Mem_UpThreshold_Limit: c.Array[ctypes.c_uint32, Literal[6]] + Mem_UpHystLimit: c.Array[ctypes.c_ubyte, Literal[6]] + Mem_DownHystLimit: c.Array[ctypes.c_uint16, Literal[6]] + Mem_Fps: int +DpmActivityMonitorCoeffInt_t.register_fields([('Gfx_ActiveHystLimit', uint8_t, 0), ('Gfx_IdleHystLimit', uint8_t, 1), ('Gfx_FPS', uint8_t, 2), ('Gfx_MinActiveFreqType', uint8_t, 3), ('Gfx_BoosterFreqType', uint8_t, 4), ('PaddingGfx', uint8_t, 5), ('Gfx_MinActiveFreq', uint16_t, 6), ('Gfx_BoosterFreq', uint16_t, 8), ('Gfx_PD_Data_time_constant', uint16_t, 10), ('Gfx_PD_Data_limit_a', uint32_t, 12), ('Gfx_PD_Data_limit_b', uint32_t, 16), ('Gfx_PD_Data_limit_c', uint32_t, 20), ('Gfx_PD_Data_error_coeff', uint32_t, 24), ('Gfx_PD_Data_error_rate_coeff', uint32_t, 28), ('Fclk_ActiveHystLimit', uint8_t, 32), ('Fclk_IdleHystLimit', uint8_t, 33), ('Fclk_FPS', uint8_t, 34), ('Fclk_MinActiveFreqType', uint8_t, 35), ('Fclk_BoosterFreqType', uint8_t, 36), ('PaddingFclk', uint8_t, 37), ('Fclk_MinActiveFreq', uint16_t, 38), ('Fclk_BoosterFreq', uint16_t, 40), ('Fclk_PD_Data_time_constant', uint16_t, 42), ('Fclk_PD_Data_limit_a', uint32_t, 44), ('Fclk_PD_Data_limit_b', uint32_t, 48), ('Fclk_PD_Data_limit_c', uint32_t, 52), ('Fclk_PD_Data_error_coeff', uint32_t, 56), ('Fclk_PD_Data_error_rate_coeff', uint32_t, 60), ('Mem_UpThreshold_Limit', c.Array[uint32_t, Literal[6]], 64), ('Mem_UpHystLimit', c.Array[uint8_t, Literal[6]], 88), ('Mem_DownHystLimit', c.Array[uint16_t, Literal[6]], 94), ('Mem_Fps', uint16_t, 106)]) +@c.record +class DpmActivityMonitorCoeffIntExternal_t(c.Struct): + SIZE = 140 + DpmActivityMonitorCoeffInt: DpmActivityMonitorCoeffInt_t + MmHubPadding: c.Array[ctypes.c_uint32, Literal[8]] +DpmActivityMonitorCoeffIntExternal_t.register_fields([('DpmActivityMonitorCoeffInt', DpmActivityMonitorCoeffInt_t, 0), ('MmHubPadding', c.Array[uint32_t, Literal[8]], 108)]) +@c.record +class struct_smu_hw_power_state(c.Struct): + SIZE = 4 + magic: int +struct_smu_hw_power_state.register_fields([('magic', ctypes.c_uint32, 0)]) +class struct_smu_power_state(c.Struct): pass +enum_smu_state_ui_label: dict[int, str] = {(SMU_STATE_UI_LABEL_NONE:=0): 'SMU_STATE_UI_LABEL_NONE', (SMU_STATE_UI_LABEL_BATTERY:=1): 'SMU_STATE_UI_LABEL_BATTERY', (SMU_STATE_UI_TABEL_MIDDLE_LOW:=2): 'SMU_STATE_UI_TABEL_MIDDLE_LOW', (SMU_STATE_UI_LABEL_BALLANCED:=3): 'SMU_STATE_UI_LABEL_BALLANCED', (SMU_STATE_UI_LABEL_MIDDLE_HIGHT:=4): 'SMU_STATE_UI_LABEL_MIDDLE_HIGHT', (SMU_STATE_UI_LABEL_PERFORMANCE:=5): 'SMU_STATE_UI_LABEL_PERFORMANCE', (SMU_STATE_UI_LABEL_BACO:=6): 'SMU_STATE_UI_LABEL_BACO'} +enum_smu_state_classification_flag: dict[int, str] = {(SMU_STATE_CLASSIFICATION_FLAG_BOOT:=1): 'SMU_STATE_CLASSIFICATION_FLAG_BOOT', (SMU_STATE_CLASSIFICATION_FLAG_THERMAL:=2): 'SMU_STATE_CLASSIFICATION_FLAG_THERMAL', (SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE:=4): 'SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE', (SMU_STATE_CLASSIFICATION_FLAG_RESET:=8): 'SMU_STATE_CLASSIFICATION_FLAG_RESET', (SMU_STATE_CLASSIFICATION_FLAG_FORCED:=16): 'SMU_STATE_CLASSIFICATION_FLAG_FORCED', (SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE:=32): 'SMU_STATE_CLASSIFICATION_FLAG_USER_3D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE:=64): 'SMU_STATE_CLASSIFICATION_FLAG_USER_2D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE:=128): 'SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE:=256): 'SMU_STATE_CLASSIFICATION_FLAG_AC_OVERDIRVER_TEMPLATE', (SMU_STATE_CLASSIFICATION_FLAG_UVD:=512): 'SMU_STATE_CLASSIFICATION_FLAG_UVD', (SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW:=1024): 'SMU_STATE_CLASSIFICATION_FLAG_3D_PERFORMANCE_LOW', (SMU_STATE_CLASSIFICATION_FLAG_ACPI:=2048): 'SMU_STATE_CLASSIFICATION_FLAG_ACPI', (SMU_STATE_CLASSIFICATION_FLAG_HD2:=4096): 'SMU_STATE_CLASSIFICATION_FLAG_HD2', (SMU_STATE_CLASSIFICATION_FLAG_UVD_HD:=8192): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_HD', (SMU_STATE_CLASSIFICATION_FLAG_UVD_SD:=16384): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_SD', (SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE:=32768): 'SMU_STATE_CLASSIFICATION_FLAG_USER_DC_PERFORMANCE', (SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE:=65536): 'SMU_STATE_CLASSIFICATION_FLAG_DC_OVERDIRVER_TEMPLATE', (SMU_STATE_CLASSIFICATION_FLAG_BACO:=131072): 'SMU_STATE_CLASSIFICATION_FLAG_BACO', (SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2:=262144): 'SMU_STATE_CLASSIFICATIN_FLAG_LIMITED_POWER_SOURCE2', (SMU_STATE_CLASSIFICATION_FLAG_ULV:=524288): 'SMU_STATE_CLASSIFICATION_FLAG_ULV', (SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC:=1048576): 'SMU_STATE_CLASSIFICATION_FLAG_UVD_MVC'} +@c.record +class struct_smu_state_classification_block(c.Struct): + SIZE = 16 + ui_label: int + flags: int + bios_index: int + temporary_state: bool + to_be_deleted: bool +struct_smu_state_classification_block.register_fields([('ui_label', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('bios_index', ctypes.c_int32, 8), ('temporary_state', ctypes.c_bool, 12), ('to_be_deleted', ctypes.c_bool, 13)]) +@c.record +class struct_smu_state_pcie_block(c.Struct): + SIZE = 4 + lanes: int +struct_smu_state_pcie_block.register_fields([('lanes', ctypes.c_uint32, 0)]) +enum_smu_refreshrate_source: dict[int, str] = {(SMU_REFRESHRATE_SOURCE_EDID:=0): 'SMU_REFRESHRATE_SOURCE_EDID', (SMU_REFRESHRATE_SOURCE_EXPLICIT:=1): 'SMU_REFRESHRATE_SOURCE_EXPLICIT'} +@c.record +class struct_smu_state_display_block(c.Struct): + SIZE = 20 + disable_frame_modulation: bool + limit_refreshrate: bool + refreshrate_source: int + explicit_refreshrate: int + edid_refreshrate_index: int + enable_vari_bright: bool +struct_smu_state_display_block.register_fields([('disable_frame_modulation', ctypes.c_bool, 0), ('limit_refreshrate', ctypes.c_bool, 1), ('refreshrate_source', ctypes.c_uint32, 4), ('explicit_refreshrate', ctypes.c_int32, 8), ('edid_refreshrate_index', ctypes.c_int32, 12), ('enable_vari_bright', ctypes.c_bool, 16)]) +@c.record +class struct_smu_state_memory_block(c.Struct): + SIZE = 5 + dll_off: bool + m3arb: int + unused: c.Array[ctypes.c_ubyte, Literal[3]] +struct_smu_state_memory_block.register_fields([('dll_off', ctypes.c_bool, 0), ('m3arb', uint8_t, 1), ('unused', c.Array[uint8_t, Literal[3]], 2)]) +@c.record +class struct_smu_state_software_algorithm_block(c.Struct): + SIZE = 2 + disable_load_balancing: bool + enable_sleep_for_timestamps: bool +struct_smu_state_software_algorithm_block.register_fields([('disable_load_balancing', ctypes.c_bool, 0), ('enable_sleep_for_timestamps', ctypes.c_bool, 1)]) +@c.record +class struct_smu_temperature_range(c.Struct): + SIZE = 44 + min: int + max: int + edge_emergency_max: int + hotspot_min: int + hotspot_crit_max: int + hotspot_emergency_max: int + mem_min: int + mem_crit_max: int + mem_emergency_max: int + software_shutdown_temp: int + software_shutdown_temp_offset: int +struct_smu_temperature_range.register_fields([('min', ctypes.c_int32, 0), ('max', ctypes.c_int32, 4), ('edge_emergency_max', ctypes.c_int32, 8), ('hotspot_min', ctypes.c_int32, 12), ('hotspot_crit_max', ctypes.c_int32, 16), ('hotspot_emergency_max', ctypes.c_int32, 20), ('mem_min', ctypes.c_int32, 24), ('mem_crit_max', ctypes.c_int32, 28), ('mem_emergency_max', ctypes.c_int32, 32), ('software_shutdown_temp', ctypes.c_int32, 36), ('software_shutdown_temp_offset', ctypes.c_int32, 40)]) +@c.record +class struct_smu_state_validation_block(c.Struct): + SIZE = 3 + single_display_only: bool + disallow_on_dc: bool + supported_power_levels: int +struct_smu_state_validation_block.register_fields([('single_display_only', ctypes.c_bool, 0), ('disallow_on_dc', ctypes.c_bool, 1), ('supported_power_levels', uint8_t, 2)]) +@c.record +class struct_smu_uvd_clocks(c.Struct): + SIZE = 8 + vclk: int + dclk: int +struct_smu_uvd_clocks.register_fields([('vclk', uint32_t, 0), ('dclk', uint32_t, 4)]) +enum_smu_power_src_type: dict[int, str] = {(SMU_POWER_SOURCE_AC:=0): 'SMU_POWER_SOURCE_AC', (SMU_POWER_SOURCE_DC:=1): 'SMU_POWER_SOURCE_DC', (SMU_POWER_SOURCE_COUNT:=2): 'SMU_POWER_SOURCE_COUNT'} +enum_smu_ppt_limit_type: dict[int, str] = {(SMU_DEFAULT_PPT_LIMIT:=0): 'SMU_DEFAULT_PPT_LIMIT', (SMU_FAST_PPT_LIMIT:=1): 'SMU_FAST_PPT_LIMIT'} +enum_smu_ppt_limit_level: dict[int, str] = {(SMU_PPT_LIMIT_MIN:=-1): 'SMU_PPT_LIMIT_MIN', (SMU_PPT_LIMIT_CURRENT:=0): 'SMU_PPT_LIMIT_CURRENT', (SMU_PPT_LIMIT_DEFAULT:=1): 'SMU_PPT_LIMIT_DEFAULT', (SMU_PPT_LIMIT_MAX:=2): 'SMU_PPT_LIMIT_MAX'} +enum_smu_memory_pool_size: dict[int, str] = {(SMU_MEMORY_POOL_SIZE_ZERO:=0): 'SMU_MEMORY_POOL_SIZE_ZERO', (SMU_MEMORY_POOL_SIZE_256_MB:=268435456): 'SMU_MEMORY_POOL_SIZE_256_MB', (SMU_MEMORY_POOL_SIZE_512_MB:=536870912): 'SMU_MEMORY_POOL_SIZE_512_MB', (SMU_MEMORY_POOL_SIZE_1_GB:=1073741824): 'SMU_MEMORY_POOL_SIZE_1_GB', (SMU_MEMORY_POOL_SIZE_2_GB:=2147483648): 'SMU_MEMORY_POOL_SIZE_2_GB'} +enum_smu_clk_type: dict[int, str] = {(SMU_GFXCLK:=0): 'SMU_GFXCLK', (SMU_VCLK:=1): 'SMU_VCLK', (SMU_DCLK:=2): 'SMU_DCLK', (SMU_VCLK1:=3): 'SMU_VCLK1', (SMU_DCLK1:=4): 'SMU_DCLK1', (SMU_ECLK:=5): 'SMU_ECLK', (SMU_SOCCLK:=6): 'SMU_SOCCLK', (SMU_UCLK:=7): 'SMU_UCLK', (SMU_DCEFCLK:=8): 'SMU_DCEFCLK', (SMU_DISPCLK:=9): 'SMU_DISPCLK', (SMU_PIXCLK:=10): 'SMU_PIXCLK', (SMU_PHYCLK:=11): 'SMU_PHYCLK', (SMU_FCLK:=12): 'SMU_FCLK', (SMU_SCLK:=13): 'SMU_SCLK', (SMU_MCLK:=14): 'SMU_MCLK', (SMU_PCIE:=15): 'SMU_PCIE', (SMU_LCLK:=16): 'SMU_LCLK', (SMU_OD_CCLK:=17): 'SMU_OD_CCLK', (SMU_OD_SCLK:=18): 'SMU_OD_SCLK', (SMU_OD_MCLK:=19): 'SMU_OD_MCLK', (SMU_OD_VDDC_CURVE:=20): 'SMU_OD_VDDC_CURVE', (SMU_OD_RANGE:=21): 'SMU_OD_RANGE', (SMU_OD_VDDGFX_OFFSET:=22): 'SMU_OD_VDDGFX_OFFSET', (SMU_OD_FAN_CURVE:=23): 'SMU_OD_FAN_CURVE', (SMU_OD_ACOUSTIC_LIMIT:=24): 'SMU_OD_ACOUSTIC_LIMIT', (SMU_OD_ACOUSTIC_TARGET:=25): 'SMU_OD_ACOUSTIC_TARGET', (SMU_OD_FAN_TARGET_TEMPERATURE:=26): 'SMU_OD_FAN_TARGET_TEMPERATURE', (SMU_OD_FAN_MINIMUM_PWM:=27): 'SMU_OD_FAN_MINIMUM_PWM', (SMU_CLK_COUNT:=28): 'SMU_CLK_COUNT'} +@c.record +class struct_smu_user_dpm_profile(c.Struct): + SIZE = 140 + fan_mode: int + power_limit: int + fan_speed_pwm: int + fan_speed_rpm: int + flags: int + user_od: int + clk_mask: c.Array[ctypes.c_uint32, Literal[28]] + clk_dependency: int +struct_smu_user_dpm_profile.register_fields([('fan_mode', uint32_t, 0), ('power_limit', uint32_t, 4), ('fan_speed_pwm', uint32_t, 8), ('fan_speed_rpm', uint32_t, 12), ('flags', uint32_t, 16), ('user_od', uint32_t, 20), ('clk_mask', c.Array[uint32_t, Literal[28]], 24), ('clk_dependency', uint32_t, 136)]) +@c.record +class struct_smu_table(c.Struct): + SIZE = 48 + size: int + align: int + domain: int + mc_address: int + cpu_addr: ctypes.c_void_p + bo: c.POINTER[struct_amdgpu_bo] + version: int +class struct_amdgpu_bo(c.Struct): pass +struct_smu_table.register_fields([('size', uint64_t, 0), ('align', uint32_t, 8), ('domain', uint8_t, 12), ('mc_address', uint64_t, 16), ('cpu_addr', ctypes.c_void_p, 24), ('bo', c.POINTER[struct_amdgpu_bo], 32), ('version', uint32_t, 40)]) +enum_smu_perf_level_designation: dict[int, str] = {(PERF_LEVEL_ACTIVITY:=0): 'PERF_LEVEL_ACTIVITY', (PERF_LEVEL_POWER_CONTAINMENT:=1): 'PERF_LEVEL_POWER_CONTAINMENT'} +@c.record +class struct_smu_performance_level(c.Struct): + SIZE = 24 + core_clock: int + memory_clock: int + vddc: int + vddci: int + non_local_mem_freq: int + non_local_mem_width: int +struct_smu_performance_level.register_fields([('core_clock', uint32_t, 0), ('memory_clock', uint32_t, 4), ('vddc', uint32_t, 8), ('vddci', uint32_t, 12), ('non_local_mem_freq', uint32_t, 16), ('non_local_mem_width', uint32_t, 20)]) +@c.record +class struct_smu_clock_info(c.Struct): + SIZE = 24 + min_mem_clk: int + max_mem_clk: int + min_eng_clk: int + max_eng_clk: int + min_bus_bandwidth: int + max_bus_bandwidth: int +struct_smu_clock_info.register_fields([('min_mem_clk', uint32_t, 0), ('max_mem_clk', uint32_t, 4), ('min_eng_clk', uint32_t, 8), ('max_eng_clk', uint32_t, 12), ('min_bus_bandwidth', uint32_t, 16), ('max_bus_bandwidth', uint32_t, 20)]) +@c.record +class struct_smu_bios_boot_up_values(c.Struct): + SIZE = 68 + revision: int + gfxclk: int + uclk: int + socclk: int + dcefclk: int + eclk: int + vclk: int + dclk: int + vddc: int + vddci: int + mvddc: int + vdd_gfx: int + cooling_id: int + pp_table_id: int + format_revision: int + content_revision: int + fclk: int + lclk: int + firmware_caps: int +struct_smu_bios_boot_up_values.register_fields([('revision', uint32_t, 0), ('gfxclk', uint32_t, 4), ('uclk', uint32_t, 8), ('socclk', uint32_t, 12), ('dcefclk', uint32_t, 16), ('eclk', uint32_t, 20), ('vclk', uint32_t, 24), ('dclk', uint32_t, 28), ('vddc', uint16_t, 32), ('vddci', uint16_t, 34), ('mvddc', uint16_t, 36), ('vdd_gfx', uint16_t, 38), ('cooling_id', uint8_t, 40), ('pp_table_id', uint32_t, 44), ('format_revision', uint32_t, 48), ('content_revision', uint32_t, 52), ('fclk', uint32_t, 56), ('lclk', uint32_t, 60), ('firmware_caps', uint32_t, 64)]) +enum_smu_table_id: dict[int, str] = {(SMU_TABLE_PPTABLE:=0): 'SMU_TABLE_PPTABLE', (SMU_TABLE_WATERMARKS:=1): 'SMU_TABLE_WATERMARKS', (SMU_TABLE_CUSTOM_DPM:=2): 'SMU_TABLE_CUSTOM_DPM', (SMU_TABLE_DPMCLOCKS:=3): 'SMU_TABLE_DPMCLOCKS', (SMU_TABLE_AVFS:=4): 'SMU_TABLE_AVFS', (SMU_TABLE_AVFS_PSM_DEBUG:=5): 'SMU_TABLE_AVFS_PSM_DEBUG', (SMU_TABLE_AVFS_FUSE_OVERRIDE:=6): 'SMU_TABLE_AVFS_FUSE_OVERRIDE', (SMU_TABLE_PMSTATUSLOG:=7): 'SMU_TABLE_PMSTATUSLOG', (SMU_TABLE_SMU_METRICS:=8): 'SMU_TABLE_SMU_METRICS', (SMU_TABLE_DRIVER_SMU_CONFIG:=9): 'SMU_TABLE_DRIVER_SMU_CONFIG', (SMU_TABLE_ACTIVITY_MONITOR_COEFF:=10): 'SMU_TABLE_ACTIVITY_MONITOR_COEFF', (SMU_TABLE_OVERDRIVE:=11): 'SMU_TABLE_OVERDRIVE', (SMU_TABLE_I2C_COMMANDS:=12): 'SMU_TABLE_I2C_COMMANDS', (SMU_TABLE_PACE:=13): 'SMU_TABLE_PACE', (SMU_TABLE_ECCINFO:=14): 'SMU_TABLE_ECCINFO', (SMU_TABLE_COMBO_PPTABLE:=15): 'SMU_TABLE_COMBO_PPTABLE', (SMU_TABLE_WIFIBAND:=16): 'SMU_TABLE_WIFIBAND', (SMU_TABLE_COUNT:=17): 'SMU_TABLE_COUNT'} +FEATURE_CCLK_DPM_BIT = 0 +FEATURE_FAN_CONTROLLER_BIT = 1 +FEATURE_DATA_CALCULATION_BIT = 2 +FEATURE_PPT_BIT = 3 +FEATURE_TDC_BIT = 4 +FEATURE_THERMAL_BIT = 5 +FEATURE_FIT_BIT = 6 +FEATURE_EDC_BIT = 7 +FEATURE_PLL_POWER_DOWN_BIT = 8 +FEATURE_VDDOFF_BIT = 9 +FEATURE_VCN_DPM_BIT = 10 +FEATURE_DS_MPM_BIT = 11 +FEATURE_FCLK_DPM_BIT = 12 +FEATURE_SOCCLK_DPM_BIT = 13 +FEATURE_DS_MPIO_BIT = 14 +FEATURE_LCLK_DPM_BIT = 15 +FEATURE_SHUBCLK_DPM_BIT = 16 +FEATURE_DCFCLK_DPM_BIT = 17 +FEATURE_ISP_DPM_BIT = 18 +FEATURE_IPU_DPM_BIT = 19 +FEATURE_GFX_DPM_BIT = 20 +FEATURE_DS_GFXCLK_BIT = 21 +FEATURE_DS_SOCCLK_BIT = 22 +FEATURE_DS_LCLK_BIT = 23 +FEATURE_LOW_POWER_DCNCLKS_BIT = 24 +FEATURE_DS_SHUBCLK_BIT = 25 +FEATURE_RESERVED0_BIT = 26 +FEATURE_ZSTATES_BIT = 27 +FEATURE_IOMMUL2_PG_BIT = 28 +FEATURE_DS_FCLK_BIT = 29 +FEATURE_DS_SMNCLK_BIT = 30 +FEATURE_DS_MP1CLK_BIT = 31 +FEATURE_WHISPER_MODE_BIT = 32 +FEATURE_SMU_LOW_POWER_BIT = 33 +FEATURE_RESERVED1_BIT = 34 +FEATURE_GFX_DEM_BIT = 35 +FEATURE_PSI_BIT = 36 +FEATURE_PROCHOT_BIT = 37 +FEATURE_CPUOFF_BIT = 38 +FEATURE_STAPM_BIT = 39 +FEATURE_S0I3_BIT = 40 +FEATURE_DF_LIGHT_CSTATE = 41 +FEATURE_PERF_LIMIT_BIT = 42 +FEATURE_CORE_DLDO_BIT = 43 +FEATURE_DVO_BIT = 44 +FEATURE_DS_VCN_BIT = 45 +FEATURE_CPPC_BIT = 46 +FEATURE_CPPC_PREFERRED_CORES = 47 +FEATURE_DF_CSTATES_BIT = 48 +FEATURE_FAST_PSTATE_CLDO_BIT = 49 +FEATURE_ATHUB_PG_BIT = 50 +FEATURE_VDDOFF_ECO_BIT = 51 +FEATURE_ZSTATES_ECO_BIT = 52 +FEATURE_CC6_BIT = 53 +FEATURE_DS_UMCCLK_BIT = 54 +FEATURE_DS_ISPCLK_BIT = 55 +FEATURE_DS_HSPCLK_BIT = 56 +FEATURE_P3T_BIT = 57 +FEATURE_DS_IPUCLK_BIT = 58 +FEATURE_DS_VPECLK_BIT = 59 +FEATURE_VPE_DPM_BIT = 60 +FEATURE_SMART_L3_RINSER_BIT = 61 +FEATURE_PCC_BIT = 62 +NUM_FEATURES = 63 +PPSMC_VERSION = 0x1 +PPSMC_Result_OK = 0x1 +PPSMC_Result_Failed = 0xFF +PPSMC_Result_UnknownCmd = 0xFE +PPSMC_Result_CmdRejectedPrereq = 0xFD +PPSMC_Result_CmdRejectedBusy = 0xFC +PPSMC_MSG_TestMessage = 0x1 +PPSMC_MSG_GetSmuVersion = 0x2 +PPSMC_MSG_GetDriverIfVersion = 0x3 +PPSMC_MSG_SetAllowedFeaturesMaskLow = 0x4 +PPSMC_MSG_SetAllowedFeaturesMaskHigh = 0x5 +PPSMC_MSG_EnableAllSmuFeatures = 0x6 +PPSMC_MSG_DisableAllSmuFeatures = 0x7 +PPSMC_MSG_EnableSmuFeaturesLow = 0x8 +PPSMC_MSG_EnableSmuFeaturesHigh = 0x9 +PPSMC_MSG_DisableSmuFeaturesLow = 0xA +PPSMC_MSG_DisableSmuFeaturesHigh = 0xB +PPSMC_MSG_GetRunningSmuFeaturesLow = 0xC +PPSMC_MSG_GetRunningSmuFeaturesHigh = 0xD +PPSMC_MSG_SetDriverDramAddrHigh = 0xE +PPSMC_MSG_SetDriverDramAddrLow = 0xF +PPSMC_MSG_SetToolsDramAddrHigh = 0x10 +PPSMC_MSG_SetToolsDramAddrLow = 0x11 +PPSMC_MSG_TransferTableSmu2Dram = 0x12 +PPSMC_MSG_TransferTableDram2Smu = 0x13 +PPSMC_MSG_UseDefaultPPTable = 0x14 +PPSMC_MSG_EnterBaco = 0x15 +PPSMC_MSG_ExitBaco = 0x16 +PPSMC_MSG_ArmD3 = 0x17 +PPSMC_MSG_BacoAudioD3PME = 0x18 +PPSMC_MSG_SetSoftMinByFreq = 0x19 +PPSMC_MSG_SetSoftMaxByFreq = 0x1A +PPSMC_MSG_SetHardMinByFreq = 0x1B +PPSMC_MSG_SetHardMaxByFreq = 0x1C +PPSMC_MSG_GetMinDpmFreq = 0x1D +PPSMC_MSG_GetMaxDpmFreq = 0x1E +PPSMC_MSG_GetDpmFreqByIndex = 0x1F +PPSMC_MSG_OverridePcieParameters = 0x20 +PPSMC_MSG_DramLogSetDramAddrHigh = 0x21 +PPSMC_MSG_DramLogSetDramAddrLow = 0x22 +PPSMC_MSG_DramLogSetDramSize = 0x23 +PPSMC_MSG_SetWorkloadMask = 0x24 +PPSMC_MSG_GetVoltageByDpm = 0x25 +PPSMC_MSG_SetVideoFps = 0x26 +PPSMC_MSG_GetDcModeMaxDpmFreq = 0x27 +PPSMC_MSG_AllowGfxOff = 0x28 +PPSMC_MSG_DisallowGfxOff = 0x29 +PPSMC_MSG_PowerUpVcn = 0x2A +PPSMC_MSG_PowerDownVcn = 0x2B +PPSMC_MSG_PowerUpJpeg = 0x2C +PPSMC_MSG_PowerDownJpeg = 0x2D +PPSMC_MSG_PrepareMp1ForUnload = 0x2E +PPSMC_MSG_SetSystemVirtualDramAddrHigh = 0x30 +PPSMC_MSG_SetSystemVirtualDramAddrLow = 0x31 +PPSMC_MSG_SetPptLimit = 0x32 +PPSMC_MSG_GetPptLimit = 0x33 +PPSMC_MSG_ReenableAcDcInterrupt = 0x34 +PPSMC_MSG_NotifyPowerSource = 0x35 +PPSMC_MSG_RunDcBtc = 0x36 +PPSMC_MSG_SetTemperatureInputSelect = 0x38 +PPSMC_MSG_SetFwDstatesMask = 0x39 +PPSMC_MSG_SetThrottlerMask = 0x3A +PPSMC_MSG_SetExternalClientDfCstateAllow = 0x3B +PPSMC_MSG_SetMGpuFanBoostLimitRpm = 0x3C +PPSMC_MSG_DumpSTBtoDram = 0x3D +PPSMC_MSG_STBtoDramLogSetDramAddress = 0x3E +PPSMC_MSG_DummyUndefined = 0x3F +PPSMC_MSG_STBtoDramLogSetDramSize = 0x40 +PPSMC_MSG_SetOBMTraceBufferLogging = 0x41 +PPSMC_MSG_UseProfilingMode = 0x42 +PPSMC_MSG_AllowGfxDcs = 0x43 +PPSMC_MSG_DisallowGfxDcs = 0x44 +PPSMC_MSG_EnableAudioStutterWA = 0x45 +PPSMC_MSG_PowerUpUmsch = 0x46 +PPSMC_MSG_PowerDownUmsch = 0x47 +PPSMC_MSG_SetDcsArch = 0x48 +PPSMC_MSG_TriggerVFFLR = 0x49 +PPSMC_MSG_SetNumBadMemoryPagesRetired = 0x4A +PPSMC_MSG_SetBadMemoryPagesRetiredFlagsPerChannel = 0x4B +PPSMC_MSG_SetPriorityDeltaGain = 0x4C +PPSMC_MSG_AllowIHHostInterrupt = 0x4D +PPSMC_MSG_EnableShadowDpm = 0x4E +PPSMC_MSG_Mode3Reset = 0x4F +PPSMC_MSG_SetDriverDramAddr = 0x50 +PPSMC_MSG_SetToolsDramAddr = 0x51 +PPSMC_MSG_TransferTableSmu2DramWithAddr = 0x52 +PPSMC_MSG_TransferTableDram2SmuWithAddr = 0x53 +PPSMC_MSG_GetAllRunningSmuFeatures = 0x54 +PPSMC_MSG_GetSvi3Voltage = 0x55 +PPSMC_MSG_UpdatePolicy = 0x56 +PPSMC_MSG_ExtPwrConnSupport = 0x57 +PPSMC_MSG_PreloadSwPstateForUclkOverDrive = 0x58 +PPSMC_Message_Count = 0x59 +PPTABLE_VERSION = 0x1B +NUM_GFXCLK_DPM_LEVELS = 16 +NUM_SOCCLK_DPM_LEVELS = 8 +NUM_MP0CLK_DPM_LEVELS = 2 +NUM_DCLK_DPM_LEVELS = 8 +NUM_VCLK_DPM_LEVELS = 8 +NUM_DISPCLK_DPM_LEVELS = 8 +NUM_DPPCLK_DPM_LEVELS = 8 +NUM_DPREFCLK_DPM_LEVELS = 8 +NUM_DCFCLK_DPM_LEVELS = 8 +NUM_DTBCLK_DPM_LEVELS = 8 +NUM_UCLK_DPM_LEVELS = 6 +NUM_LINK_LEVELS = 3 +NUM_FCLK_DPM_LEVELS = 8 +NUM_OD_FAN_MAX_POINTS = 6 +FEATURE_FW_DATA_READ_BIT = 0 +FEATURE_DPM_GFXCLK_BIT = 1 +FEATURE_DPM_GFX_POWER_OPTIMIZER_BIT = 2 +FEATURE_DPM_UCLK_BIT = 3 +FEATURE_DPM_FCLK_BIT = 4 +FEATURE_DPM_SOCCLK_BIT = 5 +FEATURE_DPM_LINK_BIT = 6 +FEATURE_DPM_DCN_BIT = 7 +FEATURE_VMEMP_SCALING_BIT = 8 +FEATURE_VDDIO_MEM_SCALING_BIT = 9 +FEATURE_DS_GFXCLK_BIT = 10 +FEATURE_DS_SOCCLK_BIT = 11 +FEATURE_DS_FCLK_BIT = 12 +FEATURE_DS_LCLK_BIT = 13 +FEATURE_DS_DCFCLK_BIT = 14 +FEATURE_DS_UCLK_BIT = 15 +FEATURE_GFX_ULV_BIT = 16 +FEATURE_FW_DSTATE_BIT = 17 +FEATURE_GFXOFF_BIT = 18 +FEATURE_BACO_BIT = 19 +FEATURE_MM_DPM_BIT = 20 +FEATURE_SOC_MPCLK_DS_BIT = 21 +FEATURE_BACO_MPCLK_DS_BIT = 22 +FEATURE_THROTTLERS_BIT = 23 +FEATURE_SMARTSHIFT_BIT = 24 +FEATURE_GTHR_BIT = 25 +FEATURE_ACDC_BIT = 26 +FEATURE_VR0HOT_BIT = 27 +FEATURE_FW_CTF_BIT = 28 +FEATURE_FAN_CONTROL_BIT = 29 +FEATURE_GFX_DCS_BIT = 30 +FEATURE_GFX_READ_MARGIN_BIT = 31 +FEATURE_LED_DISPLAY_BIT = 32 +FEATURE_GFXCLK_SPREAD_SPECTRUM_BIT = 33 +FEATURE_OUT_OF_BAND_MONITOR_BIT = 34 +FEATURE_OPTIMIZED_VMIN_BIT = 35 +FEATURE_GFX_IMU_BIT = 36 +FEATURE_BOOT_TIME_CAL_BIT = 37 +FEATURE_GFX_PCC_DFLL_BIT = 38 +FEATURE_SOC_CG_BIT = 39 +FEATURE_DF_CSTATE_BIT = 40 +FEATURE_GFX_EDC_BIT = 41 +FEATURE_BOOT_POWER_OPT_BIT = 42 +FEATURE_CLOCK_POWER_DOWN_BYPASS_BIT = 43 +FEATURE_DS_VCN_BIT = 44 +FEATURE_BACO_CG_BIT = 45 +FEATURE_MEM_TEMP_READ_BIT = 46 +FEATURE_ATHUB_MMHUB_PG_BIT = 47 +FEATURE_SOC_PCC_BIT = 48 +FEATURE_EDC_PWRBRK_BIT = 49 +FEATURE_SOC_EDC_XVMIN_BIT = 50 +FEATURE_GFX_PSM_DIDT_BIT = 51 +FEATURE_APT_ALL_ENABLE_BIT = 52 +FEATURE_APT_SQ_THROTTLE_BIT = 53 +FEATURE_APT_PF_DCS_BIT = 54 +FEATURE_GFX_EDC_XVMIN_BIT = 55 +FEATURE_GFX_DIDT_XVMIN_BIT = 56 +FEATURE_FAN_ABNORMAL_BIT = 57 +FEATURE_CLOCK_STRETCH_COMPENSATOR = 58 +FEATURE_SPARE_59_BIT = 59 +FEATURE_SPARE_60_BIT = 60 +FEATURE_SPARE_61_BIT = 61 +FEATURE_SPARE_62_BIT = 62 +FEATURE_SPARE_63_BIT = 63 +NUM_FEATURES = 64 +ALLOWED_FEATURE_CTRL_DEFAULT = 0xFFFFFFFFFFFFFFFF +ALLOWED_FEATURE_CTRL_SCPM = (1 << FEATURE_DPM_GFXCLK_BIT) | (1 << FEATURE_DPM_GFX_POWER_OPTIMIZER_BIT) | (1 << FEATURE_DPM_UCLK_BIT) | (1 << FEATURE_DPM_FCLK_BIT) | (1 << FEATURE_DPM_SOCCLK_BIT) | (1 << FEATURE_DPM_LINK_BIT) | (1 << FEATURE_DPM_DCN_BIT) | (1 << FEATURE_DS_GFXCLK_BIT) | (1 << FEATURE_DS_SOCCLK_BIT) | (1 << FEATURE_DS_FCLK_BIT) | (1 << FEATURE_DS_LCLK_BIT) | (1 << FEATURE_DS_DCFCLK_BIT) | (1 << FEATURE_DS_UCLK_BIT) | (1 << FEATURE_DS_VCN_BIT) +DEBUG_OVERRIDE_NOT_USE = 0x00000001 +DEBUG_OVERRIDE_DISABLE_VOLT_LINK_DCN_FCLK = 0x00000002 +DEBUG_OVERRIDE_DISABLE_VOLT_LINK_MP0_FCLK = 0x00000004 +DEBUG_OVERRIDE_DISABLE_VOLT_LINK_VCN_DCFCLK = 0x00000008 +DEBUG_OVERRIDE_DISABLE_FAST_FCLK_TIMER = 0x00000010 +DEBUG_OVERRIDE_DISABLE_VCN_PG = 0x00000020 +DEBUG_OVERRIDE_DISABLE_FMAX_VMAX = 0x00000040 +DEBUG_OVERRIDE_DISABLE_IMU_FW_CHECKS = 0x00000080 +DEBUG_OVERRIDE_DISABLE_D0i2_REENTRY_HSR_TIMER_CHECK = 0x00000100 +DEBUG_OVERRIDE_DISABLE_DFLL = 0x00000200 +DEBUG_OVERRIDE_ENABLE_RLC_VF_BRINGUP_MODE = 0x00000400 +DEBUG_OVERRIDE_DFLL_MASTER_MODE = 0x00000800 +DEBUG_OVERRIDE_ENABLE_PROFILING_MODE = 0x00001000 +DEBUG_OVERRIDE_ENABLE_SOC_VF_BRINGUP_MODE = 0x00002000 +DEBUG_OVERRIDE_ENABLE_PER_WGP_RESIENCY = 0x00004000 +DEBUG_OVERRIDE_DISABLE_MEMORY_VOLTAGE_SCALING = 0x00008000 +DEBUG_OVERRIDE_DFLL_BTC_FCW_LOG = 0x00010000 +VR_MAPPING_VR_SELECT_MASK = 0x01 +VR_MAPPING_VR_SELECT_SHIFT = 0x00 +VR_MAPPING_PLANE_SELECT_MASK = 0x02 +VR_MAPPING_PLANE_SELECT_SHIFT = 0x01 +PSI_SEL_VR0_PLANE0_PSI0 = 0x01 +PSI_SEL_VR0_PLANE0_PSI1 = 0x02 +PSI_SEL_VR0_PLANE1_PSI0 = 0x04 +PSI_SEL_VR0_PLANE1_PSI1 = 0x08 +PSI_SEL_VR1_PLANE0_PSI0 = 0x10 +PSI_SEL_VR1_PLANE0_PSI1 = 0x20 +PSI_SEL_VR1_PLANE1_PSI0 = 0x40 +PSI_SEL_VR1_PLANE1_PSI1 = 0x80 +THROTTLER_TEMP_EDGE_BIT = 0 +THROTTLER_TEMP_HOTSPOT_BIT = 1 +THROTTLER_TEMP_HOTSPOT_GFX_BIT = 2 +THROTTLER_TEMP_HOTSPOT_SOC_BIT = 3 +THROTTLER_TEMP_MEM_BIT = 4 +THROTTLER_TEMP_VR_GFX_BIT = 5 +THROTTLER_TEMP_VR_SOC_BIT = 6 +THROTTLER_TEMP_VR_MEM0_BIT = 7 +THROTTLER_TEMP_VR_MEM1_BIT = 8 +THROTTLER_TEMP_LIQUID0_BIT = 9 +THROTTLER_TEMP_LIQUID1_BIT = 10 +THROTTLER_TEMP_PLX_BIT = 11 +THROTTLER_TDC_GFX_BIT = 12 +THROTTLER_TDC_SOC_BIT = 13 +THROTTLER_PPT0_BIT = 14 +THROTTLER_PPT1_BIT = 15 +THROTTLER_PPT2_BIT = 16 +THROTTLER_PPT3_BIT = 17 +THROTTLER_FIT_BIT = 18 +THROTTLER_GFX_APCC_PLUS_BIT = 19 +THROTTLER_GFX_DVO_BIT = 20 +THROTTLER_COUNT = 21 +FW_DSTATE_SOC_ULV_BIT = 0 +FW_DSTATE_G6_HSR_BIT = 1 +FW_DSTATE_G6_PHY_VMEMP_OFF_BIT = 2 +FW_DSTATE_SMN_DS_BIT = 3 +FW_DSTATE_MP1_WHISPER_MODE_BIT = 4 +FW_DSTATE_SOC_LIV_MIN_BIT = 5 +FW_DSTATE_SOC_PLL_PWRDN_BIT = 6 +FW_DSTATE_MEM_PLL_PWRDN_BIT = 7 +FW_DSTATE_MALL_ALLOC_BIT = 8 +FW_DSTATE_MEM_PSI_BIT = 9 +FW_DSTATE_HSR_NON_STROBE_BIT = 10 +FW_DSTATE_MP0_ENTER_WFI_BIT = 11 +FW_DSTATE_MALL_FLUSH_BIT = 12 +FW_DSTATE_SOC_PSI_BIT = 13 +FW_DSTATE_MMHUB_INTERLOCK_BIT = 14 +FW_DSTATE_D0i3_2_QUIET_FW_BIT = 15 +FW_DSTATE_CLDO_PRG_BIT = 16 +FW_DSTATE_DF_PLL_PWRDN_BIT = 17 +LED_DISPLAY_GFX_DPM_BIT = 0 +LED_DISPLAY_PCIE_BIT = 1 +LED_DISPLAY_ERROR_BIT = 2 +MEM_TEMP_READ_OUT_OF_BAND_BIT = 0 +MEM_TEMP_READ_IN_BAND_REFRESH_BIT = 1 +MEM_TEMP_READ_IN_BAND_DUMMY_PSTATE_BIT = 2 +NUM_I2C_CONTROLLERS = 8 +I2C_CONTROLLER_ENABLED = 1 +I2C_CONTROLLER_DISABLED = 0 +MAX_SW_I2C_COMMANDS = 24 +CMDCONFIG_STOP_BIT = 0 +CMDCONFIG_RESTART_BIT = 1 +CMDCONFIG_READWRITE_BIT = 2 +CMDCONFIG_STOP_MASK = (1 << CMDCONFIG_STOP_BIT) +CMDCONFIG_RESTART_MASK = (1 << CMDCONFIG_RESTART_BIT) +CMDCONFIG_READWRITE_MASK = (1 << CMDCONFIG_READWRITE_BIT) +EPCS_HIGH_POWER = 600 +EPCS_NORMAL_POWER = 450 +EPCS_LOW_POWER = 300 +EPCS_SHORTED_POWER = 150 +EPCS_NO_BOOTUP = 0 +PP_NUM_RTAVFS_PWL_ZONES = 5 +PP_NUM_PSM_DIDT_PWL_ZONES = 3 +PP_NUM_OD_VF_CURVE_POINTS = PP_NUM_RTAVFS_PWL_ZONES + 1 +PP_OD_FEATURE_GFX_VF_CURVE_BIT = 0 +PP_OD_FEATURE_GFX_VMAX_BIT = 1 +PP_OD_FEATURE_SOC_VMAX_BIT = 2 +PP_OD_FEATURE_PPT_BIT = 3 +PP_OD_FEATURE_FAN_CURVE_BIT = 4 +PP_OD_FEATURE_FAN_LEGACY_BIT = 5 +PP_OD_FEATURE_FULL_CTRL_BIT = 6 +PP_OD_FEATURE_TDC_BIT = 7 +PP_OD_FEATURE_GFXCLK_BIT = 8 +PP_OD_FEATURE_UCLK_BIT = 9 +PP_OD_FEATURE_FCLK_BIT = 10 +PP_OD_FEATURE_ZERO_FAN_BIT = 11 +PP_OD_FEATURE_TEMPERATURE_BIT = 12 +PP_OD_FEATURE_EDC_BIT = 13 +PP_OD_FEATURE_COUNT = 14 +INVALID_BOARD_GPIO = 0xFF +NUM_WM_RANGES = 4 +WORKLOAD_PPLIB_DEFAULT_BIT = 0 +WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT = 1 +WORKLOAD_PPLIB_POWER_SAVING_BIT = 2 +WORKLOAD_PPLIB_VIDEO_BIT = 3 +WORKLOAD_PPLIB_VR_BIT = 4 +WORKLOAD_PPLIB_COMPUTE_BIT = 5 +WORKLOAD_PPLIB_CUSTOM_BIT = 6 +WORKLOAD_PPLIB_WINDOW_3D_BIT = 7 +WORKLOAD_PPLIB_DIRECT_ML_BIT = 8 +WORKLOAD_PPLIB_CGVDI_BIT = 9 +WORKLOAD_PPLIB_COUNT = 10 +TABLE_TRANSFER_OK = 0x0 +TABLE_TRANSFER_FAILED = 0xFF +TABLE_TRANSFER_PENDING = 0xAB +TABLE_PPT_FAILED = 0x100 +TABLE_TDC_FAILED = 0x200 +TABLE_TEMP_FAILED = 0x400 +TABLE_FAN_TARGET_TEMP_FAILED = 0x800 +TABLE_FAN_STOP_TEMP_FAILED = 0x1000 +TABLE_FAN_START_TEMP_FAILED = 0x2000 +TABLE_FAN_PWM_MIN_FAILED = 0x4000 +TABLE_ACOUSTIC_TARGET_RPM_FAILED = 0x8000 +TABLE_ACOUSTIC_LIMIT_RPM_FAILED = 0x10000 +TABLE_MGPU_ACOUSTIC_TARGET_RPM_FAILED = 0x20000 +TABLE_PPTABLE = 0 +TABLE_COMBO_PPTABLE = 1 +TABLE_WATERMARKS = 2 +TABLE_AVFS_PSM_DEBUG = 3 +TABLE_PMSTATUSLOG = 4 +TABLE_SMU_METRICS = 5 +TABLE_DRIVER_SMU_CONFIG = 6 +TABLE_ACTIVITY_MONITOR_COEFF = 7 +TABLE_OVERDRIVE = 8 +TABLE_I2C_COMMANDS = 9 +TABLE_DRIVER_INFO = 10 +TABLE_ECCINFO = 11 +TABLE_CUSTOM_SKUTABLE = 12 +TABLE_COUNT = 13 +IH_INTERRUPT_ID_TO_DRIVER = 0xFE +IH_INTERRUPT_CONTEXT_ID_BACO = 0x2 +IH_INTERRUPT_CONTEXT_ID_AC = 0x3 +IH_INTERRUPT_CONTEXT_ID_DC = 0x4 +IH_INTERRUPT_CONTEXT_ID_AUDIO_D0 = 0x5 +IH_INTERRUPT_CONTEXT_ID_AUDIO_D3 = 0x6 +IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING = 0x7 +IH_INTERRUPT_CONTEXT_ID_FAN_ABNORMAL = 0x8 +IH_INTERRUPT_CONTEXT_ID_FAN_RECOVERY = 0x9 +IH_INTERRUPT_CONTEXT_ID_DYNAMIC_TABLE = 0xA +SMU_THERMAL_MINIMUM_ALERT_TEMP = 0 +SMU_THERMAL_MAXIMUM_ALERT_TEMP = 255 +SMU_TEMPERATURE_UNITS_PER_CENTIGRADES = 1000 +SMU_FW_NAME_LEN = 0x24 +SMU_DPM_USER_PROFILE_RESTORE = (1 << 0) +SMU_CUSTOM_FAN_SPEED_RPM = (1 << 1) +SMU_CUSTOM_FAN_SPEED_PWM = (1 << 2) +SMU_THROTTLER_PPT0_BIT = 0 +SMU_THROTTLER_PPT1_BIT = 1 +SMU_THROTTLER_PPT2_BIT = 2 +SMU_THROTTLER_PPT3_BIT = 3 +SMU_THROTTLER_SPL_BIT = 4 +SMU_THROTTLER_FPPT_BIT = 5 +SMU_THROTTLER_SPPT_BIT = 6 +SMU_THROTTLER_SPPT_APU_BIT = 7 +SMU_THROTTLER_TDC_GFX_BIT = 16 +SMU_THROTTLER_TDC_SOC_BIT = 17 +SMU_THROTTLER_TDC_MEM_BIT = 18 +SMU_THROTTLER_TDC_VDD_BIT = 19 +SMU_THROTTLER_TDC_CVIP_BIT = 20 +SMU_THROTTLER_EDC_CPU_BIT = 21 +SMU_THROTTLER_EDC_GFX_BIT = 22 +SMU_THROTTLER_APCC_BIT = 23 +SMU_THROTTLER_TEMP_GPU_BIT = 32 +SMU_THROTTLER_TEMP_CORE_BIT = 33 +SMU_THROTTLER_TEMP_MEM_BIT = 34 +SMU_THROTTLER_TEMP_EDGE_BIT = 35 +SMU_THROTTLER_TEMP_HOTSPOT_BIT = 36 +SMU_THROTTLER_TEMP_SOC_BIT = 37 +SMU_THROTTLER_TEMP_VR_GFX_BIT = 38 +SMU_THROTTLER_TEMP_VR_SOC_BIT = 39 +SMU_THROTTLER_TEMP_VR_MEM0_BIT = 40 +SMU_THROTTLER_TEMP_VR_MEM1_BIT = 41 +SMU_THROTTLER_TEMP_LIQUID0_BIT = 42 +SMU_THROTTLER_TEMP_LIQUID1_BIT = 43 +SMU_THROTTLER_VRHOT0_BIT = 44 +SMU_THROTTLER_VRHOT1_BIT = 45 +SMU_THROTTLER_PROCHOT_CPU_BIT = 46 +SMU_THROTTLER_PROCHOT_GFX_BIT = 47 +SMU_THROTTLER_PPM_BIT = 56 +SMU_THROTTLER_FIT_BIT = 57 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_11.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_11.py new file mode 100644 index 000000000..4fd23dd05 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_11.py @@ -0,0 +1,44 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +enum_MTYPE: dict[int, str] = {(MTYPE_C_RW_US:=0): 'MTYPE_C_RW_US', (MTYPE_RESERVED_1:=1): 'MTYPE_RESERVED_1', (MTYPE_C_RO_S:=2): 'MTYPE_C_RO_S', (MTYPE_UC:=3): 'MTYPE_UC', (MTYPE_C_RW_S:=4): 'MTYPE_C_RW_S', (MTYPE_RESERVED_5:=5): 'MTYPE_RESERVED_5', (MTYPE_C_RO_US:=6): 'MTYPE_C_RO_US', (MTYPE_RESERVED_7:=7): 'MTYPE_RESERVED_7'} +MTYPE: TypeAlias = ctypes.c_uint32 +enum_SH_MEM_ADDRESS_MODE: dict[int, str] = {(SH_MEM_ADDRESS_MODE_64:=0): 'SH_MEM_ADDRESS_MODE_64', (SH_MEM_ADDRESS_MODE_32:=1): 'SH_MEM_ADDRESS_MODE_32'} +SH_MEM_ADDRESS_MODE: TypeAlias = ctypes.c_uint32 +enum_SH_MEM_ALIGNMENT_MODE: dict[int, str] = {(SH_MEM_ALIGNMENT_MODE_DWORD:=0): 'SH_MEM_ALIGNMENT_MODE_DWORD', (SH_MEM_ALIGNMENT_MODE_DWORD_STRICT:=1): 'SH_MEM_ALIGNMENT_MODE_DWORD_STRICT', (SH_MEM_ALIGNMENT_MODE_STRICT:=2): 'SH_MEM_ALIGNMENT_MODE_STRICT', (SH_MEM_ALIGNMENT_MODE_UNALIGNED:=3): 'SH_MEM_ALIGNMENT_MODE_UNALIGNED'} +SH_MEM_ALIGNMENT_MODE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_MODE: dict[int, str] = {(SQ_TT_MODE_OFF:=0): 'SQ_TT_MODE_OFF', (SQ_TT_MODE_ON:=1): 'SQ_TT_MODE_ON', (SQ_TT_MODE_GLOBAL:=2): 'SQ_TT_MODE_GLOBAL', (SQ_TT_MODE_DETAIL:=3): 'SQ_TT_MODE_DETAIL'} +SQ_TT_MODE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_RT_FREQ: dict[int, str] = {(SQ_TT_RT_FREQ_NEVER:=0): 'SQ_TT_RT_FREQ_NEVER', (SQ_TT_RT_FREQ_1024_CLK:=1): 'SQ_TT_RT_FREQ_1024_CLK', (SQ_TT_RT_FREQ_4096_CLK:=2): 'SQ_TT_RT_FREQ_4096_CLK'} +SQ_TT_RT_FREQ: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_INST_EXCLUDE: dict[int, str] = {(SQ_TT_INST_EXCLUDE_VMEM_OTHER_SIMD_BIT:=1): 'SQ_TT_INST_EXCLUDE_VMEM_OTHER_SIMD_BIT', (SQ_TT_INST_EXCLUDE_EXPGNT234_BIT:=2): 'SQ_TT_INST_EXCLUDE_EXPGNT234_BIT'} +SQ_TT_TOKEN_MASK_INST_EXCLUDE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_INST_EXCLUDE_SHIFT: dict[int, str] = {(SQ_TT_INST_EXCLUDE_VMEM_OTHER_SIMD_SHIFT:=0): 'SQ_TT_INST_EXCLUDE_VMEM_OTHER_SIMD_SHIFT', (SQ_TT_INST_EXCLUDE_EXPGNT234_SHIFT:=1): 'SQ_TT_INST_EXCLUDE_EXPGNT234_SHIFT'} +SQ_TT_TOKEN_MASK_INST_EXCLUDE_SHIFT: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_REG_EXCLUDE: dict[int, str] = {(SQ_TT_REG_EXCLUDE_USER_DATA_BIT:=1): 'SQ_TT_REG_EXCLUDE_USER_DATA_BIT', (SQ_TT_REG_EXCLUDE_CP_ME_MC_RADDR_BIT:=2): 'SQ_TT_REG_EXCLUDE_CP_ME_MC_RADDR_BIT', (SQ_TT_REG_EXCLUDE_GRBM_COMPUTE_EXCLUDE_BIT:=4): 'SQ_TT_REG_EXCLUDE_GRBM_COMPUTE_EXCLUDE_BIT'} +SQ_TT_TOKEN_MASK_REG_EXCLUDE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_REG_EXCLUDE_SHIFT: dict[int, str] = {(SQ_TT_REG_EXCLUDE_USER_DATA_SHIFT:=0): 'SQ_TT_REG_EXCLUDE_USER_DATA_SHIFT', (SQ_TT_REG_EXCLUDE_CP_ME_MC_RADDR_SHIFT:=1): 'SQ_TT_REG_EXCLUDE_CP_ME_MC_RADDR_SHIFT', (SQ_TT_REG_EXCLUDE_GRBM_COMPUTE_EXCLUDE_SHIFT:=2): 'SQ_TT_REG_EXCLUDE_GRBM_COMPUTE_EXCLUDE_SHIFT'} +SQ_TT_TOKEN_MASK_REG_EXCLUDE_SHIFT: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_REG_INCLUDE: dict[int, str] = {(SQ_TT_TOKEN_MASK_SQDEC_BIT:=1): 'SQ_TT_TOKEN_MASK_SQDEC_BIT', (SQ_TT_TOKEN_MASK_SHDEC_BIT:=2): 'SQ_TT_TOKEN_MASK_SHDEC_BIT', (SQ_TT_TOKEN_MASK_GFXUDEC_BIT:=4): 'SQ_TT_TOKEN_MASK_GFXUDEC_BIT', (SQ_TT_TOKEN_MASK_COMP_BIT:=8): 'SQ_TT_TOKEN_MASK_COMP_BIT', (SQ_TT_TOKEN_MASK_CONTEXT_BIT:=16): 'SQ_TT_TOKEN_MASK_CONTEXT_BIT', (SQ_TT_TOKEN_MASK_CONFIG_BIT:=32): 'SQ_TT_TOKEN_MASK_CONFIG_BIT', (SQ_TT_TOKEN_MASK_ALL_BIT:=64): 'SQ_TT_TOKEN_MASK_ALL_BIT', (SQ_TT_TOKEN_MASK_RSVD_BIT:=128): 'SQ_TT_TOKEN_MASK_RSVD_BIT'} +SQ_TT_TOKEN_MASK_REG_INCLUDE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_REG_INCLUDE_SHIFT: dict[int, str] = {(SQ_TT_TOKEN_MASK_SQDEC_SHIFT:=0): 'SQ_TT_TOKEN_MASK_SQDEC_SHIFT', (SQ_TT_TOKEN_MASK_SHDEC_SHIFT:=1): 'SQ_TT_TOKEN_MASK_SHDEC_SHIFT', (SQ_TT_TOKEN_MASK_GFXUDEC_SHIFT:=2): 'SQ_TT_TOKEN_MASK_GFXUDEC_SHIFT', (SQ_TT_TOKEN_MASK_COMP_SHIFT:=3): 'SQ_TT_TOKEN_MASK_COMP_SHIFT', (SQ_TT_TOKEN_MASK_CONTEXT_SHIFT:=4): 'SQ_TT_TOKEN_MASK_CONTEXT_SHIFT', (SQ_TT_TOKEN_MASK_CONFIG_SHIFT:=5): 'SQ_TT_TOKEN_MASK_CONFIG_SHIFT', (SQ_TT_TOKEN_MASK_ALL_SHIFT:=6): 'SQ_TT_TOKEN_MASK_ALL_SHIFT', (SQ_TT_TOKEN_MASK_RSVD_SHIFT:=7): 'SQ_TT_TOKEN_MASK_RSVD_SHIFT'} +SQ_TT_TOKEN_MASK_REG_INCLUDE_SHIFT: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_TOKEN_EXCLUDE_SHIFT: dict[int, str] = {(SQ_TT_TOKEN_EXCLUDE_VMEMEXEC_SHIFT:=0): 'SQ_TT_TOKEN_EXCLUDE_VMEMEXEC_SHIFT', (SQ_TT_TOKEN_EXCLUDE_ALUEXEC_SHIFT:=1): 'SQ_TT_TOKEN_EXCLUDE_ALUEXEC_SHIFT', (SQ_TT_TOKEN_EXCLUDE_VALUINST_SHIFT:=2): 'SQ_TT_TOKEN_EXCLUDE_VALUINST_SHIFT', (SQ_TT_TOKEN_EXCLUDE_WAVERDY_SHIFT:=3): 'SQ_TT_TOKEN_EXCLUDE_WAVERDY_SHIFT', (SQ_TT_TOKEN_EXCLUDE_WAVESTARTEND_SHIFT:=4): 'SQ_TT_TOKEN_EXCLUDE_WAVESTARTEND_SHIFT', (SQ_TT_TOKEN_EXCLUDE_IMMEDIATE_SHIFT:=5): 'SQ_TT_TOKEN_EXCLUDE_IMMEDIATE_SHIFT', (SQ_TT_TOKEN_EXCLUDE_REG_SHIFT:=6): 'SQ_TT_TOKEN_EXCLUDE_REG_SHIFT', (SQ_TT_TOKEN_EXCLUDE_EVENT_SHIFT:=7): 'SQ_TT_TOKEN_EXCLUDE_EVENT_SHIFT', (SQ_TT_TOKEN_EXCLUDE_INST_SHIFT:=8): 'SQ_TT_TOKEN_EXCLUDE_INST_SHIFT', (SQ_TT_TOKEN_EXCLUDE_UTILCTR_SHIFT:=9): 'SQ_TT_TOKEN_EXCLUDE_UTILCTR_SHIFT', (SQ_TT_TOKEN_EXCLUDE_WAVEALLOC_SHIFT:=10): 'SQ_TT_TOKEN_EXCLUDE_WAVEALLOC_SHIFT', (SQ_TT_TOKEN_EXCLUDE_PERF_SHIFT:=11): 'SQ_TT_TOKEN_EXCLUDE_PERF_SHIFT'} +SQ_TT_TOKEN_MASK_TOKEN_EXCLUDE_SHIFT: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_UTIL_TIMER: dict[int, str] = {(SQ_TT_UTIL_TIMER_100_CLK:=0): 'SQ_TT_UTIL_TIMER_100_CLK', (SQ_TT_UTIL_TIMER_250_CLK:=1): 'SQ_TT_UTIL_TIMER_250_CLK'} +SQ_TT_UTIL_TIMER: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_WAVESTART_MODE: dict[int, str] = {(SQ_TT_WAVESTART_MODE_SHORT:=0): 'SQ_TT_WAVESTART_MODE_SHORT', (SQ_TT_WAVESTART_MODE_ALLOC:=1): 'SQ_TT_WAVESTART_MODE_ALLOC', (SQ_TT_WAVESTART_MODE_PBB_ID:=2): 'SQ_TT_WAVESTART_MODE_PBB_ID'} +SQ_TT_WAVESTART_MODE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_WTYPE_INCLUDE: dict[int, str] = {(SQ_TT_WTYPE_INCLUDE_PS_BIT:=1): 'SQ_TT_WTYPE_INCLUDE_PS_BIT', (SQ_TT_WTYPE_INCLUDE_RSVD0_BIT:=2): 'SQ_TT_WTYPE_INCLUDE_RSVD0_BIT', (SQ_TT_WTYPE_INCLUDE_GS_BIT:=4): 'SQ_TT_WTYPE_INCLUDE_GS_BIT', (SQ_TT_WTYPE_INCLUDE_RSVD1_BIT:=8): 'SQ_TT_WTYPE_INCLUDE_RSVD1_BIT', (SQ_TT_WTYPE_INCLUDE_HS_BIT:=16): 'SQ_TT_WTYPE_INCLUDE_HS_BIT', (SQ_TT_WTYPE_INCLUDE_RSVD2_BIT:=32): 'SQ_TT_WTYPE_INCLUDE_RSVD2_BIT', (SQ_TT_WTYPE_INCLUDE_CS_BIT:=64): 'SQ_TT_WTYPE_INCLUDE_CS_BIT'} +SQ_TT_WTYPE_INCLUDE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_WTYPE_INCLUDE_SHIFT: dict[int, str] = {(SQ_TT_WTYPE_INCLUDE_PS_SHIFT:=0): 'SQ_TT_WTYPE_INCLUDE_PS_SHIFT', (SQ_TT_WTYPE_INCLUDE_RSVD0_SHIFT:=1): 'SQ_TT_WTYPE_INCLUDE_RSVD0_SHIFT', (SQ_TT_WTYPE_INCLUDE_GS_SHIFT:=2): 'SQ_TT_WTYPE_INCLUDE_GS_SHIFT', (SQ_TT_WTYPE_INCLUDE_RSVD1_SHIFT:=3): 'SQ_TT_WTYPE_INCLUDE_RSVD1_SHIFT', (SQ_TT_WTYPE_INCLUDE_HS_SHIFT:=4): 'SQ_TT_WTYPE_INCLUDE_HS_SHIFT', (SQ_TT_WTYPE_INCLUDE_RSVD2_SHIFT:=5): 'SQ_TT_WTYPE_INCLUDE_RSVD2_SHIFT', (SQ_TT_WTYPE_INCLUDE_CS_SHIFT:=6): 'SQ_TT_WTYPE_INCLUDE_CS_SHIFT'} +SQ_TT_WTYPE_INCLUDE_SHIFT: TypeAlias = ctypes.c_uint32 +enum_CSCNTL_TYPE: dict[int, str] = {(CSCNTL_TYPE_TG:=0): 'CSCNTL_TYPE_TG', (CSCNTL_TYPE_STATE:=1): 'CSCNTL_TYPE_STATE', (CSCNTL_TYPE_EVENT:=2): 'CSCNTL_TYPE_EVENT', (CSCNTL_TYPE_PRIVATE:=3): 'CSCNTL_TYPE_PRIVATE'} +CSCNTL_TYPE: TypeAlias = ctypes.c_uint32 +enum_CSDATA_TYPE: dict[int, str] = {(CSDATA_TYPE_TG:=0): 'CSDATA_TYPE_TG', (CSDATA_TYPE_STATE:=1): 'CSDATA_TYPE_STATE', (CSDATA_TYPE_EVENT:=2): 'CSDATA_TYPE_EVENT', (CSDATA_TYPE_PRIVATE:=3): 'CSDATA_TYPE_PRIVATE'} +CSDATA_TYPE: TypeAlias = ctypes.c_uint32 +enum_VGT_EVENT_TYPE: dict[int, str] = {(Reserved_0x00:=0): 'Reserved_0x00', (SAMPLE_STREAMOUTSTATS1:=1): 'SAMPLE_STREAMOUTSTATS1', (SAMPLE_STREAMOUTSTATS2:=2): 'SAMPLE_STREAMOUTSTATS2', (SAMPLE_STREAMOUTSTATS3:=3): 'SAMPLE_STREAMOUTSTATS3', (CACHE_FLUSH_TS:=4): 'CACHE_FLUSH_TS', (CONTEXT_DONE:=5): 'CONTEXT_DONE', (CACHE_FLUSH:=6): 'CACHE_FLUSH', (CS_PARTIAL_FLUSH:=7): 'CS_PARTIAL_FLUSH', (VGT_STREAMOUT_SYNC:=8): 'VGT_STREAMOUT_SYNC', (Reserved_0x09:=9): 'Reserved_0x09', (VGT_STREAMOUT_RESET:=10): 'VGT_STREAMOUT_RESET', (END_OF_PIPE_INCR_DE:=11): 'END_OF_PIPE_INCR_DE', (END_OF_PIPE_IB_END:=12): 'END_OF_PIPE_IB_END', (RST_PIX_CNT:=13): 'RST_PIX_CNT', (BREAK_BATCH:=14): 'BREAK_BATCH', (VS_PARTIAL_FLUSH:=15): 'VS_PARTIAL_FLUSH', (PS_PARTIAL_FLUSH:=16): 'PS_PARTIAL_FLUSH', (FLUSH_HS_OUTPUT:=17): 'FLUSH_HS_OUTPUT', (FLUSH_DFSM:=18): 'FLUSH_DFSM', (RESET_TO_LOWEST_VGT:=19): 'RESET_TO_LOWEST_VGT', (CACHE_FLUSH_AND_INV_TS_EVENT:=20): 'CACHE_FLUSH_AND_INV_TS_EVENT', (WAIT_SYNC:=21): 'WAIT_SYNC', (CACHE_FLUSH_AND_INV_EVENT:=22): 'CACHE_FLUSH_AND_INV_EVENT', (PERFCOUNTER_START:=23): 'PERFCOUNTER_START', (PERFCOUNTER_STOP:=24): 'PERFCOUNTER_STOP', (PIPELINESTAT_START:=25): 'PIPELINESTAT_START', (PIPELINESTAT_STOP:=26): 'PIPELINESTAT_STOP', (PERFCOUNTER_SAMPLE:=27): 'PERFCOUNTER_SAMPLE', (FLUSH_ES_OUTPUT:=28): 'FLUSH_ES_OUTPUT', (BIN_CONF_OVERRIDE_CHECK:=29): 'BIN_CONF_OVERRIDE_CHECK', (SAMPLE_PIPELINESTAT:=30): 'SAMPLE_PIPELINESTAT', (SO_VGTSTREAMOUT_FLUSH:=31): 'SO_VGTSTREAMOUT_FLUSH', (SAMPLE_STREAMOUTSTATS:=32): 'SAMPLE_STREAMOUTSTATS', (RESET_VTX_CNT:=33): 'RESET_VTX_CNT', (BLOCK_CONTEXT_DONE:=34): 'BLOCK_CONTEXT_DONE', (CS_CONTEXT_DONE:=35): 'CS_CONTEXT_DONE', (VGT_FLUSH:=36): 'VGT_FLUSH', (TGID_ROLLOVER:=37): 'TGID_ROLLOVER', (SQ_NON_EVENT:=38): 'SQ_NON_EVENT', (SC_SEND_DB_VPZ:=39): 'SC_SEND_DB_VPZ', (BOTTOM_OF_PIPE_TS:=40): 'BOTTOM_OF_PIPE_TS', (FLUSH_SX_TS:=41): 'FLUSH_SX_TS', (DB_CACHE_FLUSH_AND_INV:=42): 'DB_CACHE_FLUSH_AND_INV', (FLUSH_AND_INV_DB_DATA_TS:=43): 'FLUSH_AND_INV_DB_DATA_TS', (FLUSH_AND_INV_DB_META:=44): 'FLUSH_AND_INV_DB_META', (FLUSH_AND_INV_CB_DATA_TS:=45): 'FLUSH_AND_INV_CB_DATA_TS', (FLUSH_AND_INV_CB_META:=46): 'FLUSH_AND_INV_CB_META', (CS_DONE:=47): 'CS_DONE', (PS_DONE:=48): 'PS_DONE', (FLUSH_AND_INV_CB_PIXEL_DATA:=49): 'FLUSH_AND_INV_CB_PIXEL_DATA', (SX_CB_RAT_ACK_REQUEST:=50): 'SX_CB_RAT_ACK_REQUEST', (THREAD_TRACE_START:=51): 'THREAD_TRACE_START', (THREAD_TRACE_STOP:=52): 'THREAD_TRACE_STOP', (THREAD_TRACE_MARKER:=53): 'THREAD_TRACE_MARKER', (THREAD_TRACE_DRAW:=54): 'THREAD_TRACE_DRAW', (THREAD_TRACE_FINISH:=55): 'THREAD_TRACE_FINISH', (PIXEL_PIPE_STAT_CONTROL:=56): 'PIXEL_PIPE_STAT_CONTROL', (PIXEL_PIPE_STAT_DUMP:=57): 'PIXEL_PIPE_STAT_DUMP', (PIXEL_PIPE_STAT_RESET:=58): 'PIXEL_PIPE_STAT_RESET', (CONTEXT_SUSPEND:=59): 'CONTEXT_SUSPEND', (OFFCHIP_HS_DEALLOC:=60): 'OFFCHIP_HS_DEALLOC', (ENABLE_NGG_PIPELINE:=61): 'ENABLE_NGG_PIPELINE', (ENABLE_LEGACY_PIPELINE:=62): 'ENABLE_LEGACY_PIPELINE', (DRAW_DONE:=63): 'DRAW_DONE'} +VGT_EVENT_TYPE: TypeAlias = ctypes.c_uint32 diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_12.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_12.py new file mode 100644 index 000000000..7a7b0d28a --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_12.py @@ -0,0 +1,24 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +enum_MTYPE: dict[int, str] = {(MTYPE_C_RW_US:=0): 'MTYPE_C_RW_US', (MTYPE_RESERVED_1:=1): 'MTYPE_RESERVED_1', (MTYPE_C_RO_S:=2): 'MTYPE_C_RO_S', (MTYPE_UC:=3): 'MTYPE_UC', (MTYPE_C_RW_S:=4): 'MTYPE_C_RW_S', (MTYPE_RESERVED_5:=5): 'MTYPE_RESERVED_5', (MTYPE_C_RO_US:=6): 'MTYPE_C_RO_US', (MTYPE_RESERVED_7:=7): 'MTYPE_RESERVED_7'} +MTYPE: TypeAlias = ctypes.c_uint32 +enum_CSCNTL_TYPE: dict[int, str] = {(CSCNTL_TYPE_TG:=0): 'CSCNTL_TYPE_TG', (CSCNTL_TYPE_STATE:=1): 'CSCNTL_TYPE_STATE', (CSCNTL_TYPE_EVENT:=2): 'CSCNTL_TYPE_EVENT', (CSCNTL_TYPE_PRIVATE:=3): 'CSCNTL_TYPE_PRIVATE'} +CSCNTL_TYPE: TypeAlias = ctypes.c_uint32 +enum_CSDATA_TYPE: dict[int, str] = {(CSDATA_TYPE_TG:=0): 'CSDATA_TYPE_TG', (CSDATA_TYPE_STATE:=1): 'CSDATA_TYPE_STATE', (CSDATA_TYPE_EVENT:=2): 'CSDATA_TYPE_EVENT', (CSDATA_TYPE_PRIVATE:=3): 'CSDATA_TYPE_PRIVATE'} +CSDATA_TYPE: TypeAlias = ctypes.c_uint32 +enum_VGT_EVENT_TYPE: dict[int, str] = {(Reserved_0x00:=0): 'Reserved_0x00', (SAMPLE_STREAMOUTSTATS1:=1): 'SAMPLE_STREAMOUTSTATS1', (SAMPLE_STREAMOUTSTATS2:=2): 'SAMPLE_STREAMOUTSTATS2', (SAMPLE_STREAMOUTSTATS3:=3): 'SAMPLE_STREAMOUTSTATS3', (CACHE_FLUSH_TS:=4): 'CACHE_FLUSH_TS', (CONTEXT_DONE:=5): 'CONTEXT_DONE', (CACHE_FLUSH:=6): 'CACHE_FLUSH', (CS_PARTIAL_FLUSH:=7): 'CS_PARTIAL_FLUSH', (VGT_STREAMOUT_SYNC:=8): 'VGT_STREAMOUT_SYNC', (EVENT_STATE_CHANGE:=9): 'EVENT_STATE_CHANGE', (VGT_STREAMOUT_RESET:=10): 'VGT_STREAMOUT_RESET', (END_OF_PIPE_INCR_DE:=11): 'END_OF_PIPE_INCR_DE', (END_OF_PIPE_IB_END:=12): 'END_OF_PIPE_IB_END', (RST_PIX_CNT:=13): 'RST_PIX_CNT', (BREAK_BATCH:=14): 'BREAK_BATCH', (VS_PARTIAL_FLUSH:=15): 'VS_PARTIAL_FLUSH', (PS_PARTIAL_FLUSH:=16): 'PS_PARTIAL_FLUSH', (FLUSH_HS_OUTPUT:=17): 'FLUSH_HS_OUTPUT', (FLUSH_DFSM:=18): 'FLUSH_DFSM', (RESET_TO_LOWEST_VGT:=19): 'RESET_TO_LOWEST_VGT', (CACHE_FLUSH_AND_INV_TS_EVENT:=20): 'CACHE_FLUSH_AND_INV_TS_EVENT', (WAIT_SYNC:=21): 'WAIT_SYNC', (CACHE_FLUSH_AND_INV_EVENT:=22): 'CACHE_FLUSH_AND_INV_EVENT', (PERFCOUNTER_START:=23): 'PERFCOUNTER_START', (PERFCOUNTER_STOP:=24): 'PERFCOUNTER_STOP', (PIPELINESTAT_START:=25): 'PIPELINESTAT_START', (PIPELINESTAT_STOP:=26): 'PIPELINESTAT_STOP', (PERFCOUNTER_SAMPLE:=27): 'PERFCOUNTER_SAMPLE', (FLUSH_ES_OUTPUT:=28): 'FLUSH_ES_OUTPUT', (BIN_CONF_OVERRIDE_CHECK:=29): 'BIN_CONF_OVERRIDE_CHECK', (SAMPLE_PIPELINESTAT:=30): 'SAMPLE_PIPELINESTAT', (SO_VGTSTREAMOUT_FLUSH:=31): 'SO_VGTSTREAMOUT_FLUSH', (SAMPLE_STREAMOUTSTATS:=32): 'SAMPLE_STREAMOUTSTATS', (RESET_VTX_CNT:=33): 'RESET_VTX_CNT', (BLOCK_CONTEXT_DONE:=34): 'BLOCK_CONTEXT_DONE', (CS_CONTEXT_DONE:=35): 'CS_CONTEXT_DONE', (VGT_FLUSH:=36): 'VGT_FLUSH', (TGID_ROLLOVER:=37): 'TGID_ROLLOVER', (SQ_NON_EVENT:=38): 'SQ_NON_EVENT', (SC_SEND_DB_VPZ:=39): 'SC_SEND_DB_VPZ', (BOTTOM_OF_PIPE_TS:=40): 'BOTTOM_OF_PIPE_TS', (FLUSH_SX_TS:=41): 'FLUSH_SX_TS', (DB_CACHE_FLUSH_AND_INV:=42): 'DB_CACHE_FLUSH_AND_INV', (FLUSH_AND_INV_DB_DATA_TS:=43): 'FLUSH_AND_INV_DB_DATA_TS', (FLUSH_AND_INV_DB_META:=44): 'FLUSH_AND_INV_DB_META', (FLUSH_AND_INV_CB_DATA_TS:=45): 'FLUSH_AND_INV_CB_DATA_TS', (FLUSH_AND_INV_CB_META:=46): 'FLUSH_AND_INV_CB_META', (CS_DONE:=47): 'CS_DONE', (PS_DONE:=48): 'PS_DONE', (FLUSH_AND_INV_CB_PIXEL_DATA:=49): 'FLUSH_AND_INV_CB_PIXEL_DATA', (SX_CB_RAT_ACK_REQUEST:=50): 'SX_CB_RAT_ACK_REQUEST', (THREAD_TRACE_START:=51): 'THREAD_TRACE_START', (THREAD_TRACE_STOP:=52): 'THREAD_TRACE_STOP', (THREAD_TRACE_MARKER:=53): 'THREAD_TRACE_MARKER', (THREAD_TRACE_DRAW:=54): 'THREAD_TRACE_DRAW', (THREAD_TRACE_FINISH:=55): 'THREAD_TRACE_FINISH', (PIXEL_PIPE_STAT_CONTROL:=56): 'PIXEL_PIPE_STAT_CONTROL', (PIXEL_PIPE_STAT_DUMP:=57): 'PIXEL_PIPE_STAT_DUMP', (PIXEL_PIPE_STAT_RESET:=58): 'PIXEL_PIPE_STAT_RESET', (CONTEXT_SUSPEND:=59): 'CONTEXT_SUSPEND', (OFFCHIP_HS_DEALLOC:=60): 'OFFCHIP_HS_DEALLOC', (ENABLE_NGG_PIPELINE:=61): 'ENABLE_NGG_PIPELINE', (ENABLE_PIPELINE_NOT_USED:=62): 'ENABLE_PIPELINE_NOT_USED', (DRAW_DONE:=63): 'DRAW_DONE'} +VGT_EVENT_TYPE: TypeAlias = ctypes.c_uint32 +enum_SH_MEM_ADDRESS_MODE: dict[int, str] = {(SH_MEM_ADDRESS_MODE_64:=0): 'SH_MEM_ADDRESS_MODE_64', (SH_MEM_ADDRESS_MODE_32:=1): 'SH_MEM_ADDRESS_MODE_32'} +SH_MEM_ADDRESS_MODE: TypeAlias = ctypes.c_uint32 +enum_SH_MEM_ALIGNMENT_MODE: dict[int, str] = {(SH_MEM_ALIGNMENT_MODE_DWORD:=0): 'SH_MEM_ALIGNMENT_MODE_DWORD', (SH_MEM_ALIGNMENT_MODE_DWORD_STRICT:=1): 'SH_MEM_ALIGNMENT_MODE_DWORD_STRICT', (SH_MEM_ALIGNMENT_MODE_STRICT:=2): 'SH_MEM_ALIGNMENT_MODE_STRICT', (SH_MEM_ALIGNMENT_MODE_UNALIGNED:=3): 'SH_MEM_ALIGNMENT_MODE_UNALIGNED'} +SH_MEM_ALIGNMENT_MODE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_REG_INCLUDE: dict[int, str] = {(SQ_TT_TOKEN_MASK_SQDEC_BIT:=1): 'SQ_TT_TOKEN_MASK_SQDEC_BIT', (SQ_TT_TOKEN_MASK_SHDEC_BIT:=2): 'SQ_TT_TOKEN_MASK_SHDEC_BIT', (SQ_TT_TOKEN_MASK_GFXUDEC_BIT:=4): 'SQ_TT_TOKEN_MASK_GFXUDEC_BIT', (SQ_TT_TOKEN_MASK_COMP_BIT:=8): 'SQ_TT_TOKEN_MASK_COMP_BIT', (SQ_TT_TOKEN_MASK_CONTEXT_BIT:=16): 'SQ_TT_TOKEN_MASK_CONTEXT_BIT'} +SQ_TT_TOKEN_MASK_REG_INCLUDE: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_TOKEN_MASK_TOKEN_EXCLUDE_SHIFT: dict[int, str] = {(SQ_TT_TOKEN_EXCLUDE_VMEMEXEC_SHIFT:=0): 'SQ_TT_TOKEN_EXCLUDE_VMEMEXEC_SHIFT', (SQ_TT_TOKEN_EXCLUDE_ALUEXEC_SHIFT:=1): 'SQ_TT_TOKEN_EXCLUDE_ALUEXEC_SHIFT', (SQ_TT_TOKEN_EXCLUDE_WAVERDY_SHIFT:=3): 'SQ_TT_TOKEN_EXCLUDE_WAVERDY_SHIFT'} +SQ_TT_TOKEN_MASK_TOKEN_EXCLUDE_SHIFT: TypeAlias = ctypes.c_uint32 +enum_SQ_TT_MODE: dict[int, str] = {(SQ_TT_MODE_OFF:=0): 'SQ_TT_MODE_OFF', (SQ_TT_MODE_ON:=1): 'SQ_TT_MODE_ON'} +SQ_TT_MODE: TypeAlias = ctypes.c_uint32 diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_9.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_9.py new file mode 100644 index 000000000..373544220 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/soc_9.py @@ -0,0 +1,16 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +enum_MTYPE: dict[int, str] = {(MTYPE_NC:=0): 'MTYPE_NC', (MTYPE_WC:=1): 'MTYPE_WC', (MTYPE_RW:=1): 'MTYPE_RW', (MTYPE_CC:=2): 'MTYPE_CC', (MTYPE_UC:=3): 'MTYPE_UC'} +MTYPE: TypeAlias = ctypes.c_uint32 +enum_SH_MEM_ADDRESS_MODE: dict[int, str] = {(SH_MEM_ADDRESS_MODE_64:=0): 'SH_MEM_ADDRESS_MODE_64', (SH_MEM_ADDRESS_MODE_32:=1): 'SH_MEM_ADDRESS_MODE_32'} +SH_MEM_ADDRESS_MODE: TypeAlias = ctypes.c_uint32 +enum_SH_MEM_ALIGNMENT_MODE: dict[int, str] = {(SH_MEM_ALIGNMENT_MODE_DWORD:=0): 'SH_MEM_ALIGNMENT_MODE_DWORD', (SH_MEM_ALIGNMENT_MODE_DWORD_STRICT:=1): 'SH_MEM_ALIGNMENT_MODE_DWORD_STRICT', (SH_MEM_ALIGNMENT_MODE_STRICT:=2): 'SH_MEM_ALIGNMENT_MODE_STRICT', (SH_MEM_ALIGNMENT_MODE_UNALIGNED:=3): 'SH_MEM_ALIGNMENT_MODE_UNALIGNED'} +SH_MEM_ALIGNMENT_MODE: TypeAlias = ctypes.c_uint32 +enum_CSDATA_TYPE: dict[int, str] = {(CSDATA_TYPE_TG:=0): 'CSDATA_TYPE_TG', (CSDATA_TYPE_STATE:=1): 'CSDATA_TYPE_STATE', (CSDATA_TYPE_EVENT:=2): 'CSDATA_TYPE_EVENT', (CSDATA_TYPE_PRIVATE:=3): 'CSDATA_TYPE_PRIVATE'} +CSDATA_TYPE: TypeAlias = ctypes.c_uint32 +enum_VGT_EVENT_TYPE: dict[int, str] = {(Reserved_0x00:=0): 'Reserved_0x00', (SAMPLE_STREAMOUTSTATS1:=1): 'SAMPLE_STREAMOUTSTATS1', (SAMPLE_STREAMOUTSTATS2:=2): 'SAMPLE_STREAMOUTSTATS2', (SAMPLE_STREAMOUTSTATS3:=3): 'SAMPLE_STREAMOUTSTATS3', (CACHE_FLUSH_TS:=4): 'CACHE_FLUSH_TS', (CONTEXT_DONE:=5): 'CONTEXT_DONE', (CACHE_FLUSH:=6): 'CACHE_FLUSH', (CS_PARTIAL_FLUSH:=7): 'CS_PARTIAL_FLUSH', (VGT_STREAMOUT_SYNC:=8): 'VGT_STREAMOUT_SYNC', (Reserved_0x09:=9): 'Reserved_0x09', (VGT_STREAMOUT_RESET:=10): 'VGT_STREAMOUT_RESET', (END_OF_PIPE_INCR_DE:=11): 'END_OF_PIPE_INCR_DE', (END_OF_PIPE_IB_END:=12): 'END_OF_PIPE_IB_END', (RST_PIX_CNT:=13): 'RST_PIX_CNT', (BREAK_BATCH:=14): 'BREAK_BATCH', (VS_PARTIAL_FLUSH:=15): 'VS_PARTIAL_FLUSH', (PS_PARTIAL_FLUSH:=16): 'PS_PARTIAL_FLUSH', (FLUSH_HS_OUTPUT:=17): 'FLUSH_HS_OUTPUT', (FLUSH_DFSM:=18): 'FLUSH_DFSM', (RESET_TO_LOWEST_VGT:=19): 'RESET_TO_LOWEST_VGT', (CACHE_FLUSH_AND_INV_TS_EVENT:=20): 'CACHE_FLUSH_AND_INV_TS_EVENT', (ZPASS_DONE:=21): 'ZPASS_DONE', (CACHE_FLUSH_AND_INV_EVENT:=22): 'CACHE_FLUSH_AND_INV_EVENT', (PERFCOUNTER_START:=23): 'PERFCOUNTER_START', (PERFCOUNTER_STOP:=24): 'PERFCOUNTER_STOP', (PIPELINESTAT_START:=25): 'PIPELINESTAT_START', (PIPELINESTAT_STOP:=26): 'PIPELINESTAT_STOP', (PERFCOUNTER_SAMPLE:=27): 'PERFCOUNTER_SAMPLE', (Available_0x1c:=28): 'Available_0x1c', (Available_0x1d:=29): 'Available_0x1d', (SAMPLE_PIPELINESTAT:=30): 'SAMPLE_PIPELINESTAT', (SO_VGTSTREAMOUT_FLUSH:=31): 'SO_VGTSTREAMOUT_FLUSH', (SAMPLE_STREAMOUTSTATS:=32): 'SAMPLE_STREAMOUTSTATS', (RESET_VTX_CNT:=33): 'RESET_VTX_CNT', (BLOCK_CONTEXT_DONE:=34): 'BLOCK_CONTEXT_DONE', (CS_CONTEXT_DONE:=35): 'CS_CONTEXT_DONE', (VGT_FLUSH:=36): 'VGT_FLUSH', (TGID_ROLLOVER:=37): 'TGID_ROLLOVER', (SQ_NON_EVENT:=38): 'SQ_NON_EVENT', (SC_SEND_DB_VPZ:=39): 'SC_SEND_DB_VPZ', (BOTTOM_OF_PIPE_TS:=40): 'BOTTOM_OF_PIPE_TS', (FLUSH_SX_TS:=41): 'FLUSH_SX_TS', (DB_CACHE_FLUSH_AND_INV:=42): 'DB_CACHE_FLUSH_AND_INV', (FLUSH_AND_INV_DB_DATA_TS:=43): 'FLUSH_AND_INV_DB_DATA_TS', (FLUSH_AND_INV_DB_META:=44): 'FLUSH_AND_INV_DB_META', (FLUSH_AND_INV_CB_DATA_TS:=45): 'FLUSH_AND_INV_CB_DATA_TS', (FLUSH_AND_INV_CB_META:=46): 'FLUSH_AND_INV_CB_META', (CS_DONE:=47): 'CS_DONE', (PS_DONE:=48): 'PS_DONE', (FLUSH_AND_INV_CB_PIXEL_DATA:=49): 'FLUSH_AND_INV_CB_PIXEL_DATA', (SX_CB_RAT_ACK_REQUEST:=50): 'SX_CB_RAT_ACK_REQUEST', (THREAD_TRACE_START:=51): 'THREAD_TRACE_START', (THREAD_TRACE_STOP:=52): 'THREAD_TRACE_STOP', (THREAD_TRACE_MARKER:=53): 'THREAD_TRACE_MARKER', (THREAD_TRACE_FLUSH:=54): 'THREAD_TRACE_FLUSH', (THREAD_TRACE_FINISH:=55): 'THREAD_TRACE_FINISH', (PIXEL_PIPE_STAT_CONTROL:=56): 'PIXEL_PIPE_STAT_CONTROL', (PIXEL_PIPE_STAT_DUMP:=57): 'PIXEL_PIPE_STAT_DUMP', (PIXEL_PIPE_STAT_RESET:=58): 'PIXEL_PIPE_STAT_RESET', (CONTEXT_SUSPEND:=59): 'CONTEXT_SUSPEND', (OFFCHIP_HS_DEALLOC:=60): 'OFFCHIP_HS_DEALLOC', (ENABLE_NGG_PIPELINE:=61): 'ENABLE_NGG_PIPELINE', (ENABLE_LEGACY_PIPELINE:=62): 'ENABLE_LEGACY_PIPELINE', (Reserved_0x3f:=63): 'Reserved_0x3f'} +VGT_EVENT_TYPE: TypeAlias = ctypes.c_uint32 diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/am/vega_offsets.py b/artifacts/package_runtime/tinygrad/runtime/autogen/am/vega_offsets.py new file mode 100644 index 000000000..673bff872 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/am/vega_offsets.py @@ -0,0 +1,774 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class struct_IP_BASE_INSTANCE(c.Struct): + SIZE = 24 + segment: c.Array[ctypes.c_uint32, Literal[6]] +struct_IP_BASE_INSTANCE.register_fields([('segment', c.Array[ctypes.c_uint32, Literal[6]], 0)]) +@c.record +class struct_IP_BASE(c.Struct): + SIZE = 144 + instance: c.Array[struct_IP_BASE_INSTANCE, Literal[6]] +struct_IP_BASE.register_fields([('instance', c.Array[struct_IP_BASE_INSTANCE, Literal[6]], 0)]) +MAX_INSTANCE = 6 +MAX_SEGMENT = 6 +ATHUB_BASE__INST0_SEG0 = 0x00000C20 +ATHUB_BASE__INST0_SEG1 = 0 +ATHUB_BASE__INST0_SEG2 = 0 +ATHUB_BASE__INST0_SEG3 = 0 +ATHUB_BASE__INST0_SEG4 = 0 +ATHUB_BASE__INST0_SEG5 = 0 +ATHUB_BASE__INST1_SEG0 = 0 +ATHUB_BASE__INST1_SEG1 = 0 +ATHUB_BASE__INST1_SEG2 = 0 +ATHUB_BASE__INST1_SEG3 = 0 +ATHUB_BASE__INST1_SEG4 = 0 +ATHUB_BASE__INST1_SEG5 = 0 +ATHUB_BASE__INST2_SEG0 = 0 +ATHUB_BASE__INST2_SEG1 = 0 +ATHUB_BASE__INST2_SEG2 = 0 +ATHUB_BASE__INST2_SEG3 = 0 +ATHUB_BASE__INST2_SEG4 = 0 +ATHUB_BASE__INST2_SEG5 = 0 +ATHUB_BASE__INST3_SEG0 = 0 +ATHUB_BASE__INST3_SEG1 = 0 +ATHUB_BASE__INST3_SEG2 = 0 +ATHUB_BASE__INST3_SEG3 = 0 +ATHUB_BASE__INST3_SEG4 = 0 +ATHUB_BASE__INST3_SEG5 = 0 +ATHUB_BASE__INST4_SEG0 = 0 +ATHUB_BASE__INST4_SEG1 = 0 +ATHUB_BASE__INST4_SEG2 = 0 +ATHUB_BASE__INST4_SEG3 = 0 +ATHUB_BASE__INST4_SEG4 = 0 +ATHUB_BASE__INST4_SEG5 = 0 +ATHUB_BASE__INST5_SEG0 = 0 +ATHUB_BASE__INST5_SEG1 = 0 +ATHUB_BASE__INST5_SEG2 = 0 +ATHUB_BASE__INST5_SEG3 = 0 +ATHUB_BASE__INST5_SEG4 = 0 +ATHUB_BASE__INST5_SEG5 = 0 +CLK_BASE__INST0_SEG0 = 0x00016C00 +CLK_BASE__INST0_SEG1 = 0x00016E00 +CLK_BASE__INST0_SEG2 = 0x00017000 +CLK_BASE__INST0_SEG3 = 0x00017200 +CLK_BASE__INST0_SEG4 = 0x0001B000 +CLK_BASE__INST0_SEG5 = 0x0001B200 +CLK_BASE__INST1_SEG0 = 0 +CLK_BASE__INST1_SEG1 = 0 +CLK_BASE__INST1_SEG2 = 0 +CLK_BASE__INST1_SEG3 = 0 +CLK_BASE__INST1_SEG4 = 0 +CLK_BASE__INST1_SEG5 = 0 +CLK_BASE__INST2_SEG0 = 0 +CLK_BASE__INST2_SEG1 = 0 +CLK_BASE__INST2_SEG2 = 0 +CLK_BASE__INST2_SEG3 = 0 +CLK_BASE__INST2_SEG4 = 0 +CLK_BASE__INST2_SEG5 = 0 +CLK_BASE__INST3_SEG0 = 0 +CLK_BASE__INST3_SEG1 = 0 +CLK_BASE__INST3_SEG2 = 0 +CLK_BASE__INST3_SEG3 = 0 +CLK_BASE__INST3_SEG4 = 0 +CLK_BASE__INST3_SEG5 = 0 +CLK_BASE__INST4_SEG0 = 0 +CLK_BASE__INST4_SEG1 = 0 +CLK_BASE__INST4_SEG2 = 0 +CLK_BASE__INST4_SEG3 = 0 +CLK_BASE__INST4_SEG4 = 0 +CLK_BASE__INST4_SEG5 = 0 +CLK_BASE__INST5_SEG0 = 0 +CLK_BASE__INST5_SEG1 = 0 +CLK_BASE__INST5_SEG2 = 0 +CLK_BASE__INST5_SEG3 = 0 +CLK_BASE__INST5_SEG4 = 0 +CLK_BASE__INST5_SEG5 = 0 +DCE_BASE__INST0_SEG0 = 0x00000012 +DCE_BASE__INST0_SEG1 = 0x000000C0 +DCE_BASE__INST0_SEG2 = 0x000034C0 +DCE_BASE__INST0_SEG3 = 0 +DCE_BASE__INST0_SEG4 = 0 +DCE_BASE__INST0_SEG5 = 0 +DCE_BASE__INST1_SEG0 = 0 +DCE_BASE__INST1_SEG1 = 0 +DCE_BASE__INST1_SEG2 = 0 +DCE_BASE__INST1_SEG3 = 0 +DCE_BASE__INST1_SEG4 = 0 +DCE_BASE__INST1_SEG5 = 0 +DCE_BASE__INST2_SEG0 = 0 +DCE_BASE__INST2_SEG1 = 0 +DCE_BASE__INST2_SEG2 = 0 +DCE_BASE__INST2_SEG3 = 0 +DCE_BASE__INST2_SEG4 = 0 +DCE_BASE__INST2_SEG5 = 0 +DCE_BASE__INST3_SEG0 = 0 +DCE_BASE__INST3_SEG1 = 0 +DCE_BASE__INST3_SEG2 = 0 +DCE_BASE__INST3_SEG3 = 0 +DCE_BASE__INST3_SEG4 = 0 +DCE_BASE__INST3_SEG5 = 0 +DCE_BASE__INST4_SEG0 = 0 +DCE_BASE__INST4_SEG1 = 0 +DCE_BASE__INST4_SEG2 = 0 +DCE_BASE__INST4_SEG3 = 0 +DCE_BASE__INST4_SEG4 = 0 +DCE_BASE__INST4_SEG5 = 0 +DCE_BASE__INST5_SEG0 = 0 +DCE_BASE__INST5_SEG1 = 0 +DCE_BASE__INST5_SEG2 = 0 +DCE_BASE__INST5_SEG3 = 0 +DCE_BASE__INST5_SEG4 = 0 +DCE_BASE__INST5_SEG5 = 0 +DF_BASE__INST0_SEG0 = 0x00007000 +DF_BASE__INST0_SEG1 = 0 +DF_BASE__INST0_SEG2 = 0 +DF_BASE__INST0_SEG3 = 0 +DF_BASE__INST0_SEG4 = 0 +DF_BASE__INST0_SEG5 = 0 +DF_BASE__INST1_SEG0 = 0 +DF_BASE__INST1_SEG1 = 0 +DF_BASE__INST1_SEG2 = 0 +DF_BASE__INST1_SEG3 = 0 +DF_BASE__INST1_SEG4 = 0 +DF_BASE__INST1_SEG5 = 0 +DF_BASE__INST2_SEG0 = 0 +DF_BASE__INST2_SEG1 = 0 +DF_BASE__INST2_SEG2 = 0 +DF_BASE__INST2_SEG3 = 0 +DF_BASE__INST2_SEG4 = 0 +DF_BASE__INST2_SEG5 = 0 +DF_BASE__INST3_SEG0 = 0 +DF_BASE__INST3_SEG1 = 0 +DF_BASE__INST3_SEG2 = 0 +DF_BASE__INST3_SEG3 = 0 +DF_BASE__INST3_SEG4 = 0 +DF_BASE__INST3_SEG5 = 0 +DF_BASE__INST4_SEG0 = 0 +DF_BASE__INST4_SEG1 = 0 +DF_BASE__INST4_SEG2 = 0 +DF_BASE__INST4_SEG3 = 0 +DF_BASE__INST4_SEG4 = 0 +DF_BASE__INST4_SEG5 = 0 +DF_BASE__INST5_SEG0 = 0 +DF_BASE__INST5_SEG1 = 0 +DF_BASE__INST5_SEG2 = 0 +DF_BASE__INST5_SEG3 = 0 +DF_BASE__INST5_SEG4 = 0 +DF_BASE__INST5_SEG5 = 0 +FUSE_BASE__INST0_SEG0 = 0x00017400 +FUSE_BASE__INST0_SEG1 = 0 +FUSE_BASE__INST0_SEG2 = 0 +FUSE_BASE__INST0_SEG3 = 0 +FUSE_BASE__INST0_SEG4 = 0 +FUSE_BASE__INST0_SEG5 = 0 +FUSE_BASE__INST1_SEG0 = 0 +FUSE_BASE__INST1_SEG1 = 0 +FUSE_BASE__INST1_SEG2 = 0 +FUSE_BASE__INST1_SEG3 = 0 +FUSE_BASE__INST1_SEG4 = 0 +FUSE_BASE__INST1_SEG5 = 0 +FUSE_BASE__INST2_SEG0 = 0 +FUSE_BASE__INST2_SEG1 = 0 +FUSE_BASE__INST2_SEG2 = 0 +FUSE_BASE__INST2_SEG3 = 0 +FUSE_BASE__INST2_SEG4 = 0 +FUSE_BASE__INST2_SEG5 = 0 +FUSE_BASE__INST3_SEG0 = 0 +FUSE_BASE__INST3_SEG1 = 0 +FUSE_BASE__INST3_SEG2 = 0 +FUSE_BASE__INST3_SEG3 = 0 +FUSE_BASE__INST3_SEG4 = 0 +FUSE_BASE__INST3_SEG5 = 0 +FUSE_BASE__INST4_SEG0 = 0 +FUSE_BASE__INST4_SEG1 = 0 +FUSE_BASE__INST4_SEG2 = 0 +FUSE_BASE__INST4_SEG3 = 0 +FUSE_BASE__INST4_SEG4 = 0 +FUSE_BASE__INST4_SEG5 = 0 +FUSE_BASE__INST5_SEG0 = 0 +FUSE_BASE__INST5_SEG1 = 0 +FUSE_BASE__INST5_SEG2 = 0 +FUSE_BASE__INST5_SEG3 = 0 +FUSE_BASE__INST5_SEG4 = 0 +FUSE_BASE__INST5_SEG5 = 0 +GC_BASE__INST0_SEG0 = 0x00002000 +GC_BASE__INST0_SEG1 = 0x0000A000 +GC_BASE__INST0_SEG2 = 0 +GC_BASE__INST0_SEG3 = 0 +GC_BASE__INST0_SEG4 = 0 +GC_BASE__INST0_SEG5 = 0 +GC_BASE__INST1_SEG0 = 0 +GC_BASE__INST1_SEG1 = 0 +GC_BASE__INST1_SEG2 = 0 +GC_BASE__INST1_SEG3 = 0 +GC_BASE__INST1_SEG4 = 0 +GC_BASE__INST1_SEG5 = 0 +GC_BASE__INST2_SEG0 = 0 +GC_BASE__INST2_SEG1 = 0 +GC_BASE__INST2_SEG2 = 0 +GC_BASE__INST2_SEG3 = 0 +GC_BASE__INST2_SEG4 = 0 +GC_BASE__INST2_SEG5 = 0 +GC_BASE__INST3_SEG0 = 0 +GC_BASE__INST3_SEG1 = 0 +GC_BASE__INST3_SEG2 = 0 +GC_BASE__INST3_SEG3 = 0 +GC_BASE__INST3_SEG4 = 0 +GC_BASE__INST3_SEG5 = 0 +GC_BASE__INST4_SEG0 = 0 +GC_BASE__INST4_SEG1 = 0 +GC_BASE__INST4_SEG2 = 0 +GC_BASE__INST4_SEG3 = 0 +GC_BASE__INST4_SEG4 = 0 +GC_BASE__INST4_SEG5 = 0 +GC_BASE__INST5_SEG0 = 0 +GC_BASE__INST5_SEG1 = 0 +GC_BASE__INST5_SEG2 = 0 +GC_BASE__INST5_SEG3 = 0 +GC_BASE__INST5_SEG4 = 0 +GC_BASE__INST5_SEG5 = 0 +HDP_BASE__INST0_SEG0 = 0x00000F20 +HDP_BASE__INST0_SEG1 = 0 +HDP_BASE__INST0_SEG2 = 0 +HDP_BASE__INST0_SEG3 = 0 +HDP_BASE__INST0_SEG4 = 0 +HDP_BASE__INST0_SEG5 = 0 +HDP_BASE__INST1_SEG0 = 0 +HDP_BASE__INST1_SEG1 = 0 +HDP_BASE__INST1_SEG2 = 0 +HDP_BASE__INST1_SEG3 = 0 +HDP_BASE__INST1_SEG4 = 0 +HDP_BASE__INST1_SEG5 = 0 +HDP_BASE__INST2_SEG0 = 0 +HDP_BASE__INST2_SEG1 = 0 +HDP_BASE__INST2_SEG2 = 0 +HDP_BASE__INST2_SEG3 = 0 +HDP_BASE__INST2_SEG4 = 0 +HDP_BASE__INST2_SEG5 = 0 +HDP_BASE__INST3_SEG0 = 0 +HDP_BASE__INST3_SEG1 = 0 +HDP_BASE__INST3_SEG2 = 0 +HDP_BASE__INST3_SEG3 = 0 +HDP_BASE__INST3_SEG4 = 0 +HDP_BASE__INST3_SEG5 = 0 +HDP_BASE__INST4_SEG0 = 0 +HDP_BASE__INST4_SEG1 = 0 +HDP_BASE__INST4_SEG2 = 0 +HDP_BASE__INST4_SEG3 = 0 +HDP_BASE__INST4_SEG4 = 0 +HDP_BASE__INST4_SEG5 = 0 +HDP_BASE__INST5_SEG0 = 0 +HDP_BASE__INST5_SEG1 = 0 +HDP_BASE__INST5_SEG2 = 0 +HDP_BASE__INST5_SEG3 = 0 +HDP_BASE__INST5_SEG4 = 0 +HDP_BASE__INST5_SEG5 = 0 +MMHUB_BASE__INST0_SEG0 = 0x0001A000 +MMHUB_BASE__INST0_SEG1 = 0 +MMHUB_BASE__INST0_SEG2 = 0 +MMHUB_BASE__INST0_SEG3 = 0 +MMHUB_BASE__INST0_SEG4 = 0 +MMHUB_BASE__INST0_SEG5 = 0 +MMHUB_BASE__INST1_SEG0 = 0 +MMHUB_BASE__INST1_SEG1 = 0 +MMHUB_BASE__INST1_SEG2 = 0 +MMHUB_BASE__INST1_SEG3 = 0 +MMHUB_BASE__INST1_SEG4 = 0 +MMHUB_BASE__INST1_SEG5 = 0 +MMHUB_BASE__INST2_SEG0 = 0 +MMHUB_BASE__INST2_SEG1 = 0 +MMHUB_BASE__INST2_SEG2 = 0 +MMHUB_BASE__INST2_SEG3 = 0 +MMHUB_BASE__INST2_SEG4 = 0 +MMHUB_BASE__INST2_SEG5 = 0 +MMHUB_BASE__INST3_SEG0 = 0 +MMHUB_BASE__INST3_SEG1 = 0 +MMHUB_BASE__INST3_SEG2 = 0 +MMHUB_BASE__INST3_SEG3 = 0 +MMHUB_BASE__INST3_SEG4 = 0 +MMHUB_BASE__INST3_SEG5 = 0 +MMHUB_BASE__INST4_SEG0 = 0 +MMHUB_BASE__INST4_SEG1 = 0 +MMHUB_BASE__INST4_SEG2 = 0 +MMHUB_BASE__INST4_SEG3 = 0 +MMHUB_BASE__INST4_SEG4 = 0 +MMHUB_BASE__INST4_SEG5 = 0 +MMHUB_BASE__INST5_SEG0 = 0 +MMHUB_BASE__INST5_SEG1 = 0 +MMHUB_BASE__INST5_SEG2 = 0 +MMHUB_BASE__INST5_SEG3 = 0 +MMHUB_BASE__INST5_SEG4 = 0 +MMHUB_BASE__INST5_SEG5 = 0 +MP0_BASE__INST0_SEG0 = 0x00016000 +MP0_BASE__INST0_SEG1 = 0 +MP0_BASE__INST0_SEG2 = 0 +MP0_BASE__INST0_SEG3 = 0 +MP0_BASE__INST0_SEG4 = 0 +MP0_BASE__INST0_SEG5 = 0 +MP0_BASE__INST1_SEG0 = 0 +MP0_BASE__INST1_SEG1 = 0 +MP0_BASE__INST1_SEG2 = 0 +MP0_BASE__INST1_SEG3 = 0 +MP0_BASE__INST1_SEG4 = 0 +MP0_BASE__INST1_SEG5 = 0 +MP0_BASE__INST2_SEG0 = 0 +MP0_BASE__INST2_SEG1 = 0 +MP0_BASE__INST2_SEG2 = 0 +MP0_BASE__INST2_SEG3 = 0 +MP0_BASE__INST2_SEG4 = 0 +MP0_BASE__INST2_SEG5 = 0 +MP0_BASE__INST3_SEG0 = 0 +MP0_BASE__INST3_SEG1 = 0 +MP0_BASE__INST3_SEG2 = 0 +MP0_BASE__INST3_SEG3 = 0 +MP0_BASE__INST3_SEG4 = 0 +MP0_BASE__INST3_SEG5 = 0 +MP0_BASE__INST4_SEG0 = 0 +MP0_BASE__INST4_SEG1 = 0 +MP0_BASE__INST4_SEG2 = 0 +MP0_BASE__INST4_SEG3 = 0 +MP0_BASE__INST4_SEG4 = 0 +MP0_BASE__INST4_SEG5 = 0 +MP0_BASE__INST5_SEG0 = 0 +MP0_BASE__INST5_SEG1 = 0 +MP0_BASE__INST5_SEG2 = 0 +MP0_BASE__INST5_SEG3 = 0 +MP0_BASE__INST5_SEG4 = 0 +MP0_BASE__INST5_SEG5 = 0 +MP1_BASE__INST0_SEG0 = 0x00016000 +MP1_BASE__INST0_SEG1 = 0 +MP1_BASE__INST0_SEG2 = 0 +MP1_BASE__INST0_SEG3 = 0 +MP1_BASE__INST0_SEG4 = 0 +MP1_BASE__INST0_SEG5 = 0 +MP1_BASE__INST1_SEG0 = 0 +MP1_BASE__INST1_SEG1 = 0 +MP1_BASE__INST1_SEG2 = 0 +MP1_BASE__INST1_SEG3 = 0 +MP1_BASE__INST1_SEG4 = 0 +MP1_BASE__INST1_SEG5 = 0 +MP1_BASE__INST2_SEG0 = 0 +MP1_BASE__INST2_SEG1 = 0 +MP1_BASE__INST2_SEG2 = 0 +MP1_BASE__INST2_SEG3 = 0 +MP1_BASE__INST2_SEG4 = 0 +MP1_BASE__INST2_SEG5 = 0 +MP1_BASE__INST3_SEG0 = 0 +MP1_BASE__INST3_SEG1 = 0 +MP1_BASE__INST3_SEG2 = 0 +MP1_BASE__INST3_SEG3 = 0 +MP1_BASE__INST3_SEG4 = 0 +MP1_BASE__INST3_SEG5 = 0 +MP1_BASE__INST4_SEG0 = 0 +MP1_BASE__INST4_SEG1 = 0 +MP1_BASE__INST4_SEG2 = 0 +MP1_BASE__INST4_SEG3 = 0 +MP1_BASE__INST4_SEG4 = 0 +MP1_BASE__INST4_SEG5 = 0 +MP1_BASE__INST5_SEG0 = 0 +MP1_BASE__INST5_SEG1 = 0 +MP1_BASE__INST5_SEG2 = 0 +MP1_BASE__INST5_SEG3 = 0 +MP1_BASE__INST5_SEG4 = 0 +MP1_BASE__INST5_SEG5 = 0 +NBIO_BASE__INST0_SEG0 = 0x00000000 +NBIO_BASE__INST0_SEG1 = 0x00000014 +NBIO_BASE__INST0_SEG2 = 0x00000D20 +NBIO_BASE__INST0_SEG3 = 0x00010400 +NBIO_BASE__INST0_SEG4 = 0 +NBIO_BASE__INST0_SEG5 = 0 +NBIO_BASE__INST1_SEG0 = 0 +NBIO_BASE__INST1_SEG1 = 0 +NBIO_BASE__INST1_SEG2 = 0 +NBIO_BASE__INST1_SEG3 = 0 +NBIO_BASE__INST1_SEG4 = 0 +NBIO_BASE__INST1_SEG5 = 0 +NBIO_BASE__INST2_SEG0 = 0 +NBIO_BASE__INST2_SEG1 = 0 +NBIO_BASE__INST2_SEG2 = 0 +NBIO_BASE__INST2_SEG3 = 0 +NBIO_BASE__INST2_SEG4 = 0 +NBIO_BASE__INST2_SEG5 = 0 +NBIO_BASE__INST3_SEG0 = 0 +NBIO_BASE__INST3_SEG1 = 0 +NBIO_BASE__INST3_SEG2 = 0 +NBIO_BASE__INST3_SEG3 = 0 +NBIO_BASE__INST3_SEG4 = 0 +NBIO_BASE__INST3_SEG5 = 0 +NBIO_BASE__INST4_SEG0 = 0 +NBIO_BASE__INST4_SEG1 = 0 +NBIO_BASE__INST4_SEG2 = 0 +NBIO_BASE__INST4_SEG3 = 0 +NBIO_BASE__INST4_SEG4 = 0 +NBIO_BASE__INST4_SEG5 = 0 +NBIO_BASE__INST5_SEG0 = 0 +NBIO_BASE__INST5_SEG1 = 0 +NBIO_BASE__INST5_SEG2 = 0 +NBIO_BASE__INST5_SEG3 = 0 +NBIO_BASE__INST5_SEG4 = 0 +NBIO_BASE__INST5_SEG5 = 0 +OSSSYS_BASE__INST0_SEG0 = 0x000010A0 +OSSSYS_BASE__INST0_SEG1 = 0 +OSSSYS_BASE__INST0_SEG2 = 0 +OSSSYS_BASE__INST0_SEG3 = 0 +OSSSYS_BASE__INST0_SEG4 = 0 +OSSSYS_BASE__INST0_SEG5 = 0 +OSSSYS_BASE__INST1_SEG0 = 0 +OSSSYS_BASE__INST1_SEG1 = 0 +OSSSYS_BASE__INST1_SEG2 = 0 +OSSSYS_BASE__INST1_SEG3 = 0 +OSSSYS_BASE__INST1_SEG4 = 0 +OSSSYS_BASE__INST1_SEG5 = 0 +OSSSYS_BASE__INST2_SEG0 = 0 +OSSSYS_BASE__INST2_SEG1 = 0 +OSSSYS_BASE__INST2_SEG2 = 0 +OSSSYS_BASE__INST2_SEG3 = 0 +OSSSYS_BASE__INST2_SEG4 = 0 +OSSSYS_BASE__INST2_SEG5 = 0 +OSSSYS_BASE__INST3_SEG0 = 0 +OSSSYS_BASE__INST3_SEG1 = 0 +OSSSYS_BASE__INST3_SEG2 = 0 +OSSSYS_BASE__INST3_SEG3 = 0 +OSSSYS_BASE__INST3_SEG4 = 0 +OSSSYS_BASE__INST3_SEG5 = 0 +OSSSYS_BASE__INST4_SEG0 = 0 +OSSSYS_BASE__INST4_SEG1 = 0 +OSSSYS_BASE__INST4_SEG2 = 0 +OSSSYS_BASE__INST4_SEG3 = 0 +OSSSYS_BASE__INST4_SEG4 = 0 +OSSSYS_BASE__INST4_SEG5 = 0 +OSSSYS_BASE__INST5_SEG0 = 0 +OSSSYS_BASE__INST5_SEG1 = 0 +OSSSYS_BASE__INST5_SEG2 = 0 +OSSSYS_BASE__INST5_SEG3 = 0 +OSSSYS_BASE__INST5_SEG4 = 0 +OSSSYS_BASE__INST5_SEG5 = 0 +SDMA0_BASE__INST0_SEG0 = 0x00001260 +SDMA0_BASE__INST0_SEG1 = 0 +SDMA0_BASE__INST0_SEG2 = 0 +SDMA0_BASE__INST0_SEG3 = 0 +SDMA0_BASE__INST0_SEG4 = 0 +SDMA0_BASE__INST0_SEG5 = 0 +SDMA0_BASE__INST1_SEG0 = 0 +SDMA0_BASE__INST1_SEG1 = 0 +SDMA0_BASE__INST1_SEG2 = 0 +SDMA0_BASE__INST1_SEG3 = 0 +SDMA0_BASE__INST1_SEG4 = 0 +SDMA0_BASE__INST1_SEG5 = 0 +SDMA0_BASE__INST2_SEG0 = 0 +SDMA0_BASE__INST2_SEG1 = 0 +SDMA0_BASE__INST2_SEG2 = 0 +SDMA0_BASE__INST2_SEG3 = 0 +SDMA0_BASE__INST2_SEG4 = 0 +SDMA0_BASE__INST2_SEG5 = 0 +SDMA0_BASE__INST3_SEG0 = 0 +SDMA0_BASE__INST3_SEG1 = 0 +SDMA0_BASE__INST3_SEG2 = 0 +SDMA0_BASE__INST3_SEG3 = 0 +SDMA0_BASE__INST3_SEG4 = 0 +SDMA0_BASE__INST3_SEG5 = 0 +SDMA0_BASE__INST4_SEG0 = 0 +SDMA0_BASE__INST4_SEG1 = 0 +SDMA0_BASE__INST4_SEG2 = 0 +SDMA0_BASE__INST4_SEG3 = 0 +SDMA0_BASE__INST4_SEG4 = 0 +SDMA0_BASE__INST4_SEG5 = 0 +SDMA0_BASE__INST5_SEG0 = 0 +SDMA0_BASE__INST5_SEG1 = 0 +SDMA0_BASE__INST5_SEG2 = 0 +SDMA0_BASE__INST5_SEG3 = 0 +SDMA0_BASE__INST5_SEG4 = 0 +SDMA0_BASE__INST5_SEG5 = 0 +SDMA1_BASE__INST0_SEG0 = 0x00001860 +SDMA1_BASE__INST0_SEG1 = 0 +SDMA1_BASE__INST0_SEG2 = 0 +SDMA1_BASE__INST0_SEG3 = 0 +SDMA1_BASE__INST0_SEG4 = 0 +SDMA1_BASE__INST0_SEG5 = 0 +SDMA1_BASE__INST1_SEG0 = 0 +SDMA1_BASE__INST1_SEG1 = 0 +SDMA1_BASE__INST1_SEG2 = 0 +SDMA1_BASE__INST1_SEG3 = 0 +SDMA1_BASE__INST1_SEG4 = 0 +SDMA1_BASE__INST1_SEG5 = 0 +SDMA1_BASE__INST2_SEG0 = 0 +SDMA1_BASE__INST2_SEG1 = 0 +SDMA1_BASE__INST2_SEG2 = 0 +SDMA1_BASE__INST2_SEG3 = 0 +SDMA1_BASE__INST2_SEG4 = 0 +SDMA1_BASE__INST2_SEG5 = 0 +SDMA1_BASE__INST3_SEG0 = 0 +SDMA1_BASE__INST3_SEG1 = 0 +SDMA1_BASE__INST3_SEG2 = 0 +SDMA1_BASE__INST3_SEG3 = 0 +SDMA1_BASE__INST3_SEG4 = 0 +SDMA1_BASE__INST3_SEG5 = 0 +SDMA1_BASE__INST4_SEG0 = 0 +SDMA1_BASE__INST4_SEG1 = 0 +SDMA1_BASE__INST4_SEG2 = 0 +SDMA1_BASE__INST4_SEG3 = 0 +SDMA1_BASE__INST4_SEG4 = 0 +SDMA1_BASE__INST4_SEG5 = 0 +SDMA1_BASE__INST5_SEG0 = 0 +SDMA1_BASE__INST5_SEG1 = 0 +SDMA1_BASE__INST5_SEG2 = 0 +SDMA1_BASE__INST5_SEG3 = 0 +SDMA1_BASE__INST5_SEG4 = 0 +SDMA1_BASE__INST5_SEG5 = 0 +SMUIO_BASE__INST0_SEG0 = 0x00016800 +SMUIO_BASE__INST0_SEG1 = 0x00016A00 +SMUIO_BASE__INST0_SEG2 = 0 +SMUIO_BASE__INST0_SEG3 = 0 +SMUIO_BASE__INST0_SEG4 = 0 +SMUIO_BASE__INST0_SEG5 = 0 +SMUIO_BASE__INST1_SEG0 = 0 +SMUIO_BASE__INST1_SEG1 = 0 +SMUIO_BASE__INST1_SEG2 = 0 +SMUIO_BASE__INST1_SEG3 = 0 +SMUIO_BASE__INST1_SEG4 = 0 +SMUIO_BASE__INST1_SEG5 = 0 +SMUIO_BASE__INST2_SEG0 = 0 +SMUIO_BASE__INST2_SEG1 = 0 +SMUIO_BASE__INST2_SEG2 = 0 +SMUIO_BASE__INST2_SEG3 = 0 +SMUIO_BASE__INST2_SEG4 = 0 +SMUIO_BASE__INST2_SEG5 = 0 +SMUIO_BASE__INST3_SEG0 = 0 +SMUIO_BASE__INST3_SEG1 = 0 +SMUIO_BASE__INST3_SEG2 = 0 +SMUIO_BASE__INST3_SEG3 = 0 +SMUIO_BASE__INST3_SEG4 = 0 +SMUIO_BASE__INST3_SEG5 = 0 +SMUIO_BASE__INST4_SEG0 = 0 +SMUIO_BASE__INST4_SEG1 = 0 +SMUIO_BASE__INST4_SEG2 = 0 +SMUIO_BASE__INST4_SEG3 = 0 +SMUIO_BASE__INST4_SEG4 = 0 +SMUIO_BASE__INST4_SEG5 = 0 +SMUIO_BASE__INST5_SEG0 = 0 +SMUIO_BASE__INST5_SEG1 = 0 +SMUIO_BASE__INST5_SEG2 = 0 +SMUIO_BASE__INST5_SEG3 = 0 +SMUIO_BASE__INST5_SEG4 = 0 +SMUIO_BASE__INST5_SEG5 = 0 +THM_BASE__INST0_SEG0 = 0x00016600 +THM_BASE__INST0_SEG1 = 0 +THM_BASE__INST0_SEG2 = 0 +THM_BASE__INST0_SEG3 = 0 +THM_BASE__INST0_SEG4 = 0 +THM_BASE__INST0_SEG5 = 0 +THM_BASE__INST1_SEG0 = 0 +THM_BASE__INST1_SEG1 = 0 +THM_BASE__INST1_SEG2 = 0 +THM_BASE__INST1_SEG3 = 0 +THM_BASE__INST1_SEG4 = 0 +THM_BASE__INST1_SEG5 = 0 +THM_BASE__INST2_SEG0 = 0 +THM_BASE__INST2_SEG1 = 0 +THM_BASE__INST2_SEG2 = 0 +THM_BASE__INST2_SEG3 = 0 +THM_BASE__INST2_SEG4 = 0 +THM_BASE__INST2_SEG5 = 0 +THM_BASE__INST3_SEG0 = 0 +THM_BASE__INST3_SEG1 = 0 +THM_BASE__INST3_SEG2 = 0 +THM_BASE__INST3_SEG3 = 0 +THM_BASE__INST3_SEG4 = 0 +THM_BASE__INST3_SEG5 = 0 +THM_BASE__INST4_SEG0 = 0 +THM_BASE__INST4_SEG1 = 0 +THM_BASE__INST4_SEG2 = 0 +THM_BASE__INST4_SEG3 = 0 +THM_BASE__INST4_SEG4 = 0 +THM_BASE__INST4_SEG5 = 0 +THM_BASE__INST5_SEG0 = 0 +THM_BASE__INST5_SEG1 = 0 +THM_BASE__INST5_SEG2 = 0 +THM_BASE__INST5_SEG3 = 0 +THM_BASE__INST5_SEG4 = 0 +THM_BASE__INST5_SEG5 = 0 +UMC_BASE__INST0_SEG0 = 0x00014000 +UMC_BASE__INST0_SEG1 = 0 +UMC_BASE__INST0_SEG2 = 0 +UMC_BASE__INST0_SEG3 = 0 +UMC_BASE__INST0_SEG4 = 0 +UMC_BASE__INST0_SEG5 = 0 +UMC_BASE__INST1_SEG0 = 0 +UMC_BASE__INST1_SEG1 = 0 +UMC_BASE__INST1_SEG2 = 0 +UMC_BASE__INST1_SEG3 = 0 +UMC_BASE__INST1_SEG4 = 0 +UMC_BASE__INST1_SEG5 = 0 +UMC_BASE__INST2_SEG0 = 0 +UMC_BASE__INST2_SEG1 = 0 +UMC_BASE__INST2_SEG2 = 0 +UMC_BASE__INST2_SEG3 = 0 +UMC_BASE__INST2_SEG4 = 0 +UMC_BASE__INST2_SEG5 = 0 +UMC_BASE__INST3_SEG0 = 0 +UMC_BASE__INST3_SEG1 = 0 +UMC_BASE__INST3_SEG2 = 0 +UMC_BASE__INST3_SEG3 = 0 +UMC_BASE__INST3_SEG4 = 0 +UMC_BASE__INST3_SEG5 = 0 +UMC_BASE__INST4_SEG0 = 0 +UMC_BASE__INST4_SEG1 = 0 +UMC_BASE__INST4_SEG2 = 0 +UMC_BASE__INST4_SEG3 = 0 +UMC_BASE__INST4_SEG4 = 0 +UMC_BASE__INST4_SEG5 = 0 +UMC_BASE__INST5_SEG0 = 0 +UMC_BASE__INST5_SEG1 = 0 +UMC_BASE__INST5_SEG2 = 0 +UMC_BASE__INST5_SEG3 = 0 +UMC_BASE__INST5_SEG4 = 0 +UMC_BASE__INST5_SEG5 = 0 +UVD_BASE__INST0_SEG0 = 0x00007800 +UVD_BASE__INST0_SEG1 = 0x00007E00 +UVD_BASE__INST0_SEG2 = 0 +UVD_BASE__INST0_SEG3 = 0 +UVD_BASE__INST0_SEG4 = 0 +UVD_BASE__INST0_SEG5 = 0 +UVD_BASE__INST1_SEG0 = 0 +UVD_BASE__INST1_SEG1 = 0x00009000 +UVD_BASE__INST1_SEG2 = 0 +UVD_BASE__INST1_SEG3 = 0 +UVD_BASE__INST1_SEG4 = 0 +UVD_BASE__INST1_SEG5 = 0 +UVD_BASE__INST2_SEG0 = 0 +UVD_BASE__INST2_SEG1 = 0 +UVD_BASE__INST2_SEG2 = 0 +UVD_BASE__INST2_SEG3 = 0 +UVD_BASE__INST2_SEG4 = 0 +UVD_BASE__INST2_SEG5 = 0 +UVD_BASE__INST3_SEG0 = 0 +UVD_BASE__INST3_SEG1 = 0 +UVD_BASE__INST3_SEG2 = 0 +UVD_BASE__INST3_SEG3 = 0 +UVD_BASE__INST3_SEG4 = 0 +UVD_BASE__INST3_SEG5 = 0 +UVD_BASE__INST4_SEG0 = 0 +UVD_BASE__INST4_SEG1 = 0 +UVD_BASE__INST4_SEG2 = 0 +UVD_BASE__INST4_SEG3 = 0 +UVD_BASE__INST4_SEG4 = 0 +UVD_BASE__INST4_SEG5 = 0 +UVD_BASE__INST5_SEG0 = 0 +UVD_BASE__INST5_SEG1 = 0 +UVD_BASE__INST5_SEG2 = 0 +UVD_BASE__INST5_SEG3 = 0 +UVD_BASE__INST5_SEG4 = 0 +UVD_BASE__INST5_SEG5 = 0 +VCE_BASE__INST0_SEG0 = 0x00008800 +VCE_BASE__INST0_SEG1 = 0 +VCE_BASE__INST0_SEG2 = 0 +VCE_BASE__INST0_SEG3 = 0 +VCE_BASE__INST0_SEG4 = 0 +VCE_BASE__INST0_SEG5 = 0 +VCE_BASE__INST1_SEG0 = 0 +VCE_BASE__INST1_SEG1 = 0 +VCE_BASE__INST1_SEG2 = 0 +VCE_BASE__INST1_SEG3 = 0 +VCE_BASE__INST1_SEG4 = 0 +VCE_BASE__INST1_SEG5 = 0 +VCE_BASE__INST2_SEG0 = 0 +VCE_BASE__INST2_SEG1 = 0 +VCE_BASE__INST2_SEG2 = 0 +VCE_BASE__INST2_SEG3 = 0 +VCE_BASE__INST2_SEG4 = 0 +VCE_BASE__INST2_SEG5 = 0 +VCE_BASE__INST3_SEG0 = 0 +VCE_BASE__INST3_SEG1 = 0 +VCE_BASE__INST3_SEG2 = 0 +VCE_BASE__INST3_SEG3 = 0 +VCE_BASE__INST3_SEG4 = 0 +VCE_BASE__INST3_SEG5 = 0 +VCE_BASE__INST4_SEG0 = 0 +VCE_BASE__INST4_SEG1 = 0 +VCE_BASE__INST4_SEG2 = 0 +VCE_BASE__INST4_SEG3 = 0 +VCE_BASE__INST4_SEG4 = 0 +VCE_BASE__INST4_SEG5 = 0 +VCE_BASE__INST5_SEG0 = 0 +VCE_BASE__INST5_SEG1 = 0 +VCE_BASE__INST5_SEG2 = 0 +VCE_BASE__INST5_SEG3 = 0 +VCE_BASE__INST5_SEG4 = 0 +VCE_BASE__INST5_SEG5 = 0 +XDMA_BASE__INST0_SEG0 = 0x00003400 +XDMA_BASE__INST0_SEG1 = 0 +XDMA_BASE__INST0_SEG2 = 0 +XDMA_BASE__INST0_SEG3 = 0 +XDMA_BASE__INST0_SEG4 = 0 +XDMA_BASE__INST0_SEG5 = 0 +XDMA_BASE__INST1_SEG0 = 0 +XDMA_BASE__INST1_SEG1 = 0 +XDMA_BASE__INST1_SEG2 = 0 +XDMA_BASE__INST1_SEG3 = 0 +XDMA_BASE__INST1_SEG4 = 0 +XDMA_BASE__INST1_SEG5 = 0 +XDMA_BASE__INST2_SEG0 = 0 +XDMA_BASE__INST2_SEG1 = 0 +XDMA_BASE__INST2_SEG2 = 0 +XDMA_BASE__INST2_SEG3 = 0 +XDMA_BASE__INST2_SEG4 = 0 +XDMA_BASE__INST2_SEG5 = 0 +XDMA_BASE__INST3_SEG0 = 0 +XDMA_BASE__INST3_SEG1 = 0 +XDMA_BASE__INST3_SEG2 = 0 +XDMA_BASE__INST3_SEG3 = 0 +XDMA_BASE__INST3_SEG4 = 0 +XDMA_BASE__INST3_SEG5 = 0 +XDMA_BASE__INST4_SEG0 = 0 +XDMA_BASE__INST4_SEG1 = 0 +XDMA_BASE__INST4_SEG2 = 0 +XDMA_BASE__INST4_SEG3 = 0 +XDMA_BASE__INST4_SEG4 = 0 +XDMA_BASE__INST4_SEG5 = 0 +XDMA_BASE__INST5_SEG0 = 0 +XDMA_BASE__INST5_SEG1 = 0 +XDMA_BASE__INST5_SEG2 = 0 +XDMA_BASE__INST5_SEG3 = 0 +XDMA_BASE__INST5_SEG4 = 0 +XDMA_BASE__INST5_SEG5 = 0 +RSMU_BASE__INST0_SEG0 = 0x00012000 +RSMU_BASE__INST0_SEG1 = 0 +RSMU_BASE__INST0_SEG2 = 0 +RSMU_BASE__INST0_SEG3 = 0 +RSMU_BASE__INST0_SEG4 = 0 +RSMU_BASE__INST0_SEG5 = 0 +RSMU_BASE__INST1_SEG0 = 0 +RSMU_BASE__INST1_SEG1 = 0 +RSMU_BASE__INST1_SEG2 = 0 +RSMU_BASE__INST1_SEG3 = 0 +RSMU_BASE__INST1_SEG4 = 0 +RSMU_BASE__INST1_SEG5 = 0 +RSMU_BASE__INST2_SEG0 = 0 +RSMU_BASE__INST2_SEG1 = 0 +RSMU_BASE__INST2_SEG2 = 0 +RSMU_BASE__INST2_SEG3 = 0 +RSMU_BASE__INST2_SEG4 = 0 +RSMU_BASE__INST2_SEG5 = 0 +RSMU_BASE__INST3_SEG0 = 0 +RSMU_BASE__INST3_SEG1 = 0 +RSMU_BASE__INST3_SEG2 = 0 +RSMU_BASE__INST3_SEG3 = 0 +RSMU_BASE__INST3_SEG4 = 0 +RSMU_BASE__INST3_SEG5 = 0 +RSMU_BASE__INST4_SEG0 = 0 +RSMU_BASE__INST4_SEG1 = 0 +RSMU_BASE__INST4_SEG2 = 0 +RSMU_BASE__INST4_SEG3 = 0 +RSMU_BASE__INST4_SEG4 = 0 +RSMU_BASE__INST4_SEG5 = 0 +RSMU_BASE__INST5_SEG0 = 0 +RSMU_BASE__INST5_SEG1 = 0 +RSMU_BASE__INST5_SEG2 = 0 +RSMU_BASE__INST5_SEG3 = 0 +RSMU_BASE__INST5_SEG4 = 0 +RSMU_BASE__INST5_SEG5 = 0 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/__init__.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/__init__.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/enum.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/enum.py new file mode 100644 index 000000000..64eb59e1c --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/enum.py @@ -0,0 +1,2402 @@ +# autogenerated from AMD ISA XML - do not edit +from tinygrad.runtime.autogen.amd.common import ReprEnum, Fmt, FMT_BITS, OpType # noqa: F401 + +class DSOp(ReprEnum): + DS_ADD_U32 = 0 + DS_SUB_U32 = 1 + DS_RSUB_U32 = 2 + DS_INC_U32 = 3 + DS_DEC_U32 = 4 + DS_MIN_I32 = 5 + DS_MAX_I32 = 6 + DS_MIN_U32 = 7 + DS_MAX_U32 = 8 + DS_AND_B32 = 9 + DS_OR_B32 = 10 + DS_XOR_B32 = 11 + DS_MSKOR_B32 = 12 + DS_WRITE_B32 = 13 + DS_WRITE2_B32 = 14 + DS_WRITE2ST64_B32 = 15 + DS_CMPST_B32 = 16 + DS_CMPST_F32 = 17 + DS_MIN_F32 = 18 + DS_MAX_F32 = 19 + DS_NOP = 20 + DS_ADD_F32 = 21 + DS_PK_ADD_F16 = 23 + DS_PK_ADD_BF16 = 24 + DS_WRITE_ADDTID_B32 = 29 + DS_WRITE_B8 = 30 + DS_WRITE_B16 = 31 + DS_ADD_RTN_U32 = 32 + DS_SUB_RTN_U32 = 33 + DS_RSUB_RTN_U32 = 34 + DS_INC_RTN_U32 = 35 + DS_DEC_RTN_U32 = 36 + DS_MIN_RTN_I32 = 37 + DS_MAX_RTN_I32 = 38 + DS_MIN_RTN_U32 = 39 + DS_MAX_RTN_U32 = 40 + DS_AND_RTN_B32 = 41 + DS_OR_RTN_B32 = 42 + DS_XOR_RTN_B32 = 43 + DS_MSKOR_RTN_B32 = 44 + DS_WRXCHG_RTN_B32 = 45 + DS_WRXCHG2_RTN_B32 = 46 + DS_WRXCHG2ST64_RTN_B32 = 47 + DS_CMPST_RTN_B32 = 48 + DS_CMPST_RTN_F32 = 49 + DS_MIN_RTN_F32 = 50 + DS_MAX_RTN_F32 = 51 + DS_WRAP_RTN_B32 = 52 + DS_ADD_RTN_F32 = 53 + DS_READ_B32 = 54 + DS_READ2_B32 = 55 + DS_READ2ST64_B32 = 56 + DS_READ_I8 = 57 + DS_READ_U8 = 58 + DS_READ_I16 = 59 + DS_READ_U16 = 60 + DS_SWIZZLE_B32 = 61 + DS_PERMUTE_B32 = 62 + DS_BPERMUTE_B32 = 63 + DS_ADD_U64 = 64 + DS_SUB_U64 = 65 + DS_RSUB_U64 = 66 + DS_INC_U64 = 67 + DS_DEC_U64 = 68 + DS_MIN_I64 = 69 + DS_MAX_I64 = 70 + DS_MIN_U64 = 71 + DS_MAX_U64 = 72 + DS_AND_B64 = 73 + DS_OR_B64 = 74 + DS_XOR_B64 = 75 + DS_MSKOR_B64 = 76 + DS_WRITE_B64 = 77 + DS_WRITE2_B64 = 78 + DS_WRITE2ST64_B64 = 79 + DS_CMPST_B64 = 80 + DS_CMPST_F64 = 81 + DS_MIN_F64 = 82 + DS_MAX_F64 = 83 + DS_WRITE_B8_D16_HI = 84 + DS_WRITE_B16_D16_HI = 85 + DS_READ_U8_D16 = 86 + DS_READ_U8_D16_HI = 87 + DS_READ_I8_D16 = 88 + DS_READ_I8_D16_HI = 89 + DS_READ_U16_D16 = 90 + DS_READ_U16_D16_HI = 91 + DS_ADD_F64 = 92 + DS_ADD_RTN_U64 = 96 + DS_SUB_RTN_U64 = 97 + DS_RSUB_RTN_U64 = 98 + DS_INC_RTN_U64 = 99 + DS_DEC_RTN_U64 = 100 + DS_MIN_RTN_I64 = 101 + DS_MAX_RTN_I64 = 102 + DS_MIN_RTN_U64 = 103 + DS_MAX_RTN_U64 = 104 + DS_AND_RTN_B64 = 105 + DS_OR_RTN_B64 = 106 + DS_XOR_RTN_B64 = 107 + DS_MSKOR_RTN_B64 = 108 + DS_WRXCHG_RTN_B64 = 109 + DS_WRXCHG2_RTN_B64 = 110 + DS_WRXCHG2ST64_RTN_B64 = 111 + DS_CMPST_RTN_B64 = 112 + DS_CMPST_RTN_F64 = 113 + DS_MIN_RTN_F64 = 114 + DS_MAX_RTN_F64 = 115 + DS_READ_B64 = 118 + DS_READ2_B64 = 119 + DS_READ2ST64_B64 = 120 + DS_ADD_RTN_F64 = 124 + DS_CONDXCHG32_RTN_B64 = 126 + DS_GWS_SEMA_RELEASE_ALL = 152 + DS_GWS_SEMA_V = 154 + DS_GWS_SEMA_P = 156 + DS_READ_ADDTID_B32 = 182 + DS_PK_ADD_RTN_F16 = 183 + DS_PK_ADD_RTN_BF16 = 184 + DS_CONSUME = 189 + DS_APPEND = 190 + DS_WRITE_B96 = 222 + DS_WRITE_B128 = 223 + DS_READ_B64_TR_B4 = 224 + DS_READ_B96_TR_B6 = 225 + DS_READ_B64_TR_B8 = 226 + DS_READ_B64_TR_B16 = 227 + DS_READ_B96 = 254 + DS_READ_B128 = 255 + +class FLATOp(ReprEnum): + FLAT_LOAD_UBYTE = 16 + FLAT_LOAD_SBYTE = 17 + FLAT_LOAD_USHORT = 18 + FLAT_LOAD_SSHORT = 19 + FLAT_LOAD_DWORD = 20 + FLAT_LOAD_DWORDX2 = 21 + FLAT_LOAD_DWORDX3 = 22 + FLAT_LOAD_DWORDX4 = 23 + FLAT_STORE_BYTE = 24 + FLAT_STORE_BYTE_D16_HI = 25 + FLAT_STORE_SHORT = 26 + FLAT_STORE_SHORT_D16_HI = 27 + FLAT_STORE_DWORD = 28 + FLAT_STORE_DWORDX2 = 29 + FLAT_STORE_DWORDX3 = 30 + FLAT_STORE_DWORDX4 = 31 + FLAT_LOAD_UBYTE_D16 = 32 + FLAT_LOAD_UBYTE_D16_HI = 33 + FLAT_LOAD_SBYTE_D16 = 34 + FLAT_LOAD_SBYTE_D16_HI = 35 + FLAT_LOAD_SHORT_D16 = 36 + FLAT_LOAD_SHORT_D16_HI = 37 + FLAT_ATOMIC_SWAP = 64 + FLAT_ATOMIC_CMPSWAP = 65 + FLAT_ATOMIC_ADD = 66 + FLAT_ATOMIC_SUB = 67 + FLAT_ATOMIC_SMIN = 68 + FLAT_ATOMIC_UMIN = 69 + FLAT_ATOMIC_SMAX = 70 + FLAT_ATOMIC_UMAX = 71 + FLAT_ATOMIC_AND = 72 + FLAT_ATOMIC_OR = 73 + FLAT_ATOMIC_XOR = 74 + FLAT_ATOMIC_INC = 75 + FLAT_ATOMIC_DEC = 76 + FLAT_ATOMIC_ADD_F32 = 77 + FLAT_ATOMIC_PK_ADD_F16 = 78 + FLAT_ATOMIC_ADD_F64 = 79 + FLAT_ATOMIC_MIN_F64 = 80 + FLAT_ATOMIC_MAX_F64 = 81 + FLAT_ATOMIC_PK_ADD_BF16 = 82 + FLAT_ATOMIC_SWAP_X2 = 96 + FLAT_ATOMIC_CMPSWAP_X2 = 97 + FLAT_ATOMIC_ADD_X2 = 98 + FLAT_ATOMIC_SUB_X2 = 99 + FLAT_ATOMIC_SMIN_X2 = 100 + FLAT_ATOMIC_UMIN_X2 = 101 + FLAT_ATOMIC_SMAX_X2 = 102 + FLAT_ATOMIC_UMAX_X2 = 103 + FLAT_ATOMIC_AND_X2 = 104 + FLAT_ATOMIC_OR_X2 = 105 + FLAT_ATOMIC_XOR_X2 = 106 + FLAT_ATOMIC_INC_X2 = 107 + FLAT_ATOMIC_DEC_X2 = 108 + +class GLOBALOp(ReprEnum): + GLOBAL_LOAD_UBYTE = 16 + GLOBAL_LOAD_SBYTE = 17 + GLOBAL_LOAD_USHORT = 18 + GLOBAL_LOAD_SSHORT = 19 + GLOBAL_LOAD_DWORD = 20 + GLOBAL_LOAD_DWORDX2 = 21 + GLOBAL_LOAD_DWORDX3 = 22 + GLOBAL_LOAD_DWORDX4 = 23 + GLOBAL_STORE_BYTE = 24 + GLOBAL_STORE_BYTE_D16_HI = 25 + GLOBAL_STORE_SHORT = 26 + GLOBAL_STORE_SHORT_D16_HI = 27 + GLOBAL_STORE_DWORD = 28 + GLOBAL_STORE_DWORDX2 = 29 + GLOBAL_STORE_DWORDX3 = 30 + GLOBAL_STORE_DWORDX4 = 31 + GLOBAL_LOAD_UBYTE_D16 = 32 + GLOBAL_LOAD_UBYTE_D16_HI = 33 + GLOBAL_LOAD_SBYTE_D16 = 34 + GLOBAL_LOAD_SBYTE_D16_HI = 35 + GLOBAL_LOAD_SHORT_D16 = 36 + GLOBAL_LOAD_SHORT_D16_HI = 37 + GLOBAL_LOAD_LDS_UBYTE = 38 + GLOBAL_LOAD_LDS_SBYTE = 39 + GLOBAL_LOAD_LDS_USHORT = 40 + GLOBAL_LOAD_LDS_SSHORT = 41 + GLOBAL_LOAD_LDS_DWORD = 42 + GLOBAL_ATOMIC_SWAP = 64 + GLOBAL_ATOMIC_CMPSWAP = 65 + GLOBAL_ATOMIC_ADD = 66 + GLOBAL_ATOMIC_SUB = 67 + GLOBAL_ATOMIC_SMIN = 68 + GLOBAL_ATOMIC_UMIN = 69 + GLOBAL_ATOMIC_SMAX = 70 + GLOBAL_ATOMIC_UMAX = 71 + GLOBAL_ATOMIC_AND = 72 + GLOBAL_ATOMIC_OR = 73 + GLOBAL_ATOMIC_XOR = 74 + GLOBAL_ATOMIC_INC = 75 + GLOBAL_ATOMIC_DEC = 76 + GLOBAL_ATOMIC_ADD_F32 = 77 + GLOBAL_ATOMIC_PK_ADD_F16 = 78 + GLOBAL_ATOMIC_ADD_F64 = 79 + GLOBAL_ATOMIC_MIN_F64 = 80 + GLOBAL_ATOMIC_MAX_F64 = 81 + GLOBAL_ATOMIC_PK_ADD_BF16 = 82 + GLOBAL_ATOMIC_SWAP_X2 = 96 + GLOBAL_ATOMIC_CMPSWAP_X2 = 97 + GLOBAL_ATOMIC_ADD_X2 = 98 + GLOBAL_ATOMIC_SUB_X2 = 99 + GLOBAL_ATOMIC_SMIN_X2 = 100 + GLOBAL_ATOMIC_UMIN_X2 = 101 + GLOBAL_ATOMIC_SMAX_X2 = 102 + GLOBAL_ATOMIC_UMAX_X2 = 103 + GLOBAL_ATOMIC_AND_X2 = 104 + GLOBAL_ATOMIC_OR_X2 = 105 + GLOBAL_ATOMIC_XOR_X2 = 106 + GLOBAL_ATOMIC_INC_X2 = 107 + GLOBAL_ATOMIC_DEC_X2 = 108 + GLOBAL_LOAD_LDS_DWORDX4 = 125 + GLOBAL_LOAD_LDS_DWORDX3 = 126 + +class HWREG(ReprEnum): + HW_REG_MODE = 1 + HW_REG_STATUS = 2 + HW_REG_TRAPSTS = 3 + HW_REG_HW_ID = 4 + HW_REG_GPR_ALLOC = 5 + HW_REG_LDS_ALLOC = 6 + HW_REG_IB_STS = 7 + HW_REG_PC_LO = 8 + HW_REG_PC_HI = 9 + HW_REG_INST_DW0 = 10 + HW_REG_INST_DW1 = 11 + HW_REG_IB_DBG0 = 12 + HW_REG_IB_DBG1 = 13 + HW_REG_FLUSH_IB = 14 + HW_REG_SH_MEM_BASES = 15 + HW_REG_SQ_SHADER_TBA_LO = 16 + HW_REG_SQ_SHADER_TBA_HI = 17 + HW_REG_SQ_SHADER_TMA_LO = 18 + HW_REG_SQ_SHADER_TMA_HI = 19 + HW_REG_XCC_ID = 20 + HW_REG_SQ_PERF_SNAPSHOT_DATA = 21 + HW_REG_SQ_PERF_SNAPSHOT_DATA1 = 22 + HW_REG_SQ_PERF_SNAPSHOT_PC_LO = 23 + HW_REG_SQ_PERF_SNAPSHOT_PC_HI = 24 + +class MTBUFOp(ReprEnum): + TBUFFER_LOAD_FORMAT_X = 0 + TBUFFER_LOAD_FORMAT_XY = 1 + TBUFFER_LOAD_FORMAT_XYZ = 2 + TBUFFER_LOAD_FORMAT_XYZW = 3 + TBUFFER_STORE_FORMAT_X = 4 + TBUFFER_STORE_FORMAT_XY = 5 + TBUFFER_STORE_FORMAT_XYZ = 6 + TBUFFER_STORE_FORMAT_XYZW = 7 + TBUFFER_LOAD_FORMAT_D16_X = 8 + TBUFFER_LOAD_FORMAT_D16_XY = 9 + TBUFFER_LOAD_FORMAT_D16_XYZ = 10 + TBUFFER_LOAD_FORMAT_D16_XYZW = 11 + TBUFFER_STORE_FORMAT_D16_X = 12 + TBUFFER_STORE_FORMAT_D16_XY = 13 + TBUFFER_STORE_FORMAT_D16_XYZ = 14 + TBUFFER_STORE_FORMAT_D16_XYZW = 15 + +class MUBUFOp(ReprEnum): + BUFFER_LOAD_FORMAT_X = 0 + BUFFER_LOAD_FORMAT_XY = 1 + BUFFER_LOAD_FORMAT_XYZ = 2 + BUFFER_LOAD_FORMAT_XYZW = 3 + BUFFER_STORE_FORMAT_X = 4 + BUFFER_STORE_FORMAT_XY = 5 + BUFFER_STORE_FORMAT_XYZ = 6 + BUFFER_STORE_FORMAT_XYZW = 7 + BUFFER_LOAD_FORMAT_D16_X = 8 + BUFFER_LOAD_FORMAT_D16_XY = 9 + BUFFER_LOAD_FORMAT_D16_XYZ = 10 + BUFFER_LOAD_FORMAT_D16_XYZW = 11 + BUFFER_STORE_FORMAT_D16_X = 12 + BUFFER_STORE_FORMAT_D16_XY = 13 + BUFFER_STORE_FORMAT_D16_XYZ = 14 + BUFFER_STORE_FORMAT_D16_XYZW = 15 + BUFFER_LOAD_UBYTE = 16 + BUFFER_LOAD_SBYTE = 17 + BUFFER_LOAD_USHORT = 18 + BUFFER_LOAD_SSHORT = 19 + BUFFER_LOAD_DWORD = 20 + BUFFER_LOAD_DWORDX2 = 21 + BUFFER_LOAD_DWORDX3 = 22 + BUFFER_LOAD_DWORDX4 = 23 + BUFFER_STORE_BYTE = 24 + BUFFER_STORE_BYTE_D16_HI = 25 + BUFFER_STORE_SHORT = 26 + BUFFER_STORE_SHORT_D16_HI = 27 + BUFFER_STORE_DWORD = 28 + BUFFER_STORE_DWORDX2 = 29 + BUFFER_STORE_DWORDX3 = 30 + BUFFER_STORE_DWORDX4 = 31 + BUFFER_LOAD_UBYTE_D16 = 32 + BUFFER_LOAD_UBYTE_D16_HI = 33 + BUFFER_LOAD_SBYTE_D16 = 34 + BUFFER_LOAD_SBYTE_D16_HI = 35 + BUFFER_LOAD_SHORT_D16 = 36 + BUFFER_LOAD_SHORT_D16_HI = 37 + BUFFER_LOAD_FORMAT_D16_HI_X = 38 + BUFFER_STORE_FORMAT_D16_HI_X = 39 + BUFFER_WBL2 = 40 + BUFFER_INV = 41 + BUFFER_ATOMIC_SWAP = 64 + BUFFER_ATOMIC_CMPSWAP = 65 + BUFFER_ATOMIC_ADD = 66 + BUFFER_ATOMIC_SUB = 67 + BUFFER_ATOMIC_SMIN = 68 + BUFFER_ATOMIC_UMIN = 69 + BUFFER_ATOMIC_SMAX = 70 + BUFFER_ATOMIC_UMAX = 71 + BUFFER_ATOMIC_AND = 72 + BUFFER_ATOMIC_OR = 73 + BUFFER_ATOMIC_XOR = 74 + BUFFER_ATOMIC_INC = 75 + BUFFER_ATOMIC_DEC = 76 + BUFFER_ATOMIC_ADD_F32 = 77 + BUFFER_ATOMIC_PK_ADD_F16 = 78 + BUFFER_ATOMIC_ADD_F64 = 79 + BUFFER_ATOMIC_MIN_F64 = 80 + BUFFER_ATOMIC_MAX_F64 = 81 + BUFFER_ATOMIC_PK_ADD_BF16 = 82 + BUFFER_ATOMIC_SWAP_X2 = 96 + BUFFER_ATOMIC_CMPSWAP_X2 = 97 + BUFFER_ATOMIC_ADD_X2 = 98 + BUFFER_ATOMIC_SUB_X2 = 99 + BUFFER_ATOMIC_SMIN_X2 = 100 + BUFFER_ATOMIC_UMIN_X2 = 101 + BUFFER_ATOMIC_SMAX_X2 = 102 + BUFFER_ATOMIC_UMAX_X2 = 103 + BUFFER_ATOMIC_AND_X2 = 104 + BUFFER_ATOMIC_OR_X2 = 105 + BUFFER_ATOMIC_XOR_X2 = 106 + BUFFER_ATOMIC_INC_X2 = 107 + BUFFER_ATOMIC_DEC_X2 = 108 + +class SCRATCHOp(ReprEnum): + SCRATCH_LOAD_UBYTE = 16 + SCRATCH_LOAD_SBYTE = 17 + SCRATCH_LOAD_USHORT = 18 + SCRATCH_LOAD_SSHORT = 19 + SCRATCH_LOAD_DWORD = 20 + SCRATCH_LOAD_DWORDX2 = 21 + SCRATCH_LOAD_DWORDX3 = 22 + SCRATCH_LOAD_DWORDX4 = 23 + SCRATCH_STORE_BYTE = 24 + SCRATCH_STORE_BYTE_D16_HI = 25 + SCRATCH_STORE_SHORT = 26 + SCRATCH_STORE_SHORT_D16_HI = 27 + SCRATCH_STORE_DWORD = 28 + SCRATCH_STORE_DWORDX2 = 29 + SCRATCH_STORE_DWORDX3 = 30 + SCRATCH_STORE_DWORDX4 = 31 + SCRATCH_LOAD_UBYTE_D16 = 32 + SCRATCH_LOAD_UBYTE_D16_HI = 33 + SCRATCH_LOAD_SBYTE_D16 = 34 + SCRATCH_LOAD_SBYTE_D16_HI = 35 + SCRATCH_LOAD_SHORT_D16 = 36 + SCRATCH_LOAD_SHORT_D16_HI = 37 + SCRATCH_LOAD_LDS_UBYTE = 38 + SCRATCH_LOAD_LDS_SBYTE = 39 + SCRATCH_LOAD_LDS_USHORT = 40 + SCRATCH_LOAD_LDS_SSHORT = 41 + SCRATCH_LOAD_LDS_DWORD = 42 + +class SMEMOp(ReprEnum): + S_LOAD_DWORD = 0 + S_LOAD_DWORDX2 = 1 + S_LOAD_DWORDX4 = 2 + S_LOAD_DWORDX8 = 3 + S_LOAD_DWORDX16 = 4 + S_SCRATCH_LOAD_DWORD = 5 + S_SCRATCH_LOAD_DWORDX2 = 6 + S_SCRATCH_LOAD_DWORDX4 = 7 + S_BUFFER_LOAD_DWORD = 8 + S_BUFFER_LOAD_DWORDX2 = 9 + S_BUFFER_LOAD_DWORDX4 = 10 + S_BUFFER_LOAD_DWORDX8 = 11 + S_BUFFER_LOAD_DWORDX16 = 12 + S_STORE_DWORD = 16 + S_STORE_DWORDX2 = 17 + S_STORE_DWORDX4 = 18 + S_SCRATCH_STORE_DWORD = 21 + S_SCRATCH_STORE_DWORDX2 = 22 + S_SCRATCH_STORE_DWORDX4 = 23 + S_BUFFER_STORE_DWORD = 24 + S_BUFFER_STORE_DWORDX2 = 25 + S_BUFFER_STORE_DWORDX4 = 26 + S_DCACHE_INV = 32 + S_DCACHE_WB = 33 + S_DCACHE_INV_VOL = 34 + S_DCACHE_WB_VOL = 35 + S_MEMTIME = 36 + S_MEMREALTIME = 37 + S_ATC_PROBE = 38 + S_ATC_PROBE_BUFFER = 39 + S_DCACHE_DISCARD = 40 + S_DCACHE_DISCARD_X2 = 41 + S_BUFFER_ATOMIC_SWAP = 64 + S_BUFFER_ATOMIC_CMPSWAP = 65 + S_BUFFER_ATOMIC_ADD = 66 + S_BUFFER_ATOMIC_SUB = 67 + S_BUFFER_ATOMIC_SMIN = 68 + S_BUFFER_ATOMIC_UMIN = 69 + S_BUFFER_ATOMIC_SMAX = 70 + S_BUFFER_ATOMIC_UMAX = 71 + S_BUFFER_ATOMIC_AND = 72 + S_BUFFER_ATOMIC_OR = 73 + S_BUFFER_ATOMIC_XOR = 74 + S_BUFFER_ATOMIC_INC = 75 + S_BUFFER_ATOMIC_DEC = 76 + S_BUFFER_ATOMIC_SWAP_X2 = 96 + S_BUFFER_ATOMIC_CMPSWAP_X2 = 97 + S_BUFFER_ATOMIC_ADD_X2 = 98 + S_BUFFER_ATOMIC_SUB_X2 = 99 + S_BUFFER_ATOMIC_SMIN_X2 = 100 + S_BUFFER_ATOMIC_UMIN_X2 = 101 + S_BUFFER_ATOMIC_SMAX_X2 = 102 + S_BUFFER_ATOMIC_UMAX_X2 = 103 + S_BUFFER_ATOMIC_AND_X2 = 104 + S_BUFFER_ATOMIC_OR_X2 = 105 + S_BUFFER_ATOMIC_XOR_X2 = 106 + S_BUFFER_ATOMIC_INC_X2 = 107 + S_BUFFER_ATOMIC_DEC_X2 = 108 + S_ATOMIC_SWAP = 128 + S_ATOMIC_CMPSWAP = 129 + S_ATOMIC_ADD = 130 + S_ATOMIC_SUB = 131 + S_ATOMIC_SMIN = 132 + S_ATOMIC_UMIN = 133 + S_ATOMIC_SMAX = 134 + S_ATOMIC_UMAX = 135 + S_ATOMIC_AND = 136 + S_ATOMIC_OR = 137 + S_ATOMIC_XOR = 138 + S_ATOMIC_INC = 139 + S_ATOMIC_DEC = 140 + S_ATOMIC_SWAP_X2 = 160 + S_ATOMIC_CMPSWAP_X2 = 161 + S_ATOMIC_ADD_X2 = 162 + S_ATOMIC_SUB_X2 = 163 + S_ATOMIC_SMIN_X2 = 164 + S_ATOMIC_UMIN_X2 = 165 + S_ATOMIC_SMAX_X2 = 166 + S_ATOMIC_UMAX_X2 = 167 + S_ATOMIC_AND_X2 = 168 + S_ATOMIC_OR_X2 = 169 + S_ATOMIC_XOR_X2 = 170 + S_ATOMIC_INC_X2 = 171 + S_ATOMIC_DEC_X2 = 172 + +class SOP1Op(ReprEnum): + S_MOV_B32 = 0 + S_MOV_B64 = 1 + S_CMOV_B32 = 2 + S_CMOV_B64 = 3 + S_NOT_B32 = 4 + S_NOT_B64 = 5 + S_WQM_B32 = 6 + S_WQM_B64 = 7 + S_BREV_B32 = 8 + S_BREV_B64 = 9 + S_BCNT0_I32_B32 = 10 + S_BCNT0_I32_B64 = 11 + S_BCNT1_I32_B32 = 12 + S_BCNT1_I32_B64 = 13 + S_FF0_I32_B32 = 14 + S_FF0_I32_B64 = 15 + S_FF1_I32_B32 = 16 + S_FF1_I32_B64 = 17 + S_FLBIT_I32_B32 = 18 + S_FLBIT_I32_B64 = 19 + S_FLBIT_I32 = 20 + S_FLBIT_I32_I64 = 21 + S_SEXT_I32_I8 = 22 + S_SEXT_I32_I16 = 23 + S_BITSET0_B32 = 24 + S_BITSET0_B64 = 25 + S_BITSET1_B32 = 26 + S_BITSET1_B64 = 27 + S_GETPC_B64 = 28 + S_SETPC_B64 = 29 + S_SWAPPC_B64 = 30 + S_RFE_B64 = 31 + S_AND_SAVEEXEC_B64 = 32 + S_OR_SAVEEXEC_B64 = 33 + S_XOR_SAVEEXEC_B64 = 34 + S_ANDN2_SAVEEXEC_B64 = 35 + S_ORN2_SAVEEXEC_B64 = 36 + S_NAND_SAVEEXEC_B64 = 37 + S_NOR_SAVEEXEC_B64 = 38 + S_XNOR_SAVEEXEC_B64 = 39 + S_QUADMASK_B32 = 40 + S_QUADMASK_B64 = 41 + S_MOVRELS_B32 = 42 + S_MOVRELS_B64 = 43 + S_MOVRELD_B32 = 44 + S_MOVRELD_B64 = 45 + S_CBRANCH_JOIN = 46 + S_ABS_I32 = 48 + S_SET_GPR_IDX_IDX = 50 + S_ANDN1_SAVEEXEC_B64 = 51 + S_ORN1_SAVEEXEC_B64 = 52 + S_ANDN1_WREXEC_B64 = 53 + S_ANDN2_WREXEC_B64 = 54 + S_BITREPLICATE_B64_B32 = 55 + +class SOP2Op(ReprEnum): + S_ADD_U32 = 0 + S_SUB_U32 = 1 + S_ADD_I32 = 2 + S_SUB_I32 = 3 + S_ADDC_U32 = 4 + S_SUBB_U32 = 5 + S_MIN_I32 = 6 + S_MIN_U32 = 7 + S_MAX_I32 = 8 + S_MAX_U32 = 9 + S_CSELECT_B32 = 10 + S_CSELECT_B64 = 11 + S_AND_B32 = 12 + S_AND_B64 = 13 + S_OR_B32 = 14 + S_OR_B64 = 15 + S_XOR_B32 = 16 + S_XOR_B64 = 17 + S_ANDN2_B32 = 18 + S_ANDN2_B64 = 19 + S_ORN2_B32 = 20 + S_ORN2_B64 = 21 + S_NAND_B32 = 22 + S_NAND_B64 = 23 + S_NOR_B32 = 24 + S_NOR_B64 = 25 + S_XNOR_B32 = 26 + S_XNOR_B64 = 27 + S_LSHL_B32 = 28 + S_LSHL_B64 = 29 + S_LSHR_B32 = 30 + S_LSHR_B64 = 31 + S_ASHR_I32 = 32 + S_ASHR_I64 = 33 + S_BFM_B32 = 34 + S_BFM_B64 = 35 + S_MUL_I32 = 36 + S_BFE_U32 = 37 + S_BFE_I32 = 38 + S_BFE_U64 = 39 + S_BFE_I64 = 40 + S_CBRANCH_G_FORK = 41 + S_ABSDIFF_I32 = 42 + S_RFE_RESTORE_B64 = 43 + S_MUL_HI_U32 = 44 + S_MUL_HI_I32 = 45 + S_LSHL1_ADD_U32 = 46 + S_LSHL2_ADD_U32 = 47 + S_LSHL3_ADD_U32 = 48 + S_LSHL4_ADD_U32 = 49 + S_PACK_LL_B32_B16 = 50 + S_PACK_LH_B32_B16 = 51 + S_PACK_HH_B32_B16 = 52 + +class SOPCOp(ReprEnum): + S_CMP_EQ_I32 = 0 + S_CMP_LG_I32 = 1 + S_CMP_GT_I32 = 2 + S_CMP_GE_I32 = 3 + S_CMP_LT_I32 = 4 + S_CMP_LE_I32 = 5 + S_CMP_EQ_U32 = 6 + S_CMP_LG_U32 = 7 + S_CMP_GT_U32 = 8 + S_CMP_GE_U32 = 9 + S_CMP_LT_U32 = 10 + S_CMP_LE_U32 = 11 + S_BITCMP0_B32 = 12 + S_BITCMP1_B32 = 13 + S_BITCMP0_B64 = 14 + S_BITCMP1_B64 = 15 + S_SETVSKIP = 16 + S_SET_GPR_IDX_ON = 17 + S_CMP_EQ_U64 = 18 + S_CMP_LG_U64 = 19 + +class SOPKOp(ReprEnum): + S_MOVK_I32 = 0 + S_CMOVK_I32 = 1 + S_CMPK_EQ_I32 = 2 + S_CMPK_LG_I32 = 3 + S_CMPK_GT_I32 = 4 + S_CMPK_GE_I32 = 5 + S_CMPK_LT_I32 = 6 + S_CMPK_LE_I32 = 7 + S_CMPK_EQ_U32 = 8 + S_CMPK_LG_U32 = 9 + S_CMPK_GT_U32 = 10 + S_CMPK_GE_U32 = 11 + S_CMPK_LT_U32 = 12 + S_CMPK_LE_U32 = 13 + S_ADDK_I32 = 14 + S_MULK_I32 = 15 + S_CBRANCH_I_FORK = 16 + S_GETREG_B32 = 17 + S_SETREG_B32 = 18 + S_SETREG_IMM32_B32 = 20 + S_CALL_B64 = 21 + +class SOPPOp(ReprEnum): + S_NOP = 0 + S_ENDPGM = 1 + S_BRANCH = 2 + S_WAKEUP = 3 + S_CBRANCH_SCC0 = 4 + S_CBRANCH_SCC1 = 5 + S_CBRANCH_VCCZ = 6 + S_CBRANCH_VCCNZ = 7 + S_CBRANCH_EXECZ = 8 + S_CBRANCH_EXECNZ = 9 + S_BARRIER = 10 + S_SETKILL = 11 + S_WAITCNT = 12 + S_SETHALT = 13 + S_SLEEP = 14 + S_SETPRIO = 15 + S_SENDMSG = 16 + S_SENDMSGHALT = 17 + S_TRAP = 18 + S_ICACHE_INV = 19 + S_INCPERFLEVEL = 20 + S_DECPERFLEVEL = 21 + S_TTRACEDATA = 22 + S_CBRANCH_CDBGSYS = 23 + S_CBRANCH_CDBGUSER = 24 + S_CBRANCH_CDBGSYS_OR_USER = 25 + S_CBRANCH_CDBGSYS_AND_USER = 26 + S_ENDPGM_SAVED = 27 + S_SET_GPR_IDX_OFF = 28 + S_SET_GPR_IDX_MODE = 29 + S_ENDPGM_ORDERED_PS_DONE = 30 + S_SET_VALU_COEXEC_MODE = 31 + +class VOP1Op(ReprEnum): + V_NOP_E32 = 0 + V_MOV_B32_E32 = 1 + V_READFIRSTLANE_B32_E32 = 2 + V_CVT_I32_F64_E32 = 3 + V_CVT_F64_I32_E32 = 4 + V_CVT_F32_I32_E32 = 5 + V_CVT_F32_U32_E32 = 6 + V_CVT_U32_F32_E32 = 7 + V_CVT_I32_F32_E32 = 8 + V_CVT_F16_F32_E32 = 10 + V_CVT_F32_F16_E32 = 11 + V_CVT_RPI_I32_F32_E32 = 12 + V_CVT_FLR_I32_F32_E32 = 13 + V_CVT_OFF_F32_I4_E32 = 14 + V_CVT_F32_F64_E32 = 15 + V_CVT_F64_F32_E32 = 16 + V_CVT_F32_UBYTE0_E32 = 17 + V_CVT_F32_UBYTE1_E32 = 18 + V_CVT_F32_UBYTE2_E32 = 19 + V_CVT_F32_UBYTE3_E32 = 20 + V_CVT_U32_F64_E32 = 21 + V_CVT_F64_U32_E32 = 22 + V_TRUNC_F64_E32 = 23 + V_CEIL_F64_E32 = 24 + V_RNDNE_F64_E32 = 25 + V_FLOOR_F64_E32 = 26 + V_FRACT_F32_E32 = 27 + V_TRUNC_F32_E32 = 28 + V_CEIL_F32_E32 = 29 + V_RNDNE_F32_E32 = 30 + V_FLOOR_F32_E32 = 31 + V_EXP_F32_E32 = 32 + V_LOG_F32_E32 = 33 + V_RCP_F32_E32 = 34 + V_RCP_IFLAG_F32_E32 = 35 + V_RSQ_F32_E32 = 36 + V_RCP_F64_E32 = 37 + V_RSQ_F64_E32 = 38 + V_SQRT_F32_E32 = 39 + V_SQRT_F64_E32 = 40 + V_SIN_F32_E32 = 41 + V_COS_F32_E32 = 42 + V_NOT_B32_E32 = 43 + V_BFREV_B32_E32 = 44 + V_FFBH_U32_E32 = 45 + V_FFBL_B32_E32 = 46 + V_FFBH_I32_E32 = 47 + V_FREXP_EXP_I32_F64_E32 = 48 + V_FREXP_MANT_F64_E32 = 49 + V_FRACT_F64_E32 = 50 + V_FREXP_EXP_I32_F32_E32 = 51 + V_FREXP_MANT_F32_E32 = 52 + V_CLREXCP_E32 = 53 + V_SCREEN_PARTITION_4SE_B32_E32 = 55 + V_MOV_B64_E32 = 56 + V_CVT_F16_U16_E32 = 57 + V_CVT_F16_I16_E32 = 58 + V_CVT_U16_F16_E32 = 59 + V_CVT_I16_F16_E32 = 60 + V_RCP_F16_E32 = 61 + V_SQRT_F16_E32 = 62 + V_RSQ_F16_E32 = 63 + V_LOG_F16_E32 = 64 + V_EXP_F16_E32 = 65 + V_FREXP_MANT_F16_E32 = 66 + V_FREXP_EXP_I16_F16_E32 = 67 + V_FLOOR_F16_E32 = 68 + V_CEIL_F16_E32 = 69 + V_TRUNC_F16_E32 = 70 + V_RNDNE_F16_E32 = 71 + V_FRACT_F16_E32 = 72 + V_SIN_F16_E32 = 73 + V_COS_F16_E32 = 74 + V_EXP_LEGACY_F32_E32 = 75 + V_LOG_LEGACY_F32_E32 = 76 + V_CVT_NORM_I16_F16_E32 = 77 + V_CVT_NORM_U16_F16_E32 = 78 + V_SAT_PK_U8_I16_E32 = 79 + V_SWAP_B32_E32 = 81 + V_ACCVGPR_MOV_B32_E32 = 82 + V_CVT_F32_FP8_E32 = 84 + V_CVT_F32_BF8_E32 = 85 + V_CVT_PK_F32_FP8_E32 = 86 + V_CVT_PK_F32_BF8_E32 = 87 + V_PRNG_B32_E32 = 88 + V_PERMLANE16_SWAP_B32_E32 = 89 + V_PERMLANE32_SWAP_B32_E32 = 90 + V_CVT_F32_BF16_E32 = 91 + V_NOP = V_NOP_E32 + V_MOV_B32 = V_MOV_B32_E32 + V_READFIRSTLANE_B32 = V_READFIRSTLANE_B32_E32 + V_CVT_I32_F64 = V_CVT_I32_F64_E32 + V_CVT_F64_I32 = V_CVT_F64_I32_E32 + V_CVT_F32_I32 = V_CVT_F32_I32_E32 + V_CVT_F32_U32 = V_CVT_F32_U32_E32 + V_CVT_U32_F32 = V_CVT_U32_F32_E32 + V_CVT_I32_F32 = V_CVT_I32_F32_E32 + V_CVT_F16_F32 = V_CVT_F16_F32_E32 + V_CVT_F32_F16 = V_CVT_F32_F16_E32 + V_CVT_RPI_I32_F32 = V_CVT_RPI_I32_F32_E32 + V_CVT_FLR_I32_F32 = V_CVT_FLR_I32_F32_E32 + V_CVT_OFF_F32_I4 = V_CVT_OFF_F32_I4_E32 + V_CVT_F32_F64 = V_CVT_F32_F64_E32 + V_CVT_F64_F32 = V_CVT_F64_F32_E32 + V_CVT_F32_UBYTE0 = V_CVT_F32_UBYTE0_E32 + V_CVT_F32_UBYTE1 = V_CVT_F32_UBYTE1_E32 + V_CVT_F32_UBYTE2 = V_CVT_F32_UBYTE2_E32 + V_CVT_F32_UBYTE3 = V_CVT_F32_UBYTE3_E32 + V_CVT_U32_F64 = V_CVT_U32_F64_E32 + V_CVT_F64_U32 = V_CVT_F64_U32_E32 + V_TRUNC_F64 = V_TRUNC_F64_E32 + V_CEIL_F64 = V_CEIL_F64_E32 + V_RNDNE_F64 = V_RNDNE_F64_E32 + V_FLOOR_F64 = V_FLOOR_F64_E32 + V_FRACT_F32 = V_FRACT_F32_E32 + V_TRUNC_F32 = V_TRUNC_F32_E32 + V_CEIL_F32 = V_CEIL_F32_E32 + V_RNDNE_F32 = V_RNDNE_F32_E32 + V_FLOOR_F32 = V_FLOOR_F32_E32 + V_EXP_F32 = V_EXP_F32_E32 + V_LOG_F32 = V_LOG_F32_E32 + V_RCP_F32 = V_RCP_F32_E32 + V_RCP_IFLAG_F32 = V_RCP_IFLAG_F32_E32 + V_RSQ_F32 = V_RSQ_F32_E32 + V_RCP_F64 = V_RCP_F64_E32 + V_RSQ_F64 = V_RSQ_F64_E32 + V_SQRT_F32 = V_SQRT_F32_E32 + V_SQRT_F64 = V_SQRT_F64_E32 + V_SIN_F32 = V_SIN_F32_E32 + V_COS_F32 = V_COS_F32_E32 + V_NOT_B32 = V_NOT_B32_E32 + V_BFREV_B32 = V_BFREV_B32_E32 + V_FFBH_U32 = V_FFBH_U32_E32 + V_FFBL_B32 = V_FFBL_B32_E32 + V_FFBH_I32 = V_FFBH_I32_E32 + V_FREXP_EXP_I32_F64 = V_FREXP_EXP_I32_F64_E32 + V_FREXP_MANT_F64 = V_FREXP_MANT_F64_E32 + V_FRACT_F64 = V_FRACT_F64_E32 + V_FREXP_EXP_I32_F32 = V_FREXP_EXP_I32_F32_E32 + V_FREXP_MANT_F32 = V_FREXP_MANT_F32_E32 + V_CLREXCP = V_CLREXCP_E32 + V_SCREEN_PARTITION_4SE_B32 = V_SCREEN_PARTITION_4SE_B32_E32 + V_MOV_B64 = V_MOV_B64_E32 + V_CVT_F16_U16 = V_CVT_F16_U16_E32 + V_CVT_F16_I16 = V_CVT_F16_I16_E32 + V_CVT_U16_F16 = V_CVT_U16_F16_E32 + V_CVT_I16_F16 = V_CVT_I16_F16_E32 + V_RCP_F16 = V_RCP_F16_E32 + V_SQRT_F16 = V_SQRT_F16_E32 + V_RSQ_F16 = V_RSQ_F16_E32 + V_LOG_F16 = V_LOG_F16_E32 + V_EXP_F16 = V_EXP_F16_E32 + V_FREXP_MANT_F16 = V_FREXP_MANT_F16_E32 + V_FREXP_EXP_I16_F16 = V_FREXP_EXP_I16_F16_E32 + V_FLOOR_F16 = V_FLOOR_F16_E32 + V_CEIL_F16 = V_CEIL_F16_E32 + V_TRUNC_F16 = V_TRUNC_F16_E32 + V_RNDNE_F16 = V_RNDNE_F16_E32 + V_FRACT_F16 = V_FRACT_F16_E32 + V_SIN_F16 = V_SIN_F16_E32 + V_COS_F16 = V_COS_F16_E32 + V_EXP_LEGACY_F32 = V_EXP_LEGACY_F32_E32 + V_LOG_LEGACY_F32 = V_LOG_LEGACY_F32_E32 + V_CVT_NORM_I16_F16 = V_CVT_NORM_I16_F16_E32 + V_CVT_NORM_U16_F16 = V_CVT_NORM_U16_F16_E32 + V_SAT_PK_U8_I16 = V_SAT_PK_U8_I16_E32 + V_SWAP_B32 = V_SWAP_B32_E32 + V_ACCVGPR_MOV_B32 = V_ACCVGPR_MOV_B32_E32 + V_CVT_F32_FP8 = V_CVT_F32_FP8_E32 + V_CVT_F32_BF8 = V_CVT_F32_BF8_E32 + V_CVT_PK_F32_FP8 = V_CVT_PK_F32_FP8_E32 + V_CVT_PK_F32_BF8 = V_CVT_PK_F32_BF8_E32 + V_PRNG_B32 = V_PRNG_B32_E32 + V_PERMLANE16_SWAP_B32 = V_PERMLANE16_SWAP_B32_E32 + V_PERMLANE32_SWAP_B32 = V_PERMLANE32_SWAP_B32_E32 + V_CVT_F32_BF16 = V_CVT_F32_BF16_E32 + +class VOP2Op(ReprEnum): + V_CNDMASK_B32_E32 = 0 + V_ADD_F32_E32 = 1 + V_SUB_F32_E32 = 2 + V_SUBREV_F32_E32 = 3 + V_FMAC_F64_E32 = 4 + V_MUL_F32_E32 = 5 + V_MUL_I32_I24_E32 = 6 + V_MUL_HI_I32_I24_E32 = 7 + V_MUL_U32_U24_E32 = 8 + V_MUL_HI_U32_U24_E32 = 9 + V_MIN_F32_E32 = 10 + V_MAX_F32_E32 = 11 + V_MIN_I32_E32 = 12 + V_MAX_I32_E32 = 13 + V_MIN_U32_E32 = 14 + V_MAX_U32_E32 = 15 + V_LSHRREV_B32_E32 = 16 + V_ASHRREV_I32_E32 = 17 + V_LSHLREV_B32_E32 = 18 + V_AND_B32_E32 = 19 + V_OR_B32_E32 = 20 + V_XOR_B32_E32 = 21 + V_DOT2C_F32_BF16_E32 = 22 + V_FMAMK_F32_E32 = 23 + V_FMAAK_F32_E32 = 24 + V_ADD_CO_U32_E32 = 25 + V_SUB_CO_U32_E32 = 26 + V_SUBREV_CO_U32_E32 = 27 + V_ADDC_CO_U32_E32 = 28 + V_SUBB_CO_U32_E32 = 29 + V_SUBBREV_CO_U32_E32 = 30 + V_ADD_F16_E32 = 31 + V_SUB_F16_E32 = 32 + V_SUBREV_F16_E32 = 33 + V_MUL_F16_E32 = 34 + V_MAC_F16_E32 = 35 + V_MADMK_F16_E32 = 36 + V_MADAK_F16_E32 = 37 + V_ADD_U16_E32 = 38 + V_SUB_U16_E32 = 39 + V_SUBREV_U16_E32 = 40 + V_MUL_LO_U16_E32 = 41 + V_LSHLREV_B16_E32 = 42 + V_LSHRREV_B16_E32 = 43 + V_ASHRREV_I16_E32 = 44 + V_MAX_F16_E32 = 45 + V_MIN_F16_E32 = 46 + V_MAX_U16_E32 = 47 + V_MAX_I16_E32 = 48 + V_MIN_U16_E32 = 49 + V_MIN_I16_E32 = 50 + V_LDEXP_F16_E32 = 51 + V_ADD_U32_E32 = 52 + V_SUB_U32_E32 = 53 + V_SUBREV_U32_E32 = 54 + V_DOT2C_F32_F16_E32 = 55 + V_DOT2C_I32_I16_E32 = 56 + V_DOT4C_I32_I8_E32 = 57 + V_DOT8C_I32_I4_E32 = 58 + V_FMAC_F32_E32 = 59 + V_PK_FMAC_F16_E32 = 60 + V_XNOR_B32_E32 = 61 + V_CNDMASK_B32 = V_CNDMASK_B32_E32 + V_ADD_F32 = V_ADD_F32_E32 + V_SUB_F32 = V_SUB_F32_E32 + V_SUBREV_F32 = V_SUBREV_F32_E32 + V_FMAC_F64 = V_FMAC_F64_E32 + V_MUL_F32 = V_MUL_F32_E32 + V_MUL_I32_I24 = V_MUL_I32_I24_E32 + V_MUL_HI_I32_I24 = V_MUL_HI_I32_I24_E32 + V_MUL_U32_U24 = V_MUL_U32_U24_E32 + V_MUL_HI_U32_U24 = V_MUL_HI_U32_U24_E32 + V_MIN_F32 = V_MIN_F32_E32 + V_MAX_F32 = V_MAX_F32_E32 + V_MIN_I32 = V_MIN_I32_E32 + V_MAX_I32 = V_MAX_I32_E32 + V_MIN_U32 = V_MIN_U32_E32 + V_MAX_U32 = V_MAX_U32_E32 + V_LSHRREV_B32 = V_LSHRREV_B32_E32 + V_ASHRREV_I32 = V_ASHRREV_I32_E32 + V_LSHLREV_B32 = V_LSHLREV_B32_E32 + V_AND_B32 = V_AND_B32_E32 + V_OR_B32 = V_OR_B32_E32 + V_XOR_B32 = V_XOR_B32_E32 + V_DOT2C_F32_BF16 = V_DOT2C_F32_BF16_E32 + V_FMAMK_F32 = V_FMAMK_F32_E32 + V_FMAAK_F32 = V_FMAAK_F32_E32 + V_ADD_CO_U32 = V_ADD_CO_U32_E32 + V_SUB_CO_U32 = V_SUB_CO_U32_E32 + V_SUBREV_CO_U32 = V_SUBREV_CO_U32_E32 + V_ADDC_CO_U32 = V_ADDC_CO_U32_E32 + V_SUBB_CO_U32 = V_SUBB_CO_U32_E32 + V_SUBBREV_CO_U32 = V_SUBBREV_CO_U32_E32 + V_ADD_F16 = V_ADD_F16_E32 + V_SUB_F16 = V_SUB_F16_E32 + V_SUBREV_F16 = V_SUBREV_F16_E32 + V_MUL_F16 = V_MUL_F16_E32 + V_MAC_F16 = V_MAC_F16_E32 + V_MADMK_F16 = V_MADMK_F16_E32 + V_MADAK_F16 = V_MADAK_F16_E32 + V_ADD_U16 = V_ADD_U16_E32 + V_SUB_U16 = V_SUB_U16_E32 + V_SUBREV_U16 = V_SUBREV_U16_E32 + V_MUL_LO_U16 = V_MUL_LO_U16_E32 + V_LSHLREV_B16 = V_LSHLREV_B16_E32 + V_LSHRREV_B16 = V_LSHRREV_B16_E32 + V_ASHRREV_I16 = V_ASHRREV_I16_E32 + V_MAX_F16 = V_MAX_F16_E32 + V_MIN_F16 = V_MIN_F16_E32 + V_MAX_U16 = V_MAX_U16_E32 + V_MAX_I16 = V_MAX_I16_E32 + V_MIN_U16 = V_MIN_U16_E32 + V_MIN_I16 = V_MIN_I16_E32 + V_LDEXP_F16 = V_LDEXP_F16_E32 + V_ADD_U32 = V_ADD_U32_E32 + V_SUB_U32 = V_SUB_U32_E32 + V_SUBREV_U32 = V_SUBREV_U32_E32 + V_DOT2C_F32_F16 = V_DOT2C_F32_F16_E32 + V_DOT2C_I32_I16 = V_DOT2C_I32_I16_E32 + V_DOT4C_I32_I8 = V_DOT4C_I32_I8_E32 + V_DOT8C_I32_I4 = V_DOT8C_I32_I4_E32 + V_FMAC_F32 = V_FMAC_F32_E32 + V_PK_FMAC_F16 = V_PK_FMAC_F16_E32 + V_XNOR_B32 = V_XNOR_B32_E32 + +class VOP3Op(ReprEnum): + V_CMP_CLASS_F32_E64 = 16 + V_CMPX_CLASS_F32_E64 = 17 + V_CMP_CLASS_F64_E64 = 18 + V_CMPX_CLASS_F64_E64 = 19 + V_CMP_CLASS_F16_E64 = 20 + V_CMPX_CLASS_F16_E64 = 21 + V_CMP_F_F16_E64 = 32 + V_CMP_LT_F16_E64 = 33 + V_CMP_EQ_F16_E64 = 34 + V_CMP_LE_F16_E64 = 35 + V_CMP_GT_F16_E64 = 36 + V_CMP_LG_F16_E64 = 37 + V_CMP_GE_F16_E64 = 38 + V_CMP_O_F16_E64 = 39 + V_CMP_U_F16_E64 = 40 + V_CMP_NGE_F16_E64 = 41 + V_CMP_NLG_F16_E64 = 42 + V_CMP_NGT_F16_E64 = 43 + V_CMP_NLE_F16_E64 = 44 + V_CMP_NEQ_F16_E64 = 45 + V_CMP_NLT_F16_E64 = 46 + V_CMP_TRU_F16_E64 = 47 + V_CMPX_F_F16_E64 = 48 + V_CMPX_LT_F16_E64 = 49 + V_CMPX_EQ_F16_E64 = 50 + V_CMPX_LE_F16_E64 = 51 + V_CMPX_GT_F16_E64 = 52 + V_CMPX_LG_F16_E64 = 53 + V_CMPX_GE_F16_E64 = 54 + V_CMPX_O_F16_E64 = 55 + V_CMPX_U_F16_E64 = 56 + V_CMPX_NGE_F16_E64 = 57 + V_CMPX_NLG_F16_E64 = 58 + V_CMPX_NGT_F16_E64 = 59 + V_CMPX_NLE_F16_E64 = 60 + V_CMPX_NEQ_F16_E64 = 61 + V_CMPX_NLT_F16_E64 = 62 + V_CMPX_TRU_F16_E64 = 63 + V_CMP_F_F32_E64 = 64 + V_CMP_LT_F32_E64 = 65 + V_CMP_EQ_F32_E64 = 66 + V_CMP_LE_F32_E64 = 67 + V_CMP_GT_F32_E64 = 68 + V_CMP_LG_F32_E64 = 69 + V_CMP_GE_F32_E64 = 70 + V_CMP_O_F32_E64 = 71 + V_CMP_U_F32_E64 = 72 + V_CMP_NGE_F32_E64 = 73 + V_CMP_NLG_F32_E64 = 74 + V_CMP_NGT_F32_E64 = 75 + V_CMP_NLE_F32_E64 = 76 + V_CMP_NEQ_F32_E64 = 77 + V_CMP_NLT_F32_E64 = 78 + V_CMP_TRU_F32_E64 = 79 + V_CMPX_F_F32_E64 = 80 + V_CMPX_LT_F32_E64 = 81 + V_CMPX_EQ_F32_E64 = 82 + V_CMPX_LE_F32_E64 = 83 + V_CMPX_GT_F32_E64 = 84 + V_CMPX_LG_F32_E64 = 85 + V_CMPX_GE_F32_E64 = 86 + V_CMPX_O_F32_E64 = 87 + V_CMPX_U_F32_E64 = 88 + V_CMPX_NGE_F32_E64 = 89 + V_CMPX_NLG_F32_E64 = 90 + V_CMPX_NGT_F32_E64 = 91 + V_CMPX_NLE_F32_E64 = 92 + V_CMPX_NEQ_F32_E64 = 93 + V_CMPX_NLT_F32_E64 = 94 + V_CMPX_TRU_F32_E64 = 95 + V_CMP_F_F64_E64 = 96 + V_CMP_LT_F64_E64 = 97 + V_CMP_EQ_F64_E64 = 98 + V_CMP_LE_F64_E64 = 99 + V_CMP_GT_F64_E64 = 100 + V_CMP_LG_F64_E64 = 101 + V_CMP_GE_F64_E64 = 102 + V_CMP_O_F64_E64 = 103 + V_CMP_U_F64_E64 = 104 + V_CMP_NGE_F64_E64 = 105 + V_CMP_NLG_F64_E64 = 106 + V_CMP_NGT_F64_E64 = 107 + V_CMP_NLE_F64_E64 = 108 + V_CMP_NEQ_F64_E64 = 109 + V_CMP_NLT_F64_E64 = 110 + V_CMP_TRU_F64_E64 = 111 + V_CMPX_F_F64_E64 = 112 + V_CMPX_LT_F64_E64 = 113 + V_CMPX_EQ_F64_E64 = 114 + V_CMPX_LE_F64_E64 = 115 + V_CMPX_GT_F64_E64 = 116 + V_CMPX_LG_F64_E64 = 117 + V_CMPX_GE_F64_E64 = 118 + V_CMPX_O_F64_E64 = 119 + V_CMPX_U_F64_E64 = 120 + V_CMPX_NGE_F64_E64 = 121 + V_CMPX_NLG_F64_E64 = 122 + V_CMPX_NGT_F64_E64 = 123 + V_CMPX_NLE_F64_E64 = 124 + V_CMPX_NEQ_F64_E64 = 125 + V_CMPX_NLT_F64_E64 = 126 + V_CMPX_TRU_F64_E64 = 127 + V_CMP_F_I16_E64 = 160 + V_CMP_LT_I16_E64 = 161 + V_CMP_EQ_I16_E64 = 162 + V_CMP_LE_I16_E64 = 163 + V_CMP_GT_I16_E64 = 164 + V_CMP_NE_I16_E64 = 165 + V_CMP_GE_I16_E64 = 166 + V_CMP_T_I16_E64 = 167 + V_CMP_F_U16_E64 = 168 + V_CMP_LT_U16_E64 = 169 + V_CMP_EQ_U16_E64 = 170 + V_CMP_LE_U16_E64 = 171 + V_CMP_GT_U16_E64 = 172 + V_CMP_NE_U16_E64 = 173 + V_CMP_GE_U16_E64 = 174 + V_CMP_T_U16_E64 = 175 + V_CMPX_F_I16_E64 = 176 + V_CMPX_LT_I16_E64 = 177 + V_CMPX_EQ_I16_E64 = 178 + V_CMPX_LE_I16_E64 = 179 + V_CMPX_GT_I16_E64 = 180 + V_CMPX_NE_I16_E64 = 181 + V_CMPX_GE_I16_E64 = 182 + V_CMPX_T_I16_E64 = 183 + V_CMPX_F_U16_E64 = 184 + V_CMPX_LT_U16_E64 = 185 + V_CMPX_EQ_U16_E64 = 186 + V_CMPX_LE_U16_E64 = 187 + V_CMPX_GT_U16_E64 = 188 + V_CMPX_NE_U16_E64 = 189 + V_CMPX_GE_U16_E64 = 190 + V_CMPX_T_U16_E64 = 191 + V_CMP_F_I32_E64 = 192 + V_CMP_LT_I32_E64 = 193 + V_CMP_EQ_I32_E64 = 194 + V_CMP_LE_I32_E64 = 195 + V_CMP_GT_I32_E64 = 196 + V_CMP_NE_I32_E64 = 197 + V_CMP_GE_I32_E64 = 198 + V_CMP_T_I32_E64 = 199 + V_CMP_F_U32_E64 = 200 + V_CMP_LT_U32_E64 = 201 + V_CMP_EQ_U32_E64 = 202 + V_CMP_LE_U32_E64 = 203 + V_CMP_GT_U32_E64 = 204 + V_CMP_NE_U32_E64 = 205 + V_CMP_GE_U32_E64 = 206 + V_CMP_T_U32_E64 = 207 + V_CMPX_F_I32_E64 = 208 + V_CMPX_LT_I32_E64 = 209 + V_CMPX_EQ_I32_E64 = 210 + V_CMPX_LE_I32_E64 = 211 + V_CMPX_GT_I32_E64 = 212 + V_CMPX_NE_I32_E64 = 213 + V_CMPX_GE_I32_E64 = 214 + V_CMPX_T_I32_E64 = 215 + V_CMPX_F_U32_E64 = 216 + V_CMPX_LT_U32_E64 = 217 + V_CMPX_EQ_U32_E64 = 218 + V_CMPX_LE_U32_E64 = 219 + V_CMPX_GT_U32_E64 = 220 + V_CMPX_NE_U32_E64 = 221 + V_CMPX_GE_U32_E64 = 222 + V_CMPX_T_U32_E64 = 223 + V_CMP_F_I64_E64 = 224 + V_CMP_LT_I64_E64 = 225 + V_CMP_EQ_I64_E64 = 226 + V_CMP_LE_I64_E64 = 227 + V_CMP_GT_I64_E64 = 228 + V_CMP_NE_I64_E64 = 229 + V_CMP_GE_I64_E64 = 230 + V_CMP_T_I64_E64 = 231 + V_CMP_F_U64_E64 = 232 + V_CMP_LT_U64_E64 = 233 + V_CMP_EQ_U64_E64 = 234 + V_CMP_LE_U64_E64 = 235 + V_CMP_GT_U64_E64 = 236 + V_CMP_NE_U64_E64 = 237 + V_CMP_GE_U64_E64 = 238 + V_CMP_T_U64_E64 = 239 + V_CMPX_F_I64_E64 = 240 + V_CMPX_LT_I64_E64 = 241 + V_CMPX_EQ_I64_E64 = 242 + V_CMPX_LE_I64_E64 = 243 + V_CMPX_GT_I64_E64 = 244 + V_CMPX_NE_I64_E64 = 245 + V_CMPX_GE_I64_E64 = 246 + V_CMPX_T_I64_E64 = 247 + V_CMPX_F_U64_E64 = 248 + V_CMPX_LT_U64_E64 = 249 + V_CMPX_EQ_U64_E64 = 250 + V_CMPX_LE_U64_E64 = 251 + V_CMPX_GT_U64_E64 = 252 + V_CMPX_NE_U64_E64 = 253 + V_CMPX_GE_U64_E64 = 254 + V_CMPX_T_U64_E64 = 255 + V_CNDMASK_B32_E64 = 256 + V_ADD_F32_E64 = 257 + V_SUB_F32_E64 = 258 + V_SUBREV_F32_E64 = 259 + V_FMAC_F64_E64 = 260 + V_MUL_F32_E64 = 261 + V_MUL_I32_I24_E64 = 262 + V_MUL_HI_I32_I24_E64 = 263 + V_MUL_U32_U24_E64 = 264 + V_MUL_HI_U32_U24_E64 = 265 + V_MIN_F32_E64 = 266 + V_MAX_F32_E64 = 267 + V_MIN_I32_E64 = 268 + V_MAX_I32_E64 = 269 + V_MIN_U32_E64 = 270 + V_MAX_U32_E64 = 271 + V_LSHRREV_B32_E64 = 272 + V_ASHRREV_I32_E64 = 273 + V_LSHLREV_B32_E64 = 274 + V_AND_B32_E64 = 275 + V_OR_B32_E64 = 276 + V_XOR_B32_E64 = 277 + V_DOT2C_F32_BF16_E64 = 278 + V_ADD_F16_E64 = 287 + V_SUB_F16_E64 = 288 + V_SUBREV_F16_E64 = 289 + V_MUL_F16_E64 = 290 + V_MAC_F16_E64 = 291 + V_ADD_U16_E64 = 294 + V_SUB_U16_E64 = 295 + V_SUBREV_U16_E64 = 296 + V_MUL_LO_U16_E64 = 297 + V_LSHLREV_B16_E64 = 298 + V_LSHRREV_B16_E64 = 299 + V_ASHRREV_I16_E64 = 300 + V_MAX_F16_E64 = 301 + V_MIN_F16_E64 = 302 + V_MAX_U16_E64 = 303 + V_MAX_I16_E64 = 304 + V_MIN_U16_E64 = 305 + V_MIN_I16_E64 = 306 + V_LDEXP_F16_E64 = 307 + V_ADD_U32_E64 = 308 + V_SUB_U32_E64 = 309 + V_SUBREV_U32_E64 = 310 + V_DOT2C_F32_F16_E64 = 311 + V_DOT2C_I32_I16_E64 = 312 + V_DOT4C_I32_I8_E64 = 313 + V_DOT8C_I32_I4_E64 = 314 + V_FMAC_F32_E64 = 315 + V_PK_FMAC_F16_E64 = 316 + V_XNOR_B32_E64 = 317 + V_NOP_E64 = 320 + V_MOV_B32_E64 = 321 + V_READFIRSTLANE_B32_E64 = 322 + V_CVT_I32_F64_E64 = 323 + V_CVT_F64_I32_E64 = 324 + V_CVT_F32_I32_E64 = 325 + V_CVT_F32_U32_E64 = 326 + V_CVT_U32_F32_E64 = 327 + V_CVT_I32_F32_E64 = 328 + V_CVT_F16_F32_E64 = 330 + V_CVT_F32_F16_E64 = 331 + V_CVT_RPI_I32_F32_E64 = 332 + V_CVT_FLR_I32_F32_E64 = 333 + V_CVT_OFF_F32_I4_E64 = 334 + V_CVT_F32_F64_E64 = 335 + V_CVT_F64_F32_E64 = 336 + V_CVT_F32_UBYTE0_E64 = 337 + V_CVT_F32_UBYTE1_E64 = 338 + V_CVT_F32_UBYTE2_E64 = 339 + V_CVT_F32_UBYTE3_E64 = 340 + V_CVT_U32_F64_E64 = 341 + V_CVT_F64_U32_E64 = 342 + V_TRUNC_F64_E64 = 343 + V_CEIL_F64_E64 = 344 + V_RNDNE_F64_E64 = 345 + V_FLOOR_F64_E64 = 346 + V_FRACT_F32_E64 = 347 + V_TRUNC_F32_E64 = 348 + V_CEIL_F32_E64 = 349 + V_RNDNE_F32_E64 = 350 + V_FLOOR_F32_E64 = 351 + V_EXP_F32_E64 = 352 + V_LOG_F32_E64 = 353 + V_RCP_F32_E64 = 354 + V_RCP_IFLAG_F32_E64 = 355 + V_RSQ_F32_E64 = 356 + V_RCP_F64_E64 = 357 + V_RSQ_F64_E64 = 358 + V_SQRT_F32_E64 = 359 + V_SQRT_F64_E64 = 360 + V_SIN_F32_E64 = 361 + V_COS_F32_E64 = 362 + V_NOT_B32_E64 = 363 + V_BFREV_B32_E64 = 364 + V_FFBH_U32_E64 = 365 + V_FFBL_B32_E64 = 366 + V_FFBH_I32_E64 = 367 + V_FREXP_EXP_I32_F64_E64 = 368 + V_FREXP_MANT_F64_E64 = 369 + V_FRACT_F64_E64 = 370 + V_FREXP_EXP_I32_F32_E64 = 371 + V_FREXP_MANT_F32_E64 = 372 + V_CLREXCP_E64 = 373 + V_SCREEN_PARTITION_4SE_B32_E64 = 375 + V_MOV_B64_E64 = 376 + V_CVT_F16_U16_E64 = 377 + V_CVT_F16_I16_E64 = 378 + V_CVT_U16_F16_E64 = 379 + V_CVT_I16_F16_E64 = 380 + V_RCP_F16_E64 = 381 + V_SQRT_F16_E64 = 382 + V_RSQ_F16_E64 = 383 + V_LOG_F16_E64 = 384 + V_EXP_F16_E64 = 385 + V_FREXP_MANT_F16_E64 = 386 + V_FREXP_EXP_I16_F16_E64 = 387 + V_FLOOR_F16_E64 = 388 + V_CEIL_F16_E64 = 389 + V_TRUNC_F16_E64 = 390 + V_RNDNE_F16_E64 = 391 + V_FRACT_F16_E64 = 392 + V_SIN_F16_E64 = 393 + V_COS_F16_E64 = 394 + V_EXP_LEGACY_F32_E64 = 395 + V_LOG_LEGACY_F32_E64 = 396 + V_CVT_NORM_I16_F16_E64 = 397 + V_CVT_NORM_U16_F16_E64 = 398 + V_SAT_PK_U8_I16_E64 = 399 + V_SWAP_B32_E64 = 401 + V_ACCVGPR_MOV_B32_E64 = 402 + V_CVT_F32_FP8_E64 = 404 + V_CVT_F32_BF8_E64 = 405 + V_CVT_PK_F32_FP8_E64 = 406 + V_CVT_PK_F32_BF8_E64 = 407 + V_PRNG_B32_E64 = 408 + V_PERMLANE16_SWAP_B32_E64 = 409 + V_PERMLANE32_SWAP_B32_E64 = 410 + V_CVT_F32_BF16_E64 = 411 + V_MAD_I32_I24_E64 = 450 + V_MAD_U32_U24_E64 = 451 + V_CUBEID_F32_E64 = 452 + V_CUBESC_F32_E64 = 453 + V_CUBETC_F32_E64 = 454 + V_CUBEMA_F32_E64 = 455 + V_BFE_U32_E64 = 456 + V_BFE_I32_E64 = 457 + V_BFI_B32_E64 = 458 + V_FMA_F32_E64 = 459 + V_FMA_F64_E64 = 460 + V_LERP_U8_E64 = 461 + V_ALIGNBIT_B32_E64 = 462 + V_ALIGNBYTE_B32_E64 = 463 + V_MIN3_F32_E64 = 464 + V_MIN3_I32_E64 = 465 + V_MIN3_U32_E64 = 466 + V_MAX3_F32_E64 = 467 + V_MAX3_I32_E64 = 468 + V_MAX3_U32_E64 = 469 + V_MED3_F32_E64 = 470 + V_MED3_I32_E64 = 471 + V_MED3_U32_E64 = 472 + V_SAD_U8_E64 = 473 + V_SAD_HI_U8_E64 = 474 + V_SAD_U16_E64 = 475 + V_SAD_U32_E64 = 476 + V_CVT_PK_U8_F32_E64 = 477 + V_DIV_FIXUP_F32_E64 = 478 + V_DIV_FIXUP_F64_E64 = 479 + V_DIV_FMAS_F32_E64 = 482 + V_DIV_FMAS_F64_E64 = 483 + V_MSAD_U8_E64 = 484 + V_QSAD_PK_U16_U8_E64 = 485 + V_MQSAD_PK_U16_U8_E64 = 486 + V_MQSAD_U32_U8_E64 = 487 + V_MAD_LEGACY_F16_E64 = 490 + V_MAD_LEGACY_U16_E64 = 491 + V_MAD_LEGACY_I16_E64 = 492 + V_PERM_B32_E64 = 493 + V_FMA_LEGACY_F16_E64 = 494 + V_DIV_FIXUP_LEGACY_F16_E64 = 495 + V_CVT_PKACCUM_U8_F32_E64 = 496 + V_MAD_U32_U16_E64 = 497 + V_MAD_I32_I16_E64 = 498 + V_XAD_U32_E64 = 499 + V_MIN3_F16_E64 = 500 + V_MIN3_I16_E64 = 501 + V_MIN3_U16_E64 = 502 + V_MAX3_F16_E64 = 503 + V_MAX3_I16_E64 = 504 + V_MAX3_U16_E64 = 505 + V_MED3_F16_E64 = 506 + V_MED3_I16_E64 = 507 + V_MED3_U16_E64 = 508 + V_LSHL_ADD_U32_E64 = 509 + V_ADD_LSHL_U32_E64 = 510 + V_ADD3_U32_E64 = 511 + V_LSHL_OR_B32 = 512 + V_AND_OR_B32 = 513 + V_OR3_B32 = 514 + V_MAD_F16 = 515 + V_MAD_U16 = 516 + V_MAD_I16 = 517 + V_FMA_F16 = 518 + V_DIV_FIXUP_F16 = 519 + V_LSHL_ADD_U64 = 520 + V_BITOP3_B16 = 563 + V_BITOP3_B32 = 564 + V_CVT_SCALEF32_PK_FP8_F32 = 565 + V_CVT_SCALEF32_PK_BF8_F32 = 566 + V_CVT_SCALEF32_SR_FP8_F32 = 567 + V_CVT_SCALEF32_SR_BF8_F32 = 568 + V_CVT_SCALEF32_PK_F32_FP8 = 569 + V_CVT_SCALEF32_PK_F32_BF8 = 570 + V_CVT_SCALEF32_F32_FP8 = 571 + V_CVT_SCALEF32_F32_BF8 = 572 + V_CVT_SCALEF32_PK_FP4_F32 = 573 + V_CVT_SCALEF32_SR_PK_FP4_F32 = 574 + V_CVT_SCALEF32_PK_F32_FP4 = 575 + V_CVT_SCALEF32_PK_FP8_F16 = 576 + V_CVT_SCALEF32_PK_BF8_F16 = 577 + V_CVT_SCALEF32_SR_FP8_F16 = 578 + V_CVT_SCALEF32_SR_BF8_F16 = 579 + V_CVT_SCALEF32_PK_FP8_BF16 = 580 + V_CVT_SCALEF32_PK_BF8_BF16 = 581 + V_CVT_SCALEF32_SR_FP8_BF16 = 582 + V_CVT_SCALEF32_SR_BF8_BF16 = 583 + V_CVT_SCALEF32_PK_F16_FP8 = 584 + V_CVT_SCALEF32_PK_F16_BF8 = 585 + V_CVT_SCALEF32_F16_FP8 = 586 + V_CVT_SCALEF32_F16_BF8 = 587 + V_CVT_SCALEF32_PK_FP4_F16 = 588 + V_CVT_SCALEF32_PK_FP4_BF16 = 589 + V_CVT_SCALEF32_SR_PK_FP4_F16 = 590 + V_CVT_SCALEF32_SR_PK_FP4_BF16 = 591 + V_CVT_SCALEF32_PK_F16_FP4 = 592 + V_CVT_SCALEF32_PK_BF16_FP4 = 593 + V_CVT_SCALEF32_2XPK16_FP6_F32 = 594 + V_CVT_SCALEF32_2XPK16_BF6_F32 = 595 + V_CVT_SCALEF32_SR_PK32_FP6_F32 = 596 + V_CVT_SCALEF32_SR_PK32_BF6_F32 = 597 + V_CVT_SCALEF32_PK32_F32_FP6 = 598 + V_CVT_SCALEF32_PK32_F32_BF6 = 599 + V_CVT_SCALEF32_PK32_FP6_F16 = 600 + V_CVT_SCALEF32_PK32_FP6_BF16 = 601 + V_CVT_SCALEF32_PK32_BF6_F16 = 602 + V_CVT_SCALEF32_PK32_BF6_BF16 = 603 + V_CVT_SCALEF32_SR_PK32_FP6_F16 = 604 + V_CVT_SCALEF32_SR_PK32_FP6_BF16 = 605 + V_CVT_SCALEF32_SR_PK32_BF6_F16 = 606 + V_CVT_SCALEF32_SR_PK32_BF6_BF16 = 607 + V_CVT_SCALEF32_PK32_F16_FP6 = 608 + V_CVT_SCALEF32_PK32_BF16_FP6 = 609 + V_CVT_SCALEF32_PK32_F16_BF6 = 610 + V_CVT_SCALEF32_PK32_BF16_BF6 = 611 + V_ASHR_PK_I8_I32 = 613 + V_ASHR_PK_U8_I32 = 614 + V_CVT_PK_F16_F32 = 615 + V_CVT_PK_BF16_F32 = 616 + V_CVT_SCALEF32_PK_BF16_FP8 = 617 + V_CVT_SCALEF32_PK_BF16_BF8 = 618 + V_ADD_F64 = 640 + V_MUL_F64 = 641 + V_MIN_F64 = 642 + V_MAX_F64 = 643 + V_LDEXP_F64 = 644 + V_MUL_LO_U32 = 645 + V_MUL_HI_U32 = 646 + V_MUL_HI_I32 = 647 + V_LDEXP_F32 = 648 + V_READLANE_B32 = 649 + V_WRITELANE_B32 = 650 + V_BCNT_U32_B32 = 651 + V_MBCNT_LO_U32_B32 = 652 + V_MBCNT_HI_U32_B32 = 653 + V_LSHLREV_B64 = 655 + V_LSHRREV_B64 = 656 + V_ASHRREV_I64 = 657 + V_TRIG_PREOP_F64 = 658 + V_BFM_B32 = 659 + V_CVT_PKNORM_I16_F32 = 660 + V_CVT_PKNORM_U16_F32 = 661 + V_CVT_PKRTZ_F16_F32 = 662 + V_CVT_PK_U16_U32 = 663 + V_CVT_PK_I16_I32 = 664 + V_CVT_PKNORM_I16_F16 = 665 + V_CVT_PKNORM_U16_F16 = 666 + V_ADD_I32 = 668 + V_SUB_I32 = 669 + V_ADD_I16 = 670 + V_SUB_I16 = 671 + V_PACK_B32_F16 = 672 + V_MUL_LEGACY_F32 = 673 + V_CVT_PK_FP8_F32 = 674 + V_CVT_PK_BF8_F32 = 675 + V_CVT_SR_FP8_F32 = 676 + V_CVT_SR_BF8_F32 = 677 + V_CVT_SR_F16_F32 = 678 + V_CVT_SR_BF16_F32 = 679 + V_MINIMUM3_F32 = 680 + V_MAXIMUM3_F32 = 681 + V_CMP_CLASS_F32 = V_CMP_CLASS_F32_E64 + V_CMPX_CLASS_F32 = V_CMPX_CLASS_F32_E64 + V_CMP_CLASS_F64 = V_CMP_CLASS_F64_E64 + V_CMPX_CLASS_F64 = V_CMPX_CLASS_F64_E64 + V_CMP_CLASS_F16 = V_CMP_CLASS_F16_E64 + V_CMPX_CLASS_F16 = V_CMPX_CLASS_F16_E64 + V_CMP_F_F16 = V_CMP_F_F16_E64 + V_CMP_LT_F16 = V_CMP_LT_F16_E64 + V_CMP_EQ_F16 = V_CMP_EQ_F16_E64 + V_CMP_LE_F16 = V_CMP_LE_F16_E64 + V_CMP_GT_F16 = V_CMP_GT_F16_E64 + V_CMP_LG_F16 = V_CMP_LG_F16_E64 + V_CMP_GE_F16 = V_CMP_GE_F16_E64 + V_CMP_O_F16 = V_CMP_O_F16_E64 + V_CMP_U_F16 = V_CMP_U_F16_E64 + V_CMP_NGE_F16 = V_CMP_NGE_F16_E64 + V_CMP_NLG_F16 = V_CMP_NLG_F16_E64 + V_CMP_NGT_F16 = V_CMP_NGT_F16_E64 + V_CMP_NLE_F16 = V_CMP_NLE_F16_E64 + V_CMP_NEQ_F16 = V_CMP_NEQ_F16_E64 + V_CMP_NLT_F16 = V_CMP_NLT_F16_E64 + V_CMP_TRU_F16 = V_CMP_TRU_F16_E64 + V_CMPX_F_F16 = V_CMPX_F_F16_E64 + V_CMPX_LT_F16 = V_CMPX_LT_F16_E64 + V_CMPX_EQ_F16 = V_CMPX_EQ_F16_E64 + V_CMPX_LE_F16 = V_CMPX_LE_F16_E64 + V_CMPX_GT_F16 = V_CMPX_GT_F16_E64 + V_CMPX_LG_F16 = V_CMPX_LG_F16_E64 + V_CMPX_GE_F16 = V_CMPX_GE_F16_E64 + V_CMPX_O_F16 = V_CMPX_O_F16_E64 + V_CMPX_U_F16 = V_CMPX_U_F16_E64 + V_CMPX_NGE_F16 = V_CMPX_NGE_F16_E64 + V_CMPX_NLG_F16 = V_CMPX_NLG_F16_E64 + V_CMPX_NGT_F16 = V_CMPX_NGT_F16_E64 + V_CMPX_NLE_F16 = V_CMPX_NLE_F16_E64 + V_CMPX_NEQ_F16 = V_CMPX_NEQ_F16_E64 + V_CMPX_NLT_F16 = V_CMPX_NLT_F16_E64 + V_CMPX_TRU_F16 = V_CMPX_TRU_F16_E64 + V_CMP_F_F32 = V_CMP_F_F32_E64 + V_CMP_LT_F32 = V_CMP_LT_F32_E64 + V_CMP_EQ_F32 = V_CMP_EQ_F32_E64 + V_CMP_LE_F32 = V_CMP_LE_F32_E64 + V_CMP_GT_F32 = V_CMP_GT_F32_E64 + V_CMP_LG_F32 = V_CMP_LG_F32_E64 + V_CMP_GE_F32 = V_CMP_GE_F32_E64 + V_CMP_O_F32 = V_CMP_O_F32_E64 + V_CMP_U_F32 = V_CMP_U_F32_E64 + V_CMP_NGE_F32 = V_CMP_NGE_F32_E64 + V_CMP_NLG_F32 = V_CMP_NLG_F32_E64 + V_CMP_NGT_F32 = V_CMP_NGT_F32_E64 + V_CMP_NLE_F32 = V_CMP_NLE_F32_E64 + V_CMP_NEQ_F32 = V_CMP_NEQ_F32_E64 + V_CMP_NLT_F32 = V_CMP_NLT_F32_E64 + V_CMP_TRU_F32 = V_CMP_TRU_F32_E64 + V_CMPX_F_F32 = V_CMPX_F_F32_E64 + V_CMPX_LT_F32 = V_CMPX_LT_F32_E64 + V_CMPX_EQ_F32 = V_CMPX_EQ_F32_E64 + V_CMPX_LE_F32 = V_CMPX_LE_F32_E64 + V_CMPX_GT_F32 = V_CMPX_GT_F32_E64 + V_CMPX_LG_F32 = V_CMPX_LG_F32_E64 + V_CMPX_GE_F32 = V_CMPX_GE_F32_E64 + V_CMPX_O_F32 = V_CMPX_O_F32_E64 + V_CMPX_U_F32 = V_CMPX_U_F32_E64 + V_CMPX_NGE_F32 = V_CMPX_NGE_F32_E64 + V_CMPX_NLG_F32 = V_CMPX_NLG_F32_E64 + V_CMPX_NGT_F32 = V_CMPX_NGT_F32_E64 + V_CMPX_NLE_F32 = V_CMPX_NLE_F32_E64 + V_CMPX_NEQ_F32 = V_CMPX_NEQ_F32_E64 + V_CMPX_NLT_F32 = V_CMPX_NLT_F32_E64 + V_CMPX_TRU_F32 = V_CMPX_TRU_F32_E64 + V_CMP_F_F64 = V_CMP_F_F64_E64 + V_CMP_LT_F64 = V_CMP_LT_F64_E64 + V_CMP_EQ_F64 = V_CMP_EQ_F64_E64 + V_CMP_LE_F64 = V_CMP_LE_F64_E64 + V_CMP_GT_F64 = V_CMP_GT_F64_E64 + V_CMP_LG_F64 = V_CMP_LG_F64_E64 + V_CMP_GE_F64 = V_CMP_GE_F64_E64 + V_CMP_O_F64 = V_CMP_O_F64_E64 + V_CMP_U_F64 = V_CMP_U_F64_E64 + V_CMP_NGE_F64 = V_CMP_NGE_F64_E64 + V_CMP_NLG_F64 = V_CMP_NLG_F64_E64 + V_CMP_NGT_F64 = V_CMP_NGT_F64_E64 + V_CMP_NLE_F64 = V_CMP_NLE_F64_E64 + V_CMP_NEQ_F64 = V_CMP_NEQ_F64_E64 + V_CMP_NLT_F64 = V_CMP_NLT_F64_E64 + V_CMP_TRU_F64 = V_CMP_TRU_F64_E64 + V_CMPX_F_F64 = V_CMPX_F_F64_E64 + V_CMPX_LT_F64 = V_CMPX_LT_F64_E64 + V_CMPX_EQ_F64 = V_CMPX_EQ_F64_E64 + V_CMPX_LE_F64 = V_CMPX_LE_F64_E64 + V_CMPX_GT_F64 = V_CMPX_GT_F64_E64 + V_CMPX_LG_F64 = V_CMPX_LG_F64_E64 + V_CMPX_GE_F64 = V_CMPX_GE_F64_E64 + V_CMPX_O_F64 = V_CMPX_O_F64_E64 + V_CMPX_U_F64 = V_CMPX_U_F64_E64 + V_CMPX_NGE_F64 = V_CMPX_NGE_F64_E64 + V_CMPX_NLG_F64 = V_CMPX_NLG_F64_E64 + V_CMPX_NGT_F64 = V_CMPX_NGT_F64_E64 + V_CMPX_NLE_F64 = V_CMPX_NLE_F64_E64 + V_CMPX_NEQ_F64 = V_CMPX_NEQ_F64_E64 + V_CMPX_NLT_F64 = V_CMPX_NLT_F64_E64 + V_CMPX_TRU_F64 = V_CMPX_TRU_F64_E64 + V_CMP_F_I16 = V_CMP_F_I16_E64 + V_CMP_LT_I16 = V_CMP_LT_I16_E64 + V_CMP_EQ_I16 = V_CMP_EQ_I16_E64 + V_CMP_LE_I16 = V_CMP_LE_I16_E64 + V_CMP_GT_I16 = V_CMP_GT_I16_E64 + V_CMP_NE_I16 = V_CMP_NE_I16_E64 + V_CMP_GE_I16 = V_CMP_GE_I16_E64 + V_CMP_T_I16 = V_CMP_T_I16_E64 + V_CMP_F_U16 = V_CMP_F_U16_E64 + V_CMP_LT_U16 = V_CMP_LT_U16_E64 + V_CMP_EQ_U16 = V_CMP_EQ_U16_E64 + V_CMP_LE_U16 = V_CMP_LE_U16_E64 + V_CMP_GT_U16 = V_CMP_GT_U16_E64 + V_CMP_NE_U16 = V_CMP_NE_U16_E64 + V_CMP_GE_U16 = V_CMP_GE_U16_E64 + V_CMP_T_U16 = V_CMP_T_U16_E64 + V_CMPX_F_I16 = V_CMPX_F_I16_E64 + V_CMPX_LT_I16 = V_CMPX_LT_I16_E64 + V_CMPX_EQ_I16 = V_CMPX_EQ_I16_E64 + V_CMPX_LE_I16 = V_CMPX_LE_I16_E64 + V_CMPX_GT_I16 = V_CMPX_GT_I16_E64 + V_CMPX_NE_I16 = V_CMPX_NE_I16_E64 + V_CMPX_GE_I16 = V_CMPX_GE_I16_E64 + V_CMPX_T_I16 = V_CMPX_T_I16_E64 + V_CMPX_F_U16 = V_CMPX_F_U16_E64 + V_CMPX_LT_U16 = V_CMPX_LT_U16_E64 + V_CMPX_EQ_U16 = V_CMPX_EQ_U16_E64 + V_CMPX_LE_U16 = V_CMPX_LE_U16_E64 + V_CMPX_GT_U16 = V_CMPX_GT_U16_E64 + V_CMPX_NE_U16 = V_CMPX_NE_U16_E64 + V_CMPX_GE_U16 = V_CMPX_GE_U16_E64 + V_CMPX_T_U16 = V_CMPX_T_U16_E64 + V_CMP_F_I32 = V_CMP_F_I32_E64 + V_CMP_LT_I32 = V_CMP_LT_I32_E64 + V_CMP_EQ_I32 = V_CMP_EQ_I32_E64 + V_CMP_LE_I32 = V_CMP_LE_I32_E64 + V_CMP_GT_I32 = V_CMP_GT_I32_E64 + V_CMP_NE_I32 = V_CMP_NE_I32_E64 + V_CMP_GE_I32 = V_CMP_GE_I32_E64 + V_CMP_T_I32 = V_CMP_T_I32_E64 + V_CMP_F_U32 = V_CMP_F_U32_E64 + V_CMP_LT_U32 = V_CMP_LT_U32_E64 + V_CMP_EQ_U32 = V_CMP_EQ_U32_E64 + V_CMP_LE_U32 = V_CMP_LE_U32_E64 + V_CMP_GT_U32 = V_CMP_GT_U32_E64 + V_CMP_NE_U32 = V_CMP_NE_U32_E64 + V_CMP_GE_U32 = V_CMP_GE_U32_E64 + V_CMP_T_U32 = V_CMP_T_U32_E64 + V_CMPX_F_I32 = V_CMPX_F_I32_E64 + V_CMPX_LT_I32 = V_CMPX_LT_I32_E64 + V_CMPX_EQ_I32 = V_CMPX_EQ_I32_E64 + V_CMPX_LE_I32 = V_CMPX_LE_I32_E64 + V_CMPX_GT_I32 = V_CMPX_GT_I32_E64 + V_CMPX_NE_I32 = V_CMPX_NE_I32_E64 + V_CMPX_GE_I32 = V_CMPX_GE_I32_E64 + V_CMPX_T_I32 = V_CMPX_T_I32_E64 + V_CMPX_F_U32 = V_CMPX_F_U32_E64 + V_CMPX_LT_U32 = V_CMPX_LT_U32_E64 + V_CMPX_EQ_U32 = V_CMPX_EQ_U32_E64 + V_CMPX_LE_U32 = V_CMPX_LE_U32_E64 + V_CMPX_GT_U32 = V_CMPX_GT_U32_E64 + V_CMPX_NE_U32 = V_CMPX_NE_U32_E64 + V_CMPX_GE_U32 = V_CMPX_GE_U32_E64 + V_CMPX_T_U32 = V_CMPX_T_U32_E64 + V_CMP_F_I64 = V_CMP_F_I64_E64 + V_CMP_LT_I64 = V_CMP_LT_I64_E64 + V_CMP_EQ_I64 = V_CMP_EQ_I64_E64 + V_CMP_LE_I64 = V_CMP_LE_I64_E64 + V_CMP_GT_I64 = V_CMP_GT_I64_E64 + V_CMP_NE_I64 = V_CMP_NE_I64_E64 + V_CMP_GE_I64 = V_CMP_GE_I64_E64 + V_CMP_T_I64 = V_CMP_T_I64_E64 + V_CMP_F_U64 = V_CMP_F_U64_E64 + V_CMP_LT_U64 = V_CMP_LT_U64_E64 + V_CMP_EQ_U64 = V_CMP_EQ_U64_E64 + V_CMP_LE_U64 = V_CMP_LE_U64_E64 + V_CMP_GT_U64 = V_CMP_GT_U64_E64 + V_CMP_NE_U64 = V_CMP_NE_U64_E64 + V_CMP_GE_U64 = V_CMP_GE_U64_E64 + V_CMP_T_U64 = V_CMP_T_U64_E64 + V_CMPX_F_I64 = V_CMPX_F_I64_E64 + V_CMPX_LT_I64 = V_CMPX_LT_I64_E64 + V_CMPX_EQ_I64 = V_CMPX_EQ_I64_E64 + V_CMPX_LE_I64 = V_CMPX_LE_I64_E64 + V_CMPX_GT_I64 = V_CMPX_GT_I64_E64 + V_CMPX_NE_I64 = V_CMPX_NE_I64_E64 + V_CMPX_GE_I64 = V_CMPX_GE_I64_E64 + V_CMPX_T_I64 = V_CMPX_T_I64_E64 + V_CMPX_F_U64 = V_CMPX_F_U64_E64 + V_CMPX_LT_U64 = V_CMPX_LT_U64_E64 + V_CMPX_EQ_U64 = V_CMPX_EQ_U64_E64 + V_CMPX_LE_U64 = V_CMPX_LE_U64_E64 + V_CMPX_GT_U64 = V_CMPX_GT_U64_E64 + V_CMPX_NE_U64 = V_CMPX_NE_U64_E64 + V_CMPX_GE_U64 = V_CMPX_GE_U64_E64 + V_CMPX_T_U64 = V_CMPX_T_U64_E64 + V_CNDMASK_B32 = V_CNDMASK_B32_E64 + V_ADD_F32 = V_ADD_F32_E64 + V_SUB_F32 = V_SUB_F32_E64 + V_SUBREV_F32 = V_SUBREV_F32_E64 + V_FMAC_F64 = V_FMAC_F64_E64 + V_MUL_F32 = V_MUL_F32_E64 + V_MUL_I32_I24 = V_MUL_I32_I24_E64 + V_MUL_HI_I32_I24 = V_MUL_HI_I32_I24_E64 + V_MUL_U32_U24 = V_MUL_U32_U24_E64 + V_MUL_HI_U32_U24 = V_MUL_HI_U32_U24_E64 + V_MIN_F32 = V_MIN_F32_E64 + V_MAX_F32 = V_MAX_F32_E64 + V_MIN_I32 = V_MIN_I32_E64 + V_MAX_I32 = V_MAX_I32_E64 + V_MIN_U32 = V_MIN_U32_E64 + V_MAX_U32 = V_MAX_U32_E64 + V_LSHRREV_B32 = V_LSHRREV_B32_E64 + V_ASHRREV_I32 = V_ASHRREV_I32_E64 + V_LSHLREV_B32 = V_LSHLREV_B32_E64 + V_AND_B32 = V_AND_B32_E64 + V_OR_B32 = V_OR_B32_E64 + V_XOR_B32 = V_XOR_B32_E64 + V_DOT2C_F32_BF16 = V_DOT2C_F32_BF16_E64 + V_ADD_F16 = V_ADD_F16_E64 + V_SUB_F16 = V_SUB_F16_E64 + V_SUBREV_F16 = V_SUBREV_F16_E64 + V_MUL_F16 = V_MUL_F16_E64 + V_MAC_F16 = V_MAC_F16_E64 + V_ADD_U16 = V_ADD_U16_E64 + V_SUB_U16 = V_SUB_U16_E64 + V_SUBREV_U16 = V_SUBREV_U16_E64 + V_MUL_LO_U16 = V_MUL_LO_U16_E64 + V_LSHLREV_B16 = V_LSHLREV_B16_E64 + V_LSHRREV_B16 = V_LSHRREV_B16_E64 + V_ASHRREV_I16 = V_ASHRREV_I16_E64 + V_MAX_F16 = V_MAX_F16_E64 + V_MIN_F16 = V_MIN_F16_E64 + V_MAX_U16 = V_MAX_U16_E64 + V_MAX_I16 = V_MAX_I16_E64 + V_MIN_U16 = V_MIN_U16_E64 + V_MIN_I16 = V_MIN_I16_E64 + V_LDEXP_F16 = V_LDEXP_F16_E64 + V_ADD_U32 = V_ADD_U32_E64 + V_SUB_U32 = V_SUB_U32_E64 + V_SUBREV_U32 = V_SUBREV_U32_E64 + V_DOT2C_F32_F16 = V_DOT2C_F32_F16_E64 + V_DOT2C_I32_I16 = V_DOT2C_I32_I16_E64 + V_DOT4C_I32_I8 = V_DOT4C_I32_I8_E64 + V_DOT8C_I32_I4 = V_DOT8C_I32_I4_E64 + V_FMAC_F32 = V_FMAC_F32_E64 + V_PK_FMAC_F16 = V_PK_FMAC_F16_E64 + V_XNOR_B32 = V_XNOR_B32_E64 + V_NOP = V_NOP_E64 + V_MOV_B32 = V_MOV_B32_E64 + V_READFIRSTLANE_B32 = V_READFIRSTLANE_B32_E64 + V_CVT_I32_F64 = V_CVT_I32_F64_E64 + V_CVT_F64_I32 = V_CVT_F64_I32_E64 + V_CVT_F32_I32 = V_CVT_F32_I32_E64 + V_CVT_F32_U32 = V_CVT_F32_U32_E64 + V_CVT_U32_F32 = V_CVT_U32_F32_E64 + V_CVT_I32_F32 = V_CVT_I32_F32_E64 + V_CVT_F16_F32 = V_CVT_F16_F32_E64 + V_CVT_F32_F16 = V_CVT_F32_F16_E64 + V_CVT_RPI_I32_F32 = V_CVT_RPI_I32_F32_E64 + V_CVT_FLR_I32_F32 = V_CVT_FLR_I32_F32_E64 + V_CVT_OFF_F32_I4 = V_CVT_OFF_F32_I4_E64 + V_CVT_F32_F64 = V_CVT_F32_F64_E64 + V_CVT_F64_F32 = V_CVT_F64_F32_E64 + V_CVT_F32_UBYTE0 = V_CVT_F32_UBYTE0_E64 + V_CVT_F32_UBYTE1 = V_CVT_F32_UBYTE1_E64 + V_CVT_F32_UBYTE2 = V_CVT_F32_UBYTE2_E64 + V_CVT_F32_UBYTE3 = V_CVT_F32_UBYTE3_E64 + V_CVT_U32_F64 = V_CVT_U32_F64_E64 + V_CVT_F64_U32 = V_CVT_F64_U32_E64 + V_TRUNC_F64 = V_TRUNC_F64_E64 + V_CEIL_F64 = V_CEIL_F64_E64 + V_RNDNE_F64 = V_RNDNE_F64_E64 + V_FLOOR_F64 = V_FLOOR_F64_E64 + V_FRACT_F32 = V_FRACT_F32_E64 + V_TRUNC_F32 = V_TRUNC_F32_E64 + V_CEIL_F32 = V_CEIL_F32_E64 + V_RNDNE_F32 = V_RNDNE_F32_E64 + V_FLOOR_F32 = V_FLOOR_F32_E64 + V_EXP_F32 = V_EXP_F32_E64 + V_LOG_F32 = V_LOG_F32_E64 + V_RCP_F32 = V_RCP_F32_E64 + V_RCP_IFLAG_F32 = V_RCP_IFLAG_F32_E64 + V_RSQ_F32 = V_RSQ_F32_E64 + V_RCP_F64 = V_RCP_F64_E64 + V_RSQ_F64 = V_RSQ_F64_E64 + V_SQRT_F32 = V_SQRT_F32_E64 + V_SQRT_F64 = V_SQRT_F64_E64 + V_SIN_F32 = V_SIN_F32_E64 + V_COS_F32 = V_COS_F32_E64 + V_NOT_B32 = V_NOT_B32_E64 + V_BFREV_B32 = V_BFREV_B32_E64 + V_FFBH_U32 = V_FFBH_U32_E64 + V_FFBL_B32 = V_FFBL_B32_E64 + V_FFBH_I32 = V_FFBH_I32_E64 + V_FREXP_EXP_I32_F64 = V_FREXP_EXP_I32_F64_E64 + V_FREXP_MANT_F64 = V_FREXP_MANT_F64_E64 + V_FRACT_F64 = V_FRACT_F64_E64 + V_FREXP_EXP_I32_F32 = V_FREXP_EXP_I32_F32_E64 + V_FREXP_MANT_F32 = V_FREXP_MANT_F32_E64 + V_CLREXCP = V_CLREXCP_E64 + V_SCREEN_PARTITION_4SE_B32 = V_SCREEN_PARTITION_4SE_B32_E64 + V_MOV_B64 = V_MOV_B64_E64 + V_CVT_F16_U16 = V_CVT_F16_U16_E64 + V_CVT_F16_I16 = V_CVT_F16_I16_E64 + V_CVT_U16_F16 = V_CVT_U16_F16_E64 + V_CVT_I16_F16 = V_CVT_I16_F16_E64 + V_RCP_F16 = V_RCP_F16_E64 + V_SQRT_F16 = V_SQRT_F16_E64 + V_RSQ_F16 = V_RSQ_F16_E64 + V_LOG_F16 = V_LOG_F16_E64 + V_EXP_F16 = V_EXP_F16_E64 + V_FREXP_MANT_F16 = V_FREXP_MANT_F16_E64 + V_FREXP_EXP_I16_F16 = V_FREXP_EXP_I16_F16_E64 + V_FLOOR_F16 = V_FLOOR_F16_E64 + V_CEIL_F16 = V_CEIL_F16_E64 + V_TRUNC_F16 = V_TRUNC_F16_E64 + V_RNDNE_F16 = V_RNDNE_F16_E64 + V_FRACT_F16 = V_FRACT_F16_E64 + V_SIN_F16 = V_SIN_F16_E64 + V_COS_F16 = V_COS_F16_E64 + V_EXP_LEGACY_F32 = V_EXP_LEGACY_F32_E64 + V_LOG_LEGACY_F32 = V_LOG_LEGACY_F32_E64 + V_CVT_NORM_I16_F16 = V_CVT_NORM_I16_F16_E64 + V_CVT_NORM_U16_F16 = V_CVT_NORM_U16_F16_E64 + V_SAT_PK_U8_I16 = V_SAT_PK_U8_I16_E64 + V_SWAP_B32 = V_SWAP_B32_E64 + V_ACCVGPR_MOV_B32 = V_ACCVGPR_MOV_B32_E64 + V_CVT_F32_FP8 = V_CVT_F32_FP8_E64 + V_CVT_F32_BF8 = V_CVT_F32_BF8_E64 + V_CVT_PK_F32_FP8 = V_CVT_PK_F32_FP8_E64 + V_CVT_PK_F32_BF8 = V_CVT_PK_F32_BF8_E64 + V_PRNG_B32 = V_PRNG_B32_E64 + V_PERMLANE16_SWAP_B32 = V_PERMLANE16_SWAP_B32_E64 + V_PERMLANE32_SWAP_B32 = V_PERMLANE32_SWAP_B32_E64 + V_CVT_F32_BF16 = V_CVT_F32_BF16_E64 + V_MAD_I32_I24 = V_MAD_I32_I24_E64 + V_MAD_U32_U24 = V_MAD_U32_U24_E64 + V_CUBEID_F32 = V_CUBEID_F32_E64 + V_CUBESC_F32 = V_CUBESC_F32_E64 + V_CUBETC_F32 = V_CUBETC_F32_E64 + V_CUBEMA_F32 = V_CUBEMA_F32_E64 + V_BFE_U32 = V_BFE_U32_E64 + V_BFE_I32 = V_BFE_I32_E64 + V_BFI_B32 = V_BFI_B32_E64 + V_FMA_F32 = V_FMA_F32_E64 + V_FMA_F64 = V_FMA_F64_E64 + V_LERP_U8 = V_LERP_U8_E64 + V_ALIGNBIT_B32 = V_ALIGNBIT_B32_E64 + V_ALIGNBYTE_B32 = V_ALIGNBYTE_B32_E64 + V_MIN3_F32 = V_MIN3_F32_E64 + V_MIN3_I32 = V_MIN3_I32_E64 + V_MIN3_U32 = V_MIN3_U32_E64 + V_MAX3_F32 = V_MAX3_F32_E64 + V_MAX3_I32 = V_MAX3_I32_E64 + V_MAX3_U32 = V_MAX3_U32_E64 + V_MED3_F32 = V_MED3_F32_E64 + V_MED3_I32 = V_MED3_I32_E64 + V_MED3_U32 = V_MED3_U32_E64 + V_SAD_U8 = V_SAD_U8_E64 + V_SAD_HI_U8 = V_SAD_HI_U8_E64 + V_SAD_U16 = V_SAD_U16_E64 + V_SAD_U32 = V_SAD_U32_E64 + V_CVT_PK_U8_F32 = V_CVT_PK_U8_F32_E64 + V_DIV_FIXUP_F32 = V_DIV_FIXUP_F32_E64 + V_DIV_FIXUP_F64 = V_DIV_FIXUP_F64_E64 + V_DIV_FMAS_F32 = V_DIV_FMAS_F32_E64 + V_DIV_FMAS_F64 = V_DIV_FMAS_F64_E64 + V_MSAD_U8 = V_MSAD_U8_E64 + V_QSAD_PK_U16_U8 = V_QSAD_PK_U16_U8_E64 + V_MQSAD_PK_U16_U8 = V_MQSAD_PK_U16_U8_E64 + V_MQSAD_U32_U8 = V_MQSAD_U32_U8_E64 + V_MAD_LEGACY_F16 = V_MAD_LEGACY_F16_E64 + V_MAD_LEGACY_U16 = V_MAD_LEGACY_U16_E64 + V_MAD_LEGACY_I16 = V_MAD_LEGACY_I16_E64 + V_PERM_B32 = V_PERM_B32_E64 + V_FMA_LEGACY_F16 = V_FMA_LEGACY_F16_E64 + V_DIV_FIXUP_LEGACY_F16 = V_DIV_FIXUP_LEGACY_F16_E64 + V_CVT_PKACCUM_U8_F32 = V_CVT_PKACCUM_U8_F32_E64 + V_MAD_U32_U16 = V_MAD_U32_U16_E64 + V_MAD_I32_I16 = V_MAD_I32_I16_E64 + V_XAD_U32 = V_XAD_U32_E64 + V_MIN3_F16 = V_MIN3_F16_E64 + V_MIN3_I16 = V_MIN3_I16_E64 + V_MIN3_U16 = V_MIN3_U16_E64 + V_MAX3_F16 = V_MAX3_F16_E64 + V_MAX3_I16 = V_MAX3_I16_E64 + V_MAX3_U16 = V_MAX3_U16_E64 + V_MED3_F16 = V_MED3_F16_E64 + V_MED3_I16 = V_MED3_I16_E64 + V_MED3_U16 = V_MED3_U16_E64 + V_LSHL_ADD_U32 = V_LSHL_ADD_U32_E64 + V_ADD_LSHL_U32 = V_ADD_LSHL_U32_E64 + V_ADD3_U32 = V_ADD3_U32_E64 + +class VOP3POp(ReprEnum): + V_PK_MAD_I16 = 0 + V_PK_MUL_LO_U16 = 1 + V_PK_ADD_I16 = 2 + V_PK_SUB_I16 = 3 + V_PK_LSHLREV_B16 = 4 + V_PK_LSHRREV_B16 = 5 + V_PK_ASHRREV_I16 = 6 + V_PK_MAX_I16 = 7 + V_PK_MIN_I16 = 8 + V_PK_MAD_U16 = 9 + V_PK_ADD_U16 = 10 + V_PK_SUB_U16 = 11 + V_PK_MAX_U16 = 12 + V_PK_MIN_U16 = 13 + V_PK_FMA_F16 = 14 + V_PK_ADD_F16 = 15 + V_PK_MUL_F16 = 16 + V_PK_MIN_F16 = 17 + V_PK_MAX_F16 = 18 + V_DOT2_F32_BF16 = 26 + V_PK_MINIMUM3_F16 = 27 + V_PK_MAXIMUM3_F16 = 28 + V_MAD_MIX_F32 = 32 + V_MAD_MIXLO_F16 = 33 + V_MAD_MIXHI_F16 = 34 + V_DOT2_F32_F16 = 35 + V_DOT2_I32_I16 = 38 + V_DOT2_U32_U16 = 39 + V_DOT4_I32_I8 = 40 + V_DOT4_U32_U8 = 41 + V_DOT8_I32_I4 = 42 + V_DOT8_U32_U4 = 43 + V_MFMA_LD_SCALE_B32 = 44 + V_MFMA_F32_16X16X128_F8F6F4 = 45 + V_MFMA_F32_32X32X64_F8F6F4 = 46 + V_PK_FMA_F32 = 48 + V_PK_MUL_F32 = 49 + V_PK_ADD_F32 = 50 + V_PK_MOV_B32 = 51 + V_MFMA_F32_16X16X32_BF16 = 53 + V_MFMA_I32_16X16X64_I8 = 54 + V_MFMA_F32_32X32X16_BF16 = 55 + V_MFMA_I32_32X32X32_I8 = 56 + V_SMFMAC_F32_16X16X64_BF16 = 57 + V_SMFMAC_I32_16X16X128_I8 = 58 + V_SMFMAC_F32_16X16X128_BF8_BF8 = 59 + V_SMFMAC_F32_16X16X128_BF8_FP8 = 60 + V_SMFMAC_F32_16X16X128_FP8_BF8 = 61 + V_MFMA_F32_16X16X8_XF32 = 62 + V_MFMA_F32_32X32X4_XF32 = 63 + V_MFMA_F32_32X32X1_2B_F32 = 64 + V_MFMA_F32_16X16X1_4B_F32 = 65 + V_MFMA_F32_4X4X1_16B_F32 = 66 + V_SMFMAC_F32_16X16X128_FP8_FP8 = 67 + V_MFMA_F32_32X32X2_F32 = 68 + V_MFMA_F32_16X16X4_F32 = 69 + V_SMFMAC_F32_32X32X32_BF16 = 70 + V_SMFMAC_I32_32X32X64_I8 = 71 + V_MFMA_F32_32X32X4_2B_F16 = 72 + V_MFMA_F32_16X16X4_4B_F16 = 73 + V_MFMA_F32_4X4X4_16B_F16 = 74 + V_SMFMAC_F32_32X32X64_BF8_BF8 = 75 + V_MFMA_F32_32X32X8_F16 = 76 + V_MFMA_F32_16X16X16_F16 = 77 + V_SMFMAC_F32_32X32X64_BF8_FP8 = 78 + V_SMFMAC_F32_32X32X64_FP8_BF8 = 79 + V_MFMA_I32_32X32X4_2B_I8 = 80 + V_MFMA_I32_16X16X4_4B_I8 = 81 + V_MFMA_I32_4X4X4_16B_I8 = 82 + V_SMFMAC_F32_32X32X64_FP8_FP8 = 83 + V_MFMA_F32_16X16X32_F16 = 84 + V_MFMA_F32_32X32X16_F16 = 85 + V_MFMA_I32_32X32X16_I8 = 86 + V_MFMA_I32_16X16X32_I8 = 87 + V_ACCVGPR_READ = 88 + V_ACCVGPR_WRITE = 89 + V_SMFMAC_F32_16X16X64_F16 = 90 + V_SMFMAC_F32_32X32X32_F16 = 91 + V_MFMA_F32_32X32X4_2B_BF16 = 93 + V_MFMA_F32_16X16X4_4B_BF16 = 94 + V_MFMA_F32_4X4X4_16B_BF16 = 95 + V_MFMA_F32_32X32X8_BF16 = 96 + V_MFMA_F32_16X16X16_BF16 = 97 + V_SMFMAC_F32_16X16X32_F16 = 98 + V_SMFMAC_F32_32X32X16_F16 = 100 + V_SMFMAC_F32_16X16X32_BF16 = 102 + V_SMFMAC_F32_32X32X16_BF16 = 104 + V_SMFMAC_I32_16X16X64_I8 = 106 + V_SMFMAC_I32_32X32X32_I8 = 108 + V_MFMA_F64_16X16X4_F64 = 110 + V_MFMA_F64_4X4X4_4B_F64 = 111 + V_MFMA_F32_16X16X32_BF8_BF8 = 112 + V_MFMA_F32_16X16X32_BF8_FP8 = 113 + V_MFMA_F32_16X16X32_FP8_BF8 = 114 + V_MFMA_F32_16X16X32_FP8_FP8 = 115 + V_MFMA_F32_32X32X16_BF8_BF8 = 116 + V_MFMA_F32_32X32X16_BF8_FP8 = 117 + V_MFMA_F32_32X32X16_FP8_BF8 = 118 + V_MFMA_F32_32X32X16_FP8_FP8 = 119 + V_SMFMAC_F32_16X16X64_BF8_BF8 = 120 + V_SMFMAC_F32_16X16X64_BF8_FP8 = 121 + V_SMFMAC_F32_16X16X64_FP8_BF8 = 122 + V_SMFMAC_F32_16X16X64_FP8_FP8 = 123 + V_SMFMAC_F32_32X32X32_BF8_BF8 = 124 + V_SMFMAC_F32_32X32X32_BF8_FP8 = 125 + V_SMFMAC_F32_32X32X32_FP8_BF8 = 126 + V_SMFMAC_F32_32X32X32_FP8_FP8 = 127 + +class VOP3PX2Op(ReprEnum): + V_MFMA_SCALE_F32_16X16X128_F8F6F4 = 45 + V_MFMA_SCALE_F32_32X32X64_F8F6F4 = 46 + +class VOP3SDOp(ReprEnum): + V_ADD_CO_U32 = 281 + V_SUB_CO_U32 = 282 + V_SUBREV_CO_U32 = 283 + V_ADDC_CO_U32 = 284 + V_SUBB_CO_U32 = 285 + V_SUBBREV_CO_U32 = 286 + V_DIV_SCALE_F32 = 480 + V_DIV_SCALE_F64 = 481 + V_MAD_U64_U32 = 488 + V_MAD_I64_I32 = 489 + +class VOPCOp(ReprEnum): + V_CMP_CLASS_F32_E32 = 16 + V_CMPX_CLASS_F32_E32 = 17 + V_CMP_CLASS_F64_E32 = 18 + V_CMPX_CLASS_F64_E32 = 19 + V_CMP_CLASS_F16_E32 = 20 + V_CMPX_CLASS_F16_E32 = 21 + V_CMP_F_F16_E32 = 32 + V_CMP_LT_F16_E32 = 33 + V_CMP_EQ_F16_E32 = 34 + V_CMP_LE_F16_E32 = 35 + V_CMP_GT_F16_E32 = 36 + V_CMP_LG_F16_E32 = 37 + V_CMP_GE_F16_E32 = 38 + V_CMP_O_F16_E32 = 39 + V_CMP_U_F16_E32 = 40 + V_CMP_NGE_F16_E32 = 41 + V_CMP_NLG_F16_E32 = 42 + V_CMP_NGT_F16_E32 = 43 + V_CMP_NLE_F16_E32 = 44 + V_CMP_NEQ_F16_E32 = 45 + V_CMP_NLT_F16_E32 = 46 + V_CMP_TRU_F16_E32 = 47 + V_CMPX_F_F16_E32 = 48 + V_CMPX_LT_F16_E32 = 49 + V_CMPX_EQ_F16_E32 = 50 + V_CMPX_LE_F16_E32 = 51 + V_CMPX_GT_F16_E32 = 52 + V_CMPX_LG_F16_E32 = 53 + V_CMPX_GE_F16_E32 = 54 + V_CMPX_O_F16_E32 = 55 + V_CMPX_U_F16_E32 = 56 + V_CMPX_NGE_F16_E32 = 57 + V_CMPX_NLG_F16_E32 = 58 + V_CMPX_NGT_F16_E32 = 59 + V_CMPX_NLE_F16_E32 = 60 + V_CMPX_NEQ_F16_E32 = 61 + V_CMPX_NLT_F16_E32 = 62 + V_CMPX_TRU_F16_E32 = 63 + V_CMP_F_F32_E32 = 64 + V_CMP_LT_F32_E32 = 65 + V_CMP_EQ_F32_E32 = 66 + V_CMP_LE_F32_E32 = 67 + V_CMP_GT_F32_E32 = 68 + V_CMP_LG_F32_E32 = 69 + V_CMP_GE_F32_E32 = 70 + V_CMP_O_F32_E32 = 71 + V_CMP_U_F32_E32 = 72 + V_CMP_NGE_F32_E32 = 73 + V_CMP_NLG_F32_E32 = 74 + V_CMP_NGT_F32_E32 = 75 + V_CMP_NLE_F32_E32 = 76 + V_CMP_NEQ_F32_E32 = 77 + V_CMP_NLT_F32_E32 = 78 + V_CMP_TRU_F32_E32 = 79 + V_CMPX_F_F32_E32 = 80 + V_CMPX_LT_F32_E32 = 81 + V_CMPX_EQ_F32_E32 = 82 + V_CMPX_LE_F32_E32 = 83 + V_CMPX_GT_F32_E32 = 84 + V_CMPX_LG_F32_E32 = 85 + V_CMPX_GE_F32_E32 = 86 + V_CMPX_O_F32_E32 = 87 + V_CMPX_U_F32_E32 = 88 + V_CMPX_NGE_F32_E32 = 89 + V_CMPX_NLG_F32_E32 = 90 + V_CMPX_NGT_F32_E32 = 91 + V_CMPX_NLE_F32_E32 = 92 + V_CMPX_NEQ_F32_E32 = 93 + V_CMPX_NLT_F32_E32 = 94 + V_CMPX_TRU_F32_E32 = 95 + V_CMP_F_F64_E32 = 96 + V_CMP_LT_F64_E32 = 97 + V_CMP_EQ_F64_E32 = 98 + V_CMP_LE_F64_E32 = 99 + V_CMP_GT_F64_E32 = 100 + V_CMP_LG_F64_E32 = 101 + V_CMP_GE_F64_E32 = 102 + V_CMP_O_F64_E32 = 103 + V_CMP_U_F64_E32 = 104 + V_CMP_NGE_F64_E32 = 105 + V_CMP_NLG_F64_E32 = 106 + V_CMP_NGT_F64_E32 = 107 + V_CMP_NLE_F64_E32 = 108 + V_CMP_NEQ_F64_E32 = 109 + V_CMP_NLT_F64_E32 = 110 + V_CMP_TRU_F64_E32 = 111 + V_CMPX_F_F64_E32 = 112 + V_CMPX_LT_F64_E32 = 113 + V_CMPX_EQ_F64_E32 = 114 + V_CMPX_LE_F64_E32 = 115 + V_CMPX_GT_F64_E32 = 116 + V_CMPX_LG_F64_E32 = 117 + V_CMPX_GE_F64_E32 = 118 + V_CMPX_O_F64_E32 = 119 + V_CMPX_U_F64_E32 = 120 + V_CMPX_NGE_F64_E32 = 121 + V_CMPX_NLG_F64_E32 = 122 + V_CMPX_NGT_F64_E32 = 123 + V_CMPX_NLE_F64_E32 = 124 + V_CMPX_NEQ_F64_E32 = 125 + V_CMPX_NLT_F64_E32 = 126 + V_CMPX_TRU_F64_E32 = 127 + V_CMP_F_I16_E32 = 160 + V_CMP_LT_I16_E32 = 161 + V_CMP_EQ_I16_E32 = 162 + V_CMP_LE_I16_E32 = 163 + V_CMP_GT_I16_E32 = 164 + V_CMP_NE_I16_E32 = 165 + V_CMP_GE_I16_E32 = 166 + V_CMP_T_I16_E32 = 167 + V_CMP_F_U16_E32 = 168 + V_CMP_LT_U16_E32 = 169 + V_CMP_EQ_U16_E32 = 170 + V_CMP_LE_U16_E32 = 171 + V_CMP_GT_U16_E32 = 172 + V_CMP_NE_U16_E32 = 173 + V_CMP_GE_U16_E32 = 174 + V_CMP_T_U16_E32 = 175 + V_CMPX_F_I16_E32 = 176 + V_CMPX_LT_I16_E32 = 177 + V_CMPX_EQ_I16_E32 = 178 + V_CMPX_LE_I16_E32 = 179 + V_CMPX_GT_I16_E32 = 180 + V_CMPX_NE_I16_E32 = 181 + V_CMPX_GE_I16_E32 = 182 + V_CMPX_T_I16_E32 = 183 + V_CMPX_F_U16_E32 = 184 + V_CMPX_LT_U16_E32 = 185 + V_CMPX_EQ_U16_E32 = 186 + V_CMPX_LE_U16_E32 = 187 + V_CMPX_GT_U16_E32 = 188 + V_CMPX_NE_U16_E32 = 189 + V_CMPX_GE_U16_E32 = 190 + V_CMPX_T_U16_E32 = 191 + V_CMP_F_I32_E32 = 192 + V_CMP_LT_I32_E32 = 193 + V_CMP_EQ_I32_E32 = 194 + V_CMP_LE_I32_E32 = 195 + V_CMP_GT_I32_E32 = 196 + V_CMP_NE_I32_E32 = 197 + V_CMP_GE_I32_E32 = 198 + V_CMP_T_I32_E32 = 199 + V_CMP_F_U32_E32 = 200 + V_CMP_LT_U32_E32 = 201 + V_CMP_EQ_U32_E32 = 202 + V_CMP_LE_U32_E32 = 203 + V_CMP_GT_U32_E32 = 204 + V_CMP_NE_U32_E32 = 205 + V_CMP_GE_U32_E32 = 206 + V_CMP_T_U32_E32 = 207 + V_CMPX_F_I32_E32 = 208 + V_CMPX_LT_I32_E32 = 209 + V_CMPX_EQ_I32_E32 = 210 + V_CMPX_LE_I32_E32 = 211 + V_CMPX_GT_I32_E32 = 212 + V_CMPX_NE_I32_E32 = 213 + V_CMPX_GE_I32_E32 = 214 + V_CMPX_T_I32_E32 = 215 + V_CMPX_F_U32_E32 = 216 + V_CMPX_LT_U32_E32 = 217 + V_CMPX_EQ_U32_E32 = 218 + V_CMPX_LE_U32_E32 = 219 + V_CMPX_GT_U32_E32 = 220 + V_CMPX_NE_U32_E32 = 221 + V_CMPX_GE_U32_E32 = 222 + V_CMPX_T_U32_E32 = 223 + V_CMP_F_I64_E32 = 224 + V_CMP_LT_I64_E32 = 225 + V_CMP_EQ_I64_E32 = 226 + V_CMP_LE_I64_E32 = 227 + V_CMP_GT_I64_E32 = 228 + V_CMP_NE_I64_E32 = 229 + V_CMP_GE_I64_E32 = 230 + V_CMP_T_I64_E32 = 231 + V_CMP_F_U64_E32 = 232 + V_CMP_LT_U64_E32 = 233 + V_CMP_EQ_U64_E32 = 234 + V_CMP_LE_U64_E32 = 235 + V_CMP_GT_U64_E32 = 236 + V_CMP_NE_U64_E32 = 237 + V_CMP_GE_U64_E32 = 238 + V_CMP_T_U64_E32 = 239 + V_CMPX_F_I64_E32 = 240 + V_CMPX_LT_I64_E32 = 241 + V_CMPX_EQ_I64_E32 = 242 + V_CMPX_LE_I64_E32 = 243 + V_CMPX_GT_I64_E32 = 244 + V_CMPX_NE_I64_E32 = 245 + V_CMPX_GE_I64_E32 = 246 + V_CMPX_T_I64_E32 = 247 + V_CMPX_F_U64_E32 = 248 + V_CMPX_LT_U64_E32 = 249 + V_CMPX_EQ_U64_E32 = 250 + V_CMPX_LE_U64_E32 = 251 + V_CMPX_GT_U64_E32 = 252 + V_CMPX_NE_U64_E32 = 253 + V_CMPX_GE_U64_E32 = 254 + V_CMPX_T_U64_E32 = 255 + V_CMP_CLASS_F32 = V_CMP_CLASS_F32_E32 + V_CMPX_CLASS_F32 = V_CMPX_CLASS_F32_E32 + V_CMP_CLASS_F64 = V_CMP_CLASS_F64_E32 + V_CMPX_CLASS_F64 = V_CMPX_CLASS_F64_E32 + V_CMP_CLASS_F16 = V_CMP_CLASS_F16_E32 + V_CMPX_CLASS_F16 = V_CMPX_CLASS_F16_E32 + V_CMP_F_F16 = V_CMP_F_F16_E32 + V_CMP_LT_F16 = V_CMP_LT_F16_E32 + V_CMP_EQ_F16 = V_CMP_EQ_F16_E32 + V_CMP_LE_F16 = V_CMP_LE_F16_E32 + V_CMP_GT_F16 = V_CMP_GT_F16_E32 + V_CMP_LG_F16 = V_CMP_LG_F16_E32 + V_CMP_GE_F16 = V_CMP_GE_F16_E32 + V_CMP_O_F16 = V_CMP_O_F16_E32 + V_CMP_U_F16 = V_CMP_U_F16_E32 + V_CMP_NGE_F16 = V_CMP_NGE_F16_E32 + V_CMP_NLG_F16 = V_CMP_NLG_F16_E32 + V_CMP_NGT_F16 = V_CMP_NGT_F16_E32 + V_CMP_NLE_F16 = V_CMP_NLE_F16_E32 + V_CMP_NEQ_F16 = V_CMP_NEQ_F16_E32 + V_CMP_NLT_F16 = V_CMP_NLT_F16_E32 + V_CMP_TRU_F16 = V_CMP_TRU_F16_E32 + V_CMPX_F_F16 = V_CMPX_F_F16_E32 + V_CMPX_LT_F16 = V_CMPX_LT_F16_E32 + V_CMPX_EQ_F16 = V_CMPX_EQ_F16_E32 + V_CMPX_LE_F16 = V_CMPX_LE_F16_E32 + V_CMPX_GT_F16 = V_CMPX_GT_F16_E32 + V_CMPX_LG_F16 = V_CMPX_LG_F16_E32 + V_CMPX_GE_F16 = V_CMPX_GE_F16_E32 + V_CMPX_O_F16 = V_CMPX_O_F16_E32 + V_CMPX_U_F16 = V_CMPX_U_F16_E32 + V_CMPX_NGE_F16 = V_CMPX_NGE_F16_E32 + V_CMPX_NLG_F16 = V_CMPX_NLG_F16_E32 + V_CMPX_NGT_F16 = V_CMPX_NGT_F16_E32 + V_CMPX_NLE_F16 = V_CMPX_NLE_F16_E32 + V_CMPX_NEQ_F16 = V_CMPX_NEQ_F16_E32 + V_CMPX_NLT_F16 = V_CMPX_NLT_F16_E32 + V_CMPX_TRU_F16 = V_CMPX_TRU_F16_E32 + V_CMP_F_F32 = V_CMP_F_F32_E32 + V_CMP_LT_F32 = V_CMP_LT_F32_E32 + V_CMP_EQ_F32 = V_CMP_EQ_F32_E32 + V_CMP_LE_F32 = V_CMP_LE_F32_E32 + V_CMP_GT_F32 = V_CMP_GT_F32_E32 + V_CMP_LG_F32 = V_CMP_LG_F32_E32 + V_CMP_GE_F32 = V_CMP_GE_F32_E32 + V_CMP_O_F32 = V_CMP_O_F32_E32 + V_CMP_U_F32 = V_CMP_U_F32_E32 + V_CMP_NGE_F32 = V_CMP_NGE_F32_E32 + V_CMP_NLG_F32 = V_CMP_NLG_F32_E32 + V_CMP_NGT_F32 = V_CMP_NGT_F32_E32 + V_CMP_NLE_F32 = V_CMP_NLE_F32_E32 + V_CMP_NEQ_F32 = V_CMP_NEQ_F32_E32 + V_CMP_NLT_F32 = V_CMP_NLT_F32_E32 + V_CMP_TRU_F32 = V_CMP_TRU_F32_E32 + V_CMPX_F_F32 = V_CMPX_F_F32_E32 + V_CMPX_LT_F32 = V_CMPX_LT_F32_E32 + V_CMPX_EQ_F32 = V_CMPX_EQ_F32_E32 + V_CMPX_LE_F32 = V_CMPX_LE_F32_E32 + V_CMPX_GT_F32 = V_CMPX_GT_F32_E32 + V_CMPX_LG_F32 = V_CMPX_LG_F32_E32 + V_CMPX_GE_F32 = V_CMPX_GE_F32_E32 + V_CMPX_O_F32 = V_CMPX_O_F32_E32 + V_CMPX_U_F32 = V_CMPX_U_F32_E32 + V_CMPX_NGE_F32 = V_CMPX_NGE_F32_E32 + V_CMPX_NLG_F32 = V_CMPX_NLG_F32_E32 + V_CMPX_NGT_F32 = V_CMPX_NGT_F32_E32 + V_CMPX_NLE_F32 = V_CMPX_NLE_F32_E32 + V_CMPX_NEQ_F32 = V_CMPX_NEQ_F32_E32 + V_CMPX_NLT_F32 = V_CMPX_NLT_F32_E32 + V_CMPX_TRU_F32 = V_CMPX_TRU_F32_E32 + V_CMP_F_F64 = V_CMP_F_F64_E32 + V_CMP_LT_F64 = V_CMP_LT_F64_E32 + V_CMP_EQ_F64 = V_CMP_EQ_F64_E32 + V_CMP_LE_F64 = V_CMP_LE_F64_E32 + V_CMP_GT_F64 = V_CMP_GT_F64_E32 + V_CMP_LG_F64 = V_CMP_LG_F64_E32 + V_CMP_GE_F64 = V_CMP_GE_F64_E32 + V_CMP_O_F64 = V_CMP_O_F64_E32 + V_CMP_U_F64 = V_CMP_U_F64_E32 + V_CMP_NGE_F64 = V_CMP_NGE_F64_E32 + V_CMP_NLG_F64 = V_CMP_NLG_F64_E32 + V_CMP_NGT_F64 = V_CMP_NGT_F64_E32 + V_CMP_NLE_F64 = V_CMP_NLE_F64_E32 + V_CMP_NEQ_F64 = V_CMP_NEQ_F64_E32 + V_CMP_NLT_F64 = V_CMP_NLT_F64_E32 + V_CMP_TRU_F64 = V_CMP_TRU_F64_E32 + V_CMPX_F_F64 = V_CMPX_F_F64_E32 + V_CMPX_LT_F64 = V_CMPX_LT_F64_E32 + V_CMPX_EQ_F64 = V_CMPX_EQ_F64_E32 + V_CMPX_LE_F64 = V_CMPX_LE_F64_E32 + V_CMPX_GT_F64 = V_CMPX_GT_F64_E32 + V_CMPX_LG_F64 = V_CMPX_LG_F64_E32 + V_CMPX_GE_F64 = V_CMPX_GE_F64_E32 + V_CMPX_O_F64 = V_CMPX_O_F64_E32 + V_CMPX_U_F64 = V_CMPX_U_F64_E32 + V_CMPX_NGE_F64 = V_CMPX_NGE_F64_E32 + V_CMPX_NLG_F64 = V_CMPX_NLG_F64_E32 + V_CMPX_NGT_F64 = V_CMPX_NGT_F64_E32 + V_CMPX_NLE_F64 = V_CMPX_NLE_F64_E32 + V_CMPX_NEQ_F64 = V_CMPX_NEQ_F64_E32 + V_CMPX_NLT_F64 = V_CMPX_NLT_F64_E32 + V_CMPX_TRU_F64 = V_CMPX_TRU_F64_E32 + V_CMP_F_I16 = V_CMP_F_I16_E32 + V_CMP_LT_I16 = V_CMP_LT_I16_E32 + V_CMP_EQ_I16 = V_CMP_EQ_I16_E32 + V_CMP_LE_I16 = V_CMP_LE_I16_E32 + V_CMP_GT_I16 = V_CMP_GT_I16_E32 + V_CMP_NE_I16 = V_CMP_NE_I16_E32 + V_CMP_GE_I16 = V_CMP_GE_I16_E32 + V_CMP_T_I16 = V_CMP_T_I16_E32 + V_CMP_F_U16 = V_CMP_F_U16_E32 + V_CMP_LT_U16 = V_CMP_LT_U16_E32 + V_CMP_EQ_U16 = V_CMP_EQ_U16_E32 + V_CMP_LE_U16 = V_CMP_LE_U16_E32 + V_CMP_GT_U16 = V_CMP_GT_U16_E32 + V_CMP_NE_U16 = V_CMP_NE_U16_E32 + V_CMP_GE_U16 = V_CMP_GE_U16_E32 + V_CMP_T_U16 = V_CMP_T_U16_E32 + V_CMPX_F_I16 = V_CMPX_F_I16_E32 + V_CMPX_LT_I16 = V_CMPX_LT_I16_E32 + V_CMPX_EQ_I16 = V_CMPX_EQ_I16_E32 + V_CMPX_LE_I16 = V_CMPX_LE_I16_E32 + V_CMPX_GT_I16 = V_CMPX_GT_I16_E32 + V_CMPX_NE_I16 = V_CMPX_NE_I16_E32 + V_CMPX_GE_I16 = V_CMPX_GE_I16_E32 + V_CMPX_T_I16 = V_CMPX_T_I16_E32 + V_CMPX_F_U16 = V_CMPX_F_U16_E32 + V_CMPX_LT_U16 = V_CMPX_LT_U16_E32 + V_CMPX_EQ_U16 = V_CMPX_EQ_U16_E32 + V_CMPX_LE_U16 = V_CMPX_LE_U16_E32 + V_CMPX_GT_U16 = V_CMPX_GT_U16_E32 + V_CMPX_NE_U16 = V_CMPX_NE_U16_E32 + V_CMPX_GE_U16 = V_CMPX_GE_U16_E32 + V_CMPX_T_U16 = V_CMPX_T_U16_E32 + V_CMP_F_I32 = V_CMP_F_I32_E32 + V_CMP_LT_I32 = V_CMP_LT_I32_E32 + V_CMP_EQ_I32 = V_CMP_EQ_I32_E32 + V_CMP_LE_I32 = V_CMP_LE_I32_E32 + V_CMP_GT_I32 = V_CMP_GT_I32_E32 + V_CMP_NE_I32 = V_CMP_NE_I32_E32 + V_CMP_GE_I32 = V_CMP_GE_I32_E32 + V_CMP_T_I32 = V_CMP_T_I32_E32 + V_CMP_F_U32 = V_CMP_F_U32_E32 + V_CMP_LT_U32 = V_CMP_LT_U32_E32 + V_CMP_EQ_U32 = V_CMP_EQ_U32_E32 + V_CMP_LE_U32 = V_CMP_LE_U32_E32 + V_CMP_GT_U32 = V_CMP_GT_U32_E32 + V_CMP_NE_U32 = V_CMP_NE_U32_E32 + V_CMP_GE_U32 = V_CMP_GE_U32_E32 + V_CMP_T_U32 = V_CMP_T_U32_E32 + V_CMPX_F_I32 = V_CMPX_F_I32_E32 + V_CMPX_LT_I32 = V_CMPX_LT_I32_E32 + V_CMPX_EQ_I32 = V_CMPX_EQ_I32_E32 + V_CMPX_LE_I32 = V_CMPX_LE_I32_E32 + V_CMPX_GT_I32 = V_CMPX_GT_I32_E32 + V_CMPX_NE_I32 = V_CMPX_NE_I32_E32 + V_CMPX_GE_I32 = V_CMPX_GE_I32_E32 + V_CMPX_T_I32 = V_CMPX_T_I32_E32 + V_CMPX_F_U32 = V_CMPX_F_U32_E32 + V_CMPX_LT_U32 = V_CMPX_LT_U32_E32 + V_CMPX_EQ_U32 = V_CMPX_EQ_U32_E32 + V_CMPX_LE_U32 = V_CMPX_LE_U32_E32 + V_CMPX_GT_U32 = V_CMPX_GT_U32_E32 + V_CMPX_NE_U32 = V_CMPX_NE_U32_E32 + V_CMPX_GE_U32 = V_CMPX_GE_U32_E32 + V_CMPX_T_U32 = V_CMPX_T_U32_E32 + V_CMP_F_I64 = V_CMP_F_I64_E32 + V_CMP_LT_I64 = V_CMP_LT_I64_E32 + V_CMP_EQ_I64 = V_CMP_EQ_I64_E32 + V_CMP_LE_I64 = V_CMP_LE_I64_E32 + V_CMP_GT_I64 = V_CMP_GT_I64_E32 + V_CMP_NE_I64 = V_CMP_NE_I64_E32 + V_CMP_GE_I64 = V_CMP_GE_I64_E32 + V_CMP_T_I64 = V_CMP_T_I64_E32 + V_CMP_F_U64 = V_CMP_F_U64_E32 + V_CMP_LT_U64 = V_CMP_LT_U64_E32 + V_CMP_EQ_U64 = V_CMP_EQ_U64_E32 + V_CMP_LE_U64 = V_CMP_LE_U64_E32 + V_CMP_GT_U64 = V_CMP_GT_U64_E32 + V_CMP_NE_U64 = V_CMP_NE_U64_E32 + V_CMP_GE_U64 = V_CMP_GE_U64_E32 + V_CMP_T_U64 = V_CMP_T_U64_E32 + V_CMPX_F_I64 = V_CMPX_F_I64_E32 + V_CMPX_LT_I64 = V_CMPX_LT_I64_E32 + V_CMPX_EQ_I64 = V_CMPX_EQ_I64_E32 + V_CMPX_LE_I64 = V_CMPX_LE_I64_E32 + V_CMPX_GT_I64 = V_CMPX_GT_I64_E32 + V_CMPX_NE_I64 = V_CMPX_NE_I64_E32 + V_CMPX_GE_I64 = V_CMPX_GE_I64_E32 + V_CMPX_T_I64 = V_CMPX_T_I64_E32 + V_CMPX_F_U64 = V_CMPX_F_U64_E32 + V_CMPX_LT_U64 = V_CMPX_LT_U64_E32 + V_CMPX_EQ_U64 = V_CMPX_EQ_U64_E32 + V_CMPX_LE_U64 = V_CMPX_LE_U64_E32 + V_CMPX_GT_U64 = V_CMPX_GT_U64_E32 + V_CMPX_NE_U64 = V_CMPX_NE_U64_E32 + V_CMPX_GE_U64 = V_CMPX_GE_U64_E32 + V_CMPX_T_U64 = V_CMPX_T_U64_E32 diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/ins.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/ins.py new file mode 100644 index 000000000..ba3aeda0f --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/ins.py @@ -0,0 +1,1935 @@ +# autogenerated from AMD ISA XML - do not edit +# ruff: noqa: E501,F401 +from tinygrad.renderer.amd.dsl import BitField, DPP, DPP16, EXEC, EXECZ, EXEC_HI, EXEC_LO, EnumBitField, FixedBitField, INV_2PI, Inst, LIT, M0, NULL, OFF, SBaseField, SCC, SDWA, SGPRField, SRC_LDS_DIRECT, SRsrcField, SSrcField, SrcField, VCC, VCCZ, VCC_HI, VCC_LO, VGPRField, s, src, ttmp, v +from tinygrad.runtime.autogen.amd.cdna.enum import DSOp, FLATOp, GLOBALOp, MTBUFOp, MUBUFOp, SCRATCHOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3PX2Op, VOP3SDOp, VOPCOp, HWREG +import functools + +class DS(Inst): + encoding = FixedBitField(31, 26, 0b110110) + op = EnumBitField(24, 17, DSOp, {DSOp.DS_ADD_U32, DSOp.DS_SUB_U32, DSOp.DS_RSUB_U32, DSOp.DS_INC_U32, DSOp.DS_DEC_U32, DSOp.DS_MIN_I32, DSOp.DS_MAX_I32, DSOp.DS_MIN_U32, DSOp.DS_MAX_U32, DSOp.DS_AND_B32, DSOp.DS_OR_B32, DSOp.DS_XOR_B32, DSOp.DS_MSKOR_B32, DSOp.DS_WRITE_B32, DSOp.DS_WRITE2_B32, DSOp.DS_WRITE2ST64_B32, DSOp.DS_CMPST_B32, DSOp.DS_CMPST_F32, DSOp.DS_MIN_F32, DSOp.DS_MAX_F32, DSOp.DS_NOP, DSOp.DS_ADD_F32, DSOp.DS_PK_ADD_F16, DSOp.DS_PK_ADD_BF16, DSOp.DS_WRITE_ADDTID_B32, DSOp.DS_WRITE_B8, DSOp.DS_WRITE_B16, DSOp.DS_ADD_RTN_U32, DSOp.DS_SUB_RTN_U32, DSOp.DS_RSUB_RTN_U32, DSOp.DS_INC_RTN_U32, DSOp.DS_DEC_RTN_U32, DSOp.DS_MIN_RTN_I32, DSOp.DS_MAX_RTN_I32, DSOp.DS_MIN_RTN_U32, DSOp.DS_MAX_RTN_U32, DSOp.DS_AND_RTN_B32, DSOp.DS_OR_RTN_B32, DSOp.DS_XOR_RTN_B32, DSOp.DS_MSKOR_RTN_B32, DSOp.DS_WRXCHG_RTN_B32, DSOp.DS_WRXCHG2_RTN_B32, DSOp.DS_WRXCHG2ST64_RTN_B32, DSOp.DS_CMPST_RTN_B32, DSOp.DS_CMPST_RTN_F32, DSOp.DS_MIN_RTN_F32, DSOp.DS_MAX_RTN_F32, DSOp.DS_WRAP_RTN_B32, DSOp.DS_ADD_RTN_F32, DSOp.DS_READ_B32, DSOp.DS_READ2_B32, DSOp.DS_READ2ST64_B32, DSOp.DS_READ_I8, DSOp.DS_READ_U8, DSOp.DS_READ_I16, DSOp.DS_READ_U16, DSOp.DS_SWIZZLE_B32, DSOp.DS_PERMUTE_B32, DSOp.DS_BPERMUTE_B32, DSOp.DS_ADD_U64, DSOp.DS_SUB_U64, DSOp.DS_RSUB_U64, DSOp.DS_INC_U64, DSOp.DS_DEC_U64, DSOp.DS_MIN_I64, DSOp.DS_MAX_I64, DSOp.DS_MIN_U64, DSOp.DS_MAX_U64, DSOp.DS_AND_B64, DSOp.DS_OR_B64, DSOp.DS_XOR_B64, DSOp.DS_MSKOR_B64, DSOp.DS_WRITE_B64, DSOp.DS_WRITE2_B64, DSOp.DS_WRITE2ST64_B64, DSOp.DS_CMPST_B64, DSOp.DS_CMPST_F64, DSOp.DS_MIN_F64, DSOp.DS_MAX_F64, DSOp.DS_WRITE_B8_D16_HI, DSOp.DS_WRITE_B16_D16_HI, DSOp.DS_READ_U8_D16, DSOp.DS_READ_U8_D16_HI, DSOp.DS_READ_I8_D16, DSOp.DS_READ_I8_D16_HI, DSOp.DS_READ_U16_D16, DSOp.DS_READ_U16_D16_HI, DSOp.DS_ADD_F64, DSOp.DS_ADD_RTN_U64, DSOp.DS_SUB_RTN_U64, DSOp.DS_RSUB_RTN_U64, DSOp.DS_INC_RTN_U64, DSOp.DS_DEC_RTN_U64, DSOp.DS_MIN_RTN_I64, DSOp.DS_MAX_RTN_I64, DSOp.DS_MIN_RTN_U64, DSOp.DS_MAX_RTN_U64, DSOp.DS_AND_RTN_B64, DSOp.DS_OR_RTN_B64, DSOp.DS_XOR_RTN_B64, DSOp.DS_MSKOR_RTN_B64, DSOp.DS_WRXCHG_RTN_B64, DSOp.DS_WRXCHG2_RTN_B64, DSOp.DS_WRXCHG2ST64_RTN_B64, DSOp.DS_CMPST_RTN_B64, DSOp.DS_CMPST_RTN_F64, DSOp.DS_MIN_RTN_F64, DSOp.DS_MAX_RTN_F64, DSOp.DS_READ_B64, DSOp.DS_READ2_B64, DSOp.DS_READ2ST64_B64, DSOp.DS_ADD_RTN_F64, DSOp.DS_CONDXCHG32_RTN_B64, DSOp.DS_GWS_SEMA_RELEASE_ALL, DSOp.DS_GWS_SEMA_V, DSOp.DS_GWS_SEMA_P, DSOp.DS_READ_ADDTID_B32, DSOp.DS_PK_ADD_RTN_F16, DSOp.DS_PK_ADD_RTN_BF16, DSOp.DS_CONSUME, DSOp.DS_APPEND, DSOp.DS_WRITE_B96, DSOp.DS_WRITE_B128, DSOp.DS_READ_B64_TR_B4, DSOp.DS_READ_B96_TR_B6, DSOp.DS_READ_B64_TR_B8, DSOp.DS_READ_B64_TR_B16, DSOp.DS_READ_B96, DSOp.DS_READ_B128}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data0 = VGPRField(47, 40) + data1 = VGPRField(55, 48) + acc = BitField(25, 25) + offset0 = BitField(7, 0) + offset1 = BitField(15, 8) + gds = BitField(16, 16) + +class FLAT(Inst): + encoding = FixedBitField(31, 26, 0b110111) + op = EnumBitField(24, 18, FLATOp, {FLATOp.FLAT_LOAD_UBYTE, FLATOp.FLAT_LOAD_SBYTE, FLATOp.FLAT_LOAD_USHORT, FLATOp.FLAT_LOAD_SSHORT, FLATOp.FLAT_LOAD_DWORD, FLATOp.FLAT_LOAD_DWORDX2, FLATOp.FLAT_LOAD_DWORDX3, FLATOp.FLAT_LOAD_DWORDX4, FLATOp.FLAT_STORE_BYTE, FLATOp.FLAT_STORE_BYTE_D16_HI, FLATOp.FLAT_STORE_SHORT, FLATOp.FLAT_STORE_SHORT_D16_HI, FLATOp.FLAT_STORE_DWORD, FLATOp.FLAT_STORE_DWORDX2, FLATOp.FLAT_STORE_DWORDX3, FLATOp.FLAT_STORE_DWORDX4, FLATOp.FLAT_LOAD_UBYTE_D16, FLATOp.FLAT_LOAD_UBYTE_D16_HI, FLATOp.FLAT_LOAD_SBYTE_D16, FLATOp.FLAT_LOAD_SBYTE_D16_HI, FLATOp.FLAT_LOAD_SHORT_D16, FLATOp.FLAT_LOAD_SHORT_D16_HI, FLATOp.FLAT_ATOMIC_SWAP, FLATOp.FLAT_ATOMIC_CMPSWAP, FLATOp.FLAT_ATOMIC_ADD, FLATOp.FLAT_ATOMIC_SUB, FLATOp.FLAT_ATOMIC_SMIN, FLATOp.FLAT_ATOMIC_UMIN, FLATOp.FLAT_ATOMIC_SMAX, FLATOp.FLAT_ATOMIC_UMAX, FLATOp.FLAT_ATOMIC_AND, FLATOp.FLAT_ATOMIC_OR, FLATOp.FLAT_ATOMIC_XOR, FLATOp.FLAT_ATOMIC_INC, FLATOp.FLAT_ATOMIC_DEC, FLATOp.FLAT_ATOMIC_ADD_F32, FLATOp.FLAT_ATOMIC_PK_ADD_F16, FLATOp.FLAT_ATOMIC_ADD_F64, FLATOp.FLAT_ATOMIC_MIN_F64, FLATOp.FLAT_ATOMIC_MAX_F64, FLATOp.FLAT_ATOMIC_PK_ADD_BF16, FLATOp.FLAT_ATOMIC_SWAP_X2, FLATOp.FLAT_ATOMIC_CMPSWAP_X2, FLATOp.FLAT_ATOMIC_ADD_X2, FLATOp.FLAT_ATOMIC_SUB_X2, FLATOp.FLAT_ATOMIC_SMIN_X2, FLATOp.FLAT_ATOMIC_UMIN_X2, FLATOp.FLAT_ATOMIC_SMAX_X2, FLATOp.FLAT_ATOMIC_UMAX_X2, FLATOp.FLAT_ATOMIC_AND_X2, FLATOp.FLAT_ATOMIC_OR_X2, FLATOp.FLAT_ATOMIC_XOR_X2, FLATOp.FLAT_ATOMIC_INC_X2, FLATOp.FLAT_ATOMIC_DEC_X2}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data = VGPRField(47, 40) + saddr = SGPRField(54, 48, default=NULL) + offset = BitField(11, 0) + seg = FixedBitField(15, 14, 0) + acc = BitField(55, 55) + sve = BitField(13, 13) + sc0 = BitField(16, 16) + nt = BitField(17, 17) + sc1 = BitField(25, 25) + +class GLOBAL(Inst): + encoding = FixedBitField(31, 26, 0b110111) + op = EnumBitField(24, 18, GLOBALOp, {GLOBALOp.GLOBAL_LOAD_UBYTE, GLOBALOp.GLOBAL_LOAD_SBYTE, GLOBALOp.GLOBAL_LOAD_USHORT, GLOBALOp.GLOBAL_LOAD_SSHORT, GLOBALOp.GLOBAL_LOAD_DWORD, GLOBALOp.GLOBAL_LOAD_DWORDX2, GLOBALOp.GLOBAL_LOAD_DWORDX3, GLOBALOp.GLOBAL_LOAD_DWORDX4, GLOBALOp.GLOBAL_STORE_BYTE, GLOBALOp.GLOBAL_STORE_BYTE_D16_HI, GLOBALOp.GLOBAL_STORE_SHORT, GLOBALOp.GLOBAL_STORE_SHORT_D16_HI, GLOBALOp.GLOBAL_STORE_DWORD, GLOBALOp.GLOBAL_STORE_DWORDX2, GLOBALOp.GLOBAL_STORE_DWORDX3, GLOBALOp.GLOBAL_STORE_DWORDX4, GLOBALOp.GLOBAL_LOAD_UBYTE_D16, GLOBALOp.GLOBAL_LOAD_UBYTE_D16_HI, GLOBALOp.GLOBAL_LOAD_SBYTE_D16, GLOBALOp.GLOBAL_LOAD_SBYTE_D16_HI, GLOBALOp.GLOBAL_LOAD_SHORT_D16, GLOBALOp.GLOBAL_LOAD_SHORT_D16_HI, GLOBALOp.GLOBAL_LOAD_LDS_UBYTE, GLOBALOp.GLOBAL_LOAD_LDS_SBYTE, GLOBALOp.GLOBAL_LOAD_LDS_USHORT, GLOBALOp.GLOBAL_LOAD_LDS_SSHORT, GLOBALOp.GLOBAL_LOAD_LDS_DWORD, GLOBALOp.GLOBAL_ATOMIC_SWAP, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP, GLOBALOp.GLOBAL_ATOMIC_ADD, GLOBALOp.GLOBAL_ATOMIC_SUB, GLOBALOp.GLOBAL_ATOMIC_SMIN, GLOBALOp.GLOBAL_ATOMIC_UMIN, GLOBALOp.GLOBAL_ATOMIC_SMAX, GLOBALOp.GLOBAL_ATOMIC_UMAX, GLOBALOp.GLOBAL_ATOMIC_AND, GLOBALOp.GLOBAL_ATOMIC_OR, GLOBALOp.GLOBAL_ATOMIC_XOR, GLOBALOp.GLOBAL_ATOMIC_INC, GLOBALOp.GLOBAL_ATOMIC_DEC, GLOBALOp.GLOBAL_ATOMIC_ADD_F32, GLOBALOp.GLOBAL_ATOMIC_PK_ADD_F16, GLOBALOp.GLOBAL_ATOMIC_ADD_F64, GLOBALOp.GLOBAL_ATOMIC_MIN_F64, GLOBALOp.GLOBAL_ATOMIC_MAX_F64, GLOBALOp.GLOBAL_ATOMIC_PK_ADD_BF16, GLOBALOp.GLOBAL_ATOMIC_SWAP_X2, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_X2, GLOBALOp.GLOBAL_ATOMIC_ADD_X2, GLOBALOp.GLOBAL_ATOMIC_SUB_X2, GLOBALOp.GLOBAL_ATOMIC_SMIN_X2, GLOBALOp.GLOBAL_ATOMIC_UMIN_X2, GLOBALOp.GLOBAL_ATOMIC_SMAX_X2, GLOBALOp.GLOBAL_ATOMIC_UMAX_X2, GLOBALOp.GLOBAL_ATOMIC_AND_X2, GLOBALOp.GLOBAL_ATOMIC_OR_X2, GLOBALOp.GLOBAL_ATOMIC_XOR_X2, GLOBALOp.GLOBAL_ATOMIC_INC_X2, GLOBALOp.GLOBAL_ATOMIC_DEC_X2, GLOBALOp.GLOBAL_LOAD_LDS_DWORDX4, GLOBALOp.GLOBAL_LOAD_LDS_DWORDX3}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data = VGPRField(47, 40) + saddr = SGPRField(54, 48, default=NULL) + offset = BitField(12, 0) + seg = FixedBitField(15, 14, 2) + acc = BitField(55, 55) + sve = BitField(13, 13) + sc0 = BitField(16, 16) + nt = BitField(17, 17) + sc1 = BitField(25, 25) + +class SCRATCH(Inst): + encoding = FixedBitField(31, 26, 0b110111) + op = EnumBitField(24, 18, SCRATCHOp, {SCRATCHOp.SCRATCH_LOAD_UBYTE, SCRATCHOp.SCRATCH_LOAD_SBYTE, SCRATCHOp.SCRATCH_LOAD_USHORT, SCRATCHOp.SCRATCH_LOAD_SSHORT, SCRATCHOp.SCRATCH_LOAD_DWORD, SCRATCHOp.SCRATCH_LOAD_DWORDX2, SCRATCHOp.SCRATCH_LOAD_DWORDX3, SCRATCHOp.SCRATCH_LOAD_DWORDX4, SCRATCHOp.SCRATCH_STORE_BYTE, SCRATCHOp.SCRATCH_STORE_BYTE_D16_HI, SCRATCHOp.SCRATCH_STORE_SHORT, SCRATCHOp.SCRATCH_STORE_SHORT_D16_HI, SCRATCHOp.SCRATCH_STORE_DWORD, SCRATCHOp.SCRATCH_STORE_DWORDX2, SCRATCHOp.SCRATCH_STORE_DWORDX3, SCRATCHOp.SCRATCH_STORE_DWORDX4, SCRATCHOp.SCRATCH_LOAD_UBYTE_D16, SCRATCHOp.SCRATCH_LOAD_UBYTE_D16_HI, SCRATCHOp.SCRATCH_LOAD_SBYTE_D16, SCRATCHOp.SCRATCH_LOAD_SBYTE_D16_HI, SCRATCHOp.SCRATCH_LOAD_SHORT_D16, SCRATCHOp.SCRATCH_LOAD_SHORT_D16_HI, SCRATCHOp.SCRATCH_LOAD_LDS_UBYTE, SCRATCHOp.SCRATCH_LOAD_LDS_SBYTE, SCRATCHOp.SCRATCH_LOAD_LDS_USHORT, SCRATCHOp.SCRATCH_LOAD_LDS_SSHORT, SCRATCHOp.SCRATCH_LOAD_LDS_DWORD}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data = VGPRField(47, 40) + saddr = SGPRField(54, 48, default=NULL) + offset = BitField(12, 0) + seg = FixedBitField(15, 14, 1) + acc = BitField(55, 55) + sve = BitField(13, 13) + sc0 = BitField(16, 16) + nt = BitField(17, 17) + sc1 = BitField(25, 25) + +class MTBUF(Inst): + encoding = FixedBitField(31, 26, 0b111010) + op = EnumBitField(18, 15, MTBUFOp, {MTBUFOp.TBUFFER_LOAD_FORMAT_X, MTBUFOp.TBUFFER_LOAD_FORMAT_XY, MTBUFOp.TBUFFER_LOAD_FORMAT_XYZ, MTBUFOp.TBUFFER_LOAD_FORMAT_XYZW, MTBUFOp.TBUFFER_STORE_FORMAT_X, MTBUFOp.TBUFFER_STORE_FORMAT_XY, MTBUFOp.TBUFFER_STORE_FORMAT_XYZ, MTBUFOp.TBUFFER_STORE_FORMAT_XYZW, MTBUFOp.TBUFFER_LOAD_FORMAT_D16_X, MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XY, MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XYZ, MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XYZW, MTBUFOp.TBUFFER_STORE_FORMAT_D16_X, MTBUFOp.TBUFFER_STORE_FORMAT_D16_XY, MTBUFOp.TBUFFER_STORE_FORMAT_D16_XYZ, MTBUFOp.TBUFFER_STORE_FORMAT_D16_XYZW}) + vdata = VGPRField(47, 40) + vaddr = VGPRField(39, 32) + srsrc = SRsrcField(52, 48) + soffset = SSrcField(63, 56, default=NULL) + offset = BitField(11, 0) + offen = BitField(12, 12) + idxen = BitField(13, 13) + acc = BitField(55, 55) + sc0 = BitField(14, 14) + dfmt = BitField(22, 19) + nfmt = BitField(25, 23) + sc1 = BitField(53, 53) + nt = BitField(54, 54) + +class MUBUF(Inst): + encoding = FixedBitField(31, 26, 0b111000) + op = EnumBitField(24, 18, MUBUFOp, {MUBUFOp.BUFFER_LOAD_FORMAT_X, MUBUFOp.BUFFER_LOAD_FORMAT_XY, MUBUFOp.BUFFER_LOAD_FORMAT_XYZ, MUBUFOp.BUFFER_LOAD_FORMAT_XYZW, MUBUFOp.BUFFER_STORE_FORMAT_X, MUBUFOp.BUFFER_STORE_FORMAT_XY, MUBUFOp.BUFFER_STORE_FORMAT_XYZ, MUBUFOp.BUFFER_STORE_FORMAT_XYZW, MUBUFOp.BUFFER_LOAD_FORMAT_D16_X, MUBUFOp.BUFFER_LOAD_FORMAT_D16_XY, MUBUFOp.BUFFER_LOAD_FORMAT_D16_XYZ, MUBUFOp.BUFFER_LOAD_FORMAT_D16_XYZW, MUBUFOp.BUFFER_STORE_FORMAT_D16_X, MUBUFOp.BUFFER_STORE_FORMAT_D16_XY, MUBUFOp.BUFFER_STORE_FORMAT_D16_XYZ, MUBUFOp.BUFFER_STORE_FORMAT_D16_XYZW, MUBUFOp.BUFFER_LOAD_UBYTE, MUBUFOp.BUFFER_LOAD_SBYTE, MUBUFOp.BUFFER_LOAD_USHORT, MUBUFOp.BUFFER_LOAD_SSHORT, MUBUFOp.BUFFER_LOAD_DWORD, MUBUFOp.BUFFER_LOAD_DWORDX2, MUBUFOp.BUFFER_LOAD_DWORDX3, MUBUFOp.BUFFER_LOAD_DWORDX4, MUBUFOp.BUFFER_STORE_BYTE, MUBUFOp.BUFFER_STORE_BYTE_D16_HI, MUBUFOp.BUFFER_STORE_SHORT, MUBUFOp.BUFFER_STORE_SHORT_D16_HI, MUBUFOp.BUFFER_STORE_DWORD, MUBUFOp.BUFFER_STORE_DWORDX2, MUBUFOp.BUFFER_STORE_DWORDX3, MUBUFOp.BUFFER_STORE_DWORDX4, MUBUFOp.BUFFER_LOAD_UBYTE_D16, MUBUFOp.BUFFER_LOAD_UBYTE_D16_HI, MUBUFOp.BUFFER_LOAD_SBYTE_D16, MUBUFOp.BUFFER_LOAD_SBYTE_D16_HI, MUBUFOp.BUFFER_LOAD_SHORT_D16, MUBUFOp.BUFFER_LOAD_SHORT_D16_HI, MUBUFOp.BUFFER_LOAD_FORMAT_D16_HI_X, MUBUFOp.BUFFER_STORE_FORMAT_D16_HI_X, MUBUFOp.BUFFER_WBL2, MUBUFOp.BUFFER_INV, MUBUFOp.BUFFER_ATOMIC_SWAP, MUBUFOp.BUFFER_ATOMIC_CMPSWAP, MUBUFOp.BUFFER_ATOMIC_ADD, MUBUFOp.BUFFER_ATOMIC_SUB, MUBUFOp.BUFFER_ATOMIC_SMIN, MUBUFOp.BUFFER_ATOMIC_UMIN, MUBUFOp.BUFFER_ATOMIC_SMAX, MUBUFOp.BUFFER_ATOMIC_UMAX, MUBUFOp.BUFFER_ATOMIC_AND, MUBUFOp.BUFFER_ATOMIC_OR, MUBUFOp.BUFFER_ATOMIC_XOR, MUBUFOp.BUFFER_ATOMIC_INC, MUBUFOp.BUFFER_ATOMIC_DEC, MUBUFOp.BUFFER_ATOMIC_ADD_F32, MUBUFOp.BUFFER_ATOMIC_PK_ADD_F16, MUBUFOp.BUFFER_ATOMIC_ADD_F64, MUBUFOp.BUFFER_ATOMIC_MIN_F64, MUBUFOp.BUFFER_ATOMIC_MAX_F64, MUBUFOp.BUFFER_ATOMIC_PK_ADD_BF16, MUBUFOp.BUFFER_ATOMIC_SWAP_X2, MUBUFOp.BUFFER_ATOMIC_CMPSWAP_X2, MUBUFOp.BUFFER_ATOMIC_ADD_X2, MUBUFOp.BUFFER_ATOMIC_SUB_X2, MUBUFOp.BUFFER_ATOMIC_SMIN_X2, MUBUFOp.BUFFER_ATOMIC_UMIN_X2, MUBUFOp.BUFFER_ATOMIC_SMAX_X2, MUBUFOp.BUFFER_ATOMIC_UMAX_X2, MUBUFOp.BUFFER_ATOMIC_AND_X2, MUBUFOp.BUFFER_ATOMIC_OR_X2, MUBUFOp.BUFFER_ATOMIC_XOR_X2, MUBUFOp.BUFFER_ATOMIC_INC_X2, MUBUFOp.BUFFER_ATOMIC_DEC_X2}) + vdata = VGPRField(47, 40) + vaddr = VGPRField(39, 32) + srsrc = SRsrcField(52, 48) + soffset = SSrcField(63, 56, default=NULL) + offset = BitField(11, 0) + offen = BitField(12, 12) + idxen = BitField(13, 13) + acc = BitField(55, 55) + sc0 = BitField(14, 14) + sc1 = BitField(15, 15) + lds = BitField(16, 16) + nt = BitField(17, 17) + +class SMEM(Inst): + encoding = FixedBitField(31, 26, 0b110000) + op = EnumBitField(25, 18, SMEMOp, {SMEMOp.S_LOAD_DWORD, SMEMOp.S_LOAD_DWORDX2, SMEMOp.S_LOAD_DWORDX4, SMEMOp.S_LOAD_DWORDX8, SMEMOp.S_LOAD_DWORDX16, SMEMOp.S_SCRATCH_LOAD_DWORD, SMEMOp.S_SCRATCH_LOAD_DWORDX2, SMEMOp.S_SCRATCH_LOAD_DWORDX4, SMEMOp.S_BUFFER_LOAD_DWORD, SMEMOp.S_BUFFER_LOAD_DWORDX2, SMEMOp.S_BUFFER_LOAD_DWORDX4, SMEMOp.S_BUFFER_LOAD_DWORDX8, SMEMOp.S_BUFFER_LOAD_DWORDX16, SMEMOp.S_STORE_DWORD, SMEMOp.S_STORE_DWORDX2, SMEMOp.S_STORE_DWORDX4, SMEMOp.S_SCRATCH_STORE_DWORD, SMEMOp.S_SCRATCH_STORE_DWORDX2, SMEMOp.S_SCRATCH_STORE_DWORDX4, SMEMOp.S_BUFFER_STORE_DWORD, SMEMOp.S_BUFFER_STORE_DWORDX2, SMEMOp.S_BUFFER_STORE_DWORDX4, SMEMOp.S_DCACHE_INV, SMEMOp.S_DCACHE_WB, SMEMOp.S_DCACHE_INV_VOL, SMEMOp.S_DCACHE_WB_VOL, SMEMOp.S_MEMTIME, SMEMOp.S_MEMREALTIME, SMEMOp.S_ATC_PROBE, SMEMOp.S_ATC_PROBE_BUFFER, SMEMOp.S_DCACHE_DISCARD, SMEMOp.S_DCACHE_DISCARD_X2, SMEMOp.S_BUFFER_ATOMIC_SWAP, SMEMOp.S_BUFFER_ATOMIC_CMPSWAP, SMEMOp.S_BUFFER_ATOMIC_ADD, SMEMOp.S_BUFFER_ATOMIC_SUB, SMEMOp.S_BUFFER_ATOMIC_SMIN, SMEMOp.S_BUFFER_ATOMIC_UMIN, SMEMOp.S_BUFFER_ATOMIC_SMAX, SMEMOp.S_BUFFER_ATOMIC_UMAX, SMEMOp.S_BUFFER_ATOMIC_AND, SMEMOp.S_BUFFER_ATOMIC_OR, SMEMOp.S_BUFFER_ATOMIC_XOR, SMEMOp.S_BUFFER_ATOMIC_INC, SMEMOp.S_BUFFER_ATOMIC_DEC, SMEMOp.S_BUFFER_ATOMIC_SWAP_X2, SMEMOp.S_BUFFER_ATOMIC_CMPSWAP_X2, SMEMOp.S_BUFFER_ATOMIC_ADD_X2, SMEMOp.S_BUFFER_ATOMIC_SUB_X2, SMEMOp.S_BUFFER_ATOMIC_SMIN_X2, SMEMOp.S_BUFFER_ATOMIC_UMIN_X2, SMEMOp.S_BUFFER_ATOMIC_SMAX_X2, SMEMOp.S_BUFFER_ATOMIC_UMAX_X2, SMEMOp.S_BUFFER_ATOMIC_AND_X2, SMEMOp.S_BUFFER_ATOMIC_OR_X2, SMEMOp.S_BUFFER_ATOMIC_XOR_X2, SMEMOp.S_BUFFER_ATOMIC_INC_X2, SMEMOp.S_BUFFER_ATOMIC_DEC_X2, SMEMOp.S_ATOMIC_SWAP, SMEMOp.S_ATOMIC_CMPSWAP, SMEMOp.S_ATOMIC_ADD, SMEMOp.S_ATOMIC_SUB, SMEMOp.S_ATOMIC_SMIN, SMEMOp.S_ATOMIC_UMIN, SMEMOp.S_ATOMIC_SMAX, SMEMOp.S_ATOMIC_UMAX, SMEMOp.S_ATOMIC_AND, SMEMOp.S_ATOMIC_OR, SMEMOp.S_ATOMIC_XOR, SMEMOp.S_ATOMIC_INC, SMEMOp.S_ATOMIC_DEC, SMEMOp.S_ATOMIC_SWAP_X2, SMEMOp.S_ATOMIC_CMPSWAP_X2, SMEMOp.S_ATOMIC_ADD_X2, SMEMOp.S_ATOMIC_SUB_X2, SMEMOp.S_ATOMIC_SMIN_X2, SMEMOp.S_ATOMIC_UMIN_X2, SMEMOp.S_ATOMIC_SMAX_X2, SMEMOp.S_ATOMIC_UMAX_X2, SMEMOp.S_ATOMIC_AND_X2, SMEMOp.S_ATOMIC_OR_X2, SMEMOp.S_ATOMIC_XOR_X2, SMEMOp.S_ATOMIC_INC_X2, SMEMOp.S_ATOMIC_DEC_X2}) + sdata = SGPRField(12, 6) + sbase = SBaseField(5, 0) + soffset = SGPRField(63, 57, default=NULL) + offset = BitField(52, 32) + glc = BitField(16, 16) + soffset_en = BitField(14, 14) + nv = BitField(15, 15) + imm = BitField(17, 17) + +class SOP1(Inst): + encoding = FixedBitField(31, 23, 0b101111101) + op = EnumBitField(15, 8, SOP1Op, {SOP1Op.S_MOV_B32, SOP1Op.S_MOV_B64, SOP1Op.S_CMOV_B32, SOP1Op.S_CMOV_B64, SOP1Op.S_NOT_B32, SOP1Op.S_NOT_B64, SOP1Op.S_WQM_B32, SOP1Op.S_WQM_B64, SOP1Op.S_BREV_B32, SOP1Op.S_BREV_B64, SOP1Op.S_BCNT0_I32_B32, SOP1Op.S_BCNT0_I32_B64, SOP1Op.S_BCNT1_I32_B32, SOP1Op.S_BCNT1_I32_B64, SOP1Op.S_FF0_I32_B32, SOP1Op.S_FF0_I32_B64, SOP1Op.S_FF1_I32_B32, SOP1Op.S_FF1_I32_B64, SOP1Op.S_FLBIT_I32_B32, SOP1Op.S_FLBIT_I32_B64, SOP1Op.S_FLBIT_I32, SOP1Op.S_FLBIT_I32_I64, SOP1Op.S_SEXT_I32_I8, SOP1Op.S_SEXT_I32_I16, SOP1Op.S_BITSET0_B32, SOP1Op.S_BITSET0_B64, SOP1Op.S_BITSET1_B32, SOP1Op.S_BITSET1_B64, SOP1Op.S_GETPC_B64, SOP1Op.S_SETPC_B64, SOP1Op.S_SWAPPC_B64, SOP1Op.S_RFE_B64, SOP1Op.S_AND_SAVEEXEC_B64, SOP1Op.S_OR_SAVEEXEC_B64, SOP1Op.S_XOR_SAVEEXEC_B64, SOP1Op.S_ANDN2_SAVEEXEC_B64, SOP1Op.S_ORN2_SAVEEXEC_B64, SOP1Op.S_NAND_SAVEEXEC_B64, SOP1Op.S_NOR_SAVEEXEC_B64, SOP1Op.S_XNOR_SAVEEXEC_B64, SOP1Op.S_QUADMASK_B32, SOP1Op.S_QUADMASK_B64, SOP1Op.S_MOVRELS_B32, SOP1Op.S_MOVRELS_B64, SOP1Op.S_MOVRELD_B32, SOP1Op.S_MOVRELD_B64, SOP1Op.S_CBRANCH_JOIN, SOP1Op.S_ABS_I32, SOP1Op.S_SET_GPR_IDX_IDX, SOP1Op.S_ANDN1_SAVEEXEC_B64, SOP1Op.S_ORN1_SAVEEXEC_B64, SOP1Op.S_ANDN1_WREXEC_B64, SOP1Op.S_ANDN2_WREXEC_B64, SOP1Op.S_BITREPLICATE_B64_B32}) + sdst = SGPRField(22, 16) + ssrc0 = SSrcField(7, 0) + +class SOP2(Inst): + encoding = FixedBitField(31, 30, 0b10) + op = EnumBitField(29, 23, SOP2Op, {SOP2Op.S_ADD_U32, SOP2Op.S_SUB_U32, SOP2Op.S_ADD_I32, SOP2Op.S_SUB_I32, SOP2Op.S_ADDC_U32, SOP2Op.S_SUBB_U32, SOP2Op.S_MIN_I32, SOP2Op.S_MIN_U32, SOP2Op.S_MAX_I32, SOP2Op.S_MAX_U32, SOP2Op.S_CSELECT_B32, SOP2Op.S_CSELECT_B64, SOP2Op.S_AND_B32, SOP2Op.S_AND_B64, SOP2Op.S_OR_B32, SOP2Op.S_OR_B64, SOP2Op.S_XOR_B32, SOP2Op.S_XOR_B64, SOP2Op.S_ANDN2_B32, SOP2Op.S_ANDN2_B64, SOP2Op.S_ORN2_B32, SOP2Op.S_ORN2_B64, SOP2Op.S_NAND_B32, SOP2Op.S_NAND_B64, SOP2Op.S_NOR_B32, SOP2Op.S_NOR_B64, SOP2Op.S_XNOR_B32, SOP2Op.S_XNOR_B64, SOP2Op.S_LSHL_B32, SOP2Op.S_LSHL_B64, SOP2Op.S_LSHR_B32, SOP2Op.S_LSHR_B64, SOP2Op.S_ASHR_I32, SOP2Op.S_ASHR_I64, SOP2Op.S_BFM_B32, SOP2Op.S_BFM_B64, SOP2Op.S_MUL_I32, SOP2Op.S_BFE_U32, SOP2Op.S_BFE_I32, SOP2Op.S_BFE_U64, SOP2Op.S_BFE_I64, SOP2Op.S_CBRANCH_G_FORK, SOP2Op.S_ABSDIFF_I32, SOP2Op.S_RFE_RESTORE_B64, SOP2Op.S_MUL_HI_U32, SOP2Op.S_MUL_HI_I32, SOP2Op.S_LSHL1_ADD_U32, SOP2Op.S_LSHL2_ADD_U32, SOP2Op.S_LSHL3_ADD_U32, SOP2Op.S_LSHL4_ADD_U32, SOP2Op.S_PACK_LL_B32_B16, SOP2Op.S_PACK_LH_B32_B16, SOP2Op.S_PACK_HH_B32_B16}) + sdst = SGPRField(22, 16) + ssrc0 = SSrcField(7, 0) + ssrc1 = SSrcField(15, 8) + +class SOPC(Inst): + encoding = FixedBitField(31, 23, 0b101111110) + op = EnumBitField(22, 16, SOPCOp, {SOPCOp.S_CMP_EQ_I32, SOPCOp.S_CMP_LG_I32, SOPCOp.S_CMP_GT_I32, SOPCOp.S_CMP_GE_I32, SOPCOp.S_CMP_LT_I32, SOPCOp.S_CMP_LE_I32, SOPCOp.S_CMP_EQ_U32, SOPCOp.S_CMP_LG_U32, SOPCOp.S_CMP_GT_U32, SOPCOp.S_CMP_GE_U32, SOPCOp.S_CMP_LT_U32, SOPCOp.S_CMP_LE_U32, SOPCOp.S_BITCMP0_B32, SOPCOp.S_BITCMP1_B32, SOPCOp.S_BITCMP0_B64, SOPCOp.S_BITCMP1_B64, SOPCOp.S_SETVSKIP, SOPCOp.S_SET_GPR_IDX_ON, SOPCOp.S_CMP_EQ_U64, SOPCOp.S_CMP_LG_U64}) + ssrc0 = SSrcField(7, 0) + ssrc1 = SSrcField(15, 8) + +class SOPK(Inst): + encoding = FixedBitField(31, 28, 0b1011) + op = EnumBitField(27, 23, SOPKOp, {SOPKOp.S_MOVK_I32, SOPKOp.S_CMOVK_I32, SOPKOp.S_CMPK_EQ_I32, SOPKOp.S_CMPK_LG_I32, SOPKOp.S_CMPK_GT_I32, SOPKOp.S_CMPK_GE_I32, SOPKOp.S_CMPK_LT_I32, SOPKOp.S_CMPK_LE_I32, SOPKOp.S_CMPK_EQ_U32, SOPKOp.S_CMPK_LG_U32, SOPKOp.S_CMPK_GT_U32, SOPKOp.S_CMPK_GE_U32, SOPKOp.S_CMPK_LT_U32, SOPKOp.S_CMPK_LE_U32, SOPKOp.S_ADDK_I32, SOPKOp.S_MULK_I32, SOPKOp.S_CBRANCH_I_FORK, SOPKOp.S_GETREG_B32, SOPKOp.S_SETREG_B32, SOPKOp.S_CALL_B64}) + sdst = SGPRField(22, 16) + simm16 = BitField(15, 0) + +class SOPP(Inst): + encoding = FixedBitField(31, 23, 0b101111111) + op = EnumBitField(22, 16, SOPPOp, {SOPPOp.S_NOP, SOPPOp.S_ENDPGM, SOPPOp.S_BRANCH, SOPPOp.S_WAKEUP, SOPPOp.S_CBRANCH_SCC0, SOPPOp.S_CBRANCH_SCC1, SOPPOp.S_CBRANCH_VCCZ, SOPPOp.S_CBRANCH_VCCNZ, SOPPOp.S_CBRANCH_EXECZ, SOPPOp.S_CBRANCH_EXECNZ, SOPPOp.S_BARRIER, SOPPOp.S_SETKILL, SOPPOp.S_WAITCNT, SOPPOp.S_SETHALT, SOPPOp.S_SLEEP, SOPPOp.S_SETPRIO, SOPPOp.S_SENDMSG, SOPPOp.S_SENDMSGHALT, SOPPOp.S_TRAP, SOPPOp.S_ICACHE_INV, SOPPOp.S_INCPERFLEVEL, SOPPOp.S_DECPERFLEVEL, SOPPOp.S_TTRACEDATA, SOPPOp.S_CBRANCH_CDBGSYS, SOPPOp.S_CBRANCH_CDBGUSER, SOPPOp.S_CBRANCH_CDBGSYS_OR_USER, SOPPOp.S_CBRANCH_CDBGSYS_AND_USER, SOPPOp.S_ENDPGM_SAVED, SOPPOp.S_SET_GPR_IDX_OFF, SOPPOp.S_SET_GPR_IDX_MODE, SOPPOp.S_ENDPGM_ORDERED_PS_DONE, SOPPOp.S_SET_VALU_COEXEC_MODE}) + simm16 = BitField(15, 0) + +class VOP1(Inst): + encoding = FixedBitField(31, 25, 0b0111111) + op = EnumBitField(16, 9, VOP1Op, {VOP1Op.V_NOP, VOP1Op.V_MOV_B32, VOP1Op.V_READFIRSTLANE_B32, VOP1Op.V_CVT_I32_F64, VOP1Op.V_CVT_F64_I32, VOP1Op.V_CVT_F32_I32, VOP1Op.V_CVT_F32_U32, VOP1Op.V_CVT_U32_F32, VOP1Op.V_CVT_I32_F32, VOP1Op.V_CVT_F16_F32, VOP1Op.V_CVT_F32_F16, VOP1Op.V_CVT_RPI_I32_F32, VOP1Op.V_CVT_FLR_I32_F32, VOP1Op.V_CVT_OFF_F32_I4, VOP1Op.V_CVT_F32_F64, VOP1Op.V_CVT_F64_F32, VOP1Op.V_CVT_F32_UBYTE0, VOP1Op.V_CVT_F32_UBYTE1, VOP1Op.V_CVT_F32_UBYTE2, VOP1Op.V_CVT_F32_UBYTE3, VOP1Op.V_CVT_U32_F64, VOP1Op.V_CVT_F64_U32, VOP1Op.V_TRUNC_F64, VOP1Op.V_CEIL_F64, VOP1Op.V_RNDNE_F64, VOP1Op.V_FLOOR_F64, VOP1Op.V_FRACT_F32, VOP1Op.V_TRUNC_F32, VOP1Op.V_CEIL_F32, VOP1Op.V_RNDNE_F32, VOP1Op.V_FLOOR_F32, VOP1Op.V_EXP_F32, VOP1Op.V_LOG_F32, VOP1Op.V_RCP_F32, VOP1Op.V_RCP_IFLAG_F32, VOP1Op.V_RSQ_F32, VOP1Op.V_RCP_F64, VOP1Op.V_RSQ_F64, VOP1Op.V_SQRT_F32, VOP1Op.V_SQRT_F64, VOP1Op.V_SIN_F32, VOP1Op.V_COS_F32, VOP1Op.V_NOT_B32, VOP1Op.V_BFREV_B32, VOP1Op.V_FFBH_U32, VOP1Op.V_FFBL_B32, VOP1Op.V_FFBH_I32, VOP1Op.V_FREXP_EXP_I32_F64, VOP1Op.V_FREXP_MANT_F64, VOP1Op.V_FRACT_F64, VOP1Op.V_FREXP_EXP_I32_F32, VOP1Op.V_FREXP_MANT_F32, VOP1Op.V_CLREXCP, VOP1Op.V_SCREEN_PARTITION_4SE_B32, VOP1Op.V_MOV_B64, VOP1Op.V_CVT_F16_U16, VOP1Op.V_CVT_F16_I16, VOP1Op.V_CVT_U16_F16, VOP1Op.V_CVT_I16_F16, VOP1Op.V_RCP_F16, VOP1Op.V_SQRT_F16, VOP1Op.V_RSQ_F16, VOP1Op.V_LOG_F16, VOP1Op.V_EXP_F16, VOP1Op.V_FREXP_MANT_F16, VOP1Op.V_FREXP_EXP_I16_F16, VOP1Op.V_FLOOR_F16, VOP1Op.V_CEIL_F16, VOP1Op.V_TRUNC_F16, VOP1Op.V_RNDNE_F16, VOP1Op.V_FRACT_F16, VOP1Op.V_SIN_F16, VOP1Op.V_COS_F16, VOP1Op.V_EXP_LEGACY_F32, VOP1Op.V_LOG_LEGACY_F32, VOP1Op.V_CVT_NORM_I16_F16, VOP1Op.V_CVT_NORM_U16_F16, VOP1Op.V_SAT_PK_U8_I16, VOP1Op.V_SWAP_B32, VOP1Op.V_ACCVGPR_MOV_B32, VOP1Op.V_CVT_F32_FP8, VOP1Op.V_CVT_F32_BF8, VOP1Op.V_CVT_PK_F32_FP8, VOP1Op.V_CVT_PK_F32_BF8, VOP1Op.V_PRNG_B32, VOP1Op.V_PERMLANE16_SWAP_B32, VOP1Op.V_PERMLANE32_SWAP_B32, VOP1Op.V_CVT_F32_BF16}) + vdst = VGPRField(24, 17) + src0 = SrcField(8, 0) + +class VOP2(Inst): + encoding = FixedBitField(31, 31, 0b0) + op = EnumBitField(30, 25, VOP2Op, {VOP2Op.V_CNDMASK_B32, VOP2Op.V_ADD_F32, VOP2Op.V_SUB_F32, VOP2Op.V_SUBREV_F32, VOP2Op.V_FMAC_F64, VOP2Op.V_MUL_F32, VOP2Op.V_MUL_I32_I24, VOP2Op.V_MUL_HI_I32_I24, VOP2Op.V_MUL_U32_U24, VOP2Op.V_MUL_HI_U32_U24, VOP2Op.V_MIN_F32, VOP2Op.V_MAX_F32, VOP2Op.V_MIN_I32, VOP2Op.V_MAX_I32, VOP2Op.V_MIN_U32, VOP2Op.V_MAX_U32, VOP2Op.V_LSHRREV_B32, VOP2Op.V_ASHRREV_I32, VOP2Op.V_LSHLREV_B32, VOP2Op.V_AND_B32, VOP2Op.V_OR_B32, VOP2Op.V_XOR_B32, VOP2Op.V_DOT2C_F32_BF16, VOP2Op.V_ADD_CO_U32, VOP2Op.V_SUB_CO_U32, VOP2Op.V_SUBREV_CO_U32, VOP2Op.V_ADDC_CO_U32, VOP2Op.V_SUBB_CO_U32, VOP2Op.V_SUBBREV_CO_U32, VOP2Op.V_ADD_F16, VOP2Op.V_SUB_F16, VOP2Op.V_SUBREV_F16, VOP2Op.V_MUL_F16, VOP2Op.V_MAC_F16, VOP2Op.V_ADD_U16, VOP2Op.V_SUB_U16, VOP2Op.V_SUBREV_U16, VOP2Op.V_MUL_LO_U16, VOP2Op.V_LSHLREV_B16, VOP2Op.V_LSHRREV_B16, VOP2Op.V_ASHRREV_I16, VOP2Op.V_MAX_F16, VOP2Op.V_MIN_F16, VOP2Op.V_MAX_U16, VOP2Op.V_MAX_I16, VOP2Op.V_MIN_U16, VOP2Op.V_MIN_I16, VOP2Op.V_LDEXP_F16, VOP2Op.V_ADD_U32, VOP2Op.V_SUB_U32, VOP2Op.V_SUBREV_U32, VOP2Op.V_DOT2C_F32_F16, VOP2Op.V_DOT2C_I32_I16, VOP2Op.V_DOT4C_I32_I8, VOP2Op.V_DOT8C_I32_I4, VOP2Op.V_FMAC_F32, VOP2Op.V_PK_FMAC_F16, VOP2Op.V_XNOR_B32}) + vdst = VGPRField(24, 17) + src0 = SrcField(8, 0) + vsrc1 = VGPRField(16, 9) + +class VOP3(Inst): + encoding = FixedBitField(31, 26, 0b110100) + op = EnumBitField(25, 16, VOP3Op, {VOP3Op.V_CMPX_CLASS_F32, VOP3Op.V_CMPX_CLASS_F64, VOP3Op.V_CMPX_CLASS_F16, VOP3Op.V_CMPX_F_F16, VOP3Op.V_CMPX_LT_F16, VOP3Op.V_CMPX_EQ_F16, VOP3Op.V_CMPX_LE_F16, VOP3Op.V_CMPX_GT_F16, VOP3Op.V_CMPX_LG_F16, VOP3Op.V_CMPX_GE_F16, VOP3Op.V_CMPX_O_F16, VOP3Op.V_CMPX_U_F16, VOP3Op.V_CMPX_NGE_F16, VOP3Op.V_CMPX_NLG_F16, VOP3Op.V_CMPX_NGT_F16, VOP3Op.V_CMPX_NLE_F16, VOP3Op.V_CMPX_NEQ_F16, VOP3Op.V_CMPX_NLT_F16, VOP3Op.V_CMPX_TRU_F16, VOP3Op.V_CMPX_F_F32, VOP3Op.V_CMPX_LT_F32, VOP3Op.V_CMPX_EQ_F32, VOP3Op.V_CMPX_LE_F32, VOP3Op.V_CMPX_GT_F32, VOP3Op.V_CMPX_LG_F32, VOP3Op.V_CMPX_GE_F32, VOP3Op.V_CMPX_O_F32, VOP3Op.V_CMPX_U_F32, VOP3Op.V_CMPX_NGE_F32, VOP3Op.V_CMPX_NLG_F32, VOP3Op.V_CMPX_NGT_F32, VOP3Op.V_CMPX_NLE_F32, VOP3Op.V_CMPX_NEQ_F32, VOP3Op.V_CMPX_NLT_F32, VOP3Op.V_CMPX_TRU_F32, VOP3Op.V_CMPX_F_F64, VOP3Op.V_CMPX_LT_F64, VOP3Op.V_CMPX_EQ_F64, VOP3Op.V_CMPX_LE_F64, VOP3Op.V_CMPX_GT_F64, VOP3Op.V_CMPX_LG_F64, VOP3Op.V_CMPX_GE_F64, VOP3Op.V_CMPX_O_F64, VOP3Op.V_CMPX_U_F64, VOP3Op.V_CMPX_NGE_F64, VOP3Op.V_CMPX_NLG_F64, VOP3Op.V_CMPX_NGT_F64, VOP3Op.V_CMPX_NLE_F64, VOP3Op.V_CMPX_NEQ_F64, VOP3Op.V_CMPX_NLT_F64, VOP3Op.V_CMPX_TRU_F64, VOP3Op.V_CMPX_F_I16, VOP3Op.V_CMPX_LT_I16, VOP3Op.V_CMPX_EQ_I16, VOP3Op.V_CMPX_LE_I16, VOP3Op.V_CMPX_GT_I16, VOP3Op.V_CMPX_NE_I16, VOP3Op.V_CMPX_GE_I16, VOP3Op.V_CMPX_T_I16, VOP3Op.V_CMPX_F_U16, VOP3Op.V_CMPX_LT_U16, VOP3Op.V_CMPX_EQ_U16, VOP3Op.V_CMPX_LE_U16, VOP3Op.V_CMPX_GT_U16, VOP3Op.V_CMPX_NE_U16, VOP3Op.V_CMPX_GE_U16, VOP3Op.V_CMPX_T_U16, VOP3Op.V_CMPX_F_I32, VOP3Op.V_CMPX_LT_I32, VOP3Op.V_CMPX_EQ_I32, VOP3Op.V_CMPX_LE_I32, VOP3Op.V_CMPX_GT_I32, VOP3Op.V_CMPX_NE_I32, VOP3Op.V_CMPX_GE_I32, VOP3Op.V_CMPX_T_I32, VOP3Op.V_CMPX_F_U32, VOP3Op.V_CMPX_LT_U32, VOP3Op.V_CMPX_EQ_U32, VOP3Op.V_CMPX_LE_U32, VOP3Op.V_CMPX_GT_U32, VOP3Op.V_CMPX_NE_U32, VOP3Op.V_CMPX_GE_U32, VOP3Op.V_CMPX_T_U32, VOP3Op.V_CMPX_F_I64, VOP3Op.V_CMPX_LT_I64, VOP3Op.V_CMPX_EQ_I64, VOP3Op.V_CMPX_LE_I64, VOP3Op.V_CMPX_GT_I64, VOP3Op.V_CMPX_NE_I64, VOP3Op.V_CMPX_GE_I64, VOP3Op.V_CMPX_T_I64, VOP3Op.V_CMPX_F_U64, VOP3Op.V_CMPX_LT_U64, VOP3Op.V_CMPX_EQ_U64, VOP3Op.V_CMPX_LE_U64, VOP3Op.V_CMPX_GT_U64, VOP3Op.V_CMPX_NE_U64, VOP3Op.V_CMPX_GE_U64, VOP3Op.V_CMPX_T_U64, VOP3Op.V_CNDMASK_B32, VOP3Op.V_ADD_F32, VOP3Op.V_SUB_F32, VOP3Op.V_SUBREV_F32, VOP3Op.V_FMAC_F64, VOP3Op.V_MUL_F32, VOP3Op.V_MUL_I32_I24, VOP3Op.V_MUL_HI_I32_I24, VOP3Op.V_MUL_U32_U24, VOP3Op.V_MUL_HI_U32_U24, VOP3Op.V_MIN_F32, VOP3Op.V_MAX_F32, VOP3Op.V_MIN_I32, VOP3Op.V_MAX_I32, VOP3Op.V_MIN_U32, VOP3Op.V_MAX_U32, VOP3Op.V_LSHRREV_B32, VOP3Op.V_ASHRREV_I32, VOP3Op.V_LSHLREV_B32, VOP3Op.V_AND_B32, VOP3Op.V_OR_B32, VOP3Op.V_XOR_B32, VOP3Op.V_DOT2C_F32_BF16, VOP3Op.V_ADD_F16, VOP3Op.V_SUB_F16, VOP3Op.V_SUBREV_F16, VOP3Op.V_MUL_F16, VOP3Op.V_MAC_F16, VOP3Op.V_ADD_U16, VOP3Op.V_SUB_U16, VOP3Op.V_SUBREV_U16, VOP3Op.V_MUL_LO_U16, VOP3Op.V_LSHLREV_B16, VOP3Op.V_LSHRREV_B16, VOP3Op.V_ASHRREV_I16, VOP3Op.V_MAX_F16, VOP3Op.V_MIN_F16, VOP3Op.V_MAX_U16, VOP3Op.V_MAX_I16, VOP3Op.V_MIN_U16, VOP3Op.V_MIN_I16, VOP3Op.V_LDEXP_F16, VOP3Op.V_ADD_U32, VOP3Op.V_SUB_U32, VOP3Op.V_SUBREV_U32, VOP3Op.V_DOT2C_F32_F16, VOP3Op.V_DOT2C_I32_I16, VOP3Op.V_DOT4C_I32_I8, VOP3Op.V_DOT8C_I32_I4, VOP3Op.V_FMAC_F32, VOP3Op.V_PK_FMAC_F16, VOP3Op.V_XNOR_B32, VOP3Op.V_NOP, VOP3Op.V_MOV_B32, VOP3Op.V_READFIRSTLANE_B32, VOP3Op.V_CVT_I32_F64, VOP3Op.V_CVT_F64_I32, VOP3Op.V_CVT_F32_I32, VOP3Op.V_CVT_F32_U32, VOP3Op.V_CVT_U32_F32, VOP3Op.V_CVT_I32_F32, VOP3Op.V_CVT_F16_F32, VOP3Op.V_CVT_F32_F16, VOP3Op.V_CVT_RPI_I32_F32, VOP3Op.V_CVT_FLR_I32_F32, VOP3Op.V_CVT_OFF_F32_I4, VOP3Op.V_CVT_F32_F64, VOP3Op.V_CVT_F64_F32, VOP3Op.V_CVT_F32_UBYTE0, VOP3Op.V_CVT_F32_UBYTE1, VOP3Op.V_CVT_F32_UBYTE2, VOP3Op.V_CVT_F32_UBYTE3, VOP3Op.V_CVT_U32_F64, VOP3Op.V_CVT_F64_U32, VOP3Op.V_TRUNC_F64, VOP3Op.V_CEIL_F64, VOP3Op.V_RNDNE_F64, VOP3Op.V_FLOOR_F64, VOP3Op.V_FRACT_F32, VOP3Op.V_TRUNC_F32, VOP3Op.V_CEIL_F32, VOP3Op.V_RNDNE_F32, VOP3Op.V_FLOOR_F32, VOP3Op.V_EXP_F32, VOP3Op.V_LOG_F32, VOP3Op.V_RCP_F32, VOP3Op.V_RCP_IFLAG_F32, VOP3Op.V_RSQ_F32, VOP3Op.V_RCP_F64, VOP3Op.V_RSQ_F64, VOP3Op.V_SQRT_F32, VOP3Op.V_SQRT_F64, VOP3Op.V_SIN_F32, VOP3Op.V_COS_F32, VOP3Op.V_NOT_B32, VOP3Op.V_BFREV_B32, VOP3Op.V_FFBH_U32, VOP3Op.V_FFBL_B32, VOP3Op.V_FFBH_I32, VOP3Op.V_FREXP_EXP_I32_F64, VOP3Op.V_FREXP_MANT_F64, VOP3Op.V_FRACT_F64, VOP3Op.V_FREXP_EXP_I32_F32, VOP3Op.V_FREXP_MANT_F32, VOP3Op.V_CLREXCP, VOP3Op.V_SCREEN_PARTITION_4SE_B32, VOP3Op.V_MOV_B64, VOP3Op.V_CVT_F16_U16, VOP3Op.V_CVT_F16_I16, VOP3Op.V_CVT_U16_F16, VOP3Op.V_CVT_I16_F16, VOP3Op.V_RCP_F16, VOP3Op.V_SQRT_F16, VOP3Op.V_RSQ_F16, VOP3Op.V_LOG_F16, VOP3Op.V_EXP_F16, VOP3Op.V_FREXP_MANT_F16, VOP3Op.V_FREXP_EXP_I16_F16, VOP3Op.V_FLOOR_F16, VOP3Op.V_CEIL_F16, VOP3Op.V_TRUNC_F16, VOP3Op.V_RNDNE_F16, VOP3Op.V_FRACT_F16, VOP3Op.V_SIN_F16, VOP3Op.V_COS_F16, VOP3Op.V_EXP_LEGACY_F32, VOP3Op.V_LOG_LEGACY_F32, VOP3Op.V_CVT_NORM_I16_F16, VOP3Op.V_CVT_NORM_U16_F16, VOP3Op.V_SAT_PK_U8_I16, VOP3Op.V_SWAP_B32, VOP3Op.V_ACCVGPR_MOV_B32, VOP3Op.V_CVT_F32_FP8, VOP3Op.V_CVT_F32_BF8, VOP3Op.V_CVT_PK_F32_FP8, VOP3Op.V_CVT_PK_F32_BF8, VOP3Op.V_PRNG_B32, VOP3Op.V_PERMLANE16_SWAP_B32, VOP3Op.V_PERMLANE32_SWAP_B32, VOP3Op.V_CVT_F32_BF16, VOP3Op.V_MAD_I32_I24, VOP3Op.V_MAD_U32_U24, VOP3Op.V_CUBEID_F32, VOP3Op.V_CUBESC_F32, VOP3Op.V_CUBETC_F32, VOP3Op.V_CUBEMA_F32, VOP3Op.V_BFE_U32, VOP3Op.V_BFE_I32, VOP3Op.V_BFI_B32, VOP3Op.V_FMA_F32, VOP3Op.V_FMA_F64, VOP3Op.V_LERP_U8, VOP3Op.V_ALIGNBIT_B32, VOP3Op.V_ALIGNBYTE_B32, VOP3Op.V_MIN3_F32, VOP3Op.V_MIN3_I32, VOP3Op.V_MIN3_U32, VOP3Op.V_MAX3_F32, VOP3Op.V_MAX3_I32, VOP3Op.V_MAX3_U32, VOP3Op.V_MED3_F32, VOP3Op.V_MED3_I32, VOP3Op.V_MED3_U32, VOP3Op.V_SAD_U8, VOP3Op.V_SAD_HI_U8, VOP3Op.V_SAD_U16, VOP3Op.V_SAD_U32, VOP3Op.V_CVT_PK_U8_F32, VOP3Op.V_DIV_FIXUP_F32, VOP3Op.V_DIV_FIXUP_F64, VOP3Op.V_DIV_FMAS_F32, VOP3Op.V_DIV_FMAS_F64, VOP3Op.V_MSAD_U8, VOP3Op.V_QSAD_PK_U16_U8, VOP3Op.V_MQSAD_PK_U16_U8, VOP3Op.V_MQSAD_U32_U8, VOP3Op.V_MAD_LEGACY_F16, VOP3Op.V_MAD_LEGACY_U16, VOP3Op.V_MAD_LEGACY_I16, VOP3Op.V_PERM_B32, VOP3Op.V_FMA_LEGACY_F16, VOP3Op.V_DIV_FIXUP_LEGACY_F16, VOP3Op.V_CVT_PKACCUM_U8_F32, VOP3Op.V_MAD_U32_U16, VOP3Op.V_MAD_I32_I16, VOP3Op.V_XAD_U32, VOP3Op.V_MIN3_F16, VOP3Op.V_MIN3_I16, VOP3Op.V_MIN3_U16, VOP3Op.V_MAX3_F16, VOP3Op.V_MAX3_I16, VOP3Op.V_MAX3_U16, VOP3Op.V_MED3_F16, VOP3Op.V_MED3_I16, VOP3Op.V_MED3_U16, VOP3Op.V_LSHL_ADD_U32, VOP3Op.V_ADD_LSHL_U32, VOP3Op.V_ADD3_U32, VOP3Op.V_LSHL_OR_B32, VOP3Op.V_AND_OR_B32, VOP3Op.V_OR3_B32, VOP3Op.V_MAD_F16, VOP3Op.V_MAD_U16, VOP3Op.V_MAD_I16, VOP3Op.V_FMA_F16, VOP3Op.V_DIV_FIXUP_F16, VOP3Op.V_LSHL_ADD_U64, VOP3Op.V_BITOP3_B16, VOP3Op.V_BITOP3_B32, VOP3Op.V_CVT_SCALEF32_PK_FP8_F32, VOP3Op.V_CVT_SCALEF32_PK_BF8_F32, VOP3Op.V_CVT_SCALEF32_SR_FP8_F32, VOP3Op.V_CVT_SCALEF32_SR_BF8_F32, VOP3Op.V_CVT_SCALEF32_PK_F32_FP8, VOP3Op.V_CVT_SCALEF32_PK_F32_BF8, VOP3Op.V_CVT_SCALEF32_F32_FP8, VOP3Op.V_CVT_SCALEF32_F32_BF8, VOP3Op.V_CVT_SCALEF32_PK_FP4_F32, VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_F32, VOP3Op.V_CVT_SCALEF32_PK_F32_FP4, VOP3Op.V_CVT_SCALEF32_PK_FP8_F16, VOP3Op.V_CVT_SCALEF32_PK_BF8_F16, VOP3Op.V_CVT_SCALEF32_SR_FP8_F16, VOP3Op.V_CVT_SCALEF32_SR_BF8_F16, VOP3Op.V_CVT_SCALEF32_PK_FP8_BF16, VOP3Op.V_CVT_SCALEF32_PK_BF8_BF16, VOP3Op.V_CVT_SCALEF32_SR_FP8_BF16, VOP3Op.V_CVT_SCALEF32_SR_BF8_BF16, VOP3Op.V_CVT_SCALEF32_PK_F16_FP8, VOP3Op.V_CVT_SCALEF32_PK_F16_BF8, VOP3Op.V_CVT_SCALEF32_F16_FP8, VOP3Op.V_CVT_SCALEF32_F16_BF8, VOP3Op.V_CVT_SCALEF32_PK_FP4_F16, VOP3Op.V_CVT_SCALEF32_PK_FP4_BF16, VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_F16, VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_BF16, VOP3Op.V_CVT_SCALEF32_PK_F16_FP4, VOP3Op.V_CVT_SCALEF32_PK_BF16_FP4, VOP3Op.V_CVT_SCALEF32_2XPK16_FP6_F32, VOP3Op.V_CVT_SCALEF32_2XPK16_BF6_F32, VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_F32, VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_F32, VOP3Op.V_CVT_SCALEF32_PK32_F32_FP6, VOP3Op.V_CVT_SCALEF32_PK32_F32_BF6, VOP3Op.V_CVT_SCALEF32_PK32_FP6_F16, VOP3Op.V_CVT_SCALEF32_PK32_FP6_BF16, VOP3Op.V_CVT_SCALEF32_PK32_BF6_F16, VOP3Op.V_CVT_SCALEF32_PK32_BF6_BF16, VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_F16, VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_BF16, VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_F16, VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_BF16, VOP3Op.V_CVT_SCALEF32_PK32_F16_FP6, VOP3Op.V_CVT_SCALEF32_PK32_BF16_FP6, VOP3Op.V_CVT_SCALEF32_PK32_F16_BF6, VOP3Op.V_CVT_SCALEF32_PK32_BF16_BF6, VOP3Op.V_ASHR_PK_I8_I32, VOP3Op.V_ASHR_PK_U8_I32, VOP3Op.V_CVT_PK_F16_F32, VOP3Op.V_CVT_PK_BF16_F32, VOP3Op.V_CVT_SCALEF32_PK_BF16_FP8, VOP3Op.V_CVT_SCALEF32_PK_BF16_BF8, VOP3Op.V_ADD_F64, VOP3Op.V_MUL_F64, VOP3Op.V_MIN_F64, VOP3Op.V_MAX_F64, VOP3Op.V_LDEXP_F64, VOP3Op.V_MUL_LO_U32, VOP3Op.V_MUL_HI_U32, VOP3Op.V_MUL_HI_I32, VOP3Op.V_LDEXP_F32, VOP3Op.V_READLANE_B32, VOP3Op.V_WRITELANE_B32, VOP3Op.V_BCNT_U32_B32, VOP3Op.V_MBCNT_LO_U32_B32, VOP3Op.V_MBCNT_HI_U32_B32, VOP3Op.V_LSHLREV_B64, VOP3Op.V_LSHRREV_B64, VOP3Op.V_ASHRREV_I64, VOP3Op.V_TRIG_PREOP_F64, VOP3Op.V_BFM_B32, VOP3Op.V_CVT_PKNORM_I16_F32, VOP3Op.V_CVT_PKNORM_U16_F32, VOP3Op.V_CVT_PKRTZ_F16_F32, VOP3Op.V_CVT_PK_U16_U32, VOP3Op.V_CVT_PK_I16_I32, VOP3Op.V_CVT_PKNORM_I16_F16, VOP3Op.V_CVT_PKNORM_U16_F16, VOP3Op.V_ADD_I32, VOP3Op.V_SUB_I32, VOP3Op.V_ADD_I16, VOP3Op.V_SUB_I16, VOP3Op.V_PACK_B32_F16, VOP3Op.V_MUL_LEGACY_F32, VOP3Op.V_CVT_PK_FP8_F32, VOP3Op.V_CVT_PK_BF8_F32, VOP3Op.V_CVT_SR_FP8_F32, VOP3Op.V_CVT_SR_BF8_F32, VOP3Op.V_CVT_SR_F16_F32, VOP3Op.V_CVT_SR_BF16_F32, VOP3Op.V_MINIMUM3_F32, VOP3Op.V_MAXIMUM3_F32}) + vdst = VGPRField(7, 0) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + omod = BitField(60, 59) + neg = BitField(63, 61) + abs = BitField(10, 8) + clmp = BitField(15, 15) + opsel = BitField(14, 11) + +class VOP3P(Inst): + encoding = FixedBitField(31, 23, 0b110100111) + op = EnumBitField(22, 16, VOP3POp, {VOP3POp.V_PK_MAD_I16, VOP3POp.V_PK_MUL_LO_U16, VOP3POp.V_PK_ADD_I16, VOP3POp.V_PK_SUB_I16, VOP3POp.V_PK_LSHLREV_B16, VOP3POp.V_PK_LSHRREV_B16, VOP3POp.V_PK_ASHRREV_I16, VOP3POp.V_PK_MAX_I16, VOP3POp.V_PK_MIN_I16, VOP3POp.V_PK_MAD_U16, VOP3POp.V_PK_ADD_U16, VOP3POp.V_PK_SUB_U16, VOP3POp.V_PK_MAX_U16, VOP3POp.V_PK_MIN_U16, VOP3POp.V_PK_FMA_F16, VOP3POp.V_PK_ADD_F16, VOP3POp.V_PK_MUL_F16, VOP3POp.V_PK_MIN_F16, VOP3POp.V_PK_MAX_F16, VOP3POp.V_DOT2_F32_BF16, VOP3POp.V_PK_MINIMUM3_F16, VOP3POp.V_PK_MAXIMUM3_F16, VOP3POp.V_MAD_MIX_F32, VOP3POp.V_MAD_MIXLO_F16, VOP3POp.V_MAD_MIXHI_F16, VOP3POp.V_DOT2_F32_F16, VOP3POp.V_DOT2_I32_I16, VOP3POp.V_DOT2_U32_U16, VOP3POp.V_DOT4_I32_I8, VOP3POp.V_DOT4_U32_U8, VOP3POp.V_DOT8_I32_I4, VOP3POp.V_DOT8_U32_U4, VOP3POp.V_MFMA_LD_SCALE_B32, VOP3POp.V_PK_FMA_F32, VOP3POp.V_PK_MUL_F32, VOP3POp.V_PK_ADD_F32, VOP3POp.V_PK_MOV_B32, VOP3POp.V_MFMA_F32_16X16X8_XF32, VOP3POp.V_MFMA_F32_32X32X4_XF32, VOP3POp.V_ACCVGPR_READ, VOP3POp.V_ACCVGPR_WRITE}) + vdst = VGPRField(7, 0) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + neg = BitField(63, 61) + neg_hi = BitField(10, 8) + clmp = BitField(15, 15) + opsel = BitField(13, 11) + opsel_hi = BitField(60, 59, default=3) + opsel_hi2 = BitField(14, 14, default=1) + +class VOP3PX2(Inst): + encoding = FixedBitField(95, 87, 0b110100111) + op = EnumBitField(86, 80, VOP3PX2Op, {VOP3PX2Op.V_MFMA_SCALE_F32_16X16X128_F8F6F4, VOP3PX2Op.V_MFMA_SCALE_F32_32X32X64_F8F6F4}) + vdst = VGPRField(71, 64) + src0 = SrcField(104, 96) + src1 = SrcField(113, 105) + src2 = SrcField(122, 114) + neg = BitField(63, 61) + neg_hi = BitField(10, 8) + opsel = BitField(13, 11) + opsel_hi = BitField(60, 59) + cbsz = BitField(74, 72) + abid = BitField(78, 75) + acc_cd = BitField(79, 79) + acc = BitField(124, 123) + blgp = BitField(127, 125) + x2encoding = BitField(31, 16) + scale_src0 = BitField(40, 32) + scale_src1 = BitField(49, 41) + +class VOP3SD(Inst): + encoding = FixedBitField(31, 26, 0b110100) + op = EnumBitField(25, 16, VOP3SDOp, {VOP3SDOp.V_ADD_CO_U32, VOP3SDOp.V_SUB_CO_U32, VOP3SDOp.V_SUBREV_CO_U32, VOP3SDOp.V_ADDC_CO_U32, VOP3SDOp.V_SUBB_CO_U32, VOP3SDOp.V_SUBBREV_CO_U32, VOP3SDOp.V_DIV_SCALE_F32, VOP3SDOp.V_DIV_SCALE_F64, VOP3SDOp.V_MAD_U64_U32, VOP3SDOp.V_MAD_I64_I32}) + vdst = VGPRField(7, 0) + sdst = SGPRField(14, 8) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + omod = BitField(60, 59) + neg = BitField(63, 61) + clmp = BitField(15, 15) + +class VOPC(Inst): + encoding = FixedBitField(31, 25, 0b0111110) + op = EnumBitField(24, 17, VOPCOp, {VOPCOp.V_CMP_CLASS_F32, VOPCOp.V_CMPX_CLASS_F32, VOPCOp.V_CMP_CLASS_F64, VOPCOp.V_CMPX_CLASS_F64, VOPCOp.V_CMP_CLASS_F16, VOPCOp.V_CMPX_CLASS_F16, VOPCOp.V_CMP_F_F16, VOPCOp.V_CMP_LT_F16, VOPCOp.V_CMP_EQ_F16, VOPCOp.V_CMP_LE_F16, VOPCOp.V_CMP_GT_F16, VOPCOp.V_CMP_LG_F16, VOPCOp.V_CMP_GE_F16, VOPCOp.V_CMP_O_F16, VOPCOp.V_CMP_U_F16, VOPCOp.V_CMP_NGE_F16, VOPCOp.V_CMP_NLG_F16, VOPCOp.V_CMP_NGT_F16, VOPCOp.V_CMP_NLE_F16, VOPCOp.V_CMP_NEQ_F16, VOPCOp.V_CMP_NLT_F16, VOPCOp.V_CMP_TRU_F16, VOPCOp.V_CMPX_F_F16, VOPCOp.V_CMPX_LT_F16, VOPCOp.V_CMPX_EQ_F16, VOPCOp.V_CMPX_LE_F16, VOPCOp.V_CMPX_GT_F16, VOPCOp.V_CMPX_LG_F16, VOPCOp.V_CMPX_GE_F16, VOPCOp.V_CMPX_O_F16, VOPCOp.V_CMPX_U_F16, VOPCOp.V_CMPX_NGE_F16, VOPCOp.V_CMPX_NLG_F16, VOPCOp.V_CMPX_NGT_F16, VOPCOp.V_CMPX_NLE_F16, VOPCOp.V_CMPX_NEQ_F16, VOPCOp.V_CMPX_NLT_F16, VOPCOp.V_CMPX_TRU_F16, VOPCOp.V_CMP_F_F32, VOPCOp.V_CMP_LT_F32, VOPCOp.V_CMP_EQ_F32, VOPCOp.V_CMP_LE_F32, VOPCOp.V_CMP_GT_F32, VOPCOp.V_CMP_LG_F32, VOPCOp.V_CMP_GE_F32, VOPCOp.V_CMP_O_F32, VOPCOp.V_CMP_U_F32, VOPCOp.V_CMP_NGE_F32, VOPCOp.V_CMP_NLG_F32, VOPCOp.V_CMP_NGT_F32, VOPCOp.V_CMP_NLE_F32, VOPCOp.V_CMP_NEQ_F32, VOPCOp.V_CMP_NLT_F32, VOPCOp.V_CMP_TRU_F32, VOPCOp.V_CMPX_F_F32, VOPCOp.V_CMPX_LT_F32, VOPCOp.V_CMPX_EQ_F32, VOPCOp.V_CMPX_LE_F32, VOPCOp.V_CMPX_GT_F32, VOPCOp.V_CMPX_LG_F32, VOPCOp.V_CMPX_GE_F32, VOPCOp.V_CMPX_O_F32, VOPCOp.V_CMPX_U_F32, VOPCOp.V_CMPX_NGE_F32, VOPCOp.V_CMPX_NLG_F32, VOPCOp.V_CMPX_NGT_F32, VOPCOp.V_CMPX_NLE_F32, VOPCOp.V_CMPX_NEQ_F32, VOPCOp.V_CMPX_NLT_F32, VOPCOp.V_CMPX_TRU_F32, VOPCOp.V_CMP_F_F64, VOPCOp.V_CMP_LT_F64, VOPCOp.V_CMP_EQ_F64, VOPCOp.V_CMP_LE_F64, VOPCOp.V_CMP_GT_F64, VOPCOp.V_CMP_LG_F64, VOPCOp.V_CMP_GE_F64, VOPCOp.V_CMP_O_F64, VOPCOp.V_CMP_U_F64, VOPCOp.V_CMP_NGE_F64, VOPCOp.V_CMP_NLG_F64, VOPCOp.V_CMP_NGT_F64, VOPCOp.V_CMP_NLE_F64, VOPCOp.V_CMP_NEQ_F64, VOPCOp.V_CMP_NLT_F64, VOPCOp.V_CMP_TRU_F64, VOPCOp.V_CMPX_F_F64, VOPCOp.V_CMPX_LT_F64, VOPCOp.V_CMPX_EQ_F64, VOPCOp.V_CMPX_LE_F64, VOPCOp.V_CMPX_GT_F64, VOPCOp.V_CMPX_LG_F64, VOPCOp.V_CMPX_GE_F64, VOPCOp.V_CMPX_O_F64, VOPCOp.V_CMPX_U_F64, VOPCOp.V_CMPX_NGE_F64, VOPCOp.V_CMPX_NLG_F64, VOPCOp.V_CMPX_NGT_F64, VOPCOp.V_CMPX_NLE_F64, VOPCOp.V_CMPX_NEQ_F64, VOPCOp.V_CMPX_NLT_F64, VOPCOp.V_CMPX_TRU_F64, VOPCOp.V_CMP_F_I16, VOPCOp.V_CMP_LT_I16, VOPCOp.V_CMP_EQ_I16, VOPCOp.V_CMP_LE_I16, VOPCOp.V_CMP_GT_I16, VOPCOp.V_CMP_NE_I16, VOPCOp.V_CMP_GE_I16, VOPCOp.V_CMP_T_I16, VOPCOp.V_CMP_F_U16, VOPCOp.V_CMP_LT_U16, VOPCOp.V_CMP_EQ_U16, VOPCOp.V_CMP_LE_U16, VOPCOp.V_CMP_GT_U16, VOPCOp.V_CMP_NE_U16, VOPCOp.V_CMP_GE_U16, VOPCOp.V_CMP_T_U16, VOPCOp.V_CMPX_F_I16, VOPCOp.V_CMPX_LT_I16, VOPCOp.V_CMPX_EQ_I16, VOPCOp.V_CMPX_LE_I16, VOPCOp.V_CMPX_GT_I16, VOPCOp.V_CMPX_NE_I16, VOPCOp.V_CMPX_GE_I16, VOPCOp.V_CMPX_T_I16, VOPCOp.V_CMPX_F_U16, VOPCOp.V_CMPX_LT_U16, VOPCOp.V_CMPX_EQ_U16, VOPCOp.V_CMPX_LE_U16, VOPCOp.V_CMPX_GT_U16, VOPCOp.V_CMPX_NE_U16, VOPCOp.V_CMPX_GE_U16, VOPCOp.V_CMPX_T_U16, VOPCOp.V_CMP_F_I32, VOPCOp.V_CMP_LT_I32, VOPCOp.V_CMP_EQ_I32, VOPCOp.V_CMP_LE_I32, VOPCOp.V_CMP_GT_I32, VOPCOp.V_CMP_NE_I32, VOPCOp.V_CMP_GE_I32, VOPCOp.V_CMP_T_I32, VOPCOp.V_CMP_F_U32, VOPCOp.V_CMP_LT_U32, VOPCOp.V_CMP_EQ_U32, VOPCOp.V_CMP_LE_U32, VOPCOp.V_CMP_GT_U32, VOPCOp.V_CMP_NE_U32, VOPCOp.V_CMP_GE_U32, VOPCOp.V_CMP_T_U32, VOPCOp.V_CMPX_F_I32, VOPCOp.V_CMPX_LT_I32, VOPCOp.V_CMPX_EQ_I32, VOPCOp.V_CMPX_LE_I32, VOPCOp.V_CMPX_GT_I32, VOPCOp.V_CMPX_NE_I32, VOPCOp.V_CMPX_GE_I32, VOPCOp.V_CMPX_T_I32, VOPCOp.V_CMPX_F_U32, VOPCOp.V_CMPX_LT_U32, VOPCOp.V_CMPX_EQ_U32, VOPCOp.V_CMPX_LE_U32, VOPCOp.V_CMPX_GT_U32, VOPCOp.V_CMPX_NE_U32, VOPCOp.V_CMPX_GE_U32, VOPCOp.V_CMPX_T_U32, VOPCOp.V_CMP_F_I64, VOPCOp.V_CMP_LT_I64, VOPCOp.V_CMP_EQ_I64, VOPCOp.V_CMP_LE_I64, VOPCOp.V_CMP_GT_I64, VOPCOp.V_CMP_NE_I64, VOPCOp.V_CMP_GE_I64, VOPCOp.V_CMP_T_I64, VOPCOp.V_CMP_F_U64, VOPCOp.V_CMP_LT_U64, VOPCOp.V_CMP_EQ_U64, VOPCOp.V_CMP_LE_U64, VOPCOp.V_CMP_GT_U64, VOPCOp.V_CMP_NE_U64, VOPCOp.V_CMP_GE_U64, VOPCOp.V_CMP_T_U64, VOPCOp.V_CMPX_F_I64, VOPCOp.V_CMPX_LT_I64, VOPCOp.V_CMPX_EQ_I64, VOPCOp.V_CMPX_LE_I64, VOPCOp.V_CMPX_GT_I64, VOPCOp.V_CMPX_NE_I64, VOPCOp.V_CMPX_GE_I64, VOPCOp.V_CMPX_T_I64, VOPCOp.V_CMPX_F_U64, VOPCOp.V_CMPX_LT_U64, VOPCOp.V_CMPX_EQ_U64, VOPCOp.V_CMPX_LE_U64, VOPCOp.V_CMPX_GT_U64, VOPCOp.V_CMPX_NE_U64, VOPCOp.V_CMPX_GE_U64, VOPCOp.V_CMPX_T_U64}) + src0 = SrcField(8, 0) + vsrc1 = VGPRField(16, 9) + +class SOP1_LIT(SOP1): + op = EnumBitField(15, 8, SOP1Op, {SOP1Op.S_MOV_B32, SOP1Op.S_MOV_B64, SOP1Op.S_CMOV_B32, SOP1Op.S_CMOV_B64, SOP1Op.S_NOT_B32, SOP1Op.S_NOT_B64, SOP1Op.S_WQM_B32, SOP1Op.S_WQM_B64, SOP1Op.S_BREV_B32, SOP1Op.S_BREV_B64, SOP1Op.S_BCNT0_I32_B32, SOP1Op.S_BCNT0_I32_B64, SOP1Op.S_BCNT1_I32_B32, SOP1Op.S_BCNT1_I32_B64, SOP1Op.S_FF0_I32_B32, SOP1Op.S_FF0_I32_B64, SOP1Op.S_FF1_I32_B32, SOP1Op.S_FF1_I32_B64, SOP1Op.S_FLBIT_I32_B32, SOP1Op.S_FLBIT_I32_B64, SOP1Op.S_FLBIT_I32, SOP1Op.S_FLBIT_I32_I64, SOP1Op.S_SEXT_I32_I8, SOP1Op.S_SEXT_I32_I16, SOP1Op.S_BITSET0_B32, SOP1Op.S_BITSET0_B64, SOP1Op.S_BITSET1_B32, SOP1Op.S_BITSET1_B64, SOP1Op.S_GETPC_B64, SOP1Op.S_SETPC_B64, SOP1Op.S_SWAPPC_B64, SOP1Op.S_RFE_B64, SOP1Op.S_AND_SAVEEXEC_B64, SOP1Op.S_OR_SAVEEXEC_B64, SOP1Op.S_XOR_SAVEEXEC_B64, SOP1Op.S_ANDN2_SAVEEXEC_B64, SOP1Op.S_ORN2_SAVEEXEC_B64, SOP1Op.S_NAND_SAVEEXEC_B64, SOP1Op.S_NOR_SAVEEXEC_B64, SOP1Op.S_XNOR_SAVEEXEC_B64, SOP1Op.S_QUADMASK_B32, SOP1Op.S_QUADMASK_B64, SOP1Op.S_MOVRELS_B32, SOP1Op.S_MOVRELS_B64, SOP1Op.S_MOVRELD_B32, SOP1Op.S_MOVRELD_B64, SOP1Op.S_CBRANCH_JOIN, SOP1Op.S_ABS_I32, SOP1Op.S_SET_GPR_IDX_IDX, SOP1Op.S_ANDN1_SAVEEXEC_B64, SOP1Op.S_ORN1_SAVEEXEC_B64, SOP1Op.S_ANDN1_WREXEC_B64, SOP1Op.S_ANDN2_WREXEC_B64, SOP1Op.S_BITREPLICATE_B64_B32}) + literal = BitField(63, 32) + +class SOP2_LIT(SOP2): + op = EnumBitField(29, 23, SOP2Op, {SOP2Op.S_ADD_U32, SOP2Op.S_SUB_U32, SOP2Op.S_ADD_I32, SOP2Op.S_SUB_I32, SOP2Op.S_ADDC_U32, SOP2Op.S_SUBB_U32, SOP2Op.S_MIN_I32, SOP2Op.S_MIN_U32, SOP2Op.S_MAX_I32, SOP2Op.S_MAX_U32, SOP2Op.S_CSELECT_B32, SOP2Op.S_CSELECT_B64, SOP2Op.S_AND_B32, SOP2Op.S_AND_B64, SOP2Op.S_OR_B32, SOP2Op.S_OR_B64, SOP2Op.S_XOR_B32, SOP2Op.S_XOR_B64, SOP2Op.S_ANDN2_B32, SOP2Op.S_ANDN2_B64, SOP2Op.S_ORN2_B32, SOP2Op.S_ORN2_B64, SOP2Op.S_NAND_B32, SOP2Op.S_NAND_B64, SOP2Op.S_NOR_B32, SOP2Op.S_NOR_B64, SOP2Op.S_XNOR_B32, SOP2Op.S_XNOR_B64, SOP2Op.S_LSHL_B32, SOP2Op.S_LSHL_B64, SOP2Op.S_LSHR_B32, SOP2Op.S_LSHR_B64, SOP2Op.S_ASHR_I32, SOP2Op.S_ASHR_I64, SOP2Op.S_BFM_B32, SOP2Op.S_BFM_B64, SOP2Op.S_MUL_I32, SOP2Op.S_BFE_U32, SOP2Op.S_BFE_I32, SOP2Op.S_BFE_U64, SOP2Op.S_BFE_I64, SOP2Op.S_CBRANCH_G_FORK, SOP2Op.S_ABSDIFF_I32, SOP2Op.S_RFE_RESTORE_B64, SOP2Op.S_MUL_HI_U32, SOP2Op.S_MUL_HI_I32, SOP2Op.S_LSHL1_ADD_U32, SOP2Op.S_LSHL2_ADD_U32, SOP2Op.S_LSHL3_ADD_U32, SOP2Op.S_LSHL4_ADD_U32, SOP2Op.S_PACK_LL_B32_B16, SOP2Op.S_PACK_LH_B32_B16, SOP2Op.S_PACK_HH_B32_B16}) + literal = BitField(63, 32) + +class SOPC_LIT(SOPC): + op = EnumBitField(22, 16, SOPCOp, {SOPCOp.S_CMP_EQ_I32, SOPCOp.S_CMP_LG_I32, SOPCOp.S_CMP_GT_I32, SOPCOp.S_CMP_GE_I32, SOPCOp.S_CMP_LT_I32, SOPCOp.S_CMP_LE_I32, SOPCOp.S_CMP_EQ_U32, SOPCOp.S_CMP_LG_U32, SOPCOp.S_CMP_GT_U32, SOPCOp.S_CMP_GE_U32, SOPCOp.S_CMP_LT_U32, SOPCOp.S_CMP_LE_U32, SOPCOp.S_BITCMP0_B32, SOPCOp.S_BITCMP1_B32, SOPCOp.S_BITCMP0_B64, SOPCOp.S_BITCMP1_B64, SOPCOp.S_SETVSKIP, SOPCOp.S_SET_GPR_IDX_ON, SOPCOp.S_CMP_EQ_U64, SOPCOp.S_CMP_LG_U64}) + literal = BitField(63, 32) + +class SOPK_LIT(SOPK): + op = EnumBitField(27, 23, SOPKOp, {SOPKOp.S_MOVK_I32, SOPKOp.S_CMOVK_I32, SOPKOp.S_CMPK_EQ_I32, SOPKOp.S_CMPK_LG_I32, SOPKOp.S_CMPK_GT_I32, SOPKOp.S_CMPK_GE_I32, SOPKOp.S_CMPK_LT_I32, SOPKOp.S_CMPK_LE_I32, SOPKOp.S_CMPK_EQ_U32, SOPKOp.S_CMPK_LG_U32, SOPKOp.S_CMPK_GT_U32, SOPKOp.S_CMPK_GE_U32, SOPKOp.S_CMPK_LT_U32, SOPKOp.S_CMPK_LE_U32, SOPKOp.S_ADDK_I32, SOPKOp.S_MULK_I32, SOPKOp.S_CBRANCH_I_FORK, SOPKOp.S_GETREG_B32, SOPKOp.S_SETREG_B32, SOPKOp.S_SETREG_IMM32_B32, SOPKOp.S_CALL_B64}) + literal = BitField(63, 32) + +class VOP1_DPP16(VOP1): + vsrc0 = VGPRField(39, 32) + dpp = BitField(48, 40) + bc = BitField(51, 51) + row_mask = BitField(63, 60) + bank_mask = BitField(59, 56) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(54, 54) + src1_abs = BitField(55, 55) + +class VOP1_LIT(VOP1): + op = EnumBitField(16, 9, VOP1Op, {VOP1Op.V_NOP, VOP1Op.V_MOV_B32, VOP1Op.V_READFIRSTLANE_B32, VOP1Op.V_CVT_I32_F64, VOP1Op.V_CVT_F64_I32, VOP1Op.V_CVT_F32_I32, VOP1Op.V_CVT_F32_U32, VOP1Op.V_CVT_U32_F32, VOP1Op.V_CVT_I32_F32, VOP1Op.V_CVT_F16_F32, VOP1Op.V_CVT_F32_F16, VOP1Op.V_CVT_RPI_I32_F32, VOP1Op.V_CVT_FLR_I32_F32, VOP1Op.V_CVT_OFF_F32_I4, VOP1Op.V_CVT_F32_F64, VOP1Op.V_CVT_F64_F32, VOP1Op.V_CVT_F32_UBYTE0, VOP1Op.V_CVT_F32_UBYTE1, VOP1Op.V_CVT_F32_UBYTE2, VOP1Op.V_CVT_F32_UBYTE3, VOP1Op.V_CVT_U32_F64, VOP1Op.V_CVT_F64_U32, VOP1Op.V_TRUNC_F64, VOP1Op.V_CEIL_F64, VOP1Op.V_RNDNE_F64, VOP1Op.V_FLOOR_F64, VOP1Op.V_FRACT_F32, VOP1Op.V_TRUNC_F32, VOP1Op.V_CEIL_F32, VOP1Op.V_RNDNE_F32, VOP1Op.V_FLOOR_F32, VOP1Op.V_EXP_F32, VOP1Op.V_LOG_F32, VOP1Op.V_RCP_F32, VOP1Op.V_RCP_IFLAG_F32, VOP1Op.V_RSQ_F32, VOP1Op.V_RCP_F64, VOP1Op.V_RSQ_F64, VOP1Op.V_SQRT_F32, VOP1Op.V_SQRT_F64, VOP1Op.V_SIN_F32, VOP1Op.V_COS_F32, VOP1Op.V_NOT_B32, VOP1Op.V_BFREV_B32, VOP1Op.V_FFBH_U32, VOP1Op.V_FFBL_B32, VOP1Op.V_FFBH_I32, VOP1Op.V_FREXP_EXP_I32_F64, VOP1Op.V_FREXP_MANT_F64, VOP1Op.V_FRACT_F64, VOP1Op.V_FREXP_EXP_I32_F32, VOP1Op.V_FREXP_MANT_F32, VOP1Op.V_CLREXCP, VOP1Op.V_SCREEN_PARTITION_4SE_B32, VOP1Op.V_MOV_B64, VOP1Op.V_CVT_F16_U16, VOP1Op.V_CVT_F16_I16, VOP1Op.V_CVT_U16_F16, VOP1Op.V_CVT_I16_F16, VOP1Op.V_RCP_F16, VOP1Op.V_SQRT_F16, VOP1Op.V_RSQ_F16, VOP1Op.V_LOG_F16, VOP1Op.V_EXP_F16, VOP1Op.V_FREXP_MANT_F16, VOP1Op.V_FREXP_EXP_I16_F16, VOP1Op.V_FLOOR_F16, VOP1Op.V_CEIL_F16, VOP1Op.V_TRUNC_F16, VOP1Op.V_RNDNE_F16, VOP1Op.V_FRACT_F16, VOP1Op.V_SIN_F16, VOP1Op.V_COS_F16, VOP1Op.V_EXP_LEGACY_F32, VOP1Op.V_LOG_LEGACY_F32, VOP1Op.V_CVT_NORM_I16_F16, VOP1Op.V_CVT_NORM_U16_F16, VOP1Op.V_SAT_PK_U8_I16, VOP1Op.V_SWAP_B32, VOP1Op.V_ACCVGPR_MOV_B32, VOP1Op.V_CVT_F32_FP8, VOP1Op.V_CVT_F32_BF8, VOP1Op.V_CVT_PK_F32_FP8, VOP1Op.V_CVT_PK_F32_BF8, VOP1Op.V_PRNG_B32, VOP1Op.V_PERMLANE16_SWAP_B32, VOP1Op.V_PERMLANE32_SWAP_B32, VOP1Op.V_CVT_F32_BF16}) + literal = BitField(63, 32) + +class VOP1_SDWA(VOP1): + vsrc0 = VGPRField(39, 32) + omod = BitField(47, 46) + clmp = BitField(45, 45) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(60, 60) + src1_abs = BitField(61, 61) + dst_sel = BitField(42, 40) + dst_unused = BitField(44, 43) + src0_sel = BitField(50, 48) + src1_sel = BitField(58, 56) + src0_sext = BitField(51, 51) + s0 = BitField(55, 55) + src1_sext = BitField(59, 59) + s1 = BitField(63, 63) + +class VOP2_DPP16(VOP2): + vsrc0 = VGPRField(39, 32) + dpp = BitField(48, 40) + bc = BitField(51, 51) + row_mask = BitField(63, 60) + bank_mask = BitField(59, 56) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(54, 54) + src1_abs = BitField(55, 55) + +class VOP2_LIT(VOP2): + op = EnumBitField(30, 25, VOP2Op, {VOP2Op.V_CNDMASK_B32, VOP2Op.V_ADD_F32, VOP2Op.V_SUB_F32, VOP2Op.V_SUBREV_F32, VOP2Op.V_FMAC_F64, VOP2Op.V_MUL_F32, VOP2Op.V_MUL_I32_I24, VOP2Op.V_MUL_HI_I32_I24, VOP2Op.V_MUL_U32_U24, VOP2Op.V_MUL_HI_U32_U24, VOP2Op.V_MIN_F32, VOP2Op.V_MAX_F32, VOP2Op.V_MIN_I32, VOP2Op.V_MAX_I32, VOP2Op.V_MIN_U32, VOP2Op.V_MAX_U32, VOP2Op.V_LSHRREV_B32, VOP2Op.V_ASHRREV_I32, VOP2Op.V_LSHLREV_B32, VOP2Op.V_AND_B32, VOP2Op.V_OR_B32, VOP2Op.V_XOR_B32, VOP2Op.V_DOT2C_F32_BF16, VOP2Op.V_FMAMK_F32, VOP2Op.V_FMAAK_F32, VOP2Op.V_ADD_CO_U32, VOP2Op.V_SUB_CO_U32, VOP2Op.V_SUBREV_CO_U32, VOP2Op.V_ADDC_CO_U32, VOP2Op.V_SUBB_CO_U32, VOP2Op.V_SUBBREV_CO_U32, VOP2Op.V_ADD_F16, VOP2Op.V_SUB_F16, VOP2Op.V_SUBREV_F16, VOP2Op.V_MUL_F16, VOP2Op.V_MAC_F16, VOP2Op.V_MADMK_F16, VOP2Op.V_MADAK_F16, VOP2Op.V_ADD_U16, VOP2Op.V_SUB_U16, VOP2Op.V_SUBREV_U16, VOP2Op.V_MUL_LO_U16, VOP2Op.V_LSHLREV_B16, VOP2Op.V_LSHRREV_B16, VOP2Op.V_ASHRREV_I16, VOP2Op.V_MAX_F16, VOP2Op.V_MIN_F16, VOP2Op.V_MAX_U16, VOP2Op.V_MAX_I16, VOP2Op.V_MIN_U16, VOP2Op.V_MIN_I16, VOP2Op.V_LDEXP_F16, VOP2Op.V_ADD_U32, VOP2Op.V_SUB_U32, VOP2Op.V_SUBREV_U32, VOP2Op.V_DOT2C_F32_F16, VOP2Op.V_DOT2C_I32_I16, VOP2Op.V_DOT4C_I32_I8, VOP2Op.V_DOT8C_I32_I4, VOP2Op.V_FMAC_F32, VOP2Op.V_PK_FMAC_F16, VOP2Op.V_XNOR_B32}) + literal = BitField(63, 32) + +class VOP2_SDWA(VOP2): + vsrc0 = VGPRField(39, 32) + omod = BitField(47, 46) + clmp = BitField(45, 45) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(60, 60) + src1_abs = BitField(61, 61) + dst_sel = BitField(42, 40) + dst_unused = BitField(44, 43) + src0_sel = BitField(50, 48) + src1_sel = BitField(58, 56) + src0_sext = BitField(51, 51) + s0 = BitField(55, 55) + src1_sext = BitField(59, 59) + s1 = BitField(63, 63) + +class VOP2_SDWA_SDST(VOP2): + sdst = SGPRField(46, 40) + vsrc0 = VGPRField(39, 32) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(60, 60) + src1_abs = BitField(61, 61) + src0_sel = BitField(50, 48) + src1_sel = BitField(58, 56) + sd = BitField(47, 47) + src0_sext = BitField(51, 51) + s0 = BitField(55, 55) + src1_sext = BitField(59, 59) + s1 = BitField(63, 63) + +class VOP3P_MFMA(VOP3P): + op = EnumBitField(22, 16, VOP3POp, {VOP3POp.V_MFMA_F32_16X16X128_F8F6F4, VOP3POp.V_MFMA_F32_32X32X64_F8F6F4, VOP3POp.V_MFMA_F32_16X16X32_BF16, VOP3POp.V_MFMA_I32_16X16X64_I8, VOP3POp.V_MFMA_F32_32X32X16_BF16, VOP3POp.V_MFMA_I32_32X32X32_I8, VOP3POp.V_SMFMAC_F32_16X16X64_BF16, VOP3POp.V_SMFMAC_I32_16X16X128_I8, VOP3POp.V_SMFMAC_F32_16X16X128_BF8_BF8, VOP3POp.V_SMFMAC_F32_16X16X128_BF8_FP8, VOP3POp.V_SMFMAC_F32_16X16X128_FP8_BF8, VOP3POp.V_MFMA_F32_32X32X1_2B_F32, VOP3POp.V_MFMA_F32_16X16X1_4B_F32, VOP3POp.V_MFMA_F32_4X4X1_16B_F32, VOP3POp.V_SMFMAC_F32_16X16X128_FP8_FP8, VOP3POp.V_MFMA_F32_32X32X2_F32, VOP3POp.V_MFMA_F32_16X16X4_F32, VOP3POp.V_SMFMAC_F32_32X32X32_BF16, VOP3POp.V_SMFMAC_I32_32X32X64_I8, VOP3POp.V_MFMA_F32_32X32X4_2B_F16, VOP3POp.V_MFMA_F32_16X16X4_4B_F16, VOP3POp.V_MFMA_F32_4X4X4_16B_F16, VOP3POp.V_SMFMAC_F32_32X32X64_BF8_BF8, VOP3POp.V_MFMA_F32_32X32X8_F16, VOP3POp.V_MFMA_F32_16X16X16_F16, VOP3POp.V_SMFMAC_F32_32X32X64_BF8_FP8, VOP3POp.V_SMFMAC_F32_32X32X64_FP8_BF8, VOP3POp.V_MFMA_I32_32X32X4_2B_I8, VOP3POp.V_MFMA_I32_16X16X4_4B_I8, VOP3POp.V_MFMA_I32_4X4X4_16B_I8, VOP3POp.V_SMFMAC_F32_32X32X64_FP8_FP8, VOP3POp.V_MFMA_F32_16X16X32_F16, VOP3POp.V_MFMA_F32_32X32X16_F16, VOP3POp.V_MFMA_I32_32X32X16_I8, VOP3POp.V_MFMA_I32_16X16X32_I8, VOP3POp.V_SMFMAC_F32_16X16X64_F16, VOP3POp.V_SMFMAC_F32_32X32X32_F16, VOP3POp.V_MFMA_F32_32X32X4_2B_BF16, VOP3POp.V_MFMA_F32_16X16X4_4B_BF16, VOP3POp.V_MFMA_F32_4X4X4_16B_BF16, VOP3POp.V_MFMA_F32_32X32X8_BF16, VOP3POp.V_MFMA_F32_16X16X16_BF16, VOP3POp.V_SMFMAC_F32_16X16X32_F16, VOP3POp.V_SMFMAC_F32_32X32X16_F16, VOP3POp.V_SMFMAC_F32_16X16X32_BF16, VOP3POp.V_SMFMAC_F32_32X32X16_BF16, VOP3POp.V_SMFMAC_I32_16X16X64_I8, VOP3POp.V_SMFMAC_I32_32X32X32_I8, VOP3POp.V_MFMA_F64_16X16X4_F64, VOP3POp.V_MFMA_F64_4X4X4_4B_F64, VOP3POp.V_MFMA_F32_16X16X32_BF8_BF8, VOP3POp.V_MFMA_F32_16X16X32_BF8_FP8, VOP3POp.V_MFMA_F32_16X16X32_FP8_BF8, VOP3POp.V_MFMA_F32_16X16X32_FP8_FP8, VOP3POp.V_MFMA_F32_32X32X16_BF8_BF8, VOP3POp.V_MFMA_F32_32X32X16_BF8_FP8, VOP3POp.V_MFMA_F32_32X32X16_FP8_BF8, VOP3POp.V_MFMA_F32_32X32X16_FP8_FP8, VOP3POp.V_SMFMAC_F32_16X16X64_BF8_BF8, VOP3POp.V_SMFMAC_F32_16X16X64_BF8_FP8, VOP3POp.V_SMFMAC_F32_16X16X64_FP8_BF8, VOP3POp.V_SMFMAC_F32_16X16X64_FP8_FP8, VOP3POp.V_SMFMAC_F32_32X32X32_BF8_BF8, VOP3POp.V_SMFMAC_F32_32X32X32_BF8_FP8, VOP3POp.V_SMFMAC_F32_32X32X32_FP8_BF8, VOP3POp.V_SMFMAC_F32_32X32X32_FP8_FP8}) + cbsz = BitField(10, 8) + abid = BitField(14, 11) + acc_cd = BitField(15, 15) + acc = BitField(60, 59) + blgp = BitField(63, 61) + +class VOPC_LIT(VOPC): + op = EnumBitField(24, 17, VOPCOp, {VOPCOp.V_CMP_CLASS_F32, VOPCOp.V_CMPX_CLASS_F32, VOPCOp.V_CMP_CLASS_F64, VOPCOp.V_CMPX_CLASS_F64, VOPCOp.V_CMP_CLASS_F16, VOPCOp.V_CMPX_CLASS_F16, VOPCOp.V_CMP_F_F16, VOPCOp.V_CMP_LT_F16, VOPCOp.V_CMP_EQ_F16, VOPCOp.V_CMP_LE_F16, VOPCOp.V_CMP_GT_F16, VOPCOp.V_CMP_LG_F16, VOPCOp.V_CMP_GE_F16, VOPCOp.V_CMP_O_F16, VOPCOp.V_CMP_U_F16, VOPCOp.V_CMP_NGE_F16, VOPCOp.V_CMP_NLG_F16, VOPCOp.V_CMP_NGT_F16, VOPCOp.V_CMP_NLE_F16, VOPCOp.V_CMP_NEQ_F16, VOPCOp.V_CMP_NLT_F16, VOPCOp.V_CMP_TRU_F16, VOPCOp.V_CMPX_F_F16, VOPCOp.V_CMPX_LT_F16, VOPCOp.V_CMPX_EQ_F16, VOPCOp.V_CMPX_LE_F16, VOPCOp.V_CMPX_GT_F16, VOPCOp.V_CMPX_LG_F16, VOPCOp.V_CMPX_GE_F16, VOPCOp.V_CMPX_O_F16, VOPCOp.V_CMPX_U_F16, VOPCOp.V_CMPX_NGE_F16, VOPCOp.V_CMPX_NLG_F16, VOPCOp.V_CMPX_NGT_F16, VOPCOp.V_CMPX_NLE_F16, VOPCOp.V_CMPX_NEQ_F16, VOPCOp.V_CMPX_NLT_F16, VOPCOp.V_CMPX_TRU_F16, VOPCOp.V_CMP_F_F32, VOPCOp.V_CMP_LT_F32, VOPCOp.V_CMP_EQ_F32, VOPCOp.V_CMP_LE_F32, VOPCOp.V_CMP_GT_F32, VOPCOp.V_CMP_LG_F32, VOPCOp.V_CMP_GE_F32, VOPCOp.V_CMP_O_F32, VOPCOp.V_CMP_U_F32, VOPCOp.V_CMP_NGE_F32, VOPCOp.V_CMP_NLG_F32, VOPCOp.V_CMP_NGT_F32, VOPCOp.V_CMP_NLE_F32, VOPCOp.V_CMP_NEQ_F32, VOPCOp.V_CMP_NLT_F32, VOPCOp.V_CMP_TRU_F32, VOPCOp.V_CMPX_F_F32, VOPCOp.V_CMPX_LT_F32, VOPCOp.V_CMPX_EQ_F32, VOPCOp.V_CMPX_LE_F32, VOPCOp.V_CMPX_GT_F32, VOPCOp.V_CMPX_LG_F32, VOPCOp.V_CMPX_GE_F32, VOPCOp.V_CMPX_O_F32, VOPCOp.V_CMPX_U_F32, VOPCOp.V_CMPX_NGE_F32, VOPCOp.V_CMPX_NLG_F32, VOPCOp.V_CMPX_NGT_F32, VOPCOp.V_CMPX_NLE_F32, VOPCOp.V_CMPX_NEQ_F32, VOPCOp.V_CMPX_NLT_F32, VOPCOp.V_CMPX_TRU_F32, VOPCOp.V_CMP_F_F64, VOPCOp.V_CMP_LT_F64, VOPCOp.V_CMP_EQ_F64, VOPCOp.V_CMP_LE_F64, VOPCOp.V_CMP_GT_F64, VOPCOp.V_CMP_LG_F64, VOPCOp.V_CMP_GE_F64, VOPCOp.V_CMP_O_F64, VOPCOp.V_CMP_U_F64, VOPCOp.V_CMP_NGE_F64, VOPCOp.V_CMP_NLG_F64, VOPCOp.V_CMP_NGT_F64, VOPCOp.V_CMP_NLE_F64, VOPCOp.V_CMP_NEQ_F64, VOPCOp.V_CMP_NLT_F64, VOPCOp.V_CMP_TRU_F64, VOPCOp.V_CMPX_F_F64, VOPCOp.V_CMPX_LT_F64, VOPCOp.V_CMPX_EQ_F64, VOPCOp.V_CMPX_LE_F64, VOPCOp.V_CMPX_GT_F64, VOPCOp.V_CMPX_LG_F64, VOPCOp.V_CMPX_GE_F64, VOPCOp.V_CMPX_O_F64, VOPCOp.V_CMPX_U_F64, VOPCOp.V_CMPX_NGE_F64, VOPCOp.V_CMPX_NLG_F64, VOPCOp.V_CMPX_NGT_F64, VOPCOp.V_CMPX_NLE_F64, VOPCOp.V_CMPX_NEQ_F64, VOPCOp.V_CMPX_NLT_F64, VOPCOp.V_CMPX_TRU_F64, VOPCOp.V_CMP_F_I16, VOPCOp.V_CMP_LT_I16, VOPCOp.V_CMP_EQ_I16, VOPCOp.V_CMP_LE_I16, VOPCOp.V_CMP_GT_I16, VOPCOp.V_CMP_NE_I16, VOPCOp.V_CMP_GE_I16, VOPCOp.V_CMP_T_I16, VOPCOp.V_CMP_F_U16, VOPCOp.V_CMP_LT_U16, VOPCOp.V_CMP_EQ_U16, VOPCOp.V_CMP_LE_U16, VOPCOp.V_CMP_GT_U16, VOPCOp.V_CMP_NE_U16, VOPCOp.V_CMP_GE_U16, VOPCOp.V_CMP_T_U16, VOPCOp.V_CMPX_F_I16, VOPCOp.V_CMPX_LT_I16, VOPCOp.V_CMPX_EQ_I16, VOPCOp.V_CMPX_LE_I16, VOPCOp.V_CMPX_GT_I16, VOPCOp.V_CMPX_NE_I16, VOPCOp.V_CMPX_GE_I16, VOPCOp.V_CMPX_T_I16, VOPCOp.V_CMPX_F_U16, VOPCOp.V_CMPX_LT_U16, VOPCOp.V_CMPX_EQ_U16, VOPCOp.V_CMPX_LE_U16, VOPCOp.V_CMPX_GT_U16, VOPCOp.V_CMPX_NE_U16, VOPCOp.V_CMPX_GE_U16, VOPCOp.V_CMPX_T_U16, VOPCOp.V_CMP_F_I32, VOPCOp.V_CMP_LT_I32, VOPCOp.V_CMP_EQ_I32, VOPCOp.V_CMP_LE_I32, VOPCOp.V_CMP_GT_I32, VOPCOp.V_CMP_NE_I32, VOPCOp.V_CMP_GE_I32, VOPCOp.V_CMP_T_I32, VOPCOp.V_CMP_F_U32, VOPCOp.V_CMP_LT_U32, VOPCOp.V_CMP_EQ_U32, VOPCOp.V_CMP_LE_U32, VOPCOp.V_CMP_GT_U32, VOPCOp.V_CMP_NE_U32, VOPCOp.V_CMP_GE_U32, VOPCOp.V_CMP_T_U32, VOPCOp.V_CMPX_F_I32, VOPCOp.V_CMPX_LT_I32, VOPCOp.V_CMPX_EQ_I32, VOPCOp.V_CMPX_LE_I32, VOPCOp.V_CMPX_GT_I32, VOPCOp.V_CMPX_NE_I32, VOPCOp.V_CMPX_GE_I32, VOPCOp.V_CMPX_T_I32, VOPCOp.V_CMPX_F_U32, VOPCOp.V_CMPX_LT_U32, VOPCOp.V_CMPX_EQ_U32, VOPCOp.V_CMPX_LE_U32, VOPCOp.V_CMPX_GT_U32, VOPCOp.V_CMPX_NE_U32, VOPCOp.V_CMPX_GE_U32, VOPCOp.V_CMPX_T_U32, VOPCOp.V_CMP_F_I64, VOPCOp.V_CMP_LT_I64, VOPCOp.V_CMP_EQ_I64, VOPCOp.V_CMP_LE_I64, VOPCOp.V_CMP_GT_I64, VOPCOp.V_CMP_NE_I64, VOPCOp.V_CMP_GE_I64, VOPCOp.V_CMP_T_I64, VOPCOp.V_CMP_F_U64, VOPCOp.V_CMP_LT_U64, VOPCOp.V_CMP_EQ_U64, VOPCOp.V_CMP_LE_U64, VOPCOp.V_CMP_GT_U64, VOPCOp.V_CMP_NE_U64, VOPCOp.V_CMP_GE_U64, VOPCOp.V_CMP_T_U64, VOPCOp.V_CMPX_F_I64, VOPCOp.V_CMPX_LT_I64, VOPCOp.V_CMPX_EQ_I64, VOPCOp.V_CMPX_LE_I64, VOPCOp.V_CMPX_GT_I64, VOPCOp.V_CMPX_NE_I64, VOPCOp.V_CMPX_GE_I64, VOPCOp.V_CMPX_T_I64, VOPCOp.V_CMPX_F_U64, VOPCOp.V_CMPX_LT_U64, VOPCOp.V_CMPX_EQ_U64, VOPCOp.V_CMPX_LE_U64, VOPCOp.V_CMPX_GT_U64, VOPCOp.V_CMPX_NE_U64, VOPCOp.V_CMPX_GE_U64, VOPCOp.V_CMPX_T_U64}) + literal = BitField(63, 32) + +class VOPC_SDWA_SDST(VOPC): + sdst = SGPRField(46, 40) + vsrc0 = VGPRField(39, 32) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(60, 60) + src1_abs = BitField(61, 61) + src0_sel = BitField(50, 48) + src1_sel = BitField(58, 56) + sd = BitField(47, 47) + src0_sext = BitField(51, 51) + s0 = BitField(55, 55) + src1_sext = BitField(59, 59) + s1 = BitField(63, 63) + +class VOP3_SDST(VOP3): + op = EnumBitField(25, 16, VOP3Op, {VOP3Op.V_CMP_CLASS_F32, VOP3Op.V_CMPX_CLASS_F32, VOP3Op.V_CMP_CLASS_F64, VOP3Op.V_CMPX_CLASS_F64, VOP3Op.V_CMP_CLASS_F16, VOP3Op.V_CMPX_CLASS_F16, VOP3Op.V_CMP_F_F16, VOP3Op.V_CMP_LT_F16, VOP3Op.V_CMP_EQ_F16, VOP3Op.V_CMP_LE_F16, VOP3Op.V_CMP_GT_F16, VOP3Op.V_CMP_LG_F16, VOP3Op.V_CMP_GE_F16, VOP3Op.V_CMP_O_F16, VOP3Op.V_CMP_U_F16, VOP3Op.V_CMP_NGE_F16, VOP3Op.V_CMP_NLG_F16, VOP3Op.V_CMP_NGT_F16, VOP3Op.V_CMP_NLE_F16, VOP3Op.V_CMP_NEQ_F16, VOP3Op.V_CMP_NLT_F16, VOP3Op.V_CMP_TRU_F16, VOP3Op.V_CMPX_F_F16, VOP3Op.V_CMPX_LT_F16, VOP3Op.V_CMPX_EQ_F16, VOP3Op.V_CMPX_LE_F16, VOP3Op.V_CMPX_GT_F16, VOP3Op.V_CMPX_LG_F16, VOP3Op.V_CMPX_GE_F16, VOP3Op.V_CMPX_O_F16, VOP3Op.V_CMPX_U_F16, VOP3Op.V_CMPX_NGE_F16, VOP3Op.V_CMPX_NLG_F16, VOP3Op.V_CMPX_NGT_F16, VOP3Op.V_CMPX_NLE_F16, VOP3Op.V_CMPX_NEQ_F16, VOP3Op.V_CMPX_NLT_F16, VOP3Op.V_CMPX_TRU_F16, VOP3Op.V_CMP_F_F32, VOP3Op.V_CMP_LT_F32, VOP3Op.V_CMP_EQ_F32, VOP3Op.V_CMP_LE_F32, VOP3Op.V_CMP_GT_F32, VOP3Op.V_CMP_LG_F32, VOP3Op.V_CMP_GE_F32, VOP3Op.V_CMP_O_F32, VOP3Op.V_CMP_U_F32, VOP3Op.V_CMP_NGE_F32, VOP3Op.V_CMP_NLG_F32, VOP3Op.V_CMP_NGT_F32, VOP3Op.V_CMP_NLE_F32, VOP3Op.V_CMP_NEQ_F32, VOP3Op.V_CMP_NLT_F32, VOP3Op.V_CMP_TRU_F32, VOP3Op.V_CMPX_F_F32, VOP3Op.V_CMPX_LT_F32, VOP3Op.V_CMPX_EQ_F32, VOP3Op.V_CMPX_LE_F32, VOP3Op.V_CMPX_GT_F32, VOP3Op.V_CMPX_LG_F32, VOP3Op.V_CMPX_GE_F32, VOP3Op.V_CMPX_O_F32, VOP3Op.V_CMPX_U_F32, VOP3Op.V_CMPX_NGE_F32, VOP3Op.V_CMPX_NLG_F32, VOP3Op.V_CMPX_NGT_F32, VOP3Op.V_CMPX_NLE_F32, VOP3Op.V_CMPX_NEQ_F32, VOP3Op.V_CMPX_NLT_F32, VOP3Op.V_CMPX_TRU_F32, VOP3Op.V_CMP_F_F64, VOP3Op.V_CMP_LT_F64, VOP3Op.V_CMP_EQ_F64, VOP3Op.V_CMP_LE_F64, VOP3Op.V_CMP_GT_F64, VOP3Op.V_CMP_LG_F64, VOP3Op.V_CMP_GE_F64, VOP3Op.V_CMP_O_F64, VOP3Op.V_CMP_U_F64, VOP3Op.V_CMP_NGE_F64, VOP3Op.V_CMP_NLG_F64, VOP3Op.V_CMP_NGT_F64, VOP3Op.V_CMP_NLE_F64, VOP3Op.V_CMP_NEQ_F64, VOP3Op.V_CMP_NLT_F64, VOP3Op.V_CMP_TRU_F64, VOP3Op.V_CMPX_F_F64, VOP3Op.V_CMPX_LT_F64, VOP3Op.V_CMPX_EQ_F64, VOP3Op.V_CMPX_LE_F64, VOP3Op.V_CMPX_GT_F64, VOP3Op.V_CMPX_LG_F64, VOP3Op.V_CMPX_GE_F64, VOP3Op.V_CMPX_O_F64, VOP3Op.V_CMPX_U_F64, VOP3Op.V_CMPX_NGE_F64, VOP3Op.V_CMPX_NLG_F64, VOP3Op.V_CMPX_NGT_F64, VOP3Op.V_CMPX_NLE_F64, VOP3Op.V_CMPX_NEQ_F64, VOP3Op.V_CMPX_NLT_F64, VOP3Op.V_CMPX_TRU_F64, VOP3Op.V_CMP_F_I16, VOP3Op.V_CMP_LT_I16, VOP3Op.V_CMP_EQ_I16, VOP3Op.V_CMP_LE_I16, VOP3Op.V_CMP_GT_I16, VOP3Op.V_CMP_NE_I16, VOP3Op.V_CMP_GE_I16, VOP3Op.V_CMP_T_I16, VOP3Op.V_CMP_F_U16, VOP3Op.V_CMP_LT_U16, VOP3Op.V_CMP_EQ_U16, VOP3Op.V_CMP_LE_U16, VOP3Op.V_CMP_GT_U16, VOP3Op.V_CMP_NE_U16, VOP3Op.V_CMP_GE_U16, VOP3Op.V_CMP_T_U16, VOP3Op.V_CMPX_F_I16, VOP3Op.V_CMPX_LT_I16, VOP3Op.V_CMPX_EQ_I16, VOP3Op.V_CMPX_LE_I16, VOP3Op.V_CMPX_GT_I16, VOP3Op.V_CMPX_NE_I16, VOP3Op.V_CMPX_GE_I16, VOP3Op.V_CMPX_T_I16, VOP3Op.V_CMPX_F_U16, VOP3Op.V_CMPX_LT_U16, VOP3Op.V_CMPX_EQ_U16, VOP3Op.V_CMPX_LE_U16, VOP3Op.V_CMPX_GT_U16, VOP3Op.V_CMPX_NE_U16, VOP3Op.V_CMPX_GE_U16, VOP3Op.V_CMPX_T_U16, VOP3Op.V_CMP_F_I32, VOP3Op.V_CMP_LT_I32, VOP3Op.V_CMP_EQ_I32, VOP3Op.V_CMP_LE_I32, VOP3Op.V_CMP_GT_I32, VOP3Op.V_CMP_NE_I32, VOP3Op.V_CMP_GE_I32, VOP3Op.V_CMP_T_I32, VOP3Op.V_CMP_F_U32, VOP3Op.V_CMP_LT_U32, VOP3Op.V_CMP_EQ_U32, VOP3Op.V_CMP_LE_U32, VOP3Op.V_CMP_GT_U32, VOP3Op.V_CMP_NE_U32, VOP3Op.V_CMP_GE_U32, VOP3Op.V_CMP_T_U32, VOP3Op.V_CMPX_F_I32, VOP3Op.V_CMPX_LT_I32, VOP3Op.V_CMPX_EQ_I32, VOP3Op.V_CMPX_LE_I32, VOP3Op.V_CMPX_GT_I32, VOP3Op.V_CMPX_NE_I32, VOP3Op.V_CMPX_GE_I32, VOP3Op.V_CMPX_T_I32, VOP3Op.V_CMPX_F_U32, VOP3Op.V_CMPX_LT_U32, VOP3Op.V_CMPX_EQ_U32, VOP3Op.V_CMPX_LE_U32, VOP3Op.V_CMPX_GT_U32, VOP3Op.V_CMPX_NE_U32, VOP3Op.V_CMPX_GE_U32, VOP3Op.V_CMPX_T_U32, VOP3Op.V_CMP_F_I64, VOP3Op.V_CMP_LT_I64, VOP3Op.V_CMP_EQ_I64, VOP3Op.V_CMP_LE_I64, VOP3Op.V_CMP_GT_I64, VOP3Op.V_CMP_NE_I64, VOP3Op.V_CMP_GE_I64, VOP3Op.V_CMP_T_I64, VOP3Op.V_CMP_F_U64, VOP3Op.V_CMP_LT_U64, VOP3Op.V_CMP_EQ_U64, VOP3Op.V_CMP_LE_U64, VOP3Op.V_CMP_GT_U64, VOP3Op.V_CMP_NE_U64, VOP3Op.V_CMP_GE_U64, VOP3Op.V_CMP_T_U64, VOP3Op.V_CMPX_F_I64, VOP3Op.V_CMPX_LT_I64, VOP3Op.V_CMPX_EQ_I64, VOP3Op.V_CMPX_LE_I64, VOP3Op.V_CMPX_GT_I64, VOP3Op.V_CMPX_NE_I64, VOP3Op.V_CMPX_GE_I64, VOP3Op.V_CMPX_T_I64, VOP3Op.V_CMPX_F_U64, VOP3Op.V_CMPX_LT_U64, VOP3Op.V_CMPX_EQ_U64, VOP3Op.V_CMPX_LE_U64, VOP3Op.V_CMPX_GT_U64, VOP3Op.V_CMPX_NE_U64, VOP3Op.V_CMPX_GE_U64, VOP3Op.V_CMPX_T_U64}) + vdst = SSrcField(7, 0) + +# instruction helpers +ds_add_u32 = functools.partial(DS, DSOp.DS_ADD_U32) +ds_sub_u32 = functools.partial(DS, DSOp.DS_SUB_U32) +ds_rsub_u32 = functools.partial(DS, DSOp.DS_RSUB_U32) +ds_inc_u32 = functools.partial(DS, DSOp.DS_INC_U32) +ds_dec_u32 = functools.partial(DS, DSOp.DS_DEC_U32) +ds_min_i32 = functools.partial(DS, DSOp.DS_MIN_I32) +ds_max_i32 = functools.partial(DS, DSOp.DS_MAX_I32) +ds_min_u32 = functools.partial(DS, DSOp.DS_MIN_U32) +ds_max_u32 = functools.partial(DS, DSOp.DS_MAX_U32) +ds_and_b32 = functools.partial(DS, DSOp.DS_AND_B32) +ds_or_b32 = functools.partial(DS, DSOp.DS_OR_B32) +ds_xor_b32 = functools.partial(DS, DSOp.DS_XOR_B32) +ds_mskor_b32 = functools.partial(DS, DSOp.DS_MSKOR_B32) +ds_write_b32 = functools.partial(DS, DSOp.DS_WRITE_B32) +ds_write2_b32 = functools.partial(DS, DSOp.DS_WRITE2_B32) +ds_write2st64_b32 = functools.partial(DS, DSOp.DS_WRITE2ST64_B32) +ds_cmpst_b32 = functools.partial(DS, DSOp.DS_CMPST_B32) +ds_cmpst_f32 = functools.partial(DS, DSOp.DS_CMPST_F32) +ds_min_f32 = functools.partial(DS, DSOp.DS_MIN_F32) +ds_max_f32 = functools.partial(DS, DSOp.DS_MAX_F32) +ds_nop = functools.partial(DS, DSOp.DS_NOP) +ds_add_f32 = functools.partial(DS, DSOp.DS_ADD_F32) +ds_pk_add_f16 = functools.partial(DS, DSOp.DS_PK_ADD_F16) +ds_pk_add_bf16 = functools.partial(DS, DSOp.DS_PK_ADD_BF16) +ds_write_addtid_b32 = functools.partial(DS, DSOp.DS_WRITE_ADDTID_B32) +ds_write_b8 = functools.partial(DS, DSOp.DS_WRITE_B8) +ds_write_b16 = functools.partial(DS, DSOp.DS_WRITE_B16) +ds_add_rtn_u32 = functools.partial(DS, DSOp.DS_ADD_RTN_U32) +ds_sub_rtn_u32 = functools.partial(DS, DSOp.DS_SUB_RTN_U32) +ds_rsub_rtn_u32 = functools.partial(DS, DSOp.DS_RSUB_RTN_U32) +ds_inc_rtn_u32 = functools.partial(DS, DSOp.DS_INC_RTN_U32) +ds_dec_rtn_u32 = functools.partial(DS, DSOp.DS_DEC_RTN_U32) +ds_min_rtn_i32 = functools.partial(DS, DSOp.DS_MIN_RTN_I32) +ds_max_rtn_i32 = functools.partial(DS, DSOp.DS_MAX_RTN_I32) +ds_min_rtn_u32 = functools.partial(DS, DSOp.DS_MIN_RTN_U32) +ds_max_rtn_u32 = functools.partial(DS, DSOp.DS_MAX_RTN_U32) +ds_and_rtn_b32 = functools.partial(DS, DSOp.DS_AND_RTN_B32) +ds_or_rtn_b32 = functools.partial(DS, DSOp.DS_OR_RTN_B32) +ds_xor_rtn_b32 = functools.partial(DS, DSOp.DS_XOR_RTN_B32) +ds_mskor_rtn_b32 = functools.partial(DS, DSOp.DS_MSKOR_RTN_B32) +ds_wrxchg_rtn_b32 = functools.partial(DS, DSOp.DS_WRXCHG_RTN_B32) +ds_wrxchg2_rtn_b32 = functools.partial(DS, DSOp.DS_WRXCHG2_RTN_B32) +ds_wrxchg2st64_rtn_b32 = functools.partial(DS, DSOp.DS_WRXCHG2ST64_RTN_B32) +ds_cmpst_rtn_b32 = functools.partial(DS, DSOp.DS_CMPST_RTN_B32) +ds_cmpst_rtn_f32 = functools.partial(DS, DSOp.DS_CMPST_RTN_F32) +ds_min_rtn_f32 = functools.partial(DS, DSOp.DS_MIN_RTN_F32) +ds_max_rtn_f32 = functools.partial(DS, DSOp.DS_MAX_RTN_F32) +ds_wrap_rtn_b32 = functools.partial(DS, DSOp.DS_WRAP_RTN_B32) +ds_add_rtn_f32 = functools.partial(DS, DSOp.DS_ADD_RTN_F32) +ds_read_b32 = functools.partial(DS, DSOp.DS_READ_B32) +ds_read2_b32 = functools.partial(DS, DSOp.DS_READ2_B32) +ds_read2st64_b32 = functools.partial(DS, DSOp.DS_READ2ST64_B32) +ds_read_i8 = functools.partial(DS, DSOp.DS_READ_I8) +ds_read_u8 = functools.partial(DS, DSOp.DS_READ_U8) +ds_read_i16 = functools.partial(DS, DSOp.DS_READ_I16) +ds_read_u16 = functools.partial(DS, DSOp.DS_READ_U16) +ds_swizzle_b32 = functools.partial(DS, DSOp.DS_SWIZZLE_B32) +ds_permute_b32 = functools.partial(DS, DSOp.DS_PERMUTE_B32) +ds_bpermute_b32 = functools.partial(DS, DSOp.DS_BPERMUTE_B32) +ds_add_u64 = functools.partial(DS, DSOp.DS_ADD_U64) +ds_sub_u64 = functools.partial(DS, DSOp.DS_SUB_U64) +ds_rsub_u64 = functools.partial(DS, DSOp.DS_RSUB_U64) +ds_inc_u64 = functools.partial(DS, DSOp.DS_INC_U64) +ds_dec_u64 = functools.partial(DS, DSOp.DS_DEC_U64) +ds_min_i64 = functools.partial(DS, DSOp.DS_MIN_I64) +ds_max_i64 = functools.partial(DS, DSOp.DS_MAX_I64) +ds_min_u64 = functools.partial(DS, DSOp.DS_MIN_U64) +ds_max_u64 = functools.partial(DS, DSOp.DS_MAX_U64) +ds_and_b64 = functools.partial(DS, DSOp.DS_AND_B64) +ds_or_b64 = functools.partial(DS, DSOp.DS_OR_B64) +ds_xor_b64 = functools.partial(DS, DSOp.DS_XOR_B64) +ds_mskor_b64 = functools.partial(DS, DSOp.DS_MSKOR_B64) +ds_write_b64 = functools.partial(DS, DSOp.DS_WRITE_B64) +ds_write2_b64 = functools.partial(DS, DSOp.DS_WRITE2_B64) +ds_write2st64_b64 = functools.partial(DS, DSOp.DS_WRITE2ST64_B64) +ds_cmpst_b64 = functools.partial(DS, DSOp.DS_CMPST_B64) +ds_cmpst_f64 = functools.partial(DS, DSOp.DS_CMPST_F64) +ds_min_f64 = functools.partial(DS, DSOp.DS_MIN_F64) +ds_max_f64 = functools.partial(DS, DSOp.DS_MAX_F64) +ds_write_b8_d16_hi = functools.partial(DS, DSOp.DS_WRITE_B8_D16_HI) +ds_write_b16_d16_hi = functools.partial(DS, DSOp.DS_WRITE_B16_D16_HI) +ds_read_u8_d16 = functools.partial(DS, DSOp.DS_READ_U8_D16) +ds_read_u8_d16_hi = functools.partial(DS, DSOp.DS_READ_U8_D16_HI) +ds_read_i8_d16 = functools.partial(DS, DSOp.DS_READ_I8_D16) +ds_read_i8_d16_hi = functools.partial(DS, DSOp.DS_READ_I8_D16_HI) +ds_read_u16_d16 = functools.partial(DS, DSOp.DS_READ_U16_D16) +ds_read_u16_d16_hi = functools.partial(DS, DSOp.DS_READ_U16_D16_HI) +ds_add_f64 = functools.partial(DS, DSOp.DS_ADD_F64) +ds_add_rtn_u64 = functools.partial(DS, DSOp.DS_ADD_RTN_U64) +ds_sub_rtn_u64 = functools.partial(DS, DSOp.DS_SUB_RTN_U64) +ds_rsub_rtn_u64 = functools.partial(DS, DSOp.DS_RSUB_RTN_U64) +ds_inc_rtn_u64 = functools.partial(DS, DSOp.DS_INC_RTN_U64) +ds_dec_rtn_u64 = functools.partial(DS, DSOp.DS_DEC_RTN_U64) +ds_min_rtn_i64 = functools.partial(DS, DSOp.DS_MIN_RTN_I64) +ds_max_rtn_i64 = functools.partial(DS, DSOp.DS_MAX_RTN_I64) +ds_min_rtn_u64 = functools.partial(DS, DSOp.DS_MIN_RTN_U64) +ds_max_rtn_u64 = functools.partial(DS, DSOp.DS_MAX_RTN_U64) +ds_and_rtn_b64 = functools.partial(DS, DSOp.DS_AND_RTN_B64) +ds_or_rtn_b64 = functools.partial(DS, DSOp.DS_OR_RTN_B64) +ds_xor_rtn_b64 = functools.partial(DS, DSOp.DS_XOR_RTN_B64) +ds_mskor_rtn_b64 = functools.partial(DS, DSOp.DS_MSKOR_RTN_B64) +ds_wrxchg_rtn_b64 = functools.partial(DS, DSOp.DS_WRXCHG_RTN_B64) +ds_wrxchg2_rtn_b64 = functools.partial(DS, DSOp.DS_WRXCHG2_RTN_B64) +ds_wrxchg2st64_rtn_b64 = functools.partial(DS, DSOp.DS_WRXCHG2ST64_RTN_B64) +ds_cmpst_rtn_b64 = functools.partial(DS, DSOp.DS_CMPST_RTN_B64) +ds_cmpst_rtn_f64 = functools.partial(DS, DSOp.DS_CMPST_RTN_F64) +ds_min_rtn_f64 = functools.partial(DS, DSOp.DS_MIN_RTN_F64) +ds_max_rtn_f64 = functools.partial(DS, DSOp.DS_MAX_RTN_F64) +ds_read_b64 = functools.partial(DS, DSOp.DS_READ_B64) +ds_read2_b64 = functools.partial(DS, DSOp.DS_READ2_B64) +ds_read2st64_b64 = functools.partial(DS, DSOp.DS_READ2ST64_B64) +ds_add_rtn_f64 = functools.partial(DS, DSOp.DS_ADD_RTN_F64) +ds_condxchg32_rtn_b64 = functools.partial(DS, DSOp.DS_CONDXCHG32_RTN_B64) +ds_gws_sema_release_all = functools.partial(DS, DSOp.DS_GWS_SEMA_RELEASE_ALL) +ds_gws_sema_v = functools.partial(DS, DSOp.DS_GWS_SEMA_V) +ds_gws_sema_p = functools.partial(DS, DSOp.DS_GWS_SEMA_P) +ds_read_addtid_b32 = functools.partial(DS, DSOp.DS_READ_ADDTID_B32) +ds_pk_add_rtn_f16 = functools.partial(DS, DSOp.DS_PK_ADD_RTN_F16) +ds_pk_add_rtn_bf16 = functools.partial(DS, DSOp.DS_PK_ADD_RTN_BF16) +ds_consume = functools.partial(DS, DSOp.DS_CONSUME) +ds_append = functools.partial(DS, DSOp.DS_APPEND) +ds_write_b96 = functools.partial(DS, DSOp.DS_WRITE_B96) +ds_write_b128 = functools.partial(DS, DSOp.DS_WRITE_B128) +ds_read_b64_tr_b4 = functools.partial(DS, DSOp.DS_READ_B64_TR_B4) +ds_read_b96_tr_b6 = functools.partial(DS, DSOp.DS_READ_B96_TR_B6) +ds_read_b64_tr_b8 = functools.partial(DS, DSOp.DS_READ_B64_TR_B8) +ds_read_b64_tr_b16 = functools.partial(DS, DSOp.DS_READ_B64_TR_B16) +ds_read_b96 = functools.partial(DS, DSOp.DS_READ_B96) +ds_read_b128 = functools.partial(DS, DSOp.DS_READ_B128) +flat_load_ubyte = functools.partial(FLAT, FLATOp.FLAT_LOAD_UBYTE) +flat_load_sbyte = functools.partial(FLAT, FLATOp.FLAT_LOAD_SBYTE) +flat_load_ushort = functools.partial(FLAT, FLATOp.FLAT_LOAD_USHORT) +flat_load_sshort = functools.partial(FLAT, FLATOp.FLAT_LOAD_SSHORT) +flat_load_dword = functools.partial(FLAT, FLATOp.FLAT_LOAD_DWORD) +flat_load_dwordx2 = functools.partial(FLAT, FLATOp.FLAT_LOAD_DWORDX2) +flat_load_dwordx3 = functools.partial(FLAT, FLATOp.FLAT_LOAD_DWORDX3) +flat_load_dwordx4 = functools.partial(FLAT, FLATOp.FLAT_LOAD_DWORDX4) +flat_store_byte = functools.partial(FLAT, FLATOp.FLAT_STORE_BYTE) +flat_store_byte_d16_hi = functools.partial(FLAT, FLATOp.FLAT_STORE_BYTE_D16_HI) +flat_store_short = functools.partial(FLAT, FLATOp.FLAT_STORE_SHORT) +flat_store_short_d16_hi = functools.partial(FLAT, FLATOp.FLAT_STORE_SHORT_D16_HI) +flat_store_dword = functools.partial(FLAT, FLATOp.FLAT_STORE_DWORD) +flat_store_dwordx2 = functools.partial(FLAT, FLATOp.FLAT_STORE_DWORDX2) +flat_store_dwordx3 = functools.partial(FLAT, FLATOp.FLAT_STORE_DWORDX3) +flat_store_dwordx4 = functools.partial(FLAT, FLATOp.FLAT_STORE_DWORDX4) +flat_load_ubyte_d16 = functools.partial(FLAT, FLATOp.FLAT_LOAD_UBYTE_D16) +flat_load_ubyte_d16_hi = functools.partial(FLAT, FLATOp.FLAT_LOAD_UBYTE_D16_HI) +flat_load_sbyte_d16 = functools.partial(FLAT, FLATOp.FLAT_LOAD_SBYTE_D16) +flat_load_sbyte_d16_hi = functools.partial(FLAT, FLATOp.FLAT_LOAD_SBYTE_D16_HI) +flat_load_short_d16 = functools.partial(FLAT, FLATOp.FLAT_LOAD_SHORT_D16) +flat_load_short_d16_hi = functools.partial(FLAT, FLATOp.FLAT_LOAD_SHORT_D16_HI) +flat_atomic_swap = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SWAP) +flat_atomic_cmpswap = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_CMPSWAP) +flat_atomic_add = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_ADD) +flat_atomic_sub = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SUB) +flat_atomic_smin = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SMIN) +flat_atomic_umin = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_UMIN) +flat_atomic_smax = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SMAX) +flat_atomic_umax = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_UMAX) +flat_atomic_and = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_AND) +flat_atomic_or = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_OR) +flat_atomic_xor = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_XOR) +flat_atomic_inc = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_INC) +flat_atomic_dec = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_DEC) +flat_atomic_add_f32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_ADD_F32) +flat_atomic_pk_add_f16 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_PK_ADD_F16) +flat_atomic_add_f64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_ADD_F64) +flat_atomic_min_f64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MIN_F64) +flat_atomic_max_f64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MAX_F64) +flat_atomic_pk_add_bf16 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_PK_ADD_BF16) +flat_atomic_swap_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SWAP_X2) +flat_atomic_cmpswap_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_CMPSWAP_X2) +flat_atomic_add_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_ADD_X2) +flat_atomic_sub_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SUB_X2) +flat_atomic_smin_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SMIN_X2) +flat_atomic_umin_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_UMIN_X2) +flat_atomic_smax_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SMAX_X2) +flat_atomic_umax_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_UMAX_X2) +flat_atomic_and_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_AND_X2) +flat_atomic_or_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_OR_X2) +flat_atomic_xor_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_XOR_X2) +flat_atomic_inc_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_INC_X2) +flat_atomic_dec_x2 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_DEC_X2) +global_load_ubyte = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_UBYTE) +global_load_sbyte = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_SBYTE) +global_load_ushort = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_USHORT) +global_load_sshort = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_SSHORT) +global_load_dword = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_DWORD) +global_load_dwordx2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_DWORDX2) +global_load_dwordx3 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_DWORDX3) +global_load_dwordx4 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_DWORDX4) +global_store_byte = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_BYTE) +global_store_byte_d16_hi = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_BYTE_D16_HI) +global_store_short = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_SHORT) +global_store_short_d16_hi = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_SHORT_D16_HI) +global_store_dword = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_DWORD) +global_store_dwordx2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_DWORDX2) +global_store_dwordx3 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_DWORDX3) +global_store_dwordx4 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_DWORDX4) +global_load_ubyte_d16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_UBYTE_D16) +global_load_ubyte_d16_hi = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_UBYTE_D16_HI) +global_load_sbyte_d16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_SBYTE_D16) +global_load_sbyte_d16_hi = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_SBYTE_D16_HI) +global_load_short_d16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_SHORT_D16) +global_load_short_d16_hi = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_SHORT_D16_HI) +global_load_lds_ubyte = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_UBYTE) +global_load_lds_sbyte = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_SBYTE) +global_load_lds_ushort = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_USHORT) +global_load_lds_sshort = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_SSHORT) +global_load_lds_dword = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_DWORD) +global_atomic_swap = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SWAP) +global_atomic_cmpswap = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP) +global_atomic_add = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_ADD) +global_atomic_sub = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SUB) +global_atomic_smin = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SMIN) +global_atomic_umin = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_UMIN) +global_atomic_smax = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SMAX) +global_atomic_umax = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_UMAX) +global_atomic_and = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_AND) +global_atomic_or = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_OR) +global_atomic_xor = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_XOR) +global_atomic_inc = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_INC) +global_atomic_dec = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_DEC) +global_atomic_add_f32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_ADD_F32) +global_atomic_pk_add_f16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_PK_ADD_F16) +global_atomic_add_f64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_ADD_F64) +global_atomic_min_f64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MIN_F64) +global_atomic_max_f64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MAX_F64) +global_atomic_pk_add_bf16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_PK_ADD_BF16) +global_atomic_swap_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SWAP_X2) +global_atomic_cmpswap_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_X2) +global_atomic_add_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_ADD_X2) +global_atomic_sub_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SUB_X2) +global_atomic_smin_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SMIN_X2) +global_atomic_umin_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_UMIN_X2) +global_atomic_smax_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SMAX_X2) +global_atomic_umax_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_UMAX_X2) +global_atomic_and_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_AND_X2) +global_atomic_or_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_OR_X2) +global_atomic_xor_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_XOR_X2) +global_atomic_inc_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_INC_X2) +global_atomic_dec_x2 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_DEC_X2) +global_load_lds_dwordx4 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_DWORDX4) +global_load_lds_dwordx3 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_DWORDX3) +tbuffer_load_format_x = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_X) +tbuffer_load_format_xy = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_XY) +tbuffer_load_format_xyz = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_XYZ) +tbuffer_load_format_xyzw = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_XYZW) +tbuffer_store_format_x = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_X) +tbuffer_store_format_xy = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_XY) +tbuffer_store_format_xyz = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_XYZ) +tbuffer_store_format_xyzw = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_XYZW) +tbuffer_load_format_d16_x = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_D16_X) +tbuffer_load_format_d16_xy = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XY) +tbuffer_load_format_d16_xyz = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XYZ) +tbuffer_load_format_d16_xyzw = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XYZW) +tbuffer_store_format_d16_x = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_D16_X) +tbuffer_store_format_d16_xy = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_D16_XY) +tbuffer_store_format_d16_xyz = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_D16_XYZ) +tbuffer_store_format_d16_xyzw = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_D16_XYZW) +buffer_load_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_X) +buffer_load_format_xy = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_XY) +buffer_load_format_xyz = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_XYZ) +buffer_load_format_xyzw = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_XYZW) +buffer_store_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_X) +buffer_store_format_xy = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_XY) +buffer_store_format_xyz = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_XYZ) +buffer_store_format_xyzw = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_XYZW) +buffer_load_format_d16_x = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_D16_X) +buffer_load_format_d16_xy = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_D16_XY) +buffer_load_format_d16_xyz = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_D16_XYZ) +buffer_load_format_d16_xyzw = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_D16_XYZW) +buffer_store_format_d16_x = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_D16_X) +buffer_store_format_d16_xy = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_D16_XY) +buffer_store_format_d16_xyz = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_D16_XYZ) +buffer_store_format_d16_xyzw = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_D16_XYZW) +buffer_load_ubyte = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_UBYTE) +buffer_load_sbyte = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_SBYTE) +buffer_load_ushort = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_USHORT) +buffer_load_sshort = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_SSHORT) +buffer_load_dword = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_DWORD) +buffer_load_dwordx2 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_DWORDX2) +buffer_load_dwordx3 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_DWORDX3) +buffer_load_dwordx4 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_DWORDX4) +buffer_store_byte = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_BYTE) +buffer_store_byte_d16_hi = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_BYTE_D16_HI) +buffer_store_short = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_SHORT) +buffer_store_short_d16_hi = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_SHORT_D16_HI) +buffer_store_dword = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_DWORD) +buffer_store_dwordx2 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_DWORDX2) +buffer_store_dwordx3 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_DWORDX3) +buffer_store_dwordx4 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_DWORDX4) +buffer_load_ubyte_d16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_UBYTE_D16) +buffer_load_ubyte_d16_hi = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_UBYTE_D16_HI) +buffer_load_sbyte_d16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_SBYTE_D16) +buffer_load_sbyte_d16_hi = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_SBYTE_D16_HI) +buffer_load_short_d16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_SHORT_D16) +buffer_load_short_d16_hi = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_SHORT_D16_HI) +buffer_load_format_d16_hi_x = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_D16_HI_X) +buffer_store_format_d16_hi_x = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_D16_HI_X) +buffer_wbl2 = functools.partial(MUBUF, MUBUFOp.BUFFER_WBL2) +buffer_inv = functools.partial(MUBUF, MUBUFOp.BUFFER_INV) +buffer_atomic_swap = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SWAP) +buffer_atomic_cmpswap = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_CMPSWAP) +buffer_atomic_add = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_ADD) +buffer_atomic_sub = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SUB) +buffer_atomic_smin = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SMIN) +buffer_atomic_umin = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_UMIN) +buffer_atomic_smax = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SMAX) +buffer_atomic_umax = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_UMAX) +buffer_atomic_and = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_AND) +buffer_atomic_or = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_OR) +buffer_atomic_xor = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_XOR) +buffer_atomic_inc = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_INC) +buffer_atomic_dec = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_DEC) +buffer_atomic_add_f32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_ADD_F32) +buffer_atomic_pk_add_f16 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_PK_ADD_F16) +buffer_atomic_add_f64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_ADD_F64) +buffer_atomic_min_f64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MIN_F64) +buffer_atomic_max_f64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MAX_F64) +buffer_atomic_pk_add_bf16 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_PK_ADD_BF16) +buffer_atomic_swap_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SWAP_X2) +buffer_atomic_cmpswap_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_CMPSWAP_X2) +buffer_atomic_add_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_ADD_X2) +buffer_atomic_sub_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SUB_X2) +buffer_atomic_smin_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SMIN_X2) +buffer_atomic_umin_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_UMIN_X2) +buffer_atomic_smax_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SMAX_X2) +buffer_atomic_umax_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_UMAX_X2) +buffer_atomic_and_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_AND_X2) +buffer_atomic_or_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_OR_X2) +buffer_atomic_xor_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_XOR_X2) +buffer_atomic_inc_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_INC_X2) +buffer_atomic_dec_x2 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_DEC_X2) +scratch_load_ubyte = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_UBYTE) +scratch_load_sbyte = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_SBYTE) +scratch_load_ushort = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_USHORT) +scratch_load_sshort = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_SSHORT) +scratch_load_dword = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_DWORD) +scratch_load_dwordx2 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_DWORDX2) +scratch_load_dwordx3 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_DWORDX3) +scratch_load_dwordx4 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_DWORDX4) +scratch_store_byte = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_BYTE) +scratch_store_byte_d16_hi = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_BYTE_D16_HI) +scratch_store_short = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_SHORT) +scratch_store_short_d16_hi = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_SHORT_D16_HI) +scratch_store_dword = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_DWORD) +scratch_store_dwordx2 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_DWORDX2) +scratch_store_dwordx3 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_DWORDX3) +scratch_store_dwordx4 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_DWORDX4) +scratch_load_ubyte_d16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_UBYTE_D16) +scratch_load_ubyte_d16_hi = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_UBYTE_D16_HI) +scratch_load_sbyte_d16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_SBYTE_D16) +scratch_load_sbyte_d16_hi = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_SBYTE_D16_HI) +scratch_load_short_d16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_SHORT_D16) +scratch_load_short_d16_hi = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_SHORT_D16_HI) +scratch_load_lds_ubyte = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_UBYTE) +scratch_load_lds_sbyte = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_SBYTE) +scratch_load_lds_ushort = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_USHORT) +scratch_load_lds_sshort = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_SSHORT) +scratch_load_lds_dword = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_DWORD) +s_load_dword = functools.partial(SMEM, SMEMOp.S_LOAD_DWORD) +s_load_dwordx2 = functools.partial(SMEM, SMEMOp.S_LOAD_DWORDX2) +s_load_dwordx4 = functools.partial(SMEM, SMEMOp.S_LOAD_DWORDX4) +s_load_dwordx8 = functools.partial(SMEM, SMEMOp.S_LOAD_DWORDX8) +s_load_dwordx16 = functools.partial(SMEM, SMEMOp.S_LOAD_DWORDX16) +s_scratch_load_dword = functools.partial(SMEM, SMEMOp.S_SCRATCH_LOAD_DWORD) +s_scratch_load_dwordx2 = functools.partial(SMEM, SMEMOp.S_SCRATCH_LOAD_DWORDX2) +s_scratch_load_dwordx4 = functools.partial(SMEM, SMEMOp.S_SCRATCH_LOAD_DWORDX4) +s_buffer_load_dword = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_DWORD) +s_buffer_load_dwordx2 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_DWORDX2) +s_buffer_load_dwordx4 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_DWORDX4) +s_buffer_load_dwordx8 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_DWORDX8) +s_buffer_load_dwordx16 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_DWORDX16) +s_store_dword = functools.partial(SMEM, SMEMOp.S_STORE_DWORD) +s_store_dwordx2 = functools.partial(SMEM, SMEMOp.S_STORE_DWORDX2) +s_store_dwordx4 = functools.partial(SMEM, SMEMOp.S_STORE_DWORDX4) +s_scratch_store_dword = functools.partial(SMEM, SMEMOp.S_SCRATCH_STORE_DWORD) +s_scratch_store_dwordx2 = functools.partial(SMEM, SMEMOp.S_SCRATCH_STORE_DWORDX2) +s_scratch_store_dwordx4 = functools.partial(SMEM, SMEMOp.S_SCRATCH_STORE_DWORDX4) +s_buffer_store_dword = functools.partial(SMEM, SMEMOp.S_BUFFER_STORE_DWORD) +s_buffer_store_dwordx2 = functools.partial(SMEM, SMEMOp.S_BUFFER_STORE_DWORDX2) +s_buffer_store_dwordx4 = functools.partial(SMEM, SMEMOp.S_BUFFER_STORE_DWORDX4) +s_dcache_inv = functools.partial(SMEM, SMEMOp.S_DCACHE_INV) +s_dcache_wb = functools.partial(SMEM, SMEMOp.S_DCACHE_WB) +s_dcache_inv_vol = functools.partial(SMEM, SMEMOp.S_DCACHE_INV_VOL) +s_dcache_wb_vol = functools.partial(SMEM, SMEMOp.S_DCACHE_WB_VOL) +s_memtime = functools.partial(SMEM, SMEMOp.S_MEMTIME) +s_memrealtime = functools.partial(SMEM, SMEMOp.S_MEMREALTIME) +s_atc_probe = functools.partial(SMEM, SMEMOp.S_ATC_PROBE) +s_atc_probe_buffer = functools.partial(SMEM, SMEMOp.S_ATC_PROBE_BUFFER) +s_dcache_discard = functools.partial(SMEM, SMEMOp.S_DCACHE_DISCARD) +s_dcache_discard_x2 = functools.partial(SMEM, SMEMOp.S_DCACHE_DISCARD_X2) +s_buffer_atomic_swap = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_SWAP) +s_buffer_atomic_cmpswap = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_CMPSWAP) +s_buffer_atomic_add = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_ADD) +s_buffer_atomic_sub = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_SUB) +s_buffer_atomic_smin = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_SMIN) +s_buffer_atomic_umin = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_UMIN) +s_buffer_atomic_smax = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_SMAX) +s_buffer_atomic_umax = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_UMAX) +s_buffer_atomic_and = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_AND) +s_buffer_atomic_or = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_OR) +s_buffer_atomic_xor = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_XOR) +s_buffer_atomic_inc = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_INC) +s_buffer_atomic_dec = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_DEC) +s_buffer_atomic_swap_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_SWAP_X2) +s_buffer_atomic_cmpswap_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_CMPSWAP_X2) +s_buffer_atomic_add_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_ADD_X2) +s_buffer_atomic_sub_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_SUB_X2) +s_buffer_atomic_smin_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_SMIN_X2) +s_buffer_atomic_umin_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_UMIN_X2) +s_buffer_atomic_smax_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_SMAX_X2) +s_buffer_atomic_umax_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_UMAX_X2) +s_buffer_atomic_and_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_AND_X2) +s_buffer_atomic_or_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_OR_X2) +s_buffer_atomic_xor_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_XOR_X2) +s_buffer_atomic_inc_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_INC_X2) +s_buffer_atomic_dec_x2 = functools.partial(SMEM, SMEMOp.S_BUFFER_ATOMIC_DEC_X2) +s_atomic_swap = functools.partial(SMEM, SMEMOp.S_ATOMIC_SWAP) +s_atomic_cmpswap = functools.partial(SMEM, SMEMOp.S_ATOMIC_CMPSWAP) +s_atomic_add = functools.partial(SMEM, SMEMOp.S_ATOMIC_ADD) +s_atomic_sub = functools.partial(SMEM, SMEMOp.S_ATOMIC_SUB) +s_atomic_smin = functools.partial(SMEM, SMEMOp.S_ATOMIC_SMIN) +s_atomic_umin = functools.partial(SMEM, SMEMOp.S_ATOMIC_UMIN) +s_atomic_smax = functools.partial(SMEM, SMEMOp.S_ATOMIC_SMAX) +s_atomic_umax = functools.partial(SMEM, SMEMOp.S_ATOMIC_UMAX) +s_atomic_and = functools.partial(SMEM, SMEMOp.S_ATOMIC_AND) +s_atomic_or = functools.partial(SMEM, SMEMOp.S_ATOMIC_OR) +s_atomic_xor = functools.partial(SMEM, SMEMOp.S_ATOMIC_XOR) +s_atomic_inc = functools.partial(SMEM, SMEMOp.S_ATOMIC_INC) +s_atomic_dec = functools.partial(SMEM, SMEMOp.S_ATOMIC_DEC) +s_atomic_swap_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_SWAP_X2) +s_atomic_cmpswap_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_CMPSWAP_X2) +s_atomic_add_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_ADD_X2) +s_atomic_sub_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_SUB_X2) +s_atomic_smin_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_SMIN_X2) +s_atomic_umin_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_UMIN_X2) +s_atomic_smax_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_SMAX_X2) +s_atomic_umax_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_UMAX_X2) +s_atomic_and_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_AND_X2) +s_atomic_or_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_OR_X2) +s_atomic_xor_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_XOR_X2) +s_atomic_inc_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_INC_X2) +s_atomic_dec_x2 = functools.partial(SMEM, SMEMOp.S_ATOMIC_DEC_X2) +s_mov_b32 = functools.partial(SOP1, SOP1Op.S_MOV_B32) +s_mov_b64 = functools.partial(SOP1, SOP1Op.S_MOV_B64) +s_cmov_b32 = functools.partial(SOP1, SOP1Op.S_CMOV_B32) +s_cmov_b64 = functools.partial(SOP1, SOP1Op.S_CMOV_B64) +s_not_b32 = functools.partial(SOP1, SOP1Op.S_NOT_B32) +s_not_b64 = functools.partial(SOP1, SOP1Op.S_NOT_B64) +s_wqm_b32 = functools.partial(SOP1, SOP1Op.S_WQM_B32) +s_wqm_b64 = functools.partial(SOP1, SOP1Op.S_WQM_B64) +s_brev_b32 = functools.partial(SOP1, SOP1Op.S_BREV_B32) +s_brev_b64 = functools.partial(SOP1, SOP1Op.S_BREV_B64) +s_bcnt0_i32_b32 = functools.partial(SOP1, SOP1Op.S_BCNT0_I32_B32) +s_bcnt0_i32_b64 = functools.partial(SOP1, SOP1Op.S_BCNT0_I32_B64) +s_bcnt1_i32_b32 = functools.partial(SOP1, SOP1Op.S_BCNT1_I32_B32) +s_bcnt1_i32_b64 = functools.partial(SOP1, SOP1Op.S_BCNT1_I32_B64) +s_ff0_i32_b32 = functools.partial(SOP1, SOP1Op.S_FF0_I32_B32) +s_ff0_i32_b64 = functools.partial(SOP1, SOP1Op.S_FF0_I32_B64) +s_ff1_i32_b32 = functools.partial(SOP1, SOP1Op.S_FF1_I32_B32) +s_ff1_i32_b64 = functools.partial(SOP1, SOP1Op.S_FF1_I32_B64) +s_flbit_i32_b32 = functools.partial(SOP1, SOP1Op.S_FLBIT_I32_B32) +s_flbit_i32_b64 = functools.partial(SOP1, SOP1Op.S_FLBIT_I32_B64) +s_flbit_i32 = functools.partial(SOP1, SOP1Op.S_FLBIT_I32) +s_flbit_i32_i64 = functools.partial(SOP1, SOP1Op.S_FLBIT_I32_I64) +s_sext_i32_i8 = functools.partial(SOP1, SOP1Op.S_SEXT_I32_I8) +s_sext_i32_i16 = functools.partial(SOP1, SOP1Op.S_SEXT_I32_I16) +s_bitset0_b32 = functools.partial(SOP1, SOP1Op.S_BITSET0_B32) +s_bitset0_b64 = functools.partial(SOP1, SOP1Op.S_BITSET0_B64) +s_bitset1_b32 = functools.partial(SOP1, SOP1Op.S_BITSET1_B32) +s_bitset1_b64 = functools.partial(SOP1, SOP1Op.S_BITSET1_B64) +s_getpc_b64 = functools.partial(SOP1, SOP1Op.S_GETPC_B64) +s_setpc_b64 = functools.partial(SOP1, SOP1Op.S_SETPC_B64) +s_swappc_b64 = functools.partial(SOP1, SOP1Op.S_SWAPPC_B64) +s_rfe_b64 = functools.partial(SOP1, SOP1Op.S_RFE_B64) +s_and_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_SAVEEXEC_B64) +s_or_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_OR_SAVEEXEC_B64) +s_xor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_XOR_SAVEEXEC_B64) +s_andn2_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_ANDN2_SAVEEXEC_B64) +s_orn2_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_ORN2_SAVEEXEC_B64) +s_nand_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_NAND_SAVEEXEC_B64) +s_nor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_NOR_SAVEEXEC_B64) +s_xnor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_XNOR_SAVEEXEC_B64) +s_quadmask_b32 = functools.partial(SOP1, SOP1Op.S_QUADMASK_B32) +s_quadmask_b64 = functools.partial(SOP1, SOP1Op.S_QUADMASK_B64) +s_movrels_b32 = functools.partial(SOP1, SOP1Op.S_MOVRELS_B32) +s_movrels_b64 = functools.partial(SOP1, SOP1Op.S_MOVRELS_B64) +s_movreld_b32 = functools.partial(SOP1, SOP1Op.S_MOVRELD_B32) +s_movreld_b64 = functools.partial(SOP1, SOP1Op.S_MOVRELD_B64) +s_cbranch_join = functools.partial(SOP1, SOP1Op.S_CBRANCH_JOIN) +s_abs_i32 = functools.partial(SOP1, SOP1Op.S_ABS_I32) +s_set_gpr_idx_idx = functools.partial(SOP1, SOP1Op.S_SET_GPR_IDX_IDX) +s_andn1_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_ANDN1_SAVEEXEC_B64) +s_orn1_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_ORN1_SAVEEXEC_B64) +s_andn1_wrexec_b64 = functools.partial(SOP1, SOP1Op.S_ANDN1_WREXEC_B64) +s_andn2_wrexec_b64 = functools.partial(SOP1, SOP1Op.S_ANDN2_WREXEC_B64) +s_bitreplicate_b64_b32 = functools.partial(SOP1, SOP1Op.S_BITREPLICATE_B64_B32) +s_add_u32 = functools.partial(SOP2, SOP2Op.S_ADD_U32) +s_sub_u32 = functools.partial(SOP2, SOP2Op.S_SUB_U32) +s_add_i32 = functools.partial(SOP2, SOP2Op.S_ADD_I32) +s_sub_i32 = functools.partial(SOP2, SOP2Op.S_SUB_I32) +s_addc_u32 = functools.partial(SOP2, SOP2Op.S_ADDC_U32) +s_subb_u32 = functools.partial(SOP2, SOP2Op.S_SUBB_U32) +s_min_i32 = functools.partial(SOP2, SOP2Op.S_MIN_I32) +s_min_u32 = functools.partial(SOP2, SOP2Op.S_MIN_U32) +s_max_i32 = functools.partial(SOP2, SOP2Op.S_MAX_I32) +s_max_u32 = functools.partial(SOP2, SOP2Op.S_MAX_U32) +s_cselect_b32 = functools.partial(SOP2, SOP2Op.S_CSELECT_B32) +s_cselect_b64 = functools.partial(SOP2, SOP2Op.S_CSELECT_B64) +s_and_b32 = functools.partial(SOP2, SOP2Op.S_AND_B32) +s_and_b64 = functools.partial(SOP2, SOP2Op.S_AND_B64) +s_or_b32 = functools.partial(SOP2, SOP2Op.S_OR_B32) +s_or_b64 = functools.partial(SOP2, SOP2Op.S_OR_B64) +s_xor_b32 = functools.partial(SOP2, SOP2Op.S_XOR_B32) +s_xor_b64 = functools.partial(SOP2, SOP2Op.S_XOR_B64) +s_andn2_b32 = functools.partial(SOP2, SOP2Op.S_ANDN2_B32) +s_andn2_b64 = functools.partial(SOP2, SOP2Op.S_ANDN2_B64) +s_orn2_b32 = functools.partial(SOP2, SOP2Op.S_ORN2_B32) +s_orn2_b64 = functools.partial(SOP2, SOP2Op.S_ORN2_B64) +s_nand_b32 = functools.partial(SOP2, SOP2Op.S_NAND_B32) +s_nand_b64 = functools.partial(SOP2, SOP2Op.S_NAND_B64) +s_nor_b32 = functools.partial(SOP2, SOP2Op.S_NOR_B32) +s_nor_b64 = functools.partial(SOP2, SOP2Op.S_NOR_B64) +s_xnor_b32 = functools.partial(SOP2, SOP2Op.S_XNOR_B32) +s_xnor_b64 = functools.partial(SOP2, SOP2Op.S_XNOR_B64) +s_lshl_b32 = functools.partial(SOP2, SOP2Op.S_LSHL_B32) +s_lshl_b64 = functools.partial(SOP2, SOP2Op.S_LSHL_B64) +s_lshr_b32 = functools.partial(SOP2, SOP2Op.S_LSHR_B32) +s_lshr_b64 = functools.partial(SOP2, SOP2Op.S_LSHR_B64) +s_ashr_i32 = functools.partial(SOP2, SOP2Op.S_ASHR_I32) +s_ashr_i64 = functools.partial(SOP2, SOP2Op.S_ASHR_I64) +s_bfm_b32 = functools.partial(SOP2, SOP2Op.S_BFM_B32) +s_bfm_b64 = functools.partial(SOP2, SOP2Op.S_BFM_B64) +s_mul_i32 = functools.partial(SOP2, SOP2Op.S_MUL_I32) +s_bfe_u32 = functools.partial(SOP2, SOP2Op.S_BFE_U32) +s_bfe_i32 = functools.partial(SOP2, SOP2Op.S_BFE_I32) +s_bfe_u64 = functools.partial(SOP2, SOP2Op.S_BFE_U64) +s_bfe_i64 = functools.partial(SOP2, SOP2Op.S_BFE_I64) +s_cbranch_g_fork = functools.partial(SOP2, SOP2Op.S_CBRANCH_G_FORK) +s_absdiff_i32 = functools.partial(SOP2, SOP2Op.S_ABSDIFF_I32) +s_rfe_restore_b64 = functools.partial(SOP2, SOP2Op.S_RFE_RESTORE_B64) +s_mul_hi_u32 = functools.partial(SOP2, SOP2Op.S_MUL_HI_U32) +s_mul_hi_i32 = functools.partial(SOP2, SOP2Op.S_MUL_HI_I32) +s_lshl1_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL1_ADD_U32) +s_lshl2_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL2_ADD_U32) +s_lshl3_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL3_ADD_U32) +s_lshl4_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL4_ADD_U32) +s_pack_ll_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_LL_B32_B16) +s_pack_lh_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_LH_B32_B16) +s_pack_hh_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_HH_B32_B16) +s_cmp_eq_i32 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_I32) +s_cmp_lg_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LG_I32) +s_cmp_gt_i32 = functools.partial(SOPC, SOPCOp.S_CMP_GT_I32) +s_cmp_ge_i32 = functools.partial(SOPC, SOPCOp.S_CMP_GE_I32) +s_cmp_lt_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LT_I32) +s_cmp_le_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LE_I32) +s_cmp_eq_u32 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_U32) +s_cmp_lg_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LG_U32) +s_cmp_gt_u32 = functools.partial(SOPC, SOPCOp.S_CMP_GT_U32) +s_cmp_ge_u32 = functools.partial(SOPC, SOPCOp.S_CMP_GE_U32) +s_cmp_lt_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LT_U32) +s_cmp_le_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LE_U32) +s_bitcmp0_b32 = functools.partial(SOPC, SOPCOp.S_BITCMP0_B32) +s_bitcmp1_b32 = functools.partial(SOPC, SOPCOp.S_BITCMP1_B32) +s_bitcmp0_b64 = functools.partial(SOPC, SOPCOp.S_BITCMP0_B64) +s_bitcmp1_b64 = functools.partial(SOPC, SOPCOp.S_BITCMP1_B64) +s_setvskip = functools.partial(SOPC, SOPCOp.S_SETVSKIP) +s_set_gpr_idx_on = functools.partial(SOPC, SOPCOp.S_SET_GPR_IDX_ON) +s_cmp_eq_u64 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_U64) +s_cmp_lg_u64 = functools.partial(SOPC, SOPCOp.S_CMP_LG_U64) +s_movk_i32 = functools.partial(SOPK, SOPKOp.S_MOVK_I32) +s_cmovk_i32 = functools.partial(SOPK, SOPKOp.S_CMOVK_I32) +s_cmpk_eq_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_EQ_I32) +s_cmpk_lg_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_LG_I32) +s_cmpk_gt_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_GT_I32) +s_cmpk_ge_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_GE_I32) +s_cmpk_lt_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_LT_I32) +s_cmpk_le_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_LE_I32) +s_cmpk_eq_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_EQ_U32) +s_cmpk_lg_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_LG_U32) +s_cmpk_gt_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_GT_U32) +s_cmpk_ge_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_GE_U32) +s_cmpk_lt_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_LT_U32) +s_cmpk_le_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_LE_U32) +s_addk_i32 = functools.partial(SOPK, SOPKOp.S_ADDK_I32) +s_mulk_i32 = functools.partial(SOPK, SOPKOp.S_MULK_I32) +s_cbranch_i_fork = functools.partial(SOPK, SOPKOp.S_CBRANCH_I_FORK) +s_getreg_b32 = functools.partial(SOPK, SOPKOp.S_GETREG_B32) +s_setreg_b32 = functools.partial(SOPK, SOPKOp.S_SETREG_B32) +s_setreg_imm32_b32 = functools.partial(SOPK_LIT, SOPKOp.S_SETREG_IMM32_B32) +s_call_b64 = functools.partial(SOPK, SOPKOp.S_CALL_B64) +s_nop = functools.partial(SOPP, SOPPOp.S_NOP) +s_endpgm = functools.partial(SOPP, SOPPOp.S_ENDPGM) +s_branch = functools.partial(SOPP, SOPPOp.S_BRANCH) +s_wakeup = functools.partial(SOPP, SOPPOp.S_WAKEUP) +s_cbranch_scc0 = functools.partial(SOPP, SOPPOp.S_CBRANCH_SCC0) +s_cbranch_scc1 = functools.partial(SOPP, SOPPOp.S_CBRANCH_SCC1) +s_cbranch_vccz = functools.partial(SOPP, SOPPOp.S_CBRANCH_VCCZ) +s_cbranch_vccnz = functools.partial(SOPP, SOPPOp.S_CBRANCH_VCCNZ) +s_cbranch_execz = functools.partial(SOPP, SOPPOp.S_CBRANCH_EXECZ) +s_cbranch_execnz = functools.partial(SOPP, SOPPOp.S_CBRANCH_EXECNZ) +s_barrier = functools.partial(SOPP, SOPPOp.S_BARRIER) +s_setkill = functools.partial(SOPP, SOPPOp.S_SETKILL) +s_waitcnt = functools.partial(SOPP, SOPPOp.S_WAITCNT) +s_sethalt = functools.partial(SOPP, SOPPOp.S_SETHALT) +s_sleep = functools.partial(SOPP, SOPPOp.S_SLEEP) +s_setprio = functools.partial(SOPP, SOPPOp.S_SETPRIO) +s_sendmsg = functools.partial(SOPP, SOPPOp.S_SENDMSG) +s_sendmsghalt = functools.partial(SOPP, SOPPOp.S_SENDMSGHALT) +s_trap = functools.partial(SOPP, SOPPOp.S_TRAP) +s_icache_inv = functools.partial(SOPP, SOPPOp.S_ICACHE_INV) +s_incperflevel = functools.partial(SOPP, SOPPOp.S_INCPERFLEVEL) +s_decperflevel = functools.partial(SOPP, SOPPOp.S_DECPERFLEVEL) +s_ttracedata = functools.partial(SOPP, SOPPOp.S_TTRACEDATA) +s_cbranch_cdbgsys = functools.partial(SOPP, SOPPOp.S_CBRANCH_CDBGSYS) +s_cbranch_cdbguser = functools.partial(SOPP, SOPPOp.S_CBRANCH_CDBGUSER) +s_cbranch_cdbgsys_or_user = functools.partial(SOPP, SOPPOp.S_CBRANCH_CDBGSYS_OR_USER) +s_cbranch_cdbgsys_and_user = functools.partial(SOPP, SOPPOp.S_CBRANCH_CDBGSYS_AND_USER) +s_endpgm_saved = functools.partial(SOPP, SOPPOp.S_ENDPGM_SAVED) +s_set_gpr_idx_off = functools.partial(SOPP, SOPPOp.S_SET_GPR_IDX_OFF) +s_set_gpr_idx_mode = functools.partial(SOPP, SOPPOp.S_SET_GPR_IDX_MODE) +s_endpgm_ordered_ps_done = functools.partial(SOPP, SOPPOp.S_ENDPGM_ORDERED_PS_DONE) +s_set_valu_coexec_mode = functools.partial(SOPP, SOPPOp.S_SET_VALU_COEXEC_MODE) +v_nop_e32 = functools.partial(VOP1, VOP1Op.V_NOP_E32) +v_mov_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOV_B32_E32) +v_readfirstlane_b32_e32 = functools.partial(VOP1, VOP1Op.V_READFIRSTLANE_B32_E32) +v_cvt_i32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I32_F64_E32) +v_cvt_f64_i32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_I32_E32) +v_cvt_f32_i32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_I32_E32) +v_cvt_f32_u32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_U32_E32) +v_cvt_u32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U32_F32_E32) +v_cvt_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I32_F32_E32) +v_cvt_f16_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_F32_E32) +v_cvt_f32_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_F16_E32) +v_cvt_rpi_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_RPI_I32_F32_E32) +v_cvt_flr_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_FLR_I32_F32_E32) +v_cvt_off_f32_i4_e32 = functools.partial(VOP1, VOP1Op.V_CVT_OFF_F32_I4_E32) +v_cvt_f32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_F64_E32) +v_cvt_f64_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_F32_E32) +v_cvt_f32_ubyte0_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE0_E32) +v_cvt_f32_ubyte1_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE1_E32) +v_cvt_f32_ubyte2_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE2_E32) +v_cvt_f32_ubyte3_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE3_E32) +v_cvt_u32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U32_F64_E32) +v_cvt_f64_u32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_U32_E32) +v_trunc_f64_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F64_E32) +v_ceil_f64_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F64_E32) +v_rndne_f64_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F64_E32) +v_floor_f64_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F64_E32) +v_fract_f32_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F32_E32) +v_trunc_f32_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F32_E32) +v_ceil_f32_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F32_E32) +v_rndne_f32_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F32_E32) +v_floor_f32_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F32_E32) +v_exp_f32_e32 = functools.partial(VOP1, VOP1Op.V_EXP_F32_E32) +v_log_f32_e32 = functools.partial(VOP1, VOP1Op.V_LOG_F32_E32) +v_rcp_f32_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F32_E32) +v_rcp_iflag_f32_e32 = functools.partial(VOP1, VOP1Op.V_RCP_IFLAG_F32_E32) +v_rsq_f32_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F32_E32) +v_rcp_f64_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F64_E32) +v_rsq_f64_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F64_E32) +v_sqrt_f32_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F32_E32) +v_sqrt_f64_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F64_E32) +v_sin_f32_e32 = functools.partial(VOP1, VOP1Op.V_SIN_F32_E32) +v_cos_f32_e32 = functools.partial(VOP1, VOP1Op.V_COS_F32_E32) +v_not_b32_e32 = functools.partial(VOP1, VOP1Op.V_NOT_B32_E32) +v_bfrev_b32_e32 = functools.partial(VOP1, VOP1Op.V_BFREV_B32_E32) +v_ffbh_u32_e32 = functools.partial(VOP1, VOP1Op.V_FFBH_U32_E32) +v_ffbl_b32_e32 = functools.partial(VOP1, VOP1Op.V_FFBL_B32_E32) +v_ffbh_i32_e32 = functools.partial(VOP1, VOP1Op.V_FFBH_I32_E32) +v_frexp_exp_i32_f64_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I32_F64_E32) +v_frexp_mant_f64_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F64_E32) +v_fract_f64_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F64_E32) +v_frexp_exp_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I32_F32_E32) +v_frexp_mant_f32_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F32_E32) +v_clrexcp_e32 = functools.partial(VOP1, VOP1Op.V_CLREXCP_E32) +v_screen_partition_4se_b32_e32 = functools.partial(VOP1, VOP1Op.V_SCREEN_PARTITION_4SE_B32_E32) +v_mov_b64_e32 = functools.partial(VOP1, VOP1Op.V_MOV_B64_E32) +v_cvt_f16_u16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_U16_E32) +v_cvt_f16_i16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_I16_E32) +v_cvt_u16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U16_F16_E32) +v_cvt_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I16_F16_E32) +v_rcp_f16_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F16_E32) +v_sqrt_f16_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F16_E32) +v_rsq_f16_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F16_E32) +v_log_f16_e32 = functools.partial(VOP1, VOP1Op.V_LOG_F16_E32) +v_exp_f16_e32 = functools.partial(VOP1, VOP1Op.V_EXP_F16_E32) +v_frexp_mant_f16_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F16_E32) +v_frexp_exp_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I16_F16_E32) +v_floor_f16_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F16_E32) +v_ceil_f16_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F16_E32) +v_trunc_f16_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F16_E32) +v_rndne_f16_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F16_E32) +v_fract_f16_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F16_E32) +v_sin_f16_e32 = functools.partial(VOP1, VOP1Op.V_SIN_F16_E32) +v_cos_f16_e32 = functools.partial(VOP1, VOP1Op.V_COS_F16_E32) +v_exp_legacy_f32_e32 = functools.partial(VOP1, VOP1Op.V_EXP_LEGACY_F32_E32) +v_log_legacy_f32_e32 = functools.partial(VOP1, VOP1Op.V_LOG_LEGACY_F32_E32) +v_cvt_norm_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_NORM_I16_F16_E32) +v_cvt_norm_u16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_NORM_U16_F16_E32) +v_sat_pk_u8_i16_e32 = functools.partial(VOP1, VOP1Op.V_SAT_PK_U8_I16_E32) +v_swap_b32_e32 = functools.partial(VOP1, VOP1Op.V_SWAP_B32_E32) +v_accvgpr_mov_b32_e32 = functools.partial(VOP1, VOP1Op.V_ACCVGPR_MOV_B32_E32) +v_cvt_f32_fp8_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_FP8_E32) +v_cvt_f32_bf8_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_BF8_E32) +v_cvt_pk_f32_fp8_e32 = functools.partial(VOP1, VOP1Op.V_CVT_PK_F32_FP8_E32) +v_cvt_pk_f32_bf8_e32 = functools.partial(VOP1, VOP1Op.V_CVT_PK_F32_BF8_E32) +v_prng_b32_e32 = functools.partial(VOP1, VOP1Op.V_PRNG_B32_E32) +v_permlane16_swap_b32_e32 = functools.partial(VOP1, VOP1Op.V_PERMLANE16_SWAP_B32_E32) +v_permlane32_swap_b32_e32 = functools.partial(VOP1, VOP1Op.V_PERMLANE32_SWAP_B32_E32) +v_cvt_f32_bf16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_BF16_E32) +v_cndmask_b32_e32 = functools.partial(VOP2, VOP2Op.V_CNDMASK_B32_E32) +v_add_f32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_F32_E32) +v_sub_f32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_F32_E32) +v_subrev_f32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_F32_E32) +v_fmac_f64_e32 = functools.partial(VOP2, VOP2Op.V_FMAC_F64_E32) +v_mul_f32_e32 = functools.partial(VOP2, VOP2Op.V_MUL_F32_E32) +v_mul_i32_i24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_I32_I24_E32) +v_mul_hi_i32_i24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_HI_I32_I24_E32) +v_mul_u32_u24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_U32_U24_E32) +v_mul_hi_u32_u24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_HI_U32_U24_E32) +v_min_f32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_F32_E32) +v_max_f32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_F32_E32) +v_min_i32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_I32_E32) +v_max_i32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_I32_E32) +v_min_u32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_U32_E32) +v_max_u32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_U32_E32) +v_lshrrev_b32_e32 = functools.partial(VOP2, VOP2Op.V_LSHRREV_B32_E32) +v_ashrrev_i32_e32 = functools.partial(VOP2, VOP2Op.V_ASHRREV_I32_E32) +v_lshlrev_b32_e32 = functools.partial(VOP2, VOP2Op.V_LSHLREV_B32_E32) +v_and_b32_e32 = functools.partial(VOP2, VOP2Op.V_AND_B32_E32) +v_or_b32_e32 = functools.partial(VOP2, VOP2Op.V_OR_B32_E32) +v_xor_b32_e32 = functools.partial(VOP2, VOP2Op.V_XOR_B32_E32) +v_dot2c_f32_bf16_e32 = functools.partial(VOP2, VOP2Op.V_DOT2C_F32_BF16_E32) +v_fmamk_f32_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAMK_F32_E32) +v_fmaak_f32_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAAK_F32_E32) +v_add_co_u32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_CO_U32_E32) +v_sub_co_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_CO_U32_E32) +v_subrev_co_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_CO_U32_E32) +v_addc_co_u32_e32 = functools.partial(VOP2, VOP2Op.V_ADDC_CO_U32_E32) +v_subb_co_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUBB_CO_U32_E32) +v_subbrev_co_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUBBREV_CO_U32_E32) +v_add_f16_e32 = functools.partial(VOP2, VOP2Op.V_ADD_F16_E32) +v_sub_f16_e32 = functools.partial(VOP2, VOP2Op.V_SUB_F16_E32) +v_subrev_f16_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_F16_E32) +v_mul_f16_e32 = functools.partial(VOP2, VOP2Op.V_MUL_F16_E32) +v_mac_f16_e32 = functools.partial(VOP2, VOP2Op.V_MAC_F16_E32) +v_madmk_f16_e32 = functools.partial(VOP2_LIT, VOP2Op.V_MADMK_F16_E32) +v_madak_f16_e32 = functools.partial(VOP2_LIT, VOP2Op.V_MADAK_F16_E32) +v_add_u16_e32 = functools.partial(VOP2, VOP2Op.V_ADD_U16_E32) +v_sub_u16_e32 = functools.partial(VOP2, VOP2Op.V_SUB_U16_E32) +v_subrev_u16_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_U16_E32) +v_mul_lo_u16_e32 = functools.partial(VOP2, VOP2Op.V_MUL_LO_U16_E32) +v_lshlrev_b16_e32 = functools.partial(VOP2, VOP2Op.V_LSHLREV_B16_E32) +v_lshrrev_b16_e32 = functools.partial(VOP2, VOP2Op.V_LSHRREV_B16_E32) +v_ashrrev_i16_e32 = functools.partial(VOP2, VOP2Op.V_ASHRREV_I16_E32) +v_max_f16_e32 = functools.partial(VOP2, VOP2Op.V_MAX_F16_E32) +v_min_f16_e32 = functools.partial(VOP2, VOP2Op.V_MIN_F16_E32) +v_max_u16_e32 = functools.partial(VOP2, VOP2Op.V_MAX_U16_E32) +v_max_i16_e32 = functools.partial(VOP2, VOP2Op.V_MAX_I16_E32) +v_min_u16_e32 = functools.partial(VOP2, VOP2Op.V_MIN_U16_E32) +v_min_i16_e32 = functools.partial(VOP2, VOP2Op.V_MIN_I16_E32) +v_ldexp_f16_e32 = functools.partial(VOP2, VOP2Op.V_LDEXP_F16_E32) +v_add_u32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_U32_E32) +v_sub_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_U32_E32) +v_subrev_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_U32_E32) +v_dot2c_f32_f16_e32 = functools.partial(VOP2, VOP2Op.V_DOT2C_F32_F16_E32) +v_dot2c_i32_i16_e32 = functools.partial(VOP2, VOP2Op.V_DOT2C_I32_I16_E32) +v_dot4c_i32_i8_e32 = functools.partial(VOP2, VOP2Op.V_DOT4C_I32_I8_E32) +v_dot8c_i32_i4_e32 = functools.partial(VOP2, VOP2Op.V_DOT8C_I32_I4_E32) +v_fmac_f32_e32 = functools.partial(VOP2, VOP2Op.V_FMAC_F32_E32) +v_pk_fmac_f16_e32 = functools.partial(VOP2, VOP2Op.V_PK_FMAC_F16_E32) +v_xnor_b32_e32 = functools.partial(VOP2, VOP2Op.V_XNOR_B32_E32) +v_cmp_class_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F32_E64) +v_cmpx_class_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F32_E64) +v_cmp_class_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F64_E64) +v_cmpx_class_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F64_E64) +v_cmp_class_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F16_E64) +v_cmpx_class_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F16_E64) +v_cmp_f_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_F16_E64) +v_cmp_lt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F16_E64) +v_cmp_eq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F16_E64) +v_cmp_le_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F16_E64) +v_cmp_gt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F16_E64) +v_cmp_lg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F16_E64) +v_cmp_ge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F16_E64) +v_cmp_o_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F16_E64) +v_cmp_u_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F16_E64) +v_cmp_nge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F16_E64) +v_cmp_nlg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F16_E64) +v_cmp_ngt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F16_E64) +v_cmp_nle_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F16_E64) +v_cmp_neq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F16_E64) +v_cmp_nlt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F16_E64) +v_cmp_tru_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_TRU_F16_E64) +v_cmpx_f_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_F16_E64) +v_cmpx_lt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F16_E64) +v_cmpx_eq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F16_E64) +v_cmpx_le_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F16_E64) +v_cmpx_gt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F16_E64) +v_cmpx_lg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F16_E64) +v_cmpx_ge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F16_E64) +v_cmpx_o_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F16_E64) +v_cmpx_u_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F16_E64) +v_cmpx_nge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F16_E64) +v_cmpx_nlg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F16_E64) +v_cmpx_ngt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F16_E64) +v_cmpx_nle_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F16_E64) +v_cmpx_neq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F16_E64) +v_cmpx_nlt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F16_E64) +v_cmpx_tru_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_TRU_F16_E64) +v_cmp_f_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_F32_E64) +v_cmp_lt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F32_E64) +v_cmp_eq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F32_E64) +v_cmp_le_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F32_E64) +v_cmp_gt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F32_E64) +v_cmp_lg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F32_E64) +v_cmp_ge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F32_E64) +v_cmp_o_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F32_E64) +v_cmp_u_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F32_E64) +v_cmp_nge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F32_E64) +v_cmp_nlg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F32_E64) +v_cmp_ngt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F32_E64) +v_cmp_nle_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F32_E64) +v_cmp_neq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F32_E64) +v_cmp_nlt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F32_E64) +v_cmp_tru_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_TRU_F32_E64) +v_cmpx_f_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_F32_E64) +v_cmpx_lt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F32_E64) +v_cmpx_eq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F32_E64) +v_cmpx_le_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F32_E64) +v_cmpx_gt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F32_E64) +v_cmpx_lg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F32_E64) +v_cmpx_ge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F32_E64) +v_cmpx_o_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F32_E64) +v_cmpx_u_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F32_E64) +v_cmpx_nge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F32_E64) +v_cmpx_nlg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F32_E64) +v_cmpx_ngt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F32_E64) +v_cmpx_nle_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F32_E64) +v_cmpx_neq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F32_E64) +v_cmpx_nlt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F32_E64) +v_cmpx_tru_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_TRU_F32_E64) +v_cmp_f_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_F64_E64) +v_cmp_lt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F64_E64) +v_cmp_eq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F64_E64) +v_cmp_le_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F64_E64) +v_cmp_gt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F64_E64) +v_cmp_lg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F64_E64) +v_cmp_ge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F64_E64) +v_cmp_o_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F64_E64) +v_cmp_u_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F64_E64) +v_cmp_nge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F64_E64) +v_cmp_nlg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F64_E64) +v_cmp_ngt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F64_E64) +v_cmp_nle_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F64_E64) +v_cmp_neq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F64_E64) +v_cmp_nlt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F64_E64) +v_cmp_tru_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_TRU_F64_E64) +v_cmpx_f_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_F64_E64) +v_cmpx_lt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F64_E64) +v_cmpx_eq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F64_E64) +v_cmpx_le_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F64_E64) +v_cmpx_gt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F64_E64) +v_cmpx_lg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F64_E64) +v_cmpx_ge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F64_E64) +v_cmpx_o_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F64_E64) +v_cmpx_u_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F64_E64) +v_cmpx_nge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F64_E64) +v_cmpx_nlg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F64_E64) +v_cmpx_ngt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F64_E64) +v_cmpx_nle_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F64_E64) +v_cmpx_neq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F64_E64) +v_cmpx_nlt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F64_E64) +v_cmpx_tru_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_TRU_F64_E64) +v_cmp_f_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_I16_E64) +v_cmp_lt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I16_E64) +v_cmp_eq_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I16_E64) +v_cmp_le_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I16_E64) +v_cmp_gt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I16_E64) +v_cmp_ne_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I16_E64) +v_cmp_ge_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I16_E64) +v_cmp_t_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_I16_E64) +v_cmp_f_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_U16_E64) +v_cmp_lt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U16_E64) +v_cmp_eq_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U16_E64) +v_cmp_le_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U16_E64) +v_cmp_gt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U16_E64) +v_cmp_ne_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U16_E64) +v_cmp_ge_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U16_E64) +v_cmp_t_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_U16_E64) +v_cmpx_f_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_I16_E64) +v_cmpx_lt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I16_E64) +v_cmpx_eq_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I16_E64) +v_cmpx_le_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I16_E64) +v_cmpx_gt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I16_E64) +v_cmpx_ne_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I16_E64) +v_cmpx_ge_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I16_E64) +v_cmpx_t_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_I16_E64) +v_cmpx_f_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_U16_E64) +v_cmpx_lt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U16_E64) +v_cmpx_eq_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U16_E64) +v_cmpx_le_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U16_E64) +v_cmpx_gt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U16_E64) +v_cmpx_ne_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U16_E64) +v_cmpx_ge_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U16_E64) +v_cmpx_t_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_U16_E64) +v_cmp_f_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_I32_E64) +v_cmp_lt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I32_E64) +v_cmp_eq_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I32_E64) +v_cmp_le_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I32_E64) +v_cmp_gt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I32_E64) +v_cmp_ne_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I32_E64) +v_cmp_ge_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I32_E64) +v_cmp_t_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_I32_E64) +v_cmp_f_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_U32_E64) +v_cmp_lt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U32_E64) +v_cmp_eq_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U32_E64) +v_cmp_le_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U32_E64) +v_cmp_gt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U32_E64) +v_cmp_ne_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U32_E64) +v_cmp_ge_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U32_E64) +v_cmp_t_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_U32_E64) +v_cmpx_f_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_I32_E64) +v_cmpx_lt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I32_E64) +v_cmpx_eq_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I32_E64) +v_cmpx_le_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I32_E64) +v_cmpx_gt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I32_E64) +v_cmpx_ne_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I32_E64) +v_cmpx_ge_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I32_E64) +v_cmpx_t_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_I32_E64) +v_cmpx_f_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_U32_E64) +v_cmpx_lt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U32_E64) +v_cmpx_eq_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U32_E64) +v_cmpx_le_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U32_E64) +v_cmpx_gt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U32_E64) +v_cmpx_ne_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U32_E64) +v_cmpx_ge_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U32_E64) +v_cmpx_t_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_U32_E64) +v_cmp_f_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_I64_E64) +v_cmp_lt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I64_E64) +v_cmp_eq_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I64_E64) +v_cmp_le_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I64_E64) +v_cmp_gt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I64_E64) +v_cmp_ne_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I64_E64) +v_cmp_ge_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I64_E64) +v_cmp_t_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_I64_E64) +v_cmp_f_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_U64_E64) +v_cmp_lt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U64_E64) +v_cmp_eq_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U64_E64) +v_cmp_le_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U64_E64) +v_cmp_gt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U64_E64) +v_cmp_ne_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U64_E64) +v_cmp_ge_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U64_E64) +v_cmp_t_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_U64_E64) +v_cmpx_f_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_I64_E64) +v_cmpx_lt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I64_E64) +v_cmpx_eq_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I64_E64) +v_cmpx_le_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I64_E64) +v_cmpx_gt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I64_E64) +v_cmpx_ne_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I64_E64) +v_cmpx_ge_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I64_E64) +v_cmpx_t_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_I64_E64) +v_cmpx_f_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_U64_E64) +v_cmpx_lt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U64_E64) +v_cmpx_eq_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U64_E64) +v_cmpx_le_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U64_E64) +v_cmpx_gt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U64_E64) +v_cmpx_ne_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U64_E64) +v_cmpx_ge_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U64_E64) +v_cmpx_t_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_U64_E64) +v_cndmask_b32_e64 = functools.partial(VOP3, VOP3Op.V_CNDMASK_B32_E64) +v_add_f32_e64 = functools.partial(VOP3, VOP3Op.V_ADD_F32_E64) +v_sub_f32_e64 = functools.partial(VOP3, VOP3Op.V_SUB_F32_E64) +v_subrev_f32_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_F32_E64) +v_fmac_f64_e64 = functools.partial(VOP3, VOP3Op.V_FMAC_F64_E64) +v_mul_f32_e64 = functools.partial(VOP3, VOP3Op.V_MUL_F32_E64) +v_mul_i32_i24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_I32_I24_E64) +v_mul_hi_i32_i24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_HI_I32_I24_E64) +v_mul_u32_u24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_U32_U24_E64) +v_mul_hi_u32_u24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_HI_U32_U24_E64) +v_min_f32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_F32_E64) +v_max_f32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_F32_E64) +v_min_i32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_I32_E64) +v_max_i32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_I32_E64) +v_min_u32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_U32_E64) +v_max_u32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_U32_E64) +v_lshrrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B32_E64) +v_ashrrev_i32_e64 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I32_E64) +v_lshlrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B32_E64) +v_and_b32_e64 = functools.partial(VOP3, VOP3Op.V_AND_B32_E64) +v_or_b32_e64 = functools.partial(VOP3, VOP3Op.V_OR_B32_E64) +v_xor_b32_e64 = functools.partial(VOP3, VOP3Op.V_XOR_B32_E64) +v_dot2c_f32_bf16_e64 = functools.partial(VOP3, VOP3Op.V_DOT2C_F32_BF16_E64) +v_add_f16_e64 = functools.partial(VOP3, VOP3Op.V_ADD_F16_E64) +v_sub_f16_e64 = functools.partial(VOP3, VOP3Op.V_SUB_F16_E64) +v_subrev_f16_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_F16_E64) +v_mul_f16_e64 = functools.partial(VOP3, VOP3Op.V_MUL_F16_E64) +v_mac_f16_e64 = functools.partial(VOP3, VOP3Op.V_MAC_F16_E64) +v_add_u16_e64 = functools.partial(VOP3, VOP3Op.V_ADD_U16_E64) +v_sub_u16_e64 = functools.partial(VOP3, VOP3Op.V_SUB_U16_E64) +v_subrev_u16_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_U16_E64) +v_mul_lo_u16_e64 = functools.partial(VOP3, VOP3Op.V_MUL_LO_U16_E64) +v_lshlrev_b16_e64 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B16_E64) +v_lshrrev_b16_e64 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B16_E64) +v_ashrrev_i16_e64 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I16_E64) +v_max_f16_e64 = functools.partial(VOP3, VOP3Op.V_MAX_F16_E64) +v_min_f16_e64 = functools.partial(VOP3, VOP3Op.V_MIN_F16_E64) +v_max_u16_e64 = functools.partial(VOP3, VOP3Op.V_MAX_U16_E64) +v_max_i16_e64 = functools.partial(VOP3, VOP3Op.V_MAX_I16_E64) +v_min_u16_e64 = functools.partial(VOP3, VOP3Op.V_MIN_U16_E64) +v_min_i16_e64 = functools.partial(VOP3, VOP3Op.V_MIN_I16_E64) +v_ldexp_f16_e64 = functools.partial(VOP3, VOP3Op.V_LDEXP_F16_E64) +v_add_u32_e64 = functools.partial(VOP3, VOP3Op.V_ADD_U32_E64) +v_sub_u32_e64 = functools.partial(VOP3, VOP3Op.V_SUB_U32_E64) +v_subrev_u32_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_U32_E64) +v_dot2c_f32_f16_e64 = functools.partial(VOP3, VOP3Op.V_DOT2C_F32_F16_E64) +v_dot2c_i32_i16_e64 = functools.partial(VOP3, VOP3Op.V_DOT2C_I32_I16_E64) +v_dot4c_i32_i8_e64 = functools.partial(VOP3, VOP3Op.V_DOT4C_I32_I8_E64) +v_dot8c_i32_i4_e64 = functools.partial(VOP3, VOP3Op.V_DOT8C_I32_I4_E64) +v_fmac_f32_e64 = functools.partial(VOP3, VOP3Op.V_FMAC_F32_E64) +v_pk_fmac_f16_e64 = functools.partial(VOP3, VOP3Op.V_PK_FMAC_F16_E64) +v_xnor_b32_e64 = functools.partial(VOP3, VOP3Op.V_XNOR_B32_E64) +v_nop_e64 = functools.partial(VOP3, VOP3Op.V_NOP_E64) +v_mov_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOV_B32_E64) +v_readfirstlane_b32_e64 = functools.partial(VOP3, VOP3Op.V_READFIRSTLANE_B32_E64) +v_cvt_i32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I32_F64_E64) +v_cvt_f64_i32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_I32_E64) +v_cvt_f32_i32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_I32_E64) +v_cvt_f32_u32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_U32_E64) +v_cvt_u32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U32_F32_E64) +v_cvt_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I32_F32_E64) +v_cvt_f16_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_F32_E64) +v_cvt_f32_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_F16_E64) +v_cvt_rpi_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_RPI_I32_F32_E64) +v_cvt_flr_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_FLR_I32_F32_E64) +v_cvt_off_f32_i4_e64 = functools.partial(VOP3, VOP3Op.V_CVT_OFF_F32_I4_E64) +v_cvt_f32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_F64_E64) +v_cvt_f64_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_F32_E64) +v_cvt_f32_ubyte0_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE0_E64) +v_cvt_f32_ubyte1_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE1_E64) +v_cvt_f32_ubyte2_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE2_E64) +v_cvt_f32_ubyte3_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE3_E64) +v_cvt_u32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U32_F64_E64) +v_cvt_f64_u32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_U32_E64) +v_trunc_f64_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F64_E64) +v_ceil_f64_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F64_E64) +v_rndne_f64_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F64_E64) +v_floor_f64_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F64_E64) +v_fract_f32_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F32_E64) +v_trunc_f32_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F32_E64) +v_ceil_f32_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F32_E64) +v_rndne_f32_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F32_E64) +v_floor_f32_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F32_E64) +v_exp_f32_e64 = functools.partial(VOP3, VOP3Op.V_EXP_F32_E64) +v_log_f32_e64 = functools.partial(VOP3, VOP3Op.V_LOG_F32_E64) +v_rcp_f32_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F32_E64) +v_rcp_iflag_f32_e64 = functools.partial(VOP3, VOP3Op.V_RCP_IFLAG_F32_E64) +v_rsq_f32_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F32_E64) +v_rcp_f64_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F64_E64) +v_rsq_f64_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F64_E64) +v_sqrt_f32_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F32_E64) +v_sqrt_f64_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F64_E64) +v_sin_f32_e64 = functools.partial(VOP3, VOP3Op.V_SIN_F32_E64) +v_cos_f32_e64 = functools.partial(VOP3, VOP3Op.V_COS_F32_E64) +v_not_b32_e64 = functools.partial(VOP3, VOP3Op.V_NOT_B32_E64) +v_bfrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_BFREV_B32_E64) +v_ffbh_u32_e64 = functools.partial(VOP3, VOP3Op.V_FFBH_U32_E64) +v_ffbl_b32_e64 = functools.partial(VOP3, VOP3Op.V_FFBL_B32_E64) +v_ffbh_i32_e64 = functools.partial(VOP3, VOP3Op.V_FFBH_I32_E64) +v_frexp_exp_i32_f64_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I32_F64_E64) +v_frexp_mant_f64_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F64_E64) +v_fract_f64_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F64_E64) +v_frexp_exp_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I32_F32_E64) +v_frexp_mant_f32_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F32_E64) +v_clrexcp_e64 = functools.partial(VOP3, VOP3Op.V_CLREXCP_E64) +v_screen_partition_4se_b32_e64 = functools.partial(VOP3, VOP3Op.V_SCREEN_PARTITION_4SE_B32_E64) +v_mov_b64_e64 = functools.partial(VOP3, VOP3Op.V_MOV_B64_E64) +v_cvt_f16_u16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_U16_E64) +v_cvt_f16_i16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_I16_E64) +v_cvt_u16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U16_F16_E64) +v_cvt_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I16_F16_E64) +v_rcp_f16_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F16_E64) +v_sqrt_f16_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F16_E64) +v_rsq_f16_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F16_E64) +v_log_f16_e64 = functools.partial(VOP3, VOP3Op.V_LOG_F16_E64) +v_exp_f16_e64 = functools.partial(VOP3, VOP3Op.V_EXP_F16_E64) +v_frexp_mant_f16_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F16_E64) +v_frexp_exp_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I16_F16_E64) +v_floor_f16_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F16_E64) +v_ceil_f16_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F16_E64) +v_trunc_f16_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F16_E64) +v_rndne_f16_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F16_E64) +v_fract_f16_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F16_E64) +v_sin_f16_e64 = functools.partial(VOP3, VOP3Op.V_SIN_F16_E64) +v_cos_f16_e64 = functools.partial(VOP3, VOP3Op.V_COS_F16_E64) +v_exp_legacy_f32_e64 = functools.partial(VOP3, VOP3Op.V_EXP_LEGACY_F32_E64) +v_log_legacy_f32_e64 = functools.partial(VOP3, VOP3Op.V_LOG_LEGACY_F32_E64) +v_cvt_norm_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_NORM_I16_F16_E64) +v_cvt_norm_u16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_NORM_U16_F16_E64) +v_sat_pk_u8_i16_e64 = functools.partial(VOP3, VOP3Op.V_SAT_PK_U8_I16_E64) +v_swap_b32_e64 = functools.partial(VOP3, VOP3Op.V_SWAP_B32_E64) +v_accvgpr_mov_b32_e64 = functools.partial(VOP3, VOP3Op.V_ACCVGPR_MOV_B32_E64) +v_cvt_f32_fp8_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_FP8_E64) +v_cvt_f32_bf8_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_BF8_E64) +v_cvt_pk_f32_fp8_e64 = functools.partial(VOP3, VOP3Op.V_CVT_PK_F32_FP8_E64) +v_cvt_pk_f32_bf8_e64 = functools.partial(VOP3, VOP3Op.V_CVT_PK_F32_BF8_E64) +v_prng_b32_e64 = functools.partial(VOP3, VOP3Op.V_PRNG_B32_E64) +v_permlane16_swap_b32_e64 = functools.partial(VOP3, VOP3Op.V_PERMLANE16_SWAP_B32_E64) +v_permlane32_swap_b32_e64 = functools.partial(VOP3, VOP3Op.V_PERMLANE32_SWAP_B32_E64) +v_cvt_f32_bf16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_BF16_E64) +v_mad_i32_i24_e64 = functools.partial(VOP3, VOP3Op.V_MAD_I32_I24_E64) +v_mad_u32_u24_e64 = functools.partial(VOP3, VOP3Op.V_MAD_U32_U24_E64) +v_cubeid_f32_e64 = functools.partial(VOP3, VOP3Op.V_CUBEID_F32_E64) +v_cubesc_f32_e64 = functools.partial(VOP3, VOP3Op.V_CUBESC_F32_E64) +v_cubetc_f32_e64 = functools.partial(VOP3, VOP3Op.V_CUBETC_F32_E64) +v_cubema_f32_e64 = functools.partial(VOP3, VOP3Op.V_CUBEMA_F32_E64) +v_bfe_u32_e64 = functools.partial(VOP3, VOP3Op.V_BFE_U32_E64) +v_bfe_i32_e64 = functools.partial(VOP3, VOP3Op.V_BFE_I32_E64) +v_bfi_b32_e64 = functools.partial(VOP3, VOP3Op.V_BFI_B32_E64) +v_fma_f32_e64 = functools.partial(VOP3, VOP3Op.V_FMA_F32_E64) +v_fma_f64_e64 = functools.partial(VOP3, VOP3Op.V_FMA_F64_E64) +v_lerp_u8_e64 = functools.partial(VOP3, VOP3Op.V_LERP_U8_E64) +v_alignbit_b32_e64 = functools.partial(VOP3, VOP3Op.V_ALIGNBIT_B32_E64) +v_alignbyte_b32_e64 = functools.partial(VOP3, VOP3Op.V_ALIGNBYTE_B32_E64) +v_min3_f32_e64 = functools.partial(VOP3, VOP3Op.V_MIN3_F32_E64) +v_min3_i32_e64 = functools.partial(VOP3, VOP3Op.V_MIN3_I32_E64) +v_min3_u32_e64 = functools.partial(VOP3, VOP3Op.V_MIN3_U32_E64) +v_max3_f32_e64 = functools.partial(VOP3, VOP3Op.V_MAX3_F32_E64) +v_max3_i32_e64 = functools.partial(VOP3, VOP3Op.V_MAX3_I32_E64) +v_max3_u32_e64 = functools.partial(VOP3, VOP3Op.V_MAX3_U32_E64) +v_med3_f32_e64 = functools.partial(VOP3, VOP3Op.V_MED3_F32_E64) +v_med3_i32_e64 = functools.partial(VOP3, VOP3Op.V_MED3_I32_E64) +v_med3_u32_e64 = functools.partial(VOP3, VOP3Op.V_MED3_U32_E64) +v_sad_u8_e64 = functools.partial(VOP3, VOP3Op.V_SAD_U8_E64) +v_sad_hi_u8_e64 = functools.partial(VOP3, VOP3Op.V_SAD_HI_U8_E64) +v_sad_u16_e64 = functools.partial(VOP3, VOP3Op.V_SAD_U16_E64) +v_sad_u32_e64 = functools.partial(VOP3, VOP3Op.V_SAD_U32_E64) +v_cvt_pk_u8_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_PK_U8_F32_E64) +v_div_fixup_f32_e64 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F32_E64) +v_div_fixup_f64_e64 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F64_E64) +v_div_fmas_f32_e64 = functools.partial(VOP3, VOP3Op.V_DIV_FMAS_F32_E64) +v_div_fmas_f64_e64 = functools.partial(VOP3, VOP3Op.V_DIV_FMAS_F64_E64) +v_msad_u8_e64 = functools.partial(VOP3, VOP3Op.V_MSAD_U8_E64) +v_qsad_pk_u16_u8_e64 = functools.partial(VOP3, VOP3Op.V_QSAD_PK_U16_U8_E64) +v_mqsad_pk_u16_u8_e64 = functools.partial(VOP3, VOP3Op.V_MQSAD_PK_U16_U8_E64) +v_mqsad_u32_u8_e64 = functools.partial(VOP3, VOP3Op.V_MQSAD_U32_U8_E64) +v_mad_legacy_f16_e64 = functools.partial(VOP3, VOP3Op.V_MAD_LEGACY_F16_E64) +v_mad_legacy_u16_e64 = functools.partial(VOP3, VOP3Op.V_MAD_LEGACY_U16_E64) +v_mad_legacy_i16_e64 = functools.partial(VOP3, VOP3Op.V_MAD_LEGACY_I16_E64) +v_perm_b32_e64 = functools.partial(VOP3, VOP3Op.V_PERM_B32_E64) +v_fma_legacy_f16_e64 = functools.partial(VOP3, VOP3Op.V_FMA_LEGACY_F16_E64) +v_div_fixup_legacy_f16_e64 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_LEGACY_F16_E64) +v_cvt_pkaccum_u8_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_PKACCUM_U8_F32_E64) +v_mad_u32_u16_e64 = functools.partial(VOP3, VOP3Op.V_MAD_U32_U16_E64) +v_mad_i32_i16_e64 = functools.partial(VOP3, VOP3Op.V_MAD_I32_I16_E64) +v_xad_u32_e64 = functools.partial(VOP3, VOP3Op.V_XAD_U32_E64) +v_min3_f16_e64 = functools.partial(VOP3, VOP3Op.V_MIN3_F16_E64) +v_min3_i16_e64 = functools.partial(VOP3, VOP3Op.V_MIN3_I16_E64) +v_min3_u16_e64 = functools.partial(VOP3, VOP3Op.V_MIN3_U16_E64) +v_max3_f16_e64 = functools.partial(VOP3, VOP3Op.V_MAX3_F16_E64) +v_max3_i16_e64 = functools.partial(VOP3, VOP3Op.V_MAX3_I16_E64) +v_max3_u16_e64 = functools.partial(VOP3, VOP3Op.V_MAX3_U16_E64) +v_med3_f16_e64 = functools.partial(VOP3, VOP3Op.V_MED3_F16_E64) +v_med3_i16_e64 = functools.partial(VOP3, VOP3Op.V_MED3_I16_E64) +v_med3_u16_e64 = functools.partial(VOP3, VOP3Op.V_MED3_U16_E64) +v_lshl_add_u32_e64 = functools.partial(VOP3, VOP3Op.V_LSHL_ADD_U32_E64) +v_add_lshl_u32_e64 = functools.partial(VOP3, VOP3Op.V_ADD_LSHL_U32_E64) +v_add3_u32_e64 = functools.partial(VOP3, VOP3Op.V_ADD3_U32_E64) +v_lshl_or_b32 = functools.partial(VOP3, VOP3Op.V_LSHL_OR_B32) +v_and_or_b32 = functools.partial(VOP3, VOP3Op.V_AND_OR_B32) +v_or3_b32 = functools.partial(VOP3, VOP3Op.V_OR3_B32) +v_mad_f16 = functools.partial(VOP3, VOP3Op.V_MAD_F16) +v_mad_u16 = functools.partial(VOP3, VOP3Op.V_MAD_U16) +v_mad_i16 = functools.partial(VOP3, VOP3Op.V_MAD_I16) +v_fma_f16 = functools.partial(VOP3, VOP3Op.V_FMA_F16) +v_div_fixup_f16 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F16) +v_lshl_add_u64 = functools.partial(VOP3, VOP3Op.V_LSHL_ADD_U64) +v_bitop3_b16 = functools.partial(VOP3, VOP3Op.V_BITOP3_B16) +v_bitop3_b32 = functools.partial(VOP3, VOP3Op.V_BITOP3_B32) +v_cvt_scalef32_pk_fp8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_FP8_F32) +v_cvt_scalef32_pk_bf8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_BF8_F32) +v_cvt_scalef32_sr_fp8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_FP8_F32) +v_cvt_scalef32_sr_bf8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_BF8_F32) +v_cvt_scalef32_pk_f32_fp8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_F32_FP8) +v_cvt_scalef32_pk_f32_bf8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_F32_BF8) +v_cvt_scalef32_f32_fp8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_F32_FP8) +v_cvt_scalef32_f32_bf8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_F32_BF8) +v_cvt_scalef32_pk_fp4_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_FP4_F32) +v_cvt_scalef32_sr_pk_fp4_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_F32) +v_cvt_scalef32_pk_f32_fp4 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_F32_FP4) +v_cvt_scalef32_pk_fp8_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_FP8_F16) +v_cvt_scalef32_pk_bf8_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_BF8_F16) +v_cvt_scalef32_sr_fp8_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_FP8_F16) +v_cvt_scalef32_sr_bf8_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_BF8_F16) +v_cvt_scalef32_pk_fp8_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_FP8_BF16) +v_cvt_scalef32_pk_bf8_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_BF8_BF16) +v_cvt_scalef32_sr_fp8_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_FP8_BF16) +v_cvt_scalef32_sr_bf8_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_BF8_BF16) +v_cvt_scalef32_pk_f16_fp8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_F16_FP8) +v_cvt_scalef32_pk_f16_bf8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_F16_BF8) +v_cvt_scalef32_f16_fp8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_F16_FP8) +v_cvt_scalef32_f16_bf8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_F16_BF8) +v_cvt_scalef32_pk_fp4_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_FP4_F16) +v_cvt_scalef32_pk_fp4_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_FP4_BF16) +v_cvt_scalef32_sr_pk_fp4_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_F16) +v_cvt_scalef32_sr_pk_fp4_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_BF16) +v_cvt_scalef32_pk_f16_fp4 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_F16_FP4) +v_cvt_scalef32_pk_bf16_fp4 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_BF16_FP4) +v_cvt_scalef32_2xpk16_fp6_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_2XPK16_FP6_F32) +v_cvt_scalef32_2xpk16_bf6_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_2XPK16_BF6_F32) +v_cvt_scalef32_sr_pk32_fp6_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_F32) +v_cvt_scalef32_sr_pk32_bf6_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_F32) +v_cvt_scalef32_pk32_f32_fp6 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_F32_FP6) +v_cvt_scalef32_pk32_f32_bf6 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_F32_BF6) +v_cvt_scalef32_pk32_fp6_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_FP6_F16) +v_cvt_scalef32_pk32_fp6_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_FP6_BF16) +v_cvt_scalef32_pk32_bf6_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_BF6_F16) +v_cvt_scalef32_pk32_bf6_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_BF6_BF16) +v_cvt_scalef32_sr_pk32_fp6_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_F16) +v_cvt_scalef32_sr_pk32_fp6_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_BF16) +v_cvt_scalef32_sr_pk32_bf6_f16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_F16) +v_cvt_scalef32_sr_pk32_bf6_bf16 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_BF16) +v_cvt_scalef32_pk32_f16_fp6 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_F16_FP6) +v_cvt_scalef32_pk32_bf16_fp6 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_BF16_FP6) +v_cvt_scalef32_pk32_f16_bf6 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_F16_BF6) +v_cvt_scalef32_pk32_bf16_bf6 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK32_BF16_BF6) +v_ashr_pk_i8_i32 = functools.partial(VOP3, VOP3Op.V_ASHR_PK_I8_I32) +v_ashr_pk_u8_i32 = functools.partial(VOP3, VOP3Op.V_ASHR_PK_U8_I32) +v_cvt_pk_f16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_F16_F32) +v_cvt_pk_bf16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_BF16_F32) +v_cvt_scalef32_pk_bf16_fp8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_BF16_FP8) +v_cvt_scalef32_pk_bf16_bf8 = functools.partial(VOP3, VOP3Op.V_CVT_SCALEF32_PK_BF16_BF8) +v_add_f64 = functools.partial(VOP3, VOP3Op.V_ADD_F64) +v_mul_f64 = functools.partial(VOP3, VOP3Op.V_MUL_F64) +v_min_f64 = functools.partial(VOP3, VOP3Op.V_MIN_F64) +v_max_f64 = functools.partial(VOP3, VOP3Op.V_MAX_F64) +v_ldexp_f64 = functools.partial(VOP3, VOP3Op.V_LDEXP_F64) +v_mul_lo_u32 = functools.partial(VOP3, VOP3Op.V_MUL_LO_U32) +v_mul_hi_u32 = functools.partial(VOP3, VOP3Op.V_MUL_HI_U32) +v_mul_hi_i32 = functools.partial(VOP3, VOP3Op.V_MUL_HI_I32) +v_ldexp_f32 = functools.partial(VOP3, VOP3Op.V_LDEXP_F32) +v_readlane_b32 = functools.partial(VOP3, VOP3Op.V_READLANE_B32) +v_writelane_b32 = functools.partial(VOP3, VOP3Op.V_WRITELANE_B32) +v_bcnt_u32_b32 = functools.partial(VOP3, VOP3Op.V_BCNT_U32_B32) +v_mbcnt_lo_u32_b32 = functools.partial(VOP3, VOP3Op.V_MBCNT_LO_U32_B32) +v_mbcnt_hi_u32_b32 = functools.partial(VOP3, VOP3Op.V_MBCNT_HI_U32_B32) +v_lshlrev_b64 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B64) +v_lshrrev_b64 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B64) +v_ashrrev_i64 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I64) +v_trig_preop_f64 = functools.partial(VOP3, VOP3Op.V_TRIG_PREOP_F64) +v_bfm_b32 = functools.partial(VOP3, VOP3Op.V_BFM_B32) +v_cvt_pknorm_i16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PKNORM_I16_F32) +v_cvt_pknorm_u16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PKNORM_U16_F32) +v_cvt_pkrtz_f16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PKRTZ_F16_F32) +v_cvt_pk_u16_u32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_U16_U32) +v_cvt_pk_i16_i32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_I16_I32) +v_cvt_pknorm_i16_f16 = functools.partial(VOP3, VOP3Op.V_CVT_PKNORM_I16_F16) +v_cvt_pknorm_u16_f16 = functools.partial(VOP3, VOP3Op.V_CVT_PKNORM_U16_F16) +v_add_i32 = functools.partial(VOP3, VOP3Op.V_ADD_I32) +v_sub_i32 = functools.partial(VOP3, VOP3Op.V_SUB_I32) +v_add_i16 = functools.partial(VOP3, VOP3Op.V_ADD_I16) +v_sub_i16 = functools.partial(VOP3, VOP3Op.V_SUB_I16) +v_pack_b32_f16 = functools.partial(VOP3, VOP3Op.V_PACK_B32_F16) +v_mul_legacy_f32 = functools.partial(VOP3, VOP3Op.V_MUL_LEGACY_F32) +v_cvt_pk_fp8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_FP8_F32) +v_cvt_pk_bf8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_BF8_F32) +v_cvt_sr_fp8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SR_FP8_F32) +v_cvt_sr_bf8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SR_BF8_F32) +v_cvt_sr_f16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SR_F16_F32) +v_cvt_sr_bf16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SR_BF16_F32) +v_minimum3_f32 = functools.partial(VOP3, VOP3Op.V_MINIMUM3_F32) +v_maximum3_f32 = functools.partial(VOP3, VOP3Op.V_MAXIMUM3_F32) +v_pk_mad_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MAD_I16) +v_pk_mul_lo_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MUL_LO_U16) +v_pk_add_i16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_I16) +v_pk_sub_i16 = functools.partial(VOP3P, VOP3POp.V_PK_SUB_I16) +v_pk_lshlrev_b16 = functools.partial(VOP3P, VOP3POp.V_PK_LSHLREV_B16) +v_pk_lshrrev_b16 = functools.partial(VOP3P, VOP3POp.V_PK_LSHRREV_B16) +v_pk_ashrrev_i16 = functools.partial(VOP3P, VOP3POp.V_PK_ASHRREV_I16) +v_pk_max_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_I16) +v_pk_min_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_I16) +v_pk_mad_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MAD_U16) +v_pk_add_u16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_U16) +v_pk_sub_u16 = functools.partial(VOP3P, VOP3POp.V_PK_SUB_U16) +v_pk_max_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_U16) +v_pk_min_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_U16) +v_pk_fma_f16 = functools.partial(VOP3P, VOP3POp.V_PK_FMA_F16) +v_pk_add_f16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_F16) +v_pk_mul_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MUL_F16) +v_pk_min_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_F16) +v_pk_max_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_F16) +v_dot2_f32_bf16 = functools.partial(VOP3P, VOP3POp.V_DOT2_F32_BF16) +v_pk_minimum3_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MINIMUM3_F16) +v_pk_maximum3_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MAXIMUM3_F16) +v_mad_mix_f32 = functools.partial(VOP3P, VOP3POp.V_MAD_MIX_F32) +v_mad_mixlo_f16 = functools.partial(VOP3P, VOP3POp.V_MAD_MIXLO_F16) +v_mad_mixhi_f16 = functools.partial(VOP3P, VOP3POp.V_MAD_MIXHI_F16) +v_dot2_f32_f16 = functools.partial(VOP3P, VOP3POp.V_DOT2_F32_F16) +v_dot2_i32_i16 = functools.partial(VOP3P, VOP3POp.V_DOT2_I32_I16) +v_dot2_u32_u16 = functools.partial(VOP3P, VOP3POp.V_DOT2_U32_U16) +v_dot4_i32_i8 = functools.partial(VOP3P, VOP3POp.V_DOT4_I32_I8) +v_dot4_u32_u8 = functools.partial(VOP3P, VOP3POp.V_DOT4_U32_U8) +v_dot8_i32_i4 = functools.partial(VOP3P, VOP3POp.V_DOT8_I32_I4) +v_dot8_u32_u4 = functools.partial(VOP3P, VOP3POp.V_DOT8_U32_U4) +v_mfma_ld_scale_b32 = functools.partial(VOP3P, VOP3POp.V_MFMA_LD_SCALE_B32) +v_mfma_f32_16x16x128_f8f6f4 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X128_F8F6F4) +v_mfma_f32_32x32x64_f8f6f4 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X64_F8F6F4) +v_pk_fma_f32 = functools.partial(VOP3P, VOP3POp.V_PK_FMA_F32) +v_pk_mul_f32 = functools.partial(VOP3P, VOP3POp.V_PK_MUL_F32) +v_pk_add_f32 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_F32) +v_pk_mov_b32 = functools.partial(VOP3P, VOP3POp.V_PK_MOV_B32) +v_mfma_f32_16x16x32_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X32_BF16) +v_mfma_i32_16x16x64_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_I32_16X16X64_I8) +v_mfma_f32_32x32x16_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X16_BF16) +v_mfma_i32_32x32x32_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_I32_32X32X32_I8) +v_smfmac_f32_16x16x64_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X64_BF16) +v_smfmac_i32_16x16x128_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_I32_16X16X128_I8) +v_smfmac_f32_16x16x128_bf8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X128_BF8_BF8) +v_smfmac_f32_16x16x128_bf8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X128_BF8_FP8) +v_smfmac_f32_16x16x128_fp8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X128_FP8_BF8) +v_mfma_f32_16x16x8_xf32 = functools.partial(VOP3P, VOP3POp.V_MFMA_F32_16X16X8_XF32) +v_mfma_f32_32x32x4_xf32 = functools.partial(VOP3P, VOP3POp.V_MFMA_F32_32X32X4_XF32) +v_mfma_f32_32x32x1_2b_f32 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X1_2B_F32) +v_mfma_f32_16x16x1_4b_f32 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X1_4B_F32) +v_mfma_f32_4x4x1_16b_f32 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_4X4X1_16B_F32) +v_smfmac_f32_16x16x128_fp8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X128_FP8_FP8) +v_mfma_f32_32x32x2_f32 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X2_F32) +v_mfma_f32_16x16x4_f32 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X4_F32) +v_smfmac_f32_32x32x32_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X32_BF16) +v_smfmac_i32_32x32x64_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_I32_32X32X64_I8) +v_mfma_f32_32x32x4_2b_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X4_2B_F16) +v_mfma_f32_16x16x4_4b_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X4_4B_F16) +v_mfma_f32_4x4x4_16b_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_4X4X4_16B_F16) +v_smfmac_f32_32x32x64_bf8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X64_BF8_BF8) +v_mfma_f32_32x32x8_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X8_F16) +v_mfma_f32_16x16x16_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X16_F16) +v_smfmac_f32_32x32x64_bf8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X64_BF8_FP8) +v_smfmac_f32_32x32x64_fp8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X64_FP8_BF8) +v_mfma_i32_32x32x4_2b_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_I32_32X32X4_2B_I8) +v_mfma_i32_16x16x4_4b_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_I32_16X16X4_4B_I8) +v_mfma_i32_4x4x4_16b_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_I32_4X4X4_16B_I8) +v_smfmac_f32_32x32x64_fp8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X64_FP8_FP8) +v_mfma_f32_16x16x32_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X32_F16) +v_mfma_f32_32x32x16_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X16_F16) +v_mfma_i32_32x32x16_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_I32_32X32X16_I8) +v_mfma_i32_16x16x32_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_I32_16X16X32_I8) +v_accvgpr_read = functools.partial(VOP3P, VOP3POp.V_ACCVGPR_READ) +v_accvgpr_write = functools.partial(VOP3P, VOP3POp.V_ACCVGPR_WRITE) +v_smfmac_f32_16x16x64_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X64_F16) +v_smfmac_f32_32x32x32_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X32_F16) +v_mfma_f32_32x32x4_2b_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X4_2B_BF16) +v_mfma_f32_16x16x4_4b_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X4_4B_BF16) +v_mfma_f32_4x4x4_16b_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_4X4X4_16B_BF16) +v_mfma_f32_32x32x8_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X8_BF16) +v_mfma_f32_16x16x16_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X16_BF16) +v_smfmac_f32_16x16x32_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X32_F16) +v_smfmac_f32_32x32x16_f16 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X16_F16) +v_smfmac_f32_16x16x32_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X32_BF16) +v_smfmac_f32_32x32x16_bf16 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X16_BF16) +v_smfmac_i32_16x16x64_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_I32_16X16X64_I8) +v_smfmac_i32_32x32x32_i8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_I32_32X32X32_I8) +v_mfma_f64_16x16x4_f64 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F64_16X16X4_F64) +v_mfma_f64_4x4x4_4b_f64 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F64_4X4X4_4B_F64) +v_mfma_f32_16x16x32_bf8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X32_BF8_BF8) +v_mfma_f32_16x16x32_bf8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X32_BF8_FP8) +v_mfma_f32_16x16x32_fp8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X32_FP8_BF8) +v_mfma_f32_16x16x32_fp8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_16X16X32_FP8_FP8) +v_mfma_f32_32x32x16_bf8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X16_BF8_BF8) +v_mfma_f32_32x32x16_bf8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X16_BF8_FP8) +v_mfma_f32_32x32x16_fp8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X16_FP8_BF8) +v_mfma_f32_32x32x16_fp8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_MFMA_F32_32X32X16_FP8_FP8) +v_smfmac_f32_16x16x64_bf8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X64_BF8_BF8) +v_smfmac_f32_16x16x64_bf8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X64_BF8_FP8) +v_smfmac_f32_16x16x64_fp8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X64_FP8_BF8) +v_smfmac_f32_16x16x64_fp8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_16X16X64_FP8_FP8) +v_smfmac_f32_32x32x32_bf8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X32_BF8_BF8) +v_smfmac_f32_32x32x32_bf8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X32_BF8_FP8) +v_smfmac_f32_32x32x32_fp8_bf8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X32_FP8_BF8) +v_smfmac_f32_32x32x32_fp8_fp8 = functools.partial(VOP3P_MFMA, VOP3POp.V_SMFMAC_F32_32X32X32_FP8_FP8) +v_mfma_scale_f32_16x16x128_f8f6f4 = functools.partial(VOP3PX2, VOP3PX2Op.V_MFMA_SCALE_F32_16X16X128_F8F6F4) +v_mfma_scale_f32_32x32x64_f8f6f4 = functools.partial(VOP3PX2, VOP3PX2Op.V_MFMA_SCALE_F32_32X32X64_F8F6F4) +v_add_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_ADD_CO_U32) +v_sub_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUB_CO_U32) +v_subrev_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUBREV_CO_U32) +v_addc_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_ADDC_CO_U32) +v_subb_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUBB_CO_U32) +v_subbrev_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUBBREV_CO_U32) +v_div_scale_f32 = functools.partial(VOP3SD, VOP3SDOp.V_DIV_SCALE_F32) +v_div_scale_f64 = functools.partial(VOP3SD, VOP3SDOp.V_DIV_SCALE_F64) +v_mad_u64_u32 = functools.partial(VOP3SD, VOP3SDOp.V_MAD_U64_U32) +v_mad_i64_i32 = functools.partial(VOP3SD, VOP3SDOp.V_MAD_I64_I32) +v_cmp_class_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F32_E32) +v_cmpx_class_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F32_E32) +v_cmp_class_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F64_E32) +v_cmpx_class_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F64_E32) +v_cmp_class_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F16_E32) +v_cmpx_class_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F16_E32) +v_cmp_f_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_F16_E32) +v_cmp_lt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F16_E32) +v_cmp_eq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F16_E32) +v_cmp_le_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F16_E32) +v_cmp_gt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F16_E32) +v_cmp_lg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F16_E32) +v_cmp_ge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F16_E32) +v_cmp_o_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F16_E32) +v_cmp_u_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F16_E32) +v_cmp_nge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F16_E32) +v_cmp_nlg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F16_E32) +v_cmp_ngt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F16_E32) +v_cmp_nle_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F16_E32) +v_cmp_neq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F16_E32) +v_cmp_nlt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F16_E32) +v_cmp_tru_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_TRU_F16_E32) +v_cmpx_f_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_F16_E32) +v_cmpx_lt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F16_E32) +v_cmpx_eq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F16_E32) +v_cmpx_le_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F16_E32) +v_cmpx_gt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F16_E32) +v_cmpx_lg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F16_E32) +v_cmpx_ge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F16_E32) +v_cmpx_o_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F16_E32) +v_cmpx_u_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F16_E32) +v_cmpx_nge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F16_E32) +v_cmpx_nlg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F16_E32) +v_cmpx_ngt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F16_E32) +v_cmpx_nle_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F16_E32) +v_cmpx_neq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F16_E32) +v_cmpx_nlt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F16_E32) +v_cmpx_tru_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_TRU_F16_E32) +v_cmp_f_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_F32_E32) +v_cmp_lt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F32_E32) +v_cmp_eq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F32_E32) +v_cmp_le_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F32_E32) +v_cmp_gt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F32_E32) +v_cmp_lg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F32_E32) +v_cmp_ge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F32_E32) +v_cmp_o_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F32_E32) +v_cmp_u_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F32_E32) +v_cmp_nge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F32_E32) +v_cmp_nlg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F32_E32) +v_cmp_ngt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F32_E32) +v_cmp_nle_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F32_E32) +v_cmp_neq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F32_E32) +v_cmp_nlt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F32_E32) +v_cmp_tru_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_TRU_F32_E32) +v_cmpx_f_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_F32_E32) +v_cmpx_lt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F32_E32) +v_cmpx_eq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F32_E32) +v_cmpx_le_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F32_E32) +v_cmpx_gt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F32_E32) +v_cmpx_lg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F32_E32) +v_cmpx_ge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F32_E32) +v_cmpx_o_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F32_E32) +v_cmpx_u_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F32_E32) +v_cmpx_nge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F32_E32) +v_cmpx_nlg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F32_E32) +v_cmpx_ngt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F32_E32) +v_cmpx_nle_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F32_E32) +v_cmpx_neq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F32_E32) +v_cmpx_nlt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F32_E32) +v_cmpx_tru_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_TRU_F32_E32) +v_cmp_f_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_F64_E32) +v_cmp_lt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F64_E32) +v_cmp_eq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F64_E32) +v_cmp_le_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F64_E32) +v_cmp_gt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F64_E32) +v_cmp_lg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F64_E32) +v_cmp_ge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F64_E32) +v_cmp_o_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F64_E32) +v_cmp_u_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F64_E32) +v_cmp_nge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F64_E32) +v_cmp_nlg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F64_E32) +v_cmp_ngt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F64_E32) +v_cmp_nle_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F64_E32) +v_cmp_neq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F64_E32) +v_cmp_nlt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F64_E32) +v_cmp_tru_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_TRU_F64_E32) +v_cmpx_f_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_F64_E32) +v_cmpx_lt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F64_E32) +v_cmpx_eq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F64_E32) +v_cmpx_le_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F64_E32) +v_cmpx_gt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F64_E32) +v_cmpx_lg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F64_E32) +v_cmpx_ge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F64_E32) +v_cmpx_o_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F64_E32) +v_cmpx_u_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F64_E32) +v_cmpx_nge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F64_E32) +v_cmpx_nlg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F64_E32) +v_cmpx_ngt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F64_E32) +v_cmpx_nle_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F64_E32) +v_cmpx_neq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F64_E32) +v_cmpx_nlt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F64_E32) +v_cmpx_tru_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_TRU_F64_E32) +v_cmp_f_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_I16_E32) +v_cmp_lt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I16_E32) +v_cmp_eq_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I16_E32) +v_cmp_le_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I16_E32) +v_cmp_gt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I16_E32) +v_cmp_ne_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I16_E32) +v_cmp_ge_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I16_E32) +v_cmp_t_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_I16_E32) +v_cmp_f_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_U16_E32) +v_cmp_lt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U16_E32) +v_cmp_eq_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U16_E32) +v_cmp_le_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U16_E32) +v_cmp_gt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U16_E32) +v_cmp_ne_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U16_E32) +v_cmp_ge_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U16_E32) +v_cmp_t_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_U16_E32) +v_cmpx_f_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_I16_E32) +v_cmpx_lt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I16_E32) +v_cmpx_eq_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I16_E32) +v_cmpx_le_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I16_E32) +v_cmpx_gt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I16_E32) +v_cmpx_ne_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I16_E32) +v_cmpx_ge_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I16_E32) +v_cmpx_t_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_I16_E32) +v_cmpx_f_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_U16_E32) +v_cmpx_lt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U16_E32) +v_cmpx_eq_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U16_E32) +v_cmpx_le_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U16_E32) +v_cmpx_gt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U16_E32) +v_cmpx_ne_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U16_E32) +v_cmpx_ge_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U16_E32) +v_cmpx_t_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_U16_E32) +v_cmp_f_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_I32_E32) +v_cmp_lt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I32_E32) +v_cmp_eq_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I32_E32) +v_cmp_le_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I32_E32) +v_cmp_gt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I32_E32) +v_cmp_ne_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I32_E32) +v_cmp_ge_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I32_E32) +v_cmp_t_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_I32_E32) +v_cmp_f_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_U32_E32) +v_cmp_lt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U32_E32) +v_cmp_eq_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U32_E32) +v_cmp_le_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U32_E32) +v_cmp_gt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U32_E32) +v_cmp_ne_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U32_E32) +v_cmp_ge_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U32_E32) +v_cmp_t_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_U32_E32) +v_cmpx_f_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_I32_E32) +v_cmpx_lt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I32_E32) +v_cmpx_eq_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I32_E32) +v_cmpx_le_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I32_E32) +v_cmpx_gt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I32_E32) +v_cmpx_ne_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I32_E32) +v_cmpx_ge_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I32_E32) +v_cmpx_t_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_I32_E32) +v_cmpx_f_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_U32_E32) +v_cmpx_lt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U32_E32) +v_cmpx_eq_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U32_E32) +v_cmpx_le_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U32_E32) +v_cmpx_gt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U32_E32) +v_cmpx_ne_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U32_E32) +v_cmpx_ge_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U32_E32) +v_cmpx_t_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_U32_E32) +v_cmp_f_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_I64_E32) +v_cmp_lt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I64_E32) +v_cmp_eq_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I64_E32) +v_cmp_le_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I64_E32) +v_cmp_gt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I64_E32) +v_cmp_ne_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I64_E32) +v_cmp_ge_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I64_E32) +v_cmp_t_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_I64_E32) +v_cmp_f_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_U64_E32) +v_cmp_lt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U64_E32) +v_cmp_eq_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U64_E32) +v_cmp_le_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U64_E32) +v_cmp_gt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U64_E32) +v_cmp_ne_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U64_E32) +v_cmp_ge_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U64_E32) +v_cmp_t_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_U64_E32) +v_cmpx_f_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_I64_E32) +v_cmpx_lt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I64_E32) +v_cmpx_eq_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I64_E32) +v_cmpx_le_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I64_E32) +v_cmpx_gt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I64_E32) +v_cmpx_ne_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I64_E32) +v_cmpx_ge_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I64_E32) +v_cmpx_t_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_I64_E32) +v_cmpx_f_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_U64_E32) +v_cmpx_lt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U64_E32) +v_cmpx_eq_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U64_E32) +v_cmpx_le_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U64_E32) +v_cmpx_gt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U64_E32) +v_cmpx_ne_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U64_E32) +v_cmpx_ge_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U64_E32) +v_cmpx_t_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_U64_E32) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/operands.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/operands.py new file mode 100644 index 000000000..c409c13bf --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/operands.py @@ -0,0 +1,1574 @@ +# autogenerated from AMD ISA XML - do not edit +from tinygrad.runtime.autogen.amd.common import Fmt, OpType +from tinygrad.runtime.autogen.amd.cdna.enum import DSOp, FLATOp, GLOBALOp, MTBUFOp, MUBUFOp, SCRATCHOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3PX2Op, VOP3SDOp, VOPCOp + +# instruction operand info: {Op: {field: (Fmt, size_bits, OpType)}} +OPERANDS = { + MUBUFOp.BUFFER_ATOMIC_ADD: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_ADD_F32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_ADD_F64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_ADD_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_AND: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_AND_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_CMPSWAP: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_CMPSWAP_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_DEC: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_DEC_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_INC: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_INC_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_MAX_F64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_MIN_F64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_OR: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_OR_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_PK_ADD_BF16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_PK_ADD_F16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_SMAX: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_SMAX_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_SMIN: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_SMIN_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_SUB: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_SUB_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_SWAP: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_SWAP_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_UMAX: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_UMAX_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_UMIN: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_UMIN_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_XOR: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_ATOMIC_XOR_X2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_DWORD: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_DWORDX2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_DWORDX3: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_DWORDX4: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_D16_HI_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_D16_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_D16_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_D16_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_D16_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_SBYTE: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_SBYTE_D16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_SBYTE_D16_HI: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_SHORT_D16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_SHORT_D16_HI: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_SSHORT: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_UBYTE: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_UBYTE_D16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_UBYTE_D16_HI: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_LOAD_USHORT: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_BYTE: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_BYTE_D16_HI: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_DWORD: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_DWORDX2: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_DWORDX3: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_DWORDX4: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_D16_HI_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_D16_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_D16_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_D16_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_D16_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_SHORT: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MUBUFOp.BUFFER_STORE_SHORT_D16_HI: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_ADD_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_ADD_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_ADD_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_ADD_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_ADD_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_ADD_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_ADD_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_ADD_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_AND_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_AND_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_AND_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_AND_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_APPEND: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_BPERMUTE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CMPST_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CMPST_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CMPST_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CMPST_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CMPST_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CMPST_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CMPST_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CMPST_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CONDXCHG32_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_CONSUME: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_DEC_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_DEC_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_DEC_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_DEC_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_INC_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_INC_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_INC_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_INC_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_RTN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_RTN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MAX_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_RTN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_RTN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MIN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MSKOR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MSKOR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MSKOR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_MSKOR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_OR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_OR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_OR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_OR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_PERMUTE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_PK_ADD_BF16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_PK_ADD_F16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_PK_ADD_RTN_BF16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_PK_ADD_RTN_F16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ2ST64_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ2ST64_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B64, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ2_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ2_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B64, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_ADDTID_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_B128: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_B64_TR_B16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_B64_TR_B4: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_B64_TR_B8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_B96: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B96, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_B96_TR_B6: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B96, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_I16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_I8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_I8_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_I8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_U16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_U16_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_U16_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_U8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_U8_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_READ_U8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_RSUB_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_RSUB_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_RSUB_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_RSUB_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_SUB_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_SUB_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_SUB_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_SUB_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_SWIZZLE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRAP_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE2ST64_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE2ST64_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE2_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE2_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_ADDTID_B32: {"data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_B128: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_B16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_B16_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_B16, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_B8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B8, 8, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_B8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK4_B8, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRITE_B96: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B96, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRXCHG2ST64_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRXCHG2ST64_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_PK2_B64, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRXCHG2_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRXCHG2_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_PK2_B64, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRXCHG_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_WRXCHG_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_XOR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_XOR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_XOR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + DSOp.DS_XOR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_ADD: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_ADD_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_ADD_F64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_ADD_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_AND: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_AND_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_CMPSWAP: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_CMPSWAP_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_DEC: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_DEC_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_INC: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_INC_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_MAX_F64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_MIN_F64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_OR: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_OR_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_PK_ADD_BF16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_PK_ADD_F16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_SMAX: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_SMAX_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_SMIN: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_SMIN_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_SUB: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_SUB_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_SWAP: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_SWAP_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_UMAX: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_UMAX_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_UMIN: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_UMIN_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_XOR: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_ATOMIC_XOR_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_DWORD: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_DWORDX2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_DWORDX3: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_DWORDX4: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_SBYTE: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_SBYTE_D16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_SBYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_SHORT_D16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_SHORT_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_SSHORT: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_UBYTE: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_UBYTE_D16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_UBYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_LOAD_USHORT: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_STORE_BYTE: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_STORE_BYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_STORE_DWORD: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_STORE_DWORDX2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_STORE_DWORDX3: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_STORE_DWORDX4: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_STORE_SHORT: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + FLATOp.FLAT_STORE_SHORT_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_ADD: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_ADD_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_ADD_F64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_ADD_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_AND: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_AND_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_DEC: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_DEC_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_INC: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_INC_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MAX_F64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MIN_F64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_OR: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_OR_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_PK_ADD_BF16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_PK_ADD_F16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SMAX: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SMAX_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SMIN: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SMIN_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SUB: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SUB_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SWAP: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SWAP_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_UMAX: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_UMAX_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_UMIN: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_UMIN_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_XOR: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_ATOMIC_XOR_X2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_DWORD: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_DWORDX2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_DWORDX3: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_DWORDX4: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_LDS_DWORD: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_LDS_DWORDX3: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_LDS_DWORDX4: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_LDS_SBYTE: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_LDS_SSHORT: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_LDS_UBYTE: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_LDS_USHORT: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_SBYTE: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_SBYTE_D16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_SBYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_SHORT_D16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_SHORT_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_SSHORT: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_UBYTE: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_UBYTE_D16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_UBYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_LOAD_USHORT: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + GLOBALOp.GLOBAL_STORE_BYTE: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_BYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_DWORD: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_DWORDX2: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_DWORDX3: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_DWORDX4: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_SHORT: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_SHORT_D16_HI: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_LOAD_DWORD: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_DWORDX2: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_DWORDX3: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_DWORDX4: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_LDS_DWORD: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_LDS_SBYTE: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_LDS_SSHORT: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_LDS_UBYTE: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_LDS_USHORT: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_SBYTE: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_SBYTE_D16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_SBYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_SHORT_D16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_SHORT_D16_HI: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_SSHORT: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_UBYTE: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_UBYTE_D16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_UBYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_LOAD_USHORT: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + SCRATCHOp.SCRATCH_STORE_BYTE: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_BYTE_D16_HI: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_DWORD: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_DWORDX2: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_DWORDX3: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_DWORDX4: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_SHORT: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_SHORT_D16_HI: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SOP2Op.S_ABSDIFF_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_ABS_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADDC_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPKOp.S_ADDK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_ADD_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_ANDN1_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_ANDN1_WREXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_ANDN2_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ANDN2_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_ANDN2_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_ANDN2_WREXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_AND_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_AND_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_ASHR_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ASHR_I64: {"sdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SMEMOp.S_ATC_PROBE: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B8, 8, OpType.OPR_SIMM8), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATC_PROBE_BUFFER: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B8, 8, OpType.OPR_SIMM8), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_ADD: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_ADD_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_AND: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_AND_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_CMPSWAP: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_CMPSWAP_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_DEC: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_DEC_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_INC: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_INC_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_OR: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_OR_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_SMAX: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_SMAX_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_SMIN: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_SMIN_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_SUB: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_SUB_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_SWAP: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_SWAP_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_UMAX: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_UMAX_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_UMIN: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_UMIN_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_XOR: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATOMIC_XOR_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOP1Op.S_BCNT0_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT0_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT1_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT1_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_I64: {"sdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_U64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFM_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFM_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP0_B32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP0_B64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP1_B32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP1_B64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITREPLICATE_B64_B32: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET0_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET0_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET1_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET1_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_BRANCH: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOP1Op.S_BREV_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BREV_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SMEMOp.S_BUFFER_ATOMIC_ADD: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_ADD_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_AND: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_AND_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_CMPSWAP: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_CMPSWAP_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_DEC: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_DEC_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_INC: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_INC_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_OR: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_OR_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_SMAX: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_SMAX_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_SMIN: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_SMIN_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_SUB: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_SUB_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_SWAP: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_SWAP_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_UMAX: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_UMAX_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_UMIN: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_UMIN_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_XOR: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_ATOMIC_XOR_X2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_DWORD: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_DWORDX16: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 512, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_DWORDX2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_DWORDX4: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_DWORDX8: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 256, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_STORE_DWORD: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_STORE_DWORDX2: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_STORE_DWORDX4: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOPKOp.S_CALL_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_CDBGSYS: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_CDBGSYS_AND_USER: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_CDBGSYS_OR_USER: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_CDBGUSER: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_EXECNZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_EXECZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOP2Op.S_CBRANCH_G_FORK: {"ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC_NOLIT), "ssrc1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC_NOLIT)}, + SOPKOp.S_CBRANCH_I_FORK: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOP1Op.S_CBRANCH_JOIN: {"ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + SOPPOp.S_CBRANCH_SCC0: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_SCC1: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_VCCNZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_VCCZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPKOp.S_CMOVK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_CMOV_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CMOV_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOPKOp.S_CMPK_EQ_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_EQ_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_GE_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_GE_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_GT_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_GT_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LE_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LE_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LG_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LG_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LT_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LT_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPCOp.S_CMP_EQ_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_U64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_U64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_CSELECT_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_CSELECT_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SMEMOp.S_DCACHE_DISCARD: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_DCACHE_DISCARD_X2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOPPOp.S_DECPERFLEVEL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_FF0_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_FF0_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_FF1_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_FF1_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_FLBIT_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_FLBIT_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_FLBIT_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_FLBIT_I32_I64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_GETPC_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + SOPKOp.S_GETREG_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOPPOp.S_INCPERFLEVEL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SMEMOp.S_LOAD_DWORD: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_DWORDX16: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 512, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_DWORDX2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_DWORDX4: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_DWORDX8: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 256, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOP2Op.S_LSHL1_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL2_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL3_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL4_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SMEMOp.S_MEMREALTIME: {"sdata": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SMEMOp.S_MEMTIME: {"sdata": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOP2Op.S_MIN_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPKOp.S_MOVK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_MOVRELD_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_MOVRELD_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_MOVRELS_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + SOP1Op.S_MOVRELS_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOP1Op.S_MOV_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_MOV_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOPKOp.S_MULK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_MUL_HI_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_HI_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_NAND_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_NAND_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NAND_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPPOp.S_NOP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_NOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_NOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NOT_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_NOT_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_ORN1_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_ORN2_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ORN2_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_ORN2_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_OR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_OR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_OR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_HH_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_LH_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_LL_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_QUADMASK_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_QUADMASK_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_RFE_B64: {"ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOP2Op.S_RFE_RESTORE_B64: {"ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SMEMOp.S_SCRATCH_LOAD_DWORD: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_SCRATCH_LOAD_DWORDX2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_SCRATCH_LOAD_DWORDX4: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_SCRATCH_STORE_DWORD: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_SCRATCH_STORE_DWORDX2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_SCRATCH_STORE_DWORDX4: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOPPOp.S_SENDMSG: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SENDMSG)}, + SOPPOp.S_SENDMSGHALT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SENDMSG)}, + SOPPOp.S_SETHALT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_SETKILL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_SETPC_B64: {"ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOPPOp.S_SETPRIO: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_SETREG_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOPKOp.S_SETREG_IMM32_B32: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOPCOp.S_SETVSKIP: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_SET_GPR_IDX_IDX: {"ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_SET_GPR_IDX_MODE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPCOp.S_SET_GPR_IDX_ON: {"ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM4)}, + SOPPOp.S_SET_VALU_COEXEC_MODE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_SEXT_I32_I16: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_SEXT_I32_I8: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I8, 8, OpType.OPR_SSRC)}, + SOPPOp.S_SLEEP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SMEMOp.S_STORE_DWORD: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_STORE_DWORDX2: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_STORE_DWORDX4: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOP2Op.S_SUBB_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_SWAPPC_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOPPOp.S_TRAP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAITCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_WAITCNT)}, + SOP1Op.S_WQM_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_WQM_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_XNOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_XNOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_XNOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_XOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_XOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_XOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_D16_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_D16_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_D16_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_D16_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_D16_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR_OR_ACCVGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SSRC_NOLIT), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP1Op.V_ACCVGPR_MOV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_ACCVGPR)}, + VOP3Op.V_ACCVGPR_MOV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_ACCVGPR)}, + VOP3POp.V_ACCVGPR_READ: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_ACCVGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_ACCVGPR_WRITE: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_ACCVGPR)}, + VOP3Op.V_ADD3_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADDC_CO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_ADDC_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_CO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_ADD_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_LSHL_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ALIGNBIT_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U8, 8, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ALIGNBYTE_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U8, 8, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_AND_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_AND_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_AND_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ASHRREV_I16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ASHRREV_I32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_ASHR_PK_I8_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ASHR_PK_U8_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_BCNT_U32_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFI_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFM_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_BFREV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFREV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BITOP3_B16: {"src0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_BITOP3_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_F_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_TRU_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_TRU_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_TRU_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_TRU_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_TRU_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_TRU_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_T_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_T_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_T_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_T_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_T_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_T_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + VOPCOp.V_CMPX_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_TRU_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_TRU_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_TRU_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_TRU_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_TRU_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_TRU_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_CNDMASK_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CNDMASK_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_COS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_COS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_COS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_COS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBEID_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBEMA_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBESC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBETC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_BF16: {"src0": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_BF16: {"src0": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_BF8: {"src0": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_BF8: {"src0": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_FP8: {"src0": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_FP8: {"src0": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE0: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE0: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE1: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE1: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE2: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE2: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE3: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE3: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_FLR_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_FLR_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_NORM_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_NORM_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_NORM_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_NORM_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_OFF_F32_I4: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_OFF_F32_I4: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PKACCUM_U8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PKNORM_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PKNORM_I16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PKNORM_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PKNORM_U16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PKRTZ_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_BF16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_BF8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_PK_F32_BF8: {"src0": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_F32_BF8: {"src0": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_PK_F32_FP8: {"src0": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_F32_FP8: {"src0": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_FP8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_I16_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_U16_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_U8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_RPI_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_RPI_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_2XPK16_BF6_F32: {"src0": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_2XPK16_FP6_F32: {"src0": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_F16_BF8: {"src0": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_F16_FP8: {"src0": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_F32_BF8: {"src0": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_F32_FP8: {"src0": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_BF16_BF6: {"src0": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_BF16, 512, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_BF16_FP6: {"src0": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_BF16, 512, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_BF6_BF16: {"src0": (Fmt.FMT_NUM_PK32_BF16, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_BF6_F16: {"src0": (Fmt.FMT_NUM_PK32_F16, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_F16_BF6: {"src0": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_F16, 512, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_F16_FP6: {"src0": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_F16, 512, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_F32_BF6: {"src0": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_F32_FP6: {"src0": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_FP6_BF16: {"src0": (Fmt.FMT_NUM_PK32_BF16, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK32_FP6_F16: {"src0": (Fmt.FMT_NUM_PK32_F16, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_BF16_BF8: {"src0": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_BF16_FP4: {"src0": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_BF16_FP8: {"src0": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_BF8_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_BF8_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_BF8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_F16_BF8: {"src0": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_F16_FP4: {"src0": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_F16_FP8: {"src0": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_F32_BF8: {"src0": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_F32_FP4: {"src0": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_F32_FP8: {"src0": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_FP4_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_FP4_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_FP4_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_FP8_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_FP8_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_PK_FP8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_BF8_BF16: {"src0": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_BF8_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_BF8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_FP8_BF16: {"src0": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_FP8_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_FP8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_BF16: {"src0": (Fmt.FMT_NUM_PK32_BF16, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_F16: {"src0": (Fmt.FMT_NUM_PK32_F16, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_F32: {"src0": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_BF6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_BF16: {"src0": (Fmt.FMT_NUM_PK32_BF16, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_F16: {"src0": (Fmt.FMT_NUM_PK32_F16, 512, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_F32: {"src0": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK32_FP6, 192, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_F32: {"src0": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_FP4, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SR_BF16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SR_BF8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SR_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SR_FP8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_LEGACY_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FMAS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FMAS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3SDOp.V_DIV_SCALE_F32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SDST), "src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_DIV_SCALE_F64: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SDST), "src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_DOT2C_F32_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DOT2C_F32_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_DOT2C_F32_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DOT2C_F32_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_DOT2C_I32_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DOT2C_I32_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT2_F32_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT2_F32_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT2_I32_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT2_U32_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_DOT4C_I32_I8: {"src0": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DOT4C_I32_I8: {"src0": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_I32_I8: {"src0": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_U32_U8: {"src0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_DOT8C_I32_I4: {"src0": (Fmt.FMT_NUM_PK8_I4, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK8_I4, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DOT8C_I32_I4: {"src0": (Fmt.FMT_NUM_PK8_I4, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK8_I4, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT8_I32_I4: {"src0": (Fmt.FMT_NUM_PK8_I4, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK8_I4, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT8_U32_U4: {"src0": (Fmt.FMT_NUM_PK8_U4, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK8_U4, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_EXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_EXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_EXP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_EXP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_EXP_LEGACY_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_EXP_LEGACY_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FFBH_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FFBH_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FFBH_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FFBH_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FFBL_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FFBL_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_FMAAK_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_FMAC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMAC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_FMAC_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FMAC_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_FMAMK_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_LEGACY_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_LDEXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_LERP_U8: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_LOG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LOG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_LOG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LOG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_LOG_LEGACY_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LOG_LEGACY_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_LSHLREV_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_LSHLREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_LSHL_ADD_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHL_ADD_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_LSHL_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_LSHRREV_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_LSHRREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_MAC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MADAK_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MADMK_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I32_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I32_I24: {"src0": (Fmt.FMT_NUM_I24, 24, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I24, 24, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_MAD_I64_I32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_LEGACY_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_LEGACY_I16: {"src0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_LEGACY_U16: {"src0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP3POp.V_MAD_MIXHI_F16: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3POp.V_MAD_MIXLO_F16: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3POp.V_MAD_MIX_F32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U32_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U32_U24: {"src0": (Fmt.FMT_NUM_U24, 24, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U24, 24, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_MAD_U64_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXIMUM3_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MBCNT_HI_U32_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MBCNT_LO_U32_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_MFMA_F32_16X16X128_F8F6F4: {"src0": (Fmt.FMT_NUM_PK8_B32, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_B32, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X16_BF16: {"src0": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X16_F16: {"src0": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X1_4B_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X32_BF16: {"src0": (Fmt.FMT_NUM_PK8_BF16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_BF16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X32_BF8_BF8: {"src0": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X32_BF8_FP8: {"src0": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X32_F16: {"src0": (Fmt.FMT_NUM_PK8_F16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_F16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X32_FP8_BF8: {"src0": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X32_FP8_FP8: {"src0": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X4_4B_BF16: {"src0": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X4_4B_F16: {"src0": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_16X16X4_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X16_BF16: {"src0": (Fmt.FMT_NUM_PK8_BF16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_BF16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X16_BF8_BF8: {"src0": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X16_BF8_FP8: {"src0": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X16_F16: {"src0": (Fmt.FMT_NUM_PK8_F16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_F16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X16_FP8_BF8: {"src0": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X16_FP8_FP8: {"src0": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X1_2B_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X2_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X4_2B_BF16: {"src0": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X4_2B_F16: {"src0": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK32_F32, 1024, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X64_F8F6F4: {"src0": (Fmt.FMT_NUM_PK8_B32, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_B32, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X8_BF16: {"src0": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_32X32X8_F16: {"src0": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_4X4X1_16B_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_4X4X4_16B_BF16: {"src0": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F32_4X4X4_16B_F16: {"src0": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F64_16X16X4_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F64, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F64, 256, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_F64_4X4X4_4B_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_I32_16X16X32_I8: {"src0": (Fmt.FMT_NUM_PK8_I8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_I8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_I32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_I32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_I32_16X16X4_4B_I8: {"src0": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_I32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_I32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_I32_16X16X64_I8: {"src0": (Fmt.FMT_NUM_PK16_I8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_I8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_I32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_I32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_I32_32X32X16_I8: {"src0": (Fmt.FMT_NUM_PK8_I8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_I8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_I32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_I32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_I32_32X32X32_I8: {"src0": (Fmt.FMT_NUM_PK16_I8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_I8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_I32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_I32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_I32_32X32X4_2B_I8: {"src0": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK32_I32, 1024, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK32_I32, 1024, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_MFMA_I32_4X4X4_16B_I8: {"src0": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK4_I8, 32, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_I32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_I32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3PX2Op.V_MFMA_SCALE_F32_16X16X128_F8F6F4: {"scale_src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "scale_src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src0": (Fmt.FMT_NUM_PK8_B32, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_B32, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3PX2Op.V_MFMA_SCALE_F32_32X32X64_F8F6F4: {"scale_src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "scale_src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src0": (Fmt.FMT_NUM_PK8_B32, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_B32, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3Op.V_MIN3_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINIMUM3_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_MOV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_MOV_B64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MOV_B64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MQSAD_PK_U16_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MQSAD_U32_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B128, 128, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + VOP3Op.V_MSAD_U8: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_HI_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_HI_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_LEGACY_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_LO_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_LO_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_LO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_NOT_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_NOT_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_OR3_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PACK_B32_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_PERMLANE16_SWAP_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERMLANE16_SWAP_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_PERMLANE32_SWAP_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERMLANE32_SWAP_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERM_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK4_B8, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_F32: {"src0": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ASHRREV_I16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP2Op.V_PK_FMAC_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PK_FMAC_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_FMA_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_FMA_F32: {"src0": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3POp.V_PK_LSHLREV_B16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_LSHRREV_B16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAD_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAD_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAXIMUM3_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MINIMUM3_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MOV_B32: {"src0": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MUL_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MUL_F32: {"src0": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MUL_LO_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_SUB_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_SUB_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP1Op.V_PRNG_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PRNG_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_QSAD_PK_U16_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_IFLAG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_IFLAG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_READFIRSTLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_LDS), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG_NOVCC)}, + VOP3Op.V_READFIRSTLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_LDS), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG_NOVCC)}, + VOP3Op.V_READLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR_OR_LDS), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_LANESEL), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG_NOVCC)}, + VOP1Op.V_RNDNE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RNDNE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RNDNE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_HI_U8: {"src0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U8: {"src0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SAT_PK_U8_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SAT_PK_U8_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_PK2_U8, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SCREEN_PARTITION_4SE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SCREEN_PARTITION_4SE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X128_BF8_BF8: {"src0": (Fmt.FMT_NUM_PK16_BF8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_BF8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X128_BF8_FP8: {"src0": (Fmt.FMT_NUM_PK16_BF8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_FP8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X128_FP8_BF8: {"src0": (Fmt.FMT_NUM_PK16_FP8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_BF8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X128_FP8_FP8: {"src0": (Fmt.FMT_NUM_PK16_FP8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_FP8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X32_BF16: {"src0": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_BF16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X32_F16: {"src0": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_F16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X64_BF16: {"src0": (Fmt.FMT_NUM_PK8_BF16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_BF16, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X64_BF8_BF8: {"src0": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_BF8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X64_BF8_FP8: {"src0": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_FP8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X64_F16: {"src0": (Fmt.FMT_NUM_PK8_F16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_F16, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X64_FP8_BF8: {"src0": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_BF8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_16X16X64_FP8_FP8: {"src0": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_FP8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_F32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X16_BF16: {"src0": (Fmt.FMT_NUM_PK4_BF16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_BF16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X16_F16: {"src0": (Fmt.FMT_NUM_PK4_F16, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK8_F16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X32_BF16: {"src0": (Fmt.FMT_NUM_PK8_BF16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_BF16, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X32_BF8_BF8: {"src0": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_BF8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X32_BF8_FP8: {"src0": (Fmt.FMT_NUM_PK8_BF8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_FP8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X32_F16: {"src0": (Fmt.FMT_NUM_PK8_F16, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_F16, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X32_FP8_BF8: {"src0": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_BF8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X32_FP8_FP8: {"src0": (Fmt.FMT_NUM_PK8_FP8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_FP8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X64_BF8_BF8: {"src0": (Fmt.FMT_NUM_PK16_BF8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_BF8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X64_BF8_FP8: {"src0": (Fmt.FMT_NUM_PK16_BF8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_FP8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X64_FP8_BF8: {"src0": (Fmt.FMT_NUM_PK16_FP8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_BF8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_F32_32X32X64_FP8_FP8: {"src0": (Fmt.FMT_NUM_PK16_FP8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_FP8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_F32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_I32_16X16X128_I8: {"src0": (Fmt.FMT_NUM_PK16_I8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_I8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_I32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_I32_16X16X64_I8: {"src0": (Fmt.FMT_NUM_PK8_I8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_I8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK4_I32, 128, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_I32_32X32X32_I8: {"src0": (Fmt.FMT_NUM_PK8_I8, 64, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK16_I8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_I32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP3POp.V_SMFMAC_I32_32X32X64_I8: {"src0": (Fmt.FMT_NUM_PK16_I8, 128, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src1": (Fmt.FMT_NUM_PK32_I8, 256, OpType.OPR_SRC_VGPR_OR_ACCVGPR), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_PK16_I32, 512, OpType.OPR_VGPR_OR_ACCVGPR)}, + VOP1Op.V_SQRT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SQRT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SQRT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_SUBBREV_CO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUBBREV_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUBB_CO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUBB_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_CO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUBREV_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLDS), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_CO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUB_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SWAP_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SWAP_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_TRIG_PREOP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC_NOLIT), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_WRITELANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_NOLIT), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_LANESEL), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XAD_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_XNOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XNOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_XOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_NOLIT), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC_SIMPLE), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/str_pcode.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/str_pcode.py new file mode 100644 index 000000000..a47a8dbea --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/cdna/str_pcode.py @@ -0,0 +1,1447 @@ +# autogenerated from AMD ISA PDF - do not edit +# ruff: noqa: E501 +from tinygrad.runtime.autogen.amd.cdna.enum import DSOp, FLATOp, GLOBALOp, MTBUFOp, MUBUFOp, SCRATCHOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3SDOp, VOPCOp + +PCODE = { + DSOp.DS_ADD_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_SUB_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_RSUB_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 = DATA.u32 - MEM[addr].u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_INC_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_DEC_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MIN_I32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MAX_I32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MIN_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MAX_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_AND_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_OR_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_XOR_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_MSKOR_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = ((tmp & ~DATA.b32) | DATA2.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_WRITE_B32: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0]', + DSOp.DS_WRITE2_B32: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET0.u32 * 4U].b32 = DATA[31 : 0];\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET1.u32 * 4U].b32 = DATA2[31 : 0]', + DSOp.DS_WRITE2ST64_B32: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET0.u32 * 256U].b32 = DATA[31 : 0];\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET1.u32 * 256U].b32 = DATA2[31 : 0]', + DSOp.DS_CMPST_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nsrc = DATA2.b32;\ncmp = DATA.b32;\nMEM[addr].b32 = tmp == cmp ? src : tmp;\nRETURN_DATA.b32 = tmp', + DSOp.DS_CMPST_F32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA2.f32;\ncmp = DATA.f32;\nMEM[addr].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_MIN_F32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA.f32;\nMEM[addr].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_MAX_F32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA.f32;\nMEM[addr].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_ADD_F32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + DSOp.DS_PK_ADD_F16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].f16 = tmp[31 : 16].f16 + src[31 : 16].f16;\ndst[15 : 0].f16 = tmp[15 : 0].f16 + src[15 : 0].f16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + DSOp.DS_PK_ADD_BF16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + DSOp.DS_WRITE_ADDTID_B32: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\nMEM[32'I({ OFFSET1, OFFSET0 } + M0[15 : 0]) + laneID.i32 * 4].u32 = DATA0.u32", + DSOp.DS_WRITE_B8: 'MEM[ADDR].b8 = DATA[7 : 0]', + DSOp.DS_WRITE_B16: 'MEM[ADDR].b16 = DATA[15 : 0]', + DSOp.DS_ADD_RTN_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_SUB_RTN_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_RSUB_RTN_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 = DATA.u32 - MEM[addr].u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_INC_RTN_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_DEC_RTN_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MIN_RTN_I32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MAX_RTN_I32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MIN_RTN_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MAX_RTN_U32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_AND_RTN_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_OR_RTN_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_XOR_RTN_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_MSKOR_RTN_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = ((tmp & ~DATA.b32) | DATA2.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_WRXCHG_RTN_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + DSOp.DS_WRXCHG2_RTN_B32: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 4U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 4U;\ntmp1 = MEM[addr1].b32;\ntmp2 = MEM[addr2].b32;\nMEM[addr1].b32 = DATA.b32;\nMEM[addr2].b32 = DATA2.b32;\n// Note DATA2 can be any other register\nRETURN_DATA[31 : 0] = tmp1;\nRETURN_DATA[63 : 32] = tmp2', + DSOp.DS_WRXCHG2ST64_RTN_B32: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 256U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 256U;\ntmp1 = MEM[addr1].b32;\ntmp2 = MEM[addr2].b32;\nMEM[addr1].b32 = DATA.b32;\nMEM[addr2].b32 = DATA2.b32;\n// Note DATA2 can be any other register\nRETURN_DATA[31 : 0] = tmp1;\nRETURN_DATA[63 : 32] = tmp2', + DSOp.DS_CMPST_RTN_B32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b32;\nsrc = DATA2.b32;\ncmp = DATA.b32;\nMEM[addr].b32 = tmp == cmp ? src : tmp;\nRETURN_DATA.b32 = tmp', + DSOp.DS_CMPST_RTN_F32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA2.f32;\ncmp = DATA.f32;\nMEM[addr].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_MIN_RTN_F32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA.f32;\nMEM[addr].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_MAX_RTN_F32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nsrc = DATA.f32;\nMEM[addr].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_WRAP_RTN_B32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 = tmp >= DATA.u32 ? tmp - DATA.u32 : tmp + DATA2.u32;\nRETURN_DATA = tmp', + DSOp.DS_ADD_RTN_F32: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + DSOp.DS_READ_B32: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32', + DSOp.DS_READ2_B32: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 4U].b32;\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET1.u32 * 4U].b32', + DSOp.DS_READ2ST64_B32: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 256U].b32;\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET1.u32 * 256U].b32', + DSOp.DS_READ_I8: "RETURN_DATA.i32 = 32'I(signext(MEM[ADDR].i8))", + DSOp.DS_READ_U8: "RETURN_DATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + DSOp.DS_READ_I16: "RETURN_DATA.i32 = 32'I(signext(MEM[ADDR].i16))", + DSOp.DS_READ_U16: "RETURN_DATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + DSOp.DS_SWIZZLE_B32: 'Offset[4:0]: Swizzle\n0x00: {1,11,9,19,5,15,d,1d,3,13,b,1b,7,17,f,1f,2,12,a,1a,6,16,e,1e,4,14,c,1c,8,18,10,20}\n0x10: {1,9,5,d,3,b,7,f,2,a,6,e,4,c,8,10,11,19,15,1d,13,1b,17,1f,12,1a,16,1e,14,1c,18,20}\n0x1f: No swizzle', + DSOp.DS_PERMUTE_B32: "// VGPR[laneId][index] is the VGPR RAM\n// VDST, ADDR and DATA0 are from the microcode DS encoding\ndeclare tmp : 32'B[64];\ndeclare OFFSET : 16'U;\ndeclare DATA0 : 32'U;\ndeclare VDST : 32'U;\nfor i in 0 : 63 do\ntmp[i] = 0x0\nendfor;\nfor i in 0 : 63 do\n// If a source thread is disabled, it does not propagate data.\nif EXEC[i].u1 then\n// ADDR needs to be divided by 4.\n// High-order bits are ignored.\ndst_lane = (VGPR[i][ADDR].u32 + OFFSET.u32) / 4U % 64U;\ntmp[dst_lane] = VGPR[i][DATA0]\nendif\nendfor;\n// Copy data into destination VGPRs. If multiple sources\n// select the same destination thread, the highest-numbered\n// source thread wins.\nfor i in 0 : 63 do\nif EXEC[i].u1 then\nVGPR[i][VDST] = tmp[i]\nendif\nendfor", + DSOp.DS_BPERMUTE_B32: "// VGPR[laneId][index] is the VGPR RAM\n// VDST, ADDR and DATA0 are from the microcode DS encoding\ndeclare tmp : 32'B[64];\ndeclare OFFSET : 16'U;\ndeclare DATA0 : 32'U;\ndeclare VDST : 32'U;\nfor i in 0 : 63 do\ntmp[i] = 0x0\nendfor;\nfor i in 0 : 63 do\n// ADDR needs to be divided by 4.\n// High-order bits are ignored.\nsrc_lane = (VGPR[i][ADDR].u32 + OFFSET.u32) / 4U % 64U;\n// EXEC is applied to the source VGPR reads.\nif EXEC[src_lane].u1 then\ntmp[i] = VGPR[src_lane][DATA0]\nendif\nendfor;\n// Copy data into destination VGPRs. Some source\n// data may be broadcast to multiple lanes.\nfor i in 0 : 63 do\nif EXEC[i].u1 then\nVGPR[i][VDST] = tmp[i]\nendif\nendfor", + DSOp.DS_ADD_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_SUB_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_RSUB_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 = DATA.u64 - MEM[addr].u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_INC_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_DEC_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MIN_I64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MAX_I64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MIN_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MAX_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_AND_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_OR_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_XOR_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_MSKOR_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = ((tmp & ~DATA.b64) | DATA2.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_WRITE_B64: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32]', + DSOp.DS_WRITE2_B64: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET0.u32 * 8U].b32 = DATA[31 : 0];\nMEM[addr + OFFSET0.u32 * 8U + 4U].b32 = DATA[63 : 32];\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET1.u32 * 8U].b32 = DATA2[31 : 0];\nMEM[addr + OFFSET1.u32 * 8U + 4U].b32 = DATA2[63 : 32]', + DSOp.DS_WRITE2ST64_B64: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET0.u32 * 512U].b32 = DATA[31 : 0];\nMEM[addr + OFFSET0.u32 * 512U + 4U].b32 = DATA[63 : 32];\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET1.u32 * 512U].b32 = DATA2[31 : 0];\nMEM[addr + OFFSET1.u32 * 512U + 4U].b32 = DATA2[63 : 32]', + DSOp.DS_CMPST_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nsrc = DATA2.b64;\ncmp = DATA.b64;\nMEM[addr].b64 = tmp == cmp ? src : tmp;\nRETURN_DATA.b64 = tmp', + DSOp.DS_CMPST_F64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA2.f64;\ncmp = DATA.f64;\nMEM[addr].f64 = tmp == cmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MIN_F64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MAX_F64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_WRITE_B8_D16_HI: 'MEM[ADDR].b8 = DATA[23 : 16]', + DSOp.DS_WRITE_B16_D16_HI: 'MEM[ADDR].b16 = DATA[31 : 16]', + DSOp.DS_READ_U8_D16: "RETURN_DATA[15 : 0].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// RETURN_DATA[31:16] is preserved.", + DSOp.DS_READ_U8_D16_HI: "RETURN_DATA[31 : 16].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// RETURN_DATA[15:0] is preserved.", + DSOp.DS_READ_I8_D16: "RETURN_DATA[15 : 0].i16 = 16'I(signext(MEM[ADDR].i8));\n// RETURN_DATA[31:16] is preserved.", + DSOp.DS_READ_I8_D16_HI: "RETURN_DATA[31 : 16].i16 = 16'I(signext(MEM[ADDR].i8));\n// RETURN_DATA[15:0] is preserved.", + DSOp.DS_READ_U16_D16: 'RETURN_DATA[15 : 0].u16 = MEM[ADDR].u16;\n// RETURN_DATA[31:16] is preserved.', + DSOp.DS_READ_U16_D16_HI: 'RETURN_DATA[31 : 16].u16 = MEM[ADDR].u16;\n// RETURN_DATA[15:0] is preserved.', + DSOp.DS_ADD_F64: 'tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp', + DSOp.DS_ADD_RTN_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_SUB_RTN_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_RSUB_RTN_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 = DATA.u64 - MEM[addr].u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_INC_RTN_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_DEC_RTN_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MIN_RTN_I64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MAX_RTN_I64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MIN_RTN_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MAX_RTN_U64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_AND_RTN_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_OR_RTN_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_XOR_RTN_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_MSKOR_RTN_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = ((tmp & ~DATA.b64) | DATA2.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_WRXCHG_RTN_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + DSOp.DS_WRXCHG2_RTN_B64: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 8U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 8U;\ntmp1 = MEM[addr1].b64;\ntmp2 = MEM[addr2].b64;\nMEM[addr1].b64 = DATA.b64;\nMEM[addr2].b64 = DATA2.b64;\n// Note DATA2 can be any other register\nRETURN_DATA[63 : 0] = tmp1;\nRETURN_DATA[127 : 64] = tmp2', + DSOp.DS_WRXCHG2ST64_RTN_B64: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 512U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 512U;\ntmp1 = MEM[addr1].b64;\ntmp2 = MEM[addr2].b64;\nMEM[addr1].b64 = DATA.b64;\nMEM[addr2].b64 = DATA2.b64;\n// Note DATA2 can be any other register\nRETURN_DATA[63 : 0] = tmp1;\nRETURN_DATA[127 : 64] = tmp2', + DSOp.DS_CMPST_RTN_B64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].b64;\nsrc = DATA2.b64;\ncmp = DATA.b64;\nMEM[addr].b64 = tmp == cmp ? src : tmp;\nRETURN_DATA.b64 = tmp', + DSOp.DS_CMPST_RTN_F64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA2.f64;\ncmp = DATA.f64;\nMEM[addr].f64 = tmp == cmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MIN_RTN_F64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MAX_RTN_F64: 'addr = CalcDsAddr(ADDR.b32, OFFSET0.b32, OFFSET1.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_READ_B64: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32', + DSOp.DS_READ2_B64: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 8U].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET0.u32 * 8U + 4U].b32;\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET1.u32 * 8U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET1.u32 * 8U + 4U].b32', + DSOp.DS_READ2ST64_B64: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 512U].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET0.u32 * 512U + 4U].b32;\naddr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET1.u32 * 512U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET1.u32 * 512U + 4U].b32', + DSOp.DS_ADD_RTN_F64: 'tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp', + DSOp.DS_CONDXCHG32_RTN_B64: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\ndeclare RETURN_DATA : 32'U[2];\nADDR = S0.u32;\nDATA = S1.u64;\noffset = { OFFSET1, OFFSET0 };\nADDR0 = ((ADDR + offset.u32) & 0xfff8U);\nADDR1 = ADDR0 + 4U;\nRETURN_DATA[0] = LDS[ADDR0].u32;\nif DATA[31] then\nLDS[ADDR0] = { 1'0, DATA[30 : 0] }\nendif;\nRETURN_DATA[1] = LDS[ADDR1].u32;\nif DATA[63] then\nLDS[ADDR1] = { 1'0, DATA[62 : 32] }\nendif", + DSOp.DS_READ_ADDTID_B32: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\nRETURN_DATA.u32 = MEM[32'I({ OFFSET1, OFFSET0 } + M0[15 : 0]) + laneID.i32 * 4].u32", + DSOp.DS_PK_ADD_RTN_F16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].f16 = tmp[31 : 16].f16 + src[31 : 16].f16;\ndst[15 : 0].f16 = tmp[15 : 0].f16 + src[15 : 0].f16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + DSOp.DS_PK_ADD_RTN_BF16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + DSOp.DS_WRITE_B96: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32];\nMEM[addr + OFFSET.u32 + 8U].b32 = DATA[95 : 64]', + DSOp.DS_WRITE_B128: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32];\nMEM[addr + OFFSET.u32 + 8U].b32 = DATA[95 : 64];\nMEM[addr + OFFSET.u32 + 12U].b32 = DATA[127 : 96]', + DSOp.DS_READ_B96: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET.u32 + 8U].b32', + DSOp.DS_READ_B128: 'addr = CalcDsAddr(ADDR.b32, 0x0, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET.u32 + 8U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET.u32 + 12U].b32', + FLATOp.FLAT_LOAD_UBYTE: "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 24'0U, MEM[addr].u8 })", + FLATOp.FLAT_LOAD_SBYTE: "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i8))", + FLATOp.FLAT_LOAD_USHORT: "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", + FLATOp.FLAT_LOAD_SSHORT: "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", + FLATOp.FLAT_LOAD_DWORD: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32', + FLATOp.FLAT_LOAD_DWORDX2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32', + FLATOp.FLAT_LOAD_DWORDX3: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32', + FLATOp.FLAT_LOAD_DWORDX4: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32', + FLATOp.FLAT_STORE_BYTE: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[7 : 0]', + FLATOp.FLAT_STORE_BYTE_D16_HI: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[23 : 16]', + FLATOp.FLAT_STORE_SHORT: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[15 : 0]', + FLATOp.FLAT_STORE_SHORT_D16_HI: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[31 : 16]', + FLATOp.FLAT_STORE_DWORD: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0]', + FLATOp.FLAT_STORE_DWORDX2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]', + FLATOp.FLAT_STORE_DWORDX3: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]', + FLATOp.FLAT_STORE_DWORDX4: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]', + FLATOp.FLAT_LOAD_UBYTE_D16: "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", + FLATOp.FLAT_LOAD_UBYTE_D16_HI: "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", + FLATOp.FLAT_LOAD_SBYTE_D16: "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", + FLATOp.FLAT_LOAD_SBYTE_D16_HI: "addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", + FLATOp.FLAT_LOAD_SHORT_D16: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.', + FLATOp.FLAT_LOAD_SHORT_D16_HI: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.', + FLATOp.FLAT_ATOMIC_SWAP: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + FLATOp.FLAT_ATOMIC_CMPSWAP: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_ADD: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_SUB: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_SMIN: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + FLATOp.FLAT_ATOMIC_UMIN: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_SMAX: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + FLATOp.FLAT_ATOMIC_UMAX: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_AND: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + FLATOp.FLAT_ATOMIC_OR: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + FLATOp.FLAT_ATOMIC_XOR: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + FLATOp.FLAT_ATOMIC_INC: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_DEC: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_ADD_F32: 'tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA = tmp', + FLATOp.FLAT_ATOMIC_PK_ADD_F16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].f16 = tmp[31 : 16].f16 + src[31 : 16].f16;\ndst[15 : 0].f16 = tmp[15 : 0].f16 + src[15 : 0].f16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + FLATOp.FLAT_ATOMIC_ADD_F64: 'tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp', + FLATOp.FLAT_ATOMIC_MIN_F64: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + FLATOp.FLAT_ATOMIC_MAX_F64: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + FLATOp.FLAT_ATOMIC_PK_ADD_BF16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + FLATOp.FLAT_ATOMIC_SWAP_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + FLATOp.FLAT_ATOMIC_CMPSWAP_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_ADD_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_SUB_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_SMIN_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + FLATOp.FLAT_ATOMIC_UMIN_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_SMAX_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + FLATOp.FLAT_ATOMIC_UMAX_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_AND_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + FLATOp.FLAT_ATOMIC_OR_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + FLATOp.FLAT_ATOMIC_XOR_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + FLATOp.FLAT_ATOMIC_INC_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_DEC_X2: 'addr = CalcFlatAddr(ADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_LOAD_UBYTE: "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 24'0U, MEM[addr].u8 })", + GLOBALOp.GLOBAL_LOAD_SBYTE: "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i8))", + GLOBALOp.GLOBAL_LOAD_USHORT: "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", + GLOBALOp.GLOBAL_LOAD_SSHORT: "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", + GLOBALOp.GLOBAL_LOAD_DWORD: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32', + GLOBALOp.GLOBAL_LOAD_DWORDX2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32', + GLOBALOp.GLOBAL_LOAD_DWORDX3: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32', + GLOBALOp.GLOBAL_LOAD_DWORDX4: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32', + GLOBALOp.GLOBAL_STORE_BYTE: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[7 : 0]', + GLOBALOp.GLOBAL_STORE_BYTE_D16_HI: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[23 : 16]', + GLOBALOp.GLOBAL_STORE_SHORT: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[15 : 0]', + GLOBALOp.GLOBAL_STORE_SHORT_D16_HI: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[31 : 16]', + GLOBALOp.GLOBAL_STORE_DWORD: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0]', + GLOBALOp.GLOBAL_STORE_DWORDX2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]', + GLOBALOp.GLOBAL_STORE_DWORDX3: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]', + GLOBALOp.GLOBAL_STORE_DWORDX4: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]', + GLOBALOp.GLOBAL_LOAD_UBYTE_D16: "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", + GLOBALOp.GLOBAL_LOAD_UBYTE_D16_HI: "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", + GLOBALOp.GLOBAL_LOAD_SBYTE_D16: "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", + GLOBALOp.GLOBAL_LOAD_SBYTE_D16_HI: "addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", + GLOBALOp.GLOBAL_LOAD_SHORT_D16: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.', + GLOBALOp.GLOBAL_LOAD_SHORT_D16_HI: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.', + GLOBALOp.GLOBAL_ATOMIC_SWAP: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_ADD: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SUB: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SMIN: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_UMIN: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SMAX: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_UMAX: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_AND: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_OR: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_XOR: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_INC: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_DEC: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_ADD_F32: 'tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA = tmp', + GLOBALOp.GLOBAL_ATOMIC_PK_ADD_F16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].f16 = tmp[31 : 16].f16 + src[31 : 16].f16;\ndst[15 : 0].f16 = tmp[15 : 0].f16 + src[15 : 0].f16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + GLOBALOp.GLOBAL_ATOMIC_ADD_F64: 'tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp', + GLOBALOp.GLOBAL_ATOMIC_MIN_F64: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MAX_F64: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_PK_ADD_BF16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + GLOBALOp.GLOBAL_ATOMIC_SWAP_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_ADD_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SUB_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SMIN_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_UMIN_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SMAX_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_UMAX_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_AND_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_OR_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_XOR_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_INC_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_DEC_X2: 'addr = CalcGlobalAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + MTBUFOp.TBUFFER_LOAD_FORMAT_X: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format', + MTBUFOp.TBUFFER_LOAD_FORMAT_XY: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()])', + MTBUFOp.TBUFFER_LOAD_FORMAT_XYZ: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()])', + MTBUFOp.TBUFFER_LOAD_FORMAT_XYZW: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()]);\nVDATA[127 : 96].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetW()])', + MTBUFOp.TBUFFER_STORE_FORMAT_X: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format', + MTBUFOp.TBUFFER_STORE_FORMAT_XY: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32)', + MTBUFOp.TBUFFER_STORE_FORMAT_XYZ: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32)', + MTBUFOp.TBUFFER_STORE_FORMAT_XYZW: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32);\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(VDATA[127 : 96].b32)', + MTBUFOp.TBUFFER_LOAD_FORMAT_D16_X: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\n// VDATA[31:16].b16 is preserved.", + MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XY: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]))", + MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XYZ: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\n// VDATA[63:48].b16 is preserved.", + MTBUFOp.TBUFFER_LOAD_FORMAT_D16_XYZW: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\nVDATA[63 : 48].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetW()]))", + MTBUFOp.TBUFFER_STORE_FORMAT_D16_X: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format", + MTBUFOp.TBUFFER_STORE_FORMAT_D16_XY: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16))", + MTBUFOp.TBUFFER_STORE_FORMAT_D16_XYZ: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16))", + MTBUFOp.TBUFFER_STORE_FORMAT_D16_XYZW: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16));\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(32'B(VDATA[63 : 48].b16))", + MUBUFOp.BUFFER_LOAD_FORMAT_X: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format', + MUBUFOp.BUFFER_LOAD_FORMAT_XY: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()])', + MUBUFOp.BUFFER_LOAD_FORMAT_XYZ: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()])', + MUBUFOp.BUFFER_LOAD_FORMAT_XYZW: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()]);\nVDATA[127 : 96].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetW()])', + MUBUFOp.BUFFER_STORE_FORMAT_X: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format', + MUBUFOp.BUFFER_STORE_FORMAT_XY: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32)', + MUBUFOp.BUFFER_STORE_FORMAT_XYZ: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32)', + MUBUFOp.BUFFER_STORE_FORMAT_XYZW: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32);\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(VDATA[127 : 96].b32)', + MUBUFOp.BUFFER_LOAD_FORMAT_D16_X: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\n// VDATA[31:16].b16 is preserved.", + MUBUFOp.BUFFER_LOAD_FORMAT_D16_XY: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]))", + MUBUFOp.BUFFER_LOAD_FORMAT_D16_XYZ: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\n// VDATA[63:48].b16 is preserved.", + MUBUFOp.BUFFER_LOAD_FORMAT_D16_XYZW: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\nVDATA[63 : 48].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetW()]))", + MUBUFOp.BUFFER_STORE_FORMAT_D16_X: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format", + MUBUFOp.BUFFER_STORE_FORMAT_D16_XY: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16))", + MUBUFOp.BUFFER_STORE_FORMAT_D16_XYZ: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16))", + MUBUFOp.BUFFER_STORE_FORMAT_D16_XYZW: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16));\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(32'B(VDATA[63 : 48].b16))", + MUBUFOp.BUFFER_LOAD_UBYTE: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 24'0U, MEM[addr].u8 })", + MUBUFOp.BUFFER_LOAD_SBYTE: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i8))", + MUBUFOp.BUFFER_LOAD_USHORT: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", + MUBUFOp.BUFFER_LOAD_SSHORT: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", + MUBUFOp.BUFFER_LOAD_DWORD: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32', + MUBUFOp.BUFFER_LOAD_DWORDX2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32', + MUBUFOp.BUFFER_LOAD_DWORDX3: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32', + MUBUFOp.BUFFER_LOAD_DWORDX4: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32', + MUBUFOp.BUFFER_STORE_BYTE: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[7 : 0]', + MUBUFOp.BUFFER_STORE_BYTE_D16_HI: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[23 : 16]', + MUBUFOp.BUFFER_STORE_SHORT: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[15 : 0]', + MUBUFOp.BUFFER_STORE_SHORT_D16_HI: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[31 : 16]', + MUBUFOp.BUFFER_STORE_DWORD: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0]', + MUBUFOp.BUFFER_STORE_DWORDX2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]', + MUBUFOp.BUFFER_STORE_DWORDX3: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]', + MUBUFOp.BUFFER_STORE_DWORDX4: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]', + MUBUFOp.BUFFER_LOAD_UBYTE_D16: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", + MUBUFOp.BUFFER_LOAD_UBYTE_D16_HI: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", + MUBUFOp.BUFFER_LOAD_SBYTE_D16: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", + MUBUFOp.BUFFER_LOAD_SBYTE_D16_HI: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", + MUBUFOp.BUFFER_LOAD_SHORT_D16: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.', + MUBUFOp.BUFFER_LOAD_SHORT_D16_HI: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.', + MUBUFOp.BUFFER_LOAD_FORMAT_D16_HI_X: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\n// VDATA[15:0].b16 is preserved.", + MUBUFOp.BUFFER_STORE_FORMAT_D16_HI_X: "addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\n// Mem access size depends on format", + MUBUFOp.BUFFER_ATOMIC_SWAP: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + MUBUFOp.BUFFER_ATOMIC_CMPSWAP: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_ADD: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_SUB: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_SMIN: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + MUBUFOp.BUFFER_ATOMIC_UMIN: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_SMAX: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + MUBUFOp.BUFFER_ATOMIC_UMAX: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_AND: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + MUBUFOp.BUFFER_ATOMIC_OR: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + MUBUFOp.BUFFER_ATOMIC_XOR: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + MUBUFOp.BUFFER_ATOMIC_INC: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_DEC: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_ADD_F32: 'tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA = tmp', + MUBUFOp.BUFFER_ATOMIC_PK_ADD_F16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].f16 = tmp[31 : 16].f16 + src[31 : 16].f16;\ndst[15 : 0].f16 = tmp[15 : 0].f16 + src[15 : 0].f16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + MUBUFOp.BUFFER_ATOMIC_ADD_F64: 'tmp = MEM[ADDR].f64;\nMEM[ADDR].f64 += DATA.f64;\nRETURN_DATA = tmp', + MUBUFOp.BUFFER_ATOMIC_MIN_F64: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + MUBUFOp.BUFFER_ATOMIC_MAX_F64: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].f64;\nsrc = DATA.f64;\nMEM[addr].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + MUBUFOp.BUFFER_ATOMIC_PK_ADD_BF16: 'tmp = MEM[ADDR];\nsrc = DATA;\ndst[31 : 16].bf16 = tmp[31 : 16].bf16 + src[31 : 16].bf16;\ndst[15 : 0].bf16 = tmp[15 : 0].bf16 + src[15 : 0].bf16;\nMEM[ADDR] = dst.b32;\nRETURN_DATA = tmp', + MUBUFOp.BUFFER_ATOMIC_SWAP_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + MUBUFOp.BUFFER_ATOMIC_CMPSWAP_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_ADD_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_SUB_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_SMIN_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + MUBUFOp.BUFFER_ATOMIC_UMIN_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_SMAX_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + MUBUFOp.BUFFER_ATOMIC_UMAX_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_AND_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + MUBUFOp.BUFFER_ATOMIC_OR_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + MUBUFOp.BUFFER_ATOMIC_XOR_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + MUBUFOp.BUFFER_ATOMIC_INC_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_DEC_X2: 'addr = CalcBufferAddr(VADDR.b32, SRSRC.b32, SOFFSET.b32, OFFSET.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + SCRATCHOp.SCRATCH_LOAD_UBYTE: "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 24'0U, MEM[addr].u8 })", + SCRATCHOp.SCRATCH_LOAD_SBYTE: "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i8))", + SCRATCHOp.SCRATCH_LOAD_USHORT: "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", + SCRATCHOp.SCRATCH_LOAD_SSHORT: "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", + SCRATCHOp.SCRATCH_LOAD_DWORD: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32', + SCRATCHOp.SCRATCH_LOAD_DWORDX2: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32', + SCRATCHOp.SCRATCH_LOAD_DWORDX3: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32', + SCRATCHOp.SCRATCH_LOAD_DWORDX4: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32', + SCRATCHOp.SCRATCH_STORE_BYTE: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[7 : 0]', + SCRATCHOp.SCRATCH_STORE_BYTE_D16_HI: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b8 = VDATA[23 : 16]', + SCRATCHOp.SCRATCH_STORE_SHORT: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[15 : 0]', + SCRATCHOp.SCRATCH_STORE_SHORT_D16_HI: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b16 = VDATA[31 : 16]', + SCRATCHOp.SCRATCH_STORE_DWORD: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0]', + SCRATCHOp.SCRATCH_STORE_DWORDX2: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]', + SCRATCHOp.SCRATCH_STORE_DWORDX3: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]', + SCRATCHOp.SCRATCH_STORE_DWORDX4: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]', + SCRATCHOp.SCRATCH_LOAD_UBYTE_D16: "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", + SCRATCHOp.SCRATCH_LOAD_UBYTE_D16_HI: "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", + SCRATCHOp.SCRATCH_LOAD_SBYTE_D16: "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", + SCRATCHOp.SCRATCH_LOAD_SBYTE_D16_HI: "addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", + SCRATCHOp.SCRATCH_LOAD_SHORT_D16: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.', + SCRATCHOp.SCRATCH_LOAD_SHORT_D16_HI: 'addr = CalcScratchAddr(ADDR.b32, SADDR.b32, OFFSET.b32);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.', + SMEMOp.S_LOAD_DWORD: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32', + SMEMOp.S_LOAD_DWORDX2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32', + SMEMOp.S_LOAD_DWORDX4: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32', + SMEMOp.S_LOAD_DWORDX8: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32;\nSDATA[159 : 128] = MEM[addr + 16U].b32;\nSDATA[191 : 160] = MEM[addr + 20U].b32;\nSDATA[223 : 192] = MEM[addr + 24U].b32;\nSDATA[255 : 224] = MEM[addr + 28U].b32', + SMEMOp.S_LOAD_DWORDX16: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32;\nSDATA[159 : 128] = MEM[addr + 16U].b32;\nSDATA[191 : 160] = MEM[addr + 20U].b32;\nSDATA[223 : 192] = MEM[addr + 24U].b32;\nSDATA[255 : 224] = MEM[addr + 28U].b32;\nSDATA[287 : 256] = MEM[addr + 32U].b32;\nSDATA[319 : 288] = MEM[addr + 36U].b32;\nSDATA[351 : 320] = MEM[addr + 40U].b32;\nSDATA[383 : 352] = MEM[addr + 44U].b32;\nSDATA[415 : 384] = MEM[addr + 48U].b32;\nSDATA[447 : 416] = MEM[addr + 52U].b32;\nSDATA[479 : 448] = MEM[addr + 56U].b32;\nSDATA[511 : 480] = MEM[addr + 60U].b32', + SMEMOp.S_SCRATCH_LOAD_DWORD: 'addr = CalcScalarScratchAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32', + SMEMOp.S_SCRATCH_LOAD_DWORDX2: 'addr = CalcScalarScratchAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32', + SMEMOp.S_SCRATCH_LOAD_DWORDX4: 'addr = CalcScalarScratchAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32', + SMEMOp.S_BUFFER_LOAD_DWORD: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32', + SMEMOp.S_BUFFER_LOAD_DWORDX2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32', + SMEMOp.S_BUFFER_LOAD_DWORDX4: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32', + SMEMOp.S_BUFFER_LOAD_DWORDX8: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32;\nSDATA[159 : 128] = MEM[addr + 16U].b32;\nSDATA[191 : 160] = MEM[addr + 20U].b32;\nSDATA[223 : 192] = MEM[addr + 24U].b32;\nSDATA[255 : 224] = MEM[addr + 28U].b32', + SMEMOp.S_BUFFER_LOAD_DWORDX16: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32;\nSDATA[159 : 128] = MEM[addr + 16U].b32;\nSDATA[191 : 160] = MEM[addr + 20U].b32;\nSDATA[223 : 192] = MEM[addr + 24U].b32;\nSDATA[255 : 224] = MEM[addr + 28U].b32;\nSDATA[287 : 256] = MEM[addr + 32U].b32;\nSDATA[319 : 288] = MEM[addr + 36U].b32;\nSDATA[351 : 320] = MEM[addr + 40U].b32;\nSDATA[383 : 352] = MEM[addr + 44U].b32;\nSDATA[415 : 384] = MEM[addr + 48U].b32;\nSDATA[447 : 416] = MEM[addr + 52U].b32;\nSDATA[479 : 448] = MEM[addr + 56U].b32;\nSDATA[511 : 480] = MEM[addr + 60U].b32', + SMEMOp.S_STORE_DWORD: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0]', + SMEMOp.S_STORE_DWORDX2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0];\nMEM[addr + 4U].b32 = SDATA[63 : 32]', + SMEMOp.S_STORE_DWORDX4: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0];\nMEM[addr + 4U].b32 = SDATA[63 : 32];\nMEM[addr + 8U].b32 = SDATA[95 : 64];\nMEM[addr + 12U].b32 = SDATA[127 : 96]', + SMEMOp.S_SCRATCH_STORE_DWORD: 'addr = CalcScalarScratchAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0]', + SMEMOp.S_SCRATCH_STORE_DWORDX2: 'addr = CalcScalarScratchAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0];\nMEM[addr + 4U].b32 = SDATA[63 : 32]', + SMEMOp.S_SCRATCH_STORE_DWORDX4: 'addr = CalcScalarScratchAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0];\nMEM[addr + 4U].b32 = SDATA[63 : 32];\nMEM[addr + 8U].b32 = SDATA[95 : 64];\nMEM[addr + 12U].b32 = SDATA[127 : 96]', + SMEMOp.S_BUFFER_STORE_DWORD: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0]', + SMEMOp.S_BUFFER_STORE_DWORDX2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0];\nMEM[addr + 4U].b32 = SDATA[63 : 32]', + SMEMOp.S_BUFFER_STORE_DWORDX4: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\nMEM[addr].b32 = SDATA[31 : 0];\nMEM[addr + 4U].b32 = SDATA[63 : 32];\nMEM[addr + 8U].b32 = SDATA[95 : 64];\nMEM[addr + 12U].b32 = SDATA[127 : 96]', + SMEMOp.S_BUFFER_ATOMIC_SWAP: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_CMPSWAP: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_ADD: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_SUB: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_SMIN: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_UMIN: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_SMAX: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_UMAX: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_AND: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_OR: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_XOR: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_INC: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_DEC: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_BUFFER_ATOMIC_SWAP_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_CMPSWAP_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_ADD_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_SUB_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_SMIN_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_UMIN_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_SMAX_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_UMAX_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_AND_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_OR_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_XOR_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_INC_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_BUFFER_ATOMIC_DEC_X2: 'addr = CalcScalarBufferAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_ATOMIC_SWAP: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + SMEMOp.S_ATOMIC_CMPSWAP: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_ATOMIC_ADD: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_ATOMIC_SUB: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_ATOMIC_SMIN: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + SMEMOp.S_ATOMIC_UMIN: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_ATOMIC_SMAX: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + SMEMOp.S_ATOMIC_UMAX: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_ATOMIC_AND: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + SMEMOp.S_ATOMIC_OR: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + SMEMOp.S_ATOMIC_XOR: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + SMEMOp.S_ATOMIC_INC: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_ATOMIC_DEC: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + SMEMOp.S_ATOMIC_SWAP_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + SMEMOp.S_ATOMIC_CMPSWAP_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_ATOMIC_ADD_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_ATOMIC_SUB_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_ATOMIC_SMIN_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + SMEMOp.S_ATOMIC_UMIN_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_ATOMIC_SMAX_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + SMEMOp.S_ATOMIC_UMAX_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_ATOMIC_AND_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + SMEMOp.S_ATOMIC_OR_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + SMEMOp.S_ATOMIC_XOR_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + SMEMOp.S_ATOMIC_INC_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + SMEMOp.S_ATOMIC_DEC_X2: 'addr = CalcScalarGlobalAddr(SBASE.b32, SOFFSET.b32, OFFSET.i32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + SOP1Op.S_MOV_B32: 'D0.b32 = S0.b32', + SOP1Op.S_MOV_B64: 'D0.b64 = S0.b64', + SOP1Op.S_CMOV_B32: 'if SCC then\nD0.b32 = S0.b32\nendif', + SOP1Op.S_CMOV_B64: 'if SCC then\nD0.b64 = S0.b64\nendif', + SOP1Op.S_NOT_B32: 'D0.u32 = ~S0.u32;\nSCC = D0.u32 != 0U', + SOP1Op.S_NOT_B64: 'D0.u64 = ~S0.u64;\nSCC = D0.u64 != 0ULL', + SOP1Op.S_WQM_B32: "tmp = 0U;\ndeclare i : 6'U;\nfor i in 6'0U : 6'31U do\ntmp[i] = S0.u32[i & 6'60U +: 6'4U] != 0U\nendfor;\nD0.u32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_WQM_B64: "tmp = 0ULL;\ndeclare i : 6'U;\nfor i in 6'0U : 6'63U do\ntmp[i] = S0.u64[i & 6'60U +: 6'4U] != 0ULL\nendfor;\nD0.u64 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_BREV_B32: 'D0.u32[31 : 0] = S0.u32[0 : 31]', + SOP1Op.S_BREV_B64: 'D0.u64[63 : 0] = S0.u64[0 : 63]', + SOP1Op.S_BCNT0_I32_B32: "tmp = 0;\nfor i in 0 : 31 do\ntmp += S0.u32[i] == 1'0U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_BCNT0_I32_B64: "tmp = 0;\nfor i in 0 : 63 do\ntmp += S0.u64[i] == 1'0U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_BCNT1_I32_B32: "tmp = 0;\nfor i in 0 : 31 do\ntmp += S0.u32[i] == 1'1U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_BCNT1_I32_B64: "tmp = 0;\nfor i in 0 : 63 do\ntmp += S0.u64[i] == 1'1U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_FF0_I32_B32: "tmp = -1;\n// Set if no zeros are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'0U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_FF0_I32_B64: "tmp = -1;\n// Set if no zeros are found\nfor i in 0 : 63 do\n// Search from LSB\nif S0.u64[i] == 1'0U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_FF1_I32_B32: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_FF1_I32_B64: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 63 do\n// Search from LSB\nif S0.u64[i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_FLBIT_I32_B32: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_FLBIT_I32_B64: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 63 do\n// Search from MSB\nif S0.u64[63 - i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_FLBIT_I32: 'tmp = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.u32[31 - i] != S0.u32[31] then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp', + SOP1Op.S_FLBIT_I32_I64: 'tmp = -1;\n// Set if all bits are the same\nfor i in 1 : 63 do\n// Search from MSB\nif S0.u64[63 - i] != S0.u64[63] then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp', + SOP1Op.S_SEXT_I32_I8: "D0.i32 = 32'I(signext(S0.i8))", + SOP1Op.S_SEXT_I32_I16: "D0.i32 = 32'I(signext(S0.i16))", + SOP1Op.S_BITSET0_B32: "D0.u32[S0.u32[4 : 0]] = 1'0U", + SOP1Op.S_BITSET0_B64: "D0.u64[S0.u32[5 : 0]] = 1'0U", + SOP1Op.S_BITSET1_B32: "D0.u32[S0.u32[4 : 0]] = 1'1U", + SOP1Op.S_BITSET1_B64: "D0.u64[S0.u32[5 : 0]] = 1'1U", + SOP1Op.S_GETPC_B64: 'D0.i64 = PC + 4LL', + SOP1Op.S_SETPC_B64: 'PC = S0.i64', + SOP1Op.S_SWAPPC_B64: 'jump_addr = S0.i64;\nD0.i64 = PC + 4LL;\nPC = jump_addr.i64', + SOP1Op.S_RFE_B64: "WAVE_STATUS.PRIV = 1'0U;\nPC = S0.i64", + SOP1Op.S_AND_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_OR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_XOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 ^ EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_ANDN2_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 & ~EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_ORN2_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 | ~EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_NAND_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_NOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_XNOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 ^ EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_QUADMASK_B32: 'tmp = 0U;\nfor i in 0 : 7 do\ntmp[i] = S0.u32[i * 4 +: 4] != 0U\nendfor;\nD0.u32 = tmp;\nSCC = D0.u32 != 0U', + SOP1Op.S_QUADMASK_B64: 'tmp = 0ULL;\nfor i in 0 : 15 do\ntmp[i] = S0.u64[i * 4 +: 4] != 0ULL\nendfor;\nD0.u64 = tmp;\nSCC = D0.u64 != 0ULL', + SOP1Op.S_MOVRELS_B32: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b32 = SGPR[addr].b32', + SOP1Op.S_MOVRELS_B64: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b64 = SGPR[addr].b64', + SOP1Op.S_MOVRELD_B32: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nSGPR[addr].b32 = S0.b32', + SOP1Op.S_MOVRELD_B64: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nSGPR[addr].b64 = S0.b64', + SOP1Op.S_CBRANCH_JOIN: "saved_csp = S0.u32;\nif WAVE_MODE.CSP.u32 == saved_csp then\nPC += 4LL;\n// Second time to JOIN: continue with program.\nelse\nWAVE_MODE.CSP -= 3'1U;\n// First time to JOIN; jump to other FORK path.\n{ PC, EXEC } = SGPR[WAVE_MODE.CSP.u32 * 4U].b128;\n// Read 128 bits from 4 consecutive SGPRs.\nendif", + SOP1Op.S_ABS_I32: 'D0.i32 = S0.i32 < 0 ? -S0.i32 : S0.i32;\nSCC = D0.i32 != 0', + SOP1Op.S_SET_GPR_IDX_IDX: 'M0[7 : 0] = S0.u32[7 : 0].b8', + SOP1Op.S_ANDN1_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (~S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_ORN1_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (~S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_ANDN1_WREXEC_B64: 'EXEC.u64 = (~S0.u64 & EXEC.u64);\nD0.u64 = EXEC.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_ANDN2_WREXEC_B64: 'EXEC.u64 = (S0.u64 & ~EXEC.u64);\nD0.u64 = EXEC.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_BITREPLICATE_B64_B32: 'tmp = S0.u32;\nfor i in 0 : 31 do\nD0.u64[i * 2] = tmp[i];\nD0.u64[i * 2 + 1] = tmp[i]\nendfor', + SOP2Op.S_ADD_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_ADDC_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_SUB_U32: "tmp = S0.u32 - S1.u32;\nSCC = S1.u32 > S0.u32 ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_SUBB_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_ADD_I32: 'tmp = S0.i32 + S1.i32;\nSCC = ((S0.u32[31] == S1.u32[31]) && (S0.u32[31] != tmp.u32[31]));\n// signed overflow.\nD0.i32 = tmp.i32', + SOP2Op.S_SUB_I32: 'tmp = S0.i32 - S1.i32;\nSCC = ((S0.u32[31] != S1.u32[31]) && (S0.u32[31] != tmp.u32[31]));\n// signed overflow.\nD0.i32 = tmp.i32', + SOP2Op.S_ADDC_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + SCC.u64;\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_ADDC_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_SUBB_U32: "tmp = S0.u32 - S1.u32 - SCC.u32;\nSCC = 64'U(S1.u32) + SCC.u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_SUBB_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_MIN_I32: 'SCC = S0.i32 < S1.i32;\nD0.i32 = SCC ? S0.i32 : S1.i32', + SOP2Op.S_MIN_U32: 'SCC = S0.u32 < S1.u32;\nD0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_MAX_I32: 'SCC = S0.i32 >= S1.i32;\nD0.i32 = SCC ? S0.i32 : S1.i32', + SOP2Op.S_MAX_U32: 'SCC = S0.u32 >= S1.u32;\nD0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_CSELECT_B32: 'D0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_CSELECT_B64: 'D0.u64 = SCC ? S0.u64 : S1.u64', + SOP2Op.S_AND_B32: 'D0.u32 = (S0.u32 & S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_AND_B64: 'D0.u64 = (S0.u64 & S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_OR_B32: 'D0.u32 = (S0.u32 | S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_OR_B64: 'D0.u64 = (S0.u64 | S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_XOR_B32: 'D0.u32 = (S0.u32 ^ S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_XOR_B64: 'D0.u64 = (S0.u64 ^ S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_ANDN2_B32: 'D0.u32 = (S0.u32 & ~S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_ANDN2_B64: 'D0.u64 = (S0.u64 & ~S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_ORN2_B32: 'D0.u32 = (S0.u32 | ~S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_ORN2_B64: 'D0.u64 = (S0.u64 | ~S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_NAND_B32: 'D0.u32 = ~(S0.u32 & S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_NAND_B64: 'D0.u64 = ~(S0.u64 & S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_NOR_B32: 'D0.u32 = ~(S0.u32 | S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_NOR_B64: 'D0.u64 = ~(S0.u64 | S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_XNOR_B32: 'D0.u32 = ~(S0.u32 ^ S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_XNOR_B64: 'D0.u64 = ~(S0.u64 ^ S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_LSHL_B32: 'D0.u32 = (S0.u32 << S1[4 : 0].u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_LSHL_B64: 'D0.u64 = (S0.u64 << S1[5 : 0].u32);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_LSHR_B32: 'D0.u32 = (S0.u32 >> S1[4 : 0].u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_LSHR_B64: 'D0.u64 = (S0.u64 >> S1[5 : 0].u32);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_ASHR_I32: "D0.i32 = 32'I(signext(S0.i32) >> S1[4 : 0].u32);\nSCC = D0.i32 != 0", + SOP2Op.S_ASHR_I64: 'D0.i64 = (signext(S0.i64) >> S1[5 : 0].u32);\nSCC = D0.i64 != 0LL', + SOP2Op.S_BFM_B32: 'D0.u32 = (((1U << S0[4 : 0].u32) - 1U) << S1[4 : 0].u32)', + SOP2Op.S_BFM_B64: 'D0.u64 = (((1ULL << S0[5 : 0].u32) - 1ULL) << S1[5 : 0].u32)', + SOP2Op.S_MUL_I32: 'D0.i32 = S0.i32 * S1.i32', + SOP2Op.S_BFE_U32: 'D0.u32 = ((S0.u32 >> S1[4 : 0].u32) & ((1U << S1[22 : 16].u32) - 1U));\nSCC = D0.u32 != 0U', + SOP2Op.S_BFE_I32: 'tmp.i32 = ((S0.i32 >> S1[4 : 0].u32) & ((1 << S1[22 : 16].u32) - 1));\nD0.i32 = signext_from_bit(tmp.i32, S1[22 : 16].u32);\nSCC = D0.i32 != 0', + SOP2Op.S_BFE_U64: 'D0.u64 = ((S0.u64 >> S1[5 : 0].u32) & ((1ULL << S1[22 : 16].u32) - 1ULL));\nSCC = D0.u64 != 0ULL', + SOP2Op.S_BFE_I64: 'tmp.i64 = ((S0.i64 >> S1[5 : 0].u32) & ((1LL << S1[22 : 16].u32) - 1LL));\nD0.i64 = signext_from_bit(tmp.i64, S1[22 : 16].u32);\nSCC = D0.i64 != 0LL', + SOP2Op.S_CBRANCH_G_FORK: "mask_pass = (S0.u64 & EXEC.u64);\nmask_fail = (~S0.u64 & EXEC.u64);\nif mask_pass == EXEC.u64 then\nPC = 64'I(S1.u64)\nelsif mask_fail == EXEC.u64 then\nPC += 4LL\nelsif bitCount(mask_fail.b64) < bitCount(mask_pass.b64) then\nEXEC = mask_fail.b64;\nSGPR[WAVE_MODE.CSP.u32 * 4U].b128 = { S1.u64, mask_pass };\nWAVE_MODE.CSP += 3'1U;\nPC += 4LL\nelse\nEXEC = mask_pass.b64;\nSGPR[WAVE_MODE.CSP.u32 * 4U].b128 = { (PC + 4LL), mask_fail };\nWAVE_MODE.CSP += 3'1U;\nPC = 64'I(S1.u64)\nendif", + SOP2Op.S_ABSDIFF_I32: 'D0.i32 = S0.i32 - S1.i32;\nif D0.i32 < 0 then\nD0.i32 = -D0.i32\nendif;\nSCC = D0.i32 != 0', + SOP2Op.S_MUL_HI_U32: "D0.u32 = 32'U((64'U(S0.u32) * 64'U(S1.u32)) >> 32U)", + SOP2Op.S_MUL_HI_I32: "D0.i32 = 32'I((64'I(S0.i32) * 64'I(S1.i32)) >> 32U)", + SOP2Op.S_LSHL1_ADD_U32: "tmp = (64'U(S0.u32) << 1U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL2_ADD_U32: "tmp = (64'U(S0.u32) << 2U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL3_ADD_U32: "tmp = (64'U(S0.u32) << 3U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL4_ADD_U32: "tmp = (64'U(S0.u32) << 4U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_PACK_LL_B32_B16: 'D0 = { S1[15 : 0].u16, S0[15 : 0].u16 }', + SOP2Op.S_PACK_LH_B32_B16: 'D0 = { S1[31 : 16].u16, S0[15 : 0].u16 }', + SOP2Op.S_PACK_HH_B32_B16: 'D0 = { S1[31 : 16].u16, S0[31 : 16].u16 }', + SOPCOp.S_CMP_EQ_I32: 'SCC = S0.i32 == S1.i32', + SOPCOp.S_CMP_LG_I32: 'SCC = S0.i32 <> S1.i32', + SOPCOp.S_CMP_GT_I32: 'SCC = S0.i32 > S1.i32', + SOPCOp.S_CMP_GE_I32: 'SCC = S0.i32 >= S1.i32', + SOPCOp.S_CMP_LT_I32: 'SCC = S0.i32 < S1.i32', + SOPCOp.S_CMP_LE_I32: 'SCC = S0.i32 <= S1.i32', + SOPCOp.S_CMP_EQ_U32: 'SCC = S0.u32 == S1.u32', + SOPCOp.S_CMP_LG_U32: 'SCC = S0.u32 <> S1.u32', + SOPCOp.S_CMP_GT_U32: 'SCC = S0.u32 > S1.u32', + SOPCOp.S_CMP_GE_U32: 'SCC = S0.u32 >= S1.u32', + SOPCOp.S_CMP_LT_U32: 'SCC = S0.u32 < S1.u32', + SOPCOp.S_CMP_LE_U32: 'SCC = S0.u32 <= S1.u32', + SOPCOp.S_BITCMP0_B32: "SCC = S0.u32[S1.u32[4 : 0]] == 1'0U", + SOPCOp.S_BITCMP1_B32: "SCC = S0.u32[S1.u32[4 : 0]] == 1'1U", + SOPCOp.S_BITCMP0_B64: "SCC = S0.u64[S1.u32[5 : 0]] == 1'0U", + SOPCOp.S_BITCMP1_B64: "SCC = S0.u64[S1.u32[5 : 0]] == 1'1U", + SOPCOp.S_SETVSKIP: 'VSKIP = S0.u32[S1.u32[4 : 0]]', + SOPCOp.S_SET_GPR_IDX_ON: "WAVE_MODE.GPR_IDX_EN = 1'1U;\nM0[7 : 0] = S0.u32[7 : 0].b8;\nM0[15 : 12] = SRC1.u32[3 : 0].b4;\n// this is the direct content of raw S1 field\n// Remaining bits of M0 are unmodified.", + SOPCOp.S_CMP_EQ_U64: 'SCC = S0.u64 == S1.u64', + SOPCOp.S_CMP_LG_U64: 'SCC = S0.u64 <> S1.u64', + SOPKOp.S_MOVK_I32: "D0.i32 = 32'I(signext(S0.i16))", + SOPKOp.S_CMOVK_I32: "if SCC then\nD0.i32 = 32'I(signext(S0.i16))\nendif", + SOPKOp.S_CMPK_EQ_I32: "SCC = S0.i32 == 32'I(signext(S1.i16))", + SOPKOp.S_CMPK_LG_I32: "SCC = S0.i32 != 32'I(signext(S1.i16))", + SOPKOp.S_CMPK_GT_I32: "SCC = S0.i32 > 32'I(signext(S1.i16))", + SOPKOp.S_CMPK_GE_I32: "SCC = S0.i32 >= 32'I(signext(S1.i16))", + SOPKOp.S_CMPK_LT_I32: "SCC = S0.i32 < 32'I(signext(S1.i16))", + SOPKOp.S_CMPK_LE_I32: "SCC = S0.i32 <= 32'I(signext(S1.i16))", + SOPKOp.S_CMPK_EQ_U32: "SCC = S0.u32 == 32'U(S1.u16)", + SOPKOp.S_CMPK_LG_U32: "SCC = S0.u32 != 32'U(S1.u16)", + SOPKOp.S_CMPK_GT_U32: "SCC = S0.u32 > 32'U(S1.u16)", + SOPKOp.S_CMPK_GE_U32: "SCC = S0.u32 >= 32'U(S1.u16)", + SOPKOp.S_CMPK_LT_U32: "SCC = S0.u32 < 32'U(S1.u16)", + SOPKOp.S_CMPK_LE_U32: "SCC = S0.u32 <= 32'U(S1.u16)", + SOPKOp.S_ADDK_I32: "tmp = D0.i32;\n// Save value to check sign bits for overflow later.\nD0.i32 = D0.i32 + 32'I(signext(S0.i16));\nSCC = ((tmp[31] == S0.i16[15]) && (tmp[31] != D0.i32[31]));\n// signed overflow.", + SOPKOp.S_MULK_I32: "D0.i32 = D0.i32 * 32'I(signext(S0.i16))", + SOPKOp.S_CBRANCH_I_FORK: "// Initial setup.\nmask_pass = (S0.u64 & EXEC.u64);\nmask_fail = (~S0.u64 & EXEC.u64);\ntarget_addr = PC + signext(SIMM16.i32 * 4) + 4LL;\n// Decide where to jump to.\nif mask_pass == EXEC.u64 then\nPC = target_addr\nelsif mask_fail == EXEC.u64 then\nPC += 4LL\nelsif bitCount(mask_fail.b64) < bitCount(mask_pass.b64) then\nEXEC = mask_fail.b64;\nSGPR[WAVE_MODE.CSP.u32 * 4U].b128 = { target_addr, mask_pass };\nWAVE_MODE.CSP += 3'1U;\nPC += 4LL\nelse\nEXEC = mask_pass.b64;\nSGPR[WAVE_MODE.CSP.u32 * 4U].b128 = { (PC + 4LL), mask_fail };\nWAVE_MODE.CSP += 3'1U;\nPC = target_addr\nendif", + SOPKOp.S_GETREG_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nvalue = HW_REGISTERS[hwRegId];\nD0.u32 = 32'U(32'I(value >> offset.u32) & ((1 << size) - 1))", + SOPKOp.S_SETREG_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nmask = (1 << size) - 1;\nmask = (mask << offset.u32);\nmask = (mask & HwRegWriteMask(hwRegId, WAVE_STATUS.PRIV));\n// Mask of bits that can be modified\nvalue = ((S0.u32 << offset.u32) & mask.u32);\nvalue = (value | 32'U(HW_REGISTERS[hwRegId].i32 & ~mask));\nHW_REGISTERS[hwRegId] = value.b32;\n// Side-effects may trigger here if certain bits are modified", + SOPKOp.S_SETREG_IMM32_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nmask = (1 << size) - 1;\nmask = (mask << offset.u32);\nmask = (mask & HwRegWriteMask(hwRegId, WAVE_STATUS.PRIV));\n// Mask of bits that can be modified\nvalue = ((SIMM32.u32 << offset.u32) & mask.u32);\nvalue = (value | 32'U(HW_REGISTERS[hwRegId].i32 & ~mask));\nHW_REGISTERS[hwRegId] = value.b32;\n// Side-effects may trigger here if certain bits are modified", + SOPKOp.S_CALL_B64: "D0.i64 = PC + 4LL;\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL", + SOPPOp.S_NOP: 'for i in 0U : SIMM16.u16[3 : 0].u32 do\nnop()\nendfor', + SOPPOp.S_BRANCH: "PC = PC + signext(SIMM16.i16 * 16'4) + 4LL;\n// short jump.", + SOPPOp.S_CBRANCH_SCC0: "if SCC == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_SCC1: "if SCC == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_VCCZ: "if VCCZ.u1 == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_VCCNZ: "if VCCZ.u1 == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_EXECZ: "if EXECZ.u1 == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_EXECNZ: "if EXECZ.u1 == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_WAITCNT: 'SIMM16[3:0] = vmcount (vector memory operations) lower bits [3:0],', + SOPPOp.S_SLEEP: 's_sleep 0 // Wait for 0 clocks.\ns_sleep 1 // Wait for 1-64 clocks.\ns_sleep 2 // Wait for 65-128 clocks.', + SOPPOp.S_TRAP: 'TrapID = SIMM16.u16[7 : 0];\n"Wait for all instructions to complete";\n// PC passed into trap handler points to S_TRAP itself,\n// *not* to the next instruction.\n{ TTMP[1], TTMP[0] } = { 3\'0, PCRewind[3 : 0], HT[0], TrapID[7 : 0], PC[47 : 0] };\nPC = TBA.i64;\n// trap base address\nWAVE_STATUS.PRIV = 1\'1U', + SOPPOp.S_CBRANCH_CDBGSYS: "if WAVE_STATUS.COND_DBG_SYS.u32 != 0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_CDBGUSER: "if WAVE_STATUS.COND_DBG_USER.u32 != 0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_CDBGSYS_OR_USER: "if (WAVE_STATUS.COND_DBG_SYS || WAVE_STATUS.COND_DBG_USER) then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_CDBGSYS_AND_USER: "if (WAVE_STATUS.COND_DBG_SYS && WAVE_STATUS.COND_DBG_USER) then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_SET_GPR_IDX_OFF: "WAVE_MODE.GPR_IDX_EN = 1'0U", + SOPPOp.S_SET_GPR_IDX_MODE: 'M0[15 : 12] = SIMM16.u16[3 : 0].b4', + VOP1Op.V_MOV_B32_E32: 'D0.b32 = S0.b32', + VOP1Op.V_READFIRSTLANE_B32_E32: "declare lane : 32'I;\nif EXEC == 0x0LL then\nlane = 0;\n// Force lane 0 if all lanes are disabled\nelse\nlane = s_ff1_i32_b64(EXEC);\n// Lowest active lane\nendif;\nD0.b32 = VGPR[lane][SRC0.u32]", + VOP1Op.V_CVT_I32_F64_E32: 'D0.i32 = f64_to_i32(S0.f64)', + VOP1Op.V_CVT_F64_I32_E32: 'D0.f64 = i32_to_f64(S0.i32)', + VOP1Op.V_CVT_F32_I32_E32: 'D0.f32 = i32_to_f32(S0.i32)', + VOP1Op.V_CVT_F32_U32_E32: 'D0.f32 = u32_to_f32(S0.u32)', + VOP1Op.V_CVT_U32_F32_E32: 'D0.u32 = f32_to_u32(S0.f32)', + VOP1Op.V_CVT_I32_F32_E32: 'D0.i32 = f32_to_i32(S0.f32)', + VOP1Op.V_CVT_F16_F32_E32: 'D0.f16 = f32_to_f16(S0.f32)', + VOP1Op.V_CVT_F32_F16_E32: 'D0.f32 = f16_to_f32(S0.f16)', + VOP1Op.V_CVT_RPI_I32_F32_E32: 'D0.i32 = f32_to_i32(floor(S0.f32 + 0.5F))', + VOP1Op.V_CVT_FLR_I32_F32_E32: 'D0.i32 = f32_to_i32(floor(S0.f32))', + VOP1Op.V_CVT_OFF_F32_I4_E32: "declare CVT_OFF_TABLE : 32'F[16];\nD0.f32 = CVT_OFF_TABLE[S0.u32[3 : 0]]", + VOP1Op.V_CVT_F32_F64_E32: 'D0.f32 = f64_to_f32(S0.f64)', + VOP1Op.V_CVT_F64_F32_E32: 'D0.f64 = f32_to_f64(S0.f32)', + VOP1Op.V_CVT_F32_UBYTE0_E32: 'D0.f32 = u32_to_f32(S0[7 : 0].u32)', + VOP1Op.V_CVT_F32_UBYTE1_E32: 'D0.f32 = u32_to_f32(S0[15 : 8].u32)', + VOP1Op.V_CVT_F32_UBYTE2_E32: 'D0.f32 = u32_to_f32(S0[23 : 16].u32)', + VOP1Op.V_CVT_F32_UBYTE3_E32: 'D0.f32 = u32_to_f32(S0[31 : 24].u32)', + VOP1Op.V_CVT_U32_F64_E32: 'D0.u32 = f64_to_u32(S0.f64)', + VOP1Op.V_CVT_F64_U32_E32: 'D0.f64 = u32_to_f64(S0.u32)', + VOP1Op.V_TRUNC_F64_E32: 'D0.f64 = trunc(S0.f64)', + VOP1Op.V_CEIL_F64_E32: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 > 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += 1.0\nendif', + VOP1Op.V_RNDNE_F64_E32: 'D0.f64 = floor(S0.f64 + 0.5);\nif (isEven(floor(S0.f64)) && (fract(S0.f64) == 0.5)) then\nD0.f64 -= 1.0\nendif', + VOP1Op.V_FLOOR_F64_E32: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 < 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += -1.0\nendif', + VOP1Op.V_FRACT_F32_E32: 'D0.f32 = S0.f32 + -floor(S0.f32)', + VOP1Op.V_TRUNC_F32_E32: 'D0.f32 = trunc(S0.f32)', + VOP1Op.V_CEIL_F32_E32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 > 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += 1.0F\nendif', + VOP1Op.V_RNDNE_F32_E32: "D0.f32 = floor(S0.f32 + 0.5F);\nif (isEven(64'F(floor(S0.f32))) && (fract(S0.f32) == 0.5F)) then\nD0.f32 -= 1.0F\nendif", + VOP1Op.V_FLOOR_F32_E32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 < 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += -1.0F\nendif', + VOP1Op.V_EXP_F32_E32: 'D0.f32 = pow(2.0F, S0.f32)', + VOP1Op.V_LOG_F32_E32: 'D0.f32 = log2(S0.f32)', + VOP1Op.V_RCP_F32_E32: 'D0.f32 = 1.0F / S0.f32', + VOP1Op.V_RCP_IFLAG_F32_E32: 'D0.f32 = 1.0F / S0.f32;\n// Can only raise integer DIV_BY_ZERO exception', + VOP1Op.V_RSQ_F32_E32: 'D0.f32 = 1.0F / sqrt(S0.f32)', + VOP1Op.V_RCP_F64_E32: 'D0.f64 = 1.0 / S0.f64', + VOP1Op.V_RSQ_F64_E32: 'D0.f64 = 1.0 / sqrt(S0.f64)', + VOP1Op.V_SQRT_F32_E32: 'D0.f32 = sqrt(S0.f32)', + VOP1Op.V_SQRT_F64_E32: 'D0.f64 = sqrt(S0.f64)', + VOP1Op.V_SIN_F32_E32: "D0.f32 = sin(S0.f32 * 32'F(PI * 2.0))", + VOP1Op.V_COS_F32_E32: "D0.f32 = cos(S0.f32 * 32'F(PI * 2.0))", + VOP1Op.V_NOT_B32_E32: 'D0.u32 = ~S0.u32', + VOP1Op.V_BFREV_B32_E32: 'D0.u32[31 : 0] = S0.u32[0 : 31]', + VOP1Op.V_FFBH_U32_E32: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP1Op.V_FFBL_B32_E32: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP1Op.V_FFBH_I32_E32: 'D0.i32 = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.i32[31 - i] != S0.i32[31] then\nD0.i32 = i;\nbreak\nendif\nendfor', + VOP1Op.V_FREXP_EXP_I32_F64_E32: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f64) - 1023 + 1\nendif', + VOP1Op.V_FREXP_MANT_F64_E32: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.f64 = S0.f64\nelse\nD0.f64 = mantissa(S0.f64)\nendif', + VOP1Op.V_FRACT_F64_E32: 'D0.f64 = S0.f64 + -floor(S0.f64)', + VOP1Op.V_FREXP_EXP_I32_F32_E32: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f32) - 127 + 1\nendif", + VOP1Op.V_FREXP_MANT_F32_E32: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.f32 = S0.f32\nelse\nD0.f32 = mantissa(S0.f32)\nendif", + VOP1Op.V_MOV_B64_E32: 'D0.b64 = S0.b64', + VOP1Op.V_CVT_F16_U16_E32: 'D0.f16 = u16_to_f16(S0.u16)', + VOP1Op.V_CVT_F16_I16_E32: 'D0.f16 = i16_to_f16(S0.i16)', + VOP1Op.V_CVT_U16_F16_E32: 'D0.u16 = f16_to_u16(S0.f16)', + VOP1Op.V_CVT_I16_F16_E32: 'D0.i16 = f16_to_i16(S0.f16)', + VOP1Op.V_RCP_F16_E32: "D0.f16 = 16'1.0 / S0.f16", + VOP1Op.V_SQRT_F16_E32: 'D0.f16 = sqrt(S0.f16)', + VOP1Op.V_RSQ_F16_E32: "D0.f16 = 16'1.0 / sqrt(S0.f16)", + VOP1Op.V_LOG_F16_E32: 'D0.f16 = log2(S0.f16)', + VOP1Op.V_EXP_F16_E32: "D0.f16 = pow(16'2.0, S0.f16)", + VOP1Op.V_FREXP_MANT_F16_E32: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.f16 = S0.f16\nelse\nD0.f16 = mantissa(S0.f16)\nendif", + VOP1Op.V_FREXP_EXP_I16_F16_E32: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.i16 = 16'0\nelse\nD0.i16 = 16'I(exponent(S0.f16) - 15 + 1)\nendif", + VOP1Op.V_FLOOR_F16_E32: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 < 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += -16'1.0\nendif", + VOP1Op.V_CEIL_F16_E32: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 > 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += 16'1.0\nendif", + VOP1Op.V_TRUNC_F16_E32: 'D0.f16 = trunc(S0.f16)', + VOP1Op.V_RNDNE_F16_E32: "D0.f16 = floor(S0.f16 + 16'0.5);\nif (isEven(64'F(floor(S0.f16))) && (fract(S0.f16) == 16'0.5)) then\nD0.f16 -= 16'1.0\nendif", + VOP1Op.V_FRACT_F16_E32: 'D0.f16 = S0.f16 + -floor(S0.f16)', + VOP1Op.V_SIN_F16_E32: "D0.f16 = sin(S0.f16 * 16'F(PI * 2.0))", + VOP1Op.V_COS_F16_E32: "D0.f16 = cos(S0.f16 * 16'F(PI * 2.0))", + VOP1Op.V_CVT_NORM_I16_F16_E32: 'D0.i16 = f16_to_snorm(S0.f16)', + VOP1Op.V_CVT_NORM_U16_F16_E32: 'D0.u16 = f16_to_unorm(S0.f16)', + VOP1Op.V_SAT_PK_U8_I16_E32: "SAT8 = lambda(n) (\nif n <= 16'0 then\nreturn 8'0U\nelsif n >= 16'255 then\nreturn 8'255U\nelse\nreturn n[7 : 0].u8\nendif);\ntmp = 16'0;\ntmp[7 : 0].u8 = SAT8(S0[15 : 0].i16);\ntmp[15 : 8].u8 = SAT8(S0[31 : 16].i16);\nD0.b16 = tmp.b16", + VOP1Op.V_SWAP_B32_E32: 'tmp = D0.b32;\nD0.b32 = S0.b32;\nS0.b32 = tmp', + VOP1Op.V_CVT_F32_FP8_E32: 'if SDWA_SRC0_SEL == BYTE1.b3 then\nD0.f32 = fp8_to_f32(S0[15 : 8].fp8)\nelsif SDWA_SRC0_SEL == BYTE2.b3 then\nD0.f32 = fp8_to_f32(S0[23 : 16].fp8)\nelsif SDWA_SRC0_SEL == BYTE3.b3 then\nD0.f32 = fp8_to_f32(S0[31 : 24].fp8)\nelse\n// BYTE0 implied\nD0.f32 = fp8_to_f32(S0[7 : 0].fp8)\nendif', + VOP1Op.V_CVT_F32_BF8_E32: 'if SDWA_SRC0_SEL == BYTE1.b3 then\nD0.f32 = bf8_to_f32(S0[15 : 8].bf8)\nelsif SDWA_SRC0_SEL == BYTE2.b3 then\nD0.f32 = bf8_to_f32(S0[23 : 16].bf8)\nelsif SDWA_SRC0_SEL == BYTE3.b3 then\nD0.f32 = bf8_to_f32(S0[31 : 24].bf8)\nelse\n// BYTE0 implied\nD0.f32 = bf8_to_f32(S0[7 : 0].bf8)\nendif', + VOP1Op.V_CVT_PK_F32_FP8_E32: 'tmp = SDWA_SRC0_SEL[1 : 0] == WORD1.b2 ? S0[31 : 16] : S0[15 : 0];\nD0[31 : 0].f32 = fp8_to_f32(tmp[7 : 0].fp8);\nD0[63 : 32].f32 = fp8_to_f32(tmp[15 : 8].fp8)', + VOP1Op.V_CVT_PK_F32_BF8_E32: 'tmp = SDWA_SRC0_SEL[1 : 0] == WORD1.b2 ? S0[31 : 16] : S0[15 : 0];\nD0[31 : 0].f32 = bf8_to_f32(tmp[7 : 0].bf8);\nD0[63 : 32].f32 = bf8_to_f32(tmp[15 : 8].bf8)', + VOP1Op.V_PRNG_B32_E32: 'in = S0.u32;\nD0.u32 = ((in << 1U) ^ (in[31] ? 197U : 0U))', + VOP1Op.V_PERMLANE16_SWAP_B32_E32: 'for pass in 0 : 1 do\nfor lane in 0 : 15 do\ntmp = VGPR[pass * 32 + lane][SRC0.u32];\nVGPR[pass * 32 + lane][SRC0.u32] = VGPR[pass * 32 + lane + 16][VDST.u32];\nVGPR[pass * 32 + lane + 16][VDST.u32] = tmp\nendfor\nendfor', + VOP1Op.V_PERMLANE32_SWAP_B32_E32: 'for lane in 0 : 31 do\ntmp = VGPR[lane][SRC0.u32];\nVGPR[lane][SRC0.u32] = VGPR[lane + 32][VDST.u32];\nVGPR[lane + 32][VDST.u32] = tmp\nendfor', + VOP1Op.V_CVT_F32_BF16_E32: "D0.f32 = 32'F({ S0.b16, 16'0U })", + VOP2Op.V_CNDMASK_B32_E32: 'D0.u32 = VCC.u64[laneId] ? S1.u32 : S0.u32', + VOP2Op.V_ADD_F32_E32: 'D0.f32 = S0.f32 + S1.f32', + VOP2Op.V_SUB_F32_E32: 'D0.f32 = S0.f32 - S1.f32', + VOP2Op.V_SUBREV_F32_E32: 'D0.f32 = S1.f32 - S0.f32', + VOP2Op.V_FMAC_F64_E32: 'D0.f64 = fma(S0.f64, S1.f64, D0.f64)', + VOP2Op.V_MUL_F32_E32: 'D0.f32 = S0.f32 * S1.f32', + VOP2Op.V_MUL_I32_I24_E32: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24)", + VOP2Op.V_MUL_HI_I32_I24_E32: "D0.i32 = 32'I((64'I(S0.i24) * 64'I(S1.i24)) >> 32U)", + VOP2Op.V_MUL_U32_U24_E32: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24)", + VOP2Op.V_MUL_HI_U32_U24_E32: "D0.u32 = 32'U((64'U(S0.u24) * 64'U(S1.u24)) >> 32U)", + VOP2Op.V_MIN_F32_E32: "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == +0.0) && (64'F(S1.f32) == -0.0)) then\nD0.f32 = S1.f32\nelsif ((64'F(S0.f32) == -0.0) && (64'F(S1.f32) == +0.0)) then\nD0.f32 = S0.f32\nelse\n// Note: there's no IEEE case here like there is for V_MAX_F32.\nD0.f32 = S0.f32 < S1.f32 ? S0.f32 : S1.f32\nendif", + VOP2Op.V_MAX_F32_E32: "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == +0.0) && (64'F(S1.f32) == -0.0)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == -0.0) && (64'F(S1.f32) == +0.0)) then\nD0.f32 = S1.f32\nelsif WAVE_MODE.IEEE then\nD0.f32 = S0.f32 >= S1.f32 ? S0.f32 : S1.f32\nelse\nD0.f32 = S0.f32 > S1.f32 ? S0.f32 : S1.f32\nendif", + VOP2Op.V_MIN_I32_E32: 'D0.i32 = S0.i32 < S1.i32 ? S0.i32 : S1.i32', + VOP2Op.V_MAX_I32_E32: 'D0.i32 = S0.i32 >= S1.i32 ? S0.i32 : S1.i32', + VOP2Op.V_MIN_U32_E32: 'D0.u32 = S0.u32 < S1.u32 ? S0.u32 : S1.u32', + VOP2Op.V_MAX_U32_E32: 'D0.u32 = S0.u32 >= S1.u32 ? S0.u32 : S1.u32', + VOP2Op.V_LSHRREV_B32_E32: 'D0.u32 = (S1.u32 >> S0[4 : 0].u32)', + VOP2Op.V_ASHRREV_I32_E32: 'D0.i32 = (S1.i32 >> S0[4 : 0].u32)', + VOP2Op.V_LSHLREV_B32_E32: 'D0.u32 = (S1.u32 << S0[4 : 0].u32)', + VOP2Op.V_AND_B32_E32: 'D0.u32 = (S0.u32 & S1.u32)', + VOP2Op.V_OR_B32_E32: 'D0.u32 = (S0.u32 | S1.u32)', + VOP2Op.V_XOR_B32_E32: 'D0.u32 = (S0.u32 ^ S1.u32)', + VOP2Op.V_DOT2C_F32_BF16_E32: 'tmp = D0.f32;\ntmp += bf16_to_f32(S0[15 : 0].bf16) * bf16_to_f32(S1[15 : 0].bf16);\ntmp += bf16_to_f32(S0[31 : 16].bf16) * bf16_to_f32(S1[31 : 16].bf16);\nD0.f32 = tmp', + VOP2Op.V_FMAMK_F32_E32: 'D0.f32 = fma(S0.f32, SIMM32.f32, S1.f32)', + VOP2Op.V_FMAAK_F32_E32: 'D0.f32 = fma(S0.f32, S1.f32, SIMM32.f32)', + VOP2Op.V_ADD_CO_U32_E32: "tmp = 64'U(S0.u32) + 64'U(S1.u32);\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADDC_CO_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_SUB_CO_U32_E32: "tmp = S0.u32 - S1.u32;\nVCC.u64[laneId] = S1.u32 > S0.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_SUBREV_CO_U32_E32: "tmp = S1.u32 - S0.u32;\nVCC.u64[laneId] = S0.u32 > S1.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_ADDC_CO_U32_E32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + VCC.u64[laneId].u64;\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADDC_CO_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_SUBB_CO_U32_E32: "tmp = S0.u32 - S1.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S1.u32) + VCC.u64[laneId].u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_SUBBREV_CO_U32_E32: "tmp = S1.u32 - S0.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S0.u32) + VCC.u64[laneId].u64 > 64'U(S1.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_ADD_F16_E32: 'D0.f16 = S0.f16 + S1.f16', + VOP2Op.V_SUB_F16_E32: 'D0.f16 = S0.f16 - S1.f16', + VOP2Op.V_SUBREV_F16_E32: 'D0.f16 = S1.f16 - S0.f16', + VOP2Op.V_MUL_F16_E32: 'D0.f16 = S0.f16 * S1.f16', + VOP2Op.V_MAC_F16_E32: "tmp = S0.f16 * S1.f16 + D0.f16;\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", + VOP2Op.V_MADMK_F16_E32: "tmp = S0.f16 * SIMM16.f16 + S1.f16;\nD0 = { 16'0, tmp.f16 }", + VOP2Op.V_MADAK_F16_E32: "tmp = S0.f16 * S1.f16 + SIMM16.f16;\nD0 = { 16'0, tmp.f16 }", + VOP2Op.V_ADD_U16_E32: 'D0.u16 = S0.u16 + S1.u16', + VOP2Op.V_SUB_U16_E32: 'D0.u16 = S0.u16 - S1.u16', + VOP2Op.V_SUBREV_U16_E32: 'D0.u16 = S1.u16 - S0.u16', + VOP2Op.V_MUL_LO_U16_E32: 'D0.u16 = S0.u16 * S1.u16', + VOP2Op.V_LSHLREV_B16_E32: 'D0.u16 = (S1.u16 << S0[3 : 0].u32)', + VOP2Op.V_LSHRREV_B16_E32: 'D0.u16 = (S1.u16 >> S0[3 : 0].u32)', + VOP2Op.V_ASHRREV_I16_E32: 'D0.i16 = (S1.i16 >> S0[3 : 0].u32)', + VOP2Op.V_MAX_F16_E32: "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == +0.0) && (64'F(S1.f16) == -0.0)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == -0.0) && (64'F(S1.f16) == +0.0)) then\nD0.f16 = S1.f16\nelsif WAVE_MODE.IEEE then\nD0.f16 = S0.f16 >= S1.f16 ? S0.f16 : S1.f16\nelse\nD0.f16 = S0.f16 > S1.f16 ? S0.f16 : S1.f16\nendif", + VOP2Op.V_MIN_F16_E32: "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == +0.0) && (64'F(S1.f16) == -0.0)) then\nD0.f16 = S1.f16\nelsif ((64'F(S0.f16) == -0.0) && (64'F(S1.f16) == +0.0)) then\nD0.f16 = S0.f16\nelse\n// Note: there's no IEEE case here like there is for V_MAX_F16.\nD0.f16 = S0.f16 < S1.f16 ? S0.f16 : S1.f16\nendif", + VOP2Op.V_MAX_U16_E32: 'D0.u16 = S0.u16 >= S1.u16 ? S0.u16 : S1.u16', + VOP2Op.V_MAX_I16_E32: 'D0.i16 = S0.i16 >= S1.i16 ? S0.i16 : S1.i16', + VOP2Op.V_MIN_U16_E32: 'D0.u16 = S0.u16 < S1.u16 ? S0.u16 : S1.u16', + VOP2Op.V_MIN_I16_E32: 'D0.i16 = S0.i16 < S1.i16 ? S0.i16 : S1.i16', + VOP2Op.V_LDEXP_F16_E32: "D0.f16 = S0.f16 * 16'F(2.0F ** 32'I(S1.i16))", + VOP2Op.V_ADD_U32_E32: 'D0.u32 = S0.u32 + S1.u32', + VOP2Op.V_SUB_U32_E32: 'D0.u32 = S0.u32 - S1.u32', + VOP2Op.V_SUBREV_U32_E32: 'D0.u32 = S1.u32 - S0.u32', + VOP2Op.V_DOT2C_F32_F16_E32: 'tmp = D0.f32;\ntmp += f16_to_f32(S0[15 : 0].f16) * f16_to_f32(S1[15 : 0].f16);\ntmp += f16_to_f32(S0[31 : 16].f16) * f16_to_f32(S1[31 : 16].f16);\nD0.f32 = tmp', + VOP2Op.V_DOT2C_I32_I16_E32: 'tmp = D0.i32;\ntmp += i16_to_i32(S0[15 : 0].i16) * i16_to_i32(S1[15 : 0].i16);\ntmp += i16_to_i32(S0[31 : 16].i16) * i16_to_i32(S1[31 : 16].i16);\nD0.i32 = tmp', + VOP2Op.V_DOT4C_I32_I8_E32: 'tmp = D0.i32;\ntmp += i8_to_i32(S0[7 : 0].i8) * i8_to_i32(S1[7 : 0].i8);\ntmp += i8_to_i32(S0[15 : 8].i8) * i8_to_i32(S1[15 : 8].i8);\ntmp += i8_to_i32(S0[23 : 16].i8) * i8_to_i32(S1[23 : 16].i8);\ntmp += i8_to_i32(S0[31 : 24].i8) * i8_to_i32(S1[31 : 24].i8);\nD0.i32 = tmp', + VOP2Op.V_DOT8C_I32_I4_E32: 'tmp = D0.i32;\ntmp += i4_to_i32(S0[3 : 0].i4) * i4_to_i32(S1[3 : 0].i4);\ntmp += i4_to_i32(S0[7 : 4].i4) * i4_to_i32(S1[7 : 4].i4);\ntmp += i4_to_i32(S0[11 : 8].i4) * i4_to_i32(S1[11 : 8].i4);\ntmp += i4_to_i32(S0[15 : 12].i4) * i4_to_i32(S1[15 : 12].i4);\ntmp += i4_to_i32(S0[19 : 16].i4) * i4_to_i32(S1[19 : 16].i4);\ntmp += i4_to_i32(S0[23 : 20].i4) * i4_to_i32(S1[23 : 20].i4);\ntmp += i4_to_i32(S0[27 : 24].i4) * i4_to_i32(S1[27 : 24].i4);\ntmp += i4_to_i32(S0[31 : 28].i4) * i4_to_i32(S1[31 : 28].i4);\nD0.i32 = tmp', + VOP2Op.V_FMAC_F32_E32: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + VOP2Op.V_PK_FMAC_F16_E32: 'D0[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, D0[15 : 0].f16);\nD0[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, D0[31 : 16].f16)', + VOP2Op.V_XNOR_B32_E32: 'D0.u32 = ~(S0.u32 ^ S1.u32)', + VOP3Op.V_CMP_CLASS_F32_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_CLASS_F32_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", + VOP3Op.V_CMP_CLASS_F64_E64: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_CLASS_F64_E64: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", + VOP3Op.V_CMP_CLASS_F16_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_CLASS_F16_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", + VOP3Op.V_CMP_F_F16_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_F16_E64: 'D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F16_E64: 'D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F16_E64: 'D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F16_E64: 'D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F16_E64: 'D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F16_E64: 'D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F16_E64: "D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_U_F16_E64: "D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_NGE_F16_E64: 'D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F16_E64: 'D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F16_E64: 'D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F16_E64: 'D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F16_E64: 'D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F16_E64: 'D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_TRU_F16_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_F16_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LG_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_O_F16_E64: "EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_U_F16_E64: "EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_NGE_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLG_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NGT_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLE_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NEQ_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLT_F16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_TRU_F16_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_F32_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_F32_E64: 'D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F32_E64: 'D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F32_E64: 'D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F32_E64: 'D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F32_E64: 'D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F32_E64: 'D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F32_E64: "D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_U_F32_E64: "D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_NGE_F32_E64: 'D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F32_E64: 'D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F32_E64: 'D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F32_E64: 'D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F32_E64: 'D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F32_E64: 'D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_TRU_F32_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_F32_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LG_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_O_F32_E64: "EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_U_F32_E64: "EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_NGE_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLG_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NGT_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLE_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NEQ_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLT_F32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_TRU_F32_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_F64_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_F64_E64: 'D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F64_E64: 'D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F64_E64: 'D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F64_E64: 'D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F64_E64: 'D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F64_E64: 'D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F64_E64: 'D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_U_F64_E64: 'D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGE_F64_E64: 'D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F64_E64: 'D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F64_E64: 'D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F64_E64: 'D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F64_E64: 'D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F64_E64: 'D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_TRU_F64_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_F64_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LG_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_O_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_U_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NGE_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLG_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NGT_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLE_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NEQ_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NLT_F64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_TRU_F64_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_I16_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_I16_E64: 'D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I16_E64: 'D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I16_E64: 'D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I16_E64: 'D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I16_E64: 'D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I16_E64: 'D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_I16_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_U16_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_U16_E64: 'D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U16_E64: 'D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U16_E64: 'D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U16_E64: 'D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U16_E64: 'D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U16_E64: 'D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_U16_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_I16_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_I16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_I16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_I16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_I16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NE_I16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_I16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_T_I16_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_U16_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_U16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_U16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_U16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_U16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NE_U16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_U16_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_T_U16_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_I32_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_I32_E64: 'D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I32_E64: 'D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I32_E64: 'D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I32_E64: 'D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I32_E64: 'D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I32_E64: 'D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_I32_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_U32_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_U32_E64: 'D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U32_E64: 'D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U32_E64: 'D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U32_E64: 'D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U32_E64: 'D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U32_E64: 'D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_U32_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_I32_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_I32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_I32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_I32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_I32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NE_I32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_I32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_T_I32_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_U32_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_U32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_U32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_U32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_U32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NE_U32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_U32_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_T_U32_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_I64_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_I64_E64: 'D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I64_E64: 'D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I64_E64: 'D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I64_E64: 'D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I64_E64: 'D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I64_E64: 'D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_I64_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_U64_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_U64_E64: 'D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U64_E64: 'D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U64_E64: 'D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U64_E64: 'D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U64_E64: 'D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U64_E64: 'D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_U64_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_I64_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_I64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_I64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_I64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_I64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NE_I64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_I64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_T_I64_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_U64_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_U64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_EQ_U64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_LE_U64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GT_U64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_NE_U64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_GE_U64_E64: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMPX_T_U64_E64: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CNDMASK_B32_E64: 'D0.u32 = VCC.u64[laneId] ? S1.u32 : S0.u32', + VOP3Op.V_ADD_F32_E64: 'D0.f32 = S0.f32 + S1.f32', + VOP3Op.V_SUB_F32_E64: 'D0.f32 = S0.f32 - S1.f32', + VOP3Op.V_SUBREV_F32_E64: 'D0.f32 = S1.f32 - S0.f32', + VOP3Op.V_FMAC_F64_E64: 'D0.f64 = fma(S0.f64, S1.f64, D0.f64)', + VOP3Op.V_MUL_F32_E64: 'D0.f32 = S0.f32 * S1.f32', + VOP3Op.V_MUL_I32_I24_E64: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24)", + VOP3Op.V_MUL_HI_I32_I24_E64: "D0.i32 = 32'I((64'I(S0.i24) * 64'I(S1.i24)) >> 32U)", + VOP3Op.V_MUL_U32_U24_E64: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24)", + VOP3Op.V_MUL_HI_U32_U24_E64: "D0.u32 = 32'U((64'U(S0.u24) * 64'U(S1.u24)) >> 32U)", + VOP3Op.V_MIN_F32_E64: "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == +0.0) && (64'F(S1.f32) == -0.0)) then\nD0.f32 = S1.f32\nelsif ((64'F(S0.f32) == -0.0) && (64'F(S1.f32) == +0.0)) then\nD0.f32 = S0.f32\nelse\n// Note: there's no IEEE case here like there is for V_MAX_F32.\nD0.f32 = S0.f32 < S1.f32 ? S0.f32 : S1.f32\nendif", + VOP3Op.V_MAX_F32_E64: "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == +0.0) && (64'F(S1.f32) == -0.0)) then\nD0.f32 = S0.f32\nelsif ((64'F(S0.f32) == -0.0) && (64'F(S1.f32) == +0.0)) then\nD0.f32 = S1.f32\nelsif WAVE_MODE.IEEE then\nD0.f32 = S0.f32 >= S1.f32 ? S0.f32 : S1.f32\nelse\nD0.f32 = S0.f32 > S1.f32 ? S0.f32 : S1.f32\nendif", + VOP3Op.V_MIN_I32_E64: 'D0.i32 = S0.i32 < S1.i32 ? S0.i32 : S1.i32', + VOP3Op.V_MAX_I32_E64: 'D0.i32 = S0.i32 >= S1.i32 ? S0.i32 : S1.i32', + VOP3Op.V_MIN_U32_E64: 'D0.u32 = S0.u32 < S1.u32 ? S0.u32 : S1.u32', + VOP3Op.V_MAX_U32_E64: 'D0.u32 = S0.u32 >= S1.u32 ? S0.u32 : S1.u32', + VOP3Op.V_LSHRREV_B32_E64: 'D0.u32 = (S1.u32 >> S0[4 : 0].u32)', + VOP3Op.V_ASHRREV_I32_E64: 'D0.i32 = (S1.i32 >> S0[4 : 0].u32)', + VOP3Op.V_LSHLREV_B32_E64: 'D0.u32 = (S1.u32 << S0[4 : 0].u32)', + VOP3Op.V_AND_B32_E64: 'D0.u32 = (S0.u32 & S1.u32)', + VOP3Op.V_OR_B32_E64: 'D0.u32 = (S0.u32 | S1.u32)', + VOP3Op.V_XOR_B32_E64: 'D0.u32 = (S0.u32 ^ S1.u32)', + VOP3Op.V_DOT2C_F32_BF16_E64: 'tmp = D0.f32;\ntmp += bf16_to_f32(S0[15 : 0].bf16) * bf16_to_f32(S1[15 : 0].bf16);\ntmp += bf16_to_f32(S0[31 : 16].bf16) * bf16_to_f32(S1[31 : 16].bf16);\nD0.f32 = tmp', + VOP3Op.V_ADD_F16_E64: 'D0.f16 = S0.f16 + S1.f16', + VOP3Op.V_SUB_F16_E64: 'D0.f16 = S0.f16 - S1.f16', + VOP3Op.V_SUBREV_F16_E64: 'D0.f16 = S1.f16 - S0.f16', + VOP3Op.V_MUL_F16_E64: 'D0.f16 = S0.f16 * S1.f16', + VOP3Op.V_MAC_F16_E64: "tmp = S0.f16 * S1.f16 + D0.f16;\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", + VOP3Op.V_ADD_U16_E64: 'D0.u16 = S0.u16 + S1.u16', + VOP3Op.V_SUB_U16_E64: 'D0.u16 = S0.u16 - S1.u16', + VOP3Op.V_SUBREV_U16_E64: 'D0.u16 = S1.u16 - S0.u16', + VOP3Op.V_MUL_LO_U16_E64: 'D0.u16 = S0.u16 * S1.u16', + VOP3Op.V_LSHLREV_B16_E64: 'D0.u16 = (S1.u16 << S0[3 : 0].u32)', + VOP3Op.V_LSHRREV_B16_E64: 'D0.u16 = (S1.u16 >> S0[3 : 0].u32)', + VOP3Op.V_ASHRREV_I16_E64: 'D0.i16 = (S1.i16 >> S0[3 : 0].u32)', + VOP3Op.V_MAX_F16_E64: "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == +0.0) && (64'F(S1.f16) == -0.0)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == -0.0) && (64'F(S1.f16) == +0.0)) then\nD0.f16 = S1.f16\nelsif WAVE_MODE.IEEE then\nD0.f16 = S0.f16 >= S1.f16 ? S0.f16 : S1.f16\nelse\nD0.f16 = S0.f16 > S1.f16 ? S0.f16 : S1.f16\nendif", + VOP3Op.V_MIN_F16_E64: "if (WAVE_MODE.IEEE && isSignalNAN(64'F(S0.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif (WAVE_MODE.IEEE && isSignalNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((64'F(S0.f16) == +0.0) && (64'F(S1.f16) == -0.0)) then\nD0.f16 = S1.f16\nelsif ((64'F(S0.f16) == -0.0) && (64'F(S1.f16) == +0.0)) then\nD0.f16 = S0.f16\nelse\n// Note: there's no IEEE case here like there is for V_MAX_F16.\nD0.f16 = S0.f16 < S1.f16 ? S0.f16 : S1.f16\nendif", + VOP3Op.V_MAX_U16_E64: 'D0.u16 = S0.u16 >= S1.u16 ? S0.u16 : S1.u16', + VOP3Op.V_MAX_I16_E64: 'D0.i16 = S0.i16 >= S1.i16 ? S0.i16 : S1.i16', + VOP3Op.V_MIN_U16_E64: 'D0.u16 = S0.u16 < S1.u16 ? S0.u16 : S1.u16', + VOP3Op.V_MIN_I16_E64: 'D0.i16 = S0.i16 < S1.i16 ? S0.i16 : S1.i16', + VOP3Op.V_LDEXP_F16_E64: "D0.f16 = S0.f16 * 16'F(2.0F ** 32'I(S1.i16))", + VOP3Op.V_ADD_U32_E64: 'D0.u32 = S0.u32 + S1.u32', + VOP3Op.V_SUB_U32_E64: 'D0.u32 = S0.u32 - S1.u32', + VOP3Op.V_SUBREV_U32_E64: 'D0.u32 = S1.u32 - S0.u32', + VOP3Op.V_DOT2C_F32_F16_E64: 'tmp = D0.f32;\ntmp += f16_to_f32(S0[15 : 0].f16) * f16_to_f32(S1[15 : 0].f16);\ntmp += f16_to_f32(S0[31 : 16].f16) * f16_to_f32(S1[31 : 16].f16);\nD0.f32 = tmp', + VOP3Op.V_DOT2C_I32_I16_E64: 'tmp = D0.i32;\ntmp += i16_to_i32(S0[15 : 0].i16) * i16_to_i32(S1[15 : 0].i16);\ntmp += i16_to_i32(S0[31 : 16].i16) * i16_to_i32(S1[31 : 16].i16);\nD0.i32 = tmp', + VOP3Op.V_DOT4C_I32_I8_E64: 'tmp = D0.i32;\ntmp += i8_to_i32(S0[7 : 0].i8) * i8_to_i32(S1[7 : 0].i8);\ntmp += i8_to_i32(S0[15 : 8].i8) * i8_to_i32(S1[15 : 8].i8);\ntmp += i8_to_i32(S0[23 : 16].i8) * i8_to_i32(S1[23 : 16].i8);\ntmp += i8_to_i32(S0[31 : 24].i8) * i8_to_i32(S1[31 : 24].i8);\nD0.i32 = tmp', + VOP3Op.V_DOT8C_I32_I4_E64: 'tmp = D0.i32;\ntmp += i4_to_i32(S0[3 : 0].i4) * i4_to_i32(S1[3 : 0].i4);\ntmp += i4_to_i32(S0[7 : 4].i4) * i4_to_i32(S1[7 : 4].i4);\ntmp += i4_to_i32(S0[11 : 8].i4) * i4_to_i32(S1[11 : 8].i4);\ntmp += i4_to_i32(S0[15 : 12].i4) * i4_to_i32(S1[15 : 12].i4);\ntmp += i4_to_i32(S0[19 : 16].i4) * i4_to_i32(S1[19 : 16].i4);\ntmp += i4_to_i32(S0[23 : 20].i4) * i4_to_i32(S1[23 : 20].i4);\ntmp += i4_to_i32(S0[27 : 24].i4) * i4_to_i32(S1[27 : 24].i4);\ntmp += i4_to_i32(S0[31 : 28].i4) * i4_to_i32(S1[31 : 28].i4);\nD0.i32 = tmp', + VOP3Op.V_FMAC_F32_E64: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + VOP3Op.V_PK_FMAC_F16_E64: 'D0[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, D0[15 : 0].f16);\nD0[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, D0[31 : 16].f16)', + VOP3Op.V_XNOR_B32_E64: 'D0.u32 = ~(S0.u32 ^ S1.u32)', + VOP3Op.V_MAD_I32_I24_E64: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24) + S2.i32", + VOP3Op.V_MAD_U32_U24_E64: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24) + S2.u32", + VOP3Op.V_CUBEID_F32_E64: '// Set D0.f = cubemap face ID ({0.0, 1.0, ..., 5.0}).\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nif S2.f32 < 0.0F then\nD0.f32 = 5.0F\nelse\nD0.f32 = 4.0F\nendif\nelsif abs(S1.f32) >= abs(S0.f32) then\nif S1.f32 < 0.0F then\nD0.f32 = 3.0F\nelse\nD0.f32 = 2.0F\nendif\nelse\nif S0.f32 < 0.0F then\nD0.f32 = 1.0F\nelse\nD0.f32 = 0.0F\nendif\nendif', + VOP3Op.V_CUBESC_F32_E64: '// D0.f = cubemap S coordinate.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nif S2.f32 < 0.0F then\nD0.f32 = -S0.f32\nelse\nD0.f32 = S0.f32\nendif\nelsif abs(S1.f32) >= abs(S0.f32) then\nD0.f32 = S0.f32\nelse\nif S0.f32 < 0.0F then\nD0.f32 = S2.f32\nelse\nD0.f32 = -S2.f32\nendif\nendif', + VOP3Op.V_CUBETC_F32_E64: '// D0.f = cubemap T coordinate.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nD0.f32 = -S1.f32\nelsif abs(S1.f32) >= abs(S0.f32) then\nif S1.f32 < 0.0F then\nD0.f32 = -S2.f32\nelse\nD0.f32 = S2.f32\nendif\nelse\nD0.f32 = -S1.f32\nendif', + VOP3Op.V_CUBEMA_F32_E64: '// D0.f = 2.0 * cubemap major axis.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nD0.f32 = S2.f32 * 2.0F\nelsif abs(S1.f32) >= abs(S0.f32) then\nD0.f32 = S1.f32 * 2.0F\nelse\nD0.f32 = S0.f32 * 2.0F\nendif', + VOP3Op.V_BFE_U32_E64: 'D0.u32 = ((S0.u32 >> S1[4 : 0].u32) & ((1U << S2[4 : 0].u32) - 1U))', + VOP3Op.V_BFE_I32_E64: 'tmp.i32 = ((S0.i32 >> S1[4 : 0].u32) & ((1 << S2[4 : 0].u32) - 1));\nD0.i32 = signext_from_bit(tmp.i32, S2[4 : 0].u32)', + VOP3Op.V_BFI_B32_E64: 'D0.u32 = ((S0.u32 & S1.u32) | (~S0.u32 & S2.u32))', + VOP3Op.V_FMA_F32_E64: 'D0.f32 = fma(S0.f32, S1.f32, S2.f32)', + VOP3Op.V_FMA_F64_E64: 'D0.f64 = fma(S0.f64, S1.f64, S2.f64)', + VOP3Op.V_LERP_U8_E64: 'tmp = ((S0.u32[31 : 24] + S1.u32[31 : 24] + S2.u32[24].u8) >> 1U << 24U);\ntmp += ((S0.u32[23 : 16] + S1.u32[23 : 16] + S2.u32[16].u8) >> 1U << 16U);\ntmp += ((S0.u32[15 : 8] + S1.u32[15 : 8] + S2.u32[8].u8) >> 1U << 8U);\ntmp += ((S0.u32[7 : 0] + S1.u32[7 : 0] + S2.u32[0].u8) >> 1U);\nD0.u32 = tmp.u32', + VOP3Op.V_ALIGNBIT_B32_E64: "D0.u32 = 32'U(({ S0.u32, S1.u32 } >> S2.u32[4 : 0]) & 0xffffffffLL)", + VOP3Op.V_ALIGNBYTE_B32_E64: "D0.u32 = 32'U(({ S0.u32, S1.u32 } >> (S2.u32[1 : 0] * 8U)) & 0xffffffffLL)", + VOP3Op.V_MIN3_F32_E64: 'D0.f32 = v_min_f32(v_min_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MIN3_I32_E64: 'D0.i32 = v_min_i32(v_min_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_MIN3_U32_E64: 'D0.u32 = v_min_u32(v_min_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MAX3_F32_E64: 'D0.f32 = v_max_f32(v_max_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MAX3_I32_E64: 'D0.i32 = v_max_i32(v_max_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_MAX3_U32_E64: 'D0.u32 = v_max_u32(v_max_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MED3_F32_E64: "if (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)) || isNAN(64'F(S2.f32))) then\nD0.f32 = v_min3_f32(S0.f32, S1.f32, S2.f32)\nelsif v_max3_f32(S0.f32, S1.f32, S2.f32) == S0.f32 then\nD0.f32 = v_max_f32(S1.f32, S2.f32)\nelsif v_max3_f32(S0.f32, S1.f32, S2.f32) == S1.f32 then\nD0.f32 = v_max_f32(S0.f32, S2.f32)\nelse\nD0.f32 = v_max_f32(S0.f32, S1.f32)\nendif", + VOP3Op.V_MED3_I32_E64: 'if v_max3_i32(S0.i32, S1.i32, S2.i32) == S0.i32 then\nD0.i32 = v_max_i32(S1.i32, S2.i32)\nelsif v_max3_i32(S0.i32, S1.i32, S2.i32) == S1.i32 then\nD0.i32 = v_max_i32(S0.i32, S2.i32)\nelse\nD0.i32 = v_max_i32(S0.i32, S1.i32)\nendif', + VOP3Op.V_MED3_U32_E64: 'if v_max3_u32(S0.u32, S1.u32, S2.u32) == S0.u32 then\nD0.u32 = v_max_u32(S1.u32, S2.u32)\nelsif v_max3_u32(S0.u32, S1.u32, S2.u32) == S1.u32 then\nD0.u32 = v_max_u32(S0.u32, S2.u32)\nelse\nD0.u32 = v_max_u32(S0.u32, S1.u32)\nendif', + VOP3Op.V_SAD_U8_E64: "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += 32'U(ABSDIFF(S0.u32[7 : 0], S1.u32[7 : 0]));\ntmp += 32'U(ABSDIFF(S0.u32[15 : 8], S1.u32[15 : 8]));\ntmp += 32'U(ABSDIFF(S0.u32[23 : 16], S1.u32[23 : 16]));\ntmp += 32'U(ABSDIFF(S0.u32[31 : 24], S1.u32[31 : 24]));\nD0.u32 = tmp", + VOP3Op.V_SAD_HI_U8_E64: "D0.u32 = (32'U(v_sad_u8(S0, S1, 0U)) << 16U) + S2.u32", + VOP3Op.V_SAD_U16_E64: 'ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += ABSDIFF(S0[15 : 0].u16, S1[15 : 0].u16);\ntmp += ABSDIFF(S0[31 : 16].u16, S1[31 : 16].u16);\nD0.u32 = tmp', + VOP3Op.V_SAD_U32_E64: 'ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\nD0.u32 = ABSDIFF(S0.u32, S1.u32) + S2.u32', + VOP3Op.V_CVT_PK_U8_F32_E64: "tmp = (S2.u32 & 32'U(~(0xff << (S1.u32[1 : 0].u32 * 8U))));\ntmp = (tmp | ((32'U(f32_to_u8(S0.f32)) & 255U) << (S1.u32[1 : 0].u32 * 8U)));\nD0.u32 = tmp", + VOP3Op.V_DIV_FIXUP_F32_E64: "sign_out = (sign(S1.f32) ^ sign(S2.f32));\nif isNAN(64'F(S2.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S2.f32)))\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif ((64'F(S1.f32) == 0.0) && (64'F(S2.f32) == 0.0)) then\n// 0/0\nD0.f32 = 32'F(0xffc00000)\nelsif ((64'F(abs(S1.f32)) == +INF) && (64'F(abs(S2.f32)) == +INF)) then\n// inf/inf\nD0.f32 = 32'F(0xffc00000)\nelsif ((64'F(S1.f32) == 0.0) || (64'F(abs(S2.f32)) == +INF)) then\n// x/0, or inf/y\nD0.f32 = sign_out ? -INF.f32 : +INF.f32\nelsif ((64'F(abs(S1.f32)) == +INF) || (64'F(S2.f32) == 0.0)) then\n// x/inf, 0/y\nD0.f32 = sign_out ? -0.0F : 0.0F\nelsif exponent(S2.f32) - exponent(S1.f32) < -150 then\nD0.f32 = sign_out ? -UNDERFLOW_F32 : UNDERFLOW_F32\nelsif exponent(S1.f32) == 255 then\nD0.f32 = sign_out ? -OVERFLOW_F32 : OVERFLOW_F32\nelse\nD0.f32 = sign_out ? -abs(S0.f32) : abs(S0.f32)\nendif", + VOP3Op.V_DIV_FIXUP_F64_E64: "sign_out = (sign(S1.f64) ^ sign(S2.f64));\nif isNAN(S2.f64) then\nD0.f64 = cvtToQuietNAN(S2.f64)\nelsif isNAN(S1.f64) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif ((S1.f64 == 0.0) && (S2.f64 == 0.0)) then\n// 0/0\nD0.f64 = 64'F(0xfff8000000000000LL)\nelsif ((abs(S1.f64) == +INF) && (abs(S2.f64) == +INF)) then\n// inf/inf\nD0.f64 = 64'F(0xfff8000000000000LL)\nelsif ((S1.f64 == 0.0) || (abs(S2.f64) == +INF)) then\n// x/0, or inf/y\nD0.f64 = sign_out ? -INF : +INF\nelsif ((abs(S1.f64) == +INF) || (S2.f64 == 0.0)) then\n// x/inf, 0/y\nD0.f64 = sign_out ? -0.0 : 0.0\nelsif exponent(S2.f64) - exponent(S1.f64) < -1075 then\nD0.f64 = sign_out ? -UNDERFLOW_F64 : UNDERFLOW_F64\nelsif exponent(S1.f64) == 2047 then\nD0.f64 = sign_out ? -OVERFLOW_F64 : OVERFLOW_F64\nelse\nD0.f64 = sign_out ? -abs(S0.f64) : abs(S0.f64)\nendif", + VOP3Op.V_DIV_FMAS_F32_E64: 'if VCC.u64[laneId] then\nD0.f32 = 2.0F ** 32 * fma(S0.f32, S1.f32, S2.f32)\nelse\nD0.f32 = fma(S0.f32, S1.f32, S2.f32)\nendif', + VOP3Op.V_DIV_FMAS_F64_E64: 'if VCC.u64[laneId] then\nD0.f64 = 2.0 ** 64 * fma(S0.f64, S1.f64, S2.f64)\nelse\nD0.f64 = fma(S0.f64, S1.f64, S2.f64)\nendif', + VOP3Op.V_MSAD_U8_E64: "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += S1.u32[7 : 0] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[7 : 0], S1.u32[7 : 0]));\ntmp += S1.u32[15 : 8] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[15 : 8], S1.u32[15 : 8]));\ntmp += S1.u32[23 : 16] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[23 : 16], S1.u32[23 : 16]));\ntmp += S1.u32[31 : 24] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[31 : 24], S1.u32[31 : 24]));\nD0.u32 = tmp", + VOP3Op.V_QSAD_PK_U16_U8_E64: "tmp[63 : 48] = 16'B(v_sad_u8(S0[55 : 24], S1[31 : 0], S2[63 : 48].u32));\ntmp[47 : 32] = 16'B(v_sad_u8(S0[47 : 16], S1[31 : 0], S2[47 : 32].u32));\ntmp[31 : 16] = 16'B(v_sad_u8(S0[39 : 8], S1[31 : 0], S2[31 : 16].u32));\ntmp[15 : 0] = 16'B(v_sad_u8(S0[31 : 0], S1[31 : 0], S2[15 : 0].u32));\nD0.b64 = tmp.b64", + VOP3Op.V_MQSAD_PK_U16_U8_E64: "tmp[63 : 48] = 16'B(v_msad_u8(S0[55 : 24], S1[31 : 0], S2[63 : 48].u32));\ntmp[47 : 32] = 16'B(v_msad_u8(S0[47 : 16], S1[31 : 0], S2[47 : 32].u32));\ntmp[31 : 16] = 16'B(v_msad_u8(S0[39 : 8], S1[31 : 0], S2[31 : 16].u32));\ntmp[15 : 0] = 16'B(v_msad_u8(S0[31 : 0], S1[31 : 0], S2[15 : 0].u32));\nD0.b64 = tmp.b64", + VOP3Op.V_MQSAD_U32_U8_E64: "tmp[127 : 96] = 32'B(v_msad_u8(S0[55 : 24], S1[31 : 0], S2[127 : 96].u32));\ntmp[95 : 64] = 32'B(v_msad_u8(S0[47 : 16], S1[31 : 0], S2[95 : 64].u32));\ntmp[63 : 32] = 32'B(v_msad_u8(S0[39 : 8], S1[31 : 0], S2[63 : 32].u32));\ntmp[31 : 0] = 32'B(v_msad_u8(S0[31 : 0], S1[31 : 0], S2[31 : 0].u32));\nD0.b128 = tmp.b128", + VOP3Op.V_MAD_LEGACY_F16_E64: "tmp = S0.f16 * S1.f16 + S2.f16;\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", + VOP3Op.V_MAD_LEGACY_U16_E64: "tmp = S0.u16 * S1.u16 + S2.u16;\nif OPSEL.u4[3] then\nD0 = { tmp.u16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.u16 }\nendif", + VOP3Op.V_MAD_LEGACY_I16_E64: "tmp = S0.i16 * S1.i16 + S2.i16;\nif OPSEL.u4[3] then\nD0 = { tmp.i16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.i16 }\nendif", + VOP3Op.V_PERM_B32_E64: "BYTE_PERMUTE = lambda(data, sel) (\ndeclare in : 8'B[8];\nfor i in 0 : 7 do\nin[i] = data[i * 8 + 7 : i * 8].b8\nendfor;\nif sel.u32 >= 13U then\nreturn 8'0xff\nelsif sel.u32 == 12U then\nreturn 8'0x0\nelsif sel.u32 == 11U then\nreturn in[7][7].b8 * 8'0xff\nelsif sel.u32 == 10U then\nreturn in[5][7].b8 * 8'0xff\nelsif sel.u32 == 9U then\nreturn in[3][7].b8 * 8'0xff\nelsif sel.u32 == 8U then\nreturn in[1][7].b8 * 8'0xff\nelse\nreturn in[sel]\nendif);\nD0[31 : 24] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[31 : 24]);\nD0[23 : 16] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[23 : 16]);\nD0[15 : 8] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[15 : 8]);\nD0[7 : 0] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[7 : 0])", + VOP3Op.V_FMA_LEGACY_F16_E64: "tmp = fma(S0.f16, S1.f16, S2.f16);\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", + VOP3Op.V_DIV_FIXUP_LEGACY_F16_E64: "sign_out = (sign(S1.f16) ^ sign(S2.f16));\nif isNAN(64'F(S2.f16)) then\ntmp = cvtToQuietNAN(64'F(S2.f16))\nelsif isNAN(64'F(S1.f16)) then\ntmp = cvtToQuietNAN(64'F(S1.f16))\nelsif ((64'F(S1.f16) == 0.0) && (64'F(S2.f16) == 0.0)) then\n// 0/0\ntmp = 16'F(0xfe00)\nelsif ((64'F(abs(S1.f16)) == +INF) && (64'F(abs(S2.f16)) == +INF)) then\n// inf/inf\ntmp = 16'F(0xfe00)\nelsif ((64'F(S1.f16) == 0.0) || (64'F(abs(S2.f16)) == +INF)) then\n// x/0, or inf/y\ntmp = sign_out ? -INF : +INF\nelsif ((64'F(abs(S1.f16)) == +INF) || (64'F(S2.f16) == 0.0)) then\n// x/inf, 0/y\ntmp = sign_out ? -0.0 : 0.0\nelse\ntmp = sign_out ? -abs(S0.f16) : abs(S0.f16)\nendif;\nif OPSEL.u4[3] then\nD0 = { tmp.f16, D0[15 : 0] }\nelse\nD0 = { 16'0, tmp.f16 }\nendif", + VOP3Op.V_CVT_PKACCUM_U8_F32_E64: "byte = S1.u32[1 : 0];\nbit = byte.u32 * 8U;\nD0.u32[bit + 7U : bit] = 32'U(f32_to_u8(S0.f32))", + VOP3Op.V_MAD_U32_U16_E64: "D0.u32 = 32'U(S0.u16) * 32'U(S1.u16) + S2.u32", + VOP3Op.V_MAD_I32_I16_E64: "D0.i32 = 32'I(S0.i16) * 32'I(S1.i16) + S2.i32", + VOP3Op.V_XAD_U32_E64: 'D0.u32 = (S0.u32 ^ S1.u32) + S2.u32', + VOP3Op.V_MIN3_F16_E64: 'D0.f16 = v_min_f16(v_min_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MIN3_I16_E64: 'D0.i16 = v_min_i16(v_min_i16(S0.i16, S1.i16), S2.i16)', + VOP3Op.V_MIN3_U16_E64: 'D0.u16 = v_min_u16(v_min_u16(S0.u16, S1.u16), S2.u16)', + VOP3Op.V_MAX3_F16_E64: 'D0.f16 = v_max_f16(v_max_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MAX3_I16_E64: 'D0.i16 = v_max_i16(v_max_i16(S0.i16, S1.i16), S2.i16)', + VOP3Op.V_MAX3_U16_E64: 'D0.u16 = v_max_u16(v_max_u16(S0.u16, S1.u16), S2.u16)', + VOP3Op.V_MED3_F16_E64: "if (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)) || isNAN(64'F(S2.f16))) then\nD0.f16 = v_min3_f16(S0.f16, S1.f16, S2.f16)\nelsif v_max3_f16(S0.f16, S1.f16, S2.f16) == S0.f16 then\nD0.f16 = v_max_f16(S1.f16, S2.f16)\nelsif v_max3_f16(S0.f16, S1.f16, S2.f16) == S1.f16 then\nD0.f16 = v_max_f16(S0.f16, S2.f16)\nelse\nD0.f16 = v_max_f16(S0.f16, S1.f16)\nendif", + VOP3Op.V_MED3_I16_E64: 'if v_max3_i16(S0.i16, S1.i16, S2.i16) == S0.i16 then\nD0.i16 = v_max_i16(S1.i16, S2.i16)\nelsif v_max3_i16(S0.i16, S1.i16, S2.i16) == S1.i16 then\nD0.i16 = v_max_i16(S0.i16, S2.i16)\nelse\nD0.i16 = v_max_i16(S0.i16, S1.i16)\nendif', + VOP3Op.V_MED3_U16_E64: 'if v_max3_u16(S0.u16, S1.u16, S2.u16) == S0.u16 then\nD0.u16 = v_max_u16(S1.u16, S2.u16)\nelsif v_max3_u16(S0.u16, S1.u16, S2.u16) == S1.u16 then\nD0.u16 = v_max_u16(S0.u16, S2.u16)\nelse\nD0.u16 = v_max_u16(S0.u16, S1.u16)\nendif', + VOP3Op.V_LSHL_ADD_U32_E64: 'D0.u32 = (S0.u32 << S1.u32[4 : 0].u32) + S2.u32', + VOP3Op.V_ADD_LSHL_U32_E64: 'D0.u32 = ((S0.u32 + S1.u32) << S2.u32[4 : 0].u32)', + VOP3Op.V_ADD3_U32_E64: 'D0.u32 = S0.u32 + S1.u32 + S2.u32', + VOP3Op.V_LSHL_OR_B32: 'D0.u32 = ((S0.u32 << S1.u32[4 : 0].u32) | S2.u32)', + VOP3Op.V_AND_OR_B32: 'D0.u32 = ((S0.u32 & S1.u32) | S2.u32)', + VOP3Op.V_OR3_B32: 'D0.u32 = (S0.u32 | S1.u32 | S2.u32)', + VOP3Op.V_MAD_F16: 'D0.f16 = S0.f16 * S1.f16 + S2.f16', + VOP3Op.V_MAD_U16: 'D0.u16 = S0.u16 * S1.u16 + S2.u16', + VOP3Op.V_MAD_I16: 'D0.i16 = S0.i16 * S1.i16 + S2.i16', + VOP3Op.V_FMA_F16: 'D0.f16 = fma(S0.f16, S1.f16, S2.f16)', + VOP3Op.V_DIV_FIXUP_F16: "sign_out = (sign(S1.f16) ^ sign(S2.f16));\nif isNAN(64'F(S2.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S2.f16)))\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif ((64'F(S1.f16) == 0.0) && (64'F(S2.f16) == 0.0)) then\n// 0/0\nD0.f16 = 16'F(0xfe00)\nelsif ((64'F(abs(S1.f16)) == +INF) && (64'F(abs(S2.f16)) == +INF)) then\n// inf/inf\nD0.f16 = 16'F(0xfe00)\nelsif ((64'F(S1.f16) == 0.0) || (64'F(abs(S2.f16)) == +INF)) then\n// x/0, or inf/y\nD0.f16 = sign_out ? -INF.f16 : +INF.f16\nelsif ((64'F(abs(S1.f16)) == +INF) || (64'F(S2.f16) == 0.0)) then\n// x/inf, 0/y\nD0.f16 = sign_out ? -16'0.0 : 16'0.0\nelse\nD0.f16 = sign_out ? -abs(S0.f16) : abs(S0.f16)\nendif", + VOP3Op.V_LSHL_ADD_U64: 'D0.u64 = (S0.u64 << S1.u32[2 : 0].u32) + S2.u64', + VOP3Op.V_BITOP3_B16: "TTBL = { INST.OMOD[1 : 0], INST.ABS[2 : 0], INST.NEG[2 : 0] };\ntmp = 16'0U;\ntmp = (tmp | (32'I(TTBL.b32 & 0x1) != 0 ? 16'U(~S0.b16 & ~S1.b16 & ~S2.b16) : 16'0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x2) != 0 ? 16'U(~S0.b16 & ~S1.b16 & S2.b16) : 16'0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x4) != 0 ? 16'U(~S0.b16 & S1.b16 & ~S2.b16) : 16'0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x8) != 0 ? 16'U(~S0.b16 & S1.b16 & S2.b16) : 16'0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x10) != 0 ? 16'U(S0.b16 & ~S1.b16 & ~S2.b16) : 16'0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x20) != 0 ? 16'U(S0.b16 & ~S1.b16 & S2.b16) : 16'0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x40) != 0 ? 16'U(S0.b16 & S1.b16 & ~S2.b16) : 16'0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x80) != 0 ? 16'U(S0.b16 & S1.b16 & S2.b16) : 16'0U));\nD.b16 = tmp.b16", + VOP3Op.V_BITOP3_B32: "TTBL = { INST.OMOD[1 : 0], INST.ABS[2 : 0], INST.NEG[2 : 0] };\ntmp = 0U;\ntmp = (tmp | (32'I(TTBL.b32 & 0x1) != 0 ? 32'U(~S0.b32 & ~S1.b32 & ~S2.b32) : 0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x2) != 0 ? 32'U(~S0.b32 & ~S1.b32 & S2.b32) : 0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x4) != 0 ? 32'U(~S0.b32 & S1.b32 & ~S2.b32) : 0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x8) != 0 ? 32'U(~S0.b32 & S1.b32 & S2.b32) : 0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x10) != 0 ? 32'U(S0.b32 & ~S1.b32 & ~S2.b32) : 0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x20) != 0 ? 32'U(S0.b32 & ~S1.b32 & S2.b32) : 0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x40) != 0 ? 32'U(S0.b32 & S1.b32 & ~S2.b32) : 0U));\ntmp = (tmp | (32'I(TTBL.b32 & 0x80) != 0 ? 32'U(S0.b32 & S1.b32 & S2.b32) : 0U));\nD.b32 = tmp.b32", + VOP3Op.V_CVT_SCALEF32_PK_FP8_F32: "scale = 32'U(exponent(S2.f32));\ntmp0 = f32_to_fp8_scale(S0.f32, scale.u8);\ntmp1 = f32_to_fp8_scale(S1.f32, scale.u8);\ndstword = OPSEL[3].i32 * 16;\nVGPR[laneId][VDST.u32][dstword + 15 : dstword].b16 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_BF8_F32: "scale = 32'U(exponent(S2.f32));\ntmp0 = f32_to_bf8_scale(S0.f32, scale.u8);\ntmp1 = f32_to_bf8_scale(S1.f32, scale.u8);\ndstword = OPSEL[3].i32 * 16;\nVGPR[laneId][VDST.u32][dstword + 15 : dstword].b16 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_FP8_F32: "scale = 32'U(exponent(S2.f32));\ntmp = f32_to_fp8_sr_scale(S0.f32, S1.u32, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].fp8 = tmp;\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_BF8_F32: "scale = 32'U(exponent(S2.f32));\ntmp = f32_to_bf8_sr_scale(S0.f32, S1.u32, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].bf8 = tmp;\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_F32_FP8: "scale = 32'U(exponent(S1.f32));\nsrcword = OPSEL[0].i32 * 16;\nsrc = VGPR[laneId][SRC0.u32][srcword + 15 : srcword].b16;\ntmp0 = fp8_to_f32_scale(src[7 : 0].fp8, scale.u8);\ntmp1 = fp8_to_f32_scale(src[15 : 8].fp8, scale.u8);\nD0[31 : 0].f32 = tmp0;\nD0[63 : 32].f32 = tmp1", + VOP3Op.V_CVT_SCALEF32_PK_F32_BF8: "scale = 32'U(exponent(S1.f32));\nsrcword = OPSEL[0].i32 * 16;\nsrc = VGPR[laneId][SRC0.u32][srcword + 15 : srcword].b16;\ntmp0 = bf8_to_f32_scale(src[7 : 0].bf8, scale.u8);\ntmp1 = bf8_to_f32_scale(src[15 : 8].bf8, scale.u8);\nD0[31 : 0].f32 = tmp0;\nD0[63 : 32].f32 = tmp1", + VOP3Op.V_CVT_SCALEF32_F32_FP8: "scale = 32'U(exponent(S1.f32));\nsrcbyte = OPSEL[1 : 0].i32 * 8;\nsrc = VGPR[laneId][SRC0.u32][srcbyte + 7 : srcbyte].fp8;\ntmp = fp8_to_f32_scale(src, scale.u8);\nD0 = tmp.b32", + VOP3Op.V_CVT_SCALEF32_F32_BF8: "scale = 32'U(exponent(S1.f32));\nsrcbyte = OPSEL[1 : 0].i32 * 8;\nsrc = VGPR[laneId][SRC0.u32][srcbyte + 7 : srcbyte].bf8;\ntmp = bf8_to_f32_scale(src, scale.u8);\nD0 = tmp.b32", + VOP3Op.V_CVT_SCALEF32_PK_FP4_F32: "scale = 32'U(exponent(S2.f32));\ntmp0 = f32_to_fp4_scale(S0.f32, scale.u8);\ntmp1 = f32_to_fp4_scale(S1.f32, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].b8 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_F32: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ntmp0 = f32_to_fp4_sr_scale(S0[31 : 0].f32, randomVal, scale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32));\ntmp1 = f32_to_fp4_sr_scale(S0[63 : 32].f32, randomVal, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].b8 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_F32_FP4: "scale = 32'U(exponent(S1.f32));\nsrcbyte = OPSEL[1 : 0].i32 * 8;\nsrc = VGPR[laneId][SRC0.u32][srcbyte + 7 : srcbyte].b8;\ntmp0 = fp4_to_f32_scale(src[3 : 0].fp4, scale.u8);\ntmp1 = fp4_to_f32_scale(src[7 : 4].fp4, scale.u8);\nD0[31 : 0].f32 = tmp0;\nD0[63 : 32].f32 = tmp1", + VOP3Op.V_CVT_SCALEF32_PK_FP8_F16: "scale = 32'U(exponent(S1.f32));\ntmp0 = f16_to_fp8_scale(S0[15 : 0].f16, scale.u8);\ntmp1 = f16_to_fp8_scale(S0[31 : 16].f16, scale.u8);\ndstword = OPSEL[3].i32 * 16;\nVGPR[laneId][VDST.u32][dstword + 15 : dstword].b16 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_BF8_F16: "scale = 32'U(exponent(S1.f32));\ntmp0 = f16_to_bf8_scale(S0[15 : 0].f16, scale.u8);\ntmp1 = f16_to_bf8_scale(S0[31 : 16].f16, scale.u8);\ndstword = OPSEL[3].i32 * 16;\nVGPR[laneId][VDST.u32][dstword + 15 : dstword].b16 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_FP8_F16: "scale = 32'U(exponent(S2.f32));\ntmp = f16_to_fp8_sr_scale(S0.f16, S1.u32, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].fp8 = tmp;\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_BF8_F16: "scale = 32'U(exponent(S2.f32));\ntmp = f16_to_bf8_sr_scale(S0.f16, S1.u32, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].bf8 = tmp;\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_FP8_BF16: "scale = 32'U(exponent(S1.f32));\ntmp0 = bf16_to_fp8_scale(S0[15 : 0].bf16, scale.u8);\ntmp1 = bf16_to_fp8_scale(S0[31 : 16].bf16, scale.u8);\ndstword = OPSEL[3].i32 * 16;\nVGPR[laneId][VDST.u32][dstword + 15 : dstword].b16 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_BF8_BF16: "scale = 32'U(exponent(S1.f32));\ntmp0 = bf16_to_bf8_scale(S0[15 : 0].bf16, scale.u8);\ntmp1 = bf16_to_bf8_scale(S0[31 : 16].bf16, scale.u8);\ndstword = OPSEL[3].i32 * 16;\nVGPR[laneId][VDST.u32][dstword + 15 : dstword].b16 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_FP8_BF16: "scale = 32'U(exponent(S2.f32));\ntmp = bf16_to_fp8_sr_scale(S0.bf16, S1.u32, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].fp8 = tmp;\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_BF8_BF16: "scale = 32'U(exponent(S2.f32));\ntmp = bf16_to_bf8_sr_scale(S0.bf16, S1.u32, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].bf8 = tmp;\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_F16_FP8: "scale = 32'U(exponent(S1.f32));\nsrcword = OPSEL[0].i32 * 16;\nsrc = VGPR[laneId][SRC0.u32][srcword + 15 : srcword].b16;\ntmp0 = fp8_to_f16_scale(src[7 : 0].fp8, scale.u8);\ntmp1 = fp8_to_f16_scale(src[15 : 8].fp8, scale.u8);\nD0[15 : 0].f16 = tmp0;\nD0[31 : 16].f16 = tmp1", + VOP3Op.V_CVT_SCALEF32_PK_F16_BF8: "scale = 32'U(exponent(S1.f32));\nsrcword = OPSEL[0].i32 * 16;\nsrc = VGPR[laneId][SRC0.u32][srcword + 15 : srcword].b16;\ntmp0 = bf8_to_f16_scale(src[7 : 0].bf8, scale.u8);\ntmp1 = bf8_to_f16_scale(src[15 : 8].bf8, scale.u8);\nD0[15 : 0].f16 = tmp0;\nD0[31 : 16].f16 = tmp1", + VOP3Op.V_CVT_SCALEF32_F16_FP8: "scale = 32'U(exponent(S1.f32));\nsrcbyte = OPSEL[1 : 0].i32 * 8;\nsrc = VGPR[laneId][SRC0.u32][srcbyte + 7 : srcbyte].fp8;\ntmp = fp8_to_f16_scale(src, scale.u8);\n// OPSEL[3] controls destination hi/lo\nD0 = tmp.b32", + VOP3Op.V_CVT_SCALEF32_F16_BF8: "scale = 32'U(exponent(S1.f32));\nsrcbyte = OPSEL[1 : 0].i32 * 8;\nsrc = VGPR[laneId][SRC0.u32][srcbyte + 7 : srcbyte].bf8;\ntmp = bf8_to_f16_scale(src, scale.u8);\n// OPSEL[3] controls destination hi/lo\nD0 = tmp.b32", + VOP3Op.V_CVT_SCALEF32_PK_FP4_F16: "scale = 32'U(exponent(S1.f32));\ntmp0 = f16_to_fp4_scale(S0[15 : 0].f16, scale.u8);\ntmp1 = f16_to_fp4_scale(S0[31 : 16].f16, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].b8 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_FP4_BF16: "scale = 32'U(exponent(S1.f32));\ntmp0 = bf16_to_fp4_scale(S0[15 : 0].bf16, scale.u8);\ntmp1 = bf16_to_fp4_scale(S0[31 : 16].bf16, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].b8 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_F16: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ntmp0 = f16_to_fp4_sr_scale(S0[15 : 0].f16, randomVal, scale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32));\ntmp1 = f16_to_fp4_sr_scale(S0[31 : 16].f16, randomVal, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].b8 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_SR_PK_FP4_BF16: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ntmp0 = bf16_to_fp4_sr_scale(S0[15 : 0].bf16, randomVal, scale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32));\ntmp1 = bf16_to_fp4_sr_scale(S0[31 : 16].bf16, randomVal, scale.u8);\ndstbyte = OPSEL[3 : 2].i32 * 8;\nVGPR[laneId][VDST.u32][dstbyte + 7 : dstbyte].b8 = { tmp1, tmp0 };\n// Other destination bits are preserved", + VOP3Op.V_CVT_SCALEF32_PK_F16_FP4: "scale = 32'U(exponent(S1.f32));\nsrcbyte = OPSEL[1 : 0].i32 * 8;\nsrc = VGPR[laneId][SRC0.u32][srcbyte + 7 : srcbyte].b8;\ntmp0 = fp4_to_f16_scale(src[3 : 0].fp4, scale.u8);\ntmp1 = fp4_to_f16_scale(src[7 : 4].fp4, scale.u8);\nD0[15 : 0].f16 = tmp0;\nD0[31 : 16].f16 = tmp1", + VOP3Op.V_CVT_SCALEF32_PK_BF16_FP4: "scale = 32'U(exponent(S1.f32));\nsrcbyte = OPSEL[1 : 0].i32 * 8;\nsrc = VGPR[laneId][SRC0.u32][srcbyte + 7 : srcbyte].b8;\ntmp0 = fp4_to_bf16_scale(src[3 : 0].fp4, scale.u8);\ntmp1 = fp4_to_bf16_scale(src[7 : 4].fp4, scale.u8);\nD0[15 : 0].bf16 = tmp0;\nD0[31 : 16].bf16 = tmp1", + VOP3Op.V_CVT_SCALEF32_2XPK16_FP6_F32: "scale = 32'U(exponent(S2.f32));\ndeclare tmp : 192'B;\nfor pass in 0 : 15 do\ndOffset = pass * 12;\nsOffset = pass * 32;\n// Note that S0 and S1 inputs are interleaved in the packed result.\ntmp[dOffset + 5 : dOffset].fp6 = f32_to_fp6_scale(S0[sOffset + 31 : sOffset].f32, scale.u8);\ntmp[dOffset + 11 : dOffset + 6].fp6 = f32_to_fp6_scale(S1[sOffset + 31 : sOffset].f32, scale.u8)\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_2XPK16_BF6_F32: "scale = 32'U(exponent(S2.f32));\ndeclare tmp : 192'B;\nfor pass in 0 : 15 do\ndOffset = pass * 12;\nsOffset = pass * 32;\n// Note that S0 and S1 inputs are interleaved in the packed result.\ntmp[dOffset + 5 : dOffset].bf6 = f32_to_bf6_scale(S0[sOffset + 31 : sOffset].f32, scale.u8);\ntmp[dOffset + 11 : dOffset + 6].bf6 = f32_to_bf6_scale(S1[sOffset + 31 : sOffset].f32, scale.u8)\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_F32: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 32;\ntmp[dOffset + 5 : dOffset].fp6 = f32_to_fp6_sr_scale(S0[sOffset + 31 : sOffset].f32, randomVal,\nscale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32))\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_F32: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 32;\ntmp[dOffset + 5 : dOffset].bf6 = f32_to_bf6_sr_scale(S0[sOffset + 31 : sOffset].f32, randomVal,\nscale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32))\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_PK32_F32_FP6: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 1024'B;\nfor pass in 0 : 31 do\ndOffset = pass * 32;\nsOffset = pass * 6;\ntmp[dOffset + 31 : dOffset].f32 = fp6_to_f32_scale(S0[sOffset + 5 : sOffset].fp6, scale.u8)\nendfor;\nD0[1023 : 0] = tmp.b1024", + VOP3Op.V_CVT_SCALEF32_PK32_F32_BF6: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 1024'B;\nfor pass in 0 : 31 do\ndOffset = pass * 32;\nsOffset = pass * 6;\ntmp[dOffset + 31 : dOffset].f32 = bf6_to_f32_scale(S0[sOffset + 5 : sOffset].bf6, scale.u8)\nendfor;\nD0[1023 : 0] = tmp.b1024", + VOP3Op.V_CVT_SCALEF32_PK32_FP6_F16: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 16;\ntmp[dOffset + 5 : dOffset].fp6 = f16_to_fp6_scale(S0[sOffset + 15 : sOffset].f16, scale.u8)\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_PK32_FP6_BF16: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 16;\ntmp[dOffset + 5 : dOffset].fp6 = bf16_to_fp6_scale(S0[sOffset + 15 : sOffset].bf16, scale.u8)\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_PK32_BF6_F16: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 16;\ntmp[dOffset + 5 : dOffset].bf6 = f16_to_bf6_scale(S0[sOffset + 15 : sOffset].f16, scale.u8)\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_PK32_BF6_BF16: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 16;\ntmp[dOffset + 5 : dOffset].bf6 = bf16_to_bf6_scale(S0[sOffset + 15 : sOffset].bf16, scale.u8)\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_F16: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 16;\ntmp[dOffset + 5 : dOffset].fp6 = f16_to_fp6_sr_scale(S0[sOffset + 15 : sOffset].f16, randomVal,\nscale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32))\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_SR_PK32_FP6_BF16: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 16;\ntmp[dOffset + 5 : dOffset].fp6 = bf16_to_fp6_sr_scale(S0[sOffset + 15 : sOffset].bf16, randomVal,\nscale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32))\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_F16: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 16;\ntmp[dOffset + 5 : dOffset].bf6 = f16_to_bf6_sr_scale(S0[sOffset + 15 : sOffset].f16, randomVal,\nscale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32))\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_SR_PK32_BF6_BF16: "scale = 32'U(exponent(S2.f32));\nrandomVal = S1.u32;\ndeclare tmp : 192'B;\nfor pass in 0 : 31 do\ndOffset = pass * 6;\nsOffset = pass * 16;\ntmp[dOffset + 5 : dOffset].bf6 = bf16_to_bf6_sr_scale(S0[sOffset + 15 : sOffset].bf16, randomVal,\nscale.u8);\nrandomVal = 32'U(v_prng_b32(randomVal.b32))\nendfor;\nD0[191 : 0] = tmp.b192", + VOP3Op.V_CVT_SCALEF32_PK32_F16_FP6: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 512'B;\nfor pass in 0 : 31 do\ndOffset = pass * 16;\nsOffset = pass * 6;\ntmp[dOffset + 15 : dOffset].f16 = fp6_to_f16_scale(S0[sOffset + 5 : sOffset].fp6, scale.u8)\nendfor;\nD0[511 : 0] = tmp.b512", + VOP3Op.V_CVT_SCALEF32_PK32_BF16_FP6: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 512'B;\nfor pass in 0 : 31 do\ndOffset = pass * 16;\nsOffset = pass * 6;\ntmp[dOffset + 15 : dOffset].bf16 = fp6_to_bf16_scale(S0[sOffset + 5 : sOffset].fp6, scale.u8)\nendfor;\nD0[511 : 0] = tmp.b512", + VOP3Op.V_CVT_SCALEF32_PK32_F16_BF6: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 512'B;\nfor pass in 0 : 31 do\ndOffset = pass * 16;\nsOffset = pass * 6;\ntmp[dOffset + 15 : dOffset].f16 = bf6_to_f16_scale(S0[sOffset + 5 : sOffset].bf6, scale.u8)\nendfor;\nD0[511 : 0] = tmp.b512", + VOP3Op.V_CVT_SCALEF32_PK32_BF16_BF6: "scale = 32'U(exponent(S1.f32));\ndeclare tmp : 512'B;\nfor pass in 0 : 31 do\ndOffset = pass * 16;\nsOffset = pass * 6;\ntmp[dOffset + 15 : dOffset].bf16 = bf6_to_bf16_scale(S0[sOffset + 5 : sOffset].bf6, scale.u8)\nendfor;\nD0[511 : 0] = tmp.b512", + VOP3Op.V_ASHR_PK_I8_I32: "SAT8 = lambda(n) (\nif n <= -128 then\nreturn 8'0x80\nelsif n >= 127 then\nreturn 8'0x7f\nelse\nreturn n[7 : 0].b8\nendif);\ndeclare tmp : 16'B;\ntmp[7 : 0] = SAT8(S0.i32 >> S2[4 : 0].u32);\ntmp[15 : 8] = SAT8(S1.i32 >> S2[4 : 0].u32);\nD0[15 : 0] = tmp", + VOP3Op.V_ASHR_PK_U8_I32: "SAT8 = lambda(n) (\nif n <= 0 then\nreturn 8'0x0\nelsif n >= 255 then\nreturn 8'0xff\nelse\nreturn n[7 : 0].b8\nendif);\ndeclare tmp : 16'B;\ntmp[7 : 0] = SAT8(S0.i32 >> S2[4 : 0].u32);\ntmp[15 : 8] = SAT8(S1.i32 >> S2[4 : 0].u32);\nD0[15 : 0] = tmp", + VOP3Op.V_CVT_PK_F16_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\ntmp[15 : 0].f16 = f32_to_f16(S0.f32);\ntmp[31 : 16].f16 = f32_to_f16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode', + VOP3Op.V_CVT_PK_BF16_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\ntmp[15 : 0].bf16 = f32_to_bf16(S0.f32);\ntmp[31 : 16].bf16 = f32_to_bf16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode', + VOP3Op.V_CVT_SCALEF32_PK_BF16_FP8: "scale = 32'U(exponent(S1.f32));\nsrcword = OPSEL[0].i32 * 16;\nsrc = VGPR[laneId][SRC0.u32][srcword + 15 : srcword].b16;\ntmp0 = fp8_to_bf16_scale(src[7 : 0].fp8, scale);\ntmp1 = fp8_to_bf16_scale(src[15 : 8].fp8, scale);\nD0[15 : 0].bf16 = tmp0.bf16;\nD0[31 : 16].bf16 = tmp1.bf16", + VOP3Op.V_CVT_SCALEF32_PK_BF16_BF8: "scale = 32'U(exponent(S1.f32));\nsrcword = OPSEL[0].i32 * 16;\nsrc = VGPR[laneId][SRC0.u32][srcword + 15 : srcword].b16;\ntmp0 = bf8_to_bf16_scale(src[7 : 0].bf8, scale);\ntmp1 = bf8_to_bf16_scale(src[15 : 8].bf8, scale);\nD0[15 : 0].bf16 = tmp0.bf16;\nD0[31 : 16].bf16 = tmp1.bf16", + VOP3Op.V_ADD_F64: 'D0.f64 = S0.f64 + S1.f64', + VOP3Op.V_MUL_F64: 'D0.f64 = S0.f64 * S1.f64', + VOP3Op.V_MIN_F64: "if (WAVE_MODE.IEEE && isSignalNAN(S0.f64)) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif (WAVE_MODE.IEEE && isSignalNAN(S1.f64)) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif isNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif isNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif ((S0.f64 == +0.0) && (S1.f64 == -0.0)) then\nD0.f64 = S1.f64\nelsif ((S0.f64 == -0.0) && (S1.f64 == +0.0)) then\nD0.f64 = S0.f64\nelse\n// Note: there's no IEEE case here like there is for V_MAX_F64.\nD0.f64 = S0.f64 < S1.f64 ? S0.f64 : S1.f64\nendif", + VOP3Op.V_MAX_F64: 'if (WAVE_MODE.IEEE && isSignalNAN(S0.f64)) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif (WAVE_MODE.IEEE && isSignalNAN(S1.f64)) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif isNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif isNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif ((S0.f64 == +0.0) && (S1.f64 == -0.0)) then\nD0.f64 = S0.f64\nelsif ((S0.f64 == -0.0) && (S1.f64 == +0.0)) then\nD0.f64 = S1.f64\nelsif WAVE_MODE.IEEE then\nD0.f64 = S0.f64 >= S1.f64 ? S0.f64 : S1.f64\nelse\nD0.f64 = S0.f64 > S1.f64 ? S0.f64 : S1.f64\nendif', + VOP3Op.V_LDEXP_F64: 'D0.f64 = S0.f64 * 2.0 ** S1.i32', + VOP3Op.V_MUL_LO_U32: 'D0.u32 = S0.u32 * S1.u32', + VOP3Op.V_MUL_HI_U32: "D0.u32 = 32'U((64'U(S0.u32) * 64'U(S1.u32)) >> 32U)", + VOP3Op.V_MUL_HI_I32: "D0.i32 = 32'I((64'I(S0.i32) * 64'I(S1.i32)) >> 32U)", + VOP3Op.V_LDEXP_F32: 'D0.f32 = S0.f32 * 2.0F ** S1.i32', + VOP3Op.V_READLANE_B32: 'lane = S1.u32[5 : 0];\n// Lane select\nD0.b32 = VGPR[lane][SRC0.u32]', + VOP3Op.V_WRITELANE_B32: 'lane = S1.u32[5 : 0];\n// Lane select\nVGPR[lane][VDST.u32] = S0.b32', + VOP3Op.V_BCNT_U32_B32: "tmp = S1.u32;\nfor i in 0 : 31 do\ntmp += S0[i].u32;\n// count i'th bit\nendfor;\nD0.u32 = tmp", + VOP3Op.V_MBCNT_LO_U32_B32: "ThreadMask = (1LL << laneId.u32) - 1LL;\nMaskedValue = (S0.u32 & ThreadMask[31 : 0].u32);\ntmp = S1.u32;\nfor i in 0 : 31 do\ntmp += MaskedValue[i] == 1'1U ? 1U : 0U\nendfor;\nD0.u32 = tmp", + VOP3Op.V_MBCNT_HI_U32_B32: "ThreadMask = (1LL << laneId.u32) - 1LL;\nMaskedValue = (S0.u32 & ThreadMask[63 : 32].u32);\ntmp = S1.u32;\nfor i in 0 : 31 do\ntmp += MaskedValue[i] == 1'1U ? 1U : 0U\nendfor;\nD0.u32 = tmp", + VOP3Op.V_LSHLREV_B64: 'D0.u64 = (S1.u64 << S0[5 : 0].u32)', + VOP3Op.V_LSHRREV_B64: 'D0.u64 = (S1.u64 >> S0[5 : 0].u32)', + VOP3Op.V_ASHRREV_I64: 'D0.i64 = (S1.i64 >> S0[5 : 0].u32)', + VOP3Op.V_TRIG_PREOP_F64: "shift = 32'I(S1[4 : 0].u32) * 53;\nif exponent(S0.f64) > 1077 then\nshift += exponent(S0.f64) - 1077\nendif;\n// (2.0/PI) == 0.{b_1200, b_1199, b_1198, ..., b_1, b_0}\n// b_1200 is the MSB of the fractional part of 2.0/PI\n// Left shift operation indicates which bits are brought\n// into the whole part of the number.\n// Only whole part of result is kept.\nresult = 64'F((1201'B(2.0 / PI)[1200 : 0] << shift.u32) & 1201'0x1fffffffffffff);\nscale = -53 - shift;\nif exponent(S0.f64) >= 1968 then\nscale += 128\nendif;\nD0.f64 = ldexp(result, scale)", + VOP3Op.V_BFM_B32: 'D0.u32 = (((1U << S0[4 : 0].u32) - 1U) << S1[4 : 0].u32)', + VOP3Op.V_CVT_PKNORM_I16_F32: "declare tmp : 32'B;\ntmp[15 : 0].i16 = f32_to_snorm(S0.f32);\ntmp[31 : 16].i16 = f32_to_snorm(S1.f32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PKNORM_U16_F32: "declare tmp : 32'B;\ntmp[15 : 0].u16 = f32_to_unorm(S0.f32);\ntmp[31 : 16].u16 = f32_to_unorm(S1.f32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PKRTZ_F16_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_TOWARD_ZERO;\ntmp[15 : 0].f16 = f32_to_f16(S0.f32);\ntmp[31 : 16].f16 = f32_to_f16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode;\n// Round-toward-zero regardless of current round mode setting in hardware.', + VOP3Op.V_CVT_PK_U16_U32: "declare tmp : 32'B;\ntmp[15 : 0].u16 = u32_to_u16(S0.u32);\ntmp[31 : 16].u16 = u32_to_u16(S1.u32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_I16_I32: "declare tmp : 32'B;\ntmp[15 : 0].i16 = i32_to_i16(S0.i32);\ntmp[31 : 16].i16 = i32_to_i16(S1.i32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PKNORM_I16_F16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = f16_to_snorm(S0.f16);\ntmp[31 : 16].i16 = f16_to_snorm(S1.f16);\nD0 = tmp.b32", + VOP3Op.V_CVT_PKNORM_U16_F16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = f16_to_unorm(S0.f16);\ntmp[31 : 16].u16 = f16_to_unorm(S1.f16);\nD0 = tmp.b32", + VOP3Op.V_ADD_I32: 'D0.i32 = S0.i32 + S1.i32', + VOP3Op.V_SUB_I32: 'D0.i32 = S0.i32 - S1.i32', + VOP3Op.V_ADD_I16: 'D0.i16 = S0.i16 + S1.i16', + VOP3Op.V_SUB_I16: 'D0.i16 = S0.i16 - S1.i16', + VOP3Op.V_PACK_B32_F16: 'D0[31 : 16].f16 = S1.f16;\nD0[15 : 0].f16 = S0.f16', + VOP3Op.V_MUL_LEGACY_F32: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = 0.0F\nelse\nD0.f32 = S0.f32 * S1.f32\nendif", + VOP3Op.V_CVT_PK_FP8_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\nif OPSEL[3].u32 == 0U then\nVGPR[laneId][VDST.u32][15 : 0].b16 = { f32_to_fp8(S1.f32), f32_to_fp8(S0.f32) };\n// D0[31:16] are preserved\nelse\nVGPR[laneId][VDST.u32][31 : 16].b16 = { f32_to_fp8(S1.f32), f32_to_fp8(S0.f32) };\n// D0[15:0] are preserved\nendif;\nROUND_MODE = prev_mode', + VOP3Op.V_CVT_PK_BF8_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\nif OPSEL[3].u32 == 0U then\nVGPR[laneId][VDST.u32][15 : 0].b16 = { f32_to_bf8(S1.f32), f32_to_bf8(S0.f32) };\n// D0[31:16] are preserved\nelse\nVGPR[laneId][VDST.u32][31 : 16].b16 = { f32_to_bf8(S1.f32), f32_to_bf8(S0.f32) };\n// D0[15:0] are preserved\nendif;\nROUND_MODE = prev_mode', + VOP3Op.V_CVT_SR_FP8_F32: "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\ns = sign(S0.f32);\ne = exponent(S0.f32);\nm = 23'U(32'U(23'B(mantissa(S0.f32))) + S1[31 : 12].u32);\ntmp = float32(s, e, m);\n// Add stochastic value to mantissa, wrap around on overflow\nif OPSEL[3 : 2].u2 == 2'0U then\nVGPR[laneId][VDST.u32][7 : 0].fp8 = f32_to_fp8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'1U then\nVGPR[laneId][VDST.u32][15 : 8].fp8 = f32_to_fp8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'2U then\nVGPR[laneId][VDST.u32][23 : 16].fp8 = f32_to_fp8(tmp.f32)\nelse\nVGPR[laneId][VDST.u32][31 : 24].fp8 = f32_to_fp8(tmp.f32)\nendif;\n// Unwritten bytes of D are preserved.\nROUND_MODE = prev_mode", + VOP3Op.V_CVT_SR_BF8_F32: "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\ns = sign(S0.f32);\ne = exponent(S0.f32);\nm = 23'U(32'U(23'B(mantissa(S0.f32))) + S1[31 : 11].u32);\ntmp = float32(s, e, m);\n// Add stochastic value to mantissa, wrap around on overflow\nif OPSEL[3 : 2].u2 == 2'0U then\nVGPR[laneId][VDST.u32][7 : 0].bf8 = f32_to_bf8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'1U then\nVGPR[laneId][VDST.u32][15 : 8].bf8 = f32_to_bf8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'2U then\nVGPR[laneId][VDST.u32][23 : 16].bf8 = f32_to_bf8(tmp.f32)\nelse\nVGPR[laneId][VDST.u32][31 : 24].bf8 = f32_to_bf8(tmp.f32)\nendif;\n// Unwritten bytes of D are preserved.\nROUND_MODE = prev_mode", + VOP3Op.V_CVT_SR_F16_F32: "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\nif OPSEL[3].u2 == 2'0U then\nVGPR[laneId][VDST.u32][15 : 0].f16 = 16'F(f32_to_f16_SR(S0.f32, S1.u32))\nelse\nVGPR[laneId][VDST.u32][31 : 16].f16 = 16'F(f32_to_f16_sr(S0.f32, S1.u32))\nendif;\n// Unwritten bytes of D are preserved.\nROUND_MODE = prev_mode", + VOP3Op.V_CVT_SR_BF16_F32: "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\nif OPSEL[3].u2 == 2'0U then\nVGPR[laneId][VDST.u32][15 : 0].bf16 = 16'BF(f32_to_bf16_SR(S0.f32, S1.u32))\nelse\nVGPR[laneId][VDST.u32][31 : 16].bf16 = 16'BF(f32_to_bf16_sr(S0.f32, S1.u32))\nendif;\n// Unwritten bytes of D are preserved.\nROUND_MODE = prev_mode", + VOP3Op.V_MINIMUM3_F32: "D0.f32 = 32'F(v_minimum_f32(v_minimum_f32(S0.f32, S1.f32), S2.f32))", + VOP3Op.V_MAXIMUM3_F32: "D0.f32 = 32'F(v_maximum_f32(v_maximum_f32(S0.f32, S1.f32), S2.f32))", + VOP3POp.V_PK_MAD_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 * S1[15 : 0].i16 + S2[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 * S1[31 : 16].i16 + S2[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_MUL_LO_U16: 'tmp[31 : 16].u16 = S0[31 : 16].u16 * S1[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 * S1[15 : 0].u16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_ADD_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 + S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 + S1[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_SUB_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 - S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 - S1[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_LSHLREV_B16: 'tmp[31 : 16].u16 = (S1[31 : 16].u16 << S0.u32[19 : 16].u32);\ntmp[15 : 0].u16 = (S1[15 : 0].u16 << S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_LSHRREV_B16: 'tmp[31 : 16].u16 = (S1[31 : 16].u16 >> S0.u32[19 : 16].u32);\ntmp[15 : 0].u16 = (S1[15 : 0].u16 >> S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_ASHRREV_I16: 'tmp[31 : 16].i16 = (S1[31 : 16].i16 >> S0.u32[19 : 16].u32);\ntmp[15 : 0].i16 = (S1[15 : 0].i16 >> S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MAX_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 >= S1[15 : 0].i16 ? S0[15 : 0].i16 : S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 >= S1[31 : 16].i16 ? S0[31 : 16].i16 : S1[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_MIN_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 < S1[15 : 0].i16 ? S0[15 : 0].i16 : S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 < S1[31 : 16].i16 ? S0[31 : 16].i16 : S1[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_MAD_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 * S1[15 : 0].u16 + S2[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 * S1[31 : 16].u16 + S2[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_ADD_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 + S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 + S1[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_SUB_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 - S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 - S1[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_MAX_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 >= S1[15 : 0].u16 ? S0[15 : 0].u16 : S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 >= S1[31 : 16].u16 ? S0[31 : 16].u16 : S1[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_MIN_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 < S1[15 : 0].u16 ? S0[15 : 0].u16 : S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 < S1[31 : 16].u16 ? S0[31 : 16].u16 : S1[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_FMA_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, S2[15 : 0].f16);\ntmp[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, S2[31 : 16].f16);\nD0.b32 = tmp", + VOP3POp.V_PK_ADD_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = S0[15 : 0].f16 + S1[15 : 0].f16;\ntmp[31 : 16].f16 = S0[31 : 16].f16 + S1[31 : 16].f16;\nD0.b32 = tmp", + VOP3POp.V_PK_MUL_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = S0[15 : 0].f16 * S1[15 : 0].f16;\ntmp[31 : 16].f16 = S0[31 : 16].f16 * S1[31 : 16].f16;\nD0.b32 = tmp", + VOP3POp.V_PK_MIN_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = v_min_f16(S0[15 : 0].f16, S1[15 : 0].f16);\ntmp[31 : 16].f16 = v_min_f16(S0[31 : 16].f16, S1[31 : 16].f16);\nD0.b32 = tmp", + VOP3POp.V_PK_MAX_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = v_max_f16(S0[15 : 0].f16, S1[15 : 0].f16);\ntmp[31 : 16].f16 = v_max_f16(S0[31 : 16].f16, S1[31 : 16].f16);\nD0.b32 = tmp", + VOP3POp.V_DOT2_F32_BF16: "tmp = 32'F(S0[15 : 0].bf16) * 32'F(S1[15 : 0].bf16);\ntmp += 32'F(S0[31 : 16].bf16) * 32'F(S1[31 : 16].bf16);\ntmp += S2.f32;\nD0.f32 = tmp", + VOP3POp.V_PK_MINIMUM3_F16: "tmp[31 : 16].f16 = 16'F(v_minimum3_f16(S0[31 : 16].f16, S1[31 : 16].f16, S2[31 : 16].f16));\ntmp[15 : 0].f16 = 16'F(v_minimum3_f16(S0[15 : 0].f16, S1[15 : 0].f16, S2[15 : 0].f16));\nD0.b32 = tmp.b32", + VOP3POp.V_PK_MAXIMUM3_F16: "tmp[31 : 16].f16 = 16'F(v_maximum3_f16(S0[31 : 16].f16, S1[31 : 16].f16, S2[31 : 16].f16));\ntmp[15 : 0].f16 = 16'F(v_maximum3_f16(S0[15 : 0].f16, S1[15 : 0].f16, S2[15 : 0].f16));\nD0.b32 = tmp.b32", + VOP3POp.V_MAD_MIX_F32: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[31 : 0].f32 = in[0] * in[1] + in[2]", + VOP3POp.V_MAD_MIXLO_F16: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[15 : 0].f16 = f32_to_f16(in[0] * in[1] + in[2])", + VOP3POp.V_MAD_MIXHI_F16: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[31 : 16].f16 = f32_to_f16(in[0] * in[1] + in[2])", + VOP3POp.V_DOT2_F32_F16: 'tmp = S2.f32;\ntmp += f16_to_f32(S0[15 : 0].f16) * f16_to_f32(S1[15 : 0].f16);\ntmp += f16_to_f32(S0[31 : 16].f16) * f16_to_f32(S1[31 : 16].f16);\nD0.f32 = tmp', + VOP3POp.V_DOT2_I32_I16: 'tmp = S2.i32;\ntmp += i16_to_i32(S0[15 : 0].i16) * i16_to_i32(S1[15 : 0].i16);\ntmp += i16_to_i32(S0[31 : 16].i16) * i16_to_i32(S1[31 : 16].i16);\nD0.i32 = tmp', + VOP3POp.V_DOT2_U32_U16: 'tmp = S2.u32;\ntmp += u16_to_u32(S0[15 : 0].u16) * u16_to_u32(S1[15 : 0].u16);\ntmp += u16_to_u32(S0[31 : 16].u16) * u16_to_u32(S1[31 : 16].u16);\nD0.u32 = tmp', + VOP3POp.V_DOT4_I32_I8: 'tmp = S2.i32;\ntmp += i8_to_i32(S0[7 : 0].i8) * i8_to_i32(S1[7 : 0].i8);\ntmp += i8_to_i32(S0[15 : 8].i8) * i8_to_i32(S1[15 : 8].i8);\ntmp += i8_to_i32(S0[23 : 16].i8) * i8_to_i32(S1[23 : 16].i8);\ntmp += i8_to_i32(S0[31 : 24].i8) * i8_to_i32(S1[31 : 24].i8);\nD0.i32 = tmp', + VOP3POp.V_DOT4_U32_U8: 'tmp = S2.u32;\ntmp += u8_to_u32(S0[7 : 0].u8) * u8_to_u32(S1[7 : 0].u8);\ntmp += u8_to_u32(S0[15 : 8].u8) * u8_to_u32(S1[15 : 8].u8);\ntmp += u8_to_u32(S0[23 : 16].u8) * u8_to_u32(S1[23 : 16].u8);\ntmp += u8_to_u32(S0[31 : 24].u8) * u8_to_u32(S1[31 : 24].u8);\nD0.u32 = tmp', + VOP3POp.V_DOT8_I32_I4: 'tmp = S2.i32;\ntmp += i4_to_i32(S0[3 : 0].i4) * i4_to_i32(S1[3 : 0].i4);\ntmp += i4_to_i32(S0[7 : 4].i4) * i4_to_i32(S1[7 : 4].i4);\ntmp += i4_to_i32(S0[11 : 8].i4) * i4_to_i32(S1[11 : 8].i4);\ntmp += i4_to_i32(S0[15 : 12].i4) * i4_to_i32(S1[15 : 12].i4);\ntmp += i4_to_i32(S0[19 : 16].i4) * i4_to_i32(S1[19 : 16].i4);\ntmp += i4_to_i32(S0[23 : 20].i4) * i4_to_i32(S1[23 : 20].i4);\ntmp += i4_to_i32(S0[27 : 24].i4) * i4_to_i32(S1[27 : 24].i4);\ntmp += i4_to_i32(S0[31 : 28].i4) * i4_to_i32(S1[31 : 28].i4);\nD0.i32 = tmp', + VOP3POp.V_DOT8_U32_U4: 'tmp = S2.u32;\ntmp += u4_to_u32(S0[3 : 0].u4) * u4_to_u32(S1[3 : 0].u4);\ntmp += u4_to_u32(S0[7 : 4].u4) * u4_to_u32(S1[7 : 4].u4);\ntmp += u4_to_u32(S0[11 : 8].u4) * u4_to_u32(S1[11 : 8].u4);\ntmp += u4_to_u32(S0[15 : 12].u4) * u4_to_u32(S1[15 : 12].u4);\ntmp += u4_to_u32(S0[19 : 16].u4) * u4_to_u32(S1[19 : 16].u4);\ntmp += u4_to_u32(S0[23 : 20].u4) * u4_to_u32(S1[23 : 20].u4);\ntmp += u4_to_u32(S0[27 : 24].u4) * u4_to_u32(S1[27 : 24].u4);\ntmp += u4_to_u32(S0[31 : 28].u4) * u4_to_u32(S1[31 : 28].u4);\nD0.u32 = tmp', + VOP3POp.V_MFMA_F32_16X16X128_F8F6F4: 'D = A (16x128) * B (128x16) + C (16x16)', + VOP3POp.V_MFMA_F32_32X32X64_F8F6F4: 'D = A (32x64) * B (64x32) + C (32x32)', + VOP3POp.V_PK_FMA_F32: "declare tmp : 64'B;\ntmp[31 : 0].f32 = fma(S0[31 : 0].f32, S1[31 : 0].f32, S2[31 : 0].f32);\ntmp[63 : 32].f32 = fma(S0[63 : 32].f32, S1[63 : 32].f32, S2[63 : 32].f32);\nD0.b64 = tmp", + VOP3POp.V_PK_MUL_F32: "declare tmp : 64'B;\ntmp[31 : 0].f32 = S0[31 : 0].f32 * S1[31 : 0].f32;\ntmp[63 : 32].f32 = S0[63 : 32].f32 * S1[63 : 32].f32;\nD0.b64 = tmp", + VOP3POp.V_PK_ADD_F32: "declare tmp : 64'B;\ntmp[31 : 0].f32 = S0[31 : 0].f32 + S1[31 : 0].f32;\ntmp[63 : 32].f32 = S0[63 : 32].f32 + S1[63 : 32].f32;\nD0.b64 = tmp", + VOP3POp.V_PK_MOV_B32: 'tmp0.u32 = S0.u32[OPSEL[0].i32 * 32 + 31 : OPSEL[0].i32 * 32];\ntmp1.u32 = S1.u32[OPSEL[1].i32 * 32 + 31 : OPSEL[1].i32 * 32];\nD0.u32[31 : 0] = tmp0.u32;\nD0.u32[63 : 32] = tmp1.u32', + VOP3POp.V_MFMA_F32_16X16X32_BF16: 'D = A (16x32) * B (32x16) + C (16x16)', + VOP3POp.V_MFMA_I32_16X16X64_I8: 'D = A (16x64) * B (64x16) + C (16x16)', + VOP3POp.V_MFMA_F32_32X32X16_BF16: 'D = A (32x16) * B (16x32) + C (32x32)', + VOP3POp.V_MFMA_I32_32X32X32_I8: 'D = A (32x32) * B (32x32) + C (32x32)', + VOP3POp.V_SMFMAC_F32_16X16X64_BF16: 'D = A (sparse 16x64) * B (64x16) + D (16x16)', + VOP3POp.V_SMFMAC_I32_16X16X128_I8: 'D = A (sparse 16x128) * B (128x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_16X16X128_BF8_BF8: 'D = A (sparse 16x128) * B (128x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_16X16X128_BF8_FP8: 'D = A (sparse 16x128) * B (128x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_16X16X128_FP8_BF8: 'D = A (sparse 16x128) * B (128x16) + D (16x16)', + VOP3POp.V_MFMA_F32_32X32X1_2B_F32: 'D = A (32x1) * B (1x32) + C (32x32)', + VOP3POp.V_MFMA_F32_16X16X1_4B_F32: 'D = A (16x1) * B (1x16) + C (16x16)', + VOP3POp.V_MFMA_F32_4X4X1_16B_F32: 'D = A (4x1) * B (1x4) + C (4x4)', + VOP3POp.V_SMFMAC_F32_16X16X128_FP8_FP8: 'D = A (sparse 16x128) * B (128x16) + D (16x16)', + VOP3POp.V_MFMA_F32_32X32X2_F32: 'D = A (32x2) * B (2x32) + C (32x32)', + VOP3POp.V_MFMA_F32_16X16X4_F32: 'D = A (16x4) * B (4x16) + C (16x16)', + VOP3POp.V_SMFMAC_F32_32X32X32_BF16: 'D = A (sparse 32x32) * B (32x32) + D (32x32)', + VOP3POp.V_SMFMAC_I32_32X32X64_I8: 'D = A (sparse 32x64) * B (64x32) + D (32x32)', + VOP3POp.V_MFMA_F32_32X32X4_2B_F16: 'D = A (32x4) * B (4x32) + C (32x32)', + VOP3POp.V_MFMA_F32_16X16X4_4B_F16: 'D = A (16x4) * B (4x16) + C (16x16)', + VOP3POp.V_MFMA_F32_4X4X4_16B_F16: 'D = A (4x4) * B (4x4) + C (4x4)', + VOP3POp.V_SMFMAC_F32_32X32X64_BF8_BF8: 'D = A (sparse 32x64) * B (64x32) + D (32x32)', + VOP3POp.V_MFMA_F32_32X32X8_F16: 'D = A (32x8) * B (8x32) + C (32x32)', + VOP3POp.V_MFMA_F32_16X16X16_F16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_SMFMAC_F32_32X32X64_BF8_FP8: 'D = A (sparse 32x64) * B (64x32) + D (32x32)', + VOP3POp.V_SMFMAC_F32_32X32X64_FP8_BF8: 'D = A (sparse 32x64) * B (64x32) + D (32x32)', + VOP3POp.V_MFMA_I32_32X32X4_2B_I8: 'D = A (32x4) * B (4x32) + C (32x32)', + VOP3POp.V_MFMA_I32_16X16X4_4B_I8: 'D = A (16x4) * B (4x16) + C (16x16)', + VOP3POp.V_MFMA_I32_4X4X4_16B_I8: 'D = A (4x4) * B (4x4) + C (4x4)', + VOP3POp.V_SMFMAC_F32_32X32X64_FP8_FP8: 'D = A (sparse 32x64) * B (64x32) + D (32x32)', + VOP3POp.V_MFMA_F32_16X16X32_F16: 'D = A (16x32) * B (32x16) + C (16x16)', + VOP3POp.V_MFMA_F32_32X32X16_F16: 'D = A (32x16) * B (16x32) + C (32x32)', + VOP3POp.V_MFMA_I32_32X32X16_I8: 'D = A (32x16) * B (16x32) + C (32x32)', + VOP3POp.V_MFMA_I32_16X16X32_I8: 'D = A (16x32) * B (32x16) + C (16x16)', + VOP3POp.V_SMFMAC_F32_16X16X64_F16: 'D = A (sparse 16x64) * B (64x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_32X32X32_F16: 'D = A (sparse 32x32) * B (32x32) + D (32x32)', + VOP3POp.V_MFMA_F32_32X32X4_2B_BF16: 'D = A (32x4) * B (4x32) + C (32x32)', + VOP3POp.V_MFMA_F32_16X16X4_4B_BF16: 'D = A (16x4) * B (4x16) + C (16x16)', + VOP3POp.V_MFMA_F32_4X4X4_16B_BF16: 'D = A (4x4) * B (4x4) + C (4x4)', + VOP3POp.V_MFMA_F32_32X32X8_BF16: 'D = A (32x8) * B (8x32) + C (32x32)', + VOP3POp.V_MFMA_F32_16X16X16_BF16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_SMFMAC_F32_16X16X32_F16: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_32X32X16_F16: 'D = A (sparse 32x16) * B (16x32) + D (32x32)', + VOP3POp.V_SMFMAC_F32_16X16X32_BF16: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_32X32X16_BF16: 'D = A (sparse 32x16) * B (16x32) + D (32x32)', + VOP3POp.V_SMFMAC_I32_16X16X64_I8: 'D = A (sparse 16x64) * B (64x16) + D (16x16)', + VOP3POp.V_SMFMAC_I32_32X32X32_I8: 'D = A (sparse 32x32) * B (32x32) + D (32x32)', + VOP3POp.V_MFMA_F64_16X16X4_F64: 'D = A (16x4) * B (4x16) + C (16x16)', + VOP3POp.V_MFMA_F64_4X4X4_4B_F64: 'D = A (4x4) * B (4x4) + C (4x4)', + VOP3POp.V_MFMA_F32_16X16X32_BF8_BF8: 'D = A (16x32) * B (32x16) + C (16x16)', + VOP3POp.V_MFMA_F32_16X16X32_BF8_FP8: 'D = A (16x32) * B (32x16) + C (16x16)', + VOP3POp.V_MFMA_F32_16X16X32_FP8_BF8: 'D = A (16x32) * B (32x16) + C (16x16)', + VOP3POp.V_MFMA_F32_16X16X32_FP8_FP8: 'D = A (16x32) * B (32x16) + C (16x16)', + VOP3POp.V_MFMA_F32_32X32X16_BF8_BF8: 'D = A (32x16) * B (16x32) + C (32x32)', + VOP3POp.V_MFMA_F32_32X32X16_BF8_FP8: 'D = A (32x16) * B (16x32) + C (32x32)', + VOP3POp.V_MFMA_F32_32X32X16_FP8_BF8: 'D = A (32x16) * B (16x32) + C (32x32)', + VOP3POp.V_MFMA_F32_32X32X16_FP8_FP8: 'D = A (32x16) * B (16x32) + C (32x32)', + VOP3POp.V_SMFMAC_F32_16X16X64_BF8_BF8: 'D = A (sparse 16x64) * B (64x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_16X16X64_BF8_FP8: 'D = A (sparse 16x64) * B (64x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_16X16X64_FP8_BF8: 'D = A (sparse 16x64) * B (64x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_16X16X64_FP8_FP8: 'D = A (sparse 16x64) * B (64x16) + D (16x16)', + VOP3POp.V_SMFMAC_F32_32X32X32_BF8_BF8: 'D = A (sparse 32x32) * B (32x32) + D (32x32)', + VOP3POp.V_SMFMAC_F32_32X32X32_BF8_FP8: 'D = A (sparse 32x32) * B (32x32) + D (32x32)', + VOP3POp.V_SMFMAC_F32_32X32X32_FP8_BF8: 'D = A (sparse 32x32) * B (32x32) + D (32x32)', + VOP3POp.V_SMFMAC_F32_32X32X32_FP8_FP8: 'D = A (sparse 32x32) * B (32x32) + D (32x32)', + VOP3SDOp.V_ADD_CO_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32);\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADDC_CO_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUB_CO_U32: "tmp = S0.u32 - S1.u32;\nVCC.u64[laneId] = S1.u32 > S0.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUBREV_CO_U32: "tmp = S1.u32 - S0.u32;\nVCC.u64[laneId] = S0.u32 > S1.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_ADDC_CO_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + VCC.u64[laneId].u64;\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADDC_CO_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUBB_CO_U32: "tmp = S0.u32 - S1.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S1.u32) + VCC.u64[laneId].u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUBBREV_CO_U32: "tmp = S1.u32 - S0.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S0.u32) + VCC.u64[laneId].u64 > 64'U(S1.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUBB_CO_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_DIV_SCALE_F32: "VCC = 0x0LL;\nif ((64'F(S2.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\nD0.f32 = NAN.f32\nelsif exponent(S2.f32) - exponent(S1.f32) >= 96 then\n// N/D near MAX_FLOAT_F32\nVCC = 0x1LL;\nif S0.f32 == S1.f32 then\n// Only scale the denominator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif S1.f32 == DENORM.f32 then\nD0.f32 = ldexp(S0.f32, 64)\nelsif ((1.0 / 64'F(S1.f32) == DENORM.f64) && (S2.f32 / S1.f32 == DENORM.f32)) then\nVCC = 0x1LL;\nif S0.f32 == S1.f32 then\n// Only scale the denominator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif 1.0 / 64'F(S1.f32) == DENORM.f64 then\nD0.f32 = ldexp(S0.f32, -64)\nelsif S2.f32 / S1.f32 == DENORM.f32 then\nVCC = 0x1LL;\nif S0.f32 == S2.f32 then\n// Only scale the numerator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif exponent(S2.f32) <= 23 then\n// Numerator is tiny\nD0.f32 = ldexp(S0.f32, 64)\nendif", + VOP3SDOp.V_DIV_SCALE_F64: 'VCC = 0x0LL;\nif ((S2.f64 == 0.0) || (S1.f64 == 0.0)) then\nD0.f64 = NAN.f64\nelsif exponent(S2.f64) - exponent(S1.f64) >= 768 then\n// N/D near MAX_FLOAT_F64\nVCC = 0x1LL;\nif S0.f64 == S1.f64 then\n// Only scale the denominator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif S1.f64 == DENORM.f64 then\nD0.f64 = ldexp(S0.f64, 128)\nelsif ((1.0 / S1.f64 == DENORM.f64) && (S2.f64 / S1.f64 == DENORM.f64)) then\nVCC = 0x1LL;\nif S0.f64 == S1.f64 then\n// Only scale the denominator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif 1.0 / S1.f64 == DENORM.f64 then\nD0.f64 = ldexp(S0.f64, -128)\nelsif S2.f64 / S1.f64 == DENORM.f64 then\nVCC = 0x1LL;\nif S0.f64 == S2.f64 then\n// Only scale the numerator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif exponent(S2.f64) <= 53 then\n// Numerator is tiny\nD0.f64 = ldexp(S0.f64, 128)\nendif', + VOP3SDOp.V_MAD_U64_U32: "{ D1.u1, D0.u64 } = 65'B(65'U(S0.u32) * 65'U(S1.u32) + 65'U(S2.u64))", + VOP3SDOp.V_MAD_I64_I32: "{ D1.i1, D0.i64 } = 65'B(65'I(S0.i32) * 65'I(S1.i32) + 65'I(S2.i64))", + VOPCOp.V_CMP_CLASS_F32_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_CLASS_F32_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", + VOPCOp.V_CMP_CLASS_F64_E32: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_CLASS_F64_E32: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", + VOPCOp.V_CMP_CLASS_F16_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_CLASS_F16_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = D0.u64[laneId] = result", + VOPCOp.V_CMP_F_F16_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_F16_E32: 'D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F16_E32: 'D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F16_E32: 'D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F16_E32: 'D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F16_E32: 'D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F16_E32: 'D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F16_E32: "D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_U_F16_E32: "D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_NGE_F16_E32: 'D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F16_E32: 'D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F16_E32: 'D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F16_E32: 'D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F16_E32: 'D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F16_E32: 'D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_TRU_F16_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_F16_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LG_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_O_F16_E32: "EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_U_F16_E32: "EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_NGE_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLG_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NGT_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLE_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NEQ_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLT_F16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_TRU_F16_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_F32_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_F32_E32: 'D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F32_E32: 'D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F32_E32: 'D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F32_E32: 'D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F32_E32: 'D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F32_E32: 'D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F32_E32: "D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_U_F32_E32: "D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_NGE_F32_E32: 'D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F32_E32: 'D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F32_E32: 'D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F32_E32: 'D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F32_E32: 'D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F32_E32: 'D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_TRU_F32_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_F32_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LG_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_O_F32_E32: "EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_U_F32_E32: "EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_NGE_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLG_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NGT_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLE_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NEQ_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLT_F32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_TRU_F32_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_F64_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_F64_E32: 'D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F64_E32: 'D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F64_E32: 'D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F64_E32: 'D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F64_E32: 'D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F64_E32: 'D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F64_E32: 'D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_U_F64_E32: 'D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGE_F64_E32: 'D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F64_E32: 'D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F64_E32: 'D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F64_E32: 'D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F64_E32: 'D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F64_E32: 'D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_TRU_F64_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_F64_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LG_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_O_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_U_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NGE_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLG_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NGT_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLE_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NEQ_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NLT_F64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_TRU_F64_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_I16_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_I16_E32: 'D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I16_E32: 'D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I16_E32: 'D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I16_E32: 'D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I16_E32: 'D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I16_E32: 'D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_I16_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_U16_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_U16_E32: 'D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U16_E32: 'D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U16_E32: 'D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U16_E32: 'D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U16_E32: 'D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U16_E32: 'D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_U16_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_I16_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_I16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_I16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_I16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_I16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NE_I16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_I16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_T_I16_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_U16_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_U16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_U16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_U16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_U16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NE_U16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_U16_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_T_U16_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_I32_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_I32_E32: 'D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I32_E32: 'D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I32_E32: 'D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I32_E32: 'D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I32_E32: 'D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I32_E32: 'D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_I32_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_U32_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_U32_E32: 'D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U32_E32: 'D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U32_E32: 'D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U32_E32: 'D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U32_E32: 'D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U32_E32: 'D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_U32_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_I32_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_I32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_I32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_I32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_I32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NE_I32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_I32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_T_I32_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_U32_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_U32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_U32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_U32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_U32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NE_U32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_U32_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_T_U32_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_I64_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_I64_E32: 'D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I64_E32: 'D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I64_E32: 'D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I64_E32: 'D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I64_E32: 'D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I64_E32: 'D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_I64_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_U64_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_U64_E32: 'D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U64_E32: 'D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U64_E32: 'D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U64_E32: 'D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U64_E32: 'D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U64_E32: 'D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_U64_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_I64_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_I64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_I64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_I64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_I64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NE_I64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_I64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_T_I64_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_U64_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_U64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_EQ_U64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_LE_U64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GT_U64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_NE_U64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_GE_U64_E32: 'EXEC.u64[laneId] = D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMPX_T_U64_E32: "EXEC.u64[laneId] = D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/common.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/common.py new file mode 100644 index 000000000..018702046 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/common.py @@ -0,0 +1,324 @@ +# autogenerated from AMD ISA XML - do not edit +from enum import Enum, auto + +class ReprEnum(Enum): + """Enum with clean repr that roundtrips with eval().""" + def __repr__(self): return f"{type(self).__name__}.{self.name}" + +class Fmt(Enum): + FMT_ANY = auto() + FMT_BUF = auto() + FMT_IMG = auto() + FMT_IMG_BVH = auto() + FMT_NUM_B1 = auto() + FMT_NUM_B1024 = auto() + FMT_NUM_B128 = auto() + FMT_NUM_B16 = auto() + FMT_NUM_B256 = auto() + FMT_NUM_B32 = auto() + FMT_NUM_B512 = auto() + FMT_NUM_B64 = auto() + FMT_NUM_B8 = auto() + FMT_NUM_B96 = auto() + FMT_NUM_BF16 = auto() + FMT_NUM_BF6 = auto() + FMT_NUM_BF8 = auto() + FMT_NUM_F16 = auto() + FMT_NUM_F32 = auto() + FMT_NUM_F64 = auto() + FMT_NUM_FP4 = auto() + FMT_NUM_FP6 = auto() + FMT_NUM_FP8 = auto() + FMT_NUM_I16 = auto() + FMT_NUM_I24 = auto() + FMT_NUM_I32 = auto() + FMT_NUM_I4 = auto() + FMT_NUM_I64 = auto() + FMT_NUM_I8 = auto() + FMT_NUM_IU4 = auto() + FMT_NUM_IU8 = auto() + FMT_NUM_M64 = auto() + FMT_NUM_PK16_BF16 = auto() + FMT_NUM_PK16_BF8 = auto() + FMT_NUM_PK16_F16 = auto() + FMT_NUM_PK16_F32 = auto() + FMT_NUM_PK16_FP8 = auto() + FMT_NUM_PK16_I32 = auto() + FMT_NUM_PK16_I8 = auto() + FMT_NUM_PK2_B16 = auto() + FMT_NUM_PK2_B32 = auto() + FMT_NUM_PK2_B64 = auto() + FMT_NUM_PK2_BF16 = auto() + FMT_NUM_PK2_BF8 = auto() + FMT_NUM_PK2_F16 = auto() + FMT_NUM_PK2_F32 = auto() + FMT_NUM_PK2_FP4 = auto() + FMT_NUM_PK2_FP8 = auto() + FMT_NUM_PK2_I16 = auto() + FMT_NUM_PK2_I8 = auto() + FMT_NUM_PK2_U16 = auto() + FMT_NUM_PK2_U8 = auto() + FMT_NUM_PK32_BF16 = auto() + FMT_NUM_PK32_BF6 = auto() + FMT_NUM_PK32_BF8 = auto() + FMT_NUM_PK32_F16 = auto() + FMT_NUM_PK32_F32 = auto() + FMT_NUM_PK32_FP6 = auto() + FMT_NUM_PK32_FP8 = auto() + FMT_NUM_PK32_I32 = auto() + FMT_NUM_PK32_I8 = auto() + FMT_NUM_PK4_B8 = auto() + FMT_NUM_PK4_BF16 = auto() + FMT_NUM_PK4_BF8 = auto() + FMT_NUM_PK4_F16 = auto() + FMT_NUM_PK4_F32 = auto() + FMT_NUM_PK4_F64 = auto() + FMT_NUM_PK4_FP8 = auto() + FMT_NUM_PK4_I32 = auto() + FMT_NUM_PK4_I8 = auto() + FMT_NUM_PK4_IU8 = auto() + FMT_NUM_PK4_U8 = auto() + FMT_NUM_PK8_B32 = auto() + FMT_NUM_PK8_BF16 = auto() + FMT_NUM_PK8_BF8 = auto() + FMT_NUM_PK8_F16 = auto() + FMT_NUM_PK8_FP8 = auto() + FMT_NUM_PK8_I4 = auto() + FMT_NUM_PK8_I8 = auto() + FMT_NUM_PK8_IU4 = auto() + FMT_NUM_PK8_U4 = auto() + FMT_NUM_PK8_U8 = auto() + FMT_NUM_PK_F16 = auto() + FMT_NUM_PK_I16 = auto() + FMT_NUM_PK_I8 = auto() + FMT_NUM_PK_U16 = auto() + FMT_NUM_PK_U8 = auto() + FMT_NUM_U16 = auto() + FMT_NUM_U24 = auto() + FMT_NUM_U32 = auto() + FMT_NUM_U4 = auto() + FMT_NUM_U64 = auto() + FMT_NUM_U8 = auto() + FMT_RSRC = auto() + FMT_RSRC_SCALAR = auto() + FMT_RSRC_SCRATCH = auto() + FMT_RSRC_SCRATCH_BYTE = auto() + FMT_RSRC_SCRATCH_STRIDE = auto() + FMT_RSRC_TYPED = auto() + FMT_RSRC_TYPED_BYTE = auto() + FMT_RSRC_TYPED_SCRATCH = auto() + FMT_RSRC_TYPED_STRIDE = auto() + FMT_RSRC_VECTOR = auto() + FMT_RSRC_VECTOR_BYTE = auto() + FMT_RSRC_VECTOR_STRIDE = auto() + FMT_SAMP = auto() + FMT_WMMA_AB_16X16_BF16 = auto() + FMT_WMMA_AB_16X16_BF8 = auto() + FMT_WMMA_AB_16X16_F16 = auto() + FMT_WMMA_AB_16X16_FP8 = auto() + FMT_WMMA_AB_16X16_IU4 = auto() + FMT_WMMA_AB_16X16_IU8 = auto() + FMT_WMMA_AB_16X32_BF16 = auto() + FMT_WMMA_AB_16X32_BF8 = auto() + FMT_WMMA_AB_16X32_F16 = auto() + FMT_WMMA_AB_16X32_FP8 = auto() + FMT_WMMA_AB_16X32_IU4 = auto() + FMT_WMMA_AB_16X32_IU8 = auto() + FMT_WMMA_AB_16X64_IU4 = auto() + FMT_WMMA_AB_BF16 = auto() + FMT_WMMA_AB_F16 = auto() + FMT_WMMA_AB_IU4 = auto() + FMT_WMMA_AB_IU8 = auto() + FMT_WMMA_DC_16X16_BF16 = auto() + FMT_WMMA_DC_16X16_F16 = auto() + FMT_WMMA_DC_16X16_F32 = auto() + FMT_WMMA_DC_16X16_I32 = auto() + FMT_WMMA_DC_BF16 = auto() + FMT_WMMA_DC_F16 = auto() + FMT_WMMA_DC_F32 = auto() + FMT_WMMA_DC_I32 = auto() + FMT_WMMA_INDEX_SET = auto() + +FMT_BITS = { + Fmt.FMT_ANY: 1, + Fmt.FMT_BUF: 64, + Fmt.FMT_IMG: 256, + Fmt.FMT_IMG_BVH: 128, + Fmt.FMT_NUM_B1: 1, + Fmt.FMT_NUM_B1024: 1024, + Fmt.FMT_NUM_B128: 128, + Fmt.FMT_NUM_B16: 16, + Fmt.FMT_NUM_B256: 256, + Fmt.FMT_NUM_B32: 32, + Fmt.FMT_NUM_B512: 512, + Fmt.FMT_NUM_B64: 64, + Fmt.FMT_NUM_B8: 8, + Fmt.FMT_NUM_B96: 96, + Fmt.FMT_NUM_BF16: 16, + Fmt.FMT_NUM_BF6: 6, + Fmt.FMT_NUM_BF8: 8, + Fmt.FMT_NUM_F16: 16, + Fmt.FMT_NUM_F32: 32, + Fmt.FMT_NUM_F64: 64, + Fmt.FMT_NUM_FP4: 4, + Fmt.FMT_NUM_FP6: 6, + Fmt.FMT_NUM_FP8: 8, + Fmt.FMT_NUM_I16: 16, + Fmt.FMT_NUM_I24: 24, + Fmt.FMT_NUM_I32: 32, + Fmt.FMT_NUM_I4: 4, + Fmt.FMT_NUM_I64: 64, + Fmt.FMT_NUM_I8: 8, + Fmt.FMT_NUM_IU4: 4, + Fmt.FMT_NUM_IU8: 8, + Fmt.FMT_NUM_M64: 64, + Fmt.FMT_NUM_PK16_BF16: 256, + Fmt.FMT_NUM_PK16_BF8: 128, + Fmt.FMT_NUM_PK16_F16: 256, + Fmt.FMT_NUM_PK16_F32: 512, + Fmt.FMT_NUM_PK16_FP8: 128, + Fmt.FMT_NUM_PK16_I32: 512, + Fmt.FMT_NUM_PK16_I8: 128, + Fmt.FMT_NUM_PK2_B16: 32, + Fmt.FMT_NUM_PK2_B32: 64, + Fmt.FMT_NUM_PK2_B64: 128, + Fmt.FMT_NUM_PK2_BF16: 32, + Fmt.FMT_NUM_PK2_BF8: 16, + Fmt.FMT_NUM_PK2_F16: 32, + Fmt.FMT_NUM_PK2_F32: 64, + Fmt.FMT_NUM_PK2_FP4: 8, + Fmt.FMT_NUM_PK2_FP8: 16, + Fmt.FMT_NUM_PK2_I16: 32, + Fmt.FMT_NUM_PK2_I8: 16, + Fmt.FMT_NUM_PK2_U16: 32, + Fmt.FMT_NUM_PK2_U8: 16, + Fmt.FMT_NUM_PK32_BF16: 512, + Fmt.FMT_NUM_PK32_BF6: 192, + Fmt.FMT_NUM_PK32_BF8: 256, + Fmt.FMT_NUM_PK32_F16: 512, + Fmt.FMT_NUM_PK32_F32: 1024, + Fmt.FMT_NUM_PK32_FP6: 192, + Fmt.FMT_NUM_PK32_FP8: 256, + Fmt.FMT_NUM_PK32_I32: 1024, + Fmt.FMT_NUM_PK32_I8: 256, + Fmt.FMT_NUM_PK4_B8: 32, + Fmt.FMT_NUM_PK4_BF16: 64, + Fmt.FMT_NUM_PK4_BF8: 32, + Fmt.FMT_NUM_PK4_F16: 64, + Fmt.FMT_NUM_PK4_F32: 128, + Fmt.FMT_NUM_PK4_F64: 256, + Fmt.FMT_NUM_PK4_FP8: 32, + Fmt.FMT_NUM_PK4_I32: 128, + Fmt.FMT_NUM_PK4_I8: 32, + Fmt.FMT_NUM_PK4_IU8: 32, + Fmt.FMT_NUM_PK4_U8: 32, + Fmt.FMT_NUM_PK8_B32: 256, + Fmt.FMT_NUM_PK8_BF16: 128, + Fmt.FMT_NUM_PK8_BF8: 64, + Fmt.FMT_NUM_PK8_F16: 128, + Fmt.FMT_NUM_PK8_FP8: 64, + Fmt.FMT_NUM_PK8_I4: 32, + Fmt.FMT_NUM_PK8_I8: 64, + Fmt.FMT_NUM_PK8_IU4: 32, + Fmt.FMT_NUM_PK8_U4: 32, + Fmt.FMT_NUM_PK8_U8: 64, + Fmt.FMT_NUM_PK_F16: 32, + Fmt.FMT_NUM_PK_I16: 32, + Fmt.FMT_NUM_PK_I8: 32, + Fmt.FMT_NUM_PK_U16: 32, + Fmt.FMT_NUM_PK_U8: 32, + Fmt.FMT_NUM_U16: 16, + Fmt.FMT_NUM_U24: 24, + Fmt.FMT_NUM_U32: 32, + Fmt.FMT_NUM_U4: 4, + Fmt.FMT_NUM_U64: 64, + Fmt.FMT_NUM_U8: 8, + Fmt.FMT_RSRC: 128, + Fmt.FMT_RSRC_SCALAR: 128, + Fmt.FMT_RSRC_SCRATCH: 128, + Fmt.FMT_RSRC_SCRATCH_BYTE: 128, + Fmt.FMT_RSRC_SCRATCH_STRIDE: 128, + Fmt.FMT_RSRC_TYPED: 128, + Fmt.FMT_RSRC_TYPED_BYTE: 128, + Fmt.FMT_RSRC_TYPED_SCRATCH: 128, + Fmt.FMT_RSRC_TYPED_STRIDE: 128, + Fmt.FMT_RSRC_VECTOR: 128, + Fmt.FMT_RSRC_VECTOR_BYTE: 128, + Fmt.FMT_RSRC_VECTOR_STRIDE: 128, + Fmt.FMT_SAMP: 128, + Fmt.FMT_WMMA_AB_16X16_BF16: 128, + Fmt.FMT_WMMA_AB_16X16_BF8: 64, + Fmt.FMT_WMMA_AB_16X16_F16: 128, + Fmt.FMT_WMMA_AB_16X16_FP8: 64, + Fmt.FMT_WMMA_AB_16X16_IU4: 32, + Fmt.FMT_WMMA_AB_16X16_IU8: 64, + Fmt.FMT_WMMA_AB_16X32_BF16: 256, + Fmt.FMT_WMMA_AB_16X32_BF8: 128, + Fmt.FMT_WMMA_AB_16X32_F16: 256, + Fmt.FMT_WMMA_AB_16X32_FP8: 128, + Fmt.FMT_WMMA_AB_16X32_IU4: 64, + Fmt.FMT_WMMA_AB_16X32_IU8: 128, + Fmt.FMT_WMMA_AB_16X64_IU4: 128, + Fmt.FMT_WMMA_AB_BF16: 256, + Fmt.FMT_WMMA_AB_F16: 256, + Fmt.FMT_WMMA_AB_IU4: 64, + Fmt.FMT_WMMA_AB_IU8: 128, + Fmt.FMT_WMMA_DC_16X16_BF16: 128, + Fmt.FMT_WMMA_DC_16X16_F16: 128, + Fmt.FMT_WMMA_DC_16X16_F32: 256, + Fmt.FMT_WMMA_DC_16X16_I32: 256, + Fmt.FMT_WMMA_DC_BF16: 256, + Fmt.FMT_WMMA_DC_F16: 256, + Fmt.FMT_WMMA_DC_F32: 256, + Fmt.FMT_WMMA_DC_I32: 256, + Fmt.FMT_WMMA_INDEX_SET: 32, +} + +class OpType(Enum): + OPR_ACCVGPR = auto() + OPR_ATTR = auto() + OPR_CLAUSE = auto() + OPR_DELAY = auto() + OPR_EXEC = auto() + OPR_HWREG = auto() + OPR_LABEL = auto() + OPR_SDST = auto() + OPR_SDST_NULL = auto() + OPR_SENDMSG = auto() + OPR_SENDMSG_RTN = auto() + OPR_SIMM16 = auto() + OPR_SIMM24 = auto() + OPR_SIMM4 = auto() + OPR_SIMM5 = auto() + OPR_SIMM8 = auto() + OPR_SLEEP = auto() + OPR_SMEM_OFFSET = auto() + OPR_SMEM_OFFSET_NOK = auto() + OPR_SRC = auto() + OPR_SRC_ACCVGPR = auto() + OPR_SRC_NOLDS = auto() + OPR_SRC_NOLIT = auto() + OPR_SRC_SIMPLE = auto() + OPR_SRC_VGPR = auto() + OPR_SRC_VGPR_OR_ACCVGPR = auto() + OPR_SRC_VGPR_OR_ACCVGPR_OR_CONST = auto() + OPR_SRC_VGPR_OR_INLINE = auto() + OPR_SREG = auto() + OPR_SREG_LITERAL = auto() + OPR_SREG_M0 = auto() + OPR_SREG_M0_INL = auto() + OPR_SREG_NOVCC = auto() + OPR_SSRC = auto() + OPR_SSRC_BARRIER_ID = auto() + OPR_SSRC_LANESEL = auto() + OPR_SSRC_NOLIT = auto() + OPR_TGT = auto() + OPR_VERSION = auto() + OPR_VGPR = auto() + OPR_VGPR_OR_ACCVGPR = auto() + OPR_VGPR_OR_LDS = auto() + OPR_WAITCNT = auto() + OPR_WAITCNT_DEPCTR = auto() + OPR_WAIT_ALU = auto() + OPR_WAIT_EVENT = auto() + OPR_WAIT_MEM_DS = auto() \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/__init__.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/enum.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/enum.py new file mode 100644 index 000000000..1a95532f2 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/enum.py @@ -0,0 +1,2258 @@ +# autogenerated from AMD ISA XML - do not edit +from tinygrad.runtime.autogen.amd.common import ReprEnum, Fmt, FMT_BITS, OpType # noqa: F401 + +class DSOp(ReprEnum): + DS_ADD_U32 = 0 + DS_SUB_U32 = 1 + DS_RSUB_U32 = 2 + DS_INC_U32 = 3 + DS_DEC_U32 = 4 + DS_MIN_I32 = 5 + DS_MAX_I32 = 6 + DS_MIN_U32 = 7 + DS_MAX_U32 = 8 + DS_AND_B32 = 9 + DS_OR_B32 = 10 + DS_XOR_B32 = 11 + DS_MSKOR_B32 = 12 + DS_STORE_B32 = 13 + DS_STORE_2ADDR_B32 = 14 + DS_STORE_2ADDR_STRIDE64_B32 = 15 + DS_CMPSTORE_B32 = 16 + DS_CMPSTORE_F32 = 17 + DS_MIN_F32 = 18 + DS_MAX_F32 = 19 + DS_NOP = 20 + DS_ADD_F32 = 21 + DS_GWS_SEMA_RELEASE_ALL = 24 + DS_GWS_INIT = 25 + DS_GWS_SEMA_V = 26 + DS_GWS_SEMA_BR = 27 + DS_GWS_SEMA_P = 28 + DS_GWS_BARRIER = 29 + DS_STORE_B8 = 30 + DS_STORE_B16 = 31 + DS_ADD_RTN_U32 = 32 + DS_SUB_RTN_U32 = 33 + DS_RSUB_RTN_U32 = 34 + DS_INC_RTN_U32 = 35 + DS_DEC_RTN_U32 = 36 + DS_MIN_RTN_I32 = 37 + DS_MAX_RTN_I32 = 38 + DS_MIN_RTN_U32 = 39 + DS_MAX_RTN_U32 = 40 + DS_AND_RTN_B32 = 41 + DS_OR_RTN_B32 = 42 + DS_XOR_RTN_B32 = 43 + DS_MSKOR_RTN_B32 = 44 + DS_STOREXCHG_RTN_B32 = 45 + DS_STOREXCHG_2ADDR_RTN_B32 = 46 + DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32 = 47 + DS_CMPSTORE_RTN_B32 = 48 + DS_CMPSTORE_RTN_F32 = 49 + DS_MIN_RTN_F32 = 50 + DS_MAX_RTN_F32 = 51 + DS_WRAP_RTN_B32 = 52 + DS_SWIZZLE_B32 = 53 + DS_LOAD_B32 = 54 + DS_LOAD_2ADDR_B32 = 55 + DS_LOAD_2ADDR_STRIDE64_B32 = 56 + DS_LOAD_I8 = 57 + DS_LOAD_U8 = 58 + DS_LOAD_I16 = 59 + DS_LOAD_U16 = 60 + DS_CONSUME = 61 + DS_APPEND = 62 + DS_ORDERED_COUNT = 63 + DS_ADD_U64 = 64 + DS_SUB_U64 = 65 + DS_RSUB_U64 = 66 + DS_INC_U64 = 67 + DS_DEC_U64 = 68 + DS_MIN_I64 = 69 + DS_MAX_I64 = 70 + DS_MIN_U64 = 71 + DS_MAX_U64 = 72 + DS_AND_B64 = 73 + DS_OR_B64 = 74 + DS_XOR_B64 = 75 + DS_MSKOR_B64 = 76 + DS_STORE_B64 = 77 + DS_STORE_2ADDR_B64 = 78 + DS_STORE_2ADDR_STRIDE64_B64 = 79 + DS_CMPSTORE_B64 = 80 + DS_CMPSTORE_F64 = 81 + DS_MIN_F64 = 82 + DS_MAX_F64 = 83 + DS_ADD_RTN_U64 = 96 + DS_SUB_RTN_U64 = 97 + DS_RSUB_RTN_U64 = 98 + DS_INC_RTN_U64 = 99 + DS_DEC_RTN_U64 = 100 + DS_MIN_RTN_I64 = 101 + DS_MAX_RTN_I64 = 102 + DS_MIN_RTN_U64 = 103 + DS_MAX_RTN_U64 = 104 + DS_AND_RTN_B64 = 105 + DS_OR_RTN_B64 = 106 + DS_XOR_RTN_B64 = 107 + DS_MSKOR_RTN_B64 = 108 + DS_STOREXCHG_RTN_B64 = 109 + DS_STOREXCHG_2ADDR_RTN_B64 = 110 + DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64 = 111 + DS_CMPSTORE_RTN_B64 = 112 + DS_CMPSTORE_RTN_F64 = 113 + DS_MIN_RTN_F64 = 114 + DS_MAX_RTN_F64 = 115 + DS_LOAD_B64 = 118 + DS_LOAD_2ADDR_B64 = 119 + DS_LOAD_2ADDR_STRIDE64_B64 = 120 + DS_ADD_RTN_F32 = 121 + DS_ADD_GS_REG_RTN = 122 + DS_SUB_GS_REG_RTN = 123 + DS_CONDXCHG32_RTN_B64 = 126 + DS_STORE_B8_D16_HI = 160 + DS_STORE_B16_D16_HI = 161 + DS_LOAD_U8_D16 = 162 + DS_LOAD_U8_D16_HI = 163 + DS_LOAD_I8_D16 = 164 + DS_LOAD_I8_D16_HI = 165 + DS_LOAD_U16_D16 = 166 + DS_LOAD_U16_D16_HI = 167 + DS_BVH_STACK_RTN_B32 = 173 + DS_STORE_ADDTID_B32 = 176 + DS_LOAD_ADDTID_B32 = 177 + DS_PERMUTE_B32 = 178 + DS_BPERMUTE_B32 = 179 + DS_STORE_B96 = 222 + DS_STORE_B128 = 223 + DS_LOAD_B96 = 254 + DS_LOAD_B128 = 255 + +class EXPOp(ReprEnum): + EXP = 0 + +class FLATOp(ReprEnum): + FLAT_LOAD_U8 = 16 + FLAT_LOAD_I8 = 17 + FLAT_LOAD_U16 = 18 + FLAT_LOAD_I16 = 19 + FLAT_LOAD_B32 = 20 + FLAT_LOAD_B64 = 21 + FLAT_LOAD_B96 = 22 + FLAT_LOAD_B128 = 23 + FLAT_STORE_B8 = 24 + FLAT_STORE_B16 = 25 + FLAT_STORE_B32 = 26 + FLAT_STORE_B64 = 27 + FLAT_STORE_B96 = 28 + FLAT_STORE_B128 = 29 + FLAT_LOAD_D16_U8 = 30 + FLAT_LOAD_D16_I8 = 31 + FLAT_LOAD_D16_B16 = 32 + FLAT_LOAD_D16_HI_U8 = 33 + FLAT_LOAD_D16_HI_I8 = 34 + FLAT_LOAD_D16_HI_B16 = 35 + FLAT_STORE_D16_HI_B8 = 36 + FLAT_STORE_D16_HI_B16 = 37 + GLOBAL_LOAD_ADDTID_B32 = 40 + GLOBAL_STORE_ADDTID_B32 = 41 + GLOBAL_LOAD_LDS_ADDTID_B32 = 42 + FLAT_ATOMIC_SWAP_B32 = 51 + FLAT_ATOMIC_CMPSWAP_B32 = 52 + FLAT_ATOMIC_ADD_U32 = 53 + FLAT_ATOMIC_SUB_U32 = 54 + FLAT_ATOMIC_CSUB_U32 = 55 + FLAT_ATOMIC_MIN_I32 = 56 + FLAT_ATOMIC_MIN_U32 = 57 + FLAT_ATOMIC_MAX_I32 = 58 + FLAT_ATOMIC_MAX_U32 = 59 + FLAT_ATOMIC_AND_B32 = 60 + FLAT_ATOMIC_OR_B32 = 61 + FLAT_ATOMIC_XOR_B32 = 62 + FLAT_ATOMIC_INC_U32 = 63 + FLAT_ATOMIC_DEC_U32 = 64 + FLAT_ATOMIC_SWAP_B64 = 65 + FLAT_ATOMIC_CMPSWAP_B64 = 66 + FLAT_ATOMIC_ADD_U64 = 67 + FLAT_ATOMIC_SUB_U64 = 68 + FLAT_ATOMIC_MIN_I64 = 69 + FLAT_ATOMIC_MIN_U64 = 70 + FLAT_ATOMIC_MAX_I64 = 71 + FLAT_ATOMIC_MAX_U64 = 72 + FLAT_ATOMIC_AND_B64 = 73 + FLAT_ATOMIC_OR_B64 = 74 + FLAT_ATOMIC_XOR_B64 = 75 + FLAT_ATOMIC_INC_U64 = 76 + FLAT_ATOMIC_DEC_U64 = 77 + FLAT_ATOMIC_CMPSWAP_F32 = 80 + FLAT_ATOMIC_MIN_F32 = 81 + FLAT_ATOMIC_MAX_F32 = 82 + FLAT_ATOMIC_ADD_F32 = 86 + +class GLOBALOp(ReprEnum): + GLOBAL_LOAD_U8 = 16 + GLOBAL_LOAD_I8 = 17 + GLOBAL_LOAD_U16 = 18 + GLOBAL_LOAD_I16 = 19 + GLOBAL_LOAD_B32 = 20 + GLOBAL_LOAD_B64 = 21 + GLOBAL_LOAD_B96 = 22 + GLOBAL_LOAD_B128 = 23 + GLOBAL_STORE_B8 = 24 + GLOBAL_STORE_B16 = 25 + GLOBAL_STORE_B32 = 26 + GLOBAL_STORE_B64 = 27 + GLOBAL_STORE_B96 = 28 + GLOBAL_STORE_B128 = 29 + GLOBAL_LOAD_D16_U8 = 30 + GLOBAL_LOAD_D16_I8 = 31 + GLOBAL_LOAD_D16_B16 = 32 + GLOBAL_LOAD_D16_HI_U8 = 33 + GLOBAL_LOAD_D16_HI_I8 = 34 + GLOBAL_LOAD_D16_HI_B16 = 35 + GLOBAL_STORE_D16_HI_B8 = 36 + GLOBAL_STORE_D16_HI_B16 = 37 + GLOBAL_LOAD_ADDTID_B32 = 40 + GLOBAL_STORE_ADDTID_B32 = 41 + GLOBAL_LOAD_LDS_ADDTID_B32 = 42 + GLOBAL_LOAD_LDS_U8 = 45 + GLOBAL_LOAD_LDS_I8 = 46 + GLOBAL_LOAD_LDS_U16 = 47 + GLOBAL_LOAD_LDS_I16 = 48 + GLOBAL_LOAD_LDS_B32 = 49 + GLOBAL_ATOMIC_SWAP_B32 = 51 + GLOBAL_ATOMIC_CMPSWAP_B32 = 52 + GLOBAL_ATOMIC_ADD_U32 = 53 + GLOBAL_ATOMIC_SUB_U32 = 54 + GLOBAL_ATOMIC_CSUB_U32 = 55 + GLOBAL_ATOMIC_MIN_I32 = 56 + GLOBAL_ATOMIC_MIN_U32 = 57 + GLOBAL_ATOMIC_MAX_I32 = 58 + GLOBAL_ATOMIC_MAX_U32 = 59 + GLOBAL_ATOMIC_AND_B32 = 60 + GLOBAL_ATOMIC_OR_B32 = 61 + GLOBAL_ATOMIC_XOR_B32 = 62 + GLOBAL_ATOMIC_INC_U32 = 63 + GLOBAL_ATOMIC_DEC_U32 = 64 + GLOBAL_ATOMIC_SWAP_B64 = 65 + GLOBAL_ATOMIC_CMPSWAP_B64 = 66 + GLOBAL_ATOMIC_ADD_U64 = 67 + GLOBAL_ATOMIC_SUB_U64 = 68 + GLOBAL_ATOMIC_MIN_I64 = 69 + GLOBAL_ATOMIC_MIN_U64 = 70 + GLOBAL_ATOMIC_MAX_I64 = 71 + GLOBAL_ATOMIC_MAX_U64 = 72 + GLOBAL_ATOMIC_AND_B64 = 73 + GLOBAL_ATOMIC_OR_B64 = 74 + GLOBAL_ATOMIC_XOR_B64 = 75 + GLOBAL_ATOMIC_INC_U64 = 76 + GLOBAL_ATOMIC_DEC_U64 = 77 + GLOBAL_ATOMIC_CMPSWAP_F32 = 80 + GLOBAL_ATOMIC_MIN_F32 = 81 + GLOBAL_ATOMIC_MAX_F32 = 82 + GLOBAL_ATOMIC_ADD_F32 = 86 + +class HWREG(ReprEnum): + HW_REG_MODE = 1 + HW_REG_STATUS = 2 + HW_REG_TRAPSTS = 3 + HW_REG_GPR_ALLOC = 5 + HW_REG_LDS_ALLOC = 6 + HW_REG_IB_STS = 7 + HW_REG_PC_LO = 8 + HW_REG_PC_HI = 9 + HW_REG_IB_DBG1 = 13 + HW_REG_FLUSH_IB = 14 + HW_REG_SH_MEM_BASES = 15 + HW_REG_SHADER_TBA_LO = 16 + HW_REG_SHADER_TBA_HI = 17 + HW_REG_PERF_SNAPSHOT_PC_LO = 18 + HW_REG_PERF_SNAPSHOT_PC_HI = 19 + HW_REG_SHADER_FLAT_SCRATCH_LO = 20 + HW_REG_SHADER_FLAT_SCRATCH_HI = 21 + HW_REG_HW_ID1 = 23 + HW_REG_HW_ID2 = 24 + HW_REG_POPS_PACKER = 25 + HW_REG_SCHED_MODE = 26 + HW_REG_PERF_SNAPSHOT_DATA = 27 + HW_REG_IB_STS2 = 28 + HW_REG_SHADER_CYCLES = 29 + +class LDSDIROp(ReprEnum): + LDS_PARAM_LOAD = 0 + LDS_DIRECT_LOAD = 1 + +class MIMGOp(ReprEnum): + IMAGE_LOAD = 0 + IMAGE_LOAD_MIP = 1 + IMAGE_LOAD_PCK = 2 + IMAGE_LOAD_PCK_SGN = 3 + IMAGE_LOAD_MIP_PCK = 4 + IMAGE_LOAD_MIP_PCK_SGN = 5 + IMAGE_STORE = 6 + IMAGE_STORE_MIP = 7 + IMAGE_STORE_PCK = 8 + IMAGE_STORE_MIP_PCK = 9 + IMAGE_ATOMIC_SWAP = 10 + IMAGE_ATOMIC_CMPSWAP = 11 + IMAGE_ATOMIC_ADD = 12 + IMAGE_ATOMIC_SUB = 13 + IMAGE_ATOMIC_SMIN = 14 + IMAGE_ATOMIC_UMIN = 15 + IMAGE_ATOMIC_SMAX = 16 + IMAGE_ATOMIC_UMAX = 17 + IMAGE_ATOMIC_AND = 18 + IMAGE_ATOMIC_OR = 19 + IMAGE_ATOMIC_XOR = 20 + IMAGE_ATOMIC_INC = 21 + IMAGE_ATOMIC_DEC = 22 + IMAGE_GET_RESINFO = 23 + IMAGE_MSAA_LOAD = 24 + IMAGE_BVH_INTERSECT_RAY = 25 + IMAGE_BVH64_INTERSECT_RAY = 26 + IMAGE_SAMPLE = 27 + IMAGE_SAMPLE_D = 28 + IMAGE_SAMPLE_L = 29 + IMAGE_SAMPLE_B = 30 + IMAGE_SAMPLE_LZ = 31 + IMAGE_SAMPLE_C = 32 + IMAGE_SAMPLE_C_D = 33 + IMAGE_SAMPLE_C_L = 34 + IMAGE_SAMPLE_C_B = 35 + IMAGE_SAMPLE_C_LZ = 36 + IMAGE_SAMPLE_O = 37 + IMAGE_SAMPLE_D_O = 38 + IMAGE_SAMPLE_L_O = 39 + IMAGE_SAMPLE_B_O = 40 + IMAGE_SAMPLE_LZ_O = 41 + IMAGE_SAMPLE_C_O = 42 + IMAGE_SAMPLE_C_D_O = 43 + IMAGE_SAMPLE_C_L_O = 44 + IMAGE_SAMPLE_C_B_O = 45 + IMAGE_SAMPLE_C_LZ_O = 46 + IMAGE_GATHER4 = 47 + IMAGE_GATHER4_L = 48 + IMAGE_GATHER4_B = 49 + IMAGE_GATHER4_LZ = 50 + IMAGE_GATHER4_C = 51 + IMAGE_GATHER4_C_LZ = 52 + IMAGE_GATHER4_O = 53 + IMAGE_GATHER4_LZ_O = 54 + IMAGE_GATHER4_C_LZ_O = 55 + IMAGE_GET_LOD = 56 + IMAGE_SAMPLE_D_G16 = 57 + IMAGE_SAMPLE_C_D_G16 = 58 + IMAGE_SAMPLE_D_O_G16 = 59 + IMAGE_SAMPLE_C_D_O_G16 = 60 + IMAGE_SAMPLE_CL = 64 + IMAGE_SAMPLE_D_CL = 65 + IMAGE_SAMPLE_B_CL = 66 + IMAGE_SAMPLE_C_CL = 67 + IMAGE_SAMPLE_C_D_CL = 68 + IMAGE_SAMPLE_C_B_CL = 69 + IMAGE_SAMPLE_CL_O = 70 + IMAGE_SAMPLE_D_CL_O = 71 + IMAGE_SAMPLE_B_CL_O = 72 + IMAGE_SAMPLE_C_CL_O = 73 + IMAGE_SAMPLE_C_D_CL_O = 74 + IMAGE_SAMPLE_C_B_CL_O = 75 + IMAGE_SAMPLE_C_D_CL_G16 = 84 + IMAGE_SAMPLE_D_CL_O_G16 = 85 + IMAGE_SAMPLE_C_D_CL_O_G16 = 86 + IMAGE_SAMPLE_D_CL_G16 = 95 + IMAGE_GATHER4_CL = 96 + IMAGE_GATHER4_B_CL = 97 + IMAGE_GATHER4_C_CL = 98 + IMAGE_GATHER4_C_L = 99 + IMAGE_GATHER4_C_B = 100 + IMAGE_GATHER4_C_B_CL = 101 + IMAGE_GATHER4H = 144 + +class MSG(ReprEnum): + MSG_RTN_GET_DOORBELL = 128 + MSG_RTN_GET_DDID = 129 + MSG_RTN_GET_TMA = 130 + MSG_RTN_GET_REALTIME = 131 + MSG_RTN_SAVE_WAVE = 132 + MSG_RTN_GET_TBA = 133 + MSG_RTN_GET_TBA_TO_PC = 134 + MSG_RTN_ILLEGAL_MSG = 255 + +class MTBUFOp(ReprEnum): + TBUFFER_LOAD_FORMAT_X = 0 + TBUFFER_LOAD_FORMAT_XY = 1 + TBUFFER_LOAD_FORMAT_XYZ = 2 + TBUFFER_LOAD_FORMAT_XYZW = 3 + TBUFFER_STORE_FORMAT_X = 4 + TBUFFER_STORE_FORMAT_XY = 5 + TBUFFER_STORE_FORMAT_XYZ = 6 + TBUFFER_STORE_FORMAT_XYZW = 7 + TBUFFER_LOAD_D16_FORMAT_X = 8 + TBUFFER_LOAD_D16_FORMAT_XY = 9 + TBUFFER_LOAD_D16_FORMAT_XYZ = 10 + TBUFFER_LOAD_D16_FORMAT_XYZW = 11 + TBUFFER_STORE_D16_FORMAT_X = 12 + TBUFFER_STORE_D16_FORMAT_XY = 13 + TBUFFER_STORE_D16_FORMAT_XYZ = 14 + TBUFFER_STORE_D16_FORMAT_XYZW = 15 + +class MUBUFOp(ReprEnum): + BUFFER_LOAD_FORMAT_X = 0 + BUFFER_LOAD_FORMAT_XY = 1 + BUFFER_LOAD_FORMAT_XYZ = 2 + BUFFER_LOAD_FORMAT_XYZW = 3 + BUFFER_STORE_FORMAT_X = 4 + BUFFER_STORE_FORMAT_XY = 5 + BUFFER_STORE_FORMAT_XYZ = 6 + BUFFER_STORE_FORMAT_XYZW = 7 + BUFFER_LOAD_D16_FORMAT_X = 8 + BUFFER_LOAD_D16_FORMAT_XY = 9 + BUFFER_LOAD_D16_FORMAT_XYZ = 10 + BUFFER_LOAD_D16_FORMAT_XYZW = 11 + BUFFER_STORE_D16_FORMAT_X = 12 + BUFFER_STORE_D16_FORMAT_XY = 13 + BUFFER_STORE_D16_FORMAT_XYZ = 14 + BUFFER_STORE_D16_FORMAT_XYZW = 15 + BUFFER_LOAD_U8 = 16 + BUFFER_LOAD_I8 = 17 + BUFFER_LOAD_U16 = 18 + BUFFER_LOAD_I16 = 19 + BUFFER_LOAD_B32 = 20 + BUFFER_LOAD_B64 = 21 + BUFFER_LOAD_B96 = 22 + BUFFER_LOAD_B128 = 23 + BUFFER_STORE_B8 = 24 + BUFFER_STORE_B16 = 25 + BUFFER_STORE_B32 = 26 + BUFFER_STORE_B64 = 27 + BUFFER_STORE_B96 = 28 + BUFFER_STORE_B128 = 29 + BUFFER_LOAD_D16_U8 = 30 + BUFFER_LOAD_D16_I8 = 31 + BUFFER_LOAD_D16_B16 = 32 + BUFFER_LOAD_D16_HI_U8 = 33 + BUFFER_LOAD_D16_HI_I8 = 34 + BUFFER_LOAD_D16_HI_B16 = 35 + BUFFER_STORE_D16_HI_B8 = 36 + BUFFER_STORE_D16_HI_B16 = 37 + BUFFER_LOAD_D16_HI_FORMAT_X = 38 + BUFFER_STORE_D16_HI_FORMAT_X = 39 + BUFFER_GL0_INV = 43 + BUFFER_GL1_INV = 44 + BUFFER_LOAD_LDS_U8 = 45 + BUFFER_LOAD_LDS_I8 = 46 + BUFFER_LOAD_LDS_U16 = 47 + BUFFER_LOAD_LDS_I16 = 48 + BUFFER_LOAD_LDS_B32 = 49 + BUFFER_LOAD_LDS_FORMAT_X = 50 + BUFFER_ATOMIC_SWAP_B32 = 51 + BUFFER_ATOMIC_CMPSWAP_B32 = 52 + BUFFER_ATOMIC_ADD_U32 = 53 + BUFFER_ATOMIC_SUB_U32 = 54 + BUFFER_ATOMIC_CSUB_U32 = 55 + BUFFER_ATOMIC_MIN_I32 = 56 + BUFFER_ATOMIC_MIN_U32 = 57 + BUFFER_ATOMIC_MAX_I32 = 58 + BUFFER_ATOMIC_MAX_U32 = 59 + BUFFER_ATOMIC_AND_B32 = 60 + BUFFER_ATOMIC_OR_B32 = 61 + BUFFER_ATOMIC_XOR_B32 = 62 + BUFFER_ATOMIC_INC_U32 = 63 + BUFFER_ATOMIC_DEC_U32 = 64 + BUFFER_ATOMIC_SWAP_B64 = 65 + BUFFER_ATOMIC_CMPSWAP_B64 = 66 + BUFFER_ATOMIC_ADD_U64 = 67 + BUFFER_ATOMIC_SUB_U64 = 68 + BUFFER_ATOMIC_MIN_I64 = 69 + BUFFER_ATOMIC_MIN_U64 = 70 + BUFFER_ATOMIC_MAX_I64 = 71 + BUFFER_ATOMIC_MAX_U64 = 72 + BUFFER_ATOMIC_AND_B64 = 73 + BUFFER_ATOMIC_OR_B64 = 74 + BUFFER_ATOMIC_XOR_B64 = 75 + BUFFER_ATOMIC_INC_U64 = 76 + BUFFER_ATOMIC_DEC_U64 = 77 + BUFFER_ATOMIC_CMPSWAP_F32 = 80 + BUFFER_ATOMIC_MIN_F32 = 81 + BUFFER_ATOMIC_MAX_F32 = 82 + BUFFER_ATOMIC_ADD_F32 = 86 + +class SCRATCHOp(ReprEnum): + SCRATCH_LOAD_U8 = 16 + SCRATCH_LOAD_I8 = 17 + SCRATCH_LOAD_U16 = 18 + SCRATCH_LOAD_I16 = 19 + SCRATCH_LOAD_B32 = 20 + SCRATCH_LOAD_B64 = 21 + SCRATCH_LOAD_B96 = 22 + SCRATCH_LOAD_B128 = 23 + SCRATCH_STORE_B8 = 24 + SCRATCH_STORE_B16 = 25 + SCRATCH_STORE_B32 = 26 + SCRATCH_STORE_B64 = 27 + SCRATCH_STORE_B96 = 28 + SCRATCH_STORE_B128 = 29 + SCRATCH_LOAD_D16_U8 = 30 + SCRATCH_LOAD_D16_I8 = 31 + SCRATCH_LOAD_D16_B16 = 32 + SCRATCH_LOAD_D16_HI_U8 = 33 + SCRATCH_LOAD_D16_HI_I8 = 34 + SCRATCH_LOAD_D16_HI_B16 = 35 + SCRATCH_STORE_D16_HI_B8 = 36 + SCRATCH_STORE_D16_HI_B16 = 37 + SCRATCH_LOAD_LDS_U8 = 45 + SCRATCH_LOAD_LDS_I8 = 46 + SCRATCH_LOAD_LDS_U16 = 47 + SCRATCH_LOAD_LDS_I16 = 48 + SCRATCH_LOAD_LDS_B32 = 49 + +class SMEMOp(ReprEnum): + S_LOAD_B32 = 0 + S_LOAD_B64 = 1 + S_LOAD_B128 = 2 + S_LOAD_B256 = 3 + S_LOAD_B512 = 4 + S_BUFFER_LOAD_B32 = 8 + S_BUFFER_LOAD_B64 = 9 + S_BUFFER_LOAD_B128 = 10 + S_BUFFER_LOAD_B256 = 11 + S_BUFFER_LOAD_B512 = 12 + S_GL1_INV = 32 + S_DCACHE_INV = 33 + S_ATC_PROBE = 34 + S_ATC_PROBE_BUFFER = 35 + +class SOP1Op(ReprEnum): + S_MOV_B32 = 0 + S_MOV_B64 = 1 + S_CMOV_B32 = 2 + S_CMOV_B64 = 3 + S_BREV_B32 = 4 + S_BREV_B64 = 5 + S_CTZ_I32_B32 = 8 + S_CTZ_I32_B64 = 9 + S_CLZ_I32_U32 = 10 + S_CLZ_I32_U64 = 11 + S_CLS_I32 = 12 + S_CLS_I32_I64 = 13 + S_SEXT_I32_I8 = 14 + S_SEXT_I32_I16 = 15 + S_BITSET0_B32 = 16 + S_BITSET0_B64 = 17 + S_BITSET1_B32 = 18 + S_BITSET1_B64 = 19 + S_BITREPLICATE_B64_B32 = 20 + S_ABS_I32 = 21 + S_BCNT0_I32_B32 = 22 + S_BCNT0_I32_B64 = 23 + S_BCNT1_I32_B32 = 24 + S_BCNT1_I32_B64 = 25 + S_QUADMASK_B32 = 26 + S_QUADMASK_B64 = 27 + S_WQM_B32 = 28 + S_WQM_B64 = 29 + S_NOT_B32 = 30 + S_NOT_B64 = 31 + S_AND_SAVEEXEC_B32 = 32 + S_AND_SAVEEXEC_B64 = 33 + S_OR_SAVEEXEC_B32 = 34 + S_OR_SAVEEXEC_B64 = 35 + S_XOR_SAVEEXEC_B32 = 36 + S_XOR_SAVEEXEC_B64 = 37 + S_NAND_SAVEEXEC_B32 = 38 + S_NAND_SAVEEXEC_B64 = 39 + S_NOR_SAVEEXEC_B32 = 40 + S_NOR_SAVEEXEC_B64 = 41 + S_XNOR_SAVEEXEC_B32 = 42 + S_XNOR_SAVEEXEC_B64 = 43 + S_AND_NOT0_SAVEEXEC_B32 = 44 + S_AND_NOT0_SAVEEXEC_B64 = 45 + S_OR_NOT0_SAVEEXEC_B32 = 46 + S_OR_NOT0_SAVEEXEC_B64 = 47 + S_AND_NOT1_SAVEEXEC_B32 = 48 + S_AND_NOT1_SAVEEXEC_B64 = 49 + S_OR_NOT1_SAVEEXEC_B32 = 50 + S_OR_NOT1_SAVEEXEC_B64 = 51 + S_AND_NOT0_WREXEC_B32 = 52 + S_AND_NOT0_WREXEC_B64 = 53 + S_AND_NOT1_WREXEC_B32 = 54 + S_AND_NOT1_WREXEC_B64 = 55 + S_MOVRELS_B32 = 64 + S_MOVRELS_B64 = 65 + S_MOVRELD_B32 = 66 + S_MOVRELD_B64 = 67 + S_MOVRELSD_2_B32 = 68 + S_GETPC_B64 = 71 + S_SETPC_B64 = 72 + S_SWAPPC_B64 = 73 + S_RFE_B64 = 74 + S_SENDMSG_RTN_B32 = 76 + S_SENDMSG_RTN_B64 = 77 + S_CEIL_F32 = 96 + S_FLOOR_F32 = 97 + S_TRUNC_F32 = 98 + S_RNDNE_F32 = 99 + S_CVT_F32_I32 = 100 + S_CVT_F32_U32 = 101 + S_CVT_I32_F32 = 102 + S_CVT_U32_F32 = 103 + S_CVT_F16_F32 = 104 + S_CVT_F32_F16 = 105 + S_CVT_HI_F32_F16 = 106 + S_CEIL_F16 = 107 + S_FLOOR_F16 = 108 + S_TRUNC_F16 = 109 + S_RNDNE_F16 = 110 + +class SOP2Op(ReprEnum): + S_ADD_U32 = 0 + S_SUB_U32 = 1 + S_ADD_I32 = 2 + S_SUB_I32 = 3 + S_ADDC_U32 = 4 + S_SUBB_U32 = 5 + S_ABSDIFF_I32 = 6 + S_LSHL_B32 = 8 + S_LSHL_B64 = 9 + S_LSHR_B32 = 10 + S_LSHR_B64 = 11 + S_ASHR_I32 = 12 + S_ASHR_I64 = 13 + S_LSHL1_ADD_U32 = 14 + S_LSHL2_ADD_U32 = 15 + S_LSHL3_ADD_U32 = 16 + S_LSHL4_ADD_U32 = 17 + S_MIN_I32 = 18 + S_MIN_U32 = 19 + S_MAX_I32 = 20 + S_MAX_U32 = 21 + S_AND_B32 = 22 + S_AND_B64 = 23 + S_OR_B32 = 24 + S_OR_B64 = 25 + S_XOR_B32 = 26 + S_XOR_B64 = 27 + S_NAND_B32 = 28 + S_NAND_B64 = 29 + S_NOR_B32 = 30 + S_NOR_B64 = 31 + S_XNOR_B32 = 32 + S_XNOR_B64 = 33 + S_AND_NOT1_B32 = 34 + S_AND_NOT1_B64 = 35 + S_OR_NOT1_B32 = 36 + S_OR_NOT1_B64 = 37 + S_BFE_U32 = 38 + S_BFE_I32 = 39 + S_BFE_U64 = 40 + S_BFE_I64 = 41 + S_BFM_B32 = 42 + S_BFM_B64 = 43 + S_MUL_I32 = 44 + S_MUL_HI_U32 = 45 + S_MUL_HI_I32 = 46 + S_CSELECT_B32 = 48 + S_CSELECT_B64 = 49 + S_PACK_LL_B32_B16 = 50 + S_PACK_LH_B32_B16 = 51 + S_PACK_HH_B32_B16 = 52 + S_PACK_HL_B32_B16 = 53 + S_ADD_F32 = 64 + S_SUB_F32 = 65 + S_MIN_F32 = 66 + S_MAX_F32 = 67 + S_MUL_F32 = 68 + S_FMAAK_F32 = 69 + S_FMAMK_F32 = 70 + S_FMAC_F32 = 71 + S_CVT_PK_RTZ_F16_F32 = 72 + S_ADD_F16 = 73 + S_SUB_F16 = 74 + S_MIN_F16 = 75 + S_MAX_F16 = 76 + S_MUL_F16 = 77 + S_FMAC_F16 = 78 + +class SOPCOp(ReprEnum): + S_CMP_EQ_I32 = 0 + S_CMP_LG_I32 = 1 + S_CMP_GT_I32 = 2 + S_CMP_GE_I32 = 3 + S_CMP_LT_I32 = 4 + S_CMP_LE_I32 = 5 + S_CMP_EQ_U32 = 6 + S_CMP_LG_U32 = 7 + S_CMP_GT_U32 = 8 + S_CMP_GE_U32 = 9 + S_CMP_LT_U32 = 10 + S_CMP_LE_U32 = 11 + S_BITCMP0_B32 = 12 + S_BITCMP1_B32 = 13 + S_BITCMP0_B64 = 14 + S_BITCMP1_B64 = 15 + S_CMP_EQ_U64 = 16 + S_CMP_LG_U64 = 17 + S_CMP_LT_F32 = 65 + S_CMP_EQ_F32 = 66 + S_CMP_LE_F32 = 67 + S_CMP_GT_F32 = 68 + S_CMP_LG_F32 = 69 + S_CMP_GE_F32 = 70 + S_CMP_O_F32 = 71 + S_CMP_U_F32 = 72 + S_CMP_NGE_F32 = 73 + S_CMP_NLG_F32 = 74 + S_CMP_NGT_F32 = 75 + S_CMP_NLE_F32 = 76 + S_CMP_NEQ_F32 = 77 + S_CMP_NLT_F32 = 78 + S_CMP_LT_F16 = 81 + S_CMP_EQ_F16 = 82 + S_CMP_LE_F16 = 83 + S_CMP_GT_F16 = 84 + S_CMP_LG_F16 = 85 + S_CMP_GE_F16 = 86 + S_CMP_O_F16 = 87 + S_CMP_U_F16 = 88 + S_CMP_NGE_F16 = 89 + S_CMP_NLG_F16 = 90 + S_CMP_NGT_F16 = 91 + S_CMP_NLE_F16 = 92 + S_CMP_NEQ_F16 = 93 + S_CMP_NLT_F16 = 94 + +class SOPKOp(ReprEnum): + S_MOVK_I32 = 0 + S_VERSION = 1 + S_CMOVK_I32 = 2 + S_CMPK_EQ_I32 = 3 + S_CMPK_LG_I32 = 4 + S_CMPK_GT_I32 = 5 + S_CMPK_GE_I32 = 6 + S_CMPK_LT_I32 = 7 + S_CMPK_LE_I32 = 8 + S_CMPK_EQ_U32 = 9 + S_CMPK_LG_U32 = 10 + S_CMPK_GT_U32 = 11 + S_CMPK_GE_U32 = 12 + S_CMPK_LT_U32 = 13 + S_CMPK_LE_U32 = 14 + S_ADDK_I32 = 15 + S_MULK_I32 = 16 + S_GETREG_B32 = 17 + S_SETREG_B32 = 18 + S_SETREG_IMM32_B32 = 19 + S_CALL_B64 = 20 + S_SUBVECTOR_LOOP_BEGIN = 22 + S_SUBVECTOR_LOOP_END = 23 + S_WAITCNT_VSCNT = 24 + S_WAITCNT_VMCNT = 25 + S_WAITCNT_EXPCNT = 26 + S_WAITCNT_LGKMCNT = 27 + +class SOPPOp(ReprEnum): + S_NOP = 0 + S_SETKILL = 1 + S_SETHALT = 2 + S_SLEEP = 3 + S_SET_INST_PREFETCH_DISTANCE = 4 + S_CLAUSE = 5 + S_DELAY_ALU = 7 + S_WAITCNT_DEPCTR = 8 + S_WAITCNT = 9 + S_WAIT_IDLE = 10 + S_WAIT_EVENT = 11 + S_TRAP = 16 + S_ROUND_MODE = 17 + S_DENORM_MODE = 18 + S_CODE_END = 31 + S_BRANCH = 32 + S_CBRANCH_SCC0 = 33 + S_CBRANCH_SCC1 = 34 + S_CBRANCH_VCCZ = 35 + S_CBRANCH_VCCNZ = 36 + S_CBRANCH_EXECZ = 37 + S_CBRANCH_EXECNZ = 38 + S_CBRANCH_CDBGSYS = 39 + S_CBRANCH_CDBGUSER = 40 + S_CBRANCH_CDBGSYS_OR_USER = 41 + S_CBRANCH_CDBGSYS_AND_USER = 42 + S_ENDPGM = 48 + S_ENDPGM_SAVED = 49 + S_ENDPGM_ORDERED_PS_DONE = 50 + S_WAKEUP = 52 + S_SETPRIO = 53 + S_SENDMSG = 54 + S_SENDMSGHALT = 55 + S_INCPERFLEVEL = 56 + S_DECPERFLEVEL = 57 + S_TTRACEDATA = 58 + S_TTRACEDATA_IMM = 59 + S_ICACHE_INV = 60 + S_BARRIER = 61 + +class VINTERPOp(ReprEnum): + V_INTERP_P10_F32 = 0 + V_INTERP_P2_F32 = 1 + V_INTERP_P10_F16_F32 = 2 + V_INTERP_P2_F16_F32 = 3 + V_INTERP_P10_RTZ_F16_F32 = 4 + V_INTERP_P2_RTZ_F16_F32 = 5 + +class VOP1Op(ReprEnum): + V_NOP_E32 = 0 + V_MOV_B32_E32 = 1 + V_READFIRSTLANE_B32_E32 = 2 + V_CVT_I32_F64_E32 = 3 + V_CVT_F64_I32_E32 = 4 + V_CVT_F32_I32_E32 = 5 + V_CVT_F32_U32_E32 = 6 + V_CVT_U32_F32_E32 = 7 + V_CVT_I32_F32_E32 = 8 + V_CVT_F16_F32_E32 = 10 + V_CVT_F32_F16_E32 = 11 + V_CVT_NEAREST_I32_F32_E32 = 12 + V_CVT_FLOOR_I32_F32_E32 = 13 + V_CVT_OFF_F32_I4_E32 = 14 + V_CVT_F32_F64_E32 = 15 + V_CVT_F64_F32_E32 = 16 + V_CVT_F32_UBYTE0_E32 = 17 + V_CVT_F32_UBYTE1_E32 = 18 + V_CVT_F32_UBYTE2_E32 = 19 + V_CVT_F32_UBYTE3_E32 = 20 + V_CVT_U32_F64_E32 = 21 + V_CVT_F64_U32_E32 = 22 + V_TRUNC_F64_E32 = 23 + V_CEIL_F64_E32 = 24 + V_RNDNE_F64_E32 = 25 + V_FLOOR_F64_E32 = 26 + V_PIPEFLUSH_E32 = 27 + V_MOV_B16_E32 = 28 + V_FRACT_F32_E32 = 32 + V_TRUNC_F32_E32 = 33 + V_CEIL_F32_E32 = 34 + V_RNDNE_F32_E32 = 35 + V_FLOOR_F32_E32 = 36 + V_EXP_F32_E32 = 37 + V_LOG_F32_E32 = 39 + V_RCP_F32_E32 = 42 + V_RCP_IFLAG_F32_E32 = 43 + V_RSQ_F32_E32 = 46 + V_RCP_F64_E32 = 47 + V_RSQ_F64_E32 = 49 + V_SQRT_F32_E32 = 51 + V_SQRT_F64_E32 = 52 + V_SIN_F32_E32 = 53 + V_COS_F32_E32 = 54 + V_NOT_B32_E32 = 55 + V_BFREV_B32_E32 = 56 + V_CLZ_I32_U32_E32 = 57 + V_CTZ_I32_B32_E32 = 58 + V_CLS_I32_E32 = 59 + V_FREXP_EXP_I32_F64_E32 = 60 + V_FREXP_MANT_F64_E32 = 61 + V_FRACT_F64_E32 = 62 + V_FREXP_EXP_I32_F32_E32 = 63 + V_FREXP_MANT_F32_E32 = 64 + V_MOVRELD_B32_E32 = 66 + V_MOVRELS_B32_E32 = 67 + V_MOVRELSD_B32_E32 = 68 + V_MOVRELSD_2_B32_E32 = 72 + V_CVT_F16_U16_E32 = 80 + V_CVT_F16_I16_E32 = 81 + V_CVT_U16_F16_E32 = 82 + V_CVT_I16_F16_E32 = 83 + V_RCP_F16_E32 = 84 + V_SQRT_F16_E32 = 85 + V_RSQ_F16_E32 = 86 + V_LOG_F16_E32 = 87 + V_EXP_F16_E32 = 88 + V_FREXP_MANT_F16_E32 = 89 + V_FREXP_EXP_I16_F16_E32 = 90 + V_FLOOR_F16_E32 = 91 + V_CEIL_F16_E32 = 92 + V_TRUNC_F16_E32 = 93 + V_RNDNE_F16_E32 = 94 + V_FRACT_F16_E32 = 95 + V_SIN_F16_E32 = 96 + V_COS_F16_E32 = 97 + V_SAT_PK_U8_I16_E32 = 98 + V_CVT_NORM_I16_F16_E32 = 99 + V_CVT_NORM_U16_F16_E32 = 100 + V_SWAP_B32_E32 = 101 + V_SWAP_B16_E32 = 102 + V_PERMLANE64_B32_E32 = 103 + V_SWAPREL_B32_E32 = 104 + V_NOT_B16_E32 = 105 + V_CVT_I32_I16_E32 = 106 + V_CVT_U32_U16_E32 = 107 + V_NOP = V_NOP_E32 + V_MOV_B32 = V_MOV_B32_E32 + V_READFIRSTLANE_B32 = V_READFIRSTLANE_B32_E32 + V_CVT_I32_F64 = V_CVT_I32_F64_E32 + V_CVT_F64_I32 = V_CVT_F64_I32_E32 + V_CVT_F32_I32 = V_CVT_F32_I32_E32 + V_CVT_F32_U32 = V_CVT_F32_U32_E32 + V_CVT_U32_F32 = V_CVT_U32_F32_E32 + V_CVT_I32_F32 = V_CVT_I32_F32_E32 + V_CVT_F16_F32 = V_CVT_F16_F32_E32 + V_CVT_F32_F16 = V_CVT_F32_F16_E32 + V_CVT_NEAREST_I32_F32 = V_CVT_NEAREST_I32_F32_E32 + V_CVT_FLOOR_I32_F32 = V_CVT_FLOOR_I32_F32_E32 + V_CVT_OFF_F32_I4 = V_CVT_OFF_F32_I4_E32 + V_CVT_F32_F64 = V_CVT_F32_F64_E32 + V_CVT_F64_F32 = V_CVT_F64_F32_E32 + V_CVT_F32_UBYTE0 = V_CVT_F32_UBYTE0_E32 + V_CVT_F32_UBYTE1 = V_CVT_F32_UBYTE1_E32 + V_CVT_F32_UBYTE2 = V_CVT_F32_UBYTE2_E32 + V_CVT_F32_UBYTE3 = V_CVT_F32_UBYTE3_E32 + V_CVT_U32_F64 = V_CVT_U32_F64_E32 + V_CVT_F64_U32 = V_CVT_F64_U32_E32 + V_TRUNC_F64 = V_TRUNC_F64_E32 + V_CEIL_F64 = V_CEIL_F64_E32 + V_RNDNE_F64 = V_RNDNE_F64_E32 + V_FLOOR_F64 = V_FLOOR_F64_E32 + V_PIPEFLUSH = V_PIPEFLUSH_E32 + V_MOV_B16 = V_MOV_B16_E32 + V_FRACT_F32 = V_FRACT_F32_E32 + V_TRUNC_F32 = V_TRUNC_F32_E32 + V_CEIL_F32 = V_CEIL_F32_E32 + V_RNDNE_F32 = V_RNDNE_F32_E32 + V_FLOOR_F32 = V_FLOOR_F32_E32 + V_EXP_F32 = V_EXP_F32_E32 + V_LOG_F32 = V_LOG_F32_E32 + V_RCP_F32 = V_RCP_F32_E32 + V_RCP_IFLAG_F32 = V_RCP_IFLAG_F32_E32 + V_RSQ_F32 = V_RSQ_F32_E32 + V_RCP_F64 = V_RCP_F64_E32 + V_RSQ_F64 = V_RSQ_F64_E32 + V_SQRT_F32 = V_SQRT_F32_E32 + V_SQRT_F64 = V_SQRT_F64_E32 + V_SIN_F32 = V_SIN_F32_E32 + V_COS_F32 = V_COS_F32_E32 + V_NOT_B32 = V_NOT_B32_E32 + V_BFREV_B32 = V_BFREV_B32_E32 + V_CLZ_I32_U32 = V_CLZ_I32_U32_E32 + V_CTZ_I32_B32 = V_CTZ_I32_B32_E32 + V_CLS_I32 = V_CLS_I32_E32 + V_FREXP_EXP_I32_F64 = V_FREXP_EXP_I32_F64_E32 + V_FREXP_MANT_F64 = V_FREXP_MANT_F64_E32 + V_FRACT_F64 = V_FRACT_F64_E32 + V_FREXP_EXP_I32_F32 = V_FREXP_EXP_I32_F32_E32 + V_FREXP_MANT_F32 = V_FREXP_MANT_F32_E32 + V_MOVRELD_B32 = V_MOVRELD_B32_E32 + V_MOVRELS_B32 = V_MOVRELS_B32_E32 + V_MOVRELSD_B32 = V_MOVRELSD_B32_E32 + V_MOVRELSD_2_B32 = V_MOVRELSD_2_B32_E32 + V_CVT_F16_U16 = V_CVT_F16_U16_E32 + V_CVT_F16_I16 = V_CVT_F16_I16_E32 + V_CVT_U16_F16 = V_CVT_U16_F16_E32 + V_CVT_I16_F16 = V_CVT_I16_F16_E32 + V_RCP_F16 = V_RCP_F16_E32 + V_SQRT_F16 = V_SQRT_F16_E32 + V_RSQ_F16 = V_RSQ_F16_E32 + V_LOG_F16 = V_LOG_F16_E32 + V_EXP_F16 = V_EXP_F16_E32 + V_FREXP_MANT_F16 = V_FREXP_MANT_F16_E32 + V_FREXP_EXP_I16_F16 = V_FREXP_EXP_I16_F16_E32 + V_FLOOR_F16 = V_FLOOR_F16_E32 + V_CEIL_F16 = V_CEIL_F16_E32 + V_TRUNC_F16 = V_TRUNC_F16_E32 + V_RNDNE_F16 = V_RNDNE_F16_E32 + V_FRACT_F16 = V_FRACT_F16_E32 + V_SIN_F16 = V_SIN_F16_E32 + V_COS_F16 = V_COS_F16_E32 + V_SAT_PK_U8_I16 = V_SAT_PK_U8_I16_E32 + V_CVT_NORM_I16_F16 = V_CVT_NORM_I16_F16_E32 + V_CVT_NORM_U16_F16 = V_CVT_NORM_U16_F16_E32 + V_SWAP_B32 = V_SWAP_B32_E32 + V_SWAP_B16 = V_SWAP_B16_E32 + V_PERMLANE64_B32 = V_PERMLANE64_B32_E32 + V_SWAPREL_B32 = V_SWAPREL_B32_E32 + V_NOT_B16 = V_NOT_B16_E32 + V_CVT_I32_I16 = V_CVT_I32_I16_E32 + V_CVT_U32_U16 = V_CVT_U32_U16_E32 + +class VOP2Op(ReprEnum): + V_CNDMASK_B32_E32 = 1 + V_DOT2ACC_F32_F16_E32 = 2 + V_ADD_F32_E32 = 3 + V_SUB_F32_E32 = 4 + V_SUBREV_F32_E32 = 5 + V_FMAC_DX9_ZERO_F32_E32 = 6 + V_MUL_DX9_ZERO_F32_E32 = 7 + V_MUL_F32_E32 = 8 + V_MUL_I32_I24_E32 = 9 + V_MUL_HI_I32_I24_E32 = 10 + V_MUL_U32_U24_E32 = 11 + V_MUL_HI_U32_U24_E32 = 12 + V_MIN_F32_E32 = 15 + V_MAX_F32_E32 = 16 + V_MIN_I32_E32 = 17 + V_MAX_I32_E32 = 18 + V_MIN_U32_E32 = 19 + V_MAX_U32_E32 = 20 + V_LSHLREV_B32_E32 = 24 + V_LSHRREV_B32_E32 = 25 + V_ASHRREV_I32_E32 = 26 + V_AND_B32_E32 = 27 + V_OR_B32_E32 = 28 + V_XOR_B32_E32 = 29 + V_XNOR_B32_E32 = 30 + V_ADD_CO_CI_U32_E32 = 32 + V_SUB_CO_CI_U32_E32 = 33 + V_SUBREV_CO_CI_U32_E32 = 34 + V_ADD_NC_U32_E32 = 37 + V_SUB_NC_U32_E32 = 38 + V_SUBREV_NC_U32_E32 = 39 + V_FMAC_F32_E32 = 43 + V_FMAMK_F32_E32 = 44 + V_FMAAK_F32_E32 = 45 + V_CVT_PK_RTZ_F16_F32_E32 = 47 + V_ADD_F16_E32 = 50 + V_SUB_F16_E32 = 51 + V_SUBREV_F16_E32 = 52 + V_MUL_F16_E32 = 53 + V_FMAC_F16_E32 = 54 + V_FMAMK_F16_E32 = 55 + V_FMAAK_F16_E32 = 56 + V_MAX_F16_E32 = 57 + V_MIN_F16_E32 = 58 + V_LDEXP_F16_E32 = 59 + V_PK_FMAC_F16_E32 = 60 + V_CNDMASK_B32 = V_CNDMASK_B32_E32 + V_DOT2ACC_F32_F16 = V_DOT2ACC_F32_F16_E32 + V_ADD_F32 = V_ADD_F32_E32 + V_SUB_F32 = V_SUB_F32_E32 + V_SUBREV_F32 = V_SUBREV_F32_E32 + V_FMAC_DX9_ZERO_F32 = V_FMAC_DX9_ZERO_F32_E32 + V_MUL_DX9_ZERO_F32 = V_MUL_DX9_ZERO_F32_E32 + V_MUL_F32 = V_MUL_F32_E32 + V_MUL_I32_I24 = V_MUL_I32_I24_E32 + V_MUL_HI_I32_I24 = V_MUL_HI_I32_I24_E32 + V_MUL_U32_U24 = V_MUL_U32_U24_E32 + V_MUL_HI_U32_U24 = V_MUL_HI_U32_U24_E32 + V_MIN_F32 = V_MIN_F32_E32 + V_MAX_F32 = V_MAX_F32_E32 + V_MIN_I32 = V_MIN_I32_E32 + V_MAX_I32 = V_MAX_I32_E32 + V_MIN_U32 = V_MIN_U32_E32 + V_MAX_U32 = V_MAX_U32_E32 + V_LSHLREV_B32 = V_LSHLREV_B32_E32 + V_LSHRREV_B32 = V_LSHRREV_B32_E32 + V_ASHRREV_I32 = V_ASHRREV_I32_E32 + V_AND_B32 = V_AND_B32_E32 + V_OR_B32 = V_OR_B32_E32 + V_XOR_B32 = V_XOR_B32_E32 + V_XNOR_B32 = V_XNOR_B32_E32 + V_ADD_CO_CI_U32 = V_ADD_CO_CI_U32_E32 + V_SUB_CO_CI_U32 = V_SUB_CO_CI_U32_E32 + V_SUBREV_CO_CI_U32 = V_SUBREV_CO_CI_U32_E32 + V_ADD_NC_U32 = V_ADD_NC_U32_E32 + V_SUB_NC_U32 = V_SUB_NC_U32_E32 + V_SUBREV_NC_U32 = V_SUBREV_NC_U32_E32 + V_FMAC_F32 = V_FMAC_F32_E32 + V_FMAMK_F32 = V_FMAMK_F32_E32 + V_FMAAK_F32 = V_FMAAK_F32_E32 + V_CVT_PK_RTZ_F16_F32 = V_CVT_PK_RTZ_F16_F32_E32 + V_ADD_F16 = V_ADD_F16_E32 + V_SUB_F16 = V_SUB_F16_E32 + V_SUBREV_F16 = V_SUBREV_F16_E32 + V_MUL_F16 = V_MUL_F16_E32 + V_FMAC_F16 = V_FMAC_F16_E32 + V_FMAMK_F16 = V_FMAMK_F16_E32 + V_FMAAK_F16 = V_FMAAK_F16_E32 + V_MAX_F16 = V_MAX_F16_E32 + V_MIN_F16 = V_MIN_F16_E32 + V_LDEXP_F16 = V_LDEXP_F16_E32 + V_PK_FMAC_F16 = V_PK_FMAC_F16_E32 + +class VOP3Op(ReprEnum): + V_CMP_F_F16_E64 = 0 + V_CMP_LT_F16_E64 = 1 + V_CMP_EQ_F16_E64 = 2 + V_CMP_LE_F16_E64 = 3 + V_CMP_GT_F16_E64 = 4 + V_CMP_LG_F16_E64 = 5 + V_CMP_GE_F16_E64 = 6 + V_CMP_O_F16_E64 = 7 + V_CMP_U_F16_E64 = 8 + V_CMP_NGE_F16_E64 = 9 + V_CMP_NLG_F16_E64 = 10 + V_CMP_NGT_F16_E64 = 11 + V_CMP_NLE_F16_E64 = 12 + V_CMP_NEQ_F16_E64 = 13 + V_CMP_NLT_F16_E64 = 14 + V_CMP_T_F16_E64 = 15 + V_CMP_F_F32_E64 = 16 + V_CMP_LT_F32_E64 = 17 + V_CMP_EQ_F32_E64 = 18 + V_CMP_LE_F32_E64 = 19 + V_CMP_GT_F32_E64 = 20 + V_CMP_LG_F32_E64 = 21 + V_CMP_GE_F32_E64 = 22 + V_CMP_O_F32_E64 = 23 + V_CMP_U_F32_E64 = 24 + V_CMP_NGE_F32_E64 = 25 + V_CMP_NLG_F32_E64 = 26 + V_CMP_NGT_F32_E64 = 27 + V_CMP_NLE_F32_E64 = 28 + V_CMP_NEQ_F32_E64 = 29 + V_CMP_NLT_F32_E64 = 30 + V_CMP_T_F32_E64 = 31 + V_CMP_F_F64_E64 = 32 + V_CMP_LT_F64_E64 = 33 + V_CMP_EQ_F64_E64 = 34 + V_CMP_LE_F64_E64 = 35 + V_CMP_GT_F64_E64 = 36 + V_CMP_LG_F64_E64 = 37 + V_CMP_GE_F64_E64 = 38 + V_CMP_O_F64_E64 = 39 + V_CMP_U_F64_E64 = 40 + V_CMP_NGE_F64_E64 = 41 + V_CMP_NLG_F64_E64 = 42 + V_CMP_NGT_F64_E64 = 43 + V_CMP_NLE_F64_E64 = 44 + V_CMP_NEQ_F64_E64 = 45 + V_CMP_NLT_F64_E64 = 46 + V_CMP_T_F64_E64 = 47 + V_CMP_LT_I16_E64 = 49 + V_CMP_EQ_I16_E64 = 50 + V_CMP_LE_I16_E64 = 51 + V_CMP_GT_I16_E64 = 52 + V_CMP_NE_I16_E64 = 53 + V_CMP_GE_I16_E64 = 54 + V_CMP_LT_U16_E64 = 57 + V_CMP_EQ_U16_E64 = 58 + V_CMP_LE_U16_E64 = 59 + V_CMP_GT_U16_E64 = 60 + V_CMP_NE_U16_E64 = 61 + V_CMP_GE_U16_E64 = 62 + V_CMP_F_I32_E64 = 64 + V_CMP_LT_I32_E64 = 65 + V_CMP_EQ_I32_E64 = 66 + V_CMP_LE_I32_E64 = 67 + V_CMP_GT_I32_E64 = 68 + V_CMP_NE_I32_E64 = 69 + V_CMP_GE_I32_E64 = 70 + V_CMP_T_I32_E64 = 71 + V_CMP_F_U32_E64 = 72 + V_CMP_LT_U32_E64 = 73 + V_CMP_EQ_U32_E64 = 74 + V_CMP_LE_U32_E64 = 75 + V_CMP_GT_U32_E64 = 76 + V_CMP_NE_U32_E64 = 77 + V_CMP_GE_U32_E64 = 78 + V_CMP_T_U32_E64 = 79 + V_CMP_F_I64_E64 = 80 + V_CMP_LT_I64_E64 = 81 + V_CMP_EQ_I64_E64 = 82 + V_CMP_LE_I64_E64 = 83 + V_CMP_GT_I64_E64 = 84 + V_CMP_NE_I64_E64 = 85 + V_CMP_GE_I64_E64 = 86 + V_CMP_T_I64_E64 = 87 + V_CMP_F_U64_E64 = 88 + V_CMP_LT_U64_E64 = 89 + V_CMP_EQ_U64_E64 = 90 + V_CMP_LE_U64_E64 = 91 + V_CMP_GT_U64_E64 = 92 + V_CMP_NE_U64_E64 = 93 + V_CMP_GE_U64_E64 = 94 + V_CMP_T_U64_E64 = 95 + V_CMP_CLASS_F16_E64 = 125 + V_CMP_CLASS_F32_E64 = 126 + V_CMP_CLASS_F64_E64 = 127 + V_CMPX_F_F16_E64 = 128 + V_CMPX_LT_F16_E64 = 129 + V_CMPX_EQ_F16_E64 = 130 + V_CMPX_LE_F16_E64 = 131 + V_CMPX_GT_F16_E64 = 132 + V_CMPX_LG_F16_E64 = 133 + V_CMPX_GE_F16_E64 = 134 + V_CMPX_O_F16_E64 = 135 + V_CMPX_U_F16_E64 = 136 + V_CMPX_NGE_F16_E64 = 137 + V_CMPX_NLG_F16_E64 = 138 + V_CMPX_NGT_F16_E64 = 139 + V_CMPX_NLE_F16_E64 = 140 + V_CMPX_NEQ_F16_E64 = 141 + V_CMPX_NLT_F16_E64 = 142 + V_CMPX_T_F16_E64 = 143 + V_CMPX_F_F32_E64 = 144 + V_CMPX_LT_F32_E64 = 145 + V_CMPX_EQ_F32_E64 = 146 + V_CMPX_LE_F32_E64 = 147 + V_CMPX_GT_F32_E64 = 148 + V_CMPX_LG_F32_E64 = 149 + V_CMPX_GE_F32_E64 = 150 + V_CMPX_O_F32_E64 = 151 + V_CMPX_U_F32_E64 = 152 + V_CMPX_NGE_F32_E64 = 153 + V_CMPX_NLG_F32_E64 = 154 + V_CMPX_NGT_F32_E64 = 155 + V_CMPX_NLE_F32_E64 = 156 + V_CMPX_NEQ_F32_E64 = 157 + V_CMPX_NLT_F32_E64 = 158 + V_CMPX_T_F32_E64 = 159 + V_CMPX_F_F64_E64 = 160 + V_CMPX_LT_F64_E64 = 161 + V_CMPX_EQ_F64_E64 = 162 + V_CMPX_LE_F64_E64 = 163 + V_CMPX_GT_F64_E64 = 164 + V_CMPX_LG_F64_E64 = 165 + V_CMPX_GE_F64_E64 = 166 + V_CMPX_O_F64_E64 = 167 + V_CMPX_U_F64_E64 = 168 + V_CMPX_NGE_F64_E64 = 169 + V_CMPX_NLG_F64_E64 = 170 + V_CMPX_NGT_F64_E64 = 171 + V_CMPX_NLE_F64_E64 = 172 + V_CMPX_NEQ_F64_E64 = 173 + V_CMPX_NLT_F64_E64 = 174 + V_CMPX_T_F64_E64 = 175 + V_CMPX_LT_I16_E64 = 177 + V_CMPX_EQ_I16_E64 = 178 + V_CMPX_LE_I16_E64 = 179 + V_CMPX_GT_I16_E64 = 180 + V_CMPX_NE_I16_E64 = 181 + V_CMPX_GE_I16_E64 = 182 + V_CMPX_LT_U16_E64 = 185 + V_CMPX_EQ_U16_E64 = 186 + V_CMPX_LE_U16_E64 = 187 + V_CMPX_GT_U16_E64 = 188 + V_CMPX_NE_U16_E64 = 189 + V_CMPX_GE_U16_E64 = 190 + V_CMPX_F_I32_E64 = 192 + V_CMPX_LT_I32_E64 = 193 + V_CMPX_EQ_I32_E64 = 194 + V_CMPX_LE_I32_E64 = 195 + V_CMPX_GT_I32_E64 = 196 + V_CMPX_NE_I32_E64 = 197 + V_CMPX_GE_I32_E64 = 198 + V_CMPX_T_I32_E64 = 199 + V_CMPX_F_U32_E64 = 200 + V_CMPX_LT_U32_E64 = 201 + V_CMPX_EQ_U32_E64 = 202 + V_CMPX_LE_U32_E64 = 203 + V_CMPX_GT_U32_E64 = 204 + V_CMPX_NE_U32_E64 = 205 + V_CMPX_GE_U32_E64 = 206 + V_CMPX_T_U32_E64 = 207 + V_CMPX_F_I64_E64 = 208 + V_CMPX_LT_I64_E64 = 209 + V_CMPX_EQ_I64_E64 = 210 + V_CMPX_LE_I64_E64 = 211 + V_CMPX_GT_I64_E64 = 212 + V_CMPX_NE_I64_E64 = 213 + V_CMPX_GE_I64_E64 = 214 + V_CMPX_T_I64_E64 = 215 + V_CMPX_F_U64_E64 = 216 + V_CMPX_LT_U64_E64 = 217 + V_CMPX_EQ_U64_E64 = 218 + V_CMPX_LE_U64_E64 = 219 + V_CMPX_GT_U64_E64 = 220 + V_CMPX_NE_U64_E64 = 221 + V_CMPX_GE_U64_E64 = 222 + V_CMPX_T_U64_E64 = 223 + V_CMPX_CLASS_F16_E64 = 253 + V_CMPX_CLASS_F32_E64 = 254 + V_CMPX_CLASS_F64_E64 = 255 + V_CNDMASK_B32_E64 = 257 + V_ADD_F32_E64 = 259 + V_SUB_F32_E64 = 260 + V_SUBREV_F32_E64 = 261 + V_FMAC_DX9_ZERO_F32_E64 = 262 + V_MUL_DX9_ZERO_F32_E64 = 263 + V_MUL_F32_E64 = 264 + V_MUL_I32_I24_E64 = 265 + V_MUL_HI_I32_I24_E64 = 266 + V_MUL_U32_U24_E64 = 267 + V_MUL_HI_U32_U24_E64 = 268 + V_MIN_F32_E64 = 271 + V_MAX_F32_E64 = 272 + V_MIN_I32_E64 = 273 + V_MAX_I32_E64 = 274 + V_MIN_U32_E64 = 275 + V_MAX_U32_E64 = 276 + V_LSHLREV_B32_E64 = 280 + V_LSHRREV_B32_E64 = 281 + V_ASHRREV_I32_E64 = 282 + V_AND_B32_E64 = 283 + V_OR_B32_E64 = 284 + V_XOR_B32_E64 = 285 + V_XNOR_B32_E64 = 286 + V_ADD_NC_U32_E64 = 293 + V_SUB_NC_U32_E64 = 294 + V_SUBREV_NC_U32_E64 = 295 + V_FMAC_F32_E64 = 299 + V_CVT_PK_RTZ_F16_F32_E64 = 303 + V_ADD_F16_E64 = 306 + V_SUB_F16_E64 = 307 + V_SUBREV_F16_E64 = 308 + V_MUL_F16_E64 = 309 + V_FMAC_F16_E64 = 310 + V_MAX_F16_E64 = 313 + V_MIN_F16_E64 = 314 + V_LDEXP_F16_E64 = 315 + V_NOP_E64 = 384 + V_MOV_B32_E64 = 385 + V_READFIRSTLANE_B32_E64 = 386 + V_CVT_I32_F64_E64 = 387 + V_CVT_F64_I32_E64 = 388 + V_CVT_F32_I32_E64 = 389 + V_CVT_F32_U32_E64 = 390 + V_CVT_U32_F32_E64 = 391 + V_CVT_I32_F32_E64 = 392 + V_CVT_F16_F32_E64 = 394 + V_CVT_F32_F16_E64 = 395 + V_CVT_NEAREST_I32_F32_E64 = 396 + V_CVT_FLOOR_I32_F32_E64 = 397 + V_CVT_OFF_F32_I4_E64 = 398 + V_CVT_F32_F64_E64 = 399 + V_CVT_F64_F32_E64 = 400 + V_CVT_F32_UBYTE0_E64 = 401 + V_CVT_F32_UBYTE1_E64 = 402 + V_CVT_F32_UBYTE2_E64 = 403 + V_CVT_F32_UBYTE3_E64 = 404 + V_CVT_U32_F64_E64 = 405 + V_CVT_F64_U32_E64 = 406 + V_TRUNC_F64_E64 = 407 + V_CEIL_F64_E64 = 408 + V_RNDNE_F64_E64 = 409 + V_FLOOR_F64_E64 = 410 + V_PIPEFLUSH_E64 = 411 + V_MOV_B16_E64 = 412 + V_FRACT_F32_E64 = 416 + V_TRUNC_F32_E64 = 417 + V_CEIL_F32_E64 = 418 + V_RNDNE_F32_E64 = 419 + V_FLOOR_F32_E64 = 420 + V_EXP_F32_E64 = 421 + V_LOG_F32_E64 = 423 + V_RCP_F32_E64 = 426 + V_RCP_IFLAG_F32_E64 = 427 + V_RSQ_F32_E64 = 430 + V_RCP_F64_E64 = 431 + V_RSQ_F64_E64 = 433 + V_SQRT_F32_E64 = 435 + V_SQRT_F64_E64 = 436 + V_SIN_F32_E64 = 437 + V_COS_F32_E64 = 438 + V_NOT_B32_E64 = 439 + V_BFREV_B32_E64 = 440 + V_CLZ_I32_U32_E64 = 441 + V_CTZ_I32_B32_E64 = 442 + V_CLS_I32_E64 = 443 + V_FREXP_EXP_I32_F64_E64 = 444 + V_FREXP_MANT_F64_E64 = 445 + V_FRACT_F64_E64 = 446 + V_FREXP_EXP_I32_F32_E64 = 447 + V_FREXP_MANT_F32_E64 = 448 + V_MOVRELD_B32_E64 = 450 + V_MOVRELS_B32_E64 = 451 + V_MOVRELSD_B32_E64 = 452 + V_MOVRELSD_2_B32_E64 = 456 + V_CVT_F16_U16_E64 = 464 + V_CVT_F16_I16_E64 = 465 + V_CVT_U16_F16_E64 = 466 + V_CVT_I16_F16_E64 = 467 + V_RCP_F16_E64 = 468 + V_SQRT_F16_E64 = 469 + V_RSQ_F16_E64 = 470 + V_LOG_F16_E64 = 471 + V_EXP_F16_E64 = 472 + V_FREXP_MANT_F16_E64 = 473 + V_FREXP_EXP_I16_F16_E64 = 474 + V_FLOOR_F16_E64 = 475 + V_CEIL_F16_E64 = 476 + V_TRUNC_F16_E64 = 477 + V_RNDNE_F16_E64 = 478 + V_FRACT_F16_E64 = 479 + V_SIN_F16_E64 = 480 + V_COS_F16_E64 = 481 + V_SAT_PK_U8_I16_E64 = 482 + V_CVT_NORM_I16_F16_E64 = 483 + V_CVT_NORM_U16_F16_E64 = 484 + V_NOT_B16_E64 = 489 + V_CVT_I32_I16_E64 = 490 + V_CVT_U32_U16_E64 = 491 + V_FMA_DX9_ZERO_F32 = 521 + V_MAD_I32_I24 = 522 + V_MAD_U32_U24 = 523 + V_CUBEID_F32 = 524 + V_CUBESC_F32 = 525 + V_CUBETC_F32 = 526 + V_CUBEMA_F32 = 527 + V_BFE_U32 = 528 + V_BFE_I32 = 529 + V_BFI_B32 = 530 + V_FMA_F32 = 531 + V_FMA_F64 = 532 + V_LERP_U8 = 533 + V_ALIGNBIT_B32 = 534 + V_ALIGNBYTE_B32 = 535 + V_MULLIT_F32 = 536 + V_MIN3_F32 = 537 + V_MIN3_I32 = 538 + V_MIN3_U32 = 539 + V_MAX3_F32 = 540 + V_MAX3_I32 = 541 + V_MAX3_U32 = 542 + V_MED3_F32 = 543 + V_MED3_I32 = 544 + V_MED3_U32 = 545 + V_SAD_U8 = 546 + V_SAD_HI_U8 = 547 + V_SAD_U16 = 548 + V_SAD_U32 = 549 + V_CVT_PK_U8_F32 = 550 + V_DIV_FIXUP_F32 = 551 + V_DIV_FIXUP_F64 = 552 + V_DIV_FMAS_F32 = 567 + V_DIV_FMAS_F64 = 568 + V_MSAD_U8 = 569 + V_QSAD_PK_U16_U8 = 570 + V_MQSAD_PK_U16_U8 = 571 + V_MQSAD_U32_U8 = 573 + V_XOR3_B32 = 576 + V_MAD_U16 = 577 + V_PERM_B32 = 580 + V_XAD_U32 = 581 + V_LSHL_ADD_U32 = 582 + V_ADD_LSHL_U32 = 583 + V_FMA_F16 = 584 + V_MIN3_F16 = 585 + V_MIN3_I16 = 586 + V_MIN3_U16 = 587 + V_MAX3_F16 = 588 + V_MAX3_I16 = 589 + V_MAX3_U16 = 590 + V_MED3_F16 = 591 + V_MED3_I16 = 592 + V_MED3_U16 = 593 + V_MAD_I16 = 595 + V_DIV_FIXUP_F16 = 596 + V_ADD3_U32 = 597 + V_LSHL_OR_B32 = 598 + V_AND_OR_B32 = 599 + V_OR3_B32 = 600 + V_MAD_U32_U16 = 601 + V_MAD_I32_I16 = 602 + V_PERMLANE16_B32 = 603 + V_PERMLANEX16_B32 = 604 + V_CNDMASK_B16 = 605 + V_MAXMIN_F32 = 606 + V_MINMAX_F32 = 607 + V_MAXMIN_F16 = 608 + V_MINMAX_F16 = 609 + V_MAXMIN_U32 = 610 + V_MINMAX_U32 = 611 + V_MAXMIN_I32 = 612 + V_MINMAX_I32 = 613 + V_DOT2_F16_F16 = 614 + V_DOT2_BF16_BF16 = 615 + V_ADD_NC_U16 = 771 + V_SUB_NC_U16 = 772 + V_MUL_LO_U16 = 773 + V_CVT_PK_I16_F32 = 774 + V_CVT_PK_U16_F32 = 775 + V_MAX_U16 = 777 + V_MAX_I16 = 778 + V_MIN_U16 = 779 + V_MIN_I16 = 780 + V_ADD_NC_I16 = 781 + V_SUB_NC_I16 = 782 + V_PACK_B32_F16 = 785 + V_CVT_PK_NORM_I16_F16 = 786 + V_CVT_PK_NORM_U16_F16 = 787 + V_LDEXP_F32 = 796 + V_BFM_B32 = 797 + V_BCNT_U32_B32 = 798 + V_MBCNT_LO_U32_B32 = 799 + V_MBCNT_HI_U32_B32 = 800 + V_CVT_PK_NORM_I16_F32 = 801 + V_CVT_PK_NORM_U16_F32 = 802 + V_CVT_PK_U16_U32 = 803 + V_CVT_PK_I16_I32 = 804 + V_SUB_NC_I32 = 805 + V_ADD_NC_I32 = 806 + V_ADD_F64 = 807 + V_MUL_F64 = 808 + V_MIN_F64 = 809 + V_MAX_F64 = 810 + V_LDEXP_F64 = 811 + V_MUL_LO_U32 = 812 + V_MUL_HI_U32 = 813 + V_MUL_HI_I32 = 814 + V_TRIG_PREOP_F64 = 815 + V_LSHLREV_B16 = 824 + V_LSHRREV_B16 = 825 + V_ASHRREV_I16 = 826 + V_LSHLREV_B64 = 828 + V_LSHRREV_B64 = 829 + V_ASHRREV_I64 = 830 + V_READLANE_B32 = 864 + V_WRITELANE_B32 = 865 + V_AND_B16 = 866 + V_OR_B16 = 867 + V_XOR_B16 = 868 + V_CMP_F_F16 = V_CMP_F_F16_E64 + V_CMP_LT_F16 = V_CMP_LT_F16_E64 + V_CMP_EQ_F16 = V_CMP_EQ_F16_E64 + V_CMP_LE_F16 = V_CMP_LE_F16_E64 + V_CMP_GT_F16 = V_CMP_GT_F16_E64 + V_CMP_LG_F16 = V_CMP_LG_F16_E64 + V_CMP_GE_F16 = V_CMP_GE_F16_E64 + V_CMP_O_F16 = V_CMP_O_F16_E64 + V_CMP_U_F16 = V_CMP_U_F16_E64 + V_CMP_NGE_F16 = V_CMP_NGE_F16_E64 + V_CMP_NLG_F16 = V_CMP_NLG_F16_E64 + V_CMP_NGT_F16 = V_CMP_NGT_F16_E64 + V_CMP_NLE_F16 = V_CMP_NLE_F16_E64 + V_CMP_NEQ_F16 = V_CMP_NEQ_F16_E64 + V_CMP_NLT_F16 = V_CMP_NLT_F16_E64 + V_CMP_T_F16 = V_CMP_T_F16_E64 + V_CMP_F_F32 = V_CMP_F_F32_E64 + V_CMP_LT_F32 = V_CMP_LT_F32_E64 + V_CMP_EQ_F32 = V_CMP_EQ_F32_E64 + V_CMP_LE_F32 = V_CMP_LE_F32_E64 + V_CMP_GT_F32 = V_CMP_GT_F32_E64 + V_CMP_LG_F32 = V_CMP_LG_F32_E64 + V_CMP_GE_F32 = V_CMP_GE_F32_E64 + V_CMP_O_F32 = V_CMP_O_F32_E64 + V_CMP_U_F32 = V_CMP_U_F32_E64 + V_CMP_NGE_F32 = V_CMP_NGE_F32_E64 + V_CMP_NLG_F32 = V_CMP_NLG_F32_E64 + V_CMP_NGT_F32 = V_CMP_NGT_F32_E64 + V_CMP_NLE_F32 = V_CMP_NLE_F32_E64 + V_CMP_NEQ_F32 = V_CMP_NEQ_F32_E64 + V_CMP_NLT_F32 = V_CMP_NLT_F32_E64 + V_CMP_T_F32 = V_CMP_T_F32_E64 + V_CMP_F_F64 = V_CMP_F_F64_E64 + V_CMP_LT_F64 = V_CMP_LT_F64_E64 + V_CMP_EQ_F64 = V_CMP_EQ_F64_E64 + V_CMP_LE_F64 = V_CMP_LE_F64_E64 + V_CMP_GT_F64 = V_CMP_GT_F64_E64 + V_CMP_LG_F64 = V_CMP_LG_F64_E64 + V_CMP_GE_F64 = V_CMP_GE_F64_E64 + V_CMP_O_F64 = V_CMP_O_F64_E64 + V_CMP_U_F64 = V_CMP_U_F64_E64 + V_CMP_NGE_F64 = V_CMP_NGE_F64_E64 + V_CMP_NLG_F64 = V_CMP_NLG_F64_E64 + V_CMP_NGT_F64 = V_CMP_NGT_F64_E64 + V_CMP_NLE_F64 = V_CMP_NLE_F64_E64 + V_CMP_NEQ_F64 = V_CMP_NEQ_F64_E64 + V_CMP_NLT_F64 = V_CMP_NLT_F64_E64 + V_CMP_T_F64 = V_CMP_T_F64_E64 + V_CMP_LT_I16 = V_CMP_LT_I16_E64 + V_CMP_EQ_I16 = V_CMP_EQ_I16_E64 + V_CMP_LE_I16 = V_CMP_LE_I16_E64 + V_CMP_GT_I16 = V_CMP_GT_I16_E64 + V_CMP_NE_I16 = V_CMP_NE_I16_E64 + V_CMP_GE_I16 = V_CMP_GE_I16_E64 + V_CMP_LT_U16 = V_CMP_LT_U16_E64 + V_CMP_EQ_U16 = V_CMP_EQ_U16_E64 + V_CMP_LE_U16 = V_CMP_LE_U16_E64 + V_CMP_GT_U16 = V_CMP_GT_U16_E64 + V_CMP_NE_U16 = V_CMP_NE_U16_E64 + V_CMP_GE_U16 = V_CMP_GE_U16_E64 + V_CMP_F_I32 = V_CMP_F_I32_E64 + V_CMP_LT_I32 = V_CMP_LT_I32_E64 + V_CMP_EQ_I32 = V_CMP_EQ_I32_E64 + V_CMP_LE_I32 = V_CMP_LE_I32_E64 + V_CMP_GT_I32 = V_CMP_GT_I32_E64 + V_CMP_NE_I32 = V_CMP_NE_I32_E64 + V_CMP_GE_I32 = V_CMP_GE_I32_E64 + V_CMP_T_I32 = V_CMP_T_I32_E64 + V_CMP_F_U32 = V_CMP_F_U32_E64 + V_CMP_LT_U32 = V_CMP_LT_U32_E64 + V_CMP_EQ_U32 = V_CMP_EQ_U32_E64 + V_CMP_LE_U32 = V_CMP_LE_U32_E64 + V_CMP_GT_U32 = V_CMP_GT_U32_E64 + V_CMP_NE_U32 = V_CMP_NE_U32_E64 + V_CMP_GE_U32 = V_CMP_GE_U32_E64 + V_CMP_T_U32 = V_CMP_T_U32_E64 + V_CMP_F_I64 = V_CMP_F_I64_E64 + V_CMP_LT_I64 = V_CMP_LT_I64_E64 + V_CMP_EQ_I64 = V_CMP_EQ_I64_E64 + V_CMP_LE_I64 = V_CMP_LE_I64_E64 + V_CMP_GT_I64 = V_CMP_GT_I64_E64 + V_CMP_NE_I64 = V_CMP_NE_I64_E64 + V_CMP_GE_I64 = V_CMP_GE_I64_E64 + V_CMP_T_I64 = V_CMP_T_I64_E64 + V_CMP_F_U64 = V_CMP_F_U64_E64 + V_CMP_LT_U64 = V_CMP_LT_U64_E64 + V_CMP_EQ_U64 = V_CMP_EQ_U64_E64 + V_CMP_LE_U64 = V_CMP_LE_U64_E64 + V_CMP_GT_U64 = V_CMP_GT_U64_E64 + V_CMP_NE_U64 = V_CMP_NE_U64_E64 + V_CMP_GE_U64 = V_CMP_GE_U64_E64 + V_CMP_T_U64 = V_CMP_T_U64_E64 + V_CMP_CLASS_F16 = V_CMP_CLASS_F16_E64 + V_CMP_CLASS_F32 = V_CMP_CLASS_F32_E64 + V_CMP_CLASS_F64 = V_CMP_CLASS_F64_E64 + V_CMPX_F_F16 = V_CMPX_F_F16_E64 + V_CMPX_LT_F16 = V_CMPX_LT_F16_E64 + V_CMPX_EQ_F16 = V_CMPX_EQ_F16_E64 + V_CMPX_LE_F16 = V_CMPX_LE_F16_E64 + V_CMPX_GT_F16 = V_CMPX_GT_F16_E64 + V_CMPX_LG_F16 = V_CMPX_LG_F16_E64 + V_CMPX_GE_F16 = V_CMPX_GE_F16_E64 + V_CMPX_O_F16 = V_CMPX_O_F16_E64 + V_CMPX_U_F16 = V_CMPX_U_F16_E64 + V_CMPX_NGE_F16 = V_CMPX_NGE_F16_E64 + V_CMPX_NLG_F16 = V_CMPX_NLG_F16_E64 + V_CMPX_NGT_F16 = V_CMPX_NGT_F16_E64 + V_CMPX_NLE_F16 = V_CMPX_NLE_F16_E64 + V_CMPX_NEQ_F16 = V_CMPX_NEQ_F16_E64 + V_CMPX_NLT_F16 = V_CMPX_NLT_F16_E64 + V_CMPX_T_F16 = V_CMPX_T_F16_E64 + V_CMPX_F_F32 = V_CMPX_F_F32_E64 + V_CMPX_LT_F32 = V_CMPX_LT_F32_E64 + V_CMPX_EQ_F32 = V_CMPX_EQ_F32_E64 + V_CMPX_LE_F32 = V_CMPX_LE_F32_E64 + V_CMPX_GT_F32 = V_CMPX_GT_F32_E64 + V_CMPX_LG_F32 = V_CMPX_LG_F32_E64 + V_CMPX_GE_F32 = V_CMPX_GE_F32_E64 + V_CMPX_O_F32 = V_CMPX_O_F32_E64 + V_CMPX_U_F32 = V_CMPX_U_F32_E64 + V_CMPX_NGE_F32 = V_CMPX_NGE_F32_E64 + V_CMPX_NLG_F32 = V_CMPX_NLG_F32_E64 + V_CMPX_NGT_F32 = V_CMPX_NGT_F32_E64 + V_CMPX_NLE_F32 = V_CMPX_NLE_F32_E64 + V_CMPX_NEQ_F32 = V_CMPX_NEQ_F32_E64 + V_CMPX_NLT_F32 = V_CMPX_NLT_F32_E64 + V_CMPX_T_F32 = V_CMPX_T_F32_E64 + V_CMPX_F_F64 = V_CMPX_F_F64_E64 + V_CMPX_LT_F64 = V_CMPX_LT_F64_E64 + V_CMPX_EQ_F64 = V_CMPX_EQ_F64_E64 + V_CMPX_LE_F64 = V_CMPX_LE_F64_E64 + V_CMPX_GT_F64 = V_CMPX_GT_F64_E64 + V_CMPX_LG_F64 = V_CMPX_LG_F64_E64 + V_CMPX_GE_F64 = V_CMPX_GE_F64_E64 + V_CMPX_O_F64 = V_CMPX_O_F64_E64 + V_CMPX_U_F64 = V_CMPX_U_F64_E64 + V_CMPX_NGE_F64 = V_CMPX_NGE_F64_E64 + V_CMPX_NLG_F64 = V_CMPX_NLG_F64_E64 + V_CMPX_NGT_F64 = V_CMPX_NGT_F64_E64 + V_CMPX_NLE_F64 = V_CMPX_NLE_F64_E64 + V_CMPX_NEQ_F64 = V_CMPX_NEQ_F64_E64 + V_CMPX_NLT_F64 = V_CMPX_NLT_F64_E64 + V_CMPX_T_F64 = V_CMPX_T_F64_E64 + V_CMPX_LT_I16 = V_CMPX_LT_I16_E64 + V_CMPX_EQ_I16 = V_CMPX_EQ_I16_E64 + V_CMPX_LE_I16 = V_CMPX_LE_I16_E64 + V_CMPX_GT_I16 = V_CMPX_GT_I16_E64 + V_CMPX_NE_I16 = V_CMPX_NE_I16_E64 + V_CMPX_GE_I16 = V_CMPX_GE_I16_E64 + V_CMPX_LT_U16 = V_CMPX_LT_U16_E64 + V_CMPX_EQ_U16 = V_CMPX_EQ_U16_E64 + V_CMPX_LE_U16 = V_CMPX_LE_U16_E64 + V_CMPX_GT_U16 = V_CMPX_GT_U16_E64 + V_CMPX_NE_U16 = V_CMPX_NE_U16_E64 + V_CMPX_GE_U16 = V_CMPX_GE_U16_E64 + V_CMPX_F_I32 = V_CMPX_F_I32_E64 + V_CMPX_LT_I32 = V_CMPX_LT_I32_E64 + V_CMPX_EQ_I32 = V_CMPX_EQ_I32_E64 + V_CMPX_LE_I32 = V_CMPX_LE_I32_E64 + V_CMPX_GT_I32 = V_CMPX_GT_I32_E64 + V_CMPX_NE_I32 = V_CMPX_NE_I32_E64 + V_CMPX_GE_I32 = V_CMPX_GE_I32_E64 + V_CMPX_T_I32 = V_CMPX_T_I32_E64 + V_CMPX_F_U32 = V_CMPX_F_U32_E64 + V_CMPX_LT_U32 = V_CMPX_LT_U32_E64 + V_CMPX_EQ_U32 = V_CMPX_EQ_U32_E64 + V_CMPX_LE_U32 = V_CMPX_LE_U32_E64 + V_CMPX_GT_U32 = V_CMPX_GT_U32_E64 + V_CMPX_NE_U32 = V_CMPX_NE_U32_E64 + V_CMPX_GE_U32 = V_CMPX_GE_U32_E64 + V_CMPX_T_U32 = V_CMPX_T_U32_E64 + V_CMPX_F_I64 = V_CMPX_F_I64_E64 + V_CMPX_LT_I64 = V_CMPX_LT_I64_E64 + V_CMPX_EQ_I64 = V_CMPX_EQ_I64_E64 + V_CMPX_LE_I64 = V_CMPX_LE_I64_E64 + V_CMPX_GT_I64 = V_CMPX_GT_I64_E64 + V_CMPX_NE_I64 = V_CMPX_NE_I64_E64 + V_CMPX_GE_I64 = V_CMPX_GE_I64_E64 + V_CMPX_T_I64 = V_CMPX_T_I64_E64 + V_CMPX_F_U64 = V_CMPX_F_U64_E64 + V_CMPX_LT_U64 = V_CMPX_LT_U64_E64 + V_CMPX_EQ_U64 = V_CMPX_EQ_U64_E64 + V_CMPX_LE_U64 = V_CMPX_LE_U64_E64 + V_CMPX_GT_U64 = V_CMPX_GT_U64_E64 + V_CMPX_NE_U64 = V_CMPX_NE_U64_E64 + V_CMPX_GE_U64 = V_CMPX_GE_U64_E64 + V_CMPX_T_U64 = V_CMPX_T_U64_E64 + V_CMPX_CLASS_F16 = V_CMPX_CLASS_F16_E64 + V_CMPX_CLASS_F32 = V_CMPX_CLASS_F32_E64 + V_CMPX_CLASS_F64 = V_CMPX_CLASS_F64_E64 + V_CNDMASK_B32 = V_CNDMASK_B32_E64 + V_ADD_F32 = V_ADD_F32_E64 + V_SUB_F32 = V_SUB_F32_E64 + V_SUBREV_F32 = V_SUBREV_F32_E64 + V_FMAC_DX9_ZERO_F32 = V_FMAC_DX9_ZERO_F32_E64 + V_MUL_DX9_ZERO_F32 = V_MUL_DX9_ZERO_F32_E64 + V_MUL_F32 = V_MUL_F32_E64 + V_MUL_I32_I24 = V_MUL_I32_I24_E64 + V_MUL_HI_I32_I24 = V_MUL_HI_I32_I24_E64 + V_MUL_U32_U24 = V_MUL_U32_U24_E64 + V_MUL_HI_U32_U24 = V_MUL_HI_U32_U24_E64 + V_MIN_F32 = V_MIN_F32_E64 + V_MAX_F32 = V_MAX_F32_E64 + V_MIN_I32 = V_MIN_I32_E64 + V_MAX_I32 = V_MAX_I32_E64 + V_MIN_U32 = V_MIN_U32_E64 + V_MAX_U32 = V_MAX_U32_E64 + V_LSHLREV_B32 = V_LSHLREV_B32_E64 + V_LSHRREV_B32 = V_LSHRREV_B32_E64 + V_ASHRREV_I32 = V_ASHRREV_I32_E64 + V_AND_B32 = V_AND_B32_E64 + V_OR_B32 = V_OR_B32_E64 + V_XOR_B32 = V_XOR_B32_E64 + V_XNOR_B32 = V_XNOR_B32_E64 + V_ADD_NC_U32 = V_ADD_NC_U32_E64 + V_SUB_NC_U32 = V_SUB_NC_U32_E64 + V_SUBREV_NC_U32 = V_SUBREV_NC_U32_E64 + V_FMAC_F32 = V_FMAC_F32_E64 + V_CVT_PK_RTZ_F16_F32 = V_CVT_PK_RTZ_F16_F32_E64 + V_ADD_F16 = V_ADD_F16_E64 + V_SUB_F16 = V_SUB_F16_E64 + V_SUBREV_F16 = V_SUBREV_F16_E64 + V_MUL_F16 = V_MUL_F16_E64 + V_FMAC_F16 = V_FMAC_F16_E64 + V_MAX_F16 = V_MAX_F16_E64 + V_MIN_F16 = V_MIN_F16_E64 + V_LDEXP_F16 = V_LDEXP_F16_E64 + V_NOP = V_NOP_E64 + V_MOV_B32 = V_MOV_B32_E64 + V_READFIRSTLANE_B32 = V_READFIRSTLANE_B32_E64 + V_CVT_I32_F64 = V_CVT_I32_F64_E64 + V_CVT_F64_I32 = V_CVT_F64_I32_E64 + V_CVT_F32_I32 = V_CVT_F32_I32_E64 + V_CVT_F32_U32 = V_CVT_F32_U32_E64 + V_CVT_U32_F32 = V_CVT_U32_F32_E64 + V_CVT_I32_F32 = V_CVT_I32_F32_E64 + V_CVT_F16_F32 = V_CVT_F16_F32_E64 + V_CVT_F32_F16 = V_CVT_F32_F16_E64 + V_CVT_NEAREST_I32_F32 = V_CVT_NEAREST_I32_F32_E64 + V_CVT_FLOOR_I32_F32 = V_CVT_FLOOR_I32_F32_E64 + V_CVT_OFF_F32_I4 = V_CVT_OFF_F32_I4_E64 + V_CVT_F32_F64 = V_CVT_F32_F64_E64 + V_CVT_F64_F32 = V_CVT_F64_F32_E64 + V_CVT_F32_UBYTE0 = V_CVT_F32_UBYTE0_E64 + V_CVT_F32_UBYTE1 = V_CVT_F32_UBYTE1_E64 + V_CVT_F32_UBYTE2 = V_CVT_F32_UBYTE2_E64 + V_CVT_F32_UBYTE3 = V_CVT_F32_UBYTE3_E64 + V_CVT_U32_F64 = V_CVT_U32_F64_E64 + V_CVT_F64_U32 = V_CVT_F64_U32_E64 + V_TRUNC_F64 = V_TRUNC_F64_E64 + V_CEIL_F64 = V_CEIL_F64_E64 + V_RNDNE_F64 = V_RNDNE_F64_E64 + V_FLOOR_F64 = V_FLOOR_F64_E64 + V_PIPEFLUSH = V_PIPEFLUSH_E64 + V_MOV_B16 = V_MOV_B16_E64 + V_FRACT_F32 = V_FRACT_F32_E64 + V_TRUNC_F32 = V_TRUNC_F32_E64 + V_CEIL_F32 = V_CEIL_F32_E64 + V_RNDNE_F32 = V_RNDNE_F32_E64 + V_FLOOR_F32 = V_FLOOR_F32_E64 + V_EXP_F32 = V_EXP_F32_E64 + V_LOG_F32 = V_LOG_F32_E64 + V_RCP_F32 = V_RCP_F32_E64 + V_RCP_IFLAG_F32 = V_RCP_IFLAG_F32_E64 + V_RSQ_F32 = V_RSQ_F32_E64 + V_RCP_F64 = V_RCP_F64_E64 + V_RSQ_F64 = V_RSQ_F64_E64 + V_SQRT_F32 = V_SQRT_F32_E64 + V_SQRT_F64 = V_SQRT_F64_E64 + V_SIN_F32 = V_SIN_F32_E64 + V_COS_F32 = V_COS_F32_E64 + V_NOT_B32 = V_NOT_B32_E64 + V_BFREV_B32 = V_BFREV_B32_E64 + V_CLZ_I32_U32 = V_CLZ_I32_U32_E64 + V_CTZ_I32_B32 = V_CTZ_I32_B32_E64 + V_CLS_I32 = V_CLS_I32_E64 + V_FREXP_EXP_I32_F64 = V_FREXP_EXP_I32_F64_E64 + V_FREXP_MANT_F64 = V_FREXP_MANT_F64_E64 + V_FRACT_F64 = V_FRACT_F64_E64 + V_FREXP_EXP_I32_F32 = V_FREXP_EXP_I32_F32_E64 + V_FREXP_MANT_F32 = V_FREXP_MANT_F32_E64 + V_MOVRELD_B32 = V_MOVRELD_B32_E64 + V_MOVRELS_B32 = V_MOVRELS_B32_E64 + V_MOVRELSD_B32 = V_MOVRELSD_B32_E64 + V_MOVRELSD_2_B32 = V_MOVRELSD_2_B32_E64 + V_CVT_F16_U16 = V_CVT_F16_U16_E64 + V_CVT_F16_I16 = V_CVT_F16_I16_E64 + V_CVT_U16_F16 = V_CVT_U16_F16_E64 + V_CVT_I16_F16 = V_CVT_I16_F16_E64 + V_RCP_F16 = V_RCP_F16_E64 + V_SQRT_F16 = V_SQRT_F16_E64 + V_RSQ_F16 = V_RSQ_F16_E64 + V_LOG_F16 = V_LOG_F16_E64 + V_EXP_F16 = V_EXP_F16_E64 + V_FREXP_MANT_F16 = V_FREXP_MANT_F16_E64 + V_FREXP_EXP_I16_F16 = V_FREXP_EXP_I16_F16_E64 + V_FLOOR_F16 = V_FLOOR_F16_E64 + V_CEIL_F16 = V_CEIL_F16_E64 + V_TRUNC_F16 = V_TRUNC_F16_E64 + V_RNDNE_F16 = V_RNDNE_F16_E64 + V_FRACT_F16 = V_FRACT_F16_E64 + V_SIN_F16 = V_SIN_F16_E64 + V_COS_F16 = V_COS_F16_E64 + V_SAT_PK_U8_I16 = V_SAT_PK_U8_I16_E64 + V_CVT_NORM_I16_F16 = V_CVT_NORM_I16_F16_E64 + V_CVT_NORM_U16_F16 = V_CVT_NORM_U16_F16_E64 + V_NOT_B16 = V_NOT_B16_E64 + V_CVT_I32_I16 = V_CVT_I32_I16_E64 + V_CVT_U32_U16 = V_CVT_U32_U16_E64 + +class VOP3POp(ReprEnum): + V_PK_MAD_I16 = 0 + V_PK_MUL_LO_U16 = 1 + V_PK_ADD_I16 = 2 + V_PK_SUB_I16 = 3 + V_PK_LSHLREV_B16 = 4 + V_PK_LSHRREV_B16 = 5 + V_PK_ASHRREV_I16 = 6 + V_PK_MAX_I16 = 7 + V_PK_MIN_I16 = 8 + V_PK_MAD_U16 = 9 + V_PK_ADD_U16 = 10 + V_PK_SUB_U16 = 11 + V_PK_MAX_U16 = 12 + V_PK_MIN_U16 = 13 + V_PK_FMA_F16 = 14 + V_PK_ADD_F16 = 15 + V_PK_MUL_F16 = 16 + V_PK_MIN_F16 = 17 + V_PK_MAX_F16 = 18 + V_DOT2_F32_F16 = 19 + V_DOT4_I32_IU8 = 22 + V_DOT4_U32_U8 = 23 + V_DOT8_I32_IU4 = 24 + V_DOT8_U32_U4 = 25 + V_DOT2_F32_BF16 = 26 + V_FMA_MIX_F32 = 32 + V_FMA_MIXLO_F16 = 33 + V_FMA_MIXHI_F16 = 34 + V_WMMA_F32_16X16X16_F16 = 64 + V_WMMA_F32_16X16X16_BF16 = 65 + V_WMMA_F16_16X16X16_F16 = 66 + V_WMMA_BF16_16X16X16_BF16 = 67 + V_WMMA_I32_16X16X16_IU8 = 68 + V_WMMA_I32_16X16X16_IU4 = 69 + +class VOP3SDOp(ReprEnum): + V_ADD_CO_CI_U32 = 288 + V_SUB_CO_CI_U32 = 289 + V_SUBREV_CO_CI_U32 = 290 + V_DIV_SCALE_F32 = 764 + V_DIV_SCALE_F64 = 765 + V_MAD_U64_U32 = 766 + V_MAD_I64_I32 = 767 + V_ADD_CO_U32 = 768 + V_SUB_CO_U32 = 769 + V_SUBREV_CO_U32 = 770 + +class VOPCOp(ReprEnum): + V_CMP_F_F16_E32 = 0 + V_CMP_LT_F16_E32 = 1 + V_CMP_EQ_F16_E32 = 2 + V_CMP_LE_F16_E32 = 3 + V_CMP_GT_F16_E32 = 4 + V_CMP_LG_F16_E32 = 5 + V_CMP_GE_F16_E32 = 6 + V_CMP_O_F16_E32 = 7 + V_CMP_U_F16_E32 = 8 + V_CMP_NGE_F16_E32 = 9 + V_CMP_NLG_F16_E32 = 10 + V_CMP_NGT_F16_E32 = 11 + V_CMP_NLE_F16_E32 = 12 + V_CMP_NEQ_F16_E32 = 13 + V_CMP_NLT_F16_E32 = 14 + V_CMP_T_F16_E32 = 15 + V_CMP_F_F32_E32 = 16 + V_CMP_LT_F32_E32 = 17 + V_CMP_EQ_F32_E32 = 18 + V_CMP_LE_F32_E32 = 19 + V_CMP_GT_F32_E32 = 20 + V_CMP_LG_F32_E32 = 21 + V_CMP_GE_F32_E32 = 22 + V_CMP_O_F32_E32 = 23 + V_CMP_U_F32_E32 = 24 + V_CMP_NGE_F32_E32 = 25 + V_CMP_NLG_F32_E32 = 26 + V_CMP_NGT_F32_E32 = 27 + V_CMP_NLE_F32_E32 = 28 + V_CMP_NEQ_F32_E32 = 29 + V_CMP_NLT_F32_E32 = 30 + V_CMP_T_F32_E32 = 31 + V_CMP_F_F64_E32 = 32 + V_CMP_LT_F64_E32 = 33 + V_CMP_EQ_F64_E32 = 34 + V_CMP_LE_F64_E32 = 35 + V_CMP_GT_F64_E32 = 36 + V_CMP_LG_F64_E32 = 37 + V_CMP_GE_F64_E32 = 38 + V_CMP_O_F64_E32 = 39 + V_CMP_U_F64_E32 = 40 + V_CMP_NGE_F64_E32 = 41 + V_CMP_NLG_F64_E32 = 42 + V_CMP_NGT_F64_E32 = 43 + V_CMP_NLE_F64_E32 = 44 + V_CMP_NEQ_F64_E32 = 45 + V_CMP_NLT_F64_E32 = 46 + V_CMP_T_F64_E32 = 47 + V_CMP_LT_I16_E32 = 49 + V_CMP_EQ_I16_E32 = 50 + V_CMP_LE_I16_E32 = 51 + V_CMP_GT_I16_E32 = 52 + V_CMP_NE_I16_E32 = 53 + V_CMP_GE_I16_E32 = 54 + V_CMP_LT_U16_E32 = 57 + V_CMP_EQ_U16_E32 = 58 + V_CMP_LE_U16_E32 = 59 + V_CMP_GT_U16_E32 = 60 + V_CMP_NE_U16_E32 = 61 + V_CMP_GE_U16_E32 = 62 + V_CMP_F_I32_E32 = 64 + V_CMP_LT_I32_E32 = 65 + V_CMP_EQ_I32_E32 = 66 + V_CMP_LE_I32_E32 = 67 + V_CMP_GT_I32_E32 = 68 + V_CMP_NE_I32_E32 = 69 + V_CMP_GE_I32_E32 = 70 + V_CMP_T_I32_E32 = 71 + V_CMP_F_U32_E32 = 72 + V_CMP_LT_U32_E32 = 73 + V_CMP_EQ_U32_E32 = 74 + V_CMP_LE_U32_E32 = 75 + V_CMP_GT_U32_E32 = 76 + V_CMP_NE_U32_E32 = 77 + V_CMP_GE_U32_E32 = 78 + V_CMP_T_U32_E32 = 79 + V_CMP_F_I64_E32 = 80 + V_CMP_LT_I64_E32 = 81 + V_CMP_EQ_I64_E32 = 82 + V_CMP_LE_I64_E32 = 83 + V_CMP_GT_I64_E32 = 84 + V_CMP_NE_I64_E32 = 85 + V_CMP_GE_I64_E32 = 86 + V_CMP_T_I64_E32 = 87 + V_CMP_F_U64_E32 = 88 + V_CMP_LT_U64_E32 = 89 + V_CMP_EQ_U64_E32 = 90 + V_CMP_LE_U64_E32 = 91 + V_CMP_GT_U64_E32 = 92 + V_CMP_NE_U64_E32 = 93 + V_CMP_GE_U64_E32 = 94 + V_CMP_T_U64_E32 = 95 + V_CMP_CLASS_F16_E32 = 125 + V_CMP_CLASS_F32_E32 = 126 + V_CMP_CLASS_F64_E32 = 127 + V_CMPX_F_F16_E32 = 128 + V_CMPX_LT_F16_E32 = 129 + V_CMPX_EQ_F16_E32 = 130 + V_CMPX_LE_F16_E32 = 131 + V_CMPX_GT_F16_E32 = 132 + V_CMPX_LG_F16_E32 = 133 + V_CMPX_GE_F16_E32 = 134 + V_CMPX_O_F16_E32 = 135 + V_CMPX_U_F16_E32 = 136 + V_CMPX_NGE_F16_E32 = 137 + V_CMPX_NLG_F16_E32 = 138 + V_CMPX_NGT_F16_E32 = 139 + V_CMPX_NLE_F16_E32 = 140 + V_CMPX_NEQ_F16_E32 = 141 + V_CMPX_NLT_F16_E32 = 142 + V_CMPX_T_F16_E32 = 143 + V_CMPX_F_F32_E32 = 144 + V_CMPX_LT_F32_E32 = 145 + V_CMPX_EQ_F32_E32 = 146 + V_CMPX_LE_F32_E32 = 147 + V_CMPX_GT_F32_E32 = 148 + V_CMPX_LG_F32_E32 = 149 + V_CMPX_GE_F32_E32 = 150 + V_CMPX_O_F32_E32 = 151 + V_CMPX_U_F32_E32 = 152 + V_CMPX_NGE_F32_E32 = 153 + V_CMPX_NLG_F32_E32 = 154 + V_CMPX_NGT_F32_E32 = 155 + V_CMPX_NLE_F32_E32 = 156 + V_CMPX_NEQ_F32_E32 = 157 + V_CMPX_NLT_F32_E32 = 158 + V_CMPX_T_F32_E32 = 159 + V_CMPX_F_F64_E32 = 160 + V_CMPX_LT_F64_E32 = 161 + V_CMPX_EQ_F64_E32 = 162 + V_CMPX_LE_F64_E32 = 163 + V_CMPX_GT_F64_E32 = 164 + V_CMPX_LG_F64_E32 = 165 + V_CMPX_GE_F64_E32 = 166 + V_CMPX_O_F64_E32 = 167 + V_CMPX_U_F64_E32 = 168 + V_CMPX_NGE_F64_E32 = 169 + V_CMPX_NLG_F64_E32 = 170 + V_CMPX_NGT_F64_E32 = 171 + V_CMPX_NLE_F64_E32 = 172 + V_CMPX_NEQ_F64_E32 = 173 + V_CMPX_NLT_F64_E32 = 174 + V_CMPX_T_F64_E32 = 175 + V_CMPX_LT_I16_E32 = 177 + V_CMPX_EQ_I16_E32 = 178 + V_CMPX_LE_I16_E32 = 179 + V_CMPX_GT_I16_E32 = 180 + V_CMPX_NE_I16_E32 = 181 + V_CMPX_GE_I16_E32 = 182 + V_CMPX_LT_U16_E32 = 185 + V_CMPX_EQ_U16_E32 = 186 + V_CMPX_LE_U16_E32 = 187 + V_CMPX_GT_U16_E32 = 188 + V_CMPX_NE_U16_E32 = 189 + V_CMPX_GE_U16_E32 = 190 + V_CMPX_F_I32_E32 = 192 + V_CMPX_LT_I32_E32 = 193 + V_CMPX_EQ_I32_E32 = 194 + V_CMPX_LE_I32_E32 = 195 + V_CMPX_GT_I32_E32 = 196 + V_CMPX_NE_I32_E32 = 197 + V_CMPX_GE_I32_E32 = 198 + V_CMPX_T_I32_E32 = 199 + V_CMPX_F_U32_E32 = 200 + V_CMPX_LT_U32_E32 = 201 + V_CMPX_EQ_U32_E32 = 202 + V_CMPX_LE_U32_E32 = 203 + V_CMPX_GT_U32_E32 = 204 + V_CMPX_NE_U32_E32 = 205 + V_CMPX_GE_U32_E32 = 206 + V_CMPX_T_U32_E32 = 207 + V_CMPX_F_I64_E32 = 208 + V_CMPX_LT_I64_E32 = 209 + V_CMPX_EQ_I64_E32 = 210 + V_CMPX_LE_I64_E32 = 211 + V_CMPX_GT_I64_E32 = 212 + V_CMPX_NE_I64_E32 = 213 + V_CMPX_GE_I64_E32 = 214 + V_CMPX_T_I64_E32 = 215 + V_CMPX_F_U64_E32 = 216 + V_CMPX_LT_U64_E32 = 217 + V_CMPX_EQ_U64_E32 = 218 + V_CMPX_LE_U64_E32 = 219 + V_CMPX_GT_U64_E32 = 220 + V_CMPX_NE_U64_E32 = 221 + V_CMPX_GE_U64_E32 = 222 + V_CMPX_T_U64_E32 = 223 + V_CMPX_CLASS_F16_E32 = 253 + V_CMPX_CLASS_F32_E32 = 254 + V_CMPX_CLASS_F64_E32 = 255 + V_CMP_F_F16 = V_CMP_F_F16_E32 + V_CMP_LT_F16 = V_CMP_LT_F16_E32 + V_CMP_EQ_F16 = V_CMP_EQ_F16_E32 + V_CMP_LE_F16 = V_CMP_LE_F16_E32 + V_CMP_GT_F16 = V_CMP_GT_F16_E32 + V_CMP_LG_F16 = V_CMP_LG_F16_E32 + V_CMP_GE_F16 = V_CMP_GE_F16_E32 + V_CMP_O_F16 = V_CMP_O_F16_E32 + V_CMP_U_F16 = V_CMP_U_F16_E32 + V_CMP_NGE_F16 = V_CMP_NGE_F16_E32 + V_CMP_NLG_F16 = V_CMP_NLG_F16_E32 + V_CMP_NGT_F16 = V_CMP_NGT_F16_E32 + V_CMP_NLE_F16 = V_CMP_NLE_F16_E32 + V_CMP_NEQ_F16 = V_CMP_NEQ_F16_E32 + V_CMP_NLT_F16 = V_CMP_NLT_F16_E32 + V_CMP_T_F16 = V_CMP_T_F16_E32 + V_CMP_F_F32 = V_CMP_F_F32_E32 + V_CMP_LT_F32 = V_CMP_LT_F32_E32 + V_CMP_EQ_F32 = V_CMP_EQ_F32_E32 + V_CMP_LE_F32 = V_CMP_LE_F32_E32 + V_CMP_GT_F32 = V_CMP_GT_F32_E32 + V_CMP_LG_F32 = V_CMP_LG_F32_E32 + V_CMP_GE_F32 = V_CMP_GE_F32_E32 + V_CMP_O_F32 = V_CMP_O_F32_E32 + V_CMP_U_F32 = V_CMP_U_F32_E32 + V_CMP_NGE_F32 = V_CMP_NGE_F32_E32 + V_CMP_NLG_F32 = V_CMP_NLG_F32_E32 + V_CMP_NGT_F32 = V_CMP_NGT_F32_E32 + V_CMP_NLE_F32 = V_CMP_NLE_F32_E32 + V_CMP_NEQ_F32 = V_CMP_NEQ_F32_E32 + V_CMP_NLT_F32 = V_CMP_NLT_F32_E32 + V_CMP_T_F32 = V_CMP_T_F32_E32 + V_CMP_F_F64 = V_CMP_F_F64_E32 + V_CMP_LT_F64 = V_CMP_LT_F64_E32 + V_CMP_EQ_F64 = V_CMP_EQ_F64_E32 + V_CMP_LE_F64 = V_CMP_LE_F64_E32 + V_CMP_GT_F64 = V_CMP_GT_F64_E32 + V_CMP_LG_F64 = V_CMP_LG_F64_E32 + V_CMP_GE_F64 = V_CMP_GE_F64_E32 + V_CMP_O_F64 = V_CMP_O_F64_E32 + V_CMP_U_F64 = V_CMP_U_F64_E32 + V_CMP_NGE_F64 = V_CMP_NGE_F64_E32 + V_CMP_NLG_F64 = V_CMP_NLG_F64_E32 + V_CMP_NGT_F64 = V_CMP_NGT_F64_E32 + V_CMP_NLE_F64 = V_CMP_NLE_F64_E32 + V_CMP_NEQ_F64 = V_CMP_NEQ_F64_E32 + V_CMP_NLT_F64 = V_CMP_NLT_F64_E32 + V_CMP_T_F64 = V_CMP_T_F64_E32 + V_CMP_LT_I16 = V_CMP_LT_I16_E32 + V_CMP_EQ_I16 = V_CMP_EQ_I16_E32 + V_CMP_LE_I16 = V_CMP_LE_I16_E32 + V_CMP_GT_I16 = V_CMP_GT_I16_E32 + V_CMP_NE_I16 = V_CMP_NE_I16_E32 + V_CMP_GE_I16 = V_CMP_GE_I16_E32 + V_CMP_LT_U16 = V_CMP_LT_U16_E32 + V_CMP_EQ_U16 = V_CMP_EQ_U16_E32 + V_CMP_LE_U16 = V_CMP_LE_U16_E32 + V_CMP_GT_U16 = V_CMP_GT_U16_E32 + V_CMP_NE_U16 = V_CMP_NE_U16_E32 + V_CMP_GE_U16 = V_CMP_GE_U16_E32 + V_CMP_F_I32 = V_CMP_F_I32_E32 + V_CMP_LT_I32 = V_CMP_LT_I32_E32 + V_CMP_EQ_I32 = V_CMP_EQ_I32_E32 + V_CMP_LE_I32 = V_CMP_LE_I32_E32 + V_CMP_GT_I32 = V_CMP_GT_I32_E32 + V_CMP_NE_I32 = V_CMP_NE_I32_E32 + V_CMP_GE_I32 = V_CMP_GE_I32_E32 + V_CMP_T_I32 = V_CMP_T_I32_E32 + V_CMP_F_U32 = V_CMP_F_U32_E32 + V_CMP_LT_U32 = V_CMP_LT_U32_E32 + V_CMP_EQ_U32 = V_CMP_EQ_U32_E32 + V_CMP_LE_U32 = V_CMP_LE_U32_E32 + V_CMP_GT_U32 = V_CMP_GT_U32_E32 + V_CMP_NE_U32 = V_CMP_NE_U32_E32 + V_CMP_GE_U32 = V_CMP_GE_U32_E32 + V_CMP_T_U32 = V_CMP_T_U32_E32 + V_CMP_F_I64 = V_CMP_F_I64_E32 + V_CMP_LT_I64 = V_CMP_LT_I64_E32 + V_CMP_EQ_I64 = V_CMP_EQ_I64_E32 + V_CMP_LE_I64 = V_CMP_LE_I64_E32 + V_CMP_GT_I64 = V_CMP_GT_I64_E32 + V_CMP_NE_I64 = V_CMP_NE_I64_E32 + V_CMP_GE_I64 = V_CMP_GE_I64_E32 + V_CMP_T_I64 = V_CMP_T_I64_E32 + V_CMP_F_U64 = V_CMP_F_U64_E32 + V_CMP_LT_U64 = V_CMP_LT_U64_E32 + V_CMP_EQ_U64 = V_CMP_EQ_U64_E32 + V_CMP_LE_U64 = V_CMP_LE_U64_E32 + V_CMP_GT_U64 = V_CMP_GT_U64_E32 + V_CMP_NE_U64 = V_CMP_NE_U64_E32 + V_CMP_GE_U64 = V_CMP_GE_U64_E32 + V_CMP_T_U64 = V_CMP_T_U64_E32 + V_CMP_CLASS_F16 = V_CMP_CLASS_F16_E32 + V_CMP_CLASS_F32 = V_CMP_CLASS_F32_E32 + V_CMP_CLASS_F64 = V_CMP_CLASS_F64_E32 + V_CMPX_F_F16 = V_CMPX_F_F16_E32 + V_CMPX_LT_F16 = V_CMPX_LT_F16_E32 + V_CMPX_EQ_F16 = V_CMPX_EQ_F16_E32 + V_CMPX_LE_F16 = V_CMPX_LE_F16_E32 + V_CMPX_GT_F16 = V_CMPX_GT_F16_E32 + V_CMPX_LG_F16 = V_CMPX_LG_F16_E32 + V_CMPX_GE_F16 = V_CMPX_GE_F16_E32 + V_CMPX_O_F16 = V_CMPX_O_F16_E32 + V_CMPX_U_F16 = V_CMPX_U_F16_E32 + V_CMPX_NGE_F16 = V_CMPX_NGE_F16_E32 + V_CMPX_NLG_F16 = V_CMPX_NLG_F16_E32 + V_CMPX_NGT_F16 = V_CMPX_NGT_F16_E32 + V_CMPX_NLE_F16 = V_CMPX_NLE_F16_E32 + V_CMPX_NEQ_F16 = V_CMPX_NEQ_F16_E32 + V_CMPX_NLT_F16 = V_CMPX_NLT_F16_E32 + V_CMPX_T_F16 = V_CMPX_T_F16_E32 + V_CMPX_F_F32 = V_CMPX_F_F32_E32 + V_CMPX_LT_F32 = V_CMPX_LT_F32_E32 + V_CMPX_EQ_F32 = V_CMPX_EQ_F32_E32 + V_CMPX_LE_F32 = V_CMPX_LE_F32_E32 + V_CMPX_GT_F32 = V_CMPX_GT_F32_E32 + V_CMPX_LG_F32 = V_CMPX_LG_F32_E32 + V_CMPX_GE_F32 = V_CMPX_GE_F32_E32 + V_CMPX_O_F32 = V_CMPX_O_F32_E32 + V_CMPX_U_F32 = V_CMPX_U_F32_E32 + V_CMPX_NGE_F32 = V_CMPX_NGE_F32_E32 + V_CMPX_NLG_F32 = V_CMPX_NLG_F32_E32 + V_CMPX_NGT_F32 = V_CMPX_NGT_F32_E32 + V_CMPX_NLE_F32 = V_CMPX_NLE_F32_E32 + V_CMPX_NEQ_F32 = V_CMPX_NEQ_F32_E32 + V_CMPX_NLT_F32 = V_CMPX_NLT_F32_E32 + V_CMPX_T_F32 = V_CMPX_T_F32_E32 + V_CMPX_F_F64 = V_CMPX_F_F64_E32 + V_CMPX_LT_F64 = V_CMPX_LT_F64_E32 + V_CMPX_EQ_F64 = V_CMPX_EQ_F64_E32 + V_CMPX_LE_F64 = V_CMPX_LE_F64_E32 + V_CMPX_GT_F64 = V_CMPX_GT_F64_E32 + V_CMPX_LG_F64 = V_CMPX_LG_F64_E32 + V_CMPX_GE_F64 = V_CMPX_GE_F64_E32 + V_CMPX_O_F64 = V_CMPX_O_F64_E32 + V_CMPX_U_F64 = V_CMPX_U_F64_E32 + V_CMPX_NGE_F64 = V_CMPX_NGE_F64_E32 + V_CMPX_NLG_F64 = V_CMPX_NLG_F64_E32 + V_CMPX_NGT_F64 = V_CMPX_NGT_F64_E32 + V_CMPX_NLE_F64 = V_CMPX_NLE_F64_E32 + V_CMPX_NEQ_F64 = V_CMPX_NEQ_F64_E32 + V_CMPX_NLT_F64 = V_CMPX_NLT_F64_E32 + V_CMPX_T_F64 = V_CMPX_T_F64_E32 + V_CMPX_LT_I16 = V_CMPX_LT_I16_E32 + V_CMPX_EQ_I16 = V_CMPX_EQ_I16_E32 + V_CMPX_LE_I16 = V_CMPX_LE_I16_E32 + V_CMPX_GT_I16 = V_CMPX_GT_I16_E32 + V_CMPX_NE_I16 = V_CMPX_NE_I16_E32 + V_CMPX_GE_I16 = V_CMPX_GE_I16_E32 + V_CMPX_LT_U16 = V_CMPX_LT_U16_E32 + V_CMPX_EQ_U16 = V_CMPX_EQ_U16_E32 + V_CMPX_LE_U16 = V_CMPX_LE_U16_E32 + V_CMPX_GT_U16 = V_CMPX_GT_U16_E32 + V_CMPX_NE_U16 = V_CMPX_NE_U16_E32 + V_CMPX_GE_U16 = V_CMPX_GE_U16_E32 + V_CMPX_F_I32 = V_CMPX_F_I32_E32 + V_CMPX_LT_I32 = V_CMPX_LT_I32_E32 + V_CMPX_EQ_I32 = V_CMPX_EQ_I32_E32 + V_CMPX_LE_I32 = V_CMPX_LE_I32_E32 + V_CMPX_GT_I32 = V_CMPX_GT_I32_E32 + V_CMPX_NE_I32 = V_CMPX_NE_I32_E32 + V_CMPX_GE_I32 = V_CMPX_GE_I32_E32 + V_CMPX_T_I32 = V_CMPX_T_I32_E32 + V_CMPX_F_U32 = V_CMPX_F_U32_E32 + V_CMPX_LT_U32 = V_CMPX_LT_U32_E32 + V_CMPX_EQ_U32 = V_CMPX_EQ_U32_E32 + V_CMPX_LE_U32 = V_CMPX_LE_U32_E32 + V_CMPX_GT_U32 = V_CMPX_GT_U32_E32 + V_CMPX_NE_U32 = V_CMPX_NE_U32_E32 + V_CMPX_GE_U32 = V_CMPX_GE_U32_E32 + V_CMPX_T_U32 = V_CMPX_T_U32_E32 + V_CMPX_F_I64 = V_CMPX_F_I64_E32 + V_CMPX_LT_I64 = V_CMPX_LT_I64_E32 + V_CMPX_EQ_I64 = V_CMPX_EQ_I64_E32 + V_CMPX_LE_I64 = V_CMPX_LE_I64_E32 + V_CMPX_GT_I64 = V_CMPX_GT_I64_E32 + V_CMPX_NE_I64 = V_CMPX_NE_I64_E32 + V_CMPX_GE_I64 = V_CMPX_GE_I64_E32 + V_CMPX_T_I64 = V_CMPX_T_I64_E32 + V_CMPX_F_U64 = V_CMPX_F_U64_E32 + V_CMPX_LT_U64 = V_CMPX_LT_U64_E32 + V_CMPX_EQ_U64 = V_CMPX_EQ_U64_E32 + V_CMPX_LE_U64 = V_CMPX_LE_U64_E32 + V_CMPX_GT_U64 = V_CMPX_GT_U64_E32 + V_CMPX_NE_U64 = V_CMPX_NE_U64_E32 + V_CMPX_GE_U64 = V_CMPX_GE_U64_E32 + V_CMPX_T_U64 = V_CMPX_T_U64_E32 + V_CMPX_CLASS_F16 = V_CMPX_CLASS_F16_E32 + V_CMPX_CLASS_F32 = V_CMPX_CLASS_F32_E32 + V_CMPX_CLASS_F64 = V_CMPX_CLASS_F64_E32 + +class VOPDOp(ReprEnum): + V_DUAL_FMAC_F32 = 0 + V_DUAL_FMAAK_F32 = 1 + V_DUAL_FMAMK_F32 = 2 + V_DUAL_MUL_F32 = 3 + V_DUAL_ADD_F32 = 4 + V_DUAL_SUB_F32 = 5 + V_DUAL_SUBREV_F32 = 6 + V_DUAL_MUL_DX9_ZERO_F32 = 7 + V_DUAL_MOV_B32 = 8 + V_DUAL_CNDMASK_B32 = 9 + V_DUAL_MAX_F32 = 10 + V_DUAL_MIN_F32 = 11 + V_DUAL_DOT2ACC_F32_F16 = 12 + V_DUAL_DOT2ACC_F32_BF16 = 13 + V_DUAL_ADD_NC_U32 = 16 + V_DUAL_LSHLREV_B32 = 17 + V_DUAL_AND_B32 = 18 diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/ins.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/ins.py new file mode 100644 index 000000000..2514a5495 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/ins.py @@ -0,0 +1,1986 @@ +# autogenerated from AMD ISA XML - do not edit +# ruff: noqa: E501,F401 +from tinygrad.renderer.amd.dsl import BitField, DPP, DPP16, EXEC, EXECZ, EXEC_HI, EXEC_LO, EnumBitField, FixedBitField, INV_2PI, Inst, LIT, M0, NULL, OFF, SBaseField, SCC, SDWA, SGPRField, SRC_LDS_DIRECT, SRsrcField, SSrcField, SrcField, VCC, VCCZ, VCC_HI, VCC_LO, VDSTYField, VGPRField, s, src, ttmp, v +from tinygrad.runtime.autogen.amd.rdna3.enum import DSOp, EXPOp, FLATOp, GLOBALOp, LDSDIROp, MIMGOp, MTBUFOp, MUBUFOp, SCRATCHOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VINTERPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3SDOp, VOPCOp, VOPDOp, HWREG, MSG +import functools + +class DS(Inst): + encoding = FixedBitField(31, 26, 0b110110) + op = EnumBitField(25, 18, DSOp, {DSOp.DS_ADD_U32, DSOp.DS_SUB_U32, DSOp.DS_RSUB_U32, DSOp.DS_INC_U32, DSOp.DS_DEC_U32, DSOp.DS_MIN_I32, DSOp.DS_MAX_I32, DSOp.DS_MIN_U32, DSOp.DS_MAX_U32, DSOp.DS_AND_B32, DSOp.DS_OR_B32, DSOp.DS_XOR_B32, DSOp.DS_MSKOR_B32, DSOp.DS_STORE_B32, DSOp.DS_STORE_2ADDR_B32, DSOp.DS_STORE_2ADDR_STRIDE64_B32, DSOp.DS_CMPSTORE_B32, DSOp.DS_CMPSTORE_F32, DSOp.DS_MIN_F32, DSOp.DS_MAX_F32, DSOp.DS_NOP, DSOp.DS_ADD_F32, DSOp.DS_GWS_SEMA_RELEASE_ALL, DSOp.DS_GWS_INIT, DSOp.DS_GWS_SEMA_V, DSOp.DS_GWS_SEMA_BR, DSOp.DS_GWS_SEMA_P, DSOp.DS_GWS_BARRIER, DSOp.DS_STORE_B8, DSOp.DS_STORE_B16, DSOp.DS_ADD_RTN_U32, DSOp.DS_SUB_RTN_U32, DSOp.DS_RSUB_RTN_U32, DSOp.DS_INC_RTN_U32, DSOp.DS_DEC_RTN_U32, DSOp.DS_MIN_RTN_I32, DSOp.DS_MAX_RTN_I32, DSOp.DS_MIN_RTN_U32, DSOp.DS_MAX_RTN_U32, DSOp.DS_AND_RTN_B32, DSOp.DS_OR_RTN_B32, DSOp.DS_XOR_RTN_B32, DSOp.DS_MSKOR_RTN_B32, DSOp.DS_STOREXCHG_RTN_B32, DSOp.DS_STOREXCHG_2ADDR_RTN_B32, DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32, DSOp.DS_CMPSTORE_RTN_B32, DSOp.DS_CMPSTORE_RTN_F32, DSOp.DS_MIN_RTN_F32, DSOp.DS_MAX_RTN_F32, DSOp.DS_WRAP_RTN_B32, DSOp.DS_SWIZZLE_B32, DSOp.DS_LOAD_B32, DSOp.DS_LOAD_2ADDR_B32, DSOp.DS_LOAD_2ADDR_STRIDE64_B32, DSOp.DS_LOAD_I8, DSOp.DS_LOAD_U8, DSOp.DS_LOAD_I16, DSOp.DS_LOAD_U16, DSOp.DS_CONSUME, DSOp.DS_APPEND, DSOp.DS_ORDERED_COUNT, DSOp.DS_ADD_U64, DSOp.DS_SUB_U64, DSOp.DS_RSUB_U64, DSOp.DS_INC_U64, DSOp.DS_DEC_U64, DSOp.DS_MIN_I64, DSOp.DS_MAX_I64, DSOp.DS_MIN_U64, DSOp.DS_MAX_U64, DSOp.DS_AND_B64, DSOp.DS_OR_B64, DSOp.DS_XOR_B64, DSOp.DS_MSKOR_B64, DSOp.DS_STORE_B64, DSOp.DS_STORE_2ADDR_B64, DSOp.DS_STORE_2ADDR_STRIDE64_B64, DSOp.DS_CMPSTORE_B64, DSOp.DS_CMPSTORE_F64, DSOp.DS_MIN_F64, DSOp.DS_MAX_F64, DSOp.DS_ADD_RTN_U64, DSOp.DS_SUB_RTN_U64, DSOp.DS_RSUB_RTN_U64, DSOp.DS_INC_RTN_U64, DSOp.DS_DEC_RTN_U64, DSOp.DS_MIN_RTN_I64, DSOp.DS_MAX_RTN_I64, DSOp.DS_MIN_RTN_U64, DSOp.DS_MAX_RTN_U64, DSOp.DS_AND_RTN_B64, DSOp.DS_OR_RTN_B64, DSOp.DS_XOR_RTN_B64, DSOp.DS_MSKOR_RTN_B64, DSOp.DS_STOREXCHG_RTN_B64, DSOp.DS_STOREXCHG_2ADDR_RTN_B64, DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64, DSOp.DS_CMPSTORE_RTN_B64, DSOp.DS_CMPSTORE_RTN_F64, DSOp.DS_MIN_RTN_F64, DSOp.DS_MAX_RTN_F64, DSOp.DS_LOAD_B64, DSOp.DS_LOAD_2ADDR_B64, DSOp.DS_LOAD_2ADDR_STRIDE64_B64, DSOp.DS_ADD_RTN_F32, DSOp.DS_ADD_GS_REG_RTN, DSOp.DS_SUB_GS_REG_RTN, DSOp.DS_CONDXCHG32_RTN_B64, DSOp.DS_STORE_B8_D16_HI, DSOp.DS_STORE_B16_D16_HI, DSOp.DS_LOAD_U8_D16, DSOp.DS_LOAD_U8_D16_HI, DSOp.DS_LOAD_I8_D16, DSOp.DS_LOAD_I8_D16_HI, DSOp.DS_LOAD_U16_D16, DSOp.DS_LOAD_U16_D16_HI, DSOp.DS_BVH_STACK_RTN_B32, DSOp.DS_STORE_ADDTID_B32, DSOp.DS_LOAD_ADDTID_B32, DSOp.DS_PERMUTE_B32, DSOp.DS_BPERMUTE_B32, DSOp.DS_STORE_B96, DSOp.DS_STORE_B128, DSOp.DS_LOAD_B96, DSOp.DS_LOAD_B128}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data0 = VGPRField(47, 40) + data1 = VGPRField(55, 48) + offset0 = BitField(7, 0) + offset1 = BitField(15, 8) + gds = BitField(17, 17) + +class EXP(Inst): + encoding = FixedBitField(31, 26, 0b111110) + vsrc0 = VGPRField(39, 32) + vsrc1 = VGPRField(47, 40) + vsrc2 = VGPRField(55, 48) + vsrc3 = VGPRField(63, 56) + en = BitField(3, 0) + target = BitField(9, 4) + done = BitField(11, 11) + row = BitField(13, 13) + +class FLAT(Inst): + encoding = FixedBitField(31, 26, 0b110111) + op = EnumBitField(24, 18, FLATOp, {FLATOp.FLAT_LOAD_U8, FLATOp.FLAT_LOAD_I8, FLATOp.FLAT_LOAD_U16, FLATOp.FLAT_LOAD_I16, FLATOp.FLAT_LOAD_B32, FLATOp.FLAT_LOAD_B64, FLATOp.FLAT_LOAD_B96, FLATOp.FLAT_LOAD_B128, FLATOp.FLAT_STORE_B8, FLATOp.FLAT_STORE_B16, FLATOp.FLAT_STORE_B32, FLATOp.FLAT_STORE_B64, FLATOp.FLAT_STORE_B96, FLATOp.FLAT_STORE_B128, FLATOp.FLAT_LOAD_D16_U8, FLATOp.FLAT_LOAD_D16_I8, FLATOp.FLAT_LOAD_D16_B16, FLATOp.FLAT_LOAD_D16_HI_U8, FLATOp.FLAT_LOAD_D16_HI_I8, FLATOp.FLAT_LOAD_D16_HI_B16, FLATOp.FLAT_STORE_D16_HI_B8, FLATOp.FLAT_STORE_D16_HI_B16, FLATOp.GLOBAL_LOAD_ADDTID_B32, FLATOp.GLOBAL_STORE_ADDTID_B32, FLATOp.GLOBAL_LOAD_LDS_ADDTID_B32, FLATOp.FLAT_ATOMIC_SWAP_B32, FLATOp.FLAT_ATOMIC_CMPSWAP_B32, FLATOp.FLAT_ATOMIC_ADD_U32, FLATOp.FLAT_ATOMIC_SUB_U32, FLATOp.FLAT_ATOMIC_CSUB_U32, FLATOp.FLAT_ATOMIC_MIN_I32, FLATOp.FLAT_ATOMIC_MIN_U32, FLATOp.FLAT_ATOMIC_MAX_I32, FLATOp.FLAT_ATOMIC_MAX_U32, FLATOp.FLAT_ATOMIC_AND_B32, FLATOp.FLAT_ATOMIC_OR_B32, FLATOp.FLAT_ATOMIC_XOR_B32, FLATOp.FLAT_ATOMIC_INC_U32, FLATOp.FLAT_ATOMIC_DEC_U32, FLATOp.FLAT_ATOMIC_SWAP_B64, FLATOp.FLAT_ATOMIC_CMPSWAP_B64, FLATOp.FLAT_ATOMIC_ADD_U64, FLATOp.FLAT_ATOMIC_SUB_U64, FLATOp.FLAT_ATOMIC_MIN_I64, FLATOp.FLAT_ATOMIC_MIN_U64, FLATOp.FLAT_ATOMIC_MAX_I64, FLATOp.FLAT_ATOMIC_MAX_U64, FLATOp.FLAT_ATOMIC_AND_B64, FLATOp.FLAT_ATOMIC_OR_B64, FLATOp.FLAT_ATOMIC_XOR_B64, FLATOp.FLAT_ATOMIC_INC_U64, FLATOp.FLAT_ATOMIC_DEC_U64, FLATOp.FLAT_ATOMIC_CMPSWAP_F32, FLATOp.FLAT_ATOMIC_MIN_F32, FLATOp.FLAT_ATOMIC_MAX_F32, FLATOp.FLAT_ATOMIC_ADD_F32}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data = VGPRField(47, 40) + saddr = SGPRField(54, 48, default=NULL) + offset = BitField(12, 0) + seg = FixedBitField(17, 16, 0) + glc = BitField(14, 14) + dlc = BitField(13, 13) + slc = BitField(15, 15) + sve = BitField(55, 55) + +class GLOBAL(Inst): + encoding = FixedBitField(31, 26, 0b110111) + op = EnumBitField(24, 18, GLOBALOp, {GLOBALOp.GLOBAL_LOAD_U8, GLOBALOp.GLOBAL_LOAD_I8, GLOBALOp.GLOBAL_LOAD_U16, GLOBALOp.GLOBAL_LOAD_I16, GLOBALOp.GLOBAL_LOAD_B32, GLOBALOp.GLOBAL_LOAD_B64, GLOBALOp.GLOBAL_LOAD_B96, GLOBALOp.GLOBAL_LOAD_B128, GLOBALOp.GLOBAL_STORE_B8, GLOBALOp.GLOBAL_STORE_B16, GLOBALOp.GLOBAL_STORE_B32, GLOBALOp.GLOBAL_STORE_B64, GLOBALOp.GLOBAL_STORE_B96, GLOBALOp.GLOBAL_STORE_B128, GLOBALOp.GLOBAL_LOAD_D16_U8, GLOBALOp.GLOBAL_LOAD_D16_I8, GLOBALOp.GLOBAL_LOAD_D16_B16, GLOBALOp.GLOBAL_LOAD_D16_HI_U8, GLOBALOp.GLOBAL_LOAD_D16_HI_I8, GLOBALOp.GLOBAL_LOAD_D16_HI_B16, GLOBALOp.GLOBAL_STORE_D16_HI_B8, GLOBALOp.GLOBAL_STORE_D16_HI_B16, GLOBALOp.GLOBAL_LOAD_ADDTID_B32, GLOBALOp.GLOBAL_STORE_ADDTID_B32, GLOBALOp.GLOBAL_LOAD_LDS_ADDTID_B32, GLOBALOp.GLOBAL_LOAD_LDS_U8, GLOBALOp.GLOBAL_LOAD_LDS_I8, GLOBALOp.GLOBAL_LOAD_LDS_U16, GLOBALOp.GLOBAL_LOAD_LDS_I16, GLOBALOp.GLOBAL_LOAD_LDS_B32, GLOBALOp.GLOBAL_ATOMIC_SWAP_B32, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B32, GLOBALOp.GLOBAL_ATOMIC_ADD_U32, GLOBALOp.GLOBAL_ATOMIC_SUB_U32, GLOBALOp.GLOBAL_ATOMIC_CSUB_U32, GLOBALOp.GLOBAL_ATOMIC_MIN_I32, GLOBALOp.GLOBAL_ATOMIC_MIN_U32, GLOBALOp.GLOBAL_ATOMIC_MAX_I32, GLOBALOp.GLOBAL_ATOMIC_MAX_U32, GLOBALOp.GLOBAL_ATOMIC_AND_B32, GLOBALOp.GLOBAL_ATOMIC_OR_B32, GLOBALOp.GLOBAL_ATOMIC_XOR_B32, GLOBALOp.GLOBAL_ATOMIC_INC_U32, GLOBALOp.GLOBAL_ATOMIC_DEC_U32, GLOBALOp.GLOBAL_ATOMIC_SWAP_B64, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B64, GLOBALOp.GLOBAL_ATOMIC_ADD_U64, GLOBALOp.GLOBAL_ATOMIC_SUB_U64, GLOBALOp.GLOBAL_ATOMIC_MIN_I64, GLOBALOp.GLOBAL_ATOMIC_MIN_U64, GLOBALOp.GLOBAL_ATOMIC_MAX_I64, GLOBALOp.GLOBAL_ATOMIC_MAX_U64, GLOBALOp.GLOBAL_ATOMIC_AND_B64, GLOBALOp.GLOBAL_ATOMIC_OR_B64, GLOBALOp.GLOBAL_ATOMIC_XOR_B64, GLOBALOp.GLOBAL_ATOMIC_INC_U64, GLOBALOp.GLOBAL_ATOMIC_DEC_U64, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_F32, GLOBALOp.GLOBAL_ATOMIC_MIN_F32, GLOBALOp.GLOBAL_ATOMIC_MAX_F32, GLOBALOp.GLOBAL_ATOMIC_ADD_F32}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data = VGPRField(47, 40) + saddr = SGPRField(54, 48, default=NULL) + offset = BitField(12, 0) + seg = FixedBitField(17, 16, 2) + glc = BitField(14, 14) + dlc = BitField(13, 13) + slc = BitField(15, 15) + sve = BitField(55, 55) + +class SCRATCH(Inst): + encoding = FixedBitField(31, 26, 0b110111) + op = EnumBitField(24, 18, SCRATCHOp, {SCRATCHOp.SCRATCH_LOAD_U8, SCRATCHOp.SCRATCH_LOAD_I8, SCRATCHOp.SCRATCH_LOAD_U16, SCRATCHOp.SCRATCH_LOAD_I16, SCRATCHOp.SCRATCH_LOAD_B32, SCRATCHOp.SCRATCH_LOAD_B64, SCRATCHOp.SCRATCH_LOAD_B96, SCRATCHOp.SCRATCH_LOAD_B128, SCRATCHOp.SCRATCH_STORE_B8, SCRATCHOp.SCRATCH_STORE_B16, SCRATCHOp.SCRATCH_STORE_B32, SCRATCHOp.SCRATCH_STORE_B64, SCRATCHOp.SCRATCH_STORE_B96, SCRATCHOp.SCRATCH_STORE_B128, SCRATCHOp.SCRATCH_LOAD_D16_U8, SCRATCHOp.SCRATCH_LOAD_D16_I8, SCRATCHOp.SCRATCH_LOAD_D16_B16, SCRATCHOp.SCRATCH_LOAD_D16_HI_U8, SCRATCHOp.SCRATCH_LOAD_D16_HI_I8, SCRATCHOp.SCRATCH_LOAD_D16_HI_B16, SCRATCHOp.SCRATCH_STORE_D16_HI_B8, SCRATCHOp.SCRATCH_STORE_D16_HI_B16, SCRATCHOp.SCRATCH_LOAD_LDS_U8, SCRATCHOp.SCRATCH_LOAD_LDS_I8, SCRATCHOp.SCRATCH_LOAD_LDS_U16, SCRATCHOp.SCRATCH_LOAD_LDS_I16, SCRATCHOp.SCRATCH_LOAD_LDS_B32}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data = VGPRField(47, 40) + saddr = SGPRField(54, 48, default=NULL) + offset = BitField(12, 0) + seg = FixedBitField(17, 16, 1) + glc = BitField(14, 14) + dlc = BitField(13, 13) + slc = BitField(15, 15) + sve = BitField(55, 55) + +class LDSDIR(Inst): + encoding = FixedBitField(31, 24, 0b11001110) + op = EnumBitField(21, 20, LDSDIROp, {LDSDIROp.LDS_PARAM_LOAD, LDSDIROp.LDS_DIRECT_LOAD}) + vdst = VGPRField(7, 0) + attr = BitField(15, 10) + attr_chan = BitField(9, 8) + wait_vdst = BitField(19, 16) + +class MIMG(Inst): + encoding = FixedBitField(31, 26, 0b111100) + op = EnumBitField(25, 18, MIMGOp, {MIMGOp.IMAGE_LOAD, MIMGOp.IMAGE_LOAD_MIP, MIMGOp.IMAGE_LOAD_PCK, MIMGOp.IMAGE_LOAD_PCK_SGN, MIMGOp.IMAGE_LOAD_MIP_PCK, MIMGOp.IMAGE_LOAD_MIP_PCK_SGN, MIMGOp.IMAGE_STORE, MIMGOp.IMAGE_STORE_MIP, MIMGOp.IMAGE_STORE_PCK, MIMGOp.IMAGE_STORE_MIP_PCK, MIMGOp.IMAGE_ATOMIC_SWAP, MIMGOp.IMAGE_ATOMIC_CMPSWAP, MIMGOp.IMAGE_ATOMIC_ADD, MIMGOp.IMAGE_ATOMIC_SUB, MIMGOp.IMAGE_ATOMIC_SMIN, MIMGOp.IMAGE_ATOMIC_UMIN, MIMGOp.IMAGE_ATOMIC_SMAX, MIMGOp.IMAGE_ATOMIC_UMAX, MIMGOp.IMAGE_ATOMIC_AND, MIMGOp.IMAGE_ATOMIC_OR, MIMGOp.IMAGE_ATOMIC_XOR, MIMGOp.IMAGE_ATOMIC_INC, MIMGOp.IMAGE_ATOMIC_DEC, MIMGOp.IMAGE_GET_RESINFO, MIMGOp.IMAGE_MSAA_LOAD, MIMGOp.IMAGE_BVH_INTERSECT_RAY, MIMGOp.IMAGE_BVH64_INTERSECT_RAY, MIMGOp.IMAGE_SAMPLE, MIMGOp.IMAGE_SAMPLE_D, MIMGOp.IMAGE_SAMPLE_L, MIMGOp.IMAGE_SAMPLE_B, MIMGOp.IMAGE_SAMPLE_LZ, MIMGOp.IMAGE_SAMPLE_C, MIMGOp.IMAGE_SAMPLE_C_D, MIMGOp.IMAGE_SAMPLE_C_L, MIMGOp.IMAGE_SAMPLE_C_B, MIMGOp.IMAGE_SAMPLE_C_LZ, MIMGOp.IMAGE_SAMPLE_O, MIMGOp.IMAGE_SAMPLE_D_O, MIMGOp.IMAGE_SAMPLE_L_O, MIMGOp.IMAGE_SAMPLE_B_O, MIMGOp.IMAGE_SAMPLE_LZ_O, MIMGOp.IMAGE_SAMPLE_C_O, MIMGOp.IMAGE_SAMPLE_C_D_O, MIMGOp.IMAGE_SAMPLE_C_L_O, MIMGOp.IMAGE_SAMPLE_C_B_O, MIMGOp.IMAGE_SAMPLE_C_LZ_O, MIMGOp.IMAGE_GATHER4, MIMGOp.IMAGE_GATHER4_L, MIMGOp.IMAGE_GATHER4_B, MIMGOp.IMAGE_GATHER4_LZ, MIMGOp.IMAGE_GATHER4_C, MIMGOp.IMAGE_GATHER4_C_LZ, MIMGOp.IMAGE_GATHER4_O, MIMGOp.IMAGE_GATHER4_LZ_O, MIMGOp.IMAGE_GATHER4_C_LZ_O, MIMGOp.IMAGE_GET_LOD, MIMGOp.IMAGE_SAMPLE_D_G16, MIMGOp.IMAGE_SAMPLE_C_D_G16, MIMGOp.IMAGE_SAMPLE_D_O_G16, MIMGOp.IMAGE_SAMPLE_C_D_O_G16, MIMGOp.IMAGE_SAMPLE_CL, MIMGOp.IMAGE_SAMPLE_D_CL, MIMGOp.IMAGE_SAMPLE_B_CL, MIMGOp.IMAGE_SAMPLE_C_CL, MIMGOp.IMAGE_SAMPLE_C_D_CL, MIMGOp.IMAGE_SAMPLE_C_B_CL, MIMGOp.IMAGE_SAMPLE_CL_O, MIMGOp.IMAGE_SAMPLE_D_CL_O, MIMGOp.IMAGE_SAMPLE_B_CL_O, MIMGOp.IMAGE_SAMPLE_C_CL_O, MIMGOp.IMAGE_SAMPLE_C_D_CL_O, MIMGOp.IMAGE_SAMPLE_C_B_CL_O, MIMGOp.IMAGE_SAMPLE_C_D_CL_G16, MIMGOp.IMAGE_SAMPLE_D_CL_O_G16, MIMGOp.IMAGE_SAMPLE_C_D_CL_O_G16, MIMGOp.IMAGE_SAMPLE_D_CL_G16, MIMGOp.IMAGE_GATHER4_CL, MIMGOp.IMAGE_GATHER4_B_CL, MIMGOp.IMAGE_GATHER4_C_CL, MIMGOp.IMAGE_GATHER4_C_L, MIMGOp.IMAGE_GATHER4_C_B, MIMGOp.IMAGE_GATHER4_C_B_CL, MIMGOp.IMAGE_GATHER4H}) + vdata = VGPRField(47, 40) + vaddr = VGPRField(39, 32) + srsrc = SRsrcField(52, 48) + ssamp = SRsrcField(62, 58) + dmask = BitField(11, 8) + dim = BitField(4, 2) + glc = BitField(14, 14) + dlc = BitField(13, 13) + slc = BitField(12, 12) + tfe = BitField(53, 53) + unrm = BitField(7, 7) + nsa = BitField(0, 0) + r128 = BitField(15, 15) + a16 = BitField(16, 16) + d16 = BitField(17, 17) + lwe = BitField(54, 54) + +class MTBUF(Inst): + encoding = FixedBitField(31, 26, 0b111010) + op = EnumBitField(18, 15, MTBUFOp, {MTBUFOp.TBUFFER_LOAD_FORMAT_X, MTBUFOp.TBUFFER_LOAD_FORMAT_XY, MTBUFOp.TBUFFER_LOAD_FORMAT_XYZ, MTBUFOp.TBUFFER_LOAD_FORMAT_XYZW, MTBUFOp.TBUFFER_STORE_FORMAT_X, MTBUFOp.TBUFFER_STORE_FORMAT_XY, MTBUFOp.TBUFFER_STORE_FORMAT_XYZ, MTBUFOp.TBUFFER_STORE_FORMAT_XYZW, MTBUFOp.TBUFFER_LOAD_D16_FORMAT_X, MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XY, MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XYZ, MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XYZW, MTBUFOp.TBUFFER_STORE_D16_FORMAT_X, MTBUFOp.TBUFFER_STORE_D16_FORMAT_XY, MTBUFOp.TBUFFER_STORE_D16_FORMAT_XYZ, MTBUFOp.TBUFFER_STORE_D16_FORMAT_XYZW}) + vdata = VGPRField(47, 40) + vaddr = VGPRField(39, 32) + srsrc = SRsrcField(52, 48) + soffset = SSrcField(63, 56, default=NULL) + offset = BitField(11, 0) + format = BitField(25, 19) + offen = BitField(54, 54) + idxen = BitField(55, 55) + glc = BitField(14, 14) + dlc = BitField(13, 13) + slc = BitField(12, 12) + tfe = BitField(53, 53) + +class MUBUF(Inst): + encoding = FixedBitField(31, 26, 0b111000) + op = EnumBitField(25, 18, MUBUFOp, {MUBUFOp.BUFFER_LOAD_FORMAT_X, MUBUFOp.BUFFER_LOAD_FORMAT_XY, MUBUFOp.BUFFER_LOAD_FORMAT_XYZ, MUBUFOp.BUFFER_LOAD_FORMAT_XYZW, MUBUFOp.BUFFER_STORE_FORMAT_X, MUBUFOp.BUFFER_STORE_FORMAT_XY, MUBUFOp.BUFFER_STORE_FORMAT_XYZ, MUBUFOp.BUFFER_STORE_FORMAT_XYZW, MUBUFOp.BUFFER_LOAD_D16_FORMAT_X, MUBUFOp.BUFFER_LOAD_D16_FORMAT_XY, MUBUFOp.BUFFER_LOAD_D16_FORMAT_XYZ, MUBUFOp.BUFFER_LOAD_D16_FORMAT_XYZW, MUBUFOp.BUFFER_STORE_D16_FORMAT_X, MUBUFOp.BUFFER_STORE_D16_FORMAT_XY, MUBUFOp.BUFFER_STORE_D16_FORMAT_XYZ, MUBUFOp.BUFFER_STORE_D16_FORMAT_XYZW, MUBUFOp.BUFFER_LOAD_U8, MUBUFOp.BUFFER_LOAD_I8, MUBUFOp.BUFFER_LOAD_U16, MUBUFOp.BUFFER_LOAD_I16, MUBUFOp.BUFFER_LOAD_B32, MUBUFOp.BUFFER_LOAD_B64, MUBUFOp.BUFFER_LOAD_B96, MUBUFOp.BUFFER_LOAD_B128, MUBUFOp.BUFFER_STORE_B8, MUBUFOp.BUFFER_STORE_B16, MUBUFOp.BUFFER_STORE_B32, MUBUFOp.BUFFER_STORE_B64, MUBUFOp.BUFFER_STORE_B96, MUBUFOp.BUFFER_STORE_B128, MUBUFOp.BUFFER_LOAD_D16_U8, MUBUFOp.BUFFER_LOAD_D16_I8, MUBUFOp.BUFFER_LOAD_D16_B16, MUBUFOp.BUFFER_LOAD_D16_HI_U8, MUBUFOp.BUFFER_LOAD_D16_HI_I8, MUBUFOp.BUFFER_LOAD_D16_HI_B16, MUBUFOp.BUFFER_STORE_D16_HI_B8, MUBUFOp.BUFFER_STORE_D16_HI_B16, MUBUFOp.BUFFER_LOAD_D16_HI_FORMAT_X, MUBUFOp.BUFFER_STORE_D16_HI_FORMAT_X, MUBUFOp.BUFFER_GL0_INV, MUBUFOp.BUFFER_GL1_INV, MUBUFOp.BUFFER_LOAD_LDS_U8, MUBUFOp.BUFFER_LOAD_LDS_I8, MUBUFOp.BUFFER_LOAD_LDS_U16, MUBUFOp.BUFFER_LOAD_LDS_I16, MUBUFOp.BUFFER_LOAD_LDS_B32, MUBUFOp.BUFFER_LOAD_LDS_FORMAT_X, MUBUFOp.BUFFER_ATOMIC_SWAP_B32, MUBUFOp.BUFFER_ATOMIC_CMPSWAP_B32, MUBUFOp.BUFFER_ATOMIC_ADD_U32, MUBUFOp.BUFFER_ATOMIC_SUB_U32, MUBUFOp.BUFFER_ATOMIC_CSUB_U32, MUBUFOp.BUFFER_ATOMIC_MIN_I32, MUBUFOp.BUFFER_ATOMIC_MIN_U32, MUBUFOp.BUFFER_ATOMIC_MAX_I32, MUBUFOp.BUFFER_ATOMIC_MAX_U32, MUBUFOp.BUFFER_ATOMIC_AND_B32, MUBUFOp.BUFFER_ATOMIC_OR_B32, MUBUFOp.BUFFER_ATOMIC_XOR_B32, MUBUFOp.BUFFER_ATOMIC_INC_U32, MUBUFOp.BUFFER_ATOMIC_DEC_U32, MUBUFOp.BUFFER_ATOMIC_SWAP_B64, MUBUFOp.BUFFER_ATOMIC_CMPSWAP_B64, MUBUFOp.BUFFER_ATOMIC_ADD_U64, MUBUFOp.BUFFER_ATOMIC_SUB_U64, MUBUFOp.BUFFER_ATOMIC_MIN_I64, MUBUFOp.BUFFER_ATOMIC_MIN_U64, MUBUFOp.BUFFER_ATOMIC_MAX_I64, MUBUFOp.BUFFER_ATOMIC_MAX_U64, MUBUFOp.BUFFER_ATOMIC_AND_B64, MUBUFOp.BUFFER_ATOMIC_OR_B64, MUBUFOp.BUFFER_ATOMIC_XOR_B64, MUBUFOp.BUFFER_ATOMIC_INC_U64, MUBUFOp.BUFFER_ATOMIC_DEC_U64, MUBUFOp.BUFFER_ATOMIC_CMPSWAP_F32, MUBUFOp.BUFFER_ATOMIC_MIN_F32, MUBUFOp.BUFFER_ATOMIC_MAX_F32, MUBUFOp.BUFFER_ATOMIC_ADD_F32}) + vdata = VGPRField(47, 40) + vaddr = VGPRField(39, 32) + srsrc = SRsrcField(52, 48) + soffset = SSrcField(63, 56, default=NULL) + offset = BitField(11, 0) + offen = BitField(54, 54) + idxen = BitField(55, 55) + glc = BitField(14, 14) + dlc = BitField(13, 13) + slc = BitField(12, 12) + tfe = BitField(53, 53) + +class SMEM(Inst): + encoding = FixedBitField(31, 26, 0b111101) + op = EnumBitField(25, 18, SMEMOp, {SMEMOp.S_LOAD_B32, SMEMOp.S_LOAD_B64, SMEMOp.S_LOAD_B128, SMEMOp.S_LOAD_B256, SMEMOp.S_LOAD_B512, SMEMOp.S_BUFFER_LOAD_B32, SMEMOp.S_BUFFER_LOAD_B64, SMEMOp.S_BUFFER_LOAD_B128, SMEMOp.S_BUFFER_LOAD_B256, SMEMOp.S_BUFFER_LOAD_B512, SMEMOp.S_GL1_INV, SMEMOp.S_DCACHE_INV, SMEMOp.S_ATC_PROBE, SMEMOp.S_ATC_PROBE_BUFFER}) + sdata = SGPRField(12, 6) + sbase = SBaseField(5, 0) + soffset = SGPRField(63, 57, default=NULL) + offset = BitField(52, 32) + glc = BitField(14, 14) + dlc = BitField(13, 13) + +class SOP1(Inst): + encoding = FixedBitField(31, 23, 0b101111101) + op = EnumBitField(15, 8, SOP1Op, {SOP1Op.S_MOV_B32, SOP1Op.S_MOV_B64, SOP1Op.S_CMOV_B32, SOP1Op.S_CMOV_B64, SOP1Op.S_BREV_B32, SOP1Op.S_BREV_B64, SOP1Op.S_CTZ_I32_B32, SOP1Op.S_CTZ_I32_B64, SOP1Op.S_CLZ_I32_U32, SOP1Op.S_CLZ_I32_U64, SOP1Op.S_CLS_I32, SOP1Op.S_CLS_I32_I64, SOP1Op.S_SEXT_I32_I8, SOP1Op.S_SEXT_I32_I16, SOP1Op.S_BITSET0_B32, SOP1Op.S_BITSET0_B64, SOP1Op.S_BITSET1_B32, SOP1Op.S_BITSET1_B64, SOP1Op.S_BITREPLICATE_B64_B32, SOP1Op.S_ABS_I32, SOP1Op.S_BCNT0_I32_B32, SOP1Op.S_BCNT0_I32_B64, SOP1Op.S_BCNT1_I32_B32, SOP1Op.S_BCNT1_I32_B64, SOP1Op.S_QUADMASK_B32, SOP1Op.S_QUADMASK_B64, SOP1Op.S_WQM_B32, SOP1Op.S_WQM_B64, SOP1Op.S_NOT_B32, SOP1Op.S_NOT_B64, SOP1Op.S_AND_SAVEEXEC_B32, SOP1Op.S_AND_SAVEEXEC_B64, SOP1Op.S_OR_SAVEEXEC_B32, SOP1Op.S_OR_SAVEEXEC_B64, SOP1Op.S_XOR_SAVEEXEC_B32, SOP1Op.S_XOR_SAVEEXEC_B64, SOP1Op.S_NAND_SAVEEXEC_B32, SOP1Op.S_NAND_SAVEEXEC_B64, SOP1Op.S_NOR_SAVEEXEC_B32, SOP1Op.S_NOR_SAVEEXEC_B64, SOP1Op.S_XNOR_SAVEEXEC_B32, SOP1Op.S_XNOR_SAVEEXEC_B64, SOP1Op.S_AND_NOT0_SAVEEXEC_B32, SOP1Op.S_AND_NOT0_SAVEEXEC_B64, SOP1Op.S_OR_NOT0_SAVEEXEC_B32, SOP1Op.S_OR_NOT0_SAVEEXEC_B64, SOP1Op.S_AND_NOT1_SAVEEXEC_B32, SOP1Op.S_AND_NOT1_SAVEEXEC_B64, SOP1Op.S_OR_NOT1_SAVEEXEC_B32, SOP1Op.S_OR_NOT1_SAVEEXEC_B64, SOP1Op.S_AND_NOT0_WREXEC_B32, SOP1Op.S_AND_NOT0_WREXEC_B64, SOP1Op.S_AND_NOT1_WREXEC_B32, SOP1Op.S_AND_NOT1_WREXEC_B64, SOP1Op.S_MOVRELS_B32, SOP1Op.S_MOVRELS_B64, SOP1Op.S_MOVRELD_B32, SOP1Op.S_MOVRELD_B64, SOP1Op.S_MOVRELSD_2_B32, SOP1Op.S_GETPC_B64, SOP1Op.S_SETPC_B64, SOP1Op.S_SWAPPC_B64, SOP1Op.S_RFE_B64, SOP1Op.S_SENDMSG_RTN_B32, SOP1Op.S_SENDMSG_RTN_B64, SOP1Op.S_CEIL_F32, SOP1Op.S_FLOOR_F32, SOP1Op.S_TRUNC_F32, SOP1Op.S_RNDNE_F32, SOP1Op.S_CVT_F32_I32, SOP1Op.S_CVT_F32_U32, SOP1Op.S_CVT_I32_F32, SOP1Op.S_CVT_U32_F32, SOP1Op.S_CVT_F16_F32, SOP1Op.S_CVT_F32_F16, SOP1Op.S_CVT_HI_F32_F16, SOP1Op.S_CEIL_F16, SOP1Op.S_FLOOR_F16, SOP1Op.S_TRUNC_F16, SOP1Op.S_RNDNE_F16}) + sdst = SGPRField(22, 16) + ssrc0 = SSrcField(7, 0) + +class SOP2(Inst): + encoding = FixedBitField(31, 30, 0b10) + op = EnumBitField(29, 23, SOP2Op, {SOP2Op.S_ADD_U32, SOP2Op.S_SUB_U32, SOP2Op.S_ADD_I32, SOP2Op.S_SUB_I32, SOP2Op.S_ADDC_U32, SOP2Op.S_SUBB_U32, SOP2Op.S_ABSDIFF_I32, SOP2Op.S_LSHL_B32, SOP2Op.S_LSHL_B64, SOP2Op.S_LSHR_B32, SOP2Op.S_LSHR_B64, SOP2Op.S_ASHR_I32, SOP2Op.S_ASHR_I64, SOP2Op.S_LSHL1_ADD_U32, SOP2Op.S_LSHL2_ADD_U32, SOP2Op.S_LSHL3_ADD_U32, SOP2Op.S_LSHL4_ADD_U32, SOP2Op.S_MIN_I32, SOP2Op.S_MIN_U32, SOP2Op.S_MAX_I32, SOP2Op.S_MAX_U32, SOP2Op.S_AND_B32, SOP2Op.S_AND_B64, SOP2Op.S_OR_B32, SOP2Op.S_OR_B64, SOP2Op.S_XOR_B32, SOP2Op.S_XOR_B64, SOP2Op.S_NAND_B32, SOP2Op.S_NAND_B64, SOP2Op.S_NOR_B32, SOP2Op.S_NOR_B64, SOP2Op.S_XNOR_B32, SOP2Op.S_XNOR_B64, SOP2Op.S_AND_NOT1_B32, SOP2Op.S_AND_NOT1_B64, SOP2Op.S_OR_NOT1_B32, SOP2Op.S_OR_NOT1_B64, SOP2Op.S_BFE_U32, SOP2Op.S_BFE_I32, SOP2Op.S_BFE_U64, SOP2Op.S_BFE_I64, SOP2Op.S_BFM_B32, SOP2Op.S_BFM_B64, SOP2Op.S_MUL_I32, SOP2Op.S_MUL_HI_U32, SOP2Op.S_MUL_HI_I32, SOP2Op.S_CSELECT_B32, SOP2Op.S_CSELECT_B64, SOP2Op.S_PACK_LL_B32_B16, SOP2Op.S_PACK_LH_B32_B16, SOP2Op.S_PACK_HH_B32_B16, SOP2Op.S_PACK_HL_B32_B16, SOP2Op.S_ADD_F32, SOP2Op.S_SUB_F32, SOP2Op.S_MIN_F32, SOP2Op.S_MAX_F32, SOP2Op.S_MUL_F32, SOP2Op.S_FMAC_F32, SOP2Op.S_CVT_PK_RTZ_F16_F32, SOP2Op.S_ADD_F16, SOP2Op.S_SUB_F16, SOP2Op.S_MIN_F16, SOP2Op.S_MAX_F16, SOP2Op.S_MUL_F16, SOP2Op.S_FMAC_F16}) + sdst = SGPRField(22, 16) + ssrc0 = SSrcField(7, 0) + ssrc1 = SSrcField(15, 8) + +class SOPC(Inst): + encoding = FixedBitField(31, 23, 0b101111110) + op = EnumBitField(22, 16, SOPCOp, {SOPCOp.S_CMP_EQ_I32, SOPCOp.S_CMP_LG_I32, SOPCOp.S_CMP_GT_I32, SOPCOp.S_CMP_GE_I32, SOPCOp.S_CMP_LT_I32, SOPCOp.S_CMP_LE_I32, SOPCOp.S_CMP_EQ_U32, SOPCOp.S_CMP_LG_U32, SOPCOp.S_CMP_GT_U32, SOPCOp.S_CMP_GE_U32, SOPCOp.S_CMP_LT_U32, SOPCOp.S_CMP_LE_U32, SOPCOp.S_BITCMP0_B32, SOPCOp.S_BITCMP1_B32, SOPCOp.S_BITCMP0_B64, SOPCOp.S_BITCMP1_B64, SOPCOp.S_CMP_EQ_U64, SOPCOp.S_CMP_LG_U64, SOPCOp.S_CMP_LT_F32, SOPCOp.S_CMP_EQ_F32, SOPCOp.S_CMP_LE_F32, SOPCOp.S_CMP_GT_F32, SOPCOp.S_CMP_LG_F32, SOPCOp.S_CMP_GE_F32, SOPCOp.S_CMP_O_F32, SOPCOp.S_CMP_U_F32, SOPCOp.S_CMP_NGE_F32, SOPCOp.S_CMP_NLG_F32, SOPCOp.S_CMP_NGT_F32, SOPCOp.S_CMP_NLE_F32, SOPCOp.S_CMP_NEQ_F32, SOPCOp.S_CMP_NLT_F32, SOPCOp.S_CMP_LT_F16, SOPCOp.S_CMP_EQ_F16, SOPCOp.S_CMP_LE_F16, SOPCOp.S_CMP_GT_F16, SOPCOp.S_CMP_LG_F16, SOPCOp.S_CMP_GE_F16, SOPCOp.S_CMP_O_F16, SOPCOp.S_CMP_U_F16, SOPCOp.S_CMP_NGE_F16, SOPCOp.S_CMP_NLG_F16, SOPCOp.S_CMP_NGT_F16, SOPCOp.S_CMP_NLE_F16, SOPCOp.S_CMP_NEQ_F16, SOPCOp.S_CMP_NLT_F16}) + ssrc0 = SSrcField(7, 0) + ssrc1 = SSrcField(15, 8) + +class SOPK(Inst): + encoding = FixedBitField(31, 28, 0b1011) + op = EnumBitField(27, 23, SOPKOp, {SOPKOp.S_MOVK_I32, SOPKOp.S_VERSION, SOPKOp.S_CMOVK_I32, SOPKOp.S_CMPK_EQ_I32, SOPKOp.S_CMPK_LG_I32, SOPKOp.S_CMPK_GT_I32, SOPKOp.S_CMPK_GE_I32, SOPKOp.S_CMPK_LT_I32, SOPKOp.S_CMPK_LE_I32, SOPKOp.S_CMPK_EQ_U32, SOPKOp.S_CMPK_LG_U32, SOPKOp.S_CMPK_GT_U32, SOPKOp.S_CMPK_GE_U32, SOPKOp.S_CMPK_LT_U32, SOPKOp.S_CMPK_LE_U32, SOPKOp.S_ADDK_I32, SOPKOp.S_MULK_I32, SOPKOp.S_GETREG_B32, SOPKOp.S_SETREG_B32, SOPKOp.S_CALL_B64, SOPKOp.S_SUBVECTOR_LOOP_BEGIN, SOPKOp.S_SUBVECTOR_LOOP_END, SOPKOp.S_WAITCNT_VSCNT, SOPKOp.S_WAITCNT_VMCNT, SOPKOp.S_WAITCNT_EXPCNT, SOPKOp.S_WAITCNT_LGKMCNT}) + sdst = SGPRField(22, 16) + simm16 = BitField(15, 0) + +class SOPP(Inst): + encoding = FixedBitField(31, 23, 0b101111111) + op = EnumBitField(22, 16, SOPPOp, {SOPPOp.S_NOP, SOPPOp.S_SETKILL, SOPPOp.S_SETHALT, SOPPOp.S_SLEEP, SOPPOp.S_SET_INST_PREFETCH_DISTANCE, SOPPOp.S_CLAUSE, SOPPOp.S_DELAY_ALU, SOPPOp.S_WAITCNT_DEPCTR, SOPPOp.S_WAITCNT, SOPPOp.S_WAIT_IDLE, SOPPOp.S_WAIT_EVENT, SOPPOp.S_TRAP, SOPPOp.S_ROUND_MODE, SOPPOp.S_DENORM_MODE, SOPPOp.S_CODE_END, SOPPOp.S_BRANCH, SOPPOp.S_CBRANCH_SCC0, SOPPOp.S_CBRANCH_SCC1, SOPPOp.S_CBRANCH_VCCZ, SOPPOp.S_CBRANCH_VCCNZ, SOPPOp.S_CBRANCH_EXECZ, SOPPOp.S_CBRANCH_EXECNZ, SOPPOp.S_CBRANCH_CDBGSYS, SOPPOp.S_CBRANCH_CDBGUSER, SOPPOp.S_CBRANCH_CDBGSYS_OR_USER, SOPPOp.S_CBRANCH_CDBGSYS_AND_USER, SOPPOp.S_ENDPGM, SOPPOp.S_ENDPGM_SAVED, SOPPOp.S_ENDPGM_ORDERED_PS_DONE, SOPPOp.S_WAKEUP, SOPPOp.S_SETPRIO, SOPPOp.S_SENDMSG, SOPPOp.S_SENDMSGHALT, SOPPOp.S_INCPERFLEVEL, SOPPOp.S_DECPERFLEVEL, SOPPOp.S_TTRACEDATA, SOPPOp.S_TTRACEDATA_IMM, SOPPOp.S_ICACHE_INV, SOPPOp.S_BARRIER}) + simm16 = BitField(15, 0) + +class VINTERP(Inst): + encoding = FixedBitField(31, 24, 0b11001101) + op = EnumBitField(22, 16, VINTERPOp, {VINTERPOp.V_INTERP_P10_F32, VINTERPOp.V_INTERP_P2_F32, VINTERPOp.V_INTERP_P10_F16_F32, VINTERPOp.V_INTERP_P2_F16_F32, VINTERPOp.V_INTERP_P10_RTZ_F16_F32, VINTERPOp.V_INTERP_P2_RTZ_F16_F32}) + vdst = VGPRField(7, 0) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + neg = BitField(63, 61) + clmp = BitField(15, 15) + opsel = BitField(14, 11) + waitexp = BitField(10, 8) + +class VOP1(Inst): + encoding = FixedBitField(31, 25, 0b0111111) + op = EnumBitField(16, 9, VOP1Op, {VOP1Op.V_NOP, VOP1Op.V_MOV_B32, VOP1Op.V_CVT_I32_F64, VOP1Op.V_CVT_F64_I32, VOP1Op.V_CVT_F32_I32, VOP1Op.V_CVT_F32_U32, VOP1Op.V_CVT_U32_F32, VOP1Op.V_CVT_I32_F32, VOP1Op.V_CVT_F16_F32, VOP1Op.V_CVT_F32_F16, VOP1Op.V_CVT_NEAREST_I32_F32, VOP1Op.V_CVT_FLOOR_I32_F32, VOP1Op.V_CVT_OFF_F32_I4, VOP1Op.V_CVT_F32_F64, VOP1Op.V_CVT_F64_F32, VOP1Op.V_CVT_F32_UBYTE0, VOP1Op.V_CVT_F32_UBYTE1, VOP1Op.V_CVT_F32_UBYTE2, VOP1Op.V_CVT_F32_UBYTE3, VOP1Op.V_CVT_U32_F64, VOP1Op.V_CVT_F64_U32, VOP1Op.V_TRUNC_F64, VOP1Op.V_CEIL_F64, VOP1Op.V_RNDNE_F64, VOP1Op.V_FLOOR_F64, VOP1Op.V_PIPEFLUSH, VOP1Op.V_MOV_B16, VOP1Op.V_FRACT_F32, VOP1Op.V_TRUNC_F32, VOP1Op.V_CEIL_F32, VOP1Op.V_RNDNE_F32, VOP1Op.V_FLOOR_F32, VOP1Op.V_EXP_F32, VOP1Op.V_LOG_F32, VOP1Op.V_RCP_F32, VOP1Op.V_RCP_IFLAG_F32, VOP1Op.V_RSQ_F32, VOP1Op.V_RCP_F64, VOP1Op.V_RSQ_F64, VOP1Op.V_SQRT_F32, VOP1Op.V_SQRT_F64, VOP1Op.V_SIN_F32, VOP1Op.V_COS_F32, VOP1Op.V_NOT_B32, VOP1Op.V_BFREV_B32, VOP1Op.V_CLZ_I32_U32, VOP1Op.V_CTZ_I32_B32, VOP1Op.V_CLS_I32, VOP1Op.V_FREXP_EXP_I32_F64, VOP1Op.V_FREXP_MANT_F64, VOP1Op.V_FRACT_F64, VOP1Op.V_FREXP_EXP_I32_F32, VOP1Op.V_FREXP_MANT_F32, VOP1Op.V_MOVRELD_B32, VOP1Op.V_MOVRELS_B32, VOP1Op.V_MOVRELSD_B32, VOP1Op.V_MOVRELSD_2_B32, VOP1Op.V_CVT_F16_U16, VOP1Op.V_CVT_F16_I16, VOP1Op.V_CVT_U16_F16, VOP1Op.V_CVT_I16_F16, VOP1Op.V_RCP_F16, VOP1Op.V_SQRT_F16, VOP1Op.V_RSQ_F16, VOP1Op.V_LOG_F16, VOP1Op.V_EXP_F16, VOP1Op.V_FREXP_MANT_F16, VOP1Op.V_FREXP_EXP_I16_F16, VOP1Op.V_FLOOR_F16, VOP1Op.V_CEIL_F16, VOP1Op.V_TRUNC_F16, VOP1Op.V_RNDNE_F16, VOP1Op.V_FRACT_F16, VOP1Op.V_SIN_F16, VOP1Op.V_COS_F16, VOP1Op.V_SAT_PK_U8_I16, VOP1Op.V_CVT_NORM_I16_F16, VOP1Op.V_CVT_NORM_U16_F16, VOP1Op.V_SWAP_B32, VOP1Op.V_SWAP_B16, VOP1Op.V_PERMLANE64_B32, VOP1Op.V_SWAPREL_B32, VOP1Op.V_NOT_B16, VOP1Op.V_CVT_I32_I16, VOP1Op.V_CVT_U32_U16}) + vdst = VGPRField(24, 17) + src0 = SrcField(8, 0) + +class VOP2(Inst): + encoding = FixedBitField(31, 31, 0b0) + op = EnumBitField(30, 25, VOP2Op, {VOP2Op.V_CNDMASK_B32, VOP2Op.V_DOT2ACC_F32_F16, VOP2Op.V_ADD_F32, VOP2Op.V_SUB_F32, VOP2Op.V_SUBREV_F32, VOP2Op.V_FMAC_DX9_ZERO_F32, VOP2Op.V_MUL_DX9_ZERO_F32, VOP2Op.V_MUL_F32, VOP2Op.V_MUL_I32_I24, VOP2Op.V_MUL_HI_I32_I24, VOP2Op.V_MUL_U32_U24, VOP2Op.V_MUL_HI_U32_U24, VOP2Op.V_MIN_F32, VOP2Op.V_MAX_F32, VOP2Op.V_MIN_I32, VOP2Op.V_MAX_I32, VOP2Op.V_MIN_U32, VOP2Op.V_MAX_U32, VOP2Op.V_LSHLREV_B32, VOP2Op.V_LSHRREV_B32, VOP2Op.V_ASHRREV_I32, VOP2Op.V_AND_B32, VOP2Op.V_OR_B32, VOP2Op.V_XOR_B32, VOP2Op.V_XNOR_B32, VOP2Op.V_ADD_CO_CI_U32, VOP2Op.V_SUB_CO_CI_U32, VOP2Op.V_SUBREV_CO_CI_U32, VOP2Op.V_ADD_NC_U32, VOP2Op.V_SUB_NC_U32, VOP2Op.V_SUBREV_NC_U32, VOP2Op.V_FMAC_F32, VOP2Op.V_CVT_PK_RTZ_F16_F32, VOP2Op.V_ADD_F16, VOP2Op.V_SUB_F16, VOP2Op.V_SUBREV_F16, VOP2Op.V_MUL_F16, VOP2Op.V_FMAC_F16, VOP2Op.V_MAX_F16, VOP2Op.V_MIN_F16, VOP2Op.V_LDEXP_F16, VOP2Op.V_PK_FMAC_F16}) + vdst = VGPRField(24, 17) + src0 = SrcField(8, 0) + vsrc1 = VGPRField(16, 9) + +class VOP3(Inst): + encoding = FixedBitField(31, 26, 0b110101) + op = EnumBitField(25, 16, VOP3Op, {VOP3Op.V_CMPX_F_F16, VOP3Op.V_CMPX_LT_F16, VOP3Op.V_CMPX_EQ_F16, VOP3Op.V_CMPX_LE_F16, VOP3Op.V_CMPX_GT_F16, VOP3Op.V_CMPX_LG_F16, VOP3Op.V_CMPX_GE_F16, VOP3Op.V_CMPX_O_F16, VOP3Op.V_CMPX_U_F16, VOP3Op.V_CMPX_NGE_F16, VOP3Op.V_CMPX_NLG_F16, VOP3Op.V_CMPX_NGT_F16, VOP3Op.V_CMPX_NLE_F16, VOP3Op.V_CMPX_NEQ_F16, VOP3Op.V_CMPX_NLT_F16, VOP3Op.V_CMPX_T_F16, VOP3Op.V_CMPX_F_F32, VOP3Op.V_CMPX_LT_F32, VOP3Op.V_CMPX_EQ_F32, VOP3Op.V_CMPX_LE_F32, VOP3Op.V_CMPX_GT_F32, VOP3Op.V_CMPX_LG_F32, VOP3Op.V_CMPX_GE_F32, VOP3Op.V_CMPX_O_F32, VOP3Op.V_CMPX_U_F32, VOP3Op.V_CMPX_NGE_F32, VOP3Op.V_CMPX_NLG_F32, VOP3Op.V_CMPX_NGT_F32, VOP3Op.V_CMPX_NLE_F32, VOP3Op.V_CMPX_NEQ_F32, VOP3Op.V_CMPX_NLT_F32, VOP3Op.V_CMPX_T_F32, VOP3Op.V_CMPX_F_F64, VOP3Op.V_CMPX_LT_F64, VOP3Op.V_CMPX_EQ_F64, VOP3Op.V_CMPX_LE_F64, VOP3Op.V_CMPX_GT_F64, VOP3Op.V_CMPX_LG_F64, VOP3Op.V_CMPX_GE_F64, VOP3Op.V_CMPX_O_F64, VOP3Op.V_CMPX_U_F64, VOP3Op.V_CMPX_NGE_F64, VOP3Op.V_CMPX_NLG_F64, VOP3Op.V_CMPX_NGT_F64, VOP3Op.V_CMPX_NLE_F64, VOP3Op.V_CMPX_NEQ_F64, VOP3Op.V_CMPX_NLT_F64, VOP3Op.V_CMPX_T_F64, VOP3Op.V_CMPX_LT_I16, VOP3Op.V_CMPX_EQ_I16, VOP3Op.V_CMPX_LE_I16, VOP3Op.V_CMPX_GT_I16, VOP3Op.V_CMPX_NE_I16, VOP3Op.V_CMPX_GE_I16, VOP3Op.V_CMPX_LT_U16, VOP3Op.V_CMPX_EQ_U16, VOP3Op.V_CMPX_LE_U16, VOP3Op.V_CMPX_GT_U16, VOP3Op.V_CMPX_NE_U16, VOP3Op.V_CMPX_GE_U16, VOP3Op.V_CMPX_F_I32, VOP3Op.V_CMPX_LT_I32, VOP3Op.V_CMPX_EQ_I32, VOP3Op.V_CMPX_LE_I32, VOP3Op.V_CMPX_GT_I32, VOP3Op.V_CMPX_NE_I32, VOP3Op.V_CMPX_GE_I32, VOP3Op.V_CMPX_T_I32, VOP3Op.V_CMPX_F_U32, VOP3Op.V_CMPX_LT_U32, VOP3Op.V_CMPX_EQ_U32, VOP3Op.V_CMPX_LE_U32, VOP3Op.V_CMPX_GT_U32, VOP3Op.V_CMPX_NE_U32, VOP3Op.V_CMPX_GE_U32, VOP3Op.V_CMPX_T_U32, VOP3Op.V_CMPX_F_I64, VOP3Op.V_CMPX_LT_I64, VOP3Op.V_CMPX_EQ_I64, VOP3Op.V_CMPX_LE_I64, VOP3Op.V_CMPX_GT_I64, VOP3Op.V_CMPX_NE_I64, VOP3Op.V_CMPX_GE_I64, VOP3Op.V_CMPX_T_I64, VOP3Op.V_CMPX_F_U64, VOP3Op.V_CMPX_LT_U64, VOP3Op.V_CMPX_EQ_U64, VOP3Op.V_CMPX_LE_U64, VOP3Op.V_CMPX_GT_U64, VOP3Op.V_CMPX_NE_U64, VOP3Op.V_CMPX_GE_U64, VOP3Op.V_CMPX_T_U64, VOP3Op.V_CMPX_CLASS_F16, VOP3Op.V_CMPX_CLASS_F32, VOP3Op.V_CMPX_CLASS_F64, VOP3Op.V_CNDMASK_B32, VOP3Op.V_ADD_F32, VOP3Op.V_SUB_F32, VOP3Op.V_SUBREV_F32, VOP3Op.V_FMAC_DX9_ZERO_F32, VOP3Op.V_MUL_DX9_ZERO_F32, VOP3Op.V_MUL_F32, VOP3Op.V_MUL_I32_I24, VOP3Op.V_MUL_HI_I32_I24, VOP3Op.V_MUL_U32_U24, VOP3Op.V_MUL_HI_U32_U24, VOP3Op.V_MIN_F32, VOP3Op.V_MAX_F32, VOP3Op.V_MIN_I32, VOP3Op.V_MAX_I32, VOP3Op.V_MIN_U32, VOP3Op.V_MAX_U32, VOP3Op.V_LSHLREV_B32, VOP3Op.V_LSHRREV_B32, VOP3Op.V_ASHRREV_I32, VOP3Op.V_AND_B32, VOP3Op.V_OR_B32, VOP3Op.V_XOR_B32, VOP3Op.V_XNOR_B32, VOP3Op.V_ADD_NC_U32, VOP3Op.V_SUB_NC_U32, VOP3Op.V_SUBREV_NC_U32, VOP3Op.V_FMAC_F32, VOP3Op.V_CVT_PK_RTZ_F16_F32, VOP3Op.V_ADD_F16, VOP3Op.V_SUB_F16, VOP3Op.V_SUBREV_F16, VOP3Op.V_MUL_F16, VOP3Op.V_FMAC_F16, VOP3Op.V_MAX_F16, VOP3Op.V_MIN_F16, VOP3Op.V_LDEXP_F16, VOP3Op.V_NOP, VOP3Op.V_MOV_B32, VOP3Op.V_CVT_I32_F64, VOP3Op.V_CVT_F64_I32, VOP3Op.V_CVT_F32_I32, VOP3Op.V_CVT_F32_U32, VOP3Op.V_CVT_U32_F32, VOP3Op.V_CVT_I32_F32, VOP3Op.V_CVT_F16_F32, VOP3Op.V_CVT_F32_F16, VOP3Op.V_CVT_NEAREST_I32_F32, VOP3Op.V_CVT_FLOOR_I32_F32, VOP3Op.V_CVT_OFF_F32_I4, VOP3Op.V_CVT_F32_F64, VOP3Op.V_CVT_F64_F32, VOP3Op.V_CVT_F32_UBYTE0, VOP3Op.V_CVT_F32_UBYTE1, VOP3Op.V_CVT_F32_UBYTE2, VOP3Op.V_CVT_F32_UBYTE3, VOP3Op.V_CVT_U32_F64, VOP3Op.V_CVT_F64_U32, VOP3Op.V_TRUNC_F64, VOP3Op.V_CEIL_F64, VOP3Op.V_RNDNE_F64, VOP3Op.V_FLOOR_F64, VOP3Op.V_PIPEFLUSH, VOP3Op.V_MOV_B16, VOP3Op.V_FRACT_F32, VOP3Op.V_TRUNC_F32, VOP3Op.V_CEIL_F32, VOP3Op.V_RNDNE_F32, VOP3Op.V_FLOOR_F32, VOP3Op.V_EXP_F32, VOP3Op.V_LOG_F32, VOP3Op.V_RCP_F32, VOP3Op.V_RCP_IFLAG_F32, VOP3Op.V_RSQ_F32, VOP3Op.V_RCP_F64, VOP3Op.V_RSQ_F64, VOP3Op.V_SQRT_F32, VOP3Op.V_SQRT_F64, VOP3Op.V_SIN_F32, VOP3Op.V_COS_F32, VOP3Op.V_NOT_B32, VOP3Op.V_BFREV_B32, VOP3Op.V_CLZ_I32_U32, VOP3Op.V_CTZ_I32_B32, VOP3Op.V_CLS_I32, VOP3Op.V_FREXP_EXP_I32_F64, VOP3Op.V_FREXP_MANT_F64, VOP3Op.V_FRACT_F64, VOP3Op.V_FREXP_EXP_I32_F32, VOP3Op.V_FREXP_MANT_F32, VOP3Op.V_MOVRELD_B32, VOP3Op.V_MOVRELS_B32, VOP3Op.V_MOVRELSD_B32, VOP3Op.V_MOVRELSD_2_B32, VOP3Op.V_CVT_F16_U16, VOP3Op.V_CVT_F16_I16, VOP3Op.V_CVT_U16_F16, VOP3Op.V_CVT_I16_F16, VOP3Op.V_RCP_F16, VOP3Op.V_SQRT_F16, VOP3Op.V_RSQ_F16, VOP3Op.V_LOG_F16, VOP3Op.V_EXP_F16, VOP3Op.V_FREXP_MANT_F16, VOP3Op.V_FREXP_EXP_I16_F16, VOP3Op.V_FLOOR_F16, VOP3Op.V_CEIL_F16, VOP3Op.V_TRUNC_F16, VOP3Op.V_RNDNE_F16, VOP3Op.V_FRACT_F16, VOP3Op.V_SIN_F16, VOP3Op.V_COS_F16, VOP3Op.V_SAT_PK_U8_I16, VOP3Op.V_CVT_NORM_I16_F16, VOP3Op.V_CVT_NORM_U16_F16, VOP3Op.V_NOT_B16, VOP3Op.V_CVT_I32_I16, VOP3Op.V_CVT_U32_U16, VOP3Op.V_FMA_DX9_ZERO_F32, VOP3Op.V_MAD_I32_I24, VOP3Op.V_MAD_U32_U24, VOP3Op.V_CUBEID_F32, VOP3Op.V_CUBESC_F32, VOP3Op.V_CUBETC_F32, VOP3Op.V_CUBEMA_F32, VOP3Op.V_BFE_U32, VOP3Op.V_BFE_I32, VOP3Op.V_BFI_B32, VOP3Op.V_FMA_F32, VOP3Op.V_FMA_F64, VOP3Op.V_LERP_U8, VOP3Op.V_ALIGNBIT_B32, VOP3Op.V_ALIGNBYTE_B32, VOP3Op.V_MULLIT_F32, VOP3Op.V_MIN3_F32, VOP3Op.V_MIN3_I32, VOP3Op.V_MIN3_U32, VOP3Op.V_MAX3_F32, VOP3Op.V_MAX3_I32, VOP3Op.V_MAX3_U32, VOP3Op.V_MED3_F32, VOP3Op.V_MED3_I32, VOP3Op.V_MED3_U32, VOP3Op.V_SAD_U8, VOP3Op.V_SAD_HI_U8, VOP3Op.V_SAD_U16, VOP3Op.V_SAD_U32, VOP3Op.V_CVT_PK_U8_F32, VOP3Op.V_DIV_FIXUP_F32, VOP3Op.V_DIV_FIXUP_F64, VOP3Op.V_DIV_FMAS_F32, VOP3Op.V_DIV_FMAS_F64, VOP3Op.V_MSAD_U8, VOP3Op.V_QSAD_PK_U16_U8, VOP3Op.V_MQSAD_PK_U16_U8, VOP3Op.V_MQSAD_U32_U8, VOP3Op.V_XOR3_B32, VOP3Op.V_MAD_U16, VOP3Op.V_PERM_B32, VOP3Op.V_XAD_U32, VOP3Op.V_LSHL_ADD_U32, VOP3Op.V_ADD_LSHL_U32, VOP3Op.V_FMA_F16, VOP3Op.V_MIN3_F16, VOP3Op.V_MIN3_I16, VOP3Op.V_MIN3_U16, VOP3Op.V_MAX3_F16, VOP3Op.V_MAX3_I16, VOP3Op.V_MAX3_U16, VOP3Op.V_MED3_F16, VOP3Op.V_MED3_I16, VOP3Op.V_MED3_U16, VOP3Op.V_MAD_I16, VOP3Op.V_DIV_FIXUP_F16, VOP3Op.V_ADD3_U32, VOP3Op.V_LSHL_OR_B32, VOP3Op.V_AND_OR_B32, VOP3Op.V_OR3_B32, VOP3Op.V_MAD_U32_U16, VOP3Op.V_MAD_I32_I16, VOP3Op.V_PERMLANE16_B32, VOP3Op.V_PERMLANEX16_B32, VOP3Op.V_CNDMASK_B16, VOP3Op.V_MAXMIN_F32, VOP3Op.V_MINMAX_F32, VOP3Op.V_MAXMIN_F16, VOP3Op.V_MINMAX_F16, VOP3Op.V_MAXMIN_U32, VOP3Op.V_MINMAX_U32, VOP3Op.V_MAXMIN_I32, VOP3Op.V_MINMAX_I32, VOP3Op.V_DOT2_F16_F16, VOP3Op.V_DOT2_BF16_BF16, VOP3Op.V_ADD_NC_U16, VOP3Op.V_SUB_NC_U16, VOP3Op.V_MUL_LO_U16, VOP3Op.V_CVT_PK_I16_F32, VOP3Op.V_CVT_PK_U16_F32, VOP3Op.V_MAX_U16, VOP3Op.V_MAX_I16, VOP3Op.V_MIN_U16, VOP3Op.V_MIN_I16, VOP3Op.V_ADD_NC_I16, VOP3Op.V_SUB_NC_I16, VOP3Op.V_PACK_B32_F16, VOP3Op.V_CVT_PK_NORM_I16_F16, VOP3Op.V_CVT_PK_NORM_U16_F16, VOP3Op.V_LDEXP_F32, VOP3Op.V_BFM_B32, VOP3Op.V_BCNT_U32_B32, VOP3Op.V_MBCNT_LO_U32_B32, VOP3Op.V_MBCNT_HI_U32_B32, VOP3Op.V_CVT_PK_NORM_I16_F32, VOP3Op.V_CVT_PK_NORM_U16_F32, VOP3Op.V_CVT_PK_U16_U32, VOP3Op.V_CVT_PK_I16_I32, VOP3Op.V_SUB_NC_I32, VOP3Op.V_ADD_NC_I32, VOP3Op.V_ADD_F64, VOP3Op.V_MUL_F64, VOP3Op.V_MIN_F64, VOP3Op.V_MAX_F64, VOP3Op.V_LDEXP_F64, VOP3Op.V_MUL_LO_U32, VOP3Op.V_MUL_HI_U32, VOP3Op.V_MUL_HI_I32, VOP3Op.V_TRIG_PREOP_F64, VOP3Op.V_LSHLREV_B16, VOP3Op.V_LSHRREV_B16, VOP3Op.V_ASHRREV_I16, VOP3Op.V_LSHLREV_B64, VOP3Op.V_LSHRREV_B64, VOP3Op.V_ASHRREV_I64, VOP3Op.V_WRITELANE_B32, VOP3Op.V_AND_B16, VOP3Op.V_OR_B16, VOP3Op.V_XOR_B16}) + vdst = VGPRField(7, 0) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + omod = BitField(60, 59) + neg = BitField(63, 61) + abs = BitField(10, 8) + clmp = BitField(15, 15) + opsel = BitField(14, 11) + +class VOP3P(Inst): + encoding = FixedBitField(31, 24, 0b11001100) + op = EnumBitField(22, 16, VOP3POp, {VOP3POp.V_PK_MAD_I16, VOP3POp.V_PK_MUL_LO_U16, VOP3POp.V_PK_ADD_I16, VOP3POp.V_PK_SUB_I16, VOP3POp.V_PK_LSHLREV_B16, VOP3POp.V_PK_LSHRREV_B16, VOP3POp.V_PK_ASHRREV_I16, VOP3POp.V_PK_MAX_I16, VOP3POp.V_PK_MIN_I16, VOP3POp.V_PK_MAD_U16, VOP3POp.V_PK_ADD_U16, VOP3POp.V_PK_SUB_U16, VOP3POp.V_PK_MAX_U16, VOP3POp.V_PK_MIN_U16, VOP3POp.V_PK_FMA_F16, VOP3POp.V_PK_ADD_F16, VOP3POp.V_PK_MUL_F16, VOP3POp.V_PK_MIN_F16, VOP3POp.V_PK_MAX_F16, VOP3POp.V_DOT2_F32_F16, VOP3POp.V_DOT4_I32_IU8, VOP3POp.V_DOT4_U32_U8, VOP3POp.V_DOT8_I32_IU4, VOP3POp.V_DOT8_U32_U4, VOP3POp.V_DOT2_F32_BF16, VOP3POp.V_FMA_MIX_F32, VOP3POp.V_FMA_MIXLO_F16, VOP3POp.V_FMA_MIXHI_F16, VOP3POp.V_WMMA_F32_16X16X16_F16, VOP3POp.V_WMMA_F32_16X16X16_BF16, VOP3POp.V_WMMA_F16_16X16X16_F16, VOP3POp.V_WMMA_BF16_16X16X16_BF16, VOP3POp.V_WMMA_I32_16X16X16_IU8, VOP3POp.V_WMMA_I32_16X16X16_IU4}) + vdst = VGPRField(7, 0) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + neg = BitField(63, 61) + neg_hi = BitField(10, 8) + clmp = BitField(15, 15) + opsel = BitField(13, 11) + opsel_hi = BitField(60, 59, default=3) + opsel_hi2 = BitField(14, 14, default=1) + +class VOP3SD(Inst): + encoding = FixedBitField(31, 26, 0b110101) + op = EnumBitField(25, 16, VOP3SDOp, {VOP3SDOp.V_ADD_CO_CI_U32, VOP3SDOp.V_SUB_CO_CI_U32, VOP3SDOp.V_SUBREV_CO_CI_U32, VOP3SDOp.V_DIV_SCALE_F32, VOP3SDOp.V_DIV_SCALE_F64, VOP3SDOp.V_MAD_U64_U32, VOP3SDOp.V_MAD_I64_I32, VOP3SDOp.V_ADD_CO_U32, VOP3SDOp.V_SUB_CO_U32, VOP3SDOp.V_SUBREV_CO_U32}) + vdst = VGPRField(7, 0) + sdst = SGPRField(14, 8) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + omod = BitField(60, 59) + neg = BitField(63, 61) + clmp = BitField(15, 15) + +class VOPC(Inst): + encoding = FixedBitField(31, 25, 0b0111110) + op = EnumBitField(24, 17, VOPCOp, {VOPCOp.V_CMP_F_F16, VOPCOp.V_CMP_LT_F16, VOPCOp.V_CMP_EQ_F16, VOPCOp.V_CMP_LE_F16, VOPCOp.V_CMP_GT_F16, VOPCOp.V_CMP_LG_F16, VOPCOp.V_CMP_GE_F16, VOPCOp.V_CMP_O_F16, VOPCOp.V_CMP_U_F16, VOPCOp.V_CMP_NGE_F16, VOPCOp.V_CMP_NLG_F16, VOPCOp.V_CMP_NGT_F16, VOPCOp.V_CMP_NLE_F16, VOPCOp.V_CMP_NEQ_F16, VOPCOp.V_CMP_NLT_F16, VOPCOp.V_CMP_T_F16, VOPCOp.V_CMP_F_F32, VOPCOp.V_CMP_LT_F32, VOPCOp.V_CMP_EQ_F32, VOPCOp.V_CMP_LE_F32, VOPCOp.V_CMP_GT_F32, VOPCOp.V_CMP_LG_F32, VOPCOp.V_CMP_GE_F32, VOPCOp.V_CMP_O_F32, VOPCOp.V_CMP_U_F32, VOPCOp.V_CMP_NGE_F32, VOPCOp.V_CMP_NLG_F32, VOPCOp.V_CMP_NGT_F32, VOPCOp.V_CMP_NLE_F32, VOPCOp.V_CMP_NEQ_F32, VOPCOp.V_CMP_NLT_F32, VOPCOp.V_CMP_T_F32, VOPCOp.V_CMP_F_F64, VOPCOp.V_CMP_LT_F64, VOPCOp.V_CMP_EQ_F64, VOPCOp.V_CMP_LE_F64, VOPCOp.V_CMP_GT_F64, VOPCOp.V_CMP_LG_F64, VOPCOp.V_CMP_GE_F64, VOPCOp.V_CMP_O_F64, VOPCOp.V_CMP_U_F64, VOPCOp.V_CMP_NGE_F64, VOPCOp.V_CMP_NLG_F64, VOPCOp.V_CMP_NGT_F64, VOPCOp.V_CMP_NLE_F64, VOPCOp.V_CMP_NEQ_F64, VOPCOp.V_CMP_NLT_F64, VOPCOp.V_CMP_T_F64, VOPCOp.V_CMP_LT_I16, VOPCOp.V_CMP_EQ_I16, VOPCOp.V_CMP_LE_I16, VOPCOp.V_CMP_GT_I16, VOPCOp.V_CMP_NE_I16, VOPCOp.V_CMP_GE_I16, VOPCOp.V_CMP_LT_U16, VOPCOp.V_CMP_EQ_U16, VOPCOp.V_CMP_LE_U16, VOPCOp.V_CMP_GT_U16, VOPCOp.V_CMP_NE_U16, VOPCOp.V_CMP_GE_U16, VOPCOp.V_CMP_F_I32, VOPCOp.V_CMP_LT_I32, VOPCOp.V_CMP_EQ_I32, VOPCOp.V_CMP_LE_I32, VOPCOp.V_CMP_GT_I32, VOPCOp.V_CMP_NE_I32, VOPCOp.V_CMP_GE_I32, VOPCOp.V_CMP_T_I32, VOPCOp.V_CMP_F_U32, VOPCOp.V_CMP_LT_U32, VOPCOp.V_CMP_EQ_U32, VOPCOp.V_CMP_LE_U32, VOPCOp.V_CMP_GT_U32, VOPCOp.V_CMP_NE_U32, VOPCOp.V_CMP_GE_U32, VOPCOp.V_CMP_T_U32, VOPCOp.V_CMP_F_I64, VOPCOp.V_CMP_LT_I64, VOPCOp.V_CMP_EQ_I64, VOPCOp.V_CMP_LE_I64, VOPCOp.V_CMP_GT_I64, VOPCOp.V_CMP_NE_I64, VOPCOp.V_CMP_GE_I64, VOPCOp.V_CMP_T_I64, VOPCOp.V_CMP_F_U64, VOPCOp.V_CMP_LT_U64, VOPCOp.V_CMP_EQ_U64, VOPCOp.V_CMP_LE_U64, VOPCOp.V_CMP_GT_U64, VOPCOp.V_CMP_NE_U64, VOPCOp.V_CMP_GE_U64, VOPCOp.V_CMP_T_U64, VOPCOp.V_CMP_CLASS_F16, VOPCOp.V_CMP_CLASS_F32, VOPCOp.V_CMP_CLASS_F64, VOPCOp.V_CMPX_F_F16, VOPCOp.V_CMPX_LT_F16, VOPCOp.V_CMPX_EQ_F16, VOPCOp.V_CMPX_LE_F16, VOPCOp.V_CMPX_GT_F16, VOPCOp.V_CMPX_LG_F16, VOPCOp.V_CMPX_GE_F16, VOPCOp.V_CMPX_O_F16, VOPCOp.V_CMPX_U_F16, VOPCOp.V_CMPX_NGE_F16, VOPCOp.V_CMPX_NLG_F16, VOPCOp.V_CMPX_NGT_F16, VOPCOp.V_CMPX_NLE_F16, VOPCOp.V_CMPX_NEQ_F16, VOPCOp.V_CMPX_NLT_F16, VOPCOp.V_CMPX_T_F16, VOPCOp.V_CMPX_F_F32, VOPCOp.V_CMPX_LT_F32, VOPCOp.V_CMPX_EQ_F32, VOPCOp.V_CMPX_LE_F32, VOPCOp.V_CMPX_GT_F32, VOPCOp.V_CMPX_LG_F32, VOPCOp.V_CMPX_GE_F32, VOPCOp.V_CMPX_O_F32, VOPCOp.V_CMPX_U_F32, VOPCOp.V_CMPX_NGE_F32, VOPCOp.V_CMPX_NLG_F32, VOPCOp.V_CMPX_NGT_F32, VOPCOp.V_CMPX_NLE_F32, VOPCOp.V_CMPX_NEQ_F32, VOPCOp.V_CMPX_NLT_F32, VOPCOp.V_CMPX_T_F32, VOPCOp.V_CMPX_F_F64, VOPCOp.V_CMPX_LT_F64, VOPCOp.V_CMPX_EQ_F64, VOPCOp.V_CMPX_LE_F64, VOPCOp.V_CMPX_GT_F64, VOPCOp.V_CMPX_LG_F64, VOPCOp.V_CMPX_GE_F64, VOPCOp.V_CMPX_O_F64, VOPCOp.V_CMPX_U_F64, VOPCOp.V_CMPX_NGE_F64, VOPCOp.V_CMPX_NLG_F64, VOPCOp.V_CMPX_NGT_F64, VOPCOp.V_CMPX_NLE_F64, VOPCOp.V_CMPX_NEQ_F64, VOPCOp.V_CMPX_NLT_F64, VOPCOp.V_CMPX_T_F64, VOPCOp.V_CMPX_LT_I16, VOPCOp.V_CMPX_EQ_I16, VOPCOp.V_CMPX_LE_I16, VOPCOp.V_CMPX_GT_I16, VOPCOp.V_CMPX_NE_I16, VOPCOp.V_CMPX_GE_I16, VOPCOp.V_CMPX_LT_U16, VOPCOp.V_CMPX_EQ_U16, VOPCOp.V_CMPX_LE_U16, VOPCOp.V_CMPX_GT_U16, VOPCOp.V_CMPX_NE_U16, VOPCOp.V_CMPX_GE_U16, VOPCOp.V_CMPX_F_I32, VOPCOp.V_CMPX_LT_I32, VOPCOp.V_CMPX_EQ_I32, VOPCOp.V_CMPX_LE_I32, VOPCOp.V_CMPX_GT_I32, VOPCOp.V_CMPX_NE_I32, VOPCOp.V_CMPX_GE_I32, VOPCOp.V_CMPX_T_I32, VOPCOp.V_CMPX_F_U32, VOPCOp.V_CMPX_LT_U32, VOPCOp.V_CMPX_EQ_U32, VOPCOp.V_CMPX_LE_U32, VOPCOp.V_CMPX_GT_U32, VOPCOp.V_CMPX_NE_U32, VOPCOp.V_CMPX_GE_U32, VOPCOp.V_CMPX_T_U32, VOPCOp.V_CMPX_F_I64, VOPCOp.V_CMPX_LT_I64, VOPCOp.V_CMPX_EQ_I64, VOPCOp.V_CMPX_LE_I64, VOPCOp.V_CMPX_GT_I64, VOPCOp.V_CMPX_NE_I64, VOPCOp.V_CMPX_GE_I64, VOPCOp.V_CMPX_T_I64, VOPCOp.V_CMPX_F_U64, VOPCOp.V_CMPX_LT_U64, VOPCOp.V_CMPX_EQ_U64, VOPCOp.V_CMPX_LE_U64, VOPCOp.V_CMPX_GT_U64, VOPCOp.V_CMPX_NE_U64, VOPCOp.V_CMPX_GE_U64, VOPCOp.V_CMPX_T_U64, VOPCOp.V_CMPX_CLASS_F16, VOPCOp.V_CMPX_CLASS_F32, VOPCOp.V_CMPX_CLASS_F64}) + src0 = SrcField(8, 0) + vsrc1 = VGPRField(16, 9) + +class VOPD(Inst): + encoding = FixedBitField(31, 26, 0b110010) + opx = EnumBitField(25, 22, VOPDOp) + opy = EnumBitField(21, 17, VOPDOp) + vdstx = VGPRField(63, 56) + vdsty = VDSTYField(55, 49) + srcx0 = SrcField(8, 0) + srcy0 = SrcField(40, 32) + vsrcx1 = VGPRField(16, 9) + vsrcy1 = VGPRField(48, 41) + +class SOP1_LIT(SOP1): + op = EnumBitField(15, 8, SOP1Op, {SOP1Op.S_MOV_B32, SOP1Op.S_MOV_B64, SOP1Op.S_CMOV_B32, SOP1Op.S_CMOV_B64, SOP1Op.S_BREV_B32, SOP1Op.S_BREV_B64, SOP1Op.S_CTZ_I32_B32, SOP1Op.S_CTZ_I32_B64, SOP1Op.S_CLZ_I32_U32, SOP1Op.S_CLZ_I32_U64, SOP1Op.S_CLS_I32, SOP1Op.S_CLS_I32_I64, SOP1Op.S_SEXT_I32_I8, SOP1Op.S_SEXT_I32_I16, SOP1Op.S_BITSET0_B32, SOP1Op.S_BITSET0_B64, SOP1Op.S_BITSET1_B32, SOP1Op.S_BITSET1_B64, SOP1Op.S_BITREPLICATE_B64_B32, SOP1Op.S_ABS_I32, SOP1Op.S_BCNT0_I32_B32, SOP1Op.S_BCNT0_I32_B64, SOP1Op.S_BCNT1_I32_B32, SOP1Op.S_BCNT1_I32_B64, SOP1Op.S_QUADMASK_B32, SOP1Op.S_QUADMASK_B64, SOP1Op.S_WQM_B32, SOP1Op.S_WQM_B64, SOP1Op.S_NOT_B32, SOP1Op.S_NOT_B64, SOP1Op.S_AND_SAVEEXEC_B32, SOP1Op.S_AND_SAVEEXEC_B64, SOP1Op.S_OR_SAVEEXEC_B32, SOP1Op.S_OR_SAVEEXEC_B64, SOP1Op.S_XOR_SAVEEXEC_B32, SOP1Op.S_XOR_SAVEEXEC_B64, SOP1Op.S_NAND_SAVEEXEC_B32, SOP1Op.S_NAND_SAVEEXEC_B64, SOP1Op.S_NOR_SAVEEXEC_B32, SOP1Op.S_NOR_SAVEEXEC_B64, SOP1Op.S_XNOR_SAVEEXEC_B32, SOP1Op.S_XNOR_SAVEEXEC_B64, SOP1Op.S_AND_NOT0_SAVEEXEC_B32, SOP1Op.S_AND_NOT0_SAVEEXEC_B64, SOP1Op.S_OR_NOT0_SAVEEXEC_B32, SOP1Op.S_OR_NOT0_SAVEEXEC_B64, SOP1Op.S_AND_NOT1_SAVEEXEC_B32, SOP1Op.S_AND_NOT1_SAVEEXEC_B64, SOP1Op.S_OR_NOT1_SAVEEXEC_B32, SOP1Op.S_OR_NOT1_SAVEEXEC_B64, SOP1Op.S_AND_NOT0_WREXEC_B32, SOP1Op.S_AND_NOT0_WREXEC_B64, SOP1Op.S_AND_NOT1_WREXEC_B32, SOP1Op.S_AND_NOT1_WREXEC_B64, SOP1Op.S_MOVRELS_B32, SOP1Op.S_MOVRELS_B64, SOP1Op.S_MOVRELD_B32, SOP1Op.S_MOVRELD_B64, SOP1Op.S_MOVRELSD_2_B32, SOP1Op.S_GETPC_B64, SOP1Op.S_SETPC_B64, SOP1Op.S_SWAPPC_B64, SOP1Op.S_RFE_B64, SOP1Op.S_SENDMSG_RTN_B32, SOP1Op.S_SENDMSG_RTN_B64, SOP1Op.S_CEIL_F32, SOP1Op.S_FLOOR_F32, SOP1Op.S_TRUNC_F32, SOP1Op.S_RNDNE_F32, SOP1Op.S_CVT_F32_I32, SOP1Op.S_CVT_F32_U32, SOP1Op.S_CVT_I32_F32, SOP1Op.S_CVT_U32_F32, SOP1Op.S_CVT_F16_F32, SOP1Op.S_CVT_F32_F16, SOP1Op.S_CVT_HI_F32_F16, SOP1Op.S_CEIL_F16, SOP1Op.S_FLOOR_F16, SOP1Op.S_TRUNC_F16, SOP1Op.S_RNDNE_F16}) + literal = BitField(63, 32) + +class SOP2_LIT(SOP2): + op = EnumBitField(29, 23, SOP2Op, {SOP2Op.S_ADD_U32, SOP2Op.S_SUB_U32, SOP2Op.S_ADD_I32, SOP2Op.S_SUB_I32, SOP2Op.S_ADDC_U32, SOP2Op.S_SUBB_U32, SOP2Op.S_ABSDIFF_I32, SOP2Op.S_LSHL_B32, SOP2Op.S_LSHL_B64, SOP2Op.S_LSHR_B32, SOP2Op.S_LSHR_B64, SOP2Op.S_ASHR_I32, SOP2Op.S_ASHR_I64, SOP2Op.S_LSHL1_ADD_U32, SOP2Op.S_LSHL2_ADD_U32, SOP2Op.S_LSHL3_ADD_U32, SOP2Op.S_LSHL4_ADD_U32, SOP2Op.S_MIN_I32, SOP2Op.S_MIN_U32, SOP2Op.S_MAX_I32, SOP2Op.S_MAX_U32, SOP2Op.S_AND_B32, SOP2Op.S_AND_B64, SOP2Op.S_OR_B32, SOP2Op.S_OR_B64, SOP2Op.S_XOR_B32, SOP2Op.S_XOR_B64, SOP2Op.S_NAND_B32, SOP2Op.S_NAND_B64, SOP2Op.S_NOR_B32, SOP2Op.S_NOR_B64, SOP2Op.S_XNOR_B32, SOP2Op.S_XNOR_B64, SOP2Op.S_AND_NOT1_B32, SOP2Op.S_AND_NOT1_B64, SOP2Op.S_OR_NOT1_B32, SOP2Op.S_OR_NOT1_B64, SOP2Op.S_BFE_U32, SOP2Op.S_BFE_I32, SOP2Op.S_BFE_U64, SOP2Op.S_BFE_I64, SOP2Op.S_BFM_B32, SOP2Op.S_BFM_B64, SOP2Op.S_MUL_I32, SOP2Op.S_MUL_HI_U32, SOP2Op.S_MUL_HI_I32, SOP2Op.S_CSELECT_B32, SOP2Op.S_CSELECT_B64, SOP2Op.S_PACK_LL_B32_B16, SOP2Op.S_PACK_LH_B32_B16, SOP2Op.S_PACK_HH_B32_B16, SOP2Op.S_PACK_HL_B32_B16, SOP2Op.S_ADD_F32, SOP2Op.S_SUB_F32, SOP2Op.S_MIN_F32, SOP2Op.S_MAX_F32, SOP2Op.S_MUL_F32, SOP2Op.S_FMAAK_F32, SOP2Op.S_FMAMK_F32, SOP2Op.S_FMAC_F32, SOP2Op.S_CVT_PK_RTZ_F16_F32, SOP2Op.S_ADD_F16, SOP2Op.S_SUB_F16, SOP2Op.S_MIN_F16, SOP2Op.S_MAX_F16, SOP2Op.S_MUL_F16, SOP2Op.S_FMAC_F16}) + literal = BitField(63, 32) + +class SOPC_LIT(SOPC): + op = EnumBitField(22, 16, SOPCOp, {SOPCOp.S_CMP_EQ_I32, SOPCOp.S_CMP_LG_I32, SOPCOp.S_CMP_GT_I32, SOPCOp.S_CMP_GE_I32, SOPCOp.S_CMP_LT_I32, SOPCOp.S_CMP_LE_I32, SOPCOp.S_CMP_EQ_U32, SOPCOp.S_CMP_LG_U32, SOPCOp.S_CMP_GT_U32, SOPCOp.S_CMP_GE_U32, SOPCOp.S_CMP_LT_U32, SOPCOp.S_CMP_LE_U32, SOPCOp.S_BITCMP0_B32, SOPCOp.S_BITCMP1_B32, SOPCOp.S_BITCMP0_B64, SOPCOp.S_BITCMP1_B64, SOPCOp.S_CMP_EQ_U64, SOPCOp.S_CMP_LG_U64, SOPCOp.S_CMP_LT_F32, SOPCOp.S_CMP_EQ_F32, SOPCOp.S_CMP_LE_F32, SOPCOp.S_CMP_GT_F32, SOPCOp.S_CMP_LG_F32, SOPCOp.S_CMP_GE_F32, SOPCOp.S_CMP_O_F32, SOPCOp.S_CMP_U_F32, SOPCOp.S_CMP_NGE_F32, SOPCOp.S_CMP_NLG_F32, SOPCOp.S_CMP_NGT_F32, SOPCOp.S_CMP_NLE_F32, SOPCOp.S_CMP_NEQ_F32, SOPCOp.S_CMP_NLT_F32, SOPCOp.S_CMP_LT_F16, SOPCOp.S_CMP_EQ_F16, SOPCOp.S_CMP_LE_F16, SOPCOp.S_CMP_GT_F16, SOPCOp.S_CMP_LG_F16, SOPCOp.S_CMP_GE_F16, SOPCOp.S_CMP_O_F16, SOPCOp.S_CMP_U_F16, SOPCOp.S_CMP_NGE_F16, SOPCOp.S_CMP_NLG_F16, SOPCOp.S_CMP_NGT_F16, SOPCOp.S_CMP_NLE_F16, SOPCOp.S_CMP_NEQ_F16, SOPCOp.S_CMP_NLT_F16}) + literal = BitField(63, 32) + +class SOPK_LIT(SOPK): + op = EnumBitField(27, 23, SOPKOp, {SOPKOp.S_MOVK_I32, SOPKOp.S_VERSION, SOPKOp.S_CMOVK_I32, SOPKOp.S_CMPK_EQ_I32, SOPKOp.S_CMPK_LG_I32, SOPKOp.S_CMPK_GT_I32, SOPKOp.S_CMPK_GE_I32, SOPKOp.S_CMPK_LT_I32, SOPKOp.S_CMPK_LE_I32, SOPKOp.S_CMPK_EQ_U32, SOPKOp.S_CMPK_LG_U32, SOPKOp.S_CMPK_GT_U32, SOPKOp.S_CMPK_GE_U32, SOPKOp.S_CMPK_LT_U32, SOPKOp.S_CMPK_LE_U32, SOPKOp.S_ADDK_I32, SOPKOp.S_MULK_I32, SOPKOp.S_GETREG_B32, SOPKOp.S_SETREG_B32, SOPKOp.S_SETREG_IMM32_B32, SOPKOp.S_CALL_B64, SOPKOp.S_SUBVECTOR_LOOP_BEGIN, SOPKOp.S_SUBVECTOR_LOOP_END, SOPKOp.S_WAITCNT_VSCNT, SOPKOp.S_WAITCNT_VMCNT, SOPKOp.S_WAITCNT_EXPCNT, SOPKOp.S_WAITCNT_LGKMCNT}) + literal = BitField(63, 32) + +class VOP1_DPP16(VOP1): + vsrc0 = VGPRField(39, 32) + dpp = BitField(48, 40) + fi = BitField(50, 50) + bc = BitField(51, 51) + row_mask = BitField(63, 60) + bank_mask = BitField(59, 56) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(54, 54) + src1_abs = BitField(55, 55) + +class VOP1_DPP8(VOP1): + vsrc0 = VGPRField(39, 32) + lane_sel_0 = BitField(42, 40) + lane_sel_1 = BitField(45, 43) + lane_sel_2 = BitField(48, 46) + lane_sel_3 = BitField(51, 49) + lane_sel_4 = BitField(54, 52) + lane_sel_5 = BitField(57, 55) + lane_sel_6 = BitField(60, 58) + lane_sel_7 = BitField(63, 61) + +class VOP1_LIT(VOP1): + op = EnumBitField(16, 9, VOP1Op, {VOP1Op.V_NOP, VOP1Op.V_MOV_B32, VOP1Op.V_READFIRSTLANE_B32, VOP1Op.V_CVT_I32_F64, VOP1Op.V_CVT_F64_I32, VOP1Op.V_CVT_F32_I32, VOP1Op.V_CVT_F32_U32, VOP1Op.V_CVT_U32_F32, VOP1Op.V_CVT_I32_F32, VOP1Op.V_CVT_F16_F32, VOP1Op.V_CVT_F32_F16, VOP1Op.V_CVT_NEAREST_I32_F32, VOP1Op.V_CVT_FLOOR_I32_F32, VOP1Op.V_CVT_OFF_F32_I4, VOP1Op.V_CVT_F32_F64, VOP1Op.V_CVT_F64_F32, VOP1Op.V_CVT_F32_UBYTE0, VOP1Op.V_CVT_F32_UBYTE1, VOP1Op.V_CVT_F32_UBYTE2, VOP1Op.V_CVT_F32_UBYTE3, VOP1Op.V_CVT_U32_F64, VOP1Op.V_CVT_F64_U32, VOP1Op.V_TRUNC_F64, VOP1Op.V_CEIL_F64, VOP1Op.V_RNDNE_F64, VOP1Op.V_FLOOR_F64, VOP1Op.V_PIPEFLUSH, VOP1Op.V_MOV_B16, VOP1Op.V_FRACT_F32, VOP1Op.V_TRUNC_F32, VOP1Op.V_CEIL_F32, VOP1Op.V_RNDNE_F32, VOP1Op.V_FLOOR_F32, VOP1Op.V_EXP_F32, VOP1Op.V_LOG_F32, VOP1Op.V_RCP_F32, VOP1Op.V_RCP_IFLAG_F32, VOP1Op.V_RSQ_F32, VOP1Op.V_RCP_F64, VOP1Op.V_RSQ_F64, VOP1Op.V_SQRT_F32, VOP1Op.V_SQRT_F64, VOP1Op.V_SIN_F32, VOP1Op.V_COS_F32, VOP1Op.V_NOT_B32, VOP1Op.V_BFREV_B32, VOP1Op.V_CLZ_I32_U32, VOP1Op.V_CTZ_I32_B32, VOP1Op.V_CLS_I32, VOP1Op.V_FREXP_EXP_I32_F64, VOP1Op.V_FREXP_MANT_F64, VOP1Op.V_FRACT_F64, VOP1Op.V_FREXP_EXP_I32_F32, VOP1Op.V_FREXP_MANT_F32, VOP1Op.V_MOVRELD_B32, VOP1Op.V_MOVRELS_B32, VOP1Op.V_MOVRELSD_B32, VOP1Op.V_MOVRELSD_2_B32, VOP1Op.V_CVT_F16_U16, VOP1Op.V_CVT_F16_I16, VOP1Op.V_CVT_U16_F16, VOP1Op.V_CVT_I16_F16, VOP1Op.V_RCP_F16, VOP1Op.V_SQRT_F16, VOP1Op.V_RSQ_F16, VOP1Op.V_LOG_F16, VOP1Op.V_EXP_F16, VOP1Op.V_FREXP_MANT_F16, VOP1Op.V_FREXP_EXP_I16_F16, VOP1Op.V_FLOOR_F16, VOP1Op.V_CEIL_F16, VOP1Op.V_TRUNC_F16, VOP1Op.V_RNDNE_F16, VOP1Op.V_FRACT_F16, VOP1Op.V_SIN_F16, VOP1Op.V_COS_F16, VOP1Op.V_SAT_PK_U8_I16, VOP1Op.V_CVT_NORM_I16_F16, VOP1Op.V_CVT_NORM_U16_F16, VOP1Op.V_SWAP_B32, VOP1Op.V_SWAP_B16, VOP1Op.V_PERMLANE64_B32, VOP1Op.V_SWAPREL_B32, VOP1Op.V_NOT_B16, VOP1Op.V_CVT_I32_I16, VOP1Op.V_CVT_U32_U16}) + literal = BitField(63, 32) + +class VOP2_DPP16(VOP2): + vsrc0 = VGPRField(39, 32) + dpp = BitField(48, 40) + fi = BitField(50, 50) + bc = BitField(51, 51) + row_mask = BitField(63, 60) + bank_mask = BitField(59, 56) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(54, 54) + src1_abs = BitField(55, 55) + +class VOP2_DPP8(VOP2): + vsrc0 = VGPRField(39, 32) + lane_sel_0 = BitField(42, 40) + lane_sel_1 = BitField(45, 43) + lane_sel_2 = BitField(48, 46) + lane_sel_3 = BitField(51, 49) + lane_sel_4 = BitField(54, 52) + lane_sel_5 = BitField(57, 55) + lane_sel_6 = BitField(60, 58) + lane_sel_7 = BitField(63, 61) + +class VOP2_LIT(VOP2): + op = EnumBitField(30, 25, VOP2Op, {VOP2Op.V_CNDMASK_B32, VOP2Op.V_DOT2ACC_F32_F16, VOP2Op.V_ADD_F32, VOP2Op.V_SUB_F32, VOP2Op.V_SUBREV_F32, VOP2Op.V_FMAC_DX9_ZERO_F32, VOP2Op.V_MUL_DX9_ZERO_F32, VOP2Op.V_MUL_F32, VOP2Op.V_MUL_I32_I24, VOP2Op.V_MUL_HI_I32_I24, VOP2Op.V_MUL_U32_U24, VOP2Op.V_MUL_HI_U32_U24, VOP2Op.V_MIN_F32, VOP2Op.V_MAX_F32, VOP2Op.V_MIN_I32, VOP2Op.V_MAX_I32, VOP2Op.V_MIN_U32, VOP2Op.V_MAX_U32, VOP2Op.V_LSHLREV_B32, VOP2Op.V_LSHRREV_B32, VOP2Op.V_ASHRREV_I32, VOP2Op.V_AND_B32, VOP2Op.V_OR_B32, VOP2Op.V_XOR_B32, VOP2Op.V_XNOR_B32, VOP2Op.V_ADD_CO_CI_U32, VOP2Op.V_SUB_CO_CI_U32, VOP2Op.V_SUBREV_CO_CI_U32, VOP2Op.V_ADD_NC_U32, VOP2Op.V_SUB_NC_U32, VOP2Op.V_SUBREV_NC_U32, VOP2Op.V_FMAC_F32, VOP2Op.V_FMAMK_F32, VOP2Op.V_FMAAK_F32, VOP2Op.V_CVT_PK_RTZ_F16_F32, VOP2Op.V_ADD_F16, VOP2Op.V_SUB_F16, VOP2Op.V_SUBREV_F16, VOP2Op.V_MUL_F16, VOP2Op.V_FMAC_F16, VOP2Op.V_FMAMK_F16, VOP2Op.V_FMAAK_F16, VOP2Op.V_MAX_F16, VOP2Op.V_MIN_F16, VOP2Op.V_LDEXP_F16, VOP2Op.V_PK_FMAC_F16}) + literal = BitField(63, 32) + +class VOP3P_DPP16(VOP3P): + vsrc0 = VGPRField(71, 64) + dpp = BitField(80, 72) + fi = BitField(82, 82) + bc = BitField(83, 83) + row_mask = BitField(95, 92) + bank_mask = BitField(91, 88) + src0_neg = BitField(84, 84) + src0_abs = BitField(85, 85) + src1_neg = BitField(86, 86) + src1_abs = BitField(87, 87) + +class VOP3P_DPP8(VOP3P): + vsrc0 = VGPRField(71, 64) + lane_sel_0 = BitField(74, 72) + lane_sel_1 = BitField(77, 75) + lane_sel_2 = BitField(80, 78) + lane_sel_3 = BitField(83, 81) + lane_sel_4 = BitField(86, 84) + lane_sel_5 = BitField(89, 87) + lane_sel_6 = BitField(92, 90) + lane_sel_7 = BitField(95, 93) + +class VOP3P_LIT(VOP3P): + op = EnumBitField(22, 16, VOP3POp, {VOP3POp.V_PK_MAD_I16, VOP3POp.V_PK_MUL_LO_U16, VOP3POp.V_PK_ADD_I16, VOP3POp.V_PK_SUB_I16, VOP3POp.V_PK_LSHLREV_B16, VOP3POp.V_PK_LSHRREV_B16, VOP3POp.V_PK_ASHRREV_I16, VOP3POp.V_PK_MAX_I16, VOP3POp.V_PK_MIN_I16, VOP3POp.V_PK_MAD_U16, VOP3POp.V_PK_ADD_U16, VOP3POp.V_PK_SUB_U16, VOP3POp.V_PK_MAX_U16, VOP3POp.V_PK_MIN_U16, VOP3POp.V_PK_FMA_F16, VOP3POp.V_PK_ADD_F16, VOP3POp.V_PK_MUL_F16, VOP3POp.V_PK_MIN_F16, VOP3POp.V_PK_MAX_F16, VOP3POp.V_DOT2_F32_F16, VOP3POp.V_DOT4_I32_IU8, VOP3POp.V_DOT4_U32_U8, VOP3POp.V_DOT8_I32_IU4, VOP3POp.V_DOT8_U32_U4, VOP3POp.V_DOT2_F32_BF16, VOP3POp.V_FMA_MIX_F32, VOP3POp.V_FMA_MIXLO_F16, VOP3POp.V_FMA_MIXHI_F16, VOP3POp.V_WMMA_F32_16X16X16_F16, VOP3POp.V_WMMA_F32_16X16X16_BF16, VOP3POp.V_WMMA_F16_16X16X16_F16, VOP3POp.V_WMMA_BF16_16X16X16_BF16, VOP3POp.V_WMMA_I32_16X16X16_IU8, VOP3POp.V_WMMA_I32_16X16X16_IU4}) + literal = BitField(95, 64) + +class VOP3SD_DPP16(VOP3SD): + vsrc0 = VGPRField(71, 64) + dpp = BitField(80, 72) + fi = BitField(82, 82) + bc = BitField(83, 83) + row_mask = BitField(95, 92) + bank_mask = BitField(91, 88) + src0_neg = BitField(84, 84) + src0_abs = BitField(85, 85) + src1_neg = BitField(86, 86) + src1_abs = BitField(87, 87) + +class VOP3SD_DPP8(VOP3SD): + vsrc0 = VGPRField(71, 64) + lane_sel_0 = BitField(74, 72) + lane_sel_1 = BitField(77, 75) + lane_sel_2 = BitField(80, 78) + lane_sel_3 = BitField(83, 81) + lane_sel_4 = BitField(86, 84) + lane_sel_5 = BitField(89, 87) + lane_sel_6 = BitField(92, 90) + lane_sel_7 = BitField(95, 93) + +class VOP3SD_LIT(VOP3SD): + op = EnumBitField(25, 16, VOP3SDOp, {VOP3SDOp.V_ADD_CO_CI_U32, VOP3SDOp.V_SUB_CO_CI_U32, VOP3SDOp.V_SUBREV_CO_CI_U32, VOP3SDOp.V_DIV_SCALE_F32, VOP3SDOp.V_DIV_SCALE_F64, VOP3SDOp.V_MAD_U64_U32, VOP3SDOp.V_MAD_I64_I32, VOP3SDOp.V_ADD_CO_U32, VOP3SDOp.V_SUB_CO_U32, VOP3SDOp.V_SUBREV_CO_U32}) + literal = BitField(95, 64) + +class VOP3_DPP16(VOP3): + vsrc0 = VGPRField(71, 64) + dpp = BitField(80, 72) + fi = BitField(82, 82) + bc = BitField(83, 83) + row_mask = BitField(95, 92) + bank_mask = BitField(91, 88) + src0_neg = BitField(84, 84) + src0_abs = BitField(85, 85) + src1_neg = BitField(86, 86) + src1_abs = BitField(87, 87) + +class VOP3_DPP8(VOP3): + vsrc0 = VGPRField(71, 64) + lane_sel_0 = BitField(74, 72) + lane_sel_1 = BitField(77, 75) + lane_sel_2 = BitField(80, 78) + lane_sel_3 = BitField(83, 81) + lane_sel_4 = BitField(86, 84) + lane_sel_5 = BitField(89, 87) + lane_sel_6 = BitField(92, 90) + lane_sel_7 = BitField(95, 93) + +class VOP3_LIT(VOP3): + op = EnumBitField(25, 16, VOP3Op, {VOP3Op.V_CMP_F_F16, VOP3Op.V_CMP_LT_F16, VOP3Op.V_CMP_EQ_F16, VOP3Op.V_CMP_LE_F16, VOP3Op.V_CMP_GT_F16, VOP3Op.V_CMP_LG_F16, VOP3Op.V_CMP_GE_F16, VOP3Op.V_CMP_O_F16, VOP3Op.V_CMP_U_F16, VOP3Op.V_CMP_NGE_F16, VOP3Op.V_CMP_NLG_F16, VOP3Op.V_CMP_NGT_F16, VOP3Op.V_CMP_NLE_F16, VOP3Op.V_CMP_NEQ_F16, VOP3Op.V_CMP_NLT_F16, VOP3Op.V_CMP_T_F16, VOP3Op.V_CMP_F_F32, VOP3Op.V_CMP_LT_F32, VOP3Op.V_CMP_EQ_F32, VOP3Op.V_CMP_LE_F32, VOP3Op.V_CMP_GT_F32, VOP3Op.V_CMP_LG_F32, VOP3Op.V_CMP_GE_F32, VOP3Op.V_CMP_O_F32, VOP3Op.V_CMP_U_F32, VOP3Op.V_CMP_NGE_F32, VOP3Op.V_CMP_NLG_F32, VOP3Op.V_CMP_NGT_F32, VOP3Op.V_CMP_NLE_F32, VOP3Op.V_CMP_NEQ_F32, VOP3Op.V_CMP_NLT_F32, VOP3Op.V_CMP_T_F32, VOP3Op.V_CMP_F_F64, VOP3Op.V_CMP_LT_F64, VOP3Op.V_CMP_EQ_F64, VOP3Op.V_CMP_LE_F64, VOP3Op.V_CMP_GT_F64, VOP3Op.V_CMP_LG_F64, VOP3Op.V_CMP_GE_F64, VOP3Op.V_CMP_O_F64, VOP3Op.V_CMP_U_F64, VOP3Op.V_CMP_NGE_F64, VOP3Op.V_CMP_NLG_F64, VOP3Op.V_CMP_NGT_F64, VOP3Op.V_CMP_NLE_F64, VOP3Op.V_CMP_NEQ_F64, VOP3Op.V_CMP_NLT_F64, VOP3Op.V_CMP_T_F64, VOP3Op.V_CMP_LT_I16, VOP3Op.V_CMP_EQ_I16, VOP3Op.V_CMP_LE_I16, VOP3Op.V_CMP_GT_I16, VOP3Op.V_CMP_NE_I16, VOP3Op.V_CMP_GE_I16, VOP3Op.V_CMP_LT_U16, VOP3Op.V_CMP_EQ_U16, VOP3Op.V_CMP_LE_U16, VOP3Op.V_CMP_GT_U16, VOP3Op.V_CMP_NE_U16, VOP3Op.V_CMP_GE_U16, VOP3Op.V_CMP_F_I32, VOP3Op.V_CMP_LT_I32, VOP3Op.V_CMP_EQ_I32, VOP3Op.V_CMP_LE_I32, VOP3Op.V_CMP_GT_I32, VOP3Op.V_CMP_NE_I32, VOP3Op.V_CMP_GE_I32, VOP3Op.V_CMP_T_I32, VOP3Op.V_CMP_F_U32, VOP3Op.V_CMP_LT_U32, VOP3Op.V_CMP_EQ_U32, VOP3Op.V_CMP_LE_U32, VOP3Op.V_CMP_GT_U32, VOP3Op.V_CMP_NE_U32, VOP3Op.V_CMP_GE_U32, VOP3Op.V_CMP_T_U32, VOP3Op.V_CMP_F_I64, VOP3Op.V_CMP_LT_I64, VOP3Op.V_CMP_EQ_I64, VOP3Op.V_CMP_LE_I64, VOP3Op.V_CMP_GT_I64, VOP3Op.V_CMP_NE_I64, VOP3Op.V_CMP_GE_I64, VOP3Op.V_CMP_T_I64, VOP3Op.V_CMP_F_U64, VOP3Op.V_CMP_LT_U64, VOP3Op.V_CMP_EQ_U64, VOP3Op.V_CMP_LE_U64, VOP3Op.V_CMP_GT_U64, VOP3Op.V_CMP_NE_U64, VOP3Op.V_CMP_GE_U64, VOP3Op.V_CMP_T_U64, VOP3Op.V_CMP_CLASS_F16, VOP3Op.V_CMP_CLASS_F32, VOP3Op.V_CMP_CLASS_F64, VOP3Op.V_CMPX_F_F16, VOP3Op.V_CMPX_LT_F16, VOP3Op.V_CMPX_EQ_F16, VOP3Op.V_CMPX_LE_F16, VOP3Op.V_CMPX_GT_F16, VOP3Op.V_CMPX_LG_F16, VOP3Op.V_CMPX_GE_F16, VOP3Op.V_CMPX_O_F16, VOP3Op.V_CMPX_U_F16, VOP3Op.V_CMPX_NGE_F16, VOP3Op.V_CMPX_NLG_F16, VOP3Op.V_CMPX_NGT_F16, VOP3Op.V_CMPX_NLE_F16, VOP3Op.V_CMPX_NEQ_F16, VOP3Op.V_CMPX_NLT_F16, VOP3Op.V_CMPX_T_F16, VOP3Op.V_CMPX_F_F32, VOP3Op.V_CMPX_LT_F32, VOP3Op.V_CMPX_EQ_F32, VOP3Op.V_CMPX_LE_F32, VOP3Op.V_CMPX_GT_F32, VOP3Op.V_CMPX_LG_F32, VOP3Op.V_CMPX_GE_F32, VOP3Op.V_CMPX_O_F32, VOP3Op.V_CMPX_U_F32, VOP3Op.V_CMPX_NGE_F32, VOP3Op.V_CMPX_NLG_F32, VOP3Op.V_CMPX_NGT_F32, VOP3Op.V_CMPX_NLE_F32, VOP3Op.V_CMPX_NEQ_F32, VOP3Op.V_CMPX_NLT_F32, VOP3Op.V_CMPX_T_F32, VOP3Op.V_CMPX_F_F64, VOP3Op.V_CMPX_LT_F64, VOP3Op.V_CMPX_EQ_F64, VOP3Op.V_CMPX_LE_F64, VOP3Op.V_CMPX_GT_F64, VOP3Op.V_CMPX_LG_F64, VOP3Op.V_CMPX_GE_F64, VOP3Op.V_CMPX_O_F64, VOP3Op.V_CMPX_U_F64, VOP3Op.V_CMPX_NGE_F64, VOP3Op.V_CMPX_NLG_F64, VOP3Op.V_CMPX_NGT_F64, VOP3Op.V_CMPX_NLE_F64, VOP3Op.V_CMPX_NEQ_F64, VOP3Op.V_CMPX_NLT_F64, VOP3Op.V_CMPX_T_F64, VOP3Op.V_CMPX_LT_I16, VOP3Op.V_CMPX_EQ_I16, VOP3Op.V_CMPX_LE_I16, VOP3Op.V_CMPX_GT_I16, VOP3Op.V_CMPX_NE_I16, VOP3Op.V_CMPX_GE_I16, VOP3Op.V_CMPX_LT_U16, VOP3Op.V_CMPX_EQ_U16, VOP3Op.V_CMPX_LE_U16, VOP3Op.V_CMPX_GT_U16, VOP3Op.V_CMPX_NE_U16, VOP3Op.V_CMPX_GE_U16, VOP3Op.V_CMPX_F_I32, VOP3Op.V_CMPX_LT_I32, VOP3Op.V_CMPX_EQ_I32, VOP3Op.V_CMPX_LE_I32, VOP3Op.V_CMPX_GT_I32, VOP3Op.V_CMPX_NE_I32, VOP3Op.V_CMPX_GE_I32, VOP3Op.V_CMPX_T_I32, VOP3Op.V_CMPX_F_U32, VOP3Op.V_CMPX_LT_U32, VOP3Op.V_CMPX_EQ_U32, VOP3Op.V_CMPX_LE_U32, VOP3Op.V_CMPX_GT_U32, VOP3Op.V_CMPX_NE_U32, VOP3Op.V_CMPX_GE_U32, VOP3Op.V_CMPX_T_U32, VOP3Op.V_CMPX_F_I64, VOP3Op.V_CMPX_LT_I64, VOP3Op.V_CMPX_EQ_I64, VOP3Op.V_CMPX_LE_I64, VOP3Op.V_CMPX_GT_I64, VOP3Op.V_CMPX_NE_I64, VOP3Op.V_CMPX_GE_I64, VOP3Op.V_CMPX_T_I64, VOP3Op.V_CMPX_F_U64, VOP3Op.V_CMPX_LT_U64, VOP3Op.V_CMPX_EQ_U64, VOP3Op.V_CMPX_LE_U64, VOP3Op.V_CMPX_GT_U64, VOP3Op.V_CMPX_NE_U64, VOP3Op.V_CMPX_GE_U64, VOP3Op.V_CMPX_T_U64, VOP3Op.V_CMPX_CLASS_F16, VOP3Op.V_CMPX_CLASS_F32, VOP3Op.V_CMPX_CLASS_F64, VOP3Op.V_CNDMASK_B32, VOP3Op.V_ADD_F32, VOP3Op.V_SUB_F32, VOP3Op.V_SUBREV_F32, VOP3Op.V_FMAC_DX9_ZERO_F32, VOP3Op.V_MUL_DX9_ZERO_F32, VOP3Op.V_MUL_F32, VOP3Op.V_MUL_I32_I24, VOP3Op.V_MUL_HI_I32_I24, VOP3Op.V_MUL_U32_U24, VOP3Op.V_MUL_HI_U32_U24, VOP3Op.V_MIN_F32, VOP3Op.V_MAX_F32, VOP3Op.V_MIN_I32, VOP3Op.V_MAX_I32, VOP3Op.V_MIN_U32, VOP3Op.V_MAX_U32, VOP3Op.V_LSHLREV_B32, VOP3Op.V_LSHRREV_B32, VOP3Op.V_ASHRREV_I32, VOP3Op.V_AND_B32, VOP3Op.V_OR_B32, VOP3Op.V_XOR_B32, VOP3Op.V_XNOR_B32, VOP3Op.V_ADD_NC_U32, VOP3Op.V_SUB_NC_U32, VOP3Op.V_SUBREV_NC_U32, VOP3Op.V_FMAC_F32, VOP3Op.V_CVT_PK_RTZ_F16_F32, VOP3Op.V_ADD_F16, VOP3Op.V_SUB_F16, VOP3Op.V_SUBREV_F16, VOP3Op.V_MUL_F16, VOP3Op.V_FMAC_F16, VOP3Op.V_MAX_F16, VOP3Op.V_MIN_F16, VOP3Op.V_LDEXP_F16, VOP3Op.V_NOP, VOP3Op.V_MOV_B32, VOP3Op.V_READFIRSTLANE_B32, VOP3Op.V_CVT_I32_F64, VOP3Op.V_CVT_F64_I32, VOP3Op.V_CVT_F32_I32, VOP3Op.V_CVT_F32_U32, VOP3Op.V_CVT_U32_F32, VOP3Op.V_CVT_I32_F32, VOP3Op.V_CVT_F16_F32, VOP3Op.V_CVT_F32_F16, VOP3Op.V_CVT_NEAREST_I32_F32, VOP3Op.V_CVT_FLOOR_I32_F32, VOP3Op.V_CVT_OFF_F32_I4, VOP3Op.V_CVT_F32_F64, VOP3Op.V_CVT_F64_F32, VOP3Op.V_CVT_F32_UBYTE0, VOP3Op.V_CVT_F32_UBYTE1, VOP3Op.V_CVT_F32_UBYTE2, VOP3Op.V_CVT_F32_UBYTE3, VOP3Op.V_CVT_U32_F64, VOP3Op.V_CVT_F64_U32, VOP3Op.V_TRUNC_F64, VOP3Op.V_CEIL_F64, VOP3Op.V_RNDNE_F64, VOP3Op.V_FLOOR_F64, VOP3Op.V_PIPEFLUSH, VOP3Op.V_MOV_B16, VOP3Op.V_FRACT_F32, VOP3Op.V_TRUNC_F32, VOP3Op.V_CEIL_F32, VOP3Op.V_RNDNE_F32, VOP3Op.V_FLOOR_F32, VOP3Op.V_EXP_F32, VOP3Op.V_LOG_F32, VOP3Op.V_RCP_F32, VOP3Op.V_RCP_IFLAG_F32, VOP3Op.V_RSQ_F32, VOP3Op.V_RCP_F64, VOP3Op.V_RSQ_F64, VOP3Op.V_SQRT_F32, VOP3Op.V_SQRT_F64, VOP3Op.V_SIN_F32, VOP3Op.V_COS_F32, VOP3Op.V_NOT_B32, VOP3Op.V_BFREV_B32, VOP3Op.V_CLZ_I32_U32, VOP3Op.V_CTZ_I32_B32, VOP3Op.V_CLS_I32, VOP3Op.V_FREXP_EXP_I32_F64, VOP3Op.V_FREXP_MANT_F64, VOP3Op.V_FRACT_F64, VOP3Op.V_FREXP_EXP_I32_F32, VOP3Op.V_FREXP_MANT_F32, VOP3Op.V_MOVRELD_B32, VOP3Op.V_MOVRELS_B32, VOP3Op.V_MOVRELSD_B32, VOP3Op.V_MOVRELSD_2_B32, VOP3Op.V_CVT_F16_U16, VOP3Op.V_CVT_F16_I16, VOP3Op.V_CVT_U16_F16, VOP3Op.V_CVT_I16_F16, VOP3Op.V_RCP_F16, VOP3Op.V_SQRT_F16, VOP3Op.V_RSQ_F16, VOP3Op.V_LOG_F16, VOP3Op.V_EXP_F16, VOP3Op.V_FREXP_MANT_F16, VOP3Op.V_FREXP_EXP_I16_F16, VOP3Op.V_FLOOR_F16, VOP3Op.V_CEIL_F16, VOP3Op.V_TRUNC_F16, VOP3Op.V_RNDNE_F16, VOP3Op.V_FRACT_F16, VOP3Op.V_SIN_F16, VOP3Op.V_COS_F16, VOP3Op.V_SAT_PK_U8_I16, VOP3Op.V_CVT_NORM_I16_F16, VOP3Op.V_CVT_NORM_U16_F16, VOP3Op.V_NOT_B16, VOP3Op.V_CVT_I32_I16, VOP3Op.V_CVT_U32_U16, VOP3Op.V_FMA_DX9_ZERO_F32, VOP3Op.V_MAD_I32_I24, VOP3Op.V_MAD_U32_U24, VOP3Op.V_CUBEID_F32, VOP3Op.V_CUBESC_F32, VOP3Op.V_CUBETC_F32, VOP3Op.V_CUBEMA_F32, VOP3Op.V_BFE_U32, VOP3Op.V_BFE_I32, VOP3Op.V_BFI_B32, VOP3Op.V_FMA_F32, VOP3Op.V_FMA_F64, VOP3Op.V_LERP_U8, VOP3Op.V_ALIGNBIT_B32, VOP3Op.V_ALIGNBYTE_B32, VOP3Op.V_MULLIT_F32, VOP3Op.V_MIN3_F32, VOP3Op.V_MIN3_I32, VOP3Op.V_MIN3_U32, VOP3Op.V_MAX3_F32, VOP3Op.V_MAX3_I32, VOP3Op.V_MAX3_U32, VOP3Op.V_MED3_F32, VOP3Op.V_MED3_I32, VOP3Op.V_MED3_U32, VOP3Op.V_SAD_U8, VOP3Op.V_SAD_HI_U8, VOP3Op.V_SAD_U16, VOP3Op.V_SAD_U32, VOP3Op.V_CVT_PK_U8_F32, VOP3Op.V_DIV_FIXUP_F32, VOP3Op.V_DIV_FIXUP_F64, VOP3Op.V_DIV_FMAS_F32, VOP3Op.V_DIV_FMAS_F64, VOP3Op.V_MSAD_U8, VOP3Op.V_QSAD_PK_U16_U8, VOP3Op.V_MQSAD_PK_U16_U8, VOP3Op.V_MQSAD_U32_U8, VOP3Op.V_XOR3_B32, VOP3Op.V_MAD_U16, VOP3Op.V_PERM_B32, VOP3Op.V_XAD_U32, VOP3Op.V_LSHL_ADD_U32, VOP3Op.V_ADD_LSHL_U32, VOP3Op.V_FMA_F16, VOP3Op.V_MIN3_F16, VOP3Op.V_MIN3_I16, VOP3Op.V_MIN3_U16, VOP3Op.V_MAX3_F16, VOP3Op.V_MAX3_I16, VOP3Op.V_MAX3_U16, VOP3Op.V_MED3_F16, VOP3Op.V_MED3_I16, VOP3Op.V_MED3_U16, VOP3Op.V_MAD_I16, VOP3Op.V_DIV_FIXUP_F16, VOP3Op.V_ADD3_U32, VOP3Op.V_LSHL_OR_B32, VOP3Op.V_AND_OR_B32, VOP3Op.V_OR3_B32, VOP3Op.V_MAD_U32_U16, VOP3Op.V_MAD_I32_I16, VOP3Op.V_PERMLANE16_B32, VOP3Op.V_PERMLANEX16_B32, VOP3Op.V_CNDMASK_B16, VOP3Op.V_MAXMIN_F32, VOP3Op.V_MINMAX_F32, VOP3Op.V_MAXMIN_F16, VOP3Op.V_MINMAX_F16, VOP3Op.V_MAXMIN_U32, VOP3Op.V_MINMAX_U32, VOP3Op.V_MAXMIN_I32, VOP3Op.V_MINMAX_I32, VOP3Op.V_DOT2_F16_F16, VOP3Op.V_DOT2_BF16_BF16, VOP3Op.V_ADD_NC_U16, VOP3Op.V_SUB_NC_U16, VOP3Op.V_MUL_LO_U16, VOP3Op.V_CVT_PK_I16_F32, VOP3Op.V_CVT_PK_U16_F32, VOP3Op.V_MAX_U16, VOP3Op.V_MAX_I16, VOP3Op.V_MIN_U16, VOP3Op.V_MIN_I16, VOP3Op.V_ADD_NC_I16, VOP3Op.V_SUB_NC_I16, VOP3Op.V_PACK_B32_F16, VOP3Op.V_CVT_PK_NORM_I16_F16, VOP3Op.V_CVT_PK_NORM_U16_F16, VOP3Op.V_LDEXP_F32, VOP3Op.V_BFM_B32, VOP3Op.V_BCNT_U32_B32, VOP3Op.V_MBCNT_LO_U32_B32, VOP3Op.V_MBCNT_HI_U32_B32, VOP3Op.V_CVT_PK_NORM_I16_F32, VOP3Op.V_CVT_PK_NORM_U16_F32, VOP3Op.V_CVT_PK_U16_U32, VOP3Op.V_CVT_PK_I16_I32, VOP3Op.V_SUB_NC_I32, VOP3Op.V_ADD_NC_I32, VOP3Op.V_ADD_F64, VOP3Op.V_MUL_F64, VOP3Op.V_MIN_F64, VOP3Op.V_MAX_F64, VOP3Op.V_LDEXP_F64, VOP3Op.V_MUL_LO_U32, VOP3Op.V_MUL_HI_U32, VOP3Op.V_MUL_HI_I32, VOP3Op.V_TRIG_PREOP_F64, VOP3Op.V_LSHLREV_B16, VOP3Op.V_LSHRREV_B16, VOP3Op.V_ASHRREV_I16, VOP3Op.V_LSHLREV_B64, VOP3Op.V_LSHRREV_B64, VOP3Op.V_ASHRREV_I64, VOP3Op.V_READLANE_B32, VOP3Op.V_WRITELANE_B32, VOP3Op.V_AND_B16, VOP3Op.V_OR_B16, VOP3Op.V_XOR_B16}) + literal = BitField(95, 64) + +class VOPC_DPP16(VOPC): + vsrc0 = VGPRField(39, 32) + dpp = BitField(48, 40) + fi = BitField(50, 50) + bc = BitField(51, 51) + row_mask = BitField(63, 60) + bank_mask = BitField(59, 56) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(54, 54) + src1_abs = BitField(55, 55) + +class VOPC_DPP8(VOPC): + vsrc0 = VGPRField(39, 32) + lane_sel_0 = BitField(42, 40) + lane_sel_1 = BitField(45, 43) + lane_sel_2 = BitField(48, 46) + lane_sel_3 = BitField(51, 49) + lane_sel_4 = BitField(54, 52) + lane_sel_5 = BitField(57, 55) + lane_sel_6 = BitField(60, 58) + lane_sel_7 = BitField(63, 61) + +class VOPC_LIT(VOPC): + op = EnumBitField(24, 17, VOPCOp, {VOPCOp.V_CMP_F_F16, VOPCOp.V_CMP_LT_F16, VOPCOp.V_CMP_EQ_F16, VOPCOp.V_CMP_LE_F16, VOPCOp.V_CMP_GT_F16, VOPCOp.V_CMP_LG_F16, VOPCOp.V_CMP_GE_F16, VOPCOp.V_CMP_O_F16, VOPCOp.V_CMP_U_F16, VOPCOp.V_CMP_NGE_F16, VOPCOp.V_CMP_NLG_F16, VOPCOp.V_CMP_NGT_F16, VOPCOp.V_CMP_NLE_F16, VOPCOp.V_CMP_NEQ_F16, VOPCOp.V_CMP_NLT_F16, VOPCOp.V_CMP_T_F16, VOPCOp.V_CMP_F_F32, VOPCOp.V_CMP_LT_F32, VOPCOp.V_CMP_EQ_F32, VOPCOp.V_CMP_LE_F32, VOPCOp.V_CMP_GT_F32, VOPCOp.V_CMP_LG_F32, VOPCOp.V_CMP_GE_F32, VOPCOp.V_CMP_O_F32, VOPCOp.V_CMP_U_F32, VOPCOp.V_CMP_NGE_F32, VOPCOp.V_CMP_NLG_F32, VOPCOp.V_CMP_NGT_F32, VOPCOp.V_CMP_NLE_F32, VOPCOp.V_CMP_NEQ_F32, VOPCOp.V_CMP_NLT_F32, VOPCOp.V_CMP_T_F32, VOPCOp.V_CMP_F_F64, VOPCOp.V_CMP_LT_F64, VOPCOp.V_CMP_EQ_F64, VOPCOp.V_CMP_LE_F64, VOPCOp.V_CMP_GT_F64, VOPCOp.V_CMP_LG_F64, VOPCOp.V_CMP_GE_F64, VOPCOp.V_CMP_O_F64, VOPCOp.V_CMP_U_F64, VOPCOp.V_CMP_NGE_F64, VOPCOp.V_CMP_NLG_F64, VOPCOp.V_CMP_NGT_F64, VOPCOp.V_CMP_NLE_F64, VOPCOp.V_CMP_NEQ_F64, VOPCOp.V_CMP_NLT_F64, VOPCOp.V_CMP_T_F64, VOPCOp.V_CMP_LT_I16, VOPCOp.V_CMP_EQ_I16, VOPCOp.V_CMP_LE_I16, VOPCOp.V_CMP_GT_I16, VOPCOp.V_CMP_NE_I16, VOPCOp.V_CMP_GE_I16, VOPCOp.V_CMP_LT_U16, VOPCOp.V_CMP_EQ_U16, VOPCOp.V_CMP_LE_U16, VOPCOp.V_CMP_GT_U16, VOPCOp.V_CMP_NE_U16, VOPCOp.V_CMP_GE_U16, VOPCOp.V_CMP_F_I32, VOPCOp.V_CMP_LT_I32, VOPCOp.V_CMP_EQ_I32, VOPCOp.V_CMP_LE_I32, VOPCOp.V_CMP_GT_I32, VOPCOp.V_CMP_NE_I32, VOPCOp.V_CMP_GE_I32, VOPCOp.V_CMP_T_I32, VOPCOp.V_CMP_F_U32, VOPCOp.V_CMP_LT_U32, VOPCOp.V_CMP_EQ_U32, VOPCOp.V_CMP_LE_U32, VOPCOp.V_CMP_GT_U32, VOPCOp.V_CMP_NE_U32, VOPCOp.V_CMP_GE_U32, VOPCOp.V_CMP_T_U32, VOPCOp.V_CMP_F_I64, VOPCOp.V_CMP_LT_I64, VOPCOp.V_CMP_EQ_I64, VOPCOp.V_CMP_LE_I64, VOPCOp.V_CMP_GT_I64, VOPCOp.V_CMP_NE_I64, VOPCOp.V_CMP_GE_I64, VOPCOp.V_CMP_T_I64, VOPCOp.V_CMP_F_U64, VOPCOp.V_CMP_LT_U64, VOPCOp.V_CMP_EQ_U64, VOPCOp.V_CMP_LE_U64, VOPCOp.V_CMP_GT_U64, VOPCOp.V_CMP_NE_U64, VOPCOp.V_CMP_GE_U64, VOPCOp.V_CMP_T_U64, VOPCOp.V_CMP_CLASS_F16, VOPCOp.V_CMP_CLASS_F32, VOPCOp.V_CMP_CLASS_F64, VOPCOp.V_CMPX_F_F16, VOPCOp.V_CMPX_LT_F16, VOPCOp.V_CMPX_EQ_F16, VOPCOp.V_CMPX_LE_F16, VOPCOp.V_CMPX_GT_F16, VOPCOp.V_CMPX_LG_F16, VOPCOp.V_CMPX_GE_F16, VOPCOp.V_CMPX_O_F16, VOPCOp.V_CMPX_U_F16, VOPCOp.V_CMPX_NGE_F16, VOPCOp.V_CMPX_NLG_F16, VOPCOp.V_CMPX_NGT_F16, VOPCOp.V_CMPX_NLE_F16, VOPCOp.V_CMPX_NEQ_F16, VOPCOp.V_CMPX_NLT_F16, VOPCOp.V_CMPX_T_F16, VOPCOp.V_CMPX_F_F32, VOPCOp.V_CMPX_LT_F32, VOPCOp.V_CMPX_EQ_F32, VOPCOp.V_CMPX_LE_F32, VOPCOp.V_CMPX_GT_F32, VOPCOp.V_CMPX_LG_F32, VOPCOp.V_CMPX_GE_F32, VOPCOp.V_CMPX_O_F32, VOPCOp.V_CMPX_U_F32, VOPCOp.V_CMPX_NGE_F32, VOPCOp.V_CMPX_NLG_F32, VOPCOp.V_CMPX_NGT_F32, VOPCOp.V_CMPX_NLE_F32, VOPCOp.V_CMPX_NEQ_F32, VOPCOp.V_CMPX_NLT_F32, VOPCOp.V_CMPX_T_F32, VOPCOp.V_CMPX_F_F64, VOPCOp.V_CMPX_LT_F64, VOPCOp.V_CMPX_EQ_F64, VOPCOp.V_CMPX_LE_F64, VOPCOp.V_CMPX_GT_F64, VOPCOp.V_CMPX_LG_F64, VOPCOp.V_CMPX_GE_F64, VOPCOp.V_CMPX_O_F64, VOPCOp.V_CMPX_U_F64, VOPCOp.V_CMPX_NGE_F64, VOPCOp.V_CMPX_NLG_F64, VOPCOp.V_CMPX_NGT_F64, VOPCOp.V_CMPX_NLE_F64, VOPCOp.V_CMPX_NEQ_F64, VOPCOp.V_CMPX_NLT_F64, VOPCOp.V_CMPX_T_F64, VOPCOp.V_CMPX_LT_I16, VOPCOp.V_CMPX_EQ_I16, VOPCOp.V_CMPX_LE_I16, VOPCOp.V_CMPX_GT_I16, VOPCOp.V_CMPX_NE_I16, VOPCOp.V_CMPX_GE_I16, VOPCOp.V_CMPX_LT_U16, VOPCOp.V_CMPX_EQ_U16, VOPCOp.V_CMPX_LE_U16, VOPCOp.V_CMPX_GT_U16, VOPCOp.V_CMPX_NE_U16, VOPCOp.V_CMPX_GE_U16, VOPCOp.V_CMPX_F_I32, VOPCOp.V_CMPX_LT_I32, VOPCOp.V_CMPX_EQ_I32, VOPCOp.V_CMPX_LE_I32, VOPCOp.V_CMPX_GT_I32, VOPCOp.V_CMPX_NE_I32, VOPCOp.V_CMPX_GE_I32, VOPCOp.V_CMPX_T_I32, VOPCOp.V_CMPX_F_U32, VOPCOp.V_CMPX_LT_U32, VOPCOp.V_CMPX_EQ_U32, VOPCOp.V_CMPX_LE_U32, VOPCOp.V_CMPX_GT_U32, VOPCOp.V_CMPX_NE_U32, VOPCOp.V_CMPX_GE_U32, VOPCOp.V_CMPX_T_U32, VOPCOp.V_CMPX_F_I64, VOPCOp.V_CMPX_LT_I64, VOPCOp.V_CMPX_EQ_I64, VOPCOp.V_CMPX_LE_I64, VOPCOp.V_CMPX_GT_I64, VOPCOp.V_CMPX_NE_I64, VOPCOp.V_CMPX_GE_I64, VOPCOp.V_CMPX_T_I64, VOPCOp.V_CMPX_F_U64, VOPCOp.V_CMPX_LT_U64, VOPCOp.V_CMPX_EQ_U64, VOPCOp.V_CMPX_LE_U64, VOPCOp.V_CMPX_GT_U64, VOPCOp.V_CMPX_NE_U64, VOPCOp.V_CMPX_GE_U64, VOPCOp.V_CMPX_T_U64, VOPCOp.V_CMPX_CLASS_F16, VOPCOp.V_CMPX_CLASS_F32, VOPCOp.V_CMPX_CLASS_F64}) + literal = BitField(63, 32) + +class VOPD_LIT(VOPD): + literal = BitField(95, 64) + +class VOP1_SDST(VOP1): + op = EnumBitField(16, 9, VOP1Op, {VOP1Op.V_READFIRSTLANE_B32}) + vdst = SSrcField(24, 17) + +class VOP1_SDST_LIT(VOP1_SDST): + literal = BitField(63, 32) + +class VOP3_SDST(VOP3): + op = EnumBitField(25, 16, VOP3Op, {VOP3Op.V_CMP_F_F16, VOP3Op.V_CMP_LT_F16, VOP3Op.V_CMP_EQ_F16, VOP3Op.V_CMP_LE_F16, VOP3Op.V_CMP_GT_F16, VOP3Op.V_CMP_LG_F16, VOP3Op.V_CMP_GE_F16, VOP3Op.V_CMP_O_F16, VOP3Op.V_CMP_U_F16, VOP3Op.V_CMP_NGE_F16, VOP3Op.V_CMP_NLG_F16, VOP3Op.V_CMP_NGT_F16, VOP3Op.V_CMP_NLE_F16, VOP3Op.V_CMP_NEQ_F16, VOP3Op.V_CMP_NLT_F16, VOP3Op.V_CMP_T_F16, VOP3Op.V_CMP_F_F32, VOP3Op.V_CMP_LT_F32, VOP3Op.V_CMP_EQ_F32, VOP3Op.V_CMP_LE_F32, VOP3Op.V_CMP_GT_F32, VOP3Op.V_CMP_LG_F32, VOP3Op.V_CMP_GE_F32, VOP3Op.V_CMP_O_F32, VOP3Op.V_CMP_U_F32, VOP3Op.V_CMP_NGE_F32, VOP3Op.V_CMP_NLG_F32, VOP3Op.V_CMP_NGT_F32, VOP3Op.V_CMP_NLE_F32, VOP3Op.V_CMP_NEQ_F32, VOP3Op.V_CMP_NLT_F32, VOP3Op.V_CMP_T_F32, VOP3Op.V_CMP_F_F64, VOP3Op.V_CMP_LT_F64, VOP3Op.V_CMP_EQ_F64, VOP3Op.V_CMP_LE_F64, VOP3Op.V_CMP_GT_F64, VOP3Op.V_CMP_LG_F64, VOP3Op.V_CMP_GE_F64, VOP3Op.V_CMP_O_F64, VOP3Op.V_CMP_U_F64, VOP3Op.V_CMP_NGE_F64, VOP3Op.V_CMP_NLG_F64, VOP3Op.V_CMP_NGT_F64, VOP3Op.V_CMP_NLE_F64, VOP3Op.V_CMP_NEQ_F64, VOP3Op.V_CMP_NLT_F64, VOP3Op.V_CMP_T_F64, VOP3Op.V_CMP_LT_I16, VOP3Op.V_CMP_EQ_I16, VOP3Op.V_CMP_LE_I16, VOP3Op.V_CMP_GT_I16, VOP3Op.V_CMP_NE_I16, VOP3Op.V_CMP_GE_I16, VOP3Op.V_CMP_LT_U16, VOP3Op.V_CMP_EQ_U16, VOP3Op.V_CMP_LE_U16, VOP3Op.V_CMP_GT_U16, VOP3Op.V_CMP_NE_U16, VOP3Op.V_CMP_GE_U16, VOP3Op.V_CMP_F_I32, VOP3Op.V_CMP_LT_I32, VOP3Op.V_CMP_EQ_I32, VOP3Op.V_CMP_LE_I32, VOP3Op.V_CMP_GT_I32, VOP3Op.V_CMP_NE_I32, VOP3Op.V_CMP_GE_I32, VOP3Op.V_CMP_T_I32, VOP3Op.V_CMP_F_U32, VOP3Op.V_CMP_LT_U32, VOP3Op.V_CMP_EQ_U32, VOP3Op.V_CMP_LE_U32, VOP3Op.V_CMP_GT_U32, VOP3Op.V_CMP_NE_U32, VOP3Op.V_CMP_GE_U32, VOP3Op.V_CMP_T_U32, VOP3Op.V_CMP_F_I64, VOP3Op.V_CMP_LT_I64, VOP3Op.V_CMP_EQ_I64, VOP3Op.V_CMP_LE_I64, VOP3Op.V_CMP_GT_I64, VOP3Op.V_CMP_NE_I64, VOP3Op.V_CMP_GE_I64, VOP3Op.V_CMP_T_I64, VOP3Op.V_CMP_F_U64, VOP3Op.V_CMP_LT_U64, VOP3Op.V_CMP_EQ_U64, VOP3Op.V_CMP_LE_U64, VOP3Op.V_CMP_GT_U64, VOP3Op.V_CMP_NE_U64, VOP3Op.V_CMP_GE_U64, VOP3Op.V_CMP_T_U64, VOP3Op.V_CMP_CLASS_F16, VOP3Op.V_CMP_CLASS_F32, VOP3Op.V_CMP_CLASS_F64, VOP3Op.V_CMPX_F_F16, VOP3Op.V_CMPX_LT_F16, VOP3Op.V_CMPX_EQ_F16, VOP3Op.V_CMPX_LE_F16, VOP3Op.V_CMPX_GT_F16, VOP3Op.V_CMPX_LG_F16, VOP3Op.V_CMPX_GE_F16, VOP3Op.V_CMPX_O_F16, VOP3Op.V_CMPX_U_F16, VOP3Op.V_CMPX_NGE_F16, VOP3Op.V_CMPX_NLG_F16, VOP3Op.V_CMPX_NGT_F16, VOP3Op.V_CMPX_NLE_F16, VOP3Op.V_CMPX_NEQ_F16, VOP3Op.V_CMPX_NLT_F16, VOP3Op.V_CMPX_T_F16, VOP3Op.V_CMPX_F_F32, VOP3Op.V_CMPX_LT_F32, VOP3Op.V_CMPX_EQ_F32, VOP3Op.V_CMPX_LE_F32, VOP3Op.V_CMPX_GT_F32, VOP3Op.V_CMPX_LG_F32, VOP3Op.V_CMPX_GE_F32, VOP3Op.V_CMPX_O_F32, VOP3Op.V_CMPX_U_F32, VOP3Op.V_CMPX_NGE_F32, VOP3Op.V_CMPX_NLG_F32, VOP3Op.V_CMPX_NGT_F32, VOP3Op.V_CMPX_NLE_F32, VOP3Op.V_CMPX_NEQ_F32, VOP3Op.V_CMPX_NLT_F32, VOP3Op.V_CMPX_T_F32, VOP3Op.V_CMPX_F_F64, VOP3Op.V_CMPX_LT_F64, VOP3Op.V_CMPX_EQ_F64, VOP3Op.V_CMPX_LE_F64, VOP3Op.V_CMPX_GT_F64, VOP3Op.V_CMPX_LG_F64, VOP3Op.V_CMPX_GE_F64, VOP3Op.V_CMPX_O_F64, VOP3Op.V_CMPX_U_F64, VOP3Op.V_CMPX_NGE_F64, VOP3Op.V_CMPX_NLG_F64, VOP3Op.V_CMPX_NGT_F64, VOP3Op.V_CMPX_NLE_F64, VOP3Op.V_CMPX_NEQ_F64, VOP3Op.V_CMPX_NLT_F64, VOP3Op.V_CMPX_T_F64, VOP3Op.V_CMPX_LT_I16, VOP3Op.V_CMPX_EQ_I16, VOP3Op.V_CMPX_LE_I16, VOP3Op.V_CMPX_GT_I16, VOP3Op.V_CMPX_NE_I16, VOP3Op.V_CMPX_GE_I16, VOP3Op.V_CMPX_LT_U16, VOP3Op.V_CMPX_EQ_U16, VOP3Op.V_CMPX_LE_U16, VOP3Op.V_CMPX_GT_U16, VOP3Op.V_CMPX_NE_U16, VOP3Op.V_CMPX_GE_U16, VOP3Op.V_CMPX_F_I32, VOP3Op.V_CMPX_LT_I32, VOP3Op.V_CMPX_EQ_I32, VOP3Op.V_CMPX_LE_I32, VOP3Op.V_CMPX_GT_I32, VOP3Op.V_CMPX_NE_I32, VOP3Op.V_CMPX_GE_I32, VOP3Op.V_CMPX_T_I32, VOP3Op.V_CMPX_F_U32, VOP3Op.V_CMPX_LT_U32, VOP3Op.V_CMPX_EQ_U32, VOP3Op.V_CMPX_LE_U32, VOP3Op.V_CMPX_GT_U32, VOP3Op.V_CMPX_NE_U32, VOP3Op.V_CMPX_GE_U32, VOP3Op.V_CMPX_T_U32, VOP3Op.V_CMPX_F_I64, VOP3Op.V_CMPX_LT_I64, VOP3Op.V_CMPX_EQ_I64, VOP3Op.V_CMPX_LE_I64, VOP3Op.V_CMPX_GT_I64, VOP3Op.V_CMPX_NE_I64, VOP3Op.V_CMPX_GE_I64, VOP3Op.V_CMPX_T_I64, VOP3Op.V_CMPX_F_U64, VOP3Op.V_CMPX_LT_U64, VOP3Op.V_CMPX_EQ_U64, VOP3Op.V_CMPX_LE_U64, VOP3Op.V_CMPX_GT_U64, VOP3Op.V_CMPX_NE_U64, VOP3Op.V_CMPX_GE_U64, VOP3Op.V_CMPX_T_U64, VOP3Op.V_CMPX_CLASS_F16, VOP3Op.V_CMPX_CLASS_F32, VOP3Op.V_CMPX_CLASS_F64, VOP3Op.V_READFIRSTLANE_B32, VOP3Op.V_READLANE_B32}) + vdst = SSrcField(7, 0) + +class VOP3_SDST_LIT(VOP3_SDST): + literal = BitField(95, 64) + +# instruction helpers +ds_add_u32 = functools.partial(DS, DSOp.DS_ADD_U32) +ds_sub_u32 = functools.partial(DS, DSOp.DS_SUB_U32) +ds_rsub_u32 = functools.partial(DS, DSOp.DS_RSUB_U32) +ds_inc_u32 = functools.partial(DS, DSOp.DS_INC_U32) +ds_dec_u32 = functools.partial(DS, DSOp.DS_DEC_U32) +ds_min_i32 = functools.partial(DS, DSOp.DS_MIN_I32) +ds_max_i32 = functools.partial(DS, DSOp.DS_MAX_I32) +ds_min_u32 = functools.partial(DS, DSOp.DS_MIN_U32) +ds_max_u32 = functools.partial(DS, DSOp.DS_MAX_U32) +ds_and_b32 = functools.partial(DS, DSOp.DS_AND_B32) +ds_or_b32 = functools.partial(DS, DSOp.DS_OR_B32) +ds_xor_b32 = functools.partial(DS, DSOp.DS_XOR_B32) +ds_mskor_b32 = functools.partial(DS, DSOp.DS_MSKOR_B32) +ds_store_b32 = functools.partial(DS, DSOp.DS_STORE_B32) +ds_store_2addr_b32 = functools.partial(DS, DSOp.DS_STORE_2ADDR_B32) +ds_store_2addr_stride64_b32 = functools.partial(DS, DSOp.DS_STORE_2ADDR_STRIDE64_B32) +ds_cmpstore_b32 = functools.partial(DS, DSOp.DS_CMPSTORE_B32) +ds_cmpstore_f32 = functools.partial(DS, DSOp.DS_CMPSTORE_F32) +ds_min_f32 = functools.partial(DS, DSOp.DS_MIN_F32) +ds_max_f32 = functools.partial(DS, DSOp.DS_MAX_F32) +ds_nop = functools.partial(DS, DSOp.DS_NOP) +ds_add_f32 = functools.partial(DS, DSOp.DS_ADD_F32) +ds_gws_sema_release_all = functools.partial(DS, DSOp.DS_GWS_SEMA_RELEASE_ALL) +ds_gws_init = functools.partial(DS, DSOp.DS_GWS_INIT) +ds_gws_sema_v = functools.partial(DS, DSOp.DS_GWS_SEMA_V) +ds_gws_sema_br = functools.partial(DS, DSOp.DS_GWS_SEMA_BR) +ds_gws_sema_p = functools.partial(DS, DSOp.DS_GWS_SEMA_P) +ds_gws_barrier = functools.partial(DS, DSOp.DS_GWS_BARRIER) +ds_store_b8 = functools.partial(DS, DSOp.DS_STORE_B8) +ds_store_b16 = functools.partial(DS, DSOp.DS_STORE_B16) +ds_add_rtn_u32 = functools.partial(DS, DSOp.DS_ADD_RTN_U32) +ds_sub_rtn_u32 = functools.partial(DS, DSOp.DS_SUB_RTN_U32) +ds_rsub_rtn_u32 = functools.partial(DS, DSOp.DS_RSUB_RTN_U32) +ds_inc_rtn_u32 = functools.partial(DS, DSOp.DS_INC_RTN_U32) +ds_dec_rtn_u32 = functools.partial(DS, DSOp.DS_DEC_RTN_U32) +ds_min_rtn_i32 = functools.partial(DS, DSOp.DS_MIN_RTN_I32) +ds_max_rtn_i32 = functools.partial(DS, DSOp.DS_MAX_RTN_I32) +ds_min_rtn_u32 = functools.partial(DS, DSOp.DS_MIN_RTN_U32) +ds_max_rtn_u32 = functools.partial(DS, DSOp.DS_MAX_RTN_U32) +ds_and_rtn_b32 = functools.partial(DS, DSOp.DS_AND_RTN_B32) +ds_or_rtn_b32 = functools.partial(DS, DSOp.DS_OR_RTN_B32) +ds_xor_rtn_b32 = functools.partial(DS, DSOp.DS_XOR_RTN_B32) +ds_mskor_rtn_b32 = functools.partial(DS, DSOp.DS_MSKOR_RTN_B32) +ds_storexchg_rtn_b32 = functools.partial(DS, DSOp.DS_STOREXCHG_RTN_B32) +ds_storexchg_2addr_rtn_b32 = functools.partial(DS, DSOp.DS_STOREXCHG_2ADDR_RTN_B32) +ds_storexchg_2addr_stride64_rtn_b32 = functools.partial(DS, DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32) +ds_cmpstore_rtn_b32 = functools.partial(DS, DSOp.DS_CMPSTORE_RTN_B32) +ds_cmpstore_rtn_f32 = functools.partial(DS, DSOp.DS_CMPSTORE_RTN_F32) +ds_min_rtn_f32 = functools.partial(DS, DSOp.DS_MIN_RTN_F32) +ds_max_rtn_f32 = functools.partial(DS, DSOp.DS_MAX_RTN_F32) +ds_wrap_rtn_b32 = functools.partial(DS, DSOp.DS_WRAP_RTN_B32) +ds_swizzle_b32 = functools.partial(DS, DSOp.DS_SWIZZLE_B32) +ds_load_b32 = functools.partial(DS, DSOp.DS_LOAD_B32) +ds_load_2addr_b32 = functools.partial(DS, DSOp.DS_LOAD_2ADDR_B32) +ds_load_2addr_stride64_b32 = functools.partial(DS, DSOp.DS_LOAD_2ADDR_STRIDE64_B32) +ds_load_i8 = functools.partial(DS, DSOp.DS_LOAD_I8) +ds_load_u8 = functools.partial(DS, DSOp.DS_LOAD_U8) +ds_load_i16 = functools.partial(DS, DSOp.DS_LOAD_I16) +ds_load_u16 = functools.partial(DS, DSOp.DS_LOAD_U16) +ds_consume = functools.partial(DS, DSOp.DS_CONSUME) +ds_append = functools.partial(DS, DSOp.DS_APPEND) +ds_ordered_count = functools.partial(DS, DSOp.DS_ORDERED_COUNT) +ds_add_u64 = functools.partial(DS, DSOp.DS_ADD_U64) +ds_sub_u64 = functools.partial(DS, DSOp.DS_SUB_U64) +ds_rsub_u64 = functools.partial(DS, DSOp.DS_RSUB_U64) +ds_inc_u64 = functools.partial(DS, DSOp.DS_INC_U64) +ds_dec_u64 = functools.partial(DS, DSOp.DS_DEC_U64) +ds_min_i64 = functools.partial(DS, DSOp.DS_MIN_I64) +ds_max_i64 = functools.partial(DS, DSOp.DS_MAX_I64) +ds_min_u64 = functools.partial(DS, DSOp.DS_MIN_U64) +ds_max_u64 = functools.partial(DS, DSOp.DS_MAX_U64) +ds_and_b64 = functools.partial(DS, DSOp.DS_AND_B64) +ds_or_b64 = functools.partial(DS, DSOp.DS_OR_B64) +ds_xor_b64 = functools.partial(DS, DSOp.DS_XOR_B64) +ds_mskor_b64 = functools.partial(DS, DSOp.DS_MSKOR_B64) +ds_store_b64 = functools.partial(DS, DSOp.DS_STORE_B64) +ds_store_2addr_b64 = functools.partial(DS, DSOp.DS_STORE_2ADDR_B64) +ds_store_2addr_stride64_b64 = functools.partial(DS, DSOp.DS_STORE_2ADDR_STRIDE64_B64) +ds_cmpstore_b64 = functools.partial(DS, DSOp.DS_CMPSTORE_B64) +ds_cmpstore_f64 = functools.partial(DS, DSOp.DS_CMPSTORE_F64) +ds_min_f64 = functools.partial(DS, DSOp.DS_MIN_F64) +ds_max_f64 = functools.partial(DS, DSOp.DS_MAX_F64) +ds_add_rtn_u64 = functools.partial(DS, DSOp.DS_ADD_RTN_U64) +ds_sub_rtn_u64 = functools.partial(DS, DSOp.DS_SUB_RTN_U64) +ds_rsub_rtn_u64 = functools.partial(DS, DSOp.DS_RSUB_RTN_U64) +ds_inc_rtn_u64 = functools.partial(DS, DSOp.DS_INC_RTN_U64) +ds_dec_rtn_u64 = functools.partial(DS, DSOp.DS_DEC_RTN_U64) +ds_min_rtn_i64 = functools.partial(DS, DSOp.DS_MIN_RTN_I64) +ds_max_rtn_i64 = functools.partial(DS, DSOp.DS_MAX_RTN_I64) +ds_min_rtn_u64 = functools.partial(DS, DSOp.DS_MIN_RTN_U64) +ds_max_rtn_u64 = functools.partial(DS, DSOp.DS_MAX_RTN_U64) +ds_and_rtn_b64 = functools.partial(DS, DSOp.DS_AND_RTN_B64) +ds_or_rtn_b64 = functools.partial(DS, DSOp.DS_OR_RTN_B64) +ds_xor_rtn_b64 = functools.partial(DS, DSOp.DS_XOR_RTN_B64) +ds_mskor_rtn_b64 = functools.partial(DS, DSOp.DS_MSKOR_RTN_B64) +ds_storexchg_rtn_b64 = functools.partial(DS, DSOp.DS_STOREXCHG_RTN_B64) +ds_storexchg_2addr_rtn_b64 = functools.partial(DS, DSOp.DS_STOREXCHG_2ADDR_RTN_B64) +ds_storexchg_2addr_stride64_rtn_b64 = functools.partial(DS, DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64) +ds_cmpstore_rtn_b64 = functools.partial(DS, DSOp.DS_CMPSTORE_RTN_B64) +ds_cmpstore_rtn_f64 = functools.partial(DS, DSOp.DS_CMPSTORE_RTN_F64) +ds_min_rtn_f64 = functools.partial(DS, DSOp.DS_MIN_RTN_F64) +ds_max_rtn_f64 = functools.partial(DS, DSOp.DS_MAX_RTN_F64) +ds_load_b64 = functools.partial(DS, DSOp.DS_LOAD_B64) +ds_load_2addr_b64 = functools.partial(DS, DSOp.DS_LOAD_2ADDR_B64) +ds_load_2addr_stride64_b64 = functools.partial(DS, DSOp.DS_LOAD_2ADDR_STRIDE64_B64) +ds_add_rtn_f32 = functools.partial(DS, DSOp.DS_ADD_RTN_F32) +ds_add_gs_reg_rtn = functools.partial(DS, DSOp.DS_ADD_GS_REG_RTN) +ds_sub_gs_reg_rtn = functools.partial(DS, DSOp.DS_SUB_GS_REG_RTN) +ds_condxchg32_rtn_b64 = functools.partial(DS, DSOp.DS_CONDXCHG32_RTN_B64) +ds_store_b8_d16_hi = functools.partial(DS, DSOp.DS_STORE_B8_D16_HI) +ds_store_b16_d16_hi = functools.partial(DS, DSOp.DS_STORE_B16_D16_HI) +ds_load_u8_d16 = functools.partial(DS, DSOp.DS_LOAD_U8_D16) +ds_load_u8_d16_hi = functools.partial(DS, DSOp.DS_LOAD_U8_D16_HI) +ds_load_i8_d16 = functools.partial(DS, DSOp.DS_LOAD_I8_D16) +ds_load_i8_d16_hi = functools.partial(DS, DSOp.DS_LOAD_I8_D16_HI) +ds_load_u16_d16 = functools.partial(DS, DSOp.DS_LOAD_U16_D16) +ds_load_u16_d16_hi = functools.partial(DS, DSOp.DS_LOAD_U16_D16_HI) +ds_bvh_stack_rtn_b32 = functools.partial(DS, DSOp.DS_BVH_STACK_RTN_B32) +ds_store_addtid_b32 = functools.partial(DS, DSOp.DS_STORE_ADDTID_B32) +ds_load_addtid_b32 = functools.partial(DS, DSOp.DS_LOAD_ADDTID_B32) +ds_permute_b32 = functools.partial(DS, DSOp.DS_PERMUTE_B32) +ds_bpermute_b32 = functools.partial(DS, DSOp.DS_BPERMUTE_B32) +ds_store_b96 = functools.partial(DS, DSOp.DS_STORE_B96) +ds_store_b128 = functools.partial(DS, DSOp.DS_STORE_B128) +ds_load_b96 = functools.partial(DS, DSOp.DS_LOAD_B96) +ds_load_b128 = functools.partial(DS, DSOp.DS_LOAD_B128) +exp = functools.partial(EXP, EXPOp.EXP) +flat_load_u8 = functools.partial(FLAT, FLATOp.FLAT_LOAD_U8) +flat_load_i8 = functools.partial(FLAT, FLATOp.FLAT_LOAD_I8) +flat_load_u16 = functools.partial(FLAT, FLATOp.FLAT_LOAD_U16) +flat_load_i16 = functools.partial(FLAT, FLATOp.FLAT_LOAD_I16) +flat_load_b32 = functools.partial(FLAT, FLATOp.FLAT_LOAD_B32) +flat_load_b64 = functools.partial(FLAT, FLATOp.FLAT_LOAD_B64) +flat_load_b96 = functools.partial(FLAT, FLATOp.FLAT_LOAD_B96) +flat_load_b128 = functools.partial(FLAT, FLATOp.FLAT_LOAD_B128) +flat_store_b8 = functools.partial(FLAT, FLATOp.FLAT_STORE_B8) +flat_store_b16 = functools.partial(FLAT, FLATOp.FLAT_STORE_B16) +flat_store_b32 = functools.partial(FLAT, FLATOp.FLAT_STORE_B32) +flat_store_b64 = functools.partial(FLAT, FLATOp.FLAT_STORE_B64) +flat_store_b96 = functools.partial(FLAT, FLATOp.FLAT_STORE_B96) +flat_store_b128 = functools.partial(FLAT, FLATOp.FLAT_STORE_B128) +flat_load_d16_u8 = functools.partial(FLAT, FLATOp.FLAT_LOAD_D16_U8) +flat_load_d16_i8 = functools.partial(FLAT, FLATOp.FLAT_LOAD_D16_I8) +flat_load_d16_b16 = functools.partial(FLAT, FLATOp.FLAT_LOAD_D16_B16) +flat_load_d16_hi_u8 = functools.partial(FLAT, FLATOp.FLAT_LOAD_D16_HI_U8) +flat_load_d16_hi_i8 = functools.partial(FLAT, FLATOp.FLAT_LOAD_D16_HI_I8) +flat_load_d16_hi_b16 = functools.partial(FLAT, FLATOp.FLAT_LOAD_D16_HI_B16) +flat_store_d16_hi_b8 = functools.partial(FLAT, FLATOp.FLAT_STORE_D16_HI_B8) +flat_store_d16_hi_b16 = functools.partial(FLAT, FLATOp.FLAT_STORE_D16_HI_B16) +flat_atomic_swap_b32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SWAP_B32) +flat_atomic_cmpswap_b32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_CMPSWAP_B32) +flat_atomic_add_u32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_ADD_U32) +flat_atomic_sub_u32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SUB_U32) +flat_atomic_csub_u32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_CSUB_U32) +flat_atomic_min_i32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MIN_I32) +flat_atomic_min_u32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MIN_U32) +flat_atomic_max_i32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MAX_I32) +flat_atomic_max_u32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MAX_U32) +flat_atomic_and_b32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_AND_B32) +flat_atomic_or_b32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_OR_B32) +flat_atomic_xor_b32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_XOR_B32) +flat_atomic_inc_u32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_INC_U32) +flat_atomic_dec_u32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_DEC_U32) +flat_atomic_swap_b64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SWAP_B64) +flat_atomic_cmpswap_b64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_CMPSWAP_B64) +flat_atomic_add_u64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_ADD_U64) +flat_atomic_sub_u64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_SUB_U64) +flat_atomic_min_i64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MIN_I64) +flat_atomic_min_u64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MIN_U64) +flat_atomic_max_i64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MAX_I64) +flat_atomic_max_u64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MAX_U64) +flat_atomic_and_b64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_AND_B64) +flat_atomic_or_b64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_OR_B64) +flat_atomic_xor_b64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_XOR_B64) +flat_atomic_inc_u64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_INC_U64) +flat_atomic_dec_u64 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_DEC_U64) +flat_atomic_cmpswap_f32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_CMPSWAP_F32) +flat_atomic_min_f32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MIN_F32) +flat_atomic_max_f32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_MAX_F32) +flat_atomic_add_f32 = functools.partial(FLAT, FLATOp.FLAT_ATOMIC_ADD_F32) +global_load_u8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_U8) +global_load_i8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_I8) +global_load_u16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_U16) +global_load_i16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_I16) +global_load_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_B32) +global_load_b64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_B64) +global_load_b96 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_B96) +global_load_b128 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_B128) +global_store_b8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_B8) +global_store_b16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_B16) +global_store_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_B32) +global_store_b64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_B64) +global_store_b96 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_B96) +global_store_b128 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_B128) +global_load_d16_u8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_D16_U8) +global_load_d16_i8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_D16_I8) +global_load_d16_b16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_D16_B16) +global_load_d16_hi_u8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_D16_HI_U8) +global_load_d16_hi_i8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_D16_HI_I8) +global_load_d16_hi_b16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_D16_HI_B16) +global_store_d16_hi_b8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_D16_HI_B8) +global_store_d16_hi_b16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_D16_HI_B16) +global_load_addtid_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_ADDTID_B32) +global_store_addtid_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_STORE_ADDTID_B32) +global_load_lds_addtid_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_ADDTID_B32) +global_load_lds_u8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_U8) +global_load_lds_i8 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_I8) +global_load_lds_u16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_U16) +global_load_lds_i16 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_I16) +global_load_lds_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_LOAD_LDS_B32) +global_atomic_swap_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SWAP_B32) +global_atomic_cmpswap_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B32) +global_atomic_add_u32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_ADD_U32) +global_atomic_sub_u32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SUB_U32) +global_atomic_csub_u32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_CSUB_U32) +global_atomic_min_i32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MIN_I32) +global_atomic_min_u32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MIN_U32) +global_atomic_max_i32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MAX_I32) +global_atomic_max_u32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MAX_U32) +global_atomic_and_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_AND_B32) +global_atomic_or_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_OR_B32) +global_atomic_xor_b32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_XOR_B32) +global_atomic_inc_u32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_INC_U32) +global_atomic_dec_u32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_DEC_U32) +global_atomic_swap_b64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SWAP_B64) +global_atomic_cmpswap_b64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B64) +global_atomic_add_u64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_ADD_U64) +global_atomic_sub_u64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_SUB_U64) +global_atomic_min_i64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MIN_I64) +global_atomic_min_u64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MIN_U64) +global_atomic_max_i64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MAX_I64) +global_atomic_max_u64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MAX_U64) +global_atomic_and_b64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_AND_B64) +global_atomic_or_b64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_OR_B64) +global_atomic_xor_b64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_XOR_B64) +global_atomic_inc_u64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_INC_U64) +global_atomic_dec_u64 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_DEC_U64) +global_atomic_cmpswap_f32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_F32) +global_atomic_min_f32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MIN_F32) +global_atomic_max_f32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_MAX_F32) +global_atomic_add_f32 = functools.partial(GLOBAL, GLOBALOp.GLOBAL_ATOMIC_ADD_F32) +lds_param_load = functools.partial(LDSDIR, LDSDIROp.LDS_PARAM_LOAD) +lds_direct_load = functools.partial(LDSDIR, LDSDIROp.LDS_DIRECT_LOAD) +image_load = functools.partial(MIMG, MIMGOp.IMAGE_LOAD) +image_load_mip = functools.partial(MIMG, MIMGOp.IMAGE_LOAD_MIP) +image_load_pck = functools.partial(MIMG, MIMGOp.IMAGE_LOAD_PCK) +image_load_pck_sgn = functools.partial(MIMG, MIMGOp.IMAGE_LOAD_PCK_SGN) +image_load_mip_pck = functools.partial(MIMG, MIMGOp.IMAGE_LOAD_MIP_PCK) +image_load_mip_pck_sgn = functools.partial(MIMG, MIMGOp.IMAGE_LOAD_MIP_PCK_SGN) +image_store = functools.partial(MIMG, MIMGOp.IMAGE_STORE) +image_store_mip = functools.partial(MIMG, MIMGOp.IMAGE_STORE_MIP) +image_store_pck = functools.partial(MIMG, MIMGOp.IMAGE_STORE_PCK) +image_store_mip_pck = functools.partial(MIMG, MIMGOp.IMAGE_STORE_MIP_PCK) +image_atomic_swap = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_SWAP) +image_atomic_cmpswap = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_CMPSWAP) +image_atomic_add = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_ADD) +image_atomic_sub = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_SUB) +image_atomic_smin = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_SMIN) +image_atomic_umin = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_UMIN) +image_atomic_smax = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_SMAX) +image_atomic_umax = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_UMAX) +image_atomic_and = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_AND) +image_atomic_or = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_OR) +image_atomic_xor = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_XOR) +image_atomic_inc = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_INC) +image_atomic_dec = functools.partial(MIMG, MIMGOp.IMAGE_ATOMIC_DEC) +image_get_resinfo = functools.partial(MIMG, MIMGOp.IMAGE_GET_RESINFO) +image_msaa_load = functools.partial(MIMG, MIMGOp.IMAGE_MSAA_LOAD) +image_bvh_intersect_ray = functools.partial(MIMG, MIMGOp.IMAGE_BVH_INTERSECT_RAY) +image_bvh64_intersect_ray = functools.partial(MIMG, MIMGOp.IMAGE_BVH64_INTERSECT_RAY) +image_sample = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE) +image_sample_d = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_D) +image_sample_l = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_L) +image_sample_b = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_B) +image_sample_lz = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_LZ) +image_sample_c = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C) +image_sample_c_d = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_D) +image_sample_c_l = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_L) +image_sample_c_b = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_B) +image_sample_c_lz = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_LZ) +image_sample_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_O) +image_sample_d_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_D_O) +image_sample_l_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_L_O) +image_sample_b_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_B_O) +image_sample_lz_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_LZ_O) +image_sample_c_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_O) +image_sample_c_d_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_D_O) +image_sample_c_l_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_L_O) +image_sample_c_b_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_B_O) +image_sample_c_lz_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_LZ_O) +image_gather4 = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4) +image_gather4_l = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_L) +image_gather4_b = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_B) +image_gather4_lz = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_LZ) +image_gather4_c = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_C) +image_gather4_c_lz = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_C_LZ) +image_gather4_o = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_O) +image_gather4_lz_o = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_LZ_O) +image_gather4_c_lz_o = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_C_LZ_O) +image_get_lod = functools.partial(MIMG, MIMGOp.IMAGE_GET_LOD) +image_sample_d_g16 = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_D_G16) +image_sample_c_d_g16 = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_D_G16) +image_sample_d_o_g16 = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_D_O_G16) +image_sample_c_d_o_g16 = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_D_O_G16) +image_sample_cl = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_CL) +image_sample_d_cl = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_D_CL) +image_sample_b_cl = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_B_CL) +image_sample_c_cl = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_CL) +image_sample_c_d_cl = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_D_CL) +image_sample_c_b_cl = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_B_CL) +image_sample_cl_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_CL_O) +image_sample_d_cl_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_D_CL_O) +image_sample_b_cl_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_B_CL_O) +image_sample_c_cl_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_CL_O) +image_sample_c_d_cl_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_D_CL_O) +image_sample_c_b_cl_o = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_B_CL_O) +image_sample_c_d_cl_g16 = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_D_CL_G16) +image_sample_d_cl_o_g16 = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_D_CL_O_G16) +image_sample_c_d_cl_o_g16 = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_C_D_CL_O_G16) +image_sample_d_cl_g16 = functools.partial(MIMG, MIMGOp.IMAGE_SAMPLE_D_CL_G16) +image_gather4_cl = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_CL) +image_gather4_b_cl = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_B_CL) +image_gather4_c_cl = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_C_CL) +image_gather4_c_l = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_C_L) +image_gather4_c_b = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_C_B) +image_gather4_c_b_cl = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4_C_B_CL) +image_gather4h = functools.partial(MIMG, MIMGOp.IMAGE_GATHER4H) +tbuffer_load_format_x = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_X) +tbuffer_load_format_xy = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_XY) +tbuffer_load_format_xyz = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_XYZ) +tbuffer_load_format_xyzw = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_FORMAT_XYZW) +tbuffer_store_format_x = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_X) +tbuffer_store_format_xy = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_XY) +tbuffer_store_format_xyz = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_XYZ) +tbuffer_store_format_xyzw = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_FORMAT_XYZW) +tbuffer_load_d16_format_x = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_D16_FORMAT_X) +tbuffer_load_d16_format_xy = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XY) +tbuffer_load_d16_format_xyz = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XYZ) +tbuffer_load_d16_format_xyzw = functools.partial(MTBUF, MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XYZW) +tbuffer_store_d16_format_x = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_D16_FORMAT_X) +tbuffer_store_d16_format_xy = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_D16_FORMAT_XY) +tbuffer_store_d16_format_xyz = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_D16_FORMAT_XYZ) +tbuffer_store_d16_format_xyzw = functools.partial(MTBUF, MTBUFOp.TBUFFER_STORE_D16_FORMAT_XYZW) +buffer_load_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_X) +buffer_load_format_xy = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_XY) +buffer_load_format_xyz = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_XYZ) +buffer_load_format_xyzw = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_FORMAT_XYZW) +buffer_store_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_X) +buffer_store_format_xy = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_XY) +buffer_store_format_xyz = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_XYZ) +buffer_store_format_xyzw = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_FORMAT_XYZW) +buffer_load_d16_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_FORMAT_X) +buffer_load_d16_format_xy = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_FORMAT_XY) +buffer_load_d16_format_xyz = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_FORMAT_XYZ) +buffer_load_d16_format_xyzw = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_FORMAT_XYZW) +buffer_store_d16_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_D16_FORMAT_X) +buffer_store_d16_format_xy = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_D16_FORMAT_XY) +buffer_store_d16_format_xyz = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_D16_FORMAT_XYZ) +buffer_store_d16_format_xyzw = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_D16_FORMAT_XYZW) +buffer_load_u8 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_U8) +buffer_load_i8 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_I8) +buffer_load_u16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_U16) +buffer_load_i16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_I16) +buffer_load_b32 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_B32) +buffer_load_b64 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_B64) +buffer_load_b96 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_B96) +buffer_load_b128 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_B128) +buffer_store_b8 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_B8) +buffer_store_b16 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_B16) +buffer_store_b32 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_B32) +buffer_store_b64 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_B64) +buffer_store_b96 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_B96) +buffer_store_b128 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_B128) +buffer_load_d16_u8 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_U8) +buffer_load_d16_i8 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_I8) +buffer_load_d16_b16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_B16) +buffer_load_d16_hi_u8 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_HI_U8) +buffer_load_d16_hi_i8 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_HI_I8) +buffer_load_d16_hi_b16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_HI_B16) +buffer_store_d16_hi_b8 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_D16_HI_B8) +buffer_store_d16_hi_b16 = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_D16_HI_B16) +buffer_load_d16_hi_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_D16_HI_FORMAT_X) +buffer_store_d16_hi_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_STORE_D16_HI_FORMAT_X) +buffer_gl0_inv = functools.partial(MUBUF, MUBUFOp.BUFFER_GL0_INV) +buffer_gl1_inv = functools.partial(MUBUF, MUBUFOp.BUFFER_GL1_INV) +buffer_load_lds_u8 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_LDS_U8) +buffer_load_lds_i8 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_LDS_I8) +buffer_load_lds_u16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_LDS_U16) +buffer_load_lds_i16 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_LDS_I16) +buffer_load_lds_b32 = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_LDS_B32) +buffer_load_lds_format_x = functools.partial(MUBUF, MUBUFOp.BUFFER_LOAD_LDS_FORMAT_X) +buffer_atomic_swap_b32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SWAP_B32) +buffer_atomic_cmpswap_b32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_CMPSWAP_B32) +buffer_atomic_add_u32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_ADD_U32) +buffer_atomic_sub_u32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SUB_U32) +buffer_atomic_csub_u32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_CSUB_U32) +buffer_atomic_min_i32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MIN_I32) +buffer_atomic_min_u32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MIN_U32) +buffer_atomic_max_i32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MAX_I32) +buffer_atomic_max_u32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MAX_U32) +buffer_atomic_and_b32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_AND_B32) +buffer_atomic_or_b32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_OR_B32) +buffer_atomic_xor_b32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_XOR_B32) +buffer_atomic_inc_u32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_INC_U32) +buffer_atomic_dec_u32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_DEC_U32) +buffer_atomic_swap_b64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SWAP_B64) +buffer_atomic_cmpswap_b64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_CMPSWAP_B64) +buffer_atomic_add_u64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_ADD_U64) +buffer_atomic_sub_u64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_SUB_U64) +buffer_atomic_min_i64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MIN_I64) +buffer_atomic_min_u64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MIN_U64) +buffer_atomic_max_i64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MAX_I64) +buffer_atomic_max_u64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MAX_U64) +buffer_atomic_and_b64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_AND_B64) +buffer_atomic_or_b64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_OR_B64) +buffer_atomic_xor_b64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_XOR_B64) +buffer_atomic_inc_u64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_INC_U64) +buffer_atomic_dec_u64 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_DEC_U64) +buffer_atomic_cmpswap_f32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_CMPSWAP_F32) +buffer_atomic_min_f32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MIN_F32) +buffer_atomic_max_f32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_MAX_F32) +buffer_atomic_add_f32 = functools.partial(MUBUF, MUBUFOp.BUFFER_ATOMIC_ADD_F32) +scratch_load_u8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_U8) +scratch_load_i8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_I8) +scratch_load_u16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_U16) +scratch_load_i16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_I16) +scratch_load_b32 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_B32) +scratch_load_b64 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_B64) +scratch_load_b96 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_B96) +scratch_load_b128 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_B128) +scratch_store_b8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_B8) +scratch_store_b16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_B16) +scratch_store_b32 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_B32) +scratch_store_b64 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_B64) +scratch_store_b96 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_B96) +scratch_store_b128 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_B128) +scratch_load_d16_u8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_D16_U8) +scratch_load_d16_i8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_D16_I8) +scratch_load_d16_b16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_D16_B16) +scratch_load_d16_hi_u8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_D16_HI_U8) +scratch_load_d16_hi_i8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_D16_HI_I8) +scratch_load_d16_hi_b16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_D16_HI_B16) +scratch_store_d16_hi_b8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_D16_HI_B8) +scratch_store_d16_hi_b16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_STORE_D16_HI_B16) +scratch_load_lds_u8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_U8) +scratch_load_lds_i8 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_I8) +scratch_load_lds_u16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_U16) +scratch_load_lds_i16 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_I16) +scratch_load_lds_b32 = functools.partial(SCRATCH, SCRATCHOp.SCRATCH_LOAD_LDS_B32) +s_load_b32 = functools.partial(SMEM, SMEMOp.S_LOAD_B32) +s_load_b64 = functools.partial(SMEM, SMEMOp.S_LOAD_B64) +s_load_b128 = functools.partial(SMEM, SMEMOp.S_LOAD_B128) +s_load_b256 = functools.partial(SMEM, SMEMOp.S_LOAD_B256) +s_load_b512 = functools.partial(SMEM, SMEMOp.S_LOAD_B512) +s_buffer_load_b32 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B32) +s_buffer_load_b64 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B64) +s_buffer_load_b128 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B128) +s_buffer_load_b256 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B256) +s_buffer_load_b512 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B512) +s_gl1_inv = functools.partial(SMEM, SMEMOp.S_GL1_INV) +s_dcache_inv = functools.partial(SMEM, SMEMOp.S_DCACHE_INV) +s_atc_probe = functools.partial(SMEM, SMEMOp.S_ATC_PROBE) +s_atc_probe_buffer = functools.partial(SMEM, SMEMOp.S_ATC_PROBE_BUFFER) +s_mov_b32 = functools.partial(SOP1, SOP1Op.S_MOV_B32) +s_mov_b64 = functools.partial(SOP1, SOP1Op.S_MOV_B64) +s_cmov_b32 = functools.partial(SOP1, SOP1Op.S_CMOV_B32) +s_cmov_b64 = functools.partial(SOP1, SOP1Op.S_CMOV_B64) +s_brev_b32 = functools.partial(SOP1, SOP1Op.S_BREV_B32) +s_brev_b64 = functools.partial(SOP1, SOP1Op.S_BREV_B64) +s_ctz_i32_b32 = functools.partial(SOP1, SOP1Op.S_CTZ_I32_B32) +s_ctz_i32_b64 = functools.partial(SOP1, SOP1Op.S_CTZ_I32_B64) +s_clz_i32_u32 = functools.partial(SOP1, SOP1Op.S_CLZ_I32_U32) +s_clz_i32_u64 = functools.partial(SOP1, SOP1Op.S_CLZ_I32_U64) +s_cls_i32 = functools.partial(SOP1, SOP1Op.S_CLS_I32) +s_cls_i32_i64 = functools.partial(SOP1, SOP1Op.S_CLS_I32_I64) +s_sext_i32_i8 = functools.partial(SOP1, SOP1Op.S_SEXT_I32_I8) +s_sext_i32_i16 = functools.partial(SOP1, SOP1Op.S_SEXT_I32_I16) +s_bitset0_b32 = functools.partial(SOP1, SOP1Op.S_BITSET0_B32) +s_bitset0_b64 = functools.partial(SOP1, SOP1Op.S_BITSET0_B64) +s_bitset1_b32 = functools.partial(SOP1, SOP1Op.S_BITSET1_B32) +s_bitset1_b64 = functools.partial(SOP1, SOP1Op.S_BITSET1_B64) +s_bitreplicate_b64_b32 = functools.partial(SOP1, SOP1Op.S_BITREPLICATE_B64_B32) +s_abs_i32 = functools.partial(SOP1, SOP1Op.S_ABS_I32) +s_bcnt0_i32_b32 = functools.partial(SOP1, SOP1Op.S_BCNT0_I32_B32) +s_bcnt0_i32_b64 = functools.partial(SOP1, SOP1Op.S_BCNT0_I32_B64) +s_bcnt1_i32_b32 = functools.partial(SOP1, SOP1Op.S_BCNT1_I32_B32) +s_bcnt1_i32_b64 = functools.partial(SOP1, SOP1Op.S_BCNT1_I32_B64) +s_quadmask_b32 = functools.partial(SOP1, SOP1Op.S_QUADMASK_B32) +s_quadmask_b64 = functools.partial(SOP1, SOP1Op.S_QUADMASK_B64) +s_wqm_b32 = functools.partial(SOP1, SOP1Op.S_WQM_B32) +s_wqm_b64 = functools.partial(SOP1, SOP1Op.S_WQM_B64) +s_not_b32 = functools.partial(SOP1, SOP1Op.S_NOT_B32) +s_not_b64 = functools.partial(SOP1, SOP1Op.S_NOT_B64) +s_and_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_SAVEEXEC_B32) +s_and_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_SAVEEXEC_B64) +s_or_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_OR_SAVEEXEC_B32) +s_or_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_OR_SAVEEXEC_B64) +s_xor_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_XOR_SAVEEXEC_B32) +s_xor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_XOR_SAVEEXEC_B64) +s_nand_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_NAND_SAVEEXEC_B32) +s_nand_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_NAND_SAVEEXEC_B64) +s_nor_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_NOR_SAVEEXEC_B32) +s_nor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_NOR_SAVEEXEC_B64) +s_xnor_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_XNOR_SAVEEXEC_B32) +s_xnor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_XNOR_SAVEEXEC_B64) +s_and_not0_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_NOT0_SAVEEXEC_B32) +s_and_not0_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_NOT0_SAVEEXEC_B64) +s_or_not0_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_OR_NOT0_SAVEEXEC_B32) +s_or_not0_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_OR_NOT0_SAVEEXEC_B64) +s_and_not1_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_NOT1_SAVEEXEC_B32) +s_and_not1_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_NOT1_SAVEEXEC_B64) +s_or_not1_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_OR_NOT1_SAVEEXEC_B32) +s_or_not1_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_OR_NOT1_SAVEEXEC_B64) +s_and_not0_wrexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_NOT0_WREXEC_B32) +s_and_not0_wrexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_NOT0_WREXEC_B64) +s_and_not1_wrexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_NOT1_WREXEC_B32) +s_and_not1_wrexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_NOT1_WREXEC_B64) +s_movrels_b32 = functools.partial(SOP1, SOP1Op.S_MOVRELS_B32) +s_movrels_b64 = functools.partial(SOP1, SOP1Op.S_MOVRELS_B64) +s_movreld_b32 = functools.partial(SOP1, SOP1Op.S_MOVRELD_B32) +s_movreld_b64 = functools.partial(SOP1, SOP1Op.S_MOVRELD_B64) +s_movrelsd_2_b32 = functools.partial(SOP1, SOP1Op.S_MOVRELSD_2_B32) +s_getpc_b64 = functools.partial(SOP1, SOP1Op.S_GETPC_B64) +s_setpc_b64 = functools.partial(SOP1, SOP1Op.S_SETPC_B64) +s_swappc_b64 = functools.partial(SOP1, SOP1Op.S_SWAPPC_B64) +s_rfe_b64 = functools.partial(SOP1, SOP1Op.S_RFE_B64) +s_sendmsg_rtn_b32 = functools.partial(SOP1, SOP1Op.S_SENDMSG_RTN_B32) +s_sendmsg_rtn_b64 = functools.partial(SOP1, SOP1Op.S_SENDMSG_RTN_B64) +s_ceil_f32 = functools.partial(SOP1, SOP1Op.S_CEIL_F32) +s_floor_f32 = functools.partial(SOP1, SOP1Op.S_FLOOR_F32) +s_trunc_f32 = functools.partial(SOP1, SOP1Op.S_TRUNC_F32) +s_rndne_f32 = functools.partial(SOP1, SOP1Op.S_RNDNE_F32) +s_cvt_f32_i32 = functools.partial(SOP1, SOP1Op.S_CVT_F32_I32) +s_cvt_f32_u32 = functools.partial(SOP1, SOP1Op.S_CVT_F32_U32) +s_cvt_i32_f32 = functools.partial(SOP1, SOP1Op.S_CVT_I32_F32) +s_cvt_u32_f32 = functools.partial(SOP1, SOP1Op.S_CVT_U32_F32) +s_cvt_f16_f32 = functools.partial(SOP1, SOP1Op.S_CVT_F16_F32) +s_cvt_f32_f16 = functools.partial(SOP1, SOP1Op.S_CVT_F32_F16) +s_cvt_hi_f32_f16 = functools.partial(SOP1, SOP1Op.S_CVT_HI_F32_F16) +s_ceil_f16 = functools.partial(SOP1, SOP1Op.S_CEIL_F16) +s_floor_f16 = functools.partial(SOP1, SOP1Op.S_FLOOR_F16) +s_trunc_f16 = functools.partial(SOP1, SOP1Op.S_TRUNC_F16) +s_rndne_f16 = functools.partial(SOP1, SOP1Op.S_RNDNE_F16) +s_add_u32 = functools.partial(SOP2, SOP2Op.S_ADD_U32) +s_sub_u32 = functools.partial(SOP2, SOP2Op.S_SUB_U32) +s_add_i32 = functools.partial(SOP2, SOP2Op.S_ADD_I32) +s_sub_i32 = functools.partial(SOP2, SOP2Op.S_SUB_I32) +s_addc_u32 = functools.partial(SOP2, SOP2Op.S_ADDC_U32) +s_subb_u32 = functools.partial(SOP2, SOP2Op.S_SUBB_U32) +s_absdiff_i32 = functools.partial(SOP2, SOP2Op.S_ABSDIFF_I32) +s_lshl_b32 = functools.partial(SOP2, SOP2Op.S_LSHL_B32) +s_lshl_b64 = functools.partial(SOP2, SOP2Op.S_LSHL_B64) +s_lshr_b32 = functools.partial(SOP2, SOP2Op.S_LSHR_B32) +s_lshr_b64 = functools.partial(SOP2, SOP2Op.S_LSHR_B64) +s_ashr_i32 = functools.partial(SOP2, SOP2Op.S_ASHR_I32) +s_ashr_i64 = functools.partial(SOP2, SOP2Op.S_ASHR_I64) +s_lshl1_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL1_ADD_U32) +s_lshl2_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL2_ADD_U32) +s_lshl3_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL3_ADD_U32) +s_lshl4_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL4_ADD_U32) +s_min_i32 = functools.partial(SOP2, SOP2Op.S_MIN_I32) +s_min_u32 = functools.partial(SOP2, SOP2Op.S_MIN_U32) +s_max_i32 = functools.partial(SOP2, SOP2Op.S_MAX_I32) +s_max_u32 = functools.partial(SOP2, SOP2Op.S_MAX_U32) +s_and_b32 = functools.partial(SOP2, SOP2Op.S_AND_B32) +s_and_b64 = functools.partial(SOP2, SOP2Op.S_AND_B64) +s_or_b32 = functools.partial(SOP2, SOP2Op.S_OR_B32) +s_or_b64 = functools.partial(SOP2, SOP2Op.S_OR_B64) +s_xor_b32 = functools.partial(SOP2, SOP2Op.S_XOR_B32) +s_xor_b64 = functools.partial(SOP2, SOP2Op.S_XOR_B64) +s_nand_b32 = functools.partial(SOP2, SOP2Op.S_NAND_B32) +s_nand_b64 = functools.partial(SOP2, SOP2Op.S_NAND_B64) +s_nor_b32 = functools.partial(SOP2, SOP2Op.S_NOR_B32) +s_nor_b64 = functools.partial(SOP2, SOP2Op.S_NOR_B64) +s_xnor_b32 = functools.partial(SOP2, SOP2Op.S_XNOR_B32) +s_xnor_b64 = functools.partial(SOP2, SOP2Op.S_XNOR_B64) +s_and_not1_b32 = functools.partial(SOP2, SOP2Op.S_AND_NOT1_B32) +s_and_not1_b64 = functools.partial(SOP2, SOP2Op.S_AND_NOT1_B64) +s_or_not1_b32 = functools.partial(SOP2, SOP2Op.S_OR_NOT1_B32) +s_or_not1_b64 = functools.partial(SOP2, SOP2Op.S_OR_NOT1_B64) +s_bfe_u32 = functools.partial(SOP2, SOP2Op.S_BFE_U32) +s_bfe_i32 = functools.partial(SOP2, SOP2Op.S_BFE_I32) +s_bfe_u64 = functools.partial(SOP2, SOP2Op.S_BFE_U64) +s_bfe_i64 = functools.partial(SOP2, SOP2Op.S_BFE_I64) +s_bfm_b32 = functools.partial(SOP2, SOP2Op.S_BFM_B32) +s_bfm_b64 = functools.partial(SOP2, SOP2Op.S_BFM_B64) +s_mul_i32 = functools.partial(SOP2, SOP2Op.S_MUL_I32) +s_mul_hi_u32 = functools.partial(SOP2, SOP2Op.S_MUL_HI_U32) +s_mul_hi_i32 = functools.partial(SOP2, SOP2Op.S_MUL_HI_I32) +s_cselect_b32 = functools.partial(SOP2, SOP2Op.S_CSELECT_B32) +s_cselect_b64 = functools.partial(SOP2, SOP2Op.S_CSELECT_B64) +s_pack_ll_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_LL_B32_B16) +s_pack_lh_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_LH_B32_B16) +s_pack_hh_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_HH_B32_B16) +s_pack_hl_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_HL_B32_B16) +s_add_f32 = functools.partial(SOP2, SOP2Op.S_ADD_F32) +s_sub_f32 = functools.partial(SOP2, SOP2Op.S_SUB_F32) +s_min_f32 = functools.partial(SOP2, SOP2Op.S_MIN_F32) +s_max_f32 = functools.partial(SOP2, SOP2Op.S_MAX_F32) +s_mul_f32 = functools.partial(SOP2, SOP2Op.S_MUL_F32) +s_fmaak_f32 = functools.partial(SOP2_LIT, SOP2Op.S_FMAAK_F32) +s_fmamk_f32 = functools.partial(SOP2_LIT, SOP2Op.S_FMAMK_F32) +s_fmac_f32 = functools.partial(SOP2, SOP2Op.S_FMAC_F32) +s_cvt_pk_rtz_f16_f32 = functools.partial(SOP2, SOP2Op.S_CVT_PK_RTZ_F16_F32) +s_add_f16 = functools.partial(SOP2, SOP2Op.S_ADD_F16) +s_sub_f16 = functools.partial(SOP2, SOP2Op.S_SUB_F16) +s_min_f16 = functools.partial(SOP2, SOP2Op.S_MIN_F16) +s_max_f16 = functools.partial(SOP2, SOP2Op.S_MAX_F16) +s_mul_f16 = functools.partial(SOP2, SOP2Op.S_MUL_F16) +s_fmac_f16 = functools.partial(SOP2, SOP2Op.S_FMAC_F16) +s_cmp_eq_i32 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_I32) +s_cmp_lg_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LG_I32) +s_cmp_gt_i32 = functools.partial(SOPC, SOPCOp.S_CMP_GT_I32) +s_cmp_ge_i32 = functools.partial(SOPC, SOPCOp.S_CMP_GE_I32) +s_cmp_lt_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LT_I32) +s_cmp_le_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LE_I32) +s_cmp_eq_u32 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_U32) +s_cmp_lg_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LG_U32) +s_cmp_gt_u32 = functools.partial(SOPC, SOPCOp.S_CMP_GT_U32) +s_cmp_ge_u32 = functools.partial(SOPC, SOPCOp.S_CMP_GE_U32) +s_cmp_lt_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LT_U32) +s_cmp_le_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LE_U32) +s_bitcmp0_b32 = functools.partial(SOPC, SOPCOp.S_BITCMP0_B32) +s_bitcmp1_b32 = functools.partial(SOPC, SOPCOp.S_BITCMP1_B32) +s_bitcmp0_b64 = functools.partial(SOPC, SOPCOp.S_BITCMP0_B64) +s_bitcmp1_b64 = functools.partial(SOPC, SOPCOp.S_BITCMP1_B64) +s_cmp_eq_u64 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_U64) +s_cmp_lg_u64 = functools.partial(SOPC, SOPCOp.S_CMP_LG_U64) +s_cmp_lt_f32 = functools.partial(SOPC, SOPCOp.S_CMP_LT_F32) +s_cmp_eq_f32 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_F32) +s_cmp_le_f32 = functools.partial(SOPC, SOPCOp.S_CMP_LE_F32) +s_cmp_gt_f32 = functools.partial(SOPC, SOPCOp.S_CMP_GT_F32) +s_cmp_lg_f32 = functools.partial(SOPC, SOPCOp.S_CMP_LG_F32) +s_cmp_ge_f32 = functools.partial(SOPC, SOPCOp.S_CMP_GE_F32) +s_cmp_o_f32 = functools.partial(SOPC, SOPCOp.S_CMP_O_F32) +s_cmp_u_f32 = functools.partial(SOPC, SOPCOp.S_CMP_U_F32) +s_cmp_nge_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NGE_F32) +s_cmp_nlg_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NLG_F32) +s_cmp_ngt_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NGT_F32) +s_cmp_nle_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NLE_F32) +s_cmp_neq_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NEQ_F32) +s_cmp_nlt_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NLT_F32) +s_cmp_lt_f16 = functools.partial(SOPC, SOPCOp.S_CMP_LT_F16) +s_cmp_eq_f16 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_F16) +s_cmp_le_f16 = functools.partial(SOPC, SOPCOp.S_CMP_LE_F16) +s_cmp_gt_f16 = functools.partial(SOPC, SOPCOp.S_CMP_GT_F16) +s_cmp_lg_f16 = functools.partial(SOPC, SOPCOp.S_CMP_LG_F16) +s_cmp_ge_f16 = functools.partial(SOPC, SOPCOp.S_CMP_GE_F16) +s_cmp_o_f16 = functools.partial(SOPC, SOPCOp.S_CMP_O_F16) +s_cmp_u_f16 = functools.partial(SOPC, SOPCOp.S_CMP_U_F16) +s_cmp_nge_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NGE_F16) +s_cmp_nlg_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NLG_F16) +s_cmp_ngt_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NGT_F16) +s_cmp_nle_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NLE_F16) +s_cmp_neq_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NEQ_F16) +s_cmp_nlt_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NLT_F16) +s_movk_i32 = functools.partial(SOPK, SOPKOp.S_MOVK_I32) +s_version = functools.partial(SOPK, SOPKOp.S_VERSION) +s_cmovk_i32 = functools.partial(SOPK, SOPKOp.S_CMOVK_I32) +s_cmpk_eq_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_EQ_I32) +s_cmpk_lg_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_LG_I32) +s_cmpk_gt_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_GT_I32) +s_cmpk_ge_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_GE_I32) +s_cmpk_lt_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_LT_I32) +s_cmpk_le_i32 = functools.partial(SOPK, SOPKOp.S_CMPK_LE_I32) +s_cmpk_eq_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_EQ_U32) +s_cmpk_lg_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_LG_U32) +s_cmpk_gt_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_GT_U32) +s_cmpk_ge_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_GE_U32) +s_cmpk_lt_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_LT_U32) +s_cmpk_le_u32 = functools.partial(SOPK, SOPKOp.S_CMPK_LE_U32) +s_addk_i32 = functools.partial(SOPK, SOPKOp.S_ADDK_I32) +s_mulk_i32 = functools.partial(SOPK, SOPKOp.S_MULK_I32) +s_getreg_b32 = functools.partial(SOPK, SOPKOp.S_GETREG_B32) +s_setreg_b32 = functools.partial(SOPK, SOPKOp.S_SETREG_B32) +s_setreg_imm32_b32 = functools.partial(SOPK_LIT, SOPKOp.S_SETREG_IMM32_B32) +s_call_b64 = functools.partial(SOPK, SOPKOp.S_CALL_B64) +s_subvector_loop_begin = functools.partial(SOPK, SOPKOp.S_SUBVECTOR_LOOP_BEGIN) +s_subvector_loop_end = functools.partial(SOPK, SOPKOp.S_SUBVECTOR_LOOP_END) +s_waitcnt_vscnt = functools.partial(SOPK, SOPKOp.S_WAITCNT_VSCNT) +s_waitcnt_vmcnt = functools.partial(SOPK, SOPKOp.S_WAITCNT_VMCNT) +s_waitcnt_expcnt = functools.partial(SOPK, SOPKOp.S_WAITCNT_EXPCNT) +s_waitcnt_lgkmcnt = functools.partial(SOPK, SOPKOp.S_WAITCNT_LGKMCNT) +s_nop = functools.partial(SOPP, SOPPOp.S_NOP) +s_setkill = functools.partial(SOPP, SOPPOp.S_SETKILL) +s_sethalt = functools.partial(SOPP, SOPPOp.S_SETHALT) +s_sleep = functools.partial(SOPP, SOPPOp.S_SLEEP) +s_set_inst_prefetch_distance = functools.partial(SOPP, SOPPOp.S_SET_INST_PREFETCH_DISTANCE) +s_clause = functools.partial(SOPP, SOPPOp.S_CLAUSE) +s_delay_alu = functools.partial(SOPP, SOPPOp.S_DELAY_ALU) +s_waitcnt_depctr = functools.partial(SOPP, SOPPOp.S_WAITCNT_DEPCTR) +s_waitcnt = functools.partial(SOPP, SOPPOp.S_WAITCNT) +s_wait_idle = functools.partial(SOPP, SOPPOp.S_WAIT_IDLE) +s_wait_event = functools.partial(SOPP, SOPPOp.S_WAIT_EVENT) +s_trap = functools.partial(SOPP, SOPPOp.S_TRAP) +s_round_mode = functools.partial(SOPP, SOPPOp.S_ROUND_MODE) +s_denorm_mode = functools.partial(SOPP, SOPPOp.S_DENORM_MODE) +s_code_end = functools.partial(SOPP, SOPPOp.S_CODE_END) +s_branch = functools.partial(SOPP, SOPPOp.S_BRANCH) +s_cbranch_scc0 = functools.partial(SOPP, SOPPOp.S_CBRANCH_SCC0) +s_cbranch_scc1 = functools.partial(SOPP, SOPPOp.S_CBRANCH_SCC1) +s_cbranch_vccz = functools.partial(SOPP, SOPPOp.S_CBRANCH_VCCZ) +s_cbranch_vccnz = functools.partial(SOPP, SOPPOp.S_CBRANCH_VCCNZ) +s_cbranch_execz = functools.partial(SOPP, SOPPOp.S_CBRANCH_EXECZ) +s_cbranch_execnz = functools.partial(SOPP, SOPPOp.S_CBRANCH_EXECNZ) +s_cbranch_cdbgsys = functools.partial(SOPP, SOPPOp.S_CBRANCH_CDBGSYS) +s_cbranch_cdbguser = functools.partial(SOPP, SOPPOp.S_CBRANCH_CDBGUSER) +s_cbranch_cdbgsys_or_user = functools.partial(SOPP, SOPPOp.S_CBRANCH_CDBGSYS_OR_USER) +s_cbranch_cdbgsys_and_user = functools.partial(SOPP, SOPPOp.S_CBRANCH_CDBGSYS_AND_USER) +s_endpgm = functools.partial(SOPP, SOPPOp.S_ENDPGM) +s_endpgm_saved = functools.partial(SOPP, SOPPOp.S_ENDPGM_SAVED) +s_endpgm_ordered_ps_done = functools.partial(SOPP, SOPPOp.S_ENDPGM_ORDERED_PS_DONE) +s_wakeup = functools.partial(SOPP, SOPPOp.S_WAKEUP) +s_setprio = functools.partial(SOPP, SOPPOp.S_SETPRIO) +s_sendmsg = functools.partial(SOPP, SOPPOp.S_SENDMSG) +s_sendmsghalt = functools.partial(SOPP, SOPPOp.S_SENDMSGHALT) +s_incperflevel = functools.partial(SOPP, SOPPOp.S_INCPERFLEVEL) +s_decperflevel = functools.partial(SOPP, SOPPOp.S_DECPERFLEVEL) +s_ttracedata = functools.partial(SOPP, SOPPOp.S_TTRACEDATA) +s_ttracedata_imm = functools.partial(SOPP, SOPPOp.S_TTRACEDATA_IMM) +s_icache_inv = functools.partial(SOPP, SOPPOp.S_ICACHE_INV) +s_barrier = functools.partial(SOPP, SOPPOp.S_BARRIER) +v_interp_p10_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P10_F32) +v_interp_p2_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P2_F32) +v_interp_p10_f16_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P10_F16_F32) +v_interp_p2_f16_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P2_F16_F32) +v_interp_p10_rtz_f16_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P10_RTZ_F16_F32) +v_interp_p2_rtz_f16_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P2_RTZ_F16_F32) +v_nop_e32 = functools.partial(VOP1, VOP1Op.V_NOP_E32) +v_mov_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOV_B32_E32) +v_readfirstlane_b32_e32 = functools.partial(VOP1_SDST, VOP1Op.V_READFIRSTLANE_B32_E32) +v_cvt_i32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I32_F64_E32) +v_cvt_f64_i32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_I32_E32) +v_cvt_f32_i32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_I32_E32) +v_cvt_f32_u32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_U32_E32) +v_cvt_u32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U32_F32_E32) +v_cvt_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I32_F32_E32) +v_cvt_f16_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_F32_E32) +v_cvt_f32_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_F16_E32) +v_cvt_nearest_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_NEAREST_I32_F32_E32) +v_cvt_floor_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_FLOOR_I32_F32_E32) +v_cvt_off_f32_i4_e32 = functools.partial(VOP1, VOP1Op.V_CVT_OFF_F32_I4_E32) +v_cvt_f32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_F64_E32) +v_cvt_f64_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_F32_E32) +v_cvt_f32_ubyte0_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE0_E32) +v_cvt_f32_ubyte1_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE1_E32) +v_cvt_f32_ubyte2_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE2_E32) +v_cvt_f32_ubyte3_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE3_E32) +v_cvt_u32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U32_F64_E32) +v_cvt_f64_u32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_U32_E32) +v_trunc_f64_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F64_E32) +v_ceil_f64_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F64_E32) +v_rndne_f64_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F64_E32) +v_floor_f64_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F64_E32) +v_pipeflush_e32 = functools.partial(VOP1, VOP1Op.V_PIPEFLUSH_E32) +v_mov_b16_e32 = functools.partial(VOP1, VOP1Op.V_MOV_B16_E32) +v_fract_f32_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F32_E32) +v_trunc_f32_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F32_E32) +v_ceil_f32_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F32_E32) +v_rndne_f32_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F32_E32) +v_floor_f32_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F32_E32) +v_exp_f32_e32 = functools.partial(VOP1, VOP1Op.V_EXP_F32_E32) +v_log_f32_e32 = functools.partial(VOP1, VOP1Op.V_LOG_F32_E32) +v_rcp_f32_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F32_E32) +v_rcp_iflag_f32_e32 = functools.partial(VOP1, VOP1Op.V_RCP_IFLAG_F32_E32) +v_rsq_f32_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F32_E32) +v_rcp_f64_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F64_E32) +v_rsq_f64_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F64_E32) +v_sqrt_f32_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F32_E32) +v_sqrt_f64_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F64_E32) +v_sin_f32_e32 = functools.partial(VOP1, VOP1Op.V_SIN_F32_E32) +v_cos_f32_e32 = functools.partial(VOP1, VOP1Op.V_COS_F32_E32) +v_not_b32_e32 = functools.partial(VOP1, VOP1Op.V_NOT_B32_E32) +v_bfrev_b32_e32 = functools.partial(VOP1, VOP1Op.V_BFREV_B32_E32) +v_clz_i32_u32_e32 = functools.partial(VOP1, VOP1Op.V_CLZ_I32_U32_E32) +v_ctz_i32_b32_e32 = functools.partial(VOP1, VOP1Op.V_CTZ_I32_B32_E32) +v_cls_i32_e32 = functools.partial(VOP1, VOP1Op.V_CLS_I32_E32) +v_frexp_exp_i32_f64_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I32_F64_E32) +v_frexp_mant_f64_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F64_E32) +v_fract_f64_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F64_E32) +v_frexp_exp_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I32_F32_E32) +v_frexp_mant_f32_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F32_E32) +v_movreld_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOVRELD_B32_E32) +v_movrels_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOVRELS_B32_E32) +v_movrelsd_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOVRELSD_B32_E32) +v_movrelsd_2_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOVRELSD_2_B32_E32) +v_cvt_f16_u16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_U16_E32) +v_cvt_f16_i16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_I16_E32) +v_cvt_u16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U16_F16_E32) +v_cvt_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I16_F16_E32) +v_rcp_f16_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F16_E32) +v_sqrt_f16_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F16_E32) +v_rsq_f16_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F16_E32) +v_log_f16_e32 = functools.partial(VOP1, VOP1Op.V_LOG_F16_E32) +v_exp_f16_e32 = functools.partial(VOP1, VOP1Op.V_EXP_F16_E32) +v_frexp_mant_f16_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F16_E32) +v_frexp_exp_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I16_F16_E32) +v_floor_f16_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F16_E32) +v_ceil_f16_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F16_E32) +v_trunc_f16_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F16_E32) +v_rndne_f16_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F16_E32) +v_fract_f16_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F16_E32) +v_sin_f16_e32 = functools.partial(VOP1, VOP1Op.V_SIN_F16_E32) +v_cos_f16_e32 = functools.partial(VOP1, VOP1Op.V_COS_F16_E32) +v_sat_pk_u8_i16_e32 = functools.partial(VOP1, VOP1Op.V_SAT_PK_U8_I16_E32) +v_cvt_norm_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_NORM_I16_F16_E32) +v_cvt_norm_u16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_NORM_U16_F16_E32) +v_swap_b32_e32 = functools.partial(VOP1, VOP1Op.V_SWAP_B32_E32) +v_swap_b16_e32 = functools.partial(VOP1, VOP1Op.V_SWAP_B16_E32) +v_permlane64_b32_e32 = functools.partial(VOP1, VOP1Op.V_PERMLANE64_B32_E32) +v_swaprel_b32_e32 = functools.partial(VOP1, VOP1Op.V_SWAPREL_B32_E32) +v_not_b16_e32 = functools.partial(VOP1, VOP1Op.V_NOT_B16_E32) +v_cvt_i32_i16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I32_I16_E32) +v_cvt_u32_u16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U32_U16_E32) +v_cndmask_b32_e32 = functools.partial(VOP2, VOP2Op.V_CNDMASK_B32_E32) +v_dot2acc_f32_f16_e32 = functools.partial(VOP2, VOP2Op.V_DOT2ACC_F32_F16_E32) +v_add_f32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_F32_E32) +v_sub_f32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_F32_E32) +v_subrev_f32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_F32_E32) +v_fmac_dx9_zero_f32_e32 = functools.partial(VOP2, VOP2Op.V_FMAC_DX9_ZERO_F32_E32) +v_mul_dx9_zero_f32_e32 = functools.partial(VOP2, VOP2Op.V_MUL_DX9_ZERO_F32_E32) +v_mul_f32_e32 = functools.partial(VOP2, VOP2Op.V_MUL_F32_E32) +v_mul_i32_i24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_I32_I24_E32) +v_mul_hi_i32_i24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_HI_I32_I24_E32) +v_mul_u32_u24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_U32_U24_E32) +v_mul_hi_u32_u24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_HI_U32_U24_E32) +v_min_f32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_F32_E32) +v_max_f32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_F32_E32) +v_min_i32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_I32_E32) +v_max_i32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_I32_E32) +v_min_u32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_U32_E32) +v_max_u32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_U32_E32) +v_lshlrev_b32_e32 = functools.partial(VOP2, VOP2Op.V_LSHLREV_B32_E32) +v_lshrrev_b32_e32 = functools.partial(VOP2, VOP2Op.V_LSHRREV_B32_E32) +v_ashrrev_i32_e32 = functools.partial(VOP2, VOP2Op.V_ASHRREV_I32_E32) +v_and_b32_e32 = functools.partial(VOP2, VOP2Op.V_AND_B32_E32) +v_or_b32_e32 = functools.partial(VOP2, VOP2Op.V_OR_B32_E32) +v_xor_b32_e32 = functools.partial(VOP2, VOP2Op.V_XOR_B32_E32) +v_xnor_b32_e32 = functools.partial(VOP2, VOP2Op.V_XNOR_B32_E32) +v_add_co_ci_u32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_CO_CI_U32_E32) +v_sub_co_ci_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_CO_CI_U32_E32) +v_subrev_co_ci_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_CO_CI_U32_E32) +v_add_nc_u32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_NC_U32_E32) +v_sub_nc_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_NC_U32_E32) +v_subrev_nc_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_NC_U32_E32) +v_fmac_f32_e32 = functools.partial(VOP2, VOP2Op.V_FMAC_F32_E32) +v_fmamk_f32_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAMK_F32_E32) +v_fmaak_f32_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAAK_F32_E32) +v_cvt_pk_rtz_f16_f32_e32 = functools.partial(VOP2, VOP2Op.V_CVT_PK_RTZ_F16_F32_E32) +v_add_f16_e32 = functools.partial(VOP2, VOP2Op.V_ADD_F16_E32) +v_sub_f16_e32 = functools.partial(VOP2, VOP2Op.V_SUB_F16_E32) +v_subrev_f16_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_F16_E32) +v_mul_f16_e32 = functools.partial(VOP2, VOP2Op.V_MUL_F16_E32) +v_fmac_f16_e32 = functools.partial(VOP2, VOP2Op.V_FMAC_F16_E32) +v_fmamk_f16_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAMK_F16_E32) +v_fmaak_f16_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAAK_F16_E32) +v_max_f16_e32 = functools.partial(VOP2, VOP2Op.V_MAX_F16_E32) +v_min_f16_e32 = functools.partial(VOP2, VOP2Op.V_MIN_F16_E32) +v_ldexp_f16_e32 = functools.partial(VOP2, VOP2Op.V_LDEXP_F16_E32) +v_pk_fmac_f16_e32 = functools.partial(VOP2, VOP2Op.V_PK_FMAC_F16_E32) +v_cmp_f_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_F16_E64) +v_cmp_lt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F16_E64) +v_cmp_eq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F16_E64) +v_cmp_le_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F16_E64) +v_cmp_gt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F16_E64) +v_cmp_lg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F16_E64) +v_cmp_ge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F16_E64) +v_cmp_o_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F16_E64) +v_cmp_u_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F16_E64) +v_cmp_nge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F16_E64) +v_cmp_nlg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F16_E64) +v_cmp_ngt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F16_E64) +v_cmp_nle_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F16_E64) +v_cmp_neq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F16_E64) +v_cmp_nlt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F16_E64) +v_cmp_t_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_F16_E64) +v_cmp_f_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_F32_E64) +v_cmp_lt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F32_E64) +v_cmp_eq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F32_E64) +v_cmp_le_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F32_E64) +v_cmp_gt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F32_E64) +v_cmp_lg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F32_E64) +v_cmp_ge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F32_E64) +v_cmp_o_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F32_E64) +v_cmp_u_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F32_E64) +v_cmp_nge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F32_E64) +v_cmp_nlg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F32_E64) +v_cmp_ngt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F32_E64) +v_cmp_nle_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F32_E64) +v_cmp_neq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F32_E64) +v_cmp_nlt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F32_E64) +v_cmp_t_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_F32_E64) +v_cmp_f_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_F64_E64) +v_cmp_lt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F64_E64) +v_cmp_eq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F64_E64) +v_cmp_le_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F64_E64) +v_cmp_gt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F64_E64) +v_cmp_lg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F64_E64) +v_cmp_ge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F64_E64) +v_cmp_o_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F64_E64) +v_cmp_u_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F64_E64) +v_cmp_nge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F64_E64) +v_cmp_nlg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F64_E64) +v_cmp_ngt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F64_E64) +v_cmp_nle_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F64_E64) +v_cmp_neq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F64_E64) +v_cmp_nlt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F64_E64) +v_cmp_t_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_F64_E64) +v_cmp_lt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I16_E64) +v_cmp_eq_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I16_E64) +v_cmp_le_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I16_E64) +v_cmp_gt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I16_E64) +v_cmp_ne_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I16_E64) +v_cmp_ge_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I16_E64) +v_cmp_lt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U16_E64) +v_cmp_eq_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U16_E64) +v_cmp_le_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U16_E64) +v_cmp_gt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U16_E64) +v_cmp_ne_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U16_E64) +v_cmp_ge_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U16_E64) +v_cmp_f_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_I32_E64) +v_cmp_lt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I32_E64) +v_cmp_eq_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I32_E64) +v_cmp_le_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I32_E64) +v_cmp_gt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I32_E64) +v_cmp_ne_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I32_E64) +v_cmp_ge_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I32_E64) +v_cmp_t_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_I32_E64) +v_cmp_f_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_U32_E64) +v_cmp_lt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U32_E64) +v_cmp_eq_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U32_E64) +v_cmp_le_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U32_E64) +v_cmp_gt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U32_E64) +v_cmp_ne_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U32_E64) +v_cmp_ge_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U32_E64) +v_cmp_t_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_U32_E64) +v_cmp_f_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_I64_E64) +v_cmp_lt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I64_E64) +v_cmp_eq_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I64_E64) +v_cmp_le_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I64_E64) +v_cmp_gt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I64_E64) +v_cmp_ne_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I64_E64) +v_cmp_ge_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I64_E64) +v_cmp_t_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_I64_E64) +v_cmp_f_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_F_U64_E64) +v_cmp_lt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U64_E64) +v_cmp_eq_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U64_E64) +v_cmp_le_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U64_E64) +v_cmp_gt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U64_E64) +v_cmp_ne_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U64_E64) +v_cmp_ge_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U64_E64) +v_cmp_t_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_T_U64_E64) +v_cmp_class_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F16_E64) +v_cmp_class_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F32_E64) +v_cmp_class_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F64_E64) +v_cmpx_f_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_F16_E64) +v_cmpx_lt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F16_E64) +v_cmpx_eq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F16_E64) +v_cmpx_le_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F16_E64) +v_cmpx_gt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F16_E64) +v_cmpx_lg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F16_E64) +v_cmpx_ge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F16_E64) +v_cmpx_o_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F16_E64) +v_cmpx_u_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F16_E64) +v_cmpx_nge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F16_E64) +v_cmpx_nlg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F16_E64) +v_cmpx_ngt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F16_E64) +v_cmpx_nle_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F16_E64) +v_cmpx_neq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F16_E64) +v_cmpx_nlt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F16_E64) +v_cmpx_t_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_F16_E64) +v_cmpx_f_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_F32_E64) +v_cmpx_lt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F32_E64) +v_cmpx_eq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F32_E64) +v_cmpx_le_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F32_E64) +v_cmpx_gt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F32_E64) +v_cmpx_lg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F32_E64) +v_cmpx_ge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F32_E64) +v_cmpx_o_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F32_E64) +v_cmpx_u_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F32_E64) +v_cmpx_nge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F32_E64) +v_cmpx_nlg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F32_E64) +v_cmpx_ngt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F32_E64) +v_cmpx_nle_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F32_E64) +v_cmpx_neq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F32_E64) +v_cmpx_nlt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F32_E64) +v_cmpx_t_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_F32_E64) +v_cmpx_f_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_F64_E64) +v_cmpx_lt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F64_E64) +v_cmpx_eq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F64_E64) +v_cmpx_le_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F64_E64) +v_cmpx_gt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F64_E64) +v_cmpx_lg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F64_E64) +v_cmpx_ge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F64_E64) +v_cmpx_o_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F64_E64) +v_cmpx_u_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F64_E64) +v_cmpx_nge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F64_E64) +v_cmpx_nlg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F64_E64) +v_cmpx_ngt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F64_E64) +v_cmpx_nle_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F64_E64) +v_cmpx_neq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F64_E64) +v_cmpx_nlt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F64_E64) +v_cmpx_t_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_F64_E64) +v_cmpx_lt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I16_E64) +v_cmpx_eq_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I16_E64) +v_cmpx_le_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I16_E64) +v_cmpx_gt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I16_E64) +v_cmpx_ne_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I16_E64) +v_cmpx_ge_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I16_E64) +v_cmpx_lt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U16_E64) +v_cmpx_eq_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U16_E64) +v_cmpx_le_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U16_E64) +v_cmpx_gt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U16_E64) +v_cmpx_ne_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U16_E64) +v_cmpx_ge_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U16_E64) +v_cmpx_f_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_I32_E64) +v_cmpx_lt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I32_E64) +v_cmpx_eq_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I32_E64) +v_cmpx_le_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I32_E64) +v_cmpx_gt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I32_E64) +v_cmpx_ne_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I32_E64) +v_cmpx_ge_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I32_E64) +v_cmpx_t_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_I32_E64) +v_cmpx_f_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_U32_E64) +v_cmpx_lt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U32_E64) +v_cmpx_eq_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U32_E64) +v_cmpx_le_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U32_E64) +v_cmpx_gt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U32_E64) +v_cmpx_ne_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U32_E64) +v_cmpx_ge_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U32_E64) +v_cmpx_t_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_U32_E64) +v_cmpx_f_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_I64_E64) +v_cmpx_lt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I64_E64) +v_cmpx_eq_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I64_E64) +v_cmpx_le_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I64_E64) +v_cmpx_gt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I64_E64) +v_cmpx_ne_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I64_E64) +v_cmpx_ge_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I64_E64) +v_cmpx_t_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_I64_E64) +v_cmpx_f_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_F_U64_E64) +v_cmpx_lt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U64_E64) +v_cmpx_eq_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U64_E64) +v_cmpx_le_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U64_E64) +v_cmpx_gt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U64_E64) +v_cmpx_ne_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U64_E64) +v_cmpx_ge_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U64_E64) +v_cmpx_t_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_T_U64_E64) +v_cmpx_class_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F16_E64) +v_cmpx_class_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F32_E64) +v_cmpx_class_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F64_E64) +v_cndmask_b32_e64 = functools.partial(VOP3, VOP3Op.V_CNDMASK_B32_E64) +v_add_f32_e64 = functools.partial(VOP3, VOP3Op.V_ADD_F32_E64) +v_sub_f32_e64 = functools.partial(VOP3, VOP3Op.V_SUB_F32_E64) +v_subrev_f32_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_F32_E64) +v_fmac_dx9_zero_f32_e64 = functools.partial(VOP3, VOP3Op.V_FMAC_DX9_ZERO_F32_E64) +v_mul_dx9_zero_f32_e64 = functools.partial(VOP3, VOP3Op.V_MUL_DX9_ZERO_F32_E64) +v_mul_f32_e64 = functools.partial(VOP3, VOP3Op.V_MUL_F32_E64) +v_mul_i32_i24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_I32_I24_E64) +v_mul_hi_i32_i24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_HI_I32_I24_E64) +v_mul_u32_u24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_U32_U24_E64) +v_mul_hi_u32_u24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_HI_U32_U24_E64) +v_min_f32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_F32_E64) +v_max_f32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_F32_E64) +v_min_i32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_I32_E64) +v_max_i32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_I32_E64) +v_min_u32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_U32_E64) +v_max_u32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_U32_E64) +v_lshlrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B32_E64) +v_lshrrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B32_E64) +v_ashrrev_i32_e64 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I32_E64) +v_and_b32_e64 = functools.partial(VOP3, VOP3Op.V_AND_B32_E64) +v_or_b32_e64 = functools.partial(VOP3, VOP3Op.V_OR_B32_E64) +v_xor_b32_e64 = functools.partial(VOP3, VOP3Op.V_XOR_B32_E64) +v_xnor_b32_e64 = functools.partial(VOP3, VOP3Op.V_XNOR_B32_E64) +v_add_nc_u32_e64 = functools.partial(VOP3, VOP3Op.V_ADD_NC_U32_E64) +v_sub_nc_u32_e64 = functools.partial(VOP3, VOP3Op.V_SUB_NC_U32_E64) +v_subrev_nc_u32_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_NC_U32_E64) +v_fmac_f32_e64 = functools.partial(VOP3, VOP3Op.V_FMAC_F32_E64) +v_cvt_pk_rtz_f16_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_PK_RTZ_F16_F32_E64) +v_add_f16_e64 = functools.partial(VOP3, VOP3Op.V_ADD_F16_E64) +v_sub_f16_e64 = functools.partial(VOP3, VOP3Op.V_SUB_F16_E64) +v_subrev_f16_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_F16_E64) +v_mul_f16_e64 = functools.partial(VOP3, VOP3Op.V_MUL_F16_E64) +v_fmac_f16_e64 = functools.partial(VOP3, VOP3Op.V_FMAC_F16_E64) +v_max_f16_e64 = functools.partial(VOP3, VOP3Op.V_MAX_F16_E64) +v_min_f16_e64 = functools.partial(VOP3, VOP3Op.V_MIN_F16_E64) +v_ldexp_f16_e64 = functools.partial(VOP3, VOP3Op.V_LDEXP_F16_E64) +v_nop_e64 = functools.partial(VOP3, VOP3Op.V_NOP_E64) +v_mov_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOV_B32_E64) +v_readfirstlane_b32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_READFIRSTLANE_B32_E64) +v_cvt_i32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I32_F64_E64) +v_cvt_f64_i32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_I32_E64) +v_cvt_f32_i32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_I32_E64) +v_cvt_f32_u32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_U32_E64) +v_cvt_u32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U32_F32_E64) +v_cvt_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I32_F32_E64) +v_cvt_f16_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_F32_E64) +v_cvt_f32_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_F16_E64) +v_cvt_nearest_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_NEAREST_I32_F32_E64) +v_cvt_floor_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_FLOOR_I32_F32_E64) +v_cvt_off_f32_i4_e64 = functools.partial(VOP3, VOP3Op.V_CVT_OFF_F32_I4_E64) +v_cvt_f32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_F64_E64) +v_cvt_f64_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_F32_E64) +v_cvt_f32_ubyte0_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE0_E64) +v_cvt_f32_ubyte1_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE1_E64) +v_cvt_f32_ubyte2_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE2_E64) +v_cvt_f32_ubyte3_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE3_E64) +v_cvt_u32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U32_F64_E64) +v_cvt_f64_u32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_U32_E64) +v_trunc_f64_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F64_E64) +v_ceil_f64_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F64_E64) +v_rndne_f64_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F64_E64) +v_floor_f64_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F64_E64) +v_pipeflush_e64 = functools.partial(VOP3, VOP3Op.V_PIPEFLUSH_E64) +v_mov_b16_e64 = functools.partial(VOP3, VOP3Op.V_MOV_B16_E64) +v_fract_f32_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F32_E64) +v_trunc_f32_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F32_E64) +v_ceil_f32_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F32_E64) +v_rndne_f32_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F32_E64) +v_floor_f32_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F32_E64) +v_exp_f32_e64 = functools.partial(VOP3, VOP3Op.V_EXP_F32_E64) +v_log_f32_e64 = functools.partial(VOP3, VOP3Op.V_LOG_F32_E64) +v_rcp_f32_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F32_E64) +v_rcp_iflag_f32_e64 = functools.partial(VOP3, VOP3Op.V_RCP_IFLAG_F32_E64) +v_rsq_f32_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F32_E64) +v_rcp_f64_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F64_E64) +v_rsq_f64_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F64_E64) +v_sqrt_f32_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F32_E64) +v_sqrt_f64_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F64_E64) +v_sin_f32_e64 = functools.partial(VOP3, VOP3Op.V_SIN_F32_E64) +v_cos_f32_e64 = functools.partial(VOP3, VOP3Op.V_COS_F32_E64) +v_not_b32_e64 = functools.partial(VOP3, VOP3Op.V_NOT_B32_E64) +v_bfrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_BFREV_B32_E64) +v_clz_i32_u32_e64 = functools.partial(VOP3, VOP3Op.V_CLZ_I32_U32_E64) +v_ctz_i32_b32_e64 = functools.partial(VOP3, VOP3Op.V_CTZ_I32_B32_E64) +v_cls_i32_e64 = functools.partial(VOP3, VOP3Op.V_CLS_I32_E64) +v_frexp_exp_i32_f64_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I32_F64_E64) +v_frexp_mant_f64_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F64_E64) +v_fract_f64_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F64_E64) +v_frexp_exp_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I32_F32_E64) +v_frexp_mant_f32_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F32_E64) +v_movreld_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOVRELD_B32_E64) +v_movrels_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOVRELS_B32_E64) +v_movrelsd_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOVRELSD_B32_E64) +v_movrelsd_2_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOVRELSD_2_B32_E64) +v_cvt_f16_u16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_U16_E64) +v_cvt_f16_i16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_I16_E64) +v_cvt_u16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U16_F16_E64) +v_cvt_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I16_F16_E64) +v_rcp_f16_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F16_E64) +v_sqrt_f16_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F16_E64) +v_rsq_f16_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F16_E64) +v_log_f16_e64 = functools.partial(VOP3, VOP3Op.V_LOG_F16_E64) +v_exp_f16_e64 = functools.partial(VOP3, VOP3Op.V_EXP_F16_E64) +v_frexp_mant_f16_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F16_E64) +v_frexp_exp_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I16_F16_E64) +v_floor_f16_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F16_E64) +v_ceil_f16_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F16_E64) +v_trunc_f16_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F16_E64) +v_rndne_f16_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F16_E64) +v_fract_f16_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F16_E64) +v_sin_f16_e64 = functools.partial(VOP3, VOP3Op.V_SIN_F16_E64) +v_cos_f16_e64 = functools.partial(VOP3, VOP3Op.V_COS_F16_E64) +v_sat_pk_u8_i16_e64 = functools.partial(VOP3, VOP3Op.V_SAT_PK_U8_I16_E64) +v_cvt_norm_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_NORM_I16_F16_E64) +v_cvt_norm_u16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_NORM_U16_F16_E64) +v_not_b16_e64 = functools.partial(VOP3, VOP3Op.V_NOT_B16_E64) +v_cvt_i32_i16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I32_I16_E64) +v_cvt_u32_u16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U32_U16_E64) +v_fma_dx9_zero_f32 = functools.partial(VOP3, VOP3Op.V_FMA_DX9_ZERO_F32) +v_mad_i32_i24 = functools.partial(VOP3, VOP3Op.V_MAD_I32_I24) +v_mad_u32_u24 = functools.partial(VOP3, VOP3Op.V_MAD_U32_U24) +v_cubeid_f32 = functools.partial(VOP3, VOP3Op.V_CUBEID_F32) +v_cubesc_f32 = functools.partial(VOP3, VOP3Op.V_CUBESC_F32) +v_cubetc_f32 = functools.partial(VOP3, VOP3Op.V_CUBETC_F32) +v_cubema_f32 = functools.partial(VOP3, VOP3Op.V_CUBEMA_F32) +v_bfe_u32 = functools.partial(VOP3, VOP3Op.V_BFE_U32) +v_bfe_i32 = functools.partial(VOP3, VOP3Op.V_BFE_I32) +v_bfi_b32 = functools.partial(VOP3, VOP3Op.V_BFI_B32) +v_fma_f32 = functools.partial(VOP3, VOP3Op.V_FMA_F32) +v_fma_f64 = functools.partial(VOP3, VOP3Op.V_FMA_F64) +v_lerp_u8 = functools.partial(VOP3, VOP3Op.V_LERP_U8) +v_alignbit_b32 = functools.partial(VOP3, VOP3Op.V_ALIGNBIT_B32) +v_alignbyte_b32 = functools.partial(VOP3, VOP3Op.V_ALIGNBYTE_B32) +v_mullit_f32 = functools.partial(VOP3, VOP3Op.V_MULLIT_F32) +v_min3_f32 = functools.partial(VOP3, VOP3Op.V_MIN3_F32) +v_min3_i32 = functools.partial(VOP3, VOP3Op.V_MIN3_I32) +v_min3_u32 = functools.partial(VOP3, VOP3Op.V_MIN3_U32) +v_max3_f32 = functools.partial(VOP3, VOP3Op.V_MAX3_F32) +v_max3_i32 = functools.partial(VOP3, VOP3Op.V_MAX3_I32) +v_max3_u32 = functools.partial(VOP3, VOP3Op.V_MAX3_U32) +v_med3_f32 = functools.partial(VOP3, VOP3Op.V_MED3_F32) +v_med3_i32 = functools.partial(VOP3, VOP3Op.V_MED3_I32) +v_med3_u32 = functools.partial(VOP3, VOP3Op.V_MED3_U32) +v_sad_u8 = functools.partial(VOP3, VOP3Op.V_SAD_U8) +v_sad_hi_u8 = functools.partial(VOP3, VOP3Op.V_SAD_HI_U8) +v_sad_u16 = functools.partial(VOP3, VOP3Op.V_SAD_U16) +v_sad_u32 = functools.partial(VOP3, VOP3Op.V_SAD_U32) +v_cvt_pk_u8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_U8_F32) +v_div_fixup_f32 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F32) +v_div_fixup_f64 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F64) +v_div_fmas_f32 = functools.partial(VOP3, VOP3Op.V_DIV_FMAS_F32) +v_div_fmas_f64 = functools.partial(VOP3, VOP3Op.V_DIV_FMAS_F64) +v_msad_u8 = functools.partial(VOP3, VOP3Op.V_MSAD_U8) +v_qsad_pk_u16_u8 = functools.partial(VOP3, VOP3Op.V_QSAD_PK_U16_U8) +v_mqsad_pk_u16_u8 = functools.partial(VOP3, VOP3Op.V_MQSAD_PK_U16_U8) +v_mqsad_u32_u8 = functools.partial(VOP3, VOP3Op.V_MQSAD_U32_U8) +v_xor3_b32 = functools.partial(VOP3, VOP3Op.V_XOR3_B32) +v_mad_u16 = functools.partial(VOP3, VOP3Op.V_MAD_U16) +v_perm_b32 = functools.partial(VOP3, VOP3Op.V_PERM_B32) +v_xad_u32 = functools.partial(VOP3, VOP3Op.V_XAD_U32) +v_lshl_add_u32 = functools.partial(VOP3, VOP3Op.V_LSHL_ADD_U32) +v_add_lshl_u32 = functools.partial(VOP3, VOP3Op.V_ADD_LSHL_U32) +v_fma_f16 = functools.partial(VOP3, VOP3Op.V_FMA_F16) +v_min3_f16 = functools.partial(VOP3, VOP3Op.V_MIN3_F16) +v_min3_i16 = functools.partial(VOP3, VOP3Op.V_MIN3_I16) +v_min3_u16 = functools.partial(VOP3, VOP3Op.V_MIN3_U16) +v_max3_f16 = functools.partial(VOP3, VOP3Op.V_MAX3_F16) +v_max3_i16 = functools.partial(VOP3, VOP3Op.V_MAX3_I16) +v_max3_u16 = functools.partial(VOP3, VOP3Op.V_MAX3_U16) +v_med3_f16 = functools.partial(VOP3, VOP3Op.V_MED3_F16) +v_med3_i16 = functools.partial(VOP3, VOP3Op.V_MED3_I16) +v_med3_u16 = functools.partial(VOP3, VOP3Op.V_MED3_U16) +v_mad_i16 = functools.partial(VOP3, VOP3Op.V_MAD_I16) +v_div_fixup_f16 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F16) +v_add3_u32 = functools.partial(VOP3, VOP3Op.V_ADD3_U32) +v_lshl_or_b32 = functools.partial(VOP3, VOP3Op.V_LSHL_OR_B32) +v_and_or_b32 = functools.partial(VOP3, VOP3Op.V_AND_OR_B32) +v_or3_b32 = functools.partial(VOP3, VOP3Op.V_OR3_B32) +v_mad_u32_u16 = functools.partial(VOP3, VOP3Op.V_MAD_U32_U16) +v_mad_i32_i16 = functools.partial(VOP3, VOP3Op.V_MAD_I32_I16) +v_permlane16_b32 = functools.partial(VOP3, VOP3Op.V_PERMLANE16_B32) +v_permlanex16_b32 = functools.partial(VOP3, VOP3Op.V_PERMLANEX16_B32) +v_cndmask_b16 = functools.partial(VOP3, VOP3Op.V_CNDMASK_B16) +v_maxmin_f32 = functools.partial(VOP3, VOP3Op.V_MAXMIN_F32) +v_minmax_f32 = functools.partial(VOP3, VOP3Op.V_MINMAX_F32) +v_maxmin_f16 = functools.partial(VOP3, VOP3Op.V_MAXMIN_F16) +v_minmax_f16 = functools.partial(VOP3, VOP3Op.V_MINMAX_F16) +v_maxmin_u32 = functools.partial(VOP3, VOP3Op.V_MAXMIN_U32) +v_minmax_u32 = functools.partial(VOP3, VOP3Op.V_MINMAX_U32) +v_maxmin_i32 = functools.partial(VOP3, VOP3Op.V_MAXMIN_I32) +v_minmax_i32 = functools.partial(VOP3, VOP3Op.V_MINMAX_I32) +v_dot2_f16_f16 = functools.partial(VOP3, VOP3Op.V_DOT2_F16_F16) +v_dot2_bf16_bf16 = functools.partial(VOP3, VOP3Op.V_DOT2_BF16_BF16) +v_add_nc_u16 = functools.partial(VOP3, VOP3Op.V_ADD_NC_U16) +v_sub_nc_u16 = functools.partial(VOP3, VOP3Op.V_SUB_NC_U16) +v_mul_lo_u16 = functools.partial(VOP3, VOP3Op.V_MUL_LO_U16) +v_cvt_pk_i16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_I16_F32) +v_cvt_pk_u16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_U16_F32) +v_max_u16 = functools.partial(VOP3, VOP3Op.V_MAX_U16) +v_max_i16 = functools.partial(VOP3, VOP3Op.V_MAX_I16) +v_min_u16 = functools.partial(VOP3, VOP3Op.V_MIN_U16) +v_min_i16 = functools.partial(VOP3, VOP3Op.V_MIN_I16) +v_add_nc_i16 = functools.partial(VOP3, VOP3Op.V_ADD_NC_I16) +v_sub_nc_i16 = functools.partial(VOP3, VOP3Op.V_SUB_NC_I16) +v_pack_b32_f16 = functools.partial(VOP3, VOP3Op.V_PACK_B32_F16) +v_cvt_pk_norm_i16_f16 = functools.partial(VOP3, VOP3Op.V_CVT_PK_NORM_I16_F16) +v_cvt_pk_norm_u16_f16 = functools.partial(VOP3, VOP3Op.V_CVT_PK_NORM_U16_F16) +v_ldexp_f32 = functools.partial(VOP3, VOP3Op.V_LDEXP_F32) +v_bfm_b32 = functools.partial(VOP3, VOP3Op.V_BFM_B32) +v_bcnt_u32_b32 = functools.partial(VOP3, VOP3Op.V_BCNT_U32_B32) +v_mbcnt_lo_u32_b32 = functools.partial(VOP3, VOP3Op.V_MBCNT_LO_U32_B32) +v_mbcnt_hi_u32_b32 = functools.partial(VOP3, VOP3Op.V_MBCNT_HI_U32_B32) +v_cvt_pk_norm_i16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_NORM_I16_F32) +v_cvt_pk_norm_u16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_NORM_U16_F32) +v_cvt_pk_u16_u32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_U16_U32) +v_cvt_pk_i16_i32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_I16_I32) +v_sub_nc_i32 = functools.partial(VOP3, VOP3Op.V_SUB_NC_I32) +v_add_nc_i32 = functools.partial(VOP3, VOP3Op.V_ADD_NC_I32) +v_add_f64 = functools.partial(VOP3, VOP3Op.V_ADD_F64) +v_mul_f64 = functools.partial(VOP3, VOP3Op.V_MUL_F64) +v_min_f64 = functools.partial(VOP3, VOP3Op.V_MIN_F64) +v_max_f64 = functools.partial(VOP3, VOP3Op.V_MAX_F64) +v_ldexp_f64 = functools.partial(VOP3, VOP3Op.V_LDEXP_F64) +v_mul_lo_u32 = functools.partial(VOP3, VOP3Op.V_MUL_LO_U32) +v_mul_hi_u32 = functools.partial(VOP3, VOP3Op.V_MUL_HI_U32) +v_mul_hi_i32 = functools.partial(VOP3, VOP3Op.V_MUL_HI_I32) +v_trig_preop_f64 = functools.partial(VOP3, VOP3Op.V_TRIG_PREOP_F64) +v_lshlrev_b16 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B16) +v_lshrrev_b16 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B16) +v_ashrrev_i16 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I16) +v_lshlrev_b64 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B64) +v_lshrrev_b64 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B64) +v_ashrrev_i64 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I64) +v_readlane_b32 = functools.partial(VOP3_SDST, VOP3Op.V_READLANE_B32) +v_writelane_b32 = functools.partial(VOP3, VOP3Op.V_WRITELANE_B32) +v_and_b16 = functools.partial(VOP3, VOP3Op.V_AND_B16) +v_or_b16 = functools.partial(VOP3, VOP3Op.V_OR_B16) +v_xor_b16 = functools.partial(VOP3, VOP3Op.V_XOR_B16) +v_pk_mad_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MAD_I16) +v_pk_mul_lo_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MUL_LO_U16) +v_pk_add_i16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_I16) +v_pk_sub_i16 = functools.partial(VOP3P, VOP3POp.V_PK_SUB_I16) +v_pk_lshlrev_b16 = functools.partial(VOP3P, VOP3POp.V_PK_LSHLREV_B16) +v_pk_lshrrev_b16 = functools.partial(VOP3P, VOP3POp.V_PK_LSHRREV_B16) +v_pk_ashrrev_i16 = functools.partial(VOP3P, VOP3POp.V_PK_ASHRREV_I16) +v_pk_max_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_I16) +v_pk_min_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_I16) +v_pk_mad_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MAD_U16) +v_pk_add_u16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_U16) +v_pk_sub_u16 = functools.partial(VOP3P, VOP3POp.V_PK_SUB_U16) +v_pk_max_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_U16) +v_pk_min_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_U16) +v_pk_fma_f16 = functools.partial(VOP3P, VOP3POp.V_PK_FMA_F16) +v_pk_add_f16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_F16) +v_pk_mul_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MUL_F16) +v_pk_min_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_F16) +v_pk_max_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_F16) +v_dot2_f32_f16 = functools.partial(VOP3P, VOP3POp.V_DOT2_F32_F16) +v_dot4_i32_iu8 = functools.partial(VOP3P, VOP3POp.V_DOT4_I32_IU8) +v_dot4_u32_u8 = functools.partial(VOP3P, VOP3POp.V_DOT4_U32_U8) +v_dot8_i32_iu4 = functools.partial(VOP3P, VOP3POp.V_DOT8_I32_IU4) +v_dot8_u32_u4 = functools.partial(VOP3P, VOP3POp.V_DOT8_U32_U4) +v_dot2_f32_bf16 = functools.partial(VOP3P, VOP3POp.V_DOT2_F32_BF16) +v_fma_mix_f32 = functools.partial(VOP3P, VOP3POp.V_FMA_MIX_F32) +v_fma_mixlo_f16 = functools.partial(VOP3P, VOP3POp.V_FMA_MIXLO_F16) +v_fma_mixhi_f16 = functools.partial(VOP3P, VOP3POp.V_FMA_MIXHI_F16) +v_wmma_f32_16x16x16_f16 = functools.partial(VOP3P, VOP3POp.V_WMMA_F32_16X16X16_F16) +v_wmma_f32_16x16x16_bf16 = functools.partial(VOP3P, VOP3POp.V_WMMA_F32_16X16X16_BF16) +v_wmma_f16_16x16x16_f16 = functools.partial(VOP3P, VOP3POp.V_WMMA_F16_16X16X16_F16) +v_wmma_bf16_16x16x16_bf16 = functools.partial(VOP3P, VOP3POp.V_WMMA_BF16_16X16X16_BF16) +v_wmma_i32_16x16x16_iu8 = functools.partial(VOP3P, VOP3POp.V_WMMA_I32_16X16X16_IU8) +v_wmma_i32_16x16x16_iu4 = functools.partial(VOP3P, VOP3POp.V_WMMA_I32_16X16X16_IU4) +v_add_co_ci_u32 = functools.partial(VOP3SD, VOP3SDOp.V_ADD_CO_CI_U32) +v_sub_co_ci_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUB_CO_CI_U32) +v_subrev_co_ci_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUBREV_CO_CI_U32) +v_div_scale_f32 = functools.partial(VOP3SD, VOP3SDOp.V_DIV_SCALE_F32) +v_div_scale_f64 = functools.partial(VOP3SD, VOP3SDOp.V_DIV_SCALE_F64) +v_mad_u64_u32 = functools.partial(VOP3SD, VOP3SDOp.V_MAD_U64_U32) +v_mad_i64_i32 = functools.partial(VOP3SD, VOP3SDOp.V_MAD_I64_I32) +v_add_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_ADD_CO_U32) +v_sub_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUB_CO_U32) +v_subrev_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUBREV_CO_U32) +v_cmp_f_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_F16_E32) +v_cmp_lt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F16_E32) +v_cmp_eq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F16_E32) +v_cmp_le_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F16_E32) +v_cmp_gt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F16_E32) +v_cmp_lg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F16_E32) +v_cmp_ge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F16_E32) +v_cmp_o_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F16_E32) +v_cmp_u_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F16_E32) +v_cmp_nge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F16_E32) +v_cmp_nlg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F16_E32) +v_cmp_ngt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F16_E32) +v_cmp_nle_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F16_E32) +v_cmp_neq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F16_E32) +v_cmp_nlt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F16_E32) +v_cmp_t_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_F16_E32) +v_cmp_f_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_F32_E32) +v_cmp_lt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F32_E32) +v_cmp_eq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F32_E32) +v_cmp_le_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F32_E32) +v_cmp_gt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F32_E32) +v_cmp_lg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F32_E32) +v_cmp_ge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F32_E32) +v_cmp_o_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F32_E32) +v_cmp_u_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F32_E32) +v_cmp_nge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F32_E32) +v_cmp_nlg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F32_E32) +v_cmp_ngt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F32_E32) +v_cmp_nle_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F32_E32) +v_cmp_neq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F32_E32) +v_cmp_nlt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F32_E32) +v_cmp_t_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_F32_E32) +v_cmp_f_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_F64_E32) +v_cmp_lt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F64_E32) +v_cmp_eq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F64_E32) +v_cmp_le_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F64_E32) +v_cmp_gt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F64_E32) +v_cmp_lg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F64_E32) +v_cmp_ge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F64_E32) +v_cmp_o_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F64_E32) +v_cmp_u_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F64_E32) +v_cmp_nge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F64_E32) +v_cmp_nlg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F64_E32) +v_cmp_ngt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F64_E32) +v_cmp_nle_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F64_E32) +v_cmp_neq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F64_E32) +v_cmp_nlt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F64_E32) +v_cmp_t_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_F64_E32) +v_cmp_lt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I16_E32) +v_cmp_eq_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I16_E32) +v_cmp_le_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I16_E32) +v_cmp_gt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I16_E32) +v_cmp_ne_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I16_E32) +v_cmp_ge_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I16_E32) +v_cmp_lt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U16_E32) +v_cmp_eq_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U16_E32) +v_cmp_le_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U16_E32) +v_cmp_gt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U16_E32) +v_cmp_ne_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U16_E32) +v_cmp_ge_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U16_E32) +v_cmp_f_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_I32_E32) +v_cmp_lt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I32_E32) +v_cmp_eq_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I32_E32) +v_cmp_le_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I32_E32) +v_cmp_gt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I32_E32) +v_cmp_ne_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I32_E32) +v_cmp_ge_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I32_E32) +v_cmp_t_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_I32_E32) +v_cmp_f_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_U32_E32) +v_cmp_lt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U32_E32) +v_cmp_eq_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U32_E32) +v_cmp_le_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U32_E32) +v_cmp_gt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U32_E32) +v_cmp_ne_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U32_E32) +v_cmp_ge_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U32_E32) +v_cmp_t_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_U32_E32) +v_cmp_f_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_I64_E32) +v_cmp_lt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I64_E32) +v_cmp_eq_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I64_E32) +v_cmp_le_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I64_E32) +v_cmp_gt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I64_E32) +v_cmp_ne_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I64_E32) +v_cmp_ge_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I64_E32) +v_cmp_t_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_I64_E32) +v_cmp_f_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_F_U64_E32) +v_cmp_lt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U64_E32) +v_cmp_eq_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U64_E32) +v_cmp_le_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U64_E32) +v_cmp_gt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U64_E32) +v_cmp_ne_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U64_E32) +v_cmp_ge_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U64_E32) +v_cmp_t_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_T_U64_E32) +v_cmp_class_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F16_E32) +v_cmp_class_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F32_E32) +v_cmp_class_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F64_E32) +v_cmpx_f_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_F16_E32) +v_cmpx_lt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F16_E32) +v_cmpx_eq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F16_E32) +v_cmpx_le_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F16_E32) +v_cmpx_gt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F16_E32) +v_cmpx_lg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F16_E32) +v_cmpx_ge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F16_E32) +v_cmpx_o_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F16_E32) +v_cmpx_u_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F16_E32) +v_cmpx_nge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F16_E32) +v_cmpx_nlg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F16_E32) +v_cmpx_ngt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F16_E32) +v_cmpx_nle_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F16_E32) +v_cmpx_neq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F16_E32) +v_cmpx_nlt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F16_E32) +v_cmpx_t_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_F16_E32) +v_cmpx_f_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_F32_E32) +v_cmpx_lt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F32_E32) +v_cmpx_eq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F32_E32) +v_cmpx_le_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F32_E32) +v_cmpx_gt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F32_E32) +v_cmpx_lg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F32_E32) +v_cmpx_ge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F32_E32) +v_cmpx_o_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F32_E32) +v_cmpx_u_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F32_E32) +v_cmpx_nge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F32_E32) +v_cmpx_nlg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F32_E32) +v_cmpx_ngt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F32_E32) +v_cmpx_nle_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F32_E32) +v_cmpx_neq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F32_E32) +v_cmpx_nlt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F32_E32) +v_cmpx_t_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_F32_E32) +v_cmpx_f_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_F64_E32) +v_cmpx_lt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F64_E32) +v_cmpx_eq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F64_E32) +v_cmpx_le_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F64_E32) +v_cmpx_gt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F64_E32) +v_cmpx_lg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F64_E32) +v_cmpx_ge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F64_E32) +v_cmpx_o_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F64_E32) +v_cmpx_u_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F64_E32) +v_cmpx_nge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F64_E32) +v_cmpx_nlg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F64_E32) +v_cmpx_ngt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F64_E32) +v_cmpx_nle_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F64_E32) +v_cmpx_neq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F64_E32) +v_cmpx_nlt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F64_E32) +v_cmpx_t_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_F64_E32) +v_cmpx_lt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I16_E32) +v_cmpx_eq_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I16_E32) +v_cmpx_le_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I16_E32) +v_cmpx_gt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I16_E32) +v_cmpx_ne_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I16_E32) +v_cmpx_ge_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I16_E32) +v_cmpx_lt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U16_E32) +v_cmpx_eq_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U16_E32) +v_cmpx_le_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U16_E32) +v_cmpx_gt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U16_E32) +v_cmpx_ne_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U16_E32) +v_cmpx_ge_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U16_E32) +v_cmpx_f_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_I32_E32) +v_cmpx_lt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I32_E32) +v_cmpx_eq_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I32_E32) +v_cmpx_le_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I32_E32) +v_cmpx_gt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I32_E32) +v_cmpx_ne_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I32_E32) +v_cmpx_ge_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I32_E32) +v_cmpx_t_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_I32_E32) +v_cmpx_f_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_U32_E32) +v_cmpx_lt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U32_E32) +v_cmpx_eq_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U32_E32) +v_cmpx_le_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U32_E32) +v_cmpx_gt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U32_E32) +v_cmpx_ne_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U32_E32) +v_cmpx_ge_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U32_E32) +v_cmpx_t_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_U32_E32) +v_cmpx_f_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_I64_E32) +v_cmpx_lt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I64_E32) +v_cmpx_eq_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I64_E32) +v_cmpx_le_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I64_E32) +v_cmpx_gt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I64_E32) +v_cmpx_ne_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I64_E32) +v_cmpx_ge_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I64_E32) +v_cmpx_t_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_I64_E32) +v_cmpx_f_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_F_U64_E32) +v_cmpx_lt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U64_E32) +v_cmpx_eq_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U64_E32) +v_cmpx_le_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U64_E32) +v_cmpx_gt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U64_E32) +v_cmpx_ne_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U64_E32) +v_cmpx_ge_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U64_E32) +v_cmpx_t_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_T_U64_E32) +v_cmpx_class_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F16_E32) +v_cmpx_class_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F32_E32) +v_cmpx_class_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F64_E32) +v_dual_fmac_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_FMAC_F32) +v_dual_fmaak_f32 = functools.partial(VOPD_LIT, VOPDOp.V_DUAL_FMAAK_F32) +v_dual_fmamk_f32 = functools.partial(VOPD_LIT, VOPDOp.V_DUAL_FMAMK_F32) +v_dual_mul_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_MUL_F32) +v_dual_add_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_ADD_F32) +v_dual_sub_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_SUB_F32) +v_dual_subrev_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_SUBREV_F32) +v_dual_mul_dx9_zero_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_MUL_DX9_ZERO_F32) +v_dual_mov_b32 = functools.partial(VOPD, VOPDOp.V_DUAL_MOV_B32) +v_dual_cndmask_b32 = functools.partial(VOPD, VOPDOp.V_DUAL_CNDMASK_B32) +v_dual_max_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_MAX_F32) +v_dual_min_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_MIN_F32) +v_dual_dot2acc_f32_f16 = functools.partial(VOPD, VOPDOp.V_DUAL_DOT2ACC_F32_F16) +v_dual_dot2acc_f32_bf16 = functools.partial(VOPD, VOPDOp.V_DUAL_DOT2ACC_F32_BF16) +v_dual_add_nc_u32 = functools.partial(VOPD, VOPDOp.V_DUAL_ADD_NC_U32) +v_dual_lshlrev_b32 = functools.partial(VOPD, VOPDOp.V_DUAL_LSHLREV_B32) +v_dual_and_b32 = functools.partial(VOPD, VOPDOp.V_DUAL_AND_B32) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/operands.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/operands.py new file mode 100644 index 000000000..6eb31ec19 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/operands.py @@ -0,0 +1,1523 @@ +# autogenerated from AMD ISA XML - do not edit +from tinygrad.runtime.autogen.amd.common import Fmt, OpType +from tinygrad.runtime.autogen.amd.rdna3.enum import DSOp, EXPOp, FLATOp, GLOBALOp, LDSDIROp, MIMGOp, MTBUFOp, MUBUFOp, SCRATCHOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VINTERPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3SDOp, VOPCOp, VOPDOp + +# instruction operand info: {Op: {field: (Fmt, size_bits, OpType)}} +OPERANDS = { + MUBUFOp.BUFFER_ATOMIC_ADD_F32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_ADD_U32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_ADD_U64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_AND_B32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_AND_B64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_CMPSWAP_B32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_CMPSWAP_B64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_CMPSWAP_F32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_CSUB_U32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_DEC_U32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_DEC_U64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_INC_U32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_INC_U64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MAX_F32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MAX_I32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MAX_I64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MAX_U32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MAX_U64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MIN_F32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MIN_I32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MIN_I64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MIN_U32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_MIN_U64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_OR_B32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_OR_B64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_SUB_U32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_SUB_U64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_SWAP_B32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_SWAP_B64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_XOR_B32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_ATOMIC_XOR_B64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_B128: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_B32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_B64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_B96: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_B16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_HI_B16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_HI_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_HI_I8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_HI_U8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_I8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_D16_U8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_I16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_I8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_LDS_B32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_LDS_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_LDS_I16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_LDS_I8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_LDS_U16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_LDS_U8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_U16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_LOAD_U8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_B128: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_B16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_B32: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_B64: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_B8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_B96: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_D16_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_D16_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_D16_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_D16_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_D16_HI_B16: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_D16_HI_B8: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_D16_HI_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + MUBUFOp.BUFFER_STORE_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + DSOp.DS_ADD_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_ADD_GS_REG_RTN: {"data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_ADD_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_ADD_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_ADD_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_ADD_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_ADD_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_AND_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_AND_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_AND_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_AND_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_APPEND: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_BPERMUTE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_BVH_STACK_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_CONDXCHG32_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_CONSUME: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_DEC_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_DEC_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_DEC_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_DEC_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_GWS_BARRIER: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_GWS_INIT: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_GWS_SEMA_BR: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_INC_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_INC_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_INC_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_INC_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_2ADDR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_2ADDR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_2ADDR_STRIDE64_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_2ADDR_STRIDE64_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_ADDTID_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_B128: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_B96: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B96, 96, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_I16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_I8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_I8_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_I8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U16_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U16_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U8_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MSKOR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MSKOR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MSKOR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MSKOR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_ORDERED_COUNT: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_OR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_OR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_OR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_OR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_PERMUTE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_RSUB_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_RSUB_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_RSUB_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_RSUB_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_2ADDR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_2ADDR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STORE_2ADDR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_2ADDR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STORE_2ADDR_STRIDE64_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_2ADDR_STRIDE64_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STORE_ADDTID_B32: {"data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B128: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B16_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_B16, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B8, 8, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK4_B8, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B96: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B96, 96, OpType.OPR_VGPR)}, + DSOp.DS_SUB_GS_REG_RTN: {"data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_SUB_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_SUB_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_SUB_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_SUB_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_SWIZZLE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_WRAP_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_XOR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_XOR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_XOR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_XOR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + EXPOp.EXP: {"tgt": (Fmt.FMT_ANY, 128, OpType.OPR_TGT), "vsrc0": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc2": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc3": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_ADD_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_ADD_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_ADD_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_AND_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_AND_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_CMPSWAP_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_CMPSWAP_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_CMPSWAP_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_DEC_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_DEC_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_INC_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_INC_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MAX_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MAX_I32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MAX_I64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MAX_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MAX_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MIN_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MIN_I32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MIN_I64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MIN_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_MIN_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_OR_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_OR_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_SUB_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_SUB_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_SWAP_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_SWAP_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_XOR_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_ATOMIC_XOR_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_B128: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_B96: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_D16_B16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_D16_HI_B16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_D16_HI_I8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_D16_HI_U8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_D16_I8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_D16_U8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_I16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_I8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_U16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_LOAD_U8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_STORE_B128: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + FLATOp.FLAT_STORE_B16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_STORE_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_STORE_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + FLATOp.FLAT_STORE_B8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_STORE_B96: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + FLATOp.FLAT_STORE_D16_HI_B16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + FLATOp.FLAT_STORE_D16_HI_B8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_ADD_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_ADD_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_ADD_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_AND_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_AND_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_CSUB_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_DEC_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_DEC_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_INC_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_INC_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MAX_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MAX_I32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MAX_I64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MAX_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MAX_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MIN_F32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MIN_I32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MIN_I64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MIN_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_MIN_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_OR_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_OR_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SUB_U32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SUB_U64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SWAP_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_SWAP_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_XOR_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_ATOMIC_XOR_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_ADDTID_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_B128: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_B96: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_D16_B16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_D16_HI_B16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_D16_HI_I8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_D16_HI_U8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_D16_I8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_D16_U8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_I16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_I8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_LDS_ADDTID_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_LOAD_LDS_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_LOAD_LDS_I16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_LOAD_LDS_I8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_LOAD_LDS_U16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_LOAD_LDS_U8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_LOAD_U16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_LOAD_U8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + GLOBALOp.GLOBAL_STORE_ADDTID_B32: {"data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_B128: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_B16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_B32: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_B64: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_B8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_B96: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_D16_HI_B16: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + GLOBALOp.GLOBAL_STORE_D16_HI_B8: {"addr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG)}, + MIMGOp.IMAGE_ATOMIC_ADD: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_AND: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_CMPSWAP: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_DEC: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_INC: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_OR: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_SMAX: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_SMIN: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_SUB: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_SWAP: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_UMAX: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_UMIN: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_ATOMIC_XOR: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_BVH64_INTERSECT_RAY: {"srsrc": (Fmt.FMT_IMG_BVH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 384, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_BVH_INTERSECT_RAY: {"srsrc": (Fmt.FMT_IMG_BVH, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 352, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 96, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4H: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 96, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_B: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_B_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_C: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_C_B: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_C_B_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 192, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_C_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_C_L: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_C_LZ: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_C_LZ_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_L: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_LZ: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 96, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_LZ_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GATHER4_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GET_LOD: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 96, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_GET_RESINFO: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_LOAD: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_LOAD_MIP: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_LOAD_MIP_PCK: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_LOAD_MIP_PCK_SGN: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_LOAD_PCK: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_LOAD_PCK_SGN: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_MSAA_LOAD: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 96, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_B: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_B_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_B_CL_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 192, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_B_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_CL_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_B: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_B_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 192, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_B_CL_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 224, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_B_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 192, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_CL_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 192, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_D: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 320, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_D_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 352, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_D_CL_G16: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 288, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_D_CL_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 384, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_D_CL_O_G16: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 320, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_D_G16: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 256, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_D_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 352, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_D_O_G16: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 288, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_L: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_LZ: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_LZ_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_L_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 192, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_C_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_D: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 288, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_D_CL: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 320, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_D_CL_G16: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 256, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_D_CL_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 352, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_D_CL_O_G16: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 288, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_D_G16: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 224, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_D_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 320, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_D_O_G16: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 256, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_L: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_LZ: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 96, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_LZ_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_L_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 160, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_SAMPLE_O: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "ssamp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_NUM_F32, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_STORE: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_STORE_MIP: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_STORE_MIP_PCK: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MIMGOp.IMAGE_STORE_PCK: {"srsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + LDSDIROp.LDS_DIRECT_LOAD: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + LDSDIROp.LDS_PARAM_LOAD: {"attr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_ATTR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_B128: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_B32: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_B64: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_B96: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_D16_B16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_D16_HI_B16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_D16_HI_I8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_D16_HI_U8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_D16_I8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_D16_U8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_I16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_I8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_LDS_B32: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_LOAD_LDS_I16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_LOAD_LDS_I8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_LOAD_LDS_U16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_LOAD_LDS_U8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_LOAD_U16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_LOAD_U8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SCRATCHOp.SCRATCH_STORE_B128: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_B16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_B32: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_B64: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_B8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_B96: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_D16_HI_B16: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SCRATCHOp.SCRATCH_STORE_D16_HI_B8: {"addr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "data": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG)}, + SOP2Op.S_ABSDIFF_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_ABS_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADDC_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPKOp.S_ADDK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_ADD_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_AND_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_AND_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT0_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT0_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT0_WREXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT0_WREXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_AND_NOT1_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_AND_NOT1_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT1_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT1_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT1_WREXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT1_WREXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_ASHR_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ASHR_I64: {"sdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SMEMOp.S_ATC_PROBE: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B8, 8, OpType.OPR_SIMM8), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATC_PROBE_BUFFER: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B8, 8, OpType.OPR_SIMM8), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOP1Op.S_BCNT0_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT0_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT1_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT1_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_I64: {"sdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_U64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFM_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFM_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP0_B32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP0_B64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP1_B32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP1_B64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITREPLICATE_B64_B32: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET0_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET0_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET1_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET1_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_BRANCH: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOP1Op.S_BREV_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BREV_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SMEMOp.S_BUFFER_LOAD_B128: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B256: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 256, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B32: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B512: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 512, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B64: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOPKOp.S_CALL_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_CDBGSYS: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_CDBGSYS_AND_USER: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_CDBGSYS_OR_USER: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_CDBGUSER: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_EXECNZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_EXECZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_SCC0: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_SCC1: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_VCCNZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_VCCZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOP1Op.S_CEIL_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_CEIL_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_CLAUSE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_CLAUSE)}, + SOP1Op.S_CLS_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CLS_I32_I64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_CLZ_I32_U32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CLZ_I32_U64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPKOp.S_CMOVK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_CMOV_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CMOV_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOPKOp.S_CMPK_EQ_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_EQ_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_GE_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_GE_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_GT_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_GT_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LE_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LE_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LG_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LG_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LT_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_CMPK_LT_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SIMM16)}, + SOPCOp.S_CMP_EQ_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_U64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_U64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NEQ_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NEQ_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NGE_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NGE_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NGT_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NGT_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLE_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLE_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLG_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLG_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLT_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLT_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_O_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_O_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_U_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_U_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_CSELECT_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_CSELECT_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_CTZ_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CTZ_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_F16_F32: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_F32_F16: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_F32_I32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_F32_U32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_HI_F32_F16: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_I32_F32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_CVT_PK_RTZ_F16_F32: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_U32_F32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_DECPERFLEVEL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_DELAY_ALU: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_DELAY)}, + SOPPOp.S_DENORM_MODE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_FLOOR_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_FLOOR_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_FMAAK_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_FMAC_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_FMAC_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_FMAMK_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_GETPC_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + SOPKOp.S_GETREG_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOPPOp.S_INCPERFLEVEL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SMEMOp.S_LOAD_B128: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B256: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 256, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B32: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B512: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 512, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B64: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOP2Op.S_LSHL1_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL2_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL3_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL4_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPKOp.S_MOVK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_MOVRELD_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_MOVRELD_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_MOVRELSD_2_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + SOP1Op.S_MOVRELS_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + SOP1Op.S_MOVRELS_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOP1Op.S_MOV_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_MOV_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOPKOp.S_MULK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_MUL_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_HI_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_HI_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_NAND_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_NAND_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NAND_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_NAND_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPPOp.S_NOP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_NOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_NOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NOR_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_NOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NOT_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_NOT_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_OR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_OR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_OR_NOT0_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_OR_NOT0_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_OR_NOT1_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_OR_NOT1_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_OR_NOT1_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_OR_NOT1_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_OR_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_OR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_HH_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_HL_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_LH_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_LL_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_QUADMASK_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_QUADMASK_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_RFE_B64: {"ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOP1Op.S_RNDNE_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_RNDNE_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_ROUND_MODE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_SENDMSG: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SENDMSG)}, + SOPPOp.S_SENDMSGHALT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SENDMSG)}, + SOP1Op.S_SENDMSG_RTN_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SENDMSG_RTN)}, + SOP1Op.S_SENDMSG_RTN_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SENDMSG_RTN)}, + SOPPOp.S_SETHALT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_SETKILL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_SETPC_B64: {"ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOPPOp.S_SETPRIO: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_SETREG_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOPKOp.S_SETREG_IMM32_B32: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOPPOp.S_SET_INST_PREFETCH_DISTANCE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_SEXT_I32_I16: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_SEXT_I32_I8: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SSRC)}, + SOPPOp.S_SLEEP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_SUBB_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_SWAPPC_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOPPOp.S_TRAP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_TRUNC_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_TRUNC_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_TTRACEDATA_IMM: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_VERSION: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VERSION)}, + SOPPOp.S_WAITCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_WAITCNT)}, + SOPPOp.S_WAITCNT_DEPCTR: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_WAITCNT_DEPCTR)}, + SOPKOp.S_WAITCNT_EXPCNT: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST_NULL), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_WAITCNT_LGKMCNT: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST_NULL), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_WAITCNT_VMCNT: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST_NULL), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_WAITCNT_VSCNT: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST_NULL), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAIT_EVENT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_WAIT_EVENT)}, + SOP1Op.S_WQM_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_WQM_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_XNOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_XNOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_XNOR_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_XNOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_XOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_XOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_XOR_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_XOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + MTBUFOp.TBUFFER_LOAD_D16_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_LOAD_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_STORE_D16_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_STORE_D16_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_STORE_D16_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_STORE_D16_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_X: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_XY: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_XYZ: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + MTBUFOp.TBUFFER_STORE_FORMAT_XYZW: {"soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0_INL), "srsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VOP3Op.V_ADD3_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_CO_CI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_ADD_CO_CI_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_ADD_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_LSHL_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_NC_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_NC_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_NC_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ALIGNBIT_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ALIGNBYTE_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_AND_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_AND_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_AND_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_AND_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ASHRREV_I32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_BCNT_U32_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFI_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFM_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_BFREV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFREV_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CLS_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CLS_I32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CLZ_I32_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CLZ_I32_U32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_F_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_F_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_F_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_F_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_F_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_F_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_F_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_F_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_T_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_T_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_T_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_T_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_T_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_T_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_T_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_T_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_F_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_F_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_T_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_T_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CNDMASK_B16: {"src0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_CNDMASK_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CNDMASK_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_COS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_COS_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_COS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_COS_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CTZ_I32_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CTZ_I32_B32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBEID_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBEMA_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBESC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBETC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_F32: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_I16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_U16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_F16: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_I32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_U32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE0: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE0: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE1: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE1: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE2: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE2: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE3: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE3: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_FLOOR_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_FLOOR_I32_F32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I16_F16: {"vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I32_F32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I32_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I32_I16: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_NEAREST_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_NEAREST_I32_F32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_NORM_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_NORM_I16_F16: {"vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_NORM_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_NORM_U16_F16: {"vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_OFF_F32_I4: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_OFF_F32_I4: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_I16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_I16_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_NORM_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_NORM_I16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_NORM_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_NORM_U16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP2Op.V_CVT_PK_RTZ_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_RTZ_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_U16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_U16_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_U8_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U16_F16: {"vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U32_F32: {"vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U32_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U32_U16: {"vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FMAS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FMAS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3SDOp.V_DIV_SCALE_F32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SDST), "src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_DIV_SCALE_F64: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SDST), "src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_DOT2ACC_F32_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DOT2_BF16_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_DOT2_F16_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3POp.V_DOT2_F32_BF16: {"src0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT2_F32_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_I32_IU8: {"src0": (Fmt.FMT_NUM_PK4_IU8, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK4_IU8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_U32_U8: {"src0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT8_I32_IU4: {"src0": (Fmt.FMT_NUM_PK8_IU4, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK8_IU4, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT8_U32_U4: {"src0": (Fmt.FMT_NUM_PK8_U4, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK8_U4, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_ADD_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_ADD_NC_U32: {"srcy0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_AND_B32: {"srcy0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_CNDMASK_B32: {"srcy0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_DOT2ACC_F32_BF16: {"srcy0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_DOT2ACC_F32_F16: {"srcy0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_FMAAK_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_FMAC_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_FMAMK_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_LSHLREV_B32: {"srcy0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MAX_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MIN_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MOV_B32: {"srcy0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MUL_DX9_ZERO_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MUL_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_SUBREV_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_SUB_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_EXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_EXP_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_EXP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_EXP_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_FMAAK_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_FMAAK_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_FMAC_DX9_ZERO_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMAC_DX9_ZERO_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_FMAC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FMAC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_FMAC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMAC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_FMAMK_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_FMAMK_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_DX9_ZERO_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3POp.V_FMA_MIXHI_F16: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3POp.V_FMA_MIXLO_F16: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3POp.V_FMA_MIX_F32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I16_F16: {"vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I32_F32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P10_F16_F32: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P10_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P10_RTZ_F16_F32: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P2_F16_F32: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P2_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P2_RTZ_F16_F32: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_LDEXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_LERP_U8: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_LOG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LOG_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_LOG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LOG_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_LSHLREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_LSHL_ADD_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHL_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_LSHRREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I32_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I32_I24: {"src0": (Fmt.FMT_NUM_I24, 24, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I24, 24, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_MAD_I64_I32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U32_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U32_U24: {"src0": (Fmt.FMT_NUM_U24, 24, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U24, 24, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_MAD_U64_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXMIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAXMIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXMIN_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXMIN_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MBCNT_HI_U32_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MBCNT_LO_U32_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINMAX_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MINMAX_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINMAX_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINMAX_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_MOVRELD_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOVRELD_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_MOVRELSD_2_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOVRELSD_2_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR)}, + VOP1Op.V_MOVRELSD_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOVRELSD_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR)}, + VOP1Op.V_MOVRELS_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOVRELS_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR)}, + VOP1Op.V_MOV_B16: {"src0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MOV_B16: {"vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_MOV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOV_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MQSAD_PK_U16_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MQSAD_U32_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B128, 128, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + VOP3Op.V_MSAD_U8: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MULLIT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_DX9_ZERO_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_DX9_ZERO_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_HI_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_HI_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_LO_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_LO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_NOT_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_NOT_B16: {"vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_NOT_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_NOT_B32: {"vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_OR3_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_OR_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PACK_B32_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERMLANE16_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_PERMLANE64_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERMLANEX16_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERM_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ASHRREV_I16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP2Op.V_PK_FMAC_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_FMA_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_LSHLREV_B16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_LSHRREV_B16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAD_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAD_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MUL_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MUL_LO_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_SUB_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_SUB_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_QSAD_PK_U16_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_IFLAG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_IFLAG_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_READFIRSTLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + VOP3Op.V_READFIRSTLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + VOP3Op.V_READLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_LANESEL), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + VOP1Op.V_RNDNE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RNDNE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RNDNE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_HI_U8: {"src0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U8: {"src0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SAT_PK_U8_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SAT_PK_U8_I16: {"vdst": (Fmt.FMT_NUM_PK2_U8, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SIN_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SIN_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SQRT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SQRT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SQRT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_CO_CI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUBREV_CO_CI_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUBREV_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_CO_CI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUB_CO_CI_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUB_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_NC_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_NC_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_NC_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SWAPREL_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SWAP_B16: {"src0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SWAP_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_TRIG_PREOP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_BF16_16X16X16_BF16: {"src0": (Fmt.FMT_WMMA_AB_BF16, 256, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_BF16, 256, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_BF16, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_BF16, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F16_16X16X16_F16: {"src0": (Fmt.FMT_WMMA_AB_F16, 256, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_F16, 256, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_F16, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_F16, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F32_16X16X16_BF16: {"src0": (Fmt.FMT_WMMA_AB_BF16, 256, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_BF16, 256, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_F32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F32_16X16X16_F16: {"src0": (Fmt.FMT_WMMA_AB_F16, 256, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_F16, 256, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_F32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_I32_16X16X16_IU4: {"src0": (Fmt.FMT_WMMA_AB_IU4, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_IU4, 64, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_I32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_I32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_I32_16X16X16_IU8: {"src0": (Fmt.FMT_WMMA_AB_IU8, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_IU8, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_I32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_I32, 256, OpType.OPR_VGPR)}, + VOP3Op.V_WRITELANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_LANESEL), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XAD_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_XNOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XNOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XOR3_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XOR_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_XOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/str_pcode.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/str_pcode.py new file mode 100644 index 000000000..b1e6fcd3f --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna3/str_pcode.py @@ -0,0 +1,1398 @@ +# autogenerated from AMD ISA PDF - do not edit +# ruff: noqa: E501 +from tinygrad.runtime.autogen.amd.rdna3.enum import DSOp, FLATOp, GLOBALOp, LDSDIROp, MIMGOp, MTBUFOp, MUBUFOp, SCRATCHOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VINTERPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3SDOp, VOPCOp + +PCODE = { + DSOp.DS_ADD_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_SUB_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_RSUB_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 = DATA.u32 - MEM[ADDR].u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_INC_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_DEC_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MIN_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MAX_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MIN_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MAX_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_AND_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_OR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_XOR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_MSKOR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = ((tmp & ~DATA.b32) | DATA2.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_STORE_B32: 'MEM[ADDR + OFFSET.u32].b32 = DATA[31 : 0]', + DSOp.DS_STORE_2ADDR_B32: 'MEM[ADDR + OFFSET0.u32 * 4U].b32 = DATA[31 : 0];\nMEM[ADDR + OFFSET1.u32 * 4U].b32 = DATA2[31 : 0]', + DSOp.DS_STORE_2ADDR_STRIDE64_B32: 'MEM[ADDR + OFFSET0.u32 * 256U].b32 = DATA[31 : 0];\nMEM[ADDR + OFFSET1.u32 * 256U].b32 = DATA2[31 : 0]', + DSOp.DS_CMPSTORE_B32: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ncmp = DATA2.b32;\nMEM[ADDR].b32 = tmp == cmp ? src : tmp;\nRETURN_DATA.b32 = tmp', + DSOp.DS_CMPSTORE_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\ncmp = DATA2.f32;\nMEM[ADDR].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_MIN_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_MAX_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_ADD_F32: 'tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + DSOp.DS_STORE_B8: 'MEM[ADDR].b8 = DATA[7 : 0]', + DSOp.DS_STORE_B16: 'MEM[ADDR].b16 = DATA[15 : 0]', + DSOp.DS_ADD_RTN_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_SUB_RTN_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_RSUB_RTN_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 = DATA.u32 - MEM[ADDR].u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_INC_RTN_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_DEC_RTN_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MIN_RTN_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MAX_RTN_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MIN_RTN_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MAX_RTN_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_AND_RTN_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_OR_RTN_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_XOR_RTN_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_MSKOR_RTN_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = ((tmp & ~DATA.b32) | DATA2.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_STOREXCHG_RTN_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + DSOp.DS_STOREXCHG_2ADDR_RTN_B32: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 4U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 4U;\ntmp1 = MEM[addr1].b32;\ntmp2 = MEM[addr2].b32;\nMEM[addr1].b32 = DATA.b32;\nMEM[addr2].b32 = DATA2.b32;\n// Note DATA2 can be any other register\nRETURN_DATA[31 : 0] = tmp1;\nRETURN_DATA[63 : 32] = tmp2', + DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 256U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 256U;\ntmp1 = MEM[addr1].b32;\ntmp2 = MEM[addr2].b32;\nMEM[addr1].b32 = DATA.b32;\nMEM[addr2].b32 = DATA2.b32;\n// Note DATA2 can be any other register\nRETURN_DATA[31 : 0] = tmp1;\nRETURN_DATA[63 : 32] = tmp2', + DSOp.DS_CMPSTORE_RTN_B32: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ncmp = DATA2.b32;\nMEM[ADDR].b32 = tmp == cmp ? src : tmp;\nRETURN_DATA.b32 = tmp', + DSOp.DS_CMPSTORE_RTN_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\ncmp = DATA2.f32;\nMEM[ADDR].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_MIN_RTN_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_MAX_RTN_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + DSOp.DS_WRAP_RTN_B32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 = tmp >= DATA.u32 ? tmp - DATA.u32 : tmp + DATA2.u32;\nRETURN_DATA = tmp', + DSOp.DS_SWIZZLE_B32: 'offset = offset1:offset0;\nif (offset >= 0xe000) {\n// FFT decomposition\nmask = offset[4:0];\nfor (i = 0; i < 64; i++) {\nj = reverse_bits(i & 0x1f);\nj = (j >> count_ones(mask));\nj |= (i & mask);\nj |= i & 0x20;\nthread_out[i] = thread_valid[j] ? thread_in[j] : 0;\n}', + DSOp.DS_LOAD_B32: 'RETURN_DATA[31 : 0] = MEM[ADDR + OFFSET.u32].b32', + DSOp.DS_LOAD_2ADDR_B32: 'RETURN_DATA[31 : 0] = MEM[ADDR + OFFSET0.u32 * 4U].b32;\nRETURN_DATA[63 : 32] = MEM[ADDR + OFFSET1.u32 * 4U].b32', + DSOp.DS_LOAD_2ADDR_STRIDE64_B32: 'RETURN_DATA[31 : 0] = MEM[ADDR + OFFSET0.u32 * 256U].b32;\nRETURN_DATA[63 : 32] = MEM[ADDR + OFFSET1.u32 * 256U].b32', + DSOp.DS_LOAD_I8: "RETURN_DATA.i32 = 32'I(signext(MEM[ADDR].i8))", + DSOp.DS_LOAD_U8: "RETURN_DATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + DSOp.DS_LOAD_I16: "RETURN_DATA.i32 = 32'I(signext(MEM[ADDR].i16))", + DSOp.DS_LOAD_U16: "RETURN_DATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + DSOp.DS_CONSUME: 'addr = M0.base + offset; // offset by LDS HWBASE, limit to M.size\nrtnval = LDS(addr);\nLDS(addr) = LDS(addr) - countbits(valid mask);\nGPR[VDST] = rtnval; // return to all valid threads', + DSOp.DS_APPEND: 'addr = M0.base + offset; // offset by LDS HWBASE, limit to M.size\nrtnval = LDS(addr);\nLDS(addr) = LDS(addr) + countbits(valid mask);\nGPR[VDST] = rtnval; // return to all valid threads', + DSOp.DS_ADD_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_SUB_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_RSUB_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 = DATA.u64 - MEM[ADDR].u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_INC_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_DEC_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MIN_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MAX_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MIN_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MAX_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_AND_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_OR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_XOR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_MSKOR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = ((tmp & ~DATA.b64) | DATA2.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_STORE_B64: 'MEM[ADDR + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[ADDR + OFFSET.u32 + 4U].b32 = DATA[63 : 32]', + DSOp.DS_STORE_2ADDR_B64: 'MEM[ADDR + OFFSET0.u32 * 8U].b32 = DATA[31 : 0];\nMEM[ADDR + OFFSET0.u32 * 8U + 4U].b32 = DATA[63 : 32];\nMEM[ADDR + OFFSET1.u32 * 8U].b32 = DATA2[31 : 0];\nMEM[ADDR + OFFSET1.u32 * 8U + 4U].b32 = DATA2[63 : 32]', + DSOp.DS_STORE_2ADDR_STRIDE64_B64: 'MEM[ADDR + OFFSET0.u32 * 512U].b32 = DATA[31 : 0];\nMEM[ADDR + OFFSET0.u32 * 512U + 4U].b32 = DATA[63 : 32];\nMEM[ADDR + OFFSET1.u32 * 512U].b32 = DATA2[31 : 0];\nMEM[ADDR + OFFSET1.u32 * 512U + 4U].b32 = DATA2[63 : 32]', + DSOp.DS_CMPSTORE_B64: 'tmp = MEM[ADDR].b64;\nsrc = DATA.b64;\ncmp = DATA2.b64;\nMEM[ADDR].b64 = tmp == cmp ? src : tmp;\nRETURN_DATA.b64 = tmp', + DSOp.DS_CMPSTORE_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\ncmp = DATA2.f64;\nMEM[ADDR].f64 = tmp == cmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MIN_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\nMEM[ADDR].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MAX_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\nMEM[ADDR].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_ADD_RTN_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_SUB_RTN_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_RSUB_RTN_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 = DATA.u64 - MEM[ADDR].u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_INC_RTN_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_DEC_RTN_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MIN_RTN_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MAX_RTN_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MIN_RTN_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MAX_RTN_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_AND_RTN_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_OR_RTN_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_XOR_RTN_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_MSKOR_RTN_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = ((tmp & ~DATA.b64) | DATA2.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_STOREXCHG_RTN_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + DSOp.DS_STOREXCHG_2ADDR_RTN_B64: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 8U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 8U;\ntmp1 = MEM[addr1].b64;\ntmp2 = MEM[addr2].b64;\nMEM[addr1].b64 = DATA.b64;\nMEM[addr2].b64 = DATA2.b64;\n// Note DATA2 can be any other register\nRETURN_DATA[63 : 0] = tmp1;\nRETURN_DATA[127 : 64] = tmp2', + DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 512U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 512U;\ntmp1 = MEM[addr1].b64;\ntmp2 = MEM[addr2].b64;\nMEM[addr1].b64 = DATA.b64;\nMEM[addr2].b64 = DATA2.b64;\n// Note DATA2 can be any other register\nRETURN_DATA[63 : 0] = tmp1;\nRETURN_DATA[127 : 64] = tmp2', + DSOp.DS_CMPSTORE_RTN_B64: 'tmp = MEM[ADDR].b64;\nsrc = DATA.b64;\ncmp = DATA2.b64;\nMEM[ADDR].b64 = tmp == cmp ? src : tmp;\nRETURN_DATA.b64 = tmp', + DSOp.DS_CMPSTORE_RTN_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\ncmp = DATA2.f64;\nMEM[ADDR].f64 = tmp == cmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MIN_RTN_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\nMEM[ADDR].f64 = src < tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MAX_RTN_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\nMEM[ADDR].f64 = src > tmp ? src : tmp;\nRETURN_DATA.f64 = tmp', + DSOp.DS_LOAD_B64: 'RETURN_DATA[31 : 0] = MEM[ADDR + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[ADDR + OFFSET.u32 + 4U].b32', + DSOp.DS_LOAD_2ADDR_B64: 'RETURN_DATA[31 : 0] = MEM[ADDR + OFFSET0.u32 * 8U].b32;\nRETURN_DATA[63 : 32] = MEM[ADDR + OFFSET0.u32 * 8U + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[ADDR + OFFSET1.u32 * 8U].b32;\nRETURN_DATA[127 : 96] = MEM[ADDR + OFFSET1.u32 * 8U + 4U].b32', + DSOp.DS_LOAD_2ADDR_STRIDE64_B64: 'RETURN_DATA[31 : 0] = MEM[ADDR + OFFSET0.u32 * 512U].b32;\nRETURN_DATA[63 : 32] = MEM[ADDR + OFFSET0.u32 * 512U + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[ADDR + OFFSET1.u32 * 512U].b32;\nRETURN_DATA[127 : 96] = MEM[ADDR + OFFSET1.u32 * 512U + 4U].b32', + DSOp.DS_ADD_RTN_F32: 'tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + DSOp.DS_ADD_GS_REG_RTN: 'if OFFSET0[5:2] > 7\n// 64-bit GS register access\naddr = (OFFSET0[5:2] - 8) * 2 + 8;\nVDST[0] = GS_REGS(addr + 0);\nVDST[1] = GS_REGS(addr + 1);\n{GS_REGS(addr + 1), GS_REGS(addr)} += DATA0[0]; // source is 32 bit\nelse\naddr = OFFSET0[5:2];\nVDST[0] = GS_REGS(addr);\nGS_REGS(addr) += DATA0[0];\nendif.', + DSOp.DS_SUB_GS_REG_RTN: 'if OFFSET0[5:2] > 7\n// 64-bit GS register access\naddr = (OFFSET0[5:2] - 8) * 2 + 8;\nVDST[0] = GS_REGS(addr + 0);\nVDST[1] = GS_REGS(addr + 1);\n{GS_REGS(addr + 1), GS_REGS(addr)} -= DATA0[0]; // source is 32 bit\nelse\naddr = OFFSET0[5:2];\nVDST[0] = GS_REGS(addr);\nGS_REGS(addr) -= DATA0[0];\nendif.', + DSOp.DS_CONDXCHG32_RTN_B64: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\ndeclare RETURN_DATA : 32'U[2];\nADDR = S0.u32;\nDATA = S1.u64;\noffset = { OFFSET1, OFFSET0 };\nADDR0 = ((ADDR + offset.u32) & 0xfff8U);\nADDR1 = ADDR0 + 4U;\nRETURN_DATA[0] = LDS[ADDR0].u32;\nif DATA[31] then\nLDS[ADDR0] = { 1'0, DATA[30 : 0] }\nendif;\nRETURN_DATA[1] = LDS[ADDR1].u32;\nif DATA[63] then\nLDS[ADDR1] = { 1'0, DATA[62 : 32] }\nendif", + DSOp.DS_STORE_B8_D16_HI: 'MEM[ADDR].b8 = DATA[23 : 16]', + DSOp.DS_STORE_B16_D16_HI: 'MEM[ADDR].b16 = DATA[31 : 16]', + DSOp.DS_LOAD_U8_D16: "RETURN_DATA[15 : 0].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// RETURN_DATA[31:16] is preserved.", + DSOp.DS_LOAD_U8_D16_HI: "RETURN_DATA[31 : 16].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// RETURN_DATA[15:0] is preserved.", + DSOp.DS_LOAD_I8_D16: "RETURN_DATA[15 : 0].i16 = 16'I(signext(MEM[ADDR].i8));\n// RETURN_DATA[31:16] is preserved.", + DSOp.DS_LOAD_I8_D16_HI: "RETURN_DATA[31 : 16].i16 = 16'I(signext(MEM[ADDR].i8));\n// RETURN_DATA[15:0] is preserved.", + DSOp.DS_LOAD_U16_D16: 'RETURN_DATA[15 : 0].u16 = MEM[ADDR].u16;\n// RETURN_DATA[31:16] is preserved.', + DSOp.DS_LOAD_U16_D16_HI: 'RETURN_DATA[31 : 16].u16 = MEM[ADDR].u16;\n// RETURN_DATA[15:0] is preserved.', + DSOp.DS_BVH_STACK_RTN_B32: '(stack_base, stack_index) = DECODE_ADDR(ADDR, OFFSET1);\nlast_node_ptr = DATA0;\n// First 3 passes: push data onto stack\nfor i = 0..2 do\nif DATA_VALID(DATA1[i])\nMEM[stack_base + stack_index] = DATA1[i];\nIncrement stack_index\nelsif DATA1[i] == last_node_ptr\n// Treat all further data as invalid as well.\nbreak\nendif\nendfor\n// Fourth pass: return data or pop\nif DATA_VALID(DATA1[3])\nVGPR_RTN = DATA1[3]\nelse\nVGPR_RTN = MEM[stack_base + stack_index];\nMEM[stack_base + stack_index] = INVALID_NODE;\nDecrement stack_index\nendif\nADDR = ENCODE_ADDR(stack_base, stack_index).\nfunction DATA_VALID(data):\nif data == INVALID_NODE\nreturn false\nelsif last_node_ptr != INVALID_NODE && data == last_node_ptr\n// Match last_node_ptr\nreturn false\nelse\nreturn true\nendif\nendfunction.', + DSOp.DS_STORE_ADDTID_B32: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\nMEM[32'I({ OFFSET1, OFFSET0 } + M0[15 : 0]) + laneID.i32 * 4].u32 = DATA0.u32", + DSOp.DS_LOAD_ADDTID_B32: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\nRETURN_DATA.u32 = MEM[32'I({ OFFSET1, OFFSET0 } + M0[15 : 0]) + laneID.i32 * 4].u32", + DSOp.DS_PERMUTE_B32: "// VGPR[laneId][index] is the VGPR RAM\n// VDST, ADDR and DATA0 are from the microcode DS encoding\ndeclare tmp : 32'B[64];\ndeclare OFFSET : 16'U;\ndeclare DATA0 : 32'U;\ndeclare VDST : 32'U;\nfor i in 0 : WAVE64 ? 63 : 31 do\ntmp[i] = 0x0\nendfor;\nfor i in 0 : WAVE64 ? 63 : 31 do\n// If a source thread is disabled, it does not propagate data.\nif EXEC[i].u1 then\n// ADDR needs to be divided by 4.\n// High-order bits are ignored.\n// NOTE: destination lane is MOD 32 regardless of wave size.\ndst_lane = 32'I(VGPR[i][ADDR] + OFFSET.b32) / 4 % 32;\ntmp[dst_lane] = VGPR[i][DATA0]\nendif\nendfor;\n// Copy data into destination VGPRs. If multiple sources\n// select the same destination thread, the highest-numbered\n// source thread wins.\nfor i in 0 : WAVE64 ? 63 : 31 do\nif EXEC[i].u1 then\nVGPR[i][VDST] = tmp[i]\nendif\nendfor", + DSOp.DS_BPERMUTE_B32: "// VGPR[laneId][index] is the VGPR RAM\n// VDST, ADDR and DATA0 are from the microcode DS encoding\ndeclare tmp : 32'B[64];\ndeclare OFFSET : 16'U;\ndeclare DATA0 : 32'U;\ndeclare VDST : 32'U;\nfor i in 0 : WAVE64 ? 63 : 31 do\ntmp[i] = 0x0\nendfor;\nfor i in 0 : WAVE64 ? 63 : 31 do\n// ADDR needs to be divided by 4.\n// High-order bits are ignored.\n// NOTE: destination lane is MOD 32 regardless of wave size.\nsrc_lane = 32'I(VGPR[i][ADDR] + OFFSET.b32) / 4 % 32;\n// EXEC is applied to the source VGPR reads.\nif EXEC[src_lane].u1 then\ntmp[i] = VGPR[src_lane][DATA0]\nendif\nendfor;\n// Copy data into destination VGPRs. Some source\n// data may be broadcast to multiple lanes.\nfor i in 0 : WAVE64 ? 63 : 31 do\nif EXEC[i].u1 then\nVGPR[i][VDST] = tmp[i]\nendif\nendfor", + DSOp.DS_STORE_B96: 'MEM[ADDR + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[ADDR + OFFSET.u32 + 4U].b32 = DATA[63 : 32];\nMEM[ADDR + OFFSET.u32 + 8U].b32 = DATA[95 : 64]', + DSOp.DS_STORE_B128: 'MEM[ADDR + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[ADDR + OFFSET.u32 + 4U].b32 = DATA[63 : 32];\nMEM[ADDR + OFFSET.u32 + 8U].b32 = DATA[95 : 64];\nMEM[ADDR + OFFSET.u32 + 12U].b32 = DATA[127 : 96]', + DSOp.DS_LOAD_B96: 'RETURN_DATA[31 : 0] = MEM[ADDR + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[ADDR + OFFSET.u32 + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[ADDR + OFFSET.u32 + 8U].b32', + DSOp.DS_LOAD_B128: 'RETURN_DATA[31 : 0] = MEM[ADDR + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[ADDR + OFFSET.u32 + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[ADDR + OFFSET.u32 + 8U].b32;\nRETURN_DATA[127 : 96] = MEM[ADDR + OFFSET.u32 + 12U].b32', + FLATOp.FLAT_LOAD_U8: "VDATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + FLATOp.FLAT_LOAD_I8: "VDATA.i32 = 32'I(signext(MEM[ADDR].i8))", + FLATOp.FLAT_LOAD_U16: "VDATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + FLATOp.FLAT_LOAD_I16: "VDATA.i32 = 32'I(signext(MEM[ADDR].i16))", + FLATOp.FLAT_LOAD_B32: 'VDATA[31 : 0] = MEM[ADDR].b32', + FLATOp.FLAT_LOAD_B64: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32', + FLATOp.FLAT_LOAD_B96: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32;\nVDATA[95 : 64] = MEM[ADDR + 8U].b32', + FLATOp.FLAT_LOAD_B128: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32;\nVDATA[95 : 64] = MEM[ADDR + 8U].b32;\nVDATA[127 : 96] = MEM[ADDR + 12U].b32', + FLATOp.FLAT_STORE_B8: 'MEM[ADDR].b8 = VDATA[7 : 0]', + FLATOp.FLAT_STORE_B16: 'MEM[ADDR].b16 = VDATA[15 : 0]', + FLATOp.FLAT_STORE_B32: 'MEM[ADDR].b32 = VDATA[31 : 0]', + FLATOp.FLAT_STORE_B64: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32]', + FLATOp.FLAT_STORE_B96: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32];\nMEM[ADDR + 8U].b32 = VDATA[95 : 64]', + FLATOp.FLAT_STORE_B128: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32];\nMEM[ADDR + 8U].b32 = VDATA[95 : 64];\nMEM[ADDR + 12U].b32 = VDATA[127 : 96]', + FLATOp.FLAT_LOAD_D16_U8: "VDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// VDATA[31:16] is preserved.", + FLATOp.FLAT_LOAD_D16_I8: "VDATA[15 : 0].i16 = 16'I(signext(MEM[ADDR].i8));\n// VDATA[31:16] is preserved.", + FLATOp.FLAT_LOAD_D16_B16: 'VDATA[15 : 0].b16 = MEM[ADDR].b16;\n// VDATA[31:16] is preserved.', + FLATOp.FLAT_LOAD_D16_HI_U8: "VDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// VDATA[15:0] is preserved.", + FLATOp.FLAT_LOAD_D16_HI_I8: "VDATA[31 : 16].i16 = 16'I(signext(MEM[ADDR].i8));\n// VDATA[15:0] is preserved.", + FLATOp.FLAT_LOAD_D16_HI_B16: 'VDATA[31 : 16].b16 = MEM[ADDR].b16;\n// VDATA[15:0] is preserved.', + FLATOp.FLAT_STORE_D16_HI_B8: 'MEM[ADDR].b8 = VDATA[23 : 16]', + FLATOp.FLAT_STORE_D16_HI_B16: 'MEM[ADDR].b16 = VDATA[31 : 16]', + FLATOp.GLOBAL_LOAD_ADDTID_B32: "RETURN_DATA.u32 = MEM[SGPR_ADDR[63 : 0] + INST_OFFSET[11 : 0].b64 + 64'B(laneID.i32 * 4)].u32", + FLATOp.GLOBAL_STORE_ADDTID_B32: "MEM[SGPR_ADDR[63 : 0] + INST_OFFSET[11 : 0].b64 + 64'B(laneID.i32 * 4)].u32 = DATA.u32", + FLATOp.FLAT_ATOMIC_SWAP_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + FLATOp.FLAT_ATOMIC_CMPSWAP_B32: 'tmp = MEM[ADDR].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[ADDR].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_ADD_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_SUB_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_MIN_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + FLATOp.FLAT_ATOMIC_MIN_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_MAX_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + FLATOp.FLAT_ATOMIC_MAX_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_AND_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + FLATOp.FLAT_ATOMIC_OR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + FLATOp.FLAT_ATOMIC_XOR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + FLATOp.FLAT_ATOMIC_INC_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_DEC_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + FLATOp.FLAT_ATOMIC_SWAP_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + FLATOp.FLAT_ATOMIC_CMPSWAP_B64: 'tmp = MEM[ADDR].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[ADDR].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_ADD_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_SUB_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_MIN_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + FLATOp.FLAT_ATOMIC_MIN_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_MAX_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + FLATOp.FLAT_ATOMIC_MAX_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_AND_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + FLATOp.FLAT_ATOMIC_OR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + FLATOp.FLAT_ATOMIC_XOR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + FLATOp.FLAT_ATOMIC_INC_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_DEC_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + FLATOp.FLAT_ATOMIC_CMPSWAP_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA[31 : 0].f32;\ncmp = DATA[63 : 32].f32;\nMEM[ADDR].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + FLATOp.FLAT_ATOMIC_MIN_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + FLATOp.FLAT_ATOMIC_MAX_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + FLATOp.FLAT_ATOMIC_ADD_F32: 'tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + GLOBALOp.GLOBAL_LOAD_U8: "VDATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + GLOBALOp.GLOBAL_LOAD_I8: "VDATA.i32 = 32'I(signext(MEM[ADDR].i8))", + GLOBALOp.GLOBAL_LOAD_U16: "VDATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + GLOBALOp.GLOBAL_LOAD_I16: "VDATA.i32 = 32'I(signext(MEM[ADDR].i16))", + GLOBALOp.GLOBAL_LOAD_B32: 'VDATA[31 : 0] = MEM[ADDR].b32', + GLOBALOp.GLOBAL_LOAD_B64: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32', + GLOBALOp.GLOBAL_LOAD_B96: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32;\nVDATA[95 : 64] = MEM[ADDR + 8U].b32', + GLOBALOp.GLOBAL_LOAD_B128: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32;\nVDATA[95 : 64] = MEM[ADDR + 8U].b32;\nVDATA[127 : 96] = MEM[ADDR + 12U].b32', + GLOBALOp.GLOBAL_STORE_B8: 'MEM[ADDR].b8 = VDATA[7 : 0]', + GLOBALOp.GLOBAL_STORE_B16: 'MEM[ADDR].b16 = VDATA[15 : 0]', + GLOBALOp.GLOBAL_STORE_B32: 'MEM[ADDR].b32 = VDATA[31 : 0]', + GLOBALOp.GLOBAL_STORE_B64: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32]', + GLOBALOp.GLOBAL_STORE_B96: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32];\nMEM[ADDR + 8U].b32 = VDATA[95 : 64]', + GLOBALOp.GLOBAL_STORE_B128: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32];\nMEM[ADDR + 8U].b32 = VDATA[95 : 64];\nMEM[ADDR + 12U].b32 = VDATA[127 : 96]', + GLOBALOp.GLOBAL_LOAD_D16_U8: "VDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// VDATA[31:16] is preserved.", + GLOBALOp.GLOBAL_LOAD_D16_I8: "VDATA[15 : 0].i16 = 16'I(signext(MEM[ADDR].i8));\n// VDATA[31:16] is preserved.", + GLOBALOp.GLOBAL_LOAD_D16_B16: 'VDATA[15 : 0].b16 = MEM[ADDR].b16;\n// VDATA[31:16] is preserved.', + GLOBALOp.GLOBAL_LOAD_D16_HI_U8: "VDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// VDATA[15:0] is preserved.", + GLOBALOp.GLOBAL_LOAD_D16_HI_I8: "VDATA[31 : 16].i16 = 16'I(signext(MEM[ADDR].i8));\n// VDATA[15:0] is preserved.", + GLOBALOp.GLOBAL_LOAD_D16_HI_B16: 'VDATA[31 : 16].b16 = MEM[ADDR].b16;\n// VDATA[15:0] is preserved.', + GLOBALOp.GLOBAL_STORE_D16_HI_B8: 'MEM[ADDR].b8 = VDATA[23 : 16]', + GLOBALOp.GLOBAL_STORE_D16_HI_B16: 'MEM[ADDR].b16 = VDATA[31 : 16]', + GLOBALOp.GLOBAL_LOAD_ADDTID_B32: "RETURN_DATA.u32 = MEM[SGPR_ADDR[63 : 0] + INST_OFFSET[11 : 0].b64 + 64'B(laneID.i32 * 4)].u32", + GLOBALOp.GLOBAL_STORE_ADDTID_B32: "MEM[SGPR_ADDR[63 : 0] + INST_OFFSET[11 : 0].b64 + 64'B(laneID.i32 * 4)].u32 = DATA.u32", + GLOBALOp.GLOBAL_ATOMIC_SWAP_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B32: 'tmp = MEM[ADDR].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[ADDR].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_ADD_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SUB_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_CSUB_U32: "declare new_value : 32'U;\nold_value = MEM[ADDR].u32;\nif old_value < DATA.u32 then\nnew_value = 0U\nelse\nnew_value = old_value - DATA.u32\nendif;\nMEM[ADDR].u32 = new_value;\nRETURN_DATA.u32 = old_value", + GLOBALOp.GLOBAL_ATOMIC_MIN_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MIN_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MAX_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MAX_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_AND_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_OR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_XOR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_INC_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_DEC_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SWAP_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B64: 'tmp = MEM[ADDR].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[ADDR].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_ADD_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_SUB_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MIN_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MIN_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MAX_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MAX_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_AND_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_OR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_XOR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_INC_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_DEC_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + GLOBALOp.GLOBAL_ATOMIC_CMPSWAP_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA[31 : 0].f32;\ncmp = DATA[63 : 32].f32;\nMEM[ADDR].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MIN_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_MAX_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + GLOBALOp.GLOBAL_ATOMIC_ADD_F32: 'tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + LDSDIROp.LDS_DIRECT_LOAD: 'OFFSET0 = Unsigned byte offset added to the address from the ADDR VGPR.\nOFFSET1 = Unsigned byte offset added to the address from the ADDR VGPR.\nGDS = Set if GDS, cleared if LDS.\nOP = DS instruction opcode\nADDR = Source LDS address VGPR 0 - 255.\nDATA0 = Source data0 VGPR 0 - 255.\nDATA1 = Source data1 VGPR 0 - 255.\nVDST = Destination VGPR 0- 255.', + MIMGOp.IMAGE_ATOMIC_SWAP: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + MIMGOp.IMAGE_ATOMIC_CMPSWAP: 'tmp = MEM[ADDR].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[ADDR].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MIMGOp.IMAGE_ATOMIC_ADD: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + MIMGOp.IMAGE_ATOMIC_SUB: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + MIMGOp.IMAGE_ATOMIC_SMIN: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + MIMGOp.IMAGE_ATOMIC_UMIN: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MIMGOp.IMAGE_ATOMIC_SMAX: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + MIMGOp.IMAGE_ATOMIC_UMAX: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MIMGOp.IMAGE_ATOMIC_AND: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + MIMGOp.IMAGE_ATOMIC_OR: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + MIMGOp.IMAGE_ATOMIC_XOR: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + MIMGOp.IMAGE_ATOMIC_INC: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + MIMGOp.IMAGE_ATOMIC_DEC: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + MIMGOp.IMAGE_GET_LOD: 'VDATA[0] = clampedLOD;\nVDATA[1] = rawLOD.', + MTBUFOp.TBUFFER_LOAD_FORMAT_X: 'VDATA[31 : 0].b32 = ConvertFromFormat(MEM[TADDR.X]);\n// Mem access size depends on format', + MTBUFOp.TBUFFER_LOAD_FORMAT_XY: 'VDATA[31 : 0].b32 = ConvertFromFormat(MEM[TADDR.X]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[TADDR.Y])', + MTBUFOp.TBUFFER_LOAD_FORMAT_XYZ: 'VDATA[31 : 0].b32 = ConvertFromFormat(MEM[TADDR.X]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[TADDR.Y]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[TADDR.Z])', + MTBUFOp.TBUFFER_LOAD_FORMAT_XYZW: 'VDATA[31 : 0].b32 = ConvertFromFormat(MEM[TADDR.X]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[TADDR.Y]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[TADDR.Z]);\nVDATA[127 : 96].b32 = ConvertFromFormat(MEM[TADDR.W])', + MTBUFOp.TBUFFER_STORE_FORMAT_X: 'MEM[TADDR.X] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format', + MTBUFOp.TBUFFER_STORE_FORMAT_XY: 'MEM[TADDR.X] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(VDATA[63 : 32].b32)', + MTBUFOp.TBUFFER_STORE_FORMAT_XYZ: 'MEM[TADDR.X] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[TADDR.Z] = ConvertToFormat(VDATA[95 : 64].b32)', + MTBUFOp.TBUFFER_STORE_FORMAT_XYZW: 'MEM[TADDR.X] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[TADDR.Z] = ConvertToFormat(VDATA[95 : 64].b32);\nMEM[TADDR.W] = ConvertToFormat(VDATA[127 : 96].b32)', + MTBUFOp.TBUFFER_LOAD_D16_FORMAT_X: "VDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\n// VDATA[31:16].b16 is preserved.", + MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XY: "VDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Y]))", + MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XYZ: "VDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Y]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Z]));\n// VDATA[63:48].b16 is preserved.", + MTBUFOp.TBUFFER_LOAD_D16_FORMAT_XYZW: "VDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Y]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Z]));\nVDATA[63 : 48].b16 = 16'B(ConvertFromFormat(MEM[TADDR.W]))", + MTBUFOp.TBUFFER_STORE_D16_FORMAT_X: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format", + MTBUFOp.TBUFFER_STORE_D16_FORMAT_XY: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(32'B(VDATA[31 : 16].b16))", + MTBUFOp.TBUFFER_STORE_D16_FORMAT_XYZ: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[TADDR.Z] = ConvertToFormat(32'B(VDATA[47 : 32].b16))", + MTBUFOp.TBUFFER_STORE_D16_FORMAT_XYZW: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[TADDR.Z] = ConvertToFormat(32'B(VDATA[47 : 32].b16));\nMEM[TADDR.W] = ConvertToFormat(32'B(VDATA[63 : 48].b16))", + MUBUFOp.BUFFER_LOAD_FORMAT_X: 'VDATA[31 : 0].b32 = ConvertFromFormat(MEM[TADDR.X]);\n// Mem access size depends on format', + MUBUFOp.BUFFER_LOAD_FORMAT_XY: 'VDATA[31 : 0].b32 = ConvertFromFormat(MEM[TADDR.X]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[TADDR.Y])', + MUBUFOp.BUFFER_LOAD_FORMAT_XYZ: 'VDATA[31 : 0].b32 = ConvertFromFormat(MEM[TADDR.X]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[TADDR.Y]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[TADDR.Z])', + MUBUFOp.BUFFER_LOAD_FORMAT_XYZW: 'VDATA[31 : 0].b32 = ConvertFromFormat(MEM[TADDR.X]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[TADDR.Y]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[TADDR.Z]);\nVDATA[127 : 96].b32 = ConvertFromFormat(MEM[TADDR.W])', + MUBUFOp.BUFFER_STORE_FORMAT_X: 'MEM[TADDR.X] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format', + MUBUFOp.BUFFER_STORE_FORMAT_XY: 'MEM[TADDR.X] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(VDATA[63 : 32].b32)', + MUBUFOp.BUFFER_STORE_FORMAT_XYZ: 'MEM[TADDR.X] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[TADDR.Z] = ConvertToFormat(VDATA[95 : 64].b32)', + MUBUFOp.BUFFER_STORE_FORMAT_XYZW: 'MEM[TADDR.X] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[TADDR.Z] = ConvertToFormat(VDATA[95 : 64].b32);\nMEM[TADDR.W] = ConvertToFormat(VDATA[127 : 96].b32)', + MUBUFOp.BUFFER_LOAD_D16_FORMAT_X: "VDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\n// VDATA[31:16].b16 is preserved.", + MUBUFOp.BUFFER_LOAD_D16_FORMAT_XY: "VDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Y]))", + MUBUFOp.BUFFER_LOAD_D16_FORMAT_XYZ: "VDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Y]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Z]));\n// VDATA[63:48].b16 is preserved.", + MUBUFOp.BUFFER_LOAD_D16_FORMAT_XYZW: "VDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Y]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[TADDR.Z]));\nVDATA[63 : 48].b16 = 16'B(ConvertFromFormat(MEM[TADDR.W]))", + MUBUFOp.BUFFER_STORE_D16_FORMAT_X: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format", + MUBUFOp.BUFFER_STORE_D16_FORMAT_XY: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(32'B(VDATA[31 : 16].b16))", + MUBUFOp.BUFFER_STORE_D16_FORMAT_XYZ: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[TADDR.Z] = ConvertToFormat(32'B(VDATA[47 : 32].b16))", + MUBUFOp.BUFFER_STORE_D16_FORMAT_XYZW: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[TADDR.Y] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[TADDR.Z] = ConvertToFormat(32'B(VDATA[47 : 32].b16));\nMEM[TADDR.W] = ConvertToFormat(32'B(VDATA[63 : 48].b16))", + MUBUFOp.BUFFER_LOAD_U8: "VDATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + MUBUFOp.BUFFER_LOAD_I8: "VDATA.i32 = 32'I(signext(MEM[ADDR].i8))", + MUBUFOp.BUFFER_LOAD_U16: "VDATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + MUBUFOp.BUFFER_LOAD_I16: "VDATA.i32 = 32'I(signext(MEM[ADDR].i16))", + MUBUFOp.BUFFER_LOAD_B32: 'VDATA[31 : 0] = MEM[ADDR].b32', + MUBUFOp.BUFFER_LOAD_B64: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32', + MUBUFOp.BUFFER_LOAD_B96: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32;\nVDATA[95 : 64] = MEM[ADDR + 8U].b32', + MUBUFOp.BUFFER_LOAD_B128: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32;\nVDATA[95 : 64] = MEM[ADDR + 8U].b32;\nVDATA[127 : 96] = MEM[ADDR + 12U].b32', + MUBUFOp.BUFFER_STORE_B8: 'MEM[ADDR].b8 = VDATA[7 : 0]', + MUBUFOp.BUFFER_STORE_B16: 'MEM[ADDR].b16 = VDATA[15 : 0]', + MUBUFOp.BUFFER_STORE_B32: 'MEM[ADDR].b32 = VDATA[31 : 0]', + MUBUFOp.BUFFER_STORE_B64: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32]', + MUBUFOp.BUFFER_STORE_B96: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32];\nMEM[ADDR + 8U].b32 = VDATA[95 : 64]', + MUBUFOp.BUFFER_STORE_B128: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32];\nMEM[ADDR + 8U].b32 = VDATA[95 : 64];\nMEM[ADDR + 12U].b32 = VDATA[127 : 96]', + MUBUFOp.BUFFER_LOAD_D16_U8: "VDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// VDATA[31:16] is preserved.", + MUBUFOp.BUFFER_LOAD_D16_I8: "VDATA[15 : 0].i16 = 16'I(signext(MEM[ADDR].i8));\n// VDATA[31:16] is preserved.", + MUBUFOp.BUFFER_LOAD_D16_B16: 'VDATA[15 : 0].b16 = MEM[ADDR].b16;\n// VDATA[31:16] is preserved.', + MUBUFOp.BUFFER_LOAD_D16_HI_U8: "VDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// VDATA[15:0] is preserved.", + MUBUFOp.BUFFER_LOAD_D16_HI_I8: "VDATA[31 : 16].i16 = 16'I(signext(MEM[ADDR].i8));\n// VDATA[15:0] is preserved.", + MUBUFOp.BUFFER_LOAD_D16_HI_B16: 'VDATA[31 : 16].b16 = MEM[ADDR].b16;\n// VDATA[15:0] is preserved.', + MUBUFOp.BUFFER_STORE_D16_HI_B8: 'MEM[ADDR].b8 = VDATA[23 : 16]', + MUBUFOp.BUFFER_STORE_D16_HI_B16: 'MEM[ADDR].b16 = VDATA[31 : 16]', + MUBUFOp.BUFFER_LOAD_D16_HI_FORMAT_X: "VDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[TADDR.X]));\n// Mem access size depends on format\n// VDATA[15:0].b16 is preserved.", + MUBUFOp.BUFFER_STORE_D16_HI_FORMAT_X: "MEM[TADDR.X] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\n// Mem access size depends on format", + MUBUFOp.BUFFER_ATOMIC_SWAP_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + MUBUFOp.BUFFER_ATOMIC_CMPSWAP_B32: 'tmp = MEM[ADDR].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[ADDR].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_ADD_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_SUB_U32: 'tmp = MEM[ADDR].u32;\nMEM[ADDR].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_CSUB_U32: "declare new_value : 32'U;\nold_value = MEM[ADDR].u32;\nif old_value < DATA.u32 then\nnew_value = 0U\nelse\nnew_value = old_value - DATA.u32\nendif;\nMEM[ADDR].u32 = new_value;\nRETURN_DATA.u32 = old_value", + MUBUFOp.BUFFER_ATOMIC_MIN_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + MUBUFOp.BUFFER_ATOMIC_MIN_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_MAX_I32: 'tmp = MEM[ADDR].i32;\nsrc = DATA.i32;\nMEM[ADDR].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + MUBUFOp.BUFFER_ATOMIC_MAX_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_AND_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + MUBUFOp.BUFFER_ATOMIC_OR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + MUBUFOp.BUFFER_ATOMIC_XOR_B32: 'tmp = MEM[ADDR].b32;\nMEM[ADDR].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + MUBUFOp.BUFFER_ATOMIC_INC_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_DEC_U32: 'tmp = MEM[ADDR].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + MUBUFOp.BUFFER_ATOMIC_SWAP_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + MUBUFOp.BUFFER_ATOMIC_CMPSWAP_B64: 'tmp = MEM[ADDR].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[ADDR].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_ADD_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_SUB_U64: 'tmp = MEM[ADDR].u64;\nMEM[ADDR].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_MIN_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + MUBUFOp.BUFFER_ATOMIC_MIN_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_MAX_I64: 'tmp = MEM[ADDR].i64;\nsrc = DATA.i64;\nMEM[ADDR].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + MUBUFOp.BUFFER_ATOMIC_MAX_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_AND_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + MUBUFOp.BUFFER_ATOMIC_OR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + MUBUFOp.BUFFER_ATOMIC_XOR_B64: 'tmp = MEM[ADDR].b64;\nMEM[ADDR].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + MUBUFOp.BUFFER_ATOMIC_INC_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_DEC_U64: 'tmp = MEM[ADDR].u64;\nsrc = DATA.u64;\nMEM[ADDR].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + MUBUFOp.BUFFER_ATOMIC_CMPSWAP_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA[31 : 0].f32;\ncmp = DATA[63 : 32].f32;\nMEM[ADDR].f32 = tmp == cmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + MUBUFOp.BUFFER_ATOMIC_MIN_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src < tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + MUBUFOp.BUFFER_ATOMIC_MAX_F32: 'tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nMEM[ADDR].f32 = src > tmp ? src : tmp;\nRETURN_DATA.f32 = tmp', + MUBUFOp.BUFFER_ATOMIC_ADD_F32: 'tmp = MEM[ADDR].f32;\nMEM[ADDR].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + SCRATCHOp.SCRATCH_LOAD_U8: "VDATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + SCRATCHOp.SCRATCH_LOAD_I8: "VDATA.i32 = 32'I(signext(MEM[ADDR].i8))", + SCRATCHOp.SCRATCH_LOAD_U16: "VDATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + SCRATCHOp.SCRATCH_LOAD_I16: "VDATA.i32 = 32'I(signext(MEM[ADDR].i16))", + SCRATCHOp.SCRATCH_LOAD_B32: 'VDATA[31 : 0] = MEM[ADDR].b32', + SCRATCHOp.SCRATCH_LOAD_B64: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32', + SCRATCHOp.SCRATCH_LOAD_B96: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32;\nVDATA[95 : 64] = MEM[ADDR + 8U].b32', + SCRATCHOp.SCRATCH_LOAD_B128: 'VDATA[31 : 0] = MEM[ADDR].b32;\nVDATA[63 : 32] = MEM[ADDR + 4U].b32;\nVDATA[95 : 64] = MEM[ADDR + 8U].b32;\nVDATA[127 : 96] = MEM[ADDR + 12U].b32', + SCRATCHOp.SCRATCH_STORE_B8: 'MEM[ADDR].b8 = VDATA[7 : 0]', + SCRATCHOp.SCRATCH_STORE_B16: 'MEM[ADDR].b16 = VDATA[15 : 0]', + SCRATCHOp.SCRATCH_STORE_B32: 'MEM[ADDR].b32 = VDATA[31 : 0]', + SCRATCHOp.SCRATCH_STORE_B64: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32]', + SCRATCHOp.SCRATCH_STORE_B96: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32];\nMEM[ADDR + 8U].b32 = VDATA[95 : 64]', + SCRATCHOp.SCRATCH_STORE_B128: 'MEM[ADDR].b32 = VDATA[31 : 0];\nMEM[ADDR + 4U].b32 = VDATA[63 : 32];\nMEM[ADDR + 8U].b32 = VDATA[95 : 64];\nMEM[ADDR + 12U].b32 = VDATA[127 : 96]', + SCRATCHOp.SCRATCH_LOAD_D16_U8: "VDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// VDATA[31:16] is preserved.", + SCRATCHOp.SCRATCH_LOAD_D16_I8: "VDATA[15 : 0].i16 = 16'I(signext(MEM[ADDR].i8));\n// VDATA[31:16] is preserved.", + SCRATCHOp.SCRATCH_LOAD_D16_B16: 'VDATA[15 : 0].b16 = MEM[ADDR].b16;\n// VDATA[31:16] is preserved.', + SCRATCHOp.SCRATCH_LOAD_D16_HI_U8: "VDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// VDATA[15:0] is preserved.", + SCRATCHOp.SCRATCH_LOAD_D16_HI_I8: "VDATA[31 : 16].i16 = 16'I(signext(MEM[ADDR].i8));\n// VDATA[15:0] is preserved.", + SCRATCHOp.SCRATCH_LOAD_D16_HI_B16: 'VDATA[31 : 16].b16 = MEM[ADDR].b16;\n// VDATA[15:0] is preserved.', + SCRATCHOp.SCRATCH_STORE_D16_HI_B8: 'MEM[ADDR].b8 = VDATA[23 : 16]', + SCRATCHOp.SCRATCH_STORE_D16_HI_B16: 'MEM[ADDR].b16 = VDATA[31 : 16]', + SMEMOp.S_LOAD_B32: 'SDATA[31 : 0] = MEM[ADDR].b32', + SMEMOp.S_LOAD_B64: 'SDATA[31 : 0] = MEM[ADDR].b32;\nSDATA[63 : 32] = MEM[ADDR + 4U].b32', + SMEMOp.S_LOAD_B128: 'SDATA[31 : 0] = MEM[ADDR].b32;\nSDATA[63 : 32] = MEM[ADDR + 4U].b32;\nSDATA[95 : 64] = MEM[ADDR + 8U].b32;\nSDATA[127 : 96] = MEM[ADDR + 12U].b32', + SMEMOp.S_LOAD_B256: 'SDATA[31 : 0] = MEM[ADDR].b32;\nSDATA[63 : 32] = MEM[ADDR + 4U].b32;\nSDATA[95 : 64] = MEM[ADDR + 8U].b32;\nSDATA[127 : 96] = MEM[ADDR + 12U].b32;\nSDATA[159 : 128] = MEM[ADDR + 16U].b32;\nSDATA[191 : 160] = MEM[ADDR + 20U].b32;\nSDATA[223 : 192] = MEM[ADDR + 24U].b32;\nSDATA[255 : 224] = MEM[ADDR + 28U].b32', + SMEMOp.S_LOAD_B512: 'SDATA[31 : 0] = MEM[ADDR].b32;\nSDATA[63 : 32] = MEM[ADDR + 4U].b32;\nSDATA[95 : 64] = MEM[ADDR + 8U].b32;\nSDATA[127 : 96] = MEM[ADDR + 12U].b32;\nSDATA[159 : 128] = MEM[ADDR + 16U].b32;\nSDATA[191 : 160] = MEM[ADDR + 20U].b32;\nSDATA[223 : 192] = MEM[ADDR + 24U].b32;\nSDATA[255 : 224] = MEM[ADDR + 28U].b32;\nSDATA[287 : 256] = MEM[ADDR + 32U].b32;\nSDATA[319 : 288] = MEM[ADDR + 36U].b32;\nSDATA[351 : 320] = MEM[ADDR + 40U].b32;\nSDATA[383 : 352] = MEM[ADDR + 44U].b32;\nSDATA[415 : 384] = MEM[ADDR + 48U].b32;\nSDATA[447 : 416] = MEM[ADDR + 52U].b32;\nSDATA[479 : 448] = MEM[ADDR + 56U].b32;\nSDATA[511 : 480] = MEM[ADDR + 60U].b32', + SMEMOp.S_BUFFER_LOAD_B32: 'SDATA[31 : 0] = MEM[ADDR].b32', + SMEMOp.S_BUFFER_LOAD_B64: 'SDATA[31 : 0] = MEM[ADDR].b32;\nSDATA[63 : 32] = MEM[ADDR + 4U].b32', + SMEMOp.S_BUFFER_LOAD_B128: 'SDATA[31 : 0] = MEM[ADDR].b32;\nSDATA[63 : 32] = MEM[ADDR + 4U].b32;\nSDATA[95 : 64] = MEM[ADDR + 8U].b32;\nSDATA[127 : 96] = MEM[ADDR + 12U].b32', + SMEMOp.S_BUFFER_LOAD_B256: 'SDATA[31 : 0] = MEM[ADDR].b32;\nSDATA[63 : 32] = MEM[ADDR + 4U].b32;\nSDATA[95 : 64] = MEM[ADDR + 8U].b32;\nSDATA[127 : 96] = MEM[ADDR + 12U].b32;\nSDATA[159 : 128] = MEM[ADDR + 16U].b32;\nSDATA[191 : 160] = MEM[ADDR + 20U].b32;\nSDATA[223 : 192] = MEM[ADDR + 24U].b32;\nSDATA[255 : 224] = MEM[ADDR + 28U].b32', + SMEMOp.S_BUFFER_LOAD_B512: 'SDATA[31 : 0] = MEM[ADDR].b32;\nSDATA[63 : 32] = MEM[ADDR + 4U].b32;\nSDATA[95 : 64] = MEM[ADDR + 8U].b32;\nSDATA[127 : 96] = MEM[ADDR + 12U].b32;\nSDATA[159 : 128] = MEM[ADDR + 16U].b32;\nSDATA[191 : 160] = MEM[ADDR + 20U].b32;\nSDATA[223 : 192] = MEM[ADDR + 24U].b32;\nSDATA[255 : 224] = MEM[ADDR + 28U].b32;\nSDATA[287 : 256] = MEM[ADDR + 32U].b32;\nSDATA[319 : 288] = MEM[ADDR + 36U].b32;\nSDATA[351 : 320] = MEM[ADDR + 40U].b32;\nSDATA[383 : 352] = MEM[ADDR + 44U].b32;\nSDATA[415 : 384] = MEM[ADDR + 48U].b32;\nSDATA[447 : 416] = MEM[ADDR + 52U].b32;\nSDATA[479 : 448] = MEM[ADDR + 56U].b32;\nSDATA[511 : 480] = MEM[ADDR + 60U].b32', + SOP1Op.S_MOV_B32: 'D0.b32 = S0.b32', + SOP1Op.S_MOV_B64: 'D0.b64 = S0.b64', + SOP1Op.S_CMOV_B32: 'if SCC then\nD0.b32 = S0.b32\nendif', + SOP1Op.S_CMOV_B64: 'if SCC then\nD0.b64 = S0.b64\nendif', + SOP1Op.S_BREV_B32: 'D0.u32[31 : 0] = S0.u32[0 : 31]', + SOP1Op.S_BREV_B64: 'D0.u64[63 : 0] = S0.u64[0 : 63]', + SOP1Op.S_CTZ_I32_B32: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_CTZ_I32_B64: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 63 do\n// Search from LSB\nif S0.u64[i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_CLZ_I32_U32: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_CLZ_I32_U64: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 63 do\n// Search from MSB\nif S0.u64[63 - i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_CLS_I32: 'tmp = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.u32[31 - i] != S0.u32[31] then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp', + SOP1Op.S_CLS_I32_I64: 'tmp = -1;\n// Set if all bits are the same\nfor i in 1 : 63 do\n// Search from MSB\nif S0.u64[63 - i] != S0.u64[63] then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp', + SOP1Op.S_SEXT_I32_I8: "D0.i32 = 32'I(signext(S0.i8))", + SOP1Op.S_SEXT_I32_I16: "D0.i32 = 32'I(signext(S0.i16))", + SOP1Op.S_BITSET0_B32: "D0.u32[S0.u32[4 : 0]] = 1'0U", + SOP1Op.S_BITSET0_B64: "D0.u64[S0.u32[5 : 0]] = 1'0U", + SOP1Op.S_BITSET1_B32: "D0.u32[S0.u32[4 : 0]] = 1'1U", + SOP1Op.S_BITSET1_B64: "D0.u64[S0.u32[5 : 0]] = 1'1U", + SOP1Op.S_BITREPLICATE_B64_B32: 'tmp = S0.u32;\nfor i in 0 : 31 do\nD0.u64[i * 2] = tmp[i];\nD0.u64[i * 2 + 1] = tmp[i]\nendfor', + SOP1Op.S_ABS_I32: 'D0.i32 = S0.i32 < 0 ? -S0.i32 : S0.i32;\nSCC = D0.i32 != 0', + SOP1Op.S_BCNT0_I32_B32: "tmp = 0;\nfor i in 0 : 31 do\ntmp += S0.u32[i] == 1'0U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_BCNT0_I32_B64: "tmp = 0;\nfor i in 0 : 63 do\ntmp += S0.u64[i] == 1'0U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_BCNT1_I32_B32: "tmp = 0;\nfor i in 0 : 31 do\ntmp += S0.u32[i] == 1'1U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_BCNT1_I32_B64: "tmp = 0;\nfor i in 0 : 63 do\ntmp += S0.u64[i] == 1'1U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_QUADMASK_B32: 'tmp = 0U;\nfor i in 0 : 7 do\ntmp[i] = S0.u32[i * 4 +: 4] != 0U\nendfor;\nD0.u32 = tmp;\nSCC = D0.u32 != 0U', + SOP1Op.S_QUADMASK_B64: 'tmp = 0ULL;\nfor i in 0 : 15 do\ntmp[i] = S0.u64[i * 4 +: 4] != 0ULL\nendfor;\nD0.u64 = tmp;\nSCC = D0.u64 != 0ULL', + SOP1Op.S_WQM_B32: "tmp = 0U;\ndeclare i : 6'U;\nfor i in 6'0U : 6'31U do\ntmp[i] = S0.u32[i & 6'60U +: 6'4U] != 0U\nendfor;\nD0.u32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_WQM_B64: "tmp = 0ULL;\ndeclare i : 6'U;\nfor i in 6'0U : 6'63U do\ntmp[i] = S0.u64[i & 6'60U +: 6'4U] != 0ULL\nendfor;\nD0.u64 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_NOT_B32: 'D0.u32 = ~S0.u32;\nSCC = D0.u32 != 0U', + SOP1Op.S_NOT_B64: 'D0.u64 = ~S0.u64;\nSCC = D0.u64 != 0ULL', + SOP1Op.S_AND_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 & EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_OR_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 | EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_OR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_XOR_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 ^ EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_XOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 ^ EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_NAND_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = ~(S0.u32 & EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_NAND_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_NOR_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = ~(S0.u32 | EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_NOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_XNOR_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = ~(S0.u32 ^ EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_XNOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 ^ EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_AND_NOT0_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (~S0.u32 & EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_NOT0_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (~S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_OR_NOT0_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (~S0.u32 | EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_OR_NOT0_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (~S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_AND_NOT1_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 & ~EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_NOT1_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 & ~EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_OR_NOT1_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 | ~EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_OR_NOT1_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 | ~EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_AND_NOT0_WREXEC_B32: 'EXEC.u32 = (~S0.u32 & EXEC.u32);\nD0.u32 = EXEC.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_NOT0_WREXEC_B64: 'EXEC.u64 = (~S0.u64 & EXEC.u64);\nD0.u64 = EXEC.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_AND_NOT1_WREXEC_B32: 'EXEC.u32 = (S0.u32 & ~EXEC.u32);\nD0.u32 = EXEC.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_NOT1_WREXEC_B64: 'EXEC.u64 = (S0.u64 & ~EXEC.u64);\nD0.u64 = EXEC.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_MOVRELS_B32: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b32 = SGPR[addr].b32', + SOP1Op.S_MOVRELS_B64: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b64 = SGPR[addr].b64', + SOP1Op.S_MOVRELD_B32: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nSGPR[addr].b32 = S0.b32', + SOP1Op.S_MOVRELD_B64: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nSGPR[addr].b64 = S0.b64', + SOP1Op.S_MOVRELSD_2_B32: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[9 : 0].u32;\naddrd += M0.u32[25 : 16].u32;\nSGPR[addrd].b32 = SGPR[addrs].b32', + SOP1Op.S_GETPC_B64: 'D0.i64 = PC + 4LL', + SOP1Op.S_SETPC_B64: 'PC = S0.i64', + SOP1Op.S_SWAPPC_B64: 'jump_addr = S0.i64;\nD0.i64 = PC + 4LL;\nPC = jump_addr.i64', + SOP1Op.S_RFE_B64: "WAVE_STATUS.PRIV = 1'0U;\nPC = S0.i64", + SOP1Op.S_CEIL_F32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 > 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += 1.0F\nendif', + SOP1Op.S_FLOOR_F32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 < 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += -1.0F\nendif', + SOP1Op.S_TRUNC_F32: 'D0.f32 = trunc(S0.f32)', + SOP1Op.S_RNDNE_F32: "D0.f32 = floor(S0.f32 + 0.5F);\nif (isEven(64'F(floor(S0.f32))) && (fract(S0.f32) == 0.5F)) then\nD0.f32 -= 1.0F\nendif", + SOP1Op.S_CVT_F32_I32: 'D0.f32 = i32_to_f32(S0.i32)', + SOP1Op.S_CVT_F32_U32: 'D0.f32 = u32_to_f32(S0.u32)', + SOP1Op.S_CVT_I32_F32: 'D0.i32 = f32_to_i32(S0.f32)', + SOP1Op.S_CVT_U32_F32: 'D0.u32 = f32_to_u32(S0.f32)', + SOP1Op.S_CVT_F16_F32: 'D0.f16 = f32_to_f16(S0.f32)', + SOP1Op.S_CVT_F32_F16: 'D0.f32 = f16_to_f32(S0.f16)', + SOP1Op.S_CVT_HI_F32_F16: 'D0.f32 = f16_to_f32(S0[31 : 16].f16)', + SOP1Op.S_CEIL_F16: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 > 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += 16'1.0\nendif", + SOP1Op.S_FLOOR_F16: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 < 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += -16'1.0\nendif", + SOP1Op.S_TRUNC_F16: 'D0.f16 = trunc(S0.f16)', + SOP1Op.S_RNDNE_F16: "D0.f16 = floor(S0.f16 + 16'0.5);\nif (isEven(64'F(floor(S0.f16))) && (fract(S0.f16) == 16'0.5)) then\nD0.f16 -= 16'1.0\nendif", + SOP2Op.S_ADD_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_ADDC_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_SUB_U32: "tmp = S0.u32 - S1.u32;\nSCC = S1.u32 > S0.u32 ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_SUBB_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_ADD_I32: 'tmp = S0.i32 + S1.i32;\nSCC = ((S0.u32[31] == S1.u32[31]) && (S0.u32[31] != tmp.u32[31]));\n// signed overflow.\nD0.i32 = tmp.i32', + SOP2Op.S_SUB_I32: 'tmp = S0.i32 - S1.i32;\nSCC = ((S0.u32[31] != S1.u32[31]) && (S0.u32[31] != tmp.u32[31]));\n// signed overflow.\nD0.i32 = tmp.i32', + SOP2Op.S_ADDC_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + SCC.u64;\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_ADDC_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_SUBB_U32: "tmp = S0.u32 - S1.u32 - SCC.u32;\nSCC = 64'U(S1.u32) + SCC.u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_SUBB_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_ABSDIFF_I32: 'D0.i32 = S0.i32 - S1.i32;\nif D0.i32 < 0 then\nD0.i32 = -D0.i32\nendif;\nSCC = D0.i32 != 0', + SOP2Op.S_LSHL_B32: 'D0.u32 = (S0.u32 << S1[4 : 0].u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_LSHL_B64: 'D0.u64 = (S0.u64 << S1[5 : 0].u32);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_LSHR_B32: 'D0.u32 = (S0.u32 >> S1[4 : 0].u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_LSHR_B64: 'D0.u64 = (S0.u64 >> S1[5 : 0].u32);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_ASHR_I32: "D0.i32 = 32'I(signext(S0.i32) >> S1[4 : 0].u32);\nSCC = D0.i32 != 0", + SOP2Op.S_ASHR_I64: 'D0.i64 = (signext(S0.i64) >> S1[5 : 0].u32);\nSCC = D0.i64 != 0LL', + SOP2Op.S_LSHL1_ADD_U32: "tmp = (64'U(S0.u32) << 1U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL2_ADD_U32: "tmp = (64'U(S0.u32) << 2U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL3_ADD_U32: "tmp = (64'U(S0.u32) << 3U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL4_ADD_U32: "tmp = (64'U(S0.u32) << 4U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_MIN_I32: 'SCC = S0.i32 < S1.i32;\nD0.i32 = SCC ? S0.i32 : S1.i32', + SOP2Op.S_MIN_U32: 'SCC = S0.u32 < S1.u32;\nD0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_MAX_I32: 'SCC = S0.i32 >= S1.i32;\nD0.i32 = SCC ? S0.i32 : S1.i32', + SOP2Op.S_MAX_U32: 'SCC = S0.u32 >= S1.u32;\nD0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_AND_B32: 'D0.u32 = (S0.u32 & S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_AND_B64: 'D0.u64 = (S0.u64 & S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_OR_B32: 'D0.u32 = (S0.u32 | S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_OR_B64: 'D0.u64 = (S0.u64 | S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_XOR_B32: 'D0.u32 = (S0.u32 ^ S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_XOR_B64: 'D0.u64 = (S0.u64 ^ S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_NAND_B32: 'D0.u32 = ~(S0.u32 & S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_NAND_B64: 'D0.u64 = ~(S0.u64 & S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_NOR_B32: 'D0.u32 = ~(S0.u32 | S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_NOR_B64: 'D0.u64 = ~(S0.u64 | S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_XNOR_B32: 'D0.u32 = ~(S0.u32 ^ S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_XNOR_B64: 'D0.u64 = ~(S0.u64 ^ S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_AND_NOT1_B32: 'D0.u32 = (S0.u32 & ~S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_AND_NOT1_B64: 'D0.u64 = (S0.u64 & ~S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_OR_NOT1_B32: 'D0.u32 = (S0.u32 | ~S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_OR_NOT1_B64: 'D0.u64 = (S0.u64 | ~S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_BFE_U32: 'D0.u32 = ((S0.u32 >> S1[4 : 0].u32) & ((1U << S1[22 : 16].u32) - 1U));\nSCC = D0.u32 != 0U', + SOP2Op.S_BFE_I32: 'tmp.i32 = ((S0.i32 >> S1[4 : 0].u32) & ((1 << S1[22 : 16].u32) - 1));\nD0.i32 = signext_from_bit(tmp.i32, S1[22 : 16].u32);\nSCC = D0.i32 != 0', + SOP2Op.S_BFE_U64: 'D0.u64 = ((S0.u64 >> S1[5 : 0].u32) & ((1ULL << S1[22 : 16].u32) - 1ULL));\nSCC = D0.u64 != 0ULL', + SOP2Op.S_BFE_I64: 'tmp.i64 = ((S0.i64 >> S1[5 : 0].u32) & ((1LL << S1[22 : 16].u32) - 1LL));\nD0.i64 = signext_from_bit(tmp.i64, S1[22 : 16].u32);\nSCC = D0.i64 != 0LL', + SOP2Op.S_BFM_B32: 'D0.u32 = (((1U << S0[4 : 0].u32) - 1U) << S1[4 : 0].u32)', + SOP2Op.S_BFM_B64: 'D0.u64 = (((1ULL << S0[5 : 0].u32) - 1ULL) << S1[5 : 0].u32)', + SOP2Op.S_MUL_I32: 'D0.i32 = S0.i32 * S1.i32', + SOP2Op.S_MUL_HI_U32: "D0.u32 = 32'U((64'U(S0.u32) * 64'U(S1.u32)) >> 32U)", + SOP2Op.S_MUL_HI_I32: "D0.i32 = 32'I((64'I(S0.i32) * 64'I(S1.i32)) >> 32U)", + SOP2Op.S_CSELECT_B32: 'D0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_CSELECT_B64: 'D0.u64 = SCC ? S0.u64 : S1.u64', + SOP2Op.S_PACK_LL_B32_B16: 'D0 = { S1[15 : 0].u16, S0[15 : 0].u16 }', + SOP2Op.S_PACK_LH_B32_B16: 'D0 = { S1[31 : 16].u16, S0[15 : 0].u16 }', + SOP2Op.S_PACK_HH_B32_B16: 'D0 = { S1[31 : 16].u16, S0[31 : 16].u16 }', + SOP2Op.S_PACK_HL_B32_B16: 'D0 = { S1[15 : 0].u16, S0[31 : 16].u16 }', + SOP2Op.S_ADD_F32: 'D0.f32 = S0.f32 + S1.f32', + SOP2Op.S_SUB_F32: 'D0.f32 = S0.f32 - S1.f32', + SOP2Op.S_MIN_F32: "LT_NEG_ZERO = lambda(a, b) (\n((a < b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && sign(a) && !sign(b))));\n// Version of comparison where -0.0 < +0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif LT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nelse\nif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif LT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + SOP2Op.S_MAX_F32: "GT_NEG_ZERO = lambda(a, b) (\n((a > b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && !sign(a) && sign(b))));\n// Version of comparison where +0.0 > -0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif GT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nelse\nif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif GT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + SOP2Op.S_MUL_F32: 'D0.f32 = S0.f32 * S1.f32', + SOP2Op.S_FMAAK_F32: 'D0.f32 = fma(S0.f32, S1.f32, SIMM32.f32)', + SOP2Op.S_FMAMK_F32: 'D0.f32 = fma(S0.f32, SIMM32.f32, S1.f32)', + SOP2Op.S_FMAC_F32: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + SOP2Op.S_CVT_PK_RTZ_F16_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_TOWARD_ZERO;\ntmp[15 : 0].f16 = f32_to_f16(S0.f32);\ntmp[31 : 16].f16 = f32_to_f16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode;\n// Round-toward-zero regardless of current round mode setting in hardware.', + SOP2Op.S_ADD_F16: 'D0.f16 = S0.f16 + S1.f16', + SOP2Op.S_SUB_F16: 'D0.f16 = S0.f16 - S1.f16', + SOP2Op.S_MIN_F16: "LT_NEG_ZERO = lambda(a, b) (\n((a < b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && sign(a) && !sign(b))));\n// Version of comparison where -0.0 < +0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif LT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nelse\nif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif LT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + SOP2Op.S_MAX_F16: "GT_NEG_ZERO = lambda(a, b) (\n((a > b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && !sign(a) && sign(b))));\n// Version of comparison where +0.0 > -0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif GT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nelse\nif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif GT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + SOP2Op.S_MUL_F16: 'D0.f16 = S0.f16 * S1.f16', + SOP2Op.S_FMAC_F16: 'D0.f16 = fma(S0.f16, S1.f16, D0.f16)', + SOPCOp.S_CMP_EQ_I32: 'SCC = S0.i32 == S1.i32', + SOPCOp.S_CMP_LG_I32: 'SCC = S0.i32 <> S1.i32', + SOPCOp.S_CMP_GT_I32: 'SCC = S0.i32 > S1.i32', + SOPCOp.S_CMP_GE_I32: 'SCC = S0.i32 >= S1.i32', + SOPCOp.S_CMP_LT_I32: 'SCC = S0.i32 < S1.i32', + SOPCOp.S_CMP_LE_I32: 'SCC = S0.i32 <= S1.i32', + SOPCOp.S_CMP_EQ_U32: 'SCC = S0.u32 == S1.u32', + SOPCOp.S_CMP_LG_U32: 'SCC = S0.u32 <> S1.u32', + SOPCOp.S_CMP_GT_U32: 'SCC = S0.u32 > S1.u32', + SOPCOp.S_CMP_GE_U32: 'SCC = S0.u32 >= S1.u32', + SOPCOp.S_CMP_LT_U32: 'SCC = S0.u32 < S1.u32', + SOPCOp.S_CMP_LE_U32: 'SCC = S0.u32 <= S1.u32', + SOPCOp.S_BITCMP0_B32: "SCC = S0.u32[S1.u32[4 : 0]] == 1'0U", + SOPCOp.S_BITCMP1_B32: "SCC = S0.u32[S1.u32[4 : 0]] == 1'1U", + SOPCOp.S_BITCMP0_B64: "SCC = S0.u64[S1.u32[5 : 0]] == 1'0U", + SOPCOp.S_BITCMP1_B64: "SCC = S0.u64[S1.u32[5 : 0]] == 1'1U", + SOPCOp.S_CMP_EQ_U64: 'SCC = S0.u64 == S1.u64', + SOPCOp.S_CMP_LG_U64: 'SCC = S0.u64 <> S1.u64', + SOPCOp.S_CMP_LT_F32: 'SCC = S0.f32 < S1.f32', + SOPCOp.S_CMP_EQ_F32: 'SCC = S0.f32 == S1.f32', + SOPCOp.S_CMP_LE_F32: 'SCC = S0.f32 <= S1.f32', + SOPCOp.S_CMP_GT_F32: 'SCC = S0.f32 > S1.f32', + SOPCOp.S_CMP_LG_F32: 'SCC = S0.f32 <> S1.f32', + SOPCOp.S_CMP_GE_F32: 'SCC = S0.f32 >= S1.f32', + SOPCOp.S_CMP_O_F32: "SCC = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)))", + SOPCOp.S_CMP_U_F32: "SCC = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)))", + SOPCOp.S_CMP_NGE_F32: 'SCC = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <', + SOPCOp.S_CMP_NLG_F32: 'SCC = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==', + SOPCOp.S_CMP_NGT_F32: 'SCC = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=', + SOPCOp.S_CMP_NLE_F32: 'SCC = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >', + SOPCOp.S_CMP_NEQ_F32: 'SCC = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=', + SOPCOp.S_CMP_NLT_F32: 'SCC = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=', + SOPCOp.S_CMP_LT_F16: 'SCC = S0.f16 < S1.f16', + SOPCOp.S_CMP_EQ_F16: 'SCC = S0.f16 == S1.f16', + SOPCOp.S_CMP_LE_F16: 'SCC = S0.f16 <= S1.f16', + SOPCOp.S_CMP_GT_F16: 'SCC = S0.f16 > S1.f16', + SOPCOp.S_CMP_LG_F16: 'SCC = S0.f16 <> S1.f16', + SOPCOp.S_CMP_GE_F16: 'SCC = S0.f16 >= S1.f16', + SOPCOp.S_CMP_O_F16: "SCC = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)))", + SOPCOp.S_CMP_U_F16: "SCC = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)))", + SOPCOp.S_CMP_NGE_F16: 'SCC = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <', + SOPCOp.S_CMP_NLG_F16: 'SCC = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==', + SOPCOp.S_CMP_NGT_F16: 'SCC = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=', + SOPCOp.S_CMP_NLE_F16: 'SCC = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >', + SOPCOp.S_CMP_NEQ_F16: 'SCC = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=', + SOPCOp.S_CMP_NLT_F16: 'SCC = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=', + SOPKOp.S_MOVK_I32: "D0.i32 = 32'I(signext(SIMM16.i16))", + SOPKOp.S_VERSION: 'nop();\n// Do nothing - for use by tools only', + SOPKOp.S_CMOVK_I32: "if SCC then\nD0.i32 = 32'I(signext(SIMM16.i16))\nendif", + SOPKOp.S_CMPK_EQ_I32: "SCC = 64'I(S0.i32) == signext(SIMM16.i16)", + SOPKOp.S_CMPK_LG_I32: "SCC = 64'I(S0.i32) != signext(SIMM16.i16)", + SOPKOp.S_CMPK_GT_I32: "SCC = 64'I(S0.i32) > signext(SIMM16.i16)", + SOPKOp.S_CMPK_GE_I32: "SCC = 64'I(S0.i32) >= signext(SIMM16.i16)", + SOPKOp.S_CMPK_LT_I32: "SCC = 64'I(S0.i32) < signext(SIMM16.i16)", + SOPKOp.S_CMPK_LE_I32: "SCC = 64'I(S0.i32) <= signext(SIMM16.i16)", + SOPKOp.S_CMPK_EQ_U32: "SCC = S0.u32 == 32'U(SIMM16.u16)", + SOPKOp.S_CMPK_LG_U32: "SCC = S0.u32 != 32'U(SIMM16.u16)", + SOPKOp.S_CMPK_GT_U32: "SCC = S0.u32 > 32'U(SIMM16.u16)", + SOPKOp.S_CMPK_GE_U32: "SCC = S0.u32 >= 32'U(SIMM16.u16)", + SOPKOp.S_CMPK_LT_U32: "SCC = S0.u32 < 32'U(SIMM16.u16)", + SOPKOp.S_CMPK_LE_U32: "SCC = S0.u32 <= 32'U(SIMM16.u16)", + SOPKOp.S_ADDK_I32: "tmp = D0.i32;\n// save value so we can check sign bits for overflow later.\nD0.i32 = 32'I(64'I(D0.i32) + signext(SIMM16.i16));\nSCC = ((tmp[31] == SIMM16.i16[15]) && (tmp[31] != D0.i32[31]));\n// signed overflow.", + SOPKOp.S_MULK_I32: "D0.i32 = 32'I(64'I(D0.i32) * signext(SIMM16.i16))", + SOPKOp.S_GETREG_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nvalue = HW_REGISTERS[hwRegId];\nD0.u32 = 32'U(32'I(value >> offset.u32) & ((1 << size) - 1))", + SOPKOp.S_SETREG_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nmask = (1 << size) - 1;\nmask = (mask & 32'I(writeableBitMask(hwRegId.u32, WAVE_STATUS.PRIV)));\n// Mask of bits we are allowed to modify\nvalue = ((S0.u32 << offset.u32) & mask.u32);\nvalue = (value | 32'U(HW_REGISTERS[hwRegId].i32 & ~mask));\nHW_REGISTERS[hwRegId] = value.b32;\n// Side-effects may trigger here if certain bits are modified", + SOPKOp.S_SETREG_IMM32_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nmask = (1 << size) - 1;\nmask = (mask & 32'I(writeableBitMask(hwRegId.u32, WAVE_STATUS.PRIV)));\n// Mask of bits we are allowed to modify\nvalue = ((SIMM32.u32 << offset.u32) & mask.u32);\nvalue = (value | 32'U(HW_REGISTERS[hwRegId].i32 & ~mask));\nHW_REGISTERS[hwRegId] = value.b32;\n// Side-effects may trigger here if certain bits are modified", + SOPKOp.S_CALL_B64: "D0.i64 = PC + 4LL;\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL", + SOPKOp.S_WAITCNT_VSCNT: 'vscnt <= S0.u[5:0] + S1.u[5:0].\n// Comparison is 6 bits, no clamping is applied for add overflow', + SOPKOp.S_WAITCNT_VMCNT: 'vmcnt <= S0.u[5:0] + S1.u[5:0].\n// Comparison is 6 bits, no clamping is applied for add overflow', + SOPKOp.S_WAITCNT_EXPCNT: 'expcnt <= S0.u[2:0] + S1.u[2:0].\n// Comparison is 3 bits, no clamping is applied for add overflow', + SOPKOp.S_WAITCNT_LGKMCNT: 'lgkmcnt <= S0.u[5:0] + S1.u[5:0].\n// Comparison is 6 bits, no clamping is applied for add overflow', + SOPPOp.S_NOP: 'for i in 0U : SIMM16.u16[3 : 0].u32 do\nnop()\nendfor', + SOPPOp.S_SLEEP: 's_sleep 0 // Wait for 0 clocks.\ns_sleep 1 // Wait for 1-64 clocks.\ns_sleep 2 // Wait for 65-128 clocks.', + SOPPOp.S_DELAY_ALU: 'v_mov_b32 v3, v0\nv_lshlrev_b32 v30, 1, v31\nv_lshlrev_b32 v24, 1, v25\ns_delay_alu instid0(INSTID_VALU_DEP_3) | instskip(INSTSKIP_SKIP_1) | instid1(INSTID_VALU_DEP_1)\n// 1 cycle delay here\nv_add_f32 v0, v1, v3\nv_sub_f32 v11, v9, v9\n// 2 cycles delay here\nv_mul_f32 v10, v13, v11', + SOPPOp.S_WAITCNT: 'expcnt <= WaitEXPCNT\nlgkmcnt <= WaitLGKMCNT\nvmcnt <= WaitVMCNT', + SOPPOp.S_TRAP: 'TrapID = SIMM16.u16[7 : 0];\n"Wait for all instructions to complete";\n// PC passed into trap handler points to S_TRAP itself,\n// *not* to the next instruction.\n{ TTMP[1], TTMP[0] } = { 7\'0, HT[0], TrapID[7 : 0], PC[47 : 0] };\nPC = TBA.i64;\n// trap base address\nWAVE_STATUS.PRIV = 1\'1U', + SOPPOp.S_CODE_END: '...\ns_endpgm // last real instruction in shader buffer\ns_code_end // 1\ns_code_end // 2\ns_code_end // 3\ns_code_end // 4\ns_code_end // done!', + SOPPOp.S_BRANCH: "PC = PC + signext(SIMM16.i16 * 16'4) + 4LL;\n// short jump.", + SOPPOp.S_CBRANCH_SCC0: "if SCC == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_SCC1: "if SCC == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_VCCZ: "if VCCZ.u1 == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_VCCNZ: "if VCCZ.u1 == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_EXECZ: "if EXECZ.u1 == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_EXECNZ: "if EXECZ.u1 == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_CDBGSYS: "if WAVE_STATUS.COND_DBG_SYS.u32 != 0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_CDBGUSER: "if WAVE_STATUS.COND_DBG_USER.u32 != 0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_CDBGSYS_OR_USER: "if (WAVE_STATUS.COND_DBG_SYS || WAVE_STATUS.COND_DBG_USER) then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_CDBGSYS_AND_USER: "if (WAVE_STATUS.COND_DBG_SYS && WAVE_STATUS.COND_DBG_USER) then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_SETPRIO: 'Priority = {SysUserPrio[1:0], WaveAge[3:0]}\nSysUserPrio = MIN(3, SysPrio[1:0] + UserPrio[1:0]).', + VINTERPOp.V_INTERP_P10_F32: 'D0.f32 = fma(VGPR[(laneId.u32 & 0xfffffffcU) + 1U][SRC0.u32].f32, S1.f32, VGPR[laneId.u32 &\n0xfffffffcU][SRC2.u32].f32)', + VINTERPOp.V_INTERP_P2_F32: 'D0.f32 = fma(VGPR[(laneId.u32 & 0xfffffffcU) + 2U][SRC0.u32].f32, S1.f32, S2.f32)', + VINTERPOp.V_INTERP_P10_F16_F32: "D0.f32 = fma(32'F(VGPR[(laneId.u32 & 0xfffffffcU) + 1U][SRC0.u32].f16), S1.f32, 32'F(VGPR[laneId.u32 &\n0xfffffffcU][SRC2.u32].f16))", + VINTERPOp.V_INTERP_P2_F16_F32: "D0.f16 = 16'F(fma(32'F(VGPR[(laneId.u32 & 0xfffffffcU) + 2U][SRC0.u32].f16), S1.f32, S2.f32))", + VINTERPOp.V_INTERP_P10_RTZ_F16_F32: "D0.f32 = fma(32'F(VGPR[(laneId.u32 & 0xfffffffcU) + 1U][SRC0.u32].f16), S1.f32, 32'F(VGPR[laneId.u32 &\n0xfffffffcU][SRC2.u32].f16))", + VINTERPOp.V_INTERP_P2_RTZ_F16_F32: "D0.f32 = fma(32'F(VGPR[(laneId.u32 & 0xfffffffcU) + 2U][SRC0.u32].f16), S1.f32, S2.f32)", + VOP1Op.V_MOV_B32_E32: 'D0.b32 = S0.b32', + VOP1Op.V_READFIRSTLANE_B32_E32: "declare lane : 32'U;\nif WAVE64 then\n// 64 lanes\nif EXEC == 0x0LL then\nlane = 0U;\n// Force lane 0 if all lanes are disabled\nelse\nlane = 32'U(s_ff1_i32_b64(EXEC));\n// Lowest active lane\nendif\nelse\n// 32 lanes\nif EXEC_LO.i32 == 0 then\nlane = 0U;\n// Force lane 0 if all lanes are disabled\nelse\nlane = 32'U(s_ff1_i32_b32(EXEC_LO));\n// Lowest active lane\nendif\nendif;\nD0.b32 = VGPR[lane][SRC0.u32]", + VOP1Op.V_CVT_I32_F64_E32: 'D0.i32 = f64_to_i32(S0.f64)', + VOP1Op.V_CVT_F64_I32_E32: 'D0.f64 = i32_to_f64(S0.i32)', + VOP1Op.V_CVT_F32_I32_E32: 'D0.f32 = i32_to_f32(S0.i32)', + VOP1Op.V_CVT_F32_U32_E32: 'D0.f32 = u32_to_f32(S0.u32)', + VOP1Op.V_CVT_U32_F32_E32: 'D0.u32 = f32_to_u32(S0.f32)', + VOP1Op.V_CVT_I32_F32_E32: 'D0.i32 = f32_to_i32(S0.f32)', + VOP1Op.V_CVT_F16_F32_E32: 'D0.f16 = f32_to_f16(S0.f32)', + VOP1Op.V_CVT_F32_F16_E32: 'D0.f32 = f16_to_f32(S0.f16)', + VOP1Op.V_CVT_NEAREST_I32_F32_E32: 'D0.i32 = f32_to_i32(floor(S0.f32 + 0.5F))', + VOP1Op.V_CVT_FLOOR_I32_F32_E32: 'D0.i32 = f32_to_i32(floor(S0.f32))', + VOP1Op.V_CVT_OFF_F32_I4_E32: "declare CVT_OFF_TABLE : 32'F[16];\nD0.f32 = CVT_OFF_TABLE[S0.u32[3 : 0]]", + VOP1Op.V_CVT_F32_F64_E32: 'D0.f32 = f64_to_f32(S0.f64)', + VOP1Op.V_CVT_F64_F32_E32: 'D0.f64 = f32_to_f64(S0.f32)', + VOP1Op.V_CVT_F32_UBYTE0_E32: 'D0.f32 = u32_to_f32(S0[7 : 0].u32)', + VOP1Op.V_CVT_F32_UBYTE1_E32: 'D0.f32 = u32_to_f32(S0[15 : 8].u32)', + VOP1Op.V_CVT_F32_UBYTE2_E32: 'D0.f32 = u32_to_f32(S0[23 : 16].u32)', + VOP1Op.V_CVT_F32_UBYTE3_E32: 'D0.f32 = u32_to_f32(S0[31 : 24].u32)', + VOP1Op.V_CVT_U32_F64_E32: 'D0.u32 = f64_to_u32(S0.f64)', + VOP1Op.V_CVT_F64_U32_E32: 'D0.f64 = u32_to_f64(S0.u32)', + VOP1Op.V_TRUNC_F64_E32: 'D0.f64 = trunc(S0.f64)', + VOP1Op.V_CEIL_F64_E32: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 > 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += 1.0\nendif', + VOP1Op.V_RNDNE_F64_E32: 'D0.f64 = floor(S0.f64 + 0.5);\nif (isEven(floor(S0.f64)) && (fract(S0.f64) == 0.5)) then\nD0.f64 -= 1.0\nendif', + VOP1Op.V_FLOOR_F64_E32: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 < 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += -1.0\nendif', + VOP1Op.V_MOV_B16_E32: 'D0.b16 = S0.b16', + VOP1Op.V_FRACT_F32_E32: 'D0.f32 = S0.f32 + -floor(S0.f32)', + VOP1Op.V_TRUNC_F32_E32: 'D0.f32 = trunc(S0.f32)', + VOP1Op.V_CEIL_F32_E32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 > 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += 1.0F\nendif', + VOP1Op.V_RNDNE_F32_E32: "D0.f32 = floor(S0.f32 + 0.5F);\nif (isEven(64'F(floor(S0.f32))) && (fract(S0.f32) == 0.5F)) then\nD0.f32 -= 1.0F\nendif", + VOP1Op.V_FLOOR_F32_E32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 < 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += -1.0F\nendif', + VOP1Op.V_EXP_F32_E32: 'D0.f32 = pow(2.0F, S0.f32)', + VOP1Op.V_LOG_F32_E32: 'D0.f32 = log2(S0.f32)', + VOP1Op.V_RCP_F32_E32: 'D0.f32 = 1.0F / S0.f32', + VOP1Op.V_RCP_IFLAG_F32_E32: 'D0.f32 = 1.0F / S0.f32;\n// Can only raise integer DIV_BY_ZERO exception', + VOP1Op.V_RSQ_F32_E32: 'D0.f32 = 1.0F / sqrt(S0.f32)', + VOP1Op.V_RCP_F64_E32: 'D0.f64 = 1.0 / S0.f64', + VOP1Op.V_RSQ_F64_E32: 'D0.f64 = 1.0 / sqrt(S0.f64)', + VOP1Op.V_SQRT_F32_E32: 'D0.f32 = sqrt(S0.f32)', + VOP1Op.V_SQRT_F64_E32: 'D0.f64 = sqrt(S0.f64)', + VOP1Op.V_SIN_F32_E32: "D0.f32 = sin(S0.f32 * 32'F(PI * 2.0))", + VOP1Op.V_COS_F32_E32: "D0.f32 = cos(S0.f32 * 32'F(PI * 2.0))", + VOP1Op.V_NOT_B32_E32: 'D0.u32 = ~S0.u32', + VOP1Op.V_BFREV_B32_E32: 'D0.u32[31 : 0] = S0.u32[0 : 31]', + VOP1Op.V_CLZ_I32_U32_E32: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP1Op.V_CTZ_I32_B32_E32: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP1Op.V_CLS_I32_E32: 'D0.i32 = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.i32[31 - i] != S0.i32[31] then\nD0.i32 = i;\nbreak\nendif\nendfor', + VOP1Op.V_FREXP_EXP_I32_F64_E32: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f64) - 1023 + 1\nendif', + VOP1Op.V_FREXP_MANT_F64_E32: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.f64 = S0.f64\nelse\nD0.f64 = mantissa(S0.f64)\nendif', + VOP1Op.V_FRACT_F64_E32: 'D0.f64 = S0.f64 + -floor(S0.f64)', + VOP1Op.V_FREXP_EXP_I32_F32_E32: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f32) - 127 + 1\nendif", + VOP1Op.V_FREXP_MANT_F32_E32: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.f32 = S0.f32\nelse\nD0.f32 = mantissa(S0.f32)\nendif", + VOP1Op.V_MOVRELD_B32_E32: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nVGPR[laneId][addr].b32 = S0.b32', + VOP1Op.V_MOVRELS_B32_E32: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b32 = VGPR[laneId][addr].b32', + VOP1Op.V_MOVRELSD_B32_E32: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[31 : 0];\naddrd += M0.u32[31 : 0];\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32', + VOP1Op.V_MOVRELSD_2_B32_E32: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[9 : 0].u32;\naddrd += M0.u32[25 : 16].u32;\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32', + VOP1Op.V_CVT_F16_U16_E32: 'D0.f16 = u16_to_f16(S0.u16)', + VOP1Op.V_CVT_F16_I16_E32: 'D0.f16 = i16_to_f16(S0.i16)', + VOP1Op.V_CVT_U16_F16_E32: 'D0.u16 = f16_to_u16(S0.f16)', + VOP1Op.V_CVT_I16_F16_E32: 'D0.i16 = f16_to_i16(S0.f16)', + VOP1Op.V_RCP_F16_E32: "D0.f16 = 16'1.0 / S0.f16", + VOP1Op.V_SQRT_F16_E32: 'D0.f16 = sqrt(S0.f16)', + VOP1Op.V_RSQ_F16_E32: "D0.f16 = 16'1.0 / sqrt(S0.f16)", + VOP1Op.V_LOG_F16_E32: 'D0.f16 = log2(S0.f16)', + VOP1Op.V_EXP_F16_E32: "D0.f16 = pow(16'2.0, S0.f16)", + VOP1Op.V_FREXP_MANT_F16_E32: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.f16 = S0.f16\nelse\nD0.f16 = mantissa(S0.f16)\nendif", + VOP1Op.V_FREXP_EXP_I16_F16_E32: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.i16 = 16'0\nelse\nD0.i16 = 16'I(exponent(S0.f16) - 15 + 1)\nendif", + VOP1Op.V_FLOOR_F16_E32: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 < 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += -16'1.0\nendif", + VOP1Op.V_CEIL_F16_E32: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 > 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += 16'1.0\nendif", + VOP1Op.V_TRUNC_F16_E32: 'D0.f16 = trunc(S0.f16)', + VOP1Op.V_RNDNE_F16_E32: "D0.f16 = floor(S0.f16 + 16'0.5);\nif (isEven(64'F(floor(S0.f16))) && (fract(S0.f16) == 16'0.5)) then\nD0.f16 -= 16'1.0\nendif", + VOP1Op.V_FRACT_F16_E32: 'D0.f16 = S0.f16 + -floor(S0.f16)', + VOP1Op.V_SIN_F16_E32: "D0.f16 = sin(S0.f16 * 16'F(PI * 2.0))", + VOP1Op.V_COS_F16_E32: "D0.f16 = cos(S0.f16 * 16'F(PI * 2.0))", + VOP1Op.V_SAT_PK_U8_I16_E32: "SAT8 = lambda(n) (\nif n.i32 <= 0 then\nreturn 8'0U\nelsif n >= 16'I(0xff) then\nreturn 8'255U\nelse\nreturn n[7 : 0].u8\nendif);\nD0.b16 = { SAT8(S0[31 : 16].i16), SAT8(S0[15 : 0].i16) }", + VOP1Op.V_CVT_NORM_I16_F16_E32: 'D0.i16 = f16_to_snorm(S0.f16)', + VOP1Op.V_CVT_NORM_U16_F16_E32: 'D0.u16 = f16_to_unorm(S0.f16)', + VOP1Op.V_SWAP_B32_E32: 'tmp = D0.b32;\nD0.b32 = S0.b32;\nS0.b32 = tmp', + VOP1Op.V_SWAP_B16_E32: 'tmp = D0.b16;\nD0.b16 = S0.b16;\nS0.b16 = tmp', + VOP1Op.V_PERMLANE64_B32_E32: "declare tmp : 32'B[64];\ndeclare lane : 32'U;\nif WAVE32 then\n// Supported in wave64 ONLY; treated as scalar NOP in wave32\ns_nop(16'0U)\nelse\nfor lane in 0U : 63U do\n// Copy original S0 in case D==S0\ntmp[lane] = VGPR[lane][SRC0.u32]\nendfor;\nfor lane in 0U : 63U do\naltlane = { ~lane[5], lane[4 : 0] };\n// 0<->32, ..., 31<->63\nif EXEC[lane].u1 then\nVGPR[lane][VDST.u32] = tmp[altlane]\nendif\nendfor\nendif", + VOP1Op.V_SWAPREL_B32_E32: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[9 : 0].u32;\naddrd += M0.u32[25 : 16].u32;\ntmp = VGPR[laneId][addrd].b32;\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32;\nVGPR[laneId][addrs].b32 = tmp', + VOP1Op.V_NOT_B16_E32: 'D0.u16 = ~S0.u16', + VOP1Op.V_CVT_I32_I16_E32: "D0.i32 = 32'I(signext(S0.i16))", + VOP1Op.V_CVT_U32_U16_E32: "D0 = { 16'0, S0.u16 }", + VOP2Op.V_CNDMASK_B32_E32: 'D0.u32 = VCC.u64[laneId] ? S1.u32 : S0.u32', + VOP2Op.V_DOT2ACC_F32_F16_E32: 'tmp = D0.f32;\ntmp += f16_to_f32(S0[15 : 0].f16) * f16_to_f32(S1[15 : 0].f16);\ntmp += f16_to_f32(S0[31 : 16].f16) * f16_to_f32(S1[31 : 16].f16);\nD0.f32 = tmp', + VOP2Op.V_ADD_F32_E32: 'D0.f32 = S0.f32 + S1.f32', + VOP2Op.V_SUB_F32_E32: 'D0.f32 = S0.f32 - S1.f32', + VOP2Op.V_SUBREV_F32_E32: 'D0.f32 = S1.f32 - S0.f32', + VOP2Op.V_FMAC_DX9_ZERO_F32_E32: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = S2.f32\nelse\nD0.f32 = fma(S0.f32, S1.f32, D0.f32)\nendif", + VOP2Op.V_MUL_DX9_ZERO_F32_E32: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = 0.0F\nelse\nD0.f32 = S0.f32 * S1.f32\nendif", + VOP2Op.V_MUL_F32_E32: 'D0.f32 = S0.f32 * S1.f32', + VOP2Op.V_MUL_I32_I24_E32: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24)", + VOP2Op.V_MUL_HI_I32_I24_E32: "D0.i32 = 32'I((64'I(S0.i24) * 64'I(S1.i24)) >> 32U)", + VOP2Op.V_MUL_U32_U24_E32: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24)", + VOP2Op.V_MUL_HI_U32_U24_E32: "D0.u32 = 32'U((64'U(S0.u24) * 64'U(S1.u24)) >> 32U)", + VOP2Op.V_MIN_F32_E32: "LT_NEG_ZERO = lambda(a, b) (\n((a < b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && sign(a) && !sign(b))));\n// Version of comparison where -0.0 < +0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif LT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nelse\nif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif LT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + VOP2Op.V_MAX_F32_E32: "GT_NEG_ZERO = lambda(a, b) (\n((a > b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && !sign(a) && sign(b))));\n// Version of comparison where +0.0 > -0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif GT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nelse\nif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif GT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + VOP2Op.V_MIN_I32_E32: 'D0.i32 = S0.i32 < S1.i32 ? S0.i32 : S1.i32', + VOP2Op.V_MAX_I32_E32: 'D0.i32 = S0.i32 >= S1.i32 ? S0.i32 : S1.i32', + VOP2Op.V_MIN_U32_E32: 'D0.u32 = S0.u32 < S1.u32 ? S0.u32 : S1.u32', + VOP2Op.V_MAX_U32_E32: 'D0.u32 = S0.u32 >= S1.u32 ? S0.u32 : S1.u32', + VOP2Op.V_LSHLREV_B32_E32: 'D0.u32 = (S1.u32 << S0[4 : 0].u32)', + VOP2Op.V_LSHRREV_B32_E32: 'D0.u32 = (S1.u32 >> S0[4 : 0].u32)', + VOP2Op.V_ASHRREV_I32_E32: 'D0.i32 = (S1.i32 >> S0[4 : 0].u32)', + VOP2Op.V_AND_B32_E32: 'D0.u32 = (S0.u32 & S1.u32)', + VOP2Op.V_OR_B32_E32: 'D0.u32 = (S0.u32 | S1.u32)', + VOP2Op.V_XOR_B32_E32: 'D0.u32 = (S0.u32 ^ S1.u32)', + VOP2Op.V_XNOR_B32_E32: 'D0.u32 = ~(S0.u32 ^ S1.u32)', + VOP2Op.V_ADD_CO_CI_U32_E32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + VCC.u64[laneId].u64;\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADD_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_SUB_CO_CI_U32_E32: "tmp = S0.u32 - S1.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S1.u32) + VCC.u64[laneId].u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_SUBREV_CO_CI_U32_E32: "tmp = S1.u32 - S0.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S0.u32) + VCC.u64[laneId].u64 > 64'U(S1.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_ADD_NC_U32_E32: 'D0.u32 = S0.u32 + S1.u32', + VOP2Op.V_SUB_NC_U32_E32: 'D0.u32 = S0.u32 - S1.u32', + VOP2Op.V_SUBREV_NC_U32_E32: 'D0.u32 = S1.u32 - S0.u32', + VOP2Op.V_FMAC_F32_E32: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + VOP2Op.V_FMAMK_F32_E32: 'D0.f32 = fma(S0.f32, SIMM32.f32, S1.f32)', + VOP2Op.V_FMAAK_F32_E32: 'D0.f32 = fma(S0.f32, S1.f32, SIMM32.f32)', + VOP2Op.V_CVT_PK_RTZ_F16_F32_E32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_TOWARD_ZERO;\ntmp[15 : 0].f16 = f32_to_f16(S0.f32);\ntmp[31 : 16].f16 = f32_to_f16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode;\n// Round-toward-zero regardless of current round mode setting in hardware.', + VOP2Op.V_ADD_F16_E32: 'D0.f16 = S0.f16 + S1.f16', + VOP2Op.V_SUB_F16_E32: 'D0.f16 = S0.f16 - S1.f16', + VOP2Op.V_SUBREV_F16_E32: 'D0.f16 = S1.f16 - S0.f16', + VOP2Op.V_MUL_F16_E32: 'D0.f16 = S0.f16 * S1.f16', + VOP2Op.V_FMAC_F16_E32: 'D0.f16 = fma(S0.f16, S1.f16, D0.f16)', + VOP2Op.V_FMAMK_F16_E32: 'D0.f16 = fma(S0.f16, SIMM32.f16, S1.f16)', + VOP2Op.V_FMAAK_F16_E32: 'D0.f16 = fma(S0.f16, S1.f16, SIMM32.f16)', + VOP2Op.V_MAX_F16_E32: "GT_NEG_ZERO = lambda(a, b) (\n((a > b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && !sign(a) && sign(b))));\n// Version of comparison where +0.0 > -0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif GT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nelse\nif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif GT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + VOP2Op.V_MIN_F16_E32: "LT_NEG_ZERO = lambda(a, b) (\n((a < b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && sign(a) && !sign(b))));\n// Version of comparison where -0.0 < +0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif LT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nelse\nif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif LT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + VOP2Op.V_LDEXP_F16_E32: "D0.f16 = S0.f16 * 16'F(2.0F ** 32'I(S1.i16))", + VOP2Op.V_PK_FMAC_F16_E32: 'D0[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, D0[31 : 16].f16);\nD0[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, D0[15 : 0].f16)', + VOP3Op.V_CMP_F_F16_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_F16_E64: 'D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F16_E64: 'D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F16_E64: 'D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F16_E64: 'D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F16_E64: 'D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F16_E64: 'D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F16_E64: "D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_U_F16_E64: "D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_NGE_F16_E64: 'D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F16_E64: 'D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F16_E64: 'D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F16_E64: 'D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F16_E64: 'D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F16_E64: 'D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_F16_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_F32_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_F32_E64: 'D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F32_E64: 'D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F32_E64: 'D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F32_E64: 'D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F32_E64: 'D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F32_E64: 'D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F32_E64: "D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_U_F32_E64: "D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_NGE_F32_E64: 'D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F32_E64: 'D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F32_E64: 'D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F32_E64: 'D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F32_E64: 'D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F32_E64: 'D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_F32_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_F64_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_F64_E64: 'D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F64_E64: 'D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F64_E64: 'D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F64_E64: 'D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F64_E64: 'D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F64_E64: 'D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F64_E64: 'D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_U_F64_E64: 'D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGE_F64_E64: 'D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F64_E64: 'D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F64_E64: 'D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F64_E64: 'D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F64_E64: 'D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F64_E64: 'D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_F64_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_I16_E64: 'D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I16_E64: 'D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I16_E64: 'D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I16_E64: 'D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I16_E64: 'D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I16_E64: 'D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_U16_E64: 'D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U16_E64: 'D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U16_E64: 'D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U16_E64: 'D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U16_E64: 'D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U16_E64: 'D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_F_I32_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_I32_E64: 'D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I32_E64: 'D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I32_E64: 'D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I32_E64: 'D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I32_E64: 'D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I32_E64: 'D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_I32_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_U32_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_U32_E64: 'D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U32_E64: 'D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U32_E64: 'D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U32_E64: 'D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U32_E64: 'D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U32_E64: 'D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_U32_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_I64_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_I64_E64: 'D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I64_E64: 'D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I64_E64: 'D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I64_E64: 'D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I64_E64: 'D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I64_E64: 'D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_I64_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_F_U64_E64: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_LT_U64_E64: 'D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U64_E64: 'D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U64_E64: 'D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U64_E64: 'D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U64_E64: 'D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U64_E64: 'D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_T_U64_E64: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_CLASS_F16_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_CLASS_F32_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_CLASS_F64_E64: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_F_F16_E64: "EXEC.u64[laneId] = 1'0U", + VOP3Op.V_CMPX_LT_F16_E64: 'EXEC.u64[laneId] = S0.f16 < S1.f16', + VOP3Op.V_CMPX_EQ_F16_E64: 'EXEC.u64[laneId] = S0.f16 == S1.f16', + VOP3Op.V_CMPX_LE_F16_E64: 'EXEC.u64[laneId] = S0.f16 <= S1.f16', + VOP3Op.V_CMPX_GT_F16_E64: 'EXEC.u64[laneId] = S0.f16 > S1.f16', + VOP3Op.V_CMPX_LG_F16_E64: 'EXEC.u64[laneId] = S0.f16 <> S1.f16', + VOP3Op.V_CMPX_GE_F16_E64: 'EXEC.u64[laneId] = S0.f16 >= S1.f16', + VOP3Op.V_CMPX_O_F16_E64: "EXEC.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)))", + VOP3Op.V_CMPX_U_F16_E64: "EXEC.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)))", + VOP3Op.V_CMPX_NGE_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <', + VOP3Op.V_CMPX_NLG_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==', + VOP3Op.V_CMPX_NGT_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=', + VOP3Op.V_CMPX_NLE_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >', + VOP3Op.V_CMPX_NEQ_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=', + VOP3Op.V_CMPX_NLT_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=', + VOP3Op.V_CMPX_T_F16_E64: "EXEC.u64[laneId] = 1'1U", + VOP3Op.V_CMPX_F_F32_E64: "EXEC.u64[laneId] = 1'0U", + VOP3Op.V_CMPX_LT_F32_E64: 'EXEC.u64[laneId] = S0.f32 < S1.f32', + VOP3Op.V_CMPX_EQ_F32_E64: 'EXEC.u64[laneId] = S0.f32 == S1.f32', + VOP3Op.V_CMPX_LE_F32_E64: 'EXEC.u64[laneId] = S0.f32 <= S1.f32', + VOP3Op.V_CMPX_GT_F32_E64: 'EXEC.u64[laneId] = S0.f32 > S1.f32', + VOP3Op.V_CMPX_LG_F32_E64: 'EXEC.u64[laneId] = S0.f32 <> S1.f32', + VOP3Op.V_CMPX_GE_F32_E64: 'EXEC.u64[laneId] = S0.f32 >= S1.f32', + VOP3Op.V_CMPX_O_F32_E64: "EXEC.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)))", + VOP3Op.V_CMPX_U_F32_E64: "EXEC.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)))", + VOP3Op.V_CMPX_NGE_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <', + VOP3Op.V_CMPX_NLG_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==', + VOP3Op.V_CMPX_NGT_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=', + VOP3Op.V_CMPX_NLE_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >', + VOP3Op.V_CMPX_NEQ_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=', + VOP3Op.V_CMPX_NLT_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=', + VOP3Op.V_CMPX_T_F32_E64: "EXEC.u64[laneId] = 1'1U", + VOP3Op.V_CMPX_F_F64_E64: "EXEC.u64[laneId] = 1'0U", + VOP3Op.V_CMPX_LT_F64_E64: 'EXEC.u64[laneId] = S0.f64 < S1.f64', + VOP3Op.V_CMPX_EQ_F64_E64: 'EXEC.u64[laneId] = S0.f64 == S1.f64', + VOP3Op.V_CMPX_LE_F64_E64: 'EXEC.u64[laneId] = S0.f64 <= S1.f64', + VOP3Op.V_CMPX_GT_F64_E64: 'EXEC.u64[laneId] = S0.f64 > S1.f64', + VOP3Op.V_CMPX_LG_F64_E64: 'EXEC.u64[laneId] = S0.f64 <> S1.f64', + VOP3Op.V_CMPX_GE_F64_E64: 'EXEC.u64[laneId] = S0.f64 >= S1.f64', + VOP3Op.V_CMPX_O_F64_E64: 'EXEC.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64))', + VOP3Op.V_CMPX_U_F64_E64: 'EXEC.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64))', + VOP3Op.V_CMPX_NGE_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <', + VOP3Op.V_CMPX_NLG_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==', + VOP3Op.V_CMPX_NGT_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=', + VOP3Op.V_CMPX_NLE_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >', + VOP3Op.V_CMPX_NEQ_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=', + VOP3Op.V_CMPX_NLT_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=', + VOP3Op.V_CMPX_T_F64_E64: "EXEC.u64[laneId] = 1'1U", + VOP3Op.V_CMPX_LT_I16_E64: 'EXEC.u64[laneId] = S0.i16 < S1.i16', + VOP3Op.V_CMPX_EQ_I16_E64: 'EXEC.u64[laneId] = S0.i16 == S1.i16', + VOP3Op.V_CMPX_LE_I16_E64: 'EXEC.u64[laneId] = S0.i16 <= S1.i16', + VOP3Op.V_CMPX_GT_I16_E64: 'EXEC.u64[laneId] = S0.i16 > S1.i16', + VOP3Op.V_CMPX_NE_I16_E64: 'EXEC.u64[laneId] = S0.i16 <> S1.i16', + VOP3Op.V_CMPX_GE_I16_E64: 'EXEC.u64[laneId] = S0.i16 >= S1.i16', + VOP3Op.V_CMPX_LT_U16_E64: 'EXEC.u64[laneId] = S0.u16 < S1.u16', + VOP3Op.V_CMPX_EQ_U16_E64: 'EXEC.u64[laneId] = S0.u16 == S1.u16', + VOP3Op.V_CMPX_LE_U16_E64: 'EXEC.u64[laneId] = S0.u16 <= S1.u16', + VOP3Op.V_CMPX_GT_U16_E64: 'EXEC.u64[laneId] = S0.u16 > S1.u16', + VOP3Op.V_CMPX_NE_U16_E64: 'EXEC.u64[laneId] = S0.u16 <> S1.u16', + VOP3Op.V_CMPX_GE_U16_E64: 'EXEC.u64[laneId] = S0.u16 >= S1.u16', + VOP3Op.V_CMPX_F_I32_E64: "EXEC.u64[laneId] = 1'0U", + VOP3Op.V_CMPX_LT_I32_E64: 'EXEC.u64[laneId] = S0.i32 < S1.i32', + VOP3Op.V_CMPX_EQ_I32_E64: 'EXEC.u64[laneId] = S0.i32 == S1.i32', + VOP3Op.V_CMPX_LE_I32_E64: 'EXEC.u64[laneId] = S0.i32 <= S1.i32', + VOP3Op.V_CMPX_GT_I32_E64: 'EXEC.u64[laneId] = S0.i32 > S1.i32', + VOP3Op.V_CMPX_NE_I32_E64: 'EXEC.u64[laneId] = S0.i32 <> S1.i32', + VOP3Op.V_CMPX_GE_I32_E64: 'EXEC.u64[laneId] = S0.i32 >= S1.i32', + VOP3Op.V_CMPX_T_I32_E64: "EXEC.u64[laneId] = 1'1U", + VOP3Op.V_CMPX_F_U32_E64: "EXEC.u64[laneId] = 1'0U", + VOP3Op.V_CMPX_LT_U32_E64: 'EXEC.u64[laneId] = S0.u32 < S1.u32', + VOP3Op.V_CMPX_EQ_U32_E64: 'EXEC.u64[laneId] = S0.u32 == S1.u32', + VOP3Op.V_CMPX_LE_U32_E64: 'EXEC.u64[laneId] = S0.u32 <= S1.u32', + VOP3Op.V_CMPX_GT_U32_E64: 'EXEC.u64[laneId] = S0.u32 > S1.u32', + VOP3Op.V_CMPX_NE_U32_E64: 'EXEC.u64[laneId] = S0.u32 <> S1.u32', + VOP3Op.V_CMPX_GE_U32_E64: 'EXEC.u64[laneId] = S0.u32 >= S1.u32', + VOP3Op.V_CMPX_T_U32_E64: "EXEC.u64[laneId] = 1'1U", + VOP3Op.V_CMPX_F_I64_E64: "EXEC.u64[laneId] = 1'0U", + VOP3Op.V_CMPX_LT_I64_E64: 'EXEC.u64[laneId] = S0.i64 < S1.i64', + VOP3Op.V_CMPX_EQ_I64_E64: 'EXEC.u64[laneId] = S0.i64 == S1.i64', + VOP3Op.V_CMPX_LE_I64_E64: 'EXEC.u64[laneId] = S0.i64 <= S1.i64', + VOP3Op.V_CMPX_GT_I64_E64: 'EXEC.u64[laneId] = S0.i64 > S1.i64', + VOP3Op.V_CMPX_NE_I64_E64: 'EXEC.u64[laneId] = S0.i64 <> S1.i64', + VOP3Op.V_CMPX_GE_I64_E64: 'EXEC.u64[laneId] = S0.i64 >= S1.i64', + VOP3Op.V_CMPX_T_I64_E64: "EXEC.u64[laneId] = 1'1U", + VOP3Op.V_CMPX_F_U64_E64: "EXEC.u64[laneId] = 1'0U", + VOP3Op.V_CMPX_LT_U64_E64: 'EXEC.u64[laneId] = S0.u64 < S1.u64', + VOP3Op.V_CMPX_EQ_U64_E64: 'EXEC.u64[laneId] = S0.u64 == S1.u64', + VOP3Op.V_CMPX_LE_U64_E64: 'EXEC.u64[laneId] = S0.u64 <= S1.u64', + VOP3Op.V_CMPX_GT_U64_E64: 'EXEC.u64[laneId] = S0.u64 > S1.u64', + VOP3Op.V_CMPX_NE_U64_E64: 'EXEC.u64[laneId] = S0.u64 <> S1.u64', + VOP3Op.V_CMPX_GE_U64_E64: 'EXEC.u64[laneId] = S0.u64 >= S1.u64', + VOP3Op.V_CMPX_T_U64_E64: "EXEC.u64[laneId] = 1'1U", + VOP3Op.V_CMPX_CLASS_F16_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOP3Op.V_CMPX_CLASS_F32_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOP3Op.V_CMPX_CLASS_F64_E64: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOP3Op.V_CNDMASK_B32_E64: 'D0.u32 = VCC.u64[laneId] ? S1.u32 : S0.u32', + VOP3Op.V_ADD_F32_E64: 'D0.f32 = S0.f32 + S1.f32', + VOP3Op.V_SUB_F32_E64: 'D0.f32 = S0.f32 - S1.f32', + VOP3Op.V_SUBREV_F32_E64: 'D0.f32 = S1.f32 - S0.f32', + VOP3Op.V_FMAC_DX9_ZERO_F32_E64: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = S2.f32\nelse\nD0.f32 = fma(S0.f32, S1.f32, D0.f32)\nendif", + VOP3Op.V_MUL_DX9_ZERO_F32_E64: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = 0.0F\nelse\nD0.f32 = S0.f32 * S1.f32\nendif", + VOP3Op.V_MUL_F32_E64: 'D0.f32 = S0.f32 * S1.f32', + VOP3Op.V_MUL_I32_I24_E64: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24)", + VOP3Op.V_MUL_HI_I32_I24_E64: "D0.i32 = 32'I((64'I(S0.i24) * 64'I(S1.i24)) >> 32U)", + VOP3Op.V_MUL_U32_U24_E64: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24)", + VOP3Op.V_MUL_HI_U32_U24_E64: "D0.u32 = 32'U((64'U(S0.u24) * 64'U(S1.u24)) >> 32U)", + VOP3Op.V_MIN_F32_E64: "LT_NEG_ZERO = lambda(a, b) (\n((a < b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && sign(a) && !sign(b))));\n// Version of comparison where -0.0 < +0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif LT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nelse\nif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif LT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + VOP3Op.V_MAX_F32_E64: "GT_NEG_ZERO = lambda(a, b) (\n((a > b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && !sign(a) && sign(b))));\n// Version of comparison where +0.0 > -0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif GT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nelse\nif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif GT_NEG_ZERO(S0.f32, S1.f32) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + VOP3Op.V_MIN_I32_E64: 'D0.i32 = S0.i32 < S1.i32 ? S0.i32 : S1.i32', + VOP3Op.V_MAX_I32_E64: 'D0.i32 = S0.i32 >= S1.i32 ? S0.i32 : S1.i32', + VOP3Op.V_MIN_U32_E64: 'D0.u32 = S0.u32 < S1.u32 ? S0.u32 : S1.u32', + VOP3Op.V_MAX_U32_E64: 'D0.u32 = S0.u32 >= S1.u32 ? S0.u32 : S1.u32', + VOP3Op.V_LSHLREV_B32_E64: 'D0.u32 = (S1.u32 << S0[4 : 0].u32)', + VOP3Op.V_LSHRREV_B32_E64: 'D0.u32 = (S1.u32 >> S0[4 : 0].u32)', + VOP3Op.V_ASHRREV_I32_E64: 'D0.i32 = (S1.i32 >> S0[4 : 0].u32)', + VOP3Op.V_AND_B32_E64: 'D0.u32 = (S0.u32 & S1.u32)', + VOP3Op.V_OR_B32_E64: 'D0.u32 = (S0.u32 | S1.u32)', + VOP3Op.V_XOR_B32_E64: 'D0.u32 = (S0.u32 ^ S1.u32)', + VOP3Op.V_XNOR_B32_E64: 'D0.u32 = ~(S0.u32 ^ S1.u32)', + VOP3Op.V_ADD_NC_U32_E64: 'D0.u32 = S0.u32 + S1.u32', + VOP3Op.V_SUB_NC_U32_E64: 'D0.u32 = S0.u32 - S1.u32', + VOP3Op.V_SUBREV_NC_U32_E64: 'D0.u32 = S1.u32 - S0.u32', + VOP3Op.V_FMAC_F32_E64: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + VOP3Op.V_CVT_PK_RTZ_F16_F32_E64: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_TOWARD_ZERO;\ntmp[15 : 0].f16 = f32_to_f16(S0.f32);\ntmp[31 : 16].f16 = f32_to_f16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode;\n// Round-toward-zero regardless of current round mode setting in hardware.', + VOP3Op.V_ADD_F16_E64: 'D0.f16 = S0.f16 + S1.f16', + VOP3Op.V_SUB_F16_E64: 'D0.f16 = S0.f16 - S1.f16', + VOP3Op.V_SUBREV_F16_E64: 'D0.f16 = S1.f16 - S0.f16', + VOP3Op.V_MUL_F16_E64: 'D0.f16 = S0.f16 * S1.f16', + VOP3Op.V_FMAC_F16_E64: 'D0.f16 = fma(S0.f16, S1.f16, D0.f16)', + VOP3Op.V_MAX_F16_E64: "GT_NEG_ZERO = lambda(a, b) (\n((a > b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && !sign(a) && sign(b))));\n// Version of comparison where +0.0 > -0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif GT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nelse\nif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif GT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + VOP3Op.V_MIN_F16_E64: "LT_NEG_ZERO = lambda(a, b) (\n((a < b) || ((64'F(abs(a)) == 0.0) && (64'F(abs(b)) == 0.0) && sign(a) && !sign(b))));\n// Version of comparison where -0.0 < +0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif LT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nelse\nif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif LT_NEG_ZERO(S0.f16, S1.f16) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.", + VOP3Op.V_LDEXP_F16_E64: "D0.f16 = S0.f16 * 16'F(2.0F ** 32'I(S1.i16))", + VOP3Op.V_MOV_B32_E64: 'D0.b32 = S0.b32', + VOP3Op.V_READFIRSTLANE_B32_E64: "declare lane : 32'U;\nif WAVE64 then\n// 64 lanes\nif EXEC == 0x0LL then\nlane = 0U;\n// Force lane 0 if all lanes are disabled\nelse\nlane = 32'U(s_ff1_i32_b64(EXEC));\n// Lowest active lane\nendif\nelse\n// 32 lanes\nif EXEC_LO.i32 == 0 then\nlane = 0U;\n// Force lane 0 if all lanes are disabled\nelse\nlane = 32'U(s_ff1_i32_b32(EXEC_LO));\n// Lowest active lane\nendif\nendif;\nD0.b32 = VGPR[lane][SRC0.u32]", + VOP3Op.V_CVT_I32_F64_E64: 'D0.i32 = f64_to_i32(S0.f64)', + VOP3Op.V_CVT_F64_I32_E64: 'D0.f64 = i32_to_f64(S0.i32)', + VOP3Op.V_CVT_F32_I32_E64: 'D0.f32 = i32_to_f32(S0.i32)', + VOP3Op.V_CVT_F32_U32_E64: 'D0.f32 = u32_to_f32(S0.u32)', + VOP3Op.V_CVT_U32_F32_E64: 'D0.u32 = f32_to_u32(S0.f32)', + VOP3Op.V_CVT_I32_F32_E64: 'D0.i32 = f32_to_i32(S0.f32)', + VOP3Op.V_CVT_F16_F32_E64: 'D0.f16 = f32_to_f16(S0.f32)', + VOP3Op.V_CVT_F32_F16_E64: 'D0.f32 = f16_to_f32(S0.f16)', + VOP3Op.V_CVT_NEAREST_I32_F32_E64: 'D0.i32 = f32_to_i32(floor(S0.f32 + 0.5F))', + VOP3Op.V_CVT_FLOOR_I32_F32_E64: 'D0.i32 = f32_to_i32(floor(S0.f32))', + VOP3Op.V_CVT_OFF_F32_I4_E64: "declare CVT_OFF_TABLE : 32'F[16];\nD0.f32 = CVT_OFF_TABLE[S0.u32[3 : 0]]", + VOP3Op.V_CVT_F32_F64_E64: 'D0.f32 = f64_to_f32(S0.f64)', + VOP3Op.V_CVT_F64_F32_E64: 'D0.f64 = f32_to_f64(S0.f32)', + VOP3Op.V_CVT_F32_UBYTE0_E64: 'D0.f32 = u32_to_f32(S0[7 : 0].u32)', + VOP3Op.V_CVT_F32_UBYTE1_E64: 'D0.f32 = u32_to_f32(S0[15 : 8].u32)', + VOP3Op.V_CVT_F32_UBYTE2_E64: 'D0.f32 = u32_to_f32(S0[23 : 16].u32)', + VOP3Op.V_CVT_F32_UBYTE3_E64: 'D0.f32 = u32_to_f32(S0[31 : 24].u32)', + VOP3Op.V_CVT_U32_F64_E64: 'D0.u32 = f64_to_u32(S0.f64)', + VOP3Op.V_CVT_F64_U32_E64: 'D0.f64 = u32_to_f64(S0.u32)', + VOP3Op.V_TRUNC_F64_E64: 'D0.f64 = trunc(S0.f64)', + VOP3Op.V_CEIL_F64_E64: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 > 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += 1.0\nendif', + VOP3Op.V_RNDNE_F64_E64: 'D0.f64 = floor(S0.f64 + 0.5);\nif (isEven(floor(S0.f64)) && (fract(S0.f64) == 0.5)) then\nD0.f64 -= 1.0\nendif', + VOP3Op.V_FLOOR_F64_E64: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 < 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += -1.0\nendif', + VOP3Op.V_MOV_B16_E64: 'D0.b16 = S0.b16', + VOP3Op.V_FRACT_F32_E64: 'D0.f32 = S0.f32 + -floor(S0.f32)', + VOP3Op.V_TRUNC_F32_E64: 'D0.f32 = trunc(S0.f32)', + VOP3Op.V_CEIL_F32_E64: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 > 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += 1.0F\nendif', + VOP3Op.V_RNDNE_F32_E64: "D0.f32 = floor(S0.f32 + 0.5F);\nif (isEven(64'F(floor(S0.f32))) && (fract(S0.f32) == 0.5F)) then\nD0.f32 -= 1.0F\nendif", + VOP3Op.V_FLOOR_F32_E64: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 < 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += -1.0F\nendif', + VOP3Op.V_EXP_F32_E64: 'D0.f32 = pow(2.0F, S0.f32)', + VOP3Op.V_LOG_F32_E64: 'D0.f32 = log2(S0.f32)', + VOP3Op.V_RCP_F32_E64: 'D0.f32 = 1.0F / S0.f32', + VOP3Op.V_RCP_IFLAG_F32_E64: 'D0.f32 = 1.0F / S0.f32;\n// Can only raise integer DIV_BY_ZERO exception', + VOP3Op.V_RSQ_F32_E64: 'D0.f32 = 1.0F / sqrt(S0.f32)', + VOP3Op.V_RCP_F64_E64: 'D0.f64 = 1.0 / S0.f64', + VOP3Op.V_RSQ_F64_E64: 'D0.f64 = 1.0 / sqrt(S0.f64)', + VOP3Op.V_SQRT_F32_E64: 'D0.f32 = sqrt(S0.f32)', + VOP3Op.V_SQRT_F64_E64: 'D0.f64 = sqrt(S0.f64)', + VOP3Op.V_SIN_F32_E64: "D0.f32 = sin(S0.f32 * 32'F(PI * 2.0))", + VOP3Op.V_COS_F32_E64: "D0.f32 = cos(S0.f32 * 32'F(PI * 2.0))", + VOP3Op.V_NOT_B32_E64: 'D0.u32 = ~S0.u32', + VOP3Op.V_BFREV_B32_E64: 'D0.u32[31 : 0] = S0.u32[0 : 31]', + VOP3Op.V_CLZ_I32_U32_E64: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP3Op.V_CTZ_I32_B32_E64: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP3Op.V_CLS_I32_E64: 'D0.i32 = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.i32[31 - i] != S0.i32[31] then\nD0.i32 = i;\nbreak\nendif\nendfor', + VOP3Op.V_FREXP_EXP_I32_F64_E64: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f64) - 1023 + 1\nendif', + VOP3Op.V_FREXP_MANT_F64_E64: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.f64 = S0.f64\nelse\nD0.f64 = mantissa(S0.f64)\nendif', + VOP3Op.V_FRACT_F64_E64: 'D0.f64 = S0.f64 + -floor(S0.f64)', + VOP3Op.V_FREXP_EXP_I32_F32_E64: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f32) - 127 + 1\nendif", + VOP3Op.V_FREXP_MANT_F32_E64: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.f32 = S0.f32\nelse\nD0.f32 = mantissa(S0.f32)\nendif", + VOP3Op.V_MOVRELD_B32_E64: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nVGPR[laneId][addr].b32 = S0.b32', + VOP3Op.V_MOVRELS_B32_E64: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b32 = VGPR[laneId][addr].b32', + VOP3Op.V_MOVRELSD_B32_E64: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[31 : 0];\naddrd += M0.u32[31 : 0];\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32', + VOP3Op.V_MOVRELSD_2_B32_E64: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[9 : 0].u32;\naddrd += M0.u32[25 : 16].u32;\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32', + VOP3Op.V_CVT_F16_U16_E64: 'D0.f16 = u16_to_f16(S0.u16)', + VOP3Op.V_CVT_F16_I16_E64: 'D0.f16 = i16_to_f16(S0.i16)', + VOP3Op.V_CVT_U16_F16_E64: 'D0.u16 = f16_to_u16(S0.f16)', + VOP3Op.V_CVT_I16_F16_E64: 'D0.i16 = f16_to_i16(S0.f16)', + VOP3Op.V_RCP_F16_E64: "D0.f16 = 16'1.0 / S0.f16", + VOP3Op.V_SQRT_F16_E64: 'D0.f16 = sqrt(S0.f16)', + VOP3Op.V_RSQ_F16_E64: "D0.f16 = 16'1.0 / sqrt(S0.f16)", + VOP3Op.V_LOG_F16_E64: 'D0.f16 = log2(S0.f16)', + VOP3Op.V_EXP_F16_E64: "D0.f16 = pow(16'2.0, S0.f16)", + VOP3Op.V_FREXP_MANT_F16_E64: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.f16 = S0.f16\nelse\nD0.f16 = mantissa(S0.f16)\nendif", + VOP3Op.V_FREXP_EXP_I16_F16_E64: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.i16 = 16'0\nelse\nD0.i16 = 16'I(exponent(S0.f16) - 15 + 1)\nendif", + VOP3Op.V_FLOOR_F16_E64: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 < 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += -16'1.0\nendif", + VOP3Op.V_CEIL_F16_E64: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 > 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += 16'1.0\nendif", + VOP3Op.V_TRUNC_F16_E64: 'D0.f16 = trunc(S0.f16)', + VOP3Op.V_RNDNE_F16_E64: "D0.f16 = floor(S0.f16 + 16'0.5);\nif (isEven(64'F(floor(S0.f16))) && (fract(S0.f16) == 16'0.5)) then\nD0.f16 -= 16'1.0\nendif", + VOP3Op.V_FRACT_F16_E64: 'D0.f16 = S0.f16 + -floor(S0.f16)', + VOP3Op.V_SIN_F16_E64: "D0.f16 = sin(S0.f16 * 16'F(PI * 2.0))", + VOP3Op.V_COS_F16_E64: "D0.f16 = cos(S0.f16 * 16'F(PI * 2.0))", + VOP3Op.V_SAT_PK_U8_I16_E64: "SAT8 = lambda(n) (\nif n.i32 <= 0 then\nreturn 8'0U\nelsif n >= 16'I(0xff) then\nreturn 8'255U\nelse\nreturn n[7 : 0].u8\nendif);\nD0.b16 = { SAT8(S0[31 : 16].i16), SAT8(S0[15 : 0].i16) }", + VOP3Op.V_CVT_NORM_I16_F16_E64: 'D0.i16 = f16_to_snorm(S0.f16)', + VOP3Op.V_CVT_NORM_U16_F16_E64: 'D0.u16 = f16_to_unorm(S0.f16)', + VOP3Op.V_NOT_B16_E64: 'D0.u16 = ~S0.u16', + VOP3Op.V_CVT_I32_I16_E64: "D0.i32 = 32'I(signext(S0.i16))", + VOP3Op.V_CVT_U32_U16_E64: "D0 = { 16'0, S0.u16 }", + VOP3Op.V_FMA_DX9_ZERO_F32: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = S2.f32\nelse\nD0.f32 = fma(S0.f32, S1.f32, S2.f32)\nendif", + VOP3Op.V_MAD_I32_I24: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24) + S2.i32", + VOP3Op.V_MAD_U32_U24: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24) + S2.u32", + VOP3Op.V_CUBEID_F32: '// Set D0.f = cubemap face ID ({0.0, 1.0, ..., 5.0}).\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nif S2.f32 < 0.0F then\nD0.f32 = 5.0F\nelse\nD0.f32 = 4.0F\nendif\nelsif abs(S1.f32) >= abs(S0.f32) then\nif S1.f32 < 0.0F then\nD0.f32 = 3.0F\nelse\nD0.f32 = 2.0F\nendif\nelse\nif S0.f32 < 0.0F then\nD0.f32 = 1.0F\nelse\nD0.f32 = 0.0F\nendif\nendif', + VOP3Op.V_CUBESC_F32: '// D0.f = cubemap S coordinate.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nif S2.f32 < 0.0F then\nD0.f32 = -S0.f32\nelse\nD0.f32 = S0.f32\nendif\nelsif abs(S1.f32) >= abs(S0.f32) then\nD0.f32 = S0.f32\nelse\nif S0.f32 < 0.0F then\nD0.f32 = S2.f32\nelse\nD0.f32 = -S2.f32\nendif\nendif', + VOP3Op.V_CUBETC_F32: '// D0.f = cubemap T coordinate.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nD0.f32 = -S1.f32\nelsif abs(S1.f32) >= abs(S0.f32) then\nif S1.f32 < 0.0F then\nD0.f32 = -S2.f32\nelse\nD0.f32 = S2.f32\nendif\nelse\nD0.f32 = -S1.f32\nendif', + VOP3Op.V_CUBEMA_F32: '// D0.f = 2.0 * cubemap major axis.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nD0.f32 = S2.f32 * 2.0F\nelsif abs(S1.f32) >= abs(S0.f32) then\nD0.f32 = S1.f32 * 2.0F\nelse\nD0.f32 = S0.f32 * 2.0F\nendif', + VOP3Op.V_BFE_U32: 'D0.u32 = ((S0.u32 >> S1[4 : 0].u32) & ((1U << S2[4 : 0].u32) - 1U))', + VOP3Op.V_BFE_I32: 'tmp.i32 = ((S0.i32 >> S1[4 : 0].u32) & ((1 << S2[4 : 0].u32) - 1));\nD0.i32 = signext_from_bit(tmp.i32, S2[4 : 0].u32)', + VOP3Op.V_BFI_B32: 'D0.u32 = ((S0.u32 & S1.u32) | (~S0.u32 & S2.u32))', + VOP3Op.V_FMA_F32: 'D0.f32 = fma(S0.f32, S1.f32, S2.f32)', + VOP3Op.V_FMA_F64: 'D0.f64 = fma(S0.f64, S1.f64, S2.f64)', + VOP3Op.V_LERP_U8: 'tmp = ((S0.u32[31 : 24] + S1.u32[31 : 24] + S2.u32[24].u8) >> 1U << 24U);\ntmp += ((S0.u32[23 : 16] + S1.u32[23 : 16] + S2.u32[16].u8) >> 1U << 16U);\ntmp += ((S0.u32[15 : 8] + S1.u32[15 : 8] + S2.u32[8].u8) >> 1U << 8U);\ntmp += ((S0.u32[7 : 0] + S1.u32[7 : 0] + S2.u32[0].u8) >> 1U);\nD0.u32 = tmp.u32', + VOP3Op.V_ALIGNBIT_B32: "D0.u32 = 32'U(({ S0.u32, S1.u32 } >> S2.u32[4 : 0].u32) & 0xffffffffLL)", + VOP3Op.V_ALIGNBYTE_B32: "D0.u32 = 32'U(({ S0.u32, S1.u32 } >> (S2.u32[1 : 0].u32 * 8U)) & 0xffffffffLL)", + VOP3Op.V_MULLIT_F32: "if ((S1.f32 == -MAX_FLOAT_F32) || (64'F(S1.f32) == -INF) || isNAN(64'F(S1.f32)) || (S2.f32 <= 0.0F) ||\nisNAN(64'F(S2.f32))) then\nD0.f32 = -MAX_FLOAT_F32\nelse\nD0.f32 = S0.f32 * S1.f32\nendif", + VOP3Op.V_MIN3_F32: 'D0.f32 = v_min_f32(v_min_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MIN3_I32: 'D0.i32 = v_min_i32(v_min_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_MIN3_U32: 'D0.u32 = v_min_u32(v_min_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MAX3_F32: 'D0.f32 = v_max_f32(v_max_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MAX3_I32: 'D0.i32 = v_max_i32(v_max_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_MAX3_U32: 'D0.u32 = v_max_u32(v_max_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MED3_F32: "if (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)) || isNAN(64'F(S2.f32))) then\nD0.f32 = v_min3_f32(S0.f32, S1.f32, S2.f32)\nelsif v_max3_f32(S0.f32, S1.f32, S2.f32) == S0.f32 then\nD0.f32 = v_max_f32(S1.f32, S2.f32)\nelsif v_max3_f32(S0.f32, S1.f32, S2.f32) == S1.f32 then\nD0.f32 = v_max_f32(S0.f32, S2.f32)\nelse\nD0.f32 = v_max_f32(S0.f32, S1.f32)\nendif", + VOP3Op.V_MED3_I32: 'if v_max3_i32(S0.i32, S1.i32, S2.i32) == S0.i32 then\nD0.i32 = v_max_i32(S1.i32, S2.i32)\nelsif v_max3_i32(S0.i32, S1.i32, S2.i32) == S1.i32 then\nD0.i32 = v_max_i32(S0.i32, S2.i32)\nelse\nD0.i32 = v_max_i32(S0.i32, S1.i32)\nendif', + VOP3Op.V_MED3_U32: 'if v_max3_u32(S0.u32, S1.u32, S2.u32) == S0.u32 then\nD0.u32 = v_max_u32(S1.u32, S2.u32)\nelsif v_max3_u32(S0.u32, S1.u32, S2.u32) == S1.u32 then\nD0.u32 = v_max_u32(S0.u32, S2.u32)\nelse\nD0.u32 = v_max_u32(S0.u32, S1.u32)\nendif', + VOP3Op.V_SAD_U8: "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += 32'U(ABSDIFF(S0.u32[7 : 0], S1.u32[7 : 0]));\ntmp += 32'U(ABSDIFF(S0.u32[15 : 8], S1.u32[15 : 8]));\ntmp += 32'U(ABSDIFF(S0.u32[23 : 16], S1.u32[23 : 16]));\ntmp += 32'U(ABSDIFF(S0.u32[31 : 24], S1.u32[31 : 24]));\nD0.u32 = tmp", + VOP3Op.V_SAD_HI_U8: "D0.u32 = (32'U(v_sad_u8(S0, S1, 0U)) << 16U) + S2.u32", + VOP3Op.V_SAD_U16: 'ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += ABSDIFF(S0[15 : 0].u16, S1[15 : 0].u16);\ntmp += ABSDIFF(S0[31 : 16].u16, S1[31 : 16].u16);\nD0.u32 = tmp', + VOP3Op.V_SAD_U32: 'ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\nD0.u32 = ABSDIFF(S0.u32, S1.u32) + S2.u32', + VOP3Op.V_CVT_PK_U8_F32: "tmp = (S2.u32 & 32'U(~(0xff << (S1.u32[1 : 0].u32 * 8U))));\ntmp = (tmp | ((32'U(f32_to_u8(S0.f32)) & 255U) << (S1.u32[1 : 0].u32 * 8U)));\nD0.u32 = tmp", + VOP3Op.V_DIV_FIXUP_F32: "sign_out = (sign(S1.f32) ^ sign(S2.f32));\nif isNAN(64'F(S2.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S2.f32)))\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif ((64'F(S1.f32) == 0.0) && (64'F(S2.f32) == 0.0)) then\n// 0/0\nD0.f32 = 32'F(0xffc00000)\nelsif ((64'F(abs(S1.f32)) == +INF) && (64'F(abs(S2.f32)) == +INF)) then\n// inf/inf\nD0.f32 = 32'F(0xffc00000)\nelsif ((64'F(S1.f32) == 0.0) || (64'F(abs(S2.f32)) == +INF)) then\n// x/0, or inf/y\nD0.f32 = sign_out ? -INF.f32 : +INF.f32\nelsif ((64'F(abs(S1.f32)) == +INF) || (64'F(S2.f32) == 0.0)) then\n// x/inf, 0/y\nD0.f32 = sign_out ? -0.0F : 0.0F\nelsif exponent(S2.f32) - exponent(S1.f32) < -150 then\nD0.f32 = sign_out ? -UNDERFLOW_F32 : UNDERFLOW_F32\nelsif exponent(S1.f32) == 255 then\nD0.f32 = sign_out ? -OVERFLOW_F32 : OVERFLOW_F32\nelse\nD0.f32 = sign_out ? -abs(S0.f32) : abs(S0.f32)\nendif", + VOP3Op.V_DIV_FIXUP_F64: "sign_out = (sign(S1.f64) ^ sign(S2.f64));\nif isNAN(S2.f64) then\nD0.f64 = cvtToQuietNAN(S2.f64)\nelsif isNAN(S1.f64) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif ((S1.f64 == 0.0) && (S2.f64 == 0.0)) then\n// 0/0\nD0.f64 = 64'F(0xfff8000000000000LL)\nelsif ((abs(S1.f64) == +INF) && (abs(S2.f64) == +INF)) then\n// inf/inf\nD0.f64 = 64'F(0xfff8000000000000LL)\nelsif ((S1.f64 == 0.0) || (abs(S2.f64) == +INF)) then\n// x/0, or inf/y\nD0.f64 = sign_out ? -INF : +INF\nelsif ((abs(S1.f64) == +INF) || (S2.f64 == 0.0)) then\n// x/inf, 0/y\nD0.f64 = sign_out ? -0.0 : 0.0\nelsif exponent(S2.f64) - exponent(S1.f64) < -1075 then\nD0.f64 = sign_out ? -UNDERFLOW_F64 : UNDERFLOW_F64\nelsif exponent(S1.f64) == 2047 then\nD0.f64 = sign_out ? -OVERFLOW_F64 : OVERFLOW_F64\nelse\nD0.f64 = sign_out ? -abs(S0.f64) : abs(S0.f64)\nendif", + VOP3Op.V_DIV_FMAS_F32: 'if VCC.u64[laneId] then\nD0.f32 = 2.0F ** 32 * fma(S0.f32, S1.f32, S2.f32)\nelse\nD0.f32 = fma(S0.f32, S1.f32, S2.f32)\nendif', + VOP3Op.V_DIV_FMAS_F64: 'if VCC.u64[laneId] then\nD0.f64 = 2.0 ** 64 * fma(S0.f64, S1.f64, S2.f64)\nelse\nD0.f64 = fma(S0.f64, S1.f64, S2.f64)\nendif', + VOP3Op.V_MSAD_U8: "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += S1.u32[7 : 0] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[7 : 0], S1.u32[7 : 0]));\ntmp += S1.u32[15 : 8] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[15 : 8], S1.u32[15 : 8]));\ntmp += S1.u32[23 : 16] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[23 : 16], S1.u32[23 : 16]));\ntmp += S1.u32[31 : 24] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[31 : 24], S1.u32[31 : 24]));\nD0.u32 = tmp", + VOP3Op.V_QSAD_PK_U16_U8: "tmp[63 : 48] = 16'B(v_sad_u8(S0[55 : 24], S1[31 : 0], S2[63 : 48].u32));\ntmp[47 : 32] = 16'B(v_sad_u8(S0[47 : 16], S1[31 : 0], S2[47 : 32].u32));\ntmp[31 : 16] = 16'B(v_sad_u8(S0[39 : 8], S1[31 : 0], S2[31 : 16].u32));\ntmp[15 : 0] = 16'B(v_sad_u8(S0[31 : 0], S1[31 : 0], S2[15 : 0].u32));\nD0.b64 = tmp.b64", + VOP3Op.V_MQSAD_PK_U16_U8: "tmp[63 : 48] = 16'B(v_msad_u8(S0[55 : 24], S1[31 : 0], S2[63 : 48].u32));\ntmp[47 : 32] = 16'B(v_msad_u8(S0[47 : 16], S1[31 : 0], S2[47 : 32].u32));\ntmp[31 : 16] = 16'B(v_msad_u8(S0[39 : 8], S1[31 : 0], S2[31 : 16].u32));\ntmp[15 : 0] = 16'B(v_msad_u8(S0[31 : 0], S1[31 : 0], S2[15 : 0].u32));\nD0.b64 = tmp.b64", + VOP3Op.V_MQSAD_U32_U8: "tmp[127 : 96] = 32'B(v_msad_u8(S0[55 : 24], S1[31 : 0], S2[127 : 96].u32));\ntmp[95 : 64] = 32'B(v_msad_u8(S0[47 : 16], S1[31 : 0], S2[95 : 64].u32));\ntmp[63 : 32] = 32'B(v_msad_u8(S0[39 : 8], S1[31 : 0], S2[63 : 32].u32));\ntmp[31 : 0] = 32'B(v_msad_u8(S0[31 : 0], S1[31 : 0], S2[31 : 0].u32));\nD0.b128 = tmp.b128", + VOP3Op.V_XOR3_B32: 'D0.u32 = (S0.u32 ^ S1.u32 ^ S2.u32)', + VOP3Op.V_MAD_U16: 'D0.u16 = S0.u16 * S1.u16 + S2.u16', + VOP3Op.V_PERM_B32: "BYTE_PERMUTE = lambda(data, sel) (\ndeclare in : 8'B[8];\nfor i in 0 : 7 do\nin[i] = data[i * 8 + 7 : i * 8].b8\nendfor;\nif sel.u32 >= 13U then\nreturn 8'0xff\nelsif sel.u32 == 12U then\nreturn 8'0x0\nelsif sel.u32 == 11U then\nreturn in[7][7].b8 * 8'0xff\nelsif sel.u32 == 10U then\nreturn in[5][7].b8 * 8'0xff\nelsif sel.u32 == 9U then\nreturn in[3][7].b8 * 8'0xff\nelsif sel.u32 == 8U then\nreturn in[1][7].b8 * 8'0xff\nelse\nreturn in[sel]\nendif);\nD0[31 : 24] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[31 : 24]);\nD0[23 : 16] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[23 : 16]);\nD0[15 : 8] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[15 : 8]);\nD0[7 : 0] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[7 : 0])", + VOP3Op.V_XAD_U32: 'D0.u32 = (S0.u32 ^ S1.u32) + S2.u32', + VOP3Op.V_LSHL_ADD_U32: 'D0.u32 = (S0.u32 << S1.u32[4 : 0].u32) + S2.u32', + VOP3Op.V_ADD_LSHL_U32: 'D0.u32 = ((S0.u32 + S1.u32) << S2.u32[4 : 0].u32)', + VOP3Op.V_FMA_F16: 'D0.f16 = fma(S0.f16, S1.f16, S2.f16)', + VOP3Op.V_MIN3_F16: 'D0.f16 = v_min_f16(v_min_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MIN3_I16: 'D0.i16 = v_min_i16(v_min_i16(S0.i16, S1.i16), S2.i16)', + VOP3Op.V_MIN3_U16: 'D0.u16 = v_min_u16(v_min_u16(S0.u16, S1.u16), S2.u16)', + VOP3Op.V_MAX3_F16: 'D0.f16 = v_max_f16(v_max_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MAX3_I16: 'D0.i16 = v_max_i16(v_max_i16(S0.i16, S1.i16), S2.i16)', + VOP3Op.V_MAX3_U16: 'D0.u16 = v_max_u16(v_max_u16(S0.u16, S1.u16), S2.u16)', + VOP3Op.V_MED3_F16: "if (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)) || isNAN(64'F(S2.f16))) then\nD0.f16 = v_min3_f16(S0.f16, S1.f16, S2.f16)\nelsif v_max3_f16(S0.f16, S1.f16, S2.f16) == S0.f16 then\nD0.f16 = v_max_f16(S1.f16, S2.f16)\nelsif v_max3_f16(S0.f16, S1.f16, S2.f16) == S1.f16 then\nD0.f16 = v_max_f16(S0.f16, S2.f16)\nelse\nD0.f16 = v_max_f16(S0.f16, S1.f16)\nendif", + VOP3Op.V_MED3_I16: 'if v_max3_i16(S0.i16, S1.i16, S2.i16) == S0.i16 then\nD0.i16 = v_max_i16(S1.i16, S2.i16)\nelsif v_max3_i16(S0.i16, S1.i16, S2.i16) == S1.i16 then\nD0.i16 = v_max_i16(S0.i16, S2.i16)\nelse\nD0.i16 = v_max_i16(S0.i16, S1.i16)\nendif', + VOP3Op.V_MED3_U16: 'if v_max3_u16(S0.u16, S1.u16, S2.u16) == S0.u16 then\nD0.u16 = v_max_u16(S1.u16, S2.u16)\nelsif v_max3_u16(S0.u16, S1.u16, S2.u16) == S1.u16 then\nD0.u16 = v_max_u16(S0.u16, S2.u16)\nelse\nD0.u16 = v_max_u16(S0.u16, S1.u16)\nendif', + VOP3Op.V_MAD_I16: 'D0.i16 = S0.i16 * S1.i16 + S2.i16', + VOP3Op.V_DIV_FIXUP_F16: "sign_out = (sign(S1.f16) ^ sign(S2.f16));\nif isNAN(64'F(S2.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S2.f16)))\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif ((64'F(S1.f16) == 0.0) && (64'F(S2.f16) == 0.0)) then\n// 0/0\nD0.f16 = 16'F(0xfe00)\nelsif ((64'F(abs(S1.f16)) == +INF) && (64'F(abs(S2.f16)) == +INF)) then\n// inf/inf\nD0.f16 = 16'F(0xfe00)\nelsif ((64'F(S1.f16) == 0.0) || (64'F(abs(S2.f16)) == +INF)) then\n// x/0, or inf/y\nD0.f16 = sign_out ? -INF.f16 : +INF.f16\nelsif ((64'F(abs(S1.f16)) == +INF) || (64'F(S2.f16) == 0.0)) then\n// x/inf, 0/y\nD0.f16 = sign_out ? -16'0.0 : 16'0.0\nelse\nD0.f16 = sign_out ? -abs(S0.f16) : abs(S0.f16)\nendif", + VOP3Op.V_ADD3_U32: 'D0.u32 = S0.u32 + S1.u32 + S2.u32', + VOP3Op.V_LSHL_OR_B32: 'D0.u32 = ((S0.u32 << S1.u32[4 : 0].u32) | S2.u32)', + VOP3Op.V_AND_OR_B32: 'D0.u32 = ((S0.u32 & S1.u32) | S2.u32)', + VOP3Op.V_OR3_B32: 'D0.u32 = (S0.u32 | S1.u32 | S2.u32)', + VOP3Op.V_MAD_U32_U16: "D0.u32 = 32'U(S0.u16) * 32'U(S1.u16) + S2.u32", + VOP3Op.V_MAD_I32_I16: "D0.i32 = 32'I(S0.i16) * 32'I(S1.i16) + S2.i32", + VOP3Op.V_PERMLANE16_B32: "declare tmp : 32'B[64];\nlanesel = { S2.u32, S1.u32 };\n// Concatenate lane select bits\nfor i in 0 : WAVE32 ? 31 : 63 do\n// Copy original S0 in case D==S0\ntmp[i] = VGPR[i][SRC0.u32]\nendfor;\nfor row in 0 : WAVE32 ? 1 : 3 do\n// Implement arbitrary swizzle within each row\nfor i in 0 : 15 do\nif EXEC[row * 16 + i].u1 then\nVGPR[row * 16 + i][VDST.u32] = tmp[64'B(row * 16) + lanesel[i * 4 + 3 : i * 4]]\nendif\nendfor\nendfor", + VOP3Op.V_PERMLANEX16_B32: "declare tmp : 32'B[64];\nlanesel = { S2.u32, S1.u32 };\n// Concatenate lane select bits\nfor i in 0 : WAVE32 ? 31 : 63 do\n// Copy original S0 in case D==S0\ntmp[i] = VGPR[i][SRC0.u32]\nendfor;\nfor row in 0 : WAVE32 ? 1 : 3 do\n// Implement arbitrary swizzle across two rows\naltrow = { row[1], ~row[0] };\n// 1<->0, 3<->2\nfor i in 0 : 15 do\nif EXEC[row * 16 + i].u1 then\nVGPR[row * 16 + i][VDST.u32] = tmp[64'B(altrow.i32 * 16) + lanesel[i * 4 + 3 : i * 4]]\nendif\nendfor\nendfor", + VOP3Op.V_CNDMASK_B16: 'D0.u16 = VCC.u64[laneId] ? S1.u16 : S0.u16', + VOP3Op.V_MAXMIN_F32: 'D0.f32 = v_min_f32(v_max_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MINMAX_F32: 'D0.f32 = v_max_f32(v_min_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MAXMIN_F16: 'D0.f16 = v_min_f16(v_max_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MINMAX_F16: 'D0.f16 = v_max_f16(v_min_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MAXMIN_U32: 'D0.u32 = v_min_u32(v_max_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MINMAX_U32: 'D0.u32 = v_max_u32(v_min_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MAXMIN_I32: 'D0.i32 = v_min_i32(v_max_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_MINMAX_I32: 'D0.i32 = v_max_i32(v_min_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_DOT2_F16_F16: 'tmp = S2.f16;\ntmp += S0[15 : 0].f16 * S1[15 : 0].f16;\ntmp += S0[31 : 16].f16 * S1[31 : 16].f16;\nD0.f16 = tmp', + VOP3Op.V_DOT2_BF16_BF16: 'tmp = S2.bf16;\ntmp += S0[15 : 0].bf16 * S1[15 : 0].bf16;\ntmp += S0[31 : 16].bf16 * S1[31 : 16].bf16;\nD0.bf16 = tmp', + VOP3Op.V_ADD_NC_U16: 'D0.u16 = S0.u16 + S1.u16', + VOP3Op.V_SUB_NC_U16: 'D0.u16 = S0.u16 - S1.u16', + VOP3Op.V_MUL_LO_U16: 'D0.u16 = S0.u16 * S1.u16', + VOP3Op.V_CVT_PK_I16_F32: "declare tmp : 32'B;\ntmp[31 : 16] = 16'B(v_cvt_i16_f32(S1.f32));\ntmp[15 : 0] = 16'B(v_cvt_i16_f32(S0.f32));\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_U16_F32: "declare tmp : 32'B;\ntmp[31 : 16] = 16'B(v_cvt_u16_f32(S1.f32));\ntmp[15 : 0] = 16'B(v_cvt_u16_f32(S0.f32));\nD0 = tmp.b32", + VOP3Op.V_MAX_U16: 'D0.u16 = S0.u16 >= S1.u16 ? S0.u16 : S1.u16', + VOP3Op.V_MAX_I16: 'D0.i16 = S0.i16 >= S1.i16 ? S0.i16 : S1.i16', + VOP3Op.V_MIN_U16: 'D0.u16 = S0.u16 < S1.u16 ? S0.u16 : S1.u16', + VOP3Op.V_MIN_I16: 'D0.i16 = S0.i16 < S1.i16 ? S0.i16 : S1.i16', + VOP3Op.V_ADD_NC_I16: 'D0.i16 = S0.i16 + S1.i16', + VOP3Op.V_SUB_NC_I16: 'D0.i16 = S0.i16 - S1.i16', + VOP3Op.V_PACK_B32_F16: 'D0[31 : 16].f16 = S1.f16;\nD0[15 : 0].f16 = S0.f16', + VOP3Op.V_CVT_PK_NORM_I16_F16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = f16_to_snorm(S0.f16);\ntmp[31 : 16].i16 = f16_to_snorm(S1.f16);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_NORM_U16_F16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = f16_to_unorm(S0.f16);\ntmp[31 : 16].u16 = f16_to_unorm(S1.f16);\nD0 = tmp.b32", + VOP3Op.V_LDEXP_F32: 'D0.f32 = S0.f32 * 2.0F ** S1.i32', + VOP3Op.V_BFM_B32: 'D0.u32 = (((1U << S0[4 : 0].u32) - 1U) << S1[4 : 0].u32)', + VOP3Op.V_BCNT_U32_B32: "tmp = S1.u32;\nfor i in 0 : 31 do\ntmp += S0[i].u32;\n// count i'th bit\nendfor;\nD0.u32 = tmp", + VOP3Op.V_MBCNT_LO_U32_B32: "ThreadMask = (1LL << laneId.u32) - 1LL;\nMaskedValue = (S0.u32 & ThreadMask[31 : 0].u32);\ntmp = S1.u32;\nfor i in 0 : 31 do\ntmp += MaskedValue[i] == 1'1U ? 1U : 0U\nendfor;\nD0.u32 = tmp", + VOP3Op.V_MBCNT_HI_U32_B32: "ThreadMask = (1LL << laneId.u32) - 1LL;\nMaskedValue = (S0.u32 & ThreadMask[63 : 32].u32);\ntmp = S1.u32;\nfor i in 0 : 31 do\ntmp += MaskedValue[i] == 1'1U ? 1U : 0U\nendfor;\nD0.u32 = tmp", + VOP3Op.V_CVT_PK_NORM_I16_F32: "declare tmp : 32'B;\ntmp[15 : 0].i16 = f32_to_snorm(S0.f32);\ntmp[31 : 16].i16 = f32_to_snorm(S1.f32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_NORM_U16_F32: "declare tmp : 32'B;\ntmp[15 : 0].u16 = f32_to_unorm(S0.f32);\ntmp[31 : 16].u16 = f32_to_unorm(S1.f32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_U16_U32: "declare tmp : 32'B;\ntmp[15 : 0].u16 = u32_to_u16(S0.u32);\ntmp[31 : 16].u16 = u32_to_u16(S1.u32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_I16_I32: "declare tmp : 32'B;\ntmp[15 : 0].i16 = i32_to_i16(S0.i32);\ntmp[31 : 16].i16 = i32_to_i16(S1.i32);\nD0 = tmp.b32", + VOP3Op.V_SUB_NC_I32: 'D0.i32 = S0.i32 - S1.i32', + VOP3Op.V_ADD_NC_I32: 'D0.i32 = S0.i32 + S1.i32', + VOP3Op.V_ADD_F64: 'D0.f64 = S0.f64 + S1.f64', + VOP3Op.V_MUL_F64: 'D0.f64 = S0.f64 * S1.f64', + VOP3Op.V_MIN_F64: 'LT_NEG_ZERO = lambda(a, b) (\n((a < b) || ((abs(a) == 0.0) && (abs(b) == 0.0) && sign(a) && !sign(b))));\n// Version of comparison where -0.0 < +0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(S0.f64) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif isSignalNAN(S1.f64) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif isQuietNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif isQuietNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif LT_NEG_ZERO(S0.f64, S1.f64) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif\nelse\nif isNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif isNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif LT_NEG_ZERO(S0.f64, S1.f64) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.', + VOP3Op.V_MAX_F64: 'GT_NEG_ZERO = lambda(a, b) (\n((a > b) || ((abs(a) == 0.0) && (abs(b) == 0.0) && !sign(a) && sign(b))));\n// Version of comparison where +0.0 > -0.0, differs from IEEE\nif WAVE_MODE.IEEE then\nif isSignalNAN(S0.f64) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif isSignalNAN(S1.f64) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif isQuietNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif isQuietNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif GT_NEG_ZERO(S0.f64, S1.f64) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif\nelse\nif isNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif isNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif GT_NEG_ZERO(S0.f64, S1.f64) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif\nendif;\n// Inequalities in the above pseudocode behave differently from IEEE\n// when both inputs are +-0.', + VOP3Op.V_LDEXP_F64: 'D0.f64 = S0.f64 * 2.0 ** S1.i32', + VOP3Op.V_MUL_LO_U32: 'D0.u32 = S0.u32 * S1.u32', + VOP3Op.V_MUL_HI_U32: "D0.u32 = 32'U((64'U(S0.u32) * 64'U(S1.u32)) >> 32U)", + VOP3Op.V_MUL_HI_I32: "D0.i32 = 32'I((64'I(S0.i32) * 64'I(S1.i32)) >> 32U)", + VOP3Op.V_TRIG_PREOP_F64: "shift = 32'I(S1[4 : 0].u32) * 53;\nif exponent(S0.f64) > 1077 then\nshift += exponent(S0.f64) - 1077\nendif;\n// (2.0/PI) == 0.{b_1200, b_1199, b_1198, ..., b_1, b_0}\n// b_1200 is the MSB of the fractional part of 2.0/PI\n// Left shift operation indicates which bits are brought\n// into the whole part of the number.\n// Only whole part of result is kept.\nresult = 64'F((1201'B(2.0 / PI)[1200 : 0] << shift.u32) & 1201'0x1fffffffffffff);\nscale = -53 - shift;\nif exponent(S0.f64) >= 1968 then\nscale += 128\nendif;\nD0.f64 = ldexp(result, scale)", + VOP3Op.V_LSHLREV_B16: 'D0.u16 = (S1.u16 << S0[3 : 0].u32)', + VOP3Op.V_LSHRREV_B16: 'D0.u16 = (S1.u16 >> S0[3 : 0].u32)', + VOP3Op.V_ASHRREV_I16: 'D0.i16 = (S1.i16 >> S0[3 : 0].u32)', + VOP3Op.V_LSHLREV_B64: 'D0.u64 = (S1.u64 << S0[5 : 0].u32)', + VOP3Op.V_LSHRREV_B64: 'D0.u64 = (S1.u64 >> S0[5 : 0].u32)', + VOP3Op.V_ASHRREV_I64: 'D0.i64 = (S1.i64 >> S0[5 : 0].u32)', + VOP3Op.V_READLANE_B32: "declare lane : 32'U;\nif WAVE32 then\nlane = S1.u32[4 : 0].u32;\n// Lane select for wave32\nelse\nlane = S1.u32[5 : 0].u32;\n// Lane select for wave64\nendif;\nD0.b32 = VGPR[lane][SRC0.u32]", + VOP3Op.V_WRITELANE_B32: "declare lane : 32'U;\nif WAVE32 then\nlane = S1.u32[4 : 0].u32;\n// Lane select for wave32\nelse\nlane = S1.u32[5 : 0].u32;\n// Lane select for wave64\nendif;\nVGPR[lane][VDST.u32] = S0.b32", + VOP3Op.V_AND_B16: 'D0.u16 = (S0.u16 & S1.u16)', + VOP3Op.V_OR_B16: 'D0.u16 = (S0.u16 | S1.u16)', + VOP3Op.V_XOR_B16: 'D0.u16 = (S0.u16 ^ S1.u16)', + VOP3POp.V_PK_MAD_I16: 'tmp[31 : 16].i16 = S0[31 : 16].i16 * S1[31 : 16].i16 + S2[31 : 16].i16;\ntmp[15 : 0].i16 = S0[15 : 0].i16 * S1[15 : 0].i16 + S2[15 : 0].i16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MUL_LO_U16: 'tmp[31 : 16].u16 = S0[31 : 16].u16 * S1[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 * S1[15 : 0].u16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_ADD_I16: 'tmp[31 : 16].i16 = S0[31 : 16].i16 + S1[31 : 16].i16;\ntmp[15 : 0].i16 = S0[15 : 0].i16 + S1[15 : 0].i16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_SUB_I16: 'tmp[31 : 16].i16 = S0[31 : 16].i16 - S1[31 : 16].i16;\ntmp[15 : 0].i16 = S0[15 : 0].i16 - S1[15 : 0].i16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_LSHLREV_B16: 'tmp[31 : 16].u16 = (S1[31 : 16].u16 << S0.u32[19 : 16].u32);\ntmp[15 : 0].u16 = (S1[15 : 0].u16 << S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_LSHRREV_B16: 'tmp[31 : 16].u16 = (S1[31 : 16].u16 >> S0.u32[19 : 16].u32);\ntmp[15 : 0].u16 = (S1[15 : 0].u16 >> S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_ASHRREV_I16: 'tmp[31 : 16].i16 = (S1[31 : 16].i16 >> S0.u32[19 : 16].u32);\ntmp[15 : 0].i16 = (S1[15 : 0].i16 >> S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MAX_I16: 'tmp[31 : 16].i16 = S0[31 : 16].i16 >= S1[31 : 16].i16 ? S0[31 : 16].i16 : S1[31 : 16].i16;\ntmp[15 : 0].i16 = S0[15 : 0].i16 >= S1[15 : 0].i16 ? S0[15 : 0].i16 : S1[15 : 0].i16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MIN_I16: 'tmp[31 : 16].i16 = S0[31 : 16].i16 < S1[31 : 16].i16 ? S0[31 : 16].i16 : S1[31 : 16].i16;\ntmp[15 : 0].i16 = S0[15 : 0].i16 < S1[15 : 0].i16 ? S0[15 : 0].i16 : S1[15 : 0].i16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MAD_U16: 'tmp[31 : 16].u16 = S0[31 : 16].u16 * S1[31 : 16].u16 + S2[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 * S1[15 : 0].u16 + S2[15 : 0].u16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_ADD_U16: 'tmp[31 : 16].u16 = S0[31 : 16].u16 + S1[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 + S1[15 : 0].u16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_SUB_U16: 'tmp[31 : 16].u16 = S0[31 : 16].u16 - S1[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 - S1[15 : 0].u16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MAX_U16: 'tmp[31 : 16].u16 = S0[31 : 16].u16 >= S1[31 : 16].u16 ? S0[31 : 16].u16 : S1[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 >= S1[15 : 0].u16 ? S0[15 : 0].u16 : S1[15 : 0].u16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MIN_U16: 'tmp[31 : 16].u16 = S0[31 : 16].u16 < S1[31 : 16].u16 ? S0[31 : 16].u16 : S1[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 < S1[15 : 0].u16 ? S0[15 : 0].u16 : S1[15 : 0].u16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_FMA_F16: "declare tmp : 32'B;\ntmp[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, S2[31 : 16].f16);\ntmp[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, S2[15 : 0].f16);\nD0.b32 = tmp", + VOP3POp.V_PK_ADD_F16: 'tmp[31 : 16].f16 = S0[31 : 16].f16 + S1[31 : 16].f16;\ntmp[15 : 0].f16 = S0[15 : 0].f16 + S1[15 : 0].f16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MUL_F16: 'tmp[31 : 16].f16 = S0[31 : 16].f16 * S1[31 : 16].f16;\ntmp[15 : 0].f16 = S0[15 : 0].f16 * S1[15 : 0].f16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MIN_F16: 'tmp[31 : 16].f16 = v_min_f16(S0[31 : 16].f16, S1[31 : 16].f16);\ntmp[15 : 0].f16 = v_min_f16(S0[15 : 0].f16, S1[15 : 0].f16);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MAX_F16: 'tmp[31 : 16].f16 = v_max_f16(S0[31 : 16].f16, S1[31 : 16].f16);\ntmp[15 : 0].f16 = v_max_f16(S0[15 : 0].f16, S1[15 : 0].f16);\nD0.b32 = tmp.b32', + VOP3POp.V_DOT2_F32_F16: 'tmp = S2.f32;\ntmp += f16_to_f32(S0[15 : 0].f16) * f16_to_f32(S1[15 : 0].f16);\ntmp += f16_to_f32(S0[31 : 16].f16) * f16_to_f32(S1[31 : 16].f16);\nD0.f32 = tmp', + VOP3POp.V_DOT4_I32_IU8: "declare A : 32'I[4];\ndeclare B : 32'I[4];\n// Figure out whether inputs are signed/unsigned.\nfor i in 0 : 3 do\nA8 = S0[i * 8 + 7 : i * 8];\nB8 = S1[i * 8 + 7 : i * 8];\nA[i] = NEG[0].u1 ? 32'I(signext(A8.i8)) : 32'I(32'U(A8.u8));\nB[i] = NEG[1].u1 ? 32'I(signext(B8.i8)) : 32'I(32'U(B8.u8))\nendfor;\nC = S2.i32;\n// Signed multiplier/adder. Extend unsigned inputs with leading 0.\ntmp = C.i32;\ntmp += A[0] * B[0];\ntmp += A[1] * B[1];\ntmp += A[2] * B[2];\ntmp += A[3] * B[3];\nD0.i32 = tmp", + VOP3POp.V_DOT4_U32_U8: 'tmp = S2.u32;\ntmp += u8_to_u32(S0[7 : 0].u8) * u8_to_u32(S1[7 : 0].u8);\ntmp += u8_to_u32(S0[15 : 8].u8) * u8_to_u32(S1[15 : 8].u8);\ntmp += u8_to_u32(S0[23 : 16].u8) * u8_to_u32(S1[23 : 16].u8);\ntmp += u8_to_u32(S0[31 : 24].u8) * u8_to_u32(S1[31 : 24].u8);\nD0.u32 = tmp', + VOP3POp.V_DOT8_I32_IU4: "declare A : 32'I[8];\ndeclare B : 32'I[8];\n// Figure out whether inputs are signed/unsigned.\nfor i in 0 : 7 do\nA4 = S0[i * 4 + 3 : i * 4];\nB4 = S1[i * 4 + 3 : i * 4];\nA[i] = NEG[0].u1 ? 32'I(signext(A4.i4)) : 32'I(32'U(A4.u4));\nB[i] = NEG[1].u1 ? 32'I(signext(B4.i4)) : 32'I(32'U(B4.u4))\nendfor;\nC = S2.i32;\n// Signed multiplier/adder. Extend unsigned inputs with leading 0.\ntmp = C.i32;\ntmp += A[0] * B[0];\ntmp += A[1] * B[1];\ntmp += A[2] * B[2];\ntmp += A[3] * B[3];\ntmp += A[4] * B[4];\ntmp += A[5] * B[5];\ntmp += A[6] * B[6];\ntmp += A[7] * B[7];\nD0.i32 = tmp", + VOP3POp.V_DOT8_U32_U4: 'tmp = S2.u32;\ntmp += u4_to_u32(S0[3 : 0].u4) * u4_to_u32(S1[3 : 0].u4);\ntmp += u4_to_u32(S0[7 : 4].u4) * u4_to_u32(S1[7 : 4].u4);\ntmp += u4_to_u32(S0[11 : 8].u4) * u4_to_u32(S1[11 : 8].u4);\ntmp += u4_to_u32(S0[15 : 12].u4) * u4_to_u32(S1[15 : 12].u4);\ntmp += u4_to_u32(S0[19 : 16].u4) * u4_to_u32(S1[19 : 16].u4);\ntmp += u4_to_u32(S0[23 : 20].u4) * u4_to_u32(S1[23 : 20].u4);\ntmp += u4_to_u32(S0[27 : 24].u4) * u4_to_u32(S1[27 : 24].u4);\ntmp += u4_to_u32(S0[31 : 28].u4) * u4_to_u32(S1[31 : 28].u4);\nD0.u32 = tmp', + VOP3POp.V_DOT2_F32_BF16: 'tmp = S2.f32;\ntmp += bf16_to_f32(S0[15 : 0].bf16) * bf16_to_f32(S1[15 : 0].bf16);\ntmp += bf16_to_f32(S0[31 : 16].bf16) * bf16_to_f32(S1[31 : 16].bf16);\nD0.f32 = tmp', + VOP3POp.V_FMA_MIX_F32: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[31 : 0].f32 = fma(in[0], in[1], in[2])", + VOP3POp.V_FMA_MIXLO_F16: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[15 : 0].f16 = f32_to_f16(fma(in[0], in[1], in[2]))", + VOP3POp.V_FMA_MIXHI_F16: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[31 : 16].f16 = f32_to_f16(fma(in[0], in[1], in[2]))", + VOP3POp.V_WMMA_F32_16X16X16_F16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_F32_16X16X16_BF16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_F16_16X16X16_F16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_BF16_16X16X16_BF16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_I32_16X16X16_IU8: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_I32_16X16X16_IU4: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3SDOp.V_ADD_CO_CI_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + VCC.u64[laneId].u64;\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADD_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUB_CO_CI_U32: "tmp = S0.u32 - S1.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S1.u32) + VCC.u64[laneId].u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUBREV_CO_CI_U32: "tmp = S1.u32 - S0.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S0.u32) + VCC.u64[laneId].u64 > 64'U(S1.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_DIV_SCALE_F32: "VCC = 0x0LL;\nif ((64'F(S2.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\nD0.f32 = NAN.f32\nelsif exponent(S2.f32) - exponent(S1.f32) >= 96 then\n// N/D near MAX_FLOAT_F32\nVCC = 0x1LL;\nif S0.f32 == S1.f32 then\n// Only scale the denominator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif S1.f32 == DENORM.f32 then\nD0.f32 = ldexp(S0.f32, 64)\nelsif ((1.0 / 64'F(S1.f32) == DENORM.f64) && (S2.f32 / S1.f32 == DENORM.f32)) then\nVCC = 0x1LL;\nif S0.f32 == S1.f32 then\n// Only scale the denominator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif 1.0 / 64'F(S1.f32) == DENORM.f64 then\nD0.f32 = ldexp(S0.f32, -64)\nelsif S2.f32 / S1.f32 == DENORM.f32 then\nVCC = 0x1LL;\nif S0.f32 == S2.f32 then\n// Only scale the numerator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif exponent(S2.f32) <= 23 then\n// Numerator is tiny\nD0.f32 = ldexp(S0.f32, 64)\nendif", + VOP3SDOp.V_DIV_SCALE_F64: 'VCC = 0x0LL;\nif ((S2.f64 == 0.0) || (S1.f64 == 0.0)) then\nD0.f64 = NAN.f64\nelsif exponent(S2.f64) - exponent(S1.f64) >= 768 then\n// N/D near MAX_FLOAT_F64\nVCC = 0x1LL;\nif S0.f64 == S1.f64 then\n// Only scale the denominator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif S1.f64 == DENORM.f64 then\nD0.f64 = ldexp(S0.f64, 128)\nelsif ((1.0 / S1.f64 == DENORM.f64) && (S2.f64 / S1.f64 == DENORM.f64)) then\nVCC = 0x1LL;\nif S0.f64 == S1.f64 then\n// Only scale the denominator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif 1.0 / S1.f64 == DENORM.f64 then\nD0.f64 = ldexp(S0.f64, -128)\nelsif S2.f64 / S1.f64 == DENORM.f64 then\nVCC = 0x1LL;\nif S0.f64 == S2.f64 then\n// Only scale the numerator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif exponent(S2.f64) <= 53 then\n// Numerator is tiny\nD0.f64 = ldexp(S0.f64, 128)\nendif', + VOP3SDOp.V_MAD_U64_U32: "{ D1.u1, D0.u64 } = 65'B(65'U(S0.u32) * 65'U(S1.u32) + 65'U(S2.u64))", + VOP3SDOp.V_MAD_I64_I32: "{ D1.i1, D0.i64 } = 65'B(65'I(S0.i32) * 65'I(S1.i32) + 65'I(S2.i64))", + VOP3SDOp.V_ADD_CO_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32);\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADD_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUB_CO_U32: "tmp = S0.u32 - S1.u32;\nVCC.u64[laneId] = S1.u32 > S0.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUBREV_CO_U32: "tmp = S1.u32 - S0.u32;\nVCC.u64[laneId] = S0.u32 > S1.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOPCOp.V_CMP_F_F16_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_F16_E32: 'D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F16_E32: 'D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F16_E32: 'D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F16_E32: 'D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F16_E32: 'D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F16_E32: 'D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F16_E32: "D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_U_F16_E32: "D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_NGE_F16_E32: 'D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F16_E32: 'D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F16_E32: 'D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F16_E32: 'D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F16_E32: 'D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F16_E32: 'D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_F16_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_F32_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_F32_E32: 'D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F32_E32: 'D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F32_E32: 'D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F32_E32: 'D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F32_E32: 'D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F32_E32: 'D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F32_E32: "D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_U_F32_E32: "D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_NGE_F32_E32: 'D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F32_E32: 'D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F32_E32: 'D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F32_E32: 'D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F32_E32: 'D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F32_E32: 'D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_F32_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_F64_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_F64_E32: 'D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F64_E32: 'D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F64_E32: 'D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F64_E32: 'D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F64_E32: 'D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F64_E32: 'D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F64_E32: 'D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_U_F64_E32: 'D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGE_F64_E32: 'D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F64_E32: 'D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F64_E32: 'D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F64_E32: 'D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F64_E32: 'D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F64_E32: 'D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_F64_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_I16_E32: 'D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I16_E32: 'D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I16_E32: 'D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I16_E32: 'D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I16_E32: 'D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I16_E32: 'D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_U16_E32: 'D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U16_E32: 'D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U16_E32: 'D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U16_E32: 'D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U16_E32: 'D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U16_E32: 'D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_F_I32_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_I32_E32: 'D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I32_E32: 'D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I32_E32: 'D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I32_E32: 'D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I32_E32: 'D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I32_E32: 'D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_I32_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_U32_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_U32_E32: 'D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U32_E32: 'D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U32_E32: 'D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U32_E32: 'D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U32_E32: 'D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U32_E32: 'D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_U32_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_I64_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_I64_E32: 'D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I64_E32: 'D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I64_E32: 'D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I64_E32: 'D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I64_E32: 'D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I64_E32: 'D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_I64_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_F_U64_E32: "D0.u64[laneId] = 1'0U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_LT_U64_E32: 'D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U64_E32: 'D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U64_E32: 'D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U64_E32: 'D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U64_E32: 'D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U64_E32: 'D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_T_U64_E32: "D0.u64[laneId] = 1'1U;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_CLASS_F16_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_CLASS_F32_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_CLASS_F64_E32: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_F_F16_E32: "EXEC.u64[laneId] = 1'0U", + VOPCOp.V_CMPX_LT_F16_E32: 'EXEC.u64[laneId] = S0.f16 < S1.f16', + VOPCOp.V_CMPX_EQ_F16_E32: 'EXEC.u64[laneId] = S0.f16 == S1.f16', + VOPCOp.V_CMPX_LE_F16_E32: 'EXEC.u64[laneId] = S0.f16 <= S1.f16', + VOPCOp.V_CMPX_GT_F16_E32: 'EXEC.u64[laneId] = S0.f16 > S1.f16', + VOPCOp.V_CMPX_LG_F16_E32: 'EXEC.u64[laneId] = S0.f16 <> S1.f16', + VOPCOp.V_CMPX_GE_F16_E32: 'EXEC.u64[laneId] = S0.f16 >= S1.f16', + VOPCOp.V_CMPX_O_F16_E32: "EXEC.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)))", + VOPCOp.V_CMPX_U_F16_E32: "EXEC.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)))", + VOPCOp.V_CMPX_NGE_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <', + VOPCOp.V_CMPX_NLG_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==', + VOPCOp.V_CMPX_NGT_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=', + VOPCOp.V_CMPX_NLE_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >', + VOPCOp.V_CMPX_NEQ_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=', + VOPCOp.V_CMPX_NLT_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=', + VOPCOp.V_CMPX_T_F16_E32: "EXEC.u64[laneId] = 1'1U", + VOPCOp.V_CMPX_F_F32_E32: "EXEC.u64[laneId] = 1'0U", + VOPCOp.V_CMPX_LT_F32_E32: 'EXEC.u64[laneId] = S0.f32 < S1.f32', + VOPCOp.V_CMPX_EQ_F32_E32: 'EXEC.u64[laneId] = S0.f32 == S1.f32', + VOPCOp.V_CMPX_LE_F32_E32: 'EXEC.u64[laneId] = S0.f32 <= S1.f32', + VOPCOp.V_CMPX_GT_F32_E32: 'EXEC.u64[laneId] = S0.f32 > S1.f32', + VOPCOp.V_CMPX_LG_F32_E32: 'EXEC.u64[laneId] = S0.f32 <> S1.f32', + VOPCOp.V_CMPX_GE_F32_E32: 'EXEC.u64[laneId] = S0.f32 >= S1.f32', + VOPCOp.V_CMPX_O_F32_E32: "EXEC.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)))", + VOPCOp.V_CMPX_U_F32_E32: "EXEC.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)))", + VOPCOp.V_CMPX_NGE_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <', + VOPCOp.V_CMPX_NLG_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==', + VOPCOp.V_CMPX_NGT_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=', + VOPCOp.V_CMPX_NLE_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >', + VOPCOp.V_CMPX_NEQ_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=', + VOPCOp.V_CMPX_NLT_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=', + VOPCOp.V_CMPX_T_F32_E32: "EXEC.u64[laneId] = 1'1U", + VOPCOp.V_CMPX_F_F64_E32: "EXEC.u64[laneId] = 1'0U", + VOPCOp.V_CMPX_LT_F64_E32: 'EXEC.u64[laneId] = S0.f64 < S1.f64', + VOPCOp.V_CMPX_EQ_F64_E32: 'EXEC.u64[laneId] = S0.f64 == S1.f64', + VOPCOp.V_CMPX_LE_F64_E32: 'EXEC.u64[laneId] = S0.f64 <= S1.f64', + VOPCOp.V_CMPX_GT_F64_E32: 'EXEC.u64[laneId] = S0.f64 > S1.f64', + VOPCOp.V_CMPX_LG_F64_E32: 'EXEC.u64[laneId] = S0.f64 <> S1.f64', + VOPCOp.V_CMPX_GE_F64_E32: 'EXEC.u64[laneId] = S0.f64 >= S1.f64', + VOPCOp.V_CMPX_O_F64_E32: 'EXEC.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64))', + VOPCOp.V_CMPX_U_F64_E32: 'EXEC.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64))', + VOPCOp.V_CMPX_NGE_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <', + VOPCOp.V_CMPX_NLG_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==', + VOPCOp.V_CMPX_NGT_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=', + VOPCOp.V_CMPX_NLE_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >', + VOPCOp.V_CMPX_NEQ_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=', + VOPCOp.V_CMPX_NLT_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=', + VOPCOp.V_CMPX_T_F64_E32: "EXEC.u64[laneId] = 1'1U", + VOPCOp.V_CMPX_LT_I16_E32: 'EXEC.u64[laneId] = S0.i16 < S1.i16', + VOPCOp.V_CMPX_EQ_I16_E32: 'EXEC.u64[laneId] = S0.i16 == S1.i16', + VOPCOp.V_CMPX_LE_I16_E32: 'EXEC.u64[laneId] = S0.i16 <= S1.i16', + VOPCOp.V_CMPX_GT_I16_E32: 'EXEC.u64[laneId] = S0.i16 > S1.i16', + VOPCOp.V_CMPX_NE_I16_E32: 'EXEC.u64[laneId] = S0.i16 <> S1.i16', + VOPCOp.V_CMPX_GE_I16_E32: 'EXEC.u64[laneId] = S0.i16 >= S1.i16', + VOPCOp.V_CMPX_LT_U16_E32: 'EXEC.u64[laneId] = S0.u16 < S1.u16', + VOPCOp.V_CMPX_EQ_U16_E32: 'EXEC.u64[laneId] = S0.u16 == S1.u16', + VOPCOp.V_CMPX_LE_U16_E32: 'EXEC.u64[laneId] = S0.u16 <= S1.u16', + VOPCOp.V_CMPX_GT_U16_E32: 'EXEC.u64[laneId] = S0.u16 > S1.u16', + VOPCOp.V_CMPX_NE_U16_E32: 'EXEC.u64[laneId] = S0.u16 <> S1.u16', + VOPCOp.V_CMPX_GE_U16_E32: 'EXEC.u64[laneId] = S0.u16 >= S1.u16', + VOPCOp.V_CMPX_F_I32_E32: "EXEC.u64[laneId] = 1'0U", + VOPCOp.V_CMPX_LT_I32_E32: 'EXEC.u64[laneId] = S0.i32 < S1.i32', + VOPCOp.V_CMPX_EQ_I32_E32: 'EXEC.u64[laneId] = S0.i32 == S1.i32', + VOPCOp.V_CMPX_LE_I32_E32: 'EXEC.u64[laneId] = S0.i32 <= S1.i32', + VOPCOp.V_CMPX_GT_I32_E32: 'EXEC.u64[laneId] = S0.i32 > S1.i32', + VOPCOp.V_CMPX_NE_I32_E32: 'EXEC.u64[laneId] = S0.i32 <> S1.i32', + VOPCOp.V_CMPX_GE_I32_E32: 'EXEC.u64[laneId] = S0.i32 >= S1.i32', + VOPCOp.V_CMPX_T_I32_E32: "EXEC.u64[laneId] = 1'1U", + VOPCOp.V_CMPX_F_U32_E32: "EXEC.u64[laneId] = 1'0U", + VOPCOp.V_CMPX_LT_U32_E32: 'EXEC.u64[laneId] = S0.u32 < S1.u32', + VOPCOp.V_CMPX_EQ_U32_E32: 'EXEC.u64[laneId] = S0.u32 == S1.u32', + VOPCOp.V_CMPX_LE_U32_E32: 'EXEC.u64[laneId] = S0.u32 <= S1.u32', + VOPCOp.V_CMPX_GT_U32_E32: 'EXEC.u64[laneId] = S0.u32 > S1.u32', + VOPCOp.V_CMPX_NE_U32_E32: 'EXEC.u64[laneId] = S0.u32 <> S1.u32', + VOPCOp.V_CMPX_GE_U32_E32: 'EXEC.u64[laneId] = S0.u32 >= S1.u32', + VOPCOp.V_CMPX_T_U32_E32: "EXEC.u64[laneId] = 1'1U", + VOPCOp.V_CMPX_F_I64_E32: "EXEC.u64[laneId] = 1'0U", + VOPCOp.V_CMPX_LT_I64_E32: 'EXEC.u64[laneId] = S0.i64 < S1.i64', + VOPCOp.V_CMPX_EQ_I64_E32: 'EXEC.u64[laneId] = S0.i64 == S1.i64', + VOPCOp.V_CMPX_LE_I64_E32: 'EXEC.u64[laneId] = S0.i64 <= S1.i64', + VOPCOp.V_CMPX_GT_I64_E32: 'EXEC.u64[laneId] = S0.i64 > S1.i64', + VOPCOp.V_CMPX_NE_I64_E32: 'EXEC.u64[laneId] = S0.i64 <> S1.i64', + VOPCOp.V_CMPX_GE_I64_E32: 'EXEC.u64[laneId] = S0.i64 >= S1.i64', + VOPCOp.V_CMPX_T_I64_E32: "EXEC.u64[laneId] = 1'1U", + VOPCOp.V_CMPX_F_U64_E32: "EXEC.u64[laneId] = 1'0U", + VOPCOp.V_CMPX_LT_U64_E32: 'EXEC.u64[laneId] = S0.u64 < S1.u64', + VOPCOp.V_CMPX_EQ_U64_E32: 'EXEC.u64[laneId] = S0.u64 == S1.u64', + VOPCOp.V_CMPX_LE_U64_E32: 'EXEC.u64[laneId] = S0.u64 <= S1.u64', + VOPCOp.V_CMPX_GT_U64_E32: 'EXEC.u64[laneId] = S0.u64 > S1.u64', + VOPCOp.V_CMPX_NE_U64_E32: 'EXEC.u64[laneId] = S0.u64 <> S1.u64', + VOPCOp.V_CMPX_GE_U64_E32: 'EXEC.u64[laneId] = S0.u64 >= S1.u64', + VOPCOp.V_CMPX_T_U64_E32: "EXEC.u64[laneId] = 1'1U", + VOPCOp.V_CMPX_CLASS_F16_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOPCOp.V_CMPX_CLASS_F32_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOPCOp.V_CMPX_CLASS_F64_E32: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/__init__.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/enum.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/enum.py new file mode 100644 index 000000000..72ba69238 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/enum.py @@ -0,0 +1,2233 @@ +# autogenerated from AMD ISA XML - do not edit +from tinygrad.runtime.autogen.amd.common import ReprEnum, Fmt, FMT_BITS, OpType # noqa: F401 + +class DSOp(ReprEnum): + DS_ADD_U32 = 0 + DS_SUB_U32 = 1 + DS_RSUB_U32 = 2 + DS_INC_U32 = 3 + DS_DEC_U32 = 4 + DS_MIN_I32 = 5 + DS_MAX_I32 = 6 + DS_MIN_U32 = 7 + DS_MAX_U32 = 8 + DS_AND_B32 = 9 + DS_OR_B32 = 10 + DS_XOR_B32 = 11 + DS_MSKOR_B32 = 12 + DS_STORE_B32 = 13 + DS_STORE_2ADDR_B32 = 14 + DS_STORE_2ADDR_STRIDE64_B32 = 15 + DS_CMPSTORE_B32 = 16 + DS_MIN_NUM_F32 = 18 + DS_MAX_NUM_F32 = 19 + DS_NOP = 20 + DS_ADD_F32 = 21 + DS_STORE_B8 = 30 + DS_STORE_B16 = 31 + DS_ADD_RTN_U32 = 32 + DS_SUB_RTN_U32 = 33 + DS_RSUB_RTN_U32 = 34 + DS_INC_RTN_U32 = 35 + DS_DEC_RTN_U32 = 36 + DS_MIN_RTN_I32 = 37 + DS_MAX_RTN_I32 = 38 + DS_MIN_RTN_U32 = 39 + DS_MAX_RTN_U32 = 40 + DS_AND_RTN_B32 = 41 + DS_OR_RTN_B32 = 42 + DS_XOR_RTN_B32 = 43 + DS_MSKOR_RTN_B32 = 44 + DS_STOREXCHG_RTN_B32 = 45 + DS_STOREXCHG_2ADDR_RTN_B32 = 46 + DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32 = 47 + DS_CMPSTORE_RTN_B32 = 48 + DS_MIN_NUM_RTN_F32 = 50 + DS_MAX_NUM_RTN_F32 = 51 + DS_SWIZZLE_B32 = 53 + DS_LOAD_B32 = 54 + DS_LOAD_2ADDR_B32 = 55 + DS_LOAD_2ADDR_STRIDE64_B32 = 56 + DS_LOAD_I8 = 57 + DS_LOAD_U8 = 58 + DS_LOAD_I16 = 59 + DS_LOAD_U16 = 60 + DS_CONSUME = 61 + DS_APPEND = 62 + DS_ADD_U64 = 64 + DS_SUB_U64 = 65 + DS_RSUB_U64 = 66 + DS_INC_U64 = 67 + DS_DEC_U64 = 68 + DS_MIN_I64 = 69 + DS_MAX_I64 = 70 + DS_MIN_U64 = 71 + DS_MAX_U64 = 72 + DS_AND_B64 = 73 + DS_OR_B64 = 74 + DS_XOR_B64 = 75 + DS_MSKOR_B64 = 76 + DS_STORE_B64 = 77 + DS_STORE_2ADDR_B64 = 78 + DS_STORE_2ADDR_STRIDE64_B64 = 79 + DS_CMPSTORE_B64 = 80 + DS_MIN_NUM_F64 = 82 + DS_MAX_NUM_F64 = 83 + DS_ADD_RTN_U64 = 96 + DS_SUB_RTN_U64 = 97 + DS_RSUB_RTN_U64 = 98 + DS_INC_RTN_U64 = 99 + DS_DEC_RTN_U64 = 100 + DS_MIN_RTN_I64 = 101 + DS_MAX_RTN_I64 = 102 + DS_MIN_RTN_U64 = 103 + DS_MAX_RTN_U64 = 104 + DS_AND_RTN_B64 = 105 + DS_OR_RTN_B64 = 106 + DS_XOR_RTN_B64 = 107 + DS_MSKOR_RTN_B64 = 108 + DS_STOREXCHG_RTN_B64 = 109 + DS_STOREXCHG_2ADDR_RTN_B64 = 110 + DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64 = 111 + DS_CMPSTORE_RTN_B64 = 112 + DS_MIN_NUM_RTN_F64 = 114 + DS_MAX_NUM_RTN_F64 = 115 + DS_LOAD_B64 = 118 + DS_LOAD_2ADDR_B64 = 119 + DS_LOAD_2ADDR_STRIDE64_B64 = 120 + DS_ADD_RTN_F32 = 121 + DS_CONDXCHG32_RTN_B64 = 126 + DS_COND_SUB_U32 = 152 + DS_SUB_CLAMP_U32 = 153 + DS_PK_ADD_F16 = 154 + DS_PK_ADD_BF16 = 155 + DS_STORE_B8_D16_HI = 160 + DS_STORE_B16_D16_HI = 161 + DS_LOAD_U8_D16 = 162 + DS_LOAD_U8_D16_HI = 163 + DS_LOAD_I8_D16 = 164 + DS_LOAD_I8_D16_HI = 165 + DS_LOAD_U16_D16 = 166 + DS_LOAD_U16_D16_HI = 167 + DS_COND_SUB_RTN_U32 = 168 + DS_SUB_CLAMP_RTN_U32 = 169 + DS_PK_ADD_RTN_F16 = 170 + DS_PK_ADD_RTN_BF16 = 171 + DS_STORE_ADDTID_B32 = 176 + DS_LOAD_ADDTID_B32 = 177 + DS_PERMUTE_B32 = 178 + DS_BPERMUTE_B32 = 179 + DS_BPERMUTE_FI_B32 = 205 + DS_STORE_B96 = 222 + DS_STORE_B128 = 223 + DS_BVH_STACK_PUSH4_POP1_RTN_B32 = 224 + DS_BVH_STACK_PUSH8_POP1_RTN_B32 = 225 + DS_BVH_STACK_PUSH8_POP2_RTN_B64 = 226 + DS_LOAD_B96 = 254 + DS_LOAD_B128 = 255 + +class HWREG(ReprEnum): + HW_REG_WAVE_MODE = 1 + HW_REG_WAVE_STATUS = 2 + HW_REG_WAVE_STATE_PRIV = 4 + HW_REG_WAVE_GPR_ALLOC = 5 + HW_REG_WAVE_LDS_ALLOC = 6 + HW_REG_PERF_SNAPSHOT_DATA = 10 + HW_REG_PERF_SNAPSHOT_PC_LO = 11 + HW_REG_PERF_SNAPSHOT_PC_HI = 12 + HW_REG_PERF_SNAPSHOT_DATA1 = 15 + HW_REG_PERF_SNAPSHOT_DATA2 = 16 + HW_REG_WAVE_EXCP_FLAG_PRIV = 17 + HW_REG_WAVE_EXCP_FLAG_USER = 18 + HW_REG_WAVE_TRAP_CTRL = 19 + HW_REG_WAVE_SCRATCH_BASE_LO = 20 + HW_REG_WAVE_SCRATCH_BASE_HI = 21 + HW_REG_WAVE_HW_ID1 = 23 + HW_REG_WAVE_HW_ID2 = 24 + HW_REG_SHADER_CYCLES_LO = 29 + HW_REG_SHADER_CYCLES_HI = 30 + +class MSG(ReprEnum): + MSG_RTN_GET_DOORBELL = 128 + MSG_RTN_GET_DDID = 129 + MSG_RTN_GET_TMA = 130 + MSG_RTN_GET_REALTIME = 131 + MSG_RTN_SAVE_WAVE = 132 + MSG_RTN_GET_TBA = 133 + MSG_RTN_GET_TBA_TO_PC = 134 + MSG_RTN_GET_SE_HW_ID = 135 + MSG_RTN_ILLEGAL_MSG = 255 + +class SMEMOp(ReprEnum): + S_LOAD_B32 = 0 + S_LOAD_B64 = 1 + S_LOAD_B128 = 2 + S_LOAD_B256 = 3 + S_LOAD_B512 = 4 + S_LOAD_B96 = 5 + S_LOAD_I8 = 8 + S_LOAD_U8 = 9 + S_LOAD_I16 = 10 + S_LOAD_U16 = 11 + S_BUFFER_LOAD_B32 = 16 + S_BUFFER_LOAD_B64 = 17 + S_BUFFER_LOAD_B128 = 18 + S_BUFFER_LOAD_B256 = 19 + S_BUFFER_LOAD_B512 = 20 + S_BUFFER_LOAD_B96 = 21 + S_BUFFER_LOAD_I8 = 24 + S_BUFFER_LOAD_U8 = 25 + S_BUFFER_LOAD_I16 = 26 + S_BUFFER_LOAD_U16 = 27 + S_DCACHE_INV = 33 + S_ATC_PROBE = 34 + S_ATC_PROBE_BUFFER = 35 + S_PREFETCH_INST = 36 + S_PREFETCH_INST_PC_REL = 37 + S_PREFETCH_DATA = 38 + S_BUFFER_PREFETCH_DATA = 39 + S_PREFETCH_DATA_PC_REL = 40 + +class SOP1Op(ReprEnum): + S_MOV_B32 = 0 + S_MOV_B64 = 1 + S_CMOV_B32 = 2 + S_CMOV_B64 = 3 + S_BREV_B32 = 4 + S_BREV_B64 = 5 + S_CTZ_I32_B32 = 8 + S_CTZ_I32_B64 = 9 + S_CLZ_I32_U32 = 10 + S_CLZ_I32_U64 = 11 + S_CLS_I32 = 12 + S_CLS_I32_I64 = 13 + S_SEXT_I32_I8 = 14 + S_SEXT_I32_I16 = 15 + S_BITSET0_B32 = 16 + S_BITSET0_B64 = 17 + S_BITSET1_B32 = 18 + S_BITSET1_B64 = 19 + S_BITREPLICATE_B64_B32 = 20 + S_ABS_I32 = 21 + S_BCNT0_I32_B32 = 22 + S_BCNT0_I32_B64 = 23 + S_BCNT1_I32_B32 = 24 + S_BCNT1_I32_B64 = 25 + S_QUADMASK_B32 = 26 + S_QUADMASK_B64 = 27 + S_WQM_B32 = 28 + S_WQM_B64 = 29 + S_NOT_B32 = 30 + S_NOT_B64 = 31 + S_AND_SAVEEXEC_B32 = 32 + S_AND_SAVEEXEC_B64 = 33 + S_OR_SAVEEXEC_B32 = 34 + S_OR_SAVEEXEC_B64 = 35 + S_XOR_SAVEEXEC_B32 = 36 + S_XOR_SAVEEXEC_B64 = 37 + S_NAND_SAVEEXEC_B32 = 38 + S_NAND_SAVEEXEC_B64 = 39 + S_NOR_SAVEEXEC_B32 = 40 + S_NOR_SAVEEXEC_B64 = 41 + S_XNOR_SAVEEXEC_B32 = 42 + S_XNOR_SAVEEXEC_B64 = 43 + S_AND_NOT0_SAVEEXEC_B32 = 44 + S_AND_NOT0_SAVEEXEC_B64 = 45 + S_OR_NOT0_SAVEEXEC_B32 = 46 + S_OR_NOT0_SAVEEXEC_B64 = 47 + S_AND_NOT1_SAVEEXEC_B32 = 48 + S_AND_NOT1_SAVEEXEC_B64 = 49 + S_OR_NOT1_SAVEEXEC_B32 = 50 + S_OR_NOT1_SAVEEXEC_B64 = 51 + S_AND_NOT0_WREXEC_B32 = 52 + S_AND_NOT0_WREXEC_B64 = 53 + S_AND_NOT1_WREXEC_B32 = 54 + S_AND_NOT1_WREXEC_B64 = 55 + S_MOVRELS_B32 = 64 + S_MOVRELS_B64 = 65 + S_MOVRELD_B32 = 66 + S_MOVRELD_B64 = 67 + S_MOVRELSD_2_B32 = 68 + S_GETPC_B64 = 71 + S_SETPC_B64 = 72 + S_SWAPPC_B64 = 73 + S_RFE_B64 = 74 + S_SENDMSG_RTN_B32 = 76 + S_SENDMSG_RTN_B64 = 77 + S_BARRIER_SIGNAL = 78 + S_BARRIER_SIGNAL_ISFIRST = 79 + S_GET_BARRIER_STATE = 80 + S_BARRIER_INIT = 81 + S_BARRIER_JOIN = 82 + S_ALLOC_VGPR = 83 + S_SLEEP_VAR = 88 + S_CEIL_F32 = 96 + S_FLOOR_F32 = 97 + S_TRUNC_F32 = 98 + S_RNDNE_F32 = 99 + S_CVT_F32_I32 = 100 + S_CVT_F32_U32 = 101 + S_CVT_I32_F32 = 102 + S_CVT_U32_F32 = 103 + S_CVT_F16_F32 = 104 + S_CVT_F32_F16 = 105 + S_CVT_HI_F32_F16 = 106 + S_CEIL_F16 = 107 + S_FLOOR_F16 = 108 + S_TRUNC_F16 = 109 + S_RNDNE_F16 = 110 + +class SOP2Op(ReprEnum): + S_ADD_CO_U32 = 0 + S_SUB_CO_U32 = 1 + S_ADD_CO_I32 = 2 + S_SUB_CO_I32 = 3 + S_ADD_CO_CI_U32 = 4 + S_SUB_CO_CI_U32 = 5 + S_ABSDIFF_I32 = 6 + S_LSHL_B32 = 8 + S_LSHL_B64 = 9 + S_LSHR_B32 = 10 + S_LSHR_B64 = 11 + S_ASHR_I32 = 12 + S_ASHR_I64 = 13 + S_LSHL1_ADD_U32 = 14 + S_LSHL2_ADD_U32 = 15 + S_LSHL3_ADD_U32 = 16 + S_LSHL4_ADD_U32 = 17 + S_MIN_I32 = 18 + S_MIN_U32 = 19 + S_MAX_I32 = 20 + S_MAX_U32 = 21 + S_AND_B32 = 22 + S_AND_B64 = 23 + S_OR_B32 = 24 + S_OR_B64 = 25 + S_XOR_B32 = 26 + S_XOR_B64 = 27 + S_NAND_B32 = 28 + S_NAND_B64 = 29 + S_NOR_B32 = 30 + S_NOR_B64 = 31 + S_XNOR_B32 = 32 + S_XNOR_B64 = 33 + S_AND_NOT1_B32 = 34 + S_AND_NOT1_B64 = 35 + S_OR_NOT1_B32 = 36 + S_OR_NOT1_B64 = 37 + S_BFE_U32 = 38 + S_BFE_I32 = 39 + S_BFE_U64 = 40 + S_BFE_I64 = 41 + S_BFM_B32 = 42 + S_BFM_B64 = 43 + S_MUL_I32 = 44 + S_MUL_HI_U32 = 45 + S_MUL_HI_I32 = 46 + S_CSELECT_B32 = 48 + S_CSELECT_B64 = 49 + S_PACK_LL_B32_B16 = 50 + S_PACK_LH_B32_B16 = 51 + S_PACK_HH_B32_B16 = 52 + S_PACK_HL_B32_B16 = 53 + S_ADD_F32 = 64 + S_SUB_F32 = 65 + S_MIN_NUM_F32 = 66 + S_MAX_NUM_F32 = 67 + S_MUL_F32 = 68 + S_FMAAK_F32 = 69 + S_FMAMK_F32 = 70 + S_FMAC_F32 = 71 + S_CVT_PK_RTZ_F16_F32 = 72 + S_ADD_F16 = 73 + S_SUB_F16 = 74 + S_MIN_NUM_F16 = 75 + S_MAX_NUM_F16 = 76 + S_MUL_F16 = 77 + S_FMAC_F16 = 78 + S_MINIMUM_F32 = 79 + S_MAXIMUM_F32 = 80 + S_MINIMUM_F16 = 81 + S_MAXIMUM_F16 = 82 + S_ADD_NC_U64 = 83 + S_SUB_NC_U64 = 84 + S_MUL_U64 = 85 + +class SOPCOp(ReprEnum): + S_CMP_EQ_I32 = 0 + S_CMP_LG_I32 = 1 + S_CMP_GT_I32 = 2 + S_CMP_GE_I32 = 3 + S_CMP_LT_I32 = 4 + S_CMP_LE_I32 = 5 + S_CMP_EQ_U32 = 6 + S_CMP_LG_U32 = 7 + S_CMP_GT_U32 = 8 + S_CMP_GE_U32 = 9 + S_CMP_LT_U32 = 10 + S_CMP_LE_U32 = 11 + S_BITCMP0_B32 = 12 + S_BITCMP1_B32 = 13 + S_BITCMP0_B64 = 14 + S_BITCMP1_B64 = 15 + S_CMP_EQ_U64 = 16 + S_CMP_LG_U64 = 17 + S_CMP_LT_F32 = 65 + S_CMP_EQ_F32 = 66 + S_CMP_LE_F32 = 67 + S_CMP_GT_F32 = 68 + S_CMP_LG_F32 = 69 + S_CMP_GE_F32 = 70 + S_CMP_O_F32 = 71 + S_CMP_U_F32 = 72 + S_CMP_NGE_F32 = 73 + S_CMP_NLG_F32 = 74 + S_CMP_NGT_F32 = 75 + S_CMP_NLE_F32 = 76 + S_CMP_NEQ_F32 = 77 + S_CMP_NLT_F32 = 78 + S_CMP_LT_F16 = 81 + S_CMP_EQ_F16 = 82 + S_CMP_LE_F16 = 83 + S_CMP_GT_F16 = 84 + S_CMP_LG_F16 = 85 + S_CMP_GE_F16 = 86 + S_CMP_O_F16 = 87 + S_CMP_U_F16 = 88 + S_CMP_NGE_F16 = 89 + S_CMP_NLG_F16 = 90 + S_CMP_NGT_F16 = 91 + S_CMP_NLE_F16 = 92 + S_CMP_NEQ_F16 = 93 + S_CMP_NLT_F16 = 94 + +class SOPKOp(ReprEnum): + S_MOVK_I32 = 0 + S_VERSION = 1 + S_CMOVK_I32 = 2 + S_ADDK_CO_I32 = 15 + S_MULK_I32 = 16 + S_GETREG_B32 = 17 + S_SETREG_B32 = 18 + S_SETREG_IMM32_B32 = 19 + S_CALL_B64 = 20 + +class SOPPOp(ReprEnum): + S_NOP = 0 + S_SETKILL = 1 + S_SETHALT = 2 + S_SLEEP = 3 + S_CLAUSE = 5 + S_DELAY_ALU = 7 + S_WAIT_ALU = 8 + S_WAITCNT = 9 + S_WAIT_IDLE = 10 + S_WAIT_EVENT = 11 + S_TRAP = 16 + S_ROUND_MODE = 17 + S_DENORM_MODE = 18 + S_BARRIER_WAIT = 20 + S_BARRIER_LEAVE = 21 + S_CODE_END = 31 + S_BRANCH = 32 + S_CBRANCH_SCC0 = 33 + S_CBRANCH_SCC1 = 34 + S_CBRANCH_VCCZ = 35 + S_CBRANCH_VCCNZ = 36 + S_CBRANCH_EXECZ = 37 + S_CBRANCH_EXECNZ = 38 + S_ENDPGM = 48 + S_ENDPGM_SAVED = 49 + S_WAKEUP = 52 + S_SETPRIO = 53 + S_SENDMSG = 54 + S_SENDMSGHALT = 55 + S_INCPERFLEVEL = 56 + S_DECPERFLEVEL = 57 + S_TTRACEDATA = 58 + S_TTRACEDATA_IMM = 59 + S_ICACHE_INV = 60 + S_WAIT_LOADCNT = 64 + S_WAIT_STORECNT = 65 + S_WAIT_SAMPLECNT = 66 + S_WAIT_BVHCNT = 67 + S_WAIT_EXPCNT = 68 + S_WAIT_DSCNT = 70 + S_WAIT_KMCNT = 71 + S_WAIT_LOADCNT_DSCNT = 72 + S_WAIT_STORECNT_DSCNT = 73 + +class VBUFFEROp(ReprEnum): + BUFFER_LOAD_FORMAT_X = 0 + BUFFER_LOAD_FORMAT_XY = 1 + BUFFER_LOAD_FORMAT_XYZ = 2 + BUFFER_LOAD_FORMAT_XYZW = 3 + BUFFER_STORE_FORMAT_X = 4 + BUFFER_STORE_FORMAT_XY = 5 + BUFFER_STORE_FORMAT_XYZ = 6 + BUFFER_STORE_FORMAT_XYZW = 7 + BUFFER_LOAD_D16_FORMAT_X = 8 + BUFFER_LOAD_D16_FORMAT_XY = 9 + BUFFER_LOAD_D16_FORMAT_XYZ = 10 + BUFFER_LOAD_D16_FORMAT_XYZW = 11 + BUFFER_STORE_D16_FORMAT_X = 12 + BUFFER_STORE_D16_FORMAT_XY = 13 + BUFFER_STORE_D16_FORMAT_XYZ = 14 + BUFFER_STORE_D16_FORMAT_XYZW = 15 + BUFFER_LOAD_U8 = 16 + BUFFER_LOAD_I8 = 17 + BUFFER_LOAD_U16 = 18 + BUFFER_LOAD_I16 = 19 + BUFFER_LOAD_B32 = 20 + BUFFER_LOAD_B64 = 21 + BUFFER_LOAD_B96 = 22 + BUFFER_LOAD_B128 = 23 + BUFFER_STORE_B8 = 24 + BUFFER_STORE_B16 = 25 + BUFFER_STORE_B32 = 26 + BUFFER_STORE_B64 = 27 + BUFFER_STORE_B96 = 28 + BUFFER_STORE_B128 = 29 + BUFFER_LOAD_D16_U8 = 30 + BUFFER_LOAD_D16_I8 = 31 + BUFFER_LOAD_D16_B16 = 32 + BUFFER_LOAD_D16_HI_U8 = 33 + BUFFER_LOAD_D16_HI_I8 = 34 + BUFFER_LOAD_D16_HI_B16 = 35 + BUFFER_STORE_D16_HI_B8 = 36 + BUFFER_STORE_D16_HI_B16 = 37 + BUFFER_LOAD_D16_HI_FORMAT_X = 38 + BUFFER_STORE_D16_HI_FORMAT_X = 39 + BUFFER_ATOMIC_SWAP_B32 = 51 + BUFFER_ATOMIC_CMPSWAP_B32 = 52 + BUFFER_ATOMIC_ADD_U32 = 53 + BUFFER_ATOMIC_SUB_U32 = 54 + BUFFER_ATOMIC_SUB_CLAMP_U32 = 55 + BUFFER_ATOMIC_MIN_I32 = 56 + BUFFER_ATOMIC_MIN_U32 = 57 + BUFFER_ATOMIC_MAX_I32 = 58 + BUFFER_ATOMIC_MAX_U32 = 59 + BUFFER_ATOMIC_AND_B32 = 60 + BUFFER_ATOMIC_OR_B32 = 61 + BUFFER_ATOMIC_XOR_B32 = 62 + BUFFER_ATOMIC_INC_U32 = 63 + BUFFER_ATOMIC_DEC_U32 = 64 + BUFFER_ATOMIC_SWAP_B64 = 65 + BUFFER_ATOMIC_CMPSWAP_B64 = 66 + BUFFER_ATOMIC_ADD_U64 = 67 + BUFFER_ATOMIC_SUB_U64 = 68 + BUFFER_ATOMIC_MIN_I64 = 69 + BUFFER_ATOMIC_MIN_U64 = 70 + BUFFER_ATOMIC_MAX_I64 = 71 + BUFFER_ATOMIC_MAX_U64 = 72 + BUFFER_ATOMIC_AND_B64 = 73 + BUFFER_ATOMIC_OR_B64 = 74 + BUFFER_ATOMIC_XOR_B64 = 75 + BUFFER_ATOMIC_INC_U64 = 76 + BUFFER_ATOMIC_DEC_U64 = 77 + BUFFER_ATOMIC_COND_SUB_U32 = 80 + BUFFER_ATOMIC_MIN_NUM_F32 = 81 + BUFFER_ATOMIC_MAX_NUM_F32 = 82 + BUFFER_ATOMIC_ADD_F32 = 86 + BUFFER_ATOMIC_PK_ADD_F16 = 89 + BUFFER_ATOMIC_PK_ADD_BF16 = 90 + TBUFFER_LOAD_FORMAT_X = 128 + TBUFFER_LOAD_FORMAT_XY = 129 + TBUFFER_LOAD_FORMAT_XYZ = 130 + TBUFFER_LOAD_FORMAT_XYZW = 131 + TBUFFER_STORE_FORMAT_X = 132 + TBUFFER_STORE_FORMAT_XY = 133 + TBUFFER_STORE_FORMAT_XYZ = 134 + TBUFFER_STORE_FORMAT_XYZW = 135 + TBUFFER_LOAD_D16_FORMAT_X = 136 + TBUFFER_LOAD_D16_FORMAT_XY = 137 + TBUFFER_LOAD_D16_FORMAT_XYZ = 138 + TBUFFER_LOAD_D16_FORMAT_XYZW = 139 + TBUFFER_STORE_D16_FORMAT_X = 140 + TBUFFER_STORE_D16_FORMAT_XY = 141 + TBUFFER_STORE_D16_FORMAT_XYZ = 142 + TBUFFER_STORE_D16_FORMAT_XYZW = 143 + +class VDSDIROp(ReprEnum): + DS_PARAM_LOAD = 0 + DS_DIRECT_LOAD = 1 + +class VEXPORTOp(ReprEnum): + EXPORT = 0 + +class VFLATOp(ReprEnum): + FLAT_LOAD_U8 = 16 + FLAT_LOAD_I8 = 17 + FLAT_LOAD_U16 = 18 + FLAT_LOAD_I16 = 19 + FLAT_LOAD_B32 = 20 + FLAT_LOAD_B64 = 21 + FLAT_LOAD_B96 = 22 + FLAT_LOAD_B128 = 23 + FLAT_STORE_B8 = 24 + FLAT_STORE_B16 = 25 + FLAT_STORE_B32 = 26 + FLAT_STORE_B64 = 27 + FLAT_STORE_B96 = 28 + FLAT_STORE_B128 = 29 + FLAT_LOAD_D16_U8 = 30 + FLAT_LOAD_D16_I8 = 31 + FLAT_LOAD_D16_B16 = 32 + FLAT_LOAD_D16_HI_U8 = 33 + FLAT_LOAD_D16_HI_I8 = 34 + FLAT_LOAD_D16_HI_B16 = 35 + FLAT_STORE_D16_HI_B8 = 36 + FLAT_STORE_D16_HI_B16 = 37 + GLOBAL_LOAD_ADDTID_B32 = 40 + GLOBAL_STORE_ADDTID_B32 = 41 + FLAT_ATOMIC_SWAP_B32 = 51 + FLAT_ATOMIC_CMPSWAP_B32 = 52 + FLAT_ATOMIC_ADD_U32 = 53 + FLAT_ATOMIC_SUB_U32 = 54 + FLAT_ATOMIC_SUB_CLAMP_U32 = 55 + FLAT_ATOMIC_MIN_I32 = 56 + FLAT_ATOMIC_MIN_U32 = 57 + FLAT_ATOMIC_MAX_I32 = 58 + FLAT_ATOMIC_MAX_U32 = 59 + FLAT_ATOMIC_AND_B32 = 60 + FLAT_ATOMIC_OR_B32 = 61 + FLAT_ATOMIC_XOR_B32 = 62 + FLAT_ATOMIC_INC_U32 = 63 + FLAT_ATOMIC_DEC_U32 = 64 + FLAT_ATOMIC_SWAP_B64 = 65 + FLAT_ATOMIC_CMPSWAP_B64 = 66 + FLAT_ATOMIC_ADD_U64 = 67 + FLAT_ATOMIC_SUB_U64 = 68 + FLAT_ATOMIC_MIN_I64 = 69 + FLAT_ATOMIC_MIN_U64 = 70 + FLAT_ATOMIC_MAX_I64 = 71 + FLAT_ATOMIC_MAX_U64 = 72 + FLAT_ATOMIC_AND_B64 = 73 + FLAT_ATOMIC_OR_B64 = 74 + FLAT_ATOMIC_XOR_B64 = 75 + FLAT_ATOMIC_INC_U64 = 76 + FLAT_ATOMIC_DEC_U64 = 77 + FLAT_ATOMIC_COND_SUB_U32 = 80 + FLAT_ATOMIC_MIN_NUM_F32 = 81 + FLAT_ATOMIC_MAX_NUM_F32 = 82 + FLAT_ATOMIC_ADD_F32 = 86 + FLAT_ATOMIC_PK_ADD_F16 = 89 + FLAT_ATOMIC_PK_ADD_BF16 = 90 + +class VGLOBALOp(ReprEnum): + GLOBAL_LOAD_U8 = 16 + GLOBAL_LOAD_I8 = 17 + GLOBAL_LOAD_U16 = 18 + GLOBAL_LOAD_I16 = 19 + GLOBAL_LOAD_B32 = 20 + GLOBAL_LOAD_B64 = 21 + GLOBAL_LOAD_B96 = 22 + GLOBAL_LOAD_B128 = 23 + GLOBAL_STORE_B8 = 24 + GLOBAL_STORE_B16 = 25 + GLOBAL_STORE_B32 = 26 + GLOBAL_STORE_B64 = 27 + GLOBAL_STORE_B96 = 28 + GLOBAL_STORE_B128 = 29 + GLOBAL_LOAD_D16_U8 = 30 + GLOBAL_LOAD_D16_I8 = 31 + GLOBAL_LOAD_D16_B16 = 32 + GLOBAL_LOAD_D16_HI_U8 = 33 + GLOBAL_LOAD_D16_HI_I8 = 34 + GLOBAL_LOAD_D16_HI_B16 = 35 + GLOBAL_STORE_D16_HI_B8 = 36 + GLOBAL_STORE_D16_HI_B16 = 37 + GLOBAL_LOAD_ADDTID_B32 = 40 + GLOBAL_STORE_ADDTID_B32 = 41 + GLOBAL_INV = 43 + GLOBAL_WB = 44 + GLOBAL_ATOMIC_SWAP_B32 = 51 + GLOBAL_ATOMIC_CMPSWAP_B32 = 52 + GLOBAL_ATOMIC_ADD_U32 = 53 + GLOBAL_ATOMIC_SUB_U32 = 54 + GLOBAL_ATOMIC_SUB_CLAMP_U32 = 55 + GLOBAL_ATOMIC_MIN_I32 = 56 + GLOBAL_ATOMIC_MIN_U32 = 57 + GLOBAL_ATOMIC_MAX_I32 = 58 + GLOBAL_ATOMIC_MAX_U32 = 59 + GLOBAL_ATOMIC_AND_B32 = 60 + GLOBAL_ATOMIC_OR_B32 = 61 + GLOBAL_ATOMIC_XOR_B32 = 62 + GLOBAL_ATOMIC_INC_U32 = 63 + GLOBAL_ATOMIC_DEC_U32 = 64 + GLOBAL_ATOMIC_SWAP_B64 = 65 + GLOBAL_ATOMIC_CMPSWAP_B64 = 66 + GLOBAL_ATOMIC_ADD_U64 = 67 + GLOBAL_ATOMIC_SUB_U64 = 68 + GLOBAL_ATOMIC_MIN_I64 = 69 + GLOBAL_ATOMIC_MIN_U64 = 70 + GLOBAL_ATOMIC_MAX_I64 = 71 + GLOBAL_ATOMIC_MAX_U64 = 72 + GLOBAL_ATOMIC_AND_B64 = 73 + GLOBAL_ATOMIC_OR_B64 = 74 + GLOBAL_ATOMIC_XOR_B64 = 75 + GLOBAL_ATOMIC_INC_U64 = 76 + GLOBAL_ATOMIC_DEC_U64 = 77 + GLOBAL_WBINV = 79 + GLOBAL_ATOMIC_COND_SUB_U32 = 80 + GLOBAL_ATOMIC_MIN_NUM_F32 = 81 + GLOBAL_ATOMIC_MAX_NUM_F32 = 82 + GLOBAL_LOAD_BLOCK = 83 + GLOBAL_STORE_BLOCK = 84 + GLOBAL_ATOMIC_ADD_F32 = 86 + GLOBAL_LOAD_TR_B128 = 87 + GLOBAL_LOAD_TR_B64 = 88 + GLOBAL_ATOMIC_PK_ADD_F16 = 89 + GLOBAL_ATOMIC_PK_ADD_BF16 = 90 + GLOBAL_ATOMIC_ORDERED_ADD_B64 = 115 + +class VIMAGEOp(ReprEnum): + IMAGE_LOAD = 0 + IMAGE_LOAD_MIP = 1 + IMAGE_LOAD_PCK = 2 + IMAGE_LOAD_PCK_SGN = 3 + IMAGE_LOAD_MIP_PCK = 4 + IMAGE_LOAD_MIP_PCK_SGN = 5 + IMAGE_STORE = 6 + IMAGE_STORE_MIP = 7 + IMAGE_STORE_PCK = 8 + IMAGE_STORE_MIP_PCK = 9 + IMAGE_ATOMIC_SWAP = 10 + IMAGE_ATOMIC_CMPSWAP = 11 + IMAGE_ATOMIC_ADD_UINT = 12 + IMAGE_ATOMIC_SUB_UINT = 13 + IMAGE_ATOMIC_MIN_INT = 14 + IMAGE_ATOMIC_MIN_UINT = 15 + IMAGE_ATOMIC_MAX_INT = 16 + IMAGE_ATOMIC_MAX_UINT = 17 + IMAGE_ATOMIC_AND = 18 + IMAGE_ATOMIC_OR = 19 + IMAGE_ATOMIC_XOR = 20 + IMAGE_ATOMIC_INC_UINT = 21 + IMAGE_ATOMIC_DEC_UINT = 22 + IMAGE_GET_RESINFO = 23 + IMAGE_BVH_INTERSECT_RAY = 25 + IMAGE_BVH64_INTERSECT_RAY = 26 + IMAGE_BVH_DUAL_INTERSECT_RAY = 128 + IMAGE_BVH8_INTERSECT_RAY = 129 + IMAGE_ATOMIC_ADD_FLT = 131 + IMAGE_ATOMIC_MIN_FLT = 132 + IMAGE_ATOMIC_MAX_FLT = 133 + IMAGE_ATOMIC_PK_ADD_F16 = 134 + IMAGE_ATOMIC_PK_ADD_BF16 = 135 + +class VINTERPOp(ReprEnum): + V_INTERP_P10_F32 = 0 + V_INTERP_P2_F32 = 1 + V_INTERP_P10_F16_F32 = 2 + V_INTERP_P2_F16_F32 = 3 + V_INTERP_P10_RTZ_F16_F32 = 4 + V_INTERP_P2_RTZ_F16_F32 = 5 + +class VOP1Op(ReprEnum): + V_NOP_E32 = 0 + V_MOV_B32_E32 = 1 + V_READFIRSTLANE_B32_E32 = 2 + V_CVT_I32_F64_E32 = 3 + V_CVT_F64_I32_E32 = 4 + V_CVT_F32_I32_E32 = 5 + V_CVT_F32_U32_E32 = 6 + V_CVT_U32_F32_E32 = 7 + V_CVT_I32_F32_E32 = 8 + V_CVT_F16_F32_E32 = 10 + V_CVT_F32_F16_E32 = 11 + V_CVT_NEAREST_I32_F32_E32 = 12 + V_CVT_FLOOR_I32_F32_E32 = 13 + V_CVT_OFF_F32_I4_E32 = 14 + V_CVT_F32_F64_E32 = 15 + V_CVT_F64_F32_E32 = 16 + V_CVT_F32_UBYTE0_E32 = 17 + V_CVT_F32_UBYTE1_E32 = 18 + V_CVT_F32_UBYTE2_E32 = 19 + V_CVT_F32_UBYTE3_E32 = 20 + V_CVT_U32_F64_E32 = 21 + V_CVT_F64_U32_E32 = 22 + V_TRUNC_F64_E32 = 23 + V_CEIL_F64_E32 = 24 + V_RNDNE_F64_E32 = 25 + V_FLOOR_F64_E32 = 26 + V_PIPEFLUSH_E32 = 27 + V_MOV_B16_E32 = 28 + V_FRACT_F32_E32 = 32 + V_TRUNC_F32_E32 = 33 + V_CEIL_F32_E32 = 34 + V_RNDNE_F32_E32 = 35 + V_FLOOR_F32_E32 = 36 + V_EXP_F32_E32 = 37 + V_LOG_F32_E32 = 39 + V_RCP_F32_E32 = 42 + V_RCP_IFLAG_F32_E32 = 43 + V_RSQ_F32_E32 = 46 + V_RCP_F64_E32 = 47 + V_RSQ_F64_E32 = 49 + V_SQRT_F32_E32 = 51 + V_SQRT_F64_E32 = 52 + V_SIN_F32_E32 = 53 + V_COS_F32_E32 = 54 + V_NOT_B32_E32 = 55 + V_BFREV_B32_E32 = 56 + V_CLZ_I32_U32_E32 = 57 + V_CTZ_I32_B32_E32 = 58 + V_CLS_I32_E32 = 59 + V_FREXP_EXP_I32_F64_E32 = 60 + V_FREXP_MANT_F64_E32 = 61 + V_FRACT_F64_E32 = 62 + V_FREXP_EXP_I32_F32_E32 = 63 + V_FREXP_MANT_F32_E32 = 64 + V_MOVRELD_B32_E32 = 66 + V_MOVRELS_B32_E32 = 67 + V_MOVRELSD_B32_E32 = 68 + V_MOVRELSD_2_B32_E32 = 72 + V_CVT_F16_U16_E32 = 80 + V_CVT_F16_I16_E32 = 81 + V_CVT_U16_F16_E32 = 82 + V_CVT_I16_F16_E32 = 83 + V_RCP_F16_E32 = 84 + V_SQRT_F16_E32 = 85 + V_RSQ_F16_E32 = 86 + V_LOG_F16_E32 = 87 + V_EXP_F16_E32 = 88 + V_FREXP_MANT_F16_E32 = 89 + V_FREXP_EXP_I16_F16_E32 = 90 + V_FLOOR_F16_E32 = 91 + V_CEIL_F16_E32 = 92 + V_TRUNC_F16_E32 = 93 + V_RNDNE_F16_E32 = 94 + V_FRACT_F16_E32 = 95 + V_SIN_F16_E32 = 96 + V_COS_F16_E32 = 97 + V_SAT_PK_U8_I16_E32 = 98 + V_CVT_NORM_I16_F16_E32 = 99 + V_CVT_NORM_U16_F16_E32 = 100 + V_SWAP_B32_E32 = 101 + V_SWAP_B16_E32 = 102 + V_PERMLANE64_B32_E32 = 103 + V_SWAPREL_B32_E32 = 104 + V_NOT_B16_E32 = 105 + V_CVT_I32_I16_E32 = 106 + V_CVT_U32_U16_E32 = 107 + V_CVT_F32_FP8_E32 = 108 + V_CVT_F32_BF8_E32 = 109 + V_CVT_PK_F32_FP8_E32 = 110 + V_CVT_PK_F32_BF8_E32 = 111 + V_NOP = V_NOP_E32 + V_MOV_B32 = V_MOV_B32_E32 + V_READFIRSTLANE_B32 = V_READFIRSTLANE_B32_E32 + V_CVT_I32_F64 = V_CVT_I32_F64_E32 + V_CVT_F64_I32 = V_CVT_F64_I32_E32 + V_CVT_F32_I32 = V_CVT_F32_I32_E32 + V_CVT_F32_U32 = V_CVT_F32_U32_E32 + V_CVT_U32_F32 = V_CVT_U32_F32_E32 + V_CVT_I32_F32 = V_CVT_I32_F32_E32 + V_CVT_F16_F32 = V_CVT_F16_F32_E32 + V_CVT_F32_F16 = V_CVT_F32_F16_E32 + V_CVT_NEAREST_I32_F32 = V_CVT_NEAREST_I32_F32_E32 + V_CVT_FLOOR_I32_F32 = V_CVT_FLOOR_I32_F32_E32 + V_CVT_OFF_F32_I4 = V_CVT_OFF_F32_I4_E32 + V_CVT_F32_F64 = V_CVT_F32_F64_E32 + V_CVT_F64_F32 = V_CVT_F64_F32_E32 + V_CVT_F32_UBYTE0 = V_CVT_F32_UBYTE0_E32 + V_CVT_F32_UBYTE1 = V_CVT_F32_UBYTE1_E32 + V_CVT_F32_UBYTE2 = V_CVT_F32_UBYTE2_E32 + V_CVT_F32_UBYTE3 = V_CVT_F32_UBYTE3_E32 + V_CVT_U32_F64 = V_CVT_U32_F64_E32 + V_CVT_F64_U32 = V_CVT_F64_U32_E32 + V_TRUNC_F64 = V_TRUNC_F64_E32 + V_CEIL_F64 = V_CEIL_F64_E32 + V_RNDNE_F64 = V_RNDNE_F64_E32 + V_FLOOR_F64 = V_FLOOR_F64_E32 + V_PIPEFLUSH = V_PIPEFLUSH_E32 + V_MOV_B16 = V_MOV_B16_E32 + V_FRACT_F32 = V_FRACT_F32_E32 + V_TRUNC_F32 = V_TRUNC_F32_E32 + V_CEIL_F32 = V_CEIL_F32_E32 + V_RNDNE_F32 = V_RNDNE_F32_E32 + V_FLOOR_F32 = V_FLOOR_F32_E32 + V_EXP_F32 = V_EXP_F32_E32 + V_LOG_F32 = V_LOG_F32_E32 + V_RCP_F32 = V_RCP_F32_E32 + V_RCP_IFLAG_F32 = V_RCP_IFLAG_F32_E32 + V_RSQ_F32 = V_RSQ_F32_E32 + V_RCP_F64 = V_RCP_F64_E32 + V_RSQ_F64 = V_RSQ_F64_E32 + V_SQRT_F32 = V_SQRT_F32_E32 + V_SQRT_F64 = V_SQRT_F64_E32 + V_SIN_F32 = V_SIN_F32_E32 + V_COS_F32 = V_COS_F32_E32 + V_NOT_B32 = V_NOT_B32_E32 + V_BFREV_B32 = V_BFREV_B32_E32 + V_CLZ_I32_U32 = V_CLZ_I32_U32_E32 + V_CTZ_I32_B32 = V_CTZ_I32_B32_E32 + V_CLS_I32 = V_CLS_I32_E32 + V_FREXP_EXP_I32_F64 = V_FREXP_EXP_I32_F64_E32 + V_FREXP_MANT_F64 = V_FREXP_MANT_F64_E32 + V_FRACT_F64 = V_FRACT_F64_E32 + V_FREXP_EXP_I32_F32 = V_FREXP_EXP_I32_F32_E32 + V_FREXP_MANT_F32 = V_FREXP_MANT_F32_E32 + V_MOVRELD_B32 = V_MOVRELD_B32_E32 + V_MOVRELS_B32 = V_MOVRELS_B32_E32 + V_MOVRELSD_B32 = V_MOVRELSD_B32_E32 + V_MOVRELSD_2_B32 = V_MOVRELSD_2_B32_E32 + V_CVT_F16_U16 = V_CVT_F16_U16_E32 + V_CVT_F16_I16 = V_CVT_F16_I16_E32 + V_CVT_U16_F16 = V_CVT_U16_F16_E32 + V_CVT_I16_F16 = V_CVT_I16_F16_E32 + V_RCP_F16 = V_RCP_F16_E32 + V_SQRT_F16 = V_SQRT_F16_E32 + V_RSQ_F16 = V_RSQ_F16_E32 + V_LOG_F16 = V_LOG_F16_E32 + V_EXP_F16 = V_EXP_F16_E32 + V_FREXP_MANT_F16 = V_FREXP_MANT_F16_E32 + V_FREXP_EXP_I16_F16 = V_FREXP_EXP_I16_F16_E32 + V_FLOOR_F16 = V_FLOOR_F16_E32 + V_CEIL_F16 = V_CEIL_F16_E32 + V_TRUNC_F16 = V_TRUNC_F16_E32 + V_RNDNE_F16 = V_RNDNE_F16_E32 + V_FRACT_F16 = V_FRACT_F16_E32 + V_SIN_F16 = V_SIN_F16_E32 + V_COS_F16 = V_COS_F16_E32 + V_SAT_PK_U8_I16 = V_SAT_PK_U8_I16_E32 + V_CVT_NORM_I16_F16 = V_CVT_NORM_I16_F16_E32 + V_CVT_NORM_U16_F16 = V_CVT_NORM_U16_F16_E32 + V_SWAP_B32 = V_SWAP_B32_E32 + V_SWAP_B16 = V_SWAP_B16_E32 + V_PERMLANE64_B32 = V_PERMLANE64_B32_E32 + V_SWAPREL_B32 = V_SWAPREL_B32_E32 + V_NOT_B16 = V_NOT_B16_E32 + V_CVT_I32_I16 = V_CVT_I32_I16_E32 + V_CVT_U32_U16 = V_CVT_U32_U16_E32 + V_CVT_F32_FP8 = V_CVT_F32_FP8_E32 + V_CVT_F32_BF8 = V_CVT_F32_BF8_E32 + V_CVT_PK_F32_FP8 = V_CVT_PK_F32_FP8_E32 + V_CVT_PK_F32_BF8 = V_CVT_PK_F32_BF8_E32 + +class VOP2Op(ReprEnum): + V_CNDMASK_B32_E32 = 1 + V_ADD_F64_E32 = 2 + V_ADD_F32_E32 = 3 + V_SUB_F32_E32 = 4 + V_SUBREV_F32_E32 = 5 + V_MUL_F64_E32 = 6 + V_MUL_DX9_ZERO_F32_E32 = 7 + V_MUL_F32_E32 = 8 + V_MUL_I32_I24_E32 = 9 + V_MUL_HI_I32_I24_E32 = 10 + V_MUL_U32_U24_E32 = 11 + V_MUL_HI_U32_U24_E32 = 12 + V_MIN_NUM_F64_E32 = 13 + V_MAX_NUM_F64_E32 = 14 + V_MIN_I32_E32 = 17 + V_MAX_I32_E32 = 18 + V_MIN_U32_E32 = 19 + V_MAX_U32_E32 = 20 + V_MIN_NUM_F32_E32 = 21 + V_MAX_NUM_F32_E32 = 22 + V_LSHLREV_B32_E32 = 24 + V_LSHRREV_B32_E32 = 25 + V_ASHRREV_I32_E32 = 26 + V_AND_B32_E32 = 27 + V_OR_B32_E32 = 28 + V_XOR_B32_E32 = 29 + V_XNOR_B32_E32 = 30 + V_LSHLREV_B64_E32 = 31 + V_ADD_CO_CI_U32_E32 = 32 + V_SUB_CO_CI_U32_E32 = 33 + V_SUBREV_CO_CI_U32_E32 = 34 + V_ADD_NC_U32_E32 = 37 + V_SUB_NC_U32_E32 = 38 + V_SUBREV_NC_U32_E32 = 39 + V_FMAC_F32_E32 = 43 + V_FMAMK_F32_E32 = 44 + V_FMAAK_F32_E32 = 45 + V_CVT_PK_RTZ_F16_F32_E32 = 47 + V_MIN_NUM_F16_E32 = 48 + V_MAX_NUM_F16_E32 = 49 + V_ADD_F16_E32 = 50 + V_SUB_F16_E32 = 51 + V_SUBREV_F16_E32 = 52 + V_MUL_F16_E32 = 53 + V_FMAC_F16_E32 = 54 + V_FMAMK_F16_E32 = 55 + V_FMAAK_F16_E32 = 56 + V_LDEXP_F16_E32 = 59 + V_PK_FMAC_F16_E32 = 60 + V_CNDMASK_B32 = V_CNDMASK_B32_E32 + V_ADD_F64 = V_ADD_F64_E32 + V_ADD_F32 = V_ADD_F32_E32 + V_SUB_F32 = V_SUB_F32_E32 + V_SUBREV_F32 = V_SUBREV_F32_E32 + V_MUL_F64 = V_MUL_F64_E32 + V_MUL_DX9_ZERO_F32 = V_MUL_DX9_ZERO_F32_E32 + V_MUL_F32 = V_MUL_F32_E32 + V_MUL_I32_I24 = V_MUL_I32_I24_E32 + V_MUL_HI_I32_I24 = V_MUL_HI_I32_I24_E32 + V_MUL_U32_U24 = V_MUL_U32_U24_E32 + V_MUL_HI_U32_U24 = V_MUL_HI_U32_U24_E32 + V_MIN_NUM_F64 = V_MIN_NUM_F64_E32 + V_MAX_NUM_F64 = V_MAX_NUM_F64_E32 + V_MIN_I32 = V_MIN_I32_E32 + V_MAX_I32 = V_MAX_I32_E32 + V_MIN_U32 = V_MIN_U32_E32 + V_MAX_U32 = V_MAX_U32_E32 + V_MIN_NUM_F32 = V_MIN_NUM_F32_E32 + V_MAX_NUM_F32 = V_MAX_NUM_F32_E32 + V_LSHLREV_B32 = V_LSHLREV_B32_E32 + V_LSHRREV_B32 = V_LSHRREV_B32_E32 + V_ASHRREV_I32 = V_ASHRREV_I32_E32 + V_AND_B32 = V_AND_B32_E32 + V_OR_B32 = V_OR_B32_E32 + V_XOR_B32 = V_XOR_B32_E32 + V_XNOR_B32 = V_XNOR_B32_E32 + V_LSHLREV_B64 = V_LSHLREV_B64_E32 + V_ADD_CO_CI_U32 = V_ADD_CO_CI_U32_E32 + V_SUB_CO_CI_U32 = V_SUB_CO_CI_U32_E32 + V_SUBREV_CO_CI_U32 = V_SUBREV_CO_CI_U32_E32 + V_ADD_NC_U32 = V_ADD_NC_U32_E32 + V_SUB_NC_U32 = V_SUB_NC_U32_E32 + V_SUBREV_NC_U32 = V_SUBREV_NC_U32_E32 + V_FMAC_F32 = V_FMAC_F32_E32 + V_FMAMK_F32 = V_FMAMK_F32_E32 + V_FMAAK_F32 = V_FMAAK_F32_E32 + V_CVT_PK_RTZ_F16_F32 = V_CVT_PK_RTZ_F16_F32_E32 + V_MIN_NUM_F16 = V_MIN_NUM_F16_E32 + V_MAX_NUM_F16 = V_MAX_NUM_F16_E32 + V_ADD_F16 = V_ADD_F16_E32 + V_SUB_F16 = V_SUB_F16_E32 + V_SUBREV_F16 = V_SUBREV_F16_E32 + V_MUL_F16 = V_MUL_F16_E32 + V_FMAC_F16 = V_FMAC_F16_E32 + V_FMAMK_F16 = V_FMAMK_F16_E32 + V_FMAAK_F16 = V_FMAAK_F16_E32 + V_LDEXP_F16 = V_LDEXP_F16_E32 + V_PK_FMAC_F16 = V_PK_FMAC_F16_E32 + +class VOP3Op(ReprEnum): + V_CMP_LT_F16_E64 = 1 + V_CMP_EQ_F16_E64 = 2 + V_CMP_LE_F16_E64 = 3 + V_CMP_GT_F16_E64 = 4 + V_CMP_LG_F16_E64 = 5 + V_CMP_GE_F16_E64 = 6 + V_CMP_O_F16_E64 = 7 + V_CMP_U_F16_E64 = 8 + V_CMP_NGE_F16_E64 = 9 + V_CMP_NLG_F16_E64 = 10 + V_CMP_NGT_F16_E64 = 11 + V_CMP_NLE_F16_E64 = 12 + V_CMP_NEQ_F16_E64 = 13 + V_CMP_NLT_F16_E64 = 14 + V_CMP_LT_F32_E64 = 17 + V_CMP_EQ_F32_E64 = 18 + V_CMP_LE_F32_E64 = 19 + V_CMP_GT_F32_E64 = 20 + V_CMP_LG_F32_E64 = 21 + V_CMP_GE_F32_E64 = 22 + V_CMP_O_F32_E64 = 23 + V_CMP_U_F32_E64 = 24 + V_CMP_NGE_F32_E64 = 25 + V_CMP_NLG_F32_E64 = 26 + V_CMP_NGT_F32_E64 = 27 + V_CMP_NLE_F32_E64 = 28 + V_CMP_NEQ_F32_E64 = 29 + V_CMP_NLT_F32_E64 = 30 + V_CMP_LT_F64_E64 = 33 + V_CMP_EQ_F64_E64 = 34 + V_CMP_LE_F64_E64 = 35 + V_CMP_GT_F64_E64 = 36 + V_CMP_LG_F64_E64 = 37 + V_CMP_GE_F64_E64 = 38 + V_CMP_O_F64_E64 = 39 + V_CMP_U_F64_E64 = 40 + V_CMP_NGE_F64_E64 = 41 + V_CMP_NLG_F64_E64 = 42 + V_CMP_NGT_F64_E64 = 43 + V_CMP_NLE_F64_E64 = 44 + V_CMP_NEQ_F64_E64 = 45 + V_CMP_NLT_F64_E64 = 46 + V_CMP_LT_I16_E64 = 49 + V_CMP_EQ_I16_E64 = 50 + V_CMP_LE_I16_E64 = 51 + V_CMP_GT_I16_E64 = 52 + V_CMP_NE_I16_E64 = 53 + V_CMP_GE_I16_E64 = 54 + V_CMP_LT_U16_E64 = 57 + V_CMP_EQ_U16_E64 = 58 + V_CMP_LE_U16_E64 = 59 + V_CMP_GT_U16_E64 = 60 + V_CMP_NE_U16_E64 = 61 + V_CMP_GE_U16_E64 = 62 + V_CMP_LT_I32_E64 = 65 + V_CMP_EQ_I32_E64 = 66 + V_CMP_LE_I32_E64 = 67 + V_CMP_GT_I32_E64 = 68 + V_CMP_NE_I32_E64 = 69 + V_CMP_GE_I32_E64 = 70 + V_CMP_LT_U32_E64 = 73 + V_CMP_EQ_U32_E64 = 74 + V_CMP_LE_U32_E64 = 75 + V_CMP_GT_U32_E64 = 76 + V_CMP_NE_U32_E64 = 77 + V_CMP_GE_U32_E64 = 78 + V_CMP_LT_I64_E64 = 81 + V_CMP_EQ_I64_E64 = 82 + V_CMP_LE_I64_E64 = 83 + V_CMP_GT_I64_E64 = 84 + V_CMP_NE_I64_E64 = 85 + V_CMP_GE_I64_E64 = 86 + V_CMP_LT_U64_E64 = 89 + V_CMP_EQ_U64_E64 = 90 + V_CMP_LE_U64_E64 = 91 + V_CMP_GT_U64_E64 = 92 + V_CMP_NE_U64_E64 = 93 + V_CMP_GE_U64_E64 = 94 + V_CMP_CLASS_F16_E64 = 125 + V_CMP_CLASS_F32_E64 = 126 + V_CMP_CLASS_F64_E64 = 127 + V_CMPX_LT_F16_E64 = 129 + V_CMPX_EQ_F16_E64 = 130 + V_CMPX_LE_F16_E64 = 131 + V_CMPX_GT_F16_E64 = 132 + V_CMPX_LG_F16_E64 = 133 + V_CMPX_GE_F16_E64 = 134 + V_CMPX_O_F16_E64 = 135 + V_CMPX_U_F16_E64 = 136 + V_CMPX_NGE_F16_E64 = 137 + V_CMPX_NLG_F16_E64 = 138 + V_CMPX_NGT_F16_E64 = 139 + V_CMPX_NLE_F16_E64 = 140 + V_CMPX_NEQ_F16_E64 = 141 + V_CMPX_NLT_F16_E64 = 142 + V_CMPX_LT_F32_E64 = 145 + V_CMPX_EQ_F32_E64 = 146 + V_CMPX_LE_F32_E64 = 147 + V_CMPX_GT_F32_E64 = 148 + V_CMPX_LG_F32_E64 = 149 + V_CMPX_GE_F32_E64 = 150 + V_CMPX_O_F32_E64 = 151 + V_CMPX_U_F32_E64 = 152 + V_CMPX_NGE_F32_E64 = 153 + V_CMPX_NLG_F32_E64 = 154 + V_CMPX_NGT_F32_E64 = 155 + V_CMPX_NLE_F32_E64 = 156 + V_CMPX_NEQ_F32_E64 = 157 + V_CMPX_NLT_F32_E64 = 158 + V_CMPX_LT_F64_E64 = 161 + V_CMPX_EQ_F64_E64 = 162 + V_CMPX_LE_F64_E64 = 163 + V_CMPX_GT_F64_E64 = 164 + V_CMPX_LG_F64_E64 = 165 + V_CMPX_GE_F64_E64 = 166 + V_CMPX_O_F64_E64 = 167 + V_CMPX_U_F64_E64 = 168 + V_CMPX_NGE_F64_E64 = 169 + V_CMPX_NLG_F64_E64 = 170 + V_CMPX_NGT_F64_E64 = 171 + V_CMPX_NLE_F64_E64 = 172 + V_CMPX_NEQ_F64_E64 = 173 + V_CMPX_NLT_F64_E64 = 174 + V_CMPX_LT_I16_E64 = 177 + V_CMPX_EQ_I16_E64 = 178 + V_CMPX_LE_I16_E64 = 179 + V_CMPX_GT_I16_E64 = 180 + V_CMPX_NE_I16_E64 = 181 + V_CMPX_GE_I16_E64 = 182 + V_CMPX_LT_U16_E64 = 185 + V_CMPX_EQ_U16_E64 = 186 + V_CMPX_LE_U16_E64 = 187 + V_CMPX_GT_U16_E64 = 188 + V_CMPX_NE_U16_E64 = 189 + V_CMPX_GE_U16_E64 = 190 + V_CMPX_LT_I32_E64 = 193 + V_CMPX_EQ_I32_E64 = 194 + V_CMPX_LE_I32_E64 = 195 + V_CMPX_GT_I32_E64 = 196 + V_CMPX_NE_I32_E64 = 197 + V_CMPX_GE_I32_E64 = 198 + V_CMPX_LT_U32_E64 = 201 + V_CMPX_EQ_U32_E64 = 202 + V_CMPX_LE_U32_E64 = 203 + V_CMPX_GT_U32_E64 = 204 + V_CMPX_NE_U32_E64 = 205 + V_CMPX_GE_U32_E64 = 206 + V_CMPX_LT_I64_E64 = 209 + V_CMPX_EQ_I64_E64 = 210 + V_CMPX_LE_I64_E64 = 211 + V_CMPX_GT_I64_E64 = 212 + V_CMPX_NE_I64_E64 = 213 + V_CMPX_GE_I64_E64 = 214 + V_CMPX_LT_U64_E64 = 217 + V_CMPX_EQ_U64_E64 = 218 + V_CMPX_LE_U64_E64 = 219 + V_CMPX_GT_U64_E64 = 220 + V_CMPX_NE_U64_E64 = 221 + V_CMPX_GE_U64_E64 = 222 + V_CMPX_CLASS_F16_E64 = 253 + V_CMPX_CLASS_F32_E64 = 254 + V_CMPX_CLASS_F64_E64 = 255 + V_CNDMASK_B32_E64 = 257 + V_ADD_F64_E64 = 258 + V_ADD_F32_E64 = 259 + V_SUB_F32_E64 = 260 + V_SUBREV_F32_E64 = 261 + V_MUL_F64_E64 = 262 + V_MUL_DX9_ZERO_F32_E64 = 263 + V_MUL_F32_E64 = 264 + V_MUL_I32_I24_E64 = 265 + V_MUL_HI_I32_I24_E64 = 266 + V_MUL_U32_U24_E64 = 267 + V_MUL_HI_U32_U24_E64 = 268 + V_MIN_NUM_F64_E64 = 269 + V_MAX_NUM_F64_E64 = 270 + V_MIN_I32_E64 = 273 + V_MAX_I32_E64 = 274 + V_MIN_U32_E64 = 275 + V_MAX_U32_E64 = 276 + V_MIN_NUM_F32_E64 = 277 + V_MAX_NUM_F32_E64 = 278 + V_LSHLREV_B32_E64 = 280 + V_LSHRREV_B32_E64 = 281 + V_ASHRREV_I32_E64 = 282 + V_AND_B32_E64 = 283 + V_OR_B32_E64 = 284 + V_XOR_B32_E64 = 285 + V_XNOR_B32_E64 = 286 + V_LSHLREV_B64_E64 = 287 + V_ADD_NC_U32_E64 = 293 + V_SUB_NC_U32_E64 = 294 + V_SUBREV_NC_U32_E64 = 295 + V_FMAC_F32_E64 = 299 + V_CVT_PK_RTZ_F16_F32_E64 = 303 + V_MIN_NUM_F16_E64 = 304 + V_MAX_NUM_F16_E64 = 305 + V_ADD_F16_E64 = 306 + V_SUB_F16_E64 = 307 + V_SUBREV_F16_E64 = 308 + V_MUL_F16_E64 = 309 + V_FMAC_F16_E64 = 310 + V_LDEXP_F16_E64 = 315 + V_NOP_E64 = 384 + V_MOV_B32_E64 = 385 + V_READFIRSTLANE_B32_E64 = 386 + V_CVT_I32_F64_E64 = 387 + V_CVT_F64_I32_E64 = 388 + V_CVT_F32_I32_E64 = 389 + V_CVT_F32_U32_E64 = 390 + V_CVT_U32_F32_E64 = 391 + V_CVT_I32_F32_E64 = 392 + V_CVT_F16_F32_E64 = 394 + V_CVT_F32_F16_E64 = 395 + V_CVT_NEAREST_I32_F32_E64 = 396 + V_CVT_FLOOR_I32_F32_E64 = 397 + V_CVT_OFF_F32_I4_E64 = 398 + V_CVT_F32_F64_E64 = 399 + V_CVT_F64_F32_E64 = 400 + V_CVT_F32_UBYTE0_E64 = 401 + V_CVT_F32_UBYTE1_E64 = 402 + V_CVT_F32_UBYTE2_E64 = 403 + V_CVT_F32_UBYTE3_E64 = 404 + V_CVT_U32_F64_E64 = 405 + V_CVT_F64_U32_E64 = 406 + V_TRUNC_F64_E64 = 407 + V_CEIL_F64_E64 = 408 + V_RNDNE_F64_E64 = 409 + V_FLOOR_F64_E64 = 410 + V_PIPEFLUSH_E64 = 411 + V_MOV_B16_E64 = 412 + V_FRACT_F32_E64 = 416 + V_TRUNC_F32_E64 = 417 + V_CEIL_F32_E64 = 418 + V_RNDNE_F32_E64 = 419 + V_FLOOR_F32_E64 = 420 + V_EXP_F32_E64 = 421 + V_LOG_F32_E64 = 423 + V_RCP_F32_E64 = 426 + V_RCP_IFLAG_F32_E64 = 427 + V_RSQ_F32_E64 = 430 + V_RCP_F64_E64 = 431 + V_RSQ_F64_E64 = 433 + V_SQRT_F32_E64 = 435 + V_SQRT_F64_E64 = 436 + V_SIN_F32_E64 = 437 + V_COS_F32_E64 = 438 + V_NOT_B32_E64 = 439 + V_BFREV_B32_E64 = 440 + V_CLZ_I32_U32_E64 = 441 + V_CTZ_I32_B32_E64 = 442 + V_CLS_I32_E64 = 443 + V_FREXP_EXP_I32_F64_E64 = 444 + V_FREXP_MANT_F64_E64 = 445 + V_FRACT_F64_E64 = 446 + V_FREXP_EXP_I32_F32_E64 = 447 + V_FREXP_MANT_F32_E64 = 448 + V_MOVRELD_B32_E64 = 450 + V_MOVRELS_B32_E64 = 451 + V_MOVRELSD_B32_E64 = 452 + V_MOVRELSD_2_B32_E64 = 456 + V_CVT_F16_U16_E64 = 464 + V_CVT_F16_I16_E64 = 465 + V_CVT_U16_F16_E64 = 466 + V_CVT_I16_F16_E64 = 467 + V_RCP_F16_E64 = 468 + V_SQRT_F16_E64 = 469 + V_RSQ_F16_E64 = 470 + V_LOG_F16_E64 = 471 + V_EXP_F16_E64 = 472 + V_FREXP_MANT_F16_E64 = 473 + V_FREXP_EXP_I16_F16_E64 = 474 + V_FLOOR_F16_E64 = 475 + V_CEIL_F16_E64 = 476 + V_TRUNC_F16_E64 = 477 + V_RNDNE_F16_E64 = 478 + V_FRACT_F16_E64 = 479 + V_SIN_F16_E64 = 480 + V_COS_F16_E64 = 481 + V_SAT_PK_U8_I16_E64 = 482 + V_CVT_NORM_I16_F16_E64 = 483 + V_CVT_NORM_U16_F16_E64 = 484 + V_NOT_B16_E64 = 489 + V_CVT_I32_I16_E64 = 490 + V_CVT_U32_U16_E64 = 491 + V_CVT_F32_FP8_E64 = 492 + V_CVT_F32_BF8_E64 = 493 + V_CVT_PK_F32_FP8_E64 = 494 + V_CVT_PK_F32_BF8_E64 = 495 + V_FMA_DX9_ZERO_F32 = 521 + V_MAD_I32_I24 = 522 + V_MAD_U32_U24 = 523 + V_CUBEID_F32 = 524 + V_CUBESC_F32 = 525 + V_CUBETC_F32 = 526 + V_CUBEMA_F32 = 527 + V_BFE_U32 = 528 + V_BFE_I32 = 529 + V_BFI_B32 = 530 + V_FMA_F32 = 531 + V_FMA_F64 = 532 + V_LERP_U8 = 533 + V_ALIGNBIT_B32 = 534 + V_ALIGNBYTE_B32 = 535 + V_MULLIT_F32 = 536 + V_MIN3_I32 = 538 + V_MIN3_U32 = 539 + V_MAX3_I32 = 541 + V_MAX3_U32 = 542 + V_MED3_I32 = 544 + V_MED3_U32 = 545 + V_SAD_U8 = 546 + V_SAD_HI_U8 = 547 + V_SAD_U16 = 548 + V_SAD_U32 = 549 + V_CVT_PK_U8_F32 = 550 + V_DIV_FIXUP_F32 = 551 + V_DIV_FIXUP_F64 = 552 + V_MIN3_NUM_F32 = 553 + V_MAX3_NUM_F32 = 554 + V_MIN3_NUM_F16 = 555 + V_MAX3_NUM_F16 = 556 + V_MINIMUM3_F32 = 557 + V_MAXIMUM3_F32 = 558 + V_MINIMUM3_F16 = 559 + V_MAXIMUM3_F16 = 560 + V_MED3_NUM_F32 = 561 + V_MED3_NUM_F16 = 562 + V_DIV_FMAS_F32 = 567 + V_DIV_FMAS_F64 = 568 + V_MSAD_U8 = 569 + V_QSAD_PK_U16_U8 = 570 + V_MQSAD_PK_U16_U8 = 571 + V_MQSAD_U32_U8 = 573 + V_XOR3_B32 = 576 + V_MAD_U16 = 577 + V_PERM_B32 = 580 + V_XAD_U32 = 581 + V_LSHL_ADD_U32 = 582 + V_ADD_LSHL_U32 = 583 + V_FMA_F16 = 584 + V_MIN3_I16 = 586 + V_MIN3_U16 = 587 + V_MAX3_I16 = 589 + V_MAX3_U16 = 590 + V_MED3_I16 = 592 + V_MED3_U16 = 593 + V_MAD_I16 = 595 + V_DIV_FIXUP_F16 = 596 + V_ADD3_U32 = 597 + V_LSHL_OR_B32 = 598 + V_AND_OR_B32 = 599 + V_OR3_B32 = 600 + V_MAD_U32_U16 = 601 + V_MAD_I32_I16 = 602 + V_PERMLANE16_B32 = 603 + V_PERMLANEX16_B32 = 604 + V_CNDMASK_B16 = 605 + V_MAXMIN_U32 = 610 + V_MINMAX_U32 = 611 + V_MAXMIN_I32 = 612 + V_MINMAX_I32 = 613 + V_DOT2_F16_F16 = 614 + V_DOT2_BF16_BF16 = 615 + V_MINMAX_NUM_F32 = 616 + V_MAXMIN_NUM_F32 = 617 + V_MINMAX_NUM_F16 = 618 + V_MAXMIN_NUM_F16 = 619 + V_MINIMUMMAXIMUM_F32 = 620 + V_MAXIMUMMINIMUM_F32 = 621 + V_MINIMUMMAXIMUM_F16 = 622 + V_MAXIMUMMINIMUM_F16 = 623 + V_S_EXP_F32 = 640 + V_S_EXP_F16 = 641 + V_S_LOG_F32 = 642 + V_S_LOG_F16 = 643 + V_S_RCP_F32 = 644 + V_S_RCP_F16 = 645 + V_S_RSQ_F32 = 646 + V_S_RSQ_F16 = 647 + V_S_SQRT_F32 = 648 + V_S_SQRT_F16 = 649 + V_ADD_NC_U16 = 771 + V_SUB_NC_U16 = 772 + V_MUL_LO_U16 = 773 + V_CVT_PK_I16_F32 = 774 + V_CVT_PK_U16_F32 = 775 + V_MAX_U16 = 777 + V_MAX_I16 = 778 + V_MIN_U16 = 779 + V_MIN_I16 = 780 + V_ADD_NC_I16 = 781 + V_SUB_NC_I16 = 782 + V_PERMLANE16_VAR_B32 = 783 + V_PERMLANEX16_VAR_B32 = 784 + V_PACK_B32_F16 = 785 + V_CVT_PK_NORM_I16_F16 = 786 + V_CVT_PK_NORM_U16_F16 = 787 + V_LDEXP_F32 = 796 + V_BFM_B32 = 797 + V_BCNT_U32_B32 = 798 + V_MBCNT_LO_U32_B32 = 799 + V_MBCNT_HI_U32_B32 = 800 + V_CVT_PK_NORM_I16_F32 = 801 + V_CVT_PK_NORM_U16_F32 = 802 + V_CVT_PK_U16_U32 = 803 + V_CVT_PK_I16_I32 = 804 + V_SUB_NC_I32 = 805 + V_ADD_NC_I32 = 806 + V_LDEXP_F64 = 811 + V_MUL_LO_U32 = 812 + V_MUL_HI_U32 = 813 + V_MUL_HI_I32 = 814 + V_TRIG_PREOP_F64 = 815 + V_LSHLREV_B16 = 824 + V_LSHRREV_B16 = 825 + V_ASHRREV_I16 = 826 + V_LSHRREV_B64 = 829 + V_ASHRREV_I64 = 830 + V_MINIMUM_F64 = 833 + V_MAXIMUM_F64 = 834 + V_READLANE_B32 = 864 + V_WRITELANE_B32 = 865 + V_AND_B16 = 866 + V_OR_B16 = 867 + V_XOR_B16 = 868 + V_MINIMUM_F32 = 869 + V_MAXIMUM_F32 = 870 + V_MINIMUM_F16 = 871 + V_MAXIMUM_F16 = 872 + V_CVT_PK_FP8_F32 = 873 + V_CVT_PK_BF8_F32 = 874 + V_CVT_SR_FP8_F32 = 875 + V_CVT_SR_BF8_F32 = 876 + V_CMP_LT_F16 = V_CMP_LT_F16_E64 + V_CMP_EQ_F16 = V_CMP_EQ_F16_E64 + V_CMP_LE_F16 = V_CMP_LE_F16_E64 + V_CMP_GT_F16 = V_CMP_GT_F16_E64 + V_CMP_LG_F16 = V_CMP_LG_F16_E64 + V_CMP_GE_F16 = V_CMP_GE_F16_E64 + V_CMP_O_F16 = V_CMP_O_F16_E64 + V_CMP_U_F16 = V_CMP_U_F16_E64 + V_CMP_NGE_F16 = V_CMP_NGE_F16_E64 + V_CMP_NLG_F16 = V_CMP_NLG_F16_E64 + V_CMP_NGT_F16 = V_CMP_NGT_F16_E64 + V_CMP_NLE_F16 = V_CMP_NLE_F16_E64 + V_CMP_NEQ_F16 = V_CMP_NEQ_F16_E64 + V_CMP_NLT_F16 = V_CMP_NLT_F16_E64 + V_CMP_LT_F32 = V_CMP_LT_F32_E64 + V_CMP_EQ_F32 = V_CMP_EQ_F32_E64 + V_CMP_LE_F32 = V_CMP_LE_F32_E64 + V_CMP_GT_F32 = V_CMP_GT_F32_E64 + V_CMP_LG_F32 = V_CMP_LG_F32_E64 + V_CMP_GE_F32 = V_CMP_GE_F32_E64 + V_CMP_O_F32 = V_CMP_O_F32_E64 + V_CMP_U_F32 = V_CMP_U_F32_E64 + V_CMP_NGE_F32 = V_CMP_NGE_F32_E64 + V_CMP_NLG_F32 = V_CMP_NLG_F32_E64 + V_CMP_NGT_F32 = V_CMP_NGT_F32_E64 + V_CMP_NLE_F32 = V_CMP_NLE_F32_E64 + V_CMP_NEQ_F32 = V_CMP_NEQ_F32_E64 + V_CMP_NLT_F32 = V_CMP_NLT_F32_E64 + V_CMP_LT_F64 = V_CMP_LT_F64_E64 + V_CMP_EQ_F64 = V_CMP_EQ_F64_E64 + V_CMP_LE_F64 = V_CMP_LE_F64_E64 + V_CMP_GT_F64 = V_CMP_GT_F64_E64 + V_CMP_LG_F64 = V_CMP_LG_F64_E64 + V_CMP_GE_F64 = V_CMP_GE_F64_E64 + V_CMP_O_F64 = V_CMP_O_F64_E64 + V_CMP_U_F64 = V_CMP_U_F64_E64 + V_CMP_NGE_F64 = V_CMP_NGE_F64_E64 + V_CMP_NLG_F64 = V_CMP_NLG_F64_E64 + V_CMP_NGT_F64 = V_CMP_NGT_F64_E64 + V_CMP_NLE_F64 = V_CMP_NLE_F64_E64 + V_CMP_NEQ_F64 = V_CMP_NEQ_F64_E64 + V_CMP_NLT_F64 = V_CMP_NLT_F64_E64 + V_CMP_LT_I16 = V_CMP_LT_I16_E64 + V_CMP_EQ_I16 = V_CMP_EQ_I16_E64 + V_CMP_LE_I16 = V_CMP_LE_I16_E64 + V_CMP_GT_I16 = V_CMP_GT_I16_E64 + V_CMP_NE_I16 = V_CMP_NE_I16_E64 + V_CMP_GE_I16 = V_CMP_GE_I16_E64 + V_CMP_LT_U16 = V_CMP_LT_U16_E64 + V_CMP_EQ_U16 = V_CMP_EQ_U16_E64 + V_CMP_LE_U16 = V_CMP_LE_U16_E64 + V_CMP_GT_U16 = V_CMP_GT_U16_E64 + V_CMP_NE_U16 = V_CMP_NE_U16_E64 + V_CMP_GE_U16 = V_CMP_GE_U16_E64 + V_CMP_LT_I32 = V_CMP_LT_I32_E64 + V_CMP_EQ_I32 = V_CMP_EQ_I32_E64 + V_CMP_LE_I32 = V_CMP_LE_I32_E64 + V_CMP_GT_I32 = V_CMP_GT_I32_E64 + V_CMP_NE_I32 = V_CMP_NE_I32_E64 + V_CMP_GE_I32 = V_CMP_GE_I32_E64 + V_CMP_LT_U32 = V_CMP_LT_U32_E64 + V_CMP_EQ_U32 = V_CMP_EQ_U32_E64 + V_CMP_LE_U32 = V_CMP_LE_U32_E64 + V_CMP_GT_U32 = V_CMP_GT_U32_E64 + V_CMP_NE_U32 = V_CMP_NE_U32_E64 + V_CMP_GE_U32 = V_CMP_GE_U32_E64 + V_CMP_LT_I64 = V_CMP_LT_I64_E64 + V_CMP_EQ_I64 = V_CMP_EQ_I64_E64 + V_CMP_LE_I64 = V_CMP_LE_I64_E64 + V_CMP_GT_I64 = V_CMP_GT_I64_E64 + V_CMP_NE_I64 = V_CMP_NE_I64_E64 + V_CMP_GE_I64 = V_CMP_GE_I64_E64 + V_CMP_LT_U64 = V_CMP_LT_U64_E64 + V_CMP_EQ_U64 = V_CMP_EQ_U64_E64 + V_CMP_LE_U64 = V_CMP_LE_U64_E64 + V_CMP_GT_U64 = V_CMP_GT_U64_E64 + V_CMP_NE_U64 = V_CMP_NE_U64_E64 + V_CMP_GE_U64 = V_CMP_GE_U64_E64 + V_CMP_CLASS_F16 = V_CMP_CLASS_F16_E64 + V_CMP_CLASS_F32 = V_CMP_CLASS_F32_E64 + V_CMP_CLASS_F64 = V_CMP_CLASS_F64_E64 + V_CMPX_LT_F16 = V_CMPX_LT_F16_E64 + V_CMPX_EQ_F16 = V_CMPX_EQ_F16_E64 + V_CMPX_LE_F16 = V_CMPX_LE_F16_E64 + V_CMPX_GT_F16 = V_CMPX_GT_F16_E64 + V_CMPX_LG_F16 = V_CMPX_LG_F16_E64 + V_CMPX_GE_F16 = V_CMPX_GE_F16_E64 + V_CMPX_O_F16 = V_CMPX_O_F16_E64 + V_CMPX_U_F16 = V_CMPX_U_F16_E64 + V_CMPX_NGE_F16 = V_CMPX_NGE_F16_E64 + V_CMPX_NLG_F16 = V_CMPX_NLG_F16_E64 + V_CMPX_NGT_F16 = V_CMPX_NGT_F16_E64 + V_CMPX_NLE_F16 = V_CMPX_NLE_F16_E64 + V_CMPX_NEQ_F16 = V_CMPX_NEQ_F16_E64 + V_CMPX_NLT_F16 = V_CMPX_NLT_F16_E64 + V_CMPX_LT_F32 = V_CMPX_LT_F32_E64 + V_CMPX_EQ_F32 = V_CMPX_EQ_F32_E64 + V_CMPX_LE_F32 = V_CMPX_LE_F32_E64 + V_CMPX_GT_F32 = V_CMPX_GT_F32_E64 + V_CMPX_LG_F32 = V_CMPX_LG_F32_E64 + V_CMPX_GE_F32 = V_CMPX_GE_F32_E64 + V_CMPX_O_F32 = V_CMPX_O_F32_E64 + V_CMPX_U_F32 = V_CMPX_U_F32_E64 + V_CMPX_NGE_F32 = V_CMPX_NGE_F32_E64 + V_CMPX_NLG_F32 = V_CMPX_NLG_F32_E64 + V_CMPX_NGT_F32 = V_CMPX_NGT_F32_E64 + V_CMPX_NLE_F32 = V_CMPX_NLE_F32_E64 + V_CMPX_NEQ_F32 = V_CMPX_NEQ_F32_E64 + V_CMPX_NLT_F32 = V_CMPX_NLT_F32_E64 + V_CMPX_LT_F64 = V_CMPX_LT_F64_E64 + V_CMPX_EQ_F64 = V_CMPX_EQ_F64_E64 + V_CMPX_LE_F64 = V_CMPX_LE_F64_E64 + V_CMPX_GT_F64 = V_CMPX_GT_F64_E64 + V_CMPX_LG_F64 = V_CMPX_LG_F64_E64 + V_CMPX_GE_F64 = V_CMPX_GE_F64_E64 + V_CMPX_O_F64 = V_CMPX_O_F64_E64 + V_CMPX_U_F64 = V_CMPX_U_F64_E64 + V_CMPX_NGE_F64 = V_CMPX_NGE_F64_E64 + V_CMPX_NLG_F64 = V_CMPX_NLG_F64_E64 + V_CMPX_NGT_F64 = V_CMPX_NGT_F64_E64 + V_CMPX_NLE_F64 = V_CMPX_NLE_F64_E64 + V_CMPX_NEQ_F64 = V_CMPX_NEQ_F64_E64 + V_CMPX_NLT_F64 = V_CMPX_NLT_F64_E64 + V_CMPX_LT_I16 = V_CMPX_LT_I16_E64 + V_CMPX_EQ_I16 = V_CMPX_EQ_I16_E64 + V_CMPX_LE_I16 = V_CMPX_LE_I16_E64 + V_CMPX_GT_I16 = V_CMPX_GT_I16_E64 + V_CMPX_NE_I16 = V_CMPX_NE_I16_E64 + V_CMPX_GE_I16 = V_CMPX_GE_I16_E64 + V_CMPX_LT_U16 = V_CMPX_LT_U16_E64 + V_CMPX_EQ_U16 = V_CMPX_EQ_U16_E64 + V_CMPX_LE_U16 = V_CMPX_LE_U16_E64 + V_CMPX_GT_U16 = V_CMPX_GT_U16_E64 + V_CMPX_NE_U16 = V_CMPX_NE_U16_E64 + V_CMPX_GE_U16 = V_CMPX_GE_U16_E64 + V_CMPX_LT_I32 = V_CMPX_LT_I32_E64 + V_CMPX_EQ_I32 = V_CMPX_EQ_I32_E64 + V_CMPX_LE_I32 = V_CMPX_LE_I32_E64 + V_CMPX_GT_I32 = V_CMPX_GT_I32_E64 + V_CMPX_NE_I32 = V_CMPX_NE_I32_E64 + V_CMPX_GE_I32 = V_CMPX_GE_I32_E64 + V_CMPX_LT_U32 = V_CMPX_LT_U32_E64 + V_CMPX_EQ_U32 = V_CMPX_EQ_U32_E64 + V_CMPX_LE_U32 = V_CMPX_LE_U32_E64 + V_CMPX_GT_U32 = V_CMPX_GT_U32_E64 + V_CMPX_NE_U32 = V_CMPX_NE_U32_E64 + V_CMPX_GE_U32 = V_CMPX_GE_U32_E64 + V_CMPX_LT_I64 = V_CMPX_LT_I64_E64 + V_CMPX_EQ_I64 = V_CMPX_EQ_I64_E64 + V_CMPX_LE_I64 = V_CMPX_LE_I64_E64 + V_CMPX_GT_I64 = V_CMPX_GT_I64_E64 + V_CMPX_NE_I64 = V_CMPX_NE_I64_E64 + V_CMPX_GE_I64 = V_CMPX_GE_I64_E64 + V_CMPX_LT_U64 = V_CMPX_LT_U64_E64 + V_CMPX_EQ_U64 = V_CMPX_EQ_U64_E64 + V_CMPX_LE_U64 = V_CMPX_LE_U64_E64 + V_CMPX_GT_U64 = V_CMPX_GT_U64_E64 + V_CMPX_NE_U64 = V_CMPX_NE_U64_E64 + V_CMPX_GE_U64 = V_CMPX_GE_U64_E64 + V_CMPX_CLASS_F16 = V_CMPX_CLASS_F16_E64 + V_CMPX_CLASS_F32 = V_CMPX_CLASS_F32_E64 + V_CMPX_CLASS_F64 = V_CMPX_CLASS_F64_E64 + V_CNDMASK_B32 = V_CNDMASK_B32_E64 + V_ADD_F64 = V_ADD_F64_E64 + V_ADD_F32 = V_ADD_F32_E64 + V_SUB_F32 = V_SUB_F32_E64 + V_SUBREV_F32 = V_SUBREV_F32_E64 + V_MUL_F64 = V_MUL_F64_E64 + V_MUL_DX9_ZERO_F32 = V_MUL_DX9_ZERO_F32_E64 + V_MUL_F32 = V_MUL_F32_E64 + V_MUL_I32_I24 = V_MUL_I32_I24_E64 + V_MUL_HI_I32_I24 = V_MUL_HI_I32_I24_E64 + V_MUL_U32_U24 = V_MUL_U32_U24_E64 + V_MUL_HI_U32_U24 = V_MUL_HI_U32_U24_E64 + V_MIN_NUM_F64 = V_MIN_NUM_F64_E64 + V_MAX_NUM_F64 = V_MAX_NUM_F64_E64 + V_MIN_I32 = V_MIN_I32_E64 + V_MAX_I32 = V_MAX_I32_E64 + V_MIN_U32 = V_MIN_U32_E64 + V_MAX_U32 = V_MAX_U32_E64 + V_MIN_NUM_F32 = V_MIN_NUM_F32_E64 + V_MAX_NUM_F32 = V_MAX_NUM_F32_E64 + V_LSHLREV_B32 = V_LSHLREV_B32_E64 + V_LSHRREV_B32 = V_LSHRREV_B32_E64 + V_ASHRREV_I32 = V_ASHRREV_I32_E64 + V_AND_B32 = V_AND_B32_E64 + V_OR_B32 = V_OR_B32_E64 + V_XOR_B32 = V_XOR_B32_E64 + V_XNOR_B32 = V_XNOR_B32_E64 + V_LSHLREV_B64 = V_LSHLREV_B64_E64 + V_ADD_NC_U32 = V_ADD_NC_U32_E64 + V_SUB_NC_U32 = V_SUB_NC_U32_E64 + V_SUBREV_NC_U32 = V_SUBREV_NC_U32_E64 + V_FMAC_F32 = V_FMAC_F32_E64 + V_CVT_PK_RTZ_F16_F32 = V_CVT_PK_RTZ_F16_F32_E64 + V_MIN_NUM_F16 = V_MIN_NUM_F16_E64 + V_MAX_NUM_F16 = V_MAX_NUM_F16_E64 + V_ADD_F16 = V_ADD_F16_E64 + V_SUB_F16 = V_SUB_F16_E64 + V_SUBREV_F16 = V_SUBREV_F16_E64 + V_MUL_F16 = V_MUL_F16_E64 + V_FMAC_F16 = V_FMAC_F16_E64 + V_LDEXP_F16 = V_LDEXP_F16_E64 + V_NOP = V_NOP_E64 + V_MOV_B32 = V_MOV_B32_E64 + V_READFIRSTLANE_B32 = V_READFIRSTLANE_B32_E64 + V_CVT_I32_F64 = V_CVT_I32_F64_E64 + V_CVT_F64_I32 = V_CVT_F64_I32_E64 + V_CVT_F32_I32 = V_CVT_F32_I32_E64 + V_CVT_F32_U32 = V_CVT_F32_U32_E64 + V_CVT_U32_F32 = V_CVT_U32_F32_E64 + V_CVT_I32_F32 = V_CVT_I32_F32_E64 + V_CVT_F16_F32 = V_CVT_F16_F32_E64 + V_CVT_F32_F16 = V_CVT_F32_F16_E64 + V_CVT_NEAREST_I32_F32 = V_CVT_NEAREST_I32_F32_E64 + V_CVT_FLOOR_I32_F32 = V_CVT_FLOOR_I32_F32_E64 + V_CVT_OFF_F32_I4 = V_CVT_OFF_F32_I4_E64 + V_CVT_F32_F64 = V_CVT_F32_F64_E64 + V_CVT_F64_F32 = V_CVT_F64_F32_E64 + V_CVT_F32_UBYTE0 = V_CVT_F32_UBYTE0_E64 + V_CVT_F32_UBYTE1 = V_CVT_F32_UBYTE1_E64 + V_CVT_F32_UBYTE2 = V_CVT_F32_UBYTE2_E64 + V_CVT_F32_UBYTE3 = V_CVT_F32_UBYTE3_E64 + V_CVT_U32_F64 = V_CVT_U32_F64_E64 + V_CVT_F64_U32 = V_CVT_F64_U32_E64 + V_TRUNC_F64 = V_TRUNC_F64_E64 + V_CEIL_F64 = V_CEIL_F64_E64 + V_RNDNE_F64 = V_RNDNE_F64_E64 + V_FLOOR_F64 = V_FLOOR_F64_E64 + V_PIPEFLUSH = V_PIPEFLUSH_E64 + V_MOV_B16 = V_MOV_B16_E64 + V_FRACT_F32 = V_FRACT_F32_E64 + V_TRUNC_F32 = V_TRUNC_F32_E64 + V_CEIL_F32 = V_CEIL_F32_E64 + V_RNDNE_F32 = V_RNDNE_F32_E64 + V_FLOOR_F32 = V_FLOOR_F32_E64 + V_EXP_F32 = V_EXP_F32_E64 + V_LOG_F32 = V_LOG_F32_E64 + V_RCP_F32 = V_RCP_F32_E64 + V_RCP_IFLAG_F32 = V_RCP_IFLAG_F32_E64 + V_RSQ_F32 = V_RSQ_F32_E64 + V_RCP_F64 = V_RCP_F64_E64 + V_RSQ_F64 = V_RSQ_F64_E64 + V_SQRT_F32 = V_SQRT_F32_E64 + V_SQRT_F64 = V_SQRT_F64_E64 + V_SIN_F32 = V_SIN_F32_E64 + V_COS_F32 = V_COS_F32_E64 + V_NOT_B32 = V_NOT_B32_E64 + V_BFREV_B32 = V_BFREV_B32_E64 + V_CLZ_I32_U32 = V_CLZ_I32_U32_E64 + V_CTZ_I32_B32 = V_CTZ_I32_B32_E64 + V_CLS_I32 = V_CLS_I32_E64 + V_FREXP_EXP_I32_F64 = V_FREXP_EXP_I32_F64_E64 + V_FREXP_MANT_F64 = V_FREXP_MANT_F64_E64 + V_FRACT_F64 = V_FRACT_F64_E64 + V_FREXP_EXP_I32_F32 = V_FREXP_EXP_I32_F32_E64 + V_FREXP_MANT_F32 = V_FREXP_MANT_F32_E64 + V_MOVRELD_B32 = V_MOVRELD_B32_E64 + V_MOVRELS_B32 = V_MOVRELS_B32_E64 + V_MOVRELSD_B32 = V_MOVRELSD_B32_E64 + V_MOVRELSD_2_B32 = V_MOVRELSD_2_B32_E64 + V_CVT_F16_U16 = V_CVT_F16_U16_E64 + V_CVT_F16_I16 = V_CVT_F16_I16_E64 + V_CVT_U16_F16 = V_CVT_U16_F16_E64 + V_CVT_I16_F16 = V_CVT_I16_F16_E64 + V_RCP_F16 = V_RCP_F16_E64 + V_SQRT_F16 = V_SQRT_F16_E64 + V_RSQ_F16 = V_RSQ_F16_E64 + V_LOG_F16 = V_LOG_F16_E64 + V_EXP_F16 = V_EXP_F16_E64 + V_FREXP_MANT_F16 = V_FREXP_MANT_F16_E64 + V_FREXP_EXP_I16_F16 = V_FREXP_EXP_I16_F16_E64 + V_FLOOR_F16 = V_FLOOR_F16_E64 + V_CEIL_F16 = V_CEIL_F16_E64 + V_TRUNC_F16 = V_TRUNC_F16_E64 + V_RNDNE_F16 = V_RNDNE_F16_E64 + V_FRACT_F16 = V_FRACT_F16_E64 + V_SIN_F16 = V_SIN_F16_E64 + V_COS_F16 = V_COS_F16_E64 + V_SAT_PK_U8_I16 = V_SAT_PK_U8_I16_E64 + V_CVT_NORM_I16_F16 = V_CVT_NORM_I16_F16_E64 + V_CVT_NORM_U16_F16 = V_CVT_NORM_U16_F16_E64 + V_NOT_B16 = V_NOT_B16_E64 + V_CVT_I32_I16 = V_CVT_I32_I16_E64 + V_CVT_U32_U16 = V_CVT_U32_U16_E64 + V_CVT_F32_FP8 = V_CVT_F32_FP8_E64 + V_CVT_F32_BF8 = V_CVT_F32_BF8_E64 + V_CVT_PK_F32_FP8 = V_CVT_PK_F32_FP8_E64 + V_CVT_PK_F32_BF8 = V_CVT_PK_F32_BF8_E64 + +class VOP3POp(ReprEnum): + V_PK_MAD_I16 = 0 + V_PK_MUL_LO_U16 = 1 + V_PK_ADD_I16 = 2 + V_PK_SUB_I16 = 3 + V_PK_LSHLREV_B16 = 4 + V_PK_LSHRREV_B16 = 5 + V_PK_ASHRREV_I16 = 6 + V_PK_MAX_I16 = 7 + V_PK_MIN_I16 = 8 + V_PK_MAD_U16 = 9 + V_PK_ADD_U16 = 10 + V_PK_SUB_U16 = 11 + V_PK_MAX_U16 = 12 + V_PK_MIN_U16 = 13 + V_PK_FMA_F16 = 14 + V_PK_ADD_F16 = 15 + V_PK_MUL_F16 = 16 + V_DOT2_F32_F16 = 19 + V_DOT4_I32_IU8 = 22 + V_DOT4_U32_U8 = 23 + V_DOT8_I32_IU4 = 24 + V_DOT8_U32_U4 = 25 + V_DOT2_F32_BF16 = 26 + V_PK_MIN_NUM_F16 = 27 + V_PK_MAX_NUM_F16 = 28 + V_PK_MINIMUM_F16 = 29 + V_PK_MAXIMUM_F16 = 30 + V_FMA_MIX_F32 = 32 + V_FMA_MIXLO_F16 = 33 + V_FMA_MIXHI_F16 = 34 + V_DOT4_F32_FP8_BF8 = 36 + V_DOT4_F32_BF8_FP8 = 37 + V_DOT4_F32_FP8_FP8 = 38 + V_DOT4_F32_BF8_BF8 = 39 + V_WMMA_F32_16X16X16_F16 = 64 + V_WMMA_F32_16X16X16_BF16 = 65 + V_WMMA_F16_16X16X16_F16 = 66 + V_WMMA_BF16_16X16X16_BF16 = 67 + V_WMMA_I32_16X16X16_IU8 = 68 + V_WMMA_I32_16X16X16_IU4 = 69 + V_WMMA_F32_16X16X16_FP8_FP8 = 70 + V_WMMA_F32_16X16X16_FP8_BF8 = 71 + V_WMMA_F32_16X16X16_BF8_FP8 = 72 + V_WMMA_F32_16X16X16_BF8_BF8 = 73 + V_WMMA_I32_16X16X32_IU4 = 74 + V_SWMMAC_F32_16X16X32_F16 = 80 + V_SWMMAC_F32_16X16X32_BF16 = 81 + V_SWMMAC_F16_16X16X32_F16 = 82 + V_SWMMAC_BF16_16X16X32_BF16 = 83 + V_SWMMAC_I32_16X16X32_IU8 = 84 + V_SWMMAC_I32_16X16X32_IU4 = 85 + V_SWMMAC_I32_16X16X64_IU4 = 86 + V_SWMMAC_F32_16X16X32_FP8_FP8 = 87 + V_SWMMAC_F32_16X16X32_FP8_BF8 = 88 + V_SWMMAC_F32_16X16X32_BF8_FP8 = 89 + V_SWMMAC_F32_16X16X32_BF8_BF8 = 90 + +class VOP3SDOp(ReprEnum): + V_ADD_CO_CI_U32 = 288 + V_SUB_CO_CI_U32 = 289 + V_SUBREV_CO_CI_U32 = 290 + V_DIV_SCALE_F32 = 764 + V_DIV_SCALE_F64 = 765 + V_MAD_CO_U64_U32 = 766 + V_MAD_CO_I64_I32 = 767 + V_ADD_CO_U32 = 768 + V_SUB_CO_U32 = 769 + V_SUBREV_CO_U32 = 770 + +class VOPCOp(ReprEnum): + V_CMP_LT_F16_E32 = 1 + V_CMP_EQ_F16_E32 = 2 + V_CMP_LE_F16_E32 = 3 + V_CMP_GT_F16_E32 = 4 + V_CMP_LG_F16_E32 = 5 + V_CMP_GE_F16_E32 = 6 + V_CMP_O_F16_E32 = 7 + V_CMP_U_F16_E32 = 8 + V_CMP_NGE_F16_E32 = 9 + V_CMP_NLG_F16_E32 = 10 + V_CMP_NGT_F16_E32 = 11 + V_CMP_NLE_F16_E32 = 12 + V_CMP_NEQ_F16_E32 = 13 + V_CMP_NLT_F16_E32 = 14 + V_CMP_LT_F32_E32 = 17 + V_CMP_EQ_F32_E32 = 18 + V_CMP_LE_F32_E32 = 19 + V_CMP_GT_F32_E32 = 20 + V_CMP_LG_F32_E32 = 21 + V_CMP_GE_F32_E32 = 22 + V_CMP_O_F32_E32 = 23 + V_CMP_U_F32_E32 = 24 + V_CMP_NGE_F32_E32 = 25 + V_CMP_NLG_F32_E32 = 26 + V_CMP_NGT_F32_E32 = 27 + V_CMP_NLE_F32_E32 = 28 + V_CMP_NEQ_F32_E32 = 29 + V_CMP_NLT_F32_E32 = 30 + V_CMP_LT_F64_E32 = 33 + V_CMP_EQ_F64_E32 = 34 + V_CMP_LE_F64_E32 = 35 + V_CMP_GT_F64_E32 = 36 + V_CMP_LG_F64_E32 = 37 + V_CMP_GE_F64_E32 = 38 + V_CMP_O_F64_E32 = 39 + V_CMP_U_F64_E32 = 40 + V_CMP_NGE_F64_E32 = 41 + V_CMP_NLG_F64_E32 = 42 + V_CMP_NGT_F64_E32 = 43 + V_CMP_NLE_F64_E32 = 44 + V_CMP_NEQ_F64_E32 = 45 + V_CMP_NLT_F64_E32 = 46 + V_CMP_LT_I16_E32 = 49 + V_CMP_EQ_I16_E32 = 50 + V_CMP_LE_I16_E32 = 51 + V_CMP_GT_I16_E32 = 52 + V_CMP_NE_I16_E32 = 53 + V_CMP_GE_I16_E32 = 54 + V_CMP_LT_U16_E32 = 57 + V_CMP_EQ_U16_E32 = 58 + V_CMP_LE_U16_E32 = 59 + V_CMP_GT_U16_E32 = 60 + V_CMP_NE_U16_E32 = 61 + V_CMP_GE_U16_E32 = 62 + V_CMP_LT_I32_E32 = 65 + V_CMP_EQ_I32_E32 = 66 + V_CMP_LE_I32_E32 = 67 + V_CMP_GT_I32_E32 = 68 + V_CMP_NE_I32_E32 = 69 + V_CMP_GE_I32_E32 = 70 + V_CMP_LT_U32_E32 = 73 + V_CMP_EQ_U32_E32 = 74 + V_CMP_LE_U32_E32 = 75 + V_CMP_GT_U32_E32 = 76 + V_CMP_NE_U32_E32 = 77 + V_CMP_GE_U32_E32 = 78 + V_CMP_LT_I64_E32 = 81 + V_CMP_EQ_I64_E32 = 82 + V_CMP_LE_I64_E32 = 83 + V_CMP_GT_I64_E32 = 84 + V_CMP_NE_I64_E32 = 85 + V_CMP_GE_I64_E32 = 86 + V_CMP_LT_U64_E32 = 89 + V_CMP_EQ_U64_E32 = 90 + V_CMP_LE_U64_E32 = 91 + V_CMP_GT_U64_E32 = 92 + V_CMP_NE_U64_E32 = 93 + V_CMP_GE_U64_E32 = 94 + V_CMP_CLASS_F16_E32 = 125 + V_CMP_CLASS_F32_E32 = 126 + V_CMP_CLASS_F64_E32 = 127 + V_CMPX_LT_F16_E32 = 129 + V_CMPX_EQ_F16_E32 = 130 + V_CMPX_LE_F16_E32 = 131 + V_CMPX_GT_F16_E32 = 132 + V_CMPX_LG_F16_E32 = 133 + V_CMPX_GE_F16_E32 = 134 + V_CMPX_O_F16_E32 = 135 + V_CMPX_U_F16_E32 = 136 + V_CMPX_NGE_F16_E32 = 137 + V_CMPX_NLG_F16_E32 = 138 + V_CMPX_NGT_F16_E32 = 139 + V_CMPX_NLE_F16_E32 = 140 + V_CMPX_NEQ_F16_E32 = 141 + V_CMPX_NLT_F16_E32 = 142 + V_CMPX_LT_F32_E32 = 145 + V_CMPX_EQ_F32_E32 = 146 + V_CMPX_LE_F32_E32 = 147 + V_CMPX_GT_F32_E32 = 148 + V_CMPX_LG_F32_E32 = 149 + V_CMPX_GE_F32_E32 = 150 + V_CMPX_O_F32_E32 = 151 + V_CMPX_U_F32_E32 = 152 + V_CMPX_NGE_F32_E32 = 153 + V_CMPX_NLG_F32_E32 = 154 + V_CMPX_NGT_F32_E32 = 155 + V_CMPX_NLE_F32_E32 = 156 + V_CMPX_NEQ_F32_E32 = 157 + V_CMPX_NLT_F32_E32 = 158 + V_CMPX_LT_F64_E32 = 161 + V_CMPX_EQ_F64_E32 = 162 + V_CMPX_LE_F64_E32 = 163 + V_CMPX_GT_F64_E32 = 164 + V_CMPX_LG_F64_E32 = 165 + V_CMPX_GE_F64_E32 = 166 + V_CMPX_O_F64_E32 = 167 + V_CMPX_U_F64_E32 = 168 + V_CMPX_NGE_F64_E32 = 169 + V_CMPX_NLG_F64_E32 = 170 + V_CMPX_NGT_F64_E32 = 171 + V_CMPX_NLE_F64_E32 = 172 + V_CMPX_NEQ_F64_E32 = 173 + V_CMPX_NLT_F64_E32 = 174 + V_CMPX_LT_I16_E32 = 177 + V_CMPX_EQ_I16_E32 = 178 + V_CMPX_LE_I16_E32 = 179 + V_CMPX_GT_I16_E32 = 180 + V_CMPX_NE_I16_E32 = 181 + V_CMPX_GE_I16_E32 = 182 + V_CMPX_LT_U16_E32 = 185 + V_CMPX_EQ_U16_E32 = 186 + V_CMPX_LE_U16_E32 = 187 + V_CMPX_GT_U16_E32 = 188 + V_CMPX_NE_U16_E32 = 189 + V_CMPX_GE_U16_E32 = 190 + V_CMPX_LT_I32_E32 = 193 + V_CMPX_EQ_I32_E32 = 194 + V_CMPX_LE_I32_E32 = 195 + V_CMPX_GT_I32_E32 = 196 + V_CMPX_NE_I32_E32 = 197 + V_CMPX_GE_I32_E32 = 198 + V_CMPX_LT_U32_E32 = 201 + V_CMPX_EQ_U32_E32 = 202 + V_CMPX_LE_U32_E32 = 203 + V_CMPX_GT_U32_E32 = 204 + V_CMPX_NE_U32_E32 = 205 + V_CMPX_GE_U32_E32 = 206 + V_CMPX_LT_I64_E32 = 209 + V_CMPX_EQ_I64_E32 = 210 + V_CMPX_LE_I64_E32 = 211 + V_CMPX_GT_I64_E32 = 212 + V_CMPX_NE_I64_E32 = 213 + V_CMPX_GE_I64_E32 = 214 + V_CMPX_LT_U64_E32 = 217 + V_CMPX_EQ_U64_E32 = 218 + V_CMPX_LE_U64_E32 = 219 + V_CMPX_GT_U64_E32 = 220 + V_CMPX_NE_U64_E32 = 221 + V_CMPX_GE_U64_E32 = 222 + V_CMPX_CLASS_F16_E32 = 253 + V_CMPX_CLASS_F32_E32 = 254 + V_CMPX_CLASS_F64_E32 = 255 + V_CMP_LT_F16 = V_CMP_LT_F16_E32 + V_CMP_EQ_F16 = V_CMP_EQ_F16_E32 + V_CMP_LE_F16 = V_CMP_LE_F16_E32 + V_CMP_GT_F16 = V_CMP_GT_F16_E32 + V_CMP_LG_F16 = V_CMP_LG_F16_E32 + V_CMP_GE_F16 = V_CMP_GE_F16_E32 + V_CMP_O_F16 = V_CMP_O_F16_E32 + V_CMP_U_F16 = V_CMP_U_F16_E32 + V_CMP_NGE_F16 = V_CMP_NGE_F16_E32 + V_CMP_NLG_F16 = V_CMP_NLG_F16_E32 + V_CMP_NGT_F16 = V_CMP_NGT_F16_E32 + V_CMP_NLE_F16 = V_CMP_NLE_F16_E32 + V_CMP_NEQ_F16 = V_CMP_NEQ_F16_E32 + V_CMP_NLT_F16 = V_CMP_NLT_F16_E32 + V_CMP_LT_F32 = V_CMP_LT_F32_E32 + V_CMP_EQ_F32 = V_CMP_EQ_F32_E32 + V_CMP_LE_F32 = V_CMP_LE_F32_E32 + V_CMP_GT_F32 = V_CMP_GT_F32_E32 + V_CMP_LG_F32 = V_CMP_LG_F32_E32 + V_CMP_GE_F32 = V_CMP_GE_F32_E32 + V_CMP_O_F32 = V_CMP_O_F32_E32 + V_CMP_U_F32 = V_CMP_U_F32_E32 + V_CMP_NGE_F32 = V_CMP_NGE_F32_E32 + V_CMP_NLG_F32 = V_CMP_NLG_F32_E32 + V_CMP_NGT_F32 = V_CMP_NGT_F32_E32 + V_CMP_NLE_F32 = V_CMP_NLE_F32_E32 + V_CMP_NEQ_F32 = V_CMP_NEQ_F32_E32 + V_CMP_NLT_F32 = V_CMP_NLT_F32_E32 + V_CMP_LT_F64 = V_CMP_LT_F64_E32 + V_CMP_EQ_F64 = V_CMP_EQ_F64_E32 + V_CMP_LE_F64 = V_CMP_LE_F64_E32 + V_CMP_GT_F64 = V_CMP_GT_F64_E32 + V_CMP_LG_F64 = V_CMP_LG_F64_E32 + V_CMP_GE_F64 = V_CMP_GE_F64_E32 + V_CMP_O_F64 = V_CMP_O_F64_E32 + V_CMP_U_F64 = V_CMP_U_F64_E32 + V_CMP_NGE_F64 = V_CMP_NGE_F64_E32 + V_CMP_NLG_F64 = V_CMP_NLG_F64_E32 + V_CMP_NGT_F64 = V_CMP_NGT_F64_E32 + V_CMP_NLE_F64 = V_CMP_NLE_F64_E32 + V_CMP_NEQ_F64 = V_CMP_NEQ_F64_E32 + V_CMP_NLT_F64 = V_CMP_NLT_F64_E32 + V_CMP_LT_I16 = V_CMP_LT_I16_E32 + V_CMP_EQ_I16 = V_CMP_EQ_I16_E32 + V_CMP_LE_I16 = V_CMP_LE_I16_E32 + V_CMP_GT_I16 = V_CMP_GT_I16_E32 + V_CMP_NE_I16 = V_CMP_NE_I16_E32 + V_CMP_GE_I16 = V_CMP_GE_I16_E32 + V_CMP_LT_U16 = V_CMP_LT_U16_E32 + V_CMP_EQ_U16 = V_CMP_EQ_U16_E32 + V_CMP_LE_U16 = V_CMP_LE_U16_E32 + V_CMP_GT_U16 = V_CMP_GT_U16_E32 + V_CMP_NE_U16 = V_CMP_NE_U16_E32 + V_CMP_GE_U16 = V_CMP_GE_U16_E32 + V_CMP_LT_I32 = V_CMP_LT_I32_E32 + V_CMP_EQ_I32 = V_CMP_EQ_I32_E32 + V_CMP_LE_I32 = V_CMP_LE_I32_E32 + V_CMP_GT_I32 = V_CMP_GT_I32_E32 + V_CMP_NE_I32 = V_CMP_NE_I32_E32 + V_CMP_GE_I32 = V_CMP_GE_I32_E32 + V_CMP_LT_U32 = V_CMP_LT_U32_E32 + V_CMP_EQ_U32 = V_CMP_EQ_U32_E32 + V_CMP_LE_U32 = V_CMP_LE_U32_E32 + V_CMP_GT_U32 = V_CMP_GT_U32_E32 + V_CMP_NE_U32 = V_CMP_NE_U32_E32 + V_CMP_GE_U32 = V_CMP_GE_U32_E32 + V_CMP_LT_I64 = V_CMP_LT_I64_E32 + V_CMP_EQ_I64 = V_CMP_EQ_I64_E32 + V_CMP_LE_I64 = V_CMP_LE_I64_E32 + V_CMP_GT_I64 = V_CMP_GT_I64_E32 + V_CMP_NE_I64 = V_CMP_NE_I64_E32 + V_CMP_GE_I64 = V_CMP_GE_I64_E32 + V_CMP_LT_U64 = V_CMP_LT_U64_E32 + V_CMP_EQ_U64 = V_CMP_EQ_U64_E32 + V_CMP_LE_U64 = V_CMP_LE_U64_E32 + V_CMP_GT_U64 = V_CMP_GT_U64_E32 + V_CMP_NE_U64 = V_CMP_NE_U64_E32 + V_CMP_GE_U64 = V_CMP_GE_U64_E32 + V_CMP_CLASS_F16 = V_CMP_CLASS_F16_E32 + V_CMP_CLASS_F32 = V_CMP_CLASS_F32_E32 + V_CMP_CLASS_F64 = V_CMP_CLASS_F64_E32 + V_CMPX_LT_F16 = V_CMPX_LT_F16_E32 + V_CMPX_EQ_F16 = V_CMPX_EQ_F16_E32 + V_CMPX_LE_F16 = V_CMPX_LE_F16_E32 + V_CMPX_GT_F16 = V_CMPX_GT_F16_E32 + V_CMPX_LG_F16 = V_CMPX_LG_F16_E32 + V_CMPX_GE_F16 = V_CMPX_GE_F16_E32 + V_CMPX_O_F16 = V_CMPX_O_F16_E32 + V_CMPX_U_F16 = V_CMPX_U_F16_E32 + V_CMPX_NGE_F16 = V_CMPX_NGE_F16_E32 + V_CMPX_NLG_F16 = V_CMPX_NLG_F16_E32 + V_CMPX_NGT_F16 = V_CMPX_NGT_F16_E32 + V_CMPX_NLE_F16 = V_CMPX_NLE_F16_E32 + V_CMPX_NEQ_F16 = V_CMPX_NEQ_F16_E32 + V_CMPX_NLT_F16 = V_CMPX_NLT_F16_E32 + V_CMPX_LT_F32 = V_CMPX_LT_F32_E32 + V_CMPX_EQ_F32 = V_CMPX_EQ_F32_E32 + V_CMPX_LE_F32 = V_CMPX_LE_F32_E32 + V_CMPX_GT_F32 = V_CMPX_GT_F32_E32 + V_CMPX_LG_F32 = V_CMPX_LG_F32_E32 + V_CMPX_GE_F32 = V_CMPX_GE_F32_E32 + V_CMPX_O_F32 = V_CMPX_O_F32_E32 + V_CMPX_U_F32 = V_CMPX_U_F32_E32 + V_CMPX_NGE_F32 = V_CMPX_NGE_F32_E32 + V_CMPX_NLG_F32 = V_CMPX_NLG_F32_E32 + V_CMPX_NGT_F32 = V_CMPX_NGT_F32_E32 + V_CMPX_NLE_F32 = V_CMPX_NLE_F32_E32 + V_CMPX_NEQ_F32 = V_CMPX_NEQ_F32_E32 + V_CMPX_NLT_F32 = V_CMPX_NLT_F32_E32 + V_CMPX_LT_F64 = V_CMPX_LT_F64_E32 + V_CMPX_EQ_F64 = V_CMPX_EQ_F64_E32 + V_CMPX_LE_F64 = V_CMPX_LE_F64_E32 + V_CMPX_GT_F64 = V_CMPX_GT_F64_E32 + V_CMPX_LG_F64 = V_CMPX_LG_F64_E32 + V_CMPX_GE_F64 = V_CMPX_GE_F64_E32 + V_CMPX_O_F64 = V_CMPX_O_F64_E32 + V_CMPX_U_F64 = V_CMPX_U_F64_E32 + V_CMPX_NGE_F64 = V_CMPX_NGE_F64_E32 + V_CMPX_NLG_F64 = V_CMPX_NLG_F64_E32 + V_CMPX_NGT_F64 = V_CMPX_NGT_F64_E32 + V_CMPX_NLE_F64 = V_CMPX_NLE_F64_E32 + V_CMPX_NEQ_F64 = V_CMPX_NEQ_F64_E32 + V_CMPX_NLT_F64 = V_CMPX_NLT_F64_E32 + V_CMPX_LT_I16 = V_CMPX_LT_I16_E32 + V_CMPX_EQ_I16 = V_CMPX_EQ_I16_E32 + V_CMPX_LE_I16 = V_CMPX_LE_I16_E32 + V_CMPX_GT_I16 = V_CMPX_GT_I16_E32 + V_CMPX_NE_I16 = V_CMPX_NE_I16_E32 + V_CMPX_GE_I16 = V_CMPX_GE_I16_E32 + V_CMPX_LT_U16 = V_CMPX_LT_U16_E32 + V_CMPX_EQ_U16 = V_CMPX_EQ_U16_E32 + V_CMPX_LE_U16 = V_CMPX_LE_U16_E32 + V_CMPX_GT_U16 = V_CMPX_GT_U16_E32 + V_CMPX_NE_U16 = V_CMPX_NE_U16_E32 + V_CMPX_GE_U16 = V_CMPX_GE_U16_E32 + V_CMPX_LT_I32 = V_CMPX_LT_I32_E32 + V_CMPX_EQ_I32 = V_CMPX_EQ_I32_E32 + V_CMPX_LE_I32 = V_CMPX_LE_I32_E32 + V_CMPX_GT_I32 = V_CMPX_GT_I32_E32 + V_CMPX_NE_I32 = V_CMPX_NE_I32_E32 + V_CMPX_GE_I32 = V_CMPX_GE_I32_E32 + V_CMPX_LT_U32 = V_CMPX_LT_U32_E32 + V_CMPX_EQ_U32 = V_CMPX_EQ_U32_E32 + V_CMPX_LE_U32 = V_CMPX_LE_U32_E32 + V_CMPX_GT_U32 = V_CMPX_GT_U32_E32 + V_CMPX_NE_U32 = V_CMPX_NE_U32_E32 + V_CMPX_GE_U32 = V_CMPX_GE_U32_E32 + V_CMPX_LT_I64 = V_CMPX_LT_I64_E32 + V_CMPX_EQ_I64 = V_CMPX_EQ_I64_E32 + V_CMPX_LE_I64 = V_CMPX_LE_I64_E32 + V_CMPX_GT_I64 = V_CMPX_GT_I64_E32 + V_CMPX_NE_I64 = V_CMPX_NE_I64_E32 + V_CMPX_GE_I64 = V_CMPX_GE_I64_E32 + V_CMPX_LT_U64 = V_CMPX_LT_U64_E32 + V_CMPX_EQ_U64 = V_CMPX_EQ_U64_E32 + V_CMPX_LE_U64 = V_CMPX_LE_U64_E32 + V_CMPX_GT_U64 = V_CMPX_GT_U64_E32 + V_CMPX_NE_U64 = V_CMPX_NE_U64_E32 + V_CMPX_GE_U64 = V_CMPX_GE_U64_E32 + V_CMPX_CLASS_F16 = V_CMPX_CLASS_F16_E32 + V_CMPX_CLASS_F32 = V_CMPX_CLASS_F32_E32 + V_CMPX_CLASS_F64 = V_CMPX_CLASS_F64_E32 + +class VOPDOp(ReprEnum): + V_DUAL_FMAC_F32 = 0 + V_DUAL_FMAAK_F32 = 1 + V_DUAL_FMAMK_F32 = 2 + V_DUAL_MUL_F32 = 3 + V_DUAL_ADD_F32 = 4 + V_DUAL_SUB_F32 = 5 + V_DUAL_SUBREV_F32 = 6 + V_DUAL_MUL_DX9_ZERO_F32 = 7 + V_DUAL_MOV_B32 = 8 + V_DUAL_CNDMASK_B32 = 9 + V_DUAL_MAX_NUM_F32 = 10 + V_DUAL_MIN_NUM_F32 = 11 + V_DUAL_DOT2ACC_F32_F16 = 12 + V_DUAL_DOT2ACC_F32_BF16 = 13 + V_DUAL_ADD_NC_U32 = 16 + V_DUAL_LSHLREV_B32 = 17 + V_DUAL_AND_B32 = 18 + +class VSAMPLEOp(ReprEnum): + IMAGE_MSAA_LOAD = 24 + IMAGE_SAMPLE = 27 + IMAGE_SAMPLE_D = 28 + IMAGE_SAMPLE_L = 29 + IMAGE_SAMPLE_B = 30 + IMAGE_SAMPLE_LZ = 31 + IMAGE_SAMPLE_C = 32 + IMAGE_SAMPLE_C_D = 33 + IMAGE_SAMPLE_C_L = 34 + IMAGE_SAMPLE_C_B = 35 + IMAGE_SAMPLE_C_LZ = 36 + IMAGE_SAMPLE_O = 37 + IMAGE_SAMPLE_D_O = 38 + IMAGE_SAMPLE_L_O = 39 + IMAGE_SAMPLE_B_O = 40 + IMAGE_SAMPLE_LZ_O = 41 + IMAGE_SAMPLE_C_O = 42 + IMAGE_SAMPLE_C_D_O = 43 + IMAGE_SAMPLE_C_L_O = 44 + IMAGE_SAMPLE_C_B_O = 45 + IMAGE_SAMPLE_C_LZ_O = 46 + IMAGE_GATHER4 = 47 + IMAGE_GATHER4_L = 48 + IMAGE_GATHER4_B = 49 + IMAGE_GATHER4_LZ = 50 + IMAGE_GATHER4_C = 51 + IMAGE_GATHER4_C_LZ = 52 + IMAGE_GATHER4_O = 53 + IMAGE_GATHER4_LZ_O = 54 + IMAGE_GATHER4_C_LZ_O = 55 + IMAGE_GET_LOD = 56 + IMAGE_SAMPLE_D_G16 = 57 + IMAGE_SAMPLE_C_D_G16 = 58 + IMAGE_SAMPLE_D_O_G16 = 59 + IMAGE_SAMPLE_C_D_O_G16 = 60 + IMAGE_SAMPLE_CL = 64 + IMAGE_SAMPLE_D_CL = 65 + IMAGE_SAMPLE_B_CL = 66 + IMAGE_SAMPLE_C_CL = 67 + IMAGE_SAMPLE_C_D_CL = 68 + IMAGE_SAMPLE_C_B_CL = 69 + IMAGE_SAMPLE_CL_O = 70 + IMAGE_SAMPLE_D_CL_O = 71 + IMAGE_SAMPLE_B_CL_O = 72 + IMAGE_SAMPLE_C_CL_O = 73 + IMAGE_SAMPLE_C_D_CL_O = 74 + IMAGE_SAMPLE_C_B_CL_O = 75 + IMAGE_SAMPLE_C_D_CL_G16 = 84 + IMAGE_SAMPLE_D_CL_O_G16 = 85 + IMAGE_SAMPLE_C_D_CL_O_G16 = 86 + IMAGE_SAMPLE_D_CL_G16 = 95 + IMAGE_GATHER4_CL = 96 + IMAGE_GATHER4_B_CL = 97 + IMAGE_GATHER4_C_CL = 98 + IMAGE_GATHER4_C_L = 99 + IMAGE_GATHER4_C_B = 100 + IMAGE_GATHER4_C_B_CL = 101 + IMAGE_GATHER4H = 144 + +class VSCRATCHOp(ReprEnum): + SCRATCH_LOAD_U8 = 16 + SCRATCH_LOAD_I8 = 17 + SCRATCH_LOAD_U16 = 18 + SCRATCH_LOAD_I16 = 19 + SCRATCH_LOAD_B32 = 20 + SCRATCH_LOAD_B64 = 21 + SCRATCH_LOAD_B96 = 22 + SCRATCH_LOAD_B128 = 23 + SCRATCH_STORE_B8 = 24 + SCRATCH_STORE_B16 = 25 + SCRATCH_STORE_B32 = 26 + SCRATCH_STORE_B64 = 27 + SCRATCH_STORE_B96 = 28 + SCRATCH_STORE_B128 = 29 + SCRATCH_LOAD_D16_U8 = 30 + SCRATCH_LOAD_D16_I8 = 31 + SCRATCH_LOAD_D16_B16 = 32 + SCRATCH_LOAD_D16_HI_U8 = 33 + SCRATCH_LOAD_D16_HI_I8 = 34 + SCRATCH_LOAD_D16_HI_B16 = 35 + SCRATCH_STORE_D16_HI_B8 = 36 + SCRATCH_STORE_D16_HI_B16 = 37 + SCRATCH_LOAD_BLOCK = 83 + SCRATCH_STORE_BLOCK = 84 diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/ins.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/ins.py new file mode 100644 index 000000000..8b67450f6 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/ins.py @@ -0,0 +1,2012 @@ +# autogenerated from AMD ISA XML - do not edit +# ruff: noqa: E501,F401 +from tinygrad.renderer.amd.dsl import BitField, DPP, DPP16, EXEC, EXECZ, EXEC_HI, EXEC_LO, EnumBitField, FixedBitField, INV_2PI, Inst, LIT, M0, NULL, OFF, SBaseField, SCC, SDWA, SGPRField, SRC_LDS_DIRECT, SSrcField, SrcField, VCC, VCCZ, VCC_HI, VCC_LO, VDSTYField, VGPRField, s, src, ttmp, v +from tinygrad.runtime.autogen.amd.rdna4.enum import DSOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VBUFFEROp, VDSDIROp, VEXPORTOp, VFLATOp, VGLOBALOp, VIMAGEOp, VINTERPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3SDOp, VOPCOp, VOPDOp, VSAMPLEOp, VSCRATCHOp, HWREG, MSG +import functools + +class DS(Inst): + encoding = FixedBitField(31, 26, 0b110110) + op = EnumBitField(25, 18, DSOp, {DSOp.DS_ADD_U32, DSOp.DS_SUB_U32, DSOp.DS_RSUB_U32, DSOp.DS_INC_U32, DSOp.DS_DEC_U32, DSOp.DS_MIN_I32, DSOp.DS_MAX_I32, DSOp.DS_MIN_U32, DSOp.DS_MAX_U32, DSOp.DS_AND_B32, DSOp.DS_OR_B32, DSOp.DS_XOR_B32, DSOp.DS_MSKOR_B32, DSOp.DS_STORE_B32, DSOp.DS_STORE_2ADDR_B32, DSOp.DS_STORE_2ADDR_STRIDE64_B32, DSOp.DS_CMPSTORE_B32, DSOp.DS_MIN_NUM_F32, DSOp.DS_MAX_NUM_F32, DSOp.DS_NOP, DSOp.DS_ADD_F32, DSOp.DS_STORE_B8, DSOp.DS_STORE_B16, DSOp.DS_ADD_RTN_U32, DSOp.DS_SUB_RTN_U32, DSOp.DS_RSUB_RTN_U32, DSOp.DS_INC_RTN_U32, DSOp.DS_DEC_RTN_U32, DSOp.DS_MIN_RTN_I32, DSOp.DS_MAX_RTN_I32, DSOp.DS_MIN_RTN_U32, DSOp.DS_MAX_RTN_U32, DSOp.DS_AND_RTN_B32, DSOp.DS_OR_RTN_B32, DSOp.DS_XOR_RTN_B32, DSOp.DS_MSKOR_RTN_B32, DSOp.DS_STOREXCHG_RTN_B32, DSOp.DS_STOREXCHG_2ADDR_RTN_B32, DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32, DSOp.DS_CMPSTORE_RTN_B32, DSOp.DS_MIN_NUM_RTN_F32, DSOp.DS_MAX_NUM_RTN_F32, DSOp.DS_SWIZZLE_B32, DSOp.DS_LOAD_B32, DSOp.DS_LOAD_2ADDR_B32, DSOp.DS_LOAD_2ADDR_STRIDE64_B32, DSOp.DS_LOAD_I8, DSOp.DS_LOAD_U8, DSOp.DS_LOAD_I16, DSOp.DS_LOAD_U16, DSOp.DS_CONSUME, DSOp.DS_APPEND, DSOp.DS_ADD_U64, DSOp.DS_SUB_U64, DSOp.DS_RSUB_U64, DSOp.DS_INC_U64, DSOp.DS_DEC_U64, DSOp.DS_MIN_I64, DSOp.DS_MAX_I64, DSOp.DS_MIN_U64, DSOp.DS_MAX_U64, DSOp.DS_AND_B64, DSOp.DS_OR_B64, DSOp.DS_XOR_B64, DSOp.DS_MSKOR_B64, DSOp.DS_STORE_B64, DSOp.DS_STORE_2ADDR_B64, DSOp.DS_STORE_2ADDR_STRIDE64_B64, DSOp.DS_CMPSTORE_B64, DSOp.DS_MIN_NUM_F64, DSOp.DS_MAX_NUM_F64, DSOp.DS_ADD_RTN_U64, DSOp.DS_SUB_RTN_U64, DSOp.DS_RSUB_RTN_U64, DSOp.DS_INC_RTN_U64, DSOp.DS_DEC_RTN_U64, DSOp.DS_MIN_RTN_I64, DSOp.DS_MAX_RTN_I64, DSOp.DS_MIN_RTN_U64, DSOp.DS_MAX_RTN_U64, DSOp.DS_AND_RTN_B64, DSOp.DS_OR_RTN_B64, DSOp.DS_XOR_RTN_B64, DSOp.DS_MSKOR_RTN_B64, DSOp.DS_STOREXCHG_RTN_B64, DSOp.DS_STOREXCHG_2ADDR_RTN_B64, DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64, DSOp.DS_CMPSTORE_RTN_B64, DSOp.DS_MIN_NUM_RTN_F64, DSOp.DS_MAX_NUM_RTN_F64, DSOp.DS_LOAD_B64, DSOp.DS_LOAD_2ADDR_B64, DSOp.DS_LOAD_2ADDR_STRIDE64_B64, DSOp.DS_ADD_RTN_F32, DSOp.DS_CONDXCHG32_RTN_B64, DSOp.DS_COND_SUB_U32, DSOp.DS_SUB_CLAMP_U32, DSOp.DS_PK_ADD_F16, DSOp.DS_PK_ADD_BF16, DSOp.DS_STORE_B8_D16_HI, DSOp.DS_STORE_B16_D16_HI, DSOp.DS_LOAD_U8_D16, DSOp.DS_LOAD_U8_D16_HI, DSOp.DS_LOAD_I8_D16, DSOp.DS_LOAD_I8_D16_HI, DSOp.DS_LOAD_U16_D16, DSOp.DS_LOAD_U16_D16_HI, DSOp.DS_COND_SUB_RTN_U32, DSOp.DS_SUB_CLAMP_RTN_U32, DSOp.DS_PK_ADD_RTN_F16, DSOp.DS_PK_ADD_RTN_BF16, DSOp.DS_STORE_ADDTID_B32, DSOp.DS_LOAD_ADDTID_B32, DSOp.DS_PERMUTE_B32, DSOp.DS_BPERMUTE_B32, DSOp.DS_BPERMUTE_FI_B32, DSOp.DS_STORE_B96, DSOp.DS_STORE_B128, DSOp.DS_BVH_STACK_PUSH4_POP1_RTN_B32, DSOp.DS_BVH_STACK_PUSH8_POP1_RTN_B32, DSOp.DS_BVH_STACK_PUSH8_POP2_RTN_B64, DSOp.DS_LOAD_B96, DSOp.DS_LOAD_B128}) + vdst = VGPRField(63, 56) + addr = VGPRField(39, 32) + data0 = VGPRField(47, 40) + data1 = VGPRField(55, 48) + offset0 = BitField(7, 0) + offset1 = BitField(15, 8) + +class SMEM(Inst): + encoding = FixedBitField(31, 26, 0b111101) + op = EnumBitField(18, 13, SMEMOp, {SMEMOp.S_LOAD_B32, SMEMOp.S_LOAD_B64, SMEMOp.S_LOAD_B128, SMEMOp.S_LOAD_B256, SMEMOp.S_LOAD_B512, SMEMOp.S_LOAD_B96, SMEMOp.S_LOAD_I8, SMEMOp.S_LOAD_U8, SMEMOp.S_LOAD_I16, SMEMOp.S_LOAD_U16, SMEMOp.S_BUFFER_LOAD_B32, SMEMOp.S_BUFFER_LOAD_B64, SMEMOp.S_BUFFER_LOAD_B128, SMEMOp.S_BUFFER_LOAD_B256, SMEMOp.S_BUFFER_LOAD_B512, SMEMOp.S_BUFFER_LOAD_B96, SMEMOp.S_BUFFER_LOAD_I8, SMEMOp.S_BUFFER_LOAD_U8, SMEMOp.S_BUFFER_LOAD_I16, SMEMOp.S_BUFFER_LOAD_U16, SMEMOp.S_DCACHE_INV, SMEMOp.S_ATC_PROBE, SMEMOp.S_ATC_PROBE_BUFFER, SMEMOp.S_PREFETCH_INST, SMEMOp.S_PREFETCH_INST_PC_REL, SMEMOp.S_PREFETCH_DATA, SMEMOp.S_BUFFER_PREFETCH_DATA, SMEMOp.S_PREFETCH_DATA_PC_REL}) + sdata = SGPRField(12, 6) + sbase = SBaseField(5, 0) + soffset = SGPRField(63, 57, default=NULL) + nv = BitField(20, 20) + scope = BitField(22, 21) + th = BitField(24, 23) + ioffset = BitField(55, 32) + +class SOP1(Inst): + encoding = FixedBitField(31, 23, 0b101111101) + op = EnumBitField(15, 8, SOP1Op, {SOP1Op.S_MOV_B32, SOP1Op.S_MOV_B64, SOP1Op.S_CMOV_B32, SOP1Op.S_CMOV_B64, SOP1Op.S_BREV_B32, SOP1Op.S_BREV_B64, SOP1Op.S_CTZ_I32_B32, SOP1Op.S_CTZ_I32_B64, SOP1Op.S_CLZ_I32_U32, SOP1Op.S_CLZ_I32_U64, SOP1Op.S_CLS_I32, SOP1Op.S_CLS_I32_I64, SOP1Op.S_SEXT_I32_I8, SOP1Op.S_SEXT_I32_I16, SOP1Op.S_BITSET0_B32, SOP1Op.S_BITSET0_B64, SOP1Op.S_BITSET1_B32, SOP1Op.S_BITSET1_B64, SOP1Op.S_BITREPLICATE_B64_B32, SOP1Op.S_ABS_I32, SOP1Op.S_BCNT0_I32_B32, SOP1Op.S_BCNT0_I32_B64, SOP1Op.S_BCNT1_I32_B32, SOP1Op.S_BCNT1_I32_B64, SOP1Op.S_QUADMASK_B32, SOP1Op.S_QUADMASK_B64, SOP1Op.S_WQM_B32, SOP1Op.S_WQM_B64, SOP1Op.S_NOT_B32, SOP1Op.S_NOT_B64, SOP1Op.S_AND_SAVEEXEC_B32, SOP1Op.S_AND_SAVEEXEC_B64, SOP1Op.S_OR_SAVEEXEC_B32, SOP1Op.S_OR_SAVEEXEC_B64, SOP1Op.S_XOR_SAVEEXEC_B32, SOP1Op.S_XOR_SAVEEXEC_B64, SOP1Op.S_NAND_SAVEEXEC_B32, SOP1Op.S_NAND_SAVEEXEC_B64, SOP1Op.S_NOR_SAVEEXEC_B32, SOP1Op.S_NOR_SAVEEXEC_B64, SOP1Op.S_XNOR_SAVEEXEC_B32, SOP1Op.S_XNOR_SAVEEXEC_B64, SOP1Op.S_AND_NOT0_SAVEEXEC_B32, SOP1Op.S_AND_NOT0_SAVEEXEC_B64, SOP1Op.S_OR_NOT0_SAVEEXEC_B32, SOP1Op.S_OR_NOT0_SAVEEXEC_B64, SOP1Op.S_AND_NOT1_SAVEEXEC_B32, SOP1Op.S_AND_NOT1_SAVEEXEC_B64, SOP1Op.S_OR_NOT1_SAVEEXEC_B32, SOP1Op.S_OR_NOT1_SAVEEXEC_B64, SOP1Op.S_AND_NOT0_WREXEC_B32, SOP1Op.S_AND_NOT0_WREXEC_B64, SOP1Op.S_AND_NOT1_WREXEC_B32, SOP1Op.S_AND_NOT1_WREXEC_B64, SOP1Op.S_MOVRELS_B32, SOP1Op.S_MOVRELS_B64, SOP1Op.S_MOVRELD_B32, SOP1Op.S_MOVRELD_B64, SOP1Op.S_MOVRELSD_2_B32, SOP1Op.S_GETPC_B64, SOP1Op.S_SETPC_B64, SOP1Op.S_SWAPPC_B64, SOP1Op.S_RFE_B64, SOP1Op.S_SENDMSG_RTN_B32, SOP1Op.S_SENDMSG_RTN_B64, SOP1Op.S_BARRIER_SIGNAL, SOP1Op.S_BARRIER_SIGNAL_ISFIRST, SOP1Op.S_GET_BARRIER_STATE, SOP1Op.S_BARRIER_INIT, SOP1Op.S_BARRIER_JOIN, SOP1Op.S_ALLOC_VGPR, SOP1Op.S_SLEEP_VAR, SOP1Op.S_CEIL_F32, SOP1Op.S_FLOOR_F32, SOP1Op.S_TRUNC_F32, SOP1Op.S_RNDNE_F32, SOP1Op.S_CVT_F32_I32, SOP1Op.S_CVT_F32_U32, SOP1Op.S_CVT_I32_F32, SOP1Op.S_CVT_U32_F32, SOP1Op.S_CVT_F16_F32, SOP1Op.S_CVT_F32_F16, SOP1Op.S_CVT_HI_F32_F16, SOP1Op.S_CEIL_F16, SOP1Op.S_FLOOR_F16, SOP1Op.S_TRUNC_F16, SOP1Op.S_RNDNE_F16}) + sdst = SGPRField(22, 16) + ssrc0 = SSrcField(7, 0) + +class SOP2(Inst): + encoding = FixedBitField(31, 30, 0b10) + op = EnumBitField(29, 23, SOP2Op, {SOP2Op.S_ADD_CO_U32, SOP2Op.S_SUB_CO_U32, SOP2Op.S_ADD_CO_I32, SOP2Op.S_SUB_CO_I32, SOP2Op.S_ADD_CO_CI_U32, SOP2Op.S_SUB_CO_CI_U32, SOP2Op.S_ABSDIFF_I32, SOP2Op.S_LSHL_B32, SOP2Op.S_LSHL_B64, SOP2Op.S_LSHR_B32, SOP2Op.S_LSHR_B64, SOP2Op.S_ASHR_I32, SOP2Op.S_ASHR_I64, SOP2Op.S_LSHL1_ADD_U32, SOP2Op.S_LSHL2_ADD_U32, SOP2Op.S_LSHL3_ADD_U32, SOP2Op.S_LSHL4_ADD_U32, SOP2Op.S_MIN_I32, SOP2Op.S_MIN_U32, SOP2Op.S_MAX_I32, SOP2Op.S_MAX_U32, SOP2Op.S_AND_B32, SOP2Op.S_AND_B64, SOP2Op.S_OR_B32, SOP2Op.S_OR_B64, SOP2Op.S_XOR_B32, SOP2Op.S_XOR_B64, SOP2Op.S_NAND_B32, SOP2Op.S_NAND_B64, SOP2Op.S_NOR_B32, SOP2Op.S_NOR_B64, SOP2Op.S_XNOR_B32, SOP2Op.S_XNOR_B64, SOP2Op.S_AND_NOT1_B32, SOP2Op.S_AND_NOT1_B64, SOP2Op.S_OR_NOT1_B32, SOP2Op.S_OR_NOT1_B64, SOP2Op.S_BFE_U32, SOP2Op.S_BFE_I32, SOP2Op.S_BFE_U64, SOP2Op.S_BFE_I64, SOP2Op.S_BFM_B32, SOP2Op.S_BFM_B64, SOP2Op.S_MUL_I32, SOP2Op.S_MUL_HI_U32, SOP2Op.S_MUL_HI_I32, SOP2Op.S_CSELECT_B32, SOP2Op.S_CSELECT_B64, SOP2Op.S_PACK_LL_B32_B16, SOP2Op.S_PACK_LH_B32_B16, SOP2Op.S_PACK_HH_B32_B16, SOP2Op.S_PACK_HL_B32_B16, SOP2Op.S_ADD_F32, SOP2Op.S_SUB_F32, SOP2Op.S_MIN_NUM_F32, SOP2Op.S_MAX_NUM_F32, SOP2Op.S_MUL_F32, SOP2Op.S_FMAC_F32, SOP2Op.S_CVT_PK_RTZ_F16_F32, SOP2Op.S_ADD_F16, SOP2Op.S_SUB_F16, SOP2Op.S_MIN_NUM_F16, SOP2Op.S_MAX_NUM_F16, SOP2Op.S_MUL_F16, SOP2Op.S_FMAC_F16, SOP2Op.S_MINIMUM_F32, SOP2Op.S_MAXIMUM_F32, SOP2Op.S_MINIMUM_F16, SOP2Op.S_MAXIMUM_F16, SOP2Op.S_ADD_NC_U64, SOP2Op.S_SUB_NC_U64, SOP2Op.S_MUL_U64}) + sdst = SGPRField(22, 16) + ssrc0 = SSrcField(7, 0) + ssrc1 = SSrcField(15, 8) + +class SOPC(Inst): + encoding = FixedBitField(31, 23, 0b101111110) + op = EnumBitField(22, 16, SOPCOp, {SOPCOp.S_CMP_EQ_I32, SOPCOp.S_CMP_LG_I32, SOPCOp.S_CMP_GT_I32, SOPCOp.S_CMP_GE_I32, SOPCOp.S_CMP_LT_I32, SOPCOp.S_CMP_LE_I32, SOPCOp.S_CMP_EQ_U32, SOPCOp.S_CMP_LG_U32, SOPCOp.S_CMP_GT_U32, SOPCOp.S_CMP_GE_U32, SOPCOp.S_CMP_LT_U32, SOPCOp.S_CMP_LE_U32, SOPCOp.S_BITCMP0_B32, SOPCOp.S_BITCMP1_B32, SOPCOp.S_BITCMP0_B64, SOPCOp.S_BITCMP1_B64, SOPCOp.S_CMP_EQ_U64, SOPCOp.S_CMP_LG_U64, SOPCOp.S_CMP_LT_F32, SOPCOp.S_CMP_EQ_F32, SOPCOp.S_CMP_LE_F32, SOPCOp.S_CMP_GT_F32, SOPCOp.S_CMP_LG_F32, SOPCOp.S_CMP_GE_F32, SOPCOp.S_CMP_O_F32, SOPCOp.S_CMP_U_F32, SOPCOp.S_CMP_NGE_F32, SOPCOp.S_CMP_NLG_F32, SOPCOp.S_CMP_NGT_F32, SOPCOp.S_CMP_NLE_F32, SOPCOp.S_CMP_NEQ_F32, SOPCOp.S_CMP_NLT_F32, SOPCOp.S_CMP_LT_F16, SOPCOp.S_CMP_EQ_F16, SOPCOp.S_CMP_LE_F16, SOPCOp.S_CMP_GT_F16, SOPCOp.S_CMP_LG_F16, SOPCOp.S_CMP_GE_F16, SOPCOp.S_CMP_O_F16, SOPCOp.S_CMP_U_F16, SOPCOp.S_CMP_NGE_F16, SOPCOp.S_CMP_NLG_F16, SOPCOp.S_CMP_NGT_F16, SOPCOp.S_CMP_NLE_F16, SOPCOp.S_CMP_NEQ_F16, SOPCOp.S_CMP_NLT_F16}) + ssrc0 = SSrcField(7, 0) + ssrc1 = SSrcField(15, 8) + +class SOPK(Inst): + encoding = FixedBitField(31, 28, 0b1011) + op = EnumBitField(27, 23, SOPKOp, {SOPKOp.S_MOVK_I32, SOPKOp.S_VERSION, SOPKOp.S_CMOVK_I32, SOPKOp.S_ADDK_CO_I32, SOPKOp.S_MULK_I32, SOPKOp.S_GETREG_B32, SOPKOp.S_SETREG_B32, SOPKOp.S_CALL_B64}) + sdst = SGPRField(22, 16) + simm16 = BitField(15, 0) + +class SOPP(Inst): + encoding = FixedBitField(31, 23, 0b101111111) + op = EnumBitField(22, 16, SOPPOp, {SOPPOp.S_NOP, SOPPOp.S_SETKILL, SOPPOp.S_SETHALT, SOPPOp.S_SLEEP, SOPPOp.S_CLAUSE, SOPPOp.S_DELAY_ALU, SOPPOp.S_WAIT_ALU, SOPPOp.S_WAITCNT, SOPPOp.S_WAIT_IDLE, SOPPOp.S_WAIT_EVENT, SOPPOp.S_TRAP, SOPPOp.S_ROUND_MODE, SOPPOp.S_DENORM_MODE, SOPPOp.S_BARRIER_WAIT, SOPPOp.S_BARRIER_LEAVE, SOPPOp.S_CODE_END, SOPPOp.S_BRANCH, SOPPOp.S_CBRANCH_SCC0, SOPPOp.S_CBRANCH_SCC1, SOPPOp.S_CBRANCH_VCCZ, SOPPOp.S_CBRANCH_VCCNZ, SOPPOp.S_CBRANCH_EXECZ, SOPPOp.S_CBRANCH_EXECNZ, SOPPOp.S_ENDPGM, SOPPOp.S_ENDPGM_SAVED, SOPPOp.S_WAKEUP, SOPPOp.S_SETPRIO, SOPPOp.S_SENDMSG, SOPPOp.S_SENDMSGHALT, SOPPOp.S_INCPERFLEVEL, SOPPOp.S_DECPERFLEVEL, SOPPOp.S_TTRACEDATA, SOPPOp.S_TTRACEDATA_IMM, SOPPOp.S_ICACHE_INV, SOPPOp.S_WAIT_LOADCNT, SOPPOp.S_WAIT_STORECNT, SOPPOp.S_WAIT_SAMPLECNT, SOPPOp.S_WAIT_BVHCNT, SOPPOp.S_WAIT_EXPCNT, SOPPOp.S_WAIT_DSCNT, SOPPOp.S_WAIT_KMCNT, SOPPOp.S_WAIT_LOADCNT_DSCNT, SOPPOp.S_WAIT_STORECNT_DSCNT}) + simm16 = BitField(15, 0) + +class VBUFFER(Inst): + encoding = FixedBitField(31, 26, 0b110001) + op = EnumBitField(21, 14, VBUFFEROp, {VBUFFEROp.BUFFER_LOAD_FORMAT_X, VBUFFEROp.BUFFER_LOAD_FORMAT_XY, VBUFFEROp.BUFFER_LOAD_FORMAT_XYZ, VBUFFEROp.BUFFER_LOAD_FORMAT_XYZW, VBUFFEROp.BUFFER_STORE_FORMAT_X, VBUFFEROp.BUFFER_STORE_FORMAT_XY, VBUFFEROp.BUFFER_STORE_FORMAT_XYZ, VBUFFEROp.BUFFER_STORE_FORMAT_XYZW, VBUFFEROp.BUFFER_LOAD_D16_FORMAT_X, VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XY, VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XYZ, VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XYZW, VBUFFEROp.BUFFER_STORE_D16_FORMAT_X, VBUFFEROp.BUFFER_STORE_D16_FORMAT_XY, VBUFFEROp.BUFFER_STORE_D16_FORMAT_XYZ, VBUFFEROp.BUFFER_STORE_D16_FORMAT_XYZW, VBUFFEROp.BUFFER_LOAD_U8, VBUFFEROp.BUFFER_LOAD_I8, VBUFFEROp.BUFFER_LOAD_U16, VBUFFEROp.BUFFER_LOAD_I16, VBUFFEROp.BUFFER_LOAD_B32, VBUFFEROp.BUFFER_LOAD_B64, VBUFFEROp.BUFFER_LOAD_B96, VBUFFEROp.BUFFER_LOAD_B128, VBUFFEROp.BUFFER_STORE_B8, VBUFFEROp.BUFFER_STORE_B16, VBUFFEROp.BUFFER_STORE_B32, VBUFFEROp.BUFFER_STORE_B64, VBUFFEROp.BUFFER_STORE_B96, VBUFFEROp.BUFFER_STORE_B128, VBUFFEROp.BUFFER_LOAD_D16_U8, VBUFFEROp.BUFFER_LOAD_D16_I8, VBUFFEROp.BUFFER_LOAD_D16_B16, VBUFFEROp.BUFFER_LOAD_D16_HI_U8, VBUFFEROp.BUFFER_LOAD_D16_HI_I8, VBUFFEROp.BUFFER_LOAD_D16_HI_B16, VBUFFEROp.BUFFER_STORE_D16_HI_B8, VBUFFEROp.BUFFER_STORE_D16_HI_B16, VBUFFEROp.BUFFER_LOAD_D16_HI_FORMAT_X, VBUFFEROp.BUFFER_STORE_D16_HI_FORMAT_X, VBUFFEROp.BUFFER_ATOMIC_SWAP_B32, VBUFFEROp.BUFFER_ATOMIC_CMPSWAP_B32, VBUFFEROp.BUFFER_ATOMIC_ADD_U32, VBUFFEROp.BUFFER_ATOMIC_SUB_U32, VBUFFEROp.BUFFER_ATOMIC_SUB_CLAMP_U32, VBUFFEROp.BUFFER_ATOMIC_MIN_I32, VBUFFEROp.BUFFER_ATOMIC_MIN_U32, VBUFFEROp.BUFFER_ATOMIC_MAX_I32, VBUFFEROp.BUFFER_ATOMIC_MAX_U32, VBUFFEROp.BUFFER_ATOMIC_AND_B32, VBUFFEROp.BUFFER_ATOMIC_OR_B32, VBUFFEROp.BUFFER_ATOMIC_XOR_B32, VBUFFEROp.BUFFER_ATOMIC_INC_U32, VBUFFEROp.BUFFER_ATOMIC_DEC_U32, VBUFFEROp.BUFFER_ATOMIC_SWAP_B64, VBUFFEROp.BUFFER_ATOMIC_CMPSWAP_B64, VBUFFEROp.BUFFER_ATOMIC_ADD_U64, VBUFFEROp.BUFFER_ATOMIC_SUB_U64, VBUFFEROp.BUFFER_ATOMIC_MIN_I64, VBUFFEROp.BUFFER_ATOMIC_MIN_U64, VBUFFEROp.BUFFER_ATOMIC_MAX_I64, VBUFFEROp.BUFFER_ATOMIC_MAX_U64, VBUFFEROp.BUFFER_ATOMIC_AND_B64, VBUFFEROp.BUFFER_ATOMIC_OR_B64, VBUFFEROp.BUFFER_ATOMIC_XOR_B64, VBUFFEROp.BUFFER_ATOMIC_INC_U64, VBUFFEROp.BUFFER_ATOMIC_DEC_U64, VBUFFEROp.BUFFER_ATOMIC_COND_SUB_U32, VBUFFEROp.BUFFER_ATOMIC_MIN_NUM_F32, VBUFFEROp.BUFFER_ATOMIC_MAX_NUM_F32, VBUFFEROp.BUFFER_ATOMIC_ADD_F32, VBUFFEROp.BUFFER_ATOMIC_PK_ADD_F16, VBUFFEROp.BUFFER_ATOMIC_PK_ADD_BF16, VBUFFEROp.TBUFFER_LOAD_FORMAT_X, VBUFFEROp.TBUFFER_LOAD_FORMAT_XY, VBUFFEROp.TBUFFER_LOAD_FORMAT_XYZ, VBUFFEROp.TBUFFER_LOAD_FORMAT_XYZW, VBUFFEROp.TBUFFER_STORE_FORMAT_X, VBUFFEROp.TBUFFER_STORE_FORMAT_XY, VBUFFEROp.TBUFFER_STORE_FORMAT_XYZ, VBUFFEROp.TBUFFER_STORE_FORMAT_XYZW, VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_X, VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XY, VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XYZ, VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XYZW, VBUFFEROp.TBUFFER_STORE_D16_FORMAT_X, VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XY, VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XYZ, VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XYZW}) + vdata = VGPRField(39, 32) + vaddr = VGPRField(71, 64) + soffset = SGPRField(6, 0, default=NULL) + format = BitField(61, 55) + offen = BitField(62, 62) + idxen = BitField(63, 63) + tfe = BitField(22, 22) + nv = BitField(7, 7) + rsrc = BitField(49, 41) + scope = BitField(51, 50) + th = BitField(54, 52) + ioffset = BitField(95, 72) + +class VDSDIR(Inst): + encoding = FixedBitField(31, 24, 0b11001110) + op = EnumBitField(21, 20, VDSDIROp, {VDSDIROp.DS_PARAM_LOAD, VDSDIROp.DS_DIRECT_LOAD}) + vdst = VGPRField(7, 0) + attr = BitField(15, 10) + attr_chan = BitField(9, 8) + wait_va_vdst = BitField(19, 16) + wait_vm_vsrc = BitField(23, 23) + +class VEXPORT(Inst): + encoding = FixedBitField(31, 26, 0b111110) + vsrc0 = VGPRField(39, 32) + vsrc1 = VGPRField(47, 40) + vsrc2 = VGPRField(55, 48) + vsrc3 = VGPRField(63, 56) + en = BitField(3, 0) + target = BitField(9, 4) + done = BitField(11, 11) + row = BitField(13, 13) + +class VFLAT(Inst): + encoding = FixedBitField(31, 24, 0b11101100) + op = EnumBitField(21, 14, VFLATOp, {VFLATOp.FLAT_LOAD_U8, VFLATOp.FLAT_LOAD_I8, VFLATOp.FLAT_LOAD_U16, VFLATOp.FLAT_LOAD_I16, VFLATOp.FLAT_LOAD_B32, VFLATOp.FLAT_LOAD_B64, VFLATOp.FLAT_LOAD_B96, VFLATOp.FLAT_LOAD_B128, VFLATOp.FLAT_STORE_B8, VFLATOp.FLAT_STORE_B16, VFLATOp.FLAT_STORE_B32, VFLATOp.FLAT_STORE_B64, VFLATOp.FLAT_STORE_B96, VFLATOp.FLAT_STORE_B128, VFLATOp.FLAT_LOAD_D16_U8, VFLATOp.FLAT_LOAD_D16_I8, VFLATOp.FLAT_LOAD_D16_B16, VFLATOp.FLAT_LOAD_D16_HI_U8, VFLATOp.FLAT_LOAD_D16_HI_I8, VFLATOp.FLAT_LOAD_D16_HI_B16, VFLATOp.FLAT_STORE_D16_HI_B8, VFLATOp.FLAT_STORE_D16_HI_B16, VFLATOp.GLOBAL_LOAD_ADDTID_B32, VFLATOp.GLOBAL_STORE_ADDTID_B32, VFLATOp.FLAT_ATOMIC_SWAP_B32, VFLATOp.FLAT_ATOMIC_CMPSWAP_B32, VFLATOp.FLAT_ATOMIC_ADD_U32, VFLATOp.FLAT_ATOMIC_SUB_U32, VFLATOp.FLAT_ATOMIC_SUB_CLAMP_U32, VFLATOp.FLAT_ATOMIC_MIN_I32, VFLATOp.FLAT_ATOMIC_MIN_U32, VFLATOp.FLAT_ATOMIC_MAX_I32, VFLATOp.FLAT_ATOMIC_MAX_U32, VFLATOp.FLAT_ATOMIC_AND_B32, VFLATOp.FLAT_ATOMIC_OR_B32, VFLATOp.FLAT_ATOMIC_XOR_B32, VFLATOp.FLAT_ATOMIC_INC_U32, VFLATOp.FLAT_ATOMIC_DEC_U32, VFLATOp.FLAT_ATOMIC_SWAP_B64, VFLATOp.FLAT_ATOMIC_CMPSWAP_B64, VFLATOp.FLAT_ATOMIC_ADD_U64, VFLATOp.FLAT_ATOMIC_SUB_U64, VFLATOp.FLAT_ATOMIC_MIN_I64, VFLATOp.FLAT_ATOMIC_MIN_U64, VFLATOp.FLAT_ATOMIC_MAX_I64, VFLATOp.FLAT_ATOMIC_MAX_U64, VFLATOp.FLAT_ATOMIC_AND_B64, VFLATOp.FLAT_ATOMIC_OR_B64, VFLATOp.FLAT_ATOMIC_XOR_B64, VFLATOp.FLAT_ATOMIC_INC_U64, VFLATOp.FLAT_ATOMIC_DEC_U64, VFLATOp.FLAT_ATOMIC_COND_SUB_U32, VFLATOp.FLAT_ATOMIC_MIN_NUM_F32, VFLATOp.FLAT_ATOMIC_MAX_NUM_F32, VFLATOp.FLAT_ATOMIC_ADD_F32, VFLATOp.FLAT_ATOMIC_PK_ADD_F16, VFLATOp.FLAT_ATOMIC_PK_ADD_BF16}) + vdst = VGPRField(39, 32) + vaddr = VGPRField(71, 64) + saddr = SGPRField(6, 0, default=NULL) + nv = BitField(7, 7) + sve = BitField(49, 49) + scope = BitField(51, 50) + th = BitField(54, 52) + vsrc = VGPRField(62, 55) + ioffset = BitField(95, 72) + +class VGLOBAL(Inst): + encoding = FixedBitField(31, 24, 0b11101110) + op = EnumBitField(21, 14, VGLOBALOp, {VGLOBALOp.GLOBAL_LOAD_U8, VGLOBALOp.GLOBAL_LOAD_I8, VGLOBALOp.GLOBAL_LOAD_U16, VGLOBALOp.GLOBAL_LOAD_I16, VGLOBALOp.GLOBAL_LOAD_B32, VGLOBALOp.GLOBAL_LOAD_B64, VGLOBALOp.GLOBAL_LOAD_B96, VGLOBALOp.GLOBAL_LOAD_B128, VGLOBALOp.GLOBAL_STORE_B8, VGLOBALOp.GLOBAL_STORE_B16, VGLOBALOp.GLOBAL_STORE_B32, VGLOBALOp.GLOBAL_STORE_B64, VGLOBALOp.GLOBAL_STORE_B96, VGLOBALOp.GLOBAL_STORE_B128, VGLOBALOp.GLOBAL_LOAD_D16_U8, VGLOBALOp.GLOBAL_LOAD_D16_I8, VGLOBALOp.GLOBAL_LOAD_D16_B16, VGLOBALOp.GLOBAL_LOAD_D16_HI_U8, VGLOBALOp.GLOBAL_LOAD_D16_HI_I8, VGLOBALOp.GLOBAL_LOAD_D16_HI_B16, VGLOBALOp.GLOBAL_STORE_D16_HI_B8, VGLOBALOp.GLOBAL_STORE_D16_HI_B16, VGLOBALOp.GLOBAL_LOAD_ADDTID_B32, VGLOBALOp.GLOBAL_STORE_ADDTID_B32, VGLOBALOp.GLOBAL_INV, VGLOBALOp.GLOBAL_WB, VGLOBALOp.GLOBAL_ATOMIC_SWAP_B32, VGLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B32, VGLOBALOp.GLOBAL_ATOMIC_ADD_U32, VGLOBALOp.GLOBAL_ATOMIC_SUB_U32, VGLOBALOp.GLOBAL_ATOMIC_SUB_CLAMP_U32, VGLOBALOp.GLOBAL_ATOMIC_MIN_I32, VGLOBALOp.GLOBAL_ATOMIC_MIN_U32, VGLOBALOp.GLOBAL_ATOMIC_MAX_I32, VGLOBALOp.GLOBAL_ATOMIC_MAX_U32, VGLOBALOp.GLOBAL_ATOMIC_AND_B32, VGLOBALOp.GLOBAL_ATOMIC_OR_B32, VGLOBALOp.GLOBAL_ATOMIC_XOR_B32, VGLOBALOp.GLOBAL_ATOMIC_INC_U32, VGLOBALOp.GLOBAL_ATOMIC_DEC_U32, VGLOBALOp.GLOBAL_ATOMIC_SWAP_B64, VGLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B64, VGLOBALOp.GLOBAL_ATOMIC_ADD_U64, VGLOBALOp.GLOBAL_ATOMIC_SUB_U64, VGLOBALOp.GLOBAL_ATOMIC_MIN_I64, VGLOBALOp.GLOBAL_ATOMIC_MIN_U64, VGLOBALOp.GLOBAL_ATOMIC_MAX_I64, VGLOBALOp.GLOBAL_ATOMIC_MAX_U64, VGLOBALOp.GLOBAL_ATOMIC_AND_B64, VGLOBALOp.GLOBAL_ATOMIC_OR_B64, VGLOBALOp.GLOBAL_ATOMIC_XOR_B64, VGLOBALOp.GLOBAL_ATOMIC_INC_U64, VGLOBALOp.GLOBAL_ATOMIC_DEC_U64, VGLOBALOp.GLOBAL_WBINV, VGLOBALOp.GLOBAL_ATOMIC_COND_SUB_U32, VGLOBALOp.GLOBAL_ATOMIC_MIN_NUM_F32, VGLOBALOp.GLOBAL_ATOMIC_MAX_NUM_F32, VGLOBALOp.GLOBAL_LOAD_BLOCK, VGLOBALOp.GLOBAL_STORE_BLOCK, VGLOBALOp.GLOBAL_ATOMIC_ADD_F32, VGLOBALOp.GLOBAL_LOAD_TR_B128, VGLOBALOp.GLOBAL_LOAD_TR_B64, VGLOBALOp.GLOBAL_ATOMIC_PK_ADD_F16, VGLOBALOp.GLOBAL_ATOMIC_PK_ADD_BF16, VGLOBALOp.GLOBAL_ATOMIC_ORDERED_ADD_B64}) + vdst = VGPRField(39, 32) + vaddr = VGPRField(71, 64) + saddr = SGPRField(6, 0, default=NULL) + nv = BitField(7, 7) + sve = BitField(49, 49) + scope = BitField(51, 50) + th = BitField(54, 52) + vsrc = VGPRField(62, 55) + ioffset = BitField(95, 72) + +class VIMAGE(Inst): + encoding = FixedBitField(31, 26, 0b110100) + op = EnumBitField(21, 14, VIMAGEOp, {VIMAGEOp.IMAGE_LOAD, VIMAGEOp.IMAGE_LOAD_MIP, VIMAGEOp.IMAGE_LOAD_PCK, VIMAGEOp.IMAGE_LOAD_PCK_SGN, VIMAGEOp.IMAGE_LOAD_MIP_PCK, VIMAGEOp.IMAGE_LOAD_MIP_PCK_SGN, VIMAGEOp.IMAGE_STORE, VIMAGEOp.IMAGE_STORE_MIP, VIMAGEOp.IMAGE_STORE_PCK, VIMAGEOp.IMAGE_STORE_MIP_PCK, VIMAGEOp.IMAGE_ATOMIC_SWAP, VIMAGEOp.IMAGE_ATOMIC_CMPSWAP, VIMAGEOp.IMAGE_ATOMIC_ADD_UINT, VIMAGEOp.IMAGE_ATOMIC_SUB_UINT, VIMAGEOp.IMAGE_ATOMIC_MIN_INT, VIMAGEOp.IMAGE_ATOMIC_MIN_UINT, VIMAGEOp.IMAGE_ATOMIC_MAX_INT, VIMAGEOp.IMAGE_ATOMIC_MAX_UINT, VIMAGEOp.IMAGE_ATOMIC_AND, VIMAGEOp.IMAGE_ATOMIC_OR, VIMAGEOp.IMAGE_ATOMIC_XOR, VIMAGEOp.IMAGE_ATOMIC_INC_UINT, VIMAGEOp.IMAGE_ATOMIC_DEC_UINT, VIMAGEOp.IMAGE_GET_RESINFO, VIMAGEOp.IMAGE_BVH_INTERSECT_RAY, VIMAGEOp.IMAGE_BVH64_INTERSECT_RAY, VIMAGEOp.IMAGE_BVH_DUAL_INTERSECT_RAY, VIMAGEOp.IMAGE_BVH8_INTERSECT_RAY, VIMAGEOp.IMAGE_ATOMIC_ADD_FLT, VIMAGEOp.IMAGE_ATOMIC_MIN_FLT, VIMAGEOp.IMAGE_ATOMIC_MAX_FLT, VIMAGEOp.IMAGE_ATOMIC_PK_ADD_F16, VIMAGEOp.IMAGE_ATOMIC_PK_ADD_BF16}) + vdata = VGPRField(39, 32) + dmask = BitField(25, 22) + dim = BitField(2, 0) + tfe = BitField(55, 55) + r128 = BitField(4, 4) + d16 = BitField(5, 5) + a16 = BitField(6, 6) + nv = BitField(7, 7) + rsrc = BitField(49, 41) + scope = BitField(51, 50) + th = BitField(54, 52) + vaddr4 = BitField(63, 56) + vaddr0 = BitField(71, 64) + vaddr1 = BitField(79, 72) + vaddr2 = BitField(87, 80) + vaddr3 = BitField(95, 88) + +class VINTERP(Inst): + encoding = FixedBitField(31, 24, 0b11001101) + op = EnumBitField(20, 16, VINTERPOp, {VINTERPOp.V_INTERP_P10_F32, VINTERPOp.V_INTERP_P2_F32, VINTERPOp.V_INTERP_P10_F16_F32, VINTERPOp.V_INTERP_P2_F16_F32, VINTERPOp.V_INTERP_P10_RTZ_F16_F32, VINTERPOp.V_INTERP_P2_RTZ_F16_F32}) + vdst = VGPRField(7, 0) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + neg = BitField(63, 61) + clmp = BitField(15, 15) + opsel = BitField(14, 11) + waitexp = BitField(10, 8) + +class VOP1(Inst): + encoding = FixedBitField(31, 25, 0b0111111) + op = EnumBitField(15, 9, VOP1Op, {VOP1Op.V_NOP, VOP1Op.V_MOV_B32, VOP1Op.V_CVT_I32_F64, VOP1Op.V_CVT_F64_I32, VOP1Op.V_CVT_F32_I32, VOP1Op.V_CVT_F32_U32, VOP1Op.V_CVT_U32_F32, VOP1Op.V_CVT_I32_F32, VOP1Op.V_CVT_F16_F32, VOP1Op.V_CVT_F32_F16, VOP1Op.V_CVT_NEAREST_I32_F32, VOP1Op.V_CVT_FLOOR_I32_F32, VOP1Op.V_CVT_OFF_F32_I4, VOP1Op.V_CVT_F32_F64, VOP1Op.V_CVT_F64_F32, VOP1Op.V_CVT_F32_UBYTE0, VOP1Op.V_CVT_F32_UBYTE1, VOP1Op.V_CVT_F32_UBYTE2, VOP1Op.V_CVT_F32_UBYTE3, VOP1Op.V_CVT_U32_F64, VOP1Op.V_CVT_F64_U32, VOP1Op.V_TRUNC_F64, VOP1Op.V_CEIL_F64, VOP1Op.V_RNDNE_F64, VOP1Op.V_FLOOR_F64, VOP1Op.V_PIPEFLUSH, VOP1Op.V_MOV_B16, VOP1Op.V_FRACT_F32, VOP1Op.V_TRUNC_F32, VOP1Op.V_CEIL_F32, VOP1Op.V_RNDNE_F32, VOP1Op.V_FLOOR_F32, VOP1Op.V_EXP_F32, VOP1Op.V_LOG_F32, VOP1Op.V_RCP_F32, VOP1Op.V_RCP_IFLAG_F32, VOP1Op.V_RSQ_F32, VOP1Op.V_RCP_F64, VOP1Op.V_RSQ_F64, VOP1Op.V_SQRT_F32, VOP1Op.V_SQRT_F64, VOP1Op.V_SIN_F32, VOP1Op.V_COS_F32, VOP1Op.V_NOT_B32, VOP1Op.V_BFREV_B32, VOP1Op.V_CLZ_I32_U32, VOP1Op.V_CTZ_I32_B32, VOP1Op.V_CLS_I32, VOP1Op.V_FREXP_EXP_I32_F64, VOP1Op.V_FREXP_MANT_F64, VOP1Op.V_FRACT_F64, VOP1Op.V_FREXP_EXP_I32_F32, VOP1Op.V_FREXP_MANT_F32, VOP1Op.V_MOVRELD_B32, VOP1Op.V_MOVRELS_B32, VOP1Op.V_MOVRELSD_B32, VOP1Op.V_MOVRELSD_2_B32, VOP1Op.V_CVT_F16_U16, VOP1Op.V_CVT_F16_I16, VOP1Op.V_CVT_U16_F16, VOP1Op.V_CVT_I16_F16, VOP1Op.V_RCP_F16, VOP1Op.V_SQRT_F16, VOP1Op.V_RSQ_F16, VOP1Op.V_LOG_F16, VOP1Op.V_EXP_F16, VOP1Op.V_FREXP_MANT_F16, VOP1Op.V_FREXP_EXP_I16_F16, VOP1Op.V_FLOOR_F16, VOP1Op.V_CEIL_F16, VOP1Op.V_TRUNC_F16, VOP1Op.V_RNDNE_F16, VOP1Op.V_FRACT_F16, VOP1Op.V_SIN_F16, VOP1Op.V_COS_F16, VOP1Op.V_SAT_PK_U8_I16, VOP1Op.V_CVT_NORM_I16_F16, VOP1Op.V_CVT_NORM_U16_F16, VOP1Op.V_SWAP_B32, VOP1Op.V_SWAP_B16, VOP1Op.V_PERMLANE64_B32, VOP1Op.V_SWAPREL_B32, VOP1Op.V_NOT_B16, VOP1Op.V_CVT_I32_I16, VOP1Op.V_CVT_U32_U16, VOP1Op.V_CVT_F32_FP8, VOP1Op.V_CVT_F32_BF8, VOP1Op.V_CVT_PK_F32_FP8, VOP1Op.V_CVT_PK_F32_BF8}) + vdst = VGPRField(24, 17) + src0 = SrcField(8, 0) + +class VOP2(Inst): + encoding = FixedBitField(31, 31, 0b0) + op = EnumBitField(30, 25, VOP2Op, {VOP2Op.V_CNDMASK_B32, VOP2Op.V_ADD_F64, VOP2Op.V_ADD_F32, VOP2Op.V_SUB_F32, VOP2Op.V_SUBREV_F32, VOP2Op.V_MUL_F64, VOP2Op.V_MUL_DX9_ZERO_F32, VOP2Op.V_MUL_F32, VOP2Op.V_MUL_I32_I24, VOP2Op.V_MUL_HI_I32_I24, VOP2Op.V_MUL_U32_U24, VOP2Op.V_MUL_HI_U32_U24, VOP2Op.V_MIN_NUM_F64, VOP2Op.V_MAX_NUM_F64, VOP2Op.V_MIN_I32, VOP2Op.V_MAX_I32, VOP2Op.V_MIN_U32, VOP2Op.V_MAX_U32, VOP2Op.V_MIN_NUM_F32, VOP2Op.V_MAX_NUM_F32, VOP2Op.V_LSHLREV_B32, VOP2Op.V_LSHRREV_B32, VOP2Op.V_ASHRREV_I32, VOP2Op.V_AND_B32, VOP2Op.V_OR_B32, VOP2Op.V_XOR_B32, VOP2Op.V_XNOR_B32, VOP2Op.V_LSHLREV_B64, VOP2Op.V_ADD_CO_CI_U32, VOP2Op.V_SUB_CO_CI_U32, VOP2Op.V_SUBREV_CO_CI_U32, VOP2Op.V_ADD_NC_U32, VOP2Op.V_SUB_NC_U32, VOP2Op.V_SUBREV_NC_U32, VOP2Op.V_FMAC_F32, VOP2Op.V_CVT_PK_RTZ_F16_F32, VOP2Op.V_MIN_NUM_F16, VOP2Op.V_MAX_NUM_F16, VOP2Op.V_ADD_F16, VOP2Op.V_SUB_F16, VOP2Op.V_SUBREV_F16, VOP2Op.V_MUL_F16, VOP2Op.V_FMAC_F16, VOP2Op.V_LDEXP_F16, VOP2Op.V_PK_FMAC_F16}) + vdst = VGPRField(24, 17) + src0 = SrcField(8, 0) + vsrc1 = VGPRField(16, 9) + +class VOP3(Inst): + encoding = FixedBitField(31, 26, 0b110101) + op = EnumBitField(25, 16, VOP3Op, {VOP3Op.V_CMPX_LT_F16, VOP3Op.V_CMPX_EQ_F16, VOP3Op.V_CMPX_LE_F16, VOP3Op.V_CMPX_GT_F16, VOP3Op.V_CMPX_LG_F16, VOP3Op.V_CMPX_GE_F16, VOP3Op.V_CMPX_O_F16, VOP3Op.V_CMPX_U_F16, VOP3Op.V_CMPX_NGE_F16, VOP3Op.V_CMPX_NLG_F16, VOP3Op.V_CMPX_NGT_F16, VOP3Op.V_CMPX_NLE_F16, VOP3Op.V_CMPX_NEQ_F16, VOP3Op.V_CMPX_NLT_F16, VOP3Op.V_CMPX_LT_F32, VOP3Op.V_CMPX_EQ_F32, VOP3Op.V_CMPX_LE_F32, VOP3Op.V_CMPX_GT_F32, VOP3Op.V_CMPX_LG_F32, VOP3Op.V_CMPX_GE_F32, VOP3Op.V_CMPX_O_F32, VOP3Op.V_CMPX_U_F32, VOP3Op.V_CMPX_NGE_F32, VOP3Op.V_CMPX_NLG_F32, VOP3Op.V_CMPX_NGT_F32, VOP3Op.V_CMPX_NLE_F32, VOP3Op.V_CMPX_NEQ_F32, VOP3Op.V_CMPX_NLT_F32, VOP3Op.V_CMPX_LT_F64, VOP3Op.V_CMPX_EQ_F64, VOP3Op.V_CMPX_LE_F64, VOP3Op.V_CMPX_GT_F64, VOP3Op.V_CMPX_LG_F64, VOP3Op.V_CMPX_GE_F64, VOP3Op.V_CMPX_O_F64, VOP3Op.V_CMPX_U_F64, VOP3Op.V_CMPX_NGE_F64, VOP3Op.V_CMPX_NLG_F64, VOP3Op.V_CMPX_NGT_F64, VOP3Op.V_CMPX_NLE_F64, VOP3Op.V_CMPX_NEQ_F64, VOP3Op.V_CMPX_NLT_F64, VOP3Op.V_CMPX_LT_I16, VOP3Op.V_CMPX_EQ_I16, VOP3Op.V_CMPX_LE_I16, VOP3Op.V_CMPX_GT_I16, VOP3Op.V_CMPX_NE_I16, VOP3Op.V_CMPX_GE_I16, VOP3Op.V_CMPX_LT_U16, VOP3Op.V_CMPX_EQ_U16, VOP3Op.V_CMPX_LE_U16, VOP3Op.V_CMPX_GT_U16, VOP3Op.V_CMPX_NE_U16, VOP3Op.V_CMPX_GE_U16, VOP3Op.V_CMPX_LT_I32, VOP3Op.V_CMPX_EQ_I32, VOP3Op.V_CMPX_LE_I32, VOP3Op.V_CMPX_GT_I32, VOP3Op.V_CMPX_NE_I32, VOP3Op.V_CMPX_GE_I32, VOP3Op.V_CMPX_LT_U32, VOP3Op.V_CMPX_EQ_U32, VOP3Op.V_CMPX_LE_U32, VOP3Op.V_CMPX_GT_U32, VOP3Op.V_CMPX_NE_U32, VOP3Op.V_CMPX_GE_U32, VOP3Op.V_CMPX_LT_I64, VOP3Op.V_CMPX_EQ_I64, VOP3Op.V_CMPX_LE_I64, VOP3Op.V_CMPX_GT_I64, VOP3Op.V_CMPX_NE_I64, VOP3Op.V_CMPX_GE_I64, VOP3Op.V_CMPX_LT_U64, VOP3Op.V_CMPX_EQ_U64, VOP3Op.V_CMPX_LE_U64, VOP3Op.V_CMPX_GT_U64, VOP3Op.V_CMPX_NE_U64, VOP3Op.V_CMPX_GE_U64, VOP3Op.V_CMPX_CLASS_F16, VOP3Op.V_CMPX_CLASS_F32, VOP3Op.V_CMPX_CLASS_F64, VOP3Op.V_CNDMASK_B32, VOP3Op.V_ADD_F64, VOP3Op.V_ADD_F32, VOP3Op.V_SUB_F32, VOP3Op.V_SUBREV_F32, VOP3Op.V_MUL_F64, VOP3Op.V_MUL_DX9_ZERO_F32, VOP3Op.V_MUL_F32, VOP3Op.V_MUL_I32_I24, VOP3Op.V_MUL_HI_I32_I24, VOP3Op.V_MUL_U32_U24, VOP3Op.V_MUL_HI_U32_U24, VOP3Op.V_MIN_NUM_F64, VOP3Op.V_MAX_NUM_F64, VOP3Op.V_MIN_I32, VOP3Op.V_MAX_I32, VOP3Op.V_MIN_U32, VOP3Op.V_MAX_U32, VOP3Op.V_MIN_NUM_F32, VOP3Op.V_MAX_NUM_F32, VOP3Op.V_LSHLREV_B32, VOP3Op.V_LSHRREV_B32, VOP3Op.V_ASHRREV_I32, VOP3Op.V_AND_B32, VOP3Op.V_OR_B32, VOP3Op.V_XOR_B32, VOP3Op.V_XNOR_B32, VOP3Op.V_LSHLREV_B64, VOP3Op.V_ADD_NC_U32, VOP3Op.V_SUB_NC_U32, VOP3Op.V_SUBREV_NC_U32, VOP3Op.V_FMAC_F32, VOP3Op.V_CVT_PK_RTZ_F16_F32, VOP3Op.V_MIN_NUM_F16, VOP3Op.V_MAX_NUM_F16, VOP3Op.V_ADD_F16, VOP3Op.V_SUB_F16, VOP3Op.V_SUBREV_F16, VOP3Op.V_MUL_F16, VOP3Op.V_FMAC_F16, VOP3Op.V_LDEXP_F16, VOP3Op.V_NOP, VOP3Op.V_MOV_B32, VOP3Op.V_CVT_I32_F64, VOP3Op.V_CVT_F64_I32, VOP3Op.V_CVT_F32_I32, VOP3Op.V_CVT_F32_U32, VOP3Op.V_CVT_U32_F32, VOP3Op.V_CVT_I32_F32, VOP3Op.V_CVT_F16_F32, VOP3Op.V_CVT_F32_F16, VOP3Op.V_CVT_NEAREST_I32_F32, VOP3Op.V_CVT_FLOOR_I32_F32, VOP3Op.V_CVT_OFF_F32_I4, VOP3Op.V_CVT_F32_F64, VOP3Op.V_CVT_F64_F32, VOP3Op.V_CVT_F32_UBYTE0, VOP3Op.V_CVT_F32_UBYTE1, VOP3Op.V_CVT_F32_UBYTE2, VOP3Op.V_CVT_F32_UBYTE3, VOP3Op.V_CVT_U32_F64, VOP3Op.V_CVT_F64_U32, VOP3Op.V_TRUNC_F64, VOP3Op.V_CEIL_F64, VOP3Op.V_RNDNE_F64, VOP3Op.V_FLOOR_F64, VOP3Op.V_PIPEFLUSH, VOP3Op.V_MOV_B16, VOP3Op.V_FRACT_F32, VOP3Op.V_TRUNC_F32, VOP3Op.V_CEIL_F32, VOP3Op.V_RNDNE_F32, VOP3Op.V_FLOOR_F32, VOP3Op.V_EXP_F32, VOP3Op.V_LOG_F32, VOP3Op.V_RCP_F32, VOP3Op.V_RCP_IFLAG_F32, VOP3Op.V_RSQ_F32, VOP3Op.V_RCP_F64, VOP3Op.V_RSQ_F64, VOP3Op.V_SQRT_F32, VOP3Op.V_SQRT_F64, VOP3Op.V_SIN_F32, VOP3Op.V_COS_F32, VOP3Op.V_NOT_B32, VOP3Op.V_BFREV_B32, VOP3Op.V_CLZ_I32_U32, VOP3Op.V_CTZ_I32_B32, VOP3Op.V_CLS_I32, VOP3Op.V_FREXP_EXP_I32_F64, VOP3Op.V_FREXP_MANT_F64, VOP3Op.V_FRACT_F64, VOP3Op.V_FREXP_EXP_I32_F32, VOP3Op.V_FREXP_MANT_F32, VOP3Op.V_MOVRELD_B32, VOP3Op.V_MOVRELS_B32, VOP3Op.V_MOVRELSD_B32, VOP3Op.V_MOVRELSD_2_B32, VOP3Op.V_CVT_F16_U16, VOP3Op.V_CVT_F16_I16, VOP3Op.V_CVT_U16_F16, VOP3Op.V_CVT_I16_F16, VOP3Op.V_RCP_F16, VOP3Op.V_SQRT_F16, VOP3Op.V_RSQ_F16, VOP3Op.V_LOG_F16, VOP3Op.V_EXP_F16, VOP3Op.V_FREXP_MANT_F16, VOP3Op.V_FREXP_EXP_I16_F16, VOP3Op.V_FLOOR_F16, VOP3Op.V_CEIL_F16, VOP3Op.V_TRUNC_F16, VOP3Op.V_RNDNE_F16, VOP3Op.V_FRACT_F16, VOP3Op.V_SIN_F16, VOP3Op.V_COS_F16, VOP3Op.V_SAT_PK_U8_I16, VOP3Op.V_CVT_NORM_I16_F16, VOP3Op.V_CVT_NORM_U16_F16, VOP3Op.V_NOT_B16, VOP3Op.V_CVT_I32_I16, VOP3Op.V_CVT_U32_U16, VOP3Op.V_CVT_F32_FP8, VOP3Op.V_CVT_F32_BF8, VOP3Op.V_CVT_PK_F32_FP8, VOP3Op.V_CVT_PK_F32_BF8, VOP3Op.V_FMA_DX9_ZERO_F32, VOP3Op.V_MAD_I32_I24, VOP3Op.V_MAD_U32_U24, VOP3Op.V_CUBEID_F32, VOP3Op.V_CUBESC_F32, VOP3Op.V_CUBETC_F32, VOP3Op.V_CUBEMA_F32, VOP3Op.V_BFE_U32, VOP3Op.V_BFE_I32, VOP3Op.V_BFI_B32, VOP3Op.V_FMA_F32, VOP3Op.V_FMA_F64, VOP3Op.V_LERP_U8, VOP3Op.V_ALIGNBIT_B32, VOP3Op.V_ALIGNBYTE_B32, VOP3Op.V_MULLIT_F32, VOP3Op.V_MIN3_I32, VOP3Op.V_MIN3_U32, VOP3Op.V_MAX3_I32, VOP3Op.V_MAX3_U32, VOP3Op.V_MED3_I32, VOP3Op.V_MED3_U32, VOP3Op.V_SAD_U8, VOP3Op.V_SAD_HI_U8, VOP3Op.V_SAD_U16, VOP3Op.V_SAD_U32, VOP3Op.V_CVT_PK_U8_F32, VOP3Op.V_DIV_FIXUP_F32, VOP3Op.V_DIV_FIXUP_F64, VOP3Op.V_MIN3_NUM_F32, VOP3Op.V_MAX3_NUM_F32, VOP3Op.V_MIN3_NUM_F16, VOP3Op.V_MAX3_NUM_F16, VOP3Op.V_MINIMUM3_F32, VOP3Op.V_MAXIMUM3_F32, VOP3Op.V_MINIMUM3_F16, VOP3Op.V_MAXIMUM3_F16, VOP3Op.V_MED3_NUM_F32, VOP3Op.V_MED3_NUM_F16, VOP3Op.V_DIV_FMAS_F32, VOP3Op.V_DIV_FMAS_F64, VOP3Op.V_MSAD_U8, VOP3Op.V_QSAD_PK_U16_U8, VOP3Op.V_MQSAD_PK_U16_U8, VOP3Op.V_MQSAD_U32_U8, VOP3Op.V_XOR3_B32, VOP3Op.V_MAD_U16, VOP3Op.V_PERM_B32, VOP3Op.V_XAD_U32, VOP3Op.V_LSHL_ADD_U32, VOP3Op.V_ADD_LSHL_U32, VOP3Op.V_FMA_F16, VOP3Op.V_MIN3_I16, VOP3Op.V_MIN3_U16, VOP3Op.V_MAX3_I16, VOP3Op.V_MAX3_U16, VOP3Op.V_MED3_I16, VOP3Op.V_MED3_U16, VOP3Op.V_MAD_I16, VOP3Op.V_DIV_FIXUP_F16, VOP3Op.V_ADD3_U32, VOP3Op.V_LSHL_OR_B32, VOP3Op.V_AND_OR_B32, VOP3Op.V_OR3_B32, VOP3Op.V_MAD_U32_U16, VOP3Op.V_MAD_I32_I16, VOP3Op.V_PERMLANE16_B32, VOP3Op.V_PERMLANEX16_B32, VOP3Op.V_CNDMASK_B16, VOP3Op.V_MAXMIN_U32, VOP3Op.V_MINMAX_U32, VOP3Op.V_MAXMIN_I32, VOP3Op.V_MINMAX_I32, VOP3Op.V_DOT2_F16_F16, VOP3Op.V_DOT2_BF16_BF16, VOP3Op.V_MINMAX_NUM_F32, VOP3Op.V_MAXMIN_NUM_F32, VOP3Op.V_MINMAX_NUM_F16, VOP3Op.V_MAXMIN_NUM_F16, VOP3Op.V_MINIMUMMAXIMUM_F32, VOP3Op.V_MAXIMUMMINIMUM_F32, VOP3Op.V_MINIMUMMAXIMUM_F16, VOP3Op.V_MAXIMUMMINIMUM_F16, VOP3Op.V_ADD_NC_U16, VOP3Op.V_SUB_NC_U16, VOP3Op.V_MUL_LO_U16, VOP3Op.V_CVT_PK_I16_F32, VOP3Op.V_CVT_PK_U16_F32, VOP3Op.V_MAX_U16, VOP3Op.V_MAX_I16, VOP3Op.V_MIN_U16, VOP3Op.V_MIN_I16, VOP3Op.V_ADD_NC_I16, VOP3Op.V_SUB_NC_I16, VOP3Op.V_PERMLANE16_VAR_B32, VOP3Op.V_PERMLANEX16_VAR_B32, VOP3Op.V_PACK_B32_F16, VOP3Op.V_CVT_PK_NORM_I16_F16, VOP3Op.V_CVT_PK_NORM_U16_F16, VOP3Op.V_LDEXP_F32, VOP3Op.V_BFM_B32, VOP3Op.V_BCNT_U32_B32, VOP3Op.V_MBCNT_LO_U32_B32, VOP3Op.V_MBCNT_HI_U32_B32, VOP3Op.V_CVT_PK_NORM_I16_F32, VOP3Op.V_CVT_PK_NORM_U16_F32, VOP3Op.V_CVT_PK_U16_U32, VOP3Op.V_CVT_PK_I16_I32, VOP3Op.V_SUB_NC_I32, VOP3Op.V_ADD_NC_I32, VOP3Op.V_LDEXP_F64, VOP3Op.V_MUL_LO_U32, VOP3Op.V_MUL_HI_U32, VOP3Op.V_MUL_HI_I32, VOP3Op.V_TRIG_PREOP_F64, VOP3Op.V_LSHLREV_B16, VOP3Op.V_LSHRREV_B16, VOP3Op.V_ASHRREV_I16, VOP3Op.V_LSHRREV_B64, VOP3Op.V_ASHRREV_I64, VOP3Op.V_MINIMUM_F64, VOP3Op.V_MAXIMUM_F64, VOP3Op.V_WRITELANE_B32, VOP3Op.V_AND_B16, VOP3Op.V_OR_B16, VOP3Op.V_XOR_B16, VOP3Op.V_MINIMUM_F32, VOP3Op.V_MAXIMUM_F32, VOP3Op.V_MINIMUM_F16, VOP3Op.V_MAXIMUM_F16, VOP3Op.V_CVT_PK_FP8_F32, VOP3Op.V_CVT_PK_BF8_F32, VOP3Op.V_CVT_SR_FP8_F32, VOP3Op.V_CVT_SR_BF8_F32}) + vdst = VGPRField(7, 0) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + omod = BitField(60, 59) + neg = BitField(63, 61) + abs = BitField(10, 8) + clmp = BitField(15, 15) + opsel = BitField(14, 11) + +class VOP3P(Inst): + encoding = FixedBitField(31, 24, 0b11001100) + op = EnumBitField(22, 16, VOP3POp, {VOP3POp.V_PK_MAD_I16, VOP3POp.V_PK_MUL_LO_U16, VOP3POp.V_PK_ADD_I16, VOP3POp.V_PK_SUB_I16, VOP3POp.V_PK_LSHLREV_B16, VOP3POp.V_PK_LSHRREV_B16, VOP3POp.V_PK_ASHRREV_I16, VOP3POp.V_PK_MAX_I16, VOP3POp.V_PK_MIN_I16, VOP3POp.V_PK_MAD_U16, VOP3POp.V_PK_ADD_U16, VOP3POp.V_PK_SUB_U16, VOP3POp.V_PK_MAX_U16, VOP3POp.V_PK_MIN_U16, VOP3POp.V_PK_FMA_F16, VOP3POp.V_PK_ADD_F16, VOP3POp.V_PK_MUL_F16, VOP3POp.V_DOT2_F32_F16, VOP3POp.V_DOT4_I32_IU8, VOP3POp.V_DOT4_U32_U8, VOP3POp.V_DOT8_I32_IU4, VOP3POp.V_DOT8_U32_U4, VOP3POp.V_DOT2_F32_BF16, VOP3POp.V_PK_MIN_NUM_F16, VOP3POp.V_PK_MAX_NUM_F16, VOP3POp.V_PK_MINIMUM_F16, VOP3POp.V_PK_MAXIMUM_F16, VOP3POp.V_FMA_MIX_F32, VOP3POp.V_FMA_MIXLO_F16, VOP3POp.V_FMA_MIXHI_F16, VOP3POp.V_DOT4_F32_FP8_BF8, VOP3POp.V_DOT4_F32_BF8_FP8, VOP3POp.V_DOT4_F32_FP8_FP8, VOP3POp.V_DOT4_F32_BF8_BF8, VOP3POp.V_WMMA_F32_16X16X16_F16, VOP3POp.V_WMMA_F32_16X16X16_BF16, VOP3POp.V_WMMA_F16_16X16X16_F16, VOP3POp.V_WMMA_BF16_16X16X16_BF16, VOP3POp.V_WMMA_I32_16X16X16_IU8, VOP3POp.V_WMMA_I32_16X16X16_IU4, VOP3POp.V_WMMA_F32_16X16X16_FP8_FP8, VOP3POp.V_WMMA_F32_16X16X16_FP8_BF8, VOP3POp.V_WMMA_F32_16X16X16_BF8_FP8, VOP3POp.V_WMMA_F32_16X16X16_BF8_BF8, VOP3POp.V_WMMA_I32_16X16X32_IU4, VOP3POp.V_SWMMAC_F32_16X16X32_F16, VOP3POp.V_SWMMAC_F32_16X16X32_BF16, VOP3POp.V_SWMMAC_F16_16X16X32_F16, VOP3POp.V_SWMMAC_BF16_16X16X32_BF16, VOP3POp.V_SWMMAC_I32_16X16X32_IU8, VOP3POp.V_SWMMAC_I32_16X16X32_IU4, VOP3POp.V_SWMMAC_I32_16X16X64_IU4, VOP3POp.V_SWMMAC_F32_16X16X32_FP8_FP8, VOP3POp.V_SWMMAC_F32_16X16X32_FP8_BF8, VOP3POp.V_SWMMAC_F32_16X16X32_BF8_FP8, VOP3POp.V_SWMMAC_F32_16X16X32_BF8_BF8}) + vdst = VGPRField(7, 0) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + neg = BitField(63, 61) + neg_hi = BitField(10, 8) + clmp = BitField(15, 15) + opsel = BitField(13, 11) + opsel_hi = BitField(60, 59, default=3) + opsel_hi2 = BitField(14, 14, default=1) + +class VOP3SD(Inst): + encoding = FixedBitField(31, 26, 0b110101) + op = EnumBitField(25, 16, VOP3SDOp, {VOP3SDOp.V_ADD_CO_CI_U32, VOP3SDOp.V_SUB_CO_CI_U32, VOP3SDOp.V_SUBREV_CO_CI_U32, VOP3SDOp.V_DIV_SCALE_F32, VOP3SDOp.V_DIV_SCALE_F64, VOP3SDOp.V_MAD_CO_U64_U32, VOP3SDOp.V_MAD_CO_I64_I32, VOP3SDOp.V_ADD_CO_U32, VOP3SDOp.V_SUB_CO_U32, VOP3SDOp.V_SUBREV_CO_U32}) + vdst = VGPRField(7, 0) + sdst = SGPRField(14, 8) + src0 = SrcField(40, 32) + src1 = SrcField(49, 41) + src2 = SrcField(58, 50) + omod = BitField(60, 59) + neg = BitField(63, 61) + clmp = BitField(15, 15) + +class VOPC(Inst): + encoding = FixedBitField(31, 25, 0b0111110) + op = EnumBitField(24, 17, VOPCOp, {VOPCOp.V_CMP_LT_F16, VOPCOp.V_CMP_EQ_F16, VOPCOp.V_CMP_LE_F16, VOPCOp.V_CMP_GT_F16, VOPCOp.V_CMP_LG_F16, VOPCOp.V_CMP_GE_F16, VOPCOp.V_CMP_O_F16, VOPCOp.V_CMP_U_F16, VOPCOp.V_CMP_NGE_F16, VOPCOp.V_CMP_NLG_F16, VOPCOp.V_CMP_NGT_F16, VOPCOp.V_CMP_NLE_F16, VOPCOp.V_CMP_NEQ_F16, VOPCOp.V_CMP_NLT_F16, VOPCOp.V_CMP_LT_F32, VOPCOp.V_CMP_EQ_F32, VOPCOp.V_CMP_LE_F32, VOPCOp.V_CMP_GT_F32, VOPCOp.V_CMP_LG_F32, VOPCOp.V_CMP_GE_F32, VOPCOp.V_CMP_O_F32, VOPCOp.V_CMP_U_F32, VOPCOp.V_CMP_NGE_F32, VOPCOp.V_CMP_NLG_F32, VOPCOp.V_CMP_NGT_F32, VOPCOp.V_CMP_NLE_F32, VOPCOp.V_CMP_NEQ_F32, VOPCOp.V_CMP_NLT_F32, VOPCOp.V_CMP_LT_F64, VOPCOp.V_CMP_EQ_F64, VOPCOp.V_CMP_LE_F64, VOPCOp.V_CMP_GT_F64, VOPCOp.V_CMP_LG_F64, VOPCOp.V_CMP_GE_F64, VOPCOp.V_CMP_O_F64, VOPCOp.V_CMP_U_F64, VOPCOp.V_CMP_NGE_F64, VOPCOp.V_CMP_NLG_F64, VOPCOp.V_CMP_NGT_F64, VOPCOp.V_CMP_NLE_F64, VOPCOp.V_CMP_NEQ_F64, VOPCOp.V_CMP_NLT_F64, VOPCOp.V_CMP_LT_I16, VOPCOp.V_CMP_EQ_I16, VOPCOp.V_CMP_LE_I16, VOPCOp.V_CMP_GT_I16, VOPCOp.V_CMP_NE_I16, VOPCOp.V_CMP_GE_I16, VOPCOp.V_CMP_LT_U16, VOPCOp.V_CMP_EQ_U16, VOPCOp.V_CMP_LE_U16, VOPCOp.V_CMP_GT_U16, VOPCOp.V_CMP_NE_U16, VOPCOp.V_CMP_GE_U16, VOPCOp.V_CMP_LT_I32, VOPCOp.V_CMP_EQ_I32, VOPCOp.V_CMP_LE_I32, VOPCOp.V_CMP_GT_I32, VOPCOp.V_CMP_NE_I32, VOPCOp.V_CMP_GE_I32, VOPCOp.V_CMP_LT_U32, VOPCOp.V_CMP_EQ_U32, VOPCOp.V_CMP_LE_U32, VOPCOp.V_CMP_GT_U32, VOPCOp.V_CMP_NE_U32, VOPCOp.V_CMP_GE_U32, VOPCOp.V_CMP_LT_I64, VOPCOp.V_CMP_EQ_I64, VOPCOp.V_CMP_LE_I64, VOPCOp.V_CMP_GT_I64, VOPCOp.V_CMP_NE_I64, VOPCOp.V_CMP_GE_I64, VOPCOp.V_CMP_LT_U64, VOPCOp.V_CMP_EQ_U64, VOPCOp.V_CMP_LE_U64, VOPCOp.V_CMP_GT_U64, VOPCOp.V_CMP_NE_U64, VOPCOp.V_CMP_GE_U64, VOPCOp.V_CMP_CLASS_F16, VOPCOp.V_CMP_CLASS_F32, VOPCOp.V_CMP_CLASS_F64, VOPCOp.V_CMPX_LT_F16, VOPCOp.V_CMPX_EQ_F16, VOPCOp.V_CMPX_LE_F16, VOPCOp.V_CMPX_GT_F16, VOPCOp.V_CMPX_LG_F16, VOPCOp.V_CMPX_GE_F16, VOPCOp.V_CMPX_O_F16, VOPCOp.V_CMPX_U_F16, VOPCOp.V_CMPX_NGE_F16, VOPCOp.V_CMPX_NLG_F16, VOPCOp.V_CMPX_NGT_F16, VOPCOp.V_CMPX_NLE_F16, VOPCOp.V_CMPX_NEQ_F16, VOPCOp.V_CMPX_NLT_F16, VOPCOp.V_CMPX_LT_F32, VOPCOp.V_CMPX_EQ_F32, VOPCOp.V_CMPX_LE_F32, VOPCOp.V_CMPX_GT_F32, VOPCOp.V_CMPX_LG_F32, VOPCOp.V_CMPX_GE_F32, VOPCOp.V_CMPX_O_F32, VOPCOp.V_CMPX_U_F32, VOPCOp.V_CMPX_NGE_F32, VOPCOp.V_CMPX_NLG_F32, VOPCOp.V_CMPX_NGT_F32, VOPCOp.V_CMPX_NLE_F32, VOPCOp.V_CMPX_NEQ_F32, VOPCOp.V_CMPX_NLT_F32, VOPCOp.V_CMPX_LT_F64, VOPCOp.V_CMPX_EQ_F64, VOPCOp.V_CMPX_LE_F64, VOPCOp.V_CMPX_GT_F64, VOPCOp.V_CMPX_LG_F64, VOPCOp.V_CMPX_GE_F64, VOPCOp.V_CMPX_O_F64, VOPCOp.V_CMPX_U_F64, VOPCOp.V_CMPX_NGE_F64, VOPCOp.V_CMPX_NLG_F64, VOPCOp.V_CMPX_NGT_F64, VOPCOp.V_CMPX_NLE_F64, VOPCOp.V_CMPX_NEQ_F64, VOPCOp.V_CMPX_NLT_F64, VOPCOp.V_CMPX_LT_I16, VOPCOp.V_CMPX_EQ_I16, VOPCOp.V_CMPX_LE_I16, VOPCOp.V_CMPX_GT_I16, VOPCOp.V_CMPX_NE_I16, VOPCOp.V_CMPX_GE_I16, VOPCOp.V_CMPX_LT_U16, VOPCOp.V_CMPX_EQ_U16, VOPCOp.V_CMPX_LE_U16, VOPCOp.V_CMPX_GT_U16, VOPCOp.V_CMPX_NE_U16, VOPCOp.V_CMPX_GE_U16, VOPCOp.V_CMPX_LT_I32, VOPCOp.V_CMPX_EQ_I32, VOPCOp.V_CMPX_LE_I32, VOPCOp.V_CMPX_GT_I32, VOPCOp.V_CMPX_NE_I32, VOPCOp.V_CMPX_GE_I32, VOPCOp.V_CMPX_LT_U32, VOPCOp.V_CMPX_EQ_U32, VOPCOp.V_CMPX_LE_U32, VOPCOp.V_CMPX_GT_U32, VOPCOp.V_CMPX_NE_U32, VOPCOp.V_CMPX_GE_U32, VOPCOp.V_CMPX_LT_I64, VOPCOp.V_CMPX_EQ_I64, VOPCOp.V_CMPX_LE_I64, VOPCOp.V_CMPX_GT_I64, VOPCOp.V_CMPX_NE_I64, VOPCOp.V_CMPX_GE_I64, VOPCOp.V_CMPX_LT_U64, VOPCOp.V_CMPX_EQ_U64, VOPCOp.V_CMPX_LE_U64, VOPCOp.V_CMPX_GT_U64, VOPCOp.V_CMPX_NE_U64, VOPCOp.V_CMPX_GE_U64, VOPCOp.V_CMPX_CLASS_F16, VOPCOp.V_CMPX_CLASS_F32, VOPCOp.V_CMPX_CLASS_F64}) + src0 = SrcField(8, 0) + vsrc1 = VGPRField(16, 9) + +class VOPD(Inst): + encoding = FixedBitField(31, 26, 0b110010) + opx = EnumBitField(25, 22, VOPDOp) + opy = EnumBitField(21, 17, VOPDOp) + vdstx = VGPRField(63, 56) + vdsty = VDSTYField(55, 49) + srcx0 = SrcField(8, 0) + srcy0 = SrcField(40, 32) + vsrcx1 = VGPRField(16, 9) + vsrcy1 = VGPRField(48, 41) + +class VSAMPLE(Inst): + encoding = FixedBitField(31, 26, 0b111001) + op = EnumBitField(21, 14, VSAMPLEOp, {VSAMPLEOp.IMAGE_MSAA_LOAD, VSAMPLEOp.IMAGE_SAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D, VSAMPLEOp.IMAGE_SAMPLE_L, VSAMPLEOp.IMAGE_SAMPLE_B, VSAMPLEOp.IMAGE_SAMPLE_LZ, VSAMPLEOp.IMAGE_SAMPLE_C, VSAMPLEOp.IMAGE_SAMPLE_C_D, VSAMPLEOp.IMAGE_SAMPLE_C_L, VSAMPLEOp.IMAGE_SAMPLE_C_B, VSAMPLEOp.IMAGE_SAMPLE_C_LZ, VSAMPLEOp.IMAGE_SAMPLE_O, VSAMPLEOp.IMAGE_SAMPLE_D_O, VSAMPLEOp.IMAGE_SAMPLE_L_O, VSAMPLEOp.IMAGE_SAMPLE_B_O, VSAMPLEOp.IMAGE_SAMPLE_LZ_O, VSAMPLEOp.IMAGE_SAMPLE_C_O, VSAMPLEOp.IMAGE_SAMPLE_C_D_O, VSAMPLEOp.IMAGE_SAMPLE_C_L_O, VSAMPLEOp.IMAGE_SAMPLE_C_B_O, VSAMPLEOp.IMAGE_SAMPLE_C_LZ_O, VSAMPLEOp.IMAGE_GATHER4, VSAMPLEOp.IMAGE_GATHER4_L, VSAMPLEOp.IMAGE_GATHER4_B, VSAMPLEOp.IMAGE_GATHER4_LZ, VSAMPLEOp.IMAGE_GATHER4_C, VSAMPLEOp.IMAGE_GATHER4_C_LZ, VSAMPLEOp.IMAGE_GATHER4_O, VSAMPLEOp.IMAGE_GATHER4_LZ_O, VSAMPLEOp.IMAGE_GATHER4_C_LZ_O, VSAMPLEOp.IMAGE_GET_LOD, VSAMPLEOp.IMAGE_SAMPLE_D_G16, VSAMPLEOp.IMAGE_SAMPLE_C_D_G16, VSAMPLEOp.IMAGE_SAMPLE_D_O_G16, VSAMPLEOp.IMAGE_SAMPLE_C_D_O_G16, VSAMPLEOp.IMAGE_SAMPLE_CL, VSAMPLEOp.IMAGE_SAMPLE_D_CL, VSAMPLEOp.IMAGE_SAMPLE_B_CL, VSAMPLEOp.IMAGE_SAMPLE_C_CL, VSAMPLEOp.IMAGE_SAMPLE_C_D_CL, VSAMPLEOp.IMAGE_SAMPLE_C_B_CL, VSAMPLEOp.IMAGE_SAMPLE_CL_O, VSAMPLEOp.IMAGE_SAMPLE_D_CL_O, VSAMPLEOp.IMAGE_SAMPLE_B_CL_O, VSAMPLEOp.IMAGE_SAMPLE_C_CL_O, VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_O, VSAMPLEOp.IMAGE_SAMPLE_C_B_CL_O, VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_G16, VSAMPLEOp.IMAGE_SAMPLE_D_CL_O_G16, VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_O_G16, VSAMPLEOp.IMAGE_SAMPLE_D_CL_G16, VSAMPLEOp.IMAGE_GATHER4_CL, VSAMPLEOp.IMAGE_GATHER4_B_CL, VSAMPLEOp.IMAGE_GATHER4_C_CL, VSAMPLEOp.IMAGE_GATHER4_C_L, VSAMPLEOp.IMAGE_GATHER4_C_B, VSAMPLEOp.IMAGE_GATHER4_C_B_CL, VSAMPLEOp.IMAGE_GATHER4H}) + vdata = VGPRField(39, 32) + dmask = BitField(25, 22) + dim = BitField(2, 0) + tfe = BitField(3, 3) + unrm = BitField(13, 13) + r128 = BitField(4, 4) + d16 = BitField(5, 5) + a16 = BitField(6, 6) + nv = BitField(7, 7) + lwe = BitField(40, 40) + rsrc = BitField(49, 41) + scope = BitField(51, 50) + th = BitField(54, 52) + samp = BitField(63, 55) + vaddr0 = BitField(71, 64) + vaddr1 = BitField(79, 72) + vaddr2 = BitField(87, 80) + vaddr3 = BitField(95, 88) + +class VSCRATCH(Inst): + encoding = FixedBitField(31, 24, 0b11101101) + op = EnumBitField(21, 14, VSCRATCHOp, {VSCRATCHOp.SCRATCH_LOAD_U8, VSCRATCHOp.SCRATCH_LOAD_I8, VSCRATCHOp.SCRATCH_LOAD_U16, VSCRATCHOp.SCRATCH_LOAD_I16, VSCRATCHOp.SCRATCH_LOAD_B32, VSCRATCHOp.SCRATCH_LOAD_B64, VSCRATCHOp.SCRATCH_LOAD_B96, VSCRATCHOp.SCRATCH_LOAD_B128, VSCRATCHOp.SCRATCH_STORE_B8, VSCRATCHOp.SCRATCH_STORE_B16, VSCRATCHOp.SCRATCH_STORE_B32, VSCRATCHOp.SCRATCH_STORE_B64, VSCRATCHOp.SCRATCH_STORE_B96, VSCRATCHOp.SCRATCH_STORE_B128, VSCRATCHOp.SCRATCH_LOAD_D16_U8, VSCRATCHOp.SCRATCH_LOAD_D16_I8, VSCRATCHOp.SCRATCH_LOAD_D16_B16, VSCRATCHOp.SCRATCH_LOAD_D16_HI_U8, VSCRATCHOp.SCRATCH_LOAD_D16_HI_I8, VSCRATCHOp.SCRATCH_LOAD_D16_HI_B16, VSCRATCHOp.SCRATCH_STORE_D16_HI_B8, VSCRATCHOp.SCRATCH_STORE_D16_HI_B16, VSCRATCHOp.SCRATCH_LOAD_BLOCK, VSCRATCHOp.SCRATCH_STORE_BLOCK}) + vdst = VGPRField(39, 32) + vaddr = VGPRField(71, 64) + saddr = SGPRField(6, 0, default=NULL) + nv = BitField(7, 7) + sve = BitField(49, 49) + scope = BitField(51, 50) + th = BitField(54, 52) + vsrc = VGPRField(62, 55) + ioffset = BitField(95, 72) + +class SOP1_LIT(SOP1): + op = EnumBitField(15, 8, SOP1Op, {SOP1Op.S_MOV_B32, SOP1Op.S_MOV_B64, SOP1Op.S_CMOV_B32, SOP1Op.S_CMOV_B64, SOP1Op.S_BREV_B32, SOP1Op.S_BREV_B64, SOP1Op.S_CTZ_I32_B32, SOP1Op.S_CTZ_I32_B64, SOP1Op.S_CLZ_I32_U32, SOP1Op.S_CLZ_I32_U64, SOP1Op.S_CLS_I32, SOP1Op.S_CLS_I32_I64, SOP1Op.S_SEXT_I32_I8, SOP1Op.S_SEXT_I32_I16, SOP1Op.S_BITSET0_B32, SOP1Op.S_BITSET0_B64, SOP1Op.S_BITSET1_B32, SOP1Op.S_BITSET1_B64, SOP1Op.S_BITREPLICATE_B64_B32, SOP1Op.S_ABS_I32, SOP1Op.S_BCNT0_I32_B32, SOP1Op.S_BCNT0_I32_B64, SOP1Op.S_BCNT1_I32_B32, SOP1Op.S_BCNT1_I32_B64, SOP1Op.S_QUADMASK_B32, SOP1Op.S_QUADMASK_B64, SOP1Op.S_WQM_B32, SOP1Op.S_WQM_B64, SOP1Op.S_NOT_B32, SOP1Op.S_NOT_B64, SOP1Op.S_AND_SAVEEXEC_B32, SOP1Op.S_AND_SAVEEXEC_B64, SOP1Op.S_OR_SAVEEXEC_B32, SOP1Op.S_OR_SAVEEXEC_B64, SOP1Op.S_XOR_SAVEEXEC_B32, SOP1Op.S_XOR_SAVEEXEC_B64, SOP1Op.S_NAND_SAVEEXEC_B32, SOP1Op.S_NAND_SAVEEXEC_B64, SOP1Op.S_NOR_SAVEEXEC_B32, SOP1Op.S_NOR_SAVEEXEC_B64, SOP1Op.S_XNOR_SAVEEXEC_B32, SOP1Op.S_XNOR_SAVEEXEC_B64, SOP1Op.S_AND_NOT0_SAVEEXEC_B32, SOP1Op.S_AND_NOT0_SAVEEXEC_B64, SOP1Op.S_OR_NOT0_SAVEEXEC_B32, SOP1Op.S_OR_NOT0_SAVEEXEC_B64, SOP1Op.S_AND_NOT1_SAVEEXEC_B32, SOP1Op.S_AND_NOT1_SAVEEXEC_B64, SOP1Op.S_OR_NOT1_SAVEEXEC_B32, SOP1Op.S_OR_NOT1_SAVEEXEC_B64, SOP1Op.S_AND_NOT0_WREXEC_B32, SOP1Op.S_AND_NOT0_WREXEC_B64, SOP1Op.S_AND_NOT1_WREXEC_B32, SOP1Op.S_AND_NOT1_WREXEC_B64, SOP1Op.S_MOVRELS_B32, SOP1Op.S_MOVRELS_B64, SOP1Op.S_MOVRELD_B32, SOP1Op.S_MOVRELD_B64, SOP1Op.S_MOVRELSD_2_B32, SOP1Op.S_GETPC_B64, SOP1Op.S_SETPC_B64, SOP1Op.S_SWAPPC_B64, SOP1Op.S_RFE_B64, SOP1Op.S_SENDMSG_RTN_B32, SOP1Op.S_SENDMSG_RTN_B64, SOP1Op.S_BARRIER_SIGNAL, SOP1Op.S_BARRIER_SIGNAL_ISFIRST, SOP1Op.S_GET_BARRIER_STATE, SOP1Op.S_BARRIER_INIT, SOP1Op.S_BARRIER_JOIN, SOP1Op.S_ALLOC_VGPR, SOP1Op.S_SLEEP_VAR, SOP1Op.S_CEIL_F32, SOP1Op.S_FLOOR_F32, SOP1Op.S_TRUNC_F32, SOP1Op.S_RNDNE_F32, SOP1Op.S_CVT_F32_I32, SOP1Op.S_CVT_F32_U32, SOP1Op.S_CVT_I32_F32, SOP1Op.S_CVT_U32_F32, SOP1Op.S_CVT_F16_F32, SOP1Op.S_CVT_F32_F16, SOP1Op.S_CVT_HI_F32_F16, SOP1Op.S_CEIL_F16, SOP1Op.S_FLOOR_F16, SOP1Op.S_TRUNC_F16, SOP1Op.S_RNDNE_F16}) + literal = BitField(63, 32) + +class SOP2_LIT(SOP2): + op = EnumBitField(29, 23, SOP2Op, {SOP2Op.S_ADD_CO_U32, SOP2Op.S_SUB_CO_U32, SOP2Op.S_ADD_CO_I32, SOP2Op.S_SUB_CO_I32, SOP2Op.S_ADD_CO_CI_U32, SOP2Op.S_SUB_CO_CI_U32, SOP2Op.S_ABSDIFF_I32, SOP2Op.S_LSHL_B32, SOP2Op.S_LSHL_B64, SOP2Op.S_LSHR_B32, SOP2Op.S_LSHR_B64, SOP2Op.S_ASHR_I32, SOP2Op.S_ASHR_I64, SOP2Op.S_LSHL1_ADD_U32, SOP2Op.S_LSHL2_ADD_U32, SOP2Op.S_LSHL3_ADD_U32, SOP2Op.S_LSHL4_ADD_U32, SOP2Op.S_MIN_I32, SOP2Op.S_MIN_U32, SOP2Op.S_MAX_I32, SOP2Op.S_MAX_U32, SOP2Op.S_AND_B32, SOP2Op.S_AND_B64, SOP2Op.S_OR_B32, SOP2Op.S_OR_B64, SOP2Op.S_XOR_B32, SOP2Op.S_XOR_B64, SOP2Op.S_NAND_B32, SOP2Op.S_NAND_B64, SOP2Op.S_NOR_B32, SOP2Op.S_NOR_B64, SOP2Op.S_XNOR_B32, SOP2Op.S_XNOR_B64, SOP2Op.S_AND_NOT1_B32, SOP2Op.S_AND_NOT1_B64, SOP2Op.S_OR_NOT1_B32, SOP2Op.S_OR_NOT1_B64, SOP2Op.S_BFE_U32, SOP2Op.S_BFE_I32, SOP2Op.S_BFE_U64, SOP2Op.S_BFE_I64, SOP2Op.S_BFM_B32, SOP2Op.S_BFM_B64, SOP2Op.S_MUL_I32, SOP2Op.S_MUL_HI_U32, SOP2Op.S_MUL_HI_I32, SOP2Op.S_CSELECT_B32, SOP2Op.S_CSELECT_B64, SOP2Op.S_PACK_LL_B32_B16, SOP2Op.S_PACK_LH_B32_B16, SOP2Op.S_PACK_HH_B32_B16, SOP2Op.S_PACK_HL_B32_B16, SOP2Op.S_ADD_F32, SOP2Op.S_SUB_F32, SOP2Op.S_MIN_NUM_F32, SOP2Op.S_MAX_NUM_F32, SOP2Op.S_MUL_F32, SOP2Op.S_FMAAK_F32, SOP2Op.S_FMAMK_F32, SOP2Op.S_FMAC_F32, SOP2Op.S_CVT_PK_RTZ_F16_F32, SOP2Op.S_ADD_F16, SOP2Op.S_SUB_F16, SOP2Op.S_MIN_NUM_F16, SOP2Op.S_MAX_NUM_F16, SOP2Op.S_MUL_F16, SOP2Op.S_FMAC_F16, SOP2Op.S_MINIMUM_F32, SOP2Op.S_MAXIMUM_F32, SOP2Op.S_MINIMUM_F16, SOP2Op.S_MAXIMUM_F16, SOP2Op.S_ADD_NC_U64, SOP2Op.S_SUB_NC_U64, SOP2Op.S_MUL_U64}) + literal = BitField(63, 32) + +class SOPC_LIT(SOPC): + op = EnumBitField(22, 16, SOPCOp, {SOPCOp.S_CMP_EQ_I32, SOPCOp.S_CMP_LG_I32, SOPCOp.S_CMP_GT_I32, SOPCOp.S_CMP_GE_I32, SOPCOp.S_CMP_LT_I32, SOPCOp.S_CMP_LE_I32, SOPCOp.S_CMP_EQ_U32, SOPCOp.S_CMP_LG_U32, SOPCOp.S_CMP_GT_U32, SOPCOp.S_CMP_GE_U32, SOPCOp.S_CMP_LT_U32, SOPCOp.S_CMP_LE_U32, SOPCOp.S_BITCMP0_B32, SOPCOp.S_BITCMP1_B32, SOPCOp.S_BITCMP0_B64, SOPCOp.S_BITCMP1_B64, SOPCOp.S_CMP_EQ_U64, SOPCOp.S_CMP_LG_U64, SOPCOp.S_CMP_LT_F32, SOPCOp.S_CMP_EQ_F32, SOPCOp.S_CMP_LE_F32, SOPCOp.S_CMP_GT_F32, SOPCOp.S_CMP_LG_F32, SOPCOp.S_CMP_GE_F32, SOPCOp.S_CMP_O_F32, SOPCOp.S_CMP_U_F32, SOPCOp.S_CMP_NGE_F32, SOPCOp.S_CMP_NLG_F32, SOPCOp.S_CMP_NGT_F32, SOPCOp.S_CMP_NLE_F32, SOPCOp.S_CMP_NEQ_F32, SOPCOp.S_CMP_NLT_F32, SOPCOp.S_CMP_LT_F16, SOPCOp.S_CMP_EQ_F16, SOPCOp.S_CMP_LE_F16, SOPCOp.S_CMP_GT_F16, SOPCOp.S_CMP_LG_F16, SOPCOp.S_CMP_GE_F16, SOPCOp.S_CMP_O_F16, SOPCOp.S_CMP_U_F16, SOPCOp.S_CMP_NGE_F16, SOPCOp.S_CMP_NLG_F16, SOPCOp.S_CMP_NGT_F16, SOPCOp.S_CMP_NLE_F16, SOPCOp.S_CMP_NEQ_F16, SOPCOp.S_CMP_NLT_F16}) + literal = BitField(63, 32) + +class SOPK_LIT(SOPK): + op = EnumBitField(27, 23, SOPKOp, {SOPKOp.S_MOVK_I32, SOPKOp.S_VERSION, SOPKOp.S_CMOVK_I32, SOPKOp.S_ADDK_CO_I32, SOPKOp.S_MULK_I32, SOPKOp.S_GETREG_B32, SOPKOp.S_SETREG_B32, SOPKOp.S_SETREG_IMM32_B32, SOPKOp.S_CALL_B64}) + literal = BitField(63, 32) + +class VOP1_DPP16(VOP1): + vsrc0 = VGPRField(39, 32) + dpp = BitField(48, 40) + fi = BitField(50, 50) + bc = BitField(51, 51) + row_mask = BitField(63, 60) + bank_mask = BitField(59, 56) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(54, 54) + src1_abs = BitField(55, 55) + +class VOP1_DPP8(VOP1): + vsrc0 = VGPRField(39, 32) + lane_sel_0 = BitField(42, 40) + lane_sel_1 = BitField(45, 43) + lane_sel_2 = BitField(48, 46) + lane_sel_3 = BitField(51, 49) + lane_sel_4 = BitField(54, 52) + lane_sel_5 = BitField(57, 55) + lane_sel_6 = BitField(60, 58) + lane_sel_7 = BitField(63, 61) + +class VOP1_LIT(VOP1): + op = EnumBitField(15, 9, VOP1Op, {VOP1Op.V_NOP, VOP1Op.V_MOV_B32, VOP1Op.V_READFIRSTLANE_B32, VOP1Op.V_CVT_I32_F64, VOP1Op.V_CVT_F64_I32, VOP1Op.V_CVT_F32_I32, VOP1Op.V_CVT_F32_U32, VOP1Op.V_CVT_U32_F32, VOP1Op.V_CVT_I32_F32, VOP1Op.V_CVT_F16_F32, VOP1Op.V_CVT_F32_F16, VOP1Op.V_CVT_NEAREST_I32_F32, VOP1Op.V_CVT_FLOOR_I32_F32, VOP1Op.V_CVT_OFF_F32_I4, VOP1Op.V_CVT_F32_F64, VOP1Op.V_CVT_F64_F32, VOP1Op.V_CVT_F32_UBYTE0, VOP1Op.V_CVT_F32_UBYTE1, VOP1Op.V_CVT_F32_UBYTE2, VOP1Op.V_CVT_F32_UBYTE3, VOP1Op.V_CVT_U32_F64, VOP1Op.V_CVT_F64_U32, VOP1Op.V_TRUNC_F64, VOP1Op.V_CEIL_F64, VOP1Op.V_RNDNE_F64, VOP1Op.V_FLOOR_F64, VOP1Op.V_PIPEFLUSH, VOP1Op.V_MOV_B16, VOP1Op.V_FRACT_F32, VOP1Op.V_TRUNC_F32, VOP1Op.V_CEIL_F32, VOP1Op.V_RNDNE_F32, VOP1Op.V_FLOOR_F32, VOP1Op.V_EXP_F32, VOP1Op.V_LOG_F32, VOP1Op.V_RCP_F32, VOP1Op.V_RCP_IFLAG_F32, VOP1Op.V_RSQ_F32, VOP1Op.V_RCP_F64, VOP1Op.V_RSQ_F64, VOP1Op.V_SQRT_F32, VOP1Op.V_SQRT_F64, VOP1Op.V_SIN_F32, VOP1Op.V_COS_F32, VOP1Op.V_NOT_B32, VOP1Op.V_BFREV_B32, VOP1Op.V_CLZ_I32_U32, VOP1Op.V_CTZ_I32_B32, VOP1Op.V_CLS_I32, VOP1Op.V_FREXP_EXP_I32_F64, VOP1Op.V_FREXP_MANT_F64, VOP1Op.V_FRACT_F64, VOP1Op.V_FREXP_EXP_I32_F32, VOP1Op.V_FREXP_MANT_F32, VOP1Op.V_MOVRELD_B32, VOP1Op.V_MOVRELS_B32, VOP1Op.V_MOVRELSD_B32, VOP1Op.V_MOVRELSD_2_B32, VOP1Op.V_CVT_F16_U16, VOP1Op.V_CVT_F16_I16, VOP1Op.V_CVT_U16_F16, VOP1Op.V_CVT_I16_F16, VOP1Op.V_RCP_F16, VOP1Op.V_SQRT_F16, VOP1Op.V_RSQ_F16, VOP1Op.V_LOG_F16, VOP1Op.V_EXP_F16, VOP1Op.V_FREXP_MANT_F16, VOP1Op.V_FREXP_EXP_I16_F16, VOP1Op.V_FLOOR_F16, VOP1Op.V_CEIL_F16, VOP1Op.V_TRUNC_F16, VOP1Op.V_RNDNE_F16, VOP1Op.V_FRACT_F16, VOP1Op.V_SIN_F16, VOP1Op.V_COS_F16, VOP1Op.V_SAT_PK_U8_I16, VOP1Op.V_CVT_NORM_I16_F16, VOP1Op.V_CVT_NORM_U16_F16, VOP1Op.V_SWAP_B32, VOP1Op.V_SWAP_B16, VOP1Op.V_PERMLANE64_B32, VOP1Op.V_SWAPREL_B32, VOP1Op.V_NOT_B16, VOP1Op.V_CVT_I32_I16, VOP1Op.V_CVT_U32_U16, VOP1Op.V_CVT_F32_FP8, VOP1Op.V_CVT_F32_BF8, VOP1Op.V_CVT_PK_F32_FP8, VOP1Op.V_CVT_PK_F32_BF8}) + literal = BitField(63, 32) + +class VOP2_DPP16(VOP2): + vsrc0 = VGPRField(39, 32) + dpp = BitField(48, 40) + fi = BitField(50, 50) + bc = BitField(51, 51) + row_mask = BitField(63, 60) + bank_mask = BitField(59, 56) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(54, 54) + src1_abs = BitField(55, 55) + +class VOP2_DPP8(VOP2): + vsrc0 = VGPRField(39, 32) + lane_sel_0 = BitField(42, 40) + lane_sel_1 = BitField(45, 43) + lane_sel_2 = BitField(48, 46) + lane_sel_3 = BitField(51, 49) + lane_sel_4 = BitField(54, 52) + lane_sel_5 = BitField(57, 55) + lane_sel_6 = BitField(60, 58) + lane_sel_7 = BitField(63, 61) + +class VOP2_LIT(VOP2): + op = EnumBitField(30, 25, VOP2Op, {VOP2Op.V_CNDMASK_B32, VOP2Op.V_ADD_F64, VOP2Op.V_ADD_F32, VOP2Op.V_SUB_F32, VOP2Op.V_SUBREV_F32, VOP2Op.V_MUL_F64, VOP2Op.V_MUL_DX9_ZERO_F32, VOP2Op.V_MUL_F32, VOP2Op.V_MUL_I32_I24, VOP2Op.V_MUL_HI_I32_I24, VOP2Op.V_MUL_U32_U24, VOP2Op.V_MUL_HI_U32_U24, VOP2Op.V_MIN_NUM_F64, VOP2Op.V_MAX_NUM_F64, VOP2Op.V_MIN_I32, VOP2Op.V_MAX_I32, VOP2Op.V_MIN_U32, VOP2Op.V_MAX_U32, VOP2Op.V_MIN_NUM_F32, VOP2Op.V_MAX_NUM_F32, VOP2Op.V_LSHLREV_B32, VOP2Op.V_LSHRREV_B32, VOP2Op.V_ASHRREV_I32, VOP2Op.V_AND_B32, VOP2Op.V_OR_B32, VOP2Op.V_XOR_B32, VOP2Op.V_XNOR_B32, VOP2Op.V_LSHLREV_B64, VOP2Op.V_ADD_CO_CI_U32, VOP2Op.V_SUB_CO_CI_U32, VOP2Op.V_SUBREV_CO_CI_U32, VOP2Op.V_ADD_NC_U32, VOP2Op.V_SUB_NC_U32, VOP2Op.V_SUBREV_NC_U32, VOP2Op.V_FMAC_F32, VOP2Op.V_FMAMK_F32, VOP2Op.V_FMAAK_F32, VOP2Op.V_CVT_PK_RTZ_F16_F32, VOP2Op.V_MIN_NUM_F16, VOP2Op.V_MAX_NUM_F16, VOP2Op.V_ADD_F16, VOP2Op.V_SUB_F16, VOP2Op.V_SUBREV_F16, VOP2Op.V_MUL_F16, VOP2Op.V_FMAC_F16, VOP2Op.V_FMAMK_F16, VOP2Op.V_FMAAK_F16, VOP2Op.V_LDEXP_F16, VOP2Op.V_PK_FMAC_F16}) + literal = BitField(63, 32) + +class VOP3P_DPP16(VOP3P): + vsrc0 = VGPRField(71, 64) + dpp = BitField(80, 72) + fi = BitField(82, 82) + bc = BitField(83, 83) + row_mask = BitField(95, 92) + bank_mask = BitField(91, 88) + src0_neg = BitField(84, 84) + src0_abs = BitField(85, 85) + src1_neg = BitField(86, 86) + src1_abs = BitField(87, 87) + +class VOP3P_DPP8(VOP3P): + vsrc0 = VGPRField(71, 64) + lane_sel_0 = BitField(74, 72) + lane_sel_1 = BitField(77, 75) + lane_sel_2 = BitField(80, 78) + lane_sel_3 = BitField(83, 81) + lane_sel_4 = BitField(86, 84) + lane_sel_5 = BitField(89, 87) + lane_sel_6 = BitField(92, 90) + lane_sel_7 = BitField(95, 93) + +class VOP3P_LIT(VOP3P): + op = EnumBitField(22, 16, VOP3POp, {VOP3POp.V_PK_MAD_I16, VOP3POp.V_PK_MUL_LO_U16, VOP3POp.V_PK_ADD_I16, VOP3POp.V_PK_SUB_I16, VOP3POp.V_PK_LSHLREV_B16, VOP3POp.V_PK_LSHRREV_B16, VOP3POp.V_PK_ASHRREV_I16, VOP3POp.V_PK_MAX_I16, VOP3POp.V_PK_MIN_I16, VOP3POp.V_PK_MAD_U16, VOP3POp.V_PK_ADD_U16, VOP3POp.V_PK_SUB_U16, VOP3POp.V_PK_MAX_U16, VOP3POp.V_PK_MIN_U16, VOP3POp.V_PK_FMA_F16, VOP3POp.V_PK_ADD_F16, VOP3POp.V_PK_MUL_F16, VOP3POp.V_DOT2_F32_F16, VOP3POp.V_DOT4_I32_IU8, VOP3POp.V_DOT4_U32_U8, VOP3POp.V_DOT8_I32_IU4, VOP3POp.V_DOT8_U32_U4, VOP3POp.V_DOT2_F32_BF16, VOP3POp.V_PK_MIN_NUM_F16, VOP3POp.V_PK_MAX_NUM_F16, VOP3POp.V_PK_MINIMUM_F16, VOP3POp.V_PK_MAXIMUM_F16, VOP3POp.V_FMA_MIX_F32, VOP3POp.V_FMA_MIXLO_F16, VOP3POp.V_FMA_MIXHI_F16, VOP3POp.V_DOT4_F32_FP8_BF8, VOP3POp.V_DOT4_F32_BF8_FP8, VOP3POp.V_DOT4_F32_FP8_FP8, VOP3POp.V_DOT4_F32_BF8_BF8, VOP3POp.V_WMMA_F32_16X16X16_F16, VOP3POp.V_WMMA_F32_16X16X16_BF16, VOP3POp.V_WMMA_F16_16X16X16_F16, VOP3POp.V_WMMA_BF16_16X16X16_BF16, VOP3POp.V_WMMA_I32_16X16X16_IU8, VOP3POp.V_WMMA_I32_16X16X16_IU4, VOP3POp.V_WMMA_F32_16X16X16_FP8_FP8, VOP3POp.V_WMMA_F32_16X16X16_FP8_BF8, VOP3POp.V_WMMA_F32_16X16X16_BF8_FP8, VOP3POp.V_WMMA_F32_16X16X16_BF8_BF8, VOP3POp.V_WMMA_I32_16X16X32_IU4, VOP3POp.V_SWMMAC_F32_16X16X32_F16, VOP3POp.V_SWMMAC_F32_16X16X32_BF16, VOP3POp.V_SWMMAC_F16_16X16X32_F16, VOP3POp.V_SWMMAC_BF16_16X16X32_BF16, VOP3POp.V_SWMMAC_I32_16X16X32_IU8, VOP3POp.V_SWMMAC_I32_16X16X32_IU4, VOP3POp.V_SWMMAC_I32_16X16X64_IU4, VOP3POp.V_SWMMAC_F32_16X16X32_FP8_FP8, VOP3POp.V_SWMMAC_F32_16X16X32_FP8_BF8, VOP3POp.V_SWMMAC_F32_16X16X32_BF8_FP8, VOP3POp.V_SWMMAC_F32_16X16X32_BF8_BF8}) + literal = BitField(95, 64) + +class VOP3SD_DPP16(VOP3SD): + vsrc0 = VGPRField(71, 64) + dpp = BitField(80, 72) + fi = BitField(82, 82) + bc = BitField(83, 83) + row_mask = BitField(95, 92) + bank_mask = BitField(91, 88) + src0_neg = BitField(84, 84) + src0_abs = BitField(85, 85) + src1_neg = BitField(86, 86) + src1_abs = BitField(87, 87) + +class VOP3SD_DPP8(VOP3SD): + vsrc0 = VGPRField(71, 64) + lane_sel_0 = BitField(74, 72) + lane_sel_1 = BitField(77, 75) + lane_sel_2 = BitField(80, 78) + lane_sel_3 = BitField(83, 81) + lane_sel_4 = BitField(86, 84) + lane_sel_5 = BitField(89, 87) + lane_sel_6 = BitField(92, 90) + lane_sel_7 = BitField(95, 93) + +class VOP3SD_LIT(VOP3SD): + op = EnumBitField(25, 16, VOP3SDOp, {VOP3SDOp.V_ADD_CO_CI_U32, VOP3SDOp.V_SUB_CO_CI_U32, VOP3SDOp.V_SUBREV_CO_CI_U32, VOP3SDOp.V_DIV_SCALE_F32, VOP3SDOp.V_DIV_SCALE_F64, VOP3SDOp.V_MAD_CO_U64_U32, VOP3SDOp.V_MAD_CO_I64_I32, VOP3SDOp.V_ADD_CO_U32, VOP3SDOp.V_SUB_CO_U32, VOP3SDOp.V_SUBREV_CO_U32}) + literal = BitField(95, 64) + +class VOP3_DPP16(VOP3): + vsrc0 = VGPRField(71, 64) + dpp = BitField(80, 72) + fi = BitField(82, 82) + bc = BitField(83, 83) + row_mask = BitField(95, 92) + bank_mask = BitField(91, 88) + src0_neg = BitField(84, 84) + src0_abs = BitField(85, 85) + src1_neg = BitField(86, 86) + src1_abs = BitField(87, 87) + +class VOP3_DPP8(VOP3): + vsrc0 = VGPRField(71, 64) + lane_sel_0 = BitField(74, 72) + lane_sel_1 = BitField(77, 75) + lane_sel_2 = BitField(80, 78) + lane_sel_3 = BitField(83, 81) + lane_sel_4 = BitField(86, 84) + lane_sel_5 = BitField(89, 87) + lane_sel_6 = BitField(92, 90) + lane_sel_7 = BitField(95, 93) + +class VOP3_LIT(VOP3): + op = EnumBitField(25, 16, VOP3Op, {VOP3Op.V_CMP_LT_F16, VOP3Op.V_CMP_EQ_F16, VOP3Op.V_CMP_LE_F16, VOP3Op.V_CMP_GT_F16, VOP3Op.V_CMP_LG_F16, VOP3Op.V_CMP_GE_F16, VOP3Op.V_CMP_O_F16, VOP3Op.V_CMP_U_F16, VOP3Op.V_CMP_NGE_F16, VOP3Op.V_CMP_NLG_F16, VOP3Op.V_CMP_NGT_F16, VOP3Op.V_CMP_NLE_F16, VOP3Op.V_CMP_NEQ_F16, VOP3Op.V_CMP_NLT_F16, VOP3Op.V_CMP_LT_F32, VOP3Op.V_CMP_EQ_F32, VOP3Op.V_CMP_LE_F32, VOP3Op.V_CMP_GT_F32, VOP3Op.V_CMP_LG_F32, VOP3Op.V_CMP_GE_F32, VOP3Op.V_CMP_O_F32, VOP3Op.V_CMP_U_F32, VOP3Op.V_CMP_NGE_F32, VOP3Op.V_CMP_NLG_F32, VOP3Op.V_CMP_NGT_F32, VOP3Op.V_CMP_NLE_F32, VOP3Op.V_CMP_NEQ_F32, VOP3Op.V_CMP_NLT_F32, VOP3Op.V_CMP_LT_F64, VOP3Op.V_CMP_EQ_F64, VOP3Op.V_CMP_LE_F64, VOP3Op.V_CMP_GT_F64, VOP3Op.V_CMP_LG_F64, VOP3Op.V_CMP_GE_F64, VOP3Op.V_CMP_O_F64, VOP3Op.V_CMP_U_F64, VOP3Op.V_CMP_NGE_F64, VOP3Op.V_CMP_NLG_F64, VOP3Op.V_CMP_NGT_F64, VOP3Op.V_CMP_NLE_F64, VOP3Op.V_CMP_NEQ_F64, VOP3Op.V_CMP_NLT_F64, VOP3Op.V_CMP_LT_I16, VOP3Op.V_CMP_EQ_I16, VOP3Op.V_CMP_LE_I16, VOP3Op.V_CMP_GT_I16, VOP3Op.V_CMP_NE_I16, VOP3Op.V_CMP_GE_I16, VOP3Op.V_CMP_LT_U16, VOP3Op.V_CMP_EQ_U16, VOP3Op.V_CMP_LE_U16, VOP3Op.V_CMP_GT_U16, VOP3Op.V_CMP_NE_U16, VOP3Op.V_CMP_GE_U16, VOP3Op.V_CMP_LT_I32, VOP3Op.V_CMP_EQ_I32, VOP3Op.V_CMP_LE_I32, VOP3Op.V_CMP_GT_I32, VOP3Op.V_CMP_NE_I32, VOP3Op.V_CMP_GE_I32, VOP3Op.V_CMP_LT_U32, VOP3Op.V_CMP_EQ_U32, VOP3Op.V_CMP_LE_U32, VOP3Op.V_CMP_GT_U32, VOP3Op.V_CMP_NE_U32, VOP3Op.V_CMP_GE_U32, VOP3Op.V_CMP_LT_I64, VOP3Op.V_CMP_EQ_I64, VOP3Op.V_CMP_LE_I64, VOP3Op.V_CMP_GT_I64, VOP3Op.V_CMP_NE_I64, VOP3Op.V_CMP_GE_I64, VOP3Op.V_CMP_LT_U64, VOP3Op.V_CMP_EQ_U64, VOP3Op.V_CMP_LE_U64, VOP3Op.V_CMP_GT_U64, VOP3Op.V_CMP_NE_U64, VOP3Op.V_CMP_GE_U64, VOP3Op.V_CMP_CLASS_F16, VOP3Op.V_CMP_CLASS_F32, VOP3Op.V_CMP_CLASS_F64, VOP3Op.V_CMPX_LT_F16, VOP3Op.V_CMPX_EQ_F16, VOP3Op.V_CMPX_LE_F16, VOP3Op.V_CMPX_GT_F16, VOP3Op.V_CMPX_LG_F16, VOP3Op.V_CMPX_GE_F16, VOP3Op.V_CMPX_O_F16, VOP3Op.V_CMPX_U_F16, VOP3Op.V_CMPX_NGE_F16, VOP3Op.V_CMPX_NLG_F16, VOP3Op.V_CMPX_NGT_F16, VOP3Op.V_CMPX_NLE_F16, VOP3Op.V_CMPX_NEQ_F16, VOP3Op.V_CMPX_NLT_F16, VOP3Op.V_CMPX_LT_F32, VOP3Op.V_CMPX_EQ_F32, VOP3Op.V_CMPX_LE_F32, VOP3Op.V_CMPX_GT_F32, VOP3Op.V_CMPX_LG_F32, VOP3Op.V_CMPX_GE_F32, VOP3Op.V_CMPX_O_F32, VOP3Op.V_CMPX_U_F32, VOP3Op.V_CMPX_NGE_F32, VOP3Op.V_CMPX_NLG_F32, VOP3Op.V_CMPX_NGT_F32, VOP3Op.V_CMPX_NLE_F32, VOP3Op.V_CMPX_NEQ_F32, VOP3Op.V_CMPX_NLT_F32, VOP3Op.V_CMPX_LT_F64, VOP3Op.V_CMPX_EQ_F64, VOP3Op.V_CMPX_LE_F64, VOP3Op.V_CMPX_GT_F64, VOP3Op.V_CMPX_LG_F64, VOP3Op.V_CMPX_GE_F64, VOP3Op.V_CMPX_O_F64, VOP3Op.V_CMPX_U_F64, VOP3Op.V_CMPX_NGE_F64, VOP3Op.V_CMPX_NLG_F64, VOP3Op.V_CMPX_NGT_F64, VOP3Op.V_CMPX_NLE_F64, VOP3Op.V_CMPX_NEQ_F64, VOP3Op.V_CMPX_NLT_F64, VOP3Op.V_CMPX_LT_I16, VOP3Op.V_CMPX_EQ_I16, VOP3Op.V_CMPX_LE_I16, VOP3Op.V_CMPX_GT_I16, VOP3Op.V_CMPX_NE_I16, VOP3Op.V_CMPX_GE_I16, VOP3Op.V_CMPX_LT_U16, VOP3Op.V_CMPX_EQ_U16, VOP3Op.V_CMPX_LE_U16, VOP3Op.V_CMPX_GT_U16, VOP3Op.V_CMPX_NE_U16, VOP3Op.V_CMPX_GE_U16, VOP3Op.V_CMPX_LT_I32, VOP3Op.V_CMPX_EQ_I32, VOP3Op.V_CMPX_LE_I32, VOP3Op.V_CMPX_GT_I32, VOP3Op.V_CMPX_NE_I32, VOP3Op.V_CMPX_GE_I32, VOP3Op.V_CMPX_LT_U32, VOP3Op.V_CMPX_EQ_U32, VOP3Op.V_CMPX_LE_U32, VOP3Op.V_CMPX_GT_U32, VOP3Op.V_CMPX_NE_U32, VOP3Op.V_CMPX_GE_U32, VOP3Op.V_CMPX_LT_I64, VOP3Op.V_CMPX_EQ_I64, VOP3Op.V_CMPX_LE_I64, VOP3Op.V_CMPX_GT_I64, VOP3Op.V_CMPX_NE_I64, VOP3Op.V_CMPX_GE_I64, VOP3Op.V_CMPX_LT_U64, VOP3Op.V_CMPX_EQ_U64, VOP3Op.V_CMPX_LE_U64, VOP3Op.V_CMPX_GT_U64, VOP3Op.V_CMPX_NE_U64, VOP3Op.V_CMPX_GE_U64, VOP3Op.V_CMPX_CLASS_F16, VOP3Op.V_CMPX_CLASS_F32, VOP3Op.V_CMPX_CLASS_F64, VOP3Op.V_CNDMASK_B32, VOP3Op.V_ADD_F64, VOP3Op.V_ADD_F32, VOP3Op.V_SUB_F32, VOP3Op.V_SUBREV_F32, VOP3Op.V_MUL_F64, VOP3Op.V_MUL_DX9_ZERO_F32, VOP3Op.V_MUL_F32, VOP3Op.V_MUL_I32_I24, VOP3Op.V_MUL_HI_I32_I24, VOP3Op.V_MUL_U32_U24, VOP3Op.V_MUL_HI_U32_U24, VOP3Op.V_MIN_NUM_F64, VOP3Op.V_MAX_NUM_F64, VOP3Op.V_MIN_I32, VOP3Op.V_MAX_I32, VOP3Op.V_MIN_U32, VOP3Op.V_MAX_U32, VOP3Op.V_MIN_NUM_F32, VOP3Op.V_MAX_NUM_F32, VOP3Op.V_LSHLREV_B32, VOP3Op.V_LSHRREV_B32, VOP3Op.V_ASHRREV_I32, VOP3Op.V_AND_B32, VOP3Op.V_OR_B32, VOP3Op.V_XOR_B32, VOP3Op.V_XNOR_B32, VOP3Op.V_LSHLREV_B64, VOP3Op.V_ADD_NC_U32, VOP3Op.V_SUB_NC_U32, VOP3Op.V_SUBREV_NC_U32, VOP3Op.V_FMAC_F32, VOP3Op.V_CVT_PK_RTZ_F16_F32, VOP3Op.V_MIN_NUM_F16, VOP3Op.V_MAX_NUM_F16, VOP3Op.V_ADD_F16, VOP3Op.V_SUB_F16, VOP3Op.V_SUBREV_F16, VOP3Op.V_MUL_F16, VOP3Op.V_FMAC_F16, VOP3Op.V_LDEXP_F16, VOP3Op.V_NOP, VOP3Op.V_MOV_B32, VOP3Op.V_READFIRSTLANE_B32, VOP3Op.V_CVT_I32_F64, VOP3Op.V_CVT_F64_I32, VOP3Op.V_CVT_F32_I32, VOP3Op.V_CVT_F32_U32, VOP3Op.V_CVT_U32_F32, VOP3Op.V_CVT_I32_F32, VOP3Op.V_CVT_F16_F32, VOP3Op.V_CVT_F32_F16, VOP3Op.V_CVT_NEAREST_I32_F32, VOP3Op.V_CVT_FLOOR_I32_F32, VOP3Op.V_CVT_OFF_F32_I4, VOP3Op.V_CVT_F32_F64, VOP3Op.V_CVT_F64_F32, VOP3Op.V_CVT_F32_UBYTE0, VOP3Op.V_CVT_F32_UBYTE1, VOP3Op.V_CVT_F32_UBYTE2, VOP3Op.V_CVT_F32_UBYTE3, VOP3Op.V_CVT_U32_F64, VOP3Op.V_CVT_F64_U32, VOP3Op.V_TRUNC_F64, VOP3Op.V_CEIL_F64, VOP3Op.V_RNDNE_F64, VOP3Op.V_FLOOR_F64, VOP3Op.V_PIPEFLUSH, VOP3Op.V_MOV_B16, VOP3Op.V_FRACT_F32, VOP3Op.V_TRUNC_F32, VOP3Op.V_CEIL_F32, VOP3Op.V_RNDNE_F32, VOP3Op.V_FLOOR_F32, VOP3Op.V_EXP_F32, VOP3Op.V_LOG_F32, VOP3Op.V_RCP_F32, VOP3Op.V_RCP_IFLAG_F32, VOP3Op.V_RSQ_F32, VOP3Op.V_RCP_F64, VOP3Op.V_RSQ_F64, VOP3Op.V_SQRT_F32, VOP3Op.V_SQRT_F64, VOP3Op.V_SIN_F32, VOP3Op.V_COS_F32, VOP3Op.V_NOT_B32, VOP3Op.V_BFREV_B32, VOP3Op.V_CLZ_I32_U32, VOP3Op.V_CTZ_I32_B32, VOP3Op.V_CLS_I32, VOP3Op.V_FREXP_EXP_I32_F64, VOP3Op.V_FREXP_MANT_F64, VOP3Op.V_FRACT_F64, VOP3Op.V_FREXP_EXP_I32_F32, VOP3Op.V_FREXP_MANT_F32, VOP3Op.V_MOVRELD_B32, VOP3Op.V_MOVRELS_B32, VOP3Op.V_MOVRELSD_B32, VOP3Op.V_MOVRELSD_2_B32, VOP3Op.V_CVT_F16_U16, VOP3Op.V_CVT_F16_I16, VOP3Op.V_CVT_U16_F16, VOP3Op.V_CVT_I16_F16, VOP3Op.V_RCP_F16, VOP3Op.V_SQRT_F16, VOP3Op.V_RSQ_F16, VOP3Op.V_LOG_F16, VOP3Op.V_EXP_F16, VOP3Op.V_FREXP_MANT_F16, VOP3Op.V_FREXP_EXP_I16_F16, VOP3Op.V_FLOOR_F16, VOP3Op.V_CEIL_F16, VOP3Op.V_TRUNC_F16, VOP3Op.V_RNDNE_F16, VOP3Op.V_FRACT_F16, VOP3Op.V_SIN_F16, VOP3Op.V_COS_F16, VOP3Op.V_SAT_PK_U8_I16, VOP3Op.V_CVT_NORM_I16_F16, VOP3Op.V_CVT_NORM_U16_F16, VOP3Op.V_NOT_B16, VOP3Op.V_CVT_I32_I16, VOP3Op.V_CVT_U32_U16, VOP3Op.V_CVT_F32_FP8, VOP3Op.V_CVT_F32_BF8, VOP3Op.V_CVT_PK_F32_FP8, VOP3Op.V_CVT_PK_F32_BF8, VOP3Op.V_FMA_DX9_ZERO_F32, VOP3Op.V_MAD_I32_I24, VOP3Op.V_MAD_U32_U24, VOP3Op.V_CUBEID_F32, VOP3Op.V_CUBESC_F32, VOP3Op.V_CUBETC_F32, VOP3Op.V_CUBEMA_F32, VOP3Op.V_BFE_U32, VOP3Op.V_BFE_I32, VOP3Op.V_BFI_B32, VOP3Op.V_FMA_F32, VOP3Op.V_FMA_F64, VOP3Op.V_LERP_U8, VOP3Op.V_ALIGNBIT_B32, VOP3Op.V_ALIGNBYTE_B32, VOP3Op.V_MULLIT_F32, VOP3Op.V_MIN3_I32, VOP3Op.V_MIN3_U32, VOP3Op.V_MAX3_I32, VOP3Op.V_MAX3_U32, VOP3Op.V_MED3_I32, VOP3Op.V_MED3_U32, VOP3Op.V_SAD_U8, VOP3Op.V_SAD_HI_U8, VOP3Op.V_SAD_U16, VOP3Op.V_SAD_U32, VOP3Op.V_CVT_PK_U8_F32, VOP3Op.V_DIV_FIXUP_F32, VOP3Op.V_DIV_FIXUP_F64, VOP3Op.V_MIN3_NUM_F32, VOP3Op.V_MAX3_NUM_F32, VOP3Op.V_MIN3_NUM_F16, VOP3Op.V_MAX3_NUM_F16, VOP3Op.V_MINIMUM3_F32, VOP3Op.V_MAXIMUM3_F32, VOP3Op.V_MINIMUM3_F16, VOP3Op.V_MAXIMUM3_F16, VOP3Op.V_MED3_NUM_F32, VOP3Op.V_MED3_NUM_F16, VOP3Op.V_DIV_FMAS_F32, VOP3Op.V_DIV_FMAS_F64, VOP3Op.V_MSAD_U8, VOP3Op.V_QSAD_PK_U16_U8, VOP3Op.V_MQSAD_PK_U16_U8, VOP3Op.V_MQSAD_U32_U8, VOP3Op.V_XOR3_B32, VOP3Op.V_MAD_U16, VOP3Op.V_PERM_B32, VOP3Op.V_XAD_U32, VOP3Op.V_LSHL_ADD_U32, VOP3Op.V_ADD_LSHL_U32, VOP3Op.V_FMA_F16, VOP3Op.V_MIN3_I16, VOP3Op.V_MIN3_U16, VOP3Op.V_MAX3_I16, VOP3Op.V_MAX3_U16, VOP3Op.V_MED3_I16, VOP3Op.V_MED3_U16, VOP3Op.V_MAD_I16, VOP3Op.V_DIV_FIXUP_F16, VOP3Op.V_ADD3_U32, VOP3Op.V_LSHL_OR_B32, VOP3Op.V_AND_OR_B32, VOP3Op.V_OR3_B32, VOP3Op.V_MAD_U32_U16, VOP3Op.V_MAD_I32_I16, VOP3Op.V_PERMLANE16_B32, VOP3Op.V_PERMLANEX16_B32, VOP3Op.V_CNDMASK_B16, VOP3Op.V_MAXMIN_U32, VOP3Op.V_MINMAX_U32, VOP3Op.V_MAXMIN_I32, VOP3Op.V_MINMAX_I32, VOP3Op.V_DOT2_F16_F16, VOP3Op.V_DOT2_BF16_BF16, VOP3Op.V_MINMAX_NUM_F32, VOP3Op.V_MAXMIN_NUM_F32, VOP3Op.V_MINMAX_NUM_F16, VOP3Op.V_MAXMIN_NUM_F16, VOP3Op.V_MINIMUMMAXIMUM_F32, VOP3Op.V_MAXIMUMMINIMUM_F32, VOP3Op.V_MINIMUMMAXIMUM_F16, VOP3Op.V_MAXIMUMMINIMUM_F16, VOP3Op.V_S_EXP_F32, VOP3Op.V_S_EXP_F16, VOP3Op.V_S_LOG_F32, VOP3Op.V_S_LOG_F16, VOP3Op.V_S_RCP_F32, VOP3Op.V_S_RCP_F16, VOP3Op.V_S_RSQ_F32, VOP3Op.V_S_RSQ_F16, VOP3Op.V_S_SQRT_F32, VOP3Op.V_S_SQRT_F16, VOP3Op.V_ADD_NC_U16, VOP3Op.V_SUB_NC_U16, VOP3Op.V_MUL_LO_U16, VOP3Op.V_CVT_PK_I16_F32, VOP3Op.V_CVT_PK_U16_F32, VOP3Op.V_MAX_U16, VOP3Op.V_MAX_I16, VOP3Op.V_MIN_U16, VOP3Op.V_MIN_I16, VOP3Op.V_ADD_NC_I16, VOP3Op.V_SUB_NC_I16, VOP3Op.V_PERMLANE16_VAR_B32, VOP3Op.V_PERMLANEX16_VAR_B32, VOP3Op.V_PACK_B32_F16, VOP3Op.V_CVT_PK_NORM_I16_F16, VOP3Op.V_CVT_PK_NORM_U16_F16, VOP3Op.V_LDEXP_F32, VOP3Op.V_BFM_B32, VOP3Op.V_BCNT_U32_B32, VOP3Op.V_MBCNT_LO_U32_B32, VOP3Op.V_MBCNT_HI_U32_B32, VOP3Op.V_CVT_PK_NORM_I16_F32, VOP3Op.V_CVT_PK_NORM_U16_F32, VOP3Op.V_CVT_PK_U16_U32, VOP3Op.V_CVT_PK_I16_I32, VOP3Op.V_SUB_NC_I32, VOP3Op.V_ADD_NC_I32, VOP3Op.V_LDEXP_F64, VOP3Op.V_MUL_LO_U32, VOP3Op.V_MUL_HI_U32, VOP3Op.V_MUL_HI_I32, VOP3Op.V_TRIG_PREOP_F64, VOP3Op.V_LSHLREV_B16, VOP3Op.V_LSHRREV_B16, VOP3Op.V_ASHRREV_I16, VOP3Op.V_LSHRREV_B64, VOP3Op.V_ASHRREV_I64, VOP3Op.V_MINIMUM_F64, VOP3Op.V_MAXIMUM_F64, VOP3Op.V_READLANE_B32, VOP3Op.V_WRITELANE_B32, VOP3Op.V_AND_B16, VOP3Op.V_OR_B16, VOP3Op.V_XOR_B16, VOP3Op.V_MINIMUM_F32, VOP3Op.V_MAXIMUM_F32, VOP3Op.V_MINIMUM_F16, VOP3Op.V_MAXIMUM_F16, VOP3Op.V_CVT_PK_FP8_F32, VOP3Op.V_CVT_PK_BF8_F32, VOP3Op.V_CVT_SR_FP8_F32, VOP3Op.V_CVT_SR_BF8_F32}) + literal = BitField(95, 64) + +class VOPC_DPP16(VOPC): + vsrc0 = VGPRField(39, 32) + dpp = BitField(48, 40) + fi = BitField(50, 50) + bc = BitField(51, 51) + row_mask = BitField(63, 60) + bank_mask = BitField(59, 56) + src0_neg = BitField(52, 52) + src0_abs = BitField(53, 53) + src1_neg = BitField(54, 54) + src1_abs = BitField(55, 55) + +class VOPC_DPP8(VOPC): + vsrc0 = VGPRField(39, 32) + lane_sel_0 = BitField(42, 40) + lane_sel_1 = BitField(45, 43) + lane_sel_2 = BitField(48, 46) + lane_sel_3 = BitField(51, 49) + lane_sel_4 = BitField(54, 52) + lane_sel_5 = BitField(57, 55) + lane_sel_6 = BitField(60, 58) + lane_sel_7 = BitField(63, 61) + +class VOPC_LIT(VOPC): + op = EnumBitField(24, 17, VOPCOp, {VOPCOp.V_CMP_LT_F16, VOPCOp.V_CMP_EQ_F16, VOPCOp.V_CMP_LE_F16, VOPCOp.V_CMP_GT_F16, VOPCOp.V_CMP_LG_F16, VOPCOp.V_CMP_GE_F16, VOPCOp.V_CMP_O_F16, VOPCOp.V_CMP_U_F16, VOPCOp.V_CMP_NGE_F16, VOPCOp.V_CMP_NLG_F16, VOPCOp.V_CMP_NGT_F16, VOPCOp.V_CMP_NLE_F16, VOPCOp.V_CMP_NEQ_F16, VOPCOp.V_CMP_NLT_F16, VOPCOp.V_CMP_LT_F32, VOPCOp.V_CMP_EQ_F32, VOPCOp.V_CMP_LE_F32, VOPCOp.V_CMP_GT_F32, VOPCOp.V_CMP_LG_F32, VOPCOp.V_CMP_GE_F32, VOPCOp.V_CMP_O_F32, VOPCOp.V_CMP_U_F32, VOPCOp.V_CMP_NGE_F32, VOPCOp.V_CMP_NLG_F32, VOPCOp.V_CMP_NGT_F32, VOPCOp.V_CMP_NLE_F32, VOPCOp.V_CMP_NEQ_F32, VOPCOp.V_CMP_NLT_F32, VOPCOp.V_CMP_LT_F64, VOPCOp.V_CMP_EQ_F64, VOPCOp.V_CMP_LE_F64, VOPCOp.V_CMP_GT_F64, VOPCOp.V_CMP_LG_F64, VOPCOp.V_CMP_GE_F64, VOPCOp.V_CMP_O_F64, VOPCOp.V_CMP_U_F64, VOPCOp.V_CMP_NGE_F64, VOPCOp.V_CMP_NLG_F64, VOPCOp.V_CMP_NGT_F64, VOPCOp.V_CMP_NLE_F64, VOPCOp.V_CMP_NEQ_F64, VOPCOp.V_CMP_NLT_F64, VOPCOp.V_CMP_LT_I16, VOPCOp.V_CMP_EQ_I16, VOPCOp.V_CMP_LE_I16, VOPCOp.V_CMP_GT_I16, VOPCOp.V_CMP_NE_I16, VOPCOp.V_CMP_GE_I16, VOPCOp.V_CMP_LT_U16, VOPCOp.V_CMP_EQ_U16, VOPCOp.V_CMP_LE_U16, VOPCOp.V_CMP_GT_U16, VOPCOp.V_CMP_NE_U16, VOPCOp.V_CMP_GE_U16, VOPCOp.V_CMP_LT_I32, VOPCOp.V_CMP_EQ_I32, VOPCOp.V_CMP_LE_I32, VOPCOp.V_CMP_GT_I32, VOPCOp.V_CMP_NE_I32, VOPCOp.V_CMP_GE_I32, VOPCOp.V_CMP_LT_U32, VOPCOp.V_CMP_EQ_U32, VOPCOp.V_CMP_LE_U32, VOPCOp.V_CMP_GT_U32, VOPCOp.V_CMP_NE_U32, VOPCOp.V_CMP_GE_U32, VOPCOp.V_CMP_LT_I64, VOPCOp.V_CMP_EQ_I64, VOPCOp.V_CMP_LE_I64, VOPCOp.V_CMP_GT_I64, VOPCOp.V_CMP_NE_I64, VOPCOp.V_CMP_GE_I64, VOPCOp.V_CMP_LT_U64, VOPCOp.V_CMP_EQ_U64, VOPCOp.V_CMP_LE_U64, VOPCOp.V_CMP_GT_U64, VOPCOp.V_CMP_NE_U64, VOPCOp.V_CMP_GE_U64, VOPCOp.V_CMP_CLASS_F16, VOPCOp.V_CMP_CLASS_F32, VOPCOp.V_CMP_CLASS_F64, VOPCOp.V_CMPX_LT_F16, VOPCOp.V_CMPX_EQ_F16, VOPCOp.V_CMPX_LE_F16, VOPCOp.V_CMPX_GT_F16, VOPCOp.V_CMPX_LG_F16, VOPCOp.V_CMPX_GE_F16, VOPCOp.V_CMPX_O_F16, VOPCOp.V_CMPX_U_F16, VOPCOp.V_CMPX_NGE_F16, VOPCOp.V_CMPX_NLG_F16, VOPCOp.V_CMPX_NGT_F16, VOPCOp.V_CMPX_NLE_F16, VOPCOp.V_CMPX_NEQ_F16, VOPCOp.V_CMPX_NLT_F16, VOPCOp.V_CMPX_LT_F32, VOPCOp.V_CMPX_EQ_F32, VOPCOp.V_CMPX_LE_F32, VOPCOp.V_CMPX_GT_F32, VOPCOp.V_CMPX_LG_F32, VOPCOp.V_CMPX_GE_F32, VOPCOp.V_CMPX_O_F32, VOPCOp.V_CMPX_U_F32, VOPCOp.V_CMPX_NGE_F32, VOPCOp.V_CMPX_NLG_F32, VOPCOp.V_CMPX_NGT_F32, VOPCOp.V_CMPX_NLE_F32, VOPCOp.V_CMPX_NEQ_F32, VOPCOp.V_CMPX_NLT_F32, VOPCOp.V_CMPX_LT_F64, VOPCOp.V_CMPX_EQ_F64, VOPCOp.V_CMPX_LE_F64, VOPCOp.V_CMPX_GT_F64, VOPCOp.V_CMPX_LG_F64, VOPCOp.V_CMPX_GE_F64, VOPCOp.V_CMPX_O_F64, VOPCOp.V_CMPX_U_F64, VOPCOp.V_CMPX_NGE_F64, VOPCOp.V_CMPX_NLG_F64, VOPCOp.V_CMPX_NGT_F64, VOPCOp.V_CMPX_NLE_F64, VOPCOp.V_CMPX_NEQ_F64, VOPCOp.V_CMPX_NLT_F64, VOPCOp.V_CMPX_LT_I16, VOPCOp.V_CMPX_EQ_I16, VOPCOp.V_CMPX_LE_I16, VOPCOp.V_CMPX_GT_I16, VOPCOp.V_CMPX_NE_I16, VOPCOp.V_CMPX_GE_I16, VOPCOp.V_CMPX_LT_U16, VOPCOp.V_CMPX_EQ_U16, VOPCOp.V_CMPX_LE_U16, VOPCOp.V_CMPX_GT_U16, VOPCOp.V_CMPX_NE_U16, VOPCOp.V_CMPX_GE_U16, VOPCOp.V_CMPX_LT_I32, VOPCOp.V_CMPX_EQ_I32, VOPCOp.V_CMPX_LE_I32, VOPCOp.V_CMPX_GT_I32, VOPCOp.V_CMPX_NE_I32, VOPCOp.V_CMPX_GE_I32, VOPCOp.V_CMPX_LT_U32, VOPCOp.V_CMPX_EQ_U32, VOPCOp.V_CMPX_LE_U32, VOPCOp.V_CMPX_GT_U32, VOPCOp.V_CMPX_NE_U32, VOPCOp.V_CMPX_GE_U32, VOPCOp.V_CMPX_LT_I64, VOPCOp.V_CMPX_EQ_I64, VOPCOp.V_CMPX_LE_I64, VOPCOp.V_CMPX_GT_I64, VOPCOp.V_CMPX_NE_I64, VOPCOp.V_CMPX_GE_I64, VOPCOp.V_CMPX_LT_U64, VOPCOp.V_CMPX_EQ_U64, VOPCOp.V_CMPX_LE_U64, VOPCOp.V_CMPX_GT_U64, VOPCOp.V_CMPX_NE_U64, VOPCOp.V_CMPX_GE_U64, VOPCOp.V_CMPX_CLASS_F16, VOPCOp.V_CMPX_CLASS_F32, VOPCOp.V_CMPX_CLASS_F64}) + literal = BitField(63, 32) + +class VOPD_LIT(VOPD): + literal = BitField(95, 64) + +class VOP1_SDST(VOP1): + op = EnumBitField(15, 9, VOP1Op, {VOP1Op.V_READFIRSTLANE_B32}) + vdst = SSrcField(24, 17) + +class VOP1_SDST_LIT(VOP1_SDST): + literal = BitField(63, 32) + +class VOP3_SDST(VOP3): + op = EnumBitField(25, 16, VOP3Op, {VOP3Op.V_CMP_LT_F16, VOP3Op.V_CMP_EQ_F16, VOP3Op.V_CMP_LE_F16, VOP3Op.V_CMP_GT_F16, VOP3Op.V_CMP_LG_F16, VOP3Op.V_CMP_GE_F16, VOP3Op.V_CMP_O_F16, VOP3Op.V_CMP_U_F16, VOP3Op.V_CMP_NGE_F16, VOP3Op.V_CMP_NLG_F16, VOP3Op.V_CMP_NGT_F16, VOP3Op.V_CMP_NLE_F16, VOP3Op.V_CMP_NEQ_F16, VOP3Op.V_CMP_NLT_F16, VOP3Op.V_CMP_LT_F32, VOP3Op.V_CMP_EQ_F32, VOP3Op.V_CMP_LE_F32, VOP3Op.V_CMP_GT_F32, VOP3Op.V_CMP_LG_F32, VOP3Op.V_CMP_GE_F32, VOP3Op.V_CMP_O_F32, VOP3Op.V_CMP_U_F32, VOP3Op.V_CMP_NGE_F32, VOP3Op.V_CMP_NLG_F32, VOP3Op.V_CMP_NGT_F32, VOP3Op.V_CMP_NLE_F32, VOP3Op.V_CMP_NEQ_F32, VOP3Op.V_CMP_NLT_F32, VOP3Op.V_CMP_LT_F64, VOP3Op.V_CMP_EQ_F64, VOP3Op.V_CMP_LE_F64, VOP3Op.V_CMP_GT_F64, VOP3Op.V_CMP_LG_F64, VOP3Op.V_CMP_GE_F64, VOP3Op.V_CMP_O_F64, VOP3Op.V_CMP_U_F64, VOP3Op.V_CMP_NGE_F64, VOP3Op.V_CMP_NLG_F64, VOP3Op.V_CMP_NGT_F64, VOP3Op.V_CMP_NLE_F64, VOP3Op.V_CMP_NEQ_F64, VOP3Op.V_CMP_NLT_F64, VOP3Op.V_CMP_LT_I16, VOP3Op.V_CMP_EQ_I16, VOP3Op.V_CMP_LE_I16, VOP3Op.V_CMP_GT_I16, VOP3Op.V_CMP_NE_I16, VOP3Op.V_CMP_GE_I16, VOP3Op.V_CMP_LT_U16, VOP3Op.V_CMP_EQ_U16, VOP3Op.V_CMP_LE_U16, VOP3Op.V_CMP_GT_U16, VOP3Op.V_CMP_NE_U16, VOP3Op.V_CMP_GE_U16, VOP3Op.V_CMP_LT_I32, VOP3Op.V_CMP_EQ_I32, VOP3Op.V_CMP_LE_I32, VOP3Op.V_CMP_GT_I32, VOP3Op.V_CMP_NE_I32, VOP3Op.V_CMP_GE_I32, VOP3Op.V_CMP_LT_U32, VOP3Op.V_CMP_EQ_U32, VOP3Op.V_CMP_LE_U32, VOP3Op.V_CMP_GT_U32, VOP3Op.V_CMP_NE_U32, VOP3Op.V_CMP_GE_U32, VOP3Op.V_CMP_LT_I64, VOP3Op.V_CMP_EQ_I64, VOP3Op.V_CMP_LE_I64, VOP3Op.V_CMP_GT_I64, VOP3Op.V_CMP_NE_I64, VOP3Op.V_CMP_GE_I64, VOP3Op.V_CMP_LT_U64, VOP3Op.V_CMP_EQ_U64, VOP3Op.V_CMP_LE_U64, VOP3Op.V_CMP_GT_U64, VOP3Op.V_CMP_NE_U64, VOP3Op.V_CMP_GE_U64, VOP3Op.V_CMP_CLASS_F16, VOP3Op.V_CMP_CLASS_F32, VOP3Op.V_CMP_CLASS_F64, VOP3Op.V_CMPX_LT_F16, VOP3Op.V_CMPX_EQ_F16, VOP3Op.V_CMPX_LE_F16, VOP3Op.V_CMPX_GT_F16, VOP3Op.V_CMPX_LG_F16, VOP3Op.V_CMPX_GE_F16, VOP3Op.V_CMPX_O_F16, VOP3Op.V_CMPX_U_F16, VOP3Op.V_CMPX_NGE_F16, VOP3Op.V_CMPX_NLG_F16, VOP3Op.V_CMPX_NGT_F16, VOP3Op.V_CMPX_NLE_F16, VOP3Op.V_CMPX_NEQ_F16, VOP3Op.V_CMPX_NLT_F16, VOP3Op.V_CMPX_LT_F32, VOP3Op.V_CMPX_EQ_F32, VOP3Op.V_CMPX_LE_F32, VOP3Op.V_CMPX_GT_F32, VOP3Op.V_CMPX_LG_F32, VOP3Op.V_CMPX_GE_F32, VOP3Op.V_CMPX_O_F32, VOP3Op.V_CMPX_U_F32, VOP3Op.V_CMPX_NGE_F32, VOP3Op.V_CMPX_NLG_F32, VOP3Op.V_CMPX_NGT_F32, VOP3Op.V_CMPX_NLE_F32, VOP3Op.V_CMPX_NEQ_F32, VOP3Op.V_CMPX_NLT_F32, VOP3Op.V_CMPX_LT_F64, VOP3Op.V_CMPX_EQ_F64, VOP3Op.V_CMPX_LE_F64, VOP3Op.V_CMPX_GT_F64, VOP3Op.V_CMPX_LG_F64, VOP3Op.V_CMPX_GE_F64, VOP3Op.V_CMPX_O_F64, VOP3Op.V_CMPX_U_F64, VOP3Op.V_CMPX_NGE_F64, VOP3Op.V_CMPX_NLG_F64, VOP3Op.V_CMPX_NGT_F64, VOP3Op.V_CMPX_NLE_F64, VOP3Op.V_CMPX_NEQ_F64, VOP3Op.V_CMPX_NLT_F64, VOP3Op.V_CMPX_LT_I16, VOP3Op.V_CMPX_EQ_I16, VOP3Op.V_CMPX_LE_I16, VOP3Op.V_CMPX_GT_I16, VOP3Op.V_CMPX_NE_I16, VOP3Op.V_CMPX_GE_I16, VOP3Op.V_CMPX_LT_U16, VOP3Op.V_CMPX_EQ_U16, VOP3Op.V_CMPX_LE_U16, VOP3Op.V_CMPX_GT_U16, VOP3Op.V_CMPX_NE_U16, VOP3Op.V_CMPX_GE_U16, VOP3Op.V_CMPX_LT_I32, VOP3Op.V_CMPX_EQ_I32, VOP3Op.V_CMPX_LE_I32, VOP3Op.V_CMPX_GT_I32, VOP3Op.V_CMPX_NE_I32, VOP3Op.V_CMPX_GE_I32, VOP3Op.V_CMPX_LT_U32, VOP3Op.V_CMPX_EQ_U32, VOP3Op.V_CMPX_LE_U32, VOP3Op.V_CMPX_GT_U32, VOP3Op.V_CMPX_NE_U32, VOP3Op.V_CMPX_GE_U32, VOP3Op.V_CMPX_LT_I64, VOP3Op.V_CMPX_EQ_I64, VOP3Op.V_CMPX_LE_I64, VOP3Op.V_CMPX_GT_I64, VOP3Op.V_CMPX_NE_I64, VOP3Op.V_CMPX_GE_I64, VOP3Op.V_CMPX_LT_U64, VOP3Op.V_CMPX_EQ_U64, VOP3Op.V_CMPX_LE_U64, VOP3Op.V_CMPX_GT_U64, VOP3Op.V_CMPX_NE_U64, VOP3Op.V_CMPX_GE_U64, VOP3Op.V_CMPX_CLASS_F16, VOP3Op.V_CMPX_CLASS_F32, VOP3Op.V_CMPX_CLASS_F64, VOP3Op.V_READFIRSTLANE_B32, VOP3Op.V_S_EXP_F32, VOP3Op.V_S_EXP_F16, VOP3Op.V_S_LOG_F32, VOP3Op.V_S_LOG_F16, VOP3Op.V_S_RCP_F32, VOP3Op.V_S_RCP_F16, VOP3Op.V_S_RSQ_F32, VOP3Op.V_S_RSQ_F16, VOP3Op.V_S_SQRT_F32, VOP3Op.V_S_SQRT_F16, VOP3Op.V_READLANE_B32}) + vdst = SSrcField(7, 0) + +class VOP3_SDST_LIT(VOP3_SDST): + literal = BitField(95, 64) + +# instruction helpers +ds_add_u32 = functools.partial(DS, DSOp.DS_ADD_U32) +ds_sub_u32 = functools.partial(DS, DSOp.DS_SUB_U32) +ds_rsub_u32 = functools.partial(DS, DSOp.DS_RSUB_U32) +ds_inc_u32 = functools.partial(DS, DSOp.DS_INC_U32) +ds_dec_u32 = functools.partial(DS, DSOp.DS_DEC_U32) +ds_min_i32 = functools.partial(DS, DSOp.DS_MIN_I32) +ds_max_i32 = functools.partial(DS, DSOp.DS_MAX_I32) +ds_min_u32 = functools.partial(DS, DSOp.DS_MIN_U32) +ds_max_u32 = functools.partial(DS, DSOp.DS_MAX_U32) +ds_and_b32 = functools.partial(DS, DSOp.DS_AND_B32) +ds_or_b32 = functools.partial(DS, DSOp.DS_OR_B32) +ds_xor_b32 = functools.partial(DS, DSOp.DS_XOR_B32) +ds_mskor_b32 = functools.partial(DS, DSOp.DS_MSKOR_B32) +ds_store_b32 = functools.partial(DS, DSOp.DS_STORE_B32) +ds_store_2addr_b32 = functools.partial(DS, DSOp.DS_STORE_2ADDR_B32) +ds_store_2addr_stride64_b32 = functools.partial(DS, DSOp.DS_STORE_2ADDR_STRIDE64_B32) +ds_cmpstore_b32 = functools.partial(DS, DSOp.DS_CMPSTORE_B32) +ds_min_num_f32 = functools.partial(DS, DSOp.DS_MIN_NUM_F32) +ds_max_num_f32 = functools.partial(DS, DSOp.DS_MAX_NUM_F32) +ds_nop = functools.partial(DS, DSOp.DS_NOP) +ds_add_f32 = functools.partial(DS, DSOp.DS_ADD_F32) +ds_store_b8 = functools.partial(DS, DSOp.DS_STORE_B8) +ds_store_b16 = functools.partial(DS, DSOp.DS_STORE_B16) +ds_add_rtn_u32 = functools.partial(DS, DSOp.DS_ADD_RTN_U32) +ds_sub_rtn_u32 = functools.partial(DS, DSOp.DS_SUB_RTN_U32) +ds_rsub_rtn_u32 = functools.partial(DS, DSOp.DS_RSUB_RTN_U32) +ds_inc_rtn_u32 = functools.partial(DS, DSOp.DS_INC_RTN_U32) +ds_dec_rtn_u32 = functools.partial(DS, DSOp.DS_DEC_RTN_U32) +ds_min_rtn_i32 = functools.partial(DS, DSOp.DS_MIN_RTN_I32) +ds_max_rtn_i32 = functools.partial(DS, DSOp.DS_MAX_RTN_I32) +ds_min_rtn_u32 = functools.partial(DS, DSOp.DS_MIN_RTN_U32) +ds_max_rtn_u32 = functools.partial(DS, DSOp.DS_MAX_RTN_U32) +ds_and_rtn_b32 = functools.partial(DS, DSOp.DS_AND_RTN_B32) +ds_or_rtn_b32 = functools.partial(DS, DSOp.DS_OR_RTN_B32) +ds_xor_rtn_b32 = functools.partial(DS, DSOp.DS_XOR_RTN_B32) +ds_mskor_rtn_b32 = functools.partial(DS, DSOp.DS_MSKOR_RTN_B32) +ds_storexchg_rtn_b32 = functools.partial(DS, DSOp.DS_STOREXCHG_RTN_B32) +ds_storexchg_2addr_rtn_b32 = functools.partial(DS, DSOp.DS_STOREXCHG_2ADDR_RTN_B32) +ds_storexchg_2addr_stride64_rtn_b32 = functools.partial(DS, DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32) +ds_cmpstore_rtn_b32 = functools.partial(DS, DSOp.DS_CMPSTORE_RTN_B32) +ds_min_num_rtn_f32 = functools.partial(DS, DSOp.DS_MIN_NUM_RTN_F32) +ds_max_num_rtn_f32 = functools.partial(DS, DSOp.DS_MAX_NUM_RTN_F32) +ds_swizzle_b32 = functools.partial(DS, DSOp.DS_SWIZZLE_B32) +ds_load_b32 = functools.partial(DS, DSOp.DS_LOAD_B32) +ds_load_2addr_b32 = functools.partial(DS, DSOp.DS_LOAD_2ADDR_B32) +ds_load_2addr_stride64_b32 = functools.partial(DS, DSOp.DS_LOAD_2ADDR_STRIDE64_B32) +ds_load_i8 = functools.partial(DS, DSOp.DS_LOAD_I8) +ds_load_u8 = functools.partial(DS, DSOp.DS_LOAD_U8) +ds_load_i16 = functools.partial(DS, DSOp.DS_LOAD_I16) +ds_load_u16 = functools.partial(DS, DSOp.DS_LOAD_U16) +ds_consume = functools.partial(DS, DSOp.DS_CONSUME) +ds_append = functools.partial(DS, DSOp.DS_APPEND) +ds_add_u64 = functools.partial(DS, DSOp.DS_ADD_U64) +ds_sub_u64 = functools.partial(DS, DSOp.DS_SUB_U64) +ds_rsub_u64 = functools.partial(DS, DSOp.DS_RSUB_U64) +ds_inc_u64 = functools.partial(DS, DSOp.DS_INC_U64) +ds_dec_u64 = functools.partial(DS, DSOp.DS_DEC_U64) +ds_min_i64 = functools.partial(DS, DSOp.DS_MIN_I64) +ds_max_i64 = functools.partial(DS, DSOp.DS_MAX_I64) +ds_min_u64 = functools.partial(DS, DSOp.DS_MIN_U64) +ds_max_u64 = functools.partial(DS, DSOp.DS_MAX_U64) +ds_and_b64 = functools.partial(DS, DSOp.DS_AND_B64) +ds_or_b64 = functools.partial(DS, DSOp.DS_OR_B64) +ds_xor_b64 = functools.partial(DS, DSOp.DS_XOR_B64) +ds_mskor_b64 = functools.partial(DS, DSOp.DS_MSKOR_B64) +ds_store_b64 = functools.partial(DS, DSOp.DS_STORE_B64) +ds_store_2addr_b64 = functools.partial(DS, DSOp.DS_STORE_2ADDR_B64) +ds_store_2addr_stride64_b64 = functools.partial(DS, DSOp.DS_STORE_2ADDR_STRIDE64_B64) +ds_cmpstore_b64 = functools.partial(DS, DSOp.DS_CMPSTORE_B64) +ds_min_num_f64 = functools.partial(DS, DSOp.DS_MIN_NUM_F64) +ds_max_num_f64 = functools.partial(DS, DSOp.DS_MAX_NUM_F64) +ds_add_rtn_u64 = functools.partial(DS, DSOp.DS_ADD_RTN_U64) +ds_sub_rtn_u64 = functools.partial(DS, DSOp.DS_SUB_RTN_U64) +ds_rsub_rtn_u64 = functools.partial(DS, DSOp.DS_RSUB_RTN_U64) +ds_inc_rtn_u64 = functools.partial(DS, DSOp.DS_INC_RTN_U64) +ds_dec_rtn_u64 = functools.partial(DS, DSOp.DS_DEC_RTN_U64) +ds_min_rtn_i64 = functools.partial(DS, DSOp.DS_MIN_RTN_I64) +ds_max_rtn_i64 = functools.partial(DS, DSOp.DS_MAX_RTN_I64) +ds_min_rtn_u64 = functools.partial(DS, DSOp.DS_MIN_RTN_U64) +ds_max_rtn_u64 = functools.partial(DS, DSOp.DS_MAX_RTN_U64) +ds_and_rtn_b64 = functools.partial(DS, DSOp.DS_AND_RTN_B64) +ds_or_rtn_b64 = functools.partial(DS, DSOp.DS_OR_RTN_B64) +ds_xor_rtn_b64 = functools.partial(DS, DSOp.DS_XOR_RTN_B64) +ds_mskor_rtn_b64 = functools.partial(DS, DSOp.DS_MSKOR_RTN_B64) +ds_storexchg_rtn_b64 = functools.partial(DS, DSOp.DS_STOREXCHG_RTN_B64) +ds_storexchg_2addr_rtn_b64 = functools.partial(DS, DSOp.DS_STOREXCHG_2ADDR_RTN_B64) +ds_storexchg_2addr_stride64_rtn_b64 = functools.partial(DS, DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64) +ds_cmpstore_rtn_b64 = functools.partial(DS, DSOp.DS_CMPSTORE_RTN_B64) +ds_min_num_rtn_f64 = functools.partial(DS, DSOp.DS_MIN_NUM_RTN_F64) +ds_max_num_rtn_f64 = functools.partial(DS, DSOp.DS_MAX_NUM_RTN_F64) +ds_load_b64 = functools.partial(DS, DSOp.DS_LOAD_B64) +ds_load_2addr_b64 = functools.partial(DS, DSOp.DS_LOAD_2ADDR_B64) +ds_load_2addr_stride64_b64 = functools.partial(DS, DSOp.DS_LOAD_2ADDR_STRIDE64_B64) +ds_add_rtn_f32 = functools.partial(DS, DSOp.DS_ADD_RTN_F32) +ds_condxchg32_rtn_b64 = functools.partial(DS, DSOp.DS_CONDXCHG32_RTN_B64) +ds_cond_sub_u32 = functools.partial(DS, DSOp.DS_COND_SUB_U32) +ds_sub_clamp_u32 = functools.partial(DS, DSOp.DS_SUB_CLAMP_U32) +ds_pk_add_f16 = functools.partial(DS, DSOp.DS_PK_ADD_F16) +ds_pk_add_bf16 = functools.partial(DS, DSOp.DS_PK_ADD_BF16) +ds_store_b8_d16_hi = functools.partial(DS, DSOp.DS_STORE_B8_D16_HI) +ds_store_b16_d16_hi = functools.partial(DS, DSOp.DS_STORE_B16_D16_HI) +ds_load_u8_d16 = functools.partial(DS, DSOp.DS_LOAD_U8_D16) +ds_load_u8_d16_hi = functools.partial(DS, DSOp.DS_LOAD_U8_D16_HI) +ds_load_i8_d16 = functools.partial(DS, DSOp.DS_LOAD_I8_D16) +ds_load_i8_d16_hi = functools.partial(DS, DSOp.DS_LOAD_I8_D16_HI) +ds_load_u16_d16 = functools.partial(DS, DSOp.DS_LOAD_U16_D16) +ds_load_u16_d16_hi = functools.partial(DS, DSOp.DS_LOAD_U16_D16_HI) +ds_cond_sub_rtn_u32 = functools.partial(DS, DSOp.DS_COND_SUB_RTN_U32) +ds_sub_clamp_rtn_u32 = functools.partial(DS, DSOp.DS_SUB_CLAMP_RTN_U32) +ds_pk_add_rtn_f16 = functools.partial(DS, DSOp.DS_PK_ADD_RTN_F16) +ds_pk_add_rtn_bf16 = functools.partial(DS, DSOp.DS_PK_ADD_RTN_BF16) +ds_store_addtid_b32 = functools.partial(DS, DSOp.DS_STORE_ADDTID_B32) +ds_load_addtid_b32 = functools.partial(DS, DSOp.DS_LOAD_ADDTID_B32) +ds_permute_b32 = functools.partial(DS, DSOp.DS_PERMUTE_B32) +ds_bpermute_b32 = functools.partial(DS, DSOp.DS_BPERMUTE_B32) +ds_bpermute_fi_b32 = functools.partial(DS, DSOp.DS_BPERMUTE_FI_B32) +ds_store_b96 = functools.partial(DS, DSOp.DS_STORE_B96) +ds_store_b128 = functools.partial(DS, DSOp.DS_STORE_B128) +ds_bvh_stack_push4_pop1_rtn_b32 = functools.partial(DS, DSOp.DS_BVH_STACK_PUSH4_POP1_RTN_B32) +ds_bvh_stack_push8_pop1_rtn_b32 = functools.partial(DS, DSOp.DS_BVH_STACK_PUSH8_POP1_RTN_B32) +ds_bvh_stack_push8_pop2_rtn_b64 = functools.partial(DS, DSOp.DS_BVH_STACK_PUSH8_POP2_RTN_B64) +ds_load_b96 = functools.partial(DS, DSOp.DS_LOAD_B96) +ds_load_b128 = functools.partial(DS, DSOp.DS_LOAD_B128) +s_load_b32 = functools.partial(SMEM, SMEMOp.S_LOAD_B32) +s_load_b64 = functools.partial(SMEM, SMEMOp.S_LOAD_B64) +s_load_b128 = functools.partial(SMEM, SMEMOp.S_LOAD_B128) +s_load_b256 = functools.partial(SMEM, SMEMOp.S_LOAD_B256) +s_load_b512 = functools.partial(SMEM, SMEMOp.S_LOAD_B512) +s_load_b96 = functools.partial(SMEM, SMEMOp.S_LOAD_B96) +s_load_i8 = functools.partial(SMEM, SMEMOp.S_LOAD_I8) +s_load_u8 = functools.partial(SMEM, SMEMOp.S_LOAD_U8) +s_load_i16 = functools.partial(SMEM, SMEMOp.S_LOAD_I16) +s_load_u16 = functools.partial(SMEM, SMEMOp.S_LOAD_U16) +s_buffer_load_b32 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B32) +s_buffer_load_b64 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B64) +s_buffer_load_b128 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B128) +s_buffer_load_b256 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B256) +s_buffer_load_b512 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B512) +s_buffer_load_b96 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_B96) +s_buffer_load_i8 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_I8) +s_buffer_load_u8 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_U8) +s_buffer_load_i16 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_I16) +s_buffer_load_u16 = functools.partial(SMEM, SMEMOp.S_BUFFER_LOAD_U16) +s_dcache_inv = functools.partial(SMEM, SMEMOp.S_DCACHE_INV) +s_atc_probe = functools.partial(SMEM, SMEMOp.S_ATC_PROBE) +s_atc_probe_buffer = functools.partial(SMEM, SMEMOp.S_ATC_PROBE_BUFFER) +s_prefetch_inst = functools.partial(SMEM, SMEMOp.S_PREFETCH_INST) +s_prefetch_inst_pc_rel = functools.partial(SMEM, SMEMOp.S_PREFETCH_INST_PC_REL) +s_prefetch_data = functools.partial(SMEM, SMEMOp.S_PREFETCH_DATA) +s_buffer_prefetch_data = functools.partial(SMEM, SMEMOp.S_BUFFER_PREFETCH_DATA) +s_prefetch_data_pc_rel = functools.partial(SMEM, SMEMOp.S_PREFETCH_DATA_PC_REL) +s_mov_b32 = functools.partial(SOP1, SOP1Op.S_MOV_B32) +s_mov_b64 = functools.partial(SOP1, SOP1Op.S_MOV_B64) +s_cmov_b32 = functools.partial(SOP1, SOP1Op.S_CMOV_B32) +s_cmov_b64 = functools.partial(SOP1, SOP1Op.S_CMOV_B64) +s_brev_b32 = functools.partial(SOP1, SOP1Op.S_BREV_B32) +s_brev_b64 = functools.partial(SOP1, SOP1Op.S_BREV_B64) +s_ctz_i32_b32 = functools.partial(SOP1, SOP1Op.S_CTZ_I32_B32) +s_ctz_i32_b64 = functools.partial(SOP1, SOP1Op.S_CTZ_I32_B64) +s_clz_i32_u32 = functools.partial(SOP1, SOP1Op.S_CLZ_I32_U32) +s_clz_i32_u64 = functools.partial(SOP1, SOP1Op.S_CLZ_I32_U64) +s_cls_i32 = functools.partial(SOP1, SOP1Op.S_CLS_I32) +s_cls_i32_i64 = functools.partial(SOP1, SOP1Op.S_CLS_I32_I64) +s_sext_i32_i8 = functools.partial(SOP1, SOP1Op.S_SEXT_I32_I8) +s_sext_i32_i16 = functools.partial(SOP1, SOP1Op.S_SEXT_I32_I16) +s_bitset0_b32 = functools.partial(SOP1, SOP1Op.S_BITSET0_B32) +s_bitset0_b64 = functools.partial(SOP1, SOP1Op.S_BITSET0_B64) +s_bitset1_b32 = functools.partial(SOP1, SOP1Op.S_BITSET1_B32) +s_bitset1_b64 = functools.partial(SOP1, SOP1Op.S_BITSET1_B64) +s_bitreplicate_b64_b32 = functools.partial(SOP1, SOP1Op.S_BITREPLICATE_B64_B32) +s_abs_i32 = functools.partial(SOP1, SOP1Op.S_ABS_I32) +s_bcnt0_i32_b32 = functools.partial(SOP1, SOP1Op.S_BCNT0_I32_B32) +s_bcnt0_i32_b64 = functools.partial(SOP1, SOP1Op.S_BCNT0_I32_B64) +s_bcnt1_i32_b32 = functools.partial(SOP1, SOP1Op.S_BCNT1_I32_B32) +s_bcnt1_i32_b64 = functools.partial(SOP1, SOP1Op.S_BCNT1_I32_B64) +s_quadmask_b32 = functools.partial(SOP1, SOP1Op.S_QUADMASK_B32) +s_quadmask_b64 = functools.partial(SOP1, SOP1Op.S_QUADMASK_B64) +s_wqm_b32 = functools.partial(SOP1, SOP1Op.S_WQM_B32) +s_wqm_b64 = functools.partial(SOP1, SOP1Op.S_WQM_B64) +s_not_b32 = functools.partial(SOP1, SOP1Op.S_NOT_B32) +s_not_b64 = functools.partial(SOP1, SOP1Op.S_NOT_B64) +s_and_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_SAVEEXEC_B32) +s_and_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_SAVEEXEC_B64) +s_or_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_OR_SAVEEXEC_B32) +s_or_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_OR_SAVEEXEC_B64) +s_xor_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_XOR_SAVEEXEC_B32) +s_xor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_XOR_SAVEEXEC_B64) +s_nand_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_NAND_SAVEEXEC_B32) +s_nand_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_NAND_SAVEEXEC_B64) +s_nor_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_NOR_SAVEEXEC_B32) +s_nor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_NOR_SAVEEXEC_B64) +s_xnor_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_XNOR_SAVEEXEC_B32) +s_xnor_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_XNOR_SAVEEXEC_B64) +s_and_not0_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_NOT0_SAVEEXEC_B32) +s_and_not0_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_NOT0_SAVEEXEC_B64) +s_or_not0_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_OR_NOT0_SAVEEXEC_B32) +s_or_not0_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_OR_NOT0_SAVEEXEC_B64) +s_and_not1_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_NOT1_SAVEEXEC_B32) +s_and_not1_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_NOT1_SAVEEXEC_B64) +s_or_not1_saveexec_b32 = functools.partial(SOP1, SOP1Op.S_OR_NOT1_SAVEEXEC_B32) +s_or_not1_saveexec_b64 = functools.partial(SOP1, SOP1Op.S_OR_NOT1_SAVEEXEC_B64) +s_and_not0_wrexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_NOT0_WREXEC_B32) +s_and_not0_wrexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_NOT0_WREXEC_B64) +s_and_not1_wrexec_b32 = functools.partial(SOP1, SOP1Op.S_AND_NOT1_WREXEC_B32) +s_and_not1_wrexec_b64 = functools.partial(SOP1, SOP1Op.S_AND_NOT1_WREXEC_B64) +s_movrels_b32 = functools.partial(SOP1, SOP1Op.S_MOVRELS_B32) +s_movrels_b64 = functools.partial(SOP1, SOP1Op.S_MOVRELS_B64) +s_movreld_b32 = functools.partial(SOP1, SOP1Op.S_MOVRELD_B32) +s_movreld_b64 = functools.partial(SOP1, SOP1Op.S_MOVRELD_B64) +s_movrelsd_2_b32 = functools.partial(SOP1, SOP1Op.S_MOVRELSD_2_B32) +s_getpc_b64 = functools.partial(SOP1, SOP1Op.S_GETPC_B64) +s_setpc_b64 = functools.partial(SOP1, SOP1Op.S_SETPC_B64) +s_swappc_b64 = functools.partial(SOP1, SOP1Op.S_SWAPPC_B64) +s_rfe_b64 = functools.partial(SOP1, SOP1Op.S_RFE_B64) +s_sendmsg_rtn_b32 = functools.partial(SOP1, SOP1Op.S_SENDMSG_RTN_B32) +s_sendmsg_rtn_b64 = functools.partial(SOP1, SOP1Op.S_SENDMSG_RTN_B64) +s_barrier_signal = functools.partial(SOP1, SOP1Op.S_BARRIER_SIGNAL) +s_barrier_signal_isfirst = functools.partial(SOP1, SOP1Op.S_BARRIER_SIGNAL_ISFIRST) +s_get_barrier_state = functools.partial(SOP1, SOP1Op.S_GET_BARRIER_STATE) +s_barrier_init = functools.partial(SOP1, SOP1Op.S_BARRIER_INIT) +s_barrier_join = functools.partial(SOP1, SOP1Op.S_BARRIER_JOIN) +s_alloc_vgpr = functools.partial(SOP1, SOP1Op.S_ALLOC_VGPR) +s_sleep_var = functools.partial(SOP1, SOP1Op.S_SLEEP_VAR) +s_ceil_f32 = functools.partial(SOP1, SOP1Op.S_CEIL_F32) +s_floor_f32 = functools.partial(SOP1, SOP1Op.S_FLOOR_F32) +s_trunc_f32 = functools.partial(SOP1, SOP1Op.S_TRUNC_F32) +s_rndne_f32 = functools.partial(SOP1, SOP1Op.S_RNDNE_F32) +s_cvt_f32_i32 = functools.partial(SOP1, SOP1Op.S_CVT_F32_I32) +s_cvt_f32_u32 = functools.partial(SOP1, SOP1Op.S_CVT_F32_U32) +s_cvt_i32_f32 = functools.partial(SOP1, SOP1Op.S_CVT_I32_F32) +s_cvt_u32_f32 = functools.partial(SOP1, SOP1Op.S_CVT_U32_F32) +s_cvt_f16_f32 = functools.partial(SOP1, SOP1Op.S_CVT_F16_F32) +s_cvt_f32_f16 = functools.partial(SOP1, SOP1Op.S_CVT_F32_F16) +s_cvt_hi_f32_f16 = functools.partial(SOP1, SOP1Op.S_CVT_HI_F32_F16) +s_ceil_f16 = functools.partial(SOP1, SOP1Op.S_CEIL_F16) +s_floor_f16 = functools.partial(SOP1, SOP1Op.S_FLOOR_F16) +s_trunc_f16 = functools.partial(SOP1, SOP1Op.S_TRUNC_F16) +s_rndne_f16 = functools.partial(SOP1, SOP1Op.S_RNDNE_F16) +s_add_co_u32 = functools.partial(SOP2, SOP2Op.S_ADD_CO_U32) +s_sub_co_u32 = functools.partial(SOP2, SOP2Op.S_SUB_CO_U32) +s_add_co_i32 = functools.partial(SOP2, SOP2Op.S_ADD_CO_I32) +s_sub_co_i32 = functools.partial(SOP2, SOP2Op.S_SUB_CO_I32) +s_add_co_ci_u32 = functools.partial(SOP2, SOP2Op.S_ADD_CO_CI_U32) +s_sub_co_ci_u32 = functools.partial(SOP2, SOP2Op.S_SUB_CO_CI_U32) +s_absdiff_i32 = functools.partial(SOP2, SOP2Op.S_ABSDIFF_I32) +s_lshl_b32 = functools.partial(SOP2, SOP2Op.S_LSHL_B32) +s_lshl_b64 = functools.partial(SOP2, SOP2Op.S_LSHL_B64) +s_lshr_b32 = functools.partial(SOP2, SOP2Op.S_LSHR_B32) +s_lshr_b64 = functools.partial(SOP2, SOP2Op.S_LSHR_B64) +s_ashr_i32 = functools.partial(SOP2, SOP2Op.S_ASHR_I32) +s_ashr_i64 = functools.partial(SOP2, SOP2Op.S_ASHR_I64) +s_lshl1_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL1_ADD_U32) +s_lshl2_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL2_ADD_U32) +s_lshl3_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL3_ADD_U32) +s_lshl4_add_u32 = functools.partial(SOP2, SOP2Op.S_LSHL4_ADD_U32) +s_min_i32 = functools.partial(SOP2, SOP2Op.S_MIN_I32) +s_min_u32 = functools.partial(SOP2, SOP2Op.S_MIN_U32) +s_max_i32 = functools.partial(SOP2, SOP2Op.S_MAX_I32) +s_max_u32 = functools.partial(SOP2, SOP2Op.S_MAX_U32) +s_and_b32 = functools.partial(SOP2, SOP2Op.S_AND_B32) +s_and_b64 = functools.partial(SOP2, SOP2Op.S_AND_B64) +s_or_b32 = functools.partial(SOP2, SOP2Op.S_OR_B32) +s_or_b64 = functools.partial(SOP2, SOP2Op.S_OR_B64) +s_xor_b32 = functools.partial(SOP2, SOP2Op.S_XOR_B32) +s_xor_b64 = functools.partial(SOP2, SOP2Op.S_XOR_B64) +s_nand_b32 = functools.partial(SOP2, SOP2Op.S_NAND_B32) +s_nand_b64 = functools.partial(SOP2, SOP2Op.S_NAND_B64) +s_nor_b32 = functools.partial(SOP2, SOP2Op.S_NOR_B32) +s_nor_b64 = functools.partial(SOP2, SOP2Op.S_NOR_B64) +s_xnor_b32 = functools.partial(SOP2, SOP2Op.S_XNOR_B32) +s_xnor_b64 = functools.partial(SOP2, SOP2Op.S_XNOR_B64) +s_and_not1_b32 = functools.partial(SOP2, SOP2Op.S_AND_NOT1_B32) +s_and_not1_b64 = functools.partial(SOP2, SOP2Op.S_AND_NOT1_B64) +s_or_not1_b32 = functools.partial(SOP2, SOP2Op.S_OR_NOT1_B32) +s_or_not1_b64 = functools.partial(SOP2, SOP2Op.S_OR_NOT1_B64) +s_bfe_u32 = functools.partial(SOP2, SOP2Op.S_BFE_U32) +s_bfe_i32 = functools.partial(SOP2, SOP2Op.S_BFE_I32) +s_bfe_u64 = functools.partial(SOP2, SOP2Op.S_BFE_U64) +s_bfe_i64 = functools.partial(SOP2, SOP2Op.S_BFE_I64) +s_bfm_b32 = functools.partial(SOP2, SOP2Op.S_BFM_B32) +s_bfm_b64 = functools.partial(SOP2, SOP2Op.S_BFM_B64) +s_mul_i32 = functools.partial(SOP2, SOP2Op.S_MUL_I32) +s_mul_hi_u32 = functools.partial(SOP2, SOP2Op.S_MUL_HI_U32) +s_mul_hi_i32 = functools.partial(SOP2, SOP2Op.S_MUL_HI_I32) +s_cselect_b32 = functools.partial(SOP2, SOP2Op.S_CSELECT_B32) +s_cselect_b64 = functools.partial(SOP2, SOP2Op.S_CSELECT_B64) +s_pack_ll_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_LL_B32_B16) +s_pack_lh_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_LH_B32_B16) +s_pack_hh_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_HH_B32_B16) +s_pack_hl_b32_b16 = functools.partial(SOP2, SOP2Op.S_PACK_HL_B32_B16) +s_add_f32 = functools.partial(SOP2, SOP2Op.S_ADD_F32) +s_sub_f32 = functools.partial(SOP2, SOP2Op.S_SUB_F32) +s_min_num_f32 = functools.partial(SOP2, SOP2Op.S_MIN_NUM_F32) +s_max_num_f32 = functools.partial(SOP2, SOP2Op.S_MAX_NUM_F32) +s_mul_f32 = functools.partial(SOP2, SOP2Op.S_MUL_F32) +s_fmaak_f32 = functools.partial(SOP2_LIT, SOP2Op.S_FMAAK_F32) +s_fmamk_f32 = functools.partial(SOP2_LIT, SOP2Op.S_FMAMK_F32) +s_fmac_f32 = functools.partial(SOP2, SOP2Op.S_FMAC_F32) +s_cvt_pk_rtz_f16_f32 = functools.partial(SOP2, SOP2Op.S_CVT_PK_RTZ_F16_F32) +s_add_f16 = functools.partial(SOP2, SOP2Op.S_ADD_F16) +s_sub_f16 = functools.partial(SOP2, SOP2Op.S_SUB_F16) +s_min_num_f16 = functools.partial(SOP2, SOP2Op.S_MIN_NUM_F16) +s_max_num_f16 = functools.partial(SOP2, SOP2Op.S_MAX_NUM_F16) +s_mul_f16 = functools.partial(SOP2, SOP2Op.S_MUL_F16) +s_fmac_f16 = functools.partial(SOP2, SOP2Op.S_FMAC_F16) +s_minimum_f32 = functools.partial(SOP2, SOP2Op.S_MINIMUM_F32) +s_maximum_f32 = functools.partial(SOP2, SOP2Op.S_MAXIMUM_F32) +s_minimum_f16 = functools.partial(SOP2, SOP2Op.S_MINIMUM_F16) +s_maximum_f16 = functools.partial(SOP2, SOP2Op.S_MAXIMUM_F16) +s_add_nc_u64 = functools.partial(SOP2, SOP2Op.S_ADD_NC_U64) +s_sub_nc_u64 = functools.partial(SOP2, SOP2Op.S_SUB_NC_U64) +s_mul_u64 = functools.partial(SOP2, SOP2Op.S_MUL_U64) +s_cmp_eq_i32 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_I32) +s_cmp_lg_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LG_I32) +s_cmp_gt_i32 = functools.partial(SOPC, SOPCOp.S_CMP_GT_I32) +s_cmp_ge_i32 = functools.partial(SOPC, SOPCOp.S_CMP_GE_I32) +s_cmp_lt_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LT_I32) +s_cmp_le_i32 = functools.partial(SOPC, SOPCOp.S_CMP_LE_I32) +s_cmp_eq_u32 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_U32) +s_cmp_lg_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LG_U32) +s_cmp_gt_u32 = functools.partial(SOPC, SOPCOp.S_CMP_GT_U32) +s_cmp_ge_u32 = functools.partial(SOPC, SOPCOp.S_CMP_GE_U32) +s_cmp_lt_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LT_U32) +s_cmp_le_u32 = functools.partial(SOPC, SOPCOp.S_CMP_LE_U32) +s_bitcmp0_b32 = functools.partial(SOPC, SOPCOp.S_BITCMP0_B32) +s_bitcmp1_b32 = functools.partial(SOPC, SOPCOp.S_BITCMP1_B32) +s_bitcmp0_b64 = functools.partial(SOPC, SOPCOp.S_BITCMP0_B64) +s_bitcmp1_b64 = functools.partial(SOPC, SOPCOp.S_BITCMP1_B64) +s_cmp_eq_u64 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_U64) +s_cmp_lg_u64 = functools.partial(SOPC, SOPCOp.S_CMP_LG_U64) +s_cmp_lt_f32 = functools.partial(SOPC, SOPCOp.S_CMP_LT_F32) +s_cmp_eq_f32 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_F32) +s_cmp_le_f32 = functools.partial(SOPC, SOPCOp.S_CMP_LE_F32) +s_cmp_gt_f32 = functools.partial(SOPC, SOPCOp.S_CMP_GT_F32) +s_cmp_lg_f32 = functools.partial(SOPC, SOPCOp.S_CMP_LG_F32) +s_cmp_ge_f32 = functools.partial(SOPC, SOPCOp.S_CMP_GE_F32) +s_cmp_o_f32 = functools.partial(SOPC, SOPCOp.S_CMP_O_F32) +s_cmp_u_f32 = functools.partial(SOPC, SOPCOp.S_CMP_U_F32) +s_cmp_nge_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NGE_F32) +s_cmp_nlg_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NLG_F32) +s_cmp_ngt_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NGT_F32) +s_cmp_nle_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NLE_F32) +s_cmp_neq_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NEQ_F32) +s_cmp_nlt_f32 = functools.partial(SOPC, SOPCOp.S_CMP_NLT_F32) +s_cmp_lt_f16 = functools.partial(SOPC, SOPCOp.S_CMP_LT_F16) +s_cmp_eq_f16 = functools.partial(SOPC, SOPCOp.S_CMP_EQ_F16) +s_cmp_le_f16 = functools.partial(SOPC, SOPCOp.S_CMP_LE_F16) +s_cmp_gt_f16 = functools.partial(SOPC, SOPCOp.S_CMP_GT_F16) +s_cmp_lg_f16 = functools.partial(SOPC, SOPCOp.S_CMP_LG_F16) +s_cmp_ge_f16 = functools.partial(SOPC, SOPCOp.S_CMP_GE_F16) +s_cmp_o_f16 = functools.partial(SOPC, SOPCOp.S_CMP_O_F16) +s_cmp_u_f16 = functools.partial(SOPC, SOPCOp.S_CMP_U_F16) +s_cmp_nge_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NGE_F16) +s_cmp_nlg_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NLG_F16) +s_cmp_ngt_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NGT_F16) +s_cmp_nle_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NLE_F16) +s_cmp_neq_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NEQ_F16) +s_cmp_nlt_f16 = functools.partial(SOPC, SOPCOp.S_CMP_NLT_F16) +s_movk_i32 = functools.partial(SOPK, SOPKOp.S_MOVK_I32) +s_version = functools.partial(SOPK, SOPKOp.S_VERSION) +s_cmovk_i32 = functools.partial(SOPK, SOPKOp.S_CMOVK_I32) +s_addk_co_i32 = functools.partial(SOPK, SOPKOp.S_ADDK_CO_I32) +s_mulk_i32 = functools.partial(SOPK, SOPKOp.S_MULK_I32) +s_getreg_b32 = functools.partial(SOPK, SOPKOp.S_GETREG_B32) +s_setreg_b32 = functools.partial(SOPK, SOPKOp.S_SETREG_B32) +s_setreg_imm32_b32 = functools.partial(SOPK_LIT, SOPKOp.S_SETREG_IMM32_B32) +s_call_b64 = functools.partial(SOPK, SOPKOp.S_CALL_B64) +s_nop = functools.partial(SOPP, SOPPOp.S_NOP) +s_setkill = functools.partial(SOPP, SOPPOp.S_SETKILL) +s_sethalt = functools.partial(SOPP, SOPPOp.S_SETHALT) +s_sleep = functools.partial(SOPP, SOPPOp.S_SLEEP) +s_clause = functools.partial(SOPP, SOPPOp.S_CLAUSE) +s_delay_alu = functools.partial(SOPP, SOPPOp.S_DELAY_ALU) +s_wait_alu = functools.partial(SOPP, SOPPOp.S_WAIT_ALU) +s_waitcnt = functools.partial(SOPP, SOPPOp.S_WAITCNT) +s_wait_idle = functools.partial(SOPP, SOPPOp.S_WAIT_IDLE) +s_wait_event = functools.partial(SOPP, SOPPOp.S_WAIT_EVENT) +s_trap = functools.partial(SOPP, SOPPOp.S_TRAP) +s_round_mode = functools.partial(SOPP, SOPPOp.S_ROUND_MODE) +s_denorm_mode = functools.partial(SOPP, SOPPOp.S_DENORM_MODE) +s_barrier_wait = functools.partial(SOPP, SOPPOp.S_BARRIER_WAIT) +s_barrier_leave = functools.partial(SOPP, SOPPOp.S_BARRIER_LEAVE) +s_code_end = functools.partial(SOPP, SOPPOp.S_CODE_END) +s_branch = functools.partial(SOPP, SOPPOp.S_BRANCH) +s_cbranch_scc0 = functools.partial(SOPP, SOPPOp.S_CBRANCH_SCC0) +s_cbranch_scc1 = functools.partial(SOPP, SOPPOp.S_CBRANCH_SCC1) +s_cbranch_vccz = functools.partial(SOPP, SOPPOp.S_CBRANCH_VCCZ) +s_cbranch_vccnz = functools.partial(SOPP, SOPPOp.S_CBRANCH_VCCNZ) +s_cbranch_execz = functools.partial(SOPP, SOPPOp.S_CBRANCH_EXECZ) +s_cbranch_execnz = functools.partial(SOPP, SOPPOp.S_CBRANCH_EXECNZ) +s_endpgm = functools.partial(SOPP, SOPPOp.S_ENDPGM) +s_endpgm_saved = functools.partial(SOPP, SOPPOp.S_ENDPGM_SAVED) +s_wakeup = functools.partial(SOPP, SOPPOp.S_WAKEUP) +s_setprio = functools.partial(SOPP, SOPPOp.S_SETPRIO) +s_sendmsg = functools.partial(SOPP, SOPPOp.S_SENDMSG) +s_sendmsghalt = functools.partial(SOPP, SOPPOp.S_SENDMSGHALT) +s_incperflevel = functools.partial(SOPP, SOPPOp.S_INCPERFLEVEL) +s_decperflevel = functools.partial(SOPP, SOPPOp.S_DECPERFLEVEL) +s_ttracedata = functools.partial(SOPP, SOPPOp.S_TTRACEDATA) +s_ttracedata_imm = functools.partial(SOPP, SOPPOp.S_TTRACEDATA_IMM) +s_icache_inv = functools.partial(SOPP, SOPPOp.S_ICACHE_INV) +s_wait_loadcnt = functools.partial(SOPP, SOPPOp.S_WAIT_LOADCNT) +s_wait_storecnt = functools.partial(SOPP, SOPPOp.S_WAIT_STORECNT) +s_wait_samplecnt = functools.partial(SOPP, SOPPOp.S_WAIT_SAMPLECNT) +s_wait_bvhcnt = functools.partial(SOPP, SOPPOp.S_WAIT_BVHCNT) +s_wait_expcnt = functools.partial(SOPP, SOPPOp.S_WAIT_EXPCNT) +s_wait_dscnt = functools.partial(SOPP, SOPPOp.S_WAIT_DSCNT) +s_wait_kmcnt = functools.partial(SOPP, SOPPOp.S_WAIT_KMCNT) +s_wait_loadcnt_dscnt = functools.partial(SOPP, SOPPOp.S_WAIT_LOADCNT_DSCNT) +s_wait_storecnt_dscnt = functools.partial(SOPP, SOPPOp.S_WAIT_STORECNT_DSCNT) +buffer_load_format_x = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_FORMAT_X) +buffer_load_format_xy = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_FORMAT_XY) +buffer_load_format_xyz = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_FORMAT_XYZ) +buffer_load_format_xyzw = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_FORMAT_XYZW) +buffer_store_format_x = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_FORMAT_X) +buffer_store_format_xy = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_FORMAT_XY) +buffer_store_format_xyz = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_FORMAT_XYZ) +buffer_store_format_xyzw = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_FORMAT_XYZW) +buffer_load_d16_format_x = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_FORMAT_X) +buffer_load_d16_format_xy = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XY) +buffer_load_d16_format_xyz = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XYZ) +buffer_load_d16_format_xyzw = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XYZW) +buffer_store_d16_format_x = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_D16_FORMAT_X) +buffer_store_d16_format_xy = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_D16_FORMAT_XY) +buffer_store_d16_format_xyz = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_D16_FORMAT_XYZ) +buffer_store_d16_format_xyzw = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_D16_FORMAT_XYZW) +buffer_load_u8 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_U8) +buffer_load_i8 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_I8) +buffer_load_u16 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_U16) +buffer_load_i16 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_I16) +buffer_load_b32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_B32) +buffer_load_b64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_B64) +buffer_load_b96 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_B96) +buffer_load_b128 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_B128) +buffer_store_b8 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_B8) +buffer_store_b16 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_B16) +buffer_store_b32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_B32) +buffer_store_b64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_B64) +buffer_store_b96 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_B96) +buffer_store_b128 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_B128) +buffer_load_d16_u8 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_U8) +buffer_load_d16_i8 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_I8) +buffer_load_d16_b16 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_B16) +buffer_load_d16_hi_u8 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_HI_U8) +buffer_load_d16_hi_i8 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_HI_I8) +buffer_load_d16_hi_b16 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_HI_B16) +buffer_store_d16_hi_b8 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_D16_HI_B8) +buffer_store_d16_hi_b16 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_D16_HI_B16) +buffer_load_d16_hi_format_x = functools.partial(VBUFFER, VBUFFEROp.BUFFER_LOAD_D16_HI_FORMAT_X) +buffer_store_d16_hi_format_x = functools.partial(VBUFFER, VBUFFEROp.BUFFER_STORE_D16_HI_FORMAT_X) +buffer_atomic_swap_b32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_SWAP_B32) +buffer_atomic_cmpswap_b32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_CMPSWAP_B32) +buffer_atomic_add_u32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_ADD_U32) +buffer_atomic_sub_u32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_SUB_U32) +buffer_atomic_sub_clamp_u32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_SUB_CLAMP_U32) +buffer_atomic_min_i32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MIN_I32) +buffer_atomic_min_u32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MIN_U32) +buffer_atomic_max_i32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MAX_I32) +buffer_atomic_max_u32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MAX_U32) +buffer_atomic_and_b32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_AND_B32) +buffer_atomic_or_b32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_OR_B32) +buffer_atomic_xor_b32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_XOR_B32) +buffer_atomic_inc_u32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_INC_U32) +buffer_atomic_dec_u32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_DEC_U32) +buffer_atomic_swap_b64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_SWAP_B64) +buffer_atomic_cmpswap_b64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_CMPSWAP_B64) +buffer_atomic_add_u64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_ADD_U64) +buffer_atomic_sub_u64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_SUB_U64) +buffer_atomic_min_i64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MIN_I64) +buffer_atomic_min_u64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MIN_U64) +buffer_atomic_max_i64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MAX_I64) +buffer_atomic_max_u64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MAX_U64) +buffer_atomic_and_b64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_AND_B64) +buffer_atomic_or_b64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_OR_B64) +buffer_atomic_xor_b64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_XOR_B64) +buffer_atomic_inc_u64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_INC_U64) +buffer_atomic_dec_u64 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_DEC_U64) +buffer_atomic_cond_sub_u32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_COND_SUB_U32) +buffer_atomic_min_num_f32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MIN_NUM_F32) +buffer_atomic_max_num_f32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_MAX_NUM_F32) +buffer_atomic_add_f32 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_ADD_F32) +buffer_atomic_pk_add_f16 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_PK_ADD_F16) +buffer_atomic_pk_add_bf16 = functools.partial(VBUFFER, VBUFFEROp.BUFFER_ATOMIC_PK_ADD_BF16) +tbuffer_load_format_x = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_LOAD_FORMAT_X) +tbuffer_load_format_xy = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_LOAD_FORMAT_XY) +tbuffer_load_format_xyz = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_LOAD_FORMAT_XYZ) +tbuffer_load_format_xyzw = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_LOAD_FORMAT_XYZW) +tbuffer_store_format_x = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_STORE_FORMAT_X) +tbuffer_store_format_xy = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_STORE_FORMAT_XY) +tbuffer_store_format_xyz = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_STORE_FORMAT_XYZ) +tbuffer_store_format_xyzw = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_STORE_FORMAT_XYZW) +tbuffer_load_d16_format_x = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_X) +tbuffer_load_d16_format_xy = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XY) +tbuffer_load_d16_format_xyz = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XYZ) +tbuffer_load_d16_format_xyzw = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XYZW) +tbuffer_store_d16_format_x = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_STORE_D16_FORMAT_X) +tbuffer_store_d16_format_xy = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XY) +tbuffer_store_d16_format_xyz = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XYZ) +tbuffer_store_d16_format_xyzw = functools.partial(VBUFFER, VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XYZW) +ds_param_load = functools.partial(VDSDIR, VDSDIROp.DS_PARAM_LOAD) +ds_direct_load = functools.partial(VDSDIR, VDSDIROp.DS_DIRECT_LOAD) +export = functools.partial(VEXPORT, VEXPORTOp.EXPORT) +flat_load_u8 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_U8) +flat_load_i8 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_I8) +flat_load_u16 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_U16) +flat_load_i16 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_I16) +flat_load_b32 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_B32) +flat_load_b64 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_B64) +flat_load_b96 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_B96) +flat_load_b128 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_B128) +flat_store_b8 = functools.partial(VFLAT, VFLATOp.FLAT_STORE_B8) +flat_store_b16 = functools.partial(VFLAT, VFLATOp.FLAT_STORE_B16) +flat_store_b32 = functools.partial(VFLAT, VFLATOp.FLAT_STORE_B32) +flat_store_b64 = functools.partial(VFLAT, VFLATOp.FLAT_STORE_B64) +flat_store_b96 = functools.partial(VFLAT, VFLATOp.FLAT_STORE_B96) +flat_store_b128 = functools.partial(VFLAT, VFLATOp.FLAT_STORE_B128) +flat_load_d16_u8 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_D16_U8) +flat_load_d16_i8 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_D16_I8) +flat_load_d16_b16 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_D16_B16) +flat_load_d16_hi_u8 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_D16_HI_U8) +flat_load_d16_hi_i8 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_D16_HI_I8) +flat_load_d16_hi_b16 = functools.partial(VFLAT, VFLATOp.FLAT_LOAD_D16_HI_B16) +flat_store_d16_hi_b8 = functools.partial(VFLAT, VFLATOp.FLAT_STORE_D16_HI_B8) +flat_store_d16_hi_b16 = functools.partial(VFLAT, VFLATOp.FLAT_STORE_D16_HI_B16) +flat_atomic_swap_b32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_SWAP_B32) +flat_atomic_cmpswap_b32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_CMPSWAP_B32) +flat_atomic_add_u32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_ADD_U32) +flat_atomic_sub_u32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_SUB_U32) +flat_atomic_sub_clamp_u32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_SUB_CLAMP_U32) +flat_atomic_min_i32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MIN_I32) +flat_atomic_min_u32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MIN_U32) +flat_atomic_max_i32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MAX_I32) +flat_atomic_max_u32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MAX_U32) +flat_atomic_and_b32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_AND_B32) +flat_atomic_or_b32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_OR_B32) +flat_atomic_xor_b32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_XOR_B32) +flat_atomic_inc_u32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_INC_U32) +flat_atomic_dec_u32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_DEC_U32) +flat_atomic_swap_b64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_SWAP_B64) +flat_atomic_cmpswap_b64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_CMPSWAP_B64) +flat_atomic_add_u64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_ADD_U64) +flat_atomic_sub_u64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_SUB_U64) +flat_atomic_min_i64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MIN_I64) +flat_atomic_min_u64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MIN_U64) +flat_atomic_max_i64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MAX_I64) +flat_atomic_max_u64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MAX_U64) +flat_atomic_and_b64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_AND_B64) +flat_atomic_or_b64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_OR_B64) +flat_atomic_xor_b64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_XOR_B64) +flat_atomic_inc_u64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_INC_U64) +flat_atomic_dec_u64 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_DEC_U64) +flat_atomic_cond_sub_u32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_COND_SUB_U32) +flat_atomic_min_num_f32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MIN_NUM_F32) +flat_atomic_max_num_f32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_MAX_NUM_F32) +flat_atomic_add_f32 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_ADD_F32) +flat_atomic_pk_add_f16 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_PK_ADD_F16) +flat_atomic_pk_add_bf16 = functools.partial(VFLAT, VFLATOp.FLAT_ATOMIC_PK_ADD_BF16) +global_load_u8 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_U8) +global_load_i8 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_I8) +global_load_u16 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_U16) +global_load_i16 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_I16) +global_load_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_B32) +global_load_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_B64) +global_load_b96 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_B96) +global_load_b128 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_B128) +global_store_b8 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_B8) +global_store_b16 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_B16) +global_store_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_B32) +global_store_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_B64) +global_store_b96 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_B96) +global_store_b128 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_B128) +global_load_d16_u8 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_D16_U8) +global_load_d16_i8 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_D16_I8) +global_load_d16_b16 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_D16_B16) +global_load_d16_hi_u8 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_D16_HI_U8) +global_load_d16_hi_i8 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_D16_HI_I8) +global_load_d16_hi_b16 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_D16_HI_B16) +global_store_d16_hi_b8 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_D16_HI_B8) +global_store_d16_hi_b16 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_D16_HI_B16) +global_load_addtid_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_ADDTID_B32) +global_store_addtid_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_ADDTID_B32) +global_inv = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_INV) +global_wb = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_WB) +global_atomic_swap_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_SWAP_B32) +global_atomic_cmpswap_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B32) +global_atomic_add_u32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_ADD_U32) +global_atomic_sub_u32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_SUB_U32) +global_atomic_sub_clamp_u32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_SUB_CLAMP_U32) +global_atomic_min_i32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MIN_I32) +global_atomic_min_u32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MIN_U32) +global_atomic_max_i32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MAX_I32) +global_atomic_max_u32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MAX_U32) +global_atomic_and_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_AND_B32) +global_atomic_or_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_OR_B32) +global_atomic_xor_b32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_XOR_B32) +global_atomic_inc_u32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_INC_U32) +global_atomic_dec_u32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_DEC_U32) +global_atomic_swap_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_SWAP_B64) +global_atomic_cmpswap_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B64) +global_atomic_add_u64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_ADD_U64) +global_atomic_sub_u64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_SUB_U64) +global_atomic_min_i64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MIN_I64) +global_atomic_min_u64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MIN_U64) +global_atomic_max_i64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MAX_I64) +global_atomic_max_u64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MAX_U64) +global_atomic_and_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_AND_B64) +global_atomic_or_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_OR_B64) +global_atomic_xor_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_XOR_B64) +global_atomic_inc_u64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_INC_U64) +global_atomic_dec_u64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_DEC_U64) +global_wbinv = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_WBINV) +global_atomic_cond_sub_u32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_COND_SUB_U32) +global_atomic_min_num_f32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MIN_NUM_F32) +global_atomic_max_num_f32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_MAX_NUM_F32) +global_load_block = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_BLOCK) +global_store_block = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_STORE_BLOCK) +global_atomic_add_f32 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_ADD_F32) +global_load_tr_b128 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_TR_B128) +global_load_tr_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_LOAD_TR_B64) +global_atomic_pk_add_f16 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_PK_ADD_F16) +global_atomic_pk_add_bf16 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_PK_ADD_BF16) +global_atomic_ordered_add_b64 = functools.partial(VGLOBAL, VGLOBALOp.GLOBAL_ATOMIC_ORDERED_ADD_B64) +image_load = functools.partial(VIMAGE, VIMAGEOp.IMAGE_LOAD) +image_load_mip = functools.partial(VIMAGE, VIMAGEOp.IMAGE_LOAD_MIP) +image_load_pck = functools.partial(VIMAGE, VIMAGEOp.IMAGE_LOAD_PCK) +image_load_pck_sgn = functools.partial(VIMAGE, VIMAGEOp.IMAGE_LOAD_PCK_SGN) +image_load_mip_pck = functools.partial(VIMAGE, VIMAGEOp.IMAGE_LOAD_MIP_PCK) +image_load_mip_pck_sgn = functools.partial(VIMAGE, VIMAGEOp.IMAGE_LOAD_MIP_PCK_SGN) +image_store = functools.partial(VIMAGE, VIMAGEOp.IMAGE_STORE) +image_store_mip = functools.partial(VIMAGE, VIMAGEOp.IMAGE_STORE_MIP) +image_store_pck = functools.partial(VIMAGE, VIMAGEOp.IMAGE_STORE_PCK) +image_store_mip_pck = functools.partial(VIMAGE, VIMAGEOp.IMAGE_STORE_MIP_PCK) +image_atomic_swap = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_SWAP) +image_atomic_cmpswap = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_CMPSWAP) +image_atomic_add_uint = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_ADD_UINT) +image_atomic_sub_uint = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_SUB_UINT) +image_atomic_min_int = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_MIN_INT) +image_atomic_min_uint = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_MIN_UINT) +image_atomic_max_int = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_MAX_INT) +image_atomic_max_uint = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_MAX_UINT) +image_atomic_and = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_AND) +image_atomic_or = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_OR) +image_atomic_xor = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_XOR) +image_atomic_inc_uint = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_INC_UINT) +image_atomic_dec_uint = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_DEC_UINT) +image_get_resinfo = functools.partial(VIMAGE, VIMAGEOp.IMAGE_GET_RESINFO) +image_bvh_intersect_ray = functools.partial(VIMAGE, VIMAGEOp.IMAGE_BVH_INTERSECT_RAY) +image_bvh64_intersect_ray = functools.partial(VIMAGE, VIMAGEOp.IMAGE_BVH64_INTERSECT_RAY) +image_bvh_dual_intersect_ray = functools.partial(VIMAGE, VIMAGEOp.IMAGE_BVH_DUAL_INTERSECT_RAY) +image_bvh8_intersect_ray = functools.partial(VIMAGE, VIMAGEOp.IMAGE_BVH8_INTERSECT_RAY) +image_atomic_add_flt = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_ADD_FLT) +image_atomic_min_flt = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_MIN_FLT) +image_atomic_max_flt = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_MAX_FLT) +image_atomic_pk_add_f16 = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_PK_ADD_F16) +image_atomic_pk_add_bf16 = functools.partial(VIMAGE, VIMAGEOp.IMAGE_ATOMIC_PK_ADD_BF16) +v_interp_p10_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P10_F32) +v_interp_p2_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P2_F32) +v_interp_p10_f16_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P10_F16_F32) +v_interp_p2_f16_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P2_F16_F32) +v_interp_p10_rtz_f16_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P10_RTZ_F16_F32) +v_interp_p2_rtz_f16_f32 = functools.partial(VINTERP, VINTERPOp.V_INTERP_P2_RTZ_F16_F32) +v_nop_e32 = functools.partial(VOP1, VOP1Op.V_NOP_E32) +v_mov_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOV_B32_E32) +v_readfirstlane_b32_e32 = functools.partial(VOP1_SDST, VOP1Op.V_READFIRSTLANE_B32_E32) +v_cvt_i32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I32_F64_E32) +v_cvt_f64_i32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_I32_E32) +v_cvt_f32_i32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_I32_E32) +v_cvt_f32_u32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_U32_E32) +v_cvt_u32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U32_F32_E32) +v_cvt_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I32_F32_E32) +v_cvt_f16_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_F32_E32) +v_cvt_f32_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_F16_E32) +v_cvt_nearest_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_NEAREST_I32_F32_E32) +v_cvt_floor_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_FLOOR_I32_F32_E32) +v_cvt_off_f32_i4_e32 = functools.partial(VOP1, VOP1Op.V_CVT_OFF_F32_I4_E32) +v_cvt_f32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_F64_E32) +v_cvt_f64_f32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_F32_E32) +v_cvt_f32_ubyte0_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE0_E32) +v_cvt_f32_ubyte1_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE1_E32) +v_cvt_f32_ubyte2_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE2_E32) +v_cvt_f32_ubyte3_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_UBYTE3_E32) +v_cvt_u32_f64_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U32_F64_E32) +v_cvt_f64_u32_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F64_U32_E32) +v_trunc_f64_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F64_E32) +v_ceil_f64_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F64_E32) +v_rndne_f64_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F64_E32) +v_floor_f64_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F64_E32) +v_pipeflush_e32 = functools.partial(VOP1, VOP1Op.V_PIPEFLUSH_E32) +v_mov_b16_e32 = functools.partial(VOP1, VOP1Op.V_MOV_B16_E32) +v_fract_f32_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F32_E32) +v_trunc_f32_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F32_E32) +v_ceil_f32_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F32_E32) +v_rndne_f32_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F32_E32) +v_floor_f32_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F32_E32) +v_exp_f32_e32 = functools.partial(VOP1, VOP1Op.V_EXP_F32_E32) +v_log_f32_e32 = functools.partial(VOP1, VOP1Op.V_LOG_F32_E32) +v_rcp_f32_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F32_E32) +v_rcp_iflag_f32_e32 = functools.partial(VOP1, VOP1Op.V_RCP_IFLAG_F32_E32) +v_rsq_f32_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F32_E32) +v_rcp_f64_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F64_E32) +v_rsq_f64_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F64_E32) +v_sqrt_f32_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F32_E32) +v_sqrt_f64_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F64_E32) +v_sin_f32_e32 = functools.partial(VOP1, VOP1Op.V_SIN_F32_E32) +v_cos_f32_e32 = functools.partial(VOP1, VOP1Op.V_COS_F32_E32) +v_not_b32_e32 = functools.partial(VOP1, VOP1Op.V_NOT_B32_E32) +v_bfrev_b32_e32 = functools.partial(VOP1, VOP1Op.V_BFREV_B32_E32) +v_clz_i32_u32_e32 = functools.partial(VOP1, VOP1Op.V_CLZ_I32_U32_E32) +v_ctz_i32_b32_e32 = functools.partial(VOP1, VOP1Op.V_CTZ_I32_B32_E32) +v_cls_i32_e32 = functools.partial(VOP1, VOP1Op.V_CLS_I32_E32) +v_frexp_exp_i32_f64_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I32_F64_E32) +v_frexp_mant_f64_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F64_E32) +v_fract_f64_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F64_E32) +v_frexp_exp_i32_f32_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I32_F32_E32) +v_frexp_mant_f32_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F32_E32) +v_movreld_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOVRELD_B32_E32) +v_movrels_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOVRELS_B32_E32) +v_movrelsd_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOVRELSD_B32_E32) +v_movrelsd_2_b32_e32 = functools.partial(VOP1, VOP1Op.V_MOVRELSD_2_B32_E32) +v_cvt_f16_u16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_U16_E32) +v_cvt_f16_i16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F16_I16_E32) +v_cvt_u16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U16_F16_E32) +v_cvt_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I16_F16_E32) +v_rcp_f16_e32 = functools.partial(VOP1, VOP1Op.V_RCP_F16_E32) +v_sqrt_f16_e32 = functools.partial(VOP1, VOP1Op.V_SQRT_F16_E32) +v_rsq_f16_e32 = functools.partial(VOP1, VOP1Op.V_RSQ_F16_E32) +v_log_f16_e32 = functools.partial(VOP1, VOP1Op.V_LOG_F16_E32) +v_exp_f16_e32 = functools.partial(VOP1, VOP1Op.V_EXP_F16_E32) +v_frexp_mant_f16_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_MANT_F16_E32) +v_frexp_exp_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_FREXP_EXP_I16_F16_E32) +v_floor_f16_e32 = functools.partial(VOP1, VOP1Op.V_FLOOR_F16_E32) +v_ceil_f16_e32 = functools.partial(VOP1, VOP1Op.V_CEIL_F16_E32) +v_trunc_f16_e32 = functools.partial(VOP1, VOP1Op.V_TRUNC_F16_E32) +v_rndne_f16_e32 = functools.partial(VOP1, VOP1Op.V_RNDNE_F16_E32) +v_fract_f16_e32 = functools.partial(VOP1, VOP1Op.V_FRACT_F16_E32) +v_sin_f16_e32 = functools.partial(VOP1, VOP1Op.V_SIN_F16_E32) +v_cos_f16_e32 = functools.partial(VOP1, VOP1Op.V_COS_F16_E32) +v_sat_pk_u8_i16_e32 = functools.partial(VOP1, VOP1Op.V_SAT_PK_U8_I16_E32) +v_cvt_norm_i16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_NORM_I16_F16_E32) +v_cvt_norm_u16_f16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_NORM_U16_F16_E32) +v_swap_b32_e32 = functools.partial(VOP1, VOP1Op.V_SWAP_B32_E32) +v_swap_b16_e32 = functools.partial(VOP1, VOP1Op.V_SWAP_B16_E32) +v_permlane64_b32_e32 = functools.partial(VOP1, VOP1Op.V_PERMLANE64_B32_E32) +v_swaprel_b32_e32 = functools.partial(VOP1, VOP1Op.V_SWAPREL_B32_E32) +v_not_b16_e32 = functools.partial(VOP1, VOP1Op.V_NOT_B16_E32) +v_cvt_i32_i16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_I32_I16_E32) +v_cvt_u32_u16_e32 = functools.partial(VOP1, VOP1Op.V_CVT_U32_U16_E32) +v_cvt_f32_fp8_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_FP8_E32) +v_cvt_f32_bf8_e32 = functools.partial(VOP1, VOP1Op.V_CVT_F32_BF8_E32) +v_cvt_pk_f32_fp8_e32 = functools.partial(VOP1, VOP1Op.V_CVT_PK_F32_FP8_E32) +v_cvt_pk_f32_bf8_e32 = functools.partial(VOP1, VOP1Op.V_CVT_PK_F32_BF8_E32) +v_cndmask_b32_e32 = functools.partial(VOP2, VOP2Op.V_CNDMASK_B32_E32) +v_add_f64_e32 = functools.partial(VOP2, VOP2Op.V_ADD_F64_E32) +v_add_f32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_F32_E32) +v_sub_f32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_F32_E32) +v_subrev_f32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_F32_E32) +v_mul_f64_e32 = functools.partial(VOP2, VOP2Op.V_MUL_F64_E32) +v_mul_dx9_zero_f32_e32 = functools.partial(VOP2, VOP2Op.V_MUL_DX9_ZERO_F32_E32) +v_mul_f32_e32 = functools.partial(VOP2, VOP2Op.V_MUL_F32_E32) +v_mul_i32_i24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_I32_I24_E32) +v_mul_hi_i32_i24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_HI_I32_I24_E32) +v_mul_u32_u24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_U32_U24_E32) +v_mul_hi_u32_u24_e32 = functools.partial(VOP2, VOP2Op.V_MUL_HI_U32_U24_E32) +v_min_num_f64_e32 = functools.partial(VOP2, VOP2Op.V_MIN_NUM_F64_E32) +v_max_num_f64_e32 = functools.partial(VOP2, VOP2Op.V_MAX_NUM_F64_E32) +v_min_i32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_I32_E32) +v_max_i32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_I32_E32) +v_min_u32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_U32_E32) +v_max_u32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_U32_E32) +v_min_num_f32_e32 = functools.partial(VOP2, VOP2Op.V_MIN_NUM_F32_E32) +v_max_num_f32_e32 = functools.partial(VOP2, VOP2Op.V_MAX_NUM_F32_E32) +v_lshlrev_b32_e32 = functools.partial(VOP2, VOP2Op.V_LSHLREV_B32_E32) +v_lshrrev_b32_e32 = functools.partial(VOP2, VOP2Op.V_LSHRREV_B32_E32) +v_ashrrev_i32_e32 = functools.partial(VOP2, VOP2Op.V_ASHRREV_I32_E32) +v_and_b32_e32 = functools.partial(VOP2, VOP2Op.V_AND_B32_E32) +v_or_b32_e32 = functools.partial(VOP2, VOP2Op.V_OR_B32_E32) +v_xor_b32_e32 = functools.partial(VOP2, VOP2Op.V_XOR_B32_E32) +v_xnor_b32_e32 = functools.partial(VOP2, VOP2Op.V_XNOR_B32_E32) +v_lshlrev_b64_e32 = functools.partial(VOP2, VOP2Op.V_LSHLREV_B64_E32) +v_add_co_ci_u32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_CO_CI_U32_E32) +v_sub_co_ci_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_CO_CI_U32_E32) +v_subrev_co_ci_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_CO_CI_U32_E32) +v_add_nc_u32_e32 = functools.partial(VOP2, VOP2Op.V_ADD_NC_U32_E32) +v_sub_nc_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUB_NC_U32_E32) +v_subrev_nc_u32_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_NC_U32_E32) +v_fmac_f32_e32 = functools.partial(VOP2, VOP2Op.V_FMAC_F32_E32) +v_fmamk_f32_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAMK_F32_E32) +v_fmaak_f32_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAAK_F32_E32) +v_cvt_pk_rtz_f16_f32_e32 = functools.partial(VOP2, VOP2Op.V_CVT_PK_RTZ_F16_F32_E32) +v_min_num_f16_e32 = functools.partial(VOP2, VOP2Op.V_MIN_NUM_F16_E32) +v_max_num_f16_e32 = functools.partial(VOP2, VOP2Op.V_MAX_NUM_F16_E32) +v_add_f16_e32 = functools.partial(VOP2, VOP2Op.V_ADD_F16_E32) +v_sub_f16_e32 = functools.partial(VOP2, VOP2Op.V_SUB_F16_E32) +v_subrev_f16_e32 = functools.partial(VOP2, VOP2Op.V_SUBREV_F16_E32) +v_mul_f16_e32 = functools.partial(VOP2, VOP2Op.V_MUL_F16_E32) +v_fmac_f16_e32 = functools.partial(VOP2, VOP2Op.V_FMAC_F16_E32) +v_fmamk_f16_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAMK_F16_E32) +v_fmaak_f16_e32 = functools.partial(VOP2_LIT, VOP2Op.V_FMAAK_F16_E32) +v_ldexp_f16_e32 = functools.partial(VOP2, VOP2Op.V_LDEXP_F16_E32) +v_pk_fmac_f16_e32 = functools.partial(VOP2, VOP2Op.V_PK_FMAC_F16_E32) +v_cmp_lt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F16_E64) +v_cmp_eq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F16_E64) +v_cmp_le_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F16_E64) +v_cmp_gt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F16_E64) +v_cmp_lg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F16_E64) +v_cmp_ge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F16_E64) +v_cmp_o_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F16_E64) +v_cmp_u_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F16_E64) +v_cmp_nge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F16_E64) +v_cmp_nlg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F16_E64) +v_cmp_ngt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F16_E64) +v_cmp_nle_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F16_E64) +v_cmp_neq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F16_E64) +v_cmp_nlt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F16_E64) +v_cmp_lt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F32_E64) +v_cmp_eq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F32_E64) +v_cmp_le_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F32_E64) +v_cmp_gt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F32_E64) +v_cmp_lg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F32_E64) +v_cmp_ge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F32_E64) +v_cmp_o_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F32_E64) +v_cmp_u_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F32_E64) +v_cmp_nge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F32_E64) +v_cmp_nlg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F32_E64) +v_cmp_ngt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F32_E64) +v_cmp_nle_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F32_E64) +v_cmp_neq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F32_E64) +v_cmp_nlt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F32_E64) +v_cmp_lt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_F64_E64) +v_cmp_eq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_F64_E64) +v_cmp_le_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_F64_E64) +v_cmp_gt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_F64_E64) +v_cmp_lg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LG_F64_E64) +v_cmp_ge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_F64_E64) +v_cmp_o_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_O_F64_E64) +v_cmp_u_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_U_F64_E64) +v_cmp_nge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGE_F64_E64) +v_cmp_nlg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLG_F64_E64) +v_cmp_ngt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NGT_F64_E64) +v_cmp_nle_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLE_F64_E64) +v_cmp_neq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NEQ_F64_E64) +v_cmp_nlt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NLT_F64_E64) +v_cmp_lt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I16_E64) +v_cmp_eq_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I16_E64) +v_cmp_le_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I16_E64) +v_cmp_gt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I16_E64) +v_cmp_ne_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I16_E64) +v_cmp_ge_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I16_E64) +v_cmp_lt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U16_E64) +v_cmp_eq_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U16_E64) +v_cmp_le_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U16_E64) +v_cmp_gt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U16_E64) +v_cmp_ne_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U16_E64) +v_cmp_ge_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U16_E64) +v_cmp_lt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I32_E64) +v_cmp_eq_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I32_E64) +v_cmp_le_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I32_E64) +v_cmp_gt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I32_E64) +v_cmp_ne_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I32_E64) +v_cmp_ge_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I32_E64) +v_cmp_lt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U32_E64) +v_cmp_eq_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U32_E64) +v_cmp_le_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U32_E64) +v_cmp_gt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U32_E64) +v_cmp_ne_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U32_E64) +v_cmp_ge_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U32_E64) +v_cmp_lt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_I64_E64) +v_cmp_eq_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_I64_E64) +v_cmp_le_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_I64_E64) +v_cmp_gt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_I64_E64) +v_cmp_ne_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_I64_E64) +v_cmp_ge_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_I64_E64) +v_cmp_lt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LT_U64_E64) +v_cmp_eq_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_EQ_U64_E64) +v_cmp_le_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_LE_U64_E64) +v_cmp_gt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GT_U64_E64) +v_cmp_ne_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_NE_U64_E64) +v_cmp_ge_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_GE_U64_E64) +v_cmp_class_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F16_E64) +v_cmp_class_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F32_E64) +v_cmp_class_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMP_CLASS_F64_E64) +v_cmpx_lt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F16_E64) +v_cmpx_eq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F16_E64) +v_cmpx_le_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F16_E64) +v_cmpx_gt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F16_E64) +v_cmpx_lg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F16_E64) +v_cmpx_ge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F16_E64) +v_cmpx_o_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F16_E64) +v_cmpx_u_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F16_E64) +v_cmpx_nge_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F16_E64) +v_cmpx_nlg_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F16_E64) +v_cmpx_ngt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F16_E64) +v_cmpx_nle_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F16_E64) +v_cmpx_neq_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F16_E64) +v_cmpx_nlt_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F16_E64) +v_cmpx_lt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F32_E64) +v_cmpx_eq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F32_E64) +v_cmpx_le_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F32_E64) +v_cmpx_gt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F32_E64) +v_cmpx_lg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F32_E64) +v_cmpx_ge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F32_E64) +v_cmpx_o_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F32_E64) +v_cmpx_u_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F32_E64) +v_cmpx_nge_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F32_E64) +v_cmpx_nlg_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F32_E64) +v_cmpx_ngt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F32_E64) +v_cmpx_nle_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F32_E64) +v_cmpx_neq_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F32_E64) +v_cmpx_nlt_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F32_E64) +v_cmpx_lt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_F64_E64) +v_cmpx_eq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_F64_E64) +v_cmpx_le_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_F64_E64) +v_cmpx_gt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_F64_E64) +v_cmpx_lg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LG_F64_E64) +v_cmpx_ge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_F64_E64) +v_cmpx_o_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_O_F64_E64) +v_cmpx_u_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_U_F64_E64) +v_cmpx_nge_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGE_F64_E64) +v_cmpx_nlg_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLG_F64_E64) +v_cmpx_ngt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NGT_F64_E64) +v_cmpx_nle_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLE_F64_E64) +v_cmpx_neq_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NEQ_F64_E64) +v_cmpx_nlt_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NLT_F64_E64) +v_cmpx_lt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I16_E64) +v_cmpx_eq_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I16_E64) +v_cmpx_le_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I16_E64) +v_cmpx_gt_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I16_E64) +v_cmpx_ne_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I16_E64) +v_cmpx_ge_i16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I16_E64) +v_cmpx_lt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U16_E64) +v_cmpx_eq_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U16_E64) +v_cmpx_le_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U16_E64) +v_cmpx_gt_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U16_E64) +v_cmpx_ne_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U16_E64) +v_cmpx_ge_u16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U16_E64) +v_cmpx_lt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I32_E64) +v_cmpx_eq_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I32_E64) +v_cmpx_le_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I32_E64) +v_cmpx_gt_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I32_E64) +v_cmpx_ne_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I32_E64) +v_cmpx_ge_i32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I32_E64) +v_cmpx_lt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U32_E64) +v_cmpx_eq_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U32_E64) +v_cmpx_le_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U32_E64) +v_cmpx_gt_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U32_E64) +v_cmpx_ne_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U32_E64) +v_cmpx_ge_u32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U32_E64) +v_cmpx_lt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_I64_E64) +v_cmpx_eq_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_I64_E64) +v_cmpx_le_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_I64_E64) +v_cmpx_gt_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_I64_E64) +v_cmpx_ne_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_I64_E64) +v_cmpx_ge_i64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_I64_E64) +v_cmpx_lt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LT_U64_E64) +v_cmpx_eq_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_EQ_U64_E64) +v_cmpx_le_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_LE_U64_E64) +v_cmpx_gt_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GT_U64_E64) +v_cmpx_ne_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_NE_U64_E64) +v_cmpx_ge_u64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_GE_U64_E64) +v_cmpx_class_f16_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F16_E64) +v_cmpx_class_f32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F32_E64) +v_cmpx_class_f64_e64 = functools.partial(VOP3_SDST, VOP3Op.V_CMPX_CLASS_F64_E64) +v_cndmask_b32_e64 = functools.partial(VOP3, VOP3Op.V_CNDMASK_B32_E64) +v_add_f64_e64 = functools.partial(VOP3, VOP3Op.V_ADD_F64_E64) +v_add_f32_e64 = functools.partial(VOP3, VOP3Op.V_ADD_F32_E64) +v_sub_f32_e64 = functools.partial(VOP3, VOP3Op.V_SUB_F32_E64) +v_subrev_f32_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_F32_E64) +v_mul_f64_e64 = functools.partial(VOP3, VOP3Op.V_MUL_F64_E64) +v_mul_dx9_zero_f32_e64 = functools.partial(VOP3, VOP3Op.V_MUL_DX9_ZERO_F32_E64) +v_mul_f32_e64 = functools.partial(VOP3, VOP3Op.V_MUL_F32_E64) +v_mul_i32_i24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_I32_I24_E64) +v_mul_hi_i32_i24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_HI_I32_I24_E64) +v_mul_u32_u24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_U32_U24_E64) +v_mul_hi_u32_u24_e64 = functools.partial(VOP3, VOP3Op.V_MUL_HI_U32_U24_E64) +v_min_num_f64_e64 = functools.partial(VOP3, VOP3Op.V_MIN_NUM_F64_E64) +v_max_num_f64_e64 = functools.partial(VOP3, VOP3Op.V_MAX_NUM_F64_E64) +v_min_i32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_I32_E64) +v_max_i32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_I32_E64) +v_min_u32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_U32_E64) +v_max_u32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_U32_E64) +v_min_num_f32_e64 = functools.partial(VOP3, VOP3Op.V_MIN_NUM_F32_E64) +v_max_num_f32_e64 = functools.partial(VOP3, VOP3Op.V_MAX_NUM_F32_E64) +v_lshlrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B32_E64) +v_lshrrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B32_E64) +v_ashrrev_i32_e64 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I32_E64) +v_and_b32_e64 = functools.partial(VOP3, VOP3Op.V_AND_B32_E64) +v_or_b32_e64 = functools.partial(VOP3, VOP3Op.V_OR_B32_E64) +v_xor_b32_e64 = functools.partial(VOP3, VOP3Op.V_XOR_B32_E64) +v_xnor_b32_e64 = functools.partial(VOP3, VOP3Op.V_XNOR_B32_E64) +v_lshlrev_b64_e64 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B64_E64) +v_add_nc_u32_e64 = functools.partial(VOP3, VOP3Op.V_ADD_NC_U32_E64) +v_sub_nc_u32_e64 = functools.partial(VOP3, VOP3Op.V_SUB_NC_U32_E64) +v_subrev_nc_u32_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_NC_U32_E64) +v_fmac_f32_e64 = functools.partial(VOP3, VOP3Op.V_FMAC_F32_E64) +v_cvt_pk_rtz_f16_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_PK_RTZ_F16_F32_E64) +v_min_num_f16_e64 = functools.partial(VOP3, VOP3Op.V_MIN_NUM_F16_E64) +v_max_num_f16_e64 = functools.partial(VOP3, VOP3Op.V_MAX_NUM_F16_E64) +v_add_f16_e64 = functools.partial(VOP3, VOP3Op.V_ADD_F16_E64) +v_sub_f16_e64 = functools.partial(VOP3, VOP3Op.V_SUB_F16_E64) +v_subrev_f16_e64 = functools.partial(VOP3, VOP3Op.V_SUBREV_F16_E64) +v_mul_f16_e64 = functools.partial(VOP3, VOP3Op.V_MUL_F16_E64) +v_fmac_f16_e64 = functools.partial(VOP3, VOP3Op.V_FMAC_F16_E64) +v_ldexp_f16_e64 = functools.partial(VOP3, VOP3Op.V_LDEXP_F16_E64) +v_nop_e64 = functools.partial(VOP3, VOP3Op.V_NOP_E64) +v_mov_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOV_B32_E64) +v_readfirstlane_b32_e64 = functools.partial(VOP3_SDST, VOP3Op.V_READFIRSTLANE_B32_E64) +v_cvt_i32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I32_F64_E64) +v_cvt_f64_i32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_I32_E64) +v_cvt_f32_i32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_I32_E64) +v_cvt_f32_u32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_U32_E64) +v_cvt_u32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U32_F32_E64) +v_cvt_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I32_F32_E64) +v_cvt_f16_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_F32_E64) +v_cvt_f32_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_F16_E64) +v_cvt_nearest_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_NEAREST_I32_F32_E64) +v_cvt_floor_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_FLOOR_I32_F32_E64) +v_cvt_off_f32_i4_e64 = functools.partial(VOP3, VOP3Op.V_CVT_OFF_F32_I4_E64) +v_cvt_f32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_F64_E64) +v_cvt_f64_f32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_F32_E64) +v_cvt_f32_ubyte0_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE0_E64) +v_cvt_f32_ubyte1_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE1_E64) +v_cvt_f32_ubyte2_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE2_E64) +v_cvt_f32_ubyte3_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_UBYTE3_E64) +v_cvt_u32_f64_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U32_F64_E64) +v_cvt_f64_u32_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F64_U32_E64) +v_trunc_f64_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F64_E64) +v_ceil_f64_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F64_E64) +v_rndne_f64_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F64_E64) +v_floor_f64_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F64_E64) +v_pipeflush_e64 = functools.partial(VOP3, VOP3Op.V_PIPEFLUSH_E64) +v_mov_b16_e64 = functools.partial(VOP3, VOP3Op.V_MOV_B16_E64) +v_fract_f32_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F32_E64) +v_trunc_f32_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F32_E64) +v_ceil_f32_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F32_E64) +v_rndne_f32_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F32_E64) +v_floor_f32_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F32_E64) +v_exp_f32_e64 = functools.partial(VOP3, VOP3Op.V_EXP_F32_E64) +v_log_f32_e64 = functools.partial(VOP3, VOP3Op.V_LOG_F32_E64) +v_rcp_f32_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F32_E64) +v_rcp_iflag_f32_e64 = functools.partial(VOP3, VOP3Op.V_RCP_IFLAG_F32_E64) +v_rsq_f32_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F32_E64) +v_rcp_f64_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F64_E64) +v_rsq_f64_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F64_E64) +v_sqrt_f32_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F32_E64) +v_sqrt_f64_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F64_E64) +v_sin_f32_e64 = functools.partial(VOP3, VOP3Op.V_SIN_F32_E64) +v_cos_f32_e64 = functools.partial(VOP3, VOP3Op.V_COS_F32_E64) +v_not_b32_e64 = functools.partial(VOP3, VOP3Op.V_NOT_B32_E64) +v_bfrev_b32_e64 = functools.partial(VOP3, VOP3Op.V_BFREV_B32_E64) +v_clz_i32_u32_e64 = functools.partial(VOP3, VOP3Op.V_CLZ_I32_U32_E64) +v_ctz_i32_b32_e64 = functools.partial(VOP3, VOP3Op.V_CTZ_I32_B32_E64) +v_cls_i32_e64 = functools.partial(VOP3, VOP3Op.V_CLS_I32_E64) +v_frexp_exp_i32_f64_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I32_F64_E64) +v_frexp_mant_f64_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F64_E64) +v_fract_f64_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F64_E64) +v_frexp_exp_i32_f32_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I32_F32_E64) +v_frexp_mant_f32_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F32_E64) +v_movreld_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOVRELD_B32_E64) +v_movrels_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOVRELS_B32_E64) +v_movrelsd_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOVRELSD_B32_E64) +v_movrelsd_2_b32_e64 = functools.partial(VOP3, VOP3Op.V_MOVRELSD_2_B32_E64) +v_cvt_f16_u16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_U16_E64) +v_cvt_f16_i16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F16_I16_E64) +v_cvt_u16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U16_F16_E64) +v_cvt_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I16_F16_E64) +v_rcp_f16_e64 = functools.partial(VOP3, VOP3Op.V_RCP_F16_E64) +v_sqrt_f16_e64 = functools.partial(VOP3, VOP3Op.V_SQRT_F16_E64) +v_rsq_f16_e64 = functools.partial(VOP3, VOP3Op.V_RSQ_F16_E64) +v_log_f16_e64 = functools.partial(VOP3, VOP3Op.V_LOG_F16_E64) +v_exp_f16_e64 = functools.partial(VOP3, VOP3Op.V_EXP_F16_E64) +v_frexp_mant_f16_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_MANT_F16_E64) +v_frexp_exp_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_FREXP_EXP_I16_F16_E64) +v_floor_f16_e64 = functools.partial(VOP3, VOP3Op.V_FLOOR_F16_E64) +v_ceil_f16_e64 = functools.partial(VOP3, VOP3Op.V_CEIL_F16_E64) +v_trunc_f16_e64 = functools.partial(VOP3, VOP3Op.V_TRUNC_F16_E64) +v_rndne_f16_e64 = functools.partial(VOP3, VOP3Op.V_RNDNE_F16_E64) +v_fract_f16_e64 = functools.partial(VOP3, VOP3Op.V_FRACT_F16_E64) +v_sin_f16_e64 = functools.partial(VOP3, VOP3Op.V_SIN_F16_E64) +v_cos_f16_e64 = functools.partial(VOP3, VOP3Op.V_COS_F16_E64) +v_sat_pk_u8_i16_e64 = functools.partial(VOP3, VOP3Op.V_SAT_PK_U8_I16_E64) +v_cvt_norm_i16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_NORM_I16_F16_E64) +v_cvt_norm_u16_f16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_NORM_U16_F16_E64) +v_not_b16_e64 = functools.partial(VOP3, VOP3Op.V_NOT_B16_E64) +v_cvt_i32_i16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_I32_I16_E64) +v_cvt_u32_u16_e64 = functools.partial(VOP3, VOP3Op.V_CVT_U32_U16_E64) +v_cvt_f32_fp8_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_FP8_E64) +v_cvt_f32_bf8_e64 = functools.partial(VOP3, VOP3Op.V_CVT_F32_BF8_E64) +v_cvt_pk_f32_fp8_e64 = functools.partial(VOP3, VOP3Op.V_CVT_PK_F32_FP8_E64) +v_cvt_pk_f32_bf8_e64 = functools.partial(VOP3, VOP3Op.V_CVT_PK_F32_BF8_E64) +v_fma_dx9_zero_f32 = functools.partial(VOP3, VOP3Op.V_FMA_DX9_ZERO_F32) +v_mad_i32_i24 = functools.partial(VOP3, VOP3Op.V_MAD_I32_I24) +v_mad_u32_u24 = functools.partial(VOP3, VOP3Op.V_MAD_U32_U24) +v_cubeid_f32 = functools.partial(VOP3, VOP3Op.V_CUBEID_F32) +v_cubesc_f32 = functools.partial(VOP3, VOP3Op.V_CUBESC_F32) +v_cubetc_f32 = functools.partial(VOP3, VOP3Op.V_CUBETC_F32) +v_cubema_f32 = functools.partial(VOP3, VOP3Op.V_CUBEMA_F32) +v_bfe_u32 = functools.partial(VOP3, VOP3Op.V_BFE_U32) +v_bfe_i32 = functools.partial(VOP3, VOP3Op.V_BFE_I32) +v_bfi_b32 = functools.partial(VOP3, VOP3Op.V_BFI_B32) +v_fma_f32 = functools.partial(VOP3, VOP3Op.V_FMA_F32) +v_fma_f64 = functools.partial(VOP3, VOP3Op.V_FMA_F64) +v_lerp_u8 = functools.partial(VOP3, VOP3Op.V_LERP_U8) +v_alignbit_b32 = functools.partial(VOP3, VOP3Op.V_ALIGNBIT_B32) +v_alignbyte_b32 = functools.partial(VOP3, VOP3Op.V_ALIGNBYTE_B32) +v_mullit_f32 = functools.partial(VOP3, VOP3Op.V_MULLIT_F32) +v_min3_i32 = functools.partial(VOP3, VOP3Op.V_MIN3_I32) +v_min3_u32 = functools.partial(VOP3, VOP3Op.V_MIN3_U32) +v_max3_i32 = functools.partial(VOP3, VOP3Op.V_MAX3_I32) +v_max3_u32 = functools.partial(VOP3, VOP3Op.V_MAX3_U32) +v_med3_i32 = functools.partial(VOP3, VOP3Op.V_MED3_I32) +v_med3_u32 = functools.partial(VOP3, VOP3Op.V_MED3_U32) +v_sad_u8 = functools.partial(VOP3, VOP3Op.V_SAD_U8) +v_sad_hi_u8 = functools.partial(VOP3, VOP3Op.V_SAD_HI_U8) +v_sad_u16 = functools.partial(VOP3, VOP3Op.V_SAD_U16) +v_sad_u32 = functools.partial(VOP3, VOP3Op.V_SAD_U32) +v_cvt_pk_u8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_U8_F32) +v_div_fixup_f32 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F32) +v_div_fixup_f64 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F64) +v_min3_num_f32 = functools.partial(VOP3, VOP3Op.V_MIN3_NUM_F32) +v_max3_num_f32 = functools.partial(VOP3, VOP3Op.V_MAX3_NUM_F32) +v_min3_num_f16 = functools.partial(VOP3, VOP3Op.V_MIN3_NUM_F16) +v_max3_num_f16 = functools.partial(VOP3, VOP3Op.V_MAX3_NUM_F16) +v_minimum3_f32 = functools.partial(VOP3, VOP3Op.V_MINIMUM3_F32) +v_maximum3_f32 = functools.partial(VOP3, VOP3Op.V_MAXIMUM3_F32) +v_minimum3_f16 = functools.partial(VOP3, VOP3Op.V_MINIMUM3_F16) +v_maximum3_f16 = functools.partial(VOP3, VOP3Op.V_MAXIMUM3_F16) +v_med3_num_f32 = functools.partial(VOP3, VOP3Op.V_MED3_NUM_F32) +v_med3_num_f16 = functools.partial(VOP3, VOP3Op.V_MED3_NUM_F16) +v_div_fmas_f32 = functools.partial(VOP3, VOP3Op.V_DIV_FMAS_F32) +v_div_fmas_f64 = functools.partial(VOP3, VOP3Op.V_DIV_FMAS_F64) +v_msad_u8 = functools.partial(VOP3, VOP3Op.V_MSAD_U8) +v_qsad_pk_u16_u8 = functools.partial(VOP3, VOP3Op.V_QSAD_PK_U16_U8) +v_mqsad_pk_u16_u8 = functools.partial(VOP3, VOP3Op.V_MQSAD_PK_U16_U8) +v_mqsad_u32_u8 = functools.partial(VOP3, VOP3Op.V_MQSAD_U32_U8) +v_xor3_b32 = functools.partial(VOP3, VOP3Op.V_XOR3_B32) +v_mad_u16 = functools.partial(VOP3, VOP3Op.V_MAD_U16) +v_perm_b32 = functools.partial(VOP3, VOP3Op.V_PERM_B32) +v_xad_u32 = functools.partial(VOP3, VOP3Op.V_XAD_U32) +v_lshl_add_u32 = functools.partial(VOP3, VOP3Op.V_LSHL_ADD_U32) +v_add_lshl_u32 = functools.partial(VOP3, VOP3Op.V_ADD_LSHL_U32) +v_fma_f16 = functools.partial(VOP3, VOP3Op.V_FMA_F16) +v_min3_i16 = functools.partial(VOP3, VOP3Op.V_MIN3_I16) +v_min3_u16 = functools.partial(VOP3, VOP3Op.V_MIN3_U16) +v_max3_i16 = functools.partial(VOP3, VOP3Op.V_MAX3_I16) +v_max3_u16 = functools.partial(VOP3, VOP3Op.V_MAX3_U16) +v_med3_i16 = functools.partial(VOP3, VOP3Op.V_MED3_I16) +v_med3_u16 = functools.partial(VOP3, VOP3Op.V_MED3_U16) +v_mad_i16 = functools.partial(VOP3, VOP3Op.V_MAD_I16) +v_div_fixup_f16 = functools.partial(VOP3, VOP3Op.V_DIV_FIXUP_F16) +v_add3_u32 = functools.partial(VOP3, VOP3Op.V_ADD3_U32) +v_lshl_or_b32 = functools.partial(VOP3, VOP3Op.V_LSHL_OR_B32) +v_and_or_b32 = functools.partial(VOP3, VOP3Op.V_AND_OR_B32) +v_or3_b32 = functools.partial(VOP3, VOP3Op.V_OR3_B32) +v_mad_u32_u16 = functools.partial(VOP3, VOP3Op.V_MAD_U32_U16) +v_mad_i32_i16 = functools.partial(VOP3, VOP3Op.V_MAD_I32_I16) +v_permlane16_b32 = functools.partial(VOP3, VOP3Op.V_PERMLANE16_B32) +v_permlanex16_b32 = functools.partial(VOP3, VOP3Op.V_PERMLANEX16_B32) +v_cndmask_b16 = functools.partial(VOP3, VOP3Op.V_CNDMASK_B16) +v_maxmin_u32 = functools.partial(VOP3, VOP3Op.V_MAXMIN_U32) +v_minmax_u32 = functools.partial(VOP3, VOP3Op.V_MINMAX_U32) +v_maxmin_i32 = functools.partial(VOP3, VOP3Op.V_MAXMIN_I32) +v_minmax_i32 = functools.partial(VOP3, VOP3Op.V_MINMAX_I32) +v_dot2_f16_f16 = functools.partial(VOP3, VOP3Op.V_DOT2_F16_F16) +v_dot2_bf16_bf16 = functools.partial(VOP3, VOP3Op.V_DOT2_BF16_BF16) +v_minmax_num_f32 = functools.partial(VOP3, VOP3Op.V_MINMAX_NUM_F32) +v_maxmin_num_f32 = functools.partial(VOP3, VOP3Op.V_MAXMIN_NUM_F32) +v_minmax_num_f16 = functools.partial(VOP3, VOP3Op.V_MINMAX_NUM_F16) +v_maxmin_num_f16 = functools.partial(VOP3, VOP3Op.V_MAXMIN_NUM_F16) +v_minimummaximum_f32 = functools.partial(VOP3, VOP3Op.V_MINIMUMMAXIMUM_F32) +v_maximumminimum_f32 = functools.partial(VOP3, VOP3Op.V_MAXIMUMMINIMUM_F32) +v_minimummaximum_f16 = functools.partial(VOP3, VOP3Op.V_MINIMUMMAXIMUM_F16) +v_maximumminimum_f16 = functools.partial(VOP3, VOP3Op.V_MAXIMUMMINIMUM_F16) +v_s_exp_f32 = functools.partial(VOP3_SDST, VOP3Op.V_S_EXP_F32) +v_s_exp_f16 = functools.partial(VOP3_SDST, VOP3Op.V_S_EXP_F16) +v_s_log_f32 = functools.partial(VOP3_SDST, VOP3Op.V_S_LOG_F32) +v_s_log_f16 = functools.partial(VOP3_SDST, VOP3Op.V_S_LOG_F16) +v_s_rcp_f32 = functools.partial(VOP3_SDST, VOP3Op.V_S_RCP_F32) +v_s_rcp_f16 = functools.partial(VOP3_SDST, VOP3Op.V_S_RCP_F16) +v_s_rsq_f32 = functools.partial(VOP3_SDST, VOP3Op.V_S_RSQ_F32) +v_s_rsq_f16 = functools.partial(VOP3_SDST, VOP3Op.V_S_RSQ_F16) +v_s_sqrt_f32 = functools.partial(VOP3_SDST, VOP3Op.V_S_SQRT_F32) +v_s_sqrt_f16 = functools.partial(VOP3_SDST, VOP3Op.V_S_SQRT_F16) +v_add_nc_u16 = functools.partial(VOP3, VOP3Op.V_ADD_NC_U16) +v_sub_nc_u16 = functools.partial(VOP3, VOP3Op.V_SUB_NC_U16) +v_mul_lo_u16 = functools.partial(VOP3, VOP3Op.V_MUL_LO_U16) +v_cvt_pk_i16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_I16_F32) +v_cvt_pk_u16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_U16_F32) +v_max_u16 = functools.partial(VOP3, VOP3Op.V_MAX_U16) +v_max_i16 = functools.partial(VOP3, VOP3Op.V_MAX_I16) +v_min_u16 = functools.partial(VOP3, VOP3Op.V_MIN_U16) +v_min_i16 = functools.partial(VOP3, VOP3Op.V_MIN_I16) +v_add_nc_i16 = functools.partial(VOP3, VOP3Op.V_ADD_NC_I16) +v_sub_nc_i16 = functools.partial(VOP3, VOP3Op.V_SUB_NC_I16) +v_permlane16_var_b32 = functools.partial(VOP3, VOP3Op.V_PERMLANE16_VAR_B32) +v_permlanex16_var_b32 = functools.partial(VOP3, VOP3Op.V_PERMLANEX16_VAR_B32) +v_pack_b32_f16 = functools.partial(VOP3, VOP3Op.V_PACK_B32_F16) +v_cvt_pk_norm_i16_f16 = functools.partial(VOP3, VOP3Op.V_CVT_PK_NORM_I16_F16) +v_cvt_pk_norm_u16_f16 = functools.partial(VOP3, VOP3Op.V_CVT_PK_NORM_U16_F16) +v_ldexp_f32 = functools.partial(VOP3, VOP3Op.V_LDEXP_F32) +v_bfm_b32 = functools.partial(VOP3, VOP3Op.V_BFM_B32) +v_bcnt_u32_b32 = functools.partial(VOP3, VOP3Op.V_BCNT_U32_B32) +v_mbcnt_lo_u32_b32 = functools.partial(VOP3, VOP3Op.V_MBCNT_LO_U32_B32) +v_mbcnt_hi_u32_b32 = functools.partial(VOP3, VOP3Op.V_MBCNT_HI_U32_B32) +v_cvt_pk_norm_i16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_NORM_I16_F32) +v_cvt_pk_norm_u16_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_NORM_U16_F32) +v_cvt_pk_u16_u32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_U16_U32) +v_cvt_pk_i16_i32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_I16_I32) +v_sub_nc_i32 = functools.partial(VOP3, VOP3Op.V_SUB_NC_I32) +v_add_nc_i32 = functools.partial(VOP3, VOP3Op.V_ADD_NC_I32) +v_ldexp_f64 = functools.partial(VOP3, VOP3Op.V_LDEXP_F64) +v_mul_lo_u32 = functools.partial(VOP3, VOP3Op.V_MUL_LO_U32) +v_mul_hi_u32 = functools.partial(VOP3, VOP3Op.V_MUL_HI_U32) +v_mul_hi_i32 = functools.partial(VOP3, VOP3Op.V_MUL_HI_I32) +v_trig_preop_f64 = functools.partial(VOP3, VOP3Op.V_TRIG_PREOP_F64) +v_lshlrev_b16 = functools.partial(VOP3, VOP3Op.V_LSHLREV_B16) +v_lshrrev_b16 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B16) +v_ashrrev_i16 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I16) +v_lshrrev_b64 = functools.partial(VOP3, VOP3Op.V_LSHRREV_B64) +v_ashrrev_i64 = functools.partial(VOP3, VOP3Op.V_ASHRREV_I64) +v_minimum_f64 = functools.partial(VOP3, VOP3Op.V_MINIMUM_F64) +v_maximum_f64 = functools.partial(VOP3, VOP3Op.V_MAXIMUM_F64) +v_readlane_b32 = functools.partial(VOP3_SDST, VOP3Op.V_READLANE_B32) +v_writelane_b32 = functools.partial(VOP3, VOP3Op.V_WRITELANE_B32) +v_and_b16 = functools.partial(VOP3, VOP3Op.V_AND_B16) +v_or_b16 = functools.partial(VOP3, VOP3Op.V_OR_B16) +v_xor_b16 = functools.partial(VOP3, VOP3Op.V_XOR_B16) +v_minimum_f32 = functools.partial(VOP3, VOP3Op.V_MINIMUM_F32) +v_maximum_f32 = functools.partial(VOP3, VOP3Op.V_MAXIMUM_F32) +v_minimum_f16 = functools.partial(VOP3, VOP3Op.V_MINIMUM_F16) +v_maximum_f16 = functools.partial(VOP3, VOP3Op.V_MAXIMUM_F16) +v_cvt_pk_fp8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_FP8_F32) +v_cvt_pk_bf8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_PK_BF8_F32) +v_cvt_sr_fp8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SR_FP8_F32) +v_cvt_sr_bf8_f32 = functools.partial(VOP3, VOP3Op.V_CVT_SR_BF8_F32) +v_pk_mad_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MAD_I16) +v_pk_mul_lo_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MUL_LO_U16) +v_pk_add_i16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_I16) +v_pk_sub_i16 = functools.partial(VOP3P, VOP3POp.V_PK_SUB_I16) +v_pk_lshlrev_b16 = functools.partial(VOP3P, VOP3POp.V_PK_LSHLREV_B16) +v_pk_lshrrev_b16 = functools.partial(VOP3P, VOP3POp.V_PK_LSHRREV_B16) +v_pk_ashrrev_i16 = functools.partial(VOP3P, VOP3POp.V_PK_ASHRREV_I16) +v_pk_max_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_I16) +v_pk_min_i16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_I16) +v_pk_mad_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MAD_U16) +v_pk_add_u16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_U16) +v_pk_sub_u16 = functools.partial(VOP3P, VOP3POp.V_PK_SUB_U16) +v_pk_max_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_U16) +v_pk_min_u16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_U16) +v_pk_fma_f16 = functools.partial(VOP3P, VOP3POp.V_PK_FMA_F16) +v_pk_add_f16 = functools.partial(VOP3P, VOP3POp.V_PK_ADD_F16) +v_pk_mul_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MUL_F16) +v_dot2_f32_f16 = functools.partial(VOP3P, VOP3POp.V_DOT2_F32_F16) +v_dot4_i32_iu8 = functools.partial(VOP3P, VOP3POp.V_DOT4_I32_IU8) +v_dot4_u32_u8 = functools.partial(VOP3P, VOP3POp.V_DOT4_U32_U8) +v_dot8_i32_iu4 = functools.partial(VOP3P, VOP3POp.V_DOT8_I32_IU4) +v_dot8_u32_u4 = functools.partial(VOP3P, VOP3POp.V_DOT8_U32_U4) +v_dot2_f32_bf16 = functools.partial(VOP3P, VOP3POp.V_DOT2_F32_BF16) +v_pk_min_num_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MIN_NUM_F16) +v_pk_max_num_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MAX_NUM_F16) +v_pk_minimum_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MINIMUM_F16) +v_pk_maximum_f16 = functools.partial(VOP3P, VOP3POp.V_PK_MAXIMUM_F16) +v_fma_mix_f32 = functools.partial(VOP3P, VOP3POp.V_FMA_MIX_F32) +v_fma_mixlo_f16 = functools.partial(VOP3P, VOP3POp.V_FMA_MIXLO_F16) +v_fma_mixhi_f16 = functools.partial(VOP3P, VOP3POp.V_FMA_MIXHI_F16) +v_dot4_f32_fp8_bf8 = functools.partial(VOP3P, VOP3POp.V_DOT4_F32_FP8_BF8) +v_dot4_f32_bf8_fp8 = functools.partial(VOP3P, VOP3POp.V_DOT4_F32_BF8_FP8) +v_dot4_f32_fp8_fp8 = functools.partial(VOP3P, VOP3POp.V_DOT4_F32_FP8_FP8) +v_dot4_f32_bf8_bf8 = functools.partial(VOP3P, VOP3POp.V_DOT4_F32_BF8_BF8) +v_wmma_f32_16x16x16_f16 = functools.partial(VOP3P, VOP3POp.V_WMMA_F32_16X16X16_F16) +v_wmma_f32_16x16x16_bf16 = functools.partial(VOP3P, VOP3POp.V_WMMA_F32_16X16X16_BF16) +v_wmma_f16_16x16x16_f16 = functools.partial(VOP3P, VOP3POp.V_WMMA_F16_16X16X16_F16) +v_wmma_bf16_16x16x16_bf16 = functools.partial(VOP3P, VOP3POp.V_WMMA_BF16_16X16X16_BF16) +v_wmma_i32_16x16x16_iu8 = functools.partial(VOP3P, VOP3POp.V_WMMA_I32_16X16X16_IU8) +v_wmma_i32_16x16x16_iu4 = functools.partial(VOP3P, VOP3POp.V_WMMA_I32_16X16X16_IU4) +v_wmma_f32_16x16x16_fp8_fp8 = functools.partial(VOP3P, VOP3POp.V_WMMA_F32_16X16X16_FP8_FP8) +v_wmma_f32_16x16x16_fp8_bf8 = functools.partial(VOP3P, VOP3POp.V_WMMA_F32_16X16X16_FP8_BF8) +v_wmma_f32_16x16x16_bf8_fp8 = functools.partial(VOP3P, VOP3POp.V_WMMA_F32_16X16X16_BF8_FP8) +v_wmma_f32_16x16x16_bf8_bf8 = functools.partial(VOP3P, VOP3POp.V_WMMA_F32_16X16X16_BF8_BF8) +v_wmma_i32_16x16x32_iu4 = functools.partial(VOP3P, VOP3POp.V_WMMA_I32_16X16X32_IU4) +v_swmmac_f32_16x16x32_f16 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_F32_16X16X32_F16) +v_swmmac_f32_16x16x32_bf16 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_F32_16X16X32_BF16) +v_swmmac_f16_16x16x32_f16 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_F16_16X16X32_F16) +v_swmmac_bf16_16x16x32_bf16 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_BF16_16X16X32_BF16) +v_swmmac_i32_16x16x32_iu8 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_I32_16X16X32_IU8) +v_swmmac_i32_16x16x32_iu4 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_I32_16X16X32_IU4) +v_swmmac_i32_16x16x64_iu4 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_I32_16X16X64_IU4) +v_swmmac_f32_16x16x32_fp8_fp8 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_F32_16X16X32_FP8_FP8) +v_swmmac_f32_16x16x32_fp8_bf8 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_F32_16X16X32_FP8_BF8) +v_swmmac_f32_16x16x32_bf8_fp8 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_F32_16X16X32_BF8_FP8) +v_swmmac_f32_16x16x32_bf8_bf8 = functools.partial(VOP3P, VOP3POp.V_SWMMAC_F32_16X16X32_BF8_BF8) +v_add_co_ci_u32 = functools.partial(VOP3SD, VOP3SDOp.V_ADD_CO_CI_U32) +v_sub_co_ci_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUB_CO_CI_U32) +v_subrev_co_ci_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUBREV_CO_CI_U32) +v_div_scale_f32 = functools.partial(VOP3SD, VOP3SDOp.V_DIV_SCALE_F32) +v_div_scale_f64 = functools.partial(VOP3SD, VOP3SDOp.V_DIV_SCALE_F64) +v_mad_co_u64_u32 = functools.partial(VOP3SD, VOP3SDOp.V_MAD_CO_U64_U32) +v_mad_co_i64_i32 = functools.partial(VOP3SD, VOP3SDOp.V_MAD_CO_I64_I32) +v_add_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_ADD_CO_U32) +v_sub_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUB_CO_U32) +v_subrev_co_u32 = functools.partial(VOP3SD, VOP3SDOp.V_SUBREV_CO_U32) +v_cmp_lt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F16_E32) +v_cmp_eq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F16_E32) +v_cmp_le_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F16_E32) +v_cmp_gt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F16_E32) +v_cmp_lg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F16_E32) +v_cmp_ge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F16_E32) +v_cmp_o_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F16_E32) +v_cmp_u_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F16_E32) +v_cmp_nge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F16_E32) +v_cmp_nlg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F16_E32) +v_cmp_ngt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F16_E32) +v_cmp_nle_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F16_E32) +v_cmp_neq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F16_E32) +v_cmp_nlt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F16_E32) +v_cmp_lt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F32_E32) +v_cmp_eq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F32_E32) +v_cmp_le_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F32_E32) +v_cmp_gt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F32_E32) +v_cmp_lg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F32_E32) +v_cmp_ge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F32_E32) +v_cmp_o_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F32_E32) +v_cmp_u_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F32_E32) +v_cmp_nge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F32_E32) +v_cmp_nlg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F32_E32) +v_cmp_ngt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F32_E32) +v_cmp_nle_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F32_E32) +v_cmp_neq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F32_E32) +v_cmp_nlt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F32_E32) +v_cmp_lt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_F64_E32) +v_cmp_eq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_F64_E32) +v_cmp_le_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_F64_E32) +v_cmp_gt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_F64_E32) +v_cmp_lg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LG_F64_E32) +v_cmp_ge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_F64_E32) +v_cmp_o_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_O_F64_E32) +v_cmp_u_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_U_F64_E32) +v_cmp_nge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGE_F64_E32) +v_cmp_nlg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLG_F64_E32) +v_cmp_ngt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NGT_F64_E32) +v_cmp_nle_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLE_F64_E32) +v_cmp_neq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NEQ_F64_E32) +v_cmp_nlt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NLT_F64_E32) +v_cmp_lt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I16_E32) +v_cmp_eq_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I16_E32) +v_cmp_le_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I16_E32) +v_cmp_gt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I16_E32) +v_cmp_ne_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I16_E32) +v_cmp_ge_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I16_E32) +v_cmp_lt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U16_E32) +v_cmp_eq_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U16_E32) +v_cmp_le_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U16_E32) +v_cmp_gt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U16_E32) +v_cmp_ne_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U16_E32) +v_cmp_ge_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U16_E32) +v_cmp_lt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I32_E32) +v_cmp_eq_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I32_E32) +v_cmp_le_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I32_E32) +v_cmp_gt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I32_E32) +v_cmp_ne_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I32_E32) +v_cmp_ge_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I32_E32) +v_cmp_lt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U32_E32) +v_cmp_eq_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U32_E32) +v_cmp_le_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U32_E32) +v_cmp_gt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U32_E32) +v_cmp_ne_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U32_E32) +v_cmp_ge_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U32_E32) +v_cmp_lt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_I64_E32) +v_cmp_eq_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_I64_E32) +v_cmp_le_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_I64_E32) +v_cmp_gt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_I64_E32) +v_cmp_ne_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_I64_E32) +v_cmp_ge_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_I64_E32) +v_cmp_lt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LT_U64_E32) +v_cmp_eq_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_EQ_U64_E32) +v_cmp_le_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_LE_U64_E32) +v_cmp_gt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GT_U64_E32) +v_cmp_ne_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_NE_U64_E32) +v_cmp_ge_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_GE_U64_E32) +v_cmp_class_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F16_E32) +v_cmp_class_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F32_E32) +v_cmp_class_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMP_CLASS_F64_E32) +v_cmpx_lt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F16_E32) +v_cmpx_eq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F16_E32) +v_cmpx_le_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F16_E32) +v_cmpx_gt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F16_E32) +v_cmpx_lg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F16_E32) +v_cmpx_ge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F16_E32) +v_cmpx_o_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F16_E32) +v_cmpx_u_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F16_E32) +v_cmpx_nge_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F16_E32) +v_cmpx_nlg_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F16_E32) +v_cmpx_ngt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F16_E32) +v_cmpx_nle_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F16_E32) +v_cmpx_neq_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F16_E32) +v_cmpx_nlt_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F16_E32) +v_cmpx_lt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F32_E32) +v_cmpx_eq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F32_E32) +v_cmpx_le_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F32_E32) +v_cmpx_gt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F32_E32) +v_cmpx_lg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F32_E32) +v_cmpx_ge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F32_E32) +v_cmpx_o_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F32_E32) +v_cmpx_u_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F32_E32) +v_cmpx_nge_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F32_E32) +v_cmpx_nlg_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F32_E32) +v_cmpx_ngt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F32_E32) +v_cmpx_nle_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F32_E32) +v_cmpx_neq_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F32_E32) +v_cmpx_nlt_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F32_E32) +v_cmpx_lt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_F64_E32) +v_cmpx_eq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_F64_E32) +v_cmpx_le_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_F64_E32) +v_cmpx_gt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_F64_E32) +v_cmpx_lg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LG_F64_E32) +v_cmpx_ge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_F64_E32) +v_cmpx_o_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_O_F64_E32) +v_cmpx_u_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_U_F64_E32) +v_cmpx_nge_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGE_F64_E32) +v_cmpx_nlg_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLG_F64_E32) +v_cmpx_ngt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NGT_F64_E32) +v_cmpx_nle_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLE_F64_E32) +v_cmpx_neq_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NEQ_F64_E32) +v_cmpx_nlt_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NLT_F64_E32) +v_cmpx_lt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I16_E32) +v_cmpx_eq_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I16_E32) +v_cmpx_le_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I16_E32) +v_cmpx_gt_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I16_E32) +v_cmpx_ne_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I16_E32) +v_cmpx_ge_i16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I16_E32) +v_cmpx_lt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U16_E32) +v_cmpx_eq_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U16_E32) +v_cmpx_le_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U16_E32) +v_cmpx_gt_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U16_E32) +v_cmpx_ne_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U16_E32) +v_cmpx_ge_u16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U16_E32) +v_cmpx_lt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I32_E32) +v_cmpx_eq_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I32_E32) +v_cmpx_le_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I32_E32) +v_cmpx_gt_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I32_E32) +v_cmpx_ne_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I32_E32) +v_cmpx_ge_i32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I32_E32) +v_cmpx_lt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U32_E32) +v_cmpx_eq_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U32_E32) +v_cmpx_le_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U32_E32) +v_cmpx_gt_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U32_E32) +v_cmpx_ne_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U32_E32) +v_cmpx_ge_u32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U32_E32) +v_cmpx_lt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_I64_E32) +v_cmpx_eq_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_I64_E32) +v_cmpx_le_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_I64_E32) +v_cmpx_gt_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_I64_E32) +v_cmpx_ne_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_I64_E32) +v_cmpx_ge_i64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_I64_E32) +v_cmpx_lt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LT_U64_E32) +v_cmpx_eq_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_EQ_U64_E32) +v_cmpx_le_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_LE_U64_E32) +v_cmpx_gt_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GT_U64_E32) +v_cmpx_ne_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_NE_U64_E32) +v_cmpx_ge_u64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_GE_U64_E32) +v_cmpx_class_f16_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F16_E32) +v_cmpx_class_f32_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F32_E32) +v_cmpx_class_f64_e32 = functools.partial(VOPC, VOPCOp.V_CMPX_CLASS_F64_E32) +v_dual_fmac_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_FMAC_F32) +v_dual_fmaak_f32 = functools.partial(VOPD_LIT, VOPDOp.V_DUAL_FMAAK_F32) +v_dual_fmamk_f32 = functools.partial(VOPD_LIT, VOPDOp.V_DUAL_FMAMK_F32) +v_dual_mul_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_MUL_F32) +v_dual_add_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_ADD_F32) +v_dual_sub_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_SUB_F32) +v_dual_subrev_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_SUBREV_F32) +v_dual_mul_dx9_zero_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_MUL_DX9_ZERO_F32) +v_dual_mov_b32 = functools.partial(VOPD, VOPDOp.V_DUAL_MOV_B32) +v_dual_cndmask_b32 = functools.partial(VOPD, VOPDOp.V_DUAL_CNDMASK_B32) +v_dual_max_num_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_MAX_NUM_F32) +v_dual_min_num_f32 = functools.partial(VOPD, VOPDOp.V_DUAL_MIN_NUM_F32) +v_dual_dot2acc_f32_f16 = functools.partial(VOPD, VOPDOp.V_DUAL_DOT2ACC_F32_F16) +v_dual_dot2acc_f32_bf16 = functools.partial(VOPD, VOPDOp.V_DUAL_DOT2ACC_F32_BF16) +v_dual_add_nc_u32 = functools.partial(VOPD, VOPDOp.V_DUAL_ADD_NC_U32) +v_dual_lshlrev_b32 = functools.partial(VOPD, VOPDOp.V_DUAL_LSHLREV_B32) +v_dual_and_b32 = functools.partial(VOPD, VOPDOp.V_DUAL_AND_B32) +image_msaa_load = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_MSAA_LOAD) +image_sample = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE) +image_sample_d = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D) +image_sample_l = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_L) +image_sample_b = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_B) +image_sample_lz = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_LZ) +image_sample_c = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C) +image_sample_c_d = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_D) +image_sample_c_l = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_L) +image_sample_c_b = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_B) +image_sample_c_lz = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_LZ) +image_sample_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_O) +image_sample_d_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D_O) +image_sample_l_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_L_O) +image_sample_b_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_B_O) +image_sample_lz_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_LZ_O) +image_sample_c_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_O) +image_sample_c_d_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_D_O) +image_sample_c_l_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_L_O) +image_sample_c_b_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_B_O) +image_sample_c_lz_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_LZ_O) +image_gather4 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4) +image_gather4_l = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_L) +image_gather4_b = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_B) +image_gather4_lz = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_LZ) +image_gather4_c = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_C) +image_gather4_c_lz = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_C_LZ) +image_gather4_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_O) +image_gather4_lz_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_LZ_O) +image_gather4_c_lz_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_C_LZ_O) +image_get_lod = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GET_LOD) +image_sample_d_g16 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D_G16) +image_sample_c_d_g16 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_D_G16) +image_sample_d_o_g16 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D_O_G16) +image_sample_c_d_o_g16 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_D_O_G16) +image_sample_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_CL) +image_sample_d_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D_CL) +image_sample_b_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_B_CL) +image_sample_c_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_CL) +image_sample_c_d_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_D_CL) +image_sample_c_b_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_B_CL) +image_sample_cl_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_CL_O) +image_sample_d_cl_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D_CL_O) +image_sample_b_cl_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_B_CL_O) +image_sample_c_cl_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_CL_O) +image_sample_c_d_cl_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_O) +image_sample_c_b_cl_o = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_B_CL_O) +image_sample_c_d_cl_g16 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_G16) +image_sample_d_cl_o_g16 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D_CL_O_G16) +image_sample_c_d_cl_o_g16 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_O_G16) +image_sample_d_cl_g16 = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_SAMPLE_D_CL_G16) +image_gather4_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_CL) +image_gather4_b_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_B_CL) +image_gather4_c_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_C_CL) +image_gather4_c_l = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_C_L) +image_gather4_c_b = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_C_B) +image_gather4_c_b_cl = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4_C_B_CL) +image_gather4h = functools.partial(VSAMPLE, VSAMPLEOp.IMAGE_GATHER4H) +scratch_load_u8 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_U8) +scratch_load_i8 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_I8) +scratch_load_u16 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_U16) +scratch_load_i16 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_I16) +scratch_load_b32 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_B32) +scratch_load_b64 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_B64) +scratch_load_b96 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_B96) +scratch_load_b128 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_B128) +scratch_store_b8 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_B8) +scratch_store_b16 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_B16) +scratch_store_b32 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_B32) +scratch_store_b64 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_B64) +scratch_store_b96 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_B96) +scratch_store_b128 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_B128) +scratch_load_d16_u8 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_D16_U8) +scratch_load_d16_i8 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_D16_I8) +scratch_load_d16_b16 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_D16_B16) +scratch_load_d16_hi_u8 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_D16_HI_U8) +scratch_load_d16_hi_i8 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_D16_HI_I8) +scratch_load_d16_hi_b16 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_D16_HI_B16) +scratch_store_d16_hi_b8 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_D16_HI_B8) +scratch_store_d16_hi_b16 = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_D16_HI_B16) +scratch_load_block = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_LOAD_BLOCK) +scratch_store_block = functools.partial(VSCRATCH, VSCRATCHOp.SCRATCH_STORE_BLOCK) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/operands.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/operands.py new file mode 100644 index 000000000..c13fad790 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/operands.py @@ -0,0 +1,1547 @@ +# autogenerated from AMD ISA XML - do not edit +from tinygrad.runtime.autogen.amd.common import Fmt, OpType +from tinygrad.runtime.autogen.amd.rdna4.enum import DSOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VBUFFEROp, VDSDIROp, VEXPORTOp, VFLATOp, VGLOBALOp, VIMAGEOp, VINTERPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3SDOp, VOPCOp, VOPDOp, VSAMPLEOp, VSCRATCHOp + +# instruction operand info: {Op: {field: (Fmt, size_bits, OpType)}} +OPERANDS = { + VBUFFEROp.BUFFER_ATOMIC_ADD_F32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_ADD_U32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_ADD_U64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_AND_B32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_AND_B64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_CMPSWAP_B32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_CMPSWAP_B64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_COND_SUB_U32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_DEC_U32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_DEC_U64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_INC_U32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_INC_U64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MAX_I32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MAX_I64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MAX_NUM_F32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MAX_U32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MAX_U64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MIN_I32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MIN_I64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MIN_NUM_F32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MIN_U32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_MIN_U64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_OR_B32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_OR_B64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_PK_ADD_BF16: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_PK_ADD_F16: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_SUB_CLAMP_U32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_SUB_U32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_SUB_U64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_SWAP_B32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_SWAP_B64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_XOR_B32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_ATOMIC_XOR_B64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_B128: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_B32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_B64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_B96: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_B16: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XY: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XYZ: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XYZW: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_HI_B16: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_HI_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_HI_I8: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_HI_U8: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_I8: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_D16_U8: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_FORMAT_XY: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_FORMAT_XYZ: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_FORMAT_XYZW: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_I16: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_I8: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_U16: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_LOAD_U8: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_B128: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_B16: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_B32: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_B64: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_B8: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_B96: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_D16_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_D16_FORMAT_XY: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_D16_FORMAT_XYZ: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_D16_FORMAT_XYZW: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_D16_HI_B16: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_D16_HI_B8: {"rsrc": (Fmt.FMT_RSRC_SCRATCH, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_D16_HI_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_FORMAT_XY: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_FORMAT_XYZ: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VBUFFEROp.BUFFER_STORE_FORMAT_XYZW: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + DSOp.DS_ADD_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_ADD_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_ADD_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_ADD_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_ADD_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_ADD_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_AND_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_AND_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_AND_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_AND_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_APPEND: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_BPERMUTE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_BPERMUTE_FI_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_BVH_STACK_PUSH4_POP1_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_BVH_STACK_PUSH8_POP1_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B256, 256, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_BVH_STACK_PUSH8_POP2_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B256, 256, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_CMPSTORE_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_CONDXCHG32_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_COND_SUB_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_COND_SUB_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_CONSUME: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_DEC_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_DEC_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_DEC_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_DEC_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VDSDIROp.DS_DIRECT_LOAD: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_INC_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_INC_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_INC_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_INC_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_2ADDR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_2ADDR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B64, 128, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_2ADDR_STRIDE64_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_2ADDR_STRIDE64_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B64, 128, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_ADDTID_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_B128: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_B96: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B96, 96, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_I16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_I8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_I8_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_I8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U16_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U16_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U8_D16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + DSOp.DS_LOAD_U8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_NUM_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_NUM_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_NUM_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_NUM_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MAX_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MAX_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_NUM_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_NUM_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_NUM_RTN_F32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_NUM_RTN_F64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_I32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_I64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MIN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MIN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MSKOR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MSKOR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_MSKOR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_MSKOR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_OR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_OR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_OR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_OR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + VDSDIROp.DS_PARAM_LOAD: {"attr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_ATTR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_PERMUTE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_PK_ADD_BF16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + DSOp.DS_PK_ADD_F16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + DSOp.DS_PK_ADD_RTN_BF16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + DSOp.DS_PK_ADD_RTN_F16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + DSOp.DS_RSUB_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_RSUB_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_RSUB_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_RSUB_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_2ADDR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_2ADDR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B64, 128, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B32, 64, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_PK2_B64, 128, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STOREXCHG_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STORE_2ADDR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_2ADDR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STORE_2ADDR_STRIDE64_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_2ADDR_STRIDE64_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "data1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STORE_ADDTID_B32: {"data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B128: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B16: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B16_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK2_B16, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B8: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B8, 8, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B8_D16_HI: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_PK4_B8, 32, OpType.OPR_VGPR)}, + DSOp.DS_STORE_B96: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B96, 96, OpType.OPR_VGPR)}, + DSOp.DS_SUB_CLAMP_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_SUB_CLAMP_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_SUB_RTN_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_SUB_RTN_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_SUB_U32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + DSOp.DS_SUB_U64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + DSOp.DS_SWIZZLE_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_XOR_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_XOR_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + DSOp.DS_XOR_RTN_B32: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + DSOp.DS_XOR_RTN_B64: {"addr": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "data0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + VEXPORTOp.EXPORT: {"tgt": (Fmt.FMT_ANY, 128, OpType.OPR_TGT), "vsrc0": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc2": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc3": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_ADD_F32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_ADD_U32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_ADD_U64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_AND_B32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_AND_B64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_CMPSWAP_B32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_CMPSWAP_B64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_COND_SUB_U32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_DEC_U32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_DEC_U64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_INC_U32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_INC_U64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MAX_I32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MAX_I64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MAX_NUM_F32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MAX_U32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MAX_U64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MIN_I32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MIN_I64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MIN_NUM_F32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MIN_U32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_MIN_U64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_OR_B32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_OR_B64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_PK_ADD_BF16: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_PK_ADD_F16: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_SUB_CLAMP_U32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_SUB_U32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_SUB_U64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_SWAP_B32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_SWAP_B64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_XOR_B32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_ATOMIC_XOR_B64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_B128: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_B32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_B64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_B96: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_D16_B16: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_D16_HI_B16: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_D16_HI_I8: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_D16_HI_U8: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_D16_I8: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_D16_U8: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_I16: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_I8: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_U16: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_LOAD_U8: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_STORE_B128: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VFLATOp.FLAT_STORE_B16: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_STORE_B32: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_STORE_B64: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VFLATOp.FLAT_STORE_B8: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_STORE_B96: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VFLATOp.FLAT_STORE_D16_HI_B16: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VFLATOp.FLAT_STORE_D16_HI_B8: {"vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_ADD_F32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_ADD_U32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_ADD_U64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_AND_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_AND_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_COND_SUB_U32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_DEC_U32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_DEC_U64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_INC_U32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_INC_U64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MAX_I32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MAX_I64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MAX_NUM_F32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MAX_U32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MAX_U64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MIN_I32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MIN_I64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MIN_NUM_F32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MIN_U32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_MIN_U64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_ORDERED_ADD_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_OR_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_OR_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_PK_ADD_BF16: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_PK_ADD_F16: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_SUB_CLAMP_U32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_SUB_U32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_SUB_U64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_SWAP_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_SWAP_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_XOR_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_ATOMIC_XOR_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_ADDTID_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_B128: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_B96: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_BLOCK: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 1024, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_D16_B16: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_D16_HI_B16: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_D16_HI_I8: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_D16_HI_U8: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_D16_I8: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_D16_U8: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_I16: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_I8: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_TR_B128: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_TR_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_U16: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_LOAD_U8: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_ADDTID_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_B128: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_B16: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_B32: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_B64: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_B8: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_B96: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_BLOCK: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 1024, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_D16_HI_B16: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VGLOBALOp.GLOBAL_STORE_D16_HI_B8: {"saddr": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_ADD_FLT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_ADD_UINT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_AND: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_CMPSWAP: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_DEC_UINT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_INC_UINT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_MAX_FLT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_MAX_INT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_MAX_UINT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_MIN_FLT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_MIN_INT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_MIN_UINT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_OR: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_PK_ADD_BF16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_PK_ADD_F16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_SUB_UINT: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_SWAP: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_ATOMIC_XOR: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_BVH64_INTERSECT_RAY: {"rsrc": (Fmt.FMT_IMG_BVH, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_BVH8_INTERSECT_RAY: {"rsrc": (Fmt.FMT_IMG_BVH, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 320, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_BVH_DUAL_INTERSECT_RAY: {"rsrc": (Fmt.FMT_IMG_BVH, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 320, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_BVH_INTERSECT_RAY: {"rsrc": (Fmt.FMT_IMG_BVH, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4H: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_B: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_B_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_C: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_C_B: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_C_B_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_C_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_C_L: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_C_LZ: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_C_LZ_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_L: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_LZ: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_LZ_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GATHER4_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_GET_LOD: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_GET_RESINFO: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_LOAD: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_LOAD_MIP: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_LOAD_MIP_PCK: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_LOAD_MIP_PCK_SGN: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_LOAD_PCK: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_LOAD_PCK_SGN: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_MSAA_LOAD: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_B: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_B_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_B_CL_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_B_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_CL_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_B: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_B_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_B_CL_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_B_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_CL_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_D: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_D_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_G16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_D_CL_O_G16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_D_G16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_D_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_D_O_G16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_L: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_LZ: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_LZ_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_L_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_C_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_D: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_D_CL: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_D_CL_G16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_D_CL_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_D_CL_O_G16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_D_G16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_D_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_D_O_G16: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_L: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_LZ: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_LZ_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_L_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSAMPLEOp.IMAGE_SAMPLE_O: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "samp": (Fmt.FMT_SAMP, 128, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_STORE: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_STORE_MIP: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_STORE_MIP_PCK: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VIMAGEOp.IMAGE_STORE_PCK: {"rsrc": (Fmt.FMT_IMG, 256, OpType.OPR_SREG), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_B128: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_B32: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_B64: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_B96: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_BLOCK: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 1024, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_D16_B16: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_D16_HI_B16: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_D16_HI_I8: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_D16_HI_U8: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_D16_I8: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_D16_U8: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_I16: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_I8: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_U16: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_LOAD_U8: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_B128: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_B16: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_B32: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_B64: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_B8: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_B96: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_BLOCK: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 1024, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_D16_HI_B16: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VSCRATCHOp.SCRATCH_STORE_D16_HI_B8: {"saddr": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "vaddr": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR), "vsrc": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + SOP2Op.S_ABSDIFF_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_ABS_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPKOp.S_ADDK_CO_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_ADD_CO_CI_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_CO_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_CO_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ADD_NC_U64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_ALLOC_VGPR: {"ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_AND_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_AND_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT0_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT0_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT0_WREXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT0_WREXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_AND_NOT1_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_AND_NOT1_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT1_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT1_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT1_WREXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_NOT1_WREXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_AND_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_AND_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_ASHR_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_ASHR_I64: {"sdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SMEMOp.S_ATC_PROBE: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B8, 8, OpType.OPR_SIMM8), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_ATC_PROBE_BUFFER: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B8, 8, OpType.OPR_SIMM8), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOP1Op.S_BARRIER_SIGNAL: {"ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_BARRIER_ID)}, + SOP1Op.S_BARRIER_SIGNAL_ISFIRST: {"ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_BARRIER_ID)}, + SOPPOp.S_BARRIER_WAIT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_BCNT0_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT0_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT1_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BCNT1_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_I64: {"sdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFE_U64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFM_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_BFM_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP0_B32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP0_B64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP1_B32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_BITCMP1_B64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITREPLICATE_B64_B32: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET0_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET0_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET1_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BITSET1_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_BRANCH: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOP1Op.S_BREV_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_BREV_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SMEMOp.S_BUFFER_LOAD_B128: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B256: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 256, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B32: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B512: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 512, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B64: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_B96: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 96, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_I16: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_I8: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_U16: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_LOAD_U8: {"sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_BUFFER_PREFETCH_DATA: {"ioffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM24), "sbase": (Fmt.FMT_RSRC_SCALAR, 128, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM5), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET_NOK)}, + SOPKOp.S_CALL_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_EXECNZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_EXECZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_SCC0: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_SCC1: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_VCCNZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOPPOp.S_CBRANCH_VCCZ: {"simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_LABEL)}, + SOP1Op.S_CEIL_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_CEIL_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_CLAUSE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_CLAUSE)}, + SOP1Op.S_CLS_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CLS_I32_I64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_CLZ_I32_U32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CLZ_I32_U64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPKOp.S_CMOVK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_CMOV_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CMOV_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_EQ_U64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GE_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_GT_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LE_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LG_U64: {"ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_I32: {"ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_LT_U32: {"ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NEQ_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NEQ_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NGE_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NGE_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NGT_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NGT_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLE_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLE_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLG_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLG_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLT_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_NLT_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_O_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_O_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_U_F16: {"ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOPCOp.S_CMP_U_F32: {"ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_CSELECT_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_CSELECT_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_CTZ_I32_B32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CTZ_I32_B64: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_F16_F32: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_F32_F16: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_F32_I32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_F32_U32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_HI_F32_F16: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_I32_F32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_CVT_PK_RTZ_F16_F32: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_CVT_U32_F32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_DECPERFLEVEL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_DELAY_ALU: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_DELAY)}, + SOPPOp.S_DENORM_MODE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_FLOOR_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_FLOOR_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_FMAAK_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_FMAC_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_FMAC_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_FMAMK_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_GETPC_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST)}, + SOPKOp.S_GETREG_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOPPOp.S_INCPERFLEVEL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SMEMOp.S_LOAD_B128: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B256: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 256, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B32: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B512: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 512, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B64: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 64, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_B96: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_ANY, 96, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_I16: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_I8: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_U16: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SMEMOp.S_LOAD_U8: {"sbase": (Fmt.FMT_BUF, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET)}, + SOP2Op.S_LSHL1_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL2_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL3_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL4_ADD_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHL_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_LSHR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAXIMUM_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_MAXIMUM_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_NUM_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_NUM_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MAX_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MINIMUM_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_MINIMUM_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_NUM_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_NUM_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MIN_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOPKOp.S_MOVK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_MOVRELD_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_MOVRELD_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_MOVRELSD_2_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + SOP1Op.S_MOVRELS_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + SOP1Op.S_MOVRELS_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOP1Op.S_MOV_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_MOV_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SSRC)}, + SOPKOp.S_MULK_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_MUL_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_HI_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_HI_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_MUL_U64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_NAND_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_NAND_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NAND_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_NAND_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOPPOp.S_NOP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP2Op.S_NOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_NOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NOR_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_NOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_NOT_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_NOT_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_OR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_OR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_OR_NOT0_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_OR_NOT0_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_OR_NOT1_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_OR_NOT1_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_OR_NOT1_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_OR_NOT1_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_OR_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_OR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_HH_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_HL_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_LH_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_PACK_LL_B32_B16: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SSRC)}, + SMEMOp.S_PREFETCH_DATA: {"ioffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM24), "sbase": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM5), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET_NOK)}, + SMEMOp.S_PREFETCH_DATA_PC_REL: {"ioffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM24), "sdata": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM5), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET_NOK)}, + SMEMOp.S_PREFETCH_INST: {"ioffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM24), "sbase": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG), "sdata": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM5), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET_NOK)}, + SMEMOp.S_PREFETCH_INST_PC_REL: {"ioffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM24), "sdata": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SIMM5), "soffset": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SMEM_OFFSET_NOK)}, + SOP1Op.S_QUADMASK_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_QUADMASK_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_RFE_B64: {"ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOP1Op.S_RNDNE_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_RNDNE_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_ROUND_MODE: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_SENDMSG: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SENDMSG)}, + SOPPOp.S_SENDMSGHALT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SENDMSG)}, + SOP1Op.S_SENDMSG_RTN_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SENDMSG_RTN)}, + SOP1Op.S_SENDMSG_RTN_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SENDMSG_RTN)}, + SOPPOp.S_SETHALT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_SETKILL: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_SETPC_B64: {"ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOPPOp.S_SETPRIO: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_SETREG_B32: {"sdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SDST), "simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOPKOp.S_SETREG_IMM32_B32: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_HWREG)}, + SOP1Op.S_SEXT_I32_I16: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_SEXT_I32_I8: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SSRC)}, + SOPPOp.S_SLEEP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SLEEP)}, + SOP1Op.S_SLEEP_VAR: {"ssrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_CO_CI_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_CO_I32: {"sdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_CO_U32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_SUB_NC_U64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_SWAPPC_B64: {"sdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SREG)}, + SOPPOp.S_TRAP: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOP1Op.S_TRUNC_F16: {"sdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SSRC)}, + SOP1Op.S_TRUNC_F32: {"sdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC)}, + SOPPOp.S_TTRACEDATA_IMM: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPKOp.S_VERSION: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VERSION)}, + SOPPOp.S_WAIT_ALU: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_WAIT_ALU)}, + SOPPOp.S_WAIT_BVHCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAIT_DSCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAIT_EVENT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_WAIT_EVENT)}, + SOPPOp.S_WAIT_EXPCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAIT_KMCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAIT_LOADCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAIT_LOADCNT_DSCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_WAIT_MEM_DS)}, + SOPPOp.S_WAIT_SAMPLECNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAIT_STORECNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SIMM16)}, + SOPPOp.S_WAIT_STORECNT_DSCNT: {"simm16": (Fmt.FMT_NUM_B16, 16, OpType.OPR_WAIT_MEM_DS)}, + SOP1Op.S_WQM_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_WQM_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_XNOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_XNOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_XNOR_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_XNOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP2Op.S_XOR_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP2Op.S_XOR_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SDST), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC), "ssrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + SOP1Op.S_XOR_SAVEEXEC_B32: {"sdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SSRC)}, + SOP1Op.S_XOR_SAVEEXEC_B64: {"sdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SREG), "ssrc0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SSRC)}, + VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XY: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XYZ: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XYZW: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_LOAD_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_LOAD_FORMAT_XY: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_LOAD_FORMAT_XYZ: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_LOAD_FORMAT_XYZW: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_STORE_D16_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XY: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XYZ: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XYZW: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_STORE_FORMAT_X: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 32, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_STORE_FORMAT_XY: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_STORE_FORMAT_XYZ: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 96, OpType.OPR_VGPR)}, + VBUFFEROp.TBUFFER_STORE_FORMAT_XYZW: {"rsrc": (Fmt.FMT_RSRC_TYPED, 128, OpType.OPR_SREG), "soffset": (Fmt.FMT_ANY, 32, OpType.OPR_SREG_M0), "vaddr": (Fmt.FMT_ANY, 64, OpType.OPR_VGPR), "vdata": (Fmt.FMT_ANY, 128, OpType.OPR_VGPR)}, + VOP3Op.V_ADD3_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_CO_CI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_ADD_CO_CI_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_ADD_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_LSHL_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_NC_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_NC_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_NC_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ADD_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ADD_NC_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ALIGNBIT_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ALIGNBYTE_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_AND_B16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_AND_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_AND_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_AND_OR_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_ASHRREV_I32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_ASHRREV_I64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_BCNT_U32_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFE_I32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFE_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFI_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFM_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_BFREV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_BFREV_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CEIL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CEIL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CLS_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CLS_I32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CLZ_I32_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CLZ_I32_U32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F32: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMPX_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMPX_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_EXEC)}, + VOPCOp.V_CMPX_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_CLASS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F32: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_CLASS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_CLASS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_EQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_EQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_EQ_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_EQ_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_EQ_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_EQ_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_EQ_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_GT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_GT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LT_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LT_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LT_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_LT_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_LT_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NEQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NEQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NEQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NE_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NE_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_I64: {"src0": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NE_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NE_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NE_U64: {"src0": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NGE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NGE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NGT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NGT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NGT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NLE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NLE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NLG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NLG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLG_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NLT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_NLT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_NLT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_O_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_O_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_O_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_U_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPCOp.V_CMP_U_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CMP_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG)}, + VOPCOp.V_CMP_U_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CNDMASK_B16: {"src1": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_CNDMASK_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CNDMASK_B32: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_COS_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_COS_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_COS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_COS_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CTZ_I32_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CTZ_I32_B32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBEID_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBEMA_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBESC_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CUBETC_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_F32: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_I16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F16_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F16_U16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_BF8: {"src0": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_BF8: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_F16: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_FP8: {"src0": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_FP8: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_I32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_U32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE0: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE0: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE1: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE1: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE2: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE2: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F32_UBYTE3: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F32_UBYTE3: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_F64_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_F64_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_FLOOR_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_FLOOR_I32_F32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I16_F16: {"vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I32_F32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_I32_I16: {"src0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_I32_I16: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_NEAREST_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_NEAREST_I32_F32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_NORM_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_NORM_I16_F16: {"vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_NORM_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_NORM_U16_F16: {"vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_OFF_F32_I4: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_OFF_F32_I4: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_BF8_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_PK_F32_BF8: {"src0": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_F32_BF8: {"src0": (Fmt.FMT_NUM_PK2_BF8, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_PK_F32_FP8: {"src0": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_F32_FP8: {"src0": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F32, 64, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_FP8_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_FP8, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_I16_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_I16_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_NORM_I16_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_NORM_I16_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_NORM_U16_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_NORM_U16_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_CVT_PK_RTZ_F16_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_RTZ_F16_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_U16_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_U16_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_PK_U8_F32: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SR_BF8_F32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_BF8, 8, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_SR_FP8_F32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_FP8, 8, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U16_F16: {"vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U32_F32: {"vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_CVT_U32_U16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_CVT_U32_U16: {"vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FIXUP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FMAS_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DIV_FMAS_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3SDOp.V_DIV_SCALE_F32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_DIV_SCALE_F64: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_DOT2_BF16_BF16: {"src1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_BF16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_DOT2_F16_F16: {"src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT2_F32_BF16: {"src1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT2_F32_F16: {"src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_F32_BF8_BF8: {"src0": (Fmt.FMT_NUM_PK4_BF8, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK4_BF8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_F32_BF8_FP8: {"src0": (Fmt.FMT_NUM_PK4_BF8, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK4_FP8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_F32_FP8_BF8: {"src0": (Fmt.FMT_NUM_PK4_FP8, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK4_BF8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_F32_FP8_FP8: {"src0": (Fmt.FMT_NUM_PK4_FP8, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK4_FP8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_I32_IU8: {"src0": (Fmt.FMT_NUM_PK4_IU8, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK4_IU8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT4_U32_U8: {"src0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT8_I32_IU4: {"src0": (Fmt.FMT_NUM_PK8_IU4, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK8_IU4, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_DOT8_U32_U4: {"src0": (Fmt.FMT_NUM_PK8_U4, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK8_U4, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_ADD_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_ADD_NC_U32: {"srcy0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_AND_B32: {"srcy0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_CNDMASK_B32: {"srcy0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_DOT2ACC_F32_BF16: {"srcy0": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_PK2_BF16, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_DOT2ACC_F32_F16: {"srcy0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_FMAAK_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_FMAC_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_FMAMK_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_LSHLREV_B32: {"srcy0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MAX_NUM_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MIN_NUM_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MOV_B32: {"srcy0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MUL_DX9_ZERO_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_MUL_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_SUBREV_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOPDOp.V_DUAL_SUB_F32: {"srcy0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdsty": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrcy1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_EXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_EXP_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_EXP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_EXP_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FLOOR_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FLOOR_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_FMAAK_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_FMAAK_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_FMAC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FMAC_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_FMAC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMAC_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_FMAMK_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_FMAMK_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_DX9_ZERO_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FMA_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3POp.V_FMA_MIXHI_F16: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_FMA_MIXLO_F16: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_FMA_MIX_F32: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FRACT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FRACT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I16_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I16_F16: {"vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I32_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I32_F32: {"vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_EXP_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_EXP_I32_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_FREXP_MANT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_FREXP_MANT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P10_F16_F32: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P10_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P10_RTZ_F16_F32: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P2_F16_F32: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P2_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VINTERPOp.V_INTERP_P2_RTZ_F16_F32: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_LDEXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LDEXP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_LERP_U8: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_LOG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_LOG_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_LOG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LOG_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_LSHLREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_LSHLREV_B64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_LSHLREV_B64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_LSHL_ADD_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHL_OR_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_LSHRREV_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_LSHRREV_B64: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3SDOp.V_MAD_CO_I64_I32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I64, 64, OpType.OPR_VGPR)}, + VOP3SDOp.V_MAD_CO_U64_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I32_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_I32_I24: {"src1": (Fmt.FMT_NUM_I24, 24, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I24, 24, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U32_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAD_U32_U24: {"src1": (Fmt.FMT_NUM_U24, 24, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U24, 24, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_NUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_NUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX3_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXIMUM3_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAXIMUM3_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXIMUMMINIMUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAXIMUMMINIMUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXIMUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAXIMUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXIMUM_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAXMIN_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXMIN_NUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAXMIN_NUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAXMIN_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_NUM_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_NUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_NUM_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_NUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_NUM_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_NUM_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MAX_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MAX_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MBCNT_HI_U32_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MBCNT_LO_U32_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_NUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_NUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MED3_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_NUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_NUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN3_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINIMUM3_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MINIMUM3_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINIMUMMAXIMUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MINIMUMMAXIMUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINIMUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MINIMUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINIMUM_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MINMAX_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINMAX_NUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MINMAX_NUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MINMAX_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_NUM_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_NUM_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_NUM_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_NUM_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_NUM_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_NUM_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MIN_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MIN_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_MOVRELD_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOVRELD_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_MOVRELSD_2_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOVRELSD_2_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR)}, + VOP1Op.V_MOVRELSD_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOVRELSD_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR)}, + VOP1Op.V_MOVRELS_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOVRELS_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR)}, + VOP1Op.V_MOV_B16: {"src0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MOV_B16: {"vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_MOV_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MOV_B32: {"vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MQSAD_PK_U16_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MQSAD_U32_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B128, 128, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B128, 128, OpType.OPR_VGPR)}, + VOP3Op.V_MSAD_U8: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MULLIT_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_DX9_ZERO_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_DX9_ZERO_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_I32: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_HI_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_I32_I24: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_HI_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_HI_U32_U24: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_I32_I24: {"src0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_I32_I24: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_LO_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_LO_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_MUL_U32_U24: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_MUL_U32_U24: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_NOT_B16: {"src0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_NOT_B16: {"vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_NOT_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_NOT_B32: {"vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_OR3_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_OR_B16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_OR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_OR_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PACK_B32_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_PERMLANE16_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERMLANE16_VAR_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_PERMLANE64_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERMLANEX16_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERMLANEX16_VAR_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_PERM_B32: {"src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ADD_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_ASHRREV_I16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP2Op.V_PK_FMAC_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_FMA_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_LSHLREV_B16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_LSHRREV_B16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAD_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAD_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAXIMUM_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_NUM_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MAX_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MINIMUM_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_NUM_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MIN_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MUL_F16: {"src0": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_MUL_LO_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_SUB_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP3POp.V_PK_SUB_U16: {"src0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_QSAD_PK_U16_U8: {"src0": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_B64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_B64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RCP_IFLAG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RCP_IFLAG_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_READFIRSTLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + VOP3Op.V_READFIRSTLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + VOP3Op.V_READLANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_LANESEL), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SREG)}, + VOP1Op.V_RNDNE_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RNDNE_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RNDNE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RNDNE_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_RSQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_RSQ_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_HI_U8: {"src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U16: {"src1": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK2_U16, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SAD_U8: {"src1": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK4_U8, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SAT_PK_U8_I16: {"src0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_PK2_U8, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SAT_PK_U8_I16: {"vdst": (Fmt.FMT_NUM_PK2_U8, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_PK2_I16, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SIN_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SIN_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SIN_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SIN_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SQRT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SQRT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SQRT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_SQRT_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_CO_CI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUBREV_CO_CI_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUBREV_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUBREV_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUBREV_NC_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_CO_CI_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUB_CO_CI_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3SDOp.V_SUB_CO_U32: {"sdst": (Fmt.FMT_NUM_M64, 64, OpType.OPR_SREG), "src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_F16: {"src1": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_F32: {"src1": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_NC_I16: {"src1": (Fmt.FMT_NUM_I16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_NC_I32: {"src1": (Fmt.FMT_NUM_I32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_I32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_NC_U16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_SUB_NC_U32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_SUB_NC_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SWAPREL_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_SWAP_B16: {"src0": (Fmt.FMT_NUM_B16, 16, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_SWAP_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_BF16_16X16X32_BF16: {"src0": (Fmt.FMT_WMMA_AB_16X16_BF16, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_BF16, 256, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_BF16, 128, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_F16_16X16X32_F16: {"src0": (Fmt.FMT_WMMA_AB_16X16_F16, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_F16, 256, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_F16, 128, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_F32_16X16X32_BF16: {"src0": (Fmt.FMT_WMMA_AB_16X16_BF16, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_BF16, 256, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_F32_16X16X32_BF8_BF8: {"src0": (Fmt.FMT_WMMA_AB_16X16_BF8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_BF8, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_F32_16X16X32_BF8_FP8: {"src0": (Fmt.FMT_WMMA_AB_16X16_BF8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_FP8, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_F32_16X16X32_F16: {"src0": (Fmt.FMT_WMMA_AB_16X16_F16, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_F16, 256, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_F32_16X16X32_FP8_BF8: {"src0": (Fmt.FMT_WMMA_AB_16X16_FP8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_BF8, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_F32_16X16X32_FP8_FP8: {"src0": (Fmt.FMT_WMMA_AB_16X16_FP8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_FP8, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_I32_16X16X32_IU4: {"src0": (Fmt.FMT_WMMA_AB_16X16_IU4, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_IU4, 64, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_I32_16X16X32_IU8: {"src0": (Fmt.FMT_WMMA_AB_16X16_IU8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_IU8, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_SWMMAC_I32_16X16X64_IU4: {"src0": (Fmt.FMT_WMMA_AB_16X32_IU4, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X64_IU4, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_INDEX_SET, 32, OpType.OPR_SRC_VGPR), "vdst": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_VGPR)}, + VOP3Op.V_S_EXP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SREG_LITERAL), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_EXP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_LOG_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SREG_LITERAL), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_LOG_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_RCP_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SREG_LITERAL), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_RCP_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_RSQ_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SREG_LITERAL), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_RSQ_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_SQRT_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SREG_LITERAL), "vdst": (Fmt.FMT_NUM_PK2_F16, 32, OpType.OPR_SREG)}, + VOP3Op.V_S_SQRT_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SSRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SREG)}, + VOP3Op.V_TRIG_PREOP_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F16: {"src0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F16: {"vdst": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F16, 16, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F32: {"src0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F32: {"vdst": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_F32, 32, OpType.OPR_VGPR)}, + VOP1Op.V_TRUNC_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3Op.V_TRUNC_F64: {"src0": (Fmt.FMT_NUM_F64, 64, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_F64, 64, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_BF16_16X16X16_BF16: {"src0": (Fmt.FMT_WMMA_AB_16X16_BF16, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_BF16, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_BF16, 128, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_BF16, 128, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F16_16X16X16_F16: {"src0": (Fmt.FMT_WMMA_AB_16X16_F16, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_F16, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_F16, 128, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_F16, 128, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F32_16X16X16_BF16: {"src0": (Fmt.FMT_WMMA_AB_16X16_BF16, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_BF16, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F32_16X16X16_BF8_BF8: {"src0": (Fmt.FMT_WMMA_AB_16X16_BF8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_BF8, 64, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F32_16X16X16_BF8_FP8: {"src0": (Fmt.FMT_WMMA_AB_16X16_BF8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_FP8, 64, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F32_16X16X16_F16: {"src0": (Fmt.FMT_WMMA_AB_16X16_F16, 128, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_F16, 128, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F32_16X16X16_FP8_BF8: {"src0": (Fmt.FMT_WMMA_AB_16X16_FP8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_BF8, 64, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_F32_16X16X16_FP8_FP8: {"src0": (Fmt.FMT_WMMA_AB_16X16_FP8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_FP8, 64, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_F32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_I32_16X16X16_IU4: {"src0": (Fmt.FMT_WMMA_AB_16X16_IU4, 32, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_IU4, 32, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_I32_16X16X16_IU8: {"src0": (Fmt.FMT_WMMA_AB_16X16_IU8, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X16_IU8, 64, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_VGPR)}, + VOP3POp.V_WMMA_I32_16X16X32_IU4: {"src0": (Fmt.FMT_WMMA_AB_16X32_IU4, 64, OpType.OPR_SRC_VGPR), "src1": (Fmt.FMT_WMMA_AB_16X32_IU4, 64, OpType.OPR_SRC_VGPR), "src2": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_SRC_VGPR_OR_INLINE), "vdst": (Fmt.FMT_WMMA_DC_16X16_I32, 256, OpType.OPR_VGPR)}, + VOP3Op.V_WRITELANE_B32: {"src0": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC), "src1": (Fmt.FMT_NUM_B32, 32, OpType.OPR_SSRC_LANESEL), "vdst": (Fmt.FMT_NUM_B32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XAD_U32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP2Op.V_XNOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XNOR_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XOR3_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "src2": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XOR_B16: {"src1": (Fmt.FMT_NUM_U16, 16, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U16, 16, OpType.OPR_VGPR)}, + VOP2Op.V_XOR_B32: {"src0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, + VOP3Op.V_XOR_B32: {"src1": (Fmt.FMT_NUM_U32, 32, OpType.OPR_SRC), "vdst": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR), "vsrc0": (Fmt.FMT_NUM_U32, 32, OpType.OPR_VGPR)}, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/str_pcode.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/str_pcode.py new file mode 100644 index 000000000..7364c8a3d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd/rdna4/str_pcode.py @@ -0,0 +1,1447 @@ +# autogenerated from AMD ISA PDF - do not edit +# ruff: noqa: E501 +from tinygrad.runtime.autogen.amd.rdna4.enum import DSOp, SMEMOp, SOP1Op, SOP2Op, SOPCOp, SOPKOp, SOPPOp, VBUFFEROp, VFLATOp, VGLOBALOp, VIMAGEOp, VINTERPOp, VOP1Op, VOP2Op, VOP3Op, VOP3POp, VOP3SDOp, VOPCOp, VOPDOp, VSAMPLEOp, VSCRATCHOp + +PCODE = { + DSOp.DS_ADD_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_SUB_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_RSUB_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 = DATA.u32 - MEM[addr].u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_INC_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_DEC_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MIN_I32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MAX_I32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MIN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MAX_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_AND_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_OR_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_XOR_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_MSKOR_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = ((tmp & ~DATA.b32) | DATA2.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_STORE_B32: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0]', + DSOp.DS_STORE_2ADDR_B32: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET0.u32 * 4U].b32 = DATA[31 : 0];\naddr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET1.u32 * 4U].b32 = DATA2[31 : 0]', + DSOp.DS_STORE_2ADDR_STRIDE64_B32: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET0.u32 * 256U].b32 = DATA[31 : 0];\naddr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET1.u32 * 256U].b32 = DATA2[31 : 0]', + DSOp.DS_CMPSTORE_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nsrc = DATA.b32;\ncmp = DATA2.b32;\nMEM[addr].b32 = tmp == cmp ? src : tmp;\nRETURN_DATA.b32 = tmp', + DSOp.DS_MIN_NUM_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 < tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && sign(src.f32) &&\n!sign(tmp.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + DSOp.DS_MAX_NUM_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 > tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && !sign(src.f32) &&\nsign(tmp.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + DSOp.DS_ADD_F32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + DSOp.DS_STORE_B8: 'MEM[ADDR].b8 = DATA[7 : 0]', + DSOp.DS_STORE_B16: 'MEM[ADDR].b16 = DATA[15 : 0]', + DSOp.DS_ADD_RTN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_SUB_RTN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_RSUB_RTN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nMEM[addr].u32 = DATA.u32 - MEM[addr].u32;\nRETURN_DATA.u32 = tmp', + DSOp.DS_INC_RTN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_DEC_RTN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MIN_RTN_I32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MAX_RTN_I32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + DSOp.DS_MIN_RTN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_MAX_RTN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_AND_RTN_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_OR_RTN_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_XOR_RTN_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_MSKOR_RTN_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = ((tmp & ~DATA.b32) | DATA2.b32);\nRETURN_DATA.b32 = tmp', + DSOp.DS_STOREXCHG_RTN_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + DSOp.DS_STOREXCHG_2ADDR_RTN_B32: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 4U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 4U;\ntmp1 = MEM[addr1].b32;\ntmp2 = MEM[addr2].b32;\nMEM[addr1].b32 = DATA.b32;\nMEM[addr2].b32 = DATA2.b32;\n// Note DATA2 can be any other register\nRETURN_DATA[31 : 0] = tmp1;\nRETURN_DATA[63 : 32] = tmp2', + DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B32: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 256U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 256U;\ntmp1 = MEM[addr1].b32;\ntmp2 = MEM[addr2].b32;\nMEM[addr1].b32 = DATA.b32;\nMEM[addr2].b32 = DATA2.b32;\n// Note DATA2 can be any other register\nRETURN_DATA[31 : 0] = tmp1;\nRETURN_DATA[63 : 32] = tmp2', + DSOp.DS_CMPSTORE_RTN_B32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b32;\nsrc = DATA.b32;\ncmp = DATA2.b32;\nMEM[addr].b32 = tmp == cmp ? src : tmp;\nRETURN_DATA.b32 = tmp', + DSOp.DS_MIN_NUM_RTN_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 < tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && sign(src.f32) &&\n!sign(tmp.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + DSOp.DS_MAX_NUM_RTN_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 > tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && !sign(src.f32) &&\nsign(tmp.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + DSOp.DS_SWIZZLE_B32: 'offset = offset1:offset0;\nif (offset >= 0xe000) {\n// FFT decomposition\nmask = offset[4:0];\nfor (i = 0; i < 64; i++) {\nj = reverse_bits(i & 0x1f);\nj = (j >> count_ones(mask));\nj |= (i & mask);\nj |= i & 0x20;\nthread_out[i] = thread_valid[j] ? thread_in[j] : 0;\n}', + DSOp.DS_LOAD_B32: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32', + DSOp.DS_LOAD_2ADDR_B32: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 4U].b32;\naddr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET1.u32 * 4U].b32', + DSOp.DS_LOAD_2ADDR_STRIDE64_B32: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 256U].b32;\naddr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET1.u32 * 256U].b32', + DSOp.DS_LOAD_I8: "RETURN_DATA.i32 = 32'I(signext(MEM[ADDR].i8))", + DSOp.DS_LOAD_U8: "RETURN_DATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + DSOp.DS_LOAD_I16: "RETURN_DATA.i32 = 32'I(signext(MEM[ADDR].i16))", + DSOp.DS_LOAD_U16: "RETURN_DATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + DSOp.DS_CONSUME: 'addr = offset; // offset by LDS HWBASE\nrtnval = LDS(addr);\nLDS(addr) = LDS(addr) - countbits(valid mask);\nGPR[VDST] = rtnval; // return to all valid threads', + DSOp.DS_APPEND: 'addr = offset; // offset by LDS HWBASE\nrtnval = LDS(addr);\nLDS(addr) = LDS(addr) + countbits(valid mask);\nGPR[VDST] = rtnval; // return to all valid threads', + DSOp.DS_ADD_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_SUB_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_RSUB_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 = DATA.u64 - MEM[addr].u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_INC_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_DEC_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MIN_I64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MAX_I64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MIN_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MAX_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_AND_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_OR_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_XOR_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_MSKOR_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = ((tmp & ~DATA.b64) | DATA2.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_STORE_B64: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32]', + DSOp.DS_STORE_2ADDR_B64: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET0.u32 * 8U].b32 = DATA[31 : 0];\nMEM[addr + OFFSET0.u32 * 8U + 4U].b32 = DATA[63 : 32];\naddr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET1.u32 * 8U].b32 = DATA2[31 : 0];\nMEM[addr + OFFSET1.u32 * 8U + 4U].b32 = DATA2[63 : 32]', + DSOp.DS_STORE_2ADDR_STRIDE64_B64: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET0.u32 * 512U].b32 = DATA[31 : 0];\nMEM[addr + OFFSET0.u32 * 512U + 4U].b32 = DATA[63 : 32];\naddr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET1.u32 * 512U].b32 = DATA2[31 : 0];\nMEM[addr + OFFSET1.u32 * 512U + 4U].b32 = DATA2[63 : 32]', + DSOp.DS_CMPSTORE_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nsrc = DATA.b64;\ncmp = DATA2.b64;\nMEM[addr].b64 = tmp == cmp ? src : tmp;\nRETURN_DATA.b64 = tmp', + DSOp.DS_MIN_NUM_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\nif (isNAN(src.f64) && isNAN(tmp.f64)) then\nMEM[ADDR].f64 = cvtToQuietNAN(src.f64)\nelsif isNAN(src.f64) then\nMEM[ADDR].f64 = tmp.f64\nelsif isNAN(tmp.f64) then\nMEM[ADDR].f64 = src.f64\nelsif ((src.f64 < tmp.f64) || ((abs(src.f64) == 0.0) && (abs(tmp.f64) == 0.0) && sign(src.f64) &&\n!sign(tmp.f64))) then\n// NOTE: -0<+0 is TRUE in this comparison\nMEM[ADDR].f64 = src.f64\nelse\nMEM[ADDR].f64 = tmp.f64\nendif;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MAX_NUM_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\nif (isNAN(src.f64) && isNAN(tmp.f64)) then\nMEM[ADDR].f64 = cvtToQuietNAN(src.f64)\nelsif isNAN(src.f64) then\nMEM[ADDR].f64 = tmp.f64\nelsif isNAN(tmp.f64) then\nMEM[ADDR].f64 = src.f64\nelsif ((src.f64 > tmp.f64) || ((abs(src.f64) == 0.0) && (abs(tmp.f64) == 0.0) && !sign(src.f64) &&\nsign(tmp.f64))) then\n// NOTE: +0>-0 is TRUE in this comparison\nMEM[ADDR].f64 = src.f64\nelse\nMEM[ADDR].f64 = tmp.f64\nendif;\nRETURN_DATA.f64 = tmp', + DSOp.DS_ADD_RTN_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_SUB_RTN_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_RSUB_RTN_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nMEM[addr].u64 = DATA.u64 - MEM[addr].u64;\nRETURN_DATA.u64 = tmp', + DSOp.DS_INC_RTN_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_DEC_RTN_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MIN_RTN_I64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MAX_RTN_I64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + DSOp.DS_MIN_RTN_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_MAX_RTN_U64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + DSOp.DS_AND_RTN_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_OR_RTN_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_XOR_RTN_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_MSKOR_RTN_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = ((tmp & ~DATA.b64) | DATA2.b64);\nRETURN_DATA.b64 = tmp', + DSOp.DS_STOREXCHG_RTN_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + DSOp.DS_STOREXCHG_2ADDR_RTN_B64: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 8U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 8U;\ntmp1 = MEM[addr1].b64;\ntmp2 = MEM[addr2].b64;\nMEM[addr1].b64 = DATA.b64;\nMEM[addr2].b64 = DATA2.b64;\n// Note DATA2 can be any other register\nRETURN_DATA[63 : 0] = tmp1;\nRETURN_DATA[127 : 64] = tmp2', + DSOp.DS_STOREXCHG_2ADDR_STRIDE64_RTN_B64: 'addr1 = ADDR_BASE.u32 + OFFSET0.u32 * 512U;\naddr2 = ADDR_BASE.u32 + OFFSET1.u32 * 512U;\ntmp1 = MEM[addr1].b64;\ntmp2 = MEM[addr2].b64;\nMEM[addr1].b64 = DATA.b64;\nMEM[addr2].b64 = DATA2.b64;\n// Note DATA2 can be any other register\nRETURN_DATA[63 : 0] = tmp1;\nRETURN_DATA[127 : 64] = tmp2', + DSOp.DS_CMPSTORE_RTN_B64: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].b64;\nsrc = DATA.b64;\ncmp = DATA2.b64;\nMEM[addr].b64 = tmp == cmp ? src : tmp;\nRETURN_DATA.b64 = tmp', + DSOp.DS_MIN_NUM_RTN_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\nif (isNAN(src.f64) && isNAN(tmp.f64)) then\nMEM[ADDR].f64 = cvtToQuietNAN(src.f64)\nelsif isNAN(src.f64) then\nMEM[ADDR].f64 = tmp.f64\nelsif isNAN(tmp.f64) then\nMEM[ADDR].f64 = src.f64\nelsif ((src.f64 < tmp.f64) || ((abs(src.f64) == 0.0) && (abs(tmp.f64) == 0.0) && sign(src.f64) &&\n!sign(tmp.f64))) then\n// NOTE: -0<+0 is TRUE in this comparison\nMEM[ADDR].f64 = src.f64\nelse\nMEM[ADDR].f64 = tmp.f64\nendif;\nRETURN_DATA.f64 = tmp', + DSOp.DS_MAX_NUM_RTN_F64: 'tmp = MEM[ADDR].f64;\nsrc = DATA.f64;\nif (isNAN(src.f64) && isNAN(tmp.f64)) then\nMEM[ADDR].f64 = cvtToQuietNAN(src.f64)\nelsif isNAN(src.f64) then\nMEM[ADDR].f64 = tmp.f64\nelsif isNAN(tmp.f64) then\nMEM[ADDR].f64 = src.f64\nelsif ((src.f64 > tmp.f64) || ((abs(src.f64) == 0.0) && (abs(tmp.f64) == 0.0) && !sign(src.f64) &&\nsign(tmp.f64))) then\n// NOTE: +0>-0 is TRUE in this comparison\nMEM[ADDR].f64 = src.f64\nelse\nMEM[ADDR].f64 = tmp.f64\nendif;\nRETURN_DATA.f64 = tmp', + DSOp.DS_LOAD_B64: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32', + DSOp.DS_LOAD_2ADDR_B64: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 8U].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET0.u32 * 8U + 4U].b32;\naddr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET1.u32 * 8U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET1.u32 * 8U + 4U].b32', + DSOp.DS_LOAD_2ADDR_STRIDE64_B64: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET0.u32 * 512U].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET0.u32 * 512U + 4U].b32;\naddr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET1.u32 * 512U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET1.u32 * 512U + 4U].b32', + DSOp.DS_ADD_RTN_F32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + DSOp.DS_CONDXCHG32_RTN_B64: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\ndeclare RETURN_DATA : 32'U[2];\nADDR = S0.u32;\nDATA = S1.u64;\noffset = { OFFSET1, OFFSET0 };\nADDR0 = ((ADDR + offset.u32) & 0xfff8U);\nADDR1 = ADDR0 + 4U;\nRETURN_DATA[0] = LDS[ADDR0].u32;\nif DATA[31] then\nLDS[ADDR0] = { 1'0, DATA[30 : 0] }\nendif;\nRETURN_DATA[1] = LDS[ADDR1].u32;\nif DATA[63] then\nLDS[ADDR1] = { 1'0, DATA[62 : 32] }\nendif", + DSOp.DS_COND_SUB_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? tmp - src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_SUB_CLAMP_U32: "declare new_value : 32'U;\nold_value = MEM[ADDR].u32;\nif old_value < DATA.u32 then\nnew_value = 0U\nelse\nnew_value = old_value - DATA.u32\nendif;\nMEM[ADDR].u32 = new_value;\nRETURN_DATA.u32 = old_value", + DSOp.DS_PK_ADD_F16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].f16 = src[15 : 0].f16 + tmp[15 : 0].f16;\ndst[31 : 16].f16 = src[31 : 16].f16 + tmp[31 : 16].f16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + DSOp.DS_PK_ADD_BF16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].bf16 = src[15 : 0].bf16 + tmp[15 : 0].bf16;\ndst[31 : 16].bf16 = src[31 : 16].bf16 + tmp[31 : 16].bf16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + DSOp.DS_STORE_B8_D16_HI: 'MEM[ADDR].b8 = DATA[23 : 16]', + DSOp.DS_STORE_B16_D16_HI: 'MEM[ADDR].b16 = DATA[31 : 16]', + DSOp.DS_LOAD_U8_D16: "RETURN_DATA[15 : 0].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// RETURN_DATA[31:16] is preserved.", + DSOp.DS_LOAD_U8_D16_HI: "RETURN_DATA[31 : 16].u16 = 16'U({ 8'0U, MEM[ADDR].u8 });\n// RETURN_DATA[15:0] is preserved.", + DSOp.DS_LOAD_I8_D16: "RETURN_DATA[15 : 0].i16 = 16'I(signext(MEM[ADDR].i8));\n// RETURN_DATA[31:16] is preserved.", + DSOp.DS_LOAD_I8_D16_HI: "RETURN_DATA[31 : 16].i16 = 16'I(signext(MEM[ADDR].i8));\n// RETURN_DATA[15:0] is preserved.", + DSOp.DS_LOAD_U16_D16: 'RETURN_DATA[15 : 0].u16 = MEM[ADDR].u16;\n// RETURN_DATA[31:16] is preserved.', + DSOp.DS_LOAD_U16_D16_HI: 'RETURN_DATA[31 : 16].u16 = MEM[ADDR].u16;\n// RETURN_DATA[15:0] is preserved.', + DSOp.DS_COND_SUB_RTN_U32: 'addr = CalcDsAddr(vgpr_a.b32, offset.b32);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? tmp - src : tmp;\nRETURN_DATA.u32 = tmp', + DSOp.DS_SUB_CLAMP_RTN_U32: "declare new_value : 32'U;\nold_value = MEM[ADDR].u32;\nif old_value < DATA.u32 then\nnew_value = 0U\nelse\nnew_value = old_value - DATA.u32\nendif;\nMEM[ADDR].u32 = new_value;\nRETURN_DATA.u32 = old_value", + DSOp.DS_PK_ADD_RTN_F16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].f16 = src[15 : 0].f16 + tmp[15 : 0].f16;\ndst[31 : 16].f16 = src[31 : 16].f16 + tmp[31 : 16].f16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + DSOp.DS_PK_ADD_RTN_BF16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].bf16 = src[15 : 0].bf16 + tmp[15 : 0].bf16;\ndst[31 : 16].bf16 = src[31 : 16].bf16 + tmp[31 : 16].bf16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + DSOp.DS_STORE_ADDTID_B32: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\nMEM[32'I({ OFFSET1, OFFSET0 } + M0[15 : 0]) + laneID.i32 * 4].u32 = DATA0.u32", + DSOp.DS_LOAD_ADDTID_B32: "declare OFFSET0 : 8'U;\ndeclare OFFSET1 : 8'U;\nRETURN_DATA.u32 = MEM[32'I({ OFFSET1, OFFSET0 } + M0[15 : 0]) + laneID.i32 * 4].u32", + DSOp.DS_PERMUTE_B32: "// VGPR[laneId][index] is the VGPR RAM\n// VDST, ADDR and DATA0 are from the microcode DS encoding\ndeclare tmp : 32'B[64];\ndeclare OFFSET : 16'U;\ndeclare DATA0 : 32'U;\ndeclare VDST : 32'U;\nnum_lanes = WAVE64 ? 64 : 32;\nfor i in 0 : num_lanes - 1 do\ntmp[i] = 0x0\nendfor;\nfor i in 0 : num_lanes - 1 do\n// If a source thread is disabled, it does not propagate data.\nif EXEC[i].u1 then\n// ADDR needs to be divided by 4.\n// High-order bits are ignored.\ndst_lane = 32'I(VGPR[i][ADDR] + OFFSET.b32) / 4 % num_lanes;\ntmp[dst_lane] = VGPR[i][DATA0]\nendif\nendfor;\n// Copy data into destination VGPRs. If multiple sources\n// select the same destination thread, the highest-numbered\n// source thread wins.\nfor i in 0 : num_lanes - 1 do\nif EXEC[i].u1 then\nVGPR[i][VDST] = tmp[i]\nendif\nendfor", + DSOp.DS_BPERMUTE_B32: "// VGPR[laneId][index] is the VGPR RAM\n// VDST, ADDR and DATA0 are from the microcode DS encoding\ndeclare tmp : 32'B[64];\ndeclare OFFSET : 16'U;\ndeclare DATA0 : 32'U;\ndeclare VDST : 32'U;\nnum_lanes = WAVE64 ? 64 : 32;\nfor i in 0 : num_lanes - 1 do\ntmp[i] = 0x0\nendfor;\nfor i in 0 : num_lanes - 1 do\n// ADDR needs to be divided by 4.\n// High-order bits are ignored.\nsrc_lane = 32'I(VGPR[i][ADDR] + OFFSET.b32) / 4 % num_lanes;\n// EXEC is applied to the source VGPR reads.\nif EXEC[src_lane].u1 then\ntmp[i] = VGPR[src_lane][DATA0]\nendif\nendfor;\n// Copy data into destination VGPRs. Some source\n// data may be broadcast to multiple lanes.\nfor i in 0 : num_lanes - 1 do\nif EXEC[i].u1 then\nVGPR[i][VDST] = tmp[i]\nendif\nendfor", + DSOp.DS_BPERMUTE_FI_B32: "// VGPR[laneId][index] is the VGPR RAM\n// VDST, ADDR and DATA0 are from the microcode DS encoding\ndeclare tmp : 32'B[64];\ndeclare OFFSET : 16'U;\ndeclare DATA0 : 32'U;\ndeclare VDST : 32'U;\nnum_lanes = WAVE64 ? 64 : 32;\nfor i in 0 : num_lanes - 1 do\ntmp[i] = 0x0\nendfor;\nfor i in 0 : num_lanes - 1 do\n// ADDR needs to be divided by 4.\n// High-order bits are ignored.\nsrc_lane = 32'I(VGPR[i][ADDR] + OFFSET.b32) / 4 % num_lanes;\n// Source VGPR is read even if src_lane is invalid in EXEC mask.\ntmp[i] = VGPR[src_lane][DATA0]\nendfor;\n// Copy data into destination VGPRs. Some source\n// data may be broadcast to multiple lanes.\nfor i in 0 : num_lanes - 1 do\nif EXEC[i].u1 then\nVGPR[i][VDST] = tmp[i]\nendif\nendfor", + DSOp.DS_STORE_B96: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32];\nMEM[addr + OFFSET.u32 + 8U].b32 = DATA[95 : 64]', + DSOp.DS_STORE_B128: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nMEM[addr + OFFSET.u32].b32 = DATA[31 : 0];\nMEM[addr + OFFSET.u32 + 4U].b32 = DATA[63 : 32];\nMEM[addr + OFFSET.u32 + 8U].b32 = DATA[95 : 64];\nMEM[addr + OFFSET.u32 + 12U].b32 = DATA[127 : 96]', + DSOp.DS_BVH_STACK_PUSH4_POP1_RTN_B32: "declare stack_base : 32'B;\ndeclare stack_index : 32'U;\ndeclare DATA1 : 32'B;\ndeclare last_node_ptr : 32'B;\ndeclare INVALID_NODE : 32'B;\nDATA_VALID = lambda(data) (\nif data == INVALID_NODE then\nreturn 1'0U\nelsif ((last_node_ptr != INVALID_NODE) && (data == last_node_ptr)) then\n// Match last_node_ptr\nreturn 1'0U\nelse\nreturn 1'1U\nendif);\n// main code\n{ stack_base, stack_index } = 64'B(DECODE_ADDR(ADDR, OFFSET0));\nlast_node_ptr = DATA0.b32;\n// First 3 passes: push data onto stack\nfor i in 0 : 2 do\nif DATA_VALID(DATA1[i * 32 + 31 : i * 32]) then\nMEM[stack_base.u32 + stack_index] = DATA1[i * 32 + 31 : i * 32];\nstack_index += 1U\nelsif DATA1[i].b32 == last_node_ptr then\n// Treat all further data as invalid as well.\nbreak\nendif\nendfor;\n// Last pass: return data or pop\nif DATA_VALID(DATA1[127 : 96]) then\nRETURN_DATA[31 : 0] = DATA1[127 : 96]\nelse\nRETURN_DATA[31 : 0] = MEM[stack_base.u32 + stack_index];\nMEM[stack_base.u32 + stack_index] = INVALID_NODE;\nstack_index -= 1U\nendif;\nRETURN_ADDR[31 : 0] = 32'B(ENCODE_ADDR(stack_base, stack_index))", + DSOp.DS_BVH_STACK_PUSH8_POP1_RTN_B32: "declare stack_base : 32'B;\ndeclare stack_index : 32'U;\ndeclare DATA1 : 32'B;\ndeclare last_node_ptr : 32'B;\ndeclare INVALID_NODE : 32'B;\nDATA_VALID = lambda(data) (\nif data == INVALID_NODE then\nreturn 1'0U\nelsif ((last_node_ptr != INVALID_NODE) && (data == last_node_ptr)) then\n// Match last_node_ptr\nreturn 1'0U\nelse\nreturn 1'1U\nendif);\n// main code\n{ stack_base, stack_index } = 64'B(DECODE_ADDR(ADDR, OFFSET0));\nlast_node_ptr = DATA0.b32;\n// First 7 passes: push data onto stack\nfor i in 0 : 6 do\nif DATA_VALID(DATA1[i * 32 + 31 : i * 32]) then\nMEM[stack_base.u32 + stack_index] = DATA1[i * 32 + 31 : i * 32];\nstack_index += 1U\nelsif DATA1[i].b32 == last_node_ptr then\n// Treat all further data as invalid as well.\nbreak\nendif\nendfor;\n// Last pass: return data or pop\nif DATA_VALID(DATA1[255 : 224]) then\nRETURN_DATA[31 : 0] = DATA1[255 : 224]\nelse\nRETURN_DATA[31 : 0] = MEM[stack_base.u32 + stack_index];\nMEM[stack_base.u32 + stack_index] = INVALID_NODE;\nstack_index -= 1U\nendif;\nRETURN_ADDR[31 : 0] = 32'B(ENCODE_ADDR(stack_base, stack_index))", + DSOp.DS_BVH_STACK_PUSH8_POP2_RTN_B64: "declare stack_base : 32'B;\ndeclare stack_index : 32'U;\ndeclare DATA1 : 32'B;\ndeclare last_node_ptr : 32'B;\ndeclare INVALID_NODE : 32'B;\nDATA_VALID = lambda(data) (\nif data == INVALID_NODE then\nreturn 1'0U\nelsif ((last_node_ptr != INVALID_NODE) && (data == last_node_ptr)) then\n// Match last_node_ptr\nreturn 1'0U\nelse\nreturn 1'1U\nendif);\n// main code\n{ stack_base, stack_index } = 64'B(DECODE_ADDR(ADDR, OFFSET0));\nlast_node_ptr = DATA0.b32;\n// First 7 passes: push data onto stack\nfor i in 0 : 6 do\nif DATA_VALID(DATA1[i * 32 + 31 : i * 32]) then\nMEM[stack_base.u32 + stack_index] = DATA1[i * 32 + 31 : i * 32];\nstack_index += 1U\nelsif DATA1[i].b32 == last_node_ptr then\n// Treat all further data as invalid as well.\nbreak\nendif\nendfor;\n// Last pass: return data or pop\nif DATA_VALID(DATA1[255 : 224]) then\nRETURN_DATA[31 : 0] = DATA1[255 : 224]\nelse\nRETURN_DATA[31 : 0] = MEM[stack_base.u32 + stack_index];\nMEM[stack_base.u32 + stack_index] = INVALID_NODE;\nstack_index -= 1U\nendif;\n// Attempt a second pop\nif DATA_VALID(MEM[stack_base.u32 + stack_index]) then\nRETURN_DATA[63 : 32] = MEM[stack_base.u32 + stack_index];\nMEM[stack_base.u32 + stack_index] = INVALID_NODE;\nstack_index -= 1U\nendif;\nRETURN_ADDR[31 : 0] = 32'B(ENCODE_ADDR(stack_base, stack_index))", + DSOp.DS_LOAD_B96: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET.u32 + 8U].b32', + DSOp.DS_LOAD_B128: 'addr = CalcDsAddr(vgpr_a.b32, 0x0);\nRETURN_DATA[31 : 0] = MEM[addr + OFFSET.u32].b32;\nRETURN_DATA[63 : 32] = MEM[addr + OFFSET.u32 + 4U].b32;\nRETURN_DATA[95 : 64] = MEM[addr + OFFSET.u32 + 8U].b32;\nRETURN_DATA[127 : 96] = MEM[addr + OFFSET.u32 + 12U].b32', + SMEMOp.S_LOAD_B32: 'addr = CalcGlobalAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32', + SMEMOp.S_LOAD_B64: 'addr = CalcGlobalAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32', + SMEMOp.S_LOAD_B128: 'addr = CalcGlobalAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32', + SMEMOp.S_LOAD_B256: 'addr = CalcGlobalAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32;\nSDATA[159 : 128] = MEM[addr + 16U].b32;\nSDATA[191 : 160] = MEM[addr + 20U].b32;\nSDATA[223 : 192] = MEM[addr + 24U].b32;\nSDATA[255 : 224] = MEM[addr + 28U].b32', + SMEMOp.S_LOAD_B512: 'addr = CalcGlobalAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32;\nSDATA[159 : 128] = MEM[addr + 16U].b32;\nSDATA[191 : 160] = MEM[addr + 20U].b32;\nSDATA[223 : 192] = MEM[addr + 24U].b32;\nSDATA[255 : 224] = MEM[addr + 28U].b32;\nSDATA[287 : 256] = MEM[addr + 32U].b32;\nSDATA[319 : 288] = MEM[addr + 36U].b32;\nSDATA[351 : 320] = MEM[addr + 40U].b32;\nSDATA[383 : 352] = MEM[addr + 44U].b32;\nSDATA[415 : 384] = MEM[addr + 48U].b32;\nSDATA[447 : 416] = MEM[addr + 52U].b32;\nSDATA[479 : 448] = MEM[addr + 56U].b32;\nSDATA[511 : 480] = MEM[addr + 60U].b32', + SMEMOp.S_LOAD_B96: 'addr = CalcGlobalAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32', + SMEMOp.S_LOAD_I8: "SDATA.i32 = 32'I(signext(MEM[ADDR].i8))", + SMEMOp.S_LOAD_U8: "SDATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + SMEMOp.S_LOAD_I16: "SDATA.i32 = 32'I(signext(MEM[ADDR].i16))", + SMEMOp.S_LOAD_U16: "SDATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + SMEMOp.S_BUFFER_LOAD_B32: 'addr = CalcBufferAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32', + SMEMOp.S_BUFFER_LOAD_B64: 'addr = CalcBufferAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32', + SMEMOp.S_BUFFER_LOAD_B128: 'addr = CalcBufferAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32', + SMEMOp.S_BUFFER_LOAD_B256: 'addr = CalcBufferAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32;\nSDATA[159 : 128] = MEM[addr + 16U].b32;\nSDATA[191 : 160] = MEM[addr + 20U].b32;\nSDATA[223 : 192] = MEM[addr + 24U].b32;\nSDATA[255 : 224] = MEM[addr + 28U].b32', + SMEMOp.S_BUFFER_LOAD_B512: 'addr = CalcBufferAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32;\nSDATA[127 : 96] = MEM[addr + 12U].b32;\nSDATA[159 : 128] = MEM[addr + 16U].b32;\nSDATA[191 : 160] = MEM[addr + 20U].b32;\nSDATA[223 : 192] = MEM[addr + 24U].b32;\nSDATA[255 : 224] = MEM[addr + 28U].b32;\nSDATA[287 : 256] = MEM[addr + 32U].b32;\nSDATA[319 : 288] = MEM[addr + 36U].b32;\nSDATA[351 : 320] = MEM[addr + 40U].b32;\nSDATA[383 : 352] = MEM[addr + 44U].b32;\nSDATA[415 : 384] = MEM[addr + 48U].b32;\nSDATA[447 : 416] = MEM[addr + 52U].b32;\nSDATA[479 : 448] = MEM[addr + 56U].b32;\nSDATA[511 : 480] = MEM[addr + 60U].b32', + SMEMOp.S_BUFFER_LOAD_B96: 'addr = CalcBufferAddr(sgpr_base.b64, offset.b64);\nSDATA[31 : 0] = MEM[addr].b32;\nSDATA[63 : 32] = MEM[addr + 4U].b32;\nSDATA[95 : 64] = MEM[addr + 8U].b32', + SMEMOp.S_BUFFER_LOAD_I8: "SDATA.i32 = 32'I(signext(MEM[ADDR].i8))", + SMEMOp.S_BUFFER_LOAD_U8: "SDATA.u32 = 32'U({ 24'0U, MEM[ADDR].u8 })", + SMEMOp.S_BUFFER_LOAD_I16: "SDATA.i32 = 32'I(signext(MEM[ADDR].i16))", + SMEMOp.S_BUFFER_LOAD_U16: "SDATA.u32 = 32'U({ 16'0U, MEM[ADDR].u16 })", + SMEMOp.S_PREFETCH_INST: "if MODE.SCALAR_PREFETCH_EN.u1 then\nmem_addr = (64'U(S0[63 : 0].i64 + 64'I(IOFFSET.i24)) & 0xffffffffffffff80ULL);\n// Force 128B alignment\nlength = S2.u32;\n// SGPR or M0\nlength += SDATA.u32;\n// SDATA is an immediate\nlength = (length & 31U);\n// Length restricted to 0..31\nlength = (length + 1U) * 128U;\n// Prefetch 1-32 cachelines, units of 128B\nPrefetchScalarInst(mem_addr, length)\nendif", + SMEMOp.S_PREFETCH_INST_PC_REL: "if MODE.SCALAR_PREFETCH_EN.u1 then\nmem_addr = (64'U(PC[63 : 0].i64 + 8LL + 64'I(IOFFSET.i24)) & 0xffffffffffffff80ULL);\n// Force 128B alignment\nlength = S1.u32;\n// SGPR or M0\nlength += SDATA.u32;\n// SDATA is an immediate\nlength = (length & 31U);\n// Length restricted to 0..31\nlength = (length + 1U) * 128U;\n// Prefetch 1-32 cachelines, units of 128B\nPrefetchScalarInst(mem_addr, length)\nendif", + SMEMOp.S_PREFETCH_DATA: "if MODE.SCALAR_PREFETCH_EN.u1 then\nmem_addr = (64'U(S0[63 : 0].i64 + 64'I(IOFFSET.i24)) & 0xffffffffffffff80ULL);\n// Force 128B alignment\nlength = S2.u32;\n// SGPR or M0\nlength += SDATA.u32;\n// SDATA is an immediate\nlength = (length & 31U);\n// Length restricted to 0..31\nlength = (length + 1U) * 128U;\n// Prefetch 1-32 cachelines, units of 128B\nPrefetchScalarData(mem_addr, length)\nendif", + SMEMOp.S_BUFFER_PREFETCH_DATA: "if MODE.SCALAR_PREFETCH_EN.u1 then\nmem_addr = (64'U(S0[47 : 0].i64 + 64'I(IOFFSET.i24)) & 0xffffffffffffff80ULL);\n// Force 128B alignment\nlength = S2.u32;\n// SGPR or M0\nlength += SDATA.u32;\n// SDATA is an immediate\nlength = (length & 31U);\n// Length restricted to 0..31\nlength = (length + 1U) * 128U;\n// Prefetch 1-32 cachelines, units of 128B\nPrefetchScalarData(mem_addr, length)\nendif", + SMEMOp.S_PREFETCH_DATA_PC_REL: "if MODE.SCALAR_PREFETCH_EN.u1 then\nmem_addr = (64'U(PC[63 : 0].i64 + 8LL + 64'I(IOFFSET.i24)) & 0xffffffffffffff80ULL);\n// Force 128B alignment\nlength = S1.u32;\n// SGPR or M0\nlength += SDATA.u32;\n// SDATA is an immediate\nlength = (length & 31U);\n// Length restricted to 0..31\nlength = (length + 1U) * 128U;\n// Prefetch 1-32 cachelines, units of 128B\nPrefetchScalarData(mem_addr, length)\nendif", + SOP1Op.S_MOV_B32: 'D0.b32 = S0.b32', + SOP1Op.S_MOV_B64: 'D0.b64 = S0.b64', + SOP1Op.S_CMOV_B32: 'if SCC then\nD0.b32 = S0.b32\nendif', + SOP1Op.S_CMOV_B64: 'if SCC then\nD0.b64 = S0.b64\nendif', + SOP1Op.S_BREV_B32: 'D0.u32[31 : 0] = S0.u32[0 : 31]', + SOP1Op.S_BREV_B64: 'D0.u64[63 : 0] = S0.u64[0 : 63]', + SOP1Op.S_CTZ_I32_B32: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_CTZ_I32_B64: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 63 do\n// Search from LSB\nif S0.u64[i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_CLZ_I32_U32: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_CLZ_I32_U64: "tmp = -1;\n// Set if no ones are found\nfor i in 0 : 63 do\n// Search from MSB\nif S0.u64[63 - i] == 1'1U then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp", + SOP1Op.S_CLS_I32: 'tmp = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.u32[31 - i] != S0.u32[31] then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp', + SOP1Op.S_CLS_I32_I64: 'tmp = -1;\n// Set if all bits are the same\nfor i in 1 : 63 do\n// Search from MSB\nif S0.u64[63 - i] != S0.u64[63] then\ntmp = i;\nbreak\nendif\nendfor;\nD0.i32 = tmp', + SOP1Op.S_SEXT_I32_I8: "D0.i32 = 32'I(signext(S0.i8))", + SOP1Op.S_SEXT_I32_I16: "D0.i32 = 32'I(signext(S0.i16))", + SOP1Op.S_BITSET0_B32: "D0.u32[S0.u32[4 : 0]] = 1'0U", + SOP1Op.S_BITSET0_B64: "D0.u64[S0.u32[5 : 0]] = 1'0U", + SOP1Op.S_BITSET1_B32: "D0.u32[S0.u32[4 : 0]] = 1'1U", + SOP1Op.S_BITSET1_B64: "D0.u64[S0.u32[5 : 0]] = 1'1U", + SOP1Op.S_BITREPLICATE_B64_B32: 'tmp = S0.u32;\nfor i in 0 : 31 do\nD0.u64[i * 2] = tmp[i];\nD0.u64[i * 2 + 1] = tmp[i]\nendfor', + SOP1Op.S_ABS_I32: 'D0.i32 = S0.i32 < 0 ? -S0.i32 : S0.i32;\nSCC = D0.i32 != 0', + SOP1Op.S_BCNT0_I32_B32: "tmp = 0;\nfor i in 0 : 31 do\ntmp += S0.u32[i] == 1'0U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_BCNT0_I32_B64: "tmp = 0;\nfor i in 0 : 63 do\ntmp += S0.u64[i] == 1'0U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_BCNT1_I32_B32: "tmp = 0;\nfor i in 0 : 31 do\ntmp += S0.u32[i] == 1'1U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_BCNT1_I32_B64: "tmp = 0;\nfor i in 0 : 63 do\ntmp += S0.u64[i] == 1'1U ? 1 : 0\nendfor;\nD0.i32 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_QUADMASK_B32: 'tmp = 0U;\nfor i in 0 : 7 do\ntmp[i] = S0.u32[i * 4 +: 4] != 0U\nendfor;\nD0.u32 = tmp;\nSCC = D0.u32 != 0U', + SOP1Op.S_QUADMASK_B64: 'tmp = 0ULL;\nfor i in 0 : 15 do\ntmp[i] = S0.u64[i * 4 +: 4] != 0ULL\nendfor;\nD0.u64 = tmp;\nSCC = D0.u64 != 0ULL', + SOP1Op.S_WQM_B32: "tmp = 0U;\ndeclare i : 6'U;\nfor i in 6'0U : 6'31U do\ntmp[i] = S0.u32[i & 6'60U +: 6'4U] != 0U\nendfor;\nD0.u32 = tmp;\nSCC = D0.u32 != 0U", + SOP1Op.S_WQM_B64: "tmp = 0ULL;\ndeclare i : 6'U;\nfor i in 6'0U : 6'63U do\ntmp[i] = S0.u64[i & 6'60U +: 6'4U] != 0ULL\nendfor;\nD0.u64 = tmp;\nSCC = D0.u64 != 0ULL", + SOP1Op.S_NOT_B32: 'D0.u32 = ~S0.u32;\nSCC = D0.u32 != 0U', + SOP1Op.S_NOT_B64: 'D0.u64 = ~S0.u64;\nSCC = D0.u64 != 0ULL', + SOP1Op.S_AND_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 & EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_OR_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 | EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_OR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_XOR_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 ^ EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_XOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 ^ EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_NAND_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = ~(S0.u32 & EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_NAND_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_NOR_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = ~(S0.u32 | EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_NOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_XNOR_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = ~(S0.u32 ^ EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_XNOR_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = ~(S0.u64 ^ EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_AND_NOT0_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (~S0.u32 & EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_NOT0_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (~S0.u64 & EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_OR_NOT0_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (~S0.u32 | EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_OR_NOT0_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (~S0.u64 | EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_AND_NOT1_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 & ~EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_NOT1_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 & ~EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_OR_NOT1_SAVEEXEC_B32: 'saveexec = EXEC.u32;\nEXEC.u32 = (S0.u32 | ~EXEC.u32);\nD0.u32 = saveexec.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_OR_NOT1_SAVEEXEC_B64: 'saveexec = EXEC.u64;\nEXEC.u64 = (S0.u64 | ~EXEC.u64);\nD0.u64 = saveexec.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_AND_NOT0_WREXEC_B32: 'EXEC.u32 = (~S0.u32 & EXEC.u32);\nD0.u32 = EXEC.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_NOT0_WREXEC_B64: 'EXEC.u64 = (~S0.u64 & EXEC.u64);\nD0.u64 = EXEC.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_AND_NOT1_WREXEC_B32: 'EXEC.u32 = (S0.u32 & ~EXEC.u32);\nD0.u32 = EXEC.u32;\nSCC = EXEC.u32 != 0U', + SOP1Op.S_AND_NOT1_WREXEC_B64: 'EXEC.u64 = (S0.u64 & ~EXEC.u64);\nD0.u64 = EXEC.u64;\nSCC = EXEC.u64 != 0ULL', + SOP1Op.S_MOVRELS_B32: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b32 = SGPR[addr].b32', + SOP1Op.S_MOVRELS_B64: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b64 = SGPR[addr].b64', + SOP1Op.S_MOVRELD_B32: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nSGPR[addr].b32 = S0.b32', + SOP1Op.S_MOVRELD_B64: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nSGPR[addr].b64 = S0.b64', + SOP1Op.S_MOVRELSD_2_B32: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[9 : 0].u32;\naddrd += M0.u32[25 : 16].u32;\nSGPR[addrd].b32 = SGPR[addrs].b32', + SOP1Op.S_GETPC_B64: 'D0.i64 = PC + 4LL', + SOP1Op.S_SETPC_B64: 'PC = S0.i64', + SOP1Op.S_SWAPPC_B64: 'jump_addr = S0.i64;\nD0.i64 = PC + 4LL;\nPC = jump_addr.i64', + SOP1Op.S_RFE_B64: "WAVE_STATUS.PRIV = 1'0U;\nPC = S0.i64", + SOP1Op.S_BARRIER_SIGNAL: ";\n// M0 cannot reference the negative barrier numbers.\nbarrierNumber = IsM0(SRC0.u32) ? 32'I(M0[4 : 0].u32) : SRC0.i32;\nif !InWorkgroup() then\n// Must be in a workgroup to signal a barrier.\ns_nop(16'0U)\nelsif ((barrierNumber == -2) && !WAVE_STATUS.PRIV) then\n// Barrier #-2 is privileged (for traps only).\ns_nop(16'0U)\nelsif barrierNumber == 0 then\n// Barrier #0 is a NOP.\ns_nop(16'0U)\nelse\nBARRIER_STATE[barrierNumber & 63].signalCnt += 7'1U\nendif;\n// Check for barrier completion.\nCheckBarrierComplete(barrierNumber)", + SOP1Op.S_BARRIER_SIGNAL_ISFIRST: ";\n// M0 cannot reference the negative barrier numbers.\nbarrierNumber = IsM0(SRC0.u32) ? 32'I(M0[4 : 0].u32) : SRC0.i32;\nif !InWorkgroup() then\n// Must be in a workgroup to signal a barrier.\nSCC = 1'0U\nelsif ((barrierNumber == -2) && !WAVE_STATUS.PRIV) then\n// Barrier #-2 is privileged (for traps only).\nSCC = 1'0U\nelsif barrierNumber == 0 then\n// Barrier #0 is a NOP.\nSCC = 1'0U\nelse\n// Set SCC if this is the first signaling event for this barrier.\nSCC = BARRIER_STATE[barrierNumber & 63].signalCnt.u32 == 0U;\nBARRIER_STATE[barrierNumber & 63].signalCnt += 7'1U\nendif;\nCheckBarrierComplete(barrierNumber)", + SOP1Op.S_GET_BARRIER_STATE: "barrierNumber = IsM0(SRC0.u32) ? 32'I(M0[4 : 0].u32) : SRC0.i32;\nD0.u32 = 32'U({ 9'0, BARRIER_STATE[barrierNumber & 63].signalCnt.u7, 5'0, BARRIER_STATE[barrierNumber &\n63].memberCnt.u7, 3'0, BARRIER_STATE[barrierNumber & 63].valid.u1 })", + SOP1Op.S_ALLOC_VGPR: "WaitIdleExceptStoreCnt();\nn = ReallocVgprs(32'I(S0[8 : 0].u32));\n// ReallocVgprs returns the actual number of VGPRs allocated rounded to segment size.\n// ReallocVgprs returns a negative value if reallocation fails.\nif n < 0 then\nSCC = 1'0U\nelse\nNUM_VGPRS = n;\nSCC = 1'1U\nendif", + SOP1Op.S_CEIL_F32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 > 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += 1.0F\nendif', + SOP1Op.S_FLOOR_F32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 < 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += -1.0F\nendif', + SOP1Op.S_TRUNC_F32: 'D0.f32 = trunc(S0.f32)', + SOP1Op.S_RNDNE_F32: "D0.f32 = floor(S0.f32 + 0.5F);\nif (isEven(64'F(floor(S0.f32))) && (fract(S0.f32) == 0.5F)) then\nD0.f32 -= 1.0F\nendif", + SOP1Op.S_CVT_F32_I32: 'D0.f32 = i32_to_f32(S0.i32)', + SOP1Op.S_CVT_F32_U32: 'D0.f32 = u32_to_f32(S0.u32)', + SOP1Op.S_CVT_I32_F32: 'D0.i32 = f32_to_i32(S0.f32)', + SOP1Op.S_CVT_U32_F32: 'D0.u32 = f32_to_u32(S0.f32)', + SOP1Op.S_CVT_F16_F32: 'D0.f16 = f32_to_f16(S0.f32)', + SOP1Op.S_CVT_F32_F16: 'D0.f32 = f16_to_f32(S0.f16)', + SOP1Op.S_CVT_HI_F32_F16: 'D0.f32 = f16_to_f32(S0[31 : 16].f16)', + SOP1Op.S_CEIL_F16: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 > 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += 16'1.0\nendif", + SOP1Op.S_FLOOR_F16: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 < 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += -16'1.0\nendif", + SOP1Op.S_TRUNC_F16: 'D0.f16 = trunc(S0.f16)', + SOP1Op.S_RNDNE_F16: "D0.f16 = floor(S0.f16 + 16'0.5);\nif (isEven(64'F(floor(S0.f16))) && (fract(S0.f16) == 16'0.5)) then\nD0.f16 -= 16'1.0\nendif", + SOP2Op.S_ADD_CO_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_ADD_CO_CI_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_SUB_CO_U32: "tmp = S0.u32 - S1.u32;\nSCC = S1.u32 > S0.u32 ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_ADD_CO_I32: 'tmp = S0.i32 + S1.i32;\nSCC = ((S0.u32[31] == S1.u32[31]) && (S0.u32[31] != tmp.u32[31]));\n// signed overflow.\nD0.i32 = tmp.i32', + SOP2Op.S_SUB_CO_I32: 'tmp = S0.i32 - S1.i32;\nSCC = ((S0.u32[31] != S1.u32[31]) && (S0.u32[31] != tmp.u32[31]));\n// signed overflow.\nD0.i32 = tmp.i32', + SOP2Op.S_ADD_CO_CI_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + SCC.u64;\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_ADD_CO_CI_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_SUB_CO_CI_U32: "tmp = S0.u32 - S1.u32 - SCC.u32;\nSCC = 64'U(S1.u32) + SCC.u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// unsigned overflow or carry-out for S_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + SOP2Op.S_ABSDIFF_I32: 'D0.i32 = S0.i32 - S1.i32;\nif D0.i32 < 0 then\nD0.i32 = -D0.i32\nendif;\nSCC = D0.i32 != 0', + SOP2Op.S_LSHL_B32: 'D0.u32 = (S0.u32 << S1[4 : 0].u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_LSHL_B64: 'D0.u64 = (S0.u64 << S1[5 : 0].u32);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_LSHR_B32: 'D0.u32 = (S0.u32 >> S1[4 : 0].u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_LSHR_B64: 'D0.u64 = (S0.u64 >> S1[5 : 0].u32);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_ASHR_I32: "D0.i32 = 32'I(signext(S0.i32) >> S1[4 : 0].u32);\nSCC = D0.i32 != 0", + SOP2Op.S_ASHR_I64: 'D0.i64 = (signext(S0.i64) >> S1[5 : 0].u32);\nSCC = D0.i64 != 0LL', + SOP2Op.S_LSHL1_ADD_U32: "tmp = (64'U(S0.u32) << 1U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL2_ADD_U32: "tmp = (64'U(S0.u32) << 2U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL3_ADD_U32: "tmp = (64'U(S0.u32) << 3U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_LSHL4_ADD_U32: "tmp = (64'U(S0.u32) << 4U) + 64'U(S1.u32);\nSCC = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// unsigned overflow.\nD0.u32 = tmp.u32", + SOP2Op.S_MIN_I32: 'SCC = S0.i32 < S1.i32;\nD0.i32 = SCC ? S0.i32 : S1.i32', + SOP2Op.S_MIN_U32: 'SCC = S0.u32 < S1.u32;\nD0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_MAX_I32: 'SCC = S0.i32 >= S1.i32;\nD0.i32 = SCC ? S0.i32 : S1.i32', + SOP2Op.S_MAX_U32: 'SCC = S0.u32 >= S1.u32;\nD0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_AND_B32: 'D0.u32 = (S0.u32 & S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_AND_B64: 'D0.u64 = (S0.u64 & S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_OR_B32: 'D0.u32 = (S0.u32 | S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_OR_B64: 'D0.u64 = (S0.u64 | S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_XOR_B32: 'D0.u32 = (S0.u32 ^ S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_XOR_B64: 'D0.u64 = (S0.u64 ^ S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_NAND_B32: 'D0.u32 = ~(S0.u32 & S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_NAND_B64: 'D0.u64 = ~(S0.u64 & S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_NOR_B32: 'D0.u32 = ~(S0.u32 | S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_NOR_B64: 'D0.u64 = ~(S0.u64 | S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_XNOR_B32: 'D0.u32 = ~(S0.u32 ^ S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_XNOR_B64: 'D0.u64 = ~(S0.u64 ^ S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_AND_NOT1_B32: 'D0.u32 = (S0.u32 & ~S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_AND_NOT1_B64: 'D0.u64 = (S0.u64 & ~S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_OR_NOT1_B32: 'D0.u32 = (S0.u32 | ~S1.u32);\nSCC = D0.u32 != 0U', + SOP2Op.S_OR_NOT1_B64: 'D0.u64 = (S0.u64 | ~S1.u64);\nSCC = D0.u64 != 0ULL', + SOP2Op.S_BFE_U32: 'D0.u32 = ((S0.u32 >> S1[4 : 0].u32) & ((1U << S1[22 : 16].u32) - 1U));\nSCC = D0.u32 != 0U', + SOP2Op.S_BFE_I32: 'tmp.i32 = ((S0.i32 >> S1[4 : 0].u32) & ((1 << S1[22 : 16].u32) - 1));\nD0.i32 = signext_from_bit(tmp.i32, S1[22 : 16].u32);\nSCC = D0.i32 != 0', + SOP2Op.S_BFE_U64: 'D0.u64 = ((S0.u64 >> S1[5 : 0].u32) & ((1ULL << S1[22 : 16].u32) - 1ULL));\nSCC = D0.u64 != 0ULL', + SOP2Op.S_BFE_I64: 'tmp.i64 = ((S0.i64 >> S1[5 : 0].u32) & ((1LL << S1[22 : 16].u32) - 1LL));\nD0.i64 = signext_from_bit(tmp.i64, S1[22 : 16].u32);\nSCC = D0.i64 != 0LL', + SOP2Op.S_BFM_B32: 'D0.u32 = (((1U << S0[4 : 0].u32) - 1U) << S1[4 : 0].u32)', + SOP2Op.S_BFM_B64: 'D0.u64 = (((1ULL << S0[5 : 0].u32) - 1ULL) << S1[5 : 0].u32)', + SOP2Op.S_MUL_I32: 'D0.i32 = S0.i32 * S1.i32', + SOP2Op.S_MUL_HI_U32: "D0.u32 = 32'U((64'U(S0.u32) * 64'U(S1.u32)) >> 32U)", + SOP2Op.S_MUL_HI_I32: "D0.i32 = 32'I((64'I(S0.i32) * 64'I(S1.i32)) >> 32U)", + SOP2Op.S_CSELECT_B32: 'D0.u32 = SCC ? S0.u32 : S1.u32', + SOP2Op.S_CSELECT_B64: 'D0.u64 = SCC ? S0.u64 : S1.u64', + SOP2Op.S_PACK_LL_B32_B16: 'D0 = { S1[15 : 0].u16, S0[15 : 0].u16 }', + SOP2Op.S_PACK_LH_B32_B16: 'D0 = { S1[31 : 16].u16, S0[15 : 0].u16 }', + SOP2Op.S_PACK_HH_B32_B16: 'D0 = { S1[31 : 16].u16, S0[31 : 16].u16 }', + SOP2Op.S_PACK_HL_B32_B16: 'D0 = { S1[15 : 0].u16, S0[31 : 16].u16 }', + SOP2Op.S_ADD_F32: 'D0.f32 = S0.f32 + S1.f32', + SOP2Op.S_SUB_F32: 'D0.f32 = S0.f32 - S1.f32', + SOP2Op.S_MIN_NUM_F32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f32)) && isNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((S0.f32 < S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && sign(S0.f32) &&\n!sign(S1.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + SOP2Op.S_MAX_NUM_F32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f32)) && isNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((S0.f32 > S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && !sign(S0.f32) &&\nsign(S1.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + SOP2Op.S_MUL_F32: 'D0.f32 = S0.f32 * S1.f32', + SOP2Op.S_FMAAK_F32: 'D0.f32 = fma(S0.f32, S1.f32, SIMM32.f32)', + SOP2Op.S_FMAMK_F32: 'D0.f32 = fma(S0.f32, SIMM32.f32, S1.f32)', + SOP2Op.S_FMAC_F32: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + SOP2Op.S_CVT_PK_RTZ_F16_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_TOWARD_ZERO;\ntmp[15 : 0].f16 = f32_to_f16(S0.f32);\ntmp[31 : 16].f16 = f32_to_f16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode;\n// Round-toward-zero regardless of current round mode setting in hardware.', + SOP2Op.S_ADD_F16: 'D0.f16 = S0.f16 + S1.f16', + SOP2Op.S_SUB_F16: 'D0.f16 = S0.f16 - S1.f16', + SOP2Op.S_MIN_NUM_F16: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f16)) && isNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((S0.f16 < S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && sign(S0.f16) &&\n!sign(S1.f16))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + SOP2Op.S_MAX_NUM_F16: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f16)) && isNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((S0.f16 > S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && !sign(S0.f16) &&\nsign(S1.f16))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + SOP2Op.S_MUL_F16: 'D0.f16 = S0.f16 * S1.f16', + SOP2Op.S_FMAC_F16: 'D0.f16 = fma(S0.f16, S1.f16, D0.f16)', + SOP2Op.S_MINIMUM_F32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S1.f32\nelsif ((S0.f32 < S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && sign(S0.f32) &&\n!sign(S1.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + SOP2Op.S_MAXIMUM_F32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S1.f32\nelsif ((S0.f32 > S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && !sign(S0.f32) &&\nsign(S1.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + SOP2Op.S_MINIMUM_F16: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S1.f16\nelsif ((S0.f16 < S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && sign(S0.f16) &&\n!sign(S1.f16))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + SOP2Op.S_MAXIMUM_F16: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S1.f16\nelsif ((S0.f16 > S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && !sign(S0.f16) &&\nsign(S1.f16))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + SOP2Op.S_ADD_NC_U64: 'D0.u64 = S0.u64 + S1.u64', + SOP2Op.S_SUB_NC_U64: 'D0.u64 = S0.u64 - S1.u64', + SOP2Op.S_MUL_U64: 'D0.u64 = S0.u64 * S1.u64', + SOPCOp.S_CMP_EQ_I32: 'SCC = S0.i32 == S1.i32', + SOPCOp.S_CMP_LG_I32: 'SCC = S0.i32 <> S1.i32', + SOPCOp.S_CMP_GT_I32: 'SCC = S0.i32 > S1.i32', + SOPCOp.S_CMP_GE_I32: 'SCC = S0.i32 >= S1.i32', + SOPCOp.S_CMP_LT_I32: 'SCC = S0.i32 < S1.i32', + SOPCOp.S_CMP_LE_I32: 'SCC = S0.i32 <= S1.i32', + SOPCOp.S_CMP_EQ_U32: 'SCC = S0.u32 == S1.u32', + SOPCOp.S_CMP_LG_U32: 'SCC = S0.u32 <> S1.u32', + SOPCOp.S_CMP_GT_U32: 'SCC = S0.u32 > S1.u32', + SOPCOp.S_CMP_GE_U32: 'SCC = S0.u32 >= S1.u32', + SOPCOp.S_CMP_LT_U32: 'SCC = S0.u32 < S1.u32', + SOPCOp.S_CMP_LE_U32: 'SCC = S0.u32 <= S1.u32', + SOPCOp.S_BITCMP0_B32: "SCC = S0.u32[S1.u32[4 : 0]] == 1'0U", + SOPCOp.S_BITCMP1_B32: "SCC = S0.u32[S1.u32[4 : 0]] == 1'1U", + SOPCOp.S_BITCMP0_B64: "SCC = S0.u64[S1.u32[5 : 0]] == 1'0U", + SOPCOp.S_BITCMP1_B64: "SCC = S0.u64[S1.u32[5 : 0]] == 1'1U", + SOPCOp.S_CMP_EQ_U64: 'SCC = S0.u64 == S1.u64', + SOPCOp.S_CMP_LG_U64: 'SCC = S0.u64 <> S1.u64', + SOPCOp.S_CMP_LT_F32: 'SCC = S0.f32 < S1.f32', + SOPCOp.S_CMP_EQ_F32: 'SCC = S0.f32 == S1.f32', + SOPCOp.S_CMP_LE_F32: 'SCC = S0.f32 <= S1.f32', + SOPCOp.S_CMP_GT_F32: 'SCC = S0.f32 > S1.f32', + SOPCOp.S_CMP_LG_F32: 'SCC = S0.f32 <> S1.f32', + SOPCOp.S_CMP_GE_F32: 'SCC = S0.f32 >= S1.f32', + SOPCOp.S_CMP_O_F32: "SCC = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)))", + SOPCOp.S_CMP_U_F32: "SCC = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)))", + SOPCOp.S_CMP_NGE_F32: 'SCC = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <', + SOPCOp.S_CMP_NLG_F32: 'SCC = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==', + SOPCOp.S_CMP_NGT_F32: 'SCC = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=', + SOPCOp.S_CMP_NLE_F32: 'SCC = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >', + SOPCOp.S_CMP_NEQ_F32: 'SCC = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=', + SOPCOp.S_CMP_NLT_F32: 'SCC = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=', + SOPCOp.S_CMP_LT_F16: 'SCC = S0.f16 < S1.f16', + SOPCOp.S_CMP_EQ_F16: 'SCC = S0.f16 == S1.f16', + SOPCOp.S_CMP_LE_F16: 'SCC = S0.f16 <= S1.f16', + SOPCOp.S_CMP_GT_F16: 'SCC = S0.f16 > S1.f16', + SOPCOp.S_CMP_LG_F16: 'SCC = S0.f16 <> S1.f16', + SOPCOp.S_CMP_GE_F16: 'SCC = S0.f16 >= S1.f16', + SOPCOp.S_CMP_O_F16: "SCC = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)))", + SOPCOp.S_CMP_U_F16: "SCC = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)))", + SOPCOp.S_CMP_NGE_F16: 'SCC = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <', + SOPCOp.S_CMP_NLG_F16: 'SCC = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==', + SOPCOp.S_CMP_NGT_F16: 'SCC = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=', + SOPCOp.S_CMP_NLE_F16: 'SCC = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >', + SOPCOp.S_CMP_NEQ_F16: 'SCC = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=', + SOPCOp.S_CMP_NLT_F16: 'SCC = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=', + SOPKOp.S_MOVK_I32: "D0.i32 = 32'I(signext(S0.i16))", + SOPKOp.S_VERSION: 'nop();\n// Do nothing - for use by tools only', + SOPKOp.S_CMOVK_I32: "if SCC then\nD0.i32 = 32'I(signext(S0.i16))\nendif", + SOPKOp.S_ADDK_CO_I32: "tmp = D0.i32;\n// Save value to check sign bits for overflow later.\nD0.i32 = D0.i32 + 32'I(signext(S0.i16));\nSCC = ((tmp[31] == S0.i16[15]) && (tmp[31] != D0.i32[31]));\n// signed overflow.", + SOPKOp.S_MULK_I32: "D0.i32 = D0.i32 * 32'I(signext(S0.i16))", + SOPKOp.S_GETREG_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nvalue = HW_REGISTERS[hwRegId];\nD0.u32 = 32'U(32'I(value >> offset.u32) & ((1 << size) - 1))", + SOPKOp.S_SETREG_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nmask = (1 << size) - 1;\nmask = (mask << offset.u32);\nmask = (mask & HwRegWriteMask(hwRegId, WAVE_STATUS.PRIV));\n// Mask of bits that can be modified\nvalue = ((S0.u32 << offset.u32) & mask.u32);\nvalue = (value | 32'U(HW_REGISTERS[hwRegId].i32 & ~mask));\nHW_REGISTERS[hwRegId] = value.b32;\n// Side-effects may trigger here if certain bits are modified", + SOPKOp.S_SETREG_IMM32_B32: "hwRegId = SIMM16.u16[5 : 0];\noffset = SIMM16.u16[10 : 6];\nsize = SIMM16.u16[15 : 11].u32 + 1U;\n// logical size is in range 1:32\nmask = (1 << size) - 1;\nmask = (mask << offset.u32);\nmask = (mask & HwRegWriteMask(hwRegId, WAVE_STATUS.PRIV));\n// Mask of bits that can be modified\nvalue = ((SIMM32.u32 << offset.u32) & mask.u32);\nvalue = (value | 32'U(HW_REGISTERS[hwRegId].i32 & ~mask));\nHW_REGISTERS[hwRegId] = value.b32;\n// Side-effects may trigger here if certain bits are modified", + SOPKOp.S_CALL_B64: "D0.i64 = PC + 4LL;\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL", + SOPPOp.S_NOP: 'for i in 0U : SIMM16.u16[3 : 0].u32 do\nnop()\nendfor', + SOPPOp.S_SLEEP: 's_sleep { duration: 0 } // Wait for 0 clocks.\ns_sleep { duration: 1 } // Wait for 1-64 clocks.\ns_sleep { duration: 2 } // Wait for 65-128 clocks.\ns_sleep { sleep_forever: 1 } // Wait until an event occurs.', + SOPPOp.S_DELAY_ALU: 'v_mov_b32 v3, v0\nv_lshlrev_b32 v30, 1, v31\nv_lshlrev_b32 v24, 1, v25\ns_delay_alu { instid0: INSTID_VALU_DEP_3, instskip: INSTSKIP_SKIP_1, instid1: INSTID_VALU_DEP_1 }\n// 1 cycle delay here\nv_add_f32 v0, v1, v3\nv_sub_f32 v11, v9, v9\n// 2 cycles delay here\nv_mul_f32 v10, v13, v11', + SOPPOp.S_TRAP: 'TrapID = SIMM16.u16[3 : 0].u8;\n"Wait for all instructions to complete";\n// PC passed into trap handler points to S_TRAP itself,\n// *not* to the next instruction.\n{ TTMP[1], TTMP[0] } = { TrapID[3 : 0], 12\'0, PC[47 : 0] };\nPC = TBA.i64;\n// trap base address\nWAVE_STATUS.PRIV = 1\'1U', + SOPPOp.S_BARRIER_WAIT: ";\n// barrierBit 0: reserved\n// barrierBit 1: workgroup\n// barrierBit 2: trap\nbarrierBit = SIMM16.i32 >= 0 ? 0 : SIMM16.i32 == -1 ? 1 : 2;\nwhile !WAVE_BARRIER_COMPLETE[barrierBit] do\n// Implemented as a power-saving idle\ns_nop(16'0U)\nendwhile;\nWAVE_BARRIER_COMPLETE[barrierBit] = 1'0U", + SOPPOp.S_CODE_END: '...\ns_endpgm // last real instruction in shader buffer\ns_code_end // 1\ns_code_end // 2\ns_code_end // 3\ns_code_end // 4\ns_code_end // done!', + SOPPOp.S_BRANCH: "PC = PC + signext(SIMM16.i16 * 16'4) + 4LL;\n// short jump.", + SOPPOp.S_CBRANCH_SCC0: "if SCC == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_SCC1: "if SCC == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_VCCZ: "if VCCZ.u1 == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_VCCNZ: "if VCCZ.u1 == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_EXECZ: "if EXECZ.u1 == 1'1U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_CBRANCH_EXECNZ: "if EXECZ.u1 == 1'0U then\nPC = PC + signext(SIMM16.i16 * 16'4) + 4LL\nelse\nPC = PC + 4LL\nendif", + SOPPOp.S_SETPRIO: 'SysUserPrio = MIN(3, SysPrio[1:0] + UserPrio[1:0]). Priority = {SysUserPrio[1:0], WaveAge[3:0]}', + VBUFFEROp.BUFFER_LOAD_FORMAT_X: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format', + VBUFFEROp.BUFFER_LOAD_FORMAT_XY: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()])', + VBUFFEROp.BUFFER_LOAD_FORMAT_XYZ: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()])', + VBUFFEROp.BUFFER_LOAD_FORMAT_XYZW: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()]);\nVDATA[127 : 96].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetW()])', + VBUFFEROp.BUFFER_STORE_FORMAT_X: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format', + VBUFFEROp.BUFFER_STORE_FORMAT_XY: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32)', + VBUFFEROp.BUFFER_STORE_FORMAT_XYZ: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32)', + VBUFFEROp.BUFFER_STORE_FORMAT_XYZW: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32);\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(VDATA[127 : 96].b32)', + VBUFFEROp.BUFFER_LOAD_D16_FORMAT_X: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\n// VDATA[31:16].b16 is preserved.", + VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XY: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]))", + VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XYZ: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\n// VDATA[63:48].b16 is preserved.", + VBUFFEROp.BUFFER_LOAD_D16_FORMAT_XYZW: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\nVDATA[63 : 48].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetW()]))", + VBUFFEROp.BUFFER_STORE_D16_FORMAT_X: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format", + VBUFFEROp.BUFFER_STORE_D16_FORMAT_XY: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16))", + VBUFFEROp.BUFFER_STORE_D16_FORMAT_XYZ: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16))", + VBUFFEROp.BUFFER_STORE_D16_FORMAT_XYZW: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16));\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(32'B(VDATA[63 : 48].b16))", + VBUFFEROp.BUFFER_LOAD_U8: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA.u32 = 32'U({ 24'0U, MEM[addr].u8 })", + VBUFFEROp.BUFFER_LOAD_I8: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA.i32 = 32'I(signext(MEM[addr].i8))", + VBUFFEROp.BUFFER_LOAD_U16: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", + VBUFFEROp.BUFFER_LOAD_I16: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", + VBUFFEROp.BUFFER_LOAD_B32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0] = MEM[addr].b32', + VBUFFEROp.BUFFER_LOAD_B64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32', + VBUFFEROp.BUFFER_LOAD_B96: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32', + VBUFFEROp.BUFFER_LOAD_B128: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32', + VBUFFEROp.BUFFER_STORE_B8: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr].b8 = VDATA[7 : 0]', + VBUFFEROp.BUFFER_STORE_B16: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr].b16 = VDATA[15 : 0]', + VBUFFEROp.BUFFER_STORE_B32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr].b32 = VDATA[31 : 0]', + VBUFFEROp.BUFFER_STORE_B64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]', + VBUFFEROp.BUFFER_STORE_B96: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]', + VBUFFEROp.BUFFER_STORE_B128: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]', + VBUFFEROp.BUFFER_LOAD_D16_U8: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", + VBUFFEROp.BUFFER_LOAD_D16_I8: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", + VBUFFEROp.BUFFER_LOAD_D16_B16: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.', + VBUFFEROp.BUFFER_LOAD_D16_HI_U8: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", + VBUFFEROp.BUFFER_LOAD_D16_HI_I8: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", + VBUFFEROp.BUFFER_LOAD_D16_HI_B16: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.', + VBUFFEROp.BUFFER_STORE_D16_HI_B8: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr].b8 = VDATA[23 : 16]', + VBUFFEROp.BUFFER_STORE_D16_HI_B16: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr].b16 = VDATA[31 : 16]', + VBUFFEROp.BUFFER_LOAD_D16_HI_FORMAT_X: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\n// VDATA[15:0].b16 is preserved.", + VBUFFEROp.BUFFER_STORE_D16_HI_FORMAT_X: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\n// Mem access size depends on format", + VBUFFEROp.BUFFER_ATOMIC_SWAP_B32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_CMPSWAP_B32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_ADD_U32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_SUB_U32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_SUB_CLAMP_U32: "declare new_value : 32'U;\nold_value = MEM[ADDR].u32;\nif old_value < DATA.u32 then\nnew_value = 0U\nelse\nnew_value = old_value - DATA.u32\nendif;\nMEM[ADDR].u32 = new_value;\nRETURN_DATA.u32 = old_value", + VBUFFEROp.BUFFER_ATOMIC_MIN_I32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_MIN_U32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_MAX_I32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_MAX_U32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_AND_B32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_OR_B32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_XOR_B32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_INC_U32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_DEC_U32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_SWAP_B64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_CMPSWAP_B64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_ADD_U64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_SUB_U64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_MIN_I64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_MIN_U64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_MAX_I64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_MAX_U64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_AND_B64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_OR_B64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_XOR_B64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_INC_U64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_DEC_U64: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + VBUFFEROp.BUFFER_ATOMIC_COND_SUB_U32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? tmp - src : tmp;\nRETURN_DATA.u32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_MIN_NUM_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 < tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && sign(src.f32) &&\n!sign(tmp.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + VBUFFEROp.BUFFER_ATOMIC_MAX_NUM_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 > tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && !sign(src.f32) &&\nsign(tmp.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + VBUFFEROp.BUFFER_ATOMIC_ADD_F32: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + VBUFFEROp.BUFFER_ATOMIC_PK_ADD_F16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].f16 = src[15 : 0].f16 + tmp[15 : 0].f16;\ndst[31 : 16].f16 = src[31 : 16].f16 + tmp[31 : 16].f16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + VBUFFEROp.BUFFER_ATOMIC_PK_ADD_BF16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].bf16 = src[15 : 0].bf16 + tmp[15 : 0].bf16;\ndst[31 : 16].bf16 = src[31 : 16].bf16 + tmp[31 : 16].bf16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + VBUFFEROp.TBUFFER_LOAD_FORMAT_X: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format', + VBUFFEROp.TBUFFER_LOAD_FORMAT_XY: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()])', + VBUFFEROp.TBUFFER_LOAD_FORMAT_XYZ: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()])', + VBUFFEROp.TBUFFER_LOAD_FORMAT_XYZW: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[31 : 0].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetX()]);\n// Mem access size depends on format\nVDATA[63 : 32].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetY()]);\nVDATA[95 : 64].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetZ()]);\nVDATA[127 : 96].b32 = ConvertFromFormat(MEM[addr + ChannelOffsetW()])', + VBUFFEROp.TBUFFER_STORE_FORMAT_X: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format', + VBUFFEROp.TBUFFER_STORE_FORMAT_XY: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32)', + VBUFFEROp.TBUFFER_STORE_FORMAT_XYZ: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32)', + VBUFFEROp.TBUFFER_STORE_FORMAT_XYZW: 'addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(VDATA[31 : 0].b32);\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(VDATA[63 : 32].b32);\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(VDATA[95 : 64].b32);\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(VDATA[127 : 96].b32)', + VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_X: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\n// VDATA[31:16].b16 is preserved.", + VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XY: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]))", + VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XYZ: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\n// VDATA[63:48].b16 is preserved.", + VBUFFEROp.TBUFFER_LOAD_D16_FORMAT_XYZW: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nVDATA[15 : 0].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetX()]));\n// Mem access size depends on format\nVDATA[31 : 16].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetY()]));\nVDATA[47 : 32].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetZ()]));\nVDATA[63 : 48].b16 = 16'B(ConvertFromFormat(MEM[addr + ChannelOffsetW()]))", + VBUFFEROp.TBUFFER_STORE_D16_FORMAT_X: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format", + VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XY: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16))", + VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XYZ: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16))", + VBUFFEROp.TBUFFER_STORE_D16_FORMAT_XYZW: "addr = CalcBufferAddr(vgpr_a.b64, sgpr_o.b64);\nMEM[addr + ChannelOffsetX()] = ConvertToFormat(32'B(VDATA[15 : 0].b16));\n// Mem access size depends on format\nMEM[addr + ChannelOffsetY()] = ConvertToFormat(32'B(VDATA[31 : 16].b16));\nMEM[addr + ChannelOffsetZ()] = ConvertToFormat(32'B(VDATA[47 : 32].b16));\nMEM[addr + ChannelOffsetW()] = ConvertToFormat(32'B(VDATA[63 : 48].b16))", + VFLATOp.FLAT_LOAD_U8: "addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA.u32 = 32'U({ 24'0U, MEM[addr].u8 })", + VFLATOp.FLAT_LOAD_I8: "addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA.i32 = 32'I(signext(MEM[addr].i8))", + VFLATOp.FLAT_LOAD_U16: "addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", + VFLATOp.FLAT_LOAD_I16: "addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", + VFLATOp.FLAT_LOAD_B32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[31 : 0] = MEM[addr].b32', + VFLATOp.FLAT_LOAD_B64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32', + VFLATOp.FLAT_LOAD_B96: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32', + VFLATOp.FLAT_LOAD_B128: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32', + VFLATOp.FLAT_STORE_B8: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nMEM[addr].b8 = VDATA[7 : 0]', + VFLATOp.FLAT_STORE_B16: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nMEM[addr].b16 = VDATA[15 : 0]', + VFLATOp.FLAT_STORE_B32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nMEM[addr].b32 = VDATA[31 : 0]', + VFLATOp.FLAT_STORE_B64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]', + VFLATOp.FLAT_STORE_B96: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]', + VFLATOp.FLAT_STORE_B128: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]', + VFLATOp.FLAT_LOAD_D16_U8: "addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", + VFLATOp.FLAT_LOAD_D16_I8: "addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", + VFLATOp.FLAT_LOAD_D16_B16: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.', + VFLATOp.FLAT_LOAD_D16_HI_U8: "addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", + VFLATOp.FLAT_LOAD_D16_HI_I8: "addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", + VFLATOp.FLAT_LOAD_D16_HI_B16: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.', + VFLATOp.FLAT_STORE_D16_HI_B8: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nMEM[addr].b8 = VDATA[23 : 16]', + VFLATOp.FLAT_STORE_D16_HI_B16: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\nMEM[addr].b16 = VDATA[31 : 16]', + VFLATOp.GLOBAL_LOAD_ADDTID_B32: "RETURN_DATA.u32 = MEM[SGPR_ADDR[63 : 0] + INST_OFFSET[11 : 0].b64 + 64'B(laneID.i32 * 4)].u32", + VFLATOp.GLOBAL_STORE_ADDTID_B32: "MEM[SGPR_ADDR[63 : 0] + INST_OFFSET[11 : 0].b64 + 64'B(laneID.i32 * 4)].u32 = DATA.u32", + VFLATOp.FLAT_ATOMIC_SWAP_B32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + VFLATOp.FLAT_ATOMIC_CMPSWAP_B32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VFLATOp.FLAT_ATOMIC_ADD_U32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + VFLATOp.FLAT_ATOMIC_SUB_U32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + VFLATOp.FLAT_ATOMIC_SUB_CLAMP_U32: "declare new_value : 32'U;\nold_value = MEM[ADDR].u32;\nif old_value < DATA.u32 then\nnew_value = 0U\nelse\nnew_value = old_value - DATA.u32\nendif;\nMEM[ADDR].u32 = new_value;\nRETURN_DATA.u32 = old_value", + VFLATOp.FLAT_ATOMIC_MIN_I32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + VFLATOp.FLAT_ATOMIC_MIN_U32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VFLATOp.FLAT_ATOMIC_MAX_I32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + VFLATOp.FLAT_ATOMIC_MAX_U32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VFLATOp.FLAT_ATOMIC_AND_B32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + VFLATOp.FLAT_ATOMIC_OR_B32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + VFLATOp.FLAT_ATOMIC_XOR_B32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + VFLATOp.FLAT_ATOMIC_INC_U32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + VFLATOp.FLAT_ATOMIC_DEC_U32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + VFLATOp.FLAT_ATOMIC_SWAP_B64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + VFLATOp.FLAT_ATOMIC_CMPSWAP_B64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VFLATOp.FLAT_ATOMIC_ADD_U64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + VFLATOp.FLAT_ATOMIC_SUB_U64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + VFLATOp.FLAT_ATOMIC_MIN_I64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + VFLATOp.FLAT_ATOMIC_MIN_U64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VFLATOp.FLAT_ATOMIC_MAX_I64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + VFLATOp.FLAT_ATOMIC_MAX_U64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VFLATOp.FLAT_ATOMIC_AND_B64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + VFLATOp.FLAT_ATOMIC_OR_B64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + VFLATOp.FLAT_ATOMIC_XOR_B64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + VFLATOp.FLAT_ATOMIC_INC_U64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + VFLATOp.FLAT_ATOMIC_DEC_U64: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + VFLATOp.FLAT_ATOMIC_COND_SUB_U32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? tmp - src : tmp;\nRETURN_DATA.u32 = tmp', + VFLATOp.FLAT_ATOMIC_MIN_NUM_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 < tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && sign(src.f32) &&\n!sign(tmp.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + VFLATOp.FLAT_ATOMIC_MAX_NUM_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 > tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && !sign(src.f32) &&\nsign(tmp.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + VFLATOp.FLAT_ATOMIC_ADD_F32: 'addr = CalcFlatAddr(v_addr.b64, flat_scratch.b64);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + VFLATOp.FLAT_ATOMIC_PK_ADD_F16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].f16 = src[15 : 0].f16 + tmp[15 : 0].f16;\ndst[31 : 16].f16 = src[31 : 16].f16 + tmp[31 : 16].f16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + VFLATOp.FLAT_ATOMIC_PK_ADD_BF16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].bf16 = src[15 : 0].bf16 + tmp[15 : 0].bf16;\ndst[31 : 16].bf16 = src[31 : 16].bf16 + tmp[31 : 16].bf16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + VGLOBALOp.GLOBAL_LOAD_U8: "addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA.u32 = 32'U({ 24'0U, MEM[addr].u8 })", + VGLOBALOp.GLOBAL_LOAD_I8: "addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA.i32 = 32'I(signext(MEM[addr].i8))", + VGLOBALOp.GLOBAL_LOAD_U16: "addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", + VGLOBALOp.GLOBAL_LOAD_I16: "addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", + VGLOBALOp.GLOBAL_LOAD_B32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[31 : 0] = MEM[addr].b32', + VGLOBALOp.GLOBAL_LOAD_B64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32', + VGLOBALOp.GLOBAL_LOAD_B96: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32', + VGLOBALOp.GLOBAL_LOAD_B128: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32', + VGLOBALOp.GLOBAL_STORE_B8: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nMEM[addr].b8 = VDATA[7 : 0]', + VGLOBALOp.GLOBAL_STORE_B16: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nMEM[addr].b16 = VDATA[15 : 0]', + VGLOBALOp.GLOBAL_STORE_B32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nMEM[addr].b32 = VDATA[31 : 0]', + VGLOBALOp.GLOBAL_STORE_B64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]', + VGLOBALOp.GLOBAL_STORE_B96: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]', + VGLOBALOp.GLOBAL_STORE_B128: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]', + VGLOBALOp.GLOBAL_LOAD_D16_U8: "addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", + VGLOBALOp.GLOBAL_LOAD_D16_I8: "addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", + VGLOBALOp.GLOBAL_LOAD_D16_B16: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.', + VGLOBALOp.GLOBAL_LOAD_D16_HI_U8: "addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", + VGLOBALOp.GLOBAL_LOAD_D16_HI_I8: "addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", + VGLOBALOp.GLOBAL_LOAD_D16_HI_B16: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.', + VGLOBALOp.GLOBAL_STORE_D16_HI_B8: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nMEM[addr].b8 = VDATA[23 : 16]', + VGLOBALOp.GLOBAL_STORE_D16_HI_B16: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\nMEM[addr].b16 = VDATA[31 : 16]', + VGLOBALOp.GLOBAL_LOAD_ADDTID_B32: "RETURN_DATA.u32 = MEM[SGPR_ADDR[63 : 0] + INST_OFFSET[11 : 0].b64 + 64'B(laneID.i32 * 4)].u32", + VGLOBALOp.GLOBAL_STORE_ADDTID_B32: "MEM[SGPR_ADDR[63 : 0] + INST_OFFSET[11 : 0].b64 + 64'B(laneID.i32 * 4)].u32 = DATA.u32", + VGLOBALOp.GLOBAL_ATOMIC_SWAP_B32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_ADD_U32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_SUB_U32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_SUB_CLAMP_U32: "declare new_value : 32'U;\nold_value = MEM[ADDR].u32;\nif old_value < DATA.u32 then\nnew_value = 0U\nelse\nnew_value = old_value - DATA.u32\nendif;\nMEM[ADDR].u32 = new_value;\nRETURN_DATA.u32 = old_value", + VGLOBALOp.GLOBAL_ATOMIC_MIN_I32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_MIN_U32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_MAX_I32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_MAX_U32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_AND_B32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_OR_B32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_XOR_B32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_INC_U32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_DEC_U32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_SWAP_B64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = DATA.b64;\nRETURN_DATA.b64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_CMPSWAP_B64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u64;\nsrc = DATA[63 : 0].u64;\ncmp = DATA[127 : 64].u64;\nMEM[addr].u64 = tmp == cmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_ADD_U64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u64;\nMEM[addr].u64 += DATA.u64;\nRETURN_DATA.u64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_SUB_U64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u64;\nMEM[addr].u64 -= DATA.u64;\nRETURN_DATA.u64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_MIN_I64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src < tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_MIN_U64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src < tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_MAX_I64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].i64;\nsrc = DATA.i64;\nMEM[addr].i64 = src >= tmp ? src : tmp;\nRETURN_DATA.i64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_MAX_U64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = src >= tmp ? src : tmp;\nRETURN_DATA.u64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_AND_B64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp & DATA.b64);\nRETURN_DATA.b64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_OR_B64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp | DATA.b64);\nRETURN_DATA.b64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_XOR_B64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].b64;\nMEM[addr].b64 = (tmp ^ DATA.b64);\nRETURN_DATA.b64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_INC_U64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = tmp >= src ? 0ULL : tmp + 1ULL;\nRETURN_DATA.u64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_DEC_U64: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u64;\nsrc = DATA.u64;\nMEM[addr].u64 = ((tmp == 0ULL) || (tmp > src)) ? src : tmp - 1ULL;\nRETURN_DATA.u64 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_COND_SUB_U32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[ADDR].u32 = tmp >= src ? tmp - src : tmp;\nRETURN_DATA.u32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_MIN_NUM_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 < tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && sign(src.f32) &&\n!sign(tmp.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + VGLOBALOp.GLOBAL_ATOMIC_MAX_NUM_F32: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 > tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && !sign(src.f32) &&\nsign(tmp.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + VGLOBALOp.GLOBAL_LOAD_BLOCK: 'for i in 0 : 31 do\n// Algorithm can skip over "holes" both in the memory block and VGPR block.\nif M0[i].u1 then\nVGPR[laneId][VDST.u32 + i.u32] = MEM[VGPR[laneId][ADDR].i32 + i * 4].b32\nendif\nendfor', + VGLOBALOp.GLOBAL_STORE_BLOCK: 'for i in 0 : 31 do\n// Algorithm can skip over "holes" both in the memory block and VGPR block.\nif M0[i].u1 then\nMEM[VGPR[laneId][ADDR].i32 + i * 4] = VGPR[laneId][VDATA.u32 + i.u32].b32\nendif\nendfor', + VGLOBALOp.GLOBAL_ATOMIC_ADD_F32: 'addr = CalcGlobalAddr(v_addr.b64, s_saddr.b64);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + VGLOBALOp.GLOBAL_ATOMIC_PK_ADD_F16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].f16 = src[15 : 0].f16 + tmp[15 : 0].f16;\ndst[31 : 16].f16 = src[31 : 16].f16 + tmp[31 : 16].f16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + VGLOBALOp.GLOBAL_ATOMIC_PK_ADD_BF16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].bf16 = src[15 : 0].bf16 + tmp[15 : 0].bf16;\ndst[31 : 16].bf16 = src[31 : 16].bf16 + tmp[31 : 16].bf16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + VGLOBALOp.GLOBAL_ATOMIC_ORDERED_ADD_B64: "shader_id = DATA[31 : 0];\nshader_offset = DATA[63 : 32];\nold_mem_id = MEM[ADDR].b32;\nold_mem_value = MEM[ADDR + 4U].b32;\nif old_mem_id == shader_id then\nMEM[ADDR].b32 = 32'B((old_mem_id.i32 + 1) & VGT_GS_MAX_WAVE_ID.i32);\n// increment the ordered ID in memory\nMEM[ADDR + 4U].b32 = old_mem_value + shader_offset;\n// add the streamout offset\nendif;\nRETURN_DATA[31 : 0].b32 = old_mem_id;\nRETURN_DATA[63 : 32].b32 = old_mem_value", + VIMAGEOp.IMAGE_ATOMIC_SWAP: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = DATA.b32;\nRETURN_DATA.b32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_CMPSWAP: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].u32;\nsrc = DATA[31 : 0].u32;\ncmp = DATA[63 : 32].u32;\nMEM[addr].u32 = tmp == cmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_ADD_UINT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].u32;\nMEM[addr].u32 += DATA.u32;\nRETURN_DATA.u32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_SUB_UINT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].u32;\nMEM[addr].u32 -= DATA.u32;\nRETURN_DATA.u32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_MIN_INT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src < tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_MIN_UINT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src < tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_MAX_INT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].i32;\nsrc = DATA.i32;\nMEM[addr].i32 = src >= tmp ? src : tmp;\nRETURN_DATA.i32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_MAX_UINT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = src >= tmp ? src : tmp;\nRETURN_DATA.u32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_AND: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp & DATA.b32);\nRETURN_DATA.b32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_OR: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp | DATA.b32);\nRETURN_DATA.b32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_XOR: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].b32;\nMEM[addr].b32 = (tmp ^ DATA.b32);\nRETURN_DATA.b32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_INC_UINT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = tmp >= src ? 0U : tmp + 1U;\nRETURN_DATA.u32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_DEC_UINT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].u32;\nsrc = DATA.u32;\nMEM[addr].u32 = ((tmp == 0U) || (tmp > src)) ? src : tmp - 1U;\nRETURN_DATA.u32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_ADD_FLT: 'addr = CalcImageAddr(v_addr.b128);\ntmp = MEM[addr].f32;\nMEM[addr].f32 += DATA.f32;\nRETURN_DATA.f32 = tmp', + VIMAGEOp.IMAGE_ATOMIC_MIN_FLT: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 < tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && sign(src.f32) &&\n!sign(tmp.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + VIMAGEOp.IMAGE_ATOMIC_MAX_FLT: "tmp = MEM[ADDR].f32;\nsrc = DATA.f32;\nif (isNAN(64'F(src.f32)) && isNAN(64'F(tmp.f32))) then\nMEM[ADDR].f32 = 32'F(cvtToQuietNAN(64'F(src.f32)))\nelsif isNAN(64'F(src.f32)) then\nMEM[ADDR].f32 = tmp.f32\nelsif isNAN(64'F(tmp.f32)) then\nMEM[ADDR].f32 = src.f32\nelsif ((src.f32 > tmp.f32) || ((abs(src.f32) == 0.0F) && (abs(tmp.f32) == 0.0F) && !sign(src.f32) &&\nsign(tmp.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nMEM[ADDR].f32 = src.f32\nelse\nMEM[ADDR].f32 = tmp.f32\nendif;\nRETURN_DATA.f32 = tmp", + VIMAGEOp.IMAGE_ATOMIC_PK_ADD_F16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].f16 = src[15 : 0].f16 + tmp[15 : 0].f16;\ndst[31 : 16].f16 = src[31 : 16].f16 + tmp[31 : 16].f16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + VIMAGEOp.IMAGE_ATOMIC_PK_ADD_BF16: 'tmp = MEM[ADDR].b32;\nsrc = DATA.b32;\ndst[15 : 0].bf16 = src[15 : 0].bf16 + tmp[15 : 0].bf16;\ndst[31 : 16].bf16 = src[31 : 16].bf16 + tmp[31 : 16].bf16;\nMEM[ADDR].b32 = dst.b32;\nRETURN_DATA.b32 = tmp.b32', + VINTERPOp.V_INTERP_P10_F32: 'D0.f32 = fma(VGPR[(laneId.u32 & 0xfffffffcU) + 1U][SRC0.u32].f32, S1.f32, VGPR[laneId.u32 &\n0xfffffffcU][SRC2.u32].f32)', + VINTERPOp.V_INTERP_P2_F32: 'D0.f32 = fma(VGPR[(laneId.u32 & 0xfffffffcU) + 2U][SRC0.u32].f32, S1.f32, S2.f32)', + VINTERPOp.V_INTERP_P10_F16_F32: "D0.f32 = fma(32'F(VGPR[(laneId.u32 & 0xfffffffcU) + 1U][SRC0.u32].f16), S1.f32, 32'F(VGPR[laneId.u32 &\n0xfffffffcU][SRC2.u32].f16))", + VINTERPOp.V_INTERP_P2_F16_F32: "D0.f16 = 16'F(fma(32'F(VGPR[(laneId.u32 & 0xfffffffcU) + 2U][SRC0.u32].f16), S1.f32, S2.f32))", + VINTERPOp.V_INTERP_P10_RTZ_F16_F32: "D0.f32 = fma(32'F(VGPR[(laneId.u32 & 0xfffffffcU) + 1U][SRC0.u32].f16), S1.f32, 32'F(VGPR[laneId.u32 &\n0xfffffffcU][SRC2.u32].f16))", + VINTERPOp.V_INTERP_P2_RTZ_F16_F32: "D0.f32 = fma(32'F(VGPR[(laneId.u32 & 0xfffffffcU) + 2U][SRC0.u32].f16), S1.f32, S2.f32)", + VOP1Op.V_MOV_B32_E32: 'D0.b32 = S0.b32', + VOP1Op.V_READFIRSTLANE_B32_E32: "declare lane : 32'U;\nif WAVE64 then\n// 64 lanes\nif EXEC == 0x0LL then\nlane = 0U;\n// Force lane 0 if all lanes are disabled\nelse\nlane = 32'U(s_ff1_i32_b64(EXEC));\n// Lowest active lane\nendif\nelse\n// 32 lanes\nif EXEC_LO.i32 == 0 then\nlane = 0U;\n// Force lane 0 if all lanes are disabled\nelse\nlane = 32'U(s_ff1_i32_b32(EXEC_LO));\n// Lowest active lane\nendif\nendif;\nD0.b32 = VGPR[lane][SRC0.u32]", + VOP1Op.V_CVT_I32_F64_E32: 'D0.i32 = f64_to_i32(S0.f64)', + VOP1Op.V_CVT_F64_I32_E32: 'D0.f64 = i32_to_f64(S0.i32)', + VOP1Op.V_CVT_F32_I32_E32: 'D0.f32 = i32_to_f32(S0.i32)', + VOP1Op.V_CVT_F32_U32_E32: 'D0.f32 = u32_to_f32(S0.u32)', + VOP1Op.V_CVT_U32_F32_E32: 'D0.u32 = f32_to_u32(S0.f32)', + VOP1Op.V_CVT_I32_F32_E32: 'D0.i32 = f32_to_i32(S0.f32)', + VOP1Op.V_CVT_F16_F32_E32: 'D0.f16 = f32_to_f16(S0.f32)', + VOP1Op.V_CVT_F32_F16_E32: 'D0.f32 = f16_to_f32(S0.f16)', + VOP1Op.V_CVT_NEAREST_I32_F32_E32: 'D0.i32 = f32_to_i32(floor(S0.f32 + 0.5F))', + VOP1Op.V_CVT_FLOOR_I32_F32_E32: 'D0.i32 = f32_to_i32(floor(S0.f32))', + VOP1Op.V_CVT_OFF_F32_I4_E32: "declare CVT_OFF_TABLE : 32'F[16];\nD0.f32 = CVT_OFF_TABLE[S0.u32[3 : 0]]", + VOP1Op.V_CVT_F32_F64_E32: 'D0.f32 = f64_to_f32(S0.f64)', + VOP1Op.V_CVT_F64_F32_E32: 'D0.f64 = f32_to_f64(S0.f32)', + VOP1Op.V_CVT_F32_UBYTE0_E32: 'D0.f32 = u32_to_f32(S0[7 : 0].u32)', + VOP1Op.V_CVT_F32_UBYTE1_E32: 'D0.f32 = u32_to_f32(S0[15 : 8].u32)', + VOP1Op.V_CVT_F32_UBYTE2_E32: 'D0.f32 = u32_to_f32(S0[23 : 16].u32)', + VOP1Op.V_CVT_F32_UBYTE3_E32: 'D0.f32 = u32_to_f32(S0[31 : 24].u32)', + VOP1Op.V_CVT_U32_F64_E32: 'D0.u32 = f64_to_u32(S0.f64)', + VOP1Op.V_CVT_F64_U32_E32: 'D0.f64 = u32_to_f64(S0.u32)', + VOP1Op.V_TRUNC_F64_E32: 'D0.f64 = trunc(S0.f64)', + VOP1Op.V_CEIL_F64_E32: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 > 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += 1.0\nendif', + VOP1Op.V_RNDNE_F64_E32: 'D0.f64 = floor(S0.f64 + 0.5);\nif (isEven(floor(S0.f64)) && (fract(S0.f64) == 0.5)) then\nD0.f64 -= 1.0\nendif', + VOP1Op.V_FLOOR_F64_E32: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 < 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += -1.0\nendif', + VOP1Op.V_MOV_B16_E32: 'D0.b16 = S0.b16', + VOP1Op.V_FRACT_F32_E32: 'D0.f32 = S0.f32 + -floor(S0.f32)', + VOP1Op.V_TRUNC_F32_E32: 'D0.f32 = trunc(S0.f32)', + VOP1Op.V_CEIL_F32_E32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 > 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += 1.0F\nendif', + VOP1Op.V_RNDNE_F32_E32: "D0.f32 = floor(S0.f32 + 0.5F);\nif (isEven(64'F(floor(S0.f32))) && (fract(S0.f32) == 0.5F)) then\nD0.f32 -= 1.0F\nendif", + VOP1Op.V_FLOOR_F32_E32: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 < 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += -1.0F\nendif', + VOP1Op.V_EXP_F32_E32: 'D0.f32 = pow(2.0F, S0.f32)', + VOP1Op.V_LOG_F32_E32: 'D0.f32 = log2(S0.f32)', + VOP1Op.V_RCP_F32_E32: 'D0.f32 = 1.0F / S0.f32', + VOP1Op.V_RCP_IFLAG_F32_E32: 'D0.f32 = 1.0F / S0.f32;\n// Can only raise integer DIV_BY_ZERO exception', + VOP1Op.V_RSQ_F32_E32: 'D0.f32 = 1.0F / sqrt(S0.f32)', + VOP1Op.V_RCP_F64_E32: 'D0.f64 = 1.0 / S0.f64', + VOP1Op.V_RSQ_F64_E32: 'D0.f64 = 1.0 / sqrt(S0.f64)', + VOP1Op.V_SQRT_F32_E32: 'D0.f32 = sqrt(S0.f32)', + VOP1Op.V_SQRT_F64_E32: 'D0.f64 = sqrt(S0.f64)', + VOP1Op.V_SIN_F32_E32: "D0.f32 = sin(S0.f32 * 32'F(PI * 2.0))", + VOP1Op.V_COS_F32_E32: "D0.f32 = cos(S0.f32 * 32'F(PI * 2.0))", + VOP1Op.V_NOT_B32_E32: 'D0.u32 = ~S0.u32', + VOP1Op.V_BFREV_B32_E32: 'D0.u32[31 : 0] = S0.u32[0 : 31]', + VOP1Op.V_CLZ_I32_U32_E32: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP1Op.V_CTZ_I32_B32_E32: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP1Op.V_CLS_I32_E32: 'D0.i32 = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.i32[31 - i] != S0.i32[31] then\nD0.i32 = i;\nbreak\nendif\nendfor', + VOP1Op.V_FREXP_EXP_I32_F64_E32: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f64) - 1023 + 1\nendif', + VOP1Op.V_FREXP_MANT_F64_E32: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.f64 = S0.f64\nelse\nD0.f64 = mantissa(S0.f64)\nendif', + VOP1Op.V_FRACT_F64_E32: 'D0.f64 = S0.f64 + -floor(S0.f64)', + VOP1Op.V_FREXP_EXP_I32_F32_E32: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f32) - 127 + 1\nendif", + VOP1Op.V_FREXP_MANT_F32_E32: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.f32 = S0.f32\nelse\nD0.f32 = mantissa(S0.f32)\nendif", + VOP1Op.V_MOVRELD_B32_E32: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nVGPR[laneId][addr].b32 = S0.b32', + VOP1Op.V_MOVRELS_B32_E32: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b32 = VGPR[laneId][addr].b32', + VOP1Op.V_MOVRELSD_B32_E32: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[31 : 0];\naddrd += M0.u32[31 : 0];\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32', + VOP1Op.V_MOVRELSD_2_B32_E32: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[9 : 0].u32;\naddrd += M0.u32[25 : 16].u32;\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32', + VOP1Op.V_CVT_F16_U16_E32: 'D0.f16 = u16_to_f16(S0.u16)', + VOP1Op.V_CVT_F16_I16_E32: 'D0.f16 = i16_to_f16(S0.i16)', + VOP1Op.V_CVT_U16_F16_E32: 'D0.u16 = f16_to_u16(S0.f16)', + VOP1Op.V_CVT_I16_F16_E32: 'D0.i16 = f16_to_i16(S0.f16)', + VOP1Op.V_RCP_F16_E32: "D0.f16 = 16'1.0 / S0.f16", + VOP1Op.V_SQRT_F16_E32: 'D0.f16 = sqrt(S0.f16)', + VOP1Op.V_RSQ_F16_E32: "D0.f16 = 16'1.0 / sqrt(S0.f16)", + VOP1Op.V_LOG_F16_E32: 'D0.f16 = log2(S0.f16)', + VOP1Op.V_EXP_F16_E32: "D0.f16 = pow(16'2.0, S0.f16)", + VOP1Op.V_FREXP_MANT_F16_E32: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.f16 = S0.f16\nelse\nD0.f16 = mantissa(S0.f16)\nendif", + VOP1Op.V_FREXP_EXP_I16_F16_E32: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.i16 = 16'0\nelse\nD0.i16 = 16'I(exponent(S0.f16) - 15 + 1)\nendif", + VOP1Op.V_FLOOR_F16_E32: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 < 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += -16'1.0\nendif", + VOP1Op.V_CEIL_F16_E32: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 > 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += 16'1.0\nendif", + VOP1Op.V_TRUNC_F16_E32: 'D0.f16 = trunc(S0.f16)', + VOP1Op.V_RNDNE_F16_E32: "D0.f16 = floor(S0.f16 + 16'0.5);\nif (isEven(64'F(floor(S0.f16))) && (fract(S0.f16) == 16'0.5)) then\nD0.f16 -= 16'1.0\nendif", + VOP1Op.V_FRACT_F16_E32: 'D0.f16 = S0.f16 + -floor(S0.f16)', + VOP1Op.V_SIN_F16_E32: "D0.f16 = sin(S0.f16 * 16'F(PI * 2.0))", + VOP1Op.V_COS_F16_E32: "D0.f16 = cos(S0.f16 * 16'F(PI * 2.0))", + VOP1Op.V_SAT_PK_U8_I16_E32: "SAT8 = lambda(n) (\nif n <= 16'0 then\nreturn 8'0U\nelsif n >= 16'255 then\nreturn 8'255U\nelse\nreturn n[7 : 0].u8\nendif);\ntmp = 16'0;\ntmp[7 : 0].u8 = SAT8(S0[15 : 0].i16);\ntmp[15 : 8].u8 = SAT8(S0[31 : 16].i16);\nD0.b16 = tmp.b16", + VOP1Op.V_CVT_NORM_I16_F16_E32: 'D0.i16 = f16_to_snorm(S0.f16)', + VOP1Op.V_CVT_NORM_U16_F16_E32: 'D0.u16 = f16_to_unorm(S0.f16)', + VOP1Op.V_SWAP_B32_E32: 'tmp = D0.b32;\nD0.b32 = S0.b32;\nS0.b32 = tmp', + VOP1Op.V_SWAP_B16_E32: 'tmp = D0.b16;\nD0.b16 = S0.b16;\nS0.b16 = tmp', + VOP1Op.V_PERMLANE64_B32_E32: "declare tmp : 32'B[64];\ndeclare lane : 32'U;\nif WAVE32 then\n// Supported in wave64 ONLY; treated as scalar NOP in wave32\ns_nop(16'0U)\nelse\nfor lane in 0U : 63U do\n// Copy original S0 in case D==S0\ntmp[lane] = VGPR[lane][SRC0.u32]\nendfor;\nfor lane in 0U : 63U do\naltlane = { ~lane[5], lane[4 : 0] };\n// 0<->32, ..., 31<->63\nif EXEC[lane].u1 then\nVGPR[lane][VDST.u32] = tmp[altlane]\nendif\nendfor\nendif", + VOP1Op.V_SWAPREL_B32_E32: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[9 : 0].u32;\naddrd += M0.u32[25 : 16].u32;\ntmp = VGPR[laneId][addrd].b32;\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32;\nVGPR[laneId][addrs].b32 = tmp', + VOP1Op.V_NOT_B16_E32: 'D0.u16 = ~S0.u16', + VOP1Op.V_CVT_I32_I16_E32: "D0.i32 = 32'I(signext(S0.i16))", + VOP1Op.V_CVT_U32_U16_E32: "D0 = { 16'0, S0.u16 }", + VOP1Op.V_CVT_F32_FP8_E32: "if OPSEL[1 : 0].u2 == 2'0U then\nD0.f32 = fp8_to_f32(VGPR[laneId][SRC0.u32][7 : 0].fp8)\nelsif OPSEL[1 : 0].u2 == 2'2U then\n// Byte select bits are reversed\nD0.f32 = fp8_to_f32(VGPR[laneId][SRC0.u32][15 : 8].fp8)\nelsif OPSEL[1 : 0].u2 == 2'1U then\nD0.f32 = fp8_to_f32(VGPR[laneId][SRC0.u32][23 : 16].fp8)\nelse\nD0.f32 = fp8_to_f32(VGPR[laneId][SRC0.u32][31 : 24].fp8)\nendif", + VOP1Op.V_CVT_F32_BF8_E32: "if OPSEL[1 : 0].u2 == 2'0U then\nD0.f32 = bf8_to_f32(VGPR[laneId][SRC0.u32][7 : 0].bf8)\nelsif OPSEL[1 : 0].u2 == 2'2U then\n// Byte select bits are reversed\nD0.f32 = bf8_to_f32(VGPR[laneId][SRC0.u32][15 : 8].bf8)\nelsif OPSEL[1 : 0].u2 == 2'1U then\nD0.f32 = bf8_to_f32(VGPR[laneId][SRC0.u32][23 : 16].bf8)\nelse\nD0.f32 = bf8_to_f32(VGPR[laneId][SRC0.u32][31 : 24].bf8)\nendif", + VOP1Op.V_CVT_PK_F32_FP8_E32: 'tmp = OPSEL[0].u1 ? VGPR[laneId][SRC0.u32][31 : 16] : VGPR[laneId][SRC0.u32][15 : 0];\nD0[31 : 0].f32 = fp8_to_f32(tmp[7 : 0].fp8);\nD0[63 : 32].f32 = fp8_to_f32(tmp[15 : 8].fp8)', + VOP1Op.V_CVT_PK_F32_BF8_E32: 'tmp = OPSEL[0].u1 ? VGPR[laneId][SRC0.u32][31 : 16] : VGPR[laneId][SRC0.u32][15 : 0];\nD0[31 : 0].f32 = bf8_to_f32(tmp[7 : 0].bf8);\nD0[63 : 32].f32 = bf8_to_f32(tmp[15 : 8].bf8)', + VOP2Op.V_CNDMASK_B32_E32: 'D0.u32 = VCC.u64[laneId] ? S1.u32 : S0.u32', + VOP2Op.V_ADD_F64_E32: 'D0.f64 = S0.f64 + S1.f64', + VOP2Op.V_ADD_F32_E32: 'D0.f32 = S0.f32 + S1.f32', + VOP2Op.V_SUB_F32_E32: 'D0.f32 = S0.f32 - S1.f32', + VOP2Op.V_SUBREV_F32_E32: 'D0.f32 = S1.f32 - S0.f32', + VOP2Op.V_MUL_F64_E32: 'D0.f64 = S0.f64 * S1.f64', + VOP2Op.V_MUL_DX9_ZERO_F32_E32: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = 0.0F\nelse\nD0.f32 = S0.f32 * S1.f32\nendif", + VOP2Op.V_MUL_F32_E32: 'D0.f32 = S0.f32 * S1.f32', + VOP2Op.V_MUL_I32_I24_E32: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24)", + VOP2Op.V_MUL_HI_I32_I24_E32: "D0.i32 = 32'I((64'I(S0.i24) * 64'I(S1.i24)) >> 32U)", + VOP2Op.V_MUL_U32_U24_E32: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24)", + VOP2Op.V_MUL_HI_U32_U24_E32: "D0.u32 = 32'U((64'U(S0.u24) * 64'U(S1.u24)) >> 32U)", + VOP2Op.V_MIN_NUM_F64_E32: 'if (isSignalNAN(S0.f64) || isSignalNAN(S1.f64)) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(S0.f64) && isNAN(S1.f64)) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif isNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif isNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif ((S0.f64 < S1.f64) || ((abs(S0.f64) == 0.0) && (abs(S1.f64) == 0.0) && sign(S0.f64) &&\n!sign(S1.f64))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif', + VOP2Op.V_MAX_NUM_F64_E32: 'if (isSignalNAN(S0.f64) || isSignalNAN(S1.f64)) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(S0.f64) && isNAN(S1.f64)) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif isNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif isNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif ((S0.f64 > S1.f64) || ((abs(S0.f64) == 0.0) && (abs(S1.f64) == 0.0) && !sign(S0.f64) &&\nsign(S1.f64))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif', + VOP2Op.V_MIN_I32_E32: 'D0.i32 = S0.i32 < S1.i32 ? S0.i32 : S1.i32', + VOP2Op.V_MAX_I32_E32: 'D0.i32 = S0.i32 >= S1.i32 ? S0.i32 : S1.i32', + VOP2Op.V_MIN_U32_E32: 'D0.u32 = S0.u32 < S1.u32 ? S0.u32 : S1.u32', + VOP2Op.V_MAX_U32_E32: 'D0.u32 = S0.u32 >= S1.u32 ? S0.u32 : S1.u32', + VOP2Op.V_MIN_NUM_F32_E32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f32)) && isNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((S0.f32 < S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && sign(S0.f32) &&\n!sign(S1.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + VOP2Op.V_MAX_NUM_F32_E32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f32)) && isNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((S0.f32 > S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && !sign(S0.f32) &&\nsign(S1.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + VOP2Op.V_LSHLREV_B32_E32: 'D0.u32 = (S1.u32 << S0[4 : 0].u32)', + VOP2Op.V_LSHRREV_B32_E32: 'D0.u32 = (S1.u32 >> S0[4 : 0].u32)', + VOP2Op.V_ASHRREV_I32_E32: 'D0.i32 = (S1.i32 >> S0[4 : 0].u32)', + VOP2Op.V_AND_B32_E32: 'D0.u32 = (S0.u32 & S1.u32)', + VOP2Op.V_OR_B32_E32: 'D0.u32 = (S0.u32 | S1.u32)', + VOP2Op.V_XOR_B32_E32: 'D0.u32 = (S0.u32 ^ S1.u32)', + VOP2Op.V_XNOR_B32_E32: 'D0.u32 = ~(S0.u32 ^ S1.u32)', + VOP2Op.V_LSHLREV_B64_E32: 'D0.u64 = (S1.u64 << S0[5 : 0].u32)', + VOP2Op.V_ADD_CO_CI_U32_E32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + VCC.u64[laneId].u64;\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADD_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_SUB_CO_CI_U32_E32: "tmp = S0.u32 - S1.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S1.u32) + VCC.u64[laneId].u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_SUBREV_CO_CI_U32_E32: "tmp = S1.u32 - S0.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S0.u32) + VCC.u64[laneId].u64 > 64'U(S1.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP2Op.V_ADD_NC_U32_E32: 'D0.u32 = S0.u32 + S1.u32', + VOP2Op.V_SUB_NC_U32_E32: 'D0.u32 = S0.u32 - S1.u32', + VOP2Op.V_SUBREV_NC_U32_E32: 'D0.u32 = S1.u32 - S0.u32', + VOP2Op.V_FMAC_F32_E32: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + VOP2Op.V_FMAMK_F32_E32: 'D0.f32 = fma(S0.f32, SIMM32.f32, S1.f32)', + VOP2Op.V_FMAAK_F32_E32: 'D0.f32 = fma(S0.f32, S1.f32, SIMM32.f32)', + VOP2Op.V_CVT_PK_RTZ_F16_F32_E32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_TOWARD_ZERO;\ntmp[15 : 0].f16 = f32_to_f16(S0.f32);\ntmp[31 : 16].f16 = f32_to_f16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode;\n// Round-toward-zero regardless of current round mode setting in hardware.', + VOP2Op.V_MIN_NUM_F16_E32: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f16)) && isNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((S0.f16 < S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && sign(S0.f16) &&\n!sign(S1.f16))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + VOP2Op.V_MAX_NUM_F16_E32: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f16)) && isNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((S0.f16 > S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && !sign(S0.f16) &&\nsign(S1.f16))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + VOP2Op.V_ADD_F16_E32: 'D0.f16 = S0.f16 + S1.f16', + VOP2Op.V_SUB_F16_E32: 'D0.f16 = S0.f16 - S1.f16', + VOP2Op.V_SUBREV_F16_E32: 'D0.f16 = S1.f16 - S0.f16', + VOP2Op.V_MUL_F16_E32: 'D0.f16 = S0.f16 * S1.f16', + VOP2Op.V_FMAC_F16_E32: 'D0.f16 = fma(S0.f16, S1.f16, D0.f16)', + VOP2Op.V_FMAMK_F16_E32: 'D0.f16 = fma(S0.f16, SIMM32.f16, S1.f16)', + VOP2Op.V_FMAAK_F16_E32: 'D0.f16 = fma(S0.f16, S1.f16, SIMM32.f16)', + VOP2Op.V_LDEXP_F16_E32: "D0.f16 = S0.f16 * 16'F(2.0F ** 32'I(S1.i16))", + VOP2Op.V_PK_FMAC_F16_E32: 'D0[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, D0[31 : 16].f16);\nD0[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, D0[15 : 0].f16)', + VOP3Op.V_CMP_LT_F16_E64: 'D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F16_E64: 'D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F16_E64: 'D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F16_E64: 'D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F16_E64: 'D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F16_E64: 'D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F16_E64: "D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_U_F16_E64: "D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_NGE_F16_E64: 'D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F16_E64: 'D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F16_E64: 'D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F16_E64: 'D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F16_E64: 'D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F16_E64: 'D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_F32_E64: 'D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F32_E64: 'D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F32_E64: 'D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F32_E64: 'D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F32_E64: 'D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F32_E64: 'D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F32_E64: "D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_U_F32_E64: "D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_NGE_F32_E64: 'D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F32_E64: 'D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F32_E64: 'D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F32_E64: 'D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F32_E64: 'D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F32_E64: 'D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_F64_E64: 'D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_F64_E64: 'D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_F64_E64: 'D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_F64_E64: 'D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LG_F64_E64: 'D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_F64_E64: 'D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_O_F64_E64: 'D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_U_F64_E64: 'D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGE_F64_E64: 'D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLG_F64_E64: 'D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NGT_F64_E64: 'D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLE_F64_E64: 'D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NEQ_F64_E64: 'D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NLT_F64_E64: 'D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_I16_E64: 'D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I16_E64: 'D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I16_E64: 'D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I16_E64: 'D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I16_E64: 'D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I16_E64: 'D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_U16_E64: 'D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U16_E64: 'D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U16_E64: 'D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U16_E64: 'D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U16_E64: 'D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U16_E64: 'D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_I32_E64: 'D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I32_E64: 'D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I32_E64: 'D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I32_E64: 'D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I32_E64: 'D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I32_E64: 'D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_U32_E64: 'D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U32_E64: 'D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U32_E64: 'D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U32_E64: 'D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U32_E64: 'D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U32_E64: 'D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_I64_E64: 'D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_I64_E64: 'D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_I64_E64: 'D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_I64_E64: 'D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_I64_E64: 'D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_I64_E64: 'D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LT_U64_E64: 'D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_EQ_U64_E64: 'D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_LE_U64_E64: 'D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GT_U64_E64: 'D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_NE_U64_E64: 'D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_GE_U64_E64: 'D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOP3Op.V_CMP_CLASS_F16_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_CLASS_F32_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMP_CLASS_F64_E64: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOP3Op.V_CMPX_LT_F16_E64: 'EXEC.u64[laneId] = S0.f16 < S1.f16', + VOP3Op.V_CMPX_EQ_F16_E64: 'EXEC.u64[laneId] = S0.f16 == S1.f16', + VOP3Op.V_CMPX_LE_F16_E64: 'EXEC.u64[laneId] = S0.f16 <= S1.f16', + VOP3Op.V_CMPX_GT_F16_E64: 'EXEC.u64[laneId] = S0.f16 > S1.f16', + VOP3Op.V_CMPX_LG_F16_E64: 'EXEC.u64[laneId] = S0.f16 <> S1.f16', + VOP3Op.V_CMPX_GE_F16_E64: 'EXEC.u64[laneId] = S0.f16 >= S1.f16', + VOP3Op.V_CMPX_O_F16_E64: "EXEC.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)))", + VOP3Op.V_CMPX_U_F16_E64: "EXEC.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)))", + VOP3Op.V_CMPX_NGE_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <', + VOP3Op.V_CMPX_NLG_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==', + VOP3Op.V_CMPX_NGT_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=', + VOP3Op.V_CMPX_NLE_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >', + VOP3Op.V_CMPX_NEQ_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=', + VOP3Op.V_CMPX_NLT_F16_E64: 'EXEC.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=', + VOP3Op.V_CMPX_LT_F32_E64: 'EXEC.u64[laneId] = S0.f32 < S1.f32', + VOP3Op.V_CMPX_EQ_F32_E64: 'EXEC.u64[laneId] = S0.f32 == S1.f32', + VOP3Op.V_CMPX_LE_F32_E64: 'EXEC.u64[laneId] = S0.f32 <= S1.f32', + VOP3Op.V_CMPX_GT_F32_E64: 'EXEC.u64[laneId] = S0.f32 > S1.f32', + VOP3Op.V_CMPX_LG_F32_E64: 'EXEC.u64[laneId] = S0.f32 <> S1.f32', + VOP3Op.V_CMPX_GE_F32_E64: 'EXEC.u64[laneId] = S0.f32 >= S1.f32', + VOP3Op.V_CMPX_O_F32_E64: "EXEC.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)))", + VOP3Op.V_CMPX_U_F32_E64: "EXEC.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)))", + VOP3Op.V_CMPX_NGE_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <', + VOP3Op.V_CMPX_NLG_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==', + VOP3Op.V_CMPX_NGT_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=', + VOP3Op.V_CMPX_NLE_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >', + VOP3Op.V_CMPX_NEQ_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=', + VOP3Op.V_CMPX_NLT_F32_E64: 'EXEC.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=', + VOP3Op.V_CMPX_LT_F64_E64: 'EXEC.u64[laneId] = S0.f64 < S1.f64', + VOP3Op.V_CMPX_EQ_F64_E64: 'EXEC.u64[laneId] = S0.f64 == S1.f64', + VOP3Op.V_CMPX_LE_F64_E64: 'EXEC.u64[laneId] = S0.f64 <= S1.f64', + VOP3Op.V_CMPX_GT_F64_E64: 'EXEC.u64[laneId] = S0.f64 > S1.f64', + VOP3Op.V_CMPX_LG_F64_E64: 'EXEC.u64[laneId] = S0.f64 <> S1.f64', + VOP3Op.V_CMPX_GE_F64_E64: 'EXEC.u64[laneId] = S0.f64 >= S1.f64', + VOP3Op.V_CMPX_O_F64_E64: 'EXEC.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64))', + VOP3Op.V_CMPX_U_F64_E64: 'EXEC.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64))', + VOP3Op.V_CMPX_NGE_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <', + VOP3Op.V_CMPX_NLG_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==', + VOP3Op.V_CMPX_NGT_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=', + VOP3Op.V_CMPX_NLE_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >', + VOP3Op.V_CMPX_NEQ_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=', + VOP3Op.V_CMPX_NLT_F64_E64: 'EXEC.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=', + VOP3Op.V_CMPX_LT_I16_E64: 'EXEC.u64[laneId] = S0.i16 < S1.i16', + VOP3Op.V_CMPX_EQ_I16_E64: 'EXEC.u64[laneId] = S0.i16 == S1.i16', + VOP3Op.V_CMPX_LE_I16_E64: 'EXEC.u64[laneId] = S0.i16 <= S1.i16', + VOP3Op.V_CMPX_GT_I16_E64: 'EXEC.u64[laneId] = S0.i16 > S1.i16', + VOP3Op.V_CMPX_NE_I16_E64: 'EXEC.u64[laneId] = S0.i16 <> S1.i16', + VOP3Op.V_CMPX_GE_I16_E64: 'EXEC.u64[laneId] = S0.i16 >= S1.i16', + VOP3Op.V_CMPX_LT_U16_E64: 'EXEC.u64[laneId] = S0.u16 < S1.u16', + VOP3Op.V_CMPX_EQ_U16_E64: 'EXEC.u64[laneId] = S0.u16 == S1.u16', + VOP3Op.V_CMPX_LE_U16_E64: 'EXEC.u64[laneId] = S0.u16 <= S1.u16', + VOP3Op.V_CMPX_GT_U16_E64: 'EXEC.u64[laneId] = S0.u16 > S1.u16', + VOP3Op.V_CMPX_NE_U16_E64: 'EXEC.u64[laneId] = S0.u16 <> S1.u16', + VOP3Op.V_CMPX_GE_U16_E64: 'EXEC.u64[laneId] = S0.u16 >= S1.u16', + VOP3Op.V_CMPX_LT_I32_E64: 'EXEC.u64[laneId] = S0.i32 < S1.i32', + VOP3Op.V_CMPX_EQ_I32_E64: 'EXEC.u64[laneId] = S0.i32 == S1.i32', + VOP3Op.V_CMPX_LE_I32_E64: 'EXEC.u64[laneId] = S0.i32 <= S1.i32', + VOP3Op.V_CMPX_GT_I32_E64: 'EXEC.u64[laneId] = S0.i32 > S1.i32', + VOP3Op.V_CMPX_NE_I32_E64: 'EXEC.u64[laneId] = S0.i32 <> S1.i32', + VOP3Op.V_CMPX_GE_I32_E64: 'EXEC.u64[laneId] = S0.i32 >= S1.i32', + VOP3Op.V_CMPX_LT_U32_E64: 'EXEC.u64[laneId] = S0.u32 < S1.u32', + VOP3Op.V_CMPX_EQ_U32_E64: 'EXEC.u64[laneId] = S0.u32 == S1.u32', + VOP3Op.V_CMPX_LE_U32_E64: 'EXEC.u64[laneId] = S0.u32 <= S1.u32', + VOP3Op.V_CMPX_GT_U32_E64: 'EXEC.u64[laneId] = S0.u32 > S1.u32', + VOP3Op.V_CMPX_NE_U32_E64: 'EXEC.u64[laneId] = S0.u32 <> S1.u32', + VOP3Op.V_CMPX_GE_U32_E64: 'EXEC.u64[laneId] = S0.u32 >= S1.u32', + VOP3Op.V_CMPX_LT_I64_E64: 'EXEC.u64[laneId] = S0.i64 < S1.i64', + VOP3Op.V_CMPX_EQ_I64_E64: 'EXEC.u64[laneId] = S0.i64 == S1.i64', + VOP3Op.V_CMPX_LE_I64_E64: 'EXEC.u64[laneId] = S0.i64 <= S1.i64', + VOP3Op.V_CMPX_GT_I64_E64: 'EXEC.u64[laneId] = S0.i64 > S1.i64', + VOP3Op.V_CMPX_NE_I64_E64: 'EXEC.u64[laneId] = S0.i64 <> S1.i64', + VOP3Op.V_CMPX_GE_I64_E64: 'EXEC.u64[laneId] = S0.i64 >= S1.i64', + VOP3Op.V_CMPX_LT_U64_E64: 'EXEC.u64[laneId] = S0.u64 < S1.u64', + VOP3Op.V_CMPX_EQ_U64_E64: 'EXEC.u64[laneId] = S0.u64 == S1.u64', + VOP3Op.V_CMPX_LE_U64_E64: 'EXEC.u64[laneId] = S0.u64 <= S1.u64', + VOP3Op.V_CMPX_GT_U64_E64: 'EXEC.u64[laneId] = S0.u64 > S1.u64', + VOP3Op.V_CMPX_NE_U64_E64: 'EXEC.u64[laneId] = S0.u64 <> S1.u64', + VOP3Op.V_CMPX_GE_U64_E64: 'EXEC.u64[laneId] = S0.u64 >= S1.u64', + VOP3Op.V_CMPX_CLASS_F16_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOP3Op.V_CMPX_CLASS_F32_E64: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOP3Op.V_CMPX_CLASS_F64_E64: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOP3Op.V_CNDMASK_B32_E64: 'D0.u32 = VCC.u64[laneId] ? S1.u32 : S0.u32', + VOP3Op.V_ADD_F64_E64: 'D0.f64 = S0.f64 + S1.f64', + VOP3Op.V_ADD_F32_E64: 'D0.f32 = S0.f32 + S1.f32', + VOP3Op.V_SUB_F32_E64: 'D0.f32 = S0.f32 - S1.f32', + VOP3Op.V_SUBREV_F32_E64: 'D0.f32 = S1.f32 - S0.f32', + VOP3Op.V_MUL_F64_E64: 'D0.f64 = S0.f64 * S1.f64', + VOP3Op.V_MUL_DX9_ZERO_F32_E64: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = 0.0F\nelse\nD0.f32 = S0.f32 * S1.f32\nendif", + VOP3Op.V_MUL_F32_E64: 'D0.f32 = S0.f32 * S1.f32', + VOP3Op.V_MUL_I32_I24_E64: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24)", + VOP3Op.V_MUL_HI_I32_I24_E64: "D0.i32 = 32'I((64'I(S0.i24) * 64'I(S1.i24)) >> 32U)", + VOP3Op.V_MUL_U32_U24_E64: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24)", + VOP3Op.V_MUL_HI_U32_U24_E64: "D0.u32 = 32'U((64'U(S0.u24) * 64'U(S1.u24)) >> 32U)", + VOP3Op.V_MIN_NUM_F64_E64: 'if (isSignalNAN(S0.f64) || isSignalNAN(S1.f64)) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(S0.f64) && isNAN(S1.f64)) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif isNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif isNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif ((S0.f64 < S1.f64) || ((abs(S0.f64) == 0.0) && (abs(S1.f64) == 0.0) && sign(S0.f64) &&\n!sign(S1.f64))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif', + VOP3Op.V_MAX_NUM_F64_E64: 'if (isSignalNAN(S0.f64) || isSignalNAN(S1.f64)) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(S0.f64) && isNAN(S1.f64)) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif isNAN(S0.f64) then\nD0.f64 = S1.f64\nelsif isNAN(S1.f64) then\nD0.f64 = S0.f64\nelsif ((S0.f64 > S1.f64) || ((abs(S0.f64) == 0.0) && (abs(S1.f64) == 0.0) && !sign(S0.f64) &&\nsign(S1.f64))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif', + VOP3Op.V_MIN_I32_E64: 'D0.i32 = S0.i32 < S1.i32 ? S0.i32 : S1.i32', + VOP3Op.V_MAX_I32_E64: 'D0.i32 = S0.i32 >= S1.i32 ? S0.i32 : S1.i32', + VOP3Op.V_MIN_U32_E64: 'D0.u32 = S0.u32 < S1.u32 ? S0.u32 : S1.u32', + VOP3Op.V_MAX_U32_E64: 'D0.u32 = S0.u32 >= S1.u32 ? S0.u32 : S1.u32', + VOP3Op.V_MIN_NUM_F32_E64: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f32)) && isNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((S0.f32 < S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && sign(S0.f32) &&\n!sign(S1.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + VOP3Op.V_MAX_NUM_F32_E64: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f32)) && isNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((S0.f32 > S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && !sign(S0.f32) &&\nsign(S1.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + VOP3Op.V_LSHLREV_B32_E64: 'D0.u32 = (S1.u32 << S0[4 : 0].u32)', + VOP3Op.V_LSHRREV_B32_E64: 'D0.u32 = (S1.u32 >> S0[4 : 0].u32)', + VOP3Op.V_ASHRREV_I32_E64: 'D0.i32 = (S1.i32 >> S0[4 : 0].u32)', + VOP3Op.V_AND_B32_E64: 'D0.u32 = (S0.u32 & S1.u32)', + VOP3Op.V_OR_B32_E64: 'D0.u32 = (S0.u32 | S1.u32)', + VOP3Op.V_XOR_B32_E64: 'D0.u32 = (S0.u32 ^ S1.u32)', + VOP3Op.V_XNOR_B32_E64: 'D0.u32 = ~(S0.u32 ^ S1.u32)', + VOP3Op.V_LSHLREV_B64_E64: 'D0.u64 = (S1.u64 << S0[5 : 0].u32)', + VOP3Op.V_ADD_NC_U32_E64: 'D0.u32 = S0.u32 + S1.u32', + VOP3Op.V_SUB_NC_U32_E64: 'D0.u32 = S0.u32 - S1.u32', + VOP3Op.V_SUBREV_NC_U32_E64: 'D0.u32 = S1.u32 - S0.u32', + VOP3Op.V_FMAC_F32_E64: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + VOP3Op.V_CVT_PK_RTZ_F16_F32_E64: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_TOWARD_ZERO;\ntmp[15 : 0].f16 = f32_to_f16(S0.f32);\ntmp[31 : 16].f16 = f32_to_f16(S1.f32);\nD0 = tmp.b32;\nROUND_MODE = prev_mode;\n// Round-toward-zero regardless of current round mode setting in hardware.', + VOP3Op.V_MIN_NUM_F16_E64: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f16)) && isNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((S0.f16 < S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && sign(S0.f16) &&\n!sign(S1.f16))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + VOP3Op.V_MAX_NUM_F16_E64: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f16)) && isNAN(64'F(S1.f16))) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isNAN(64'F(S0.f16)) then\nD0.f16 = S1.f16\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = S0.f16\nelsif ((S0.f16 > S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && !sign(S0.f16) &&\nsign(S1.f16))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + VOP3Op.V_ADD_F16_E64: 'D0.f16 = S0.f16 + S1.f16', + VOP3Op.V_SUB_F16_E64: 'D0.f16 = S0.f16 - S1.f16', + VOP3Op.V_SUBREV_F16_E64: 'D0.f16 = S1.f16 - S0.f16', + VOP3Op.V_MUL_F16_E64: 'D0.f16 = S0.f16 * S1.f16', + VOP3Op.V_FMAC_F16_E64: 'D0.f16 = fma(S0.f16, S1.f16, D0.f16)', + VOP3Op.V_LDEXP_F16_E64: "D0.f16 = S0.f16 * 16'F(2.0F ** 32'I(S1.i16))", + VOP3Op.V_MOV_B32_E64: 'D0.b32 = S0.b32', + VOP3Op.V_READFIRSTLANE_B32_E64: "declare lane : 32'U;\nif WAVE64 then\n// 64 lanes\nif EXEC == 0x0LL then\nlane = 0U;\n// Force lane 0 if all lanes are disabled\nelse\nlane = 32'U(s_ff1_i32_b64(EXEC));\n// Lowest active lane\nendif\nelse\n// 32 lanes\nif EXEC_LO.i32 == 0 then\nlane = 0U;\n// Force lane 0 if all lanes are disabled\nelse\nlane = 32'U(s_ff1_i32_b32(EXEC_LO));\n// Lowest active lane\nendif\nendif;\nD0.b32 = VGPR[lane][SRC0.u32]", + VOP3Op.V_CVT_I32_F64_E64: 'D0.i32 = f64_to_i32(S0.f64)', + VOP3Op.V_CVT_F64_I32_E64: 'D0.f64 = i32_to_f64(S0.i32)', + VOP3Op.V_CVT_F32_I32_E64: 'D0.f32 = i32_to_f32(S0.i32)', + VOP3Op.V_CVT_F32_U32_E64: 'D0.f32 = u32_to_f32(S0.u32)', + VOP3Op.V_CVT_U32_F32_E64: 'D0.u32 = f32_to_u32(S0.f32)', + VOP3Op.V_CVT_I32_F32_E64: 'D0.i32 = f32_to_i32(S0.f32)', + VOP3Op.V_CVT_F16_F32_E64: 'D0.f16 = f32_to_f16(S0.f32)', + VOP3Op.V_CVT_F32_F16_E64: 'D0.f32 = f16_to_f32(S0.f16)', + VOP3Op.V_CVT_NEAREST_I32_F32_E64: 'D0.i32 = f32_to_i32(floor(S0.f32 + 0.5F))', + VOP3Op.V_CVT_FLOOR_I32_F32_E64: 'D0.i32 = f32_to_i32(floor(S0.f32))', + VOP3Op.V_CVT_OFF_F32_I4_E64: "declare CVT_OFF_TABLE : 32'F[16];\nD0.f32 = CVT_OFF_TABLE[S0.u32[3 : 0]]", + VOP3Op.V_CVT_F32_F64_E64: 'D0.f32 = f64_to_f32(S0.f64)', + VOP3Op.V_CVT_F64_F32_E64: 'D0.f64 = f32_to_f64(S0.f32)', + VOP3Op.V_CVT_F32_UBYTE0_E64: 'D0.f32 = u32_to_f32(S0[7 : 0].u32)', + VOP3Op.V_CVT_F32_UBYTE1_E64: 'D0.f32 = u32_to_f32(S0[15 : 8].u32)', + VOP3Op.V_CVT_F32_UBYTE2_E64: 'D0.f32 = u32_to_f32(S0[23 : 16].u32)', + VOP3Op.V_CVT_F32_UBYTE3_E64: 'D0.f32 = u32_to_f32(S0[31 : 24].u32)', + VOP3Op.V_CVT_U32_F64_E64: 'D0.u32 = f64_to_u32(S0.f64)', + VOP3Op.V_CVT_F64_U32_E64: 'D0.f64 = u32_to_f64(S0.u32)', + VOP3Op.V_TRUNC_F64_E64: 'D0.f64 = trunc(S0.f64)', + VOP3Op.V_CEIL_F64_E64: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 > 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += 1.0\nendif', + VOP3Op.V_RNDNE_F64_E64: 'D0.f64 = floor(S0.f64 + 0.5);\nif (isEven(floor(S0.f64)) && (fract(S0.f64) == 0.5)) then\nD0.f64 -= 1.0\nendif', + VOP3Op.V_FLOOR_F64_E64: 'D0.f64 = trunc(S0.f64);\nif ((S0.f64 < 0.0) && (S0.f64 != D0.f64)) then\nD0.f64 += -1.0\nendif', + VOP3Op.V_MOV_B16_E64: 'D0.b16 = S0.b16', + VOP3Op.V_FRACT_F32_E64: 'D0.f32 = S0.f32 + -floor(S0.f32)', + VOP3Op.V_TRUNC_F32_E64: 'D0.f32 = trunc(S0.f32)', + VOP3Op.V_CEIL_F32_E64: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 > 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += 1.0F\nendif', + VOP3Op.V_RNDNE_F32_E64: "D0.f32 = floor(S0.f32 + 0.5F);\nif (isEven(64'F(floor(S0.f32))) && (fract(S0.f32) == 0.5F)) then\nD0.f32 -= 1.0F\nendif", + VOP3Op.V_FLOOR_F32_E64: 'D0.f32 = trunc(S0.f32);\nif ((S0.f32 < 0.0F) && (S0.f32 != D0.f32)) then\nD0.f32 += -1.0F\nendif', + VOP3Op.V_EXP_F32_E64: 'D0.f32 = pow(2.0F, S0.f32)', + VOP3Op.V_LOG_F32_E64: 'D0.f32 = log2(S0.f32)', + VOP3Op.V_RCP_F32_E64: 'D0.f32 = 1.0F / S0.f32', + VOP3Op.V_RCP_IFLAG_F32_E64: 'D0.f32 = 1.0F / S0.f32;\n// Can only raise integer DIV_BY_ZERO exception', + VOP3Op.V_RSQ_F32_E64: 'D0.f32 = 1.0F / sqrt(S0.f32)', + VOP3Op.V_RCP_F64_E64: 'D0.f64 = 1.0 / S0.f64', + VOP3Op.V_RSQ_F64_E64: 'D0.f64 = 1.0 / sqrt(S0.f64)', + VOP3Op.V_SQRT_F32_E64: 'D0.f32 = sqrt(S0.f32)', + VOP3Op.V_SQRT_F64_E64: 'D0.f64 = sqrt(S0.f64)', + VOP3Op.V_SIN_F32_E64: "D0.f32 = sin(S0.f32 * 32'F(PI * 2.0))", + VOP3Op.V_COS_F32_E64: "D0.f32 = cos(S0.f32 * 32'F(PI * 2.0))", + VOP3Op.V_NOT_B32_E64: 'D0.u32 = ~S0.u32', + VOP3Op.V_BFREV_B32_E64: 'D0.u32[31 : 0] = S0.u32[0 : 31]', + VOP3Op.V_CLZ_I32_U32_E64: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from MSB\nif S0.u32[31 - i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP3Op.V_CTZ_I32_B32_E64: "D0.i32 = -1;\n// Set if no ones are found\nfor i in 0 : 31 do\n// Search from LSB\nif S0.u32[i] == 1'1U then\nD0.i32 = i;\nbreak\nendif\nendfor", + VOP3Op.V_CLS_I32_E64: 'D0.i32 = -1;\n// Set if all bits are the same\nfor i in 1 : 31 do\n// Search from MSB\nif S0.i32[31 - i] != S0.i32[31] then\nD0.i32 = i;\nbreak\nendif\nendfor', + VOP3Op.V_FREXP_EXP_I32_F64_E64: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f64) - 1023 + 1\nendif', + VOP3Op.V_FREXP_MANT_F64_E64: 'if ((S0.f64 == +INF) || (S0.f64 == -INF) || isNAN(S0.f64)) then\nD0.f64 = S0.f64\nelse\nD0.f64 = mantissa(S0.f64)\nendif', + VOP3Op.V_FRACT_F64_E64: 'D0.f64 = S0.f64 + -floor(S0.f64)', + VOP3Op.V_FREXP_EXP_I32_F32_E64: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.i32 = 0\nelse\nD0.i32 = exponent(S0.f32) - 127 + 1\nendif", + VOP3Op.V_FREXP_MANT_F32_E64: "if ((64'F(S0.f32) == +INF) || (64'F(S0.f32) == -INF) || isNAN(64'F(S0.f32))) then\nD0.f32 = S0.f32\nelse\nD0.f32 = mantissa(S0.f32)\nendif", + VOP3Op.V_MOVRELD_B32_E64: 'addr = DST.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nVGPR[laneId][addr].b32 = S0.b32', + VOP3Op.V_MOVRELS_B32_E64: 'addr = SRC0.u32;\n// Raw value from instruction\naddr += M0.u32[31 : 0];\nD0.b32 = VGPR[laneId][addr].b32', + VOP3Op.V_MOVRELSD_B32_E64: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[31 : 0];\naddrd += M0.u32[31 : 0];\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32', + VOP3Op.V_MOVRELSD_2_B32_E64: 'addrs = SRC0.u32;\n// Raw value from instruction\naddrd = DST.u32;\n// Raw value from instruction\naddrs += M0.u32[9 : 0].u32;\naddrd += M0.u32[25 : 16].u32;\nVGPR[laneId][addrd].b32 = VGPR[laneId][addrs].b32', + VOP3Op.V_CVT_F16_U16_E64: 'D0.f16 = u16_to_f16(S0.u16)', + VOP3Op.V_CVT_F16_I16_E64: 'D0.f16 = i16_to_f16(S0.i16)', + VOP3Op.V_CVT_U16_F16_E64: 'D0.u16 = f16_to_u16(S0.f16)', + VOP3Op.V_CVT_I16_F16_E64: 'D0.i16 = f16_to_i16(S0.f16)', + VOP3Op.V_RCP_F16_E64: "D0.f16 = 16'1.0 / S0.f16", + VOP3Op.V_SQRT_F16_E64: 'D0.f16 = sqrt(S0.f16)', + VOP3Op.V_RSQ_F16_E64: "D0.f16 = 16'1.0 / sqrt(S0.f16)", + VOP3Op.V_LOG_F16_E64: 'D0.f16 = log2(S0.f16)', + VOP3Op.V_EXP_F16_E64: "D0.f16 = pow(16'2.0, S0.f16)", + VOP3Op.V_FREXP_MANT_F16_E64: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.f16 = S0.f16\nelse\nD0.f16 = mantissa(S0.f16)\nendif", + VOP3Op.V_FREXP_EXP_I16_F16_E64: "if ((64'F(S0.f16) == +INF) || (64'F(S0.f16) == -INF) || isNAN(64'F(S0.f16))) then\nD0.i16 = 16'0\nelse\nD0.i16 = 16'I(exponent(S0.f16) - 15 + 1)\nendif", + VOP3Op.V_FLOOR_F16_E64: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 < 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += -16'1.0\nendif", + VOP3Op.V_CEIL_F16_E64: "D0.f16 = trunc(S0.f16);\nif ((S0.f16 > 16'0.0) && (S0.f16 != D0.f16)) then\nD0.f16 += 16'1.0\nendif", + VOP3Op.V_TRUNC_F16_E64: 'D0.f16 = trunc(S0.f16)', + VOP3Op.V_RNDNE_F16_E64: "D0.f16 = floor(S0.f16 + 16'0.5);\nif (isEven(64'F(floor(S0.f16))) && (fract(S0.f16) == 16'0.5)) then\nD0.f16 -= 16'1.0\nendif", + VOP3Op.V_FRACT_F16_E64: 'D0.f16 = S0.f16 + -floor(S0.f16)', + VOP3Op.V_SIN_F16_E64: "D0.f16 = sin(S0.f16 * 16'F(PI * 2.0))", + VOP3Op.V_COS_F16_E64: "D0.f16 = cos(S0.f16 * 16'F(PI * 2.0))", + VOP3Op.V_SAT_PK_U8_I16_E64: "SAT8 = lambda(n) (\nif n <= 16'0 then\nreturn 8'0U\nelsif n >= 16'255 then\nreturn 8'255U\nelse\nreturn n[7 : 0].u8\nendif);\ntmp = 16'0;\ntmp[7 : 0].u8 = SAT8(S0[15 : 0].i16);\ntmp[15 : 8].u8 = SAT8(S0[31 : 16].i16);\nD0.b16 = tmp.b16", + VOP3Op.V_CVT_NORM_I16_F16_E64: 'D0.i16 = f16_to_snorm(S0.f16)', + VOP3Op.V_CVT_NORM_U16_F16_E64: 'D0.u16 = f16_to_unorm(S0.f16)', + VOP3Op.V_NOT_B16_E64: 'D0.u16 = ~S0.u16', + VOP3Op.V_CVT_I32_I16_E64: "D0.i32 = 32'I(signext(S0.i16))", + VOP3Op.V_CVT_U32_U16_E64: "D0 = { 16'0, S0.u16 }", + VOP3Op.V_CVT_F32_FP8_E64: "if OPSEL[1 : 0].u2 == 2'0U then\nD0.f32 = fp8_to_f32(VGPR[laneId][SRC0.u32][7 : 0].fp8)\nelsif OPSEL[1 : 0].u2 == 2'2U then\n// Byte select bits are reversed\nD0.f32 = fp8_to_f32(VGPR[laneId][SRC0.u32][15 : 8].fp8)\nelsif OPSEL[1 : 0].u2 == 2'1U then\nD0.f32 = fp8_to_f32(VGPR[laneId][SRC0.u32][23 : 16].fp8)\nelse\nD0.f32 = fp8_to_f32(VGPR[laneId][SRC0.u32][31 : 24].fp8)\nendif", + VOP3Op.V_CVT_F32_BF8_E64: "if OPSEL[1 : 0].u2 == 2'0U then\nD0.f32 = bf8_to_f32(VGPR[laneId][SRC0.u32][7 : 0].bf8)\nelsif OPSEL[1 : 0].u2 == 2'2U then\n// Byte select bits are reversed\nD0.f32 = bf8_to_f32(VGPR[laneId][SRC0.u32][15 : 8].bf8)\nelsif OPSEL[1 : 0].u2 == 2'1U then\nD0.f32 = bf8_to_f32(VGPR[laneId][SRC0.u32][23 : 16].bf8)\nelse\nD0.f32 = bf8_to_f32(VGPR[laneId][SRC0.u32][31 : 24].bf8)\nendif", + VOP3Op.V_CVT_PK_F32_FP8_E64: 'tmp = OPSEL[0].u1 ? VGPR[laneId][SRC0.u32][31 : 16] : VGPR[laneId][SRC0.u32][15 : 0];\nD0[31 : 0].f32 = fp8_to_f32(tmp[7 : 0].fp8);\nD0[63 : 32].f32 = fp8_to_f32(tmp[15 : 8].fp8)', + VOP3Op.V_CVT_PK_F32_BF8_E64: 'tmp = OPSEL[0].u1 ? VGPR[laneId][SRC0.u32][31 : 16] : VGPR[laneId][SRC0.u32][15 : 0];\nD0[31 : 0].f32 = bf8_to_f32(tmp[7 : 0].bf8);\nD0[63 : 32].f32 = bf8_to_f32(tmp[15 : 8].bf8)', + VOP3Op.V_FMA_DX9_ZERO_F32: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = S2.f32\nelse\nD0.f32 = fma(S0.f32, S1.f32, S2.f32)\nendif", + VOP3Op.V_MAD_I32_I24: "D0.i32 = 32'I(S0.i24) * 32'I(S1.i24) + S2.i32", + VOP3Op.V_MAD_U32_U24: "D0.u32 = 32'U(S0.u24) * 32'U(S1.u24) + S2.u32", + VOP3Op.V_CUBEID_F32: '// Set D0.f = cubemap face ID ({0.0, 1.0, ..., 5.0}).\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nif S2.f32 < 0.0F then\nD0.f32 = 5.0F\nelse\nD0.f32 = 4.0F\nendif\nelsif abs(S1.f32) >= abs(S0.f32) then\nif S1.f32 < 0.0F then\nD0.f32 = 3.0F\nelse\nD0.f32 = 2.0F\nendif\nelse\nif S0.f32 < 0.0F then\nD0.f32 = 1.0F\nelse\nD0.f32 = 0.0F\nendif\nendif', + VOP3Op.V_CUBESC_F32: '// D0.f = cubemap S coordinate.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nif S2.f32 < 0.0F then\nD0.f32 = -S0.f32\nelse\nD0.f32 = S0.f32\nendif\nelsif abs(S1.f32) >= abs(S0.f32) then\nD0.f32 = S0.f32\nelse\nif S0.f32 < 0.0F then\nD0.f32 = S2.f32\nelse\nD0.f32 = -S2.f32\nendif\nendif', + VOP3Op.V_CUBETC_F32: '// D0.f = cubemap T coordinate.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nD0.f32 = -S1.f32\nelsif abs(S1.f32) >= abs(S0.f32) then\nif S1.f32 < 0.0F then\nD0.f32 = -S2.f32\nelse\nD0.f32 = S2.f32\nendif\nelse\nD0.f32 = -S1.f32\nendif', + VOP3Op.V_CUBEMA_F32: '// D0.f = 2.0 * cubemap major axis.\n// XYZ coordinate is given in (S0.f, S1.f, S2.f).\n// S0.f = x\n// S1.f = y\n// S2.f = z\nif ((abs(S2.f32) >= abs(S0.f32)) && (abs(S2.f32) >= abs(S1.f32))) then\nD0.f32 = S2.f32 * 2.0F\nelsif abs(S1.f32) >= abs(S0.f32) then\nD0.f32 = S1.f32 * 2.0F\nelse\nD0.f32 = S0.f32 * 2.0F\nendif', + VOP3Op.V_BFE_U32: 'D0.u32 = ((S0.u32 >> S1[4 : 0].u32) & ((1U << S2[4 : 0].u32) - 1U))', + VOP3Op.V_BFE_I32: 'tmp.i32 = ((S0.i32 >> S1[4 : 0].u32) & ((1 << S2[4 : 0].u32) - 1));\nD0.i32 = signext_from_bit(tmp.i32, S2[4 : 0].u32)', + VOP3Op.V_BFI_B32: 'D0.u32 = ((S0.u32 & S1.u32) | (~S0.u32 & S2.u32))', + VOP3Op.V_FMA_F32: 'D0.f32 = fma(S0.f32, S1.f32, S2.f32)', + VOP3Op.V_FMA_F64: 'D0.f64 = fma(S0.f64, S1.f64, S2.f64)', + VOP3Op.V_LERP_U8: 'tmp = ((S0.u32[31 : 24] + S1.u32[31 : 24] + S2.u32[24].u8) >> 1U << 24U);\ntmp += ((S0.u32[23 : 16] + S1.u32[23 : 16] + S2.u32[16].u8) >> 1U << 16U);\ntmp += ((S0.u32[15 : 8] + S1.u32[15 : 8] + S2.u32[8].u8) >> 1U << 8U);\ntmp += ((S0.u32[7 : 0] + S1.u32[7 : 0] + S2.u32[0].u8) >> 1U);\nD0.u32 = tmp.u32', + VOP3Op.V_ALIGNBIT_B32: "D0.u32 = 32'U(({ S0.u32, S1.u32 } >> S2.u32[4 : 0]) & 0xffffffffLL)", + VOP3Op.V_ALIGNBYTE_B32: "D0.u32 = 32'U(({ S0.u32, S1.u32 } >> (S2.u32[1 : 0] * 8U)) & 0xffffffffLL)", + VOP3Op.V_MULLIT_F32: "if ((S1.f32 == -MAX_FLOAT_F32) || (64'F(S1.f32) == -INF) || isNAN(64'F(S1.f32)) || (S2.f32 <= 0.0F) ||\nisNAN(64'F(S2.f32))) then\nD0.f32 = -MAX_FLOAT_F32\nelse\nD0.f32 = S0.f32 * S1.f32\nendif", + VOP3Op.V_MIN3_I32: 'D0.i32 = v_min_i32(v_min_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_MIN3_U32: 'D0.u32 = v_min_u32(v_min_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MAX3_I32: 'D0.i32 = v_max_i32(v_max_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_MAX3_U32: 'D0.u32 = v_max_u32(v_max_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MED3_I32: 'if v_max3_i32(S0.i32, S1.i32, S2.i32) == S0.i32 then\nD0.i32 = v_max_i32(S1.i32, S2.i32)\nelsif v_max3_i32(S0.i32, S1.i32, S2.i32) == S1.i32 then\nD0.i32 = v_max_i32(S0.i32, S2.i32)\nelse\nD0.i32 = v_max_i32(S0.i32, S1.i32)\nendif', + VOP3Op.V_MED3_U32: 'if v_max3_u32(S0.u32, S1.u32, S2.u32) == S0.u32 then\nD0.u32 = v_max_u32(S1.u32, S2.u32)\nelsif v_max3_u32(S0.u32, S1.u32, S2.u32) == S1.u32 then\nD0.u32 = v_max_u32(S0.u32, S2.u32)\nelse\nD0.u32 = v_max_u32(S0.u32, S1.u32)\nendif', + VOP3Op.V_SAD_U8: "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += 32'U(ABSDIFF(S0.u32[7 : 0], S1.u32[7 : 0]));\ntmp += 32'U(ABSDIFF(S0.u32[15 : 8], S1.u32[15 : 8]));\ntmp += 32'U(ABSDIFF(S0.u32[23 : 16], S1.u32[23 : 16]));\ntmp += 32'U(ABSDIFF(S0.u32[31 : 24], S1.u32[31 : 24]));\nD0.u32 = tmp", + VOP3Op.V_SAD_HI_U8: "D0.u32 = (32'U(v_sad_u8(S0, S1, 0U)) << 16U) + S2.u32", + VOP3Op.V_SAD_U16: 'ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += ABSDIFF(S0[15 : 0].u16, S1[15 : 0].u16);\ntmp += ABSDIFF(S0[31 : 16].u16, S1[31 : 16].u16);\nD0.u32 = tmp', + VOP3Op.V_SAD_U32: 'ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\nD0.u32 = ABSDIFF(S0.u32, S1.u32) + S2.u32', + VOP3Op.V_CVT_PK_U8_F32: "tmp = (S2.u32 & 32'U(~(0xff << (S1.u32[1 : 0].u32 * 8U))));\ntmp = (tmp | ((32'U(f32_to_u8(S0.f32)) & 255U) << (S1.u32[1 : 0].u32 * 8U)));\nD0.u32 = tmp", + VOP3Op.V_DIV_FIXUP_F32: "sign_out = (sign(S1.f32) ^ sign(S2.f32));\nif isNAN(64'F(S2.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S2.f32)))\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif ((64'F(S1.f32) == 0.0) && (64'F(S2.f32) == 0.0)) then\n// 0/0\nD0.f32 = 32'F(0xffc00000)\nelsif ((64'F(abs(S1.f32)) == +INF) && (64'F(abs(S2.f32)) == +INF)) then\n// inf/inf\nD0.f32 = 32'F(0xffc00000)\nelsif ((64'F(S1.f32) == 0.0) || (64'F(abs(S2.f32)) == +INF)) then\n// x/0, or inf/y\nD0.f32 = sign_out ? -INF.f32 : +INF.f32\nelsif ((64'F(abs(S1.f32)) == +INF) || (64'F(S2.f32) == 0.0)) then\n// x/inf, 0/y\nD0.f32 = sign_out ? -0.0F : 0.0F\nelsif exponent(S2.f32) - exponent(S1.f32) < -150 then\nD0.f32 = sign_out ? -UNDERFLOW_F32 : UNDERFLOW_F32\nelsif exponent(S1.f32) == 255 then\nD0.f32 = sign_out ? -OVERFLOW_F32 : OVERFLOW_F32\nelse\nD0.f32 = sign_out ? -abs(S0.f32) : abs(S0.f32)\nendif", + VOP3Op.V_DIV_FIXUP_F64: "sign_out = (sign(S1.f64) ^ sign(S2.f64));\nif isNAN(S2.f64) then\nD0.f64 = cvtToQuietNAN(S2.f64)\nelsif isNAN(S1.f64) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif ((S1.f64 == 0.0) && (S2.f64 == 0.0)) then\n// 0/0\nD0.f64 = 64'F(0xfff8000000000000LL)\nelsif ((abs(S1.f64) == +INF) && (abs(S2.f64) == +INF)) then\n// inf/inf\nD0.f64 = 64'F(0xfff8000000000000LL)\nelsif ((S1.f64 == 0.0) || (abs(S2.f64) == +INF)) then\n// x/0, or inf/y\nD0.f64 = sign_out ? -INF : +INF\nelsif ((abs(S1.f64) == +INF) || (S2.f64 == 0.0)) then\n// x/inf, 0/y\nD0.f64 = sign_out ? -0.0 : 0.0\nelsif exponent(S2.f64) - exponent(S1.f64) < -1075 then\nD0.f64 = sign_out ? -UNDERFLOW_F64 : UNDERFLOW_F64\nelsif exponent(S1.f64) == 2047 then\nD0.f64 = sign_out ? -OVERFLOW_F64 : OVERFLOW_F64\nelse\nD0.f64 = sign_out ? -abs(S0.f64) : abs(S0.f64)\nendif", + VOP3Op.V_MIN3_NUM_F32: 'D0.f32 = v_min_num_f32(v_min_num_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MAX3_NUM_F32: 'D0.f32 = v_max_num_f32(v_max_num_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MIN3_NUM_F16: 'D0.f16 = v_min_num_f16(v_min_num_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MAX3_NUM_F16: 'D0.f16 = v_max_num_f16(v_max_num_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MINIMUM3_F32: 'D0.f32 = v_minimum_f32(v_minimum_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MAXIMUM3_F32: 'D0.f32 = v_maximum_f32(v_maximum_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MINIMUM3_F16: 'D0.f16 = v_minimum_f16(v_minimum_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MAXIMUM3_F16: 'D0.f16 = v_maximum_f16(v_maximum_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MED3_NUM_F32: "if (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)) || isNAN(64'F(S2.f32))) then\nD0.f32 = v_min3_num_f32(S0.f32, S1.f32, S2.f32)\nelsif v_max3_num_f32(S0.f32, S1.f32, S2.f32) == S0.f32 then\nD0.f32 = v_max_num_f32(S1.f32, S2.f32)\nelsif v_max3_num_f32(S0.f32, S1.f32, S2.f32) == S1.f32 then\nD0.f32 = v_max_num_f32(S0.f32, S2.f32)\nelse\nD0.f32 = v_max_num_f32(S0.f32, S1.f32)\nendif", + VOP3Op.V_MED3_NUM_F16: "if (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)) || isNAN(64'F(S2.f16))) then\nD0.f16 = v_min3_num_f16(S0.f16, S1.f16, S2.f16)\nelsif v_max3_num_f16(S0.f16, S1.f16, S2.f16) == S0.f16 then\nD0.f16 = v_max_num_f16(S1.f16, S2.f16)\nelsif v_max3_num_f16(S0.f16, S1.f16, S2.f16) == S1.f16 then\nD0.f16 = v_max_num_f16(S0.f16, S2.f16)\nelse\nD0.f16 = v_max_num_f16(S0.f16, S1.f16)\nendif", + VOP3Op.V_DIV_FMAS_F32: 'if VCC.u64[laneId] then\nD0.f32 = 2.0F ** 32 * fma(S0.f32, S1.f32, S2.f32)\nelse\nD0.f32 = fma(S0.f32, S1.f32, S2.f32)\nendif', + VOP3Op.V_DIV_FMAS_F64: 'if VCC.u64[laneId] then\nD0.f64 = 2.0 ** 64 * fma(S0.f64, S1.f64, S2.f64)\nelse\nD0.f64 = fma(S0.f64, S1.f64, S2.f64)\nendif', + VOP3Op.V_MSAD_U8: "ABSDIFF = lambda(x, y) (\nx > y ? x - y : y - x);\n// UNSIGNED comparison\ntmp = S2.u32;\ntmp += S1.u32[7 : 0] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[7 : 0], S1.u32[7 : 0]));\ntmp += S1.u32[15 : 8] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[15 : 8], S1.u32[15 : 8]));\ntmp += S1.u32[23 : 16] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[23 : 16], S1.u32[23 : 16]));\ntmp += S1.u32[31 : 24] == 8'0U ? 0U : 32'U(ABSDIFF(S0.u32[31 : 24], S1.u32[31 : 24]));\nD0.u32 = tmp", + VOP3Op.V_QSAD_PK_U16_U8: "tmp[63 : 48] = 16'B(v_sad_u8(S0[55 : 24], S1[31 : 0], S2[63 : 48].u32));\ntmp[47 : 32] = 16'B(v_sad_u8(S0[47 : 16], S1[31 : 0], S2[47 : 32].u32));\ntmp[31 : 16] = 16'B(v_sad_u8(S0[39 : 8], S1[31 : 0], S2[31 : 16].u32));\ntmp[15 : 0] = 16'B(v_sad_u8(S0[31 : 0], S1[31 : 0], S2[15 : 0].u32));\nD0.b64 = tmp.b64", + VOP3Op.V_MQSAD_PK_U16_U8: "tmp[63 : 48] = 16'B(v_msad_u8(S0[55 : 24], S1[31 : 0], S2[63 : 48].u32));\ntmp[47 : 32] = 16'B(v_msad_u8(S0[47 : 16], S1[31 : 0], S2[47 : 32].u32));\ntmp[31 : 16] = 16'B(v_msad_u8(S0[39 : 8], S1[31 : 0], S2[31 : 16].u32));\ntmp[15 : 0] = 16'B(v_msad_u8(S0[31 : 0], S1[31 : 0], S2[15 : 0].u32));\nD0.b64 = tmp.b64", + VOP3Op.V_MQSAD_U32_U8: "tmp[127 : 96] = 32'B(v_msad_u8(S0[55 : 24], S1[31 : 0], S2[127 : 96].u32));\ntmp[95 : 64] = 32'B(v_msad_u8(S0[47 : 16], S1[31 : 0], S2[95 : 64].u32));\ntmp[63 : 32] = 32'B(v_msad_u8(S0[39 : 8], S1[31 : 0], S2[63 : 32].u32));\ntmp[31 : 0] = 32'B(v_msad_u8(S0[31 : 0], S1[31 : 0], S2[31 : 0].u32));\nD0.b128 = tmp.b128", + VOP3Op.V_XOR3_B32: 'D0.u32 = (S0.u32 ^ S1.u32 ^ S2.u32)', + VOP3Op.V_MAD_U16: 'D0.u16 = S0.u16 * S1.u16 + S2.u16', + VOP3Op.V_PERM_B32: "BYTE_PERMUTE = lambda(data, sel) (\ndeclare in : 8'B[8];\nfor i in 0 : 7 do\nin[i] = data[i * 8 + 7 : i * 8].b8\nendfor;\nif sel.u32 >= 13U then\nreturn 8'0xff\nelsif sel.u32 == 12U then\nreturn 8'0x0\nelsif sel.u32 == 11U then\nreturn in[7][7].b8 * 8'0xff\nelsif sel.u32 == 10U then\nreturn in[5][7].b8 * 8'0xff\nelsif sel.u32 == 9U then\nreturn in[3][7].b8 * 8'0xff\nelsif sel.u32 == 8U then\nreturn in[1][7].b8 * 8'0xff\nelse\nreturn in[sel]\nendif);\nD0[31 : 24] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[31 : 24]);\nD0[23 : 16] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[23 : 16]);\nD0[15 : 8] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[15 : 8]);\nD0[7 : 0] = BYTE_PERMUTE({ S0.u32, S1.u32 }, S2.u32[7 : 0])", + VOP3Op.V_XAD_U32: 'D0.u32 = (S0.u32 ^ S1.u32) + S2.u32', + VOP3Op.V_LSHL_ADD_U32: 'D0.u32 = (S0.u32 << S1.u32[4 : 0].u32) + S2.u32', + VOP3Op.V_ADD_LSHL_U32: 'D0.u32 = ((S0.u32 + S1.u32) << S2.u32[4 : 0].u32)', + VOP3Op.V_FMA_F16: 'D0.f16 = fma(S0.f16, S1.f16, S2.f16)', + VOP3Op.V_MIN3_I16: 'D0.i16 = v_min_i16(v_min_i16(S0.i16, S1.i16), S2.i16)', + VOP3Op.V_MIN3_U16: 'D0.u16 = v_min_u16(v_min_u16(S0.u16, S1.u16), S2.u16)', + VOP3Op.V_MAX3_I16: 'D0.i16 = v_max_i16(v_max_i16(S0.i16, S1.i16), S2.i16)', + VOP3Op.V_MAX3_U16: 'D0.u16 = v_max_u16(v_max_u16(S0.u16, S1.u16), S2.u16)', + VOP3Op.V_MED3_I16: 'if v_max3_i16(S0.i16, S1.i16, S2.i16) == S0.i16 then\nD0.i16 = v_max_i16(S1.i16, S2.i16)\nelsif v_max3_i16(S0.i16, S1.i16, S2.i16) == S1.i16 then\nD0.i16 = v_max_i16(S0.i16, S2.i16)\nelse\nD0.i16 = v_max_i16(S0.i16, S1.i16)\nendif', + VOP3Op.V_MED3_U16: 'if v_max3_u16(S0.u16, S1.u16, S2.u16) == S0.u16 then\nD0.u16 = v_max_u16(S1.u16, S2.u16)\nelsif v_max3_u16(S0.u16, S1.u16, S2.u16) == S1.u16 then\nD0.u16 = v_max_u16(S0.u16, S2.u16)\nelse\nD0.u16 = v_max_u16(S0.u16, S1.u16)\nendif', + VOP3Op.V_MAD_I16: 'D0.i16 = S0.i16 * S1.i16 + S2.i16', + VOP3Op.V_DIV_FIXUP_F16: "sign_out = (sign(S1.f16) ^ sign(S2.f16));\nif isNAN(64'F(S2.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S2.f16)))\nelsif isNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif ((64'F(S1.f16) == 0.0) && (64'F(S2.f16) == 0.0)) then\n// 0/0\nD0.f16 = 16'F(0xfe00)\nelsif ((64'F(abs(S1.f16)) == +INF) && (64'F(abs(S2.f16)) == +INF)) then\n// inf/inf\nD0.f16 = 16'F(0xfe00)\nelsif ((64'F(S1.f16) == 0.0) || (64'F(abs(S2.f16)) == +INF)) then\n// x/0, or inf/y\nD0.f16 = sign_out ? -INF.f16 : +INF.f16\nelsif ((64'F(abs(S1.f16)) == +INF) || (64'F(S2.f16) == 0.0)) then\n// x/inf, 0/y\nD0.f16 = sign_out ? -16'0.0 : 16'0.0\nelse\nD0.f16 = sign_out ? -abs(S0.f16) : abs(S0.f16)\nendif", + VOP3Op.V_ADD3_U32: 'D0.u32 = S0.u32 + S1.u32 + S2.u32', + VOP3Op.V_LSHL_OR_B32: 'D0.u32 = ((S0.u32 << S1.u32[4 : 0].u32) | S2.u32)', + VOP3Op.V_AND_OR_B32: 'D0.u32 = ((S0.u32 & S1.u32) | S2.u32)', + VOP3Op.V_OR3_B32: 'D0.u32 = (S0.u32 | S1.u32 | S2.u32)', + VOP3Op.V_MAD_U32_U16: "D0.u32 = 32'U(S0.u16) * 32'U(S1.u16) + S2.u32", + VOP3Op.V_MAD_I32_I16: "D0.i32 = 32'I(S0.i16) * 32'I(S1.i16) + S2.i32", + VOP3Op.V_PERMLANE16_B32: "declare tmp : 32'B[64];\nlanesel = { S2.u32, S1.u32 };\n// Concatenate lane select bits\nfor i in 0 : WAVE32 ? 31 : 63 do\n// Copy original S0 in case D==S0\ntmp[i] = VGPR[i][SRC0.u32]\nendfor;\nfor row in 0 : WAVE32 ? 1 : 3 do\n// Implement arbitrary swizzle within each row\nfor i in 0 : 15 do\nif EXEC[row * 16 + i].u1 then\nVGPR[row * 16 + i][VDST.u32] = tmp[64'B(row * 16) + lanesel[i * 4 + 3 : i * 4]]\nendif\nendfor\nendfor", + VOP3Op.V_PERMLANEX16_B32: "declare tmp : 32'B[64];\nlanesel = { S2.u32, S1.u32 };\n// Concatenate lane select bits\nfor i in 0 : WAVE32 ? 31 : 63 do\n// Copy original S0 in case D==S0\ntmp[i] = VGPR[i][SRC0.u32]\nendfor;\nfor row in 0 : WAVE32 ? 1 : 3 do\n// Implement arbitrary swizzle across two rows\naltrow = { row[1], ~row[0] };\n// 1<->0, 3<->2\nfor i in 0 : 15 do\nif EXEC[row * 16 + i].u1 then\nVGPR[row * 16 + i][VDST.u32] = tmp[64'B(altrow.i32 * 16) + lanesel[i * 4 + 3 : i * 4]]\nendif\nendfor\nendfor", + VOP3Op.V_CNDMASK_B16: 'D0.u16 = VCC.u64[laneId] ? S1.u16 : S0.u16', + VOP3Op.V_MAXMIN_U32: 'D0.u32 = v_min_u32(v_max_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MINMAX_U32: 'D0.u32 = v_max_u32(v_min_u32(S0.u32, S1.u32), S2.u32)', + VOP3Op.V_MAXMIN_I32: 'D0.i32 = v_min_i32(v_max_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_MINMAX_I32: 'D0.i32 = v_max_i32(v_min_i32(S0.i32, S1.i32), S2.i32)', + VOP3Op.V_DOT2_F16_F16: 'tmp = S2.f16;\ntmp += S0[15 : 0].f16 * S1[15 : 0].f16;\ntmp += S0[31 : 16].f16 * S1[31 : 16].f16;\nD0.f16 = tmp', + VOP3Op.V_DOT2_BF16_BF16: 'tmp = S2.bf16;\ntmp += S0[15 : 0].bf16 * S1[15 : 0].bf16;\ntmp += S0[31 : 16].bf16 * S1[31 : 16].bf16;\nD0.bf16 = tmp', + VOP3Op.V_MINMAX_NUM_F32: 'D0.f32 = v_max_num_f32(v_min_num_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MAXMIN_NUM_F32: 'D0.f32 = v_min_num_f32(v_max_num_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MINMAX_NUM_F16: 'D0.f16 = v_max_num_f16(v_min_num_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MAXMIN_NUM_F16: 'D0.f16 = v_min_num_f16(v_max_num_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MINIMUMMAXIMUM_F32: 'D0.f32 = v_maximum_f32(v_minimum_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MAXIMUMMINIMUM_F32: 'D0.f32 = v_minimum_f32(v_maximum_f32(S0.f32, S1.f32), S2.f32)', + VOP3Op.V_MINIMUMMAXIMUM_F16: 'D0.f16 = v_maximum_f16(v_minimum_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_MAXIMUMMINIMUM_F16: 'D0.f16 = v_minimum_f16(v_maximum_f16(S0.f16, S1.f16), S2.f16)', + VOP3Op.V_S_EXP_F32: 'D0.f32 = pow(2.0F, S0.f32)', + VOP3Op.V_S_EXP_F16: "D0.f16 = pow(16'2.0, S0.f16);\nD0[31 : 16] = 16'0x0", + VOP3Op.V_S_LOG_F32: 'D0.f32 = log2(S0.f32)', + VOP3Op.V_S_LOG_F16: "D0.f16 = log2(S0.f16);\nD0[31 : 16] = 16'0x0", + VOP3Op.V_S_RCP_F32: 'D0.f32 = 1.0F / S0.f32', + VOP3Op.V_S_RCP_F16: "D0.f16 = 16'1.0 / S0.f16;\nD0[31 : 16] = 16'0x0", + VOP3Op.V_S_RSQ_F32: 'D0.f32 = 1.0F / sqrt(S0.f32)', + VOP3Op.V_S_RSQ_F16: "D0.f16 = 16'1.0 / sqrt(S0.f16);\nD0[31 : 16] = 16'0x0", + VOP3Op.V_S_SQRT_F32: 'D0.f32 = sqrt(S0.f32)', + VOP3Op.V_S_SQRT_F16: "D0.f16 = sqrt(S0.f16);\nD0[31 : 16] = 16'0x0", + VOP3Op.V_ADD_NC_U16: 'D0.u16 = S0.u16 + S1.u16', + VOP3Op.V_SUB_NC_U16: 'D0.u16 = S0.u16 - S1.u16', + VOP3Op.V_MUL_LO_U16: 'D0.u16 = S0.u16 * S1.u16', + VOP3Op.V_CVT_PK_I16_F32: "declare tmp : 32'B;\ntmp[31 : 16] = 16'B(v_cvt_i16_f32(S1.f32));\ntmp[15 : 0] = 16'B(v_cvt_i16_f32(S0.f32));\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_U16_F32: "declare tmp : 32'B;\ntmp[31 : 16] = 16'B(v_cvt_u16_f32(S1.f32));\ntmp[15 : 0] = 16'B(v_cvt_u16_f32(S0.f32));\nD0 = tmp.b32", + VOP3Op.V_MAX_U16: 'D0.u16 = S0.u16 >= S1.u16 ? S0.u16 : S1.u16', + VOP3Op.V_MAX_I16: 'D0.i16 = S0.i16 >= S1.i16 ? S0.i16 : S1.i16', + VOP3Op.V_MIN_U16: 'D0.u16 = S0.u16 < S1.u16 ? S0.u16 : S1.u16', + VOP3Op.V_MIN_I16: 'D0.i16 = S0.i16 < S1.i16 ? S0.i16 : S1.i16', + VOP3Op.V_ADD_NC_I16: 'D0.i16 = S0.i16 + S1.i16', + VOP3Op.V_SUB_NC_I16: 'D0.i16 = S0.i16 - S1.i16', + VOP3Op.V_PERMLANE16_VAR_B32: "declare tmp : 32'B[64];\nfor i in 0 : WAVE32 ? 31 : 63 do\n// Copy original S0 in case D==S0\ntmp[i] = VGPR[i][SRC0.u32]\nendfor;\nfor row in 0 : wave32.u1 ? 1 : 3 do\n// Implement arbitrary swizzle within each row\nfor i in 0 : 15 do\nlane = row * 16 + i;\nif EXEC[lane].u1 then\nVGPR[lane][VDST.u32] = tmp[row * 16 + VGPR[lane][SRC1.u32][3 : 0].i32]\nendif\nendfor\nendfor", + VOP3Op.V_PERMLANEX16_VAR_B32: "declare tmp : 32'B[64];\nfor i in 0 : WAVE32 ? 31 : 63 do\n// Copy original S0 in case D==S0\ntmp[i] = VGPR[i][SRC0.u32]\nendfor;\nfor row in 0 : wave32.u1 ? 1 : 3 do\n// Implement arbitrary swizzle across two rows\naltrow = { row[1], ~row[0] };\n// 1<->0, 3<->2\nfor i in 0 : 15 do\nlane = row * 16 + i;\nif EXEC[lane].u1 then\nVGPR[lane][VDST.u32] = tmp[altrow.i32 * 16 + VGPR[lane][SRC1.u32][3 : 0].i32]\nendif\nendfor\nendfor", + VOP3Op.V_PACK_B32_F16: 'D0[31 : 16].f16 = S1.f16;\nD0[15 : 0].f16 = S0.f16', + VOP3Op.V_CVT_PK_NORM_I16_F16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = f16_to_snorm(S0.f16);\ntmp[31 : 16].i16 = f16_to_snorm(S1.f16);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_NORM_U16_F16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = f16_to_unorm(S0.f16);\ntmp[31 : 16].u16 = f16_to_unorm(S1.f16);\nD0 = tmp.b32", + VOP3Op.V_LDEXP_F32: 'D0.f32 = S0.f32 * 2.0F ** S1.i32', + VOP3Op.V_BFM_B32: 'D0.u32 = (((1U << S0[4 : 0].u32) - 1U) << S1[4 : 0].u32)', + VOP3Op.V_BCNT_U32_B32: "tmp = S1.u32;\nfor i in 0 : 31 do\ntmp += S0[i].u32;\n// count i'th bit\nendfor;\nD0.u32 = tmp", + VOP3Op.V_MBCNT_LO_U32_B32: "ThreadMask = (1LL << laneId.u32) - 1LL;\nMaskedValue = (S0.u32 & ThreadMask[31 : 0].u32);\ntmp = S1.u32;\nfor i in 0 : 31 do\ntmp += MaskedValue[i] == 1'1U ? 1U : 0U\nendfor;\nD0.u32 = tmp", + VOP3Op.V_MBCNT_HI_U32_B32: "ThreadMask = (1LL << laneId.u32) - 1LL;\nMaskedValue = (S0.u32 & ThreadMask[63 : 32].u32);\ntmp = S1.u32;\nfor i in 0 : 31 do\ntmp += MaskedValue[i] == 1'1U ? 1U : 0U\nendfor;\nD0.u32 = tmp", + VOP3Op.V_CVT_PK_NORM_I16_F32: "declare tmp : 32'B;\ntmp[15 : 0].i16 = f32_to_snorm(S0.f32);\ntmp[31 : 16].i16 = f32_to_snorm(S1.f32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_NORM_U16_F32: "declare tmp : 32'B;\ntmp[15 : 0].u16 = f32_to_unorm(S0.f32);\ntmp[31 : 16].u16 = f32_to_unorm(S1.f32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_U16_U32: "declare tmp : 32'B;\ntmp[15 : 0].u16 = u32_to_u16(S0.u32);\ntmp[31 : 16].u16 = u32_to_u16(S1.u32);\nD0 = tmp.b32", + VOP3Op.V_CVT_PK_I16_I32: "declare tmp : 32'B;\ntmp[15 : 0].i16 = i32_to_i16(S0.i32);\ntmp[31 : 16].i16 = i32_to_i16(S1.i32);\nD0 = tmp.b32", + VOP3Op.V_SUB_NC_I32: 'D0.i32 = S0.i32 - S1.i32', + VOP3Op.V_ADD_NC_I32: 'D0.i32 = S0.i32 + S1.i32', + VOP3Op.V_LDEXP_F64: 'D0.f64 = S0.f64 * 2.0 ** S1.i32', + VOP3Op.V_MUL_LO_U32: 'D0.u32 = S0.u32 * S1.u32', + VOP3Op.V_MUL_HI_U32: "D0.u32 = 32'U((64'U(S0.u32) * 64'U(S1.u32)) >> 32U)", + VOP3Op.V_MUL_HI_I32: "D0.i32 = 32'I((64'I(S0.i32) * 64'I(S1.i32)) >> 32U)", + VOP3Op.V_TRIG_PREOP_F64: "shift = 32'I(S1[4 : 0].u32) * 53;\nif exponent(S0.f64) > 1077 then\nshift += exponent(S0.f64) - 1077\nendif;\n// (2.0/PI) == 0.{b_1200, b_1199, b_1198, ..., b_1, b_0}\n// b_1200 is the MSB of the fractional part of 2.0/PI\n// Left shift operation indicates which bits are brought\n// into the whole part of the number.\n// Only whole part of result is kept.\nresult = 64'F((1201'B(2.0 / PI)[1200 : 0] << shift.u32) & 1201'0x1fffffffffffff);\nscale = -53 - shift;\nif exponent(S0.f64) >= 1968 then\nscale += 128\nendif;\nD0.f64 = ldexp(result, scale)", + VOP3Op.V_LSHLREV_B16: 'D0.u16 = (S1.u16 << S0[3 : 0].u32)', + VOP3Op.V_LSHRREV_B16: 'D0.u16 = (S1.u16 >> S0[3 : 0].u32)', + VOP3Op.V_ASHRREV_I16: 'D0.i16 = (S1.i16 >> S0[3 : 0].u32)', + VOP3Op.V_LSHRREV_B64: 'D0.u64 = (S1.u64 >> S0[5 : 0].u32)', + VOP3Op.V_ASHRREV_I64: 'D0.i64 = (S1.i64 >> S0[5 : 0].u32)', + VOP3Op.V_MINIMUM_F64: 'if (isSignalNAN(S0.f64) || isSignalNAN(S1.f64)) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(S0.f64) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif isSignalNAN(S1.f64) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif isQuietNAN(S0.f64) then\nD0.f64 = S0.f64\nelsif isQuietNAN(S1.f64) then\nD0.f64 = S1.f64\nelsif ((S0.f64 < S1.f64) || ((abs(S0.f64) == 0.0) && (abs(S1.f64) == 0.0) && sign(S0.f64) &&\n!sign(S1.f64))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif', + VOP3Op.V_MAXIMUM_F64: 'if (isSignalNAN(S0.f64) || isSignalNAN(S1.f64)) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(S0.f64) then\nD0.f64 = cvtToQuietNAN(S0.f64)\nelsif isSignalNAN(S1.f64) then\nD0.f64 = cvtToQuietNAN(S1.f64)\nelsif isQuietNAN(S0.f64) then\nD0.f64 = S0.f64\nelsif isQuietNAN(S1.f64) then\nD0.f64 = S1.f64\nelsif ((S0.f64 > S1.f64) || ((abs(S0.f64) == 0.0) && (abs(S1.f64) == 0.0) && !sign(S0.f64) &&\nsign(S1.f64))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f64 = S0.f64\nelse\nD0.f64 = S1.f64\nendif', + VOP3Op.V_READLANE_B32: "declare lane : 32'U;\nif WAVE32 then\nlane = S1.u32[4 : 0].u32;\n// Lane select for wave32\nelse\nlane = S1.u32[5 : 0].u32;\n// Lane select for wave64\nendif;\nD0.b32 = VGPR[lane][SRC0.u32]", + VOP3Op.V_WRITELANE_B32: "declare lane : 32'U;\nif WAVE32 then\nlane = S1.u32[4 : 0].u32;\n// Lane select for wave32\nelse\nlane = S1.u32[5 : 0].u32;\n// Lane select for wave64\nendif;\nVGPR[lane][VDST.u32] = S0.b32", + VOP3Op.V_AND_B16: 'D0.u16 = (S0.u16 & S1.u16)', + VOP3Op.V_OR_B16: 'D0.u16 = (S0.u16 | S1.u16)', + VOP3Op.V_XOR_B16: 'D0.u16 = (S0.u16 ^ S1.u16)', + VOP3Op.V_MINIMUM_F32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S1.f32\nelsif ((S0.f32 < S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && sign(S0.f32) &&\n!sign(S1.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + VOP3Op.V_MAXIMUM_F32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(64'F(S0.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isSignalNAN(64'F(S1.f32)) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S1.f32)))\nelsif isQuietNAN(64'F(S0.f32)) then\nD0.f32 = S0.f32\nelsif isQuietNAN(64'F(S1.f32)) then\nD0.f32 = S1.f32\nelsif ((S0.f32 > S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && !sign(S0.f32) &&\nsign(S1.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + VOP3Op.V_MINIMUM_F16: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S1.f16\nelsif ((S0.f16 < S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && sign(S0.f16) &&\n!sign(S1.f16))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + VOP3Op.V_MAXIMUM_F16: "if (isSignalNAN(64'F(S0.f16)) || isSignalNAN(64'F(S1.f16))) then\nTRAPSTS.INVALID = 1\nendif;\nif isSignalNAN(64'F(S0.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S0.f16)))\nelsif isSignalNAN(64'F(S1.f16)) then\nD0.f16 = 16'F(cvtToQuietNAN(64'F(S1.f16)))\nelsif isQuietNAN(64'F(S0.f16)) then\nD0.f16 = S0.f16\nelsif isQuietNAN(64'F(S1.f16)) then\nD0.f16 = S1.f16\nelsif ((S0.f16 > S1.f16) || ((abs(S0.f16) == 16'0.0) && (abs(S1.f16) == 16'0.0) && !sign(S0.f16) &&\nsign(S1.f16))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f16 = S0.f16\nelse\nD0.f16 = S1.f16\nendif", + VOP3Op.V_CVT_PK_FP8_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\nif OPSEL[3].u32 == 0U then\nVGPR[laneId][VDST.u32][15 : 0].b16 = { f32_to_fp8(S1.f32), f32_to_fp8(S0.f32) };\n// D0[31:16] are preserved\nelse\nVGPR[laneId][VDST.u32][31 : 16].b16 = { f32_to_fp8(S1.f32), f32_to_fp8(S0.f32) };\n// D0[15:0] are preserved\nendif;\nROUND_MODE = prev_mode', + VOP3Op.V_CVT_PK_BF8_F32: 'prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\nif OPSEL[3].u32 == 0U then\nVGPR[laneId][VDST.u32][15 : 0].b16 = { f32_to_bf8(S1.f32), f32_to_bf8(S0.f32) };\n// D0[31:16] are preserved\nelse\nVGPR[laneId][VDST.u32][31 : 16].b16 = { f32_to_bf8(S1.f32), f32_to_bf8(S0.f32) };\n// D0[15:0] are preserved\nendif;\nROUND_MODE = prev_mode', + VOP3Op.V_CVT_SR_FP8_F32: "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\ns = sign(S0.f32);\ne = exponent(S0.f32);\nm = 23'U(32'U(23'B(mantissa(S0.f32))) + S1[31 : 12].u32);\ntmp = float32(s, e, m);\n// Add stochastic value to mantissa, wrap around on overflow\nif OPSEL[3 : 2].u2 == 2'0U then\nVGPR[laneId][VDST.u32][7 : 0].fp8 = f32_to_fp8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'1U then\nVGPR[laneId][VDST.u32][15 : 8].fp8 = f32_to_fp8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'2U then\nVGPR[laneId][VDST.u32][23 : 16].fp8 = f32_to_fp8(tmp.f32)\nelse\nVGPR[laneId][VDST.u32][31 : 24].fp8 = f32_to_fp8(tmp.f32)\nendif;\n// Unwritten bytes of D are preserved.\nROUND_MODE = prev_mode", + VOP3Op.V_CVT_SR_BF8_F32: "prev_mode = ROUND_MODE;\nROUND_MODE = ROUND_NEAREST_EVEN;\ns = sign(S0.f32);\ne = exponent(S0.f32);\nm = 23'U(32'U(23'B(mantissa(S0.f32))) + S1[31 : 11].u32);\ntmp = float32(s, e, m);\n// Add stochastic value to mantissa, wrap around on overflow\nif OPSEL[3 : 2].u2 == 2'0U then\nVGPR[laneId][VDST.u32][7 : 0].bf8 = f32_to_bf8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'1U then\nVGPR[laneId][VDST.u32][15 : 8].bf8 = f32_to_bf8(tmp.f32)\nelsif OPSEL[3 : 2].u2 == 2'2U then\nVGPR[laneId][VDST.u32][23 : 16].bf8 = f32_to_bf8(tmp.f32)\nelse\nVGPR[laneId][VDST.u32][31 : 24].bf8 = f32_to_bf8(tmp.f32)\nendif;\n// Unwritten bytes of D are preserved.\nROUND_MODE = prev_mode", + VOP3POp.V_PK_MAD_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 * S1[15 : 0].i16 + S2[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 * S1[31 : 16].i16 + S2[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_MUL_LO_U16: 'tmp[31 : 16].u16 = S0[31 : 16].u16 * S1[31 : 16].u16;\ntmp[15 : 0].u16 = S0[15 : 0].u16 * S1[15 : 0].u16;\nD0.b32 = tmp.b32', + VOP3POp.V_PK_ADD_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 + S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 + S1[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_SUB_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 - S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 - S1[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_LSHLREV_B16: 'tmp[31 : 16].u16 = (S1[31 : 16].u16 << S0.u32[19 : 16].u32);\ntmp[15 : 0].u16 = (S1[15 : 0].u16 << S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_LSHRREV_B16: 'tmp[31 : 16].u16 = (S1[31 : 16].u16 >> S0.u32[19 : 16].u32);\ntmp[15 : 0].u16 = (S1[15 : 0].u16 >> S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_ASHRREV_I16: 'tmp[31 : 16].i16 = (S1[31 : 16].i16 >> S0.u32[19 : 16].u32);\ntmp[15 : 0].i16 = (S1[15 : 0].i16 >> S0.u32[3 : 0].u32);\nD0.b32 = tmp.b32', + VOP3POp.V_PK_MAX_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 >= S1[15 : 0].i16 ? S0[15 : 0].i16 : S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 >= S1[31 : 16].i16 ? S0[31 : 16].i16 : S1[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_MIN_I16: "declare tmp : 32'B;\ntmp[15 : 0].i16 = S0[15 : 0].i16 < S1[15 : 0].i16 ? S0[15 : 0].i16 : S1[15 : 0].i16;\ntmp[31 : 16].i16 = S0[31 : 16].i16 < S1[31 : 16].i16 ? S0[31 : 16].i16 : S1[31 : 16].i16;\nD0.b32 = tmp", + VOP3POp.V_PK_MAD_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 * S1[15 : 0].u16 + S2[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 * S1[31 : 16].u16 + S2[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_ADD_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 + S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 + S1[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_SUB_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 - S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 - S1[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_MAX_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 >= S1[15 : 0].u16 ? S0[15 : 0].u16 : S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 >= S1[31 : 16].u16 ? S0[31 : 16].u16 : S1[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_MIN_U16: "declare tmp : 32'B;\ntmp[15 : 0].u16 = S0[15 : 0].u16 < S1[15 : 0].u16 ? S0[15 : 0].u16 : S1[15 : 0].u16;\ntmp[31 : 16].u16 = S0[31 : 16].u16 < S1[31 : 16].u16 ? S0[31 : 16].u16 : S1[31 : 16].u16;\nD0.b32 = tmp", + VOP3POp.V_PK_FMA_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = fma(S0[15 : 0].f16, S1[15 : 0].f16, S2[15 : 0].f16);\ntmp[31 : 16].f16 = fma(S0[31 : 16].f16, S1[31 : 16].f16, S2[31 : 16].f16);\nD0.b32 = tmp", + VOP3POp.V_PK_ADD_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = S0[15 : 0].f16 + S1[15 : 0].f16;\ntmp[31 : 16].f16 = S0[31 : 16].f16 + S1[31 : 16].f16;\nD0.b32 = tmp", + VOP3POp.V_PK_MUL_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = S0[15 : 0].f16 * S1[15 : 0].f16;\ntmp[31 : 16].f16 = S0[31 : 16].f16 * S1[31 : 16].f16;\nD0.b32 = tmp", + VOP3POp.V_DOT2_F32_F16: 'tmp = S2.f32;\ntmp += f16_to_f32(S0[15 : 0].f16) * f16_to_f32(S1[15 : 0].f16);\ntmp += f16_to_f32(S0[31 : 16].f16) * f16_to_f32(S1[31 : 16].f16);\nD0.f32 = tmp', + VOP3POp.V_DOT4_I32_IU8: "declare A : 32'I[4];\ndeclare B : 32'I[4];\n// Figure out whether inputs are signed/unsigned.\nfor i in 0 : 3 do\nA8 = S0[i * 8 + 7 : i * 8];\nB8 = S1[i * 8 + 7 : i * 8];\nA[i] = NEG[0].u1 ? 32'I(signext(A8.i8)) : 32'I(32'U(A8.u8));\nB[i] = NEG[1].u1 ? 32'I(signext(B8.i8)) : 32'I(32'U(B8.u8))\nendfor;\nC = S2.i32;\n// Signed multiplier/adder. Extend unsigned inputs with leading 0.\ntmp = C.i32;\ntmp += A[0] * B[0];\ntmp += A[1] * B[1];\ntmp += A[2] * B[2];\ntmp += A[3] * B[3];\nD0.i32 = tmp", + VOP3POp.V_DOT4_U32_U8: 'tmp = S2.u32;\ntmp += u8_to_u32(S0[7 : 0].u8) * u8_to_u32(S1[7 : 0].u8);\ntmp += u8_to_u32(S0[15 : 8].u8) * u8_to_u32(S1[15 : 8].u8);\ntmp += u8_to_u32(S0[23 : 16].u8) * u8_to_u32(S1[23 : 16].u8);\ntmp += u8_to_u32(S0[31 : 24].u8) * u8_to_u32(S1[31 : 24].u8);\nD0.u32 = tmp', + VOP3POp.V_DOT8_I32_IU4: "declare A : 32'I[8];\ndeclare B : 32'I[8];\n// Figure out whether inputs are signed/unsigned.\nfor i in 0 : 7 do\nA4 = S0[i * 4 + 3 : i * 4];\nB4 = S1[i * 4 + 3 : i * 4];\nA[i] = NEG[0].u1 ? 32'I(signext(A4.i4)) : 32'I(32'U(A4.u4));\nB[i] = NEG[1].u1 ? 32'I(signext(B4.i4)) : 32'I(32'U(B4.u4))\nendfor;\nC = S2.i32;\n// Signed multiplier/adder. Extend unsigned inputs with leading 0.\ntmp = C.i32;\ntmp += A[0] * B[0];\ntmp += A[1] * B[1];\ntmp += A[2] * B[2];\ntmp += A[3] * B[3];\ntmp += A[4] * B[4];\ntmp += A[5] * B[5];\ntmp += A[6] * B[6];\ntmp += A[7] * B[7];\nD0.i32 = tmp", + VOP3POp.V_DOT8_U32_U4: 'tmp = S2.u32;\ntmp += u4_to_u32(S0[3 : 0].u4) * u4_to_u32(S1[3 : 0].u4);\ntmp += u4_to_u32(S0[7 : 4].u4) * u4_to_u32(S1[7 : 4].u4);\ntmp += u4_to_u32(S0[11 : 8].u4) * u4_to_u32(S1[11 : 8].u4);\ntmp += u4_to_u32(S0[15 : 12].u4) * u4_to_u32(S1[15 : 12].u4);\ntmp += u4_to_u32(S0[19 : 16].u4) * u4_to_u32(S1[19 : 16].u4);\ntmp += u4_to_u32(S0[23 : 20].u4) * u4_to_u32(S1[23 : 20].u4);\ntmp += u4_to_u32(S0[27 : 24].u4) * u4_to_u32(S1[27 : 24].u4);\ntmp += u4_to_u32(S0[31 : 28].u4) * u4_to_u32(S1[31 : 28].u4);\nD0.u32 = tmp', + VOP3POp.V_DOT2_F32_BF16: 'tmp = S2.f32;\ntmp += bf16_to_f32(S0[15 : 0].bf16) * bf16_to_f32(S1[15 : 0].bf16);\ntmp += bf16_to_f32(S0[31 : 16].bf16) * bf16_to_f32(S1[31 : 16].bf16);\nD0.f32 = tmp', + VOP3POp.V_PK_MIN_NUM_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = v_min_num_f16(S0[15 : 0].f16, S1[15 : 0].f16);\ntmp[31 : 16].f16 = v_min_num_f16(S0[31 : 16].f16, S1[31 : 16].f16);\nD0.b32 = tmp", + VOP3POp.V_PK_MAX_NUM_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = v_max_num_f16(S0[15 : 0].f16, S1[15 : 0].f16);\ntmp[31 : 16].f16 = v_max_num_f16(S0[31 : 16].f16, S1[31 : 16].f16);\nD0.b32 = tmp", + VOP3POp.V_PK_MINIMUM_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = v_minimum_f16(S0[15 : 0].f16, S1[15 : 0].f16);\ntmp[31 : 16].f16 = v_minimum_f16(S0[31 : 16].f16, S1[31 : 16].f16);\nD0.b32 = tmp", + VOP3POp.V_PK_MAXIMUM_F16: "declare tmp : 32'B;\ntmp[15 : 0].f16 = v_maximum_f16(S0[15 : 0].f16, S1[15 : 0].f16);\ntmp[31 : 16].f16 = v_maximum_f16(S0[31 : 16].f16, S1[31 : 16].f16);\nD0.b32 = tmp", + VOP3POp.V_FMA_MIX_F32: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[31 : 0].f32 = fma(in[0], in[1], in[2])", + VOP3POp.V_FMA_MIXLO_F16: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[15 : 0].f16 = f32_to_f16(fma(in[0], in[1], in[2]))", + VOP3POp.V_FMA_MIXHI_F16: "declare in : 32'F[3];\ndeclare S : 32'B[3];\nfor i in 0 : 2 do\nif !OPSEL_HI.u3[i] then\nin[i] = S[i].f32\nelsif OPSEL.u3[i] then\nin[i] = f16_to_f32(S[i][31 : 16].f16)\nelse\nin[i] = f16_to_f32(S[i][15 : 0].f16)\nendif\nendfor;\nD0[31 : 16].f16 = f32_to_f16(fma(in[0], in[1], in[2]))", + VOP3POp.V_DOT4_F32_FP8_BF8: "tmp = S2.f32;\ntmp += 32'F(S0[7 : 0].fp8) * 32'F(S1[7 : 0].bf8);\ntmp += 32'F(S0[15 : 8].fp8) * 32'F(S1[15 : 8].bf8);\ntmp += 32'F(S0[23 : 16].fp8) * 32'F(S1[23 : 16].bf8);\ntmp += 32'F(S0[31 : 24].fp8) * 32'F(S1[31 : 24].bf8);\nD0.f32 = tmp", + VOP3POp.V_DOT4_F32_BF8_FP8: "tmp = S2.f32;\ntmp += 32'F(S0[7 : 0].bf8) * 32'F(S1[7 : 0].fp8);\ntmp += 32'F(S0[15 : 8].bf8) * 32'F(S1[15 : 8].fp8);\ntmp += 32'F(S0[23 : 16].bf8) * 32'F(S1[23 : 16].fp8);\ntmp += 32'F(S0[31 : 24].bf8) * 32'F(S1[31 : 24].fp8);\nD0.f32 = tmp", + VOP3POp.V_DOT4_F32_FP8_FP8: "tmp = S2.f32;\ntmp += 32'F(S0[7 : 0].fp8) * 32'F(S1[7 : 0].fp8);\ntmp += 32'F(S0[15 : 8].fp8) * 32'F(S1[15 : 8].fp8);\ntmp += 32'F(S0[23 : 16].fp8) * 32'F(S1[23 : 16].fp8);\ntmp += 32'F(S0[31 : 24].fp8) * 32'F(S1[31 : 24].fp8);\nD0.f32 = tmp", + VOP3POp.V_DOT4_F32_BF8_BF8: "tmp = S2.f32;\ntmp += 32'F(S0[7 : 0].bf8) * 32'F(S1[7 : 0].bf8);\ntmp += 32'F(S0[15 : 8].bf8) * 32'F(S1[15 : 8].bf8);\ntmp += 32'F(S0[23 : 16].bf8) * 32'F(S1[23 : 16].bf8);\ntmp += 32'F(S0[31 : 24].bf8) * 32'F(S1[31 : 24].bf8);\nD0.f32 = tmp", + VOP3POp.V_WMMA_F32_16X16X16_F16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_F32_16X16X16_BF16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_F16_16X16X16_F16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_BF16_16X16X16_BF16: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_I32_16X16X16_IU8: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_I32_16X16X16_IU4: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_F32_16X16X16_FP8_FP8: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_F32_16X16X16_FP8_BF8: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_F32_16X16X16_BF8_FP8: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_F32_16X16X16_BF8_BF8: 'D = A (16x16) * B (16x16) + C (16x16)', + VOP3POp.V_WMMA_I32_16X16X32_IU4: 'D = A (16x32) * B (32x16) + C (16x16)', + VOP3POp.V_SWMMAC_F32_16X16X32_F16: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_F32_16X16X32_BF16: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_F16_16X16X32_F16: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_BF16_16X16X32_BF16: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_I32_16X16X32_IU8: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_I32_16X16X32_IU4: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_I32_16X16X64_IU4: 'D = A (sparse 16x64) * B (64x16) + D (16x16)', + VOP3POp.V_SWMMAC_F32_16X16X32_FP8_FP8: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_F32_16X16X32_FP8_BF8: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_F32_16X16X32_BF8_FP8: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3POp.V_SWMMAC_F32_16X16X32_BF8_BF8: 'D = A (sparse 16x32) * B (32x16) + D (16x16)', + VOP3SDOp.V_ADD_CO_CI_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32) + VCC.u64[laneId].u64;\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADD_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUB_CO_CI_U32: "tmp = S0.u32 - S1.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S1.u32) + VCC.u64[laneId].u64 > 64'U(S0.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUBREV_CO_CI_U32: "tmp = S1.u32 - S0.u32 - VCC.u64[laneId].u32;\nVCC.u64[laneId] = 64'U(S0.u32) + VCC.u64[laneId].u64 > 64'U(S1.u32) ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_DIV_SCALE_F32: "VCC = 0x0LL;\nif ((64'F(S2.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\nD0.f32 = NAN.f32\nelsif exponent(S2.f32) - exponent(S1.f32) >= 96 then\n// N/D near MAX_FLOAT_F32\nVCC = 0x1LL;\nif S0.f32 == S1.f32 then\n// Only scale the denominator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif S1.f32 == DENORM.f32 then\nD0.f32 = ldexp(S0.f32, 64)\nelsif ((1.0 / 64'F(S1.f32) == DENORM.f64) && (S2.f32 / S1.f32 == DENORM.f32)) then\nVCC = 0x1LL;\nif S0.f32 == S1.f32 then\n// Only scale the denominator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif 1.0 / 64'F(S1.f32) == DENORM.f64 then\nD0.f32 = ldexp(S0.f32, -64)\nelsif S2.f32 / S1.f32 == DENORM.f32 then\nVCC = 0x1LL;\nif S0.f32 == S2.f32 then\n// Only scale the numerator\nD0.f32 = ldexp(S0.f32, 64)\nendif\nelsif exponent(S2.f32) <= 23 then\n// Numerator is tiny\nD0.f32 = ldexp(S0.f32, 64)\nendif", + VOP3SDOp.V_DIV_SCALE_F64: 'VCC = 0x0LL;\nif ((S2.f64 == 0.0) || (S1.f64 == 0.0)) then\nD0.f64 = NAN.f64\nelsif exponent(S2.f64) - exponent(S1.f64) >= 768 then\n// N/D near MAX_FLOAT_F64\nVCC = 0x1LL;\nif S0.f64 == S1.f64 then\n// Only scale the denominator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif S1.f64 == DENORM.f64 then\nD0.f64 = ldexp(S0.f64, 128)\nelsif ((1.0 / S1.f64 == DENORM.f64) && (S2.f64 / S1.f64 == DENORM.f64)) then\nVCC = 0x1LL;\nif S0.f64 == S1.f64 then\n// Only scale the denominator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif 1.0 / S1.f64 == DENORM.f64 then\nD0.f64 = ldexp(S0.f64, -128)\nelsif S2.f64 / S1.f64 == DENORM.f64 then\nVCC = 0x1LL;\nif S0.f64 == S2.f64 then\n// Only scale the numerator\nD0.f64 = ldexp(S0.f64, 128)\nendif\nelsif exponent(S2.f64) <= 53 then\n// Numerator is tiny\nD0.f64 = ldexp(S0.f64, 128)\nendif', + VOP3SDOp.V_MAD_CO_U64_U32: "{ D1.u1, D0.u64 } = 65'B(65'U(S0.u32) * 65'U(S1.u32) + 65'U(S2.u64))", + VOP3SDOp.V_MAD_CO_I64_I32: "{ D1.i1, D0.i64 } = 65'B(65'I(S0.i32) * 65'I(S1.i32) + 65'I(S2.i64))", + VOP3SDOp.V_ADD_CO_U32: "tmp = 64'U(S0.u32) + 64'U(S1.u32);\nVCC.u64[laneId] = tmp >= 0x100000000ULL ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_ADD_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUB_CO_U32: "tmp = S0.u32 - S1.u32;\nVCC.u64[laneId] = S1.u32 > S0.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOP3SDOp.V_SUBREV_CO_U32: "tmp = S1.u32 - S0.u32;\nVCC.u64[laneId] = S0.u32 > S1.u32 ? 1'1U : 1'0U;\n// VCC is an UNSIGNED overflow/carry-out for V_SUB_CO_CI_U32.\nD0.u32 = tmp.u32", + VOPCOp.V_CMP_LT_F16_E32: 'D0.u64[laneId] = S0.f16 < S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F16_E32: 'D0.u64[laneId] = S0.f16 == S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F16_E32: 'D0.u64[laneId] = S0.f16 <= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F16_E32: 'D0.u64[laneId] = S0.f16 > S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F16_E32: 'D0.u64[laneId] = S0.f16 <> S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F16_E32: 'D0.u64[laneId] = S0.f16 >= S1.f16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F16_E32: "D0.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_U_F16_E32: "D0.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_NGE_F16_E32: 'D0.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F16_E32: 'D0.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F16_E32: 'D0.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F16_E32: 'D0.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F16_E32: 'D0.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F16_E32: 'D0.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_F32_E32: 'D0.u64[laneId] = S0.f32 < S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F32_E32: 'D0.u64[laneId] = S0.f32 == S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F32_E32: 'D0.u64[laneId] = S0.f32 <= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F32_E32: 'D0.u64[laneId] = S0.f32 > S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F32_E32: 'D0.u64[laneId] = S0.f32 <> S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F32_E32: 'D0.u64[laneId] = S0.f32 >= S1.f32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F32_E32: "D0.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_U_F32_E32: "D0.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)));\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_NGE_F32_E32: 'D0.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F32_E32: 'D0.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F32_E32: 'D0.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F32_E32: 'D0.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F32_E32: 'D0.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F32_E32: 'D0.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_F64_E32: 'D0.u64[laneId] = S0.f64 < S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_F64_E32: 'D0.u64[laneId] = S0.f64 == S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_F64_E32: 'D0.u64[laneId] = S0.f64 <= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_F64_E32: 'D0.u64[laneId] = S0.f64 > S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LG_F64_E32: 'D0.u64[laneId] = S0.f64 <> S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_F64_E32: 'D0.u64[laneId] = S0.f64 >= S1.f64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_O_F64_E32: 'D0.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_U_F64_E32: 'D0.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64));\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGE_F64_E32: 'D0.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLG_F64_E32: 'D0.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NGT_F64_E32: 'D0.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLE_F64_E32: 'D0.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NEQ_F64_E32: 'D0.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NLT_F64_E32: 'D0.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_I16_E32: 'D0.u64[laneId] = S0.i16 < S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I16_E32: 'D0.u64[laneId] = S0.i16 == S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I16_E32: 'D0.u64[laneId] = S0.i16 <= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I16_E32: 'D0.u64[laneId] = S0.i16 > S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I16_E32: 'D0.u64[laneId] = S0.i16 <> S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I16_E32: 'D0.u64[laneId] = S0.i16 >= S1.i16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_U16_E32: 'D0.u64[laneId] = S0.u16 < S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U16_E32: 'D0.u64[laneId] = S0.u16 == S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U16_E32: 'D0.u64[laneId] = S0.u16 <= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U16_E32: 'D0.u64[laneId] = S0.u16 > S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U16_E32: 'D0.u64[laneId] = S0.u16 <> S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U16_E32: 'D0.u64[laneId] = S0.u16 >= S1.u16;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_I32_E32: 'D0.u64[laneId] = S0.i32 < S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I32_E32: 'D0.u64[laneId] = S0.i32 == S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I32_E32: 'D0.u64[laneId] = S0.i32 <= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I32_E32: 'D0.u64[laneId] = S0.i32 > S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I32_E32: 'D0.u64[laneId] = S0.i32 <> S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I32_E32: 'D0.u64[laneId] = S0.i32 >= S1.i32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_U32_E32: 'D0.u64[laneId] = S0.u32 < S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U32_E32: 'D0.u64[laneId] = S0.u32 == S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U32_E32: 'D0.u64[laneId] = S0.u32 <= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U32_E32: 'D0.u64[laneId] = S0.u32 > S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U32_E32: 'D0.u64[laneId] = S0.u32 <> S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U32_E32: 'D0.u64[laneId] = S0.u32 >= S1.u32;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_I64_E32: 'D0.u64[laneId] = S0.i64 < S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_I64_E32: 'D0.u64[laneId] = S0.i64 == S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_I64_E32: 'D0.u64[laneId] = S0.i64 <= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_I64_E32: 'D0.u64[laneId] = S0.i64 > S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_I64_E32: 'D0.u64[laneId] = S0.i64 <> S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_I64_E32: 'D0.u64[laneId] = S0.i64 >= S1.i64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LT_U64_E32: 'D0.u64[laneId] = S0.u64 < S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_EQ_U64_E32: 'D0.u64[laneId] = S0.u64 == S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_LE_U64_E32: 'D0.u64[laneId] = S0.u64 <= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GT_U64_E32: 'D0.u64[laneId] = S0.u64 > S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_NE_U64_E32: 'D0.u64[laneId] = S0.u64 <> S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_GE_U64_E32: 'D0.u64[laneId] = S0.u64 >= S1.u64;\n// D0 = VCC in VOPC encoding.', + VOPCOp.V_CMP_CLASS_F16_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_CLASS_F32_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMP_CLASS_F64_E32: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nD0.u64[laneId] = result;\n// D0 = VCC in VOPC encoding.", + VOPCOp.V_CMPX_LT_F16_E32: 'EXEC.u64[laneId] = S0.f16 < S1.f16', + VOPCOp.V_CMPX_EQ_F16_E32: 'EXEC.u64[laneId] = S0.f16 == S1.f16', + VOPCOp.V_CMPX_LE_F16_E32: 'EXEC.u64[laneId] = S0.f16 <= S1.f16', + VOPCOp.V_CMPX_GT_F16_E32: 'EXEC.u64[laneId] = S0.f16 > S1.f16', + VOPCOp.V_CMPX_LG_F16_E32: 'EXEC.u64[laneId] = S0.f16 <> S1.f16', + VOPCOp.V_CMPX_GE_F16_E32: 'EXEC.u64[laneId] = S0.f16 >= S1.f16', + VOPCOp.V_CMPX_O_F16_E32: "EXEC.u64[laneId] = (!isNAN(64'F(S0.f16)) && !isNAN(64'F(S1.f16)))", + VOPCOp.V_CMPX_U_F16_E32: "EXEC.u64[laneId] = (isNAN(64'F(S0.f16)) || isNAN(64'F(S1.f16)))", + VOPCOp.V_CMPX_NGE_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 >= S1.f16);\n// With NAN inputs this is not the same operation as <', + VOPCOp.V_CMPX_NLG_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 <> S1.f16);\n// With NAN inputs this is not the same operation as ==', + VOPCOp.V_CMPX_NGT_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 > S1.f16);\n// With NAN inputs this is not the same operation as <=', + VOPCOp.V_CMPX_NLE_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 <= S1.f16);\n// With NAN inputs this is not the same operation as >', + VOPCOp.V_CMPX_NEQ_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 == S1.f16);\n// With NAN inputs this is not the same operation as !=', + VOPCOp.V_CMPX_NLT_F16_E32: 'EXEC.u64[laneId] = !(S0.f16 < S1.f16);\n// With NAN inputs this is not the same operation as >=', + VOPCOp.V_CMPX_LT_F32_E32: 'EXEC.u64[laneId] = S0.f32 < S1.f32', + VOPCOp.V_CMPX_EQ_F32_E32: 'EXEC.u64[laneId] = S0.f32 == S1.f32', + VOPCOp.V_CMPX_LE_F32_E32: 'EXEC.u64[laneId] = S0.f32 <= S1.f32', + VOPCOp.V_CMPX_GT_F32_E32: 'EXEC.u64[laneId] = S0.f32 > S1.f32', + VOPCOp.V_CMPX_LG_F32_E32: 'EXEC.u64[laneId] = S0.f32 <> S1.f32', + VOPCOp.V_CMPX_GE_F32_E32: 'EXEC.u64[laneId] = S0.f32 >= S1.f32', + VOPCOp.V_CMPX_O_F32_E32: "EXEC.u64[laneId] = (!isNAN(64'F(S0.f32)) && !isNAN(64'F(S1.f32)))", + VOPCOp.V_CMPX_U_F32_E32: "EXEC.u64[laneId] = (isNAN(64'F(S0.f32)) || isNAN(64'F(S1.f32)))", + VOPCOp.V_CMPX_NGE_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 >= S1.f32);\n// With NAN inputs this is not the same operation as <', + VOPCOp.V_CMPX_NLG_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 <> S1.f32);\n// With NAN inputs this is not the same operation as ==', + VOPCOp.V_CMPX_NGT_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 > S1.f32);\n// With NAN inputs this is not the same operation as <=', + VOPCOp.V_CMPX_NLE_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 <= S1.f32);\n// With NAN inputs this is not the same operation as >', + VOPCOp.V_CMPX_NEQ_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 == S1.f32);\n// With NAN inputs this is not the same operation as !=', + VOPCOp.V_CMPX_NLT_F32_E32: 'EXEC.u64[laneId] = !(S0.f32 < S1.f32);\n// With NAN inputs this is not the same operation as >=', + VOPCOp.V_CMPX_LT_F64_E32: 'EXEC.u64[laneId] = S0.f64 < S1.f64', + VOPCOp.V_CMPX_EQ_F64_E32: 'EXEC.u64[laneId] = S0.f64 == S1.f64', + VOPCOp.V_CMPX_LE_F64_E32: 'EXEC.u64[laneId] = S0.f64 <= S1.f64', + VOPCOp.V_CMPX_GT_F64_E32: 'EXEC.u64[laneId] = S0.f64 > S1.f64', + VOPCOp.V_CMPX_LG_F64_E32: 'EXEC.u64[laneId] = S0.f64 <> S1.f64', + VOPCOp.V_CMPX_GE_F64_E32: 'EXEC.u64[laneId] = S0.f64 >= S1.f64', + VOPCOp.V_CMPX_O_F64_E32: 'EXEC.u64[laneId] = (!isNAN(S0.f64) && !isNAN(S1.f64))', + VOPCOp.V_CMPX_U_F64_E32: 'EXEC.u64[laneId] = (isNAN(S0.f64) || isNAN(S1.f64))', + VOPCOp.V_CMPX_NGE_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 >= S1.f64);\n// With NAN inputs this is not the same operation as <', + VOPCOp.V_CMPX_NLG_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 <> S1.f64);\n// With NAN inputs this is not the same operation as ==', + VOPCOp.V_CMPX_NGT_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 > S1.f64);\n// With NAN inputs this is not the same operation as <=', + VOPCOp.V_CMPX_NLE_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 <= S1.f64);\n// With NAN inputs this is not the same operation as >', + VOPCOp.V_CMPX_NEQ_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 == S1.f64);\n// With NAN inputs this is not the same operation as !=', + VOPCOp.V_CMPX_NLT_F64_E32: 'EXEC.u64[laneId] = !(S0.f64 < S1.f64);\n// With NAN inputs this is not the same operation as >=', + VOPCOp.V_CMPX_LT_I16_E32: 'EXEC.u64[laneId] = S0.i16 < S1.i16', + VOPCOp.V_CMPX_EQ_I16_E32: 'EXEC.u64[laneId] = S0.i16 == S1.i16', + VOPCOp.V_CMPX_LE_I16_E32: 'EXEC.u64[laneId] = S0.i16 <= S1.i16', + VOPCOp.V_CMPX_GT_I16_E32: 'EXEC.u64[laneId] = S0.i16 > S1.i16', + VOPCOp.V_CMPX_NE_I16_E32: 'EXEC.u64[laneId] = S0.i16 <> S1.i16', + VOPCOp.V_CMPX_GE_I16_E32: 'EXEC.u64[laneId] = S0.i16 >= S1.i16', + VOPCOp.V_CMPX_LT_U16_E32: 'EXEC.u64[laneId] = S0.u16 < S1.u16', + VOPCOp.V_CMPX_EQ_U16_E32: 'EXEC.u64[laneId] = S0.u16 == S1.u16', + VOPCOp.V_CMPX_LE_U16_E32: 'EXEC.u64[laneId] = S0.u16 <= S1.u16', + VOPCOp.V_CMPX_GT_U16_E32: 'EXEC.u64[laneId] = S0.u16 > S1.u16', + VOPCOp.V_CMPX_NE_U16_E32: 'EXEC.u64[laneId] = S0.u16 <> S1.u16', + VOPCOp.V_CMPX_GE_U16_E32: 'EXEC.u64[laneId] = S0.u16 >= S1.u16', + VOPCOp.V_CMPX_LT_I32_E32: 'EXEC.u64[laneId] = S0.i32 < S1.i32', + VOPCOp.V_CMPX_EQ_I32_E32: 'EXEC.u64[laneId] = S0.i32 == S1.i32', + VOPCOp.V_CMPX_LE_I32_E32: 'EXEC.u64[laneId] = S0.i32 <= S1.i32', + VOPCOp.V_CMPX_GT_I32_E32: 'EXEC.u64[laneId] = S0.i32 > S1.i32', + VOPCOp.V_CMPX_NE_I32_E32: 'EXEC.u64[laneId] = S0.i32 <> S1.i32', + VOPCOp.V_CMPX_GE_I32_E32: 'EXEC.u64[laneId] = S0.i32 >= S1.i32', + VOPCOp.V_CMPX_LT_U32_E32: 'EXEC.u64[laneId] = S0.u32 < S1.u32', + VOPCOp.V_CMPX_EQ_U32_E32: 'EXEC.u64[laneId] = S0.u32 == S1.u32', + VOPCOp.V_CMPX_LE_U32_E32: 'EXEC.u64[laneId] = S0.u32 <= S1.u32', + VOPCOp.V_CMPX_GT_U32_E32: 'EXEC.u64[laneId] = S0.u32 > S1.u32', + VOPCOp.V_CMPX_NE_U32_E32: 'EXEC.u64[laneId] = S0.u32 <> S1.u32', + VOPCOp.V_CMPX_GE_U32_E32: 'EXEC.u64[laneId] = S0.u32 >= S1.u32', + VOPCOp.V_CMPX_LT_I64_E32: 'EXEC.u64[laneId] = S0.i64 < S1.i64', + VOPCOp.V_CMPX_EQ_I64_E32: 'EXEC.u64[laneId] = S0.i64 == S1.i64', + VOPCOp.V_CMPX_LE_I64_E32: 'EXEC.u64[laneId] = S0.i64 <= S1.i64', + VOPCOp.V_CMPX_GT_I64_E32: 'EXEC.u64[laneId] = S0.i64 > S1.i64', + VOPCOp.V_CMPX_NE_I64_E32: 'EXEC.u64[laneId] = S0.i64 <> S1.i64', + VOPCOp.V_CMPX_GE_I64_E32: 'EXEC.u64[laneId] = S0.i64 >= S1.i64', + VOPCOp.V_CMPX_LT_U64_E32: 'EXEC.u64[laneId] = S0.u64 < S1.u64', + VOPCOp.V_CMPX_EQ_U64_E32: 'EXEC.u64[laneId] = S0.u64 == S1.u64', + VOPCOp.V_CMPX_LE_U64_E32: 'EXEC.u64[laneId] = S0.u64 <= S1.u64', + VOPCOp.V_CMPX_GT_U64_E32: 'EXEC.u64[laneId] = S0.u64 > S1.u64', + VOPCOp.V_CMPX_NE_U64_E32: 'EXEC.u64[laneId] = S0.u64 <> S1.u64', + VOPCOp.V_CMPX_GE_U64_E32: 'EXEC.u64[laneId] = S0.u64 >= S1.u64', + VOPCOp.V_CMPX_CLASS_F16_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f16)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f16)) then\nresult = S1.u32[1]\nelsif exponent(S0.f16) == 31 then\n// +-INF\nresult = S1.u32[sign(S0.f16) ? 2 : 9]\nelsif exponent(S0.f16) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f16) ? 3 : 8]\nelsif 64'F(abs(S0.f16)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f16) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f16) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOPCOp.V_CMPX_CLASS_F32_E32: "declare result : 1'U;\nif isSignalNAN(64'F(S0.f32)) then\nresult = S1.u32[0]\nelsif isQuietNAN(64'F(S0.f32)) then\nresult = S1.u32[1]\nelsif exponent(S0.f32) == 255 then\n// +-INF\nresult = S1.u32[sign(S0.f32) ? 2 : 9]\nelsif exponent(S0.f32) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f32) ? 3 : 8]\nelsif 64'F(abs(S0.f32)) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f32) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f32) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOPCOp.V_CMPX_CLASS_F64_E32: "declare result : 1'U;\nif isSignalNAN(S0.f64) then\nresult = S1.u32[0]\nelsif isQuietNAN(S0.f64) then\nresult = S1.u32[1]\nelsif exponent(S0.f64) == 2047 then\n// +-INF\nresult = S1.u32[sign(S0.f64) ? 2 : 9]\nelsif exponent(S0.f64) > 0 then\n// +-normal value\nresult = S1.u32[sign(S0.f64) ? 3 : 8]\nelsif abs(S0.f64) > 0.0 then\n// +-denormal value\nresult = S1.u32[sign(S0.f64) ? 4 : 7]\nelse\n// +-0.0\nresult = S1.u32[sign(S0.f64) ? 5 : 6]\nendif;\nEXEC.u64[laneId] = result", + VOPDOp.V_DUAL_FMAC_F32: 'D0.f32 = fma(S0.f32, S1.f32, D0.f32)', + VOPDOp.V_DUAL_FMAAK_F32: 'D0.f32 = fma(S0.f32, S1.f32, SIMM32.f32)', + VOPDOp.V_DUAL_FMAMK_F32: 'D0.f32 = fma(S0.f32, SIMM32.f32, S1.f32)', + VOPDOp.V_DUAL_MUL_F32: 'D0.f32 = S0.f32 * S1.f32', + VOPDOp.V_DUAL_ADD_F32: 'D0.f32 = S0.f32 + S1.f32', + VOPDOp.V_DUAL_SUB_F32: 'D0.f32 = S0.f32 - S1.f32', + VOPDOp.V_DUAL_SUBREV_F32: 'D0.f32 = S1.f32 - S0.f32', + VOPDOp.V_DUAL_MUL_DX9_ZERO_F32: "if ((64'F(S0.f32) == 0.0) || (64'F(S1.f32) == 0.0)) then\n// DX9 rules, 0.0 * x = 0.0\nD0.f32 = 0.0F\nelse\nD0.f32 = S0.f32 * S1.f32\nendif", + VOPDOp.V_DUAL_MOV_B32: 'D0.b32 = S0.b32', + VOPDOp.V_DUAL_CNDMASK_B32: 'D0.u32 = VCC.u64[laneId] ? S1.u32 : S0.u32', + VOPDOp.V_DUAL_MAX_NUM_F32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f32)) && isNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((S0.f32 > S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && !sign(S0.f32) &&\nsign(S1.f32))) then\n// NOTE: +0>-0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + VOPDOp.V_DUAL_MIN_NUM_F32: "if (isSignalNAN(64'F(S0.f32)) || isSignalNAN(64'F(S1.f32))) then\nTRAPSTS.INVALID = 1\nendif;\nif (isNAN(64'F(S0.f32)) && isNAN(64'F(S1.f32))) then\nD0.f32 = 32'F(cvtToQuietNAN(64'F(S0.f32)))\nelsif isNAN(64'F(S0.f32)) then\nD0.f32 = S1.f32\nelsif isNAN(64'F(S1.f32)) then\nD0.f32 = S0.f32\nelsif ((S0.f32 < S1.f32) || ((abs(S0.f32) == 0.0F) && (abs(S1.f32) == 0.0F) && sign(S0.f32) &&\n!sign(S1.f32))) then\n// NOTE: -0<+0 is TRUE in this comparison\nD0.f32 = S0.f32\nelse\nD0.f32 = S1.f32\nendif", + VOPDOp.V_DUAL_DOT2ACC_F32_F16: 'tmp = D0.f32;\ntmp += f16_to_f32(S0[15 : 0].f16) * f16_to_f32(S1[15 : 0].f16);\ntmp += f16_to_f32(S0[31 : 16].f16) * f16_to_f32(S1[31 : 16].f16);\nD0.f32 = tmp', + VOPDOp.V_DUAL_DOT2ACC_F32_BF16: 'tmp = D0.f32;\ntmp += bf16_to_f32(S0[15 : 0].bf16) * bf16_to_f32(S1[15 : 0].bf16);\ntmp += bf16_to_f32(S0[31 : 16].bf16) * bf16_to_f32(S1[31 : 16].bf16);\nD0.f32 = tmp', + VOPDOp.V_DUAL_ADD_NC_U32: 'D0.u32 = S0.u32 + S1.u32', + VOPDOp.V_DUAL_LSHLREV_B32: 'D0.u32 = (S1.u32 << S0[4 : 0].u32)', + VOPDOp.V_DUAL_AND_B32: 'D0.u32 = (S0.u32 & S1.u32)', + VSAMPLEOp.IMAGE_GET_LOD: 'VDATA[0] = clampedLOD;\nVDATA[1] = rawLOD.', + VSCRATCHOp.SCRATCH_LOAD_U8: "addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA.u32 = 32'U({ 24'0U, MEM[addr].u8 })", + VSCRATCHOp.SCRATCH_LOAD_I8: "addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA.i32 = 32'I(signext(MEM[addr].i8))", + VSCRATCHOp.SCRATCH_LOAD_U16: "addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA.u32 = 32'U({ 16'0U, MEM[addr].u16 })", + VSCRATCHOp.SCRATCH_LOAD_I16: "addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA.i32 = 32'I(signext(MEM[addr].i16))", + VSCRATCHOp.SCRATCH_LOAD_B32: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[31 : 0] = MEM[addr].b32', + VSCRATCHOp.SCRATCH_LOAD_B64: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32', + VSCRATCHOp.SCRATCH_LOAD_B96: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32', + VSCRATCHOp.SCRATCH_LOAD_B128: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[31 : 0] = MEM[addr].b32;\nVDATA[63 : 32] = MEM[addr + 4U].b32;\nVDATA[95 : 64] = MEM[addr + 8U].b32;\nVDATA[127 : 96] = MEM[addr + 12U].b32', + VSCRATCHOp.SCRATCH_STORE_B8: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nMEM[addr].b8 = VDATA[7 : 0]', + VSCRATCHOp.SCRATCH_STORE_B16: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nMEM[addr].b16 = VDATA[15 : 0]', + VSCRATCHOp.SCRATCH_STORE_B32: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nMEM[addr].b32 = VDATA[31 : 0]', + VSCRATCHOp.SCRATCH_STORE_B64: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32]', + VSCRATCHOp.SCRATCH_STORE_B96: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64]', + VSCRATCHOp.SCRATCH_STORE_B128: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nMEM[addr].b32 = VDATA[31 : 0];\nMEM[addr + 4U].b32 = VDATA[63 : 32];\nMEM[addr + 8U].b32 = VDATA[95 : 64];\nMEM[addr + 12U].b32 = VDATA[127 : 96]', + VSCRATCHOp.SCRATCH_LOAD_D16_U8: "addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[15 : 0].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[31:16] is preserved.", + VSCRATCHOp.SCRATCH_LOAD_D16_I8: "addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[15 : 0].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[31:16] is preserved.", + VSCRATCHOp.SCRATCH_LOAD_D16_B16: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[15 : 0].b16 = MEM[addr].b16;\n// VDATA[31:16] is preserved.', + VSCRATCHOp.SCRATCH_LOAD_D16_HI_U8: "addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[31 : 16].u16 = 16'U({ 8'0U, MEM[addr].u8 });\n// VDATA[15:0] is preserved.", + VSCRATCHOp.SCRATCH_LOAD_D16_HI_I8: "addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[31 : 16].i16 = 16'I(signext(MEM[addr].i8));\n// VDATA[15:0] is preserved.", + VSCRATCHOp.SCRATCH_LOAD_D16_HI_B16: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nVDATA[31 : 16].b16 = MEM[addr].b16;\n// VDATA[15:0] is preserved.', + VSCRATCHOp.SCRATCH_STORE_D16_HI_B8: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nMEM[addr].b8 = VDATA[23 : 16]', + VSCRATCHOp.SCRATCH_STORE_D16_HI_B16: 'addr = CalcScratchAddr(v_addr_off.b64, s_saddr_off.b64);\nMEM[addr].b16 = VDATA[31 : 16]', + VSCRATCHOp.SCRATCH_LOAD_BLOCK: 'for i in 0 : 31 do\n// Algorithm can skip over "holes" both in the memory block and VGPR block.\nif M0[i].u1 then\nVGPR[laneId][VDST.u32 + i.u32] = MEM[VGPR[laneId][ADDR].i32 + i * 4].b32\nendif\nendfor', + VSCRATCHOp.SCRATCH_STORE_BLOCK: 'for i in 0 : 31 do\n// Algorithm can skip over "holes" both in the memory block and VGPR block.\nif M0[i].u1 then\nMEM[VGPR[laneId][ADDR].i32 + i * 4] = VGPR[laneId][VDATA.u32 + i.u32].b32\nendif\nendfor', +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amd_gpu.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amd_gpu.py new file mode 100644 index 000000000..f47a44fff --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amd_gpu.py @@ -0,0 +1,12924 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG(c.Struct): + SIZE = 28 + HEADER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION + COUNT_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION + PARAMETER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION + SRC_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION + SRC_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + extra_info: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('extra_info', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION(c.Struct): + SIZE = 4 + count: int + reserved_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION.register_fields([('count', ctypes.c_uint32, 0, 22, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 6), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION(c.Struct): + SIZE = 4 + reserved_0: int + dst_swap: int + reserved_1: int + src_swap: int + reserved_2: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION.register_fields([('reserved_0', ctypes.c_uint32, 0, 16, 0), ('dst_swap', ctypes.c_uint32, 2, 2, 0), ('reserved_1', ctypes.c_uint32, 2, 6, 2), ('src_swap', ctypes.c_uint32, 3, 2, 0), ('reserved_2', ctypes.c_uint32, 3, 6, 2), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION(c.Struct): + SIZE = 4 + src_addr_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION.register_fields([('src_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION(c.Struct): + SIZE = 4 + src_addr_63_32: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION.register_fields([('src_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_HEADER_UNION, 0), ('COUNT_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_COUNT_UNION, 4), ('PARAMETER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_PARAMETER_UNION, 8), ('SRC_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_LO_UNION, 12), ('SRC_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_SRC_ADDR_HI_UNION, 16), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_LO_UNION, 20), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG_DST_ADDR_HI_UNION, 24)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR: TypeAlias = rocr_AMD_SDMA_PKT_COPY_LINEAR_TAG +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG(c.Struct): + SIZE = 52 + HEADER_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION + SRC_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION + SRC_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION + SRC_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION + SRC_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION + SRC_PARAMETER_3_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION + DST_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION + DST_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION + DST_PARAMETER_3_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION + RECT_PARAMETER_1_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION + RECT_PARAMETER_2_UNION: rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved: int + element: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved', ctypes.c_uint32, 2, 13, 0), ('element', ctypes.c_uint32, 3, 3, 5), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION(c.Struct): + SIZE = 4 + src_addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION.register_fields([('src_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION(c.Struct): + SIZE = 4 + src_addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION.register_fields([('src_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + src_offset_x: int + reserved_1: int + src_offset_y: int + reserved_2: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION.register_fields([('src_offset_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('src_offset_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + src_offset_z: int + reserved_1: int + src_pitch: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION.register_fields([('src_offset_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 3), ('src_pitch', ctypes.c_uint32, 1, 19, 5), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION(c.Struct): + SIZE = 4 + src_slice_pitch: int + reserved_1: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION.register_fields([('src_slice_pitch', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_7_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_7_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + dst_offset_x: int + reserved_1: int + dst_offset_y: int + reserved_2: int + DW_8_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION.register_fields([('dst_offset_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('dst_offset_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_8_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + dst_offset_z: int + reserved_1: int + dst_pitch: int + DW_9_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION.register_fields([('dst_offset_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 3), ('dst_pitch', ctypes.c_uint32, 1, 19, 5), ('DW_9_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION(c.Struct): + SIZE = 4 + dst_slice_pitch: int + reserved_1: int + DW_10_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION.register_fields([('dst_slice_pitch', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_10_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION(c.Struct): + SIZE = 4 + rect_x: int + reserved_1: int + rect_y: int + reserved_2: int + DW_11_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION.register_fields([('rect_x', ctypes.c_uint32, 0, 14, 0), ('reserved_1', ctypes.c_uint32, 1, 2, 6), ('rect_y', ctypes.c_uint32, 2, 14, 0), ('reserved_2', ctypes.c_uint32, 3, 2, 6), ('DW_11_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION(c.Struct): + SIZE = 4 + rect_z: int + reserved_1: int + dst_swap: int + reserved_2: int + src_swap: int + reserved_3: int + DW_12_DATA: int +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION.register_fields([('rect_z', ctypes.c_uint32, 0, 11, 0), ('reserved_1', ctypes.c_uint32, 1, 5, 3), ('dst_swap', ctypes.c_uint32, 2, 2, 0), ('reserved_2', ctypes.c_uint32, 2, 6, 2), ('src_swap', ctypes.c_uint32, 3, 2, 0), ('reserved_3', ctypes.c_uint32, 3, 6, 2), ('DW_12_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_HEADER_UNION, 0), ('SRC_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_LO_UNION, 4), ('SRC_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_ADDR_HI_UNION, 8), ('SRC_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_1_UNION, 12), ('SRC_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_2_UNION, 16), ('SRC_PARAMETER_3_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_SRC_PARAMETER_3_UNION, 20), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_LO_UNION, 24), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_ADDR_HI_UNION, 28), ('DST_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_1_UNION, 32), ('DST_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_2_UNION, 36), ('DST_PARAMETER_3_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_DST_PARAMETER_3_UNION, 40), ('RECT_PARAMETER_1_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_1_UNION, 44), ('RECT_PARAMETER_2_UNION', rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG_RECT_PARAMETER_2_UNION, 48)]) +rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT: TypeAlias = rocr_AMD_SDMA_PKT_COPY_LINEAR_RECT_TAG +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG(c.Struct): + SIZE = 20 + HEADER_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION + DST_ADDR_LO_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION + DST_ADDR_HI_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION + DATA_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION + COUNT_UNION: rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + sw: int + reserved_0: int + fillsize: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('sw', ctypes.c_uint32, 2, 2, 0), ('reserved_0', ctypes.c_uint32, 2, 12, 2), ('fillsize', ctypes.c_uint32, 3, 2, 6), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION(c.Struct): + SIZE = 4 + dst_addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION.register_fields([('dst_addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION(c.Struct): + SIZE = 4 + dst_addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION.register_fields([('dst_addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION(c.Struct): + SIZE = 4 + src_data_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION.register_fields([('src_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION(c.Struct): + SIZE = 4 + count: int + reserved_0: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION.register_fields([('count', ctypes.c_uint32, 0, 22, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 6), ('DW_4_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_HEADER_UNION, 0), ('DST_ADDR_LO_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_LO_UNION, 4), ('DST_ADDR_HI_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DST_ADDR_HI_UNION, 8), ('DATA_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_DATA_UNION, 12), ('COUNT_UNION', rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG_COUNT_UNION, 16)]) +rocr_AMD_SDMA_PKT_CONSTANT_FILL: TypeAlias = rocr_AMD_SDMA_PKT_CONSTANT_FILL_TAG +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG(c.Struct): + SIZE = 16 + HEADER_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION + DATA_UNION: rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + mtype: int + gcc: int + sys: int + pad1: int + snp: int + gpa: int + l2_policy: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('mtype', ctypes.c_uint32, 2, 3, 0), ('gcc', ctypes.c_uint32, 2, 1, 3), ('sys', ctypes.c_uint32, 2, 1, 4), ('pad1', ctypes.c_uint32, 2, 1, 5), ('snp', ctypes.c_uint32, 2, 1, 6), ('gpa', ctypes.c_uint32, 2, 1, 7), ('l2_policy', ctypes.c_uint32, 3, 2, 0), ('reserved_0', ctypes.c_uint32, 3, 6, 2), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION(c.Struct): + SIZE = 4 + data: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION.register_fields([('data', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_FENCE_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_ADDR_HI_UNION, 8), ('DATA_UNION', rocr_AMD_SDMA_PKT_FENCE_TAG_DATA_UNION, 12)]) +rocr_AMD_SDMA_PKT_FENCE: TypeAlias = rocr_AMD_SDMA_PKT_FENCE_TAG +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG(c.Struct): + SIZE = 24 + HEADER_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION + VALUE_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION + MASK_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION + DW5_UNION: rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + hdp_flush: int + reserved_1: int + func: int + mem_poll: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 10, 0), ('hdp_flush', ctypes.c_uint32, 3, 1, 2), ('reserved_1', ctypes.c_uint32, 3, 1, 3), ('func', ctypes.c_uint32, 3, 3, 4), ('mem_poll', ctypes.c_uint32, 3, 1, 7), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION(c.Struct): + SIZE = 4 + value: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION.register_fields([('value', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION(c.Struct): + SIZE = 4 + mask: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION.register_fields([('mask', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION(c.Struct): + SIZE = 4 + interval: int + retry_count: int + reserved_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION.register_fields([('interval', ctypes.c_uint32, 0, 16, 0), ('retry_count', ctypes.c_uint32, 2, 12, 0), ('reserved_0', ctypes.c_uint32, 3, 4, 4), ('DW_5_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_ADDR_HI_UNION, 8), ('VALUE_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_VALUE_UNION, 12), ('MASK_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_MASK_UNION, 16), ('DW5_UNION', rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG_DW5_UNION, 20)]) +rocr_AMD_SDMA_PKT_POLL_REGMEM: TypeAlias = rocr_AMD_SDMA_PKT_POLL_REGMEM_TAG +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG(c.Struct): + SIZE = 32 + HEADER_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION + SRC_DATA_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION + SRC_DATA_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION + CMP_DATA_LO_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION + CMP_DATA_HI_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION + LOOP_UNION: rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + l: int + reserved_0: int + operation: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('l', ctypes.c_uint32, 2, 1, 0), ('reserved_0', ctypes.c_uint32, 2, 8, 1), ('operation', ctypes.c_uint32, 3, 7, 1), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION(c.Struct): + SIZE = 4 + src_data_31_0: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION.register_fields([('src_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION(c.Struct): + SIZE = 4 + src_data_63_32: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION.register_fields([('src_data_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION(c.Struct): + SIZE = 4 + cmp_data_31_0: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION.register_fields([('cmp_data_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_5_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION(c.Struct): + SIZE = 4 + cmp_data_63_32: int + DW_6_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION.register_fields([('cmp_data_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_6_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION(c.Struct): + SIZE = 4 + loop_interval: int + reserved_0: int + DW_7_DATA: int +rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION.register_fields([('loop_interval', ctypes.c_uint32, 0, 13, 0), ('reserved_0', ctypes.c_uint32, 1, 19, 5), ('DW_7_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_ATOMIC_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_ADDR_HI_UNION, 8), ('SRC_DATA_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_LO_UNION, 12), ('SRC_DATA_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_SRC_DATA_HI_UNION, 16), ('CMP_DATA_LO_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_LO_UNION, 20), ('CMP_DATA_HI_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_CMP_DATA_HI_UNION, 24), ('LOOP_UNION', rocr_AMD_SDMA_PKT_ATOMIC_TAG_LOOP_UNION, 28)]) +rocr_AMD_SDMA_PKT_ATOMIC: TypeAlias = rocr_AMD_SDMA_PKT_ATOMIC_TAG +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG(c.Struct): + SIZE = 12 + HEADER_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION + ADDR_LO_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION + ADDR_HI_UNION: rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION(c.Struct): + SIZE = 4 + addr_31_0: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION.register_fields([('addr_31_0', ctypes.c_uint32, 0, 32, 0), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION(c.Struct): + SIZE = 4 + addr_63_32: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION.register_fields([('addr_63_32', ctypes.c_uint32, 0, 32, 0), ('DW_2_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_TIMESTAMP_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_HEADER_UNION, 0), ('ADDR_LO_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_LO_UNION, 4), ('ADDR_HI_UNION', rocr_AMD_SDMA_PKT_TIMESTAMP_TAG_ADDR_HI_UNION, 8)]) +rocr_AMD_SDMA_PKT_TIMESTAMP: TypeAlias = rocr_AMD_SDMA_PKT_TIMESTAMP_TAG +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG(c.Struct): + SIZE = 8 + HEADER_UNION: rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION + INT_CONTEXT_UNION: rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + reserved_0: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('reserved_0', ctypes.c_uint32, 2, 16, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION(c.Struct): + SIZE = 4 + int_ctx: int + reserved_1: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION.register_fields([('int_ctx', ctypes.c_uint32, 0, 28, 0), ('reserved_1', ctypes.c_uint32, 3, 4, 4), ('DW_1_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_TRAP_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_TRAP_TAG_HEADER_UNION, 0), ('INT_CONTEXT_UNION', rocr_AMD_SDMA_PKT_TRAP_TAG_INT_CONTEXT_UNION, 4)]) +rocr_AMD_SDMA_PKT_TRAP: TypeAlias = rocr_AMD_SDMA_PKT_TRAP_TAG +@c.record +class rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG(c.Struct): + SIZE = 24 + DW_0_DATA: int + DW_1_DATA: int + DW_2_DATA: int + DW_3_DATA: int + DW_4_DATA: int + DW_5_DATA: int +rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG.register_fields([('DW_0_DATA', ctypes.c_uint32, 0), ('DW_1_DATA', ctypes.c_uint32, 4), ('DW_2_DATA', ctypes.c_uint32, 8), ('DW_3_DATA', ctypes.c_uint32, 12), ('DW_4_DATA', ctypes.c_uint32, 16), ('DW_5_DATA', ctypes.c_uint32, 20)]) +rocr_AMD_SDMA_PKT_HDP_FLUSH: TypeAlias = rocr_AMD_SDMA_PKT_HDP_FLUSH_TAG +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG(c.Struct): + SIZE = 20 + HEADER_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION + WORD1_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION + WORD2_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION + WORD3_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION + WORD4_UNION: rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION(c.Struct): + SIZE = 4 + op: int + sub_op: int + DW_0_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION.register_fields([('op', ctypes.c_uint32, 0, 8, 0), ('sub_op', ctypes.c_uint32, 1, 8, 0), ('DW_0_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION(c.Struct): + SIZE = 4 + BaseVA_LO: int + DW_1_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION.register_fields([('BaseVA_LO', ctypes.c_uint32, 0, 25, 7), ('DW_1_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION(c.Struct): + SIZE = 4 + BaseVA_HI: int + GCR_CONTROL_GLI_INV: int + GCR_CONTROL_GL1_RANGE: int + GCR_CONTROL_GLM_WB: int + GCR_CONTROL_GLM_INV: int + GCR_CONTROL_GLK_WB: int + GCR_CONTROL_GLK_INV: int + GCR_CONTROL_GLV_INV: int + GCR_CONTROL_GL1_INV: int + GCR_CONTROL_GL2_US: int + GCR_CONTROL_GL2_RANGE: int + GCR_CONTROL_GL2_DISCARD: int + GCR_CONTROL_GL2_INV: int + GCR_CONTROL_GL2_WB: int + DW_2_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION.register_fields([('BaseVA_HI', ctypes.c_uint32, 0, 16, 0), ('GCR_CONTROL_GLI_INV', ctypes.c_uint32, 2, 2, 0), ('GCR_CONTROL_GL1_RANGE', ctypes.c_uint32, 2, 2, 2), ('GCR_CONTROL_GLM_WB', ctypes.c_uint32, 2, 1, 4), ('GCR_CONTROL_GLM_INV', ctypes.c_uint32, 2, 1, 5), ('GCR_CONTROL_GLK_WB', ctypes.c_uint32, 2, 1, 6), ('GCR_CONTROL_GLK_INV', ctypes.c_uint32, 2, 1, 7), ('GCR_CONTROL_GLV_INV', ctypes.c_uint32, 3, 1, 0), ('GCR_CONTROL_GL1_INV', ctypes.c_uint32, 3, 1, 1), ('GCR_CONTROL_GL2_US', ctypes.c_uint32, 3, 1, 2), ('GCR_CONTROL_GL2_RANGE', ctypes.c_uint32, 3, 2, 3), ('GCR_CONTROL_GL2_DISCARD', ctypes.c_uint32, 3, 1, 5), ('GCR_CONTROL_GL2_INV', ctypes.c_uint32, 3, 1, 6), ('GCR_CONTROL_GL2_WB', ctypes.c_uint32, 3, 1, 7), ('DW_2_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION(c.Struct): + SIZE = 4 + GCR_CONTROL_RANGE_IS_PA: int + GCR_CONTROL_SEQ: int + LimitVA_LO: int + DW_3_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION.register_fields([('GCR_CONTROL_RANGE_IS_PA', ctypes.c_uint32, 0, 1, 0), ('GCR_CONTROL_SEQ', ctypes.c_uint32, 0, 2, 1), ('LimitVA_LO', ctypes.c_uint32, 0, 25, 7), ('DW_3_DATA', ctypes.c_uint32, 0)]) +@c.record +class rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION(c.Struct): + SIZE = 4 + LimitVA_HI: int + VMID: int + DW_4_DATA: int +rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION.register_fields([('LimitVA_HI', ctypes.c_uint32, 0, 16, 0), ('VMID', ctypes.c_uint32, 3, 4, 0), ('DW_4_DATA', ctypes.c_uint32, 0)]) +rocr_AMD_SDMA_PKT_GCR_TAG.register_fields([('HEADER_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_HEADER_UNION, 0), ('WORD1_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD1_UNION, 4), ('WORD2_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD2_UNION, 8), ('WORD3_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD3_UNION, 12), ('WORD4_UNION', rocr_AMD_SDMA_PKT_GCR_TAG_WORD4_UNION, 16)]) +rocr_AMD_SDMA_PKT_GCR: TypeAlias = rocr_AMD_SDMA_PKT_GCR_TAG +@c.record +class IP_BASE_INSTANCE(c.Struct): + SIZE = 20 + segment: c.Array[ctypes.c_uint32, Literal[5]] +IP_BASE_INSTANCE.register_fields([('segment', c.Array[ctypes.c_uint32, Literal[5]], 0)]) +@c.record +class IP_BASE(c.Struct): + SIZE = 140 + instance: c.Array[IP_BASE_INSTANCE, Literal[7]] +IP_BASE.register_fields([('instance', c.Array[IP_BASE_INSTANCE, Literal[7]], 0)]) +SDMA_OP_COPY = 1 +SDMA_OP_FENCE = 5 +SDMA_OP_TRAP = 6 +SDMA_OP_POLL_REGMEM = 8 +SDMA_OP_ATOMIC = 10 +SDMA_OP_CONST_FILL = 11 +SDMA_OP_TIMESTAMP = 13 +SDMA_OP_GCR = 17 +SDMA_SUBOP_COPY_LINEAR = 0 +SDMA_SUBOP_COPY_LINEAR_RECT = 4 +SDMA_SUBOP_TIMESTAMP_GET_GLOBAL = 2 +SDMA_SUBOP_USER_GCR = 1 +SDMA_ATOMIC_ADD64 = 47 +PACKET_TYPE0 = 0 +PACKET_TYPE1 = 1 +PACKET_TYPE2 = 2 +PACKET_TYPE3 = 3 +CP_PACKET_GET_TYPE = lambda h: (((h) >> 30) & 3) # type: ignore +CP_PACKET_GET_COUNT = lambda h: (((h) >> 16) & 0x3FFF) # type: ignore +CP_PACKET0_GET_REG = lambda h: ((h) & 0xFFFF) # type: ignore +CP_PACKET3_GET_OPCODE = lambda h: (((h) >> 8) & 0xFF) # type: ignore +PACKET0 = lambda reg,n: ((PACKET_TYPE0 << 30) | ((reg) & 0xFFFF) | ((n) & 0x3FFF) << 16) # type: ignore +CP_PACKET2 = 0x80000000 +PACKET2_PAD_SHIFT = 0 +PACKET2_PAD_MASK = (0x3fffffff << 0) +PACKET2 = lambda v: (CP_PACKET2 | REG_SET(PACKET2_PAD, (v))) # type: ignore +PACKET3 = lambda op,n: ((PACKET_TYPE3 << 30) | (((op) & 0xFF) << 8) | ((n) & 0x3FFF) << 16) # type: ignore +PACKET3_COMPUTE = lambda op,n: (PACKET3(op, n) | 1 << 1) # type: ignore +PACKET3_NOP = 0x10 +PACKET3_SET_BASE = 0x11 +PACKET3_BASE_INDEX = lambda x: ((x) << 0) # type: ignore +CE_PARTITION_BASE = 3 +PACKET3_CLEAR_STATE = 0x12 +PACKET3_INDEX_BUFFER_SIZE = 0x13 +PACKET3_DISPATCH_DIRECT = 0x15 +PACKET3_DISPATCH_INDIRECT = 0x16 +PACKET3_INDIRECT_BUFFER_END = 0x17 +PACKET3_INDIRECT_BUFFER_CNST_END = 0x19 +PACKET3_ATOMIC_GDS = 0x1D +PACKET3_ATOMIC_MEM = 0x1E +PACKET3_OCCLUSION_QUERY = 0x1F +PACKET3_SET_PREDICATION = 0x20 +PACKET3_REG_RMW = 0x21 +PACKET3_COND_EXEC = 0x22 +PACKET3_PRED_EXEC = 0x23 +PACKET3_DRAW_INDIRECT = 0x24 +PACKET3_DRAW_INDEX_INDIRECT = 0x25 +PACKET3_INDEX_BASE = 0x26 +PACKET3_DRAW_INDEX_2 = 0x27 +PACKET3_CONTEXT_CONTROL = 0x28 +PACKET3_INDEX_TYPE = 0x2A +PACKET3_DRAW_INDIRECT_MULTI = 0x2C +PACKET3_DRAW_INDEX_AUTO = 0x2D +PACKET3_NUM_INSTANCES = 0x2F +PACKET3_DRAW_INDEX_MULTI_AUTO = 0x30 +PACKET3_INDIRECT_BUFFER_PRIV = 0x32 +PACKET3_INDIRECT_BUFFER_CNST = 0x33 +PACKET3_COND_INDIRECT_BUFFER_CNST = 0x33 +PACKET3_STRMOUT_BUFFER_UPDATE = 0x34 +PACKET3_DRAW_INDEX_OFFSET_2 = 0x35 +PACKET3_DRAW_PREAMBLE = 0x36 +PACKET3_WRITE_DATA = 0x37 +WRITE_DATA_DST_SEL = lambda x: ((x) << 8) # type: ignore +WR_ONE_ADDR = (1 << 16) +WR_CONFIRM = (1 << 20) +WRITE_DATA_CACHE_POLICY = lambda x: ((x) << 25) # type: ignore +WRITE_DATA_ENGINE_SEL = lambda x: ((x) << 30) # type: ignore +PACKET3_DRAW_INDEX_INDIRECT_MULTI = 0x38 +PACKET3_MEM_SEMAPHORE = 0x39 +PACKET3_SEM_USE_MAILBOX = (0x1 << 16) +PACKET3_SEM_SEL_SIGNAL_TYPE = (0x1 << 20) +PACKET3_SEM_SEL_SIGNAL = (0x6 << 29) +PACKET3_SEM_SEL_WAIT = (0x7 << 29) +PACKET3_DRAW_INDEX_MULTI_INST = 0x3A +PACKET3_COPY_DW = 0x3B +PACKET3_WAIT_REG_MEM = 0x3C +WAIT_REG_MEM_FUNCTION = lambda x: ((x) << 0) # type: ignore +WAIT_REG_MEM_MEM_SPACE = lambda x: ((x) << 4) # type: ignore +WAIT_REG_MEM_OPERATION = lambda x: ((x) << 6) # type: ignore +WAIT_REG_MEM_ENGINE = lambda x: ((x) << 8) # type: ignore +PACKET3_INDIRECT_BUFFER = 0x3F +INDIRECT_BUFFER_VALID = (1 << 23) +INDIRECT_BUFFER_CACHE_POLICY = lambda x: ((x) << 28) # type: ignore +INDIRECT_BUFFER_PRE_ENB = lambda x: ((x) << 21) # type: ignore +INDIRECT_BUFFER_PRE_RESUME = lambda x: ((x) << 30) # type: ignore +PACKET3_COND_INDIRECT_BUFFER = 0x3F +PACKET3_COPY_DATA = 0x40 +PACKET3_CP_DMA = 0x41 +PACKET3_PFP_SYNC_ME = 0x42 +PACKET3_SURFACE_SYNC = 0x43 +PACKET3_ME_INITIALIZE = 0x44 +PACKET3_COND_WRITE = 0x45 +PACKET3_EVENT_WRITE = 0x46 +EVENT_TYPE = lambda x: ((x) << 0) # type: ignore +EVENT_INDEX = lambda x: ((x) << 8) # type: ignore +PACKET3_EVENT_WRITE_EOP = 0x47 +PACKET3_EVENT_WRITE_EOS = 0x48 +PACKET3_RELEASE_MEM = 0x49 +PACKET3_RELEASE_MEM_EVENT_TYPE = lambda x: ((x) << 0) # type: ignore +PACKET3_RELEASE_MEM_EVENT_INDEX = lambda x: ((x) << 8) # type: ignore +PACKET3_RELEASE_MEM_GCR_GLM_WB = (1 << 12) +PACKET3_RELEASE_MEM_GCR_GLM_INV = (1 << 13) +PACKET3_RELEASE_MEM_GCR_GLV_INV = (1 << 14) +PACKET3_RELEASE_MEM_GCR_GL1_INV = (1 << 15) +PACKET3_RELEASE_MEM_GCR_GL2_US = (1 << 16) +PACKET3_RELEASE_MEM_GCR_GL2_RANGE = (1 << 17) +PACKET3_RELEASE_MEM_GCR_GL2_DISCARD = (1 << 19) +PACKET3_RELEASE_MEM_GCR_GL2_INV = (1 << 20) +PACKET3_RELEASE_MEM_GCR_GL2_WB = (1 << 21) +PACKET3_RELEASE_MEM_GCR_SEQ = (1 << 22) +PACKET3_RELEASE_MEM_CACHE_POLICY = lambda x: ((x) << 25) # type: ignore +PACKET3_RELEASE_MEM_EXECUTE = (1 << 28) +PACKET3_RELEASE_MEM_DATA_SEL = lambda x: ((x) << 29) # type: ignore +PACKET3_RELEASE_MEM_INT_SEL = lambda x: ((x) << 24) # type: ignore +PACKET3_RELEASE_MEM_DST_SEL = lambda x: ((x) << 16) # type: ignore +PACKET3_PREAMBLE_CNTL = 0x4A +PACKET3_PREAMBLE_BEGIN_CLEAR_STATE = (2 << 28) +PACKET3_PREAMBLE_END_CLEAR_STATE = (3 << 28) +PACKET3_DMA_DATA = 0x50 +PACKET3_DMA_DATA_ENGINE = lambda x: ((x) << 0) # type: ignore +PACKET3_DMA_DATA_SRC_CACHE_POLICY = lambda x: ((x) << 13) # type: ignore +PACKET3_DMA_DATA_DST_SEL = lambda x: ((x) << 20) # type: ignore +PACKET3_DMA_DATA_DST_CACHE_POLICY = lambda x: ((x) << 25) # type: ignore +PACKET3_DMA_DATA_SRC_SEL = lambda x: ((x) << 29) # type: ignore +PACKET3_DMA_DATA_CP_SYNC = (1 << 31) +PACKET3_DMA_DATA_CMD_SAS = (1 << 26) +PACKET3_DMA_DATA_CMD_DAS = (1 << 27) +PACKET3_DMA_DATA_CMD_SAIC = (1 << 28) +PACKET3_DMA_DATA_CMD_DAIC = (1 << 29) +PACKET3_DMA_DATA_CMD_RAW_WAIT = (1 << 30) +PACKET3_CONTEXT_REG_RMW = 0x51 +PACKET3_GFX_CNTX_UPDATE = 0x52 +PACKET3_BLK_CNTX_UPDATE = 0x53 +PACKET3_INCR_UPDT_STATE = 0x55 +PACKET3_ACQUIRE_MEM = 0x58 +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLI_INV = lambda x: ((x) << 0) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL1_RANGE = lambda x: ((x) << 2) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_WB = lambda x: ((x) << 4) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_INV = lambda x: ((x) << 5) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_WB = lambda x: ((x) << 6) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_INV = lambda x: ((x) << 7) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GLV_INV = lambda x: ((x) << 8) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL1_INV = lambda x: ((x) << 9) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_US = lambda x: ((x) << 10) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_RANGE = lambda x: ((x) << 11) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_DISCARD = lambda x: ((x) << 13) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_INV = lambda x: ((x) << 14) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_WB = lambda x: ((x) << 15) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_CNTL_SEQ = lambda x: ((x) << 16) # type: ignore +PACKET3_ACQUIRE_MEM_GCR_RANGE_IS_PA = (1 << 18) +PACKET3_REWIND = 0x59 +PACKET3_INTERRUPT = 0x5A +PACKET3_GEN_PDEPTE = 0x5B +PACKET3_INDIRECT_BUFFER_PASID = 0x5C +PACKET3_PRIME_UTCL2 = 0x5D +PACKET3_LOAD_UCONFIG_REG = 0x5E +PACKET3_LOAD_SH_REG = 0x5F +PACKET3_LOAD_CONFIG_REG = 0x60 +PACKET3_LOAD_CONTEXT_REG = 0x61 +PACKET3_LOAD_COMPUTE_STATE = 0x62 +PACKET3_LOAD_SH_REG_INDEX = 0x63 +PACKET3_SET_CONFIG_REG = 0x68 +PACKET3_SET_CONFIG_REG_START = 0x00002000 +PACKET3_SET_CONFIG_REG_END = 0x00002c00 +PACKET3_SET_CONTEXT_REG = 0x69 +PACKET3_SET_CONTEXT_REG_START = 0x0000a000 +PACKET3_SET_CONTEXT_REG_END = 0x0000a400 +PACKET3_SET_CONTEXT_REG_INDEX = 0x6A +PACKET3_SET_VGPR_REG_DI_MULTI = 0x71 +PACKET3_SET_SH_REG_DI = 0x72 +PACKET3_SET_CONTEXT_REG_INDIRECT = 0x73 +PACKET3_SET_SH_REG_DI_MULTI = 0x74 +PACKET3_GFX_PIPE_LOCK = 0x75 +PACKET3_SET_SH_REG = 0x76 +PACKET3_SET_SH_REG_START = 0x00002c00 +PACKET3_SET_SH_REG_END = 0x00003000 +PACKET3_SET_SH_REG_OFFSET = 0x77 +PACKET3_SET_QUEUE_REG = 0x78 +PACKET3_SET_UCONFIG_REG = 0x79 +PACKET3_SET_UCONFIG_REG_START = 0x0000c000 +PACKET3_SET_UCONFIG_REG_END = 0x0000c400 +PACKET3_SET_UCONFIG_REG_INDEX = 0x7A +PACKET3_FORWARD_HEADER = 0x7C +PACKET3_SCRATCH_RAM_WRITE = 0x7D +PACKET3_SCRATCH_RAM_READ = 0x7E +PACKET3_LOAD_CONST_RAM = 0x80 +PACKET3_WRITE_CONST_RAM = 0x81 +PACKET3_DUMP_CONST_RAM = 0x83 +PACKET3_INCREMENT_CE_COUNTER = 0x84 +PACKET3_INCREMENT_DE_COUNTER = 0x85 +PACKET3_WAIT_ON_CE_COUNTER = 0x86 +PACKET3_WAIT_ON_DE_COUNTER_DIFF = 0x88 +PACKET3_SWITCH_BUFFER = 0x8B +PACKET3_DISPATCH_DRAW_PREAMBLE = 0x8C +PACKET3_DISPATCH_DRAW_PREAMBLE_ACE = 0x8C +PACKET3_DISPATCH_DRAW = 0x8D +PACKET3_DISPATCH_DRAW_ACE = 0x8D +PACKET3_GET_LOD_STATS = 0x8E +PACKET3_DRAW_MULTI_PREAMBLE = 0x8F +PACKET3_FRAME_CONTROL = 0x90 +FRAME_TMZ = (1 << 0) +FRAME_CMD = lambda x: ((x) << 28) # type: ignore +PACKET3_INDEX_ATTRIBUTES_INDIRECT = 0x91 +PACKET3_WAIT_REG_MEM64 = 0x93 +PACKET3_COND_PREEMPT = 0x94 +PACKET3_HDP_FLUSH = 0x95 +PACKET3_COPY_DATA_RB = 0x96 +PACKET3_INVALIDATE_TLBS = 0x98 +PACKET3_INVALIDATE_TLBS_DST_SEL = lambda x: ((x) << 0) # type: ignore +PACKET3_INVALIDATE_TLBS_ALL_HUB = lambda x: ((x) << 4) # type: ignore +PACKET3_INVALIDATE_TLBS_PASID = lambda x: ((x) << 5) # type: ignore +PACKET3_AQL_PACKET = 0x99 +PACKET3_DMA_DATA_FILL_MULTI = 0x9A +PACKET3_SET_SH_REG_INDEX = 0x9B +PACKET3_DRAW_INDIRECT_COUNT_MULTI = 0x9C +PACKET3_DRAW_INDEX_INDIRECT_COUNT_MULTI = 0x9D +PACKET3_DUMP_CONST_RAM_OFFSET = 0x9E +PACKET3_LOAD_CONTEXT_REG_INDEX = 0x9F +PACKET3_SET_RESOURCES = 0xA0 +PACKET3_SET_RESOURCES_VMID_MASK = lambda x: ((x) << 0) # type: ignore +PACKET3_SET_RESOURCES_UNMAP_LATENTY = lambda x: ((x) << 16) # type: ignore +PACKET3_SET_RESOURCES_QUEUE_TYPE = lambda x: ((x) << 29) # type: ignore +PACKET3_MAP_PROCESS = 0xA1 +PACKET3_MAP_QUEUES = 0xA2 +PACKET3_MAP_QUEUES_QUEUE_SEL = lambda x: ((x) << 4) # type: ignore +PACKET3_MAP_QUEUES_VMID = lambda x: ((x) << 8) # type: ignore +PACKET3_MAP_QUEUES_QUEUE = lambda x: ((x) << 13) # type: ignore +PACKET3_MAP_QUEUES_PIPE = lambda x: ((x) << 16) # type: ignore +PACKET3_MAP_QUEUES_ME = lambda x: ((x) << 18) # type: ignore +PACKET3_MAP_QUEUES_QUEUE_TYPE = lambda x: ((x) << 21) # type: ignore +PACKET3_MAP_QUEUES_ALLOC_FORMAT = lambda x: ((x) << 24) # type: ignore +PACKET3_MAP_QUEUES_ENGINE_SEL = lambda x: ((x) << 26) # type: ignore +PACKET3_MAP_QUEUES_NUM_QUEUES = lambda x: ((x) << 29) # type: ignore +PACKET3_MAP_QUEUES_CHECK_DISABLE = lambda x: ((x) << 1) # type: ignore +PACKET3_MAP_QUEUES_DOORBELL_OFFSET = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES = 0xA3 +PACKET3_UNMAP_QUEUES_ACTION = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_QUEUE_SEL = lambda x: ((x) << 4) # type: ignore +PACKET3_UNMAP_QUEUES_ENGINE_SEL = lambda x: ((x) << 26) # type: ignore +PACKET3_UNMAP_QUEUES_NUM_QUEUES = lambda x: ((x) << 29) # type: ignore +PACKET3_UNMAP_QUEUES_PASID = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET1 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_RB_WPTR = lambda x: ((x) << 0) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET2 = lambda x: ((x) << 2) # type: ignore +PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET3 = lambda x: ((x) << 2) # type: ignore +PACKET3_QUERY_STATUS = 0xA4 +PACKET3_QUERY_STATUS_CONTEXT_ID = lambda x: ((x) << 0) # type: ignore +PACKET3_QUERY_STATUS_INTERRUPT_SEL = lambda x: ((x) << 28) # type: ignore +PACKET3_QUERY_STATUS_COMMAND = lambda x: ((x) << 30) # type: ignore +PACKET3_QUERY_STATUS_PASID = lambda x: ((x) << 0) # type: ignore +PACKET3_QUERY_STATUS_DOORBELL_OFFSET = lambda x: ((x) << 2) # type: ignore +PACKET3_QUERY_STATUS_ENG_SEL = lambda x: ((x) << 25) # type: ignore +PACKET3_RUN_LIST = 0xA5 +PACKET3_MAP_PROCESS_VM = 0xA6 +PACKET3_SET_Q_PREEMPTION_MODE = 0xF0 +PACKET3_SET_Q_PREEMPTION_MODE_IB_VMID = lambda x: ((x) << 0) # type: ignore +PACKET3_SET_Q_PREEMPTION_MODE_INIT_SHADOW_MEM = (1 << 0) +regSDMA0_DEC_START = 0x0000 +regSDMA0_DEC_START_BASE_IDX = 0 +regSDMA0_F32_MISC_CNTL = 0x000b +regSDMA0_F32_MISC_CNTL_BASE_IDX = 0 +regSDMA0_GLOBAL_TIMESTAMP_LO = 0x000f +regSDMA0_GLOBAL_TIMESTAMP_LO_BASE_IDX = 0 +regSDMA0_GLOBAL_TIMESTAMP_HI = 0x0010 +regSDMA0_GLOBAL_TIMESTAMP_HI_BASE_IDX = 0 +regSDMA0_POWER_CNTL = 0x001a +regSDMA0_POWER_CNTL_BASE_IDX = 0 +regSDMA0_CNTL = 0x001c +regSDMA0_CNTL_BASE_IDX = 0 +regSDMA0_CHICKEN_BITS = 0x001d +regSDMA0_CHICKEN_BITS_BASE_IDX = 0 +regSDMA0_GB_ADDR_CONFIG = 0x001e +regSDMA0_GB_ADDR_CONFIG_BASE_IDX = 0 +regSDMA0_GB_ADDR_CONFIG_READ = 0x001f +regSDMA0_GB_ADDR_CONFIG_READ_BASE_IDX = 0 +regSDMA0_RB_RPTR_FETCH = 0x0020 +regSDMA0_RB_RPTR_FETCH_BASE_IDX = 0 +regSDMA0_RB_RPTR_FETCH_HI = 0x0021 +regSDMA0_RB_RPTR_FETCH_HI_BASE_IDX = 0 +regSDMA0_SEM_WAIT_FAIL_TIMER_CNTL = 0x0022 +regSDMA0_SEM_WAIT_FAIL_TIMER_CNTL_BASE_IDX = 0 +regSDMA0_IB_OFFSET_FETCH = 0x0023 +regSDMA0_IB_OFFSET_FETCH_BASE_IDX = 0 +regSDMA0_PROGRAM = 0x0024 +regSDMA0_PROGRAM_BASE_IDX = 0 +regSDMA0_STATUS_REG = 0x0025 +regSDMA0_STATUS_REG_BASE_IDX = 0 +regSDMA0_STATUS1_REG = 0x0026 +regSDMA0_STATUS1_REG_BASE_IDX = 0 +regSDMA0_CNTL1 = 0x0027 +regSDMA0_CNTL1_BASE_IDX = 0 +regSDMA0_HBM_PAGE_CONFIG = 0x0028 +regSDMA0_HBM_PAGE_CONFIG_BASE_IDX = 0 +regSDMA0_UCODE_CHECKSUM = 0x0029 +regSDMA0_UCODE_CHECKSUM_BASE_IDX = 0 +regSDMA0_FREEZE = 0x002b +regSDMA0_FREEZE_BASE_IDX = 0 +regSDMA0_PROCESS_QUANTUM0 = 0x002c +regSDMA0_PROCESS_QUANTUM0_BASE_IDX = 0 +regSDMA0_PROCESS_QUANTUM1 = 0x002d +regSDMA0_PROCESS_QUANTUM1_BASE_IDX = 0 +regSDMA0_WATCHDOG_CNTL = 0x002e +regSDMA0_WATCHDOG_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE_STATUS0 = 0x002f +regSDMA0_QUEUE_STATUS0_BASE_IDX = 0 +regSDMA0_EDC_CONFIG = 0x0032 +regSDMA0_EDC_CONFIG_BASE_IDX = 0 +regSDMA0_BA_THRESHOLD = 0x0033 +regSDMA0_BA_THRESHOLD_BASE_IDX = 0 +regSDMA0_ID = 0x0034 +regSDMA0_ID_BASE_IDX = 0 +regSDMA0_VERSION = 0x0035 +regSDMA0_VERSION_BASE_IDX = 0 +regSDMA0_EDC_COUNTER = 0x0036 +regSDMA0_EDC_COUNTER_BASE_IDX = 0 +regSDMA0_EDC_COUNTER_CLEAR = 0x0037 +regSDMA0_EDC_COUNTER_CLEAR_BASE_IDX = 0 +regSDMA0_STATUS2_REG = 0x0038 +regSDMA0_STATUS2_REG_BASE_IDX = 0 +regSDMA0_ATOMIC_CNTL = 0x0039 +regSDMA0_ATOMIC_CNTL_BASE_IDX = 0 +regSDMA0_ATOMIC_PREOP_LO = 0x003a +regSDMA0_ATOMIC_PREOP_LO_BASE_IDX = 0 +regSDMA0_ATOMIC_PREOP_HI = 0x003b +regSDMA0_ATOMIC_PREOP_HI_BASE_IDX = 0 +regSDMA0_UTCL1_CNTL = 0x003c +regSDMA0_UTCL1_CNTL_BASE_IDX = 0 +regSDMA0_UTCL1_WATERMK = 0x003d +regSDMA0_UTCL1_WATERMK_BASE_IDX = 0 +regSDMA0_UTCL1_TIMEOUT = 0x003e +regSDMA0_UTCL1_TIMEOUT_BASE_IDX = 0 +regSDMA0_UTCL1_PAGE = 0x003f +regSDMA0_UTCL1_PAGE_BASE_IDX = 0 +regSDMA0_UTCL1_RD_STATUS = 0x0040 +regSDMA0_UTCL1_RD_STATUS_BASE_IDX = 0 +regSDMA0_UTCL1_WR_STATUS = 0x0041 +regSDMA0_UTCL1_WR_STATUS_BASE_IDX = 0 +regSDMA0_UTCL1_INV0 = 0x0042 +regSDMA0_UTCL1_INV0_BASE_IDX = 0 +regSDMA0_UTCL1_INV1 = 0x0043 +regSDMA0_UTCL1_INV1_BASE_IDX = 0 +regSDMA0_UTCL1_INV2 = 0x0044 +regSDMA0_UTCL1_INV2_BASE_IDX = 0 +regSDMA0_UTCL1_RD_XNACK0 = 0x0045 +regSDMA0_UTCL1_RD_XNACK0_BASE_IDX = 0 +regSDMA0_UTCL1_RD_XNACK1 = 0x0046 +regSDMA0_UTCL1_RD_XNACK1_BASE_IDX = 0 +regSDMA0_UTCL1_WR_XNACK0 = 0x0047 +regSDMA0_UTCL1_WR_XNACK0_BASE_IDX = 0 +regSDMA0_UTCL1_WR_XNACK1 = 0x0048 +regSDMA0_UTCL1_WR_XNACK1_BASE_IDX = 0 +regSDMA0_RELAX_ORDERING_LUT = 0x004a +regSDMA0_RELAX_ORDERING_LUT_BASE_IDX = 0 +regSDMA0_CHICKEN_BITS_2 = 0x004b +regSDMA0_CHICKEN_BITS_2_BASE_IDX = 0 +regSDMA0_STATUS3_REG = 0x004c +regSDMA0_STATUS3_REG_BASE_IDX = 0 +regSDMA0_PHYSICAL_ADDR_LO = 0x004d +regSDMA0_PHYSICAL_ADDR_LO_BASE_IDX = 0 +regSDMA0_PHYSICAL_ADDR_HI = 0x004e +regSDMA0_PHYSICAL_ADDR_HI_BASE_IDX = 0 +regSDMA0_GLOBAL_QUANTUM = 0x004f +regSDMA0_GLOBAL_QUANTUM_BASE_IDX = 0 +regSDMA0_ERROR_LOG = 0x0050 +regSDMA0_ERROR_LOG_BASE_IDX = 0 +regSDMA0_PUB_DUMMY_REG0 = 0x0051 +regSDMA0_PUB_DUMMY_REG0_BASE_IDX = 0 +regSDMA0_PUB_DUMMY_REG1 = 0x0052 +regSDMA0_PUB_DUMMY_REG1_BASE_IDX = 0 +regSDMA0_PUB_DUMMY_REG2 = 0x0053 +regSDMA0_PUB_DUMMY_REG2_BASE_IDX = 0 +regSDMA0_PUB_DUMMY_REG3 = 0x0054 +regSDMA0_PUB_DUMMY_REG3_BASE_IDX = 0 +regSDMA0_F32_COUNTER = 0x0055 +regSDMA0_F32_COUNTER_BASE_IDX = 0 +regSDMA0_CRD_CNTL = 0x005b +regSDMA0_CRD_CNTL_BASE_IDX = 0 +regSDMA0_RLC_CGCG_CTRL = 0x005c +regSDMA0_RLC_CGCG_CTRL_BASE_IDX = 0 +regSDMA0_AQL_STATUS = 0x005f +regSDMA0_AQL_STATUS_BASE_IDX = 0 +regSDMA0_EA_DBIT_ADDR_DATA = 0x0060 +regSDMA0_EA_DBIT_ADDR_DATA_BASE_IDX = 0 +regSDMA0_EA_DBIT_ADDR_INDEX = 0x0061 +regSDMA0_EA_DBIT_ADDR_INDEX_BASE_IDX = 0 +regSDMA0_TLBI_GCR_CNTL = 0x0062 +regSDMA0_TLBI_GCR_CNTL_BASE_IDX = 0 +regSDMA0_TILING_CONFIG = 0x0063 +regSDMA0_TILING_CONFIG_BASE_IDX = 0 +regSDMA0_INT_STATUS = 0x0070 +regSDMA0_INT_STATUS_BASE_IDX = 0 +regSDMA0_HOLE_ADDR_LO = 0x0072 +regSDMA0_HOLE_ADDR_LO_BASE_IDX = 0 +regSDMA0_HOLE_ADDR_HI = 0x0073 +regSDMA0_HOLE_ADDR_HI_BASE_IDX = 0 +regSDMA0_CLOCK_GATING_STATUS = 0x0075 +regSDMA0_CLOCK_GATING_STATUS_BASE_IDX = 0 +regSDMA0_STATUS4_REG = 0x0076 +regSDMA0_STATUS4_REG_BASE_IDX = 0 +regSDMA0_SCRATCH_RAM_DATA = 0x0077 +regSDMA0_SCRATCH_RAM_DATA_BASE_IDX = 0 +regSDMA0_SCRATCH_RAM_ADDR = 0x0078 +regSDMA0_SCRATCH_RAM_ADDR_BASE_IDX = 0 +regSDMA0_TIMESTAMP_CNTL = 0x0079 +regSDMA0_TIMESTAMP_CNTL_BASE_IDX = 0 +regSDMA0_STATUS5_REG = 0x007a +regSDMA0_STATUS5_REG_BASE_IDX = 0 +regSDMA0_QUEUE_RESET_REQ = 0x007b +regSDMA0_QUEUE_RESET_REQ_BASE_IDX = 0 +regSDMA0_STATUS6_REG = 0x007c +regSDMA0_STATUS6_REG_BASE_IDX = 0 +regSDMA0_UCODE1_CHECKSUM = 0x007d +regSDMA0_UCODE1_CHECKSUM_BASE_IDX = 0 +regSDMA0_CE_CTRL = 0x007e +regSDMA0_CE_CTRL_BASE_IDX = 0 +regSDMA0_FED_STATUS = 0x007f +regSDMA0_FED_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_CNTL = 0x0080 +regSDMA0_QUEUE0_RB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_BASE = 0x0081 +regSDMA0_QUEUE0_RB_BASE_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_BASE_HI = 0x0082 +regSDMA0_QUEUE0_RB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_RPTR = 0x0083 +regSDMA0_QUEUE0_RB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_RPTR_HI = 0x0084 +regSDMA0_QUEUE0_RB_RPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_WPTR = 0x0085 +regSDMA0_QUEUE0_RB_WPTR_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_WPTR_HI = 0x0086 +regSDMA0_QUEUE0_RB_WPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_RPTR_ADDR_HI = 0x0088 +regSDMA0_QUEUE0_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_RPTR_ADDR_LO = 0x0089 +regSDMA0_QUEUE0_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE0_IB_CNTL = 0x008a +regSDMA0_QUEUE0_IB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE0_IB_RPTR = 0x008b +regSDMA0_QUEUE0_IB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE0_IB_OFFSET = 0x008c +regSDMA0_QUEUE0_IB_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE0_IB_BASE_LO = 0x008d +regSDMA0_QUEUE0_IB_BASE_LO_BASE_IDX = 0 +regSDMA0_QUEUE0_IB_BASE_HI = 0x008e +regSDMA0_QUEUE0_IB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE0_IB_SIZE = 0x008f +regSDMA0_QUEUE0_IB_SIZE_BASE_IDX = 0 +regSDMA0_QUEUE0_SKIP_CNTL = 0x0090 +regSDMA0_QUEUE0_SKIP_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE0_CONTEXT_STATUS = 0x0091 +regSDMA0_QUEUE0_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE0_DOORBELL = 0x0092 +regSDMA0_QUEUE0_DOORBELL_BASE_IDX = 0 +regSDMA0_QUEUE0_DOORBELL_LOG = 0x00a9 +regSDMA0_QUEUE0_DOORBELL_LOG_BASE_IDX = 0 +regSDMA0_QUEUE0_DOORBELL_OFFSET = 0x00ab +regSDMA0_QUEUE0_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE0_CSA_ADDR_LO = 0x00ac +regSDMA0_QUEUE0_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE0_CSA_ADDR_HI = 0x00ad +regSDMA0_QUEUE0_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE0_SCHEDULE_CNTL = 0x00ae +regSDMA0_QUEUE0_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE0_IB_SUB_REMAIN = 0x00af +regSDMA0_QUEUE0_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA0_QUEUE0_PREEMPT = 0x00b0 +regSDMA0_QUEUE0_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE0_DUMMY_REG = 0x00b1 +regSDMA0_QUEUE0_DUMMY_REG_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_HI = 0x00b2 +regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_LO = 0x00b3 +regSDMA0_QUEUE0_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_AQL_CNTL = 0x00b4 +regSDMA0_QUEUE0_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE0_MINOR_PTR_UPDATE = 0x00b5 +regSDMA0_QUEUE0_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA0_QUEUE0_RB_PREEMPT = 0x00b6 +regSDMA0_QUEUE0_RB_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA0 = 0x00c0 +regSDMA0_QUEUE0_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA1 = 0x00c1 +regSDMA0_QUEUE0_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA2 = 0x00c2 +regSDMA0_QUEUE0_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA3 = 0x00c3 +regSDMA0_QUEUE0_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA4 = 0x00c4 +regSDMA0_QUEUE0_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA5 = 0x00c5 +regSDMA0_QUEUE0_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA6 = 0x00c6 +regSDMA0_QUEUE0_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA7 = 0x00c7 +regSDMA0_QUEUE0_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA8 = 0x00c8 +regSDMA0_QUEUE0_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA9 = 0x00c9 +regSDMA0_QUEUE0_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_DATA10 = 0x00ca +regSDMA0_QUEUE0_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA0_QUEUE0_MIDCMD_CNTL = 0x00cb +regSDMA0_QUEUE0_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_CNTL = 0x00d8 +regSDMA0_QUEUE1_RB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_BASE = 0x00d9 +regSDMA0_QUEUE1_RB_BASE_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_BASE_HI = 0x00da +regSDMA0_QUEUE1_RB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_RPTR = 0x00db +regSDMA0_QUEUE1_RB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_RPTR_HI = 0x00dc +regSDMA0_QUEUE1_RB_RPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_WPTR = 0x00dd +regSDMA0_QUEUE1_RB_WPTR_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_WPTR_HI = 0x00de +regSDMA0_QUEUE1_RB_WPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_RPTR_ADDR_HI = 0x00e0 +regSDMA0_QUEUE1_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_RPTR_ADDR_LO = 0x00e1 +regSDMA0_QUEUE1_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE1_IB_CNTL = 0x00e2 +regSDMA0_QUEUE1_IB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE1_IB_RPTR = 0x00e3 +regSDMA0_QUEUE1_IB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE1_IB_OFFSET = 0x00e4 +regSDMA0_QUEUE1_IB_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE1_IB_BASE_LO = 0x00e5 +regSDMA0_QUEUE1_IB_BASE_LO_BASE_IDX = 0 +regSDMA0_QUEUE1_IB_BASE_HI = 0x00e6 +regSDMA0_QUEUE1_IB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE1_IB_SIZE = 0x00e7 +regSDMA0_QUEUE1_IB_SIZE_BASE_IDX = 0 +regSDMA0_QUEUE1_SKIP_CNTL = 0x00e8 +regSDMA0_QUEUE1_SKIP_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE1_CONTEXT_STATUS = 0x00e9 +regSDMA0_QUEUE1_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE1_DOORBELL = 0x00ea +regSDMA0_QUEUE1_DOORBELL_BASE_IDX = 0 +regSDMA0_QUEUE1_DOORBELL_LOG = 0x0101 +regSDMA0_QUEUE1_DOORBELL_LOG_BASE_IDX = 0 +regSDMA0_QUEUE1_DOORBELL_OFFSET = 0x0103 +regSDMA0_QUEUE1_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE1_CSA_ADDR_LO = 0x0104 +regSDMA0_QUEUE1_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE1_CSA_ADDR_HI = 0x0105 +regSDMA0_QUEUE1_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE1_SCHEDULE_CNTL = 0x0106 +regSDMA0_QUEUE1_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE1_IB_SUB_REMAIN = 0x0107 +regSDMA0_QUEUE1_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA0_QUEUE1_PREEMPT = 0x0108 +regSDMA0_QUEUE1_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE1_DUMMY_REG = 0x0109 +regSDMA0_QUEUE1_DUMMY_REG_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_WPTR_POLL_ADDR_HI = 0x010a +regSDMA0_QUEUE1_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_WPTR_POLL_ADDR_LO = 0x010b +regSDMA0_QUEUE1_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_AQL_CNTL = 0x010c +regSDMA0_QUEUE1_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE1_MINOR_PTR_UPDATE = 0x010d +regSDMA0_QUEUE1_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA0_QUEUE1_RB_PREEMPT = 0x010e +regSDMA0_QUEUE1_RB_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA0 = 0x0118 +regSDMA0_QUEUE1_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA1 = 0x0119 +regSDMA0_QUEUE1_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA2 = 0x011a +regSDMA0_QUEUE1_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA3 = 0x011b +regSDMA0_QUEUE1_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA4 = 0x011c +regSDMA0_QUEUE1_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA5 = 0x011d +regSDMA0_QUEUE1_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA6 = 0x011e +regSDMA0_QUEUE1_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA7 = 0x011f +regSDMA0_QUEUE1_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA8 = 0x0120 +regSDMA0_QUEUE1_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA9 = 0x0121 +regSDMA0_QUEUE1_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_DATA10 = 0x0122 +regSDMA0_QUEUE1_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA0_QUEUE1_MIDCMD_CNTL = 0x0123 +regSDMA0_QUEUE1_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_CNTL = 0x0130 +regSDMA0_QUEUE2_RB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_BASE = 0x0131 +regSDMA0_QUEUE2_RB_BASE_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_BASE_HI = 0x0132 +regSDMA0_QUEUE2_RB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_RPTR = 0x0133 +regSDMA0_QUEUE2_RB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_RPTR_HI = 0x0134 +regSDMA0_QUEUE2_RB_RPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_WPTR = 0x0135 +regSDMA0_QUEUE2_RB_WPTR_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_WPTR_HI = 0x0136 +regSDMA0_QUEUE2_RB_WPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_RPTR_ADDR_HI = 0x0138 +regSDMA0_QUEUE2_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_RPTR_ADDR_LO = 0x0139 +regSDMA0_QUEUE2_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE2_IB_CNTL = 0x013a +regSDMA0_QUEUE2_IB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE2_IB_RPTR = 0x013b +regSDMA0_QUEUE2_IB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE2_IB_OFFSET = 0x013c +regSDMA0_QUEUE2_IB_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE2_IB_BASE_LO = 0x013d +regSDMA0_QUEUE2_IB_BASE_LO_BASE_IDX = 0 +regSDMA0_QUEUE2_IB_BASE_HI = 0x013e +regSDMA0_QUEUE2_IB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE2_IB_SIZE = 0x013f +regSDMA0_QUEUE2_IB_SIZE_BASE_IDX = 0 +regSDMA0_QUEUE2_SKIP_CNTL = 0x0140 +regSDMA0_QUEUE2_SKIP_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE2_CONTEXT_STATUS = 0x0141 +regSDMA0_QUEUE2_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE2_DOORBELL = 0x0142 +regSDMA0_QUEUE2_DOORBELL_BASE_IDX = 0 +regSDMA0_QUEUE2_DOORBELL_LOG = 0x0159 +regSDMA0_QUEUE2_DOORBELL_LOG_BASE_IDX = 0 +regSDMA0_QUEUE2_DOORBELL_OFFSET = 0x015b +regSDMA0_QUEUE2_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE2_CSA_ADDR_LO = 0x015c +regSDMA0_QUEUE2_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE2_CSA_ADDR_HI = 0x015d +regSDMA0_QUEUE2_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE2_SCHEDULE_CNTL = 0x015e +regSDMA0_QUEUE2_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE2_IB_SUB_REMAIN = 0x015f +regSDMA0_QUEUE2_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA0_QUEUE2_PREEMPT = 0x0160 +regSDMA0_QUEUE2_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE2_DUMMY_REG = 0x0161 +regSDMA0_QUEUE2_DUMMY_REG_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_WPTR_POLL_ADDR_HI = 0x0162 +regSDMA0_QUEUE2_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_WPTR_POLL_ADDR_LO = 0x0163 +regSDMA0_QUEUE2_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_AQL_CNTL = 0x0164 +regSDMA0_QUEUE2_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE2_MINOR_PTR_UPDATE = 0x0165 +regSDMA0_QUEUE2_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA0_QUEUE2_RB_PREEMPT = 0x0166 +regSDMA0_QUEUE2_RB_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA0 = 0x0170 +regSDMA0_QUEUE2_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA1 = 0x0171 +regSDMA0_QUEUE2_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA2 = 0x0172 +regSDMA0_QUEUE2_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA3 = 0x0173 +regSDMA0_QUEUE2_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA4 = 0x0174 +regSDMA0_QUEUE2_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA5 = 0x0175 +regSDMA0_QUEUE2_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA6 = 0x0176 +regSDMA0_QUEUE2_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA7 = 0x0177 +regSDMA0_QUEUE2_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA8 = 0x0178 +regSDMA0_QUEUE2_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA9 = 0x0179 +regSDMA0_QUEUE2_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_DATA10 = 0x017a +regSDMA0_QUEUE2_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA0_QUEUE2_MIDCMD_CNTL = 0x017b +regSDMA0_QUEUE2_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_CNTL = 0x0188 +regSDMA0_QUEUE3_RB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_BASE = 0x0189 +regSDMA0_QUEUE3_RB_BASE_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_BASE_HI = 0x018a +regSDMA0_QUEUE3_RB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_RPTR = 0x018b +regSDMA0_QUEUE3_RB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_RPTR_HI = 0x018c +regSDMA0_QUEUE3_RB_RPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_WPTR = 0x018d +regSDMA0_QUEUE3_RB_WPTR_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_WPTR_HI = 0x018e +regSDMA0_QUEUE3_RB_WPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_RPTR_ADDR_HI = 0x0190 +regSDMA0_QUEUE3_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_RPTR_ADDR_LO = 0x0191 +regSDMA0_QUEUE3_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE3_IB_CNTL = 0x0192 +regSDMA0_QUEUE3_IB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE3_IB_RPTR = 0x0193 +regSDMA0_QUEUE3_IB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE3_IB_OFFSET = 0x0194 +regSDMA0_QUEUE3_IB_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE3_IB_BASE_LO = 0x0195 +regSDMA0_QUEUE3_IB_BASE_LO_BASE_IDX = 0 +regSDMA0_QUEUE3_IB_BASE_HI = 0x0196 +regSDMA0_QUEUE3_IB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE3_IB_SIZE = 0x0197 +regSDMA0_QUEUE3_IB_SIZE_BASE_IDX = 0 +regSDMA0_QUEUE3_SKIP_CNTL = 0x0198 +regSDMA0_QUEUE3_SKIP_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE3_CONTEXT_STATUS = 0x0199 +regSDMA0_QUEUE3_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE3_DOORBELL = 0x019a +regSDMA0_QUEUE3_DOORBELL_BASE_IDX = 0 +regSDMA0_QUEUE3_DOORBELL_LOG = 0x01b1 +regSDMA0_QUEUE3_DOORBELL_LOG_BASE_IDX = 0 +regSDMA0_QUEUE3_DOORBELL_OFFSET = 0x01b3 +regSDMA0_QUEUE3_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE3_CSA_ADDR_LO = 0x01b4 +regSDMA0_QUEUE3_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE3_CSA_ADDR_HI = 0x01b5 +regSDMA0_QUEUE3_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE3_SCHEDULE_CNTL = 0x01b6 +regSDMA0_QUEUE3_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE3_IB_SUB_REMAIN = 0x01b7 +regSDMA0_QUEUE3_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA0_QUEUE3_PREEMPT = 0x01b8 +regSDMA0_QUEUE3_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE3_DUMMY_REG = 0x01b9 +regSDMA0_QUEUE3_DUMMY_REG_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_WPTR_POLL_ADDR_HI = 0x01ba +regSDMA0_QUEUE3_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_WPTR_POLL_ADDR_LO = 0x01bb +regSDMA0_QUEUE3_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_AQL_CNTL = 0x01bc +regSDMA0_QUEUE3_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE3_MINOR_PTR_UPDATE = 0x01bd +regSDMA0_QUEUE3_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA0_QUEUE3_RB_PREEMPT = 0x01be +regSDMA0_QUEUE3_RB_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA0 = 0x01c8 +regSDMA0_QUEUE3_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA1 = 0x01c9 +regSDMA0_QUEUE3_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA2 = 0x01ca +regSDMA0_QUEUE3_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA3 = 0x01cb +regSDMA0_QUEUE3_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA4 = 0x01cc +regSDMA0_QUEUE3_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA5 = 0x01cd +regSDMA0_QUEUE3_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA6 = 0x01ce +regSDMA0_QUEUE3_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA7 = 0x01cf +regSDMA0_QUEUE3_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA8 = 0x01d0 +regSDMA0_QUEUE3_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA9 = 0x01d1 +regSDMA0_QUEUE3_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_DATA10 = 0x01d2 +regSDMA0_QUEUE3_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA0_QUEUE3_MIDCMD_CNTL = 0x01d3 +regSDMA0_QUEUE3_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_CNTL = 0x01e0 +regSDMA0_QUEUE4_RB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_BASE = 0x01e1 +regSDMA0_QUEUE4_RB_BASE_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_BASE_HI = 0x01e2 +regSDMA0_QUEUE4_RB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_RPTR = 0x01e3 +regSDMA0_QUEUE4_RB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_RPTR_HI = 0x01e4 +regSDMA0_QUEUE4_RB_RPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_WPTR = 0x01e5 +regSDMA0_QUEUE4_RB_WPTR_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_WPTR_HI = 0x01e6 +regSDMA0_QUEUE4_RB_WPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_RPTR_ADDR_HI = 0x01e8 +regSDMA0_QUEUE4_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_RPTR_ADDR_LO = 0x01e9 +regSDMA0_QUEUE4_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE4_IB_CNTL = 0x01ea +regSDMA0_QUEUE4_IB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE4_IB_RPTR = 0x01eb +regSDMA0_QUEUE4_IB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE4_IB_OFFSET = 0x01ec +regSDMA0_QUEUE4_IB_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE4_IB_BASE_LO = 0x01ed +regSDMA0_QUEUE4_IB_BASE_LO_BASE_IDX = 0 +regSDMA0_QUEUE4_IB_BASE_HI = 0x01ee +regSDMA0_QUEUE4_IB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE4_IB_SIZE = 0x01ef +regSDMA0_QUEUE4_IB_SIZE_BASE_IDX = 0 +regSDMA0_QUEUE4_SKIP_CNTL = 0x01f0 +regSDMA0_QUEUE4_SKIP_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE4_CONTEXT_STATUS = 0x01f1 +regSDMA0_QUEUE4_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE4_DOORBELL = 0x01f2 +regSDMA0_QUEUE4_DOORBELL_BASE_IDX = 0 +regSDMA0_QUEUE4_DOORBELL_LOG = 0x0209 +regSDMA0_QUEUE4_DOORBELL_LOG_BASE_IDX = 0 +regSDMA0_QUEUE4_DOORBELL_OFFSET = 0x020b +regSDMA0_QUEUE4_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE4_CSA_ADDR_LO = 0x020c +regSDMA0_QUEUE4_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE4_CSA_ADDR_HI = 0x020d +regSDMA0_QUEUE4_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE4_SCHEDULE_CNTL = 0x020e +regSDMA0_QUEUE4_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE4_IB_SUB_REMAIN = 0x020f +regSDMA0_QUEUE4_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA0_QUEUE4_PREEMPT = 0x0210 +regSDMA0_QUEUE4_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE4_DUMMY_REG = 0x0211 +regSDMA0_QUEUE4_DUMMY_REG_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_WPTR_POLL_ADDR_HI = 0x0212 +regSDMA0_QUEUE4_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_WPTR_POLL_ADDR_LO = 0x0213 +regSDMA0_QUEUE4_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_AQL_CNTL = 0x0214 +regSDMA0_QUEUE4_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE4_MINOR_PTR_UPDATE = 0x0215 +regSDMA0_QUEUE4_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA0_QUEUE4_RB_PREEMPT = 0x0216 +regSDMA0_QUEUE4_RB_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA0 = 0x0220 +regSDMA0_QUEUE4_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA1 = 0x0221 +regSDMA0_QUEUE4_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA2 = 0x0222 +regSDMA0_QUEUE4_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA3 = 0x0223 +regSDMA0_QUEUE4_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA4 = 0x0224 +regSDMA0_QUEUE4_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA5 = 0x0225 +regSDMA0_QUEUE4_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA6 = 0x0226 +regSDMA0_QUEUE4_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA7 = 0x0227 +regSDMA0_QUEUE4_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA8 = 0x0228 +regSDMA0_QUEUE4_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA9 = 0x0229 +regSDMA0_QUEUE4_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_DATA10 = 0x022a +regSDMA0_QUEUE4_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA0_QUEUE4_MIDCMD_CNTL = 0x022b +regSDMA0_QUEUE4_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_CNTL = 0x0238 +regSDMA0_QUEUE5_RB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_BASE = 0x0239 +regSDMA0_QUEUE5_RB_BASE_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_BASE_HI = 0x023a +regSDMA0_QUEUE5_RB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_RPTR = 0x023b +regSDMA0_QUEUE5_RB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_RPTR_HI = 0x023c +regSDMA0_QUEUE5_RB_RPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_WPTR = 0x023d +regSDMA0_QUEUE5_RB_WPTR_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_WPTR_HI = 0x023e +regSDMA0_QUEUE5_RB_WPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_RPTR_ADDR_HI = 0x0240 +regSDMA0_QUEUE5_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_RPTR_ADDR_LO = 0x0241 +regSDMA0_QUEUE5_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE5_IB_CNTL = 0x0242 +regSDMA0_QUEUE5_IB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE5_IB_RPTR = 0x0243 +regSDMA0_QUEUE5_IB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE5_IB_OFFSET = 0x0244 +regSDMA0_QUEUE5_IB_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE5_IB_BASE_LO = 0x0245 +regSDMA0_QUEUE5_IB_BASE_LO_BASE_IDX = 0 +regSDMA0_QUEUE5_IB_BASE_HI = 0x0246 +regSDMA0_QUEUE5_IB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE5_IB_SIZE = 0x0247 +regSDMA0_QUEUE5_IB_SIZE_BASE_IDX = 0 +regSDMA0_QUEUE5_SKIP_CNTL = 0x0248 +regSDMA0_QUEUE5_SKIP_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE5_CONTEXT_STATUS = 0x0249 +regSDMA0_QUEUE5_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE5_DOORBELL = 0x024a +regSDMA0_QUEUE5_DOORBELL_BASE_IDX = 0 +regSDMA0_QUEUE5_DOORBELL_LOG = 0x0261 +regSDMA0_QUEUE5_DOORBELL_LOG_BASE_IDX = 0 +regSDMA0_QUEUE5_DOORBELL_OFFSET = 0x0263 +regSDMA0_QUEUE5_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE5_CSA_ADDR_LO = 0x0264 +regSDMA0_QUEUE5_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE5_CSA_ADDR_HI = 0x0265 +regSDMA0_QUEUE5_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE5_SCHEDULE_CNTL = 0x0266 +regSDMA0_QUEUE5_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE5_IB_SUB_REMAIN = 0x0267 +regSDMA0_QUEUE5_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA0_QUEUE5_PREEMPT = 0x0268 +regSDMA0_QUEUE5_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE5_DUMMY_REG = 0x0269 +regSDMA0_QUEUE5_DUMMY_REG_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_WPTR_POLL_ADDR_HI = 0x026a +regSDMA0_QUEUE5_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_WPTR_POLL_ADDR_LO = 0x026b +regSDMA0_QUEUE5_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_AQL_CNTL = 0x026c +regSDMA0_QUEUE5_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE5_MINOR_PTR_UPDATE = 0x026d +regSDMA0_QUEUE5_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA0_QUEUE5_RB_PREEMPT = 0x026e +regSDMA0_QUEUE5_RB_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA0 = 0x0278 +regSDMA0_QUEUE5_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA1 = 0x0279 +regSDMA0_QUEUE5_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA2 = 0x027a +regSDMA0_QUEUE5_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA3 = 0x027b +regSDMA0_QUEUE5_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA4 = 0x027c +regSDMA0_QUEUE5_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA5 = 0x027d +regSDMA0_QUEUE5_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA6 = 0x027e +regSDMA0_QUEUE5_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA7 = 0x027f +regSDMA0_QUEUE5_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA8 = 0x0280 +regSDMA0_QUEUE5_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA9 = 0x0281 +regSDMA0_QUEUE5_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_DATA10 = 0x0282 +regSDMA0_QUEUE5_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA0_QUEUE5_MIDCMD_CNTL = 0x0283 +regSDMA0_QUEUE5_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_CNTL = 0x0290 +regSDMA0_QUEUE6_RB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_BASE = 0x0291 +regSDMA0_QUEUE6_RB_BASE_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_BASE_HI = 0x0292 +regSDMA0_QUEUE6_RB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_RPTR = 0x0293 +regSDMA0_QUEUE6_RB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_RPTR_HI = 0x0294 +regSDMA0_QUEUE6_RB_RPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_WPTR = 0x0295 +regSDMA0_QUEUE6_RB_WPTR_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_WPTR_HI = 0x0296 +regSDMA0_QUEUE6_RB_WPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_RPTR_ADDR_HI = 0x0298 +regSDMA0_QUEUE6_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_RPTR_ADDR_LO = 0x0299 +regSDMA0_QUEUE6_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE6_IB_CNTL = 0x029a +regSDMA0_QUEUE6_IB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE6_IB_RPTR = 0x029b +regSDMA0_QUEUE6_IB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE6_IB_OFFSET = 0x029c +regSDMA0_QUEUE6_IB_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE6_IB_BASE_LO = 0x029d +regSDMA0_QUEUE6_IB_BASE_LO_BASE_IDX = 0 +regSDMA0_QUEUE6_IB_BASE_HI = 0x029e +regSDMA0_QUEUE6_IB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE6_IB_SIZE = 0x029f +regSDMA0_QUEUE6_IB_SIZE_BASE_IDX = 0 +regSDMA0_QUEUE6_SKIP_CNTL = 0x02a0 +regSDMA0_QUEUE6_SKIP_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE6_CONTEXT_STATUS = 0x02a1 +regSDMA0_QUEUE6_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE6_DOORBELL = 0x02a2 +regSDMA0_QUEUE6_DOORBELL_BASE_IDX = 0 +regSDMA0_QUEUE6_DOORBELL_LOG = 0x02b9 +regSDMA0_QUEUE6_DOORBELL_LOG_BASE_IDX = 0 +regSDMA0_QUEUE6_DOORBELL_OFFSET = 0x02bb +regSDMA0_QUEUE6_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE6_CSA_ADDR_LO = 0x02bc +regSDMA0_QUEUE6_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE6_CSA_ADDR_HI = 0x02bd +regSDMA0_QUEUE6_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE6_SCHEDULE_CNTL = 0x02be +regSDMA0_QUEUE6_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE6_IB_SUB_REMAIN = 0x02bf +regSDMA0_QUEUE6_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA0_QUEUE6_PREEMPT = 0x02c0 +regSDMA0_QUEUE6_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE6_DUMMY_REG = 0x02c1 +regSDMA0_QUEUE6_DUMMY_REG_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_WPTR_POLL_ADDR_HI = 0x02c2 +regSDMA0_QUEUE6_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_WPTR_POLL_ADDR_LO = 0x02c3 +regSDMA0_QUEUE6_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_AQL_CNTL = 0x02c4 +regSDMA0_QUEUE6_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE6_MINOR_PTR_UPDATE = 0x02c5 +regSDMA0_QUEUE6_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA0_QUEUE6_RB_PREEMPT = 0x02c6 +regSDMA0_QUEUE6_RB_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA0 = 0x02d0 +regSDMA0_QUEUE6_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA1 = 0x02d1 +regSDMA0_QUEUE6_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA2 = 0x02d2 +regSDMA0_QUEUE6_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA3 = 0x02d3 +regSDMA0_QUEUE6_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA4 = 0x02d4 +regSDMA0_QUEUE6_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA5 = 0x02d5 +regSDMA0_QUEUE6_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA6 = 0x02d6 +regSDMA0_QUEUE6_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA7 = 0x02d7 +regSDMA0_QUEUE6_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA8 = 0x02d8 +regSDMA0_QUEUE6_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA9 = 0x02d9 +regSDMA0_QUEUE6_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_DATA10 = 0x02da +regSDMA0_QUEUE6_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA0_QUEUE6_MIDCMD_CNTL = 0x02db +regSDMA0_QUEUE6_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_CNTL = 0x02e8 +regSDMA0_QUEUE7_RB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_BASE = 0x02e9 +regSDMA0_QUEUE7_RB_BASE_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_BASE_HI = 0x02ea +regSDMA0_QUEUE7_RB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_RPTR = 0x02eb +regSDMA0_QUEUE7_RB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_RPTR_HI = 0x02ec +regSDMA0_QUEUE7_RB_RPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_WPTR = 0x02ed +regSDMA0_QUEUE7_RB_WPTR_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_WPTR_HI = 0x02ee +regSDMA0_QUEUE7_RB_WPTR_HI_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_RPTR_ADDR_HI = 0x02f0 +regSDMA0_QUEUE7_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_RPTR_ADDR_LO = 0x02f1 +regSDMA0_QUEUE7_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE7_IB_CNTL = 0x02f2 +regSDMA0_QUEUE7_IB_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE7_IB_RPTR = 0x02f3 +regSDMA0_QUEUE7_IB_RPTR_BASE_IDX = 0 +regSDMA0_QUEUE7_IB_OFFSET = 0x02f4 +regSDMA0_QUEUE7_IB_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE7_IB_BASE_LO = 0x02f5 +regSDMA0_QUEUE7_IB_BASE_LO_BASE_IDX = 0 +regSDMA0_QUEUE7_IB_BASE_HI = 0x02f6 +regSDMA0_QUEUE7_IB_BASE_HI_BASE_IDX = 0 +regSDMA0_QUEUE7_IB_SIZE = 0x02f7 +regSDMA0_QUEUE7_IB_SIZE_BASE_IDX = 0 +regSDMA0_QUEUE7_SKIP_CNTL = 0x02f8 +regSDMA0_QUEUE7_SKIP_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE7_CONTEXT_STATUS = 0x02f9 +regSDMA0_QUEUE7_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA0_QUEUE7_DOORBELL = 0x02fa +regSDMA0_QUEUE7_DOORBELL_BASE_IDX = 0 +regSDMA0_QUEUE7_DOORBELL_LOG = 0x0311 +regSDMA0_QUEUE7_DOORBELL_LOG_BASE_IDX = 0 +regSDMA0_QUEUE7_DOORBELL_OFFSET = 0x0313 +regSDMA0_QUEUE7_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA0_QUEUE7_CSA_ADDR_LO = 0x0314 +regSDMA0_QUEUE7_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE7_CSA_ADDR_HI = 0x0315 +regSDMA0_QUEUE7_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE7_SCHEDULE_CNTL = 0x0316 +regSDMA0_QUEUE7_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE7_IB_SUB_REMAIN = 0x0317 +regSDMA0_QUEUE7_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA0_QUEUE7_PREEMPT = 0x0318 +regSDMA0_QUEUE7_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE7_DUMMY_REG = 0x0319 +regSDMA0_QUEUE7_DUMMY_REG_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_WPTR_POLL_ADDR_HI = 0x031a +regSDMA0_QUEUE7_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_WPTR_POLL_ADDR_LO = 0x031b +regSDMA0_QUEUE7_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_AQL_CNTL = 0x031c +regSDMA0_QUEUE7_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA0_QUEUE7_MINOR_PTR_UPDATE = 0x031d +regSDMA0_QUEUE7_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA0_QUEUE7_RB_PREEMPT = 0x031e +regSDMA0_QUEUE7_RB_PREEMPT_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA0 = 0x0328 +regSDMA0_QUEUE7_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA1 = 0x0329 +regSDMA0_QUEUE7_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA2 = 0x032a +regSDMA0_QUEUE7_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA3 = 0x032b +regSDMA0_QUEUE7_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA4 = 0x032c +regSDMA0_QUEUE7_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA5 = 0x032d +regSDMA0_QUEUE7_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA6 = 0x032e +regSDMA0_QUEUE7_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA7 = 0x032f +regSDMA0_QUEUE7_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA8 = 0x0330 +regSDMA0_QUEUE7_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA9 = 0x0331 +regSDMA0_QUEUE7_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_DATA10 = 0x0332 +regSDMA0_QUEUE7_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA0_QUEUE7_MIDCMD_CNTL = 0x0333 +regSDMA0_QUEUE7_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA1_DEC_START = 0x0600 +regSDMA1_DEC_START_BASE_IDX = 0 +regSDMA1_F32_MISC_CNTL = 0x060b +regSDMA1_F32_MISC_CNTL_BASE_IDX = 0 +regSDMA1_GLOBAL_TIMESTAMP_LO = 0x060f +regSDMA1_GLOBAL_TIMESTAMP_LO_BASE_IDX = 0 +regSDMA1_GLOBAL_TIMESTAMP_HI = 0x0610 +regSDMA1_GLOBAL_TIMESTAMP_HI_BASE_IDX = 0 +regSDMA1_POWER_CNTL = 0x061a +regSDMA1_POWER_CNTL_BASE_IDX = 0 +regSDMA1_CNTL = 0x061c +regSDMA1_CNTL_BASE_IDX = 0 +regSDMA1_CHICKEN_BITS = 0x061d +regSDMA1_CHICKEN_BITS_BASE_IDX = 0 +regSDMA1_GB_ADDR_CONFIG = 0x061e +regSDMA1_GB_ADDR_CONFIG_BASE_IDX = 0 +regSDMA1_GB_ADDR_CONFIG_READ = 0x061f +regSDMA1_GB_ADDR_CONFIG_READ_BASE_IDX = 0 +regSDMA1_RB_RPTR_FETCH = 0x0620 +regSDMA1_RB_RPTR_FETCH_BASE_IDX = 0 +regSDMA1_RB_RPTR_FETCH_HI = 0x0621 +regSDMA1_RB_RPTR_FETCH_HI_BASE_IDX = 0 +regSDMA1_SEM_WAIT_FAIL_TIMER_CNTL = 0x0622 +regSDMA1_SEM_WAIT_FAIL_TIMER_CNTL_BASE_IDX = 0 +regSDMA1_IB_OFFSET_FETCH = 0x0623 +regSDMA1_IB_OFFSET_FETCH_BASE_IDX = 0 +regSDMA1_PROGRAM = 0x0624 +regSDMA1_PROGRAM_BASE_IDX = 0 +regSDMA1_STATUS_REG = 0x0625 +regSDMA1_STATUS_REG_BASE_IDX = 0 +regSDMA1_STATUS1_REG = 0x0626 +regSDMA1_STATUS1_REG_BASE_IDX = 0 +regSDMA1_CNTL1 = 0x0627 +regSDMA1_CNTL1_BASE_IDX = 0 +regSDMA1_HBM_PAGE_CONFIG = 0x0628 +regSDMA1_HBM_PAGE_CONFIG_BASE_IDX = 0 +regSDMA1_UCODE_CHECKSUM = 0x0629 +regSDMA1_UCODE_CHECKSUM_BASE_IDX = 0 +regSDMA1_FREEZE = 0x062b +regSDMA1_FREEZE_BASE_IDX = 0 +regSDMA1_PROCESS_QUANTUM0 = 0x062c +regSDMA1_PROCESS_QUANTUM0_BASE_IDX = 0 +regSDMA1_PROCESS_QUANTUM1 = 0x062d +regSDMA1_PROCESS_QUANTUM1_BASE_IDX = 0 +regSDMA1_WATCHDOG_CNTL = 0x062e +regSDMA1_WATCHDOG_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE_STATUS0 = 0x062f +regSDMA1_QUEUE_STATUS0_BASE_IDX = 0 +regSDMA1_EDC_CONFIG = 0x0632 +regSDMA1_EDC_CONFIG_BASE_IDX = 0 +regSDMA1_BA_THRESHOLD = 0x0633 +regSDMA1_BA_THRESHOLD_BASE_IDX = 0 +regSDMA1_ID = 0x0634 +regSDMA1_ID_BASE_IDX = 0 +regSDMA1_VERSION = 0x0635 +regSDMA1_VERSION_BASE_IDX = 0 +regSDMA1_EDC_COUNTER = 0x0636 +regSDMA1_EDC_COUNTER_BASE_IDX = 0 +regSDMA1_EDC_COUNTER_CLEAR = 0x0637 +regSDMA1_EDC_COUNTER_CLEAR_BASE_IDX = 0 +regSDMA1_STATUS2_REG = 0x0638 +regSDMA1_STATUS2_REG_BASE_IDX = 0 +regSDMA1_ATOMIC_CNTL = 0x0639 +regSDMA1_ATOMIC_CNTL_BASE_IDX = 0 +regSDMA1_ATOMIC_PREOP_LO = 0x063a +regSDMA1_ATOMIC_PREOP_LO_BASE_IDX = 0 +regSDMA1_ATOMIC_PREOP_HI = 0x063b +regSDMA1_ATOMIC_PREOP_HI_BASE_IDX = 0 +regSDMA1_UTCL1_CNTL = 0x063c +regSDMA1_UTCL1_CNTL_BASE_IDX = 0 +regSDMA1_UTCL1_WATERMK = 0x063d +regSDMA1_UTCL1_WATERMK_BASE_IDX = 0 +regSDMA1_UTCL1_TIMEOUT = 0x063e +regSDMA1_UTCL1_TIMEOUT_BASE_IDX = 0 +regSDMA1_UTCL1_PAGE = 0x063f +regSDMA1_UTCL1_PAGE_BASE_IDX = 0 +regSDMA1_UTCL1_RD_STATUS = 0x0640 +regSDMA1_UTCL1_RD_STATUS_BASE_IDX = 0 +regSDMA1_UTCL1_WR_STATUS = 0x0641 +regSDMA1_UTCL1_WR_STATUS_BASE_IDX = 0 +regSDMA1_UTCL1_INV0 = 0x0642 +regSDMA1_UTCL1_INV0_BASE_IDX = 0 +regSDMA1_UTCL1_INV1 = 0x0643 +regSDMA1_UTCL1_INV1_BASE_IDX = 0 +regSDMA1_UTCL1_INV2 = 0x0644 +regSDMA1_UTCL1_INV2_BASE_IDX = 0 +regSDMA1_UTCL1_RD_XNACK0 = 0x0645 +regSDMA1_UTCL1_RD_XNACK0_BASE_IDX = 0 +regSDMA1_UTCL1_RD_XNACK1 = 0x0646 +regSDMA1_UTCL1_RD_XNACK1_BASE_IDX = 0 +regSDMA1_UTCL1_WR_XNACK0 = 0x0647 +regSDMA1_UTCL1_WR_XNACK0_BASE_IDX = 0 +regSDMA1_UTCL1_WR_XNACK1 = 0x0648 +regSDMA1_UTCL1_WR_XNACK1_BASE_IDX = 0 +regSDMA1_RELAX_ORDERING_LUT = 0x064a +regSDMA1_RELAX_ORDERING_LUT_BASE_IDX = 0 +regSDMA1_CHICKEN_BITS_2 = 0x064b +regSDMA1_CHICKEN_BITS_2_BASE_IDX = 0 +regSDMA1_STATUS3_REG = 0x064c +regSDMA1_STATUS3_REG_BASE_IDX = 0 +regSDMA1_PHYSICAL_ADDR_LO = 0x064d +regSDMA1_PHYSICAL_ADDR_LO_BASE_IDX = 0 +regSDMA1_PHYSICAL_ADDR_HI = 0x064e +regSDMA1_PHYSICAL_ADDR_HI_BASE_IDX = 0 +regSDMA1_GLOBAL_QUANTUM = 0x064f +regSDMA1_GLOBAL_QUANTUM_BASE_IDX = 0 +regSDMA1_ERROR_LOG = 0x0650 +regSDMA1_ERROR_LOG_BASE_IDX = 0 +regSDMA1_PUB_DUMMY_REG0 = 0x0651 +regSDMA1_PUB_DUMMY_REG0_BASE_IDX = 0 +regSDMA1_PUB_DUMMY_REG1 = 0x0652 +regSDMA1_PUB_DUMMY_REG1_BASE_IDX = 0 +regSDMA1_PUB_DUMMY_REG2 = 0x0653 +regSDMA1_PUB_DUMMY_REG2_BASE_IDX = 0 +regSDMA1_PUB_DUMMY_REG3 = 0x0654 +regSDMA1_PUB_DUMMY_REG3_BASE_IDX = 0 +regSDMA1_F32_COUNTER = 0x0655 +regSDMA1_F32_COUNTER_BASE_IDX = 0 +regSDMA1_CRD_CNTL = 0x065b +regSDMA1_CRD_CNTL_BASE_IDX = 0 +regSDMA1_RLC_CGCG_CTRL = 0x065c +regSDMA1_RLC_CGCG_CTRL_BASE_IDX = 0 +regSDMA1_AQL_STATUS = 0x065f +regSDMA1_AQL_STATUS_BASE_IDX = 0 +regSDMA1_EA_DBIT_ADDR_DATA = 0x0660 +regSDMA1_EA_DBIT_ADDR_DATA_BASE_IDX = 0 +regSDMA1_EA_DBIT_ADDR_INDEX = 0x0661 +regSDMA1_EA_DBIT_ADDR_INDEX_BASE_IDX = 0 +regSDMA1_TLBI_GCR_CNTL = 0x0662 +regSDMA1_TLBI_GCR_CNTL_BASE_IDX = 0 +regSDMA1_TILING_CONFIG = 0x0663 +regSDMA1_TILING_CONFIG_BASE_IDX = 0 +regSDMA1_INT_STATUS = 0x0670 +regSDMA1_INT_STATUS_BASE_IDX = 0 +regSDMA1_HOLE_ADDR_LO = 0x0672 +regSDMA1_HOLE_ADDR_LO_BASE_IDX = 0 +regSDMA1_HOLE_ADDR_HI = 0x0673 +regSDMA1_HOLE_ADDR_HI_BASE_IDX = 0 +regSDMA1_CLOCK_GATING_STATUS = 0x0675 +regSDMA1_CLOCK_GATING_STATUS_BASE_IDX = 0 +regSDMA1_STATUS4_REG = 0x0676 +regSDMA1_STATUS4_REG_BASE_IDX = 0 +regSDMA1_SCRATCH_RAM_DATA = 0x0677 +regSDMA1_SCRATCH_RAM_DATA_BASE_IDX = 0 +regSDMA1_SCRATCH_RAM_ADDR = 0x0678 +regSDMA1_SCRATCH_RAM_ADDR_BASE_IDX = 0 +regSDMA1_TIMESTAMP_CNTL = 0x0679 +regSDMA1_TIMESTAMP_CNTL_BASE_IDX = 0 +regSDMA1_STATUS5_REG = 0x067a +regSDMA1_STATUS5_REG_BASE_IDX = 0 +regSDMA1_QUEUE_RESET_REQ = 0x067b +regSDMA1_QUEUE_RESET_REQ_BASE_IDX = 0 +regSDMA1_STATUS6_REG = 0x067c +regSDMA1_STATUS6_REG_BASE_IDX = 0 +regSDMA1_UCODE1_CHECKSUM = 0x067d +regSDMA1_UCODE1_CHECKSUM_BASE_IDX = 0 +regSDMA1_CE_CTRL = 0x067e +regSDMA1_CE_CTRL_BASE_IDX = 0 +regSDMA1_FED_STATUS = 0x067f +regSDMA1_FED_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_CNTL = 0x0680 +regSDMA1_QUEUE0_RB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_BASE = 0x0681 +regSDMA1_QUEUE0_RB_BASE_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_BASE_HI = 0x0682 +regSDMA1_QUEUE0_RB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_RPTR = 0x0683 +regSDMA1_QUEUE0_RB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_RPTR_HI = 0x0684 +regSDMA1_QUEUE0_RB_RPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_WPTR = 0x0685 +regSDMA1_QUEUE0_RB_WPTR_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_WPTR_HI = 0x0686 +regSDMA1_QUEUE0_RB_WPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_RPTR_ADDR_HI = 0x0688 +regSDMA1_QUEUE0_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_RPTR_ADDR_LO = 0x0689 +regSDMA1_QUEUE0_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE0_IB_CNTL = 0x068a +regSDMA1_QUEUE0_IB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE0_IB_RPTR = 0x068b +regSDMA1_QUEUE0_IB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE0_IB_OFFSET = 0x068c +regSDMA1_QUEUE0_IB_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE0_IB_BASE_LO = 0x068d +regSDMA1_QUEUE0_IB_BASE_LO_BASE_IDX = 0 +regSDMA1_QUEUE0_IB_BASE_HI = 0x068e +regSDMA1_QUEUE0_IB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE0_IB_SIZE = 0x068f +regSDMA1_QUEUE0_IB_SIZE_BASE_IDX = 0 +regSDMA1_QUEUE0_SKIP_CNTL = 0x0690 +regSDMA1_QUEUE0_SKIP_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE0_CONTEXT_STATUS = 0x0691 +regSDMA1_QUEUE0_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE0_DOORBELL = 0x0692 +regSDMA1_QUEUE0_DOORBELL_BASE_IDX = 0 +regSDMA1_QUEUE0_DOORBELL_LOG = 0x06a9 +regSDMA1_QUEUE0_DOORBELL_LOG_BASE_IDX = 0 +regSDMA1_QUEUE0_DOORBELL_OFFSET = 0x06ab +regSDMA1_QUEUE0_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE0_CSA_ADDR_LO = 0x06ac +regSDMA1_QUEUE0_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE0_CSA_ADDR_HI = 0x06ad +regSDMA1_QUEUE0_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE0_SCHEDULE_CNTL = 0x06ae +regSDMA1_QUEUE0_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE0_IB_SUB_REMAIN = 0x06af +regSDMA1_QUEUE0_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA1_QUEUE0_PREEMPT = 0x06b0 +regSDMA1_QUEUE0_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE0_DUMMY_REG = 0x06b1 +regSDMA1_QUEUE0_DUMMY_REG_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_HI = 0x06b2 +regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_LO = 0x06b3 +regSDMA1_QUEUE0_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_AQL_CNTL = 0x06b4 +regSDMA1_QUEUE0_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE0_MINOR_PTR_UPDATE = 0x06b5 +regSDMA1_QUEUE0_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA1_QUEUE0_RB_PREEMPT = 0x06b6 +regSDMA1_QUEUE0_RB_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA0 = 0x06c0 +regSDMA1_QUEUE0_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA1 = 0x06c1 +regSDMA1_QUEUE0_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA2 = 0x06c2 +regSDMA1_QUEUE0_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA3 = 0x06c3 +regSDMA1_QUEUE0_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA4 = 0x06c4 +regSDMA1_QUEUE0_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA5 = 0x06c5 +regSDMA1_QUEUE0_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA6 = 0x06c6 +regSDMA1_QUEUE0_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA7 = 0x06c7 +regSDMA1_QUEUE0_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA8 = 0x06c8 +regSDMA1_QUEUE0_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA9 = 0x06c9 +regSDMA1_QUEUE0_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_DATA10 = 0x06ca +regSDMA1_QUEUE0_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA1_QUEUE0_MIDCMD_CNTL = 0x06cb +regSDMA1_QUEUE0_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_CNTL = 0x06d8 +regSDMA1_QUEUE1_RB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_BASE = 0x06d9 +regSDMA1_QUEUE1_RB_BASE_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_BASE_HI = 0x06da +regSDMA1_QUEUE1_RB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_RPTR = 0x06db +regSDMA1_QUEUE1_RB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_RPTR_HI = 0x06dc +regSDMA1_QUEUE1_RB_RPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_WPTR = 0x06dd +regSDMA1_QUEUE1_RB_WPTR_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_WPTR_HI = 0x06de +regSDMA1_QUEUE1_RB_WPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_RPTR_ADDR_HI = 0x06e0 +regSDMA1_QUEUE1_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_RPTR_ADDR_LO = 0x06e1 +regSDMA1_QUEUE1_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE1_IB_CNTL = 0x06e2 +regSDMA1_QUEUE1_IB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE1_IB_RPTR = 0x06e3 +regSDMA1_QUEUE1_IB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE1_IB_OFFSET = 0x06e4 +regSDMA1_QUEUE1_IB_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE1_IB_BASE_LO = 0x06e5 +regSDMA1_QUEUE1_IB_BASE_LO_BASE_IDX = 0 +regSDMA1_QUEUE1_IB_BASE_HI = 0x06e6 +regSDMA1_QUEUE1_IB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE1_IB_SIZE = 0x06e7 +regSDMA1_QUEUE1_IB_SIZE_BASE_IDX = 0 +regSDMA1_QUEUE1_SKIP_CNTL = 0x06e8 +regSDMA1_QUEUE1_SKIP_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE1_CONTEXT_STATUS = 0x06e9 +regSDMA1_QUEUE1_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE1_DOORBELL = 0x06ea +regSDMA1_QUEUE1_DOORBELL_BASE_IDX = 0 +regSDMA1_QUEUE1_DOORBELL_LOG = 0x0701 +regSDMA1_QUEUE1_DOORBELL_LOG_BASE_IDX = 0 +regSDMA1_QUEUE1_DOORBELL_OFFSET = 0x0703 +regSDMA1_QUEUE1_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE1_CSA_ADDR_LO = 0x0704 +regSDMA1_QUEUE1_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE1_CSA_ADDR_HI = 0x0705 +regSDMA1_QUEUE1_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE1_SCHEDULE_CNTL = 0x0706 +regSDMA1_QUEUE1_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE1_IB_SUB_REMAIN = 0x0707 +regSDMA1_QUEUE1_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA1_QUEUE1_PREEMPT = 0x0708 +regSDMA1_QUEUE1_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE1_DUMMY_REG = 0x0709 +regSDMA1_QUEUE1_DUMMY_REG_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_WPTR_POLL_ADDR_HI = 0x070a +regSDMA1_QUEUE1_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_WPTR_POLL_ADDR_LO = 0x070b +regSDMA1_QUEUE1_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_AQL_CNTL = 0x070c +regSDMA1_QUEUE1_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE1_MINOR_PTR_UPDATE = 0x070d +regSDMA1_QUEUE1_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA1_QUEUE1_RB_PREEMPT = 0x070e +regSDMA1_QUEUE1_RB_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA0 = 0x0718 +regSDMA1_QUEUE1_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA1 = 0x0719 +regSDMA1_QUEUE1_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA2 = 0x071a +regSDMA1_QUEUE1_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA3 = 0x071b +regSDMA1_QUEUE1_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA4 = 0x071c +regSDMA1_QUEUE1_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA5 = 0x071d +regSDMA1_QUEUE1_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA6 = 0x071e +regSDMA1_QUEUE1_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA7 = 0x071f +regSDMA1_QUEUE1_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA8 = 0x0720 +regSDMA1_QUEUE1_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA9 = 0x0721 +regSDMA1_QUEUE1_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_DATA10 = 0x0722 +regSDMA1_QUEUE1_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA1_QUEUE1_MIDCMD_CNTL = 0x0723 +regSDMA1_QUEUE1_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_CNTL = 0x0730 +regSDMA1_QUEUE2_RB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_BASE = 0x0731 +regSDMA1_QUEUE2_RB_BASE_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_BASE_HI = 0x0732 +regSDMA1_QUEUE2_RB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_RPTR = 0x0733 +regSDMA1_QUEUE2_RB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_RPTR_HI = 0x0734 +regSDMA1_QUEUE2_RB_RPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_WPTR = 0x0735 +regSDMA1_QUEUE2_RB_WPTR_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_WPTR_HI = 0x0736 +regSDMA1_QUEUE2_RB_WPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_RPTR_ADDR_HI = 0x0738 +regSDMA1_QUEUE2_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_RPTR_ADDR_LO = 0x0739 +regSDMA1_QUEUE2_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE2_IB_CNTL = 0x073a +regSDMA1_QUEUE2_IB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE2_IB_RPTR = 0x073b +regSDMA1_QUEUE2_IB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE2_IB_OFFSET = 0x073c +regSDMA1_QUEUE2_IB_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE2_IB_BASE_LO = 0x073d +regSDMA1_QUEUE2_IB_BASE_LO_BASE_IDX = 0 +regSDMA1_QUEUE2_IB_BASE_HI = 0x073e +regSDMA1_QUEUE2_IB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE2_IB_SIZE = 0x073f +regSDMA1_QUEUE2_IB_SIZE_BASE_IDX = 0 +regSDMA1_QUEUE2_SKIP_CNTL = 0x0740 +regSDMA1_QUEUE2_SKIP_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE2_CONTEXT_STATUS = 0x0741 +regSDMA1_QUEUE2_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE2_DOORBELL = 0x0742 +regSDMA1_QUEUE2_DOORBELL_BASE_IDX = 0 +regSDMA1_QUEUE2_DOORBELL_LOG = 0x0759 +regSDMA1_QUEUE2_DOORBELL_LOG_BASE_IDX = 0 +regSDMA1_QUEUE2_DOORBELL_OFFSET = 0x075b +regSDMA1_QUEUE2_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE2_CSA_ADDR_LO = 0x075c +regSDMA1_QUEUE2_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE2_CSA_ADDR_HI = 0x075d +regSDMA1_QUEUE2_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE2_SCHEDULE_CNTL = 0x075e +regSDMA1_QUEUE2_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE2_IB_SUB_REMAIN = 0x075f +regSDMA1_QUEUE2_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA1_QUEUE2_PREEMPT = 0x0760 +regSDMA1_QUEUE2_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE2_DUMMY_REG = 0x0761 +regSDMA1_QUEUE2_DUMMY_REG_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_WPTR_POLL_ADDR_HI = 0x0762 +regSDMA1_QUEUE2_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_WPTR_POLL_ADDR_LO = 0x0763 +regSDMA1_QUEUE2_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_AQL_CNTL = 0x0764 +regSDMA1_QUEUE2_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE2_MINOR_PTR_UPDATE = 0x0765 +regSDMA1_QUEUE2_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA1_QUEUE2_RB_PREEMPT = 0x0766 +regSDMA1_QUEUE2_RB_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA0 = 0x0770 +regSDMA1_QUEUE2_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA1 = 0x0771 +regSDMA1_QUEUE2_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA2 = 0x0772 +regSDMA1_QUEUE2_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA3 = 0x0773 +regSDMA1_QUEUE2_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA4 = 0x0774 +regSDMA1_QUEUE2_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA5 = 0x0775 +regSDMA1_QUEUE2_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA6 = 0x0776 +regSDMA1_QUEUE2_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA7 = 0x0777 +regSDMA1_QUEUE2_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA8 = 0x0778 +regSDMA1_QUEUE2_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA9 = 0x0779 +regSDMA1_QUEUE2_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_DATA10 = 0x077a +regSDMA1_QUEUE2_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA1_QUEUE2_MIDCMD_CNTL = 0x077b +regSDMA1_QUEUE2_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_CNTL = 0x0788 +regSDMA1_QUEUE3_RB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_BASE = 0x0789 +regSDMA1_QUEUE3_RB_BASE_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_BASE_HI = 0x078a +regSDMA1_QUEUE3_RB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_RPTR = 0x078b +regSDMA1_QUEUE3_RB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_RPTR_HI = 0x078c +regSDMA1_QUEUE3_RB_RPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_WPTR = 0x078d +regSDMA1_QUEUE3_RB_WPTR_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_WPTR_HI = 0x078e +regSDMA1_QUEUE3_RB_WPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_RPTR_ADDR_HI = 0x0790 +regSDMA1_QUEUE3_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_RPTR_ADDR_LO = 0x0791 +regSDMA1_QUEUE3_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE3_IB_CNTL = 0x0792 +regSDMA1_QUEUE3_IB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE3_IB_RPTR = 0x0793 +regSDMA1_QUEUE3_IB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE3_IB_OFFSET = 0x0794 +regSDMA1_QUEUE3_IB_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE3_IB_BASE_LO = 0x0795 +regSDMA1_QUEUE3_IB_BASE_LO_BASE_IDX = 0 +regSDMA1_QUEUE3_IB_BASE_HI = 0x0796 +regSDMA1_QUEUE3_IB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE3_IB_SIZE = 0x0797 +regSDMA1_QUEUE3_IB_SIZE_BASE_IDX = 0 +regSDMA1_QUEUE3_SKIP_CNTL = 0x0798 +regSDMA1_QUEUE3_SKIP_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE3_CONTEXT_STATUS = 0x0799 +regSDMA1_QUEUE3_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE3_DOORBELL = 0x079a +regSDMA1_QUEUE3_DOORBELL_BASE_IDX = 0 +regSDMA1_QUEUE3_DOORBELL_LOG = 0x07b1 +regSDMA1_QUEUE3_DOORBELL_LOG_BASE_IDX = 0 +regSDMA1_QUEUE3_DOORBELL_OFFSET = 0x07b3 +regSDMA1_QUEUE3_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE3_CSA_ADDR_LO = 0x07b4 +regSDMA1_QUEUE3_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE3_CSA_ADDR_HI = 0x07b5 +regSDMA1_QUEUE3_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE3_SCHEDULE_CNTL = 0x07b6 +regSDMA1_QUEUE3_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE3_IB_SUB_REMAIN = 0x07b7 +regSDMA1_QUEUE3_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA1_QUEUE3_PREEMPT = 0x07b8 +regSDMA1_QUEUE3_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE3_DUMMY_REG = 0x07b9 +regSDMA1_QUEUE3_DUMMY_REG_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_WPTR_POLL_ADDR_HI = 0x07ba +regSDMA1_QUEUE3_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_WPTR_POLL_ADDR_LO = 0x07bb +regSDMA1_QUEUE3_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_AQL_CNTL = 0x07bc +regSDMA1_QUEUE3_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE3_MINOR_PTR_UPDATE = 0x07bd +regSDMA1_QUEUE3_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA1_QUEUE3_RB_PREEMPT = 0x07be +regSDMA1_QUEUE3_RB_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA0 = 0x07c8 +regSDMA1_QUEUE3_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA1 = 0x07c9 +regSDMA1_QUEUE3_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA2 = 0x07ca +regSDMA1_QUEUE3_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA3 = 0x07cb +regSDMA1_QUEUE3_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA4 = 0x07cc +regSDMA1_QUEUE3_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA5 = 0x07cd +regSDMA1_QUEUE3_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA6 = 0x07ce +regSDMA1_QUEUE3_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA7 = 0x07cf +regSDMA1_QUEUE3_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA8 = 0x07d0 +regSDMA1_QUEUE3_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA9 = 0x07d1 +regSDMA1_QUEUE3_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_DATA10 = 0x07d2 +regSDMA1_QUEUE3_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA1_QUEUE3_MIDCMD_CNTL = 0x07d3 +regSDMA1_QUEUE3_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_CNTL = 0x07e0 +regSDMA1_QUEUE4_RB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_BASE = 0x07e1 +regSDMA1_QUEUE4_RB_BASE_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_BASE_HI = 0x07e2 +regSDMA1_QUEUE4_RB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_RPTR = 0x07e3 +regSDMA1_QUEUE4_RB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_RPTR_HI = 0x07e4 +regSDMA1_QUEUE4_RB_RPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_WPTR = 0x07e5 +regSDMA1_QUEUE4_RB_WPTR_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_WPTR_HI = 0x07e6 +regSDMA1_QUEUE4_RB_WPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_RPTR_ADDR_HI = 0x07e8 +regSDMA1_QUEUE4_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_RPTR_ADDR_LO = 0x07e9 +regSDMA1_QUEUE4_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE4_IB_CNTL = 0x07ea +regSDMA1_QUEUE4_IB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE4_IB_RPTR = 0x07eb +regSDMA1_QUEUE4_IB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE4_IB_OFFSET = 0x07ec +regSDMA1_QUEUE4_IB_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE4_IB_BASE_LO = 0x07ed +regSDMA1_QUEUE4_IB_BASE_LO_BASE_IDX = 0 +regSDMA1_QUEUE4_IB_BASE_HI = 0x07ee +regSDMA1_QUEUE4_IB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE4_IB_SIZE = 0x07ef +regSDMA1_QUEUE4_IB_SIZE_BASE_IDX = 0 +regSDMA1_QUEUE4_SKIP_CNTL = 0x07f0 +regSDMA1_QUEUE4_SKIP_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE4_CONTEXT_STATUS = 0x07f1 +regSDMA1_QUEUE4_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE4_DOORBELL = 0x07f2 +regSDMA1_QUEUE4_DOORBELL_BASE_IDX = 0 +regSDMA1_QUEUE4_DOORBELL_LOG = 0x0809 +regSDMA1_QUEUE4_DOORBELL_LOG_BASE_IDX = 0 +regSDMA1_QUEUE4_DOORBELL_OFFSET = 0x080b +regSDMA1_QUEUE4_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE4_CSA_ADDR_LO = 0x080c +regSDMA1_QUEUE4_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE4_CSA_ADDR_HI = 0x080d +regSDMA1_QUEUE4_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE4_SCHEDULE_CNTL = 0x080e +regSDMA1_QUEUE4_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE4_IB_SUB_REMAIN = 0x080f +regSDMA1_QUEUE4_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA1_QUEUE4_PREEMPT = 0x0810 +regSDMA1_QUEUE4_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE4_DUMMY_REG = 0x0811 +regSDMA1_QUEUE4_DUMMY_REG_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_WPTR_POLL_ADDR_HI = 0x0812 +regSDMA1_QUEUE4_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_WPTR_POLL_ADDR_LO = 0x0813 +regSDMA1_QUEUE4_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_AQL_CNTL = 0x0814 +regSDMA1_QUEUE4_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE4_MINOR_PTR_UPDATE = 0x0815 +regSDMA1_QUEUE4_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA1_QUEUE4_RB_PREEMPT = 0x0816 +regSDMA1_QUEUE4_RB_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA0 = 0x0820 +regSDMA1_QUEUE4_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA1 = 0x0821 +regSDMA1_QUEUE4_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA2 = 0x0822 +regSDMA1_QUEUE4_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA3 = 0x0823 +regSDMA1_QUEUE4_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA4 = 0x0824 +regSDMA1_QUEUE4_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA5 = 0x0825 +regSDMA1_QUEUE4_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA6 = 0x0826 +regSDMA1_QUEUE4_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA7 = 0x0827 +regSDMA1_QUEUE4_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA8 = 0x0828 +regSDMA1_QUEUE4_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA9 = 0x0829 +regSDMA1_QUEUE4_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_DATA10 = 0x082a +regSDMA1_QUEUE4_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA1_QUEUE4_MIDCMD_CNTL = 0x082b +regSDMA1_QUEUE4_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_CNTL = 0x0838 +regSDMA1_QUEUE5_RB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_BASE = 0x0839 +regSDMA1_QUEUE5_RB_BASE_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_BASE_HI = 0x083a +regSDMA1_QUEUE5_RB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_RPTR = 0x083b +regSDMA1_QUEUE5_RB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_RPTR_HI = 0x083c +regSDMA1_QUEUE5_RB_RPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_WPTR = 0x083d +regSDMA1_QUEUE5_RB_WPTR_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_WPTR_HI = 0x083e +regSDMA1_QUEUE5_RB_WPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_RPTR_ADDR_HI = 0x0840 +regSDMA1_QUEUE5_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_RPTR_ADDR_LO = 0x0841 +regSDMA1_QUEUE5_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE5_IB_CNTL = 0x0842 +regSDMA1_QUEUE5_IB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE5_IB_RPTR = 0x0843 +regSDMA1_QUEUE5_IB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE5_IB_OFFSET = 0x0844 +regSDMA1_QUEUE5_IB_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE5_IB_BASE_LO = 0x0845 +regSDMA1_QUEUE5_IB_BASE_LO_BASE_IDX = 0 +regSDMA1_QUEUE5_IB_BASE_HI = 0x0846 +regSDMA1_QUEUE5_IB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE5_IB_SIZE = 0x0847 +regSDMA1_QUEUE5_IB_SIZE_BASE_IDX = 0 +regSDMA1_QUEUE5_SKIP_CNTL = 0x0848 +regSDMA1_QUEUE5_SKIP_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE5_CONTEXT_STATUS = 0x0849 +regSDMA1_QUEUE5_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE5_DOORBELL = 0x084a +regSDMA1_QUEUE5_DOORBELL_BASE_IDX = 0 +regSDMA1_QUEUE5_DOORBELL_LOG = 0x0861 +regSDMA1_QUEUE5_DOORBELL_LOG_BASE_IDX = 0 +regSDMA1_QUEUE5_DOORBELL_OFFSET = 0x0863 +regSDMA1_QUEUE5_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE5_CSA_ADDR_LO = 0x0864 +regSDMA1_QUEUE5_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE5_CSA_ADDR_HI = 0x0865 +regSDMA1_QUEUE5_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE5_SCHEDULE_CNTL = 0x0866 +regSDMA1_QUEUE5_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE5_IB_SUB_REMAIN = 0x0867 +regSDMA1_QUEUE5_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA1_QUEUE5_PREEMPT = 0x0868 +regSDMA1_QUEUE5_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE5_DUMMY_REG = 0x0869 +regSDMA1_QUEUE5_DUMMY_REG_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_WPTR_POLL_ADDR_HI = 0x086a +regSDMA1_QUEUE5_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_WPTR_POLL_ADDR_LO = 0x086b +regSDMA1_QUEUE5_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_AQL_CNTL = 0x086c +regSDMA1_QUEUE5_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE5_MINOR_PTR_UPDATE = 0x086d +regSDMA1_QUEUE5_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA1_QUEUE5_RB_PREEMPT = 0x086e +regSDMA1_QUEUE5_RB_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA0 = 0x0878 +regSDMA1_QUEUE5_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA1 = 0x0879 +regSDMA1_QUEUE5_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA2 = 0x087a +regSDMA1_QUEUE5_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA3 = 0x087b +regSDMA1_QUEUE5_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA4 = 0x087c +regSDMA1_QUEUE5_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA5 = 0x087d +regSDMA1_QUEUE5_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA6 = 0x087e +regSDMA1_QUEUE5_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA7 = 0x087f +regSDMA1_QUEUE5_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA8 = 0x0880 +regSDMA1_QUEUE5_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA9 = 0x0881 +regSDMA1_QUEUE5_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_DATA10 = 0x0882 +regSDMA1_QUEUE5_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA1_QUEUE5_MIDCMD_CNTL = 0x0883 +regSDMA1_QUEUE5_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_CNTL = 0x0890 +regSDMA1_QUEUE6_RB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_BASE = 0x0891 +regSDMA1_QUEUE6_RB_BASE_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_BASE_HI = 0x0892 +regSDMA1_QUEUE6_RB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_RPTR = 0x0893 +regSDMA1_QUEUE6_RB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_RPTR_HI = 0x0894 +regSDMA1_QUEUE6_RB_RPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_WPTR = 0x0895 +regSDMA1_QUEUE6_RB_WPTR_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_WPTR_HI = 0x0896 +regSDMA1_QUEUE6_RB_WPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_RPTR_ADDR_HI = 0x0898 +regSDMA1_QUEUE6_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_RPTR_ADDR_LO = 0x0899 +regSDMA1_QUEUE6_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE6_IB_CNTL = 0x089a +regSDMA1_QUEUE6_IB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE6_IB_RPTR = 0x089b +regSDMA1_QUEUE6_IB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE6_IB_OFFSET = 0x089c +regSDMA1_QUEUE6_IB_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE6_IB_BASE_LO = 0x089d +regSDMA1_QUEUE6_IB_BASE_LO_BASE_IDX = 0 +regSDMA1_QUEUE6_IB_BASE_HI = 0x089e +regSDMA1_QUEUE6_IB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE6_IB_SIZE = 0x089f +regSDMA1_QUEUE6_IB_SIZE_BASE_IDX = 0 +regSDMA1_QUEUE6_SKIP_CNTL = 0x08a0 +regSDMA1_QUEUE6_SKIP_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE6_CONTEXT_STATUS = 0x08a1 +regSDMA1_QUEUE6_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE6_DOORBELL = 0x08a2 +regSDMA1_QUEUE6_DOORBELL_BASE_IDX = 0 +regSDMA1_QUEUE6_DOORBELL_LOG = 0x08b9 +regSDMA1_QUEUE6_DOORBELL_LOG_BASE_IDX = 0 +regSDMA1_QUEUE6_DOORBELL_OFFSET = 0x08bb +regSDMA1_QUEUE6_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE6_CSA_ADDR_LO = 0x08bc +regSDMA1_QUEUE6_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE6_CSA_ADDR_HI = 0x08bd +regSDMA1_QUEUE6_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE6_SCHEDULE_CNTL = 0x08be +regSDMA1_QUEUE6_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE6_IB_SUB_REMAIN = 0x08bf +regSDMA1_QUEUE6_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA1_QUEUE6_PREEMPT = 0x08c0 +regSDMA1_QUEUE6_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE6_DUMMY_REG = 0x08c1 +regSDMA1_QUEUE6_DUMMY_REG_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_WPTR_POLL_ADDR_HI = 0x08c2 +regSDMA1_QUEUE6_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_WPTR_POLL_ADDR_LO = 0x08c3 +regSDMA1_QUEUE6_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_AQL_CNTL = 0x08c4 +regSDMA1_QUEUE6_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE6_MINOR_PTR_UPDATE = 0x08c5 +regSDMA1_QUEUE6_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA1_QUEUE6_RB_PREEMPT = 0x08c6 +regSDMA1_QUEUE6_RB_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA0 = 0x08d0 +regSDMA1_QUEUE6_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA1 = 0x08d1 +regSDMA1_QUEUE6_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA2 = 0x08d2 +regSDMA1_QUEUE6_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA3 = 0x08d3 +regSDMA1_QUEUE6_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA4 = 0x08d4 +regSDMA1_QUEUE6_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA5 = 0x08d5 +regSDMA1_QUEUE6_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA6 = 0x08d6 +regSDMA1_QUEUE6_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA7 = 0x08d7 +regSDMA1_QUEUE6_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA8 = 0x08d8 +regSDMA1_QUEUE6_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA9 = 0x08d9 +regSDMA1_QUEUE6_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_DATA10 = 0x08da +regSDMA1_QUEUE6_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA1_QUEUE6_MIDCMD_CNTL = 0x08db +regSDMA1_QUEUE6_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_CNTL = 0x08e8 +regSDMA1_QUEUE7_RB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_BASE = 0x08e9 +regSDMA1_QUEUE7_RB_BASE_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_BASE_HI = 0x08ea +regSDMA1_QUEUE7_RB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_RPTR = 0x08eb +regSDMA1_QUEUE7_RB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_RPTR_HI = 0x08ec +regSDMA1_QUEUE7_RB_RPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_WPTR = 0x08ed +regSDMA1_QUEUE7_RB_WPTR_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_WPTR_HI = 0x08ee +regSDMA1_QUEUE7_RB_WPTR_HI_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_RPTR_ADDR_HI = 0x08f0 +regSDMA1_QUEUE7_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_RPTR_ADDR_LO = 0x08f1 +regSDMA1_QUEUE7_RB_RPTR_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE7_IB_CNTL = 0x08f2 +regSDMA1_QUEUE7_IB_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE7_IB_RPTR = 0x08f3 +regSDMA1_QUEUE7_IB_RPTR_BASE_IDX = 0 +regSDMA1_QUEUE7_IB_OFFSET = 0x08f4 +regSDMA1_QUEUE7_IB_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE7_IB_BASE_LO = 0x08f5 +regSDMA1_QUEUE7_IB_BASE_LO_BASE_IDX = 0 +regSDMA1_QUEUE7_IB_BASE_HI = 0x08f6 +regSDMA1_QUEUE7_IB_BASE_HI_BASE_IDX = 0 +regSDMA1_QUEUE7_IB_SIZE = 0x08f7 +regSDMA1_QUEUE7_IB_SIZE_BASE_IDX = 0 +regSDMA1_QUEUE7_SKIP_CNTL = 0x08f8 +regSDMA1_QUEUE7_SKIP_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE7_CONTEXT_STATUS = 0x08f9 +regSDMA1_QUEUE7_CONTEXT_STATUS_BASE_IDX = 0 +regSDMA1_QUEUE7_DOORBELL = 0x08fa +regSDMA1_QUEUE7_DOORBELL_BASE_IDX = 0 +regSDMA1_QUEUE7_DOORBELL_LOG = 0x0911 +regSDMA1_QUEUE7_DOORBELL_LOG_BASE_IDX = 0 +regSDMA1_QUEUE7_DOORBELL_OFFSET = 0x0913 +regSDMA1_QUEUE7_DOORBELL_OFFSET_BASE_IDX = 0 +regSDMA1_QUEUE7_CSA_ADDR_LO = 0x0914 +regSDMA1_QUEUE7_CSA_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE7_CSA_ADDR_HI = 0x0915 +regSDMA1_QUEUE7_CSA_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE7_SCHEDULE_CNTL = 0x0916 +regSDMA1_QUEUE7_SCHEDULE_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE7_IB_SUB_REMAIN = 0x0917 +regSDMA1_QUEUE7_IB_SUB_REMAIN_BASE_IDX = 0 +regSDMA1_QUEUE7_PREEMPT = 0x0918 +regSDMA1_QUEUE7_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE7_DUMMY_REG = 0x0919 +regSDMA1_QUEUE7_DUMMY_REG_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_WPTR_POLL_ADDR_HI = 0x091a +regSDMA1_QUEUE7_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_WPTR_POLL_ADDR_LO = 0x091b +regSDMA1_QUEUE7_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_AQL_CNTL = 0x091c +regSDMA1_QUEUE7_RB_AQL_CNTL_BASE_IDX = 0 +regSDMA1_QUEUE7_MINOR_PTR_UPDATE = 0x091d +regSDMA1_QUEUE7_MINOR_PTR_UPDATE_BASE_IDX = 0 +regSDMA1_QUEUE7_RB_PREEMPT = 0x091e +regSDMA1_QUEUE7_RB_PREEMPT_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA0 = 0x0928 +regSDMA1_QUEUE7_MIDCMD_DATA0_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA1 = 0x0929 +regSDMA1_QUEUE7_MIDCMD_DATA1_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA2 = 0x092a +regSDMA1_QUEUE7_MIDCMD_DATA2_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA3 = 0x092b +regSDMA1_QUEUE7_MIDCMD_DATA3_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA4 = 0x092c +regSDMA1_QUEUE7_MIDCMD_DATA4_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA5 = 0x092d +regSDMA1_QUEUE7_MIDCMD_DATA5_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA6 = 0x092e +regSDMA1_QUEUE7_MIDCMD_DATA6_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA7 = 0x092f +regSDMA1_QUEUE7_MIDCMD_DATA7_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA8 = 0x0930 +regSDMA1_QUEUE7_MIDCMD_DATA8_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA9 = 0x0931 +regSDMA1_QUEUE7_MIDCMD_DATA9_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_DATA10 = 0x0932 +regSDMA1_QUEUE7_MIDCMD_DATA10_BASE_IDX = 0 +regSDMA1_QUEUE7_MIDCMD_CNTL = 0x0933 +regSDMA1_QUEUE7_MIDCMD_CNTL_BASE_IDX = 0 +regSDMA0_UCODE_ADDR = 0x5880 +regSDMA0_UCODE_ADDR_BASE_IDX = 1 +regSDMA0_UCODE_DATA = 0x5881 +regSDMA0_UCODE_DATA_BASE_IDX = 1 +regSDMA0_UCODE_SELFLOAD_CONTROL = 0x5882 +regSDMA0_UCODE_SELFLOAD_CONTROL_BASE_IDX = 1 +regSDMA0_BROADCAST_UCODE_ADDR = 0x5886 +regSDMA0_BROADCAST_UCODE_ADDR_BASE_IDX = 1 +regSDMA0_BROADCAST_UCODE_DATA = 0x5887 +regSDMA0_BROADCAST_UCODE_DATA_BASE_IDX = 1 +regSDMA0_F32_CNTL = 0x589a +regSDMA0_F32_CNTL_BASE_IDX = 1 +regSDMA1_UCODE_ADDR = 0x58a0 +regSDMA1_UCODE_ADDR_BASE_IDX = 1 +regSDMA1_UCODE_DATA = 0x58a1 +regSDMA1_UCODE_DATA_BASE_IDX = 1 +regSDMA1_UCODE_SELFLOAD_CONTROL = 0x58a2 +regSDMA1_UCODE_SELFLOAD_CONTROL_BASE_IDX = 1 +regSDMA1_BROADCAST_UCODE_ADDR = 0x58a6 +regSDMA1_BROADCAST_UCODE_ADDR_BASE_IDX = 1 +regSDMA1_BROADCAST_UCODE_DATA = 0x58a7 +regSDMA1_BROADCAST_UCODE_DATA_BASE_IDX = 1 +regSDMA1_F32_CNTL = 0x58ba +regSDMA1_F32_CNTL_BASE_IDX = 1 +regSDMA0_PERFCNT_PERFCOUNTER0_CFG = 0x3e20 +regSDMA0_PERFCNT_PERFCOUNTER0_CFG_BASE_IDX = 1 +regSDMA0_PERFCNT_PERFCOUNTER1_CFG = 0x3e21 +regSDMA0_PERFCNT_PERFCOUNTER1_CFG_BASE_IDX = 1 +regSDMA0_PERFCNT_PERFCOUNTER_RSLT_CNTL = 0x3e22 +regSDMA0_PERFCNT_PERFCOUNTER_RSLT_CNTL_BASE_IDX = 1 +regSDMA0_PERFCNT_MISC_CNTL = 0x3e23 +regSDMA0_PERFCNT_MISC_CNTL_BASE_IDX = 1 +regSDMA0_PERFCOUNTER0_SELECT = 0x3e24 +regSDMA0_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regSDMA0_PERFCOUNTER0_SELECT1 = 0x3e25 +regSDMA0_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regSDMA0_PERFCOUNTER1_SELECT = 0x3e26 +regSDMA0_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regSDMA0_PERFCOUNTER1_SELECT1 = 0x3e27 +regSDMA0_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regSDMA1_PERFCNT_PERFCOUNTER0_CFG = 0x3e2c +regSDMA1_PERFCNT_PERFCOUNTER0_CFG_BASE_IDX = 1 +regSDMA1_PERFCNT_PERFCOUNTER1_CFG = 0x3e2d +regSDMA1_PERFCNT_PERFCOUNTER1_CFG_BASE_IDX = 1 +regSDMA1_PERFCNT_PERFCOUNTER_RSLT_CNTL = 0x3e2e +regSDMA1_PERFCNT_PERFCOUNTER_RSLT_CNTL_BASE_IDX = 1 +regSDMA1_PERFCNT_MISC_CNTL = 0x3e2f +regSDMA1_PERFCNT_MISC_CNTL_BASE_IDX = 1 +regSDMA1_PERFCOUNTER0_SELECT = 0x3e30 +regSDMA1_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regSDMA1_PERFCOUNTER0_SELECT1 = 0x3e31 +regSDMA1_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regSDMA1_PERFCOUNTER1_SELECT = 0x3e32 +regSDMA1_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regSDMA1_PERFCOUNTER1_SELECT1 = 0x3e33 +regSDMA1_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regSDMA0_PERFCNT_PERFCOUNTER_LO = 0x3660 +regSDMA0_PERFCNT_PERFCOUNTER_LO_BASE_IDX = 1 +regSDMA0_PERFCNT_PERFCOUNTER_HI = 0x3661 +regSDMA0_PERFCNT_PERFCOUNTER_HI_BASE_IDX = 1 +regSDMA0_PERFCOUNTER0_LO = 0x3662 +regSDMA0_PERFCOUNTER0_LO_BASE_IDX = 1 +regSDMA0_PERFCOUNTER0_HI = 0x3663 +regSDMA0_PERFCOUNTER0_HI_BASE_IDX = 1 +regSDMA0_PERFCOUNTER1_LO = 0x3664 +regSDMA0_PERFCOUNTER1_LO_BASE_IDX = 1 +regSDMA0_PERFCOUNTER1_HI = 0x3665 +regSDMA0_PERFCOUNTER1_HI_BASE_IDX = 1 +regSDMA1_PERFCNT_PERFCOUNTER_LO = 0x366c +regSDMA1_PERFCNT_PERFCOUNTER_LO_BASE_IDX = 1 +regSDMA1_PERFCNT_PERFCOUNTER_HI = 0x366d +regSDMA1_PERFCNT_PERFCOUNTER_HI_BASE_IDX = 1 +regSDMA1_PERFCOUNTER0_LO = 0x366e +regSDMA1_PERFCOUNTER0_LO_BASE_IDX = 1 +regSDMA1_PERFCOUNTER0_HI = 0x366f +regSDMA1_PERFCOUNTER0_HI_BASE_IDX = 1 +regSDMA1_PERFCOUNTER1_LO = 0x3670 +regSDMA1_PERFCOUNTER1_LO_BASE_IDX = 1 +regSDMA1_PERFCOUNTER1_HI = 0x3671 +regSDMA1_PERFCOUNTER1_HI_BASE_IDX = 1 +regGRBM_CNTL = 0x0da0 +regGRBM_CNTL_BASE_IDX = 0 +regGRBM_SKEW_CNTL = 0x0da1 +regGRBM_SKEW_CNTL_BASE_IDX = 0 +regGRBM_STATUS2 = 0x0da2 +regGRBM_STATUS2_BASE_IDX = 0 +regGRBM_PWR_CNTL = 0x0da3 +regGRBM_PWR_CNTL_BASE_IDX = 0 +regGRBM_STATUS = 0x0da4 +regGRBM_STATUS_BASE_IDX = 0 +regGRBM_STATUS_SE0 = 0x0da5 +regGRBM_STATUS_SE0_BASE_IDX = 0 +regGRBM_STATUS_SE1 = 0x0da6 +regGRBM_STATUS_SE1_BASE_IDX = 0 +regGRBM_STATUS3 = 0x0da7 +regGRBM_STATUS3_BASE_IDX = 0 +regGRBM_SOFT_RESET = 0x0da8 +regGRBM_SOFT_RESET_BASE_IDX = 0 +regGRBM_GFX_CLKEN_CNTL = 0x0dac +regGRBM_GFX_CLKEN_CNTL_BASE_IDX = 0 +regGRBM_WAIT_IDLE_CLOCKS = 0x0dad +regGRBM_WAIT_IDLE_CLOCKS_BASE_IDX = 0 +regGRBM_STATUS_SE2 = 0x0dae +regGRBM_STATUS_SE2_BASE_IDX = 0 +regGRBM_STATUS_SE3 = 0x0daf +regGRBM_STATUS_SE3_BASE_IDX = 0 +regGRBM_STATUS_SE4 = 0x0db0 +regGRBM_STATUS_SE4_BASE_IDX = 0 +regGRBM_STATUS_SE5 = 0x0db1 +regGRBM_STATUS_SE5_BASE_IDX = 0 +regGRBM_READ_ERROR = 0x0db6 +regGRBM_READ_ERROR_BASE_IDX = 0 +regGRBM_READ_ERROR2 = 0x0db7 +regGRBM_READ_ERROR2_BASE_IDX = 0 +regGRBM_INT_CNTL = 0x0db8 +regGRBM_INT_CNTL_BASE_IDX = 0 +regGRBM_TRAP_OP = 0x0db9 +regGRBM_TRAP_OP_BASE_IDX = 0 +regGRBM_TRAP_ADDR = 0x0dba +regGRBM_TRAP_ADDR_BASE_IDX = 0 +regGRBM_TRAP_ADDR_MSK = 0x0dbb +regGRBM_TRAP_ADDR_MSK_BASE_IDX = 0 +regGRBM_TRAP_WD = 0x0dbc +regGRBM_TRAP_WD_BASE_IDX = 0 +regGRBM_TRAP_WD_MSK = 0x0dbd +regGRBM_TRAP_WD_MSK_BASE_IDX = 0 +regGRBM_DSM_BYPASS = 0x0dbe +regGRBM_DSM_BYPASS_BASE_IDX = 0 +regGRBM_WRITE_ERROR = 0x0dbf +regGRBM_WRITE_ERROR_BASE_IDX = 0 +regGRBM_CHIP_REVISION = 0x0dc1 +regGRBM_CHIP_REVISION_BASE_IDX = 0 +regGRBM_IH_CREDIT = 0x0dc4 +regGRBM_IH_CREDIT_BASE_IDX = 0 +regGRBM_PWR_CNTL2 = 0x0dc5 +regGRBM_PWR_CNTL2_BASE_IDX = 0 +regGRBM_UTCL2_INVAL_RANGE_START = 0x0dc6 +regGRBM_UTCL2_INVAL_RANGE_START_BASE_IDX = 0 +regGRBM_UTCL2_INVAL_RANGE_END = 0x0dc7 +regGRBM_UTCL2_INVAL_RANGE_END_BASE_IDX = 0 +regGRBM_INVALID_PIPE = 0x0dc9 +regGRBM_INVALID_PIPE_BASE_IDX = 0 +regGRBM_FENCE_RANGE0 = 0x0dca +regGRBM_FENCE_RANGE0_BASE_IDX = 0 +regGRBM_FENCE_RANGE1 = 0x0dcb +regGRBM_FENCE_RANGE1_BASE_IDX = 0 +regGRBM_SCRATCH_REG0 = 0x0de0 +regGRBM_SCRATCH_REG0_BASE_IDX = 0 +regGRBM_SCRATCH_REG1 = 0x0de1 +regGRBM_SCRATCH_REG1_BASE_IDX = 0 +regGRBM_SCRATCH_REG2 = 0x0de2 +regGRBM_SCRATCH_REG2_BASE_IDX = 0 +regGRBM_SCRATCH_REG3 = 0x0de3 +regGRBM_SCRATCH_REG3_BASE_IDX = 0 +regGRBM_SCRATCH_REG4 = 0x0de4 +regGRBM_SCRATCH_REG4_BASE_IDX = 0 +regGRBM_SCRATCH_REG5 = 0x0de5 +regGRBM_SCRATCH_REG5_BASE_IDX = 0 +regGRBM_SCRATCH_REG6 = 0x0de6 +regGRBM_SCRATCH_REG6_BASE_IDX = 0 +regGRBM_SCRATCH_REG7 = 0x0de7 +regGRBM_SCRATCH_REG7_BASE_IDX = 0 +regVIOLATION_DATA_ASYNC_VF_PROG = 0x0df1 +regVIOLATION_DATA_ASYNC_VF_PROG_BASE_IDX = 0 +regCP_CPC_DEBUG_CNTL = 0x0e20 +regCP_CPC_DEBUG_CNTL_BASE_IDX = 0 +regCP_CPC_DEBUG_DATA = 0x0e21 +regCP_CPC_DEBUG_DATA_BASE_IDX = 0 +regCP_CPC_STATUS = 0x0e24 +regCP_CPC_STATUS_BASE_IDX = 0 +regCP_CPC_BUSY_STAT = 0x0e25 +regCP_CPC_BUSY_STAT_BASE_IDX = 0 +regCP_CPC_STALLED_STAT1 = 0x0e26 +regCP_CPC_STALLED_STAT1_BASE_IDX = 0 +regCP_CPF_STATUS = 0x0e27 +regCP_CPF_STATUS_BASE_IDX = 0 +regCP_CPF_BUSY_STAT = 0x0e28 +regCP_CPF_BUSY_STAT_BASE_IDX = 0 +regCP_CPF_STALLED_STAT1 = 0x0e29 +regCP_CPF_STALLED_STAT1_BASE_IDX = 0 +regCP_CPC_BUSY_STAT2 = 0x0e2a +regCP_CPC_BUSY_STAT2_BASE_IDX = 0 +regCP_CPC_GRBM_FREE_COUNT = 0x0e2b +regCP_CPC_GRBM_FREE_COUNT_BASE_IDX = 0 +regCP_CPC_PRIV_VIOLATION_ADDR = 0x0e2c +regCP_CPC_PRIV_VIOLATION_ADDR_BASE_IDX = 0 +regCP_MEC_ME1_HEADER_DUMP = 0x0e2e +regCP_MEC_ME1_HEADER_DUMP_BASE_IDX = 0 +regCP_MEC_ME2_HEADER_DUMP = 0x0e2f +regCP_MEC_ME2_HEADER_DUMP_BASE_IDX = 0 +regCP_CPC_SCRATCH_INDEX = 0x0e30 +regCP_CPC_SCRATCH_INDEX_BASE_IDX = 0 +regCP_CPC_SCRATCH_DATA = 0x0e31 +regCP_CPC_SCRATCH_DATA_BASE_IDX = 0 +regCP_CPF_GRBM_FREE_COUNT = 0x0e32 +regCP_CPF_GRBM_FREE_COUNT_BASE_IDX = 0 +regCP_CPF_BUSY_STAT2 = 0x0e33 +regCP_CPF_BUSY_STAT2_BASE_IDX = 0 +regCP_CPC_HALT_HYST_COUNT = 0x0e47 +regCP_CPC_HALT_HYST_COUNT_BASE_IDX = 0 +regCP_STALLED_STAT3 = 0x0f3c +regCP_STALLED_STAT3_BASE_IDX = 0 +regCP_STALLED_STAT1 = 0x0f3d +regCP_STALLED_STAT1_BASE_IDX = 0 +regCP_STALLED_STAT2 = 0x0f3e +regCP_STALLED_STAT2_BASE_IDX = 0 +regCP_BUSY_STAT = 0x0f3f +regCP_BUSY_STAT_BASE_IDX = 0 +regCP_STAT = 0x0f40 +regCP_STAT_BASE_IDX = 0 +regCP_ME_HEADER_DUMP = 0x0f41 +regCP_ME_HEADER_DUMP_BASE_IDX = 0 +regCP_PFP_HEADER_DUMP = 0x0f42 +regCP_PFP_HEADER_DUMP_BASE_IDX = 0 +regCP_GRBM_FREE_COUNT = 0x0f43 +regCP_GRBM_FREE_COUNT_BASE_IDX = 0 +regCP_PFP_INSTR_PNTR = 0x0f45 +regCP_PFP_INSTR_PNTR_BASE_IDX = 0 +regCP_ME_INSTR_PNTR = 0x0f46 +regCP_ME_INSTR_PNTR_BASE_IDX = 0 +regCP_MEC1_INSTR_PNTR = 0x0f48 +regCP_MEC1_INSTR_PNTR_BASE_IDX = 0 +regCP_MEC2_INSTR_PNTR = 0x0f49 +regCP_MEC2_INSTR_PNTR_BASE_IDX = 0 +regCP_CSF_STAT = 0x0f54 +regCP_CSF_STAT_BASE_IDX = 0 +regCP_CNTX_STAT = 0x0f58 +regCP_CNTX_STAT_BASE_IDX = 0 +regCP_ME_PREEMPTION = 0x0f59 +regCP_ME_PREEMPTION_BASE_IDX = 0 +regCP_RB1_RPTR = 0x0f5f +regCP_RB1_RPTR_BASE_IDX = 0 +regCP_RB0_RPTR = 0x0f60 +regCP_RB0_RPTR_BASE_IDX = 0 +regCP_RB_RPTR = 0x0f60 +regCP_RB_RPTR_BASE_IDX = 0 +regCP_RB_WPTR_DELAY = 0x0f61 +regCP_RB_WPTR_DELAY_BASE_IDX = 0 +regCP_RB_WPTR_POLL_CNTL = 0x0f62 +regCP_RB_WPTR_POLL_CNTL_BASE_IDX = 0 +regCP_ROQ1_THRESHOLDS = 0x0f75 +regCP_ROQ1_THRESHOLDS_BASE_IDX = 0 +regCP_ROQ2_THRESHOLDS = 0x0f76 +regCP_ROQ2_THRESHOLDS_BASE_IDX = 0 +regCP_STQ_THRESHOLDS = 0x0f77 +regCP_STQ_THRESHOLDS_BASE_IDX = 0 +regCP_MEQ_THRESHOLDS = 0x0f79 +regCP_MEQ_THRESHOLDS_BASE_IDX = 0 +regCP_ROQ_AVAIL = 0x0f7a +regCP_ROQ_AVAIL_BASE_IDX = 0 +regCP_STQ_AVAIL = 0x0f7b +regCP_STQ_AVAIL_BASE_IDX = 0 +regCP_ROQ2_AVAIL = 0x0f7c +regCP_ROQ2_AVAIL_BASE_IDX = 0 +regCP_MEQ_AVAIL = 0x0f7d +regCP_MEQ_AVAIL_BASE_IDX = 0 +regCP_CMD_INDEX = 0x0f7e +regCP_CMD_INDEX_BASE_IDX = 0 +regCP_CMD_DATA = 0x0f7f +regCP_CMD_DATA_BASE_IDX = 0 +regCP_ROQ_RB_STAT = 0x0f80 +regCP_ROQ_RB_STAT_BASE_IDX = 0 +regCP_ROQ_IB1_STAT = 0x0f81 +regCP_ROQ_IB1_STAT_BASE_IDX = 0 +regCP_ROQ_IB2_STAT = 0x0f82 +regCP_ROQ_IB2_STAT_BASE_IDX = 0 +regCP_STQ_STAT = 0x0f83 +regCP_STQ_STAT_BASE_IDX = 0 +regCP_STQ_WR_STAT = 0x0f84 +regCP_STQ_WR_STAT_BASE_IDX = 0 +regCP_MEQ_STAT = 0x0f85 +regCP_MEQ_STAT_BASE_IDX = 0 +regCP_ROQ3_THRESHOLDS = 0x0f8c +regCP_ROQ3_THRESHOLDS_BASE_IDX = 0 +regCP_ROQ_DB_STAT = 0x0f8d +regCP_ROQ_DB_STAT_BASE_IDX = 0 +regCP_DEBUG_CNTL = 0x0f98 +regCP_DEBUG_CNTL_BASE_IDX = 0 +regCP_DEBUG_DATA = 0x0f99 +regCP_DEBUG_DATA_BASE_IDX = 0 +regCP_PRIV_VIOLATION_ADDR = 0x0f9a +regCP_PRIV_VIOLATION_ADDR_BASE_IDX = 0 +regVGT_DMA_DATA_FIFO_DEPTH = 0x0fcd +regVGT_DMA_DATA_FIFO_DEPTH_BASE_IDX = 0 +regVGT_DMA_REQ_FIFO_DEPTH = 0x0fce +regVGT_DMA_REQ_FIFO_DEPTH_BASE_IDX = 0 +regVGT_DRAW_INIT_FIFO_DEPTH = 0x0fcf +regVGT_DRAW_INIT_FIFO_DEPTH_BASE_IDX = 0 +regVGT_MC_LAT_CNTL = 0x0fd6 +regVGT_MC_LAT_CNTL_BASE_IDX = 0 +regIA_UTCL1_STATUS_2 = 0x0fd7 +regIA_UTCL1_STATUS_2_BASE_IDX = 0 +regWD_CNTL_STATUS = 0x0fdf +regWD_CNTL_STATUS_BASE_IDX = 0 +regCC_GC_PRIM_CONFIG = 0x0fe0 +regCC_GC_PRIM_CONFIG_BASE_IDX = 0 +regWD_QOS = 0x0fe2 +regWD_QOS_BASE_IDX = 0 +regWD_UTCL1_CNTL = 0x0fe3 +regWD_UTCL1_CNTL_BASE_IDX = 0 +regWD_UTCL1_STATUS = 0x0fe4 +regWD_UTCL1_STATUS_BASE_IDX = 0 +regIA_UTCL1_CNTL = 0x0fe6 +regIA_UTCL1_CNTL_BASE_IDX = 0 +regIA_UTCL1_STATUS = 0x0fe7 +regIA_UTCL1_STATUS_BASE_IDX = 0 +regCC_GC_SA_UNIT_DISABLE = 0x0fe9 +regCC_GC_SA_UNIT_DISABLE_BASE_IDX = 0 +regGE_RATE_CNTL_1 = 0x0ff4 +regGE_RATE_CNTL_1_BASE_IDX = 0 +regGE_RATE_CNTL_2 = 0x0ff5 +regGE_RATE_CNTL_2_BASE_IDX = 0 +regVGT_SYS_CONFIG = 0x1003 +regVGT_SYS_CONFIG_BASE_IDX = 0 +regGE_PRIV_CONTROL = 0x1004 +regGE_PRIV_CONTROL_BASE_IDX = 0 +regGE_STATUS = 0x1005 +regGE_STATUS_BASE_IDX = 0 +regVGT_GS_MAX_WAVE_ID = 0x1009 +regVGT_GS_MAX_WAVE_ID_BASE_IDX = 0 +regGFX_PIPE_CONTROL = 0x100d +regGFX_PIPE_CONTROL_BASE_IDX = 0 +regCC_GC_SHADER_ARRAY_CONFIG = 0x100f +regCC_GC_SHADER_ARRAY_CONFIG_BASE_IDX = 0 +regGE2_SE_CNTL_STATUS = 0x1011 +regGE2_SE_CNTL_STATUS_BASE_IDX = 0 +regGE_SPI_IF_SAFE_REG = 0x1018 +regGE_SPI_IF_SAFE_REG_BASE_IDX = 0 +regGE_PA_IF_SAFE_REG = 0x1019 +regGE_PA_IF_SAFE_REG_BASE_IDX = 0 +regPA_CL_CNTL_STATUS = 0x1024 +regPA_CL_CNTL_STATUS_BASE_IDX = 0 +regPA_CL_ENHANCE = 0x1025 +regPA_CL_ENHANCE_BASE_IDX = 0 +regPA_SU_CNTL_STATUS = 0x1034 +regPA_SU_CNTL_STATUS_BASE_IDX = 0 +regPA_SC_FIFO_DEPTH_CNTL = 0x1035 +regPA_SC_FIFO_DEPTH_CNTL_BASE_IDX = 0 +regSQ_CONFIG = 0x10a0 +regSQ_CONFIG_BASE_IDX = 0 +regSQC_CONFIG = 0x10a1 +regSQC_CONFIG_BASE_IDX = 0 +regLDS_CONFIG = 0x10a2 +regLDS_CONFIG_BASE_IDX = 0 +regSQ_RANDOM_WAVE_PRI = 0x10a3 +regSQ_RANDOM_WAVE_PRI_BASE_IDX = 0 +regSQG_STATUS = 0x10a4 +regSQG_STATUS_BASE_IDX = 0 +regSQ_FIFO_SIZES = 0x10a5 +regSQ_FIFO_SIZES_BASE_IDX = 0 +regSQ_DSM_CNTL = 0x10a6 +regSQ_DSM_CNTL_BASE_IDX = 0 +regSQ_DSM_CNTL2 = 0x10a7 +regSQ_DSM_CNTL2_BASE_IDX = 0 +regSP_CONFIG = 0x10ab +regSP_CONFIG_BASE_IDX = 0 +regSQ_ARB_CONFIG = 0x10ac +regSQ_ARB_CONFIG_BASE_IDX = 0 +regSQ_DEBUG_HOST_TRAP_STATUS = 0x10b6 +regSQ_DEBUG_HOST_TRAP_STATUS_BASE_IDX = 0 +regSQG_GL1H_STATUS = 0x10b9 +regSQG_GL1H_STATUS_BASE_IDX = 0 +regSQG_CONFIG = 0x10ba +regSQG_CONFIG_BASE_IDX = 0 +regSQ_PERF_SNAPSHOT_CTRL = 0x10bb +regSQ_PERF_SNAPSHOT_CTRL_BASE_IDX = 0 +regCC_GC_SHADER_RATE_CONFIG = 0x10bc +regCC_GC_SHADER_RATE_CONFIG_BASE_IDX = 0 +regSQ_INTERRUPT_AUTO_MASK = 0x10be +regSQ_INTERRUPT_AUTO_MASK_BASE_IDX = 0 +regSQ_INTERRUPT_MSG_CTRL = 0x10bf +regSQ_INTERRUPT_MSG_CTRL_BASE_IDX = 0 +regSQ_WATCH0_ADDR_H = 0x10d0 +regSQ_WATCH0_ADDR_H_BASE_IDX = 0 +regSQ_WATCH0_ADDR_L = 0x10d1 +regSQ_WATCH0_ADDR_L_BASE_IDX = 0 +regSQ_WATCH0_CNTL = 0x10d2 +regSQ_WATCH0_CNTL_BASE_IDX = 0 +regSQ_WATCH1_ADDR_H = 0x10d3 +regSQ_WATCH1_ADDR_H_BASE_IDX = 0 +regSQ_WATCH1_ADDR_L = 0x10d4 +regSQ_WATCH1_ADDR_L_BASE_IDX = 0 +regSQ_WATCH1_CNTL = 0x10d5 +regSQ_WATCH1_CNTL_BASE_IDX = 0 +regSQ_WATCH2_ADDR_H = 0x10d6 +regSQ_WATCH2_ADDR_H_BASE_IDX = 0 +regSQ_WATCH2_ADDR_L = 0x10d7 +regSQ_WATCH2_ADDR_L_BASE_IDX = 0 +regSQ_WATCH2_CNTL = 0x10d8 +regSQ_WATCH2_CNTL_BASE_IDX = 0 +regSQ_WATCH3_ADDR_H = 0x10d9 +regSQ_WATCH3_ADDR_H_BASE_IDX = 0 +regSQ_WATCH3_ADDR_L = 0x10da +regSQ_WATCH3_ADDR_L_BASE_IDX = 0 +regSQ_WATCH3_CNTL = 0x10db +regSQ_WATCH3_CNTL_BASE_IDX = 0 +regSQ_IND_INDEX = 0x1118 +regSQ_IND_INDEX_BASE_IDX = 0 +regSQ_IND_DATA = 0x1119 +regSQ_IND_DATA_BASE_IDX = 0 +regSQ_CMD = 0x111b +regSQ_CMD_BASE_IDX = 0 +regSX_DEBUG_1 = 0x11b8 +regSX_DEBUG_1_BASE_IDX = 0 +regSPI_PS_MAX_WAVE_ID = 0x11da +regSPI_PS_MAX_WAVE_ID_BASE_IDX = 0 +regSPI_GFX_CNTL = 0x11dc +regSPI_GFX_CNTL_BASE_IDX = 0 +regSPI_DSM_CNTL = 0x11e3 +regSPI_DSM_CNTL_BASE_IDX = 0 +regSPI_DSM_CNTL2 = 0x11e4 +regSPI_DSM_CNTL2_BASE_IDX = 0 +regSPI_EDC_CNT = 0x11e5 +regSPI_EDC_CNT_BASE_IDX = 0 +regSPI_CONFIG_PS_CU_EN = 0x11f2 +regSPI_CONFIG_PS_CU_EN_BASE_IDX = 0 +regSPI_WF_LIFETIME_CNTL = 0x124a +regSPI_WF_LIFETIME_CNTL_BASE_IDX = 0 +regSPI_WF_LIFETIME_LIMIT_0 = 0x124b +regSPI_WF_LIFETIME_LIMIT_0_BASE_IDX = 0 +regSPI_WF_LIFETIME_LIMIT_1 = 0x124c +regSPI_WF_LIFETIME_LIMIT_1_BASE_IDX = 0 +regSPI_WF_LIFETIME_LIMIT_2 = 0x124d +regSPI_WF_LIFETIME_LIMIT_2_BASE_IDX = 0 +regSPI_WF_LIFETIME_LIMIT_3 = 0x124e +regSPI_WF_LIFETIME_LIMIT_3_BASE_IDX = 0 +regSPI_WF_LIFETIME_LIMIT_4 = 0x124f +regSPI_WF_LIFETIME_LIMIT_4_BASE_IDX = 0 +regSPI_WF_LIFETIME_LIMIT_5 = 0x1250 +regSPI_WF_LIFETIME_LIMIT_5_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_0 = 0x1255 +regSPI_WF_LIFETIME_STATUS_0_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_2 = 0x1257 +regSPI_WF_LIFETIME_STATUS_2_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_4 = 0x1259 +regSPI_WF_LIFETIME_STATUS_4_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_6 = 0x125b +regSPI_WF_LIFETIME_STATUS_6_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_7 = 0x125c +regSPI_WF_LIFETIME_STATUS_7_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_9 = 0x125e +regSPI_WF_LIFETIME_STATUS_9_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_11 = 0x1260 +regSPI_WF_LIFETIME_STATUS_11_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_13 = 0x1262 +regSPI_WF_LIFETIME_STATUS_13_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_14 = 0x1263 +regSPI_WF_LIFETIME_STATUS_14_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_15 = 0x1264 +regSPI_WF_LIFETIME_STATUS_15_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_16 = 0x1265 +regSPI_WF_LIFETIME_STATUS_16_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_17 = 0x1266 +regSPI_WF_LIFETIME_STATUS_17_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_18 = 0x1267 +regSPI_WF_LIFETIME_STATUS_18_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_19 = 0x1268 +regSPI_WF_LIFETIME_STATUS_19_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_20 = 0x1269 +regSPI_WF_LIFETIME_STATUS_20_BASE_IDX = 0 +regSPI_WF_LIFETIME_STATUS_21 = 0x126b +regSPI_WF_LIFETIME_STATUS_21_BASE_IDX = 0 +regSPI_LB_CTR_CTRL = 0x1274 +regSPI_LB_CTR_CTRL_BASE_IDX = 0 +regSPI_LB_WGP_MASK = 0x1275 +regSPI_LB_WGP_MASK_BASE_IDX = 0 +regSPI_LB_DATA_REG = 0x1276 +regSPI_LB_DATA_REG_BASE_IDX = 0 +regSPI_PG_ENABLE_STATIC_WGP_MASK = 0x1277 +regSPI_PG_ENABLE_STATIC_WGP_MASK_BASE_IDX = 0 +regSPI_GDS_CREDITS = 0x1278 +regSPI_GDS_CREDITS_BASE_IDX = 0 +regSPI_SX_EXPORT_BUFFER_SIZES = 0x1279 +regSPI_SX_EXPORT_BUFFER_SIZES_BASE_IDX = 0 +regSPI_SX_SCOREBOARD_BUFFER_SIZES = 0x127a +regSPI_SX_SCOREBOARD_BUFFER_SIZES_BASE_IDX = 0 +regSPI_CSQ_WF_ACTIVE_STATUS = 0x127b +regSPI_CSQ_WF_ACTIVE_STATUS_BASE_IDX = 0 +regSPI_CSQ_WF_ACTIVE_COUNT_0 = 0x127c +regSPI_CSQ_WF_ACTIVE_COUNT_0_BASE_IDX = 0 +regSPI_CSQ_WF_ACTIVE_COUNT_1 = 0x127d +regSPI_CSQ_WF_ACTIVE_COUNT_1_BASE_IDX = 0 +regSPI_CSQ_WF_ACTIVE_COUNT_2 = 0x127e +regSPI_CSQ_WF_ACTIVE_COUNT_2_BASE_IDX = 0 +regSPI_CSQ_WF_ACTIVE_COUNT_3 = 0x127f +regSPI_CSQ_WF_ACTIVE_COUNT_3_BASE_IDX = 0 +regSPI_LB_DATA_WAVES = 0x1284 +regSPI_LB_DATA_WAVES_BASE_IDX = 0 +regSPI_P0_TRAP_SCREEN_PSBA_LO = 0x128c +regSPI_P0_TRAP_SCREEN_PSBA_LO_BASE_IDX = 0 +regSPI_P0_TRAP_SCREEN_PSBA_HI = 0x128d +regSPI_P0_TRAP_SCREEN_PSBA_HI_BASE_IDX = 0 +regSPI_P0_TRAP_SCREEN_PSMA_LO = 0x128e +regSPI_P0_TRAP_SCREEN_PSMA_LO_BASE_IDX = 0 +regSPI_P0_TRAP_SCREEN_PSMA_HI = 0x128f +regSPI_P0_TRAP_SCREEN_PSMA_HI_BASE_IDX = 0 +regSPI_P0_TRAP_SCREEN_GPR_MIN = 0x1290 +regSPI_P0_TRAP_SCREEN_GPR_MIN_BASE_IDX = 0 +regSPI_P1_TRAP_SCREEN_PSBA_LO = 0x1291 +regSPI_P1_TRAP_SCREEN_PSBA_LO_BASE_IDX = 0 +regSPI_P1_TRAP_SCREEN_PSBA_HI = 0x1292 +regSPI_P1_TRAP_SCREEN_PSBA_HI_BASE_IDX = 0 +regSPI_P1_TRAP_SCREEN_PSMA_LO = 0x1293 +regSPI_P1_TRAP_SCREEN_PSMA_LO_BASE_IDX = 0 +regSPI_P1_TRAP_SCREEN_PSMA_HI = 0x1294 +regSPI_P1_TRAP_SCREEN_PSMA_HI_BASE_IDX = 0 +regSPI_P1_TRAP_SCREEN_GPR_MIN = 0x1295 +regSPI_P1_TRAP_SCREEN_GPR_MIN_BASE_IDX = 0 +regTD_STATUS = 0x12c6 +regTD_STATUS_BASE_IDX = 0 +regTD_DSM_CNTL = 0x12cf +regTD_DSM_CNTL_BASE_IDX = 0 +regTD_DSM_CNTL2 = 0x12d0 +regTD_DSM_CNTL2_BASE_IDX = 0 +regTD_SCRATCH = 0x12d3 +regTD_SCRATCH_BASE_IDX = 0 +regTA_CNTL = 0x12e1 +regTA_CNTL_BASE_IDX = 0 +regTA_CNTL_AUX = 0x12e2 +regTA_CNTL_AUX_BASE_IDX = 0 +regTA_CNTL2 = 0x12e5 +regTA_CNTL2_BASE_IDX = 0 +regTA_STATUS = 0x12e8 +regTA_STATUS_BASE_IDX = 0 +regTA_SCRATCH = 0x1304 +regTA_SCRATCH_BASE_IDX = 0 +regGDS_CONFIG = 0x1360 +regGDS_CONFIG_BASE_IDX = 0 +regGDS_CNTL_STATUS = 0x1361 +regGDS_CNTL_STATUS_BASE_IDX = 0 +regGDS_ENHANCE = 0x1362 +regGDS_ENHANCE_BASE_IDX = 0 +regGDS_PROTECTION_FAULT = 0x1363 +regGDS_PROTECTION_FAULT_BASE_IDX = 0 +regGDS_VM_PROTECTION_FAULT = 0x1364 +regGDS_VM_PROTECTION_FAULT_BASE_IDX = 0 +regGDS_EDC_CNT = 0x1365 +regGDS_EDC_CNT_BASE_IDX = 0 +regGDS_EDC_GRBM_CNT = 0x1366 +regGDS_EDC_GRBM_CNT_BASE_IDX = 0 +regGDS_EDC_OA_DED = 0x1367 +regGDS_EDC_OA_DED_BASE_IDX = 0 +regGDS_DSM_CNTL = 0x136a +regGDS_DSM_CNTL_BASE_IDX = 0 +regGDS_EDC_OA_PHY_CNT = 0x136b +regGDS_EDC_OA_PHY_CNT_BASE_IDX = 0 +regGDS_EDC_OA_PIPE_CNT = 0x136c +regGDS_EDC_OA_PIPE_CNT_BASE_IDX = 0 +regGDS_DSM_CNTL2 = 0x136d +regGDS_DSM_CNTL2_BASE_IDX = 0 +regDB_DEBUG = 0x13ac +regDB_DEBUG_BASE_IDX = 0 +regDB_DEBUG2 = 0x13ad +regDB_DEBUG2_BASE_IDX = 0 +regDB_DEBUG3 = 0x13ae +regDB_DEBUG3_BASE_IDX = 0 +regDB_DEBUG4 = 0x13af +regDB_DEBUG4_BASE_IDX = 0 +regDB_ETILE_STUTTER_CONTROL = 0x13b0 +regDB_ETILE_STUTTER_CONTROL_BASE_IDX = 0 +regDB_LTILE_STUTTER_CONTROL = 0x13b1 +regDB_LTILE_STUTTER_CONTROL_BASE_IDX = 0 +regDB_EQUAD_STUTTER_CONTROL = 0x13b2 +regDB_EQUAD_STUTTER_CONTROL_BASE_IDX = 0 +regDB_LQUAD_STUTTER_CONTROL = 0x13b3 +regDB_LQUAD_STUTTER_CONTROL_BASE_IDX = 0 +regDB_CREDIT_LIMIT = 0x13b4 +regDB_CREDIT_LIMIT_BASE_IDX = 0 +regDB_WATERMARKS = 0x13b5 +regDB_WATERMARKS_BASE_IDX = 0 +regDB_SUBTILE_CONTROL = 0x13b6 +regDB_SUBTILE_CONTROL_BASE_IDX = 0 +regDB_FREE_CACHELINES = 0x13b7 +regDB_FREE_CACHELINES_BASE_IDX = 0 +regDB_FIFO_DEPTH1 = 0x13b8 +regDB_FIFO_DEPTH1_BASE_IDX = 0 +regDB_FIFO_DEPTH2 = 0x13b9 +regDB_FIFO_DEPTH2_BASE_IDX = 0 +regDB_LAST_OF_BURST_CONFIG = 0x13ba +regDB_LAST_OF_BURST_CONFIG_BASE_IDX = 0 +regDB_RING_CONTROL = 0x13bb +regDB_RING_CONTROL_BASE_IDX = 0 +regDB_MEM_ARB_WATERMARKS = 0x13bc +regDB_MEM_ARB_WATERMARKS_BASE_IDX = 0 +regDB_FIFO_DEPTH3 = 0x13bd +regDB_FIFO_DEPTH3_BASE_IDX = 0 +regDB_DEBUG6 = 0x13be +regDB_DEBUG6_BASE_IDX = 0 +regDB_EXCEPTION_CONTROL = 0x13bf +regDB_EXCEPTION_CONTROL_BASE_IDX = 0 +regDB_DEBUG7 = 0x13d0 +regDB_DEBUG7_BASE_IDX = 0 +regDB_DEBUG5 = 0x13d1 +regDB_DEBUG5_BASE_IDX = 0 +regDB_FGCG_SRAMS_CLK_CTRL = 0x13d7 +regDB_FGCG_SRAMS_CLK_CTRL_BASE_IDX = 0 +regDB_FGCG_INTERFACES_CLK_CTRL = 0x13d8 +regDB_FGCG_INTERFACES_CLK_CTRL_BASE_IDX = 0 +regDB_FIFO_DEPTH4 = 0x13d9 +regDB_FIFO_DEPTH4_BASE_IDX = 0 +regCC_RB_REDUNDANCY = 0x13dc +regCC_RB_REDUNDANCY_BASE_IDX = 0 +regCC_RB_BACKEND_DISABLE = 0x13dd +regCC_RB_BACKEND_DISABLE_BASE_IDX = 0 +regGB_ADDR_CONFIG = 0x13de +regGB_ADDR_CONFIG_BASE_IDX = 0 +regGB_BACKEND_MAP = 0x13df +regGB_BACKEND_MAP_BASE_IDX = 0 +regGB_GPU_ID = 0x13e0 +regGB_GPU_ID_BASE_IDX = 0 +regCC_RB_DAISY_CHAIN = 0x13e1 +regCC_RB_DAISY_CHAIN_BASE_IDX = 0 +regGB_ADDR_CONFIG_READ = 0x13e2 +regGB_ADDR_CONFIG_READ_BASE_IDX = 0 +regCB_HW_CONTROL_4 = 0x1422 +regCB_HW_CONTROL_4_BASE_IDX = 0 +regCB_HW_CONTROL_3 = 0x1423 +regCB_HW_CONTROL_3_BASE_IDX = 0 +regCB_HW_CONTROL = 0x1424 +regCB_HW_CONTROL_BASE_IDX = 0 +regCB_HW_CONTROL_1 = 0x1425 +regCB_HW_CONTROL_1_BASE_IDX = 0 +regCB_HW_CONTROL_2 = 0x1426 +regCB_HW_CONTROL_2_BASE_IDX = 0 +regCB_DCC_CONFIG = 0x1427 +regCB_DCC_CONFIG_BASE_IDX = 0 +regCB_HW_MEM_ARBITER_RD = 0x1428 +regCB_HW_MEM_ARBITER_RD_BASE_IDX = 0 +regCB_HW_MEM_ARBITER_WR = 0x1429 +regCB_HW_MEM_ARBITER_WR_BASE_IDX = 0 +regCB_FGCG_SRAM_OVERRIDE = 0x142a +regCB_FGCG_SRAM_OVERRIDE_BASE_IDX = 0 +regCB_DCC_CONFIG2 = 0x142b +regCB_DCC_CONFIG2_BASE_IDX = 0 +regCHICKEN_BITS = 0x142d +regCHICKEN_BITS_BASE_IDX = 0 +regCB_CACHE_EVICT_POINTS = 0x142e +regCB_CACHE_EVICT_POINTS_BASE_IDX = 0 +regGCEA_DRAM_RD_CLI2GRP_MAP0 = 0x17a0 +regGCEA_DRAM_RD_CLI2GRP_MAP0_BASE_IDX = 0 +regGCEA_DRAM_RD_CLI2GRP_MAP1 = 0x17a1 +regGCEA_DRAM_RD_CLI2GRP_MAP1_BASE_IDX = 0 +regGCEA_DRAM_WR_CLI2GRP_MAP0 = 0x17a2 +regGCEA_DRAM_WR_CLI2GRP_MAP0_BASE_IDX = 0 +regGCEA_DRAM_WR_CLI2GRP_MAP1 = 0x17a3 +regGCEA_DRAM_WR_CLI2GRP_MAP1_BASE_IDX = 0 +regGCEA_DRAM_RD_GRP2VC_MAP = 0x17a4 +regGCEA_DRAM_RD_GRP2VC_MAP_BASE_IDX = 0 +regGCEA_DRAM_WR_GRP2VC_MAP = 0x17a5 +regGCEA_DRAM_WR_GRP2VC_MAP_BASE_IDX = 0 +regGCEA_DRAM_RD_LAZY = 0x17a6 +regGCEA_DRAM_RD_LAZY_BASE_IDX = 0 +regGCEA_DRAM_WR_LAZY = 0x17a7 +regGCEA_DRAM_WR_LAZY_BASE_IDX = 0 +regGCEA_DRAM_RD_CAM_CNTL = 0x17a8 +regGCEA_DRAM_RD_CAM_CNTL_BASE_IDX = 0 +regGCEA_DRAM_WR_CAM_CNTL = 0x17a9 +regGCEA_DRAM_WR_CAM_CNTL_BASE_IDX = 0 +regGCEA_DRAM_PAGE_BURST = 0x17aa +regGCEA_DRAM_PAGE_BURST_BASE_IDX = 0 +regGCEA_DRAM_RD_PRI_AGE = 0x17ab +regGCEA_DRAM_RD_PRI_AGE_BASE_IDX = 0 +regGCEA_DRAM_WR_PRI_AGE = 0x17ac +regGCEA_DRAM_WR_PRI_AGE_BASE_IDX = 0 +regGCEA_DRAM_RD_PRI_QUEUING = 0x17ad +regGCEA_DRAM_RD_PRI_QUEUING_BASE_IDX = 0 +regGCEA_DRAM_WR_PRI_QUEUING = 0x17ae +regGCEA_DRAM_WR_PRI_QUEUING_BASE_IDX = 0 +regGCEA_DRAM_RD_PRI_FIXED = 0x17af +regGCEA_DRAM_RD_PRI_FIXED_BASE_IDX = 0 +regGCEA_DRAM_WR_PRI_FIXED = 0x17b0 +regGCEA_DRAM_WR_PRI_FIXED_BASE_IDX = 0 +regGCEA_DRAM_RD_PRI_URGENCY = 0x17b1 +regGCEA_DRAM_RD_PRI_URGENCY_BASE_IDX = 0 +regGCEA_DRAM_WR_PRI_URGENCY = 0x17b2 +regGCEA_DRAM_WR_PRI_URGENCY_BASE_IDX = 0 +regGCEA_DRAM_RD_PRI_QUANT_PRI1 = 0x17b3 +regGCEA_DRAM_RD_PRI_QUANT_PRI1_BASE_IDX = 0 +regGCEA_DRAM_RD_PRI_QUANT_PRI2 = 0x17b4 +regGCEA_DRAM_RD_PRI_QUANT_PRI2_BASE_IDX = 0 +regGCEA_DRAM_RD_PRI_QUANT_PRI3 = 0x17b5 +regGCEA_DRAM_RD_PRI_QUANT_PRI3_BASE_IDX = 0 +regGCEA_DRAM_WR_PRI_QUANT_PRI1 = 0x17b6 +regGCEA_DRAM_WR_PRI_QUANT_PRI1_BASE_IDX = 0 +regGCEA_DRAM_WR_PRI_QUANT_PRI2 = 0x17b7 +regGCEA_DRAM_WR_PRI_QUANT_PRI2_BASE_IDX = 0 +regGCEA_DRAM_WR_PRI_QUANT_PRI3 = 0x17b8 +regGCEA_DRAM_WR_PRI_QUANT_PRI3_BASE_IDX = 0 +regGCEA_IO_RD_CLI2GRP_MAP0 = 0x187d +regGCEA_IO_RD_CLI2GRP_MAP0_BASE_IDX = 0 +regGCEA_IO_RD_CLI2GRP_MAP1 = 0x187e +regGCEA_IO_RD_CLI2GRP_MAP1_BASE_IDX = 0 +regGCEA_IO_WR_CLI2GRP_MAP0 = 0x187f +regGCEA_IO_WR_CLI2GRP_MAP0_BASE_IDX = 0 +regGCEA_IO_WR_CLI2GRP_MAP1 = 0x1880 +regGCEA_IO_WR_CLI2GRP_MAP1_BASE_IDX = 0 +regGCEA_IO_RD_COMBINE_FLUSH = 0x1881 +regGCEA_IO_RD_COMBINE_FLUSH_BASE_IDX = 0 +regGCEA_IO_WR_COMBINE_FLUSH = 0x1882 +regGCEA_IO_WR_COMBINE_FLUSH_BASE_IDX = 0 +regGCEA_IO_GROUP_BURST = 0x1883 +regGCEA_IO_GROUP_BURST_BASE_IDX = 0 +regGCEA_IO_RD_PRI_AGE = 0x1884 +regGCEA_IO_RD_PRI_AGE_BASE_IDX = 0 +regGCEA_IO_WR_PRI_AGE = 0x1885 +regGCEA_IO_WR_PRI_AGE_BASE_IDX = 0 +regGCEA_IO_RD_PRI_QUEUING = 0x1886 +regGCEA_IO_RD_PRI_QUEUING_BASE_IDX = 0 +regGCEA_IO_WR_PRI_QUEUING = 0x1887 +regGCEA_IO_WR_PRI_QUEUING_BASE_IDX = 0 +regGCEA_IO_RD_PRI_FIXED = 0x1888 +regGCEA_IO_RD_PRI_FIXED_BASE_IDX = 0 +regGCEA_IO_WR_PRI_FIXED = 0x1889 +regGCEA_IO_WR_PRI_FIXED_BASE_IDX = 0 +regGCEA_IO_RD_PRI_URGENCY = 0x188a +regGCEA_IO_RD_PRI_URGENCY_BASE_IDX = 0 +regGCEA_IO_WR_PRI_URGENCY = 0x188b +regGCEA_IO_WR_PRI_URGENCY_BASE_IDX = 0 +regGCEA_IO_RD_PRI_URGENCY_MASKING = 0x188c +regGCEA_IO_RD_PRI_URGENCY_MASKING_BASE_IDX = 0 +regGCEA_IO_WR_PRI_URGENCY_MASKING = 0x188d +regGCEA_IO_WR_PRI_URGENCY_MASKING_BASE_IDX = 0 +regGCEA_IO_RD_PRI_QUANT_PRI1 = 0x188e +regGCEA_IO_RD_PRI_QUANT_PRI1_BASE_IDX = 0 +regGCEA_IO_RD_PRI_QUANT_PRI2 = 0x188f +regGCEA_IO_RD_PRI_QUANT_PRI2_BASE_IDX = 0 +regGCEA_IO_RD_PRI_QUANT_PRI3 = 0x1890 +regGCEA_IO_RD_PRI_QUANT_PRI3_BASE_IDX = 0 +regGCEA_IO_WR_PRI_QUANT_PRI1 = 0x1891 +regGCEA_IO_WR_PRI_QUANT_PRI1_BASE_IDX = 0 +regGCEA_IO_WR_PRI_QUANT_PRI2 = 0x1892 +regGCEA_IO_WR_PRI_QUANT_PRI2_BASE_IDX = 0 +regGCEA_IO_WR_PRI_QUANT_PRI3 = 0x1893 +regGCEA_IO_WR_PRI_QUANT_PRI3_BASE_IDX = 0 +regGCEA_SDP_ARB_FINAL = 0x1896 +regGCEA_SDP_ARB_FINAL_BASE_IDX = 0 +regGCEA_SDP_IO_PRIORITY = 0x1899 +regGCEA_SDP_IO_PRIORITY_BASE_IDX = 0 +regGCEA_SDP_CREDITS = 0x189a +regGCEA_SDP_CREDITS_BASE_IDX = 0 +regGCEA_SDP_TAG_RESERVE0 = 0x189b +regGCEA_SDP_TAG_RESERVE0_BASE_IDX = 0 +regGCEA_SDP_TAG_RESERVE1 = 0x189c +regGCEA_SDP_TAG_RESERVE1_BASE_IDX = 0 +regGCEA_SDP_VCC_RESERVE0 = 0x189d +regGCEA_SDP_VCC_RESERVE0_BASE_IDX = 0 +regGCEA_SDP_VCC_RESERVE1 = 0x189e +regGCEA_SDP_VCC_RESERVE1_BASE_IDX = 0 +regGCEA_MISC = 0x14a2 +regGCEA_MISC_BASE_IDX = 0 +regGCEA_LATENCY_SAMPLING = 0x14a3 +regGCEA_LATENCY_SAMPLING_BASE_IDX = 0 +regGCEA_MAM_CTRL2 = 0x14a9 +regGCEA_MAM_CTRL2_BASE_IDX = 0 +regGCEA_MAM_CTRL = 0x14ab +regGCEA_MAM_CTRL_BASE_IDX = 0 +regGCEA_EDC_CNT = 0x14b2 +regGCEA_EDC_CNT_BASE_IDX = 0 +regGCEA_EDC_CNT2 = 0x14b3 +regGCEA_EDC_CNT2_BASE_IDX = 0 +regGCEA_DSM_CNTL = 0x14b4 +regGCEA_DSM_CNTL_BASE_IDX = 0 +regGCEA_DSM_CNTLA = 0x14b5 +regGCEA_DSM_CNTLA_BASE_IDX = 0 +regGCEA_DSM_CNTLB = 0x14b6 +regGCEA_DSM_CNTLB_BASE_IDX = 0 +regGCEA_DSM_CNTL2 = 0x14b7 +regGCEA_DSM_CNTL2_BASE_IDX = 0 +regGCEA_DSM_CNTL2A = 0x14b8 +regGCEA_DSM_CNTL2A_BASE_IDX = 0 +regGCEA_DSM_CNTL2B = 0x14b9 +regGCEA_DSM_CNTL2B_BASE_IDX = 0 +regGCEA_GL2C_XBR_CREDITS = 0x14ba +regGCEA_GL2C_XBR_CREDITS_BASE_IDX = 0 +regGCEA_GL2C_XBR_MAXBURST = 0x14bb +regGCEA_GL2C_XBR_MAXBURST_BASE_IDX = 0 +regGCEA_PROBE_CNTL = 0x14bc +regGCEA_PROBE_CNTL_BASE_IDX = 0 +regGCEA_PROBE_MAP = 0x14bd +regGCEA_PROBE_MAP_BASE_IDX = 0 +regGCEA_ERR_STATUS = 0x14be +regGCEA_ERR_STATUS_BASE_IDX = 0 +regGCEA_MISC2 = 0x14bf +regGCEA_MISC2_BASE_IDX = 0 +regGCEA_RRET_MEM_RESERVE = 0x1518 +regGCEA_RRET_MEM_RESERVE_BASE_IDX = 0 +regGCEA_EDC_CNT3 = 0x151a +regGCEA_EDC_CNT3_BASE_IDX = 0 +regGCEA_SDP_ENABLE = 0x151e +regGCEA_SDP_ENABLE_BASE_IDX = 0 +regSPI_PQEV_CTRL = 0x14c0 +regSPI_PQEV_CTRL_BASE_IDX = 0 +regSPI_EXP_THROTTLE_CTRL = 0x14c3 +regSPI_EXP_THROTTLE_CTRL_BASE_IDX = 0 +regRMI_GENERAL_CNTL = 0x1880 +regRMI_GENERAL_CNTL_BASE_IDX = 1 +regRMI_GENERAL_CNTL1 = 0x1881 +regRMI_GENERAL_CNTL1_BASE_IDX = 1 +regRMI_GENERAL_STATUS = 0x1882 +regRMI_GENERAL_STATUS_BASE_IDX = 1 +regRMI_SUBBLOCK_STATUS0 = 0x1883 +regRMI_SUBBLOCK_STATUS0_BASE_IDX = 1 +regRMI_SUBBLOCK_STATUS1 = 0x1884 +regRMI_SUBBLOCK_STATUS1_BASE_IDX = 1 +regRMI_SUBBLOCK_STATUS2 = 0x1885 +regRMI_SUBBLOCK_STATUS2_BASE_IDX = 1 +regRMI_SUBBLOCK_STATUS3 = 0x1886 +regRMI_SUBBLOCK_STATUS3_BASE_IDX = 1 +regRMI_XBAR_CONFIG = 0x1887 +regRMI_XBAR_CONFIG_BASE_IDX = 1 +regRMI_PROBE_POP_LOGIC_CNTL = 0x1888 +regRMI_PROBE_POP_LOGIC_CNTL_BASE_IDX = 1 +regRMI_UTC_XNACK_N_MISC_CNTL = 0x1889 +regRMI_UTC_XNACK_N_MISC_CNTL_BASE_IDX = 1 +regRMI_DEMUX_CNTL = 0x188a +regRMI_DEMUX_CNTL_BASE_IDX = 1 +regRMI_UTCL1_CNTL1 = 0x188b +regRMI_UTCL1_CNTL1_BASE_IDX = 1 +regRMI_UTCL1_CNTL2 = 0x188c +regRMI_UTCL1_CNTL2_BASE_IDX = 1 +regRMI_UTC_UNIT_CONFIG = 0x188d +regRMI_UTC_UNIT_CONFIG_BASE_IDX = 1 +regRMI_TCIW_FORMATTER0_CNTL = 0x188e +regRMI_TCIW_FORMATTER0_CNTL_BASE_IDX = 1 +regRMI_TCIW_FORMATTER1_CNTL = 0x188f +regRMI_TCIW_FORMATTER1_CNTL_BASE_IDX = 1 +regRMI_SCOREBOARD_CNTL = 0x1890 +regRMI_SCOREBOARD_CNTL_BASE_IDX = 1 +regRMI_SCOREBOARD_STATUS0 = 0x1891 +regRMI_SCOREBOARD_STATUS0_BASE_IDX = 1 +regRMI_SCOREBOARD_STATUS1 = 0x1892 +regRMI_SCOREBOARD_STATUS1_BASE_IDX = 1 +regRMI_SCOREBOARD_STATUS2 = 0x1893 +regRMI_SCOREBOARD_STATUS2_BASE_IDX = 1 +regRMI_XBAR_ARBITER_CONFIG = 0x1894 +regRMI_XBAR_ARBITER_CONFIG_BASE_IDX = 1 +regRMI_XBAR_ARBITER_CONFIG_1 = 0x1895 +regRMI_XBAR_ARBITER_CONFIG_1_BASE_IDX = 1 +regRMI_CLOCK_CNTRL = 0x1896 +regRMI_CLOCK_CNTRL_BASE_IDX = 1 +regRMI_UTCL1_STATUS = 0x1897 +regRMI_UTCL1_STATUS_BASE_IDX = 1 +regRMI_RB_GLX_CID_MAP = 0x1898 +regRMI_RB_GLX_CID_MAP_BASE_IDX = 1 +regRMI_SPARE = 0x189f +regRMI_SPARE_BASE_IDX = 1 +regRMI_SPARE_1 = 0x18a0 +regRMI_SPARE_1_BASE_IDX = 1 +regRMI_SPARE_2 = 0x18a1 +regRMI_SPARE_2_BASE_IDX = 1 +regCC_RMI_REDUNDANCY = 0x18a2 +regCC_RMI_REDUNDANCY_BASE_IDX = 1 +regGCR_PIO_CNTL = 0x1580 +regGCR_PIO_CNTL_BASE_IDX = 0 +regGCR_PIO_DATA = 0x1581 +regGCR_PIO_DATA_BASE_IDX = 0 +regPMM_CNTL = 0x1582 +regPMM_CNTL_BASE_IDX = 0 +regPMM_STATUS = 0x1583 +regPMM_STATUS_BASE_IDX = 0 +regUTCL1_CTRL_1 = 0x158c +regUTCL1_CTRL_1_BASE_IDX = 0 +regUTCL1_ALOG = 0x158f +regUTCL1_ALOG_BASE_IDX = 0 +regUTCL1_STATUS = 0x1594 +regUTCL1_STATUS_BASE_IDX = 0 +regGCMC_VM_NB_TOP_OF_DRAM_SLOT1 = 0x15a4 +regGCMC_VM_NB_TOP_OF_DRAM_SLOT1_BASE_IDX = 0 +regGCMC_VM_NB_LOWER_TOP_OF_DRAM2 = 0x15a5 +regGCMC_VM_NB_LOWER_TOP_OF_DRAM2_BASE_IDX = 0 +regGCMC_VM_NB_UPPER_TOP_OF_DRAM2 = 0x15a6 +regGCMC_VM_NB_UPPER_TOP_OF_DRAM2_BASE_IDX = 0 +regGCMC_VM_FB_OFFSET = 0x15a7 +regGCMC_VM_FB_OFFSET_BASE_IDX = 0 +regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB = 0x15a8 +regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB_BASE_IDX = 0 +regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB = 0x15a9 +regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB_BASE_IDX = 0 +regGCMC_VM_STEERING = 0x15aa +regGCMC_VM_STEERING_BASE_IDX = 0 +regGCMC_MEM_POWER_LS = 0x15ac +regGCMC_MEM_POWER_LS_BASE_IDX = 0 +regGCMC_VM_CACHEABLE_DRAM_ADDRESS_START = 0x15ad +regGCMC_VM_CACHEABLE_DRAM_ADDRESS_START_BASE_IDX = 0 +regGCMC_VM_CACHEABLE_DRAM_ADDRESS_END = 0x15ae +regGCMC_VM_CACHEABLE_DRAM_ADDRESS_END_BASE_IDX = 0 +regGCMC_VM_LOCAL_SYSMEM_ADDRESS_START = 0x15af +regGCMC_VM_LOCAL_SYSMEM_ADDRESS_START_BASE_IDX = 0 +regGCMC_VM_LOCAL_SYSMEM_ADDRESS_END = 0x15b0 +regGCMC_VM_LOCAL_SYSMEM_ADDRESS_END_BASE_IDX = 0 +regGCMC_VM_APT_CNTL = 0x15b1 +regGCMC_VM_APT_CNTL_BASE_IDX = 0 +regGCMC_VM_LOCAL_FB_ADDRESS_START = 0x15b2 +regGCMC_VM_LOCAL_FB_ADDRESS_START_BASE_IDX = 0 +regGCMC_VM_LOCAL_FB_ADDRESS_END = 0x15b3 +regGCMC_VM_LOCAL_FB_ADDRESS_END_BASE_IDX = 0 +regGCMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL = 0x15b4 +regGCMC_VM_LOCAL_FB_ADDRESS_LOCK_CNTL_BASE_IDX = 0 +regGCUTCL2_ICG_CTRL = 0x15b5 +regGCUTCL2_ICG_CTRL_BASE_IDX = 0 +regGCUTCL2_CGTT_BUSY_CTRL = 0x15b7 +regGCUTCL2_CGTT_BUSY_CTRL_BASE_IDX = 0 +regGCMC_VM_FB_NOALLOC_CNTL = 0x15b8 +regGCMC_VM_FB_NOALLOC_CNTL_BASE_IDX = 0 +regGCUTCL2_HARVEST_BYPASS_GROUPS = 0x15b9 +regGCUTCL2_HARVEST_BYPASS_GROUPS_BASE_IDX = 0 +regGCUTCL2_GROUP_RET_FAULT_STATUS = 0x15bb +regGCUTCL2_GROUP_RET_FAULT_STATUS_BASE_IDX = 0 +regGCVM_L2_CNTL = 0x15bc +regGCVM_L2_CNTL_BASE_IDX = 0 +regGCVM_L2_CNTL2 = 0x15bd +regGCVM_L2_CNTL2_BASE_IDX = 0 +regGCVM_L2_CNTL3 = 0x15be +regGCVM_L2_CNTL3_BASE_IDX = 0 +regGCVM_L2_STATUS = 0x15bf +regGCVM_L2_STATUS_BASE_IDX = 0 +regGCVM_DUMMY_PAGE_FAULT_CNTL = 0x15c0 +regGCVM_DUMMY_PAGE_FAULT_CNTL_BASE_IDX = 0 +regGCVM_DUMMY_PAGE_FAULT_ADDR_LO32 = 0x15c1 +regGCVM_DUMMY_PAGE_FAULT_ADDR_LO32_BASE_IDX = 0 +regGCVM_DUMMY_PAGE_FAULT_ADDR_HI32 = 0x15c2 +regGCVM_DUMMY_PAGE_FAULT_ADDR_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_CNTL = 0x15c3 +regGCVM_INVALIDATE_CNTL_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_CNTL = 0x15c4 +regGCVM_L2_PROTECTION_FAULT_CNTL_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_CNTL2 = 0x15c5 +regGCVM_L2_PROTECTION_FAULT_CNTL2_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_MM_CNTL3 = 0x15c6 +regGCVM_L2_PROTECTION_FAULT_MM_CNTL3_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_MM_CNTL4 = 0x15c7 +regGCVM_L2_PROTECTION_FAULT_MM_CNTL4_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_STATUS = 0x15c8 +regGCVM_L2_PROTECTION_FAULT_STATUS_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_ADDR_LO32 = 0x15c9 +regGCVM_L2_PROTECTION_FAULT_ADDR_LO32_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_ADDR_HI32 = 0x15ca +regGCVM_L2_PROTECTION_FAULT_ADDR_HI32_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32 = 0x15cb +regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32_BASE_IDX = 0 +regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32 = 0x15cc +regGCVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32_BASE_IDX = 0 +regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32 = 0x15ce +regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32_BASE_IDX = 0 +regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32 = 0x15cf +regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32_BASE_IDX = 0 +regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32 = 0x15d0 +regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32_BASE_IDX = 0 +regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32 = 0x15d1 +regGCVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32_BASE_IDX = 0 +regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32 = 0x15d2 +regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32_BASE_IDX = 0 +regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32 = 0x15d3 +regGCVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32_BASE_IDX = 0 +regGCVM_L2_CNTL4 = 0x15d4 +regGCVM_L2_CNTL4_BASE_IDX = 0 +regGCVM_L2_MM_GROUP_RT_CLASSES = 0x15d5 +regGCVM_L2_MM_GROUP_RT_CLASSES_BASE_IDX = 0 +regGCVM_L2_BANK_SELECT_RESERVED_CID = 0x15d6 +regGCVM_L2_BANK_SELECT_RESERVED_CID_BASE_IDX = 0 +regGCVM_L2_BANK_SELECT_RESERVED_CID2 = 0x15d7 +regGCVM_L2_BANK_SELECT_RESERVED_CID2_BASE_IDX = 0 +regGCVM_L2_CACHE_PARITY_CNTL = 0x15d8 +regGCVM_L2_CACHE_PARITY_CNTL_BASE_IDX = 0 +regGCVM_L2_ICG_CTRL = 0x15d9 +regGCVM_L2_ICG_CTRL_BASE_IDX = 0 +regGCVM_L2_CNTL5 = 0x15da +regGCVM_L2_CNTL5_BASE_IDX = 0 +regGCVM_L2_GCR_CNTL = 0x15db +regGCVM_L2_GCR_CNTL_BASE_IDX = 0 +regGCVML2_WALKER_MACRO_THROTTLE_TIME = 0x15dc +regGCVML2_WALKER_MACRO_THROTTLE_TIME_BASE_IDX = 0 +regGCVML2_WALKER_MACRO_THROTTLE_FETCH_LIMIT = 0x15dd +regGCVML2_WALKER_MACRO_THROTTLE_FETCH_LIMIT_BASE_IDX = 0 +regGCVML2_WALKER_MICRO_THROTTLE_TIME = 0x15de +regGCVML2_WALKER_MICRO_THROTTLE_TIME_BASE_IDX = 0 +regGCVML2_WALKER_MICRO_THROTTLE_FETCH_LIMIT = 0x15df +regGCVML2_WALKER_MICRO_THROTTLE_FETCH_LIMIT_BASE_IDX = 0 +regGCVM_L2_CGTT_BUSY_CTRL = 0x15e0 +regGCVM_L2_CGTT_BUSY_CTRL_BASE_IDX = 0 +regGCVM_L2_PTE_CACHE_DUMP_CNTL = 0x15e1 +regGCVM_L2_PTE_CACHE_DUMP_CNTL_BASE_IDX = 0 +regGCVM_L2_PTE_CACHE_DUMP_READ = 0x15e2 +regGCVM_L2_PTE_CACHE_DUMP_READ_BASE_IDX = 0 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_REQUEST_LO = 0x15e5 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_REQUEST_LO_BASE_IDX = 0 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_REQUEST_HI = 0x15e6 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_REQUEST_HI_BASE_IDX = 0 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_RESPONSE_LO = 0x15e7 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_RESPONSE_LO_BASE_IDX = 0 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_RESPONSE_HI = 0x15e8 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_RESPONSE_HI_BASE_IDX = 0 +regGCVM_L2_BANK_SELECT_MASKS = 0x15e9 +regGCVM_L2_BANK_SELECT_MASKS_BASE_IDX = 0 +regGCUTCL2_CREDIT_SAFETY_GROUP_RET_CDC = 0x15ea +regGCUTCL2_CREDIT_SAFETY_GROUP_RET_CDC_BASE_IDX = 0 +regGCUTCL2_CREDIT_SAFETY_GROUP_CLIENTS_INVREQ_CDC = 0x15eb +regGCUTCL2_CREDIT_SAFETY_GROUP_CLIENTS_INVREQ_CDC_BASE_IDX = 0 +regGCUTCL2_CREDIT_SAFETY_GROUP_CLIENTS_INVREQ_NOCDC = 0x15ec +regGCUTCL2_CREDIT_SAFETY_GROUP_CLIENTS_INVREQ_NOCDC_BASE_IDX = 0 +regGCVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT = 0x15ed +regGCVML2_CREDIT_SAFETY_IH_FAULT_INTERRUPT_BASE_IDX = 0 +regGCVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ = 0x15ee +regGCVML2_WALKER_CREDIT_SAFETY_FETCH_RDREQ_BASE_IDX = 0 +regGCMC_VM_FB_LOCATION_BASE = 0x1678 +regGCMC_VM_FB_LOCATION_BASE_BASE_IDX = 0 +regGCMC_VM_FB_LOCATION_TOP = 0x1679 +regGCMC_VM_FB_LOCATION_TOP_BASE_IDX = 0 +regGCMC_VM_AGP_TOP = 0x167a +regGCMC_VM_AGP_TOP_BASE_IDX = 0 +regGCMC_VM_AGP_BOT = 0x167b +regGCMC_VM_AGP_BOT_BASE_IDX = 0 +regGCMC_VM_AGP_BASE = 0x167c +regGCMC_VM_AGP_BASE_BASE_IDX = 0 +regGCMC_VM_SYSTEM_APERTURE_LOW_ADDR = 0x167d +regGCMC_VM_SYSTEM_APERTURE_LOW_ADDR_BASE_IDX = 0 +regGCMC_VM_SYSTEM_APERTURE_HIGH_ADDR = 0x167e +regGCMC_VM_SYSTEM_APERTURE_HIGH_ADDR_BASE_IDX = 0 +regGCMC_VM_MX_L1_TLB_CNTL = 0x167f +regGCMC_VM_MX_L1_TLB_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT0_CNTL = 0x1688 +regGCVM_CONTEXT0_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT1_CNTL = 0x1689 +regGCVM_CONTEXT1_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT2_CNTL = 0x168a +regGCVM_CONTEXT2_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT3_CNTL = 0x168b +regGCVM_CONTEXT3_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT4_CNTL = 0x168c +regGCVM_CONTEXT4_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT5_CNTL = 0x168d +regGCVM_CONTEXT5_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT6_CNTL = 0x168e +regGCVM_CONTEXT6_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT7_CNTL = 0x168f +regGCVM_CONTEXT7_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT8_CNTL = 0x1690 +regGCVM_CONTEXT8_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT9_CNTL = 0x1691 +regGCVM_CONTEXT9_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT10_CNTL = 0x1692 +regGCVM_CONTEXT10_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT11_CNTL = 0x1693 +regGCVM_CONTEXT11_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT12_CNTL = 0x1694 +regGCVM_CONTEXT12_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT13_CNTL = 0x1695 +regGCVM_CONTEXT13_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT14_CNTL = 0x1696 +regGCVM_CONTEXT14_CNTL_BASE_IDX = 0 +regGCVM_CONTEXT15_CNTL = 0x1697 +regGCVM_CONTEXT15_CNTL_BASE_IDX = 0 +regGCVM_CONTEXTS_DISABLE = 0x1698 +regGCVM_CONTEXTS_DISABLE_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG0_SEM = 0x1699 +regGCVM_INVALIDATE_ENG0_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG1_SEM = 0x169a +regGCVM_INVALIDATE_ENG1_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG2_SEM = 0x169b +regGCVM_INVALIDATE_ENG2_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG3_SEM = 0x169c +regGCVM_INVALIDATE_ENG3_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG4_SEM = 0x169d +regGCVM_INVALIDATE_ENG4_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG5_SEM = 0x169e +regGCVM_INVALIDATE_ENG5_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG6_SEM = 0x169f +regGCVM_INVALIDATE_ENG6_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG7_SEM = 0x16a0 +regGCVM_INVALIDATE_ENG7_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG8_SEM = 0x16a1 +regGCVM_INVALIDATE_ENG8_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG9_SEM = 0x16a2 +regGCVM_INVALIDATE_ENG9_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG10_SEM = 0x16a3 +regGCVM_INVALIDATE_ENG10_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG11_SEM = 0x16a4 +regGCVM_INVALIDATE_ENG11_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG12_SEM = 0x16a5 +regGCVM_INVALIDATE_ENG12_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG13_SEM = 0x16a6 +regGCVM_INVALIDATE_ENG13_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG14_SEM = 0x16a7 +regGCVM_INVALIDATE_ENG14_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG15_SEM = 0x16a8 +regGCVM_INVALIDATE_ENG15_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG16_SEM = 0x16a9 +regGCVM_INVALIDATE_ENG16_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG17_SEM = 0x16aa +regGCVM_INVALIDATE_ENG17_SEM_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG0_REQ = 0x16ab +regGCVM_INVALIDATE_ENG0_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG1_REQ = 0x16ac +regGCVM_INVALIDATE_ENG1_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG2_REQ = 0x16ad +regGCVM_INVALIDATE_ENG2_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG3_REQ = 0x16ae +regGCVM_INVALIDATE_ENG3_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG4_REQ = 0x16af +regGCVM_INVALIDATE_ENG4_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG5_REQ = 0x16b0 +regGCVM_INVALIDATE_ENG5_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG6_REQ = 0x16b1 +regGCVM_INVALIDATE_ENG6_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG7_REQ = 0x16b2 +regGCVM_INVALIDATE_ENG7_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG8_REQ = 0x16b3 +regGCVM_INVALIDATE_ENG8_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG9_REQ = 0x16b4 +regGCVM_INVALIDATE_ENG9_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG10_REQ = 0x16b5 +regGCVM_INVALIDATE_ENG10_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG11_REQ = 0x16b6 +regGCVM_INVALIDATE_ENG11_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG12_REQ = 0x16b7 +regGCVM_INVALIDATE_ENG12_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG13_REQ = 0x16b8 +regGCVM_INVALIDATE_ENG13_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG14_REQ = 0x16b9 +regGCVM_INVALIDATE_ENG14_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG15_REQ = 0x16ba +regGCVM_INVALIDATE_ENG15_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG16_REQ = 0x16bb +regGCVM_INVALIDATE_ENG16_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG17_REQ = 0x16bc +regGCVM_INVALIDATE_ENG17_REQ_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG0_ACK = 0x16bd +regGCVM_INVALIDATE_ENG0_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG1_ACK = 0x16be +regGCVM_INVALIDATE_ENG1_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG2_ACK = 0x16bf +regGCVM_INVALIDATE_ENG2_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG3_ACK = 0x16c0 +regGCVM_INVALIDATE_ENG3_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG4_ACK = 0x16c1 +regGCVM_INVALIDATE_ENG4_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG5_ACK = 0x16c2 +regGCVM_INVALIDATE_ENG5_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG6_ACK = 0x16c3 +regGCVM_INVALIDATE_ENG6_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG7_ACK = 0x16c4 +regGCVM_INVALIDATE_ENG7_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG8_ACK = 0x16c5 +regGCVM_INVALIDATE_ENG8_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG9_ACK = 0x16c6 +regGCVM_INVALIDATE_ENG9_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG10_ACK = 0x16c7 +regGCVM_INVALIDATE_ENG10_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG11_ACK = 0x16c8 +regGCVM_INVALIDATE_ENG11_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG12_ACK = 0x16c9 +regGCVM_INVALIDATE_ENG12_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG13_ACK = 0x16ca +regGCVM_INVALIDATE_ENG13_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG14_ACK = 0x16cb +regGCVM_INVALIDATE_ENG14_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG15_ACK = 0x16cc +regGCVM_INVALIDATE_ENG15_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG16_ACK = 0x16cd +regGCVM_INVALIDATE_ENG16_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG17_ACK = 0x16ce +regGCVM_INVALIDATE_ENG17_ACK_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32 = 0x16cf +regGCVM_INVALIDATE_ENG0_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG0_ADDR_RANGE_HI32 = 0x16d0 +regGCVM_INVALIDATE_ENG0_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 = 0x16d1 +regGCVM_INVALIDATE_ENG1_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG1_ADDR_RANGE_HI32 = 0x16d2 +regGCVM_INVALIDATE_ENG1_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG2_ADDR_RANGE_LO32 = 0x16d3 +regGCVM_INVALIDATE_ENG2_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG2_ADDR_RANGE_HI32 = 0x16d4 +regGCVM_INVALIDATE_ENG2_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG3_ADDR_RANGE_LO32 = 0x16d5 +regGCVM_INVALIDATE_ENG3_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG3_ADDR_RANGE_HI32 = 0x16d6 +regGCVM_INVALIDATE_ENG3_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG4_ADDR_RANGE_LO32 = 0x16d7 +regGCVM_INVALIDATE_ENG4_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG4_ADDR_RANGE_HI32 = 0x16d8 +regGCVM_INVALIDATE_ENG4_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG5_ADDR_RANGE_LO32 = 0x16d9 +regGCVM_INVALIDATE_ENG5_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG5_ADDR_RANGE_HI32 = 0x16da +regGCVM_INVALIDATE_ENG5_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG6_ADDR_RANGE_LO32 = 0x16db +regGCVM_INVALIDATE_ENG6_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG6_ADDR_RANGE_HI32 = 0x16dc +regGCVM_INVALIDATE_ENG6_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG7_ADDR_RANGE_LO32 = 0x16dd +regGCVM_INVALIDATE_ENG7_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG7_ADDR_RANGE_HI32 = 0x16de +regGCVM_INVALIDATE_ENG7_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG8_ADDR_RANGE_LO32 = 0x16df +regGCVM_INVALIDATE_ENG8_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG8_ADDR_RANGE_HI32 = 0x16e0 +regGCVM_INVALIDATE_ENG8_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG9_ADDR_RANGE_LO32 = 0x16e1 +regGCVM_INVALIDATE_ENG9_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG9_ADDR_RANGE_HI32 = 0x16e2 +regGCVM_INVALIDATE_ENG9_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG10_ADDR_RANGE_LO32 = 0x16e3 +regGCVM_INVALIDATE_ENG10_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG10_ADDR_RANGE_HI32 = 0x16e4 +regGCVM_INVALIDATE_ENG10_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG11_ADDR_RANGE_LO32 = 0x16e5 +regGCVM_INVALIDATE_ENG11_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG11_ADDR_RANGE_HI32 = 0x16e6 +regGCVM_INVALIDATE_ENG11_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG12_ADDR_RANGE_LO32 = 0x16e7 +regGCVM_INVALIDATE_ENG12_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG12_ADDR_RANGE_HI32 = 0x16e8 +regGCVM_INVALIDATE_ENG12_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG13_ADDR_RANGE_LO32 = 0x16e9 +regGCVM_INVALIDATE_ENG13_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG13_ADDR_RANGE_HI32 = 0x16ea +regGCVM_INVALIDATE_ENG13_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG14_ADDR_RANGE_LO32 = 0x16eb +regGCVM_INVALIDATE_ENG14_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG14_ADDR_RANGE_HI32 = 0x16ec +regGCVM_INVALIDATE_ENG14_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG15_ADDR_RANGE_LO32 = 0x16ed +regGCVM_INVALIDATE_ENG15_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG15_ADDR_RANGE_HI32 = 0x16ee +regGCVM_INVALIDATE_ENG15_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG16_ADDR_RANGE_LO32 = 0x16ef +regGCVM_INVALIDATE_ENG16_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG16_ADDR_RANGE_HI32 = 0x16f0 +regGCVM_INVALIDATE_ENG16_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG17_ADDR_RANGE_LO32 = 0x16f1 +regGCVM_INVALIDATE_ENG17_ADDR_RANGE_LO32_BASE_IDX = 0 +regGCVM_INVALIDATE_ENG17_ADDR_RANGE_HI32 = 0x16f2 +regGCVM_INVALIDATE_ENG17_ADDR_RANGE_HI32_BASE_IDX = 0 +regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32 = 0x16f3 +regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32 = 0x16f4 +regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 = 0x16f5 +regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32 = 0x16f6 +regGCVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32 = 0x16f7 +regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32 = 0x16f8 +regGCVM_CONTEXT2_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32 = 0x16f9 +regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32 = 0x16fa +regGCVM_CONTEXT3_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32 = 0x16fb +regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32 = 0x16fc +regGCVM_CONTEXT4_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32 = 0x16fd +regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32 = 0x16fe +regGCVM_CONTEXT5_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32 = 0x16ff +regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32 = 0x1700 +regGCVM_CONTEXT6_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32 = 0x1701 +regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32 = 0x1702 +regGCVM_CONTEXT7_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32 = 0x1703 +regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32 = 0x1704 +regGCVM_CONTEXT8_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32 = 0x1705 +regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32 = 0x1706 +regGCVM_CONTEXT9_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32 = 0x1707 +regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32 = 0x1708 +regGCVM_CONTEXT10_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32 = 0x1709 +regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32 = 0x170a +regGCVM_CONTEXT11_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32 = 0x170b +regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32 = 0x170c +regGCVM_CONTEXT12_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32 = 0x170d +regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32 = 0x170e +regGCVM_CONTEXT13_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32 = 0x170f +regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32 = 0x1710 +regGCVM_CONTEXT14_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32 = 0x1711 +regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32 = 0x1712 +regGCVM_CONTEXT15_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32 = 0x1713 +regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32 = 0x1714 +regGCVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32 = 0x1715 +regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32 = 0x1716 +regGCVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32 = 0x1717 +regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32 = 0x1718 +regGCVM_CONTEXT2_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32 = 0x1719 +regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32 = 0x171a +regGCVM_CONTEXT3_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32 = 0x171b +regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32 = 0x171c +regGCVM_CONTEXT4_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32 = 0x171d +regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32 = 0x171e +regGCVM_CONTEXT5_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32 = 0x171f +regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32 = 0x1720 +regGCVM_CONTEXT6_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32 = 0x1721 +regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32 = 0x1722 +regGCVM_CONTEXT7_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32 = 0x1723 +regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32 = 0x1724 +regGCVM_CONTEXT8_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32 = 0x1725 +regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32 = 0x1726 +regGCVM_CONTEXT9_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32 = 0x1727 +regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32 = 0x1728 +regGCVM_CONTEXT10_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32 = 0x1729 +regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32 = 0x172a +regGCVM_CONTEXT11_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32 = 0x172b +regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32 = 0x172c +regGCVM_CONTEXT12_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32 = 0x172d +regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32 = 0x172e +regGCVM_CONTEXT13_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32 = 0x172f +regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32 = 0x1730 +regGCVM_CONTEXT14_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32 = 0x1731 +regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32 = 0x1732 +regGCVM_CONTEXT15_PAGE_TABLE_START_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32 = 0x1733 +regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32 = 0x1734 +regGCVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32 = 0x1735 +regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32 = 0x1736 +regGCVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32 = 0x1737 +regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32 = 0x1738 +regGCVM_CONTEXT2_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32 = 0x1739 +regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32 = 0x173a +regGCVM_CONTEXT3_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32 = 0x173b +regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32 = 0x173c +regGCVM_CONTEXT4_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32 = 0x173d +regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32 = 0x173e +regGCVM_CONTEXT5_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32 = 0x173f +regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32 = 0x1740 +regGCVM_CONTEXT6_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32 = 0x1741 +regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32 = 0x1742 +regGCVM_CONTEXT7_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32 = 0x1743 +regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32 = 0x1744 +regGCVM_CONTEXT8_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32 = 0x1745 +regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32 = 0x1746 +regGCVM_CONTEXT9_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32 = 0x1747 +regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32 = 0x1748 +regGCVM_CONTEXT10_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32 = 0x1749 +regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32 = 0x174a +regGCVM_CONTEXT11_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32 = 0x174b +regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32 = 0x174c +regGCVM_CONTEXT12_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32 = 0x174d +regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32 = 0x174e +regGCVM_CONTEXT13_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32 = 0x174f +regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32 = 0x1750 +regGCVM_CONTEXT14_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32 = 0x1751 +regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_LO32_BASE_IDX = 0 +regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32 = 0x1752 +regGCVM_CONTEXT15_PAGE_TABLE_END_ADDR_HI32_BASE_IDX = 0 +regGCVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1753 +regGCVM_L2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1754 +regGCVM_L2_CONTEXT0_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1755 +regGCVM_L2_CONTEXT1_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1756 +regGCVM_L2_CONTEXT2_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1757 +regGCVM_L2_CONTEXT3_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1758 +regGCVM_L2_CONTEXT4_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1759 +regGCVM_L2_CONTEXT5_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x175a +regGCVM_L2_CONTEXT6_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x175b +regGCVM_L2_CONTEXT7_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x175c +regGCVM_L2_CONTEXT8_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x175d +regGCVM_L2_CONTEXT9_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x175e +regGCVM_L2_CONTEXT10_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x175f +regGCVM_L2_CONTEXT11_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1760 +regGCVM_L2_CONTEXT12_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1761 +regGCVM_L2_CONTEXT13_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1762 +regGCVM_L2_CONTEXT14_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES = 0x1763 +regGCVM_L2_CONTEXT15_PER_PFVF_PTE_CACHE_FRAGMENT_SIZES_BASE_IDX = 0 +regGCVML2_PERFCOUNTER2_0_LO = 0x34e0 +regGCVML2_PERFCOUNTER2_0_LO_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_1_LO = 0x34e1 +regGCVML2_PERFCOUNTER2_1_LO_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_0_HI = 0x34e2 +regGCVML2_PERFCOUNTER2_0_HI_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_1_HI = 0x34e3 +regGCVML2_PERFCOUNTER2_1_HI_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER_LO = 0x34e4 +regGCMC_VM_L2_PERFCOUNTER_LO_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER_HI = 0x34e5 +regGCMC_VM_L2_PERFCOUNTER_HI_BASE_IDX = 1 +regGCUTCL2_PERFCOUNTER_LO = 0x34e6 +regGCUTCL2_PERFCOUNTER_LO_BASE_IDX = 1 +regGCUTCL2_PERFCOUNTER_HI = 0x34e7 +regGCUTCL2_PERFCOUNTER_HI_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_0_SELECT = 0x3d20 +regGCVML2_PERFCOUNTER2_0_SELECT_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_1_SELECT = 0x3d21 +regGCVML2_PERFCOUNTER2_1_SELECT_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_0_SELECT1 = 0x3d22 +regGCVML2_PERFCOUNTER2_0_SELECT1_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_1_SELECT1 = 0x3d23 +regGCVML2_PERFCOUNTER2_1_SELECT1_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_0_MODE = 0x3d24 +regGCVML2_PERFCOUNTER2_0_MODE_BASE_IDX = 1 +regGCVML2_PERFCOUNTER2_1_MODE = 0x3d25 +regGCVML2_PERFCOUNTER2_1_MODE_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER0_CFG = 0x3d30 +regGCMC_VM_L2_PERFCOUNTER0_CFG_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER1_CFG = 0x3d31 +regGCMC_VM_L2_PERFCOUNTER1_CFG_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER2_CFG = 0x3d32 +regGCMC_VM_L2_PERFCOUNTER2_CFG_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER3_CFG = 0x3d33 +regGCMC_VM_L2_PERFCOUNTER3_CFG_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER4_CFG = 0x3d34 +regGCMC_VM_L2_PERFCOUNTER4_CFG_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER5_CFG = 0x3d35 +regGCMC_VM_L2_PERFCOUNTER5_CFG_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER6_CFG = 0x3d36 +regGCMC_VM_L2_PERFCOUNTER6_CFG_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER7_CFG = 0x3d37 +regGCMC_VM_L2_PERFCOUNTER7_CFG_BASE_IDX = 1 +regGCMC_VM_L2_PERFCOUNTER_RSLT_CNTL = 0x3d38 +regGCMC_VM_L2_PERFCOUNTER_RSLT_CNTL_BASE_IDX = 1 +regGCUTCL2_PERFCOUNTER0_CFG = 0x3d39 +regGCUTCL2_PERFCOUNTER0_CFG_BASE_IDX = 1 +regGCUTCL2_PERFCOUNTER1_CFG = 0x3d3a +regGCUTCL2_PERFCOUNTER1_CFG_BASE_IDX = 1 +regGCUTCL2_PERFCOUNTER2_CFG = 0x3d3b +regGCUTCL2_PERFCOUNTER2_CFG_BASE_IDX = 1 +regGCUTCL2_PERFCOUNTER3_CFG = 0x3d3c +regGCUTCL2_PERFCOUNTER3_CFG_BASE_IDX = 1 +regGCUTCL2_PERFCOUNTER_RSLT_CNTL = 0x3d3d +regGCUTCL2_PERFCOUNTER_RSLT_CNTL_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF0 = 0x5a80 +regGCMC_VM_FB_SIZE_OFFSET_VF0_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF1 = 0x5a81 +regGCMC_VM_FB_SIZE_OFFSET_VF1_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF2 = 0x5a82 +regGCMC_VM_FB_SIZE_OFFSET_VF2_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF3 = 0x5a83 +regGCMC_VM_FB_SIZE_OFFSET_VF3_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF4 = 0x5a84 +regGCMC_VM_FB_SIZE_OFFSET_VF4_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF5 = 0x5a85 +regGCMC_VM_FB_SIZE_OFFSET_VF5_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF6 = 0x5a86 +regGCMC_VM_FB_SIZE_OFFSET_VF6_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF7 = 0x5a87 +regGCMC_VM_FB_SIZE_OFFSET_VF7_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF8 = 0x5a88 +regGCMC_VM_FB_SIZE_OFFSET_VF8_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF9 = 0x5a89 +regGCMC_VM_FB_SIZE_OFFSET_VF9_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF10 = 0x5a8a +regGCMC_VM_FB_SIZE_OFFSET_VF10_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF11 = 0x5a8b +regGCMC_VM_FB_SIZE_OFFSET_VF11_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF12 = 0x5a8c +regGCMC_VM_FB_SIZE_OFFSET_VF12_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF13 = 0x5a8d +regGCMC_VM_FB_SIZE_OFFSET_VF13_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF14 = 0x5a8e +regGCMC_VM_FB_SIZE_OFFSET_VF14_BASE_IDX = 1 +regGCMC_VM_FB_SIZE_OFFSET_VF15 = 0x5a8f +regGCMC_VM_FB_SIZE_OFFSET_VF15_BASE_IDX = 1 +regGCUTCL2_TRANSLATION_BYPASS_BY_VMID = 0x5e41 +regGCUTCL2_TRANSLATION_BYPASS_BY_VMID_BASE_IDX = 1 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_CNTL = 0x5e44 +regGCUTC_GPUVA_VMID_TRANSLATION_ASSIST_CNTL_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_0 = 0x5e48 +regGCMC_VM_MARC_BASE_LO_0_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_1 = 0x5e49 +regGCMC_VM_MARC_BASE_LO_1_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_2 = 0x5e4a +regGCMC_VM_MARC_BASE_LO_2_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_3 = 0x5e4b +regGCMC_VM_MARC_BASE_LO_3_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_4 = 0x5e4c +regGCMC_VM_MARC_BASE_LO_4_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_5 = 0x5e4d +regGCMC_VM_MARC_BASE_LO_5_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_6 = 0x5e4e +regGCMC_VM_MARC_BASE_LO_6_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_7 = 0x5e4f +regGCMC_VM_MARC_BASE_LO_7_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_8 = 0x5e50 +regGCMC_VM_MARC_BASE_LO_8_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_9 = 0x5e51 +regGCMC_VM_MARC_BASE_LO_9_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_10 = 0x5e52 +regGCMC_VM_MARC_BASE_LO_10_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_11 = 0x5e53 +regGCMC_VM_MARC_BASE_LO_11_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_12 = 0x5e54 +regGCMC_VM_MARC_BASE_LO_12_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_13 = 0x5e55 +regGCMC_VM_MARC_BASE_LO_13_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_14 = 0x5e56 +regGCMC_VM_MARC_BASE_LO_14_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_LO_15 = 0x5e57 +regGCMC_VM_MARC_BASE_LO_15_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_0 = 0x5e58 +regGCMC_VM_MARC_BASE_HI_0_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_1 = 0x5e59 +regGCMC_VM_MARC_BASE_HI_1_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_2 = 0x5e5a +regGCMC_VM_MARC_BASE_HI_2_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_3 = 0x5e5b +regGCMC_VM_MARC_BASE_HI_3_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_4 = 0x5e5c +regGCMC_VM_MARC_BASE_HI_4_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_5 = 0x5e5d +regGCMC_VM_MARC_BASE_HI_5_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_6 = 0x5e5e +regGCMC_VM_MARC_BASE_HI_6_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_7 = 0x5e5f +regGCMC_VM_MARC_BASE_HI_7_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_8 = 0x5e60 +regGCMC_VM_MARC_BASE_HI_8_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_9 = 0x5e61 +regGCMC_VM_MARC_BASE_HI_9_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_10 = 0x5e62 +regGCMC_VM_MARC_BASE_HI_10_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_11 = 0x5e63 +regGCMC_VM_MARC_BASE_HI_11_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_12 = 0x5e64 +regGCMC_VM_MARC_BASE_HI_12_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_13 = 0x5e65 +regGCMC_VM_MARC_BASE_HI_13_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_14 = 0x5e66 +regGCMC_VM_MARC_BASE_HI_14_BASE_IDX = 1 +regGCMC_VM_MARC_BASE_HI_15 = 0x5e67 +regGCMC_VM_MARC_BASE_HI_15_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_0 = 0x5e68 +regGCMC_VM_MARC_RELOC_LO_0_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_1 = 0x5e69 +regGCMC_VM_MARC_RELOC_LO_1_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_2 = 0x5e6a +regGCMC_VM_MARC_RELOC_LO_2_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_3 = 0x5e6b +regGCMC_VM_MARC_RELOC_LO_3_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_4 = 0x5e6c +regGCMC_VM_MARC_RELOC_LO_4_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_5 = 0x5e6d +regGCMC_VM_MARC_RELOC_LO_5_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_6 = 0x5e6e +regGCMC_VM_MARC_RELOC_LO_6_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_7 = 0x5e6f +regGCMC_VM_MARC_RELOC_LO_7_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_8 = 0x5e70 +regGCMC_VM_MARC_RELOC_LO_8_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_9 = 0x5e71 +regGCMC_VM_MARC_RELOC_LO_9_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_10 = 0x5e72 +regGCMC_VM_MARC_RELOC_LO_10_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_11 = 0x5e73 +regGCMC_VM_MARC_RELOC_LO_11_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_12 = 0x5e74 +regGCMC_VM_MARC_RELOC_LO_12_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_13 = 0x5e75 +regGCMC_VM_MARC_RELOC_LO_13_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_14 = 0x5e76 +regGCMC_VM_MARC_RELOC_LO_14_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_LO_15 = 0x5e77 +regGCMC_VM_MARC_RELOC_LO_15_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_0 = 0x5e78 +regGCMC_VM_MARC_RELOC_HI_0_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_1 = 0x5e79 +regGCMC_VM_MARC_RELOC_HI_1_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_2 = 0x5e7a +regGCMC_VM_MARC_RELOC_HI_2_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_3 = 0x5e7b +regGCMC_VM_MARC_RELOC_HI_3_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_4 = 0x5e7c +regGCMC_VM_MARC_RELOC_HI_4_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_5 = 0x5e7d +regGCMC_VM_MARC_RELOC_HI_5_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_6 = 0x5e7e +regGCMC_VM_MARC_RELOC_HI_6_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_7 = 0x5e7f +regGCMC_VM_MARC_RELOC_HI_7_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_8 = 0x5e80 +regGCMC_VM_MARC_RELOC_HI_8_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_9 = 0x5e81 +regGCMC_VM_MARC_RELOC_HI_9_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_10 = 0x5e82 +regGCMC_VM_MARC_RELOC_HI_10_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_11 = 0x5e83 +regGCMC_VM_MARC_RELOC_HI_11_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_12 = 0x5e84 +regGCMC_VM_MARC_RELOC_HI_12_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_13 = 0x5e85 +regGCMC_VM_MARC_RELOC_HI_13_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_14 = 0x5e86 +regGCMC_VM_MARC_RELOC_HI_14_BASE_IDX = 1 +regGCMC_VM_MARC_RELOC_HI_15 = 0x5e87 +regGCMC_VM_MARC_RELOC_HI_15_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_0 = 0x5e88 +regGCMC_VM_MARC_LEN_LO_0_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_1 = 0x5e89 +regGCMC_VM_MARC_LEN_LO_1_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_2 = 0x5e8a +regGCMC_VM_MARC_LEN_LO_2_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_3 = 0x5e8b +regGCMC_VM_MARC_LEN_LO_3_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_4 = 0x5e8c +regGCMC_VM_MARC_LEN_LO_4_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_5 = 0x5e8d +regGCMC_VM_MARC_LEN_LO_5_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_6 = 0x5e8e +regGCMC_VM_MARC_LEN_LO_6_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_7 = 0x5e8f +regGCMC_VM_MARC_LEN_LO_7_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_8 = 0x5e90 +regGCMC_VM_MARC_LEN_LO_8_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_9 = 0x5e91 +regGCMC_VM_MARC_LEN_LO_9_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_10 = 0x5e92 +regGCMC_VM_MARC_LEN_LO_10_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_11 = 0x5e93 +regGCMC_VM_MARC_LEN_LO_11_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_12 = 0x5e94 +regGCMC_VM_MARC_LEN_LO_12_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_13 = 0x5e95 +regGCMC_VM_MARC_LEN_LO_13_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_14 = 0x5e96 +regGCMC_VM_MARC_LEN_LO_14_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_LO_15 = 0x5e97 +regGCMC_VM_MARC_LEN_LO_15_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_0 = 0x5e98 +regGCMC_VM_MARC_LEN_HI_0_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_1 = 0x5e99 +regGCMC_VM_MARC_LEN_HI_1_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_2 = 0x5e9a +regGCMC_VM_MARC_LEN_HI_2_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_3 = 0x5e9b +regGCMC_VM_MARC_LEN_HI_3_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_4 = 0x5e9c +regGCMC_VM_MARC_LEN_HI_4_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_5 = 0x5e9d +regGCMC_VM_MARC_LEN_HI_5_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_6 = 0x5e9e +regGCMC_VM_MARC_LEN_HI_6_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_7 = 0x5e9f +regGCMC_VM_MARC_LEN_HI_7_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_8 = 0x5ea0 +regGCMC_VM_MARC_LEN_HI_8_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_9 = 0x5ea1 +regGCMC_VM_MARC_LEN_HI_9_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_10 = 0x5ea2 +regGCMC_VM_MARC_LEN_HI_10_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_11 = 0x5ea3 +regGCMC_VM_MARC_LEN_HI_11_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_12 = 0x5ea4 +regGCMC_VM_MARC_LEN_HI_12_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_13 = 0x5ea5 +regGCMC_VM_MARC_LEN_HI_13_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_14 = 0x5ea6 +regGCMC_VM_MARC_LEN_HI_14_BASE_IDX = 1 +regGCMC_VM_MARC_LEN_HI_15 = 0x5ea7 +regGCMC_VM_MARC_LEN_HI_15_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_0 = 0x5ea8 +regGCMC_VM_MARC_PFVF_MAPPING_0_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_1 = 0x5ea9 +regGCMC_VM_MARC_PFVF_MAPPING_1_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_2 = 0x5eaa +regGCMC_VM_MARC_PFVF_MAPPING_2_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_3 = 0x5eab +regGCMC_VM_MARC_PFVF_MAPPING_3_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_4 = 0x5eac +regGCMC_VM_MARC_PFVF_MAPPING_4_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_5 = 0x5ead +regGCMC_VM_MARC_PFVF_MAPPING_5_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_6 = 0x5eae +regGCMC_VM_MARC_PFVF_MAPPING_6_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_7 = 0x5eaf +regGCMC_VM_MARC_PFVF_MAPPING_7_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_8 = 0x5eb0 +regGCMC_VM_MARC_PFVF_MAPPING_8_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_9 = 0x5eb1 +regGCMC_VM_MARC_PFVF_MAPPING_9_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_10 = 0x5eb2 +regGCMC_VM_MARC_PFVF_MAPPING_10_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_11 = 0x5eb3 +regGCMC_VM_MARC_PFVF_MAPPING_11_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_12 = 0x5eb4 +regGCMC_VM_MARC_PFVF_MAPPING_12_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_13 = 0x5eb5 +regGCMC_VM_MARC_PFVF_MAPPING_13_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_14 = 0x5eb6 +regGCMC_VM_MARC_PFVF_MAPPING_14_BASE_IDX = 1 +regGCMC_VM_MARC_PFVF_MAPPING_15 = 0x5eb7 +regGCMC_VM_MARC_PFVF_MAPPING_15_BASE_IDX = 1 +regGCUTC_TRANSLATION_FAULT_CNTL0 = 0x5eb8 +regGCUTC_TRANSLATION_FAULT_CNTL0_BASE_IDX = 1 +regGCUTC_TRANSLATION_FAULT_CNTL1 = 0x5eb9 +regGCUTC_TRANSLATION_FAULT_CNTL1_BASE_IDX = 1 +regSPI_SHADER_PGM_RSRC4_PS = 0x19a1 +regSPI_SHADER_PGM_RSRC4_PS_BASE_IDX = 0 +regSPI_SHADER_PGM_CHKSUM_PS = 0x19a6 +regSPI_SHADER_PGM_CHKSUM_PS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC3_PS = 0x19a7 +regSPI_SHADER_PGM_RSRC3_PS_BASE_IDX = 0 +regSPI_SHADER_PGM_LO_PS = 0x19a8 +regSPI_SHADER_PGM_LO_PS_BASE_IDX = 0 +regSPI_SHADER_PGM_HI_PS = 0x19a9 +regSPI_SHADER_PGM_HI_PS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC1_PS = 0x19aa +regSPI_SHADER_PGM_RSRC1_PS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC2_PS = 0x19ab +regSPI_SHADER_PGM_RSRC2_PS_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_0 = 0x19ac +regSPI_SHADER_USER_DATA_PS_0_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_1 = 0x19ad +regSPI_SHADER_USER_DATA_PS_1_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_2 = 0x19ae +regSPI_SHADER_USER_DATA_PS_2_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_3 = 0x19af +regSPI_SHADER_USER_DATA_PS_3_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_4 = 0x19b0 +regSPI_SHADER_USER_DATA_PS_4_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_5 = 0x19b1 +regSPI_SHADER_USER_DATA_PS_5_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_6 = 0x19b2 +regSPI_SHADER_USER_DATA_PS_6_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_7 = 0x19b3 +regSPI_SHADER_USER_DATA_PS_7_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_8 = 0x19b4 +regSPI_SHADER_USER_DATA_PS_8_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_9 = 0x19b5 +regSPI_SHADER_USER_DATA_PS_9_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_10 = 0x19b6 +regSPI_SHADER_USER_DATA_PS_10_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_11 = 0x19b7 +regSPI_SHADER_USER_DATA_PS_11_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_12 = 0x19b8 +regSPI_SHADER_USER_DATA_PS_12_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_13 = 0x19b9 +regSPI_SHADER_USER_DATA_PS_13_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_14 = 0x19ba +regSPI_SHADER_USER_DATA_PS_14_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_15 = 0x19bb +regSPI_SHADER_USER_DATA_PS_15_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_16 = 0x19bc +regSPI_SHADER_USER_DATA_PS_16_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_17 = 0x19bd +regSPI_SHADER_USER_DATA_PS_17_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_18 = 0x19be +regSPI_SHADER_USER_DATA_PS_18_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_19 = 0x19bf +regSPI_SHADER_USER_DATA_PS_19_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_20 = 0x19c0 +regSPI_SHADER_USER_DATA_PS_20_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_21 = 0x19c1 +regSPI_SHADER_USER_DATA_PS_21_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_22 = 0x19c2 +regSPI_SHADER_USER_DATA_PS_22_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_23 = 0x19c3 +regSPI_SHADER_USER_DATA_PS_23_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_24 = 0x19c4 +regSPI_SHADER_USER_DATA_PS_24_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_25 = 0x19c5 +regSPI_SHADER_USER_DATA_PS_25_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_26 = 0x19c6 +regSPI_SHADER_USER_DATA_PS_26_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_27 = 0x19c7 +regSPI_SHADER_USER_DATA_PS_27_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_28 = 0x19c8 +regSPI_SHADER_USER_DATA_PS_28_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_29 = 0x19c9 +regSPI_SHADER_USER_DATA_PS_29_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_30 = 0x19ca +regSPI_SHADER_USER_DATA_PS_30_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_PS_31 = 0x19cb +regSPI_SHADER_USER_DATA_PS_31_BASE_IDX = 0 +regSPI_SHADER_REQ_CTRL_PS = 0x19d0 +regSPI_SHADER_REQ_CTRL_PS_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_PS_0 = 0x19d2 +regSPI_SHADER_USER_ACCUM_PS_0_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_PS_1 = 0x19d3 +regSPI_SHADER_USER_ACCUM_PS_1_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_PS_2 = 0x19d4 +regSPI_SHADER_USER_ACCUM_PS_2_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_PS_3 = 0x19d5 +regSPI_SHADER_USER_ACCUM_PS_3_BASE_IDX = 0 +regSPI_SHADER_PGM_CHKSUM_GS = 0x1a20 +regSPI_SHADER_PGM_CHKSUM_GS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC4_GS = 0x1a21 +regSPI_SHADER_PGM_RSRC4_GS_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_ADDR_LO_GS = 0x1a22 +regSPI_SHADER_USER_DATA_ADDR_LO_GS_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_ADDR_HI_GS = 0x1a23 +regSPI_SHADER_USER_DATA_ADDR_HI_GS_BASE_IDX = 0 +regSPI_SHADER_PGM_LO_ES_GS = 0x1a24 +regSPI_SHADER_PGM_LO_ES_GS_BASE_IDX = 0 +regSPI_SHADER_PGM_HI_ES_GS = 0x1a25 +regSPI_SHADER_PGM_HI_ES_GS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC3_GS = 0x1a27 +regSPI_SHADER_PGM_RSRC3_GS_BASE_IDX = 0 +regSPI_SHADER_PGM_LO_GS = 0x1a28 +regSPI_SHADER_PGM_LO_GS_BASE_IDX = 0 +regSPI_SHADER_PGM_HI_GS = 0x1a29 +regSPI_SHADER_PGM_HI_GS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC1_GS = 0x1a2a +regSPI_SHADER_PGM_RSRC1_GS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC2_GS = 0x1a2b +regSPI_SHADER_PGM_RSRC2_GS_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_0 = 0x1a2c +regSPI_SHADER_USER_DATA_GS_0_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_1 = 0x1a2d +regSPI_SHADER_USER_DATA_GS_1_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_2 = 0x1a2e +regSPI_SHADER_USER_DATA_GS_2_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_3 = 0x1a2f +regSPI_SHADER_USER_DATA_GS_3_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_4 = 0x1a30 +regSPI_SHADER_USER_DATA_GS_4_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_5 = 0x1a31 +regSPI_SHADER_USER_DATA_GS_5_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_6 = 0x1a32 +regSPI_SHADER_USER_DATA_GS_6_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_7 = 0x1a33 +regSPI_SHADER_USER_DATA_GS_7_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_8 = 0x1a34 +regSPI_SHADER_USER_DATA_GS_8_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_9 = 0x1a35 +regSPI_SHADER_USER_DATA_GS_9_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_10 = 0x1a36 +regSPI_SHADER_USER_DATA_GS_10_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_11 = 0x1a37 +regSPI_SHADER_USER_DATA_GS_11_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_12 = 0x1a38 +regSPI_SHADER_USER_DATA_GS_12_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_13 = 0x1a39 +regSPI_SHADER_USER_DATA_GS_13_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_14 = 0x1a3a +regSPI_SHADER_USER_DATA_GS_14_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_15 = 0x1a3b +regSPI_SHADER_USER_DATA_GS_15_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_16 = 0x1a3c +regSPI_SHADER_USER_DATA_GS_16_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_17 = 0x1a3d +regSPI_SHADER_USER_DATA_GS_17_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_18 = 0x1a3e +regSPI_SHADER_USER_DATA_GS_18_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_19 = 0x1a3f +regSPI_SHADER_USER_DATA_GS_19_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_20 = 0x1a40 +regSPI_SHADER_USER_DATA_GS_20_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_21 = 0x1a41 +regSPI_SHADER_USER_DATA_GS_21_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_22 = 0x1a42 +regSPI_SHADER_USER_DATA_GS_22_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_23 = 0x1a43 +regSPI_SHADER_USER_DATA_GS_23_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_24 = 0x1a44 +regSPI_SHADER_USER_DATA_GS_24_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_25 = 0x1a45 +regSPI_SHADER_USER_DATA_GS_25_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_26 = 0x1a46 +regSPI_SHADER_USER_DATA_GS_26_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_27 = 0x1a47 +regSPI_SHADER_USER_DATA_GS_27_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_28 = 0x1a48 +regSPI_SHADER_USER_DATA_GS_28_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_29 = 0x1a49 +regSPI_SHADER_USER_DATA_GS_29_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_30 = 0x1a4a +regSPI_SHADER_USER_DATA_GS_30_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_GS_31 = 0x1a4b +regSPI_SHADER_USER_DATA_GS_31_BASE_IDX = 0 +regSPI_SHADER_GS_MESHLET_DIM = 0x1a4c +regSPI_SHADER_GS_MESHLET_DIM_BASE_IDX = 0 +regSPI_SHADER_GS_MESHLET_EXP_ALLOC = 0x1a4d +regSPI_SHADER_GS_MESHLET_EXP_ALLOC_BASE_IDX = 0 +regSPI_SHADER_REQ_CTRL_ESGS = 0x1a50 +regSPI_SHADER_REQ_CTRL_ESGS_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_ESGS_0 = 0x1a52 +regSPI_SHADER_USER_ACCUM_ESGS_0_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_ESGS_1 = 0x1a53 +regSPI_SHADER_USER_ACCUM_ESGS_1_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_ESGS_2 = 0x1a54 +regSPI_SHADER_USER_ACCUM_ESGS_2_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_ESGS_3 = 0x1a55 +regSPI_SHADER_USER_ACCUM_ESGS_3_BASE_IDX = 0 +regSPI_SHADER_PGM_LO_ES = 0x1a68 +regSPI_SHADER_PGM_LO_ES_BASE_IDX = 0 +regSPI_SHADER_PGM_HI_ES = 0x1a69 +regSPI_SHADER_PGM_HI_ES_BASE_IDX = 0 +regSPI_SHADER_PGM_CHKSUM_HS = 0x1aa0 +regSPI_SHADER_PGM_CHKSUM_HS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC4_HS = 0x1aa1 +regSPI_SHADER_PGM_RSRC4_HS_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_ADDR_LO_HS = 0x1aa2 +regSPI_SHADER_USER_DATA_ADDR_LO_HS_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_ADDR_HI_HS = 0x1aa3 +regSPI_SHADER_USER_DATA_ADDR_HI_HS_BASE_IDX = 0 +regSPI_SHADER_PGM_LO_LS_HS = 0x1aa4 +regSPI_SHADER_PGM_LO_LS_HS_BASE_IDX = 0 +regSPI_SHADER_PGM_HI_LS_HS = 0x1aa5 +regSPI_SHADER_PGM_HI_LS_HS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC3_HS = 0x1aa7 +regSPI_SHADER_PGM_RSRC3_HS_BASE_IDX = 0 +regSPI_SHADER_PGM_LO_HS = 0x1aa8 +regSPI_SHADER_PGM_LO_HS_BASE_IDX = 0 +regSPI_SHADER_PGM_HI_HS = 0x1aa9 +regSPI_SHADER_PGM_HI_HS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC1_HS = 0x1aaa +regSPI_SHADER_PGM_RSRC1_HS_BASE_IDX = 0 +regSPI_SHADER_PGM_RSRC2_HS = 0x1aab +regSPI_SHADER_PGM_RSRC2_HS_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_0 = 0x1aac +regSPI_SHADER_USER_DATA_HS_0_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_1 = 0x1aad +regSPI_SHADER_USER_DATA_HS_1_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_2 = 0x1aae +regSPI_SHADER_USER_DATA_HS_2_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_3 = 0x1aaf +regSPI_SHADER_USER_DATA_HS_3_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_4 = 0x1ab0 +regSPI_SHADER_USER_DATA_HS_4_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_5 = 0x1ab1 +regSPI_SHADER_USER_DATA_HS_5_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_6 = 0x1ab2 +regSPI_SHADER_USER_DATA_HS_6_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_7 = 0x1ab3 +regSPI_SHADER_USER_DATA_HS_7_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_8 = 0x1ab4 +regSPI_SHADER_USER_DATA_HS_8_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_9 = 0x1ab5 +regSPI_SHADER_USER_DATA_HS_9_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_10 = 0x1ab6 +regSPI_SHADER_USER_DATA_HS_10_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_11 = 0x1ab7 +regSPI_SHADER_USER_DATA_HS_11_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_12 = 0x1ab8 +regSPI_SHADER_USER_DATA_HS_12_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_13 = 0x1ab9 +regSPI_SHADER_USER_DATA_HS_13_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_14 = 0x1aba +regSPI_SHADER_USER_DATA_HS_14_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_15 = 0x1abb +regSPI_SHADER_USER_DATA_HS_15_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_16 = 0x1abc +regSPI_SHADER_USER_DATA_HS_16_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_17 = 0x1abd +regSPI_SHADER_USER_DATA_HS_17_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_18 = 0x1abe +regSPI_SHADER_USER_DATA_HS_18_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_19 = 0x1abf +regSPI_SHADER_USER_DATA_HS_19_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_20 = 0x1ac0 +regSPI_SHADER_USER_DATA_HS_20_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_21 = 0x1ac1 +regSPI_SHADER_USER_DATA_HS_21_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_22 = 0x1ac2 +regSPI_SHADER_USER_DATA_HS_22_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_23 = 0x1ac3 +regSPI_SHADER_USER_DATA_HS_23_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_24 = 0x1ac4 +regSPI_SHADER_USER_DATA_HS_24_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_25 = 0x1ac5 +regSPI_SHADER_USER_DATA_HS_25_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_26 = 0x1ac6 +regSPI_SHADER_USER_DATA_HS_26_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_27 = 0x1ac7 +regSPI_SHADER_USER_DATA_HS_27_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_28 = 0x1ac8 +regSPI_SHADER_USER_DATA_HS_28_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_29 = 0x1ac9 +regSPI_SHADER_USER_DATA_HS_29_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_30 = 0x1aca +regSPI_SHADER_USER_DATA_HS_30_BASE_IDX = 0 +regSPI_SHADER_USER_DATA_HS_31 = 0x1acb +regSPI_SHADER_USER_DATA_HS_31_BASE_IDX = 0 +regSPI_SHADER_REQ_CTRL_LSHS = 0x1ad0 +regSPI_SHADER_REQ_CTRL_LSHS_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_LSHS_0 = 0x1ad2 +regSPI_SHADER_USER_ACCUM_LSHS_0_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_LSHS_1 = 0x1ad3 +regSPI_SHADER_USER_ACCUM_LSHS_1_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_LSHS_2 = 0x1ad4 +regSPI_SHADER_USER_ACCUM_LSHS_2_BASE_IDX = 0 +regSPI_SHADER_USER_ACCUM_LSHS_3 = 0x1ad5 +regSPI_SHADER_USER_ACCUM_LSHS_3_BASE_IDX = 0 +regSPI_SHADER_PGM_LO_LS = 0x1ae8 +regSPI_SHADER_PGM_LO_LS_BASE_IDX = 0 +regSPI_SHADER_PGM_HI_LS = 0x1ae9 +regSPI_SHADER_PGM_HI_LS_BASE_IDX = 0 +regCOMPUTE_DISPATCH_INITIATOR = 0x1ba0 +regCOMPUTE_DISPATCH_INITIATOR_BASE_IDX = 0 +regCOMPUTE_DIM_X = 0x1ba1 +regCOMPUTE_DIM_X_BASE_IDX = 0 +regCOMPUTE_DIM_Y = 0x1ba2 +regCOMPUTE_DIM_Y_BASE_IDX = 0 +regCOMPUTE_DIM_Z = 0x1ba3 +regCOMPUTE_DIM_Z_BASE_IDX = 0 +regCOMPUTE_START_X = 0x1ba4 +regCOMPUTE_START_X_BASE_IDX = 0 +regCOMPUTE_START_Y = 0x1ba5 +regCOMPUTE_START_Y_BASE_IDX = 0 +regCOMPUTE_START_Z = 0x1ba6 +regCOMPUTE_START_Z_BASE_IDX = 0 +regCOMPUTE_NUM_THREAD_X = 0x1ba7 +regCOMPUTE_NUM_THREAD_X_BASE_IDX = 0 +regCOMPUTE_NUM_THREAD_Y = 0x1ba8 +regCOMPUTE_NUM_THREAD_Y_BASE_IDX = 0 +regCOMPUTE_NUM_THREAD_Z = 0x1ba9 +regCOMPUTE_NUM_THREAD_Z_BASE_IDX = 0 +regCOMPUTE_PIPELINESTAT_ENABLE = 0x1baa +regCOMPUTE_PIPELINESTAT_ENABLE_BASE_IDX = 0 +regCOMPUTE_PERFCOUNT_ENABLE = 0x1bab +regCOMPUTE_PERFCOUNT_ENABLE_BASE_IDX = 0 +regCOMPUTE_PGM_LO = 0x1bac +regCOMPUTE_PGM_LO_BASE_IDX = 0 +regCOMPUTE_PGM_HI = 0x1bad +regCOMPUTE_PGM_HI_BASE_IDX = 0 +regCOMPUTE_DISPATCH_PKT_ADDR_LO = 0x1bae +regCOMPUTE_DISPATCH_PKT_ADDR_LO_BASE_IDX = 0 +regCOMPUTE_DISPATCH_PKT_ADDR_HI = 0x1baf +regCOMPUTE_DISPATCH_PKT_ADDR_HI_BASE_IDX = 0 +regCOMPUTE_DISPATCH_SCRATCH_BASE_LO = 0x1bb0 +regCOMPUTE_DISPATCH_SCRATCH_BASE_LO_BASE_IDX = 0 +regCOMPUTE_DISPATCH_SCRATCH_BASE_HI = 0x1bb1 +regCOMPUTE_DISPATCH_SCRATCH_BASE_HI_BASE_IDX = 0 +regCOMPUTE_PGM_RSRC1 = 0x1bb2 +regCOMPUTE_PGM_RSRC1_BASE_IDX = 0 +regCOMPUTE_PGM_RSRC2 = 0x1bb3 +regCOMPUTE_PGM_RSRC2_BASE_IDX = 0 +regCOMPUTE_VMID = 0x1bb4 +regCOMPUTE_VMID_BASE_IDX = 0 +regCOMPUTE_RESOURCE_LIMITS = 0x1bb5 +regCOMPUTE_RESOURCE_LIMITS_BASE_IDX = 0 +regCOMPUTE_DESTINATION_EN_SE0 = 0x1bb6 +regCOMPUTE_DESTINATION_EN_SE0_BASE_IDX = 0 +regCOMPUTE_STATIC_THREAD_MGMT_SE0 = 0x1bb6 +regCOMPUTE_STATIC_THREAD_MGMT_SE0_BASE_IDX = 0 +regCOMPUTE_DESTINATION_EN_SE1 = 0x1bb7 +regCOMPUTE_DESTINATION_EN_SE1_BASE_IDX = 0 +regCOMPUTE_STATIC_THREAD_MGMT_SE1 = 0x1bb7 +regCOMPUTE_STATIC_THREAD_MGMT_SE1_BASE_IDX = 0 +regCOMPUTE_TMPRING_SIZE = 0x1bb8 +regCOMPUTE_TMPRING_SIZE_BASE_IDX = 0 +regCOMPUTE_DESTINATION_EN_SE2 = 0x1bb9 +regCOMPUTE_DESTINATION_EN_SE2_BASE_IDX = 0 +regCOMPUTE_STATIC_THREAD_MGMT_SE2 = 0x1bb9 +regCOMPUTE_STATIC_THREAD_MGMT_SE2_BASE_IDX = 0 +regCOMPUTE_DESTINATION_EN_SE3 = 0x1bba +regCOMPUTE_DESTINATION_EN_SE3_BASE_IDX = 0 +regCOMPUTE_STATIC_THREAD_MGMT_SE3 = 0x1bba +regCOMPUTE_STATIC_THREAD_MGMT_SE3_BASE_IDX = 0 +regCOMPUTE_RESTART_X = 0x1bbb +regCOMPUTE_RESTART_X_BASE_IDX = 0 +regCOMPUTE_RESTART_Y = 0x1bbc +regCOMPUTE_RESTART_Y_BASE_IDX = 0 +regCOMPUTE_RESTART_Z = 0x1bbd +regCOMPUTE_RESTART_Z_BASE_IDX = 0 +regCOMPUTE_THREAD_TRACE_ENABLE = 0x1bbe +regCOMPUTE_THREAD_TRACE_ENABLE_BASE_IDX = 0 +regCOMPUTE_MISC_RESERVED = 0x1bbf +regCOMPUTE_MISC_RESERVED_BASE_IDX = 0 +regCOMPUTE_DISPATCH_ID = 0x1bc0 +regCOMPUTE_DISPATCH_ID_BASE_IDX = 0 +regCOMPUTE_THREADGROUP_ID = 0x1bc1 +regCOMPUTE_THREADGROUP_ID_BASE_IDX = 0 +regCOMPUTE_REQ_CTRL = 0x1bc2 +regCOMPUTE_REQ_CTRL_BASE_IDX = 0 +regCOMPUTE_USER_ACCUM_0 = 0x1bc4 +regCOMPUTE_USER_ACCUM_0_BASE_IDX = 0 +regCOMPUTE_USER_ACCUM_1 = 0x1bc5 +regCOMPUTE_USER_ACCUM_1_BASE_IDX = 0 +regCOMPUTE_USER_ACCUM_2 = 0x1bc6 +regCOMPUTE_USER_ACCUM_2_BASE_IDX = 0 +regCOMPUTE_USER_ACCUM_3 = 0x1bc7 +regCOMPUTE_USER_ACCUM_3_BASE_IDX = 0 +regCOMPUTE_PGM_RSRC3 = 0x1bc8 +regCOMPUTE_PGM_RSRC3_BASE_IDX = 0 +regCOMPUTE_DDID_INDEX = 0x1bc9 +regCOMPUTE_DDID_INDEX_BASE_IDX = 0 +regCOMPUTE_SHADER_CHKSUM = 0x1bca +regCOMPUTE_SHADER_CHKSUM_BASE_IDX = 0 +regCOMPUTE_STATIC_THREAD_MGMT_SE4 = 0x1bcb +regCOMPUTE_STATIC_THREAD_MGMT_SE4_BASE_IDX = 0 +regCOMPUTE_STATIC_THREAD_MGMT_SE5 = 0x1bcc +regCOMPUTE_STATIC_THREAD_MGMT_SE5_BASE_IDX = 0 +regCOMPUTE_STATIC_THREAD_MGMT_SE6 = 0x1bcd +regCOMPUTE_STATIC_THREAD_MGMT_SE6_BASE_IDX = 0 +regCOMPUTE_STATIC_THREAD_MGMT_SE7 = 0x1bce +regCOMPUTE_STATIC_THREAD_MGMT_SE7_BASE_IDX = 0 +regCOMPUTE_DISPATCH_INTERLEAVE = 0x1bcf +regCOMPUTE_DISPATCH_INTERLEAVE_BASE_IDX = 0 +regCOMPUTE_RELAUNCH = 0x1bd0 +regCOMPUTE_RELAUNCH_BASE_IDX = 0 +regCOMPUTE_WAVE_RESTORE_ADDR_LO = 0x1bd1 +regCOMPUTE_WAVE_RESTORE_ADDR_LO_BASE_IDX = 0 +regCOMPUTE_WAVE_RESTORE_ADDR_HI = 0x1bd2 +regCOMPUTE_WAVE_RESTORE_ADDR_HI_BASE_IDX = 0 +regCOMPUTE_RELAUNCH2 = 0x1bd3 +regCOMPUTE_RELAUNCH2_BASE_IDX = 0 +regCOMPUTE_USER_DATA_0 = 0x1be0 +regCOMPUTE_USER_DATA_0_BASE_IDX = 0 +regCOMPUTE_USER_DATA_1 = 0x1be1 +regCOMPUTE_USER_DATA_1_BASE_IDX = 0 +regCOMPUTE_USER_DATA_2 = 0x1be2 +regCOMPUTE_USER_DATA_2_BASE_IDX = 0 +regCOMPUTE_USER_DATA_3 = 0x1be3 +regCOMPUTE_USER_DATA_3_BASE_IDX = 0 +regCOMPUTE_USER_DATA_4 = 0x1be4 +regCOMPUTE_USER_DATA_4_BASE_IDX = 0 +regCOMPUTE_USER_DATA_5 = 0x1be5 +regCOMPUTE_USER_DATA_5_BASE_IDX = 0 +regCOMPUTE_USER_DATA_6 = 0x1be6 +regCOMPUTE_USER_DATA_6_BASE_IDX = 0 +regCOMPUTE_USER_DATA_7 = 0x1be7 +regCOMPUTE_USER_DATA_7_BASE_IDX = 0 +regCOMPUTE_USER_DATA_8 = 0x1be8 +regCOMPUTE_USER_DATA_8_BASE_IDX = 0 +regCOMPUTE_USER_DATA_9 = 0x1be9 +regCOMPUTE_USER_DATA_9_BASE_IDX = 0 +regCOMPUTE_USER_DATA_10 = 0x1bea +regCOMPUTE_USER_DATA_10_BASE_IDX = 0 +regCOMPUTE_USER_DATA_11 = 0x1beb +regCOMPUTE_USER_DATA_11_BASE_IDX = 0 +regCOMPUTE_USER_DATA_12 = 0x1bec +regCOMPUTE_USER_DATA_12_BASE_IDX = 0 +regCOMPUTE_USER_DATA_13 = 0x1bed +regCOMPUTE_USER_DATA_13_BASE_IDX = 0 +regCOMPUTE_USER_DATA_14 = 0x1bee +regCOMPUTE_USER_DATA_14_BASE_IDX = 0 +regCOMPUTE_USER_DATA_15 = 0x1bef +regCOMPUTE_USER_DATA_15_BASE_IDX = 0 +regCOMPUTE_DISPATCH_TUNNEL = 0x1c1d +regCOMPUTE_DISPATCH_TUNNEL_BASE_IDX = 0 +regCOMPUTE_DISPATCH_END = 0x1c1e +regCOMPUTE_DISPATCH_END_BASE_IDX = 0 +regCOMPUTE_NOWHERE = 0x1c1f +regCOMPUTE_NOWHERE_BASE_IDX = 0 +regSH_RESERVED_REG0 = 0x1c20 +regSH_RESERVED_REG0_BASE_IDX = 0 +regSH_RESERVED_REG1 = 0x1c21 +regSH_RESERVED_REG1_BASE_IDX = 0 +regCP_CU_MASK_ADDR_LO = 0x1dd2 +regCP_CU_MASK_ADDR_LO_BASE_IDX = 0 +regCP_CU_MASK_ADDR_HI = 0x1dd3 +regCP_CU_MASK_ADDR_HI_BASE_IDX = 0 +regCP_CU_MASK_CNTL = 0x1dd4 +regCP_CU_MASK_CNTL_BASE_IDX = 0 +regCP_EOPQ_WAIT_TIME = 0x1dd5 +regCP_EOPQ_WAIT_TIME_BASE_IDX = 0 +regCP_CPC_MGCG_SYNC_CNTL = 0x1dd6 +regCP_CPC_MGCG_SYNC_CNTL_BASE_IDX = 0 +regCPC_INT_INFO = 0x1dd7 +regCPC_INT_INFO_BASE_IDX = 0 +regCP_VIRT_STATUS = 0x1dd8 +regCP_VIRT_STATUS_BASE_IDX = 0 +regCPC_INT_ADDR = 0x1dd9 +regCPC_INT_ADDR_BASE_IDX = 0 +regCPC_INT_PASID = 0x1dda +regCPC_INT_PASID_BASE_IDX = 0 +regCP_GFX_ERROR = 0x1ddb +regCP_GFX_ERROR_BASE_IDX = 0 +regCPG_UTCL1_CNTL = 0x1ddc +regCPG_UTCL1_CNTL_BASE_IDX = 0 +regCPC_UTCL1_CNTL = 0x1ddd +regCPC_UTCL1_CNTL_BASE_IDX = 0 +regCPF_UTCL1_CNTL = 0x1dde +regCPF_UTCL1_CNTL_BASE_IDX = 0 +regCP_AQL_SMM_STATUS = 0x1ddf +regCP_AQL_SMM_STATUS_BASE_IDX = 0 +regCP_RB0_BASE = 0x1de0 +regCP_RB0_BASE_BASE_IDX = 0 +regCP_RB_BASE = 0x1de0 +regCP_RB_BASE_BASE_IDX = 0 +regCP_RB0_CNTL = 0x1de1 +regCP_RB0_CNTL_BASE_IDX = 0 +regCP_RB_CNTL = 0x1de1 +regCP_RB_CNTL_BASE_IDX = 0 +regCP_RB_RPTR_WR = 0x1de2 +regCP_RB_RPTR_WR_BASE_IDX = 0 +regCP_RB0_RPTR_ADDR = 0x1de3 +regCP_RB0_RPTR_ADDR_BASE_IDX = 0 +regCP_RB_RPTR_ADDR = 0x1de3 +regCP_RB_RPTR_ADDR_BASE_IDX = 0 +regCP_RB0_RPTR_ADDR_HI = 0x1de4 +regCP_RB0_RPTR_ADDR_HI_BASE_IDX = 0 +regCP_RB_RPTR_ADDR_HI = 0x1de4 +regCP_RB_RPTR_ADDR_HI_BASE_IDX = 0 +regCP_RB0_BUFSZ_MASK = 0x1de5 +regCP_RB0_BUFSZ_MASK_BASE_IDX = 0 +regCP_RB_BUFSZ_MASK = 0x1de5 +regCP_RB_BUFSZ_MASK_BASE_IDX = 0 +regCP_INT_CNTL = 0x1de9 +regCP_INT_CNTL_BASE_IDX = 0 +regCP_INT_STATUS = 0x1dea +regCP_INT_STATUS_BASE_IDX = 0 +regCP_DEVICE_ID = 0x1deb +regCP_DEVICE_ID_BASE_IDX = 0 +regCP_ME0_PIPE_PRIORITY_CNTS = 0x1dec +regCP_ME0_PIPE_PRIORITY_CNTS_BASE_IDX = 0 +regCP_RING_PRIORITY_CNTS = 0x1dec +regCP_RING_PRIORITY_CNTS_BASE_IDX = 0 +regCP_ME0_PIPE0_PRIORITY = 0x1ded +regCP_ME0_PIPE0_PRIORITY_BASE_IDX = 0 +regCP_RING0_PRIORITY = 0x1ded +regCP_RING0_PRIORITY_BASE_IDX = 0 +regCP_ME0_PIPE1_PRIORITY = 0x1dee +regCP_ME0_PIPE1_PRIORITY_BASE_IDX = 0 +regCP_RING1_PRIORITY = 0x1dee +regCP_RING1_PRIORITY_BASE_IDX = 0 +regCP_FATAL_ERROR = 0x1df0 +regCP_FATAL_ERROR_BASE_IDX = 0 +regCP_RB_VMID = 0x1df1 +regCP_RB_VMID_BASE_IDX = 0 +regCP_ME0_PIPE0_VMID = 0x1df2 +regCP_ME0_PIPE0_VMID_BASE_IDX = 0 +regCP_ME0_PIPE1_VMID = 0x1df3 +regCP_ME0_PIPE1_VMID_BASE_IDX = 0 +regCP_RB0_WPTR = 0x1df4 +regCP_RB0_WPTR_BASE_IDX = 0 +regCP_RB_WPTR = 0x1df4 +regCP_RB_WPTR_BASE_IDX = 0 +regCP_RB0_WPTR_HI = 0x1df5 +regCP_RB0_WPTR_HI_BASE_IDX = 0 +regCP_RB_WPTR_HI = 0x1df5 +regCP_RB_WPTR_HI_BASE_IDX = 0 +regCP_RB1_WPTR = 0x1df6 +regCP_RB1_WPTR_BASE_IDX = 0 +regCP_RB1_WPTR_HI = 0x1df7 +regCP_RB1_WPTR_HI_BASE_IDX = 0 +regCP_PROCESS_QUANTUM = 0x1df9 +regCP_PROCESS_QUANTUM_BASE_IDX = 0 +regCP_RB_DOORBELL_RANGE_LOWER = 0x1dfa +regCP_RB_DOORBELL_RANGE_LOWER_BASE_IDX = 0 +regCP_RB_DOORBELL_RANGE_UPPER = 0x1dfb +regCP_RB_DOORBELL_RANGE_UPPER_BASE_IDX = 0 +regCP_MEC_DOORBELL_RANGE_LOWER = 0x1dfc +regCP_MEC_DOORBELL_RANGE_LOWER_BASE_IDX = 0 +regCP_MEC_DOORBELL_RANGE_UPPER = 0x1dfd +regCP_MEC_DOORBELL_RANGE_UPPER_BASE_IDX = 0 +regCPG_UTCL1_ERROR = 0x1dfe +regCPG_UTCL1_ERROR_BASE_IDX = 0 +regCPC_UTCL1_ERROR = 0x1dff +regCPC_UTCL1_ERROR_BASE_IDX = 0 +regCP_RB1_BASE = 0x1e00 +regCP_RB1_BASE_BASE_IDX = 0 +regCP_RB1_CNTL = 0x1e01 +regCP_RB1_CNTL_BASE_IDX = 0 +regCP_RB1_RPTR_ADDR = 0x1e02 +regCP_RB1_RPTR_ADDR_BASE_IDX = 0 +regCP_RB1_RPTR_ADDR_HI = 0x1e03 +regCP_RB1_RPTR_ADDR_HI_BASE_IDX = 0 +regCP_RB1_BUFSZ_MASK = 0x1e04 +regCP_RB1_BUFSZ_MASK_BASE_IDX = 0 +regCP_INT_CNTL_RING0 = 0x1e0a +regCP_INT_CNTL_RING0_BASE_IDX = 0 +regCP_INT_CNTL_RING1 = 0x1e0b +regCP_INT_CNTL_RING1_BASE_IDX = 0 +regCP_INT_STATUS_RING0 = 0x1e0d +regCP_INT_STATUS_RING0_BASE_IDX = 0 +regCP_INT_STATUS_RING1 = 0x1e0e +regCP_INT_STATUS_RING1_BASE_IDX = 0 +regCP_ME_F32_INTERRUPT = 0x1e13 +regCP_ME_F32_INTERRUPT_BASE_IDX = 0 +regCP_PFP_F32_INTERRUPT = 0x1e14 +regCP_PFP_F32_INTERRUPT_BASE_IDX = 0 +regCP_MEC1_F32_INTERRUPT = 0x1e16 +regCP_MEC1_F32_INTERRUPT_BASE_IDX = 0 +regCP_MEC2_F32_INTERRUPT = 0x1e17 +regCP_MEC2_F32_INTERRUPT_BASE_IDX = 0 +regCP_PWR_CNTL = 0x1e18 +regCP_PWR_CNTL_BASE_IDX = 0 +regCP_ECC_FIRSTOCCURRENCE = 0x1e1a +regCP_ECC_FIRSTOCCURRENCE_BASE_IDX = 0 +regCP_ECC_FIRSTOCCURRENCE_RING0 = 0x1e1b +regCP_ECC_FIRSTOCCURRENCE_RING0_BASE_IDX = 0 +regCP_ECC_FIRSTOCCURRENCE_RING1 = 0x1e1c +regCP_ECC_FIRSTOCCURRENCE_RING1_BASE_IDX = 0 +regGB_EDC_MODE = 0x1e1e +regGB_EDC_MODE_BASE_IDX = 0 +regCP_DEBUG = 0x1e1f +regCP_DEBUG_BASE_IDX = 0 +regCP_CPC_DEBUG = 0x1e21 +regCP_CPC_DEBUG_BASE_IDX = 0 +regCP_PQ_WPTR_POLL_CNTL = 0x1e23 +regCP_PQ_WPTR_POLL_CNTL_BASE_IDX = 0 +regCP_PQ_WPTR_POLL_CNTL1 = 0x1e24 +regCP_PQ_WPTR_POLL_CNTL1_BASE_IDX = 0 +regCP_ME1_PIPE0_INT_CNTL = 0x1e25 +regCP_ME1_PIPE0_INT_CNTL_BASE_IDX = 0 +regCP_ME1_PIPE1_INT_CNTL = 0x1e26 +regCP_ME1_PIPE1_INT_CNTL_BASE_IDX = 0 +regCP_ME1_PIPE2_INT_CNTL = 0x1e27 +regCP_ME1_PIPE2_INT_CNTL_BASE_IDX = 0 +regCP_ME1_PIPE3_INT_CNTL = 0x1e28 +regCP_ME1_PIPE3_INT_CNTL_BASE_IDX = 0 +regCP_ME2_PIPE0_INT_CNTL = 0x1e29 +regCP_ME2_PIPE0_INT_CNTL_BASE_IDX = 0 +regCP_ME2_PIPE1_INT_CNTL = 0x1e2a +regCP_ME2_PIPE1_INT_CNTL_BASE_IDX = 0 +regCP_ME2_PIPE2_INT_CNTL = 0x1e2b +regCP_ME2_PIPE2_INT_CNTL_BASE_IDX = 0 +regCP_ME2_PIPE3_INT_CNTL = 0x1e2c +regCP_ME2_PIPE3_INT_CNTL_BASE_IDX = 0 +regCP_ME1_PIPE0_INT_STATUS = 0x1e2d +regCP_ME1_PIPE0_INT_STATUS_BASE_IDX = 0 +regCP_ME1_PIPE1_INT_STATUS = 0x1e2e +regCP_ME1_PIPE1_INT_STATUS_BASE_IDX = 0 +regCP_ME1_PIPE2_INT_STATUS = 0x1e2f +regCP_ME1_PIPE2_INT_STATUS_BASE_IDX = 0 +regCP_ME1_PIPE3_INT_STATUS = 0x1e30 +regCP_ME1_PIPE3_INT_STATUS_BASE_IDX = 0 +regCP_ME2_PIPE0_INT_STATUS = 0x1e31 +regCP_ME2_PIPE0_INT_STATUS_BASE_IDX = 0 +regCP_ME2_PIPE1_INT_STATUS = 0x1e32 +regCP_ME2_PIPE1_INT_STATUS_BASE_IDX = 0 +regCP_ME2_PIPE2_INT_STATUS = 0x1e33 +regCP_ME2_PIPE2_INT_STATUS_BASE_IDX = 0 +regCP_ME2_PIPE3_INT_STATUS = 0x1e34 +regCP_ME2_PIPE3_INT_STATUS_BASE_IDX = 0 +regCP_GFX_QUEUE_INDEX = 0x1e37 +regCP_GFX_QUEUE_INDEX_BASE_IDX = 0 +regCC_GC_EDC_CONFIG = 0x1e38 +regCC_GC_EDC_CONFIG_BASE_IDX = 0 +regCP_ME1_PIPE_PRIORITY_CNTS = 0x1e39 +regCP_ME1_PIPE_PRIORITY_CNTS_BASE_IDX = 0 +regCP_ME1_PIPE0_PRIORITY = 0x1e3a +regCP_ME1_PIPE0_PRIORITY_BASE_IDX = 0 +regCP_ME1_PIPE1_PRIORITY = 0x1e3b +regCP_ME1_PIPE1_PRIORITY_BASE_IDX = 0 +regCP_ME1_PIPE2_PRIORITY = 0x1e3c +regCP_ME1_PIPE2_PRIORITY_BASE_IDX = 0 +regCP_ME1_PIPE3_PRIORITY = 0x1e3d +regCP_ME1_PIPE3_PRIORITY_BASE_IDX = 0 +regCP_ME2_PIPE_PRIORITY_CNTS = 0x1e3e +regCP_ME2_PIPE_PRIORITY_CNTS_BASE_IDX = 0 +regCP_ME2_PIPE0_PRIORITY = 0x1e3f +regCP_ME2_PIPE0_PRIORITY_BASE_IDX = 0 +regCP_ME2_PIPE1_PRIORITY = 0x1e40 +regCP_ME2_PIPE1_PRIORITY_BASE_IDX = 0 +regCP_ME2_PIPE2_PRIORITY = 0x1e41 +regCP_ME2_PIPE2_PRIORITY_BASE_IDX = 0 +regCP_ME2_PIPE3_PRIORITY = 0x1e42 +regCP_ME2_PIPE3_PRIORITY_BASE_IDX = 0 +regCP_PFP_PRGRM_CNTR_START = 0x1e44 +regCP_PFP_PRGRM_CNTR_START_BASE_IDX = 0 +regCP_ME_PRGRM_CNTR_START = 0x1e45 +regCP_ME_PRGRM_CNTR_START_BASE_IDX = 0 +regCP_MEC1_PRGRM_CNTR_START = 0x1e46 +regCP_MEC1_PRGRM_CNTR_START_BASE_IDX = 0 +regCP_MEC2_PRGRM_CNTR_START = 0x1e47 +regCP_MEC2_PRGRM_CNTR_START_BASE_IDX = 0 +regCP_PFP_INTR_ROUTINE_START = 0x1e49 +regCP_PFP_INTR_ROUTINE_START_BASE_IDX = 0 +regCP_ME_INTR_ROUTINE_START = 0x1e4a +regCP_ME_INTR_ROUTINE_START_BASE_IDX = 0 +regCP_MEC1_INTR_ROUTINE_START = 0x1e4b +regCP_MEC1_INTR_ROUTINE_START_BASE_IDX = 0 +regCP_MEC2_INTR_ROUTINE_START = 0x1e4c +regCP_MEC2_INTR_ROUTINE_START_BASE_IDX = 0 +regCP_CONTEXT_CNTL = 0x1e4d +regCP_CONTEXT_CNTL_BASE_IDX = 0 +regCP_MAX_CONTEXT = 0x1e4e +regCP_MAX_CONTEXT_BASE_IDX = 0 +regCP_IQ_WAIT_TIME1 = 0x1e4f +regCP_IQ_WAIT_TIME1_BASE_IDX = 0 +regCP_IQ_WAIT_TIME2 = 0x1e50 +regCP_IQ_WAIT_TIME2_BASE_IDX = 0 +regCP_RB0_BASE_HI = 0x1e51 +regCP_RB0_BASE_HI_BASE_IDX = 0 +regCP_RB1_BASE_HI = 0x1e52 +regCP_RB1_BASE_HI_BASE_IDX = 0 +regCP_VMID_RESET = 0x1e53 +regCP_VMID_RESET_BASE_IDX = 0 +regCPC_INT_CNTL = 0x1e54 +regCPC_INT_CNTL_BASE_IDX = 0 +regCPC_INT_STATUS = 0x1e55 +regCPC_INT_STATUS_BASE_IDX = 0 +regCP_VMID_PREEMPT = 0x1e56 +regCP_VMID_PREEMPT_BASE_IDX = 0 +regCPC_INT_CNTX_ID = 0x1e57 +regCPC_INT_CNTX_ID_BASE_IDX = 0 +regCP_PQ_STATUS = 0x1e58 +regCP_PQ_STATUS_BASE_IDX = 0 +regCP_PFP_PRGRM_CNTR_START_HI = 0x1e59 +regCP_PFP_PRGRM_CNTR_START_HI_BASE_IDX = 0 +regCP_MAX_DRAW_COUNT = 0x1e5c +regCP_MAX_DRAW_COUNT_BASE_IDX = 0 +regCP_MEC1_F32_INT_DIS = 0x1e5d +regCP_MEC1_F32_INT_DIS_BASE_IDX = 0 +regCP_MEC2_F32_INT_DIS = 0x1e5e +regCP_MEC2_F32_INT_DIS_BASE_IDX = 0 +regCP_VMID_STATUS = 0x1e5f +regCP_VMID_STATUS_BASE_IDX = 0 +regCPC_SUSPEND_CTX_SAVE_BASE_ADDR_LO = 0x1e60 +regCPC_SUSPEND_CTX_SAVE_BASE_ADDR_LO_BASE_IDX = 0 +regCPC_SUSPEND_CTX_SAVE_BASE_ADDR_HI = 0x1e61 +regCPC_SUSPEND_CTX_SAVE_BASE_ADDR_HI_BASE_IDX = 0 +regCPC_SUSPEND_CTX_SAVE_CONTROL = 0x1e62 +regCPC_SUSPEND_CTX_SAVE_CONTROL_BASE_IDX = 0 +regCPC_SUSPEND_CNTL_STACK_OFFSET = 0x1e63 +regCPC_SUSPEND_CNTL_STACK_OFFSET_BASE_IDX = 0 +regCPC_SUSPEND_CNTL_STACK_SIZE = 0x1e64 +regCPC_SUSPEND_CNTL_STACK_SIZE_BASE_IDX = 0 +regCPC_SUSPEND_WG_STATE_OFFSET = 0x1e65 +regCPC_SUSPEND_WG_STATE_OFFSET_BASE_IDX = 0 +regCPC_SUSPEND_CTX_SAVE_SIZE = 0x1e66 +regCPC_SUSPEND_CTX_SAVE_SIZE_BASE_IDX = 0 +regCPC_OS_PIPES = 0x1e67 +regCPC_OS_PIPES_BASE_IDX = 0 +regCP_SUSPEND_RESUME_REQ = 0x1e68 +regCP_SUSPEND_RESUME_REQ_BASE_IDX = 0 +regCP_SUSPEND_CNTL = 0x1e69 +regCP_SUSPEND_CNTL_BASE_IDX = 0 +regCP_IQ_WAIT_TIME3 = 0x1e6a +regCP_IQ_WAIT_TIME3_BASE_IDX = 0 +regCPC_DDID_BASE_ADDR_LO = 0x1e6b +regCPC_DDID_BASE_ADDR_LO_BASE_IDX = 0 +regCP_DDID_BASE_ADDR_LO = 0x1e6b +regCP_DDID_BASE_ADDR_LO_BASE_IDX = 0 +regCPC_DDID_BASE_ADDR_HI = 0x1e6c +regCPC_DDID_BASE_ADDR_HI_BASE_IDX = 0 +regCP_DDID_BASE_ADDR_HI = 0x1e6c +regCP_DDID_BASE_ADDR_HI_BASE_IDX = 0 +regCPC_DDID_CNTL = 0x1e6d +regCPC_DDID_CNTL_BASE_IDX = 0 +regCP_DDID_CNTL = 0x1e6d +regCP_DDID_CNTL_BASE_IDX = 0 +regCP_GFX_DDID_INFLIGHT_COUNT = 0x1e6e +regCP_GFX_DDID_INFLIGHT_COUNT_BASE_IDX = 0 +regCP_GFX_DDID_WPTR = 0x1e6f +regCP_GFX_DDID_WPTR_BASE_IDX = 0 +regCP_GFX_DDID_RPTR = 0x1e70 +regCP_GFX_DDID_RPTR_BASE_IDX = 0 +regCP_GFX_DDID_DELTA_RPT_COUNT = 0x1e71 +regCP_GFX_DDID_DELTA_RPT_COUNT_BASE_IDX = 0 +regCP_GFX_HPD_STATUS0 = 0x1e72 +regCP_GFX_HPD_STATUS0_BASE_IDX = 0 +regCP_GFX_HPD_CONTROL0 = 0x1e73 +regCP_GFX_HPD_CONTROL0_BASE_IDX = 0 +regCP_GFX_HPD_OSPRE_FENCE_ADDR_LO = 0x1e74 +regCP_GFX_HPD_OSPRE_FENCE_ADDR_LO_BASE_IDX = 0 +regCP_GFX_HPD_OSPRE_FENCE_ADDR_HI = 0x1e75 +regCP_GFX_HPD_OSPRE_FENCE_ADDR_HI_BASE_IDX = 0 +regCP_GFX_HPD_OSPRE_FENCE_DATA_LO = 0x1e76 +regCP_GFX_HPD_OSPRE_FENCE_DATA_LO_BASE_IDX = 0 +regCP_GFX_HPD_OSPRE_FENCE_DATA_HI = 0x1e77 +regCP_GFX_HPD_OSPRE_FENCE_DATA_HI_BASE_IDX = 0 +regCP_GFX_INDEX_MUTEX = 0x1e78 +regCP_GFX_INDEX_MUTEX_BASE_IDX = 0 +regCP_ME_PRGRM_CNTR_START_HI = 0x1e79 +regCP_ME_PRGRM_CNTR_START_HI_BASE_IDX = 0 +regCP_PFP_INTR_ROUTINE_START_HI = 0x1e7a +regCP_PFP_INTR_ROUTINE_START_HI_BASE_IDX = 0 +regCP_ME_INTR_ROUTINE_START_HI = 0x1e7b +regCP_ME_INTR_ROUTINE_START_HI_BASE_IDX = 0 +regCP_GFX_MQD_BASE_ADDR = 0x1e7e +regCP_GFX_MQD_BASE_ADDR_BASE_IDX = 0 +regCP_GFX_MQD_BASE_ADDR_HI = 0x1e7f +regCP_GFX_MQD_BASE_ADDR_HI_BASE_IDX = 0 +regCP_GFX_HQD_ACTIVE = 0x1e80 +regCP_GFX_HQD_ACTIVE_BASE_IDX = 0 +regCP_GFX_HQD_VMID = 0x1e81 +regCP_GFX_HQD_VMID_BASE_IDX = 0 +regCP_GFX_HQD_QUEUE_PRIORITY = 0x1e84 +regCP_GFX_HQD_QUEUE_PRIORITY_BASE_IDX = 0 +regCP_GFX_HQD_QUANTUM = 0x1e85 +regCP_GFX_HQD_QUANTUM_BASE_IDX = 0 +regCP_GFX_HQD_BASE = 0x1e86 +regCP_GFX_HQD_BASE_BASE_IDX = 0 +regCP_GFX_HQD_BASE_HI = 0x1e87 +regCP_GFX_HQD_BASE_HI_BASE_IDX = 0 +regCP_GFX_HQD_RPTR = 0x1e88 +regCP_GFX_HQD_RPTR_BASE_IDX = 0 +regCP_GFX_HQD_RPTR_ADDR = 0x1e89 +regCP_GFX_HQD_RPTR_ADDR_BASE_IDX = 0 +regCP_GFX_HQD_RPTR_ADDR_HI = 0x1e8a +regCP_GFX_HQD_RPTR_ADDR_HI_BASE_IDX = 0 +regCP_RB_WPTR_POLL_ADDR_LO = 0x1e8b +regCP_RB_WPTR_POLL_ADDR_LO_BASE_IDX = 0 +regCP_RB_WPTR_POLL_ADDR_HI = 0x1e8c +regCP_RB_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regCP_RB_DOORBELL_CONTROL = 0x1e8d +regCP_RB_DOORBELL_CONTROL_BASE_IDX = 0 +regCP_GFX_HQD_OFFSET = 0x1e8e +regCP_GFX_HQD_OFFSET_BASE_IDX = 0 +regCP_GFX_HQD_CNTL = 0x1e8f +regCP_GFX_HQD_CNTL_BASE_IDX = 0 +regCP_GFX_HQD_CSMD_RPTR = 0x1e90 +regCP_GFX_HQD_CSMD_RPTR_BASE_IDX = 0 +regCP_GFX_HQD_WPTR = 0x1e91 +regCP_GFX_HQD_WPTR_BASE_IDX = 0 +regCP_GFX_HQD_WPTR_HI = 0x1e92 +regCP_GFX_HQD_WPTR_HI_BASE_IDX = 0 +regCP_GFX_HQD_DEQUEUE_REQUEST = 0x1e93 +regCP_GFX_HQD_DEQUEUE_REQUEST_BASE_IDX = 0 +regCP_GFX_HQD_MAPPED = 0x1e94 +regCP_GFX_HQD_MAPPED_BASE_IDX = 0 +regCP_GFX_HQD_QUE_MGR_CONTROL = 0x1e95 +regCP_GFX_HQD_QUE_MGR_CONTROL_BASE_IDX = 0 +regCP_GFX_HQD_IQ_TIMER = 0x1e96 +regCP_GFX_HQD_IQ_TIMER_BASE_IDX = 0 +regCP_GFX_HQD_HQ_STATUS0 = 0x1e98 +regCP_GFX_HQD_HQ_STATUS0_BASE_IDX = 0 +regCP_GFX_HQD_HQ_CONTROL0 = 0x1e99 +regCP_GFX_HQD_HQ_CONTROL0_BASE_IDX = 0 +regCP_GFX_MQD_CONTROL = 0x1e9a +regCP_GFX_MQD_CONTROL_BASE_IDX = 0 +regCP_HQD_GFX_CONTROL = 0x1e9f +regCP_HQD_GFX_CONTROL_BASE_IDX = 0 +regCP_HQD_GFX_STATUS = 0x1ea0 +regCP_HQD_GFX_STATUS_BASE_IDX = 0 +regCP_DMA_WATCH0_ADDR_LO = 0x1ec0 +regCP_DMA_WATCH0_ADDR_LO_BASE_IDX = 0 +regCP_DMA_WATCH0_ADDR_HI = 0x1ec1 +regCP_DMA_WATCH0_ADDR_HI_BASE_IDX = 0 +regCP_DMA_WATCH0_MASK = 0x1ec2 +regCP_DMA_WATCH0_MASK_BASE_IDX = 0 +regCP_DMA_WATCH0_CNTL = 0x1ec3 +regCP_DMA_WATCH0_CNTL_BASE_IDX = 0 +regCP_DMA_WATCH1_ADDR_LO = 0x1ec4 +regCP_DMA_WATCH1_ADDR_LO_BASE_IDX = 0 +regCP_DMA_WATCH1_ADDR_HI = 0x1ec5 +regCP_DMA_WATCH1_ADDR_HI_BASE_IDX = 0 +regCP_DMA_WATCH1_MASK = 0x1ec6 +regCP_DMA_WATCH1_MASK_BASE_IDX = 0 +regCP_DMA_WATCH1_CNTL = 0x1ec7 +regCP_DMA_WATCH1_CNTL_BASE_IDX = 0 +regCP_DMA_WATCH2_ADDR_LO = 0x1ec8 +regCP_DMA_WATCH2_ADDR_LO_BASE_IDX = 0 +regCP_DMA_WATCH2_ADDR_HI = 0x1ec9 +regCP_DMA_WATCH2_ADDR_HI_BASE_IDX = 0 +regCP_DMA_WATCH2_MASK = 0x1eca +regCP_DMA_WATCH2_MASK_BASE_IDX = 0 +regCP_DMA_WATCH2_CNTL = 0x1ecb +regCP_DMA_WATCH2_CNTL_BASE_IDX = 0 +regCP_DMA_WATCH3_ADDR_LO = 0x1ecc +regCP_DMA_WATCH3_ADDR_LO_BASE_IDX = 0 +regCP_DMA_WATCH3_ADDR_HI = 0x1ecd +regCP_DMA_WATCH3_ADDR_HI_BASE_IDX = 0 +regCP_DMA_WATCH3_MASK = 0x1ece +regCP_DMA_WATCH3_MASK_BASE_IDX = 0 +regCP_DMA_WATCH3_CNTL = 0x1ecf +regCP_DMA_WATCH3_CNTL_BASE_IDX = 0 +regCP_DMA_WATCH_STAT_ADDR_LO = 0x1ed0 +regCP_DMA_WATCH_STAT_ADDR_LO_BASE_IDX = 0 +regCP_DMA_WATCH_STAT_ADDR_HI = 0x1ed1 +regCP_DMA_WATCH_STAT_ADDR_HI_BASE_IDX = 0 +regCP_DMA_WATCH_STAT = 0x1ed2 +regCP_DMA_WATCH_STAT_BASE_IDX = 0 +regCP_PFP_JT_STAT = 0x1ed3 +regCP_PFP_JT_STAT_BASE_IDX = 0 +regCP_MEC_JT_STAT = 0x1ed5 +regCP_MEC_JT_STAT_BASE_IDX = 0 +regCP_CPC_BUSY_HYSTERESIS = 0x1edb +regCP_CPC_BUSY_HYSTERESIS_BASE_IDX = 0 +regCP_CPF_BUSY_HYSTERESIS1 = 0x1edc +regCP_CPF_BUSY_HYSTERESIS1_BASE_IDX = 0 +regCP_CPF_BUSY_HYSTERESIS2 = 0x1edd +regCP_CPF_BUSY_HYSTERESIS2_BASE_IDX = 0 +regCP_CPG_BUSY_HYSTERESIS1 = 0x1ede +regCP_CPG_BUSY_HYSTERESIS1_BASE_IDX = 0 +regCP_CPG_BUSY_HYSTERESIS2 = 0x1edf +regCP_CPG_BUSY_HYSTERESIS2_BASE_IDX = 0 +regCP_RB_DOORBELL_CLEAR = 0x1f28 +regCP_RB_DOORBELL_CLEAR_BASE_IDX = 0 +regCP_RB0_ACTIVE = 0x1f40 +regCP_RB0_ACTIVE_BASE_IDX = 0 +regCP_RB_ACTIVE = 0x1f40 +regCP_RB_ACTIVE_BASE_IDX = 0 +regCP_RB1_ACTIVE = 0x1f41 +regCP_RB1_ACTIVE_BASE_IDX = 0 +regCP_RB_STATUS = 0x1f43 +regCP_RB_STATUS_BASE_IDX = 0 +regCPG_RCIU_CAM_INDEX = 0x1f44 +regCPG_RCIU_CAM_INDEX_BASE_IDX = 0 +regCPG_RCIU_CAM_DATA = 0x1f45 +regCPG_RCIU_CAM_DATA_BASE_IDX = 0 +regCPG_RCIU_CAM_DATA_PHASE0 = 0x1f45 +regCPG_RCIU_CAM_DATA_PHASE0_BASE_IDX = 0 +regCPG_RCIU_CAM_DATA_PHASE1 = 0x1f45 +regCPG_RCIU_CAM_DATA_PHASE1_BASE_IDX = 0 +regCPG_RCIU_CAM_DATA_PHASE2 = 0x1f45 +regCPG_RCIU_CAM_DATA_PHASE2_BASE_IDX = 0 +regCP_GPU_TIMESTAMP_OFFSET_LO = 0x1f4c +regCP_GPU_TIMESTAMP_OFFSET_LO_BASE_IDX = 0 +regCP_GPU_TIMESTAMP_OFFSET_HI = 0x1f4d +regCP_GPU_TIMESTAMP_OFFSET_HI_BASE_IDX = 0 +regCP_SDMA_DMA_DONE = 0x1f4e +regCP_SDMA_DMA_DONE_BASE_IDX = 0 +regCP_PFP_SDMA_CS = 0x1f4f +regCP_PFP_SDMA_CS_BASE_IDX = 0 +regCP_ME_SDMA_CS = 0x1f50 +regCP_ME_SDMA_CS_BASE_IDX = 0 +regCPF_GCR_CNTL = 0x1f53 +regCPF_GCR_CNTL_BASE_IDX = 0 +regCPG_UTCL1_STATUS = 0x1f54 +regCPG_UTCL1_STATUS_BASE_IDX = 0 +regCPC_UTCL1_STATUS = 0x1f55 +regCPC_UTCL1_STATUS_BASE_IDX = 0 +regCPF_UTCL1_STATUS = 0x1f56 +regCPF_UTCL1_STATUS_BASE_IDX = 0 +regCP_SD_CNTL = 0x1f57 +regCP_SD_CNTL_BASE_IDX = 0 +regCP_SOFT_RESET_CNTL = 0x1f59 +regCP_SOFT_RESET_CNTL_BASE_IDX = 0 +regCP_CPC_GFX_CNTL = 0x1f5a +regCP_CPC_GFX_CNTL_BASE_IDX = 0 +regSPI_ARB_PRIORITY = 0x1f60 +regSPI_ARB_PRIORITY_BASE_IDX = 0 +regSPI_ARB_CYCLES_0 = 0x1f61 +regSPI_ARB_CYCLES_0_BASE_IDX = 0 +regSPI_ARB_CYCLES_1 = 0x1f62 +regSPI_ARB_CYCLES_1_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_GFX = 0x1f67 +regSPI_WCL_PIPE_PERCENT_GFX_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_HP3D = 0x1f68 +regSPI_WCL_PIPE_PERCENT_HP3D_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_CS0 = 0x1f69 +regSPI_WCL_PIPE_PERCENT_CS0_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_CS1 = 0x1f6a +regSPI_WCL_PIPE_PERCENT_CS1_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_CS2 = 0x1f6b +regSPI_WCL_PIPE_PERCENT_CS2_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_CS3 = 0x1f6c +regSPI_WCL_PIPE_PERCENT_CS3_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_CS4 = 0x1f6d +regSPI_WCL_PIPE_PERCENT_CS4_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_CS5 = 0x1f6e +regSPI_WCL_PIPE_PERCENT_CS5_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_CS6 = 0x1f6f +regSPI_WCL_PIPE_PERCENT_CS6_BASE_IDX = 0 +regSPI_WCL_PIPE_PERCENT_CS7 = 0x1f70 +regSPI_WCL_PIPE_PERCENT_CS7_BASE_IDX = 0 +regSPI_USER_ACCUM_VMID_CNTL = 0x1f71 +regSPI_USER_ACCUM_VMID_CNTL_BASE_IDX = 0 +regSPI_GDBG_PER_VMID_CNTL = 0x1f72 +regSPI_GDBG_PER_VMID_CNTL_BASE_IDX = 0 +regSPI_COMPUTE_QUEUE_RESET = 0x1f73 +regSPI_COMPUTE_QUEUE_RESET_BASE_IDX = 0 +regSPI_COMPUTE_WF_CTX_SAVE = 0x1f74 +regSPI_COMPUTE_WF_CTX_SAVE_BASE_IDX = 0 +regCP_HPD_UTCL1_CNTL = 0x1fa3 +regCP_HPD_UTCL1_CNTL_BASE_IDX = 0 +regCP_HPD_UTCL1_ERROR = 0x1fa7 +regCP_HPD_UTCL1_ERROR_BASE_IDX = 0 +regCP_HPD_UTCL1_ERROR_ADDR = 0x1fa8 +regCP_HPD_UTCL1_ERROR_ADDR_BASE_IDX = 0 +regCP_MQD_BASE_ADDR = 0x1fa9 +regCP_MQD_BASE_ADDR_BASE_IDX = 0 +regCP_MQD_BASE_ADDR_HI = 0x1faa +regCP_MQD_BASE_ADDR_HI_BASE_IDX = 0 +regCP_HQD_ACTIVE = 0x1fab +regCP_HQD_ACTIVE_BASE_IDX = 0 +regCP_HQD_VMID = 0x1fac +regCP_HQD_VMID_BASE_IDX = 0 +regCP_HQD_PERSISTENT_STATE = 0x1fad +regCP_HQD_PERSISTENT_STATE_BASE_IDX = 0 +regCP_HQD_PIPE_PRIORITY = 0x1fae +regCP_HQD_PIPE_PRIORITY_BASE_IDX = 0 +regCP_HQD_QUEUE_PRIORITY = 0x1faf +regCP_HQD_QUEUE_PRIORITY_BASE_IDX = 0 +regCP_HQD_QUANTUM = 0x1fb0 +regCP_HQD_QUANTUM_BASE_IDX = 0 +regCP_HQD_PQ_BASE = 0x1fb1 +regCP_HQD_PQ_BASE_BASE_IDX = 0 +regCP_HQD_PQ_BASE_HI = 0x1fb2 +regCP_HQD_PQ_BASE_HI_BASE_IDX = 0 +regCP_HQD_PQ_RPTR = 0x1fb3 +regCP_HQD_PQ_RPTR_BASE_IDX = 0 +regCP_HQD_PQ_RPTR_REPORT_ADDR = 0x1fb4 +regCP_HQD_PQ_RPTR_REPORT_ADDR_BASE_IDX = 0 +regCP_HQD_PQ_RPTR_REPORT_ADDR_HI = 0x1fb5 +regCP_HQD_PQ_RPTR_REPORT_ADDR_HI_BASE_IDX = 0 +regCP_HQD_PQ_WPTR_POLL_ADDR = 0x1fb6 +regCP_HQD_PQ_WPTR_POLL_ADDR_BASE_IDX = 0 +regCP_HQD_PQ_WPTR_POLL_ADDR_HI = 0x1fb7 +regCP_HQD_PQ_WPTR_POLL_ADDR_HI_BASE_IDX = 0 +regCP_HQD_PQ_DOORBELL_CONTROL = 0x1fb8 +regCP_HQD_PQ_DOORBELL_CONTROL_BASE_IDX = 0 +regCP_HQD_PQ_CONTROL = 0x1fba +regCP_HQD_PQ_CONTROL_BASE_IDX = 0 +regCP_HQD_IB_BASE_ADDR = 0x1fbb +regCP_HQD_IB_BASE_ADDR_BASE_IDX = 0 +regCP_HQD_IB_BASE_ADDR_HI = 0x1fbc +regCP_HQD_IB_BASE_ADDR_HI_BASE_IDX = 0 +regCP_HQD_IB_RPTR = 0x1fbd +regCP_HQD_IB_RPTR_BASE_IDX = 0 +regCP_HQD_IB_CONTROL = 0x1fbe +regCP_HQD_IB_CONTROL_BASE_IDX = 0 +regCP_HQD_IQ_TIMER = 0x1fbf +regCP_HQD_IQ_TIMER_BASE_IDX = 0 +regCP_HQD_IQ_RPTR = 0x1fc0 +regCP_HQD_IQ_RPTR_BASE_IDX = 0 +regCP_HQD_DEQUEUE_REQUEST = 0x1fc1 +regCP_HQD_DEQUEUE_REQUEST_BASE_IDX = 0 +regCP_HQD_DMA_OFFLOAD = 0x1fc2 +regCP_HQD_DMA_OFFLOAD_BASE_IDX = 0 +regCP_HQD_OFFLOAD = 0x1fc2 +regCP_HQD_OFFLOAD_BASE_IDX = 0 +regCP_HQD_SEMA_CMD = 0x1fc3 +regCP_HQD_SEMA_CMD_BASE_IDX = 0 +regCP_HQD_MSG_TYPE = 0x1fc4 +regCP_HQD_MSG_TYPE_BASE_IDX = 0 +regCP_HQD_ATOMIC0_PREOP_LO = 0x1fc5 +regCP_HQD_ATOMIC0_PREOP_LO_BASE_IDX = 0 +regCP_HQD_ATOMIC0_PREOP_HI = 0x1fc6 +regCP_HQD_ATOMIC0_PREOP_HI_BASE_IDX = 0 +regCP_HQD_ATOMIC1_PREOP_LO = 0x1fc7 +regCP_HQD_ATOMIC1_PREOP_LO_BASE_IDX = 0 +regCP_HQD_ATOMIC1_PREOP_HI = 0x1fc8 +regCP_HQD_ATOMIC1_PREOP_HI_BASE_IDX = 0 +regCP_HQD_HQ_SCHEDULER0 = 0x1fc9 +regCP_HQD_HQ_SCHEDULER0_BASE_IDX = 0 +regCP_HQD_HQ_STATUS0 = 0x1fc9 +regCP_HQD_HQ_STATUS0_BASE_IDX = 0 +regCP_HQD_HQ_CONTROL0 = 0x1fca +regCP_HQD_HQ_CONTROL0_BASE_IDX = 0 +regCP_HQD_HQ_SCHEDULER1 = 0x1fca +regCP_HQD_HQ_SCHEDULER1_BASE_IDX = 0 +regCP_MQD_CONTROL = 0x1fcb +regCP_MQD_CONTROL_BASE_IDX = 0 +regCP_HQD_HQ_STATUS1 = 0x1fcc +regCP_HQD_HQ_STATUS1_BASE_IDX = 0 +regCP_HQD_HQ_CONTROL1 = 0x1fcd +regCP_HQD_HQ_CONTROL1_BASE_IDX = 0 +regCP_HQD_EOP_BASE_ADDR = 0x1fce +regCP_HQD_EOP_BASE_ADDR_BASE_IDX = 0 +regCP_HQD_EOP_BASE_ADDR_HI = 0x1fcf +regCP_HQD_EOP_BASE_ADDR_HI_BASE_IDX = 0 +regCP_HQD_EOP_CONTROL = 0x1fd0 +regCP_HQD_EOP_CONTROL_BASE_IDX = 0 +regCP_HQD_EOP_RPTR = 0x1fd1 +regCP_HQD_EOP_RPTR_BASE_IDX = 0 +regCP_HQD_EOP_WPTR = 0x1fd2 +regCP_HQD_EOP_WPTR_BASE_IDX = 0 +regCP_HQD_EOP_EVENTS = 0x1fd3 +regCP_HQD_EOP_EVENTS_BASE_IDX = 0 +regCP_HQD_CTX_SAVE_BASE_ADDR_LO = 0x1fd4 +regCP_HQD_CTX_SAVE_BASE_ADDR_LO_BASE_IDX = 0 +regCP_HQD_CTX_SAVE_BASE_ADDR_HI = 0x1fd5 +regCP_HQD_CTX_SAVE_BASE_ADDR_HI_BASE_IDX = 0 +regCP_HQD_CTX_SAVE_CONTROL = 0x1fd6 +regCP_HQD_CTX_SAVE_CONTROL_BASE_IDX = 0 +regCP_HQD_CNTL_STACK_OFFSET = 0x1fd7 +regCP_HQD_CNTL_STACK_OFFSET_BASE_IDX = 0 +regCP_HQD_CNTL_STACK_SIZE = 0x1fd8 +regCP_HQD_CNTL_STACK_SIZE_BASE_IDX = 0 +regCP_HQD_WG_STATE_OFFSET = 0x1fd9 +regCP_HQD_WG_STATE_OFFSET_BASE_IDX = 0 +regCP_HQD_CTX_SAVE_SIZE = 0x1fda +regCP_HQD_CTX_SAVE_SIZE_BASE_IDX = 0 +regCP_HQD_GDS_RESOURCE_STATE = 0x1fdb +regCP_HQD_GDS_RESOURCE_STATE_BASE_IDX = 0 +regCP_HQD_ERROR = 0x1fdc +regCP_HQD_ERROR_BASE_IDX = 0 +regCP_HQD_EOP_WPTR_MEM = 0x1fdd +regCP_HQD_EOP_WPTR_MEM_BASE_IDX = 0 +regCP_HQD_AQL_CONTROL = 0x1fde +regCP_HQD_AQL_CONTROL_BASE_IDX = 0 +regCP_HQD_PQ_WPTR_LO = 0x1fdf +regCP_HQD_PQ_WPTR_LO_BASE_IDX = 0 +regCP_HQD_PQ_WPTR_HI = 0x1fe0 +regCP_HQD_PQ_WPTR_HI_BASE_IDX = 0 +regCP_HQD_SUSPEND_CNTL_STACK_OFFSET = 0x1fe1 +regCP_HQD_SUSPEND_CNTL_STACK_OFFSET_BASE_IDX = 0 +regCP_HQD_SUSPEND_CNTL_STACK_DW_CNT = 0x1fe2 +regCP_HQD_SUSPEND_CNTL_STACK_DW_CNT_BASE_IDX = 0 +regCP_HQD_SUSPEND_WG_STATE_OFFSET = 0x1fe3 +regCP_HQD_SUSPEND_WG_STATE_OFFSET_BASE_IDX = 0 +regCP_HQD_DDID_RPTR = 0x1fe4 +regCP_HQD_DDID_RPTR_BASE_IDX = 0 +regCP_HQD_DDID_WPTR = 0x1fe5 +regCP_HQD_DDID_WPTR_BASE_IDX = 0 +regCP_HQD_DDID_INFLIGHT_COUNT = 0x1fe6 +regCP_HQD_DDID_INFLIGHT_COUNT_BASE_IDX = 0 +regCP_HQD_DDID_DELTA_RPT_COUNT = 0x1fe7 +regCP_HQD_DDID_DELTA_RPT_COUNT_BASE_IDX = 0 +regCP_HQD_DEQUEUE_STATUS = 0x1fe8 +regCP_HQD_DEQUEUE_STATUS_BASE_IDX = 0 +regTCP_WATCH0_ADDR_H = 0x2048 +regTCP_WATCH0_ADDR_H_BASE_IDX = 0 +regTCP_WATCH0_ADDR_L = 0x2049 +regTCP_WATCH0_ADDR_L_BASE_IDX = 0 +regTCP_WATCH0_CNTL = 0x204a +regTCP_WATCH0_CNTL_BASE_IDX = 0 +regTCP_WATCH1_ADDR_H = 0x204b +regTCP_WATCH1_ADDR_H_BASE_IDX = 0 +regTCP_WATCH1_ADDR_L = 0x204c +regTCP_WATCH1_ADDR_L_BASE_IDX = 0 +regTCP_WATCH1_CNTL = 0x204d +regTCP_WATCH1_CNTL_BASE_IDX = 0 +regTCP_WATCH2_ADDR_H = 0x204e +regTCP_WATCH2_ADDR_H_BASE_IDX = 0 +regTCP_WATCH2_ADDR_L = 0x204f +regTCP_WATCH2_ADDR_L_BASE_IDX = 0 +regTCP_WATCH2_CNTL = 0x2050 +regTCP_WATCH2_CNTL_BASE_IDX = 0 +regTCP_WATCH3_ADDR_H = 0x2051 +regTCP_WATCH3_ADDR_H_BASE_IDX = 0 +regTCP_WATCH3_ADDR_L = 0x2052 +regTCP_WATCH3_ADDR_L_BASE_IDX = 0 +regTCP_WATCH3_CNTL = 0x2053 +regTCP_WATCH3_CNTL_BASE_IDX = 0 +regGDS_VMID0_BASE = 0x20a0 +regGDS_VMID0_BASE_BASE_IDX = 0 +regGDS_VMID0_SIZE = 0x20a1 +regGDS_VMID0_SIZE_BASE_IDX = 0 +regGDS_VMID1_BASE = 0x20a2 +regGDS_VMID1_BASE_BASE_IDX = 0 +regGDS_VMID1_SIZE = 0x20a3 +regGDS_VMID1_SIZE_BASE_IDX = 0 +regGDS_VMID2_BASE = 0x20a4 +regGDS_VMID2_BASE_BASE_IDX = 0 +regGDS_VMID2_SIZE = 0x20a5 +regGDS_VMID2_SIZE_BASE_IDX = 0 +regGDS_VMID3_BASE = 0x20a6 +regGDS_VMID3_BASE_BASE_IDX = 0 +regGDS_VMID3_SIZE = 0x20a7 +regGDS_VMID3_SIZE_BASE_IDX = 0 +regGDS_VMID4_BASE = 0x20a8 +regGDS_VMID4_BASE_BASE_IDX = 0 +regGDS_VMID4_SIZE = 0x20a9 +regGDS_VMID4_SIZE_BASE_IDX = 0 +regGDS_VMID5_BASE = 0x20aa +regGDS_VMID5_BASE_BASE_IDX = 0 +regGDS_VMID5_SIZE = 0x20ab +regGDS_VMID5_SIZE_BASE_IDX = 0 +regGDS_VMID6_BASE = 0x20ac +regGDS_VMID6_BASE_BASE_IDX = 0 +regGDS_VMID6_SIZE = 0x20ad +regGDS_VMID6_SIZE_BASE_IDX = 0 +regGDS_VMID7_BASE = 0x20ae +regGDS_VMID7_BASE_BASE_IDX = 0 +regGDS_VMID7_SIZE = 0x20af +regGDS_VMID7_SIZE_BASE_IDX = 0 +regGDS_VMID8_BASE = 0x20b0 +regGDS_VMID8_BASE_BASE_IDX = 0 +regGDS_VMID8_SIZE = 0x20b1 +regGDS_VMID8_SIZE_BASE_IDX = 0 +regGDS_VMID9_BASE = 0x20b2 +regGDS_VMID9_BASE_BASE_IDX = 0 +regGDS_VMID9_SIZE = 0x20b3 +regGDS_VMID9_SIZE_BASE_IDX = 0 +regGDS_VMID10_BASE = 0x20b4 +regGDS_VMID10_BASE_BASE_IDX = 0 +regGDS_VMID10_SIZE = 0x20b5 +regGDS_VMID10_SIZE_BASE_IDX = 0 +regGDS_VMID11_BASE = 0x20b6 +regGDS_VMID11_BASE_BASE_IDX = 0 +regGDS_VMID11_SIZE = 0x20b7 +regGDS_VMID11_SIZE_BASE_IDX = 0 +regGDS_VMID12_BASE = 0x20b8 +regGDS_VMID12_BASE_BASE_IDX = 0 +regGDS_VMID12_SIZE = 0x20b9 +regGDS_VMID12_SIZE_BASE_IDX = 0 +regGDS_VMID13_BASE = 0x20ba +regGDS_VMID13_BASE_BASE_IDX = 0 +regGDS_VMID13_SIZE = 0x20bb +regGDS_VMID13_SIZE_BASE_IDX = 0 +regGDS_VMID14_BASE = 0x20bc +regGDS_VMID14_BASE_BASE_IDX = 0 +regGDS_VMID14_SIZE = 0x20bd +regGDS_VMID14_SIZE_BASE_IDX = 0 +regGDS_VMID15_BASE = 0x20be +regGDS_VMID15_BASE_BASE_IDX = 0 +regGDS_VMID15_SIZE = 0x20bf +regGDS_VMID15_SIZE_BASE_IDX = 0 +regGDS_GWS_VMID0 = 0x20c0 +regGDS_GWS_VMID0_BASE_IDX = 0 +regGDS_GWS_VMID1 = 0x20c1 +regGDS_GWS_VMID1_BASE_IDX = 0 +regGDS_GWS_VMID2 = 0x20c2 +regGDS_GWS_VMID2_BASE_IDX = 0 +regGDS_GWS_VMID3 = 0x20c3 +regGDS_GWS_VMID3_BASE_IDX = 0 +regGDS_GWS_VMID4 = 0x20c4 +regGDS_GWS_VMID4_BASE_IDX = 0 +regGDS_GWS_VMID5 = 0x20c5 +regGDS_GWS_VMID5_BASE_IDX = 0 +regGDS_GWS_VMID6 = 0x20c6 +regGDS_GWS_VMID6_BASE_IDX = 0 +regGDS_GWS_VMID7 = 0x20c7 +regGDS_GWS_VMID7_BASE_IDX = 0 +regGDS_GWS_VMID8 = 0x20c8 +regGDS_GWS_VMID8_BASE_IDX = 0 +regGDS_GWS_VMID9 = 0x20c9 +regGDS_GWS_VMID9_BASE_IDX = 0 +regGDS_GWS_VMID10 = 0x20ca +regGDS_GWS_VMID10_BASE_IDX = 0 +regGDS_GWS_VMID11 = 0x20cb +regGDS_GWS_VMID11_BASE_IDX = 0 +regGDS_GWS_VMID12 = 0x20cc +regGDS_GWS_VMID12_BASE_IDX = 0 +regGDS_GWS_VMID13 = 0x20cd +regGDS_GWS_VMID13_BASE_IDX = 0 +regGDS_GWS_VMID14 = 0x20ce +regGDS_GWS_VMID14_BASE_IDX = 0 +regGDS_GWS_VMID15 = 0x20cf +regGDS_GWS_VMID15_BASE_IDX = 0 +regGDS_OA_VMID0 = 0x20d0 +regGDS_OA_VMID0_BASE_IDX = 0 +regGDS_OA_VMID1 = 0x20d1 +regGDS_OA_VMID1_BASE_IDX = 0 +regGDS_OA_VMID2 = 0x20d2 +regGDS_OA_VMID2_BASE_IDX = 0 +regGDS_OA_VMID3 = 0x20d3 +regGDS_OA_VMID3_BASE_IDX = 0 +regGDS_OA_VMID4 = 0x20d4 +regGDS_OA_VMID4_BASE_IDX = 0 +regGDS_OA_VMID5 = 0x20d5 +regGDS_OA_VMID5_BASE_IDX = 0 +regGDS_OA_VMID6 = 0x20d6 +regGDS_OA_VMID6_BASE_IDX = 0 +regGDS_OA_VMID7 = 0x20d7 +regGDS_OA_VMID7_BASE_IDX = 0 +regGDS_OA_VMID8 = 0x20d8 +regGDS_OA_VMID8_BASE_IDX = 0 +regGDS_OA_VMID9 = 0x20d9 +regGDS_OA_VMID9_BASE_IDX = 0 +regGDS_OA_VMID10 = 0x20da +regGDS_OA_VMID10_BASE_IDX = 0 +regGDS_OA_VMID11 = 0x20db +regGDS_OA_VMID11_BASE_IDX = 0 +regGDS_OA_VMID12 = 0x20dc +regGDS_OA_VMID12_BASE_IDX = 0 +regGDS_OA_VMID13 = 0x20dd +regGDS_OA_VMID13_BASE_IDX = 0 +regGDS_OA_VMID14 = 0x20de +regGDS_OA_VMID14_BASE_IDX = 0 +regGDS_OA_VMID15 = 0x20df +regGDS_OA_VMID15_BASE_IDX = 0 +regGDS_GWS_RESET0 = 0x20e4 +regGDS_GWS_RESET0_BASE_IDX = 0 +regGDS_GWS_RESET1 = 0x20e5 +regGDS_GWS_RESET1_BASE_IDX = 0 +regGDS_GWS_RESOURCE_RESET = 0x20e6 +regGDS_GWS_RESOURCE_RESET_BASE_IDX = 0 +regGDS_COMPUTE_MAX_WAVE_ID = 0x20e8 +regGDS_COMPUTE_MAX_WAVE_ID_BASE_IDX = 0 +regGDS_OA_RESET_MASK = 0x20e9 +regGDS_OA_RESET_MASK_BASE_IDX = 0 +regGDS_OA_RESET = 0x20ea +regGDS_OA_RESET_BASE_IDX = 0 +regGDS_CS_CTXSW_STATUS = 0x20ed +regGDS_CS_CTXSW_STATUS_BASE_IDX = 0 +regGDS_CS_CTXSW_CNT0 = 0x20ee +regGDS_CS_CTXSW_CNT0_BASE_IDX = 0 +regGDS_CS_CTXSW_CNT1 = 0x20ef +regGDS_CS_CTXSW_CNT1_BASE_IDX = 0 +regGDS_CS_CTXSW_CNT2 = 0x20f0 +regGDS_CS_CTXSW_CNT2_BASE_IDX = 0 +regGDS_CS_CTXSW_CNT3 = 0x20f1 +regGDS_CS_CTXSW_CNT3_BASE_IDX = 0 +regGDS_GFX_CTXSW_STATUS = 0x20f2 +regGDS_GFX_CTXSW_STATUS_BASE_IDX = 0 +regGDS_PS_CTXSW_CNT0 = 0x20f7 +regGDS_PS_CTXSW_CNT0_BASE_IDX = 0 +regGDS_PS_CTXSW_CNT1 = 0x20f8 +regGDS_PS_CTXSW_CNT1_BASE_IDX = 0 +regGDS_PS_CTXSW_CNT2 = 0x20f9 +regGDS_PS_CTXSW_CNT2_BASE_IDX = 0 +regGDS_PS_CTXSW_CNT3 = 0x20fa +regGDS_PS_CTXSW_CNT3_BASE_IDX = 0 +regGDS_PS_CTXSW_IDX = 0x20fb +regGDS_PS_CTXSW_IDX_BASE_IDX = 0 +regGDS_GS_CTXSW_CNT0 = 0x2117 +regGDS_GS_CTXSW_CNT0_BASE_IDX = 0 +regGDS_GS_CTXSW_CNT1 = 0x2118 +regGDS_GS_CTXSW_CNT1_BASE_IDX = 0 +regGDS_GS_CTXSW_CNT2 = 0x2119 +regGDS_GS_CTXSW_CNT2_BASE_IDX = 0 +regGDS_GS_CTXSW_CNT3 = 0x211a +regGDS_GS_CTXSW_CNT3_BASE_IDX = 0 +regGDS_MEMORY_CLEAN = 0x211f +regGDS_MEMORY_CLEAN_BASE_IDX = 0 +regGUS_IO_RD_COMBINE_FLUSH = 0x2c00 +regGUS_IO_RD_COMBINE_FLUSH_BASE_IDX = 1 +regGUS_IO_WR_COMBINE_FLUSH = 0x2c01 +regGUS_IO_WR_COMBINE_FLUSH_BASE_IDX = 1 +regGUS_IO_RD_PRI_AGE_RATE = 0x2c02 +regGUS_IO_RD_PRI_AGE_RATE_BASE_IDX = 1 +regGUS_IO_WR_PRI_AGE_RATE = 0x2c03 +regGUS_IO_WR_PRI_AGE_RATE_BASE_IDX = 1 +regGUS_IO_RD_PRI_AGE_COEFF = 0x2c04 +regGUS_IO_RD_PRI_AGE_COEFF_BASE_IDX = 1 +regGUS_IO_WR_PRI_AGE_COEFF = 0x2c05 +regGUS_IO_WR_PRI_AGE_COEFF_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUEUING = 0x2c06 +regGUS_IO_RD_PRI_QUEUING_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUEUING = 0x2c07 +regGUS_IO_WR_PRI_QUEUING_BASE_IDX = 1 +regGUS_IO_RD_PRI_FIXED = 0x2c08 +regGUS_IO_RD_PRI_FIXED_BASE_IDX = 1 +regGUS_IO_WR_PRI_FIXED = 0x2c09 +regGUS_IO_WR_PRI_FIXED_BASE_IDX = 1 +regGUS_IO_RD_PRI_URGENCY_COEFF = 0x2c0a +regGUS_IO_RD_PRI_URGENCY_COEFF_BASE_IDX = 1 +regGUS_IO_WR_PRI_URGENCY_COEFF = 0x2c0b +regGUS_IO_WR_PRI_URGENCY_COEFF_BASE_IDX = 1 +regGUS_IO_RD_PRI_URGENCY_MODE = 0x2c0c +regGUS_IO_RD_PRI_URGENCY_MODE_BASE_IDX = 1 +regGUS_IO_WR_PRI_URGENCY_MODE = 0x2c0d +regGUS_IO_WR_PRI_URGENCY_MODE_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUANT_PRI1 = 0x2c0e +regGUS_IO_RD_PRI_QUANT_PRI1_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUANT_PRI2 = 0x2c0f +regGUS_IO_RD_PRI_QUANT_PRI2_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUANT_PRI3 = 0x2c10 +regGUS_IO_RD_PRI_QUANT_PRI3_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUANT_PRI4 = 0x2c11 +regGUS_IO_RD_PRI_QUANT_PRI4_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUANT_PRI1 = 0x2c12 +regGUS_IO_WR_PRI_QUANT_PRI1_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUANT_PRI2 = 0x2c13 +regGUS_IO_WR_PRI_QUANT_PRI2_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUANT_PRI3 = 0x2c14 +regGUS_IO_WR_PRI_QUANT_PRI3_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUANT_PRI4 = 0x2c15 +regGUS_IO_WR_PRI_QUANT_PRI4_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUANT1_PRI1 = 0x2c16 +regGUS_IO_RD_PRI_QUANT1_PRI1_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUANT1_PRI2 = 0x2c17 +regGUS_IO_RD_PRI_QUANT1_PRI2_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUANT1_PRI3 = 0x2c18 +regGUS_IO_RD_PRI_QUANT1_PRI3_BASE_IDX = 1 +regGUS_IO_RD_PRI_QUANT1_PRI4 = 0x2c19 +regGUS_IO_RD_PRI_QUANT1_PRI4_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUANT1_PRI1 = 0x2c1a +regGUS_IO_WR_PRI_QUANT1_PRI1_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUANT1_PRI2 = 0x2c1b +regGUS_IO_WR_PRI_QUANT1_PRI2_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUANT1_PRI3 = 0x2c1c +regGUS_IO_WR_PRI_QUANT1_PRI3_BASE_IDX = 1 +regGUS_IO_WR_PRI_QUANT1_PRI4 = 0x2c1d +regGUS_IO_WR_PRI_QUANT1_PRI4_BASE_IDX = 1 +regGUS_DRAM_COMBINE_FLUSH = 0x2c1e +regGUS_DRAM_COMBINE_FLUSH_BASE_IDX = 1 +regGUS_DRAM_COMBINE_RD_WR_EN = 0x2c1f +regGUS_DRAM_COMBINE_RD_WR_EN_BASE_IDX = 1 +regGUS_DRAM_PRI_AGE_RATE = 0x2c20 +regGUS_DRAM_PRI_AGE_RATE_BASE_IDX = 1 +regGUS_DRAM_PRI_AGE_COEFF = 0x2c21 +regGUS_DRAM_PRI_AGE_COEFF_BASE_IDX = 1 +regGUS_DRAM_PRI_QUEUING = 0x2c22 +regGUS_DRAM_PRI_QUEUING_BASE_IDX = 1 +regGUS_DRAM_PRI_FIXED = 0x2c23 +regGUS_DRAM_PRI_FIXED_BASE_IDX = 1 +regGUS_DRAM_PRI_URGENCY_COEFF = 0x2c24 +regGUS_DRAM_PRI_URGENCY_COEFF_BASE_IDX = 1 +regGUS_DRAM_PRI_URGENCY_MODE = 0x2c25 +regGUS_DRAM_PRI_URGENCY_MODE_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT_PRI1 = 0x2c26 +regGUS_DRAM_PRI_QUANT_PRI1_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT_PRI2 = 0x2c27 +regGUS_DRAM_PRI_QUANT_PRI2_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT_PRI3 = 0x2c28 +regGUS_DRAM_PRI_QUANT_PRI3_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT_PRI4 = 0x2c29 +regGUS_DRAM_PRI_QUANT_PRI4_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT_PRI5 = 0x2c2a +regGUS_DRAM_PRI_QUANT_PRI5_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT1_PRI1 = 0x2c2b +regGUS_DRAM_PRI_QUANT1_PRI1_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT1_PRI2 = 0x2c2c +regGUS_DRAM_PRI_QUANT1_PRI2_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT1_PRI3 = 0x2c2d +regGUS_DRAM_PRI_QUANT1_PRI3_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT1_PRI4 = 0x2c2e +regGUS_DRAM_PRI_QUANT1_PRI4_BASE_IDX = 1 +regGUS_DRAM_PRI_QUANT1_PRI5 = 0x2c2f +regGUS_DRAM_PRI_QUANT1_PRI5_BASE_IDX = 1 +regGUS_IO_GROUP_BURST = 0x2c30 +regGUS_IO_GROUP_BURST_BASE_IDX = 1 +regGUS_DRAM_GROUP_BURST = 0x2c31 +regGUS_DRAM_GROUP_BURST_BASE_IDX = 1 +regGUS_SDP_ARB_FINAL = 0x2c32 +regGUS_SDP_ARB_FINAL_BASE_IDX = 1 +regGUS_SDP_QOS_VC_PRIORITY = 0x2c33 +regGUS_SDP_QOS_VC_PRIORITY_BASE_IDX = 1 +regGUS_SDP_CREDITS = 0x2c34 +regGUS_SDP_CREDITS_BASE_IDX = 1 +regGUS_SDP_TAG_RESERVE0 = 0x2c35 +regGUS_SDP_TAG_RESERVE0_BASE_IDX = 1 +regGUS_SDP_TAG_RESERVE1 = 0x2c36 +regGUS_SDP_TAG_RESERVE1_BASE_IDX = 1 +regGUS_SDP_VCC_RESERVE0 = 0x2c37 +regGUS_SDP_VCC_RESERVE0_BASE_IDX = 1 +regGUS_SDP_VCC_RESERVE1 = 0x2c38 +regGUS_SDP_VCC_RESERVE1_BASE_IDX = 1 +regGUS_SDP_VCD_RESERVE0 = 0x2c39 +regGUS_SDP_VCD_RESERVE0_BASE_IDX = 1 +regGUS_SDP_VCD_RESERVE1 = 0x2c3a +regGUS_SDP_VCD_RESERVE1_BASE_IDX = 1 +regGUS_SDP_REQ_CNTL = 0x2c3b +regGUS_SDP_REQ_CNTL_BASE_IDX = 1 +regGUS_MISC = 0x2c3c +regGUS_MISC_BASE_IDX = 1 +regGUS_LATENCY_SAMPLING = 0x2c3d +regGUS_LATENCY_SAMPLING_BASE_IDX = 1 +regGUS_ERR_STATUS = 0x2c3e +regGUS_ERR_STATUS_BASE_IDX = 1 +regGUS_MISC2 = 0x2c3f +regGUS_MISC2_BASE_IDX = 1 +regGUS_SDP_ENABLE = 0x2c45 +regGUS_SDP_ENABLE_BASE_IDX = 1 +regGUS_L1_CH0_CMD_IN = 0x2c46 +regGUS_L1_CH0_CMD_IN_BASE_IDX = 1 +regGUS_L1_CH0_CMD_OUT = 0x2c47 +regGUS_L1_CH0_CMD_OUT_BASE_IDX = 1 +regGUS_L1_CH0_DATA_IN = 0x2c48 +regGUS_L1_CH0_DATA_IN_BASE_IDX = 1 +regGUS_L1_CH0_DATA_OUT = 0x2c49 +regGUS_L1_CH0_DATA_OUT_BASE_IDX = 1 +regGUS_L1_CH0_DATA_U_IN = 0x2c4a +regGUS_L1_CH0_DATA_U_IN_BASE_IDX = 1 +regGUS_L1_CH0_DATA_U_OUT = 0x2c4b +regGUS_L1_CH0_DATA_U_OUT_BASE_IDX = 1 +regGUS_L1_CH1_CMD_IN = 0x2c4c +regGUS_L1_CH1_CMD_IN_BASE_IDX = 1 +regGUS_L1_CH1_CMD_OUT = 0x2c4d +regGUS_L1_CH1_CMD_OUT_BASE_IDX = 1 +regGUS_L1_CH1_DATA_IN = 0x2c4e +regGUS_L1_CH1_DATA_IN_BASE_IDX = 1 +regGUS_L1_CH1_DATA_OUT = 0x2c4f +regGUS_L1_CH1_DATA_OUT_BASE_IDX = 1 +regGUS_L1_CH1_DATA_U_IN = 0x2c50 +regGUS_L1_CH1_DATA_U_IN_BASE_IDX = 1 +regGUS_L1_CH1_DATA_U_OUT = 0x2c51 +regGUS_L1_CH1_DATA_U_OUT_BASE_IDX = 1 +regGUS_L1_SA0_CMD_IN = 0x2c52 +regGUS_L1_SA0_CMD_IN_BASE_IDX = 1 +regGUS_L1_SA0_CMD_OUT = 0x2c53 +regGUS_L1_SA0_CMD_OUT_BASE_IDX = 1 +regGUS_L1_SA0_DATA_IN = 0x2c54 +regGUS_L1_SA0_DATA_IN_BASE_IDX = 1 +regGUS_L1_SA0_DATA_OUT = 0x2c55 +regGUS_L1_SA0_DATA_OUT_BASE_IDX = 1 +regGUS_L1_SA0_DATA_U_IN = 0x2c56 +regGUS_L1_SA0_DATA_U_IN_BASE_IDX = 1 +regGUS_L1_SA0_DATA_U_OUT = 0x2c57 +regGUS_L1_SA0_DATA_U_OUT_BASE_IDX = 1 +regGUS_L1_SA1_CMD_IN = 0x2c58 +regGUS_L1_SA1_CMD_IN_BASE_IDX = 1 +regGUS_L1_SA1_CMD_OUT = 0x2c59 +regGUS_L1_SA1_CMD_OUT_BASE_IDX = 1 +regGUS_L1_SA1_DATA_IN = 0x2c5a +regGUS_L1_SA1_DATA_IN_BASE_IDX = 1 +regGUS_L1_SA1_DATA_OUT = 0x2c5b +regGUS_L1_SA1_DATA_OUT_BASE_IDX = 1 +regGUS_L1_SA1_DATA_U_IN = 0x2c5c +regGUS_L1_SA1_DATA_U_IN_BASE_IDX = 1 +regGUS_L1_SA1_DATA_U_OUT = 0x2c5d +regGUS_L1_SA1_DATA_U_OUT_BASE_IDX = 1 +regGUS_L1_SA2_CMD_IN = 0x2c5e +regGUS_L1_SA2_CMD_IN_BASE_IDX = 1 +regGUS_L1_SA2_CMD_OUT = 0x2c5f +regGUS_L1_SA2_CMD_OUT_BASE_IDX = 1 +regGUS_L1_SA2_DATA_IN = 0x2c60 +regGUS_L1_SA2_DATA_IN_BASE_IDX = 1 +regGUS_L1_SA2_DATA_OUT = 0x2c61 +regGUS_L1_SA2_DATA_OUT_BASE_IDX = 1 +regGUS_L1_SA2_DATA_U_IN = 0x2c62 +regGUS_L1_SA2_DATA_U_IN_BASE_IDX = 1 +regGUS_L1_SA2_DATA_U_OUT = 0x2c63 +regGUS_L1_SA2_DATA_U_OUT_BASE_IDX = 1 +regGUS_L1_SA3_CMD_IN = 0x2c64 +regGUS_L1_SA3_CMD_IN_BASE_IDX = 1 +regGUS_L1_SA3_CMD_OUT = 0x2c65 +regGUS_L1_SA3_CMD_OUT_BASE_IDX = 1 +regGUS_L1_SA3_DATA_IN = 0x2c66 +regGUS_L1_SA3_DATA_IN_BASE_IDX = 1 +regGUS_L1_SA3_DATA_OUT = 0x2c67 +regGUS_L1_SA3_DATA_OUT_BASE_IDX = 1 +regGUS_L1_SA3_DATA_U_IN = 0x2c68 +regGUS_L1_SA3_DATA_U_IN_BASE_IDX = 1 +regGUS_L1_SA3_DATA_U_OUT = 0x2c69 +regGUS_L1_SA3_DATA_U_OUT_BASE_IDX = 1 +regGUS_MISC3 = 0x2c6a +regGUS_MISC3_BASE_IDX = 1 +regGUS_WRRSP_FIFO_CNTL = 0x2c6b +regGUS_WRRSP_FIFO_CNTL_BASE_IDX = 1 +regDB_RENDER_CONTROL = 0x0000 +regDB_RENDER_CONTROL_BASE_IDX = 1 +regDB_COUNT_CONTROL = 0x0001 +regDB_COUNT_CONTROL_BASE_IDX = 1 +regDB_DEPTH_VIEW = 0x0002 +regDB_DEPTH_VIEW_BASE_IDX = 1 +regDB_RENDER_OVERRIDE = 0x0003 +regDB_RENDER_OVERRIDE_BASE_IDX = 1 +regDB_RENDER_OVERRIDE2 = 0x0004 +regDB_RENDER_OVERRIDE2_BASE_IDX = 1 +regDB_HTILE_DATA_BASE = 0x0005 +regDB_HTILE_DATA_BASE_BASE_IDX = 1 +regDB_DEPTH_SIZE_XY = 0x0007 +regDB_DEPTH_SIZE_XY_BASE_IDX = 1 +regDB_DEPTH_BOUNDS_MIN = 0x0008 +regDB_DEPTH_BOUNDS_MIN_BASE_IDX = 1 +regDB_DEPTH_BOUNDS_MAX = 0x0009 +regDB_DEPTH_BOUNDS_MAX_BASE_IDX = 1 +regDB_STENCIL_CLEAR = 0x000a +regDB_STENCIL_CLEAR_BASE_IDX = 1 +regDB_DEPTH_CLEAR = 0x000b +regDB_DEPTH_CLEAR_BASE_IDX = 1 +regPA_SC_SCREEN_SCISSOR_TL = 0x000c +regPA_SC_SCREEN_SCISSOR_TL_BASE_IDX = 1 +regPA_SC_SCREEN_SCISSOR_BR = 0x000d +regPA_SC_SCREEN_SCISSOR_BR_BASE_IDX = 1 +regDB_RESERVED_REG_2 = 0x000f +regDB_RESERVED_REG_2_BASE_IDX = 1 +regDB_Z_INFO = 0x0010 +regDB_Z_INFO_BASE_IDX = 1 +regDB_STENCIL_INFO = 0x0011 +regDB_STENCIL_INFO_BASE_IDX = 1 +regDB_Z_READ_BASE = 0x0012 +regDB_Z_READ_BASE_BASE_IDX = 1 +regDB_STENCIL_READ_BASE = 0x0013 +regDB_STENCIL_READ_BASE_BASE_IDX = 1 +regDB_Z_WRITE_BASE = 0x0014 +regDB_Z_WRITE_BASE_BASE_IDX = 1 +regDB_STENCIL_WRITE_BASE = 0x0015 +regDB_STENCIL_WRITE_BASE_BASE_IDX = 1 +regDB_RESERVED_REG_1 = 0x0016 +regDB_RESERVED_REG_1_BASE_IDX = 1 +regDB_RESERVED_REG_3 = 0x0017 +regDB_RESERVED_REG_3_BASE_IDX = 1 +regDB_Z_READ_BASE_HI = 0x001a +regDB_Z_READ_BASE_HI_BASE_IDX = 1 +regDB_STENCIL_READ_BASE_HI = 0x001b +regDB_STENCIL_READ_BASE_HI_BASE_IDX = 1 +regDB_Z_WRITE_BASE_HI = 0x001c +regDB_Z_WRITE_BASE_HI_BASE_IDX = 1 +regDB_STENCIL_WRITE_BASE_HI = 0x001d +regDB_STENCIL_WRITE_BASE_HI_BASE_IDX = 1 +regDB_HTILE_DATA_BASE_HI = 0x001e +regDB_HTILE_DATA_BASE_HI_BASE_IDX = 1 +regDB_RMI_L2_CACHE_CONTROL = 0x001f +regDB_RMI_L2_CACHE_CONTROL_BASE_IDX = 1 +regTA_BC_BASE_ADDR = 0x0020 +regTA_BC_BASE_ADDR_BASE_IDX = 1 +regTA_BC_BASE_ADDR_HI = 0x0021 +regTA_BC_BASE_ADDR_HI_BASE_IDX = 1 +regCOHER_DEST_BASE_HI_0 = 0x007a +regCOHER_DEST_BASE_HI_0_BASE_IDX = 1 +regCOHER_DEST_BASE_HI_1 = 0x007b +regCOHER_DEST_BASE_HI_1_BASE_IDX = 1 +regCOHER_DEST_BASE_HI_2 = 0x007c +regCOHER_DEST_BASE_HI_2_BASE_IDX = 1 +regCOHER_DEST_BASE_HI_3 = 0x007d +regCOHER_DEST_BASE_HI_3_BASE_IDX = 1 +regCOHER_DEST_BASE_2 = 0x007e +regCOHER_DEST_BASE_2_BASE_IDX = 1 +regCOHER_DEST_BASE_3 = 0x007f +regCOHER_DEST_BASE_3_BASE_IDX = 1 +regPA_SC_WINDOW_OFFSET = 0x0080 +regPA_SC_WINDOW_OFFSET_BASE_IDX = 1 +regPA_SC_WINDOW_SCISSOR_TL = 0x0081 +regPA_SC_WINDOW_SCISSOR_TL_BASE_IDX = 1 +regPA_SC_WINDOW_SCISSOR_BR = 0x0082 +regPA_SC_WINDOW_SCISSOR_BR_BASE_IDX = 1 +regPA_SC_CLIPRECT_RULE = 0x0083 +regPA_SC_CLIPRECT_RULE_BASE_IDX = 1 +regPA_SC_CLIPRECT_0_TL = 0x0084 +regPA_SC_CLIPRECT_0_TL_BASE_IDX = 1 +regPA_SC_CLIPRECT_0_BR = 0x0085 +regPA_SC_CLIPRECT_0_BR_BASE_IDX = 1 +regPA_SC_CLIPRECT_1_TL = 0x0086 +regPA_SC_CLIPRECT_1_TL_BASE_IDX = 1 +regPA_SC_CLIPRECT_1_BR = 0x0087 +regPA_SC_CLIPRECT_1_BR_BASE_IDX = 1 +regPA_SC_CLIPRECT_2_TL = 0x0088 +regPA_SC_CLIPRECT_2_TL_BASE_IDX = 1 +regPA_SC_CLIPRECT_2_BR = 0x0089 +regPA_SC_CLIPRECT_2_BR_BASE_IDX = 1 +regPA_SC_CLIPRECT_3_TL = 0x008a +regPA_SC_CLIPRECT_3_TL_BASE_IDX = 1 +regPA_SC_CLIPRECT_3_BR = 0x008b +regPA_SC_CLIPRECT_3_BR_BASE_IDX = 1 +regPA_SC_EDGERULE = 0x008c +regPA_SC_EDGERULE_BASE_IDX = 1 +regPA_SU_HARDWARE_SCREEN_OFFSET = 0x008d +regPA_SU_HARDWARE_SCREEN_OFFSET_BASE_IDX = 1 +regCB_TARGET_MASK = 0x008e +regCB_TARGET_MASK_BASE_IDX = 1 +regCB_SHADER_MASK = 0x008f +regCB_SHADER_MASK_BASE_IDX = 1 +regPA_SC_GENERIC_SCISSOR_TL = 0x0090 +regPA_SC_GENERIC_SCISSOR_TL_BASE_IDX = 1 +regPA_SC_GENERIC_SCISSOR_BR = 0x0091 +regPA_SC_GENERIC_SCISSOR_BR_BASE_IDX = 1 +regCOHER_DEST_BASE_0 = 0x0092 +regCOHER_DEST_BASE_0_BASE_IDX = 1 +regCOHER_DEST_BASE_1 = 0x0093 +regCOHER_DEST_BASE_1_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_0_TL = 0x0094 +regPA_SC_VPORT_SCISSOR_0_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_0_BR = 0x0095 +regPA_SC_VPORT_SCISSOR_0_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_1_TL = 0x0096 +regPA_SC_VPORT_SCISSOR_1_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_1_BR = 0x0097 +regPA_SC_VPORT_SCISSOR_1_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_2_TL = 0x0098 +regPA_SC_VPORT_SCISSOR_2_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_2_BR = 0x0099 +regPA_SC_VPORT_SCISSOR_2_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_3_TL = 0x009a +regPA_SC_VPORT_SCISSOR_3_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_3_BR = 0x009b +regPA_SC_VPORT_SCISSOR_3_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_4_TL = 0x009c +regPA_SC_VPORT_SCISSOR_4_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_4_BR = 0x009d +regPA_SC_VPORT_SCISSOR_4_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_5_TL = 0x009e +regPA_SC_VPORT_SCISSOR_5_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_5_BR = 0x009f +regPA_SC_VPORT_SCISSOR_5_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_6_TL = 0x00a0 +regPA_SC_VPORT_SCISSOR_6_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_6_BR = 0x00a1 +regPA_SC_VPORT_SCISSOR_6_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_7_TL = 0x00a2 +regPA_SC_VPORT_SCISSOR_7_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_7_BR = 0x00a3 +regPA_SC_VPORT_SCISSOR_7_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_8_TL = 0x00a4 +regPA_SC_VPORT_SCISSOR_8_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_8_BR = 0x00a5 +regPA_SC_VPORT_SCISSOR_8_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_9_TL = 0x00a6 +regPA_SC_VPORT_SCISSOR_9_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_9_BR = 0x00a7 +regPA_SC_VPORT_SCISSOR_9_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_10_TL = 0x00a8 +regPA_SC_VPORT_SCISSOR_10_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_10_BR = 0x00a9 +regPA_SC_VPORT_SCISSOR_10_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_11_TL = 0x00aa +regPA_SC_VPORT_SCISSOR_11_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_11_BR = 0x00ab +regPA_SC_VPORT_SCISSOR_11_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_12_TL = 0x00ac +regPA_SC_VPORT_SCISSOR_12_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_12_BR = 0x00ad +regPA_SC_VPORT_SCISSOR_12_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_13_TL = 0x00ae +regPA_SC_VPORT_SCISSOR_13_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_13_BR = 0x00af +regPA_SC_VPORT_SCISSOR_13_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_14_TL = 0x00b0 +regPA_SC_VPORT_SCISSOR_14_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_14_BR = 0x00b1 +regPA_SC_VPORT_SCISSOR_14_BR_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_15_TL = 0x00b2 +regPA_SC_VPORT_SCISSOR_15_TL_BASE_IDX = 1 +regPA_SC_VPORT_SCISSOR_15_BR = 0x00b3 +regPA_SC_VPORT_SCISSOR_15_BR_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_0 = 0x00b4 +regPA_SC_VPORT_ZMIN_0_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_0 = 0x00b5 +regPA_SC_VPORT_ZMAX_0_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_1 = 0x00b6 +regPA_SC_VPORT_ZMIN_1_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_1 = 0x00b7 +regPA_SC_VPORT_ZMAX_1_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_2 = 0x00b8 +regPA_SC_VPORT_ZMIN_2_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_2 = 0x00b9 +regPA_SC_VPORT_ZMAX_2_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_3 = 0x00ba +regPA_SC_VPORT_ZMIN_3_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_3 = 0x00bb +regPA_SC_VPORT_ZMAX_3_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_4 = 0x00bc +regPA_SC_VPORT_ZMIN_4_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_4 = 0x00bd +regPA_SC_VPORT_ZMAX_4_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_5 = 0x00be +regPA_SC_VPORT_ZMIN_5_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_5 = 0x00bf +regPA_SC_VPORT_ZMAX_5_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_6 = 0x00c0 +regPA_SC_VPORT_ZMIN_6_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_6 = 0x00c1 +regPA_SC_VPORT_ZMAX_6_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_7 = 0x00c2 +regPA_SC_VPORT_ZMIN_7_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_7 = 0x00c3 +regPA_SC_VPORT_ZMAX_7_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_8 = 0x00c4 +regPA_SC_VPORT_ZMIN_8_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_8 = 0x00c5 +regPA_SC_VPORT_ZMAX_8_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_9 = 0x00c6 +regPA_SC_VPORT_ZMIN_9_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_9 = 0x00c7 +regPA_SC_VPORT_ZMAX_9_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_10 = 0x00c8 +regPA_SC_VPORT_ZMIN_10_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_10 = 0x00c9 +regPA_SC_VPORT_ZMAX_10_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_11 = 0x00ca +regPA_SC_VPORT_ZMIN_11_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_11 = 0x00cb +regPA_SC_VPORT_ZMAX_11_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_12 = 0x00cc +regPA_SC_VPORT_ZMIN_12_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_12 = 0x00cd +regPA_SC_VPORT_ZMAX_12_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_13 = 0x00ce +regPA_SC_VPORT_ZMIN_13_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_13 = 0x00cf +regPA_SC_VPORT_ZMAX_13_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_14 = 0x00d0 +regPA_SC_VPORT_ZMIN_14_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_14 = 0x00d1 +regPA_SC_VPORT_ZMAX_14_BASE_IDX = 1 +regPA_SC_VPORT_ZMIN_15 = 0x00d2 +regPA_SC_VPORT_ZMIN_15_BASE_IDX = 1 +regPA_SC_VPORT_ZMAX_15 = 0x00d3 +regPA_SC_VPORT_ZMAX_15_BASE_IDX = 1 +regPA_SC_RASTER_CONFIG = 0x00d4 +regPA_SC_RASTER_CONFIG_BASE_IDX = 1 +regPA_SC_RASTER_CONFIG_1 = 0x00d5 +regPA_SC_RASTER_CONFIG_1_BASE_IDX = 1 +regPA_SC_SCREEN_EXTENT_CONTROL = 0x00d6 +regPA_SC_SCREEN_EXTENT_CONTROL_BASE_IDX = 1 +regPA_SC_TILE_STEERING_OVERRIDE = 0x00d7 +regPA_SC_TILE_STEERING_OVERRIDE_BASE_IDX = 1 +regCP_PERFMON_CNTX_CNTL = 0x00d8 +regCP_PERFMON_CNTX_CNTL_BASE_IDX = 1 +regCP_PIPEID = 0x00d9 +regCP_PIPEID_BASE_IDX = 1 +regCP_RINGID = 0x00d9 +regCP_RINGID_BASE_IDX = 1 +regCP_VMID = 0x00da +regCP_VMID_BASE_IDX = 1 +regCONTEXT_RESERVED_REG0 = 0x00db +regCONTEXT_RESERVED_REG0_BASE_IDX = 1 +regCONTEXT_RESERVED_REG1 = 0x00dc +regCONTEXT_RESERVED_REG1_BASE_IDX = 1 +regPA_SC_VRS_OVERRIDE_CNTL = 0x00f4 +regPA_SC_VRS_OVERRIDE_CNTL_BASE_IDX = 1 +regPA_SC_VRS_RATE_FEEDBACK_BASE = 0x00f5 +regPA_SC_VRS_RATE_FEEDBACK_BASE_BASE_IDX = 1 +regPA_SC_VRS_RATE_FEEDBACK_BASE_EXT = 0x00f6 +regPA_SC_VRS_RATE_FEEDBACK_BASE_EXT_BASE_IDX = 1 +regPA_SC_VRS_RATE_FEEDBACK_SIZE_XY = 0x00f7 +regPA_SC_VRS_RATE_FEEDBACK_SIZE_XY_BASE_IDX = 1 +regPA_SC_VRS_RATE_CACHE_CNTL = 0x00f9 +regPA_SC_VRS_RATE_CACHE_CNTL_BASE_IDX = 1 +regPA_SC_VRS_RATE_BASE = 0x00fc +regPA_SC_VRS_RATE_BASE_BASE_IDX = 1 +regPA_SC_VRS_RATE_BASE_EXT = 0x00fd +regPA_SC_VRS_RATE_BASE_EXT_BASE_IDX = 1 +regPA_SC_VRS_RATE_SIZE_XY = 0x00fe +regPA_SC_VRS_RATE_SIZE_XY_BASE_IDX = 1 +regVGT_MULTI_PRIM_IB_RESET_INDX = 0x0103 +regVGT_MULTI_PRIM_IB_RESET_INDX_BASE_IDX = 1 +regCB_RMI_GL2_CACHE_CONTROL = 0x0104 +regCB_RMI_GL2_CACHE_CONTROL_BASE_IDX = 1 +regCB_BLEND_RED = 0x0105 +regCB_BLEND_RED_BASE_IDX = 1 +regCB_BLEND_GREEN = 0x0106 +regCB_BLEND_GREEN_BASE_IDX = 1 +regCB_BLEND_BLUE = 0x0107 +regCB_BLEND_BLUE_BASE_IDX = 1 +regCB_BLEND_ALPHA = 0x0108 +regCB_BLEND_ALPHA_BASE_IDX = 1 +regCB_FDCC_CONTROL = 0x0109 +regCB_FDCC_CONTROL_BASE_IDX = 1 +regCB_COVERAGE_OUT_CONTROL = 0x010a +regCB_COVERAGE_OUT_CONTROL_BASE_IDX = 1 +regDB_STENCIL_CONTROL = 0x010b +regDB_STENCIL_CONTROL_BASE_IDX = 1 +regDB_STENCILREFMASK = 0x010c +regDB_STENCILREFMASK_BASE_IDX = 1 +regDB_STENCILREFMASK_BF = 0x010d +regDB_STENCILREFMASK_BF_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE = 0x010f +regPA_CL_VPORT_XSCALE_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET = 0x0110 +regPA_CL_VPORT_XOFFSET_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE = 0x0111 +regPA_CL_VPORT_YSCALE_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET = 0x0112 +regPA_CL_VPORT_YOFFSET_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE = 0x0113 +regPA_CL_VPORT_ZSCALE_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET = 0x0114 +regPA_CL_VPORT_ZOFFSET_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_1 = 0x0115 +regPA_CL_VPORT_XSCALE_1_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_1 = 0x0116 +regPA_CL_VPORT_XOFFSET_1_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_1 = 0x0117 +regPA_CL_VPORT_YSCALE_1_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_1 = 0x0118 +regPA_CL_VPORT_YOFFSET_1_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_1 = 0x0119 +regPA_CL_VPORT_ZSCALE_1_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_1 = 0x011a +regPA_CL_VPORT_ZOFFSET_1_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_2 = 0x011b +regPA_CL_VPORT_XSCALE_2_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_2 = 0x011c +regPA_CL_VPORT_XOFFSET_2_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_2 = 0x011d +regPA_CL_VPORT_YSCALE_2_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_2 = 0x011e +regPA_CL_VPORT_YOFFSET_2_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_2 = 0x011f +regPA_CL_VPORT_ZSCALE_2_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_2 = 0x0120 +regPA_CL_VPORT_ZOFFSET_2_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_3 = 0x0121 +regPA_CL_VPORT_XSCALE_3_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_3 = 0x0122 +regPA_CL_VPORT_XOFFSET_3_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_3 = 0x0123 +regPA_CL_VPORT_YSCALE_3_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_3 = 0x0124 +regPA_CL_VPORT_YOFFSET_3_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_3 = 0x0125 +regPA_CL_VPORT_ZSCALE_3_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_3 = 0x0126 +regPA_CL_VPORT_ZOFFSET_3_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_4 = 0x0127 +regPA_CL_VPORT_XSCALE_4_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_4 = 0x0128 +regPA_CL_VPORT_XOFFSET_4_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_4 = 0x0129 +regPA_CL_VPORT_YSCALE_4_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_4 = 0x012a +regPA_CL_VPORT_YOFFSET_4_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_4 = 0x012b +regPA_CL_VPORT_ZSCALE_4_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_4 = 0x012c +regPA_CL_VPORT_ZOFFSET_4_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_5 = 0x012d +regPA_CL_VPORT_XSCALE_5_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_5 = 0x012e +regPA_CL_VPORT_XOFFSET_5_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_5 = 0x012f +regPA_CL_VPORT_YSCALE_5_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_5 = 0x0130 +regPA_CL_VPORT_YOFFSET_5_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_5 = 0x0131 +regPA_CL_VPORT_ZSCALE_5_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_5 = 0x0132 +regPA_CL_VPORT_ZOFFSET_5_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_6 = 0x0133 +regPA_CL_VPORT_XSCALE_6_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_6 = 0x0134 +regPA_CL_VPORT_XOFFSET_6_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_6 = 0x0135 +regPA_CL_VPORT_YSCALE_6_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_6 = 0x0136 +regPA_CL_VPORT_YOFFSET_6_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_6 = 0x0137 +regPA_CL_VPORT_ZSCALE_6_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_6 = 0x0138 +regPA_CL_VPORT_ZOFFSET_6_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_7 = 0x0139 +regPA_CL_VPORT_XSCALE_7_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_7 = 0x013a +regPA_CL_VPORT_XOFFSET_7_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_7 = 0x013b +regPA_CL_VPORT_YSCALE_7_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_7 = 0x013c +regPA_CL_VPORT_YOFFSET_7_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_7 = 0x013d +regPA_CL_VPORT_ZSCALE_7_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_7 = 0x013e +regPA_CL_VPORT_ZOFFSET_7_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_8 = 0x013f +regPA_CL_VPORT_XSCALE_8_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_8 = 0x0140 +regPA_CL_VPORT_XOFFSET_8_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_8 = 0x0141 +regPA_CL_VPORT_YSCALE_8_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_8 = 0x0142 +regPA_CL_VPORT_YOFFSET_8_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_8 = 0x0143 +regPA_CL_VPORT_ZSCALE_8_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_8 = 0x0144 +regPA_CL_VPORT_ZOFFSET_8_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_9 = 0x0145 +regPA_CL_VPORT_XSCALE_9_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_9 = 0x0146 +regPA_CL_VPORT_XOFFSET_9_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_9 = 0x0147 +regPA_CL_VPORT_YSCALE_9_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_9 = 0x0148 +regPA_CL_VPORT_YOFFSET_9_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_9 = 0x0149 +regPA_CL_VPORT_ZSCALE_9_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_9 = 0x014a +regPA_CL_VPORT_ZOFFSET_9_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_10 = 0x014b +regPA_CL_VPORT_XSCALE_10_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_10 = 0x014c +regPA_CL_VPORT_XOFFSET_10_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_10 = 0x014d +regPA_CL_VPORT_YSCALE_10_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_10 = 0x014e +regPA_CL_VPORT_YOFFSET_10_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_10 = 0x014f +regPA_CL_VPORT_ZSCALE_10_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_10 = 0x0150 +regPA_CL_VPORT_ZOFFSET_10_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_11 = 0x0151 +regPA_CL_VPORT_XSCALE_11_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_11 = 0x0152 +regPA_CL_VPORT_XOFFSET_11_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_11 = 0x0153 +regPA_CL_VPORT_YSCALE_11_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_11 = 0x0154 +regPA_CL_VPORT_YOFFSET_11_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_11 = 0x0155 +regPA_CL_VPORT_ZSCALE_11_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_11 = 0x0156 +regPA_CL_VPORT_ZOFFSET_11_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_12 = 0x0157 +regPA_CL_VPORT_XSCALE_12_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_12 = 0x0158 +regPA_CL_VPORT_XOFFSET_12_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_12 = 0x0159 +regPA_CL_VPORT_YSCALE_12_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_12 = 0x015a +regPA_CL_VPORT_YOFFSET_12_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_12 = 0x015b +regPA_CL_VPORT_ZSCALE_12_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_12 = 0x015c +regPA_CL_VPORT_ZOFFSET_12_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_13 = 0x015d +regPA_CL_VPORT_XSCALE_13_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_13 = 0x015e +regPA_CL_VPORT_XOFFSET_13_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_13 = 0x015f +regPA_CL_VPORT_YSCALE_13_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_13 = 0x0160 +regPA_CL_VPORT_YOFFSET_13_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_13 = 0x0161 +regPA_CL_VPORT_ZSCALE_13_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_13 = 0x0162 +regPA_CL_VPORT_ZOFFSET_13_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_14 = 0x0163 +regPA_CL_VPORT_XSCALE_14_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_14 = 0x0164 +regPA_CL_VPORT_XOFFSET_14_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_14 = 0x0165 +regPA_CL_VPORT_YSCALE_14_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_14 = 0x0166 +regPA_CL_VPORT_YOFFSET_14_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_14 = 0x0167 +regPA_CL_VPORT_ZSCALE_14_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_14 = 0x0168 +regPA_CL_VPORT_ZOFFSET_14_BASE_IDX = 1 +regPA_CL_VPORT_XSCALE_15 = 0x0169 +regPA_CL_VPORT_XSCALE_15_BASE_IDX = 1 +regPA_CL_VPORT_XOFFSET_15 = 0x016a +regPA_CL_VPORT_XOFFSET_15_BASE_IDX = 1 +regPA_CL_VPORT_YSCALE_15 = 0x016b +regPA_CL_VPORT_YSCALE_15_BASE_IDX = 1 +regPA_CL_VPORT_YOFFSET_15 = 0x016c +regPA_CL_VPORT_YOFFSET_15_BASE_IDX = 1 +regPA_CL_VPORT_ZSCALE_15 = 0x016d +regPA_CL_VPORT_ZSCALE_15_BASE_IDX = 1 +regPA_CL_VPORT_ZOFFSET_15 = 0x016e +regPA_CL_VPORT_ZOFFSET_15_BASE_IDX = 1 +regPA_CL_UCP_0_X = 0x016f +regPA_CL_UCP_0_X_BASE_IDX = 1 +regPA_CL_UCP_0_Y = 0x0170 +regPA_CL_UCP_0_Y_BASE_IDX = 1 +regPA_CL_UCP_0_Z = 0x0171 +regPA_CL_UCP_0_Z_BASE_IDX = 1 +regPA_CL_UCP_0_W = 0x0172 +regPA_CL_UCP_0_W_BASE_IDX = 1 +regPA_CL_UCP_1_X = 0x0173 +regPA_CL_UCP_1_X_BASE_IDX = 1 +regPA_CL_UCP_1_Y = 0x0174 +regPA_CL_UCP_1_Y_BASE_IDX = 1 +regPA_CL_UCP_1_Z = 0x0175 +regPA_CL_UCP_1_Z_BASE_IDX = 1 +regPA_CL_UCP_1_W = 0x0176 +regPA_CL_UCP_1_W_BASE_IDX = 1 +regPA_CL_UCP_2_X = 0x0177 +regPA_CL_UCP_2_X_BASE_IDX = 1 +regPA_CL_UCP_2_Y = 0x0178 +regPA_CL_UCP_2_Y_BASE_IDX = 1 +regPA_CL_UCP_2_Z = 0x0179 +regPA_CL_UCP_2_Z_BASE_IDX = 1 +regPA_CL_UCP_2_W = 0x017a +regPA_CL_UCP_2_W_BASE_IDX = 1 +regPA_CL_UCP_3_X = 0x017b +regPA_CL_UCP_3_X_BASE_IDX = 1 +regPA_CL_UCP_3_Y = 0x017c +regPA_CL_UCP_3_Y_BASE_IDX = 1 +regPA_CL_UCP_3_Z = 0x017d +regPA_CL_UCP_3_Z_BASE_IDX = 1 +regPA_CL_UCP_3_W = 0x017e +regPA_CL_UCP_3_W_BASE_IDX = 1 +regPA_CL_UCP_4_X = 0x017f +regPA_CL_UCP_4_X_BASE_IDX = 1 +regPA_CL_UCP_4_Y = 0x0180 +regPA_CL_UCP_4_Y_BASE_IDX = 1 +regPA_CL_UCP_4_Z = 0x0181 +regPA_CL_UCP_4_Z_BASE_IDX = 1 +regPA_CL_UCP_4_W = 0x0182 +regPA_CL_UCP_4_W_BASE_IDX = 1 +regPA_CL_UCP_5_X = 0x0183 +regPA_CL_UCP_5_X_BASE_IDX = 1 +regPA_CL_UCP_5_Y = 0x0184 +regPA_CL_UCP_5_Y_BASE_IDX = 1 +regPA_CL_UCP_5_Z = 0x0185 +regPA_CL_UCP_5_Z_BASE_IDX = 1 +regPA_CL_UCP_5_W = 0x0186 +regPA_CL_UCP_5_W_BASE_IDX = 1 +regPA_CL_PROG_NEAR_CLIP_Z = 0x0187 +regPA_CL_PROG_NEAR_CLIP_Z_BASE_IDX = 1 +regPA_RATE_CNTL = 0x0188 +regPA_RATE_CNTL_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_0 = 0x0191 +regSPI_PS_INPUT_CNTL_0_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_1 = 0x0192 +regSPI_PS_INPUT_CNTL_1_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_2 = 0x0193 +regSPI_PS_INPUT_CNTL_2_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_3 = 0x0194 +regSPI_PS_INPUT_CNTL_3_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_4 = 0x0195 +regSPI_PS_INPUT_CNTL_4_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_5 = 0x0196 +regSPI_PS_INPUT_CNTL_5_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_6 = 0x0197 +regSPI_PS_INPUT_CNTL_6_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_7 = 0x0198 +regSPI_PS_INPUT_CNTL_7_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_8 = 0x0199 +regSPI_PS_INPUT_CNTL_8_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_9 = 0x019a +regSPI_PS_INPUT_CNTL_9_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_10 = 0x019b +regSPI_PS_INPUT_CNTL_10_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_11 = 0x019c +regSPI_PS_INPUT_CNTL_11_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_12 = 0x019d +regSPI_PS_INPUT_CNTL_12_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_13 = 0x019e +regSPI_PS_INPUT_CNTL_13_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_14 = 0x019f +regSPI_PS_INPUT_CNTL_14_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_15 = 0x01a0 +regSPI_PS_INPUT_CNTL_15_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_16 = 0x01a1 +regSPI_PS_INPUT_CNTL_16_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_17 = 0x01a2 +regSPI_PS_INPUT_CNTL_17_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_18 = 0x01a3 +regSPI_PS_INPUT_CNTL_18_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_19 = 0x01a4 +regSPI_PS_INPUT_CNTL_19_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_20 = 0x01a5 +regSPI_PS_INPUT_CNTL_20_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_21 = 0x01a6 +regSPI_PS_INPUT_CNTL_21_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_22 = 0x01a7 +regSPI_PS_INPUT_CNTL_22_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_23 = 0x01a8 +regSPI_PS_INPUT_CNTL_23_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_24 = 0x01a9 +regSPI_PS_INPUT_CNTL_24_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_25 = 0x01aa +regSPI_PS_INPUT_CNTL_25_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_26 = 0x01ab +regSPI_PS_INPUT_CNTL_26_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_27 = 0x01ac +regSPI_PS_INPUT_CNTL_27_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_28 = 0x01ad +regSPI_PS_INPUT_CNTL_28_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_29 = 0x01ae +regSPI_PS_INPUT_CNTL_29_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_30 = 0x01af +regSPI_PS_INPUT_CNTL_30_BASE_IDX = 1 +regSPI_PS_INPUT_CNTL_31 = 0x01b0 +regSPI_PS_INPUT_CNTL_31_BASE_IDX = 1 +regSPI_VS_OUT_CONFIG = 0x01b1 +regSPI_VS_OUT_CONFIG_BASE_IDX = 1 +regSPI_PS_INPUT_ENA = 0x01b3 +regSPI_PS_INPUT_ENA_BASE_IDX = 1 +regSPI_PS_INPUT_ADDR = 0x01b4 +regSPI_PS_INPUT_ADDR_BASE_IDX = 1 +regSPI_INTERP_CONTROL_0 = 0x01b5 +regSPI_INTERP_CONTROL_0_BASE_IDX = 1 +regSPI_PS_IN_CONTROL = 0x01b6 +regSPI_PS_IN_CONTROL_BASE_IDX = 1 +regSPI_BARYC_CNTL = 0x01b8 +regSPI_BARYC_CNTL_BASE_IDX = 1 +regSPI_TMPRING_SIZE = 0x01ba +regSPI_TMPRING_SIZE_BASE_IDX = 1 +regSPI_GFX_SCRATCH_BASE_LO = 0x01bb +regSPI_GFX_SCRATCH_BASE_LO_BASE_IDX = 1 +regSPI_GFX_SCRATCH_BASE_HI = 0x01bc +regSPI_GFX_SCRATCH_BASE_HI_BASE_IDX = 1 +regSPI_SHADER_IDX_FORMAT = 0x01c2 +regSPI_SHADER_IDX_FORMAT_BASE_IDX = 1 +regSPI_SHADER_POS_FORMAT = 0x01c3 +regSPI_SHADER_POS_FORMAT_BASE_IDX = 1 +regSPI_SHADER_Z_FORMAT = 0x01c4 +regSPI_SHADER_Z_FORMAT_BASE_IDX = 1 +regSPI_SHADER_COL_FORMAT = 0x01c5 +regSPI_SHADER_COL_FORMAT_BASE_IDX = 1 +regSX_PS_DOWNCONVERT_CONTROL = 0x01d4 +regSX_PS_DOWNCONVERT_CONTROL_BASE_IDX = 1 +regSX_PS_DOWNCONVERT = 0x01d5 +regSX_PS_DOWNCONVERT_BASE_IDX = 1 +regSX_BLEND_OPT_EPSILON = 0x01d6 +regSX_BLEND_OPT_EPSILON_BASE_IDX = 1 +regSX_BLEND_OPT_CONTROL = 0x01d7 +regSX_BLEND_OPT_CONTROL_BASE_IDX = 1 +regSX_MRT0_BLEND_OPT = 0x01d8 +regSX_MRT0_BLEND_OPT_BASE_IDX = 1 +regSX_MRT1_BLEND_OPT = 0x01d9 +regSX_MRT1_BLEND_OPT_BASE_IDX = 1 +regSX_MRT2_BLEND_OPT = 0x01da +regSX_MRT2_BLEND_OPT_BASE_IDX = 1 +regSX_MRT3_BLEND_OPT = 0x01db +regSX_MRT3_BLEND_OPT_BASE_IDX = 1 +regSX_MRT4_BLEND_OPT = 0x01dc +regSX_MRT4_BLEND_OPT_BASE_IDX = 1 +regSX_MRT5_BLEND_OPT = 0x01dd +regSX_MRT5_BLEND_OPT_BASE_IDX = 1 +regSX_MRT6_BLEND_OPT = 0x01de +regSX_MRT6_BLEND_OPT_BASE_IDX = 1 +regSX_MRT7_BLEND_OPT = 0x01df +regSX_MRT7_BLEND_OPT_BASE_IDX = 1 +regCB_BLEND0_CONTROL = 0x01e0 +regCB_BLEND0_CONTROL_BASE_IDX = 1 +regCB_BLEND1_CONTROL = 0x01e1 +regCB_BLEND1_CONTROL_BASE_IDX = 1 +regCB_BLEND2_CONTROL = 0x01e2 +regCB_BLEND2_CONTROL_BASE_IDX = 1 +regCB_BLEND3_CONTROL = 0x01e3 +regCB_BLEND3_CONTROL_BASE_IDX = 1 +regCB_BLEND4_CONTROL = 0x01e4 +regCB_BLEND4_CONTROL_BASE_IDX = 1 +regCB_BLEND5_CONTROL = 0x01e5 +regCB_BLEND5_CONTROL_BASE_IDX = 1 +regCB_BLEND6_CONTROL = 0x01e6 +regCB_BLEND6_CONTROL_BASE_IDX = 1 +regCB_BLEND7_CONTROL = 0x01e7 +regCB_BLEND7_CONTROL_BASE_IDX = 1 +regGFX_COPY_STATE = 0x01f4 +regGFX_COPY_STATE_BASE_IDX = 1 +regPA_CL_POINT_X_RAD = 0x01f5 +regPA_CL_POINT_X_RAD_BASE_IDX = 1 +regPA_CL_POINT_Y_RAD = 0x01f6 +regPA_CL_POINT_Y_RAD_BASE_IDX = 1 +regPA_CL_POINT_SIZE = 0x01f7 +regPA_CL_POINT_SIZE_BASE_IDX = 1 +regPA_CL_POINT_CULL_RAD = 0x01f8 +regPA_CL_POINT_CULL_RAD_BASE_IDX = 1 +regVGT_DMA_BASE_HI = 0x01f9 +regVGT_DMA_BASE_HI_BASE_IDX = 1 +regVGT_DMA_BASE = 0x01fa +regVGT_DMA_BASE_BASE_IDX = 1 +regVGT_DRAW_INITIATOR = 0x01fc +regVGT_DRAW_INITIATOR_BASE_IDX = 1 +regVGT_EVENT_ADDRESS_REG = 0x01fe +regVGT_EVENT_ADDRESS_REG_BASE_IDX = 1 +regGE_MAX_OUTPUT_PER_SUBGROUP = 0x01ff +regGE_MAX_OUTPUT_PER_SUBGROUP_BASE_IDX = 1 +regDB_DEPTH_CONTROL = 0x0200 +regDB_DEPTH_CONTROL_BASE_IDX = 1 +regDB_EQAA = 0x0201 +regDB_EQAA_BASE_IDX = 1 +regCB_COLOR_CONTROL = 0x0202 +regCB_COLOR_CONTROL_BASE_IDX = 1 +regDB_SHADER_CONTROL = 0x0203 +regDB_SHADER_CONTROL_BASE_IDX = 1 +regPA_CL_CLIP_CNTL = 0x0204 +regPA_CL_CLIP_CNTL_BASE_IDX = 1 +regPA_SU_SC_MODE_CNTL = 0x0205 +regPA_SU_SC_MODE_CNTL_BASE_IDX = 1 +regPA_CL_VTE_CNTL = 0x0206 +regPA_CL_VTE_CNTL_BASE_IDX = 1 +regPA_CL_VS_OUT_CNTL = 0x0207 +regPA_CL_VS_OUT_CNTL_BASE_IDX = 1 +regPA_CL_NANINF_CNTL = 0x0208 +regPA_CL_NANINF_CNTL_BASE_IDX = 1 +regPA_SU_LINE_STIPPLE_CNTL = 0x0209 +regPA_SU_LINE_STIPPLE_CNTL_BASE_IDX = 1 +regPA_SU_LINE_STIPPLE_SCALE = 0x020a +regPA_SU_LINE_STIPPLE_SCALE_BASE_IDX = 1 +regPA_SU_PRIM_FILTER_CNTL = 0x020b +regPA_SU_PRIM_FILTER_CNTL_BASE_IDX = 1 +regPA_SU_SMALL_PRIM_FILTER_CNTL = 0x020c +regPA_SU_SMALL_PRIM_FILTER_CNTL_BASE_IDX = 1 +regPA_CL_NGG_CNTL = 0x020e +regPA_CL_NGG_CNTL_BASE_IDX = 1 +regPA_SU_OVER_RASTERIZATION_CNTL = 0x020f +regPA_SU_OVER_RASTERIZATION_CNTL_BASE_IDX = 1 +regPA_STEREO_CNTL = 0x0210 +regPA_STEREO_CNTL_BASE_IDX = 1 +regPA_STATE_STEREO_X = 0x0211 +regPA_STATE_STEREO_X_BASE_IDX = 1 +regPA_CL_VRS_CNTL = 0x0212 +regPA_CL_VRS_CNTL_BASE_IDX = 1 +regPA_SU_POINT_SIZE = 0x0280 +regPA_SU_POINT_SIZE_BASE_IDX = 1 +regPA_SU_POINT_MINMAX = 0x0281 +regPA_SU_POINT_MINMAX_BASE_IDX = 1 +regPA_SU_LINE_CNTL = 0x0282 +regPA_SU_LINE_CNTL_BASE_IDX = 1 +regPA_SC_LINE_STIPPLE = 0x0283 +regPA_SC_LINE_STIPPLE_BASE_IDX = 1 +regVGT_HOS_MAX_TESS_LEVEL = 0x0286 +regVGT_HOS_MAX_TESS_LEVEL_BASE_IDX = 1 +regVGT_HOS_MIN_TESS_LEVEL = 0x0287 +regVGT_HOS_MIN_TESS_LEVEL_BASE_IDX = 1 +regPA_SC_MODE_CNTL_0 = 0x0292 +regPA_SC_MODE_CNTL_0_BASE_IDX = 1 +regPA_SC_MODE_CNTL_1 = 0x0293 +regPA_SC_MODE_CNTL_1_BASE_IDX = 1 +regVGT_ENHANCE = 0x0294 +regVGT_ENHANCE_BASE_IDX = 1 +regIA_ENHANCE = 0x029c +regIA_ENHANCE_BASE_IDX = 1 +regVGT_DMA_SIZE = 0x029d +regVGT_DMA_SIZE_BASE_IDX = 1 +regVGT_DMA_MAX_SIZE = 0x029e +regVGT_DMA_MAX_SIZE_BASE_IDX = 1 +regVGT_DMA_INDEX_TYPE = 0x029f +regVGT_DMA_INDEX_TYPE_BASE_IDX = 1 +regWD_ENHANCE = 0x02a0 +regWD_ENHANCE_BASE_IDX = 1 +regVGT_PRIMITIVEID_EN = 0x02a1 +regVGT_PRIMITIVEID_EN_BASE_IDX = 1 +regVGT_DMA_NUM_INSTANCES = 0x02a2 +regVGT_DMA_NUM_INSTANCES_BASE_IDX = 1 +regVGT_PRIMITIVEID_RESET = 0x02a3 +regVGT_PRIMITIVEID_RESET_BASE_IDX = 1 +regVGT_EVENT_INITIATOR = 0x02a4 +regVGT_EVENT_INITIATOR_BASE_IDX = 1 +regVGT_DRAW_PAYLOAD_CNTL = 0x02a6 +regVGT_DRAW_PAYLOAD_CNTL_BASE_IDX = 1 +regVGT_ESGS_RING_ITEMSIZE = 0x02ab +regVGT_ESGS_RING_ITEMSIZE_BASE_IDX = 1 +regVGT_REUSE_OFF = 0x02ad +regVGT_REUSE_OFF_BASE_IDX = 1 +regDB_HTILE_SURFACE = 0x02af +regDB_HTILE_SURFACE_BASE_IDX = 1 +regDB_SRESULTS_COMPARE_STATE0 = 0x02b0 +regDB_SRESULTS_COMPARE_STATE0_BASE_IDX = 1 +regDB_SRESULTS_COMPARE_STATE1 = 0x02b1 +regDB_SRESULTS_COMPARE_STATE1_BASE_IDX = 1 +regDB_PRELOAD_CONTROL = 0x02b2 +regDB_PRELOAD_CONTROL_BASE_IDX = 1 +regVGT_STRMOUT_DRAW_OPAQUE_OFFSET = 0x02ca +regVGT_STRMOUT_DRAW_OPAQUE_OFFSET_BASE_IDX = 1 +regVGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE = 0x02cb +regVGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE_BASE_IDX = 1 +regVGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE = 0x02cc +regVGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE_BASE_IDX = 1 +regVGT_GS_MAX_VERT_OUT = 0x02ce +regVGT_GS_MAX_VERT_OUT_BASE_IDX = 1 +regGE_NGG_SUBGRP_CNTL = 0x02d3 +regGE_NGG_SUBGRP_CNTL_BASE_IDX = 1 +regVGT_TESS_DISTRIBUTION = 0x02d4 +regVGT_TESS_DISTRIBUTION_BASE_IDX = 1 +regVGT_SHADER_STAGES_EN = 0x02d5 +regVGT_SHADER_STAGES_EN_BASE_IDX = 1 +regVGT_LS_HS_CONFIG = 0x02d6 +regVGT_LS_HS_CONFIG_BASE_IDX = 1 +regVGT_TF_PARAM = 0x02db +regVGT_TF_PARAM_BASE_IDX = 1 +regDB_ALPHA_TO_MASK = 0x02dc +regDB_ALPHA_TO_MASK_BASE_IDX = 1 +regPA_SU_POLY_OFFSET_DB_FMT_CNTL = 0x02de +regPA_SU_POLY_OFFSET_DB_FMT_CNTL_BASE_IDX = 1 +regPA_SU_POLY_OFFSET_CLAMP = 0x02df +regPA_SU_POLY_OFFSET_CLAMP_BASE_IDX = 1 +regPA_SU_POLY_OFFSET_FRONT_SCALE = 0x02e0 +regPA_SU_POLY_OFFSET_FRONT_SCALE_BASE_IDX = 1 +regPA_SU_POLY_OFFSET_FRONT_OFFSET = 0x02e1 +regPA_SU_POLY_OFFSET_FRONT_OFFSET_BASE_IDX = 1 +regPA_SU_POLY_OFFSET_BACK_SCALE = 0x02e2 +regPA_SU_POLY_OFFSET_BACK_SCALE_BASE_IDX = 1 +regPA_SU_POLY_OFFSET_BACK_OFFSET = 0x02e3 +regPA_SU_POLY_OFFSET_BACK_OFFSET_BASE_IDX = 1 +regVGT_GS_INSTANCE_CNT = 0x02e4 +regVGT_GS_INSTANCE_CNT_BASE_IDX = 1 +regPA_SC_CENTROID_PRIORITY_0 = 0x02f5 +regPA_SC_CENTROID_PRIORITY_0_BASE_IDX = 1 +regPA_SC_CENTROID_PRIORITY_1 = 0x02f6 +regPA_SC_CENTROID_PRIORITY_1_BASE_IDX = 1 +regPA_SC_LINE_CNTL = 0x02f7 +regPA_SC_LINE_CNTL_BASE_IDX = 1 +regPA_SC_AA_CONFIG = 0x02f8 +regPA_SC_AA_CONFIG_BASE_IDX = 1 +regPA_SU_VTX_CNTL = 0x02f9 +regPA_SU_VTX_CNTL_BASE_IDX = 1 +regPA_CL_GB_VERT_CLIP_ADJ = 0x02fa +regPA_CL_GB_VERT_CLIP_ADJ_BASE_IDX = 1 +regPA_CL_GB_VERT_DISC_ADJ = 0x02fb +regPA_CL_GB_VERT_DISC_ADJ_BASE_IDX = 1 +regPA_CL_GB_HORZ_CLIP_ADJ = 0x02fc +regPA_CL_GB_HORZ_CLIP_ADJ_BASE_IDX = 1 +regPA_CL_GB_HORZ_DISC_ADJ = 0x02fd +regPA_CL_GB_HORZ_DISC_ADJ_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0 = 0x02fe +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_1 = 0x02ff +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_1_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_2 = 0x0300 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_2_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_3 = 0x0301 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_3_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0 = 0x0302 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_1 = 0x0303 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_1_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_2 = 0x0304 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_2_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_3 = 0x0305 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_3_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0 = 0x0306 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_1 = 0x0307 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_1_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_2 = 0x0308 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_2_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_3 = 0x0309 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_3_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0 = 0x030a +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_1 = 0x030b +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_1_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_2 = 0x030c +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_2_BASE_IDX = 1 +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_3 = 0x030d +regPA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_3_BASE_IDX = 1 +regPA_SC_AA_MASK_X0Y0_X1Y0 = 0x030e +regPA_SC_AA_MASK_X0Y0_X1Y0_BASE_IDX = 1 +regPA_SC_AA_MASK_X0Y1_X1Y1 = 0x030f +regPA_SC_AA_MASK_X0Y1_X1Y1_BASE_IDX = 1 +regPA_SC_SHADER_CONTROL = 0x0310 +regPA_SC_SHADER_CONTROL_BASE_IDX = 1 +regPA_SC_BINNER_CNTL_0 = 0x0311 +regPA_SC_BINNER_CNTL_0_BASE_IDX = 1 +regPA_SC_BINNER_CNTL_1 = 0x0312 +regPA_SC_BINNER_CNTL_1_BASE_IDX = 1 +regPA_SC_CONSERVATIVE_RASTERIZATION_CNTL = 0x0313 +regPA_SC_CONSERVATIVE_RASTERIZATION_CNTL_BASE_IDX = 1 +regPA_SC_NGG_MODE_CNTL = 0x0314 +regPA_SC_NGG_MODE_CNTL_BASE_IDX = 1 +regPA_SC_BINNER_CNTL_2 = 0x0315 +regPA_SC_BINNER_CNTL_2_BASE_IDX = 1 +regCB_COLOR0_BASE = 0x0318 +regCB_COLOR0_BASE_BASE_IDX = 1 +regCB_COLOR0_VIEW = 0x031b +regCB_COLOR0_VIEW_BASE_IDX = 1 +regCB_COLOR0_INFO = 0x031c +regCB_COLOR0_INFO_BASE_IDX = 1 +regCB_COLOR0_ATTRIB = 0x031d +regCB_COLOR0_ATTRIB_BASE_IDX = 1 +regCB_COLOR0_FDCC_CONTROL = 0x031e +regCB_COLOR0_FDCC_CONTROL_BASE_IDX = 1 +regCB_COLOR0_DCC_BASE = 0x0325 +regCB_COLOR0_DCC_BASE_BASE_IDX = 1 +regCB_COLOR1_BASE = 0x0327 +regCB_COLOR1_BASE_BASE_IDX = 1 +regCB_COLOR1_VIEW = 0x032a +regCB_COLOR1_VIEW_BASE_IDX = 1 +regCB_COLOR1_INFO = 0x032b +regCB_COLOR1_INFO_BASE_IDX = 1 +regCB_COLOR1_ATTRIB = 0x032c +regCB_COLOR1_ATTRIB_BASE_IDX = 1 +regCB_COLOR1_FDCC_CONTROL = 0x032d +regCB_COLOR1_FDCC_CONTROL_BASE_IDX = 1 +regCB_COLOR1_DCC_BASE = 0x0334 +regCB_COLOR1_DCC_BASE_BASE_IDX = 1 +regCB_COLOR2_BASE = 0x0336 +regCB_COLOR2_BASE_BASE_IDX = 1 +regCB_COLOR2_VIEW = 0x0339 +regCB_COLOR2_VIEW_BASE_IDX = 1 +regCB_COLOR2_INFO = 0x033a +regCB_COLOR2_INFO_BASE_IDX = 1 +regCB_COLOR2_ATTRIB = 0x033b +regCB_COLOR2_ATTRIB_BASE_IDX = 1 +regCB_COLOR2_FDCC_CONTROL = 0x033c +regCB_COLOR2_FDCC_CONTROL_BASE_IDX = 1 +regCB_COLOR2_DCC_BASE = 0x0343 +regCB_COLOR2_DCC_BASE_BASE_IDX = 1 +regCB_COLOR3_BASE = 0x0345 +regCB_COLOR3_BASE_BASE_IDX = 1 +regCB_COLOR3_VIEW = 0x0348 +regCB_COLOR3_VIEW_BASE_IDX = 1 +regCB_COLOR3_INFO = 0x0349 +regCB_COLOR3_INFO_BASE_IDX = 1 +regCB_COLOR3_ATTRIB = 0x034a +regCB_COLOR3_ATTRIB_BASE_IDX = 1 +regCB_COLOR3_FDCC_CONTROL = 0x034b +regCB_COLOR3_FDCC_CONTROL_BASE_IDX = 1 +regCB_COLOR3_DCC_BASE = 0x0352 +regCB_COLOR3_DCC_BASE_BASE_IDX = 1 +regCB_COLOR4_BASE = 0x0354 +regCB_COLOR4_BASE_BASE_IDX = 1 +regCB_COLOR4_VIEW = 0x0357 +regCB_COLOR4_VIEW_BASE_IDX = 1 +regCB_COLOR4_INFO = 0x0358 +regCB_COLOR4_INFO_BASE_IDX = 1 +regCB_COLOR4_ATTRIB = 0x0359 +regCB_COLOR4_ATTRIB_BASE_IDX = 1 +regCB_COLOR4_FDCC_CONTROL = 0x035a +regCB_COLOR4_FDCC_CONTROL_BASE_IDX = 1 +regCB_COLOR4_DCC_BASE = 0x0361 +regCB_COLOR4_DCC_BASE_BASE_IDX = 1 +regCB_COLOR5_BASE = 0x0363 +regCB_COLOR5_BASE_BASE_IDX = 1 +regCB_COLOR5_VIEW = 0x0366 +regCB_COLOR5_VIEW_BASE_IDX = 1 +regCB_COLOR5_INFO = 0x0367 +regCB_COLOR5_INFO_BASE_IDX = 1 +regCB_COLOR5_ATTRIB = 0x0368 +regCB_COLOR5_ATTRIB_BASE_IDX = 1 +regCB_COLOR5_FDCC_CONTROL = 0x0369 +regCB_COLOR5_FDCC_CONTROL_BASE_IDX = 1 +regCB_COLOR5_DCC_BASE = 0x0370 +regCB_COLOR5_DCC_BASE_BASE_IDX = 1 +regCB_COLOR6_BASE = 0x0372 +regCB_COLOR6_BASE_BASE_IDX = 1 +regCB_COLOR6_VIEW = 0x0375 +regCB_COLOR6_VIEW_BASE_IDX = 1 +regCB_COLOR6_INFO = 0x0376 +regCB_COLOR6_INFO_BASE_IDX = 1 +regCB_COLOR6_ATTRIB = 0x0377 +regCB_COLOR6_ATTRIB_BASE_IDX = 1 +regCB_COLOR6_FDCC_CONTROL = 0x0378 +regCB_COLOR6_FDCC_CONTROL_BASE_IDX = 1 +regCB_COLOR6_DCC_BASE = 0x037f +regCB_COLOR6_DCC_BASE_BASE_IDX = 1 +regCB_COLOR7_BASE = 0x0381 +regCB_COLOR7_BASE_BASE_IDX = 1 +regCB_COLOR7_VIEW = 0x0384 +regCB_COLOR7_VIEW_BASE_IDX = 1 +regCB_COLOR7_INFO = 0x0385 +regCB_COLOR7_INFO_BASE_IDX = 1 +regCB_COLOR7_ATTRIB = 0x0386 +regCB_COLOR7_ATTRIB_BASE_IDX = 1 +regCB_COLOR7_FDCC_CONTROL = 0x0387 +regCB_COLOR7_FDCC_CONTROL_BASE_IDX = 1 +regCB_COLOR7_DCC_BASE = 0x038e +regCB_COLOR7_DCC_BASE_BASE_IDX = 1 +regCB_COLOR0_BASE_EXT = 0x0390 +regCB_COLOR0_BASE_EXT_BASE_IDX = 1 +regCB_COLOR1_BASE_EXT = 0x0391 +regCB_COLOR1_BASE_EXT_BASE_IDX = 1 +regCB_COLOR2_BASE_EXT = 0x0392 +regCB_COLOR2_BASE_EXT_BASE_IDX = 1 +regCB_COLOR3_BASE_EXT = 0x0393 +regCB_COLOR3_BASE_EXT_BASE_IDX = 1 +regCB_COLOR4_BASE_EXT = 0x0394 +regCB_COLOR4_BASE_EXT_BASE_IDX = 1 +regCB_COLOR5_BASE_EXT = 0x0395 +regCB_COLOR5_BASE_EXT_BASE_IDX = 1 +regCB_COLOR6_BASE_EXT = 0x0396 +regCB_COLOR6_BASE_EXT_BASE_IDX = 1 +regCB_COLOR7_BASE_EXT = 0x0397 +regCB_COLOR7_BASE_EXT_BASE_IDX = 1 +regCB_COLOR0_DCC_BASE_EXT = 0x03a8 +regCB_COLOR0_DCC_BASE_EXT_BASE_IDX = 1 +regCB_COLOR1_DCC_BASE_EXT = 0x03a9 +regCB_COLOR1_DCC_BASE_EXT_BASE_IDX = 1 +regCB_COLOR2_DCC_BASE_EXT = 0x03aa +regCB_COLOR2_DCC_BASE_EXT_BASE_IDX = 1 +regCB_COLOR3_DCC_BASE_EXT = 0x03ab +regCB_COLOR3_DCC_BASE_EXT_BASE_IDX = 1 +regCB_COLOR4_DCC_BASE_EXT = 0x03ac +regCB_COLOR4_DCC_BASE_EXT_BASE_IDX = 1 +regCB_COLOR5_DCC_BASE_EXT = 0x03ad +regCB_COLOR5_DCC_BASE_EXT_BASE_IDX = 1 +regCB_COLOR6_DCC_BASE_EXT = 0x03ae +regCB_COLOR6_DCC_BASE_EXT_BASE_IDX = 1 +regCB_COLOR7_DCC_BASE_EXT = 0x03af +regCB_COLOR7_DCC_BASE_EXT_BASE_IDX = 1 +regCB_COLOR0_ATTRIB2 = 0x03b0 +regCB_COLOR0_ATTRIB2_BASE_IDX = 1 +regCB_COLOR1_ATTRIB2 = 0x03b1 +regCB_COLOR1_ATTRIB2_BASE_IDX = 1 +regCB_COLOR2_ATTRIB2 = 0x03b2 +regCB_COLOR2_ATTRIB2_BASE_IDX = 1 +regCB_COLOR3_ATTRIB2 = 0x03b3 +regCB_COLOR3_ATTRIB2_BASE_IDX = 1 +regCB_COLOR4_ATTRIB2 = 0x03b4 +regCB_COLOR4_ATTRIB2_BASE_IDX = 1 +regCB_COLOR5_ATTRIB2 = 0x03b5 +regCB_COLOR5_ATTRIB2_BASE_IDX = 1 +regCB_COLOR6_ATTRIB2 = 0x03b6 +regCB_COLOR6_ATTRIB2_BASE_IDX = 1 +regCB_COLOR7_ATTRIB2 = 0x03b7 +regCB_COLOR7_ATTRIB2_BASE_IDX = 1 +regCB_COLOR0_ATTRIB3 = 0x03b8 +regCB_COLOR0_ATTRIB3_BASE_IDX = 1 +regCB_COLOR1_ATTRIB3 = 0x03b9 +regCB_COLOR1_ATTRIB3_BASE_IDX = 1 +regCB_COLOR2_ATTRIB3 = 0x03ba +regCB_COLOR2_ATTRIB3_BASE_IDX = 1 +regCB_COLOR3_ATTRIB3 = 0x03bb +regCB_COLOR3_ATTRIB3_BASE_IDX = 1 +regCB_COLOR4_ATTRIB3 = 0x03bc +regCB_COLOR4_ATTRIB3_BASE_IDX = 1 +regCB_COLOR5_ATTRIB3 = 0x03bd +regCB_COLOR5_ATTRIB3_BASE_IDX = 1 +regCB_COLOR6_ATTRIB3 = 0x03be +regCB_COLOR6_ATTRIB3_BASE_IDX = 1 +regCB_COLOR7_ATTRIB3 = 0x03bf +regCB_COLOR7_ATTRIB3_BASE_IDX = 1 +regCONFIG_RESERVED_REG0 = 0x0800 +regCONFIG_RESERVED_REG0_BASE_IDX = 1 +regCONFIG_RESERVED_REG1 = 0x0801 +regCONFIG_RESERVED_REG1_BASE_IDX = 1 +regCP_MEC_CNTL = 0x0802 +regCP_MEC_CNTL_BASE_IDX = 1 +regCP_ME_CNTL = 0x0803 +regCP_ME_CNTL_BASE_IDX = 1 +regGRBM_GFX_CNTL = 0x0900 +regGRBM_GFX_CNTL_BASE_IDX = 1 +regGRBM_NOWHERE = 0x0901 +regGRBM_NOWHERE_BASE_IDX = 1 +regPA_SC_VRS_SURFACE_CNTL = 0x0940 +regPA_SC_VRS_SURFACE_CNTL_BASE_IDX = 1 +regPA_SC_ENHANCE = 0x0941 +regPA_SC_ENHANCE_BASE_IDX = 1 +regPA_SC_ENHANCE_1 = 0x0942 +regPA_SC_ENHANCE_1_BASE_IDX = 1 +regPA_SC_ENHANCE_2 = 0x0943 +regPA_SC_ENHANCE_2_BASE_IDX = 1 +regPA_SC_ENHANCE_3 = 0x0944 +regPA_SC_ENHANCE_3_BASE_IDX = 1 +regPA_SC_BINNER_CNTL_OVERRIDE = 0x0946 +regPA_SC_BINNER_CNTL_OVERRIDE_BASE_IDX = 1 +regPA_SC_PBB_OVERRIDE_FLAG = 0x0947 +regPA_SC_PBB_OVERRIDE_FLAG_BASE_IDX = 1 +regPA_SC_DSM_CNTL = 0x0948 +regPA_SC_DSM_CNTL_BASE_IDX = 1 +regPA_SC_TILE_STEERING_CREST_OVERRIDE = 0x0949 +regPA_SC_TILE_STEERING_CREST_OVERRIDE_BASE_IDX = 1 +regPA_SC_FIFO_SIZE = 0x094a +regPA_SC_FIFO_SIZE_BASE_IDX = 1 +regPA_SC_IF_FIFO_SIZE = 0x094b +regPA_SC_IF_FIFO_SIZE_BASE_IDX = 1 +regPA_SC_PACKER_WAVE_ID_CNTL = 0x094c +regPA_SC_PACKER_WAVE_ID_CNTL_BASE_IDX = 1 +regPA_SC_ATM_CNTL = 0x094d +regPA_SC_ATM_CNTL_BASE_IDX = 1 +regPA_SC_PKR_WAVE_TABLE_CNTL = 0x094e +regPA_SC_PKR_WAVE_TABLE_CNTL_BASE_IDX = 1 +regPA_SC_FORCE_EOV_MAX_CNTS = 0x094f +regPA_SC_FORCE_EOV_MAX_CNTS_BASE_IDX = 1 +regPA_SC_BINNER_EVENT_CNTL_0 = 0x0950 +regPA_SC_BINNER_EVENT_CNTL_0_BASE_IDX = 1 +regPA_SC_BINNER_EVENT_CNTL_1 = 0x0951 +regPA_SC_BINNER_EVENT_CNTL_1_BASE_IDX = 1 +regPA_SC_BINNER_EVENT_CNTL_2 = 0x0952 +regPA_SC_BINNER_EVENT_CNTL_2_BASE_IDX = 1 +regPA_SC_BINNER_EVENT_CNTL_3 = 0x0953 +regPA_SC_BINNER_EVENT_CNTL_3_BASE_IDX = 1 +regPA_SC_BINNER_TIMEOUT_COUNTER = 0x0954 +regPA_SC_BINNER_TIMEOUT_COUNTER_BASE_IDX = 1 +regPA_SC_BINNER_PERF_CNTL_0 = 0x0955 +regPA_SC_BINNER_PERF_CNTL_0_BASE_IDX = 1 +regPA_SC_BINNER_PERF_CNTL_1 = 0x0956 +regPA_SC_BINNER_PERF_CNTL_1_BASE_IDX = 1 +regPA_SC_BINNER_PERF_CNTL_2 = 0x0957 +regPA_SC_BINNER_PERF_CNTL_2_BASE_IDX = 1 +regPA_SC_BINNER_PERF_CNTL_3 = 0x0958 +regPA_SC_BINNER_PERF_CNTL_3_BASE_IDX = 1 +regPA_SC_P3D_TRAP_SCREEN_HV_LOCK = 0x095b +regPA_SC_P3D_TRAP_SCREEN_HV_LOCK_BASE_IDX = 1 +regPA_SC_HP3D_TRAP_SCREEN_HV_LOCK = 0x095c +regPA_SC_HP3D_TRAP_SCREEN_HV_LOCK_BASE_IDX = 1 +regPA_SC_TRAP_SCREEN_HV_LOCK = 0x095d +regPA_SC_TRAP_SCREEN_HV_LOCK_BASE_IDX = 1 +regPA_PH_INTERFACE_FIFO_SIZE = 0x095e +regPA_PH_INTERFACE_FIFO_SIZE_BASE_IDX = 1 +regPA_PH_ENHANCE = 0x095f +regPA_PH_ENHANCE_BASE_IDX = 1 +regPA_SC_VRS_SURFACE_CNTL_1 = 0x0960 +regPA_SC_VRS_SURFACE_CNTL_1_BASE_IDX = 1 +regSQ_RUNTIME_CONFIG = 0x09e0 +regSQ_RUNTIME_CONFIG_BASE_IDX = 1 +regSQ_DEBUG_STS_GLOBAL = 0x09e1 +regSQ_DEBUG_STS_GLOBAL_BASE_IDX = 1 +regSQ_DEBUG_STS_GLOBAL2 = 0x09e2 +regSQ_DEBUG_STS_GLOBAL2_BASE_IDX = 1 +regSH_MEM_BASES = 0x09e3 +regSH_MEM_BASES_BASE_IDX = 1 +regSH_MEM_CONFIG = 0x09e4 +regSH_MEM_CONFIG_BASE_IDX = 1 +regSQ_DEBUG = 0x09e5 +regSQ_DEBUG_BASE_IDX = 1 +regSQ_SHADER_TBA_LO = 0x09e6 +regSQ_SHADER_TBA_LO_BASE_IDX = 1 +regSQ_SHADER_TBA_HI = 0x09e7 +regSQ_SHADER_TBA_HI_BASE_IDX = 1 +regSQ_SHADER_TMA_LO = 0x09e8 +regSQ_SHADER_TMA_LO_BASE_IDX = 1 +regSQ_SHADER_TMA_HI = 0x09e9 +regSQ_SHADER_TMA_HI_BASE_IDX = 1 +regCP_DEBUG_2 = 0x1800 +regCP_DEBUG_2_BASE_IDX = 1 +regCP_FETCHER_SOURCE = 0x1801 +regCP_FETCHER_SOURCE_BASE_IDX = 1 +regCP_HPD_MES_ROQ_OFFSETS = 0x1821 +regCP_HPD_MES_ROQ_OFFSETS_BASE_IDX = 1 +regCP_HPD_ROQ_OFFSETS = 0x1821 +regCP_HPD_ROQ_OFFSETS_BASE_IDX = 1 +regCP_HPD_STATUS0 = 0x1822 +regCP_HPD_STATUS0_BASE_IDX = 1 +regDIDT_INDEX_AUTO_INCR_EN = 0x1900 +regDIDT_INDEX_AUTO_INCR_EN_BASE_IDX = 1 +regDIDT_EDC_CTRL = 0x1901 +regDIDT_EDC_CTRL_BASE_IDX = 1 +regDIDT_EDC_THROTTLE_CTRL = 0x1902 +regDIDT_EDC_THROTTLE_CTRL_BASE_IDX = 1 +regDIDT_EDC_THRESHOLD = 0x1903 +regDIDT_EDC_THRESHOLD_BASE_IDX = 1 +regDIDT_EDC_STALL_PATTERN_1_2 = 0x1904 +regDIDT_EDC_STALL_PATTERN_1_2_BASE_IDX = 1 +regDIDT_EDC_STALL_PATTERN_3_4 = 0x1905 +regDIDT_EDC_STALL_PATTERN_3_4_BASE_IDX = 1 +regDIDT_EDC_STALL_PATTERN_5_6 = 0x1906 +regDIDT_EDC_STALL_PATTERN_5_6_BASE_IDX = 1 +regDIDT_EDC_STALL_PATTERN_7 = 0x1907 +regDIDT_EDC_STALL_PATTERN_7_BASE_IDX = 1 +regDIDT_EDC_STATUS = 0x1908 +regDIDT_EDC_STATUS_BASE_IDX = 1 +regDIDT_EDC_DYNAMIC_THRESHOLD_RO = 0x1909 +regDIDT_EDC_DYNAMIC_THRESHOLD_RO_BASE_IDX = 1 +regDIDT_EDC_OVERFLOW = 0x190a +regDIDT_EDC_OVERFLOW_BASE_IDX = 1 +regDIDT_EDC_ROLLING_POWER_DELTA = 0x190b +regDIDT_EDC_ROLLING_POWER_DELTA_BASE_IDX = 1 +regDIDT_IND_INDEX = 0x190c +regDIDT_IND_INDEX_BASE_IDX = 1 +regDIDT_IND_DATA = 0x190d +regDIDT_IND_DATA_BASE_IDX = 1 +regSPI_GDBG_WAVE_CNTL = 0x1943 +regSPI_GDBG_WAVE_CNTL_BASE_IDX = 1 +regSPI_GDBG_TRAP_CONFIG = 0x1944 +regSPI_GDBG_TRAP_CONFIG_BASE_IDX = 1 +regSPI_GDBG_WAVE_CNTL3 = 0x1945 +regSPI_GDBG_WAVE_CNTL3_BASE_IDX = 1 +regSPI_ARB_CNTL_0 = 0x1949 +regSPI_ARB_CNTL_0_BASE_IDX = 1 +regSPI_FEATURE_CTRL = 0x194a +regSPI_FEATURE_CTRL_BASE_IDX = 1 +regSPI_SHADER_RSRC_LIMIT_CTRL = 0x194b +regSPI_SHADER_RSRC_LIMIT_CTRL_BASE_IDX = 1 +regSPI_COMPUTE_WF_CTX_SAVE_STATUS = 0x194e +regSPI_COMPUTE_WF_CTX_SAVE_STATUS_BASE_IDX = 1 +regTCP_INVALIDATE = 0x19a0 +regTCP_INVALIDATE_BASE_IDX = 1 +regTCP_STATUS = 0x19a1 +regTCP_STATUS_BASE_IDX = 1 +regTCP_CNTL = 0x19a2 +regTCP_CNTL_BASE_IDX = 1 +regTCP_CNTL2 = 0x19a3 +regTCP_CNTL2_BASE_IDX = 1 +regTCP_DEBUG_INDEX = 0x19a5 +regTCP_DEBUG_INDEX_BASE_IDX = 1 +regTCP_DEBUG_DATA = 0x19a6 +regTCP_DEBUG_DATA_BASE_IDX = 1 +regGDS_ENHANCE2 = 0x19b0 +regGDS_ENHANCE2_BASE_IDX = 1 +regGDS_OA_CGPG_RESTORE = 0x19b1 +regGDS_OA_CGPG_RESTORE_BASE_IDX = 1 +regUTCL1_CTRL_0 = 0x1980 +regUTCL1_CTRL_0_BASE_IDX = 1 +regUTCL1_UTCL0_INVREQ_DISABLE = 0x1984 +regUTCL1_UTCL0_INVREQ_DISABLE_BASE_IDX = 1 +regUTCL1_CTRL_2 = 0x1985 +regUTCL1_CTRL_2_BASE_IDX = 1 +regUTCL1_FIFO_SIZING = 0x1986 +regUTCL1_FIFO_SIZING_BASE_IDX = 1 +regGCRD_SA0_TARGETS_DISABLE = 0x1987 +regGCRD_SA0_TARGETS_DISABLE_BASE_IDX = 1 +regGCRD_SA1_TARGETS_DISABLE = 0x1989 +regGCRD_SA1_TARGETS_DISABLE_BASE_IDX = 1 +regGCRD_CREDIT_SAFE = 0x198a +regGCRD_CREDIT_SAFE_BASE_IDX = 1 +regGCR_GENERAL_CNTL = 0x1990 +regGCR_GENERAL_CNTL_BASE_IDX = 1 +regGCR_CMD_STATUS = 0x1992 +regGCR_CMD_STATUS_BASE_IDX = 1 +regGCR_SPARE = 0x1993 +regGCR_SPARE_BASE_IDX = 1 +regPMM_CNTL2 = 0x1999 +regPMM_CNTL2_BASE_IDX = 1 +regSEDC_GL1_GL2_OVERRIDES = 0x1ac0 +regSEDC_GL1_GL2_OVERRIDES_BASE_IDX = 1 +regGC_CAC_CTRL_1 = 0x1ad0 +regGC_CAC_CTRL_1_BASE_IDX = 1 +regGC_CAC_CTRL_2 = 0x1ad1 +regGC_CAC_CTRL_2_BASE_IDX = 1 +regGC_CAC_AGGR_LOWER = 0x1ad2 +regGC_CAC_AGGR_LOWER_BASE_IDX = 1 +regGC_CAC_AGGR_UPPER = 0x1ad3 +regGC_CAC_AGGR_UPPER_BASE_IDX = 1 +regSE0_CAC_AGGR_LOWER = 0x1ad4 +regSE0_CAC_AGGR_LOWER_BASE_IDX = 1 +regSE0_CAC_AGGR_UPPER = 0x1ad5 +regSE0_CAC_AGGR_UPPER_BASE_IDX = 1 +regSE1_CAC_AGGR_LOWER = 0x1ad6 +regSE1_CAC_AGGR_LOWER_BASE_IDX = 1 +regSE1_CAC_AGGR_UPPER = 0x1ad7 +regSE1_CAC_AGGR_UPPER_BASE_IDX = 1 +regSE2_CAC_AGGR_LOWER = 0x1ad8 +regSE2_CAC_AGGR_LOWER_BASE_IDX = 1 +regSE2_CAC_AGGR_UPPER = 0x1ad9 +regSE2_CAC_AGGR_UPPER_BASE_IDX = 1 +regSE3_CAC_AGGR_LOWER = 0x1ada +regSE3_CAC_AGGR_LOWER_BASE_IDX = 1 +regSE3_CAC_AGGR_UPPER = 0x1adb +regSE3_CAC_AGGR_UPPER_BASE_IDX = 1 +regSE4_CAC_AGGR_LOWER = 0x1adc +regSE4_CAC_AGGR_LOWER_BASE_IDX = 1 +regSE4_CAC_AGGR_UPPER = 0x1add +regSE4_CAC_AGGR_UPPER_BASE_IDX = 1 +regSE5_CAC_AGGR_LOWER = 0x1ade +regSE5_CAC_AGGR_LOWER_BASE_IDX = 1 +regSE5_CAC_AGGR_UPPER = 0x1adf +regSE5_CAC_AGGR_UPPER_BASE_IDX = 1 +regGC_CAC_AGGR_GFXCLK_CYCLE = 0x1ae4 +regGC_CAC_AGGR_GFXCLK_CYCLE_BASE_IDX = 1 +regSE0_CAC_AGGR_GFXCLK_CYCLE = 0x1ae5 +regSE0_CAC_AGGR_GFXCLK_CYCLE_BASE_IDX = 1 +regSE1_CAC_AGGR_GFXCLK_CYCLE = 0x1ae6 +regSE1_CAC_AGGR_GFXCLK_CYCLE_BASE_IDX = 1 +regSE2_CAC_AGGR_GFXCLK_CYCLE = 0x1ae7 +regSE2_CAC_AGGR_GFXCLK_CYCLE_BASE_IDX = 1 +regSE3_CAC_AGGR_GFXCLK_CYCLE = 0x1ae8 +regSE3_CAC_AGGR_GFXCLK_CYCLE_BASE_IDX = 1 +regSE4_CAC_AGGR_GFXCLK_CYCLE = 0x1ae9 +regSE4_CAC_AGGR_GFXCLK_CYCLE_BASE_IDX = 1 +regSE5_CAC_AGGR_GFXCLK_CYCLE = 0x1aea +regSE5_CAC_AGGR_GFXCLK_CYCLE_BASE_IDX = 1 +regGC_EDC_CTRL = 0x1aed +regGC_EDC_CTRL_BASE_IDX = 1 +regGC_EDC_THRESHOLD = 0x1aee +regGC_EDC_THRESHOLD_BASE_IDX = 1 +regGC_EDC_STRETCH_CTRL = 0x1aef +regGC_EDC_STRETCH_CTRL_BASE_IDX = 1 +regGC_EDC_STRETCH_THRESHOLD = 0x1af0 +regGC_EDC_STRETCH_THRESHOLD_BASE_IDX = 1 +regEDC_HYSTERESIS_CNTL = 0x1af1 +regEDC_HYSTERESIS_CNTL_BASE_IDX = 1 +regGC_THROTTLE_CTRL = 0x1af2 +regGC_THROTTLE_CTRL_BASE_IDX = 1 +regGC_THROTTLE_CTRL1 = 0x1af3 +regGC_THROTTLE_CTRL1_BASE_IDX = 1 +regPCC_STALL_PATTERN_CTRL = 0x1af4 +regPCC_STALL_PATTERN_CTRL_BASE_IDX = 1 +regPWRBRK_STALL_PATTERN_CTRL = 0x1af5 +regPWRBRK_STALL_PATTERN_CTRL_BASE_IDX = 1 +regPCC_STALL_PATTERN_1_2 = 0x1af6 +regPCC_STALL_PATTERN_1_2_BASE_IDX = 1 +regPCC_STALL_PATTERN_3_4 = 0x1af7 +regPCC_STALL_PATTERN_3_4_BASE_IDX = 1 +regPCC_STALL_PATTERN_5_6 = 0x1af8 +regPCC_STALL_PATTERN_5_6_BASE_IDX = 1 +regPCC_STALL_PATTERN_7 = 0x1af9 +regPCC_STALL_PATTERN_7_BASE_IDX = 1 +regPWRBRK_STALL_PATTERN_1_2 = 0x1afa +regPWRBRK_STALL_PATTERN_1_2_BASE_IDX = 1 +regPWRBRK_STALL_PATTERN_3_4 = 0x1afb +regPWRBRK_STALL_PATTERN_3_4_BASE_IDX = 1 +regPWRBRK_STALL_PATTERN_5_6 = 0x1afc +regPWRBRK_STALL_PATTERN_5_6_BASE_IDX = 1 +regPWRBRK_STALL_PATTERN_7 = 0x1afd +regPWRBRK_STALL_PATTERN_7_BASE_IDX = 1 +regDIDT_STALL_PATTERN_CTRL = 0x1afe +regDIDT_STALL_PATTERN_CTRL_BASE_IDX = 1 +regDIDT_STALL_PATTERN_1_2 = 0x1aff +regDIDT_STALL_PATTERN_1_2_BASE_IDX = 1 +regDIDT_STALL_PATTERN_3_4 = 0x1b00 +regDIDT_STALL_PATTERN_3_4_BASE_IDX = 1 +regDIDT_STALL_PATTERN_5_6 = 0x1b01 +regDIDT_STALL_PATTERN_5_6_BASE_IDX = 1 +regDIDT_STALL_PATTERN_7 = 0x1b02 +regDIDT_STALL_PATTERN_7_BASE_IDX = 1 +regPCC_PWRBRK_HYSTERESIS_CTRL = 0x1b03 +regPCC_PWRBRK_HYSTERESIS_CTRL_BASE_IDX = 1 +regEDC_STRETCH_PERF_COUNTER = 0x1b04 +regEDC_STRETCH_PERF_COUNTER_BASE_IDX = 1 +regEDC_UNSTRETCH_PERF_COUNTER = 0x1b05 +regEDC_UNSTRETCH_PERF_COUNTER_BASE_IDX = 1 +regEDC_STRETCH_NUM_PERF_COUNTER = 0x1b06 +regEDC_STRETCH_NUM_PERF_COUNTER_BASE_IDX = 1 +regGC_EDC_STATUS = 0x1b07 +regGC_EDC_STATUS_BASE_IDX = 1 +regGC_EDC_OVERFLOW = 0x1b08 +regGC_EDC_OVERFLOW_BASE_IDX = 1 +regGC_EDC_ROLLING_POWER_DELTA = 0x1b09 +regGC_EDC_ROLLING_POWER_DELTA_BASE_IDX = 1 +regGC_THROTTLE_STATUS = 0x1b0a +regGC_THROTTLE_STATUS_BASE_IDX = 1 +regEDC_PERF_COUNTER = 0x1b0b +regEDC_PERF_COUNTER_BASE_IDX = 1 +regPCC_PERF_COUNTER = 0x1b0c +regPCC_PERF_COUNTER_BASE_IDX = 1 +regPWRBRK_PERF_COUNTER = 0x1b0d +regPWRBRK_PERF_COUNTER_BASE_IDX = 1 +regEDC_HYSTERESIS_STAT = 0x1b0e +regEDC_HYSTERESIS_STAT_BASE_IDX = 1 +regGC_CAC_WEIGHT_CP_0 = 0x1b10 +regGC_CAC_WEIGHT_CP_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_CP_1 = 0x1b11 +regGC_CAC_WEIGHT_CP_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_EA_0 = 0x1b12 +regGC_CAC_WEIGHT_EA_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_EA_1 = 0x1b13 +regGC_CAC_WEIGHT_EA_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_EA_2 = 0x1b14 +regGC_CAC_WEIGHT_EA_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_ROUTER_0 = 0x1b15 +regGC_CAC_WEIGHT_UTCL2_ROUTER_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_ROUTER_1 = 0x1b16 +regGC_CAC_WEIGHT_UTCL2_ROUTER_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_ROUTER_2 = 0x1b17 +regGC_CAC_WEIGHT_UTCL2_ROUTER_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_ROUTER_3 = 0x1b18 +regGC_CAC_WEIGHT_UTCL2_ROUTER_3_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_ROUTER_4 = 0x1b19 +regGC_CAC_WEIGHT_UTCL2_ROUTER_4_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_VML2_0 = 0x1b1a +regGC_CAC_WEIGHT_UTCL2_VML2_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_VML2_1 = 0x1b1b +regGC_CAC_WEIGHT_UTCL2_VML2_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_VML2_2 = 0x1b1c +regGC_CAC_WEIGHT_UTCL2_VML2_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_WALKER_0 = 0x1b1d +regGC_CAC_WEIGHT_UTCL2_WALKER_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_WALKER_1 = 0x1b1e +regGC_CAC_WEIGHT_UTCL2_WALKER_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_UTCL2_WALKER_2 = 0x1b1f +regGC_CAC_WEIGHT_UTCL2_WALKER_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_GDS_0 = 0x1b20 +regGC_CAC_WEIGHT_GDS_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_GDS_1 = 0x1b21 +regGC_CAC_WEIGHT_GDS_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_GDS_2 = 0x1b22 +regGC_CAC_WEIGHT_GDS_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_GE_0 = 0x1b23 +regGC_CAC_WEIGHT_GE_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_GE_1 = 0x1b24 +regGC_CAC_WEIGHT_GE_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_GE_2 = 0x1b25 +regGC_CAC_WEIGHT_GE_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_GE_3 = 0x1b26 +regGC_CAC_WEIGHT_GE_3_BASE_IDX = 1 +regGC_CAC_WEIGHT_GE_4 = 0x1b27 +regGC_CAC_WEIGHT_GE_4_BASE_IDX = 1 +regGC_CAC_WEIGHT_GE_5 = 0x1b28 +regGC_CAC_WEIGHT_GE_5_BASE_IDX = 1 +regGC_CAC_WEIGHT_GE_6 = 0x1b29 +regGC_CAC_WEIGHT_GE_6_BASE_IDX = 1 +regGC_CAC_WEIGHT_PMM_0 = 0x1b2e +regGC_CAC_WEIGHT_PMM_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_GL2C_0 = 0x1b2f +regGC_CAC_WEIGHT_GL2C_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_GL2C_1 = 0x1b30 +regGC_CAC_WEIGHT_GL2C_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_GL2C_2 = 0x1b31 +regGC_CAC_WEIGHT_GL2C_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_PH_0 = 0x1b32 +regGC_CAC_WEIGHT_PH_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_PH_1 = 0x1b33 +regGC_CAC_WEIGHT_PH_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_PH_2 = 0x1b34 +regGC_CAC_WEIGHT_PH_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_PH_3 = 0x1b35 +regGC_CAC_WEIGHT_PH_3_BASE_IDX = 1 +regGC_CAC_WEIGHT_SDMA_0 = 0x1b36 +regGC_CAC_WEIGHT_SDMA_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_SDMA_1 = 0x1b37 +regGC_CAC_WEIGHT_SDMA_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_SDMA_2 = 0x1b38 +regGC_CAC_WEIGHT_SDMA_2_BASE_IDX = 1 +regGC_CAC_WEIGHT_SDMA_3 = 0x1b39 +regGC_CAC_WEIGHT_SDMA_3_BASE_IDX = 1 +regGC_CAC_WEIGHT_SDMA_4 = 0x1b3a +regGC_CAC_WEIGHT_SDMA_4_BASE_IDX = 1 +regGC_CAC_WEIGHT_SDMA_5 = 0x1b3b +regGC_CAC_WEIGHT_SDMA_5_BASE_IDX = 1 +regGC_CAC_WEIGHT_CHC_0 = 0x1b3c +regGC_CAC_WEIGHT_CHC_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_CHC_1 = 0x1b3d +regGC_CAC_WEIGHT_CHC_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_GUS_0 = 0x1b3e +regGC_CAC_WEIGHT_GUS_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_GUS_1 = 0x1b3f +regGC_CAC_WEIGHT_GUS_1_BASE_IDX = 1 +regGC_CAC_WEIGHT_RLC_0 = 0x1b40 +regGC_CAC_WEIGHT_RLC_0_BASE_IDX = 1 +regGC_CAC_WEIGHT_GRBM_0 = 0x1b44 +regGC_CAC_WEIGHT_GRBM_0_BASE_IDX = 1 +regGC_EDC_CLK_MONITOR_CTRL = 0x1b56 +regGC_EDC_CLK_MONITOR_CTRL_BASE_IDX = 1 +regGC_CAC_IND_INDEX = 0x1b58 +regGC_CAC_IND_INDEX_BASE_IDX = 1 +regGC_CAC_IND_DATA = 0x1b59 +regGC_CAC_IND_DATA_BASE_IDX = 1 +regSE_CAC_CTRL_1 = 0x1b70 +regSE_CAC_CTRL_1_BASE_IDX = 1 +regSE_CAC_CTRL_2 = 0x1b71 +regSE_CAC_CTRL_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_TA_0 = 0x1b72 +regSE_CAC_WEIGHT_TA_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_TD_0 = 0x1b73 +regSE_CAC_WEIGHT_TD_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_TD_1 = 0x1b74 +regSE_CAC_WEIGHT_TD_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_TD_2 = 0x1b75 +regSE_CAC_WEIGHT_TD_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_TD_3 = 0x1b76 +regSE_CAC_WEIGHT_TD_3_BASE_IDX = 1 +regSE_CAC_WEIGHT_TD_4 = 0x1b77 +regSE_CAC_WEIGHT_TD_4_BASE_IDX = 1 +regSE_CAC_WEIGHT_TD_5 = 0x1b78 +regSE_CAC_WEIGHT_TD_5_BASE_IDX = 1 +regSE_CAC_WEIGHT_TCP_0 = 0x1b79 +regSE_CAC_WEIGHT_TCP_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_TCP_1 = 0x1b7a +regSE_CAC_WEIGHT_TCP_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_TCP_2 = 0x1b7b +regSE_CAC_WEIGHT_TCP_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_TCP_3 = 0x1b7c +regSE_CAC_WEIGHT_TCP_3_BASE_IDX = 1 +regSE_CAC_WEIGHT_SQ_0 = 0x1b7d +regSE_CAC_WEIGHT_SQ_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_SQ_1 = 0x1b7e +regSE_CAC_WEIGHT_SQ_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_SQ_2 = 0x1b7f +regSE_CAC_WEIGHT_SQ_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_SP_0 = 0x1b80 +regSE_CAC_WEIGHT_SP_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_SP_1 = 0x1b81 +regSE_CAC_WEIGHT_SP_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_LDS_0 = 0x1b82 +regSE_CAC_WEIGHT_LDS_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_LDS_1 = 0x1b83 +regSE_CAC_WEIGHT_LDS_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_LDS_2 = 0x1b84 +regSE_CAC_WEIGHT_LDS_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_LDS_3 = 0x1b85 +regSE_CAC_WEIGHT_LDS_3_BASE_IDX = 1 +regSE_CAC_WEIGHT_SQC_0 = 0x1b87 +regSE_CAC_WEIGHT_SQC_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_SQC_1 = 0x1b88 +regSE_CAC_WEIGHT_SQC_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_CU_0 = 0x1b89 +regSE_CAC_WEIGHT_CU_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_BCI_0 = 0x1b8a +regSE_CAC_WEIGHT_BCI_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_0 = 0x1b8b +regSE_CAC_WEIGHT_CB_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_1 = 0x1b8c +regSE_CAC_WEIGHT_CB_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_2 = 0x1b8d +regSE_CAC_WEIGHT_CB_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_3 = 0x1b8e +regSE_CAC_WEIGHT_CB_3_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_4 = 0x1b8f +regSE_CAC_WEIGHT_CB_4_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_5 = 0x1b90 +regSE_CAC_WEIGHT_CB_5_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_6 = 0x1b91 +regSE_CAC_WEIGHT_CB_6_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_7 = 0x1b92 +regSE_CAC_WEIGHT_CB_7_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_8 = 0x1b93 +regSE_CAC_WEIGHT_CB_8_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_9 = 0x1b94 +regSE_CAC_WEIGHT_CB_9_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_10 = 0x1b95 +regSE_CAC_WEIGHT_CB_10_BASE_IDX = 1 +regSE_CAC_WEIGHT_CB_11 = 0x1b96 +regSE_CAC_WEIGHT_CB_11_BASE_IDX = 1 +regSE_CAC_WEIGHT_DB_0 = 0x1b97 +regSE_CAC_WEIGHT_DB_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_DB_1 = 0x1b98 +regSE_CAC_WEIGHT_DB_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_DB_2 = 0x1b99 +regSE_CAC_WEIGHT_DB_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_DB_3 = 0x1b9a +regSE_CAC_WEIGHT_DB_3_BASE_IDX = 1 +regSE_CAC_WEIGHT_DB_4 = 0x1b9b +regSE_CAC_WEIGHT_DB_4_BASE_IDX = 1 +regSE_CAC_WEIGHT_RMI_0 = 0x1b9c +regSE_CAC_WEIGHT_RMI_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_RMI_1 = 0x1b9d +regSE_CAC_WEIGHT_RMI_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_SX_0 = 0x1b9e +regSE_CAC_WEIGHT_SX_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_SXRB_0 = 0x1b9f +regSE_CAC_WEIGHT_SXRB_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_UTCL1_0 = 0x1ba0 +regSE_CAC_WEIGHT_UTCL1_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_GL1C_0 = 0x1ba1 +regSE_CAC_WEIGHT_GL1C_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_GL1C_1 = 0x1ba2 +regSE_CAC_WEIGHT_GL1C_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_GL1C_2 = 0x1ba3 +regSE_CAC_WEIGHT_GL1C_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_SPI_0 = 0x1ba4 +regSE_CAC_WEIGHT_SPI_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_SPI_1 = 0x1ba5 +regSE_CAC_WEIGHT_SPI_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_SPI_2 = 0x1ba6 +regSE_CAC_WEIGHT_SPI_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_PC_0 = 0x1ba7 +regSE_CAC_WEIGHT_PC_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_PA_0 = 0x1ba8 +regSE_CAC_WEIGHT_PA_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_PA_1 = 0x1ba9 +regSE_CAC_WEIGHT_PA_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_PA_2 = 0x1baa +regSE_CAC_WEIGHT_PA_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_PA_3 = 0x1bab +regSE_CAC_WEIGHT_PA_3_BASE_IDX = 1 +regSE_CAC_WEIGHT_SC_0 = 0x1bac +regSE_CAC_WEIGHT_SC_0_BASE_IDX = 1 +regSE_CAC_WEIGHT_SC_1 = 0x1bad +regSE_CAC_WEIGHT_SC_1_BASE_IDX = 1 +regSE_CAC_WEIGHT_SC_2 = 0x1bae +regSE_CAC_WEIGHT_SC_2_BASE_IDX = 1 +regSE_CAC_WEIGHT_SC_3 = 0x1baf +regSE_CAC_WEIGHT_SC_3_BASE_IDX = 1 +regSE_CAC_WINDOW_AGGR_VALUE = 0x1bb0 +regSE_CAC_WINDOW_AGGR_VALUE_BASE_IDX = 1 +regSE_CAC_WINDOW_GFXCLK_CYCLE = 0x1bb1 +regSE_CAC_WINDOW_GFXCLK_CYCLE_BASE_IDX = 1 +regSE_CAC_IND_INDEX = 0x1bce +regSE_CAC_IND_INDEX_BASE_IDX = 1 +regSE_CAC_IND_DATA = 0x1bcf +regSE_CAC_IND_DATA_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_0 = 0x1c00 +regSPI_RESOURCE_RESERVE_CU_0_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_1 = 0x1c01 +regSPI_RESOURCE_RESERVE_CU_1_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_2 = 0x1c02 +regSPI_RESOURCE_RESERVE_CU_2_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_3 = 0x1c03 +regSPI_RESOURCE_RESERVE_CU_3_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_4 = 0x1c04 +regSPI_RESOURCE_RESERVE_CU_4_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_5 = 0x1c05 +regSPI_RESOURCE_RESERVE_CU_5_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_6 = 0x1c06 +regSPI_RESOURCE_RESERVE_CU_6_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_7 = 0x1c07 +regSPI_RESOURCE_RESERVE_CU_7_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_8 = 0x1c08 +regSPI_RESOURCE_RESERVE_CU_8_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_9 = 0x1c09 +regSPI_RESOURCE_RESERVE_CU_9_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_10 = 0x1c0a +regSPI_RESOURCE_RESERVE_CU_10_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_11 = 0x1c0b +regSPI_RESOURCE_RESERVE_CU_11_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_12 = 0x1c0c +regSPI_RESOURCE_RESERVE_CU_12_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_13 = 0x1c0d +regSPI_RESOURCE_RESERVE_CU_13_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_14 = 0x1c0e +regSPI_RESOURCE_RESERVE_CU_14_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_CU_15 = 0x1c0f +regSPI_RESOURCE_RESERVE_CU_15_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_0 = 0x1c10 +regSPI_RESOURCE_RESERVE_EN_CU_0_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_1 = 0x1c11 +regSPI_RESOURCE_RESERVE_EN_CU_1_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_2 = 0x1c12 +regSPI_RESOURCE_RESERVE_EN_CU_2_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_3 = 0x1c13 +regSPI_RESOURCE_RESERVE_EN_CU_3_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_4 = 0x1c14 +regSPI_RESOURCE_RESERVE_EN_CU_4_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_5 = 0x1c15 +regSPI_RESOURCE_RESERVE_EN_CU_5_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_6 = 0x1c16 +regSPI_RESOURCE_RESERVE_EN_CU_6_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_7 = 0x1c17 +regSPI_RESOURCE_RESERVE_EN_CU_7_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_8 = 0x1c18 +regSPI_RESOURCE_RESERVE_EN_CU_8_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_9 = 0x1c19 +regSPI_RESOURCE_RESERVE_EN_CU_9_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_10 = 0x1c1a +regSPI_RESOURCE_RESERVE_EN_CU_10_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_11 = 0x1c1b +regSPI_RESOURCE_RESERVE_EN_CU_11_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_12 = 0x1c1c +regSPI_RESOURCE_RESERVE_EN_CU_12_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_13 = 0x1c1d +regSPI_RESOURCE_RESERVE_EN_CU_13_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_14 = 0x1c1e +regSPI_RESOURCE_RESERVE_EN_CU_14_BASE_IDX = 1 +regSPI_RESOURCE_RESERVE_EN_CU_15 = 0x1c1f +regSPI_RESOURCE_RESERVE_EN_CU_15_BASE_IDX = 1 +regCP_EOP_DONE_ADDR_LO = 0x2000 +regCP_EOP_DONE_ADDR_LO_BASE_IDX = 1 +regCP_EOP_DONE_ADDR_HI = 0x2001 +regCP_EOP_DONE_ADDR_HI_BASE_IDX = 1 +regCP_EOP_DONE_DATA_LO = 0x2002 +regCP_EOP_DONE_DATA_LO_BASE_IDX = 1 +regCP_EOP_DONE_DATA_HI = 0x2003 +regCP_EOP_DONE_DATA_HI_BASE_IDX = 1 +regCP_EOP_LAST_FENCE_LO = 0x2004 +regCP_EOP_LAST_FENCE_LO_BASE_IDX = 1 +regCP_EOP_LAST_FENCE_HI = 0x2005 +regCP_EOP_LAST_FENCE_HI_BASE_IDX = 1 +regCP_PIPE_STATS_ADDR_LO = 0x2018 +regCP_PIPE_STATS_ADDR_LO_BASE_IDX = 1 +regCP_PIPE_STATS_ADDR_HI = 0x2019 +regCP_PIPE_STATS_ADDR_HI_BASE_IDX = 1 +regCP_VGT_IAVERT_COUNT_LO = 0x201a +regCP_VGT_IAVERT_COUNT_LO_BASE_IDX = 1 +regCP_VGT_IAVERT_COUNT_HI = 0x201b +regCP_VGT_IAVERT_COUNT_HI_BASE_IDX = 1 +regCP_VGT_IAPRIM_COUNT_LO = 0x201c +regCP_VGT_IAPRIM_COUNT_LO_BASE_IDX = 1 +regCP_VGT_IAPRIM_COUNT_HI = 0x201d +regCP_VGT_IAPRIM_COUNT_HI_BASE_IDX = 1 +regCP_VGT_GSPRIM_COUNT_LO = 0x201e +regCP_VGT_GSPRIM_COUNT_LO_BASE_IDX = 1 +regCP_VGT_GSPRIM_COUNT_HI = 0x201f +regCP_VGT_GSPRIM_COUNT_HI_BASE_IDX = 1 +regCP_VGT_VSINVOC_COUNT_LO = 0x2020 +regCP_VGT_VSINVOC_COUNT_LO_BASE_IDX = 1 +regCP_VGT_VSINVOC_COUNT_HI = 0x2021 +regCP_VGT_VSINVOC_COUNT_HI_BASE_IDX = 1 +regCP_VGT_GSINVOC_COUNT_LO = 0x2022 +regCP_VGT_GSINVOC_COUNT_LO_BASE_IDX = 1 +regCP_VGT_GSINVOC_COUNT_HI = 0x2023 +regCP_VGT_GSINVOC_COUNT_HI_BASE_IDX = 1 +regCP_VGT_HSINVOC_COUNT_LO = 0x2024 +regCP_VGT_HSINVOC_COUNT_LO_BASE_IDX = 1 +regCP_VGT_HSINVOC_COUNT_HI = 0x2025 +regCP_VGT_HSINVOC_COUNT_HI_BASE_IDX = 1 +regCP_VGT_DSINVOC_COUNT_LO = 0x2026 +regCP_VGT_DSINVOC_COUNT_LO_BASE_IDX = 1 +regCP_VGT_DSINVOC_COUNT_HI = 0x2027 +regCP_VGT_DSINVOC_COUNT_HI_BASE_IDX = 1 +regCP_PA_CINVOC_COUNT_LO = 0x2028 +regCP_PA_CINVOC_COUNT_LO_BASE_IDX = 1 +regCP_PA_CINVOC_COUNT_HI = 0x2029 +regCP_PA_CINVOC_COUNT_HI_BASE_IDX = 1 +regCP_PA_CPRIM_COUNT_LO = 0x202a +regCP_PA_CPRIM_COUNT_LO_BASE_IDX = 1 +regCP_PA_CPRIM_COUNT_HI = 0x202b +regCP_PA_CPRIM_COUNT_HI_BASE_IDX = 1 +regCP_SC_PSINVOC_COUNT0_LO = 0x202c +regCP_SC_PSINVOC_COUNT0_LO_BASE_IDX = 1 +regCP_SC_PSINVOC_COUNT0_HI = 0x202d +regCP_SC_PSINVOC_COUNT0_HI_BASE_IDX = 1 +regCP_SC_PSINVOC_COUNT1_LO = 0x202e +regCP_SC_PSINVOC_COUNT1_LO_BASE_IDX = 1 +regCP_SC_PSINVOC_COUNT1_HI = 0x202f +regCP_SC_PSINVOC_COUNT1_HI_BASE_IDX = 1 +regCP_VGT_CSINVOC_COUNT_LO = 0x2030 +regCP_VGT_CSINVOC_COUNT_LO_BASE_IDX = 1 +regCP_VGT_CSINVOC_COUNT_HI = 0x2031 +regCP_VGT_CSINVOC_COUNT_HI_BASE_IDX = 1 +regCP_VGT_ASINVOC_COUNT_LO = 0x2032 +regCP_VGT_ASINVOC_COUNT_LO_BASE_IDX = 1 +regCP_VGT_ASINVOC_COUNT_HI = 0x2033 +regCP_VGT_ASINVOC_COUNT_HI_BASE_IDX = 1 +regCP_PIPE_STATS_CONTROL = 0x203d +regCP_PIPE_STATS_CONTROL_BASE_IDX = 1 +regSCRATCH_REG0 = 0x2040 +regSCRATCH_REG0_BASE_IDX = 1 +regSCRATCH_REG1 = 0x2041 +regSCRATCH_REG1_BASE_IDX = 1 +regSCRATCH_REG2 = 0x2042 +regSCRATCH_REG2_BASE_IDX = 1 +regSCRATCH_REG3 = 0x2043 +regSCRATCH_REG3_BASE_IDX = 1 +regSCRATCH_REG4 = 0x2044 +regSCRATCH_REG4_BASE_IDX = 1 +regSCRATCH_REG5 = 0x2045 +regSCRATCH_REG5_BASE_IDX = 1 +regSCRATCH_REG6 = 0x2046 +regSCRATCH_REG6_BASE_IDX = 1 +regSCRATCH_REG7 = 0x2047 +regSCRATCH_REG7_BASE_IDX = 1 +regSCRATCH_REG_ATOMIC = 0x2048 +regSCRATCH_REG_ATOMIC_BASE_IDX = 1 +regSCRATCH_REG_CMPSWAP_ATOMIC = 0x2048 +regSCRATCH_REG_CMPSWAP_ATOMIC_BASE_IDX = 1 +regCP_APPEND_DDID_CNT = 0x204b +regCP_APPEND_DDID_CNT_BASE_IDX = 1 +regCP_APPEND_DATA_HI = 0x204c +regCP_APPEND_DATA_HI_BASE_IDX = 1 +regCP_APPEND_LAST_CS_FENCE_HI = 0x204d +regCP_APPEND_LAST_CS_FENCE_HI_BASE_IDX = 1 +regCP_APPEND_LAST_PS_FENCE_HI = 0x204e +regCP_APPEND_LAST_PS_FENCE_HI_BASE_IDX = 1 +regCP_PFP_ATOMIC_PREOP_LO = 0x2052 +regCP_PFP_ATOMIC_PREOP_LO_BASE_IDX = 1 +regCP_PFP_ATOMIC_PREOP_HI = 0x2053 +regCP_PFP_ATOMIC_PREOP_HI_BASE_IDX = 1 +regCP_PFP_GDS_ATOMIC0_PREOP_LO = 0x2054 +regCP_PFP_GDS_ATOMIC0_PREOP_LO_BASE_IDX = 1 +regCP_PFP_GDS_ATOMIC0_PREOP_HI = 0x2055 +regCP_PFP_GDS_ATOMIC0_PREOP_HI_BASE_IDX = 1 +regCP_PFP_GDS_ATOMIC1_PREOP_LO = 0x2056 +regCP_PFP_GDS_ATOMIC1_PREOP_LO_BASE_IDX = 1 +regCP_PFP_GDS_ATOMIC1_PREOP_HI = 0x2057 +regCP_PFP_GDS_ATOMIC1_PREOP_HI_BASE_IDX = 1 +regCP_APPEND_ADDR_LO = 0x2058 +regCP_APPEND_ADDR_LO_BASE_IDX = 1 +regCP_APPEND_ADDR_HI = 0x2059 +regCP_APPEND_ADDR_HI_BASE_IDX = 1 +regCP_APPEND_DATA = 0x205a +regCP_APPEND_DATA_BASE_IDX = 1 +regCP_APPEND_DATA_LO = 0x205a +regCP_APPEND_DATA_LO_BASE_IDX = 1 +regCP_APPEND_LAST_CS_FENCE = 0x205b +regCP_APPEND_LAST_CS_FENCE_BASE_IDX = 1 +regCP_APPEND_LAST_CS_FENCE_LO = 0x205b +regCP_APPEND_LAST_CS_FENCE_LO_BASE_IDX = 1 +regCP_APPEND_LAST_PS_FENCE = 0x205c +regCP_APPEND_LAST_PS_FENCE_BASE_IDX = 1 +regCP_APPEND_LAST_PS_FENCE_LO = 0x205c +regCP_APPEND_LAST_PS_FENCE_LO_BASE_IDX = 1 +regCP_ATOMIC_PREOP_LO = 0x205d +regCP_ATOMIC_PREOP_LO_BASE_IDX = 1 +regCP_ME_ATOMIC_PREOP_LO = 0x205d +regCP_ME_ATOMIC_PREOP_LO_BASE_IDX = 1 +regCP_ATOMIC_PREOP_HI = 0x205e +regCP_ATOMIC_PREOP_HI_BASE_IDX = 1 +regCP_ME_ATOMIC_PREOP_HI = 0x205e +regCP_ME_ATOMIC_PREOP_HI_BASE_IDX = 1 +regCP_GDS_ATOMIC0_PREOP_LO = 0x205f +regCP_GDS_ATOMIC0_PREOP_LO_BASE_IDX = 1 +regCP_ME_GDS_ATOMIC0_PREOP_LO = 0x205f +regCP_ME_GDS_ATOMIC0_PREOP_LO_BASE_IDX = 1 +regCP_GDS_ATOMIC0_PREOP_HI = 0x2060 +regCP_GDS_ATOMIC0_PREOP_HI_BASE_IDX = 1 +regCP_ME_GDS_ATOMIC0_PREOP_HI = 0x2060 +regCP_ME_GDS_ATOMIC0_PREOP_HI_BASE_IDX = 1 +regCP_GDS_ATOMIC1_PREOP_LO = 0x2061 +regCP_GDS_ATOMIC1_PREOP_LO_BASE_IDX = 1 +regCP_ME_GDS_ATOMIC1_PREOP_LO = 0x2061 +regCP_ME_GDS_ATOMIC1_PREOP_LO_BASE_IDX = 1 +regCP_GDS_ATOMIC1_PREOP_HI = 0x2062 +regCP_GDS_ATOMIC1_PREOP_HI_BASE_IDX = 1 +regCP_ME_GDS_ATOMIC1_PREOP_HI = 0x2062 +regCP_ME_GDS_ATOMIC1_PREOP_HI_BASE_IDX = 1 +regCP_ME_MC_WADDR_LO = 0x2069 +regCP_ME_MC_WADDR_LO_BASE_IDX = 1 +regCP_ME_MC_WADDR_HI = 0x206a +regCP_ME_MC_WADDR_HI_BASE_IDX = 1 +regCP_ME_MC_WDATA_LO = 0x206b +regCP_ME_MC_WDATA_LO_BASE_IDX = 1 +regCP_ME_MC_WDATA_HI = 0x206c +regCP_ME_MC_WDATA_HI_BASE_IDX = 1 +regCP_ME_MC_RADDR_LO = 0x206d +regCP_ME_MC_RADDR_LO_BASE_IDX = 1 +regCP_ME_MC_RADDR_HI = 0x206e +regCP_ME_MC_RADDR_HI_BASE_IDX = 1 +regCP_SEM_WAIT_TIMER = 0x206f +regCP_SEM_WAIT_TIMER_BASE_IDX = 1 +regCP_SIG_SEM_ADDR_LO = 0x2070 +regCP_SIG_SEM_ADDR_LO_BASE_IDX = 1 +regCP_SIG_SEM_ADDR_HI = 0x2071 +regCP_SIG_SEM_ADDR_HI_BASE_IDX = 1 +regCP_WAIT_REG_MEM_TIMEOUT = 0x2074 +regCP_WAIT_REG_MEM_TIMEOUT_BASE_IDX = 1 +regCP_WAIT_SEM_ADDR_LO = 0x2075 +regCP_WAIT_SEM_ADDR_LO_BASE_IDX = 1 +regCP_WAIT_SEM_ADDR_HI = 0x2076 +regCP_WAIT_SEM_ADDR_HI_BASE_IDX = 1 +regCP_DMA_PFP_CONTROL = 0x2077 +regCP_DMA_PFP_CONTROL_BASE_IDX = 1 +regCP_DMA_ME_CONTROL = 0x2078 +regCP_DMA_ME_CONTROL_BASE_IDX = 1 +regCP_DMA_ME_SRC_ADDR = 0x2080 +regCP_DMA_ME_SRC_ADDR_BASE_IDX = 1 +regCP_DMA_ME_SRC_ADDR_HI = 0x2081 +regCP_DMA_ME_SRC_ADDR_HI_BASE_IDX = 1 +regCP_DMA_ME_DST_ADDR = 0x2082 +regCP_DMA_ME_DST_ADDR_BASE_IDX = 1 +regCP_DMA_ME_DST_ADDR_HI = 0x2083 +regCP_DMA_ME_DST_ADDR_HI_BASE_IDX = 1 +regCP_DMA_ME_COMMAND = 0x2084 +regCP_DMA_ME_COMMAND_BASE_IDX = 1 +regCP_DMA_PFP_SRC_ADDR = 0x2085 +regCP_DMA_PFP_SRC_ADDR_BASE_IDX = 1 +regCP_DMA_PFP_SRC_ADDR_HI = 0x2086 +regCP_DMA_PFP_SRC_ADDR_HI_BASE_IDX = 1 +regCP_DMA_PFP_DST_ADDR = 0x2087 +regCP_DMA_PFP_DST_ADDR_BASE_IDX = 1 +regCP_DMA_PFP_DST_ADDR_HI = 0x2088 +regCP_DMA_PFP_DST_ADDR_HI_BASE_IDX = 1 +regCP_DMA_PFP_COMMAND = 0x2089 +regCP_DMA_PFP_COMMAND_BASE_IDX = 1 +regCP_DMA_CNTL = 0x208a +regCP_DMA_CNTL_BASE_IDX = 1 +regCP_DMA_READ_TAGS = 0x208b +regCP_DMA_READ_TAGS_BASE_IDX = 1 +regCP_PFP_IB_CONTROL = 0x208d +regCP_PFP_IB_CONTROL_BASE_IDX = 1 +regCP_PFP_LOAD_CONTROL = 0x208e +regCP_PFP_LOAD_CONTROL_BASE_IDX = 1 +regCP_SCRATCH_INDEX = 0x208f +regCP_SCRATCH_INDEX_BASE_IDX = 1 +regCP_SCRATCH_DATA = 0x2090 +regCP_SCRATCH_DATA_BASE_IDX = 1 +regCP_RB_OFFSET = 0x2091 +regCP_RB_OFFSET_BASE_IDX = 1 +regCP_IB2_OFFSET = 0x2093 +regCP_IB2_OFFSET_BASE_IDX = 1 +regCP_IB2_PREAMBLE_BEGIN = 0x2096 +regCP_IB2_PREAMBLE_BEGIN_BASE_IDX = 1 +regCP_IB2_PREAMBLE_END = 0x2097 +regCP_IB2_PREAMBLE_END_BASE_IDX = 1 +regCP_DMA_ME_CMD_ADDR_LO = 0x209c +regCP_DMA_ME_CMD_ADDR_LO_BASE_IDX = 1 +regCP_DMA_ME_CMD_ADDR_HI = 0x209d +regCP_DMA_ME_CMD_ADDR_HI_BASE_IDX = 1 +regCP_DMA_PFP_CMD_ADDR_LO = 0x209e +regCP_DMA_PFP_CMD_ADDR_LO_BASE_IDX = 1 +regCP_DMA_PFP_CMD_ADDR_HI = 0x209f +regCP_DMA_PFP_CMD_ADDR_HI_BASE_IDX = 1 +regCP_APPEND_CMD_ADDR_LO = 0x20a0 +regCP_APPEND_CMD_ADDR_LO_BASE_IDX = 1 +regCP_APPEND_CMD_ADDR_HI = 0x20a1 +regCP_APPEND_CMD_ADDR_HI_BASE_IDX = 1 +regUCONFIG_RESERVED_REG0 = 0x20a2 +regUCONFIG_RESERVED_REG0_BASE_IDX = 1 +regUCONFIG_RESERVED_REG1 = 0x20a3 +regUCONFIG_RESERVED_REG1_BASE_IDX = 1 +regCP_PA_MSPRIM_COUNT_LO = 0x20a4 +regCP_PA_MSPRIM_COUNT_LO_BASE_IDX = 1 +regCP_PA_MSPRIM_COUNT_HI = 0x20a5 +regCP_PA_MSPRIM_COUNT_HI_BASE_IDX = 1 +regCP_GE_MSINVOC_COUNT_LO = 0x20a6 +regCP_GE_MSINVOC_COUNT_LO_BASE_IDX = 1 +regCP_GE_MSINVOC_COUNT_HI = 0x20a7 +regCP_GE_MSINVOC_COUNT_HI_BASE_IDX = 1 +regCP_IB1_CMD_BUFSZ = 0x20c0 +regCP_IB1_CMD_BUFSZ_BASE_IDX = 1 +regCP_IB2_CMD_BUFSZ = 0x20c1 +regCP_IB2_CMD_BUFSZ_BASE_IDX = 1 +regCP_ST_CMD_BUFSZ = 0x20c2 +regCP_ST_CMD_BUFSZ_BASE_IDX = 1 +regCP_IB1_BASE_LO = 0x20cc +regCP_IB1_BASE_LO_BASE_IDX = 1 +regCP_IB1_BASE_HI = 0x20cd +regCP_IB1_BASE_HI_BASE_IDX = 1 +regCP_IB1_BUFSZ = 0x20ce +regCP_IB1_BUFSZ_BASE_IDX = 1 +regCP_IB2_BASE_LO = 0x20cf +regCP_IB2_BASE_LO_BASE_IDX = 1 +regCP_IB2_BASE_HI = 0x20d0 +regCP_IB2_BASE_HI_BASE_IDX = 1 +regCP_IB2_BUFSZ = 0x20d1 +regCP_IB2_BUFSZ_BASE_IDX = 1 +regCP_ST_BASE_LO = 0x20d2 +regCP_ST_BASE_LO_BASE_IDX = 1 +regCP_ST_BASE_HI = 0x20d3 +regCP_ST_BASE_HI_BASE_IDX = 1 +regCP_ST_BUFSZ = 0x20d4 +regCP_ST_BUFSZ_BASE_IDX = 1 +regCP_EOP_DONE_EVENT_CNTL = 0x20d5 +regCP_EOP_DONE_EVENT_CNTL_BASE_IDX = 1 +regCP_EOP_DONE_DATA_CNTL = 0x20d6 +regCP_EOP_DONE_DATA_CNTL_BASE_IDX = 1 +regCP_EOP_DONE_CNTX_ID = 0x20d7 +regCP_EOP_DONE_CNTX_ID_BASE_IDX = 1 +regCP_DB_BASE_LO = 0x20d8 +regCP_DB_BASE_LO_BASE_IDX = 1 +regCP_DB_BASE_HI = 0x20d9 +regCP_DB_BASE_HI_BASE_IDX = 1 +regCP_DB_BUFSZ = 0x20da +regCP_DB_BUFSZ_BASE_IDX = 1 +regCP_DB_CMD_BUFSZ = 0x20db +regCP_DB_CMD_BUFSZ_BASE_IDX = 1 +regCP_PFP_COMPLETION_STATUS = 0x20ec +regCP_PFP_COMPLETION_STATUS_BASE_IDX = 1 +regCP_PRED_NOT_VISIBLE = 0x20ee +regCP_PRED_NOT_VISIBLE_BASE_IDX = 1 +regCP_PFP_METADATA_BASE_ADDR = 0x20f0 +regCP_PFP_METADATA_BASE_ADDR_BASE_IDX = 1 +regCP_PFP_METADATA_BASE_ADDR_HI = 0x20f1 +regCP_PFP_METADATA_BASE_ADDR_HI_BASE_IDX = 1 +regCP_DRAW_INDX_INDR_ADDR = 0x20f4 +regCP_DRAW_INDX_INDR_ADDR_BASE_IDX = 1 +regCP_DRAW_INDX_INDR_ADDR_HI = 0x20f5 +regCP_DRAW_INDX_INDR_ADDR_HI_BASE_IDX = 1 +regCP_DISPATCH_INDR_ADDR = 0x20f6 +regCP_DISPATCH_INDR_ADDR_BASE_IDX = 1 +regCP_DISPATCH_INDR_ADDR_HI = 0x20f7 +regCP_DISPATCH_INDR_ADDR_HI_BASE_IDX = 1 +regCP_INDEX_BASE_ADDR = 0x20f8 +regCP_INDEX_BASE_ADDR_BASE_IDX = 1 +regCP_INDEX_BASE_ADDR_HI = 0x20f9 +regCP_INDEX_BASE_ADDR_HI_BASE_IDX = 1 +regCP_INDEX_TYPE = 0x20fa +regCP_INDEX_TYPE_BASE_IDX = 1 +regCP_GDS_BKUP_ADDR = 0x20fb +regCP_GDS_BKUP_ADDR_BASE_IDX = 1 +regCP_GDS_BKUP_ADDR_HI = 0x20fc +regCP_GDS_BKUP_ADDR_HI_BASE_IDX = 1 +regCP_SAMPLE_STATUS = 0x20fd +regCP_SAMPLE_STATUS_BASE_IDX = 1 +regCP_ME_COHER_CNTL = 0x20fe +regCP_ME_COHER_CNTL_BASE_IDX = 1 +regCP_ME_COHER_SIZE = 0x20ff +regCP_ME_COHER_SIZE_BASE_IDX = 1 +regCP_ME_COHER_SIZE_HI = 0x2100 +regCP_ME_COHER_SIZE_HI_BASE_IDX = 1 +regCP_ME_COHER_BASE = 0x2101 +regCP_ME_COHER_BASE_BASE_IDX = 1 +regCP_ME_COHER_BASE_HI = 0x2102 +regCP_ME_COHER_BASE_HI_BASE_IDX = 1 +regCP_ME_COHER_STATUS = 0x2103 +regCP_ME_COHER_STATUS_BASE_IDX = 1 +regRLC_GPM_PERF_COUNT_0 = 0x2140 +regRLC_GPM_PERF_COUNT_0_BASE_IDX = 1 +regRLC_GPM_PERF_COUNT_1 = 0x2141 +regRLC_GPM_PERF_COUNT_1_BASE_IDX = 1 +regGRBM_GFX_INDEX = 0x2200 +regGRBM_GFX_INDEX_BASE_IDX = 1 +regVGT_PRIMITIVE_TYPE = 0x2242 +regVGT_PRIMITIVE_TYPE_BASE_IDX = 1 +regVGT_INDEX_TYPE = 0x2243 +regVGT_INDEX_TYPE_BASE_IDX = 1 +regGE_MIN_VTX_INDX = 0x2249 +regGE_MIN_VTX_INDX_BASE_IDX = 1 +regGE_INDX_OFFSET = 0x224a +regGE_INDX_OFFSET_BASE_IDX = 1 +regGE_MULTI_PRIM_IB_RESET_EN = 0x224b +regGE_MULTI_PRIM_IB_RESET_EN_BASE_IDX = 1 +regVGT_NUM_INDICES = 0x224c +regVGT_NUM_INDICES_BASE_IDX = 1 +regVGT_NUM_INSTANCES = 0x224d +regVGT_NUM_INSTANCES_BASE_IDX = 1 +regVGT_TF_RING_SIZE = 0x224e +regVGT_TF_RING_SIZE_BASE_IDX = 1 +regVGT_HS_OFFCHIP_PARAM = 0x224f +regVGT_HS_OFFCHIP_PARAM_BASE_IDX = 1 +regVGT_TF_MEMORY_BASE = 0x2250 +regVGT_TF_MEMORY_BASE_BASE_IDX = 1 +regGE_MAX_VTX_INDX = 0x2259 +regGE_MAX_VTX_INDX_BASE_IDX = 1 +regVGT_INSTANCE_BASE_ID = 0x225a +regVGT_INSTANCE_BASE_ID_BASE_IDX = 1 +regGE_CNTL = 0x225b +regGE_CNTL_BASE_IDX = 1 +regGE_USER_VGPR1 = 0x225c +regGE_USER_VGPR1_BASE_IDX = 1 +regGE_USER_VGPR2 = 0x225d +regGE_USER_VGPR2_BASE_IDX = 1 +regGE_USER_VGPR3 = 0x225e +regGE_USER_VGPR3_BASE_IDX = 1 +regGE_STEREO_CNTL = 0x225f +regGE_STEREO_CNTL_BASE_IDX = 1 +regGE_PC_ALLOC = 0x2260 +regGE_PC_ALLOC_BASE_IDX = 1 +regVGT_TF_MEMORY_BASE_HI = 0x2261 +regVGT_TF_MEMORY_BASE_HI_BASE_IDX = 1 +regGE_USER_VGPR_EN = 0x2262 +regGE_USER_VGPR_EN_BASE_IDX = 1 +regGE_GS_FAST_LAUNCH_WG_DIM = 0x2264 +regGE_GS_FAST_LAUNCH_WG_DIM_BASE_IDX = 1 +regGE_GS_FAST_LAUNCH_WG_DIM_1 = 0x2265 +regGE_GS_FAST_LAUNCH_WG_DIM_1_BASE_IDX = 1 +regVGT_GS_OUT_PRIM_TYPE = 0x2266 +regVGT_GS_OUT_PRIM_TYPE_BASE_IDX = 1 +regPA_SU_LINE_STIPPLE_VALUE = 0x2280 +regPA_SU_LINE_STIPPLE_VALUE_BASE_IDX = 1 +regPA_SC_LINE_STIPPLE_STATE = 0x2281 +regPA_SC_LINE_STIPPLE_STATE_BASE_IDX = 1 +regPA_SC_SCREEN_EXTENT_MIN_0 = 0x2284 +regPA_SC_SCREEN_EXTENT_MIN_0_BASE_IDX = 1 +regPA_SC_SCREEN_EXTENT_MAX_0 = 0x2285 +regPA_SC_SCREEN_EXTENT_MAX_0_BASE_IDX = 1 +regPA_SC_SCREEN_EXTENT_MIN_1 = 0x2286 +regPA_SC_SCREEN_EXTENT_MIN_1_BASE_IDX = 1 +regPA_SC_SCREEN_EXTENT_MAX_1 = 0x228b +regPA_SC_SCREEN_EXTENT_MAX_1_BASE_IDX = 1 +regPA_SC_P3D_TRAP_SCREEN_HV_EN = 0x22a0 +regPA_SC_P3D_TRAP_SCREEN_HV_EN_BASE_IDX = 1 +regPA_SC_P3D_TRAP_SCREEN_H = 0x22a1 +regPA_SC_P3D_TRAP_SCREEN_H_BASE_IDX = 1 +regPA_SC_P3D_TRAP_SCREEN_V = 0x22a2 +regPA_SC_P3D_TRAP_SCREEN_V_BASE_IDX = 1 +regPA_SC_P3D_TRAP_SCREEN_OCCURRENCE = 0x22a3 +regPA_SC_P3D_TRAP_SCREEN_OCCURRENCE_BASE_IDX = 1 +regPA_SC_P3D_TRAP_SCREEN_COUNT = 0x22a4 +regPA_SC_P3D_TRAP_SCREEN_COUNT_BASE_IDX = 1 +regPA_SC_HP3D_TRAP_SCREEN_HV_EN = 0x22a8 +regPA_SC_HP3D_TRAP_SCREEN_HV_EN_BASE_IDX = 1 +regPA_SC_HP3D_TRAP_SCREEN_H = 0x22a9 +regPA_SC_HP3D_TRAP_SCREEN_H_BASE_IDX = 1 +regPA_SC_HP3D_TRAP_SCREEN_V = 0x22aa +regPA_SC_HP3D_TRAP_SCREEN_V_BASE_IDX = 1 +regPA_SC_HP3D_TRAP_SCREEN_OCCURRENCE = 0x22ab +regPA_SC_HP3D_TRAP_SCREEN_OCCURRENCE_BASE_IDX = 1 +regPA_SC_HP3D_TRAP_SCREEN_COUNT = 0x22ac +regPA_SC_HP3D_TRAP_SCREEN_COUNT_BASE_IDX = 1 +regPA_SC_TRAP_SCREEN_HV_EN = 0x22b0 +regPA_SC_TRAP_SCREEN_HV_EN_BASE_IDX = 1 +regPA_SC_TRAP_SCREEN_H = 0x22b1 +regPA_SC_TRAP_SCREEN_H_BASE_IDX = 1 +regPA_SC_TRAP_SCREEN_V = 0x22b2 +regPA_SC_TRAP_SCREEN_V_BASE_IDX = 1 +regPA_SC_TRAP_SCREEN_OCCURRENCE = 0x22b3 +regPA_SC_TRAP_SCREEN_OCCURRENCE_BASE_IDX = 1 +regPA_SC_TRAP_SCREEN_COUNT = 0x22b4 +regPA_SC_TRAP_SCREEN_COUNT_BASE_IDX = 1 +regSQ_THREAD_TRACE_USERDATA_0 = 0x2340 +regSQ_THREAD_TRACE_USERDATA_0_BASE_IDX = 1 +regSQ_THREAD_TRACE_USERDATA_1 = 0x2341 +regSQ_THREAD_TRACE_USERDATA_1_BASE_IDX = 1 +regSQ_THREAD_TRACE_USERDATA_2 = 0x2342 +regSQ_THREAD_TRACE_USERDATA_2_BASE_IDX = 1 +regSQ_THREAD_TRACE_USERDATA_3 = 0x2343 +regSQ_THREAD_TRACE_USERDATA_3_BASE_IDX = 1 +regSQ_THREAD_TRACE_USERDATA_4 = 0x2344 +regSQ_THREAD_TRACE_USERDATA_4_BASE_IDX = 1 +regSQ_THREAD_TRACE_USERDATA_5 = 0x2345 +regSQ_THREAD_TRACE_USERDATA_5_BASE_IDX = 1 +regSQ_THREAD_TRACE_USERDATA_6 = 0x2346 +regSQ_THREAD_TRACE_USERDATA_6_BASE_IDX = 1 +regSQ_THREAD_TRACE_USERDATA_7 = 0x2347 +regSQ_THREAD_TRACE_USERDATA_7_BASE_IDX = 1 +regSQC_CACHES = 0x2348 +regSQC_CACHES_BASE_IDX = 1 +regTA_CS_BC_BASE_ADDR = 0x2380 +regTA_CS_BC_BASE_ADDR_BASE_IDX = 1 +regTA_CS_BC_BASE_ADDR_HI = 0x2381 +regTA_CS_BC_BASE_ADDR_HI_BASE_IDX = 1 +regDB_OCCLUSION_COUNT0_LOW = 0x23c0 +regDB_OCCLUSION_COUNT0_LOW_BASE_IDX = 1 +regDB_OCCLUSION_COUNT0_HI = 0x23c1 +regDB_OCCLUSION_COUNT0_HI_BASE_IDX = 1 +regDB_OCCLUSION_COUNT1_LOW = 0x23c2 +regDB_OCCLUSION_COUNT1_LOW_BASE_IDX = 1 +regDB_OCCLUSION_COUNT1_HI = 0x23c3 +regDB_OCCLUSION_COUNT1_HI_BASE_IDX = 1 +regDB_OCCLUSION_COUNT2_LOW = 0x23c4 +regDB_OCCLUSION_COUNT2_LOW_BASE_IDX = 1 +regDB_OCCLUSION_COUNT2_HI = 0x23c5 +regDB_OCCLUSION_COUNT2_HI_BASE_IDX = 1 +regDB_OCCLUSION_COUNT3_LOW = 0x23c6 +regDB_OCCLUSION_COUNT3_LOW_BASE_IDX = 1 +regDB_OCCLUSION_COUNT3_HI = 0x23c7 +regDB_OCCLUSION_COUNT3_HI_BASE_IDX = 1 +regGDS_RD_ADDR = 0x2400 +regGDS_RD_ADDR_BASE_IDX = 1 +regGDS_RD_DATA = 0x2401 +regGDS_RD_DATA_BASE_IDX = 1 +regGDS_RD_BURST_ADDR = 0x2402 +regGDS_RD_BURST_ADDR_BASE_IDX = 1 +regGDS_RD_BURST_COUNT = 0x2403 +regGDS_RD_BURST_COUNT_BASE_IDX = 1 +regGDS_RD_BURST_DATA = 0x2404 +regGDS_RD_BURST_DATA_BASE_IDX = 1 +regGDS_WR_ADDR = 0x2405 +regGDS_WR_ADDR_BASE_IDX = 1 +regGDS_WR_DATA = 0x2406 +regGDS_WR_DATA_BASE_IDX = 1 +regGDS_WR_BURST_ADDR = 0x2407 +regGDS_WR_BURST_ADDR_BASE_IDX = 1 +regGDS_WR_BURST_DATA = 0x2408 +regGDS_WR_BURST_DATA_BASE_IDX = 1 +regGDS_WRITE_COMPLETE = 0x2409 +regGDS_WRITE_COMPLETE_BASE_IDX = 1 +regGDS_ATOM_CNTL = 0x240a +regGDS_ATOM_CNTL_BASE_IDX = 1 +regGDS_ATOM_COMPLETE = 0x240b +regGDS_ATOM_COMPLETE_BASE_IDX = 1 +regGDS_ATOM_BASE = 0x240c +regGDS_ATOM_BASE_BASE_IDX = 1 +regGDS_ATOM_SIZE = 0x240d +regGDS_ATOM_SIZE_BASE_IDX = 1 +regGDS_ATOM_OFFSET0 = 0x240e +regGDS_ATOM_OFFSET0_BASE_IDX = 1 +regGDS_ATOM_OFFSET1 = 0x240f +regGDS_ATOM_OFFSET1_BASE_IDX = 1 +regGDS_ATOM_DST = 0x2410 +regGDS_ATOM_DST_BASE_IDX = 1 +regGDS_ATOM_OP = 0x2411 +regGDS_ATOM_OP_BASE_IDX = 1 +regGDS_ATOM_SRC0 = 0x2412 +regGDS_ATOM_SRC0_BASE_IDX = 1 +regGDS_ATOM_SRC0_U = 0x2413 +regGDS_ATOM_SRC0_U_BASE_IDX = 1 +regGDS_ATOM_SRC1 = 0x2414 +regGDS_ATOM_SRC1_BASE_IDX = 1 +regGDS_ATOM_SRC1_U = 0x2415 +regGDS_ATOM_SRC1_U_BASE_IDX = 1 +regGDS_ATOM_READ0 = 0x2416 +regGDS_ATOM_READ0_BASE_IDX = 1 +regGDS_ATOM_READ0_U = 0x2417 +regGDS_ATOM_READ0_U_BASE_IDX = 1 +regGDS_ATOM_READ1 = 0x2418 +regGDS_ATOM_READ1_BASE_IDX = 1 +regGDS_ATOM_READ1_U = 0x2419 +regGDS_ATOM_READ1_U_BASE_IDX = 1 +regGDS_GWS_RESOURCE_CNTL = 0x241a +regGDS_GWS_RESOURCE_CNTL_BASE_IDX = 1 +regGDS_GWS_RESOURCE = 0x241b +regGDS_GWS_RESOURCE_BASE_IDX = 1 +regGDS_GWS_RESOURCE_CNT = 0x241c +regGDS_GWS_RESOURCE_CNT_BASE_IDX = 1 +regGDS_OA_CNTL = 0x241d +regGDS_OA_CNTL_BASE_IDX = 1 +regGDS_OA_COUNTER = 0x241e +regGDS_OA_COUNTER_BASE_IDX = 1 +regGDS_OA_ADDRESS = 0x241f +regGDS_OA_ADDRESS_BASE_IDX = 1 +regGDS_OA_INCDEC = 0x2420 +regGDS_OA_INCDEC_BASE_IDX = 1 +regGDS_OA_RING_SIZE = 0x2421 +regGDS_OA_RING_SIZE_BASE_IDX = 1 +regGDS_STRMOUT_DWORDS_WRITTEN_0 = 0x2422 +regGDS_STRMOUT_DWORDS_WRITTEN_0_BASE_IDX = 1 +regGDS_STRMOUT_DWORDS_WRITTEN_1 = 0x2423 +regGDS_STRMOUT_DWORDS_WRITTEN_1_BASE_IDX = 1 +regGDS_STRMOUT_DWORDS_WRITTEN_2 = 0x2424 +regGDS_STRMOUT_DWORDS_WRITTEN_2_BASE_IDX = 1 +regGDS_STRMOUT_DWORDS_WRITTEN_3 = 0x2425 +regGDS_STRMOUT_DWORDS_WRITTEN_3_BASE_IDX = 1 +regGDS_GS_0 = 0x2426 +regGDS_GS_0_BASE_IDX = 1 +regGDS_GS_1 = 0x2427 +regGDS_GS_1_BASE_IDX = 1 +regGDS_GS_2 = 0x2428 +regGDS_GS_2_BASE_IDX = 1 +regGDS_GS_3 = 0x2429 +regGDS_GS_3_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_NEEDED_0_LO = 0x242a +regGDS_STRMOUT_PRIMS_NEEDED_0_LO_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_NEEDED_0_HI = 0x242b +regGDS_STRMOUT_PRIMS_NEEDED_0_HI_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_WRITTEN_0_LO = 0x242c +regGDS_STRMOUT_PRIMS_WRITTEN_0_LO_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_WRITTEN_0_HI = 0x242d +regGDS_STRMOUT_PRIMS_WRITTEN_0_HI_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_NEEDED_1_LO = 0x242e +regGDS_STRMOUT_PRIMS_NEEDED_1_LO_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_NEEDED_1_HI = 0x242f +regGDS_STRMOUT_PRIMS_NEEDED_1_HI_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_WRITTEN_1_LO = 0x2430 +regGDS_STRMOUT_PRIMS_WRITTEN_1_LO_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_WRITTEN_1_HI = 0x2431 +regGDS_STRMOUT_PRIMS_WRITTEN_1_HI_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_NEEDED_2_LO = 0x2432 +regGDS_STRMOUT_PRIMS_NEEDED_2_LO_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_NEEDED_2_HI = 0x2433 +regGDS_STRMOUT_PRIMS_NEEDED_2_HI_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_WRITTEN_2_LO = 0x2434 +regGDS_STRMOUT_PRIMS_WRITTEN_2_LO_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_WRITTEN_2_HI = 0x2435 +regGDS_STRMOUT_PRIMS_WRITTEN_2_HI_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_NEEDED_3_LO = 0x2436 +regGDS_STRMOUT_PRIMS_NEEDED_3_LO_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_NEEDED_3_HI = 0x2437 +regGDS_STRMOUT_PRIMS_NEEDED_3_HI_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_WRITTEN_3_LO = 0x2438 +regGDS_STRMOUT_PRIMS_WRITTEN_3_LO_BASE_IDX = 1 +regGDS_STRMOUT_PRIMS_WRITTEN_3_HI = 0x2439 +regGDS_STRMOUT_PRIMS_WRITTEN_3_HI_BASE_IDX = 1 +regSPI_CONFIG_CNTL = 0x2440 +regSPI_CONFIG_CNTL_BASE_IDX = 1 +regSPI_CONFIG_CNTL_1 = 0x2441 +regSPI_CONFIG_CNTL_1_BASE_IDX = 1 +regSPI_CONFIG_CNTL_2 = 0x2442 +regSPI_CONFIG_CNTL_2_BASE_IDX = 1 +regSPI_WAVE_LIMIT_CNTL = 0x2443 +regSPI_WAVE_LIMIT_CNTL_BASE_IDX = 1 +regSPI_GS_THROTTLE_CNTL1 = 0x2444 +regSPI_GS_THROTTLE_CNTL1_BASE_IDX = 1 +regSPI_GS_THROTTLE_CNTL2 = 0x2445 +regSPI_GS_THROTTLE_CNTL2_BASE_IDX = 1 +regSPI_ATTRIBUTE_RING_BASE = 0x2446 +regSPI_ATTRIBUTE_RING_BASE_BASE_IDX = 1 +regSPI_ATTRIBUTE_RING_SIZE = 0x2447 +regSPI_ATTRIBUTE_RING_SIZE_BASE_IDX = 1 +regCP_MES_PRGRM_CNTR_START = 0x2800 +regCP_MES_PRGRM_CNTR_START_BASE_IDX = 1 +regCP_MES_INTR_ROUTINE_START = 0x2801 +regCP_MES_INTR_ROUTINE_START_BASE_IDX = 1 +regCP_MES_MTVEC_LO = 0x2801 +regCP_MES_MTVEC_LO_BASE_IDX = 1 +regCP_MES_INTR_ROUTINE_START_HI = 0x2802 +regCP_MES_INTR_ROUTINE_START_HI_BASE_IDX = 1 +regCP_MES_MTVEC_HI = 0x2802 +regCP_MES_MTVEC_HI_BASE_IDX = 1 +regCP_MES_CNTL = 0x2807 +regCP_MES_CNTL_BASE_IDX = 1 +regCP_MES_PIPE_PRIORITY_CNTS = 0x2808 +regCP_MES_PIPE_PRIORITY_CNTS_BASE_IDX = 1 +regCP_MES_PIPE0_PRIORITY = 0x2809 +regCP_MES_PIPE0_PRIORITY_BASE_IDX = 1 +regCP_MES_PIPE1_PRIORITY = 0x280a +regCP_MES_PIPE1_PRIORITY_BASE_IDX = 1 +regCP_MES_PIPE2_PRIORITY = 0x280b +regCP_MES_PIPE2_PRIORITY_BASE_IDX = 1 +regCP_MES_PIPE3_PRIORITY = 0x280c +regCP_MES_PIPE3_PRIORITY_BASE_IDX = 1 +regCP_MES_HEADER_DUMP = 0x280d +regCP_MES_HEADER_DUMP_BASE_IDX = 1 +regCP_MES_MIE_LO = 0x280e +regCP_MES_MIE_LO_BASE_IDX = 1 +regCP_MES_MIE_HI = 0x280f +regCP_MES_MIE_HI_BASE_IDX = 1 +regCP_MES_INTERRUPT = 0x2810 +regCP_MES_INTERRUPT_BASE_IDX = 1 +regCP_MES_SCRATCH_INDEX = 0x2811 +regCP_MES_SCRATCH_INDEX_BASE_IDX = 1 +regCP_MES_SCRATCH_DATA = 0x2812 +regCP_MES_SCRATCH_DATA_BASE_IDX = 1 +regCP_MES_INSTR_PNTR = 0x2813 +regCP_MES_INSTR_PNTR_BASE_IDX = 1 +regCP_MES_MSCRATCH_HI = 0x2814 +regCP_MES_MSCRATCH_HI_BASE_IDX = 1 +regCP_MES_MSCRATCH_LO = 0x2815 +regCP_MES_MSCRATCH_LO_BASE_IDX = 1 +regCP_MES_MSTATUS_LO = 0x2816 +regCP_MES_MSTATUS_LO_BASE_IDX = 1 +regCP_MES_MSTATUS_HI = 0x2817 +regCP_MES_MSTATUS_HI_BASE_IDX = 1 +regCP_MES_MEPC_LO = 0x2818 +regCP_MES_MEPC_LO_BASE_IDX = 1 +regCP_MES_MEPC_HI = 0x2819 +regCP_MES_MEPC_HI_BASE_IDX = 1 +regCP_MES_MCAUSE_LO = 0x281a +regCP_MES_MCAUSE_LO_BASE_IDX = 1 +regCP_MES_MCAUSE_HI = 0x281b +regCP_MES_MCAUSE_HI_BASE_IDX = 1 +regCP_MES_MBADADDR_LO = 0x281c +regCP_MES_MBADADDR_LO_BASE_IDX = 1 +regCP_MES_MBADADDR_HI = 0x281d +regCP_MES_MBADADDR_HI_BASE_IDX = 1 +regCP_MES_MIP_LO = 0x281e +regCP_MES_MIP_LO_BASE_IDX = 1 +regCP_MES_MIP_HI = 0x281f +regCP_MES_MIP_HI_BASE_IDX = 1 +regCP_MES_IC_OP_CNTL = 0x2820 +regCP_MES_IC_OP_CNTL_BASE_IDX = 1 +regCP_MES_MCYCLE_LO = 0x2826 +regCP_MES_MCYCLE_LO_BASE_IDX = 1 +regCP_MES_MCYCLE_HI = 0x2827 +regCP_MES_MCYCLE_HI_BASE_IDX = 1 +regCP_MES_MTIME_LO = 0x2828 +regCP_MES_MTIME_LO_BASE_IDX = 1 +regCP_MES_MTIME_HI = 0x2829 +regCP_MES_MTIME_HI_BASE_IDX = 1 +regCP_MES_MINSTRET_LO = 0x282a +regCP_MES_MINSTRET_LO_BASE_IDX = 1 +regCP_MES_MINSTRET_HI = 0x282b +regCP_MES_MINSTRET_HI_BASE_IDX = 1 +regCP_MES_MISA_LO = 0x282c +regCP_MES_MISA_LO_BASE_IDX = 1 +regCP_MES_MISA_HI = 0x282d +regCP_MES_MISA_HI_BASE_IDX = 1 +regCP_MES_MVENDORID_LO = 0x282e +regCP_MES_MVENDORID_LO_BASE_IDX = 1 +regCP_MES_MVENDORID_HI = 0x282f +regCP_MES_MVENDORID_HI_BASE_IDX = 1 +regCP_MES_MARCHID_LO = 0x2830 +regCP_MES_MARCHID_LO_BASE_IDX = 1 +regCP_MES_MARCHID_HI = 0x2831 +regCP_MES_MARCHID_HI_BASE_IDX = 1 +regCP_MES_MIMPID_LO = 0x2832 +regCP_MES_MIMPID_LO_BASE_IDX = 1 +regCP_MES_MIMPID_HI = 0x2833 +regCP_MES_MIMPID_HI_BASE_IDX = 1 +regCP_MES_MHARTID_LO = 0x2834 +regCP_MES_MHARTID_LO_BASE_IDX = 1 +regCP_MES_MHARTID_HI = 0x2835 +regCP_MES_MHARTID_HI_BASE_IDX = 1 +regCP_MES_DC_BASE_CNTL = 0x2836 +regCP_MES_DC_BASE_CNTL_BASE_IDX = 1 +regCP_MES_DC_OP_CNTL = 0x2837 +regCP_MES_DC_OP_CNTL_BASE_IDX = 1 +regCP_MES_MTIMECMP_LO = 0x2838 +regCP_MES_MTIMECMP_LO_BASE_IDX = 1 +regCP_MES_MTIMECMP_HI = 0x2839 +regCP_MES_MTIMECMP_HI_BASE_IDX = 1 +regCP_MES_PROCESS_QUANTUM_PIPE0 = 0x283a +regCP_MES_PROCESS_QUANTUM_PIPE0_BASE_IDX = 1 +regCP_MES_PROCESS_QUANTUM_PIPE1 = 0x283b +regCP_MES_PROCESS_QUANTUM_PIPE1_BASE_IDX = 1 +regCP_MES_DOORBELL_CONTROL1 = 0x283c +regCP_MES_DOORBELL_CONTROL1_BASE_IDX = 1 +regCP_MES_DOORBELL_CONTROL2 = 0x283d +regCP_MES_DOORBELL_CONTROL2_BASE_IDX = 1 +regCP_MES_DOORBELL_CONTROL3 = 0x283e +regCP_MES_DOORBELL_CONTROL3_BASE_IDX = 1 +regCP_MES_DOORBELL_CONTROL4 = 0x283f +regCP_MES_DOORBELL_CONTROL4_BASE_IDX = 1 +regCP_MES_DOORBELL_CONTROL5 = 0x2840 +regCP_MES_DOORBELL_CONTROL5_BASE_IDX = 1 +regCP_MES_DOORBELL_CONTROL6 = 0x2841 +regCP_MES_DOORBELL_CONTROL6_BASE_IDX = 1 +regCP_MES_DEBUG_INTERRUPT_INSTR_PNTR = 0x2842 +regCP_MES_DEBUG_INTERRUPT_INSTR_PNTR_BASE_IDX = 1 +regCP_MES_GP0_LO = 0x2843 +regCP_MES_GP0_LO_BASE_IDX = 1 +regCP_MES_GP0_HI = 0x2844 +regCP_MES_GP0_HI_BASE_IDX = 1 +regCP_MES_GP1_LO = 0x2845 +regCP_MES_GP1_LO_BASE_IDX = 1 +regCP_MES_GP1_HI = 0x2846 +regCP_MES_GP1_HI_BASE_IDX = 1 +regCP_MES_GP2_LO = 0x2847 +regCP_MES_GP2_LO_BASE_IDX = 1 +regCP_MES_GP2_HI = 0x2848 +regCP_MES_GP2_HI_BASE_IDX = 1 +regCP_MES_GP3_LO = 0x2849 +regCP_MES_GP3_LO_BASE_IDX = 1 +regCP_MES_GP3_HI = 0x284a +regCP_MES_GP3_HI_BASE_IDX = 1 +regCP_MES_GP4_LO = 0x284b +regCP_MES_GP4_LO_BASE_IDX = 1 +regCP_MES_GP4_HI = 0x284c +regCP_MES_GP4_HI_BASE_IDX = 1 +regCP_MES_GP5_LO = 0x284d +regCP_MES_GP5_LO_BASE_IDX = 1 +regCP_MES_GP5_HI = 0x284e +regCP_MES_GP5_HI_BASE_IDX = 1 +regCP_MES_GP6_LO = 0x284f +regCP_MES_GP6_LO_BASE_IDX = 1 +regCP_MES_GP6_HI = 0x2850 +regCP_MES_GP6_HI_BASE_IDX = 1 +regCP_MES_GP7_LO = 0x2851 +regCP_MES_GP7_LO_BASE_IDX = 1 +regCP_MES_GP7_HI = 0x2852 +regCP_MES_GP7_HI_BASE_IDX = 1 +regCP_MES_GP8_LO = 0x2853 +regCP_MES_GP8_LO_BASE_IDX = 1 +regCP_MES_GP8_HI = 0x2854 +regCP_MES_GP8_HI_BASE_IDX = 1 +regCP_MES_GP9_LO = 0x2855 +regCP_MES_GP9_LO_BASE_IDX = 1 +regCP_MES_GP9_HI = 0x2856 +regCP_MES_GP9_HI_BASE_IDX = 1 +regCP_MES_LOCAL_BASE0_LO = 0x2883 +regCP_MES_LOCAL_BASE0_LO_BASE_IDX = 1 +regCP_MES_LOCAL_BASE0_HI = 0x2884 +regCP_MES_LOCAL_BASE0_HI_BASE_IDX = 1 +regCP_MES_LOCAL_MASK0_LO = 0x2885 +regCP_MES_LOCAL_MASK0_LO_BASE_IDX = 1 +regCP_MES_LOCAL_MASK0_HI = 0x2886 +regCP_MES_LOCAL_MASK0_HI_BASE_IDX = 1 +regCP_MES_LOCAL_APERTURE = 0x2887 +regCP_MES_LOCAL_APERTURE_BASE_IDX = 1 +regCP_MES_LOCAL_INSTR_BASE_LO = 0x2888 +regCP_MES_LOCAL_INSTR_BASE_LO_BASE_IDX = 1 +regCP_MES_LOCAL_INSTR_BASE_HI = 0x2889 +regCP_MES_LOCAL_INSTR_BASE_HI_BASE_IDX = 1 +regCP_MES_LOCAL_INSTR_MASK_LO = 0x288a +regCP_MES_LOCAL_INSTR_MASK_LO_BASE_IDX = 1 +regCP_MES_LOCAL_INSTR_MASK_HI = 0x288b +regCP_MES_LOCAL_INSTR_MASK_HI_BASE_IDX = 1 +regCP_MES_LOCAL_INSTR_APERTURE = 0x288c +regCP_MES_LOCAL_INSTR_APERTURE_BASE_IDX = 1 +regCP_MES_LOCAL_SCRATCH_APERTURE = 0x288d +regCP_MES_LOCAL_SCRATCH_APERTURE_BASE_IDX = 1 +regCP_MES_LOCAL_SCRATCH_BASE_LO = 0x288e +regCP_MES_LOCAL_SCRATCH_BASE_LO_BASE_IDX = 1 +regCP_MES_LOCAL_SCRATCH_BASE_HI = 0x288f +regCP_MES_LOCAL_SCRATCH_BASE_HI_BASE_IDX = 1 +regCP_MES_PERFCOUNT_CNTL = 0x2899 +regCP_MES_PERFCOUNT_CNTL_BASE_IDX = 1 +regCP_MES_PENDING_INTERRUPT = 0x289a +regCP_MES_PENDING_INTERRUPT_BASE_IDX = 1 +regCP_MES_PRGRM_CNTR_START_HI = 0x289d +regCP_MES_PRGRM_CNTR_START_HI_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_16 = 0x289f +regCP_MES_INTERRUPT_DATA_16_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_17 = 0x28a0 +regCP_MES_INTERRUPT_DATA_17_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_18 = 0x28a1 +regCP_MES_INTERRUPT_DATA_18_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_19 = 0x28a2 +regCP_MES_INTERRUPT_DATA_19_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_20 = 0x28a3 +regCP_MES_INTERRUPT_DATA_20_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_21 = 0x28a4 +regCP_MES_INTERRUPT_DATA_21_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_22 = 0x28a5 +regCP_MES_INTERRUPT_DATA_22_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_23 = 0x28a6 +regCP_MES_INTERRUPT_DATA_23_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_24 = 0x28a7 +regCP_MES_INTERRUPT_DATA_24_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_25 = 0x28a8 +regCP_MES_INTERRUPT_DATA_25_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_26 = 0x28a9 +regCP_MES_INTERRUPT_DATA_26_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_27 = 0x28aa +regCP_MES_INTERRUPT_DATA_27_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_28 = 0x28ab +regCP_MES_INTERRUPT_DATA_28_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_29 = 0x28ac +regCP_MES_INTERRUPT_DATA_29_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_30 = 0x28ad +regCP_MES_INTERRUPT_DATA_30_BASE_IDX = 1 +regCP_MES_INTERRUPT_DATA_31 = 0x28ae +regCP_MES_INTERRUPT_DATA_31_BASE_IDX = 1 +regCP_MES_DC_APERTURE0_BASE = 0x28af +regCP_MES_DC_APERTURE0_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE0_MASK = 0x28b0 +regCP_MES_DC_APERTURE0_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE0_CNTL = 0x28b1 +regCP_MES_DC_APERTURE0_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE1_BASE = 0x28b2 +regCP_MES_DC_APERTURE1_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE1_MASK = 0x28b3 +regCP_MES_DC_APERTURE1_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE1_CNTL = 0x28b4 +regCP_MES_DC_APERTURE1_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE2_BASE = 0x28b5 +regCP_MES_DC_APERTURE2_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE2_MASK = 0x28b6 +regCP_MES_DC_APERTURE2_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE2_CNTL = 0x28b7 +regCP_MES_DC_APERTURE2_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE3_BASE = 0x28b8 +regCP_MES_DC_APERTURE3_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE3_MASK = 0x28b9 +regCP_MES_DC_APERTURE3_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE3_CNTL = 0x28ba +regCP_MES_DC_APERTURE3_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE4_BASE = 0x28bb +regCP_MES_DC_APERTURE4_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE4_MASK = 0x28bc +regCP_MES_DC_APERTURE4_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE4_CNTL = 0x28bd +regCP_MES_DC_APERTURE4_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE5_BASE = 0x28be +regCP_MES_DC_APERTURE5_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE5_MASK = 0x28bf +regCP_MES_DC_APERTURE5_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE5_CNTL = 0x28c0 +regCP_MES_DC_APERTURE5_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE6_BASE = 0x28c1 +regCP_MES_DC_APERTURE6_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE6_MASK = 0x28c2 +regCP_MES_DC_APERTURE6_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE6_CNTL = 0x28c3 +regCP_MES_DC_APERTURE6_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE7_BASE = 0x28c4 +regCP_MES_DC_APERTURE7_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE7_MASK = 0x28c5 +regCP_MES_DC_APERTURE7_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE7_CNTL = 0x28c6 +regCP_MES_DC_APERTURE7_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE8_BASE = 0x28c7 +regCP_MES_DC_APERTURE8_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE8_MASK = 0x28c8 +regCP_MES_DC_APERTURE8_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE8_CNTL = 0x28c9 +regCP_MES_DC_APERTURE8_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE9_BASE = 0x28ca +regCP_MES_DC_APERTURE9_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE9_MASK = 0x28cb +regCP_MES_DC_APERTURE9_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE9_CNTL = 0x28cc +regCP_MES_DC_APERTURE9_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE10_BASE = 0x28cd +regCP_MES_DC_APERTURE10_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE10_MASK = 0x28ce +regCP_MES_DC_APERTURE10_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE10_CNTL = 0x28cf +regCP_MES_DC_APERTURE10_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE11_BASE = 0x28d0 +regCP_MES_DC_APERTURE11_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE11_MASK = 0x28d1 +regCP_MES_DC_APERTURE11_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE11_CNTL = 0x28d2 +regCP_MES_DC_APERTURE11_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE12_BASE = 0x28d3 +regCP_MES_DC_APERTURE12_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE12_MASK = 0x28d4 +regCP_MES_DC_APERTURE12_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE12_CNTL = 0x28d5 +regCP_MES_DC_APERTURE12_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE13_BASE = 0x28d6 +regCP_MES_DC_APERTURE13_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE13_MASK = 0x28d7 +regCP_MES_DC_APERTURE13_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE13_CNTL = 0x28d8 +regCP_MES_DC_APERTURE13_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE14_BASE = 0x28d9 +regCP_MES_DC_APERTURE14_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE14_MASK = 0x28da +regCP_MES_DC_APERTURE14_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE14_CNTL = 0x28db +regCP_MES_DC_APERTURE14_CNTL_BASE_IDX = 1 +regCP_MES_DC_APERTURE15_BASE = 0x28dc +regCP_MES_DC_APERTURE15_BASE_BASE_IDX = 1 +regCP_MES_DC_APERTURE15_MASK = 0x28dd +regCP_MES_DC_APERTURE15_MASK_BASE_IDX = 1 +regCP_MES_DC_APERTURE15_CNTL = 0x28de +regCP_MES_DC_APERTURE15_CNTL_BASE_IDX = 1 +regCP_MEC_RS64_PRGRM_CNTR_START = 0x2900 +regCP_MEC_RS64_PRGRM_CNTR_START_BASE_IDX = 1 +regCP_MEC_MTVEC_LO = 0x2901 +regCP_MEC_MTVEC_LO_BASE_IDX = 1 +regCP_MEC_MTVEC_HI = 0x2902 +regCP_MEC_MTVEC_HI_BASE_IDX = 1 +regCP_MEC_ISA_CNTL = 0x2903 +regCP_MEC_ISA_CNTL_BASE_IDX = 1 +regCP_MEC_RS64_CNTL = 0x2904 +regCP_MEC_RS64_CNTL_BASE_IDX = 1 +regCP_MEC_MIE_LO = 0x2905 +regCP_MEC_MIE_LO_BASE_IDX = 1 +regCP_MEC_MIE_HI = 0x2906 +regCP_MEC_MIE_HI_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT = 0x2907 +regCP_MEC_RS64_INTERRUPT_BASE_IDX = 1 +regCP_MEC_RS64_INSTR_PNTR = 0x2908 +regCP_MEC_RS64_INSTR_PNTR_BASE_IDX = 1 +regCP_MEC_MIP_LO = 0x2909 +regCP_MEC_MIP_LO_BASE_IDX = 1 +regCP_MEC_MIP_HI = 0x290a +regCP_MEC_MIP_HI_BASE_IDX = 1 +regCP_MEC_DC_BASE_CNTL = 0x290b +regCP_MEC_DC_BASE_CNTL_BASE_IDX = 1 +regCP_MEC_DC_OP_CNTL = 0x290c +regCP_MEC_DC_OP_CNTL_BASE_IDX = 1 +regCP_MEC_MTIMECMP_LO = 0x290d +regCP_MEC_MTIMECMP_LO_BASE_IDX = 1 +regCP_MEC_MTIMECMP_HI = 0x290e +regCP_MEC_MTIMECMP_HI_BASE_IDX = 1 +regCP_MEC_GP0_LO = 0x2910 +regCP_MEC_GP0_LO_BASE_IDX = 1 +regCP_MEC_GP0_HI = 0x2911 +regCP_MEC_GP0_HI_BASE_IDX = 1 +regCP_MEC_GP1_LO = 0x2912 +regCP_MEC_GP1_LO_BASE_IDX = 1 +regCP_MEC_GP1_HI = 0x2913 +regCP_MEC_GP1_HI_BASE_IDX = 1 +regCP_MEC_GP2_LO = 0x2914 +regCP_MEC_GP2_LO_BASE_IDX = 1 +regCP_MEC_GP2_HI = 0x2915 +regCP_MEC_GP2_HI_BASE_IDX = 1 +regCP_MEC_GP3_LO = 0x2916 +regCP_MEC_GP3_LO_BASE_IDX = 1 +regCP_MEC_GP3_HI = 0x2917 +regCP_MEC_GP3_HI_BASE_IDX = 1 +regCP_MEC_GP4_LO = 0x2918 +regCP_MEC_GP4_LO_BASE_IDX = 1 +regCP_MEC_GP4_HI = 0x2919 +regCP_MEC_GP4_HI_BASE_IDX = 1 +regCP_MEC_GP5_LO = 0x291a +regCP_MEC_GP5_LO_BASE_IDX = 1 +regCP_MEC_GP5_HI = 0x291b +regCP_MEC_GP5_HI_BASE_IDX = 1 +regCP_MEC_GP6_LO = 0x291c +regCP_MEC_GP6_LO_BASE_IDX = 1 +regCP_MEC_GP6_HI = 0x291d +regCP_MEC_GP6_HI_BASE_IDX = 1 +regCP_MEC_GP7_LO = 0x291e +regCP_MEC_GP7_LO_BASE_IDX = 1 +regCP_MEC_GP7_HI = 0x291f +regCP_MEC_GP7_HI_BASE_IDX = 1 +regCP_MEC_GP8_LO = 0x2920 +regCP_MEC_GP8_LO_BASE_IDX = 1 +regCP_MEC_GP8_HI = 0x2921 +regCP_MEC_GP8_HI_BASE_IDX = 1 +regCP_MEC_GP9_LO = 0x2922 +regCP_MEC_GP9_LO_BASE_IDX = 1 +regCP_MEC_GP9_HI = 0x2923 +regCP_MEC_GP9_HI_BASE_IDX = 1 +regCP_MEC_LOCAL_BASE0_LO = 0x2927 +regCP_MEC_LOCAL_BASE0_LO_BASE_IDX = 1 +regCP_MEC_LOCAL_BASE0_HI = 0x2928 +regCP_MEC_LOCAL_BASE0_HI_BASE_IDX = 1 +regCP_MEC_LOCAL_MASK0_LO = 0x2929 +regCP_MEC_LOCAL_MASK0_LO_BASE_IDX = 1 +regCP_MEC_LOCAL_MASK0_HI = 0x292a +regCP_MEC_LOCAL_MASK0_HI_BASE_IDX = 1 +regCP_MEC_LOCAL_APERTURE = 0x292b +regCP_MEC_LOCAL_APERTURE_BASE_IDX = 1 +regCP_MEC_LOCAL_INSTR_BASE_LO = 0x292c +regCP_MEC_LOCAL_INSTR_BASE_LO_BASE_IDX = 1 +regCP_MEC_LOCAL_INSTR_BASE_HI = 0x292d +regCP_MEC_LOCAL_INSTR_BASE_HI_BASE_IDX = 1 +regCP_MEC_LOCAL_INSTR_MASK_LO = 0x292e +regCP_MEC_LOCAL_INSTR_MASK_LO_BASE_IDX = 1 +regCP_MEC_LOCAL_INSTR_MASK_HI = 0x292f +regCP_MEC_LOCAL_INSTR_MASK_HI_BASE_IDX = 1 +regCP_MEC_LOCAL_INSTR_APERTURE = 0x2930 +regCP_MEC_LOCAL_INSTR_APERTURE_BASE_IDX = 1 +regCP_MEC_LOCAL_SCRATCH_APERTURE = 0x2931 +regCP_MEC_LOCAL_SCRATCH_APERTURE_BASE_IDX = 1 +regCP_MEC_LOCAL_SCRATCH_BASE_LO = 0x2932 +regCP_MEC_LOCAL_SCRATCH_BASE_LO_BASE_IDX = 1 +regCP_MEC_LOCAL_SCRATCH_BASE_HI = 0x2933 +regCP_MEC_LOCAL_SCRATCH_BASE_HI_BASE_IDX = 1 +regCP_MEC_RS64_PERFCOUNT_CNTL = 0x2934 +regCP_MEC_RS64_PERFCOUNT_CNTL_BASE_IDX = 1 +regCP_MEC_RS64_PENDING_INTERRUPT = 0x2935 +regCP_MEC_RS64_PENDING_INTERRUPT_BASE_IDX = 1 +regCP_MEC_RS64_PRGRM_CNTR_START_HI = 0x2938 +regCP_MEC_RS64_PRGRM_CNTR_START_HI_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_16 = 0x293a +regCP_MEC_RS64_INTERRUPT_DATA_16_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_17 = 0x293b +regCP_MEC_RS64_INTERRUPT_DATA_17_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_18 = 0x293c +regCP_MEC_RS64_INTERRUPT_DATA_18_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_19 = 0x293d +regCP_MEC_RS64_INTERRUPT_DATA_19_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_20 = 0x293e +regCP_MEC_RS64_INTERRUPT_DATA_20_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_21 = 0x293f +regCP_MEC_RS64_INTERRUPT_DATA_21_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_22 = 0x2940 +regCP_MEC_RS64_INTERRUPT_DATA_22_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_23 = 0x2941 +regCP_MEC_RS64_INTERRUPT_DATA_23_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_24 = 0x2942 +regCP_MEC_RS64_INTERRUPT_DATA_24_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_25 = 0x2943 +regCP_MEC_RS64_INTERRUPT_DATA_25_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_26 = 0x2944 +regCP_MEC_RS64_INTERRUPT_DATA_26_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_27 = 0x2945 +regCP_MEC_RS64_INTERRUPT_DATA_27_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_28 = 0x2946 +regCP_MEC_RS64_INTERRUPT_DATA_28_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_29 = 0x2947 +regCP_MEC_RS64_INTERRUPT_DATA_29_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_30 = 0x2948 +regCP_MEC_RS64_INTERRUPT_DATA_30_BASE_IDX = 1 +regCP_MEC_RS64_INTERRUPT_DATA_31 = 0x2949 +regCP_MEC_RS64_INTERRUPT_DATA_31_BASE_IDX = 1 +regCP_MEC_DC_APERTURE0_BASE = 0x294a +regCP_MEC_DC_APERTURE0_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE0_MASK = 0x294b +regCP_MEC_DC_APERTURE0_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE0_CNTL = 0x294c +regCP_MEC_DC_APERTURE0_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE1_BASE = 0x294d +regCP_MEC_DC_APERTURE1_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE1_MASK = 0x294e +regCP_MEC_DC_APERTURE1_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE1_CNTL = 0x294f +regCP_MEC_DC_APERTURE1_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE2_BASE = 0x2950 +regCP_MEC_DC_APERTURE2_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE2_MASK = 0x2951 +regCP_MEC_DC_APERTURE2_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE2_CNTL = 0x2952 +regCP_MEC_DC_APERTURE2_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE3_BASE = 0x2953 +regCP_MEC_DC_APERTURE3_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE3_MASK = 0x2954 +regCP_MEC_DC_APERTURE3_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE3_CNTL = 0x2955 +regCP_MEC_DC_APERTURE3_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE4_BASE = 0x2956 +regCP_MEC_DC_APERTURE4_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE4_MASK = 0x2957 +regCP_MEC_DC_APERTURE4_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE4_CNTL = 0x2958 +regCP_MEC_DC_APERTURE4_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE5_BASE = 0x2959 +regCP_MEC_DC_APERTURE5_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE5_MASK = 0x295a +regCP_MEC_DC_APERTURE5_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE5_CNTL = 0x295b +regCP_MEC_DC_APERTURE5_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE6_BASE = 0x295c +regCP_MEC_DC_APERTURE6_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE6_MASK = 0x295d +regCP_MEC_DC_APERTURE6_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE6_CNTL = 0x295e +regCP_MEC_DC_APERTURE6_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE7_BASE = 0x295f +regCP_MEC_DC_APERTURE7_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE7_MASK = 0x2960 +regCP_MEC_DC_APERTURE7_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE7_CNTL = 0x2961 +regCP_MEC_DC_APERTURE7_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE8_BASE = 0x2962 +regCP_MEC_DC_APERTURE8_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE8_MASK = 0x2963 +regCP_MEC_DC_APERTURE8_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE8_CNTL = 0x2964 +regCP_MEC_DC_APERTURE8_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE9_BASE = 0x2965 +regCP_MEC_DC_APERTURE9_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE9_MASK = 0x2966 +regCP_MEC_DC_APERTURE9_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE9_CNTL = 0x2967 +regCP_MEC_DC_APERTURE9_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE10_BASE = 0x2968 +regCP_MEC_DC_APERTURE10_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE10_MASK = 0x2969 +regCP_MEC_DC_APERTURE10_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE10_CNTL = 0x296a +regCP_MEC_DC_APERTURE10_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE11_BASE = 0x296b +regCP_MEC_DC_APERTURE11_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE11_MASK = 0x296c +regCP_MEC_DC_APERTURE11_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE11_CNTL = 0x296d +regCP_MEC_DC_APERTURE11_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE12_BASE = 0x296e +regCP_MEC_DC_APERTURE12_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE12_MASK = 0x296f +regCP_MEC_DC_APERTURE12_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE12_CNTL = 0x2970 +regCP_MEC_DC_APERTURE12_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE13_BASE = 0x2971 +regCP_MEC_DC_APERTURE13_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE13_MASK = 0x2972 +regCP_MEC_DC_APERTURE13_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE13_CNTL = 0x2973 +regCP_MEC_DC_APERTURE13_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE14_BASE = 0x2974 +regCP_MEC_DC_APERTURE14_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE14_MASK = 0x2975 +regCP_MEC_DC_APERTURE14_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE14_CNTL = 0x2976 +regCP_MEC_DC_APERTURE14_CNTL_BASE_IDX = 1 +regCP_MEC_DC_APERTURE15_BASE = 0x2977 +regCP_MEC_DC_APERTURE15_BASE_BASE_IDX = 1 +regCP_MEC_DC_APERTURE15_MASK = 0x2978 +regCP_MEC_DC_APERTURE15_MASK_BASE_IDX = 1 +regCP_MEC_DC_APERTURE15_CNTL = 0x2979 +regCP_MEC_DC_APERTURE15_CNTL_BASE_IDX = 1 +regCP_CPC_IC_OP_CNTL = 0x297a +regCP_CPC_IC_OP_CNTL_BASE_IDX = 1 +regCP_GFX_CNTL = 0x2a00 +regCP_GFX_CNTL_BASE_IDX = 1 +regCP_GFX_RS64_INTERRUPT0 = 0x2a01 +regCP_GFX_RS64_INTERRUPT0_BASE_IDX = 1 +regCP_GFX_RS64_INTR_EN0 = 0x2a02 +regCP_GFX_RS64_INTR_EN0_BASE_IDX = 1 +regCP_GFX_RS64_INTR_EN1 = 0x2a03 +regCP_GFX_RS64_INTR_EN1_BASE_IDX = 1 +regCP_GFX_RS64_DC_BASE_CNTL = 0x2a08 +regCP_GFX_RS64_DC_BASE_CNTL_BASE_IDX = 1 +regCP_GFX_RS64_DC_OP_CNTL = 0x2a09 +regCP_GFX_RS64_DC_OP_CNTL_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_BASE0_LO = 0x2a0a +regCP_GFX_RS64_LOCAL_BASE0_LO_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_BASE0_HI = 0x2a0b +regCP_GFX_RS64_LOCAL_BASE0_HI_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_MASK0_LO = 0x2a0c +regCP_GFX_RS64_LOCAL_MASK0_LO_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_MASK0_HI = 0x2a0d +regCP_GFX_RS64_LOCAL_MASK0_HI_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_APERTURE = 0x2a0e +regCP_GFX_RS64_LOCAL_APERTURE_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_INSTR_BASE_LO = 0x2a0f +regCP_GFX_RS64_LOCAL_INSTR_BASE_LO_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_INSTR_BASE_HI = 0x2a10 +regCP_GFX_RS64_LOCAL_INSTR_BASE_HI_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_INSTR_MASK_LO = 0x2a11 +regCP_GFX_RS64_LOCAL_INSTR_MASK_LO_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_INSTR_MASK_HI = 0x2a12 +regCP_GFX_RS64_LOCAL_INSTR_MASK_HI_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_INSTR_APERTURE = 0x2a13 +regCP_GFX_RS64_LOCAL_INSTR_APERTURE_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_SCRATCH_APERTURE = 0x2a14 +regCP_GFX_RS64_LOCAL_SCRATCH_APERTURE_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_SCRATCH_BASE_LO = 0x2a15 +regCP_GFX_RS64_LOCAL_SCRATCH_BASE_LO_BASE_IDX = 1 +regCP_GFX_RS64_LOCAL_SCRATCH_BASE_HI = 0x2a16 +regCP_GFX_RS64_LOCAL_SCRATCH_BASE_HI_BASE_IDX = 1 +regCP_GFX_RS64_PERFCOUNT_CNTL0 = 0x2a1a +regCP_GFX_RS64_PERFCOUNT_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_PERFCOUNT_CNTL1 = 0x2a1b +regCP_GFX_RS64_PERFCOUNT_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_MIP_LO0 = 0x2a1c +regCP_GFX_RS64_MIP_LO0_BASE_IDX = 1 +regCP_GFX_RS64_MIP_LO1 = 0x2a1d +regCP_GFX_RS64_MIP_LO1_BASE_IDX = 1 +regCP_GFX_RS64_MIP_HI0 = 0x2a1e +regCP_GFX_RS64_MIP_HI0_BASE_IDX = 1 +regCP_GFX_RS64_MIP_HI1 = 0x2a1f +regCP_GFX_RS64_MIP_HI1_BASE_IDX = 1 +regCP_GFX_RS64_MTIMECMP_LO0 = 0x2a20 +regCP_GFX_RS64_MTIMECMP_LO0_BASE_IDX = 1 +regCP_GFX_RS64_MTIMECMP_LO1 = 0x2a21 +regCP_GFX_RS64_MTIMECMP_LO1_BASE_IDX = 1 +regCP_GFX_RS64_MTIMECMP_HI0 = 0x2a22 +regCP_GFX_RS64_MTIMECMP_HI0_BASE_IDX = 1 +regCP_GFX_RS64_MTIMECMP_HI1 = 0x2a23 +regCP_GFX_RS64_MTIMECMP_HI1_BASE_IDX = 1 +regCP_GFX_RS64_GP0_LO0 = 0x2a24 +regCP_GFX_RS64_GP0_LO0_BASE_IDX = 1 +regCP_GFX_RS64_GP0_LO1 = 0x2a25 +regCP_GFX_RS64_GP0_LO1_BASE_IDX = 1 +regCP_GFX_RS64_GP0_HI0 = 0x2a26 +regCP_GFX_RS64_GP0_HI0_BASE_IDX = 1 +regCP_GFX_RS64_GP0_HI1 = 0x2a27 +regCP_GFX_RS64_GP0_HI1_BASE_IDX = 1 +regCP_GFX_RS64_GP1_LO0 = 0x2a28 +regCP_GFX_RS64_GP1_LO0_BASE_IDX = 1 +regCP_GFX_RS64_GP1_LO1 = 0x2a29 +regCP_GFX_RS64_GP1_LO1_BASE_IDX = 1 +regCP_GFX_RS64_GP1_HI0 = 0x2a2a +regCP_GFX_RS64_GP1_HI0_BASE_IDX = 1 +regCP_GFX_RS64_GP1_HI1 = 0x2a2b +regCP_GFX_RS64_GP1_HI1_BASE_IDX = 1 +regCP_GFX_RS64_GP2_LO0 = 0x2a2c +regCP_GFX_RS64_GP2_LO0_BASE_IDX = 1 +regCP_GFX_RS64_GP2_LO1 = 0x2a2d +regCP_GFX_RS64_GP2_LO1_BASE_IDX = 1 +regCP_GFX_RS64_GP2_HI0 = 0x2a2e +regCP_GFX_RS64_GP2_HI0_BASE_IDX = 1 +regCP_GFX_RS64_GP2_HI1 = 0x2a2f +regCP_GFX_RS64_GP2_HI1_BASE_IDX = 1 +regCP_GFX_RS64_GP3_LO0 = 0x2a30 +regCP_GFX_RS64_GP3_LO0_BASE_IDX = 1 +regCP_GFX_RS64_GP3_LO1 = 0x2a31 +regCP_GFX_RS64_GP3_LO1_BASE_IDX = 1 +regCP_GFX_RS64_GP3_HI0 = 0x2a32 +regCP_GFX_RS64_GP3_HI0_BASE_IDX = 1 +regCP_GFX_RS64_GP3_HI1 = 0x2a33 +regCP_GFX_RS64_GP3_HI1_BASE_IDX = 1 +regCP_GFX_RS64_GP4_LO0 = 0x2a34 +regCP_GFX_RS64_GP4_LO0_BASE_IDX = 1 +regCP_GFX_RS64_GP4_LO1 = 0x2a35 +regCP_GFX_RS64_GP4_LO1_BASE_IDX = 1 +regCP_GFX_RS64_GP4_HI0 = 0x2a36 +regCP_GFX_RS64_GP4_HI0_BASE_IDX = 1 +regCP_GFX_RS64_GP4_HI1 = 0x2a37 +regCP_GFX_RS64_GP4_HI1_BASE_IDX = 1 +regCP_GFX_RS64_GP5_LO0 = 0x2a38 +regCP_GFX_RS64_GP5_LO0_BASE_IDX = 1 +regCP_GFX_RS64_GP5_LO1 = 0x2a39 +regCP_GFX_RS64_GP5_LO1_BASE_IDX = 1 +regCP_GFX_RS64_GP5_HI0 = 0x2a3a +regCP_GFX_RS64_GP5_HI0_BASE_IDX = 1 +regCP_GFX_RS64_GP5_HI1 = 0x2a3b +regCP_GFX_RS64_GP5_HI1_BASE_IDX = 1 +regCP_GFX_RS64_GP6_LO = 0x2a3c +regCP_GFX_RS64_GP6_LO_BASE_IDX = 1 +regCP_GFX_RS64_GP6_HI = 0x2a3d +regCP_GFX_RS64_GP6_HI_BASE_IDX = 1 +regCP_GFX_RS64_GP7_LO = 0x2a3e +regCP_GFX_RS64_GP7_LO_BASE_IDX = 1 +regCP_GFX_RS64_GP7_HI = 0x2a3f +regCP_GFX_RS64_GP7_HI_BASE_IDX = 1 +regCP_GFX_RS64_GP8_LO = 0x2a40 +regCP_GFX_RS64_GP8_LO_BASE_IDX = 1 +regCP_GFX_RS64_GP8_HI = 0x2a41 +regCP_GFX_RS64_GP8_HI_BASE_IDX = 1 +regCP_GFX_RS64_GP9_LO = 0x2a42 +regCP_GFX_RS64_GP9_LO_BASE_IDX = 1 +regCP_GFX_RS64_GP9_HI = 0x2a43 +regCP_GFX_RS64_GP9_HI_BASE_IDX = 1 +regCP_GFX_RS64_INSTR_PNTR0 = 0x2a44 +regCP_GFX_RS64_INSTR_PNTR0_BASE_IDX = 1 +regCP_GFX_RS64_INSTR_PNTR1 = 0x2a45 +regCP_GFX_RS64_INSTR_PNTR1_BASE_IDX = 1 +regCP_GFX_RS64_PENDING_INTERRUPT0 = 0x2a46 +regCP_GFX_RS64_PENDING_INTERRUPT0_BASE_IDX = 1 +regCP_GFX_RS64_PENDING_INTERRUPT1 = 0x2a47 +regCP_GFX_RS64_PENDING_INTERRUPT1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE0_BASE0 = 0x2a49 +regCP_GFX_RS64_DC_APERTURE0_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE0_MASK0 = 0x2a4a +regCP_GFX_RS64_DC_APERTURE0_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE0_CNTL0 = 0x2a4b +regCP_GFX_RS64_DC_APERTURE0_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE1_BASE0 = 0x2a4c +regCP_GFX_RS64_DC_APERTURE1_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE1_MASK0 = 0x2a4d +regCP_GFX_RS64_DC_APERTURE1_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE1_CNTL0 = 0x2a4e +regCP_GFX_RS64_DC_APERTURE1_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE2_BASE0 = 0x2a4f +regCP_GFX_RS64_DC_APERTURE2_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE2_MASK0 = 0x2a50 +regCP_GFX_RS64_DC_APERTURE2_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE2_CNTL0 = 0x2a51 +regCP_GFX_RS64_DC_APERTURE2_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE3_BASE0 = 0x2a52 +regCP_GFX_RS64_DC_APERTURE3_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE3_MASK0 = 0x2a53 +regCP_GFX_RS64_DC_APERTURE3_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE3_CNTL0 = 0x2a54 +regCP_GFX_RS64_DC_APERTURE3_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE4_BASE0 = 0x2a55 +regCP_GFX_RS64_DC_APERTURE4_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE4_MASK0 = 0x2a56 +regCP_GFX_RS64_DC_APERTURE4_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE4_CNTL0 = 0x2a57 +regCP_GFX_RS64_DC_APERTURE4_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE5_BASE0 = 0x2a58 +regCP_GFX_RS64_DC_APERTURE5_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE5_MASK0 = 0x2a59 +regCP_GFX_RS64_DC_APERTURE5_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE5_CNTL0 = 0x2a5a +regCP_GFX_RS64_DC_APERTURE5_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE6_BASE0 = 0x2a5b +regCP_GFX_RS64_DC_APERTURE6_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE6_MASK0 = 0x2a5c +regCP_GFX_RS64_DC_APERTURE6_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE6_CNTL0 = 0x2a5d +regCP_GFX_RS64_DC_APERTURE6_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE7_BASE0 = 0x2a5e +regCP_GFX_RS64_DC_APERTURE7_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE7_MASK0 = 0x2a5f +regCP_GFX_RS64_DC_APERTURE7_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE7_CNTL0 = 0x2a60 +regCP_GFX_RS64_DC_APERTURE7_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE8_BASE0 = 0x2a61 +regCP_GFX_RS64_DC_APERTURE8_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE8_MASK0 = 0x2a62 +regCP_GFX_RS64_DC_APERTURE8_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE8_CNTL0 = 0x2a63 +regCP_GFX_RS64_DC_APERTURE8_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE9_BASE0 = 0x2a64 +regCP_GFX_RS64_DC_APERTURE9_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE9_MASK0 = 0x2a65 +regCP_GFX_RS64_DC_APERTURE9_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE9_CNTL0 = 0x2a66 +regCP_GFX_RS64_DC_APERTURE9_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE10_BASE0 = 0x2a67 +regCP_GFX_RS64_DC_APERTURE10_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE10_MASK0 = 0x2a68 +regCP_GFX_RS64_DC_APERTURE10_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE10_CNTL0 = 0x2a69 +regCP_GFX_RS64_DC_APERTURE10_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE11_BASE0 = 0x2a6a +regCP_GFX_RS64_DC_APERTURE11_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE11_MASK0 = 0x2a6b +regCP_GFX_RS64_DC_APERTURE11_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE11_CNTL0 = 0x2a6c +regCP_GFX_RS64_DC_APERTURE11_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE12_BASE0 = 0x2a6d +regCP_GFX_RS64_DC_APERTURE12_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE12_MASK0 = 0x2a6e +regCP_GFX_RS64_DC_APERTURE12_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE12_CNTL0 = 0x2a6f +regCP_GFX_RS64_DC_APERTURE12_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE13_BASE0 = 0x2a70 +regCP_GFX_RS64_DC_APERTURE13_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE13_MASK0 = 0x2a71 +regCP_GFX_RS64_DC_APERTURE13_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE13_CNTL0 = 0x2a72 +regCP_GFX_RS64_DC_APERTURE13_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE14_BASE0 = 0x2a73 +regCP_GFX_RS64_DC_APERTURE14_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE14_MASK0 = 0x2a74 +regCP_GFX_RS64_DC_APERTURE14_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE14_CNTL0 = 0x2a75 +regCP_GFX_RS64_DC_APERTURE14_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE15_BASE0 = 0x2a76 +regCP_GFX_RS64_DC_APERTURE15_BASE0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE15_MASK0 = 0x2a77 +regCP_GFX_RS64_DC_APERTURE15_MASK0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE15_CNTL0 = 0x2a78 +regCP_GFX_RS64_DC_APERTURE15_CNTL0_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE0_BASE1 = 0x2a79 +regCP_GFX_RS64_DC_APERTURE0_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE0_MASK1 = 0x2a7a +regCP_GFX_RS64_DC_APERTURE0_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE0_CNTL1 = 0x2a7b +regCP_GFX_RS64_DC_APERTURE0_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE1_BASE1 = 0x2a7c +regCP_GFX_RS64_DC_APERTURE1_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE1_MASK1 = 0x2a7d +regCP_GFX_RS64_DC_APERTURE1_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE1_CNTL1 = 0x2a7e +regCP_GFX_RS64_DC_APERTURE1_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE2_BASE1 = 0x2a7f +regCP_GFX_RS64_DC_APERTURE2_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE2_MASK1 = 0x2a80 +regCP_GFX_RS64_DC_APERTURE2_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE2_CNTL1 = 0x2a81 +regCP_GFX_RS64_DC_APERTURE2_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE3_BASE1 = 0x2a82 +regCP_GFX_RS64_DC_APERTURE3_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE3_MASK1 = 0x2a83 +regCP_GFX_RS64_DC_APERTURE3_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE3_CNTL1 = 0x2a84 +regCP_GFX_RS64_DC_APERTURE3_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE4_BASE1 = 0x2a85 +regCP_GFX_RS64_DC_APERTURE4_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE4_MASK1 = 0x2a86 +regCP_GFX_RS64_DC_APERTURE4_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE4_CNTL1 = 0x2a87 +regCP_GFX_RS64_DC_APERTURE4_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE5_BASE1 = 0x2a88 +regCP_GFX_RS64_DC_APERTURE5_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE5_MASK1 = 0x2a89 +regCP_GFX_RS64_DC_APERTURE5_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE5_CNTL1 = 0x2a8a +regCP_GFX_RS64_DC_APERTURE5_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE6_BASE1 = 0x2a8b +regCP_GFX_RS64_DC_APERTURE6_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE6_MASK1 = 0x2a8c +regCP_GFX_RS64_DC_APERTURE6_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE6_CNTL1 = 0x2a8d +regCP_GFX_RS64_DC_APERTURE6_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE7_BASE1 = 0x2a8e +regCP_GFX_RS64_DC_APERTURE7_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE7_MASK1 = 0x2a8f +regCP_GFX_RS64_DC_APERTURE7_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE7_CNTL1 = 0x2a90 +regCP_GFX_RS64_DC_APERTURE7_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE8_BASE1 = 0x2a91 +regCP_GFX_RS64_DC_APERTURE8_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE8_MASK1 = 0x2a92 +regCP_GFX_RS64_DC_APERTURE8_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE8_CNTL1 = 0x2a93 +regCP_GFX_RS64_DC_APERTURE8_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE9_BASE1 = 0x2a94 +regCP_GFX_RS64_DC_APERTURE9_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE9_MASK1 = 0x2a95 +regCP_GFX_RS64_DC_APERTURE9_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE9_CNTL1 = 0x2a96 +regCP_GFX_RS64_DC_APERTURE9_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE10_BASE1 = 0x2a97 +regCP_GFX_RS64_DC_APERTURE10_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE10_MASK1 = 0x2a98 +regCP_GFX_RS64_DC_APERTURE10_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE10_CNTL1 = 0x2a99 +regCP_GFX_RS64_DC_APERTURE10_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE11_BASE1 = 0x2a9a +regCP_GFX_RS64_DC_APERTURE11_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE11_MASK1 = 0x2a9b +regCP_GFX_RS64_DC_APERTURE11_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE11_CNTL1 = 0x2a9c +regCP_GFX_RS64_DC_APERTURE11_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE12_BASE1 = 0x2a9d +regCP_GFX_RS64_DC_APERTURE12_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE12_MASK1 = 0x2a9e +regCP_GFX_RS64_DC_APERTURE12_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE12_CNTL1 = 0x2a9f +regCP_GFX_RS64_DC_APERTURE12_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE13_BASE1 = 0x2aa0 +regCP_GFX_RS64_DC_APERTURE13_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE13_MASK1 = 0x2aa1 +regCP_GFX_RS64_DC_APERTURE13_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE13_CNTL1 = 0x2aa2 +regCP_GFX_RS64_DC_APERTURE13_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE14_BASE1 = 0x2aa3 +regCP_GFX_RS64_DC_APERTURE14_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE14_MASK1 = 0x2aa4 +regCP_GFX_RS64_DC_APERTURE14_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE14_CNTL1 = 0x2aa5 +regCP_GFX_RS64_DC_APERTURE14_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE15_BASE1 = 0x2aa6 +regCP_GFX_RS64_DC_APERTURE15_BASE1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE15_MASK1 = 0x2aa7 +regCP_GFX_RS64_DC_APERTURE15_MASK1_BASE_IDX = 1 +regCP_GFX_RS64_DC_APERTURE15_CNTL1 = 0x2aa8 +regCP_GFX_RS64_DC_APERTURE15_CNTL1_BASE_IDX = 1 +regCP_GFX_RS64_INTERRUPT1 = 0x2aac +regCP_GFX_RS64_INTERRUPT1_BASE_IDX = 1 +regGL1_DRAM_BURST_MASK = 0x2d02 +regGL1_DRAM_BURST_MASK_BASE_IDX = 1 +regGL1_ARB_STATUS = 0x2d03 +regGL1_ARB_STATUS_BASE_IDX = 1 +regGL1I_GL1R_REP_FGCG_OVERRIDE = 0x2d05 +regGL1I_GL1R_REP_FGCG_OVERRIDE_BASE_IDX = 1 +regGL1C_STATUS = 0x2d41 +regGL1C_STATUS_BASE_IDX = 1 +regGL1C_UTCL0_CNTL1 = 0x2d42 +regGL1C_UTCL0_CNTL1_BASE_IDX = 1 +regGL1C_UTCL0_CNTL2 = 0x2d43 +regGL1C_UTCL0_CNTL2_BASE_IDX = 1 +regGL1C_UTCL0_STATUS = 0x2d44 +regGL1C_UTCL0_STATUS_BASE_IDX = 1 +regGL1C_UTCL0_RETRY = 0x2d45 +regGL1C_UTCL0_RETRY_BASE_IDX = 1 +regCH_ARB_CTRL = 0x2d80 +regCH_ARB_CTRL_BASE_IDX = 1 +regCH_DRAM_BURST_MASK = 0x2d82 +regCH_DRAM_BURST_MASK_BASE_IDX = 1 +regCH_ARB_STATUS = 0x2d83 +regCH_ARB_STATUS_BASE_IDX = 1 +regCH_DRAM_BURST_CTRL = 0x2d84 +regCH_DRAM_BURST_CTRL_BASE_IDX = 1 +regCHA_CHC_CREDITS = 0x2d88 +regCHA_CHC_CREDITS_BASE_IDX = 1 +regCHA_CLIENT_FREE_DELAY = 0x2d89 +regCHA_CLIENT_FREE_DELAY_BASE_IDX = 1 +regCHI_CHR_REP_FGCG_OVERRIDE = 0x2d8c +regCHI_CHR_REP_FGCG_OVERRIDE_BASE_IDX = 1 +regCH_VC5_ENABLE = 0x2d94 +regCH_VC5_ENABLE_BASE_IDX = 1 +regCHC_CTRL = 0x2dc0 +regCHC_CTRL_BASE_IDX = 1 +regCHC_STATUS = 0x2dc1 +regCHC_STATUS_BASE_IDX = 1 +regCHCG_CTRL = 0x2dc2 +regCHCG_CTRL_BASE_IDX = 1 +regCHCG_STATUS = 0x2dc3 +regCHCG_STATUS_BASE_IDX = 1 +regGL2C_CTRL = 0x2e00 +regGL2C_CTRL_BASE_IDX = 1 +regGL2C_CTRL2 = 0x2e01 +regGL2C_CTRL2_BASE_IDX = 1 +regGL2C_ADDR_MATCH_MASK = 0x2e03 +regGL2C_ADDR_MATCH_MASK_BASE_IDX = 1 +regGL2C_ADDR_MATCH_SIZE = 0x2e04 +regGL2C_ADDR_MATCH_SIZE_BASE_IDX = 1 +regGL2C_WBINVL2 = 0x2e05 +regGL2C_WBINVL2_BASE_IDX = 1 +regGL2C_SOFT_RESET = 0x2e06 +regGL2C_SOFT_RESET_BASE_IDX = 1 +regGL2C_CM_CTRL0 = 0x2e07 +regGL2C_CM_CTRL0_BASE_IDX = 1 +regGL2C_CM_CTRL1 = 0x2e08 +regGL2C_CM_CTRL1_BASE_IDX = 1 +regGL2C_CM_STALL = 0x2e09 +regGL2C_CM_STALL_BASE_IDX = 1 +regGL2C_CTRL3 = 0x2e0c +regGL2C_CTRL3_BASE_IDX = 1 +regGL2C_LB_CTR_CTRL = 0x2e0d +regGL2C_LB_CTR_CTRL_BASE_IDX = 1 +regGL2C_LB_DATA0 = 0x2e0e +regGL2C_LB_DATA0_BASE_IDX = 1 +regGL2C_LB_DATA1 = 0x2e0f +regGL2C_LB_DATA1_BASE_IDX = 1 +regGL2C_LB_DATA2 = 0x2e10 +regGL2C_LB_DATA2_BASE_IDX = 1 +regGL2C_LB_DATA3 = 0x2e11 +regGL2C_LB_DATA3_BASE_IDX = 1 +regGL2C_LB_CTR_SEL0 = 0x2e12 +regGL2C_LB_CTR_SEL0_BASE_IDX = 1 +regGL2C_LB_CTR_SEL1 = 0x2e13 +regGL2C_LB_CTR_SEL1_BASE_IDX = 1 +regGL2C_CTRL4 = 0x2e17 +regGL2C_CTRL4_BASE_IDX = 1 +regGL2C_DISCARD_STALL_CTRL = 0x2e18 +regGL2C_DISCARD_STALL_CTRL_BASE_IDX = 1 +regGL2A_ADDR_MATCH_CTRL = 0x2e20 +regGL2A_ADDR_MATCH_CTRL_BASE_IDX = 1 +regGL2A_ADDR_MATCH_MASK = 0x2e21 +regGL2A_ADDR_MATCH_MASK_BASE_IDX = 1 +regGL2A_ADDR_MATCH_SIZE = 0x2e22 +regGL2A_ADDR_MATCH_SIZE_BASE_IDX = 1 +regGL2A_PRIORITY_CTRL = 0x2e23 +regGL2A_PRIORITY_CTRL_BASE_IDX = 1 +regGL2A_RESP_THROTTLE_CTRL = 0x2e2a +regGL2A_RESP_THROTTLE_CTRL_BASE_IDX = 1 +regGL1H_ARB_CTRL = 0x2e40 +regGL1H_ARB_CTRL_BASE_IDX = 1 +regGL1H_GL1_CREDITS = 0x2e41 +regGL1H_GL1_CREDITS_BASE_IDX = 1 +regGL1H_BURST_MASK = 0x2e42 +regGL1H_BURST_MASK_BASE_IDX = 1 +regGL1H_BURST_CTRL = 0x2e43 +regGL1H_BURST_CTRL_BASE_IDX = 1 +regGL1H_ARB_STATUS = 0x2e44 +regGL1H_ARB_STATUS_BASE_IDX = 1 +regCPG_PERFCOUNTER1_LO = 0x3000 +regCPG_PERFCOUNTER1_LO_BASE_IDX = 1 +regCPG_PERFCOUNTER1_HI = 0x3001 +regCPG_PERFCOUNTER1_HI_BASE_IDX = 1 +regCPG_PERFCOUNTER0_LO = 0x3002 +regCPG_PERFCOUNTER0_LO_BASE_IDX = 1 +regCPG_PERFCOUNTER0_HI = 0x3003 +regCPG_PERFCOUNTER0_HI_BASE_IDX = 1 +regCPC_PERFCOUNTER1_LO = 0x3004 +regCPC_PERFCOUNTER1_LO_BASE_IDX = 1 +regCPC_PERFCOUNTER1_HI = 0x3005 +regCPC_PERFCOUNTER1_HI_BASE_IDX = 1 +regCPC_PERFCOUNTER0_LO = 0x3006 +regCPC_PERFCOUNTER0_LO_BASE_IDX = 1 +regCPC_PERFCOUNTER0_HI = 0x3007 +regCPC_PERFCOUNTER0_HI_BASE_IDX = 1 +regCPF_PERFCOUNTER1_LO = 0x3008 +regCPF_PERFCOUNTER1_LO_BASE_IDX = 1 +regCPF_PERFCOUNTER1_HI = 0x3009 +regCPF_PERFCOUNTER1_HI_BASE_IDX = 1 +regCPF_PERFCOUNTER0_LO = 0x300a +regCPF_PERFCOUNTER0_LO_BASE_IDX = 1 +regCPF_PERFCOUNTER0_HI = 0x300b +regCPF_PERFCOUNTER0_HI_BASE_IDX = 1 +regCPF_LATENCY_STATS_DATA = 0x300c +regCPF_LATENCY_STATS_DATA_BASE_IDX = 1 +regCPG_LATENCY_STATS_DATA = 0x300d +regCPG_LATENCY_STATS_DATA_BASE_IDX = 1 +regCPC_LATENCY_STATS_DATA = 0x300e +regCPC_LATENCY_STATS_DATA_BASE_IDX = 1 +regGRBM_PERFCOUNTER0_LO = 0x3040 +regGRBM_PERFCOUNTER0_LO_BASE_IDX = 1 +regGRBM_PERFCOUNTER0_HI = 0x3041 +regGRBM_PERFCOUNTER0_HI_BASE_IDX = 1 +regGRBM_PERFCOUNTER1_LO = 0x3043 +regGRBM_PERFCOUNTER1_LO_BASE_IDX = 1 +regGRBM_PERFCOUNTER1_HI = 0x3044 +regGRBM_PERFCOUNTER1_HI_BASE_IDX = 1 +regGRBM_SE0_PERFCOUNTER_LO = 0x3045 +regGRBM_SE0_PERFCOUNTER_LO_BASE_IDX = 1 +regGRBM_SE0_PERFCOUNTER_HI = 0x3046 +regGRBM_SE0_PERFCOUNTER_HI_BASE_IDX = 1 +regGRBM_SE1_PERFCOUNTER_LO = 0x3047 +regGRBM_SE1_PERFCOUNTER_LO_BASE_IDX = 1 +regGRBM_SE1_PERFCOUNTER_HI = 0x3048 +regGRBM_SE1_PERFCOUNTER_HI_BASE_IDX = 1 +regGRBM_SE2_PERFCOUNTER_LO = 0x3049 +regGRBM_SE2_PERFCOUNTER_LO_BASE_IDX = 1 +regGRBM_SE2_PERFCOUNTER_HI = 0x304a +regGRBM_SE2_PERFCOUNTER_HI_BASE_IDX = 1 +regGRBM_SE3_PERFCOUNTER_LO = 0x304b +regGRBM_SE3_PERFCOUNTER_LO_BASE_IDX = 1 +regGRBM_SE3_PERFCOUNTER_HI = 0x304c +regGRBM_SE3_PERFCOUNTER_HI_BASE_IDX = 1 +regGRBM_SE4_PERFCOUNTER_LO = 0x304d +regGRBM_SE4_PERFCOUNTER_LO_BASE_IDX = 1 +regGRBM_SE4_PERFCOUNTER_HI = 0x304e +regGRBM_SE4_PERFCOUNTER_HI_BASE_IDX = 1 +regGRBM_SE5_PERFCOUNTER_LO = 0x304f +regGRBM_SE5_PERFCOUNTER_LO_BASE_IDX = 1 +regGRBM_SE5_PERFCOUNTER_HI = 0x3050 +regGRBM_SE5_PERFCOUNTER_HI_BASE_IDX = 1 +regGRBM_SE6_PERFCOUNTER_LO = 0x3051 +regGRBM_SE6_PERFCOUNTER_LO_BASE_IDX = 1 +regGRBM_SE6_PERFCOUNTER_HI = 0x3052 +regGRBM_SE6_PERFCOUNTER_HI_BASE_IDX = 1 +regGE1_PERFCOUNTER0_LO = 0x30a4 +regGE1_PERFCOUNTER0_LO_BASE_IDX = 1 +regGE1_PERFCOUNTER0_HI = 0x30a5 +regGE1_PERFCOUNTER0_HI_BASE_IDX = 1 +regGE1_PERFCOUNTER1_LO = 0x30a6 +regGE1_PERFCOUNTER1_LO_BASE_IDX = 1 +regGE1_PERFCOUNTER1_HI = 0x30a7 +regGE1_PERFCOUNTER1_HI_BASE_IDX = 1 +regGE1_PERFCOUNTER2_LO = 0x30a8 +regGE1_PERFCOUNTER2_LO_BASE_IDX = 1 +regGE1_PERFCOUNTER2_HI = 0x30a9 +regGE1_PERFCOUNTER2_HI_BASE_IDX = 1 +regGE1_PERFCOUNTER3_LO = 0x30aa +regGE1_PERFCOUNTER3_LO_BASE_IDX = 1 +regGE1_PERFCOUNTER3_HI = 0x30ab +regGE1_PERFCOUNTER3_HI_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER0_LO = 0x30ac +regGE2_DIST_PERFCOUNTER0_LO_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER0_HI = 0x30ad +regGE2_DIST_PERFCOUNTER0_HI_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER1_LO = 0x30ae +regGE2_DIST_PERFCOUNTER1_LO_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER1_HI = 0x30af +regGE2_DIST_PERFCOUNTER1_HI_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER2_LO = 0x30b0 +regGE2_DIST_PERFCOUNTER2_LO_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER2_HI = 0x30b1 +regGE2_DIST_PERFCOUNTER2_HI_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER3_LO = 0x30b2 +regGE2_DIST_PERFCOUNTER3_LO_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER3_HI = 0x30b3 +regGE2_DIST_PERFCOUNTER3_HI_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER0_LO = 0x30b4 +regGE2_SE_PERFCOUNTER0_LO_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER0_HI = 0x30b5 +regGE2_SE_PERFCOUNTER0_HI_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER1_LO = 0x30b6 +regGE2_SE_PERFCOUNTER1_LO_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER1_HI = 0x30b7 +regGE2_SE_PERFCOUNTER1_HI_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER2_LO = 0x30b8 +regGE2_SE_PERFCOUNTER2_LO_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER2_HI = 0x30b9 +regGE2_SE_PERFCOUNTER2_HI_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER3_LO = 0x30ba +regGE2_SE_PERFCOUNTER3_LO_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER3_HI = 0x30bb +regGE2_SE_PERFCOUNTER3_HI_BASE_IDX = 1 +regPA_SU_PERFCOUNTER0_LO = 0x3100 +regPA_SU_PERFCOUNTER0_LO_BASE_IDX = 1 +regPA_SU_PERFCOUNTER0_HI = 0x3101 +regPA_SU_PERFCOUNTER0_HI_BASE_IDX = 1 +regPA_SU_PERFCOUNTER1_LO = 0x3102 +regPA_SU_PERFCOUNTER1_LO_BASE_IDX = 1 +regPA_SU_PERFCOUNTER1_HI = 0x3103 +regPA_SU_PERFCOUNTER1_HI_BASE_IDX = 1 +regPA_SU_PERFCOUNTER2_LO = 0x3104 +regPA_SU_PERFCOUNTER2_LO_BASE_IDX = 1 +regPA_SU_PERFCOUNTER2_HI = 0x3105 +regPA_SU_PERFCOUNTER2_HI_BASE_IDX = 1 +regPA_SU_PERFCOUNTER3_LO = 0x3106 +regPA_SU_PERFCOUNTER3_LO_BASE_IDX = 1 +regPA_SU_PERFCOUNTER3_HI = 0x3107 +regPA_SU_PERFCOUNTER3_HI_BASE_IDX = 1 +regPA_SC_PERFCOUNTER0_LO = 0x3140 +regPA_SC_PERFCOUNTER0_LO_BASE_IDX = 1 +regPA_SC_PERFCOUNTER0_HI = 0x3141 +regPA_SC_PERFCOUNTER0_HI_BASE_IDX = 1 +regPA_SC_PERFCOUNTER1_LO = 0x3142 +regPA_SC_PERFCOUNTER1_LO_BASE_IDX = 1 +regPA_SC_PERFCOUNTER1_HI = 0x3143 +regPA_SC_PERFCOUNTER1_HI_BASE_IDX = 1 +regPA_SC_PERFCOUNTER2_LO = 0x3144 +regPA_SC_PERFCOUNTER2_LO_BASE_IDX = 1 +regPA_SC_PERFCOUNTER2_HI = 0x3145 +regPA_SC_PERFCOUNTER2_HI_BASE_IDX = 1 +regPA_SC_PERFCOUNTER3_LO = 0x3146 +regPA_SC_PERFCOUNTER3_LO_BASE_IDX = 1 +regPA_SC_PERFCOUNTER3_HI = 0x3147 +regPA_SC_PERFCOUNTER3_HI_BASE_IDX = 1 +regPA_SC_PERFCOUNTER4_LO = 0x3148 +regPA_SC_PERFCOUNTER4_LO_BASE_IDX = 1 +regPA_SC_PERFCOUNTER4_HI = 0x3149 +regPA_SC_PERFCOUNTER4_HI_BASE_IDX = 1 +regPA_SC_PERFCOUNTER5_LO = 0x314a +regPA_SC_PERFCOUNTER5_LO_BASE_IDX = 1 +regPA_SC_PERFCOUNTER5_HI = 0x314b +regPA_SC_PERFCOUNTER5_HI_BASE_IDX = 1 +regPA_SC_PERFCOUNTER6_LO = 0x314c +regPA_SC_PERFCOUNTER6_LO_BASE_IDX = 1 +regPA_SC_PERFCOUNTER6_HI = 0x314d +regPA_SC_PERFCOUNTER6_HI_BASE_IDX = 1 +regPA_SC_PERFCOUNTER7_LO = 0x314e +regPA_SC_PERFCOUNTER7_LO_BASE_IDX = 1 +regPA_SC_PERFCOUNTER7_HI = 0x314f +regPA_SC_PERFCOUNTER7_HI_BASE_IDX = 1 +regSPI_PERFCOUNTER0_HI = 0x3180 +regSPI_PERFCOUNTER0_HI_BASE_IDX = 1 +regSPI_PERFCOUNTER0_LO = 0x3181 +regSPI_PERFCOUNTER0_LO_BASE_IDX = 1 +regSPI_PERFCOUNTER1_HI = 0x3182 +regSPI_PERFCOUNTER1_HI_BASE_IDX = 1 +regSPI_PERFCOUNTER1_LO = 0x3183 +regSPI_PERFCOUNTER1_LO_BASE_IDX = 1 +regSPI_PERFCOUNTER2_HI = 0x3184 +regSPI_PERFCOUNTER2_HI_BASE_IDX = 1 +regSPI_PERFCOUNTER2_LO = 0x3185 +regSPI_PERFCOUNTER2_LO_BASE_IDX = 1 +regSPI_PERFCOUNTER3_HI = 0x3186 +regSPI_PERFCOUNTER3_HI_BASE_IDX = 1 +regSPI_PERFCOUNTER3_LO = 0x3187 +regSPI_PERFCOUNTER3_LO_BASE_IDX = 1 +regSPI_PERFCOUNTER4_HI = 0x3188 +regSPI_PERFCOUNTER4_HI_BASE_IDX = 1 +regSPI_PERFCOUNTER4_LO = 0x3189 +regSPI_PERFCOUNTER4_LO_BASE_IDX = 1 +regSPI_PERFCOUNTER5_HI = 0x318a +regSPI_PERFCOUNTER5_HI_BASE_IDX = 1 +regSPI_PERFCOUNTER5_LO = 0x318b +regSPI_PERFCOUNTER5_LO_BASE_IDX = 1 +regPC_PERFCOUNTER0_HI = 0x318c +regPC_PERFCOUNTER0_HI_BASE_IDX = 1 +regPC_PERFCOUNTER0_LO = 0x318d +regPC_PERFCOUNTER0_LO_BASE_IDX = 1 +regPC_PERFCOUNTER1_HI = 0x318e +regPC_PERFCOUNTER1_HI_BASE_IDX = 1 +regPC_PERFCOUNTER1_LO = 0x318f +regPC_PERFCOUNTER1_LO_BASE_IDX = 1 +regPC_PERFCOUNTER2_HI = 0x3190 +regPC_PERFCOUNTER2_HI_BASE_IDX = 1 +regPC_PERFCOUNTER2_LO = 0x3191 +regPC_PERFCOUNTER2_LO_BASE_IDX = 1 +regPC_PERFCOUNTER3_HI = 0x3192 +regPC_PERFCOUNTER3_HI_BASE_IDX = 1 +regPC_PERFCOUNTER3_LO = 0x3193 +regPC_PERFCOUNTER3_LO_BASE_IDX = 1 +regSQ_PERFCOUNTER0_LO = 0x31c0 +regSQ_PERFCOUNTER0_LO_BASE_IDX = 1 +regSQ_PERFCOUNTER1_LO = 0x31c2 +regSQ_PERFCOUNTER1_LO_BASE_IDX = 1 +regSQ_PERFCOUNTER2_LO = 0x31c4 +regSQ_PERFCOUNTER2_LO_BASE_IDX = 1 +regSQ_PERFCOUNTER3_LO = 0x31c6 +regSQ_PERFCOUNTER3_LO_BASE_IDX = 1 +regSQ_PERFCOUNTER4_LO = 0x31c8 +regSQ_PERFCOUNTER4_LO_BASE_IDX = 1 +regSQ_PERFCOUNTER5_LO = 0x31ca +regSQ_PERFCOUNTER5_LO_BASE_IDX = 1 +regSQ_PERFCOUNTER6_LO = 0x31cc +regSQ_PERFCOUNTER6_LO_BASE_IDX = 1 +regSQ_PERFCOUNTER7_LO = 0x31ce +regSQ_PERFCOUNTER7_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER0_LO = 0x31e4 +regSQG_PERFCOUNTER0_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER0_HI = 0x31e5 +regSQG_PERFCOUNTER0_HI_BASE_IDX = 1 +regSQG_PERFCOUNTER1_LO = 0x31e6 +regSQG_PERFCOUNTER1_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER1_HI = 0x31e7 +regSQG_PERFCOUNTER1_HI_BASE_IDX = 1 +regSQG_PERFCOUNTER2_LO = 0x31e8 +regSQG_PERFCOUNTER2_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER2_HI = 0x31e9 +regSQG_PERFCOUNTER2_HI_BASE_IDX = 1 +regSQG_PERFCOUNTER3_LO = 0x31ea +regSQG_PERFCOUNTER3_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER3_HI = 0x31eb +regSQG_PERFCOUNTER3_HI_BASE_IDX = 1 +regSQG_PERFCOUNTER4_LO = 0x31ec +regSQG_PERFCOUNTER4_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER4_HI = 0x31ed +regSQG_PERFCOUNTER4_HI_BASE_IDX = 1 +regSQG_PERFCOUNTER5_LO = 0x31ee +regSQG_PERFCOUNTER5_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER5_HI = 0x31ef +regSQG_PERFCOUNTER5_HI_BASE_IDX = 1 +regSQG_PERFCOUNTER6_LO = 0x31f0 +regSQG_PERFCOUNTER6_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER6_HI = 0x31f1 +regSQG_PERFCOUNTER6_HI_BASE_IDX = 1 +regSQG_PERFCOUNTER7_LO = 0x31f2 +regSQG_PERFCOUNTER7_LO_BASE_IDX = 1 +regSQG_PERFCOUNTER7_HI = 0x31f3 +regSQG_PERFCOUNTER7_HI_BASE_IDX = 1 +regSX_PERFCOUNTER0_LO = 0x3240 +regSX_PERFCOUNTER0_LO_BASE_IDX = 1 +regSX_PERFCOUNTER0_HI = 0x3241 +regSX_PERFCOUNTER0_HI_BASE_IDX = 1 +regSX_PERFCOUNTER1_LO = 0x3242 +regSX_PERFCOUNTER1_LO_BASE_IDX = 1 +regSX_PERFCOUNTER1_HI = 0x3243 +regSX_PERFCOUNTER1_HI_BASE_IDX = 1 +regSX_PERFCOUNTER2_LO = 0x3244 +regSX_PERFCOUNTER2_LO_BASE_IDX = 1 +regSX_PERFCOUNTER2_HI = 0x3245 +regSX_PERFCOUNTER2_HI_BASE_IDX = 1 +regSX_PERFCOUNTER3_LO = 0x3246 +regSX_PERFCOUNTER3_LO_BASE_IDX = 1 +regSX_PERFCOUNTER3_HI = 0x3247 +regSX_PERFCOUNTER3_HI_BASE_IDX = 1 +regGCEA_PERFCOUNTER2_LO = 0x3260 +regGCEA_PERFCOUNTER2_LO_BASE_IDX = 1 +regGCEA_PERFCOUNTER2_HI = 0x3261 +regGCEA_PERFCOUNTER2_HI_BASE_IDX = 1 +regGCEA_PERFCOUNTER_LO = 0x3262 +regGCEA_PERFCOUNTER_LO_BASE_IDX = 1 +regGCEA_PERFCOUNTER_HI = 0x3263 +regGCEA_PERFCOUNTER_HI_BASE_IDX = 1 +regGDS_PERFCOUNTER0_LO = 0x3280 +regGDS_PERFCOUNTER0_LO_BASE_IDX = 1 +regGDS_PERFCOUNTER0_HI = 0x3281 +regGDS_PERFCOUNTER0_HI_BASE_IDX = 1 +regGDS_PERFCOUNTER1_LO = 0x3282 +regGDS_PERFCOUNTER1_LO_BASE_IDX = 1 +regGDS_PERFCOUNTER1_HI = 0x3283 +regGDS_PERFCOUNTER1_HI_BASE_IDX = 1 +regGDS_PERFCOUNTER2_LO = 0x3284 +regGDS_PERFCOUNTER2_LO_BASE_IDX = 1 +regGDS_PERFCOUNTER2_HI = 0x3285 +regGDS_PERFCOUNTER2_HI_BASE_IDX = 1 +regGDS_PERFCOUNTER3_LO = 0x3286 +regGDS_PERFCOUNTER3_LO_BASE_IDX = 1 +regGDS_PERFCOUNTER3_HI = 0x3287 +regGDS_PERFCOUNTER3_HI_BASE_IDX = 1 +regTA_PERFCOUNTER0_LO = 0x32c0 +regTA_PERFCOUNTER0_LO_BASE_IDX = 1 +regTA_PERFCOUNTER0_HI = 0x32c1 +regTA_PERFCOUNTER0_HI_BASE_IDX = 1 +regTA_PERFCOUNTER1_LO = 0x32c2 +regTA_PERFCOUNTER1_LO_BASE_IDX = 1 +regTA_PERFCOUNTER1_HI = 0x32c3 +regTA_PERFCOUNTER1_HI_BASE_IDX = 1 +regTD_PERFCOUNTER0_LO = 0x3300 +regTD_PERFCOUNTER0_LO_BASE_IDX = 1 +regTD_PERFCOUNTER0_HI = 0x3301 +regTD_PERFCOUNTER0_HI_BASE_IDX = 1 +regTD_PERFCOUNTER1_LO = 0x3302 +regTD_PERFCOUNTER1_LO_BASE_IDX = 1 +regTD_PERFCOUNTER1_HI = 0x3303 +regTD_PERFCOUNTER1_HI_BASE_IDX = 1 +regTCP_PERFCOUNTER0_LO = 0x3340 +regTCP_PERFCOUNTER0_LO_BASE_IDX = 1 +regTCP_PERFCOUNTER0_HI = 0x3341 +regTCP_PERFCOUNTER0_HI_BASE_IDX = 1 +regTCP_PERFCOUNTER1_LO = 0x3342 +regTCP_PERFCOUNTER1_LO_BASE_IDX = 1 +regTCP_PERFCOUNTER1_HI = 0x3343 +regTCP_PERFCOUNTER1_HI_BASE_IDX = 1 +regTCP_PERFCOUNTER2_LO = 0x3344 +regTCP_PERFCOUNTER2_LO_BASE_IDX = 1 +regTCP_PERFCOUNTER2_HI = 0x3345 +regTCP_PERFCOUNTER2_HI_BASE_IDX = 1 +regTCP_PERFCOUNTER3_LO = 0x3346 +regTCP_PERFCOUNTER3_LO_BASE_IDX = 1 +regTCP_PERFCOUNTER3_HI = 0x3347 +regTCP_PERFCOUNTER3_HI_BASE_IDX = 1 +regTCP_PERFCOUNTER_FILTER = 0x3348 +regTCP_PERFCOUNTER_FILTER_BASE_IDX = 1 +regTCP_PERFCOUNTER_FILTER2 = 0x3349 +regTCP_PERFCOUNTER_FILTER2_BASE_IDX = 1 +regTCP_PERFCOUNTER_FILTER_EN = 0x334a +regTCP_PERFCOUNTER_FILTER_EN_BASE_IDX = 1 +regGL2C_PERFCOUNTER0_LO = 0x3380 +regGL2C_PERFCOUNTER0_LO_BASE_IDX = 1 +regGL2C_PERFCOUNTER0_HI = 0x3381 +regGL2C_PERFCOUNTER0_HI_BASE_IDX = 1 +regGL2C_PERFCOUNTER1_LO = 0x3382 +regGL2C_PERFCOUNTER1_LO_BASE_IDX = 1 +regGL2C_PERFCOUNTER1_HI = 0x3383 +regGL2C_PERFCOUNTER1_HI_BASE_IDX = 1 +regGL2C_PERFCOUNTER2_LO = 0x3384 +regGL2C_PERFCOUNTER2_LO_BASE_IDX = 1 +regGL2C_PERFCOUNTER2_HI = 0x3385 +regGL2C_PERFCOUNTER2_HI_BASE_IDX = 1 +regGL2C_PERFCOUNTER3_LO = 0x3386 +regGL2C_PERFCOUNTER3_LO_BASE_IDX = 1 +regGL2C_PERFCOUNTER3_HI = 0x3387 +regGL2C_PERFCOUNTER3_HI_BASE_IDX = 1 +regGL2A_PERFCOUNTER0_LO = 0x3390 +regGL2A_PERFCOUNTER0_LO_BASE_IDX = 1 +regGL2A_PERFCOUNTER0_HI = 0x3391 +regGL2A_PERFCOUNTER0_HI_BASE_IDX = 1 +regGL2A_PERFCOUNTER1_LO = 0x3392 +regGL2A_PERFCOUNTER1_LO_BASE_IDX = 1 +regGL2A_PERFCOUNTER1_HI = 0x3393 +regGL2A_PERFCOUNTER1_HI_BASE_IDX = 1 +regGL2A_PERFCOUNTER2_LO = 0x3394 +regGL2A_PERFCOUNTER2_LO_BASE_IDX = 1 +regGL2A_PERFCOUNTER2_HI = 0x3395 +regGL2A_PERFCOUNTER2_HI_BASE_IDX = 1 +regGL2A_PERFCOUNTER3_LO = 0x3396 +regGL2A_PERFCOUNTER3_LO_BASE_IDX = 1 +regGL2A_PERFCOUNTER3_HI = 0x3397 +regGL2A_PERFCOUNTER3_HI_BASE_IDX = 1 +regGL1C_PERFCOUNTER0_LO = 0x33a0 +regGL1C_PERFCOUNTER0_LO_BASE_IDX = 1 +regGL1C_PERFCOUNTER0_HI = 0x33a1 +regGL1C_PERFCOUNTER0_HI_BASE_IDX = 1 +regGL1C_PERFCOUNTER1_LO = 0x33a2 +regGL1C_PERFCOUNTER1_LO_BASE_IDX = 1 +regGL1C_PERFCOUNTER1_HI = 0x33a3 +regGL1C_PERFCOUNTER1_HI_BASE_IDX = 1 +regGL1C_PERFCOUNTER2_LO = 0x33a4 +regGL1C_PERFCOUNTER2_LO_BASE_IDX = 1 +regGL1C_PERFCOUNTER2_HI = 0x33a5 +regGL1C_PERFCOUNTER2_HI_BASE_IDX = 1 +regGL1C_PERFCOUNTER3_LO = 0x33a6 +regGL1C_PERFCOUNTER3_LO_BASE_IDX = 1 +regGL1C_PERFCOUNTER3_HI = 0x33a7 +regGL1C_PERFCOUNTER3_HI_BASE_IDX = 1 +regCHC_PERFCOUNTER0_LO = 0x33c0 +regCHC_PERFCOUNTER0_LO_BASE_IDX = 1 +regCHC_PERFCOUNTER0_HI = 0x33c1 +regCHC_PERFCOUNTER0_HI_BASE_IDX = 1 +regCHC_PERFCOUNTER1_LO = 0x33c2 +regCHC_PERFCOUNTER1_LO_BASE_IDX = 1 +regCHC_PERFCOUNTER1_HI = 0x33c3 +regCHC_PERFCOUNTER1_HI_BASE_IDX = 1 +regCHC_PERFCOUNTER2_LO = 0x33c4 +regCHC_PERFCOUNTER2_LO_BASE_IDX = 1 +regCHC_PERFCOUNTER2_HI = 0x33c5 +regCHC_PERFCOUNTER2_HI_BASE_IDX = 1 +regCHC_PERFCOUNTER3_LO = 0x33c6 +regCHC_PERFCOUNTER3_LO_BASE_IDX = 1 +regCHC_PERFCOUNTER3_HI = 0x33c7 +regCHC_PERFCOUNTER3_HI_BASE_IDX = 1 +regCHCG_PERFCOUNTER0_LO = 0x33c8 +regCHCG_PERFCOUNTER0_LO_BASE_IDX = 1 +regCHCG_PERFCOUNTER0_HI = 0x33c9 +regCHCG_PERFCOUNTER0_HI_BASE_IDX = 1 +regCHCG_PERFCOUNTER1_LO = 0x33ca +regCHCG_PERFCOUNTER1_LO_BASE_IDX = 1 +regCHCG_PERFCOUNTER1_HI = 0x33cb +regCHCG_PERFCOUNTER1_HI_BASE_IDX = 1 +regCHCG_PERFCOUNTER2_LO = 0x33cc +regCHCG_PERFCOUNTER2_LO_BASE_IDX = 1 +regCHCG_PERFCOUNTER2_HI = 0x33cd +regCHCG_PERFCOUNTER2_HI_BASE_IDX = 1 +regCHCG_PERFCOUNTER3_LO = 0x33ce +regCHCG_PERFCOUNTER3_LO_BASE_IDX = 1 +regCHCG_PERFCOUNTER3_HI = 0x33cf +regCHCG_PERFCOUNTER3_HI_BASE_IDX = 1 +regCB_PERFCOUNTER0_LO = 0x3406 +regCB_PERFCOUNTER0_LO_BASE_IDX = 1 +regCB_PERFCOUNTER0_HI = 0x3407 +regCB_PERFCOUNTER0_HI_BASE_IDX = 1 +regCB_PERFCOUNTER1_LO = 0x3408 +regCB_PERFCOUNTER1_LO_BASE_IDX = 1 +regCB_PERFCOUNTER1_HI = 0x3409 +regCB_PERFCOUNTER1_HI_BASE_IDX = 1 +regCB_PERFCOUNTER2_LO = 0x340a +regCB_PERFCOUNTER2_LO_BASE_IDX = 1 +regCB_PERFCOUNTER2_HI = 0x340b +regCB_PERFCOUNTER2_HI_BASE_IDX = 1 +regCB_PERFCOUNTER3_LO = 0x340c +regCB_PERFCOUNTER3_LO_BASE_IDX = 1 +regCB_PERFCOUNTER3_HI = 0x340d +regCB_PERFCOUNTER3_HI_BASE_IDX = 1 +regDB_PERFCOUNTER0_LO = 0x3440 +regDB_PERFCOUNTER0_LO_BASE_IDX = 1 +regDB_PERFCOUNTER0_HI = 0x3441 +regDB_PERFCOUNTER0_HI_BASE_IDX = 1 +regDB_PERFCOUNTER1_LO = 0x3442 +regDB_PERFCOUNTER1_LO_BASE_IDX = 1 +regDB_PERFCOUNTER1_HI = 0x3443 +regDB_PERFCOUNTER1_HI_BASE_IDX = 1 +regDB_PERFCOUNTER2_LO = 0x3444 +regDB_PERFCOUNTER2_LO_BASE_IDX = 1 +regDB_PERFCOUNTER2_HI = 0x3445 +regDB_PERFCOUNTER2_HI_BASE_IDX = 1 +regDB_PERFCOUNTER3_LO = 0x3446 +regDB_PERFCOUNTER3_LO_BASE_IDX = 1 +regDB_PERFCOUNTER3_HI = 0x3447 +regDB_PERFCOUNTER3_HI_BASE_IDX = 1 +regRLC_PERFCOUNTER0_LO = 0x3480 +regRLC_PERFCOUNTER0_LO_BASE_IDX = 1 +regRLC_PERFCOUNTER0_HI = 0x3481 +regRLC_PERFCOUNTER0_HI_BASE_IDX = 1 +regRLC_PERFCOUNTER1_LO = 0x3482 +regRLC_PERFCOUNTER1_LO_BASE_IDX = 1 +regRLC_PERFCOUNTER1_HI = 0x3483 +regRLC_PERFCOUNTER1_HI_BASE_IDX = 1 +regRMI_PERFCOUNTER0_LO = 0x34c0 +regRMI_PERFCOUNTER0_LO_BASE_IDX = 1 +regRMI_PERFCOUNTER0_HI = 0x34c1 +regRMI_PERFCOUNTER0_HI_BASE_IDX = 1 +regRMI_PERFCOUNTER1_LO = 0x34c2 +regRMI_PERFCOUNTER1_LO_BASE_IDX = 1 +regRMI_PERFCOUNTER1_HI = 0x34c3 +regRMI_PERFCOUNTER1_HI_BASE_IDX = 1 +regRMI_PERFCOUNTER2_LO = 0x34c4 +regRMI_PERFCOUNTER2_LO_BASE_IDX = 1 +regRMI_PERFCOUNTER2_HI = 0x34c5 +regRMI_PERFCOUNTER2_HI_BASE_IDX = 1 +regRMI_PERFCOUNTER3_LO = 0x34c6 +regRMI_PERFCOUNTER3_LO_BASE_IDX = 1 +regRMI_PERFCOUNTER3_HI = 0x34c7 +regRMI_PERFCOUNTER3_HI_BASE_IDX = 1 +regGCR_PERFCOUNTER0_LO = 0x3520 +regGCR_PERFCOUNTER0_LO_BASE_IDX = 1 +regGCR_PERFCOUNTER0_HI = 0x3521 +regGCR_PERFCOUNTER0_HI_BASE_IDX = 1 +regGCR_PERFCOUNTER1_LO = 0x3522 +regGCR_PERFCOUNTER1_LO_BASE_IDX = 1 +regGCR_PERFCOUNTER1_HI = 0x3523 +regGCR_PERFCOUNTER1_HI_BASE_IDX = 1 +regPA_PH_PERFCOUNTER0_LO = 0x3580 +regPA_PH_PERFCOUNTER0_LO_BASE_IDX = 1 +regPA_PH_PERFCOUNTER0_HI = 0x3581 +regPA_PH_PERFCOUNTER0_HI_BASE_IDX = 1 +regPA_PH_PERFCOUNTER1_LO = 0x3582 +regPA_PH_PERFCOUNTER1_LO_BASE_IDX = 1 +regPA_PH_PERFCOUNTER1_HI = 0x3583 +regPA_PH_PERFCOUNTER1_HI_BASE_IDX = 1 +regPA_PH_PERFCOUNTER2_LO = 0x3584 +regPA_PH_PERFCOUNTER2_LO_BASE_IDX = 1 +regPA_PH_PERFCOUNTER2_HI = 0x3585 +regPA_PH_PERFCOUNTER2_HI_BASE_IDX = 1 +regPA_PH_PERFCOUNTER3_LO = 0x3586 +regPA_PH_PERFCOUNTER3_LO_BASE_IDX = 1 +regPA_PH_PERFCOUNTER3_HI = 0x3587 +regPA_PH_PERFCOUNTER3_HI_BASE_IDX = 1 +regPA_PH_PERFCOUNTER4_LO = 0x3588 +regPA_PH_PERFCOUNTER4_LO_BASE_IDX = 1 +regPA_PH_PERFCOUNTER4_HI = 0x3589 +regPA_PH_PERFCOUNTER4_HI_BASE_IDX = 1 +regPA_PH_PERFCOUNTER5_LO = 0x358a +regPA_PH_PERFCOUNTER5_LO_BASE_IDX = 1 +regPA_PH_PERFCOUNTER5_HI = 0x358b +regPA_PH_PERFCOUNTER5_HI_BASE_IDX = 1 +regPA_PH_PERFCOUNTER6_LO = 0x358c +regPA_PH_PERFCOUNTER6_LO_BASE_IDX = 1 +regPA_PH_PERFCOUNTER6_HI = 0x358d +regPA_PH_PERFCOUNTER6_HI_BASE_IDX = 1 +regPA_PH_PERFCOUNTER7_LO = 0x358e +regPA_PH_PERFCOUNTER7_LO_BASE_IDX = 1 +regPA_PH_PERFCOUNTER7_HI = 0x358f +regPA_PH_PERFCOUNTER7_HI_BASE_IDX = 1 +regUTCL1_PERFCOUNTER0_LO = 0x35a0 +regUTCL1_PERFCOUNTER0_LO_BASE_IDX = 1 +regUTCL1_PERFCOUNTER0_HI = 0x35a1 +regUTCL1_PERFCOUNTER0_HI_BASE_IDX = 1 +regUTCL1_PERFCOUNTER1_LO = 0x35a2 +regUTCL1_PERFCOUNTER1_LO_BASE_IDX = 1 +regUTCL1_PERFCOUNTER1_HI = 0x35a3 +regUTCL1_PERFCOUNTER1_HI_BASE_IDX = 1 +regUTCL1_PERFCOUNTER2_LO = 0x35a4 +regUTCL1_PERFCOUNTER2_LO_BASE_IDX = 1 +regUTCL1_PERFCOUNTER2_HI = 0x35a5 +regUTCL1_PERFCOUNTER2_HI_BASE_IDX = 1 +regUTCL1_PERFCOUNTER3_LO = 0x35a6 +regUTCL1_PERFCOUNTER3_LO_BASE_IDX = 1 +regUTCL1_PERFCOUNTER3_HI = 0x35a7 +regUTCL1_PERFCOUNTER3_HI_BASE_IDX = 1 +regGL1A_PERFCOUNTER0_LO = 0x35c0 +regGL1A_PERFCOUNTER0_LO_BASE_IDX = 1 +regGL1A_PERFCOUNTER0_HI = 0x35c1 +regGL1A_PERFCOUNTER0_HI_BASE_IDX = 1 +regGL1A_PERFCOUNTER1_LO = 0x35c2 +regGL1A_PERFCOUNTER1_LO_BASE_IDX = 1 +regGL1A_PERFCOUNTER1_HI = 0x35c3 +regGL1A_PERFCOUNTER1_HI_BASE_IDX = 1 +regGL1A_PERFCOUNTER2_LO = 0x35c4 +regGL1A_PERFCOUNTER2_LO_BASE_IDX = 1 +regGL1A_PERFCOUNTER2_HI = 0x35c5 +regGL1A_PERFCOUNTER2_HI_BASE_IDX = 1 +regGL1A_PERFCOUNTER3_LO = 0x35c6 +regGL1A_PERFCOUNTER3_LO_BASE_IDX = 1 +regGL1A_PERFCOUNTER3_HI = 0x35c7 +regGL1A_PERFCOUNTER3_HI_BASE_IDX = 1 +regGL1H_PERFCOUNTER0_LO = 0x35d0 +regGL1H_PERFCOUNTER0_LO_BASE_IDX = 1 +regGL1H_PERFCOUNTER0_HI = 0x35d1 +regGL1H_PERFCOUNTER0_HI_BASE_IDX = 1 +regGL1H_PERFCOUNTER1_LO = 0x35d2 +regGL1H_PERFCOUNTER1_LO_BASE_IDX = 1 +regGL1H_PERFCOUNTER1_HI = 0x35d3 +regGL1H_PERFCOUNTER1_HI_BASE_IDX = 1 +regGL1H_PERFCOUNTER2_LO = 0x35d4 +regGL1H_PERFCOUNTER2_LO_BASE_IDX = 1 +regGL1H_PERFCOUNTER2_HI = 0x35d5 +regGL1H_PERFCOUNTER2_HI_BASE_IDX = 1 +regGL1H_PERFCOUNTER3_LO = 0x35d6 +regGL1H_PERFCOUNTER3_LO_BASE_IDX = 1 +regGL1H_PERFCOUNTER3_HI = 0x35d7 +regGL1H_PERFCOUNTER3_HI_BASE_IDX = 1 +regCHA_PERFCOUNTER0_LO = 0x3600 +regCHA_PERFCOUNTER0_LO_BASE_IDX = 1 +regCHA_PERFCOUNTER0_HI = 0x3601 +regCHA_PERFCOUNTER0_HI_BASE_IDX = 1 +regCHA_PERFCOUNTER1_LO = 0x3602 +regCHA_PERFCOUNTER1_LO_BASE_IDX = 1 +regCHA_PERFCOUNTER1_HI = 0x3603 +regCHA_PERFCOUNTER1_HI_BASE_IDX = 1 +regCHA_PERFCOUNTER2_LO = 0x3604 +regCHA_PERFCOUNTER2_LO_BASE_IDX = 1 +regCHA_PERFCOUNTER2_HI = 0x3605 +regCHA_PERFCOUNTER2_HI_BASE_IDX = 1 +regCHA_PERFCOUNTER3_LO = 0x3606 +regCHA_PERFCOUNTER3_LO_BASE_IDX = 1 +regCHA_PERFCOUNTER3_HI = 0x3607 +regCHA_PERFCOUNTER3_HI_BASE_IDX = 1 +regGUS_PERFCOUNTER2_LO = 0x3640 +regGUS_PERFCOUNTER2_LO_BASE_IDX = 1 +regGUS_PERFCOUNTER2_HI = 0x3641 +regGUS_PERFCOUNTER2_HI_BASE_IDX = 1 +regGUS_PERFCOUNTER_LO = 0x3642 +regGUS_PERFCOUNTER_LO_BASE_IDX = 1 +regGUS_PERFCOUNTER_HI = 0x3643 +regGUS_PERFCOUNTER_HI_BASE_IDX = 1 +regCPG_PERFCOUNTER1_SELECT = 0x3800 +regCPG_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regCPG_PERFCOUNTER0_SELECT1 = 0x3801 +regCPG_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regCPG_PERFCOUNTER0_SELECT = 0x3802 +regCPG_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regCPC_PERFCOUNTER1_SELECT = 0x3803 +regCPC_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regCPC_PERFCOUNTER0_SELECT1 = 0x3804 +regCPC_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regCPF_PERFCOUNTER1_SELECT = 0x3805 +regCPF_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regCPF_PERFCOUNTER0_SELECT1 = 0x3806 +regCPF_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regCPF_PERFCOUNTER0_SELECT = 0x3807 +regCPF_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regCP_PERFMON_CNTL = 0x3808 +regCP_PERFMON_CNTL_BASE_IDX = 1 +regCPC_PERFCOUNTER0_SELECT = 0x3809 +regCPC_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regCPF_TC_PERF_COUNTER_WINDOW_SELECT = 0x380a +regCPF_TC_PERF_COUNTER_WINDOW_SELECT_BASE_IDX = 1 +regCPG_TC_PERF_COUNTER_WINDOW_SELECT = 0x380b +regCPG_TC_PERF_COUNTER_WINDOW_SELECT_BASE_IDX = 1 +regCPF_LATENCY_STATS_SELECT = 0x380c +regCPF_LATENCY_STATS_SELECT_BASE_IDX = 1 +regCPG_LATENCY_STATS_SELECT = 0x380d +regCPG_LATENCY_STATS_SELECT_BASE_IDX = 1 +regCPC_LATENCY_STATS_SELECT = 0x380e +regCPC_LATENCY_STATS_SELECT_BASE_IDX = 1 +regCPC_TC_PERF_COUNTER_WINDOW_SELECT = 0x380f +regCPC_TC_PERF_COUNTER_WINDOW_SELECT_BASE_IDX = 1 +regCP_DRAW_OBJECT = 0x3810 +regCP_DRAW_OBJECT_BASE_IDX = 1 +regCP_DRAW_OBJECT_COUNTER = 0x3811 +regCP_DRAW_OBJECT_COUNTER_BASE_IDX = 1 +regCP_DRAW_WINDOW_MASK_HI = 0x3812 +regCP_DRAW_WINDOW_MASK_HI_BASE_IDX = 1 +regCP_DRAW_WINDOW_HI = 0x3813 +regCP_DRAW_WINDOW_HI_BASE_IDX = 1 +regCP_DRAW_WINDOW_LO = 0x3814 +regCP_DRAW_WINDOW_LO_BASE_IDX = 1 +regCP_DRAW_WINDOW_CNTL = 0x3815 +regCP_DRAW_WINDOW_CNTL_BASE_IDX = 1 +regGRBM_PERFCOUNTER0_SELECT = 0x3840 +regGRBM_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGRBM_PERFCOUNTER1_SELECT = 0x3841 +regGRBM_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGRBM_SE0_PERFCOUNTER_SELECT = 0x3842 +regGRBM_SE0_PERFCOUNTER_SELECT_BASE_IDX = 1 +regGRBM_SE1_PERFCOUNTER_SELECT = 0x3843 +regGRBM_SE1_PERFCOUNTER_SELECT_BASE_IDX = 1 +regGRBM_SE2_PERFCOUNTER_SELECT = 0x3844 +regGRBM_SE2_PERFCOUNTER_SELECT_BASE_IDX = 1 +regGRBM_SE3_PERFCOUNTER_SELECT = 0x3845 +regGRBM_SE3_PERFCOUNTER_SELECT_BASE_IDX = 1 +regGRBM_SE4_PERFCOUNTER_SELECT = 0x3846 +regGRBM_SE4_PERFCOUNTER_SELECT_BASE_IDX = 1 +regGRBM_SE5_PERFCOUNTER_SELECT = 0x3847 +regGRBM_SE5_PERFCOUNTER_SELECT_BASE_IDX = 1 +regGRBM_SE6_PERFCOUNTER_SELECT = 0x3848 +regGRBM_SE6_PERFCOUNTER_SELECT_BASE_IDX = 1 +regGRBM_PERFCOUNTER0_SELECT_HI = 0x384d +regGRBM_PERFCOUNTER0_SELECT_HI_BASE_IDX = 1 +regGRBM_PERFCOUNTER1_SELECT_HI = 0x384e +regGRBM_PERFCOUNTER1_SELECT_HI_BASE_IDX = 1 +regGE1_PERFCOUNTER0_SELECT = 0x38a4 +regGE1_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGE1_PERFCOUNTER0_SELECT1 = 0x38a5 +regGE1_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGE1_PERFCOUNTER1_SELECT = 0x38a6 +regGE1_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGE1_PERFCOUNTER1_SELECT1 = 0x38a7 +regGE1_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regGE1_PERFCOUNTER2_SELECT = 0x38a8 +regGE1_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGE1_PERFCOUNTER2_SELECT1 = 0x38a9 +regGE1_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regGE1_PERFCOUNTER3_SELECT = 0x38aa +regGE1_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGE1_PERFCOUNTER3_SELECT1 = 0x38ab +regGE1_PERFCOUNTER3_SELECT1_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER0_SELECT = 0x38ac +regGE2_DIST_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER0_SELECT1 = 0x38ad +regGE2_DIST_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER1_SELECT = 0x38ae +regGE2_DIST_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER1_SELECT1 = 0x38af +regGE2_DIST_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER2_SELECT = 0x38b0 +regGE2_DIST_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER2_SELECT1 = 0x38b1 +regGE2_DIST_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER3_SELECT = 0x38b2 +regGE2_DIST_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGE2_DIST_PERFCOUNTER3_SELECT1 = 0x38b3 +regGE2_DIST_PERFCOUNTER3_SELECT1_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER0_SELECT = 0x38b4 +regGE2_SE_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER0_SELECT1 = 0x38b5 +regGE2_SE_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER1_SELECT = 0x38b6 +regGE2_SE_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER1_SELECT1 = 0x38b7 +regGE2_SE_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER2_SELECT = 0x38b8 +regGE2_SE_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER2_SELECT1 = 0x38b9 +regGE2_SE_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER3_SELECT = 0x38ba +regGE2_SE_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGE2_SE_PERFCOUNTER3_SELECT1 = 0x38bb +regGE2_SE_PERFCOUNTER3_SELECT1_BASE_IDX = 1 +regPA_SU_PERFCOUNTER0_SELECT = 0x3900 +regPA_SU_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regPA_SU_PERFCOUNTER0_SELECT1 = 0x3901 +regPA_SU_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regPA_SU_PERFCOUNTER1_SELECT = 0x3902 +regPA_SU_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regPA_SU_PERFCOUNTER1_SELECT1 = 0x3903 +regPA_SU_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regPA_SU_PERFCOUNTER2_SELECT = 0x3904 +regPA_SU_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regPA_SU_PERFCOUNTER2_SELECT1 = 0x3905 +regPA_SU_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regPA_SU_PERFCOUNTER3_SELECT = 0x3906 +regPA_SU_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regPA_SU_PERFCOUNTER3_SELECT1 = 0x3907 +regPA_SU_PERFCOUNTER3_SELECT1_BASE_IDX = 1 +regPA_SC_PERFCOUNTER0_SELECT = 0x3940 +regPA_SC_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regPA_SC_PERFCOUNTER0_SELECT1 = 0x3941 +regPA_SC_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regPA_SC_PERFCOUNTER1_SELECT = 0x3942 +regPA_SC_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regPA_SC_PERFCOUNTER2_SELECT = 0x3943 +regPA_SC_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regPA_SC_PERFCOUNTER3_SELECT = 0x3944 +regPA_SC_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regPA_SC_PERFCOUNTER4_SELECT = 0x3945 +regPA_SC_PERFCOUNTER4_SELECT_BASE_IDX = 1 +regPA_SC_PERFCOUNTER5_SELECT = 0x3946 +regPA_SC_PERFCOUNTER5_SELECT_BASE_IDX = 1 +regPA_SC_PERFCOUNTER6_SELECT = 0x3947 +regPA_SC_PERFCOUNTER6_SELECT_BASE_IDX = 1 +regPA_SC_PERFCOUNTER7_SELECT = 0x3948 +regPA_SC_PERFCOUNTER7_SELECT_BASE_IDX = 1 +regSPI_PERFCOUNTER0_SELECT = 0x3980 +regSPI_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regSPI_PERFCOUNTER1_SELECT = 0x3981 +regSPI_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regSPI_PERFCOUNTER2_SELECT = 0x3982 +regSPI_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regSPI_PERFCOUNTER3_SELECT = 0x3983 +regSPI_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regSPI_PERFCOUNTER0_SELECT1 = 0x3984 +regSPI_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regSPI_PERFCOUNTER1_SELECT1 = 0x3985 +regSPI_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regSPI_PERFCOUNTER2_SELECT1 = 0x3986 +regSPI_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regSPI_PERFCOUNTER3_SELECT1 = 0x3987 +regSPI_PERFCOUNTER3_SELECT1_BASE_IDX = 1 +regSPI_PERFCOUNTER4_SELECT = 0x3988 +regSPI_PERFCOUNTER4_SELECT_BASE_IDX = 1 +regSPI_PERFCOUNTER5_SELECT = 0x3989 +regSPI_PERFCOUNTER5_SELECT_BASE_IDX = 1 +regSPI_PERFCOUNTER_BINS = 0x398a +regSPI_PERFCOUNTER_BINS_BASE_IDX = 1 +regPC_PERFCOUNTER0_SELECT = 0x398c +regPC_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regPC_PERFCOUNTER1_SELECT = 0x398d +regPC_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regPC_PERFCOUNTER2_SELECT = 0x398e +regPC_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regPC_PERFCOUNTER3_SELECT = 0x398f +regPC_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regPC_PERFCOUNTER0_SELECT1 = 0x3990 +regPC_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regPC_PERFCOUNTER1_SELECT1 = 0x3991 +regPC_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regPC_PERFCOUNTER2_SELECT1 = 0x3992 +regPC_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regPC_PERFCOUNTER3_SELECT1 = 0x3993 +regPC_PERFCOUNTER3_SELECT1_BASE_IDX = 1 +regSQ_PERFCOUNTER0_SELECT = 0x39c0 +regSQ_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER1_SELECT = 0x39c1 +regSQ_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER2_SELECT = 0x39c2 +regSQ_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER3_SELECT = 0x39c3 +regSQ_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER4_SELECT = 0x39c4 +regSQ_PERFCOUNTER4_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER5_SELECT = 0x39c5 +regSQ_PERFCOUNTER5_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER6_SELECT = 0x39c6 +regSQ_PERFCOUNTER6_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER7_SELECT = 0x39c7 +regSQ_PERFCOUNTER7_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER8_SELECT = 0x39c8 +regSQ_PERFCOUNTER8_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER9_SELECT = 0x39c9 +regSQ_PERFCOUNTER9_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER10_SELECT = 0x39ca +regSQ_PERFCOUNTER10_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER11_SELECT = 0x39cb +regSQ_PERFCOUNTER11_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER12_SELECT = 0x39cc +regSQ_PERFCOUNTER12_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER13_SELECT = 0x39cd +regSQ_PERFCOUNTER13_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER14_SELECT = 0x39ce +regSQ_PERFCOUNTER14_SELECT_BASE_IDX = 1 +regSQ_PERFCOUNTER15_SELECT = 0x39cf +regSQ_PERFCOUNTER15_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER0_SELECT = 0x39d0 +regSQG_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER1_SELECT = 0x39d1 +regSQG_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER2_SELECT = 0x39d2 +regSQG_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER3_SELECT = 0x39d3 +regSQG_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER4_SELECT = 0x39d4 +regSQG_PERFCOUNTER4_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER5_SELECT = 0x39d5 +regSQG_PERFCOUNTER5_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER6_SELECT = 0x39d6 +regSQG_PERFCOUNTER6_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER7_SELECT = 0x39d7 +regSQG_PERFCOUNTER7_SELECT_BASE_IDX = 1 +regSQG_PERFCOUNTER_CTRL = 0x39d8 +regSQG_PERFCOUNTER_CTRL_BASE_IDX = 1 +regSQG_PERFCOUNTER_CTRL2 = 0x39da +regSQG_PERFCOUNTER_CTRL2_BASE_IDX = 1 +regSQG_PERF_SAMPLE_FINISH = 0x39db +regSQG_PERF_SAMPLE_FINISH_BASE_IDX = 1 +regSQ_PERFCOUNTER_CTRL = 0x39e0 +regSQ_PERFCOUNTER_CTRL_BASE_IDX = 1 +regSQ_PERFCOUNTER_CTRL2 = 0x39e2 +regSQ_PERFCOUNTER_CTRL2_BASE_IDX = 1 +regSQ_THREAD_TRACE_BUF0_BASE = 0x39e8 +regSQ_THREAD_TRACE_BUF0_BASE_BASE_IDX = 1 +regSQ_THREAD_TRACE_BUF0_SIZE = 0x39e9 +regSQ_THREAD_TRACE_BUF0_SIZE_BASE_IDX = 1 +regSQ_THREAD_TRACE_BUF1_BASE = 0x39ea +regSQ_THREAD_TRACE_BUF1_BASE_BASE_IDX = 1 +regSQ_THREAD_TRACE_BUF1_SIZE = 0x39eb +regSQ_THREAD_TRACE_BUF1_SIZE_BASE_IDX = 1 +regSQ_THREAD_TRACE_CTRL = 0x39ec +regSQ_THREAD_TRACE_CTRL_BASE_IDX = 1 +regSQ_THREAD_TRACE_MASK = 0x39ed +regSQ_THREAD_TRACE_MASK_BASE_IDX = 1 +regSQ_THREAD_TRACE_TOKEN_MASK = 0x39ee +regSQ_THREAD_TRACE_TOKEN_MASK_BASE_IDX = 1 +regSQ_THREAD_TRACE_WPTR = 0x39ef +regSQ_THREAD_TRACE_WPTR_BASE_IDX = 1 +regSQ_THREAD_TRACE_STATUS = 0x39f4 +regSQ_THREAD_TRACE_STATUS_BASE_IDX = 1 +regSQ_THREAD_TRACE_STATUS2 = 0x39f5 +regSQ_THREAD_TRACE_STATUS2_BASE_IDX = 1 +regSQ_THREAD_TRACE_GFX_DRAW_CNTR = 0x39f6 +regSQ_THREAD_TRACE_GFX_DRAW_CNTR_BASE_IDX = 1 +regSQ_THREAD_TRACE_GFX_MARKER_CNTR = 0x39f7 +regSQ_THREAD_TRACE_GFX_MARKER_CNTR_BASE_IDX = 1 +regSQ_THREAD_TRACE_HP3D_DRAW_CNTR = 0x39f8 +regSQ_THREAD_TRACE_HP3D_DRAW_CNTR_BASE_IDX = 1 +regSQ_THREAD_TRACE_HP3D_MARKER_CNTR = 0x39f9 +regSQ_THREAD_TRACE_HP3D_MARKER_CNTR_BASE_IDX = 1 +regSQ_THREAD_TRACE_DROPPED_CNTR = 0x39fa +regSQ_THREAD_TRACE_DROPPED_CNTR_BASE_IDX = 1 +regGCEA_PERFCOUNTER2_SELECT = 0x3a00 +regGCEA_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGCEA_PERFCOUNTER2_SELECT1 = 0x3a01 +regGCEA_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regGCEA_PERFCOUNTER2_MODE = 0x3a02 +regGCEA_PERFCOUNTER2_MODE_BASE_IDX = 1 +regGCEA_PERFCOUNTER0_CFG = 0x3a03 +regGCEA_PERFCOUNTER0_CFG_BASE_IDX = 1 +regGCEA_PERFCOUNTER1_CFG = 0x3a04 +regGCEA_PERFCOUNTER1_CFG_BASE_IDX = 1 +regGCEA_PERFCOUNTER_RSLT_CNTL = 0x3a05 +regGCEA_PERFCOUNTER_RSLT_CNTL_BASE_IDX = 1 +regSX_PERFCOUNTER0_SELECT = 0x3a40 +regSX_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regSX_PERFCOUNTER1_SELECT = 0x3a41 +regSX_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regSX_PERFCOUNTER2_SELECT = 0x3a42 +regSX_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regSX_PERFCOUNTER3_SELECT = 0x3a43 +regSX_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regSX_PERFCOUNTER0_SELECT1 = 0x3a44 +regSX_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regSX_PERFCOUNTER1_SELECT1 = 0x3a45 +regSX_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regGDS_PERFCOUNTER0_SELECT = 0x3a80 +regGDS_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGDS_PERFCOUNTER1_SELECT = 0x3a81 +regGDS_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGDS_PERFCOUNTER2_SELECT = 0x3a82 +regGDS_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGDS_PERFCOUNTER3_SELECT = 0x3a83 +regGDS_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGDS_PERFCOUNTER0_SELECT1 = 0x3a84 +regGDS_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGDS_PERFCOUNTER1_SELECT1 = 0x3a85 +regGDS_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regGDS_PERFCOUNTER2_SELECT1 = 0x3a86 +regGDS_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regGDS_PERFCOUNTER3_SELECT1 = 0x3a87 +regGDS_PERFCOUNTER3_SELECT1_BASE_IDX = 1 +regTA_PERFCOUNTER0_SELECT = 0x3ac0 +regTA_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regTA_PERFCOUNTER0_SELECT1 = 0x3ac1 +regTA_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regTA_PERFCOUNTER1_SELECT = 0x3ac2 +regTA_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regTD_PERFCOUNTER0_SELECT = 0x3b00 +regTD_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regTD_PERFCOUNTER0_SELECT1 = 0x3b01 +regTD_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regTD_PERFCOUNTER1_SELECT = 0x3b02 +regTD_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regTCP_PERFCOUNTER0_SELECT = 0x3b40 +regTCP_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regTCP_PERFCOUNTER0_SELECT1 = 0x3b41 +regTCP_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regTCP_PERFCOUNTER1_SELECT = 0x3b42 +regTCP_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regTCP_PERFCOUNTER1_SELECT1 = 0x3b43 +regTCP_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regTCP_PERFCOUNTER2_SELECT = 0x3b44 +regTCP_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regTCP_PERFCOUNTER3_SELECT = 0x3b45 +regTCP_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGL2C_PERFCOUNTER0_SELECT = 0x3b80 +regGL2C_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGL2C_PERFCOUNTER0_SELECT1 = 0x3b81 +regGL2C_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGL2C_PERFCOUNTER1_SELECT = 0x3b82 +regGL2C_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGL2C_PERFCOUNTER1_SELECT1 = 0x3b83 +regGL2C_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regGL2C_PERFCOUNTER2_SELECT = 0x3b84 +regGL2C_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGL2C_PERFCOUNTER3_SELECT = 0x3b85 +regGL2C_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGL2A_PERFCOUNTER0_SELECT = 0x3b90 +regGL2A_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGL2A_PERFCOUNTER0_SELECT1 = 0x3b91 +regGL2A_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGL2A_PERFCOUNTER1_SELECT = 0x3b92 +regGL2A_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGL2A_PERFCOUNTER1_SELECT1 = 0x3b93 +regGL2A_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regGL2A_PERFCOUNTER2_SELECT = 0x3b94 +regGL2A_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGL2A_PERFCOUNTER3_SELECT = 0x3b95 +regGL2A_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGL1C_PERFCOUNTER0_SELECT = 0x3ba0 +regGL1C_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGL1C_PERFCOUNTER0_SELECT1 = 0x3ba1 +regGL1C_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGL1C_PERFCOUNTER1_SELECT = 0x3ba2 +regGL1C_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGL1C_PERFCOUNTER2_SELECT = 0x3ba3 +regGL1C_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGL1C_PERFCOUNTER3_SELECT = 0x3ba4 +regGL1C_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regCHC_PERFCOUNTER0_SELECT = 0x3bc0 +regCHC_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regCHC_PERFCOUNTER0_SELECT1 = 0x3bc1 +regCHC_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regCHC_PERFCOUNTER1_SELECT = 0x3bc2 +regCHC_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regCHC_PERFCOUNTER2_SELECT = 0x3bc3 +regCHC_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regCHC_PERFCOUNTER3_SELECT = 0x3bc4 +regCHC_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regCHCG_PERFCOUNTER0_SELECT = 0x3bc6 +regCHCG_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regCHCG_PERFCOUNTER0_SELECT1 = 0x3bc7 +regCHCG_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regCHCG_PERFCOUNTER1_SELECT = 0x3bc8 +regCHCG_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regCHCG_PERFCOUNTER2_SELECT = 0x3bc9 +regCHCG_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regCHCG_PERFCOUNTER3_SELECT = 0x3bca +regCHCG_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regCB_PERFCOUNTER_FILTER = 0x3c00 +regCB_PERFCOUNTER_FILTER_BASE_IDX = 1 +regCB_PERFCOUNTER0_SELECT = 0x3c01 +regCB_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regCB_PERFCOUNTER0_SELECT1 = 0x3c02 +regCB_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regCB_PERFCOUNTER1_SELECT = 0x3c03 +regCB_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regCB_PERFCOUNTER2_SELECT = 0x3c04 +regCB_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regCB_PERFCOUNTER3_SELECT = 0x3c05 +regCB_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regDB_PERFCOUNTER0_SELECT = 0x3c40 +regDB_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regDB_PERFCOUNTER0_SELECT1 = 0x3c41 +regDB_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regDB_PERFCOUNTER1_SELECT = 0x3c42 +regDB_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regDB_PERFCOUNTER1_SELECT1 = 0x3c43 +regDB_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regDB_PERFCOUNTER2_SELECT = 0x3c44 +regDB_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regDB_PERFCOUNTER3_SELECT = 0x3c46 +regDB_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regRLC_SPM_PERFMON_CNTL = 0x3c80 +regRLC_SPM_PERFMON_CNTL_BASE_IDX = 1 +regRLC_SPM_PERFMON_RING_BASE_LO = 0x3c81 +regRLC_SPM_PERFMON_RING_BASE_LO_BASE_IDX = 1 +regRLC_SPM_PERFMON_RING_BASE_HI = 0x3c82 +regRLC_SPM_PERFMON_RING_BASE_HI_BASE_IDX = 1 +regRLC_SPM_PERFMON_RING_SIZE = 0x3c83 +regRLC_SPM_PERFMON_RING_SIZE_BASE_IDX = 1 +regRLC_SPM_RING_WRPTR = 0x3c84 +regRLC_SPM_RING_WRPTR_BASE_IDX = 1 +regRLC_SPM_RING_RDPTR = 0x3c85 +regRLC_SPM_RING_RDPTR_BASE_IDX = 1 +regRLC_SPM_SEGMENT_THRESHOLD = 0x3c86 +regRLC_SPM_SEGMENT_THRESHOLD_BASE_IDX = 1 +regRLC_SPM_PERFMON_SEGMENT_SIZE = 0x3c87 +regRLC_SPM_PERFMON_SEGMENT_SIZE_BASE_IDX = 1 +regRLC_SPM_GLOBAL_MUXSEL_ADDR = 0x3c88 +regRLC_SPM_GLOBAL_MUXSEL_ADDR_BASE_IDX = 1 +regRLC_SPM_GLOBAL_MUXSEL_DATA = 0x3c89 +regRLC_SPM_GLOBAL_MUXSEL_DATA_BASE_IDX = 1 +regRLC_SPM_SE_MUXSEL_ADDR = 0x3c8a +regRLC_SPM_SE_MUXSEL_ADDR_BASE_IDX = 1 +regRLC_SPM_SE_MUXSEL_DATA = 0x3c8b +regRLC_SPM_SE_MUXSEL_DATA_BASE_IDX = 1 +regRLC_SPM_ACCUM_DATARAM_ADDR = 0x3c92 +regRLC_SPM_ACCUM_DATARAM_ADDR_BASE_IDX = 1 +regRLC_SPM_ACCUM_DATARAM_DATA = 0x3c93 +regRLC_SPM_ACCUM_DATARAM_DATA_BASE_IDX = 1 +regRLC_SPM_ACCUM_SWA_DATARAM_ADDR = 0x3c94 +regRLC_SPM_ACCUM_SWA_DATARAM_ADDR_BASE_IDX = 1 +regRLC_SPM_ACCUM_SWA_DATARAM_DATA = 0x3c95 +regRLC_SPM_ACCUM_SWA_DATARAM_DATA_BASE_IDX = 1 +regRLC_SPM_ACCUM_CTRLRAM_ADDR = 0x3c96 +regRLC_SPM_ACCUM_CTRLRAM_ADDR_BASE_IDX = 1 +regRLC_SPM_ACCUM_CTRLRAM_DATA = 0x3c97 +regRLC_SPM_ACCUM_CTRLRAM_DATA_BASE_IDX = 1 +regRLC_SPM_ACCUM_CTRLRAM_ADDR_OFFSET = 0x3c98 +regRLC_SPM_ACCUM_CTRLRAM_ADDR_OFFSET_BASE_IDX = 1 +regRLC_SPM_ACCUM_STATUS = 0x3c99 +regRLC_SPM_ACCUM_STATUS_BASE_IDX = 1 +regRLC_SPM_ACCUM_CTRL = 0x3c9a +regRLC_SPM_ACCUM_CTRL_BASE_IDX = 1 +regRLC_SPM_ACCUM_MODE = 0x3c9b +regRLC_SPM_ACCUM_MODE_BASE_IDX = 1 +regRLC_SPM_ACCUM_THRESHOLD = 0x3c9c +regRLC_SPM_ACCUM_THRESHOLD_BASE_IDX = 1 +regRLC_SPM_ACCUM_SAMPLES_REQUESTED = 0x3c9d +regRLC_SPM_ACCUM_SAMPLES_REQUESTED_BASE_IDX = 1 +regRLC_SPM_ACCUM_DATARAM_WRCOUNT = 0x3c9e +regRLC_SPM_ACCUM_DATARAM_WRCOUNT_BASE_IDX = 1 +regRLC_SPM_ACCUM_DATARAM_32BITCNTRS_REGIONS = 0x3c9f +regRLC_SPM_ACCUM_DATARAM_32BITCNTRS_REGIONS_BASE_IDX = 1 +regRLC_SPM_PAUSE = 0x3ca2 +regRLC_SPM_PAUSE_BASE_IDX = 1 +regRLC_SPM_STATUS = 0x3ca3 +regRLC_SPM_STATUS_BASE_IDX = 1 +regRLC_SPM_GFXCLOCK_LOWCOUNT = 0x3ca4 +regRLC_SPM_GFXCLOCK_LOWCOUNT_BASE_IDX = 1 +regRLC_SPM_GFXCLOCK_HIGHCOUNT = 0x3ca5 +regRLC_SPM_GFXCLOCK_HIGHCOUNT_BASE_IDX = 1 +regRLC_SPM_MODE = 0x3cad +regRLC_SPM_MODE_BASE_IDX = 1 +regRLC_SPM_RSPM_REQ_DATA_LO = 0x3cae +regRLC_SPM_RSPM_REQ_DATA_LO_BASE_IDX = 1 +regRLC_SPM_RSPM_REQ_DATA_HI = 0x3caf +regRLC_SPM_RSPM_REQ_DATA_HI_BASE_IDX = 1 +regRLC_SPM_RSPM_REQ_OP = 0x3cb0 +regRLC_SPM_RSPM_REQ_OP_BASE_IDX = 1 +regRLC_SPM_RSPM_RET_DATA = 0x3cb1 +regRLC_SPM_RSPM_RET_DATA_BASE_IDX = 1 +regRLC_SPM_RSPM_RET_OP = 0x3cb2 +regRLC_SPM_RSPM_RET_OP_BASE_IDX = 1 +regRLC_SPM_SE_RSPM_REQ_DATA_LO = 0x3cb3 +regRLC_SPM_SE_RSPM_REQ_DATA_LO_BASE_IDX = 1 +regRLC_SPM_SE_RSPM_REQ_DATA_HI = 0x3cb4 +regRLC_SPM_SE_RSPM_REQ_DATA_HI_BASE_IDX = 1 +regRLC_SPM_SE_RSPM_REQ_OP = 0x3cb5 +regRLC_SPM_SE_RSPM_REQ_OP_BASE_IDX = 1 +regRLC_SPM_SE_RSPM_RET_DATA = 0x3cb6 +regRLC_SPM_SE_RSPM_RET_DATA_BASE_IDX = 1 +regRLC_SPM_SE_RSPM_RET_OP = 0x3cb7 +regRLC_SPM_SE_RSPM_RET_OP_BASE_IDX = 1 +regRLC_SPM_RSPM_CMD = 0x3cb8 +regRLC_SPM_RSPM_CMD_BASE_IDX = 1 +regRLC_SPM_RSPM_CMD_ACK = 0x3cb9 +regRLC_SPM_RSPM_CMD_ACK_BASE_IDX = 1 +regRLC_SPM_SPARE = 0x3cbf +regRLC_SPM_SPARE_BASE_IDX = 1 +regRLC_PERFMON_CNTL = 0x3cc0 +regRLC_PERFMON_CNTL_BASE_IDX = 1 +regRLC_PERFCOUNTER0_SELECT = 0x3cc1 +regRLC_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regRLC_PERFCOUNTER1_SELECT = 0x3cc2 +regRLC_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regRLC_GPU_IOV_PERF_CNT_CNTL = 0x3cc3 +regRLC_GPU_IOV_PERF_CNT_CNTL_BASE_IDX = 1 +regRLC_GPU_IOV_PERF_CNT_WR_ADDR = 0x3cc4 +regRLC_GPU_IOV_PERF_CNT_WR_ADDR_BASE_IDX = 1 +regRLC_GPU_IOV_PERF_CNT_WR_DATA = 0x3cc5 +regRLC_GPU_IOV_PERF_CNT_WR_DATA_BASE_IDX = 1 +regRLC_GPU_IOV_PERF_CNT_RD_ADDR = 0x3cc6 +regRLC_GPU_IOV_PERF_CNT_RD_ADDR_BASE_IDX = 1 +regRLC_GPU_IOV_PERF_CNT_RD_DATA = 0x3cc7 +regRLC_GPU_IOV_PERF_CNT_RD_DATA_BASE_IDX = 1 +regRMI_PERFCOUNTER0_SELECT = 0x3d00 +regRMI_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regRMI_PERFCOUNTER0_SELECT1 = 0x3d01 +regRMI_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regRMI_PERFCOUNTER1_SELECT = 0x3d02 +regRMI_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regRMI_PERFCOUNTER2_SELECT = 0x3d03 +regRMI_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regRMI_PERFCOUNTER2_SELECT1 = 0x3d04 +regRMI_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regRMI_PERFCOUNTER3_SELECT = 0x3d05 +regRMI_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regRMI_PERF_COUNTER_CNTL = 0x3d06 +regRMI_PERF_COUNTER_CNTL_BASE_IDX = 1 +regGCR_PERFCOUNTER0_SELECT = 0x3d60 +regGCR_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGCR_PERFCOUNTER0_SELECT1 = 0x3d61 +regGCR_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGCR_PERFCOUNTER1_SELECT = 0x3d62 +regGCR_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER0_SELECT = 0x3d80 +regPA_PH_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER0_SELECT1 = 0x3d81 +regPA_PH_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regPA_PH_PERFCOUNTER1_SELECT = 0x3d82 +regPA_PH_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER2_SELECT = 0x3d83 +regPA_PH_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER3_SELECT = 0x3d84 +regPA_PH_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER4_SELECT = 0x3d85 +regPA_PH_PERFCOUNTER4_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER5_SELECT = 0x3d86 +regPA_PH_PERFCOUNTER5_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER6_SELECT = 0x3d87 +regPA_PH_PERFCOUNTER6_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER7_SELECT = 0x3d88 +regPA_PH_PERFCOUNTER7_SELECT_BASE_IDX = 1 +regPA_PH_PERFCOUNTER1_SELECT1 = 0x3d90 +regPA_PH_PERFCOUNTER1_SELECT1_BASE_IDX = 1 +regPA_PH_PERFCOUNTER2_SELECT1 = 0x3d91 +regPA_PH_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regPA_PH_PERFCOUNTER3_SELECT1 = 0x3d92 +regPA_PH_PERFCOUNTER3_SELECT1_BASE_IDX = 1 +regUTCL1_PERFCOUNTER0_SELECT = 0x3da0 +regUTCL1_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regUTCL1_PERFCOUNTER1_SELECT = 0x3da1 +regUTCL1_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regUTCL1_PERFCOUNTER2_SELECT = 0x3da2 +regUTCL1_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regUTCL1_PERFCOUNTER3_SELECT = 0x3da3 +regUTCL1_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGL1A_PERFCOUNTER0_SELECT = 0x3dc0 +regGL1A_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGL1A_PERFCOUNTER0_SELECT1 = 0x3dc1 +regGL1A_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGL1A_PERFCOUNTER1_SELECT = 0x3dc2 +regGL1A_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGL1A_PERFCOUNTER2_SELECT = 0x3dc3 +regGL1A_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGL1A_PERFCOUNTER3_SELECT = 0x3dc4 +regGL1A_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGL1H_PERFCOUNTER0_SELECT = 0x3dd0 +regGL1H_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regGL1H_PERFCOUNTER0_SELECT1 = 0x3dd1 +regGL1H_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regGL1H_PERFCOUNTER1_SELECT = 0x3dd2 +regGL1H_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regGL1H_PERFCOUNTER2_SELECT = 0x3dd3 +regGL1H_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGL1H_PERFCOUNTER3_SELECT = 0x3dd4 +regGL1H_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regCHA_PERFCOUNTER0_SELECT = 0x3de0 +regCHA_PERFCOUNTER0_SELECT_BASE_IDX = 1 +regCHA_PERFCOUNTER0_SELECT1 = 0x3de1 +regCHA_PERFCOUNTER0_SELECT1_BASE_IDX = 1 +regCHA_PERFCOUNTER1_SELECT = 0x3de2 +regCHA_PERFCOUNTER1_SELECT_BASE_IDX = 1 +regCHA_PERFCOUNTER2_SELECT = 0x3de3 +regCHA_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regCHA_PERFCOUNTER3_SELECT = 0x3de4 +regCHA_PERFCOUNTER3_SELECT_BASE_IDX = 1 +regGUS_PERFCOUNTER2_SELECT = 0x3e00 +regGUS_PERFCOUNTER2_SELECT_BASE_IDX = 1 +regGUS_PERFCOUNTER2_SELECT1 = 0x3e01 +regGUS_PERFCOUNTER2_SELECT1_BASE_IDX = 1 +regGUS_PERFCOUNTER2_MODE = 0x3e02 +regGUS_PERFCOUNTER2_MODE_BASE_IDX = 1 +regGUS_PERFCOUNTER0_CFG = 0x3e03 +regGUS_PERFCOUNTER0_CFG_BASE_IDX = 1 +regGUS_PERFCOUNTER1_CFG = 0x3e04 +regGUS_PERFCOUNTER1_CFG_BASE_IDX = 1 +regGUS_PERFCOUNTER_RSLT_CNTL = 0x3e05 +regGUS_PERFCOUNTER_RSLT_CNTL_BASE_IDX = 1 +regGRTAVFS_RTAVFS_REG_ADDR = 0x4b00 +regGRTAVFS_RTAVFS_REG_ADDR_BASE_IDX = 1 +regGRTAVFS_RTAVFS_WR_DATA = 0x4b01 +regGRTAVFS_RTAVFS_WR_DATA_BASE_IDX = 1 +regGRTAVFS_GENERAL_0 = 0x4b02 +regGRTAVFS_GENERAL_0_BASE_IDX = 1 +regGRTAVFS_RTAVFS_RD_DATA = 0x4b03 +regGRTAVFS_RTAVFS_RD_DATA_BASE_IDX = 1 +regGRTAVFS_RTAVFS_REG_CTRL = 0x4b04 +regGRTAVFS_RTAVFS_REG_CTRL_BASE_IDX = 1 +regGRTAVFS_RTAVFS_REG_STATUS = 0x4b05 +regGRTAVFS_RTAVFS_REG_STATUS_BASE_IDX = 1 +regGRTAVFS_TARG_FREQ = 0x4b06 +regGRTAVFS_TARG_FREQ_BASE_IDX = 1 +regGRTAVFS_TARG_VOLT = 0x4b07 +regGRTAVFS_TARG_VOLT_BASE_IDX = 1 +regGRTAVFS_SOFT_RESET = 0x4b0c +regGRTAVFS_SOFT_RESET_BASE_IDX = 1 +regGRTAVFS_PSM_CNTL = 0x4b0d +regGRTAVFS_PSM_CNTL_BASE_IDX = 1 +regGRTAVFS_CLK_CNTL = 0x4b0e +regGRTAVFS_CLK_CNTL_BASE_IDX = 1 +regGRTAVFS_SE_RTAVFS_REG_ADDR = 0x4b40 +regGRTAVFS_SE_RTAVFS_REG_ADDR_BASE_IDX = 1 +regGRTAVFS_SE_RTAVFS_WR_DATA = 0x4b41 +regGRTAVFS_SE_RTAVFS_WR_DATA_BASE_IDX = 1 +regGRTAVFS_SE_GENERAL_0 = 0x4b42 +regGRTAVFS_SE_GENERAL_0_BASE_IDX = 1 +regGRTAVFS_SE_RTAVFS_RD_DATA = 0x4b43 +regGRTAVFS_SE_RTAVFS_RD_DATA_BASE_IDX = 1 +regGRTAVFS_SE_RTAVFS_REG_CTRL = 0x4b44 +regGRTAVFS_SE_RTAVFS_REG_CTRL_BASE_IDX = 1 +regGRTAVFS_SE_RTAVFS_REG_STATUS = 0x4b45 +regGRTAVFS_SE_RTAVFS_REG_STATUS_BASE_IDX = 1 +regGRTAVFS_SE_TARG_FREQ = 0x4b46 +regGRTAVFS_SE_TARG_FREQ_BASE_IDX = 1 +regGRTAVFS_SE_TARG_VOLT = 0x4b47 +regGRTAVFS_SE_TARG_VOLT_BASE_IDX = 1 +regGRTAVFS_SE_SOFT_RESET = 0x4b4c +regGRTAVFS_SE_SOFT_RESET_BASE_IDX = 1 +regGRTAVFS_SE_PSM_CNTL = 0x4b4d +regGRTAVFS_SE_PSM_CNTL_BASE_IDX = 1 +regGRTAVFS_SE_CLK_CNTL = 0x4b4e +regGRTAVFS_SE_CLK_CNTL_BASE_IDX = 1 +regRTAVFS_RTAVFS_REG_ADDR = 0x4b00 +regRTAVFS_RTAVFS_REG_ADDR_BASE_IDX = 1 +regRTAVFS_RTAVFS_WR_DATA = 0x4b01 +regRTAVFS_RTAVFS_WR_DATA_BASE_IDX = 1 +regCP_HYP_PFP_UCODE_ADDR = 0x5814 +regCP_HYP_PFP_UCODE_ADDR_BASE_IDX = 1 +regCP_PFP_UCODE_ADDR = 0x5814 +regCP_PFP_UCODE_ADDR_BASE_IDX = 1 +regCP_HYP_PFP_UCODE_DATA = 0x5815 +regCP_HYP_PFP_UCODE_DATA_BASE_IDX = 1 +regCP_PFP_UCODE_DATA = 0x5815 +regCP_PFP_UCODE_DATA_BASE_IDX = 1 +regCP_HYP_ME_UCODE_ADDR = 0x5816 +regCP_HYP_ME_UCODE_ADDR_BASE_IDX = 1 +regCP_ME_RAM_RADDR = 0x5816 +regCP_ME_RAM_RADDR_BASE_IDX = 1 +regCP_ME_RAM_WADDR = 0x5816 +regCP_ME_RAM_WADDR_BASE_IDX = 1 +regCP_HYP_ME_UCODE_DATA = 0x5817 +regCP_HYP_ME_UCODE_DATA_BASE_IDX = 1 +regCP_ME_RAM_DATA = 0x5817 +regCP_ME_RAM_DATA_BASE_IDX = 1 +regCP_HYP_MEC1_UCODE_ADDR = 0x581a +regCP_HYP_MEC1_UCODE_ADDR_BASE_IDX = 1 +regCP_MEC_ME1_UCODE_ADDR = 0x581a +regCP_MEC_ME1_UCODE_ADDR_BASE_IDX = 1 +regCP_HYP_MEC1_UCODE_DATA = 0x581b +regCP_HYP_MEC1_UCODE_DATA_BASE_IDX = 1 +regCP_MEC_ME1_UCODE_DATA = 0x581b +regCP_MEC_ME1_UCODE_DATA_BASE_IDX = 1 +regCP_HYP_MEC2_UCODE_ADDR = 0x581c +regCP_HYP_MEC2_UCODE_ADDR_BASE_IDX = 1 +regCP_MEC_ME2_UCODE_ADDR = 0x581c +regCP_MEC_ME2_UCODE_ADDR_BASE_IDX = 1 +regCP_HYP_MEC2_UCODE_DATA = 0x581d +regCP_HYP_MEC2_UCODE_DATA_BASE_IDX = 1 +regCP_MEC_ME2_UCODE_DATA = 0x581d +regCP_MEC_ME2_UCODE_DATA_BASE_IDX = 1 +regCP_PFP_IC_BASE_LO = 0x5840 +regCP_PFP_IC_BASE_LO_BASE_IDX = 1 +regCP_PFP_IC_BASE_HI = 0x5841 +regCP_PFP_IC_BASE_HI_BASE_IDX = 1 +regCP_PFP_IC_BASE_CNTL = 0x5842 +regCP_PFP_IC_BASE_CNTL_BASE_IDX = 1 +regCP_PFP_IC_OP_CNTL = 0x5843 +regCP_PFP_IC_OP_CNTL_BASE_IDX = 1 +regCP_ME_IC_BASE_LO = 0x5844 +regCP_ME_IC_BASE_LO_BASE_IDX = 1 +regCP_ME_IC_BASE_HI = 0x5845 +regCP_ME_IC_BASE_HI_BASE_IDX = 1 +regCP_ME_IC_BASE_CNTL = 0x5846 +regCP_ME_IC_BASE_CNTL_BASE_IDX = 1 +regCP_ME_IC_OP_CNTL = 0x5847 +regCP_ME_IC_OP_CNTL_BASE_IDX = 1 +regCP_CPC_IC_BASE_LO = 0x584c +regCP_CPC_IC_BASE_LO_BASE_IDX = 1 +regCP_CPC_IC_BASE_HI = 0x584d +regCP_CPC_IC_BASE_HI_BASE_IDX = 1 +regCP_CPC_IC_BASE_CNTL = 0x584e +regCP_CPC_IC_BASE_CNTL_BASE_IDX = 1 +regCP_MES_IC_BASE_LO = 0x5850 +regCP_MES_IC_BASE_LO_BASE_IDX = 1 +regCP_MES_MIBASE_LO = 0x5850 +regCP_MES_MIBASE_LO_BASE_IDX = 1 +regCP_MES_IC_BASE_HI = 0x5851 +regCP_MES_IC_BASE_HI_BASE_IDX = 1 +regCP_MES_MIBASE_HI = 0x5851 +regCP_MES_MIBASE_HI_BASE_IDX = 1 +regCP_MES_IC_BASE_CNTL = 0x5852 +regCP_MES_IC_BASE_CNTL_BASE_IDX = 1 +regCP_MES_DC_BASE_LO = 0x5854 +regCP_MES_DC_BASE_LO_BASE_IDX = 1 +regCP_MES_MDBASE_LO = 0x5854 +regCP_MES_MDBASE_LO_BASE_IDX = 1 +regCP_MES_DC_BASE_HI = 0x5855 +regCP_MES_DC_BASE_HI_BASE_IDX = 1 +regCP_MES_MDBASE_HI = 0x5855 +regCP_MES_MDBASE_HI_BASE_IDX = 1 +regCP_MES_MIBOUND_LO = 0x585b +regCP_MES_MIBOUND_LO_BASE_IDX = 1 +regCP_MES_MIBOUND_HI = 0x585c +regCP_MES_MIBOUND_HI_BASE_IDX = 1 +regCP_MES_MDBOUND_LO = 0x585d +regCP_MES_MDBOUND_LO_BASE_IDX = 1 +regCP_MES_MDBOUND_HI = 0x585e +regCP_MES_MDBOUND_HI_BASE_IDX = 1 +regCP_GFX_RS64_DC_BASE0_LO = 0x5863 +regCP_GFX_RS64_DC_BASE0_LO_BASE_IDX = 1 +regCP_GFX_RS64_DC_BASE1_LO = 0x5864 +regCP_GFX_RS64_DC_BASE1_LO_BASE_IDX = 1 +regCP_GFX_RS64_DC_BASE0_HI = 0x5865 +regCP_GFX_RS64_DC_BASE0_HI_BASE_IDX = 1 +regCP_GFX_RS64_DC_BASE1_HI = 0x5866 +regCP_GFX_RS64_DC_BASE1_HI_BASE_IDX = 1 +regCP_GFX_RS64_MIBOUND_LO = 0x586c +regCP_GFX_RS64_MIBOUND_LO_BASE_IDX = 1 +regCP_GFX_RS64_MIBOUND_HI = 0x586d +regCP_GFX_RS64_MIBOUND_HI_BASE_IDX = 1 +regCP_MEC_DC_BASE_LO = 0x5870 +regCP_MEC_DC_BASE_LO_BASE_IDX = 1 +regCP_MEC_MDBASE_LO = 0x5870 +regCP_MEC_MDBASE_LO_BASE_IDX = 1 +regCP_MEC_DC_BASE_HI = 0x5871 +regCP_MEC_DC_BASE_HI_BASE_IDX = 1 +regCP_MEC_MDBASE_HI = 0x5871 +regCP_MEC_MDBASE_HI_BASE_IDX = 1 +regCP_MEC_MIBOUND_LO = 0x5872 +regCP_MEC_MIBOUND_LO_BASE_IDX = 1 +regCP_MEC_MIBOUND_HI = 0x5873 +regCP_MEC_MIBOUND_HI_BASE_IDX = 1 +regCP_MEC_MDBOUND_LO = 0x5874 +regCP_MEC_MDBOUND_LO_BASE_IDX = 1 +regCP_MEC_MDBOUND_HI = 0x5875 +regCP_MEC_MDBOUND_HI_BASE_IDX = 1 +regRLC_CNTL = 0x4c00 +regRLC_CNTL_BASE_IDX = 1 +regRLC_F32_UCODE_VERSION = 0x4c03 +regRLC_F32_UCODE_VERSION_BASE_IDX = 1 +regRLC_STAT = 0x4c04 +regRLC_STAT_BASE_IDX = 1 +regRLC_REFCLOCK_TIMESTAMP_LSB = 0x4c0c +regRLC_REFCLOCK_TIMESTAMP_LSB_BASE_IDX = 1 +regRLC_REFCLOCK_TIMESTAMP_MSB = 0x4c0d +regRLC_REFCLOCK_TIMESTAMP_MSB_BASE_IDX = 1 +regRLC_GPM_TIMER_INT_0 = 0x4c0e +regRLC_GPM_TIMER_INT_0_BASE_IDX = 1 +regRLC_GPM_TIMER_INT_1 = 0x4c0f +regRLC_GPM_TIMER_INT_1_BASE_IDX = 1 +regRLC_GPM_TIMER_INT_2 = 0x4c10 +regRLC_GPM_TIMER_INT_2_BASE_IDX = 1 +regRLC_GPM_TIMER_INT_3 = 0x4c11 +regRLC_GPM_TIMER_INT_3_BASE_IDX = 1 +regRLC_GPM_TIMER_INT_4 = 0x4c12 +regRLC_GPM_TIMER_INT_4_BASE_IDX = 1 +regRLC_GPM_TIMER_CTRL = 0x4c13 +regRLC_GPM_TIMER_CTRL_BASE_IDX = 1 +regRLC_GPM_TIMER_STAT = 0x4c14 +regRLC_GPM_TIMER_STAT_BASE_IDX = 1 +regRLC_GPM_LEGACY_INT_STAT = 0x4c16 +regRLC_GPM_LEGACY_INT_STAT_BASE_IDX = 1 +regRLC_GPM_LEGACY_INT_CLEAR = 0x4c17 +regRLC_GPM_LEGACY_INT_CLEAR_BASE_IDX = 1 +regRLC_INT_STAT = 0x4c18 +regRLC_INT_STAT_BASE_IDX = 1 +regRLC_MGCG_CTRL = 0x4c1a +regRLC_MGCG_CTRL_BASE_IDX = 1 +regRLC_JUMP_TABLE_RESTORE = 0x4c1e +regRLC_JUMP_TABLE_RESTORE_BASE_IDX = 1 +regRLC_PG_DELAY_2 = 0x4c1f +regRLC_PG_DELAY_2_BASE_IDX = 1 +regRLC_GPU_CLOCK_COUNT_LSB = 0x4c24 +regRLC_GPU_CLOCK_COUNT_LSB_BASE_IDX = 1 +regRLC_GPU_CLOCK_COUNT_MSB = 0x4c25 +regRLC_GPU_CLOCK_COUNT_MSB_BASE_IDX = 1 +regRLC_CAPTURE_GPU_CLOCK_COUNT = 0x4c26 +regRLC_CAPTURE_GPU_CLOCK_COUNT_BASE_IDX = 1 +regRLC_UCODE_CNTL = 0x4c27 +regRLC_UCODE_CNTL_BASE_IDX = 1 +regRLC_GPM_THREAD_RESET = 0x4c28 +regRLC_GPM_THREAD_RESET_BASE_IDX = 1 +regRLC_GPM_CP_DMA_COMPLETE_T0 = 0x4c29 +regRLC_GPM_CP_DMA_COMPLETE_T0_BASE_IDX = 1 +regRLC_GPM_CP_DMA_COMPLETE_T1 = 0x4c2a +regRLC_GPM_CP_DMA_COMPLETE_T1_BASE_IDX = 1 +regRLC_GPM_THREAD_INVALIDATE_CACHE = 0x4c2b +regRLC_GPM_THREAD_INVALIDATE_CACHE_BASE_IDX = 1 +regRLC_CLK_COUNT_GFXCLK_LSB = 0x4c30 +regRLC_CLK_COUNT_GFXCLK_LSB_BASE_IDX = 1 +regRLC_CLK_COUNT_GFXCLK_MSB = 0x4c31 +regRLC_CLK_COUNT_GFXCLK_MSB_BASE_IDX = 1 +regRLC_CLK_COUNT_REFCLK_LSB = 0x4c32 +regRLC_CLK_COUNT_REFCLK_LSB_BASE_IDX = 1 +regRLC_CLK_COUNT_REFCLK_MSB = 0x4c33 +regRLC_CLK_COUNT_REFCLK_MSB_BASE_IDX = 1 +regRLC_CLK_COUNT_CTRL = 0x4c34 +regRLC_CLK_COUNT_CTRL_BASE_IDX = 1 +regRLC_CLK_COUNT_STAT = 0x4c35 +regRLC_CLK_COUNT_STAT_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_CNTL = 0x4c36 +regRLC_RLCG_DOORBELL_CNTL_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_STAT = 0x4c37 +regRLC_RLCG_DOORBELL_STAT_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_0_DATA_LO = 0x4c38 +regRLC_RLCG_DOORBELL_0_DATA_LO_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_0_DATA_HI = 0x4c39 +regRLC_RLCG_DOORBELL_0_DATA_HI_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_1_DATA_LO = 0x4c3a +regRLC_RLCG_DOORBELL_1_DATA_LO_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_1_DATA_HI = 0x4c3b +regRLC_RLCG_DOORBELL_1_DATA_HI_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_2_DATA_LO = 0x4c3c +regRLC_RLCG_DOORBELL_2_DATA_LO_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_2_DATA_HI = 0x4c3d +regRLC_RLCG_DOORBELL_2_DATA_HI_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_3_DATA_LO = 0x4c3e +regRLC_RLCG_DOORBELL_3_DATA_LO_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_3_DATA_HI = 0x4c3f +regRLC_RLCG_DOORBELL_3_DATA_HI_BASE_IDX = 1 +regRLC_GPU_CLOCK_32_RES_SEL = 0x4c41 +regRLC_GPU_CLOCK_32_RES_SEL_BASE_IDX = 1 +regRLC_GPU_CLOCK_32 = 0x4c42 +regRLC_GPU_CLOCK_32_BASE_IDX = 1 +regRLC_PG_CNTL = 0x4c43 +regRLC_PG_CNTL_BASE_IDX = 1 +regRLC_GPM_THREAD_PRIORITY = 0x4c44 +regRLC_GPM_THREAD_PRIORITY_BASE_IDX = 1 +regRLC_GPM_THREAD_ENABLE = 0x4c45 +regRLC_GPM_THREAD_ENABLE_BASE_IDX = 1 +regRLC_RLCG_DOORBELL_RANGE = 0x4c47 +regRLC_RLCG_DOORBELL_RANGE_BASE_IDX = 1 +regRLC_CGTT_MGCG_OVERRIDE = 0x4c48 +regRLC_CGTT_MGCG_OVERRIDE_BASE_IDX = 1 +regRLC_CGCG_CGLS_CTRL = 0x4c49 +regRLC_CGCG_CGLS_CTRL_BASE_IDX = 1 +regRLC_CGCG_RAMP_CTRL = 0x4c4a +regRLC_CGCG_RAMP_CTRL_BASE_IDX = 1 +regRLC_DYN_PG_STATUS = 0x4c4b +regRLC_DYN_PG_STATUS_BASE_IDX = 1 +regRLC_DYN_PG_REQUEST = 0x4c4c +regRLC_DYN_PG_REQUEST_BASE_IDX = 1 +regRLC_PG_DELAY = 0x4c4d +regRLC_PG_DELAY_BASE_IDX = 1 +regRLC_WGP_STATUS = 0x4c4e +regRLC_WGP_STATUS_BASE_IDX = 1 +regRLC_PG_ALWAYS_ON_WGP_MASK = 0x4c53 +regRLC_PG_ALWAYS_ON_WGP_MASK_BASE_IDX = 1 +regRLC_MAX_PG_WGP = 0x4c54 +regRLC_MAX_PG_WGP_BASE_IDX = 1 +regRLC_AUTO_PG_CTRL = 0x4c55 +regRLC_AUTO_PG_CTRL_BASE_IDX = 1 +regRLC_SERDES_RD_INDEX = 0x4c59 +regRLC_SERDES_RD_INDEX_BASE_IDX = 1 +regRLC_SERDES_RD_DATA_0 = 0x4c5a +regRLC_SERDES_RD_DATA_0_BASE_IDX = 1 +regRLC_SERDES_RD_DATA_1 = 0x4c5b +regRLC_SERDES_RD_DATA_1_BASE_IDX = 1 +regRLC_SERDES_RD_DATA_2 = 0x4c5c +regRLC_SERDES_RD_DATA_2_BASE_IDX = 1 +regRLC_SERDES_RD_DATA_3 = 0x4c5d +regRLC_SERDES_RD_DATA_3_BASE_IDX = 1 +regRLC_SERDES_MASK = 0x4c5e +regRLC_SERDES_MASK_BASE_IDX = 1 +regRLC_SERDES_CTRL = 0x4c5f +regRLC_SERDES_CTRL_BASE_IDX = 1 +regRLC_SERDES_DATA = 0x4c60 +regRLC_SERDES_DATA_BASE_IDX = 1 +regRLC_SERDES_BUSY = 0x4c61 +regRLC_SERDES_BUSY_BASE_IDX = 1 +regRLC_GPM_GENERAL_0 = 0x4c63 +regRLC_GPM_GENERAL_0_BASE_IDX = 1 +regRLC_GPM_GENERAL_1 = 0x4c64 +regRLC_GPM_GENERAL_1_BASE_IDX = 1 +regRLC_GPM_GENERAL_2 = 0x4c65 +regRLC_GPM_GENERAL_2_BASE_IDX = 1 +regRLC_GPM_GENERAL_3 = 0x4c66 +regRLC_GPM_GENERAL_3_BASE_IDX = 1 +regRLC_GPM_GENERAL_4 = 0x4c67 +regRLC_GPM_GENERAL_4_BASE_IDX = 1 +regRLC_GPM_GENERAL_5 = 0x4c68 +regRLC_GPM_GENERAL_5_BASE_IDX = 1 +regRLC_GPM_GENERAL_6 = 0x4c69 +regRLC_GPM_GENERAL_6_BASE_IDX = 1 +regRLC_GPM_GENERAL_7 = 0x4c6a +regRLC_GPM_GENERAL_7_BASE_IDX = 1 +regRLC_STATIC_PG_STATUS = 0x4c6e +regRLC_STATIC_PG_STATUS_BASE_IDX = 1 +regRLC_GPM_GENERAL_16 = 0x4c76 +regRLC_GPM_GENERAL_16_BASE_IDX = 1 +regRLC_PG_DELAY_3 = 0x4c78 +regRLC_PG_DELAY_3_BASE_IDX = 1 +regRLC_GPR_REG1 = 0x4c79 +regRLC_GPR_REG1_BASE_IDX = 1 +regRLC_GPR_REG2 = 0x4c7a +regRLC_GPR_REG2_BASE_IDX = 1 +regRLC_GPM_INT_DISABLE_TH0 = 0x4c7c +regRLC_GPM_INT_DISABLE_TH0_BASE_IDX = 1 +regRLC_GPM_LEGACY_INT_DISABLE = 0x4c7d +regRLC_GPM_LEGACY_INT_DISABLE_BASE_IDX = 1 +regRLC_GPM_INT_FORCE_TH0 = 0x4c7e +regRLC_GPM_INT_FORCE_TH0_BASE_IDX = 1 +regRLC_SRM_CNTL = 0x4c80 +regRLC_SRM_CNTL_BASE_IDX = 1 +regRLC_SRM_GPM_COMMAND_STATUS = 0x4c88 +regRLC_SRM_GPM_COMMAND_STATUS_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_ADDR_0 = 0x4c8b +regRLC_SRM_INDEX_CNTL_ADDR_0_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_ADDR_1 = 0x4c8c +regRLC_SRM_INDEX_CNTL_ADDR_1_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_ADDR_2 = 0x4c8d +regRLC_SRM_INDEX_CNTL_ADDR_2_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_ADDR_3 = 0x4c8e +regRLC_SRM_INDEX_CNTL_ADDR_3_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_ADDR_4 = 0x4c8f +regRLC_SRM_INDEX_CNTL_ADDR_4_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_ADDR_5 = 0x4c90 +regRLC_SRM_INDEX_CNTL_ADDR_5_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_ADDR_6 = 0x4c91 +regRLC_SRM_INDEX_CNTL_ADDR_6_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_ADDR_7 = 0x4c92 +regRLC_SRM_INDEX_CNTL_ADDR_7_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_DATA_0 = 0x4c93 +regRLC_SRM_INDEX_CNTL_DATA_0_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_DATA_1 = 0x4c94 +regRLC_SRM_INDEX_CNTL_DATA_1_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_DATA_2 = 0x4c95 +regRLC_SRM_INDEX_CNTL_DATA_2_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_DATA_3 = 0x4c96 +regRLC_SRM_INDEX_CNTL_DATA_3_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_DATA_4 = 0x4c97 +regRLC_SRM_INDEX_CNTL_DATA_4_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_DATA_5 = 0x4c98 +regRLC_SRM_INDEX_CNTL_DATA_5_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_DATA_6 = 0x4c99 +regRLC_SRM_INDEX_CNTL_DATA_6_BASE_IDX = 1 +regRLC_SRM_INDEX_CNTL_DATA_7 = 0x4c9a +regRLC_SRM_INDEX_CNTL_DATA_7_BASE_IDX = 1 +regRLC_SRM_STAT = 0x4c9b +regRLC_SRM_STAT_BASE_IDX = 1 +regRLC_GPM_GENERAL_8 = 0x4cad +regRLC_GPM_GENERAL_8_BASE_IDX = 1 +regRLC_GPM_GENERAL_9 = 0x4cae +regRLC_GPM_GENERAL_9_BASE_IDX = 1 +regRLC_GPM_GENERAL_10 = 0x4caf +regRLC_GPM_GENERAL_10_BASE_IDX = 1 +regRLC_GPM_GENERAL_11 = 0x4cb0 +regRLC_GPM_GENERAL_11_BASE_IDX = 1 +regRLC_GPM_GENERAL_12 = 0x4cb1 +regRLC_GPM_GENERAL_12_BASE_IDX = 1 +regRLC_GPM_UTCL1_CNTL_0 = 0x4cb2 +regRLC_GPM_UTCL1_CNTL_0_BASE_IDX = 1 +regRLC_GPM_UTCL1_CNTL_1 = 0x4cb3 +regRLC_GPM_UTCL1_CNTL_1_BASE_IDX = 1 +regRLC_GPM_UTCL1_CNTL_2 = 0x4cb4 +regRLC_GPM_UTCL1_CNTL_2_BASE_IDX = 1 +regRLC_SPM_UTCL1_CNTL = 0x4cb5 +regRLC_SPM_UTCL1_CNTL_BASE_IDX = 1 +regRLC_UTCL1_STATUS_2 = 0x4cb6 +regRLC_UTCL1_STATUS_2_BASE_IDX = 1 +regRLC_SPM_UTCL1_ERROR_1 = 0x4cbc +regRLC_SPM_UTCL1_ERROR_1_BASE_IDX = 1 +regRLC_SPM_UTCL1_ERROR_2 = 0x4cbd +regRLC_SPM_UTCL1_ERROR_2_BASE_IDX = 1 +regRLC_GPM_UTCL1_TH0_ERROR_1 = 0x4cbe +regRLC_GPM_UTCL1_TH0_ERROR_1_BASE_IDX = 1 +regRLC_GPM_UTCL1_TH0_ERROR_2 = 0x4cc0 +regRLC_GPM_UTCL1_TH0_ERROR_2_BASE_IDX = 1 +regRLC_GPM_UTCL1_TH1_ERROR_1 = 0x4cc1 +regRLC_GPM_UTCL1_TH1_ERROR_1_BASE_IDX = 1 +regRLC_GPM_UTCL1_TH1_ERROR_2 = 0x4cc2 +regRLC_GPM_UTCL1_TH1_ERROR_2_BASE_IDX = 1 +regRLC_GPM_UTCL1_TH2_ERROR_1 = 0x4cc3 +regRLC_GPM_UTCL1_TH2_ERROR_1_BASE_IDX = 1 +regRLC_GPM_UTCL1_TH2_ERROR_2 = 0x4cc4 +regRLC_GPM_UTCL1_TH2_ERROR_2_BASE_IDX = 1 +regRLC_CGCG_CGLS_CTRL_3D = 0x4cc5 +regRLC_CGCG_CGLS_CTRL_3D_BASE_IDX = 1 +regRLC_CGCG_RAMP_CTRL_3D = 0x4cc6 +regRLC_CGCG_RAMP_CTRL_3D_BASE_IDX = 1 +regRLC_SEMAPHORE_0 = 0x4cc7 +regRLC_SEMAPHORE_0_BASE_IDX = 1 +regRLC_SEMAPHORE_1 = 0x4cc8 +regRLC_SEMAPHORE_1_BASE_IDX = 1 +regRLC_SEMAPHORE_2 = 0x4cc9 +regRLC_SEMAPHORE_2_BASE_IDX = 1 +regRLC_SEMAPHORE_3 = 0x4cca +regRLC_SEMAPHORE_3_BASE_IDX = 1 +regRLC_PACE_INT_STAT = 0x4ccc +regRLC_PACE_INT_STAT_BASE_IDX = 1 +regRLC_UTCL1_STATUS = 0x4cd4 +regRLC_UTCL1_STATUS_BASE_IDX = 1 +regRLC_R2I_CNTL_0 = 0x4cd5 +regRLC_R2I_CNTL_0_BASE_IDX = 1 +regRLC_R2I_CNTL_1 = 0x4cd6 +regRLC_R2I_CNTL_1_BASE_IDX = 1 +regRLC_R2I_CNTL_2 = 0x4cd7 +regRLC_R2I_CNTL_2_BASE_IDX = 1 +regRLC_R2I_CNTL_3 = 0x4cd8 +regRLC_R2I_CNTL_3_BASE_IDX = 1 +regRLC_GPM_INT_STAT_TH0 = 0x4cdc +regRLC_GPM_INT_STAT_TH0_BASE_IDX = 1 +regRLC_GPM_GENERAL_13 = 0x4cdd +regRLC_GPM_GENERAL_13_BASE_IDX = 1 +regRLC_GPM_GENERAL_14 = 0x4cde +regRLC_GPM_GENERAL_14_BASE_IDX = 1 +regRLC_GPM_GENERAL_15 = 0x4cdf +regRLC_GPM_GENERAL_15_BASE_IDX = 1 +regRLC_CAPTURE_GPU_CLOCK_COUNT_1 = 0x4cea +regRLC_CAPTURE_GPU_CLOCK_COUNT_1_BASE_IDX = 1 +regRLC_GPU_CLOCK_COUNT_LSB_2 = 0x4ceb +regRLC_GPU_CLOCK_COUNT_LSB_2_BASE_IDX = 1 +regRLC_GPU_CLOCK_COUNT_MSB_2 = 0x4cec +regRLC_GPU_CLOCK_COUNT_MSB_2_BASE_IDX = 1 +regRLC_PACE_INT_DISABLE = 0x4ced +regRLC_PACE_INT_DISABLE_BASE_IDX = 1 +regRLC_CAPTURE_GPU_CLOCK_COUNT_2 = 0x4cef +regRLC_CAPTURE_GPU_CLOCK_COUNT_2_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_RANGE = 0x4cf0 +regRLC_RLCV_DOORBELL_RANGE_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_CNTL = 0x4cf1 +regRLC_RLCV_DOORBELL_CNTL_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_STAT = 0x4cf2 +regRLC_RLCV_DOORBELL_STAT_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_0_DATA_LO = 0x4cf3 +regRLC_RLCV_DOORBELL_0_DATA_LO_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_0_DATA_HI = 0x4cf4 +regRLC_RLCV_DOORBELL_0_DATA_HI_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_1_DATA_LO = 0x4cf5 +regRLC_RLCV_DOORBELL_1_DATA_LO_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_1_DATA_HI = 0x4cf6 +regRLC_RLCV_DOORBELL_1_DATA_HI_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_2_DATA_LO = 0x4cf7 +regRLC_RLCV_DOORBELL_2_DATA_LO_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_2_DATA_HI = 0x4cf8 +regRLC_RLCV_DOORBELL_2_DATA_HI_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_3_DATA_LO = 0x4cf9 +regRLC_RLCV_DOORBELL_3_DATA_LO_BASE_IDX = 1 +regRLC_RLCV_DOORBELL_3_DATA_HI = 0x4cfa +regRLC_RLCV_DOORBELL_3_DATA_HI_BASE_IDX = 1 +regRLC_GPU_CLOCK_COUNT_LSB_1 = 0x4cfb +regRLC_GPU_CLOCK_COUNT_LSB_1_BASE_IDX = 1 +regRLC_GPU_CLOCK_COUNT_MSB_1 = 0x4cfc +regRLC_GPU_CLOCK_COUNT_MSB_1_BASE_IDX = 1 +regRLC_RLCV_SPARE_INT = 0x4d00 +regRLC_RLCV_SPARE_INT_BASE_IDX = 1 +regRLC_PACE_TIMER_INT_0 = 0x4d04 +regRLC_PACE_TIMER_INT_0_BASE_IDX = 1 +regRLC_PACE_TIMER_INT_1 = 0x4d05 +regRLC_PACE_TIMER_INT_1_BASE_IDX = 1 +regRLC_PACE_TIMER_CTRL = 0x4d06 +regRLC_PACE_TIMER_CTRL_BASE_IDX = 1 +regRLC_SMU_CLK_REQ = 0x4d08 +regRLC_SMU_CLK_REQ_BASE_IDX = 1 +regRLC_CP_STAT_INVAL_STAT = 0x4d09 +regRLC_CP_STAT_INVAL_STAT_BASE_IDX = 1 +regRLC_CP_STAT_INVAL_CTRL = 0x4d0a +regRLC_CP_STAT_INVAL_CTRL_BASE_IDX = 1 +regRLC_SPARE = 0x4d0b +regRLC_SPARE_BASE_IDX = 1 +regRLC_SPP_CTRL = 0x4d0c +regRLC_SPP_CTRL_BASE_IDX = 1 +regRLC_SPP_SHADER_PROFILE_EN = 0x4d0d +regRLC_SPP_SHADER_PROFILE_EN_BASE_IDX = 1 +regRLC_SPP_SSF_CAPTURE_EN = 0x4d0e +regRLC_SPP_SSF_CAPTURE_EN_BASE_IDX = 1 +regRLC_SPP_SSF_THRESHOLD_0 = 0x4d0f +regRLC_SPP_SSF_THRESHOLD_0_BASE_IDX = 1 +regRLC_SPP_SSF_THRESHOLD_1 = 0x4d10 +regRLC_SPP_SSF_THRESHOLD_1_BASE_IDX = 1 +regRLC_SPP_SSF_THRESHOLD_2 = 0x4d11 +regRLC_SPP_SSF_THRESHOLD_2_BASE_IDX = 1 +regRLC_SPP_INFLIGHT_RD_ADDR = 0x4d12 +regRLC_SPP_INFLIGHT_RD_ADDR_BASE_IDX = 1 +regRLC_SPP_INFLIGHT_RD_DATA = 0x4d13 +regRLC_SPP_INFLIGHT_RD_DATA_BASE_IDX = 1 +regRLC_SPP_PROF_INFO_1 = 0x4d18 +regRLC_SPP_PROF_INFO_1_BASE_IDX = 1 +regRLC_SPP_PROF_INFO_2 = 0x4d19 +regRLC_SPP_PROF_INFO_2_BASE_IDX = 1 +regRLC_SPP_GLOBAL_SH_ID = 0x4d1a +regRLC_SPP_GLOBAL_SH_ID_BASE_IDX = 1 +regRLC_SPP_GLOBAL_SH_ID_VALID = 0x4d1b +regRLC_SPP_GLOBAL_SH_ID_VALID_BASE_IDX = 1 +regRLC_SPP_STATUS = 0x4d1c +regRLC_SPP_STATUS_BASE_IDX = 1 +regRLC_SPP_PVT_STAT_0 = 0x4d1d +regRLC_SPP_PVT_STAT_0_BASE_IDX = 1 +regRLC_SPP_PVT_STAT_1 = 0x4d1e +regRLC_SPP_PVT_STAT_1_BASE_IDX = 1 +regRLC_SPP_PVT_STAT_2 = 0x4d1f +regRLC_SPP_PVT_STAT_2_BASE_IDX = 1 +regRLC_SPP_PVT_STAT_3 = 0x4d20 +regRLC_SPP_PVT_STAT_3_BASE_IDX = 1 +regRLC_SPP_PVT_LEVEL_MAX = 0x4d21 +regRLC_SPP_PVT_LEVEL_MAX_BASE_IDX = 1 +regRLC_SPP_STALL_STATE_UPDATE = 0x4d22 +regRLC_SPP_STALL_STATE_UPDATE_BASE_IDX = 1 +regRLC_SPP_PBB_INFO = 0x4d23 +regRLC_SPP_PBB_INFO_BASE_IDX = 1 +regRLC_SPP_RESET = 0x4d24 +regRLC_SPP_RESET_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_RANGE = 0x4d26 +regRLC_RLCP_DOORBELL_RANGE_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_CNTL = 0x4d27 +regRLC_RLCP_DOORBELL_CNTL_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_STAT = 0x4d28 +regRLC_RLCP_DOORBELL_STAT_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_0_DATA_LO = 0x4d29 +regRLC_RLCP_DOORBELL_0_DATA_LO_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_0_DATA_HI = 0x4d2a +regRLC_RLCP_DOORBELL_0_DATA_HI_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_1_DATA_LO = 0x4d2b +regRLC_RLCP_DOORBELL_1_DATA_LO_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_1_DATA_HI = 0x4d2c +regRLC_RLCP_DOORBELL_1_DATA_HI_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_2_DATA_LO = 0x4d2d +regRLC_RLCP_DOORBELL_2_DATA_LO_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_2_DATA_HI = 0x4d2e +regRLC_RLCP_DOORBELL_2_DATA_HI_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_3_DATA_LO = 0x4d2f +regRLC_RLCP_DOORBELL_3_DATA_LO_BASE_IDX = 1 +regRLC_RLCP_DOORBELL_3_DATA_HI = 0x4d30 +regRLC_RLCP_DOORBELL_3_DATA_HI_BASE_IDX = 1 +regRLC_CAC_MASK_CNTL = 0x4d45 +regRLC_CAC_MASK_CNTL_BASE_IDX = 1 +regRLC_POWER_RESIDENCY_CNTR_CTRL = 0x4d48 +regRLC_POWER_RESIDENCY_CNTR_CTRL_BASE_IDX = 1 +regRLC_CLK_RESIDENCY_CNTR_CTRL = 0x4d49 +regRLC_CLK_RESIDENCY_CNTR_CTRL_BASE_IDX = 1 +regRLC_DS_RESIDENCY_CNTR_CTRL = 0x4d4a +regRLC_DS_RESIDENCY_CNTR_CTRL_BASE_IDX = 1 +regRLC_ULV_RESIDENCY_CNTR_CTRL = 0x4d4b +regRLC_ULV_RESIDENCY_CNTR_CTRL_BASE_IDX = 1 +regRLC_PCC_RESIDENCY_CNTR_CTRL = 0x4d4c +regRLC_PCC_RESIDENCY_CNTR_CTRL_BASE_IDX = 1 +regRLC_GENERAL_RESIDENCY_CNTR_CTRL = 0x4d4d +regRLC_GENERAL_RESIDENCY_CNTR_CTRL_BASE_IDX = 1 +regRLC_POWER_RESIDENCY_EVENT_CNTR = 0x4d50 +regRLC_POWER_RESIDENCY_EVENT_CNTR_BASE_IDX = 1 +regRLC_CLK_RESIDENCY_EVENT_CNTR = 0x4d51 +regRLC_CLK_RESIDENCY_EVENT_CNTR_BASE_IDX = 1 +regRLC_DS_RESIDENCY_EVENT_CNTR = 0x4d52 +regRLC_DS_RESIDENCY_EVENT_CNTR_BASE_IDX = 1 +regRLC_ULV_RESIDENCY_EVENT_CNTR = 0x4d53 +regRLC_ULV_RESIDENCY_EVENT_CNTR_BASE_IDX = 1 +regRLC_PCC_RESIDENCY_EVENT_CNTR = 0x4d54 +regRLC_PCC_RESIDENCY_EVENT_CNTR_BASE_IDX = 1 +regRLC_GENERAL_RESIDENCY_EVENT_CNTR = 0x4d55 +regRLC_GENERAL_RESIDENCY_EVENT_CNTR_BASE_IDX = 1 +regRLC_POWER_RESIDENCY_REF_CNTR = 0x4d58 +regRLC_POWER_RESIDENCY_REF_CNTR_BASE_IDX = 1 +regRLC_CLK_RESIDENCY_REF_CNTR = 0x4d59 +regRLC_CLK_RESIDENCY_REF_CNTR_BASE_IDX = 1 +regRLC_DS_RESIDENCY_REF_CNTR = 0x4d5a +regRLC_DS_RESIDENCY_REF_CNTR_BASE_IDX = 1 +regRLC_ULV_RESIDENCY_REF_CNTR = 0x4d5b +regRLC_ULV_RESIDENCY_REF_CNTR_BASE_IDX = 1 +regRLC_PCC_RESIDENCY_REF_CNTR = 0x4d5c +regRLC_PCC_RESIDENCY_REF_CNTR_BASE_IDX = 1 +regRLC_GENERAL_RESIDENCY_REF_CNTR = 0x4d5d +regRLC_GENERAL_RESIDENCY_REF_CNTR_BASE_IDX = 1 +regRLC_GFX_IH_CLIENT_CTRL = 0x4d5e +regRLC_GFX_IH_CLIENT_CTRL_BASE_IDX = 1 +regRLC_GFX_IH_ARBITER_STAT = 0x4d5f +regRLC_GFX_IH_ARBITER_STAT_BASE_IDX = 1 +regRLC_GFX_IH_CLIENT_SE_STAT_L = 0x4d60 +regRLC_GFX_IH_CLIENT_SE_STAT_L_BASE_IDX = 1 +regRLC_GFX_IH_CLIENT_SE_STAT_H = 0x4d61 +regRLC_GFX_IH_CLIENT_SE_STAT_H_BASE_IDX = 1 +regRLC_GFX_IH_CLIENT_SDMA_STAT = 0x4d62 +regRLC_GFX_IH_CLIENT_SDMA_STAT_BASE_IDX = 1 +regRLC_GFX_IH_CLIENT_OTHER_STAT = 0x4d63 +regRLC_GFX_IH_CLIENT_OTHER_STAT_BASE_IDX = 1 +regRLC_SPM_GLOBAL_DELAY_IND_ADDR = 0x4d64 +regRLC_SPM_GLOBAL_DELAY_IND_ADDR_BASE_IDX = 1 +regRLC_SPM_GLOBAL_DELAY_IND_DATA = 0x4d65 +regRLC_SPM_GLOBAL_DELAY_IND_DATA_BASE_IDX = 1 +regRLC_SPM_SE_DELAY_IND_ADDR = 0x4d66 +regRLC_SPM_SE_DELAY_IND_ADDR_BASE_IDX = 1 +regRLC_SPM_SE_DELAY_IND_DATA = 0x4d67 +regRLC_SPM_SE_DELAY_IND_DATA_BASE_IDX = 1 +regRLC_LX6_CNTL = 0x4d80 +regRLC_LX6_CNTL_BASE_IDX = 1 +regRLC_XT_CORE_STATUS = 0x4dd4 +regRLC_XT_CORE_STATUS_BASE_IDX = 1 +regRLC_XT_CORE_INTERRUPT = 0x4dd5 +regRLC_XT_CORE_INTERRUPT_BASE_IDX = 1 +regRLC_XT_CORE_FAULT_INFO = 0x4dd6 +regRLC_XT_CORE_FAULT_INFO_BASE_IDX = 1 +regRLC_XT_CORE_ALT_RESET_VEC = 0x4dd7 +regRLC_XT_CORE_ALT_RESET_VEC_BASE_IDX = 1 +regRLC_XT_CORE_RESERVED = 0x4dd8 +regRLC_XT_CORE_RESERVED_BASE_IDX = 1 +regRLC_XT_INT_VEC_FORCE = 0x4dd9 +regRLC_XT_INT_VEC_FORCE_BASE_IDX = 1 +regRLC_XT_INT_VEC_CLEAR = 0x4dda +regRLC_XT_INT_VEC_CLEAR_BASE_IDX = 1 +regRLC_XT_INT_VEC_MUX_SEL = 0x4ddb +regRLC_XT_INT_VEC_MUX_SEL_BASE_IDX = 1 +regRLC_XT_INT_VEC_MUX_INT_SEL = 0x4ddc +regRLC_XT_INT_VEC_MUX_INT_SEL_BASE_IDX = 1 +regRLC_GPU_CLOCK_COUNT_SPM_LSB = 0x4de4 +regRLC_GPU_CLOCK_COUNT_SPM_LSB_BASE_IDX = 1 +regRLC_GPU_CLOCK_COUNT_SPM_MSB = 0x4de5 +regRLC_GPU_CLOCK_COUNT_SPM_MSB_BASE_IDX = 1 +regRLC_SPM_THREAD_TRACE_CTRL = 0x4de6 +regRLC_SPM_THREAD_TRACE_CTRL_BASE_IDX = 1 +regRLC_SPP_CAM_ADDR = 0x4de8 +regRLC_SPP_CAM_ADDR_BASE_IDX = 1 +regRLC_SPP_CAM_DATA = 0x4de9 +regRLC_SPP_CAM_DATA_BASE_IDX = 1 +regRLC_SPP_CAM_EXT_ADDR = 0x4dea +regRLC_SPP_CAM_EXT_ADDR_BASE_IDX = 1 +regRLC_SPP_CAM_EXT_DATA = 0x4deb +regRLC_SPP_CAM_EXT_DATA_BASE_IDX = 1 +regRLC_XT_DOORBELL_RANGE = 0x4df5 +regRLC_XT_DOORBELL_RANGE_BASE_IDX = 1 +regRLC_XT_DOORBELL_CNTL = 0x4df6 +regRLC_XT_DOORBELL_CNTL_BASE_IDX = 1 +regRLC_XT_DOORBELL_STAT = 0x4df7 +regRLC_XT_DOORBELL_STAT_BASE_IDX = 1 +regRLC_XT_DOORBELL_0_DATA_LO = 0x4df8 +regRLC_XT_DOORBELL_0_DATA_LO_BASE_IDX = 1 +regRLC_XT_DOORBELL_0_DATA_HI = 0x4df9 +regRLC_XT_DOORBELL_0_DATA_HI_BASE_IDX = 1 +regRLC_XT_DOORBELL_1_DATA_LO = 0x4dfa +regRLC_XT_DOORBELL_1_DATA_LO_BASE_IDX = 1 +regRLC_XT_DOORBELL_1_DATA_HI = 0x4dfb +regRLC_XT_DOORBELL_1_DATA_HI_BASE_IDX = 1 +regRLC_XT_DOORBELL_2_DATA_LO = 0x4dfc +regRLC_XT_DOORBELL_2_DATA_LO_BASE_IDX = 1 +regRLC_XT_DOORBELL_2_DATA_HI = 0x4dfd +regRLC_XT_DOORBELL_2_DATA_HI_BASE_IDX = 1 +regRLC_XT_DOORBELL_3_DATA_LO = 0x4dfe +regRLC_XT_DOORBELL_3_DATA_LO_BASE_IDX = 1 +regRLC_XT_DOORBELL_3_DATA_HI = 0x4dff +regRLC_XT_DOORBELL_3_DATA_HI_BASE_IDX = 1 +regRLC_MEM_SLP_CNTL = 0x4e00 +regRLC_MEM_SLP_CNTL_BASE_IDX = 1 +regSMU_RLC_RESPONSE = 0x4e01 +regSMU_RLC_RESPONSE_BASE_IDX = 1 +regRLC_RLCV_SAFE_MODE = 0x4e02 +regRLC_RLCV_SAFE_MODE_BASE_IDX = 1 +regRLC_SMU_SAFE_MODE = 0x4e03 +regRLC_SMU_SAFE_MODE_BASE_IDX = 1 +regRLC_RLCV_COMMAND = 0x4e04 +regRLC_RLCV_COMMAND_BASE_IDX = 1 +regRLC_SMU_MESSAGE = 0x4e05 +regRLC_SMU_MESSAGE_BASE_IDX = 1 +regRLC_SMU_MESSAGE_1 = 0x4e06 +regRLC_SMU_MESSAGE_1_BASE_IDX = 1 +regRLC_SMU_MESSAGE_2 = 0x4e07 +regRLC_SMU_MESSAGE_2_BASE_IDX = 1 +regRLC_SRM_GPM_COMMAND = 0x4e08 +regRLC_SRM_GPM_COMMAND_BASE_IDX = 1 +regRLC_SRM_GPM_ABORT = 0x4e09 +regRLC_SRM_GPM_ABORT_BASE_IDX = 1 +regRLC_SMU_COMMAND = 0x4e0a +regRLC_SMU_COMMAND_BASE_IDX = 1 +regRLC_SMU_ARGUMENT_1 = 0x4e0b +regRLC_SMU_ARGUMENT_1_BASE_IDX = 1 +regRLC_SMU_ARGUMENT_2 = 0x4e0c +regRLC_SMU_ARGUMENT_2_BASE_IDX = 1 +regRLC_SMU_ARGUMENT_3 = 0x4e0d +regRLC_SMU_ARGUMENT_3_BASE_IDX = 1 +regRLC_SMU_ARGUMENT_4 = 0x4e0e +regRLC_SMU_ARGUMENT_4_BASE_IDX = 1 +regRLC_SMU_ARGUMENT_5 = 0x4e0f +regRLC_SMU_ARGUMENT_5_BASE_IDX = 1 +regRLC_IMU_BOOTLOAD_ADDR_HI = 0x4e10 +regRLC_IMU_BOOTLOAD_ADDR_HI_BASE_IDX = 1 +regRLC_IMU_BOOTLOAD_ADDR_LO = 0x4e11 +regRLC_IMU_BOOTLOAD_ADDR_LO_BASE_IDX = 1 +regRLC_IMU_BOOTLOAD_SIZE = 0x4e12 +regRLC_IMU_BOOTLOAD_SIZE_BASE_IDX = 1 +regRLC_IMU_MISC = 0x4e16 +regRLC_IMU_MISC_BASE_IDX = 1 +regRLC_IMU_RESET_VECTOR = 0x4e17 +regRLC_IMU_RESET_VECTOR_BASE_IDX = 1 +regRLC_RLCS_DEC_START = 0x4e60 +regRLC_RLCS_DEC_START_BASE_IDX = 1 +regRLC_RLCS_DEC_DUMP_ADDR = 0x4e61 +regRLC_RLCS_DEC_DUMP_ADDR_BASE_IDX = 1 +regRLC_RLCS_EXCEPTION_REG_1 = 0x4e62 +regRLC_RLCS_EXCEPTION_REG_1_BASE_IDX = 1 +regRLC_RLCS_EXCEPTION_REG_2 = 0x4e63 +regRLC_RLCS_EXCEPTION_REG_2_BASE_IDX = 1 +regRLC_RLCS_EXCEPTION_REG_3 = 0x4e64 +regRLC_RLCS_EXCEPTION_REG_3_BASE_IDX = 1 +regRLC_RLCS_EXCEPTION_REG_4 = 0x4e65 +regRLC_RLCS_EXCEPTION_REG_4_BASE_IDX = 1 +regRLC_RLCS_CGCG_REQUEST = 0x4e66 +regRLC_RLCS_CGCG_REQUEST_BASE_IDX = 1 +regRLC_RLCS_CGCG_STATUS = 0x4e67 +regRLC_RLCS_CGCG_STATUS_BASE_IDX = 1 +regRLC_RLCS_SOC_DS_CNTL = 0x4e68 +regRLC_RLCS_SOC_DS_CNTL_BASE_IDX = 1 +regRLC_RLCS_GFX_DS_CNTL = 0x4e69 +regRLC_RLCS_GFX_DS_CNTL_BASE_IDX = 1 +regRLC_RLCS_GFX_DS_ALLOW_MASK_CNTL = 0x4e6a +regRLC_RLCS_GFX_DS_ALLOW_MASK_CNTL_BASE_IDX = 1 +regRLC_GPM_STAT = 0x4e6b +regRLC_GPM_STAT_BASE_IDX = 1 +regRLC_RLCS_GPM_STAT = 0x4e6b +regRLC_RLCS_GPM_STAT_BASE_IDX = 1 +regRLC_RLCS_ABORTED_PD_SEQUENCE = 0x4e6c +regRLC_RLCS_ABORTED_PD_SEQUENCE_BASE_IDX = 1 +regRLC_RLCS_DIDT_FORCE_STALL = 0x4e6d +regRLC_RLCS_DIDT_FORCE_STALL_BASE_IDX = 1 +regRLC_RLCS_IOV_CMD_STATUS = 0x4e6e +regRLC_RLCS_IOV_CMD_STATUS_BASE_IDX = 1 +regRLC_RLCS_IOV_CNTX_LOC_SIZE = 0x4e6f +regRLC_RLCS_IOV_CNTX_LOC_SIZE_BASE_IDX = 1 +regRLC_RLCS_IOV_SCH_BLOCK = 0x4e70 +regRLC_RLCS_IOV_SCH_BLOCK_BASE_IDX = 1 +regRLC_RLCS_IOV_VM_BUSY_STATUS = 0x4e71 +regRLC_RLCS_IOV_VM_BUSY_STATUS_BASE_IDX = 1 +regRLC_RLCS_GPM_STAT_2 = 0x4e72 +regRLC_RLCS_GPM_STAT_2_BASE_IDX = 1 +regRLC_RLCS_GRBM_SOFT_RESET = 0x4e73 +regRLC_RLCS_GRBM_SOFT_RESET_BASE_IDX = 1 +regRLC_RLCS_PG_CHANGE_STATUS = 0x4e74 +regRLC_RLCS_PG_CHANGE_STATUS_BASE_IDX = 1 +regRLC_RLCS_PG_CHANGE_READ = 0x4e75 +regRLC_RLCS_PG_CHANGE_READ_BASE_IDX = 1 +regRLC_RLCS_IH_SEMAPHORE = 0x4e76 +regRLC_RLCS_IH_SEMAPHORE_BASE_IDX = 1 +regRLC_RLCS_IH_COOKIE_SEMAPHORE = 0x4e77 +regRLC_RLCS_IH_COOKIE_SEMAPHORE_BASE_IDX = 1 +regRLC_RLCS_WGP_STATUS = 0x4e78 +regRLC_RLCS_WGP_STATUS_BASE_IDX = 1 +regRLC_RLCS_WGP_READ = 0x4e79 +regRLC_RLCS_WGP_READ_BASE_IDX = 1 +regRLC_RLCS_CP_INT_CTRL_1 = 0x4e7a +regRLC_RLCS_CP_INT_CTRL_1_BASE_IDX = 1 +regRLC_RLCS_CP_INT_CTRL_2 = 0x4e7b +regRLC_RLCS_CP_INT_CTRL_2_BASE_IDX = 1 +regRLC_RLCS_CP_INT_INFO_1 = 0x4e7c +regRLC_RLCS_CP_INT_INFO_1_BASE_IDX = 1 +regRLC_RLCS_CP_INT_INFO_2 = 0x4e7d +regRLC_RLCS_CP_INT_INFO_2_BASE_IDX = 1 +regRLC_RLCS_SPM_INT_CTRL = 0x4e7e +regRLC_RLCS_SPM_INT_CTRL_BASE_IDX = 1 +regRLC_RLCS_SPM_INT_INFO_1 = 0x4e7f +regRLC_RLCS_SPM_INT_INFO_1_BASE_IDX = 1 +regRLC_RLCS_SPM_INT_INFO_2 = 0x4e80 +regRLC_RLCS_SPM_INT_INFO_2_BASE_IDX = 1 +regRLC_RLCS_DSM_TRIG = 0x4e81 +regRLC_RLCS_DSM_TRIG_BASE_IDX = 1 +regRLC_RLCS_BOOTLOAD_STATUS = 0x4e82 +regRLC_RLCS_BOOTLOAD_STATUS_BASE_IDX = 1 +regRLC_RLCS_POWER_BRAKE_CNTL = 0x4e83 +regRLC_RLCS_POWER_BRAKE_CNTL_BASE_IDX = 1 +regRLC_RLCS_POWER_BRAKE_CNTL_TH1 = 0x4e84 +regRLC_RLCS_POWER_BRAKE_CNTL_TH1_BASE_IDX = 1 +regRLC_RLCS_GRBM_IDLE_BUSY_STAT = 0x4e85 +regRLC_RLCS_GRBM_IDLE_BUSY_STAT_BASE_IDX = 1 +regRLC_RLCS_GRBM_IDLE_BUSY_INT_CNTL = 0x4e86 +regRLC_RLCS_GRBM_IDLE_BUSY_INT_CNTL_BASE_IDX = 1 +regRLC_RLCS_CMP_IDLE_CNTL = 0x4e87 +regRLC_RLCS_CMP_IDLE_CNTL_BASE_IDX = 1 +regRLC_RLCS_GENERAL_0 = 0x4e88 +regRLC_RLCS_GENERAL_0_BASE_IDX = 1 +regRLC_RLCS_GENERAL_1 = 0x4e89 +regRLC_RLCS_GENERAL_1_BASE_IDX = 1 +regRLC_RLCS_GENERAL_2 = 0x4e8a +regRLC_RLCS_GENERAL_2_BASE_IDX = 1 +regRLC_RLCS_GENERAL_3 = 0x4e8b +regRLC_RLCS_GENERAL_3_BASE_IDX = 1 +regRLC_RLCS_GENERAL_4 = 0x4e8c +regRLC_RLCS_GENERAL_4_BASE_IDX = 1 +regRLC_RLCS_GENERAL_5 = 0x4e8d +regRLC_RLCS_GENERAL_5_BASE_IDX = 1 +regRLC_RLCS_GENERAL_6 = 0x4e8e +regRLC_RLCS_GENERAL_6_BASE_IDX = 1 +regRLC_RLCS_GENERAL_7 = 0x4e8f +regRLC_RLCS_GENERAL_7_BASE_IDX = 1 +regRLC_RLCS_GENERAL_8 = 0x4e90 +regRLC_RLCS_GENERAL_8_BASE_IDX = 1 +regRLC_RLCS_GENERAL_9 = 0x4e91 +regRLC_RLCS_GENERAL_9_BASE_IDX = 1 +regRLC_RLCS_GENERAL_10 = 0x4e92 +regRLC_RLCS_GENERAL_10_BASE_IDX = 1 +regRLC_RLCS_GENERAL_11 = 0x4e93 +regRLC_RLCS_GENERAL_11_BASE_IDX = 1 +regRLC_RLCS_GENERAL_12 = 0x4e94 +regRLC_RLCS_GENERAL_12_BASE_IDX = 1 +regRLC_RLCS_GENERAL_13 = 0x4e95 +regRLC_RLCS_GENERAL_13_BASE_IDX = 1 +regRLC_RLCS_GENERAL_14 = 0x4e96 +regRLC_RLCS_GENERAL_14_BASE_IDX = 1 +regRLC_RLCS_GENERAL_15 = 0x4e97 +regRLC_RLCS_GENERAL_15_BASE_IDX = 1 +regRLC_RLCS_GENERAL_16 = 0x4e98 +regRLC_RLCS_GENERAL_16_BASE_IDX = 1 +regRLC_RLCS_AUXILIARY_REG_1 = 0x4ec5 +regRLC_RLCS_AUXILIARY_REG_1_BASE_IDX = 1 +regRLC_RLCS_AUXILIARY_REG_2 = 0x4ec6 +regRLC_RLCS_AUXILIARY_REG_2_BASE_IDX = 1 +regRLC_RLCS_AUXILIARY_REG_3 = 0x4ec7 +regRLC_RLCS_AUXILIARY_REG_3_BASE_IDX = 1 +regRLC_RLCS_AUXILIARY_REG_4 = 0x4ec8 +regRLC_RLCS_AUXILIARY_REG_4_BASE_IDX = 1 +regRLC_RLCS_SPM_SQTT_MODE = 0x4ec9 +regRLC_RLCS_SPM_SQTT_MODE_BASE_IDX = 1 +regRLC_RLCS_CP_DMA_SRCID_OVER = 0x4eca +regRLC_RLCS_CP_DMA_SRCID_OVER_BASE_IDX = 1 +regRLC_RLCS_BOOTLOAD_ID_STATUS1 = 0x4ecb +regRLC_RLCS_BOOTLOAD_ID_STATUS1_BASE_IDX = 1 +regRLC_RLCS_BOOTLOAD_ID_STATUS2 = 0x4ecc +regRLC_RLCS_BOOTLOAD_ID_STATUS2_BASE_IDX = 1 +regRLC_RLCS_IMU_VIDCHG_CNTL = 0x4ecd +regRLC_RLCS_IMU_VIDCHG_CNTL_BASE_IDX = 1 +regRLC_RLCS_EDC_INT_CNTL = 0x4ece +regRLC_RLCS_EDC_INT_CNTL_BASE_IDX = 1 +regRLC_RLCS_KMD_LOG_CNTL1 = 0x4ecf +regRLC_RLCS_KMD_LOG_CNTL1_BASE_IDX = 1 +regRLC_RLCS_KMD_LOG_CNTL2 = 0x4ed0 +regRLC_RLCS_KMD_LOG_CNTL2_BASE_IDX = 1 +regRLC_RLCS_GPM_LEGACY_INT_STAT = 0x4ed1 +regRLC_RLCS_GPM_LEGACY_INT_STAT_BASE_IDX = 1 +regRLC_RLCS_GPM_LEGACY_INT_DISABLE = 0x4ed2 +regRLC_RLCS_GPM_LEGACY_INT_DISABLE_BASE_IDX = 1 +regRLC_RLCS_SRM_SRCID_CNTL = 0x4ed3 +regRLC_RLCS_SRM_SRCID_CNTL_BASE_IDX = 1 +regRLC_RLCS_GCR_DATA_0 = 0x4ed4 +regRLC_RLCS_GCR_DATA_0_BASE_IDX = 1 +regRLC_RLCS_GCR_DATA_1 = 0x4ed5 +regRLC_RLCS_GCR_DATA_1_BASE_IDX = 1 +regRLC_RLCS_GCR_DATA_2 = 0x4ed6 +regRLC_RLCS_GCR_DATA_2_BASE_IDX = 1 +regRLC_RLCS_GCR_DATA_3 = 0x4ed7 +regRLC_RLCS_GCR_DATA_3_BASE_IDX = 1 +regRLC_RLCS_GCR_STATUS = 0x4ed8 +regRLC_RLCS_GCR_STATUS_BASE_IDX = 1 +regRLC_RLCS_PERFMON_CLK_CNTL_UCODE = 0x4ed9 +regRLC_RLCS_PERFMON_CLK_CNTL_UCODE_BASE_IDX = 1 +regRLC_RLCS_UTCL2_CNTL = 0x4eda +regRLC_RLCS_UTCL2_CNTL_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_MSG_DATA0 = 0x4edb +regRLC_RLCS_IMU_RLC_MSG_DATA0_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_MSG_DATA1 = 0x4edc +regRLC_RLCS_IMU_RLC_MSG_DATA1_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_MSG_DATA2 = 0x4edd +regRLC_RLCS_IMU_RLC_MSG_DATA2_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_MSG_DATA3 = 0x4ede +regRLC_RLCS_IMU_RLC_MSG_DATA3_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_MSG_DATA4 = 0x4edf +regRLC_RLCS_IMU_RLC_MSG_DATA4_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_MSG_CONTROL = 0x4ee0 +regRLC_RLCS_IMU_RLC_MSG_CONTROL_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_MSG_CNTL = 0x4ee1 +regRLC_RLCS_IMU_RLC_MSG_CNTL_BASE_IDX = 1 +regRLC_RLCS_RLC_IMU_MSG_DATA0 = 0x4ee2 +regRLC_RLCS_RLC_IMU_MSG_DATA0_BASE_IDX = 1 +regRLC_RLCS_RLC_IMU_MSG_CONTROL = 0x4ee3 +regRLC_RLCS_RLC_IMU_MSG_CONTROL_BASE_IDX = 1 +regRLC_RLCS_RLC_IMU_MSG_CNTL = 0x4ee4 +regRLC_RLCS_RLC_IMU_MSG_CNTL_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_0 = 0x4ee5 +regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_0_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_1 = 0x4ee6 +regRLC_RLCS_IMU_RLC_TELEMETRY_DATA_1_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_MUTEX_CNTL = 0x4ee7 +regRLC_RLCS_IMU_RLC_MUTEX_CNTL_BASE_IDX = 1 +regRLC_RLCS_IMU_RLC_STATUS = 0x4ee8 +regRLC_RLCS_IMU_RLC_STATUS_BASE_IDX = 1 +regRLC_RLCS_RLC_IMU_STATUS = 0x4ee9 +regRLC_RLCS_RLC_IMU_STATUS_BASE_IDX = 1 +regRLC_RLCS_IMU_RAM_DATA_1 = 0x4eea +regRLC_RLCS_IMU_RAM_DATA_1_BASE_IDX = 1 +regRLC_RLCS_IMU_RAM_ADDR_1_LSB = 0x4eeb +regRLC_RLCS_IMU_RAM_ADDR_1_LSB_BASE_IDX = 1 +regRLC_RLCS_IMU_RAM_ADDR_1_MSB = 0x4eec +regRLC_RLCS_IMU_RAM_ADDR_1_MSB_BASE_IDX = 1 +regRLC_RLCS_IMU_RAM_DATA_0 = 0x4eed +regRLC_RLCS_IMU_RAM_DATA_0_BASE_IDX = 1 +regRLC_RLCS_IMU_RAM_ADDR_0_LSB = 0x4eee +regRLC_RLCS_IMU_RAM_ADDR_0_LSB_BASE_IDX = 1 +regRLC_RLCS_IMU_RAM_ADDR_0_MSB = 0x4eef +regRLC_RLCS_IMU_RAM_ADDR_0_MSB_BASE_IDX = 1 +regRLC_RLCS_IMU_RAM_CNTL = 0x4ef0 +regRLC_RLCS_IMU_RAM_CNTL_BASE_IDX = 1 +regRLC_RLCS_IMU_GFX_DOORBELL_FENCE = 0x4ef1 +regRLC_RLCS_IMU_GFX_DOORBELL_FENCE_BASE_IDX = 1 +regRLC_RLCS_SDMA_INT_CNTL_1 = 0x4ef3 +regRLC_RLCS_SDMA_INT_CNTL_1_BASE_IDX = 1 +regRLC_RLCS_SDMA_INT_CNTL_2 = 0x4ef4 +regRLC_RLCS_SDMA_INT_CNTL_2_BASE_IDX = 1 +regRLC_RLCS_SDMA_INT_STAT = 0x4ef5 +regRLC_RLCS_SDMA_INT_STAT_BASE_IDX = 1 +regRLC_RLCS_SDMA_INT_INFO = 0x4ef6 +regRLC_RLCS_SDMA_INT_INFO_BASE_IDX = 1 +regRLC_RLCS_PMM_CGCG_CNTL = 0x4ef7 +regRLC_RLCS_PMM_CGCG_CNTL_BASE_IDX = 1 +regRLC_RLCS_GFX_MEM_POWER_CTRL_LO = 0x4ef8 +regRLC_RLCS_GFX_MEM_POWER_CTRL_LO_BASE_IDX = 1 +regRLC_RLCS_GFX_RM_CNTL = 0x4efa +regRLC_RLCS_GFX_RM_CNTL_BASE_IDX = 1 +regRLC_RLCS_DEC_END = 0x4fff +regRLC_RLCS_DEC_END_BASE_IDX = 1 +regRLC_SAFE_MODE = 0x0980 +regRLC_SAFE_MODE_BASE_IDX = 1 +regRLC_SPM_SAMPLE_CNT = 0x0981 +regRLC_SPM_SAMPLE_CNT_BASE_IDX = 1 +regRLC_SPM_MC_CNTL = 0x0982 +regRLC_SPM_MC_CNTL_BASE_IDX = 1 +regRLC_SPM_INT_CNTL = 0x0983 +regRLC_SPM_INT_CNTL_BASE_IDX = 1 +regRLC_SPM_INT_STATUS = 0x0984 +regRLC_SPM_INT_STATUS_BASE_IDX = 1 +regRLC_SPM_INT_INFO_1 = 0x0985 +regRLC_SPM_INT_INFO_1_BASE_IDX = 1 +regRLC_SPM_INT_INFO_2 = 0x0986 +regRLC_SPM_INT_INFO_2_BASE_IDX = 1 +regRLC_CSIB_ADDR_LO = 0x0987 +regRLC_CSIB_ADDR_LO_BASE_IDX = 1 +regRLC_CSIB_ADDR_HI = 0x0988 +regRLC_CSIB_ADDR_HI_BASE_IDX = 1 +regRLC_CSIB_LENGTH = 0x0989 +regRLC_CSIB_LENGTH_BASE_IDX = 1 +regRLC_CP_SCHEDULERS = 0x098a +regRLC_CP_SCHEDULERS_BASE_IDX = 1 +regRLC_CP_EOF_INT = 0x098b +regRLC_CP_EOF_INT_BASE_IDX = 1 +regRLC_CP_EOF_INT_CNT = 0x098c +regRLC_CP_EOF_INT_CNT_BASE_IDX = 1 +regRLC_SPARE_INT_0 = 0x098d +regRLC_SPARE_INT_0_BASE_IDX = 1 +regRLC_SPARE_INT_1 = 0x098e +regRLC_SPARE_INT_1_BASE_IDX = 1 +regRLC_SPARE_INT_2 = 0x098f +regRLC_SPARE_INT_2_BASE_IDX = 1 +regRLC_PACE_SPARE_INT = 0x0990 +regRLC_PACE_SPARE_INT_BASE_IDX = 1 +regRLC_PACE_SPARE_INT_1 = 0x0991 +regRLC_PACE_SPARE_INT_1_BASE_IDX = 1 +regRLC_RLCV_SPARE_INT_1 = 0x0992 +regRLC_RLCV_SPARE_INT_1_BASE_IDX = 1 +regCGTS_TCC_DISABLE = 0x5006 +regCGTS_TCC_DISABLE_BASE_IDX = 1 +regCGTT_GS_NGG_CLK_CTRL = 0x5087 +regCGTT_GS_NGG_CLK_CTRL_BASE_IDX = 1 +regCGTT_PA_CLK_CTRL = 0x5088 +regCGTT_PA_CLK_CTRL_BASE_IDX = 1 +regCGTT_SC_CLK_CTRL0 = 0x5089 +regCGTT_SC_CLK_CTRL0_BASE_IDX = 1 +regCGTT_SC_CLK_CTRL1 = 0x508a +regCGTT_SC_CLK_CTRL1_BASE_IDX = 1 +regCGTT_SC_CLK_CTRL2 = 0x508b +regCGTT_SC_CLK_CTRL2_BASE_IDX = 1 +regCGTT_SQG_CLK_CTRL = 0x508d +regCGTT_SQG_CLK_CTRL_BASE_IDX = 1 +regSQ_ALU_CLK_CTRL = 0x508e +regSQ_ALU_CLK_CTRL_BASE_IDX = 1 +regSQ_TEX_CLK_CTRL = 0x508f +regSQ_TEX_CLK_CTRL_BASE_IDX = 1 +regSQ_LDS_CLK_CTRL = 0x5090 +regSQ_LDS_CLK_CTRL_BASE_IDX = 1 +regICG_SP_CLK_CTRL = 0x5093 +regICG_SP_CLK_CTRL_BASE_IDX = 1 +regTA_CGTT_CTRL = 0x509d +regTA_CGTT_CTRL_BASE_IDX = 1 +regDB_CGTT_CLK_CTRL_0 = 0x50a4 +regDB_CGTT_CLK_CTRL_0_BASE_IDX = 1 +regCB_CGTT_SCLK_CTRL = 0x50a8 +regCB_CGTT_SCLK_CTRL_BASE_IDX = 1 +regCGTT_CP_CLK_CTRL = 0x50b0 +regCGTT_CP_CLK_CTRL_BASE_IDX = 1 +regCGTT_CPF_CLK_CTRL = 0x50b1 +regCGTT_CPF_CLK_CTRL_BASE_IDX = 1 +regCGTT_CPC_CLK_CTRL = 0x50b2 +regCGTT_CPC_CLK_CTRL_BASE_IDX = 1 +regCGTT_RLC_CLK_CTRL = 0x50b5 +regCGTT_RLC_CLK_CTRL_BASE_IDX = 1 +regCGTT_SC_CLK_CTRL3 = 0x50bc +regCGTT_SC_CLK_CTRL3_BASE_IDX = 1 +regCGTT_SC_CLK_CTRL4 = 0x50bd +regCGTT_SC_CLK_CTRL4_BASE_IDX = 1 +regGCEA_ICG_CTRL = 0x50c4 +regGCEA_ICG_CTRL_BASE_IDX = 1 +regGL1I_GL1R_MGCG_OVERRIDE = 0x50e4 +regGL1I_GL1R_MGCG_OVERRIDE_BASE_IDX = 1 +regGL1H_ICG_CTRL = 0x50e8 +regGL1H_ICG_CTRL_BASE_IDX = 1 +regCHI_CHR_MGCG_OVERRIDE = 0x50e9 +regCHI_CHR_MGCG_OVERRIDE_BASE_IDX = 1 +regICG_GL1C_CLK_CTRL = 0x50ec +regICG_GL1C_CLK_CTRL_BASE_IDX = 1 +regICG_GL1A_CTRL = 0x50f0 +regICG_GL1A_CTRL_BASE_IDX = 1 +regICG_CHA_CTRL = 0x50f1 +regICG_CHA_CTRL_BASE_IDX = 1 +regGUS_ICG_CTRL = 0x50f4 +regGUS_ICG_CTRL_BASE_IDX = 1 +regCGTT_PH_CLK_CTRL0 = 0x50f8 +regCGTT_PH_CLK_CTRL0_BASE_IDX = 1 +regCGTT_PH_CLK_CTRL1 = 0x50f9 +regCGTT_PH_CLK_CTRL1_BASE_IDX = 1 +regCGTT_PH_CLK_CTRL2 = 0x50fa +regCGTT_PH_CLK_CTRL2_BASE_IDX = 1 +regCGTT_PH_CLK_CTRL3 = 0x50fb +regCGTT_PH_CLK_CTRL3_BASE_IDX = 1 +regGFX_ICG_GL2C_CTRL = 0x50fc +regGFX_ICG_GL2C_CTRL_BASE_IDX = 1 +regGFX_ICG_GL2C_CTRL1 = 0x50fd +regGFX_ICG_GL2C_CTRL1_BASE_IDX = 1 +regICG_LDS_CLK_CTRL = 0x5114 +regICG_LDS_CLK_CTRL_BASE_IDX = 1 +regICG_CHC_CLK_CTRL = 0x5140 +regICG_CHC_CLK_CTRL_BASE_IDX = 1 +regICG_CHCG_CLK_CTRL = 0x5144 +regICG_CHCG_CLK_CTRL_BASE_IDX = 1 +regGFX_PIPE_PRIORITY = 0x587f +regGFX_PIPE_PRIORITY_BASE_IDX = 1 +regGRBM_GFX_INDEX_SR_SELECT = 0x5a00 +regGRBM_GFX_INDEX_SR_SELECT_BASE_IDX = 1 +regGRBM_GFX_INDEX_SR_DATA = 0x5a01 +regGRBM_GFX_INDEX_SR_DATA_BASE_IDX = 1 +regGRBM_GFX_CNTL_SR_SELECT = 0x5a02 +regGRBM_GFX_CNTL_SR_SELECT_BASE_IDX = 1 +regGRBM_GFX_CNTL_SR_DATA = 0x5a03 +regGRBM_GFX_CNTL_SR_DATA_BASE_IDX = 1 +regGC_IH_COOKIE_0_PTR = 0x5a07 +regGC_IH_COOKIE_0_PTR_BASE_IDX = 1 +regGRBM_SE_REMAP_CNTL = 0x5a08 +regGRBM_SE_REMAP_CNTL_BASE_IDX = 1 +regRLC_GPU_IOV_VF_ENABLE = 0x5b00 +regRLC_GPU_IOV_VF_ENABLE_BASE_IDX = 1 +regRLC_GPU_IOV_CFG_REG6 = 0x5b06 +regRLC_GPU_IOV_CFG_REG6_BASE_IDX = 1 +regRLC_SDMA0_STATUS = 0x5b18 +regRLC_SDMA0_STATUS_BASE_IDX = 1 +regRLC_SDMA1_STATUS = 0x5b19 +regRLC_SDMA1_STATUS_BASE_IDX = 1 +regRLC_SDMA2_STATUS = 0x5b1a +regRLC_SDMA2_STATUS_BASE_IDX = 1 +regRLC_SDMA3_STATUS = 0x5b1b +regRLC_SDMA3_STATUS_BASE_IDX = 1 +regRLC_SDMA0_BUSY_STATUS = 0x5b1c +regRLC_SDMA0_BUSY_STATUS_BASE_IDX = 1 +regRLC_SDMA1_BUSY_STATUS = 0x5b1d +regRLC_SDMA1_BUSY_STATUS_BASE_IDX = 1 +regRLC_SDMA2_BUSY_STATUS = 0x5b1e +regRLC_SDMA2_BUSY_STATUS_BASE_IDX = 1 +regRLC_SDMA3_BUSY_STATUS = 0x5b1f +regRLC_SDMA3_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_CFG_REG8 = 0x5b20 +regRLC_GPU_IOV_CFG_REG8_BASE_IDX = 1 +regRLC_RLCV_TIMER_INT_0 = 0x5b25 +regRLC_RLCV_TIMER_INT_0_BASE_IDX = 1 +regRLC_RLCV_TIMER_INT_1 = 0x5b26 +regRLC_RLCV_TIMER_INT_1_BASE_IDX = 1 +regRLC_RLCV_TIMER_CTRL = 0x5b27 +regRLC_RLCV_TIMER_CTRL_BASE_IDX = 1 +regRLC_RLCV_TIMER_STAT = 0x5b28 +regRLC_RLCV_TIMER_STAT_BASE_IDX = 1 +regRLC_GPU_IOV_VF_DOORBELL_STATUS = 0x5b2a +regRLC_GPU_IOV_VF_DOORBELL_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_VF_DOORBELL_STATUS_SET = 0x5b2b +regRLC_GPU_IOV_VF_DOORBELL_STATUS_SET_BASE_IDX = 1 +regRLC_GPU_IOV_VF_DOORBELL_STATUS_CLR = 0x5b2c +regRLC_GPU_IOV_VF_DOORBELL_STATUS_CLR_BASE_IDX = 1 +regRLC_GPU_IOV_VF_MASK = 0x5b2d +regRLC_GPU_IOV_VF_MASK_BASE_IDX = 1 +regRLC_HYP_SEMAPHORE_0 = 0x5b2e +regRLC_HYP_SEMAPHORE_0_BASE_IDX = 1 +regRLC_HYP_SEMAPHORE_1 = 0x5b2f +regRLC_HYP_SEMAPHORE_1_BASE_IDX = 1 +regRLC_BUSY_CLK_CNTL = 0x5b30 +regRLC_BUSY_CLK_CNTL_BASE_IDX = 1 +regRLC_CLK_CNTL = 0x5b31 +regRLC_CLK_CNTL_BASE_IDX = 1 +regRLC_PACE_TIMER_STAT = 0x5b33 +regRLC_PACE_TIMER_STAT_BASE_IDX = 1 +regRLC_GPU_IOV_SCH_BLOCK = 0x5b34 +regRLC_GPU_IOV_SCH_BLOCK_BASE_IDX = 1 +regRLC_GPU_IOV_CFG_REG1 = 0x5b35 +regRLC_GPU_IOV_CFG_REG1_BASE_IDX = 1 +regRLC_GPU_IOV_CFG_REG2 = 0x5b36 +regRLC_GPU_IOV_CFG_REG2_BASE_IDX = 1 +regRLC_GPU_IOV_VM_BUSY_STATUS = 0x5b37 +regRLC_GPU_IOV_VM_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SCH_0 = 0x5b38 +regRLC_GPU_IOV_SCH_0_BASE_IDX = 1 +regRLC_GPU_IOV_SCH_3 = 0x5b3a +regRLC_GPU_IOV_SCH_3_BASE_IDX = 1 +regRLC_GPU_IOV_SCH_1 = 0x5b3b +regRLC_GPU_IOV_SCH_1_BASE_IDX = 1 +regRLC_GPU_IOV_SCH_2 = 0x5b3c +regRLC_GPU_IOV_SCH_2_BASE_IDX = 1 +regRLC_PACE_INT_FORCE = 0x5b3d +regRLC_PACE_INT_FORCE_BASE_IDX = 1 +regRLC_PACE_INT_CLEAR = 0x5b3e +regRLC_PACE_INT_CLEAR_BASE_IDX = 1 +regRLC_GPU_IOV_INT_STAT = 0x5b3f +regRLC_GPU_IOV_INT_STAT_BASE_IDX = 1 +regRLC_IH_COOKIE = 0x5b41 +regRLC_IH_COOKIE_BASE_IDX = 1 +regRLC_IH_COOKIE_CNTL = 0x5b42 +regRLC_IH_COOKIE_CNTL_BASE_IDX = 1 +regRLC_HYP_RLCG_UCODE_CHKSUM = 0x5b43 +regRLC_HYP_RLCG_UCODE_CHKSUM_BASE_IDX = 1 +regRLC_HYP_RLCP_UCODE_CHKSUM = 0x5b44 +regRLC_HYP_RLCP_UCODE_CHKSUM_BASE_IDX = 1 +regRLC_HYP_RLCV_UCODE_CHKSUM = 0x5b45 +regRLC_HYP_RLCV_UCODE_CHKSUM_BASE_IDX = 1 +regRLC_GPU_IOV_F32_CNTL = 0x5b46 +regRLC_GPU_IOV_F32_CNTL_BASE_IDX = 1 +regRLC_GPU_IOV_F32_RESET = 0x5b47 +regRLC_GPU_IOV_F32_RESET_BASE_IDX = 1 +regRLC_GPU_IOV_UCODE_ADDR = 0x5b48 +regRLC_GPU_IOV_UCODE_ADDR_BASE_IDX = 1 +regRLC_GPU_IOV_UCODE_DATA = 0x5b49 +regRLC_GPU_IOV_UCODE_DATA_BASE_IDX = 1 +regRLC_GPU_IOV_SMU_RESPONSE = 0x5b4a +regRLC_GPU_IOV_SMU_RESPONSE_BASE_IDX = 1 +regRLC_GPU_IOV_F32_INVALIDATE_CACHE = 0x5b4b +regRLC_GPU_IOV_F32_INVALIDATE_CACHE_BASE_IDX = 1 +regRLC_GPU_IOV_RLC_RESPONSE = 0x5b4d +regRLC_GPU_IOV_RLC_RESPONSE_BASE_IDX = 1 +regRLC_GPU_IOV_INT_DISABLE = 0x5b4e +regRLC_GPU_IOV_INT_DISABLE_BASE_IDX = 1 +regRLC_GPU_IOV_INT_FORCE = 0x5b4f +regRLC_GPU_IOV_INT_FORCE_BASE_IDX = 1 +regRLC_GPU_IOV_SCRATCH_ADDR = 0x5b50 +regRLC_GPU_IOV_SCRATCH_ADDR_BASE_IDX = 1 +regRLC_GPU_IOV_SCRATCH_DATA = 0x5b51 +regRLC_GPU_IOV_SCRATCH_DATA_BASE_IDX = 1 +regRLC_HYP_SEMAPHORE_2 = 0x5b52 +regRLC_HYP_SEMAPHORE_2_BASE_IDX = 1 +regRLC_HYP_SEMAPHORE_3 = 0x5b53 +regRLC_HYP_SEMAPHORE_3_BASE_IDX = 1 +regRLC_GPM_UCODE_ADDR = 0x5b60 +regRLC_GPM_UCODE_ADDR_BASE_IDX = 1 +regRLC_GPM_UCODE_DATA = 0x5b61 +regRLC_GPM_UCODE_DATA_BASE_IDX = 1 +regRLC_GPM_IRAM_ADDR = 0x5b62 +regRLC_GPM_IRAM_ADDR_BASE_IDX = 1 +regRLC_GPM_IRAM_DATA = 0x5b63 +regRLC_GPM_IRAM_DATA_BASE_IDX = 1 +regRLC_RLCP_IRAM_ADDR = 0x5b64 +regRLC_RLCP_IRAM_ADDR_BASE_IDX = 1 +regRLC_RLCP_IRAM_DATA = 0x5b65 +regRLC_RLCP_IRAM_DATA_BASE_IDX = 1 +regRLC_RLCV_IRAM_ADDR = 0x5b66 +regRLC_RLCV_IRAM_ADDR_BASE_IDX = 1 +regRLC_RLCV_IRAM_DATA = 0x5b67 +regRLC_RLCV_IRAM_DATA_BASE_IDX = 1 +regRLC_LX6_DRAM_ADDR = 0x5b68 +regRLC_LX6_DRAM_ADDR_BASE_IDX = 1 +regRLC_LX6_DRAM_DATA = 0x5b69 +regRLC_LX6_DRAM_DATA_BASE_IDX = 1 +regRLC_LX6_IRAM_ADDR = 0x5b6a +regRLC_LX6_IRAM_ADDR_BASE_IDX = 1 +regRLC_LX6_IRAM_DATA = 0x5b6b +regRLC_LX6_IRAM_DATA_BASE_IDX = 1 +regRLC_PACE_UCODE_ADDR = 0x5b6c +regRLC_PACE_UCODE_ADDR_BASE_IDX = 1 +regRLC_PACE_UCODE_DATA = 0x5b6d +regRLC_PACE_UCODE_DATA_BASE_IDX = 1 +regRLC_GPM_SCRATCH_ADDR = 0x5b6e +regRLC_GPM_SCRATCH_ADDR_BASE_IDX = 1 +regRLC_GPM_SCRATCH_DATA = 0x5b6f +regRLC_GPM_SCRATCH_DATA_BASE_IDX = 1 +regRLC_SRM_DRAM_ADDR = 0x5b71 +regRLC_SRM_DRAM_ADDR_BASE_IDX = 1 +regRLC_SRM_DRAM_DATA = 0x5b72 +regRLC_SRM_DRAM_DATA_BASE_IDX = 1 +regRLC_SRM_ARAM_ADDR = 0x5b73 +regRLC_SRM_ARAM_ADDR_BASE_IDX = 1 +regRLC_SRM_ARAM_DATA = 0x5b74 +regRLC_SRM_ARAM_DATA_BASE_IDX = 1 +regRLC_PACE_SCRATCH_ADDR = 0x5b77 +regRLC_PACE_SCRATCH_ADDR_BASE_IDX = 1 +regRLC_PACE_SCRATCH_DATA = 0x5b78 +regRLC_PACE_SCRATCH_DATA_BASE_IDX = 1 +regRLC_GTS_OFFSET_LSB = 0x5b79 +regRLC_GTS_OFFSET_LSB_BASE_IDX = 1 +regRLC_GTS_OFFSET_MSB = 0x5b7a +regRLC_GTS_OFFSET_MSB_BASE_IDX = 1 +regGL2_PIPE_STEER_0 = 0x5b80 +regGL2_PIPE_STEER_0_BASE_IDX = 1 +regGL2_PIPE_STEER_1 = 0x5b81 +regGL2_PIPE_STEER_1_BASE_IDX = 1 +regGL2_PIPE_STEER_2 = 0x5b82 +regGL2_PIPE_STEER_2_BASE_IDX = 1 +regGL2_PIPE_STEER_3 = 0x5b83 +regGL2_PIPE_STEER_3_BASE_IDX = 1 +regGL1_PIPE_STEER = 0x5b84 +regGL1_PIPE_STEER_BASE_IDX = 1 +regCH_PIPE_STEER = 0x5b88 +regCH_PIPE_STEER_BASE_IDX = 1 +regGC_USER_SHADER_ARRAY_CONFIG = 0x5b90 +regGC_USER_SHADER_ARRAY_CONFIG_BASE_IDX = 1 +regGC_USER_PRIM_CONFIG = 0x5b91 +regGC_USER_PRIM_CONFIG_BASE_IDX = 1 +regGC_USER_SA_UNIT_DISABLE = 0x5b92 +regGC_USER_SA_UNIT_DISABLE_BASE_IDX = 1 +regGC_USER_RB_REDUNDANCY = 0x5b93 +regGC_USER_RB_REDUNDANCY_BASE_IDX = 1 +regGC_USER_RB_BACKEND_DISABLE = 0x5b94 +regGC_USER_RB_BACKEND_DISABLE_BASE_IDX = 1 +regGC_USER_RMI_REDUNDANCY = 0x5b95 +regGC_USER_RMI_REDUNDANCY_BASE_IDX = 1 +regCGTS_USER_TCC_DISABLE = 0x5b96 +regCGTS_USER_TCC_DISABLE_BASE_IDX = 1 +regGC_USER_SHADER_RATE_CONFIG = 0x5b97 +regGC_USER_SHADER_RATE_CONFIG_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA0_STATUS = 0x5bc0 +regRLC_GPU_IOV_SDMA0_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA1_STATUS = 0x5bc1 +regRLC_GPU_IOV_SDMA1_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA2_STATUS = 0x5bc2 +regRLC_GPU_IOV_SDMA2_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA3_STATUS = 0x5bc3 +regRLC_GPU_IOV_SDMA3_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA4_STATUS = 0x5bc4 +regRLC_GPU_IOV_SDMA4_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA5_STATUS = 0x5bc5 +regRLC_GPU_IOV_SDMA5_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA6_STATUS = 0x5bc6 +regRLC_GPU_IOV_SDMA6_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA7_STATUS = 0x5bc7 +regRLC_GPU_IOV_SDMA7_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA0_BUSY_STATUS = 0x5bc8 +regRLC_GPU_IOV_SDMA0_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA1_BUSY_STATUS = 0x5bc9 +regRLC_GPU_IOV_SDMA1_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA2_BUSY_STATUS = 0x5bca +regRLC_GPU_IOV_SDMA2_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA3_BUSY_STATUS = 0x5bcb +regRLC_GPU_IOV_SDMA3_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA4_BUSY_STATUS = 0x5bcc +regRLC_GPU_IOV_SDMA4_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA5_BUSY_STATUS = 0x5bcd +regRLC_GPU_IOV_SDMA5_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA6_BUSY_STATUS = 0x5bce +regRLC_GPU_IOV_SDMA6_BUSY_STATUS_BASE_IDX = 1 +regRLC_GPU_IOV_SDMA7_BUSY_STATUS = 0x5bcf +regRLC_GPU_IOV_SDMA7_BUSY_STATUS_BASE_IDX = 1 +regCP_MES_DM_INDEX_ADDR = 0x5c00 +regCP_MES_DM_INDEX_ADDR_BASE_IDX = 1 +regCP_MES_DM_INDEX_DATA = 0x5c01 +regCP_MES_DM_INDEX_DATA_BASE_IDX = 1 +regCP_MEC_DM_INDEX_ADDR = 0x5c02 +regCP_MEC_DM_INDEX_ADDR_BASE_IDX = 1 +regCP_MEC_DM_INDEX_DATA = 0x5c03 +regCP_MEC_DM_INDEX_DATA_BASE_IDX = 1 +regCP_GFX_RS64_DM_INDEX_ADDR = 0x5c04 +regCP_GFX_RS64_DM_INDEX_ADDR_BASE_IDX = 1 +regCP_GFX_RS64_DM_INDEX_DATA = 0x5c05 +regCP_GFX_RS64_DM_INDEX_DATA_BASE_IDX = 1 +regCPG_PSP_DEBUG = 0x5c10 +regCPG_PSP_DEBUG_BASE_IDX = 1 +regCPC_PSP_DEBUG = 0x5c11 +regCPC_PSP_DEBUG_BASE_IDX = 1 +regGRBM_SEC_CNTL = 0x5e0d +regGRBM_SEC_CNTL_BASE_IDX = 1 +regGRBM_CAM_INDEX = 0x5e10 +regGRBM_CAM_INDEX_BASE_IDX = 1 +regGRBM_HYP_CAM_INDEX = 0x5e10 +regGRBM_HYP_CAM_INDEX_BASE_IDX = 1 +regGRBM_CAM_DATA = 0x5e11 +regGRBM_CAM_DATA_BASE_IDX = 1 +regGRBM_HYP_CAM_DATA = 0x5e11 +regGRBM_HYP_CAM_DATA_BASE_IDX = 1 +regGRBM_CAM_DATA_UPPER = 0x5e12 +regGRBM_CAM_DATA_UPPER_BASE_IDX = 1 +regGRBM_HYP_CAM_DATA_UPPER = 0x5e12 +regGRBM_HYP_CAM_DATA_UPPER_BASE_IDX = 1 +regRLC_FWL_FIRST_VIOL_ADDR = 0x5f26 +regRLC_FWL_FIRST_VIOL_ADDR_BASE_IDX = 1 +regGFX_IMU_C2PMSG_0 = 0x4000 +regGFX_IMU_C2PMSG_0_BASE_IDX = 1 +regGFX_IMU_C2PMSG_1 = 0x4001 +regGFX_IMU_C2PMSG_1_BASE_IDX = 1 +regGFX_IMU_C2PMSG_2 = 0x4002 +regGFX_IMU_C2PMSG_2_BASE_IDX = 1 +regGFX_IMU_C2PMSG_3 = 0x4003 +regGFX_IMU_C2PMSG_3_BASE_IDX = 1 +regGFX_IMU_C2PMSG_4 = 0x4004 +regGFX_IMU_C2PMSG_4_BASE_IDX = 1 +regGFX_IMU_C2PMSG_5 = 0x4005 +regGFX_IMU_C2PMSG_5_BASE_IDX = 1 +regGFX_IMU_C2PMSG_6 = 0x4006 +regGFX_IMU_C2PMSG_6_BASE_IDX = 1 +regGFX_IMU_C2PMSG_7 = 0x4007 +regGFX_IMU_C2PMSG_7_BASE_IDX = 1 +regGFX_IMU_C2PMSG_8 = 0x4008 +regGFX_IMU_C2PMSG_8_BASE_IDX = 1 +regGFX_IMU_C2PMSG_9 = 0x4009 +regGFX_IMU_C2PMSG_9_BASE_IDX = 1 +regGFX_IMU_C2PMSG_10 = 0x400a +regGFX_IMU_C2PMSG_10_BASE_IDX = 1 +regGFX_IMU_C2PMSG_11 = 0x400b +regGFX_IMU_C2PMSG_11_BASE_IDX = 1 +regGFX_IMU_C2PMSG_12 = 0x400c +regGFX_IMU_C2PMSG_12_BASE_IDX = 1 +regGFX_IMU_C2PMSG_13 = 0x400d +regGFX_IMU_C2PMSG_13_BASE_IDX = 1 +regGFX_IMU_C2PMSG_14 = 0x400e +regGFX_IMU_C2PMSG_14_BASE_IDX = 1 +regGFX_IMU_C2PMSG_15 = 0x400f +regGFX_IMU_C2PMSG_15_BASE_IDX = 1 +regGFX_IMU_C2PMSG_16 = 0x4010 +regGFX_IMU_C2PMSG_16_BASE_IDX = 1 +regGFX_IMU_C2PMSG_17 = 0x4011 +regGFX_IMU_C2PMSG_17_BASE_IDX = 1 +regGFX_IMU_C2PMSG_18 = 0x4012 +regGFX_IMU_C2PMSG_18_BASE_IDX = 1 +regGFX_IMU_C2PMSG_19 = 0x4013 +regGFX_IMU_C2PMSG_19_BASE_IDX = 1 +regGFX_IMU_C2PMSG_20 = 0x4014 +regGFX_IMU_C2PMSG_20_BASE_IDX = 1 +regGFX_IMU_C2PMSG_21 = 0x4015 +regGFX_IMU_C2PMSG_21_BASE_IDX = 1 +regGFX_IMU_C2PMSG_22 = 0x4016 +regGFX_IMU_C2PMSG_22_BASE_IDX = 1 +regGFX_IMU_C2PMSG_23 = 0x4017 +regGFX_IMU_C2PMSG_23_BASE_IDX = 1 +regGFX_IMU_C2PMSG_24 = 0x4018 +regGFX_IMU_C2PMSG_24_BASE_IDX = 1 +regGFX_IMU_C2PMSG_25 = 0x4019 +regGFX_IMU_C2PMSG_25_BASE_IDX = 1 +regGFX_IMU_C2PMSG_26 = 0x401a +regGFX_IMU_C2PMSG_26_BASE_IDX = 1 +regGFX_IMU_C2PMSG_27 = 0x401b +regGFX_IMU_C2PMSG_27_BASE_IDX = 1 +regGFX_IMU_C2PMSG_28 = 0x401c +regGFX_IMU_C2PMSG_28_BASE_IDX = 1 +regGFX_IMU_C2PMSG_29 = 0x401d +regGFX_IMU_C2PMSG_29_BASE_IDX = 1 +regGFX_IMU_C2PMSG_30 = 0x401e +regGFX_IMU_C2PMSG_30_BASE_IDX = 1 +regGFX_IMU_C2PMSG_31 = 0x401f +regGFX_IMU_C2PMSG_31_BASE_IDX = 1 +regGFX_IMU_C2PMSG_32 = 0x4020 +regGFX_IMU_C2PMSG_32_BASE_IDX = 1 +regGFX_IMU_C2PMSG_33 = 0x4021 +regGFX_IMU_C2PMSG_33_BASE_IDX = 1 +regGFX_IMU_C2PMSG_34 = 0x4022 +regGFX_IMU_C2PMSG_34_BASE_IDX = 1 +regGFX_IMU_C2PMSG_35 = 0x4023 +regGFX_IMU_C2PMSG_35_BASE_IDX = 1 +regGFX_IMU_C2PMSG_36 = 0x4024 +regGFX_IMU_C2PMSG_36_BASE_IDX = 1 +regGFX_IMU_C2PMSG_37 = 0x4025 +regGFX_IMU_C2PMSG_37_BASE_IDX = 1 +regGFX_IMU_C2PMSG_38 = 0x4026 +regGFX_IMU_C2PMSG_38_BASE_IDX = 1 +regGFX_IMU_C2PMSG_39 = 0x4027 +regGFX_IMU_C2PMSG_39_BASE_IDX = 1 +regGFX_IMU_C2PMSG_40 = 0x4028 +regGFX_IMU_C2PMSG_40_BASE_IDX = 1 +regGFX_IMU_C2PMSG_41 = 0x4029 +regGFX_IMU_C2PMSG_41_BASE_IDX = 1 +regGFX_IMU_C2PMSG_42 = 0x402a +regGFX_IMU_C2PMSG_42_BASE_IDX = 1 +regGFX_IMU_C2PMSG_43 = 0x402b +regGFX_IMU_C2PMSG_43_BASE_IDX = 1 +regGFX_IMU_C2PMSG_44 = 0x402c +regGFX_IMU_C2PMSG_44_BASE_IDX = 1 +regGFX_IMU_C2PMSG_45 = 0x402d +regGFX_IMU_C2PMSG_45_BASE_IDX = 1 +regGFX_IMU_C2PMSG_46 = 0x402e +regGFX_IMU_C2PMSG_46_BASE_IDX = 1 +regGFX_IMU_C2PMSG_47 = 0x402f +regGFX_IMU_C2PMSG_47_BASE_IDX = 1 +regGFX_IMU_MSG_FLAGS = 0x403f +regGFX_IMU_MSG_FLAGS_BASE_IDX = 1 +regGFX_IMU_C2PMSG_ACCESS_CTRL0 = 0x4040 +regGFX_IMU_C2PMSG_ACCESS_CTRL0_BASE_IDX = 1 +regGFX_IMU_C2PMSG_ACCESS_CTRL1 = 0x4041 +regGFX_IMU_C2PMSG_ACCESS_CTRL1_BASE_IDX = 1 +regGFX_IMU_PWRMGT_IRQ_CTRL = 0x4042 +regGFX_IMU_PWRMGT_IRQ_CTRL_BASE_IDX = 1 +regGFX_IMU_MP1_MUTEX = 0x4043 +regGFX_IMU_MP1_MUTEX_BASE_IDX = 1 +regGFX_IMU_RLC_DATA_4 = 0x4046 +regGFX_IMU_RLC_DATA_4_BASE_IDX = 1 +regGFX_IMU_RLC_DATA_3 = 0x4047 +regGFX_IMU_RLC_DATA_3_BASE_IDX = 1 +regGFX_IMU_RLC_DATA_2 = 0x4048 +regGFX_IMU_RLC_DATA_2_BASE_IDX = 1 +regGFX_IMU_RLC_DATA_1 = 0x4049 +regGFX_IMU_RLC_DATA_1_BASE_IDX = 1 +regGFX_IMU_RLC_DATA_0 = 0x404a +regGFX_IMU_RLC_DATA_0_BASE_IDX = 1 +regGFX_IMU_RLC_CMD = 0x404b +regGFX_IMU_RLC_CMD_BASE_IDX = 1 +regGFX_IMU_RLC_MUTEX = 0x404c +regGFX_IMU_RLC_MUTEX_BASE_IDX = 1 +regGFX_IMU_RLC_MSG_STATUS = 0x404f +regGFX_IMU_RLC_MSG_STATUS_BASE_IDX = 1 +regRLC_GFX_IMU_DATA_0 = 0x4052 +regRLC_GFX_IMU_DATA_0_BASE_IDX = 1 +regRLC_GFX_IMU_CMD = 0x4053 +regRLC_GFX_IMU_CMD_BASE_IDX = 1 +regGFX_IMU_RLC_STATUS = 0x4054 +regGFX_IMU_RLC_STATUS_BASE_IDX = 1 +regGFX_IMU_STATUS = 0x4055 +regGFX_IMU_STATUS_BASE_IDX = 1 +regGFX_IMU_SOC_DATA = 0x4059 +regGFX_IMU_SOC_DATA_BASE_IDX = 1 +regGFX_IMU_SOC_ADDR = 0x405a +regGFX_IMU_SOC_ADDR_BASE_IDX = 1 +regGFX_IMU_SOC_REQ = 0x405b +regGFX_IMU_SOC_REQ_BASE_IDX = 1 +regGFX_IMU_VF_CTRL = 0x405c +regGFX_IMU_VF_CTRL_BASE_IDX = 1 +regGFX_IMU_TELEMETRY = 0x4060 +regGFX_IMU_TELEMETRY_BASE_IDX = 1 +regGFX_IMU_TELEMETRY_DATA = 0x4061 +regGFX_IMU_TELEMETRY_DATA_BASE_IDX = 1 +regGFX_IMU_TELEMETRY_TEMPERATURE = 0x4062 +regGFX_IMU_TELEMETRY_TEMPERATURE_BASE_IDX = 1 +regGFX_IMU_SCRATCH_0 = 0x4068 +regGFX_IMU_SCRATCH_0_BASE_IDX = 1 +regGFX_IMU_SCRATCH_1 = 0x4069 +regGFX_IMU_SCRATCH_1_BASE_IDX = 1 +regGFX_IMU_SCRATCH_2 = 0x406a +regGFX_IMU_SCRATCH_2_BASE_IDX = 1 +regGFX_IMU_SCRATCH_3 = 0x406b +regGFX_IMU_SCRATCH_3_BASE_IDX = 1 +regGFX_IMU_SCRATCH_4 = 0x406c +regGFX_IMU_SCRATCH_4_BASE_IDX = 1 +regGFX_IMU_SCRATCH_5 = 0x406d +regGFX_IMU_SCRATCH_5_BASE_IDX = 1 +regGFX_IMU_SCRATCH_6 = 0x406e +regGFX_IMU_SCRATCH_6_BASE_IDX = 1 +regGFX_IMU_SCRATCH_7 = 0x406f +regGFX_IMU_SCRATCH_7_BASE_IDX = 1 +regGFX_IMU_SCRATCH_8 = 0x4070 +regGFX_IMU_SCRATCH_8_BASE_IDX = 1 +regGFX_IMU_SCRATCH_9 = 0x4071 +regGFX_IMU_SCRATCH_9_BASE_IDX = 1 +regGFX_IMU_SCRATCH_10 = 0x4072 +regGFX_IMU_SCRATCH_10_BASE_IDX = 1 +regGFX_IMU_SCRATCH_11 = 0x4073 +regGFX_IMU_SCRATCH_11_BASE_IDX = 1 +regGFX_IMU_SCRATCH_12 = 0x4074 +regGFX_IMU_SCRATCH_12_BASE_IDX = 1 +regGFX_IMU_SCRATCH_13 = 0x4075 +regGFX_IMU_SCRATCH_13_BASE_IDX = 1 +regGFX_IMU_SCRATCH_14 = 0x4076 +regGFX_IMU_SCRATCH_14_BASE_IDX = 1 +regGFX_IMU_SCRATCH_15 = 0x4077 +regGFX_IMU_SCRATCH_15_BASE_IDX = 1 +regGFX_IMU_FW_GTS_LO = 0x4078 +regGFX_IMU_FW_GTS_LO_BASE_IDX = 1 +regGFX_IMU_FW_GTS_HI = 0x4079 +regGFX_IMU_FW_GTS_HI_BASE_IDX = 1 +regGFX_IMU_GTS_OFFSET_LO = 0x407a +regGFX_IMU_GTS_OFFSET_LO_BASE_IDX = 1 +regGFX_IMU_GTS_OFFSET_HI = 0x407b +regGFX_IMU_GTS_OFFSET_HI_BASE_IDX = 1 +regGFX_IMU_RLC_GTS_OFFSET_LO = 0x407c +regGFX_IMU_RLC_GTS_OFFSET_LO_BASE_IDX = 1 +regGFX_IMU_RLC_GTS_OFFSET_HI = 0x407d +regGFX_IMU_RLC_GTS_OFFSET_HI_BASE_IDX = 1 +regGFX_IMU_CORE_INT_STATUS = 0x407f +regGFX_IMU_CORE_INT_STATUS_BASE_IDX = 1 +regGFX_IMU_PIC_INT_MASK = 0x4080 +regGFX_IMU_PIC_INT_MASK_BASE_IDX = 1 +regGFX_IMU_PIC_INT_LVL = 0x4081 +regGFX_IMU_PIC_INT_LVL_BASE_IDX = 1 +regGFX_IMU_PIC_INT_EDGE = 0x4082 +regGFX_IMU_PIC_INT_EDGE_BASE_IDX = 1 +regGFX_IMU_PIC_INT_PRI_0 = 0x4083 +regGFX_IMU_PIC_INT_PRI_0_BASE_IDX = 1 +regGFX_IMU_PIC_INT_PRI_1 = 0x4084 +regGFX_IMU_PIC_INT_PRI_1_BASE_IDX = 1 +regGFX_IMU_PIC_INT_PRI_2 = 0x4085 +regGFX_IMU_PIC_INT_PRI_2_BASE_IDX = 1 +regGFX_IMU_PIC_INT_PRI_3 = 0x4086 +regGFX_IMU_PIC_INT_PRI_3_BASE_IDX = 1 +regGFX_IMU_PIC_INT_PRI_4 = 0x4087 +regGFX_IMU_PIC_INT_PRI_4_BASE_IDX = 1 +regGFX_IMU_PIC_INT_PRI_5 = 0x4088 +regGFX_IMU_PIC_INT_PRI_5_BASE_IDX = 1 +regGFX_IMU_PIC_INT_PRI_6 = 0x4089 +regGFX_IMU_PIC_INT_PRI_6_BASE_IDX = 1 +regGFX_IMU_PIC_INT_PRI_7 = 0x408a +regGFX_IMU_PIC_INT_PRI_7_BASE_IDX = 1 +regGFX_IMU_PIC_INT_STATUS = 0x408b +regGFX_IMU_PIC_INT_STATUS_BASE_IDX = 1 +regGFX_IMU_PIC_INTR = 0x408c +regGFX_IMU_PIC_INTR_BASE_IDX = 1 +regGFX_IMU_PIC_INTR_ID = 0x408d +regGFX_IMU_PIC_INTR_ID_BASE_IDX = 1 +regGFX_IMU_IH_CTRL_1 = 0x4090 +regGFX_IMU_IH_CTRL_1_BASE_IDX = 1 +regGFX_IMU_IH_CTRL_2 = 0x4091 +regGFX_IMU_IH_CTRL_2_BASE_IDX = 1 +regGFX_IMU_IH_CTRL_3 = 0x4092 +regGFX_IMU_IH_CTRL_3_BASE_IDX = 1 +regGFX_IMU_IH_STATUS = 0x4093 +regGFX_IMU_IH_STATUS_BASE_IDX = 1 +regGFX_IMU_FUSESTRAP = 0x4094 +regGFX_IMU_SMUIO_VIDCHG_CTRL = 0x4098 +regGFX_IMU_SMUIO_VIDCHG_CTRL_BASE_IDX = 1 +regGFX_IMU_GFXCLK_BYPASS_CTRL = 0x409c +regGFX_IMU_GFXCLK_BYPASS_CTRL_BASE_IDX = 1 +regGFX_IMU_CLK_CTRL = 0x409d +regGFX_IMU_CLK_CTRL_BASE_IDX = 1 +regGFX_IMU_DOORBELL_CONTROL = 0x409e +regGFX_IMU_DOORBELL_CONTROL_BASE_IDX = 1 +regGFX_IMU_RLC_CG_CTRL = 0x40a0 +regGFX_IMU_RLC_CG_CTRL_BASE_IDX = 1 +regGFX_IMU_RLC_THROTTLE_GFX = 0x40a1 +regGFX_IMU_RLC_THROTTLE_GFX_BASE_IDX = 1 +regGFX_IMU_RLC_RESET_VECTOR = 0x40a2 +regGFX_IMU_RLC_RESET_VECTOR_BASE_IDX = 1 +regGFX_IMU_RLC_OVERRIDE = 0x40a3 +regGFX_IMU_RLC_OVERRIDE_BASE_IDX = 1 +regGFX_IMU_DPM_CONTROL = 0x40a8 +regGFX_IMU_DPM_CONTROL_BASE_IDX = 1 +regGFX_IMU_DPM_ACC = 0x40a9 +regGFX_IMU_DPM_ACC_BASE_IDX = 1 +regGFX_IMU_DPM_REF_COUNTER = 0x40aa +regGFX_IMU_DPM_REF_COUNTER_BASE_IDX = 1 +regGFX_IMU_RLC_RAM_INDEX = 0x40ac +regGFX_IMU_RLC_RAM_INDEX_BASE_IDX = 1 +regGFX_IMU_RLC_RAM_ADDR_HIGH = 0x40ad +regGFX_IMU_RLC_RAM_ADDR_HIGH_BASE_IDX = 1 +regGFX_IMU_RLC_RAM_ADDR_LOW = 0x40ae +regGFX_IMU_RLC_RAM_ADDR_LOW_BASE_IDX = 1 +regGFX_IMU_RLC_RAM_DATA = 0x40af +regGFX_IMU_RLC_RAM_DATA_BASE_IDX = 1 +regGFX_IMU_FENCE_CTRL = 0x40b0 +regGFX_IMU_FENCE_CTRL_BASE_IDX = 1 +regGFX_IMU_FENCE_LOG_INIT = 0x40b1 +regGFX_IMU_FENCE_LOG_INIT_BASE_IDX = 1 +regGFX_IMU_FENCE_LOG_ADDR = 0x40b2 +regGFX_IMU_FENCE_LOG_ADDR_BASE_IDX = 1 +regGFX_IMU_PROGRAM_CTR = 0x40b5 +regGFX_IMU_PROGRAM_CTR_BASE_IDX = 1 +regGFX_IMU_CORE_CTRL = 0x40b6 +regGFX_IMU_CORE_CTRL_BASE_IDX = 1 +regGFX_IMU_CORE_STATUS = 0x40b7 +regGFX_IMU_CORE_STATUS_BASE_IDX = 1 +regGFX_IMU_PWROKRAW = 0x40b8 +regGFX_IMU_PWROKRAW_BASE_IDX = 1 +regGFX_IMU_PWROK = 0x40b9 +regGFX_IMU_PWROK_BASE_IDX = 1 +regGFX_IMU_GAP_PWROK = 0x40ba +regGFX_IMU_GAP_PWROK_BASE_IDX = 1 +regGFX_IMU_RESETn = 0x40bb +regGFX_IMU_RESETn_BASE_IDX = 1 +regGFX_IMU_GFX_RESET_CTRL = 0x40bc +regGFX_IMU_GFX_RESET_CTRL_BASE_IDX = 1 +regGFX_IMU_AEB_OVERRIDE = 0x40bd +regGFX_IMU_AEB_OVERRIDE_BASE_IDX = 1 +regGFX_IMU_VDCI_RESET_CTRL = 0x40be +regGFX_IMU_VDCI_RESET_CTRL_BASE_IDX = 1 +regGFX_IMU_GFX_ISO_CTRL = 0x40bf +regGFX_IMU_GFX_ISO_CTRL_BASE_IDX = 1 +regGFX_IMU_TIMER0_CTRL0 = 0x40c0 +regGFX_IMU_TIMER0_CTRL0_BASE_IDX = 1 +regGFX_IMU_TIMER0_CTRL1 = 0x40c1 +regGFX_IMU_TIMER0_CTRL1_BASE_IDX = 1 +regGFX_IMU_TIMER0_CMP_AUTOINC = 0x40c2 +regGFX_IMU_TIMER0_CMP_AUTOINC_BASE_IDX = 1 +regGFX_IMU_TIMER0_CMP_INTEN = 0x40c3 +regGFX_IMU_TIMER0_CMP_INTEN_BASE_IDX = 1 +regGFX_IMU_TIMER0_CMP0 = 0x40c4 +regGFX_IMU_TIMER0_CMP0_BASE_IDX = 1 +regGFX_IMU_TIMER0_CMP1 = 0x40c5 +regGFX_IMU_TIMER0_CMP1_BASE_IDX = 1 +regGFX_IMU_TIMER0_CMP3 = 0x40c7 +regGFX_IMU_TIMER0_CMP3_BASE_IDX = 1 +regGFX_IMU_TIMER0_VALUE = 0x40c8 +regGFX_IMU_TIMER0_VALUE_BASE_IDX = 1 +regGFX_IMU_TIMER1_CTRL0 = 0x40c9 +regGFX_IMU_TIMER1_CTRL0_BASE_IDX = 1 +regGFX_IMU_TIMER1_CTRL1 = 0x40ca +regGFX_IMU_TIMER1_CTRL1_BASE_IDX = 1 +regGFX_IMU_TIMER1_CMP_AUTOINC = 0x40cb +regGFX_IMU_TIMER1_CMP_AUTOINC_BASE_IDX = 1 +regGFX_IMU_TIMER1_CMP_INTEN = 0x40cc +regGFX_IMU_TIMER1_CMP_INTEN_BASE_IDX = 1 +regGFX_IMU_TIMER1_CMP0 = 0x40cd +regGFX_IMU_TIMER1_CMP0_BASE_IDX = 1 +regGFX_IMU_TIMER1_CMP1 = 0x40ce +regGFX_IMU_TIMER1_CMP1_BASE_IDX = 1 +regGFX_IMU_TIMER1_CMP3 = 0x40d0 +regGFX_IMU_TIMER1_CMP3_BASE_IDX = 1 +regGFX_IMU_TIMER1_VALUE = 0x40d1 +regGFX_IMU_TIMER1_VALUE_BASE_IDX = 1 +regGFX_IMU_TIMER2_CTRL0 = 0x40d2 +regGFX_IMU_TIMER2_CTRL0_BASE_IDX = 1 +regGFX_IMU_TIMER2_CTRL1 = 0x40d3 +regGFX_IMU_TIMER2_CTRL1_BASE_IDX = 1 +regGFX_IMU_TIMER2_CMP_AUTOINC = 0x40d4 +regGFX_IMU_TIMER2_CMP_AUTOINC_BASE_IDX = 1 +regGFX_IMU_TIMER2_CMP_INTEN = 0x40d5 +regGFX_IMU_TIMER2_CMP_INTEN_BASE_IDX = 1 +regGFX_IMU_TIMER2_CMP0 = 0x40d6 +regGFX_IMU_TIMER2_CMP0_BASE_IDX = 1 +regGFX_IMU_TIMER2_CMP1 = 0x40d7 +regGFX_IMU_TIMER2_CMP1_BASE_IDX = 1 +regGFX_IMU_TIMER2_CMP3 = 0x40d9 +regGFX_IMU_TIMER2_CMP3_BASE_IDX = 1 +regGFX_IMU_TIMER2_VALUE = 0x40da +regGFX_IMU_TIMER2_VALUE_BASE_IDX = 1 +regGFX_IMU_FUSE_CTRL = 0x40e0 +regGFX_IMU_FUSE_CTRL_BASE_IDX = 1 +regGFX_IMU_D_RAM_ADDR = 0x40fc +regGFX_IMU_D_RAM_ADDR_BASE_IDX = 1 +regGFX_IMU_D_RAM_DATA = 0x40fd +regGFX_IMU_D_RAM_DATA_BASE_IDX = 1 +regGFX_IMU_GFX_IH_GASKET_CTRL = 0x40ff +regGFX_IMU_GFX_IH_GASKET_CTRL_BASE_IDX = 1 +regGFX_IMU_RLC_BOOTLOADER_ADDR_HI = 0x5f81 +regGFX_IMU_RLC_BOOTLOADER_ADDR_HI_BASE_IDX = 1 +regGFX_IMU_RLC_BOOTLOADER_ADDR_LO = 0x5f82 +regGFX_IMU_RLC_BOOTLOADER_ADDR_LO_BASE_IDX = 1 +regGFX_IMU_RLC_BOOTLOADER_SIZE = 0x5f83 +regGFX_IMU_RLC_BOOTLOADER_SIZE_BASE_IDX = 1 +regGFX_IMU_I_RAM_ADDR = 0x5f90 +regGFX_IMU_I_RAM_ADDR_BASE_IDX = 1 +regGFX_IMU_I_RAM_DATA = 0x5f91 +regGFX_IMU_I_RAM_DATA_BASE_IDX = 1 +ixGC_CAC_ID = 0x0000 +ixGC_CAC_CNTL = 0x0001 +ixGC_CAC_ACC_CP0 = 0x0010 +ixGC_CAC_ACC_CP1 = 0x0011 +ixGC_CAC_ACC_CP2 = 0x0012 +ixGC_CAC_ACC_EA0 = 0x0013 +ixGC_CAC_ACC_EA1 = 0x0014 +ixGC_CAC_ACC_EA2 = 0x0015 +ixGC_CAC_ACC_EA3 = 0x0016 +ixGC_CAC_ACC_EA4 = 0x0017 +ixGC_CAC_ACC_EA5 = 0x0018 +ixGC_CAC_ACC_UTCL2_ROUTER0 = 0x0019 +ixGC_CAC_ACC_UTCL2_ROUTER1 = 0x001a +ixGC_CAC_ACC_UTCL2_ROUTER2 = 0x001b +ixGC_CAC_ACC_UTCL2_ROUTER3 = 0x001c +ixGC_CAC_ACC_UTCL2_ROUTER4 = 0x001d +ixGC_CAC_ACC_UTCL2_ROUTER5 = 0x001e +ixGC_CAC_ACC_UTCL2_ROUTER6 = 0x001f +ixGC_CAC_ACC_UTCL2_ROUTER7 = 0x0020 +ixGC_CAC_ACC_UTCL2_ROUTER8 = 0x0021 +ixGC_CAC_ACC_UTCL2_ROUTER9 = 0x0022 +ixGC_CAC_ACC_UTCL2_VML20 = 0x0023 +ixGC_CAC_ACC_UTCL2_VML21 = 0x0024 +ixGC_CAC_ACC_UTCL2_VML22 = 0x0025 +ixGC_CAC_ACC_UTCL2_VML23 = 0x0026 +ixGC_CAC_ACC_UTCL2_VML24 = 0x0027 +ixGC_CAC_ACC_UTCL2_WALKER0 = 0x0028 +ixGC_CAC_ACC_UTCL2_WALKER1 = 0x0029 +ixGC_CAC_ACC_UTCL2_WALKER2 = 0x002a +ixGC_CAC_ACC_UTCL2_WALKER3 = 0x002b +ixGC_CAC_ACC_UTCL2_WALKER4 = 0x002c +ixGC_CAC_ACC_GDS0 = 0x002d +ixGC_CAC_ACC_GDS1 = 0x002e +ixGC_CAC_ACC_GDS2 = 0x002f +ixGC_CAC_ACC_GDS3 = 0x0030 +ixGC_CAC_ACC_GDS4 = 0x0031 +ixGC_CAC_ACC_GE0 = 0x0032 +ixGC_CAC_ACC_GE1 = 0x0033 +ixGC_CAC_ACC_GE2 = 0x0034 +ixGC_CAC_ACC_GE3 = 0x0035 +ixGC_CAC_ACC_GE4 = 0x0036 +ixGC_CAC_ACC_GE5 = 0x0037 +ixGC_CAC_ACC_GE6 = 0x0038 +ixGC_CAC_ACC_GE7 = 0x0039 +ixGC_CAC_ACC_GE8 = 0x003a +ixGC_CAC_ACC_GE9 = 0x003b +ixGC_CAC_ACC_GE10 = 0x003c +ixGC_CAC_ACC_GE11 = 0x003d +ixGC_CAC_ACC_GE12 = 0x003e +ixGC_CAC_ACC_GE13 = 0x003f +ixGC_CAC_ACC_GE14 = 0x0040 +ixGC_CAC_ACC_GE15 = 0x0041 +ixGC_CAC_ACC_GE16 = 0x0042 +ixGC_CAC_ACC_GE17 = 0x0043 +ixGC_CAC_ACC_GE18 = 0x0044 +ixGC_CAC_ACC_GE19 = 0x0045 +ixGC_CAC_ACC_GE20 = 0x0046 +ixGC_CAC_ACC_PMM0 = 0x0047 +ixGC_CAC_ACC_GL2C0 = 0x0048 +ixGC_CAC_ACC_GL2C1 = 0x0049 +ixGC_CAC_ACC_GL2C2 = 0x004a +ixGC_CAC_ACC_GL2C3 = 0x004b +ixGC_CAC_ACC_GL2C4 = 0x004c +ixGC_CAC_ACC_PH0 = 0x004d +ixGC_CAC_ACC_PH1 = 0x004e +ixGC_CAC_ACC_PH2 = 0x004f +ixGC_CAC_ACC_PH3 = 0x0050 +ixGC_CAC_ACC_PH4 = 0x0051 +ixGC_CAC_ACC_PH5 = 0x0052 +ixGC_CAC_ACC_PH6 = 0x0053 +ixGC_CAC_ACC_PH7 = 0x0054 +ixGC_CAC_ACC_SDMA0 = 0x0055 +ixGC_CAC_ACC_SDMA1 = 0x0056 +ixGC_CAC_ACC_SDMA2 = 0x0057 +ixGC_CAC_ACC_SDMA3 = 0x0058 +ixGC_CAC_ACC_SDMA4 = 0x0059 +ixGC_CAC_ACC_SDMA5 = 0x005a +ixGC_CAC_ACC_SDMA6 = 0x005b +ixGC_CAC_ACC_SDMA7 = 0x005c +ixGC_CAC_ACC_SDMA8 = 0x005d +ixGC_CAC_ACC_SDMA9 = 0x005e +ixGC_CAC_ACC_SDMA10 = 0x005f +ixGC_CAC_ACC_SDMA11 = 0x0060 +ixGC_CAC_ACC_CHC0 = 0x0061 +ixGC_CAC_ACC_CHC1 = 0x0062 +ixGC_CAC_ACC_CHC2 = 0x0063 +ixGC_CAC_ACC_GUS0 = 0x0064 +ixGC_CAC_ACC_GUS1 = 0x0065 +ixGC_CAC_ACC_GUS2 = 0x0066 +ixGC_CAC_ACC_RLC0 = 0x0067 +ixRELEASE_TO_STALL_LUT_1_8 = 0x0100 +ixRELEASE_TO_STALL_LUT_9_16 = 0x0101 +ixRELEASE_TO_STALL_LUT_17_20 = 0x0102 +ixSTALL_TO_RELEASE_LUT_1_4 = 0x0103 +ixSTALL_TO_RELEASE_LUT_5_7 = 0x0104 +ixSTALL_TO_PWRBRK_LUT_1_4 = 0x0105 +ixSTALL_TO_PWRBRK_LUT_5_7 = 0x0106 +ixPWRBRK_STALL_TO_RELEASE_LUT_1_4 = 0x0107 +ixPWRBRK_STALL_TO_RELEASE_LUT_5_7 = 0x0108 +ixPWRBRK_RELEASE_TO_STALL_LUT_1_8 = 0x0109 +ixPWRBRK_RELEASE_TO_STALL_LUT_9_16 = 0x010a +ixPWRBRK_RELEASE_TO_STALL_LUT_17_20 = 0x010b +ixFIXED_PATTERN_PERF_COUNTER_1 = 0x010c +ixFIXED_PATTERN_PERF_COUNTER_2 = 0x010d +ixFIXED_PATTERN_PERF_COUNTER_3 = 0x010e +ixFIXED_PATTERN_PERF_COUNTER_4 = 0x010f +ixFIXED_PATTERN_PERF_COUNTER_5 = 0x0110 +ixFIXED_PATTERN_PERF_COUNTER_6 = 0x0111 +ixFIXED_PATTERN_PERF_COUNTER_7 = 0x0112 +ixFIXED_PATTERN_PERF_COUNTER_8 = 0x0113 +ixFIXED_PATTERN_PERF_COUNTER_9 = 0x0114 +ixFIXED_PATTERN_PERF_COUNTER_10 = 0x0115 +ixHW_LUT_UPDATE_STATUS = 0x0116 +ixSE_CAC_ID = 0x0000 +ixSE_CAC_CNTL = 0x0001 +ixRTAVFS_REG0 = 0x0000 +ixRTAVFS_REG1 = 0x0001 +ixRTAVFS_REG2 = 0x0002 +ixRTAVFS_REG3 = 0x0003 +ixRTAVFS_REG4 = 0x0004 +ixRTAVFS_REG5 = 0x0005 +ixRTAVFS_REG6 = 0x0006 +ixRTAVFS_REG7 = 0x0007 +ixRTAVFS_REG8 = 0x0008 +ixRTAVFS_REG9 = 0x0009 +ixRTAVFS_REG10 = 0x000a +ixRTAVFS_REG11 = 0x000b +ixRTAVFS_REG12 = 0x000c +ixRTAVFS_REG13 = 0x000d +ixRTAVFS_REG14 = 0x000e +ixRTAVFS_REG15 = 0x000f +ixRTAVFS_REG16 = 0x0010 +ixRTAVFS_REG17 = 0x0011 +ixRTAVFS_REG18 = 0x0012 +ixRTAVFS_REG19 = 0x0013 +ixRTAVFS_REG20 = 0x0014 +ixRTAVFS_REG21 = 0x0015 +ixRTAVFS_REG22 = 0x0016 +ixRTAVFS_REG23 = 0x0017 +ixRTAVFS_REG24 = 0x0018 +ixRTAVFS_REG25 = 0x0019 +ixRTAVFS_REG26 = 0x001a +ixRTAVFS_REG27 = 0x001b +ixRTAVFS_REG28 = 0x001c +ixRTAVFS_REG29 = 0x001d +ixRTAVFS_REG30 = 0x001e +ixRTAVFS_REG31 = 0x001f +ixRTAVFS_REG32 = 0x0020 +ixRTAVFS_REG33 = 0x0021 +ixRTAVFS_REG34 = 0x0022 +ixRTAVFS_REG35 = 0x0023 +ixRTAVFS_REG36 = 0x0024 +ixRTAVFS_REG37 = 0x0025 +ixRTAVFS_REG38 = 0x0026 +ixRTAVFS_REG39 = 0x0027 +ixRTAVFS_REG40 = 0x0028 +ixRTAVFS_REG41 = 0x0029 +ixRTAVFS_REG42 = 0x002a +ixRTAVFS_REG43 = 0x002b +ixRTAVFS_REG44 = 0x002c +ixRTAVFS_REG45 = 0x002d +ixRTAVFS_REG46 = 0x002e +ixRTAVFS_REG47 = 0x002f +ixRTAVFS_REG48 = 0x0030 +ixRTAVFS_REG49 = 0x0031 +ixRTAVFS_REG50 = 0x0032 +ixRTAVFS_REG51 = 0x0033 +ixRTAVFS_REG52 = 0x0034 +ixRTAVFS_REG53 = 0x0035 +ixRTAVFS_REG54 = 0x0036 +ixRTAVFS_REG55 = 0x0037 +ixRTAVFS_REG56 = 0x0038 +ixRTAVFS_REG57 = 0x0039 +ixRTAVFS_REG58 = 0x003a +ixRTAVFS_REG59 = 0x003b +ixRTAVFS_REG60 = 0x003c +ixRTAVFS_REG61 = 0x003d +ixRTAVFS_REG62 = 0x003e +ixRTAVFS_REG63 = 0x003f +ixRTAVFS_REG64 = 0x0040 +ixRTAVFS_REG65 = 0x0041 +ixRTAVFS_REG66 = 0x0042 +ixRTAVFS_REG67 = 0x0043 +ixRTAVFS_REG68 = 0x0044 +ixRTAVFS_REG69 = 0x0045 +ixRTAVFS_REG70 = 0x0046 +ixRTAVFS_REG71 = 0x0047 +ixRTAVFS_REG72 = 0x0048 +ixRTAVFS_REG73 = 0x0049 +ixRTAVFS_REG74 = 0x004a +ixRTAVFS_REG75 = 0x004b +ixRTAVFS_REG76 = 0x004c +ixRTAVFS_REG77 = 0x004d +ixRTAVFS_REG78 = 0x004e +ixRTAVFS_REG79 = 0x004f +ixRTAVFS_REG80 = 0x0050 +ixRTAVFS_REG81 = 0x0051 +ixRTAVFS_REG82 = 0x0052 +ixRTAVFS_REG83 = 0x0053 +ixRTAVFS_REG84 = 0x0054 +ixRTAVFS_REG85 = 0x0055 +ixRTAVFS_REG86 = 0x0056 +ixRTAVFS_REG87 = 0x0057 +ixRTAVFS_REG88 = 0x0058 +ixRTAVFS_REG89 = 0x0059 +ixRTAVFS_REG90 = 0x005a +ixRTAVFS_REG91 = 0x005b +ixRTAVFS_REG92 = 0x005c +ixRTAVFS_REG93 = 0x005d +ixRTAVFS_REG94 = 0x005e +ixRTAVFS_REG95 = 0x005f +ixRTAVFS_REG96 = 0x0060 +ixRTAVFS_REG97 = 0x0061 +ixRTAVFS_REG98 = 0x0062 +ixRTAVFS_REG99 = 0x0063 +ixRTAVFS_REG100 = 0x0064 +ixRTAVFS_REG101 = 0x0065 +ixRTAVFS_REG102 = 0x0066 +ixRTAVFS_REG103 = 0x0067 +ixRTAVFS_REG104 = 0x0068 +ixRTAVFS_REG105 = 0x0069 +ixRTAVFS_REG106 = 0x006a +ixRTAVFS_REG107 = 0x006b +ixRTAVFS_REG108 = 0x006c +ixRTAVFS_REG109 = 0x006d +ixRTAVFS_REG110 = 0x006e +ixRTAVFS_REG111 = 0x006f +ixRTAVFS_REG112 = 0x0070 +ixRTAVFS_REG113 = 0x0071 +ixRTAVFS_REG114 = 0x0072 +ixRTAVFS_REG115 = 0x0073 +ixRTAVFS_REG116 = 0x0074 +ixRTAVFS_REG117 = 0x0075 +ixRTAVFS_REG118 = 0x0076 +ixRTAVFS_REG119 = 0x0077 +ixRTAVFS_REG120 = 0x0078 +ixRTAVFS_REG121 = 0x0079 +ixRTAVFS_REG122 = 0x007a +ixRTAVFS_REG123 = 0x007b +ixRTAVFS_REG124 = 0x007c +ixRTAVFS_REG125 = 0x007d +ixRTAVFS_REG126 = 0x007e +ixRTAVFS_REG127 = 0x007f +ixRTAVFS_REG128 = 0x0080 +ixRTAVFS_REG129 = 0x0081 +ixRTAVFS_REG130 = 0x0082 +ixRTAVFS_REG131 = 0x0083 +ixRTAVFS_REG132 = 0x0084 +ixRTAVFS_REG133 = 0x0085 +ixRTAVFS_REG134 = 0x0086 +ixRTAVFS_REG135 = 0x0087 +ixRTAVFS_REG136 = 0x0088 +ixRTAVFS_REG137 = 0x0089 +ixRTAVFS_REG138 = 0x008a +ixRTAVFS_REG139 = 0x008b +ixRTAVFS_REG140 = 0x008c +ixRTAVFS_REG141 = 0x008d +ixRTAVFS_REG142 = 0x008e +ixRTAVFS_REG143 = 0x008f +ixRTAVFS_REG144 = 0x0090 +ixRTAVFS_REG145 = 0x0091 +ixRTAVFS_REG146 = 0x0092 +ixRTAVFS_REG147 = 0x0093 +ixRTAVFS_REG148 = 0x0094 +ixRTAVFS_REG149 = 0x0095 +ixRTAVFS_REG150 = 0x0096 +ixRTAVFS_REG151 = 0x0097 +ixRTAVFS_REG152 = 0x0098 +ixRTAVFS_REG153 = 0x0099 +ixRTAVFS_REG154 = 0x009a +ixRTAVFS_REG155 = 0x009b +ixRTAVFS_REG156 = 0x009c +ixRTAVFS_REG157 = 0x009d +ixRTAVFS_REG158 = 0x009e +ixRTAVFS_REG159 = 0x009f +ixRTAVFS_REG160 = 0x00a0 +ixRTAVFS_REG161 = 0x00a1 +ixRTAVFS_REG162 = 0x00a2 +ixRTAVFS_REG163 = 0x00a3 +ixRTAVFS_REG164 = 0x00a4 +ixRTAVFS_REG165 = 0x00a5 +ixRTAVFS_REG166 = 0x00a6 +ixRTAVFS_REG167 = 0x00a7 +ixRTAVFS_REG168 = 0x00a8 +ixRTAVFS_REG169 = 0x00a9 +ixRTAVFS_REG170 = 0x00aa +ixRTAVFS_REG171 = 0x00ab +ixRTAVFS_REG172 = 0x00ac +ixRTAVFS_REG173 = 0x00ad +ixRTAVFS_REG174 = 0x00ae +ixRTAVFS_REG175 = 0x00af +ixRTAVFS_REG176 = 0x00b0 +ixRTAVFS_REG177 = 0x00b1 +ixRTAVFS_REG178 = 0x00b2 +ixRTAVFS_REG179 = 0x00b3 +ixRTAVFS_REG180 = 0x00b4 +ixRTAVFS_REG181 = 0x00b5 +ixRTAVFS_REG182 = 0x00b6 +ixRTAVFS_REG183 = 0x00b7 +ixRTAVFS_REG184 = 0x00b8 +ixRTAVFS_REG185 = 0x00b9 +ixRTAVFS_REG186 = 0x00ba +ixRTAVFS_REG187 = 0x00bb +ixRTAVFS_REG188 = 0x00bc +ixRTAVFS_REG189 = 0x00bd +ixRTAVFS_REG190 = 0x00be +ixRTAVFS_REG191 = 0x00bf +ixRTAVFS_REG192 = 0x00c0 +ixRTAVFS_REG193 = 0x00c1 +ixRTAVFS_REG194 = 0x00c2 +ixSQ_DEBUG_STS_LOCAL = 0x0008 +ixSQ_DEBUG_CTRL_LOCAL = 0x0009 +ixSQ_WAVE_ACTIVE = 0x000a +ixSQ_WAVE_VALID_AND_IDLE = 0x000b +ixSQ_WAVE_MODE = 0x0101 +ixSQ_WAVE_STATUS = 0x0102 +ixSQ_WAVE_TRAPSTS = 0x0103 +ixSQ_WAVE_GPR_ALLOC = 0x0105 +ixSQ_WAVE_LDS_ALLOC = 0x0106 +ixSQ_WAVE_IB_STS = 0x0107 +ixSQ_WAVE_PC_LO = 0x0108 +ixSQ_WAVE_PC_HI = 0x0109 +ixSQ_WAVE_IB_DBG1 = 0x010d +ixSQ_WAVE_FLUSH_IB = 0x010e +ixSQ_WAVE_FLAT_SCRATCH_LO = 0x0114 +ixSQ_WAVE_FLAT_SCRATCH_HI = 0x0115 +ixSQ_WAVE_HW_ID1 = 0x0117 +ixSQ_WAVE_HW_ID2 = 0x0118 +ixSQ_WAVE_POPS_PACKER = 0x0119 +ixSQ_WAVE_SCHED_MODE = 0x011a +ixSQ_WAVE_IB_STS2 = 0x011c +ixSQ_WAVE_SHADER_CYCLES = 0x011d +ixSQ_WAVE_TTMP0 = 0x026c +ixSQ_WAVE_TTMP1 = 0x026d +ixSQ_WAVE_TTMP3 = 0x026f +ixSQ_WAVE_TTMP4 = 0x0270 +ixSQ_WAVE_TTMP5 = 0x0271 +ixSQ_WAVE_TTMP6 = 0x0272 +ixSQ_WAVE_TTMP7 = 0x0273 +ixSQ_WAVE_TTMP8 = 0x0274 +ixSQ_WAVE_TTMP9 = 0x0275 +ixSQ_WAVE_TTMP10 = 0x0276 +ixSQ_WAVE_TTMP11 = 0x0277 +ixSQ_WAVE_TTMP12 = 0x0278 +ixSQ_WAVE_TTMP13 = 0x0279 +ixSQ_WAVE_TTMP14 = 0x027a +ixSQ_WAVE_TTMP15 = 0x027b +ixSQ_WAVE_M0 = 0x027d +ixSQ_WAVE_EXEC_LO = 0x027e +ixSQ_WAVE_EXEC_HI = 0x027f +MAX_INSTANCE = 7 +MAX_SEGMENT = 5 +ATHUB_BASE__INST0_SEG0 = 0x00000C00 +ATHUB_BASE__INST0_SEG1 = 0x02408C00 +ATHUB_BASE__INST0_SEG2 = 0 +ATHUB_BASE__INST0_SEG3 = 0 +ATHUB_BASE__INST0_SEG4 = 0 +ATHUB_BASE__INST1_SEG0 = 0 +ATHUB_BASE__INST1_SEG1 = 0 +ATHUB_BASE__INST1_SEG2 = 0 +ATHUB_BASE__INST1_SEG3 = 0 +ATHUB_BASE__INST1_SEG4 = 0 +ATHUB_BASE__INST2_SEG0 = 0 +ATHUB_BASE__INST2_SEG1 = 0 +ATHUB_BASE__INST2_SEG2 = 0 +ATHUB_BASE__INST2_SEG3 = 0 +ATHUB_BASE__INST2_SEG4 = 0 +ATHUB_BASE__INST3_SEG0 = 0 +ATHUB_BASE__INST3_SEG1 = 0 +ATHUB_BASE__INST3_SEG2 = 0 +ATHUB_BASE__INST3_SEG3 = 0 +ATHUB_BASE__INST3_SEG4 = 0 +ATHUB_BASE__INST4_SEG0 = 0 +ATHUB_BASE__INST4_SEG1 = 0 +ATHUB_BASE__INST4_SEG2 = 0 +ATHUB_BASE__INST4_SEG3 = 0 +ATHUB_BASE__INST4_SEG4 = 0 +ATHUB_BASE__INST5_SEG0 = 0 +ATHUB_BASE__INST5_SEG1 = 0 +ATHUB_BASE__INST5_SEG2 = 0 +ATHUB_BASE__INST5_SEG3 = 0 +ATHUB_BASE__INST5_SEG4 = 0 +ATHUB_BASE__INST6_SEG0 = 0 +ATHUB_BASE__INST6_SEG1 = 0 +ATHUB_BASE__INST6_SEG2 = 0 +ATHUB_BASE__INST6_SEG3 = 0 +ATHUB_BASE__INST6_SEG4 = 0 +CLK_BASE__INST0_SEG0 = 0x00016C00 +CLK_BASE__INST0_SEG1 = 0x02401800 +CLK_BASE__INST0_SEG2 = 0 +CLK_BASE__INST0_SEG3 = 0 +CLK_BASE__INST0_SEG4 = 0 +CLK_BASE__INST1_SEG0 = 0x00016E00 +CLK_BASE__INST1_SEG1 = 0x02401C00 +CLK_BASE__INST1_SEG2 = 0 +CLK_BASE__INST1_SEG3 = 0 +CLK_BASE__INST1_SEG4 = 0 +CLK_BASE__INST2_SEG0 = 0x00017000 +CLK_BASE__INST2_SEG1 = 0x02402000 +CLK_BASE__INST2_SEG2 = 0 +CLK_BASE__INST2_SEG3 = 0 +CLK_BASE__INST2_SEG4 = 0 +CLK_BASE__INST3_SEG0 = 0x00017200 +CLK_BASE__INST3_SEG1 = 0x02402400 +CLK_BASE__INST3_SEG2 = 0 +CLK_BASE__INST3_SEG3 = 0 +CLK_BASE__INST3_SEG4 = 0 +CLK_BASE__INST4_SEG0 = 0x0001B000 +CLK_BASE__INST4_SEG1 = 0x0242D800 +CLK_BASE__INST4_SEG2 = 0 +CLK_BASE__INST4_SEG3 = 0 +CLK_BASE__INST4_SEG4 = 0 +CLK_BASE__INST5_SEG0 = 0x0001B200 +CLK_BASE__INST5_SEG1 = 0x0242DC00 +CLK_BASE__INST5_SEG2 = 0 +CLK_BASE__INST5_SEG3 = 0 +CLK_BASE__INST5_SEG4 = 0 +CLK_BASE__INST6_SEG0 = 0x0001B400 +CLK_BASE__INST6_SEG1 = 0x0242E000 +CLK_BASE__INST6_SEG2 = 0 +CLK_BASE__INST6_SEG3 = 0 +CLK_BASE__INST6_SEG4 = 0 +DF_BASE__INST0_SEG0 = 0x00007000 +DF_BASE__INST0_SEG1 = 0x0240B800 +DF_BASE__INST0_SEG2 = 0 +DF_BASE__INST0_SEG3 = 0 +DF_BASE__INST0_SEG4 = 0 +DF_BASE__INST1_SEG0 = 0 +DF_BASE__INST1_SEG1 = 0 +DF_BASE__INST1_SEG2 = 0 +DF_BASE__INST1_SEG3 = 0 +DF_BASE__INST1_SEG4 = 0 +DF_BASE__INST2_SEG0 = 0 +DF_BASE__INST2_SEG1 = 0 +DF_BASE__INST2_SEG2 = 0 +DF_BASE__INST2_SEG3 = 0 +DF_BASE__INST2_SEG4 = 0 +DF_BASE__INST3_SEG0 = 0 +DF_BASE__INST3_SEG1 = 0 +DF_BASE__INST3_SEG2 = 0 +DF_BASE__INST3_SEG3 = 0 +DF_BASE__INST3_SEG4 = 0 +DF_BASE__INST4_SEG0 = 0 +DF_BASE__INST4_SEG1 = 0 +DF_BASE__INST4_SEG2 = 0 +DF_BASE__INST4_SEG3 = 0 +DF_BASE__INST4_SEG4 = 0 +DF_BASE__INST5_SEG0 = 0 +DF_BASE__INST5_SEG1 = 0 +DF_BASE__INST5_SEG2 = 0 +DF_BASE__INST5_SEG3 = 0 +DF_BASE__INST5_SEG4 = 0 +DF_BASE__INST6_SEG0 = 0 +DF_BASE__INST6_SEG1 = 0 +DF_BASE__INST6_SEG2 = 0 +DF_BASE__INST6_SEG3 = 0 +DF_BASE__INST6_SEG4 = 0 +DIO_BASE__INST0_SEG0 = 0x02404000 +DIO_BASE__INST0_SEG1 = 0 +DIO_BASE__INST0_SEG2 = 0 +DIO_BASE__INST0_SEG3 = 0 +DIO_BASE__INST0_SEG4 = 0 +DIO_BASE__INST1_SEG0 = 0 +DIO_BASE__INST1_SEG1 = 0 +DIO_BASE__INST1_SEG2 = 0 +DIO_BASE__INST1_SEG3 = 0 +DIO_BASE__INST1_SEG4 = 0 +DIO_BASE__INST2_SEG0 = 0 +DIO_BASE__INST2_SEG1 = 0 +DIO_BASE__INST2_SEG2 = 0 +DIO_BASE__INST2_SEG3 = 0 +DIO_BASE__INST2_SEG4 = 0 +DIO_BASE__INST3_SEG0 = 0 +DIO_BASE__INST3_SEG1 = 0 +DIO_BASE__INST3_SEG2 = 0 +DIO_BASE__INST3_SEG3 = 0 +DIO_BASE__INST3_SEG4 = 0 +DIO_BASE__INST4_SEG0 = 0 +DIO_BASE__INST4_SEG1 = 0 +DIO_BASE__INST4_SEG2 = 0 +DIO_BASE__INST4_SEG3 = 0 +DIO_BASE__INST4_SEG4 = 0 +DIO_BASE__INST5_SEG0 = 0 +DIO_BASE__INST5_SEG1 = 0 +DIO_BASE__INST5_SEG2 = 0 +DIO_BASE__INST5_SEG3 = 0 +DIO_BASE__INST5_SEG4 = 0 +DIO_BASE__INST6_SEG0 = 0 +DIO_BASE__INST6_SEG1 = 0 +DIO_BASE__INST6_SEG2 = 0 +DIO_BASE__INST6_SEG3 = 0 +DIO_BASE__INST6_SEG4 = 0 +DCN_BASE__INST0_SEG0 = 0x00000012 +DCN_BASE__INST0_SEG1 = 0x000000C0 +DCN_BASE__INST0_SEG2 = 0x000034C0 +DCN_BASE__INST0_SEG3 = 0x00009000 +DCN_BASE__INST0_SEG4 = 0x02403C00 +DCN_BASE__INST1_SEG0 = 0 +DCN_BASE__INST1_SEG1 = 0 +DCN_BASE__INST1_SEG2 = 0 +DCN_BASE__INST1_SEG3 = 0 +DCN_BASE__INST1_SEG4 = 0 +DCN_BASE__INST2_SEG0 = 0 +DCN_BASE__INST2_SEG1 = 0 +DCN_BASE__INST2_SEG2 = 0 +DCN_BASE__INST2_SEG3 = 0 +DCN_BASE__INST2_SEG4 = 0 +DCN_BASE__INST3_SEG0 = 0 +DCN_BASE__INST3_SEG1 = 0 +DCN_BASE__INST3_SEG2 = 0 +DCN_BASE__INST3_SEG3 = 0 +DCN_BASE__INST3_SEG4 = 0 +DCN_BASE__INST4_SEG0 = 0 +DCN_BASE__INST4_SEG1 = 0 +DCN_BASE__INST4_SEG2 = 0 +DCN_BASE__INST4_SEG3 = 0 +DCN_BASE__INST4_SEG4 = 0 +DCN_BASE__INST5_SEG0 = 0 +DCN_BASE__INST5_SEG1 = 0 +DCN_BASE__INST5_SEG2 = 0 +DCN_BASE__INST5_SEG3 = 0 +DCN_BASE__INST5_SEG4 = 0 +DCN_BASE__INST6_SEG0 = 0 +DCN_BASE__INST6_SEG1 = 0 +DCN_BASE__INST6_SEG2 = 0 +DCN_BASE__INST6_SEG3 = 0 +DCN_BASE__INST6_SEG4 = 0 +DPCS_BASE__INST0_SEG0 = 0x00000012 +DPCS_BASE__INST0_SEG1 = 0x000000C0 +DPCS_BASE__INST0_SEG2 = 0x000034C0 +DPCS_BASE__INST0_SEG3 = 0x00009000 +DPCS_BASE__INST0_SEG4 = 0x02403C00 +DPCS_BASE__INST1_SEG0 = 0 +DPCS_BASE__INST1_SEG1 = 0 +DPCS_BASE__INST1_SEG2 = 0 +DPCS_BASE__INST1_SEG3 = 0 +DPCS_BASE__INST1_SEG4 = 0 +DPCS_BASE__INST2_SEG0 = 0 +DPCS_BASE__INST2_SEG1 = 0 +DPCS_BASE__INST2_SEG2 = 0 +DPCS_BASE__INST2_SEG3 = 0 +DPCS_BASE__INST2_SEG4 = 0 +DPCS_BASE__INST3_SEG0 = 0 +DPCS_BASE__INST3_SEG1 = 0 +DPCS_BASE__INST3_SEG2 = 0 +DPCS_BASE__INST3_SEG3 = 0 +DPCS_BASE__INST3_SEG4 = 0 +DPCS_BASE__INST4_SEG0 = 0 +DPCS_BASE__INST4_SEG1 = 0 +DPCS_BASE__INST4_SEG2 = 0 +DPCS_BASE__INST4_SEG3 = 0 +DPCS_BASE__INST4_SEG4 = 0 +DPCS_BASE__INST5_SEG0 = 0 +DPCS_BASE__INST5_SEG1 = 0 +DPCS_BASE__INST5_SEG2 = 0 +DPCS_BASE__INST5_SEG3 = 0 +DPCS_BASE__INST5_SEG4 = 0 +DPCS_BASE__INST6_SEG0 = 0 +DPCS_BASE__INST6_SEG1 = 0 +DPCS_BASE__INST6_SEG2 = 0 +DPCS_BASE__INST6_SEG3 = 0 +DPCS_BASE__INST6_SEG4 = 0 +FUSE_BASE__INST0_SEG0 = 0x00017400 +FUSE_BASE__INST0_SEG1 = 0x02401400 +FUSE_BASE__INST0_SEG2 = 0 +FUSE_BASE__INST0_SEG3 = 0 +FUSE_BASE__INST0_SEG4 = 0 +FUSE_BASE__INST1_SEG0 = 0 +FUSE_BASE__INST1_SEG1 = 0 +FUSE_BASE__INST1_SEG2 = 0 +FUSE_BASE__INST1_SEG3 = 0 +FUSE_BASE__INST1_SEG4 = 0 +FUSE_BASE__INST2_SEG0 = 0 +FUSE_BASE__INST2_SEG1 = 0 +FUSE_BASE__INST2_SEG2 = 0 +FUSE_BASE__INST2_SEG3 = 0 +FUSE_BASE__INST2_SEG4 = 0 +FUSE_BASE__INST3_SEG0 = 0 +FUSE_BASE__INST3_SEG1 = 0 +FUSE_BASE__INST3_SEG2 = 0 +FUSE_BASE__INST3_SEG3 = 0 +FUSE_BASE__INST3_SEG4 = 0 +FUSE_BASE__INST4_SEG0 = 0 +FUSE_BASE__INST4_SEG1 = 0 +FUSE_BASE__INST4_SEG2 = 0 +FUSE_BASE__INST4_SEG3 = 0 +FUSE_BASE__INST4_SEG4 = 0 +FUSE_BASE__INST5_SEG0 = 0 +FUSE_BASE__INST5_SEG1 = 0 +FUSE_BASE__INST5_SEG2 = 0 +FUSE_BASE__INST5_SEG3 = 0 +FUSE_BASE__INST5_SEG4 = 0 +FUSE_BASE__INST6_SEG0 = 0 +FUSE_BASE__INST6_SEG1 = 0 +FUSE_BASE__INST6_SEG2 = 0 +FUSE_BASE__INST6_SEG3 = 0 +FUSE_BASE__INST6_SEG4 = 0 +GC_BASE__INST0_SEG0 = 0x00001260 +GC_BASE__INST0_SEG1 = 0x0000A000 +GC_BASE__INST0_SEG2 = 0x0001C000 +GC_BASE__INST0_SEG3 = 0x02402C00 +GC_BASE__INST0_SEG4 = 0 +GC_BASE__INST1_SEG0 = 0 +GC_BASE__INST1_SEG1 = 0 +GC_BASE__INST1_SEG2 = 0 +GC_BASE__INST1_SEG3 = 0 +GC_BASE__INST1_SEG4 = 0 +GC_BASE__INST2_SEG0 = 0 +GC_BASE__INST2_SEG1 = 0 +GC_BASE__INST2_SEG2 = 0 +GC_BASE__INST2_SEG3 = 0 +GC_BASE__INST2_SEG4 = 0 +GC_BASE__INST3_SEG0 = 0 +GC_BASE__INST3_SEG1 = 0 +GC_BASE__INST3_SEG2 = 0 +GC_BASE__INST3_SEG3 = 0 +GC_BASE__INST3_SEG4 = 0 +GC_BASE__INST4_SEG0 = 0 +GC_BASE__INST4_SEG1 = 0 +GC_BASE__INST4_SEG2 = 0 +GC_BASE__INST4_SEG3 = 0 +GC_BASE__INST4_SEG4 = 0 +GC_BASE__INST5_SEG0 = 0 +GC_BASE__INST5_SEG1 = 0 +GC_BASE__INST5_SEG2 = 0 +GC_BASE__INST5_SEG3 = 0 +GC_BASE__INST5_SEG4 = 0 +GC_BASE__INST6_SEG0 = 0 +GC_BASE__INST6_SEG1 = 0 +GC_BASE__INST6_SEG2 = 0 +GC_BASE__INST6_SEG3 = 0 +GC_BASE__INST6_SEG4 = 0 +HDA_BASE__INST0_SEG0 = 0x004C0000 +HDA_BASE__INST0_SEG1 = 0x02404800 +HDA_BASE__INST0_SEG2 = 0 +HDA_BASE__INST0_SEG3 = 0 +HDA_BASE__INST0_SEG4 = 0 +HDA_BASE__INST1_SEG0 = 0 +HDA_BASE__INST1_SEG1 = 0 +HDA_BASE__INST1_SEG2 = 0 +HDA_BASE__INST1_SEG3 = 0 +HDA_BASE__INST1_SEG4 = 0 +HDA_BASE__INST2_SEG0 = 0 +HDA_BASE__INST2_SEG1 = 0 +HDA_BASE__INST2_SEG2 = 0 +HDA_BASE__INST2_SEG3 = 0 +HDA_BASE__INST2_SEG4 = 0 +HDA_BASE__INST3_SEG0 = 0 +HDA_BASE__INST3_SEG1 = 0 +HDA_BASE__INST3_SEG2 = 0 +HDA_BASE__INST3_SEG3 = 0 +HDA_BASE__INST3_SEG4 = 0 +HDA_BASE__INST4_SEG0 = 0 +HDA_BASE__INST4_SEG1 = 0 +HDA_BASE__INST4_SEG2 = 0 +HDA_BASE__INST4_SEG3 = 0 +HDA_BASE__INST4_SEG4 = 0 +HDA_BASE__INST5_SEG0 = 0 +HDA_BASE__INST5_SEG1 = 0 +HDA_BASE__INST5_SEG2 = 0 +HDA_BASE__INST5_SEG3 = 0 +HDA_BASE__INST5_SEG4 = 0 +HDA_BASE__INST6_SEG0 = 0 +HDA_BASE__INST6_SEG1 = 0 +HDA_BASE__INST6_SEG2 = 0 +HDA_BASE__INST6_SEG3 = 0 +HDA_BASE__INST6_SEG4 = 0 +HDP_BASE__INST0_SEG0 = 0x00000F20 +HDP_BASE__INST0_SEG1 = 0x0240A400 +HDP_BASE__INST0_SEG2 = 0 +HDP_BASE__INST0_SEG3 = 0 +HDP_BASE__INST0_SEG4 = 0 +HDP_BASE__INST1_SEG0 = 0 +HDP_BASE__INST1_SEG1 = 0 +HDP_BASE__INST1_SEG2 = 0 +HDP_BASE__INST1_SEG3 = 0 +HDP_BASE__INST1_SEG4 = 0 +HDP_BASE__INST2_SEG0 = 0 +HDP_BASE__INST2_SEG1 = 0 +HDP_BASE__INST2_SEG2 = 0 +HDP_BASE__INST2_SEG3 = 0 +HDP_BASE__INST2_SEG4 = 0 +HDP_BASE__INST3_SEG0 = 0 +HDP_BASE__INST3_SEG1 = 0 +HDP_BASE__INST3_SEG2 = 0 +HDP_BASE__INST3_SEG3 = 0 +HDP_BASE__INST3_SEG4 = 0 +HDP_BASE__INST4_SEG0 = 0 +HDP_BASE__INST4_SEG1 = 0 +HDP_BASE__INST4_SEG2 = 0 +HDP_BASE__INST4_SEG3 = 0 +HDP_BASE__INST4_SEG4 = 0 +HDP_BASE__INST5_SEG0 = 0 +HDP_BASE__INST5_SEG1 = 0 +HDP_BASE__INST5_SEG2 = 0 +HDP_BASE__INST5_SEG3 = 0 +HDP_BASE__INST5_SEG4 = 0 +HDP_BASE__INST6_SEG0 = 0 +HDP_BASE__INST6_SEG1 = 0 +HDP_BASE__INST6_SEG2 = 0 +HDP_BASE__INST6_SEG3 = 0 +HDP_BASE__INST6_SEG4 = 0 +MMHUB_BASE__INST0_SEG0 = 0x0001A000 +MMHUB_BASE__INST0_SEG1 = 0x02408800 +MMHUB_BASE__INST0_SEG2 = 0 +MMHUB_BASE__INST0_SEG3 = 0 +MMHUB_BASE__INST0_SEG4 = 0 +MMHUB_BASE__INST1_SEG0 = 0 +MMHUB_BASE__INST1_SEG1 = 0 +MMHUB_BASE__INST1_SEG2 = 0 +MMHUB_BASE__INST1_SEG3 = 0 +MMHUB_BASE__INST1_SEG4 = 0 +MMHUB_BASE__INST2_SEG0 = 0 +MMHUB_BASE__INST2_SEG1 = 0 +MMHUB_BASE__INST2_SEG2 = 0 +MMHUB_BASE__INST2_SEG3 = 0 +MMHUB_BASE__INST2_SEG4 = 0 +MMHUB_BASE__INST3_SEG0 = 0 +MMHUB_BASE__INST3_SEG1 = 0 +MMHUB_BASE__INST3_SEG2 = 0 +MMHUB_BASE__INST3_SEG3 = 0 +MMHUB_BASE__INST3_SEG4 = 0 +MMHUB_BASE__INST4_SEG0 = 0 +MMHUB_BASE__INST4_SEG1 = 0 +MMHUB_BASE__INST4_SEG2 = 0 +MMHUB_BASE__INST4_SEG3 = 0 +MMHUB_BASE__INST4_SEG4 = 0 +MMHUB_BASE__INST5_SEG0 = 0 +MMHUB_BASE__INST5_SEG1 = 0 +MMHUB_BASE__INST5_SEG2 = 0 +MMHUB_BASE__INST5_SEG3 = 0 +MMHUB_BASE__INST5_SEG4 = 0 +MMHUB_BASE__INST6_SEG0 = 0 +MMHUB_BASE__INST6_SEG1 = 0 +MMHUB_BASE__INST6_SEG2 = 0 +MMHUB_BASE__INST6_SEG3 = 0 +MMHUB_BASE__INST6_SEG4 = 0 +MP0_BASE__INST0_SEG0 = 0x00016000 +MP0_BASE__INST0_SEG1 = 0x00DC0000 +MP0_BASE__INST0_SEG2 = 0x00E00000 +MP0_BASE__INST0_SEG3 = 0x00E40000 +MP0_BASE__INST0_SEG4 = 0x0243FC00 +MP0_BASE__INST1_SEG0 = 0 +MP0_BASE__INST1_SEG1 = 0 +MP0_BASE__INST1_SEG2 = 0 +MP0_BASE__INST1_SEG3 = 0 +MP0_BASE__INST1_SEG4 = 0 +MP0_BASE__INST2_SEG0 = 0 +MP0_BASE__INST2_SEG1 = 0 +MP0_BASE__INST2_SEG2 = 0 +MP0_BASE__INST2_SEG3 = 0 +MP0_BASE__INST2_SEG4 = 0 +MP0_BASE__INST3_SEG0 = 0 +MP0_BASE__INST3_SEG1 = 0 +MP0_BASE__INST3_SEG2 = 0 +MP0_BASE__INST3_SEG3 = 0 +MP0_BASE__INST3_SEG4 = 0 +MP0_BASE__INST4_SEG0 = 0 +MP0_BASE__INST4_SEG1 = 0 +MP0_BASE__INST4_SEG2 = 0 +MP0_BASE__INST4_SEG3 = 0 +MP0_BASE__INST4_SEG4 = 0 +MP0_BASE__INST5_SEG0 = 0 +MP0_BASE__INST5_SEG1 = 0 +MP0_BASE__INST5_SEG2 = 0 +MP0_BASE__INST5_SEG3 = 0 +MP0_BASE__INST5_SEG4 = 0 +MP0_BASE__INST6_SEG0 = 0 +MP0_BASE__INST6_SEG1 = 0 +MP0_BASE__INST6_SEG2 = 0 +MP0_BASE__INST6_SEG3 = 0 +MP0_BASE__INST6_SEG4 = 0 +MP1_BASE__INST0_SEG0 = 0x00016000 +MP1_BASE__INST0_SEG1 = 0x00DC0000 +MP1_BASE__INST0_SEG2 = 0x00E00000 +MP1_BASE__INST0_SEG3 = 0x00E40000 +MP1_BASE__INST0_SEG4 = 0x0243FC00 +MP1_BASE__INST1_SEG0 = 0 +MP1_BASE__INST1_SEG1 = 0 +MP1_BASE__INST1_SEG2 = 0 +MP1_BASE__INST1_SEG3 = 0 +MP1_BASE__INST1_SEG4 = 0 +MP1_BASE__INST2_SEG0 = 0 +MP1_BASE__INST2_SEG1 = 0 +MP1_BASE__INST2_SEG2 = 0 +MP1_BASE__INST2_SEG3 = 0 +MP1_BASE__INST2_SEG4 = 0 +MP1_BASE__INST3_SEG0 = 0 +MP1_BASE__INST3_SEG1 = 0 +MP1_BASE__INST3_SEG2 = 0 +MP1_BASE__INST3_SEG3 = 0 +MP1_BASE__INST3_SEG4 = 0 +MP1_BASE__INST4_SEG0 = 0 +MP1_BASE__INST4_SEG1 = 0 +MP1_BASE__INST4_SEG2 = 0 +MP1_BASE__INST4_SEG3 = 0 +MP1_BASE__INST4_SEG4 = 0 +MP1_BASE__INST5_SEG0 = 0 +MP1_BASE__INST5_SEG1 = 0 +MP1_BASE__INST5_SEG2 = 0 +MP1_BASE__INST5_SEG3 = 0 +MP1_BASE__INST5_SEG4 = 0 +MP1_BASE__INST6_SEG0 = 0 +MP1_BASE__INST6_SEG1 = 0 +MP1_BASE__INST6_SEG2 = 0 +MP1_BASE__INST6_SEG3 = 0 +MP1_BASE__INST6_SEG4 = 0 +NBIO_BASE__INST0_SEG0 = 0x00000000 +NBIO_BASE__INST0_SEG1 = 0x00000014 +NBIO_BASE__INST0_SEG2 = 0x00000D20 +NBIO_BASE__INST0_SEG3 = 0x00010400 +NBIO_BASE__INST0_SEG4 = 0x0241B000 +NBIO_BASE__INST1_SEG0 = 0 +NBIO_BASE__INST1_SEG1 = 0 +NBIO_BASE__INST1_SEG2 = 0 +NBIO_BASE__INST1_SEG3 = 0 +NBIO_BASE__INST1_SEG4 = 0 +NBIO_BASE__INST2_SEG0 = 0 +NBIO_BASE__INST2_SEG1 = 0 +NBIO_BASE__INST2_SEG2 = 0 +NBIO_BASE__INST2_SEG3 = 0 +NBIO_BASE__INST2_SEG4 = 0 +NBIO_BASE__INST3_SEG0 = 0 +NBIO_BASE__INST3_SEG1 = 0 +NBIO_BASE__INST3_SEG2 = 0 +NBIO_BASE__INST3_SEG3 = 0 +NBIO_BASE__INST3_SEG4 = 0 +NBIO_BASE__INST4_SEG0 = 0 +NBIO_BASE__INST4_SEG1 = 0 +NBIO_BASE__INST4_SEG2 = 0 +NBIO_BASE__INST4_SEG3 = 0 +NBIO_BASE__INST4_SEG4 = 0 +NBIO_BASE__INST5_SEG0 = 0 +NBIO_BASE__INST5_SEG1 = 0 +NBIO_BASE__INST5_SEG2 = 0 +NBIO_BASE__INST5_SEG3 = 0 +NBIO_BASE__INST5_SEG4 = 0 +NBIO_BASE__INST6_SEG0 = 0 +NBIO_BASE__INST6_SEG1 = 0 +NBIO_BASE__INST6_SEG2 = 0 +NBIO_BASE__INST6_SEG3 = 0 +NBIO_BASE__INST6_SEG4 = 0 +OSSSYS_BASE__INST0_SEG0 = 0x000010A0 +OSSSYS_BASE__INST0_SEG1 = 0x0240A000 +OSSSYS_BASE__INST0_SEG2 = 0 +OSSSYS_BASE__INST0_SEG3 = 0 +OSSSYS_BASE__INST0_SEG4 = 0 +OSSSYS_BASE__INST1_SEG0 = 0 +OSSSYS_BASE__INST1_SEG1 = 0 +OSSSYS_BASE__INST1_SEG2 = 0 +OSSSYS_BASE__INST1_SEG3 = 0 +OSSSYS_BASE__INST1_SEG4 = 0 +OSSSYS_BASE__INST2_SEG0 = 0 +OSSSYS_BASE__INST2_SEG1 = 0 +OSSSYS_BASE__INST2_SEG2 = 0 +OSSSYS_BASE__INST2_SEG3 = 0 +OSSSYS_BASE__INST2_SEG4 = 0 +OSSSYS_BASE__INST3_SEG0 = 0 +OSSSYS_BASE__INST3_SEG1 = 0 +OSSSYS_BASE__INST3_SEG2 = 0 +OSSSYS_BASE__INST3_SEG3 = 0 +OSSSYS_BASE__INST3_SEG4 = 0 +OSSSYS_BASE__INST4_SEG0 = 0 +OSSSYS_BASE__INST4_SEG1 = 0 +OSSSYS_BASE__INST4_SEG2 = 0 +OSSSYS_BASE__INST4_SEG3 = 0 +OSSSYS_BASE__INST4_SEG4 = 0 +OSSSYS_BASE__INST5_SEG0 = 0 +OSSSYS_BASE__INST5_SEG1 = 0 +OSSSYS_BASE__INST5_SEG2 = 0 +OSSSYS_BASE__INST5_SEG3 = 0 +OSSSYS_BASE__INST5_SEG4 = 0 +OSSSYS_BASE__INST6_SEG0 = 0 +OSSSYS_BASE__INST6_SEG1 = 0 +OSSSYS_BASE__INST6_SEG2 = 0 +OSSSYS_BASE__INST6_SEG3 = 0 +OSSSYS_BASE__INST6_SEG4 = 0 +PCIE0_BASE__INST0_SEG0 = 0x00000000 +PCIE0_BASE__INST0_SEG1 = 0x00000014 +PCIE0_BASE__INST0_SEG2 = 0x00000D20 +PCIE0_BASE__INST0_SEG3 = 0x00010400 +PCIE0_BASE__INST0_SEG4 = 0x0241B000 +PCIE0_BASE__INST1_SEG0 = 0 +PCIE0_BASE__INST1_SEG1 = 0 +PCIE0_BASE__INST1_SEG2 = 0 +PCIE0_BASE__INST1_SEG3 = 0 +PCIE0_BASE__INST1_SEG4 = 0 +PCIE0_BASE__INST2_SEG0 = 0 +PCIE0_BASE__INST2_SEG1 = 0 +PCIE0_BASE__INST2_SEG2 = 0 +PCIE0_BASE__INST2_SEG3 = 0 +PCIE0_BASE__INST2_SEG4 = 0 +PCIE0_BASE__INST3_SEG0 = 0 +PCIE0_BASE__INST3_SEG1 = 0 +PCIE0_BASE__INST3_SEG2 = 0 +PCIE0_BASE__INST3_SEG3 = 0 +PCIE0_BASE__INST3_SEG4 = 0 +PCIE0_BASE__INST4_SEG0 = 0 +PCIE0_BASE__INST4_SEG1 = 0 +PCIE0_BASE__INST4_SEG2 = 0 +PCIE0_BASE__INST4_SEG3 = 0 +PCIE0_BASE__INST4_SEG4 = 0 +PCIE0_BASE__INST5_SEG0 = 0 +PCIE0_BASE__INST5_SEG1 = 0 +PCIE0_BASE__INST5_SEG2 = 0 +PCIE0_BASE__INST5_SEG3 = 0 +PCIE0_BASE__INST5_SEG4 = 0 +PCIE0_BASE__INST6_SEG0 = 0 +PCIE0_BASE__INST6_SEG1 = 0 +PCIE0_BASE__INST6_SEG2 = 0 +PCIE0_BASE__INST6_SEG3 = 0 +PCIE0_BASE__INST6_SEG4 = 0 +SDMA0_BASE__INST0_SEG0 = 0x00001260 +SDMA0_BASE__INST0_SEG1 = 0x0000A000 +SDMA0_BASE__INST0_SEG2 = 0x0001C000 +SDMA0_BASE__INST0_SEG3 = 0x02402C00 +SDMA0_BASE__INST0_SEG4 = 0 +SDMA0_BASE__INST1_SEG0 = 0 +SDMA0_BASE__INST1_SEG1 = 0 +SDMA0_BASE__INST1_SEG2 = 0 +SDMA0_BASE__INST1_SEG3 = 0 +SDMA0_BASE__INST1_SEG4 = 0 +SDMA0_BASE__INST2_SEG0 = 0 +SDMA0_BASE__INST2_SEG1 = 0 +SDMA0_BASE__INST2_SEG2 = 0 +SDMA0_BASE__INST2_SEG3 = 0 +SDMA0_BASE__INST2_SEG4 = 0 +SDMA0_BASE__INST3_SEG0 = 0 +SDMA0_BASE__INST3_SEG1 = 0 +SDMA0_BASE__INST3_SEG2 = 0 +SDMA0_BASE__INST3_SEG3 = 0 +SDMA0_BASE__INST3_SEG4 = 0 +SDMA0_BASE__INST4_SEG0 = 0 +SDMA0_BASE__INST4_SEG1 = 0 +SDMA0_BASE__INST4_SEG2 = 0 +SDMA0_BASE__INST4_SEG3 = 0 +SDMA0_BASE__INST4_SEG4 = 0 +SDMA0_BASE__INST5_SEG0 = 0 +SDMA0_BASE__INST5_SEG1 = 0 +SDMA0_BASE__INST5_SEG2 = 0 +SDMA0_BASE__INST5_SEG3 = 0 +SDMA0_BASE__INST5_SEG4 = 0 +SDMA0_BASE__INST6_SEG0 = 0 +SDMA0_BASE__INST6_SEG1 = 0 +SDMA0_BASE__INST6_SEG2 = 0 +SDMA0_BASE__INST6_SEG3 = 0 +SDMA0_BASE__INST6_SEG4 = 0 +SDMA1_BASE__INST0_SEG0 = 0x00001260 +SDMA1_BASE__INST0_SEG1 = 0x0000A000 +SDMA1_BASE__INST0_SEG2 = 0x0001C000 +SDMA1_BASE__INST0_SEG3 = 0x02402C00 +SDMA1_BASE__INST0_SEG4 = 0 +SDMA1_BASE__INST1_SEG0 = 0 +SDMA1_BASE__INST1_SEG1 = 0 +SDMA1_BASE__INST1_SEG2 = 0 +SDMA1_BASE__INST1_SEG3 = 0 +SDMA1_BASE__INST1_SEG4 = 0 +SDMA1_BASE__INST2_SEG0 = 0 +SDMA1_BASE__INST2_SEG1 = 0 +SDMA1_BASE__INST2_SEG2 = 0 +SDMA1_BASE__INST2_SEG3 = 0 +SDMA1_BASE__INST2_SEG4 = 0 +SDMA1_BASE__INST3_SEG0 = 0 +SDMA1_BASE__INST3_SEG1 = 0 +SDMA1_BASE__INST3_SEG2 = 0 +SDMA1_BASE__INST3_SEG3 = 0 +SDMA1_BASE__INST3_SEG4 = 0 +SDMA1_BASE__INST4_SEG0 = 0 +SDMA1_BASE__INST4_SEG1 = 0 +SDMA1_BASE__INST4_SEG2 = 0 +SDMA1_BASE__INST4_SEG3 = 0 +SDMA1_BASE__INST4_SEG4 = 0 +SDMA1_BASE__INST5_SEG0 = 0 +SDMA1_BASE__INST5_SEG1 = 0 +SDMA1_BASE__INST5_SEG2 = 0 +SDMA1_BASE__INST5_SEG3 = 0 +SDMA1_BASE__INST5_SEG4 = 0 +SDMA1_BASE__INST6_SEG0 = 0 +SDMA1_BASE__INST6_SEG1 = 0 +SDMA1_BASE__INST6_SEG2 = 0 +SDMA1_BASE__INST6_SEG3 = 0 +SDMA1_BASE__INST6_SEG4 = 0 +SMUIO_BASE__INST0_SEG0 = 0x00016800 +SMUIO_BASE__INST0_SEG1 = 0x00016A00 +SMUIO_BASE__INST0_SEG2 = 0x00440000 +SMUIO_BASE__INST0_SEG3 = 0x02401000 +SMUIO_BASE__INST0_SEG4 = 0 +SMUIO_BASE__INST1_SEG0 = 0 +SMUIO_BASE__INST1_SEG1 = 0 +SMUIO_BASE__INST1_SEG2 = 0 +SMUIO_BASE__INST1_SEG3 = 0 +SMUIO_BASE__INST1_SEG4 = 0 +SMUIO_BASE__INST2_SEG0 = 0 +SMUIO_BASE__INST2_SEG1 = 0 +SMUIO_BASE__INST2_SEG2 = 0 +SMUIO_BASE__INST2_SEG3 = 0 +SMUIO_BASE__INST2_SEG4 = 0 +SMUIO_BASE__INST3_SEG0 = 0 +SMUIO_BASE__INST3_SEG1 = 0 +SMUIO_BASE__INST3_SEG2 = 0 +SMUIO_BASE__INST3_SEG3 = 0 +SMUIO_BASE__INST3_SEG4 = 0 +SMUIO_BASE__INST4_SEG0 = 0 +SMUIO_BASE__INST4_SEG1 = 0 +SMUIO_BASE__INST4_SEG2 = 0 +SMUIO_BASE__INST4_SEG3 = 0 +SMUIO_BASE__INST4_SEG4 = 0 +SMUIO_BASE__INST5_SEG0 = 0 +SMUIO_BASE__INST5_SEG1 = 0 +SMUIO_BASE__INST5_SEG2 = 0 +SMUIO_BASE__INST5_SEG3 = 0 +SMUIO_BASE__INST5_SEG4 = 0 +SMUIO_BASE__INST6_SEG0 = 0 +SMUIO_BASE__INST6_SEG1 = 0 +SMUIO_BASE__INST6_SEG2 = 0 +SMUIO_BASE__INST6_SEG3 = 0 +SMUIO_BASE__INST6_SEG4 = 0 +THM_BASE__INST0_SEG0 = 0x00016600 +THM_BASE__INST0_SEG1 = 0x02400C00 +THM_BASE__INST0_SEG2 = 0 +THM_BASE__INST0_SEG3 = 0 +THM_BASE__INST0_SEG4 = 0 +THM_BASE__INST1_SEG0 = 0 +THM_BASE__INST1_SEG1 = 0 +THM_BASE__INST1_SEG2 = 0 +THM_BASE__INST1_SEG3 = 0 +THM_BASE__INST1_SEG4 = 0 +THM_BASE__INST2_SEG0 = 0 +THM_BASE__INST2_SEG1 = 0 +THM_BASE__INST2_SEG2 = 0 +THM_BASE__INST2_SEG3 = 0 +THM_BASE__INST2_SEG4 = 0 +THM_BASE__INST3_SEG0 = 0 +THM_BASE__INST3_SEG1 = 0 +THM_BASE__INST3_SEG2 = 0 +THM_BASE__INST3_SEG3 = 0 +THM_BASE__INST3_SEG4 = 0 +THM_BASE__INST4_SEG0 = 0 +THM_BASE__INST4_SEG1 = 0 +THM_BASE__INST4_SEG2 = 0 +THM_BASE__INST4_SEG3 = 0 +THM_BASE__INST4_SEG4 = 0 +THM_BASE__INST5_SEG0 = 0 +THM_BASE__INST5_SEG1 = 0 +THM_BASE__INST5_SEG2 = 0 +THM_BASE__INST5_SEG3 = 0 +THM_BASE__INST5_SEG4 = 0 +THM_BASE__INST6_SEG0 = 0 +THM_BASE__INST6_SEG1 = 0 +THM_BASE__INST6_SEG2 = 0 +THM_BASE__INST6_SEG3 = 0 +THM_BASE__INST6_SEG4 = 0 +UMC_BASE__INST0_SEG0 = 0x00014000 +UMC_BASE__INST0_SEG1 = 0x02425800 +UMC_BASE__INST0_SEG2 = 0 +UMC_BASE__INST0_SEG3 = 0 +UMC_BASE__INST0_SEG4 = 0 +UMC_BASE__INST1_SEG0 = 0x00054000 +UMC_BASE__INST1_SEG1 = 0x02425C00 +UMC_BASE__INST1_SEG2 = 0 +UMC_BASE__INST1_SEG3 = 0 +UMC_BASE__INST1_SEG4 = 0 +UMC_BASE__INST2_SEG0 = 0x00094000 +UMC_BASE__INST2_SEG1 = 0x02426000 +UMC_BASE__INST2_SEG2 = 0 +UMC_BASE__INST2_SEG3 = 0 +UMC_BASE__INST2_SEG4 = 0 +UMC_BASE__INST3_SEG0 = 0x000D4000 +UMC_BASE__INST3_SEG1 = 0x02426400 +UMC_BASE__INST3_SEG2 = 0 +UMC_BASE__INST3_SEG3 = 0 +UMC_BASE__INST3_SEG4 = 0 +UMC_BASE__INST4_SEG0 = 0x00114000 +UMC_BASE__INST4_SEG1 = 0x02426800 +UMC_BASE__INST4_SEG2 = 0 +UMC_BASE__INST4_SEG3 = 0 +UMC_BASE__INST4_SEG4 = 0 +UMC_BASE__INST5_SEG0 = 0x00154000 +UMC_BASE__INST5_SEG1 = 0x02426C00 +UMC_BASE__INST5_SEG2 = 0 +UMC_BASE__INST5_SEG3 = 0 +UMC_BASE__INST5_SEG4 = 0 +UMC_BASE__INST6_SEG0 = 0x00194000 +UMC_BASE__INST6_SEG1 = 0x02427000 +UMC_BASE__INST6_SEG2 = 0 +UMC_BASE__INST6_SEG3 = 0 +UMC_BASE__INST6_SEG4 = 0 +USB0_BASE__INST0_SEG0 = 0x0242A800 +USB0_BASE__INST0_SEG1 = 0x05B00000 +USB0_BASE__INST0_SEG2 = 0 +USB0_BASE__INST0_SEG3 = 0 +USB0_BASE__INST0_SEG4 = 0 +USB0_BASE__INST1_SEG0 = 0 +USB0_BASE__INST1_SEG1 = 0 +USB0_BASE__INST1_SEG2 = 0 +USB0_BASE__INST1_SEG3 = 0 +USB0_BASE__INST1_SEG4 = 0 +USB0_BASE__INST2_SEG0 = 0 +USB0_BASE__INST2_SEG1 = 0 +USB0_BASE__INST2_SEG2 = 0 +USB0_BASE__INST2_SEG3 = 0 +USB0_BASE__INST2_SEG4 = 0 +USB0_BASE__INST3_SEG0 = 0 +USB0_BASE__INST3_SEG1 = 0 +USB0_BASE__INST3_SEG2 = 0 +USB0_BASE__INST3_SEG3 = 0 +USB0_BASE__INST3_SEG4 = 0 +USB0_BASE__INST4_SEG0 = 0 +USB0_BASE__INST4_SEG1 = 0 +USB0_BASE__INST4_SEG2 = 0 +USB0_BASE__INST4_SEG3 = 0 +USB0_BASE__INST4_SEG4 = 0 +USB0_BASE__INST5_SEG0 = 0 +USB0_BASE__INST5_SEG1 = 0 +USB0_BASE__INST5_SEG2 = 0 +USB0_BASE__INST5_SEG3 = 0 +USB0_BASE__INST5_SEG4 = 0 +USB0_BASE__INST6_SEG0 = 0 +USB0_BASE__INST6_SEG1 = 0 +USB0_BASE__INST6_SEG2 = 0 +USB0_BASE__INST6_SEG3 = 0 +USB0_BASE__INST6_SEG4 = 0 +VCN_BASE__INST0_SEG0 = 0x00007800 +VCN_BASE__INST0_SEG1 = 0x00007E00 +VCN_BASE__INST0_SEG2 = 0x02403000 +VCN_BASE__INST0_SEG3 = 0 +VCN_BASE__INST0_SEG4 = 0 +VCN_BASE__INST1_SEG0 = 0x00007B00 +VCN_BASE__INST1_SEG1 = 0x00012000 +VCN_BASE__INST1_SEG2 = 0x02445000 +VCN_BASE__INST1_SEG3 = 0 +VCN_BASE__INST1_SEG4 = 0 +VCN_BASE__INST2_SEG0 = 0 +VCN_BASE__INST2_SEG1 = 0 +VCN_BASE__INST2_SEG2 = 0 +VCN_BASE__INST2_SEG3 = 0 +VCN_BASE__INST2_SEG4 = 0 +VCN_BASE__INST3_SEG0 = 0 +VCN_BASE__INST3_SEG1 = 0 +VCN_BASE__INST3_SEG2 = 0 +VCN_BASE__INST3_SEG3 = 0 +VCN_BASE__INST3_SEG4 = 0 +VCN_BASE__INST4_SEG0 = 0 +VCN_BASE__INST4_SEG1 = 0 +VCN_BASE__INST4_SEG2 = 0 +VCN_BASE__INST4_SEG3 = 0 +VCN_BASE__INST4_SEG4 = 0 +VCN_BASE__INST5_SEG0 = 0 +VCN_BASE__INST5_SEG1 = 0 +VCN_BASE__INST5_SEG2 = 0 +VCN_BASE__INST5_SEG3 = 0 +VCN_BASE__INST5_SEG4 = 0 +VCN_BASE__INST6_SEG0 = 0 +VCN_BASE__INST6_SEG1 = 0 +VCN_BASE__INST6_SEG2 = 0 +VCN_BASE__INST6_SEG3 = 0 +VCN_BASE__INST6_SEG4 = 0 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amdgpu_drm.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amdgpu_drm.py new file mode 100644 index 000000000..f65998552 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amdgpu_drm.py @@ -0,0 +1,1660 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +drm_handle_t: TypeAlias = ctypes.c_uint32 +drm_context_t: TypeAlias = ctypes.c_uint32 +drm_drawable_t: TypeAlias = ctypes.c_uint32 +drm_magic_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_drm_clip_rect(c.Struct): + SIZE = 8 + x1: int + y1: int + x2: int + y2: int +struct_drm_clip_rect.register_fields([('x1', ctypes.c_uint16, 0), ('y1', ctypes.c_uint16, 2), ('x2', ctypes.c_uint16, 4), ('y2', ctypes.c_uint16, 6)]) +@c.record +class struct_drm_drawable_info(c.Struct): + SIZE = 16 + num_rects: int + rects: c.POINTER[struct_drm_clip_rect] +struct_drm_drawable_info.register_fields([('num_rects', ctypes.c_uint32, 0), ('rects', c.POINTER[struct_drm_clip_rect], 8)]) +@c.record +class struct_drm_tex_region(c.Struct): + SIZE = 8 + next: int + prev: int + in_use: int + padding: int + age: int +struct_drm_tex_region.register_fields([('next', ctypes.c_ubyte, 0), ('prev', ctypes.c_ubyte, 1), ('in_use', ctypes.c_ubyte, 2), ('padding', ctypes.c_ubyte, 3), ('age', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_hw_lock(c.Struct): + SIZE = 64 + lock: int + padding: c.Array[ctypes.c_char, Literal[60]] +struct_drm_hw_lock.register_fields([('lock', ctypes.c_uint32, 0), ('padding', c.Array[ctypes.c_char, Literal[60]], 4)]) +@c.record +class struct_drm_version(c.Struct): + SIZE = 64 + version_major: int + version_minor: int + version_patchlevel: int + name_len: int + name: c.POINTER[ctypes.c_char] + date_len: int + date: c.POINTER[ctypes.c_char] + desc_len: int + desc: c.POINTER[ctypes.c_char] +__kernel_size_t: TypeAlias = ctypes.c_uint64 +struct_drm_version.register_fields([('version_major', ctypes.c_int32, 0), ('version_minor', ctypes.c_int32, 4), ('version_patchlevel', ctypes.c_int32, 8), ('name_len', ctypes.c_uint64, 16), ('name', c.POINTER[ctypes.c_char], 24), ('date_len', ctypes.c_uint64, 32), ('date', c.POINTER[ctypes.c_char], 40), ('desc_len', ctypes.c_uint64, 48), ('desc', c.POINTER[ctypes.c_char], 56)]) +@c.record +class struct_drm_unique(c.Struct): + SIZE = 16 + unique_len: int + unique: c.POINTER[ctypes.c_char] +struct_drm_unique.register_fields([('unique_len', ctypes.c_uint64, 0), ('unique', c.POINTER[ctypes.c_char], 8)]) +@c.record +class struct_drm_list(c.Struct): + SIZE = 16 + count: int + version: c.POINTER[struct_drm_version] +struct_drm_list.register_fields([('count', ctypes.c_int32, 0), ('version', c.POINTER[struct_drm_version], 8)]) +@c.record +class struct_drm_block(c.Struct): + SIZE = 4 + unused: int +struct_drm_block.register_fields([('unused', ctypes.c_int32, 0)]) +@c.record +class struct_drm_control(c.Struct): + SIZE = 8 + func: int + irq: int +struct_drm_control_func: dict[int, str] = {(DRM_ADD_COMMAND:=0): 'DRM_ADD_COMMAND', (DRM_RM_COMMAND:=1): 'DRM_RM_COMMAND', (DRM_INST_HANDLER:=2): 'DRM_INST_HANDLER', (DRM_UNINST_HANDLER:=3): 'DRM_UNINST_HANDLER'} +struct_drm_control.register_fields([('func', ctypes.c_uint32, 0), ('irq', ctypes.c_int32, 4)]) +enum_drm_map_type: dict[int, str] = {(_DRM_FRAME_BUFFER:=0): '_DRM_FRAME_BUFFER', (_DRM_REGISTERS:=1): '_DRM_REGISTERS', (_DRM_SHM:=2): '_DRM_SHM', (_DRM_AGP:=3): '_DRM_AGP', (_DRM_SCATTER_GATHER:=4): '_DRM_SCATTER_GATHER', (_DRM_CONSISTENT:=5): '_DRM_CONSISTENT'} +enum_drm_map_flags: dict[int, str] = {(_DRM_RESTRICTED:=1): '_DRM_RESTRICTED', (_DRM_READ_ONLY:=2): '_DRM_READ_ONLY', (_DRM_LOCKED:=4): '_DRM_LOCKED', (_DRM_KERNEL:=8): '_DRM_KERNEL', (_DRM_WRITE_COMBINING:=16): '_DRM_WRITE_COMBINING', (_DRM_CONTAINS_LOCK:=32): '_DRM_CONTAINS_LOCK', (_DRM_REMOVABLE:=64): '_DRM_REMOVABLE', (_DRM_DRIVER:=128): '_DRM_DRIVER'} +@c.record +class struct_drm_ctx_priv_map(c.Struct): + SIZE = 16 + ctx_id: int + handle: ctypes.c_void_p +struct_drm_ctx_priv_map.register_fields([('ctx_id', ctypes.c_uint32, 0), ('handle', ctypes.c_void_p, 8)]) +@c.record +class struct_drm_map(c.Struct): + SIZE = 40 + offset: int + size: int + type: int + flags: int + handle: ctypes.c_void_p + mtrr: int +struct_drm_map.register_fields([('offset', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('type', ctypes.c_uint32, 16), ('flags', ctypes.c_uint32, 20), ('handle', ctypes.c_void_p, 24), ('mtrr', ctypes.c_int32, 32)]) +@c.record +class struct_drm_client(c.Struct): + SIZE = 40 + idx: int + auth: int + pid: int + uid: int + magic: int + iocs: int +struct_drm_client.register_fields([('idx', ctypes.c_int32, 0), ('auth', ctypes.c_int32, 4), ('pid', ctypes.c_uint64, 8), ('uid', ctypes.c_uint64, 16), ('magic', ctypes.c_uint64, 24), ('iocs', ctypes.c_uint64, 32)]) +enum_drm_stat_type: dict[int, str] = {(_DRM_STAT_LOCK:=0): '_DRM_STAT_LOCK', (_DRM_STAT_OPENS:=1): '_DRM_STAT_OPENS', (_DRM_STAT_CLOSES:=2): '_DRM_STAT_CLOSES', (_DRM_STAT_IOCTLS:=3): '_DRM_STAT_IOCTLS', (_DRM_STAT_LOCKS:=4): '_DRM_STAT_LOCKS', (_DRM_STAT_UNLOCKS:=5): '_DRM_STAT_UNLOCKS', (_DRM_STAT_VALUE:=6): '_DRM_STAT_VALUE', (_DRM_STAT_BYTE:=7): '_DRM_STAT_BYTE', (_DRM_STAT_COUNT:=8): '_DRM_STAT_COUNT', (_DRM_STAT_IRQ:=9): '_DRM_STAT_IRQ', (_DRM_STAT_PRIMARY:=10): '_DRM_STAT_PRIMARY', (_DRM_STAT_SECONDARY:=11): '_DRM_STAT_SECONDARY', (_DRM_STAT_DMA:=12): '_DRM_STAT_DMA', (_DRM_STAT_SPECIAL:=13): '_DRM_STAT_SPECIAL', (_DRM_STAT_MISSED:=14): '_DRM_STAT_MISSED'} +@c.record +class struct_drm_stats(c.Struct): + SIZE = 248 + count: int + data: c.Array[struct_drm_stats_data, Literal[15]] +@c.record +class struct_drm_stats_data(c.Struct): + SIZE = 16 + value: int + type: int +struct_drm_stats_data.register_fields([('value', ctypes.c_uint64, 0), ('type', ctypes.c_uint32, 8)]) +struct_drm_stats.register_fields([('count', ctypes.c_uint64, 0), ('data', c.Array[struct_drm_stats_data, Literal[15]], 8)]) +enum_drm_lock_flags: dict[int, str] = {(_DRM_LOCK_READY:=1): '_DRM_LOCK_READY', (_DRM_LOCK_QUIESCENT:=2): '_DRM_LOCK_QUIESCENT', (_DRM_LOCK_FLUSH:=4): '_DRM_LOCK_FLUSH', (_DRM_LOCK_FLUSH_ALL:=8): '_DRM_LOCK_FLUSH_ALL', (_DRM_HALT_ALL_QUEUES:=16): '_DRM_HALT_ALL_QUEUES', (_DRM_HALT_CUR_QUEUES:=32): '_DRM_HALT_CUR_QUEUES'} +@c.record +class struct_drm_lock(c.Struct): + SIZE = 8 + context: int + flags: int +struct_drm_lock.register_fields([('context', ctypes.c_int32, 0), ('flags', ctypes.c_uint32, 4)]) +enum_drm_dma_flags: dict[int, str] = {(_DRM_DMA_BLOCK:=1): '_DRM_DMA_BLOCK', (_DRM_DMA_WHILE_LOCKED:=2): '_DRM_DMA_WHILE_LOCKED', (_DRM_DMA_PRIORITY:=4): '_DRM_DMA_PRIORITY', (_DRM_DMA_WAIT:=16): '_DRM_DMA_WAIT', (_DRM_DMA_SMALLER_OK:=32): '_DRM_DMA_SMALLER_OK', (_DRM_DMA_LARGER_OK:=64): '_DRM_DMA_LARGER_OK'} +@c.record +class struct_drm_buf_desc(c.Struct): + SIZE = 32 + count: int + size: int + low_mark: int + high_mark: int + flags: int + agp_start: int +struct_drm_buf_desc_flags: dict[int, str] = {(_DRM_PAGE_ALIGN:=1): '_DRM_PAGE_ALIGN', (_DRM_AGP_BUFFER:=2): '_DRM_AGP_BUFFER', (_DRM_SG_BUFFER:=4): '_DRM_SG_BUFFER', (_DRM_FB_BUFFER:=8): '_DRM_FB_BUFFER', (_DRM_PCI_BUFFER_RO:=16): '_DRM_PCI_BUFFER_RO'} +struct_drm_buf_desc.register_fields([('count', ctypes.c_int32, 0), ('size', ctypes.c_int32, 4), ('low_mark', ctypes.c_int32, 8), ('high_mark', ctypes.c_int32, 12), ('flags', ctypes.c_uint32, 16), ('agp_start', ctypes.c_uint64, 24)]) +@c.record +class struct_drm_buf_info(c.Struct): + SIZE = 16 + count: int + list: c.POINTER[struct_drm_buf_desc] +struct_drm_buf_info.register_fields([('count', ctypes.c_int32, 0), ('list', c.POINTER[struct_drm_buf_desc], 8)]) +@c.record +class struct_drm_buf_free(c.Struct): + SIZE = 16 + count: int + list: c.POINTER[ctypes.c_int32] +struct_drm_buf_free.register_fields([('count', ctypes.c_int32, 0), ('list', c.POINTER[ctypes.c_int32], 8)]) +@c.record +class struct_drm_buf_pub(c.Struct): + SIZE = 24 + idx: int + total: int + used: int + address: ctypes.c_void_p +struct_drm_buf_pub.register_fields([('idx', ctypes.c_int32, 0), ('total', ctypes.c_int32, 4), ('used', ctypes.c_int32, 8), ('address', ctypes.c_void_p, 16)]) +@c.record +class struct_drm_buf_map(c.Struct): + SIZE = 24 + count: int + virtual: ctypes.c_void_p + list: c.POINTER[struct_drm_buf_pub] +struct_drm_buf_map.register_fields([('count', ctypes.c_int32, 0), ('virtual', ctypes.c_void_p, 8), ('list', c.POINTER[struct_drm_buf_pub], 16)]) +@c.record +class struct_drm_dma(c.Struct): + SIZE = 64 + context: int + send_count: int + send_indices: c.POINTER[ctypes.c_int32] + send_sizes: c.POINTER[ctypes.c_int32] + flags: int + request_count: int + request_size: int + request_indices: c.POINTER[ctypes.c_int32] + request_sizes: c.POINTER[ctypes.c_int32] + granted_count: int +struct_drm_dma.register_fields([('context', ctypes.c_int32, 0), ('send_count', ctypes.c_int32, 4), ('send_indices', c.POINTER[ctypes.c_int32], 8), ('send_sizes', c.POINTER[ctypes.c_int32], 16), ('flags', ctypes.c_uint32, 24), ('request_count', ctypes.c_int32, 28), ('request_size', ctypes.c_int32, 32), ('request_indices', c.POINTER[ctypes.c_int32], 40), ('request_sizes', c.POINTER[ctypes.c_int32], 48), ('granted_count', ctypes.c_int32, 56)]) +enum_drm_ctx_flags: dict[int, str] = {(_DRM_CONTEXT_PRESERVED:=1): '_DRM_CONTEXT_PRESERVED', (_DRM_CONTEXT_2DONLY:=2): '_DRM_CONTEXT_2DONLY'} +@c.record +class struct_drm_ctx(c.Struct): + SIZE = 8 + handle: int + flags: int +struct_drm_ctx.register_fields([('handle', drm_context_t, 0), ('flags', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_ctx_res(c.Struct): + SIZE = 16 + count: int + contexts: c.POINTER[struct_drm_ctx] +struct_drm_ctx_res.register_fields([('count', ctypes.c_int32, 0), ('contexts', c.POINTER[struct_drm_ctx], 8)]) +@c.record +class struct_drm_draw(c.Struct): + SIZE = 4 + handle: int +struct_drm_draw.register_fields([('handle', drm_drawable_t, 0)]) +drm_drawable_info_type_t: dict[int, str] = {(DRM_DRAWABLE_CLIPRECTS:=0): 'DRM_DRAWABLE_CLIPRECTS'} +@c.record +class struct_drm_update_draw(c.Struct): + SIZE = 24 + handle: int + type: int + num: int + data: int +struct_drm_update_draw.register_fields([('handle', drm_drawable_t, 0), ('type', ctypes.c_uint32, 4), ('num', ctypes.c_uint32, 8), ('data', ctypes.c_uint64, 16)]) +@c.record +class struct_drm_auth(c.Struct): + SIZE = 4 + magic: int +struct_drm_auth.register_fields([('magic', drm_magic_t, 0)]) +@c.record +class struct_drm_irq_busid(c.Struct): + SIZE = 16 + irq: int + busnum: int + devnum: int + funcnum: int +struct_drm_irq_busid.register_fields([('irq', ctypes.c_int32, 0), ('busnum', ctypes.c_int32, 4), ('devnum', ctypes.c_int32, 8), ('funcnum', ctypes.c_int32, 12)]) +enum_drm_vblank_seq_type: dict[int, str] = {(_DRM_VBLANK_ABSOLUTE:=0): '_DRM_VBLANK_ABSOLUTE', (_DRM_VBLANK_RELATIVE:=1): '_DRM_VBLANK_RELATIVE', (_DRM_VBLANK_HIGH_CRTC_MASK:=62): '_DRM_VBLANK_HIGH_CRTC_MASK', (_DRM_VBLANK_EVENT:=67108864): '_DRM_VBLANK_EVENT', (_DRM_VBLANK_FLIP:=134217728): '_DRM_VBLANK_FLIP', (_DRM_VBLANK_NEXTONMISS:=268435456): '_DRM_VBLANK_NEXTONMISS', (_DRM_VBLANK_SECONDARY:=536870912): '_DRM_VBLANK_SECONDARY', (_DRM_VBLANK_SIGNAL:=1073741824): '_DRM_VBLANK_SIGNAL'} +@c.record +class struct_drm_wait_vblank_request(c.Struct): + SIZE = 16 + type: int + sequence: int + signal: int +struct_drm_wait_vblank_request.register_fields([('type', ctypes.c_uint32, 0), ('sequence', ctypes.c_uint32, 4), ('signal', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_wait_vblank_reply(c.Struct): + SIZE = 24 + type: int + sequence: int + tval_sec: int + tval_usec: int +struct_drm_wait_vblank_reply.register_fields([('type', ctypes.c_uint32, 0), ('sequence', ctypes.c_uint32, 4), ('tval_sec', ctypes.c_int64, 8), ('tval_usec', ctypes.c_int64, 16)]) +@c.record +class union_drm_wait_vblank(c.Struct): + SIZE = 24 + request: struct_drm_wait_vblank_request + reply: struct_drm_wait_vblank_reply +union_drm_wait_vblank.register_fields([('request', struct_drm_wait_vblank_request, 0), ('reply', struct_drm_wait_vblank_reply, 0)]) +@c.record +class struct_drm_modeset_ctl(c.Struct): + SIZE = 8 + crtc: int + cmd: int +__u32: TypeAlias = ctypes.c_uint32 +struct_drm_modeset_ctl.register_fields([('crtc', ctypes.c_uint32, 0), ('cmd', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_agp_mode(c.Struct): + SIZE = 8 + mode: int +struct_drm_agp_mode.register_fields([('mode', ctypes.c_uint64, 0)]) +@c.record +class struct_drm_agp_buffer(c.Struct): + SIZE = 32 + size: int + handle: int + type: int + physical: int +struct_drm_agp_buffer.register_fields([('size', ctypes.c_uint64, 0), ('handle', ctypes.c_uint64, 8), ('type', ctypes.c_uint64, 16), ('physical', ctypes.c_uint64, 24)]) +@c.record +class struct_drm_agp_binding(c.Struct): + SIZE = 16 + handle: int + offset: int +struct_drm_agp_binding.register_fields([('handle', ctypes.c_uint64, 0), ('offset', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_agp_info(c.Struct): + SIZE = 56 + agp_version_major: int + agp_version_minor: int + mode: int + aperture_base: int + aperture_size: int + memory_allowed: int + memory_used: int + id_vendor: int + id_device: int +struct_drm_agp_info.register_fields([('agp_version_major', ctypes.c_int32, 0), ('agp_version_minor', ctypes.c_int32, 4), ('mode', ctypes.c_uint64, 8), ('aperture_base', ctypes.c_uint64, 16), ('aperture_size', ctypes.c_uint64, 24), ('memory_allowed', ctypes.c_uint64, 32), ('memory_used', ctypes.c_uint64, 40), ('id_vendor', ctypes.c_uint16, 48), ('id_device', ctypes.c_uint16, 50)]) +@c.record +class struct_drm_scatter_gather(c.Struct): + SIZE = 16 + size: int + handle: int +struct_drm_scatter_gather.register_fields([('size', ctypes.c_uint64, 0), ('handle', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_set_version(c.Struct): + SIZE = 16 + drm_di_major: int + drm_di_minor: int + drm_dd_major: int + drm_dd_minor: int +struct_drm_set_version.register_fields([('drm_di_major', ctypes.c_int32, 0), ('drm_di_minor', ctypes.c_int32, 4), ('drm_dd_major', ctypes.c_int32, 8), ('drm_dd_minor', ctypes.c_int32, 12)]) +@c.record +class struct_drm_gem_close(c.Struct): + SIZE = 8 + handle: int + pad: int +struct_drm_gem_close.register_fields([('handle', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_gem_flink(c.Struct): + SIZE = 8 + handle: int + name: int +struct_drm_gem_flink.register_fields([('handle', ctypes.c_uint32, 0), ('name', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_gem_open(c.Struct): + SIZE = 16 + name: int + handle: int + size: int +__u64: TypeAlias = ctypes.c_uint64 +struct_drm_gem_open.register_fields([('name', ctypes.c_uint32, 0), ('handle', ctypes.c_uint32, 4), ('size', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_get_cap(c.Struct): + SIZE = 16 + capability: int + value: int +struct_drm_get_cap.register_fields([('capability', ctypes.c_uint64, 0), ('value', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_set_client_cap(c.Struct): + SIZE = 16 + capability: int + value: int +struct_drm_set_client_cap.register_fields([('capability', ctypes.c_uint64, 0), ('value', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_prime_handle(c.Struct): + SIZE = 12 + handle: int + flags: int + fd: int +__s32: TypeAlias = ctypes.c_int32 +struct_drm_prime_handle.register_fields([('handle', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('fd', ctypes.c_int32, 8)]) +@c.record +class struct_drm_syncobj_create(c.Struct): + SIZE = 8 + handle: int + flags: int +struct_drm_syncobj_create.register_fields([('handle', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_syncobj_destroy(c.Struct): + SIZE = 8 + handle: int + pad: int +struct_drm_syncobj_destroy.register_fields([('handle', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_syncobj_handle(c.Struct): + SIZE = 16 + handle: int + flags: int + fd: int + pad: int +struct_drm_syncobj_handle.register_fields([('handle', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('fd', ctypes.c_int32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_drm_syncobj_transfer(c.Struct): + SIZE = 32 + src_handle: int + dst_handle: int + src_point: int + dst_point: int + flags: int + pad: int +struct_drm_syncobj_transfer.register_fields([('src_handle', ctypes.c_uint32, 0), ('dst_handle', ctypes.c_uint32, 4), ('src_point', ctypes.c_uint64, 8), ('dst_point', ctypes.c_uint64, 16), ('flags', ctypes.c_uint32, 24), ('pad', ctypes.c_uint32, 28)]) +@c.record +class struct_drm_syncobj_wait(c.Struct): + SIZE = 40 + handles: int + timeout_nsec: int + count_handles: int + flags: int + first_signaled: int + pad: int + deadline_nsec: int +__s64: TypeAlias = ctypes.c_int64 +struct_drm_syncobj_wait.register_fields([('handles', ctypes.c_uint64, 0), ('timeout_nsec', ctypes.c_int64, 8), ('count_handles', ctypes.c_uint32, 16), ('flags', ctypes.c_uint32, 20), ('first_signaled', ctypes.c_uint32, 24), ('pad', ctypes.c_uint32, 28), ('deadline_nsec', ctypes.c_uint64, 32)]) +@c.record +class struct_drm_syncobj_timeline_wait(c.Struct): + SIZE = 48 + handles: int + points: int + timeout_nsec: int + count_handles: int + flags: int + first_signaled: int + pad: int + deadline_nsec: int +struct_drm_syncobj_timeline_wait.register_fields([('handles', ctypes.c_uint64, 0), ('points', ctypes.c_uint64, 8), ('timeout_nsec', ctypes.c_int64, 16), ('count_handles', ctypes.c_uint32, 24), ('flags', ctypes.c_uint32, 28), ('first_signaled', ctypes.c_uint32, 32), ('pad', ctypes.c_uint32, 36), ('deadline_nsec', ctypes.c_uint64, 40)]) +@c.record +class struct_drm_syncobj_eventfd(c.Struct): + SIZE = 24 + handle: int + flags: int + point: int + fd: int + pad: int +struct_drm_syncobj_eventfd.register_fields([('handle', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('point', ctypes.c_uint64, 8), ('fd', ctypes.c_int32, 16), ('pad', ctypes.c_uint32, 20)]) +@c.record +class struct_drm_syncobj_array(c.Struct): + SIZE = 16 + handles: int + count_handles: int + pad: int +struct_drm_syncobj_array.register_fields([('handles', ctypes.c_uint64, 0), ('count_handles', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_drm_syncobj_timeline_array(c.Struct): + SIZE = 24 + handles: int + points: int + count_handles: int + flags: int +struct_drm_syncobj_timeline_array.register_fields([('handles', ctypes.c_uint64, 0), ('points', ctypes.c_uint64, 8), ('count_handles', ctypes.c_uint32, 16), ('flags', ctypes.c_uint32, 20)]) +@c.record +class struct_drm_crtc_get_sequence(c.Struct): + SIZE = 24 + crtc_id: int + active: int + sequence: int + sequence_ns: int +struct_drm_crtc_get_sequence.register_fields([('crtc_id', ctypes.c_uint32, 0), ('active', ctypes.c_uint32, 4), ('sequence', ctypes.c_uint64, 8), ('sequence_ns', ctypes.c_int64, 16)]) +@c.record +class struct_drm_crtc_queue_sequence(c.Struct): + SIZE = 24 + crtc_id: int + flags: int + sequence: int + user_data: int +struct_drm_crtc_queue_sequence.register_fields([('crtc_id', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('sequence', ctypes.c_uint64, 8), ('user_data', ctypes.c_uint64, 16)]) +@c.record +class struct_drm_event(c.Struct): + SIZE = 8 + type: int + length: int +struct_drm_event.register_fields([('type', ctypes.c_uint32, 0), ('length', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_event_vblank(c.Struct): + SIZE = 32 + base: struct_drm_event + user_data: int + tv_sec: int + tv_usec: int + sequence: int + crtc_id: int +struct_drm_event_vblank.register_fields([('base', struct_drm_event, 0), ('user_data', ctypes.c_uint64, 8), ('tv_sec', ctypes.c_uint32, 16), ('tv_usec', ctypes.c_uint32, 20), ('sequence', ctypes.c_uint32, 24), ('crtc_id', ctypes.c_uint32, 28)]) +@c.record +class struct_drm_event_crtc_sequence(c.Struct): + SIZE = 32 + base: struct_drm_event + user_data: int + time_ns: int + sequence: int +struct_drm_event_crtc_sequence.register_fields([('base', struct_drm_event, 0), ('user_data', ctypes.c_uint64, 8), ('time_ns', ctypes.c_int64, 16), ('sequence', ctypes.c_uint64, 24)]) +drm_clip_rect_t: TypeAlias = struct_drm_clip_rect +drm_drawable_info_t: TypeAlias = struct_drm_drawable_info +drm_tex_region_t: TypeAlias = struct_drm_tex_region +drm_hw_lock_t: TypeAlias = struct_drm_hw_lock +drm_version_t: TypeAlias = struct_drm_version +drm_unique_t: TypeAlias = struct_drm_unique +drm_list_t: TypeAlias = struct_drm_list +drm_block_t: TypeAlias = struct_drm_block +drm_control_t: TypeAlias = struct_drm_control +drm_map_type_t: TypeAlias = ctypes.c_uint32 +drm_map_flags_t: TypeAlias = ctypes.c_uint32 +drm_ctx_priv_map_t: TypeAlias = struct_drm_ctx_priv_map +drm_map_t: TypeAlias = struct_drm_map +drm_client_t: TypeAlias = struct_drm_client +drm_stat_type_t: TypeAlias = ctypes.c_uint32 +drm_stats_t: TypeAlias = struct_drm_stats +drm_lock_flags_t: TypeAlias = ctypes.c_uint32 +drm_lock_t: TypeAlias = struct_drm_lock +drm_dma_flags_t: TypeAlias = ctypes.c_uint32 +drm_buf_desc_t: TypeAlias = struct_drm_buf_desc +drm_buf_info_t: TypeAlias = struct_drm_buf_info +drm_buf_free_t: TypeAlias = struct_drm_buf_free +drm_buf_pub_t: TypeAlias = struct_drm_buf_pub +drm_buf_map_t: TypeAlias = struct_drm_buf_map +drm_dma_t: TypeAlias = struct_drm_dma +drm_wait_vblank_t: TypeAlias = union_drm_wait_vblank +drm_agp_mode_t: TypeAlias = struct_drm_agp_mode +drm_ctx_flags_t: TypeAlias = ctypes.c_uint32 +drm_ctx_t: TypeAlias = struct_drm_ctx +drm_ctx_res_t: TypeAlias = struct_drm_ctx_res +drm_draw_t: TypeAlias = struct_drm_draw +drm_update_draw_t: TypeAlias = struct_drm_update_draw +drm_auth_t: TypeAlias = struct_drm_auth +drm_irq_busid_t: TypeAlias = struct_drm_irq_busid +drm_vblank_seq_type_t: TypeAlias = ctypes.c_uint32 +drm_agp_buffer_t: TypeAlias = struct_drm_agp_buffer +drm_agp_binding_t: TypeAlias = struct_drm_agp_binding +drm_agp_info_t: TypeAlias = struct_drm_agp_info +drm_scatter_gather_t: TypeAlias = struct_drm_scatter_gather +drm_set_version_t: TypeAlias = struct_drm_set_version +@c.record +class struct_drm_amdgpu_gem_create_in(c.Struct): + SIZE = 32 + bo_size: int + alignment: int + domains: int + domain_flags: int +struct_drm_amdgpu_gem_create_in.register_fields([('bo_size', ctypes.c_uint64, 0), ('alignment', ctypes.c_uint64, 8), ('domains', ctypes.c_uint64, 16), ('domain_flags', ctypes.c_uint64, 24)]) +@c.record +class struct_drm_amdgpu_gem_create_out(c.Struct): + SIZE = 8 + handle: int + _pad: int +struct_drm_amdgpu_gem_create_out.register_fields([('handle', ctypes.c_uint32, 0), ('_pad', ctypes.c_uint32, 4)]) +@c.record +class union_drm_amdgpu_gem_create(c.Struct): + SIZE = 32 + _in: struct_drm_amdgpu_gem_create_in + out: struct_drm_amdgpu_gem_create_out +union_drm_amdgpu_gem_create.register_fields([('_in', struct_drm_amdgpu_gem_create_in, 0), ('out', struct_drm_amdgpu_gem_create_out, 0)]) +@c.record +class struct_drm_amdgpu_bo_list_in(c.Struct): + SIZE = 24 + operation: int + list_handle: int + bo_number: int + bo_info_size: int + bo_info_ptr: int +struct_drm_amdgpu_bo_list_in.register_fields([('operation', ctypes.c_uint32, 0), ('list_handle', ctypes.c_uint32, 4), ('bo_number', ctypes.c_uint32, 8), ('bo_info_size', ctypes.c_uint32, 12), ('bo_info_ptr', ctypes.c_uint64, 16)]) +@c.record +class struct_drm_amdgpu_bo_list_entry(c.Struct): + SIZE = 8 + bo_handle: int + bo_priority: int +struct_drm_amdgpu_bo_list_entry.register_fields([('bo_handle', ctypes.c_uint32, 0), ('bo_priority', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_amdgpu_bo_list_out(c.Struct): + SIZE = 8 + list_handle: int + _pad: int +struct_drm_amdgpu_bo_list_out.register_fields([('list_handle', ctypes.c_uint32, 0), ('_pad', ctypes.c_uint32, 4)]) +@c.record +class union_drm_amdgpu_bo_list(c.Struct): + SIZE = 24 + _in: struct_drm_amdgpu_bo_list_in + out: struct_drm_amdgpu_bo_list_out +union_drm_amdgpu_bo_list.register_fields([('_in', struct_drm_amdgpu_bo_list_in, 0), ('out', struct_drm_amdgpu_bo_list_out, 0)]) +@c.record +class struct_drm_amdgpu_ctx_in(c.Struct): + SIZE = 16 + op: int + flags: int + ctx_id: int + priority: int +struct_drm_amdgpu_ctx_in.register_fields([('op', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('ctx_id', ctypes.c_uint32, 8), ('priority', ctypes.c_int32, 12)]) +@c.record +class union_drm_amdgpu_ctx_out(c.Struct): + SIZE = 16 + alloc: union_drm_amdgpu_ctx_out_alloc + state: union_drm_amdgpu_ctx_out_state + pstate: union_drm_amdgpu_ctx_out_pstate +@c.record +class union_drm_amdgpu_ctx_out_alloc(c.Struct): + SIZE = 8 + ctx_id: int + _pad: int +union_drm_amdgpu_ctx_out_alloc.register_fields([('ctx_id', ctypes.c_uint32, 0), ('_pad', ctypes.c_uint32, 4)]) +@c.record +class union_drm_amdgpu_ctx_out_state(c.Struct): + SIZE = 16 + flags: int + hangs: int + reset_status: int +union_drm_amdgpu_ctx_out_state.register_fields([('flags', ctypes.c_uint64, 0), ('hangs', ctypes.c_uint32, 8), ('reset_status', ctypes.c_uint32, 12)]) +@c.record +class union_drm_amdgpu_ctx_out_pstate(c.Struct): + SIZE = 8 + flags: int + _pad: int +union_drm_amdgpu_ctx_out_pstate.register_fields([('flags', ctypes.c_uint32, 0), ('_pad', ctypes.c_uint32, 4)]) +union_drm_amdgpu_ctx_out.register_fields([('alloc', union_drm_amdgpu_ctx_out_alloc, 0), ('state', union_drm_amdgpu_ctx_out_state, 0), ('pstate', union_drm_amdgpu_ctx_out_pstate, 0)]) +@c.record +class union_drm_amdgpu_ctx(c.Struct): + SIZE = 16 + _in: struct_drm_amdgpu_ctx_in + out: union_drm_amdgpu_ctx_out +union_drm_amdgpu_ctx.register_fields([('_in', struct_drm_amdgpu_ctx_in, 0), ('out', union_drm_amdgpu_ctx_out, 0)]) +@c.record +class struct_drm_amdgpu_userq_in(c.Struct): + SIZE = 72 + op: int + queue_id: int + ip_type: int + doorbell_handle: int + doorbell_offset: int + flags: int + queue_va: int + queue_size: int + rptr_va: int + wptr_va: int + mqd: int + mqd_size: int +struct_drm_amdgpu_userq_in.register_fields([('op', ctypes.c_uint32, 0), ('queue_id', ctypes.c_uint32, 4), ('ip_type', ctypes.c_uint32, 8), ('doorbell_handle', ctypes.c_uint32, 12), ('doorbell_offset', ctypes.c_uint32, 16), ('flags', ctypes.c_uint32, 20), ('queue_va', ctypes.c_uint64, 24), ('queue_size', ctypes.c_uint64, 32), ('rptr_va', ctypes.c_uint64, 40), ('wptr_va', ctypes.c_uint64, 48), ('mqd', ctypes.c_uint64, 56), ('mqd_size', ctypes.c_uint64, 64)]) +@c.record +class struct_drm_amdgpu_userq_out(c.Struct): + SIZE = 8 + queue_id: int + _pad: int +struct_drm_amdgpu_userq_out.register_fields([('queue_id', ctypes.c_uint32, 0), ('_pad', ctypes.c_uint32, 4)]) +@c.record +class union_drm_amdgpu_userq(c.Struct): + SIZE = 72 + _in: struct_drm_amdgpu_userq_in + out: struct_drm_amdgpu_userq_out +union_drm_amdgpu_userq.register_fields([('_in', struct_drm_amdgpu_userq_in, 0), ('out', struct_drm_amdgpu_userq_out, 0)]) +@c.record +class struct_drm_amdgpu_userq_mqd_gfx11(c.Struct): + SIZE = 16 + shadow_va: int + csa_va: int +struct_drm_amdgpu_userq_mqd_gfx11.register_fields([('shadow_va', ctypes.c_uint64, 0), ('csa_va', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_amdgpu_userq_mqd_sdma_gfx11(c.Struct): + SIZE = 8 + csa_va: int +struct_drm_amdgpu_userq_mqd_sdma_gfx11.register_fields([('csa_va', ctypes.c_uint64, 0)]) +@c.record +class struct_drm_amdgpu_userq_mqd_compute_gfx11(c.Struct): + SIZE = 8 + eop_va: int +struct_drm_amdgpu_userq_mqd_compute_gfx11.register_fields([('eop_va', ctypes.c_uint64, 0)]) +@c.record +class struct_drm_amdgpu_userq_signal(c.Struct): + SIZE = 48 + queue_id: int + pad: int + syncobj_handles: int + num_syncobj_handles: int + bo_read_handles: int + bo_write_handles: int + num_bo_read_handles: int + num_bo_write_handles: int +struct_drm_amdgpu_userq_signal.register_fields([('queue_id', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4), ('syncobj_handles', ctypes.c_uint64, 8), ('num_syncobj_handles', ctypes.c_uint64, 16), ('bo_read_handles', ctypes.c_uint64, 24), ('bo_write_handles', ctypes.c_uint64, 32), ('num_bo_read_handles', ctypes.c_uint32, 40), ('num_bo_write_handles', ctypes.c_uint32, 44)]) +@c.record +class struct_drm_amdgpu_userq_fence_info(c.Struct): + SIZE = 16 + va: int + value: int +struct_drm_amdgpu_userq_fence_info.register_fields([('va', ctypes.c_uint64, 0), ('value', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_amdgpu_userq_wait(c.Struct): + SIZE = 72 + waitq_id: int + pad: int + syncobj_handles: int + syncobj_timeline_handles: int + syncobj_timeline_points: int + bo_read_handles: int + bo_write_handles: int + num_syncobj_timeline_handles: int + num_fences: int + num_syncobj_handles: int + num_bo_read_handles: int + num_bo_write_handles: int + out_fences: int +__u16: TypeAlias = ctypes.c_uint16 +struct_drm_amdgpu_userq_wait.register_fields([('waitq_id', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4), ('syncobj_handles', ctypes.c_uint64, 8), ('syncobj_timeline_handles', ctypes.c_uint64, 16), ('syncobj_timeline_points', ctypes.c_uint64, 24), ('bo_read_handles', ctypes.c_uint64, 32), ('bo_write_handles', ctypes.c_uint64, 40), ('num_syncobj_timeline_handles', ctypes.c_uint16, 48), ('num_fences', ctypes.c_uint16, 50), ('num_syncobj_handles', ctypes.c_uint32, 52), ('num_bo_read_handles', ctypes.c_uint32, 56), ('num_bo_write_handles', ctypes.c_uint32, 60), ('out_fences', ctypes.c_uint64, 64)]) +class struct_drm_amdgpu_sem_in(c.Struct): pass +class union_drm_amdgpu_sem_out(c.Struct): pass +class union_drm_amdgpu_sem(c.Struct): pass +@c.record +class struct_drm_amdgpu_vm_in(c.Struct): + SIZE = 8 + op: int + flags: int +struct_drm_amdgpu_vm_in.register_fields([('op', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_amdgpu_vm_out(c.Struct): + SIZE = 8 + flags: int +struct_drm_amdgpu_vm_out.register_fields([('flags', ctypes.c_uint64, 0)]) +@c.record +class union_drm_amdgpu_vm(c.Struct): + SIZE = 8 + _in: struct_drm_amdgpu_vm_in + out: struct_drm_amdgpu_vm_out +union_drm_amdgpu_vm.register_fields([('_in', struct_drm_amdgpu_vm_in, 0), ('out', struct_drm_amdgpu_vm_out, 0)]) +@c.record +class struct_drm_amdgpu_sched_in(c.Struct): + SIZE = 16 + op: int + fd: int + priority: int + ctx_id: int +struct_drm_amdgpu_sched_in.register_fields([('op', ctypes.c_uint32, 0), ('fd', ctypes.c_uint32, 4), ('priority', ctypes.c_int32, 8), ('ctx_id', ctypes.c_uint32, 12)]) +@c.record +class union_drm_amdgpu_sched(c.Struct): + SIZE = 16 + _in: struct_drm_amdgpu_sched_in +union_drm_amdgpu_sched.register_fields([('_in', struct_drm_amdgpu_sched_in, 0)]) +@c.record +class struct_drm_amdgpu_gem_userptr(c.Struct): + SIZE = 24 + addr: int + size: int + flags: int + handle: int +struct_drm_amdgpu_gem_userptr.register_fields([('addr', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('flags', ctypes.c_uint32, 16), ('handle', ctypes.c_uint32, 20)]) +@c.record +class struct_drm_amdgpu_gem_dgma(c.Struct): + SIZE = 24 + addr: int + size: int + op: int + handle: int +struct_drm_amdgpu_gem_dgma.register_fields([('addr', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('op', ctypes.c_uint32, 16), ('handle', ctypes.c_uint32, 20)]) +@c.record +class struct_drm_amdgpu_gem_metadata(c.Struct): + SIZE = 288 + handle: int + op: int + data: struct_drm_amdgpu_gem_metadata_data +@c.record +class struct_drm_amdgpu_gem_metadata_data(c.Struct): + SIZE = 280 + flags: int + tiling_info: int + data_size_bytes: int + data: c.Array[ctypes.c_uint32, Literal[64]] +struct_drm_amdgpu_gem_metadata_data.register_fields([('flags', ctypes.c_uint64, 0), ('tiling_info', ctypes.c_uint64, 8), ('data_size_bytes', ctypes.c_uint32, 16), ('data', c.Array[ctypes.c_uint32, Literal[64]], 20)]) +struct_drm_amdgpu_gem_metadata.register_fields([('handle', ctypes.c_uint32, 0), ('op', ctypes.c_uint32, 4), ('data', struct_drm_amdgpu_gem_metadata_data, 8)]) +@c.record +class struct_drm_amdgpu_gem_mmap_in(c.Struct): + SIZE = 8 + handle: int + _pad: int +struct_drm_amdgpu_gem_mmap_in.register_fields([('handle', ctypes.c_uint32, 0), ('_pad', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_amdgpu_gem_mmap_out(c.Struct): + SIZE = 8 + addr_ptr: int +struct_drm_amdgpu_gem_mmap_out.register_fields([('addr_ptr', ctypes.c_uint64, 0)]) +@c.record +class union_drm_amdgpu_gem_mmap(c.Struct): + SIZE = 8 + _in: struct_drm_amdgpu_gem_mmap_in + out: struct_drm_amdgpu_gem_mmap_out +union_drm_amdgpu_gem_mmap.register_fields([('_in', struct_drm_amdgpu_gem_mmap_in, 0), ('out', struct_drm_amdgpu_gem_mmap_out, 0)]) +@c.record +class struct_drm_amdgpu_gem_wait_idle_in(c.Struct): + SIZE = 16 + handle: int + flags: int + timeout: int +struct_drm_amdgpu_gem_wait_idle_in.register_fields([('handle', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('timeout', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_amdgpu_gem_wait_idle_out(c.Struct): + SIZE = 8 + status: int + domain: int +struct_drm_amdgpu_gem_wait_idle_out.register_fields([('status', ctypes.c_uint32, 0), ('domain', ctypes.c_uint32, 4)]) +@c.record +class union_drm_amdgpu_gem_wait_idle(c.Struct): + SIZE = 16 + _in: struct_drm_amdgpu_gem_wait_idle_in + out: struct_drm_amdgpu_gem_wait_idle_out +union_drm_amdgpu_gem_wait_idle.register_fields([('_in', struct_drm_amdgpu_gem_wait_idle_in, 0), ('out', struct_drm_amdgpu_gem_wait_idle_out, 0)]) +@c.record +class struct_drm_amdgpu_wait_cs_in(c.Struct): + SIZE = 32 + handle: int + timeout: int + ip_type: int + ip_instance: int + ring: int + ctx_id: int +struct_drm_amdgpu_wait_cs_in.register_fields([('handle', ctypes.c_uint64, 0), ('timeout', ctypes.c_uint64, 8), ('ip_type', ctypes.c_uint32, 16), ('ip_instance', ctypes.c_uint32, 20), ('ring', ctypes.c_uint32, 24), ('ctx_id', ctypes.c_uint32, 28)]) +@c.record +class struct_drm_amdgpu_wait_cs_out(c.Struct): + SIZE = 8 + status: int +struct_drm_amdgpu_wait_cs_out.register_fields([('status', ctypes.c_uint64, 0)]) +@c.record +class union_drm_amdgpu_wait_cs(c.Struct): + SIZE = 32 + _in: struct_drm_amdgpu_wait_cs_in + out: struct_drm_amdgpu_wait_cs_out +union_drm_amdgpu_wait_cs.register_fields([('_in', struct_drm_amdgpu_wait_cs_in, 0), ('out', struct_drm_amdgpu_wait_cs_out, 0)]) +@c.record +class struct_drm_amdgpu_fence(c.Struct): + SIZE = 24 + ctx_id: int + ip_type: int + ip_instance: int + ring: int + seq_no: int +struct_drm_amdgpu_fence.register_fields([('ctx_id', ctypes.c_uint32, 0), ('ip_type', ctypes.c_uint32, 4), ('ip_instance', ctypes.c_uint32, 8), ('ring', ctypes.c_uint32, 12), ('seq_no', ctypes.c_uint64, 16)]) +@c.record +class struct_drm_amdgpu_wait_fences_in(c.Struct): + SIZE = 24 + fences: int + fence_count: int + wait_all: int + timeout_ns: int +struct_drm_amdgpu_wait_fences_in.register_fields([('fences', ctypes.c_uint64, 0), ('fence_count', ctypes.c_uint32, 8), ('wait_all', ctypes.c_uint32, 12), ('timeout_ns', ctypes.c_uint64, 16)]) +@c.record +class struct_drm_amdgpu_wait_fences_out(c.Struct): + SIZE = 8 + status: int + first_signaled: int +struct_drm_amdgpu_wait_fences_out.register_fields([('status', ctypes.c_uint32, 0), ('first_signaled', ctypes.c_uint32, 4)]) +@c.record +class union_drm_amdgpu_wait_fences(c.Struct): + SIZE = 24 + _in: struct_drm_amdgpu_wait_fences_in + out: struct_drm_amdgpu_wait_fences_out +union_drm_amdgpu_wait_fences.register_fields([('_in', struct_drm_amdgpu_wait_fences_in, 0), ('out', struct_drm_amdgpu_wait_fences_out, 0)]) +@c.record +class struct_drm_amdgpu_gem_op(c.Struct): + SIZE = 16 + handle: int + op: int + value: int +struct_drm_amdgpu_gem_op.register_fields([('handle', ctypes.c_uint32, 0), ('op', ctypes.c_uint32, 4), ('value', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_amdgpu_gem_va(c.Struct): + SIZE = 64 + handle: int + _pad: int + operation: int + flags: int + va_address: int + offset_in_bo: int + map_size: int + vm_timeline_point: int + vm_timeline_syncobj_out: int + num_syncobj_handles: int + input_fence_syncobj_handles: int +struct_drm_amdgpu_gem_va.register_fields([('handle', ctypes.c_uint32, 0), ('_pad', ctypes.c_uint32, 4), ('operation', ctypes.c_uint32, 8), ('flags', ctypes.c_uint32, 12), ('va_address', ctypes.c_uint64, 16), ('offset_in_bo', ctypes.c_uint64, 24), ('map_size', ctypes.c_uint64, 32), ('vm_timeline_point', ctypes.c_uint64, 40), ('vm_timeline_syncobj_out', ctypes.c_uint32, 48), ('num_syncobj_handles', ctypes.c_uint32, 52), ('input_fence_syncobj_handles', ctypes.c_uint64, 56)]) +@c.record +class struct_drm_amdgpu_cs_chunk(c.Struct): + SIZE = 16 + chunk_id: int + length_dw: int + chunk_data: int +struct_drm_amdgpu_cs_chunk.register_fields([('chunk_id', ctypes.c_uint32, 0), ('length_dw', ctypes.c_uint32, 4), ('chunk_data', ctypes.c_uint64, 8)]) +@c.record +class struct_drm_amdgpu_cs_in(c.Struct): + SIZE = 24 + ctx_id: int + bo_list_handle: int + num_chunks: int + flags: int + chunks: int +struct_drm_amdgpu_cs_in.register_fields([('ctx_id', ctypes.c_uint32, 0), ('bo_list_handle', ctypes.c_uint32, 4), ('num_chunks', ctypes.c_uint32, 8), ('flags', ctypes.c_uint32, 12), ('chunks', ctypes.c_uint64, 16)]) +@c.record +class struct_drm_amdgpu_cs_out(c.Struct): + SIZE = 8 + handle: int +struct_drm_amdgpu_cs_out.register_fields([('handle', ctypes.c_uint64, 0)]) +@c.record +class union_drm_amdgpu_cs(c.Struct): + SIZE = 24 + _in: struct_drm_amdgpu_cs_in + out: struct_drm_amdgpu_cs_out +union_drm_amdgpu_cs.register_fields([('_in', struct_drm_amdgpu_cs_in, 0), ('out', struct_drm_amdgpu_cs_out, 0)]) +@c.record +class struct_drm_amdgpu_cs_chunk_ib(c.Struct): + SIZE = 32 + _pad: int + flags: int + va_start: int + ib_bytes: int + ip_type: int + ip_instance: int + ring: int +struct_drm_amdgpu_cs_chunk_ib.register_fields([('_pad', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('va_start', ctypes.c_uint64, 8), ('ib_bytes', ctypes.c_uint32, 16), ('ip_type', ctypes.c_uint32, 20), ('ip_instance', ctypes.c_uint32, 24), ('ring', ctypes.c_uint32, 28)]) +@c.record +class struct_drm_amdgpu_cs_chunk_dep(c.Struct): + SIZE = 24 + ip_type: int + ip_instance: int + ring: int + ctx_id: int + handle: int +struct_drm_amdgpu_cs_chunk_dep.register_fields([('ip_type', ctypes.c_uint32, 0), ('ip_instance', ctypes.c_uint32, 4), ('ring', ctypes.c_uint32, 8), ('ctx_id', ctypes.c_uint32, 12), ('handle', ctypes.c_uint64, 16)]) +@c.record +class struct_drm_amdgpu_cs_chunk_fence(c.Struct): + SIZE = 8 + handle: int + offset: int +struct_drm_amdgpu_cs_chunk_fence.register_fields([('handle', ctypes.c_uint32, 0), ('offset', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_amdgpu_cs_chunk_sem(c.Struct): + SIZE = 4 + handle: int +struct_drm_amdgpu_cs_chunk_sem.register_fields([('handle', ctypes.c_uint32, 0)]) +@c.record +class struct_drm_amdgpu_cs_chunk_syncobj(c.Struct): + SIZE = 16 + handle: int + flags: int + point: int +struct_drm_amdgpu_cs_chunk_syncobj.register_fields([('handle', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('point', ctypes.c_uint64, 8)]) +@c.record +class union_drm_amdgpu_fence_to_handle(c.Struct): + SIZE = 32 + _in: union_drm_amdgpu_fence_to_handle_in + out: union_drm_amdgpu_fence_to_handle_out +@c.record +class union_drm_amdgpu_fence_to_handle_in(c.Struct): + SIZE = 32 + fence: struct_drm_amdgpu_fence + what: int + pad: int +union_drm_amdgpu_fence_to_handle_in.register_fields([('fence', struct_drm_amdgpu_fence, 0), ('what', ctypes.c_uint32, 24), ('pad', ctypes.c_uint32, 28)]) +@c.record +class union_drm_amdgpu_fence_to_handle_out(c.Struct): + SIZE = 4 + handle: int +union_drm_amdgpu_fence_to_handle_out.register_fields([('handle', ctypes.c_uint32, 0)]) +union_drm_amdgpu_fence_to_handle.register_fields([('_in', union_drm_amdgpu_fence_to_handle_in, 0), ('out', union_drm_amdgpu_fence_to_handle_out, 0)]) +@c.record +class struct_drm_amdgpu_cs_chunk_data(c.Struct): + SIZE = 32 + ib_data: struct_drm_amdgpu_cs_chunk_ib + fence_data: struct_drm_amdgpu_cs_chunk_fence +struct_drm_amdgpu_cs_chunk_data.register_fields([('ib_data', struct_drm_amdgpu_cs_chunk_ib, 0), ('fence_data', struct_drm_amdgpu_cs_chunk_fence, 0)]) +@c.record +class struct_drm_amdgpu_cs_chunk_cp_gfx_shadow(c.Struct): + SIZE = 32 + shadow_va: int + csa_va: int + gds_va: int + flags: int +struct_drm_amdgpu_cs_chunk_cp_gfx_shadow.register_fields([('shadow_va', ctypes.c_uint64, 0), ('csa_va', ctypes.c_uint64, 8), ('gds_va', ctypes.c_uint64, 16), ('flags', ctypes.c_uint64, 24)]) +@c.record +class struct_drm_amdgpu_query_fw(c.Struct): + SIZE = 16 + fw_type: int + ip_instance: int + index: int + _pad: int +struct_drm_amdgpu_query_fw.register_fields([('fw_type', ctypes.c_uint32, 0), ('ip_instance', ctypes.c_uint32, 4), ('index', ctypes.c_uint32, 8), ('_pad', ctypes.c_uint32, 12)]) +@c.record +class struct_drm_amdgpu_info(c.Struct): + SIZE = 16 + return_pointer: int + return_size: int + query: int +struct_drm_amdgpu_info.register_fields([('return_pointer', ctypes.c_uint64, 0), ('return_size', ctypes.c_uint32, 8), ('query', ctypes.c_uint32, 12)]) +@c.record +class struct_drm_amdgpu_info_gds(c.Struct): + SIZE = 32 + gds_gfx_partition_size: int + compute_partition_size: int + gds_total_size: int + gws_per_gfx_partition: int + gws_per_compute_partition: int + oa_per_gfx_partition: int + oa_per_compute_partition: int + _pad: int +struct_drm_amdgpu_info_gds.register_fields([('gds_gfx_partition_size', ctypes.c_uint32, 0), ('compute_partition_size', ctypes.c_uint32, 4), ('gds_total_size', ctypes.c_uint32, 8), ('gws_per_gfx_partition', ctypes.c_uint32, 12), ('gws_per_compute_partition', ctypes.c_uint32, 16), ('oa_per_gfx_partition', ctypes.c_uint32, 20), ('oa_per_compute_partition', ctypes.c_uint32, 24), ('_pad', ctypes.c_uint32, 28)]) +@c.record +class struct_drm_amdgpu_info_vram_gtt(c.Struct): + SIZE = 24 + vram_size: int + vram_cpu_accessible_size: int + gtt_size: int +struct_drm_amdgpu_info_vram_gtt.register_fields([('vram_size', ctypes.c_uint64, 0), ('vram_cpu_accessible_size', ctypes.c_uint64, 8), ('gtt_size', ctypes.c_uint64, 16)]) +@c.record +class struct_drm_amdgpu_heap_info(c.Struct): + SIZE = 32 + total_heap_size: int + usable_heap_size: int + heap_usage: int + max_allocation: int +struct_drm_amdgpu_heap_info.register_fields([('total_heap_size', ctypes.c_uint64, 0), ('usable_heap_size', ctypes.c_uint64, 8), ('heap_usage', ctypes.c_uint64, 16), ('max_allocation', ctypes.c_uint64, 24)]) +@c.record +class struct_drm_amdgpu_memory_info(c.Struct): + SIZE = 96 + vram: struct_drm_amdgpu_heap_info + cpu_accessible_vram: struct_drm_amdgpu_heap_info + gtt: struct_drm_amdgpu_heap_info +struct_drm_amdgpu_memory_info.register_fields([('vram', struct_drm_amdgpu_heap_info, 0), ('cpu_accessible_vram', struct_drm_amdgpu_heap_info, 32), ('gtt', struct_drm_amdgpu_heap_info, 64)]) +@c.record +class struct_drm_amdgpu_info_firmware(c.Struct): + SIZE = 8 + ver: int + feature: int +struct_drm_amdgpu_info_firmware.register_fields([('ver', ctypes.c_uint32, 0), ('feature', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_amdgpu_info_vbios(c.Struct): + SIZE = 200 + name: c.Array[ctypes.c_ubyte, Literal[64]] + vbios_pn: c.Array[ctypes.c_ubyte, Literal[64]] + version: int + pad: int + vbios_ver_str: c.Array[ctypes.c_ubyte, Literal[32]] + date: c.Array[ctypes.c_ubyte, Literal[32]] +__u8: TypeAlias = ctypes.c_ubyte +struct_drm_amdgpu_info_vbios.register_fields([('name', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('vbios_pn', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('version', ctypes.c_uint32, 128), ('pad', ctypes.c_uint32, 132), ('vbios_ver_str', c.Array[ctypes.c_ubyte, Literal[32]], 136), ('date', c.Array[ctypes.c_ubyte, Literal[32]], 168)]) +@c.record +class struct_drm_amdgpu_info_device(c.Struct): + SIZE = 448 + device_id: int + chip_rev: int + external_rev: int + pci_rev: int + family: int + num_shader_engines: int + num_shader_arrays_per_engine: int + gpu_counter_freq: int + max_engine_clock: int + max_memory_clock: int + cu_active_number: int + cu_ao_mask: int + cu_bitmap: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[4]] + enabled_rb_pipes_mask: int + num_rb_pipes: int + num_hw_gfx_contexts: int + pcie_gen: int + ids_flags: int + virtual_address_offset: int + virtual_address_max: int + virtual_address_alignment: int + pte_fragment_size: int + gart_page_size: int + ce_ram_size: int + vram_type: int + vram_bit_width: int + vce_harvest_config: int + gc_double_offchip_lds_buf: int + prim_buf_gpu_addr: int + pos_buf_gpu_addr: int + cntl_sb_buf_gpu_addr: int + param_buf_gpu_addr: int + prim_buf_size: int + pos_buf_size: int + cntl_sb_buf_size: int + param_buf_size: int + wave_front_size: int + num_shader_visible_vgprs: int + num_cu_per_sh: int + num_tcc_blocks: int + gs_vgt_table_depth: int + gs_prim_buffer_depth: int + max_gs_waves_per_vgt: int + pcie_num_lanes: int + cu_ao_bitmap: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[4]] + high_va_offset: int + high_va_max: int + pa_sc_tile_steering_override: int + tcc_disabled_mask: int + min_engine_clock: int + min_memory_clock: int + tcp_cache_size: int + num_sqc_per_wgp: int + sqc_data_cache_size: int + sqc_inst_cache_size: int + gl1c_cache_size: int + gl2c_cache_size: int + mall_size: int + enabled_rb_pipes_mask_hi: int + shadow_size: int + shadow_alignment: int + csa_size: int + csa_alignment: int + userq_ip_mask: int + pad: int +struct_drm_amdgpu_info_device.register_fields([('device_id', ctypes.c_uint32, 0), ('chip_rev', ctypes.c_uint32, 4), ('external_rev', ctypes.c_uint32, 8), ('pci_rev', ctypes.c_uint32, 12), ('family', ctypes.c_uint32, 16), ('num_shader_engines', ctypes.c_uint32, 20), ('num_shader_arrays_per_engine', ctypes.c_uint32, 24), ('gpu_counter_freq', ctypes.c_uint32, 28), ('max_engine_clock', ctypes.c_uint64, 32), ('max_memory_clock', ctypes.c_uint64, 40), ('cu_active_number', ctypes.c_uint32, 48), ('cu_ao_mask', ctypes.c_uint32, 52), ('cu_bitmap', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[4]], 56), ('enabled_rb_pipes_mask', ctypes.c_uint32, 120), ('num_rb_pipes', ctypes.c_uint32, 124), ('num_hw_gfx_contexts', ctypes.c_uint32, 128), ('pcie_gen', ctypes.c_uint32, 132), ('ids_flags', ctypes.c_uint64, 136), ('virtual_address_offset', ctypes.c_uint64, 144), ('virtual_address_max', ctypes.c_uint64, 152), ('virtual_address_alignment', ctypes.c_uint32, 160), ('pte_fragment_size', ctypes.c_uint32, 164), ('gart_page_size', ctypes.c_uint32, 168), ('ce_ram_size', ctypes.c_uint32, 172), ('vram_type', ctypes.c_uint32, 176), ('vram_bit_width', ctypes.c_uint32, 180), ('vce_harvest_config', ctypes.c_uint32, 184), ('gc_double_offchip_lds_buf', ctypes.c_uint32, 188), ('prim_buf_gpu_addr', ctypes.c_uint64, 192), ('pos_buf_gpu_addr', ctypes.c_uint64, 200), ('cntl_sb_buf_gpu_addr', ctypes.c_uint64, 208), ('param_buf_gpu_addr', ctypes.c_uint64, 216), ('prim_buf_size', ctypes.c_uint32, 224), ('pos_buf_size', ctypes.c_uint32, 228), ('cntl_sb_buf_size', ctypes.c_uint32, 232), ('param_buf_size', ctypes.c_uint32, 236), ('wave_front_size', ctypes.c_uint32, 240), ('num_shader_visible_vgprs', ctypes.c_uint32, 244), ('num_cu_per_sh', ctypes.c_uint32, 248), ('num_tcc_blocks', ctypes.c_uint32, 252), ('gs_vgt_table_depth', ctypes.c_uint32, 256), ('gs_prim_buffer_depth', ctypes.c_uint32, 260), ('max_gs_waves_per_vgt', ctypes.c_uint32, 264), ('pcie_num_lanes', ctypes.c_uint32, 268), ('cu_ao_bitmap', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[4]], 272), ('high_va_offset', ctypes.c_uint64, 336), ('high_va_max', ctypes.c_uint64, 344), ('pa_sc_tile_steering_override', ctypes.c_uint32, 352), ('tcc_disabled_mask', ctypes.c_uint64, 360), ('min_engine_clock', ctypes.c_uint64, 368), ('min_memory_clock', ctypes.c_uint64, 376), ('tcp_cache_size', ctypes.c_uint32, 384), ('num_sqc_per_wgp', ctypes.c_uint32, 388), ('sqc_data_cache_size', ctypes.c_uint32, 392), ('sqc_inst_cache_size', ctypes.c_uint32, 396), ('gl1c_cache_size', ctypes.c_uint32, 400), ('gl2c_cache_size', ctypes.c_uint32, 404), ('mall_size', ctypes.c_uint64, 408), ('enabled_rb_pipes_mask_hi', ctypes.c_uint32, 416), ('shadow_size', ctypes.c_uint32, 420), ('shadow_alignment', ctypes.c_uint32, 424), ('csa_size', ctypes.c_uint32, 428), ('csa_alignment', ctypes.c_uint32, 432), ('userq_ip_mask', ctypes.c_uint32, 436), ('pad', ctypes.c_uint32, 440)]) +@c.record +class struct_drm_amdgpu_info_hw_ip(c.Struct): + SIZE = 32 + hw_ip_version_major: int + hw_ip_version_minor: int + capabilities_flags: int + ib_start_alignment: int + ib_size_alignment: int + available_rings: int + ip_discovery_version: int +struct_drm_amdgpu_info_hw_ip.register_fields([('hw_ip_version_major', ctypes.c_uint32, 0), ('hw_ip_version_minor', ctypes.c_uint32, 4), ('capabilities_flags', ctypes.c_uint64, 8), ('ib_start_alignment', ctypes.c_uint32, 16), ('ib_size_alignment', ctypes.c_uint32, 20), ('available_rings', ctypes.c_uint32, 24), ('ip_discovery_version', ctypes.c_uint32, 28)]) +@c.record +class struct_drm_amdgpu_info_uq_fw_areas_gfx(c.Struct): + SIZE = 16 + shadow_size: int + shadow_alignment: int + csa_size: int + csa_alignment: int +struct_drm_amdgpu_info_uq_fw_areas_gfx.register_fields([('shadow_size', ctypes.c_uint32, 0), ('shadow_alignment', ctypes.c_uint32, 4), ('csa_size', ctypes.c_uint32, 8), ('csa_alignment', ctypes.c_uint32, 12)]) +@c.record +class struct_drm_amdgpu_info_uq_fw_areas(c.Struct): + SIZE = 16 + gfx: struct_drm_amdgpu_info_uq_fw_areas_gfx +struct_drm_amdgpu_info_uq_fw_areas.register_fields([('gfx', struct_drm_amdgpu_info_uq_fw_areas_gfx, 0)]) +@c.record +class struct_drm_amdgpu_info_num_handles(c.Struct): + SIZE = 8 + uvd_max_handles: int + uvd_used_handles: int +struct_drm_amdgpu_info_num_handles.register_fields([('uvd_max_handles', ctypes.c_uint32, 0), ('uvd_used_handles', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_amdgpu_info_vce_clock_table_entry(c.Struct): + SIZE = 16 + sclk: int + mclk: int + eclk: int + pad: int +struct_drm_amdgpu_info_vce_clock_table_entry.register_fields([('sclk', ctypes.c_uint32, 0), ('mclk', ctypes.c_uint32, 4), ('eclk', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_drm_amdgpu_info_vce_clock_table(c.Struct): + SIZE = 104 + entries: c.Array[struct_drm_amdgpu_info_vce_clock_table_entry, Literal[6]] + num_valid_entries: int + pad: int +struct_drm_amdgpu_info_vce_clock_table.register_fields([('entries', c.Array[struct_drm_amdgpu_info_vce_clock_table_entry, Literal[6]], 0), ('num_valid_entries', ctypes.c_uint32, 96), ('pad', ctypes.c_uint32, 100)]) +@c.record +class struct_drm_amdgpu_info_video_codec_info(c.Struct): + SIZE = 24 + valid: int + max_width: int + max_height: int + max_pixels_per_frame: int + max_level: int + pad: int +struct_drm_amdgpu_info_video_codec_info.register_fields([('valid', ctypes.c_uint32, 0), ('max_width', ctypes.c_uint32, 4), ('max_height', ctypes.c_uint32, 8), ('max_pixels_per_frame', ctypes.c_uint32, 12), ('max_level', ctypes.c_uint32, 16), ('pad', ctypes.c_uint32, 20)]) +@c.record +class struct_drm_amdgpu_info_video_caps(c.Struct): + SIZE = 192 + codec_info: c.Array[struct_drm_amdgpu_info_video_codec_info, Literal[8]] +struct_drm_amdgpu_info_video_caps.register_fields([('codec_info', c.Array[struct_drm_amdgpu_info_video_codec_info, Literal[8]], 0)]) +@c.record +class struct_drm_amdgpu_info_gpuvm_fault(c.Struct): + SIZE = 16 + addr: int + status: int + vmhub: int +struct_drm_amdgpu_info_gpuvm_fault.register_fields([('addr', ctypes.c_uint64, 0), ('status', ctypes.c_uint32, 8), ('vmhub', ctypes.c_uint32, 12)]) +@c.record +class struct_drm_amdgpu_info_uq_metadata_gfx(c.Struct): + SIZE = 16 + shadow_size: int + shadow_alignment: int + csa_size: int + csa_alignment: int +struct_drm_amdgpu_info_uq_metadata_gfx.register_fields([('shadow_size', ctypes.c_uint32, 0), ('shadow_alignment', ctypes.c_uint32, 4), ('csa_size', ctypes.c_uint32, 8), ('csa_alignment', ctypes.c_uint32, 12)]) +@c.record +class struct_drm_amdgpu_info_uq_metadata(c.Struct): + SIZE = 16 + gfx: struct_drm_amdgpu_info_uq_metadata_gfx +struct_drm_amdgpu_info_uq_metadata.register_fields([('gfx', struct_drm_amdgpu_info_uq_metadata_gfx, 0)]) +class _anonstruct0(c.Struct): pass +class struct_drm_amdgpu_virtual_range(c.Struct): pass +@c.record +class struct_drm_amdgpu_capability(c.Struct): + SIZE = 8 + flag: int + direct_gma_size: int +struct_drm_amdgpu_capability.register_fields([('flag', ctypes.c_uint32, 0), ('direct_gma_size', ctypes.c_uint32, 4)]) +@c.record +class struct_drm_amdgpu_freesync(c.Struct): + SIZE = 32 + op: int + spare: c.Array[ctypes.c_uint32, Literal[7]] +struct_drm_amdgpu_freesync.register_fields([('op', ctypes.c_uint32, 0), ('spare', c.Array[ctypes.c_uint32, Literal[7]], 4)]) +DRM_NAME = "drm" +DRM_MIN_ORDER = 5 +DRM_MAX_ORDER = 22 +DRM_RAM_PERCENT = 10 +_DRM_LOCK_HELD = 0x80000000 +_DRM_LOCK_CONT = 0x40000000 +_DRM_LOCK_IS_HELD = lambda lock: ((lock) & _DRM_LOCK_HELD) # type: ignore +_DRM_LOCK_IS_CONT = lambda lock: ((lock) & _DRM_LOCK_CONT) # type: ignore +_DRM_LOCKING_CONTEXT = lambda lock: ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT)) # type: ignore +_DRM_VBLANK_HIGH_CRTC_SHIFT = 1 +_DRM_VBLANK_TYPES_MASK = (_DRM_VBLANK_ABSOLUTE | _DRM_VBLANK_RELATIVE) +_DRM_VBLANK_FLAGS_MASK = (_DRM_VBLANK_EVENT | _DRM_VBLANK_SIGNAL | _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS) +_DRM_PRE_MODESET = 1 +_DRM_POST_MODESET = 2 +DRM_CAP_DUMB_BUFFER = 0x1 +DRM_CAP_VBLANK_HIGH_CRTC = 0x2 +DRM_CAP_DUMB_PREFERRED_DEPTH = 0x3 +DRM_CAP_DUMB_PREFER_SHADOW = 0x4 +DRM_CAP_PRIME = 0x5 +DRM_PRIME_CAP_IMPORT = 0x1 +DRM_PRIME_CAP_EXPORT = 0x2 +DRM_CAP_TIMESTAMP_MONOTONIC = 0x6 +DRM_CAP_ASYNC_PAGE_FLIP = 0x7 +DRM_CAP_CURSOR_WIDTH = 0x8 +DRM_CAP_CURSOR_HEIGHT = 0x9 +DRM_CAP_ADDFB2_MODIFIERS = 0x10 +DRM_CAP_PAGE_FLIP_TARGET = 0x11 +DRM_CAP_CRTC_IN_VBLANK_EVENT = 0x12 +DRM_CAP_SYNCOBJ = 0x13 +DRM_CAP_SYNCOBJ_TIMELINE = 0x14 +DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP = 0x15 +DRM_CLIENT_CAP_STEREO_3D = 1 +DRM_CLIENT_CAP_UNIVERSAL_PLANES = 2 +DRM_CLIENT_CAP_ATOMIC = 3 +DRM_CLIENT_CAP_ASPECT_RATIO = 4 +DRM_CLIENT_CAP_WRITEBACK_CONNECTORS = 5 +DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT = 6 +DRM_SYNCOBJ_CREATE_SIGNALED = (1 << 0) +DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE = (1 << 0) +DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE = (1 << 0) +DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL = (1 << 0) +DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT = (1 << 1) +DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE = (1 << 2) +DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE = (1 << 3) +DRM_SYNCOBJ_QUERY_FLAGS_LAST_SUBMITTED = (1 << 0) +DRM_CRTC_SEQUENCE_RELATIVE = 0x00000001 +DRM_CRTC_SEQUENCE_NEXT_ON_MISS = 0x00000002 +DRM_IOCTL_BASE = 'd' +DRM_IO = lambda nr: _IO(DRM_IOCTL_BASE,nr) # type: ignore +DRM_IOR = lambda nr,type: _IOR(DRM_IOCTL_BASE,nr,type) # type: ignore +DRM_IOW = lambda nr,type: _IOW(DRM_IOCTL_BASE,nr,type) # type: ignore +DRM_IOWR = lambda nr,type: _IOWR(DRM_IOCTL_BASE,nr,type) # type: ignore +DRM_IOCTL_VERSION = DRM_IOWR(0x00, struct_drm_version) +DRM_IOCTL_GET_UNIQUE = DRM_IOWR(0x01, struct_drm_unique) +DRM_IOCTL_GET_MAGIC = DRM_IOR( 0x02, struct_drm_auth) +DRM_IOCTL_IRQ_BUSID = DRM_IOWR(0x03, struct_drm_irq_busid) +DRM_IOCTL_GET_MAP = DRM_IOWR(0x04, struct_drm_map) +DRM_IOCTL_GET_CLIENT = DRM_IOWR(0x05, struct_drm_client) +DRM_IOCTL_GET_STATS = DRM_IOR( 0x06, struct_drm_stats) +DRM_IOCTL_SET_VERSION = DRM_IOWR(0x07, struct_drm_set_version) +DRM_IOCTL_MODESET_CTL = DRM_IOW(0x08, struct_drm_modeset_ctl) +DRM_IOCTL_GEM_CLOSE = DRM_IOW (0x09, struct_drm_gem_close) +DRM_IOCTL_GEM_FLINK = DRM_IOWR(0x0a, struct_drm_gem_flink) +DRM_IOCTL_GEM_OPEN = DRM_IOWR(0x0b, struct_drm_gem_open) +DRM_IOCTL_GET_CAP = DRM_IOWR(0x0c, struct_drm_get_cap) +DRM_IOCTL_SET_CLIENT_CAP = DRM_IOW( 0x0d, struct_drm_set_client_cap) +DRM_IOCTL_SET_UNIQUE = DRM_IOW( 0x10, struct_drm_unique) +DRM_IOCTL_AUTH_MAGIC = DRM_IOW( 0x11, struct_drm_auth) +DRM_IOCTL_BLOCK = DRM_IOWR(0x12, struct_drm_block) +DRM_IOCTL_UNBLOCK = DRM_IOWR(0x13, struct_drm_block) +DRM_IOCTL_CONTROL = DRM_IOW( 0x14, struct_drm_control) +DRM_IOCTL_ADD_MAP = DRM_IOWR(0x15, struct_drm_map) +DRM_IOCTL_ADD_BUFS = DRM_IOWR(0x16, struct_drm_buf_desc) +DRM_IOCTL_MARK_BUFS = DRM_IOW( 0x17, struct_drm_buf_desc) +DRM_IOCTL_INFO_BUFS = DRM_IOWR(0x18, struct_drm_buf_info) +DRM_IOCTL_MAP_BUFS = DRM_IOWR(0x19, struct_drm_buf_map) +DRM_IOCTL_FREE_BUFS = DRM_IOW( 0x1a, struct_drm_buf_free) +DRM_IOCTL_RM_MAP = DRM_IOW( 0x1b, struct_drm_map) +DRM_IOCTL_SET_SAREA_CTX = DRM_IOW( 0x1c, struct_drm_ctx_priv_map) +DRM_IOCTL_GET_SAREA_CTX = DRM_IOWR(0x1d, struct_drm_ctx_priv_map) +DRM_IOCTL_SET_MASTER = DRM_IO(0x1e) +DRM_IOCTL_DROP_MASTER = DRM_IO(0x1f) +DRM_IOCTL_ADD_CTX = DRM_IOWR(0x20, struct_drm_ctx) +DRM_IOCTL_RM_CTX = DRM_IOWR(0x21, struct_drm_ctx) +DRM_IOCTL_MOD_CTX = DRM_IOW( 0x22, struct_drm_ctx) +DRM_IOCTL_GET_CTX = DRM_IOWR(0x23, struct_drm_ctx) +DRM_IOCTL_SWITCH_CTX = DRM_IOW( 0x24, struct_drm_ctx) +DRM_IOCTL_NEW_CTX = DRM_IOW( 0x25, struct_drm_ctx) +DRM_IOCTL_RES_CTX = DRM_IOWR(0x26, struct_drm_ctx_res) +DRM_IOCTL_ADD_DRAW = DRM_IOWR(0x27, struct_drm_draw) +DRM_IOCTL_RM_DRAW = DRM_IOWR(0x28, struct_drm_draw) +DRM_IOCTL_DMA = DRM_IOWR(0x29, struct_drm_dma) +DRM_IOCTL_LOCK = DRM_IOW( 0x2a, struct_drm_lock) +DRM_IOCTL_UNLOCK = DRM_IOW( 0x2b, struct_drm_lock) +DRM_IOCTL_FINISH = DRM_IOW( 0x2c, struct_drm_lock) +DRM_IOCTL_PRIME_HANDLE_TO_FD = DRM_IOWR(0x2d, struct_drm_prime_handle) +DRM_IOCTL_PRIME_FD_TO_HANDLE = DRM_IOWR(0x2e, struct_drm_prime_handle) +DRM_IOCTL_AGP_ACQUIRE = DRM_IO( 0x30) +DRM_IOCTL_AGP_RELEASE = DRM_IO( 0x31) +DRM_IOCTL_AGP_ENABLE = DRM_IOW( 0x32, struct_drm_agp_mode) +DRM_IOCTL_AGP_INFO = DRM_IOR( 0x33, struct_drm_agp_info) +DRM_IOCTL_AGP_ALLOC = DRM_IOWR(0x34, struct_drm_agp_buffer) +DRM_IOCTL_AGP_FREE = DRM_IOW( 0x35, struct_drm_agp_buffer) +DRM_IOCTL_AGP_BIND = DRM_IOW( 0x36, struct_drm_agp_binding) +DRM_IOCTL_AGP_UNBIND = DRM_IOW( 0x37, struct_drm_agp_binding) +DRM_IOCTL_SG_ALLOC = DRM_IOWR(0x38, struct_drm_scatter_gather) +DRM_IOCTL_SG_FREE = DRM_IOW( 0x39, struct_drm_scatter_gather) +DRM_IOCTL_WAIT_VBLANK = DRM_IOWR(0x3a, union_drm_wait_vblank) +DRM_IOCTL_CRTC_GET_SEQUENCE = DRM_IOWR(0x3b, struct_drm_crtc_get_sequence) +DRM_IOCTL_CRTC_QUEUE_SEQUENCE = DRM_IOWR(0x3c, struct_drm_crtc_queue_sequence) +DRM_IOCTL_UPDATE_DRAW = DRM_IOW(0x3f, struct_drm_update_draw) +DRM_IOCTL_SYNCOBJ_CREATE = DRM_IOWR(0xBF, struct_drm_syncobj_create) +DRM_IOCTL_SYNCOBJ_DESTROY = DRM_IOWR(0xC0, struct_drm_syncobj_destroy) +DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD = DRM_IOWR(0xC1, struct_drm_syncobj_handle) +DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE = DRM_IOWR(0xC2, struct_drm_syncobj_handle) +DRM_IOCTL_SYNCOBJ_WAIT = DRM_IOWR(0xC3, struct_drm_syncobj_wait) +DRM_IOCTL_SYNCOBJ_RESET = DRM_IOWR(0xC4, struct_drm_syncobj_array) +DRM_IOCTL_SYNCOBJ_SIGNAL = DRM_IOWR(0xC5, struct_drm_syncobj_array) +DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT = DRM_IOWR(0xCA, struct_drm_syncobj_timeline_wait) +DRM_IOCTL_SYNCOBJ_QUERY = DRM_IOWR(0xCB, struct_drm_syncobj_timeline_array) +DRM_IOCTL_SYNCOBJ_TRANSFER = DRM_IOWR(0xCC, struct_drm_syncobj_transfer) +DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL = DRM_IOWR(0xCD, struct_drm_syncobj_timeline_array) +DRM_IOCTL_SYNCOBJ_EVENTFD = DRM_IOWR(0xCF, struct_drm_syncobj_eventfd) +DRM_COMMAND_BASE = 0x40 +DRM_COMMAND_END = 0xA0 +DRM_EVENT_VBLANK = 0x01 +DRM_EVENT_FLIP_COMPLETE = 0x02 +DRM_EVENT_CRTC_SEQUENCE = 0x03 +DRM_AMDGPU_GEM_CREATE = 0x00 +DRM_AMDGPU_GEM_MMAP = 0x01 +DRM_AMDGPU_CTX = 0x02 +DRM_AMDGPU_BO_LIST = 0x03 +DRM_AMDGPU_CS = 0x04 +DRM_AMDGPU_INFO = 0x05 +DRM_AMDGPU_GEM_METADATA = 0x06 +DRM_AMDGPU_GEM_WAIT_IDLE = 0x07 +DRM_AMDGPU_GEM_VA = 0x08 +DRM_AMDGPU_WAIT_CS = 0x09 +DRM_AMDGPU_GEM_OP = 0x10 +DRM_AMDGPU_GEM_USERPTR = 0x11 +DRM_AMDGPU_WAIT_FENCES = 0x12 +DRM_AMDGPU_VM = 0x13 +DRM_AMDGPU_FENCE_TO_HANDLE = 0x14 +DRM_AMDGPU_SCHED = 0x15 +DRM_AMDGPU_USERQ = 0x16 +DRM_AMDGPU_USERQ_SIGNAL = 0x17 +DRM_AMDGPU_USERQ_WAIT = 0x18 +DRM_AMDGPU_GEM_DGMA = 0x5c +DRM_AMDGPU_SEM = 0x5b +DRM_IOCTL_AMDGPU_GEM_CREATE = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_CREATE, union_drm_amdgpu_gem_create) +DRM_IOCTL_AMDGPU_GEM_MMAP = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_MMAP, union_drm_amdgpu_gem_mmap) +DRM_IOCTL_AMDGPU_CTX = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_CTX, union_drm_amdgpu_ctx) +DRM_IOCTL_AMDGPU_BO_LIST = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_BO_LIST, union_drm_amdgpu_bo_list) +DRM_IOCTL_AMDGPU_CS = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_CS, union_drm_amdgpu_cs) +DRM_IOCTL_AMDGPU_INFO = DRM_IOW(DRM_COMMAND_BASE + DRM_AMDGPU_INFO, struct_drm_amdgpu_info) +DRM_IOCTL_AMDGPU_GEM_METADATA = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_METADATA, struct_drm_amdgpu_gem_metadata) +DRM_IOCTL_AMDGPU_GEM_WAIT_IDLE = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_WAIT_IDLE, union_drm_amdgpu_gem_wait_idle) +DRM_IOCTL_AMDGPU_GEM_VA = DRM_IOW(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_VA, struct_drm_amdgpu_gem_va) +DRM_IOCTL_AMDGPU_WAIT_CS = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_WAIT_CS, union_drm_amdgpu_wait_cs) +DRM_IOCTL_AMDGPU_GEM_OP = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_OP, struct_drm_amdgpu_gem_op) +DRM_IOCTL_AMDGPU_GEM_USERPTR = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_USERPTR, struct_drm_amdgpu_gem_userptr) +DRM_IOCTL_AMDGPU_WAIT_FENCES = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_WAIT_FENCES, union_drm_amdgpu_wait_fences) +DRM_IOCTL_AMDGPU_VM = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_VM, union_drm_amdgpu_vm) +DRM_IOCTL_AMDGPU_FENCE_TO_HANDLE = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_FENCE_TO_HANDLE, union_drm_amdgpu_fence_to_handle) +DRM_IOCTL_AMDGPU_SCHED = DRM_IOW(DRM_COMMAND_BASE + DRM_AMDGPU_SCHED, union_drm_amdgpu_sched) +DRM_IOCTL_AMDGPU_USERQ = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_USERQ, union_drm_amdgpu_userq) +DRM_IOCTL_AMDGPU_USERQ_SIGNAL = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_USERQ_SIGNAL, struct_drm_amdgpu_userq_signal) +DRM_IOCTL_AMDGPU_USERQ_WAIT = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_USERQ_WAIT, struct_drm_amdgpu_userq_wait) +DRM_IOCTL_AMDGPU_GEM_DGMA = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_DGMA, struct_drm_amdgpu_gem_dgma) +DRM_IOCTL_AMDGPU_SEM = DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_SEM, union_drm_amdgpu_sem) +AMDGPU_GEM_DOMAIN_CPU = 0x1 +AMDGPU_GEM_DOMAIN_GTT = 0x2 +AMDGPU_GEM_DOMAIN_VRAM = 0x4 +AMDGPU_GEM_DOMAIN_GDS = 0x8 +AMDGPU_GEM_DOMAIN_GWS = 0x10 +AMDGPU_GEM_DOMAIN_OA = 0x20 +AMDGPU_GEM_DOMAIN_DOORBELL = 0x40 +AMDGPU_GEM_DOMAIN_DGMA = 0x400 +AMDGPU_GEM_DOMAIN_DGMA_IMPORT = 0x800 +AMDGPU_GEM_DOMAIN_MASK = (AMDGPU_GEM_DOMAIN_CPU | AMDGPU_GEM_DOMAIN_GTT | AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GDS | AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA | AMDGPU_GEM_DOMAIN_DOORBELL | AMDGPU_GEM_DOMAIN_DGMA | AMDGPU_GEM_DOMAIN_DGMA_IMPORT) +AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED = (1 << 0) +AMDGPU_GEM_CREATE_NO_CPU_ACCESS = (1 << 1) +AMDGPU_GEM_CREATE_CPU_GTT_USWC = (1 << 2) +AMDGPU_GEM_CREATE_VRAM_CLEARED = (1 << 3) +AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS = (1 << 5) +AMDGPU_GEM_CREATE_VM_ALWAYS_VALID = (1 << 6) +AMDGPU_GEM_CREATE_EXPLICIT_SYNC = (1 << 7) +AMDGPU_GEM_CREATE_CP_MQD_GFX9 = (1 << 8) +AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE = (1 << 9) +AMDGPU_GEM_CREATE_ENCRYPTED = (1 << 10) +AMDGPU_GEM_CREATE_PREEMPTIBLE = (1 << 11) +AMDGPU_GEM_CREATE_DISCARDABLE = (1 << 12) +AMDGPU_GEM_CREATE_COHERENT = (1 << 13) +AMDGPU_GEM_CREATE_UNCACHED = (1 << 14) +AMDGPU_GEM_CREATE_EXT_COHERENT = (1 << 15) +AMDGPU_GEM_CREATE_GFX12_DCC = (1 << 16) +AMDGPU_GEM_CREATE_SPARSE = (1 << 29) +AMDGPU_GEM_CREATE_TOP_DOWN = (1 << 30) +AMDGPU_GEM_CREATE_NO_EVICT = (1 << 31) +AMDGPU_BO_LIST_OP_CREATE = 0 +AMDGPU_BO_LIST_OP_DESTROY = 1 +AMDGPU_BO_LIST_OP_UPDATE = 2 +AMDGPU_CTX_OP_ALLOC_CTX = 1 +AMDGPU_CTX_OP_FREE_CTX = 2 +AMDGPU_CTX_OP_QUERY_STATE = 3 +AMDGPU_CTX_OP_QUERY_STATE2 = 4 +AMDGPU_CTX_OP_GET_STABLE_PSTATE = 5 +AMDGPU_CTX_OP_SET_STABLE_PSTATE = 6 +AMDGPU_CTX_NO_RESET = 0 +AMDGPU_CTX_GUILTY_RESET = 1 +AMDGPU_CTX_INNOCENT_RESET = 2 +AMDGPU_CTX_UNKNOWN_RESET = 3 +AMDGPU_CTX_QUERY2_FLAGS_RESET = (1<<0) +AMDGPU_CTX_QUERY2_FLAGS_VRAMLOST = (1<<1) +AMDGPU_CTX_QUERY2_FLAGS_GUILTY = (1<<2) +AMDGPU_CTX_QUERY2_FLAGS_RAS_CE = (1<<3) +AMDGPU_CTX_QUERY2_FLAGS_RAS_UE = (1<<4) +AMDGPU_CTX_QUERY2_FLAGS_RESET_IN_PROGRESS = (1<<5) +AMDGPU_CTX_PRIORITY_UNSET = -2048 +AMDGPU_CTX_PRIORITY_VERY_LOW = -1023 +AMDGPU_CTX_PRIORITY_LOW = -512 +AMDGPU_CTX_PRIORITY_NORMAL = 0 +AMDGPU_CTX_PRIORITY_HIGH = 512 +AMDGPU_CTX_PRIORITY_VERY_HIGH = 1023 +AMDGPU_CTX_STABLE_PSTATE_FLAGS_MASK = 0xf +AMDGPU_CTX_STABLE_PSTATE_NONE = 0 +AMDGPU_CTX_STABLE_PSTATE_STANDARD = 1 +AMDGPU_CTX_STABLE_PSTATE_MIN_SCLK = 2 +AMDGPU_CTX_STABLE_PSTATE_MIN_MCLK = 3 +AMDGPU_CTX_STABLE_PSTATE_PEAK = 4 +AMDGPU_USERQ_OP_CREATE = 1 +AMDGPU_USERQ_OP_FREE = 2 +AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_MASK = 0x3 +AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_SHIFT = 0 +AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_NORMAL_LOW = 0 +AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_LOW = 1 +AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_NORMAL_HIGH = 2 +AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_HIGH = 3 +AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE = (1 << 2) +AMDGPU_SEM_OP_CREATE_SEM = 1 +AMDGPU_SEM_OP_WAIT_SEM = 2 +AMDGPU_SEM_OP_SIGNAL_SEM = 3 +AMDGPU_SEM_OP_DESTROY_SEM = 4 +AMDGPU_SEM_OP_IMPORT_SEM = 5 +AMDGPU_SEM_OP_EXPORT_SEM = 6 +AMDGPU_VM_OP_RESERVE_VMID = 1 +AMDGPU_VM_OP_UNRESERVE_VMID = 2 +AMDGPU_SCHED_OP_PROCESS_PRIORITY_OVERRIDE = 1 +AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE = 2 +AMDGPU_GEM_USERPTR_READONLY = (1 << 0) +AMDGPU_GEM_USERPTR_ANONONLY = (1 << 1) +AMDGPU_GEM_USERPTR_VALIDATE = (1 << 2) +AMDGPU_GEM_USERPTR_REGISTER = (1 << 3) +AMDGPU_GEM_DGMA_IMPORT = 0 +AMDGPU_GEM_DGMA_QUERY_PHYS_ADDR = 1 +AMDGPU_TILING_ARRAY_MODE_SHIFT = 0 +AMDGPU_TILING_ARRAY_MODE_MASK = 0xf +AMDGPU_TILING_PIPE_CONFIG_SHIFT = 4 +AMDGPU_TILING_PIPE_CONFIG_MASK = 0x1f +AMDGPU_TILING_TILE_SPLIT_SHIFT = 9 +AMDGPU_TILING_TILE_SPLIT_MASK = 0x7 +AMDGPU_TILING_MICRO_TILE_MODE_SHIFT = 12 +AMDGPU_TILING_MICRO_TILE_MODE_MASK = 0x7 +AMDGPU_TILING_BANK_WIDTH_SHIFT = 15 +AMDGPU_TILING_BANK_WIDTH_MASK = 0x3 +AMDGPU_TILING_BANK_HEIGHT_SHIFT = 17 +AMDGPU_TILING_BANK_HEIGHT_MASK = 0x3 +AMDGPU_TILING_MACRO_TILE_ASPECT_SHIFT = 19 +AMDGPU_TILING_MACRO_TILE_ASPECT_MASK = 0x3 +AMDGPU_TILING_NUM_BANKS_SHIFT = 21 +AMDGPU_TILING_NUM_BANKS_MASK = 0x3 +AMDGPU_TILING_SWIZZLE_MODE_SHIFT = 0 +AMDGPU_TILING_SWIZZLE_MODE_MASK = 0x1f +AMDGPU_TILING_DCC_OFFSET_256B_SHIFT = 5 +AMDGPU_TILING_DCC_OFFSET_256B_MASK = 0xFFFFFF +AMDGPU_TILING_DCC_PITCH_MAX_SHIFT = 29 +AMDGPU_TILING_DCC_PITCH_MAX_MASK = 0x3FFF +AMDGPU_TILING_DCC_INDEPENDENT_64B_SHIFT = 43 +AMDGPU_TILING_DCC_INDEPENDENT_64B_MASK = 0x1 +AMDGPU_TILING_DCC_INDEPENDENT_128B_SHIFT = 44 +AMDGPU_TILING_DCC_INDEPENDENT_128B_MASK = 0x1 +AMDGPU_TILING_SCANOUT_SHIFT = 63 +AMDGPU_TILING_SCANOUT_MASK = 0x1 +AMDGPU_TILING_GFX12_SWIZZLE_MODE_SHIFT = 0 +AMDGPU_TILING_GFX12_SWIZZLE_MODE_MASK = 0x7 +AMDGPU_TILING_GFX12_DCC_MAX_COMPRESSED_BLOCK_SHIFT = 3 +AMDGPU_TILING_GFX12_DCC_MAX_COMPRESSED_BLOCK_MASK = 0x3 +AMDGPU_TILING_GFX12_DCC_NUMBER_TYPE_SHIFT = 5 +AMDGPU_TILING_GFX12_DCC_NUMBER_TYPE_MASK = 0x7 +AMDGPU_TILING_GFX12_DCC_DATA_FORMAT_SHIFT = 8 +AMDGPU_TILING_GFX12_DCC_DATA_FORMAT_MASK = 0x3f +AMDGPU_TILING_GFX12_DCC_WRITE_COMPRESS_DISABLE_SHIFT = 14 +AMDGPU_TILING_GFX12_DCC_WRITE_COMPRESS_DISABLE_MASK = 0x1 +AMDGPU_TILING_GFX12_SCANOUT_SHIFT = 63 +AMDGPU_TILING_GFX12_SCANOUT_MASK = 0x1 +AMDGPU_GEM_METADATA_OP_SET_METADATA = 1 +AMDGPU_GEM_METADATA_OP_GET_METADATA = 2 +AMDGPU_GEM_OP_GET_GEM_CREATE_INFO = 0 +AMDGPU_GEM_OP_SET_PLACEMENT = 1 +AMDGPU_VA_OP_MAP = 1 +AMDGPU_VA_OP_UNMAP = 2 +AMDGPU_VA_OP_CLEAR = 3 +AMDGPU_VA_OP_REPLACE = 4 +AMDGPU_VM_DELAY_UPDATE = (1 << 0) +AMDGPU_VM_PAGE_READABLE = (1 << 1) +AMDGPU_VM_PAGE_WRITEABLE = (1 << 2) +AMDGPU_VM_PAGE_EXECUTABLE = (1 << 3) +AMDGPU_VM_PAGE_PRT = (1 << 4) +AMDGPU_VM_MTYPE_MASK = (0xf << 5) +AMDGPU_VM_MTYPE_DEFAULT = (0 << 5) +AMDGPU_VM_MTYPE_NC = (1 << 5) +AMDGPU_VM_MTYPE_WC = (2 << 5) +AMDGPU_VM_MTYPE_CC = (3 << 5) +AMDGPU_VM_MTYPE_UC = (4 << 5) +AMDGPU_VM_MTYPE_RW = (5 << 5) +AMDGPU_VM_PAGE_NOALLOC = (1 << 9) +AMDGPU_HW_IP_GFX = 0 +AMDGPU_HW_IP_COMPUTE = 1 +AMDGPU_HW_IP_DMA = 2 +AMDGPU_HW_IP_UVD = 3 +AMDGPU_HW_IP_VCE = 4 +AMDGPU_HW_IP_UVD_ENC = 5 +AMDGPU_HW_IP_VCN_DEC = 6 +AMDGPU_HW_IP_VCN_ENC = 7 +AMDGPU_HW_IP_VCN_JPEG = 8 +AMDGPU_HW_IP_VPE = 9 +AMDGPU_HW_IP_NUM = 10 +AMDGPU_HW_IP_INSTANCE_MAX_COUNT = 1 +AMDGPU_CHUNK_ID_IB = 0x01 +AMDGPU_CHUNK_ID_FENCE = 0x02 +AMDGPU_CHUNK_ID_DEPENDENCIES = 0x03 +AMDGPU_CHUNK_ID_SYNCOBJ_IN = 0x04 +AMDGPU_CHUNK_ID_SYNCOBJ_OUT = 0x05 +AMDGPU_CHUNK_ID_BO_HANDLES = 0x06 +AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES = 0x07 +AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT = 0x08 +AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL = 0x09 +AMDGPU_CHUNK_ID_CP_GFX_SHADOW = 0x0a +AMDGPU_IB_FLAG_CE = (1<<0) +AMDGPU_IB_FLAG_PREAMBLE = (1<<1) +AMDGPU_IB_FLAG_PREEMPT = (1<<2) +AMDGPU_IB_FLAG_TC_WB_NOT_INVALIDATE = (1 << 3) +AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID = (1 << 4) +AMDGPU_IB_FLAGS_SECURE = (1 << 5) +AMDGPU_IB_FLAG_EMIT_MEM_SYNC = (1 << 6) +AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ = 0 +AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ_FD = 1 +AMDGPU_FENCE_TO_HANDLE_GET_SYNC_FILE_FD = 2 +AMDGPU_CS_CHUNK_CP_GFX_SHADOW_FLAGS_INIT_SHADOW = 0x1 +AMDGPU_IDS_FLAGS_FUSION = 0x1 +AMDGPU_IDS_FLAGS_PREEMPTION = 0x2 +AMDGPU_IDS_FLAGS_TMZ = 0x4 +AMDGPU_IDS_FLAGS_CONFORMANT_TRUNC_COORD = 0x8 +AMDGPU_IDS_FLAGS_MODE_MASK = 0x300 +AMDGPU_IDS_FLAGS_MODE_SHIFT = 0x8 +AMDGPU_IDS_FLAGS_MODE_PF = 0x0 +AMDGPU_IDS_FLAGS_MODE_VF = 0x1 +AMDGPU_IDS_FLAGS_MODE_PT = 0x2 +AMDGPU_INFO_ACCEL_WORKING = 0x00 +AMDGPU_INFO_CRTC_FROM_ID = 0x01 +AMDGPU_INFO_HW_IP_INFO = 0x02 +AMDGPU_INFO_HW_IP_COUNT = 0x03 +AMDGPU_INFO_TIMESTAMP = 0x05 +AMDGPU_INFO_FW_VERSION = 0x0e +AMDGPU_INFO_FW_VCE = 0x1 +AMDGPU_INFO_FW_UVD = 0x2 +AMDGPU_INFO_FW_GMC = 0x03 +AMDGPU_INFO_FW_GFX_ME = 0x04 +AMDGPU_INFO_FW_GFX_PFP = 0x05 +AMDGPU_INFO_FW_GFX_CE = 0x06 +AMDGPU_INFO_FW_GFX_RLC = 0x07 +AMDGPU_INFO_FW_GFX_MEC = 0x08 +AMDGPU_INFO_FW_SMC = 0x0a +AMDGPU_INFO_FW_SDMA = 0x0b +AMDGPU_INFO_FW_SOS = 0x0c +AMDGPU_INFO_FW_ASD = 0x0d +AMDGPU_INFO_FW_VCN = 0x0e +AMDGPU_INFO_FW_GFX_RLC_RESTORE_LIST_CNTL = 0x0f +AMDGPU_INFO_FW_GFX_RLC_RESTORE_LIST_GPM_MEM = 0x10 +AMDGPU_INFO_FW_GFX_RLC_RESTORE_LIST_SRM_MEM = 0x11 +AMDGPU_INFO_FW_DMCU = 0x12 +AMDGPU_INFO_FW_TA = 0x13 +AMDGPU_INFO_FW_DMCUB = 0x14 +AMDGPU_INFO_FW_TOC = 0x15 +AMDGPU_INFO_FW_CAP = 0x16 +AMDGPU_INFO_FW_GFX_RLCP = 0x17 +AMDGPU_INFO_FW_GFX_RLCV = 0x18 +AMDGPU_INFO_FW_MES_KIQ = 0x19 +AMDGPU_INFO_FW_MES = 0x1a +AMDGPU_INFO_FW_IMU = 0x1b +AMDGPU_INFO_FW_VPE = 0x1c +AMDGPU_INFO_NUM_BYTES_MOVED = 0x0f +AMDGPU_INFO_VRAM_USAGE = 0x10 +AMDGPU_INFO_GTT_USAGE = 0x11 +AMDGPU_INFO_GDS_CONFIG = 0x13 +AMDGPU_INFO_VRAM_GTT = 0x14 +AMDGPU_INFO_READ_MMR_REG = 0x15 +AMDGPU_INFO_DEV_INFO = 0x16 +AMDGPU_INFO_VIS_VRAM_USAGE = 0x17 +AMDGPU_INFO_NUM_EVICTIONS = 0x18 +AMDGPU_INFO_MEMORY = 0x19 +AMDGPU_INFO_VCE_CLOCK_TABLE = 0x1A +AMDGPU_INFO_VBIOS = 0x1B +AMDGPU_INFO_VBIOS_SIZE = 0x1 +AMDGPU_INFO_VBIOS_IMAGE = 0x2 +AMDGPU_INFO_VBIOS_INFO = 0x3 +AMDGPU_INFO_NUM_HANDLES = 0x1C +AMDGPU_INFO_SENSOR = 0x1D +AMDGPU_INFO_SENSOR_GFX_SCLK = 0x1 +AMDGPU_INFO_SENSOR_GFX_MCLK = 0x2 +AMDGPU_INFO_SENSOR_GPU_TEMP = 0x3 +AMDGPU_INFO_SENSOR_GPU_LOAD = 0x4 +AMDGPU_INFO_SENSOR_GPU_AVG_POWER = 0x5 +AMDGPU_INFO_SENSOR_VDDNB = 0x6 +AMDGPU_INFO_SENSOR_VDDGFX = 0x7 +AMDGPU_INFO_SENSOR_STABLE_PSTATE_GFX_SCLK = 0x8 +AMDGPU_INFO_SENSOR_STABLE_PSTATE_GFX_MCLK = 0x9 +AMDGPU_INFO_SENSOR_PEAK_PSTATE_GFX_SCLK = 0xa +AMDGPU_INFO_SENSOR_PEAK_PSTATE_GFX_MCLK = 0xb +AMDGPU_INFO_SENSOR_GPU_INPUT_POWER = 0xc +AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS = 0x1E +AMDGPU_INFO_VRAM_LOST_COUNTER = 0x1F +AMDGPU_INFO_RAS_ENABLED_FEATURES = 0x20 +AMDGPU_INFO_RAS_ENABLED_UMC = (1 << 0) +AMDGPU_INFO_RAS_ENABLED_SDMA = (1 << 1) +AMDGPU_INFO_RAS_ENABLED_GFX = (1 << 2) +AMDGPU_INFO_RAS_ENABLED_MMHUB = (1 << 3) +AMDGPU_INFO_RAS_ENABLED_ATHUB = (1 << 4) +AMDGPU_INFO_RAS_ENABLED_PCIE = (1 << 5) +AMDGPU_INFO_RAS_ENABLED_HDP = (1 << 6) +AMDGPU_INFO_RAS_ENABLED_XGMI = (1 << 7) +AMDGPU_INFO_RAS_ENABLED_DF = (1 << 8) +AMDGPU_INFO_RAS_ENABLED_SMN = (1 << 9) +AMDGPU_INFO_RAS_ENABLED_SEM = (1 << 10) +AMDGPU_INFO_RAS_ENABLED_MP0 = (1 << 11) +AMDGPU_INFO_RAS_ENABLED_MP1 = (1 << 12) +AMDGPU_INFO_RAS_ENABLED_FUSE = (1 << 13) +AMDGPU_INFO_VIDEO_CAPS = 0x21 +AMDGPU_INFO_VIDEO_CAPS_DECODE = 0 +AMDGPU_INFO_VIDEO_CAPS_ENCODE = 1 +AMDGPU_INFO_MAX_IBS = 0x22 +AMDGPU_INFO_GPUVM_FAULT = 0x23 +AMDGPU_INFO_UQ_FW_AREAS = 0x24 +AMDGPU_INFO_CAPABILITY = 0x50 +AMDGPU_INFO_VIRTUAL_RANGE = 0x51 +AMDGPU_CAPABILITY_PIN_MEM_FLAG = (1 << 0) +AMDGPU_CAPABILITY_DIRECT_GMA_FLAG = (1 << 1) +AMDGPU_INFO_MMR_SE_INDEX_SHIFT = 0 +AMDGPU_INFO_MMR_SE_INDEX_MASK = 0xff +AMDGPU_INFO_MMR_SH_INDEX_SHIFT = 8 +AMDGPU_INFO_MMR_SH_INDEX_MASK = 0xff +AMDGPU_VRAM_TYPE_UNKNOWN = 0 +AMDGPU_VRAM_TYPE_GDDR1 = 1 +AMDGPU_VRAM_TYPE_DDR2 = 2 +AMDGPU_VRAM_TYPE_GDDR3 = 3 +AMDGPU_VRAM_TYPE_GDDR4 = 4 +AMDGPU_VRAM_TYPE_GDDR5 = 5 +AMDGPU_VRAM_TYPE_HBM = 6 +AMDGPU_VRAM_TYPE_DDR3 = 7 +AMDGPU_VRAM_TYPE_DDR4 = 8 +AMDGPU_VRAM_TYPE_GDDR6 = 9 +AMDGPU_VRAM_TYPE_DDR5 = 10 +AMDGPU_VRAM_TYPE_LPDDR4 = 11 +AMDGPU_VRAM_TYPE_LPDDR5 = 12 +AMDGPU_VRAM_TYPE_HBM3E = 13 +AMDGPU_VRAM_TYPE_HBM_WIDTH = 4096 +AMDGPU_VCE_CLOCK_TABLE_ENTRIES = 6 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2 = 0 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4 = 1 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1 = 2 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC = 3 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC = 4 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG = 5 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9 = 6 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1 = 7 +AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_COUNT = 8 +AMDGPU_VMHUB_TYPE_MASK = 0xff +AMDGPU_VMHUB_TYPE_SHIFT = 0 +AMDGPU_VMHUB_TYPE_GFX = 0 +AMDGPU_VMHUB_TYPE_MM0 = 1 +AMDGPU_VMHUB_TYPE_MM1 = 2 +AMDGPU_VMHUB_IDX_MASK = 0xff00 +AMDGPU_VMHUB_IDX_SHIFT = 8 +AMDGPU_FAMILY_UNKNOWN = 0 +AMDGPU_FAMILY_SI = 110 +AMDGPU_FAMILY_CI = 120 +AMDGPU_FAMILY_KV = 125 +AMDGPU_FAMILY_VI = 130 +AMDGPU_FAMILY_CZ = 135 +AMDGPU_FAMILY_AI = 141 +AMDGPU_FAMILY_RV = 142 +AMDGPU_FAMILY_NV = 143 +AMDGPU_FAMILY_VGH = 144 +AMDGPU_FAMILY_GC_11_0_0 = 145 +AMDGPU_FAMILY_YC = 146 +AMDGPU_FAMILY_GC_11_0_1 = 148 +AMDGPU_FAMILY_GC_10_3_6 = 149 +AMDGPU_FAMILY_GC_10_3_7 = 151 +AMDGPU_FAMILY_GC_11_5_0 = 150 +AMDGPU_FAMILY_GC_12_0_0 = 152 +AMDGPU_SUA_APERTURE_PRIVATE = 1 +AMDGPU_SUA_APERTURE_SHARED = 2 +AMDGPU_FREESYNC_FULLSCREEN_ENTER = 1 +AMDGPU_FREESYNC_FULLSCREEN_EXIT = 2 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/amdgpu_kd.py b/artifacts/package_runtime/tinygrad/runtime/autogen/amdgpu_kd.py new file mode 100644 index 000000000..8641b07ff --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/amdgpu_kd.py @@ -0,0 +1,37 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +uint8_t: TypeAlias = ctypes.c_ubyte +_anonenum0: dict[int, str] = {(FLOAT_ROUND_MODE_NEAR_EVEN:=0): 'FLOAT_ROUND_MODE_NEAR_EVEN', (FLOAT_ROUND_MODE_PLUS_INFINITY:=1): 'FLOAT_ROUND_MODE_PLUS_INFINITY', (FLOAT_ROUND_MODE_MINUS_INFINITY:=2): 'FLOAT_ROUND_MODE_MINUS_INFINITY', (FLOAT_ROUND_MODE_ZERO:=3): 'FLOAT_ROUND_MODE_ZERO'} +_anonenum1: dict[int, str] = {(FLOAT_DENORM_MODE_FLUSH_SRC_DST:=0): 'FLOAT_DENORM_MODE_FLUSH_SRC_DST', (FLOAT_DENORM_MODE_FLUSH_DST:=1): 'FLOAT_DENORM_MODE_FLUSH_DST', (FLOAT_DENORM_MODE_FLUSH_SRC:=2): 'FLOAT_DENORM_MODE_FLUSH_SRC', (FLOAT_DENORM_MODE_FLUSH_NONE:=3): 'FLOAT_DENORM_MODE_FLUSH_NONE'} +_anonenum2: dict[int, str] = {(SYSTEM_VGPR_WORKITEM_ID_X:=0): 'SYSTEM_VGPR_WORKITEM_ID_X', (SYSTEM_VGPR_WORKITEM_ID_X_Y:=1): 'SYSTEM_VGPR_WORKITEM_ID_X_Y', (SYSTEM_VGPR_WORKITEM_ID_X_Y_Z:=2): 'SYSTEM_VGPR_WORKITEM_ID_X_Y_Z', (SYSTEM_VGPR_WORKITEM_ID_UNDEFINED:=3): 'SYSTEM_VGPR_WORKITEM_ID_UNDEFINED'} +int32_t: TypeAlias = ctypes.c_int32 +_anonenum3: dict[int, str] = {(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT_SHIFT:=0): 'COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT_SHIFT', (COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT_WIDTH:=6): 'COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT_WIDTH', (COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT:=63): 'COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT', (COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT_SHIFT:=6): 'COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT_SHIFT', (COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT_WIDTH:=4): 'COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT_WIDTH', (COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT:=960): 'COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT', (COMPUTE_PGM_RSRC1_PRIORITY_SHIFT:=10): 'COMPUTE_PGM_RSRC1_PRIORITY_SHIFT', (COMPUTE_PGM_RSRC1_PRIORITY_WIDTH:=2): 'COMPUTE_PGM_RSRC1_PRIORITY_WIDTH', (COMPUTE_PGM_RSRC1_PRIORITY:=3072): 'COMPUTE_PGM_RSRC1_PRIORITY', (COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32_SHIFT:=12): 'COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32_SHIFT', (COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32_WIDTH:=2): 'COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32_WIDTH', (COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32:=12288): 'COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32', (COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64_SHIFT:=14): 'COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64_SHIFT', (COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64_WIDTH:=2): 'COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64_WIDTH', (COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64:=49152): 'COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64', (COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32_SHIFT:=16): 'COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32_SHIFT', (COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32_WIDTH:=2): 'COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32_WIDTH', (COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32:=196608): 'COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32', (COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64_SHIFT:=18): 'COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64_SHIFT', (COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64_WIDTH:=2): 'COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64_WIDTH', (COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64:=786432): 'COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64', (COMPUTE_PGM_RSRC1_PRIV_SHIFT:=20): 'COMPUTE_PGM_RSRC1_PRIV_SHIFT', (COMPUTE_PGM_RSRC1_PRIV_WIDTH:=1): 'COMPUTE_PGM_RSRC1_PRIV_WIDTH', (COMPUTE_PGM_RSRC1_PRIV:=1048576): 'COMPUTE_PGM_RSRC1_PRIV', (COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP_SHIFT:=21): 'COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP_SHIFT', (COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP_WIDTH', (COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP:=2097152): 'COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP', (COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN_SHIFT:=21): 'COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN_SHIFT', (COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN_WIDTH', (COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN:=2097152): 'COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN', (COMPUTE_PGM_RSRC1_DEBUG_MODE_SHIFT:=22): 'COMPUTE_PGM_RSRC1_DEBUG_MODE_SHIFT', (COMPUTE_PGM_RSRC1_DEBUG_MODE_WIDTH:=1): 'COMPUTE_PGM_RSRC1_DEBUG_MODE_WIDTH', (COMPUTE_PGM_RSRC1_DEBUG_MODE:=4194304): 'COMPUTE_PGM_RSRC1_DEBUG_MODE', (COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE_SHIFT:=23): 'COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE_SHIFT', (COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE_WIDTH', (COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE:=8388608): 'COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE', (COMPUTE_PGM_RSRC1_GFX12_PLUS_DISABLE_PERF_SHIFT:=23): 'COMPUTE_PGM_RSRC1_GFX12_PLUS_DISABLE_PERF_SHIFT', (COMPUTE_PGM_RSRC1_GFX12_PLUS_DISABLE_PERF_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX12_PLUS_DISABLE_PERF_WIDTH', (COMPUTE_PGM_RSRC1_GFX12_PLUS_DISABLE_PERF:=8388608): 'COMPUTE_PGM_RSRC1_GFX12_PLUS_DISABLE_PERF', (COMPUTE_PGM_RSRC1_BULKY_SHIFT:=24): 'COMPUTE_PGM_RSRC1_BULKY_SHIFT', (COMPUTE_PGM_RSRC1_BULKY_WIDTH:=1): 'COMPUTE_PGM_RSRC1_BULKY_WIDTH', (COMPUTE_PGM_RSRC1_BULKY:=16777216): 'COMPUTE_PGM_RSRC1_BULKY', (COMPUTE_PGM_RSRC1_CDBG_USER_SHIFT:=25): 'COMPUTE_PGM_RSRC1_CDBG_USER_SHIFT', (COMPUTE_PGM_RSRC1_CDBG_USER_WIDTH:=1): 'COMPUTE_PGM_RSRC1_CDBG_USER_WIDTH', (COMPUTE_PGM_RSRC1_CDBG_USER:=33554432): 'COMPUTE_PGM_RSRC1_CDBG_USER', (COMPUTE_PGM_RSRC1_GFX6_GFX8_RESERVED0_SHIFT:=26): 'COMPUTE_PGM_RSRC1_GFX6_GFX8_RESERVED0_SHIFT', (COMPUTE_PGM_RSRC1_GFX6_GFX8_RESERVED0_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX6_GFX8_RESERVED0_WIDTH', (COMPUTE_PGM_RSRC1_GFX6_GFX8_RESERVED0:=67108864): 'COMPUTE_PGM_RSRC1_GFX6_GFX8_RESERVED0', (COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL_SHIFT:=26): 'COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL_SHIFT', (COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL_WIDTH', (COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL:=67108864): 'COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL', (COMPUTE_PGM_RSRC1_RESERVED1_SHIFT:=27): 'COMPUTE_PGM_RSRC1_RESERVED1_SHIFT', (COMPUTE_PGM_RSRC1_RESERVED1_WIDTH:=2): 'COMPUTE_PGM_RSRC1_RESERVED1_WIDTH', (COMPUTE_PGM_RSRC1_RESERVED1:=402653184): 'COMPUTE_PGM_RSRC1_RESERVED1', (COMPUTE_PGM_RSRC1_GFX6_GFX9_RESERVED2_SHIFT:=29): 'COMPUTE_PGM_RSRC1_GFX6_GFX9_RESERVED2_SHIFT', (COMPUTE_PGM_RSRC1_GFX6_GFX9_RESERVED2_WIDTH:=3): 'COMPUTE_PGM_RSRC1_GFX6_GFX9_RESERVED2_WIDTH', (COMPUTE_PGM_RSRC1_GFX6_GFX9_RESERVED2:=-536870912): 'COMPUTE_PGM_RSRC1_GFX6_GFX9_RESERVED2', (COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE_SHIFT:=29): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE_SHIFT', (COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE_WIDTH', (COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE:=536870912): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE', (COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED_SHIFT:=30): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED_SHIFT', (COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED_WIDTH', (COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED:=1073741824): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED', (COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS_SHIFT:=31): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS_SHIFT', (COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS_WIDTH:=1): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS_WIDTH', (COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS:=-2147483648): 'COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS'} +_anonenum4: dict[int, str] = {(COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT_SHIFT:=0): 'COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT:=1): 'COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT', (COMPUTE_PGM_RSRC2_USER_SGPR_COUNT_SHIFT:=1): 'COMPUTE_PGM_RSRC2_USER_SGPR_COUNT_SHIFT', (COMPUTE_PGM_RSRC2_USER_SGPR_COUNT_WIDTH:=5): 'COMPUTE_PGM_RSRC2_USER_SGPR_COUNT_WIDTH', (COMPUTE_PGM_RSRC2_USER_SGPR_COUNT:=62): 'COMPUTE_PGM_RSRC2_USER_SGPR_COUNT', (COMPUTE_PGM_RSRC2_GFX6_GFX11_ENABLE_TRAP_HANDLER_SHIFT:=6): 'COMPUTE_PGM_RSRC2_GFX6_GFX11_ENABLE_TRAP_HANDLER_SHIFT', (COMPUTE_PGM_RSRC2_GFX6_GFX11_ENABLE_TRAP_HANDLER_WIDTH:=1): 'COMPUTE_PGM_RSRC2_GFX6_GFX11_ENABLE_TRAP_HANDLER_WIDTH', (COMPUTE_PGM_RSRC2_GFX6_GFX11_ENABLE_TRAP_HANDLER:=64): 'COMPUTE_PGM_RSRC2_GFX6_GFX11_ENABLE_TRAP_HANDLER', (COMPUTE_PGM_RSRC2_GFX12_PLUS_RESERVED1_SHIFT:=6): 'COMPUTE_PGM_RSRC2_GFX12_PLUS_RESERVED1_SHIFT', (COMPUTE_PGM_RSRC2_GFX12_PLUS_RESERVED1_WIDTH:=1): 'COMPUTE_PGM_RSRC2_GFX12_PLUS_RESERVED1_WIDTH', (COMPUTE_PGM_RSRC2_GFX12_PLUS_RESERVED1:=64): 'COMPUTE_PGM_RSRC2_GFX12_PLUS_RESERVED1', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X_SHIFT:=7): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X:=128): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y_SHIFT:=8): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y:=256): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z_SHIFT:=9): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z:=512): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO_SHIFT:=10): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO:=1024): 'COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO', (COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID_SHIFT:=11): 'COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID_WIDTH:=2): 'COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID:=6144): 'COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_ADDRESS_WATCH_SHIFT:=13): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_ADDRESS_WATCH_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_ADDRESS_WATCH_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_ADDRESS_WATCH_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_ADDRESS_WATCH:=8192): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_ADDRESS_WATCH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_MEMORY_SHIFT:=14): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_MEMORY_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_MEMORY_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_MEMORY_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_MEMORY:=16384): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_MEMORY', (COMPUTE_PGM_RSRC2_GRANULATED_LDS_SIZE_SHIFT:=15): 'COMPUTE_PGM_RSRC2_GRANULATED_LDS_SIZE_SHIFT', (COMPUTE_PGM_RSRC2_GRANULATED_LDS_SIZE_WIDTH:=9): 'COMPUTE_PGM_RSRC2_GRANULATED_LDS_SIZE_WIDTH', (COMPUTE_PGM_RSRC2_GRANULATED_LDS_SIZE:=16744448): 'COMPUTE_PGM_RSRC2_GRANULATED_LDS_SIZE', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_SHIFT:=24): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION:=16777216): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_SHIFT:=25): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE:=33554432): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_SHIFT:=26): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO:=67108864): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_SHIFT:=27): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW:=134217728): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_SHIFT:=28): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW:=268435456): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_SHIFT:=29): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT:=536870912): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO_SHIFT:=30): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO_SHIFT', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO_WIDTH:=1): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO_WIDTH', (COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO:=1073741824): 'COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO', (COMPUTE_PGM_RSRC2_RESERVED0_SHIFT:=31): 'COMPUTE_PGM_RSRC2_RESERVED0_SHIFT', (COMPUTE_PGM_RSRC2_RESERVED0_WIDTH:=1): 'COMPUTE_PGM_RSRC2_RESERVED0_WIDTH', (COMPUTE_PGM_RSRC2_RESERVED0:=-2147483648): 'COMPUTE_PGM_RSRC2_RESERVED0'} +_anonenum5: dict[int, str] = {(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_SHIFT:=0): 'COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_SHIFT', (COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_WIDTH:=6): 'COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET_WIDTH', (COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET:=63): 'COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET', (COMPUTE_PGM_RSRC3_GFX90A_RESERVED0_SHIFT:=6): 'COMPUTE_PGM_RSRC3_GFX90A_RESERVED0_SHIFT', (COMPUTE_PGM_RSRC3_GFX90A_RESERVED0_WIDTH:=10): 'COMPUTE_PGM_RSRC3_GFX90A_RESERVED0_WIDTH', (COMPUTE_PGM_RSRC3_GFX90A_RESERVED0:=65472): 'COMPUTE_PGM_RSRC3_GFX90A_RESERVED0', (COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT_SHIFT:=16): 'COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT_SHIFT', (COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT_WIDTH:=1): 'COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT_WIDTH', (COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT:=65536): 'COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT', (COMPUTE_PGM_RSRC3_GFX90A_RESERVED1_SHIFT:=17): 'COMPUTE_PGM_RSRC3_GFX90A_RESERVED1_SHIFT', (COMPUTE_PGM_RSRC3_GFX90A_RESERVED1_WIDTH:=15): 'COMPUTE_PGM_RSRC3_GFX90A_RESERVED1_WIDTH', (COMPUTE_PGM_RSRC3_GFX90A_RESERVED1:=-131072): 'COMPUTE_PGM_RSRC3_GFX90A_RESERVED1'} +_anonenum6: dict[int, str] = {(COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT_SHIFT:=0): 'COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT_SHIFT', (COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT_WIDTH:=4): 'COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT_WIDTH', (COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT:=15): 'COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT', (COMPUTE_PGM_RSRC3_GFX12_PLUS_RESERVED0_SHIFT:=0): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_RESERVED0_SHIFT', (COMPUTE_PGM_RSRC3_GFX12_PLUS_RESERVED0_WIDTH:=4): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_RESERVED0_WIDTH', (COMPUTE_PGM_RSRC3_GFX12_PLUS_RESERVED0:=15): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_RESERVED0', (COMPUTE_PGM_RSRC3_GFX10_RESERVED1_SHIFT:=4): 'COMPUTE_PGM_RSRC3_GFX10_RESERVED1_SHIFT', (COMPUTE_PGM_RSRC3_GFX10_RESERVED1_WIDTH:=8): 'COMPUTE_PGM_RSRC3_GFX10_RESERVED1_WIDTH', (COMPUTE_PGM_RSRC3_GFX10_RESERVED1:=4080): 'COMPUTE_PGM_RSRC3_GFX10_RESERVED1', (COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE_SHIFT:=4): 'COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE_SHIFT', (COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE_WIDTH:=6): 'COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE_WIDTH', (COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE:=1008): 'COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE', (COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START_SHIFT:=10): 'COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START_SHIFT', (COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START_WIDTH:=1): 'COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START_WIDTH', (COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START:=1024): 'COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START', (COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END_SHIFT:=11): 'COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END_SHIFT', (COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END_WIDTH:=1): 'COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END_WIDTH', (COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END:=2048): 'COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END', (COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE_SHIFT:=4): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE_SHIFT', (COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE_WIDTH:=8): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE_WIDTH', (COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE:=4080): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE', (COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED2_SHIFT:=12): 'COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED2_SHIFT', (COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED2_WIDTH:=1): 'COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED2_WIDTH', (COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED2:=4096): 'COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED2', (COMPUTE_PGM_RSRC3_GFX10_GFX11_RESERVED3_SHIFT:=13): 'COMPUTE_PGM_RSRC3_GFX10_GFX11_RESERVED3_SHIFT', (COMPUTE_PGM_RSRC3_GFX10_GFX11_RESERVED3_WIDTH:=1): 'COMPUTE_PGM_RSRC3_GFX10_GFX11_RESERVED3_WIDTH', (COMPUTE_PGM_RSRC3_GFX10_GFX11_RESERVED3:=8192): 'COMPUTE_PGM_RSRC3_GFX10_GFX11_RESERVED3', (COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN_SHIFT:=13): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN_SHIFT', (COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN_WIDTH:=1): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN_WIDTH', (COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN:=8192): 'COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN', (COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED4_SHIFT:=14): 'COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED4_SHIFT', (COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED4_WIDTH:=17): 'COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED4_WIDTH', (COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED4:=2147467264): 'COMPUTE_PGM_RSRC3_GFX10_PLUS_RESERVED4', (COMPUTE_PGM_RSRC3_GFX10_RESERVED5_SHIFT:=31): 'COMPUTE_PGM_RSRC3_GFX10_RESERVED5_SHIFT', (COMPUTE_PGM_RSRC3_GFX10_RESERVED5_WIDTH:=1): 'COMPUTE_PGM_RSRC3_GFX10_RESERVED5_WIDTH', (COMPUTE_PGM_RSRC3_GFX10_RESERVED5:=-2147483648): 'COMPUTE_PGM_RSRC3_GFX10_RESERVED5', (COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP_SHIFT:=31): 'COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP_SHIFT', (COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP_WIDTH:=1): 'COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP_WIDTH', (COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP:=-2147483648): 'COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP'} +_anonenum7: dict[int, str] = {(KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT:=0): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_WIDTH:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_WIDTH', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR_SHIFT:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR_SHIFT', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR_WIDTH:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR_WIDTH', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR:=2): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR_SHIFT:=2): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR_SHIFT', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR_WIDTH:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR_WIDTH', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR:=4): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT:=3): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_WIDTH:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR_WIDTH', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR:=8): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID_SHIFT:=4): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID_SHIFT', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID_WIDTH:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID_WIDTH', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID:=16): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT_SHIFT:=5): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT_SHIFT', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT_WIDTH:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT_WIDTH', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT:=32): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_SHIFT:=6): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_SHIFT', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_WIDTH:=1): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_WIDTH', (KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE:=64): 'KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE', (KERNEL_CODE_PROPERTY_RESERVED0_SHIFT:=7): 'KERNEL_CODE_PROPERTY_RESERVED0_SHIFT', (KERNEL_CODE_PROPERTY_RESERVED0_WIDTH:=3): 'KERNEL_CODE_PROPERTY_RESERVED0_WIDTH', (KERNEL_CODE_PROPERTY_RESERVED0:=896): 'KERNEL_CODE_PROPERTY_RESERVED0', (KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32_SHIFT:=10): 'KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32_SHIFT', (KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32_WIDTH:=1): 'KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32_WIDTH', (KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32:=1024): 'KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32', (KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK_SHIFT:=11): 'KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK_SHIFT', (KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK_WIDTH:=1): 'KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK_WIDTH', (KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK:=2048): 'KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK', (KERNEL_CODE_PROPERTY_RESERVED1_SHIFT:=12): 'KERNEL_CODE_PROPERTY_RESERVED1_SHIFT', (KERNEL_CODE_PROPERTY_RESERVED1_WIDTH:=4): 'KERNEL_CODE_PROPERTY_RESERVED1_WIDTH', (KERNEL_CODE_PROPERTY_RESERVED1:=61440): 'KERNEL_CODE_PROPERTY_RESERVED1'} +_anonenum8: dict[int, str] = {(KERNARG_PRELOAD_SPEC_LENGTH_SHIFT:=0): 'KERNARG_PRELOAD_SPEC_LENGTH_SHIFT', (KERNARG_PRELOAD_SPEC_LENGTH_WIDTH:=7): 'KERNARG_PRELOAD_SPEC_LENGTH_WIDTH', (KERNARG_PRELOAD_SPEC_LENGTH:=127): 'KERNARG_PRELOAD_SPEC_LENGTH', (KERNARG_PRELOAD_SPEC_OFFSET_SHIFT:=7): 'KERNARG_PRELOAD_SPEC_OFFSET_SHIFT', (KERNARG_PRELOAD_SPEC_OFFSET_WIDTH:=9): 'KERNARG_PRELOAD_SPEC_OFFSET_WIDTH', (KERNARG_PRELOAD_SPEC_OFFSET:=65408): 'KERNARG_PRELOAD_SPEC_OFFSET'} +@c.record +class llvm_amdhsa_kernel_descriptor_t(c.Struct): + SIZE = 64 + group_segment_fixed_size: int + private_segment_fixed_size: int + kernarg_size: int + reserved0: c.Array[ctypes.c_ubyte, Literal[4]] + kernel_code_entry_byte_offset: int + reserved1: c.Array[ctypes.c_ubyte, Literal[20]] + compute_pgm_rsrc3: int + compute_pgm_rsrc1: int + compute_pgm_rsrc2: int + kernel_code_properties: int + kernarg_preload: int + reserved3: c.Array[ctypes.c_ubyte, Literal[4]] +uint32_t: TypeAlias = ctypes.c_uint32 +int64_t: TypeAlias = ctypes.c_int64 +uint16_t: TypeAlias = ctypes.c_uint16 +llvm_amdhsa_kernel_descriptor_t.register_fields([('group_segment_fixed_size', uint32_t, 0), ('private_segment_fixed_size', uint32_t, 4), ('kernarg_size', uint32_t, 8), ('reserved0', c.Array[uint8_t, Literal[4]], 12), ('kernel_code_entry_byte_offset', int64_t, 16), ('reserved1', c.Array[uint8_t, Literal[20]], 24), ('compute_pgm_rsrc3', uint32_t, 44), ('compute_pgm_rsrc1', uint32_t, 48), ('compute_pgm_rsrc2', uint32_t, 52), ('kernel_code_properties', uint16_t, 56), ('kernarg_preload', uint16_t, 58), ('reserved3', c.Array[uint8_t, Literal[4]], 60)]) +_anonenum9: dict[int, str] = {(GROUP_SEGMENT_FIXED_SIZE_OFFSET:=0): 'GROUP_SEGMENT_FIXED_SIZE_OFFSET', (PRIVATE_SEGMENT_FIXED_SIZE_OFFSET:=4): 'PRIVATE_SEGMENT_FIXED_SIZE_OFFSET', (KERNARG_SIZE_OFFSET:=8): 'KERNARG_SIZE_OFFSET', (RESERVED0_OFFSET:=12): 'RESERVED0_OFFSET', (KERNEL_CODE_ENTRY_BYTE_OFFSET_OFFSET:=16): 'KERNEL_CODE_ENTRY_BYTE_OFFSET_OFFSET', (RESERVED1_OFFSET:=24): 'RESERVED1_OFFSET', (COMPUTE_PGM_RSRC3_OFFSET:=44): 'COMPUTE_PGM_RSRC3_OFFSET', (COMPUTE_PGM_RSRC1_OFFSET:=48): 'COMPUTE_PGM_RSRC1_OFFSET', (COMPUTE_PGM_RSRC2_OFFSET:=52): 'COMPUTE_PGM_RSRC2_OFFSET', (KERNEL_CODE_PROPERTIES_OFFSET:=56): 'KERNEL_CODE_PROPERTIES_OFFSET', (KERNARG_PRELOAD_OFFSET:=58): 'KERNARG_PRELOAD_OFFSET', (RESERVED3_OFFSET:=60): 'RESERVED3_OFFSET'} diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/avcodec.py b/artifacts/package_runtime/tinygrad/runtime/autogen/avcodec.py new file mode 100644 index 000000000..6502e07e5 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/avcodec.py @@ -0,0 +1,467 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +enum_HEVCNALUnitType: dict[int, str] = {(HEVC_NAL_TRAIL_N:=0): 'HEVC_NAL_TRAIL_N', (HEVC_NAL_TRAIL_R:=1): 'HEVC_NAL_TRAIL_R', (HEVC_NAL_TSA_N:=2): 'HEVC_NAL_TSA_N', (HEVC_NAL_TSA_R:=3): 'HEVC_NAL_TSA_R', (HEVC_NAL_STSA_N:=4): 'HEVC_NAL_STSA_N', (HEVC_NAL_STSA_R:=5): 'HEVC_NAL_STSA_R', (HEVC_NAL_RADL_N:=6): 'HEVC_NAL_RADL_N', (HEVC_NAL_RADL_R:=7): 'HEVC_NAL_RADL_R', (HEVC_NAL_RASL_N:=8): 'HEVC_NAL_RASL_N', (HEVC_NAL_RASL_R:=9): 'HEVC_NAL_RASL_R', (HEVC_NAL_VCL_N10:=10): 'HEVC_NAL_VCL_N10', (HEVC_NAL_VCL_R11:=11): 'HEVC_NAL_VCL_R11', (HEVC_NAL_VCL_N12:=12): 'HEVC_NAL_VCL_N12', (HEVC_NAL_VCL_R13:=13): 'HEVC_NAL_VCL_R13', (HEVC_NAL_VCL_N14:=14): 'HEVC_NAL_VCL_N14', (HEVC_NAL_VCL_R15:=15): 'HEVC_NAL_VCL_R15', (HEVC_NAL_BLA_W_LP:=16): 'HEVC_NAL_BLA_W_LP', (HEVC_NAL_BLA_W_RADL:=17): 'HEVC_NAL_BLA_W_RADL', (HEVC_NAL_BLA_N_LP:=18): 'HEVC_NAL_BLA_N_LP', (HEVC_NAL_IDR_W_RADL:=19): 'HEVC_NAL_IDR_W_RADL', (HEVC_NAL_IDR_N_LP:=20): 'HEVC_NAL_IDR_N_LP', (HEVC_NAL_CRA_NUT:=21): 'HEVC_NAL_CRA_NUT', (HEVC_NAL_RSV_IRAP_VCL22:=22): 'HEVC_NAL_RSV_IRAP_VCL22', (HEVC_NAL_RSV_IRAP_VCL23:=23): 'HEVC_NAL_RSV_IRAP_VCL23', (HEVC_NAL_RSV_VCL24:=24): 'HEVC_NAL_RSV_VCL24', (HEVC_NAL_RSV_VCL25:=25): 'HEVC_NAL_RSV_VCL25', (HEVC_NAL_RSV_VCL26:=26): 'HEVC_NAL_RSV_VCL26', (HEVC_NAL_RSV_VCL27:=27): 'HEVC_NAL_RSV_VCL27', (HEVC_NAL_RSV_VCL28:=28): 'HEVC_NAL_RSV_VCL28', (HEVC_NAL_RSV_VCL29:=29): 'HEVC_NAL_RSV_VCL29', (HEVC_NAL_RSV_VCL30:=30): 'HEVC_NAL_RSV_VCL30', (HEVC_NAL_RSV_VCL31:=31): 'HEVC_NAL_RSV_VCL31', (HEVC_NAL_VPS:=32): 'HEVC_NAL_VPS', (HEVC_NAL_SPS:=33): 'HEVC_NAL_SPS', (HEVC_NAL_PPS:=34): 'HEVC_NAL_PPS', (HEVC_NAL_AUD:=35): 'HEVC_NAL_AUD', (HEVC_NAL_EOS_NUT:=36): 'HEVC_NAL_EOS_NUT', (HEVC_NAL_EOB_NUT:=37): 'HEVC_NAL_EOB_NUT', (HEVC_NAL_FD_NUT:=38): 'HEVC_NAL_FD_NUT', (HEVC_NAL_SEI_PREFIX:=39): 'HEVC_NAL_SEI_PREFIX', (HEVC_NAL_SEI_SUFFIX:=40): 'HEVC_NAL_SEI_SUFFIX', (HEVC_NAL_RSV_NVCL41:=41): 'HEVC_NAL_RSV_NVCL41', (HEVC_NAL_RSV_NVCL42:=42): 'HEVC_NAL_RSV_NVCL42', (HEVC_NAL_RSV_NVCL43:=43): 'HEVC_NAL_RSV_NVCL43', (HEVC_NAL_RSV_NVCL44:=44): 'HEVC_NAL_RSV_NVCL44', (HEVC_NAL_RSV_NVCL45:=45): 'HEVC_NAL_RSV_NVCL45', (HEVC_NAL_RSV_NVCL46:=46): 'HEVC_NAL_RSV_NVCL46', (HEVC_NAL_RSV_NVCL47:=47): 'HEVC_NAL_RSV_NVCL47', (HEVC_NAL_UNSPEC48:=48): 'HEVC_NAL_UNSPEC48', (HEVC_NAL_UNSPEC49:=49): 'HEVC_NAL_UNSPEC49', (HEVC_NAL_UNSPEC50:=50): 'HEVC_NAL_UNSPEC50', (HEVC_NAL_UNSPEC51:=51): 'HEVC_NAL_UNSPEC51', (HEVC_NAL_UNSPEC52:=52): 'HEVC_NAL_UNSPEC52', (HEVC_NAL_UNSPEC53:=53): 'HEVC_NAL_UNSPEC53', (HEVC_NAL_UNSPEC54:=54): 'HEVC_NAL_UNSPEC54', (HEVC_NAL_UNSPEC55:=55): 'HEVC_NAL_UNSPEC55', (HEVC_NAL_UNSPEC56:=56): 'HEVC_NAL_UNSPEC56', (HEVC_NAL_UNSPEC57:=57): 'HEVC_NAL_UNSPEC57', (HEVC_NAL_UNSPEC58:=58): 'HEVC_NAL_UNSPEC58', (HEVC_NAL_UNSPEC59:=59): 'HEVC_NAL_UNSPEC59', (HEVC_NAL_UNSPEC60:=60): 'HEVC_NAL_UNSPEC60', (HEVC_NAL_UNSPEC61:=61): 'HEVC_NAL_UNSPEC61', (HEVC_NAL_UNSPEC62:=62): 'HEVC_NAL_UNSPEC62', (HEVC_NAL_UNSPEC63:=63): 'HEVC_NAL_UNSPEC63'} +enum_HEVCSliceType: dict[int, str] = {(HEVC_SLICE_B:=0): 'HEVC_SLICE_B', (HEVC_SLICE_P:=1): 'HEVC_SLICE_P', (HEVC_SLICE_I:=2): 'HEVC_SLICE_I'} +_anonenum0: dict[int, str] = {(HEVC_MAX_LAYERS:=63): 'HEVC_MAX_LAYERS', (HEVC_MAX_SUB_LAYERS:=7): 'HEVC_MAX_SUB_LAYERS', (HEVC_MAX_LAYER_SETS:=1024): 'HEVC_MAX_LAYER_SETS', (HEVC_MAX_LAYER_ID:=63): 'HEVC_MAX_LAYER_ID', (HEVC_MAX_NUH_LAYER_ID:=62): 'HEVC_MAX_NUH_LAYER_ID', (HEVC_MAX_VPS_COUNT:=16): 'HEVC_MAX_VPS_COUNT', (HEVC_MAX_SPS_COUNT:=16): 'HEVC_MAX_SPS_COUNT', (HEVC_MAX_PPS_COUNT:=64): 'HEVC_MAX_PPS_COUNT', (HEVC_MAX_DPB_SIZE:=16): 'HEVC_MAX_DPB_SIZE', (HEVC_MAX_REFS:=16): 'HEVC_MAX_REFS', (HEVC_MAX_SHORT_TERM_REF_PIC_SETS:=64): 'HEVC_MAX_SHORT_TERM_REF_PIC_SETS', (HEVC_MAX_LONG_TERM_REF_PICS:=32): 'HEVC_MAX_LONG_TERM_REF_PICS', (HEVC_MIN_LOG2_CTB_SIZE:=4): 'HEVC_MIN_LOG2_CTB_SIZE', (HEVC_MAX_LOG2_CTB_SIZE:=6): 'HEVC_MAX_LOG2_CTB_SIZE', (HEVC_MAX_CPB_CNT:=32): 'HEVC_MAX_CPB_CNT', (HEVC_MAX_LUMA_PS:=35651584): 'HEVC_MAX_LUMA_PS', (HEVC_MAX_WIDTH:=16888): 'HEVC_MAX_WIDTH', (HEVC_MAX_HEIGHT:=16888): 'HEVC_MAX_HEIGHT', (HEVC_MAX_TILE_ROWS:=22): 'HEVC_MAX_TILE_ROWS', (HEVC_MAX_TILE_COLUMNS:=20): 'HEVC_MAX_TILE_COLUMNS', (HEVC_MAX_SLICE_SEGMENTS:=600): 'HEVC_MAX_SLICE_SEGMENTS', (HEVC_MAX_ENTRY_POINT_OFFSETS:=2700): 'HEVC_MAX_ENTRY_POINT_OFFSETS', (HEVC_MAX_PALETTE_PREDICTOR_SIZE:=128): 'HEVC_MAX_PALETTE_PREDICTOR_SIZE'} +enum_HEVCScalabilityMask: dict[int, str] = {(HEVC_SCALABILITY_DEPTH:=32768): 'HEVC_SCALABILITY_DEPTH', (HEVC_SCALABILITY_MULTIVIEW:=16384): 'HEVC_SCALABILITY_MULTIVIEW', (HEVC_SCALABILITY_SPATIAL:=8192): 'HEVC_SCALABILITY_SPATIAL', (HEVC_SCALABILITY_AUXILIARY:=4096): 'HEVC_SCALABILITY_AUXILIARY', (HEVC_SCALABILITY_MASK_MAX:=65535): 'HEVC_SCALABILITY_MASK_MAX'} +enum_HEVCAuxId: dict[int, str] = {(HEVC_AUX_ALPHA:=1): 'HEVC_AUX_ALPHA', (HEVC_AUX_DEPTH:=2): 'HEVC_AUX_DEPTH'} +@c.record +class struct_H265RawNALUnitHeader(c.Struct): + SIZE = 3 + nal_unit_type: int + nuh_layer_id: int + nuh_temporal_id_plus1: int +uint8_t: TypeAlias = ctypes.c_ubyte +struct_H265RawNALUnitHeader.register_fields([('nal_unit_type', uint8_t, 0), ('nuh_layer_id', uint8_t, 1), ('nuh_temporal_id_plus1', uint8_t, 2)]) +H265RawNALUnitHeader: TypeAlias = struct_H265RawNALUnitHeader +@c.record +class struct_H265RawProfileTierLevel(c.Struct): + SIZE = 422 + general_profile_space: int + general_tier_flag: int + general_profile_idc: int + general_profile_compatibility_flag: c.Array[ctypes.c_ubyte, Literal[32]] + general_progressive_source_flag: int + general_interlaced_source_flag: int + general_non_packed_constraint_flag: int + general_frame_only_constraint_flag: int + general_max_12bit_constraint_flag: int + general_max_10bit_constraint_flag: int + general_max_8bit_constraint_flag: int + general_max_422chroma_constraint_flag: int + general_max_420chroma_constraint_flag: int + general_max_monochrome_constraint_flag: int + general_intra_constraint_flag: int + general_one_picture_only_constraint_flag: int + general_lower_bit_rate_constraint_flag: int + general_max_14bit_constraint_flag: int + general_inbld_flag: int + general_level_idc: int + sub_layer_profile_present_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_level_present_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_profile_space: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_tier_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_profile_idc: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_profile_compatibility_flag: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[7]] + sub_layer_progressive_source_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_interlaced_source_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_non_packed_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_frame_only_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_max_12bit_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_max_10bit_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_max_8bit_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_max_422chroma_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_max_420chroma_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_max_monochrome_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_intra_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_one_picture_only_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_lower_bit_rate_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_max_14bit_constraint_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_inbld_flag: c.Array[ctypes.c_ubyte, Literal[7]] + sub_layer_level_idc: c.Array[ctypes.c_ubyte, Literal[7]] +struct_H265RawProfileTierLevel.register_fields([('general_profile_space', uint8_t, 0), ('general_tier_flag', uint8_t, 1), ('general_profile_idc', uint8_t, 2), ('general_profile_compatibility_flag', c.Array[uint8_t, Literal[32]], 3), ('general_progressive_source_flag', uint8_t, 35), ('general_interlaced_source_flag', uint8_t, 36), ('general_non_packed_constraint_flag', uint8_t, 37), ('general_frame_only_constraint_flag', uint8_t, 38), ('general_max_12bit_constraint_flag', uint8_t, 39), ('general_max_10bit_constraint_flag', uint8_t, 40), ('general_max_8bit_constraint_flag', uint8_t, 41), ('general_max_422chroma_constraint_flag', uint8_t, 42), ('general_max_420chroma_constraint_flag', uint8_t, 43), ('general_max_monochrome_constraint_flag', uint8_t, 44), ('general_intra_constraint_flag', uint8_t, 45), ('general_one_picture_only_constraint_flag', uint8_t, 46), ('general_lower_bit_rate_constraint_flag', uint8_t, 47), ('general_max_14bit_constraint_flag', uint8_t, 48), ('general_inbld_flag', uint8_t, 49), ('general_level_idc', uint8_t, 50), ('sub_layer_profile_present_flag', c.Array[uint8_t, Literal[7]], 51), ('sub_layer_level_present_flag', c.Array[uint8_t, Literal[7]], 58), ('sub_layer_profile_space', c.Array[uint8_t, Literal[7]], 65), ('sub_layer_tier_flag', c.Array[uint8_t, Literal[7]], 72), ('sub_layer_profile_idc', c.Array[uint8_t, Literal[7]], 79), ('sub_layer_profile_compatibility_flag', c.Array[c.Array[uint8_t, Literal[32]], Literal[7]], 86), ('sub_layer_progressive_source_flag', c.Array[uint8_t, Literal[7]], 310), ('sub_layer_interlaced_source_flag', c.Array[uint8_t, Literal[7]], 317), ('sub_layer_non_packed_constraint_flag', c.Array[uint8_t, Literal[7]], 324), ('sub_layer_frame_only_constraint_flag', c.Array[uint8_t, Literal[7]], 331), ('sub_layer_max_12bit_constraint_flag', c.Array[uint8_t, Literal[7]], 338), ('sub_layer_max_10bit_constraint_flag', c.Array[uint8_t, Literal[7]], 345), ('sub_layer_max_8bit_constraint_flag', c.Array[uint8_t, Literal[7]], 352), ('sub_layer_max_422chroma_constraint_flag', c.Array[uint8_t, Literal[7]], 359), ('sub_layer_max_420chroma_constraint_flag', c.Array[uint8_t, Literal[7]], 366), ('sub_layer_max_monochrome_constraint_flag', c.Array[uint8_t, Literal[7]], 373), ('sub_layer_intra_constraint_flag', c.Array[uint8_t, Literal[7]], 380), ('sub_layer_one_picture_only_constraint_flag', c.Array[uint8_t, Literal[7]], 387), ('sub_layer_lower_bit_rate_constraint_flag', c.Array[uint8_t, Literal[7]], 394), ('sub_layer_max_14bit_constraint_flag', c.Array[uint8_t, Literal[7]], 401), ('sub_layer_inbld_flag', c.Array[uint8_t, Literal[7]], 408), ('sub_layer_level_idc', c.Array[uint8_t, Literal[7]], 415)]) +H265RawProfileTierLevel: TypeAlias = struct_H265RawProfileTierLevel +@c.record +class struct_H265RawSubLayerHRDParameters(c.Struct): + SIZE = 544 + bit_rate_value_minus1: c.Array[ctypes.c_uint32, Literal[32]] + cpb_size_value_minus1: c.Array[ctypes.c_uint32, Literal[32]] + cpb_size_du_value_minus1: c.Array[ctypes.c_uint32, Literal[32]] + bit_rate_du_value_minus1: c.Array[ctypes.c_uint32, Literal[32]] + cbr_flag: c.Array[ctypes.c_ubyte, Literal[32]] +uint32_t: TypeAlias = ctypes.c_uint32 +struct_H265RawSubLayerHRDParameters.register_fields([('bit_rate_value_minus1', c.Array[uint32_t, Literal[32]], 0), ('cpb_size_value_minus1', c.Array[uint32_t, Literal[32]], 128), ('cpb_size_du_value_minus1', c.Array[uint32_t, Literal[32]], 256), ('bit_rate_du_value_minus1', c.Array[uint32_t, Literal[32]], 384), ('cbr_flag', c.Array[uint8_t, Literal[32]], 512)]) +H265RawSubLayerHRDParameters: TypeAlias = struct_H265RawSubLayerHRDParameters +@c.record +class struct_H265RawHRDParameters(c.Struct): + SIZE = 7672 + nal_hrd_parameters_present_flag: int + vcl_hrd_parameters_present_flag: int + sub_pic_hrd_params_present_flag: int + tick_divisor_minus2: int + du_cpb_removal_delay_increment_length_minus1: int + sub_pic_cpb_params_in_pic_timing_sei_flag: int + dpb_output_delay_du_length_minus1: int + bit_rate_scale: int + cpb_size_scale: int + cpb_size_du_scale: int + initial_cpb_removal_delay_length_minus1: int + au_cpb_removal_delay_length_minus1: int + dpb_output_delay_length_minus1: int + fixed_pic_rate_general_flag: c.Array[ctypes.c_ubyte, Literal[7]] + fixed_pic_rate_within_cvs_flag: c.Array[ctypes.c_ubyte, Literal[7]] + elemental_duration_in_tc_minus1: c.Array[ctypes.c_uint16, Literal[7]] + low_delay_hrd_flag: c.Array[ctypes.c_ubyte, Literal[7]] + cpb_cnt_minus1: c.Array[ctypes.c_ubyte, Literal[7]] + nal_sub_layer_hrd_parameters: c.Array[struct_H265RawSubLayerHRDParameters, Literal[7]] + vcl_sub_layer_hrd_parameters: c.Array[struct_H265RawSubLayerHRDParameters, Literal[7]] +uint16_t: TypeAlias = ctypes.c_uint16 +struct_H265RawHRDParameters.register_fields([('nal_hrd_parameters_present_flag', uint8_t, 0), ('vcl_hrd_parameters_present_flag', uint8_t, 1), ('sub_pic_hrd_params_present_flag', uint8_t, 2), ('tick_divisor_minus2', uint8_t, 3), ('du_cpb_removal_delay_increment_length_minus1', uint8_t, 4), ('sub_pic_cpb_params_in_pic_timing_sei_flag', uint8_t, 5), ('dpb_output_delay_du_length_minus1', uint8_t, 6), ('bit_rate_scale', uint8_t, 7), ('cpb_size_scale', uint8_t, 8), ('cpb_size_du_scale', uint8_t, 9), ('initial_cpb_removal_delay_length_minus1', uint8_t, 10), ('au_cpb_removal_delay_length_minus1', uint8_t, 11), ('dpb_output_delay_length_minus1', uint8_t, 12), ('fixed_pic_rate_general_flag', c.Array[uint8_t, Literal[7]], 13), ('fixed_pic_rate_within_cvs_flag', c.Array[uint8_t, Literal[7]], 20), ('elemental_duration_in_tc_minus1', c.Array[uint16_t, Literal[7]], 28), ('low_delay_hrd_flag', c.Array[uint8_t, Literal[7]], 42), ('cpb_cnt_minus1', c.Array[uint8_t, Literal[7]], 49), ('nal_sub_layer_hrd_parameters', c.Array[H265RawSubLayerHRDParameters, Literal[7]], 56), ('vcl_sub_layer_hrd_parameters', c.Array[H265RawSubLayerHRDParameters, Literal[7]], 3864)]) +H265RawHRDParameters: TypeAlias = struct_H265RawHRDParameters +@c.record +class struct_H265RawVUI(c.Struct): + SIZE = 7736 + aspect_ratio_info_present_flag: int + aspect_ratio_idc: int + sar_width: int + sar_height: int + overscan_info_present_flag: int + overscan_appropriate_flag: int + video_signal_type_present_flag: int + video_format: int + video_full_range_flag: int + colour_description_present_flag: int + colour_primaries: int + transfer_characteristics: int + matrix_coefficients: int + chroma_loc_info_present_flag: int + chroma_sample_loc_type_top_field: int + chroma_sample_loc_type_bottom_field: int + neutral_chroma_indication_flag: int + field_seq_flag: int + frame_field_info_present_flag: int + default_display_window_flag: int + def_disp_win_left_offset: int + def_disp_win_right_offset: int + def_disp_win_top_offset: int + def_disp_win_bottom_offset: int + vui_timing_info_present_flag: int + vui_num_units_in_tick: int + vui_time_scale: int + vui_poc_proportional_to_timing_flag: int + vui_num_ticks_poc_diff_one_minus1: int + vui_hrd_parameters_present_flag: int + hrd_parameters: struct_H265RawHRDParameters + bitstream_restriction_flag: int + tiles_fixed_structure_flag: int + motion_vectors_over_pic_boundaries_flag: int + restricted_ref_pic_lists_flag: int + min_spatial_segmentation_idc: int + max_bytes_per_pic_denom: int + max_bits_per_min_cu_denom: int + log2_max_mv_length_horizontal: int + log2_max_mv_length_vertical: int +struct_H265RawVUI.register_fields([('aspect_ratio_info_present_flag', uint8_t, 0), ('aspect_ratio_idc', uint8_t, 1), ('sar_width', uint16_t, 2), ('sar_height', uint16_t, 4), ('overscan_info_present_flag', uint8_t, 6), ('overscan_appropriate_flag', uint8_t, 7), ('video_signal_type_present_flag', uint8_t, 8), ('video_format', uint8_t, 9), ('video_full_range_flag', uint8_t, 10), ('colour_description_present_flag', uint8_t, 11), ('colour_primaries', uint8_t, 12), ('transfer_characteristics', uint8_t, 13), ('matrix_coefficients', uint8_t, 14), ('chroma_loc_info_present_flag', uint8_t, 15), ('chroma_sample_loc_type_top_field', uint8_t, 16), ('chroma_sample_loc_type_bottom_field', uint8_t, 17), ('neutral_chroma_indication_flag', uint8_t, 18), ('field_seq_flag', uint8_t, 19), ('frame_field_info_present_flag', uint8_t, 20), ('default_display_window_flag', uint8_t, 21), ('def_disp_win_left_offset', uint16_t, 22), ('def_disp_win_right_offset', uint16_t, 24), ('def_disp_win_top_offset', uint16_t, 26), ('def_disp_win_bottom_offset', uint16_t, 28), ('vui_timing_info_present_flag', uint8_t, 30), ('vui_num_units_in_tick', uint32_t, 32), ('vui_time_scale', uint32_t, 36), ('vui_poc_proportional_to_timing_flag', uint8_t, 40), ('vui_num_ticks_poc_diff_one_minus1', uint32_t, 44), ('vui_hrd_parameters_present_flag', uint8_t, 48), ('hrd_parameters', H265RawHRDParameters, 52), ('bitstream_restriction_flag', uint8_t, 7724), ('tiles_fixed_structure_flag', uint8_t, 7725), ('motion_vectors_over_pic_boundaries_flag', uint8_t, 7726), ('restricted_ref_pic_lists_flag', uint8_t, 7727), ('min_spatial_segmentation_idc', uint16_t, 7728), ('max_bytes_per_pic_denom', uint8_t, 7730), ('max_bits_per_min_cu_denom', uint8_t, 7731), ('log2_max_mv_length_horizontal', uint8_t, 7732), ('log2_max_mv_length_vertical', uint8_t, 7733)]) +H265RawVUI: TypeAlias = struct_H265RawVUI +class struct_H265RawExtensionData(c.Struct): pass +H265RawExtensionData: TypeAlias = struct_H265RawExtensionData +class struct_H265RawVPS(c.Struct): pass +H265RawVPS: TypeAlias = struct_H265RawVPS +@c.record +class struct_H265RawSTRefPicSet(c.Struct): + SIZE = 136 + inter_ref_pic_set_prediction_flag: int + delta_idx_minus1: int + delta_rps_sign: int + abs_delta_rps_minus1: int + used_by_curr_pic_flag: c.Array[ctypes.c_ubyte, Literal[16]] + use_delta_flag: c.Array[ctypes.c_ubyte, Literal[16]] + num_negative_pics: int + num_positive_pics: int + delta_poc_s0_minus1: c.Array[ctypes.c_uint16, Literal[16]] + used_by_curr_pic_s0_flag: c.Array[ctypes.c_ubyte, Literal[16]] + delta_poc_s1_minus1: c.Array[ctypes.c_uint16, Literal[16]] + used_by_curr_pic_s1_flag: c.Array[ctypes.c_ubyte, Literal[16]] +struct_H265RawSTRefPicSet.register_fields([('inter_ref_pic_set_prediction_flag', uint8_t, 0), ('delta_idx_minus1', uint8_t, 1), ('delta_rps_sign', uint8_t, 2), ('abs_delta_rps_minus1', uint16_t, 4), ('used_by_curr_pic_flag', c.Array[uint8_t, Literal[16]], 6), ('use_delta_flag', c.Array[uint8_t, Literal[16]], 22), ('num_negative_pics', uint8_t, 38), ('num_positive_pics', uint8_t, 39), ('delta_poc_s0_minus1', c.Array[uint16_t, Literal[16]], 40), ('used_by_curr_pic_s0_flag', c.Array[uint8_t, Literal[16]], 72), ('delta_poc_s1_minus1', c.Array[uint16_t, Literal[16]], 88), ('used_by_curr_pic_s1_flag', c.Array[uint8_t, Literal[16]], 120)]) +H265RawSTRefPicSet: TypeAlias = struct_H265RawSTRefPicSet +@c.record +class struct_H265RawScalingList(c.Struct): + SIZE = 1632 + scaling_list_pred_mode_flag: c.Array[c.Array[ctypes.c_ubyte, Literal[6]], Literal[4]] + scaling_list_pred_matrix_id_delta: c.Array[c.Array[ctypes.c_ubyte, Literal[6]], Literal[4]] + scaling_list_dc_coef_minus8: c.Array[c.Array[ctypes.c_int16, Literal[6]], Literal[4]] + scaling_list_delta_coeff: c.Array[c.Array[c.Array[ctypes.c_byte, Literal[64]], Literal[6]], Literal[4]] +int16_t: TypeAlias = ctypes.c_int16 +int8_t: TypeAlias = ctypes.c_byte +struct_H265RawScalingList.register_fields([('scaling_list_pred_mode_flag', c.Array[c.Array[uint8_t, Literal[6]], Literal[4]], 0), ('scaling_list_pred_matrix_id_delta', c.Array[c.Array[uint8_t, Literal[6]], Literal[4]], 24), ('scaling_list_dc_coef_minus8', c.Array[c.Array[int16_t, Literal[6]], Literal[4]], 48), ('scaling_list_delta_coeff', c.Array[c.Array[c.Array[int8_t, Literal[64]], Literal[6]], Literal[4]], 96)]) +H265RawScalingList: TypeAlias = struct_H265RawScalingList +class struct_H265RawSPS(c.Struct): pass +H265RawSPS: TypeAlias = struct_H265RawSPS +class struct_H265RawPPS(c.Struct): pass +H265RawPPS: TypeAlias = struct_H265RawPPS +@c.record +class struct_H265RawAUD(c.Struct): + SIZE = 4 + nal_unit_header: struct_H265RawNALUnitHeader + pic_type: int +struct_H265RawAUD.register_fields([('nal_unit_header', H265RawNALUnitHeader, 0), ('pic_type', uint8_t, 3)]) +H265RawAUD: TypeAlias = struct_H265RawAUD +@c.record +class struct_H265RawSliceHeader(c.Struct): + SIZE = 11772 + nal_unit_header: struct_H265RawNALUnitHeader + first_slice_segment_in_pic_flag: int + no_output_of_prior_pics_flag: int + slice_pic_parameter_set_id: int + dependent_slice_segment_flag: int + slice_segment_address: int + slice_reserved_flag: c.Array[ctypes.c_ubyte, Literal[8]] + slice_type: int + pic_output_flag: int + colour_plane_id: int + slice_pic_order_cnt_lsb: int + short_term_ref_pic_set_sps_flag: int + short_term_ref_pic_set: struct_H265RawSTRefPicSet + short_term_ref_pic_set_idx: int + num_long_term_sps: int + num_long_term_pics: int + lt_idx_sps: c.Array[ctypes.c_ubyte, Literal[16]] + poc_lsb_lt: c.Array[ctypes.c_ubyte, Literal[16]] + used_by_curr_pic_lt_flag: c.Array[ctypes.c_ubyte, Literal[16]] + delta_poc_msb_present_flag: c.Array[ctypes.c_ubyte, Literal[16]] + delta_poc_msb_cycle_lt: c.Array[ctypes.c_uint32, Literal[16]] + slice_temporal_mvp_enabled_flag: int + slice_sao_luma_flag: int + slice_sao_chroma_flag: int + num_ref_idx_active_override_flag: int + num_ref_idx_l0_active_minus1: int + num_ref_idx_l1_active_minus1: int + ref_pic_list_modification_flag_l0: int + list_entry_l0: c.Array[ctypes.c_ubyte, Literal[16]] + ref_pic_list_modification_flag_l1: int + list_entry_l1: c.Array[ctypes.c_ubyte, Literal[16]] + mvd_l1_zero_flag: int + cabac_init_flag: int + collocated_from_l0_flag: int + collocated_ref_idx: int + luma_log2_weight_denom: int + delta_chroma_log2_weight_denom: int + luma_weight_l0_flag: c.Array[ctypes.c_ubyte, Literal[16]] + chroma_weight_l0_flag: c.Array[ctypes.c_ubyte, Literal[16]] + delta_luma_weight_l0: c.Array[ctypes.c_byte, Literal[16]] + luma_offset_l0: c.Array[ctypes.c_int16, Literal[16]] + delta_chroma_weight_l0: c.Array[c.Array[ctypes.c_byte, Literal[2]], Literal[16]] + chroma_offset_l0: c.Array[c.Array[ctypes.c_int16, Literal[2]], Literal[16]] + luma_weight_l1_flag: c.Array[ctypes.c_ubyte, Literal[16]] + chroma_weight_l1_flag: c.Array[ctypes.c_ubyte, Literal[16]] + delta_luma_weight_l1: c.Array[ctypes.c_byte, Literal[16]] + luma_offset_l1: c.Array[ctypes.c_int16, Literal[16]] + delta_chroma_weight_l1: c.Array[c.Array[ctypes.c_byte, Literal[2]], Literal[16]] + chroma_offset_l1: c.Array[c.Array[ctypes.c_int16, Literal[2]], Literal[16]] + five_minus_max_num_merge_cand: int + use_integer_mv_flag: int + slice_qp_delta: int + slice_cb_qp_offset: int + slice_cr_qp_offset: int + slice_act_y_qp_offset: int + slice_act_cb_qp_offset: int + slice_act_cr_qp_offset: int + cu_chroma_qp_offset_enabled_flag: int + deblocking_filter_override_flag: int + slice_deblocking_filter_disabled_flag: int + slice_beta_offset_div2: int + slice_tc_offset_div2: int + slice_loop_filter_across_slices_enabled_flag: int + num_entry_point_offsets: int + offset_len_minus1: int + entry_point_offset_minus1: c.Array[ctypes.c_uint32, Literal[2700]] + slice_segment_header_extension_length: int + slice_segment_header_extension_data_byte: c.Array[ctypes.c_ubyte, Literal[256]] +struct_H265RawSliceHeader.register_fields([('nal_unit_header', H265RawNALUnitHeader, 0), ('first_slice_segment_in_pic_flag', uint8_t, 3), ('no_output_of_prior_pics_flag', uint8_t, 4), ('slice_pic_parameter_set_id', uint8_t, 5), ('dependent_slice_segment_flag', uint8_t, 6), ('slice_segment_address', uint16_t, 8), ('slice_reserved_flag', c.Array[uint8_t, Literal[8]], 10), ('slice_type', uint8_t, 18), ('pic_output_flag', uint8_t, 19), ('colour_plane_id', uint8_t, 20), ('slice_pic_order_cnt_lsb', uint16_t, 22), ('short_term_ref_pic_set_sps_flag', uint8_t, 24), ('short_term_ref_pic_set', H265RawSTRefPicSet, 26), ('short_term_ref_pic_set_idx', uint8_t, 162), ('num_long_term_sps', uint8_t, 163), ('num_long_term_pics', uint8_t, 164), ('lt_idx_sps', c.Array[uint8_t, Literal[16]], 165), ('poc_lsb_lt', c.Array[uint8_t, Literal[16]], 181), ('used_by_curr_pic_lt_flag', c.Array[uint8_t, Literal[16]], 197), ('delta_poc_msb_present_flag', c.Array[uint8_t, Literal[16]], 213), ('delta_poc_msb_cycle_lt', c.Array[uint32_t, Literal[16]], 232), ('slice_temporal_mvp_enabled_flag', uint8_t, 296), ('slice_sao_luma_flag', uint8_t, 297), ('slice_sao_chroma_flag', uint8_t, 298), ('num_ref_idx_active_override_flag', uint8_t, 299), ('num_ref_idx_l0_active_minus1', uint8_t, 300), ('num_ref_idx_l1_active_minus1', uint8_t, 301), ('ref_pic_list_modification_flag_l0', uint8_t, 302), ('list_entry_l0', c.Array[uint8_t, Literal[16]], 303), ('ref_pic_list_modification_flag_l1', uint8_t, 319), ('list_entry_l1', c.Array[uint8_t, Literal[16]], 320), ('mvd_l1_zero_flag', uint8_t, 336), ('cabac_init_flag', uint8_t, 337), ('collocated_from_l0_flag', uint8_t, 338), ('collocated_ref_idx', uint8_t, 339), ('luma_log2_weight_denom', uint8_t, 340), ('delta_chroma_log2_weight_denom', int8_t, 341), ('luma_weight_l0_flag', c.Array[uint8_t, Literal[16]], 342), ('chroma_weight_l0_flag', c.Array[uint8_t, Literal[16]], 358), ('delta_luma_weight_l0', c.Array[int8_t, Literal[16]], 374), ('luma_offset_l0', c.Array[int16_t, Literal[16]], 390), ('delta_chroma_weight_l0', c.Array[c.Array[int8_t, Literal[2]], Literal[16]], 422), ('chroma_offset_l0', c.Array[c.Array[int16_t, Literal[2]], Literal[16]], 454), ('luma_weight_l1_flag', c.Array[uint8_t, Literal[16]], 518), ('chroma_weight_l1_flag', c.Array[uint8_t, Literal[16]], 534), ('delta_luma_weight_l1', c.Array[int8_t, Literal[16]], 550), ('luma_offset_l1', c.Array[int16_t, Literal[16]], 566), ('delta_chroma_weight_l1', c.Array[c.Array[int8_t, Literal[2]], Literal[16]], 598), ('chroma_offset_l1', c.Array[c.Array[int16_t, Literal[2]], Literal[16]], 630), ('five_minus_max_num_merge_cand', uint8_t, 694), ('use_integer_mv_flag', uint8_t, 695), ('slice_qp_delta', int8_t, 696), ('slice_cb_qp_offset', int8_t, 697), ('slice_cr_qp_offset', int8_t, 698), ('slice_act_y_qp_offset', int8_t, 699), ('slice_act_cb_qp_offset', int8_t, 700), ('slice_act_cr_qp_offset', int8_t, 701), ('cu_chroma_qp_offset_enabled_flag', uint8_t, 702), ('deblocking_filter_override_flag', uint8_t, 703), ('slice_deblocking_filter_disabled_flag', uint8_t, 704), ('slice_beta_offset_div2', int8_t, 705), ('slice_tc_offset_div2', int8_t, 706), ('slice_loop_filter_across_slices_enabled_flag', uint8_t, 707), ('num_entry_point_offsets', uint16_t, 708), ('offset_len_minus1', uint8_t, 710), ('entry_point_offset_minus1', c.Array[uint32_t, Literal[2700]], 712), ('slice_segment_header_extension_length', uint16_t, 11512), ('slice_segment_header_extension_data_byte', c.Array[uint8_t, Literal[256]], 11514)]) +H265RawSliceHeader: TypeAlias = struct_H265RawSliceHeader +class struct_H265RawSlice(c.Struct): pass +H265RawSlice: TypeAlias = struct_H265RawSlice +@c.record +class struct_H265RawSEIBufferingPeriod(c.Struct): + SIZE = 1048 + bp_seq_parameter_set_id: int + irap_cpb_params_present_flag: int + cpb_delay_offset: int + dpb_delay_offset: int + concatenation_flag: int + au_cpb_removal_delay_delta_minus1: int + nal_initial_cpb_removal_delay: c.Array[ctypes.c_uint32, Literal[32]] + nal_initial_cpb_removal_offset: c.Array[ctypes.c_uint32, Literal[32]] + nal_initial_alt_cpb_removal_delay: c.Array[ctypes.c_uint32, Literal[32]] + nal_initial_alt_cpb_removal_offset: c.Array[ctypes.c_uint32, Literal[32]] + vcl_initial_cpb_removal_delay: c.Array[ctypes.c_uint32, Literal[32]] + vcl_initial_cpb_removal_offset: c.Array[ctypes.c_uint32, Literal[32]] + vcl_initial_alt_cpb_removal_delay: c.Array[ctypes.c_uint32, Literal[32]] + vcl_initial_alt_cpb_removal_offset: c.Array[ctypes.c_uint32, Literal[32]] + use_alt_cpb_params_flag: int +struct_H265RawSEIBufferingPeriod.register_fields([('bp_seq_parameter_set_id', uint8_t, 0), ('irap_cpb_params_present_flag', uint8_t, 1), ('cpb_delay_offset', uint32_t, 4), ('dpb_delay_offset', uint32_t, 8), ('concatenation_flag', uint8_t, 12), ('au_cpb_removal_delay_delta_minus1', uint32_t, 16), ('nal_initial_cpb_removal_delay', c.Array[uint32_t, Literal[32]], 20), ('nal_initial_cpb_removal_offset', c.Array[uint32_t, Literal[32]], 148), ('nal_initial_alt_cpb_removal_delay', c.Array[uint32_t, Literal[32]], 276), ('nal_initial_alt_cpb_removal_offset', c.Array[uint32_t, Literal[32]], 404), ('vcl_initial_cpb_removal_delay', c.Array[uint32_t, Literal[32]], 532), ('vcl_initial_cpb_removal_offset', c.Array[uint32_t, Literal[32]], 660), ('vcl_initial_alt_cpb_removal_delay', c.Array[uint32_t, Literal[32]], 788), ('vcl_initial_alt_cpb_removal_offset', c.Array[uint32_t, Literal[32]], 916), ('use_alt_cpb_params_flag', uint8_t, 1044)]) +H265RawSEIBufferingPeriod: TypeAlias = struct_H265RawSEIBufferingPeriod +@c.record +class struct_H265RawSEIPicTiming(c.Struct): + SIZE = 3624 + pic_struct: int + source_scan_type: int + duplicate_flag: int + au_cpb_removal_delay_minus1: int + pic_dpb_output_delay: int + pic_dpb_output_du_delay: int + num_decoding_units_minus1: int + du_common_cpb_removal_delay_flag: int + du_common_cpb_removal_delay_increment_minus1: int + num_nalus_in_du_minus1: c.Array[ctypes.c_uint16, Literal[600]] + du_cpb_removal_delay_increment_minus1: c.Array[ctypes.c_uint32, Literal[600]] +struct_H265RawSEIPicTiming.register_fields([('pic_struct', uint8_t, 0), ('source_scan_type', uint8_t, 1), ('duplicate_flag', uint8_t, 2), ('au_cpb_removal_delay_minus1', uint32_t, 4), ('pic_dpb_output_delay', uint32_t, 8), ('pic_dpb_output_du_delay', uint32_t, 12), ('num_decoding_units_minus1', uint16_t, 16), ('du_common_cpb_removal_delay_flag', uint8_t, 18), ('du_common_cpb_removal_delay_increment_minus1', uint32_t, 20), ('num_nalus_in_du_minus1', c.Array[uint16_t, Literal[600]], 24), ('du_cpb_removal_delay_increment_minus1', c.Array[uint32_t, Literal[600]], 1224)]) +H265RawSEIPicTiming: TypeAlias = struct_H265RawSEIPicTiming +@c.record +class struct_H265RawSEIPanScanRect(c.Struct): + SIZE = 60 + pan_scan_rect_id: int + pan_scan_rect_cancel_flag: int + pan_scan_cnt_minus1: int + pan_scan_rect_left_offset: c.Array[ctypes.c_int32, Literal[3]] + pan_scan_rect_right_offset: c.Array[ctypes.c_int32, Literal[3]] + pan_scan_rect_top_offset: c.Array[ctypes.c_int32, Literal[3]] + pan_scan_rect_bottom_offset: c.Array[ctypes.c_int32, Literal[3]] + pan_scan_rect_persistence_flag: int +int32_t: TypeAlias = ctypes.c_int32 +struct_H265RawSEIPanScanRect.register_fields([('pan_scan_rect_id', uint32_t, 0), ('pan_scan_rect_cancel_flag', uint8_t, 4), ('pan_scan_cnt_minus1', uint8_t, 5), ('pan_scan_rect_left_offset', c.Array[int32_t, Literal[3]], 8), ('pan_scan_rect_right_offset', c.Array[int32_t, Literal[3]], 20), ('pan_scan_rect_top_offset', c.Array[int32_t, Literal[3]], 32), ('pan_scan_rect_bottom_offset', c.Array[int32_t, Literal[3]], 44), ('pan_scan_rect_persistence_flag', uint16_t, 56)]) +H265RawSEIPanScanRect: TypeAlias = struct_H265RawSEIPanScanRect +@c.record +class struct_H265RawSEIRecoveryPoint(c.Struct): + SIZE = 4 + recovery_poc_cnt: int + exact_match_flag: int + broken_link_flag: int +struct_H265RawSEIRecoveryPoint.register_fields([('recovery_poc_cnt', int16_t, 0), ('exact_match_flag', uint8_t, 2), ('broken_link_flag', uint8_t, 3)]) +H265RawSEIRecoveryPoint: TypeAlias = struct_H265RawSEIRecoveryPoint +@c.record +class struct_H265RawFilmGrainCharacteristics(c.Struct): + SIZE = 10774 + film_grain_characteristics_cancel_flag: int + film_grain_model_id: int + separate_colour_description_present_flag: int + film_grain_bit_depth_luma_minus8: int + film_grain_bit_depth_chroma_minus8: int + film_grain_full_range_flag: int + film_grain_colour_primaries: int + film_grain_transfer_characteristics: int + film_grain_matrix_coeffs: int + blending_mode_id: int + log2_scale_factor: int + comp_model_present_flag: c.Array[ctypes.c_ubyte, Literal[3]] + num_intensity_intervals_minus1: c.Array[ctypes.c_ubyte, Literal[3]] + num_model_values_minus1: c.Array[ctypes.c_ubyte, Literal[3]] + intensity_interval_lower_bound: c.Array[c.Array[ctypes.c_ubyte, Literal[256]], Literal[3]] + intensity_interval_upper_bound: c.Array[c.Array[ctypes.c_ubyte, Literal[256]], Literal[3]] + comp_model_value: c.Array[c.Array[c.Array[ctypes.c_int16, Literal[6]], Literal[256]], Literal[3]] + film_grain_characteristics_persistence_flag: int +struct_H265RawFilmGrainCharacteristics.register_fields([('film_grain_characteristics_cancel_flag', uint8_t, 0), ('film_grain_model_id', uint8_t, 1), ('separate_colour_description_present_flag', uint8_t, 2), ('film_grain_bit_depth_luma_minus8', uint8_t, 3), ('film_grain_bit_depth_chroma_minus8', uint8_t, 4), ('film_grain_full_range_flag', uint8_t, 5), ('film_grain_colour_primaries', uint8_t, 6), ('film_grain_transfer_characteristics', uint8_t, 7), ('film_grain_matrix_coeffs', uint8_t, 8), ('blending_mode_id', uint8_t, 9), ('log2_scale_factor', uint8_t, 10), ('comp_model_present_flag', c.Array[uint8_t, Literal[3]], 11), ('num_intensity_intervals_minus1', c.Array[uint8_t, Literal[3]], 14), ('num_model_values_minus1', c.Array[uint8_t, Literal[3]], 17), ('intensity_interval_lower_bound', c.Array[c.Array[uint8_t, Literal[256]], Literal[3]], 20), ('intensity_interval_upper_bound', c.Array[c.Array[uint8_t, Literal[256]], Literal[3]], 788), ('comp_model_value', c.Array[c.Array[c.Array[int16_t, Literal[6]], Literal[256]], Literal[3]], 1556), ('film_grain_characteristics_persistence_flag', uint8_t, 10772)]) +H265RawFilmGrainCharacteristics: TypeAlias = struct_H265RawFilmGrainCharacteristics +@c.record +class struct_H265RawSEIDisplayOrientation(c.Struct): + SIZE = 10 + display_orientation_cancel_flag: int + hor_flip: int + ver_flip: int + anticlockwise_rotation: int + display_orientation_repetition_period: int + display_orientation_persistence_flag: int +struct_H265RawSEIDisplayOrientation.register_fields([('display_orientation_cancel_flag', uint8_t, 0), ('hor_flip', uint8_t, 1), ('ver_flip', uint8_t, 2), ('anticlockwise_rotation', uint16_t, 4), ('display_orientation_repetition_period', uint16_t, 6), ('display_orientation_persistence_flag', uint8_t, 8)]) +H265RawSEIDisplayOrientation: TypeAlias = struct_H265RawSEIDisplayOrientation +@c.record +class struct_H265RawSEIActiveParameterSets(c.Struct): + SIZE = 83 + active_video_parameter_set_id: int + self_contained_cvs_flag: int + no_parameter_set_update_flag: int + num_sps_ids_minus1: int + active_seq_parameter_set_id: c.Array[ctypes.c_ubyte, Literal[16]] + layer_sps_idx: c.Array[ctypes.c_ubyte, Literal[63]] +struct_H265RawSEIActiveParameterSets.register_fields([('active_video_parameter_set_id', uint8_t, 0), ('self_contained_cvs_flag', uint8_t, 1), ('no_parameter_set_update_flag', uint8_t, 2), ('num_sps_ids_minus1', uint8_t, 3), ('active_seq_parameter_set_id', c.Array[uint8_t, Literal[16]], 4), ('layer_sps_idx', c.Array[uint8_t, Literal[63]], 20)]) +H265RawSEIActiveParameterSets: TypeAlias = struct_H265RawSEIActiveParameterSets +@c.record +class struct_H265RawSEIDecodedPictureHash(c.Struct): + SIZE = 68 + hash_type: int + picture_md5: c.Array[c.Array[ctypes.c_ubyte, Literal[16]], Literal[3]] + picture_crc: c.Array[ctypes.c_uint16, Literal[3]] + picture_checksum: c.Array[ctypes.c_uint32, Literal[3]] +struct_H265RawSEIDecodedPictureHash.register_fields([('hash_type', uint8_t, 0), ('picture_md5', c.Array[c.Array[uint8_t, Literal[16]], Literal[3]], 1), ('picture_crc', c.Array[uint16_t, Literal[3]], 50), ('picture_checksum', c.Array[uint32_t, Literal[3]], 56)]) +H265RawSEIDecodedPictureHash: TypeAlias = struct_H265RawSEIDecodedPictureHash +@c.record +class struct_H265RawSEITimeCode(c.Struct): + SIZE = 60 + num_clock_ts: int + clock_timestamp_flag: c.Array[ctypes.c_ubyte, Literal[3]] + units_field_based_flag: c.Array[ctypes.c_ubyte, Literal[3]] + counting_type: c.Array[ctypes.c_ubyte, Literal[3]] + full_timestamp_flag: c.Array[ctypes.c_ubyte, Literal[3]] + discontinuity_flag: c.Array[ctypes.c_ubyte, Literal[3]] + cnt_dropped_flag: c.Array[ctypes.c_ubyte, Literal[3]] + n_frames: c.Array[ctypes.c_uint16, Literal[3]] + seconds_value: c.Array[ctypes.c_ubyte, Literal[3]] + minutes_value: c.Array[ctypes.c_ubyte, Literal[3]] + hours_value: c.Array[ctypes.c_ubyte, Literal[3]] + seconds_flag: c.Array[ctypes.c_ubyte, Literal[3]] + minutes_flag: c.Array[ctypes.c_ubyte, Literal[3]] + hours_flag: c.Array[ctypes.c_ubyte, Literal[3]] + time_offset_length: c.Array[ctypes.c_ubyte, Literal[3]] + time_offset_value: c.Array[ctypes.c_int32, Literal[3]] +struct_H265RawSEITimeCode.register_fields([('num_clock_ts', uint8_t, 0), ('clock_timestamp_flag', c.Array[uint8_t, Literal[3]], 1), ('units_field_based_flag', c.Array[uint8_t, Literal[3]], 4), ('counting_type', c.Array[uint8_t, Literal[3]], 7), ('full_timestamp_flag', c.Array[uint8_t, Literal[3]], 10), ('discontinuity_flag', c.Array[uint8_t, Literal[3]], 13), ('cnt_dropped_flag', c.Array[uint8_t, Literal[3]], 16), ('n_frames', c.Array[uint16_t, Literal[3]], 20), ('seconds_value', c.Array[uint8_t, Literal[3]], 26), ('minutes_value', c.Array[uint8_t, Literal[3]], 29), ('hours_value', c.Array[uint8_t, Literal[3]], 32), ('seconds_flag', c.Array[uint8_t, Literal[3]], 35), ('minutes_flag', c.Array[uint8_t, Literal[3]], 38), ('hours_flag', c.Array[uint8_t, Literal[3]], 41), ('time_offset_length', c.Array[uint8_t, Literal[3]], 44), ('time_offset_value', c.Array[int32_t, Literal[3]], 48)]) +H265RawSEITimeCode: TypeAlias = struct_H265RawSEITimeCode +@c.record +class struct_H265RawSEIAlphaChannelInfo(c.Struct): + SIZE = 12 + alpha_channel_cancel_flag: int + alpha_channel_use_idc: int + alpha_channel_bit_depth_minus8: int + alpha_transparent_value: int + alpha_opaque_value: int + alpha_channel_incr_flag: int + alpha_channel_clip_flag: int + alpha_channel_clip_type_flag: int +struct_H265RawSEIAlphaChannelInfo.register_fields([('alpha_channel_cancel_flag', uint8_t, 0), ('alpha_channel_use_idc', uint8_t, 1), ('alpha_channel_bit_depth_minus8', uint8_t, 2), ('alpha_transparent_value', uint16_t, 4), ('alpha_opaque_value', uint16_t, 6), ('alpha_channel_incr_flag', uint8_t, 8), ('alpha_channel_clip_flag', uint8_t, 9), ('alpha_channel_clip_type_flag', uint8_t, 10)]) +H265RawSEIAlphaChannelInfo: TypeAlias = struct_H265RawSEIAlphaChannelInfo +@c.record +class struct_H265RawSEI3DReferenceDisplaysInfo(c.Struct): + SIZE = 358 + prec_ref_display_width: int + ref_viewing_distance_flag: int + prec_ref_viewing_dist: int + num_ref_displays_minus1: int + left_view_id: c.Array[ctypes.c_uint16, Literal[32]] + right_view_id: c.Array[ctypes.c_uint16, Literal[32]] + exponent_ref_display_width: c.Array[ctypes.c_ubyte, Literal[32]] + mantissa_ref_display_width: c.Array[ctypes.c_ubyte, Literal[32]] + exponent_ref_viewing_distance: c.Array[ctypes.c_ubyte, Literal[32]] + mantissa_ref_viewing_distance: c.Array[ctypes.c_ubyte, Literal[32]] + additional_shift_present_flag: c.Array[ctypes.c_ubyte, Literal[32]] + num_sample_shift_plus512: c.Array[ctypes.c_uint16, Literal[32]] + three_dimensional_reference_displays_extension_flag: int +struct_H265RawSEI3DReferenceDisplaysInfo.register_fields([('prec_ref_display_width', uint8_t, 0), ('ref_viewing_distance_flag', uint8_t, 1), ('prec_ref_viewing_dist', uint8_t, 2), ('num_ref_displays_minus1', uint8_t, 3), ('left_view_id', c.Array[uint16_t, Literal[32]], 4), ('right_view_id', c.Array[uint16_t, Literal[32]], 68), ('exponent_ref_display_width', c.Array[uint8_t, Literal[32]], 132), ('mantissa_ref_display_width', c.Array[uint8_t, Literal[32]], 164), ('exponent_ref_viewing_distance', c.Array[uint8_t, Literal[32]], 196), ('mantissa_ref_viewing_distance', c.Array[uint8_t, Literal[32]], 228), ('additional_shift_present_flag', c.Array[uint8_t, Literal[32]], 260), ('num_sample_shift_plus512', c.Array[uint16_t, Literal[32]], 292), ('three_dimensional_reference_displays_extension_flag', uint8_t, 356)]) +H265RawSEI3DReferenceDisplaysInfo: TypeAlias = struct_H265RawSEI3DReferenceDisplaysInfo +@c.record +class struct_H265RawSEI(c.Struct): + SIZE = 24 + nal_unit_header: struct_H265RawNALUnitHeader + message_list: struct_SEIRawMessageList +@c.record +class struct_SEIRawMessageList(c.Struct): + SIZE = 16 + messages: c.POINTER[struct_SEIRawMessage] + nb_messages: int + nb_messages_allocated: int +SEIRawMessageList: TypeAlias = struct_SEIRawMessageList +@c.record +class struct_SEIRawMessage(c.Struct): + SIZE = 40 + payload_type: int + payload_size: int + payload: ctypes.c_void_p + payload_ref: ctypes.c_void_p + extension_data: c.POINTER[ctypes.c_ubyte] + extension_bit_length: int +SEIRawMessage: TypeAlias = struct_SEIRawMessage +size_t: TypeAlias = ctypes.c_uint64 +struct_SEIRawMessage.register_fields([('payload_type', uint32_t, 0), ('payload_size', uint32_t, 4), ('payload', ctypes.c_void_p, 8), ('payload_ref', ctypes.c_void_p, 16), ('extension_data', c.POINTER[uint8_t], 24), ('extension_bit_length', size_t, 32)]) +struct_SEIRawMessageList.register_fields([('messages', c.POINTER[SEIRawMessage], 0), ('nb_messages', ctypes.c_int32, 8), ('nb_messages_allocated', ctypes.c_int32, 12)]) +struct_H265RawSEI.register_fields([('nal_unit_header', H265RawNALUnitHeader, 0), ('message_list', SEIRawMessageList, 8)]) +H265RawSEI: TypeAlias = struct_H265RawSEI +@c.record +class struct_H265RawFiller(c.Struct): + SIZE = 8 + nal_unit_header: struct_H265RawNALUnitHeader + filler_size: int +struct_H265RawFiller.register_fields([('nal_unit_header', H265RawNALUnitHeader, 0), ('filler_size', uint32_t, 4)]) +H265RawFiller: TypeAlias = struct_H265RawFiller +class struct_CodedBitstreamH265Context(c.Struct): pass +CodedBitstreamH265Context: TypeAlias = struct_CodedBitstreamH265Context diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/comgr.py b/artifacts/package_runtime/tinygrad/runtime/autogen/comgr.py new file mode 100644 index 000000000..adcf0ef28 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/comgr.py @@ -0,0 +1,205 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +import os +dll = c.DLL('comgr', [os.getenv('ROCM_PATH', '/opt/rocm')+'/lib/libamd_comgr.so', 'amd_comgr']) +amd_comgr_status_s: dict[int, str] = {(AMD_COMGR_STATUS_SUCCESS:=0): 'AMD_COMGR_STATUS_SUCCESS', (AMD_COMGR_STATUS_ERROR:=1): 'AMD_COMGR_STATUS_ERROR', (AMD_COMGR_STATUS_ERROR_INVALID_ARGUMENT:=2): 'AMD_COMGR_STATUS_ERROR_INVALID_ARGUMENT', (AMD_COMGR_STATUS_ERROR_OUT_OF_RESOURCES:=3): 'AMD_COMGR_STATUS_ERROR_OUT_OF_RESOURCES'} +amd_comgr_status_t: TypeAlias = ctypes.c_uint32 +amd_comgr_language_s: dict[int, str] = {(AMD_COMGR_LANGUAGE_NONE:=0): 'AMD_COMGR_LANGUAGE_NONE', (AMD_COMGR_LANGUAGE_OPENCL_1_2:=1): 'AMD_COMGR_LANGUAGE_OPENCL_1_2', (AMD_COMGR_LANGUAGE_OPENCL_2_0:=2): 'AMD_COMGR_LANGUAGE_OPENCL_2_0', (AMD_COMGR_LANGUAGE_HC:=3): 'AMD_COMGR_LANGUAGE_HC', (AMD_COMGR_LANGUAGE_HIP:=4): 'AMD_COMGR_LANGUAGE_HIP', (AMD_COMGR_LANGUAGE_LLVM_IR:=5): 'AMD_COMGR_LANGUAGE_LLVM_IR', (AMD_COMGR_LANGUAGE_LAST:=5): 'AMD_COMGR_LANGUAGE_LAST'} +amd_comgr_language_t: TypeAlias = ctypes.c_uint32 +@dll.bind(amd_comgr_status_t, amd_comgr_status_t, c.POINTER[c.POINTER[ctypes.c_char]]) +def amd_comgr_status_string(status:amd_comgr_status_t, status_string:c.POINTER[c.POINTER[ctypes.c_char]]) -> amd_comgr_status_t: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(None, c.POINTER[size_t], c.POINTER[size_t]) +def amd_comgr_get_version(major:c.POINTER[size_t], minor:c.POINTER[size_t]) -> None: ... +amd_comgr_data_kind_s: dict[int, str] = {(AMD_COMGR_DATA_KIND_UNDEF:=0): 'AMD_COMGR_DATA_KIND_UNDEF', (AMD_COMGR_DATA_KIND_SOURCE:=1): 'AMD_COMGR_DATA_KIND_SOURCE', (AMD_COMGR_DATA_KIND_INCLUDE:=2): 'AMD_COMGR_DATA_KIND_INCLUDE', (AMD_COMGR_DATA_KIND_PRECOMPILED_HEADER:=3): 'AMD_COMGR_DATA_KIND_PRECOMPILED_HEADER', (AMD_COMGR_DATA_KIND_DIAGNOSTIC:=4): 'AMD_COMGR_DATA_KIND_DIAGNOSTIC', (AMD_COMGR_DATA_KIND_LOG:=5): 'AMD_COMGR_DATA_KIND_LOG', (AMD_COMGR_DATA_KIND_BC:=6): 'AMD_COMGR_DATA_KIND_BC', (AMD_COMGR_DATA_KIND_RELOCATABLE:=7): 'AMD_COMGR_DATA_KIND_RELOCATABLE', (AMD_COMGR_DATA_KIND_EXECUTABLE:=8): 'AMD_COMGR_DATA_KIND_EXECUTABLE', (AMD_COMGR_DATA_KIND_BYTES:=9): 'AMD_COMGR_DATA_KIND_BYTES', (AMD_COMGR_DATA_KIND_FATBIN:=16): 'AMD_COMGR_DATA_KIND_FATBIN', (AMD_COMGR_DATA_KIND_AR:=17): 'AMD_COMGR_DATA_KIND_AR', (AMD_COMGR_DATA_KIND_BC_BUNDLE:=18): 'AMD_COMGR_DATA_KIND_BC_BUNDLE', (AMD_COMGR_DATA_KIND_AR_BUNDLE:=19): 'AMD_COMGR_DATA_KIND_AR_BUNDLE', (AMD_COMGR_DATA_KIND_OBJ_BUNDLE:=20): 'AMD_COMGR_DATA_KIND_OBJ_BUNDLE', (AMD_COMGR_DATA_KIND_LAST:=20): 'AMD_COMGR_DATA_KIND_LAST'} +amd_comgr_data_kind_t: TypeAlias = ctypes.c_uint32 +@c.record +class amd_comgr_data_s(c.Struct): + SIZE = 8 + handle: int +uint64_t: TypeAlias = ctypes.c_uint64 +amd_comgr_data_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_data_t: TypeAlias = amd_comgr_data_s +@c.record +class amd_comgr_data_set_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_data_set_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_data_set_t: TypeAlias = amd_comgr_data_set_s +@c.record +class amd_comgr_action_info_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_action_info_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_action_info_t: TypeAlias = amd_comgr_action_info_s +@c.record +class amd_comgr_metadata_node_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_metadata_node_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_metadata_node_t: TypeAlias = amd_comgr_metadata_node_s +@c.record +class amd_comgr_symbol_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_symbol_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_symbol_t: TypeAlias = amd_comgr_symbol_s +@c.record +class amd_comgr_disassembly_info_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_disassembly_info_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_disassembly_info_t: TypeAlias = amd_comgr_disassembly_info_s +@c.record +class amd_comgr_symbolizer_info_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_symbolizer_info_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_symbolizer_info_t: TypeAlias = amd_comgr_symbolizer_info_s +@dll.bind(amd_comgr_status_t, c.POINTER[size_t]) +def amd_comgr_get_isa_count(count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, size_t, c.POINTER[c.POINTER[ctypes.c_char]]) +def amd_comgr_get_isa_name(index:size_t, isa_name:c.POINTER[c.POINTER[ctypes.c_char]]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, c.POINTER[ctypes.c_char], c.POINTER[amd_comgr_metadata_node_t]) +def amd_comgr_get_isa_metadata(isa_name:c.POINTER[ctypes.c_char], metadata:c.POINTER[amd_comgr_metadata_node_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_kind_t, c.POINTER[amd_comgr_data_t]) +def amd_comgr_create_data(kind:amd_comgr_data_kind_t, data:c.POINTER[amd_comgr_data_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t) +def amd_comgr_release_data(data:amd_comgr_data_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[amd_comgr_data_kind_t]) +def amd_comgr_get_data_kind(data:amd_comgr_data_t, kind:c.POINTER[amd_comgr_data_kind_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, size_t, c.POINTER[ctypes.c_char]) +def amd_comgr_set_data(data:amd_comgr_data_t, size:size_t, bytes:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, ctypes.c_int32, uint64_t, uint64_t) +def amd_comgr_set_data_from_file_slice(data:amd_comgr_data_t, file_descriptor:int, offset:uint64_t, size:uint64_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[ctypes.c_char]) +def amd_comgr_set_data_name(data:amd_comgr_data_t, name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_data(data:amd_comgr_data_t, size:c.POINTER[size_t], bytes:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_data_name(data:amd_comgr_data_t, size:c.POINTER[size_t], name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_data_isa_name(data:amd_comgr_data_t, size:c.POINTER[size_t], isa_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]], c.POINTER[amd_comgr_symbolizer_info_t]) +def amd_comgr_create_symbolizer_info(code_object:amd_comgr_data_t, print_symbol_callback:c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]], symbolizer_info:c.POINTER[amd_comgr_symbolizer_info_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_symbolizer_info_t) +def amd_comgr_destroy_symbolizer_info(symbolizer_info:amd_comgr_symbolizer_info_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_symbolizer_info_t, uint64_t, ctypes.c_bool, ctypes.c_void_p) +def amd_comgr_symbolize(symbolizer_info:amd_comgr_symbolizer_info_t, address:uint64_t, is_code:bool, user_data:ctypes.c_void_p) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[amd_comgr_metadata_node_t]) +def amd_comgr_get_data_metadata(data:amd_comgr_data_t, metadata:c.POINTER[amd_comgr_metadata_node_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t) +def amd_comgr_destroy_metadata(metadata:amd_comgr_metadata_node_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, c.POINTER[amd_comgr_data_set_t]) +def amd_comgr_create_data_set(data_set:c.POINTER[amd_comgr_data_set_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t) +def amd_comgr_destroy_data_set(data_set:amd_comgr_data_set_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t, amd_comgr_data_t) +def amd_comgr_data_set_add(data_set:amd_comgr_data_set_t, data:amd_comgr_data_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t, amd_comgr_data_kind_t) +def amd_comgr_data_set_remove(data_set:amd_comgr_data_set_t, data_kind:amd_comgr_data_kind_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t, amd_comgr_data_kind_t, c.POINTER[size_t]) +def amd_comgr_action_data_count(data_set:amd_comgr_data_set_t, data_kind:amd_comgr_data_kind_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t, amd_comgr_data_kind_t, size_t, c.POINTER[amd_comgr_data_t]) +def amd_comgr_action_data_get_data(data_set:amd_comgr_data_set_t, data_kind:amd_comgr_data_kind_t, index:size_t, data:c.POINTER[amd_comgr_data_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, c.POINTER[amd_comgr_action_info_t]) +def amd_comgr_create_action_info(action_info:c.POINTER[amd_comgr_action_info_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t) +def amd_comgr_destroy_action_info(action_info:amd_comgr_action_info_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_set_isa_name(action_info:amd_comgr_action_info_t, isa_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_isa_name(action_info:amd_comgr_action_info_t, size:c.POINTER[size_t], isa_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, amd_comgr_language_t) +def amd_comgr_action_info_set_language(action_info:amd_comgr_action_info_t, language:amd_comgr_language_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[amd_comgr_language_t]) +def amd_comgr_action_info_get_language(action_info:amd_comgr_action_info_t, language:c.POINTER[amd_comgr_language_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_set_options(action_info:amd_comgr_action_info_t, options:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_options(action_info:amd_comgr_action_info_t, size:c.POINTER[size_t], options:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.Array[c.POINTER[ctypes.c_char], Literal[0]], size_t) +def amd_comgr_action_info_set_option_list(action_info:amd_comgr_action_info_t, options:c.Array[c.POINTER[ctypes.c_char], Literal[0]], count:size_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t]) +def amd_comgr_action_info_get_option_list_count(action_info:amd_comgr_action_info_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, size_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_option_list_item(action_info:amd_comgr_action_info_t, index:size_t, size:c.POINTER[size_t], option:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.Array[c.POINTER[ctypes.c_char], Literal[0]], size_t) +def amd_comgr_action_info_set_bundle_entry_ids(action_info:amd_comgr_action_info_t, bundle_entry_ids:c.Array[c.POINTER[ctypes.c_char], Literal[0]], count:size_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t]) +def amd_comgr_action_info_get_bundle_entry_id_count(action_info:amd_comgr_action_info_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, size_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_bundle_entry_id(action_info:amd_comgr_action_info_t, index:size_t, size:c.POINTER[size_t], bundle_entry_id:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_set_working_directory_path(action_info:amd_comgr_action_info_t, path:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_working_directory_path(action_info:amd_comgr_action_info_t, size:c.POINTER[size_t], path:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, ctypes.c_bool) +def amd_comgr_action_info_set_logging(action_info:amd_comgr_action_info_t, logging:bool) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[ctypes.c_bool]) +def amd_comgr_action_info_get_logging(action_info:amd_comgr_action_info_t, logging:c.POINTER[ctypes.c_bool]) -> amd_comgr_status_t: ... +amd_comgr_action_kind_s: dict[int, str] = {(AMD_COMGR_ACTION_SOURCE_TO_PREPROCESSOR:=0): 'AMD_COMGR_ACTION_SOURCE_TO_PREPROCESSOR', (AMD_COMGR_ACTION_ADD_PRECOMPILED_HEADERS:=1): 'AMD_COMGR_ACTION_ADD_PRECOMPILED_HEADERS', (AMD_COMGR_ACTION_COMPILE_SOURCE_TO_BC:=2): 'AMD_COMGR_ACTION_COMPILE_SOURCE_TO_BC', (AMD_COMGR_ACTION_ADD_DEVICE_LIBRARIES:=3): 'AMD_COMGR_ACTION_ADD_DEVICE_LIBRARIES', (AMD_COMGR_ACTION_LINK_BC_TO_BC:=4): 'AMD_COMGR_ACTION_LINK_BC_TO_BC', (AMD_COMGR_ACTION_OPTIMIZE_BC_TO_BC:=5): 'AMD_COMGR_ACTION_OPTIMIZE_BC_TO_BC', (AMD_COMGR_ACTION_CODEGEN_BC_TO_RELOCATABLE:=6): 'AMD_COMGR_ACTION_CODEGEN_BC_TO_RELOCATABLE', (AMD_COMGR_ACTION_CODEGEN_BC_TO_ASSEMBLY:=7): 'AMD_COMGR_ACTION_CODEGEN_BC_TO_ASSEMBLY', (AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_RELOCATABLE:=8): 'AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_RELOCATABLE', (AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_EXECUTABLE:=9): 'AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_EXECUTABLE', (AMD_COMGR_ACTION_ASSEMBLE_SOURCE_TO_RELOCATABLE:=10): 'AMD_COMGR_ACTION_ASSEMBLE_SOURCE_TO_RELOCATABLE', (AMD_COMGR_ACTION_DISASSEMBLE_RELOCATABLE_TO_SOURCE:=11): 'AMD_COMGR_ACTION_DISASSEMBLE_RELOCATABLE_TO_SOURCE', (AMD_COMGR_ACTION_DISASSEMBLE_EXECUTABLE_TO_SOURCE:=12): 'AMD_COMGR_ACTION_DISASSEMBLE_EXECUTABLE_TO_SOURCE', (AMD_COMGR_ACTION_DISASSEMBLE_BYTES_TO_SOURCE:=13): 'AMD_COMGR_ACTION_DISASSEMBLE_BYTES_TO_SOURCE', (AMD_COMGR_ACTION_COMPILE_SOURCE_TO_FATBIN:=14): 'AMD_COMGR_ACTION_COMPILE_SOURCE_TO_FATBIN', (AMD_COMGR_ACTION_COMPILE_SOURCE_WITH_DEVICE_LIBS_TO_BC:=15): 'AMD_COMGR_ACTION_COMPILE_SOURCE_WITH_DEVICE_LIBS_TO_BC', (AMD_COMGR_ACTION_COMPILE_SOURCE_TO_RELOCATABLE:=16): 'AMD_COMGR_ACTION_COMPILE_SOURCE_TO_RELOCATABLE', (AMD_COMGR_ACTION_COMPILE_SOURCE_TO_EXECUTABLE:=17): 'AMD_COMGR_ACTION_COMPILE_SOURCE_TO_EXECUTABLE', (AMD_COMGR_ACTION_UNBUNDLE:=18): 'AMD_COMGR_ACTION_UNBUNDLE', (AMD_COMGR_ACTION_LAST:=18): 'AMD_COMGR_ACTION_LAST'} +amd_comgr_action_kind_t: TypeAlias = ctypes.c_uint32 +@dll.bind(amd_comgr_status_t, amd_comgr_action_kind_t, amd_comgr_action_info_t, amd_comgr_data_set_t, amd_comgr_data_set_t) +def amd_comgr_do_action(kind:amd_comgr_action_kind_t, info:amd_comgr_action_info_t, input:amd_comgr_data_set_t, result:amd_comgr_data_set_t) -> amd_comgr_status_t: ... +amd_comgr_metadata_kind_s: dict[int, str] = {(AMD_COMGR_METADATA_KIND_NULL:=0): 'AMD_COMGR_METADATA_KIND_NULL', (AMD_COMGR_METADATA_KIND_STRING:=1): 'AMD_COMGR_METADATA_KIND_STRING', (AMD_COMGR_METADATA_KIND_MAP:=2): 'AMD_COMGR_METADATA_KIND_MAP', (AMD_COMGR_METADATA_KIND_LIST:=3): 'AMD_COMGR_METADATA_KIND_LIST', (AMD_COMGR_METADATA_KIND_LAST:=3): 'AMD_COMGR_METADATA_KIND_LAST'} +amd_comgr_metadata_kind_t: TypeAlias = ctypes.c_uint32 +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[amd_comgr_metadata_kind_t]) +def amd_comgr_get_metadata_kind(metadata:amd_comgr_metadata_node_t, kind:c.POINTER[amd_comgr_metadata_kind_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_metadata_string(metadata:amd_comgr_metadata_node_t, size:c.POINTER[size_t], string:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[size_t]) +def amd_comgr_get_metadata_map_size(metadata:amd_comgr_metadata_node_t, size:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.CFUNCTYPE[amd_comgr_status_t, [amd_comgr_metadata_node_t, amd_comgr_metadata_node_t, ctypes.c_void_p]], ctypes.c_void_p) +def amd_comgr_iterate_map_metadata(metadata:amd_comgr_metadata_node_t, callback:c.CFUNCTYPE[amd_comgr_status_t, [amd_comgr_metadata_node_t, amd_comgr_metadata_node_t, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[ctypes.c_char], c.POINTER[amd_comgr_metadata_node_t]) +def amd_comgr_metadata_lookup(metadata:amd_comgr_metadata_node_t, key:c.POINTER[ctypes.c_char], value:c.POINTER[amd_comgr_metadata_node_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[size_t]) +def amd_comgr_get_metadata_list_size(metadata:amd_comgr_metadata_node_t, size:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, size_t, c.POINTER[amd_comgr_metadata_node_t]) +def amd_comgr_index_list_metadata(metadata:amd_comgr_metadata_node_t, index:size_t, value:c.POINTER[amd_comgr_metadata_node_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.CFUNCTYPE[amd_comgr_status_t, [amd_comgr_symbol_t, ctypes.c_void_p]], ctypes.c_void_p) +def amd_comgr_iterate_symbols(data:amd_comgr_data_t, callback:c.CFUNCTYPE[amd_comgr_status_t, [amd_comgr_symbol_t, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[ctypes.c_char], c.POINTER[amd_comgr_symbol_t]) +def amd_comgr_symbol_lookup(data:amd_comgr_data_t, name:c.POINTER[ctypes.c_char], symbol:c.POINTER[amd_comgr_symbol_t]) -> amd_comgr_status_t: ... +amd_comgr_symbol_type_s: dict[int, str] = {(AMD_COMGR_SYMBOL_TYPE_UNKNOWN:=-1): 'AMD_COMGR_SYMBOL_TYPE_UNKNOWN', (AMD_COMGR_SYMBOL_TYPE_NOTYPE:=0): 'AMD_COMGR_SYMBOL_TYPE_NOTYPE', (AMD_COMGR_SYMBOL_TYPE_OBJECT:=1): 'AMD_COMGR_SYMBOL_TYPE_OBJECT', (AMD_COMGR_SYMBOL_TYPE_FUNC:=2): 'AMD_COMGR_SYMBOL_TYPE_FUNC', (AMD_COMGR_SYMBOL_TYPE_SECTION:=3): 'AMD_COMGR_SYMBOL_TYPE_SECTION', (AMD_COMGR_SYMBOL_TYPE_FILE:=4): 'AMD_COMGR_SYMBOL_TYPE_FILE', (AMD_COMGR_SYMBOL_TYPE_COMMON:=5): 'AMD_COMGR_SYMBOL_TYPE_COMMON', (AMD_COMGR_SYMBOL_TYPE_AMDGPU_HSA_KERNEL:=10): 'AMD_COMGR_SYMBOL_TYPE_AMDGPU_HSA_KERNEL'} +amd_comgr_symbol_type_t: TypeAlias = ctypes.c_int32 +amd_comgr_symbol_info_s: dict[int, str] = {(AMD_COMGR_SYMBOL_INFO_NAME_LENGTH:=0): 'AMD_COMGR_SYMBOL_INFO_NAME_LENGTH', (AMD_COMGR_SYMBOL_INFO_NAME:=1): 'AMD_COMGR_SYMBOL_INFO_NAME', (AMD_COMGR_SYMBOL_INFO_TYPE:=2): 'AMD_COMGR_SYMBOL_INFO_TYPE', (AMD_COMGR_SYMBOL_INFO_SIZE:=3): 'AMD_COMGR_SYMBOL_INFO_SIZE', (AMD_COMGR_SYMBOL_INFO_IS_UNDEFINED:=4): 'AMD_COMGR_SYMBOL_INFO_IS_UNDEFINED', (AMD_COMGR_SYMBOL_INFO_VALUE:=5): 'AMD_COMGR_SYMBOL_INFO_VALUE', (AMD_COMGR_SYMBOL_INFO_LAST:=5): 'AMD_COMGR_SYMBOL_INFO_LAST'} +amd_comgr_symbol_info_t: TypeAlias = ctypes.c_uint32 +@dll.bind(amd_comgr_status_t, amd_comgr_symbol_t, amd_comgr_symbol_info_t, ctypes.c_void_p) +def amd_comgr_symbol_get_info(symbol:amd_comgr_symbol_t, attribute:amd_comgr_symbol_info_t, value:ctypes.c_void_p) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, c.POINTER[ctypes.c_char], c.CFUNCTYPE[uint64_t, [uint64_t, c.POINTER[ctypes.c_char], uint64_t, ctypes.c_void_p]], c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]], c.CFUNCTYPE[None, [uint64_t, ctypes.c_void_p]], c.POINTER[amd_comgr_disassembly_info_t]) +def amd_comgr_create_disassembly_info(isa_name:c.POINTER[ctypes.c_char], read_memory_callback:c.CFUNCTYPE[uint64_t, [uint64_t, c.POINTER[ctypes.c_char], uint64_t, ctypes.c_void_p]], print_instruction_callback:c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]], print_address_annotation_callback:c.CFUNCTYPE[None, [uint64_t, ctypes.c_void_p]], disassembly_info:c.POINTER[amd_comgr_disassembly_info_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_disassembly_info_t) +def amd_comgr_destroy_disassembly_info(disassembly_info:amd_comgr_disassembly_info_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_disassembly_info_t, uint64_t, ctypes.c_void_p, c.POINTER[uint64_t]) +def amd_comgr_disassemble_instruction(disassembly_info:amd_comgr_disassembly_info_t, address:uint64_t, user_data:ctypes.c_void_p, size:c.POINTER[uint64_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[amd_comgr_data_t]) +def amd_comgr_demangle_symbol_name(mangled_symbol_name:amd_comgr_data_t, demangled_symbol_name:c.POINTER[amd_comgr_data_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t]) +def amd_comgr_populate_mangled_names(data:amd_comgr_data_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, size_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_mangled_name(data:amd_comgr_data_t, index:size_t, size:c.POINTER[size_t], mangled_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t]) +def amd_comgr_populate_name_expression_map(data:amd_comgr_data_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def amd_comgr_map_name_expression_to_symbol_name(data:amd_comgr_data_t, size:c.POINTER[size_t], name_expression:c.POINTER[ctypes.c_char], symbol_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@c.record +class code_object_info_s(c.Struct): + SIZE = 24 + isa: c.POINTER[ctypes.c_char] + size: int + offset: int +code_object_info_s.register_fields([('isa', c.POINTER[ctypes.c_char], 0), ('size', size_t, 8), ('offset', uint64_t, 16)]) +amd_comgr_code_object_info_t: TypeAlias = code_object_info_s +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[amd_comgr_code_object_info_t], size_t) +def amd_comgr_lookup_code_object(data:amd_comgr_data_t, info_list:c.POINTER[amd_comgr_code_object_info_t], info_list_size:size_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, uint64_t, c.POINTER[uint64_t], c.POINTER[uint64_t], c.POINTER[ctypes.c_bool]) +def amd_comgr_map_elf_virtual_address_to_code_object_offset(data:amd_comgr_data_t, elf_virtual_address:uint64_t, code_object_offset:c.POINTER[uint64_t], slice_size:c.POINTER[uint64_t], nobits:c.POINTER[ctypes.c_bool]) -> amd_comgr_status_t: ... +AMD_COMGR_DEPRECATED = lambda msg: __attribute__((deprecated(msg))) # type: ignore +AMD_COMGR_INTERFACE_VERSION_MAJOR = 2 +AMD_COMGR_INTERFACE_VERSION_MINOR = 8 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/comgr_3.py b/artifacts/package_runtime/tinygrad/runtime/autogen/comgr_3.py new file mode 100644 index 000000000..d8c608d13 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/comgr_3.py @@ -0,0 +1,205 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +import os +dll = c.DLL('comgr_3', [os.getenv('ROCM_PATH', '/opt/rocm')+'/lib/libamd_comgr.so', 'amd_comgr']) +amd_comgr_status_s: dict[int, str] = {(AMD_COMGR_STATUS_SUCCESS:=0): 'AMD_COMGR_STATUS_SUCCESS', (AMD_COMGR_STATUS_ERROR:=1): 'AMD_COMGR_STATUS_ERROR', (AMD_COMGR_STATUS_ERROR_INVALID_ARGUMENT:=2): 'AMD_COMGR_STATUS_ERROR_INVALID_ARGUMENT', (AMD_COMGR_STATUS_ERROR_OUT_OF_RESOURCES:=3): 'AMD_COMGR_STATUS_ERROR_OUT_OF_RESOURCES'} +amd_comgr_status_t: TypeAlias = ctypes.c_uint32 +amd_comgr_language_s: dict[int, str] = {(AMD_COMGR_LANGUAGE_NONE:=0): 'AMD_COMGR_LANGUAGE_NONE', (AMD_COMGR_LANGUAGE_OPENCL_1_2:=1): 'AMD_COMGR_LANGUAGE_OPENCL_1_2', (AMD_COMGR_LANGUAGE_OPENCL_2_0:=2): 'AMD_COMGR_LANGUAGE_OPENCL_2_0', (AMD_COMGR_LANGUAGE_HIP:=3): 'AMD_COMGR_LANGUAGE_HIP', (AMD_COMGR_LANGUAGE_LLVM_IR:=4): 'AMD_COMGR_LANGUAGE_LLVM_IR', (AMD_COMGR_LANGUAGE_LAST:=4): 'AMD_COMGR_LANGUAGE_LAST'} +amd_comgr_language_t: TypeAlias = ctypes.c_uint32 +@dll.bind(amd_comgr_status_t, amd_comgr_status_t, c.POINTER[c.POINTER[ctypes.c_char]]) +def amd_comgr_status_string(status:amd_comgr_status_t, status_string:c.POINTER[c.POINTER[ctypes.c_char]]) -> amd_comgr_status_t: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(None, c.POINTER[size_t], c.POINTER[size_t]) +def amd_comgr_get_version(major:c.POINTER[size_t], minor:c.POINTER[size_t]) -> None: ... +amd_comgr_data_kind_s: dict[int, str] = {(AMD_COMGR_DATA_KIND_UNDEF:=0): 'AMD_COMGR_DATA_KIND_UNDEF', (AMD_COMGR_DATA_KIND_SOURCE:=1): 'AMD_COMGR_DATA_KIND_SOURCE', (AMD_COMGR_DATA_KIND_INCLUDE:=2): 'AMD_COMGR_DATA_KIND_INCLUDE', (AMD_COMGR_DATA_KIND_PRECOMPILED_HEADER:=3): 'AMD_COMGR_DATA_KIND_PRECOMPILED_HEADER', (AMD_COMGR_DATA_KIND_DIAGNOSTIC:=4): 'AMD_COMGR_DATA_KIND_DIAGNOSTIC', (AMD_COMGR_DATA_KIND_LOG:=5): 'AMD_COMGR_DATA_KIND_LOG', (AMD_COMGR_DATA_KIND_BC:=6): 'AMD_COMGR_DATA_KIND_BC', (AMD_COMGR_DATA_KIND_RELOCATABLE:=7): 'AMD_COMGR_DATA_KIND_RELOCATABLE', (AMD_COMGR_DATA_KIND_EXECUTABLE:=8): 'AMD_COMGR_DATA_KIND_EXECUTABLE', (AMD_COMGR_DATA_KIND_BYTES:=9): 'AMD_COMGR_DATA_KIND_BYTES', (AMD_COMGR_DATA_KIND_FATBIN:=16): 'AMD_COMGR_DATA_KIND_FATBIN', (AMD_COMGR_DATA_KIND_AR:=17): 'AMD_COMGR_DATA_KIND_AR', (AMD_COMGR_DATA_KIND_BC_BUNDLE:=18): 'AMD_COMGR_DATA_KIND_BC_BUNDLE', (AMD_COMGR_DATA_KIND_AR_BUNDLE:=19): 'AMD_COMGR_DATA_KIND_AR_BUNDLE', (AMD_COMGR_DATA_KIND_OBJ_BUNDLE:=20): 'AMD_COMGR_DATA_KIND_OBJ_BUNDLE', (AMD_COMGR_DATA_KIND_SPIRV:=21): 'AMD_COMGR_DATA_KIND_SPIRV', (AMD_COMGR_DATA_KIND_LAST:=21): 'AMD_COMGR_DATA_KIND_LAST'} +amd_comgr_data_kind_t: TypeAlias = ctypes.c_uint32 +@c.record +class amd_comgr_data_s(c.Struct): + SIZE = 8 + handle: int +uint64_t: TypeAlias = ctypes.c_uint64 +amd_comgr_data_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_data_t: TypeAlias = amd_comgr_data_s +@c.record +class amd_comgr_data_set_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_data_set_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_data_set_t: TypeAlias = amd_comgr_data_set_s +@c.record +class amd_comgr_action_info_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_action_info_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_action_info_t: TypeAlias = amd_comgr_action_info_s +@c.record +class amd_comgr_metadata_node_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_metadata_node_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_metadata_node_t: TypeAlias = amd_comgr_metadata_node_s +@c.record +class amd_comgr_symbol_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_symbol_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_symbol_t: TypeAlias = amd_comgr_symbol_s +@c.record +class amd_comgr_disassembly_info_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_disassembly_info_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_disassembly_info_t: TypeAlias = amd_comgr_disassembly_info_s +@c.record +class amd_comgr_symbolizer_info_s(c.Struct): + SIZE = 8 + handle: int +amd_comgr_symbolizer_info_s.register_fields([('handle', uint64_t, 0)]) +amd_comgr_symbolizer_info_t: TypeAlias = amd_comgr_symbolizer_info_s +@dll.bind(amd_comgr_status_t, c.POINTER[size_t]) +def amd_comgr_get_isa_count(count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, size_t, c.POINTER[c.POINTER[ctypes.c_char]]) +def amd_comgr_get_isa_name(index:size_t, isa_name:c.POINTER[c.POINTER[ctypes.c_char]]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, c.POINTER[ctypes.c_char], c.POINTER[amd_comgr_metadata_node_t]) +def amd_comgr_get_isa_metadata(isa_name:c.POINTER[ctypes.c_char], metadata:c.POINTER[amd_comgr_metadata_node_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_kind_t, c.POINTER[amd_comgr_data_t]) +def amd_comgr_create_data(kind:amd_comgr_data_kind_t, data:c.POINTER[amd_comgr_data_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t) +def amd_comgr_release_data(data:amd_comgr_data_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[amd_comgr_data_kind_t]) +def amd_comgr_get_data_kind(data:amd_comgr_data_t, kind:c.POINTER[amd_comgr_data_kind_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, size_t, c.POINTER[ctypes.c_char]) +def amd_comgr_set_data(data:amd_comgr_data_t, size:size_t, bytes:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, ctypes.c_int32, uint64_t, uint64_t) +def amd_comgr_set_data_from_file_slice(data:amd_comgr_data_t, file_descriptor:int, offset:uint64_t, size:uint64_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[ctypes.c_char]) +def amd_comgr_set_data_name(data:amd_comgr_data_t, name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_data(data:amd_comgr_data_t, size:c.POINTER[size_t], bytes:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_data_name(data:amd_comgr_data_t, size:c.POINTER[size_t], name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_data_isa_name(data:amd_comgr_data_t, size:c.POINTER[size_t], isa_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]], c.POINTER[amd_comgr_symbolizer_info_t]) +def amd_comgr_create_symbolizer_info(code_object:amd_comgr_data_t, print_symbol_callback:c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]], symbolizer_info:c.POINTER[amd_comgr_symbolizer_info_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_symbolizer_info_t) +def amd_comgr_destroy_symbolizer_info(symbolizer_info:amd_comgr_symbolizer_info_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_symbolizer_info_t, uint64_t, ctypes.c_bool, ctypes.c_void_p) +def amd_comgr_symbolize(symbolizer_info:amd_comgr_symbolizer_info_t, address:uint64_t, is_code:bool, user_data:ctypes.c_void_p) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[amd_comgr_metadata_node_t]) +def amd_comgr_get_data_metadata(data:amd_comgr_data_t, metadata:c.POINTER[amd_comgr_metadata_node_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t) +def amd_comgr_destroy_metadata(metadata:amd_comgr_metadata_node_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, c.POINTER[amd_comgr_data_set_t]) +def amd_comgr_create_data_set(data_set:c.POINTER[amd_comgr_data_set_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t) +def amd_comgr_destroy_data_set(data_set:amd_comgr_data_set_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t, amd_comgr_data_t) +def amd_comgr_data_set_add(data_set:amd_comgr_data_set_t, data:amd_comgr_data_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t, amd_comgr_data_kind_t) +def amd_comgr_data_set_remove(data_set:amd_comgr_data_set_t, data_kind:amd_comgr_data_kind_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t, amd_comgr_data_kind_t, c.POINTER[size_t]) +def amd_comgr_action_data_count(data_set:amd_comgr_data_set_t, data_kind:amd_comgr_data_kind_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_set_t, amd_comgr_data_kind_t, size_t, c.POINTER[amd_comgr_data_t]) +def amd_comgr_action_data_get_data(data_set:amd_comgr_data_set_t, data_kind:amd_comgr_data_kind_t, index:size_t, data:c.POINTER[amd_comgr_data_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, c.POINTER[amd_comgr_action_info_t]) +def amd_comgr_create_action_info(action_info:c.POINTER[amd_comgr_action_info_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t) +def amd_comgr_destroy_action_info(action_info:amd_comgr_action_info_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_set_isa_name(action_info:amd_comgr_action_info_t, isa_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_isa_name(action_info:amd_comgr_action_info_t, size:c.POINTER[size_t], isa_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, amd_comgr_language_t) +def amd_comgr_action_info_set_language(action_info:amd_comgr_action_info_t, language:amd_comgr_language_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[amd_comgr_language_t]) +def amd_comgr_action_info_get_language(action_info:amd_comgr_action_info_t, language:c.POINTER[amd_comgr_language_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.Array[c.POINTER[ctypes.c_char], Literal[0]], size_t) +def amd_comgr_action_info_set_option_list(action_info:amd_comgr_action_info_t, options:c.Array[c.POINTER[ctypes.c_char], Literal[0]], count:size_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t]) +def amd_comgr_action_info_get_option_list_count(action_info:amd_comgr_action_info_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, size_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_option_list_item(action_info:amd_comgr_action_info_t, index:size_t, size:c.POINTER[size_t], option:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.Array[c.POINTER[ctypes.c_char], Literal[0]], size_t) +def amd_comgr_action_info_set_bundle_entry_ids(action_info:amd_comgr_action_info_t, bundle_entry_ids:c.Array[c.POINTER[ctypes.c_char], Literal[0]], count:size_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t]) +def amd_comgr_action_info_get_bundle_entry_id_count(action_info:amd_comgr_action_info_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, size_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_bundle_entry_id(action_info:amd_comgr_action_info_t, index:size_t, size:c.POINTER[size_t], bundle_entry_id:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, ctypes.c_bool) +def amd_comgr_action_info_set_vfs(action_info:amd_comgr_action_info_t, should_use_vfs:bool) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, ctypes.c_bool) +def amd_comgr_action_info_set_device_lib_linking(action_info:amd_comgr_action_info_t, should_link_device_libs:bool) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_set_working_directory_path(action_info:amd_comgr_action_info_t, path:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_action_info_get_working_directory_path(action_info:amd_comgr_action_info_t, size:c.POINTER[size_t], path:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, ctypes.c_bool) +def amd_comgr_action_info_set_logging(action_info:amd_comgr_action_info_t, logging:bool) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_action_info_t, c.POINTER[ctypes.c_bool]) +def amd_comgr_action_info_get_logging(action_info:amd_comgr_action_info_t, logging:c.POINTER[ctypes.c_bool]) -> amd_comgr_status_t: ... +amd_comgr_action_kind_s: dict[int, str] = {(AMD_COMGR_ACTION_SOURCE_TO_PREPROCESSOR:=0): 'AMD_COMGR_ACTION_SOURCE_TO_PREPROCESSOR', (AMD_COMGR_ACTION_ADD_PRECOMPILED_HEADERS:=1): 'AMD_COMGR_ACTION_ADD_PRECOMPILED_HEADERS', (AMD_COMGR_ACTION_COMPILE_SOURCE_TO_BC:=2): 'AMD_COMGR_ACTION_COMPILE_SOURCE_TO_BC', (AMD_COMGR_ACTION_LINK_BC_TO_BC:=3): 'AMD_COMGR_ACTION_LINK_BC_TO_BC', (AMD_COMGR_ACTION_CODEGEN_BC_TO_RELOCATABLE:=4): 'AMD_COMGR_ACTION_CODEGEN_BC_TO_RELOCATABLE', (AMD_COMGR_ACTION_CODEGEN_BC_TO_ASSEMBLY:=5): 'AMD_COMGR_ACTION_CODEGEN_BC_TO_ASSEMBLY', (AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_RELOCATABLE:=6): 'AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_RELOCATABLE', (AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_EXECUTABLE:=7): 'AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_EXECUTABLE', (AMD_COMGR_ACTION_ASSEMBLE_SOURCE_TO_RELOCATABLE:=8): 'AMD_COMGR_ACTION_ASSEMBLE_SOURCE_TO_RELOCATABLE', (AMD_COMGR_ACTION_DISASSEMBLE_RELOCATABLE_TO_SOURCE:=9): 'AMD_COMGR_ACTION_DISASSEMBLE_RELOCATABLE_TO_SOURCE', (AMD_COMGR_ACTION_DISASSEMBLE_EXECUTABLE_TO_SOURCE:=10): 'AMD_COMGR_ACTION_DISASSEMBLE_EXECUTABLE_TO_SOURCE', (AMD_COMGR_ACTION_DISASSEMBLE_BYTES_TO_SOURCE:=11): 'AMD_COMGR_ACTION_DISASSEMBLE_BYTES_TO_SOURCE', (AMD_COMGR_ACTION_COMPILE_SOURCE_WITH_DEVICE_LIBS_TO_BC:=12): 'AMD_COMGR_ACTION_COMPILE_SOURCE_WITH_DEVICE_LIBS_TO_BC', (AMD_COMGR_ACTION_COMPILE_SOURCE_TO_RELOCATABLE:=13): 'AMD_COMGR_ACTION_COMPILE_SOURCE_TO_RELOCATABLE', (AMD_COMGR_ACTION_COMPILE_SOURCE_TO_EXECUTABLE:=14): 'AMD_COMGR_ACTION_COMPILE_SOURCE_TO_EXECUTABLE', (AMD_COMGR_ACTION_UNBUNDLE:=15): 'AMD_COMGR_ACTION_UNBUNDLE', (AMD_COMGR_ACTION_COMPILE_SPIRV_TO_RELOCATABLE:=16): 'AMD_COMGR_ACTION_COMPILE_SPIRV_TO_RELOCATABLE', (AMD_COMGR_ACTION_TRANSLATE_SPIRV_TO_BC:=19): 'AMD_COMGR_ACTION_TRANSLATE_SPIRV_TO_BC', (AMD_COMGR_ACTION_LAST:=19): 'AMD_COMGR_ACTION_LAST'} +amd_comgr_action_kind_t: TypeAlias = ctypes.c_uint32 +@dll.bind(amd_comgr_status_t, amd_comgr_action_kind_t, amd_comgr_action_info_t, amd_comgr_data_set_t, amd_comgr_data_set_t) +def amd_comgr_do_action(kind:amd_comgr_action_kind_t, info:amd_comgr_action_info_t, input:amd_comgr_data_set_t, result:amd_comgr_data_set_t) -> amd_comgr_status_t: ... +amd_comgr_metadata_kind_s: dict[int, str] = {(AMD_COMGR_METADATA_KIND_NULL:=0): 'AMD_COMGR_METADATA_KIND_NULL', (AMD_COMGR_METADATA_KIND_STRING:=1): 'AMD_COMGR_METADATA_KIND_STRING', (AMD_COMGR_METADATA_KIND_MAP:=2): 'AMD_COMGR_METADATA_KIND_MAP', (AMD_COMGR_METADATA_KIND_LIST:=3): 'AMD_COMGR_METADATA_KIND_LIST', (AMD_COMGR_METADATA_KIND_LAST:=3): 'AMD_COMGR_METADATA_KIND_LAST'} +amd_comgr_metadata_kind_t: TypeAlias = ctypes.c_uint32 +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[amd_comgr_metadata_kind_t]) +def amd_comgr_get_metadata_kind(metadata:amd_comgr_metadata_node_t, kind:c.POINTER[amd_comgr_metadata_kind_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_metadata_string(metadata:amd_comgr_metadata_node_t, size:c.POINTER[size_t], string:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[size_t]) +def amd_comgr_get_metadata_map_size(metadata:amd_comgr_metadata_node_t, size:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.CFUNCTYPE[amd_comgr_status_t, [amd_comgr_metadata_node_t, amd_comgr_metadata_node_t, ctypes.c_void_p]], ctypes.c_void_p) +def amd_comgr_iterate_map_metadata(metadata:amd_comgr_metadata_node_t, callback:c.CFUNCTYPE[amd_comgr_status_t, [amd_comgr_metadata_node_t, amd_comgr_metadata_node_t, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[ctypes.c_char], c.POINTER[amd_comgr_metadata_node_t]) +def amd_comgr_metadata_lookup(metadata:amd_comgr_metadata_node_t, key:c.POINTER[ctypes.c_char], value:c.POINTER[amd_comgr_metadata_node_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, c.POINTER[size_t]) +def amd_comgr_get_metadata_list_size(metadata:amd_comgr_metadata_node_t, size:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_metadata_node_t, size_t, c.POINTER[amd_comgr_metadata_node_t]) +def amd_comgr_index_list_metadata(metadata:amd_comgr_metadata_node_t, index:size_t, value:c.POINTER[amd_comgr_metadata_node_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.CFUNCTYPE[amd_comgr_status_t, [amd_comgr_symbol_t, ctypes.c_void_p]], ctypes.c_void_p) +def amd_comgr_iterate_symbols(data:amd_comgr_data_t, callback:c.CFUNCTYPE[amd_comgr_status_t, [amd_comgr_symbol_t, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[ctypes.c_char], c.POINTER[amd_comgr_symbol_t]) +def amd_comgr_symbol_lookup(data:amd_comgr_data_t, name:c.POINTER[ctypes.c_char], symbol:c.POINTER[amd_comgr_symbol_t]) -> amd_comgr_status_t: ... +amd_comgr_symbol_type_s: dict[int, str] = {(AMD_COMGR_SYMBOL_TYPE_UNKNOWN:=-1): 'AMD_COMGR_SYMBOL_TYPE_UNKNOWN', (AMD_COMGR_SYMBOL_TYPE_NOTYPE:=0): 'AMD_COMGR_SYMBOL_TYPE_NOTYPE', (AMD_COMGR_SYMBOL_TYPE_OBJECT:=1): 'AMD_COMGR_SYMBOL_TYPE_OBJECT', (AMD_COMGR_SYMBOL_TYPE_FUNC:=2): 'AMD_COMGR_SYMBOL_TYPE_FUNC', (AMD_COMGR_SYMBOL_TYPE_SECTION:=3): 'AMD_COMGR_SYMBOL_TYPE_SECTION', (AMD_COMGR_SYMBOL_TYPE_FILE:=4): 'AMD_COMGR_SYMBOL_TYPE_FILE', (AMD_COMGR_SYMBOL_TYPE_COMMON:=5): 'AMD_COMGR_SYMBOL_TYPE_COMMON', (AMD_COMGR_SYMBOL_TYPE_AMDGPU_HSA_KERNEL:=10): 'AMD_COMGR_SYMBOL_TYPE_AMDGPU_HSA_KERNEL'} +amd_comgr_symbol_type_t: TypeAlias = ctypes.c_int32 +amd_comgr_symbol_info_s: dict[int, str] = {(AMD_COMGR_SYMBOL_INFO_NAME_LENGTH:=0): 'AMD_COMGR_SYMBOL_INFO_NAME_LENGTH', (AMD_COMGR_SYMBOL_INFO_NAME:=1): 'AMD_COMGR_SYMBOL_INFO_NAME', (AMD_COMGR_SYMBOL_INFO_TYPE:=2): 'AMD_COMGR_SYMBOL_INFO_TYPE', (AMD_COMGR_SYMBOL_INFO_SIZE:=3): 'AMD_COMGR_SYMBOL_INFO_SIZE', (AMD_COMGR_SYMBOL_INFO_IS_UNDEFINED:=4): 'AMD_COMGR_SYMBOL_INFO_IS_UNDEFINED', (AMD_COMGR_SYMBOL_INFO_VALUE:=5): 'AMD_COMGR_SYMBOL_INFO_VALUE', (AMD_COMGR_SYMBOL_INFO_LAST:=5): 'AMD_COMGR_SYMBOL_INFO_LAST'} +amd_comgr_symbol_info_t: TypeAlias = ctypes.c_uint32 +@dll.bind(amd_comgr_status_t, amd_comgr_symbol_t, amd_comgr_symbol_info_t, ctypes.c_void_p) +def amd_comgr_symbol_get_info(symbol:amd_comgr_symbol_t, attribute:amd_comgr_symbol_info_t, value:ctypes.c_void_p) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, c.POINTER[ctypes.c_char], c.CFUNCTYPE[uint64_t, [uint64_t, c.POINTER[ctypes.c_char], uint64_t, ctypes.c_void_p]], c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]], c.CFUNCTYPE[None, [uint64_t, ctypes.c_void_p]], c.POINTER[amd_comgr_disassembly_info_t]) +def amd_comgr_create_disassembly_info(isa_name:c.POINTER[ctypes.c_char], read_memory_callback:c.CFUNCTYPE[uint64_t, [uint64_t, c.POINTER[ctypes.c_char], uint64_t, ctypes.c_void_p]], print_instruction_callback:c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]], print_address_annotation_callback:c.CFUNCTYPE[None, [uint64_t, ctypes.c_void_p]], disassembly_info:c.POINTER[amd_comgr_disassembly_info_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_disassembly_info_t) +def amd_comgr_destroy_disassembly_info(disassembly_info:amd_comgr_disassembly_info_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_disassembly_info_t, uint64_t, ctypes.c_void_p, c.POINTER[uint64_t]) +def amd_comgr_disassemble_instruction(disassembly_info:amd_comgr_disassembly_info_t, address:uint64_t, user_data:ctypes.c_void_p, size:c.POINTER[uint64_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[amd_comgr_data_t]) +def amd_comgr_demangle_symbol_name(mangled_symbol_name:amd_comgr_data_t, demangled_symbol_name:c.POINTER[amd_comgr_data_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t]) +def amd_comgr_populate_mangled_names(data:amd_comgr_data_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, size_t, c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def amd_comgr_get_mangled_name(data:amd_comgr_data_t, index:size_t, size:c.POINTER[size_t], mangled_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t]) +def amd_comgr_populate_name_expression_map(data:amd_comgr_data_t, count:c.POINTER[size_t]) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[size_t], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def amd_comgr_map_name_expression_to_symbol_name(data:amd_comgr_data_t, size:c.POINTER[size_t], name_expression:c.POINTER[ctypes.c_char], symbol_name:c.POINTER[ctypes.c_char]) -> amd_comgr_status_t: ... +@c.record +class code_object_info_s(c.Struct): + SIZE = 24 + isa: c.POINTER[ctypes.c_char] + size: int + offset: int +code_object_info_s.register_fields([('isa', c.POINTER[ctypes.c_char], 0), ('size', size_t, 8), ('offset', uint64_t, 16)]) +amd_comgr_code_object_info_t: TypeAlias = code_object_info_s +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, c.POINTER[amd_comgr_code_object_info_t], size_t) +def amd_comgr_lookup_code_object(data:amd_comgr_data_t, info_list:c.POINTER[amd_comgr_code_object_info_t], info_list_size:size_t) -> amd_comgr_status_t: ... +@dll.bind(amd_comgr_status_t, amd_comgr_data_t, uint64_t, c.POINTER[uint64_t], c.POINTER[uint64_t], c.POINTER[ctypes.c_bool]) +def amd_comgr_map_elf_virtual_address_to_code_object_offset(data:amd_comgr_data_t, elf_virtual_address:uint64_t, code_object_offset:c.POINTER[uint64_t], slice_size:c.POINTER[uint64_t], nobits:c.POINTER[ctypes.c_bool]) -> amd_comgr_status_t: ... +AMD_COMGR_DEPRECATED = lambda msg: __attribute__((deprecated(msg))) # type: ignore +AMD_COMGR_INTERFACE_VERSION_MAJOR = 3 +AMD_COMGR_INTERFACE_VERSION_MINOR = 0 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/corefoundation.py b/artifacts/package_runtime/tinygrad/runtime/autogen/corefoundation.py new file mode 100644 index 000000000..04b3b2e45 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/corefoundation.py @@ -0,0 +1,313 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +dll = c.DLL('corefoundation', 'CoreFoundation') +CFStringEncoding: TypeAlias = ctypes.c_uint32 +CFStringBuiltInEncodings: TypeAlias = ctypes.c_uint32 +_anonenum0: dict[int, str] = {(kCFStringEncodingMacRoman:=0): 'kCFStringEncodingMacRoman', (kCFStringEncodingWindowsLatin1:=1280): 'kCFStringEncodingWindowsLatin1', (kCFStringEncodingISOLatin1:=513): 'kCFStringEncodingISOLatin1', (kCFStringEncodingNextStepLatin:=2817): 'kCFStringEncodingNextStepLatin', (kCFStringEncodingASCII:=1536): 'kCFStringEncodingASCII', (kCFStringEncodingUnicode:=256): 'kCFStringEncodingUnicode', (kCFStringEncodingUTF8:=134217984): 'kCFStringEncodingUTF8', (kCFStringEncodingNonLossyASCII:=3071): 'kCFStringEncodingNonLossyASCII', (kCFStringEncodingUTF16:=256): 'kCFStringEncodingUTF16', (kCFStringEncodingUTF16BE:=268435712): 'kCFStringEncodingUTF16BE', (kCFStringEncodingUTF16LE:=335544576): 'kCFStringEncodingUTF16LE', (kCFStringEncodingUTF32:=201326848): 'kCFStringEncodingUTF32', (kCFStringEncodingUTF32BE:=402653440): 'kCFStringEncodingUTF32BE', (kCFStringEncodingUTF32LE:=469762304): 'kCFStringEncodingUTF32LE'} +CFTypeID: TypeAlias = ctypes.c_uint64 +@dll.bind(CFTypeID) +def CFStringGetTypeID() -> CFTypeID: ... +class struct___CFString(c.Struct): pass +CFStringRef: TypeAlias = c.POINTER[struct___CFString] +class struct___CFAllocator(c.Struct): pass +CFAllocatorRef: TypeAlias = c.POINTER[struct___CFAllocator] +ConstStr255Param: TypeAlias = c.POINTER[ctypes.c_ubyte] +@dll.bind(CFStringRef, CFAllocatorRef, ConstStr255Param, CFStringEncoding) +def CFStringCreateWithPascalString(alloc:CFAllocatorRef, pStr:ConstStr255Param, encoding:CFStringEncoding) -> CFStringRef: ... +@dll.bind(CFStringRef, CFAllocatorRef, c.POINTER[ctypes.c_char], CFStringEncoding) +def CFStringCreateWithCString(alloc:CFAllocatorRef, cStr:c.POINTER[ctypes.c_char], encoding:CFStringEncoding) -> CFStringRef: ... +UInt8: TypeAlias = ctypes.c_ubyte +CFIndex: TypeAlias = ctypes.c_int64 +Boolean: TypeAlias = ctypes.c_ubyte +@dll.bind(CFStringRef, CFAllocatorRef, c.POINTER[UInt8], CFIndex, CFStringEncoding, Boolean) +def CFStringCreateWithBytes(alloc:CFAllocatorRef, bytes:c.POINTER[UInt8], numBytes:CFIndex, encoding:CFStringEncoding, isExternalRepresentation:Boolean) -> CFStringRef: ... +UniChar: TypeAlias = ctypes.c_uint16 +@dll.bind(CFStringRef, CFAllocatorRef, c.POINTER[UniChar], CFIndex) +def CFStringCreateWithCharacters(alloc:CFAllocatorRef, chars:c.POINTER[UniChar], numChars:CFIndex) -> CFStringRef: ... +@dll.bind(CFStringRef, CFAllocatorRef, ConstStr255Param, CFStringEncoding, CFAllocatorRef) +def CFStringCreateWithPascalStringNoCopy(alloc:CFAllocatorRef, pStr:ConstStr255Param, encoding:CFStringEncoding, contentsDeallocator:CFAllocatorRef) -> CFStringRef: ... +@dll.bind(CFStringRef, CFAllocatorRef, c.POINTER[ctypes.c_char], CFStringEncoding, CFAllocatorRef) +def CFStringCreateWithCStringNoCopy(alloc:CFAllocatorRef, cStr:c.POINTER[ctypes.c_char], encoding:CFStringEncoding, contentsDeallocator:CFAllocatorRef) -> CFStringRef: ... +@dll.bind(CFStringRef, CFAllocatorRef, c.POINTER[UInt8], CFIndex, CFStringEncoding, Boolean, CFAllocatorRef) +def CFStringCreateWithBytesNoCopy(alloc:CFAllocatorRef, bytes:c.POINTER[UInt8], numBytes:CFIndex, encoding:CFStringEncoding, isExternalRepresentation:Boolean, contentsDeallocator:CFAllocatorRef) -> CFStringRef: ... +@dll.bind(CFStringRef, CFAllocatorRef, c.POINTER[UniChar], CFIndex, CFAllocatorRef) +def CFStringCreateWithCharactersNoCopy(alloc:CFAllocatorRef, chars:c.POINTER[UniChar], numChars:CFIndex, contentsDeallocator:CFAllocatorRef) -> CFStringRef: ... +@c.record +class CFRange(c.Struct): + SIZE = 16 + location: int + length: int +CFRange.register_fields([('location', CFIndex, 0), ('length', CFIndex, 8)]) +@dll.bind(CFStringRef, CFAllocatorRef, CFStringRef, CFRange) +def CFStringCreateWithSubstring(alloc:CFAllocatorRef, str:CFStringRef, range:CFRange) -> CFStringRef: ... +@dll.bind(CFStringRef, CFAllocatorRef, CFStringRef) +def CFStringCreateCopy(alloc:CFAllocatorRef, theString:CFStringRef) -> CFStringRef: ... +class struct___CFDictionary(c.Struct): pass +CFDictionaryRef: TypeAlias = c.POINTER[struct___CFDictionary] +@dll.bind(CFStringRef, CFAllocatorRef, CFDictionaryRef, CFStringRef) +def CFStringCreateWithFormat(alloc:CFAllocatorRef, formatOptions:CFDictionaryRef, format:CFStringRef) -> CFStringRef: ... +@dll.bind(CFStringRef, CFAllocatorRef, CFDictionaryRef, CFStringRef, ctypes.c_int32) +def CFStringCreateWithFormatAndArguments(alloc:CFAllocatorRef, formatOptions:CFDictionaryRef, format:CFStringRef, arguments:int) -> CFStringRef: ... +class struct___CFError(c.Struct): pass +CFErrorRef: TypeAlias = c.POINTER[struct___CFError] +@dll.bind(CFStringRef, CFAllocatorRef, CFDictionaryRef, CFStringRef, CFStringRef, c.POINTER[CFErrorRef]) +def CFStringCreateStringWithValidatedFormat(alloc:CFAllocatorRef, formatOptions:CFDictionaryRef, validFormatSpecifiers:CFStringRef, format:CFStringRef, errorPtr:c.POINTER[CFErrorRef]) -> CFStringRef: ... +@dll.bind(CFStringRef, CFAllocatorRef, CFDictionaryRef, CFStringRef, CFStringRef, ctypes.c_int32, c.POINTER[CFErrorRef]) +def CFStringCreateStringWithValidatedFormatAndArguments(alloc:CFAllocatorRef, formatOptions:CFDictionaryRef, validFormatSpecifiers:CFStringRef, format:CFStringRef, arguments:int, errorPtr:c.POINTER[CFErrorRef]) -> CFStringRef: ... +CFMutableStringRef: TypeAlias = c.POINTER[struct___CFString] +@dll.bind(CFMutableStringRef, CFAllocatorRef, CFIndex) +def CFStringCreateMutable(alloc:CFAllocatorRef, maxLength:CFIndex) -> CFMutableStringRef: ... +@dll.bind(CFMutableStringRef, CFAllocatorRef, CFIndex, CFStringRef) +def CFStringCreateMutableCopy(alloc:CFAllocatorRef, maxLength:CFIndex, theString:CFStringRef) -> CFMutableStringRef: ... +@dll.bind(CFMutableStringRef, CFAllocatorRef, c.POINTER[UniChar], CFIndex, CFIndex, CFAllocatorRef) +def CFStringCreateMutableWithExternalCharactersNoCopy(alloc:CFAllocatorRef, chars:c.POINTER[UniChar], numChars:CFIndex, capacity:CFIndex, externalCharactersAllocator:CFAllocatorRef) -> CFMutableStringRef: ... +@dll.bind(CFIndex, CFStringRef) +def CFStringGetLength(theString:CFStringRef) -> CFIndex: ... +@dll.bind(UniChar, CFStringRef, CFIndex) +def CFStringGetCharacterAtIndex(theString:CFStringRef, idx:CFIndex) -> UniChar: ... +@dll.bind(None, CFStringRef, CFRange, c.POINTER[UniChar]) +def CFStringGetCharacters(theString:CFStringRef, range:CFRange, buffer:c.POINTER[UniChar]) -> None: ... +StringPtr: TypeAlias = c.POINTER[ctypes.c_ubyte] +@dll.bind(Boolean, CFStringRef, StringPtr, CFIndex, CFStringEncoding) +def CFStringGetPascalString(theString:CFStringRef, buffer:StringPtr, bufferSize:CFIndex, encoding:CFStringEncoding) -> Boolean: ... +@dll.bind(Boolean, CFStringRef, c.POINTER[ctypes.c_char], CFIndex, CFStringEncoding) +def CFStringGetCString(theString:CFStringRef, buffer:c.POINTER[ctypes.c_char], bufferSize:CFIndex, encoding:CFStringEncoding) -> Boolean: ... +ConstStringPtr: TypeAlias = c.POINTER[ctypes.c_ubyte] +@dll.bind(ConstStringPtr, CFStringRef, CFStringEncoding) +def CFStringGetPascalStringPtr(theString:CFStringRef, encoding:CFStringEncoding) -> ConstStringPtr: ... +@dll.bind(c.POINTER[ctypes.c_char], CFStringRef, CFStringEncoding) +def CFStringGetCStringPtr(theString:CFStringRef, encoding:CFStringEncoding) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[UniChar], CFStringRef) +def CFStringGetCharactersPtr(theString:CFStringRef) -> c.POINTER[UniChar]: ... +@dll.bind(CFIndex, CFStringRef, CFRange, CFStringEncoding, UInt8, Boolean, c.POINTER[UInt8], CFIndex, c.POINTER[CFIndex]) +def CFStringGetBytes(theString:CFStringRef, range:CFRange, encoding:CFStringEncoding, lossByte:UInt8, isExternalRepresentation:Boolean, buffer:c.POINTER[UInt8], maxBufLen:CFIndex, usedBufLen:c.POINTER[CFIndex]) -> CFIndex: ... +class struct___CFData(c.Struct): pass +CFDataRef: TypeAlias = c.POINTER[struct___CFData] +@dll.bind(CFStringRef, CFAllocatorRef, CFDataRef, CFStringEncoding) +def CFStringCreateFromExternalRepresentation(alloc:CFAllocatorRef, data:CFDataRef, encoding:CFStringEncoding) -> CFStringRef: ... +@dll.bind(CFDataRef, CFAllocatorRef, CFStringRef, CFStringEncoding, UInt8) +def CFStringCreateExternalRepresentation(alloc:CFAllocatorRef, theString:CFStringRef, encoding:CFStringEncoding, lossByte:UInt8) -> CFDataRef: ... +@dll.bind(CFStringEncoding, CFStringRef) +def CFStringGetSmallestEncoding(theString:CFStringRef) -> CFStringEncoding: ... +@dll.bind(CFStringEncoding, CFStringRef) +def CFStringGetFastestEncoding(theString:CFStringRef) -> CFStringEncoding: ... +@dll.bind(CFStringEncoding) +def CFStringGetSystemEncoding() -> CFStringEncoding: ... +@dll.bind(CFIndex, CFIndex, CFStringEncoding) +def CFStringGetMaximumSizeForEncoding(length:CFIndex, encoding:CFStringEncoding) -> CFIndex: ... +@dll.bind(Boolean, CFStringRef, c.POINTER[ctypes.c_char], CFIndex) +def CFStringGetFileSystemRepresentation(string:CFStringRef, buffer:c.POINTER[ctypes.c_char], maxBufLen:CFIndex) -> Boolean: ... +@dll.bind(CFIndex, CFStringRef) +def CFStringGetMaximumSizeOfFileSystemRepresentation(string:CFStringRef) -> CFIndex: ... +@dll.bind(CFStringRef, CFAllocatorRef, c.POINTER[ctypes.c_char]) +def CFStringCreateWithFileSystemRepresentation(alloc:CFAllocatorRef, buffer:c.POINTER[ctypes.c_char]) -> CFStringRef: ... +CFStringCompareFlags: TypeAlias = ctypes.c_uint64 +_anonenum1: dict[int, str] = {(kCFCompareCaseInsensitive:=1): 'kCFCompareCaseInsensitive', (kCFCompareBackwards:=4): 'kCFCompareBackwards', (kCFCompareAnchored:=8): 'kCFCompareAnchored', (kCFCompareNonliteral:=16): 'kCFCompareNonliteral', (kCFCompareLocalized:=32): 'kCFCompareLocalized', (kCFCompareNumerically:=64): 'kCFCompareNumerically', (kCFCompareDiacriticInsensitive:=128): 'kCFCompareDiacriticInsensitive', (kCFCompareWidthInsensitive:=256): 'kCFCompareWidthInsensitive', (kCFCompareForcedOrdering:=512): 'kCFCompareForcedOrdering'} +CFComparisonResult: TypeAlias = ctypes.c_int64 +class struct___CFLocale(c.Struct): pass +CFLocaleRef: TypeAlias = c.POINTER[struct___CFLocale] +@dll.bind(CFComparisonResult, CFStringRef, CFStringRef, CFRange, CFStringCompareFlags, CFLocaleRef) +def CFStringCompareWithOptionsAndLocale(theString1:CFStringRef, theString2:CFStringRef, rangeToCompare:CFRange, compareOptions:CFStringCompareFlags, locale:CFLocaleRef) -> CFComparisonResult: ... +@dll.bind(CFComparisonResult, CFStringRef, CFStringRef, CFRange, CFStringCompareFlags) +def CFStringCompareWithOptions(theString1:CFStringRef, theString2:CFStringRef, rangeToCompare:CFRange, compareOptions:CFStringCompareFlags) -> CFComparisonResult: ... +@dll.bind(CFComparisonResult, CFStringRef, CFStringRef, CFStringCompareFlags) +def CFStringCompare(theString1:CFStringRef, theString2:CFStringRef, compareOptions:CFStringCompareFlags) -> CFComparisonResult: ... +@dll.bind(Boolean, CFStringRef, CFStringRef, CFRange, CFStringCompareFlags, CFLocaleRef, c.POINTER[CFRange]) +def CFStringFindWithOptionsAndLocale(theString:CFStringRef, stringToFind:CFStringRef, rangeToSearch:CFRange, searchOptions:CFStringCompareFlags, locale:CFLocaleRef, result:c.POINTER[CFRange]) -> Boolean: ... +@dll.bind(Boolean, CFStringRef, CFStringRef, CFRange, CFStringCompareFlags, c.POINTER[CFRange]) +def CFStringFindWithOptions(theString:CFStringRef, stringToFind:CFStringRef, rangeToSearch:CFRange, searchOptions:CFStringCompareFlags, result:c.POINTER[CFRange]) -> Boolean: ... +class struct___CFArray(c.Struct): pass +CFArrayRef: TypeAlias = c.POINTER[struct___CFArray] +@dll.bind(CFArrayRef, CFAllocatorRef, CFStringRef, CFStringRef, CFRange, CFStringCompareFlags) +def CFStringCreateArrayWithFindResults(alloc:CFAllocatorRef, theString:CFStringRef, stringToFind:CFStringRef, rangeToSearch:CFRange, compareOptions:CFStringCompareFlags) -> CFArrayRef: ... +@dll.bind(CFRange, CFStringRef, CFStringRef, CFStringCompareFlags) +def CFStringFind(theString:CFStringRef, stringToFind:CFStringRef, compareOptions:CFStringCompareFlags) -> CFRange: ... +@dll.bind(Boolean, CFStringRef, CFStringRef) +def CFStringHasPrefix(theString:CFStringRef, prefix:CFStringRef) -> Boolean: ... +@dll.bind(Boolean, CFStringRef, CFStringRef) +def CFStringHasSuffix(theString:CFStringRef, suffix:CFStringRef) -> Boolean: ... +@dll.bind(CFRange, CFStringRef, CFIndex) +def CFStringGetRangeOfComposedCharactersAtIndex(theString:CFStringRef, theIndex:CFIndex) -> CFRange: ... +class struct___CFCharacterSet(c.Struct): pass +CFCharacterSetRef: TypeAlias = c.POINTER[struct___CFCharacterSet] +@dll.bind(Boolean, CFStringRef, CFCharacterSetRef, CFRange, CFStringCompareFlags, c.POINTER[CFRange]) +def CFStringFindCharacterFromSet(theString:CFStringRef, theSet:CFCharacterSetRef, rangeToSearch:CFRange, searchOptions:CFStringCompareFlags, result:c.POINTER[CFRange]) -> Boolean: ... +@dll.bind(None, CFStringRef, CFRange, c.POINTER[CFIndex], c.POINTER[CFIndex], c.POINTER[CFIndex]) +def CFStringGetLineBounds(theString:CFStringRef, range:CFRange, lineBeginIndex:c.POINTER[CFIndex], lineEndIndex:c.POINTER[CFIndex], contentsEndIndex:c.POINTER[CFIndex]) -> None: ... +@dll.bind(None, CFStringRef, CFRange, c.POINTER[CFIndex], c.POINTER[CFIndex], c.POINTER[CFIndex]) +def CFStringGetParagraphBounds(string:CFStringRef, range:CFRange, parBeginIndex:c.POINTER[CFIndex], parEndIndex:c.POINTER[CFIndex], contentsEndIndex:c.POINTER[CFIndex]) -> None: ... +CFOptionFlags: TypeAlias = ctypes.c_uint64 +UTF32Char: TypeAlias = ctypes.c_uint32 +@dll.bind(CFIndex, CFStringRef, CFIndex, CFRange, CFOptionFlags, CFLocaleRef, c.POINTER[UTF32Char]) +def CFStringGetHyphenationLocationBeforeIndex(string:CFStringRef, location:CFIndex, limitRange:CFRange, options:CFOptionFlags, locale:CFLocaleRef, character:c.POINTER[UTF32Char]) -> CFIndex: ... +@dll.bind(Boolean, CFLocaleRef) +def CFStringIsHyphenationAvailableForLocale(locale:CFLocaleRef) -> Boolean: ... +@dll.bind(CFStringRef, CFAllocatorRef, CFArrayRef, CFStringRef) +def CFStringCreateByCombiningStrings(alloc:CFAllocatorRef, theArray:CFArrayRef, separatorString:CFStringRef) -> CFStringRef: ... +@dll.bind(CFArrayRef, CFAllocatorRef, CFStringRef, CFStringRef) +def CFStringCreateArrayBySeparatingStrings(alloc:CFAllocatorRef, theString:CFStringRef, separatorString:CFStringRef) -> CFArrayRef: ... +SInt32: TypeAlias = ctypes.c_int32 +@dll.bind(SInt32, CFStringRef) +def CFStringGetIntValue(str:CFStringRef) -> SInt32: ... +@dll.bind(ctypes.c_double, CFStringRef) +def CFStringGetDoubleValue(str:CFStringRef) -> float: ... +@dll.bind(None, CFMutableStringRef, CFStringRef) +def CFStringAppend(theString:CFMutableStringRef, appendedString:CFStringRef) -> None: ... +@dll.bind(None, CFMutableStringRef, c.POINTER[UniChar], CFIndex) +def CFStringAppendCharacters(theString:CFMutableStringRef, chars:c.POINTER[UniChar], numChars:CFIndex) -> None: ... +@dll.bind(None, CFMutableStringRef, ConstStr255Param, CFStringEncoding) +def CFStringAppendPascalString(theString:CFMutableStringRef, pStr:ConstStr255Param, encoding:CFStringEncoding) -> None: ... +@dll.bind(None, CFMutableStringRef, c.POINTER[ctypes.c_char], CFStringEncoding) +def CFStringAppendCString(theString:CFMutableStringRef, cStr:c.POINTER[ctypes.c_char], encoding:CFStringEncoding) -> None: ... +@dll.bind(None, CFMutableStringRef, CFDictionaryRef, CFStringRef) +def CFStringAppendFormat(theString:CFMutableStringRef, formatOptions:CFDictionaryRef, format:CFStringRef) -> None: ... +@dll.bind(None, CFMutableStringRef, CFDictionaryRef, CFStringRef, ctypes.c_int32) +def CFStringAppendFormatAndArguments(theString:CFMutableStringRef, formatOptions:CFDictionaryRef, format:CFStringRef, arguments:int) -> None: ... +@dll.bind(None, CFMutableStringRef, CFIndex, CFStringRef) +def CFStringInsert(str:CFMutableStringRef, idx:CFIndex, insertedStr:CFStringRef) -> None: ... +@dll.bind(None, CFMutableStringRef, CFRange) +def CFStringDelete(theString:CFMutableStringRef, range:CFRange) -> None: ... +@dll.bind(None, CFMutableStringRef, CFRange, CFStringRef) +def CFStringReplace(theString:CFMutableStringRef, range:CFRange, replacement:CFStringRef) -> None: ... +@dll.bind(None, CFMutableStringRef, CFStringRef) +def CFStringReplaceAll(theString:CFMutableStringRef, replacement:CFStringRef) -> None: ... +@dll.bind(CFIndex, CFMutableStringRef, CFStringRef, CFStringRef, CFRange, CFStringCompareFlags) +def CFStringFindAndReplace(theString:CFMutableStringRef, stringToFind:CFStringRef, replacementString:CFStringRef, rangeToSearch:CFRange, compareOptions:CFStringCompareFlags) -> CFIndex: ... +@dll.bind(None, CFMutableStringRef, c.POINTER[UniChar], CFIndex, CFIndex) +def CFStringSetExternalCharactersNoCopy(theString:CFMutableStringRef, chars:c.POINTER[UniChar], length:CFIndex, capacity:CFIndex) -> None: ... +@dll.bind(None, CFMutableStringRef, CFStringRef, CFIndex, CFIndex) +def CFStringPad(theString:CFMutableStringRef, padString:CFStringRef, length:CFIndex, indexIntoPad:CFIndex) -> None: ... +@dll.bind(None, CFMutableStringRef, CFStringRef) +def CFStringTrim(theString:CFMutableStringRef, trimString:CFStringRef) -> None: ... +@dll.bind(None, CFMutableStringRef) +def CFStringTrimWhitespace(theString:CFMutableStringRef) -> None: ... +@dll.bind(None, CFMutableStringRef, CFLocaleRef) +def CFStringLowercase(theString:CFMutableStringRef, locale:CFLocaleRef) -> None: ... +@dll.bind(None, CFMutableStringRef, CFLocaleRef) +def CFStringUppercase(theString:CFMutableStringRef, locale:CFLocaleRef) -> None: ... +@dll.bind(None, CFMutableStringRef, CFLocaleRef) +def CFStringCapitalize(theString:CFMutableStringRef, locale:CFLocaleRef) -> None: ... +CFStringNormalizationForm: TypeAlias = ctypes.c_int64 +_anonenum2: dict[int, str] = {(kCFStringNormalizationFormD:=0): 'kCFStringNormalizationFormD', (kCFStringNormalizationFormKD:=1): 'kCFStringNormalizationFormKD', (kCFStringNormalizationFormC:=2): 'kCFStringNormalizationFormC', (kCFStringNormalizationFormKC:=3): 'kCFStringNormalizationFormKC'} +@dll.bind(None, CFMutableStringRef, CFStringNormalizationForm) +def CFStringNormalize(theString:CFMutableStringRef, theForm:CFStringNormalizationForm) -> None: ... +@dll.bind(None, CFMutableStringRef, CFStringCompareFlags, CFLocaleRef) +def CFStringFold(theString:CFMutableStringRef, theFlags:CFStringCompareFlags, theLocale:CFLocaleRef) -> None: ... +@dll.bind(Boolean, CFMutableStringRef, c.POINTER[CFRange], CFStringRef, Boolean) +def CFStringTransform(string:CFMutableStringRef, range:c.POINTER[CFRange], transform:CFStringRef, reverse:Boolean) -> Boolean: ... +try: kCFStringTransformStripCombiningMarks = CFStringRef.in_dll(dll, 'kCFStringTransformStripCombiningMarks') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformToLatin = CFStringRef.in_dll(dll, 'kCFStringTransformToLatin') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformFullwidthHalfwidth = CFStringRef.in_dll(dll, 'kCFStringTransformFullwidthHalfwidth') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformLatinKatakana = CFStringRef.in_dll(dll, 'kCFStringTransformLatinKatakana') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformLatinHiragana = CFStringRef.in_dll(dll, 'kCFStringTransformLatinHiragana') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformHiraganaKatakana = CFStringRef.in_dll(dll, 'kCFStringTransformHiraganaKatakana') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformMandarinLatin = CFStringRef.in_dll(dll, 'kCFStringTransformMandarinLatin') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformLatinHangul = CFStringRef.in_dll(dll, 'kCFStringTransformLatinHangul') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformLatinArabic = CFStringRef.in_dll(dll, 'kCFStringTransformLatinArabic') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformLatinHebrew = CFStringRef.in_dll(dll, 'kCFStringTransformLatinHebrew') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformLatinThai = CFStringRef.in_dll(dll, 'kCFStringTransformLatinThai') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformLatinCyrillic = CFStringRef.in_dll(dll, 'kCFStringTransformLatinCyrillic') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformLatinGreek = CFStringRef.in_dll(dll, 'kCFStringTransformLatinGreek') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformToXMLHex = CFStringRef.in_dll(dll, 'kCFStringTransformToXMLHex') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformToUnicodeName = CFStringRef.in_dll(dll, 'kCFStringTransformToUnicodeName') # type: ignore +except (ValueError,AttributeError): pass +try: kCFStringTransformStripDiacritics = CFStringRef.in_dll(dll, 'kCFStringTransformStripDiacritics') # type: ignore +except (ValueError,AttributeError): pass +@dll.bind(Boolean, CFStringEncoding) +def CFStringIsEncodingAvailable(encoding:CFStringEncoding) -> Boolean: ... +@dll.bind(c.POINTER[CFStringEncoding]) +def CFStringGetListOfAvailableEncodings() -> c.POINTER[CFStringEncoding]: ... +@dll.bind(CFStringRef, CFStringEncoding) +def CFStringGetNameOfEncoding(encoding:CFStringEncoding) -> CFStringRef: ... +@dll.bind(ctypes.c_uint64, CFStringEncoding) +def CFStringConvertEncodingToNSStringEncoding(encoding:CFStringEncoding) -> int: ... +@dll.bind(CFStringEncoding, ctypes.c_uint64) +def CFStringConvertNSStringEncodingToEncoding(encoding:int) -> CFStringEncoding: ... +UInt32: TypeAlias = ctypes.c_uint32 +@dll.bind(UInt32, CFStringEncoding) +def CFStringConvertEncodingToWindowsCodepage(encoding:CFStringEncoding) -> UInt32: ... +@dll.bind(CFStringEncoding, UInt32) +def CFStringConvertWindowsCodepageToEncoding(codepage:UInt32) -> CFStringEncoding: ... +@dll.bind(CFStringEncoding, CFStringRef) +def CFStringConvertIANACharSetNameToEncoding(theString:CFStringRef) -> CFStringEncoding: ... +@dll.bind(CFStringRef, CFStringEncoding) +def CFStringConvertEncodingToIANACharSetName(encoding:CFStringEncoding) -> CFStringRef: ... +@dll.bind(CFStringEncoding, CFStringEncoding) +def CFStringGetMostCompatibleMacStringEncoding(encoding:CFStringEncoding) -> CFStringEncoding: ... +@c.record +class CFStringInlineBuffer(c.Struct): + SIZE = 184 + buffer: c.Array[ctypes.c_uint16, Literal[64]] + theString: c.POINTER[struct___CFString] + directUniCharBuffer: c.POINTER[ctypes.c_uint16] + directCStringBuffer: c.POINTER[ctypes.c_char] + rangeToBuffer: CFRange + bufferedRangeStart: int + bufferedRangeEnd: int +CFStringInlineBuffer.register_fields([('buffer', c.Array[UniChar, Literal[64]], 0), ('theString', CFStringRef, 128), ('directUniCharBuffer', c.POINTER[UniChar], 136), ('directCStringBuffer', c.POINTER[ctypes.c_char], 144), ('rangeToBuffer', CFRange, 152), ('bufferedRangeStart', CFIndex, 168), ('bufferedRangeEnd', CFIndex, 176)]) +CFTypeRef: TypeAlias = ctypes.c_void_p +@dll.bind(None, CFTypeRef) +def CFShow(obj:CFTypeRef) -> None: ... +@dll.bind(None, CFStringRef) +def CFShowStr(str:CFStringRef) -> None: ... +@dll.bind(CFStringRef, c.POINTER[ctypes.c_char]) +def __CFStringMakeConstantString(cStr:c.POINTER[ctypes.c_char]) -> CFStringRef: ... +CFMutableDataRef: TypeAlias = c.POINTER[struct___CFData] +@dll.bind(CFTypeID) +def CFDataGetTypeID() -> CFTypeID: ... +@dll.bind(CFDataRef, CFAllocatorRef, c.POINTER[UInt8], CFIndex) +def CFDataCreate(allocator:CFAllocatorRef, bytes:c.POINTER[UInt8], length:CFIndex) -> CFDataRef: ... +@dll.bind(CFDataRef, CFAllocatorRef, c.POINTER[UInt8], CFIndex, CFAllocatorRef) +def CFDataCreateWithBytesNoCopy(allocator:CFAllocatorRef, bytes:c.POINTER[UInt8], length:CFIndex, bytesDeallocator:CFAllocatorRef) -> CFDataRef: ... +@dll.bind(CFDataRef, CFAllocatorRef, CFDataRef) +def CFDataCreateCopy(allocator:CFAllocatorRef, theData:CFDataRef) -> CFDataRef: ... +@dll.bind(CFMutableDataRef, CFAllocatorRef, CFIndex) +def CFDataCreateMutable(allocator:CFAllocatorRef, capacity:CFIndex) -> CFMutableDataRef: ... +@dll.bind(CFMutableDataRef, CFAllocatorRef, CFIndex, CFDataRef) +def CFDataCreateMutableCopy(allocator:CFAllocatorRef, capacity:CFIndex, theData:CFDataRef) -> CFMutableDataRef: ... +@dll.bind(CFIndex, CFDataRef) +def CFDataGetLength(theData:CFDataRef) -> CFIndex: ... +@dll.bind(c.POINTER[UInt8], CFDataRef) +def CFDataGetBytePtr(theData:CFDataRef) -> c.POINTER[UInt8]: ... +@dll.bind(c.POINTER[UInt8], CFMutableDataRef) +def CFDataGetMutableBytePtr(theData:CFMutableDataRef) -> c.POINTER[UInt8]: ... +@dll.bind(None, CFDataRef, CFRange, c.POINTER[UInt8]) +def CFDataGetBytes(theData:CFDataRef, range:CFRange, buffer:c.POINTER[UInt8]) -> None: ... +@dll.bind(None, CFMutableDataRef, CFIndex) +def CFDataSetLength(theData:CFMutableDataRef, length:CFIndex) -> None: ... +@dll.bind(None, CFMutableDataRef, CFIndex) +def CFDataIncreaseLength(theData:CFMutableDataRef, extraLength:CFIndex) -> None: ... +@dll.bind(None, CFMutableDataRef, c.POINTER[UInt8], CFIndex) +def CFDataAppendBytes(theData:CFMutableDataRef, bytes:c.POINTER[UInt8], length:CFIndex) -> None: ... +@dll.bind(None, CFMutableDataRef, CFRange, c.POINTER[UInt8], CFIndex) +def CFDataReplaceBytes(theData:CFMutableDataRef, range:CFRange, newBytes:c.POINTER[UInt8], newLength:CFIndex) -> None: ... +@dll.bind(None, CFMutableDataRef, CFRange) +def CFDataDeleteBytes(theData:CFMutableDataRef, range:CFRange) -> None: ... +CFDataSearchFlags: TypeAlias = ctypes.c_uint64 +_anonenum3: dict[int, str] = {(kCFDataSearchBackwards:=1): 'kCFDataSearchBackwards', (kCFDataSearchAnchored:=2): 'kCFDataSearchAnchored'} +@dll.bind(CFRange, CFDataRef, CFDataRef, CFRange, CFDataSearchFlags) +def CFDataFind(theData:CFDataRef, dataToFind:CFDataRef, searchRange:CFRange, compareOptions:CFDataSearchFlags) -> CFRange: ... +__COREFOUNDATION_CFSTRING__ = 1 +kCFStringEncodingInvalidId = (0xffffffff) +CF_FORMAT_FUNCTION = lambda F,A: __attribute__((format(CFString, F, A))) # type: ignore +CF_FORMAT_ARGUMENT = lambda A: __attribute__((format_arg(A))) # type: ignore +__kCFStringInlineBufferLength = 64 +__COREFOUNDATION_CFDATA__ = 1 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/cuda.py b/artifacts/package_runtime/tinygrad/runtime/autogen/cuda.py new file mode 100644 index 000000000..c6c805369 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/cuda.py @@ -0,0 +1,2155 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +from tinygrad.helpers import WIN +dll = c.DLL('cuda', 'nvcuda' if WIN else 'cuda') +cuuint32_t: TypeAlias = ctypes.c_uint32 +cuuint64_t: TypeAlias = ctypes.c_uint64 +CUdeviceptr_v2: TypeAlias = ctypes.c_uint64 +CUdeviceptr: TypeAlias = ctypes.c_uint64 +CUdevice_v1: TypeAlias = ctypes.c_int32 +CUdevice: TypeAlias = ctypes.c_int32 +class struct_CUctx_st(c.Struct): pass +CUcontext: TypeAlias = c.POINTER[struct_CUctx_st] +class struct_CUmod_st(c.Struct): pass +CUmodule: TypeAlias = c.POINTER[struct_CUmod_st] +class struct_CUfunc_st(c.Struct): pass +CUfunction: TypeAlias = c.POINTER[struct_CUfunc_st] +class struct_CUlib_st(c.Struct): pass +CUlibrary: TypeAlias = c.POINTER[struct_CUlib_st] +class struct_CUkern_st(c.Struct): pass +CUkernel: TypeAlias = c.POINTER[struct_CUkern_st] +class struct_CUarray_st(c.Struct): pass +CUarray: TypeAlias = c.POINTER[struct_CUarray_st] +class struct_CUmipmappedArray_st(c.Struct): pass +CUmipmappedArray: TypeAlias = c.POINTER[struct_CUmipmappedArray_st] +class struct_CUtexref_st(c.Struct): pass +CUtexref: TypeAlias = c.POINTER[struct_CUtexref_st] +class struct_CUsurfref_st(c.Struct): pass +CUsurfref: TypeAlias = c.POINTER[struct_CUsurfref_st] +class struct_CUevent_st(c.Struct): pass +CUevent: TypeAlias = c.POINTER[struct_CUevent_st] +class struct_CUstream_st(c.Struct): pass +CUstream: TypeAlias = c.POINTER[struct_CUstream_st] +class struct_CUgraphicsResource_st(c.Struct): pass +CUgraphicsResource: TypeAlias = c.POINTER[struct_CUgraphicsResource_st] +CUtexObject_v1: TypeAlias = ctypes.c_uint64 +CUtexObject: TypeAlias = ctypes.c_uint64 +CUsurfObject_v1: TypeAlias = ctypes.c_uint64 +CUsurfObject: TypeAlias = ctypes.c_uint64 +class struct_CUextMemory_st(c.Struct): pass +CUexternalMemory: TypeAlias = c.POINTER[struct_CUextMemory_st] +class struct_CUextSemaphore_st(c.Struct): pass +CUexternalSemaphore: TypeAlias = c.POINTER[struct_CUextSemaphore_st] +class struct_CUgraph_st(c.Struct): pass +CUgraph: TypeAlias = c.POINTER[struct_CUgraph_st] +class struct_CUgraphNode_st(c.Struct): pass +CUgraphNode: TypeAlias = c.POINTER[struct_CUgraphNode_st] +class struct_CUgraphExec_st(c.Struct): pass +CUgraphExec: TypeAlias = c.POINTER[struct_CUgraphExec_st] +class struct_CUmemPoolHandle_st(c.Struct): pass +CUmemoryPool: TypeAlias = c.POINTER[struct_CUmemPoolHandle_st] +class struct_CUuserObject_st(c.Struct): pass +CUuserObject: TypeAlias = c.POINTER[struct_CUuserObject_st] +@c.record +class struct_CUuuid_st(c.Struct): + SIZE = 16 + bytes: c.Array[ctypes.c_char, Literal[16]] +struct_CUuuid_st.register_fields([('bytes', c.Array[ctypes.c_char, Literal[16]], 0)]) +CUuuid: TypeAlias = struct_CUuuid_st +@c.record +class struct_CUipcEventHandle_st(c.Struct): + SIZE = 64 + reserved: c.Array[ctypes.c_char, Literal[64]] +struct_CUipcEventHandle_st.register_fields([('reserved', c.Array[ctypes.c_char, Literal[64]], 0)]) +CUipcEventHandle_v1: TypeAlias = struct_CUipcEventHandle_st +CUipcEventHandle: TypeAlias = struct_CUipcEventHandle_st +@c.record +class struct_CUipcMemHandle_st(c.Struct): + SIZE = 64 + reserved: c.Array[ctypes.c_char, Literal[64]] +struct_CUipcMemHandle_st.register_fields([('reserved', c.Array[ctypes.c_char, Literal[64]], 0)]) +CUipcMemHandle_v1: TypeAlias = struct_CUipcMemHandle_st +CUipcMemHandle: TypeAlias = struct_CUipcMemHandle_st +enum_CUipcMem_flags_enum: dict[int, str] = {(CU_IPC_MEM_LAZY_ENABLE_PEER_ACCESS:=1): 'CU_IPC_MEM_LAZY_ENABLE_PEER_ACCESS'} +CUipcMem_flags: TypeAlias = ctypes.c_uint32 +enum_CUmemAttach_flags_enum: dict[int, str] = {(CU_MEM_ATTACH_GLOBAL:=1): 'CU_MEM_ATTACH_GLOBAL', (CU_MEM_ATTACH_HOST:=2): 'CU_MEM_ATTACH_HOST', (CU_MEM_ATTACH_SINGLE:=4): 'CU_MEM_ATTACH_SINGLE'} +CUmemAttach_flags: TypeAlias = ctypes.c_uint32 +enum_CUctx_flags_enum: dict[int, str] = {(CU_CTX_SCHED_AUTO:=0): 'CU_CTX_SCHED_AUTO', (CU_CTX_SCHED_SPIN:=1): 'CU_CTX_SCHED_SPIN', (CU_CTX_SCHED_YIELD:=2): 'CU_CTX_SCHED_YIELD', (CU_CTX_SCHED_BLOCKING_SYNC:=4): 'CU_CTX_SCHED_BLOCKING_SYNC', (CU_CTX_BLOCKING_SYNC:=4): 'CU_CTX_BLOCKING_SYNC', (CU_CTX_SCHED_MASK:=7): 'CU_CTX_SCHED_MASK', (CU_CTX_MAP_HOST:=8): 'CU_CTX_MAP_HOST', (CU_CTX_LMEM_RESIZE_TO_MAX:=16): 'CU_CTX_LMEM_RESIZE_TO_MAX', (CU_CTX_FLAGS_MASK:=31): 'CU_CTX_FLAGS_MASK'} +CUctx_flags: TypeAlias = ctypes.c_uint32 +enum_CUevent_sched_flags_enum: dict[int, str] = {(CU_EVENT_SCHED_AUTO:=0): 'CU_EVENT_SCHED_AUTO', (CU_EVENT_SCHED_SPIN:=1): 'CU_EVENT_SCHED_SPIN', (CU_EVENT_SCHED_YIELD:=2): 'CU_EVENT_SCHED_YIELD', (CU_EVENT_SCHED_BLOCKING_SYNC:=4): 'CU_EVENT_SCHED_BLOCKING_SYNC'} +CUevent_sched_flags: TypeAlias = ctypes.c_uint32 +enum_cl_event_flags_enum: dict[int, str] = {(NVCL_EVENT_SCHED_AUTO:=0): 'NVCL_EVENT_SCHED_AUTO', (NVCL_EVENT_SCHED_SPIN:=1): 'NVCL_EVENT_SCHED_SPIN', (NVCL_EVENT_SCHED_YIELD:=2): 'NVCL_EVENT_SCHED_YIELD', (NVCL_EVENT_SCHED_BLOCKING_SYNC:=4): 'NVCL_EVENT_SCHED_BLOCKING_SYNC'} +cl_event_flags: TypeAlias = ctypes.c_uint32 +enum_cl_context_flags_enum: dict[int, str] = {(NVCL_CTX_SCHED_AUTO:=0): 'NVCL_CTX_SCHED_AUTO', (NVCL_CTX_SCHED_SPIN:=1): 'NVCL_CTX_SCHED_SPIN', (NVCL_CTX_SCHED_YIELD:=2): 'NVCL_CTX_SCHED_YIELD', (NVCL_CTX_SCHED_BLOCKING_SYNC:=4): 'NVCL_CTX_SCHED_BLOCKING_SYNC'} +cl_context_flags: TypeAlias = ctypes.c_uint32 +enum_CUstream_flags_enum: dict[int, str] = {(CU_STREAM_DEFAULT:=0): 'CU_STREAM_DEFAULT', (CU_STREAM_NON_BLOCKING:=1): 'CU_STREAM_NON_BLOCKING'} +CUstream_flags: TypeAlias = ctypes.c_uint32 +enum_CUevent_flags_enum: dict[int, str] = {(CU_EVENT_DEFAULT:=0): 'CU_EVENT_DEFAULT', (CU_EVENT_BLOCKING_SYNC:=1): 'CU_EVENT_BLOCKING_SYNC', (CU_EVENT_DISABLE_TIMING:=2): 'CU_EVENT_DISABLE_TIMING', (CU_EVENT_INTERPROCESS:=4): 'CU_EVENT_INTERPROCESS'} +CUevent_flags: TypeAlias = ctypes.c_uint32 +enum_CUevent_record_flags_enum: dict[int, str] = {(CU_EVENT_RECORD_DEFAULT:=0): 'CU_EVENT_RECORD_DEFAULT', (CU_EVENT_RECORD_EXTERNAL:=1): 'CU_EVENT_RECORD_EXTERNAL'} +CUevent_record_flags: TypeAlias = ctypes.c_uint32 +enum_CUevent_wait_flags_enum: dict[int, str] = {(CU_EVENT_WAIT_DEFAULT:=0): 'CU_EVENT_WAIT_DEFAULT', (CU_EVENT_WAIT_EXTERNAL:=1): 'CU_EVENT_WAIT_EXTERNAL'} +CUevent_wait_flags: TypeAlias = ctypes.c_uint32 +enum_CUstreamWaitValue_flags_enum: dict[int, str] = {(CU_STREAM_WAIT_VALUE_GEQ:=0): 'CU_STREAM_WAIT_VALUE_GEQ', (CU_STREAM_WAIT_VALUE_EQ:=1): 'CU_STREAM_WAIT_VALUE_EQ', (CU_STREAM_WAIT_VALUE_AND:=2): 'CU_STREAM_WAIT_VALUE_AND', (CU_STREAM_WAIT_VALUE_NOR:=3): 'CU_STREAM_WAIT_VALUE_NOR', (CU_STREAM_WAIT_VALUE_FLUSH:=1073741824): 'CU_STREAM_WAIT_VALUE_FLUSH'} +CUstreamWaitValue_flags: TypeAlias = ctypes.c_uint32 +enum_CUstreamWriteValue_flags_enum: dict[int, str] = {(CU_STREAM_WRITE_VALUE_DEFAULT:=0): 'CU_STREAM_WRITE_VALUE_DEFAULT', (CU_STREAM_WRITE_VALUE_NO_MEMORY_BARRIER:=1): 'CU_STREAM_WRITE_VALUE_NO_MEMORY_BARRIER'} +CUstreamWriteValue_flags: TypeAlias = ctypes.c_uint32 +enum_CUstreamBatchMemOpType_enum: dict[int, str] = {(CU_STREAM_MEM_OP_WAIT_VALUE_32:=1): 'CU_STREAM_MEM_OP_WAIT_VALUE_32', (CU_STREAM_MEM_OP_WRITE_VALUE_32:=2): 'CU_STREAM_MEM_OP_WRITE_VALUE_32', (CU_STREAM_MEM_OP_WAIT_VALUE_64:=4): 'CU_STREAM_MEM_OP_WAIT_VALUE_64', (CU_STREAM_MEM_OP_WRITE_VALUE_64:=5): 'CU_STREAM_MEM_OP_WRITE_VALUE_64', (CU_STREAM_MEM_OP_BARRIER:=6): 'CU_STREAM_MEM_OP_BARRIER', (CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES:=3): 'CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES'} +CUstreamBatchMemOpType: TypeAlias = ctypes.c_uint32 +enum_CUstreamMemoryBarrier_flags_enum: dict[int, str] = {(CU_STREAM_MEMORY_BARRIER_TYPE_SYS:=0): 'CU_STREAM_MEMORY_BARRIER_TYPE_SYS', (CU_STREAM_MEMORY_BARRIER_TYPE_GPU:=1): 'CU_STREAM_MEMORY_BARRIER_TYPE_GPU'} +CUstreamMemoryBarrier_flags: TypeAlias = ctypes.c_uint32 +@c.record +class union_CUstreamBatchMemOpParams_union(c.Struct): + SIZE = 48 + operation: int + waitValue: struct_CUstreamMemOpWaitValueParams_st + writeValue: struct_CUstreamMemOpWriteValueParams_st + flushRemoteWrites: struct_CUstreamMemOpFlushRemoteWritesParams_st + memoryBarrier: struct_CUstreamMemOpMemoryBarrierParams_st + pad: c.Array[ctypes.c_uint64, Literal[6]] +@c.record +class struct_CUstreamMemOpWaitValueParams_st(c.Struct): + SIZE = 40 + operation: int + address: int + value: int + value64: int + flags: int + alias: int +struct_CUstreamMemOpWaitValueParams_st.register_fields([('operation', CUstreamBatchMemOpType, 0), ('address', CUdeviceptr, 8), ('value', cuuint32_t, 16), ('value64', cuuint64_t, 16), ('flags', ctypes.c_uint32, 24), ('alias', CUdeviceptr, 32)]) +@c.record +class struct_CUstreamMemOpWriteValueParams_st(c.Struct): + SIZE = 40 + operation: int + address: int + value: int + value64: int + flags: int + alias: int +struct_CUstreamMemOpWriteValueParams_st.register_fields([('operation', CUstreamBatchMemOpType, 0), ('address', CUdeviceptr, 8), ('value', cuuint32_t, 16), ('value64', cuuint64_t, 16), ('flags', ctypes.c_uint32, 24), ('alias', CUdeviceptr, 32)]) +@c.record +class struct_CUstreamMemOpFlushRemoteWritesParams_st(c.Struct): + SIZE = 8 + operation: int + flags: int +struct_CUstreamMemOpFlushRemoteWritesParams_st.register_fields([('operation', CUstreamBatchMemOpType, 0), ('flags', ctypes.c_uint32, 4)]) +@c.record +class struct_CUstreamMemOpMemoryBarrierParams_st(c.Struct): + SIZE = 8 + operation: int + flags: int +struct_CUstreamMemOpMemoryBarrierParams_st.register_fields([('operation', CUstreamBatchMemOpType, 0), ('flags', ctypes.c_uint32, 4)]) +union_CUstreamBatchMemOpParams_union.register_fields([('operation', CUstreamBatchMemOpType, 0), ('waitValue', struct_CUstreamMemOpWaitValueParams_st, 0), ('writeValue', struct_CUstreamMemOpWriteValueParams_st, 0), ('flushRemoteWrites', struct_CUstreamMemOpFlushRemoteWritesParams_st, 0), ('memoryBarrier', struct_CUstreamMemOpMemoryBarrierParams_st, 0), ('pad', c.Array[cuuint64_t, Literal[6]], 0)]) +CUstreamBatchMemOpParams_v1: TypeAlias = union_CUstreamBatchMemOpParams_union +CUstreamBatchMemOpParams: TypeAlias = union_CUstreamBatchMemOpParams_union +@c.record +class struct_CUDA_BATCH_MEM_OP_NODE_PARAMS_st(c.Struct): + SIZE = 32 + ctx: c.POINTER[struct_CUctx_st] + count: int + paramArray: c.POINTER[union_CUstreamBatchMemOpParams_union] + flags: int +struct_CUDA_BATCH_MEM_OP_NODE_PARAMS_st.register_fields([('ctx', CUcontext, 0), ('count', ctypes.c_uint32, 8), ('paramArray', c.POINTER[CUstreamBatchMemOpParams], 16), ('flags', ctypes.c_uint32, 24)]) +CUDA_BATCH_MEM_OP_NODE_PARAMS: TypeAlias = struct_CUDA_BATCH_MEM_OP_NODE_PARAMS_st +enum_CUoccupancy_flags_enum: dict[int, str] = {(CU_OCCUPANCY_DEFAULT:=0): 'CU_OCCUPANCY_DEFAULT', (CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE:=1): 'CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE'} +CUoccupancy_flags: TypeAlias = ctypes.c_uint32 +enum_CUstreamUpdateCaptureDependencies_flags_enum: dict[int, str] = {(CU_STREAM_ADD_CAPTURE_DEPENDENCIES:=0): 'CU_STREAM_ADD_CAPTURE_DEPENDENCIES', (CU_STREAM_SET_CAPTURE_DEPENDENCIES:=1): 'CU_STREAM_SET_CAPTURE_DEPENDENCIES'} +CUstreamUpdateCaptureDependencies_flags: TypeAlias = ctypes.c_uint32 +enum_CUarray_format_enum: dict[int, str] = {(CU_AD_FORMAT_UNSIGNED_INT8:=1): 'CU_AD_FORMAT_UNSIGNED_INT8', (CU_AD_FORMAT_UNSIGNED_INT16:=2): 'CU_AD_FORMAT_UNSIGNED_INT16', (CU_AD_FORMAT_UNSIGNED_INT32:=3): 'CU_AD_FORMAT_UNSIGNED_INT32', (CU_AD_FORMAT_SIGNED_INT8:=8): 'CU_AD_FORMAT_SIGNED_INT8', (CU_AD_FORMAT_SIGNED_INT16:=9): 'CU_AD_FORMAT_SIGNED_INT16', (CU_AD_FORMAT_SIGNED_INT32:=10): 'CU_AD_FORMAT_SIGNED_INT32', (CU_AD_FORMAT_HALF:=16): 'CU_AD_FORMAT_HALF', (CU_AD_FORMAT_FLOAT:=32): 'CU_AD_FORMAT_FLOAT', (CU_AD_FORMAT_NV12:=176): 'CU_AD_FORMAT_NV12', (CU_AD_FORMAT_UNORM_INT8X1:=192): 'CU_AD_FORMAT_UNORM_INT8X1', (CU_AD_FORMAT_UNORM_INT8X2:=193): 'CU_AD_FORMAT_UNORM_INT8X2', (CU_AD_FORMAT_UNORM_INT8X4:=194): 'CU_AD_FORMAT_UNORM_INT8X4', (CU_AD_FORMAT_UNORM_INT16X1:=195): 'CU_AD_FORMAT_UNORM_INT16X1', (CU_AD_FORMAT_UNORM_INT16X2:=196): 'CU_AD_FORMAT_UNORM_INT16X2', (CU_AD_FORMAT_UNORM_INT16X4:=197): 'CU_AD_FORMAT_UNORM_INT16X4', (CU_AD_FORMAT_SNORM_INT8X1:=198): 'CU_AD_FORMAT_SNORM_INT8X1', (CU_AD_FORMAT_SNORM_INT8X2:=199): 'CU_AD_FORMAT_SNORM_INT8X2', (CU_AD_FORMAT_SNORM_INT8X4:=200): 'CU_AD_FORMAT_SNORM_INT8X4', (CU_AD_FORMAT_SNORM_INT16X1:=201): 'CU_AD_FORMAT_SNORM_INT16X1', (CU_AD_FORMAT_SNORM_INT16X2:=202): 'CU_AD_FORMAT_SNORM_INT16X2', (CU_AD_FORMAT_SNORM_INT16X4:=203): 'CU_AD_FORMAT_SNORM_INT16X4', (CU_AD_FORMAT_BC1_UNORM:=145): 'CU_AD_FORMAT_BC1_UNORM', (CU_AD_FORMAT_BC1_UNORM_SRGB:=146): 'CU_AD_FORMAT_BC1_UNORM_SRGB', (CU_AD_FORMAT_BC2_UNORM:=147): 'CU_AD_FORMAT_BC2_UNORM', (CU_AD_FORMAT_BC2_UNORM_SRGB:=148): 'CU_AD_FORMAT_BC2_UNORM_SRGB', (CU_AD_FORMAT_BC3_UNORM:=149): 'CU_AD_FORMAT_BC3_UNORM', (CU_AD_FORMAT_BC3_UNORM_SRGB:=150): 'CU_AD_FORMAT_BC3_UNORM_SRGB', (CU_AD_FORMAT_BC4_UNORM:=151): 'CU_AD_FORMAT_BC4_UNORM', (CU_AD_FORMAT_BC4_SNORM:=152): 'CU_AD_FORMAT_BC4_SNORM', (CU_AD_FORMAT_BC5_UNORM:=153): 'CU_AD_FORMAT_BC5_UNORM', (CU_AD_FORMAT_BC5_SNORM:=154): 'CU_AD_FORMAT_BC5_SNORM', (CU_AD_FORMAT_BC6H_UF16:=155): 'CU_AD_FORMAT_BC6H_UF16', (CU_AD_FORMAT_BC6H_SF16:=156): 'CU_AD_FORMAT_BC6H_SF16', (CU_AD_FORMAT_BC7_UNORM:=157): 'CU_AD_FORMAT_BC7_UNORM', (CU_AD_FORMAT_BC7_UNORM_SRGB:=158): 'CU_AD_FORMAT_BC7_UNORM_SRGB'} +CUarray_format: TypeAlias = ctypes.c_uint32 +enum_CUaddress_mode_enum: dict[int, str] = {(CU_TR_ADDRESS_MODE_WRAP:=0): 'CU_TR_ADDRESS_MODE_WRAP', (CU_TR_ADDRESS_MODE_CLAMP:=1): 'CU_TR_ADDRESS_MODE_CLAMP', (CU_TR_ADDRESS_MODE_MIRROR:=2): 'CU_TR_ADDRESS_MODE_MIRROR', (CU_TR_ADDRESS_MODE_BORDER:=3): 'CU_TR_ADDRESS_MODE_BORDER'} +CUaddress_mode: TypeAlias = ctypes.c_uint32 +enum_CUfilter_mode_enum: dict[int, str] = {(CU_TR_FILTER_MODE_POINT:=0): 'CU_TR_FILTER_MODE_POINT', (CU_TR_FILTER_MODE_LINEAR:=1): 'CU_TR_FILTER_MODE_LINEAR'} +CUfilter_mode: TypeAlias = ctypes.c_uint32 +enum_CUdevice_attribute_enum: dict[int, str] = {(CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK:=1): 'CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK', (CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X:=2): 'CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X', (CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y:=3): 'CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y', (CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z:=4): 'CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z', (CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X:=5): 'CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X', (CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y:=6): 'CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y', (CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z:=7): 'CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z', (CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK:=8): 'CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK', (CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK:=8): 'CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK', (CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY:=9): 'CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY', (CU_DEVICE_ATTRIBUTE_WARP_SIZE:=10): 'CU_DEVICE_ATTRIBUTE_WARP_SIZE', (CU_DEVICE_ATTRIBUTE_MAX_PITCH:=11): 'CU_DEVICE_ATTRIBUTE_MAX_PITCH', (CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK:=12): 'CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK', (CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK:=12): 'CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK', (CU_DEVICE_ATTRIBUTE_CLOCK_RATE:=13): 'CU_DEVICE_ATTRIBUTE_CLOCK_RATE', (CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT:=14): 'CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT', (CU_DEVICE_ATTRIBUTE_GPU_OVERLAP:=15): 'CU_DEVICE_ATTRIBUTE_GPU_OVERLAP', (CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT:=16): 'CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT', (CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT:=17): 'CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT', (CU_DEVICE_ATTRIBUTE_INTEGRATED:=18): 'CU_DEVICE_ATTRIBUTE_INTEGRATED', (CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY:=19): 'CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY', (CU_DEVICE_ATTRIBUTE_COMPUTE_MODE:=20): 'CU_DEVICE_ATTRIBUTE_COMPUTE_MODE', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH:=21): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH:=22): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT:=23): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH:=24): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT:=25): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH:=26): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH:=27): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT:=28): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS:=29): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_WIDTH:=27): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_HEIGHT:=28): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES:=29): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES', (CU_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT:=30): 'CU_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT', (CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS:=31): 'CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS', (CU_DEVICE_ATTRIBUTE_ECC_ENABLED:=32): 'CU_DEVICE_ATTRIBUTE_ECC_ENABLED', (CU_DEVICE_ATTRIBUTE_PCI_BUS_ID:=33): 'CU_DEVICE_ATTRIBUTE_PCI_BUS_ID', (CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID:=34): 'CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID', (CU_DEVICE_ATTRIBUTE_TCC_DRIVER:=35): 'CU_DEVICE_ATTRIBUTE_TCC_DRIVER', (CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE:=36): 'CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE', (CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH:=37): 'CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH', (CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE:=38): 'CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE', (CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR:=39): 'CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR', (CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT:=40): 'CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT', (CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING:=41): 'CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH:=42): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS:=43): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS', (CU_DEVICE_ATTRIBUTE_CAN_TEX2D_GATHER:=44): 'CU_DEVICE_ATTRIBUTE_CAN_TEX2D_GATHER', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH:=45): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT:=46): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE:=47): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE:=48): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE:=49): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE', (CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID:=50): 'CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID', (CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT:=51): 'CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH:=52): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH:=53): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS:=54): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH:=55): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH:=56): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT:=57): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH:=58): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT:=59): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH:=60): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH:=61): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS:=62): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH:=63): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT:=64): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS:=65): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH:=66): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH:=67): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS:=68): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH:=69): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH:=70): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT:=71): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH:=72): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH:=73): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT:=74): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT', (CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR:=75): 'CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR', (CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR:=76): 'CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR', (CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH:=77): 'CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH', (CU_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED:=78): 'CU_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED', (CU_DEVICE_ATTRIBUTE_GLOBAL_L1_CACHE_SUPPORTED:=79): 'CU_DEVICE_ATTRIBUTE_GLOBAL_L1_CACHE_SUPPORTED', (CU_DEVICE_ATTRIBUTE_LOCAL_L1_CACHE_SUPPORTED:=80): 'CU_DEVICE_ATTRIBUTE_LOCAL_L1_CACHE_SUPPORTED', (CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR:=81): 'CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR', (CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR:=82): 'CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR', (CU_DEVICE_ATTRIBUTE_MANAGED_MEMORY:=83): 'CU_DEVICE_ATTRIBUTE_MANAGED_MEMORY', (CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD:=84): 'CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD', (CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD_GROUP_ID:=85): 'CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD_GROUP_ID', (CU_DEVICE_ATTRIBUTE_HOST_NATIVE_ATOMIC_SUPPORTED:=86): 'CU_DEVICE_ATTRIBUTE_HOST_NATIVE_ATOMIC_SUPPORTED', (CU_DEVICE_ATTRIBUTE_SINGLE_TO_DOUBLE_PRECISION_PERF_RATIO:=87): 'CU_DEVICE_ATTRIBUTE_SINGLE_TO_DOUBLE_PRECISION_PERF_RATIO', (CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS:=88): 'CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS', (CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS:=89): 'CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS', (CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED:=90): 'CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED', (CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM:=91): 'CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM', (CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1:=92): 'CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1', (CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS_V1:=93): 'CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS_V1', (CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V1:=94): 'CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V1', (CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH:=95): 'CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH', (CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH:=96): 'CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH', (CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN:=97): 'CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN', (CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES:=98): 'CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES', (CU_DEVICE_ATTRIBUTE_HOST_REGISTER_SUPPORTED:=99): 'CU_DEVICE_ATTRIBUTE_HOST_REGISTER_SUPPORTED', (CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES:=100): 'CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES', (CU_DEVICE_ATTRIBUTE_DIRECT_MANAGED_MEM_ACCESS_FROM_HOST:=101): 'CU_DEVICE_ATTRIBUTE_DIRECT_MANAGED_MEM_ACCESS_FROM_HOST', (CU_DEVICE_ATTRIBUTE_VIRTUAL_ADDRESS_MANAGEMENT_SUPPORTED:=102): 'CU_DEVICE_ATTRIBUTE_VIRTUAL_ADDRESS_MANAGEMENT_SUPPORTED', (CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED:=102): 'CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED', (CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR_SUPPORTED:=103): 'CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR_SUPPORTED', (CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_HANDLE_SUPPORTED:=104): 'CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_HANDLE_SUPPORTED', (CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_KMT_HANDLE_SUPPORTED:=105): 'CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_KMT_HANDLE_SUPPORTED', (CU_DEVICE_ATTRIBUTE_MAX_BLOCKS_PER_MULTIPROCESSOR:=106): 'CU_DEVICE_ATTRIBUTE_MAX_BLOCKS_PER_MULTIPROCESSOR', (CU_DEVICE_ATTRIBUTE_GENERIC_COMPRESSION_SUPPORTED:=107): 'CU_DEVICE_ATTRIBUTE_GENERIC_COMPRESSION_SUPPORTED', (CU_DEVICE_ATTRIBUTE_MAX_PERSISTING_L2_CACHE_SIZE:=108): 'CU_DEVICE_ATTRIBUTE_MAX_PERSISTING_L2_CACHE_SIZE', (CU_DEVICE_ATTRIBUTE_MAX_ACCESS_POLICY_WINDOW_SIZE:=109): 'CU_DEVICE_ATTRIBUTE_MAX_ACCESS_POLICY_WINDOW_SIZE', (CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WITH_CUDA_VMM_SUPPORTED:=110): 'CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WITH_CUDA_VMM_SUPPORTED', (CU_DEVICE_ATTRIBUTE_RESERVED_SHARED_MEMORY_PER_BLOCK:=111): 'CU_DEVICE_ATTRIBUTE_RESERVED_SHARED_MEMORY_PER_BLOCK', (CU_DEVICE_ATTRIBUTE_SPARSE_CUDA_ARRAY_SUPPORTED:=112): 'CU_DEVICE_ATTRIBUTE_SPARSE_CUDA_ARRAY_SUPPORTED', (CU_DEVICE_ATTRIBUTE_READ_ONLY_HOST_REGISTER_SUPPORTED:=113): 'CU_DEVICE_ATTRIBUTE_READ_ONLY_HOST_REGISTER_SUPPORTED', (CU_DEVICE_ATTRIBUTE_TIMELINE_SEMAPHORE_INTEROP_SUPPORTED:=114): 'CU_DEVICE_ATTRIBUTE_TIMELINE_SEMAPHORE_INTEROP_SUPPORTED', (CU_DEVICE_ATTRIBUTE_MEMORY_POOLS_SUPPORTED:=115): 'CU_DEVICE_ATTRIBUTE_MEMORY_POOLS_SUPPORTED', (CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_SUPPORTED:=116): 'CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_SUPPORTED', (CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS:=117): 'CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS', (CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING:=118): 'CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING', (CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES:=119): 'CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES', (CU_DEVICE_ATTRIBUTE_CLUSTER_LAUNCH:=120): 'CU_DEVICE_ATTRIBUTE_CLUSTER_LAUNCH', (CU_DEVICE_ATTRIBUTE_DEFERRED_MAPPING_CUDA_ARRAY_SUPPORTED:=121): 'CU_DEVICE_ATTRIBUTE_DEFERRED_MAPPING_CUDA_ARRAY_SUPPORTED', (CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS:=122): 'CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS', (CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR:=123): 'CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR', (CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED:=124): 'CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED', (CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED:=125): 'CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED', (CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT:=126): 'CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT', (CU_DEVICE_ATTRIBUTE_TENSOR_MAP_ACCESS_SUPPORTED:=127): 'CU_DEVICE_ATTRIBUTE_TENSOR_MAP_ACCESS_SUPPORTED', (CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS:=129): 'CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS', (CU_DEVICE_ATTRIBUTE_MAX:=130): 'CU_DEVICE_ATTRIBUTE_MAX'} +CUdevice_attribute: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUdevprop_st(c.Struct): + SIZE = 56 + maxThreadsPerBlock: int + maxThreadsDim: c.Array[ctypes.c_int32, Literal[3]] + maxGridSize: c.Array[ctypes.c_int32, Literal[3]] + sharedMemPerBlock: int + totalConstantMemory: int + SIMDWidth: int + memPitch: int + regsPerBlock: int + clockRate: int + textureAlign: int +struct_CUdevprop_st.register_fields([('maxThreadsPerBlock', ctypes.c_int32, 0), ('maxThreadsDim', c.Array[ctypes.c_int32, Literal[3]], 4), ('maxGridSize', c.Array[ctypes.c_int32, Literal[3]], 16), ('sharedMemPerBlock', ctypes.c_int32, 28), ('totalConstantMemory', ctypes.c_int32, 32), ('SIMDWidth', ctypes.c_int32, 36), ('memPitch', ctypes.c_int32, 40), ('regsPerBlock', ctypes.c_int32, 44), ('clockRate', ctypes.c_int32, 48), ('textureAlign', ctypes.c_int32, 52)]) +CUdevprop_v1: TypeAlias = struct_CUdevprop_st +CUdevprop: TypeAlias = struct_CUdevprop_st +enum_CUpointer_attribute_enum: dict[int, str] = {(CU_POINTER_ATTRIBUTE_CONTEXT:=1): 'CU_POINTER_ATTRIBUTE_CONTEXT', (CU_POINTER_ATTRIBUTE_MEMORY_TYPE:=2): 'CU_POINTER_ATTRIBUTE_MEMORY_TYPE', (CU_POINTER_ATTRIBUTE_DEVICE_POINTER:=3): 'CU_POINTER_ATTRIBUTE_DEVICE_POINTER', (CU_POINTER_ATTRIBUTE_HOST_POINTER:=4): 'CU_POINTER_ATTRIBUTE_HOST_POINTER', (CU_POINTER_ATTRIBUTE_P2P_TOKENS:=5): 'CU_POINTER_ATTRIBUTE_P2P_TOKENS', (CU_POINTER_ATTRIBUTE_SYNC_MEMOPS:=6): 'CU_POINTER_ATTRIBUTE_SYNC_MEMOPS', (CU_POINTER_ATTRIBUTE_BUFFER_ID:=7): 'CU_POINTER_ATTRIBUTE_BUFFER_ID', (CU_POINTER_ATTRIBUTE_IS_MANAGED:=8): 'CU_POINTER_ATTRIBUTE_IS_MANAGED', (CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL:=9): 'CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL', (CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE:=10): 'CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE', (CU_POINTER_ATTRIBUTE_RANGE_START_ADDR:=11): 'CU_POINTER_ATTRIBUTE_RANGE_START_ADDR', (CU_POINTER_ATTRIBUTE_RANGE_SIZE:=12): 'CU_POINTER_ATTRIBUTE_RANGE_SIZE', (CU_POINTER_ATTRIBUTE_MAPPED:=13): 'CU_POINTER_ATTRIBUTE_MAPPED', (CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES:=14): 'CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES', (CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE:=15): 'CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE', (CU_POINTER_ATTRIBUTE_ACCESS_FLAGS:=16): 'CU_POINTER_ATTRIBUTE_ACCESS_FLAGS', (CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE:=17): 'CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE', (CU_POINTER_ATTRIBUTE_MAPPING_SIZE:=18): 'CU_POINTER_ATTRIBUTE_MAPPING_SIZE', (CU_POINTER_ATTRIBUTE_MAPPING_BASE_ADDR:=19): 'CU_POINTER_ATTRIBUTE_MAPPING_BASE_ADDR', (CU_POINTER_ATTRIBUTE_MEMORY_BLOCK_ID:=20): 'CU_POINTER_ATTRIBUTE_MEMORY_BLOCK_ID'} +CUpointer_attribute: TypeAlias = ctypes.c_uint32 +enum_CUfunction_attribute_enum: dict[int, str] = {(CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK:=0): 'CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK', (CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES:=1): 'CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES', (CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES:=2): 'CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES', (CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES:=3): 'CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES', (CU_FUNC_ATTRIBUTE_NUM_REGS:=4): 'CU_FUNC_ATTRIBUTE_NUM_REGS', (CU_FUNC_ATTRIBUTE_PTX_VERSION:=5): 'CU_FUNC_ATTRIBUTE_PTX_VERSION', (CU_FUNC_ATTRIBUTE_BINARY_VERSION:=6): 'CU_FUNC_ATTRIBUTE_BINARY_VERSION', (CU_FUNC_ATTRIBUTE_CACHE_MODE_CA:=7): 'CU_FUNC_ATTRIBUTE_CACHE_MODE_CA', (CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES:=8): 'CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES', (CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT:=9): 'CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT', (CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET:=10): 'CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET', (CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH:=11): 'CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH', (CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT:=12): 'CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT', (CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH:=13): 'CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH', (CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED:=14): 'CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED', (CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE:=15): 'CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE', (CU_FUNC_ATTRIBUTE_MAX:=16): 'CU_FUNC_ATTRIBUTE_MAX'} +CUfunction_attribute: TypeAlias = ctypes.c_uint32 +enum_CUfunc_cache_enum: dict[int, str] = {(CU_FUNC_CACHE_PREFER_NONE:=0): 'CU_FUNC_CACHE_PREFER_NONE', (CU_FUNC_CACHE_PREFER_SHARED:=1): 'CU_FUNC_CACHE_PREFER_SHARED', (CU_FUNC_CACHE_PREFER_L1:=2): 'CU_FUNC_CACHE_PREFER_L1', (CU_FUNC_CACHE_PREFER_EQUAL:=3): 'CU_FUNC_CACHE_PREFER_EQUAL'} +CUfunc_cache: TypeAlias = ctypes.c_uint32 +enum_CUsharedconfig_enum: dict[int, str] = {(CU_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE:=0): 'CU_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE', (CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE:=1): 'CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE', (CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE:=2): 'CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE'} +CUsharedconfig: TypeAlias = ctypes.c_uint32 +enum_CUshared_carveout_enum: dict[int, str] = {(CU_SHAREDMEM_CARVEOUT_DEFAULT:=-1): 'CU_SHAREDMEM_CARVEOUT_DEFAULT', (CU_SHAREDMEM_CARVEOUT_MAX_SHARED:=100): 'CU_SHAREDMEM_CARVEOUT_MAX_SHARED', (CU_SHAREDMEM_CARVEOUT_MAX_L1:=0): 'CU_SHAREDMEM_CARVEOUT_MAX_L1'} +CUshared_carveout: TypeAlias = ctypes.c_int32 +enum_CUmemorytype_enum: dict[int, str] = {(CU_MEMORYTYPE_HOST:=1): 'CU_MEMORYTYPE_HOST', (CU_MEMORYTYPE_DEVICE:=2): 'CU_MEMORYTYPE_DEVICE', (CU_MEMORYTYPE_ARRAY:=3): 'CU_MEMORYTYPE_ARRAY', (CU_MEMORYTYPE_UNIFIED:=4): 'CU_MEMORYTYPE_UNIFIED'} +CUmemorytype: TypeAlias = ctypes.c_uint32 +enum_CUcomputemode_enum: dict[int, str] = {(CU_COMPUTEMODE_DEFAULT:=0): 'CU_COMPUTEMODE_DEFAULT', (CU_COMPUTEMODE_PROHIBITED:=2): 'CU_COMPUTEMODE_PROHIBITED', (CU_COMPUTEMODE_EXCLUSIVE_PROCESS:=3): 'CU_COMPUTEMODE_EXCLUSIVE_PROCESS'} +CUcomputemode: TypeAlias = ctypes.c_uint32 +enum_CUmem_advise_enum: dict[int, str] = {(CU_MEM_ADVISE_SET_READ_MOSTLY:=1): 'CU_MEM_ADVISE_SET_READ_MOSTLY', (CU_MEM_ADVISE_UNSET_READ_MOSTLY:=2): 'CU_MEM_ADVISE_UNSET_READ_MOSTLY', (CU_MEM_ADVISE_SET_PREFERRED_LOCATION:=3): 'CU_MEM_ADVISE_SET_PREFERRED_LOCATION', (CU_MEM_ADVISE_UNSET_PREFERRED_LOCATION:=4): 'CU_MEM_ADVISE_UNSET_PREFERRED_LOCATION', (CU_MEM_ADVISE_SET_ACCESSED_BY:=5): 'CU_MEM_ADVISE_SET_ACCESSED_BY', (CU_MEM_ADVISE_UNSET_ACCESSED_BY:=6): 'CU_MEM_ADVISE_UNSET_ACCESSED_BY'} +CUmem_advise: TypeAlias = ctypes.c_uint32 +enum_CUmem_range_attribute_enum: dict[int, str] = {(CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY:=1): 'CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY', (CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION:=2): 'CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION', (CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY:=3): 'CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY', (CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION:=4): 'CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION'} +CUmem_range_attribute: TypeAlias = ctypes.c_uint32 +enum_CUjit_option_enum: dict[int, str] = {(CU_JIT_MAX_REGISTERS:=0): 'CU_JIT_MAX_REGISTERS', (CU_JIT_THREADS_PER_BLOCK:=1): 'CU_JIT_THREADS_PER_BLOCK', (CU_JIT_WALL_TIME:=2): 'CU_JIT_WALL_TIME', (CU_JIT_INFO_LOG_BUFFER:=3): 'CU_JIT_INFO_LOG_BUFFER', (CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES:=4): 'CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES', (CU_JIT_ERROR_LOG_BUFFER:=5): 'CU_JIT_ERROR_LOG_BUFFER', (CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES:=6): 'CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES', (CU_JIT_OPTIMIZATION_LEVEL:=7): 'CU_JIT_OPTIMIZATION_LEVEL', (CU_JIT_TARGET_FROM_CUCONTEXT:=8): 'CU_JIT_TARGET_FROM_CUCONTEXT', (CU_JIT_TARGET:=9): 'CU_JIT_TARGET', (CU_JIT_FALLBACK_STRATEGY:=10): 'CU_JIT_FALLBACK_STRATEGY', (CU_JIT_GENERATE_DEBUG_INFO:=11): 'CU_JIT_GENERATE_DEBUG_INFO', (CU_JIT_LOG_VERBOSE:=12): 'CU_JIT_LOG_VERBOSE', (CU_JIT_GENERATE_LINE_INFO:=13): 'CU_JIT_GENERATE_LINE_INFO', (CU_JIT_CACHE_MODE:=14): 'CU_JIT_CACHE_MODE', (CU_JIT_NEW_SM3X_OPT:=15): 'CU_JIT_NEW_SM3X_OPT', (CU_JIT_FAST_COMPILE:=16): 'CU_JIT_FAST_COMPILE', (CU_JIT_GLOBAL_SYMBOL_NAMES:=17): 'CU_JIT_GLOBAL_SYMBOL_NAMES', (CU_JIT_GLOBAL_SYMBOL_ADDRESSES:=18): 'CU_JIT_GLOBAL_SYMBOL_ADDRESSES', (CU_JIT_GLOBAL_SYMBOL_COUNT:=19): 'CU_JIT_GLOBAL_SYMBOL_COUNT', (CU_JIT_LTO:=20): 'CU_JIT_LTO', (CU_JIT_FTZ:=21): 'CU_JIT_FTZ', (CU_JIT_PREC_DIV:=22): 'CU_JIT_PREC_DIV', (CU_JIT_PREC_SQRT:=23): 'CU_JIT_PREC_SQRT', (CU_JIT_FMA:=24): 'CU_JIT_FMA', (CU_JIT_REFERENCED_KERNEL_NAMES:=25): 'CU_JIT_REFERENCED_KERNEL_NAMES', (CU_JIT_REFERENCED_KERNEL_COUNT:=26): 'CU_JIT_REFERENCED_KERNEL_COUNT', (CU_JIT_REFERENCED_VARIABLE_NAMES:=27): 'CU_JIT_REFERENCED_VARIABLE_NAMES', (CU_JIT_REFERENCED_VARIABLE_COUNT:=28): 'CU_JIT_REFERENCED_VARIABLE_COUNT', (CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES:=29): 'CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES', (CU_JIT_POSITION_INDEPENDENT_CODE:=30): 'CU_JIT_POSITION_INDEPENDENT_CODE', (CU_JIT_NUM_OPTIONS:=31): 'CU_JIT_NUM_OPTIONS'} +CUjit_option: TypeAlias = ctypes.c_uint32 +enum_CUjit_target_enum: dict[int, str] = {(CU_TARGET_COMPUTE_30:=30): 'CU_TARGET_COMPUTE_30', (CU_TARGET_COMPUTE_32:=32): 'CU_TARGET_COMPUTE_32', (CU_TARGET_COMPUTE_35:=35): 'CU_TARGET_COMPUTE_35', (CU_TARGET_COMPUTE_37:=37): 'CU_TARGET_COMPUTE_37', (CU_TARGET_COMPUTE_50:=50): 'CU_TARGET_COMPUTE_50', (CU_TARGET_COMPUTE_52:=52): 'CU_TARGET_COMPUTE_52', (CU_TARGET_COMPUTE_53:=53): 'CU_TARGET_COMPUTE_53', (CU_TARGET_COMPUTE_60:=60): 'CU_TARGET_COMPUTE_60', (CU_TARGET_COMPUTE_61:=61): 'CU_TARGET_COMPUTE_61', (CU_TARGET_COMPUTE_62:=62): 'CU_TARGET_COMPUTE_62', (CU_TARGET_COMPUTE_70:=70): 'CU_TARGET_COMPUTE_70', (CU_TARGET_COMPUTE_72:=72): 'CU_TARGET_COMPUTE_72', (CU_TARGET_COMPUTE_75:=75): 'CU_TARGET_COMPUTE_75', (CU_TARGET_COMPUTE_80:=80): 'CU_TARGET_COMPUTE_80', (CU_TARGET_COMPUTE_86:=86): 'CU_TARGET_COMPUTE_86', (CU_TARGET_COMPUTE_87:=87): 'CU_TARGET_COMPUTE_87', (CU_TARGET_COMPUTE_89:=89): 'CU_TARGET_COMPUTE_89', (CU_TARGET_COMPUTE_90:=90): 'CU_TARGET_COMPUTE_90', (CU_TARGET_COMPUTE_90A:=65626): 'CU_TARGET_COMPUTE_90A'} +CUjit_target: TypeAlias = ctypes.c_uint32 +enum_CUjit_fallback_enum: dict[int, str] = {(CU_PREFER_PTX:=0): 'CU_PREFER_PTX', (CU_PREFER_BINARY:=1): 'CU_PREFER_BINARY'} +CUjit_fallback: TypeAlias = ctypes.c_uint32 +enum_CUjit_cacheMode_enum: dict[int, str] = {(CU_JIT_CACHE_OPTION_NONE:=0): 'CU_JIT_CACHE_OPTION_NONE', (CU_JIT_CACHE_OPTION_CG:=1): 'CU_JIT_CACHE_OPTION_CG', (CU_JIT_CACHE_OPTION_CA:=2): 'CU_JIT_CACHE_OPTION_CA'} +CUjit_cacheMode: TypeAlias = ctypes.c_uint32 +enum_CUjitInputType_enum: dict[int, str] = {(CU_JIT_INPUT_CUBIN:=0): 'CU_JIT_INPUT_CUBIN', (CU_JIT_INPUT_PTX:=1): 'CU_JIT_INPUT_PTX', (CU_JIT_INPUT_FATBINARY:=2): 'CU_JIT_INPUT_FATBINARY', (CU_JIT_INPUT_OBJECT:=3): 'CU_JIT_INPUT_OBJECT', (CU_JIT_INPUT_LIBRARY:=4): 'CU_JIT_INPUT_LIBRARY', (CU_JIT_INPUT_NVVM:=5): 'CU_JIT_INPUT_NVVM', (CU_JIT_NUM_INPUT_TYPES:=6): 'CU_JIT_NUM_INPUT_TYPES'} +CUjitInputType: TypeAlias = ctypes.c_uint32 +class struct_CUlinkState_st(c.Struct): pass +CUlinkState: TypeAlias = c.POINTER[struct_CUlinkState_st] +enum_CUgraphicsRegisterFlags_enum: dict[int, str] = {(CU_GRAPHICS_REGISTER_FLAGS_NONE:=0): 'CU_GRAPHICS_REGISTER_FLAGS_NONE', (CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY:=1): 'CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY', (CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD:=2): 'CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD', (CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST:=4): 'CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST', (CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER:=8): 'CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER'} +CUgraphicsRegisterFlags: TypeAlias = ctypes.c_uint32 +enum_CUgraphicsMapResourceFlags_enum: dict[int, str] = {(CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE:=0): 'CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE', (CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY:=1): 'CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY', (CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD:=2): 'CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD'} +CUgraphicsMapResourceFlags: TypeAlias = ctypes.c_uint32 +enum_CUarray_cubemap_face_enum: dict[int, str] = {(CU_CUBEMAP_FACE_POSITIVE_X:=0): 'CU_CUBEMAP_FACE_POSITIVE_X', (CU_CUBEMAP_FACE_NEGATIVE_X:=1): 'CU_CUBEMAP_FACE_NEGATIVE_X', (CU_CUBEMAP_FACE_POSITIVE_Y:=2): 'CU_CUBEMAP_FACE_POSITIVE_Y', (CU_CUBEMAP_FACE_NEGATIVE_Y:=3): 'CU_CUBEMAP_FACE_NEGATIVE_Y', (CU_CUBEMAP_FACE_POSITIVE_Z:=4): 'CU_CUBEMAP_FACE_POSITIVE_Z', (CU_CUBEMAP_FACE_NEGATIVE_Z:=5): 'CU_CUBEMAP_FACE_NEGATIVE_Z'} +CUarray_cubemap_face: TypeAlias = ctypes.c_uint32 +enum_CUlimit_enum: dict[int, str] = {(CU_LIMIT_STACK_SIZE:=0): 'CU_LIMIT_STACK_SIZE', (CU_LIMIT_PRINTF_FIFO_SIZE:=1): 'CU_LIMIT_PRINTF_FIFO_SIZE', (CU_LIMIT_MALLOC_HEAP_SIZE:=2): 'CU_LIMIT_MALLOC_HEAP_SIZE', (CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH:=3): 'CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH', (CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT:=4): 'CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT', (CU_LIMIT_MAX_L2_FETCH_GRANULARITY:=5): 'CU_LIMIT_MAX_L2_FETCH_GRANULARITY', (CU_LIMIT_PERSISTING_L2_CACHE_SIZE:=6): 'CU_LIMIT_PERSISTING_L2_CACHE_SIZE', (CU_LIMIT_MAX:=7): 'CU_LIMIT_MAX'} +CUlimit: TypeAlias = ctypes.c_uint32 +enum_CUresourcetype_enum: dict[int, str] = {(CU_RESOURCE_TYPE_ARRAY:=0): 'CU_RESOURCE_TYPE_ARRAY', (CU_RESOURCE_TYPE_MIPMAPPED_ARRAY:=1): 'CU_RESOURCE_TYPE_MIPMAPPED_ARRAY', (CU_RESOURCE_TYPE_LINEAR:=2): 'CU_RESOURCE_TYPE_LINEAR', (CU_RESOURCE_TYPE_PITCH2D:=3): 'CU_RESOURCE_TYPE_PITCH2D'} +CUresourcetype: TypeAlias = ctypes.c_uint32 +CUhostFn: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +enum_CUaccessProperty_enum: dict[int, str] = {(CU_ACCESS_PROPERTY_NORMAL:=0): 'CU_ACCESS_PROPERTY_NORMAL', (CU_ACCESS_PROPERTY_STREAMING:=1): 'CU_ACCESS_PROPERTY_STREAMING', (CU_ACCESS_PROPERTY_PERSISTING:=2): 'CU_ACCESS_PROPERTY_PERSISTING'} +CUaccessProperty: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUaccessPolicyWindow_st(c.Struct): + SIZE = 32 + base_ptr: ctypes.c_void_p + num_bytes: int + hitRatio: float + hitProp: int + missProp: int +size_t: TypeAlias = ctypes.c_uint64 +struct_CUaccessPolicyWindow_st.register_fields([('base_ptr', ctypes.c_void_p, 0), ('num_bytes', size_t, 8), ('hitRatio', ctypes.c_float, 16), ('hitProp', CUaccessProperty, 20), ('missProp', CUaccessProperty, 24)]) +CUaccessPolicyWindow_v1: TypeAlias = struct_CUaccessPolicyWindow_st +CUaccessPolicyWindow: TypeAlias = struct_CUaccessPolicyWindow_st +@c.record +class struct_CUDA_KERNEL_NODE_PARAMS_st(c.Struct): + SIZE = 56 + func: c.POINTER[struct_CUfunc_st] + gridDimX: int + gridDimY: int + gridDimZ: int + blockDimX: int + blockDimY: int + blockDimZ: int + sharedMemBytes: int + kernelParams: c.POINTER[ctypes.c_void_p] + extra: c.POINTER[ctypes.c_void_p] +struct_CUDA_KERNEL_NODE_PARAMS_st.register_fields([('func', CUfunction, 0), ('gridDimX', ctypes.c_uint32, 8), ('gridDimY', ctypes.c_uint32, 12), ('gridDimZ', ctypes.c_uint32, 16), ('blockDimX', ctypes.c_uint32, 20), ('blockDimY', ctypes.c_uint32, 24), ('blockDimZ', ctypes.c_uint32, 28), ('sharedMemBytes', ctypes.c_uint32, 32), ('kernelParams', c.POINTER[ctypes.c_void_p], 40), ('extra', c.POINTER[ctypes.c_void_p], 48)]) +CUDA_KERNEL_NODE_PARAMS_v1: TypeAlias = struct_CUDA_KERNEL_NODE_PARAMS_st +@c.record +class struct_CUDA_KERNEL_NODE_PARAMS_v2_st(c.Struct): + SIZE = 72 + func: c.POINTER[struct_CUfunc_st] + gridDimX: int + gridDimY: int + gridDimZ: int + blockDimX: int + blockDimY: int + blockDimZ: int + sharedMemBytes: int + kernelParams: c.POINTER[ctypes.c_void_p] + extra: c.POINTER[ctypes.c_void_p] + kern: c.POINTER[struct_CUkern_st] + ctx: c.POINTER[struct_CUctx_st] +struct_CUDA_KERNEL_NODE_PARAMS_v2_st.register_fields([('func', CUfunction, 0), ('gridDimX', ctypes.c_uint32, 8), ('gridDimY', ctypes.c_uint32, 12), ('gridDimZ', ctypes.c_uint32, 16), ('blockDimX', ctypes.c_uint32, 20), ('blockDimY', ctypes.c_uint32, 24), ('blockDimZ', ctypes.c_uint32, 28), ('sharedMemBytes', ctypes.c_uint32, 32), ('kernelParams', c.POINTER[ctypes.c_void_p], 40), ('extra', c.POINTER[ctypes.c_void_p], 48), ('kern', CUkernel, 56), ('ctx', CUcontext, 64)]) +CUDA_KERNEL_NODE_PARAMS_v2: TypeAlias = struct_CUDA_KERNEL_NODE_PARAMS_v2_st +CUDA_KERNEL_NODE_PARAMS: TypeAlias = struct_CUDA_KERNEL_NODE_PARAMS_v2_st +@c.record +class struct_CUDA_MEMSET_NODE_PARAMS_st(c.Struct): + SIZE = 40 + dst: int + pitch: int + value: int + elementSize: int + width: int + height: int +struct_CUDA_MEMSET_NODE_PARAMS_st.register_fields([('dst', CUdeviceptr, 0), ('pitch', size_t, 8), ('value', ctypes.c_uint32, 16), ('elementSize', ctypes.c_uint32, 20), ('width', size_t, 24), ('height', size_t, 32)]) +CUDA_MEMSET_NODE_PARAMS_v1: TypeAlias = struct_CUDA_MEMSET_NODE_PARAMS_st +CUDA_MEMSET_NODE_PARAMS: TypeAlias = struct_CUDA_MEMSET_NODE_PARAMS_st +@c.record +class struct_CUDA_HOST_NODE_PARAMS_st(c.Struct): + SIZE = 16 + fn: c.CFUNCTYPE[None, [ctypes.c_void_p]] + userData: ctypes.c_void_p +struct_CUDA_HOST_NODE_PARAMS_st.register_fields([('fn', CUhostFn, 0), ('userData', ctypes.c_void_p, 8)]) +CUDA_HOST_NODE_PARAMS_v1: TypeAlias = struct_CUDA_HOST_NODE_PARAMS_st +CUDA_HOST_NODE_PARAMS: TypeAlias = struct_CUDA_HOST_NODE_PARAMS_st +enum_CUgraphNodeType_enum: dict[int, str] = {(CU_GRAPH_NODE_TYPE_KERNEL:=0): 'CU_GRAPH_NODE_TYPE_KERNEL', (CU_GRAPH_NODE_TYPE_MEMCPY:=1): 'CU_GRAPH_NODE_TYPE_MEMCPY', (CU_GRAPH_NODE_TYPE_MEMSET:=2): 'CU_GRAPH_NODE_TYPE_MEMSET', (CU_GRAPH_NODE_TYPE_HOST:=3): 'CU_GRAPH_NODE_TYPE_HOST', (CU_GRAPH_NODE_TYPE_GRAPH:=4): 'CU_GRAPH_NODE_TYPE_GRAPH', (CU_GRAPH_NODE_TYPE_EMPTY:=5): 'CU_GRAPH_NODE_TYPE_EMPTY', (CU_GRAPH_NODE_TYPE_WAIT_EVENT:=6): 'CU_GRAPH_NODE_TYPE_WAIT_EVENT', (CU_GRAPH_NODE_TYPE_EVENT_RECORD:=7): 'CU_GRAPH_NODE_TYPE_EVENT_RECORD', (CU_GRAPH_NODE_TYPE_EXT_SEMAS_SIGNAL:=8): 'CU_GRAPH_NODE_TYPE_EXT_SEMAS_SIGNAL', (CU_GRAPH_NODE_TYPE_EXT_SEMAS_WAIT:=9): 'CU_GRAPH_NODE_TYPE_EXT_SEMAS_WAIT', (CU_GRAPH_NODE_TYPE_MEM_ALLOC:=10): 'CU_GRAPH_NODE_TYPE_MEM_ALLOC', (CU_GRAPH_NODE_TYPE_MEM_FREE:=11): 'CU_GRAPH_NODE_TYPE_MEM_FREE', (CU_GRAPH_NODE_TYPE_BATCH_MEM_OP:=12): 'CU_GRAPH_NODE_TYPE_BATCH_MEM_OP'} +CUgraphNodeType: TypeAlias = ctypes.c_uint32 +enum_CUgraphInstantiateResult_enum: dict[int, str] = {(CUDA_GRAPH_INSTANTIATE_SUCCESS:=0): 'CUDA_GRAPH_INSTANTIATE_SUCCESS', (CUDA_GRAPH_INSTANTIATE_ERROR:=1): 'CUDA_GRAPH_INSTANTIATE_ERROR', (CUDA_GRAPH_INSTANTIATE_INVALID_STRUCTURE:=2): 'CUDA_GRAPH_INSTANTIATE_INVALID_STRUCTURE', (CUDA_GRAPH_INSTANTIATE_NODE_OPERATION_NOT_SUPPORTED:=3): 'CUDA_GRAPH_INSTANTIATE_NODE_OPERATION_NOT_SUPPORTED', (CUDA_GRAPH_INSTANTIATE_MULTIPLE_CTXS_NOT_SUPPORTED:=4): 'CUDA_GRAPH_INSTANTIATE_MULTIPLE_CTXS_NOT_SUPPORTED'} +CUgraphInstantiateResult: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUDA_GRAPH_INSTANTIATE_PARAMS_st(c.Struct): + SIZE = 32 + flags: int + hUploadStream: c.POINTER[struct_CUstream_st] + hErrNode_out: c.POINTER[struct_CUgraphNode_st] + result_out: int +struct_CUDA_GRAPH_INSTANTIATE_PARAMS_st.register_fields([('flags', cuuint64_t, 0), ('hUploadStream', CUstream, 8), ('hErrNode_out', CUgraphNode, 16), ('result_out', CUgraphInstantiateResult, 24)]) +CUDA_GRAPH_INSTANTIATE_PARAMS: TypeAlias = struct_CUDA_GRAPH_INSTANTIATE_PARAMS_st +enum_CUsynchronizationPolicy_enum: dict[int, str] = {(CU_SYNC_POLICY_AUTO:=1): 'CU_SYNC_POLICY_AUTO', (CU_SYNC_POLICY_SPIN:=2): 'CU_SYNC_POLICY_SPIN', (CU_SYNC_POLICY_YIELD:=3): 'CU_SYNC_POLICY_YIELD', (CU_SYNC_POLICY_BLOCKING_SYNC:=4): 'CU_SYNC_POLICY_BLOCKING_SYNC'} +CUsynchronizationPolicy: TypeAlias = ctypes.c_uint32 +enum_CUclusterSchedulingPolicy_enum: dict[int, str] = {(CU_CLUSTER_SCHEDULING_POLICY_DEFAULT:=0): 'CU_CLUSTER_SCHEDULING_POLICY_DEFAULT', (CU_CLUSTER_SCHEDULING_POLICY_SPREAD:=1): 'CU_CLUSTER_SCHEDULING_POLICY_SPREAD', (CU_CLUSTER_SCHEDULING_POLICY_LOAD_BALANCING:=2): 'CU_CLUSTER_SCHEDULING_POLICY_LOAD_BALANCING'} +CUclusterSchedulingPolicy: TypeAlias = ctypes.c_uint32 +enum_CUlaunchMemSyncDomain_enum: dict[int, str] = {(CU_LAUNCH_MEM_SYNC_DOMAIN_DEFAULT:=0): 'CU_LAUNCH_MEM_SYNC_DOMAIN_DEFAULT', (CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE:=1): 'CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE'} +CUlaunchMemSyncDomain: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUlaunchMemSyncDomainMap_st(c.Struct): + SIZE = 2 + default_: int + remote: int +struct_CUlaunchMemSyncDomainMap_st.register_fields([('default_', ctypes.c_ubyte, 0), ('remote', ctypes.c_ubyte, 1)]) +CUlaunchMemSyncDomainMap: TypeAlias = struct_CUlaunchMemSyncDomainMap_st +enum_CUlaunchAttributeID_enum: dict[int, str] = {(CU_LAUNCH_ATTRIBUTE_IGNORE:=0): 'CU_LAUNCH_ATTRIBUTE_IGNORE', (CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW:=1): 'CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW', (CU_LAUNCH_ATTRIBUTE_COOPERATIVE:=2): 'CU_LAUNCH_ATTRIBUTE_COOPERATIVE', (CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY:=3): 'CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY', (CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION:=4): 'CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION', (CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE:=5): 'CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE', (CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION:=6): 'CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION', (CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT:=7): 'CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT', (CU_LAUNCH_ATTRIBUTE_PRIORITY:=8): 'CU_LAUNCH_ATTRIBUTE_PRIORITY', (CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP:=9): 'CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP', (CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN:=10): 'CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN'} +CUlaunchAttributeID: TypeAlias = ctypes.c_uint32 +@c.record +class union_CUlaunchAttributeValue_union(c.Struct): + SIZE = 64 + pad: c.Array[ctypes.c_char, Literal[64]] + accessPolicyWindow: struct_CUaccessPolicyWindow_st + cooperative: int + syncPolicy: int + clusterDim: union_CUlaunchAttributeValue_union_clusterDim + clusterSchedulingPolicyPreference: int + programmaticStreamSerializationAllowed: int + programmaticEvent: union_CUlaunchAttributeValue_union_programmaticEvent + priority: int + memSyncDomainMap: struct_CUlaunchMemSyncDomainMap_st + memSyncDomain: int +@c.record +class union_CUlaunchAttributeValue_union_clusterDim(c.Struct): + SIZE = 12 + x: int + y: int + z: int +union_CUlaunchAttributeValue_union_clusterDim.register_fields([('x', ctypes.c_uint32, 0), ('y', ctypes.c_uint32, 4), ('z', ctypes.c_uint32, 8)]) +@c.record +class union_CUlaunchAttributeValue_union_programmaticEvent(c.Struct): + SIZE = 16 + event: c.POINTER[struct_CUevent_st] + flags: int + triggerAtBlockStart: int +union_CUlaunchAttributeValue_union_programmaticEvent.register_fields([('event', CUevent, 0), ('flags', ctypes.c_int32, 8), ('triggerAtBlockStart', ctypes.c_int32, 12)]) +union_CUlaunchAttributeValue_union.register_fields([('pad', c.Array[ctypes.c_char, Literal[64]], 0), ('accessPolicyWindow', CUaccessPolicyWindow, 0), ('cooperative', ctypes.c_int32, 0), ('syncPolicy', CUsynchronizationPolicy, 0), ('clusterDim', union_CUlaunchAttributeValue_union_clusterDim, 0), ('clusterSchedulingPolicyPreference', CUclusterSchedulingPolicy, 0), ('programmaticStreamSerializationAllowed', ctypes.c_int32, 0), ('programmaticEvent', union_CUlaunchAttributeValue_union_programmaticEvent, 0), ('priority', ctypes.c_int32, 0), ('memSyncDomainMap', CUlaunchMemSyncDomainMap, 0), ('memSyncDomain', CUlaunchMemSyncDomain, 0)]) +CUlaunchAttributeValue: TypeAlias = union_CUlaunchAttributeValue_union +@c.record +class struct_CUlaunchAttribute_st(c.Struct): + SIZE = 72 + id: int + pad: c.Array[ctypes.c_char, Literal[4]] + value: union_CUlaunchAttributeValue_union +struct_CUlaunchAttribute_st.register_fields([('id', CUlaunchAttributeID, 0), ('pad', c.Array[ctypes.c_char, Literal[4]], 4), ('value', CUlaunchAttributeValue, 8)]) +CUlaunchAttribute: TypeAlias = struct_CUlaunchAttribute_st +@c.record +class struct_CUlaunchConfig_st(c.Struct): + SIZE = 56 + gridDimX: int + gridDimY: int + gridDimZ: int + blockDimX: int + blockDimY: int + blockDimZ: int + sharedMemBytes: int + hStream: c.POINTER[struct_CUstream_st] + attrs: c.POINTER[struct_CUlaunchAttribute_st] + numAttrs: int +struct_CUlaunchConfig_st.register_fields([('gridDimX', ctypes.c_uint32, 0), ('gridDimY', ctypes.c_uint32, 4), ('gridDimZ', ctypes.c_uint32, 8), ('blockDimX', ctypes.c_uint32, 12), ('blockDimY', ctypes.c_uint32, 16), ('blockDimZ', ctypes.c_uint32, 20), ('sharedMemBytes', ctypes.c_uint32, 24), ('hStream', CUstream, 32), ('attrs', c.POINTER[CUlaunchAttribute], 40), ('numAttrs', ctypes.c_uint32, 48)]) +CUlaunchConfig: TypeAlias = struct_CUlaunchConfig_st +CUkernelNodeAttrID: TypeAlias = ctypes.c_uint32 +CUkernelNodeAttrValue_v1: TypeAlias = union_CUlaunchAttributeValue_union +CUkernelNodeAttrValue: TypeAlias = union_CUlaunchAttributeValue_union +enum_CUstreamCaptureStatus_enum: dict[int, str] = {(CU_STREAM_CAPTURE_STATUS_NONE:=0): 'CU_STREAM_CAPTURE_STATUS_NONE', (CU_STREAM_CAPTURE_STATUS_ACTIVE:=1): 'CU_STREAM_CAPTURE_STATUS_ACTIVE', (CU_STREAM_CAPTURE_STATUS_INVALIDATED:=2): 'CU_STREAM_CAPTURE_STATUS_INVALIDATED'} +CUstreamCaptureStatus: TypeAlias = ctypes.c_uint32 +enum_CUstreamCaptureMode_enum: dict[int, str] = {(CU_STREAM_CAPTURE_MODE_GLOBAL:=0): 'CU_STREAM_CAPTURE_MODE_GLOBAL', (CU_STREAM_CAPTURE_MODE_THREAD_LOCAL:=1): 'CU_STREAM_CAPTURE_MODE_THREAD_LOCAL', (CU_STREAM_CAPTURE_MODE_RELAXED:=2): 'CU_STREAM_CAPTURE_MODE_RELAXED'} +CUstreamCaptureMode: TypeAlias = ctypes.c_uint32 +CUstreamAttrID: TypeAlias = ctypes.c_uint32 +CUstreamAttrValue_v1: TypeAlias = union_CUlaunchAttributeValue_union +CUstreamAttrValue: TypeAlias = union_CUlaunchAttributeValue_union +enum_CUdriverProcAddress_flags_enum: dict[int, str] = {(CU_GET_PROC_ADDRESS_DEFAULT:=0): 'CU_GET_PROC_ADDRESS_DEFAULT', (CU_GET_PROC_ADDRESS_LEGACY_STREAM:=1): 'CU_GET_PROC_ADDRESS_LEGACY_STREAM', (CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM:=2): 'CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM'} +CUdriverProcAddress_flags: TypeAlias = ctypes.c_uint32 +enum_CUdriverProcAddressQueryResult_enum: dict[int, str] = {(CU_GET_PROC_ADDRESS_SUCCESS:=0): 'CU_GET_PROC_ADDRESS_SUCCESS', (CU_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND:=1): 'CU_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND', (CU_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT:=2): 'CU_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT'} +CUdriverProcAddressQueryResult: TypeAlias = ctypes.c_uint32 +enum_CUexecAffinityType_enum: dict[int, str] = {(CU_EXEC_AFFINITY_TYPE_SM_COUNT:=0): 'CU_EXEC_AFFINITY_TYPE_SM_COUNT', (CU_EXEC_AFFINITY_TYPE_MAX:=1): 'CU_EXEC_AFFINITY_TYPE_MAX'} +CUexecAffinityType: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUexecAffinitySmCount_st(c.Struct): + SIZE = 4 + val: int +struct_CUexecAffinitySmCount_st.register_fields([('val', ctypes.c_uint32, 0)]) +CUexecAffinitySmCount_v1: TypeAlias = struct_CUexecAffinitySmCount_st +CUexecAffinitySmCount: TypeAlias = struct_CUexecAffinitySmCount_st +@c.record +class struct_CUexecAffinityParam_st(c.Struct): + SIZE = 8 + type: int + param: struct_CUexecAffinityParam_st_param +@c.record +class struct_CUexecAffinityParam_st_param(c.Struct): + SIZE = 4 + smCount: struct_CUexecAffinitySmCount_st +struct_CUexecAffinityParam_st_param.register_fields([('smCount', CUexecAffinitySmCount, 0)]) +struct_CUexecAffinityParam_st.register_fields([('type', CUexecAffinityType, 0), ('param', struct_CUexecAffinityParam_st_param, 4)]) +CUexecAffinityParam_v1: TypeAlias = struct_CUexecAffinityParam_st +CUexecAffinityParam: TypeAlias = struct_CUexecAffinityParam_st +enum_CUlibraryOption_enum: dict[int, str] = {(CU_LIBRARY_HOST_UNIVERSAL_FUNCTION_AND_DATA_TABLE:=0): 'CU_LIBRARY_HOST_UNIVERSAL_FUNCTION_AND_DATA_TABLE', (CU_LIBRARY_BINARY_IS_PRESERVED:=1): 'CU_LIBRARY_BINARY_IS_PRESERVED', (CU_LIBRARY_NUM_OPTIONS:=2): 'CU_LIBRARY_NUM_OPTIONS'} +CUlibraryOption: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUlibraryHostUniversalFunctionAndDataTable_st(c.Struct): + SIZE = 32 + functionTable: ctypes.c_void_p + functionWindowSize: int + dataTable: ctypes.c_void_p + dataWindowSize: int +struct_CUlibraryHostUniversalFunctionAndDataTable_st.register_fields([('functionTable', ctypes.c_void_p, 0), ('functionWindowSize', size_t, 8), ('dataTable', ctypes.c_void_p, 16), ('dataWindowSize', size_t, 24)]) +CUlibraryHostUniversalFunctionAndDataTable: TypeAlias = struct_CUlibraryHostUniversalFunctionAndDataTable_st +enum_cudaError_enum: dict[int, str] = {(CUDA_SUCCESS:=0): 'CUDA_SUCCESS', (CUDA_ERROR_INVALID_VALUE:=1): 'CUDA_ERROR_INVALID_VALUE', (CUDA_ERROR_OUT_OF_MEMORY:=2): 'CUDA_ERROR_OUT_OF_MEMORY', (CUDA_ERROR_NOT_INITIALIZED:=3): 'CUDA_ERROR_NOT_INITIALIZED', (CUDA_ERROR_DEINITIALIZED:=4): 'CUDA_ERROR_DEINITIALIZED', (CUDA_ERROR_PROFILER_DISABLED:=5): 'CUDA_ERROR_PROFILER_DISABLED', (CUDA_ERROR_PROFILER_NOT_INITIALIZED:=6): 'CUDA_ERROR_PROFILER_NOT_INITIALIZED', (CUDA_ERROR_PROFILER_ALREADY_STARTED:=7): 'CUDA_ERROR_PROFILER_ALREADY_STARTED', (CUDA_ERROR_PROFILER_ALREADY_STOPPED:=8): 'CUDA_ERROR_PROFILER_ALREADY_STOPPED', (CUDA_ERROR_STUB_LIBRARY:=34): 'CUDA_ERROR_STUB_LIBRARY', (CUDA_ERROR_DEVICE_UNAVAILABLE:=46): 'CUDA_ERROR_DEVICE_UNAVAILABLE', (CUDA_ERROR_NO_DEVICE:=100): 'CUDA_ERROR_NO_DEVICE', (CUDA_ERROR_INVALID_DEVICE:=101): 'CUDA_ERROR_INVALID_DEVICE', (CUDA_ERROR_DEVICE_NOT_LICENSED:=102): 'CUDA_ERROR_DEVICE_NOT_LICENSED', (CUDA_ERROR_INVALID_IMAGE:=200): 'CUDA_ERROR_INVALID_IMAGE', (CUDA_ERROR_INVALID_CONTEXT:=201): 'CUDA_ERROR_INVALID_CONTEXT', (CUDA_ERROR_CONTEXT_ALREADY_CURRENT:=202): 'CUDA_ERROR_CONTEXT_ALREADY_CURRENT', (CUDA_ERROR_MAP_FAILED:=205): 'CUDA_ERROR_MAP_FAILED', (CUDA_ERROR_UNMAP_FAILED:=206): 'CUDA_ERROR_UNMAP_FAILED', (CUDA_ERROR_ARRAY_IS_MAPPED:=207): 'CUDA_ERROR_ARRAY_IS_MAPPED', (CUDA_ERROR_ALREADY_MAPPED:=208): 'CUDA_ERROR_ALREADY_MAPPED', (CUDA_ERROR_NO_BINARY_FOR_GPU:=209): 'CUDA_ERROR_NO_BINARY_FOR_GPU', (CUDA_ERROR_ALREADY_ACQUIRED:=210): 'CUDA_ERROR_ALREADY_ACQUIRED', (CUDA_ERROR_NOT_MAPPED:=211): 'CUDA_ERROR_NOT_MAPPED', (CUDA_ERROR_NOT_MAPPED_AS_ARRAY:=212): 'CUDA_ERROR_NOT_MAPPED_AS_ARRAY', (CUDA_ERROR_NOT_MAPPED_AS_POINTER:=213): 'CUDA_ERROR_NOT_MAPPED_AS_POINTER', (CUDA_ERROR_ECC_UNCORRECTABLE:=214): 'CUDA_ERROR_ECC_UNCORRECTABLE', (CUDA_ERROR_UNSUPPORTED_LIMIT:=215): 'CUDA_ERROR_UNSUPPORTED_LIMIT', (CUDA_ERROR_CONTEXT_ALREADY_IN_USE:=216): 'CUDA_ERROR_CONTEXT_ALREADY_IN_USE', (CUDA_ERROR_PEER_ACCESS_UNSUPPORTED:=217): 'CUDA_ERROR_PEER_ACCESS_UNSUPPORTED', (CUDA_ERROR_INVALID_PTX:=218): 'CUDA_ERROR_INVALID_PTX', (CUDA_ERROR_INVALID_GRAPHICS_CONTEXT:=219): 'CUDA_ERROR_INVALID_GRAPHICS_CONTEXT', (CUDA_ERROR_NVLINK_UNCORRECTABLE:=220): 'CUDA_ERROR_NVLINK_UNCORRECTABLE', (CUDA_ERROR_JIT_COMPILER_NOT_FOUND:=221): 'CUDA_ERROR_JIT_COMPILER_NOT_FOUND', (CUDA_ERROR_UNSUPPORTED_PTX_VERSION:=222): 'CUDA_ERROR_UNSUPPORTED_PTX_VERSION', (CUDA_ERROR_JIT_COMPILATION_DISABLED:=223): 'CUDA_ERROR_JIT_COMPILATION_DISABLED', (CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY:=224): 'CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY', (CUDA_ERROR_INVALID_SOURCE:=300): 'CUDA_ERROR_INVALID_SOURCE', (CUDA_ERROR_FILE_NOT_FOUND:=301): 'CUDA_ERROR_FILE_NOT_FOUND', (CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND:=302): 'CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND', (CUDA_ERROR_SHARED_OBJECT_INIT_FAILED:=303): 'CUDA_ERROR_SHARED_OBJECT_INIT_FAILED', (CUDA_ERROR_OPERATING_SYSTEM:=304): 'CUDA_ERROR_OPERATING_SYSTEM', (CUDA_ERROR_INVALID_HANDLE:=400): 'CUDA_ERROR_INVALID_HANDLE', (CUDA_ERROR_ILLEGAL_STATE:=401): 'CUDA_ERROR_ILLEGAL_STATE', (CUDA_ERROR_NOT_FOUND:=500): 'CUDA_ERROR_NOT_FOUND', (CUDA_ERROR_NOT_READY:=600): 'CUDA_ERROR_NOT_READY', (CUDA_ERROR_ILLEGAL_ADDRESS:=700): 'CUDA_ERROR_ILLEGAL_ADDRESS', (CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES:=701): 'CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES', (CUDA_ERROR_LAUNCH_TIMEOUT:=702): 'CUDA_ERROR_LAUNCH_TIMEOUT', (CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING:=703): 'CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING', (CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED:=704): 'CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED', (CUDA_ERROR_PEER_ACCESS_NOT_ENABLED:=705): 'CUDA_ERROR_PEER_ACCESS_NOT_ENABLED', (CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE:=708): 'CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE', (CUDA_ERROR_CONTEXT_IS_DESTROYED:=709): 'CUDA_ERROR_CONTEXT_IS_DESTROYED', (CUDA_ERROR_ASSERT:=710): 'CUDA_ERROR_ASSERT', (CUDA_ERROR_TOO_MANY_PEERS:=711): 'CUDA_ERROR_TOO_MANY_PEERS', (CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED:=712): 'CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED', (CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED:=713): 'CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED', (CUDA_ERROR_HARDWARE_STACK_ERROR:=714): 'CUDA_ERROR_HARDWARE_STACK_ERROR', (CUDA_ERROR_ILLEGAL_INSTRUCTION:=715): 'CUDA_ERROR_ILLEGAL_INSTRUCTION', (CUDA_ERROR_MISALIGNED_ADDRESS:=716): 'CUDA_ERROR_MISALIGNED_ADDRESS', (CUDA_ERROR_INVALID_ADDRESS_SPACE:=717): 'CUDA_ERROR_INVALID_ADDRESS_SPACE', (CUDA_ERROR_INVALID_PC:=718): 'CUDA_ERROR_INVALID_PC', (CUDA_ERROR_LAUNCH_FAILED:=719): 'CUDA_ERROR_LAUNCH_FAILED', (CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE:=720): 'CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE', (CUDA_ERROR_NOT_PERMITTED:=800): 'CUDA_ERROR_NOT_PERMITTED', (CUDA_ERROR_NOT_SUPPORTED:=801): 'CUDA_ERROR_NOT_SUPPORTED', (CUDA_ERROR_SYSTEM_NOT_READY:=802): 'CUDA_ERROR_SYSTEM_NOT_READY', (CUDA_ERROR_SYSTEM_DRIVER_MISMATCH:=803): 'CUDA_ERROR_SYSTEM_DRIVER_MISMATCH', (CUDA_ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE:=804): 'CUDA_ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE', (CUDA_ERROR_MPS_CONNECTION_FAILED:=805): 'CUDA_ERROR_MPS_CONNECTION_FAILED', (CUDA_ERROR_MPS_RPC_FAILURE:=806): 'CUDA_ERROR_MPS_RPC_FAILURE', (CUDA_ERROR_MPS_SERVER_NOT_READY:=807): 'CUDA_ERROR_MPS_SERVER_NOT_READY', (CUDA_ERROR_MPS_MAX_CLIENTS_REACHED:=808): 'CUDA_ERROR_MPS_MAX_CLIENTS_REACHED', (CUDA_ERROR_MPS_MAX_CONNECTIONS_REACHED:=809): 'CUDA_ERROR_MPS_MAX_CONNECTIONS_REACHED', (CUDA_ERROR_MPS_CLIENT_TERMINATED:=810): 'CUDA_ERROR_MPS_CLIENT_TERMINATED', (CUDA_ERROR_CDP_NOT_SUPPORTED:=811): 'CUDA_ERROR_CDP_NOT_SUPPORTED', (CUDA_ERROR_CDP_VERSION_MISMATCH:=812): 'CUDA_ERROR_CDP_VERSION_MISMATCH', (CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED:=900): 'CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED', (CUDA_ERROR_STREAM_CAPTURE_INVALIDATED:=901): 'CUDA_ERROR_STREAM_CAPTURE_INVALIDATED', (CUDA_ERROR_STREAM_CAPTURE_MERGE:=902): 'CUDA_ERROR_STREAM_CAPTURE_MERGE', (CUDA_ERROR_STREAM_CAPTURE_UNMATCHED:=903): 'CUDA_ERROR_STREAM_CAPTURE_UNMATCHED', (CUDA_ERROR_STREAM_CAPTURE_UNJOINED:=904): 'CUDA_ERROR_STREAM_CAPTURE_UNJOINED', (CUDA_ERROR_STREAM_CAPTURE_ISOLATION:=905): 'CUDA_ERROR_STREAM_CAPTURE_ISOLATION', (CUDA_ERROR_STREAM_CAPTURE_IMPLICIT:=906): 'CUDA_ERROR_STREAM_CAPTURE_IMPLICIT', (CUDA_ERROR_CAPTURED_EVENT:=907): 'CUDA_ERROR_CAPTURED_EVENT', (CUDA_ERROR_STREAM_CAPTURE_WRONG_THREAD:=908): 'CUDA_ERROR_STREAM_CAPTURE_WRONG_THREAD', (CUDA_ERROR_TIMEOUT:=909): 'CUDA_ERROR_TIMEOUT', (CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE:=910): 'CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE', (CUDA_ERROR_EXTERNAL_DEVICE:=911): 'CUDA_ERROR_EXTERNAL_DEVICE', (CUDA_ERROR_INVALID_CLUSTER_SIZE:=912): 'CUDA_ERROR_INVALID_CLUSTER_SIZE', (CUDA_ERROR_UNKNOWN:=999): 'CUDA_ERROR_UNKNOWN'} +CUresult: TypeAlias = ctypes.c_uint32 +enum_CUdevice_P2PAttribute_enum: dict[int, str] = {(CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK:=1): 'CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK', (CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED:=2): 'CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED', (CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED:=3): 'CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED', (CU_DEVICE_P2P_ATTRIBUTE_ACCESS_ACCESS_SUPPORTED:=4): 'CU_DEVICE_P2P_ATTRIBUTE_ACCESS_ACCESS_SUPPORTED', (CU_DEVICE_P2P_ATTRIBUTE_CUDA_ARRAY_ACCESS_SUPPORTED:=4): 'CU_DEVICE_P2P_ATTRIBUTE_CUDA_ARRAY_ACCESS_SUPPORTED'} +CUdevice_P2PAttribute: TypeAlias = ctypes.c_uint32 +CUstreamCallback: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_CUstream_st], ctypes.c_uint32, ctypes.c_void_p]] +CUoccupancyB2DSize: TypeAlias = c.CFUNCTYPE[ctypes.c_uint64, [ctypes.c_int32]] +@c.record +class struct_CUDA_MEMCPY2D_st(c.Struct): + SIZE = 128 + srcXInBytes: int + srcY: int + srcMemoryType: int + srcHost: ctypes.c_void_p + srcDevice: int + srcArray: c.POINTER[struct_CUarray_st] + srcPitch: int + dstXInBytes: int + dstY: int + dstMemoryType: int + dstHost: ctypes.c_void_p + dstDevice: int + dstArray: c.POINTER[struct_CUarray_st] + dstPitch: int + WidthInBytes: int + Height: int +struct_CUDA_MEMCPY2D_st.register_fields([('srcXInBytes', size_t, 0), ('srcY', size_t, 8), ('srcMemoryType', CUmemorytype, 16), ('srcHost', ctypes.c_void_p, 24), ('srcDevice', CUdeviceptr, 32), ('srcArray', CUarray, 40), ('srcPitch', size_t, 48), ('dstXInBytes', size_t, 56), ('dstY', size_t, 64), ('dstMemoryType', CUmemorytype, 72), ('dstHost', ctypes.c_void_p, 80), ('dstDevice', CUdeviceptr, 88), ('dstArray', CUarray, 96), ('dstPitch', size_t, 104), ('WidthInBytes', size_t, 112), ('Height', size_t, 120)]) +CUDA_MEMCPY2D_v2: TypeAlias = struct_CUDA_MEMCPY2D_st +CUDA_MEMCPY2D: TypeAlias = struct_CUDA_MEMCPY2D_st +@c.record +class struct_CUDA_MEMCPY3D_st(c.Struct): + SIZE = 200 + srcXInBytes: int + srcY: int + srcZ: int + srcLOD: int + srcMemoryType: int + srcHost: ctypes.c_void_p + srcDevice: int + srcArray: c.POINTER[struct_CUarray_st] + reserved0: ctypes.c_void_p + srcPitch: int + srcHeight: int + dstXInBytes: int + dstY: int + dstZ: int + dstLOD: int + dstMemoryType: int + dstHost: ctypes.c_void_p + dstDevice: int + dstArray: c.POINTER[struct_CUarray_st] + reserved1: ctypes.c_void_p + dstPitch: int + dstHeight: int + WidthInBytes: int + Height: int + Depth: int +struct_CUDA_MEMCPY3D_st.register_fields([('srcXInBytes', size_t, 0), ('srcY', size_t, 8), ('srcZ', size_t, 16), ('srcLOD', size_t, 24), ('srcMemoryType', CUmemorytype, 32), ('srcHost', ctypes.c_void_p, 40), ('srcDevice', CUdeviceptr, 48), ('srcArray', CUarray, 56), ('reserved0', ctypes.c_void_p, 64), ('srcPitch', size_t, 72), ('srcHeight', size_t, 80), ('dstXInBytes', size_t, 88), ('dstY', size_t, 96), ('dstZ', size_t, 104), ('dstLOD', size_t, 112), ('dstMemoryType', CUmemorytype, 120), ('dstHost', ctypes.c_void_p, 128), ('dstDevice', CUdeviceptr, 136), ('dstArray', CUarray, 144), ('reserved1', ctypes.c_void_p, 152), ('dstPitch', size_t, 160), ('dstHeight', size_t, 168), ('WidthInBytes', size_t, 176), ('Height', size_t, 184), ('Depth', size_t, 192)]) +CUDA_MEMCPY3D_v2: TypeAlias = struct_CUDA_MEMCPY3D_st +CUDA_MEMCPY3D: TypeAlias = struct_CUDA_MEMCPY3D_st +@c.record +class struct_CUDA_MEMCPY3D_PEER_st(c.Struct): + SIZE = 200 + srcXInBytes: int + srcY: int + srcZ: int + srcLOD: int + srcMemoryType: int + srcHost: ctypes.c_void_p + srcDevice: int + srcArray: c.POINTER[struct_CUarray_st] + srcContext: c.POINTER[struct_CUctx_st] + srcPitch: int + srcHeight: int + dstXInBytes: int + dstY: int + dstZ: int + dstLOD: int + dstMemoryType: int + dstHost: ctypes.c_void_p + dstDevice: int + dstArray: c.POINTER[struct_CUarray_st] + dstContext: c.POINTER[struct_CUctx_st] + dstPitch: int + dstHeight: int + WidthInBytes: int + Height: int + Depth: int +struct_CUDA_MEMCPY3D_PEER_st.register_fields([('srcXInBytes', size_t, 0), ('srcY', size_t, 8), ('srcZ', size_t, 16), ('srcLOD', size_t, 24), ('srcMemoryType', CUmemorytype, 32), ('srcHost', ctypes.c_void_p, 40), ('srcDevice', CUdeviceptr, 48), ('srcArray', CUarray, 56), ('srcContext', CUcontext, 64), ('srcPitch', size_t, 72), ('srcHeight', size_t, 80), ('dstXInBytes', size_t, 88), ('dstY', size_t, 96), ('dstZ', size_t, 104), ('dstLOD', size_t, 112), ('dstMemoryType', CUmemorytype, 120), ('dstHost', ctypes.c_void_p, 128), ('dstDevice', CUdeviceptr, 136), ('dstArray', CUarray, 144), ('dstContext', CUcontext, 152), ('dstPitch', size_t, 160), ('dstHeight', size_t, 168), ('WidthInBytes', size_t, 176), ('Height', size_t, 184), ('Depth', size_t, 192)]) +CUDA_MEMCPY3D_PEER_v1: TypeAlias = struct_CUDA_MEMCPY3D_PEER_st +CUDA_MEMCPY3D_PEER: TypeAlias = struct_CUDA_MEMCPY3D_PEER_st +@c.record +class struct_CUDA_ARRAY_DESCRIPTOR_st(c.Struct): + SIZE = 24 + Width: int + Height: int + Format: int + NumChannels: int +struct_CUDA_ARRAY_DESCRIPTOR_st.register_fields([('Width', size_t, 0), ('Height', size_t, 8), ('Format', CUarray_format, 16), ('NumChannels', ctypes.c_uint32, 20)]) +CUDA_ARRAY_DESCRIPTOR_v2: TypeAlias = struct_CUDA_ARRAY_DESCRIPTOR_st +CUDA_ARRAY_DESCRIPTOR: TypeAlias = struct_CUDA_ARRAY_DESCRIPTOR_st +@c.record +class struct_CUDA_ARRAY3D_DESCRIPTOR_st(c.Struct): + SIZE = 40 + Width: int + Height: int + Depth: int + Format: int + NumChannels: int + Flags: int +struct_CUDA_ARRAY3D_DESCRIPTOR_st.register_fields([('Width', size_t, 0), ('Height', size_t, 8), ('Depth', size_t, 16), ('Format', CUarray_format, 24), ('NumChannels', ctypes.c_uint32, 28), ('Flags', ctypes.c_uint32, 32)]) +CUDA_ARRAY3D_DESCRIPTOR_v2: TypeAlias = struct_CUDA_ARRAY3D_DESCRIPTOR_st +CUDA_ARRAY3D_DESCRIPTOR: TypeAlias = struct_CUDA_ARRAY3D_DESCRIPTOR_st +@c.record +class struct_CUDA_ARRAY_SPARSE_PROPERTIES_st(c.Struct): + SIZE = 48 + tileExtent: struct_CUDA_ARRAY_SPARSE_PROPERTIES_st_tileExtent + miptailFirstLevel: int + miptailSize: int + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[4]] +@c.record +class struct_CUDA_ARRAY_SPARSE_PROPERTIES_st_tileExtent(c.Struct): + SIZE = 12 + width: int + height: int + depth: int +struct_CUDA_ARRAY_SPARSE_PROPERTIES_st_tileExtent.register_fields([('width', ctypes.c_uint32, 0), ('height', ctypes.c_uint32, 4), ('depth', ctypes.c_uint32, 8)]) +struct_CUDA_ARRAY_SPARSE_PROPERTIES_st.register_fields([('tileExtent', struct_CUDA_ARRAY_SPARSE_PROPERTIES_st_tileExtent, 0), ('miptailFirstLevel', ctypes.c_uint32, 12), ('miptailSize', ctypes.c_uint64, 16), ('flags', ctypes.c_uint32, 24), ('reserved', c.Array[ctypes.c_uint32, Literal[4]], 28)]) +CUDA_ARRAY_SPARSE_PROPERTIES_v1: TypeAlias = struct_CUDA_ARRAY_SPARSE_PROPERTIES_st +CUDA_ARRAY_SPARSE_PROPERTIES: TypeAlias = struct_CUDA_ARRAY_SPARSE_PROPERTIES_st +@c.record +class struct_CUDA_ARRAY_MEMORY_REQUIREMENTS_st(c.Struct): + SIZE = 32 + size: int + alignment: int + reserved: c.Array[ctypes.c_uint32, Literal[4]] +struct_CUDA_ARRAY_MEMORY_REQUIREMENTS_st.register_fields([('size', size_t, 0), ('alignment', size_t, 8), ('reserved', c.Array[ctypes.c_uint32, Literal[4]], 16)]) +CUDA_ARRAY_MEMORY_REQUIREMENTS_v1: TypeAlias = struct_CUDA_ARRAY_MEMORY_REQUIREMENTS_st +CUDA_ARRAY_MEMORY_REQUIREMENTS: TypeAlias = struct_CUDA_ARRAY_MEMORY_REQUIREMENTS_st +@c.record +class struct_CUDA_RESOURCE_DESC_st(c.Struct): + SIZE = 144 + resType: int + res: struct_CUDA_RESOURCE_DESC_st_res + flags: int +@c.record +class struct_CUDA_RESOURCE_DESC_st_res(c.Struct): + SIZE = 128 + array: struct_CUDA_RESOURCE_DESC_st_res_array + mipmap: struct_CUDA_RESOURCE_DESC_st_res_mipmap + linear: struct_CUDA_RESOURCE_DESC_st_res_linear + pitch2D: struct_CUDA_RESOURCE_DESC_st_res_pitch2D + reserved: struct_CUDA_RESOURCE_DESC_st_res_reserved +@c.record +class struct_CUDA_RESOURCE_DESC_st_res_array(c.Struct): + SIZE = 8 + hArray: c.POINTER[struct_CUarray_st] +struct_CUDA_RESOURCE_DESC_st_res_array.register_fields([('hArray', CUarray, 0)]) +@c.record +class struct_CUDA_RESOURCE_DESC_st_res_mipmap(c.Struct): + SIZE = 8 + hMipmappedArray: c.POINTER[struct_CUmipmappedArray_st] +struct_CUDA_RESOURCE_DESC_st_res_mipmap.register_fields([('hMipmappedArray', CUmipmappedArray, 0)]) +@c.record +class struct_CUDA_RESOURCE_DESC_st_res_linear(c.Struct): + SIZE = 24 + devPtr: int + format: int + numChannels: int + sizeInBytes: int +struct_CUDA_RESOURCE_DESC_st_res_linear.register_fields([('devPtr', CUdeviceptr, 0), ('format', CUarray_format, 8), ('numChannels', ctypes.c_uint32, 12), ('sizeInBytes', size_t, 16)]) +@c.record +class struct_CUDA_RESOURCE_DESC_st_res_pitch2D(c.Struct): + SIZE = 40 + devPtr: int + format: int + numChannels: int + width: int + height: int + pitchInBytes: int +struct_CUDA_RESOURCE_DESC_st_res_pitch2D.register_fields([('devPtr', CUdeviceptr, 0), ('format', CUarray_format, 8), ('numChannels', ctypes.c_uint32, 12), ('width', size_t, 16), ('height', size_t, 24), ('pitchInBytes', size_t, 32)]) +@c.record +class struct_CUDA_RESOURCE_DESC_st_res_reserved(c.Struct): + SIZE = 128 + reserved: c.Array[ctypes.c_int32, Literal[32]] +struct_CUDA_RESOURCE_DESC_st_res_reserved.register_fields([('reserved', c.Array[ctypes.c_int32, Literal[32]], 0)]) +struct_CUDA_RESOURCE_DESC_st_res.register_fields([('array', struct_CUDA_RESOURCE_DESC_st_res_array, 0), ('mipmap', struct_CUDA_RESOURCE_DESC_st_res_mipmap, 0), ('linear', struct_CUDA_RESOURCE_DESC_st_res_linear, 0), ('pitch2D', struct_CUDA_RESOURCE_DESC_st_res_pitch2D, 0), ('reserved', struct_CUDA_RESOURCE_DESC_st_res_reserved, 0)]) +struct_CUDA_RESOURCE_DESC_st.register_fields([('resType', CUresourcetype, 0), ('res', struct_CUDA_RESOURCE_DESC_st_res, 8), ('flags', ctypes.c_uint32, 136)]) +CUDA_RESOURCE_DESC_v1: TypeAlias = struct_CUDA_RESOURCE_DESC_st +CUDA_RESOURCE_DESC: TypeAlias = struct_CUDA_RESOURCE_DESC_st +@c.record +class struct_CUDA_TEXTURE_DESC_st(c.Struct): + SIZE = 104 + addressMode: c.Array[ctypes.c_uint32, Literal[3]] + filterMode: int + flags: int + maxAnisotropy: int + mipmapFilterMode: int + mipmapLevelBias: float + minMipmapLevelClamp: float + maxMipmapLevelClamp: float + borderColor: c.Array[ctypes.c_float, Literal[4]] + reserved: c.Array[ctypes.c_int32, Literal[12]] +struct_CUDA_TEXTURE_DESC_st.register_fields([('addressMode', c.Array[CUaddress_mode, Literal[3]], 0), ('filterMode', CUfilter_mode, 12), ('flags', ctypes.c_uint32, 16), ('maxAnisotropy', ctypes.c_uint32, 20), ('mipmapFilterMode', CUfilter_mode, 24), ('mipmapLevelBias', ctypes.c_float, 28), ('minMipmapLevelClamp', ctypes.c_float, 32), ('maxMipmapLevelClamp', ctypes.c_float, 36), ('borderColor', c.Array[ctypes.c_float, Literal[4]], 40), ('reserved', c.Array[ctypes.c_int32, Literal[12]], 56)]) +CUDA_TEXTURE_DESC_v1: TypeAlias = struct_CUDA_TEXTURE_DESC_st +CUDA_TEXTURE_DESC: TypeAlias = struct_CUDA_TEXTURE_DESC_st +enum_CUresourceViewFormat_enum: dict[int, str] = {(CU_RES_VIEW_FORMAT_NONE:=0): 'CU_RES_VIEW_FORMAT_NONE', (CU_RES_VIEW_FORMAT_UINT_1X8:=1): 'CU_RES_VIEW_FORMAT_UINT_1X8', (CU_RES_VIEW_FORMAT_UINT_2X8:=2): 'CU_RES_VIEW_FORMAT_UINT_2X8', (CU_RES_VIEW_FORMAT_UINT_4X8:=3): 'CU_RES_VIEW_FORMAT_UINT_4X8', (CU_RES_VIEW_FORMAT_SINT_1X8:=4): 'CU_RES_VIEW_FORMAT_SINT_1X8', (CU_RES_VIEW_FORMAT_SINT_2X8:=5): 'CU_RES_VIEW_FORMAT_SINT_2X8', (CU_RES_VIEW_FORMAT_SINT_4X8:=6): 'CU_RES_VIEW_FORMAT_SINT_4X8', (CU_RES_VIEW_FORMAT_UINT_1X16:=7): 'CU_RES_VIEW_FORMAT_UINT_1X16', (CU_RES_VIEW_FORMAT_UINT_2X16:=8): 'CU_RES_VIEW_FORMAT_UINT_2X16', (CU_RES_VIEW_FORMAT_UINT_4X16:=9): 'CU_RES_VIEW_FORMAT_UINT_4X16', (CU_RES_VIEW_FORMAT_SINT_1X16:=10): 'CU_RES_VIEW_FORMAT_SINT_1X16', (CU_RES_VIEW_FORMAT_SINT_2X16:=11): 'CU_RES_VIEW_FORMAT_SINT_2X16', (CU_RES_VIEW_FORMAT_SINT_4X16:=12): 'CU_RES_VIEW_FORMAT_SINT_4X16', (CU_RES_VIEW_FORMAT_UINT_1X32:=13): 'CU_RES_VIEW_FORMAT_UINT_1X32', (CU_RES_VIEW_FORMAT_UINT_2X32:=14): 'CU_RES_VIEW_FORMAT_UINT_2X32', (CU_RES_VIEW_FORMAT_UINT_4X32:=15): 'CU_RES_VIEW_FORMAT_UINT_4X32', (CU_RES_VIEW_FORMAT_SINT_1X32:=16): 'CU_RES_VIEW_FORMAT_SINT_1X32', (CU_RES_VIEW_FORMAT_SINT_2X32:=17): 'CU_RES_VIEW_FORMAT_SINT_2X32', (CU_RES_VIEW_FORMAT_SINT_4X32:=18): 'CU_RES_VIEW_FORMAT_SINT_4X32', (CU_RES_VIEW_FORMAT_FLOAT_1X16:=19): 'CU_RES_VIEW_FORMAT_FLOAT_1X16', (CU_RES_VIEW_FORMAT_FLOAT_2X16:=20): 'CU_RES_VIEW_FORMAT_FLOAT_2X16', (CU_RES_VIEW_FORMAT_FLOAT_4X16:=21): 'CU_RES_VIEW_FORMAT_FLOAT_4X16', (CU_RES_VIEW_FORMAT_FLOAT_1X32:=22): 'CU_RES_VIEW_FORMAT_FLOAT_1X32', (CU_RES_VIEW_FORMAT_FLOAT_2X32:=23): 'CU_RES_VIEW_FORMAT_FLOAT_2X32', (CU_RES_VIEW_FORMAT_FLOAT_4X32:=24): 'CU_RES_VIEW_FORMAT_FLOAT_4X32', (CU_RES_VIEW_FORMAT_UNSIGNED_BC1:=25): 'CU_RES_VIEW_FORMAT_UNSIGNED_BC1', (CU_RES_VIEW_FORMAT_UNSIGNED_BC2:=26): 'CU_RES_VIEW_FORMAT_UNSIGNED_BC2', (CU_RES_VIEW_FORMAT_UNSIGNED_BC3:=27): 'CU_RES_VIEW_FORMAT_UNSIGNED_BC3', (CU_RES_VIEW_FORMAT_UNSIGNED_BC4:=28): 'CU_RES_VIEW_FORMAT_UNSIGNED_BC4', (CU_RES_VIEW_FORMAT_SIGNED_BC4:=29): 'CU_RES_VIEW_FORMAT_SIGNED_BC4', (CU_RES_VIEW_FORMAT_UNSIGNED_BC5:=30): 'CU_RES_VIEW_FORMAT_UNSIGNED_BC5', (CU_RES_VIEW_FORMAT_SIGNED_BC5:=31): 'CU_RES_VIEW_FORMAT_SIGNED_BC5', (CU_RES_VIEW_FORMAT_UNSIGNED_BC6H:=32): 'CU_RES_VIEW_FORMAT_UNSIGNED_BC6H', (CU_RES_VIEW_FORMAT_SIGNED_BC6H:=33): 'CU_RES_VIEW_FORMAT_SIGNED_BC6H', (CU_RES_VIEW_FORMAT_UNSIGNED_BC7:=34): 'CU_RES_VIEW_FORMAT_UNSIGNED_BC7'} +CUresourceViewFormat: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUDA_RESOURCE_VIEW_DESC_st(c.Struct): + SIZE = 112 + format: int + width: int + height: int + depth: int + firstMipmapLevel: int + lastMipmapLevel: int + firstLayer: int + lastLayer: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +struct_CUDA_RESOURCE_VIEW_DESC_st.register_fields([('format', CUresourceViewFormat, 0), ('width', size_t, 8), ('height', size_t, 16), ('depth', size_t, 24), ('firstMipmapLevel', ctypes.c_uint32, 32), ('lastMipmapLevel', ctypes.c_uint32, 36), ('firstLayer', ctypes.c_uint32, 40), ('lastLayer', ctypes.c_uint32, 44), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 48)]) +CUDA_RESOURCE_VIEW_DESC_v1: TypeAlias = struct_CUDA_RESOURCE_VIEW_DESC_st +CUDA_RESOURCE_VIEW_DESC: TypeAlias = struct_CUDA_RESOURCE_VIEW_DESC_st +@c.record +class struct_CUtensorMap_st(c.Struct): + SIZE = 128 + opaque: c.Array[ctypes.c_uint64, Literal[16]] +struct_CUtensorMap_st.register_fields([('opaque', c.Array[cuuint64_t, Literal[16]], 0)]) +CUtensorMap: TypeAlias = struct_CUtensorMap_st +enum_CUtensorMapDataType_enum: dict[int, str] = {(CU_TENSOR_MAP_DATA_TYPE_UINT8:=0): 'CU_TENSOR_MAP_DATA_TYPE_UINT8', (CU_TENSOR_MAP_DATA_TYPE_UINT16:=1): 'CU_TENSOR_MAP_DATA_TYPE_UINT16', (CU_TENSOR_MAP_DATA_TYPE_UINT32:=2): 'CU_TENSOR_MAP_DATA_TYPE_UINT32', (CU_TENSOR_MAP_DATA_TYPE_INT32:=3): 'CU_TENSOR_MAP_DATA_TYPE_INT32', (CU_TENSOR_MAP_DATA_TYPE_UINT64:=4): 'CU_TENSOR_MAP_DATA_TYPE_UINT64', (CU_TENSOR_MAP_DATA_TYPE_INT64:=5): 'CU_TENSOR_MAP_DATA_TYPE_INT64', (CU_TENSOR_MAP_DATA_TYPE_FLOAT16:=6): 'CU_TENSOR_MAP_DATA_TYPE_FLOAT16', (CU_TENSOR_MAP_DATA_TYPE_FLOAT32:=7): 'CU_TENSOR_MAP_DATA_TYPE_FLOAT32', (CU_TENSOR_MAP_DATA_TYPE_FLOAT64:=8): 'CU_TENSOR_MAP_DATA_TYPE_FLOAT64', (CU_TENSOR_MAP_DATA_TYPE_BFLOAT16:=9): 'CU_TENSOR_MAP_DATA_TYPE_BFLOAT16', (CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ:=10): 'CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ', (CU_TENSOR_MAP_DATA_TYPE_TFLOAT32:=11): 'CU_TENSOR_MAP_DATA_TYPE_TFLOAT32', (CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ:=12): 'CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ'} +CUtensorMapDataType: TypeAlias = ctypes.c_uint32 +enum_CUtensorMapInterleave_enum: dict[int, str] = {(CU_TENSOR_MAP_INTERLEAVE_NONE:=0): 'CU_TENSOR_MAP_INTERLEAVE_NONE', (CU_TENSOR_MAP_INTERLEAVE_16B:=1): 'CU_TENSOR_MAP_INTERLEAVE_16B', (CU_TENSOR_MAP_INTERLEAVE_32B:=2): 'CU_TENSOR_MAP_INTERLEAVE_32B'} +CUtensorMapInterleave: TypeAlias = ctypes.c_uint32 +enum_CUtensorMapSwizzle_enum: dict[int, str] = {(CU_TENSOR_MAP_SWIZZLE_NONE:=0): 'CU_TENSOR_MAP_SWIZZLE_NONE', (CU_TENSOR_MAP_SWIZZLE_32B:=1): 'CU_TENSOR_MAP_SWIZZLE_32B', (CU_TENSOR_MAP_SWIZZLE_64B:=2): 'CU_TENSOR_MAP_SWIZZLE_64B', (CU_TENSOR_MAP_SWIZZLE_128B:=3): 'CU_TENSOR_MAP_SWIZZLE_128B'} +CUtensorMapSwizzle: TypeAlias = ctypes.c_uint32 +enum_CUtensorMapL2promotion_enum: dict[int, str] = {(CU_TENSOR_MAP_L2_PROMOTION_NONE:=0): 'CU_TENSOR_MAP_L2_PROMOTION_NONE', (CU_TENSOR_MAP_L2_PROMOTION_L2_64B:=1): 'CU_TENSOR_MAP_L2_PROMOTION_L2_64B', (CU_TENSOR_MAP_L2_PROMOTION_L2_128B:=2): 'CU_TENSOR_MAP_L2_PROMOTION_L2_128B', (CU_TENSOR_MAP_L2_PROMOTION_L2_256B:=3): 'CU_TENSOR_MAP_L2_PROMOTION_L2_256B'} +CUtensorMapL2promotion: TypeAlias = ctypes.c_uint32 +enum_CUtensorMapFloatOOBfill_enum: dict[int, str] = {(CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE:=0): 'CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE', (CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA:=1): 'CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA'} +CUtensorMapFloatOOBfill: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_st(c.Struct): + SIZE = 16 + p2pToken: int + vaSpaceToken: int +struct_CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_st.register_fields([('p2pToken', ctypes.c_uint64, 0), ('vaSpaceToken', ctypes.c_uint32, 8)]) +CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_v1: TypeAlias = struct_CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_st +CUDA_POINTER_ATTRIBUTE_P2P_TOKENS: TypeAlias = struct_CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_st +enum_CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum: dict[int, str] = {(CU_POINTER_ATTRIBUTE_ACCESS_FLAG_NONE:=0): 'CU_POINTER_ATTRIBUTE_ACCESS_FLAG_NONE', (CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READ:=1): 'CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READ', (CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READWRITE:=3): 'CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READWRITE'} +CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUDA_LAUNCH_PARAMS_st(c.Struct): + SIZE = 56 + function: c.POINTER[struct_CUfunc_st] + gridDimX: int + gridDimY: int + gridDimZ: int + blockDimX: int + blockDimY: int + blockDimZ: int + sharedMemBytes: int + hStream: c.POINTER[struct_CUstream_st] + kernelParams: c.POINTER[ctypes.c_void_p] +struct_CUDA_LAUNCH_PARAMS_st.register_fields([('function', CUfunction, 0), ('gridDimX', ctypes.c_uint32, 8), ('gridDimY', ctypes.c_uint32, 12), ('gridDimZ', ctypes.c_uint32, 16), ('blockDimX', ctypes.c_uint32, 20), ('blockDimY', ctypes.c_uint32, 24), ('blockDimZ', ctypes.c_uint32, 28), ('sharedMemBytes', ctypes.c_uint32, 32), ('hStream', CUstream, 40), ('kernelParams', c.POINTER[ctypes.c_void_p], 48)]) +CUDA_LAUNCH_PARAMS_v1: TypeAlias = struct_CUDA_LAUNCH_PARAMS_st +CUDA_LAUNCH_PARAMS: TypeAlias = struct_CUDA_LAUNCH_PARAMS_st +enum_CUexternalMemoryHandleType_enum: dict[int, str] = {(CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD:=1): 'CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD', (CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32:=2): 'CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32', (CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT:=3): 'CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT', (CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP:=4): 'CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP', (CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE:=5): 'CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE', (CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE:=6): 'CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE', (CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT:=7): 'CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT', (CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF:=8): 'CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF'} +CUexternalMemoryHandleType: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st(c.Struct): + SIZE = 104 + type: int + handle: struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st_handle + size: int + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +@c.record +class struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st_handle(c.Struct): + SIZE = 16 + fd: int + win32: struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st_handle_win32 + nvSciBufObject: ctypes.c_void_p +@c.record +class struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st_handle_win32(c.Struct): + SIZE = 16 + handle: ctypes.c_void_p + name: ctypes.c_void_p +struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st_handle_win32.register_fields([('handle', ctypes.c_void_p, 0), ('name', ctypes.c_void_p, 8)]) +struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st_handle.register_fields([('fd', ctypes.c_int32, 0), ('win32', struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st_handle_win32, 0), ('nvSciBufObject', ctypes.c_void_p, 0)]) +struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st.register_fields([('type', CUexternalMemoryHandleType, 0), ('handle', struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st_handle, 8), ('size', ctypes.c_uint64, 24), ('flags', ctypes.c_uint32, 32), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 36)]) +CUDA_EXTERNAL_MEMORY_HANDLE_DESC_v1: TypeAlias = struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st +CUDA_EXTERNAL_MEMORY_HANDLE_DESC: TypeAlias = struct_CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st +@c.record +class struct_CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st(c.Struct): + SIZE = 88 + offset: int + size: int + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +struct_CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st.register_fields([('offset', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('flags', ctypes.c_uint32, 16), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 20)]) +CUDA_EXTERNAL_MEMORY_BUFFER_DESC_v1: TypeAlias = struct_CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st +CUDA_EXTERNAL_MEMORY_BUFFER_DESC: TypeAlias = struct_CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st +@c.record +class struct_CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st(c.Struct): + SIZE = 120 + offset: int + arrayDesc: struct_CUDA_ARRAY3D_DESCRIPTOR_st + numLevels: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +struct_CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st.register_fields([('offset', ctypes.c_uint64, 0), ('arrayDesc', CUDA_ARRAY3D_DESCRIPTOR, 8), ('numLevels', ctypes.c_uint32, 48), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 52)]) +CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_v1: TypeAlias = struct_CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st +CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC: TypeAlias = struct_CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st +enum_CUexternalSemaphoreHandleType_enum: dict[int, str] = {(CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD:=1): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32:=2): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT:=3): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE:=4): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE:=5): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC:=6): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX:=7): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT:=8): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD:=9): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD', (CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32:=10): 'CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32'} +CUexternalSemaphoreHandleType: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st(c.Struct): + SIZE = 96 + type: int + handle: struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st_handle + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st_handle(c.Struct): + SIZE = 16 + fd: int + win32: struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st_handle_win32 + nvSciSyncObj: ctypes.c_void_p +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st_handle_win32(c.Struct): + SIZE = 16 + handle: ctypes.c_void_p + name: ctypes.c_void_p +struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st_handle_win32.register_fields([('handle', ctypes.c_void_p, 0), ('name', ctypes.c_void_p, 8)]) +struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st_handle.register_fields([('fd', ctypes.c_int32, 0), ('win32', struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st_handle_win32, 0), ('nvSciSyncObj', ctypes.c_void_p, 0)]) +struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st.register_fields([('type', CUexternalSemaphoreHandleType, 0), ('handle', struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st_handle, 8), ('flags', ctypes.c_uint32, 24), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 28)]) +CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_v1: TypeAlias = struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st +CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC: TypeAlias = struct_CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st(c.Struct): + SIZE = 144 + params: struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params(c.Struct): + SIZE = 72 + fence: struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_fence + nvSciSync: struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_nvSciSync + keyedMutex: struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_keyedMutex + reserved: c.Array[ctypes.c_uint32, Literal[12]] +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_fence(c.Struct): + SIZE = 8 + value: int +struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_fence.register_fields([('value', ctypes.c_uint64, 0)]) +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_nvSciSync(c.Struct): + SIZE = 8 + fence: ctypes.c_void_p + reserved: int +struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_nvSciSync.register_fields([('fence', ctypes.c_void_p, 0), ('reserved', ctypes.c_uint64, 0)]) +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_keyedMutex(c.Struct): + SIZE = 8 + key: int +struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_keyedMutex.register_fields([('key', ctypes.c_uint64, 0)]) +struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params.register_fields([('fence', struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_fence, 0), ('nvSciSync', struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_nvSciSync, 8), ('keyedMutex', struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params_keyedMutex, 16), ('reserved', c.Array[ctypes.c_uint32, Literal[12]], 24)]) +struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st.register_fields([('params', struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st_params, 0), ('flags', ctypes.c_uint32, 72), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 76)]) +CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_v1: TypeAlias = struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st +CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS: TypeAlias = struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st(c.Struct): + SIZE = 144 + params: struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params(c.Struct): + SIZE = 72 + fence: struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_fence + nvSciSync: struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_nvSciSync + keyedMutex: struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_keyedMutex + reserved: c.Array[ctypes.c_uint32, Literal[10]] +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_fence(c.Struct): + SIZE = 8 + value: int +struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_fence.register_fields([('value', ctypes.c_uint64, 0)]) +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_nvSciSync(c.Struct): + SIZE = 8 + fence: ctypes.c_void_p + reserved: int +struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_nvSciSync.register_fields([('fence', ctypes.c_void_p, 0), ('reserved', ctypes.c_uint64, 0)]) +@c.record +class struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_keyedMutex(c.Struct): + SIZE = 16 + key: int + timeoutMs: int +struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_keyedMutex.register_fields([('key', ctypes.c_uint64, 0), ('timeoutMs', ctypes.c_uint32, 8)]) +struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params.register_fields([('fence', struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_fence, 0), ('nvSciSync', struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_nvSciSync, 8), ('keyedMutex', struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params_keyedMutex, 16), ('reserved', c.Array[ctypes.c_uint32, Literal[10]], 32)]) +struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st.register_fields([('params', struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st_params, 0), ('flags', ctypes.c_uint32, 72), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 76)]) +CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_v1: TypeAlias = struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st +CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS: TypeAlias = struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st +@c.record +class struct_CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st(c.Struct): + SIZE = 24 + extSemArray: c.POINTER[c.POINTER[struct_CUextSemaphore_st]] + paramsArray: c.POINTER[struct_CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st] + numExtSems: int +struct_CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st.register_fields([('extSemArray', c.POINTER[CUexternalSemaphore], 0), ('paramsArray', c.POINTER[CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS], 8), ('numExtSems', ctypes.c_uint32, 16)]) +CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v1: TypeAlias = struct_CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st +CUDA_EXT_SEM_SIGNAL_NODE_PARAMS: TypeAlias = struct_CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st +@c.record +class struct_CUDA_EXT_SEM_WAIT_NODE_PARAMS_st(c.Struct): + SIZE = 24 + extSemArray: c.POINTER[c.POINTER[struct_CUextSemaphore_st]] + paramsArray: c.POINTER[struct_CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st] + numExtSems: int +struct_CUDA_EXT_SEM_WAIT_NODE_PARAMS_st.register_fields([('extSemArray', c.POINTER[CUexternalSemaphore], 0), ('paramsArray', c.POINTER[CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS], 8), ('numExtSems', ctypes.c_uint32, 16)]) +CUDA_EXT_SEM_WAIT_NODE_PARAMS_v1: TypeAlias = struct_CUDA_EXT_SEM_WAIT_NODE_PARAMS_st +CUDA_EXT_SEM_WAIT_NODE_PARAMS: TypeAlias = struct_CUDA_EXT_SEM_WAIT_NODE_PARAMS_st +CUmemGenericAllocationHandle_v1: TypeAlias = ctypes.c_uint64 +CUmemGenericAllocationHandle: TypeAlias = ctypes.c_uint64 +enum_CUmemAllocationHandleType_enum: dict[int, str] = {(CU_MEM_HANDLE_TYPE_NONE:=0): 'CU_MEM_HANDLE_TYPE_NONE', (CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR:=1): 'CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR', (CU_MEM_HANDLE_TYPE_WIN32:=2): 'CU_MEM_HANDLE_TYPE_WIN32', (CU_MEM_HANDLE_TYPE_WIN32_KMT:=4): 'CU_MEM_HANDLE_TYPE_WIN32_KMT', (CU_MEM_HANDLE_TYPE_MAX:=2147483647): 'CU_MEM_HANDLE_TYPE_MAX'} +CUmemAllocationHandleType: TypeAlias = ctypes.c_uint32 +enum_CUmemAccess_flags_enum: dict[int, str] = {(CU_MEM_ACCESS_FLAGS_PROT_NONE:=0): 'CU_MEM_ACCESS_FLAGS_PROT_NONE', (CU_MEM_ACCESS_FLAGS_PROT_READ:=1): 'CU_MEM_ACCESS_FLAGS_PROT_READ', (CU_MEM_ACCESS_FLAGS_PROT_READWRITE:=3): 'CU_MEM_ACCESS_FLAGS_PROT_READWRITE', (CU_MEM_ACCESS_FLAGS_PROT_MAX:=2147483647): 'CU_MEM_ACCESS_FLAGS_PROT_MAX'} +CUmemAccess_flags: TypeAlias = ctypes.c_uint32 +enum_CUmemLocationType_enum: dict[int, str] = {(CU_MEM_LOCATION_TYPE_INVALID:=0): 'CU_MEM_LOCATION_TYPE_INVALID', (CU_MEM_LOCATION_TYPE_DEVICE:=1): 'CU_MEM_LOCATION_TYPE_DEVICE', (CU_MEM_LOCATION_TYPE_MAX:=2147483647): 'CU_MEM_LOCATION_TYPE_MAX'} +CUmemLocationType: TypeAlias = ctypes.c_uint32 +enum_CUmemAllocationType_enum: dict[int, str] = {(CU_MEM_ALLOCATION_TYPE_INVALID:=0): 'CU_MEM_ALLOCATION_TYPE_INVALID', (CU_MEM_ALLOCATION_TYPE_PINNED:=1): 'CU_MEM_ALLOCATION_TYPE_PINNED', (CU_MEM_ALLOCATION_TYPE_MAX:=2147483647): 'CU_MEM_ALLOCATION_TYPE_MAX'} +CUmemAllocationType: TypeAlias = ctypes.c_uint32 +enum_CUmemAllocationGranularity_flags_enum: dict[int, str] = {(CU_MEM_ALLOC_GRANULARITY_MINIMUM:=0): 'CU_MEM_ALLOC_GRANULARITY_MINIMUM', (CU_MEM_ALLOC_GRANULARITY_RECOMMENDED:=1): 'CU_MEM_ALLOC_GRANULARITY_RECOMMENDED'} +CUmemAllocationGranularity_flags: TypeAlias = ctypes.c_uint32 +enum_CUmemRangeHandleType_enum: dict[int, str] = {(CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD:=1): 'CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD', (CU_MEM_RANGE_HANDLE_TYPE_MAX:=2147483647): 'CU_MEM_RANGE_HANDLE_TYPE_MAX'} +CUmemRangeHandleType: TypeAlias = ctypes.c_uint32 +enum_CUarraySparseSubresourceType_enum: dict[int, str] = {(CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL:=0): 'CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL', (CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL:=1): 'CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL'} +CUarraySparseSubresourceType: TypeAlias = ctypes.c_uint32 +enum_CUmemOperationType_enum: dict[int, str] = {(CU_MEM_OPERATION_TYPE_MAP:=1): 'CU_MEM_OPERATION_TYPE_MAP', (CU_MEM_OPERATION_TYPE_UNMAP:=2): 'CU_MEM_OPERATION_TYPE_UNMAP'} +CUmemOperationType: TypeAlias = ctypes.c_uint32 +enum_CUmemHandleType_enum: dict[int, str] = {(CU_MEM_HANDLE_TYPE_GENERIC:=0): 'CU_MEM_HANDLE_TYPE_GENERIC'} +CUmemHandleType: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUarrayMapInfo_st(c.Struct): + SIZE = 96 + resourceType: int + resource: struct_CUarrayMapInfo_st_resource + subresourceType: int + subresource: struct_CUarrayMapInfo_st_subresource + memOperationType: int + memHandleType: int + memHandle: struct_CUarrayMapInfo_st_memHandle + offset: int + deviceBitMask: int + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[2]] +@c.record +class struct_CUarrayMapInfo_st_resource(c.Struct): + SIZE = 8 + mipmap: c.POINTER[struct_CUmipmappedArray_st] + array: c.POINTER[struct_CUarray_st] +struct_CUarrayMapInfo_st_resource.register_fields([('mipmap', CUmipmappedArray, 0), ('array', CUarray, 0)]) +@c.record +class struct_CUarrayMapInfo_st_subresource(c.Struct): + SIZE = 32 + sparseLevel: struct_CUarrayMapInfo_st_subresource_sparseLevel + miptail: struct_CUarrayMapInfo_st_subresource_miptail +@c.record +class struct_CUarrayMapInfo_st_subresource_sparseLevel(c.Struct): + SIZE = 32 + level: int + layer: int + offsetX: int + offsetY: int + offsetZ: int + extentWidth: int + extentHeight: int + extentDepth: int +struct_CUarrayMapInfo_st_subresource_sparseLevel.register_fields([('level', ctypes.c_uint32, 0), ('layer', ctypes.c_uint32, 4), ('offsetX', ctypes.c_uint32, 8), ('offsetY', ctypes.c_uint32, 12), ('offsetZ', ctypes.c_uint32, 16), ('extentWidth', ctypes.c_uint32, 20), ('extentHeight', ctypes.c_uint32, 24), ('extentDepth', ctypes.c_uint32, 28)]) +@c.record +class struct_CUarrayMapInfo_st_subresource_miptail(c.Struct): + SIZE = 24 + layer: int + offset: int + size: int +struct_CUarrayMapInfo_st_subresource_miptail.register_fields([('layer', ctypes.c_uint32, 0), ('offset', ctypes.c_uint64, 8), ('size', ctypes.c_uint64, 16)]) +struct_CUarrayMapInfo_st_subresource.register_fields([('sparseLevel', struct_CUarrayMapInfo_st_subresource_sparseLevel, 0), ('miptail', struct_CUarrayMapInfo_st_subresource_miptail, 0)]) +@c.record +class struct_CUarrayMapInfo_st_memHandle(c.Struct): + SIZE = 8 + memHandle: int +struct_CUarrayMapInfo_st_memHandle.register_fields([('memHandle', CUmemGenericAllocationHandle, 0)]) +struct_CUarrayMapInfo_st.register_fields([('resourceType', CUresourcetype, 0), ('resource', struct_CUarrayMapInfo_st_resource, 8), ('subresourceType', CUarraySparseSubresourceType, 16), ('subresource', struct_CUarrayMapInfo_st_subresource, 24), ('memOperationType', CUmemOperationType, 56), ('memHandleType', CUmemHandleType, 60), ('memHandle', struct_CUarrayMapInfo_st_memHandle, 64), ('offset', ctypes.c_uint64, 72), ('deviceBitMask', ctypes.c_uint32, 80), ('flags', ctypes.c_uint32, 84), ('reserved', c.Array[ctypes.c_uint32, Literal[2]], 88)]) +CUarrayMapInfo_v1: TypeAlias = struct_CUarrayMapInfo_st +CUarrayMapInfo: TypeAlias = struct_CUarrayMapInfo_st +@c.record +class struct_CUmemLocation_st(c.Struct): + SIZE = 8 + type: int + id: int +struct_CUmemLocation_st.register_fields([('type', CUmemLocationType, 0), ('id', ctypes.c_int32, 4)]) +CUmemLocation_v1: TypeAlias = struct_CUmemLocation_st +CUmemLocation: TypeAlias = struct_CUmemLocation_st +enum_CUmemAllocationCompType_enum: dict[int, str] = {(CU_MEM_ALLOCATION_COMP_NONE:=0): 'CU_MEM_ALLOCATION_COMP_NONE', (CU_MEM_ALLOCATION_COMP_GENERIC:=1): 'CU_MEM_ALLOCATION_COMP_GENERIC'} +CUmemAllocationCompType: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUmemAllocationProp_st(c.Struct): + SIZE = 32 + type: int + requestedHandleTypes: int + location: struct_CUmemLocation_st + win32HandleMetaData: ctypes.c_void_p + allocFlags: struct_CUmemAllocationProp_st_allocFlags +@c.record +class struct_CUmemAllocationProp_st_allocFlags(c.Struct): + SIZE = 8 + compressionType: int + gpuDirectRDMACapable: int + usage: int + reserved: c.Array[ctypes.c_ubyte, Literal[4]] +struct_CUmemAllocationProp_st_allocFlags.register_fields([('compressionType', ctypes.c_ubyte, 0), ('gpuDirectRDMACapable', ctypes.c_ubyte, 1), ('usage', ctypes.c_uint16, 2), ('reserved', c.Array[ctypes.c_ubyte, Literal[4]], 4)]) +struct_CUmemAllocationProp_st.register_fields([('type', CUmemAllocationType, 0), ('requestedHandleTypes', CUmemAllocationHandleType, 4), ('location', CUmemLocation, 8), ('win32HandleMetaData', ctypes.c_void_p, 16), ('allocFlags', struct_CUmemAllocationProp_st_allocFlags, 24)]) +CUmemAllocationProp_v1: TypeAlias = struct_CUmemAllocationProp_st +CUmemAllocationProp: TypeAlias = struct_CUmemAllocationProp_st +@c.record +class struct_CUmemAccessDesc_st(c.Struct): + SIZE = 12 + location: struct_CUmemLocation_st + flags: int +struct_CUmemAccessDesc_st.register_fields([('location', CUmemLocation, 0), ('flags', CUmemAccess_flags, 8)]) +CUmemAccessDesc_v1: TypeAlias = struct_CUmemAccessDesc_st +CUmemAccessDesc: TypeAlias = struct_CUmemAccessDesc_st +enum_CUgraphExecUpdateResult_enum: dict[int, str] = {(CU_GRAPH_EXEC_UPDATE_SUCCESS:=0): 'CU_GRAPH_EXEC_UPDATE_SUCCESS', (CU_GRAPH_EXEC_UPDATE_ERROR:=1): 'CU_GRAPH_EXEC_UPDATE_ERROR', (CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED:=2): 'CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED', (CU_GRAPH_EXEC_UPDATE_ERROR_NODE_TYPE_CHANGED:=3): 'CU_GRAPH_EXEC_UPDATE_ERROR_NODE_TYPE_CHANGED', (CU_GRAPH_EXEC_UPDATE_ERROR_FUNCTION_CHANGED:=4): 'CU_GRAPH_EXEC_UPDATE_ERROR_FUNCTION_CHANGED', (CU_GRAPH_EXEC_UPDATE_ERROR_PARAMETERS_CHANGED:=5): 'CU_GRAPH_EXEC_UPDATE_ERROR_PARAMETERS_CHANGED', (CU_GRAPH_EXEC_UPDATE_ERROR_NOT_SUPPORTED:=6): 'CU_GRAPH_EXEC_UPDATE_ERROR_NOT_SUPPORTED', (CU_GRAPH_EXEC_UPDATE_ERROR_UNSUPPORTED_FUNCTION_CHANGE:=7): 'CU_GRAPH_EXEC_UPDATE_ERROR_UNSUPPORTED_FUNCTION_CHANGE', (CU_GRAPH_EXEC_UPDATE_ERROR_ATTRIBUTES_CHANGED:=8): 'CU_GRAPH_EXEC_UPDATE_ERROR_ATTRIBUTES_CHANGED'} +CUgraphExecUpdateResult: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUgraphExecUpdateResultInfo_st(c.Struct): + SIZE = 24 + result: int + errorNode: c.POINTER[struct_CUgraphNode_st] + errorFromNode: c.POINTER[struct_CUgraphNode_st] +struct_CUgraphExecUpdateResultInfo_st.register_fields([('result', CUgraphExecUpdateResult, 0), ('errorNode', CUgraphNode, 8), ('errorFromNode', CUgraphNode, 16)]) +CUgraphExecUpdateResultInfo_v1: TypeAlias = struct_CUgraphExecUpdateResultInfo_st +CUgraphExecUpdateResultInfo: TypeAlias = struct_CUgraphExecUpdateResultInfo_st +enum_CUmemPool_attribute_enum: dict[int, str] = {(CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES:=1): 'CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES', (CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC:=2): 'CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC', (CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES:=3): 'CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES', (CU_MEMPOOL_ATTR_RELEASE_THRESHOLD:=4): 'CU_MEMPOOL_ATTR_RELEASE_THRESHOLD', (CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT:=5): 'CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT', (CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH:=6): 'CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH', (CU_MEMPOOL_ATTR_USED_MEM_CURRENT:=7): 'CU_MEMPOOL_ATTR_USED_MEM_CURRENT', (CU_MEMPOOL_ATTR_USED_MEM_HIGH:=8): 'CU_MEMPOOL_ATTR_USED_MEM_HIGH'} +CUmemPool_attribute: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUmemPoolProps_st(c.Struct): + SIZE = 88 + allocType: int + handleTypes: int + location: struct_CUmemLocation_st + win32SecurityAttributes: ctypes.c_void_p + reserved: c.Array[ctypes.c_ubyte, Literal[64]] +struct_CUmemPoolProps_st.register_fields([('allocType', CUmemAllocationType, 0), ('handleTypes', CUmemAllocationHandleType, 4), ('location', CUmemLocation, 8), ('win32SecurityAttributes', ctypes.c_void_p, 16), ('reserved', c.Array[ctypes.c_ubyte, Literal[64]], 24)]) +CUmemPoolProps_v1: TypeAlias = struct_CUmemPoolProps_st +CUmemPoolProps: TypeAlias = struct_CUmemPoolProps_st +@c.record +class struct_CUmemPoolPtrExportData_st(c.Struct): + SIZE = 64 + reserved: c.Array[ctypes.c_ubyte, Literal[64]] +struct_CUmemPoolPtrExportData_st.register_fields([('reserved', c.Array[ctypes.c_ubyte, Literal[64]], 0)]) +CUmemPoolPtrExportData_v1: TypeAlias = struct_CUmemPoolPtrExportData_st +CUmemPoolPtrExportData: TypeAlias = struct_CUmemPoolPtrExportData_st +@c.record +class struct_CUDA_MEM_ALLOC_NODE_PARAMS_st(c.Struct): + SIZE = 120 + poolProps: struct_CUmemPoolProps_st + accessDescs: c.POINTER[struct_CUmemAccessDesc_st] + accessDescCount: int + bytesize: int + dptr: int +struct_CUDA_MEM_ALLOC_NODE_PARAMS_st.register_fields([('poolProps', CUmemPoolProps, 0), ('accessDescs', c.POINTER[CUmemAccessDesc], 88), ('accessDescCount', size_t, 96), ('bytesize', size_t, 104), ('dptr', CUdeviceptr, 112)]) +CUDA_MEM_ALLOC_NODE_PARAMS: TypeAlias = struct_CUDA_MEM_ALLOC_NODE_PARAMS_st +enum_CUgraphMem_attribute_enum: dict[int, str] = {(CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT:=0): 'CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT', (CU_GRAPH_MEM_ATTR_USED_MEM_HIGH:=1): 'CU_GRAPH_MEM_ATTR_USED_MEM_HIGH', (CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT:=2): 'CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT', (CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH:=3): 'CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH'} +CUgraphMem_attribute: TypeAlias = ctypes.c_uint32 +enum_CUflushGPUDirectRDMAWritesOptions_enum: dict[int, str] = {(CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_HOST:=1): 'CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_HOST', (CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_MEMOPS:=2): 'CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_MEMOPS'} +CUflushGPUDirectRDMAWritesOptions: TypeAlias = ctypes.c_uint32 +enum_CUGPUDirectRDMAWritesOrdering_enum: dict[int, str] = {(CU_GPU_DIRECT_RDMA_WRITES_ORDERING_NONE:=0): 'CU_GPU_DIRECT_RDMA_WRITES_ORDERING_NONE', (CU_GPU_DIRECT_RDMA_WRITES_ORDERING_OWNER:=100): 'CU_GPU_DIRECT_RDMA_WRITES_ORDERING_OWNER', (CU_GPU_DIRECT_RDMA_WRITES_ORDERING_ALL_DEVICES:=200): 'CU_GPU_DIRECT_RDMA_WRITES_ORDERING_ALL_DEVICES'} +CUGPUDirectRDMAWritesOrdering: TypeAlias = ctypes.c_uint32 +enum_CUflushGPUDirectRDMAWritesScope_enum: dict[int, str] = {(CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_OWNER:=100): 'CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_OWNER', (CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_ALL_DEVICES:=200): 'CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_ALL_DEVICES'} +CUflushGPUDirectRDMAWritesScope: TypeAlias = ctypes.c_uint32 +enum_CUflushGPUDirectRDMAWritesTarget_enum: dict[int, str] = {(CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TARGET_CURRENT_CTX:=0): 'CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TARGET_CURRENT_CTX'} +CUflushGPUDirectRDMAWritesTarget: TypeAlias = ctypes.c_uint32 +enum_CUgraphDebugDot_flags_enum: dict[int, str] = {(CU_GRAPH_DEBUG_DOT_FLAGS_VERBOSE:=1): 'CU_GRAPH_DEBUG_DOT_FLAGS_VERBOSE', (CU_GRAPH_DEBUG_DOT_FLAGS_RUNTIME_TYPES:=2): 'CU_GRAPH_DEBUG_DOT_FLAGS_RUNTIME_TYPES', (CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_PARAMS:=4): 'CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_MEMCPY_NODE_PARAMS:=8): 'CU_GRAPH_DEBUG_DOT_FLAGS_MEMCPY_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_MEMSET_NODE_PARAMS:=16): 'CU_GRAPH_DEBUG_DOT_FLAGS_MEMSET_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_HOST_NODE_PARAMS:=32): 'CU_GRAPH_DEBUG_DOT_FLAGS_HOST_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_EVENT_NODE_PARAMS:=64): 'CU_GRAPH_DEBUG_DOT_FLAGS_EVENT_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_SIGNAL_NODE_PARAMS:=128): 'CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_SIGNAL_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_WAIT_NODE_PARAMS:=256): 'CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_WAIT_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_ATTRIBUTES:=512): 'CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_ATTRIBUTES', (CU_GRAPH_DEBUG_DOT_FLAGS_HANDLES:=1024): 'CU_GRAPH_DEBUG_DOT_FLAGS_HANDLES', (CU_GRAPH_DEBUG_DOT_FLAGS_MEM_ALLOC_NODE_PARAMS:=2048): 'CU_GRAPH_DEBUG_DOT_FLAGS_MEM_ALLOC_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_MEM_FREE_NODE_PARAMS:=4096): 'CU_GRAPH_DEBUG_DOT_FLAGS_MEM_FREE_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_BATCH_MEM_OP_NODE_PARAMS:=8192): 'CU_GRAPH_DEBUG_DOT_FLAGS_BATCH_MEM_OP_NODE_PARAMS', (CU_GRAPH_DEBUG_DOT_FLAGS_EXTRA_TOPO_INFO:=16384): 'CU_GRAPH_DEBUG_DOT_FLAGS_EXTRA_TOPO_INFO'} +CUgraphDebugDot_flags: TypeAlias = ctypes.c_uint32 +enum_CUuserObject_flags_enum: dict[int, str] = {(CU_USER_OBJECT_NO_DESTRUCTOR_SYNC:=1): 'CU_USER_OBJECT_NO_DESTRUCTOR_SYNC'} +CUuserObject_flags: TypeAlias = ctypes.c_uint32 +enum_CUuserObjectRetain_flags_enum: dict[int, str] = {(CU_GRAPH_USER_OBJECT_MOVE:=1): 'CU_GRAPH_USER_OBJECT_MOVE'} +CUuserObjectRetain_flags: TypeAlias = ctypes.c_uint32 +enum_CUgraphInstantiate_flags_enum: dict[int, str] = {(CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH:=1): 'CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH', (CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD:=2): 'CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD', (CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH:=4): 'CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH', (CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY:=8): 'CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY'} +CUgraphInstantiate_flags: TypeAlias = ctypes.c_uint32 +@dll.bind(CUresult, CUresult, c.POINTER[c.POINTER[ctypes.c_char]]) +def cuGetErrorString(error:CUresult, pStr:c.POINTER[c.POINTER[ctypes.c_char]]) -> CUresult: ... +@dll.bind(CUresult, CUresult, c.POINTER[c.POINTER[ctypes.c_char]]) +def cuGetErrorName(error:CUresult, pStr:c.POINTER[c.POINTER[ctypes.c_char]]) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_uint32) +def cuInit(Flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32]) +def cuDriverGetVersion(driverVersion:c.POINTER[ctypes.c_int32]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdevice], ctypes.c_int32) +def cuDeviceGet(device:c.POINTER[CUdevice], ordinal:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32]) +def cuDeviceGetCount(count:c.POINTER[ctypes.c_int32]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_char], ctypes.c_int32, CUdevice) +def cuDeviceGetName(name:c.POINTER[ctypes.c_char], len:int, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUuuid], CUdevice) +def cuDeviceGetUuid(uuid:c.POINTER[CUuuid], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUuuid], CUdevice) +def cuDeviceGetUuid_v2(uuid:c.POINTER[CUuuid], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_uint32], CUdevice) +def cuDeviceGetLuid(luid:c.POINTER[ctypes.c_char], deviceNodeMask:c.POINTER[ctypes.c_uint32], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[size_t], CUdevice) +def cuDeviceTotalMem_v2(bytes:c.POINTER[size_t], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[size_t], CUarray_format, ctypes.c_uint32, CUdevice) +def cuDeviceGetTexture1DLinearMaxWidth(maxWidthInElements:c.POINTER[size_t], format:CUarray_format, numChannels:int, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUdevice_attribute, CUdevice) +def cuDeviceGetAttribute(pi:c.POINTER[ctypes.c_int32], attrib:CUdevice_attribute, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUdevice, ctypes.c_int32) +def cuDeviceGetNvSciSyncAttributes(nvSciSyncAttrList:ctypes.c_void_p, dev:CUdevice, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUdevice, CUmemoryPool) +def cuDeviceSetMemPool(dev:CUdevice, pool:CUmemoryPool) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemoryPool], CUdevice) +def cuDeviceGetMemPool(pool:c.POINTER[CUmemoryPool], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemoryPool], CUdevice) +def cuDeviceGetDefaultMemPool(pool_out:c.POINTER[CUmemoryPool], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUexecAffinityType, CUdevice) +def cuDeviceGetExecAffinitySupport(pi:c.POINTER[ctypes.c_int32], type:CUexecAffinityType, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUflushGPUDirectRDMAWritesTarget, CUflushGPUDirectRDMAWritesScope) +def cuFlushGPUDirectRDMAWrites(target:CUflushGPUDirectRDMAWritesTarget, scope:CUflushGPUDirectRDMAWritesScope) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdevprop], CUdevice) +def cuDeviceGetProperties(prop:c.POINTER[CUdevprop], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], CUdevice) +def cuDeviceComputeCapability(major:c.POINTER[ctypes.c_int32], minor:c.POINTER[ctypes.c_int32], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUcontext], CUdevice) +def cuDevicePrimaryCtxRetain(pctx:c.POINTER[CUcontext], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUdevice) +def cuDevicePrimaryCtxRelease_v2(dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUdevice, ctypes.c_uint32) +def cuDevicePrimaryCtxSetFlags_v2(dev:CUdevice, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUdevice, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_int32]) +def cuDevicePrimaryCtxGetState(dev:CUdevice, flags:c.POINTER[ctypes.c_uint32], active:c.POINTER[ctypes.c_int32]) -> CUresult: ... +@dll.bind(CUresult, CUdevice) +def cuDevicePrimaryCtxReset_v2(dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUcontext], ctypes.c_uint32, CUdevice) +def cuCtxCreate_v2(pctx:c.POINTER[CUcontext], flags:int, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUcontext], c.POINTER[CUexecAffinityParam], ctypes.c_int32, ctypes.c_uint32, CUdevice) +def cuCtxCreate_v3(pctx:c.POINTER[CUcontext], paramsArray:c.POINTER[CUexecAffinityParam], numParams:int, flags:int, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUcontext) +def cuCtxDestroy_v2(ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, CUcontext) +def cuCtxPushCurrent_v2(ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUcontext]) +def cuCtxPopCurrent_v2(pctx:c.POINTER[CUcontext]) -> CUresult: ... +@dll.bind(CUresult, CUcontext) +def cuCtxSetCurrent(ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUcontext]) +def cuCtxGetCurrent(pctx:c.POINTER[CUcontext]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdevice]) +def cuCtxGetDevice(device:c.POINTER[CUdevice]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_uint32]) +def cuCtxGetFlags(flags:c.POINTER[ctypes.c_uint32]) -> CUresult: ... +@dll.bind(CUresult, CUcontext, c.POINTER[ctypes.c_uint64]) +def cuCtxGetId(ctx:CUcontext, ctxId:c.POINTER[ctypes.c_uint64]) -> CUresult: ... +@dll.bind(CUresult) +def cuCtxSynchronize() -> CUresult: ... +@dll.bind(CUresult, CUlimit, size_t) +def cuCtxSetLimit(limit:CUlimit, value:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[size_t], CUlimit) +def cuCtxGetLimit(pvalue:c.POINTER[size_t], limit:CUlimit) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUfunc_cache]) +def cuCtxGetCacheConfig(pconfig:c.POINTER[CUfunc_cache]) -> CUresult: ... +@dll.bind(CUresult, CUfunc_cache) +def cuCtxSetCacheConfig(config:CUfunc_cache) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUsharedconfig]) +def cuCtxGetSharedMemConfig(pConfig:c.POINTER[CUsharedconfig]) -> CUresult: ... +@dll.bind(CUresult, CUsharedconfig) +def cuCtxSetSharedMemConfig(config:CUsharedconfig) -> CUresult: ... +@dll.bind(CUresult, CUcontext, c.POINTER[ctypes.c_uint32]) +def cuCtxGetApiVersion(ctx:CUcontext, version:c.POINTER[ctypes.c_uint32]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32]) +def cuCtxGetStreamPriorityRange(leastPriority:c.POINTER[ctypes.c_int32], greatestPriority:c.POINTER[ctypes.c_int32]) -> CUresult: ... +@dll.bind(CUresult) +def cuCtxResetPersistingL2Cache() -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUexecAffinityParam], CUexecAffinityType) +def cuCtxGetExecAffinity(pExecAffinity:c.POINTER[CUexecAffinityParam], type:CUexecAffinityType) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUcontext], ctypes.c_uint32) +def cuCtxAttach(pctx:c.POINTER[CUcontext], flags:int) -> CUresult: ... +@dll.bind(CUresult, CUcontext) +def cuCtxDetach(ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmodule], c.POINTER[ctypes.c_char]) +def cuModuleLoad(module:c.POINTER[CUmodule], fname:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmodule], ctypes.c_void_p) +def cuModuleLoadData(module:c.POINTER[CUmodule], image:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmodule], ctypes.c_void_p, ctypes.c_uint32, c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p]) +def cuModuleLoadDataEx(module:c.POINTER[CUmodule], image:ctypes.c_void_p, numOptions:int, options:c.POINTER[CUjit_option], optionValues:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmodule], ctypes.c_void_p) +def cuModuleLoadFatBinary(module:c.POINTER[CUmodule], fatCubin:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, CUmodule) +def cuModuleUnload(hmod:CUmodule) -> CUresult: ... +enum_CUmoduleLoadingMode_enum: dict[int, str] = {(CU_MODULE_EAGER_LOADING:=1): 'CU_MODULE_EAGER_LOADING', (CU_MODULE_LAZY_LOADING:=2): 'CU_MODULE_LAZY_LOADING'} +CUmoduleLoadingMode: TypeAlias = ctypes.c_uint32 +@dll.bind(CUresult, c.POINTER[CUmoduleLoadingMode]) +def cuModuleGetLoadingMode(mode:c.POINTER[CUmoduleLoadingMode]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUfunction], CUmodule, c.POINTER[ctypes.c_char]) +def cuModuleGetFunction(hfunc:c.POINTER[CUfunction], hmod:CUmodule, name:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], c.POINTER[size_t], CUmodule, c.POINTER[ctypes.c_char]) +def cuModuleGetGlobal_v2(dptr:c.POINTER[CUdeviceptr], bytes:c.POINTER[size_t], hmod:CUmodule, name:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_uint32, c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p], c.POINTER[CUlinkState]) +def cuLinkCreate_v2(numOptions:int, options:c.POINTER[CUjit_option], optionValues:c.POINTER[ctypes.c_void_p], stateOut:c.POINTER[CUlinkState]) -> CUresult: ... +@dll.bind(CUresult, CUlinkState, CUjitInputType, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p]) +def cuLinkAddData_v2(state:CUlinkState, type:CUjitInputType, data:ctypes.c_void_p, size:size_t, name:c.POINTER[ctypes.c_char], numOptions:int, options:c.POINTER[CUjit_option], optionValues:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, CUlinkState, CUjitInputType, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p]) +def cuLinkAddFile_v2(state:CUlinkState, type:CUjitInputType, path:c.POINTER[ctypes.c_char], numOptions:int, options:c.POINTER[CUjit_option], optionValues:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, CUlinkState, c.POINTER[ctypes.c_void_p], c.POINTER[size_t]) +def cuLinkComplete(state:CUlinkState, cubinOut:c.POINTER[ctypes.c_void_p], sizeOut:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, CUlinkState) +def cuLinkDestroy(state:CUlinkState) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUtexref], CUmodule, c.POINTER[ctypes.c_char]) +def cuModuleGetTexRef(pTexRef:c.POINTER[CUtexref], hmod:CUmodule, name:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUsurfref], CUmodule, c.POINTER[ctypes.c_char]) +def cuModuleGetSurfRef(pSurfRef:c.POINTER[CUsurfref], hmod:CUmodule, name:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUlibrary], ctypes.c_void_p, c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p], ctypes.c_uint32, c.POINTER[CUlibraryOption], c.POINTER[ctypes.c_void_p], ctypes.c_uint32) +def cuLibraryLoadData(library:c.POINTER[CUlibrary], code:ctypes.c_void_p, jitOptions:c.POINTER[CUjit_option], jitOptionsValues:c.POINTER[ctypes.c_void_p], numJitOptions:int, libraryOptions:c.POINTER[CUlibraryOption], libraryOptionValues:c.POINTER[ctypes.c_void_p], numLibraryOptions:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUlibrary], c.POINTER[ctypes.c_char], c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p], ctypes.c_uint32, c.POINTER[CUlibraryOption], c.POINTER[ctypes.c_void_p], ctypes.c_uint32) +def cuLibraryLoadFromFile(library:c.POINTER[CUlibrary], fileName:c.POINTER[ctypes.c_char], jitOptions:c.POINTER[CUjit_option], jitOptionsValues:c.POINTER[ctypes.c_void_p], numJitOptions:int, libraryOptions:c.POINTER[CUlibraryOption], libraryOptionValues:c.POINTER[ctypes.c_void_p], numLibraryOptions:int) -> CUresult: ... +@dll.bind(CUresult, CUlibrary) +def cuLibraryUnload(library:CUlibrary) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUkernel], CUlibrary, c.POINTER[ctypes.c_char]) +def cuLibraryGetKernel(pKernel:c.POINTER[CUkernel], library:CUlibrary, name:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmodule], CUlibrary) +def cuLibraryGetModule(pMod:c.POINTER[CUmodule], library:CUlibrary) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUfunction], CUkernel) +def cuKernelGetFunction(pFunc:c.POINTER[CUfunction], kernel:CUkernel) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], c.POINTER[size_t], CUlibrary, c.POINTER[ctypes.c_char]) +def cuLibraryGetGlobal(dptr:c.POINTER[CUdeviceptr], bytes:c.POINTER[size_t], library:CUlibrary, name:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], c.POINTER[size_t], CUlibrary, c.POINTER[ctypes.c_char]) +def cuLibraryGetManaged(dptr:c.POINTER[CUdeviceptr], bytes:c.POINTER[size_t], library:CUlibrary, name:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_void_p], CUlibrary, c.POINTER[ctypes.c_char]) +def cuLibraryGetUnifiedFunction(fptr:c.POINTER[ctypes.c_void_p], library:CUlibrary, symbol:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUfunction_attribute, CUkernel, CUdevice) +def cuKernelGetAttribute(pi:c.POINTER[ctypes.c_int32], attrib:CUfunction_attribute, kernel:CUkernel, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUfunction_attribute, ctypes.c_int32, CUkernel, CUdevice) +def cuKernelSetAttribute(attrib:CUfunction_attribute, val:int, kernel:CUkernel, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUkernel, CUfunc_cache, CUdevice) +def cuKernelSetCacheConfig(kernel:CUkernel, config:CUfunc_cache, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[size_t], c.POINTER[size_t]) +def cuMemGetInfo_v2(free:c.POINTER[size_t], total:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], size_t) +def cuMemAlloc_v2(dptr:c.POINTER[CUdeviceptr], bytesize:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], c.POINTER[size_t], size_t, size_t, ctypes.c_uint32) +def cuMemAllocPitch_v2(dptr:c.POINTER[CUdeviceptr], pPitch:c.POINTER[size_t], WidthInBytes:size_t, Height:size_t, ElementSizeBytes:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr) +def cuMemFree_v2(dptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], c.POINTER[size_t], CUdeviceptr) +def cuMemGetAddressRange_v2(pbase:c.POINTER[CUdeviceptr], psize:c.POINTER[size_t], dptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_void_p], size_t) +def cuMemAllocHost_v2(pp:c.POINTER[ctypes.c_void_p], bytesize:size_t) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p) +def cuMemFreeHost(p:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_void_p], size_t, ctypes.c_uint32) +def cuMemHostAlloc(pp:c.POINTER[ctypes.c_void_p], bytesize:size_t, Flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], ctypes.c_void_p, ctypes.c_uint32) +def cuMemHostGetDevicePointer_v2(pdptr:c.POINTER[CUdeviceptr], p:ctypes.c_void_p, Flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_uint32], ctypes.c_void_p) +def cuMemHostGetFlags(pFlags:c.POINTER[ctypes.c_uint32], p:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], size_t, ctypes.c_uint32) +def cuMemAllocManaged(dptr:c.POINTER[CUdeviceptr], bytesize:size_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdevice], c.POINTER[ctypes.c_char]) +def cuDeviceGetByPCIBusId(dev:c.POINTER[CUdevice], pciBusId:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_char], ctypes.c_int32, CUdevice) +def cuDeviceGetPCIBusId(pciBusId:c.POINTER[ctypes.c_char], len:int, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUipcEventHandle], CUevent) +def cuIpcGetEventHandle(pHandle:c.POINTER[CUipcEventHandle], event:CUevent) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUevent], CUipcEventHandle) +def cuIpcOpenEventHandle(phEvent:c.POINTER[CUevent], handle:CUipcEventHandle) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUipcMemHandle], CUdeviceptr) +def cuIpcGetMemHandle(pHandle:c.POINTER[CUipcMemHandle], dptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], CUipcMemHandle, ctypes.c_uint32) +def cuIpcOpenMemHandle_v2(pdptr:c.POINTER[CUdeviceptr], handle:CUipcMemHandle, Flags:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr) +def cuIpcCloseMemHandle(dptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, size_t, ctypes.c_uint32) +def cuMemHostRegister_v2(p:ctypes.c_void_p, bytesize:size_t, Flags:int) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p) +def cuMemHostUnregister(p:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUdeviceptr, size_t) +def cuMemcpy_ptds(dst:CUdeviceptr, src:CUdeviceptr, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUcontext, CUdeviceptr, CUcontext, size_t) +def cuMemcpyPeer_ptds(dstDevice:CUdeviceptr, dstContext:CUcontext, srcDevice:CUdeviceptr, srcContext:CUcontext, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_void_p, size_t) +def cuMemcpyHtoD_v2_ptds(dstDevice:CUdeviceptr, srcHost:ctypes.c_void_p, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUdeviceptr, size_t) +def cuMemcpyDtoH_v2_ptds(dstHost:ctypes.c_void_p, srcDevice:CUdeviceptr, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUdeviceptr, size_t) +def cuMemcpyDtoD_v2_ptds(dstDevice:CUdeviceptr, srcDevice:CUdeviceptr, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUarray, size_t, CUdeviceptr, size_t) +def cuMemcpyDtoA_v2_ptds(dstArray:CUarray, dstOffset:size_t, srcDevice:CUdeviceptr, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUarray, size_t, size_t) +def cuMemcpyAtoD_v2_ptds(dstDevice:CUdeviceptr, srcArray:CUarray, srcOffset:size_t, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUarray, size_t, ctypes.c_void_p, size_t) +def cuMemcpyHtoA_v2_ptds(dstArray:CUarray, dstOffset:size_t, srcHost:ctypes.c_void_p, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUarray, size_t, size_t) +def cuMemcpyAtoH_v2_ptds(dstHost:ctypes.c_void_p, srcArray:CUarray, srcOffset:size_t, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUarray, size_t, CUarray, size_t, size_t) +def cuMemcpyAtoA_v2_ptds(dstArray:CUarray, dstOffset:size_t, srcArray:CUarray, srcOffset:size_t, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D]) +def cuMemcpy2D_v2_ptds(pCopy:c.POINTER[CUDA_MEMCPY2D]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D]) +def cuMemcpy2DUnaligned_v2_ptds(pCopy:c.POINTER[CUDA_MEMCPY2D]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D]) +def cuMemcpy3D_v2_ptds(pCopy:c.POINTER[CUDA_MEMCPY3D]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D_PEER]) +def cuMemcpy3DPeer_ptds(pCopy:c.POINTER[CUDA_MEMCPY3D_PEER]) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUdeviceptr, size_t, CUstream) +def cuMemcpyAsync_ptsz(dst:CUdeviceptr, src:CUdeviceptr, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUcontext, CUdeviceptr, CUcontext, size_t, CUstream) +def cuMemcpyPeerAsync_ptsz(dstDevice:CUdeviceptr, dstContext:CUcontext, srcDevice:CUdeviceptr, srcContext:CUcontext, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_void_p, size_t, CUstream) +def cuMemcpyHtoDAsync_v2_ptsz(dstDevice:CUdeviceptr, srcHost:ctypes.c_void_p, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUdeviceptr, size_t, CUstream) +def cuMemcpyDtoHAsync_v2_ptsz(dstHost:ctypes.c_void_p, srcDevice:CUdeviceptr, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUdeviceptr, size_t, CUstream) +def cuMemcpyDtoDAsync_v2_ptsz(dstDevice:CUdeviceptr, srcDevice:CUdeviceptr, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUarray, size_t, ctypes.c_void_p, size_t, CUstream) +def cuMemcpyHtoAAsync_v2_ptsz(dstArray:CUarray, dstOffset:size_t, srcHost:ctypes.c_void_p, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUarray, size_t, size_t, CUstream) +def cuMemcpyAtoHAsync_v2_ptsz(dstHost:ctypes.c_void_p, srcArray:CUarray, srcOffset:size_t, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D], CUstream) +def cuMemcpy2DAsync_v2_ptsz(pCopy:c.POINTER[CUDA_MEMCPY2D], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D], CUstream) +def cuMemcpy3DAsync_v2_ptsz(pCopy:c.POINTER[CUDA_MEMCPY3D], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D_PEER], CUstream) +def cuMemcpy3DPeerAsync_ptsz(pCopy:c.POINTER[CUDA_MEMCPY3D_PEER], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_ubyte, size_t) +def cuMemsetD8_v2_ptds(dstDevice:CUdeviceptr, uc:int, N:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_uint16, size_t) +def cuMemsetD16_v2_ptds(dstDevice:CUdeviceptr, us:int, N:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_uint32, size_t) +def cuMemsetD32_v2_ptds(dstDevice:CUdeviceptr, ui:int, N:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_ubyte, size_t, size_t) +def cuMemsetD2D8_v2_ptds(dstDevice:CUdeviceptr, dstPitch:size_t, uc:int, Width:size_t, Height:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_uint16, size_t, size_t) +def cuMemsetD2D16_v2_ptds(dstDevice:CUdeviceptr, dstPitch:size_t, us:int, Width:size_t, Height:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_uint32, size_t, size_t) +def cuMemsetD2D32_v2_ptds(dstDevice:CUdeviceptr, dstPitch:size_t, ui:int, Width:size_t, Height:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_ubyte, size_t, CUstream) +def cuMemsetD8Async_ptsz(dstDevice:CUdeviceptr, uc:int, N:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_uint16, size_t, CUstream) +def cuMemsetD16Async_ptsz(dstDevice:CUdeviceptr, us:int, N:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_uint32, size_t, CUstream) +def cuMemsetD32Async_ptsz(dstDevice:CUdeviceptr, ui:int, N:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_ubyte, size_t, size_t, CUstream) +def cuMemsetD2D8Async_ptsz(dstDevice:CUdeviceptr, dstPitch:size_t, uc:int, Width:size_t, Height:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_uint16, size_t, size_t, CUstream) +def cuMemsetD2D16Async_ptsz(dstDevice:CUdeviceptr, dstPitch:size_t, us:int, Width:size_t, Height:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_uint32, size_t, size_t, CUstream) +def cuMemsetD2D32Async_ptsz(dstDevice:CUdeviceptr, dstPitch:size_t, ui:int, Width:size_t, Height:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], c.POINTER[CUDA_ARRAY_DESCRIPTOR]) +def cuArrayCreate_v2(pHandle:c.POINTER[CUarray], pAllocateArray:c.POINTER[CUDA_ARRAY_DESCRIPTOR]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_ARRAY_DESCRIPTOR], CUarray) +def cuArrayGetDescriptor_v2(pArrayDescriptor:c.POINTER[CUDA_ARRAY_DESCRIPTOR], hArray:CUarray) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_ARRAY_SPARSE_PROPERTIES], CUarray) +def cuArrayGetSparseProperties(sparseProperties:c.POINTER[CUDA_ARRAY_SPARSE_PROPERTIES], array:CUarray) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_ARRAY_SPARSE_PROPERTIES], CUmipmappedArray) +def cuMipmappedArrayGetSparseProperties(sparseProperties:c.POINTER[CUDA_ARRAY_SPARSE_PROPERTIES], mipmap:CUmipmappedArray) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_ARRAY_MEMORY_REQUIREMENTS], CUarray, CUdevice) +def cuArrayGetMemoryRequirements(memoryRequirements:c.POINTER[CUDA_ARRAY_MEMORY_REQUIREMENTS], array:CUarray, device:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_ARRAY_MEMORY_REQUIREMENTS], CUmipmappedArray, CUdevice) +def cuMipmappedArrayGetMemoryRequirements(memoryRequirements:c.POINTER[CUDA_ARRAY_MEMORY_REQUIREMENTS], mipmap:CUmipmappedArray, device:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], CUarray, ctypes.c_uint32) +def cuArrayGetPlane(pPlaneArray:c.POINTER[CUarray], hArray:CUarray, planeIdx:int) -> CUresult: ... +@dll.bind(CUresult, CUarray) +def cuArrayDestroy(hArray:CUarray) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], c.POINTER[CUDA_ARRAY3D_DESCRIPTOR]) +def cuArray3DCreate_v2(pHandle:c.POINTER[CUarray], pAllocateArray:c.POINTER[CUDA_ARRAY3D_DESCRIPTOR]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_ARRAY3D_DESCRIPTOR], CUarray) +def cuArray3DGetDescriptor_v2(pArrayDescriptor:c.POINTER[CUDA_ARRAY3D_DESCRIPTOR], hArray:CUarray) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmipmappedArray], c.POINTER[CUDA_ARRAY3D_DESCRIPTOR], ctypes.c_uint32) +def cuMipmappedArrayCreate(pHandle:c.POINTER[CUmipmappedArray], pMipmappedArrayDesc:c.POINTER[CUDA_ARRAY3D_DESCRIPTOR], numMipmapLevels:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], CUmipmappedArray, ctypes.c_uint32) +def cuMipmappedArrayGetLevel(pLevelArray:c.POINTER[CUarray], hMipmappedArray:CUmipmappedArray, level:int) -> CUresult: ... +@dll.bind(CUresult, CUmipmappedArray) +def cuMipmappedArrayDestroy(hMipmappedArray:CUmipmappedArray) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUdeviceptr, size_t, CUmemRangeHandleType, ctypes.c_uint64) +def cuMemGetHandleForAddressRange(handle:ctypes.c_void_p, dptr:CUdeviceptr, size:size_t, handleType:CUmemRangeHandleType, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], size_t, size_t, CUdeviceptr, ctypes.c_uint64) +def cuMemAddressReserve(ptr:c.POINTER[CUdeviceptr], size:size_t, alignment:size_t, addr:CUdeviceptr, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t) +def cuMemAddressFree(ptr:CUdeviceptr, size:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemGenericAllocationHandle], size_t, c.POINTER[CUmemAllocationProp], ctypes.c_uint64) +def cuMemCreate(handle:c.POINTER[CUmemGenericAllocationHandle], size:size_t, prop:c.POINTER[CUmemAllocationProp], flags:int) -> CUresult: ... +@dll.bind(CUresult, CUmemGenericAllocationHandle) +def cuMemRelease(handle:CUmemGenericAllocationHandle) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, size_t, CUmemGenericAllocationHandle, ctypes.c_uint64) +def cuMemMap(ptr:CUdeviceptr, size:size_t, offset:size_t, handle:CUmemGenericAllocationHandle, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarrayMapInfo], ctypes.c_uint32, CUstream) +def cuMemMapArrayAsync_ptsz(mapInfoList:c.POINTER[CUarrayMapInfo], count:int, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t) +def cuMemUnmap(ptr:CUdeviceptr, size:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, c.POINTER[CUmemAccessDesc], size_t) +def cuMemSetAccess(ptr:CUdeviceptr, size:size_t, desc:c.POINTER[CUmemAccessDesc], count:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_uint64], c.POINTER[CUmemLocation], CUdeviceptr) +def cuMemGetAccess(flags:c.POINTER[ctypes.c_uint64], location:c.POINTER[CUmemLocation], ptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUmemGenericAllocationHandle, CUmemAllocationHandleType, ctypes.c_uint64) +def cuMemExportToShareableHandle(shareableHandle:ctypes.c_void_p, handle:CUmemGenericAllocationHandle, handleType:CUmemAllocationHandleType, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemGenericAllocationHandle], ctypes.c_void_p, CUmemAllocationHandleType) +def cuMemImportFromShareableHandle(handle:c.POINTER[CUmemGenericAllocationHandle], osHandle:ctypes.c_void_p, shHandleType:CUmemAllocationHandleType) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[size_t], c.POINTER[CUmemAllocationProp], CUmemAllocationGranularity_flags) +def cuMemGetAllocationGranularity(granularity:c.POINTER[size_t], prop:c.POINTER[CUmemAllocationProp], option:CUmemAllocationGranularity_flags) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemAllocationProp], CUmemGenericAllocationHandle) +def cuMemGetAllocationPropertiesFromHandle(prop:c.POINTER[CUmemAllocationProp], handle:CUmemGenericAllocationHandle) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemGenericAllocationHandle], ctypes.c_void_p) +def cuMemRetainAllocationHandle(handle:c.POINTER[CUmemGenericAllocationHandle], addr:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUstream) +def cuMemFreeAsync_ptsz(dptr:CUdeviceptr, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], size_t, CUstream) +def cuMemAllocAsync_ptsz(dptr:c.POINTER[CUdeviceptr], bytesize:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUmemoryPool, size_t) +def cuMemPoolTrimTo(pool:CUmemoryPool, minBytesToKeep:size_t) -> CUresult: ... +@dll.bind(CUresult, CUmemoryPool, CUmemPool_attribute, ctypes.c_void_p) +def cuMemPoolSetAttribute(pool:CUmemoryPool, attr:CUmemPool_attribute, value:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, CUmemoryPool, CUmemPool_attribute, ctypes.c_void_p) +def cuMemPoolGetAttribute(pool:CUmemoryPool, attr:CUmemPool_attribute, value:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, CUmemoryPool, c.POINTER[CUmemAccessDesc], size_t) +def cuMemPoolSetAccess(pool:CUmemoryPool, map:c.POINTER[CUmemAccessDesc], count:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemAccess_flags], CUmemoryPool, c.POINTER[CUmemLocation]) +def cuMemPoolGetAccess(flags:c.POINTER[CUmemAccess_flags], memPool:CUmemoryPool, location:c.POINTER[CUmemLocation]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemoryPool], c.POINTER[CUmemPoolProps]) +def cuMemPoolCreate(pool:c.POINTER[CUmemoryPool], poolProps:c.POINTER[CUmemPoolProps]) -> CUresult: ... +@dll.bind(CUresult, CUmemoryPool) +def cuMemPoolDestroy(pool:CUmemoryPool) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], size_t, CUmemoryPool, CUstream) +def cuMemAllocFromPoolAsync_ptsz(dptr:c.POINTER[CUdeviceptr], bytesize:size_t, pool:CUmemoryPool, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUmemoryPool, CUmemAllocationHandleType, ctypes.c_uint64) +def cuMemPoolExportToShareableHandle(handle_out:ctypes.c_void_p, pool:CUmemoryPool, handleType:CUmemAllocationHandleType, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemoryPool], ctypes.c_void_p, CUmemAllocationHandleType, ctypes.c_uint64) +def cuMemPoolImportFromShareableHandle(pool_out:c.POINTER[CUmemoryPool], handle:ctypes.c_void_p, handleType:CUmemAllocationHandleType, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmemPoolPtrExportData], CUdeviceptr) +def cuMemPoolExportPointer(shareData_out:c.POINTER[CUmemPoolPtrExportData], ptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], CUmemoryPool, c.POINTER[CUmemPoolPtrExportData]) +def cuMemPoolImportPointer(ptr_out:c.POINTER[CUdeviceptr], pool:CUmemoryPool, shareData:c.POINTER[CUmemPoolPtrExportData]) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUpointer_attribute, CUdeviceptr) +def cuPointerGetAttribute(data:ctypes.c_void_p, attribute:CUpointer_attribute, ptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, CUdevice, CUstream) +def cuMemPrefetchAsync_ptsz(devPtr:CUdeviceptr, count:size_t, dstDevice:CUdevice, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, CUmem_advise, CUdevice) +def cuMemAdvise(devPtr:CUdeviceptr, count:size_t, advice:CUmem_advise, device:CUdevice) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, size_t, CUmem_range_attribute, CUdeviceptr, size_t) +def cuMemRangeGetAttribute(data:ctypes.c_void_p, dataSize:size_t, attribute:CUmem_range_attribute, devPtr:CUdeviceptr, count:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_void_p], c.POINTER[size_t], c.POINTER[CUmem_range_attribute], size_t, CUdeviceptr, size_t) +def cuMemRangeGetAttributes(data:c.POINTER[ctypes.c_void_p], dataSizes:c.POINTER[size_t], attributes:c.POINTER[CUmem_range_attribute], numAttributes:size_t, devPtr:CUdeviceptr, count:size_t) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUpointer_attribute, CUdeviceptr) +def cuPointerSetAttribute(value:ctypes.c_void_p, attribute:CUpointer_attribute, ptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_uint32, c.POINTER[CUpointer_attribute], c.POINTER[ctypes.c_void_p], CUdeviceptr) +def cuPointerGetAttributes(numAttributes:int, attributes:c.POINTER[CUpointer_attribute], data:c.POINTER[ctypes.c_void_p], ptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUstream], ctypes.c_uint32) +def cuStreamCreate(phStream:c.POINTER[CUstream], Flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUstream], ctypes.c_uint32, ctypes.c_int32) +def cuStreamCreateWithPriority(phStream:c.POINTER[CUstream], flags:int, priority:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[ctypes.c_int32]) +def cuStreamGetPriority_ptsz(hStream:CUstream, priority:c.POINTER[ctypes.c_int32]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[ctypes.c_uint32]) +def cuStreamGetFlags_ptsz(hStream:CUstream, flags:c.POINTER[ctypes.c_uint32]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[ctypes.c_uint64]) +def cuStreamGetId_ptsz(hStream:CUstream, streamId:c.POINTER[ctypes.c_uint64]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUcontext]) +def cuStreamGetCtx_ptsz(hStream:CUstream, pctx:c.POINTER[CUcontext]) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUevent, ctypes.c_uint32) +def cuStreamWaitEvent_ptsz(hStream:CUstream, hEvent:CUevent, Flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstreamCallback, ctypes.c_void_p, ctypes.c_uint32) +def cuStreamAddCallback_ptsz(hStream:CUstream, callback:CUstreamCallback, userData:ctypes.c_void_p, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstreamCaptureMode) +def cuStreamBeginCapture_v2_ptsz(hStream:CUstream, mode:CUstreamCaptureMode) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUstreamCaptureMode]) +def cuThreadExchangeStreamCaptureMode(mode:c.POINTER[CUstreamCaptureMode]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUgraph]) +def cuStreamEndCapture_ptsz(hStream:CUstream, phGraph:c.POINTER[CUgraph]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUstreamCaptureStatus]) +def cuStreamIsCapturing_ptsz(hStream:CUstream, captureStatus:c.POINTER[CUstreamCaptureStatus]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUstreamCaptureStatus], c.POINTER[cuuint64_t], c.POINTER[CUgraph], c.POINTER[c.POINTER[CUgraphNode]], c.POINTER[size_t]) +def cuStreamGetCaptureInfo_v2_ptsz(hStream:CUstream, captureStatus_out:c.POINTER[CUstreamCaptureStatus], id_out:c.POINTER[cuuint64_t], graph_out:c.POINTER[CUgraph], dependencies_out:c.POINTER[c.POINTER[CUgraphNode]], numDependencies_out:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUgraphNode], size_t, ctypes.c_uint32) +def cuStreamUpdateCaptureDependencies_ptsz(hStream:CUstream, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, size_t, ctypes.c_uint32) +def cuStreamAttachMemAsync_ptsz(hStream:CUstream, dptr:CUdeviceptr, length:size_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream) +def cuStreamQuery_ptsz(hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream) +def cuStreamSynchronize_ptsz(hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream) +def cuStreamDestroy_v2(hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstream) +def cuStreamCopyAttributes_ptsz(dst:CUstream, src:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstreamAttrID, c.POINTER[CUstreamAttrValue]) +def cuStreamGetAttribute_ptsz(hStream:CUstream, attr:CUstreamAttrID, value_out:c.POINTER[CUstreamAttrValue]) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstreamAttrID, c.POINTER[CUstreamAttrValue]) +def cuStreamSetAttribute_ptsz(hStream:CUstream, attr:CUstreamAttrID, value:c.POINTER[CUstreamAttrValue]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUevent], ctypes.c_uint32) +def cuEventCreate(phEvent:c.POINTER[CUevent], Flags:int) -> CUresult: ... +@dll.bind(CUresult, CUevent, CUstream) +def cuEventRecord_ptsz(hEvent:CUevent, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUevent, CUstream, ctypes.c_uint32) +def cuEventRecordWithFlags_ptsz(hEvent:CUevent, hStream:CUstream, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUevent) +def cuEventQuery(hEvent:CUevent) -> CUresult: ... +@dll.bind(CUresult, CUevent) +def cuEventSynchronize(hEvent:CUevent) -> CUresult: ... +@dll.bind(CUresult, CUevent) +def cuEventDestroy_v2(hEvent:CUevent) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_float], CUevent, CUevent) +def cuEventElapsedTime(pMilliseconds:c.POINTER[ctypes.c_float], hStart:CUevent, hEnd:CUevent) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUexternalMemory], c.POINTER[CUDA_EXTERNAL_MEMORY_HANDLE_DESC]) +def cuImportExternalMemory(extMem_out:c.POINTER[CUexternalMemory], memHandleDesc:c.POINTER[CUDA_EXTERNAL_MEMORY_HANDLE_DESC]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], CUexternalMemory, c.POINTER[CUDA_EXTERNAL_MEMORY_BUFFER_DESC]) +def cuExternalMemoryGetMappedBuffer(devPtr:c.POINTER[CUdeviceptr], extMem:CUexternalMemory, bufferDesc:c.POINTER[CUDA_EXTERNAL_MEMORY_BUFFER_DESC]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmipmappedArray], CUexternalMemory, c.POINTER[CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC]) +def cuExternalMemoryGetMappedMipmappedArray(mipmap:c.POINTER[CUmipmappedArray], extMem:CUexternalMemory, mipmapDesc:c.POINTER[CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC]) -> CUresult: ... +@dll.bind(CUresult, CUexternalMemory) +def cuDestroyExternalMemory(extMem:CUexternalMemory) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUexternalSemaphore], c.POINTER[CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC]) +def cuImportExternalSemaphore(extSem_out:c.POINTER[CUexternalSemaphore], semHandleDesc:c.POINTER[CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUexternalSemaphore], c.POINTER[CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS], ctypes.c_uint32, CUstream) +def cuSignalExternalSemaphoresAsync_ptsz(extSemArray:c.POINTER[CUexternalSemaphore], paramsArray:c.POINTER[CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS], numExtSems:int, stream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUexternalSemaphore], c.POINTER[CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS], ctypes.c_uint32, CUstream) +def cuWaitExternalSemaphoresAsync_ptsz(extSemArray:c.POINTER[CUexternalSemaphore], paramsArray:c.POINTER[CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS], numExtSems:int, stream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUexternalSemaphore) +def cuDestroyExternalSemaphore(extSem:CUexternalSemaphore) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint32_t, ctypes.c_uint32) +def cuStreamWaitValue32_v2_ptsz(stream:CUstream, addr:CUdeviceptr, value:cuuint32_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint64_t, ctypes.c_uint32) +def cuStreamWaitValue64_v2_ptsz(stream:CUstream, addr:CUdeviceptr, value:cuuint64_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint32_t, ctypes.c_uint32) +def cuStreamWriteValue32_v2_ptsz(stream:CUstream, addr:CUdeviceptr, value:cuuint32_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint64_t, ctypes.c_uint32) +def cuStreamWriteValue64_v2_ptsz(stream:CUstream, addr:CUdeviceptr, value:cuuint64_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, ctypes.c_uint32, c.POINTER[CUstreamBatchMemOpParams], ctypes.c_uint32) +def cuStreamBatchMemOp_v2_ptsz(stream:CUstream, count:int, paramArray:c.POINTER[CUstreamBatchMemOpParams], flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUfunction_attribute, CUfunction) +def cuFuncGetAttribute(pi:c.POINTER[ctypes.c_int32], attrib:CUfunction_attribute, hfunc:CUfunction) -> CUresult: ... +@dll.bind(CUresult, CUfunction, CUfunction_attribute, ctypes.c_int32) +def cuFuncSetAttribute(hfunc:CUfunction, attrib:CUfunction_attribute, value:int) -> CUresult: ... +@dll.bind(CUresult, CUfunction, CUfunc_cache) +def cuFuncSetCacheConfig(hfunc:CUfunction, config:CUfunc_cache) -> CUresult: ... +@dll.bind(CUresult, CUfunction, CUsharedconfig) +def cuFuncSetSharedMemConfig(hfunc:CUfunction, config:CUsharedconfig) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmodule], CUfunction) +def cuFuncGetModule(hmod:c.POINTER[CUmodule], hfunc:CUfunction) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, CUstream, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p]) +def cuLaunchKernel_ptsz(f:CUfunction, gridDimX:int, gridDimY:int, gridDimZ:int, blockDimX:int, blockDimY:int, blockDimZ:int, sharedMemBytes:int, hStream:CUstream, kernelParams:c.POINTER[ctypes.c_void_p], extra:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUlaunchConfig], CUfunction, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p]) +def cuLaunchKernelEx_ptsz(config:c.POINTER[CUlaunchConfig], f:CUfunction, kernelParams:c.POINTER[ctypes.c_void_p], extra:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, CUstream, c.POINTER[ctypes.c_void_p]) +def cuLaunchCooperativeKernel_ptsz(f:CUfunction, gridDimX:int, gridDimY:int, gridDimZ:int, blockDimX:int, blockDimY:int, blockDimZ:int, sharedMemBytes:int, hStream:CUstream, kernelParams:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_LAUNCH_PARAMS], ctypes.c_uint32, ctypes.c_uint32) +def cuLaunchCooperativeKernelMultiDevice(launchParamsList:c.POINTER[CUDA_LAUNCH_PARAMS], numDevices:int, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUhostFn, ctypes.c_void_p) +def cuLaunchHostFunc_ptsz(hStream:CUstream, fn:CUhostFn, userData:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32) +def cuFuncSetBlockShape(hfunc:CUfunction, x:int, y:int, z:int) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_uint32) +def cuFuncSetSharedSize(hfunc:CUfunction, bytes:int) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_uint32) +def cuParamSetSize(hfunc:CUfunction, numbytes:int) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_int32, ctypes.c_uint32) +def cuParamSeti(hfunc:CUfunction, offset:int, value:int) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_int32, ctypes.c_float) +def cuParamSetf(hfunc:CUfunction, offset:int, value:float) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_int32, ctypes.c_void_p, ctypes.c_uint32) +def cuParamSetv(hfunc:CUfunction, offset:int, ptr:ctypes.c_void_p, numbytes:int) -> CUresult: ... +@dll.bind(CUresult, CUfunction) +def cuLaunch(f:CUfunction) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_int32, ctypes.c_int32) +def cuLaunchGrid(f:CUfunction, grid_width:int, grid_height:int) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_int32, ctypes.c_int32, CUstream) +def cuLaunchGridAsync(f:CUfunction, grid_width:int, grid_height:int, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_int32, CUtexref) +def cuParamSetTexRef(hfunc:CUfunction, texunit:int, hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraph], ctypes.c_uint32) +def cuGraphCreate(phGraph:c.POINTER[CUgraph], flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_KERNEL_NODE_PARAMS]) +def cuGraphAddKernelNode_v2(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, nodeParams:c.POINTER[CUDA_KERNEL_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_KERNEL_NODE_PARAMS]) +def cuGraphKernelNodeGetParams_v2(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_KERNEL_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_KERNEL_NODE_PARAMS]) +def cuGraphKernelNodeSetParams_v2(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_KERNEL_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_MEMCPY3D], CUcontext) +def cuGraphAddMemcpyNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, copyParams:c.POINTER[CUDA_MEMCPY3D], ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_MEMCPY3D]) +def cuGraphMemcpyNodeGetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_MEMCPY3D]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_MEMCPY3D]) +def cuGraphMemcpyNodeSetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_MEMCPY3D]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_MEMSET_NODE_PARAMS], CUcontext) +def cuGraphAddMemsetNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, memsetParams:c.POINTER[CUDA_MEMSET_NODE_PARAMS], ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_MEMSET_NODE_PARAMS]) +def cuGraphMemsetNodeGetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_MEMSET_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_MEMSET_NODE_PARAMS]) +def cuGraphMemsetNodeSetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_MEMSET_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_HOST_NODE_PARAMS]) +def cuGraphAddHostNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, nodeParams:c.POINTER[CUDA_HOST_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_HOST_NODE_PARAMS]) +def cuGraphHostNodeGetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_HOST_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_HOST_NODE_PARAMS]) +def cuGraphHostNodeSetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_HOST_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, CUgraph) +def cuGraphAddChildGraphNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, childGraph:CUgraph) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUgraph]) +def cuGraphChildGraphNodeGetGraph(hNode:CUgraphNode, phGraph:c.POINTER[CUgraph]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t) +def cuGraphAddEmptyNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, CUevent) +def cuGraphAddEventRecordNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, event:CUevent) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUevent]) +def cuGraphEventRecordNodeGetEvent(hNode:CUgraphNode, event_out:c.POINTER[CUevent]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, CUevent) +def cuGraphEventRecordNodeSetEvent(hNode:CUgraphNode, event:CUevent) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, CUevent) +def cuGraphAddEventWaitNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, event:CUevent) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUevent]) +def cuGraphEventWaitNodeGetEvent(hNode:CUgraphNode, event_out:c.POINTER[CUevent]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, CUevent) +def cuGraphEventWaitNodeSetEvent(hNode:CUgraphNode, event:CUevent) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_EXT_SEM_SIGNAL_NODE_PARAMS]) +def cuGraphAddExternalSemaphoresSignalNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, nodeParams:c.POINTER[CUDA_EXT_SEM_SIGNAL_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_EXT_SEM_SIGNAL_NODE_PARAMS]) +def cuGraphExternalSemaphoresSignalNodeGetParams(hNode:CUgraphNode, params_out:c.POINTER[CUDA_EXT_SEM_SIGNAL_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_EXT_SEM_SIGNAL_NODE_PARAMS]) +def cuGraphExternalSemaphoresSignalNodeSetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_EXT_SEM_SIGNAL_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_EXT_SEM_WAIT_NODE_PARAMS]) +def cuGraphAddExternalSemaphoresWaitNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, nodeParams:c.POINTER[CUDA_EXT_SEM_WAIT_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_EXT_SEM_WAIT_NODE_PARAMS]) +def cuGraphExternalSemaphoresWaitNodeGetParams(hNode:CUgraphNode, params_out:c.POINTER[CUDA_EXT_SEM_WAIT_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_EXT_SEM_WAIT_NODE_PARAMS]) +def cuGraphExternalSemaphoresWaitNodeSetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_EXT_SEM_WAIT_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_BATCH_MEM_OP_NODE_PARAMS]) +def cuGraphAddBatchMemOpNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, nodeParams:c.POINTER[CUDA_BATCH_MEM_OP_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_BATCH_MEM_OP_NODE_PARAMS]) +def cuGraphBatchMemOpNodeGetParams(hNode:CUgraphNode, nodeParams_out:c.POINTER[CUDA_BATCH_MEM_OP_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_BATCH_MEM_OP_NODE_PARAMS]) +def cuGraphBatchMemOpNodeSetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_BATCH_MEM_OP_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[CUDA_BATCH_MEM_OP_NODE_PARAMS]) +def cuGraphExecBatchMemOpNodeSetParams(hGraphExec:CUgraphExec, hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_BATCH_MEM_OP_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_MEM_ALLOC_NODE_PARAMS]) +def cuGraphAddMemAllocNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, nodeParams:c.POINTER[CUDA_MEM_ALLOC_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_MEM_ALLOC_NODE_PARAMS]) +def cuGraphMemAllocNodeGetParams(hNode:CUgraphNode, params_out:c.POINTER[CUDA_MEM_ALLOC_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, CUdeviceptr) +def cuGraphAddMemFreeNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, dptr:CUdeviceptr) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUdeviceptr]) +def cuGraphMemFreeNodeGetParams(hNode:CUgraphNode, dptr_out:c.POINTER[CUdeviceptr]) -> CUresult: ... +@dll.bind(CUresult, CUdevice) +def cuDeviceGraphMemTrim(device:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUdevice, CUgraphMem_attribute, ctypes.c_void_p) +def cuDeviceGetGraphMemAttribute(device:CUdevice, attr:CUgraphMem_attribute, value:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, CUdevice, CUgraphMem_attribute, ctypes.c_void_p) +def cuDeviceSetGraphMemAttribute(device:CUdevice, attr:CUgraphMem_attribute, value:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraph], CUgraph) +def cuGraphClone(phGraphClone:c.POINTER[CUgraph], originalGraph:CUgraph) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraphNode, CUgraph) +def cuGraphNodeFindInClone(phNode:c.POINTER[CUgraphNode], hOriginalNode:CUgraphNode, hClonedGraph:CUgraph) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUgraphNodeType]) +def cuGraphNodeGetType(hNode:CUgraphNode, type:c.POINTER[CUgraphNodeType]) -> CUresult: ... +@dll.bind(CUresult, CUgraph, c.POINTER[CUgraphNode], c.POINTER[size_t]) +def cuGraphGetNodes(hGraph:CUgraph, nodes:c.POINTER[CUgraphNode], numNodes:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, CUgraph, c.POINTER[CUgraphNode], c.POINTER[size_t]) +def cuGraphGetRootNodes(hGraph:CUgraph, rootNodes:c.POINTER[CUgraphNode], numRootNodes:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, CUgraph, c.POINTER[CUgraphNode], c.POINTER[CUgraphNode], c.POINTER[size_t]) +def cuGraphGetEdges(hGraph:CUgraph, _from:c.POINTER[CUgraphNode], to:c.POINTER[CUgraphNode], numEdges:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUgraphNode], c.POINTER[size_t]) +def cuGraphNodeGetDependencies(hNode:CUgraphNode, dependencies:c.POINTER[CUgraphNode], numDependencies:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUgraphNode], c.POINTER[size_t]) +def cuGraphNodeGetDependentNodes(hNode:CUgraphNode, dependentNodes:c.POINTER[CUgraphNode], numDependentNodes:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, CUgraph, c.POINTER[CUgraphNode], c.POINTER[CUgraphNode], size_t) +def cuGraphAddDependencies(hGraph:CUgraph, _from:c.POINTER[CUgraphNode], to:c.POINTER[CUgraphNode], numDependencies:size_t) -> CUresult: ... +@dll.bind(CUresult, CUgraph, c.POINTER[CUgraphNode], c.POINTER[CUgraphNode], size_t) +def cuGraphRemoveDependencies(hGraph:CUgraph, _from:c.POINTER[CUgraphNode], to:c.POINTER[CUgraphNode], numDependencies:size_t) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode) +def cuGraphDestroyNode(hNode:CUgraphNode) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphExec], CUgraph, ctypes.c_uint64) +def cuGraphInstantiateWithFlags(phGraphExec:c.POINTER[CUgraphExec], hGraph:CUgraph, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphExec], CUgraph, c.POINTER[CUDA_GRAPH_INSTANTIATE_PARAMS]) +def cuGraphInstantiateWithParams_ptsz(phGraphExec:c.POINTER[CUgraphExec], hGraph:CUgraph, instantiateParams:c.POINTER[CUDA_GRAPH_INSTANTIATE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, c.POINTER[cuuint64_t]) +def cuGraphExecGetFlags(hGraphExec:CUgraphExec, flags:c.POINTER[cuuint64_t]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[CUDA_KERNEL_NODE_PARAMS]) +def cuGraphExecKernelNodeSetParams_v2(hGraphExec:CUgraphExec, hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_KERNEL_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[CUDA_MEMCPY3D], CUcontext) +def cuGraphExecMemcpyNodeSetParams(hGraphExec:CUgraphExec, hNode:CUgraphNode, copyParams:c.POINTER[CUDA_MEMCPY3D], ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[CUDA_MEMSET_NODE_PARAMS], CUcontext) +def cuGraphExecMemsetNodeSetParams(hGraphExec:CUgraphExec, hNode:CUgraphNode, memsetParams:c.POINTER[CUDA_MEMSET_NODE_PARAMS], ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[CUDA_HOST_NODE_PARAMS]) +def cuGraphExecHostNodeSetParams(hGraphExec:CUgraphExec, hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_HOST_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, CUgraph) +def cuGraphExecChildGraphNodeSetParams(hGraphExec:CUgraphExec, hNode:CUgraphNode, childGraph:CUgraph) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, CUevent) +def cuGraphExecEventRecordNodeSetEvent(hGraphExec:CUgraphExec, hNode:CUgraphNode, event:CUevent) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, CUevent) +def cuGraphExecEventWaitNodeSetEvent(hGraphExec:CUgraphExec, hNode:CUgraphNode, event:CUevent) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[CUDA_EXT_SEM_SIGNAL_NODE_PARAMS]) +def cuGraphExecExternalSemaphoresSignalNodeSetParams(hGraphExec:CUgraphExec, hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_EXT_SEM_SIGNAL_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[CUDA_EXT_SEM_WAIT_NODE_PARAMS]) +def cuGraphExecExternalSemaphoresWaitNodeSetParams(hGraphExec:CUgraphExec, hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_EXT_SEM_WAIT_NODE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, ctypes.c_uint32) +def cuGraphNodeSetEnabled(hGraphExec:CUgraphExec, hNode:CUgraphNode, isEnabled:int) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[ctypes.c_uint32]) +def cuGraphNodeGetEnabled(hGraphExec:CUgraphExec, hNode:CUgraphNode, isEnabled:c.POINTER[ctypes.c_uint32]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUstream) +def cuGraphUpload_ptsz(hGraphExec:CUgraphExec, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUstream) +def cuGraphLaunch_ptsz(hGraphExec:CUgraphExec, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec) +def cuGraphExecDestroy(hGraphExec:CUgraphExec) -> CUresult: ... +@dll.bind(CUresult, CUgraph) +def cuGraphDestroy(hGraph:CUgraph) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraph, c.POINTER[CUgraphExecUpdateResultInfo]) +def cuGraphExecUpdate_v2(hGraphExec:CUgraphExec, hGraph:CUgraph, resultInfo:c.POINTER[CUgraphExecUpdateResultInfo]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, CUgraphNode) +def cuGraphKernelNodeCopyAttributes(dst:CUgraphNode, src:CUgraphNode) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, CUkernelNodeAttrID, c.POINTER[CUkernelNodeAttrValue]) +def cuGraphKernelNodeGetAttribute(hNode:CUgraphNode, attr:CUkernelNodeAttrID, value_out:c.POINTER[CUkernelNodeAttrValue]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, CUkernelNodeAttrID, c.POINTER[CUkernelNodeAttrValue]) +def cuGraphKernelNodeSetAttribute(hNode:CUgraphNode, attr:CUkernelNodeAttrID, value:c.POINTER[CUkernelNodeAttrValue]) -> CUresult: ... +@dll.bind(CUresult, CUgraph, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def cuGraphDebugDotPrint(hGraph:CUgraph, path:c.POINTER[ctypes.c_char], flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUuserObject], ctypes.c_void_p, CUhostFn, ctypes.c_uint32, ctypes.c_uint32) +def cuUserObjectCreate(object_out:c.POINTER[CUuserObject], ptr:ctypes.c_void_p, destroy:CUhostFn, initialRefcount:int, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUuserObject, ctypes.c_uint32) +def cuUserObjectRetain(object:CUuserObject, count:int) -> CUresult: ... +@dll.bind(CUresult, CUuserObject, ctypes.c_uint32) +def cuUserObjectRelease(object:CUuserObject, count:int) -> CUresult: ... +@dll.bind(CUresult, CUgraph, CUuserObject, ctypes.c_uint32, ctypes.c_uint32) +def cuGraphRetainUserObject(graph:CUgraph, object:CUuserObject, count:int, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUgraph, CUuserObject, ctypes.c_uint32) +def cuGraphReleaseUserObject(graph:CUgraph, object:CUuserObject, count:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUfunction, ctypes.c_int32, size_t) +def cuOccupancyMaxActiveBlocksPerMultiprocessor(numBlocks:c.POINTER[ctypes.c_int32], func:CUfunction, blockSize:int, dynamicSMemSize:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUfunction, ctypes.c_int32, size_t, ctypes.c_uint32) +def cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(numBlocks:c.POINTER[ctypes.c_int32], func:CUfunction, blockSize:int, dynamicSMemSize:size_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], CUfunction, CUoccupancyB2DSize, size_t, ctypes.c_int32) +def cuOccupancyMaxPotentialBlockSize(minGridSize:c.POINTER[ctypes.c_int32], blockSize:c.POINTER[ctypes.c_int32], func:CUfunction, blockSizeToDynamicSMemSize:CUoccupancyB2DSize, dynamicSMemSize:size_t, blockSizeLimit:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], CUfunction, CUoccupancyB2DSize, size_t, ctypes.c_int32, ctypes.c_uint32) +def cuOccupancyMaxPotentialBlockSizeWithFlags(minGridSize:c.POINTER[ctypes.c_int32], blockSize:c.POINTER[ctypes.c_int32], func:CUfunction, blockSizeToDynamicSMemSize:CUoccupancyB2DSize, dynamicSMemSize:size_t, blockSizeLimit:int, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[size_t], CUfunction, ctypes.c_int32, ctypes.c_int32) +def cuOccupancyAvailableDynamicSMemPerBlock(dynamicSmemSize:c.POINTER[size_t], func:CUfunction, numBlocks:int, blockSize:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUfunction, c.POINTER[CUlaunchConfig]) +def cuOccupancyMaxPotentialClusterSize(clusterSize:c.POINTER[ctypes.c_int32], func:CUfunction, config:c.POINTER[CUlaunchConfig]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUfunction, c.POINTER[CUlaunchConfig]) +def cuOccupancyMaxActiveClusters(numClusters:c.POINTER[ctypes.c_int32], func:CUfunction, config:c.POINTER[CUlaunchConfig]) -> CUresult: ... +@dll.bind(CUresult, CUtexref, CUarray, ctypes.c_uint32) +def cuTexRefSetArray(hTexRef:CUtexref, hArray:CUarray, Flags:int) -> CUresult: ... +@dll.bind(CUresult, CUtexref, CUmipmappedArray, ctypes.c_uint32) +def cuTexRefSetMipmappedArray(hTexRef:CUtexref, hMipmappedArray:CUmipmappedArray, Flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[size_t], CUtexref, CUdeviceptr, size_t) +def cuTexRefSetAddress_v2(ByteOffset:c.POINTER[size_t], hTexRef:CUtexref, dptr:CUdeviceptr, bytes:size_t) -> CUresult: ... +@dll.bind(CUresult, CUtexref, c.POINTER[CUDA_ARRAY_DESCRIPTOR], CUdeviceptr, size_t) +def cuTexRefSetAddress2D_v3(hTexRef:CUtexref, desc:c.POINTER[CUDA_ARRAY_DESCRIPTOR], dptr:CUdeviceptr, Pitch:size_t) -> CUresult: ... +@dll.bind(CUresult, CUtexref, CUarray_format, ctypes.c_int32) +def cuTexRefSetFormat(hTexRef:CUtexref, fmt:CUarray_format, NumPackedComponents:int) -> CUresult: ... +@dll.bind(CUresult, CUtexref, ctypes.c_int32, CUaddress_mode) +def cuTexRefSetAddressMode(hTexRef:CUtexref, dim:int, am:CUaddress_mode) -> CUresult: ... +@dll.bind(CUresult, CUtexref, CUfilter_mode) +def cuTexRefSetFilterMode(hTexRef:CUtexref, fm:CUfilter_mode) -> CUresult: ... +@dll.bind(CUresult, CUtexref, CUfilter_mode) +def cuTexRefSetMipmapFilterMode(hTexRef:CUtexref, fm:CUfilter_mode) -> CUresult: ... +@dll.bind(CUresult, CUtexref, ctypes.c_float) +def cuTexRefSetMipmapLevelBias(hTexRef:CUtexref, bias:float) -> CUresult: ... +@dll.bind(CUresult, CUtexref, ctypes.c_float, ctypes.c_float) +def cuTexRefSetMipmapLevelClamp(hTexRef:CUtexref, minMipmapLevelClamp:float, maxMipmapLevelClamp:float) -> CUresult: ... +@dll.bind(CUresult, CUtexref, ctypes.c_uint32) +def cuTexRefSetMaxAnisotropy(hTexRef:CUtexref, maxAniso:int) -> CUresult: ... +@dll.bind(CUresult, CUtexref, c.POINTER[ctypes.c_float]) +def cuTexRefSetBorderColor(hTexRef:CUtexref, pBorderColor:c.POINTER[ctypes.c_float]) -> CUresult: ... +@dll.bind(CUresult, CUtexref, ctypes.c_uint32) +def cuTexRefSetFlags(hTexRef:CUtexref, Flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], CUtexref) +def cuTexRefGetAddress_v2(pdptr:c.POINTER[CUdeviceptr], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], CUtexref) +def cuTexRefGetArray(phArray:c.POINTER[CUarray], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmipmappedArray], CUtexref) +def cuTexRefGetMipmappedArray(phMipmappedArray:c.POINTER[CUmipmappedArray], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUaddress_mode], CUtexref, ctypes.c_int32) +def cuTexRefGetAddressMode(pam:c.POINTER[CUaddress_mode], hTexRef:CUtexref, dim:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUfilter_mode], CUtexref) +def cuTexRefGetFilterMode(pfm:c.POINTER[CUfilter_mode], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray_format], c.POINTER[ctypes.c_int32], CUtexref) +def cuTexRefGetFormat(pFormat:c.POINTER[CUarray_format], pNumChannels:c.POINTER[ctypes.c_int32], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUfilter_mode], CUtexref) +def cuTexRefGetMipmapFilterMode(pfm:c.POINTER[CUfilter_mode], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_float], CUtexref) +def cuTexRefGetMipmapLevelBias(pbias:c.POINTER[ctypes.c_float], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_float], c.POINTER[ctypes.c_float], CUtexref) +def cuTexRefGetMipmapLevelClamp(pminMipmapLevelClamp:c.POINTER[ctypes.c_float], pmaxMipmapLevelClamp:c.POINTER[ctypes.c_float], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUtexref) +def cuTexRefGetMaxAnisotropy(pmaxAniso:c.POINTER[ctypes.c_int32], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_float], CUtexref) +def cuTexRefGetBorderColor(pBorderColor:c.POINTER[ctypes.c_float], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_uint32], CUtexref) +def cuTexRefGetFlags(pFlags:c.POINTER[ctypes.c_uint32], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUtexref]) +def cuTexRefCreate(pTexRef:c.POINTER[CUtexref]) -> CUresult: ... +@dll.bind(CUresult, CUtexref) +def cuTexRefDestroy(hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, CUsurfref, CUarray, ctypes.c_uint32) +def cuSurfRefSetArray(hSurfRef:CUsurfref, hArray:CUarray, Flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], CUsurfref) +def cuSurfRefGetArray(phArray:c.POINTER[CUarray], hSurfRef:CUsurfref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUtexObject], c.POINTER[CUDA_RESOURCE_DESC], c.POINTER[CUDA_TEXTURE_DESC], c.POINTER[CUDA_RESOURCE_VIEW_DESC]) +def cuTexObjectCreate(pTexObject:c.POINTER[CUtexObject], pResDesc:c.POINTER[CUDA_RESOURCE_DESC], pTexDesc:c.POINTER[CUDA_TEXTURE_DESC], pResViewDesc:c.POINTER[CUDA_RESOURCE_VIEW_DESC]) -> CUresult: ... +@dll.bind(CUresult, CUtexObject) +def cuTexObjectDestroy(texObject:CUtexObject) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_RESOURCE_DESC], CUtexObject) +def cuTexObjectGetResourceDesc(pResDesc:c.POINTER[CUDA_RESOURCE_DESC], texObject:CUtexObject) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_TEXTURE_DESC], CUtexObject) +def cuTexObjectGetTextureDesc(pTexDesc:c.POINTER[CUDA_TEXTURE_DESC], texObject:CUtexObject) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_RESOURCE_VIEW_DESC], CUtexObject) +def cuTexObjectGetResourceViewDesc(pResViewDesc:c.POINTER[CUDA_RESOURCE_VIEW_DESC], texObject:CUtexObject) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUsurfObject], c.POINTER[CUDA_RESOURCE_DESC]) +def cuSurfObjectCreate(pSurfObject:c.POINTER[CUsurfObject], pResDesc:c.POINTER[CUDA_RESOURCE_DESC]) -> CUresult: ... +@dll.bind(CUresult, CUsurfObject) +def cuSurfObjectDestroy(surfObject:CUsurfObject) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_RESOURCE_DESC], CUsurfObject) +def cuSurfObjectGetResourceDesc(pResDesc:c.POINTER[CUDA_RESOURCE_DESC], surfObject:CUsurfObject) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUtensorMap], CUtensorMapDataType, cuuint32_t, ctypes.c_void_p, c.POINTER[cuuint64_t], c.POINTER[cuuint64_t], c.POINTER[cuuint32_t], c.POINTER[cuuint32_t], CUtensorMapInterleave, CUtensorMapSwizzle, CUtensorMapL2promotion, CUtensorMapFloatOOBfill) +def cuTensorMapEncodeTiled(tensorMap:c.POINTER[CUtensorMap], tensorDataType:CUtensorMapDataType, tensorRank:cuuint32_t, globalAddress:ctypes.c_void_p, globalDim:c.POINTER[cuuint64_t], globalStrides:c.POINTER[cuuint64_t], boxDim:c.POINTER[cuuint32_t], elementStrides:c.POINTER[cuuint32_t], interleave:CUtensorMapInterleave, swizzle:CUtensorMapSwizzle, l2Promotion:CUtensorMapL2promotion, oobFill:CUtensorMapFloatOOBfill) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUtensorMap], CUtensorMapDataType, cuuint32_t, ctypes.c_void_p, c.POINTER[cuuint64_t], c.POINTER[cuuint64_t], c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], cuuint32_t, cuuint32_t, c.POINTER[cuuint32_t], CUtensorMapInterleave, CUtensorMapSwizzle, CUtensorMapL2promotion, CUtensorMapFloatOOBfill) +def cuTensorMapEncodeIm2col(tensorMap:c.POINTER[CUtensorMap], tensorDataType:CUtensorMapDataType, tensorRank:cuuint32_t, globalAddress:ctypes.c_void_p, globalDim:c.POINTER[cuuint64_t], globalStrides:c.POINTER[cuuint64_t], pixelBoxLowerCorner:c.POINTER[ctypes.c_int32], pixelBoxUpperCorner:c.POINTER[ctypes.c_int32], channelsPerPixel:cuuint32_t, pixelsPerColumn:cuuint32_t, elementStrides:c.POINTER[cuuint32_t], interleave:CUtensorMapInterleave, swizzle:CUtensorMapSwizzle, l2Promotion:CUtensorMapL2promotion, oobFill:CUtensorMapFloatOOBfill) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUtensorMap], ctypes.c_void_p) +def cuTensorMapReplaceAddress(tensorMap:c.POINTER[CUtensorMap], globalAddress:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUdevice, CUdevice) +def cuDeviceCanAccessPeer(canAccessPeer:c.POINTER[ctypes.c_int32], dev:CUdevice, peerDev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUcontext, ctypes.c_uint32) +def cuCtxEnablePeerAccess(peerContext:CUcontext, Flags:int) -> CUresult: ... +@dll.bind(CUresult, CUcontext) +def cuCtxDisablePeerAccess(peerContext:CUcontext) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_int32], CUdevice_P2PAttribute, CUdevice, CUdevice) +def cuDeviceGetP2PAttribute(value:c.POINTER[ctypes.c_int32], attrib:CUdevice_P2PAttribute, srcDevice:CUdevice, dstDevice:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUgraphicsResource) +def cuGraphicsUnregisterResource(resource:CUgraphicsResource) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], CUgraphicsResource, ctypes.c_uint32, ctypes.c_uint32) +def cuGraphicsSubResourceGetMappedArray(pArray:c.POINTER[CUarray], resource:CUgraphicsResource, arrayIndex:int, mipLevel:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUmipmappedArray], CUgraphicsResource) +def cuGraphicsResourceGetMappedMipmappedArray(pMipmappedArray:c.POINTER[CUmipmappedArray], resource:CUgraphicsResource) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], c.POINTER[size_t], CUgraphicsResource) +def cuGraphicsResourceGetMappedPointer_v2(pDevPtr:c.POINTER[CUdeviceptr], pSize:c.POINTER[size_t], resource:CUgraphicsResource) -> CUresult: ... +@dll.bind(CUresult, CUgraphicsResource, ctypes.c_uint32) +def cuGraphicsResourceSetMapFlags_v2(resource:CUgraphicsResource, flags:int) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_uint32, c.POINTER[CUgraphicsResource], CUstream) +def cuGraphicsMapResources_ptsz(count:int, resources:c.POINTER[CUgraphicsResource], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_uint32, c.POINTER[CUgraphicsResource], CUstream) +def cuGraphicsUnmapResources_ptsz(count:int, resources:c.POINTER[CUgraphicsResource], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_void_p], ctypes.c_int32, cuuint64_t, c.POINTER[CUdriverProcAddressQueryResult]) +def cuGetProcAddress_v2(symbol:c.POINTER[ctypes.c_char], pfn:c.POINTER[ctypes.c_void_p], cudaVersion:int, flags:cuuint64_t, symbolStatus:c.POINTER[CUdriverProcAddressQueryResult]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_void_p], c.POINTER[CUuuid]) +def cuGetExportTable(ppExportTable:c.POINTER[ctypes.c_void_p], pExportTableId:c.POINTER[CUuuid]) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, size_t, ctypes.c_uint32) +def cuMemHostRegister(p:ctypes.c_void_p, bytesize:size_t, Flags:int) -> CUresult: ... +@dll.bind(CUresult, CUgraphicsResource, ctypes.c_uint32) +def cuGraphicsResourceSetMapFlags(resource:CUgraphicsResource, flags:int) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_uint32, c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p], c.POINTER[CUlinkState]) +def cuLinkCreate(numOptions:int, options:c.POINTER[CUjit_option], optionValues:c.POINTER[ctypes.c_void_p], stateOut:c.POINTER[CUlinkState]) -> CUresult: ... +@dll.bind(CUresult, CUlinkState, CUjitInputType, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p]) +def cuLinkAddData(state:CUlinkState, type:CUjitInputType, data:ctypes.c_void_p, size:size_t, name:c.POINTER[ctypes.c_char], numOptions:int, options:c.POINTER[CUjit_option], optionValues:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, CUlinkState, CUjitInputType, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[CUjit_option], c.POINTER[ctypes.c_void_p]) +def cuLinkAddFile(state:CUlinkState, type:CUjitInputType, path:c.POINTER[ctypes.c_char], numOptions:int, options:c.POINTER[CUjit_option], optionValues:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, CUtexref, c.POINTER[CUDA_ARRAY_DESCRIPTOR], CUdeviceptr, size_t) +def cuTexRefSetAddress2D_v2(hTexRef:CUtexref, desc:c.POINTER[CUDA_ARRAY_DESCRIPTOR], dptr:CUdeviceptr, Pitch:size_t) -> CUresult: ... +CUdeviceptr_v1: TypeAlias = ctypes.c_uint32 +@c.record +class struct_CUDA_MEMCPY2D_v1_st(c.Struct): + SIZE = 96 + srcXInBytes: int + srcY: int + srcMemoryType: int + srcHost: ctypes.c_void_p + srcDevice: int + srcArray: c.POINTER[struct_CUarray_st] + srcPitch: int + dstXInBytes: int + dstY: int + dstMemoryType: int + dstHost: ctypes.c_void_p + dstDevice: int + dstArray: c.POINTER[struct_CUarray_st] + dstPitch: int + WidthInBytes: int + Height: int +struct_CUDA_MEMCPY2D_v1_st.register_fields([('srcXInBytes', ctypes.c_uint32, 0), ('srcY', ctypes.c_uint32, 4), ('srcMemoryType', CUmemorytype, 8), ('srcHost', ctypes.c_void_p, 16), ('srcDevice', CUdeviceptr_v1, 24), ('srcArray', CUarray, 32), ('srcPitch', ctypes.c_uint32, 40), ('dstXInBytes', ctypes.c_uint32, 44), ('dstY', ctypes.c_uint32, 48), ('dstMemoryType', CUmemorytype, 52), ('dstHost', ctypes.c_void_p, 56), ('dstDevice', CUdeviceptr_v1, 64), ('dstArray', CUarray, 72), ('dstPitch', ctypes.c_uint32, 80), ('WidthInBytes', ctypes.c_uint32, 84), ('Height', ctypes.c_uint32, 88)]) +CUDA_MEMCPY2D_v1: TypeAlias = struct_CUDA_MEMCPY2D_v1_st +@c.record +class struct_CUDA_MEMCPY3D_v1_st(c.Struct): + SIZE = 144 + srcXInBytes: int + srcY: int + srcZ: int + srcLOD: int + srcMemoryType: int + srcHost: ctypes.c_void_p + srcDevice: int + srcArray: c.POINTER[struct_CUarray_st] + reserved0: ctypes.c_void_p + srcPitch: int + srcHeight: int + dstXInBytes: int + dstY: int + dstZ: int + dstLOD: int + dstMemoryType: int + dstHost: ctypes.c_void_p + dstDevice: int + dstArray: c.POINTER[struct_CUarray_st] + reserved1: ctypes.c_void_p + dstPitch: int + dstHeight: int + WidthInBytes: int + Height: int + Depth: int +struct_CUDA_MEMCPY3D_v1_st.register_fields([('srcXInBytes', ctypes.c_uint32, 0), ('srcY', ctypes.c_uint32, 4), ('srcZ', ctypes.c_uint32, 8), ('srcLOD', ctypes.c_uint32, 12), ('srcMemoryType', CUmemorytype, 16), ('srcHost', ctypes.c_void_p, 24), ('srcDevice', CUdeviceptr_v1, 32), ('srcArray', CUarray, 40), ('reserved0', ctypes.c_void_p, 48), ('srcPitch', ctypes.c_uint32, 56), ('srcHeight', ctypes.c_uint32, 60), ('dstXInBytes', ctypes.c_uint32, 64), ('dstY', ctypes.c_uint32, 68), ('dstZ', ctypes.c_uint32, 72), ('dstLOD', ctypes.c_uint32, 76), ('dstMemoryType', CUmemorytype, 80), ('dstHost', ctypes.c_void_p, 88), ('dstDevice', CUdeviceptr_v1, 96), ('dstArray', CUarray, 104), ('reserved1', ctypes.c_void_p, 112), ('dstPitch', ctypes.c_uint32, 120), ('dstHeight', ctypes.c_uint32, 124), ('WidthInBytes', ctypes.c_uint32, 128), ('Height', ctypes.c_uint32, 132), ('Depth', ctypes.c_uint32, 136)]) +CUDA_MEMCPY3D_v1: TypeAlias = struct_CUDA_MEMCPY3D_v1_st +@c.record +class struct_CUDA_ARRAY_DESCRIPTOR_v1_st(c.Struct): + SIZE = 16 + Width: int + Height: int + Format: int + NumChannels: int +struct_CUDA_ARRAY_DESCRIPTOR_v1_st.register_fields([('Width', ctypes.c_uint32, 0), ('Height', ctypes.c_uint32, 4), ('Format', CUarray_format, 8), ('NumChannels', ctypes.c_uint32, 12)]) +CUDA_ARRAY_DESCRIPTOR_v1: TypeAlias = struct_CUDA_ARRAY_DESCRIPTOR_v1_st +@c.record +class struct_CUDA_ARRAY3D_DESCRIPTOR_v1_st(c.Struct): + SIZE = 24 + Width: int + Height: int + Depth: int + Format: int + NumChannels: int + Flags: int +struct_CUDA_ARRAY3D_DESCRIPTOR_v1_st.register_fields([('Width', ctypes.c_uint32, 0), ('Height', ctypes.c_uint32, 4), ('Depth', ctypes.c_uint32, 8), ('Format', CUarray_format, 12), ('NumChannels', ctypes.c_uint32, 16), ('Flags', ctypes.c_uint32, 20)]) +CUDA_ARRAY3D_DESCRIPTOR_v1: TypeAlias = struct_CUDA_ARRAY3D_DESCRIPTOR_v1_st +@dll.bind(CUresult, c.POINTER[ctypes.c_uint32], CUdevice) +def cuDeviceTotalMem(bytes:c.POINTER[ctypes.c_uint32], dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUcontext], ctypes.c_uint32, CUdevice) +def cuCtxCreate(pctx:c.POINTER[CUcontext], flags:int, dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr_v1], c.POINTER[ctypes.c_uint32], CUmodule, c.POINTER[ctypes.c_char]) +def cuModuleGetGlobal(dptr:c.POINTER[CUdeviceptr_v1], bytes:c.POINTER[ctypes.c_uint32], hmod:CUmodule, name:c.POINTER[ctypes.c_char]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def cuMemGetInfo(free:c.POINTER[ctypes.c_uint32], total:c.POINTER[ctypes.c_uint32]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr_v1], ctypes.c_uint32) +def cuMemAlloc(dptr:c.POINTER[CUdeviceptr_v1], bytesize:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr_v1], c.POINTER[ctypes.c_uint32], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32) +def cuMemAllocPitch(dptr:c.POINTER[CUdeviceptr_v1], pPitch:c.POINTER[ctypes.c_uint32], WidthInBytes:int, Height:int, ElementSizeBytes:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1) +def cuMemFree(dptr:CUdeviceptr_v1) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr_v1], c.POINTER[ctypes.c_uint32], CUdeviceptr_v1) +def cuMemGetAddressRange(pbase:c.POINTER[CUdeviceptr_v1], psize:c.POINTER[ctypes.c_uint32], dptr:CUdeviceptr_v1) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_void_p], ctypes.c_uint32) +def cuMemAllocHost(pp:c.POINTER[ctypes.c_void_p], bytesize:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr_v1], ctypes.c_void_p, ctypes.c_uint32) +def cuMemHostGetDevicePointer(pdptr:c.POINTER[CUdeviceptr_v1], p:ctypes.c_void_p, Flags:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, ctypes.c_void_p, ctypes.c_uint32) +def cuMemcpyHtoD(dstDevice:CUdeviceptr_v1, srcHost:ctypes.c_void_p, ByteCount:int) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUdeviceptr_v1, ctypes.c_uint32) +def cuMemcpyDtoH(dstHost:ctypes.c_void_p, srcDevice:CUdeviceptr_v1, ByteCount:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, CUdeviceptr_v1, ctypes.c_uint32) +def cuMemcpyDtoD(dstDevice:CUdeviceptr_v1, srcDevice:CUdeviceptr_v1, ByteCount:int) -> CUresult: ... +@dll.bind(CUresult, CUarray, ctypes.c_uint32, CUdeviceptr_v1, ctypes.c_uint32) +def cuMemcpyDtoA(dstArray:CUarray, dstOffset:int, srcDevice:CUdeviceptr_v1, ByteCount:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, CUarray, ctypes.c_uint32, ctypes.c_uint32) +def cuMemcpyAtoD(dstDevice:CUdeviceptr_v1, srcArray:CUarray, srcOffset:int, ByteCount:int) -> CUresult: ... +@dll.bind(CUresult, CUarray, ctypes.c_uint32, ctypes.c_void_p, ctypes.c_uint32) +def cuMemcpyHtoA(dstArray:CUarray, dstOffset:int, srcHost:ctypes.c_void_p, ByteCount:int) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUarray, ctypes.c_uint32, ctypes.c_uint32) +def cuMemcpyAtoH(dstHost:ctypes.c_void_p, srcArray:CUarray, srcOffset:int, ByteCount:int) -> CUresult: ... +@dll.bind(CUresult, CUarray, ctypes.c_uint32, CUarray, ctypes.c_uint32, ctypes.c_uint32) +def cuMemcpyAtoA(dstArray:CUarray, dstOffset:int, srcArray:CUarray, srcOffset:int, ByteCount:int) -> CUresult: ... +@dll.bind(CUresult, CUarray, ctypes.c_uint32, ctypes.c_void_p, ctypes.c_uint32, CUstream) +def cuMemcpyHtoAAsync(dstArray:CUarray, dstOffset:int, srcHost:ctypes.c_void_p, ByteCount:int, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUarray, ctypes.c_uint32, ctypes.c_uint32, CUstream) +def cuMemcpyAtoHAsync(dstHost:ctypes.c_void_p, srcArray:CUarray, srcOffset:int, ByteCount:int, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D_v1]) +def cuMemcpy2D(pCopy:c.POINTER[CUDA_MEMCPY2D_v1]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D_v1]) +def cuMemcpy2DUnaligned(pCopy:c.POINTER[CUDA_MEMCPY2D_v1]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D_v1]) +def cuMemcpy3D(pCopy:c.POINTER[CUDA_MEMCPY3D_v1]) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, ctypes.c_void_p, ctypes.c_uint32, CUstream) +def cuMemcpyHtoDAsync(dstDevice:CUdeviceptr_v1, srcHost:ctypes.c_void_p, ByteCount:int, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUdeviceptr_v1, ctypes.c_uint32, CUstream) +def cuMemcpyDtoHAsync(dstHost:ctypes.c_void_p, srcDevice:CUdeviceptr_v1, ByteCount:int, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, CUdeviceptr_v1, ctypes.c_uint32, CUstream) +def cuMemcpyDtoDAsync(dstDevice:CUdeviceptr_v1, srcDevice:CUdeviceptr_v1, ByteCount:int, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D_v1], CUstream) +def cuMemcpy2DAsync(pCopy:c.POINTER[CUDA_MEMCPY2D_v1], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D_v1], CUstream) +def cuMemcpy3DAsync(pCopy:c.POINTER[CUDA_MEMCPY3D_v1], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, ctypes.c_ubyte, ctypes.c_uint32) +def cuMemsetD8(dstDevice:CUdeviceptr_v1, uc:int, N:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, ctypes.c_uint16, ctypes.c_uint32) +def cuMemsetD16(dstDevice:CUdeviceptr_v1, us:int, N:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, ctypes.c_uint32, ctypes.c_uint32) +def cuMemsetD32(dstDevice:CUdeviceptr_v1, ui:int, N:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, ctypes.c_uint32, ctypes.c_ubyte, ctypes.c_uint32, ctypes.c_uint32) +def cuMemsetD2D8(dstDevice:CUdeviceptr_v1, dstPitch:int, uc:int, Width:int, Height:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, ctypes.c_uint32, ctypes.c_uint16, ctypes.c_uint32, ctypes.c_uint32) +def cuMemsetD2D16(dstDevice:CUdeviceptr_v1, dstPitch:int, us:int, Width:int, Height:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr_v1, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32) +def cuMemsetD2D32(dstDevice:CUdeviceptr_v1, dstPitch:int, ui:int, Width:int, Height:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], c.POINTER[CUDA_ARRAY_DESCRIPTOR_v1]) +def cuArrayCreate(pHandle:c.POINTER[CUarray], pAllocateArray:c.POINTER[CUDA_ARRAY_DESCRIPTOR_v1]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_ARRAY_DESCRIPTOR_v1], CUarray) +def cuArrayGetDescriptor(pArrayDescriptor:c.POINTER[CUDA_ARRAY_DESCRIPTOR_v1], hArray:CUarray) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarray], c.POINTER[CUDA_ARRAY3D_DESCRIPTOR_v1]) +def cuArray3DCreate(pHandle:c.POINTER[CUarray], pAllocateArray:c.POINTER[CUDA_ARRAY3D_DESCRIPTOR_v1]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_ARRAY3D_DESCRIPTOR_v1], CUarray) +def cuArray3DGetDescriptor(pArrayDescriptor:c.POINTER[CUDA_ARRAY3D_DESCRIPTOR_v1], hArray:CUarray) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_uint32], CUtexref, CUdeviceptr_v1, ctypes.c_uint32) +def cuTexRefSetAddress(ByteOffset:c.POINTER[ctypes.c_uint32], hTexRef:CUtexref, dptr:CUdeviceptr_v1, bytes:int) -> CUresult: ... +@dll.bind(CUresult, CUtexref, c.POINTER[CUDA_ARRAY_DESCRIPTOR_v1], CUdeviceptr_v1, ctypes.c_uint32) +def cuTexRefSetAddress2D(hTexRef:CUtexref, desc:c.POINTER[CUDA_ARRAY_DESCRIPTOR_v1], dptr:CUdeviceptr_v1, Pitch:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr_v1], CUtexref) +def cuTexRefGetAddress(pdptr:c.POINTER[CUdeviceptr_v1], hTexRef:CUtexref) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr_v1], c.POINTER[ctypes.c_uint32], CUgraphicsResource) +def cuGraphicsResourceGetMappedPointer(pDevPtr:c.POINTER[CUdeviceptr_v1], pSize:c.POINTER[ctypes.c_uint32], resource:CUgraphicsResource) -> CUresult: ... +@dll.bind(CUresult, CUcontext) +def cuCtxDestroy(ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUcontext]) +def cuCtxPopCurrent(pctx:c.POINTER[CUcontext]) -> CUresult: ... +@dll.bind(CUresult, CUcontext) +def cuCtxPushCurrent(ctx:CUcontext) -> CUresult: ... +@dll.bind(CUresult, CUstream) +def cuStreamDestroy(hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUevent) +def cuEventDestroy(hEvent:CUevent) -> CUresult: ... +@dll.bind(CUresult, CUdevice) +def cuDevicePrimaryCtxRelease(dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUdevice) +def cuDevicePrimaryCtxReset(dev:CUdevice) -> CUresult: ... +@dll.bind(CUresult, CUdevice, ctypes.c_uint32) +def cuDevicePrimaryCtxSetFlags(dev:CUdevice, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_void_p, size_t) +def cuMemcpyHtoD_v2(dstDevice:CUdeviceptr, srcHost:ctypes.c_void_p, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUdeviceptr, size_t) +def cuMemcpyDtoH_v2(dstHost:ctypes.c_void_p, srcDevice:CUdeviceptr, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUdeviceptr, size_t) +def cuMemcpyDtoD_v2(dstDevice:CUdeviceptr, srcDevice:CUdeviceptr, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUarray, size_t, CUdeviceptr, size_t) +def cuMemcpyDtoA_v2(dstArray:CUarray, dstOffset:size_t, srcDevice:CUdeviceptr, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUarray, size_t, size_t) +def cuMemcpyAtoD_v2(dstDevice:CUdeviceptr, srcArray:CUarray, srcOffset:size_t, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUarray, size_t, ctypes.c_void_p, size_t) +def cuMemcpyHtoA_v2(dstArray:CUarray, dstOffset:size_t, srcHost:ctypes.c_void_p, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUarray, size_t, size_t) +def cuMemcpyAtoH_v2(dstHost:ctypes.c_void_p, srcArray:CUarray, srcOffset:size_t, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUarray, size_t, CUarray, size_t, size_t) +def cuMemcpyAtoA_v2(dstArray:CUarray, dstOffset:size_t, srcArray:CUarray, srcOffset:size_t, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUarray, size_t, ctypes.c_void_p, size_t, CUstream) +def cuMemcpyHtoAAsync_v2(dstArray:CUarray, dstOffset:size_t, srcHost:ctypes.c_void_p, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUarray, size_t, size_t, CUstream) +def cuMemcpyAtoHAsync_v2(dstHost:ctypes.c_void_p, srcArray:CUarray, srcOffset:size_t, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D]) +def cuMemcpy2D_v2(pCopy:c.POINTER[CUDA_MEMCPY2D]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D]) +def cuMemcpy2DUnaligned_v2(pCopy:c.POINTER[CUDA_MEMCPY2D]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D]) +def cuMemcpy3D_v2(pCopy:c.POINTER[CUDA_MEMCPY3D]) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_void_p, size_t, CUstream) +def cuMemcpyHtoDAsync_v2(dstDevice:CUdeviceptr, srcHost:ctypes.c_void_p, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_void_p, CUdeviceptr, size_t, CUstream) +def cuMemcpyDtoHAsync_v2(dstHost:ctypes.c_void_p, srcDevice:CUdeviceptr, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUdeviceptr, size_t, CUstream) +def cuMemcpyDtoDAsync_v2(dstDevice:CUdeviceptr, srcDevice:CUdeviceptr, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY2D], CUstream) +def cuMemcpy2DAsync_v2(pCopy:c.POINTER[CUDA_MEMCPY2D], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D], CUstream) +def cuMemcpy3DAsync_v2(pCopy:c.POINTER[CUDA_MEMCPY3D], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_ubyte, size_t) +def cuMemsetD8_v2(dstDevice:CUdeviceptr, uc:int, N:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_uint16, size_t) +def cuMemsetD16_v2(dstDevice:CUdeviceptr, us:int, N:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_uint32, size_t) +def cuMemsetD32_v2(dstDevice:CUdeviceptr, ui:int, N:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_ubyte, size_t, size_t) +def cuMemsetD2D8_v2(dstDevice:CUdeviceptr, dstPitch:size_t, uc:int, Width:size_t, Height:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_uint16, size_t, size_t) +def cuMemsetD2D16_v2(dstDevice:CUdeviceptr, dstPitch:size_t, us:int, Width:size_t, Height:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_uint32, size_t, size_t) +def cuMemsetD2D32_v2(dstDevice:CUdeviceptr, dstPitch:size_t, ui:int, Width:size_t, Height:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUdeviceptr, size_t) +def cuMemcpy(dst:CUdeviceptr, src:CUdeviceptr, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUdeviceptr, size_t, CUstream) +def cuMemcpyAsync(dst:CUdeviceptr, src:CUdeviceptr, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUcontext, CUdeviceptr, CUcontext, size_t) +def cuMemcpyPeer(dstDevice:CUdeviceptr, dstContext:CUcontext, srcDevice:CUdeviceptr, srcContext:CUcontext, ByteCount:size_t) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUcontext, CUdeviceptr, CUcontext, size_t, CUstream) +def cuMemcpyPeerAsync(dstDevice:CUdeviceptr, dstContext:CUcontext, srcDevice:CUdeviceptr, srcContext:CUcontext, ByteCount:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D_PEER]) +def cuMemcpy3DPeer(pCopy:c.POINTER[CUDA_MEMCPY3D_PEER]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUDA_MEMCPY3D_PEER], CUstream) +def cuMemcpy3DPeerAsync(pCopy:c.POINTER[CUDA_MEMCPY3D_PEER], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_ubyte, size_t, CUstream) +def cuMemsetD8Async(dstDevice:CUdeviceptr, uc:int, N:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_uint16, size_t, CUstream) +def cuMemsetD16Async(dstDevice:CUdeviceptr, us:int, N:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, ctypes.c_uint32, size_t, CUstream) +def cuMemsetD32Async(dstDevice:CUdeviceptr, ui:int, N:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_ubyte, size_t, size_t, CUstream) +def cuMemsetD2D8Async(dstDevice:CUdeviceptr, dstPitch:size_t, uc:int, Width:size_t, Height:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_uint16, size_t, size_t, CUstream) +def cuMemsetD2D16Async(dstDevice:CUdeviceptr, dstPitch:size_t, us:int, Width:size_t, Height:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, ctypes.c_uint32, size_t, size_t, CUstream) +def cuMemsetD2D32Async(dstDevice:CUdeviceptr, dstPitch:size_t, ui:int, Width:size_t, Height:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[ctypes.c_int32]) +def cuStreamGetPriority(hStream:CUstream, priority:c.POINTER[ctypes.c_int32]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[ctypes.c_uint64]) +def cuStreamGetId(hStream:CUstream, streamId:c.POINTER[ctypes.c_uint64]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[ctypes.c_uint32]) +def cuStreamGetFlags(hStream:CUstream, flags:c.POINTER[ctypes.c_uint32]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUcontext]) +def cuStreamGetCtx(hStream:CUstream, pctx:c.POINTER[CUcontext]) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUevent, ctypes.c_uint32) +def cuStreamWaitEvent(hStream:CUstream, hEvent:CUevent, Flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstreamCallback, ctypes.c_void_p, ctypes.c_uint32) +def cuStreamAddCallback(hStream:CUstream, callback:CUstreamCallback, userData:ctypes.c_void_p, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, size_t, ctypes.c_uint32) +def cuStreamAttachMemAsync(hStream:CUstream, dptr:CUdeviceptr, length:size_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream) +def cuStreamQuery(hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream) +def cuStreamSynchronize(hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUevent, CUstream) +def cuEventRecord(hEvent:CUevent, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUevent, CUstream, ctypes.c_uint32) +def cuEventRecordWithFlags(hEvent:CUevent, hStream:CUstream, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, CUstream, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p]) +def cuLaunchKernel(f:CUfunction, gridDimX:int, gridDimY:int, gridDimZ:int, blockDimX:int, blockDimY:int, blockDimZ:int, sharedMemBytes:int, hStream:CUstream, kernelParams:c.POINTER[ctypes.c_void_p], extra:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUlaunchConfig], CUfunction, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p]) +def cuLaunchKernelEx(config:c.POINTER[CUlaunchConfig], f:CUfunction, kernelParams:c.POINTER[ctypes.c_void_p], extra:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUhostFn, ctypes.c_void_p) +def cuLaunchHostFunc(hStream:CUstream, fn:CUhostFn, userData:ctypes.c_void_p) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_uint32, c.POINTER[CUgraphicsResource], CUstream) +def cuGraphicsMapResources(count:int, resources:c.POINTER[CUgraphicsResource], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, ctypes.c_uint32, c.POINTER[CUgraphicsResource], CUstream) +def cuGraphicsUnmapResources(count:int, resources:c.POINTER[CUgraphicsResource], hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint32_t, ctypes.c_uint32) +def cuStreamWriteValue32(stream:CUstream, addr:CUdeviceptr, value:cuuint32_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint32_t, ctypes.c_uint32) +def cuStreamWaitValue32(stream:CUstream, addr:CUdeviceptr, value:cuuint32_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint64_t, ctypes.c_uint32) +def cuStreamWriteValue64(stream:CUstream, addr:CUdeviceptr, value:cuuint64_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint64_t, ctypes.c_uint32) +def cuStreamWaitValue64(stream:CUstream, addr:CUdeviceptr, value:cuuint64_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, ctypes.c_uint32, c.POINTER[CUstreamBatchMemOpParams], ctypes.c_uint32) +def cuStreamBatchMemOp(stream:CUstream, count:int, paramArray:c.POINTER[CUstreamBatchMemOpParams], flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint32_t, ctypes.c_uint32) +def cuStreamWriteValue32_ptsz(stream:CUstream, addr:CUdeviceptr, value:cuuint32_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint32_t, ctypes.c_uint32) +def cuStreamWaitValue32_ptsz(stream:CUstream, addr:CUdeviceptr, value:cuuint32_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint64_t, ctypes.c_uint32) +def cuStreamWriteValue64_ptsz(stream:CUstream, addr:CUdeviceptr, value:cuuint64_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint64_t, ctypes.c_uint32) +def cuStreamWaitValue64_ptsz(stream:CUstream, addr:CUdeviceptr, value:cuuint64_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, ctypes.c_uint32, c.POINTER[CUstreamBatchMemOpParams], ctypes.c_uint32) +def cuStreamBatchMemOp_ptsz(stream:CUstream, count:int, paramArray:c.POINTER[CUstreamBatchMemOpParams], flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint32_t, ctypes.c_uint32) +def cuStreamWriteValue32_v2(stream:CUstream, addr:CUdeviceptr, value:cuuint32_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint32_t, ctypes.c_uint32) +def cuStreamWaitValue32_v2(stream:CUstream, addr:CUdeviceptr, value:cuuint32_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint64_t, ctypes.c_uint32) +def cuStreamWriteValue64_v2(stream:CUstream, addr:CUdeviceptr, value:cuuint64_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUdeviceptr, cuuint64_t, ctypes.c_uint32) +def cuStreamWaitValue64_v2(stream:CUstream, addr:CUdeviceptr, value:cuuint64_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, CUstream, ctypes.c_uint32, c.POINTER[CUstreamBatchMemOpParams], ctypes.c_uint32) +def cuStreamBatchMemOp_v2(stream:CUstream, count:int, paramArray:c.POINTER[CUstreamBatchMemOpParams], flags:int) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, size_t, CUdevice, CUstream) +def cuMemPrefetchAsync(devPtr:CUdeviceptr, count:size_t, dstDevice:CUdevice, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUfunction, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, CUstream, c.POINTER[ctypes.c_void_p]) +def cuLaunchCooperativeKernel(f:CUfunction, gridDimX:int, gridDimY:int, gridDimZ:int, blockDimX:int, blockDimY:int, blockDimZ:int, sharedMemBytes:int, hStream:CUstream, kernelParams:c.POINTER[ctypes.c_void_p]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUexternalSemaphore], c.POINTER[CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS], ctypes.c_uint32, CUstream) +def cuSignalExternalSemaphoresAsync(extSemArray:c.POINTER[CUexternalSemaphore], paramsArray:c.POINTER[CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS], numExtSems:int, stream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUexternalSemaphore], c.POINTER[CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS], ctypes.c_uint32, CUstream) +def cuWaitExternalSemaphoresAsync(extSemArray:c.POINTER[CUexternalSemaphore], paramsArray:c.POINTER[CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS], numExtSems:int, stream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream) +def cuStreamBeginCapture(hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream) +def cuStreamBeginCapture_ptsz(hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstreamCaptureMode) +def cuStreamBeginCapture_v2(hStream:CUstream, mode:CUstreamCaptureMode) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUgraph]) +def cuStreamEndCapture(hStream:CUstream, phGraph:c.POINTER[CUgraph]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUstreamCaptureStatus]) +def cuStreamIsCapturing(hStream:CUstream, captureStatus:c.POINTER[CUstreamCaptureStatus]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUstreamCaptureStatus], c.POINTER[cuuint64_t]) +def cuStreamGetCaptureInfo(hStream:CUstream, captureStatus_out:c.POINTER[CUstreamCaptureStatus], id_out:c.POINTER[cuuint64_t]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUstreamCaptureStatus], c.POINTER[cuuint64_t]) +def cuStreamGetCaptureInfo_ptsz(hStream:CUstream, captureStatus_out:c.POINTER[CUstreamCaptureStatus], id_out:c.POINTER[cuuint64_t]) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUstreamCaptureStatus], c.POINTER[cuuint64_t], c.POINTER[CUgraph], c.POINTER[c.POINTER[CUgraphNode]], c.POINTER[size_t]) +def cuStreamGetCaptureInfo_v2(hStream:CUstream, captureStatus_out:c.POINTER[CUstreamCaptureStatus], id_out:c.POINTER[cuuint64_t], graph_out:c.POINTER[CUgraph], dependencies_out:c.POINTER[c.POINTER[CUgraphNode]], numDependencies_out:c.POINTER[size_t]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphNode], CUgraph, c.POINTER[CUgraphNode], size_t, c.POINTER[CUDA_KERNEL_NODE_PARAMS_v1]) +def cuGraphAddKernelNode(phGraphNode:c.POINTER[CUgraphNode], hGraph:CUgraph, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, nodeParams:c.POINTER[CUDA_KERNEL_NODE_PARAMS_v1]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_KERNEL_NODE_PARAMS_v1]) +def cuGraphKernelNodeGetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_KERNEL_NODE_PARAMS_v1]) -> CUresult: ... +@dll.bind(CUresult, CUgraphNode, c.POINTER[CUDA_KERNEL_NODE_PARAMS_v1]) +def cuGraphKernelNodeSetParams(hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_KERNEL_NODE_PARAMS_v1]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraphNode, c.POINTER[CUDA_KERNEL_NODE_PARAMS_v1]) +def cuGraphExecKernelNodeSetParams(hGraphExec:CUgraphExec, hNode:CUgraphNode, nodeParams:c.POINTER[CUDA_KERNEL_NODE_PARAMS_v1]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphExec], CUgraph, c.POINTER[CUDA_GRAPH_INSTANTIATE_PARAMS]) +def cuGraphInstantiateWithParams(phGraphExec:c.POINTER[CUgraphExec], hGraph:CUgraph, instantiateParams:c.POINTER[CUDA_GRAPH_INSTANTIATE_PARAMS]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUgraph, c.POINTER[CUgraphNode], c.POINTER[CUgraphExecUpdateResult]) +def cuGraphExecUpdate(hGraphExec:CUgraphExec, hGraph:CUgraph, hErrorNode_out:c.POINTER[CUgraphNode], updateResult_out:c.POINTER[CUgraphExecUpdateResult]) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUstream) +def cuGraphUpload(hGraph:CUgraphExec, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUgraphExec, CUstream) +def cuGraphLaunch(hGraph:CUgraphExec, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstream) +def cuStreamCopyAttributes(dstStream:CUstream, srcStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstreamAttrID, c.POINTER[CUstreamAttrValue]) +def cuStreamGetAttribute(hStream:CUstream, attr:CUstreamAttrID, value:c.POINTER[CUstreamAttrValue]) -> CUresult: ... +@dll.bind(CUresult, CUstream, CUstreamAttrID, c.POINTER[CUstreamAttrValue]) +def cuStreamSetAttribute(hStream:CUstream, attr:CUstreamAttrID, param:c.POINTER[CUstreamAttrValue]) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], CUipcMemHandle, ctypes.c_uint32) +def cuIpcOpenMemHandle(pdptr:c.POINTER[CUdeviceptr], handle:CUipcMemHandle, Flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphExec], CUgraph, c.POINTER[CUgraphNode], c.POINTER[ctypes.c_char], size_t) +def cuGraphInstantiate(phGraphExec:c.POINTER[CUgraphExec], hGraph:CUgraph, phErrorNode:c.POINTER[CUgraphNode], logBuffer:c.POINTER[ctypes.c_char], bufferSize:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUgraphExec], CUgraph, c.POINTER[CUgraphNode], c.POINTER[ctypes.c_char], size_t) +def cuGraphInstantiate_v2(phGraphExec:c.POINTER[CUgraphExec], hGraph:CUgraph, phErrorNode:c.POINTER[CUgraphNode], logBuffer:c.POINTER[ctypes.c_char], bufferSize:size_t) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUarrayMapInfo], ctypes.c_uint32, CUstream) +def cuMemMapArrayAsync(mapInfoList:c.POINTER[CUarrayMapInfo], count:int, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUdeviceptr, CUstream) +def cuMemFreeAsync(dptr:CUdeviceptr, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], size_t, CUstream) +def cuMemAllocAsync(dptr:c.POINTER[CUdeviceptr], bytesize:size_t, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[CUdeviceptr], size_t, CUmemoryPool, CUstream) +def cuMemAllocFromPoolAsync(dptr:c.POINTER[CUdeviceptr], bytesize:size_t, pool:CUmemoryPool, hStream:CUstream) -> CUresult: ... +@dll.bind(CUresult, CUstream, c.POINTER[CUgraphNode], size_t, ctypes.c_uint32) +def cuStreamUpdateCaptureDependencies(hStream:CUstream, dependencies:c.POINTER[CUgraphNode], numDependencies:size_t, flags:int) -> CUresult: ... +@dll.bind(CUresult, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_void_p], ctypes.c_int32, cuuint64_t) +def cuGetProcAddress(symbol:c.POINTER[ctypes.c_char], pfn:c.POINTER[ctypes.c_void_p], cudaVersion:int, flags:cuuint64_t) -> CUresult: ... diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/ggml_common.py b/artifacts/package_runtime/tinygrad/runtime/autogen/ggml_common.py new file mode 100644 index 000000000..e549950bc --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/ggml_common.py @@ -0,0 +1,219 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +ggml_half: TypeAlias = ctypes.c_uint16 +ggml_half2: TypeAlias = ctypes.c_uint32 +@c.record +class block_q1_0(c.Struct): + SIZE = 18 + d: int + qs: c.Array[ctypes.c_ubyte, Literal[16]] +uint8_t: TypeAlias = ctypes.c_ubyte +block_q1_0.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint8_t, Literal[16]], 2)]) +@c.record +class block_q4_0(c.Struct): + SIZE = 18 + d: int + qs: c.Array[ctypes.c_ubyte, Literal[16]] +block_q4_0.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint8_t, Literal[16]], 2)]) +@c.record +class block_q4_1(c.Struct): + SIZE = 20 + d: int + m: int + dm: int + qs: c.Array[ctypes.c_ubyte, Literal[16]] +block_q4_1.register_fields([('d', ggml_half, 0), ('m', ggml_half, 2), ('dm', ggml_half2, 0), ('qs', c.Array[uint8_t, Literal[16]], 4)]) +@c.record +class block_mxfp4(c.Struct): + SIZE = 17 + e: int + qs: c.Array[ctypes.c_ubyte, Literal[16]] +block_mxfp4.register_fields([('e', uint8_t, 0), ('qs', c.Array[uint8_t, Literal[16]], 1)]) +@c.record +class block_nvfp4(c.Struct): + SIZE = 36 + d: c.Array[ctypes.c_ubyte, Literal[4]] + qs: c.Array[ctypes.c_ubyte, Literal[32]] +block_nvfp4.register_fields([('d', c.Array[uint8_t, Literal[4]], 0), ('qs', c.Array[uint8_t, Literal[32]], 4)]) +@c.record +class block_q5_0(c.Struct): + SIZE = 22 + d: int + qh: c.Array[ctypes.c_ubyte, Literal[4]] + qs: c.Array[ctypes.c_ubyte, Literal[16]] +block_q5_0.register_fields([('d', ggml_half, 0), ('qh', c.Array[uint8_t, Literal[4]], 2), ('qs', c.Array[uint8_t, Literal[16]], 6)]) +@c.record +class block_q5_1(c.Struct): + SIZE = 24 + d: int + m: int + dm: int + qh: c.Array[ctypes.c_ubyte, Literal[4]] + qs: c.Array[ctypes.c_ubyte, Literal[16]] +block_q5_1.register_fields([('d', ggml_half, 0), ('m', ggml_half, 2), ('dm', ggml_half2, 0), ('qh', c.Array[uint8_t, Literal[4]], 4), ('qs', c.Array[uint8_t, Literal[16]], 8)]) +@c.record +class block_q8_0(c.Struct): + SIZE = 34 + d: int + qs: c.Array[ctypes.c_byte, Literal[32]] +int8_t: TypeAlias = ctypes.c_byte +block_q8_0.register_fields([('d', ggml_half, 0), ('qs', c.Array[int8_t, Literal[32]], 2)]) +@c.record +class block_q8_1(c.Struct): + SIZE = 36 + d: int + s: int + ds: int + qs: c.Array[ctypes.c_byte, Literal[32]] +block_q8_1.register_fields([('d', ggml_half, 0), ('s', ggml_half, 2), ('ds', ggml_half2, 0), ('qs', c.Array[int8_t, Literal[32]], 4)]) +@c.record +class block_tq1_0(c.Struct): + SIZE = 54 + qs: c.Array[ctypes.c_ubyte, Literal[48]] + qh: c.Array[ctypes.c_ubyte, Literal[4]] + d: int +block_tq1_0.register_fields([('qs', c.Array[uint8_t, Literal[48]], 0), ('qh', c.Array[uint8_t, Literal[4]], 48), ('d', ggml_half, 52)]) +@c.record +class block_tq2_0(c.Struct): + SIZE = 66 + qs: c.Array[ctypes.c_ubyte, Literal[64]] + d: int +block_tq2_0.register_fields([('qs', c.Array[uint8_t, Literal[64]], 0), ('d', ggml_half, 64)]) +@c.record +class block_q2_K(c.Struct): + SIZE = 84 + scales: c.Array[ctypes.c_ubyte, Literal[16]] + qs: c.Array[ctypes.c_ubyte, Literal[64]] + d: int + dmin: int + dm: int +block_q2_K.register_fields([('scales', c.Array[uint8_t, Literal[16]], 0), ('qs', c.Array[uint8_t, Literal[64]], 16), ('d', ggml_half, 80), ('dmin', ggml_half, 82), ('dm', ggml_half2, 80)]) +@c.record +class block_q3_K(c.Struct): + SIZE = 110 + hmask: c.Array[ctypes.c_ubyte, Literal[32]] + qs: c.Array[ctypes.c_ubyte, Literal[64]] + scales: c.Array[ctypes.c_ubyte, Literal[12]] + d: int +block_q3_K.register_fields([('hmask', c.Array[uint8_t, Literal[32]], 0), ('qs', c.Array[uint8_t, Literal[64]], 32), ('scales', c.Array[uint8_t, Literal[12]], 96), ('d', ggml_half, 108)]) +@c.record +class block_q4_K(c.Struct): + SIZE = 144 + d: int + dmin: int + dm: int + scales: c.Array[ctypes.c_ubyte, Literal[12]] + qs: c.Array[ctypes.c_ubyte, Literal[128]] +block_q4_K.register_fields([('d', ggml_half, 0), ('dmin', ggml_half, 2), ('dm', ggml_half2, 0), ('scales', c.Array[uint8_t, Literal[12]], 4), ('qs', c.Array[uint8_t, Literal[128]], 16)]) +@c.record +class block_q5_K(c.Struct): + SIZE = 176 + d: int + dmin: int + dm: int + scales: c.Array[ctypes.c_ubyte, Literal[12]] + qh: c.Array[ctypes.c_ubyte, Literal[32]] + qs: c.Array[ctypes.c_ubyte, Literal[128]] +block_q5_K.register_fields([('d', ggml_half, 0), ('dmin', ggml_half, 2), ('dm', ggml_half2, 0), ('scales', c.Array[uint8_t, Literal[12]], 4), ('qh', c.Array[uint8_t, Literal[32]], 16), ('qs', c.Array[uint8_t, Literal[128]], 48)]) +@c.record +class block_q6_K(c.Struct): + SIZE = 210 + ql: c.Array[ctypes.c_ubyte, Literal[128]] + qh: c.Array[ctypes.c_ubyte, Literal[64]] + scales: c.Array[ctypes.c_byte, Literal[16]] + d: int +block_q6_K.register_fields([('ql', c.Array[uint8_t, Literal[128]], 0), ('qh', c.Array[uint8_t, Literal[64]], 128), ('scales', c.Array[int8_t, Literal[16]], 192), ('d', ggml_half, 208)]) +@c.record +class block_q8_K(c.Struct): + SIZE = 292 + d: float + qs: c.Array[ctypes.c_byte, Literal[256]] + bsums: c.Array[ctypes.c_int16, Literal[16]] +int16_t: TypeAlias = ctypes.c_int16 +block_q8_K.register_fields([('d', ctypes.c_float, 0), ('qs', c.Array[int8_t, Literal[256]], 4), ('bsums', c.Array[int16_t, Literal[16]], 260)]) +@c.record +class block_iq2_xxs(c.Struct): + SIZE = 66 + d: int + qs: c.Array[ctypes.c_uint16, Literal[32]] +uint16_t: TypeAlias = ctypes.c_uint16 +block_iq2_xxs.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint16_t, Literal[32]], 2)]) +@c.record +class block_iq2_xs(c.Struct): + SIZE = 74 + d: int + qs: c.Array[ctypes.c_uint16, Literal[32]] + scales: c.Array[ctypes.c_ubyte, Literal[8]] +block_iq2_xs.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint16_t, Literal[32]], 2), ('scales', c.Array[uint8_t, Literal[8]], 66)]) +@c.record +class block_iq2_s(c.Struct): + SIZE = 82 + d: int + qs: c.Array[ctypes.c_ubyte, Literal[64]] + qh: c.Array[ctypes.c_ubyte, Literal[8]] + scales: c.Array[ctypes.c_ubyte, Literal[8]] +block_iq2_s.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint8_t, Literal[64]], 2), ('qh', c.Array[uint8_t, Literal[8]], 66), ('scales', c.Array[uint8_t, Literal[8]], 74)]) +@c.record +class block_iq3_xxs(c.Struct): + SIZE = 98 + d: int + qs: c.Array[ctypes.c_ubyte, Literal[96]] +block_iq3_xxs.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint8_t, Literal[96]], 2)]) +@c.record +class block_iq3_s(c.Struct): + SIZE = 110 + d: int + qs: c.Array[ctypes.c_ubyte, Literal[64]] + qh: c.Array[ctypes.c_ubyte, Literal[8]] + signs: c.Array[ctypes.c_ubyte, Literal[32]] + scales: c.Array[ctypes.c_ubyte, Literal[4]] +block_iq3_s.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint8_t, Literal[64]], 2), ('qh', c.Array[uint8_t, Literal[8]], 66), ('signs', c.Array[uint8_t, Literal[32]], 74), ('scales', c.Array[uint8_t, Literal[4]], 106)]) +@c.record +class block_iq1_s(c.Struct): + SIZE = 50 + d: int + qs: c.Array[ctypes.c_ubyte, Literal[32]] + qh: c.Array[ctypes.c_uint16, Literal[8]] +block_iq1_s.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint8_t, Literal[32]], 2), ('qh', c.Array[uint16_t, Literal[8]], 34)]) +@c.record +class block_iq1_m(c.Struct): + SIZE = 56 + qs: c.Array[ctypes.c_ubyte, Literal[32]] + qh: c.Array[ctypes.c_ubyte, Literal[16]] + scales: c.Array[ctypes.c_ubyte, Literal[8]] +block_iq1_m.register_fields([('qs', c.Array[uint8_t, Literal[32]], 0), ('qh', c.Array[uint8_t, Literal[16]], 32), ('scales', c.Array[uint8_t, Literal[8]], 48)]) +@c.record +class iq1m_scale_t(c.Struct): + SIZE = 2 + f16: int + u16: int +iq1m_scale_t.register_fields([('f16', ggml_half, 0), ('u16', uint16_t, 0)]) +@c.record +class block_iq4_nl(c.Struct): + SIZE = 18 + d: int + qs: c.Array[ctypes.c_ubyte, Literal[16]] +block_iq4_nl.register_fields([('d', ggml_half, 0), ('qs', c.Array[uint8_t, Literal[16]], 2)]) +@c.record +class block_iq4_xs(c.Struct): + SIZE = 136 + d: int + scales_h: int + scales_l: c.Array[ctypes.c_ubyte, Literal[4]] + qs: c.Array[ctypes.c_ubyte, Literal[128]] +block_iq4_xs.register_fields([('d', ggml_half, 0), ('scales_h', uint16_t, 2), ('scales_l', c.Array[uint8_t, Literal[4]], 4), ('qs', c.Array[uint8_t, Literal[128]], 8)]) +kmask_iq2xs = (1,2,4,8,16,32,64,128,) +ksigns_iq2xs = (0,129,130,3,132,5,6,135,136,9,10,139,12,141,142,15,144,17,18,147,20,149,150,23,24,153,154,27,156,29,30,159,160,33,34,163,36,165,166,39,40,169,170,43,172,45,46,175,48,177,178,51,180,53,54,183,184,57,58,187,60,189,190,63,192,65,66,195,68,197,198,71,72,201,202,75,204,77,78,207,80,209,210,83,212,85,86,215,216,89,90,219,92,221,222,95,96,225,226,99,228,101,102,231,232,105,106,235,108,237,238,111,240,113,114,243,116,245,246,119,120,249,250,123,252,125,126,255,) +ksigns64 = (0x0000000000000000,0xff000000000000ff,0xff0000000000ff00,0x000000000000ffff,0xff00000000ff0000,0x0000000000ff00ff,0x0000000000ffff00,0xff00000000ffffff,0xff000000ff000000,0x00000000ff0000ff,0x00000000ff00ff00,0xff000000ff00ffff,0x00000000ffff0000,0xff000000ffff00ff,0xff000000ffffff00,0x00000000ffffffff,0xff0000ff00000000,0x000000ff000000ff,0x000000ff0000ff00,0xff0000ff0000ffff,0x000000ff00ff0000,0xff0000ff00ff00ff,0xff0000ff00ffff00,0x000000ff00ffffff,0x000000ffff000000,0xff0000ffff0000ff,0xff0000ffff00ff00,0x000000ffff00ffff,0xff0000ffffff0000,0x000000ffffff00ff,0x000000ffffffff00,0xff0000ffffffffff,0xff00ff0000000000,0x0000ff00000000ff,0x0000ff000000ff00,0xff00ff000000ffff,0x0000ff0000ff0000,0xff00ff0000ff00ff,0xff00ff0000ffff00,0x0000ff0000ffffff,0x0000ff00ff000000,0xff00ff00ff0000ff,0xff00ff00ff00ff00,0x0000ff00ff00ffff,0xff00ff00ffff0000,0x0000ff00ffff00ff,0x0000ff00ffffff00,0xff00ff00ffffffff,0x0000ffff00000000,0xff00ffff000000ff,0xff00ffff0000ff00,0x0000ffff0000ffff,0xff00ffff00ff0000,0x0000ffff00ff00ff,0x0000ffff00ffff00,0xff00ffff00ffffff,0xff00ffffff000000,0x0000ffffff0000ff,0x0000ffffff00ff00,0xff00ffffff00ffff,0x0000ffffffff0000,0xff00ffffffff00ff,0xff00ffffffffff00,0x0000ffffffffffff,0xffff000000000000,0x00ff0000000000ff,0x00ff00000000ff00,0xffff00000000ffff,0x00ff000000ff0000,0xffff000000ff00ff,0xffff000000ffff00,0x00ff000000ffffff,0x00ff0000ff000000,0xffff0000ff0000ff,0xffff0000ff00ff00,0x00ff0000ff00ffff,0xffff0000ffff0000,0x00ff0000ffff00ff,0x00ff0000ffffff00,0xffff0000ffffffff,0x00ff00ff00000000,0xffff00ff000000ff,0xffff00ff0000ff00,0x00ff00ff0000ffff,0xffff00ff00ff0000,0x00ff00ff00ff00ff,0x00ff00ff00ffff00,0xffff00ff00ffffff,0xffff00ffff000000,0x00ff00ffff0000ff,0x00ff00ffff00ff00,0xffff00ffff00ffff,0x00ff00ffffff0000,0xffff00ffffff00ff,0xffff00ffffffff00,0x00ff00ffffffffff,0x00ffff0000000000,0xffffff00000000ff,0xffffff000000ff00,0x00ffff000000ffff,0xffffff0000ff0000,0x00ffff0000ff00ff,0x00ffff0000ffff00,0xffffff0000ffffff,0xffffff00ff000000,0x00ffff00ff0000ff,0x00ffff00ff00ff00,0xffffff00ff00ffff,0x00ffff00ffff0000,0xffffff00ffff00ff,0xffffff00ffffff00,0x00ffff00ffffffff,0xffffffff00000000,0x00ffffff000000ff,0x00ffffff0000ff00,0xffffffff0000ffff,0x00ffffff00ff0000,0xffffffff00ff00ff,0xffffffff00ffff00,0x00ffffff00ffffff,0x00ffffffff000000,0xffffffffff0000ff,0xffffffffff00ff00,0x00ffffffff00ffff,0xffffffffffff0000,0x00ffffffffff00ff,0x00ffffffffffff00,0xffffffffffffffff,) +iq2xxs_grid = (0x0808080808080808,0x080808080808082b,0x0808080808081919,0x0808080808082b08,0x0808080808082b2b,0x0808080808190819,0x0808080808191908,0x08080808082b0808,0x08080808082b082b,0x08080808082b2b08,0x08080808082b2b2b,0x0808080819080819,0x0808080819081908,0x0808080819190808,0x0808080819192b08,0x08080808192b0819,0x08080808192b1908,0x080808082b080808,0x080808082b08082b,0x080808082b082b2b,0x080808082b2b082b,0x0808081908080819,0x0808081908081908,0x0808081908190808,0x0808081908191919,0x0808081919080808,0x080808192b081908,0x080808192b192b08,0x0808082b08080808,0x0808082b0808082b,0x0808082b082b082b,0x0808082b2b08082b,0x0808190808080819,0x0808190808081908,0x0808190808190808,0x08081908082b0819,0x08081908082b1908,0x0808190819080808,0x080819081908082b,0x0808190819082b08,0x08081908192b0808,0x080819082b080819,0x080819082b081908,0x080819082b190808,0x080819082b2b1908,0x0808191908080808,0x080819190808082b,0x0808191908082b08,0x08081919082b0808,0x080819191908192b,0x08081919192b2b19,0x080819192b080808,0x080819192b190819,0x0808192b08082b19,0x0808192b08190808,0x0808192b19080808,0x0808192b2b081908,0x0808192b2b2b1908,0x08082b0808080808,0x08082b0808081919,0x08082b0808082b08,0x08082b0808191908,0x08082b08082b2b08,0x08082b0819080819,0x08082b0819081908,0x08082b0819190808,0x08082b081919082b,0x08082b082b082b08,0x08082b1908081908,0x08082b1919080808,0x08082b2b0808082b,0x08082b2b08191908,0x0819080808080819,0x0819080808081908,0x0819080808190808,0x08190808082b0819,0x0819080819080808,0x08190808192b0808,0x081908082b081908,0x081908082b190808,0x081908082b191919,0x0819081908080808,0x0819081908082b08,0x08190819082b0808,0x0819081919190808,0x0819081919192b2b,0x081908192b080808,0x0819082b082b1908,0x0819082b19081919,0x0819190808080808,0x0819190808082b08,0x08191908082b0808,0x08191908082b1919,0x0819190819082b19,0x081919082b080808,0x0819191908192b08,0x08191919192b082b,0x0819192b08080808,0x0819192b0819192b,0x08192b0808080819,0x08192b0808081908,0x08192b0808190808,0x08192b0819080808,0x08192b082b080819,0x08192b1908080808,0x08192b1908081919,0x08192b192b2b0808,0x08192b2b19190819,0x082b080808080808,0x082b08080808082b,0x082b080808082b2b,0x082b080819081908,0x082b0808192b0819,0x082b08082b080808,0x082b08082b08082b,0x082b0819082b2b19,0x082b081919082b08,0x082b082b08080808,0x082b082b0808082b,0x082b190808080819,0x082b190808081908,0x082b190808190808,0x082b190819080808,0x082b19081919192b,0x082b191908080808,0x082b191919080819,0x082b1919192b1908,0x082b192b2b190808,0x082b2b0808082b08,0x082b2b08082b0808,0x082b2b082b191908,0x082b2b2b19081908,0x1908080808080819,0x1908080808081908,0x1908080808190808,0x1908080808192b08,0x19080808082b0819,0x19080808082b1908,0x1908080819080808,0x1908080819082b08,0x190808081919192b,0x19080808192b0808,0x190808082b080819,0x190808082b081908,0x190808082b190808,0x1908081908080808,0x19080819082b0808,0x19080819192b0819,0x190808192b080808,0x190808192b081919,0x1908082b08080819,0x1908082b08190808,0x1908082b19082b08,0x1908082b1919192b,0x1908082b192b2b08,0x1908190808080808,0x1908190808082b08,0x19081908082b0808,0x190819082b080808,0x190819082b192b19,0x190819190819082b,0x19081919082b1908,0x1908192b08080808,0x19082b0808080819,0x19082b0808081908,0x19082b0808190808,0x19082b0819080808,0x19082b0819081919,0x19082b1908080808,0x19082b1919192b08,0x19082b19192b0819,0x19082b192b08082b,0x19082b2b19081919,0x19082b2b2b190808,0x1919080808080808,0x1919080808082b08,0x1919080808190819,0x1919080808192b19,0x19190808082b0808,0x191908082b080808,0x191908082b082b08,0x1919081908081908,0x191908191908082b,0x191908192b2b1908,0x1919082b2b190819,0x191919082b190808,0x191919082b19082b,0x1919191908082b2b,0x1919192b08080819,0x1919192b19191908,0x19192b0808080808,0x19192b0808190819,0x19192b0808192b19,0x19192b08192b1908,0x19192b1919080808,0x19192b2b08082b08,0x192b080808081908,0x192b080808190808,0x192b080819080808,0x192b0808192b2b08,0x192b081908080808,0x192b081919191919,0x192b082b08192b08,0x192b082b192b0808,0x192b190808080808,0x192b190808081919,0x192b191908190808,0x192b19190819082b,0x192b19192b081908,0x192b2b081908082b,0x2b08080808080808,0x2b0808080808082b,0x2b08080808082b2b,0x2b08080819080819,0x2b0808082b08082b,0x2b08081908081908,0x2b08081908192b08,0x2b08081919080808,0x2b08082b08190819,0x2b08190808080819,0x2b08190808081908,0x2b08190808190808,0x2b08190808191919,0x2b08190819080808,0x2b081908192b0808,0x2b08191908080808,0x2b0819191908192b,0x2b0819192b191908,0x2b08192b08082b19,0x2b08192b19080808,0x2b08192b192b0808,0x2b082b080808082b,0x2b082b1908081908,0x2b082b2b08190819,0x2b19080808081908,0x2b19080808190808,0x2b190808082b1908,0x2b19080819080808,0x2b1908082b2b0819,0x2b1908190819192b,0x2b1908192b080808,0x2b19082b19081919,0x2b19190808080808,0x2b191908082b082b,0x2b19190819081908,0x2b19191919190819,0x2b192b082b080819,0x2b192b19082b0808,0x2b2b08080808082b,0x2b2b080819190808,0x2b2b08082b081919,0x2b2b081908082b19,0x2b2b082b08080808,0x2b2b190808192b08,0x2b2b2b0819190808,0x2b2b2b1908081908,) +iq2xs_grid = (0x0808080808080808,0x080808080808082b,0x0808080808081919,0x0808080808082b08,0x0808080808082b2b,0x0808080808190819,0x0808080808191908,0x080808080819192b,0x0808080808192b19,0x08080808082b0808,0x08080808082b082b,0x08080808082b1919,0x08080808082b2b08,0x0808080819080819,0x0808080819081908,0x080808081908192b,0x0808080819082b19,0x0808080819190808,0x080808081919082b,0x0808080819191919,0x0808080819192b08,0x08080808192b0819,0x08080808192b1908,0x080808082b080808,0x080808082b08082b,0x080808082b081919,0x080808082b082b08,0x080808082b190819,0x080808082b191908,0x080808082b192b19,0x080808082b2b0808,0x0808081908080819,0x0808081908081908,0x080808190808192b,0x0808081908082b19,0x0808081908190808,0x080808190819082b,0x0808081908191919,0x0808081908192b08,0x0808081908192b2b,0x08080819082b0819,0x08080819082b1908,0x0808081919080808,0x080808191908082b,0x0808081919081919,0x0808081919082b08,0x0808081919190819,0x0808081919191908,0x08080819192b0808,0x08080819192b2b08,0x080808192b080819,0x080808192b081908,0x080808192b190808,0x0808082b08080808,0x0808082b0808082b,0x0808082b08081919,0x0808082b08082b08,0x0808082b08190819,0x0808082b08191908,0x0808082b082b0808,0x0808082b19080819,0x0808082b19081908,0x0808082b19190808,0x0808082b19191919,0x0808082b2b080808,0x0808082b2b082b2b,0x0808190808080819,0x0808190808081908,0x080819080808192b,0x0808190808082b19,0x0808190808190808,0x080819080819082b,0x0808190808191919,0x0808190808192b08,0x08081908082b0819,0x08081908082b1908,0x0808190819080808,0x080819081908082b,0x0808190819081919,0x0808190819082b08,0x0808190819190819,0x0808190819191908,0x080819081919192b,0x08081908192b0808,0x080819082b080819,0x080819082b081908,0x080819082b190808,0x0808191908080808,0x080819190808082b,0x0808191908081919,0x0808191908082b08,0x0808191908190819,0x0808191908191908,0x08081919082b0808,0x0808191919080819,0x0808191919081908,0x0808191919190808,0x08081919192b0819,0x080819192b080808,0x0808192b08080819,0x0808192b08081908,0x0808192b08190808,0x0808192b082b192b,0x0808192b19080808,0x0808192b1908082b,0x0808192b2b081908,0x08082b0808080808,0x08082b080808082b,0x08082b0808081919,0x08082b0808082b08,0x08082b0808082b2b,0x08082b0808190819,0x08082b0808191908,0x08082b08082b0808,0x08082b08082b1919,0x08082b0819080819,0x08082b0819081908,0x08082b0819190808,0x08082b0819192b08,0x08082b082b080808,0x08082b082b2b0808,0x08082b082b2b2b2b,0x08082b1908080819,0x08082b1908081908,0x08082b1908190808,0x08082b1919080808,0x08082b192b080819,0x08082b192b082b19,0x08082b2b08080808,0x08082b2b082b0808,0x08082b2b082b2b08,0x08082b2b2b19192b,0x08082b2b2b2b0808,0x0819080808080819,0x0819080808081908,0x081908080808192b,0x0819080808082b19,0x0819080808190808,0x081908080819082b,0x0819080808191919,0x0819080808192b08,0x08190808082b0819,0x08190808082b1908,0x0819080819080808,0x081908081908082b,0x0819080819081919,0x0819080819082b08,0x0819080819190819,0x0819080819191908,0x08190808192b0808,0x08190808192b2b2b,0x081908082b080819,0x081908082b081908,0x081908082b190808,0x0819081908080808,0x081908190808082b,0x0819081908081919,0x0819081908082b08,0x0819081908190819,0x0819081908191908,0x08190819082b0808,0x0819081919080819,0x0819081919081908,0x0819081919190808,0x081908192b080808,0x081908192b191908,0x081908192b19192b,0x0819082b08080819,0x0819082b08081908,0x0819082b0808192b,0x0819082b08190808,0x0819082b19080808,0x0819082b192b0808,0x0819190808080808,0x081919080808082b,0x0819190808081919,0x0819190808082b08,0x0819190808190819,0x0819190808191908,0x08191908082b0808,0x0819190819080819,0x0819190819081908,0x0819190819082b19,0x0819190819190808,0x08191908192b1908,0x081919082b080808,0x0819191908080819,0x0819191908081908,0x0819191908190808,0x0819191919080808,0x0819192b08080808,0x0819192b08191908,0x0819192b19082b19,0x08192b0808080819,0x08192b0808081908,0x08192b0808190808,0x08192b080819082b,0x08192b0819080808,0x08192b0819191908,0x08192b082b08192b,0x08192b1908080808,0x08192b1908081919,0x08192b19192b192b,0x08192b2b19190819,0x08192b2b2b2b2b19,0x082b080808080808,0x082b08080808082b,0x082b080808081919,0x082b080808082b08,0x082b080808082b2b,0x082b080808190819,0x082b080808191908,0x082b0808082b0808,0x082b080819080819,0x082b080819081908,0x082b080819190808,0x082b08082b080808,0x082b08082b2b0808,0x082b081908080819,0x082b081908081908,0x082b081908190808,0x082b081919080808,0x082b081919082b08,0x082b0819192b1919,0x082b082b08080808,0x082b082b082b082b,0x082b082b2b080808,0x082b082b2b2b2b08,0x082b190808080819,0x082b190808081908,0x082b190808190808,0x082b1908082b2b19,0x082b190819080808,0x082b191908080808,0x082b191919080819,0x082b19191919082b,0x082b19192b192b19,0x082b192b08080819,0x082b192b08192b2b,0x082b192b2b2b192b,0x082b2b0808080808,0x082b2b0808082b08,0x082b2b0808082b2b,0x082b2b08082b0808,0x082b2b0819191919,0x082b2b082b082b08,0x082b2b082b2b082b,0x082b2b19192b2b08,0x082b2b192b190808,0x082b2b2b08082b08,0x082b2b2b082b0808,0x082b2b2b2b08082b,0x082b2b2b2b082b08,0x082b2b2b2b082b2b,0x1908080808080819,0x1908080808081908,0x190808080808192b,0x1908080808082b19,0x1908080808190808,0x190808080819082b,0x1908080808191919,0x1908080808192b08,0x19080808082b0819,0x19080808082b1908,0x1908080819080808,0x190808081908082b,0x1908080819081919,0x1908080819082b08,0x1908080819082b2b,0x1908080819190819,0x1908080819191908,0x19080808192b0808,0x19080808192b1919,0x190808082b080819,0x190808082b081908,0x190808082b190808,0x1908081908080808,0x190808190808082b,0x1908081908081919,0x1908081908082b08,0x1908081908190819,0x1908081908191908,0x19080819082b0808,0x1908081919080819,0x1908081919081908,0x1908081919190808,0x190808192b080808,0x190808192b081919,0x190808192b2b082b,0x1908082b08080819,0x1908082b08081908,0x1908082b08190808,0x1908082b0819082b,0x1908082b082b2b19,0x1908082b19080808,0x1908190808080808,0x190819080808082b,0x1908190808081919,0x1908190808082b08,0x1908190808190819,0x1908190808191908,0x1908190808192b19,0x19081908082b0808,0x1908190819080819,0x1908190819081908,0x1908190819190808,0x190819082b080808,0x190819082b191908,0x1908191908080819,0x1908191908081908,0x1908191908190808,0x19081919082b1908,0x1908191919080808,0x190819192b192b2b,0x1908192b08080808,0x1908192b08082b2b,0x1908192b19081908,0x1908192b19190808,0x19082b0808080819,0x19082b0808081908,0x19082b0808190808,0x19082b0819080808,0x19082b0819081919,0x19082b0819191908,0x19082b08192b082b,0x19082b1908080808,0x19082b1908190819,0x19082b1919081908,0x19082b1919190808,0x19082b19192b2b19,0x19082b2b08081908,0x1919080808080808,0x191908080808082b,0x1919080808081919,0x1919080808082b08,0x1919080808190819,0x1919080808191908,0x19190808082b0808,0x19190808082b2b08,0x1919080819080819,0x1919080819081908,0x1919080819190808,0x191908082b080808,0x1919081908080819,0x1919081908081908,0x1919081908190808,0x1919081908191919,0x1919081919080808,0x191908191908082b,0x1919082b08080808,0x1919082b19081908,0x1919082b2b2b2b2b,0x1919190808080819,0x1919190808081908,0x1919190808190808,0x19191908082b0819,0x1919190819080808,0x19191908192b0808,0x191919082b080819,0x191919082b2b0819,0x1919191908080808,0x1919191908082b08,0x191919192b080808,0x191919192b082b08,0x1919192b082b0819,0x1919192b192b2b08,0x1919192b2b2b0819,0x19192b0808080808,0x19192b0808191908,0x19192b0819080819,0x19192b0819190808,0x19192b082b192b19,0x19192b1908192b2b,0x19192b1919080808,0x19192b191908082b,0x19192b2b2b081919,0x192b080808080819,0x192b080808081908,0x192b080808190808,0x192b080819080808,0x192b080819191908,0x192b0808192b082b,0x192b08082b08192b,0x192b08082b2b2b19,0x192b081908080808,0x192b082b082b1908,0x192b082b19082b2b,0x192b082b2b19082b,0x192b190808080808,0x192b19080819192b,0x192b191908190808,0x192b191919080808,0x192b191919081919,0x192b19192b2b1908,0x192b2b0808080819,0x192b2b08192b2b2b,0x192b2b19082b1919,0x192b2b2b0808192b,0x192b2b2b19191908,0x192b2b2b192b082b,0x2b08080808080808,0x2b0808080808082b,0x2b08080808081919,0x2b08080808082b08,0x2b08080808190819,0x2b08080808191908,0x2b080808082b0808,0x2b080808082b2b2b,0x2b08080819080819,0x2b08080819081908,0x2b08080819190808,0x2b0808082b080808,0x2b0808082b08082b,0x2b0808082b2b2b08,0x2b0808082b2b2b2b,0x2b08081908080819,0x2b08081908081908,0x2b0808190808192b,0x2b08081908190808,0x2b08081919080808,0x2b08081919190819,0x2b08081919192b19,0x2b08082b08080808,0x2b08082b082b0808,0x2b08082b2b080808,0x2b08082b2b08082b,0x2b08082b2b2b0808,0x2b08082b2b2b2b08,0x2b08190808080819,0x2b08190808081908,0x2b08190808190808,0x2b0819080819082b,0x2b08190808191919,0x2b08190819080808,0x2b081908192b0808,0x2b0819082b082b19,0x2b08191908080808,0x2b08191919081908,0x2b0819192b2b1919,0x2b08192b08192b08,0x2b08192b192b2b2b,0x2b082b0808080808,0x2b082b0808082b08,0x2b082b08082b1919,0x2b082b0819192b2b,0x2b082b082b080808,0x2b082b082b08082b,0x2b082b082b2b2b08,0x2b082b190808192b,0x2b082b2b082b082b,0x2b082b2b2b080808,0x2b082b2b2b082b08,0x2b082b2b2b19192b,0x2b082b2b2b2b2b08,0x2b19080808080819,0x2b19080808081908,0x2b19080808190808,0x2b19080819080808,0x2b1908081919192b,0x2b1908082b081908,0x2b19081908080808,0x2b190819082b082b,0x2b190819192b1908,0x2b19082b1919192b,0x2b19082b2b082b19,0x2b19190808080808,0x2b19190808081919,0x2b19190819081908,0x2b19190819190808,0x2b19190819192b08,0x2b191919082b2b19,0x2b1919192b190808,0x2b1919192b19082b,0x2b19192b19080819,0x2b192b0819190819,0x2b192b082b2b192b,0x2b192b1919082b19,0x2b192b2b08191919,0x2b192b2b192b0808,0x2b2b080808080808,0x2b2b08080808082b,0x2b2b080808082b08,0x2b2b080808082b2b,0x2b2b0808082b0808,0x2b2b0808082b2b2b,0x2b2b08082b2b0808,0x2b2b081919190819,0x2b2b081919192b19,0x2b2b08192b2b192b,0x2b2b082b08080808,0x2b2b082b0808082b,0x2b2b082b08082b08,0x2b2b082b082b2b2b,0x2b2b082b2b080808,0x2b2b082b2b2b0808,0x2b2b190819080808,0x2b2b19082b191919,0x2b2b192b192b1919,0x2b2b192b2b192b08,0x2b2b2b0808082b2b,0x2b2b2b08082b0808,0x2b2b2b08082b082b,0x2b2b2b08082b2b08,0x2b2b2b082b2b0808,0x2b2b2b082b2b2b08,0x2b2b2b1908081908,0x2b2b2b192b081908,0x2b2b2b192b08192b,0x2b2b2b2b082b2b08,0x2b2b2b2b082b2b2b,0x2b2b2b2b2b190819,0x2b2b2b2b2b2b2b2b,) +iq2s_grid = (0x0808080808080808,0x080808080808082b,0x0808080808081919,0x0808080808082b08,0x0808080808082b2b,0x0808080808190819,0x0808080808191908,0x080808080819192b,0x0808080808192b19,0x08080808082b0808,0x08080808082b082b,0x08080808082b1919,0x08080808082b2b08,0x0808080819080819,0x0808080819081908,0x080808081908192b,0x0808080819082b19,0x0808080819190808,0x080808081919082b,0x0808080819191919,0x0808080819192b08,0x08080808192b0819,0x08080808192b1908,0x08080808192b192b,0x08080808192b2b19,0x080808082b080808,0x080808082b08082b,0x080808082b081919,0x080808082b082b08,0x080808082b190819,0x080808082b191908,0x080808082b2b0808,0x080808082b2b1919,0x080808082b2b2b2b,0x0808081908080819,0x0808081908081908,0x080808190808192b,0x0808081908082b19,0x0808081908190808,0x080808190819082b,0x0808081908191919,0x0808081908192b08,0x08080819082b0819,0x08080819082b1908,0x0808081919080808,0x080808191908082b,0x0808081919081919,0x0808081919082b08,0x0808081919190819,0x0808081919191908,0x080808191919192b,0x0808081919192b19,0x08080819192b0808,0x08080819192b1919,0x08080819192b2b08,0x080808192b080819,0x080808192b081908,0x080808192b190808,0x080808192b19082b,0x080808192b191919,0x080808192b2b0819,0x080808192b2b1908,0x0808082b08080808,0x0808082b0808082b,0x0808082b08081919,0x0808082b08082b08,0x0808082b08190819,0x0808082b08191908,0x0808082b082b0808,0x0808082b082b2b2b,0x0808082b19080819,0x0808082b19081908,0x0808082b1908192b,0x0808082b19082b19,0x0808082b19190808,0x0808082b19191919,0x0808082b2b080808,0x0808082b2b081919,0x0808082b2b082b2b,0x0808082b2b191908,0x0808082b2b2b082b,0x0808190808080819,0x0808190808081908,0x080819080808192b,0x0808190808082b19,0x0808190808190808,0x080819080819082b,0x0808190808191919,0x0808190808192b08,0x08081908082b0819,0x08081908082b1908,0x08081908082b192b,0x08081908082b2b19,0x0808190819080808,0x080819081908082b,0x0808190819081919,0x0808190819082b08,0x0808190819082b2b,0x0808190819190819,0x0808190819191908,0x080819081919192b,0x0808190819192b19,0x08081908192b0808,0x08081908192b082b,0x08081908192b1919,0x080819082b080819,0x080819082b081908,0x080819082b08192b,0x080819082b082b19,0x080819082b190808,0x080819082b191919,0x080819082b192b08,0x080819082b2b0819,0x080819082b2b1908,0x0808191908080808,0x080819190808082b,0x0808191908081919,0x0808191908082b08,0x0808191908082b2b,0x0808191908190819,0x0808191908191908,0x080819190819192b,0x0808191908192b19,0x08081919082b0808,0x08081919082b1919,0x08081919082b2b08,0x0808191919080819,0x0808191919081908,0x080819191908192b,0x0808191919082b19,0x0808191919190808,0x080819191919082b,0x0808191919191919,0x0808191919192b08,0x08081919192b0819,0x08081919192b1908,0x080819192b080808,0x080819192b08082b,0x080819192b081919,0x080819192b082b08,0x080819192b190819,0x080819192b191908,0x080819192b2b0808,0x0808192b08080819,0x0808192b08081908,0x0808192b0808192b,0x0808192b08082b19,0x0808192b08190808,0x0808192b08191919,0x0808192b19080808,0x0808192b19081919,0x0808192b19082b08,0x0808192b19190819,0x0808192b19191908,0x0808192b192b0808,0x0808192b2b080819,0x0808192b2b081908,0x0808192b2b190808,0x08082b0808080808,0x08082b080808082b,0x08082b0808081919,0x08082b0808082b08,0x08082b0808190819,0x08082b0808191908,0x08082b080819192b,0x08082b0808192b19,0x08082b08082b0808,0x08082b08082b1919,0x08082b08082b2b2b,0x08082b0819080819,0x08082b0819081908,0x08082b081908192b,0x08082b0819082b19,0x08082b0819190808,0x08082b081919082b,0x08082b0819191919,0x08082b0819192b08,0x08082b08192b0819,0x08082b08192b1908,0x08082b082b080808,0x08082b082b081919,0x08082b082b191908,0x08082b082b2b2b2b,0x08082b1908080819,0x08082b1908081908,0x08082b1908190808,0x08082b190819082b,0x08082b1908191919,0x08082b1908192b08,0x08082b19082b0819,0x08082b1919080808,0x08082b1919081919,0x08082b1919082b08,0x08082b1919190819,0x08082b1919191908,0x08082b19192b0808,0x08082b192b080819,0x08082b192b190808,0x08082b2b08080808,0x08082b2b08190819,0x08082b2b08191908,0x08082b2b082b082b,0x08082b2b082b2b08,0x08082b2b082b2b2b,0x08082b2b19190808,0x08082b2b2b192b19,0x0819080808080819,0x0819080808081908,0x081908080808192b,0x0819080808082b19,0x0819080808190808,0x081908080819082b,0x0819080808191919,0x0819080808192b08,0x08190808082b0819,0x08190808082b1908,0x08190808082b192b,0x0819080819080808,0x081908081908082b,0x0819080819081919,0x0819080819082b08,0x0819080819190819,0x0819080819191908,0x081908081919192b,0x0819080819192b19,0x08190808192b0808,0x08190808192b082b,0x08190808192b1919,0x08190808192b2b08,0x081908082b080819,0x081908082b081908,0x081908082b08192b,0x081908082b190808,0x081908082b191919,0x081908082b192b08,0x081908082b2b0819,0x081908082b2b1908,0x0819081908080808,0x081908190808082b,0x0819081908081919,0x0819081908082b08,0x0819081908082b2b,0x0819081908190819,0x0819081908191908,0x081908190819192b,0x0819081908192b19,0x08190819082b0808,0x08190819082b082b,0x08190819082b1919,0x08190819082b2b08,0x0819081919080819,0x0819081919081908,0x081908191908192b,0x0819081919082b19,0x0819081919190808,0x081908191919082b,0x0819081919191919,0x0819081919192b08,0x08190819192b0819,0x08190819192b1908,0x081908192b080808,0x081908192b08082b,0x081908192b081919,0x081908192b082b08,0x081908192b190819,0x081908192b191908,0x0819082b08080819,0x0819082b08081908,0x0819082b08082b19,0x0819082b08190808,0x0819082b08191919,0x0819082b082b0819,0x0819082b082b1908,0x0819082b19080808,0x0819082b19081919,0x0819082b19190819,0x0819082b19191908,0x0819082b2b080819,0x0819082b2b081908,0x0819082b2b190808,0x0819190808080808,0x081919080808082b,0x0819190808081919,0x0819190808082b08,0x0819190808190819,0x0819190808191908,0x081919080819192b,0x0819190808192b19,0x08191908082b0808,0x08191908082b1919,0x08191908082b2b08,0x0819190819080819,0x0819190819081908,0x081919081908192b,0x0819190819082b19,0x0819190819190808,0x081919081919082b,0x0819190819191919,0x0819190819192b08,0x08191908192b0819,0x08191908192b1908,0x081919082b080808,0x081919082b08082b,0x081919082b081919,0x081919082b082b08,0x081919082b190819,0x081919082b191908,0x081919082b2b0808,0x0819191908080819,0x0819191908081908,0x081919190808192b,0x0819191908082b19,0x0819191908190808,0x081919190819082b,0x0819191908191919,0x0819191908192b08,0x08191919082b0819,0x08191919082b1908,0x0819191919080808,0x081919191908082b,0x0819191919081919,0x0819191919082b08,0x0819191919190819,0x0819191919191908,0x08191919192b0808,0x081919192b080819,0x081919192b081908,0x081919192b190808,0x0819192b08080808,0x0819192b08081919,0x0819192b08082b08,0x0819192b08190819,0x0819192b08191908,0x0819192b082b0808,0x0819192b19080819,0x0819192b19081908,0x0819192b19190808,0x0819192b2b080808,0x0819192b2b2b2b2b,0x08192b0808080819,0x08192b0808081908,0x08192b080808192b,0x08192b0808082b19,0x08192b0808190808,0x08192b0808191919,0x08192b0808192b08,0x08192b08082b0819,0x08192b0819080808,0x08192b081908082b,0x08192b0819081919,0x08192b0819082b08,0x08192b0819190819,0x08192b0819191908,0x08192b08192b0808,0x08192b082b080819,0x08192b082b081908,0x08192b1908080808,0x08192b190808082b,0x08192b1908081919,0x08192b1908082b08,0x08192b1908190819,0x08192b1908191908,0x08192b19082b0808,0x08192b1919080819,0x08192b1919081908,0x08192b1919190808,0x08192b19192b2b19,0x08192b192b2b082b,0x08192b2b08081908,0x08192b2b08190808,0x08192b2b19080808,0x08192b2b1919192b,0x082b080808080808,0x082b08080808082b,0x082b080808081919,0x082b080808082b08,0x082b080808190819,0x082b080808191908,0x082b08080819192b,0x082b080808192b19,0x082b0808082b0808,0x082b0808082b1919,0x082b0808082b2b2b,0x082b080819080819,0x082b080819081908,0x082b080819190808,0x082b08081919082b,0x082b080819191919,0x082b0808192b1908,0x082b08082b080808,0x082b08082b082b2b,0x082b08082b191908,0x082b08082b2b2b2b,0x082b081908080819,0x082b081908081908,0x082b081908190808,0x082b08190819082b,0x082b081908191919,0x082b0819082b0819,0x082b081919080808,0x082b08191908082b,0x082b081919081919,0x082b081919190819,0x082b081919191908,0x082b0819192b0808,0x082b08192b080819,0x082b08192b081908,0x082b08192b190808,0x082b082b08080808,0x082b082b08082b2b,0x082b082b082b082b,0x082b082b082b2b08,0x082b082b082b2b2b,0x082b082b19081908,0x082b082b19190808,0x082b082b2b082b08,0x082b082b2b082b2b,0x082b082b2b2b2b08,0x082b190808080819,0x082b190808081908,0x082b19080808192b,0x082b190808082b19,0x082b190808190808,0x082b190808191919,0x082b190808192b08,0x082b1908082b0819,0x082b1908082b1908,0x082b190819080808,0x082b19081908082b,0x082b190819081919,0x082b190819082b08,0x082b190819190819,0x082b190819191908,0x082b1908192b0808,0x082b19082b080819,0x082b19082b081908,0x082b19082b190808,0x082b191908080808,0x082b191908081919,0x082b191908082b08,0x082b191908190819,0x082b191908191908,0x082b1919082b0808,0x082b191919080819,0x082b191919081908,0x082b191919190808,0x082b1919192b192b,0x082b19192b080808,0x082b192b08080819,0x082b192b08081908,0x082b192b08190808,0x082b192b19080808,0x082b192b19192b19,0x082b2b0808080808,0x082b2b0808081919,0x082b2b0808190819,0x082b2b0808191908,0x082b2b0819080819,0x082b2b0819081908,0x082b2b0819190808,0x082b2b082b082b2b,0x082b2b082b2b2b2b,0x082b2b1908080819,0x082b2b1908081908,0x082b2b1908190808,0x082b2b192b191919,0x082b2b2b08082b2b,0x082b2b2b082b082b,0x082b2b2b192b1908,0x082b2b2b2b082b08,0x082b2b2b2b082b2b,0x1908080808080819,0x1908080808081908,0x190808080808192b,0x1908080808082b19,0x1908080808190808,0x190808080819082b,0x1908080808191919,0x1908080808192b08,0x1908080808192b2b,0x19080808082b0819,0x19080808082b1908,0x19080808082b192b,0x1908080819080808,0x190808081908082b,0x1908080819081919,0x1908080819082b08,0x1908080819082b2b,0x1908080819190819,0x1908080819191908,0x190808081919192b,0x1908080819192b19,0x19080808192b0808,0x19080808192b082b,0x19080808192b1919,0x190808082b080819,0x190808082b081908,0x190808082b190808,0x190808082b191919,0x190808082b192b08,0x190808082b2b0819,0x190808082b2b1908,0x1908081908080808,0x190808190808082b,0x1908081908081919,0x1908081908082b08,0x1908081908190819,0x1908081908191908,0x190808190819192b,0x1908081908192b19,0x19080819082b0808,0x19080819082b082b,0x19080819082b1919,0x1908081919080819,0x1908081919081908,0x190808191908192b,0x1908081919082b19,0x1908081919190808,0x190808191919082b,0x1908081919191919,0x1908081919192b08,0x19080819192b0819,0x19080819192b1908,0x190808192b080808,0x190808192b08082b,0x190808192b081919,0x190808192b082b08,0x190808192b190819,0x190808192b191908,0x190808192b2b0808,0x1908082b08080819,0x1908082b08081908,0x1908082b08190808,0x1908082b0819082b,0x1908082b08191919,0x1908082b08192b08,0x1908082b082b1908,0x1908082b19080808,0x1908082b19081919,0x1908082b19082b08,0x1908082b19190819,0x1908082b19191908,0x1908082b192b0808,0x1908082b2b080819,0x1908082b2b081908,0x1908190808080808,0x190819080808082b,0x1908190808081919,0x1908190808082b08,0x1908190808082b2b,0x1908190808190819,0x1908190808191908,0x190819080819192b,0x1908190808192b19,0x19081908082b0808,0x19081908082b082b,0x19081908082b1919,0x19081908082b2b08,0x1908190819080819,0x1908190819081908,0x190819081908192b,0x1908190819082b19,0x1908190819190808,0x190819081919082b,0x1908190819191919,0x1908190819192b08,0x19081908192b0819,0x19081908192b1908,0x190819082b080808,0x190819082b08082b,0x190819082b081919,0x190819082b082b08,0x190819082b190819,0x190819082b191908,0x190819082b2b0808,0x1908191908080819,0x1908191908081908,0x190819190808192b,0x1908191908082b19,0x1908191908190808,0x190819190819082b,0x1908191908191919,0x1908191908192b08,0x19081919082b0819,0x19081919082b1908,0x1908191919080808,0x190819191908082b,0x1908191919081919,0x1908191919082b08,0x1908191919190819,0x1908191919191908,0x19081919192b0808,0x19081919192b2b2b,0x190819192b080819,0x190819192b081908,0x190819192b190808,0x1908192b08080808,0x1908192b0808082b,0x1908192b08081919,0x1908192b08082b08,0x1908192b08190819,0x1908192b08191908,0x1908192b082b0808,0x1908192b19080819,0x1908192b19081908,0x1908192b19190808,0x1908192b2b080808,0x1908192b2b2b1919,0x19082b0808080819,0x19082b0808081908,0x19082b0808082b19,0x19082b0808190808,0x19082b080819082b,0x19082b0808191919,0x19082b0808192b08,0x19082b08082b0819,0x19082b08082b1908,0x19082b0819080808,0x19082b081908082b,0x19082b0819081919,0x19082b0819082b08,0x19082b0819190819,0x19082b0819191908,0x19082b08192b0808,0x19082b082b081908,0x19082b082b190808,0x19082b1908080808,0x19082b190808082b,0x19082b1908081919,0x19082b1908082b08,0x19082b1908190819,0x19082b1908191908,0x19082b19082b0808,0x19082b1919080819,0x19082b1919081908,0x19082b1919190808,0x19082b192b080808,0x19082b192b19192b,0x19082b2b08080819,0x19082b2b08081908,0x19082b2b08190808,0x19082b2b19080808,0x1919080808080808,0x191908080808082b,0x1919080808081919,0x1919080808082b08,0x1919080808190819,0x1919080808191908,0x191908080819192b,0x1919080808192b19,0x19190808082b0808,0x19190808082b082b,0x19190808082b1919,0x19190808082b2b08,0x1919080819080819,0x1919080819081908,0x191908081908192b,0x1919080819082b19,0x1919080819190808,0x191908081919082b,0x1919080819191919,0x1919080819192b08,0x19190808192b0819,0x19190808192b1908,0x191908082b080808,0x191908082b08082b,0x191908082b081919,0x191908082b082b08,0x191908082b190819,0x191908082b191908,0x1919081908080819,0x1919081908081908,0x191908190808192b,0x1919081908082b19,0x1919081908190808,0x191908190819082b,0x1919081908191919,0x1919081908192b08,0x19190819082b0819,0x19190819082b1908,0x1919081919080808,0x191908191908082b,0x1919081919081919,0x1919081919082b08,0x1919081919190819,0x1919081919191908,0x19190819192b0808,0x191908192b080819,0x191908192b081908,0x191908192b190808,0x1919082b08080808,0x1919082b08081919,0x1919082b08082b08,0x1919082b08190819,0x1919082b08191908,0x1919082b082b0808,0x1919082b19080819,0x1919082b19081908,0x1919082b19190808,0x1919082b192b2b19,0x1919082b2b080808,0x1919190808080819,0x1919190808081908,0x191919080808192b,0x1919190808082b19,0x1919190808190808,0x191919080819082b,0x1919190808191919,0x1919190808192b08,0x19191908082b0819,0x19191908082b1908,0x1919190819080808,0x191919081908082b,0x1919190819081919,0x1919190819082b08,0x1919190819190819,0x1919190819191908,0x19191908192b0808,0x191919082b080819,0x191919082b081908,0x191919082b190808,0x1919191908080808,0x191919190808082b,0x1919191908081919,0x1919191908082b08,0x1919191908190819,0x1919191908191908,0x19191919082b0808,0x1919191919080819,0x1919191919081908,0x1919191919190808,0x191919192b080808,0x1919192b08080819,0x1919192b08081908,0x1919192b08190808,0x1919192b082b192b,0x1919192b19080808,0x19192b0808080808,0x19192b080808082b,0x19192b0808081919,0x19192b0808082b08,0x19192b0808190819,0x19192b0808191908,0x19192b08082b0808,0x19192b0819080819,0x19192b0819081908,0x19192b0819190808,0x19192b0819192b2b,0x19192b082b080808,0x19192b1908080819,0x19192b1908081908,0x19192b1908190808,0x19192b1919080808,0x19192b2b08080808,0x19192b2b08192b19,0x19192b2b2b081919,0x19192b2b2b2b2b08,0x192b080808080819,0x192b080808081908,0x192b08080808192b,0x192b080808190808,0x192b08080819082b,0x192b080808191919,0x192b080808192b08,0x192b0808082b0819,0x192b0808082b1908,0x192b080819080808,0x192b080819081919,0x192b080819082b08,0x192b080819190819,0x192b080819191908,0x192b0808192b0808,0x192b08082b081908,0x192b08082b190808,0x192b081908080808,0x192b08190808082b,0x192b081908081919,0x192b081908082b08,0x192b081908190819,0x192b081908191908,0x192b0819082b0808,0x192b081919080819,0x192b081919081908,0x192b081919190808,0x192b08192b080808,0x192b08192b192b19,0x192b082b08081908,0x192b082b08190808,0x192b082b19080808,0x192b082b1919192b,0x192b082b2b2b0819,0x192b190808080808,0x192b190808081919,0x192b190808082b08,0x192b190808190819,0x192b190808191908,0x192b1908082b0808,0x192b190819080819,0x192b190819081908,0x192b190819190808,0x192b19082b080808,0x192b191908080819,0x192b191908081908,0x192b191908190808,0x192b191919080808,0x192b191919082b2b,0x192b1919192b2b08,0x192b19192b19082b,0x192b192b08080808,0x192b192b2b191908,0x192b2b0808080819,0x192b2b0808081908,0x192b2b0808190808,0x192b2b08192b1919,0x192b2b082b192b08,0x192b2b1908080808,0x192b2b19082b2b2b,0x192b2b2b1908082b,0x192b2b2b2b2b0819,0x2b08080808080808,0x2b0808080808082b,0x2b08080808081919,0x2b08080808082b08,0x2b08080808190819,0x2b08080808191908,0x2b08080808192b19,0x2b080808082b0808,0x2b080808082b1919,0x2b08080819080819,0x2b08080819081908,0x2b08080819190808,0x2b0808081919082b,0x2b08080819191919,0x2b08080819192b08,0x2b080808192b0819,0x2b0808082b080808,0x2b0808082b081919,0x2b0808082b190819,0x2b0808082b191908,0x2b08081908080819,0x2b08081908081908,0x2b08081908082b19,0x2b08081908190808,0x2b0808190819082b,0x2b08081908191919,0x2b08081908192b08,0x2b080819082b0819,0x2b080819082b1908,0x2b08081919080808,0x2b0808191908082b,0x2b08081919081919,0x2b08081919082b08,0x2b08081919190819,0x2b08081919191908,0x2b0808192b080819,0x2b0808192b081908,0x2b0808192b190808,0x2b0808192b2b2b19,0x2b08082b08080808,0x2b08082b08081919,0x2b08082b08082b2b,0x2b08082b08190819,0x2b08082b08191908,0x2b08082b19080819,0x2b08082b19081908,0x2b08082b19190808,0x2b08190808080819,0x2b08190808081908,0x2b0819080808192b,0x2b08190808082b19,0x2b08190808190808,0x2b0819080819082b,0x2b08190808191919,0x2b08190808192b08,0x2b081908082b0819,0x2b08190819080808,0x2b0819081908082b,0x2b08190819081919,0x2b08190819082b08,0x2b08190819190819,0x2b08190819191908,0x2b081908192b0808,0x2b0819082b080819,0x2b0819082b081908,0x2b0819082b190808,0x2b08191908080808,0x2b0819190808082b,0x2b08191908081919,0x2b08191908082b08,0x2b08191908190819,0x2b08191908191908,0x2b081919082b0808,0x2b08191919080819,0x2b08191919081908,0x2b08191919190808,0x2b0819192b080808,0x2b0819192b082b2b,0x2b08192b08080819,0x2b08192b08081908,0x2b08192b08190808,0x2b08192b082b2b19,0x2b08192b19080808,0x2b082b0808080808,0x2b082b0808081919,0x2b082b0808190819,0x2b082b0808191908,0x2b082b0819080819,0x2b082b0819081908,0x2b082b0819190808,0x2b082b082b2b082b,0x2b082b1908080819,0x2b082b1908081908,0x2b082b1919080808,0x2b082b19192b1919,0x2b082b2b082b082b,0x2b082b2b19192b08,0x2b082b2b19192b2b,0x2b082b2b2b08082b,0x2b082b2b2b2b082b,0x2b19080808080819,0x2b19080808081908,0x2b19080808082b19,0x2b19080808190808,0x2b1908080819082b,0x2b19080808191919,0x2b19080808192b08,0x2b190808082b1908,0x2b19080819080808,0x2b1908081908082b,0x2b19080819081919,0x2b19080819082b08,0x2b19080819190819,0x2b19080819191908,0x2b190808192b0808,0x2b1908082b080819,0x2b1908082b081908,0x2b1908082b190808,0x2b19081908080808,0x2b19081908081919,0x2b19081908190819,0x2b19081908191908,0x2b19081919080819,0x2b19081919081908,0x2b19081919190808,0x2b19081919192b2b,0x2b19082b08080819,0x2b19082b08081908,0x2b19082b08190808,0x2b19082b19080808,0x2b19082b2b2b192b,0x2b19190808080808,0x2b1919080808082b,0x2b19190808081919,0x2b19190808082b08,0x2b19190808190819,0x2b19190808191908,0x2b191908082b0808,0x2b19190819080819,0x2b19190819081908,0x2b19190819190808,0x2b1919082b080808,0x2b1919082b19192b,0x2b19191908080819,0x2b19191908081908,0x2b19191908190808,0x2b19191919080808,0x2b1919192b192b08,0x2b1919192b2b0819,0x2b19192b08080808,0x2b19192b1908192b,0x2b19192b192b1908,0x2b192b0808080819,0x2b192b0808081908,0x2b192b0808190808,0x2b192b08082b192b,0x2b192b0819080808,0x2b192b082b2b2b19,0x2b192b1908080808,0x2b192b1919082b19,0x2b192b191919082b,0x2b192b2b2b190808,0x2b2b080808080808,0x2b2b080808081919,0x2b2b080808082b2b,0x2b2b080808191908,0x2b2b0808082b082b,0x2b2b0808082b2b2b,0x2b2b080819080819,0x2b2b080819081908,0x2b2b080819190808,0x2b2b08082b2b082b,0x2b2b08082b2b2b2b,0x2b2b081919080808,0x2b2b0819192b1919,0x2b2b082b0808082b,0x2b2b082b08082b2b,0x2b2b082b082b082b,0x2b2b082b082b2b08,0x2b2b082b082b2b2b,0x2b2b082b2b08082b,0x2b2b082b2b082b08,0x2b2b082b2b082b2b,0x2b2b082b2b2b2b08,0x2b2b190808080819,0x2b2b190808081908,0x2b2b190808190808,0x2b2b190819080808,0x2b2b19082b082b19,0x2b2b19082b2b1908,0x2b2b191908080808,0x2b2b191908192b19,0x2b2b192b19190819,0x2b2b2b0808082b2b,0x2b2b2b08082b2b08,0x2b2b2b082b2b082b,0x2b2b2b1919191908,0x2b2b2b192b08192b,0x2b2b2b2b08082b08,0x2b2b2b2b08082b2b,0x2b2b2b2b082b0808,0x2b2b2b2b082b082b,0x2b2b2b2b082b2b08,0x2b2b2b2b2b082b08,0x2b2b2b2b2b2b2b2b,) +iq3xxs_grid = (0x04040404,0x04040414,0x04040424,0x04040c0c,0x04040c1c,0x04040c3e,0x04041404,0x04041414,0x04041c0c,0x04042414,0x04043e1c,0x04043e2c,0x040c040c,0x040c041c,0x040c0c04,0x040c0c14,0x040c140c,0x040c142c,0x040c1c04,0x040c1c14,0x040c240c,0x040c2c24,0x040c3e04,0x04140404,0x04140414,0x04140424,0x04140c0c,0x04141404,0x04141414,0x04141c0c,0x04141c1c,0x04141c3e,0x04142c0c,0x04142c3e,0x04143e2c,0x041c040c,0x041c043e,0x041c0c04,0x041c0c14,0x041c142c,0x041c3e04,0x04240c1c,0x04241c3e,0x04242424,0x04242c3e,0x04243e1c,0x04243e2c,0x042c040c,0x042c043e,0x042c1c14,0x042c2c14,0x04341c2c,0x04343424,0x043e0c04,0x043e0c24,0x043e0c34,0x043e241c,0x043e340c,0x0c04040c,0x0c04041c,0x0c040c04,0x0c040c14,0x0c04140c,0x0c04141c,0x0c041c04,0x0c041c14,0x0c041c24,0x0c04243e,0x0c042c04,0x0c0c0404,0x0c0c0414,0x0c0c0c0c,0x0c0c1404,0x0c0c1414,0x0c14040c,0x0c14041c,0x0c140c04,0x0c140c14,0x0c14140c,0x0c141c04,0x0c143e14,0x0c1c0404,0x0c1c0414,0x0c1c1404,0x0c1c1c0c,0x0c1c2434,0x0c1c3434,0x0c24040c,0x0c24042c,0x0c242c04,0x0c2c1404,0x0c2c1424,0x0c2c2434,0x0c2c3e0c,0x0c34042c,0x0c3e1414,0x0c3e2404,0x14040404,0x14040414,0x14040c0c,0x14040c1c,0x14041404,0x14041414,0x14041434,0x14041c0c,0x14042414,0x140c040c,0x140c041c,0x140c042c,0x140c0c04,0x140c0c14,0x140c140c,0x140c1c04,0x140c341c,0x140c343e,0x140c3e04,0x14140404,0x14140414,0x14140c0c,0x14140c3e,0x14141404,0x14141414,0x14141c3e,0x14142404,0x14142c2c,0x141c040c,0x141c0c04,0x141c0c24,0x141c3e04,0x141c3e24,0x14241c2c,0x14242c1c,0x142c041c,0x142c143e,0x142c240c,0x142c3e24,0x143e040c,0x143e041c,0x143e0c34,0x143e242c,0x1c04040c,0x1c040c04,0x1c040c14,0x1c04140c,0x1c04141c,0x1c042c04,0x1c04342c,0x1c043e14,0x1c0c0404,0x1c0c0414,0x1c0c1404,0x1c0c1c0c,0x1c0c2424,0x1c0c2434,0x1c14040c,0x1c14041c,0x1c140c04,0x1c14142c,0x1c142c14,0x1c143e14,0x1c1c0c0c,0x1c1c1c1c,0x1c241c04,0x1c24243e,0x1c243e14,0x1c2c0404,0x1c2c0434,0x1c2c1414,0x1c2c2c2c,0x1c340c24,0x1c341c34,0x1c34341c,0x1c3e1c1c,0x1c3e3404,0x24040424,0x24040c3e,0x24041c2c,0x24041c3e,0x24042c1c,0x24042c3e,0x240c3e24,0x24141404,0x24141c3e,0x24142404,0x24143404,0x24143434,0x241c043e,0x241c242c,0x24240424,0x24242c0c,0x24243424,0x242c142c,0x242c241c,0x242c3e04,0x243e042c,0x243e0c04,0x243e0c14,0x243e1c04,0x2c040c14,0x2c04240c,0x2c043e04,0x2c0c0404,0x2c0c0434,0x2c0c1434,0x2c0c2c2c,0x2c140c24,0x2c141c14,0x2c143e14,0x2c1c0414,0x2c1c2c1c,0x2c240c04,0x2c24141c,0x2c24143e,0x2c243e14,0x2c2c0414,0x2c2c1c0c,0x2c342c04,0x2c3e1424,0x2c3e2414,0x34041424,0x34042424,0x34042434,0x34043424,0x340c140c,0x340c340c,0x34140c3e,0x34143424,0x341c1c04,0x341c1c34,0x34242424,0x342c042c,0x342c2c14,0x34341c1c,0x343e041c,0x343e140c,0x3e04041c,0x3e04042c,0x3e04043e,0x3e040c04,0x3e041c14,0x3e042c14,0x3e0c1434,0x3e0c2404,0x3e140c14,0x3e14242c,0x3e142c14,0x3e1c0404,0x3e1c0c2c,0x3e1c1c1c,0x3e1c3404,0x3e24140c,0x3e24240c,0x3e2c0404,0x3e2c0414,0x3e2c1424,0x3e341c04,) +iq3s_grid = (0x01010101,0x01010103,0x01010105,0x0101010b,0x0101010f,0x01010301,0x01010303,0x01010305,0x01010309,0x0101030d,0x01010501,0x01010503,0x0101050b,0x01010707,0x01010901,0x01010905,0x0101090b,0x0101090f,0x01010b03,0x01010b07,0x01010d01,0x01010d05,0x01010f03,0x01010f09,0x01010f0f,0x01030101,0x01030103,0x01030105,0x01030109,0x01030301,0x01030303,0x0103030b,0x01030501,0x01030507,0x0103050f,0x01030703,0x0103070b,0x01030909,0x01030d03,0x01030d0b,0x01030f05,0x01050101,0x01050103,0x0105010b,0x0105010f,0x01050301,0x01050307,0x0105030d,0x01050503,0x0105050b,0x01050701,0x01050709,0x01050905,0x0105090b,0x0105090f,0x01050b03,0x01050b07,0x01050f01,0x01050f07,0x01070107,0x01070303,0x0107030b,0x01070501,0x01070505,0x01070703,0x01070707,0x0107070d,0x01070909,0x01070b01,0x01070b05,0x01070d0f,0x01070f03,0x01070f0b,0x01090101,0x01090307,0x0109030f,0x01090503,0x01090509,0x01090705,0x01090901,0x01090907,0x01090b03,0x01090f01,0x010b0105,0x010b0109,0x010b0501,0x010b0505,0x010b050d,0x010b0707,0x010b0903,0x010b090b,0x010b090f,0x010b0d0d,0x010b0f07,0x010d010d,0x010d0303,0x010d0307,0x010d0703,0x010d0b05,0x010d0f03,0x010f0101,0x010f0105,0x010f0109,0x010f0501,0x010f0505,0x010f050d,0x010f0707,0x010f0b01,0x010f0b09,0x03010101,0x03010103,0x03010105,0x03010109,0x03010301,0x03010303,0x03010307,0x0301030b,0x0301030f,0x03010501,0x03010505,0x03010703,0x03010709,0x0301070d,0x03010b09,0x03010b0d,0x03010d03,0x03010f05,0x03030101,0x03030103,0x03030107,0x0303010d,0x03030301,0x03030309,0x03030503,0x03030701,0x03030707,0x03030903,0x03030b01,0x03030b05,0x03030f01,0x03030f0d,0x03050101,0x03050305,0x0305030b,0x0305030f,0x03050501,0x03050509,0x03050705,0x03050901,0x03050907,0x03050b0b,0x03050d01,0x03050f05,0x03070103,0x03070109,0x0307010f,0x03070301,0x03070307,0x03070503,0x0307050f,0x03070701,0x03070709,0x03070903,0x03070d05,0x03070f01,0x03090107,0x0309010b,0x03090305,0x03090309,0x03090703,0x03090707,0x03090905,0x0309090d,0x03090b01,0x03090b09,0x030b0103,0x030b0301,0x030b0307,0x030b0503,0x030b0701,0x030b0705,0x030b0b03,0x030d0501,0x030d0509,0x030d050f,0x030d0909,0x030d090d,0x030f0103,0x030f0107,0x030f0301,0x030f0305,0x030f0503,0x030f070b,0x030f0903,0x030f0d05,0x030f0f01,0x05010101,0x05010103,0x05010107,0x0501010b,0x0501010f,0x05010301,0x05010305,0x05010309,0x0501030d,0x05010503,0x05010507,0x0501050f,0x05010701,0x05010705,0x05010903,0x05010907,0x0501090b,0x05010b01,0x05010b05,0x05010d0f,0x05010f01,0x05010f07,0x05010f0b,0x05030101,0x05030105,0x05030301,0x05030307,0x0503030f,0x05030505,0x0503050b,0x05030703,0x05030709,0x05030905,0x05030b03,0x05050103,0x05050109,0x0505010f,0x05050503,0x05050507,0x05050701,0x0505070f,0x05050903,0x05050b07,0x05050b0f,0x05050f03,0x05050f09,0x05070101,0x05070105,0x0507010b,0x05070303,0x05070505,0x05070509,0x05070703,0x05070707,0x05070905,0x05070b01,0x05070d0d,0x05090103,0x0509010f,0x05090501,0x05090507,0x05090705,0x0509070b,0x05090903,0x05090f05,0x05090f0b,0x050b0109,0x050b0303,0x050b0505,0x050b070f,0x050b0901,0x050b0b07,0x050b0f01,0x050d0101,0x050d0105,0x050d010f,0x050d0503,0x050d0b0b,0x050d0d03,0x050f010b,0x050f0303,0x050f050d,0x050f0701,0x050f0907,0x050f0b01,0x07010105,0x07010303,0x07010307,0x0701030b,0x0701030f,0x07010505,0x07010703,0x07010707,0x0701070b,0x07010905,0x07010909,0x0701090f,0x07010b03,0x07010d07,0x07010f03,0x07030103,0x07030107,0x0703010b,0x07030309,0x07030503,0x07030507,0x07030901,0x07030d01,0x07030f05,0x07030f0d,0x07050101,0x07050305,0x07050501,0x07050705,0x07050709,0x07050b01,0x07070103,0x07070301,0x07070309,0x07070503,0x07070507,0x0707050f,0x07070701,0x07070903,0x07070907,0x0707090f,0x07070b0b,0x07070f07,0x07090107,0x07090303,0x0709030d,0x07090505,0x07090703,0x07090b05,0x07090d01,0x07090d09,0x070b0103,0x070b0301,0x070b0305,0x070b050b,0x070b0705,0x070b0909,0x070b0b0d,0x070b0f07,0x070d030d,0x070d0903,0x070f0103,0x070f0107,0x070f0501,0x070f0505,0x070f070b,0x09010101,0x09010109,0x09010305,0x09010501,0x09010509,0x0901050f,0x09010705,0x09010903,0x09010b01,0x09010f01,0x09030105,0x0903010f,0x09030303,0x09030307,0x09030505,0x09030701,0x0903070b,0x09030907,0x09030b03,0x09030b0b,0x09050103,0x09050107,0x09050301,0x0905030b,0x09050503,0x09050707,0x09050901,0x09050b0f,0x09050d05,0x09050f01,0x09070109,0x09070303,0x09070307,0x09070501,0x09070505,0x09070703,0x0907070b,0x09090101,0x09090105,0x09090509,0x0909070f,0x09090901,0x09090f03,0x090b010b,0x090b010f,0x090b0503,0x090b0d05,0x090d0307,0x090d0709,0x090d0d01,0x090f0301,0x090f030b,0x090f0701,0x090f0907,0x090f0b03,0x0b010105,0x0b010301,0x0b010309,0x0b010505,0x0b010901,0x0b010909,0x0b01090f,0x0b010b05,0x0b010d0d,0x0b010f09,0x0b030103,0x0b030107,0x0b03010b,0x0b030305,0x0b030503,0x0b030705,0x0b030f05,0x0b050101,0x0b050303,0x0b050507,0x0b050701,0x0b05070d,0x0b050b07,0x0b070105,0x0b07010f,0x0b070301,0x0b07050f,0x0b070909,0x0b070b03,0x0b070d0b,0x0b070f07,0x0b090103,0x0b090109,0x0b090501,0x0b090705,0x0b09090d,0x0b0b0305,0x0b0b050d,0x0b0b0b03,0x0b0b0b07,0x0b0d0905,0x0b0f0105,0x0b0f0109,0x0b0f0505,0x0d010303,0x0d010307,0x0d01030b,0x0d010703,0x0d010707,0x0d010d01,0x0d030101,0x0d030501,0x0d03050f,0x0d030d09,0x0d050305,0x0d050709,0x0d050905,0x0d050b0b,0x0d050d05,0x0d050f01,0x0d070101,0x0d070309,0x0d070503,0x0d070901,0x0d09050b,0x0d090907,0x0d090d05,0x0d0b0101,0x0d0b0107,0x0d0b0709,0x0d0b0d01,0x0d0d010b,0x0d0d0901,0x0d0f0303,0x0d0f0307,0x0f010101,0x0f010109,0x0f01010f,0x0f010501,0x0f010505,0x0f01070d,0x0f010901,0x0f010b09,0x0f010d05,0x0f030105,0x0f030303,0x0f030509,0x0f030907,0x0f03090b,0x0f050103,0x0f050109,0x0f050301,0x0f05030d,0x0f050503,0x0f050701,0x0f050b03,0x0f070105,0x0f070705,0x0f07070b,0x0f070b07,0x0f090103,0x0f09010b,0x0f090307,0x0f090501,0x0f090b01,0x0f0b0505,0x0f0b0905,0x0f0d0105,0x0f0d0703,0x0f0f0101,) +kvalues_iq4nl = (-127,-104,-83,-65,-49,-35,-22,-10,1,13,25,38,53,69,89,113,) +kvalues_mxfp4 = (0,1,2,3,4,6,8,12,0,-1,-2,-3,-4,-6,-8,-12,) +iq1s_grid = (0xffffffffffffffff,0xffffffffffffff01,0xffffffffffff0000,0xffffffffffff01ff,0xffffffffffff0101,0xffffffffff00ff00,0xffffffffff000000,0xffffffffff01ffff,0xffffffffff01ff01,0xffffffffff0101ff,0xffffffffff010101,0xffffffff00ff0000,0xffffffff0000ff00,0xffffffff000000ff,0xffffffff00000001,0xffffffff00010000,0xffffffff01ffffff,0xffffffff01ffff01,0xffffffff01ff01ff,0xffffffff01ff0101,0xffffffff01000000,0xffffffff0101ffff,0xffffffff0101ff01,0xffffffff010101ff,0xffffffff01010101,0xffffff00ffff00ff,0xffffff00ffff0000,0xffffff00ff00ff00,0xffffff00ff0000ff,0xffffff00ff000001,0xffffff00ff000100,0xffffff00ff000101,0xffffff00ff010000,0xffffff0000ffff00,0xffffff0000ff0001,0xffffff0000ff0100,0xffffff000000ff01,0xffffff0000000000,0xffffff0000000101,0xffffff000001ff00,0xffffff00000100ff,0xffffff0000010001,0xffffff00000101ff,0xffffff0001ff0000,0xffffff000100ff00,0xffffff00010000ff,0xffffff0001000001,0xffffff0001010000,0xffffff01ffffffff,0xffffff01ffffff01,0xffffff01ffff01ff,0xffffff01ffff0101,0xffffff01ff000000,0xffffff01ff01ffff,0xffffff01ff01ff01,0xffffff01ff0101ff,0xffffff01ff010101,0xffffff0100ff0000,0xffffff010000ff00,0xffffff0100000100,0xffffff01000100ff,0xffffff0100010100,0xffffff0101ffffff,0xffffff0101ffff01,0xffffff0101ff01ff,0xffffff0101ff0101,0xffffff010100ff00,0xffffff0101000000,0xffffff0101000100,0xffffff010101ffff,0xffffff010101ff01,0xffffff01010101ff,0xffffff0101010101,0xffff00ffff00ff00,0xffff00ffff0000ff,0xffff00ffff000001,0xffff00ffff010000,0xffff00ff00ffff00,0xffff00ff00ff0100,0xffff00ff00000000,0xffff00ff00000101,0xffff00ff000100ff,0xffff00ff00010000,0xffff00ff0100ff00,0xffff00ff01000100,0xffff00ff01010000,0xffff0000ffffff00,0xffff0000ffff00ff,0xffff0000ffff0000,0xffff0000ffff0001,0xffff0000ff000000,0xffff0000ff0001ff,0xffff0000ff000101,0xffff0000ff010100,0xffff000000ffffff,0xffff000000ff0000,0xffff000000ff0101,0xffff00000000ffff,0xffff00000000ff00,0xffff0000000000ff,0xffff000000000000,0xffff000000000001,0xffff000000000100,0xffff00000001ffff,0xffff00000001ff01,0xffff000000010000,0xffff0000000101ff,0xffff000000010101,0xffff000001ffff00,0xffff00000100ff00,0xffff000001000000,0xffff0000010001ff,0xffff000001000101,0xffff00000101ff00,0xffff0000010100ff,0xffff000001010000,0xffff000001010001,0xffff000001010100,0xffff0001ff0000ff,0xffff0001ff000100,0xffff000100ffff00,0xffff000100ff00ff,0xffff00010000ffff,0xffff00010000ff01,0xffff000100000000,0xffff0001000001ff,0xffff00010001ffff,0xffff00010001ff00,0xffff000100010001,0xffff000100010100,0xffff000101ff0000,0xffff00010100ff00,0xffff0001010000ff,0xffff000101000100,0xffff01ffffffffff,0xffff01ffffffff01,0xffff01ffffff01ff,0xffff01ffffff0101,0xffff01ffff000000,0xffff01ffff01ffff,0xffff01ffff01ff01,0xffff01ffff0101ff,0xffff01ffff010101,0xffff01ff00ff0000,0xffff01ff0000ff00,0xffff01ff00000001,0xffff01ff00010000,0xffff01ff01ffffff,0xffff01ff01ffff01,0xffff01ff01ff01ff,0xffff01ff01ff0101,0xffff01ff01000000,0xffff01ff0101ffff,0xffff01ff0101ff01,0xffff01ff010101ff,0xffff01ff01010101,0xffff0100ffff0000,0xffff0100ff00ff00,0xffff0100ff0000ff,0xffff0100ff000100,0xffff0100ff0100ff,0xffff0100ff010000,0xffff010000ffff00,0xffff01000000ffff,0xffff01000000ff00,0xffff010000000000,0xffff01000001ff00,0xffff0100000100ff,0xffff010000010100,0xffff01000100ff00,0xffff0100010000ff,0xffff010001000001,0xffff010001000100,0xffff010001010000,0xffff0101ffffffff,0xffff0101ffffff01,0xffff0101ffff01ff,0xffff0101ffff0101,0xffff0101ff000000,0xffff0101ff01ffff,0xffff0101ff01ff01,0xffff0101ff0101ff,0xffff0101ff010101,0xffff010100ff0000,0xffff01010000ff00,0xffff010100000100,0xffff01010001ff00,0xffff010100010000,0xffff010101ffffff,0xffff010101ffff01,0xffff010101ff0000,0xffff010101ff01ff,0xffff010101ff0101,0xffff010101000000,0xffff01010101ffff,0xffff01010101ff01,0xffff0101010101ff,0xffff010101010101,0xff00ffffff00ffff,0xff00ffffff00ff00,0xff00ffffff0000ff,0xff00ffffff000100,0xff00ffffff0100ff,0xff00ffffff010000,0xff00ffff00ffff00,0xff00ffff00ff00ff,0xff00ffff0000ffff,0xff00ffff00000000,0xff00ffff000001ff,0xff00ffff0001ff00,0xff00ffff000100ff,0xff00ffff00010000,0xff00ffff00010100,0xff00ffff0100ff00,0xff00ffff010000ff,0xff00ffff01000001,0xff00ffff0101ff00,0xff00ffff01010000,0xff00ff00ffffff00,0xff00ff00ffff00ff,0xff00ff00ffff0001,0xff00ff00ffff0100,0xff00ff00ff00ffff,0xff00ff00ff00ff01,0xff00ff00ff000000,0xff00ff00ff0001ff,0xff00ff00ff01ff00,0xff00ff00ff0100ff,0xff00ff00ff010100,0xff00ff0000ff0000,0xff00ff0000ff0101,0xff00ff000000ffff,0xff00ff000000ff00,0xff00ff000000ff01,0xff00ff00000000ff,0xff00ff0000000000,0xff00ff0000000001,0xff00ff0000000100,0xff00ff000001ffff,0xff00ff0000010000,0xff00ff0001ff00ff,0xff00ff000100ff01,0xff00ff0001000000,0xff00ff000101ff00,0xff00ff00010100ff,0xff00ff01ff00ff00,0xff00ff01ff0000ff,0xff00ff01ff000001,0xff00ff01ff010000,0xff00ff0100ffffff,0xff00ff0100ff0001,0xff00ff0100ff0100,0xff00ff010000ff01,0xff00ff0100000000,0xff00ff01000001ff,0xff00ff0100000101,0xff00ff01000100ff,0xff00ff0100010001,0xff00ff0101ff0000,0xff00ff010100ff00,0xff00ff01010000ff,0xff00ff0101000001,0xff00ff0101010000,0xff0000ffffffff00,0xff0000ffffff0001,0xff0000ffffff0100,0xff0000ffff0000ff,0xff0000ffff000000,0xff0000ffff0001ff,0xff0000ffff000100,0xff0000ffff01ff00,0xff0000ffff010001,0xff0000ff00ffff00,0xff0000ff00ff0000,0xff0000ff00ff0001,0xff0000ff00ff01ff,0xff0000ff00ff0101,0xff0000ff0000ff00,0xff0000ff000000ff,0xff0000ff00000000,0xff0000ff00000001,0xff0000ff00000100,0xff0000ff0001ff01,0xff0000ff00010000,0xff0000ff000101ff,0xff0000ff01ff00ff,0xff0000ff01ff0100,0xff0000ff0100ffff,0xff0000ff010000ff,0xff0000ff01000000,0xff0000ff010001ff,0xff0000ff01000100,0xff0000ff01000101,0xff0000ff0101ff00,0xff0000ff010100ff,0xff0000ff01010000,0xff0000ff01010100,0xff000000ffffff01,0xff000000ffff0000,0xff000000ffff0101,0xff000000ff00ff00,0xff000000ff0000ff,0xff000000ff000000,0xff000000ff000001,0xff000000ff000100,0xff000000ff01ffff,0xff000000ff01ff01,0xff000000ff010000,0xff000000ff0101ff,0xff000000ff010101,0xff00000000ffff00,0xff00000000ff00ff,0xff00000000ff0000,0xff00000000ff0001,0xff0000000000ff00,0xff0000000000ff01,0xff000000000000ff,0xff00000000000000,0xff00000000000001,0xff00000000000100,0xff00000000000101,0xff0000000001ff00,0xff000000000100ff,0xff00000000010000,0xff00000000010001,0xff00000000010100,0xff00000001ffffff,0xff00000001ffff01,0xff00000001ff00ff,0xff00000001ff0000,0xff00000001ff01ff,0xff00000001ff0101,0xff0000000100ffff,0xff0000000100ff00,0xff000000010000ff,0xff00000001000000,0xff00000001000001,0xff00000001000100,0xff00000001000101,0xff0000000101ffff,0xff0000000101ff01,0xff00000001010000,0xff000001ffffff00,0xff000001ffff00ff,0xff000001ffff0000,0xff000001ffff0001,0xff000001ff000000,0xff000001ff000001,0xff000001ff0001ff,0xff000001ff000101,0xff000001ff01ff00,0xff000001ff010001,0xff00000100ffffff,0xff00000100ffff01,0xff00000100ff00ff,0xff00000100ff0000,0xff00000100ff01ff,0xff00000100ff0101,0xff0000010000ff00,0xff00000100000000,0xff00000100000001,0xff000001000001ff,0xff00000100000100,0xff0000010001ff00,0xff000001000100ff,0xff00000100010000,0xff000001000101ff,0xff00000100010100,0xff00000100010101,0xff00000101ff0001,0xff00000101ff0101,0xff0000010100ff01,0xff00000101000000,0xff000001010100ff,0xff00000101010100,0xff0001ffff00ff00,0xff0001ffff000001,0xff0001ffff010000,0xff0001ff00ffff00,0xff0001ff00ff00ff,0xff0001ff00ff0001,0xff0001ff00ff0100,0xff0001ff0000ffff,0xff0001ff00000000,0xff0001ff000001ff,0xff0001ff00000101,0xff0001ff0001ffff,0xff0001ff0001ff00,0xff0001ff000100ff,0xff0001ff00010001,0xff0001ff00010100,0xff0001ff01ff0000,0xff0001ff0100ff00,0xff0001ff010000ff,0xff0001ff01010000,0xff000100ff00ffff,0xff000100ff00ff01,0xff000100ff000000,0xff000100ff000101,0xff000100ff01ff00,0xff000100ff010000,0xff00010000ffff01,0xff00010000ff00ff,0xff00010000ff0000,0xff00010000ff01ff,0xff0001000000ff00,0xff000100000000ff,0xff00010000000000,0xff00010000000001,0xff00010000000100,0xff00010000000101,0xff0001000001ffff,0xff00010000010000,0xff00010000010101,0xff00010001ff0100,0xff0001000100ff00,0xff0001000100ff01,0xff00010001000000,0xff000100010001ff,0xff0001000101ff00,0xff00010001010001,0xff00010001010100,0xff000101ffff0100,0xff000101ff000001,0xff000101ff0100ff,0xff000101ff010001,0xff00010100ff00ff,0xff00010100ff0001,0xff00010100ff0100,0xff0001010000ffff,0xff0001010000ff01,0xff00010100000000,0xff000101000001ff,0xff0001010001ff00,0xff00010100010001,0xff00010100010100,0xff00010101ff0000,0xff0001010100ff00,0xff00010101000001,0xff00010101000101,0xff01ffffffffffff,0xff01ffffffffff01,0xff01ffffffff01ff,0xff01ffffffff0101,0xff01ffffff000000,0xff01ffffff01ffff,0xff01ffffff01ff01,0xff01ffffff010000,0xff01ffffff0101ff,0xff01ffffff010101,0xff01ffff00ff0000,0xff01ffff0000ff00,0xff01ffff00000100,0xff01ffff0001ff00,0xff01ffff00010000,0xff01ffff01ffffff,0xff01ffff01ffff01,0xff01ffff01ff01ff,0xff01ffff01ff0101,0xff01ffff01000000,0xff01ffff0101ffff,0xff01ffff0101ff01,0xff01ffff01010000,0xff01ffff010101ff,0xff01ffff01010101,0xff01ff00ffff0000,0xff01ff00ff00ff00,0xff01ff00ff0000ff,0xff01ff00ff000100,0xff01ff00ff010000,0xff01ff0000ffff01,0xff01ff0000ff00ff,0xff01ff0000ff0100,0xff01ff0000000000,0xff01ff00000001ff,0xff01ff0000000101,0xff01ff000001ff00,0xff01ff00000100ff,0xff01ff0000010000,0xff01ff0000010001,0xff01ff0001ff0000,0xff01ff000100ffff,0xff01ff0001000001,0xff01ff0001000100,0xff01ff0001010000,0xff01ff01ffffff00,0xff01ff01ffff01ff,0xff01ff01ffff0101,0xff01ff01ff00ff00,0xff01ff01ff000000,0xff01ff01ff01ffff,0xff01ff01ff01ff01,0xff01ff01ff0101ff,0xff01ff01ff010101,0xff01ff0100ff0000,0xff01ff010000ff00,0xff01ff0100000001,0xff01ff0100000100,0xff01ff0100010000,0xff01ff0101ffff00,0xff01ff0101ff01ff,0xff01ff0101ff0101,0xff01ff010100ff00,0xff01ff0101000000,0xff01ff010101ffff,0xff01ff010101ff01,0xff01ff01010101ff,0xff01ff0101010101,0xff0100ffffff0000,0xff0100ffff0000ff,0xff0100ffff000001,0xff0100ffff000100,0xff0100ffff010000,0xff0100ff00ff00ff,0xff0100ff00ff0000,0xff0100ff00ff0001,0xff0100ff00ff0100,0xff0100ff0000ff01,0xff0100ff00000000,0xff0100ff000001ff,0xff0100ff00000101,0xff0100ff00010001,0xff0100ff01ff0000,0xff0100ff0100ff00,0xff0100ff010000ff,0xff0100ff01000100,0xff0100ff0101ff00,0xff0100ff01010000,0xff010000ffff0100,0xff010000ff000000,0xff010000ff01ff00,0xff010000ff010100,0xff01000000ffffff,0xff01000000ff0000,0xff01000000ff01ff,0xff0100000000ff00,0xff010000000000ff,0xff01000000000000,0xff01000000000100,0xff0100000001ff01,0xff01000000010000,0xff010000000101ff,0xff01000001ff0100,0xff0100000100ffff,0xff010000010000ff,0xff01000001000000,0xff010000010001ff,0xff01000001000101,0xff0100000101ff00,0xff010000010100ff,0xff01000001010001,0xff01000001010100,0xff010001ffff0000,0xff010001ff00ffff,0xff010001ff00ff01,0xff010001ff000100,0xff010001ff010000,0xff01000100ffff00,0xff01000100ff0100,0xff01000100000000,0xff0100010001ffff,0xff0100010001ff00,0xff01000100010100,0xff01000101ff00ff,0xff01000101ff0001,0xff0100010100ffff,0xff01000101000101,0xff0101ffffffffff,0xff0101ffffffff01,0xff0101ffffff01ff,0xff0101ffffff0101,0xff0101ffff000000,0xff0101ffff01ffff,0xff0101ffff01ff01,0xff0101ffff0101ff,0xff0101ffff010101,0xff0101ff00ff0000,0xff0101ff0000ff00,0xff0101ff000000ff,0xff0101ff00010000,0xff0101ff01ffffff,0xff0101ff01ffff01,0xff0101ff01ff01ff,0xff0101ff01ff0101,0xff0101ff0101ffff,0xff0101ff0101ff01,0xff0101ff010101ff,0xff0101ff01010101,0xff010100ffff0100,0xff010100ff00ff00,0xff010100ff0000ff,0xff010100ff000100,0xff010100ff010000,0xff01010000ff0001,0xff01010000ff0100,0xff0101000000ff01,0xff01010000000000,0xff0101000001ff00,0xff010100000100ff,0xff01010000010001,0xff01010000010100,0xff01010001ff0000,0xff0101000100ffff,0xff01010001000001,0xff01010001000100,0xff010100010100ff,0xff01010001010000,0xff010101ffffffff,0xff010101ffffff01,0xff010101ffff01ff,0xff010101ffff0101,0xff010101ff01ffff,0xff010101ff01ff01,0xff010101ff0101ff,0xff010101ff010101,0xff01010100ff0000,0xff0101010000ff00,0xff01010100000001,0xff01010100000100,0xff01010100010000,0xff01010101ffffff,0xff01010101ffff01,0xff01010101ff01ff,0xff01010101ff0101,0xff01010101000000,0xff0101010101ffff,0xff0101010101ff01,0xff010101010101ff,0xff01010101010101,0x00ffffffffff0000,0x00ffffffff00ff00,0x00ffffffff000001,0x00ffffffff010000,0x00ffffff00ff0100,0x00ffffff0000ff01,0x00ffffff00000000,0x00ffffff000001ff,0x00ffffff00000101,0x00ffffff0001ff00,0x00ffffff000100ff,0x00ffffff00010001,0x00ffffff010000ff,0x00ffffff01000100,0x00ffffff0101ff00,0x00ffffff01010001,0x00ffff00ffffffff,0x00ffff00ffffff00,0x00ffff00ffff00ff,0x00ffff00ffff0001,0x00ffff00ffff0100,0x00ffff00ff00ff01,0x00ffff00ff000000,0x00ffff00ff000001,0x00ffff00ff0001ff,0x00ffff00ff000101,0x00ffff00ff01ff00,0x00ffff00ff010001,0x00ffff00ff010100,0x00ffff0000ff0000,0x00ffff0000ff01ff,0x00ffff0000ff0101,0x00ffff000000ff00,0x00ffff00000000ff,0x00ffff0000000000,0x00ffff0000000001,0x00ffff0000000100,0x00ffff0000000101,0x00ffff0000010000,0x00ffff00000101ff,0x00ffff0000010101,0x00ffff0001ffff00,0x00ffff0001ff00ff,0x00ffff0001ff0001,0x00ffff000100ffff,0x00ffff000100ff01,0x00ffff0001000000,0x00ffff000101ffff,0x00ffff000101ff00,0x00ffff000101ff01,0x00ffff01ffff0000,0x00ffff01ff00ff00,0x00ffff01ff0000ff,0x00ffff01ff000001,0x00ffff01ff010000,0x00ffff0100ffff00,0x00ffff010000ff01,0x00ffff0100000000,0x00ffff0100000101,0x00ffff01000100ff,0x00ffff0100010100,0x00ffff0101ff0100,0x00ffff01010000ff,0x00ffff0101010000,0x00ff00ffffffff00,0x00ff00ffff000000,0x00ff00ffff000100,0x00ff00ffff010100,0x00ff00ff00ff0000,0x00ff00ff00ff01ff,0x00ff00ff00ff0101,0x00ff00ff0000ff00,0x00ff00ff000000ff,0x00ff00ff00000000,0x00ff00ff00000001,0x00ff00ff0001ff00,0x00ff00ff0001ff01,0x00ff00ff00010000,0x00ff00ff000101ff,0x00ff00ff00010101,0x00ff00ff01ffff00,0x00ff00ff01ff0001,0x00ff00ff01ff0100,0x00ff00ff0100ffff,0x00ff00ff0100ff01,0x00ff00ff01000000,0x00ff00ff0101ffff,0x00ff00ff0101ff00,0x00ff00ff01010100,0x00ff0000ffffff00,0x00ff0000ffffff01,0x00ff0000ffff0000,0x00ff0000ffff0101,0x00ff0000ff00ff00,0x00ff0000ff0000ff,0x00ff0000ff000000,0x00ff0000ff000001,0x00ff0000ff000100,0x00ff0000ff01ffff,0x00ff0000ff010000,0x00ff0000ff010101,0x00ff000000ffff00,0x00ff000000ff00ff,0x00ff000000ff0000,0x00ff000000ff0001,0x00ff000000ff0100,0x00ff00000000ffff,0x00ff00000000ff00,0x00ff0000000000ff,0x00ff000000000000,0x00ff000000000001,0x00ff0000000001ff,0x00ff000000000100,0x00ff00000001ff00,0x00ff0000000100ff,0x00ff000000010000,0x00ff000000010001,0x00ff000000010100,0x00ff000001ffff01,0x00ff000001ff00ff,0x00ff000001ff0000,0x00ff000001ff01ff,0x00ff00000100ff00,0x00ff0000010000ff,0x00ff000001000000,0x00ff000001000001,0x00ff000001000100,0x00ff000001000101,0x00ff000001010000,0x00ff0000010101ff,0x00ff000001010101,0x00ff0001ffffff00,0x00ff0001ffff0000,0x00ff0001ffff0100,0x00ff0001ff0000ff,0x00ff0001ff000000,0x00ff0001ff0001ff,0x00ff0001ff000101,0x00ff0001ff01ff00,0x00ff0001ff0100ff,0x00ff0001ff010100,0x00ff000100ffffff,0x00ff000100ffff01,0x00ff000100ff0000,0x00ff000100ff01ff,0x00ff00010000ffff,0x00ff00010000ff00,0x00ff00010000ff01,0x00ff000100000000,0x00ff000100000001,0x00ff000100000100,0x00ff00010001ff01,0x00ff000100010000,0x00ff0001000101ff,0x00ff000101ffff00,0x00ff000101ff0000,0x00ff000101ff0101,0x00ff0001010000ff,0x00ff000101000000,0x00ff00010101ff00,0x00ff0001010100ff,0x00ff000101010001,0x00ff01ffffff0000,0x00ff01ffff00ff00,0x00ff01ffff000000,0x00ff01ffff000101,0x00ff01ffff010000,0x00ff01ff00ffff01,0x00ff01ff00ff0100,0x00ff01ff0000ffff,0x00ff01ff00000000,0x00ff01ff000001ff,0x00ff01ff0001ff00,0x00ff01ff000100ff,0x00ff01ff00010001,0x00ff01ff00010100,0x00ff01ff01ff0000,0x00ff01ff0100ff00,0x00ff01ff010000ff,0x00ff01ff01000001,0x00ff01ff01000100,0x00ff01ff01010000,0x00ff0100ffffff00,0x00ff0100ffff0000,0x00ff0100ffff0001,0x00ff0100ffff0101,0x00ff0100ff00ffff,0x00ff0100ff0000ff,0x00ff0100ff000000,0x00ff0100ff0001ff,0x00ff0100ff01ff00,0x00ff0100ff0100ff,0x00ff0100ff010001,0x00ff010000ffffff,0x00ff010000ff0000,0x00ff010000ff0101,0x00ff01000000ff00,0x00ff01000000ff01,0x00ff0100000000ff,0x00ff010000000000,0x00ff010000000001,0x00ff010000000100,0x00ff01000001ffff,0x00ff01000001ff01,0x00ff010000010000,0x00ff010000010001,0x00ff010000010101,0x00ff010001ff0001,0x00ff010001ff0100,0x00ff01000100ff01,0x00ff010001000000,0x00ff010001000001,0x00ff0100010001ff,0x00ff01000101ff00,0x00ff0100010100ff,0x00ff010001010001,0x00ff010001010100,0x00ff0101ff000001,0x00ff010100ff00ff,0x00ff010100ff0001,0x00ff010100ff0100,0x00ff010100000000,0x00ff0101000001ff,0x00ff010100000101,0x00ff0101000100ff,0x00ff010100010100,0x00ff0101010000ff,0x00ff010101010000,0x0000ffffffffff00,0x0000ffffffff00ff,0x0000ffffffff0000,0x0000ffffffff0001,0x0000ffffffff0100,0x0000ffffff00ff01,0x0000ffffff000000,0x0000ffffff000101,0x0000ffffff01ff00,0x0000ffffff0100ff,0x0000ffffff010100,0x0000ffff00ffffff,0x0000ffff00ff0000,0x0000ffff00ff01ff,0x0000ffff0000ff00,0x0000ffff000000ff,0x0000ffff00000000,0x0000ffff00000001,0x0000ffff00000100,0x0000ffff00010000,0x0000ffff000101ff,0x0000ffff01ff0001,0x0000ffff01ff0100,0x0000ffff01000000,0x0000ffff010001ff,0x0000ffff0101ffff,0x0000ffff0101ff00,0x0000ffff01010001,0x0000ffff01010100,0x0000ff00ffff0000,0x0000ff00ffff01ff,0x0000ff00ffff0100,0x0000ff00ffff0101,0x0000ff00ff00ff00,0x0000ff00ff0000ff,0x0000ff00ff000000,0x0000ff00ff000001,0x0000ff00ff0001ff,0x0000ff00ff000100,0x0000ff00ff01ffff,0x0000ff00ff010000,0x0000ff00ff010001,0x0000ff00ff0101ff,0x0000ff00ff010101,0x0000ff0000ffff00,0x0000ff0000ff00ff,0x0000ff0000ff0000,0x0000ff0000ff0001,0x0000ff0000ff0100,0x0000ff000000ffff,0x0000ff000000ff00,0x0000ff000000ff01,0x0000ff00000000ff,0x0000ff0000000000,0x0000ff0000000001,0x0000ff00000001ff,0x0000ff0000000100,0x0000ff0000000101,0x0000ff000001ff00,0x0000ff00000100ff,0x0000ff0000010000,0x0000ff0000010001,0x0000ff0000010100,0x0000ff0001ffff01,0x0000ff0001ff0000,0x0000ff000100ff00,0x0000ff00010000ff,0x0000ff0001000000,0x0000ff0001000001,0x0000ff0001000100,0x0000ff000101ffff,0x0000ff0001010000,0x0000ff0001010101,0x0000ff01ffffff00,0x0000ff01ffff0001,0x0000ff01ff00ff01,0x0000ff01ff000000,0x0000ff01ff000101,0x0000ff01ff01ff00,0x0000ff01ff0100ff,0x0000ff0100ffff01,0x0000ff0100ff0000,0x0000ff0100ff0101,0x0000ff010000ff00,0x0000ff01000000ff,0x0000ff0100000000,0x0000ff0100000001,0x0000ff0100000100,0x0000ff010001ff01,0x0000ff0100010000,0x0000ff0101ff0000,0x0000ff010100ffff,0x0000ff010100ff01,0x0000ff0101000000,0x0000ff0101000100,0x0000ff0101000101,0x0000ff01010100ff,0x000000ffffff00ff,0x000000ffffff0000,0x000000ffff00ff00,0x000000ffff0000ff,0x000000ffff000000,0x000000ffff000001,0x000000ffff0001ff,0x000000ffff000100,0x000000ffff01ff00,0x000000ffff010000,0x000000ffff0101ff,0x000000ffff010101,0x000000ff00ffff00,0x000000ff00ff00ff,0x000000ff00ff0000,0x000000ff00ff0001,0x000000ff00ff0100,0x000000ff00ff0101,0x000000ff0000ffff,0x000000ff0000ff00,0x000000ff000000ff,0x000000ff00000000,0x000000ff00000001,0x000000ff000001ff,0x000000ff00000100,0x000000ff00000101,0x000000ff0001ff00,0x000000ff0001ff01,0x000000ff000100ff,0x000000ff00010000,0x000000ff00010001,0x000000ff00010100,0x000000ff01ffffff,0x000000ff01ff01ff,0x000000ff01ff0101,0x000000ff0100ff00,0x000000ff010000ff,0x000000ff01000000,0x000000ff01000001,0x000000ff01000100,0x000000ff0101ff00,0x000000ff010100ff,0x000000ff01010000,0x000000ff01010101,0x00000000ffffff00,0x00000000ffffff01,0x00000000ffff00ff,0x00000000ffff0000,0x00000000ffff0001,0x00000000ffff0100,0x00000000ff00ffff,0x00000000ff00ff00,0x00000000ff00ff01,0x00000000ff0000ff,0x00000000ff000000,0x00000000ff000001,0x00000000ff000100,0x00000000ff000101,0x00000000ff01ff00,0x00000000ff0100ff,0x00000000ff010000,0x00000000ff010001,0x00000000ff010100,0x0000000000ffffff,0x0000000000ffff00,0x0000000000ffff01,0x0000000000ff00ff,0x0000000000ff0000,0x0000000000ff0001,0x0000000000ff01ff,0x0000000000ff0100,0x000000000000ffff,0x000000000000ff00,0x000000000000ff01,0x00000000000000ff,0x0000000000000000,0x0000000000000001,0x00000000000001ff,0x0000000000000100,0x0000000000000101,0x000000000001ffff,0x000000000001ff00,0x00000000000100ff,0x0000000000010000,0x0000000000010001,0x00000000000101ff,0x0000000000010100,0x0000000000010101,0x0000000001ffff00,0x0000000001ff00ff,0x0000000001ff0000,0x0000000001ff0100,0x0000000001ff0101,0x000000000100ffff,0x000000000100ff00,0x00000000010000ff,0x0000000001000000,0x0000000001000001,0x00000000010001ff,0x0000000001000100,0x000000000101ff00,0x00000000010100ff,0x0000000001010000,0x0000000001010001,0x0000000001010100,0x00000001ffffffff,0x00000001ffffff00,0x00000001ffffff01,0x00000001ffff00ff,0x00000001ffff0001,0x00000001ffff01ff,0x00000001ffff0100,0x00000001ff00ff00,0x00000001ff0000ff,0x00000001ff000000,0x00000001ff0001ff,0x00000001ff000100,0x00000001ff01ffff,0x00000001ff01ff00,0x00000001ff01ff01,0x00000001ff0100ff,0x00000001ff010000,0x00000001ff010001,0x00000001ff0101ff,0x00000001ff010100,0x0000000100ffff00,0x0000000100ff0000,0x0000000100ff0001,0x0000000100ff01ff,0x0000000100ff0100,0x0000000100ff0101,0x000000010000ffff,0x000000010000ff00,0x000000010000ff01,0x00000001000000ff,0x0000000100000000,0x0000000100000001,0x00000001000001ff,0x0000000100000100,0x0000000100000101,0x000000010001ff00,0x00000001000100ff,0x0000000100010000,0x0000000100010100,0x0000000101ffff01,0x0000000101ff0000,0x0000000101ff0001,0x0000000101ff01ff,0x0000000101ff0100,0x0000000101ff0101,0x000000010100ff00,0x0000000101000000,0x0000000101000101,0x000000010101ff01,0x0000000101010000,0x0000000101010001,0x00000001010101ff,0x0000000101010100,0x000001ffffff00ff,0x000001ffffff0000,0x000001ffffff0001,0x000001ffffff0100,0x000001ffff00ffff,0x000001ffff000000,0x000001ffff0001ff,0x000001ffff01ff00,0x000001ffff010101,0x000001ff00ff0000,0x000001ff00ff01ff,0x000001ff00ff0101,0x000001ff0000ff00,0x000001ff000000ff,0x000001ff00000000,0x000001ff00000001,0x000001ff000001ff,0x000001ff00000100,0x000001ff0001ffff,0x000001ff0001ff01,0x000001ff000100ff,0x000001ff00010000,0x000001ff01ffff01,0x000001ff01ff0100,0x000001ff0100ffff,0x000001ff0100ff01,0x000001ff01000000,0x000001ff010001ff,0x000001ff0101ff00,0x000001ff01010100,0x00000100ffffff00,0x00000100ffffff01,0x00000100ffff0000,0x00000100ffff0101,0x00000100ff00ff00,0x00000100ff0000ff,0x00000100ff000000,0x00000100ff000001,0x00000100ff000100,0x00000100ff010000,0x0000010000ffff00,0x0000010000ff00ff,0x0000010000ff0000,0x0000010000ff0001,0x0000010000ff0100,0x000001000000ffff,0x000001000000ff00,0x000001000000ff01,0x00000100000000ff,0x0000010000000000,0x0000010000000001,0x00000100000001ff,0x0000010000000100,0x0000010000000101,0x000001000001ff00,0x00000100000100ff,0x0000010000010000,0x0000010000010001,0x0000010000010100,0x0000010001ffff00,0x0000010001ff0000,0x0000010001ff0100,0x000001000100ff00,0x00000100010000ff,0x0000010001000000,0x0000010001000001,0x00000100010001ff,0x0000010001000100,0x0000010001010000,0x00000101ffff00ff,0x00000101ffff01ff,0x00000101ff000000,0x00000101ff000101,0x00000101ff01ffff,0x00000101ff010000,0x00000101ff010001,0x00000101ff010100,0x0000010100ff0000,0x0000010100ff01ff,0x0000010100ff0100,0x000001010000ff00,0x0000010100000000,0x0000010100000001,0x00000101000001ff,0x0000010100000100,0x000001010001ff01,0x0000010100010000,0x00000101000101ff,0x0000010100010101,0x0000010101ffff00,0x0000010101ff0101,0x000001010100ff01,0x0000010101000000,0x0000010101000001,0x00000101010001ff,0x0000010101000101,0x000001010101ff00,0x0001ffffffff0000,0x0001ffffff0000ff,0x0001ffffff000001,0x0001ffffff000100,0x0001ffffff010000,0x0001ffff00ff00ff,0x0001ffff0000ffff,0x0001ffff00000000,0x0001ffff00000001,0x0001ffff000001ff,0x0001ffff00000101,0x0001ffff0001ff00,0x0001ffff000100ff,0x0001ffff00010001,0x0001ffff00010100,0x0001ffff01ffff00,0x0001ffff01000001,0x0001ffff01010000,0x0001ff00ffffff00,0x0001ff00ffff00ff,0x0001ff00ffff0001,0x0001ff00ffff0100,0x0001ff00ff00ff01,0x0001ff00ff000000,0x0001ff00ff01ff00,0x0001ff00ff01ff01,0x0001ff00ff010001,0x0001ff00ff010100,0x0001ff0000ff0000,0x0001ff0000ff0100,0x0001ff000000ff00,0x0001ff0000000000,0x0001ff0000000001,0x0001ff0000000100,0x0001ff0000010000,0x0001ff0000010001,0x0001ff0000010101,0x0001ff0001ff00ff,0x0001ff0001ff0101,0x0001ff000100ff01,0x0001ff0001000000,0x0001ff000101ff00,0x0001ff0001010001,0x0001ff0001010100,0x0001ff01ff00ff00,0x0001ff01ff000001,0x0001ff01ff000100,0x0001ff0100ffffff,0x0001ff0100ffff00,0x0001ff0100ff0001,0x0001ff0100000000,0x0001ff0100000001,0x0001ff01000001ff,0x0001ff010001ffff,0x0001ff0101ff0000,0x0001ff010100ff00,0x0001ff0101000001,0x0001ff0101010000,0x000100ffff00ff00,0x000100ffff00ff01,0x000100ffff000000,0x000100ffff000001,0x000100ffff000101,0x000100ffff01ff00,0x000100ffff010001,0x000100ffff010100,0x000100ff00ffffff,0x000100ff00ffff01,0x000100ff00ff0000,0x000100ff00ff01ff,0x000100ff00ff0101,0x000100ff0000ff00,0x000100ff000000ff,0x000100ff00000000,0x000100ff00000001,0x000100ff00000100,0x000100ff00000101,0x000100ff0001ffff,0x000100ff0001ff01,0x000100ff00010000,0x000100ff01ff00ff,0x000100ff01ff0000,0x000100ff01ff0100,0x000100ff0100ffff,0x000100ff0100ff01,0x000100ff010000ff,0x000100ff01000000,0x000100ff01000001,0x000100ff010001ff,0x000100ff01000101,0x000100ff0101ff00,0x000100ff010100ff,0x000100ff01010100,0x00010000ffff0000,0x00010000ffff01ff,0x00010000ffff0101,0x00010000ff00ff00,0x00010000ff000000,0x00010000ff000001,0x00010000ff000100,0x0001000000ff00ff,0x0001000000ff0000,0x0001000000ff0001,0x0001000000ff0100,0x000100000000ffff,0x000100000000ff00,0x00010000000000ff,0x0001000000000000,0x0001000000000001,0x0001000000000100,0x000100000001ff00,0x00010000000100ff,0x0001000000010000,0x0001000000010001,0x0001000000010100,0x0001000001ff0001,0x0001000001ff0100,0x0001000001ff0101,0x000100000100ff00,0x0001000001000000,0x0001000001000001,0x0001000001000100,0x0001000001000101,0x000100000101ff01,0x0001000001010000,0x0001000001010001,0x00010000010101ff,0x00010001ffffff01,0x00010001ffff0100,0x00010001ff000000,0x00010001ff01ffff,0x00010001ff010001,0x00010001ff0101ff,0x00010001ff010100,0x0001000100ffffff,0x0001000100ff0000,0x0001000100ff01ff,0x0001000100ff0101,0x000100010000ff00,0x00010001000000ff,0x0001000100000000,0x0001000100000001,0x00010001000001ff,0x0001000100000101,0x000100010001ffff,0x0001000100010000,0x00010001000101ff,0x0001000101ffffff,0x0001000101ffff01,0x0001000101ff0000,0x0001000101ff0101,0x00010001010000ff,0x0001000101000001,0x00010001010001ff,0x0001000101000100,0x000100010101ffff,0x00010001010100ff,0x0001000101010001,0x0001000101010101,0x000101ffff000001,0x000101ffff000100,0x000101ffff010000,0x000101ff00ffff00,0x000101ff0000ff01,0x000101ff00000000,0x000101ff00000101,0x000101ff0001ff00,0x000101ff00010100,0x000101ff01ff0000,0x000101ff0100ff00,0x000101ff010001ff,0x000101ff01010001,0x00010100ffffff00,0x00010100ffff00ff,0x00010100ff00ffff,0x00010100ff000000,0x00010100ff01ff00,0x00010100ff0100ff,0x00010100ff010001,0x00010100ff010100,0x0001010000ffffff,0x0001010000ffff00,0x0001010000ff0000,0x0001010000ff0001,0x0001010000ff01ff,0x000101000000ff00,0x00010100000000ff,0x0001010000000000,0x0001010000000001,0x0001010000000100,0x000101000001ffff,0x0001010000010000,0x0001010000010101,0x0001010001ffff01,0x0001010001ff00ff,0x0001010001ff0101,0x0001010001000000,0x000101000101ff00,0x00010100010100ff,0x0001010001010000,0x0001010001010100,0x00010101ff00ff00,0x00010101ff000001,0x00010101ff0001ff,0x0001010100ffff00,0x0001010100ff00ff,0x0001010100ff0100,0x000101010000ffff,0x0001010100000000,0x00010101000001ff,0x0001010100000101,0x00010101000100ff,0x0001010100010000,0x0001010100010100,0x0001010101ff0001,0x00010101010000ff,0x00010101010001ff,0x0001010101000101,0x0001010101010001,0x01ffffffffffffff,0x01ffffffffffff01,0x01ffffffffff01ff,0x01ffffffffff0101,0x01ffffffff01ffff,0x01ffffffff01ff01,0x01ffffffff0101ff,0x01ffffffff010101,0x01ffffff00ff0000,0x01ffffff0000ffff,0x01ffffff0000ff00,0x01ffffff000000ff,0x01ffffff00000001,0x01ffffff00000100,0x01ffffff00010000,0x01ffffff01ffffff,0x01ffffff01ffff01,0x01ffffff01ff01ff,0x01ffffff01ff0101,0x01ffffff01000000,0x01ffffff0101ffff,0x01ffffff0101ff01,0x01ffffff010101ff,0x01ffffff01010101,0x01ffff00ffff0000,0x01ffff00ff00ff00,0x01ffff00ff0000ff,0x01ffff00ff000001,0x01ffff00ff000100,0x01ffff00ff010000,0x01ffff0000ffff00,0x01ffff0000ff00ff,0x01ffff0000ff0100,0x01ffff000000ffff,0x01ffff000000ff01,0x01ffff0000000000,0x01ffff0000000001,0x01ffff00000001ff,0x01ffff0000000100,0x01ffff00000100ff,0x01ffff0000010001,0x01ffff0000010100,0x01ffff0001ff0000,0x01ffff0001ff0100,0x01ffff00010000ff,0x01ffff0001000001,0x01ffff0001000100,0x01ffff0001010000,0x01ffff01ffffffff,0x01ffff01ffffff01,0x01ffff01ffff01ff,0x01ffff01ffff0101,0x01ffff01ff000000,0x01ffff01ff01ffff,0x01ffff01ff01ff01,0x01ffff01ff0101ff,0x01ffff01ff010101,0x01ffff010000ff00,0x01ffff01000000ff,0x01ffff0100000100,0x01ffff0100010000,0x01ffff0101ffffff,0x01ffff0101ffff01,0x01ffff0101ff01ff,0x01ffff0101ff0101,0x01ffff0101000000,0x01ffff010101ffff,0x01ffff010101ff01,0x01ffff01010101ff,0x01ffff0101010101,0x01ff00ffff0000ff,0x01ff00ffff000100,0x01ff00ff00ffff00,0x01ff00ff00ff00ff,0x01ff00ff0000ff00,0x01ff00ff00000000,0x01ff00ff00000101,0x01ff00ff0001ff00,0x01ff00ff000100ff,0x01ff00ff00010100,0x01ff00ff010000ff,0x01ff00ff01000100,0x01ff0000ffffff00,0x01ff0000ffff0100,0x01ff0000ff00ff01,0x01ff0000ff000000,0x01ff0000ff000101,0x01ff0000ff010001,0x01ff0000ff010100,0x01ff000000ffffff,0x01ff000000ffff00,0x01ff000000ff0000,0x01ff000000ff01ff,0x01ff00000000ff00,0x01ff0000000000ff,0x01ff000000000000,0x01ff000000000001,0x01ff000000000100,0x01ff000000000101,0x01ff000000010000,0x01ff000000010001,0x01ff0000000101ff,0x01ff000000010101,0x01ff000001ffff00,0x01ff000001ff00ff,0x01ff000001ff0001,0x01ff000001ff0100,0x01ff00000100ffff,0x01ff00000100ff01,0x01ff000001000000,0x01ff0000010001ff,0x01ff000001010001,0x01ff0001ff00ff00,0x01ff0001ff000001,0x01ff0001ff000100,0x01ff0001ff010000,0x01ff000100ffff00,0x01ff000100ff00ff,0x01ff000100ff0100,0x01ff000100ff0101,0x01ff00010000ffff,0x01ff000100000000,0x01ff000100000100,0x01ff000100000101,0x01ff00010001ff00,0x01ff000100010001,0x01ff000100010101,0x01ff000101ff0000,0x01ff00010100ff00,0x01ff000101000101,0x01ff0001010100ff,0x01ff01ffffffffff,0x01ff01ffffffff01,0x01ff01ffffff01ff,0x01ff01ffffff0101,0x01ff01ffff000000,0x01ff01ffff01ffff,0x01ff01ffff01ff01,0x01ff01ffff0101ff,0x01ff01ffff010101,0x01ff01ff00ffff00,0x01ff01ff00ff0000,0x01ff01ff0000ff00,0x01ff01ff000000ff,0x01ff01ff00000100,0x01ff01ff00010000,0x01ff01ff00010100,0x01ff01ff01ffffff,0x01ff01ff01ffff01,0x01ff01ff01ff01ff,0x01ff01ff01ff0101,0x01ff01ff01000000,0x01ff01ff0101ffff,0x01ff01ff0101ff01,0x01ff01ff010101ff,0x01ff01ff01010101,0x01ff0100ffff0000,0x01ff0100ffff0001,0x01ff0100ff00ff00,0x01ff0100ff0000ff,0x01ff0100ff000001,0x01ff0100ff010000,0x01ff010000ffff00,0x01ff010000ff00ff,0x01ff010000ff0001,0x01ff010000ff0100,0x01ff01000000ffff,0x01ff01000000ff01,0x01ff010000000000,0x01ff010000000101,0x01ff01000001ff00,0x01ff0100000100ff,0x01ff010001ff0000,0x01ff010001000001,0x01ff010001000100,0x01ff010001010000,0x01ff0101ffffffff,0x01ff0101ffffff01,0x01ff0101ffff01ff,0x01ff0101ffff0101,0x01ff0101ff000000,0x01ff0101ff01ffff,0x01ff0101ff01ff01,0x01ff0101ff0101ff,0x01ff0101ff010101,0x01ff010100ff0000,0x01ff01010000ff00,0x01ff0101000000ff,0x01ff010100000001,0x01ff010101ffffff,0x01ff010101ffff01,0x01ff010101ff01ff,0x01ff010101ff0101,0x01ff010101000000,0x01ff01010101ffff,0x01ff01010101ff01,0x01ff0101010101ff,0x01ff010101010101,0x0100ffffffff0000,0x0100ffffff00ff00,0x0100ffffff000001,0x0100ffffff0001ff,0x0100ffffff000100,0x0100ffffff010000,0x0100ffff00ffff00,0x0100ffff00ff0001,0x0100ffff00ff0100,0x0100ffff00000000,0x0100ffff000001ff,0x0100ffff00000101,0x0100ffff00010100,0x0100ffff00010101,0x0100ffff01ff0000,0x0100ffff0100ff00,0x0100ffff010000ff,0x0100ffff01000001,0x0100ffff01000100,0x0100ffff01010000,0x0100ff00ffffff00,0x0100ff00ffff00ff,0x0100ff00ffff0001,0x0100ff00ffff0100,0x0100ff00ff00ffff,0x0100ff00ff000000,0x0100ff00ff0001ff,0x0100ff00ff000101,0x0100ff00ff01ff00,0x0100ff00ff0100ff,0x0100ff00ff010001,0x0100ff00ff010100,0x0100ff0000ffffff,0x0100ff0000ff0000,0x0100ff000000ffff,0x0100ff000000ff00,0x0100ff00000000ff,0x0100ff0000000000,0x0100ff0000000001,0x0100ff0000000100,0x0100ff000001ff01,0x0100ff0000010000,0x0100ff0001ff00ff,0x0100ff0001ff0001,0x0100ff000100ff01,0x0100ff0001000000,0x0100ff00010001ff,0x0100ff000101ff00,0x0100ff00010100ff,0x0100ff0001010001,0x0100ff0001010100,0x0100ff01ffff0000,0x0100ff01ff00ff00,0x0100ff01ff0000ff,0x0100ff01ff000100,0x0100ff01ff010000,0x0100ff0100ff00ff,0x0100ff0100ff0001,0x0100ff0100ff0100,0x0100ff010000ffff,0x0100ff010000ff01,0x0100ff0100000000,0x0100ff01000001ff,0x0100ff0100010001,0x0100ff0100010100,0x0100ff0101ff0000,0x0100ff01010000ff,0x0100ff0101000001,0x0100ff0101010100,0x010000ffffffff00,0x010000ffffff00ff,0x010000ffffff0001,0x010000ffff00ffff,0x010000ffff000000,0x010000ffff0001ff,0x010000ffff010001,0x010000ff00ffffff,0x010000ff00ff0101,0x010000ff0000ff00,0x010000ff000000ff,0x010000ff00000000,0x010000ff00000001,0x010000ff000001ff,0x010000ff00000100,0x010000ff0001ffff,0x010000ff0001ff00,0x010000ff0001ff01,0x010000ff00010000,0x010000ff01ff00ff,0x010000ff01ff0001,0x010000ff0100ff01,0x010000ff010000ff,0x010000ff01000000,0x010000ff010001ff,0x010000ff0101ff00,0x010000ff01010100,0x01000000ffffffff,0x01000000ffff0000,0x01000000ffff01ff,0x01000000ffff0101,0x01000000ff00ffff,0x01000000ff00ff00,0x01000000ff0000ff,0x01000000ff000000,0x01000000ff000001,0x01000000ff000100,0x01000000ff01ff00,0x01000000ff010000,0x01000000ff010100,0x01000000ff010101,0x0100000000ffff00,0x0100000000ff00ff,0x0100000000ff0000,0x0100000000ff0001,0x0100000000ff0100,0x010000000000ffff,0x010000000000ff00,0x010000000000ff01,0x01000000000000ff,0x0100000000000000,0x0100000000000001,0x01000000000001ff,0x0100000000000100,0x0100000000000101,0x010000000001ff00,0x01000000000100ff,0x0100000000010000,0x0100000000010001,0x0100000000010100,0x0100000001ffff00,0x0100000001ff0000,0x0100000001ff01ff,0x010000000100ff00,0x010000000100ff01,0x01000000010000ff,0x0100000001000000,0x0100000001000001,0x0100000001000100,0x0100000001000101,0x010000000101ffff,0x010000000101ff01,0x0100000001010000,0x01000000010101ff,0x0100000001010101,0x01000001ffffff00,0x01000001ffff00ff,0x01000001ff00ffff,0x01000001ff000000,0x01000001ff000100,0x01000001ff01ffff,0x01000001ff010001,0x01000001ff010100,0x0100000100ff0000,0x0100000100ff01ff,0x0100000100ff0100,0x010000010000ff00,0x010000010000ff01,0x0100000100000000,0x0100000100000001,0x0100000100000100,0x0100000100010000,0x01000001000101ff,0x0100000101ffff01,0x0100000101ff00ff,0x0100000101ff0100,0x0100000101ff0101,0x010000010100ff01,0x01000001010000ff,0x0100000101000000,0x01000001010100ff,0x0100000101010001,0x0100000101010100,0x010001ffffff0000,0x010001ffff000001,0x010001ffff000100,0x010001ffff010000,0x010001ff00ffff00,0x010001ff00ff0001,0x010001ff0000ffff,0x010001ff0000ff01,0x010001ff00000000,0x010001ff00000001,0x010001ff00000101,0x010001ff000100ff,0x010001ff00010000,0x010001ff01ff0000,0x010001ff0100ff00,0x010001ff01000001,0x010001ff01000100,0x010001ff01010000,0x01000100ffff00ff,0x01000100ffff0001,0x01000100ffff0100,0x01000100ff00ffff,0x01000100ff00ff01,0x01000100ff000000,0x01000100ff0001ff,0x01000100ff000101,0x01000100ff01ffff,0x01000100ff01ff00,0x01000100ff0100ff,0x01000100ff010001,0x0100010000ffffff,0x0100010000ffff01,0x0100010000ff0000,0x0100010000ff01ff,0x0100010000ff0101,0x010001000000ff00,0x01000100000000ff,0x0100010000000000,0x0100010000000001,0x0100010000000100,0x010001000001ff01,0x0100010000010000,0x0100010000010001,0x0100010000010101,0x0100010001ffff00,0x0100010001ff00ff,0x010001000100ffff,0x010001000100ff01,0x0100010001000000,0x0100010001000101,0x010001000101ff00,0x0100010001010001,0x01000101ffff0000,0x01000101ff000000,0x01000101ff010000,0x0100010100ff00ff,0x0100010100ff0001,0x0100010100ff0100,0x010001010000ffff,0x0100010100000000,0x01000101000001ff,0x010001010001ff00,0x0100010101ff0000,0x010001010100ff00,0x01000101010000ff,0x0100010101000000,0x0100010101000001,0x0101ffffffffffff,0x0101ffffffffff01,0x0101ffffffff01ff,0x0101ffffffff0101,0x0101ffffff000000,0x0101ffffff01ffff,0x0101ffffff01ff01,0x0101ffffff0101ff,0x0101ffffff010101,0x0101ffff00ff0000,0x0101ffff0000ff00,0x0101ffff000000ff,0x0101ffff00000001,0x0101ffff00000100,0x0101ffff01ffffff,0x0101ffff01ffff01,0x0101ffff01ff01ff,0x0101ffff01ff0101,0x0101ffff01000000,0x0101ffff0101ffff,0x0101ffff0101ff01,0x0101ffff010101ff,0x0101ffff01010101,0x0101ff00ffff0000,0x0101ff00ffff0100,0x0101ff00ff00ff00,0x0101ff00ff0000ff,0x0101ff00ff000001,0x0101ff00ff000100,0x0101ff00ff000101,0x0101ff0000ff0001,0x0101ff0000ff0100,0x0101ff000000ff00,0x0101ff0000000000,0x0101ff00000001ff,0x0101ff0000000101,0x0101ff000001ff00,0x0101ff00000100ff,0x0101ff0001ff0000,0x0101ff000100ffff,0x0101ff000100ff01,0x0101ff0001000001,0x0101ff0001000100,0x0101ff01ffffff01,0x0101ff01ffff01ff,0x0101ff01ffff0101,0x0101ff01ff00ffff,0x0101ff01ff000100,0x0101ff01ff01ff01,0x0101ff01ff0101ff,0x0101ff01ff010101,0x0101ff0100ff0000,0x0101ff010000ff00,0x0101ff0100000001,0x0101ff0100000100,0x0101ff0100010000,0x0101ff0101ffffff,0x0101ff0101ffff01,0x0101ff0101ff01ff,0x0101ff0101ff0101,0x0101ff0101000000,0x0101ff010101ffff,0x0101ff010101ff01,0x0101ff01010101ff,0x0101ff0101010101,0x010100ffff000100,0x010100ffff010000,0x010100ff00ffff00,0x010100ff00ff00ff,0x010100ff0000ffff,0x010100ff000000ff,0x010100ff00000000,0x010100ff000001ff,0x010100ff00000101,0x010100ff0001ff00,0x010100ff00010000,0x010100ff00010001,0x010100ff000101ff,0x010100ff00010100,0x010100ff01ff0000,0x01010000ffff0001,0x01010000ffff0100,0x01010000ff00ffff,0x01010000ff00ff01,0x01010000ff000000,0x01010000ff0001ff,0x01010000ff010001,0x01010000ff010100,0x0101000000ffff01,0x0101000000ff0000,0x010100000000ff00,0x01010000000000ff,0x0101000000000000,0x0101000000000001,0x0101000000000100,0x0101000000010000,0x0101000000010101,0x0101000001ffff00,0x0101000001ff00ff,0x0101000001ff0000,0x0101000001ff0001,0x0101000001ff0100,0x010100000100ff01,0x0101000001000000,0x01010000010001ff,0x01010001ffff0000,0x01010001ff00ff00,0x01010001ff000001,0x01010001ff000101,0x01010001ff01ff00,0x01010001ff010000,0x0101000100ff00ff,0x0101000100ff0001,0x0101000100ff0101,0x010100010000ff01,0x0101000100000000,0x0101000100000001,0x01010001000001ff,0x010100010001ffff,0x010100010001ff01,0x0101000101ff0001,0x010100010100ffff,0x0101000101000000,0x0101000101000001,0x0101000101000100,0x010100010101ff00,0x01010001010100ff,0x0101000101010001,0x010101ffffffffff,0x010101ffffffff01,0x010101ffffff01ff,0x010101ffffff0101,0x010101ffff01ffff,0x010101ffff01ff01,0x010101ffff0101ff,0x010101ffff010101,0x010101ff0000ff00,0x010101ff000000ff,0x010101ff00000001,0x010101ff00000100,0x010101ff01ffffff,0x010101ff01ffff01,0x010101ff01ff01ff,0x010101ff01ff0101,0x010101ff01000000,0x010101ff0101ffff,0x010101ff0101ff01,0x010101ff010101ff,0x010101ff01010101,0x01010100ffff0000,0x01010100ff0000ff,0x01010100ff000100,0x01010100ff01ff00,0x01010100ff010000,0x0101010000ffff00,0x010101000000ffff,0x0101010000000000,0x0101010000000101,0x010101000001ff00,0x0101010000010001,0x0101010000010100,0x010101000100ffff,0x0101010001000001,0x01010101ffffffff,0x01010101ffffff01,0x01010101ffff01ff,0x01010101ffff0101,0x01010101ff01ffff,0x01010101ff01ff01,0x01010101ff0101ff,0x01010101ff010101,0x010101010000ff00,0x01010101000000ff,0x0101010100000001,0x0101010101ffffff,0x0101010101ffff01,0x0101010101ff01ff,0x0101010101ff0101,0x0101010101000000,0x010101010101ffff,0x010101010101ff01,0x01010101010101ff,0x0101010101010101,) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/hip.py b/artifacts/package_runtime/tinygrad/runtime/autogen/hip.py new file mode 100644 index 000000000..bc4d6324c --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/hip.py @@ -0,0 +1,2241 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +import os +dll = c.DLL('hip', os.getenv('ROCM_PATH', '/opt/rocm')+'/lib/libamdhip64.so') +hipError_t: dict[int, str] = {(hipSuccess:=0): 'hipSuccess', (hipErrorInvalidValue:=1): 'hipErrorInvalidValue', (hipErrorOutOfMemory:=2): 'hipErrorOutOfMemory', (hipErrorMemoryAllocation:=2): 'hipErrorMemoryAllocation', (hipErrorNotInitialized:=3): 'hipErrorNotInitialized', (hipErrorInitializationError:=3): 'hipErrorInitializationError', (hipErrorDeinitialized:=4): 'hipErrorDeinitialized', (hipErrorProfilerDisabled:=5): 'hipErrorProfilerDisabled', (hipErrorProfilerNotInitialized:=6): 'hipErrorProfilerNotInitialized', (hipErrorProfilerAlreadyStarted:=7): 'hipErrorProfilerAlreadyStarted', (hipErrorProfilerAlreadyStopped:=8): 'hipErrorProfilerAlreadyStopped', (hipErrorInvalidConfiguration:=9): 'hipErrorInvalidConfiguration', (hipErrorInvalidPitchValue:=12): 'hipErrorInvalidPitchValue', (hipErrorInvalidSymbol:=13): 'hipErrorInvalidSymbol', (hipErrorInvalidDevicePointer:=17): 'hipErrorInvalidDevicePointer', (hipErrorInvalidMemcpyDirection:=21): 'hipErrorInvalidMemcpyDirection', (hipErrorInsufficientDriver:=35): 'hipErrorInsufficientDriver', (hipErrorMissingConfiguration:=52): 'hipErrorMissingConfiguration', (hipErrorPriorLaunchFailure:=53): 'hipErrorPriorLaunchFailure', (hipErrorInvalidDeviceFunction:=98): 'hipErrorInvalidDeviceFunction', (hipErrorNoDevice:=100): 'hipErrorNoDevice', (hipErrorInvalidDevice:=101): 'hipErrorInvalidDevice', (hipErrorInvalidImage:=200): 'hipErrorInvalidImage', (hipErrorInvalidContext:=201): 'hipErrorInvalidContext', (hipErrorContextAlreadyCurrent:=202): 'hipErrorContextAlreadyCurrent', (hipErrorMapFailed:=205): 'hipErrorMapFailed', (hipErrorMapBufferObjectFailed:=205): 'hipErrorMapBufferObjectFailed', (hipErrorUnmapFailed:=206): 'hipErrorUnmapFailed', (hipErrorArrayIsMapped:=207): 'hipErrorArrayIsMapped', (hipErrorAlreadyMapped:=208): 'hipErrorAlreadyMapped', (hipErrorNoBinaryForGpu:=209): 'hipErrorNoBinaryForGpu', (hipErrorAlreadyAcquired:=210): 'hipErrorAlreadyAcquired', (hipErrorNotMapped:=211): 'hipErrorNotMapped', (hipErrorNotMappedAsArray:=212): 'hipErrorNotMappedAsArray', (hipErrorNotMappedAsPointer:=213): 'hipErrorNotMappedAsPointer', (hipErrorECCNotCorrectable:=214): 'hipErrorECCNotCorrectable', (hipErrorUnsupportedLimit:=215): 'hipErrorUnsupportedLimit', (hipErrorContextAlreadyInUse:=216): 'hipErrorContextAlreadyInUse', (hipErrorPeerAccessUnsupported:=217): 'hipErrorPeerAccessUnsupported', (hipErrorInvalidKernelFile:=218): 'hipErrorInvalidKernelFile', (hipErrorInvalidGraphicsContext:=219): 'hipErrorInvalidGraphicsContext', (hipErrorInvalidSource:=300): 'hipErrorInvalidSource', (hipErrorFileNotFound:=301): 'hipErrorFileNotFound', (hipErrorSharedObjectSymbolNotFound:=302): 'hipErrorSharedObjectSymbolNotFound', (hipErrorSharedObjectInitFailed:=303): 'hipErrorSharedObjectInitFailed', (hipErrorOperatingSystem:=304): 'hipErrorOperatingSystem', (hipErrorInvalidHandle:=400): 'hipErrorInvalidHandle', (hipErrorInvalidResourceHandle:=400): 'hipErrorInvalidResourceHandle', (hipErrorIllegalState:=401): 'hipErrorIllegalState', (hipErrorNotFound:=500): 'hipErrorNotFound', (hipErrorNotReady:=600): 'hipErrorNotReady', (hipErrorIllegalAddress:=700): 'hipErrorIllegalAddress', (hipErrorLaunchOutOfResources:=701): 'hipErrorLaunchOutOfResources', (hipErrorLaunchTimeOut:=702): 'hipErrorLaunchTimeOut', (hipErrorPeerAccessAlreadyEnabled:=704): 'hipErrorPeerAccessAlreadyEnabled', (hipErrorPeerAccessNotEnabled:=705): 'hipErrorPeerAccessNotEnabled', (hipErrorSetOnActiveProcess:=708): 'hipErrorSetOnActiveProcess', (hipErrorContextIsDestroyed:=709): 'hipErrorContextIsDestroyed', (hipErrorAssert:=710): 'hipErrorAssert', (hipErrorHostMemoryAlreadyRegistered:=712): 'hipErrorHostMemoryAlreadyRegistered', (hipErrorHostMemoryNotRegistered:=713): 'hipErrorHostMemoryNotRegistered', (hipErrorLaunchFailure:=719): 'hipErrorLaunchFailure', (hipErrorCooperativeLaunchTooLarge:=720): 'hipErrorCooperativeLaunchTooLarge', (hipErrorNotSupported:=801): 'hipErrorNotSupported', (hipErrorStreamCaptureUnsupported:=900): 'hipErrorStreamCaptureUnsupported', (hipErrorStreamCaptureInvalidated:=901): 'hipErrorStreamCaptureInvalidated', (hipErrorStreamCaptureMerge:=902): 'hipErrorStreamCaptureMerge', (hipErrorStreamCaptureUnmatched:=903): 'hipErrorStreamCaptureUnmatched', (hipErrorStreamCaptureUnjoined:=904): 'hipErrorStreamCaptureUnjoined', (hipErrorStreamCaptureIsolation:=905): 'hipErrorStreamCaptureIsolation', (hipErrorStreamCaptureImplicit:=906): 'hipErrorStreamCaptureImplicit', (hipErrorCapturedEvent:=907): 'hipErrorCapturedEvent', (hipErrorStreamCaptureWrongThread:=908): 'hipErrorStreamCaptureWrongThread', (hipErrorGraphExecUpdateFailure:=910): 'hipErrorGraphExecUpdateFailure', (hipErrorInvalidChannelDescriptor:=911): 'hipErrorInvalidChannelDescriptor', (hipErrorInvalidTexture:=912): 'hipErrorInvalidTexture', (hipErrorUnknown:=999): 'hipErrorUnknown', (hipErrorRuntimeMemory:=1052): 'hipErrorRuntimeMemory', (hipErrorRuntimeOther:=1053): 'hipErrorRuntimeOther', (hipErrorTbd:=1054): 'hipErrorTbd'} +class ihipModuleSymbol_t(c.Struct): pass +hipFunction_t: TypeAlias = c.POINTER[ihipModuleSymbol_t] +uint32_t: TypeAlias = ctypes.c_uint32 +size_t: TypeAlias = ctypes.c_uint64 +class ihipStream_t(c.Struct): pass +hipStream_t: TypeAlias = c.POINTER[ihipStream_t] +class ihipEvent_t(c.Struct): pass +hipEvent_t: TypeAlias = c.POINTER[ihipEvent_t] +@dll.bind(ctypes.c_uint32, hipFunction_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, size_t, hipStream_t, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p], hipEvent_t, hipEvent_t, uint32_t) +def hipExtModuleLaunchKernel(f:hipFunction_t, globalWorkSizeX:uint32_t, globalWorkSizeY:uint32_t, globalWorkSizeZ:uint32_t, localWorkSizeX:uint32_t, localWorkSizeY:uint32_t, localWorkSizeZ:uint32_t, sharedMemBytes:size_t, hStream:hipStream_t, kernelParams:c.POINTER[ctypes.c_void_p], extra:c.POINTER[ctypes.c_void_p], startEvent:hipEvent_t, stopEvent:hipEvent_t, flags:uint32_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipFunction_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, size_t, hipStream_t, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p], hipEvent_t, hipEvent_t) +def hipHccModuleLaunchKernel(f:hipFunction_t, globalWorkSizeX:uint32_t, globalWorkSizeY:uint32_t, globalWorkSizeZ:uint32_t, localWorkSizeX:uint32_t, localWorkSizeY:uint32_t, localWorkSizeZ:uint32_t, sharedMemBytes:size_t, hStream:hipStream_t, kernelParams:c.POINTER[ctypes.c_void_p], extra:c.POINTER[ctypes.c_void_p], startEvent:hipEvent_t, stopEvent:hipEvent_t) -> ctypes.c_uint32: ... +@c.record +class dim3(c.Struct): + SIZE = 12 + x: int + y: int + z: int +dim3.register_fields([('x', uint32_t, 0), ('y', uint32_t, 4), ('z', uint32_t, 8)]) +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, dim3, dim3, c.POINTER[ctypes.c_void_p], size_t, hipStream_t, hipEvent_t, hipEvent_t, ctypes.c_int32) +def hipExtLaunchKernel(function_address:ctypes.c_void_p, numBlocks:dim3, dimBlocks:dim3, args:c.POINTER[ctypes.c_void_p], sharedMemBytes:size_t, stream:hipStream_t, startEvent:hipEvent_t, stopEvent:hipEvent_t, flags:int) -> ctypes.c_uint32: ... +hiprtcResult: dict[int, str] = {(HIPRTC_SUCCESS:=0): 'HIPRTC_SUCCESS', (HIPRTC_ERROR_OUT_OF_MEMORY:=1): 'HIPRTC_ERROR_OUT_OF_MEMORY', (HIPRTC_ERROR_PROGRAM_CREATION_FAILURE:=2): 'HIPRTC_ERROR_PROGRAM_CREATION_FAILURE', (HIPRTC_ERROR_INVALID_INPUT:=3): 'HIPRTC_ERROR_INVALID_INPUT', (HIPRTC_ERROR_INVALID_PROGRAM:=4): 'HIPRTC_ERROR_INVALID_PROGRAM', (HIPRTC_ERROR_INVALID_OPTION:=5): 'HIPRTC_ERROR_INVALID_OPTION', (HIPRTC_ERROR_COMPILATION:=6): 'HIPRTC_ERROR_COMPILATION', (HIPRTC_ERROR_BUILTIN_OPERATION_FAILURE:=7): 'HIPRTC_ERROR_BUILTIN_OPERATION_FAILURE', (HIPRTC_ERROR_NO_NAME_EXPRESSIONS_AFTER_COMPILATION:=8): 'HIPRTC_ERROR_NO_NAME_EXPRESSIONS_AFTER_COMPILATION', (HIPRTC_ERROR_NO_LOWERED_NAMES_BEFORE_COMPILATION:=9): 'HIPRTC_ERROR_NO_LOWERED_NAMES_BEFORE_COMPILATION', (HIPRTC_ERROR_NAME_EXPRESSION_NOT_VALID:=10): 'HIPRTC_ERROR_NAME_EXPRESSION_NOT_VALID', (HIPRTC_ERROR_INTERNAL_ERROR:=11): 'HIPRTC_ERROR_INTERNAL_ERROR', (HIPRTC_ERROR_LINKING:=100): 'HIPRTC_ERROR_LINKING'} +class ihiprtcLinkState(c.Struct): pass +hiprtcLinkState: TypeAlias = c.POINTER[ihiprtcLinkState] +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32) +def hiprtcGetErrorString(result:ctypes.c_uint32) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32]) +def hiprtcVersion(major:c.POINTER[ctypes.c_int32], minor:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +class _hiprtcProgram(c.Struct): pass +hiprtcProgram: TypeAlias = c.POINTER[_hiprtcProgram] +@dll.bind(ctypes.c_uint32, hiprtcProgram, c.POINTER[ctypes.c_char]) +def hiprtcAddNameExpression(prog:hiprtcProgram, name_expression:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcProgram, ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]]) +def hiprtcCompileProgram(prog:hiprtcProgram, numOptions:int, options:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hiprtcProgram], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[c.POINTER[ctypes.c_char]]) +def hiprtcCreateProgram(prog:c.POINTER[hiprtcProgram], src:c.POINTER[ctypes.c_char], name:c.POINTER[ctypes.c_char], numHeaders:int, headers:c.POINTER[c.POINTER[ctypes.c_char]], includeNames:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hiprtcProgram]) +def hiprtcDestroyProgram(prog:c.POINTER[hiprtcProgram]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcProgram, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]]) +def hiprtcGetLoweredName(prog:hiprtcProgram, name_expression:c.POINTER[ctypes.c_char], lowered_name:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcProgram, c.POINTER[ctypes.c_char]) +def hiprtcGetProgramLog(prog:hiprtcProgram, log:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcProgram, c.POINTER[size_t]) +def hiprtcGetProgramLogSize(prog:hiprtcProgram, logSizeRet:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcProgram, c.POINTER[ctypes.c_char]) +def hiprtcGetCode(prog:hiprtcProgram, code:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcProgram, c.POINTER[size_t]) +def hiprtcGetCodeSize(prog:hiprtcProgram, codeSizeRet:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcProgram, c.POINTER[ctypes.c_char]) +def hiprtcGetBitcode(prog:hiprtcProgram, bitcode:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcProgram, c.POINTER[size_t]) +def hiprtcGetBitcodeSize(prog:hiprtcProgram, bitcode_size:c.POINTER[size_t]) -> ctypes.c_uint32: ... +hipJitOption: dict[int, str] = {(hipJitOptionMaxRegisters:=0): 'hipJitOptionMaxRegisters', (hipJitOptionThreadsPerBlock:=1): 'hipJitOptionThreadsPerBlock', (hipJitOptionWallTime:=2): 'hipJitOptionWallTime', (hipJitOptionInfoLogBuffer:=3): 'hipJitOptionInfoLogBuffer', (hipJitOptionInfoLogBufferSizeBytes:=4): 'hipJitOptionInfoLogBufferSizeBytes', (hipJitOptionErrorLogBuffer:=5): 'hipJitOptionErrorLogBuffer', (hipJitOptionErrorLogBufferSizeBytes:=6): 'hipJitOptionErrorLogBufferSizeBytes', (hipJitOptionOptimizationLevel:=7): 'hipJitOptionOptimizationLevel', (hipJitOptionTargetFromContext:=8): 'hipJitOptionTargetFromContext', (hipJitOptionTarget:=9): 'hipJitOptionTarget', (hipJitOptionFallbackStrategy:=10): 'hipJitOptionFallbackStrategy', (hipJitOptionGenerateDebugInfo:=11): 'hipJitOptionGenerateDebugInfo', (hipJitOptionLogVerbose:=12): 'hipJitOptionLogVerbose', (hipJitOptionGenerateLineInfo:=13): 'hipJitOptionGenerateLineInfo', (hipJitOptionCacheMode:=14): 'hipJitOptionCacheMode', (hipJitOptionSm3xOpt:=15): 'hipJitOptionSm3xOpt', (hipJitOptionFastCompile:=16): 'hipJitOptionFastCompile', (hipJitOptionGlobalSymbolNames:=17): 'hipJitOptionGlobalSymbolNames', (hipJitOptionGlobalSymbolAddresses:=18): 'hipJitOptionGlobalSymbolAddresses', (hipJitOptionGlobalSymbolCount:=19): 'hipJitOptionGlobalSymbolCount', (hipJitOptionLto:=20): 'hipJitOptionLto', (hipJitOptionFtz:=21): 'hipJitOptionFtz', (hipJitOptionPrecDiv:=22): 'hipJitOptionPrecDiv', (hipJitOptionPrecSqrt:=23): 'hipJitOptionPrecSqrt', (hipJitOptionFma:=24): 'hipJitOptionFma', (hipJitOptionPositionIndependentCode:=25): 'hipJitOptionPositionIndependentCode', (hipJitOptionMinCTAPerSM:=26): 'hipJitOptionMinCTAPerSM', (hipJitOptionMaxThreadsPerBlock:=27): 'hipJitOptionMaxThreadsPerBlock', (hipJitOptionOverrideDirectiveValues:=28): 'hipJitOptionOverrideDirectiveValues', (hipJitOptionNumOptions:=29): 'hipJitOptionNumOptions', (hipJitOptionIRtoISAOptExt:=10000): 'hipJitOptionIRtoISAOptExt', (hipJitOptionIRtoISAOptCountExt:=10001): 'hipJitOptionIRtoISAOptCountExt'} +@dll.bind(ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_void_p], c.POINTER[hiprtcLinkState]) +def hiprtcLinkCreate(num_options:int, option_ptr:c.POINTER[ctypes.c_uint32], option_vals_pptr:c.POINTER[ctypes.c_void_p], hip_link_state_ptr:c.POINTER[hiprtcLinkState]) -> ctypes.c_uint32: ... +hipJitInputType: dict[int, str] = {(hipJitInputCubin:=0): 'hipJitInputCubin', (hipJitInputPtx:=1): 'hipJitInputPtx', (hipJitInputFatBinary:=2): 'hipJitInputFatBinary', (hipJitInputObject:=3): 'hipJitInputObject', (hipJitInputLibrary:=4): 'hipJitInputLibrary', (hipJitInputNvvm:=5): 'hipJitInputNvvm', (hipJitNumLegacyInputTypes:=6): 'hipJitNumLegacyInputTypes', (hipJitInputLLVMBitcode:=100): 'hipJitInputLLVMBitcode', (hipJitInputLLVMBundledBitcode:=101): 'hipJitInputLLVMBundledBitcode', (hipJitInputLLVMArchivesOfBundledBitcode:=102): 'hipJitInputLLVMArchivesOfBundledBitcode', (hipJitInputSpirv:=103): 'hipJitInputSpirv', (hipJitNumInputTypes:=10): 'hipJitNumInputTypes'} +@dll.bind(ctypes.c_uint32, hiprtcLinkState, ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_void_p]) +def hiprtcLinkAddFile(hip_link_state:hiprtcLinkState, input_type:ctypes.c_uint32, file_path:c.POINTER[ctypes.c_char], num_options:int, options_ptr:c.POINTER[ctypes.c_uint32], option_values:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcLinkState, ctypes.c_uint32, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_void_p]) +def hiprtcLinkAddData(hip_link_state:hiprtcLinkState, input_type:ctypes.c_uint32, image:ctypes.c_void_p, image_size:size_t, name:c.POINTER[ctypes.c_char], num_options:int, options_ptr:c.POINTER[ctypes.c_uint32], option_values:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcLinkState, c.POINTER[ctypes.c_void_p], c.POINTER[size_t]) +def hiprtcLinkComplete(hip_link_state:hiprtcLinkState, bin_out:c.POINTER[ctypes.c_void_p], size_out:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hiprtcLinkState) +def hiprtcLinkDestroy(hip_link_state:hiprtcLinkState) -> ctypes.c_uint32: ... +_anonenum0: dict[int, str] = {(HIP_SUCCESS:=0): 'HIP_SUCCESS', (HIP_ERROR_INVALID_VALUE:=1): 'HIP_ERROR_INVALID_VALUE', (HIP_ERROR_NOT_INITIALIZED:=2): 'HIP_ERROR_NOT_INITIALIZED', (HIP_ERROR_LAUNCH_OUT_OF_RESOURCES:=3): 'HIP_ERROR_LAUNCH_OUT_OF_RESOURCES'} +@c.record +class hipDeviceArch_t(c.Struct): + SIZE = 4 + hasGlobalInt32Atomics: int + hasGlobalFloatAtomicExch: int + hasSharedInt32Atomics: int + hasSharedFloatAtomicExch: int + hasFloatAtomicAdd: int + hasGlobalInt64Atomics: int + hasSharedInt64Atomics: int + hasDoubles: int + hasWarpVote: int + hasWarpBallot: int + hasWarpShuffle: int + hasFunnelShift: int + hasThreadFenceSystem: int + hasSyncThreadsExt: int + hasSurfaceFuncs: int + has3dGrid: int + hasDynamicParallelism: int +hipDeviceArch_t.register_fields([('hasGlobalInt32Atomics', ctypes.c_uint32, 0, 1, 0), ('hasGlobalFloatAtomicExch', ctypes.c_uint32, 0, 1, 1), ('hasSharedInt32Atomics', ctypes.c_uint32, 0, 1, 2), ('hasSharedFloatAtomicExch', ctypes.c_uint32, 0, 1, 3), ('hasFloatAtomicAdd', ctypes.c_uint32, 0, 1, 4), ('hasGlobalInt64Atomics', ctypes.c_uint32, 0, 1, 5), ('hasSharedInt64Atomics', ctypes.c_uint32, 0, 1, 6), ('hasDoubles', ctypes.c_uint32, 0, 1, 7), ('hasWarpVote', ctypes.c_uint32, 1, 1, 0), ('hasWarpBallot', ctypes.c_uint32, 1, 1, 1), ('hasWarpShuffle', ctypes.c_uint32, 1, 1, 2), ('hasFunnelShift', ctypes.c_uint32, 1, 1, 3), ('hasThreadFenceSystem', ctypes.c_uint32, 1, 1, 4), ('hasSyncThreadsExt', ctypes.c_uint32, 1, 1, 5), ('hasSurfaceFuncs', ctypes.c_uint32, 1, 1, 6), ('has3dGrid', ctypes.c_uint32, 1, 1, 7), ('hasDynamicParallelism', ctypes.c_uint32, 2, 1, 0)]) +@c.record +class hipUUID_t(c.Struct): + SIZE = 16 + bytes: c.Array[ctypes.c_char, Literal[16]] +hipUUID_t.register_fields([('bytes', c.Array[ctypes.c_char, Literal[16]], 0)]) +hipUUID: TypeAlias = hipUUID_t +@c.record +class hipDeviceProp_tR0600(c.Struct): + SIZE = 1472 + name: c.Array[ctypes.c_char, Literal[256]] + uuid: hipUUID_t + luid: c.Array[ctypes.c_char, Literal[8]] + luidDeviceNodeMask: int + totalGlobalMem: int + sharedMemPerBlock: int + regsPerBlock: int + warpSize: int + memPitch: int + maxThreadsPerBlock: int + maxThreadsDim: c.Array[ctypes.c_int32, Literal[3]] + maxGridSize: c.Array[ctypes.c_int32, Literal[3]] + clockRate: int + totalConstMem: int + major: int + minor: int + textureAlignment: int + texturePitchAlignment: int + deviceOverlap: int + multiProcessorCount: int + kernelExecTimeoutEnabled: int + integrated: int + canMapHostMemory: int + computeMode: int + maxTexture1D: int + maxTexture1DMipmap: int + maxTexture1DLinear: int + maxTexture2D: c.Array[ctypes.c_int32, Literal[2]] + maxTexture2DMipmap: c.Array[ctypes.c_int32, Literal[2]] + maxTexture2DLinear: c.Array[ctypes.c_int32, Literal[3]] + maxTexture2DGather: c.Array[ctypes.c_int32, Literal[2]] + maxTexture3D: c.Array[ctypes.c_int32, Literal[3]] + maxTexture3DAlt: c.Array[ctypes.c_int32, Literal[3]] + maxTextureCubemap: int + maxTexture1DLayered: c.Array[ctypes.c_int32, Literal[2]] + maxTexture2DLayered: c.Array[ctypes.c_int32, Literal[3]] + maxTextureCubemapLayered: c.Array[ctypes.c_int32, Literal[2]] + maxSurface1D: int + maxSurface2D: c.Array[ctypes.c_int32, Literal[2]] + maxSurface3D: c.Array[ctypes.c_int32, Literal[3]] + maxSurface1DLayered: c.Array[ctypes.c_int32, Literal[2]] + maxSurface2DLayered: c.Array[ctypes.c_int32, Literal[3]] + maxSurfaceCubemap: int + maxSurfaceCubemapLayered: c.Array[ctypes.c_int32, Literal[2]] + surfaceAlignment: int + concurrentKernels: int + ECCEnabled: int + pciBusID: int + pciDeviceID: int + pciDomainID: int + tccDriver: int + asyncEngineCount: int + unifiedAddressing: int + memoryClockRate: int + memoryBusWidth: int + l2CacheSize: int + persistingL2CacheMaxSize: int + maxThreadsPerMultiProcessor: int + streamPrioritiesSupported: int + globalL1CacheSupported: int + localL1CacheSupported: int + sharedMemPerMultiprocessor: int + regsPerMultiprocessor: int + managedMemory: int + isMultiGpuBoard: int + multiGpuBoardGroupID: int + hostNativeAtomicSupported: int + singleToDoublePrecisionPerfRatio: int + pageableMemoryAccess: int + concurrentManagedAccess: int + computePreemptionSupported: int + canUseHostPointerForRegisteredMem: int + cooperativeLaunch: int + cooperativeMultiDeviceLaunch: int + sharedMemPerBlockOptin: int + pageableMemoryAccessUsesHostPageTables: int + directManagedMemAccessFromHost: int + maxBlocksPerMultiProcessor: int + accessPolicyMaxWindowSize: int + reservedSharedMemPerBlock: int + hostRegisterSupported: int + sparseHipArraySupported: int + hostRegisterReadOnlySupported: int + timelineSemaphoreInteropSupported: int + memoryPoolsSupported: int + gpuDirectRDMASupported: int + gpuDirectRDMAFlushWritesOptions: int + gpuDirectRDMAWritesOrdering: int + memoryPoolSupportedHandleTypes: int + deferredMappingHipArraySupported: int + ipcEventSupported: int + clusterLaunch: int + unifiedFunctionPointers: int + reserved: c.Array[ctypes.c_int32, Literal[63]] + hipReserved: c.Array[ctypes.c_int32, Literal[32]] + gcnArchName: c.Array[ctypes.c_char, Literal[256]] + maxSharedMemoryPerMultiProcessor: int + clockInstructionRate: int + arch: hipDeviceArch_t + hdpMemFlushCntl: c.POINTER[ctypes.c_uint32] + hdpRegFlushCntl: c.POINTER[ctypes.c_uint32] + cooperativeMultiDeviceUnmatchedFunc: int + cooperativeMultiDeviceUnmatchedGridDim: int + cooperativeMultiDeviceUnmatchedBlockDim: int + cooperativeMultiDeviceUnmatchedSharedMem: int + isLargeBar: int + asicRevision: int +hipDeviceProp_tR0600.register_fields([('name', c.Array[ctypes.c_char, Literal[256]], 0), ('uuid', hipUUID, 256), ('luid', c.Array[ctypes.c_char, Literal[8]], 272), ('luidDeviceNodeMask', ctypes.c_uint32, 280), ('totalGlobalMem', size_t, 288), ('sharedMemPerBlock', size_t, 296), ('regsPerBlock', ctypes.c_int32, 304), ('warpSize', ctypes.c_int32, 308), ('memPitch', size_t, 312), ('maxThreadsPerBlock', ctypes.c_int32, 320), ('maxThreadsDim', c.Array[ctypes.c_int32, Literal[3]], 324), ('maxGridSize', c.Array[ctypes.c_int32, Literal[3]], 336), ('clockRate', ctypes.c_int32, 348), ('totalConstMem', size_t, 352), ('major', ctypes.c_int32, 360), ('minor', ctypes.c_int32, 364), ('textureAlignment', size_t, 368), ('texturePitchAlignment', size_t, 376), ('deviceOverlap', ctypes.c_int32, 384), ('multiProcessorCount', ctypes.c_int32, 388), ('kernelExecTimeoutEnabled', ctypes.c_int32, 392), ('integrated', ctypes.c_int32, 396), ('canMapHostMemory', ctypes.c_int32, 400), ('computeMode', ctypes.c_int32, 404), ('maxTexture1D', ctypes.c_int32, 408), ('maxTexture1DMipmap', ctypes.c_int32, 412), ('maxTexture1DLinear', ctypes.c_int32, 416), ('maxTexture2D', c.Array[ctypes.c_int32, Literal[2]], 420), ('maxTexture2DMipmap', c.Array[ctypes.c_int32, Literal[2]], 428), ('maxTexture2DLinear', c.Array[ctypes.c_int32, Literal[3]], 436), ('maxTexture2DGather', c.Array[ctypes.c_int32, Literal[2]], 448), ('maxTexture3D', c.Array[ctypes.c_int32, Literal[3]], 456), ('maxTexture3DAlt', c.Array[ctypes.c_int32, Literal[3]], 468), ('maxTextureCubemap', ctypes.c_int32, 480), ('maxTexture1DLayered', c.Array[ctypes.c_int32, Literal[2]], 484), ('maxTexture2DLayered', c.Array[ctypes.c_int32, Literal[3]], 492), ('maxTextureCubemapLayered', c.Array[ctypes.c_int32, Literal[2]], 504), ('maxSurface1D', ctypes.c_int32, 512), ('maxSurface2D', c.Array[ctypes.c_int32, Literal[2]], 516), ('maxSurface3D', c.Array[ctypes.c_int32, Literal[3]], 524), ('maxSurface1DLayered', c.Array[ctypes.c_int32, Literal[2]], 536), ('maxSurface2DLayered', c.Array[ctypes.c_int32, Literal[3]], 544), ('maxSurfaceCubemap', ctypes.c_int32, 556), ('maxSurfaceCubemapLayered', c.Array[ctypes.c_int32, Literal[2]], 560), ('surfaceAlignment', size_t, 568), ('concurrentKernels', ctypes.c_int32, 576), ('ECCEnabled', ctypes.c_int32, 580), ('pciBusID', ctypes.c_int32, 584), ('pciDeviceID', ctypes.c_int32, 588), ('pciDomainID', ctypes.c_int32, 592), ('tccDriver', ctypes.c_int32, 596), ('asyncEngineCount', ctypes.c_int32, 600), ('unifiedAddressing', ctypes.c_int32, 604), ('memoryClockRate', ctypes.c_int32, 608), ('memoryBusWidth', ctypes.c_int32, 612), ('l2CacheSize', ctypes.c_int32, 616), ('persistingL2CacheMaxSize', ctypes.c_int32, 620), ('maxThreadsPerMultiProcessor', ctypes.c_int32, 624), ('streamPrioritiesSupported', ctypes.c_int32, 628), ('globalL1CacheSupported', ctypes.c_int32, 632), ('localL1CacheSupported', ctypes.c_int32, 636), ('sharedMemPerMultiprocessor', size_t, 640), ('regsPerMultiprocessor', ctypes.c_int32, 648), ('managedMemory', ctypes.c_int32, 652), ('isMultiGpuBoard', ctypes.c_int32, 656), ('multiGpuBoardGroupID', ctypes.c_int32, 660), ('hostNativeAtomicSupported', ctypes.c_int32, 664), ('singleToDoublePrecisionPerfRatio', ctypes.c_int32, 668), ('pageableMemoryAccess', ctypes.c_int32, 672), ('concurrentManagedAccess', ctypes.c_int32, 676), ('computePreemptionSupported', ctypes.c_int32, 680), ('canUseHostPointerForRegisteredMem', ctypes.c_int32, 684), ('cooperativeLaunch', ctypes.c_int32, 688), ('cooperativeMultiDeviceLaunch', ctypes.c_int32, 692), ('sharedMemPerBlockOptin', size_t, 696), ('pageableMemoryAccessUsesHostPageTables', ctypes.c_int32, 704), ('directManagedMemAccessFromHost', ctypes.c_int32, 708), ('maxBlocksPerMultiProcessor', ctypes.c_int32, 712), ('accessPolicyMaxWindowSize', ctypes.c_int32, 716), ('reservedSharedMemPerBlock', size_t, 720), ('hostRegisterSupported', ctypes.c_int32, 728), ('sparseHipArraySupported', ctypes.c_int32, 732), ('hostRegisterReadOnlySupported', ctypes.c_int32, 736), ('timelineSemaphoreInteropSupported', ctypes.c_int32, 740), ('memoryPoolsSupported', ctypes.c_int32, 744), ('gpuDirectRDMASupported', ctypes.c_int32, 748), ('gpuDirectRDMAFlushWritesOptions', ctypes.c_uint32, 752), ('gpuDirectRDMAWritesOrdering', ctypes.c_int32, 756), ('memoryPoolSupportedHandleTypes', ctypes.c_uint32, 760), ('deferredMappingHipArraySupported', ctypes.c_int32, 764), ('ipcEventSupported', ctypes.c_int32, 768), ('clusterLaunch', ctypes.c_int32, 772), ('unifiedFunctionPointers', ctypes.c_int32, 776), ('reserved', c.Array[ctypes.c_int32, Literal[63]], 780), ('hipReserved', c.Array[ctypes.c_int32, Literal[32]], 1032), ('gcnArchName', c.Array[ctypes.c_char, Literal[256]], 1160), ('maxSharedMemoryPerMultiProcessor', size_t, 1416), ('clockInstructionRate', ctypes.c_int32, 1424), ('arch', hipDeviceArch_t, 1428), ('hdpMemFlushCntl', c.POINTER[ctypes.c_uint32], 1432), ('hdpRegFlushCntl', c.POINTER[ctypes.c_uint32], 1440), ('cooperativeMultiDeviceUnmatchedFunc', ctypes.c_int32, 1448), ('cooperativeMultiDeviceUnmatchedGridDim', ctypes.c_int32, 1452), ('cooperativeMultiDeviceUnmatchedBlockDim', ctypes.c_int32, 1456), ('cooperativeMultiDeviceUnmatchedSharedMem', ctypes.c_int32, 1460), ('isLargeBar', ctypes.c_int32, 1464), ('asicRevision', ctypes.c_int32, 1468)]) +hipMemoryType: dict[int, str] = {(hipMemoryTypeUnregistered:=0): 'hipMemoryTypeUnregistered', (hipMemoryTypeHost:=1): 'hipMemoryTypeHost', (hipMemoryTypeDevice:=2): 'hipMemoryTypeDevice', (hipMemoryTypeManaged:=3): 'hipMemoryTypeManaged', (hipMemoryTypeArray:=10): 'hipMemoryTypeArray', (hipMemoryTypeUnified:=11): 'hipMemoryTypeUnified'} +@c.record +class hipPointerAttribute_t(c.Struct): + SIZE = 32 + type: int + device: int + devicePointer: ctypes.c_void_p + hostPointer: ctypes.c_void_p + isManaged: int + allocationFlags: int +hipPointerAttribute_t.register_fields([('type', ctypes.c_uint32, 0), ('device', ctypes.c_int32, 4), ('devicePointer', ctypes.c_void_p, 8), ('hostPointer', ctypes.c_void_p, 16), ('isManaged', ctypes.c_int32, 24), ('allocationFlags', ctypes.c_uint32, 28)]) +hipDeviceAttribute_t: dict[int, str] = {(hipDeviceAttributeCudaCompatibleBegin:=0): 'hipDeviceAttributeCudaCompatibleBegin', (hipDeviceAttributeEccEnabled:=0): 'hipDeviceAttributeEccEnabled', (hipDeviceAttributeAccessPolicyMaxWindowSize:=1): 'hipDeviceAttributeAccessPolicyMaxWindowSize', (hipDeviceAttributeAsyncEngineCount:=2): 'hipDeviceAttributeAsyncEngineCount', (hipDeviceAttributeCanMapHostMemory:=3): 'hipDeviceAttributeCanMapHostMemory', (hipDeviceAttributeCanUseHostPointerForRegisteredMem:=4): 'hipDeviceAttributeCanUseHostPointerForRegisteredMem', (hipDeviceAttributeClockRate:=5): 'hipDeviceAttributeClockRate', (hipDeviceAttributeComputeMode:=6): 'hipDeviceAttributeComputeMode', (hipDeviceAttributeComputePreemptionSupported:=7): 'hipDeviceAttributeComputePreemptionSupported', (hipDeviceAttributeConcurrentKernels:=8): 'hipDeviceAttributeConcurrentKernels', (hipDeviceAttributeConcurrentManagedAccess:=9): 'hipDeviceAttributeConcurrentManagedAccess', (hipDeviceAttributeCooperativeLaunch:=10): 'hipDeviceAttributeCooperativeLaunch', (hipDeviceAttributeCooperativeMultiDeviceLaunch:=11): 'hipDeviceAttributeCooperativeMultiDeviceLaunch', (hipDeviceAttributeDeviceOverlap:=12): 'hipDeviceAttributeDeviceOverlap', (hipDeviceAttributeDirectManagedMemAccessFromHost:=13): 'hipDeviceAttributeDirectManagedMemAccessFromHost', (hipDeviceAttributeGlobalL1CacheSupported:=14): 'hipDeviceAttributeGlobalL1CacheSupported', (hipDeviceAttributeHostNativeAtomicSupported:=15): 'hipDeviceAttributeHostNativeAtomicSupported', (hipDeviceAttributeIntegrated:=16): 'hipDeviceAttributeIntegrated', (hipDeviceAttributeIsMultiGpuBoard:=17): 'hipDeviceAttributeIsMultiGpuBoard', (hipDeviceAttributeKernelExecTimeout:=18): 'hipDeviceAttributeKernelExecTimeout', (hipDeviceAttributeL2CacheSize:=19): 'hipDeviceAttributeL2CacheSize', (hipDeviceAttributeLocalL1CacheSupported:=20): 'hipDeviceAttributeLocalL1CacheSupported', (hipDeviceAttributeLuid:=21): 'hipDeviceAttributeLuid', (hipDeviceAttributeLuidDeviceNodeMask:=22): 'hipDeviceAttributeLuidDeviceNodeMask', (hipDeviceAttributeComputeCapabilityMajor:=23): 'hipDeviceAttributeComputeCapabilityMajor', (hipDeviceAttributeManagedMemory:=24): 'hipDeviceAttributeManagedMemory', (hipDeviceAttributeMaxBlocksPerMultiProcessor:=25): 'hipDeviceAttributeMaxBlocksPerMultiProcessor', (hipDeviceAttributeMaxBlockDimX:=26): 'hipDeviceAttributeMaxBlockDimX', (hipDeviceAttributeMaxBlockDimY:=27): 'hipDeviceAttributeMaxBlockDimY', (hipDeviceAttributeMaxBlockDimZ:=28): 'hipDeviceAttributeMaxBlockDimZ', (hipDeviceAttributeMaxGridDimX:=29): 'hipDeviceAttributeMaxGridDimX', (hipDeviceAttributeMaxGridDimY:=30): 'hipDeviceAttributeMaxGridDimY', (hipDeviceAttributeMaxGridDimZ:=31): 'hipDeviceAttributeMaxGridDimZ', (hipDeviceAttributeMaxSurface1D:=32): 'hipDeviceAttributeMaxSurface1D', (hipDeviceAttributeMaxSurface1DLayered:=33): 'hipDeviceAttributeMaxSurface1DLayered', (hipDeviceAttributeMaxSurface2D:=34): 'hipDeviceAttributeMaxSurface2D', (hipDeviceAttributeMaxSurface2DLayered:=35): 'hipDeviceAttributeMaxSurface2DLayered', (hipDeviceAttributeMaxSurface3D:=36): 'hipDeviceAttributeMaxSurface3D', (hipDeviceAttributeMaxSurfaceCubemap:=37): 'hipDeviceAttributeMaxSurfaceCubemap', (hipDeviceAttributeMaxSurfaceCubemapLayered:=38): 'hipDeviceAttributeMaxSurfaceCubemapLayered', (hipDeviceAttributeMaxTexture1DWidth:=39): 'hipDeviceAttributeMaxTexture1DWidth', (hipDeviceAttributeMaxTexture1DLayered:=40): 'hipDeviceAttributeMaxTexture1DLayered', (hipDeviceAttributeMaxTexture1DLinear:=41): 'hipDeviceAttributeMaxTexture1DLinear', (hipDeviceAttributeMaxTexture1DMipmap:=42): 'hipDeviceAttributeMaxTexture1DMipmap', (hipDeviceAttributeMaxTexture2DWidth:=43): 'hipDeviceAttributeMaxTexture2DWidth', (hipDeviceAttributeMaxTexture2DHeight:=44): 'hipDeviceAttributeMaxTexture2DHeight', (hipDeviceAttributeMaxTexture2DGather:=45): 'hipDeviceAttributeMaxTexture2DGather', (hipDeviceAttributeMaxTexture2DLayered:=46): 'hipDeviceAttributeMaxTexture2DLayered', (hipDeviceAttributeMaxTexture2DLinear:=47): 'hipDeviceAttributeMaxTexture2DLinear', (hipDeviceAttributeMaxTexture2DMipmap:=48): 'hipDeviceAttributeMaxTexture2DMipmap', (hipDeviceAttributeMaxTexture3DWidth:=49): 'hipDeviceAttributeMaxTexture3DWidth', (hipDeviceAttributeMaxTexture3DHeight:=50): 'hipDeviceAttributeMaxTexture3DHeight', (hipDeviceAttributeMaxTexture3DDepth:=51): 'hipDeviceAttributeMaxTexture3DDepth', (hipDeviceAttributeMaxTexture3DAlt:=52): 'hipDeviceAttributeMaxTexture3DAlt', (hipDeviceAttributeMaxTextureCubemap:=53): 'hipDeviceAttributeMaxTextureCubemap', (hipDeviceAttributeMaxTextureCubemapLayered:=54): 'hipDeviceAttributeMaxTextureCubemapLayered', (hipDeviceAttributeMaxThreadsDim:=55): 'hipDeviceAttributeMaxThreadsDim', (hipDeviceAttributeMaxThreadsPerBlock:=56): 'hipDeviceAttributeMaxThreadsPerBlock', (hipDeviceAttributeMaxThreadsPerMultiProcessor:=57): 'hipDeviceAttributeMaxThreadsPerMultiProcessor', (hipDeviceAttributeMaxPitch:=58): 'hipDeviceAttributeMaxPitch', (hipDeviceAttributeMemoryBusWidth:=59): 'hipDeviceAttributeMemoryBusWidth', (hipDeviceAttributeMemoryClockRate:=60): 'hipDeviceAttributeMemoryClockRate', (hipDeviceAttributeComputeCapabilityMinor:=61): 'hipDeviceAttributeComputeCapabilityMinor', (hipDeviceAttributeMultiGpuBoardGroupID:=62): 'hipDeviceAttributeMultiGpuBoardGroupID', (hipDeviceAttributeMultiprocessorCount:=63): 'hipDeviceAttributeMultiprocessorCount', (hipDeviceAttributeUnused1:=64): 'hipDeviceAttributeUnused1', (hipDeviceAttributePageableMemoryAccess:=65): 'hipDeviceAttributePageableMemoryAccess', (hipDeviceAttributePageableMemoryAccessUsesHostPageTables:=66): 'hipDeviceAttributePageableMemoryAccessUsesHostPageTables', (hipDeviceAttributePciBusId:=67): 'hipDeviceAttributePciBusId', (hipDeviceAttributePciDeviceId:=68): 'hipDeviceAttributePciDeviceId', (hipDeviceAttributePciDomainId:=69): 'hipDeviceAttributePciDomainId', (hipDeviceAttributePciDomainID:=69): 'hipDeviceAttributePciDomainID', (hipDeviceAttributePersistingL2CacheMaxSize:=70): 'hipDeviceAttributePersistingL2CacheMaxSize', (hipDeviceAttributeMaxRegistersPerBlock:=71): 'hipDeviceAttributeMaxRegistersPerBlock', (hipDeviceAttributeMaxRegistersPerMultiprocessor:=72): 'hipDeviceAttributeMaxRegistersPerMultiprocessor', (hipDeviceAttributeReservedSharedMemPerBlock:=73): 'hipDeviceAttributeReservedSharedMemPerBlock', (hipDeviceAttributeMaxSharedMemoryPerBlock:=74): 'hipDeviceAttributeMaxSharedMemoryPerBlock', (hipDeviceAttributeSharedMemPerBlockOptin:=75): 'hipDeviceAttributeSharedMemPerBlockOptin', (hipDeviceAttributeSharedMemPerMultiprocessor:=76): 'hipDeviceAttributeSharedMemPerMultiprocessor', (hipDeviceAttributeSingleToDoublePrecisionPerfRatio:=77): 'hipDeviceAttributeSingleToDoublePrecisionPerfRatio', (hipDeviceAttributeStreamPrioritiesSupported:=78): 'hipDeviceAttributeStreamPrioritiesSupported', (hipDeviceAttributeSurfaceAlignment:=79): 'hipDeviceAttributeSurfaceAlignment', (hipDeviceAttributeTccDriver:=80): 'hipDeviceAttributeTccDriver', (hipDeviceAttributeTextureAlignment:=81): 'hipDeviceAttributeTextureAlignment', (hipDeviceAttributeTexturePitchAlignment:=82): 'hipDeviceAttributeTexturePitchAlignment', (hipDeviceAttributeTotalConstantMemory:=83): 'hipDeviceAttributeTotalConstantMemory', (hipDeviceAttributeTotalGlobalMem:=84): 'hipDeviceAttributeTotalGlobalMem', (hipDeviceAttributeUnifiedAddressing:=85): 'hipDeviceAttributeUnifiedAddressing', (hipDeviceAttributeUnused2:=86): 'hipDeviceAttributeUnused2', (hipDeviceAttributeWarpSize:=87): 'hipDeviceAttributeWarpSize', (hipDeviceAttributeMemoryPoolsSupported:=88): 'hipDeviceAttributeMemoryPoolsSupported', (hipDeviceAttributeVirtualMemoryManagementSupported:=89): 'hipDeviceAttributeVirtualMemoryManagementSupported', (hipDeviceAttributeHostRegisterSupported:=90): 'hipDeviceAttributeHostRegisterSupported', (hipDeviceAttributeMemoryPoolSupportedHandleTypes:=91): 'hipDeviceAttributeMemoryPoolSupportedHandleTypes', (hipDeviceAttributeCudaCompatibleEnd:=9999): 'hipDeviceAttributeCudaCompatibleEnd', (hipDeviceAttributeAmdSpecificBegin:=10000): 'hipDeviceAttributeAmdSpecificBegin', (hipDeviceAttributeClockInstructionRate:=10000): 'hipDeviceAttributeClockInstructionRate', (hipDeviceAttributeUnused3:=10001): 'hipDeviceAttributeUnused3', (hipDeviceAttributeMaxSharedMemoryPerMultiprocessor:=10002): 'hipDeviceAttributeMaxSharedMemoryPerMultiprocessor', (hipDeviceAttributeUnused4:=10003): 'hipDeviceAttributeUnused4', (hipDeviceAttributeUnused5:=10004): 'hipDeviceAttributeUnused5', (hipDeviceAttributeHdpMemFlushCntl:=10005): 'hipDeviceAttributeHdpMemFlushCntl', (hipDeviceAttributeHdpRegFlushCntl:=10006): 'hipDeviceAttributeHdpRegFlushCntl', (hipDeviceAttributeCooperativeMultiDeviceUnmatchedFunc:=10007): 'hipDeviceAttributeCooperativeMultiDeviceUnmatchedFunc', (hipDeviceAttributeCooperativeMultiDeviceUnmatchedGridDim:=10008): 'hipDeviceAttributeCooperativeMultiDeviceUnmatchedGridDim', (hipDeviceAttributeCooperativeMultiDeviceUnmatchedBlockDim:=10009): 'hipDeviceAttributeCooperativeMultiDeviceUnmatchedBlockDim', (hipDeviceAttributeCooperativeMultiDeviceUnmatchedSharedMem:=10010): 'hipDeviceAttributeCooperativeMultiDeviceUnmatchedSharedMem', (hipDeviceAttributeIsLargeBar:=10011): 'hipDeviceAttributeIsLargeBar', (hipDeviceAttributeAsicRevision:=10012): 'hipDeviceAttributeAsicRevision', (hipDeviceAttributeCanUseStreamWaitValue:=10013): 'hipDeviceAttributeCanUseStreamWaitValue', (hipDeviceAttributeImageSupport:=10014): 'hipDeviceAttributeImageSupport', (hipDeviceAttributePhysicalMultiProcessorCount:=10015): 'hipDeviceAttributePhysicalMultiProcessorCount', (hipDeviceAttributeFineGrainSupport:=10016): 'hipDeviceAttributeFineGrainSupport', (hipDeviceAttributeWallClockRate:=10017): 'hipDeviceAttributeWallClockRate', (hipDeviceAttributeNumberOfXccs:=10018): 'hipDeviceAttributeNumberOfXccs', (hipDeviceAttributeMaxAvailableVgprsPerThread:=10019): 'hipDeviceAttributeMaxAvailableVgprsPerThread', (hipDeviceAttributePciChipId:=10020): 'hipDeviceAttributePciChipId', (hipDeviceAttributeAmdSpecificEnd:=19999): 'hipDeviceAttributeAmdSpecificEnd', (hipDeviceAttributeVendorSpecificBegin:=20000): 'hipDeviceAttributeVendorSpecificBegin'} +hipDriverProcAddressQueryResult: dict[int, str] = {(HIP_GET_PROC_ADDRESS_SUCCESS:=0): 'HIP_GET_PROC_ADDRESS_SUCCESS', (HIP_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND:=1): 'HIP_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND', (HIP_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT:=2): 'HIP_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT'} +hipComputeMode: dict[int, str] = {(hipComputeModeDefault:=0): 'hipComputeModeDefault', (hipComputeModeExclusive:=1): 'hipComputeModeExclusive', (hipComputeModeProhibited:=2): 'hipComputeModeProhibited', (hipComputeModeExclusiveProcess:=3): 'hipComputeModeExclusiveProcess'} +hipFlushGPUDirectRDMAWritesOptions: dict[int, str] = {(hipFlushGPUDirectRDMAWritesOptionHost:=1): 'hipFlushGPUDirectRDMAWritesOptionHost', (hipFlushGPUDirectRDMAWritesOptionMemOps:=2): 'hipFlushGPUDirectRDMAWritesOptionMemOps'} +hipGPUDirectRDMAWritesOrdering: dict[int, str] = {(hipGPUDirectRDMAWritesOrderingNone:=0): 'hipGPUDirectRDMAWritesOrderingNone', (hipGPUDirectRDMAWritesOrderingOwner:=100): 'hipGPUDirectRDMAWritesOrderingOwner', (hipGPUDirectRDMAWritesOrderingAllDevices:=200): 'hipGPUDirectRDMAWritesOrderingAllDevices'} +@dll.bind(ctypes.c_uint32) +def hip_init() -> ctypes.c_uint32: ... +class ihipCtx_t(c.Struct): pass +hipCtx_t: TypeAlias = c.POINTER[ihipCtx_t] +hipDevice_t: TypeAlias = ctypes.c_int32 +hipDeviceP2PAttr: dict[int, str] = {(hipDevP2PAttrPerformanceRank:=0): 'hipDevP2PAttrPerformanceRank', (hipDevP2PAttrAccessSupported:=1): 'hipDevP2PAttrAccessSupported', (hipDevP2PAttrNativeAtomicSupported:=2): 'hipDevP2PAttrNativeAtomicSupported', (hipDevP2PAttrHipArrayAccessSupported:=3): 'hipDevP2PAttrHipArrayAccessSupported'} +hipDriverEntryPointQueryResult: dict[int, str] = {(hipDriverEntryPointSuccess:=0): 'hipDriverEntryPointSuccess', (hipDriverEntryPointSymbolNotFound:=1): 'hipDriverEntryPointSymbolNotFound', (hipDriverEntryPointVersionNotSufficent:=2): 'hipDriverEntryPointVersionNotSufficent'} +@c.record +class hipIpcMemHandle_st(c.Struct): + SIZE = 64 + reserved: c.Array[ctypes.c_char, Literal[64]] +hipIpcMemHandle_st.register_fields([('reserved', c.Array[ctypes.c_char, Literal[64]], 0)]) +hipIpcMemHandle_t: TypeAlias = hipIpcMemHandle_st +@c.record +class hipIpcEventHandle_st(c.Struct): + SIZE = 64 + reserved: c.Array[ctypes.c_char, Literal[64]] +hipIpcEventHandle_st.register_fields([('reserved', c.Array[ctypes.c_char, Literal[64]], 0)]) +hipIpcEventHandle_t: TypeAlias = hipIpcEventHandle_st +class ihipModule_t(c.Struct): pass +hipModule_t: TypeAlias = c.POINTER[ihipModule_t] +class ihipLinkState_t(c.Struct): pass +hipLinkState_t: TypeAlias = c.POINTER[ihipLinkState_t] +class ihipLibrary_t(c.Struct): pass +hipLibrary_t: TypeAlias = c.POINTER[ihipLibrary_t] +class ihipKernel_t(c.Struct): pass +hipKernel_t: TypeAlias = c.POINTER[ihipKernel_t] +class ihipMemPoolHandle_t(c.Struct): pass +hipMemPool_t: TypeAlias = c.POINTER[ihipMemPoolHandle_t] +@c.record +class hipFuncAttributes(c.Struct): + SIZE = 56 + binaryVersion: int + cacheModeCA: int + constSizeBytes: int + localSizeBytes: int + maxDynamicSharedSizeBytes: int + maxThreadsPerBlock: int + numRegs: int + preferredShmemCarveout: int + ptxVersion: int + sharedSizeBytes: int +hipFuncAttributes.register_fields([('binaryVersion', ctypes.c_int32, 0), ('cacheModeCA', ctypes.c_int32, 4), ('constSizeBytes', size_t, 8), ('localSizeBytes', size_t, 16), ('maxDynamicSharedSizeBytes', ctypes.c_int32, 24), ('maxThreadsPerBlock', ctypes.c_int32, 28), ('numRegs', ctypes.c_int32, 32), ('preferredShmemCarveout', ctypes.c_int32, 36), ('ptxVersion', ctypes.c_int32, 40), ('sharedSizeBytes', size_t, 48)]) +hipLimit_t: dict[int, str] = {(hipLimitStackSize:=0): 'hipLimitStackSize', (hipLimitPrintfFifoSize:=1): 'hipLimitPrintfFifoSize', (hipLimitMallocHeapSize:=2): 'hipLimitMallocHeapSize', (hipExtLimitScratchMin:=4096): 'hipExtLimitScratchMin', (hipExtLimitScratchMax:=4097): 'hipExtLimitScratchMax', (hipExtLimitScratchCurrent:=4098): 'hipExtLimitScratchCurrent', (hipLimitRange:=4099): 'hipLimitRange'} +hipStreamBatchMemOpType: dict[int, str] = {(hipStreamMemOpWaitValue32:=1): 'hipStreamMemOpWaitValue32', (hipStreamMemOpWriteValue32:=2): 'hipStreamMemOpWriteValue32', (hipStreamMemOpWaitValue64:=4): 'hipStreamMemOpWaitValue64', (hipStreamMemOpWriteValue64:=5): 'hipStreamMemOpWriteValue64', (hipStreamMemOpBarrier:=6): 'hipStreamMemOpBarrier', (hipStreamMemOpFlushRemoteWrites:=3): 'hipStreamMemOpFlushRemoteWrites'} +@c.record +class hipStreamBatchMemOpParams_union(c.Struct): + SIZE = 48 + operation: int + waitValue: hipStreamBatchMemOpParams_union_hipStreamMemOpWaitValueParams_t + writeValue: hipStreamBatchMemOpParams_union_hipStreamMemOpWriteValueParams_t + flushRemoteWrites: hipStreamBatchMemOpParams_union_hipStreamMemOpFlushRemoteWritesParams_t + memoryBarrier: hipStreamBatchMemOpParams_union_hipStreamMemOpMemoryBarrierParams_t + pad: c.Array[ctypes.c_uint64, Literal[6]] +@c.record +class hipStreamBatchMemOpParams_union_hipStreamMemOpWaitValueParams_t(c.Struct): + SIZE = 40 + operation: int + address: ctypes.c_void_p + value: int + value64: int + flags: int + alias: ctypes.c_void_p +hipDeviceptr_t: TypeAlias = ctypes.c_void_p +uint64_t: TypeAlias = ctypes.c_uint64 +hipStreamBatchMemOpParams_union_hipStreamMemOpWaitValueParams_t.register_fields([('operation', ctypes.c_uint32, 0), ('address', hipDeviceptr_t, 8), ('value', uint32_t, 16), ('value64', uint64_t, 16), ('flags', ctypes.c_uint32, 24), ('alias', hipDeviceptr_t, 32)]) +@c.record +class hipStreamBatchMemOpParams_union_hipStreamMemOpWriteValueParams_t(c.Struct): + SIZE = 40 + operation: int + address: ctypes.c_void_p + value: int + value64: int + flags: int + alias: ctypes.c_void_p +hipStreamBatchMemOpParams_union_hipStreamMemOpWriteValueParams_t.register_fields([('operation', ctypes.c_uint32, 0), ('address', hipDeviceptr_t, 8), ('value', uint32_t, 16), ('value64', uint64_t, 16), ('flags', ctypes.c_uint32, 24), ('alias', hipDeviceptr_t, 32)]) +@c.record +class hipStreamBatchMemOpParams_union_hipStreamMemOpFlushRemoteWritesParams_t(c.Struct): + SIZE = 8 + operation: int + flags: int +hipStreamBatchMemOpParams_union_hipStreamMemOpFlushRemoteWritesParams_t.register_fields([('operation', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4)]) +@c.record +class hipStreamBatchMemOpParams_union_hipStreamMemOpMemoryBarrierParams_t(c.Struct): + SIZE = 8 + operation: int + flags: int +hipStreamBatchMemOpParams_union_hipStreamMemOpMemoryBarrierParams_t.register_fields([('operation', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4)]) +hipStreamBatchMemOpParams_union.register_fields([('operation', ctypes.c_uint32, 0), ('waitValue', hipStreamBatchMemOpParams_union_hipStreamMemOpWaitValueParams_t, 0), ('writeValue', hipStreamBatchMemOpParams_union_hipStreamMemOpWriteValueParams_t, 0), ('flushRemoteWrites', hipStreamBatchMemOpParams_union_hipStreamMemOpFlushRemoteWritesParams_t, 0), ('memoryBarrier', hipStreamBatchMemOpParams_union_hipStreamMemOpMemoryBarrierParams_t, 0), ('pad', c.Array[uint64_t, Literal[6]], 0)]) +hipStreamBatchMemOpParams: TypeAlias = hipStreamBatchMemOpParams_union +@c.record +class hipBatchMemOpNodeParams(c.Struct): + SIZE = 32 + ctx: c.POINTER[ihipCtx_t] + count: int + paramArray: c.POINTER[hipStreamBatchMemOpParams_union] + flags: int +hipBatchMemOpNodeParams.register_fields([('ctx', hipCtx_t, 0), ('count', ctypes.c_uint32, 8), ('paramArray', c.POINTER[hipStreamBatchMemOpParams], 16), ('flags', ctypes.c_uint32, 24)]) +hipMemoryAdvise: dict[int, str] = {(hipMemAdviseSetReadMostly:=1): 'hipMemAdviseSetReadMostly', (hipMemAdviseUnsetReadMostly:=2): 'hipMemAdviseUnsetReadMostly', (hipMemAdviseSetPreferredLocation:=3): 'hipMemAdviseSetPreferredLocation', (hipMemAdviseUnsetPreferredLocation:=4): 'hipMemAdviseUnsetPreferredLocation', (hipMemAdviseSetAccessedBy:=5): 'hipMemAdviseSetAccessedBy', (hipMemAdviseUnsetAccessedBy:=6): 'hipMemAdviseUnsetAccessedBy', (hipMemAdviseSetCoarseGrain:=100): 'hipMemAdviseSetCoarseGrain', (hipMemAdviseUnsetCoarseGrain:=101): 'hipMemAdviseUnsetCoarseGrain'} +hipMemRangeCoherencyMode: dict[int, str] = {(hipMemRangeCoherencyModeFineGrain:=0): 'hipMemRangeCoherencyModeFineGrain', (hipMemRangeCoherencyModeCoarseGrain:=1): 'hipMemRangeCoherencyModeCoarseGrain', (hipMemRangeCoherencyModeIndeterminate:=2): 'hipMemRangeCoherencyModeIndeterminate'} +hipMemRangeAttribute: dict[int, str] = {(hipMemRangeAttributeReadMostly:=1): 'hipMemRangeAttributeReadMostly', (hipMemRangeAttributePreferredLocation:=2): 'hipMemRangeAttributePreferredLocation', (hipMemRangeAttributeAccessedBy:=3): 'hipMemRangeAttributeAccessedBy', (hipMemRangeAttributeLastPrefetchLocation:=4): 'hipMemRangeAttributeLastPrefetchLocation', (hipMemRangeAttributeCoherencyMode:=100): 'hipMemRangeAttributeCoherencyMode'} +hipMemPoolAttr: dict[int, str] = {(hipMemPoolReuseFollowEventDependencies:=1): 'hipMemPoolReuseFollowEventDependencies', (hipMemPoolReuseAllowOpportunistic:=2): 'hipMemPoolReuseAllowOpportunistic', (hipMemPoolReuseAllowInternalDependencies:=3): 'hipMemPoolReuseAllowInternalDependencies', (hipMemPoolAttrReleaseThreshold:=4): 'hipMemPoolAttrReleaseThreshold', (hipMemPoolAttrReservedMemCurrent:=5): 'hipMemPoolAttrReservedMemCurrent', (hipMemPoolAttrReservedMemHigh:=6): 'hipMemPoolAttrReservedMemHigh', (hipMemPoolAttrUsedMemCurrent:=7): 'hipMemPoolAttrUsedMemCurrent', (hipMemPoolAttrUsedMemHigh:=8): 'hipMemPoolAttrUsedMemHigh'} +hipMemAccessFlags: dict[int, str] = {(hipMemAccessFlagsProtNone:=0): 'hipMemAccessFlagsProtNone', (hipMemAccessFlagsProtRead:=1): 'hipMemAccessFlagsProtRead', (hipMemAccessFlagsProtReadWrite:=3): 'hipMemAccessFlagsProtReadWrite'} +@c.record +class hipMemAccessDesc(c.Struct): + SIZE = 12 + location: hipMemLocation + flags: int +@c.record +class hipMemLocation(c.Struct): + SIZE = 8 + type: int + id: int +hipMemLocationType: dict[int, str] = {(hipMemLocationTypeInvalid:=0): 'hipMemLocationTypeInvalid', (hipMemLocationTypeNone:=0): 'hipMemLocationTypeNone', (hipMemLocationTypeDevice:=1): 'hipMemLocationTypeDevice', (hipMemLocationTypeHost:=2): 'hipMemLocationTypeHost', (hipMemLocationTypeHostNuma:=3): 'hipMemLocationTypeHostNuma', (hipMemLocationTypeHostNumaCurrent:=4): 'hipMemLocationTypeHostNumaCurrent'} +hipMemLocation.register_fields([('type', ctypes.c_uint32, 0), ('id', ctypes.c_int32, 4)]) +hipMemAccessDesc.register_fields([('location', hipMemLocation, 0), ('flags', ctypes.c_uint32, 8)]) +hipMemAllocationType: dict[int, str] = {(hipMemAllocationTypeInvalid:=0): 'hipMemAllocationTypeInvalid', (hipMemAllocationTypePinned:=1): 'hipMemAllocationTypePinned', (hipMemAllocationTypeUncached:=1073741824): 'hipMemAllocationTypeUncached', (hipMemAllocationTypeMax:=2147483647): 'hipMemAllocationTypeMax'} +hipMemAllocationHandleType: dict[int, str] = {(hipMemHandleTypeNone:=0): 'hipMemHandleTypeNone', (hipMemHandleTypePosixFileDescriptor:=1): 'hipMemHandleTypePosixFileDescriptor', (hipMemHandleTypeWin32:=2): 'hipMemHandleTypeWin32', (hipMemHandleTypeWin32Kmt:=4): 'hipMemHandleTypeWin32Kmt'} +@c.record +class hipMemPoolProps(c.Struct): + SIZE = 88 + allocType: int + handleTypes: int + location: hipMemLocation + win32SecurityAttributes: ctypes.c_void_p + maxSize: int + reserved: c.Array[ctypes.c_ubyte, Literal[56]] +hipMemPoolProps.register_fields([('allocType', ctypes.c_uint32, 0), ('handleTypes', ctypes.c_uint32, 4), ('location', hipMemLocation, 8), ('win32SecurityAttributes', ctypes.c_void_p, 16), ('maxSize', size_t, 24), ('reserved', c.Array[ctypes.c_ubyte, Literal[56]], 32)]) +@c.record +class hipMemPoolPtrExportData(c.Struct): + SIZE = 64 + reserved: c.Array[ctypes.c_ubyte, Literal[64]] +hipMemPoolPtrExportData.register_fields([('reserved', c.Array[ctypes.c_ubyte, Literal[64]], 0)]) +hipFuncAttribute: dict[int, str] = {(hipFuncAttributeMaxDynamicSharedMemorySize:=8): 'hipFuncAttributeMaxDynamicSharedMemorySize', (hipFuncAttributePreferredSharedMemoryCarveout:=9): 'hipFuncAttributePreferredSharedMemoryCarveout', (hipFuncAttributeMax:=10): 'hipFuncAttributeMax'} +hipFuncCache_t: dict[int, str] = {(hipFuncCachePreferNone:=0): 'hipFuncCachePreferNone', (hipFuncCachePreferShared:=1): 'hipFuncCachePreferShared', (hipFuncCachePreferL1:=2): 'hipFuncCachePreferL1', (hipFuncCachePreferEqual:=3): 'hipFuncCachePreferEqual'} +hipSharedMemConfig: dict[int, str] = {(hipSharedMemBankSizeDefault:=0): 'hipSharedMemBankSizeDefault', (hipSharedMemBankSizeFourByte:=1): 'hipSharedMemBankSizeFourByte', (hipSharedMemBankSizeEightByte:=2): 'hipSharedMemBankSizeEightByte'} +@c.record +class hipLaunchParams_t(c.Struct): + SIZE = 56 + func: ctypes.c_void_p + gridDim: dim3 + blockDim: dim3 + args: c.POINTER[ctypes.c_void_p] + sharedMem: int + stream: c.POINTER[ihipStream_t] +hipLaunchParams_t.register_fields([('func', ctypes.c_void_p, 0), ('gridDim', dim3, 8), ('blockDim', dim3, 20), ('args', c.POINTER[ctypes.c_void_p], 32), ('sharedMem', size_t, 40), ('stream', hipStream_t, 48)]) +hipLaunchParams: TypeAlias = hipLaunchParams_t +@c.record +class hipFunctionLaunchParams_t(c.Struct): + SIZE = 56 + function: c.POINTER[ihipModuleSymbol_t] + gridDimX: int + gridDimY: int + gridDimZ: int + blockDimX: int + blockDimY: int + blockDimZ: int + sharedMemBytes: int + hStream: c.POINTER[ihipStream_t] + kernelParams: c.POINTER[ctypes.c_void_p] +hipFunctionLaunchParams_t.register_fields([('function', hipFunction_t, 0), ('gridDimX', ctypes.c_uint32, 8), ('gridDimY', ctypes.c_uint32, 12), ('gridDimZ', ctypes.c_uint32, 16), ('blockDimX', ctypes.c_uint32, 20), ('blockDimY', ctypes.c_uint32, 24), ('blockDimZ', ctypes.c_uint32, 28), ('sharedMemBytes', ctypes.c_uint32, 32), ('hStream', hipStream_t, 40), ('kernelParams', c.POINTER[ctypes.c_void_p], 48)]) +hipFunctionLaunchParams: TypeAlias = hipFunctionLaunchParams_t +hipExternalMemoryHandleType_enum: dict[int, str] = {(hipExternalMemoryHandleTypeOpaqueFd:=1): 'hipExternalMemoryHandleTypeOpaqueFd', (hipExternalMemoryHandleTypeOpaqueWin32:=2): 'hipExternalMemoryHandleTypeOpaqueWin32', (hipExternalMemoryHandleTypeOpaqueWin32Kmt:=3): 'hipExternalMemoryHandleTypeOpaqueWin32Kmt', (hipExternalMemoryHandleTypeD3D12Heap:=4): 'hipExternalMemoryHandleTypeD3D12Heap', (hipExternalMemoryHandleTypeD3D12Resource:=5): 'hipExternalMemoryHandleTypeD3D12Resource', (hipExternalMemoryHandleTypeD3D11Resource:=6): 'hipExternalMemoryHandleTypeD3D11Resource', (hipExternalMemoryHandleTypeD3D11ResourceKmt:=7): 'hipExternalMemoryHandleTypeD3D11ResourceKmt', (hipExternalMemoryHandleTypeNvSciBuf:=8): 'hipExternalMemoryHandleTypeNvSciBuf'} +hipExternalMemoryHandleType: TypeAlias = ctypes.c_uint32 +@c.record +class hipExternalMemoryHandleDesc_st(c.Struct): + SIZE = 104 + type: int + handle: hipExternalMemoryHandleDesc_st_handle + size: int + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +@c.record +class hipExternalMemoryHandleDesc_st_handle(c.Struct): + SIZE = 16 + fd: int + win32: hipExternalMemoryHandleDesc_st_handle_win32 + nvSciBufObject: ctypes.c_void_p +@c.record +class hipExternalMemoryHandleDesc_st_handle_win32(c.Struct): + SIZE = 16 + handle: ctypes.c_void_p + name: ctypes.c_void_p +hipExternalMemoryHandleDesc_st_handle_win32.register_fields([('handle', ctypes.c_void_p, 0), ('name', ctypes.c_void_p, 8)]) +hipExternalMemoryHandleDesc_st_handle.register_fields([('fd', ctypes.c_int32, 0), ('win32', hipExternalMemoryHandleDesc_st_handle_win32, 0), ('nvSciBufObject', ctypes.c_void_p, 0)]) +hipExternalMemoryHandleDesc_st.register_fields([('type', hipExternalMemoryHandleType, 0), ('handle', hipExternalMemoryHandleDesc_st_handle, 8), ('size', ctypes.c_uint64, 24), ('flags', ctypes.c_uint32, 32), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 36)]) +hipExternalMemoryHandleDesc: TypeAlias = hipExternalMemoryHandleDesc_st +@c.record +class hipExternalMemoryBufferDesc_st(c.Struct): + SIZE = 88 + offset: int + size: int + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +hipExternalMemoryBufferDesc_st.register_fields([('offset', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('flags', ctypes.c_uint32, 16), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 20)]) +hipExternalMemoryBufferDesc: TypeAlias = hipExternalMemoryBufferDesc_st +@c.record +class hipExternalMemoryMipmappedArrayDesc_st(c.Struct): + SIZE = 64 + offset: int + formatDesc: hipChannelFormatDesc + extent: hipExtent + flags: int + numLevels: int +@c.record +class hipChannelFormatDesc(c.Struct): + SIZE = 20 + x: int + y: int + z: int + w: int + f: int +hipChannelFormatKind: dict[int, str] = {(hipChannelFormatKindSigned:=0): 'hipChannelFormatKindSigned', (hipChannelFormatKindUnsigned:=1): 'hipChannelFormatKindUnsigned', (hipChannelFormatKindFloat:=2): 'hipChannelFormatKindFloat', (hipChannelFormatKindNone:=3): 'hipChannelFormatKindNone'} +hipChannelFormatDesc.register_fields([('x', ctypes.c_int32, 0), ('y', ctypes.c_int32, 4), ('z', ctypes.c_int32, 8), ('w', ctypes.c_int32, 12), ('f', ctypes.c_uint32, 16)]) +@c.record +class hipExtent(c.Struct): + SIZE = 24 + width: int + height: int + depth: int +hipExtent.register_fields([('width', size_t, 0), ('height', size_t, 8), ('depth', size_t, 16)]) +hipExternalMemoryMipmappedArrayDesc_st.register_fields([('offset', ctypes.c_uint64, 0), ('formatDesc', hipChannelFormatDesc, 8), ('extent', hipExtent, 32), ('flags', ctypes.c_uint32, 56), ('numLevels', ctypes.c_uint32, 60)]) +hipExternalMemoryMipmappedArrayDesc: TypeAlias = hipExternalMemoryMipmappedArrayDesc_st +hipExternalMemory_t: TypeAlias = ctypes.c_void_p +hipExternalSemaphoreHandleType_enum: dict[int, str] = {(hipExternalSemaphoreHandleTypeOpaqueFd:=1): 'hipExternalSemaphoreHandleTypeOpaqueFd', (hipExternalSemaphoreHandleTypeOpaqueWin32:=2): 'hipExternalSemaphoreHandleTypeOpaqueWin32', (hipExternalSemaphoreHandleTypeOpaqueWin32Kmt:=3): 'hipExternalSemaphoreHandleTypeOpaqueWin32Kmt', (hipExternalSemaphoreHandleTypeD3D12Fence:=4): 'hipExternalSemaphoreHandleTypeD3D12Fence', (hipExternalSemaphoreHandleTypeD3D11Fence:=5): 'hipExternalSemaphoreHandleTypeD3D11Fence', (hipExternalSemaphoreHandleTypeNvSciSync:=6): 'hipExternalSemaphoreHandleTypeNvSciSync', (hipExternalSemaphoreHandleTypeKeyedMutex:=7): 'hipExternalSemaphoreHandleTypeKeyedMutex', (hipExternalSemaphoreHandleTypeKeyedMutexKmt:=8): 'hipExternalSemaphoreHandleTypeKeyedMutexKmt', (hipExternalSemaphoreHandleTypeTimelineSemaphoreFd:=9): 'hipExternalSemaphoreHandleTypeTimelineSemaphoreFd', (hipExternalSemaphoreHandleTypeTimelineSemaphoreWin32:=10): 'hipExternalSemaphoreHandleTypeTimelineSemaphoreWin32'} +hipExternalSemaphoreHandleType: TypeAlias = ctypes.c_uint32 +@c.record +class hipExternalSemaphoreHandleDesc_st(c.Struct): + SIZE = 96 + type: int + handle: hipExternalSemaphoreHandleDesc_st_handle + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +@c.record +class hipExternalSemaphoreHandleDesc_st_handle(c.Struct): + SIZE = 16 + fd: int + win32: hipExternalSemaphoreHandleDesc_st_handle_win32 + NvSciSyncObj: ctypes.c_void_p +@c.record +class hipExternalSemaphoreHandleDesc_st_handle_win32(c.Struct): + SIZE = 16 + handle: ctypes.c_void_p + name: ctypes.c_void_p +hipExternalSemaphoreHandleDesc_st_handle_win32.register_fields([('handle', ctypes.c_void_p, 0), ('name', ctypes.c_void_p, 8)]) +hipExternalSemaphoreHandleDesc_st_handle.register_fields([('fd', ctypes.c_int32, 0), ('win32', hipExternalSemaphoreHandleDesc_st_handle_win32, 0), ('NvSciSyncObj', ctypes.c_void_p, 0)]) +hipExternalSemaphoreHandleDesc_st.register_fields([('type', hipExternalSemaphoreHandleType, 0), ('handle', hipExternalSemaphoreHandleDesc_st_handle, 8), ('flags', ctypes.c_uint32, 24), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 28)]) +hipExternalSemaphoreHandleDesc: TypeAlias = hipExternalSemaphoreHandleDesc_st +hipExternalSemaphore_t: TypeAlias = ctypes.c_void_p +@c.record +class hipExternalSemaphoreSignalParams_st(c.Struct): + SIZE = 144 + params: hipExternalSemaphoreSignalParams_st_params + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +@c.record +class hipExternalSemaphoreSignalParams_st_params(c.Struct): + SIZE = 72 + fence: hipExternalSemaphoreSignalParams_st_params_fence + nvSciSync: hipExternalSemaphoreSignalParams_st_params_nvSciSync + keyedMutex: hipExternalSemaphoreSignalParams_st_params_keyedMutex + reserved: c.Array[ctypes.c_uint32, Literal[12]] +@c.record +class hipExternalSemaphoreSignalParams_st_params_fence(c.Struct): + SIZE = 8 + value: int +hipExternalSemaphoreSignalParams_st_params_fence.register_fields([('value', ctypes.c_uint64, 0)]) +@c.record +class hipExternalSemaphoreSignalParams_st_params_nvSciSync(c.Struct): + SIZE = 8 + fence: ctypes.c_void_p + reserved: int +hipExternalSemaphoreSignalParams_st_params_nvSciSync.register_fields([('fence', ctypes.c_void_p, 0), ('reserved', ctypes.c_uint64, 0)]) +@c.record +class hipExternalSemaphoreSignalParams_st_params_keyedMutex(c.Struct): + SIZE = 8 + key: int +hipExternalSemaphoreSignalParams_st_params_keyedMutex.register_fields([('key', ctypes.c_uint64, 0)]) +hipExternalSemaphoreSignalParams_st_params.register_fields([('fence', hipExternalSemaphoreSignalParams_st_params_fence, 0), ('nvSciSync', hipExternalSemaphoreSignalParams_st_params_nvSciSync, 8), ('keyedMutex', hipExternalSemaphoreSignalParams_st_params_keyedMutex, 16), ('reserved', c.Array[ctypes.c_uint32, Literal[12]], 24)]) +hipExternalSemaphoreSignalParams_st.register_fields([('params', hipExternalSemaphoreSignalParams_st_params, 0), ('flags', ctypes.c_uint32, 72), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 76)]) +hipExternalSemaphoreSignalParams: TypeAlias = hipExternalSemaphoreSignalParams_st +@c.record +class hipExternalSemaphoreWaitParams_st(c.Struct): + SIZE = 144 + params: hipExternalSemaphoreWaitParams_st_params + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +@c.record +class hipExternalSemaphoreWaitParams_st_params(c.Struct): + SIZE = 72 + fence: hipExternalSemaphoreWaitParams_st_params_fence + nvSciSync: hipExternalSemaphoreWaitParams_st_params_nvSciSync + keyedMutex: hipExternalSemaphoreWaitParams_st_params_keyedMutex + reserved: c.Array[ctypes.c_uint32, Literal[10]] +@c.record +class hipExternalSemaphoreWaitParams_st_params_fence(c.Struct): + SIZE = 8 + value: int +hipExternalSemaphoreWaitParams_st_params_fence.register_fields([('value', ctypes.c_uint64, 0)]) +@c.record +class hipExternalSemaphoreWaitParams_st_params_nvSciSync(c.Struct): + SIZE = 8 + fence: ctypes.c_void_p + reserved: int +hipExternalSemaphoreWaitParams_st_params_nvSciSync.register_fields([('fence', ctypes.c_void_p, 0), ('reserved', ctypes.c_uint64, 0)]) +@c.record +class hipExternalSemaphoreWaitParams_st_params_keyedMutex(c.Struct): + SIZE = 16 + key: int + timeoutMs: int +hipExternalSemaphoreWaitParams_st_params_keyedMutex.register_fields([('key', ctypes.c_uint64, 0), ('timeoutMs', ctypes.c_uint32, 8)]) +hipExternalSemaphoreWaitParams_st_params.register_fields([('fence', hipExternalSemaphoreWaitParams_st_params_fence, 0), ('nvSciSync', hipExternalSemaphoreWaitParams_st_params_nvSciSync, 8), ('keyedMutex', hipExternalSemaphoreWaitParams_st_params_keyedMutex, 16), ('reserved', c.Array[ctypes.c_uint32, Literal[10]], 32)]) +hipExternalSemaphoreWaitParams_st.register_fields([('params', hipExternalSemaphoreWaitParams_st_params, 0), ('flags', ctypes.c_uint32, 72), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 76)]) +hipExternalSemaphoreWaitParams: TypeAlias = hipExternalSemaphoreWaitParams_st +@dll.bind(None, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_uint32]) +def __hipGetPCH(pch:c.POINTER[c.POINTER[ctypes.c_char]], size:c.POINTER[ctypes.c_uint32]) -> None: ... +hipGraphicsRegisterFlags: dict[int, str] = {(hipGraphicsRegisterFlagsNone:=0): 'hipGraphicsRegisterFlagsNone', (hipGraphicsRegisterFlagsReadOnly:=1): 'hipGraphicsRegisterFlagsReadOnly', (hipGraphicsRegisterFlagsWriteDiscard:=2): 'hipGraphicsRegisterFlagsWriteDiscard', (hipGraphicsRegisterFlagsSurfaceLoadStore:=4): 'hipGraphicsRegisterFlagsSurfaceLoadStore', (hipGraphicsRegisterFlagsTextureGather:=8): 'hipGraphicsRegisterFlagsTextureGather'} +class _hipGraphicsResource(c.Struct): pass +hipGraphicsResource: TypeAlias = _hipGraphicsResource +hipGraphicsResource_t: TypeAlias = c.POINTER[_hipGraphicsResource] +class ihipGraph(c.Struct): pass +hipGraph_t: TypeAlias = c.POINTER[ihipGraph] +class hipGraphNode(c.Struct): pass +hipGraphNode_t: TypeAlias = c.POINTER[hipGraphNode] +class hipGraphExec(c.Struct): pass +hipGraphExec_t: TypeAlias = c.POINTER[hipGraphExec] +class hipUserObject(c.Struct): pass +hipUserObject_t: TypeAlias = c.POINTER[hipUserObject] +hipGraphNodeType: dict[int, str] = {(hipGraphNodeTypeKernel:=0): 'hipGraphNodeTypeKernel', (hipGraphNodeTypeMemcpy:=1): 'hipGraphNodeTypeMemcpy', (hipGraphNodeTypeMemset:=2): 'hipGraphNodeTypeMemset', (hipGraphNodeTypeHost:=3): 'hipGraphNodeTypeHost', (hipGraphNodeTypeGraph:=4): 'hipGraphNodeTypeGraph', (hipGraphNodeTypeEmpty:=5): 'hipGraphNodeTypeEmpty', (hipGraphNodeTypeWaitEvent:=6): 'hipGraphNodeTypeWaitEvent', (hipGraphNodeTypeEventRecord:=7): 'hipGraphNodeTypeEventRecord', (hipGraphNodeTypeExtSemaphoreSignal:=8): 'hipGraphNodeTypeExtSemaphoreSignal', (hipGraphNodeTypeExtSemaphoreWait:=9): 'hipGraphNodeTypeExtSemaphoreWait', (hipGraphNodeTypeMemAlloc:=10): 'hipGraphNodeTypeMemAlloc', (hipGraphNodeTypeMemFree:=11): 'hipGraphNodeTypeMemFree', (hipGraphNodeTypeMemcpyFromSymbol:=12): 'hipGraphNodeTypeMemcpyFromSymbol', (hipGraphNodeTypeMemcpyToSymbol:=13): 'hipGraphNodeTypeMemcpyToSymbol', (hipGraphNodeTypeBatchMemOp:=14): 'hipGraphNodeTypeBatchMemOp', (hipGraphNodeTypeCount:=15): 'hipGraphNodeTypeCount'} +hipHostFn_t: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +@c.record +class hipHostNodeParams(c.Struct): + SIZE = 16 + fn: c.CFUNCTYPE[None, [ctypes.c_void_p]] + userData: ctypes.c_void_p +hipHostNodeParams.register_fields([('fn', hipHostFn_t, 0), ('userData', ctypes.c_void_p, 8)]) +@c.record +class hipKernelNodeParams(c.Struct): + SIZE = 64 + blockDim: dim3 + extra: c.POINTER[ctypes.c_void_p] + func: ctypes.c_void_p + gridDim: dim3 + kernelParams: c.POINTER[ctypes.c_void_p] + sharedMemBytes: int +hipKernelNodeParams.register_fields([('blockDim', dim3, 0), ('extra', c.POINTER[ctypes.c_void_p], 16), ('func', ctypes.c_void_p, 24), ('gridDim', dim3, 32), ('kernelParams', c.POINTER[ctypes.c_void_p], 48), ('sharedMemBytes', ctypes.c_uint32, 56)]) +@c.record +class hipMemsetParams(c.Struct): + SIZE = 48 + dst: ctypes.c_void_p + elementSize: int + height: int + pitch: int + value: int + width: int +hipMemsetParams.register_fields([('dst', ctypes.c_void_p, 0), ('elementSize', ctypes.c_uint32, 8), ('height', size_t, 16), ('pitch', size_t, 24), ('value', ctypes.c_uint32, 32), ('width', size_t, 40)]) +@c.record +class hipMemAllocNodeParams(c.Struct): + SIZE = 120 + poolProps: hipMemPoolProps + accessDescs: c.POINTER[hipMemAccessDesc] + accessDescCount: int + bytesize: int + dptr: ctypes.c_void_p +hipMemAllocNodeParams.register_fields([('poolProps', hipMemPoolProps, 0), ('accessDescs', c.POINTER[hipMemAccessDesc], 88), ('accessDescCount', size_t, 96), ('bytesize', size_t, 104), ('dptr', ctypes.c_void_p, 112)]) +hipAccessProperty: dict[int, str] = {(hipAccessPropertyNormal:=0): 'hipAccessPropertyNormal', (hipAccessPropertyStreaming:=1): 'hipAccessPropertyStreaming', (hipAccessPropertyPersisting:=2): 'hipAccessPropertyPersisting'} +@c.record +class hipAccessPolicyWindow(c.Struct): + SIZE = 32 + base_ptr: ctypes.c_void_p + hitProp: int + hitRatio: float + missProp: int + num_bytes: int +hipAccessPolicyWindow.register_fields([('base_ptr', ctypes.c_void_p, 0), ('hitProp', ctypes.c_uint32, 8), ('hitRatio', ctypes.c_float, 12), ('missProp', ctypes.c_uint32, 16), ('num_bytes', size_t, 24)]) +@c.record +class hipLaunchMemSyncDomainMap(c.Struct): + SIZE = 2 + default_: int + remote: int +hipLaunchMemSyncDomainMap.register_fields([('default_', ctypes.c_ubyte, 0), ('remote', ctypes.c_ubyte, 1)]) +hipLaunchMemSyncDomain: dict[int, str] = {(hipLaunchMemSyncDomainDefault:=0): 'hipLaunchMemSyncDomainDefault', (hipLaunchMemSyncDomainRemote:=1): 'hipLaunchMemSyncDomainRemote'} +hipSynchronizationPolicy: dict[int, str] = {(hipSyncPolicyAuto:=1): 'hipSyncPolicyAuto', (hipSyncPolicySpin:=2): 'hipSyncPolicySpin', (hipSyncPolicyYield:=3): 'hipSyncPolicyYield', (hipSyncPolicyBlockingSync:=4): 'hipSyncPolicyBlockingSync'} +hipLaunchAttributeID: dict[int, str] = {(hipLaunchAttributeAccessPolicyWindow:=1): 'hipLaunchAttributeAccessPolicyWindow', (hipLaunchAttributeCooperative:=2): 'hipLaunchAttributeCooperative', (hipLaunchAttributeSynchronizationPolicy:=3): 'hipLaunchAttributeSynchronizationPolicy', (hipLaunchAttributePriority:=8): 'hipLaunchAttributePriority', (hipLaunchAttributeMemSyncDomainMap:=9): 'hipLaunchAttributeMemSyncDomainMap', (hipLaunchAttributeMemSyncDomain:=10): 'hipLaunchAttributeMemSyncDomain', (hipLaunchAttributeMax:=11): 'hipLaunchAttributeMax'} +@c.record +class hipLaunchAttributeValue(c.Struct): + SIZE = 64 + pad: c.Array[ctypes.c_char, Literal[64]] + accessPolicyWindow: hipAccessPolicyWindow + cooperative: int + priority: int + syncPolicy: int + memSyncDomainMap: hipLaunchMemSyncDomainMap + memSyncDomain: int +hipLaunchAttributeValue.register_fields([('pad', c.Array[ctypes.c_char, Literal[64]], 0), ('accessPolicyWindow', hipAccessPolicyWindow, 0), ('cooperative', ctypes.c_int32, 0), ('priority', ctypes.c_int32, 0), ('syncPolicy', ctypes.c_uint32, 0), ('memSyncDomainMap', hipLaunchMemSyncDomainMap, 0), ('memSyncDomain', ctypes.c_uint32, 0)]) +hipGraphExecUpdateResult: dict[int, str] = {(hipGraphExecUpdateSuccess:=0): 'hipGraphExecUpdateSuccess', (hipGraphExecUpdateError:=1): 'hipGraphExecUpdateError', (hipGraphExecUpdateErrorTopologyChanged:=2): 'hipGraphExecUpdateErrorTopologyChanged', (hipGraphExecUpdateErrorNodeTypeChanged:=3): 'hipGraphExecUpdateErrorNodeTypeChanged', (hipGraphExecUpdateErrorFunctionChanged:=4): 'hipGraphExecUpdateErrorFunctionChanged', (hipGraphExecUpdateErrorParametersChanged:=5): 'hipGraphExecUpdateErrorParametersChanged', (hipGraphExecUpdateErrorNotSupported:=6): 'hipGraphExecUpdateErrorNotSupported', (hipGraphExecUpdateErrorUnsupportedFunctionChange:=7): 'hipGraphExecUpdateErrorUnsupportedFunctionChange'} +hipStreamCaptureMode: dict[int, str] = {(hipStreamCaptureModeGlobal:=0): 'hipStreamCaptureModeGlobal', (hipStreamCaptureModeThreadLocal:=1): 'hipStreamCaptureModeThreadLocal', (hipStreamCaptureModeRelaxed:=2): 'hipStreamCaptureModeRelaxed'} +hipStreamCaptureStatus: dict[int, str] = {(hipStreamCaptureStatusNone:=0): 'hipStreamCaptureStatusNone', (hipStreamCaptureStatusActive:=1): 'hipStreamCaptureStatusActive', (hipStreamCaptureStatusInvalidated:=2): 'hipStreamCaptureStatusInvalidated'} +hipStreamUpdateCaptureDependenciesFlags: dict[int, str] = {(hipStreamAddCaptureDependencies:=0): 'hipStreamAddCaptureDependencies', (hipStreamSetCaptureDependencies:=1): 'hipStreamSetCaptureDependencies'} +hipGraphMemAttributeType: dict[int, str] = {(hipGraphMemAttrUsedMemCurrent:=0): 'hipGraphMemAttrUsedMemCurrent', (hipGraphMemAttrUsedMemHigh:=1): 'hipGraphMemAttrUsedMemHigh', (hipGraphMemAttrReservedMemCurrent:=2): 'hipGraphMemAttrReservedMemCurrent', (hipGraphMemAttrReservedMemHigh:=3): 'hipGraphMemAttrReservedMemHigh'} +hipUserObjectFlags: dict[int, str] = {(hipUserObjectNoDestructorSync:=1): 'hipUserObjectNoDestructorSync'} +hipUserObjectRetainFlags: dict[int, str] = {(hipGraphUserObjectMove:=1): 'hipGraphUserObjectMove'} +hipGraphInstantiateFlags: dict[int, str] = {(hipGraphInstantiateFlagAutoFreeOnLaunch:=1): 'hipGraphInstantiateFlagAutoFreeOnLaunch', (hipGraphInstantiateFlagUpload:=2): 'hipGraphInstantiateFlagUpload', (hipGraphInstantiateFlagDeviceLaunch:=4): 'hipGraphInstantiateFlagDeviceLaunch', (hipGraphInstantiateFlagUseNodePriority:=8): 'hipGraphInstantiateFlagUseNodePriority'} +hipGraphDebugDotFlags: dict[int, str] = {(hipGraphDebugDotFlagsVerbose:=1): 'hipGraphDebugDotFlagsVerbose', (hipGraphDebugDotFlagsKernelNodeParams:=4): 'hipGraphDebugDotFlagsKernelNodeParams', (hipGraphDebugDotFlagsMemcpyNodeParams:=8): 'hipGraphDebugDotFlagsMemcpyNodeParams', (hipGraphDebugDotFlagsMemsetNodeParams:=16): 'hipGraphDebugDotFlagsMemsetNodeParams', (hipGraphDebugDotFlagsHostNodeParams:=32): 'hipGraphDebugDotFlagsHostNodeParams', (hipGraphDebugDotFlagsEventNodeParams:=64): 'hipGraphDebugDotFlagsEventNodeParams', (hipGraphDebugDotFlagsExtSemasSignalNodeParams:=128): 'hipGraphDebugDotFlagsExtSemasSignalNodeParams', (hipGraphDebugDotFlagsExtSemasWaitNodeParams:=256): 'hipGraphDebugDotFlagsExtSemasWaitNodeParams', (hipGraphDebugDotFlagsKernelNodeAttributes:=512): 'hipGraphDebugDotFlagsKernelNodeAttributes', (hipGraphDebugDotFlagsHandles:=1024): 'hipGraphDebugDotFlagsHandles'} +hipGraphInstantiateResult: dict[int, str] = {(hipGraphInstantiateSuccess:=0): 'hipGraphInstantiateSuccess', (hipGraphInstantiateError:=1): 'hipGraphInstantiateError', (hipGraphInstantiateInvalidStructure:=2): 'hipGraphInstantiateInvalidStructure', (hipGraphInstantiateNodeOperationNotSupported:=3): 'hipGraphInstantiateNodeOperationNotSupported', (hipGraphInstantiateMultipleDevicesNotSupported:=4): 'hipGraphInstantiateMultipleDevicesNotSupported'} +@c.record +class hipGraphInstantiateParams(c.Struct): + SIZE = 32 + errNode_out: c.POINTER[hipGraphNode] + flags: int + result_out: int + uploadStream: c.POINTER[ihipStream_t] +hipGraphInstantiateParams.register_fields([('errNode_out', hipGraphNode_t, 0), ('flags', ctypes.c_uint64, 8), ('result_out', ctypes.c_uint32, 16), ('uploadStream', hipStream_t, 24)]) +@c.record +class hipMemAllocationProp(c.Struct): + SIZE = 32 + type: int + requestedHandleType: int + requestedHandleTypes: int + location: hipMemLocation + win32HandleMetaData: ctypes.c_void_p + allocFlags: hipMemAllocationProp_allocFlags +@c.record +class hipMemAllocationProp_allocFlags(c.Struct): + SIZE = 4 + compressionType: int + gpuDirectRDMACapable: int + usage: int +hipMemAllocationProp_allocFlags.register_fields([('compressionType', ctypes.c_ubyte, 0), ('gpuDirectRDMACapable', ctypes.c_ubyte, 1), ('usage', ctypes.c_uint16, 2)]) +hipMemAllocationProp.register_fields([('type', ctypes.c_uint32, 0), ('requestedHandleType', ctypes.c_uint32, 4), ('requestedHandleTypes', ctypes.c_uint32, 4), ('location', hipMemLocation, 8), ('win32HandleMetaData', ctypes.c_void_p, 16), ('allocFlags', hipMemAllocationProp_allocFlags, 24)]) +@c.record +class hipExternalSemaphoreSignalNodeParams(c.Struct): + SIZE = 24 + extSemArray: c.POINTER[ctypes.c_void_p] + paramsArray: c.POINTER[hipExternalSemaphoreSignalParams_st] + numExtSems: int +hipExternalSemaphoreSignalNodeParams.register_fields([('extSemArray', c.POINTER[hipExternalSemaphore_t], 0), ('paramsArray', c.POINTER[hipExternalSemaphoreSignalParams], 8), ('numExtSems', ctypes.c_uint32, 16)]) +@c.record +class hipExternalSemaphoreWaitNodeParams(c.Struct): + SIZE = 24 + extSemArray: c.POINTER[ctypes.c_void_p] + paramsArray: c.POINTER[hipExternalSemaphoreWaitParams_st] + numExtSems: int +hipExternalSemaphoreWaitNodeParams.register_fields([('extSemArray', c.POINTER[hipExternalSemaphore_t], 0), ('paramsArray', c.POINTER[hipExternalSemaphoreWaitParams], 8), ('numExtSems', ctypes.c_uint32, 16)]) +class ihipMemGenericAllocationHandle(c.Struct): pass +hipMemGenericAllocationHandle_t: TypeAlias = c.POINTER[ihipMemGenericAllocationHandle] +hipMemAllocationGranularity_flags: dict[int, str] = {(hipMemAllocationGranularityMinimum:=0): 'hipMemAllocationGranularityMinimum', (hipMemAllocationGranularityRecommended:=1): 'hipMemAllocationGranularityRecommended'} +hipMemHandleType: dict[int, str] = {(hipMemHandleTypeGeneric:=0): 'hipMemHandleTypeGeneric'} +hipMemOperationType: dict[int, str] = {(hipMemOperationTypeMap:=1): 'hipMemOperationTypeMap', (hipMemOperationTypeUnmap:=2): 'hipMemOperationTypeUnmap'} +hipArraySparseSubresourceType: dict[int, str] = {(hipArraySparseSubresourceTypeSparseLevel:=0): 'hipArraySparseSubresourceTypeSparseLevel', (hipArraySparseSubresourceTypeMiptail:=1): 'hipArraySparseSubresourceTypeMiptail'} +@c.record +class hipArrayMapInfo(c.Struct): + SIZE = 152 + resourceType: int + resource: hipArrayMapInfo_resource + subresourceType: int + subresource: hipArrayMapInfo_subresource + memOperationType: int + memHandleType: int + memHandle: hipArrayMapInfo_memHandle + offset: int + deviceBitMask: int + flags: int + reserved: c.Array[ctypes.c_uint32, Literal[2]] +hipResourceType: dict[int, str] = {(hipResourceTypeArray:=0): 'hipResourceTypeArray', (hipResourceTypeMipmappedArray:=1): 'hipResourceTypeMipmappedArray', (hipResourceTypeLinear:=2): 'hipResourceTypeLinear', (hipResourceTypePitch2D:=3): 'hipResourceTypePitch2D'} +@c.record +class hipArrayMapInfo_resource(c.Struct): + SIZE = 64 + mipmap: hipMipmappedArray + array: c.POINTER[hipArray] +@c.record +class hipMipmappedArray(c.Struct): + SIZE = 64 + data: ctypes.c_void_p + desc: hipChannelFormatDesc + type: int + width: int + height: int + depth: int + min_mipmap_level: int + max_mipmap_level: int + flags: int + format: int + num_channels: int +hipArray_Format: dict[int, str] = {(HIP_AD_FORMAT_UNSIGNED_INT8:=1): 'HIP_AD_FORMAT_UNSIGNED_INT8', (HIP_AD_FORMAT_UNSIGNED_INT16:=2): 'HIP_AD_FORMAT_UNSIGNED_INT16', (HIP_AD_FORMAT_UNSIGNED_INT32:=3): 'HIP_AD_FORMAT_UNSIGNED_INT32', (HIP_AD_FORMAT_SIGNED_INT8:=8): 'HIP_AD_FORMAT_SIGNED_INT8', (HIP_AD_FORMAT_SIGNED_INT16:=9): 'HIP_AD_FORMAT_SIGNED_INT16', (HIP_AD_FORMAT_SIGNED_INT32:=10): 'HIP_AD_FORMAT_SIGNED_INT32', (HIP_AD_FORMAT_HALF:=16): 'HIP_AD_FORMAT_HALF', (HIP_AD_FORMAT_FLOAT:=32): 'HIP_AD_FORMAT_FLOAT'} +hipMipmappedArray.register_fields([('data', ctypes.c_void_p, 0), ('desc', hipChannelFormatDesc, 8), ('type', ctypes.c_uint32, 28), ('width', ctypes.c_uint32, 32), ('height', ctypes.c_uint32, 36), ('depth', ctypes.c_uint32, 40), ('min_mipmap_level', ctypes.c_uint32, 44), ('max_mipmap_level', ctypes.c_uint32, 48), ('flags', ctypes.c_uint32, 52), ('format', ctypes.c_uint32, 56), ('num_channels', ctypes.c_uint32, 60)]) +class hipArray(c.Struct): pass +hipArray_t: TypeAlias = c.POINTER[hipArray] +hipArrayMapInfo_resource.register_fields([('mipmap', hipMipmappedArray, 0), ('array', hipArray_t, 0)]) +@c.record +class hipArrayMapInfo_subresource(c.Struct): + SIZE = 32 + sparseLevel: hipArrayMapInfo_subresource_sparseLevel + miptail: hipArrayMapInfo_subresource_miptail +@c.record +class hipArrayMapInfo_subresource_sparseLevel(c.Struct): + SIZE = 32 + level: int + layer: int + offsetX: int + offsetY: int + offsetZ: int + extentWidth: int + extentHeight: int + extentDepth: int +hipArrayMapInfo_subresource_sparseLevel.register_fields([('level', ctypes.c_uint32, 0), ('layer', ctypes.c_uint32, 4), ('offsetX', ctypes.c_uint32, 8), ('offsetY', ctypes.c_uint32, 12), ('offsetZ', ctypes.c_uint32, 16), ('extentWidth', ctypes.c_uint32, 20), ('extentHeight', ctypes.c_uint32, 24), ('extentDepth', ctypes.c_uint32, 28)]) +@c.record +class hipArrayMapInfo_subresource_miptail(c.Struct): + SIZE = 24 + layer: int + offset: int + size: int +hipArrayMapInfo_subresource_miptail.register_fields([('layer', ctypes.c_uint32, 0), ('offset', ctypes.c_uint64, 8), ('size', ctypes.c_uint64, 16)]) +hipArrayMapInfo_subresource.register_fields([('sparseLevel', hipArrayMapInfo_subresource_sparseLevel, 0), ('miptail', hipArrayMapInfo_subresource_miptail, 0)]) +@c.record +class hipArrayMapInfo_memHandle(c.Struct): + SIZE = 8 + memHandle: c.POINTER[ihipMemGenericAllocationHandle] +hipArrayMapInfo_memHandle.register_fields([('memHandle', hipMemGenericAllocationHandle_t, 0)]) +hipArrayMapInfo.register_fields([('resourceType', ctypes.c_uint32, 0), ('resource', hipArrayMapInfo_resource, 8), ('subresourceType', ctypes.c_uint32, 72), ('subresource', hipArrayMapInfo_subresource, 80), ('memOperationType', ctypes.c_uint32, 112), ('memHandleType', ctypes.c_uint32, 116), ('memHandle', hipArrayMapInfo_memHandle, 120), ('offset', ctypes.c_uint64, 128), ('deviceBitMask', ctypes.c_uint32, 136), ('flags', ctypes.c_uint32, 140), ('reserved', c.Array[ctypes.c_uint32, Literal[2]], 144)]) +@c.record +class hipMemcpyNodeParams(c.Struct): + SIZE = 176 + flags: int + reserved: c.Array[ctypes.c_int32, Literal[3]] + copyParams: hipMemcpy3DParms +@c.record +class hipMemcpy3DParms(c.Struct): + SIZE = 160 + srcArray: c.POINTER[hipArray] + srcPos: hipPos + srcPtr: hipPitchedPtr + dstArray: c.POINTER[hipArray] + dstPos: hipPos + dstPtr: hipPitchedPtr + extent: hipExtent + kind: int +@c.record +class hipPos(c.Struct): + SIZE = 24 + x: int + y: int + z: int +hipPos.register_fields([('x', size_t, 0), ('y', size_t, 8), ('z', size_t, 16)]) +@c.record +class hipPitchedPtr(c.Struct): + SIZE = 32 + ptr: ctypes.c_void_p + pitch: int + xsize: int + ysize: int +hipPitchedPtr.register_fields([('ptr', ctypes.c_void_p, 0), ('pitch', size_t, 8), ('xsize', size_t, 16), ('ysize', size_t, 24)]) +hipMemcpyKind: dict[int, str] = {(hipMemcpyHostToHost:=0): 'hipMemcpyHostToHost', (hipMemcpyHostToDevice:=1): 'hipMemcpyHostToDevice', (hipMemcpyDeviceToHost:=2): 'hipMemcpyDeviceToHost', (hipMemcpyDeviceToDevice:=3): 'hipMemcpyDeviceToDevice', (hipMemcpyDefault:=4): 'hipMemcpyDefault', (hipMemcpyDeviceToDeviceNoCU:=1024): 'hipMemcpyDeviceToDeviceNoCU'} +hipMemcpy3DParms.register_fields([('srcArray', hipArray_t, 0), ('srcPos', hipPos, 8), ('srcPtr', hipPitchedPtr, 32), ('dstArray', hipArray_t, 64), ('dstPos', hipPos, 72), ('dstPtr', hipPitchedPtr, 96), ('extent', hipExtent, 128), ('kind', ctypes.c_uint32, 152)]) +hipMemcpyNodeParams.register_fields([('flags', ctypes.c_int32, 0), ('reserved', c.Array[ctypes.c_int32, Literal[3]], 4), ('copyParams', hipMemcpy3DParms, 16)]) +@c.record +class hipChildGraphNodeParams(c.Struct): + SIZE = 8 + graph: c.POINTER[ihipGraph] +hipChildGraphNodeParams.register_fields([('graph', hipGraph_t, 0)]) +@c.record +class hipEventWaitNodeParams(c.Struct): + SIZE = 8 + event: c.POINTER[ihipEvent_t] +hipEventWaitNodeParams.register_fields([('event', hipEvent_t, 0)]) +@c.record +class hipEventRecordNodeParams(c.Struct): + SIZE = 8 + event: c.POINTER[ihipEvent_t] +hipEventRecordNodeParams.register_fields([('event', hipEvent_t, 0)]) +@c.record +class hipMemFreeNodeParams(c.Struct): + SIZE = 8 + dptr: ctypes.c_void_p +hipMemFreeNodeParams.register_fields([('dptr', ctypes.c_void_p, 0)]) +@c.record +class hipGraphNodeParams(c.Struct): + SIZE = 256 + type: int + reserved0: c.Array[ctypes.c_int32, Literal[3]] + reserved1: c.Array[ctypes.c_int64, Literal[29]] + kernel: hipKernelNodeParams + memcpy: hipMemcpyNodeParams + memset: hipMemsetParams + host: hipHostNodeParams + graph: hipChildGraphNodeParams + eventWait: hipEventWaitNodeParams + eventRecord: hipEventRecordNodeParams + extSemSignal: hipExternalSemaphoreSignalNodeParams + extSemWait: hipExternalSemaphoreWaitNodeParams + alloc: hipMemAllocNodeParams + free: hipMemFreeNodeParams + reserved2: int +hipGraphNodeParams.register_fields([('type', ctypes.c_uint32, 0), ('reserved0', c.Array[ctypes.c_int32, Literal[3]], 4), ('reserved1', c.Array[ctypes.c_int64, Literal[29]], 16), ('kernel', hipKernelNodeParams, 16), ('memcpy', hipMemcpyNodeParams, 16), ('memset', hipMemsetParams, 16), ('host', hipHostNodeParams, 16), ('graph', hipChildGraphNodeParams, 16), ('eventWait', hipEventWaitNodeParams, 16), ('eventRecord', hipEventRecordNodeParams, 16), ('extSemSignal', hipExternalSemaphoreSignalNodeParams, 16), ('extSemWait', hipExternalSemaphoreWaitNodeParams, 16), ('alloc', hipMemAllocNodeParams, 16), ('free', hipMemFreeNodeParams, 16), ('reserved2', ctypes.c_int64, 248)]) +hipGraphDependencyType: dict[int, str] = {(hipGraphDependencyTypeDefault:=0): 'hipGraphDependencyTypeDefault', (hipGraphDependencyTypeProgrammatic:=1): 'hipGraphDependencyTypeProgrammatic'} +@c.record +class hipGraphEdgeData(c.Struct): + SIZE = 8 + from_port: int + reserved: c.Array[ctypes.c_ubyte, Literal[5]] + to_port: int + type: int +hipGraphEdgeData.register_fields([('from_port', ctypes.c_ubyte, 0), ('reserved', c.Array[ctypes.c_ubyte, Literal[5]], 1), ('to_port', ctypes.c_ubyte, 6), ('type', ctypes.c_ubyte, 7)]) +@c.record +class hipLaunchAttribute_st(c.Struct): + SIZE = 72 + id: int + pad: c.Array[ctypes.c_char, Literal[4]] + val: hipLaunchAttributeValue + value: hipLaunchAttributeValue +hipLaunchAttribute_st.register_fields([('id', ctypes.c_uint32, 0), ('pad', c.Array[ctypes.c_char, Literal[4]], 4), ('val', hipLaunchAttributeValue, 8), ('value', hipLaunchAttributeValue, 8)]) +hipLaunchAttribute: TypeAlias = hipLaunchAttribute_st +@c.record +class hipLaunchConfig_st(c.Struct): + SIZE = 56 + gridDim: dim3 + blockDim: dim3 + dynamicSmemBytes: int + stream: c.POINTER[ihipStream_t] + attrs: c.POINTER[hipLaunchAttribute_st] + numAttrs: int +hipLaunchConfig_st.register_fields([('gridDim', dim3, 0), ('blockDim', dim3, 12), ('dynamicSmemBytes', size_t, 24), ('stream', hipStream_t, 32), ('attrs', c.POINTER[hipLaunchAttribute], 40), ('numAttrs', ctypes.c_uint32, 48)]) +hipLaunchConfig_t: TypeAlias = hipLaunchConfig_st +@c.record +class HIP_LAUNCH_CONFIG_st(c.Struct): + SIZE = 56 + gridDimX: int + gridDimY: int + gridDimZ: int + blockDimX: int + blockDimY: int + blockDimZ: int + sharedMemBytes: int + hStream: c.POINTER[ihipStream_t] + attrs: c.POINTER[hipLaunchAttribute_st] + numAttrs: int +HIP_LAUNCH_CONFIG_st.register_fields([('gridDimX', ctypes.c_uint32, 0), ('gridDimY', ctypes.c_uint32, 4), ('gridDimZ', ctypes.c_uint32, 8), ('blockDimX', ctypes.c_uint32, 12), ('blockDimY', ctypes.c_uint32, 16), ('blockDimZ', ctypes.c_uint32, 20), ('sharedMemBytes', ctypes.c_uint32, 24), ('hStream', hipStream_t, 32), ('attrs', c.POINTER[hipLaunchAttribute], 40), ('numAttrs', ctypes.c_uint32, 48)]) +HIP_LAUNCH_CONFIG: TypeAlias = HIP_LAUNCH_CONFIG_st +hipMemRangeHandleType: dict[int, str] = {(hipMemRangeHandleTypeDmaBufFd:=1): 'hipMemRangeHandleTypeDmaBufFd', (hipMemRangeHandleTypeMax:=2147483647): 'hipMemRangeHandleTypeMax'} +hipMemRangeFlags: dict[int, str] = {(hipMemRangeFlagDmaBufMappingTypePcie:=1): 'hipMemRangeFlagDmaBufMappingTypePcie', (hipMemRangeFlagsMax:=2147483647): 'hipMemRangeFlagsMax'} +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def hipInit(flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32]) +def hipDriverGetVersion(driverVersion:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32]) +def hipRuntimeGetVersion(runtimeVersion:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipDevice_t], ctypes.c_int32) +def hipDeviceGet(device:c.POINTER[hipDevice_t], ordinal:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], hipDevice_t) +def hipDeviceComputeCapability(major:c.POINTER[ctypes.c_int32], minor:c.POINTER[ctypes.c_int32], device:hipDevice_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_int32, hipDevice_t) +def hipDeviceGetName(name:c.POINTER[ctypes.c_char], len:int, device:hipDevice_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipUUID], hipDevice_t) +def hipDeviceGetUuid(uuid:c.POINTER[hipUUID], device:hipDevice_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], ctypes.c_uint32, ctypes.c_int32, ctypes.c_int32) +def hipDeviceGetP2PAttribute(value:c.POINTER[ctypes.c_int32], attr:ctypes.c_uint32, srcDevice:int, dstDevice:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_int32, ctypes.c_int32) +def hipDeviceGetPCIBusId(pciBusId:c.POINTER[ctypes.c_char], len:int, device:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_char]) +def hipDeviceGetByPCIBusId(device:c.POINTER[ctypes.c_int32], pciBusId:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], hipDevice_t) +def hipDeviceTotalMem(bytes:c.POINTER[size_t], device:hipDevice_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def hipDeviceSynchronize() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def hipDeviceReset() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32) +def hipSetDevice(deviceId:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], ctypes.c_int32) +def hipSetValidDevices(device_arr:c.POINTER[ctypes.c_int32], len:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32]) +def hipGetDevice(deviceId:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32]) +def hipGetDeviceCount(count:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], ctypes.c_uint32, ctypes.c_int32) +def hipDeviceGetAttribute(pi:c.POINTER[ctypes.c_int32], attr:ctypes.c_uint32, deviceId:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemPool_t], ctypes.c_int32) +def hipDeviceGetDefaultMemPool(mem_pool:c.POINTER[hipMemPool_t], device:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32, hipMemPool_t) +def hipDeviceSetMemPool(device:int, mem_pool:hipMemPool_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemPool_t], ctypes.c_int32) +def hipDeviceGetMemPool(mem_pool:c.POINTER[hipMemPool_t], device:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipDeviceProp_tR0600], ctypes.c_int32) +def hipGetDevicePropertiesR0600(prop:c.POINTER[hipDeviceProp_tR0600], deviceId:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], c.POINTER[hipChannelFormatDesc], ctypes.c_int32) +def hipDeviceGetTexture1DLinearMaxWidth(max_width:c.POINTER[size_t], desc:c.POINTER[hipChannelFormatDesc], device:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def hipDeviceSetCacheConfig(cacheConfig:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def hipDeviceGetCacheConfig(cacheConfig:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], ctypes.c_uint32) +def hipDeviceGetLimit(pValue:c.POINTER[size_t], limit:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32, size_t) +def hipDeviceSetLimit(limit:ctypes.c_uint32, value:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def hipDeviceGetSharedMemConfig(pConfig:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def hipGetDeviceFlags(flags:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def hipDeviceSetSharedMemConfig(config:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def hipSetDeviceFlags(flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[hipDeviceProp_tR0600]) +def hipChooseDeviceR0600(device:c.POINTER[ctypes.c_int32], prop:c.POINTER[hipDeviceProp_tR0600]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32, ctypes.c_int32, c.POINTER[uint32_t], c.POINTER[uint32_t]) +def hipExtGetLinkTypeAndHopCount(device1:int, device2:int, linktype:c.POINTER[uint32_t], hopcount:c.POINTER[uint32_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipIpcMemHandle_t], ctypes.c_void_p) +def hipIpcGetMemHandle(handle:c.POINTER[hipIpcMemHandle_t], devPtr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], hipIpcMemHandle_t, ctypes.c_uint32) +def hipIpcOpenMemHandle(devPtr:c.POINTER[ctypes.c_void_p], handle:hipIpcMemHandle_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p) +def hipIpcCloseMemHandle(devPtr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipIpcEventHandle_t], hipEvent_t) +def hipIpcGetEventHandle(handle:c.POINTER[hipIpcEventHandle_t], event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipEvent_t], hipIpcEventHandle_t) +def hipIpcOpenEventHandle(event:c.POINTER[hipEvent_t], handle:hipIpcEventHandle_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_int32) +def hipFuncSetAttribute(func:ctypes.c_void_p, attr:ctypes.c_uint32, value:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_uint32) +def hipFuncSetCacheConfig(func:ctypes.c_void_p, config:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_uint32) +def hipFuncSetSharedMemConfig(func:ctypes.c_void_p, config:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def hipGetLastError() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def hipExtGetLastError() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def hipPeekAtLastError() -> ctypes.c_uint32: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32) +def hipGetErrorName(hip_error:ctypes.c_uint32) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32) +def hipGetErrorString(hipError:ctypes.c_uint32) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32, c.POINTER[c.POINTER[ctypes.c_char]]) +def hipDrvGetErrorName(hipError:ctypes.c_uint32, errorString:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32, c.POINTER[c.POINTER[ctypes.c_char]]) +def hipDrvGetErrorString(hipError:ctypes.c_uint32, errorString:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipStream_t]) +def hipStreamCreate(stream:c.POINTER[hipStream_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipStream_t], ctypes.c_uint32) +def hipStreamCreateWithFlags(stream:c.POINTER[hipStream_t], flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipStream_t], ctypes.c_uint32, ctypes.c_int32) +def hipStreamCreateWithPriority(stream:c.POINTER[hipStream_t], flags:int, priority:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32]) +def hipDeviceGetStreamPriorityRange(leastPriority:c.POINTER[ctypes.c_int32], greatestPriority:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t) +def hipStreamDestroy(stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t) +def hipStreamQuery(stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t) +def hipStreamSynchronize(stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, hipEvent_t, ctypes.c_uint32) +def hipStreamWaitEvent(stream:hipStream_t, event:hipEvent_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[ctypes.c_uint32]) +def hipStreamGetFlags(stream:hipStream_t, flags:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[ctypes.c_uint64]) +def hipStreamGetId(stream:hipStream_t, streamId:c.POINTER[ctypes.c_uint64]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[ctypes.c_int32]) +def hipStreamGetPriority(stream:hipStream_t, priority:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[hipDevice_t]) +def hipStreamGetDevice(stream:hipStream_t, device:c.POINTER[hipDevice_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipStream_t], uint32_t, c.POINTER[uint32_t]) +def hipExtStreamCreateWithCUMask(stream:c.POINTER[hipStream_t], cuMaskSize:uint32_t, cuMask:c.POINTER[uint32_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, uint32_t, c.POINTER[uint32_t]) +def hipExtStreamGetCUMask(stream:hipStream_t, cuMaskSize:uint32_t, cuMask:c.POINTER[uint32_t]) -> ctypes.c_uint32: ... +hipStreamCallback_t: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[ihipStream_t], ctypes.c_uint32, ctypes.c_void_p]] +@dll.bind(ctypes.c_uint32, hipStream_t, hipStreamCallback_t, ctypes.c_void_p, ctypes.c_uint32) +def hipStreamAddCallback(stream:hipStream_t, callback:hipStreamCallback_t, userData:ctypes.c_void_p, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_uint32, c.POINTER[hipLaunchAttributeValue]) +def hipStreamSetAttribute(stream:hipStream_t, attr:ctypes.c_uint32, value:c.POINTER[hipLaunchAttributeValue]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_uint32, c.POINTER[hipLaunchAttributeValue]) +def hipStreamGetAttribute(stream:hipStream_t, attr:ctypes.c_uint32, value_out:c.POINTER[hipLaunchAttributeValue]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_void_p, uint32_t, ctypes.c_uint32, uint32_t) +def hipStreamWaitValue32(stream:hipStream_t, ptr:ctypes.c_void_p, value:uint32_t, flags:int, mask:uint32_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_void_p, uint64_t, ctypes.c_uint32, uint64_t) +def hipStreamWaitValue64(stream:hipStream_t, ptr:ctypes.c_void_p, value:uint64_t, flags:int, mask:uint64_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_void_p, uint32_t, ctypes.c_uint32) +def hipStreamWriteValue32(stream:hipStream_t, ptr:ctypes.c_void_p, value:uint32_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_void_p, uint64_t, ctypes.c_uint32) +def hipStreamWriteValue64(stream:hipStream_t, ptr:ctypes.c_void_p, value:uint64_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_uint32, c.POINTER[hipStreamBatchMemOpParams], ctypes.c_uint32) +def hipStreamBatchMemOp(stream:hipStream_t, count:int, paramArray:c.POINTER[hipStreamBatchMemOpParams], flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipBatchMemOpNodeParams]) +def hipGraphAddBatchMemOpNode(phGraphNode:c.POINTER[hipGraphNode_t], hGraph:hipGraph_t, dependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, nodeParams:c.POINTER[hipBatchMemOpNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipBatchMemOpNodeParams]) +def hipGraphBatchMemOpNodeGetParams(hNode:hipGraphNode_t, nodeParams_out:c.POINTER[hipBatchMemOpNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipBatchMemOpNodeParams]) +def hipGraphBatchMemOpNodeSetParams(hNode:hipGraphNode_t, nodeParams:c.POINTER[hipBatchMemOpNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipBatchMemOpNodeParams]) +def hipGraphExecBatchMemOpNodeSetParams(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, nodeParams:c.POINTER[hipBatchMemOpNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipEvent_t], ctypes.c_uint32) +def hipEventCreateWithFlags(event:c.POINTER[hipEvent_t], flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipEvent_t]) +def hipEventCreate(event:c.POINTER[hipEvent_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipEvent_t, hipStream_t, ctypes.c_uint32) +def hipEventRecordWithFlags(event:hipEvent_t, stream:hipStream_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipEvent_t, hipStream_t) +def hipEventRecord(event:hipEvent_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipEvent_t) +def hipEventDestroy(event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipEvent_t) +def hipEventSynchronize(event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_float], hipEvent_t, hipEvent_t) +def hipEventElapsedTime(ms:c.POINTER[ctypes.c_float], start:hipEvent_t, stop:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipEvent_t) +def hipEventQuery(event:hipEvent_t) -> ctypes.c_uint32: ... +hipPointer_attribute: dict[int, str] = {(HIP_POINTER_ATTRIBUTE_CONTEXT:=1): 'HIP_POINTER_ATTRIBUTE_CONTEXT', (HIP_POINTER_ATTRIBUTE_MEMORY_TYPE:=2): 'HIP_POINTER_ATTRIBUTE_MEMORY_TYPE', (HIP_POINTER_ATTRIBUTE_DEVICE_POINTER:=3): 'HIP_POINTER_ATTRIBUTE_DEVICE_POINTER', (HIP_POINTER_ATTRIBUTE_HOST_POINTER:=4): 'HIP_POINTER_ATTRIBUTE_HOST_POINTER', (HIP_POINTER_ATTRIBUTE_P2P_TOKENS:=5): 'HIP_POINTER_ATTRIBUTE_P2P_TOKENS', (HIP_POINTER_ATTRIBUTE_SYNC_MEMOPS:=6): 'HIP_POINTER_ATTRIBUTE_SYNC_MEMOPS', (HIP_POINTER_ATTRIBUTE_BUFFER_ID:=7): 'HIP_POINTER_ATTRIBUTE_BUFFER_ID', (HIP_POINTER_ATTRIBUTE_IS_MANAGED:=8): 'HIP_POINTER_ATTRIBUTE_IS_MANAGED', (HIP_POINTER_ATTRIBUTE_DEVICE_ORDINAL:=9): 'HIP_POINTER_ATTRIBUTE_DEVICE_ORDINAL', (HIP_POINTER_ATTRIBUTE_IS_LEGACY_HIP_IPC_CAPABLE:=10): 'HIP_POINTER_ATTRIBUTE_IS_LEGACY_HIP_IPC_CAPABLE', (HIP_POINTER_ATTRIBUTE_RANGE_START_ADDR:=11): 'HIP_POINTER_ATTRIBUTE_RANGE_START_ADDR', (HIP_POINTER_ATTRIBUTE_RANGE_SIZE:=12): 'HIP_POINTER_ATTRIBUTE_RANGE_SIZE', (HIP_POINTER_ATTRIBUTE_MAPPED:=13): 'HIP_POINTER_ATTRIBUTE_MAPPED', (HIP_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES:=14): 'HIP_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES', (HIP_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE:=15): 'HIP_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE', (HIP_POINTER_ATTRIBUTE_ACCESS_FLAGS:=16): 'HIP_POINTER_ATTRIBUTE_ACCESS_FLAGS', (HIP_POINTER_ATTRIBUTE_MEMPOOL_HANDLE:=17): 'HIP_POINTER_ATTRIBUTE_MEMPOOL_HANDLE'} +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_uint32, hipDeviceptr_t) +def hipPointerSetAttribute(value:ctypes.c_void_p, attribute:ctypes.c_uint32, ptr:hipDeviceptr_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipPointerAttribute_t], ctypes.c_void_p) +def hipPointerGetAttributes(attributes:c.POINTER[hipPointerAttribute_t], ptr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_uint32, hipDeviceptr_t) +def hipPointerGetAttribute(data:ctypes.c_void_p, attribute:ctypes.c_uint32, ptr:hipDeviceptr_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_void_p], hipDeviceptr_t) +def hipDrvPointerGetAttributes(numAttributes:int, attributes:c.POINTER[ctypes.c_uint32], data:c.POINTER[ctypes.c_void_p], ptr:hipDeviceptr_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipExternalSemaphore_t], c.POINTER[hipExternalSemaphoreHandleDesc]) +def hipImportExternalSemaphore(extSem_out:c.POINTER[hipExternalSemaphore_t], semHandleDesc:c.POINTER[hipExternalSemaphoreHandleDesc]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipExternalSemaphore_t], c.POINTER[hipExternalSemaphoreSignalParams], ctypes.c_uint32, hipStream_t) +def hipSignalExternalSemaphoresAsync(extSemArray:c.POINTER[hipExternalSemaphore_t], paramsArray:c.POINTER[hipExternalSemaphoreSignalParams], numExtSems:int, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipExternalSemaphore_t], c.POINTER[hipExternalSemaphoreWaitParams], ctypes.c_uint32, hipStream_t) +def hipWaitExternalSemaphoresAsync(extSemArray:c.POINTER[hipExternalSemaphore_t], paramsArray:c.POINTER[hipExternalSemaphoreWaitParams], numExtSems:int, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipExternalSemaphore_t) +def hipDestroyExternalSemaphore(extSem:hipExternalSemaphore_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipExternalMemory_t], c.POINTER[hipExternalMemoryHandleDesc]) +def hipImportExternalMemory(extMem_out:c.POINTER[hipExternalMemory_t], memHandleDesc:c.POINTER[hipExternalMemoryHandleDesc]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], hipExternalMemory_t, c.POINTER[hipExternalMemoryBufferDesc]) +def hipExternalMemoryGetMappedBuffer(devPtr:c.POINTER[ctypes.c_void_p], extMem:hipExternalMemory_t, bufferDesc:c.POINTER[hipExternalMemoryBufferDesc]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipExternalMemory_t) +def hipDestroyExternalMemory(extMem:hipExternalMemory_t) -> ctypes.c_uint32: ... +hipMipmappedArray_t: TypeAlias = c.POINTER[hipMipmappedArray] +@dll.bind(ctypes.c_uint32, c.POINTER[hipMipmappedArray_t], hipExternalMemory_t, c.POINTER[hipExternalMemoryMipmappedArrayDesc]) +def hipExternalMemoryGetMappedMipmappedArray(mipmap:c.POINTER[hipMipmappedArray_t], extMem:hipExternalMemory_t, mipmapDesc:c.POINTER[hipExternalMemoryMipmappedArrayDesc]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t) +def hipMalloc(ptr:c.POINTER[ctypes.c_void_p], size:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t, ctypes.c_uint32) +def hipExtMallocWithFlags(ptr:c.POINTER[ctypes.c_void_p], sizeBytes:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t) +def hipMallocHost(ptr:c.POINTER[ctypes.c_void_p], size:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t) +def hipMemAllocHost(ptr:c.POINTER[ctypes.c_void_p], size:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t, ctypes.c_uint32) +def hipHostMalloc(ptr:c.POINTER[ctypes.c_void_p], size:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t, ctypes.c_uint32) +def hipMallocManaged(dev_ptr:c.POINTER[ctypes.c_void_p], size:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_int32, hipStream_t) +def hipMemPrefetchAsync(dev_ptr:ctypes.c_void_p, count:size_t, device:int, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, hipMemLocation, ctypes.c_uint32, hipStream_t) +def hipMemPrefetchAsync_v2(dev_ptr:ctypes.c_void_p, count:size_t, location:hipMemLocation, flags:int, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_uint32, ctypes.c_int32) +def hipMemAdvise(dev_ptr:ctypes.c_void_p, count:size_t, advice:ctypes.c_uint32, device:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_uint32, hipMemLocation) +def hipMemAdvise_v2(dev_ptr:ctypes.c_void_p, count:size_t, advice:ctypes.c_uint32, location:hipMemLocation) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_uint32, ctypes.c_void_p, size_t) +def hipMemRangeGetAttribute(data:ctypes.c_void_p, data_size:size_t, attribute:ctypes.c_uint32, dev_ptr:ctypes.c_void_p, count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], c.POINTER[size_t], c.POINTER[ctypes.c_uint32], size_t, ctypes.c_void_p, size_t) +def hipMemRangeGetAttributes(data:c.POINTER[ctypes.c_void_p], data_sizes:c.POINTER[size_t], attributes:c.POINTER[ctypes.c_uint32], num_attributes:size_t, dev_ptr:ctypes.c_void_p, count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_void_p, size_t, ctypes.c_uint32) +def hipStreamAttachMemAsync(stream:hipStream_t, dev_ptr:ctypes.c_void_p, length:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t, hipStream_t) +def hipMallocAsync(dev_ptr:c.POINTER[ctypes.c_void_p], size:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipStream_t) +def hipFreeAsync(dev_ptr:ctypes.c_void_p, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipMemPool_t, size_t) +def hipMemPoolTrimTo(mem_pool:hipMemPool_t, min_bytes_to_hold:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipMemPool_t, ctypes.c_uint32, ctypes.c_void_p) +def hipMemPoolSetAttribute(mem_pool:hipMemPool_t, attr:ctypes.c_uint32, value:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipMemPool_t, ctypes.c_uint32, ctypes.c_void_p) +def hipMemPoolGetAttribute(mem_pool:hipMemPool_t, attr:ctypes.c_uint32, value:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipMemPool_t, c.POINTER[hipMemAccessDesc], size_t) +def hipMemPoolSetAccess(mem_pool:hipMemPool_t, desc_list:c.POINTER[hipMemAccessDesc], count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], hipMemPool_t, c.POINTER[hipMemLocation]) +def hipMemPoolGetAccess(flags:c.POINTER[ctypes.c_uint32], mem_pool:hipMemPool_t, location:c.POINTER[hipMemLocation]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemPool_t], c.POINTER[hipMemPoolProps]) +def hipMemPoolCreate(mem_pool:c.POINTER[hipMemPool_t], pool_props:c.POINTER[hipMemPoolProps]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipMemPool_t) +def hipMemPoolDestroy(mem_pool:hipMemPool_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t, hipMemPool_t, hipStream_t) +def hipMallocFromPoolAsync(dev_ptr:c.POINTER[ctypes.c_void_p], size:size_t, mem_pool:hipMemPool_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipMemPool_t, ctypes.c_uint32, ctypes.c_uint32) +def hipMemPoolExportToShareableHandle(shared_handle:ctypes.c_void_p, mem_pool:hipMemPool_t, handle_type:ctypes.c_uint32, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemPool_t], ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32) +def hipMemPoolImportFromShareableHandle(mem_pool:c.POINTER[hipMemPool_t], shared_handle:ctypes.c_void_p, handle_type:ctypes.c_uint32, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemPoolPtrExportData], ctypes.c_void_p) +def hipMemPoolExportPointer(export_data:c.POINTER[hipMemPoolPtrExportData], dev_ptr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], hipMemPool_t, c.POINTER[hipMemPoolPtrExportData]) +def hipMemPoolImportPointer(dev_ptr:c.POINTER[ctypes.c_void_p], mem_pool:hipMemPool_t, export_data:c.POINTER[hipMemPoolPtrExportData]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t, ctypes.c_uint32) +def hipHostAlloc(ptr:c.POINTER[ctypes.c_void_p], size:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], ctypes.c_void_p, ctypes.c_uint32) +def hipHostGetDevicePointer(devPtr:c.POINTER[ctypes.c_void_p], hstPtr:ctypes.c_void_p, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], ctypes.c_void_p) +def hipHostGetFlags(flagsPtr:c.POINTER[ctypes.c_uint32], hostPtr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_uint32) +def hipHostRegister(hostPtr:ctypes.c_void_p, sizeBytes:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p) +def hipHostUnregister(hostPtr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], c.POINTER[size_t], size_t, size_t) +def hipMallocPitch(ptr:c.POINTER[ctypes.c_void_p], pitch:c.POINTER[size_t], width:size_t, height:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipDeviceptr_t], c.POINTER[size_t], size_t, size_t, ctypes.c_uint32) +def hipMemAllocPitch(dptr:c.POINTER[hipDeviceptr_t], pitch:c.POINTER[size_t], widthInBytes:size_t, height:size_t, elementSizeBytes:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p) +def hipFree(ptr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p) +def hipFreeHost(ptr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p) +def hipHostFree(ptr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32) +def hipMemcpy(dst:ctypes.c_void_p, src:ctypes.c_void_p, sizeBytes:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32, hipStream_t) +def hipMemcpyWithStream(dst:ctypes.c_void_p, src:ctypes.c_void_p, sizeBytes:size_t, kind:ctypes.c_uint32, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, ctypes.c_void_p, size_t) +def hipMemcpyHtoD(dst:hipDeviceptr_t, src:ctypes.c_void_p, sizeBytes:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipDeviceptr_t, size_t) +def hipMemcpyDtoH(dst:ctypes.c_void_p, src:hipDeviceptr_t, sizeBytes:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, hipDeviceptr_t, size_t) +def hipMemcpyDtoD(dst:hipDeviceptr_t, src:hipDeviceptr_t, sizeBytes:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, hipArray_t, size_t, size_t) +def hipMemcpyAtoD(dstDevice:hipDeviceptr_t, srcArray:hipArray_t, srcOffset:size_t, ByteCount:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t, size_t, hipDeviceptr_t, size_t) +def hipMemcpyDtoA(dstArray:hipArray_t, dstOffset:size_t, srcDevice:hipDeviceptr_t, ByteCount:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t, size_t, hipArray_t, size_t, size_t) +def hipMemcpyAtoA(dstArray:hipArray_t, dstOffset:size_t, srcArray:hipArray_t, srcOffset:size_t, ByteCount:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, ctypes.c_void_p, size_t, hipStream_t) +def hipMemcpyHtoDAsync(dst:hipDeviceptr_t, src:ctypes.c_void_p, sizeBytes:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipDeviceptr_t, size_t, hipStream_t) +def hipMemcpyDtoHAsync(dst:ctypes.c_void_p, src:hipDeviceptr_t, sizeBytes:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, hipDeviceptr_t, size_t, hipStream_t) +def hipMemcpyDtoDAsync(dst:hipDeviceptr_t, src:hipDeviceptr_t, sizeBytes:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipArray_t, size_t, size_t, hipStream_t) +def hipMemcpyAtoHAsync(dstHost:ctypes.c_void_p, srcArray:hipArray_t, srcOffset:size_t, ByteCount:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t, size_t, ctypes.c_void_p, size_t, hipStream_t) +def hipMemcpyHtoAAsync(dstArray:hipArray_t, dstOffset:size_t, srcHost:ctypes.c_void_p, ByteCount:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipDeviceptr_t], c.POINTER[size_t], hipModule_t, c.POINTER[ctypes.c_char]) +def hipModuleGetGlobal(dptr:c.POINTER[hipDeviceptr_t], bytes:c.POINTER[size_t], hmod:hipModule_t, name:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], ctypes.c_void_p) +def hipGetSymbolAddress(devPtr:c.POINTER[ctypes.c_void_p], symbol:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], ctypes.c_void_p) +def hipGetSymbolSize(size:c.POINTER[size_t], symbol:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_void_p], ctypes.c_int32, uint64_t, c.POINTER[ctypes.c_uint32]) +def hipGetProcAddress(symbol:c.POINTER[ctypes.c_char], pfn:c.POINTER[ctypes.c_void_p], hipVersion:int, flags:uint64_t, symbolStatus:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32) +def hipMemcpyToSymbol(symbol:ctypes.c_void_p, src:ctypes.c_void_p, sizeBytes:size_t, offset:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32, hipStream_t) +def hipMemcpyToSymbolAsync(symbol:ctypes.c_void_p, src:ctypes.c_void_p, sizeBytes:size_t, offset:size_t, kind:ctypes.c_uint32, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32) +def hipMemcpyFromSymbol(dst:ctypes.c_void_p, symbol:ctypes.c_void_p, sizeBytes:size_t, offset:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32, hipStream_t) +def hipMemcpyFromSymbolAsync(dst:ctypes.c_void_p, symbol:ctypes.c_void_p, sizeBytes:size_t, offset:size_t, kind:ctypes.c_uint32, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32, hipStream_t) +def hipMemcpyAsync(dst:ctypes.c_void_p, src:ctypes.c_void_p, sizeBytes:size_t, kind:ctypes.c_uint32, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_int32, size_t) +def hipMemset(dst:ctypes.c_void_p, value:int, sizeBytes:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, ctypes.c_ubyte, size_t) +def hipMemsetD8(dest:hipDeviceptr_t, value:int, count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, ctypes.c_ubyte, size_t, hipStream_t) +def hipMemsetD8Async(dest:hipDeviceptr_t, value:int, count:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, ctypes.c_uint16, size_t) +def hipMemsetD16(dest:hipDeviceptr_t, value:int, count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, ctypes.c_uint16, size_t, hipStream_t) +def hipMemsetD16Async(dest:hipDeviceptr_t, value:int, count:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, ctypes.c_int32, size_t) +def hipMemsetD32(dest:hipDeviceptr_t, value:int, count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_int32, size_t, hipStream_t) +def hipMemsetAsync(dst:ctypes.c_void_p, value:int, sizeBytes:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, ctypes.c_int32, size_t, hipStream_t) +def hipMemsetD32Async(dst:hipDeviceptr_t, value:int, count:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_int32, size_t, size_t) +def hipMemset2D(dst:ctypes.c_void_p, pitch:size_t, value:int, width:size_t, height:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_int32, size_t, size_t, hipStream_t) +def hipMemset2DAsync(dst:ctypes.c_void_p, pitch:size_t, value:int, width:size_t, height:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipPitchedPtr, ctypes.c_int32, hipExtent) +def hipMemset3D(pitchedDevPtr:hipPitchedPtr, value:int, extent:hipExtent) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipPitchedPtr, ctypes.c_int32, hipExtent, hipStream_t) +def hipMemset3DAsync(pitchedDevPtr:hipPitchedPtr, value:int, extent:hipExtent, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, size_t, ctypes.c_ubyte, size_t, size_t) +def hipMemsetD2D8(dst:hipDeviceptr_t, dstPitch:size_t, value:int, width:size_t, height:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, size_t, ctypes.c_ubyte, size_t, size_t, hipStream_t) +def hipMemsetD2D8Async(dst:hipDeviceptr_t, dstPitch:size_t, value:int, width:size_t, height:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, size_t, ctypes.c_uint16, size_t, size_t) +def hipMemsetD2D16(dst:hipDeviceptr_t, dstPitch:size_t, value:int, width:size_t, height:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, size_t, ctypes.c_uint16, size_t, size_t, hipStream_t) +def hipMemsetD2D16Async(dst:hipDeviceptr_t, dstPitch:size_t, value:int, width:size_t, height:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, size_t, ctypes.c_uint32, size_t, size_t) +def hipMemsetD2D32(dst:hipDeviceptr_t, dstPitch:size_t, value:int, width:size_t, height:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDeviceptr_t, size_t, ctypes.c_uint32, size_t, size_t, hipStream_t) +def hipMemsetD2D32Async(dst:hipDeviceptr_t, dstPitch:size_t, value:int, width:size_t, height:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], c.POINTER[size_t]) +def hipMemGetInfo(free:c.POINTER[size_t], total:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, c.POINTER[size_t]) +def hipMemPtrGetInfo(ptr:ctypes.c_void_p, size:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipArray_t], c.POINTER[hipChannelFormatDesc], size_t, size_t, ctypes.c_uint32) +def hipMallocArray(array:c.POINTER[hipArray_t], desc:c.POINTER[hipChannelFormatDesc], width:size_t, height:size_t, flags:int) -> ctypes.c_uint32: ... +@c.record +class HIP_ARRAY_DESCRIPTOR(c.Struct): + SIZE = 24 + Width: int + Height: int + Format: int + NumChannels: int +HIP_ARRAY_DESCRIPTOR.register_fields([('Width', size_t, 0), ('Height', size_t, 8), ('Format', ctypes.c_uint32, 16), ('NumChannels', ctypes.c_uint32, 20)]) +@dll.bind(ctypes.c_uint32, c.POINTER[hipArray_t], c.POINTER[HIP_ARRAY_DESCRIPTOR]) +def hipArrayCreate(pHandle:c.POINTER[hipArray_t], pAllocateArray:c.POINTER[HIP_ARRAY_DESCRIPTOR]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t) +def hipArrayDestroy(array:hipArray_t) -> ctypes.c_uint32: ... +@c.record +class HIP_ARRAY3D_DESCRIPTOR(c.Struct): + SIZE = 40 + Width: int + Height: int + Depth: int + Format: int + NumChannels: int + Flags: int +HIP_ARRAY3D_DESCRIPTOR.register_fields([('Width', size_t, 0), ('Height', size_t, 8), ('Depth', size_t, 16), ('Format', ctypes.c_uint32, 24), ('NumChannels', ctypes.c_uint32, 28), ('Flags', ctypes.c_uint32, 32)]) +@dll.bind(ctypes.c_uint32, c.POINTER[hipArray_t], c.POINTER[HIP_ARRAY3D_DESCRIPTOR]) +def hipArray3DCreate(array:c.POINTER[hipArray_t], pAllocateArray:c.POINTER[HIP_ARRAY3D_DESCRIPTOR]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipPitchedPtr], hipExtent) +def hipMalloc3D(pitchedDevPtr:c.POINTER[hipPitchedPtr], extent:hipExtent) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t) +def hipFreeArray(array:hipArray_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipArray_t], c.POINTER[hipChannelFormatDesc], hipExtent, ctypes.c_uint32) +def hipMalloc3DArray(array:c.POINTER[hipArray_t], desc:c.POINTER[hipChannelFormatDesc], extent:hipExtent, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipChannelFormatDesc], c.POINTER[hipExtent], c.POINTER[ctypes.c_uint32], hipArray_t) +def hipArrayGetInfo(desc:c.POINTER[hipChannelFormatDesc], extent:c.POINTER[hipExtent], flags:c.POINTER[ctypes.c_uint32], array:hipArray_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[HIP_ARRAY_DESCRIPTOR], hipArray_t) +def hipArrayGetDescriptor(pArrayDescriptor:c.POINTER[HIP_ARRAY_DESCRIPTOR], array:hipArray_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[HIP_ARRAY3D_DESCRIPTOR], hipArray_t) +def hipArray3DGetDescriptor(pArrayDescriptor:c.POINTER[HIP_ARRAY3D_DESCRIPTOR], array:hipArray_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_void_p, size_t, size_t, size_t, ctypes.c_uint32) +def hipMemcpy2D(dst:ctypes.c_void_p, dpitch:size_t, src:ctypes.c_void_p, spitch:size_t, width:size_t, height:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@c.record +class hip_Memcpy2D(c.Struct): + SIZE = 128 + srcXInBytes: int + srcY: int + srcMemoryType: int + srcHost: ctypes.c_void_p + srcDevice: ctypes.c_void_p + srcArray: c.POINTER[hipArray] + srcPitch: int + dstXInBytes: int + dstY: int + dstMemoryType: int + dstHost: ctypes.c_void_p + dstDevice: ctypes.c_void_p + dstArray: c.POINTER[hipArray] + dstPitch: int + WidthInBytes: int + Height: int +hip_Memcpy2D.register_fields([('srcXInBytes', size_t, 0), ('srcY', size_t, 8), ('srcMemoryType', ctypes.c_uint32, 16), ('srcHost', ctypes.c_void_p, 24), ('srcDevice', hipDeviceptr_t, 32), ('srcArray', hipArray_t, 40), ('srcPitch', size_t, 48), ('dstXInBytes', size_t, 56), ('dstY', size_t, 64), ('dstMemoryType', ctypes.c_uint32, 72), ('dstHost', ctypes.c_void_p, 80), ('dstDevice', hipDeviceptr_t, 88), ('dstArray', hipArray_t, 96), ('dstPitch', size_t, 104), ('WidthInBytes', size_t, 112), ('Height', size_t, 120)]) +@dll.bind(ctypes.c_uint32, c.POINTER[hip_Memcpy2D]) +def hipMemcpyParam2D(pCopy:c.POINTER[hip_Memcpy2D]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hip_Memcpy2D], hipStream_t) +def hipMemcpyParam2DAsync(pCopy:c.POINTER[hip_Memcpy2D], stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, ctypes.c_void_p, size_t, size_t, size_t, ctypes.c_uint32, hipStream_t) +def hipMemcpy2DAsync(dst:ctypes.c_void_p, dpitch:size_t, src:ctypes.c_void_p, spitch:size_t, width:size_t, height:size_t, kind:ctypes.c_uint32, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t, size_t, size_t, ctypes.c_void_p, size_t, size_t, size_t, ctypes.c_uint32) +def hipMemcpy2DToArray(dst:hipArray_t, wOffset:size_t, hOffset:size_t, src:ctypes.c_void_p, spitch:size_t, width:size_t, height:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t, size_t, size_t, ctypes.c_void_p, size_t, size_t, size_t, ctypes.c_uint32, hipStream_t) +def hipMemcpy2DToArrayAsync(dst:hipArray_t, wOffset:size_t, hOffset:size_t, src:ctypes.c_void_p, spitch:size_t, width:size_t, height:size_t, kind:ctypes.c_uint32, stream:hipStream_t) -> ctypes.c_uint32: ... +hipArray_const_t: TypeAlias = c.POINTER[hipArray] +@dll.bind(ctypes.c_uint32, hipArray_t, size_t, size_t, hipArray_const_t, size_t, size_t, size_t, size_t, ctypes.c_uint32) +def hipMemcpy2DArrayToArray(dst:hipArray_t, wOffsetDst:size_t, hOffsetDst:size_t, src:hipArray_const_t, wOffsetSrc:size_t, hOffsetSrc:size_t, width:size_t, height:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t, size_t, size_t, ctypes.c_void_p, size_t, ctypes.c_uint32) +def hipMemcpyToArray(dst:hipArray_t, wOffset:size_t, hOffset:size_t, src:ctypes.c_void_p, count:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipArray_const_t, size_t, size_t, size_t, ctypes.c_uint32) +def hipMemcpyFromArray(dst:ctypes.c_void_p, srcArray:hipArray_const_t, wOffset:size_t, hOffset:size_t, count:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, hipArray_const_t, size_t, size_t, size_t, size_t, ctypes.c_uint32) +def hipMemcpy2DFromArray(dst:ctypes.c_void_p, dpitch:size_t, src:hipArray_const_t, wOffset:size_t, hOffset:size_t, width:size_t, height:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, hipArray_const_t, size_t, size_t, size_t, size_t, ctypes.c_uint32, hipStream_t) +def hipMemcpy2DFromArrayAsync(dst:ctypes.c_void_p, dpitch:size_t, src:hipArray_const_t, wOffset:size_t, hOffset:size_t, width:size_t, height:size_t, kind:ctypes.c_uint32, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipArray_t, size_t, size_t) +def hipMemcpyAtoH(dst:ctypes.c_void_p, srcArray:hipArray_t, srcOffset:size_t, count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipArray_t, size_t, ctypes.c_void_p, size_t) +def hipMemcpyHtoA(dstArray:hipArray_t, dstOffset:size_t, srcHost:ctypes.c_void_p, count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemcpy3DParms]) +def hipMemcpy3D(p:c.POINTER[hipMemcpy3DParms]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemcpy3DParms], hipStream_t) +def hipMemcpy3DAsync(p:c.POINTER[hipMemcpy3DParms], stream:hipStream_t) -> ctypes.c_uint32: ... +@c.record +class HIP_MEMCPY3D(c.Struct): + SIZE = 184 + srcXInBytes: int + srcY: int + srcZ: int + srcLOD: int + srcMemoryType: int + srcHost: ctypes.c_void_p + srcDevice: ctypes.c_void_p + srcArray: c.POINTER[hipArray] + srcPitch: int + srcHeight: int + dstXInBytes: int + dstY: int + dstZ: int + dstLOD: int + dstMemoryType: int + dstHost: ctypes.c_void_p + dstDevice: ctypes.c_void_p + dstArray: c.POINTER[hipArray] + dstPitch: int + dstHeight: int + WidthInBytes: int + Height: int + Depth: int +HIP_MEMCPY3D.register_fields([('srcXInBytes', size_t, 0), ('srcY', size_t, 8), ('srcZ', size_t, 16), ('srcLOD', size_t, 24), ('srcMemoryType', ctypes.c_uint32, 32), ('srcHost', ctypes.c_void_p, 40), ('srcDevice', hipDeviceptr_t, 48), ('srcArray', hipArray_t, 56), ('srcPitch', size_t, 64), ('srcHeight', size_t, 72), ('dstXInBytes', size_t, 80), ('dstY', size_t, 88), ('dstZ', size_t, 96), ('dstLOD', size_t, 104), ('dstMemoryType', ctypes.c_uint32, 112), ('dstHost', ctypes.c_void_p, 120), ('dstDevice', hipDeviceptr_t, 128), ('dstArray', hipArray_t, 136), ('dstPitch', size_t, 144), ('dstHeight', size_t, 152), ('WidthInBytes', size_t, 160), ('Height', size_t, 168), ('Depth', size_t, 176)]) +@dll.bind(ctypes.c_uint32, c.POINTER[HIP_MEMCPY3D]) +def hipDrvMemcpy3D(pCopy:c.POINTER[HIP_MEMCPY3D]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[HIP_MEMCPY3D], hipStream_t) +def hipDrvMemcpy3DAsync(pCopy:c.POINTER[HIP_MEMCPY3D], stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipDeviceptr_t], c.POINTER[size_t], hipDeviceptr_t) +def hipMemGetAddressRange(pbase:c.POINTER[hipDeviceptr_t], psize:c.POINTER[size_t], dptr:hipDeviceptr_t) -> ctypes.c_uint32: ... +@c.record +class hipMemcpyAttributes(c.Struct): + SIZE = 24 + srcAccessOrder: int + srcLocHint: hipMemLocation + dstLocHint: hipMemLocation + flags: int +hipMemcpySrcAccessOrder: dict[int, str] = {(hipMemcpySrcAccessOrderInvalid:=0): 'hipMemcpySrcAccessOrderInvalid', (hipMemcpySrcAccessOrderStream:=1): 'hipMemcpySrcAccessOrderStream', (hipMemcpySrcAccessOrderDuringApiCall:=2): 'hipMemcpySrcAccessOrderDuringApiCall', (hipMemcpySrcAccessOrderAny:=3): 'hipMemcpySrcAccessOrderAny', (hipMemcpySrcAccessOrderMax:=2147483647): 'hipMemcpySrcAccessOrderMax'} +hipMemcpyAttributes.register_fields([('srcAccessOrder', ctypes.c_uint32, 0), ('srcLocHint', hipMemLocation, 4), ('dstLocHint', hipMemLocation, 12), ('flags', ctypes.c_uint32, 20)]) +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p], c.POINTER[size_t], size_t, c.POINTER[hipMemcpyAttributes], c.POINTER[size_t], size_t, c.POINTER[size_t], hipStream_t) +def hipMemcpyBatchAsync(dsts:c.POINTER[ctypes.c_void_p], srcs:c.POINTER[ctypes.c_void_p], sizes:c.POINTER[size_t], count:size_t, attrs:c.POINTER[hipMemcpyAttributes], attrsIdxs:c.POINTER[size_t], numAttrs:size_t, failIdx:c.POINTER[size_t], stream:hipStream_t) -> ctypes.c_uint32: ... +@c.record +class hipMemcpy3DBatchOp(c.Struct): + SIZE = 112 + src: hipMemcpy3DOperand + dst: hipMemcpy3DOperand + extent: hipExtent + srcAccessOrder: int + flags: int +@c.record +class hipMemcpy3DOperand(c.Struct): + SIZE = 40 + type: int + op: hipMemcpy3DOperand_op +hipMemcpy3DOperandType: dict[int, str] = {(hipMemcpyOperandTypePointer:=1): 'hipMemcpyOperandTypePointer', (hipMemcpyOperandTypeArray:=2): 'hipMemcpyOperandTypeArray', (hipMemcpyOperandTypeMax:=2147483647): 'hipMemcpyOperandTypeMax'} +@c.record +class hipMemcpy3DOperand_op(c.Struct): + SIZE = 32 + ptr: hipMemcpy3DOperand_op_ptr + array: hipMemcpy3DOperand_op_array +@c.record +class hipMemcpy3DOperand_op_ptr(c.Struct): + SIZE = 32 + ptr: ctypes.c_void_p + rowLength: int + layerHeight: int + locHint: hipMemLocation +hipMemcpy3DOperand_op_ptr.register_fields([('ptr', ctypes.c_void_p, 0), ('rowLength', size_t, 8), ('layerHeight', size_t, 16), ('locHint', hipMemLocation, 24)]) +@c.record +class hipMemcpy3DOperand_op_array(c.Struct): + SIZE = 32 + array: c.POINTER[hipArray] + offset: hipOffset3D +@c.record +class hipOffset3D(c.Struct): + SIZE = 24 + x: int + y: int + z: int +hipOffset3D.register_fields([('x', size_t, 0), ('y', size_t, 8), ('z', size_t, 16)]) +hipMemcpy3DOperand_op_array.register_fields([('array', hipArray_t, 0), ('offset', hipOffset3D, 8)]) +hipMemcpy3DOperand_op.register_fields([('ptr', hipMemcpy3DOperand_op_ptr, 0), ('array', hipMemcpy3DOperand_op_array, 0)]) +hipMemcpy3DOperand.register_fields([('type', ctypes.c_uint32, 0), ('op', hipMemcpy3DOperand_op, 8)]) +hipMemcpy3DBatchOp.register_fields([('src', hipMemcpy3DOperand, 0), ('dst', hipMemcpy3DOperand, 40), ('extent', hipExtent, 80), ('srcAccessOrder', ctypes.c_uint32, 104), ('flags', ctypes.c_uint32, 108)]) +@dll.bind(ctypes.c_uint32, size_t, c.POINTER[hipMemcpy3DBatchOp], c.POINTER[size_t], ctypes.c_uint64, hipStream_t) +def hipMemcpy3DBatchAsync(numOps:size_t, opList:c.POINTER[hipMemcpy3DBatchOp], failIdx:c.POINTER[size_t], flags:int, stream:hipStream_t) -> ctypes.c_uint32: ... +@c.record +class hipMemcpy3DPeerParms(c.Struct): + SIZE = 168 + srcArray: c.POINTER[hipArray] + srcPos: hipPos + srcPtr: hipPitchedPtr + srcDevice: int + dstArray: c.POINTER[hipArray] + dstPos: hipPos + dstPtr: hipPitchedPtr + dstDevice: int + extent: hipExtent +hipMemcpy3DPeerParms.register_fields([('srcArray', hipArray_t, 0), ('srcPos', hipPos, 8), ('srcPtr', hipPitchedPtr, 32), ('srcDevice', ctypes.c_int32, 64), ('dstArray', hipArray_t, 72), ('dstPos', hipPos, 80), ('dstPtr', hipPitchedPtr, 104), ('dstDevice', ctypes.c_int32, 136), ('extent', hipExtent, 144)]) +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemcpy3DPeerParms]) +def hipMemcpy3DPeer(p:c.POINTER[hipMemcpy3DPeerParms]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemcpy3DPeerParms], hipStream_t) +def hipMemcpy3DPeerAsync(p:c.POINTER[hipMemcpy3DPeerParms], stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], ctypes.c_int32, ctypes.c_int32) +def hipDeviceCanAccessPeer(canAccessPeer:c.POINTER[ctypes.c_int32], deviceId:int, peerDeviceId:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32, ctypes.c_uint32) +def hipDeviceEnablePeerAccess(peerDeviceId:int, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32) +def hipDeviceDisablePeerAccess(peerDeviceId:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_int32, ctypes.c_void_p, ctypes.c_int32, size_t) +def hipMemcpyPeer(dst:ctypes.c_void_p, dstDeviceId:int, src:ctypes.c_void_p, srcDeviceId:int, sizeBytes:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, ctypes.c_int32, ctypes.c_void_p, ctypes.c_int32, size_t, hipStream_t) +def hipMemcpyPeerAsync(dst:ctypes.c_void_p, dstDeviceId:int, src:ctypes.c_void_p, srcDevice:int, sizeBytes:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipCtx_t], ctypes.c_uint32, hipDevice_t) +def hipCtxCreate(ctx:c.POINTER[hipCtx_t], flags:int, device:hipDevice_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipCtx_t) +def hipCtxDestroy(ctx:hipCtx_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipCtx_t]) +def hipCtxPopCurrent(ctx:c.POINTER[hipCtx_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipCtx_t) +def hipCtxPushCurrent(ctx:hipCtx_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipCtx_t) +def hipCtxSetCurrent(ctx:hipCtx_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipCtx_t]) +def hipCtxGetCurrent(ctx:c.POINTER[hipCtx_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipDevice_t]) +def hipCtxGetDevice(device:c.POINTER[hipDevice_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipCtx_t, c.POINTER[ctypes.c_uint32]) +def hipCtxGetApiVersion(ctx:hipCtx_t, apiVersion:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def hipCtxGetCacheConfig(cacheConfig:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def hipCtxSetCacheConfig(cacheConfig:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def hipCtxSetSharedMemConfig(config:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def hipCtxGetSharedMemConfig(pConfig:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def hipCtxSynchronize() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def hipCtxGetFlags(flags:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipCtx_t, ctypes.c_uint32) +def hipCtxEnablePeerAccess(peerCtx:hipCtx_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipCtx_t) +def hipCtxDisablePeerAccess(peerCtx:hipCtx_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDevice_t, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_int32]) +def hipDevicePrimaryCtxGetState(dev:hipDevice_t, flags:c.POINTER[ctypes.c_uint32], active:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDevice_t) +def hipDevicePrimaryCtxRelease(dev:hipDevice_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipCtx_t], hipDevice_t) +def hipDevicePrimaryCtxRetain(pctx:c.POINTER[hipCtx_t], dev:hipDevice_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDevice_t) +def hipDevicePrimaryCtxReset(dev:hipDevice_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipDevice_t, ctypes.c_uint32) +def hipDevicePrimaryCtxSetFlags(dev:hipDevice_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipModule_t], ctypes.c_void_p) +def hipModuleLoadFatBinary(module:c.POINTER[hipModule_t], fatbin:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipModule_t], c.POINTER[ctypes.c_char]) +def hipModuleLoad(module:c.POINTER[hipModule_t], fname:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipModule_t) +def hipModuleUnload(module:hipModule_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipFunction_t], hipModule_t, c.POINTER[ctypes.c_char]) +def hipModuleGetFunction(function:c.POINTER[hipFunction_t], module:hipModule_t, kname:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], hipModule_t) +def hipModuleGetFunctionCount(count:c.POINTER[ctypes.c_uint32], mod:hipModule_t) -> ctypes.c_uint32: ... +hipLibraryOption_e: dict[int, str] = {(hipLibraryHostUniversalFunctionAndDataTable:=0): 'hipLibraryHostUniversalFunctionAndDataTable', (hipLibraryBinaryIsPreserved:=1): 'hipLibraryBinaryIsPreserved'} +hipLibraryOption: TypeAlias = ctypes.c_uint32 +@dll.bind(ctypes.c_uint32, c.POINTER[hipLibrary_t], ctypes.c_void_p, c.POINTER[c.POINTER[ctypes.c_uint32]], c.POINTER[ctypes.c_void_p], ctypes.c_uint32, c.POINTER[c.POINTER[hipLibraryOption]], c.POINTER[ctypes.c_void_p], ctypes.c_uint32) +def hipLibraryLoadData(library:c.POINTER[hipLibrary_t], code:ctypes.c_void_p, jitOptions:c.POINTER[c.POINTER[ctypes.c_uint32]], jitOptionsValues:c.POINTER[ctypes.c_void_p], numJitOptions:int, libraryOptions:c.POINTER[c.POINTER[hipLibraryOption]], libraryOptionValues:c.POINTER[ctypes.c_void_p], numLibraryOptions:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipLibrary_t], c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_uint32]], c.POINTER[ctypes.c_void_p], ctypes.c_uint32, c.POINTER[c.POINTER[hipLibraryOption]], c.POINTER[ctypes.c_void_p], ctypes.c_uint32) +def hipLibraryLoadFromFile(library:c.POINTER[hipLibrary_t], fileName:c.POINTER[ctypes.c_char], jitOptions:c.POINTER[c.POINTER[ctypes.c_uint32]], jitOptionsValues:c.POINTER[ctypes.c_void_p], numJitOptions:int, libraryOptions:c.POINTER[c.POINTER[hipLibraryOption]], libraryOptionValues:c.POINTER[ctypes.c_void_p], numLibraryOptions:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipLibrary_t) +def hipLibraryUnload(library:hipLibrary_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipKernel_t], hipLibrary_t, c.POINTER[ctypes.c_char]) +def hipLibraryGetKernel(pKernel:c.POINTER[hipKernel_t], library:hipLibrary_t, name:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], hipLibrary_t) +def hipLibraryGetKernelCount(count:c.POINTER[ctypes.c_uint32], library:hipLibrary_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipFuncAttributes], ctypes.c_void_p) +def hipFuncGetAttributes(attr:c.POINTER[hipFuncAttributes], func:ctypes.c_void_p) -> ctypes.c_uint32: ... +hipFunction_attribute: dict[int, str] = {(HIP_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK:=0): 'HIP_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK', (HIP_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES:=1): 'HIP_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES', (HIP_FUNC_ATTRIBUTE_CONST_SIZE_BYTES:=2): 'HIP_FUNC_ATTRIBUTE_CONST_SIZE_BYTES', (HIP_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES:=3): 'HIP_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES', (HIP_FUNC_ATTRIBUTE_NUM_REGS:=4): 'HIP_FUNC_ATTRIBUTE_NUM_REGS', (HIP_FUNC_ATTRIBUTE_PTX_VERSION:=5): 'HIP_FUNC_ATTRIBUTE_PTX_VERSION', (HIP_FUNC_ATTRIBUTE_BINARY_VERSION:=6): 'HIP_FUNC_ATTRIBUTE_BINARY_VERSION', (HIP_FUNC_ATTRIBUTE_CACHE_MODE_CA:=7): 'HIP_FUNC_ATTRIBUTE_CACHE_MODE_CA', (HIP_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES:=8): 'HIP_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES', (HIP_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT:=9): 'HIP_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT', (HIP_FUNC_ATTRIBUTE_MAX:=10): 'HIP_FUNC_ATTRIBUTE_MAX'} +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], ctypes.c_uint32, hipFunction_t) +def hipFuncGetAttribute(value:c.POINTER[ctypes.c_int32], attrib:ctypes.c_uint32, hfunc:hipFunction_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipFunction_t], ctypes.c_void_p) +def hipGetFuncBySymbol(functionPtr:c.POINTER[hipFunction_t], symbolPtr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_void_p], ctypes.c_uint64, c.POINTER[ctypes.c_uint32]) +def hipGetDriverEntryPoint(symbol:c.POINTER[ctypes.c_char], funcPtr:c.POINTER[ctypes.c_void_p], flags:int, driverStatus:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@c.record +class textureReference(c.Struct): + SIZE = 88 + normalized: int + readMode: int + filterMode: int + addressMode: c.Array[ctypes.c_uint32, Literal[3]] + channelDesc: hipChannelFormatDesc + sRGB: int + maxAnisotropy: int + mipmapFilterMode: int + mipmapLevelBias: float + minMipmapLevelClamp: float + maxMipmapLevelClamp: float + textureObject: c.POINTER[__hip_texture] + numChannels: int + format: int +hipTextureReadMode: dict[int, str] = {(hipReadModeElementType:=0): 'hipReadModeElementType', (hipReadModeNormalizedFloat:=1): 'hipReadModeNormalizedFloat'} +hipTextureFilterMode: dict[int, str] = {(hipFilterModePoint:=0): 'hipFilterModePoint', (hipFilterModeLinear:=1): 'hipFilterModeLinear'} +hipTextureAddressMode: dict[int, str] = {(hipAddressModeWrap:=0): 'hipAddressModeWrap', (hipAddressModeClamp:=1): 'hipAddressModeClamp', (hipAddressModeMirror:=2): 'hipAddressModeMirror', (hipAddressModeBorder:=3): 'hipAddressModeBorder'} +class __hip_texture(c.Struct): pass +hipTextureObject_t: TypeAlias = c.POINTER[__hip_texture] +textureReference.register_fields([('normalized', ctypes.c_int32, 0), ('readMode', ctypes.c_uint32, 4), ('filterMode', ctypes.c_uint32, 8), ('addressMode', c.Array[ctypes.c_uint32, Literal[3]], 12), ('channelDesc', hipChannelFormatDesc, 24), ('sRGB', ctypes.c_int32, 44), ('maxAnisotropy', ctypes.c_uint32, 48), ('mipmapFilterMode', ctypes.c_uint32, 52), ('mipmapLevelBias', ctypes.c_float, 56), ('minMipmapLevelClamp', ctypes.c_float, 60), ('maxMipmapLevelClamp', ctypes.c_float, 64), ('textureObject', hipTextureObject_t, 72), ('numChannels', ctypes.c_int32, 80), ('format', ctypes.c_uint32, 84)]) +@dll.bind(ctypes.c_uint32, c.POINTER[c.POINTER[textureReference]], hipModule_t, c.POINTER[ctypes.c_char]) +def hipModuleGetTexRef(texRef:c.POINTER[c.POINTER[textureReference]], hmod:hipModule_t, name:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipModule_t], ctypes.c_void_p) +def hipModuleLoadData(module:c.POINTER[hipModule_t], image:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipModule_t], ctypes.c_void_p, ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_void_p]) +def hipModuleLoadDataEx(module:c.POINTER[hipModule_t], image:ctypes.c_void_p, numOptions:int, options:c.POINTER[ctypes.c_uint32], optionValues:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipLinkState_t, ctypes.c_uint32, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_void_p]) +def hipLinkAddData(state:hipLinkState_t, type:ctypes.c_uint32, data:ctypes.c_void_p, size:size_t, name:c.POINTER[ctypes.c_char], numOptions:int, options:c.POINTER[ctypes.c_uint32], optionValues:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipLinkState_t, ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_void_p]) +def hipLinkAddFile(state:hipLinkState_t, type:ctypes.c_uint32, path:c.POINTER[ctypes.c_char], numOptions:int, options:c.POINTER[ctypes.c_uint32], optionValues:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipLinkState_t, c.POINTER[ctypes.c_void_p], c.POINTER[size_t]) +def hipLinkComplete(state:hipLinkState_t, hipBinOut:c.POINTER[ctypes.c_void_p], sizeOut:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_void_p], c.POINTER[hipLinkState_t]) +def hipLinkCreate(numOptions:int, options:c.POINTER[ctypes.c_uint32], optionValues:c.POINTER[ctypes.c_void_p], stateOut:c.POINTER[hipLinkState_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipLinkState_t) +def hipLinkDestroy(state:hipLinkState_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipFunction_t, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, hipStream_t, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p]) +def hipModuleLaunchKernel(f:hipFunction_t, gridDimX:int, gridDimY:int, gridDimZ:int, blockDimX:int, blockDimY:int, blockDimZ:int, sharedMemBytes:int, stream:hipStream_t, kernelParams:c.POINTER[ctypes.c_void_p], extra:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipFunction_t, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, hipStream_t, c.POINTER[ctypes.c_void_p]) +def hipModuleLaunchCooperativeKernel(f:hipFunction_t, gridDimX:int, gridDimY:int, gridDimZ:int, blockDimX:int, blockDimY:int, blockDimZ:int, sharedMemBytes:int, stream:hipStream_t, kernelParams:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipFunctionLaunchParams], ctypes.c_uint32, ctypes.c_uint32) +def hipModuleLaunchCooperativeKernelMultiDevice(launchParamsList:c.POINTER[hipFunctionLaunchParams], numDevices:int, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, dim3, dim3, c.POINTER[ctypes.c_void_p], ctypes.c_uint32, hipStream_t) +def hipLaunchCooperativeKernel(f:ctypes.c_void_p, gridDim:dim3, blockDimX:dim3, kernelParams:c.POINTER[ctypes.c_void_p], sharedMemBytes:int, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipLaunchParams], ctypes.c_int32, ctypes.c_uint32) +def hipLaunchCooperativeKernelMultiDevice(launchParamsList:c.POINTER[hipLaunchParams], numDevices:int, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipLaunchParams], ctypes.c_int32, ctypes.c_uint32) +def hipExtLaunchMultiKernelMultiDevice(launchParamsList:c.POINTER[hipLaunchParams], numDevices:int, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipLaunchConfig_t], ctypes.c_void_p, c.POINTER[ctypes.c_void_p]) +def hipLaunchKernelExC(config:c.POINTER[hipLaunchConfig_t], fPtr:ctypes.c_void_p, args:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[HIP_LAUNCH_CONFIG], hipFunction_t, c.POINTER[ctypes.c_void_p], c.POINTER[ctypes.c_void_p]) +def hipDrvLaunchKernelEx(config:c.POINTER[HIP_LAUNCH_CONFIG], f:hipFunction_t, params:c.POINTER[ctypes.c_void_p], extra:c.POINTER[ctypes.c_void_p]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipDeviceptr_t, size_t, ctypes.c_uint32, ctypes.c_uint64) +def hipMemGetHandleForAddressRange(handle:ctypes.c_void_p, dptr:hipDeviceptr_t, size:size_t, handleType:ctypes.c_uint32, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], hipFunction_t, size_t, ctypes.c_int32) +def hipModuleOccupancyMaxPotentialBlockSize(gridSize:c.POINTER[ctypes.c_int32], blockSize:c.POINTER[ctypes.c_int32], f:hipFunction_t, dynSharedMemPerBlk:size_t, blockSizeLimit:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], hipFunction_t, size_t, ctypes.c_int32, ctypes.c_uint32) +def hipModuleOccupancyMaxPotentialBlockSizeWithFlags(gridSize:c.POINTER[ctypes.c_int32], blockSize:c.POINTER[ctypes.c_int32], f:hipFunction_t, dynSharedMemPerBlk:size_t, blockSizeLimit:int, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], hipFunction_t, ctypes.c_int32, size_t) +def hipModuleOccupancyMaxActiveBlocksPerMultiprocessor(numBlocks:c.POINTER[ctypes.c_int32], f:hipFunction_t, blockSize:int, dynSharedMemPerBlk:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], hipFunction_t, ctypes.c_int32, size_t, ctypes.c_uint32) +def hipModuleOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(numBlocks:c.POINTER[ctypes.c_int32], f:hipFunction_t, blockSize:int, dynSharedMemPerBlk:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], ctypes.c_void_p, ctypes.c_int32, size_t) +def hipOccupancyMaxActiveBlocksPerMultiprocessor(numBlocks:c.POINTER[ctypes.c_int32], f:ctypes.c_void_p, blockSize:int, dynSharedMemPerBlk:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], ctypes.c_void_p, ctypes.c_int32, size_t, ctypes.c_uint32) +def hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(numBlocks:c.POINTER[ctypes.c_int32], f:ctypes.c_void_p, blockSize:int, dynSharedMemPerBlk:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], ctypes.c_void_p, size_t, ctypes.c_int32) +def hipOccupancyMaxPotentialBlockSize(gridSize:c.POINTER[ctypes.c_int32], blockSize:c.POINTER[ctypes.c_int32], f:ctypes.c_void_p, dynSharedMemPerBlk:size_t, blockSizeLimit:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def hipProfilerStart() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def hipProfilerStop() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, dim3, dim3, size_t, hipStream_t) +def hipConfigureCall(gridDim:dim3, blockDim:dim3, sharedMem:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, size_t) +def hipSetupArgument(arg:ctypes.c_void_p, size:size_t, offset:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p) +def hipLaunchByPtr(func:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, dim3, dim3, size_t, hipStream_t) +def __hipPushCallConfiguration(gridDim:dim3, blockDim:dim3, sharedMem:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[dim3], c.POINTER[dim3], c.POINTER[size_t], c.POINTER[hipStream_t]) +def __hipPopCallConfiguration(gridDim:c.POINTER[dim3], blockDim:c.POINTER[dim3], sharedMem:c.POINTER[size_t], stream:c.POINTER[hipStream_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, dim3, dim3, c.POINTER[ctypes.c_void_p], size_t, hipStream_t) +def hipLaunchKernel(function_address:ctypes.c_void_p, numBlocks:dim3, dimBlocks:dim3, args:c.POINTER[ctypes.c_void_p], sharedMemBytes:size_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, hipHostFn_t, ctypes.c_void_p) +def hipLaunchHostFunc(stream:hipStream_t, fn:hipHostFn_t, userData:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hip_Memcpy2D]) +def hipDrvMemcpy2DUnaligned(pCopy:c.POINTER[hip_Memcpy2D]) -> ctypes.c_uint32: ... +@c.record +class hipResourceDesc(c.Struct): + SIZE = 64 + resType: int + res: hipResourceDesc_res +@c.record +class hipResourceDesc_res(c.Struct): + SIZE = 56 + array: hipResourceDesc_res_array + mipmap: hipResourceDesc_res_mipmap + linear: hipResourceDesc_res_linear + pitch2D: hipResourceDesc_res_pitch2D +@c.record +class hipResourceDesc_res_array(c.Struct): + SIZE = 8 + array: c.POINTER[hipArray] +hipResourceDesc_res_array.register_fields([('array', hipArray_t, 0)]) +@c.record +class hipResourceDesc_res_mipmap(c.Struct): + SIZE = 8 + mipmap: c.POINTER[hipMipmappedArray] +hipResourceDesc_res_mipmap.register_fields([('mipmap', hipMipmappedArray_t, 0)]) +@c.record +class hipResourceDesc_res_linear(c.Struct): + SIZE = 40 + devPtr: ctypes.c_void_p + desc: hipChannelFormatDesc + sizeInBytes: int +hipResourceDesc_res_linear.register_fields([('devPtr', ctypes.c_void_p, 0), ('desc', hipChannelFormatDesc, 8), ('sizeInBytes', size_t, 32)]) +@c.record +class hipResourceDesc_res_pitch2D(c.Struct): + SIZE = 56 + devPtr: ctypes.c_void_p + desc: hipChannelFormatDesc + width: int + height: int + pitchInBytes: int +hipResourceDesc_res_pitch2D.register_fields([('devPtr', ctypes.c_void_p, 0), ('desc', hipChannelFormatDesc, 8), ('width', size_t, 32), ('height', size_t, 40), ('pitchInBytes', size_t, 48)]) +hipResourceDesc_res.register_fields([('array', hipResourceDesc_res_array, 0), ('mipmap', hipResourceDesc_res_mipmap, 0), ('linear', hipResourceDesc_res_linear, 0), ('pitch2D', hipResourceDesc_res_pitch2D, 0)]) +hipResourceDesc.register_fields([('resType', ctypes.c_uint32, 0), ('res', hipResourceDesc_res, 8)]) +@c.record +class hipTextureDesc(c.Struct): + SIZE = 64 + addressMode: c.Array[ctypes.c_uint32, Literal[3]] + filterMode: int + readMode: int + sRGB: int + borderColor: c.Array[ctypes.c_float, Literal[4]] + normalizedCoords: int + maxAnisotropy: int + mipmapFilterMode: int + mipmapLevelBias: float + minMipmapLevelClamp: float + maxMipmapLevelClamp: float +hipTextureDesc.register_fields([('addressMode', c.Array[ctypes.c_uint32, Literal[3]], 0), ('filterMode', ctypes.c_uint32, 12), ('readMode', ctypes.c_uint32, 16), ('sRGB', ctypes.c_int32, 20), ('borderColor', c.Array[ctypes.c_float, Literal[4]], 24), ('normalizedCoords', ctypes.c_int32, 40), ('maxAnisotropy', ctypes.c_uint32, 44), ('mipmapFilterMode', ctypes.c_uint32, 48), ('mipmapLevelBias', ctypes.c_float, 52), ('minMipmapLevelClamp', ctypes.c_float, 56), ('maxMipmapLevelClamp', ctypes.c_float, 60)]) +@c.record +class hipResourceViewDesc(c.Struct): + SIZE = 48 + format: int + width: int + height: int + depth: int + firstMipmapLevel: int + lastMipmapLevel: int + firstLayer: int + lastLayer: int +hipResourceViewFormat: dict[int, str] = {(hipResViewFormatNone:=0): 'hipResViewFormatNone', (hipResViewFormatUnsignedChar1:=1): 'hipResViewFormatUnsignedChar1', (hipResViewFormatUnsignedChar2:=2): 'hipResViewFormatUnsignedChar2', (hipResViewFormatUnsignedChar4:=3): 'hipResViewFormatUnsignedChar4', (hipResViewFormatSignedChar1:=4): 'hipResViewFormatSignedChar1', (hipResViewFormatSignedChar2:=5): 'hipResViewFormatSignedChar2', (hipResViewFormatSignedChar4:=6): 'hipResViewFormatSignedChar4', (hipResViewFormatUnsignedShort1:=7): 'hipResViewFormatUnsignedShort1', (hipResViewFormatUnsignedShort2:=8): 'hipResViewFormatUnsignedShort2', (hipResViewFormatUnsignedShort4:=9): 'hipResViewFormatUnsignedShort4', (hipResViewFormatSignedShort1:=10): 'hipResViewFormatSignedShort1', (hipResViewFormatSignedShort2:=11): 'hipResViewFormatSignedShort2', (hipResViewFormatSignedShort4:=12): 'hipResViewFormatSignedShort4', (hipResViewFormatUnsignedInt1:=13): 'hipResViewFormatUnsignedInt1', (hipResViewFormatUnsignedInt2:=14): 'hipResViewFormatUnsignedInt2', (hipResViewFormatUnsignedInt4:=15): 'hipResViewFormatUnsignedInt4', (hipResViewFormatSignedInt1:=16): 'hipResViewFormatSignedInt1', (hipResViewFormatSignedInt2:=17): 'hipResViewFormatSignedInt2', (hipResViewFormatSignedInt4:=18): 'hipResViewFormatSignedInt4', (hipResViewFormatHalf1:=19): 'hipResViewFormatHalf1', (hipResViewFormatHalf2:=20): 'hipResViewFormatHalf2', (hipResViewFormatHalf4:=21): 'hipResViewFormatHalf4', (hipResViewFormatFloat1:=22): 'hipResViewFormatFloat1', (hipResViewFormatFloat2:=23): 'hipResViewFormatFloat2', (hipResViewFormatFloat4:=24): 'hipResViewFormatFloat4', (hipResViewFormatUnsignedBlockCompressed1:=25): 'hipResViewFormatUnsignedBlockCompressed1', (hipResViewFormatUnsignedBlockCompressed2:=26): 'hipResViewFormatUnsignedBlockCompressed2', (hipResViewFormatUnsignedBlockCompressed3:=27): 'hipResViewFormatUnsignedBlockCompressed3', (hipResViewFormatUnsignedBlockCompressed4:=28): 'hipResViewFormatUnsignedBlockCompressed4', (hipResViewFormatSignedBlockCompressed4:=29): 'hipResViewFormatSignedBlockCompressed4', (hipResViewFormatUnsignedBlockCompressed5:=30): 'hipResViewFormatUnsignedBlockCompressed5', (hipResViewFormatSignedBlockCompressed5:=31): 'hipResViewFormatSignedBlockCompressed5', (hipResViewFormatUnsignedBlockCompressed6H:=32): 'hipResViewFormatUnsignedBlockCompressed6H', (hipResViewFormatSignedBlockCompressed6H:=33): 'hipResViewFormatSignedBlockCompressed6H', (hipResViewFormatUnsignedBlockCompressed7:=34): 'hipResViewFormatUnsignedBlockCompressed7'} +hipResourceViewDesc.register_fields([('format', ctypes.c_uint32, 0), ('width', size_t, 8), ('height', size_t, 16), ('depth', size_t, 24), ('firstMipmapLevel', ctypes.c_uint32, 32), ('lastMipmapLevel', ctypes.c_uint32, 36), ('firstLayer', ctypes.c_uint32, 40), ('lastLayer', ctypes.c_uint32, 44)]) +@dll.bind(ctypes.c_uint32, c.POINTER[hipTextureObject_t], c.POINTER[hipResourceDesc], c.POINTER[hipTextureDesc], c.POINTER[hipResourceViewDesc]) +def hipCreateTextureObject(pTexObject:c.POINTER[hipTextureObject_t], pResDesc:c.POINTER[hipResourceDesc], pTexDesc:c.POINTER[hipTextureDesc], pResViewDesc:c.POINTER[hipResourceViewDesc]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipTextureObject_t) +def hipDestroyTextureObject(textureObject:hipTextureObject_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipChannelFormatDesc], hipArray_const_t) +def hipGetChannelDesc(desc:c.POINTER[hipChannelFormatDesc], array:hipArray_const_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipResourceDesc], hipTextureObject_t) +def hipGetTextureObjectResourceDesc(pResDesc:c.POINTER[hipResourceDesc], textureObject:hipTextureObject_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipResourceViewDesc], hipTextureObject_t) +def hipGetTextureObjectResourceViewDesc(pResViewDesc:c.POINTER[hipResourceViewDesc], textureObject:hipTextureObject_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipTextureDesc], hipTextureObject_t) +def hipGetTextureObjectTextureDesc(pTexDesc:c.POINTER[hipTextureDesc], textureObject:hipTextureObject_t) -> ctypes.c_uint32: ... +@c.record +class HIP_RESOURCE_DESC_st(c.Struct): + SIZE = 144 + resType: int + res: HIP_RESOURCE_DESC_st_res + flags: int +HIP_RESOURCE_DESC: TypeAlias = HIP_RESOURCE_DESC_st +HIPresourcetype_enum: dict[int, str] = {(HIP_RESOURCE_TYPE_ARRAY:=0): 'HIP_RESOURCE_TYPE_ARRAY', (HIP_RESOURCE_TYPE_MIPMAPPED_ARRAY:=1): 'HIP_RESOURCE_TYPE_MIPMAPPED_ARRAY', (HIP_RESOURCE_TYPE_LINEAR:=2): 'HIP_RESOURCE_TYPE_LINEAR', (HIP_RESOURCE_TYPE_PITCH2D:=3): 'HIP_RESOURCE_TYPE_PITCH2D'} +HIPresourcetype: TypeAlias = ctypes.c_uint32 +@c.record +class HIP_RESOURCE_DESC_st_res(c.Struct): + SIZE = 128 + array: HIP_RESOURCE_DESC_st_res_array + mipmap: HIP_RESOURCE_DESC_st_res_mipmap + linear: HIP_RESOURCE_DESC_st_res_linear + pitch2D: HIP_RESOURCE_DESC_st_res_pitch2D + reserved: HIP_RESOURCE_DESC_st_res_reserved +@c.record +class HIP_RESOURCE_DESC_st_res_array(c.Struct): + SIZE = 8 + hArray: c.POINTER[hipArray] +HIP_RESOURCE_DESC_st_res_array.register_fields([('hArray', hipArray_t, 0)]) +@c.record +class HIP_RESOURCE_DESC_st_res_mipmap(c.Struct): + SIZE = 8 + hMipmappedArray: c.POINTER[hipMipmappedArray] +HIP_RESOURCE_DESC_st_res_mipmap.register_fields([('hMipmappedArray', hipMipmappedArray_t, 0)]) +@c.record +class HIP_RESOURCE_DESC_st_res_linear(c.Struct): + SIZE = 24 + devPtr: ctypes.c_void_p + format: int + numChannels: int + sizeInBytes: int +HIP_RESOURCE_DESC_st_res_linear.register_fields([('devPtr', hipDeviceptr_t, 0), ('format', ctypes.c_uint32, 8), ('numChannels', ctypes.c_uint32, 12), ('sizeInBytes', size_t, 16)]) +@c.record +class HIP_RESOURCE_DESC_st_res_pitch2D(c.Struct): + SIZE = 40 + devPtr: ctypes.c_void_p + format: int + numChannels: int + width: int + height: int + pitchInBytes: int +HIP_RESOURCE_DESC_st_res_pitch2D.register_fields([('devPtr', hipDeviceptr_t, 0), ('format', ctypes.c_uint32, 8), ('numChannels', ctypes.c_uint32, 12), ('width', size_t, 16), ('height', size_t, 24), ('pitchInBytes', size_t, 32)]) +@c.record +class HIP_RESOURCE_DESC_st_res_reserved(c.Struct): + SIZE = 128 + reserved: c.Array[ctypes.c_int32, Literal[32]] +HIP_RESOURCE_DESC_st_res_reserved.register_fields([('reserved', c.Array[ctypes.c_int32, Literal[32]], 0)]) +HIP_RESOURCE_DESC_st_res.register_fields([('array', HIP_RESOURCE_DESC_st_res_array, 0), ('mipmap', HIP_RESOURCE_DESC_st_res_mipmap, 0), ('linear', HIP_RESOURCE_DESC_st_res_linear, 0), ('pitch2D', HIP_RESOURCE_DESC_st_res_pitch2D, 0), ('reserved', HIP_RESOURCE_DESC_st_res_reserved, 0)]) +HIP_RESOURCE_DESC_st.register_fields([('resType', HIPresourcetype, 0), ('res', HIP_RESOURCE_DESC_st_res, 8), ('flags', ctypes.c_uint32, 136)]) +@c.record +class HIP_TEXTURE_DESC_st(c.Struct): + SIZE = 104 + addressMode: c.Array[ctypes.c_uint32, Literal[3]] + filterMode: int + flags: int + maxAnisotropy: int + mipmapFilterMode: int + mipmapLevelBias: float + minMipmapLevelClamp: float + maxMipmapLevelClamp: float + borderColor: c.Array[ctypes.c_float, Literal[4]] + reserved: c.Array[ctypes.c_int32, Literal[12]] +HIP_TEXTURE_DESC: TypeAlias = HIP_TEXTURE_DESC_st +HIPaddress_mode_enum: dict[int, str] = {(HIP_TR_ADDRESS_MODE_WRAP:=0): 'HIP_TR_ADDRESS_MODE_WRAP', (HIP_TR_ADDRESS_MODE_CLAMP:=1): 'HIP_TR_ADDRESS_MODE_CLAMP', (HIP_TR_ADDRESS_MODE_MIRROR:=2): 'HIP_TR_ADDRESS_MODE_MIRROR', (HIP_TR_ADDRESS_MODE_BORDER:=3): 'HIP_TR_ADDRESS_MODE_BORDER'} +HIPaddress_mode: TypeAlias = ctypes.c_uint32 +HIPfilter_mode_enum: dict[int, str] = {(HIP_TR_FILTER_MODE_POINT:=0): 'HIP_TR_FILTER_MODE_POINT', (HIP_TR_FILTER_MODE_LINEAR:=1): 'HIP_TR_FILTER_MODE_LINEAR'} +HIPfilter_mode: TypeAlias = ctypes.c_uint32 +HIP_TEXTURE_DESC_st.register_fields([('addressMode', c.Array[HIPaddress_mode, Literal[3]], 0), ('filterMode', HIPfilter_mode, 12), ('flags', ctypes.c_uint32, 16), ('maxAnisotropy', ctypes.c_uint32, 20), ('mipmapFilterMode', HIPfilter_mode, 24), ('mipmapLevelBias', ctypes.c_float, 28), ('minMipmapLevelClamp', ctypes.c_float, 32), ('maxMipmapLevelClamp', ctypes.c_float, 36), ('borderColor', c.Array[ctypes.c_float, Literal[4]], 40), ('reserved', c.Array[ctypes.c_int32, Literal[12]], 56)]) +@c.record +class HIP_RESOURCE_VIEW_DESC_st(c.Struct): + SIZE = 112 + format: int + width: int + height: int + depth: int + firstMipmapLevel: int + lastMipmapLevel: int + firstLayer: int + lastLayer: int + reserved: c.Array[ctypes.c_uint32, Literal[16]] +HIP_RESOURCE_VIEW_DESC: TypeAlias = HIP_RESOURCE_VIEW_DESC_st +HIPresourceViewFormat_enum: dict[int, str] = {(HIP_RES_VIEW_FORMAT_NONE:=0): 'HIP_RES_VIEW_FORMAT_NONE', (HIP_RES_VIEW_FORMAT_UINT_1X8:=1): 'HIP_RES_VIEW_FORMAT_UINT_1X8', (HIP_RES_VIEW_FORMAT_UINT_2X8:=2): 'HIP_RES_VIEW_FORMAT_UINT_2X8', (HIP_RES_VIEW_FORMAT_UINT_4X8:=3): 'HIP_RES_VIEW_FORMAT_UINT_4X8', (HIP_RES_VIEW_FORMAT_SINT_1X8:=4): 'HIP_RES_VIEW_FORMAT_SINT_1X8', (HIP_RES_VIEW_FORMAT_SINT_2X8:=5): 'HIP_RES_VIEW_FORMAT_SINT_2X8', (HIP_RES_VIEW_FORMAT_SINT_4X8:=6): 'HIP_RES_VIEW_FORMAT_SINT_4X8', (HIP_RES_VIEW_FORMAT_UINT_1X16:=7): 'HIP_RES_VIEW_FORMAT_UINT_1X16', (HIP_RES_VIEW_FORMAT_UINT_2X16:=8): 'HIP_RES_VIEW_FORMAT_UINT_2X16', (HIP_RES_VIEW_FORMAT_UINT_4X16:=9): 'HIP_RES_VIEW_FORMAT_UINT_4X16', (HIP_RES_VIEW_FORMAT_SINT_1X16:=10): 'HIP_RES_VIEW_FORMAT_SINT_1X16', (HIP_RES_VIEW_FORMAT_SINT_2X16:=11): 'HIP_RES_VIEW_FORMAT_SINT_2X16', (HIP_RES_VIEW_FORMAT_SINT_4X16:=12): 'HIP_RES_VIEW_FORMAT_SINT_4X16', (HIP_RES_VIEW_FORMAT_UINT_1X32:=13): 'HIP_RES_VIEW_FORMAT_UINT_1X32', (HIP_RES_VIEW_FORMAT_UINT_2X32:=14): 'HIP_RES_VIEW_FORMAT_UINT_2X32', (HIP_RES_VIEW_FORMAT_UINT_4X32:=15): 'HIP_RES_VIEW_FORMAT_UINT_4X32', (HIP_RES_VIEW_FORMAT_SINT_1X32:=16): 'HIP_RES_VIEW_FORMAT_SINT_1X32', (HIP_RES_VIEW_FORMAT_SINT_2X32:=17): 'HIP_RES_VIEW_FORMAT_SINT_2X32', (HIP_RES_VIEW_FORMAT_SINT_4X32:=18): 'HIP_RES_VIEW_FORMAT_SINT_4X32', (HIP_RES_VIEW_FORMAT_FLOAT_1X16:=19): 'HIP_RES_VIEW_FORMAT_FLOAT_1X16', (HIP_RES_VIEW_FORMAT_FLOAT_2X16:=20): 'HIP_RES_VIEW_FORMAT_FLOAT_2X16', (HIP_RES_VIEW_FORMAT_FLOAT_4X16:=21): 'HIP_RES_VIEW_FORMAT_FLOAT_4X16', (HIP_RES_VIEW_FORMAT_FLOAT_1X32:=22): 'HIP_RES_VIEW_FORMAT_FLOAT_1X32', (HIP_RES_VIEW_FORMAT_FLOAT_2X32:=23): 'HIP_RES_VIEW_FORMAT_FLOAT_2X32', (HIP_RES_VIEW_FORMAT_FLOAT_4X32:=24): 'HIP_RES_VIEW_FORMAT_FLOAT_4X32', (HIP_RES_VIEW_FORMAT_UNSIGNED_BC1:=25): 'HIP_RES_VIEW_FORMAT_UNSIGNED_BC1', (HIP_RES_VIEW_FORMAT_UNSIGNED_BC2:=26): 'HIP_RES_VIEW_FORMAT_UNSIGNED_BC2', (HIP_RES_VIEW_FORMAT_UNSIGNED_BC3:=27): 'HIP_RES_VIEW_FORMAT_UNSIGNED_BC3', (HIP_RES_VIEW_FORMAT_UNSIGNED_BC4:=28): 'HIP_RES_VIEW_FORMAT_UNSIGNED_BC4', (HIP_RES_VIEW_FORMAT_SIGNED_BC4:=29): 'HIP_RES_VIEW_FORMAT_SIGNED_BC4', (HIP_RES_VIEW_FORMAT_UNSIGNED_BC5:=30): 'HIP_RES_VIEW_FORMAT_UNSIGNED_BC5', (HIP_RES_VIEW_FORMAT_SIGNED_BC5:=31): 'HIP_RES_VIEW_FORMAT_SIGNED_BC5', (HIP_RES_VIEW_FORMAT_UNSIGNED_BC6H:=32): 'HIP_RES_VIEW_FORMAT_UNSIGNED_BC6H', (HIP_RES_VIEW_FORMAT_SIGNED_BC6H:=33): 'HIP_RES_VIEW_FORMAT_SIGNED_BC6H', (HIP_RES_VIEW_FORMAT_UNSIGNED_BC7:=34): 'HIP_RES_VIEW_FORMAT_UNSIGNED_BC7'} +HIPresourceViewFormat: TypeAlias = ctypes.c_uint32 +HIP_RESOURCE_VIEW_DESC_st.register_fields([('format', HIPresourceViewFormat, 0), ('width', size_t, 8), ('height', size_t, 16), ('depth', size_t, 24), ('firstMipmapLevel', ctypes.c_uint32, 32), ('lastMipmapLevel', ctypes.c_uint32, 36), ('firstLayer', ctypes.c_uint32, 40), ('lastLayer', ctypes.c_uint32, 44), ('reserved', c.Array[ctypes.c_uint32, Literal[16]], 48)]) +@dll.bind(ctypes.c_uint32, c.POINTER[hipTextureObject_t], c.POINTER[HIP_RESOURCE_DESC], c.POINTER[HIP_TEXTURE_DESC], c.POINTER[HIP_RESOURCE_VIEW_DESC]) +def hipTexObjectCreate(pTexObject:c.POINTER[hipTextureObject_t], pResDesc:c.POINTER[HIP_RESOURCE_DESC], pTexDesc:c.POINTER[HIP_TEXTURE_DESC], pResViewDesc:c.POINTER[HIP_RESOURCE_VIEW_DESC]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipTextureObject_t) +def hipTexObjectDestroy(texObject:hipTextureObject_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[HIP_RESOURCE_DESC], hipTextureObject_t) +def hipTexObjectGetResourceDesc(pResDesc:c.POINTER[HIP_RESOURCE_DESC], texObject:hipTextureObject_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[HIP_RESOURCE_VIEW_DESC], hipTextureObject_t) +def hipTexObjectGetResourceViewDesc(pResViewDesc:c.POINTER[HIP_RESOURCE_VIEW_DESC], texObject:hipTextureObject_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[HIP_TEXTURE_DESC], hipTextureObject_t) +def hipTexObjectGetTextureDesc(pTexDesc:c.POINTER[HIP_TEXTURE_DESC], texObject:hipTextureObject_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMipmappedArray_t], c.POINTER[hipChannelFormatDesc], hipExtent, ctypes.c_uint32, ctypes.c_uint32) +def hipMallocMipmappedArray(mipmappedArray:c.POINTER[hipMipmappedArray_t], desc:c.POINTER[hipChannelFormatDesc], extent:hipExtent, numLevels:int, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipMipmappedArray_t) +def hipFreeMipmappedArray(mipmappedArray:hipMipmappedArray_t) -> ctypes.c_uint32: ... +hipMipmappedArray_const_t: TypeAlias = c.POINTER[hipMipmappedArray] +@dll.bind(ctypes.c_uint32, c.POINTER[hipArray_t], hipMipmappedArray_const_t, ctypes.c_uint32) +def hipGetMipmappedArrayLevel(levelArray:c.POINTER[hipArray_t], mipmappedArray:hipMipmappedArray_const_t, level:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMipmappedArray_t], c.POINTER[HIP_ARRAY3D_DESCRIPTOR], ctypes.c_uint32) +def hipMipmappedArrayCreate(pHandle:c.POINTER[hipMipmappedArray_t], pMipmappedArrayDesc:c.POINTER[HIP_ARRAY3D_DESCRIPTOR], numMipmapLevels:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipMipmappedArray_t) +def hipMipmappedArrayDestroy(hMipmappedArray:hipMipmappedArray_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipArray_t], hipMipmappedArray_t, ctypes.c_uint32) +def hipMipmappedArrayGetLevel(pLevelArray:c.POINTER[hipArray_t], hMipMappedArray:hipMipmappedArray_t, level:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], hipMipmappedArray_const_t, c.POINTER[hipChannelFormatDesc]) +def hipBindTextureToMipmappedArray(tex:c.POINTER[textureReference], mipmappedArray:hipMipmappedArray_const_t, desc:c.POINTER[hipChannelFormatDesc]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[c.POINTER[textureReference]], ctypes.c_void_p) +def hipGetTextureReference(texref:c.POINTER[c.POINTER[textureReference]], symbol:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_float], c.POINTER[textureReference]) +def hipTexRefGetBorderColor(pBorderColor:c.POINTER[ctypes.c_float], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipArray_t], c.POINTER[textureReference]) +def hipTexRefGetArray(pArray:c.POINTER[hipArray_t], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], ctypes.c_int32, ctypes.c_uint32) +def hipTexRefSetAddressMode(texRef:c.POINTER[textureReference], dim:int, am:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], hipArray_const_t, ctypes.c_uint32) +def hipTexRefSetArray(tex:c.POINTER[textureReference], array:hipArray_const_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], ctypes.c_uint32) +def hipTexRefSetFilterMode(texRef:c.POINTER[textureReference], fm:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], ctypes.c_uint32) +def hipTexRefSetFlags(texRef:c.POINTER[textureReference], Flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], ctypes.c_uint32, ctypes.c_int32) +def hipTexRefSetFormat(texRef:c.POINTER[textureReference], fmt:ctypes.c_uint32, NumPackedComponents:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], c.POINTER[textureReference], ctypes.c_void_p, c.POINTER[hipChannelFormatDesc], size_t) +def hipBindTexture(offset:c.POINTER[size_t], tex:c.POINTER[textureReference], devPtr:ctypes.c_void_p, desc:c.POINTER[hipChannelFormatDesc], size:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], c.POINTER[textureReference], ctypes.c_void_p, c.POINTER[hipChannelFormatDesc], size_t, size_t, size_t) +def hipBindTexture2D(offset:c.POINTER[size_t], tex:c.POINTER[textureReference], devPtr:ctypes.c_void_p, desc:c.POINTER[hipChannelFormatDesc], width:size_t, height:size_t, pitch:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], hipArray_const_t, c.POINTER[hipChannelFormatDesc]) +def hipBindTextureToArray(tex:c.POINTER[textureReference], array:hipArray_const_t, desc:c.POINTER[hipChannelFormatDesc]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], c.POINTER[textureReference]) +def hipGetTextureAlignmentOffset(offset:c.POINTER[size_t], texref:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference]) +def hipUnbindTexture(tex:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipDeviceptr_t], c.POINTER[textureReference]) +def hipTexRefGetAddress(dev_ptr:c.POINTER[hipDeviceptr_t], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[textureReference], ctypes.c_int32) +def hipTexRefGetAddressMode(pam:c.POINTER[ctypes.c_uint32], texRef:c.POINTER[textureReference], dim:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[textureReference]) +def hipTexRefGetFilterMode(pfm:c.POINTER[ctypes.c_uint32], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[textureReference]) +def hipTexRefGetFlags(pFlags:c.POINTER[ctypes.c_uint32], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_int32], c.POINTER[textureReference]) +def hipTexRefGetFormat(pFormat:c.POINTER[ctypes.c_uint32], pNumChannels:c.POINTER[ctypes.c_int32], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[textureReference]) +def hipTexRefGetMaxAnisotropy(pmaxAnsio:c.POINTER[ctypes.c_int32], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[textureReference]) +def hipTexRefGetMipmapFilterMode(pfm:c.POINTER[ctypes.c_uint32], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_float], c.POINTER[textureReference]) +def hipTexRefGetMipmapLevelBias(pbias:c.POINTER[ctypes.c_float], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_float], c.POINTER[ctypes.c_float], c.POINTER[textureReference]) +def hipTexRefGetMipmapLevelClamp(pminMipmapLevelClamp:c.POINTER[ctypes.c_float], pmaxMipmapLevelClamp:c.POINTER[ctypes.c_float], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMipmappedArray_t], c.POINTER[textureReference]) +def hipTexRefGetMipMappedArray(pArray:c.POINTER[hipMipmappedArray_t], texRef:c.POINTER[textureReference]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], c.POINTER[textureReference], hipDeviceptr_t, size_t) +def hipTexRefSetAddress(ByteOffset:c.POINTER[size_t], texRef:c.POINTER[textureReference], dptr:hipDeviceptr_t, bytes:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], c.POINTER[HIP_ARRAY_DESCRIPTOR], hipDeviceptr_t, size_t) +def hipTexRefSetAddress2D(texRef:c.POINTER[textureReference], desc:c.POINTER[HIP_ARRAY_DESCRIPTOR], dptr:hipDeviceptr_t, Pitch:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], ctypes.c_uint32) +def hipTexRefSetMaxAnisotropy(texRef:c.POINTER[textureReference], maxAniso:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], c.POINTER[ctypes.c_float]) +def hipTexRefSetBorderColor(texRef:c.POINTER[textureReference], pBorderColor:c.POINTER[ctypes.c_float]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], ctypes.c_uint32) +def hipTexRefSetMipmapFilterMode(texRef:c.POINTER[textureReference], fm:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], ctypes.c_float) +def hipTexRefSetMipmapLevelBias(texRef:c.POINTER[textureReference], bias:float) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], ctypes.c_float, ctypes.c_float) +def hipTexRefSetMipmapLevelClamp(texRef:c.POINTER[textureReference], minMipMapLevelClamp:float, maxMipMapLevelClamp:float) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[textureReference], c.POINTER[hipMipmappedArray], ctypes.c_uint32) +def hipTexRefSetMipmappedArray(texRef:c.POINTER[textureReference], mipmappedArray:c.POINTER[hipMipmappedArray], Flags:int) -> ctypes.c_uint32: ... +@dll.bind(c.POINTER[ctypes.c_char], uint32_t) +def hipApiName(id:uint32_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], hipFunction_t) +def hipKernelNameRef(f:hipFunction_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_void_p, hipStream_t) +def hipKernelNameRefByPtr(hostFunction:ctypes.c_void_p, stream:hipStream_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, hipStream_t) +def hipGetStreamDeviceId(stream:hipStream_t) -> int: ... +@dll.bind(ctypes.c_uint32, hipStream_t, ctypes.c_uint32) +def hipStreamBeginCapture(stream:hipStream_t, mode:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, hipGraph_t, c.POINTER[hipGraphNode_t], c.POINTER[hipGraphEdgeData], size_t, ctypes.c_uint32) +def hipStreamBeginCaptureToGraph(stream:hipStream_t, graph:hipGraph_t, dependencies:c.POINTER[hipGraphNode_t], dependencyData:c.POINTER[hipGraphEdgeData], numDependencies:size_t, mode:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[hipGraph_t]) +def hipStreamEndCapture(stream:hipStream_t, pGraph:c.POINTER[hipGraph_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint64]) +def hipStreamGetCaptureInfo(stream:hipStream_t, pCaptureStatus:c.POINTER[ctypes.c_uint32], pId:c.POINTER[ctypes.c_uint64]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint64], c.POINTER[hipGraph_t], c.POINTER[c.POINTER[hipGraphNode_t]], c.POINTER[size_t]) +def hipStreamGetCaptureInfo_v2(stream:hipStream_t, captureStatus_out:c.POINTER[ctypes.c_uint32], id_out:c.POINTER[ctypes.c_uint64], graph_out:c.POINTER[hipGraph_t], dependencies_out:c.POINTER[c.POINTER[hipGraphNode_t]], numDependencies_out:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[ctypes.c_uint32]) +def hipStreamIsCapturing(stream:hipStream_t, pCaptureStatus:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipStream_t, c.POINTER[hipGraphNode_t], size_t, ctypes.c_uint32) +def hipStreamUpdateCaptureDependencies(stream:hipStream_t, dependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def hipThreadExchangeStreamCaptureMode(mode:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraph_t], ctypes.c_uint32) +def hipGraphCreate(pGraph:c.POINTER[hipGraph_t], flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t) +def hipGraphDestroy(graph:hipGraph_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t, c.POINTER[hipGraphNode_t], c.POINTER[hipGraphNode_t], size_t) +def hipGraphAddDependencies(graph:hipGraph_t, _from:c.POINTER[hipGraphNode_t], to:c.POINTER[hipGraphNode_t], numDependencies:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t, c.POINTER[hipGraphNode_t], c.POINTER[hipGraphNode_t], size_t) +def hipGraphRemoveDependencies(graph:hipGraph_t, _from:c.POINTER[hipGraphNode_t], to:c.POINTER[hipGraphNode_t], numDependencies:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t, c.POINTER[hipGraphNode_t], c.POINTER[hipGraphNode_t], c.POINTER[size_t]) +def hipGraphGetEdges(graph:hipGraph_t, _from:c.POINTER[hipGraphNode_t], to:c.POINTER[hipGraphNode_t], numEdges:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t, c.POINTER[hipGraphNode_t], c.POINTER[size_t]) +def hipGraphGetNodes(graph:hipGraph_t, nodes:c.POINTER[hipGraphNode_t], numNodes:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t, c.POINTER[hipGraphNode_t], c.POINTER[size_t]) +def hipGraphGetRootNodes(graph:hipGraph_t, pRootNodes:c.POINTER[hipGraphNode_t], pNumRootNodes:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipGraphNode_t], c.POINTER[size_t]) +def hipGraphNodeGetDependencies(node:hipGraphNode_t, pDependencies:c.POINTER[hipGraphNode_t], pNumDependencies:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipGraphNode_t], c.POINTER[size_t]) +def hipGraphNodeGetDependentNodes(node:hipGraphNode_t, pDependentNodes:c.POINTER[hipGraphNode_t], pNumDependentNodes:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[ctypes.c_uint32]) +def hipGraphNodeGetType(node:hipGraphNode_t, pType:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t) +def hipGraphDestroyNode(node:hipGraphNode_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraph_t], hipGraph_t) +def hipGraphClone(pGraphClone:c.POINTER[hipGraph_t], originalGraph:hipGraph_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraphNode_t, hipGraph_t) +def hipGraphNodeFindInClone(pNode:c.POINTER[hipGraphNode_t], originalNode:hipGraphNode_t, clonedGraph:hipGraph_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphExec_t], hipGraph_t, c.POINTER[hipGraphNode_t], c.POINTER[ctypes.c_char], size_t) +def hipGraphInstantiate(pGraphExec:c.POINTER[hipGraphExec_t], graph:hipGraph_t, pErrorNode:c.POINTER[hipGraphNode_t], pLogBuffer:c.POINTER[ctypes.c_char], bufferSize:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphExec_t], hipGraph_t, ctypes.c_uint64) +def hipGraphInstantiateWithFlags(pGraphExec:c.POINTER[hipGraphExec_t], graph:hipGraph_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphExec_t], hipGraph_t, c.POINTER[hipGraphInstantiateParams]) +def hipGraphInstantiateWithParams(pGraphExec:c.POINTER[hipGraphExec_t], graph:hipGraph_t, instantiateParams:c.POINTER[hipGraphInstantiateParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipStream_t) +def hipGraphLaunch(graphExec:hipGraphExec_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipStream_t) +def hipGraphUpload(graphExec:hipGraphExec_t, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipGraphNodeParams]) +def hipGraphAddNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, nodeParams:c.POINTER[hipGraphNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, c.POINTER[ctypes.c_uint64]) +def hipGraphExecGetFlags(graphExec:hipGraphExec_t, flags:c.POINTER[ctypes.c_uint64]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipGraphNodeParams]) +def hipGraphNodeSetParams(node:hipGraphNode_t, nodeParams:c.POINTER[hipGraphNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipGraphNodeParams]) +def hipGraphExecNodeSetParams(graphExec:hipGraphExec_t, node:hipGraphNode_t, nodeParams:c.POINTER[hipGraphNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t) +def hipGraphExecDestroy(graphExec:hipGraphExec_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraph_t, c.POINTER[hipGraphNode_t], c.POINTER[ctypes.c_uint32]) +def hipGraphExecUpdate(hGraphExec:hipGraphExec_t, hGraph:hipGraph_t, hErrorNode_out:c.POINTER[hipGraphNode_t], updateResult_out:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipKernelNodeParams]) +def hipGraphAddKernelNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, pNodeParams:c.POINTER[hipKernelNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipKernelNodeParams]) +def hipGraphKernelNodeGetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipKernelNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipKernelNodeParams]) +def hipGraphKernelNodeSetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipKernelNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipKernelNodeParams]) +def hipGraphExecKernelNodeSetParams(hGraphExec:hipGraphExec_t, node:hipGraphNode_t, pNodeParams:c.POINTER[hipKernelNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[HIP_MEMCPY3D], hipCtx_t) +def hipDrvGraphAddMemcpyNode(phGraphNode:c.POINTER[hipGraphNode_t], hGraph:hipGraph_t, dependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, copyParams:c.POINTER[HIP_MEMCPY3D], ctx:hipCtx_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipMemcpy3DParms]) +def hipGraphAddMemcpyNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, pCopyParams:c.POINTER[hipMemcpy3DParms]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipMemcpy3DParms]) +def hipGraphMemcpyNodeGetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipMemcpy3DParms]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipMemcpy3DParms]) +def hipGraphMemcpyNodeSetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipMemcpy3DParms]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, ctypes.c_uint32, c.POINTER[hipLaunchAttributeValue]) +def hipGraphKernelNodeSetAttribute(hNode:hipGraphNode_t, attr:ctypes.c_uint32, value:c.POINTER[hipLaunchAttributeValue]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, ctypes.c_uint32, c.POINTER[hipLaunchAttributeValue]) +def hipGraphKernelNodeGetAttribute(hNode:hipGraphNode_t, attr:ctypes.c_uint32, value:c.POINTER[hipLaunchAttributeValue]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipMemcpy3DParms]) +def hipGraphExecMemcpyNodeSetParams(hGraphExec:hipGraphExec_t, node:hipGraphNode_t, pNodeParams:c.POINTER[hipMemcpy3DParms]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32) +def hipGraphAddMemcpyNode1D(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, dst:ctypes.c_void_p, src:ctypes.c_void_p, count:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32) +def hipGraphMemcpyNodeSetParams1D(node:hipGraphNode_t, dst:ctypes.c_void_p, src:ctypes.c_void_p, count:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32) +def hipGraphExecMemcpyNodeSetParams1D(hGraphExec:hipGraphExec_t, node:hipGraphNode_t, dst:ctypes.c_void_p, src:ctypes.c_void_p, count:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32) +def hipGraphAddMemcpyNodeFromSymbol(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, dst:ctypes.c_void_p, symbol:ctypes.c_void_p, count:size_t, offset:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32) +def hipGraphMemcpyNodeSetParamsFromSymbol(node:hipGraphNode_t, dst:ctypes.c_void_p, symbol:ctypes.c_void_p, count:size_t, offset:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32) +def hipGraphExecMemcpyNodeSetParamsFromSymbol(hGraphExec:hipGraphExec_t, node:hipGraphNode_t, dst:ctypes.c_void_p, symbol:ctypes.c_void_p, count:size_t, offset:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32) +def hipGraphAddMemcpyNodeToSymbol(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, symbol:ctypes.c_void_p, src:ctypes.c_void_p, count:size_t, offset:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32) +def hipGraphMemcpyNodeSetParamsToSymbol(node:hipGraphNode_t, symbol:ctypes.c_void_p, src:ctypes.c_void_p, count:size_t, offset:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_uint32) +def hipGraphExecMemcpyNodeSetParamsToSymbol(hGraphExec:hipGraphExec_t, node:hipGraphNode_t, symbol:ctypes.c_void_p, src:ctypes.c_void_p, count:size_t, offset:size_t, kind:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipMemsetParams]) +def hipGraphAddMemsetNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, pMemsetParams:c.POINTER[hipMemsetParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipMemsetParams]) +def hipGraphMemsetNodeGetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipMemsetParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipMemsetParams]) +def hipGraphMemsetNodeSetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipMemsetParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipMemsetParams]) +def hipGraphExecMemsetNodeSetParams(hGraphExec:hipGraphExec_t, node:hipGraphNode_t, pNodeParams:c.POINTER[hipMemsetParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipHostNodeParams]) +def hipGraphAddHostNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, pNodeParams:c.POINTER[hipHostNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipHostNodeParams]) +def hipGraphHostNodeGetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipHostNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipHostNodeParams]) +def hipGraphHostNodeSetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipHostNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipHostNodeParams]) +def hipGraphExecHostNodeSetParams(hGraphExec:hipGraphExec_t, node:hipGraphNode_t, pNodeParams:c.POINTER[hipHostNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, hipGraph_t) +def hipGraphAddChildGraphNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, childGraph:hipGraph_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipGraph_t]) +def hipGraphChildGraphNodeGetGraph(node:hipGraphNode_t, pGraph:c.POINTER[hipGraph_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, hipGraph_t) +def hipGraphExecChildGraphNodeSetParams(hGraphExec:hipGraphExec_t, node:hipGraphNode_t, childGraph:hipGraph_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t) +def hipGraphAddEmptyNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, hipEvent_t) +def hipGraphAddEventRecordNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipEvent_t]) +def hipGraphEventRecordNodeGetEvent(node:hipGraphNode_t, event_out:c.POINTER[hipEvent_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, hipEvent_t) +def hipGraphEventRecordNodeSetEvent(node:hipGraphNode_t, event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, hipEvent_t) +def hipGraphExecEventRecordNodeSetEvent(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, hipEvent_t) +def hipGraphAddEventWaitNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipEvent_t]) +def hipGraphEventWaitNodeGetEvent(node:hipGraphNode_t, event_out:c.POINTER[hipEvent_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, hipEvent_t) +def hipGraphEventWaitNodeSetEvent(node:hipGraphNode_t, event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, hipEvent_t) +def hipGraphExecEventWaitNodeSetEvent(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, event:hipEvent_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipMemAllocNodeParams]) +def hipGraphAddMemAllocNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, pNodeParams:c.POINTER[hipMemAllocNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipMemAllocNodeParams]) +def hipGraphMemAllocNodeGetParams(node:hipGraphNode_t, pNodeParams:c.POINTER[hipMemAllocNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, ctypes.c_void_p) +def hipGraphAddMemFreeNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, dev_ptr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, ctypes.c_void_p) +def hipGraphMemFreeNodeGetParams(node:hipGraphNode_t, dev_ptr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32, ctypes.c_uint32, ctypes.c_void_p) +def hipDeviceGetGraphMemAttribute(device:int, attr:ctypes.c_uint32, value:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32, ctypes.c_uint32, ctypes.c_void_p) +def hipDeviceSetGraphMemAttribute(device:int, attr:ctypes.c_uint32, value:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32) +def hipDeviceGraphMemTrim(device:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipUserObject_t], ctypes.c_void_p, hipHostFn_t, ctypes.c_uint32, ctypes.c_uint32) +def hipUserObjectCreate(object_out:c.POINTER[hipUserObject_t], ptr:ctypes.c_void_p, destroy:hipHostFn_t, initialRefcount:int, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipUserObject_t, ctypes.c_uint32) +def hipUserObjectRelease(object:hipUserObject_t, count:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipUserObject_t, ctypes.c_uint32) +def hipUserObjectRetain(object:hipUserObject_t, count:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t, hipUserObject_t, ctypes.c_uint32, ctypes.c_uint32) +def hipGraphRetainUserObject(graph:hipGraph_t, object:hipUserObject_t, count:int, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t, hipUserObject_t, ctypes.c_uint32) +def hipGraphReleaseUserObject(graph:hipGraph_t, object:hipUserObject_t, count:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraph_t, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def hipGraphDebugDotPrint(graph:hipGraph_t, path:c.POINTER[ctypes.c_char], flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, hipGraphNode_t) +def hipGraphKernelNodeCopyAttributes(hSrc:hipGraphNode_t, hDst:hipGraphNode_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, ctypes.c_uint32) +def hipGraphNodeSetEnabled(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, isEnabled:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[ctypes.c_uint32]) +def hipGraphNodeGetEnabled(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, isEnabled:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipExternalSemaphoreWaitNodeParams]) +def hipGraphAddExternalSemaphoresWaitNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, nodeParams:c.POINTER[hipExternalSemaphoreWaitNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipExternalSemaphoreSignalNodeParams]) +def hipGraphAddExternalSemaphoresSignalNode(pGraphNode:c.POINTER[hipGraphNode_t], graph:hipGraph_t, pDependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, nodeParams:c.POINTER[hipExternalSemaphoreSignalNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipExternalSemaphoreSignalNodeParams]) +def hipGraphExternalSemaphoresSignalNodeSetParams(hNode:hipGraphNode_t, nodeParams:c.POINTER[hipExternalSemaphoreSignalNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipExternalSemaphoreWaitNodeParams]) +def hipGraphExternalSemaphoresWaitNodeSetParams(hNode:hipGraphNode_t, nodeParams:c.POINTER[hipExternalSemaphoreWaitNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipExternalSemaphoreSignalNodeParams]) +def hipGraphExternalSemaphoresSignalNodeGetParams(hNode:hipGraphNode_t, params_out:c.POINTER[hipExternalSemaphoreSignalNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[hipExternalSemaphoreWaitNodeParams]) +def hipGraphExternalSemaphoresWaitNodeGetParams(hNode:hipGraphNode_t, params_out:c.POINTER[hipExternalSemaphoreWaitNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipExternalSemaphoreSignalNodeParams]) +def hipGraphExecExternalSemaphoresSignalNodeSetParams(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, nodeParams:c.POINTER[hipExternalSemaphoreSignalNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipExternalSemaphoreWaitNodeParams]) +def hipGraphExecExternalSemaphoresWaitNodeSetParams(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, nodeParams:c.POINTER[hipExternalSemaphoreWaitNodeParams]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[HIP_MEMCPY3D]) +def hipDrvGraphMemcpyNodeGetParams(hNode:hipGraphNode_t, nodeParams:c.POINTER[HIP_MEMCPY3D]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphNode_t, c.POINTER[HIP_MEMCPY3D]) +def hipDrvGraphMemcpyNodeSetParams(hNode:hipGraphNode_t, nodeParams:c.POINTER[HIP_MEMCPY3D]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, c.POINTER[hipMemsetParams], hipCtx_t) +def hipDrvGraphAddMemsetNode(phGraphNode:c.POINTER[hipGraphNode_t], hGraph:hipGraph_t, dependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, memsetParams:c.POINTER[hipMemsetParams], ctx:hipCtx_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipGraphNode_t], hipGraph_t, c.POINTER[hipGraphNode_t], size_t, hipDeviceptr_t) +def hipDrvGraphAddMemFreeNode(phGraphNode:c.POINTER[hipGraphNode_t], hGraph:hipGraph_t, dependencies:c.POINTER[hipGraphNode_t], numDependencies:size_t, dptr:hipDeviceptr_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[HIP_MEMCPY3D], hipCtx_t) +def hipDrvGraphExecMemcpyNodeSetParams(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, copyParams:c.POINTER[HIP_MEMCPY3D], ctx:hipCtx_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphExec_t, hipGraphNode_t, c.POINTER[hipMemsetParams], hipCtx_t) +def hipDrvGraphExecMemsetNodeSetParams(hGraphExec:hipGraphExec_t, hNode:hipGraphNode_t, memsetParams:c.POINTER[hipMemsetParams], ctx:hipCtx_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t) +def hipMemAddressFree(devPtr:ctypes.c_void_p, size:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], size_t, size_t, ctypes.c_void_p, ctypes.c_uint64) +def hipMemAddressReserve(ptr:c.POINTER[ctypes.c_void_p], size:size_t, alignment:size_t, addr:ctypes.c_void_p, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemGenericAllocationHandle_t], size_t, c.POINTER[hipMemAllocationProp], ctypes.c_uint64) +def hipMemCreate(handle:c.POINTER[hipMemGenericAllocationHandle_t], size:size_t, prop:c.POINTER[hipMemAllocationProp], flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, hipMemGenericAllocationHandle_t, ctypes.c_uint32, ctypes.c_uint64) +def hipMemExportToShareableHandle(shareableHandle:ctypes.c_void_p, handle:hipMemGenericAllocationHandle_t, handleType:ctypes.c_uint32, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint64], c.POINTER[hipMemLocation], ctypes.c_void_p) +def hipMemGetAccess(flags:c.POINTER[ctypes.c_uint64], location:c.POINTER[hipMemLocation], ptr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[size_t], c.POINTER[hipMemAllocationProp], ctypes.c_uint32) +def hipMemGetAllocationGranularity(granularity:c.POINTER[size_t], prop:c.POINTER[hipMemAllocationProp], option:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemAllocationProp], hipMemGenericAllocationHandle_t) +def hipMemGetAllocationPropertiesFromHandle(prop:c.POINTER[hipMemAllocationProp], handle:hipMemGenericAllocationHandle_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemGenericAllocationHandle_t], ctypes.c_void_p, ctypes.c_uint32) +def hipMemImportFromShareableHandle(handle:c.POINTER[hipMemGenericAllocationHandle_t], osHandle:ctypes.c_void_p, shHandleType:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, size_t, hipMemGenericAllocationHandle_t, ctypes.c_uint64) +def hipMemMap(ptr:ctypes.c_void_p, size:size_t, offset:size_t, handle:hipMemGenericAllocationHandle_t, flags:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipArrayMapInfo], ctypes.c_uint32, hipStream_t) +def hipMemMapArrayAsync(mapInfoList:c.POINTER[hipArrayMapInfo], count:int, stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipMemGenericAllocationHandle_t) +def hipMemRelease(handle:hipMemGenericAllocationHandle_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipMemGenericAllocationHandle_t], ctypes.c_void_p) +def hipMemRetainAllocationHandle(handle:c.POINTER[hipMemGenericAllocationHandle_t], addr:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t, c.POINTER[hipMemAccessDesc], size_t) +def hipMemSetAccess(ptr:ctypes.c_void_p, size:size_t, desc:c.POINTER[hipMemAccessDesc], count:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_void_p, size_t) +def hipMemUnmap(ptr:ctypes.c_void_p, size:size_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32, c.POINTER[hipGraphicsResource_t], hipStream_t) +def hipGraphicsMapResources(count:int, resources:c.POINTER[hipGraphicsResource_t], stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[hipArray_t], hipGraphicsResource_t, ctypes.c_uint32, ctypes.c_uint32) +def hipGraphicsSubResourceGetMappedArray(array:c.POINTER[hipArray_t], resource:hipGraphicsResource_t, arrayIndex:int, mipLevel:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_void_p], c.POINTER[size_t], hipGraphicsResource_t) +def hipGraphicsResourceGetMappedPointer(devPtr:c.POINTER[ctypes.c_void_p], size:c.POINTER[size_t], resource:hipGraphicsResource_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_int32, c.POINTER[hipGraphicsResource_t], hipStream_t) +def hipGraphicsUnmapResources(count:int, resources:c.POINTER[hipGraphicsResource_t], stream:hipStream_t) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipGraphicsResource_t) +def hipGraphicsUnregisterResource(resource:hipGraphicsResource_t) -> ctypes.c_uint32: ... +class __hip_surface(c.Struct): pass +hipSurfaceObject_t: TypeAlias = c.POINTER[__hip_surface] +@dll.bind(ctypes.c_uint32, c.POINTER[hipSurfaceObject_t], c.POINTER[hipResourceDesc]) +def hipCreateSurfaceObject(pSurfObject:c.POINTER[hipSurfaceObject_t], pResDesc:c.POINTER[hipResourceDesc]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, hipSurfaceObject_t) +def hipDestroySurfaceObject(surfaceObject:hipSurfaceObject_t) -> ctypes.c_uint32: ... +hipmipmappedArray: TypeAlias = c.POINTER[hipMipmappedArray] +hipResourcetype: TypeAlias = ctypes.c_uint32 +hipMemcpyFlags: dict[int, str] = {(hipMemcpyFlagDefault:=0): 'hipMemcpyFlagDefault', (hipMemcpyFlagPreferOverlapWithCompute:=1): 'hipMemcpyFlagPreferOverlapWithCompute'} +hiprtcJIT_option = hipJitOption +HIPRTC_JIT_MAX_REGISTERS = hipJitOptionMaxRegisters +HIPRTC_JIT_THREADS_PER_BLOCK = hipJitOptionThreadsPerBlock +HIPRTC_JIT_WALL_TIME = hipJitOptionWallTime +HIPRTC_JIT_INFO_LOG_BUFFER = hipJitOptionInfoLogBuffer +HIPRTC_JIT_INFO_LOG_BUFFER_SIZE_BYTES = hipJitOptionInfoLogBufferSizeBytes +HIPRTC_JIT_ERROR_LOG_BUFFER = hipJitOptionErrorLogBuffer +HIPRTC_JIT_ERROR_LOG_BUFFER_SIZE_BYTES = hipJitOptionErrorLogBufferSizeBytes +HIPRTC_JIT_OPTIMIZATION_LEVEL = hipJitOptionOptimizationLevel +HIPRTC_JIT_TARGET_FROM_HIPCONTEXT = hipJitOptionTargetFromContext +HIPRTC_JIT_TARGET = hipJitOptionTarget +HIPRTC_JIT_FALLBACK_STRATEGY = hipJitOptionFallbackStrategy +HIPRTC_JIT_GENERATE_DEBUG_INFO = hipJitOptionGenerateDebugInfo +HIPRTC_JIT_LOG_VERBOSE = hipJitOptionLogVerbose +HIPRTC_JIT_GENERATE_LINE_INFO = hipJitOptionGenerateLineInfo +HIPRTC_JIT_CACHE_MODE = hipJitOptionCacheMode +HIPRTC_JIT_NEW_SM3X_OPT = hipJitOptionSm3xOpt +HIPRTC_JIT_FAST_COMPILE = hipJitOptionFastCompile +HIPRTC_JIT_GLOBAL_SYMBOL_NAMES = hipJitOptionGlobalSymbolNames +HIPRTC_JIT_GLOBAL_SYMBOL_ADDRESS = hipJitOptionGlobalSymbolAddresses +HIPRTC_JIT_GLOBAL_SYMBOL_COUNT = hipJitOptionGlobalSymbolCount +HIPRTC_JIT_LTO = hipJitOptionLto +HIPRTC_JIT_FTZ = hipJitOptionFtz +HIPRTC_JIT_PREC_DIV = hipJitOptionPrecDiv +HIPRTC_JIT_PREC_SQRT = hipJitOptionPrecSqrt +HIPRTC_JIT_FMA = hipJitOptionFma +HIPRTC_JIT_POSITION_INDEPENDENT_CODE = hipJitOptionPositionIndependentCode +HIPRTC_JIT_MIN_CTA_PER_SM = hipJitOptionMinCTAPerSM +HIPRTC_JIT_MAX_THREADS_PER_BLOCK = hipJitOptionMaxThreadsPerBlock +HIPRTC_JIT_OVERRIDE_DIRECT_VALUES = hipJitOptionOverrideDirectiveValues +HIPRTC_JIT_NUM_OPTIONS = hipJitOptionNumOptions +HIPRTC_JIT_IR_TO_ISA_OPT_EXT = hipJitOptionIRtoISAOptExt +HIPRTC_JIT_IR_TO_ISA_OPT_COUNT_EXT = hipJitOptionIRtoISAOptCountExt +hiprtcJITInputType = hipJitInputType +HIPRTC_JIT_INPUT_CUBIN = hipJitInputCubin +HIPRTC_JIT_INPUT_PTX = hipJitInputPtx +HIPRTC_JIT_INPUT_FATBINARY = hipJitInputFatBinary +HIPRTC_JIT_INPUT_OBJECT = hipJitInputObject +HIPRTC_JIT_INPUT_LIBRARY = hipJitInputLibrary +HIPRTC_JIT_INPUT_NVVM = hipJitInputNvvm +HIPRTC_JIT_NUM_LEGACY_INPUT_TYPES = hipJitNumLegacyInputTypes +HIPRTC_JIT_INPUT_LLVM_BITCODE = hipJitInputLLVMBitcode +HIPRTC_JIT_INPUT_LLVM_BUNDLED_BITCODE = hipJitInputLLVMBundledBitcode +HIPRTC_JIT_INPUT_LLVM_ARCHIVES_OF_BUNDLED_BITCODE = hipJitInputLLVMArchivesOfBundledBitcode +HIPRTC_JIT_INPUT_SPIRV = hipJitInputSpirv +HIPRTC_JIT_NUM_INPUT_TYPES = hipJitNumInputTypes +hipGetDeviceProperties = hipGetDevicePropertiesR0600 +hipDeviceProp_t = hipDeviceProp_tR0600 +hipChooseDevice = hipChooseDeviceR0600 +GENERIC_GRID_LAUNCH = 1 +HIP_DEPRECATED = lambda msg: __attribute__((deprecated(msg))) # type: ignore +hipIpcMemLazyEnablePeerAccess = 0x01 +HIP_IPC_HANDLE_SIZE = 64 +hipStreamDefault = 0x00 +hipStreamNonBlocking = 0x01 +hipEventDefault = 0x0 +hipEventBlockingSync = 0x1 +hipEventDisableTiming = 0x2 +hipEventInterprocess = 0x4 +hipEventRecordDefault = 0x00 +hipEventRecordExternal = 0x01 +hipEventWaitDefault = 0x00 +hipEventWaitExternal = 0x01 +hipEventDisableSystemFence = 0x20000000 +hipEventReleaseToDevice = 0x40000000 +hipEventReleaseToSystem = 0x80000000 +hipEnableDefault = 0x0 +hipEnableLegacyStream = 0x1 +hipEnablePerThreadDefaultStream = 0x2 +hipHostAllocDefault = 0x0 +hipHostMallocDefault = 0x0 +hipHostAllocPortable = 0x1 +hipHostMallocPortable = 0x1 +hipHostAllocMapped = 0x2 +hipHostMallocMapped = 0x2 +hipHostAllocWriteCombined = 0x4 +hipHostMallocWriteCombined = 0x4 +hipHostMallocUncached = 0x10000000 +hipHostAllocUncached = hipHostMallocUncached +hipHostMallocNumaUser = 0x20000000 +hipHostMallocCoherent = 0x40000000 +hipHostMallocNonCoherent = 0x80000000 +hipMemAttachGlobal = 0x01 +hipMemAttachHost = 0x02 +hipMemAttachSingle = 0x04 +hipDeviceMallocDefault = 0x0 +hipDeviceMallocFinegrained = 0x1 +hipMallocSignalMemory = 0x2 +hipDeviceMallocUncached = 0x3 +hipDeviceMallocContiguous = 0x4 +hipHostRegisterDefault = 0x0 +hipHostRegisterPortable = 0x1 +hipHostRegisterMapped = 0x2 +hipHostRegisterIoMemory = 0x4 +hipHostRegisterReadOnly = 0x08 +hipExtHostRegisterCoarseGrained = 0x8 +hipExtHostRegisterUncached = 0x80000000 +hipDeviceScheduleAuto = 0x0 +hipDeviceScheduleSpin = 0x1 +hipDeviceScheduleYield = 0x2 +hipDeviceScheduleBlockingSync = 0x4 +hipDeviceScheduleMask = 0x7 +hipDeviceMapHost = 0x8 +hipDeviceLmemResizeToMax = 0x10 +hipArrayDefault = 0x00 +hipArrayLayered = 0x01 +hipArraySurfaceLoadStore = 0x02 +hipArrayCubemap = 0x04 +hipArrayTextureGather = 0x08 +hipOccupancyDefault = 0x00 +hipOccupancyDisableCachingOverride = 0x01 +hipCooperativeLaunchMultiDeviceNoPreSync = 0x01 +hipCooperativeLaunchMultiDeviceNoPostSync = 0x02 +hipExtAnyOrderLaunch = 0x01 +hipStreamWaitValueGte = 0x0 +hipStreamWaitValueEq = 0x1 +hipStreamWaitValueAnd = 0x2 +hipStreamWaitValueNor = 0x3 +hipExternalMemoryDedicated = 0x1 +hipStreamAttrID = hipLaunchAttributeID +hipStreamAttributeAccessPolicyWindow = hipLaunchAttributeAccessPolicyWindow +hipStreamAttributeSynchronizationPolicy = hipLaunchAttributeSynchronizationPolicy +hipStreamAttributeMemSyncDomainMap = hipLaunchAttributeMemSyncDomainMap +hipStreamAttributeMemSyncDomain = hipLaunchAttributeMemSyncDomain +hipStreamAttributePriority = hipLaunchAttributePriority +hipStreamAttrValue = hipLaunchAttributeValue +hipKernelNodeAttrID = hipLaunchAttributeID +hipKernelNodeAttributeAccessPolicyWindow = hipLaunchAttributeAccessPolicyWindow +hipKernelNodeAttributeCooperative = hipLaunchAttributeCooperative +hipKernelNodeAttributePriority = hipLaunchAttributePriority +hipKernelNodeAttrValue = hipLaunchAttributeValue +hipDrvLaunchAttributeCooperative = hipLaunchAttributeCooperative +hipDrvLaunchAttributeID = hipLaunchAttributeID +hipDrvLaunchAttributeValue = hipLaunchAttributeValue +hipDrvLaunchAttribute = hipLaunchAttribute +hipGraphKernelNodePortDefault = 0 +hipGraphKernelNodePortLaunchCompletion = 2 +hipGraphKernelNodePortProgrammatic = 1 +HIP_TRSA_OVERRIDE_FORMAT = 0x01 +HIP_TRSF_READ_AS_INTEGER = 0x01 +HIP_TRSF_NORMALIZED_COORDINATES = 0x02 +HIP_TRSF_SRGB = 0x10 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/hsa.py b/artifacts/package_runtime/tinygrad/runtime/autogen/hsa.py new file mode 100644 index 000000000..6be780547 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/hsa.py @@ -0,0 +1,1108 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +import os +enum_SQ_RSRC_BUF_TYPE: dict[int, str] = {(SQ_RSRC_BUF:=0): 'SQ_RSRC_BUF', (SQ_RSRC_BUF_RSVD_1:=1): 'SQ_RSRC_BUF_RSVD_1', (SQ_RSRC_BUF_RSVD_2:=2): 'SQ_RSRC_BUF_RSVD_2', (SQ_RSRC_BUF_RSVD_3:=3): 'SQ_RSRC_BUF_RSVD_3'} +SQ_RSRC_BUF_TYPE: TypeAlias = ctypes.c_uint32 +enum_BUF_DATA_FORMAT: dict[int, str] = {(BUF_DATA_FORMAT_INVALID:=0): 'BUF_DATA_FORMAT_INVALID', (BUF_DATA_FORMAT_8:=1): 'BUF_DATA_FORMAT_8', (BUF_DATA_FORMAT_16:=2): 'BUF_DATA_FORMAT_16', (BUF_DATA_FORMAT_8_8:=3): 'BUF_DATA_FORMAT_8_8', (BUF_DATA_FORMAT_32:=4): 'BUF_DATA_FORMAT_32', (BUF_DATA_FORMAT_16_16:=5): 'BUF_DATA_FORMAT_16_16', (BUF_DATA_FORMAT_10_11_11:=6): 'BUF_DATA_FORMAT_10_11_11', (BUF_DATA_FORMAT_11_11_10:=7): 'BUF_DATA_FORMAT_11_11_10', (BUF_DATA_FORMAT_10_10_10_2:=8): 'BUF_DATA_FORMAT_10_10_10_2', (BUF_DATA_FORMAT_2_10_10_10:=9): 'BUF_DATA_FORMAT_2_10_10_10', (BUF_DATA_FORMAT_8_8_8_8:=10): 'BUF_DATA_FORMAT_8_8_8_8', (BUF_DATA_FORMAT_32_32:=11): 'BUF_DATA_FORMAT_32_32', (BUF_DATA_FORMAT_16_16_16_16:=12): 'BUF_DATA_FORMAT_16_16_16_16', (BUF_DATA_FORMAT_32_32_32:=13): 'BUF_DATA_FORMAT_32_32_32', (BUF_DATA_FORMAT_32_32_32_32:=14): 'BUF_DATA_FORMAT_32_32_32_32', (BUF_DATA_FORMAT_RESERVED_15:=15): 'BUF_DATA_FORMAT_RESERVED_15'} +BUF_DATA_FORMAT: TypeAlias = ctypes.c_uint32 +enum_BUF_NUM_FORMAT: dict[int, str] = {(BUF_NUM_FORMAT_UNORM:=0): 'BUF_NUM_FORMAT_UNORM', (BUF_NUM_FORMAT_SNORM:=1): 'BUF_NUM_FORMAT_SNORM', (BUF_NUM_FORMAT_USCALED:=2): 'BUF_NUM_FORMAT_USCALED', (BUF_NUM_FORMAT_SSCALED:=3): 'BUF_NUM_FORMAT_SSCALED', (BUF_NUM_FORMAT_UINT:=4): 'BUF_NUM_FORMAT_UINT', (BUF_NUM_FORMAT_SINT:=5): 'BUF_NUM_FORMAT_SINT', (BUF_NUM_FORMAT_SNORM_OGL__SI__CI:=6): 'BUF_NUM_FORMAT_SNORM_OGL__SI__CI', (BUF_NUM_FORMAT_RESERVED_6__VI:=6): 'BUF_NUM_FORMAT_RESERVED_6__VI', (BUF_NUM_FORMAT_FLOAT:=7): 'BUF_NUM_FORMAT_FLOAT'} +BUF_NUM_FORMAT: TypeAlias = ctypes.c_uint32 +enum_BUF_FORMAT: dict[int, str] = {(BUF_FORMAT_32_UINT:=20): 'BUF_FORMAT_32_UINT'} +BUF_FORMAT: TypeAlias = ctypes.c_uint32 +enum_SQ_SEL_XYZW01: dict[int, str] = {(SQ_SEL_0:=0): 'SQ_SEL_0', (SQ_SEL_1:=1): 'SQ_SEL_1', (SQ_SEL_RESERVED_0:=2): 'SQ_SEL_RESERVED_0', (SQ_SEL_RESERVED_1:=3): 'SQ_SEL_RESERVED_1', (SQ_SEL_X:=4): 'SQ_SEL_X', (SQ_SEL_Y:=5): 'SQ_SEL_Y', (SQ_SEL_Z:=6): 'SQ_SEL_Z', (SQ_SEL_W:=7): 'SQ_SEL_W'} +SQ_SEL_XYZW01: TypeAlias = ctypes.c_uint32 +@c.record +class union_COMPUTE_TMPRING_SIZE(c.Struct): + SIZE = 4 + bitfields: union_COMPUTE_TMPRING_SIZE_bitfields + bits: union_COMPUTE_TMPRING_SIZE_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_COMPUTE_TMPRING_SIZE_bitfields(c.Struct): + SIZE = 4 + WAVES: int + WAVESIZE: int +union_COMPUTE_TMPRING_SIZE_bitfields.register_fields([('WAVES', ctypes.c_uint32, 0, 12, 0), ('WAVESIZE', ctypes.c_uint32, 1, 13, 4)]) +union_COMPUTE_TMPRING_SIZE.register_fields([('bitfields', union_COMPUTE_TMPRING_SIZE_bitfields, 0), ('bits', union_COMPUTE_TMPRING_SIZE_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_COMPUTE_TMPRING_SIZE_GFX11(c.Struct): + SIZE = 4 + bitfields: union_COMPUTE_TMPRING_SIZE_GFX11_bitfields + bits: union_COMPUTE_TMPRING_SIZE_GFX11_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_COMPUTE_TMPRING_SIZE_GFX11_bitfields(c.Struct): + SIZE = 4 + WAVES: int + WAVESIZE: int +union_COMPUTE_TMPRING_SIZE_GFX11_bitfields.register_fields([('WAVES', ctypes.c_uint32, 0, 12, 0), ('WAVESIZE', ctypes.c_uint32, 1, 15, 4)]) +union_COMPUTE_TMPRING_SIZE_GFX11.register_fields([('bitfields', union_COMPUTE_TMPRING_SIZE_GFX11_bitfields, 0), ('bits', union_COMPUTE_TMPRING_SIZE_GFX11_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_COMPUTE_TMPRING_SIZE_GFX12(c.Struct): + SIZE = 4 + bitfields: union_COMPUTE_TMPRING_SIZE_GFX12_bitfields + bits: union_COMPUTE_TMPRING_SIZE_GFX12_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_COMPUTE_TMPRING_SIZE_GFX12_bitfields(c.Struct): + SIZE = 4 + WAVES: int + WAVESIZE: int +union_COMPUTE_TMPRING_SIZE_GFX12_bitfields.register_fields([('WAVES', ctypes.c_uint32, 0, 12, 0), ('WAVESIZE', ctypes.c_uint32, 1, 18, 4)]) +union_COMPUTE_TMPRING_SIZE_GFX12.register_fields([('bitfields', union_COMPUTE_TMPRING_SIZE_GFX12_bitfields, 0), ('bits', union_COMPUTE_TMPRING_SIZE_GFX12_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_SQ_BUF_RSRC_WORD0(c.Struct): + SIZE = 4 + bitfields: union_SQ_BUF_RSRC_WORD0_bitfields + bits: union_SQ_BUF_RSRC_WORD0_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_SQ_BUF_RSRC_WORD0_bitfields(c.Struct): + SIZE = 4 + BASE_ADDRESS: int +union_SQ_BUF_RSRC_WORD0_bitfields.register_fields([('BASE_ADDRESS', ctypes.c_uint32, 0, 32, 0)]) +union_SQ_BUF_RSRC_WORD0.register_fields([('bitfields', union_SQ_BUF_RSRC_WORD0_bitfields, 0), ('bits', union_SQ_BUF_RSRC_WORD0_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_SQ_BUF_RSRC_WORD1(c.Struct): + SIZE = 4 + bitfields: union_SQ_BUF_RSRC_WORD1_bitfields + bits: union_SQ_BUF_RSRC_WORD1_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_SQ_BUF_RSRC_WORD1_bitfields(c.Struct): + SIZE = 4 + BASE_ADDRESS_HI: int + STRIDE: int + CACHE_SWIZZLE: int + SWIZZLE_ENABLE: int +union_SQ_BUF_RSRC_WORD1_bitfields.register_fields([('BASE_ADDRESS_HI', ctypes.c_uint32, 0, 16, 0), ('STRIDE', ctypes.c_uint32, 2, 14, 0), ('CACHE_SWIZZLE', ctypes.c_uint32, 3, 1, 6), ('SWIZZLE_ENABLE', ctypes.c_uint32, 3, 1, 7)]) +union_SQ_BUF_RSRC_WORD1.register_fields([('bitfields', union_SQ_BUF_RSRC_WORD1_bitfields, 0), ('bits', union_SQ_BUF_RSRC_WORD1_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_SQ_BUF_RSRC_WORD1_GFX11(c.Struct): + SIZE = 4 + bitfields: union_SQ_BUF_RSRC_WORD1_GFX11_bitfields + bits: union_SQ_BUF_RSRC_WORD1_GFX11_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_SQ_BUF_RSRC_WORD1_GFX11_bitfields(c.Struct): + SIZE = 4 + BASE_ADDRESS_HI: int + STRIDE: int + SWIZZLE_ENABLE: int +union_SQ_BUF_RSRC_WORD1_GFX11_bitfields.register_fields([('BASE_ADDRESS_HI', ctypes.c_uint32, 0, 16, 0), ('STRIDE', ctypes.c_uint32, 2, 14, 0), ('SWIZZLE_ENABLE', ctypes.c_uint32, 3, 2, 6)]) +union_SQ_BUF_RSRC_WORD1_GFX11.register_fields([('bitfields', union_SQ_BUF_RSRC_WORD1_GFX11_bitfields, 0), ('bits', union_SQ_BUF_RSRC_WORD1_GFX11_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_SQ_BUF_RSRC_WORD2(c.Struct): + SIZE = 4 + bitfields: union_SQ_BUF_RSRC_WORD2_bitfields + bits: union_SQ_BUF_RSRC_WORD2_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_SQ_BUF_RSRC_WORD2_bitfields(c.Struct): + SIZE = 4 + NUM_RECORDS: int +union_SQ_BUF_RSRC_WORD2_bitfields.register_fields([('NUM_RECORDS', ctypes.c_uint32, 0, 32, 0)]) +union_SQ_BUF_RSRC_WORD2.register_fields([('bitfields', union_SQ_BUF_RSRC_WORD2_bitfields, 0), ('bits', union_SQ_BUF_RSRC_WORD2_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_SQ_BUF_RSRC_WORD3(c.Struct): + SIZE = 4 + bitfields: union_SQ_BUF_RSRC_WORD3_bitfields + bits: union_SQ_BUF_RSRC_WORD3_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_SQ_BUF_RSRC_WORD3_bitfields(c.Struct): + SIZE = 4 + DST_SEL_X: int + DST_SEL_Y: int + DST_SEL_Z: int + DST_SEL_W: int + NUM_FORMAT: int + DATA_FORMAT: int + ELEMENT_SIZE: int + INDEX_STRIDE: int + ADD_TID_ENABLE: int + ATC__CI__VI: int + HASH_ENABLE: int + HEAP: int + MTYPE__CI__VI: int + TYPE: int +union_SQ_BUF_RSRC_WORD3_bitfields.register_fields([('DST_SEL_X', ctypes.c_uint32, 0, 3, 0), ('DST_SEL_Y', ctypes.c_uint32, 0, 3, 3), ('DST_SEL_Z', ctypes.c_uint32, 0, 3, 6), ('DST_SEL_W', ctypes.c_uint32, 1, 3, 1), ('NUM_FORMAT', ctypes.c_uint32, 1, 3, 4), ('DATA_FORMAT', ctypes.c_uint32, 1, 4, 7), ('ELEMENT_SIZE', ctypes.c_uint32, 2, 2, 3), ('INDEX_STRIDE', ctypes.c_uint32, 2, 2, 5), ('ADD_TID_ENABLE', ctypes.c_uint32, 2, 1, 7), ('ATC__CI__VI', ctypes.c_uint32, 3, 1, 0), ('HASH_ENABLE', ctypes.c_uint32, 3, 1, 1), ('HEAP', ctypes.c_uint32, 3, 1, 2), ('MTYPE__CI__VI', ctypes.c_uint32, 3, 3, 3), ('TYPE', ctypes.c_uint32, 3, 2, 6)]) +union_SQ_BUF_RSRC_WORD3.register_fields([('bitfields', union_SQ_BUF_RSRC_WORD3_bitfields, 0), ('bits', union_SQ_BUF_RSRC_WORD3_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_SQ_BUF_RSRC_WORD3_GFX10(c.Struct): + SIZE = 4 + bitfields: union_SQ_BUF_RSRC_WORD3_GFX10_bitfields + bits: union_SQ_BUF_RSRC_WORD3_GFX10_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_SQ_BUF_RSRC_WORD3_GFX10_bitfields(c.Struct): + SIZE = 4 + DST_SEL_X: int + DST_SEL_Y: int + DST_SEL_Z: int + DST_SEL_W: int + FORMAT: int + RESERVED1: int + INDEX_STRIDE: int + ADD_TID_ENABLE: int + RESOURCE_LEVEL: int + RESERVED2: int + OOB_SELECT: int + TYPE: int +union_SQ_BUF_RSRC_WORD3_GFX10_bitfields.register_fields([('DST_SEL_X', ctypes.c_uint32, 0, 3, 0), ('DST_SEL_Y', ctypes.c_uint32, 0, 3, 3), ('DST_SEL_Z', ctypes.c_uint32, 0, 3, 6), ('DST_SEL_W', ctypes.c_uint32, 1, 3, 1), ('FORMAT', ctypes.c_uint32, 1, 7, 4), ('RESERVED1', ctypes.c_uint32, 2, 2, 3), ('INDEX_STRIDE', ctypes.c_uint32, 2, 2, 5), ('ADD_TID_ENABLE', ctypes.c_uint32, 2, 1, 7), ('RESOURCE_LEVEL', ctypes.c_uint32, 3, 1, 0), ('RESERVED2', ctypes.c_uint32, 3, 3, 1), ('OOB_SELECT', ctypes.c_uint32, 3, 2, 4), ('TYPE', ctypes.c_uint32, 3, 2, 6)]) +union_SQ_BUF_RSRC_WORD3_GFX10.register_fields([('bitfields', union_SQ_BUF_RSRC_WORD3_GFX10_bitfields, 0), ('bits', union_SQ_BUF_RSRC_WORD3_GFX10_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_SQ_BUF_RSRC_WORD3_GFX11(c.Struct): + SIZE = 4 + bitfields: union_SQ_BUF_RSRC_WORD3_GFX11_bitfields + bits: union_SQ_BUF_RSRC_WORD3_GFX11_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_SQ_BUF_RSRC_WORD3_GFX11_bitfields(c.Struct): + SIZE = 4 + DST_SEL_X: int + DST_SEL_Y: int + DST_SEL_Z: int + DST_SEL_W: int + FORMAT: int + RESERVED1: int + INDEX_STRIDE: int + ADD_TID_ENABLE: int + RESERVED2: int + OOB_SELECT: int + TYPE: int +union_SQ_BUF_RSRC_WORD3_GFX11_bitfields.register_fields([('DST_SEL_X', ctypes.c_uint32, 0, 3, 0), ('DST_SEL_Y', ctypes.c_uint32, 0, 3, 3), ('DST_SEL_Z', ctypes.c_uint32, 0, 3, 6), ('DST_SEL_W', ctypes.c_uint32, 1, 3, 1), ('FORMAT', ctypes.c_uint32, 1, 6, 4), ('RESERVED1', ctypes.c_uint32, 2, 3, 2), ('INDEX_STRIDE', ctypes.c_uint32, 2, 2, 5), ('ADD_TID_ENABLE', ctypes.c_uint32, 2, 1, 7), ('RESERVED2', ctypes.c_uint32, 3, 4, 0), ('OOB_SELECT', ctypes.c_uint32, 3, 2, 4), ('TYPE', ctypes.c_uint32, 3, 2, 6)]) +union_SQ_BUF_RSRC_WORD3_GFX11.register_fields([('bitfields', union_SQ_BUF_RSRC_WORD3_GFX11_bitfields, 0), ('bits', union_SQ_BUF_RSRC_WORD3_GFX11_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +@c.record +class union_SQ_BUF_RSRC_WORD3_GFX12(c.Struct): + SIZE = 4 + bitfields: union_SQ_BUF_RSRC_WORD3_GFX12_bitfields + bits: union_SQ_BUF_RSRC_WORD3_GFX12_bitfields + u32All: int + i32All: int + f32All: float +@c.record +class union_SQ_BUF_RSRC_WORD3_GFX12_bitfields(c.Struct): + SIZE = 4 + DST_SEL_X: int + DST_SEL_Y: int + DST_SEL_Z: int + DST_SEL_W: int + FORMAT: int + RESERVED1: int + INDEX_STRIDE: int + ADD_TID_ENABLE: int + WRITE_COMPRESS_ENABLE: int + COMPRESSION_EN: int + COMPRESSION_ACCESS_MODE: int + OOB_SELECT: int + TYPE: int +union_SQ_BUF_RSRC_WORD3_GFX12_bitfields.register_fields([('DST_SEL_X', ctypes.c_uint32, 0, 3, 0), ('DST_SEL_Y', ctypes.c_uint32, 0, 3, 3), ('DST_SEL_Z', ctypes.c_uint32, 0, 3, 6), ('DST_SEL_W', ctypes.c_uint32, 1, 3, 1), ('FORMAT', ctypes.c_uint32, 1, 6, 4), ('RESERVED1', ctypes.c_uint32, 2, 3, 2), ('INDEX_STRIDE', ctypes.c_uint32, 2, 2, 5), ('ADD_TID_ENABLE', ctypes.c_uint32, 2, 1, 7), ('WRITE_COMPRESS_ENABLE', ctypes.c_uint32, 3, 1, 0), ('COMPRESSION_EN', ctypes.c_uint32, 3, 1, 1), ('COMPRESSION_ACCESS_MODE', ctypes.c_uint32, 3, 2, 2), ('OOB_SELECT', ctypes.c_uint32, 3, 2, 4), ('TYPE', ctypes.c_uint32, 3, 2, 6)]) +union_SQ_BUF_RSRC_WORD3_GFX12.register_fields([('bitfields', union_SQ_BUF_RSRC_WORD3_GFX12_bitfields, 0), ('bits', union_SQ_BUF_RSRC_WORD3_GFX12_bitfields, 0), ('u32All', ctypes.c_uint32, 0), ('i32All', ctypes.c_int32, 0), ('f32All', ctypes.c_float, 0)]) +hsa_status_t: dict[int, str] = {(HSA_STATUS_SUCCESS:=0): 'HSA_STATUS_SUCCESS', (HSA_STATUS_INFO_BREAK:=1): 'HSA_STATUS_INFO_BREAK', (HSA_STATUS_ERROR:=4096): 'HSA_STATUS_ERROR', (HSA_STATUS_ERROR_INVALID_ARGUMENT:=4097): 'HSA_STATUS_ERROR_INVALID_ARGUMENT', (HSA_STATUS_ERROR_INVALID_QUEUE_CREATION:=4098): 'HSA_STATUS_ERROR_INVALID_QUEUE_CREATION', (HSA_STATUS_ERROR_INVALID_ALLOCATION:=4099): 'HSA_STATUS_ERROR_INVALID_ALLOCATION', (HSA_STATUS_ERROR_INVALID_AGENT:=4100): 'HSA_STATUS_ERROR_INVALID_AGENT', (HSA_STATUS_ERROR_INVALID_REGION:=4101): 'HSA_STATUS_ERROR_INVALID_REGION', (HSA_STATUS_ERROR_INVALID_SIGNAL:=4102): 'HSA_STATUS_ERROR_INVALID_SIGNAL', (HSA_STATUS_ERROR_INVALID_QUEUE:=4103): 'HSA_STATUS_ERROR_INVALID_QUEUE', (HSA_STATUS_ERROR_OUT_OF_RESOURCES:=4104): 'HSA_STATUS_ERROR_OUT_OF_RESOURCES', (HSA_STATUS_ERROR_INVALID_PACKET_FORMAT:=4105): 'HSA_STATUS_ERROR_INVALID_PACKET_FORMAT', (HSA_STATUS_ERROR_RESOURCE_FREE:=4106): 'HSA_STATUS_ERROR_RESOURCE_FREE', (HSA_STATUS_ERROR_NOT_INITIALIZED:=4107): 'HSA_STATUS_ERROR_NOT_INITIALIZED', (HSA_STATUS_ERROR_REFCOUNT_OVERFLOW:=4108): 'HSA_STATUS_ERROR_REFCOUNT_OVERFLOW', (HSA_STATUS_ERROR_INCOMPATIBLE_ARGUMENTS:=4109): 'HSA_STATUS_ERROR_INCOMPATIBLE_ARGUMENTS', (HSA_STATUS_ERROR_INVALID_INDEX:=4110): 'HSA_STATUS_ERROR_INVALID_INDEX', (HSA_STATUS_ERROR_INVALID_ISA:=4111): 'HSA_STATUS_ERROR_INVALID_ISA', (HSA_STATUS_ERROR_INVALID_ISA_NAME:=4119): 'HSA_STATUS_ERROR_INVALID_ISA_NAME', (HSA_STATUS_ERROR_INVALID_CODE_OBJECT:=4112): 'HSA_STATUS_ERROR_INVALID_CODE_OBJECT', (HSA_STATUS_ERROR_INVALID_EXECUTABLE:=4113): 'HSA_STATUS_ERROR_INVALID_EXECUTABLE', (HSA_STATUS_ERROR_FROZEN_EXECUTABLE:=4114): 'HSA_STATUS_ERROR_FROZEN_EXECUTABLE', (HSA_STATUS_ERROR_INVALID_SYMBOL_NAME:=4115): 'HSA_STATUS_ERROR_INVALID_SYMBOL_NAME', (HSA_STATUS_ERROR_VARIABLE_ALREADY_DEFINED:=4116): 'HSA_STATUS_ERROR_VARIABLE_ALREADY_DEFINED', (HSA_STATUS_ERROR_VARIABLE_UNDEFINED:=4117): 'HSA_STATUS_ERROR_VARIABLE_UNDEFINED', (HSA_STATUS_ERROR_EXCEPTION:=4118): 'HSA_STATUS_ERROR_EXCEPTION', (HSA_STATUS_ERROR_INVALID_CODE_SYMBOL:=4120): 'HSA_STATUS_ERROR_INVALID_CODE_SYMBOL', (HSA_STATUS_ERROR_INVALID_EXECUTABLE_SYMBOL:=4121): 'HSA_STATUS_ERROR_INVALID_EXECUTABLE_SYMBOL', (HSA_STATUS_ERROR_INVALID_FILE:=4128): 'HSA_STATUS_ERROR_INVALID_FILE', (HSA_STATUS_ERROR_INVALID_CODE_OBJECT_READER:=4129): 'HSA_STATUS_ERROR_INVALID_CODE_OBJECT_READER', (HSA_STATUS_ERROR_INVALID_CACHE:=4130): 'HSA_STATUS_ERROR_INVALID_CACHE', (HSA_STATUS_ERROR_INVALID_WAVEFRONT:=4131): 'HSA_STATUS_ERROR_INVALID_WAVEFRONT', (HSA_STATUS_ERROR_INVALID_SIGNAL_GROUP:=4132): 'HSA_STATUS_ERROR_INVALID_SIGNAL_GROUP', (HSA_STATUS_ERROR_INVALID_RUNTIME_STATE:=4133): 'HSA_STATUS_ERROR_INVALID_RUNTIME_STATE', (HSA_STATUS_ERROR_FATAL:=4134): 'HSA_STATUS_ERROR_FATAL'} +@c.record +class struct_hsa_dim3_s(c.Struct): + SIZE = 12 + x: int + y: int + z: int +uint32_t: TypeAlias = ctypes.c_uint32 +struct_hsa_dim3_s.register_fields([('x', uint32_t, 0), ('y', uint32_t, 4), ('z', uint32_t, 8)]) +hsa_dim3_t: TypeAlias = struct_hsa_dim3_s +hsa_access_permission_t: dict[int, str] = {(HSA_ACCESS_PERMISSION_NONE:=0): 'HSA_ACCESS_PERMISSION_NONE', (HSA_ACCESS_PERMISSION_RO:=1): 'HSA_ACCESS_PERMISSION_RO', (HSA_ACCESS_PERMISSION_WO:=2): 'HSA_ACCESS_PERMISSION_WO', (HSA_ACCESS_PERMISSION_RW:=3): 'HSA_ACCESS_PERMISSION_RW'} +hsa_file_t: TypeAlias = ctypes.c_int32 +hsa_endianness_t: dict[int, str] = {(HSA_ENDIANNESS_LITTLE:=0): 'HSA_ENDIANNESS_LITTLE', (HSA_ENDIANNESS_BIG:=1): 'HSA_ENDIANNESS_BIG'} +hsa_machine_model_t: dict[int, str] = {(HSA_MACHINE_MODEL_SMALL:=0): 'HSA_MACHINE_MODEL_SMALL', (HSA_MACHINE_MODEL_LARGE:=1): 'HSA_MACHINE_MODEL_LARGE'} +hsa_profile_t: dict[int, str] = {(HSA_PROFILE_BASE:=0): 'HSA_PROFILE_BASE', (HSA_PROFILE_FULL:=1): 'HSA_PROFILE_FULL'} +hsa_system_info_t: dict[int, str] = {(HSA_SYSTEM_INFO_VERSION_MAJOR:=0): 'HSA_SYSTEM_INFO_VERSION_MAJOR', (HSA_SYSTEM_INFO_VERSION_MINOR:=1): 'HSA_SYSTEM_INFO_VERSION_MINOR', (HSA_SYSTEM_INFO_TIMESTAMP:=2): 'HSA_SYSTEM_INFO_TIMESTAMP', (HSA_SYSTEM_INFO_TIMESTAMP_FREQUENCY:=3): 'HSA_SYSTEM_INFO_TIMESTAMP_FREQUENCY', (HSA_SYSTEM_INFO_SIGNAL_MAX_WAIT:=4): 'HSA_SYSTEM_INFO_SIGNAL_MAX_WAIT', (HSA_SYSTEM_INFO_ENDIANNESS:=5): 'HSA_SYSTEM_INFO_ENDIANNESS', (HSA_SYSTEM_INFO_MACHINE_MODEL:=6): 'HSA_SYSTEM_INFO_MACHINE_MODEL', (HSA_SYSTEM_INFO_EXTENSIONS:=7): 'HSA_SYSTEM_INFO_EXTENSIONS', (HSA_AMD_SYSTEM_INFO_BUILD_VERSION:=512): 'HSA_AMD_SYSTEM_INFO_BUILD_VERSION', (HSA_AMD_SYSTEM_INFO_SVM_SUPPORTED:=513): 'HSA_AMD_SYSTEM_INFO_SVM_SUPPORTED', (HSA_AMD_SYSTEM_INFO_SVM_ACCESSIBLE_BY_DEFAULT:=514): 'HSA_AMD_SYSTEM_INFO_SVM_ACCESSIBLE_BY_DEFAULT', (HSA_AMD_SYSTEM_INFO_MWAITX_ENABLED:=515): 'HSA_AMD_SYSTEM_INFO_MWAITX_ENABLED', (HSA_AMD_SYSTEM_INFO_DMABUF_SUPPORTED:=516): 'HSA_AMD_SYSTEM_INFO_DMABUF_SUPPORTED', (HSA_AMD_SYSTEM_INFO_VIRTUAL_MEM_API_SUPPORTED:=517): 'HSA_AMD_SYSTEM_INFO_VIRTUAL_MEM_API_SUPPORTED', (HSA_AMD_SYSTEM_INFO_XNACK_ENABLED:=518): 'HSA_AMD_SYSTEM_INFO_XNACK_ENABLED', (HSA_AMD_SYSTEM_INFO_EXT_VERSION_MAJOR:=519): 'HSA_AMD_SYSTEM_INFO_EXT_VERSION_MAJOR', (HSA_AMD_SYSTEM_INFO_EXT_VERSION_MINOR:=520): 'HSA_AMD_SYSTEM_INFO_EXT_VERSION_MINOR'} +hsa_extension_t: dict[int, str] = {(HSA_EXTENSION_FINALIZER:=0): 'HSA_EXTENSION_FINALIZER', (HSA_EXTENSION_IMAGES:=1): 'HSA_EXTENSION_IMAGES', (HSA_EXTENSION_PERFORMANCE_COUNTERS:=2): 'HSA_EXTENSION_PERFORMANCE_COUNTERS', (HSA_EXTENSION_PROFILING_EVENTS:=3): 'HSA_EXTENSION_PROFILING_EVENTS', (HSA_EXTENSION_STD_LAST:=3): 'HSA_EXTENSION_STD_LAST', (HSA_AMD_FIRST_EXTENSION:=512): 'HSA_AMD_FIRST_EXTENSION', (HSA_EXTENSION_AMD_PROFILER:=512): 'HSA_EXTENSION_AMD_PROFILER', (HSA_EXTENSION_AMD_LOADER:=513): 'HSA_EXTENSION_AMD_LOADER', (HSA_EXTENSION_AMD_AQLPROFILE:=514): 'HSA_EXTENSION_AMD_AQLPROFILE', (HSA_EXTENSION_AMD_PC_SAMPLING:=515): 'HSA_EXTENSION_AMD_PC_SAMPLING', (HSA_AMD_LAST_EXTENSION:=515): 'HSA_AMD_LAST_EXTENSION'} +@c.record +class struct_hsa_agent_s(c.Struct): + SIZE = 8 + handle: int +uint64_t: TypeAlias = ctypes.c_uint64 +struct_hsa_agent_s.register_fields([('handle', uint64_t, 0)]) +hsa_agent_t: TypeAlias = struct_hsa_agent_s +hsa_agent_feature_t: dict[int, str] = {(HSA_AGENT_FEATURE_KERNEL_DISPATCH:=1): 'HSA_AGENT_FEATURE_KERNEL_DISPATCH', (HSA_AGENT_FEATURE_AGENT_DISPATCH:=2): 'HSA_AGENT_FEATURE_AGENT_DISPATCH'} +hsa_device_type_t: dict[int, str] = {(HSA_DEVICE_TYPE_CPU:=0): 'HSA_DEVICE_TYPE_CPU', (HSA_DEVICE_TYPE_GPU:=1): 'HSA_DEVICE_TYPE_GPU', (HSA_DEVICE_TYPE_DSP:=2): 'HSA_DEVICE_TYPE_DSP', (HSA_DEVICE_TYPE_AIE:=3): 'HSA_DEVICE_TYPE_AIE'} +hsa_default_float_rounding_mode_t: dict[int, str] = {(HSA_DEFAULT_FLOAT_ROUNDING_MODE_DEFAULT:=0): 'HSA_DEFAULT_FLOAT_ROUNDING_MODE_DEFAULT', (HSA_DEFAULT_FLOAT_ROUNDING_MODE_ZERO:=1): 'HSA_DEFAULT_FLOAT_ROUNDING_MODE_ZERO', (HSA_DEFAULT_FLOAT_ROUNDING_MODE_NEAR:=2): 'HSA_DEFAULT_FLOAT_ROUNDING_MODE_NEAR'} +hsa_agent_info_t: dict[int, str] = {(HSA_AGENT_INFO_NAME:=0): 'HSA_AGENT_INFO_NAME', (HSA_AGENT_INFO_VENDOR_NAME:=1): 'HSA_AGENT_INFO_VENDOR_NAME', (HSA_AGENT_INFO_FEATURE:=2): 'HSA_AGENT_INFO_FEATURE', (HSA_AGENT_INFO_MACHINE_MODEL:=3): 'HSA_AGENT_INFO_MACHINE_MODEL', (HSA_AGENT_INFO_PROFILE:=4): 'HSA_AGENT_INFO_PROFILE', (HSA_AGENT_INFO_DEFAULT_FLOAT_ROUNDING_MODE:=5): 'HSA_AGENT_INFO_DEFAULT_FLOAT_ROUNDING_MODE', (HSA_AGENT_INFO_BASE_PROFILE_DEFAULT_FLOAT_ROUNDING_MODES:=23): 'HSA_AGENT_INFO_BASE_PROFILE_DEFAULT_FLOAT_ROUNDING_MODES', (HSA_AGENT_INFO_FAST_F16_OPERATION:=24): 'HSA_AGENT_INFO_FAST_F16_OPERATION', (HSA_AGENT_INFO_WAVEFRONT_SIZE:=6): 'HSA_AGENT_INFO_WAVEFRONT_SIZE', (HSA_AGENT_INFO_WORKGROUP_MAX_DIM:=7): 'HSA_AGENT_INFO_WORKGROUP_MAX_DIM', (HSA_AGENT_INFO_WORKGROUP_MAX_SIZE:=8): 'HSA_AGENT_INFO_WORKGROUP_MAX_SIZE', (HSA_AGENT_INFO_GRID_MAX_DIM:=9): 'HSA_AGENT_INFO_GRID_MAX_DIM', (HSA_AGENT_INFO_GRID_MAX_SIZE:=10): 'HSA_AGENT_INFO_GRID_MAX_SIZE', (HSA_AGENT_INFO_FBARRIER_MAX_SIZE:=11): 'HSA_AGENT_INFO_FBARRIER_MAX_SIZE', (HSA_AGENT_INFO_QUEUES_MAX:=12): 'HSA_AGENT_INFO_QUEUES_MAX', (HSA_AGENT_INFO_QUEUE_MIN_SIZE:=13): 'HSA_AGENT_INFO_QUEUE_MIN_SIZE', (HSA_AGENT_INFO_QUEUE_MAX_SIZE:=14): 'HSA_AGENT_INFO_QUEUE_MAX_SIZE', (HSA_AGENT_INFO_QUEUE_TYPE:=15): 'HSA_AGENT_INFO_QUEUE_TYPE', (HSA_AGENT_INFO_NODE:=16): 'HSA_AGENT_INFO_NODE', (HSA_AGENT_INFO_DEVICE:=17): 'HSA_AGENT_INFO_DEVICE', (HSA_AGENT_INFO_CACHE_SIZE:=18): 'HSA_AGENT_INFO_CACHE_SIZE', (HSA_AGENT_INFO_ISA:=19): 'HSA_AGENT_INFO_ISA', (HSA_AGENT_INFO_EXTENSIONS:=20): 'HSA_AGENT_INFO_EXTENSIONS', (HSA_AGENT_INFO_VERSION_MAJOR:=21): 'HSA_AGENT_INFO_VERSION_MAJOR', (HSA_AGENT_INFO_VERSION_MINOR:=22): 'HSA_AGENT_INFO_VERSION_MINOR', (HSA_AGENT_INFO_LAST:=2147483647): 'HSA_AGENT_INFO_LAST'} +hsa_exception_policy_t: dict[int, str] = {(HSA_EXCEPTION_POLICY_BREAK:=1): 'HSA_EXCEPTION_POLICY_BREAK', (HSA_EXCEPTION_POLICY_DETECT:=2): 'HSA_EXCEPTION_POLICY_DETECT'} +@c.record +class struct_hsa_cache_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_cache_s.register_fields([('handle', uint64_t, 0)]) +hsa_cache_t: TypeAlias = struct_hsa_cache_s +hsa_cache_info_t: dict[int, str] = {(HSA_CACHE_INFO_NAME_LENGTH:=0): 'HSA_CACHE_INFO_NAME_LENGTH', (HSA_CACHE_INFO_NAME:=1): 'HSA_CACHE_INFO_NAME', (HSA_CACHE_INFO_LEVEL:=2): 'HSA_CACHE_INFO_LEVEL', (HSA_CACHE_INFO_SIZE:=3): 'HSA_CACHE_INFO_SIZE'} +@c.record +class struct_hsa_signal_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_signal_s.register_fields([('handle', uint64_t, 0)]) +hsa_signal_t: TypeAlias = struct_hsa_signal_s +hsa_signal_value_t: TypeAlias = ctypes.c_int64 +hsa_signal_condition_t: dict[int, str] = {(HSA_SIGNAL_CONDITION_EQ:=0): 'HSA_SIGNAL_CONDITION_EQ', (HSA_SIGNAL_CONDITION_NE:=1): 'HSA_SIGNAL_CONDITION_NE', (HSA_SIGNAL_CONDITION_LT:=2): 'HSA_SIGNAL_CONDITION_LT', (HSA_SIGNAL_CONDITION_GTE:=3): 'HSA_SIGNAL_CONDITION_GTE'} +hsa_wait_state_t: dict[int, str] = {(HSA_WAIT_STATE_BLOCKED:=0): 'HSA_WAIT_STATE_BLOCKED', (HSA_WAIT_STATE_ACTIVE:=1): 'HSA_WAIT_STATE_ACTIVE'} +@c.record +class struct_hsa_signal_group_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_signal_group_s.register_fields([('handle', uint64_t, 0)]) +hsa_signal_group_t: TypeAlias = struct_hsa_signal_group_s +@c.record +class struct_hsa_region_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_region_s.register_fields([('handle', uint64_t, 0)]) +hsa_region_t: TypeAlias = struct_hsa_region_s +hsa_queue_type_t: dict[int, str] = {(HSA_QUEUE_TYPE_MULTI:=0): 'HSA_QUEUE_TYPE_MULTI', (HSA_QUEUE_TYPE_SINGLE:=1): 'HSA_QUEUE_TYPE_SINGLE', (HSA_QUEUE_TYPE_COOPERATIVE:=2): 'HSA_QUEUE_TYPE_COOPERATIVE'} +hsa_queue_type32_t: TypeAlias = ctypes.c_uint32 +hsa_queue_feature_t: dict[int, str] = {(HSA_QUEUE_FEATURE_KERNEL_DISPATCH:=1): 'HSA_QUEUE_FEATURE_KERNEL_DISPATCH', (HSA_QUEUE_FEATURE_AGENT_DISPATCH:=2): 'HSA_QUEUE_FEATURE_AGENT_DISPATCH'} +@c.record +class struct_hsa_queue_s(c.Struct): + SIZE = 40 + type: int + features: int + base_address: ctypes.c_void_p + doorbell_signal: struct_hsa_signal_s + size: int + reserved1: int + id: int +struct_hsa_queue_s.register_fields([('type', hsa_queue_type32_t, 0), ('features', uint32_t, 4), ('base_address', ctypes.c_void_p, 8), ('doorbell_signal', hsa_signal_t, 16), ('size', uint32_t, 24), ('reserved1', uint32_t, 28), ('id', uint64_t, 32)]) +hsa_queue_t: TypeAlias = struct_hsa_queue_s +hsa_packet_type_t: dict[int, str] = {(HSA_PACKET_TYPE_VENDOR_SPECIFIC:=0): 'HSA_PACKET_TYPE_VENDOR_SPECIFIC', (HSA_PACKET_TYPE_INVALID:=1): 'HSA_PACKET_TYPE_INVALID', (HSA_PACKET_TYPE_KERNEL_DISPATCH:=2): 'HSA_PACKET_TYPE_KERNEL_DISPATCH', (HSA_PACKET_TYPE_BARRIER_AND:=3): 'HSA_PACKET_TYPE_BARRIER_AND', (HSA_PACKET_TYPE_AGENT_DISPATCH:=4): 'HSA_PACKET_TYPE_AGENT_DISPATCH', (HSA_PACKET_TYPE_BARRIER_OR:=5): 'HSA_PACKET_TYPE_BARRIER_OR'} +hsa_fence_scope_t: dict[int, str] = {(HSA_FENCE_SCOPE_NONE:=0): 'HSA_FENCE_SCOPE_NONE', (HSA_FENCE_SCOPE_AGENT:=1): 'HSA_FENCE_SCOPE_AGENT', (HSA_FENCE_SCOPE_SYSTEM:=2): 'HSA_FENCE_SCOPE_SYSTEM'} +hsa_packet_header_t: dict[int, str] = {(HSA_PACKET_HEADER_TYPE:=0): 'HSA_PACKET_HEADER_TYPE', (HSA_PACKET_HEADER_BARRIER:=8): 'HSA_PACKET_HEADER_BARRIER', (HSA_PACKET_HEADER_SCACQUIRE_FENCE_SCOPE:=9): 'HSA_PACKET_HEADER_SCACQUIRE_FENCE_SCOPE', (HSA_PACKET_HEADER_ACQUIRE_FENCE_SCOPE:=9): 'HSA_PACKET_HEADER_ACQUIRE_FENCE_SCOPE', (HSA_PACKET_HEADER_SCRELEASE_FENCE_SCOPE:=11): 'HSA_PACKET_HEADER_SCRELEASE_FENCE_SCOPE', (HSA_PACKET_HEADER_RELEASE_FENCE_SCOPE:=11): 'HSA_PACKET_HEADER_RELEASE_FENCE_SCOPE'} +hsa_packet_header_width_t: dict[int, str] = {(HSA_PACKET_HEADER_WIDTH_TYPE:=8): 'HSA_PACKET_HEADER_WIDTH_TYPE', (HSA_PACKET_HEADER_WIDTH_BARRIER:=1): 'HSA_PACKET_HEADER_WIDTH_BARRIER', (HSA_PACKET_HEADER_WIDTH_SCACQUIRE_FENCE_SCOPE:=2): 'HSA_PACKET_HEADER_WIDTH_SCACQUIRE_FENCE_SCOPE', (HSA_PACKET_HEADER_WIDTH_ACQUIRE_FENCE_SCOPE:=2): 'HSA_PACKET_HEADER_WIDTH_ACQUIRE_FENCE_SCOPE', (HSA_PACKET_HEADER_WIDTH_SCRELEASE_FENCE_SCOPE:=2): 'HSA_PACKET_HEADER_WIDTH_SCRELEASE_FENCE_SCOPE', (HSA_PACKET_HEADER_WIDTH_RELEASE_FENCE_SCOPE:=2): 'HSA_PACKET_HEADER_WIDTH_RELEASE_FENCE_SCOPE'} +hsa_kernel_dispatch_packet_setup_t: dict[int, str] = {(HSA_KERNEL_DISPATCH_PACKET_SETUP_DIMENSIONS:=0): 'HSA_KERNEL_DISPATCH_PACKET_SETUP_DIMENSIONS'} +hsa_kernel_dispatch_packet_setup_width_t: dict[int, str] = {(HSA_KERNEL_DISPATCH_PACKET_SETUP_WIDTH_DIMENSIONS:=2): 'HSA_KERNEL_DISPATCH_PACKET_SETUP_WIDTH_DIMENSIONS'} +@c.record +class struct_hsa_kernel_dispatch_packet_s(c.Struct): + SIZE = 64 + header: int + setup: int + full_header: int + workgroup_size_x: int + workgroup_size_y: int + workgroup_size_z: int + reserved0: int + grid_size_x: int + grid_size_y: int + grid_size_z: int + private_segment_size: int + group_segment_size: int + kernel_object: int + kernarg_address: ctypes.c_void_p + reserved2: int + completion_signal: struct_hsa_signal_s +uint16_t: TypeAlias = ctypes.c_uint16 +struct_hsa_kernel_dispatch_packet_s.register_fields([('header', uint16_t, 0), ('setup', uint16_t, 2), ('full_header', uint32_t, 0), ('workgroup_size_x', uint16_t, 4), ('workgroup_size_y', uint16_t, 6), ('workgroup_size_z', uint16_t, 8), ('reserved0', uint16_t, 10), ('grid_size_x', uint32_t, 12), ('grid_size_y', uint32_t, 16), ('grid_size_z', uint32_t, 20), ('private_segment_size', uint32_t, 24), ('group_segment_size', uint32_t, 28), ('kernel_object', uint64_t, 32), ('kernarg_address', ctypes.c_void_p, 40), ('reserved2', uint64_t, 48), ('completion_signal', hsa_signal_t, 56)]) +hsa_kernel_dispatch_packet_t: TypeAlias = struct_hsa_kernel_dispatch_packet_s +@c.record +class struct_hsa_agent_dispatch_packet_s(c.Struct): + SIZE = 64 + header: int + type: int + reserved0: int + return_address: ctypes.c_void_p + arg: c.Array[ctypes.c_uint64, Literal[4]] + reserved2: int + completion_signal: struct_hsa_signal_s +struct_hsa_agent_dispatch_packet_s.register_fields([('header', uint16_t, 0), ('type', uint16_t, 2), ('reserved0', uint32_t, 4), ('return_address', ctypes.c_void_p, 8), ('arg', c.Array[uint64_t, Literal[4]], 16), ('reserved2', uint64_t, 48), ('completion_signal', hsa_signal_t, 56)]) +hsa_agent_dispatch_packet_t: TypeAlias = struct_hsa_agent_dispatch_packet_s +@c.record +class struct_hsa_barrier_and_packet_s(c.Struct): + SIZE = 64 + header: int + reserved0: int + reserved1: int + dep_signal: c.Array[struct_hsa_signal_s, Literal[5]] + reserved2: int + completion_signal: struct_hsa_signal_s +struct_hsa_barrier_and_packet_s.register_fields([('header', uint16_t, 0), ('reserved0', uint16_t, 2), ('reserved1', uint32_t, 4), ('dep_signal', c.Array[hsa_signal_t, Literal[5]], 8), ('reserved2', uint64_t, 48), ('completion_signal', hsa_signal_t, 56)]) +hsa_barrier_and_packet_t: TypeAlias = struct_hsa_barrier_and_packet_s +@c.record +class struct_hsa_barrier_or_packet_s(c.Struct): + SIZE = 64 + header: int + reserved0: int + reserved1: int + dep_signal: c.Array[struct_hsa_signal_s, Literal[5]] + reserved2: int + completion_signal: struct_hsa_signal_s +struct_hsa_barrier_or_packet_s.register_fields([('header', uint16_t, 0), ('reserved0', uint16_t, 2), ('reserved1', uint32_t, 4), ('dep_signal', c.Array[hsa_signal_t, Literal[5]], 8), ('reserved2', uint64_t, 48), ('completion_signal', hsa_signal_t, 56)]) +hsa_barrier_or_packet_t: TypeAlias = struct_hsa_barrier_or_packet_s +hsa_region_segment_t: dict[int, str] = {(HSA_REGION_SEGMENT_GLOBAL:=0): 'HSA_REGION_SEGMENT_GLOBAL', (HSA_REGION_SEGMENT_READONLY:=1): 'HSA_REGION_SEGMENT_READONLY', (HSA_REGION_SEGMENT_PRIVATE:=2): 'HSA_REGION_SEGMENT_PRIVATE', (HSA_REGION_SEGMENT_GROUP:=3): 'HSA_REGION_SEGMENT_GROUP', (HSA_REGION_SEGMENT_KERNARG:=4): 'HSA_REGION_SEGMENT_KERNARG'} +hsa_region_global_flag_t: dict[int, str] = {(HSA_REGION_GLOBAL_FLAG_KERNARG:=1): 'HSA_REGION_GLOBAL_FLAG_KERNARG', (HSA_REGION_GLOBAL_FLAG_FINE_GRAINED:=2): 'HSA_REGION_GLOBAL_FLAG_FINE_GRAINED', (HSA_REGION_GLOBAL_FLAG_COARSE_GRAINED:=4): 'HSA_REGION_GLOBAL_FLAG_COARSE_GRAINED', (HSA_REGION_GLOBAL_FLAG_EXTENDED_SCOPE_FINE_GRAINED:=8): 'HSA_REGION_GLOBAL_FLAG_EXTENDED_SCOPE_FINE_GRAINED'} +hsa_region_info_t: dict[int, str] = {(HSA_REGION_INFO_SEGMENT:=0): 'HSA_REGION_INFO_SEGMENT', (HSA_REGION_INFO_GLOBAL_FLAGS:=1): 'HSA_REGION_INFO_GLOBAL_FLAGS', (HSA_REGION_INFO_SIZE:=2): 'HSA_REGION_INFO_SIZE', (HSA_REGION_INFO_ALLOC_MAX_SIZE:=4): 'HSA_REGION_INFO_ALLOC_MAX_SIZE', (HSA_REGION_INFO_ALLOC_MAX_PRIVATE_WORKGROUP_SIZE:=8): 'HSA_REGION_INFO_ALLOC_MAX_PRIVATE_WORKGROUP_SIZE', (HSA_REGION_INFO_RUNTIME_ALLOC_ALLOWED:=5): 'HSA_REGION_INFO_RUNTIME_ALLOC_ALLOWED', (HSA_REGION_INFO_RUNTIME_ALLOC_GRANULE:=6): 'HSA_REGION_INFO_RUNTIME_ALLOC_GRANULE', (HSA_REGION_INFO_RUNTIME_ALLOC_ALIGNMENT:=7): 'HSA_REGION_INFO_RUNTIME_ALLOC_ALIGNMENT'} +@c.record +class struct_hsa_isa_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_isa_s.register_fields([('handle', uint64_t, 0)]) +hsa_isa_t: TypeAlias = struct_hsa_isa_s +hsa_isa_info_t: dict[int, str] = {(HSA_ISA_INFO_NAME_LENGTH:=0): 'HSA_ISA_INFO_NAME_LENGTH', (HSA_ISA_INFO_NAME:=1): 'HSA_ISA_INFO_NAME', (HSA_ISA_INFO_CALL_CONVENTION_COUNT:=2): 'HSA_ISA_INFO_CALL_CONVENTION_COUNT', (HSA_ISA_INFO_CALL_CONVENTION_INFO_WAVEFRONT_SIZE:=3): 'HSA_ISA_INFO_CALL_CONVENTION_INFO_WAVEFRONT_SIZE', (HSA_ISA_INFO_CALL_CONVENTION_INFO_WAVEFRONTS_PER_COMPUTE_UNIT:=4): 'HSA_ISA_INFO_CALL_CONVENTION_INFO_WAVEFRONTS_PER_COMPUTE_UNIT', (HSA_ISA_INFO_MACHINE_MODELS:=5): 'HSA_ISA_INFO_MACHINE_MODELS', (HSA_ISA_INFO_PROFILES:=6): 'HSA_ISA_INFO_PROFILES', (HSA_ISA_INFO_DEFAULT_FLOAT_ROUNDING_MODES:=7): 'HSA_ISA_INFO_DEFAULT_FLOAT_ROUNDING_MODES', (HSA_ISA_INFO_BASE_PROFILE_DEFAULT_FLOAT_ROUNDING_MODES:=8): 'HSA_ISA_INFO_BASE_PROFILE_DEFAULT_FLOAT_ROUNDING_MODES', (HSA_ISA_INFO_FAST_F16_OPERATION:=9): 'HSA_ISA_INFO_FAST_F16_OPERATION', (HSA_ISA_INFO_WORKGROUP_MAX_DIM:=12): 'HSA_ISA_INFO_WORKGROUP_MAX_DIM', (HSA_ISA_INFO_WORKGROUP_MAX_SIZE:=13): 'HSA_ISA_INFO_WORKGROUP_MAX_SIZE', (HSA_ISA_INFO_GRID_MAX_DIM:=14): 'HSA_ISA_INFO_GRID_MAX_DIM', (HSA_ISA_INFO_GRID_MAX_SIZE:=16): 'HSA_ISA_INFO_GRID_MAX_SIZE', (HSA_ISA_INFO_FBARRIER_MAX_SIZE:=17): 'HSA_ISA_INFO_FBARRIER_MAX_SIZE'} +hsa_fp_type_t: dict[int, str] = {(HSA_FP_TYPE_16:=1): 'HSA_FP_TYPE_16', (HSA_FP_TYPE_32:=2): 'HSA_FP_TYPE_32', (HSA_FP_TYPE_64:=4): 'HSA_FP_TYPE_64'} +hsa_flush_mode_t: dict[int, str] = {(HSA_FLUSH_MODE_FTZ:=1): 'HSA_FLUSH_MODE_FTZ', (HSA_FLUSH_MODE_NON_FTZ:=2): 'HSA_FLUSH_MODE_NON_FTZ'} +hsa_round_method_t: dict[int, str] = {(HSA_ROUND_METHOD_SINGLE:=1): 'HSA_ROUND_METHOD_SINGLE', (HSA_ROUND_METHOD_DOUBLE:=2): 'HSA_ROUND_METHOD_DOUBLE'} +@c.record +class struct_hsa_wavefront_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_wavefront_s.register_fields([('handle', uint64_t, 0)]) +hsa_wavefront_t: TypeAlias = struct_hsa_wavefront_s +hsa_wavefront_info_t: dict[int, str] = {(HSA_WAVEFRONT_INFO_SIZE:=0): 'HSA_WAVEFRONT_INFO_SIZE'} +@c.record +class struct_hsa_code_object_reader_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_code_object_reader_s.register_fields([('handle', uint64_t, 0)]) +hsa_code_object_reader_t: TypeAlias = struct_hsa_code_object_reader_s +@c.record +class struct_hsa_executable_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_executable_s.register_fields([('handle', uint64_t, 0)]) +hsa_executable_t: TypeAlias = struct_hsa_executable_s +hsa_executable_state_t: dict[int, str] = {(HSA_EXECUTABLE_STATE_UNFROZEN:=0): 'HSA_EXECUTABLE_STATE_UNFROZEN', (HSA_EXECUTABLE_STATE_FROZEN:=1): 'HSA_EXECUTABLE_STATE_FROZEN'} +@c.record +class struct_hsa_loaded_code_object_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_loaded_code_object_s.register_fields([('handle', uint64_t, 0)]) +hsa_loaded_code_object_t: TypeAlias = struct_hsa_loaded_code_object_s +hsa_executable_info_t: dict[int, str] = {(HSA_EXECUTABLE_INFO_PROFILE:=1): 'HSA_EXECUTABLE_INFO_PROFILE', (HSA_EXECUTABLE_INFO_STATE:=2): 'HSA_EXECUTABLE_INFO_STATE', (HSA_EXECUTABLE_INFO_DEFAULT_FLOAT_ROUNDING_MODE:=3): 'HSA_EXECUTABLE_INFO_DEFAULT_FLOAT_ROUNDING_MODE'} +@c.record +class struct_hsa_executable_symbol_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_executable_symbol_s.register_fields([('handle', uint64_t, 0)]) +hsa_executable_symbol_t: TypeAlias = struct_hsa_executable_symbol_s +hsa_symbol_kind_t: dict[int, str] = {(HSA_SYMBOL_KIND_VARIABLE:=0): 'HSA_SYMBOL_KIND_VARIABLE', (HSA_SYMBOL_KIND_KERNEL:=1): 'HSA_SYMBOL_KIND_KERNEL', (HSA_SYMBOL_KIND_INDIRECT_FUNCTION:=2): 'HSA_SYMBOL_KIND_INDIRECT_FUNCTION'} +hsa_symbol_linkage_t: dict[int, str] = {(HSA_SYMBOL_LINKAGE_MODULE:=0): 'HSA_SYMBOL_LINKAGE_MODULE', (HSA_SYMBOL_LINKAGE_PROGRAM:=1): 'HSA_SYMBOL_LINKAGE_PROGRAM'} +hsa_variable_allocation_t: dict[int, str] = {(HSA_VARIABLE_ALLOCATION_AGENT:=0): 'HSA_VARIABLE_ALLOCATION_AGENT', (HSA_VARIABLE_ALLOCATION_PROGRAM:=1): 'HSA_VARIABLE_ALLOCATION_PROGRAM'} +hsa_variable_segment_t: dict[int, str] = {(HSA_VARIABLE_SEGMENT_GLOBAL:=0): 'HSA_VARIABLE_SEGMENT_GLOBAL', (HSA_VARIABLE_SEGMENT_READONLY:=1): 'HSA_VARIABLE_SEGMENT_READONLY'} +hsa_executable_symbol_info_t: dict[int, str] = {(HSA_EXECUTABLE_SYMBOL_INFO_TYPE:=0): 'HSA_EXECUTABLE_SYMBOL_INFO_TYPE', (HSA_EXECUTABLE_SYMBOL_INFO_NAME_LENGTH:=1): 'HSA_EXECUTABLE_SYMBOL_INFO_NAME_LENGTH', (HSA_EXECUTABLE_SYMBOL_INFO_NAME:=2): 'HSA_EXECUTABLE_SYMBOL_INFO_NAME', (HSA_EXECUTABLE_SYMBOL_INFO_MODULE_NAME_LENGTH:=3): 'HSA_EXECUTABLE_SYMBOL_INFO_MODULE_NAME_LENGTH', (HSA_EXECUTABLE_SYMBOL_INFO_MODULE_NAME:=4): 'HSA_EXECUTABLE_SYMBOL_INFO_MODULE_NAME', (HSA_EXECUTABLE_SYMBOL_INFO_AGENT:=20): 'HSA_EXECUTABLE_SYMBOL_INFO_AGENT', (HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ADDRESS:=21): 'HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ADDRESS', (HSA_EXECUTABLE_SYMBOL_INFO_LINKAGE:=5): 'HSA_EXECUTABLE_SYMBOL_INFO_LINKAGE', (HSA_EXECUTABLE_SYMBOL_INFO_IS_DEFINITION:=17): 'HSA_EXECUTABLE_SYMBOL_INFO_IS_DEFINITION', (HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ALLOCATION:=6): 'HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ALLOCATION', (HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SEGMENT:=7): 'HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SEGMENT', (HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ALIGNMENT:=8): 'HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ALIGNMENT', (HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SIZE:=9): 'HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_SIZE', (HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_IS_CONST:=10): 'HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_IS_CONST', (HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT:=22): 'HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_OBJECT', (HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE:=11): 'HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE', (HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT:=12): 'HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT', (HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE:=13): 'HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE', (HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE:=14): 'HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE', (HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK:=15): 'HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK', (HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_CALL_CONVENTION:=18): 'HSA_EXECUTABLE_SYMBOL_INFO_KERNEL_CALL_CONVENTION', (HSA_EXECUTABLE_SYMBOL_INFO_INDIRECT_FUNCTION_OBJECT:=23): 'HSA_EXECUTABLE_SYMBOL_INFO_INDIRECT_FUNCTION_OBJECT', (HSA_EXECUTABLE_SYMBOL_INFO_INDIRECT_FUNCTION_CALL_CONVENTION:=16): 'HSA_EXECUTABLE_SYMBOL_INFO_INDIRECT_FUNCTION_CALL_CONVENTION'} +@c.record +class struct_hsa_code_object_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_code_object_s.register_fields([('handle', uint64_t, 0)]) +hsa_code_object_t: TypeAlias = struct_hsa_code_object_s +@c.record +class struct_hsa_callback_data_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_callback_data_s.register_fields([('handle', uint64_t, 0)]) +hsa_callback_data_t: TypeAlias = struct_hsa_callback_data_s +hsa_code_object_type_t: dict[int, str] = {(HSA_CODE_OBJECT_TYPE_PROGRAM:=0): 'HSA_CODE_OBJECT_TYPE_PROGRAM'} +hsa_code_object_info_t: dict[int, str] = {(HSA_CODE_OBJECT_INFO_VERSION:=0): 'HSA_CODE_OBJECT_INFO_VERSION', (HSA_CODE_OBJECT_INFO_TYPE:=1): 'HSA_CODE_OBJECT_INFO_TYPE', (HSA_CODE_OBJECT_INFO_ISA:=2): 'HSA_CODE_OBJECT_INFO_ISA', (HSA_CODE_OBJECT_INFO_MACHINE_MODEL:=3): 'HSA_CODE_OBJECT_INFO_MACHINE_MODEL', (HSA_CODE_OBJECT_INFO_PROFILE:=4): 'HSA_CODE_OBJECT_INFO_PROFILE', (HSA_CODE_OBJECT_INFO_DEFAULT_FLOAT_ROUNDING_MODE:=5): 'HSA_CODE_OBJECT_INFO_DEFAULT_FLOAT_ROUNDING_MODE'} +@c.record +class struct_hsa_code_symbol_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_code_symbol_s.register_fields([('handle', uint64_t, 0)]) +hsa_code_symbol_t: TypeAlias = struct_hsa_code_symbol_s +hsa_code_symbol_info_t: dict[int, str] = {(HSA_CODE_SYMBOL_INFO_TYPE:=0): 'HSA_CODE_SYMBOL_INFO_TYPE', (HSA_CODE_SYMBOL_INFO_NAME_LENGTH:=1): 'HSA_CODE_SYMBOL_INFO_NAME_LENGTH', (HSA_CODE_SYMBOL_INFO_NAME:=2): 'HSA_CODE_SYMBOL_INFO_NAME', (HSA_CODE_SYMBOL_INFO_MODULE_NAME_LENGTH:=3): 'HSA_CODE_SYMBOL_INFO_MODULE_NAME_LENGTH', (HSA_CODE_SYMBOL_INFO_MODULE_NAME:=4): 'HSA_CODE_SYMBOL_INFO_MODULE_NAME', (HSA_CODE_SYMBOL_INFO_LINKAGE:=5): 'HSA_CODE_SYMBOL_INFO_LINKAGE', (HSA_CODE_SYMBOL_INFO_IS_DEFINITION:=17): 'HSA_CODE_SYMBOL_INFO_IS_DEFINITION', (HSA_CODE_SYMBOL_INFO_VARIABLE_ALLOCATION:=6): 'HSA_CODE_SYMBOL_INFO_VARIABLE_ALLOCATION', (HSA_CODE_SYMBOL_INFO_VARIABLE_SEGMENT:=7): 'HSA_CODE_SYMBOL_INFO_VARIABLE_SEGMENT', (HSA_CODE_SYMBOL_INFO_VARIABLE_ALIGNMENT:=8): 'HSA_CODE_SYMBOL_INFO_VARIABLE_ALIGNMENT', (HSA_CODE_SYMBOL_INFO_VARIABLE_SIZE:=9): 'HSA_CODE_SYMBOL_INFO_VARIABLE_SIZE', (HSA_CODE_SYMBOL_INFO_VARIABLE_IS_CONST:=10): 'HSA_CODE_SYMBOL_INFO_VARIABLE_IS_CONST', (HSA_CODE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE:=11): 'HSA_CODE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_SIZE', (HSA_CODE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT:=12): 'HSA_CODE_SYMBOL_INFO_KERNEL_KERNARG_SEGMENT_ALIGNMENT', (HSA_CODE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE:=13): 'HSA_CODE_SYMBOL_INFO_KERNEL_GROUP_SEGMENT_SIZE', (HSA_CODE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE:=14): 'HSA_CODE_SYMBOL_INFO_KERNEL_PRIVATE_SEGMENT_SIZE', (HSA_CODE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK:=15): 'HSA_CODE_SYMBOL_INFO_KERNEL_DYNAMIC_CALLSTACK', (HSA_CODE_SYMBOL_INFO_KERNEL_CALL_CONVENTION:=18): 'HSA_CODE_SYMBOL_INFO_KERNEL_CALL_CONVENTION', (HSA_CODE_SYMBOL_INFO_INDIRECT_FUNCTION_CALL_CONVENTION:=16): 'HSA_CODE_SYMBOL_INFO_INDIRECT_FUNCTION_CALL_CONVENTION', (HSA_CODE_SYMBOL_INFO_KERNEL_WAVEFRONT_SIZE:=19): 'HSA_CODE_SYMBOL_INFO_KERNEL_WAVEFRONT_SIZE'} +hsa_signal_condition32_t: TypeAlias = ctypes.c_uint32 +hsa_amd_packet_type_t: dict[int, str] = {(HSA_AMD_PACKET_TYPE_BARRIER_VALUE:=2): 'HSA_AMD_PACKET_TYPE_BARRIER_VALUE', (HSA_AMD_PACKET_TYPE_AIE_ERT:=3): 'HSA_AMD_PACKET_TYPE_AIE_ERT'} +hsa_amd_packet_type8_t: TypeAlias = ctypes.c_ubyte +@c.record +class struct_hsa_amd_packet_header_s(c.Struct): + SIZE = 4 + header: int + AmdFormat: int + reserved: int +uint8_t: TypeAlias = ctypes.c_ubyte +struct_hsa_amd_packet_header_s.register_fields([('header', uint16_t, 0), ('AmdFormat', hsa_amd_packet_type8_t, 2), ('reserved', uint8_t, 3)]) +hsa_amd_vendor_packet_header_t: TypeAlias = struct_hsa_amd_packet_header_s +@c.record +class struct_hsa_amd_barrier_value_packet_s(c.Struct): + SIZE = 64 + header: struct_hsa_amd_packet_header_s + reserved0: int + signal: struct_hsa_signal_s + value: int + mask: int + cond: int + reserved1: int + reserved2: int + reserved3: int + completion_signal: struct_hsa_signal_s +struct_hsa_amd_barrier_value_packet_s.register_fields([('header', hsa_amd_vendor_packet_header_t, 0), ('reserved0', uint32_t, 4), ('signal', hsa_signal_t, 8), ('value', hsa_signal_value_t, 16), ('mask', hsa_signal_value_t, 24), ('cond', hsa_signal_condition32_t, 32), ('reserved1', uint32_t, 36), ('reserved2', uint64_t, 40), ('reserved3', uint64_t, 48), ('completion_signal', hsa_signal_t, 56)]) +hsa_amd_barrier_value_packet_t: TypeAlias = struct_hsa_amd_barrier_value_packet_s +hsa_amd_aie_ert_state: dict[int, str] = {(HSA_AMD_AIE_ERT_STATE_NEW:=1): 'HSA_AMD_AIE_ERT_STATE_NEW', (HSA_AMD_AIE_ERT_STATE_QUEUED:=2): 'HSA_AMD_AIE_ERT_STATE_QUEUED', (HSA_AMD_AIE_ERT_STATE_RUNNING:=3): 'HSA_AMD_AIE_ERT_STATE_RUNNING', (HSA_AMD_AIE_ERT_STATE_COMPLETED:=4): 'HSA_AMD_AIE_ERT_STATE_COMPLETED', (HSA_AMD_AIE_ERT_STATE_ERROR:=5): 'HSA_AMD_AIE_ERT_STATE_ERROR', (HSA_AMD_AIE_ERT_STATE_ABORT:=6): 'HSA_AMD_AIE_ERT_STATE_ABORT', (HSA_AMD_AIE_ERT_STATE_SUBMITTED:=7): 'HSA_AMD_AIE_ERT_STATE_SUBMITTED', (HSA_AMD_AIE_ERT_STATE_TIMEOUT:=8): 'HSA_AMD_AIE_ERT_STATE_TIMEOUT', (HSA_AMD_AIE_ERT_STATE_NORESPONSE:=9): 'HSA_AMD_AIE_ERT_STATE_NORESPONSE', (HSA_AMD_AIE_ERT_STATE_SKERROR:=10): 'HSA_AMD_AIE_ERT_STATE_SKERROR', (HSA_AMD_AIE_ERT_STATE_SKCRASHED:=11): 'HSA_AMD_AIE_ERT_STATE_SKCRASHED', (HSA_AMD_AIE_ERT_STATE_MAX:=12): 'HSA_AMD_AIE_ERT_STATE_MAX'} +hsa_amd_aie_ert_cmd_opcode_t: dict[int, str] = {(HSA_AMD_AIE_ERT_START_CU:=0): 'HSA_AMD_AIE_ERT_START_CU', (HSA_AMD_AIE_ERT_START_KERNEL:=0): 'HSA_AMD_AIE_ERT_START_KERNEL', (HSA_AMD_AIE_ERT_CONFIGURE:=2): 'HSA_AMD_AIE_ERT_CONFIGURE', (HSA_AMD_AIE_ERT_EXIT:=3): 'HSA_AMD_AIE_ERT_EXIT', (HSA_AMD_AIE_ERT_ABORT:=4): 'HSA_AMD_AIE_ERT_ABORT', (HSA_AMD_AIE_ERT_EXEC_WRITE:=5): 'HSA_AMD_AIE_ERT_EXEC_WRITE', (HSA_AMD_AIE_ERT_CU_STAT:=6): 'HSA_AMD_AIE_ERT_CU_STAT', (HSA_AMD_AIE_ERT_START_COPYBO:=7): 'HSA_AMD_AIE_ERT_START_COPYBO', (HSA_AMD_AIE_ERT_SK_CONFIG:=8): 'HSA_AMD_AIE_ERT_SK_CONFIG', (HSA_AMD_AIE_ERT_SK_START:=9): 'HSA_AMD_AIE_ERT_SK_START', (HSA_AMD_AIE_ERT_SK_UNCONFIG:=10): 'HSA_AMD_AIE_ERT_SK_UNCONFIG', (HSA_AMD_AIE_ERT_INIT_CU:=11): 'HSA_AMD_AIE_ERT_INIT_CU', (HSA_AMD_AIE_ERT_START_FA:=12): 'HSA_AMD_AIE_ERT_START_FA', (HSA_AMD_AIE_ERT_CLK_CALIB:=13): 'HSA_AMD_AIE_ERT_CLK_CALIB', (HSA_AMD_AIE_ERT_MB_VALIDATE:=14): 'HSA_AMD_AIE_ERT_MB_VALIDATE', (HSA_AMD_AIE_ERT_START_KEY_VAL:=15): 'HSA_AMD_AIE_ERT_START_KEY_VAL', (HSA_AMD_AIE_ERT_ACCESS_TEST_C:=16): 'HSA_AMD_AIE_ERT_ACCESS_TEST_C', (HSA_AMD_AIE_ERT_ACCESS_TEST:=17): 'HSA_AMD_AIE_ERT_ACCESS_TEST', (HSA_AMD_AIE_ERT_START_DPU:=18): 'HSA_AMD_AIE_ERT_START_DPU', (HSA_AMD_AIE_ERT_CMD_CHAIN:=19): 'HSA_AMD_AIE_ERT_CMD_CHAIN', (HSA_AMD_AIE_ERT_START_NPU:=20): 'HSA_AMD_AIE_ERT_START_NPU', (HSA_AMD_AIE_ERT_START_NPU_PREEMPT:=21): 'HSA_AMD_AIE_ERT_START_NPU_PREEMPT'} +@c.record +class struct_hsa_amd_aie_ert_start_kernel_data_s(c.Struct): + SIZE = 8 + pdi_addr: ctypes.c_void_p + data: c.Array[ctypes.c_uint32, Literal[0]] +struct_hsa_amd_aie_ert_start_kernel_data_s.register_fields([('pdi_addr', ctypes.c_void_p, 0), ('data', c.Array[uint32_t, Literal[0]], 8)]) +hsa_amd_aie_ert_start_kernel_data_t: TypeAlias = struct_hsa_amd_aie_ert_start_kernel_data_s +@c.record +class struct_hsa_amd_aie_ert_packet_s(c.Struct): + SIZE = 64 + header: struct_hsa_amd_packet_header_s + state: int + custom: int + count: int + opcode: int + type: int + reserved0: int + reserved1: int + reserved2: int + reserved3: int + reserved4: int + reserved5: int + payload_data: int +struct_hsa_amd_aie_ert_packet_s.register_fields([('header', hsa_amd_vendor_packet_header_t, 0), ('state', uint32_t, 4, 4, 0), ('custom', uint32_t, 4, 8, 4), ('count', uint32_t, 5, 11, 4), ('opcode', uint32_t, 6, 5, 7), ('type', uint32_t, 7, 4, 4), ('reserved0', uint64_t, 8), ('reserved1', uint64_t, 16), ('reserved2', uint64_t, 24), ('reserved3', uint64_t, 32), ('reserved4', uint64_t, 40), ('reserved5', uint64_t, 48), ('payload_data', uint64_t, 56)]) +hsa_amd_aie_ert_packet_t: TypeAlias = struct_hsa_amd_aie_ert_packet_s +_anonenum0: dict[int, str] = {(HSA_STATUS_ERROR_INVALID_MEMORY_POOL:=40): 'HSA_STATUS_ERROR_INVALID_MEMORY_POOL', (HSA_STATUS_ERROR_MEMORY_APERTURE_VIOLATION:=41): 'HSA_STATUS_ERROR_MEMORY_APERTURE_VIOLATION', (HSA_STATUS_ERROR_ILLEGAL_INSTRUCTION:=42): 'HSA_STATUS_ERROR_ILLEGAL_INSTRUCTION', (HSA_STATUS_ERROR_MEMORY_FAULT:=43): 'HSA_STATUS_ERROR_MEMORY_FAULT', (HSA_STATUS_CU_MASK_REDUCED:=44): 'HSA_STATUS_CU_MASK_REDUCED', (HSA_STATUS_ERROR_OUT_OF_REGISTERS:=45): 'HSA_STATUS_ERROR_OUT_OF_REGISTERS', (HSA_STATUS_ERROR_RESOURCE_BUSY:=46): 'HSA_STATUS_ERROR_RESOURCE_BUSY', (HSA_STATUS_ERROR_NOT_SUPPORTED:=47): 'HSA_STATUS_ERROR_NOT_SUPPORTED'} +hsa_amd_iommu_version_t: dict[int, str] = {(HSA_IOMMU_SUPPORT_NONE:=0): 'HSA_IOMMU_SUPPORT_NONE', (HSA_IOMMU_SUPPORT_V2:=1): 'HSA_IOMMU_SUPPORT_V2'} +@c.record +class struct_hsa_amd_clock_counters_s(c.Struct): + SIZE = 32 + gpu_clock_counter: int + cpu_clock_counter: int + system_clock_counter: int + system_clock_frequency: int +struct_hsa_amd_clock_counters_s.register_fields([('gpu_clock_counter', uint64_t, 0), ('cpu_clock_counter', uint64_t, 8), ('system_clock_counter', uint64_t, 16), ('system_clock_frequency', uint64_t, 24)]) +hsa_amd_clock_counters_t: TypeAlias = struct_hsa_amd_clock_counters_s +enum_hsa_amd_agent_info_s: dict[int, str] = {(HSA_AMD_AGENT_INFO_CHIP_ID:=40960): 'HSA_AMD_AGENT_INFO_CHIP_ID', (HSA_AMD_AGENT_INFO_CACHELINE_SIZE:=40961): 'HSA_AMD_AGENT_INFO_CACHELINE_SIZE', (HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT:=40962): 'HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT', (HSA_AMD_AGENT_INFO_MAX_CLOCK_FREQUENCY:=40963): 'HSA_AMD_AGENT_INFO_MAX_CLOCK_FREQUENCY', (HSA_AMD_AGENT_INFO_DRIVER_NODE_ID:=40964): 'HSA_AMD_AGENT_INFO_DRIVER_NODE_ID', (HSA_AMD_AGENT_INFO_MAX_ADDRESS_WATCH_POINTS:=40965): 'HSA_AMD_AGENT_INFO_MAX_ADDRESS_WATCH_POINTS', (HSA_AMD_AGENT_INFO_BDFID:=40966): 'HSA_AMD_AGENT_INFO_BDFID', (HSA_AMD_AGENT_INFO_MEMORY_WIDTH:=40967): 'HSA_AMD_AGENT_INFO_MEMORY_WIDTH', (HSA_AMD_AGENT_INFO_MEMORY_MAX_FREQUENCY:=40968): 'HSA_AMD_AGENT_INFO_MEMORY_MAX_FREQUENCY', (HSA_AMD_AGENT_INFO_PRODUCT_NAME:=40969): 'HSA_AMD_AGENT_INFO_PRODUCT_NAME', (HSA_AMD_AGENT_INFO_MAX_WAVES_PER_CU:=40970): 'HSA_AMD_AGENT_INFO_MAX_WAVES_PER_CU', (HSA_AMD_AGENT_INFO_NUM_SIMDS_PER_CU:=40971): 'HSA_AMD_AGENT_INFO_NUM_SIMDS_PER_CU', (HSA_AMD_AGENT_INFO_NUM_SHADER_ENGINES:=40972): 'HSA_AMD_AGENT_INFO_NUM_SHADER_ENGINES', (HSA_AMD_AGENT_INFO_NUM_SHADER_ARRAYS_PER_SE:=40973): 'HSA_AMD_AGENT_INFO_NUM_SHADER_ARRAYS_PER_SE', (HSA_AMD_AGENT_INFO_HDP_FLUSH:=40974): 'HSA_AMD_AGENT_INFO_HDP_FLUSH', (HSA_AMD_AGENT_INFO_DOMAIN:=40975): 'HSA_AMD_AGENT_INFO_DOMAIN', (HSA_AMD_AGENT_INFO_COOPERATIVE_QUEUES:=40976): 'HSA_AMD_AGENT_INFO_COOPERATIVE_QUEUES', (HSA_AMD_AGENT_INFO_UUID:=40977): 'HSA_AMD_AGENT_INFO_UUID', (HSA_AMD_AGENT_INFO_ASIC_REVISION:=40978): 'HSA_AMD_AGENT_INFO_ASIC_REVISION', (HSA_AMD_AGENT_INFO_SVM_DIRECT_HOST_ACCESS:=40979): 'HSA_AMD_AGENT_INFO_SVM_DIRECT_HOST_ACCESS', (HSA_AMD_AGENT_INFO_COOPERATIVE_COMPUTE_UNIT_COUNT:=40980): 'HSA_AMD_AGENT_INFO_COOPERATIVE_COMPUTE_UNIT_COUNT', (HSA_AMD_AGENT_INFO_MEMORY_AVAIL:=40981): 'HSA_AMD_AGENT_INFO_MEMORY_AVAIL', (HSA_AMD_AGENT_INFO_TIMESTAMP_FREQUENCY:=40982): 'HSA_AMD_AGENT_INFO_TIMESTAMP_FREQUENCY', (HSA_AMD_AGENT_INFO_ASIC_FAMILY_ID:=41223): 'HSA_AMD_AGENT_INFO_ASIC_FAMILY_ID', (HSA_AMD_AGENT_INFO_UCODE_VERSION:=41224): 'HSA_AMD_AGENT_INFO_UCODE_VERSION', (HSA_AMD_AGENT_INFO_SDMA_UCODE_VERSION:=41225): 'HSA_AMD_AGENT_INFO_SDMA_UCODE_VERSION', (HSA_AMD_AGENT_INFO_NUM_SDMA_ENG:=41226): 'HSA_AMD_AGENT_INFO_NUM_SDMA_ENG', (HSA_AMD_AGENT_INFO_NUM_SDMA_XGMI_ENG:=41227): 'HSA_AMD_AGENT_INFO_NUM_SDMA_XGMI_ENG', (HSA_AMD_AGENT_INFO_IOMMU_SUPPORT:=41232): 'HSA_AMD_AGENT_INFO_IOMMU_SUPPORT', (HSA_AMD_AGENT_INFO_NUM_XCC:=41233): 'HSA_AMD_AGENT_INFO_NUM_XCC', (HSA_AMD_AGENT_INFO_DRIVER_UID:=41234): 'HSA_AMD_AGENT_INFO_DRIVER_UID', (HSA_AMD_AGENT_INFO_NEAREST_CPU:=41235): 'HSA_AMD_AGENT_INFO_NEAREST_CPU', (HSA_AMD_AGENT_INFO_MEMORY_PROPERTIES:=41236): 'HSA_AMD_AGENT_INFO_MEMORY_PROPERTIES', (HSA_AMD_AGENT_INFO_AQL_EXTENSIONS:=41237): 'HSA_AMD_AGENT_INFO_AQL_EXTENSIONS', (HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_MAX:=41238): 'HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_MAX', (HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_CURRENT:=41239): 'HSA_AMD_AGENT_INFO_SCRATCH_LIMIT_CURRENT', (HSA_AMD_AGENT_INFO_CLOCK_COUNTERS:=41240): 'HSA_AMD_AGENT_INFO_CLOCK_COUNTERS'} +hsa_amd_agent_info_t: TypeAlias = ctypes.c_uint32 +enum_hsa_amd_agent_memory_properties_s: dict[int, str] = {(HSA_AMD_MEMORY_PROPERTY_AGENT_IS_APU:=1): 'HSA_AMD_MEMORY_PROPERTY_AGENT_IS_APU'} +hsa_amd_agent_memory_properties_t: TypeAlias = ctypes.c_uint32 +enum_hsa_amd_sdma_engine_id: dict[int, str] = {(HSA_AMD_SDMA_ENGINE_0:=1): 'HSA_AMD_SDMA_ENGINE_0', (HSA_AMD_SDMA_ENGINE_1:=2): 'HSA_AMD_SDMA_ENGINE_1', (HSA_AMD_SDMA_ENGINE_2:=4): 'HSA_AMD_SDMA_ENGINE_2', (HSA_AMD_SDMA_ENGINE_3:=8): 'HSA_AMD_SDMA_ENGINE_3', (HSA_AMD_SDMA_ENGINE_4:=16): 'HSA_AMD_SDMA_ENGINE_4', (HSA_AMD_SDMA_ENGINE_5:=32): 'HSA_AMD_SDMA_ENGINE_5', (HSA_AMD_SDMA_ENGINE_6:=64): 'HSA_AMD_SDMA_ENGINE_6', (HSA_AMD_SDMA_ENGINE_7:=128): 'HSA_AMD_SDMA_ENGINE_7', (HSA_AMD_SDMA_ENGINE_8:=256): 'HSA_AMD_SDMA_ENGINE_8', (HSA_AMD_SDMA_ENGINE_9:=512): 'HSA_AMD_SDMA_ENGINE_9', (HSA_AMD_SDMA_ENGINE_10:=1024): 'HSA_AMD_SDMA_ENGINE_10', (HSA_AMD_SDMA_ENGINE_11:=2048): 'HSA_AMD_SDMA_ENGINE_11', (HSA_AMD_SDMA_ENGINE_12:=4096): 'HSA_AMD_SDMA_ENGINE_12', (HSA_AMD_SDMA_ENGINE_13:=8192): 'HSA_AMD_SDMA_ENGINE_13', (HSA_AMD_SDMA_ENGINE_14:=16384): 'HSA_AMD_SDMA_ENGINE_14', (HSA_AMD_SDMA_ENGINE_15:=32768): 'HSA_AMD_SDMA_ENGINE_15'} +hsa_amd_sdma_engine_id_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_hsa_amd_hdp_flush_s(c.Struct): + SIZE = 16 + HDP_MEM_FLUSH_CNTL: c.POINTER[ctypes.c_uint32] + HDP_REG_FLUSH_CNTL: c.POINTER[ctypes.c_uint32] +struct_hsa_amd_hdp_flush_s.register_fields([('HDP_MEM_FLUSH_CNTL', c.POINTER[uint32_t], 0), ('HDP_REG_FLUSH_CNTL', c.POINTER[uint32_t], 8)]) +hsa_amd_hdp_flush_t: TypeAlias = struct_hsa_amd_hdp_flush_s +enum_hsa_amd_region_info_s: dict[int, str] = {(HSA_AMD_REGION_INFO_HOST_ACCESSIBLE:=40960): 'HSA_AMD_REGION_INFO_HOST_ACCESSIBLE', (HSA_AMD_REGION_INFO_BASE:=40961): 'HSA_AMD_REGION_INFO_BASE', (HSA_AMD_REGION_INFO_BUS_WIDTH:=40962): 'HSA_AMD_REGION_INFO_BUS_WIDTH', (HSA_AMD_REGION_INFO_MAX_CLOCK_FREQUENCY:=40963): 'HSA_AMD_REGION_INFO_MAX_CLOCK_FREQUENCY'} +hsa_amd_region_info_t: TypeAlias = ctypes.c_uint32 +enum_hsa_amd_coherency_type_s: dict[int, str] = {(HSA_AMD_COHERENCY_TYPE_COHERENT:=0): 'HSA_AMD_COHERENCY_TYPE_COHERENT', (HSA_AMD_COHERENCY_TYPE_NONCOHERENT:=1): 'HSA_AMD_COHERENCY_TYPE_NONCOHERENT'} +hsa_amd_coherency_type_t: TypeAlias = ctypes.c_uint32 +enum_hsa_amd_dma_buf_mapping_type_s: dict[int, str] = {(HSA_AMD_DMABUF_MAPPING_TYPE_NONE:=0): 'HSA_AMD_DMABUF_MAPPING_TYPE_NONE', (HSA_AMD_DMABUF_MAPPING_TYPE_PCIE:=1): 'HSA_AMD_DMABUF_MAPPING_TYPE_PCIE'} +hsa_amd_dma_buf_mapping_type_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_hsa_amd_profiling_dispatch_time_s(c.Struct): + SIZE = 16 + start: int + end: int +struct_hsa_amd_profiling_dispatch_time_s.register_fields([('start', uint64_t, 0), ('end', uint64_t, 8)]) +hsa_amd_profiling_dispatch_time_t: TypeAlias = struct_hsa_amd_profiling_dispatch_time_s +@c.record +class struct_hsa_amd_profiling_async_copy_time_s(c.Struct): + SIZE = 16 + start: int + end: int +struct_hsa_amd_profiling_async_copy_time_s.register_fields([('start', uint64_t, 0), ('end', uint64_t, 8)]) +hsa_amd_profiling_async_copy_time_t: TypeAlias = struct_hsa_amd_profiling_async_copy_time_s +hsa_amd_signal_attribute_t: dict[int, str] = {(HSA_AMD_SIGNAL_AMD_GPU_ONLY:=1): 'HSA_AMD_SIGNAL_AMD_GPU_ONLY', (HSA_AMD_SIGNAL_IPC:=2): 'HSA_AMD_SIGNAL_IPC'} +hsa_amd_signal_handler: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [ctypes.c_int64, ctypes.c_void_p]] +@c.record +class struct_hsa_amd_image_descriptor_s(c.Struct): + SIZE = 12 + version: int + deviceID: int + data: c.Array[ctypes.c_uint32, Literal[1]] +struct_hsa_amd_image_descriptor_s.register_fields([('version', uint32_t, 0), ('deviceID', uint32_t, 4), ('data', c.Array[uint32_t, Literal[1]], 8)]) +hsa_amd_image_descriptor_t: TypeAlias = struct_hsa_amd_image_descriptor_s +hsa_amd_segment_t: dict[int, str] = {(HSA_AMD_SEGMENT_GLOBAL:=0): 'HSA_AMD_SEGMENT_GLOBAL', (HSA_AMD_SEGMENT_READONLY:=1): 'HSA_AMD_SEGMENT_READONLY', (HSA_AMD_SEGMENT_PRIVATE:=2): 'HSA_AMD_SEGMENT_PRIVATE', (HSA_AMD_SEGMENT_GROUP:=3): 'HSA_AMD_SEGMENT_GROUP'} +@c.record +class struct_hsa_amd_memory_pool_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_amd_memory_pool_s.register_fields([('handle', uint64_t, 0)]) +hsa_amd_memory_pool_t: TypeAlias = struct_hsa_amd_memory_pool_s +enum_hsa_amd_memory_pool_global_flag_s: dict[int, str] = {(HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT:=1): 'HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT', (HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_FINE_GRAINED:=2): 'HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_FINE_GRAINED', (HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_COARSE_GRAINED:=4): 'HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_COARSE_GRAINED', (HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_EXTENDED_SCOPE_FINE_GRAINED:=8): 'HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_EXTENDED_SCOPE_FINE_GRAINED'} +hsa_amd_memory_pool_global_flag_t: TypeAlias = ctypes.c_uint32 +enum_hsa_amd_memory_pool_location_s: dict[int, str] = {(HSA_AMD_MEMORY_POOL_LOCATION_CPU:=0): 'HSA_AMD_MEMORY_POOL_LOCATION_CPU', (HSA_AMD_MEMORY_POOL_LOCATION_GPU:=1): 'HSA_AMD_MEMORY_POOL_LOCATION_GPU'} +hsa_amd_memory_pool_location_t: TypeAlias = ctypes.c_uint32 +hsa_amd_memory_pool_info_t: dict[int, str] = {(HSA_AMD_MEMORY_POOL_INFO_SEGMENT:=0): 'HSA_AMD_MEMORY_POOL_INFO_SEGMENT', (HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS:=1): 'HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS', (HSA_AMD_MEMORY_POOL_INFO_SIZE:=2): 'HSA_AMD_MEMORY_POOL_INFO_SIZE', (HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALLOWED:=5): 'HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALLOWED', (HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE:=6): 'HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_GRANULE', (HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALIGNMENT:=7): 'HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALIGNMENT', (HSA_AMD_MEMORY_POOL_INFO_ACCESSIBLE_BY_ALL:=15): 'HSA_AMD_MEMORY_POOL_INFO_ACCESSIBLE_BY_ALL', (HSA_AMD_MEMORY_POOL_INFO_ALLOC_MAX_SIZE:=16): 'HSA_AMD_MEMORY_POOL_INFO_ALLOC_MAX_SIZE', (HSA_AMD_MEMORY_POOL_INFO_LOCATION:=17): 'HSA_AMD_MEMORY_POOL_INFO_LOCATION', (HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_REC_GRANULE:=18): 'HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_REC_GRANULE'} +enum_hsa_amd_memory_pool_flag_s: dict[int, str] = {(HSA_AMD_MEMORY_POOL_STANDARD_FLAG:=0): 'HSA_AMD_MEMORY_POOL_STANDARD_FLAG', (HSA_AMD_MEMORY_POOL_PCIE_FLAG:=1): 'HSA_AMD_MEMORY_POOL_PCIE_FLAG', (HSA_AMD_MEMORY_POOL_CONTIGUOUS_FLAG:=2): 'HSA_AMD_MEMORY_POOL_CONTIGUOUS_FLAG', (HSA_AMD_MEMORY_POOL_EXECUTABLE_FLAG:=4): 'HSA_AMD_MEMORY_POOL_EXECUTABLE_FLAG', (HSA_AMD_MEMORY_POOL_UNCACHED_FLAG:=8): 'HSA_AMD_MEMORY_POOL_UNCACHED_FLAG'} +hsa_amd_memory_pool_flag_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_hsa_pitched_ptr_s(c.Struct): + SIZE = 24 + base: ctypes.c_void_p + pitch: int + slice: int +size_t: TypeAlias = ctypes.c_uint64 +struct_hsa_pitched_ptr_s.register_fields([('base', ctypes.c_void_p, 0), ('pitch', size_t, 8), ('slice', size_t, 16)]) +hsa_pitched_ptr_t: TypeAlias = struct_hsa_pitched_ptr_s +hsa_amd_copy_direction_t: dict[int, str] = {(hsaHostToHost:=0): 'hsaHostToHost', (hsaHostToDevice:=1): 'hsaHostToDevice', (hsaDeviceToHost:=2): 'hsaDeviceToHost', (hsaDeviceToDevice:=3): 'hsaDeviceToDevice'} +hsa_amd_memory_pool_access_t: dict[int, str] = {(HSA_AMD_MEMORY_POOL_ACCESS_NEVER_ALLOWED:=0): 'HSA_AMD_MEMORY_POOL_ACCESS_NEVER_ALLOWED', (HSA_AMD_MEMORY_POOL_ACCESS_ALLOWED_BY_DEFAULT:=1): 'HSA_AMD_MEMORY_POOL_ACCESS_ALLOWED_BY_DEFAULT', (HSA_AMD_MEMORY_POOL_ACCESS_DISALLOWED_BY_DEFAULT:=2): 'HSA_AMD_MEMORY_POOL_ACCESS_DISALLOWED_BY_DEFAULT'} +hsa_amd_link_info_type_t: dict[int, str] = {(HSA_AMD_LINK_INFO_TYPE_HYPERTRANSPORT:=0): 'HSA_AMD_LINK_INFO_TYPE_HYPERTRANSPORT', (HSA_AMD_LINK_INFO_TYPE_QPI:=1): 'HSA_AMD_LINK_INFO_TYPE_QPI', (HSA_AMD_LINK_INFO_TYPE_PCIE:=2): 'HSA_AMD_LINK_INFO_TYPE_PCIE', (HSA_AMD_LINK_INFO_TYPE_INFINBAND:=3): 'HSA_AMD_LINK_INFO_TYPE_INFINBAND', (HSA_AMD_LINK_INFO_TYPE_XGMI:=4): 'HSA_AMD_LINK_INFO_TYPE_XGMI'} +@c.record +class struct_hsa_amd_memory_pool_link_info_s(c.Struct): + SIZE = 28 + min_latency: int + max_latency: int + min_bandwidth: int + max_bandwidth: int + atomic_support_32bit: bool + atomic_support_64bit: bool + coherent_support: bool + link_type: int + numa_distance: int +struct_hsa_amd_memory_pool_link_info_s.register_fields([('min_latency', uint32_t, 0), ('max_latency', uint32_t, 4), ('min_bandwidth', uint32_t, 8), ('max_bandwidth', uint32_t, 12), ('atomic_support_32bit', ctypes.c_bool, 16), ('atomic_support_64bit', ctypes.c_bool, 17), ('coherent_support', ctypes.c_bool, 18), ('link_type', ctypes.c_uint32, 20), ('numa_distance', uint32_t, 24)]) +hsa_amd_memory_pool_link_info_t: TypeAlias = struct_hsa_amd_memory_pool_link_info_s +hsa_amd_agent_memory_pool_info_t: dict[int, str] = {(HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS:=0): 'HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS', (HSA_AMD_AGENT_MEMORY_POOL_INFO_NUM_LINK_HOPS:=1): 'HSA_AMD_AGENT_MEMORY_POOL_INFO_NUM_LINK_HOPS', (HSA_AMD_AGENT_MEMORY_POOL_INFO_LINK_INFO:=2): 'HSA_AMD_AGENT_MEMORY_POOL_INFO_LINK_INFO'} +hsa_amd_pointer_type_t: dict[int, str] = {(HSA_EXT_POINTER_TYPE_UNKNOWN:=0): 'HSA_EXT_POINTER_TYPE_UNKNOWN', (HSA_EXT_POINTER_TYPE_HSA:=1): 'HSA_EXT_POINTER_TYPE_HSA', (HSA_EXT_POINTER_TYPE_LOCKED:=2): 'HSA_EXT_POINTER_TYPE_LOCKED', (HSA_EXT_POINTER_TYPE_GRAPHICS:=3): 'HSA_EXT_POINTER_TYPE_GRAPHICS', (HSA_EXT_POINTER_TYPE_IPC:=4): 'HSA_EXT_POINTER_TYPE_IPC', (HSA_EXT_POINTER_TYPE_RESERVED_ADDR:=5): 'HSA_EXT_POINTER_TYPE_RESERVED_ADDR', (HSA_EXT_POINTER_TYPE_HSA_VMEM:=6): 'HSA_EXT_POINTER_TYPE_HSA_VMEM'} +@c.record +class struct_hsa_amd_pointer_info_s(c.Struct): + SIZE = 56 + size: int + type: int + agentBaseAddress: ctypes.c_void_p + hostBaseAddress: ctypes.c_void_p + sizeInBytes: int + userData: ctypes.c_void_p + agentOwner: struct_hsa_agent_s + global_flags: int + registered: bool +struct_hsa_amd_pointer_info_s.register_fields([('size', uint32_t, 0), ('type', ctypes.c_uint32, 4), ('agentBaseAddress', ctypes.c_void_p, 8), ('hostBaseAddress', ctypes.c_void_p, 16), ('sizeInBytes', size_t, 24), ('userData', ctypes.c_void_p, 32), ('agentOwner', hsa_agent_t, 40), ('global_flags', uint32_t, 48), ('registered', ctypes.c_bool, 52)]) +hsa_amd_pointer_info_t: TypeAlias = struct_hsa_amd_pointer_info_s +@c.record +class struct_hsa_amd_ipc_memory_s(c.Struct): + SIZE = 32 + handle: c.Array[ctypes.c_uint32, Literal[8]] +struct_hsa_amd_ipc_memory_s.register_fields([('handle', c.Array[uint32_t, Literal[8]], 0)]) +hsa_amd_ipc_memory_t: TypeAlias = struct_hsa_amd_ipc_memory_s +hsa_amd_ipc_signal_t: TypeAlias = struct_hsa_amd_ipc_memory_s +enum_hsa_amd_event_type_s: dict[int, str] = {(HSA_AMD_GPU_MEMORY_FAULT_EVENT:=0): 'HSA_AMD_GPU_MEMORY_FAULT_EVENT', (HSA_AMD_GPU_HW_EXCEPTION_EVENT:=1): 'HSA_AMD_GPU_HW_EXCEPTION_EVENT', (HSA_AMD_GPU_MEMORY_ERROR_EVENT:=2): 'HSA_AMD_GPU_MEMORY_ERROR_EVENT'} +hsa_amd_event_type_t: TypeAlias = ctypes.c_uint32 +hsa_amd_memory_fault_reason_t: dict[int, str] = {(HSA_AMD_MEMORY_FAULT_PAGE_NOT_PRESENT:=1): 'HSA_AMD_MEMORY_FAULT_PAGE_NOT_PRESENT', (HSA_AMD_MEMORY_FAULT_READ_ONLY:=2): 'HSA_AMD_MEMORY_FAULT_READ_ONLY', (HSA_AMD_MEMORY_FAULT_NX:=4): 'HSA_AMD_MEMORY_FAULT_NX', (HSA_AMD_MEMORY_FAULT_HOST_ONLY:=8): 'HSA_AMD_MEMORY_FAULT_HOST_ONLY', (HSA_AMD_MEMORY_FAULT_DRAMECC:=16): 'HSA_AMD_MEMORY_FAULT_DRAMECC', (HSA_AMD_MEMORY_FAULT_IMPRECISE:=32): 'HSA_AMD_MEMORY_FAULT_IMPRECISE', (HSA_AMD_MEMORY_FAULT_SRAMECC:=64): 'HSA_AMD_MEMORY_FAULT_SRAMECC', (HSA_AMD_MEMORY_FAULT_HANG:=2147483648): 'HSA_AMD_MEMORY_FAULT_HANG'} +@c.record +class struct_hsa_amd_gpu_memory_fault_info_s(c.Struct): + SIZE = 24 + agent: struct_hsa_agent_s + virtual_address: int + fault_reason_mask: int +struct_hsa_amd_gpu_memory_fault_info_s.register_fields([('agent', hsa_agent_t, 0), ('virtual_address', uint64_t, 8), ('fault_reason_mask', uint32_t, 16)]) +hsa_amd_gpu_memory_fault_info_t: TypeAlias = struct_hsa_amd_gpu_memory_fault_info_s +hsa_amd_memory_error_reason_t: dict[int, str] = {(HSA_AMD_MEMORY_ERROR_MEMORY_IN_USE:=1): 'HSA_AMD_MEMORY_ERROR_MEMORY_IN_USE'} +@c.record +class struct_hsa_amd_gpu_memory_error_info_s(c.Struct): + SIZE = 24 + agent: struct_hsa_agent_s + virtual_address: int + error_reason_mask: int +struct_hsa_amd_gpu_memory_error_info_s.register_fields([('agent', hsa_agent_t, 0), ('virtual_address', uint64_t, 8), ('error_reason_mask', uint32_t, 16)]) +hsa_amd_gpu_memory_error_info_t: TypeAlias = struct_hsa_amd_gpu_memory_error_info_s +hsa_amd_hw_exception_reset_type_t: dict[int, str] = {(HSA_AMD_HW_EXCEPTION_RESET_TYPE_OTHER:=1): 'HSA_AMD_HW_EXCEPTION_RESET_TYPE_OTHER'} +hsa_amd_hw_exception_reset_cause_t: dict[int, str] = {(HSA_AMD_HW_EXCEPTION_CAUSE_GPU_HANG:=1): 'HSA_AMD_HW_EXCEPTION_CAUSE_GPU_HANG', (HSA_AMD_HW_EXCEPTION_CAUSE_ECC:=2): 'HSA_AMD_HW_EXCEPTION_CAUSE_ECC'} +@c.record +class struct_hsa_amd_gpu_hw_exception_info_s(c.Struct): + SIZE = 16 + agent: struct_hsa_agent_s + reset_type: int + reset_cause: int +struct_hsa_amd_gpu_hw_exception_info_s.register_fields([('agent', hsa_agent_t, 0), ('reset_type', ctypes.c_uint32, 8), ('reset_cause', ctypes.c_uint32, 12)]) +hsa_amd_gpu_hw_exception_info_t: TypeAlias = struct_hsa_amd_gpu_hw_exception_info_s +@c.record +class struct_hsa_amd_event_s(c.Struct): + SIZE = 32 + event_type: int + memory_fault: struct_hsa_amd_gpu_memory_fault_info_s + hw_exception: struct_hsa_amd_gpu_hw_exception_info_s + memory_error: struct_hsa_amd_gpu_memory_error_info_s +struct_hsa_amd_event_s.register_fields([('event_type', hsa_amd_event_type_t, 0), ('memory_fault', hsa_amd_gpu_memory_fault_info_t, 8), ('hw_exception', hsa_amd_gpu_hw_exception_info_t, 8), ('memory_error', hsa_amd_gpu_memory_error_info_t, 8)]) +hsa_amd_event_t: TypeAlias = struct_hsa_amd_event_s +hsa_amd_system_event_callback_t: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_hsa_amd_event_s], ctypes.c_void_p]] +enum_hsa_amd_queue_priority_s: dict[int, str] = {(HSA_AMD_QUEUE_PRIORITY_LOW:=0): 'HSA_AMD_QUEUE_PRIORITY_LOW', (HSA_AMD_QUEUE_PRIORITY_NORMAL:=1): 'HSA_AMD_QUEUE_PRIORITY_NORMAL', (HSA_AMD_QUEUE_PRIORITY_HIGH:=2): 'HSA_AMD_QUEUE_PRIORITY_HIGH'} +hsa_amd_queue_priority_t: TypeAlias = ctypes.c_uint32 +hsa_amd_queue_create_flag_t: dict[int, str] = {(HSA_AMD_QUEUE_CREATE_SYSTEM_MEM:=0): 'HSA_AMD_QUEUE_CREATE_SYSTEM_MEM', (HSA_AMD_QUEUE_CREATE_DEVICE_MEM_RING_BUF:=1): 'HSA_AMD_QUEUE_CREATE_DEVICE_MEM_RING_BUF', (HSA_AMD_QUEUE_CREATE_DEVICE_MEM_QUEUE_DESCRIPTOR:=2): 'HSA_AMD_QUEUE_CREATE_DEVICE_MEM_QUEUE_DESCRIPTOR'} +hsa_amd_deallocation_callback_t: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p]] +enum_hsa_amd_svm_model_s: dict[int, str] = {(HSA_AMD_SVM_GLOBAL_FLAG_FINE_GRAINED:=0): 'HSA_AMD_SVM_GLOBAL_FLAG_FINE_GRAINED', (HSA_AMD_SVM_GLOBAL_FLAG_COARSE_GRAINED:=1): 'HSA_AMD_SVM_GLOBAL_FLAG_COARSE_GRAINED', (HSA_AMD_SVM_GLOBAL_FLAG_INDETERMINATE:=2): 'HSA_AMD_SVM_GLOBAL_FLAG_INDETERMINATE'} +hsa_amd_svm_model_t: TypeAlias = ctypes.c_uint32 +enum_hsa_amd_svm_attribute_s: dict[int, str] = {(HSA_AMD_SVM_ATTRIB_GLOBAL_FLAG:=0): 'HSA_AMD_SVM_ATTRIB_GLOBAL_FLAG', (HSA_AMD_SVM_ATTRIB_READ_ONLY:=1): 'HSA_AMD_SVM_ATTRIB_READ_ONLY', (HSA_AMD_SVM_ATTRIB_HIVE_LOCAL:=2): 'HSA_AMD_SVM_ATTRIB_HIVE_LOCAL', (HSA_AMD_SVM_ATTRIB_MIGRATION_GRANULARITY:=3): 'HSA_AMD_SVM_ATTRIB_MIGRATION_GRANULARITY', (HSA_AMD_SVM_ATTRIB_PREFERRED_LOCATION:=4): 'HSA_AMD_SVM_ATTRIB_PREFERRED_LOCATION', (HSA_AMD_SVM_ATTRIB_PREFETCH_LOCATION:=5): 'HSA_AMD_SVM_ATTRIB_PREFETCH_LOCATION', (HSA_AMD_SVM_ATTRIB_READ_MOSTLY:=6): 'HSA_AMD_SVM_ATTRIB_READ_MOSTLY', (HSA_AMD_SVM_ATTRIB_GPU_EXEC:=7): 'HSA_AMD_SVM_ATTRIB_GPU_EXEC', (HSA_AMD_SVM_ATTRIB_AGENT_ACCESSIBLE:=512): 'HSA_AMD_SVM_ATTRIB_AGENT_ACCESSIBLE', (HSA_AMD_SVM_ATTRIB_AGENT_ACCESSIBLE_IN_PLACE:=513): 'HSA_AMD_SVM_ATTRIB_AGENT_ACCESSIBLE_IN_PLACE', (HSA_AMD_SVM_ATTRIB_AGENT_NO_ACCESS:=514): 'HSA_AMD_SVM_ATTRIB_AGENT_NO_ACCESS', (HSA_AMD_SVM_ATTRIB_ACCESS_QUERY:=515): 'HSA_AMD_SVM_ATTRIB_ACCESS_QUERY'} +hsa_amd_svm_attribute_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_hsa_amd_svm_attribute_pair_s(c.Struct): + SIZE = 16 + attribute: int + value: int +struct_hsa_amd_svm_attribute_pair_s.register_fields([('attribute', uint64_t, 0), ('value', uint64_t, 8)]) +hsa_amd_svm_attribute_pair_t: TypeAlias = struct_hsa_amd_svm_attribute_pair_s +enum_hsa_amd_vmem_address_reserve_flag_s: dict[int, str] = {(HSA_AMD_VMEM_ADDRESS_NO_REGISTER:=1): 'HSA_AMD_VMEM_ADDRESS_NO_REGISTER'} +hsa_amd_vmem_address_reserve_flag_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_hsa_amd_vmem_alloc_handle_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_amd_vmem_alloc_handle_s.register_fields([('handle', uint64_t, 0)]) +hsa_amd_vmem_alloc_handle_t: TypeAlias = struct_hsa_amd_vmem_alloc_handle_s +hsa_amd_memory_type_t: dict[int, str] = {(MEMORY_TYPE_NONE:=0): 'MEMORY_TYPE_NONE', (MEMORY_TYPE_PINNED:=1): 'MEMORY_TYPE_PINNED'} +@c.record +class struct_hsa_amd_memory_access_desc_s(c.Struct): + SIZE = 16 + permissions: int + agent_handle: struct_hsa_agent_s +struct_hsa_amd_memory_access_desc_s.register_fields([('permissions', ctypes.c_uint32, 0), ('agent_handle', hsa_agent_t, 8)]) +hsa_amd_memory_access_desc_t: TypeAlias = struct_hsa_amd_memory_access_desc_s +hsa_queue_info_attribute_t: dict[int, str] = {(HSA_AMD_QUEUE_INFO_AGENT:=0): 'HSA_AMD_QUEUE_INFO_AGENT', (HSA_AMD_QUEUE_INFO_DOORBELL_ID:=1): 'HSA_AMD_QUEUE_INFO_DOORBELL_ID'} +@c.record +class struct_hsa_amd_ais_file_handle_s(c.Struct): + SIZE = 8 + handle: ctypes.c_void_p + fd: int + pad: c.Array[ctypes.c_ubyte, Literal[8]] +struct_hsa_amd_ais_file_handle_s.register_fields([('handle', ctypes.c_void_p, 0), ('fd', ctypes.c_int32, 0), ('pad', c.Array[uint8_t, Literal[8]], 0)]) +hsa_amd_ais_file_handle_t: TypeAlias = struct_hsa_amd_ais_file_handle_s +enum_hsa_amd_log_flag_s: dict[int, str] = {(HSA_AMD_LOG_FLAG_BLIT_KERNEL_PKTS:=0): 'HSA_AMD_LOG_FLAG_BLIT_KERNEL_PKTS', (HSA_AMD_LOG_FLAG_AQL:=0): 'HSA_AMD_LOG_FLAG_AQL', (HSA_AMD_LOG_FLAG_SDMA:=1): 'HSA_AMD_LOG_FLAG_SDMA', (HSA_AMD_LOG_FLAG_INFO:=2): 'HSA_AMD_LOG_FLAG_INFO'} +hsa_amd_log_flag_t: TypeAlias = ctypes.c_uint32 +amd_signal_kind64_t: TypeAlias = ctypes.c_int64 +enum_amd_signal_kind_t: dict[int, str] = {(AMD_SIGNAL_KIND_INVALID:=0): 'AMD_SIGNAL_KIND_INVALID', (AMD_SIGNAL_KIND_USER:=1): 'AMD_SIGNAL_KIND_USER', (AMD_SIGNAL_KIND_DOORBELL:=-1): 'AMD_SIGNAL_KIND_DOORBELL', (AMD_SIGNAL_KIND_LEGACY_DOORBELL:=-2): 'AMD_SIGNAL_KIND_LEGACY_DOORBELL'} +@c.record +class struct_amd_signal_s(c.Struct): + SIZE = 64 + kind: int + value: int + hardware_doorbell_ptr: c.POINTER[ctypes.c_uint64] + event_mailbox_ptr: int + event_id: int + reserved1: int + start_ts: int + end_ts: int + queue_ptr: c.POINTER[struct_amd_queue_v2_s] + reserved2: int + reserved3: c.Array[ctypes.c_uint32, Literal[2]] +int64_t: TypeAlias = ctypes.c_int64 +@c.record +class struct_amd_queue_v2_s(c.Struct): + SIZE = 2304 + hsa_queue: struct_hsa_queue_s + caps: int + reserved1: c.Array[ctypes.c_uint32, Literal[3]] + write_dispatch_id: int + group_segment_aperture_base_hi: int + private_segment_aperture_base_hi: int + max_cu_id: int + max_wave_id: int + max_legacy_doorbell_dispatch_id_plus_1: int + legacy_doorbell_lock: int + reserved2: c.Array[ctypes.c_uint32, Literal[9]] + read_dispatch_id: int + read_dispatch_id_field_base_byte_offset: int + compute_tmpring_size: int + scratch_resource_descriptor: c.Array[ctypes.c_uint32, Literal[4]] + scratch_backing_memory_location: int + scratch_backing_memory_byte_size: int + scratch_wave64_lane_byte_size: int + queue_properties: int + scratch_max_use_index: int + queue_inactive_signal: struct_hsa_signal_s + alt_scratch_max_use_index: int + alt_scratch_resource_descriptor: c.Array[ctypes.c_uint32, Literal[4]] + alt_scratch_backing_memory_location: int + alt_scratch_dispatch_limit_x: int + alt_scratch_dispatch_limit_y: int + alt_scratch_dispatch_limit_z: int + alt_scratch_wave64_lane_byte_size: int + alt_compute_tmpring_size: int + reserved5: int + scratch_last_used_index: c.Array[struct_scratch_last_used_index_xcc_s, Literal[128]] +amd_queue_v2_t: TypeAlias = struct_amd_queue_v2_s +amd_queue_properties32_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_scratch_last_used_index_xcc_s(c.Struct): + SIZE = 16 + main: int + alt: int +scratch_last_used_index_xcc_t: TypeAlias = struct_scratch_last_used_index_xcc_s +struct_scratch_last_used_index_xcc_s.register_fields([('main', uint64_t, 0), ('alt', uint64_t, 8)]) +struct_amd_queue_v2_s.register_fields([('hsa_queue', hsa_queue_t, 0), ('caps', uint32_t, 40), ('reserved1', c.Array[uint32_t, Literal[3]], 44), ('write_dispatch_id', uint64_t, 56), ('group_segment_aperture_base_hi', uint32_t, 64), ('private_segment_aperture_base_hi', uint32_t, 68), ('max_cu_id', uint32_t, 72), ('max_wave_id', uint32_t, 76), ('max_legacy_doorbell_dispatch_id_plus_1', uint64_t, 80), ('legacy_doorbell_lock', uint32_t, 88), ('reserved2', c.Array[uint32_t, Literal[9]], 92), ('read_dispatch_id', uint64_t, 128), ('read_dispatch_id_field_base_byte_offset', uint32_t, 136), ('compute_tmpring_size', uint32_t, 140), ('scratch_resource_descriptor', c.Array[uint32_t, Literal[4]], 144), ('scratch_backing_memory_location', uint64_t, 160), ('scratch_backing_memory_byte_size', uint64_t, 168), ('scratch_wave64_lane_byte_size', uint32_t, 176), ('queue_properties', amd_queue_properties32_t, 180), ('scratch_max_use_index', uint64_t, 184), ('queue_inactive_signal', hsa_signal_t, 192), ('alt_scratch_max_use_index', uint64_t, 200), ('alt_scratch_resource_descriptor', c.Array[uint32_t, Literal[4]], 208), ('alt_scratch_backing_memory_location', uint64_t, 224), ('alt_scratch_dispatch_limit_x', uint32_t, 232), ('alt_scratch_dispatch_limit_y', uint32_t, 236), ('alt_scratch_dispatch_limit_z', uint32_t, 240), ('alt_scratch_wave64_lane_byte_size', uint32_t, 244), ('alt_compute_tmpring_size', uint32_t, 248), ('reserved5', uint32_t, 252), ('scratch_last_used_index', c.Array[scratch_last_used_index_xcc_t, Literal[128]], 256)]) +struct_amd_signal_s.register_fields([('kind', amd_signal_kind64_t, 0), ('value', int64_t, 8), ('hardware_doorbell_ptr', c.POINTER[uint64_t], 8), ('event_mailbox_ptr', uint64_t, 16), ('event_id', uint32_t, 24), ('reserved1', uint32_t, 28), ('start_ts', uint64_t, 32), ('end_ts', uint64_t, 40), ('queue_ptr', c.POINTER[amd_queue_v2_t], 48), ('reserved2', uint64_t, 48), ('reserved3', c.Array[uint32_t, Literal[2]], 56)]) +amd_signal_t: TypeAlias = struct_amd_signal_s +enum_amd_queue_properties_t: dict[int, str] = {(AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_SHIFT:=0): 'AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_SHIFT', (AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_WIDTH:=1): 'AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_WIDTH', (AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER:=1): 'AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER', (AMD_QUEUE_PROPERTIES_IS_PTR64_SHIFT:=1): 'AMD_QUEUE_PROPERTIES_IS_PTR64_SHIFT', (AMD_QUEUE_PROPERTIES_IS_PTR64_WIDTH:=1): 'AMD_QUEUE_PROPERTIES_IS_PTR64_WIDTH', (AMD_QUEUE_PROPERTIES_IS_PTR64:=2): 'AMD_QUEUE_PROPERTIES_IS_PTR64', (AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_DEBUG_SGPRS_SHIFT:=2): 'AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_DEBUG_SGPRS_SHIFT', (AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_DEBUG_SGPRS_WIDTH:=1): 'AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_DEBUG_SGPRS_WIDTH', (AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_DEBUG_SGPRS:=4): 'AMD_QUEUE_PROPERTIES_ENABLE_TRAP_HANDLER_DEBUG_SGPRS', (AMD_QUEUE_PROPERTIES_ENABLE_PROFILING_SHIFT:=3): 'AMD_QUEUE_PROPERTIES_ENABLE_PROFILING_SHIFT', (AMD_QUEUE_PROPERTIES_ENABLE_PROFILING_WIDTH:=1): 'AMD_QUEUE_PROPERTIES_ENABLE_PROFILING_WIDTH', (AMD_QUEUE_PROPERTIES_ENABLE_PROFILING:=8): 'AMD_QUEUE_PROPERTIES_ENABLE_PROFILING', (AMD_QUEUE_PROPERTIES_USE_SCRATCH_ONCE_SHIFT:=4): 'AMD_QUEUE_PROPERTIES_USE_SCRATCH_ONCE_SHIFT', (AMD_QUEUE_PROPERTIES_USE_SCRATCH_ONCE_WIDTH:=1): 'AMD_QUEUE_PROPERTIES_USE_SCRATCH_ONCE_WIDTH', (AMD_QUEUE_PROPERTIES_USE_SCRATCH_ONCE:=16): 'AMD_QUEUE_PROPERTIES_USE_SCRATCH_ONCE', (AMD_QUEUE_PROPERTIES_RESERVED1_SHIFT:=5): 'AMD_QUEUE_PROPERTIES_RESERVED1_SHIFT', (AMD_QUEUE_PROPERTIES_RESERVED1_WIDTH:=27): 'AMD_QUEUE_PROPERTIES_RESERVED1_WIDTH', (AMD_QUEUE_PROPERTIES_RESERVED1:=-32): 'AMD_QUEUE_PROPERTIES_RESERVED1'} +amd_queue_capabilities32_t: TypeAlias = ctypes.c_uint32 +enum_amd_queue_capabilities_t: dict[int, str] = {(AMD_QUEUE_CAPS_CP_ASYNC_RECLAIM_SHIFT:=0): 'AMD_QUEUE_CAPS_CP_ASYNC_RECLAIM_SHIFT', (AMD_QUEUE_CAPS_CP_ASYNC_RECLAIM_WIDTH:=1): 'AMD_QUEUE_CAPS_CP_ASYNC_RECLAIM_WIDTH', (AMD_QUEUE_CAPS_CP_ASYNC_RECLAIM:=1): 'AMD_QUEUE_CAPS_CP_ASYNC_RECLAIM', (AMD_QUEUE_CAPS_SW_ASYNC_RECLAIM_SHIFT:=1): 'AMD_QUEUE_CAPS_SW_ASYNC_RECLAIM_SHIFT', (AMD_QUEUE_CAPS_SW_ASYNC_RECLAIM_WIDTH:=1): 'AMD_QUEUE_CAPS_SW_ASYNC_RECLAIM_WIDTH', (AMD_QUEUE_CAPS_SW_ASYNC_RECLAIM:=2): 'AMD_QUEUE_CAPS_SW_ASYNC_RECLAIM'} +@c.record +class struct_amd_queue_s(c.Struct): + SIZE = 256 + hsa_queue: struct_hsa_queue_s + caps: int + reserved1: c.Array[ctypes.c_uint32, Literal[3]] + write_dispatch_id: int + group_segment_aperture_base_hi: int + private_segment_aperture_base_hi: int + max_cu_id: int + max_wave_id: int + max_legacy_doorbell_dispatch_id_plus_1: int + legacy_doorbell_lock: int + reserved2: c.Array[ctypes.c_uint32, Literal[9]] + read_dispatch_id: int + read_dispatch_id_field_base_byte_offset: int + compute_tmpring_size: int + scratch_resource_descriptor: c.Array[ctypes.c_uint32, Literal[4]] + scratch_backing_memory_location: int + reserved3: c.Array[ctypes.c_uint32, Literal[2]] + scratch_wave64_lane_byte_size: int + queue_properties: int + reserved4: c.Array[ctypes.c_uint32, Literal[2]] + queue_inactive_signal: struct_hsa_signal_s + reserved5: c.Array[ctypes.c_uint32, Literal[14]] +struct_amd_queue_s.register_fields([('hsa_queue', hsa_queue_t, 0), ('caps', uint32_t, 40), ('reserved1', c.Array[uint32_t, Literal[3]], 44), ('write_dispatch_id', uint64_t, 56), ('group_segment_aperture_base_hi', uint32_t, 64), ('private_segment_aperture_base_hi', uint32_t, 68), ('max_cu_id', uint32_t, 72), ('max_wave_id', uint32_t, 76), ('max_legacy_doorbell_dispatch_id_plus_1', uint64_t, 80), ('legacy_doorbell_lock', uint32_t, 88), ('reserved2', c.Array[uint32_t, Literal[9]], 92), ('read_dispatch_id', uint64_t, 128), ('read_dispatch_id_field_base_byte_offset', uint32_t, 136), ('compute_tmpring_size', uint32_t, 140), ('scratch_resource_descriptor', c.Array[uint32_t, Literal[4]], 144), ('scratch_backing_memory_location', uint64_t, 160), ('reserved3', c.Array[uint32_t, Literal[2]], 168), ('scratch_wave64_lane_byte_size', uint32_t, 176), ('queue_properties', amd_queue_properties32_t, 180), ('reserved4', c.Array[uint32_t, Literal[2]], 184), ('queue_inactive_signal', hsa_signal_t, 192), ('reserved5', c.Array[uint32_t, Literal[14]], 200)]) +amd_queue_t: TypeAlias = struct_amd_queue_s +amd_kernel_code_version32_t: TypeAlias = ctypes.c_uint32 +enum_amd_kernel_code_version_t: dict[int, str] = {(AMD_KERNEL_CODE_VERSION_MAJOR:=1): 'AMD_KERNEL_CODE_VERSION_MAJOR', (AMD_KERNEL_CODE_VERSION_MINOR:=1): 'AMD_KERNEL_CODE_VERSION_MINOR'} +amd_machine_kind16_t: TypeAlias = ctypes.c_uint16 +enum_amd_machine_kind_t: dict[int, str] = {(AMD_MACHINE_KIND_UNDEFINED:=0): 'AMD_MACHINE_KIND_UNDEFINED', (AMD_MACHINE_KIND_AMDGPU:=1): 'AMD_MACHINE_KIND_AMDGPU'} +amd_machine_version16_t: TypeAlias = ctypes.c_uint16 +enum_amd_float_round_mode_t: dict[int, str] = {(AMD_FLOAT_ROUND_MODE_NEAREST_EVEN:=0): 'AMD_FLOAT_ROUND_MODE_NEAREST_EVEN', (AMD_FLOAT_ROUND_MODE_PLUS_INFINITY:=1): 'AMD_FLOAT_ROUND_MODE_PLUS_INFINITY', (AMD_FLOAT_ROUND_MODE_MINUS_INFINITY:=2): 'AMD_FLOAT_ROUND_MODE_MINUS_INFINITY', (AMD_FLOAT_ROUND_MODE_ZERO:=3): 'AMD_FLOAT_ROUND_MODE_ZERO'} +enum_amd_float_denorm_mode_t: dict[int, str] = {(AMD_FLOAT_DENORM_MODE_FLUSH_SOURCE_OUTPUT:=0): 'AMD_FLOAT_DENORM_MODE_FLUSH_SOURCE_OUTPUT', (AMD_FLOAT_DENORM_MODE_FLUSH_OUTPUT:=1): 'AMD_FLOAT_DENORM_MODE_FLUSH_OUTPUT', (AMD_FLOAT_DENORM_MODE_FLUSH_SOURCE:=2): 'AMD_FLOAT_DENORM_MODE_FLUSH_SOURCE', (AMD_FLOAT_DENORM_MODE_NO_FLUSH:=3): 'AMD_FLOAT_DENORM_MODE_NO_FLUSH'} +amd_compute_pgm_rsrc_one32_t: TypeAlias = ctypes.c_uint32 +enum_amd_compute_pgm_rsrc_one_t: dict[int, str] = {(AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WORKITEM_VGPR_COUNT_SHIFT:=0): 'AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WORKITEM_VGPR_COUNT_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WORKITEM_VGPR_COUNT_WIDTH:=6): 'AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WORKITEM_VGPR_COUNT_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WORKITEM_VGPR_COUNT:=63): 'AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WORKITEM_VGPR_COUNT', (AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WAVEFRONT_SGPR_COUNT_SHIFT:=6): 'AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WAVEFRONT_SGPR_COUNT_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WAVEFRONT_SGPR_COUNT_WIDTH:=4): 'AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WAVEFRONT_SGPR_COUNT_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WAVEFRONT_SGPR_COUNT:=960): 'AMD_COMPUTE_PGM_RSRC_ONE_GRANULATED_WAVEFRONT_SGPR_COUNT', (AMD_COMPUTE_PGM_RSRC_ONE_PRIORITY_SHIFT:=10): 'AMD_COMPUTE_PGM_RSRC_ONE_PRIORITY_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_PRIORITY_WIDTH:=2): 'AMD_COMPUTE_PGM_RSRC_ONE_PRIORITY_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_PRIORITY:=3072): 'AMD_COMPUTE_PGM_RSRC_ONE_PRIORITY', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_32_SHIFT:=12): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_32_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_32_WIDTH:=2): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_32_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_32:=12288): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_32', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_16_64_SHIFT:=14): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_16_64_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_16_64_WIDTH:=2): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_16_64_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_16_64:=49152): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_ROUND_MODE_16_64', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_32_SHIFT:=16): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_32_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_32_WIDTH:=2): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_32_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_32:=196608): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_32', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_16_64_SHIFT:=18): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_16_64_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_16_64_WIDTH:=2): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_16_64_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_16_64:=786432): 'AMD_COMPUTE_PGM_RSRC_ONE_FLOAT_DENORM_MODE_16_64', (AMD_COMPUTE_PGM_RSRC_ONE_PRIV_SHIFT:=20): 'AMD_COMPUTE_PGM_RSRC_ONE_PRIV_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_PRIV_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_ONE_PRIV_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_PRIV:=1048576): 'AMD_COMPUTE_PGM_RSRC_ONE_PRIV', (AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_DX10_CLAMP_SHIFT:=21): 'AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_DX10_CLAMP_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_DX10_CLAMP_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_DX10_CLAMP_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_DX10_CLAMP:=2097152): 'AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_DX10_CLAMP', (AMD_COMPUTE_PGM_RSRC_ONE_DEBUG_MODE_SHIFT:=22): 'AMD_COMPUTE_PGM_RSRC_ONE_DEBUG_MODE_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_DEBUG_MODE_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_ONE_DEBUG_MODE_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_DEBUG_MODE:=4194304): 'AMD_COMPUTE_PGM_RSRC_ONE_DEBUG_MODE', (AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_IEEE_MODE_SHIFT:=23): 'AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_IEEE_MODE_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_IEEE_MODE_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_IEEE_MODE_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_IEEE_MODE:=8388608): 'AMD_COMPUTE_PGM_RSRC_ONE_ENABLE_IEEE_MODE', (AMD_COMPUTE_PGM_RSRC_ONE_BULKY_SHIFT:=24): 'AMD_COMPUTE_PGM_RSRC_ONE_BULKY_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_BULKY_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_ONE_BULKY_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_BULKY:=16777216): 'AMD_COMPUTE_PGM_RSRC_ONE_BULKY', (AMD_COMPUTE_PGM_RSRC_ONE_CDBG_USER_SHIFT:=25): 'AMD_COMPUTE_PGM_RSRC_ONE_CDBG_USER_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_CDBG_USER_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_ONE_CDBG_USER_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_CDBG_USER:=33554432): 'AMD_COMPUTE_PGM_RSRC_ONE_CDBG_USER', (AMD_COMPUTE_PGM_RSRC_ONE_RESERVED1_SHIFT:=26): 'AMD_COMPUTE_PGM_RSRC_ONE_RESERVED1_SHIFT', (AMD_COMPUTE_PGM_RSRC_ONE_RESERVED1_WIDTH:=6): 'AMD_COMPUTE_PGM_RSRC_ONE_RESERVED1_WIDTH', (AMD_COMPUTE_PGM_RSRC_ONE_RESERVED1:=-67108864): 'AMD_COMPUTE_PGM_RSRC_ONE_RESERVED1'} +enum_amd_system_vgpr_workitem_id_t: dict[int, str] = {(AMD_SYSTEM_VGPR_WORKITEM_ID_X:=0): 'AMD_SYSTEM_VGPR_WORKITEM_ID_X', (AMD_SYSTEM_VGPR_WORKITEM_ID_X_Y:=1): 'AMD_SYSTEM_VGPR_WORKITEM_ID_X_Y', (AMD_SYSTEM_VGPR_WORKITEM_ID_X_Y_Z:=2): 'AMD_SYSTEM_VGPR_WORKITEM_ID_X_Y_Z', (AMD_SYSTEM_VGPR_WORKITEM_ID_UNDEFINED:=3): 'AMD_SYSTEM_VGPR_WORKITEM_ID_UNDEFINED'} +amd_compute_pgm_rsrc_two32_t: TypeAlias = ctypes.c_uint32 +enum_amd_compute_pgm_rsrc_two_t: dict[int, str] = {(AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_PRIVATE_SEGMENT_WAVE_BYTE_OFFSET_SHIFT:=0): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_PRIVATE_SEGMENT_WAVE_BYTE_OFFSET_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_PRIVATE_SEGMENT_WAVE_BYTE_OFFSET_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_PRIVATE_SEGMENT_WAVE_BYTE_OFFSET_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_PRIVATE_SEGMENT_WAVE_BYTE_OFFSET:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_PRIVATE_SEGMENT_WAVE_BYTE_OFFSET', (AMD_COMPUTE_PGM_RSRC_TWO_USER_SGPR_COUNT_SHIFT:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_USER_SGPR_COUNT_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_USER_SGPR_COUNT_WIDTH:=5): 'AMD_COMPUTE_PGM_RSRC_TWO_USER_SGPR_COUNT_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_USER_SGPR_COUNT:=62): 'AMD_COMPUTE_PGM_RSRC_TWO_USER_SGPR_COUNT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_TRAP_HANDLER_SHIFT:=6): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_TRAP_HANDLER_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_TRAP_HANDLER_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_TRAP_HANDLER_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_TRAP_HANDLER:=64): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_TRAP_HANDLER', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_X_SHIFT:=7): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_X_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_X_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_X_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_X:=128): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_X', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Y_SHIFT:=8): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Y_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Y_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Y_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Y:=256): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Y', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Z_SHIFT:=9): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Z_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Z_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Z_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Z:=512): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_ID_Z', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_INFO_SHIFT:=10): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_INFO_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_INFO_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_INFO_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_INFO:=1024): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_SGPR_WORKGROUP_INFO', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_VGPR_WORKITEM_ID_SHIFT:=11): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_VGPR_WORKITEM_ID_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_VGPR_WORKITEM_ID_WIDTH:=2): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_VGPR_WORKITEM_ID_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_VGPR_WORKITEM_ID:=6144): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_VGPR_WORKITEM_ID', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_ADDRESS_WATCH_SHIFT:=13): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_ADDRESS_WATCH_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_ADDRESS_WATCH_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_ADDRESS_WATCH_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_ADDRESS_WATCH:=8192): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_ADDRESS_WATCH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_MEMORY_VIOLATION_SHIFT:=14): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_MEMORY_VIOLATION_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_MEMORY_VIOLATION_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_MEMORY_VIOLATION_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_MEMORY_VIOLATION:=16384): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_MEMORY_VIOLATION', (AMD_COMPUTE_PGM_RSRC_TWO_GRANULATED_LDS_SIZE_SHIFT:=15): 'AMD_COMPUTE_PGM_RSRC_TWO_GRANULATED_LDS_SIZE_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_GRANULATED_LDS_SIZE_WIDTH:=9): 'AMD_COMPUTE_PGM_RSRC_TWO_GRANULATED_LDS_SIZE_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_GRANULATED_LDS_SIZE:=16744448): 'AMD_COMPUTE_PGM_RSRC_TWO_GRANULATED_LDS_SIZE', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_SHIFT:=24): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION:=16777216): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_SHIFT:=25): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE:=33554432): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_SHIFT:=26): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO:=67108864): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_SHIFT:=27): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW:=134217728): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_SHIFT:=28): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW:=268435456): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_SHIFT:=29): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT:=536870912): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_INT_DIVISION_BY_ZERO_SHIFT:=30): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_INT_DIVISION_BY_ZERO_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_INT_DIVISION_BY_ZERO_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_INT_DIVISION_BY_ZERO_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_INT_DIVISION_BY_ZERO:=1073741824): 'AMD_COMPUTE_PGM_RSRC_TWO_ENABLE_EXCEPTION_INT_DIVISION_BY_ZERO', (AMD_COMPUTE_PGM_RSRC_TWO_RESERVED1_SHIFT:=31): 'AMD_COMPUTE_PGM_RSRC_TWO_RESERVED1_SHIFT', (AMD_COMPUTE_PGM_RSRC_TWO_RESERVED1_WIDTH:=1): 'AMD_COMPUTE_PGM_RSRC_TWO_RESERVED1_WIDTH', (AMD_COMPUTE_PGM_RSRC_TWO_RESERVED1:=-2147483648): 'AMD_COMPUTE_PGM_RSRC_TWO_RESERVED1'} +enum_amd_element_byte_size_t: dict[int, str] = {(AMD_ELEMENT_BYTE_SIZE_2:=0): 'AMD_ELEMENT_BYTE_SIZE_2', (AMD_ELEMENT_BYTE_SIZE_4:=1): 'AMD_ELEMENT_BYTE_SIZE_4', (AMD_ELEMENT_BYTE_SIZE_8:=2): 'AMD_ELEMENT_BYTE_SIZE_8', (AMD_ELEMENT_BYTE_SIZE_16:=3): 'AMD_ELEMENT_BYTE_SIZE_16'} +amd_kernel_code_properties32_t: TypeAlias = ctypes.c_uint32 +enum_amd_kernel_code_properties_t: dict[int, str] = {(AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT:=0): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_PTR_SHIFT:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_PTR_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_PTR_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_PTR_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_PTR:=2): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_PTR', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_QUEUE_PTR_SHIFT:=2): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_QUEUE_PTR_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_QUEUE_PTR_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_QUEUE_PTR_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_QUEUE_PTR:=4): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_QUEUE_PTR', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT:=3): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_KERNARG_SEGMENT_PTR_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_KERNARG_SEGMENT_PTR_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_KERNARG_SEGMENT_PTR_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_KERNARG_SEGMENT_PTR:=8): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_KERNARG_SEGMENT_PTR', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_ID_SHIFT:=4): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_ID_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_ID_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_ID_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_ID:=16): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_ID', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_FLAT_SCRATCH_INIT_SHIFT:=5): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_FLAT_SCRATCH_INIT_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_FLAT_SCRATCH_INIT_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_FLAT_SCRATCH_INIT_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_FLAT_SCRATCH_INIT:=32): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_FLAT_SCRATCH_INIT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_SHIFT:=6): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE:=64): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_X_SHIFT:=7): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_X_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_X_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_X_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_X:=128): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_X', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Y_SHIFT:=8): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Y_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Y_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Y_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Y:=256): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Y', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Z_SHIFT:=9): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Z_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Z_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Z_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Z:=512): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_GRID_WORKGROUP_COUNT_Z', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_WAVEFRONT_SIZE32_SHIFT:=10): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_WAVEFRONT_SIZE32_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_WAVEFRONT_SIZE32_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_WAVEFRONT_SIZE32_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_WAVEFRONT_SIZE32:=1024): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_WAVEFRONT_SIZE32', (AMD_KERNEL_CODE_PROPERTIES_RESERVED1_SHIFT:=11): 'AMD_KERNEL_CODE_PROPERTIES_RESERVED1_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_RESERVED1_WIDTH:=5): 'AMD_KERNEL_CODE_PROPERTIES_RESERVED1_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_RESERVED1:=63488): 'AMD_KERNEL_CODE_PROPERTIES_RESERVED1', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_ORDERED_APPEND_GDS_SHIFT:=16): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_ORDERED_APPEND_GDS_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_ORDERED_APPEND_GDS_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_ORDERED_APPEND_GDS_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_ENABLE_ORDERED_APPEND_GDS:=65536): 'AMD_KERNEL_CODE_PROPERTIES_ENABLE_ORDERED_APPEND_GDS', (AMD_KERNEL_CODE_PROPERTIES_PRIVATE_ELEMENT_SIZE_SHIFT:=17): 'AMD_KERNEL_CODE_PROPERTIES_PRIVATE_ELEMENT_SIZE_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_PRIVATE_ELEMENT_SIZE_WIDTH:=2): 'AMD_KERNEL_CODE_PROPERTIES_PRIVATE_ELEMENT_SIZE_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_PRIVATE_ELEMENT_SIZE:=393216): 'AMD_KERNEL_CODE_PROPERTIES_PRIVATE_ELEMENT_SIZE', (AMD_KERNEL_CODE_PROPERTIES_IS_PTR64_SHIFT:=19): 'AMD_KERNEL_CODE_PROPERTIES_IS_PTR64_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_IS_PTR64_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_IS_PTR64_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_IS_PTR64:=524288): 'AMD_KERNEL_CODE_PROPERTIES_IS_PTR64', (AMD_KERNEL_CODE_PROPERTIES_IS_DYNAMIC_CALLSTACK_SHIFT:=20): 'AMD_KERNEL_CODE_PROPERTIES_IS_DYNAMIC_CALLSTACK_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_IS_DYNAMIC_CALLSTACK_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_IS_DYNAMIC_CALLSTACK_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_IS_DYNAMIC_CALLSTACK:=1048576): 'AMD_KERNEL_CODE_PROPERTIES_IS_DYNAMIC_CALLSTACK', (AMD_KERNEL_CODE_PROPERTIES_IS_DEBUG_ENABLED_SHIFT:=21): 'AMD_KERNEL_CODE_PROPERTIES_IS_DEBUG_ENABLED_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_IS_DEBUG_ENABLED_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_IS_DEBUG_ENABLED_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_IS_DEBUG_ENABLED:=2097152): 'AMD_KERNEL_CODE_PROPERTIES_IS_DEBUG_ENABLED', (AMD_KERNEL_CODE_PROPERTIES_IS_XNACK_ENABLED_SHIFT:=22): 'AMD_KERNEL_CODE_PROPERTIES_IS_XNACK_ENABLED_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_IS_XNACK_ENABLED_WIDTH:=1): 'AMD_KERNEL_CODE_PROPERTIES_IS_XNACK_ENABLED_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_IS_XNACK_ENABLED:=4194304): 'AMD_KERNEL_CODE_PROPERTIES_IS_XNACK_ENABLED', (AMD_KERNEL_CODE_PROPERTIES_RESERVED2_SHIFT:=23): 'AMD_KERNEL_CODE_PROPERTIES_RESERVED2_SHIFT', (AMD_KERNEL_CODE_PROPERTIES_RESERVED2_WIDTH:=9): 'AMD_KERNEL_CODE_PROPERTIES_RESERVED2_WIDTH', (AMD_KERNEL_CODE_PROPERTIES_RESERVED2:=-8388608): 'AMD_KERNEL_CODE_PROPERTIES_RESERVED2'} +amd_powertwo8_t: TypeAlias = ctypes.c_ubyte +enum_amd_powertwo_t: dict[int, str] = {(AMD_POWERTWO_1:=0): 'AMD_POWERTWO_1', (AMD_POWERTWO_2:=1): 'AMD_POWERTWO_2', (AMD_POWERTWO_4:=2): 'AMD_POWERTWO_4', (AMD_POWERTWO_8:=3): 'AMD_POWERTWO_8', (AMD_POWERTWO_16:=4): 'AMD_POWERTWO_16', (AMD_POWERTWO_32:=5): 'AMD_POWERTWO_32', (AMD_POWERTWO_64:=6): 'AMD_POWERTWO_64', (AMD_POWERTWO_128:=7): 'AMD_POWERTWO_128', (AMD_POWERTWO_256:=8): 'AMD_POWERTWO_256'} +amd_enabled_control_directive64_t: TypeAlias = ctypes.c_uint64 +enum_amd_enabled_control_directive_t: dict[int, str] = {(AMD_ENABLED_CONTROL_DIRECTIVE_ENABLE_BREAK_EXCEPTIONS:=1): 'AMD_ENABLED_CONTROL_DIRECTIVE_ENABLE_BREAK_EXCEPTIONS', (AMD_ENABLED_CONTROL_DIRECTIVE_ENABLE_DETECT_EXCEPTIONS:=2): 'AMD_ENABLED_CONTROL_DIRECTIVE_ENABLE_DETECT_EXCEPTIONS', (AMD_ENABLED_CONTROL_DIRECTIVE_MAX_DYNAMIC_GROUP_SIZE:=4): 'AMD_ENABLED_CONTROL_DIRECTIVE_MAX_DYNAMIC_GROUP_SIZE', (AMD_ENABLED_CONTROL_DIRECTIVE_MAX_FLAT_GRID_SIZE:=8): 'AMD_ENABLED_CONTROL_DIRECTIVE_MAX_FLAT_GRID_SIZE', (AMD_ENABLED_CONTROL_DIRECTIVE_MAX_FLAT_WORKGROUP_SIZE:=16): 'AMD_ENABLED_CONTROL_DIRECTIVE_MAX_FLAT_WORKGROUP_SIZE', (AMD_ENABLED_CONTROL_DIRECTIVE_REQUIRED_DIM:=32): 'AMD_ENABLED_CONTROL_DIRECTIVE_REQUIRED_DIM', (AMD_ENABLED_CONTROL_DIRECTIVE_REQUIRED_GRID_SIZE:=64): 'AMD_ENABLED_CONTROL_DIRECTIVE_REQUIRED_GRID_SIZE', (AMD_ENABLED_CONTROL_DIRECTIVE_REQUIRED_WORKGROUP_SIZE:=128): 'AMD_ENABLED_CONTROL_DIRECTIVE_REQUIRED_WORKGROUP_SIZE', (AMD_ENABLED_CONTROL_DIRECTIVE_REQUIRE_NO_PARTIAL_WORKGROUPS:=256): 'AMD_ENABLED_CONTROL_DIRECTIVE_REQUIRE_NO_PARTIAL_WORKGROUPS'} +amd_exception_kind16_t: TypeAlias = ctypes.c_uint16 +enum_amd_exception_kind_t: dict[int, str] = {(AMD_EXCEPTION_KIND_INVALID_OPERATION:=1): 'AMD_EXCEPTION_KIND_INVALID_OPERATION', (AMD_EXCEPTION_KIND_DIVISION_BY_ZERO:=2): 'AMD_EXCEPTION_KIND_DIVISION_BY_ZERO', (AMD_EXCEPTION_KIND_OVERFLOW:=4): 'AMD_EXCEPTION_KIND_OVERFLOW', (AMD_EXCEPTION_KIND_UNDERFLOW:=8): 'AMD_EXCEPTION_KIND_UNDERFLOW', (AMD_EXCEPTION_KIND_INEXACT:=16): 'AMD_EXCEPTION_KIND_INEXACT'} +@c.record +class struct_amd_control_directives_s(c.Struct): + SIZE = 128 + enabled_control_directives: int + enable_break_exceptions: int + enable_detect_exceptions: int + max_dynamic_group_size: int + max_flat_grid_size: int + max_flat_workgroup_size: int + required_dim: int + reserved1: c.Array[ctypes.c_ubyte, Literal[3]] + required_grid_size: c.Array[ctypes.c_uint64, Literal[3]] + required_workgroup_size: c.Array[ctypes.c_uint32, Literal[3]] + reserved2: c.Array[ctypes.c_ubyte, Literal[60]] +struct_amd_control_directives_s.register_fields([('enabled_control_directives', amd_enabled_control_directive64_t, 0), ('enable_break_exceptions', uint16_t, 8), ('enable_detect_exceptions', uint16_t, 10), ('max_dynamic_group_size', uint32_t, 12), ('max_flat_grid_size', uint64_t, 16), ('max_flat_workgroup_size', uint32_t, 24), ('required_dim', uint8_t, 28), ('reserved1', c.Array[uint8_t, Literal[3]], 29), ('required_grid_size', c.Array[uint64_t, Literal[3]], 32), ('required_workgroup_size', c.Array[uint32_t, Literal[3]], 56), ('reserved2', c.Array[uint8_t, Literal[60]], 68)]) +amd_control_directives_t: TypeAlias = struct_amd_control_directives_s +@c.record +class struct_amd_kernel_code_s(c.Struct): + SIZE = 256 + amd_kernel_code_version_major: int + amd_kernel_code_version_minor: int + amd_machine_kind: int + amd_machine_version_major: int + amd_machine_version_minor: int + amd_machine_version_stepping: int + kernel_code_entry_byte_offset: int + kernel_code_prefetch_byte_offset: int + kernel_code_prefetch_byte_size: int + max_scratch_backing_memory_byte_size: int + compute_pgm_rsrc1: int + compute_pgm_rsrc2: int + kernel_code_properties: int + workitem_private_segment_byte_size: int + workgroup_group_segment_byte_size: int + gds_segment_byte_size: int + kernarg_segment_byte_size: int + workgroup_fbarrier_count: int + wavefront_sgpr_count: int + workitem_vgpr_count: int + reserved_vgpr_first: int + reserved_vgpr_count: int + reserved_sgpr_first: int + reserved_sgpr_count: int + debug_wavefront_private_segment_offset_sgpr: int + debug_private_segment_buffer_sgpr: int + kernarg_segment_alignment: int + group_segment_alignment: int + private_segment_alignment: int + wavefront_size: int + call_convention: int + reserved1: c.Array[ctypes.c_ubyte, Literal[12]] + runtime_loader_kernel_symbol: int + control_directives: struct_amd_control_directives_s +int32_t: TypeAlias = ctypes.c_int32 +struct_amd_kernel_code_s.register_fields([('amd_kernel_code_version_major', amd_kernel_code_version32_t, 0), ('amd_kernel_code_version_minor', amd_kernel_code_version32_t, 4), ('amd_machine_kind', amd_machine_kind16_t, 8), ('amd_machine_version_major', amd_machine_version16_t, 10), ('amd_machine_version_minor', amd_machine_version16_t, 12), ('amd_machine_version_stepping', amd_machine_version16_t, 14), ('kernel_code_entry_byte_offset', int64_t, 16), ('kernel_code_prefetch_byte_offset', int64_t, 24), ('kernel_code_prefetch_byte_size', uint64_t, 32), ('max_scratch_backing_memory_byte_size', uint64_t, 40), ('compute_pgm_rsrc1', amd_compute_pgm_rsrc_one32_t, 48), ('compute_pgm_rsrc2', amd_compute_pgm_rsrc_two32_t, 52), ('kernel_code_properties', amd_kernel_code_properties32_t, 56), ('workitem_private_segment_byte_size', uint32_t, 60), ('workgroup_group_segment_byte_size', uint32_t, 64), ('gds_segment_byte_size', uint32_t, 68), ('kernarg_segment_byte_size', uint64_t, 72), ('workgroup_fbarrier_count', uint32_t, 80), ('wavefront_sgpr_count', uint16_t, 84), ('workitem_vgpr_count', uint16_t, 86), ('reserved_vgpr_first', uint16_t, 88), ('reserved_vgpr_count', uint16_t, 90), ('reserved_sgpr_first', uint16_t, 92), ('reserved_sgpr_count', uint16_t, 94), ('debug_wavefront_private_segment_offset_sgpr', uint16_t, 96), ('debug_private_segment_buffer_sgpr', uint16_t, 98), ('kernarg_segment_alignment', amd_powertwo8_t, 100), ('group_segment_alignment', amd_powertwo8_t, 101), ('private_segment_alignment', amd_powertwo8_t, 102), ('wavefront_size', amd_powertwo8_t, 103), ('call_convention', int32_t, 104), ('reserved1', c.Array[uint8_t, Literal[12]], 108), ('runtime_loader_kernel_symbol', uint64_t, 120), ('control_directives', amd_control_directives_t, 128)]) +amd_kernel_code_t: TypeAlias = struct_amd_kernel_code_s +@c.record +class struct_amd_runtime_loader_debug_info_s(c.Struct): + SIZE = 32 + elf_raw: ctypes.c_void_p + elf_size: int + kernel_name: c.POINTER[ctypes.c_char] + owning_segment: ctypes.c_void_p +struct_amd_runtime_loader_debug_info_s.register_fields([('elf_raw', ctypes.c_void_p, 0), ('elf_size', size_t, 8), ('kernel_name', c.POINTER[ctypes.c_char], 16), ('owning_segment', ctypes.c_void_p, 24)]) +amd_runtime_loader_debug_info_t: TypeAlias = struct_amd_runtime_loader_debug_info_s +class struct_BrigModuleHeader(c.Struct): pass +BrigModule_t: TypeAlias = c.POINTER[struct_BrigModuleHeader] +_anonenum1: dict[int, str] = {(HSA_EXT_STATUS_ERROR_INVALID_PROGRAM:=8192): 'HSA_EXT_STATUS_ERROR_INVALID_PROGRAM', (HSA_EXT_STATUS_ERROR_INVALID_MODULE:=8193): 'HSA_EXT_STATUS_ERROR_INVALID_MODULE', (HSA_EXT_STATUS_ERROR_INCOMPATIBLE_MODULE:=8194): 'HSA_EXT_STATUS_ERROR_INCOMPATIBLE_MODULE', (HSA_EXT_STATUS_ERROR_MODULE_ALREADY_INCLUDED:=8195): 'HSA_EXT_STATUS_ERROR_MODULE_ALREADY_INCLUDED', (HSA_EXT_STATUS_ERROR_SYMBOL_MISMATCH:=8196): 'HSA_EXT_STATUS_ERROR_SYMBOL_MISMATCH', (HSA_EXT_STATUS_ERROR_FINALIZATION_FAILED:=8197): 'HSA_EXT_STATUS_ERROR_FINALIZATION_FAILED', (HSA_EXT_STATUS_ERROR_DIRECTIVE_MISMATCH:=8198): 'HSA_EXT_STATUS_ERROR_DIRECTIVE_MISMATCH'} +hsa_ext_module_t: TypeAlias = c.POINTER[struct_BrigModuleHeader] +@c.record +class struct_hsa_ext_program_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_ext_program_s.register_fields([('handle', uint64_t, 0)]) +hsa_ext_program_t: TypeAlias = struct_hsa_ext_program_s +hsa_ext_program_info_t: dict[int, str] = {(HSA_EXT_PROGRAM_INFO_MACHINE_MODEL:=0): 'HSA_EXT_PROGRAM_INFO_MACHINE_MODEL', (HSA_EXT_PROGRAM_INFO_PROFILE:=1): 'HSA_EXT_PROGRAM_INFO_PROFILE', (HSA_EXT_PROGRAM_INFO_DEFAULT_FLOAT_ROUNDING_MODE:=2): 'HSA_EXT_PROGRAM_INFO_DEFAULT_FLOAT_ROUNDING_MODE'} +hsa_ext_finalizer_call_convention_t: dict[int, str] = {(HSA_EXT_FINALIZER_CALL_CONVENTION_AUTO:=-1): 'HSA_EXT_FINALIZER_CALL_CONVENTION_AUTO'} +@c.record +class struct_hsa_ext_control_directives_s(c.Struct): + SIZE = 144 + control_directives_mask: int + break_exceptions_mask: int + detect_exceptions_mask: int + max_dynamic_group_size: int + max_flat_grid_size: int + max_flat_workgroup_size: int + reserved1: int + required_grid_size: c.Array[ctypes.c_uint64, Literal[3]] + required_workgroup_size: struct_hsa_dim3_s + required_dim: int + reserved2: c.Array[ctypes.c_ubyte, Literal[75]] +struct_hsa_ext_control_directives_s.register_fields([('control_directives_mask', uint64_t, 0), ('break_exceptions_mask', uint16_t, 8), ('detect_exceptions_mask', uint16_t, 10), ('max_dynamic_group_size', uint32_t, 12), ('max_flat_grid_size', uint64_t, 16), ('max_flat_workgroup_size', uint32_t, 24), ('reserved1', uint32_t, 28), ('required_grid_size', c.Array[uint64_t, Literal[3]], 32), ('required_workgroup_size', hsa_dim3_t, 56), ('required_dim', uint8_t, 68), ('reserved2', c.Array[uint8_t, Literal[75]], 69)]) +hsa_ext_control_directives_t: TypeAlias = struct_hsa_ext_control_directives_s +@c.record +class struct_hsa_ext_finalizer_1_00_pfn_s(c.Struct): + SIZE = 48 + hsa_ext_program_create: c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char], c.POINTER[struct_hsa_ext_program_s]]] + hsa_ext_program_destroy: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_ext_program_s]] + hsa_ext_program_add_module: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_ext_program_s, c.POINTER[struct_BrigModuleHeader]]] + hsa_ext_program_iterate_modules: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_ext_program_s, c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_ext_program_s, c.POINTER[struct_BrigModuleHeader], ctypes.c_void_p]], ctypes.c_void_p]] + hsa_ext_program_get_info: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_ext_program_s, ctypes.c_uint32, ctypes.c_void_p]] + hsa_ext_program_finalize: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_ext_program_s, struct_hsa_isa_s, ctypes.c_int32, struct_hsa_ext_control_directives_s, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[struct_hsa_code_object_s]]] +struct_hsa_ext_finalizer_1_00_pfn_s.register_fields([('hsa_ext_program_create', c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char], c.POINTER[hsa_ext_program_t]]], 0), ('hsa_ext_program_destroy', c.CFUNCTYPE[ctypes.c_uint32, [hsa_ext_program_t]], 8), ('hsa_ext_program_add_module', c.CFUNCTYPE[ctypes.c_uint32, [hsa_ext_program_t, hsa_ext_module_t]], 16), ('hsa_ext_program_iterate_modules', c.CFUNCTYPE[ctypes.c_uint32, [hsa_ext_program_t, c.CFUNCTYPE[ctypes.c_uint32, [hsa_ext_program_t, hsa_ext_module_t, ctypes.c_void_p]], ctypes.c_void_p]], 24), ('hsa_ext_program_get_info', c.CFUNCTYPE[ctypes.c_uint32, [hsa_ext_program_t, ctypes.c_uint32, ctypes.c_void_p]], 32), ('hsa_ext_program_finalize', c.CFUNCTYPE[ctypes.c_uint32, [hsa_ext_program_t, hsa_isa_t, int32_t, hsa_ext_control_directives_t, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[hsa_code_object_t]]], 40)]) +hsa_ext_finalizer_1_00_pfn_t: TypeAlias = struct_hsa_ext_finalizer_1_00_pfn_s +_anonenum2: dict[int, str] = {(HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED:=12288): 'HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED', (HSA_EXT_STATUS_ERROR_IMAGE_SIZE_UNSUPPORTED:=12289): 'HSA_EXT_STATUS_ERROR_IMAGE_SIZE_UNSUPPORTED', (HSA_EXT_STATUS_ERROR_IMAGE_PITCH_UNSUPPORTED:=12290): 'HSA_EXT_STATUS_ERROR_IMAGE_PITCH_UNSUPPORTED', (HSA_EXT_STATUS_ERROR_SAMPLER_DESCRIPTOR_UNSUPPORTED:=12291): 'HSA_EXT_STATUS_ERROR_SAMPLER_DESCRIPTOR_UNSUPPORTED'} +_anonenum3: dict[int, str] = {(HSA_EXT_AGENT_INFO_IMAGE_1D_MAX_ELEMENTS:=12288): 'HSA_EXT_AGENT_INFO_IMAGE_1D_MAX_ELEMENTS', (HSA_EXT_AGENT_INFO_IMAGE_1DA_MAX_ELEMENTS:=12289): 'HSA_EXT_AGENT_INFO_IMAGE_1DA_MAX_ELEMENTS', (HSA_EXT_AGENT_INFO_IMAGE_1DB_MAX_ELEMENTS:=12290): 'HSA_EXT_AGENT_INFO_IMAGE_1DB_MAX_ELEMENTS', (HSA_EXT_AGENT_INFO_IMAGE_2D_MAX_ELEMENTS:=12291): 'HSA_EXT_AGENT_INFO_IMAGE_2D_MAX_ELEMENTS', (HSA_EXT_AGENT_INFO_IMAGE_2DA_MAX_ELEMENTS:=12292): 'HSA_EXT_AGENT_INFO_IMAGE_2DA_MAX_ELEMENTS', (HSA_EXT_AGENT_INFO_IMAGE_2DDEPTH_MAX_ELEMENTS:=12293): 'HSA_EXT_AGENT_INFO_IMAGE_2DDEPTH_MAX_ELEMENTS', (HSA_EXT_AGENT_INFO_IMAGE_2DADEPTH_MAX_ELEMENTS:=12294): 'HSA_EXT_AGENT_INFO_IMAGE_2DADEPTH_MAX_ELEMENTS', (HSA_EXT_AGENT_INFO_IMAGE_3D_MAX_ELEMENTS:=12295): 'HSA_EXT_AGENT_INFO_IMAGE_3D_MAX_ELEMENTS', (HSA_EXT_AGENT_INFO_IMAGE_ARRAY_MAX_LAYERS:=12296): 'HSA_EXT_AGENT_INFO_IMAGE_ARRAY_MAX_LAYERS', (HSA_EXT_AGENT_INFO_MAX_IMAGE_RD_HANDLES:=12297): 'HSA_EXT_AGENT_INFO_MAX_IMAGE_RD_HANDLES', (HSA_EXT_AGENT_INFO_MAX_IMAGE_RORW_HANDLES:=12298): 'HSA_EXT_AGENT_INFO_MAX_IMAGE_RORW_HANDLES', (HSA_EXT_AGENT_INFO_MAX_SAMPLER_HANDLERS:=12299): 'HSA_EXT_AGENT_INFO_MAX_SAMPLER_HANDLERS', (HSA_EXT_AGENT_INFO_IMAGE_LINEAR_ROW_PITCH_ALIGNMENT:=12300): 'HSA_EXT_AGENT_INFO_IMAGE_LINEAR_ROW_PITCH_ALIGNMENT'} +@c.record +class struct_hsa_ext_image_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_ext_image_s.register_fields([('handle', uint64_t, 0)]) +hsa_ext_image_t: TypeAlias = struct_hsa_ext_image_s +hsa_ext_image_geometry_t: dict[int, str] = {(HSA_EXT_IMAGE_GEOMETRY_1D:=0): 'HSA_EXT_IMAGE_GEOMETRY_1D', (HSA_EXT_IMAGE_GEOMETRY_2D:=1): 'HSA_EXT_IMAGE_GEOMETRY_2D', (HSA_EXT_IMAGE_GEOMETRY_3D:=2): 'HSA_EXT_IMAGE_GEOMETRY_3D', (HSA_EXT_IMAGE_GEOMETRY_1DA:=3): 'HSA_EXT_IMAGE_GEOMETRY_1DA', (HSA_EXT_IMAGE_GEOMETRY_2DA:=4): 'HSA_EXT_IMAGE_GEOMETRY_2DA', (HSA_EXT_IMAGE_GEOMETRY_1DB:=5): 'HSA_EXT_IMAGE_GEOMETRY_1DB', (HSA_EXT_IMAGE_GEOMETRY_2DDEPTH:=6): 'HSA_EXT_IMAGE_GEOMETRY_2DDEPTH', (HSA_EXT_IMAGE_GEOMETRY_2DADEPTH:=7): 'HSA_EXT_IMAGE_GEOMETRY_2DADEPTH'} +hsa_ext_image_channel_type_t: dict[int, str] = {(HSA_EXT_IMAGE_CHANNEL_TYPE_SNORM_INT8:=0): 'HSA_EXT_IMAGE_CHANNEL_TYPE_SNORM_INT8', (HSA_EXT_IMAGE_CHANNEL_TYPE_SNORM_INT16:=1): 'HSA_EXT_IMAGE_CHANNEL_TYPE_SNORM_INT16', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT8:=2): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT8', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT16:=3): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT16', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT24:=4): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT24', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_555:=5): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_555', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_565:=6): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_565', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_101010:=7): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_101010', (HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT8:=8): 'HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT8', (HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT16:=9): 'HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT16', (HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT32:=10): 'HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT32', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8:=11): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16:=12): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16', (HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32:=13): 'HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32', (HSA_EXT_IMAGE_CHANNEL_TYPE_HALF_FLOAT:=14): 'HSA_EXT_IMAGE_CHANNEL_TYPE_HALF_FLOAT', (HSA_EXT_IMAGE_CHANNEL_TYPE_FLOAT:=15): 'HSA_EXT_IMAGE_CHANNEL_TYPE_FLOAT'} +hsa_ext_image_channel_type32_t: TypeAlias = ctypes.c_uint32 +hsa_ext_image_channel_order_t: dict[int, str] = {(HSA_EXT_IMAGE_CHANNEL_ORDER_A:=0): 'HSA_EXT_IMAGE_CHANNEL_ORDER_A', (HSA_EXT_IMAGE_CHANNEL_ORDER_R:=1): 'HSA_EXT_IMAGE_CHANNEL_ORDER_R', (HSA_EXT_IMAGE_CHANNEL_ORDER_RX:=2): 'HSA_EXT_IMAGE_CHANNEL_ORDER_RX', (HSA_EXT_IMAGE_CHANNEL_ORDER_RG:=3): 'HSA_EXT_IMAGE_CHANNEL_ORDER_RG', (HSA_EXT_IMAGE_CHANNEL_ORDER_RGX:=4): 'HSA_EXT_IMAGE_CHANNEL_ORDER_RGX', (HSA_EXT_IMAGE_CHANNEL_ORDER_RA:=5): 'HSA_EXT_IMAGE_CHANNEL_ORDER_RA', (HSA_EXT_IMAGE_CHANNEL_ORDER_RGB:=6): 'HSA_EXT_IMAGE_CHANNEL_ORDER_RGB', (HSA_EXT_IMAGE_CHANNEL_ORDER_RGBX:=7): 'HSA_EXT_IMAGE_CHANNEL_ORDER_RGBX', (HSA_EXT_IMAGE_CHANNEL_ORDER_RGBA:=8): 'HSA_EXT_IMAGE_CHANNEL_ORDER_RGBA', (HSA_EXT_IMAGE_CHANNEL_ORDER_BGRA:=9): 'HSA_EXT_IMAGE_CHANNEL_ORDER_BGRA', (HSA_EXT_IMAGE_CHANNEL_ORDER_ARGB:=10): 'HSA_EXT_IMAGE_CHANNEL_ORDER_ARGB', (HSA_EXT_IMAGE_CHANNEL_ORDER_ABGR:=11): 'HSA_EXT_IMAGE_CHANNEL_ORDER_ABGR', (HSA_EXT_IMAGE_CHANNEL_ORDER_SRGB:=12): 'HSA_EXT_IMAGE_CHANNEL_ORDER_SRGB', (HSA_EXT_IMAGE_CHANNEL_ORDER_SRGBX:=13): 'HSA_EXT_IMAGE_CHANNEL_ORDER_SRGBX', (HSA_EXT_IMAGE_CHANNEL_ORDER_SRGBA:=14): 'HSA_EXT_IMAGE_CHANNEL_ORDER_SRGBA', (HSA_EXT_IMAGE_CHANNEL_ORDER_SBGRA:=15): 'HSA_EXT_IMAGE_CHANNEL_ORDER_SBGRA', (HSA_EXT_IMAGE_CHANNEL_ORDER_INTENSITY:=16): 'HSA_EXT_IMAGE_CHANNEL_ORDER_INTENSITY', (HSA_EXT_IMAGE_CHANNEL_ORDER_LUMINANCE:=17): 'HSA_EXT_IMAGE_CHANNEL_ORDER_LUMINANCE', (HSA_EXT_IMAGE_CHANNEL_ORDER_DEPTH:=18): 'HSA_EXT_IMAGE_CHANNEL_ORDER_DEPTH', (HSA_EXT_IMAGE_CHANNEL_ORDER_DEPTH_STENCIL:=19): 'HSA_EXT_IMAGE_CHANNEL_ORDER_DEPTH_STENCIL'} +hsa_ext_image_channel_order32_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_hsa_ext_image_format_s(c.Struct): + SIZE = 8 + channel_type: int + channel_order: int +struct_hsa_ext_image_format_s.register_fields([('channel_type', hsa_ext_image_channel_type32_t, 0), ('channel_order', hsa_ext_image_channel_order32_t, 4)]) +hsa_ext_image_format_t: TypeAlias = struct_hsa_ext_image_format_s +@c.record +class struct_hsa_ext_image_descriptor_s(c.Struct): + SIZE = 48 + geometry: int + width: int + height: int + depth: int + array_size: int + format: struct_hsa_ext_image_format_s +struct_hsa_ext_image_descriptor_s.register_fields([('geometry', ctypes.c_uint32, 0), ('width', size_t, 8), ('height', size_t, 16), ('depth', size_t, 24), ('array_size', size_t, 32), ('format', hsa_ext_image_format_t, 40)]) +hsa_ext_image_descriptor_t: TypeAlias = struct_hsa_ext_image_descriptor_s +hsa_ext_image_capability_t: dict[int, str] = {(HSA_EXT_IMAGE_CAPABILITY_NOT_SUPPORTED:=0): 'HSA_EXT_IMAGE_CAPABILITY_NOT_SUPPORTED', (HSA_EXT_IMAGE_CAPABILITY_READ_ONLY:=1): 'HSA_EXT_IMAGE_CAPABILITY_READ_ONLY', (HSA_EXT_IMAGE_CAPABILITY_WRITE_ONLY:=2): 'HSA_EXT_IMAGE_CAPABILITY_WRITE_ONLY', (HSA_EXT_IMAGE_CAPABILITY_READ_WRITE:=4): 'HSA_EXT_IMAGE_CAPABILITY_READ_WRITE', (HSA_EXT_IMAGE_CAPABILITY_READ_MODIFY_WRITE:=8): 'HSA_EXT_IMAGE_CAPABILITY_READ_MODIFY_WRITE', (HSA_EXT_IMAGE_CAPABILITY_ACCESS_INVARIANT_DATA_LAYOUT:=16): 'HSA_EXT_IMAGE_CAPABILITY_ACCESS_INVARIANT_DATA_LAYOUT'} +hsa_ext_image_data_layout_t: dict[int, str] = {(HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE:=0): 'HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE', (HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR:=1): 'HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR'} +@c.record +class struct_hsa_ext_image_data_info_s(c.Struct): + SIZE = 16 + size: int + alignment: int +struct_hsa_ext_image_data_info_s.register_fields([('size', size_t, 0), ('alignment', size_t, 8)]) +hsa_ext_image_data_info_t: TypeAlias = struct_hsa_ext_image_data_info_s +@c.record +class struct_hsa_ext_image_region_s(c.Struct): + SIZE = 24 + offset: struct_hsa_dim3_s + range: struct_hsa_dim3_s +struct_hsa_ext_image_region_s.register_fields([('offset', hsa_dim3_t, 0), ('range', hsa_dim3_t, 12)]) +hsa_ext_image_region_t: TypeAlias = struct_hsa_ext_image_region_s +@c.record +class struct_hsa_ext_sampler_s(c.Struct): + SIZE = 8 + handle: int +struct_hsa_ext_sampler_s.register_fields([('handle', uint64_t, 0)]) +hsa_ext_sampler_t: TypeAlias = struct_hsa_ext_sampler_s +hsa_ext_sampler_addressing_mode_t: dict[int, str] = {(HSA_EXT_SAMPLER_ADDRESSING_MODE_UNDEFINED:=0): 'HSA_EXT_SAMPLER_ADDRESSING_MODE_UNDEFINED', (HSA_EXT_SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE:=1): 'HSA_EXT_SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE', (HSA_EXT_SAMPLER_ADDRESSING_MODE_CLAMP_TO_BORDER:=2): 'HSA_EXT_SAMPLER_ADDRESSING_MODE_CLAMP_TO_BORDER', (HSA_EXT_SAMPLER_ADDRESSING_MODE_REPEAT:=3): 'HSA_EXT_SAMPLER_ADDRESSING_MODE_REPEAT', (HSA_EXT_SAMPLER_ADDRESSING_MODE_MIRRORED_REPEAT:=4): 'HSA_EXT_SAMPLER_ADDRESSING_MODE_MIRRORED_REPEAT'} +hsa_ext_sampler_addressing_mode32_t: TypeAlias = ctypes.c_uint32 +hsa_ext_sampler_coordinate_mode_t: dict[int, str] = {(HSA_EXT_SAMPLER_COORDINATE_MODE_UNNORMALIZED:=0): 'HSA_EXT_SAMPLER_COORDINATE_MODE_UNNORMALIZED', (HSA_EXT_SAMPLER_COORDINATE_MODE_NORMALIZED:=1): 'HSA_EXT_SAMPLER_COORDINATE_MODE_NORMALIZED'} +hsa_ext_sampler_coordinate_mode32_t: TypeAlias = ctypes.c_uint32 +hsa_ext_sampler_filter_mode_t: dict[int, str] = {(HSA_EXT_SAMPLER_FILTER_MODE_NEAREST:=0): 'HSA_EXT_SAMPLER_FILTER_MODE_NEAREST', (HSA_EXT_SAMPLER_FILTER_MODE_LINEAR:=1): 'HSA_EXT_SAMPLER_FILTER_MODE_LINEAR'} +hsa_ext_sampler_filter_mode32_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_hsa_ext_sampler_descriptor_s(c.Struct): + SIZE = 12 + coordinate_mode: int + filter_mode: int + address_mode: int +struct_hsa_ext_sampler_descriptor_s.register_fields([('coordinate_mode', hsa_ext_sampler_coordinate_mode32_t, 0), ('filter_mode', hsa_ext_sampler_filter_mode32_t, 4), ('address_mode', hsa_ext_sampler_addressing_mode32_t, 8)]) +hsa_ext_sampler_descriptor_t: TypeAlias = struct_hsa_ext_sampler_descriptor_s +@c.record +class struct_hsa_ext_sampler_descriptor_v2_s(c.Struct): + SIZE = 20 + coordinate_mode: int + filter_mode: int + address_modes: c.Array[ctypes.c_uint32, Literal[3]] +struct_hsa_ext_sampler_descriptor_v2_s.register_fields([('coordinate_mode', hsa_ext_sampler_coordinate_mode32_t, 0), ('filter_mode', hsa_ext_sampler_filter_mode32_t, 4), ('address_modes', c.Array[hsa_ext_sampler_addressing_mode32_t, Literal[3]], 8)]) +hsa_ext_sampler_descriptor_v2_t: TypeAlias = struct_hsa_ext_sampler_descriptor_v2_s +@c.record +class struct_hsa_ext_images_1_00_pfn_s(c.Struct): + SIZE = 80 + hsa_ext_image_get_capability: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, ctypes.c_uint32, c.POINTER[struct_hsa_ext_image_format_s], c.POINTER[ctypes.c_uint32]]] + hsa_ext_image_data_get_info: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_image_descriptor_s], ctypes.c_uint32, c.POINTER[struct_hsa_ext_image_data_info_s]]] + hsa_ext_image_create: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_image_descriptor_s], ctypes.c_void_p, ctypes.c_uint32, c.POINTER[struct_hsa_ext_image_s]]] + hsa_ext_image_destroy: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_image_s]] + hsa_ext_image_copy: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_image_s, c.POINTER[struct_hsa_dim3_s], struct_hsa_ext_image_s, c.POINTER[struct_hsa_dim3_s], c.POINTER[struct_hsa_dim3_s]]] + hsa_ext_image_import: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint64, struct_hsa_ext_image_s, c.POINTER[struct_hsa_ext_image_region_s]]] + hsa_ext_image_export: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_image_s, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint64, c.POINTER[struct_hsa_ext_image_region_s]]] + hsa_ext_image_clear: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_image_s, ctypes.c_void_p, c.POINTER[struct_hsa_ext_image_region_s]]] + hsa_ext_sampler_create: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_sampler_descriptor_s], c.POINTER[struct_hsa_ext_sampler_s]]] + hsa_ext_sampler_destroy: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_sampler_s]] +struct_hsa_ext_images_1_00_pfn_s.register_fields([('hsa_ext_image_get_capability', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, ctypes.c_uint32, c.POINTER[hsa_ext_image_format_t], c.POINTER[uint32_t]]], 0), ('hsa_ext_image_data_get_info', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_image_descriptor_t], ctypes.c_uint32, c.POINTER[hsa_ext_image_data_info_t]]], 8), ('hsa_ext_image_create', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_image_descriptor_t], ctypes.c_void_p, ctypes.c_uint32, c.POINTER[hsa_ext_image_t]]], 16), ('hsa_ext_image_destroy', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_image_t]], 24), ('hsa_ext_image_copy', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_image_t, c.POINTER[hsa_dim3_t], hsa_ext_image_t, c.POINTER[hsa_dim3_t], c.POINTER[hsa_dim3_t]]], 32), ('hsa_ext_image_import', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, ctypes.c_void_p, size_t, size_t, hsa_ext_image_t, c.POINTER[hsa_ext_image_region_t]]], 40), ('hsa_ext_image_export', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_image_t, ctypes.c_void_p, size_t, size_t, c.POINTER[hsa_ext_image_region_t]]], 48), ('hsa_ext_image_clear', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_image_t, ctypes.c_void_p, c.POINTER[hsa_ext_image_region_t]]], 56), ('hsa_ext_sampler_create', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_sampler_descriptor_t], c.POINTER[hsa_ext_sampler_t]]], 64), ('hsa_ext_sampler_destroy', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_sampler_t]], 72)]) +hsa_ext_images_1_00_pfn_t: TypeAlias = struct_hsa_ext_images_1_00_pfn_s +@c.record +class struct_hsa_ext_images_1_pfn_s(c.Struct): + SIZE = 112 + hsa_ext_image_get_capability: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, ctypes.c_uint32, c.POINTER[struct_hsa_ext_image_format_s], c.POINTER[ctypes.c_uint32]]] + hsa_ext_image_data_get_info: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_image_descriptor_s], ctypes.c_uint32, c.POINTER[struct_hsa_ext_image_data_info_s]]] + hsa_ext_image_create: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_image_descriptor_s], ctypes.c_void_p, ctypes.c_uint32, c.POINTER[struct_hsa_ext_image_s]]] + hsa_ext_image_destroy: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_image_s]] + hsa_ext_image_copy: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_image_s, c.POINTER[struct_hsa_dim3_s], struct_hsa_ext_image_s, c.POINTER[struct_hsa_dim3_s], c.POINTER[struct_hsa_dim3_s]]] + hsa_ext_image_import: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint64, struct_hsa_ext_image_s, c.POINTER[struct_hsa_ext_image_region_s]]] + hsa_ext_image_export: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_image_s, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint64, c.POINTER[struct_hsa_ext_image_region_s]]] + hsa_ext_image_clear: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_image_s, ctypes.c_void_p, c.POINTER[struct_hsa_ext_image_region_s]]] + hsa_ext_sampler_create: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_sampler_descriptor_s], c.POINTER[struct_hsa_ext_sampler_s]]] + hsa_ext_sampler_destroy: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, struct_hsa_ext_sampler_s]] + hsa_ext_image_get_capability_with_layout: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, ctypes.c_uint32, c.POINTER[struct_hsa_ext_image_format_s], ctypes.c_uint32, c.POINTER[ctypes.c_uint32]]] + hsa_ext_image_data_get_info_with_layout: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_image_descriptor_s], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint64, ctypes.c_uint64, c.POINTER[struct_hsa_ext_image_data_info_s]]] + hsa_ext_image_create_with_layout: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_image_descriptor_s], ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint64, ctypes.c_uint64, c.POINTER[struct_hsa_ext_image_s]]] + hsa_ext_sampler_create_v2: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[struct_hsa_ext_sampler_descriptor_v2_s], c.POINTER[struct_hsa_ext_sampler_s]]] +struct_hsa_ext_images_1_pfn_s.register_fields([('hsa_ext_image_get_capability', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, ctypes.c_uint32, c.POINTER[hsa_ext_image_format_t], c.POINTER[uint32_t]]], 0), ('hsa_ext_image_data_get_info', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_image_descriptor_t], ctypes.c_uint32, c.POINTER[hsa_ext_image_data_info_t]]], 8), ('hsa_ext_image_create', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_image_descriptor_t], ctypes.c_void_p, ctypes.c_uint32, c.POINTER[hsa_ext_image_t]]], 16), ('hsa_ext_image_destroy', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_image_t]], 24), ('hsa_ext_image_copy', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_image_t, c.POINTER[hsa_dim3_t], hsa_ext_image_t, c.POINTER[hsa_dim3_t], c.POINTER[hsa_dim3_t]]], 32), ('hsa_ext_image_import', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, ctypes.c_void_p, size_t, size_t, hsa_ext_image_t, c.POINTER[hsa_ext_image_region_t]]], 40), ('hsa_ext_image_export', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_image_t, ctypes.c_void_p, size_t, size_t, c.POINTER[hsa_ext_image_region_t]]], 48), ('hsa_ext_image_clear', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_image_t, ctypes.c_void_p, c.POINTER[hsa_ext_image_region_t]]], 56), ('hsa_ext_sampler_create', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_sampler_descriptor_t], c.POINTER[hsa_ext_sampler_t]]], 64), ('hsa_ext_sampler_destroy', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ext_sampler_t]], 72), ('hsa_ext_image_get_capability_with_layout', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, ctypes.c_uint32, c.POINTER[hsa_ext_image_format_t], ctypes.c_uint32, c.POINTER[uint32_t]]], 80), ('hsa_ext_image_data_get_info_with_layout', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_image_descriptor_t], ctypes.c_uint32, ctypes.c_uint32, size_t, size_t, c.POINTER[hsa_ext_image_data_info_t]]], 88), ('hsa_ext_image_create_with_layout', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_image_descriptor_t], ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, size_t, size_t, c.POINTER[hsa_ext_image_t]]], 96), ('hsa_ext_sampler_create_v2', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ext_sampler_descriptor_v2_t], c.POINTER[hsa_ext_sampler_t]]], 104)]) +hsa_ext_images_1_pfn_t: TypeAlias = struct_hsa_ext_images_1_pfn_s +hsa_ven_amd_aqlprofile_event_type_t: dict[int, str] = {(HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_PMC:=0): 'HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_PMC', (HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_TRACE:=1): 'HSA_VEN_AMD_AQLPROFILE_EVENT_TYPE_TRACE'} +hsa_ven_amd_aqlprofile_block_name_t: dict[int, str] = {(HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPC:=0): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPC', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPF:=1): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_CPF', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GDS:=2): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GDS', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GRBM:=3): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GRBM', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GRBMSE:=4): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GRBMSE', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SPI:=5): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SPI', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQ:=6): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQ', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQCS:=7): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SQCS', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SRBM:=8): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SRBM', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SX:=9): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SX', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TA:=10): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TA', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCA:=11): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCA', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCC:=12): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCC', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCP:=13): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TCP', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TD:=14): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_TD', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCARB:=15): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCARB', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCHUB:=16): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCHUB', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCMCBVM:=17): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCMCBVM', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCSEQ:=18): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCSEQ', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCVML2:=19): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCVML2', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCXBAR:=20): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MCXBAR', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_ATC:=21): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_ATC', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_ATCL2:=22): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_ATCL2', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GCEA:=23): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GCEA', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_RPB:=24): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_RPB', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SDMA:=25): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_SDMA', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GL1A:=26): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GL1A', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GL1C:=27): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GL1C', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GL2A:=28): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GL2A', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GL2C:=29): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GL2C', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GCR:=30): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GCR', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GUS:=31): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_GUS', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_UMC:=32): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_UMC', (HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MMEA:=33): 'HSA_VEN_AMD_AQLPROFILE_BLOCK_NAME_MMEA', (HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER:=34): 'HSA_VEN_AMD_AQLPROFILE_BLOCKS_NUMBER'} +@c.record +class hsa_ven_amd_aqlprofile_event_t(c.Struct): + SIZE = 12 + block_name: int + block_index: int + counter_id: int +hsa_ven_amd_aqlprofile_event_t.register_fields([('block_name', ctypes.c_uint32, 0), ('block_index', uint32_t, 4), ('counter_id', uint32_t, 8)]) +hsa_ven_amd_aqlprofile_parameter_name_t: dict[int, str] = {(HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_COMPUTE_UNIT_TARGET:=0): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_COMPUTE_UNIT_TARGET', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_VM_ID_MASK:=1): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_VM_ID_MASK', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_MASK:=2): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_MASK', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_TOKEN_MASK:=3): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_TOKEN_MASK', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_TOKEN_MASK2:=4): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_TOKEN_MASK2', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_SE_MASK:=5): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_SE_MASK', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_SAMPLE_RATE:=6): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_SAMPLE_RATE', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_K_CONCURRENT:=7): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_K_CONCURRENT', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_SIMD_SELECTION:=8): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_SIMD_SELECTION', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_OCCUPANCY_MODE:=9): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_OCCUPANCY_MODE', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_ATT_BUFFER_SIZE:=10): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_ATT_BUFFER_SIZE', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_PERFCOUNTER_MASK:=240): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_PERFCOUNTER_MASK', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_PERFCOUNTER_CTRL:=241): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_PERFCOUNTER_CTRL', (HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_PERFCOUNTER_NAME:=242): 'HSA_VEN_AMD_AQLPROFILE_PARAMETER_NAME_PERFCOUNTER_NAME'} +@c.record +class hsa_ven_amd_aqlprofile_parameter_t(c.Struct): + SIZE = 8 + parameter_name: int + value: int +hsa_ven_amd_aqlprofile_parameter_t.register_fields([('parameter_name', ctypes.c_uint32, 0), ('value', uint32_t, 4)]) +hsa_ven_amd_aqlprofile_att_marker_channel_t: dict[int, str] = {(HSA_VEN_AMD_AQLPROFILE_ATT_CHANNEL_0:=0): 'HSA_VEN_AMD_AQLPROFILE_ATT_CHANNEL_0', (HSA_VEN_AMD_AQLPROFILE_ATT_CHANNEL_1:=1): 'HSA_VEN_AMD_AQLPROFILE_ATT_CHANNEL_1', (HSA_VEN_AMD_AQLPROFILE_ATT_CHANNEL_2:=2): 'HSA_VEN_AMD_AQLPROFILE_ATT_CHANNEL_2', (HSA_VEN_AMD_AQLPROFILE_ATT_CHANNEL_3:=3): 'HSA_VEN_AMD_AQLPROFILE_ATT_CHANNEL_3'} +@c.record +class hsa_ven_amd_aqlprofile_descriptor_t(c.Struct): + SIZE = 16 + ptr: ctypes.c_void_p + size: int +hsa_ven_amd_aqlprofile_descriptor_t.register_fields([('ptr', ctypes.c_void_p, 0), ('size', uint32_t, 8)]) +@c.record +class hsa_ven_amd_aqlprofile_profile_t(c.Struct): + SIZE = 80 + agent: struct_hsa_agent_s + type: int + events: c.POINTER[hsa_ven_amd_aqlprofile_event_t] + event_count: int + parameters: c.POINTER[hsa_ven_amd_aqlprofile_parameter_t] + parameter_count: int + output_buffer: hsa_ven_amd_aqlprofile_descriptor_t + command_buffer: hsa_ven_amd_aqlprofile_descriptor_t +hsa_ven_amd_aqlprofile_profile_t.register_fields([('agent', hsa_agent_t, 0), ('type', ctypes.c_uint32, 8), ('events', c.POINTER[hsa_ven_amd_aqlprofile_event_t], 16), ('event_count', uint32_t, 24), ('parameters', c.POINTER[hsa_ven_amd_aqlprofile_parameter_t], 32), ('parameter_count', uint32_t, 40), ('output_buffer', hsa_ven_amd_aqlprofile_descriptor_t, 48), ('command_buffer', hsa_ven_amd_aqlprofile_descriptor_t, 64)]) +@c.record +class hsa_ext_amd_aql_pm4_packet_t(c.Struct): + SIZE = 64 + header: int + pm4_command: c.Array[ctypes.c_uint16, Literal[27]] + completion_signal: struct_hsa_signal_s +hsa_ext_amd_aql_pm4_packet_t.register_fields([('header', uint16_t, 0), ('pm4_command', c.Array[uint16_t, Literal[27]], 2), ('completion_signal', hsa_signal_t, 56)]) +@c.record +class hsa_ven_amd_aqlprofile_info_data_t(c.Struct): + SIZE = 32 + sample_id: int + pmc_data: hsa_ven_amd_aqlprofile_info_data_t_pmc_data + trace_data: hsa_ven_amd_aqlprofile_descriptor_t +@c.record +class hsa_ven_amd_aqlprofile_info_data_t_pmc_data(c.Struct): + SIZE = 24 + event: hsa_ven_amd_aqlprofile_event_t + result: int +hsa_ven_amd_aqlprofile_info_data_t_pmc_data.register_fields([('event', hsa_ven_amd_aqlprofile_event_t, 0), ('result', uint64_t, 16)]) +hsa_ven_amd_aqlprofile_info_data_t.register_fields([('sample_id', uint32_t, 0), ('pmc_data', hsa_ven_amd_aqlprofile_info_data_t_pmc_data, 8), ('trace_data', hsa_ven_amd_aqlprofile_descriptor_t, 8)]) +@c.record +class hsa_ven_amd_aqlprofile_id_query_t(c.Struct): + SIZE = 16 + name: c.POINTER[ctypes.c_char] + id: int + instance_count: int +hsa_ven_amd_aqlprofile_id_query_t.register_fields([('name', c.POINTER[ctypes.c_char], 0), ('id', uint32_t, 8), ('instance_count', uint32_t, 12)]) +hsa_ven_amd_aqlprofile_info_type_t: dict[int, str] = {(HSA_VEN_AMD_AQLPROFILE_INFO_COMMAND_BUFFER_SIZE:=0): 'HSA_VEN_AMD_AQLPROFILE_INFO_COMMAND_BUFFER_SIZE', (HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA_SIZE:=1): 'HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA_SIZE', (HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA:=2): 'HSA_VEN_AMD_AQLPROFILE_INFO_PMC_DATA', (HSA_VEN_AMD_AQLPROFILE_INFO_TRACE_DATA:=3): 'HSA_VEN_AMD_AQLPROFILE_INFO_TRACE_DATA', (HSA_VEN_AMD_AQLPROFILE_INFO_BLOCK_COUNTERS:=4): 'HSA_VEN_AMD_AQLPROFILE_INFO_BLOCK_COUNTERS', (HSA_VEN_AMD_AQLPROFILE_INFO_BLOCK_ID:=5): 'HSA_VEN_AMD_AQLPROFILE_INFO_BLOCK_ID', (HSA_VEN_AMD_AQLPROFILE_INFO_ENABLE_CMD:=6): 'HSA_VEN_AMD_AQLPROFILE_INFO_ENABLE_CMD', (HSA_VEN_AMD_AQLPROFILE_INFO_DISABLE_CMD:=7): 'HSA_VEN_AMD_AQLPROFILE_INFO_DISABLE_CMD'} +hsa_ven_amd_aqlprofile_data_callback_t: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_uint32, c.POINTER[hsa_ven_amd_aqlprofile_info_data_t], ctypes.c_void_p]] +hsa_ven_amd_aqlprofile_eventname_callback_t: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_int32, c.POINTER[ctypes.c_char]]] +hsa_ven_amd_aqlprofile_coordinate_callback_t: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_void_p]] +@c.record +class struct_hsa_ven_amd_aqlprofile_1_00_pfn_s(c.Struct): + SIZE = 104 + hsa_ven_amd_aqlprofile_version_major: c.CFUNCTYPE[ctypes.c_uint32, []] + hsa_ven_amd_aqlprofile_version_minor: c.CFUNCTYPE[ctypes.c_uint32, []] + hsa_ven_amd_aqlprofile_error_string: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[c.POINTER[ctypes.c_char]]]] + hsa_ven_amd_aqlprofile_validate_event: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, c.POINTER[hsa_ven_amd_aqlprofile_event_t], c.POINTER[ctypes.c_bool]]] + hsa_ven_amd_aqlprofile_start: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.POINTER[hsa_ext_amd_aql_pm4_packet_t]]] + hsa_ven_amd_aqlprofile_stop: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.POINTER[hsa_ext_amd_aql_pm4_packet_t]]] + hsa_ven_amd_aqlprofile_read: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.POINTER[hsa_ext_amd_aql_pm4_packet_t]]] + hsa_ven_amd_aqlprofile_legacy_get_pm4: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ext_amd_aql_pm4_packet_t], ctypes.c_void_p]] + hsa_ven_amd_aqlprofile_get_info: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], ctypes.c_uint32, ctypes.c_void_p]] + hsa_ven_amd_aqlprofile_iterate_data: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_uint32, c.POINTER[hsa_ven_amd_aqlprofile_info_data_t], ctypes.c_void_p]], ctypes.c_void_p]] + hsa_ven_amd_aqlprofile_iterate_event_ids: c.CFUNCTYPE[ctypes.c_uint32, [c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_int32, c.POINTER[ctypes.c_char]]]]] + hsa_ven_amd_aqlprofile_iterate_event_coord: c.CFUNCTYPE[ctypes.c_uint32, [struct_hsa_agent_s, hsa_ven_amd_aqlprofile_event_t, ctypes.c_uint32, c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_void_p]], ctypes.c_void_p]] + hsa_ven_amd_aqlprofile_att_marker: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.POINTER[hsa_ext_amd_aql_pm4_packet_t], ctypes.c_uint32, ctypes.c_uint32]] +struct_hsa_ven_amd_aqlprofile_1_00_pfn_s.register_fields([('hsa_ven_amd_aqlprofile_version_major', c.CFUNCTYPE[uint32_t, []], 0), ('hsa_ven_amd_aqlprofile_version_minor', c.CFUNCTYPE[uint32_t, []], 8), ('hsa_ven_amd_aqlprofile_error_string', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[c.POINTER[ctypes.c_char]]]], 16), ('hsa_ven_amd_aqlprofile_validate_event', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, c.POINTER[hsa_ven_amd_aqlprofile_event_t], c.POINTER[ctypes.c_bool]]], 24), ('hsa_ven_amd_aqlprofile_start', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.POINTER[hsa_ext_amd_aql_pm4_packet_t]]], 32), ('hsa_ven_amd_aqlprofile_stop', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.POINTER[hsa_ext_amd_aql_pm4_packet_t]]], 40), ('hsa_ven_amd_aqlprofile_read', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.POINTER[hsa_ext_amd_aql_pm4_packet_t]]], 48), ('hsa_ven_amd_aqlprofile_legacy_get_pm4', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ext_amd_aql_pm4_packet_t], ctypes.c_void_p]], 56), ('hsa_ven_amd_aqlprofile_get_info', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], ctypes.c_uint32, ctypes.c_void_p]], 64), ('hsa_ven_amd_aqlprofile_iterate_data', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], hsa_ven_amd_aqlprofile_data_callback_t, ctypes.c_void_p]], 72), ('hsa_ven_amd_aqlprofile_iterate_event_ids', c.CFUNCTYPE[ctypes.c_uint32, [hsa_ven_amd_aqlprofile_eventname_callback_t]], 80), ('hsa_ven_amd_aqlprofile_iterate_event_coord', c.CFUNCTYPE[ctypes.c_uint32, [hsa_agent_t, hsa_ven_amd_aqlprofile_event_t, uint32_t, hsa_ven_amd_aqlprofile_coordinate_callback_t, ctypes.c_void_p]], 88), ('hsa_ven_amd_aqlprofile_att_marker', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[hsa_ven_amd_aqlprofile_profile_t], c.POINTER[hsa_ext_amd_aql_pm4_packet_t], uint32_t, ctypes.c_uint32]], 96)]) +hsa_ven_amd_aqlprofile_1_00_pfn_t: TypeAlias = struct_hsa_ven_amd_aqlprofile_1_00_pfn_s +hsa_ven_amd_aqlprofile_pfn_t: TypeAlias = struct_hsa_ven_amd_aqlprofile_1_00_pfn_s +HSA_VERSION_1_0 = 1 +HSA_AMD_INTERFACE_VERSION_MAJOR = 1 +HSA_AMD_INTERFACE_VERSION_MINOR = 14 +AMD_SIGNAL_ALIGN_BYTES = 64 +AMD_QUEUE_ALIGN_BYTES = 64 +MAX_NUM_XCC = 128 +AMD_CONTROL_DIRECTIVES_ALIGN_BYTES = 64 +AMD_ISA_ALIGN_BYTES = 256 +AMD_KERNEL_CODE_ALIGN_BYTES = 64 +HSA_AQLPROFILE_VERSION_MAJOR = 2 +HSA_AQLPROFILE_VERSION_MINOR = 0 +hsa_ven_amd_aqlprofile_VERSION_MAJOR = 1 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/io_uring.py b/artifacts/package_runtime/tinygrad/runtime/autogen/io_uring.py new file mode 100644 index 000000000..64437048d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/io_uring.py @@ -0,0 +1,904 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class struct_io_uring_sq(c.Struct): + SIZE = 104 + khead: c.POINTER[ctypes.c_uint32] + ktail: c.POINTER[ctypes.c_uint32] + kring_mask: c.POINTER[ctypes.c_uint32] + kring_entries: c.POINTER[ctypes.c_uint32] + kflags: c.POINTER[ctypes.c_uint32] + kdropped: c.POINTER[ctypes.c_uint32] + array: c.POINTER[ctypes.c_uint32] + sqes: c.POINTER[struct_io_uring_sqe] + sqe_head: int + sqe_tail: int + ring_sz: int + ring_ptr: ctypes.c_void_p + ring_mask: int + ring_entries: int + sqes_sz: int + pad: int +@c.record +class struct_io_uring_sqe(c.Struct): + SIZE = 64 + opcode: int + flags: int + ioprio: int + fd: int + off: int + addr2: int + cmd_op: int + __pad1: int + addr: int + splice_off_in: int + len: int + rw_flags: int + fsync_flags: int + poll_events: int + poll32_events: int + sync_range_flags: int + msg_flags: int + timeout_flags: int + accept_flags: int + cancel_flags: int + open_flags: int + statx_flags: int + fadvise_advice: int + splice_flags: int + rename_flags: int + unlink_flags: int + hardlink_flags: int + xattr_flags: int + msg_ring_flags: int + uring_cmd_flags: int + user_data: int + buf_index: int + buf_group: int + personality: int + splice_fd_in: int + file_index: int + addr_len: int + __pad3: c.Array[ctypes.c_uint16, Literal[1]] + addr3: int + __pad2: c.Array[ctypes.c_uint64, Literal[1]] + cmd: c.Array[ctypes.c_ubyte, Literal[0]] +__u8: TypeAlias = ctypes.c_ubyte +__u16: TypeAlias = ctypes.c_uint16 +__s32: TypeAlias = ctypes.c_int32 +__u64: TypeAlias = ctypes.c_uint64 +__u32: TypeAlias = ctypes.c_uint32 +__kernel_rwf_t: TypeAlias = ctypes.c_int32 +struct_io_uring_sqe.register_fields([('opcode', ctypes.c_ubyte, 0), ('flags', ctypes.c_ubyte, 1), ('ioprio', ctypes.c_uint16, 2), ('fd', ctypes.c_int32, 4), ('off', ctypes.c_uint64, 8), ('addr2', ctypes.c_uint64, 8), ('cmd_op', ctypes.c_uint32, 8), ('__pad1', ctypes.c_uint32, 12), ('addr', ctypes.c_uint64, 16), ('splice_off_in', ctypes.c_uint64, 16), ('len', ctypes.c_uint32, 24), ('rw_flags', ctypes.c_int32, 28), ('fsync_flags', ctypes.c_uint32, 28), ('poll_events', ctypes.c_uint16, 28), ('poll32_events', ctypes.c_uint32, 28), ('sync_range_flags', ctypes.c_uint32, 28), ('msg_flags', ctypes.c_uint32, 28), ('timeout_flags', ctypes.c_uint32, 28), ('accept_flags', ctypes.c_uint32, 28), ('cancel_flags', ctypes.c_uint32, 28), ('open_flags', ctypes.c_uint32, 28), ('statx_flags', ctypes.c_uint32, 28), ('fadvise_advice', ctypes.c_uint32, 28), ('splice_flags', ctypes.c_uint32, 28), ('rename_flags', ctypes.c_uint32, 28), ('unlink_flags', ctypes.c_uint32, 28), ('hardlink_flags', ctypes.c_uint32, 28), ('xattr_flags', ctypes.c_uint32, 28), ('msg_ring_flags', ctypes.c_uint32, 28), ('uring_cmd_flags', ctypes.c_uint32, 28), ('user_data', ctypes.c_uint64, 32), ('buf_index', ctypes.c_uint16, 40), ('buf_group', ctypes.c_uint16, 40), ('personality', ctypes.c_uint16, 42), ('splice_fd_in', ctypes.c_int32, 44), ('file_index', ctypes.c_uint32, 44), ('addr_len', ctypes.c_uint16, 44), ('__pad3', c.Array[ctypes.c_uint16, Literal[1]], 46), ('addr3', ctypes.c_uint64, 48), ('__pad2', c.Array[ctypes.c_uint64, Literal[1]], 56), ('cmd', c.Array[ctypes.c_ubyte, Literal[0]], 48)]) +size_t: TypeAlias = ctypes.c_uint64 +struct_io_uring_sq.register_fields([('khead', c.POINTER[ctypes.c_uint32], 0), ('ktail', c.POINTER[ctypes.c_uint32], 8), ('kring_mask', c.POINTER[ctypes.c_uint32], 16), ('kring_entries', c.POINTER[ctypes.c_uint32], 24), ('kflags', c.POINTER[ctypes.c_uint32], 32), ('kdropped', c.POINTER[ctypes.c_uint32], 40), ('array', c.POINTER[ctypes.c_uint32], 48), ('sqes', c.POINTER[struct_io_uring_sqe], 56), ('sqe_head', ctypes.c_uint32, 64), ('sqe_tail', ctypes.c_uint32, 68), ('ring_sz', size_t, 72), ('ring_ptr', ctypes.c_void_p, 80), ('ring_mask', ctypes.c_uint32, 88), ('ring_entries', ctypes.c_uint32, 92), ('sqes_sz', ctypes.c_uint32, 96), ('pad', ctypes.c_uint32, 100)]) +@c.record +class struct_io_uring_cq(c.Struct): + SIZE = 88 + khead: c.POINTER[ctypes.c_uint32] + ktail: c.POINTER[ctypes.c_uint32] + kring_mask: c.POINTER[ctypes.c_uint32] + kring_entries: c.POINTER[ctypes.c_uint32] + kflags: c.POINTER[ctypes.c_uint32] + koverflow: c.POINTER[ctypes.c_uint32] + cqes: c.POINTER[struct_io_uring_cqe] + ring_sz: int + ring_ptr: ctypes.c_void_p + ring_mask: int + ring_entries: int + pad: c.Array[ctypes.c_uint32, Literal[2]] +@c.record +class struct_io_uring_cqe(c.Struct): + SIZE = 16 + user_data: int + res: int + flags: int + big_cqe: c.Array[ctypes.c_uint64, Literal[0]] +struct_io_uring_cqe.register_fields([('user_data', ctypes.c_uint64, 0), ('res', ctypes.c_int32, 8), ('flags', ctypes.c_uint32, 12), ('big_cqe', c.Array[ctypes.c_uint64, Literal[0]], 16)]) +struct_io_uring_cq.register_fields([('khead', c.POINTER[ctypes.c_uint32], 0), ('ktail', c.POINTER[ctypes.c_uint32], 8), ('kring_mask', c.POINTER[ctypes.c_uint32], 16), ('kring_entries', c.POINTER[ctypes.c_uint32], 24), ('kflags', c.POINTER[ctypes.c_uint32], 32), ('koverflow', c.POINTER[ctypes.c_uint32], 40), ('cqes', c.POINTER[struct_io_uring_cqe], 48), ('ring_sz', size_t, 56), ('ring_ptr', ctypes.c_void_p, 64), ('ring_mask', ctypes.c_uint32, 72), ('ring_entries', ctypes.c_uint32, 76), ('pad', c.Array[ctypes.c_uint32, Literal[2]], 80)]) +@c.record +class struct_io_uring(c.Struct): + SIZE = 216 + sq: struct_io_uring_sq + cq: struct_io_uring_cq + flags: int + ring_fd: int + features: int + enter_ring_fd: int + int_flags: int + pad: c.Array[ctypes.c_ubyte, Literal[3]] + pad2: int +struct_io_uring.register_fields([('sq', struct_io_uring_sq, 0), ('cq', struct_io_uring_cq, 104), ('flags', ctypes.c_uint32, 192), ('ring_fd', ctypes.c_int32, 196), ('features', ctypes.c_uint32, 200), ('enter_ring_fd', ctypes.c_int32, 204), ('int_flags', ctypes.c_ubyte, 208), ('pad', c.Array[ctypes.c_ubyte, Literal[3]], 209), ('pad2', ctypes.c_uint32, 212)]) +@c.record +class struct_io_uring_zcrx_rq(c.Struct): + SIZE = 40 + khead: c.POINTER[ctypes.c_uint32] + ktail: c.POINTER[ctypes.c_uint32] + rq_tail: int + ring_entries: int + rqes: c.POINTER[struct_io_uring_zcrx_rqe] + ring_ptr: ctypes.c_void_p +@c.record +class struct_io_uring_zcrx_rqe(c.Struct): + SIZE = 16 + off: int + len: int + __pad: int +struct_io_uring_zcrx_rq.register_fields([('khead', c.POINTER[ctypes.c_uint32], 0), ('ktail', c.POINTER[ctypes.c_uint32], 8), ('rq_tail', ctypes.c_uint32, 16), ('ring_entries', ctypes.c_uint32, 20), ('rqes', c.POINTER[struct_io_uring_zcrx_rqe], 24), ('ring_ptr', ctypes.c_void_p, 32)]) +@c.record +class struct_io_uring_cqe_iter(c.Struct): + SIZE = 24 + cqes: c.POINTER[struct_io_uring_cqe] + mask: int + shift: int + head: int + tail: int +struct_io_uring_cqe_iter.register_fields([('cqes', c.POINTER[struct_io_uring_cqe], 0), ('mask', ctypes.c_uint32, 8), ('shift', ctypes.c_uint32, 12), ('head', ctypes.c_uint32, 16), ('tail', ctypes.c_uint32, 20)]) +class struct_epoll_event(c.Struct): pass +class struct_statx(c.Struct): pass +class struct_futex_waitv(c.Struct): pass +@c.record +class struct_io_uring_attr_pi(c.Struct): + SIZE = 32 + flags: int + app_tag: int + len: int + addr: int + seed: int + rsvd: int +struct_io_uring_attr_pi.register_fields([('flags', ctypes.c_uint16, 0), ('app_tag', ctypes.c_uint16, 2), ('len', ctypes.c_uint32, 4), ('addr', ctypes.c_uint64, 8), ('seed', ctypes.c_uint64, 16), ('rsvd', ctypes.c_uint64, 24)]) +enum_io_uring_sqe_flags_bit: dict[int, str] = {(IOSQE_FIXED_FILE_BIT:=0): 'IOSQE_FIXED_FILE_BIT', (IOSQE_IO_DRAIN_BIT:=1): 'IOSQE_IO_DRAIN_BIT', (IOSQE_IO_LINK_BIT:=2): 'IOSQE_IO_LINK_BIT', (IOSQE_IO_HARDLINK_BIT:=3): 'IOSQE_IO_HARDLINK_BIT', (IOSQE_ASYNC_BIT:=4): 'IOSQE_ASYNC_BIT', (IOSQE_BUFFER_SELECT_BIT:=5): 'IOSQE_BUFFER_SELECT_BIT', (IOSQE_CQE_SKIP_SUCCESS_BIT:=6): 'IOSQE_CQE_SKIP_SUCCESS_BIT'} +enum_io_uring_op: dict[int, str] = {(IORING_OP_NOP:=0): 'IORING_OP_NOP', (IORING_OP_READV:=1): 'IORING_OP_READV', (IORING_OP_WRITEV:=2): 'IORING_OP_WRITEV', (IORING_OP_FSYNC:=3): 'IORING_OP_FSYNC', (IORING_OP_READ_FIXED:=4): 'IORING_OP_READ_FIXED', (IORING_OP_WRITE_FIXED:=5): 'IORING_OP_WRITE_FIXED', (IORING_OP_POLL_ADD:=6): 'IORING_OP_POLL_ADD', (IORING_OP_POLL_REMOVE:=7): 'IORING_OP_POLL_REMOVE', (IORING_OP_SYNC_FILE_RANGE:=8): 'IORING_OP_SYNC_FILE_RANGE', (IORING_OP_SENDMSG:=9): 'IORING_OP_SENDMSG', (IORING_OP_RECVMSG:=10): 'IORING_OP_RECVMSG', (IORING_OP_TIMEOUT:=11): 'IORING_OP_TIMEOUT', (IORING_OP_TIMEOUT_REMOVE:=12): 'IORING_OP_TIMEOUT_REMOVE', (IORING_OP_ACCEPT:=13): 'IORING_OP_ACCEPT', (IORING_OP_ASYNC_CANCEL:=14): 'IORING_OP_ASYNC_CANCEL', (IORING_OP_LINK_TIMEOUT:=15): 'IORING_OP_LINK_TIMEOUT', (IORING_OP_CONNECT:=16): 'IORING_OP_CONNECT', (IORING_OP_FALLOCATE:=17): 'IORING_OP_FALLOCATE', (IORING_OP_OPENAT:=18): 'IORING_OP_OPENAT', (IORING_OP_CLOSE:=19): 'IORING_OP_CLOSE', (IORING_OP_FILES_UPDATE:=20): 'IORING_OP_FILES_UPDATE', (IORING_OP_STATX:=21): 'IORING_OP_STATX', (IORING_OP_READ:=22): 'IORING_OP_READ', (IORING_OP_WRITE:=23): 'IORING_OP_WRITE', (IORING_OP_FADVISE:=24): 'IORING_OP_FADVISE', (IORING_OP_MADVISE:=25): 'IORING_OP_MADVISE', (IORING_OP_SEND:=26): 'IORING_OP_SEND', (IORING_OP_RECV:=27): 'IORING_OP_RECV', (IORING_OP_OPENAT2:=28): 'IORING_OP_OPENAT2', (IORING_OP_EPOLL_CTL:=29): 'IORING_OP_EPOLL_CTL', (IORING_OP_SPLICE:=30): 'IORING_OP_SPLICE', (IORING_OP_PROVIDE_BUFFERS:=31): 'IORING_OP_PROVIDE_BUFFERS', (IORING_OP_REMOVE_BUFFERS:=32): 'IORING_OP_REMOVE_BUFFERS', (IORING_OP_TEE:=33): 'IORING_OP_TEE', (IORING_OP_SHUTDOWN:=34): 'IORING_OP_SHUTDOWN', (IORING_OP_RENAMEAT:=35): 'IORING_OP_RENAMEAT', (IORING_OP_UNLINKAT:=36): 'IORING_OP_UNLINKAT', (IORING_OP_MKDIRAT:=37): 'IORING_OP_MKDIRAT', (IORING_OP_SYMLINKAT:=38): 'IORING_OP_SYMLINKAT', (IORING_OP_LINKAT:=39): 'IORING_OP_LINKAT', (IORING_OP_MSG_RING:=40): 'IORING_OP_MSG_RING', (IORING_OP_FSETXATTR:=41): 'IORING_OP_FSETXATTR', (IORING_OP_SETXATTR:=42): 'IORING_OP_SETXATTR', (IORING_OP_FGETXATTR:=43): 'IORING_OP_FGETXATTR', (IORING_OP_GETXATTR:=44): 'IORING_OP_GETXATTR', (IORING_OP_SOCKET:=45): 'IORING_OP_SOCKET', (IORING_OP_URING_CMD:=46): 'IORING_OP_URING_CMD', (IORING_OP_SEND_ZC:=47): 'IORING_OP_SEND_ZC', (IORING_OP_SENDMSG_ZC:=48): 'IORING_OP_SENDMSG_ZC', (IORING_OP_READ_MULTISHOT:=49): 'IORING_OP_READ_MULTISHOT', (IORING_OP_WAITID:=50): 'IORING_OP_WAITID', (IORING_OP_FUTEX_WAIT:=51): 'IORING_OP_FUTEX_WAIT', (IORING_OP_FUTEX_WAKE:=52): 'IORING_OP_FUTEX_WAKE', (IORING_OP_FUTEX_WAITV:=53): 'IORING_OP_FUTEX_WAITV', (IORING_OP_FIXED_FD_INSTALL:=54): 'IORING_OP_FIXED_FD_INSTALL', (IORING_OP_FTRUNCATE:=55): 'IORING_OP_FTRUNCATE', (IORING_OP_BIND:=56): 'IORING_OP_BIND', (IORING_OP_LISTEN:=57): 'IORING_OP_LISTEN', (IORING_OP_RECV_ZC:=58): 'IORING_OP_RECV_ZC', (IORING_OP_EPOLL_WAIT:=59): 'IORING_OP_EPOLL_WAIT', (IORING_OP_READV_FIXED:=60): 'IORING_OP_READV_FIXED', (IORING_OP_WRITEV_FIXED:=61): 'IORING_OP_WRITEV_FIXED', (IORING_OP_PIPE:=62): 'IORING_OP_PIPE', (IORING_OP_LAST:=63): 'IORING_OP_LAST'} +enum_io_uring_msg_ring_flags: dict[int, str] = {(IORING_MSG_DATA:=0): 'IORING_MSG_DATA', (IORING_MSG_SEND_FD:=1): 'IORING_MSG_SEND_FD'} +@c.record +class struct_io_sqring_offsets(c.Struct): + SIZE = 40 + head: int + tail: int + ring_mask: int + ring_entries: int + flags: int + dropped: int + array: int + resv1: int + user_addr: int +struct_io_sqring_offsets.register_fields([('head', ctypes.c_uint32, 0), ('tail', ctypes.c_uint32, 4), ('ring_mask', ctypes.c_uint32, 8), ('ring_entries', ctypes.c_uint32, 12), ('flags', ctypes.c_uint32, 16), ('dropped', ctypes.c_uint32, 20), ('array', ctypes.c_uint32, 24), ('resv1', ctypes.c_uint32, 28), ('user_addr', ctypes.c_uint64, 32)]) +@c.record +class struct_io_cqring_offsets(c.Struct): + SIZE = 40 + head: int + tail: int + ring_mask: int + ring_entries: int + overflow: int + cqes: int + flags: int + resv1: int + user_addr: int +struct_io_cqring_offsets.register_fields([('head', ctypes.c_uint32, 0), ('tail', ctypes.c_uint32, 4), ('ring_mask', ctypes.c_uint32, 8), ('ring_entries', ctypes.c_uint32, 12), ('overflow', ctypes.c_uint32, 16), ('cqes', ctypes.c_uint32, 20), ('flags', ctypes.c_uint32, 24), ('resv1', ctypes.c_uint32, 28), ('user_addr', ctypes.c_uint64, 32)]) +@c.record +class struct_io_uring_params(c.Struct): + SIZE = 120 + sq_entries: int + cq_entries: int + flags: int + sq_thread_cpu: int + sq_thread_idle: int + features: int + wq_fd: int + resv: c.Array[ctypes.c_uint32, Literal[3]] + sq_off: struct_io_sqring_offsets + cq_off: struct_io_cqring_offsets +struct_io_uring_params.register_fields([('sq_entries', ctypes.c_uint32, 0), ('cq_entries', ctypes.c_uint32, 4), ('flags', ctypes.c_uint32, 8), ('sq_thread_cpu', ctypes.c_uint32, 12), ('sq_thread_idle', ctypes.c_uint32, 16), ('features', ctypes.c_uint32, 20), ('wq_fd', ctypes.c_uint32, 24), ('resv', c.Array[ctypes.c_uint32, Literal[3]], 28), ('sq_off', struct_io_sqring_offsets, 40), ('cq_off', struct_io_cqring_offsets, 80)]) +enum_io_uring_register_op: dict[int, str] = {(IORING_REGISTER_BUFFERS:=0): 'IORING_REGISTER_BUFFERS', (IORING_UNREGISTER_BUFFERS:=1): 'IORING_UNREGISTER_BUFFERS', (IORING_REGISTER_FILES:=2): 'IORING_REGISTER_FILES', (IORING_UNREGISTER_FILES:=3): 'IORING_UNREGISTER_FILES', (IORING_REGISTER_EVENTFD:=4): 'IORING_REGISTER_EVENTFD', (IORING_UNREGISTER_EVENTFD:=5): 'IORING_UNREGISTER_EVENTFD', (IORING_REGISTER_FILES_UPDATE:=6): 'IORING_REGISTER_FILES_UPDATE', (IORING_REGISTER_EVENTFD_ASYNC:=7): 'IORING_REGISTER_EVENTFD_ASYNC', (IORING_REGISTER_PROBE:=8): 'IORING_REGISTER_PROBE', (IORING_REGISTER_PERSONALITY:=9): 'IORING_REGISTER_PERSONALITY', (IORING_UNREGISTER_PERSONALITY:=10): 'IORING_UNREGISTER_PERSONALITY', (IORING_REGISTER_RESTRICTIONS:=11): 'IORING_REGISTER_RESTRICTIONS', (IORING_REGISTER_ENABLE_RINGS:=12): 'IORING_REGISTER_ENABLE_RINGS', (IORING_REGISTER_FILES2:=13): 'IORING_REGISTER_FILES2', (IORING_REGISTER_FILES_UPDATE2:=14): 'IORING_REGISTER_FILES_UPDATE2', (IORING_REGISTER_BUFFERS2:=15): 'IORING_REGISTER_BUFFERS2', (IORING_REGISTER_BUFFERS_UPDATE:=16): 'IORING_REGISTER_BUFFERS_UPDATE', (IORING_REGISTER_IOWQ_AFF:=17): 'IORING_REGISTER_IOWQ_AFF', (IORING_UNREGISTER_IOWQ_AFF:=18): 'IORING_UNREGISTER_IOWQ_AFF', (IORING_REGISTER_IOWQ_MAX_WORKERS:=19): 'IORING_REGISTER_IOWQ_MAX_WORKERS', (IORING_REGISTER_RING_FDS:=20): 'IORING_REGISTER_RING_FDS', (IORING_UNREGISTER_RING_FDS:=21): 'IORING_UNREGISTER_RING_FDS', (IORING_REGISTER_PBUF_RING:=22): 'IORING_REGISTER_PBUF_RING', (IORING_UNREGISTER_PBUF_RING:=23): 'IORING_UNREGISTER_PBUF_RING', (IORING_REGISTER_SYNC_CANCEL:=24): 'IORING_REGISTER_SYNC_CANCEL', (IORING_REGISTER_FILE_ALLOC_RANGE:=25): 'IORING_REGISTER_FILE_ALLOC_RANGE', (IORING_REGISTER_PBUF_STATUS:=26): 'IORING_REGISTER_PBUF_STATUS', (IORING_REGISTER_NAPI:=27): 'IORING_REGISTER_NAPI', (IORING_UNREGISTER_NAPI:=28): 'IORING_UNREGISTER_NAPI', (IORING_REGISTER_CLOCK:=29): 'IORING_REGISTER_CLOCK', (IORING_REGISTER_CLONE_BUFFERS:=30): 'IORING_REGISTER_CLONE_BUFFERS', (IORING_REGISTER_SEND_MSG_RING:=31): 'IORING_REGISTER_SEND_MSG_RING', (IORING_REGISTER_ZCRX_IFQ:=32): 'IORING_REGISTER_ZCRX_IFQ', (IORING_REGISTER_RESIZE_RINGS:=33): 'IORING_REGISTER_RESIZE_RINGS', (IORING_REGISTER_MEM_REGION:=34): 'IORING_REGISTER_MEM_REGION', (IORING_REGISTER_QUERY:=35): 'IORING_REGISTER_QUERY', (IORING_REGISTER_LAST:=36): 'IORING_REGISTER_LAST', (IORING_REGISTER_USE_REGISTERED_RING:=2147483648): 'IORING_REGISTER_USE_REGISTERED_RING'} +enum_io_wq_type: dict[int, str] = {(IO_WQ_BOUND:=0): 'IO_WQ_BOUND', (IO_WQ_UNBOUND:=1): 'IO_WQ_UNBOUND'} +@c.record +class struct_io_uring_files_update(c.Struct): + SIZE = 16 + offset: int + resv: int + fds: int +struct_io_uring_files_update.register_fields([('offset', ctypes.c_uint32, 0), ('resv', ctypes.c_uint32, 4), ('fds', ctypes.c_uint64, 8)]) +_anonenum0: dict[int, str] = {(IORING_MEM_REGION_TYPE_USER:=1): 'IORING_MEM_REGION_TYPE_USER'} +@c.record +class struct_io_uring_region_desc(c.Struct): + SIZE = 64 + user_addr: int + size: int + flags: int + id: int + mmap_offset: int + __resv: c.Array[ctypes.c_uint64, Literal[4]] +struct_io_uring_region_desc.register_fields([('user_addr', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('flags', ctypes.c_uint32, 16), ('id', ctypes.c_uint32, 20), ('mmap_offset', ctypes.c_uint64, 24), ('__resv', c.Array[ctypes.c_uint64, Literal[4]], 32)]) +_anonenum1: dict[int, str] = {(IORING_MEM_REGION_REG_WAIT_ARG:=1): 'IORING_MEM_REGION_REG_WAIT_ARG'} +@c.record +class struct_io_uring_mem_region_reg(c.Struct): + SIZE = 32 + region_uptr: int + flags: int + __resv: c.Array[ctypes.c_uint64, Literal[2]] +struct_io_uring_mem_region_reg.register_fields([('region_uptr', ctypes.c_uint64, 0), ('flags', ctypes.c_uint64, 8), ('__resv', c.Array[ctypes.c_uint64, Literal[2]], 16)]) +@c.record +class struct_io_uring_rsrc_register(c.Struct): + SIZE = 32 + nr: int + flags: int + resv2: int + data: int + tags: int +struct_io_uring_rsrc_register.register_fields([('nr', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('resv2', ctypes.c_uint64, 8), ('data', ctypes.c_uint64, 16), ('tags', ctypes.c_uint64, 24)]) +@c.record +class struct_io_uring_rsrc_update(c.Struct): + SIZE = 16 + offset: int + resv: int + data: int +struct_io_uring_rsrc_update.register_fields([('offset', ctypes.c_uint32, 0), ('resv', ctypes.c_uint32, 4), ('data', ctypes.c_uint64, 8)]) +@c.record +class struct_io_uring_rsrc_update2(c.Struct): + SIZE = 32 + offset: int + resv: int + data: int + tags: int + nr: int + resv2: int +struct_io_uring_rsrc_update2.register_fields([('offset', ctypes.c_uint32, 0), ('resv', ctypes.c_uint32, 4), ('data', ctypes.c_uint64, 8), ('tags', ctypes.c_uint64, 16), ('nr', ctypes.c_uint32, 24), ('resv2', ctypes.c_uint32, 28)]) +@c.record +class struct_io_uring_probe_op(c.Struct): + SIZE = 8 + op: int + resv: int + flags: int + resv2: int +struct_io_uring_probe_op.register_fields([('op', ctypes.c_ubyte, 0), ('resv', ctypes.c_ubyte, 1), ('flags', ctypes.c_uint16, 2), ('resv2', ctypes.c_uint32, 4)]) +@c.record +class struct_io_uring_probe(c.Struct): + SIZE = 16 + last_op: int + ops_len: int + resv: int + resv2: c.Array[ctypes.c_uint32, Literal[3]] + ops: c.Array[struct_io_uring_probe_op, Literal[0]] +struct_io_uring_probe.register_fields([('last_op', ctypes.c_ubyte, 0), ('ops_len', ctypes.c_ubyte, 1), ('resv', ctypes.c_uint16, 2), ('resv2', c.Array[ctypes.c_uint32, Literal[3]], 4), ('ops', c.Array[struct_io_uring_probe_op, Literal[0]], 16)]) +@c.record +class struct_io_uring_restriction(c.Struct): + SIZE = 16 + opcode: int + register_op: int + sqe_op: int + sqe_flags: int + resv: int + resv2: c.Array[ctypes.c_uint32, Literal[3]] +struct_io_uring_restriction.register_fields([('opcode', ctypes.c_uint16, 0), ('register_op', ctypes.c_ubyte, 2), ('sqe_op', ctypes.c_ubyte, 2), ('sqe_flags', ctypes.c_ubyte, 2), ('resv', ctypes.c_ubyte, 3), ('resv2', c.Array[ctypes.c_uint32, Literal[3]], 4)]) +@c.record +class struct_io_uring_clock_register(c.Struct): + SIZE = 16 + clockid: int + __resv: c.Array[ctypes.c_uint32, Literal[3]] +struct_io_uring_clock_register.register_fields([('clockid', ctypes.c_uint32, 0), ('__resv', c.Array[ctypes.c_uint32, Literal[3]], 4)]) +_anonenum2: dict[int, str] = {(IORING_REGISTER_SRC_REGISTERED:=1): 'IORING_REGISTER_SRC_REGISTERED', (IORING_REGISTER_DST_REPLACE:=2): 'IORING_REGISTER_DST_REPLACE'} +@c.record +class struct_io_uring_clone_buffers(c.Struct): + SIZE = 32 + src_fd: int + flags: int + src_off: int + dst_off: int + nr: int + pad: c.Array[ctypes.c_uint32, Literal[3]] +struct_io_uring_clone_buffers.register_fields([('src_fd', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('src_off', ctypes.c_uint32, 8), ('dst_off', ctypes.c_uint32, 12), ('nr', ctypes.c_uint32, 16), ('pad', c.Array[ctypes.c_uint32, Literal[3]], 20)]) +@c.record +class struct_io_uring_buf(c.Struct): + SIZE = 16 + addr: int + len: int + bid: int + resv: int +struct_io_uring_buf.register_fields([('addr', ctypes.c_uint64, 0), ('len', ctypes.c_uint32, 8), ('bid', ctypes.c_uint16, 12), ('resv', ctypes.c_uint16, 14)]) +@c.record +class struct_io_uring_buf_ring(c.Struct): + SIZE = 16 + resv1: int + resv2: int + resv3: int + tail: int + __empty_bufs: struct_io_uring_buf_ring___empty_bufs + bufs: c.Array[struct_io_uring_buf, Literal[0]] +class struct_io_uring_buf_ring___empty_bufs(c.Struct): pass +struct_io_uring_buf_ring.register_fields([('resv1', ctypes.c_uint64, 0), ('resv2', ctypes.c_uint32, 8), ('resv3', ctypes.c_uint16, 12), ('tail', ctypes.c_uint16, 14), ('__empty_bufs', struct_io_uring_buf_ring___empty_bufs, 0), ('bufs', c.Array[struct_io_uring_buf, Literal[0]], 0)]) +enum_io_uring_register_pbuf_ring_flags: dict[int, str] = {(IOU_PBUF_RING_MMAP:=1): 'IOU_PBUF_RING_MMAP', (IOU_PBUF_RING_INC:=2): 'IOU_PBUF_RING_INC'} +@c.record +class struct_io_uring_buf_reg(c.Struct): + SIZE = 40 + ring_addr: int + ring_entries: int + bgid: int + flags: int + resv: c.Array[ctypes.c_uint64, Literal[3]] +struct_io_uring_buf_reg.register_fields([('ring_addr', ctypes.c_uint64, 0), ('ring_entries', ctypes.c_uint32, 8), ('bgid', ctypes.c_uint16, 12), ('flags', ctypes.c_uint16, 14), ('resv', c.Array[ctypes.c_uint64, Literal[3]], 16)]) +@c.record +class struct_io_uring_buf_status(c.Struct): + SIZE = 40 + buf_group: int + head: int + resv: c.Array[ctypes.c_uint32, Literal[8]] +struct_io_uring_buf_status.register_fields([('buf_group', ctypes.c_uint32, 0), ('head', ctypes.c_uint32, 4), ('resv', c.Array[ctypes.c_uint32, Literal[8]], 8)]) +enum_io_uring_napi_op: dict[int, str] = {(IO_URING_NAPI_REGISTER_OP:=0): 'IO_URING_NAPI_REGISTER_OP', (IO_URING_NAPI_STATIC_ADD_ID:=1): 'IO_URING_NAPI_STATIC_ADD_ID', (IO_URING_NAPI_STATIC_DEL_ID:=2): 'IO_URING_NAPI_STATIC_DEL_ID'} +enum_io_uring_napi_tracking_strategy: dict[int, str] = {(IO_URING_NAPI_TRACKING_DYNAMIC:=0): 'IO_URING_NAPI_TRACKING_DYNAMIC', (IO_URING_NAPI_TRACKING_STATIC:=1): 'IO_URING_NAPI_TRACKING_STATIC', (IO_URING_NAPI_TRACKING_INACTIVE:=255): 'IO_URING_NAPI_TRACKING_INACTIVE'} +@c.record +class struct_io_uring_napi(c.Struct): + SIZE = 16 + busy_poll_to: int + prefer_busy_poll: int + opcode: int + pad: c.Array[ctypes.c_ubyte, Literal[2]] + op_param: int + resv: int +struct_io_uring_napi.register_fields([('busy_poll_to', ctypes.c_uint32, 0), ('prefer_busy_poll', ctypes.c_ubyte, 4), ('opcode', ctypes.c_ubyte, 5), ('pad', c.Array[ctypes.c_ubyte, Literal[2]], 6), ('op_param', ctypes.c_uint32, 8), ('resv', ctypes.c_uint32, 12)]) +enum_io_uring_register_restriction_op: dict[int, str] = {(IORING_RESTRICTION_REGISTER_OP:=0): 'IORING_RESTRICTION_REGISTER_OP', (IORING_RESTRICTION_SQE_OP:=1): 'IORING_RESTRICTION_SQE_OP', (IORING_RESTRICTION_SQE_FLAGS_ALLOWED:=2): 'IORING_RESTRICTION_SQE_FLAGS_ALLOWED', (IORING_RESTRICTION_SQE_FLAGS_REQUIRED:=3): 'IORING_RESTRICTION_SQE_FLAGS_REQUIRED', (IORING_RESTRICTION_LAST:=4): 'IORING_RESTRICTION_LAST'} +_anonenum3: dict[int, str] = {(IORING_REG_WAIT_TS:=1): 'IORING_REG_WAIT_TS'} +@c.record +class struct_io_uring_reg_wait(c.Struct): + SIZE = 64 + ts: struct___kernel_timespec + min_wait_usec: int + flags: int + sigmask: int + sigmask_sz: int + pad: c.Array[ctypes.c_uint32, Literal[3]] + pad2: c.Array[ctypes.c_uint64, Literal[2]] +@c.record +class struct___kernel_timespec(c.Struct): + SIZE = 16 + tv_sec: int + tv_nsec: int +__kernel_time64_t: TypeAlias = ctypes.c_int64 +struct___kernel_timespec.register_fields([('tv_sec', ctypes.c_int64, 0), ('tv_nsec', ctypes.c_int64, 8)]) +struct_io_uring_reg_wait.register_fields([('ts', struct___kernel_timespec, 0), ('min_wait_usec', ctypes.c_uint32, 16), ('flags', ctypes.c_uint32, 20), ('sigmask', ctypes.c_uint64, 24), ('sigmask_sz', ctypes.c_uint32, 32), ('pad', c.Array[ctypes.c_uint32, Literal[3]], 36), ('pad2', c.Array[ctypes.c_uint64, Literal[2]], 48)]) +@c.record +class struct_io_uring_getevents_arg(c.Struct): + SIZE = 24 + sigmask: int + sigmask_sz: int + min_wait_usec: int + ts: int +struct_io_uring_getevents_arg.register_fields([('sigmask', ctypes.c_uint64, 0), ('sigmask_sz', ctypes.c_uint32, 8), ('min_wait_usec', ctypes.c_uint32, 12), ('ts', ctypes.c_uint64, 16)]) +@c.record +class struct_io_uring_sync_cancel_reg(c.Struct): + SIZE = 64 + addr: int + fd: int + flags: int + timeout: struct___kernel_timespec + opcode: int + pad: c.Array[ctypes.c_ubyte, Literal[7]] + pad2: c.Array[ctypes.c_uint64, Literal[3]] +struct_io_uring_sync_cancel_reg.register_fields([('addr', ctypes.c_uint64, 0), ('fd', ctypes.c_int32, 8), ('flags', ctypes.c_uint32, 12), ('timeout', struct___kernel_timespec, 16), ('opcode', ctypes.c_ubyte, 32), ('pad', c.Array[ctypes.c_ubyte, Literal[7]], 33), ('pad2', c.Array[ctypes.c_uint64, Literal[3]], 40)]) +@c.record +class struct_io_uring_file_index_range(c.Struct): + SIZE = 16 + off: int + len: int + resv: int +struct_io_uring_file_index_range.register_fields([('off', ctypes.c_uint32, 0), ('len', ctypes.c_uint32, 4), ('resv', ctypes.c_uint64, 8)]) +@c.record +class struct_io_uring_recvmsg_out(c.Struct): + SIZE = 16 + namelen: int + controllen: int + payloadlen: int + flags: int +struct_io_uring_recvmsg_out.register_fields([('namelen', ctypes.c_uint32, 0), ('controllen', ctypes.c_uint32, 4), ('payloadlen', ctypes.c_uint32, 8), ('flags', ctypes.c_uint32, 12)]) +enum_io_uring_socket_op: dict[int, str] = {(SOCKET_URING_OP_SIOCINQ:=0): 'SOCKET_URING_OP_SIOCINQ', (SOCKET_URING_OP_SIOCOUTQ:=1): 'SOCKET_URING_OP_SIOCOUTQ', (SOCKET_URING_OP_GETSOCKOPT:=2): 'SOCKET_URING_OP_GETSOCKOPT', (SOCKET_URING_OP_SETSOCKOPT:=3): 'SOCKET_URING_OP_SETSOCKOPT', (SOCKET_URING_OP_TX_TIMESTAMP:=4): 'SOCKET_URING_OP_TX_TIMESTAMP'} +@c.record +class struct_io_timespec(c.Struct): + SIZE = 16 + tv_sec: int + tv_nsec: int +struct_io_timespec.register_fields([('tv_sec', ctypes.c_uint64, 0), ('tv_nsec', ctypes.c_uint64, 8)]) +struct_io_uring_zcrx_rqe.register_fields([('off', ctypes.c_uint64, 0), ('len', ctypes.c_uint32, 8), ('__pad', ctypes.c_uint32, 12)]) +@c.record +class struct_io_uring_zcrx_cqe(c.Struct): + SIZE = 16 + off: int + __pad: int +struct_io_uring_zcrx_cqe.register_fields([('off', ctypes.c_uint64, 0), ('__pad', ctypes.c_uint64, 8)]) +@c.record +class struct_io_uring_zcrx_offsets(c.Struct): + SIZE = 32 + head: int + tail: int + rqes: int + __resv2: int + __resv: c.Array[ctypes.c_uint64, Literal[2]] +struct_io_uring_zcrx_offsets.register_fields([('head', ctypes.c_uint32, 0), ('tail', ctypes.c_uint32, 4), ('rqes', ctypes.c_uint32, 8), ('__resv2', ctypes.c_uint32, 12), ('__resv', c.Array[ctypes.c_uint64, Literal[2]], 16)]) +enum_io_uring_zcrx_area_flags: dict[int, str] = {(IORING_ZCRX_AREA_DMABUF:=1): 'IORING_ZCRX_AREA_DMABUF'} +@c.record +class struct_io_uring_zcrx_area_reg(c.Struct): + SIZE = 48 + addr: int + len: int + rq_area_token: int + flags: int + dmabuf_fd: int + __resv2: c.Array[ctypes.c_uint64, Literal[2]] +struct_io_uring_zcrx_area_reg.register_fields([('addr', ctypes.c_uint64, 0), ('len', ctypes.c_uint64, 8), ('rq_area_token', ctypes.c_uint64, 16), ('flags', ctypes.c_uint32, 24), ('dmabuf_fd', ctypes.c_uint32, 28), ('__resv2', c.Array[ctypes.c_uint64, Literal[2]], 32)]) +@c.record +class struct_io_uring_zcrx_ifq_reg(c.Struct): + SIZE = 96 + if_idx: int + if_rxq: int + rq_entries: int + flags: int + area_ptr: int + region_ptr: int + offsets: struct_io_uring_zcrx_offsets + zcrx_id: int + __resv2: int + __resv: c.Array[ctypes.c_uint64, Literal[3]] +struct_io_uring_zcrx_ifq_reg.register_fields([('if_idx', ctypes.c_uint32, 0), ('if_rxq', ctypes.c_uint32, 4), ('rq_entries', ctypes.c_uint32, 8), ('flags', ctypes.c_uint32, 12), ('area_ptr', ctypes.c_uint64, 16), ('region_ptr', ctypes.c_uint64, 24), ('offsets', struct_io_uring_zcrx_offsets, 32), ('zcrx_id', ctypes.c_uint32, 64), ('__resv2', ctypes.c_uint32, 68), ('__resv', c.Array[ctypes.c_uint64, Literal[3]], 72)]) +uring_unlikely = lambda cond: __builtin_expect( not not (cond), 0) # type: ignore +uring_likely = lambda cond: __builtin_expect( not not (cond), 1) # type: ignore +NR_io_uring_setup = 425 +NR_io_uring_enter = 426 +NR_io_uring_register = 427 +IO_URING_CHECK_VERSION = lambda major,minor: (major > IO_URING_VERSION_MAJOR or (major == IO_URING_VERSION_MAJOR and minor > IO_URING_VERSION_MINOR)) # type: ignore +IORING_RW_ATTR_FLAG_PI = (1 << 0) +IORING_FILE_INDEX_ALLOC = (~0) +IOSQE_FIXED_FILE = (1 << IOSQE_FIXED_FILE_BIT) +IOSQE_IO_DRAIN = (1 << IOSQE_IO_DRAIN_BIT) +IOSQE_IO_LINK = (1 << IOSQE_IO_LINK_BIT) +IOSQE_IO_HARDLINK = (1 << IOSQE_IO_HARDLINK_BIT) +IOSQE_ASYNC = (1 << IOSQE_ASYNC_BIT) +IOSQE_BUFFER_SELECT = (1 << IOSQE_BUFFER_SELECT_BIT) +IOSQE_CQE_SKIP_SUCCESS = (1 << IOSQE_CQE_SKIP_SUCCESS_BIT) +IORING_SETUP_IOPOLL = (1 << 0) +IORING_SETUP_SQPOLL = (1 << 1) +IORING_SETUP_SQ_AFF = (1 << 2) +IORING_SETUP_CQSIZE = (1 << 3) +IORING_SETUP_CLAMP = (1 << 4) +IORING_SETUP_ATTACH_WQ = (1 << 5) +IORING_SETUP_R_DISABLED = (1 << 6) +IORING_SETUP_SUBMIT_ALL = (1 << 7) +IORING_SETUP_COOP_TASKRUN = (1 << 8) +IORING_SETUP_TASKRUN_FLAG = (1 << 9) +IORING_SETUP_SQE128 = (1 << 10) +IORING_SETUP_CQE32 = (1 << 11) +IORING_SETUP_SINGLE_ISSUER = (1 << 12) +IORING_SETUP_DEFER_TASKRUN = (1 << 13) +IORING_SETUP_NO_MMAP = (1 << 14) +IORING_SETUP_REGISTERED_FD_ONLY = (1 << 15) +IORING_SETUP_NO_SQARRAY = (1 << 16) +IORING_SETUP_HYBRID_IOPOLL = (1 << 17) +IORING_SETUP_CQE_MIXED = (1 << 18) +IORING_URING_CMD_FIXED = (1 << 0) +IORING_URING_CMD_MULTISHOT = (1 << 1) +IORING_URING_CMD_MASK = (IORING_URING_CMD_FIXED | IORING_URING_CMD_MULTISHOT) +IORING_FSYNC_DATASYNC = (1 << 0) +IORING_TIMEOUT_ABS = (1 << 0) +IORING_TIMEOUT_UPDATE = (1 << 1) +IORING_TIMEOUT_BOOTTIME = (1 << 2) +IORING_TIMEOUT_REALTIME = (1 << 3) +IORING_LINK_TIMEOUT_UPDATE = (1 << 4) +IORING_TIMEOUT_ETIME_SUCCESS = (1 << 5) +IORING_TIMEOUT_MULTISHOT = (1 << 6) +IORING_TIMEOUT_CLOCK_MASK = (IORING_TIMEOUT_BOOTTIME | IORING_TIMEOUT_REALTIME) +IORING_TIMEOUT_UPDATE_MASK = (IORING_TIMEOUT_UPDATE | IORING_LINK_TIMEOUT_UPDATE) +SPLICE_F_FD_IN_FIXED = (1 << 31) +IORING_POLL_ADD_MULTI = (1 << 0) +IORING_POLL_UPDATE_EVENTS = (1 << 1) +IORING_POLL_UPDATE_USER_DATA = (1 << 2) +IORING_POLL_ADD_LEVEL = (1 << 3) +IORING_ASYNC_CANCEL_ALL = (1 << 0) +IORING_ASYNC_CANCEL_FD = (1 << 1) +IORING_ASYNC_CANCEL_ANY = (1 << 2) +IORING_ASYNC_CANCEL_FD_FIXED = (1 << 3) +IORING_ASYNC_CANCEL_USERDATA = (1 << 4) +IORING_ASYNC_CANCEL_OP = (1 << 5) +IORING_RECVSEND_POLL_FIRST = (1 << 0) +IORING_RECV_MULTISHOT = (1 << 1) +IORING_RECVSEND_FIXED_BUF = (1 << 2) +IORING_SEND_ZC_REPORT_USAGE = (1 << 3) +IORING_RECVSEND_BUNDLE = (1 << 4) +IORING_SEND_VECTORIZED = (1 << 5) +IORING_NOTIF_USAGE_ZC_COPIED = (1 << 31) +IORING_ACCEPT_MULTISHOT = (1 << 0) +IORING_ACCEPT_DONTWAIT = (1 << 1) +IORING_ACCEPT_POLL_FIRST = (1 << 2) +IORING_MSG_RING_CQE_SKIP = (1 << 0) +IORING_MSG_RING_FLAGS_PASS = (1 << 1) +IORING_FIXED_FD_NO_CLOEXEC = (1 << 0) +IORING_NOP_INJECT_RESULT = (1 << 0) +IORING_NOP_FILE = (1 << 1) +IORING_NOP_FIXED_FILE = (1 << 2) +IORING_NOP_FIXED_BUFFER = (1 << 3) +IORING_NOP_TW = (1 << 4) +IORING_NOP_CQE32 = (1 << 5) +IORING_CQE_F_BUFFER = (1 << 0) +IORING_CQE_F_MORE = (1 << 1) +IORING_CQE_F_SOCK_NONEMPTY = (1 << 2) +IORING_CQE_F_NOTIF = (1 << 3) +IORING_CQE_F_BUF_MORE = (1 << 4) +IORING_CQE_F_SKIP = (1 << 5) +IORING_CQE_F_32 = (1 << 15) +IORING_CQE_BUFFER_SHIFT = 16 +IORING_OFF_SQ_RING = 0 +IORING_OFF_CQ_RING = 0x8000000 +IORING_OFF_SQES = 0x10000000 +IORING_OFF_PBUF_RING = 0x80000000 +IORING_OFF_PBUF_SHIFT = 16 +IORING_OFF_MMAP_MASK = 0xf8000000 +IORING_SQ_NEED_WAKEUP = (1 << 0) +IORING_SQ_CQ_OVERFLOW = (1 << 1) +IORING_SQ_TASKRUN = (1 << 2) +IORING_CQ_EVENTFD_DISABLED = (1 << 0) +IORING_ENTER_GETEVENTS = (1 << 0) +IORING_ENTER_SQ_WAKEUP = (1 << 1) +IORING_ENTER_SQ_WAIT = (1 << 2) +IORING_ENTER_EXT_ARG = (1 << 3) +IORING_ENTER_REGISTERED_RING = (1 << 4) +IORING_ENTER_ABS_TIMER = (1 << 5) +IORING_ENTER_EXT_ARG_REG = (1 << 6) +IORING_ENTER_NO_IOWAIT = (1 << 7) +IORING_FEAT_SINGLE_MMAP = (1 << 0) +IORING_FEAT_NODROP = (1 << 1) +IORING_FEAT_SUBMIT_STABLE = (1 << 2) +IORING_FEAT_RW_CUR_POS = (1 << 3) +IORING_FEAT_CUR_PERSONALITY = (1 << 4) +IORING_FEAT_FAST_POLL = (1 << 5) +IORING_FEAT_POLL_32BITS = (1 << 6) +IORING_FEAT_SQPOLL_NONFIXED = (1 << 7) +IORING_FEAT_EXT_ARG = (1 << 8) +IORING_FEAT_NATIVE_WORKERS = (1 << 9) +IORING_FEAT_RSRC_TAGS = (1 << 10) +IORING_FEAT_CQE_SKIP = (1 << 11) +IORING_FEAT_LINKED_FILE = (1 << 12) +IORING_FEAT_REG_REG_RING = (1 << 13) +IORING_FEAT_RECVSEND_BUNDLE = (1 << 14) +IORING_FEAT_MIN_TIMEOUT = (1 << 15) +IORING_FEAT_RW_ATTR = (1 << 16) +IORING_FEAT_NO_IOWAIT = (1 << 17) +IORING_RSRC_REGISTER_SPARSE = (1 << 0) +IORING_REGISTER_FILES_SKIP = (-2) +IO_URING_OP_SUPPORTED = (1 << 0) +IORING_TIMESTAMP_HW_SHIFT = 16 +IORING_TIMESTAMP_TYPE_SHIFT = (IORING_TIMESTAMP_HW_SHIFT + 1) +IORING_ZCRX_AREA_SHIFT = 48 +__SC_3264 = lambda _nr,_32,_64: __SYSCALL(_nr, _64) # type: ignore +__SC_COMP = lambda _nr,_sys,_comp: __SYSCALL(_nr, _sys) # type: ignore +__SC_COMP_3264 = lambda _nr,_32,_64,_comp: __SC_3264(_nr, _32, _64) # type: ignore +NR_io_setup = 0 +NR_io_destroy = 1 +NR_io_submit = 2 +NR_io_cancel = 3 +NR_io_getevents = 4 +NR_setxattr = 5 +NR_lsetxattr = 6 +NR_fsetxattr = 7 +NR_getxattr = 8 +NR_lgetxattr = 9 +NR_fgetxattr = 10 +NR_listxattr = 11 +NR_llistxattr = 12 +NR_flistxattr = 13 +NR_removexattr = 14 +NR_lremovexattr = 15 +NR_fremovexattr = 16 +NR_getcwd = 17 +NR_lookup_dcookie = 18 +NR_eventfd2 = 19 +NR_epoll_create1 = 20 +NR_epoll_ctl = 21 +NR_epoll_pwait = 22 +NR_dup = 23 +NR_dup3 = 24 +NR3264_fcntl = 25 +NR_inotify_init1 = 26 +NR_inotify_add_watch = 27 +NR_inotify_rm_watch = 28 +NR_ioctl = 29 +NR_ioprio_set = 30 +NR_ioprio_get = 31 +NR_flock = 32 +NR_mknodat = 33 +NR_mkdirat = 34 +NR_unlinkat = 35 +NR_symlinkat = 36 +NR_linkat = 37 +NR_umount2 = 39 +NR_mount = 40 +NR_pivot_root = 41 +NR_nfsservctl = 42 +NR3264_statfs = 43 +NR3264_fstatfs = 44 +NR3264_truncate = 45 +NR3264_ftruncate = 46 +NR_fallocate = 47 +NR_faccessat = 48 +NR_chdir = 49 +NR_fchdir = 50 +NR_chroot = 51 +NR_fchmod = 52 +NR_fchmodat = 53 +NR_fchownat = 54 +NR_fchown = 55 +NR_openat = 56 +NR_close = 57 +NR_vhangup = 58 +NR_pipe2 = 59 +NR_quotactl = 60 +NR_getdents64 = 61 +NR3264_lseek = 62 +NR_read = 63 +NR_write = 64 +NR_readv = 65 +NR_writev = 66 +NR_pread64 = 67 +NR_pwrite64 = 68 +NR_preadv = 69 +NR_pwritev = 70 +NR3264_sendfile = 71 +NR_pselect6 = 72 +NR_ppoll = 73 +NR_signalfd4 = 74 +NR_vmsplice = 75 +NR_splice = 76 +NR_tee = 77 +NR_readlinkat = 78 +NR_sync = 81 +NR_fsync = 82 +NR_fdatasync = 83 +NR_sync_file_range = 84 +NR_timerfd_create = 85 +NR_timerfd_settime = 86 +NR_timerfd_gettime = 87 +NR_utimensat = 88 +NR_acct = 89 +NR_capget = 90 +NR_capset = 91 +NR_personality = 92 +NR_exit = 93 +NR_exit_group = 94 +NR_waitid = 95 +NR_set_tid_address = 96 +NR_unshare = 97 +NR_futex = 98 +NR_set_robust_list = 99 +NR_get_robust_list = 100 +NR_nanosleep = 101 +NR_getitimer = 102 +NR_setitimer = 103 +NR_kexec_load = 104 +NR_init_module = 105 +NR_delete_module = 106 +NR_timer_create = 107 +NR_timer_gettime = 108 +NR_timer_getoverrun = 109 +NR_timer_settime = 110 +NR_timer_delete = 111 +NR_clock_settime = 112 +NR_clock_gettime = 113 +NR_clock_getres = 114 +NR_clock_nanosleep = 115 +NR_syslog = 116 +NR_ptrace = 117 +NR_sched_setparam = 118 +NR_sched_setscheduler = 119 +NR_sched_getscheduler = 120 +NR_sched_getparam = 121 +NR_sched_setaffinity = 122 +NR_sched_getaffinity = 123 +NR_sched_yield = 124 +NR_sched_get_priority_max = 125 +NR_sched_get_priority_min = 126 +NR_sched_rr_get_interval = 127 +NR_restart_syscall = 128 +NR_kill = 129 +NR_tkill = 130 +NR_tgkill = 131 +NR_sigaltstack = 132 +NR_rt_sigsuspend = 133 +NR_rt_sigaction = 134 +NR_rt_sigprocmask = 135 +NR_rt_sigpending = 136 +NR_rt_sigtimedwait = 137 +NR_rt_sigqueueinfo = 138 +NR_rt_sigreturn = 139 +NR_setpriority = 140 +NR_getpriority = 141 +NR_reboot = 142 +NR_setregid = 143 +NR_setgid = 144 +NR_setreuid = 145 +NR_setuid = 146 +NR_setresuid = 147 +NR_getresuid = 148 +NR_setresgid = 149 +NR_getresgid = 150 +NR_setfsuid = 151 +NR_setfsgid = 152 +NR_times = 153 +NR_setpgid = 154 +NR_getpgid = 155 +NR_getsid = 156 +NR_setsid = 157 +NR_getgroups = 158 +NR_setgroups = 159 +NR_uname = 160 +NR_sethostname = 161 +NR_setdomainname = 162 +NR_getrusage = 165 +NR_umask = 166 +NR_prctl = 167 +NR_getcpu = 168 +NR_gettimeofday = 169 +NR_settimeofday = 170 +NR_adjtimex = 171 +NR_getpid = 172 +NR_getppid = 173 +NR_getuid = 174 +NR_geteuid = 175 +NR_getgid = 176 +NR_getegid = 177 +NR_gettid = 178 +NR_sysinfo = 179 +NR_mq_open = 180 +NR_mq_unlink = 181 +NR_mq_timedsend = 182 +NR_mq_timedreceive = 183 +NR_mq_notify = 184 +NR_mq_getsetattr = 185 +NR_msgget = 186 +NR_msgctl = 187 +NR_msgrcv = 188 +NR_msgsnd = 189 +NR_semget = 190 +NR_semctl = 191 +NR_semtimedop = 192 +NR_semop = 193 +NR_shmget = 194 +NR_shmctl = 195 +NR_shmat = 196 +NR_shmdt = 197 +NR_socket = 198 +NR_socketpair = 199 +NR_bind = 200 +NR_listen = 201 +NR_accept = 202 +NR_connect = 203 +NR_getsockname = 204 +NR_getpeername = 205 +NR_sendto = 206 +NR_recvfrom = 207 +NR_setsockopt = 208 +NR_getsockopt = 209 +NR_shutdown = 210 +NR_sendmsg = 211 +NR_recvmsg = 212 +NR_readahead = 213 +NR_brk = 214 +NR_munmap = 215 +NR_mremap = 216 +NR_add_key = 217 +NR_request_key = 218 +NR_keyctl = 219 +NR_clone = 220 +NR_execve = 221 +NR3264_mmap = 222 +NR3264_fadvise64 = 223 +NR_swapon = 224 +NR_swapoff = 225 +NR_mprotect = 226 +NR_msync = 227 +NR_mlock = 228 +NR_munlock = 229 +NR_mlockall = 230 +NR_munlockall = 231 +NR_mincore = 232 +NR_madvise = 233 +NR_remap_file_pages = 234 +NR_mbind = 235 +NR_get_mempolicy = 236 +NR_set_mempolicy = 237 +NR_migrate_pages = 238 +NR_move_pages = 239 +NR_rt_tgsigqueueinfo = 240 +NR_perf_event_open = 241 +NR_accept4 = 242 +NR_recvmmsg = 243 +NR_arch_specific_syscall = 244 +NR_wait4 = 260 +NR_prlimit64 = 261 +NR_fanotify_init = 262 +NR_fanotify_mark = 263 +NR_name_to_handle_at = 264 +NR_open_by_handle_at = 265 +NR_clock_adjtime = 266 +NR_syncfs = 267 +NR_setns = 268 +NR_sendmmsg = 269 +NR_process_vm_readv = 270 +NR_process_vm_writev = 271 +NR_kcmp = 272 +NR_finit_module = 273 +NR_sched_setattr = 274 +NR_sched_getattr = 275 +NR_renameat2 = 276 +NR_seccomp = 277 +NR_getrandom = 278 +NR_memfd_create = 279 +NR_bpf = 280 +NR_execveat = 281 +NR_userfaultfd = 282 +NR_membarrier = 283 +NR_mlock2 = 284 +NR_copy_file_range = 285 +NR_preadv2 = 286 +NR_pwritev2 = 287 +NR_pkey_mprotect = 288 +NR_pkey_alloc = 289 +NR_pkey_free = 290 +NR_statx = 291 +NR_io_pgetevents = 292 +NR_rseq = 293 +NR_kexec_file_load = 294 +NR_pidfd_send_signal = 424 +NR_io_uring_setup = 425 +NR_io_uring_enter = 426 +NR_io_uring_register = 427 +NR_open_tree = 428 +NR_move_mount = 429 +NR_fsopen = 430 +NR_fsconfig = 431 +NR_fsmount = 432 +NR_fspick = 433 +NR_pidfd_open = 434 +NR_clone3 = 435 +NR_close_range = 436 +NR_openat2 = 437 +NR_pidfd_getfd = 438 +NR_faccessat2 = 439 +NR_process_madvise = 440 +NR_epoll_pwait2 = 441 +NR_mount_setattr = 442 +NR_quotactl_fd = 443 +NR_landlock_create_ruleset = 444 +NR_landlock_add_rule = 445 +NR_landlock_restrict_self = 446 +NR_process_mrelease = 448 +NR_futex_waitv = 449 +NR_set_mempolicy_home_node = 450 +NR_cachestat = 451 +NR_fchmodat2 = 452 +NR_map_shadow_stack = 453 +NR_futex_wake = 454 +NR_futex_wait = 455 +NR_futex_requeue = 456 +NR_statmount = 457 +NR_listmount = 458 +NR_lsm_get_self_attr = 459 +NR_lsm_set_self_attr = 460 +NR_lsm_list_modules = 461 +NR_mseal = 462 +NR_setxattrat = 463 +NR_getxattrat = 464 +NR_listxattrat = 465 +NR_removexattrat = 466 +NR_open_tree_attr = 467 +NR_file_getattr = 468 +NR_file_setattr = 469 +NR_syscalls = 470 +NR_fcntl = NR3264_fcntl +NR_statfs = NR3264_statfs +NR_fstatfs = NR3264_fstatfs +NR_truncate = NR3264_truncate +NR_ftruncate = NR3264_ftruncate +NR_lseek = NR3264_lseek +NR_sendfile = NR3264_sendfile +NR_mmap = NR3264_mmap +NR_fadvise64 = NR3264_fadvise64 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/iokit.py b/artifacts/package_runtime/tinygrad/runtime/autogen/iokit.py new file mode 100644 index 000000000..7f378974b --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/iokit.py @@ -0,0 +1,275 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +dll = c.DLL('iokit', 'IOKit') +class struct_IONotificationPort(c.Struct): pass +IONotificationPortRef: TypeAlias = c.POINTER[struct_IONotificationPort] +IOServiceMatchingCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32]] +IOServiceInterestCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_void_p]] +mach_port_t: TypeAlias = ctypes.c_uint32 +try: kIOMainPortDefault = mach_port_t.in_dll(dll, 'kIOMainPortDefault') # type: ignore +except (ValueError,AttributeError): pass +kern_return_t: TypeAlias = ctypes.c_int32 +@dll.bind(kern_return_t, mach_port_t, c.POINTER[mach_port_t]) +def IOMainPort(bootstrapPort:mach_port_t, mainPort:c.POINTER[mach_port_t]) -> kern_return_t: ... +try: kIOMasterPortDefault = mach_port_t.in_dll(dll, 'kIOMasterPortDefault') # type: ignore +except (ValueError,AttributeError): pass +@dll.bind(kern_return_t, mach_port_t, c.POINTER[mach_port_t]) +def IOMasterPort(bootstrapPort:mach_port_t, mainPort:c.POINTER[mach_port_t]) -> kern_return_t: ... +@dll.bind(IONotificationPortRef, mach_port_t) +def IONotificationPortCreate(mainPort:mach_port_t) -> IONotificationPortRef: ... +@dll.bind(None, IONotificationPortRef) +def IONotificationPortDestroy(notify:IONotificationPortRef) -> None: ... +class struct___CFRunLoopSource(c.Struct): pass +CFRunLoopSourceRef: TypeAlias = c.POINTER[struct___CFRunLoopSource] +@dll.bind(CFRunLoopSourceRef, IONotificationPortRef) +def IONotificationPortGetRunLoopSource(notify:IONotificationPortRef) -> CFRunLoopSourceRef: ... +@dll.bind(mach_port_t, IONotificationPortRef) +def IONotificationPortGetMachPort(notify:IONotificationPortRef) -> mach_port_t: ... +@dll.bind(kern_return_t, IONotificationPortRef) +def IONotificationPortSetImportanceReceiver(notify:IONotificationPortRef) -> kern_return_t: ... +class struct_dispatch_queue_s(c.Struct): pass +dispatch_queue_t: TypeAlias = c.POINTER[struct_dispatch_queue_s] +@dll.bind(None, IONotificationPortRef, dispatch_queue_t) +def IONotificationPortSetDispatchQueue(notify:IONotificationPortRef, queue:dispatch_queue_t) -> None: ... +@c.record +class mach_msg_header_t(c.Struct): + SIZE = 24 + msgh_bits: int + msgh_size: int + msgh_remote_port: int + msgh_local_port: int + msgh_voucher_port: int + msgh_id: int +mach_msg_bits_t: TypeAlias = ctypes.c_uint32 +mach_msg_size_t: TypeAlias = ctypes.c_uint32 +mach_port_name_t: TypeAlias = ctypes.c_uint32 +mach_msg_id_t: TypeAlias = ctypes.c_int32 +mach_msg_header_t.register_fields([('msgh_bits', mach_msg_bits_t, 0), ('msgh_size', mach_msg_size_t, 4), ('msgh_remote_port', mach_port_t, 8), ('msgh_local_port', mach_port_t, 12), ('msgh_voucher_port', mach_port_name_t, 16), ('msgh_id', mach_msg_id_t, 20)]) +@dll.bind(None, ctypes.c_void_p, c.POINTER[mach_msg_header_t], ctypes.c_void_p) +def IODispatchCalloutFromMessage(unused:ctypes.c_void_p, msg:c.POINTER[mach_msg_header_t], reference:ctypes.c_void_p) -> None: ... +uint32_t: TypeAlias = ctypes.c_uint32 +@dll.bind(kern_return_t, uint32_t, c.POINTER[mach_port_t]) +def IOCreateReceivePort(msgType:uint32_t, recvPort:c.POINTER[mach_port_t]) -> kern_return_t: ... +io_object_t: TypeAlias = ctypes.c_uint32 +@dll.bind(kern_return_t, io_object_t) +def IOObjectRelease(object:io_object_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_object_t) +def IOObjectRetain(object:io_object_t) -> kern_return_t: ... +io_name_t: TypeAlias = c.Array[ctypes.c_char, Literal[128]] +@dll.bind(kern_return_t, io_object_t, io_name_t) +def IOObjectGetClass(object:io_object_t, className:io_name_t) -> kern_return_t: ... +class struct___CFString(c.Struct): pass +CFStringRef: TypeAlias = c.POINTER[struct___CFString] +@dll.bind(CFStringRef, io_object_t) +def IOObjectCopyClass(object:io_object_t) -> CFStringRef: ... +@dll.bind(CFStringRef, CFStringRef) +def IOObjectCopySuperclassForClass(classname:CFStringRef) -> CFStringRef: ... +@dll.bind(CFStringRef, CFStringRef) +def IOObjectCopyBundleIdentifierForClass(classname:CFStringRef) -> CFStringRef: ... +boolean_t: TypeAlias = ctypes.c_int32 +@dll.bind(boolean_t, io_object_t, io_name_t) +def IOObjectConformsTo(object:io_object_t, className:io_name_t) -> boolean_t: ... +@dll.bind(boolean_t, io_object_t, io_object_t) +def IOObjectIsEqualTo(object:io_object_t, anObject:io_object_t) -> boolean_t: ... +@dll.bind(uint32_t, io_object_t) +def IOObjectGetKernelRetainCount(object:io_object_t) -> uint32_t: ... +@dll.bind(uint32_t, io_object_t) +def IOObjectGetUserRetainCount(object:io_object_t) -> uint32_t: ... +@dll.bind(uint32_t, io_object_t) +def IOObjectGetRetainCount(object:io_object_t) -> uint32_t: ... +io_iterator_t: TypeAlias = ctypes.c_uint32 +@dll.bind(io_object_t, io_iterator_t) +def IOIteratorNext(iterator:io_iterator_t) -> io_object_t: ... +@dll.bind(None, io_iterator_t) +def IOIteratorReset(iterator:io_iterator_t) -> None: ... +@dll.bind(boolean_t, io_iterator_t) +def IOIteratorIsValid(iterator:io_iterator_t) -> boolean_t: ... +io_service_t: TypeAlias = ctypes.c_uint32 +class struct___CFDictionary(c.Struct): pass +CFDictionaryRef: TypeAlias = c.POINTER[struct___CFDictionary] +@dll.bind(io_service_t, mach_port_t, CFDictionaryRef) +def IOServiceGetMatchingService(mainPort:mach_port_t, matching:CFDictionaryRef) -> io_service_t: ... +@dll.bind(kern_return_t, mach_port_t, CFDictionaryRef, c.POINTER[io_iterator_t]) +def IOServiceGetMatchingServices(mainPort:mach_port_t, matching:CFDictionaryRef, existing:c.POINTER[io_iterator_t]) -> kern_return_t: ... +uintptr_t: TypeAlias = ctypes.c_uint64 +@dll.bind(kern_return_t, mach_port_t, io_name_t, CFDictionaryRef, mach_port_t, uintptr_t, c.POINTER[io_iterator_t]) +def IOServiceAddNotification(mainPort:mach_port_t, notificationType:io_name_t, matching:CFDictionaryRef, wakePort:mach_port_t, reference:uintptr_t, notification:c.POINTER[io_iterator_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, IONotificationPortRef, io_name_t, CFDictionaryRef, IOServiceMatchingCallback, ctypes.c_void_p, c.POINTER[io_iterator_t]) +def IOServiceAddMatchingNotification(notifyPort:IONotificationPortRef, notificationType:io_name_t, matching:CFDictionaryRef, callback:IOServiceMatchingCallback, refCon:ctypes.c_void_p, notification:c.POINTER[io_iterator_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, IONotificationPortRef, io_service_t, io_name_t, IOServiceInterestCallback, ctypes.c_void_p, c.POINTER[io_object_t]) +def IOServiceAddInterestNotification(notifyPort:IONotificationPortRef, service:io_service_t, interestType:io_name_t, callback:IOServiceInterestCallback, refCon:ctypes.c_void_p, notification:c.POINTER[io_object_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_service_t, CFDictionaryRef, c.POINTER[boolean_t]) +def IOServiceMatchPropertyTable(service:io_service_t, matching:CFDictionaryRef, matches:c.POINTER[boolean_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_service_t, c.POINTER[uint32_t]) +def IOServiceGetBusyState(service:io_service_t, busyState:c.POINTER[uint32_t]) -> kern_return_t: ... +@c.record +class struct_mach_timespec(c.Struct): + SIZE = 8 + tv_sec: int + tv_nsec: int +mach_timespec_t: TypeAlias = struct_mach_timespec +clock_res_t: TypeAlias = ctypes.c_int32 +struct_mach_timespec.register_fields([('tv_sec', ctypes.c_uint32, 0), ('tv_nsec', clock_res_t, 4)]) +@dll.bind(kern_return_t, io_service_t, c.POINTER[mach_timespec_t]) +def IOServiceWaitQuiet(service:io_service_t, waitTime:c.POINTER[mach_timespec_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, c.POINTER[uint32_t]) +def IOKitGetBusyState(mainPort:mach_port_t, busyState:c.POINTER[uint32_t]) -> kern_return_t: ... +IOOptionBits: TypeAlias = ctypes.c_uint32 +@dll.bind(kern_return_t, mach_port_t, c.POINTER[mach_timespec_t], IOOptionBits) +def IOKitWaitQuietWithOptions(mainPort:mach_port_t, waitTime:c.POINTER[mach_timespec_t], options:IOOptionBits) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, c.POINTER[mach_timespec_t]) +def IOKitWaitQuiet(mainPort:mach_port_t, waitTime:c.POINTER[mach_timespec_t]) -> kern_return_t: ... +task_port_t: TypeAlias = ctypes.c_uint32 +io_connect_t: TypeAlias = ctypes.c_uint32 +@dll.bind(kern_return_t, io_service_t, task_port_t, uint32_t, c.POINTER[io_connect_t]) +def IOServiceOpen(service:io_service_t, owningTask:task_port_t, type:uint32_t, connect:c.POINTER[io_connect_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_service_t, uint32_t) +def IOServiceRequestProbe(service:io_service_t, options:uint32_t) -> kern_return_t: ... +_anonenum0: dict[int, str] = {(kIOServiceInteractionAllowed:=1): 'kIOServiceInteractionAllowed'} +@dll.bind(kern_return_t, io_service_t, uint32_t) +def IOServiceAuthorize(service:io_service_t, options:uint32_t) -> kern_return_t: ... +@dll.bind(ctypes.c_int32, io_service_t, ctypes.c_int32) +def IOServiceOpenAsFileDescriptor(service:io_service_t, oflag:int) -> int: ... +@dll.bind(kern_return_t, io_connect_t) +def IOServiceClose(connect:io_connect_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t) +def IOConnectAddRef(connect:io_connect_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t) +def IOConnectRelease(connect:io_connect_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, c.POINTER[io_service_t]) +def IOConnectGetService(connect:io_connect_t, service:c.POINTER[io_service_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, mach_port_t, uintptr_t) +def IOConnectSetNotificationPort(connect:io_connect_t, type:uint32_t, port:mach_port_t, reference:uintptr_t) -> kern_return_t: ... +mach_vm_address_t: TypeAlias = ctypes.c_uint64 +mach_vm_size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(kern_return_t, io_connect_t, uint32_t, task_port_t, c.POINTER[mach_vm_address_t], c.POINTER[mach_vm_size_t], IOOptionBits) +def IOConnectMapMemory(connect:io_connect_t, memoryType:uint32_t, intoTask:task_port_t, atAddress:c.POINTER[mach_vm_address_t], ofSize:c.POINTER[mach_vm_size_t], options:IOOptionBits) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, task_port_t, c.POINTER[mach_vm_address_t], c.POINTER[mach_vm_size_t], IOOptionBits) +def IOConnectMapMemory64(connect:io_connect_t, memoryType:uint32_t, intoTask:task_port_t, atAddress:c.POINTER[mach_vm_address_t], ofSize:c.POINTER[mach_vm_size_t], options:IOOptionBits) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, task_port_t, mach_vm_address_t) +def IOConnectUnmapMemory(connect:io_connect_t, memoryType:uint32_t, fromTask:task_port_t, atAddress:mach_vm_address_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, task_port_t, mach_vm_address_t) +def IOConnectUnmapMemory64(connect:io_connect_t, memoryType:uint32_t, fromTask:task_port_t, atAddress:mach_vm_address_t) -> kern_return_t: ... +CFTypeRef: TypeAlias = ctypes.c_void_p +@dll.bind(kern_return_t, io_connect_t, CFTypeRef) +def IOConnectSetCFProperties(connect:io_connect_t, properties:CFTypeRef) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, CFStringRef, CFTypeRef) +def IOConnectSetCFProperty(connect:io_connect_t, propertyName:CFStringRef, property:CFTypeRef) -> kern_return_t: ... +uint64_t: TypeAlias = ctypes.c_uint64 +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(kern_return_t, mach_port_t, uint32_t, c.POINTER[uint64_t], uint32_t, ctypes.c_void_p, size_t, c.POINTER[uint64_t], c.POINTER[uint32_t], ctypes.c_void_p, c.POINTER[size_t]) +def IOConnectCallMethod(connection:mach_port_t, selector:uint32_t, input:c.POINTER[uint64_t], inputCnt:uint32_t, inputStruct:ctypes.c_void_p, inputStructCnt:size_t, output:c.POINTER[uint64_t], outputCnt:c.POINTER[uint32_t], outputStruct:ctypes.c_void_p, outputStructCnt:c.POINTER[size_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t, mach_port_t, c.POINTER[uint64_t], uint32_t, c.POINTER[uint64_t], uint32_t, ctypes.c_void_p, size_t, c.POINTER[uint64_t], c.POINTER[uint32_t], ctypes.c_void_p, c.POINTER[size_t]) +def IOConnectCallAsyncMethod(connection:mach_port_t, selector:uint32_t, wake_port:mach_port_t, reference:c.POINTER[uint64_t], referenceCnt:uint32_t, input:c.POINTER[uint64_t], inputCnt:uint32_t, inputStruct:ctypes.c_void_p, inputStructCnt:size_t, output:c.POINTER[uint64_t], outputCnt:c.POINTER[uint32_t], outputStruct:ctypes.c_void_p, outputStructCnt:c.POINTER[size_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t, ctypes.c_void_p, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def IOConnectCallStructMethod(connection:mach_port_t, selector:uint32_t, inputStruct:ctypes.c_void_p, inputStructCnt:size_t, outputStruct:ctypes.c_void_p, outputStructCnt:c.POINTER[size_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t, mach_port_t, c.POINTER[uint64_t], uint32_t, ctypes.c_void_p, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def IOConnectCallAsyncStructMethod(connection:mach_port_t, selector:uint32_t, wake_port:mach_port_t, reference:c.POINTER[uint64_t], referenceCnt:uint32_t, inputStruct:ctypes.c_void_p, inputStructCnt:size_t, outputStruct:ctypes.c_void_p, outputStructCnt:c.POINTER[size_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t, c.POINTER[uint64_t], uint32_t, c.POINTER[uint64_t], c.POINTER[uint32_t]) +def IOConnectCallScalarMethod(connection:mach_port_t, selector:uint32_t, input:c.POINTER[uint64_t], inputCnt:uint32_t, output:c.POINTER[uint64_t], outputCnt:c.POINTER[uint32_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t, mach_port_t, c.POINTER[uint64_t], uint32_t, c.POINTER[uint64_t], uint32_t, c.POINTER[uint64_t], c.POINTER[uint32_t]) +def IOConnectCallAsyncScalarMethod(connection:mach_port_t, selector:uint32_t, wake_port:mach_port_t, reference:c.POINTER[uint64_t], referenceCnt:uint32_t, input:c.POINTER[uint64_t], inputCnt:uint32_t, output:c.POINTER[uint64_t], outputCnt:c.POINTER[uint32_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t) +def IOConnectTrap0(connect:io_connect_t, index:uint32_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, uintptr_t) +def IOConnectTrap1(connect:io_connect_t, index:uint32_t, p1:uintptr_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, uintptr_t, uintptr_t) +def IOConnectTrap2(connect:io_connect_t, index:uint32_t, p1:uintptr_t, p2:uintptr_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, uintptr_t, uintptr_t, uintptr_t) +def IOConnectTrap3(connect:io_connect_t, index:uint32_t, p1:uintptr_t, p2:uintptr_t, p3:uintptr_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t) +def IOConnectTrap4(connect:io_connect_t, index:uint32_t, p1:uintptr_t, p2:uintptr_t, p3:uintptr_t, p4:uintptr_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t) +def IOConnectTrap5(connect:io_connect_t, index:uint32_t, p1:uintptr_t, p2:uintptr_t, p3:uintptr_t, p4:uintptr_t, p5:uintptr_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, uint32_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t) +def IOConnectTrap6(connect:io_connect_t, index:uint32_t, p1:uintptr_t, p2:uintptr_t, p3:uintptr_t, p4:uintptr_t, p5:uintptr_t, p6:uintptr_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_connect_t, io_connect_t) +def IOConnectAddClient(connect:io_connect_t, client:io_connect_t) -> kern_return_t: ... +io_registry_entry_t: TypeAlias = ctypes.c_uint32 +@dll.bind(io_registry_entry_t, mach_port_t) +def IORegistryGetRootEntry(mainPort:mach_port_t) -> io_registry_entry_t: ... +io_string_t: TypeAlias = c.Array[ctypes.c_char, Literal[512]] +@dll.bind(io_registry_entry_t, mach_port_t, io_string_t) +def IORegistryEntryFromPath(mainPort:mach_port_t, path:io_string_t) -> io_registry_entry_t: ... +@dll.bind(io_registry_entry_t, mach_port_t, CFStringRef) +def IORegistryEntryCopyFromPath(mainPort:mach_port_t, path:CFStringRef) -> io_registry_entry_t: ... +_anonenum1: dict[int, str] = {(kIORegistryIterateRecursively:=1): 'kIORegistryIterateRecursively', (kIORegistryIterateParents:=2): 'kIORegistryIterateParents'} +@dll.bind(kern_return_t, mach_port_t, io_name_t, IOOptionBits, c.POINTER[io_iterator_t]) +def IORegistryCreateIterator(mainPort:mach_port_t, plane:io_name_t, options:IOOptionBits, iterator:c.POINTER[io_iterator_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, IOOptionBits, c.POINTER[io_iterator_t]) +def IORegistryEntryCreateIterator(entry:io_registry_entry_t, plane:io_name_t, options:IOOptionBits, iterator:c.POINTER[io_iterator_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_iterator_t) +def IORegistryIteratorEnterEntry(iterator:io_iterator_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_iterator_t) +def IORegistryIteratorExitEntry(iterator:io_iterator_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t) +def IORegistryEntryGetName(entry:io_registry_entry_t, name:io_name_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, io_name_t) +def IORegistryEntryGetNameInPlane(entry:io_registry_entry_t, plane:io_name_t, name:io_name_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, io_name_t) +def IORegistryEntryGetLocationInPlane(entry:io_registry_entry_t, plane:io_name_t, location:io_name_t) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, io_string_t) +def IORegistryEntryGetPath(entry:io_registry_entry_t, plane:io_name_t, path:io_string_t) -> kern_return_t: ... +@dll.bind(CFStringRef, io_registry_entry_t, io_name_t) +def IORegistryEntryCopyPath(entry:io_registry_entry_t, plane:io_name_t) -> CFStringRef: ... +@dll.bind(kern_return_t, io_registry_entry_t, c.POINTER[uint64_t]) +def IORegistryEntryGetRegistryEntryID(entry:io_registry_entry_t, entryID:c.POINTER[uint64_t]) -> kern_return_t: ... +CFMutableDictionaryRef: TypeAlias = c.POINTER[struct___CFDictionary] +class struct___CFAllocator(c.Struct): pass +CFAllocatorRef: TypeAlias = c.POINTER[struct___CFAllocator] +@dll.bind(kern_return_t, io_registry_entry_t, c.POINTER[CFMutableDictionaryRef], CFAllocatorRef, IOOptionBits) +def IORegistryEntryCreateCFProperties(entry:io_registry_entry_t, properties:c.POINTER[CFMutableDictionaryRef], allocator:CFAllocatorRef, options:IOOptionBits) -> kern_return_t: ... +@dll.bind(CFTypeRef, io_registry_entry_t, CFStringRef, CFAllocatorRef, IOOptionBits) +def IORegistryEntryCreateCFProperty(entry:io_registry_entry_t, key:CFStringRef, allocator:CFAllocatorRef, options:IOOptionBits) -> CFTypeRef: ... +@dll.bind(CFTypeRef, io_registry_entry_t, io_name_t, CFStringRef, CFAllocatorRef, IOOptionBits) +def IORegistryEntrySearchCFProperty(entry:io_registry_entry_t, plane:io_name_t, key:CFStringRef, allocator:CFAllocatorRef, options:IOOptionBits) -> CFTypeRef: ... +io_struct_inband_t: TypeAlias = c.Array[ctypes.c_char, Literal[4096]] +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, io_struct_inband_t, c.POINTER[uint32_t]) +def IORegistryEntryGetProperty(entry:io_registry_entry_t, propertyName:io_name_t, buffer:io_struct_inband_t, size:c.POINTER[uint32_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, CFTypeRef) +def IORegistryEntrySetCFProperties(entry:io_registry_entry_t, properties:CFTypeRef) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, CFStringRef, CFTypeRef) +def IORegistryEntrySetCFProperty(entry:io_registry_entry_t, propertyName:CFStringRef, property:CFTypeRef) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, c.POINTER[io_iterator_t]) +def IORegistryEntryGetChildIterator(entry:io_registry_entry_t, plane:io_name_t, iterator:c.POINTER[io_iterator_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, c.POINTER[io_registry_entry_t]) +def IORegistryEntryGetChildEntry(entry:io_registry_entry_t, plane:io_name_t, child:c.POINTER[io_registry_entry_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, c.POINTER[io_iterator_t]) +def IORegistryEntryGetParentIterator(entry:io_registry_entry_t, plane:io_name_t, iterator:c.POINTER[io_iterator_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, io_registry_entry_t, io_name_t, c.POINTER[io_registry_entry_t]) +def IORegistryEntryGetParentEntry(entry:io_registry_entry_t, plane:io_name_t, parent:c.POINTER[io_registry_entry_t]) -> kern_return_t: ... +@dll.bind(boolean_t, io_registry_entry_t, io_name_t) +def IORegistryEntryInPlane(entry:io_registry_entry_t, plane:io_name_t) -> boolean_t: ... +@dll.bind(CFMutableDictionaryRef, c.POINTER[ctypes.c_char]) +def IOServiceMatching(name:c.POINTER[ctypes.c_char]) -> CFMutableDictionaryRef: ... +@dll.bind(CFMutableDictionaryRef, c.POINTER[ctypes.c_char]) +def IOServiceNameMatching(name:c.POINTER[ctypes.c_char]) -> CFMutableDictionaryRef: ... +@dll.bind(CFMutableDictionaryRef, mach_port_t, uint32_t, c.POINTER[ctypes.c_char]) +def IOBSDNameMatching(mainPort:mach_port_t, options:uint32_t, bsdName:c.POINTER[ctypes.c_char]) -> CFMutableDictionaryRef: ... +@dll.bind(CFMutableDictionaryRef, mach_port_t, uint32_t, c.POINTER[ctypes.c_char]) +def IOOpenFirmwarePathMatching(mainPort:mach_port_t, options:uint32_t, path:c.POINTER[ctypes.c_char]) -> CFMutableDictionaryRef: ... +@dll.bind(CFMutableDictionaryRef, uint64_t) +def IORegistryEntryIDMatching(entryID:uint64_t) -> CFMutableDictionaryRef: ... +@dll.bind(kern_return_t, mach_port_t, io_name_t, io_name_t) +def IOServiceOFPathToBSDName(mainPort:mach_port_t, openFirmwarePath:io_name_t, bsdName:io_name_t) -> kern_return_t: ... +IOAsyncCallback0: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_int32]] +IOAsyncCallback1: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_int32, ctypes.c_void_p]] +IOAsyncCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_int32, ctypes.c_void_p, ctypes.c_void_p]] +IOAsyncCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_int32, c.POINTER[ctypes.c_void_p], ctypes.c_uint32]] +vm_size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(kern_return_t, c.POINTER[mach_msg_header_t], uint32_t, c.POINTER[uint32_t], c.POINTER[uintptr_t], c.POINTER[ctypes.c_void_p], c.POINTER[vm_size_t]) +def OSGetNotificationFromMessage(msg:c.POINTER[mach_msg_header_t], index:uint32_t, type:c.POINTER[uint32_t], reference:c.POINTER[uintptr_t], content:c.POINTER[ctypes.c_void_p], size:c.POINTER[vm_size_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t, c.POINTER[ctypes.c_char], uint32_t) +def IOCatalogueSendData(mainPort:mach_port_t, flag:uint32_t, buffer:c.POINTER[ctypes.c_char], size:uint32_t) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t, io_name_t) +def IOCatalogueTerminate(mainPort:mach_port_t, flag:uint32_t, description:io_name_t) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[uint32_t]) +def IOCatalogueGetData(mainPort:mach_port_t, flag:uint32_t, buffer:c.POINTER[c.POINTER[ctypes.c_char]], size:c.POINTER[uint32_t]) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, io_name_t) +def IOCatalogueModuleLoaded(mainPort:mach_port_t, name:io_name_t) -> kern_return_t: ... +@dll.bind(kern_return_t, mach_port_t, uint32_t) +def IOCatalogueReset(mainPort:mach_port_t, flag:uint32_t) -> kern_return_t: ... diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/kfd.py b/artifacts/package_runtime/tinygrad/runtime/autogen/kfd.py new file mode 100644 index 000000000..06385203f --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/kfd.py @@ -0,0 +1,819 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class struct_kfd_ioctl_get_version_args(c.Struct): + SIZE = 8 + major_version: int + minor_version: int +__u32: TypeAlias = ctypes.c_uint32 +struct_kfd_ioctl_get_version_args.register_fields([('major_version', ctypes.c_uint32, 0), ('minor_version', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_create_queue_args(c.Struct): + SIZE = 96 + ring_base_address: int + write_pointer_address: int + read_pointer_address: int + doorbell_offset: int + ring_size: int + gpu_id: int + queue_type: int + queue_percentage: int + queue_priority: int + queue_id: int + eop_buffer_address: int + eop_buffer_size: int + ctx_save_restore_address: int + ctx_save_restore_size: int + ctl_stack_size: int + sdma_engine_id: int + pad: int +__u64: TypeAlias = ctypes.c_uint64 +struct_kfd_ioctl_create_queue_args.register_fields([('ring_base_address', ctypes.c_uint64, 0), ('write_pointer_address', ctypes.c_uint64, 8), ('read_pointer_address', ctypes.c_uint64, 16), ('doorbell_offset', ctypes.c_uint64, 24), ('ring_size', ctypes.c_uint32, 32), ('gpu_id', ctypes.c_uint32, 36), ('queue_type', ctypes.c_uint32, 40), ('queue_percentage', ctypes.c_uint32, 44), ('queue_priority', ctypes.c_uint32, 48), ('queue_id', ctypes.c_uint32, 52), ('eop_buffer_address', ctypes.c_uint64, 56), ('eop_buffer_size', ctypes.c_uint64, 64), ('ctx_save_restore_address', ctypes.c_uint64, 72), ('ctx_save_restore_size', ctypes.c_uint32, 80), ('ctl_stack_size', ctypes.c_uint32, 84), ('sdma_engine_id', ctypes.c_uint32, 88), ('pad', ctypes.c_uint32, 92)]) +@c.record +class struct_kfd_ioctl_destroy_queue_args(c.Struct): + SIZE = 8 + queue_id: int + pad: int +struct_kfd_ioctl_destroy_queue_args.register_fields([('queue_id', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_update_queue_args(c.Struct): + SIZE = 24 + ring_base_address: int + queue_id: int + ring_size: int + queue_percentage: int + queue_priority: int +struct_kfd_ioctl_update_queue_args.register_fields([('ring_base_address', ctypes.c_uint64, 0), ('queue_id', ctypes.c_uint32, 8), ('ring_size', ctypes.c_uint32, 12), ('queue_percentage', ctypes.c_uint32, 16), ('queue_priority', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_set_cu_mask_args(c.Struct): + SIZE = 16 + queue_id: int + num_cu_mask: int + cu_mask_ptr: int +struct_kfd_ioctl_set_cu_mask_args.register_fields([('queue_id', ctypes.c_uint32, 0), ('num_cu_mask', ctypes.c_uint32, 4), ('cu_mask_ptr', ctypes.c_uint64, 8)]) +@c.record +class struct_kfd_ioctl_get_queue_wave_state_args(c.Struct): + SIZE = 24 + ctl_stack_address: int + ctl_stack_used_size: int + save_area_used_size: int + queue_id: int + pad: int +struct_kfd_ioctl_get_queue_wave_state_args.register_fields([('ctl_stack_address', ctypes.c_uint64, 0), ('ctl_stack_used_size', ctypes.c_uint32, 8), ('save_area_used_size', ctypes.c_uint32, 12), ('queue_id', ctypes.c_uint32, 16), ('pad', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_get_available_memory_args(c.Struct): + SIZE = 16 + available: int + gpu_id: int + pad: int +struct_kfd_ioctl_get_available_memory_args.register_fields([('available', ctypes.c_uint64, 0), ('gpu_id', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_dbg_device_info_entry(c.Struct): + SIZE = 120 + exception_status: int + lds_base: int + lds_limit: int + scratch_base: int + scratch_limit: int + gpuvm_base: int + gpuvm_limit: int + gpu_id: int + location_id: int + vendor_id: int + device_id: int + revision_id: int + subsystem_vendor_id: int + subsystem_device_id: int + fw_version: int + gfx_target_version: int + simd_count: int + max_waves_per_simd: int + array_count: int + simd_arrays_per_engine: int + num_xcc: int + capability: int + debug_prop: int +struct_kfd_dbg_device_info_entry.register_fields([('exception_status', ctypes.c_uint64, 0), ('lds_base', ctypes.c_uint64, 8), ('lds_limit', ctypes.c_uint64, 16), ('scratch_base', ctypes.c_uint64, 24), ('scratch_limit', ctypes.c_uint64, 32), ('gpuvm_base', ctypes.c_uint64, 40), ('gpuvm_limit', ctypes.c_uint64, 48), ('gpu_id', ctypes.c_uint32, 56), ('location_id', ctypes.c_uint32, 60), ('vendor_id', ctypes.c_uint32, 64), ('device_id', ctypes.c_uint32, 68), ('revision_id', ctypes.c_uint32, 72), ('subsystem_vendor_id', ctypes.c_uint32, 76), ('subsystem_device_id', ctypes.c_uint32, 80), ('fw_version', ctypes.c_uint32, 84), ('gfx_target_version', ctypes.c_uint32, 88), ('simd_count', ctypes.c_uint32, 92), ('max_waves_per_simd', ctypes.c_uint32, 96), ('array_count', ctypes.c_uint32, 100), ('simd_arrays_per_engine', ctypes.c_uint32, 104), ('num_xcc', ctypes.c_uint32, 108), ('capability', ctypes.c_uint32, 112), ('debug_prop', ctypes.c_uint32, 116)]) +@c.record +class struct_kfd_ioctl_set_memory_policy_args(c.Struct): + SIZE = 32 + alternate_aperture_base: int + alternate_aperture_size: int + gpu_id: int + default_policy: int + alternate_policy: int + pad: int +struct_kfd_ioctl_set_memory_policy_args.register_fields([('alternate_aperture_base', ctypes.c_uint64, 0), ('alternate_aperture_size', ctypes.c_uint64, 8), ('gpu_id', ctypes.c_uint32, 16), ('default_policy', ctypes.c_uint32, 20), ('alternate_policy', ctypes.c_uint32, 24), ('pad', ctypes.c_uint32, 28)]) +@c.record +class struct_kfd_ioctl_get_clock_counters_args(c.Struct): + SIZE = 40 + gpu_clock_counter: int + cpu_clock_counter: int + system_clock_counter: int + system_clock_freq: int + gpu_id: int + pad: int +struct_kfd_ioctl_get_clock_counters_args.register_fields([('gpu_clock_counter', ctypes.c_uint64, 0), ('cpu_clock_counter', ctypes.c_uint64, 8), ('system_clock_counter', ctypes.c_uint64, 16), ('system_clock_freq', ctypes.c_uint64, 24), ('gpu_id', ctypes.c_uint32, 32), ('pad', ctypes.c_uint32, 36)]) +@c.record +class struct_kfd_process_device_apertures(c.Struct): + SIZE = 56 + lds_base: int + lds_limit: int + scratch_base: int + scratch_limit: int + gpuvm_base: int + gpuvm_limit: int + gpu_id: int + pad: int +struct_kfd_process_device_apertures.register_fields([('lds_base', ctypes.c_uint64, 0), ('lds_limit', ctypes.c_uint64, 8), ('scratch_base', ctypes.c_uint64, 16), ('scratch_limit', ctypes.c_uint64, 24), ('gpuvm_base', ctypes.c_uint64, 32), ('gpuvm_limit', ctypes.c_uint64, 40), ('gpu_id', ctypes.c_uint32, 48), ('pad', ctypes.c_uint32, 52)]) +@c.record +class struct_kfd_ioctl_get_process_apertures_args(c.Struct): + SIZE = 400 + process_apertures: c.Array[struct_kfd_process_device_apertures, Literal[7]] + num_of_nodes: int + pad: int +struct_kfd_ioctl_get_process_apertures_args.register_fields([('process_apertures', c.Array[struct_kfd_process_device_apertures, Literal[7]], 0), ('num_of_nodes', ctypes.c_uint32, 392), ('pad', ctypes.c_uint32, 396)]) +@c.record +class struct_kfd_ioctl_get_process_apertures_new_args(c.Struct): + SIZE = 16 + kfd_process_device_apertures_ptr: int + num_of_nodes: int + pad: int +struct_kfd_ioctl_get_process_apertures_new_args.register_fields([('kfd_process_device_apertures_ptr', ctypes.c_uint64, 0), ('num_of_nodes', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_dbg_register_args(c.Struct): + SIZE = 8 + gpu_id: int + pad: int +struct_kfd_ioctl_dbg_register_args.register_fields([('gpu_id', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_dbg_unregister_args(c.Struct): + SIZE = 8 + gpu_id: int + pad: int +struct_kfd_ioctl_dbg_unregister_args.register_fields([('gpu_id', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_dbg_address_watch_args(c.Struct): + SIZE = 16 + content_ptr: int + gpu_id: int + buf_size_in_bytes: int +struct_kfd_ioctl_dbg_address_watch_args.register_fields([('content_ptr', ctypes.c_uint64, 0), ('gpu_id', ctypes.c_uint32, 8), ('buf_size_in_bytes', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_dbg_wave_control_args(c.Struct): + SIZE = 16 + content_ptr: int + gpu_id: int + buf_size_in_bytes: int +struct_kfd_ioctl_dbg_wave_control_args.register_fields([('content_ptr', ctypes.c_uint64, 0), ('gpu_id', ctypes.c_uint32, 8), ('buf_size_in_bytes', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_dbg_trap_args_deprecated(c.Struct): + SIZE = 40 + exception_mask: int + ptr: int + pid: int + op: int + data1: int + data2: int + data3: int + data4: int +struct_kfd_ioctl_dbg_trap_args_deprecated.register_fields([('exception_mask', ctypes.c_uint64, 0), ('ptr', ctypes.c_uint64, 8), ('pid', ctypes.c_uint32, 16), ('op', ctypes.c_uint32, 20), ('data1', ctypes.c_uint32, 24), ('data2', ctypes.c_uint32, 28), ('data3', ctypes.c_uint32, 32), ('data4', ctypes.c_uint32, 36)]) +@c.record +class struct_kfd_ioctl_create_event_args(c.Struct): + SIZE = 32 + event_page_offset: int + event_trigger_data: int + event_type: int + auto_reset: int + node_id: int + event_id: int + event_slot_index: int +struct_kfd_ioctl_create_event_args.register_fields([('event_page_offset', ctypes.c_uint64, 0), ('event_trigger_data', ctypes.c_uint32, 8), ('event_type', ctypes.c_uint32, 12), ('auto_reset', ctypes.c_uint32, 16), ('node_id', ctypes.c_uint32, 20), ('event_id', ctypes.c_uint32, 24), ('event_slot_index', ctypes.c_uint32, 28)]) +@c.record +class struct_kfd_ioctl_destroy_event_args(c.Struct): + SIZE = 8 + event_id: int + pad: int +struct_kfd_ioctl_destroy_event_args.register_fields([('event_id', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_set_event_args(c.Struct): + SIZE = 8 + event_id: int + pad: int +struct_kfd_ioctl_set_event_args.register_fields([('event_id', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_reset_event_args(c.Struct): + SIZE = 8 + event_id: int + pad: int +struct_kfd_ioctl_reset_event_args.register_fields([('event_id', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_memory_exception_failure(c.Struct): + SIZE = 16 + NotPresent: int + ReadOnly: int + NoExecute: int + imprecise: int +struct_kfd_memory_exception_failure.register_fields([('NotPresent', ctypes.c_uint32, 0), ('ReadOnly', ctypes.c_uint32, 4), ('NoExecute', ctypes.c_uint32, 8), ('imprecise', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_hsa_memory_exception_data(c.Struct): + SIZE = 32 + failure: struct_kfd_memory_exception_failure + va: int + gpu_id: int + ErrorType: int +struct_kfd_hsa_memory_exception_data.register_fields([('failure', struct_kfd_memory_exception_failure, 0), ('va', ctypes.c_uint64, 16), ('gpu_id', ctypes.c_uint32, 24), ('ErrorType', ctypes.c_uint32, 28)]) +@c.record +class struct_kfd_hsa_hw_exception_data(c.Struct): + SIZE = 16 + reset_type: int + reset_cause: int + memory_lost: int + gpu_id: int +struct_kfd_hsa_hw_exception_data.register_fields([('reset_type', ctypes.c_uint32, 0), ('reset_cause', ctypes.c_uint32, 4), ('memory_lost', ctypes.c_uint32, 8), ('gpu_id', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_hsa_signal_event_data(c.Struct): + SIZE = 8 + last_event_age: int +struct_kfd_hsa_signal_event_data.register_fields([('last_event_age', ctypes.c_uint64, 0)]) +@c.record +class struct_kfd_event_data(c.Struct): + SIZE = 48 + memory_exception_data: struct_kfd_hsa_memory_exception_data + hw_exception_data: struct_kfd_hsa_hw_exception_data + signal_event_data: struct_kfd_hsa_signal_event_data + kfd_event_data_ext: int + event_id: int + pad: int +struct_kfd_event_data.register_fields([('memory_exception_data', struct_kfd_hsa_memory_exception_data, 0), ('hw_exception_data', struct_kfd_hsa_hw_exception_data, 0), ('signal_event_data', struct_kfd_hsa_signal_event_data, 0), ('kfd_event_data_ext', ctypes.c_uint64, 32), ('event_id', ctypes.c_uint32, 40), ('pad', ctypes.c_uint32, 44)]) +@c.record +class struct_kfd_ioctl_wait_events_args(c.Struct): + SIZE = 24 + events_ptr: int + num_events: int + wait_for_all: int + timeout: int + wait_result: int +struct_kfd_ioctl_wait_events_args.register_fields([('events_ptr', ctypes.c_uint64, 0), ('num_events', ctypes.c_uint32, 8), ('wait_for_all', ctypes.c_uint32, 12), ('timeout', ctypes.c_uint32, 16), ('wait_result', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_set_scratch_backing_va_args(c.Struct): + SIZE = 16 + va_addr: int + gpu_id: int + pad: int +struct_kfd_ioctl_set_scratch_backing_va_args.register_fields([('va_addr', ctypes.c_uint64, 0), ('gpu_id', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_get_tile_config_args(c.Struct): + SIZE = 40 + tile_config_ptr: int + macro_tile_config_ptr: int + num_tile_configs: int + num_macro_tile_configs: int + gpu_id: int + gb_addr_config: int + num_banks: int + num_ranks: int +struct_kfd_ioctl_get_tile_config_args.register_fields([('tile_config_ptr', ctypes.c_uint64, 0), ('macro_tile_config_ptr', ctypes.c_uint64, 8), ('num_tile_configs', ctypes.c_uint32, 16), ('num_macro_tile_configs', ctypes.c_uint32, 20), ('gpu_id', ctypes.c_uint32, 24), ('gb_addr_config', ctypes.c_uint32, 28), ('num_banks', ctypes.c_uint32, 32), ('num_ranks', ctypes.c_uint32, 36)]) +@c.record +class struct_kfd_ioctl_set_trap_handler_args(c.Struct): + SIZE = 24 + tba_addr: int + tma_addr: int + gpu_id: int + pad: int +struct_kfd_ioctl_set_trap_handler_args.register_fields([('tba_addr', ctypes.c_uint64, 0), ('tma_addr', ctypes.c_uint64, 8), ('gpu_id', ctypes.c_uint32, 16), ('pad', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_acquire_vm_args(c.Struct): + SIZE = 8 + drm_fd: int + gpu_id: int +struct_kfd_ioctl_acquire_vm_args.register_fields([('drm_fd', ctypes.c_uint32, 0), ('gpu_id', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_alloc_memory_of_gpu_args(c.Struct): + SIZE = 40 + va_addr: int + size: int + handle: int + mmap_offset: int + gpu_id: int + flags: int +struct_kfd_ioctl_alloc_memory_of_gpu_args.register_fields([('va_addr', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('handle', ctypes.c_uint64, 16), ('mmap_offset', ctypes.c_uint64, 24), ('gpu_id', ctypes.c_uint32, 32), ('flags', ctypes.c_uint32, 36)]) +@c.record +class struct_kfd_ioctl_free_memory_of_gpu_args(c.Struct): + SIZE = 8 + handle: int +struct_kfd_ioctl_free_memory_of_gpu_args.register_fields([('handle', ctypes.c_uint64, 0)]) +@c.record +class struct_kfd_ioctl_map_memory_to_gpu_args(c.Struct): + SIZE = 24 + handle: int + device_ids_array_ptr: int + n_devices: int + n_success: int +struct_kfd_ioctl_map_memory_to_gpu_args.register_fields([('handle', ctypes.c_uint64, 0), ('device_ids_array_ptr', ctypes.c_uint64, 8), ('n_devices', ctypes.c_uint32, 16), ('n_success', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_unmap_memory_from_gpu_args(c.Struct): + SIZE = 24 + handle: int + device_ids_array_ptr: int + n_devices: int + n_success: int +struct_kfd_ioctl_unmap_memory_from_gpu_args.register_fields([('handle', ctypes.c_uint64, 0), ('device_ids_array_ptr', ctypes.c_uint64, 8), ('n_devices', ctypes.c_uint32, 16), ('n_success', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_alloc_queue_gws_args(c.Struct): + SIZE = 16 + queue_id: int + num_gws: int + first_gws: int + pad: int +struct_kfd_ioctl_alloc_queue_gws_args.register_fields([('queue_id', ctypes.c_uint32, 0), ('num_gws', ctypes.c_uint32, 4), ('first_gws', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_get_dmabuf_info_args(c.Struct): + SIZE = 32 + size: int + metadata_ptr: int + metadata_size: int + gpu_id: int + flags: int + dmabuf_fd: int +struct_kfd_ioctl_get_dmabuf_info_args.register_fields([('size', ctypes.c_uint64, 0), ('metadata_ptr', ctypes.c_uint64, 8), ('metadata_size', ctypes.c_uint32, 16), ('gpu_id', ctypes.c_uint32, 20), ('flags', ctypes.c_uint32, 24), ('dmabuf_fd', ctypes.c_uint32, 28)]) +@c.record +class struct_kfd_ioctl_import_dmabuf_args(c.Struct): + SIZE = 24 + va_addr: int + handle: int + gpu_id: int + dmabuf_fd: int +struct_kfd_ioctl_import_dmabuf_args.register_fields([('va_addr', ctypes.c_uint64, 0), ('handle', ctypes.c_uint64, 8), ('gpu_id', ctypes.c_uint32, 16), ('dmabuf_fd', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_export_dmabuf_args(c.Struct): + SIZE = 16 + handle: int + flags: int + dmabuf_fd: int +struct_kfd_ioctl_export_dmabuf_args.register_fields([('handle', ctypes.c_uint64, 0), ('flags', ctypes.c_uint32, 8), ('dmabuf_fd', ctypes.c_uint32, 12)]) +enum_kfd_smi_event: dict[int, str] = {(KFD_SMI_EVENT_NONE:=0): 'KFD_SMI_EVENT_NONE', (KFD_SMI_EVENT_VMFAULT:=1): 'KFD_SMI_EVENT_VMFAULT', (KFD_SMI_EVENT_THERMAL_THROTTLE:=2): 'KFD_SMI_EVENT_THERMAL_THROTTLE', (KFD_SMI_EVENT_GPU_PRE_RESET:=3): 'KFD_SMI_EVENT_GPU_PRE_RESET', (KFD_SMI_EVENT_GPU_POST_RESET:=4): 'KFD_SMI_EVENT_GPU_POST_RESET', (KFD_SMI_EVENT_MIGRATE_START:=5): 'KFD_SMI_EVENT_MIGRATE_START', (KFD_SMI_EVENT_MIGRATE_END:=6): 'KFD_SMI_EVENT_MIGRATE_END', (KFD_SMI_EVENT_PAGE_FAULT_START:=7): 'KFD_SMI_EVENT_PAGE_FAULT_START', (KFD_SMI_EVENT_PAGE_FAULT_END:=8): 'KFD_SMI_EVENT_PAGE_FAULT_END', (KFD_SMI_EVENT_QUEUE_EVICTION:=9): 'KFD_SMI_EVENT_QUEUE_EVICTION', (KFD_SMI_EVENT_QUEUE_RESTORE:=10): 'KFD_SMI_EVENT_QUEUE_RESTORE', (KFD_SMI_EVENT_UNMAP_FROM_GPU:=11): 'KFD_SMI_EVENT_UNMAP_FROM_GPU', (KFD_SMI_EVENT_ALL_PROCESS:=64): 'KFD_SMI_EVENT_ALL_PROCESS'} +enum_KFD_MIGRATE_TRIGGERS: dict[int, str] = {(KFD_MIGRATE_TRIGGER_PREFETCH:=0): 'KFD_MIGRATE_TRIGGER_PREFETCH', (KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU:=1): 'KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU', (KFD_MIGRATE_TRIGGER_PAGEFAULT_CPU:=2): 'KFD_MIGRATE_TRIGGER_PAGEFAULT_CPU', (KFD_MIGRATE_TRIGGER_TTM_EVICTION:=3): 'KFD_MIGRATE_TRIGGER_TTM_EVICTION'} +enum_KFD_QUEUE_EVICTION_TRIGGERS: dict[int, str] = {(KFD_QUEUE_EVICTION_TRIGGER_SVM:=0): 'KFD_QUEUE_EVICTION_TRIGGER_SVM', (KFD_QUEUE_EVICTION_TRIGGER_USERPTR:=1): 'KFD_QUEUE_EVICTION_TRIGGER_USERPTR', (KFD_QUEUE_EVICTION_TRIGGER_TTM:=2): 'KFD_QUEUE_EVICTION_TRIGGER_TTM', (KFD_QUEUE_EVICTION_TRIGGER_SUSPEND:=3): 'KFD_QUEUE_EVICTION_TRIGGER_SUSPEND', (KFD_QUEUE_EVICTION_CRIU_CHECKPOINT:=4): 'KFD_QUEUE_EVICTION_CRIU_CHECKPOINT', (KFD_QUEUE_EVICTION_CRIU_RESTORE:=5): 'KFD_QUEUE_EVICTION_CRIU_RESTORE'} +enum_KFD_SVM_UNMAP_TRIGGERS: dict[int, str] = {(KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY:=0): 'KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY', (KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY_MIGRATE:=1): 'KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY_MIGRATE', (KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU:=2): 'KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU'} +@c.record +class struct_kfd_ioctl_smi_events_args(c.Struct): + SIZE = 8 + gpuid: int + anon_fd: int +struct_kfd_ioctl_smi_events_args.register_fields([('gpuid', ctypes.c_uint32, 0), ('anon_fd', ctypes.c_uint32, 4)]) +enum_kfd_ioctl_spm_op: dict[int, str] = {(KFD_IOCTL_SPM_OP_ACQUIRE:=0): 'KFD_IOCTL_SPM_OP_ACQUIRE', (KFD_IOCTL_SPM_OP_RELEASE:=1): 'KFD_IOCTL_SPM_OP_RELEASE', (KFD_IOCTL_SPM_OP_SET_DEST_BUF:=2): 'KFD_IOCTL_SPM_OP_SET_DEST_BUF'} +@c.record +class struct_kfd_ioctl_spm_args(c.Struct): + SIZE = 32 + dest_buf: int + buf_size: int + op: int + timeout: int + gpu_id: int + bytes_copied: int + has_data_loss: int +struct_kfd_ioctl_spm_args.register_fields([('dest_buf', ctypes.c_uint64, 0), ('buf_size', ctypes.c_uint32, 8), ('op', ctypes.c_uint32, 12), ('timeout', ctypes.c_uint32, 16), ('gpu_id', ctypes.c_uint32, 20), ('bytes_copied', ctypes.c_uint32, 24), ('has_data_loss', ctypes.c_uint32, 28)]) +enum_kfd_criu_op: dict[int, str] = {(KFD_CRIU_OP_PROCESS_INFO:=0): 'KFD_CRIU_OP_PROCESS_INFO', (KFD_CRIU_OP_CHECKPOINT:=1): 'KFD_CRIU_OP_CHECKPOINT', (KFD_CRIU_OP_UNPAUSE:=2): 'KFD_CRIU_OP_UNPAUSE', (KFD_CRIU_OP_RESTORE:=3): 'KFD_CRIU_OP_RESTORE', (KFD_CRIU_OP_RESUME:=4): 'KFD_CRIU_OP_RESUME'} +@c.record +class struct_kfd_ioctl_criu_args(c.Struct): + SIZE = 56 + devices: int + bos: int + priv_data: int + priv_data_size: int + num_devices: int + num_bos: int + num_objects: int + pid: int + op: int +struct_kfd_ioctl_criu_args.register_fields([('devices', ctypes.c_uint64, 0), ('bos', ctypes.c_uint64, 8), ('priv_data', ctypes.c_uint64, 16), ('priv_data_size', ctypes.c_uint64, 24), ('num_devices', ctypes.c_uint32, 32), ('num_bos', ctypes.c_uint32, 36), ('num_objects', ctypes.c_uint32, 40), ('pid', ctypes.c_uint32, 44), ('op', ctypes.c_uint32, 48)]) +@c.record +class struct_kfd_criu_device_bucket(c.Struct): + SIZE = 16 + user_gpu_id: int + actual_gpu_id: int + drm_fd: int + pad: int +struct_kfd_criu_device_bucket.register_fields([('user_gpu_id', ctypes.c_uint32, 0), ('actual_gpu_id', ctypes.c_uint32, 4), ('drm_fd', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_criu_bo_bucket(c.Struct): + SIZE = 48 + addr: int + size: int + offset: int + restored_offset: int + gpu_id: int + alloc_flags: int + dmabuf_fd: int + pad: int +struct_kfd_criu_bo_bucket.register_fields([('addr', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('offset', ctypes.c_uint64, 16), ('restored_offset', ctypes.c_uint64, 24), ('gpu_id', ctypes.c_uint32, 32), ('alloc_flags', ctypes.c_uint32, 36), ('dmabuf_fd', ctypes.c_uint32, 40), ('pad', ctypes.c_uint32, 44)]) +enum_kfd_mmio_remap: dict[int, str] = {(KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL:=0): 'KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL', (KFD_MMIO_REMAP_HDP_REG_FLUSH_CNTL:=4): 'KFD_MMIO_REMAP_HDP_REG_FLUSH_CNTL'} +@c.record +class struct_kfd_ioctl_ipc_export_handle_args(c.Struct): + SIZE = 32 + handle: int + share_handle: c.Array[ctypes.c_uint32, Literal[4]] + gpu_id: int + flags: int +struct_kfd_ioctl_ipc_export_handle_args.register_fields([('handle', ctypes.c_uint64, 0), ('share_handle', c.Array[ctypes.c_uint32, Literal[4]], 8), ('gpu_id', ctypes.c_uint32, 24), ('flags', ctypes.c_uint32, 28)]) +@c.record +class struct_kfd_ioctl_ipc_import_handle_args(c.Struct): + SIZE = 48 + handle: int + va_addr: int + mmap_offset: int + share_handle: c.Array[ctypes.c_uint32, Literal[4]] + gpu_id: int + flags: int +struct_kfd_ioctl_ipc_import_handle_args.register_fields([('handle', ctypes.c_uint64, 0), ('va_addr', ctypes.c_uint64, 8), ('mmap_offset', ctypes.c_uint64, 16), ('share_handle', c.Array[ctypes.c_uint32, Literal[4]], 24), ('gpu_id', ctypes.c_uint32, 40), ('flags', ctypes.c_uint32, 44)]) +@c.record +class struct_kfd_ioctl_cross_memory_copy_deprecated_args(c.Struct): + SIZE = 48 + pid: int + flags: int + src_mem_range_array: int + src_mem_array_size: int + dst_mem_range_array: int + dst_mem_array_size: int + bytes_copied: int +struct_kfd_ioctl_cross_memory_copy_deprecated_args.register_fields([('pid', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('src_mem_range_array', ctypes.c_uint64, 8), ('src_mem_array_size', ctypes.c_uint64, 16), ('dst_mem_range_array', ctypes.c_uint64, 24), ('dst_mem_array_size', ctypes.c_uint64, 32), ('bytes_copied', ctypes.c_uint64, 40)]) +enum_kfd_ioctl_svm_op: dict[int, str] = {(KFD_IOCTL_SVM_OP_SET_ATTR:=0): 'KFD_IOCTL_SVM_OP_SET_ATTR', (KFD_IOCTL_SVM_OP_GET_ATTR:=1): 'KFD_IOCTL_SVM_OP_GET_ATTR'} +enum_kfd_ioctl_svm_location: dict[int, str] = {(KFD_IOCTL_SVM_LOCATION_SYSMEM:=0): 'KFD_IOCTL_SVM_LOCATION_SYSMEM', (KFD_IOCTL_SVM_LOCATION_UNDEFINED:=4294967295): 'KFD_IOCTL_SVM_LOCATION_UNDEFINED'} +enum_kfd_ioctl_svm_attr_type: dict[int, str] = {(KFD_IOCTL_SVM_ATTR_PREFERRED_LOC:=0): 'KFD_IOCTL_SVM_ATTR_PREFERRED_LOC', (KFD_IOCTL_SVM_ATTR_PREFETCH_LOC:=1): 'KFD_IOCTL_SVM_ATTR_PREFETCH_LOC', (KFD_IOCTL_SVM_ATTR_ACCESS:=2): 'KFD_IOCTL_SVM_ATTR_ACCESS', (KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE:=3): 'KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE', (KFD_IOCTL_SVM_ATTR_NO_ACCESS:=4): 'KFD_IOCTL_SVM_ATTR_NO_ACCESS', (KFD_IOCTL_SVM_ATTR_SET_FLAGS:=5): 'KFD_IOCTL_SVM_ATTR_SET_FLAGS', (KFD_IOCTL_SVM_ATTR_CLR_FLAGS:=6): 'KFD_IOCTL_SVM_ATTR_CLR_FLAGS', (KFD_IOCTL_SVM_ATTR_GRANULARITY:=7): 'KFD_IOCTL_SVM_ATTR_GRANULARITY'} +@c.record +class struct_kfd_ioctl_svm_attribute(c.Struct): + SIZE = 8 + type: int + value: int +struct_kfd_ioctl_svm_attribute.register_fields([('type', ctypes.c_uint32, 0), ('value', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_svm_args(c.Struct): + SIZE = 24 + start_addr: int + size: int + op: int + nattr: int + attrs: c.Array[struct_kfd_ioctl_svm_attribute, Literal[0]] +struct_kfd_ioctl_svm_args.register_fields([('start_addr', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('op', ctypes.c_uint32, 16), ('nattr', ctypes.c_uint32, 20), ('attrs', c.Array[struct_kfd_ioctl_svm_attribute, Literal[0]], 24)]) +@c.record +class struct_kfd_ioctl_set_xnack_mode_args(c.Struct): + SIZE = 4 + xnack_enabled: int +__s32: TypeAlias = ctypes.c_int32 +struct_kfd_ioctl_set_xnack_mode_args.register_fields([('xnack_enabled', ctypes.c_int32, 0)]) +enum_kfd_dbg_trap_override_mode: dict[int, str] = {(KFD_DBG_TRAP_OVERRIDE_OR:=0): 'KFD_DBG_TRAP_OVERRIDE_OR', (KFD_DBG_TRAP_OVERRIDE_REPLACE:=1): 'KFD_DBG_TRAP_OVERRIDE_REPLACE'} +enum_kfd_dbg_trap_mask: dict[int, str] = {(KFD_DBG_TRAP_MASK_FP_INVALID:=1): 'KFD_DBG_TRAP_MASK_FP_INVALID', (KFD_DBG_TRAP_MASK_FP_INPUT_DENORMAL:=2): 'KFD_DBG_TRAP_MASK_FP_INPUT_DENORMAL', (KFD_DBG_TRAP_MASK_FP_DIVIDE_BY_ZERO:=4): 'KFD_DBG_TRAP_MASK_FP_DIVIDE_BY_ZERO', (KFD_DBG_TRAP_MASK_FP_OVERFLOW:=8): 'KFD_DBG_TRAP_MASK_FP_OVERFLOW', (KFD_DBG_TRAP_MASK_FP_UNDERFLOW:=16): 'KFD_DBG_TRAP_MASK_FP_UNDERFLOW', (KFD_DBG_TRAP_MASK_FP_INEXACT:=32): 'KFD_DBG_TRAP_MASK_FP_INEXACT', (KFD_DBG_TRAP_MASK_INT_DIVIDE_BY_ZERO:=64): 'KFD_DBG_TRAP_MASK_INT_DIVIDE_BY_ZERO', (KFD_DBG_TRAP_MASK_DBG_ADDRESS_WATCH:=128): 'KFD_DBG_TRAP_MASK_DBG_ADDRESS_WATCH', (KFD_DBG_TRAP_MASK_DBG_MEMORY_VIOLATION:=256): 'KFD_DBG_TRAP_MASK_DBG_MEMORY_VIOLATION', (KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_START:=1073741824): 'KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_START', (KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_END:=-2147483648): 'KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_END'} +enum_kfd_dbg_trap_wave_launch_mode: dict[int, str] = {(KFD_DBG_TRAP_WAVE_LAUNCH_MODE_NORMAL:=0): 'KFD_DBG_TRAP_WAVE_LAUNCH_MODE_NORMAL', (KFD_DBG_TRAP_WAVE_LAUNCH_MODE_HALT:=1): 'KFD_DBG_TRAP_WAVE_LAUNCH_MODE_HALT', (KFD_DBG_TRAP_WAVE_LAUNCH_MODE_DEBUG:=3): 'KFD_DBG_TRAP_WAVE_LAUNCH_MODE_DEBUG'} +enum_kfd_dbg_trap_address_watch_mode: dict[int, str] = {(KFD_DBG_TRAP_ADDRESS_WATCH_MODE_READ:=0): 'KFD_DBG_TRAP_ADDRESS_WATCH_MODE_READ', (KFD_DBG_TRAP_ADDRESS_WATCH_MODE_NONREAD:=1): 'KFD_DBG_TRAP_ADDRESS_WATCH_MODE_NONREAD', (KFD_DBG_TRAP_ADDRESS_WATCH_MODE_ATOMIC:=2): 'KFD_DBG_TRAP_ADDRESS_WATCH_MODE_ATOMIC', (KFD_DBG_TRAP_ADDRESS_WATCH_MODE_ALL:=3): 'KFD_DBG_TRAP_ADDRESS_WATCH_MODE_ALL'} +enum_kfd_dbg_trap_flags: dict[int, str] = {(KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP:=1): 'KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP', (KFD_DBG_TRAP_FLAG_SINGLE_ALU_OP:=2): 'KFD_DBG_TRAP_FLAG_SINGLE_ALU_OP'} +enum_kfd_dbg_trap_exception_code: dict[int, str] = {(EC_NONE:=0): 'EC_NONE', (EC_QUEUE_WAVE_ABORT:=1): 'EC_QUEUE_WAVE_ABORT', (EC_QUEUE_WAVE_TRAP:=2): 'EC_QUEUE_WAVE_TRAP', (EC_QUEUE_WAVE_MATH_ERROR:=3): 'EC_QUEUE_WAVE_MATH_ERROR', (EC_QUEUE_WAVE_ILLEGAL_INSTRUCTION:=4): 'EC_QUEUE_WAVE_ILLEGAL_INSTRUCTION', (EC_QUEUE_WAVE_MEMORY_VIOLATION:=5): 'EC_QUEUE_WAVE_MEMORY_VIOLATION', (EC_QUEUE_WAVE_APERTURE_VIOLATION:=6): 'EC_QUEUE_WAVE_APERTURE_VIOLATION', (EC_QUEUE_PACKET_DISPATCH_DIM_INVALID:=16): 'EC_QUEUE_PACKET_DISPATCH_DIM_INVALID', (EC_QUEUE_PACKET_DISPATCH_GROUP_SEGMENT_SIZE_INVALID:=17): 'EC_QUEUE_PACKET_DISPATCH_GROUP_SEGMENT_SIZE_INVALID', (EC_QUEUE_PACKET_DISPATCH_CODE_INVALID:=18): 'EC_QUEUE_PACKET_DISPATCH_CODE_INVALID', (EC_QUEUE_PACKET_RESERVED:=19): 'EC_QUEUE_PACKET_RESERVED', (EC_QUEUE_PACKET_UNSUPPORTED:=20): 'EC_QUEUE_PACKET_UNSUPPORTED', (EC_QUEUE_PACKET_DISPATCH_WORK_GROUP_SIZE_INVALID:=21): 'EC_QUEUE_PACKET_DISPATCH_WORK_GROUP_SIZE_INVALID', (EC_QUEUE_PACKET_DISPATCH_REGISTER_INVALID:=22): 'EC_QUEUE_PACKET_DISPATCH_REGISTER_INVALID', (EC_QUEUE_PACKET_VENDOR_UNSUPPORTED:=23): 'EC_QUEUE_PACKET_VENDOR_UNSUPPORTED', (EC_QUEUE_PREEMPTION_ERROR:=30): 'EC_QUEUE_PREEMPTION_ERROR', (EC_QUEUE_NEW:=31): 'EC_QUEUE_NEW', (EC_DEVICE_QUEUE_DELETE:=32): 'EC_DEVICE_QUEUE_DELETE', (EC_DEVICE_MEMORY_VIOLATION:=33): 'EC_DEVICE_MEMORY_VIOLATION', (EC_DEVICE_RAS_ERROR:=34): 'EC_DEVICE_RAS_ERROR', (EC_DEVICE_FATAL_HALT:=35): 'EC_DEVICE_FATAL_HALT', (EC_DEVICE_NEW:=36): 'EC_DEVICE_NEW', (EC_PROCESS_RUNTIME:=48): 'EC_PROCESS_RUNTIME', (EC_PROCESS_DEVICE_REMOVE:=49): 'EC_PROCESS_DEVICE_REMOVE', (EC_MAX:=50): 'EC_MAX'} +enum_kfd_dbg_runtime_state: dict[int, str] = {(DEBUG_RUNTIME_STATE_DISABLED:=0): 'DEBUG_RUNTIME_STATE_DISABLED', (DEBUG_RUNTIME_STATE_ENABLED:=1): 'DEBUG_RUNTIME_STATE_ENABLED', (DEBUG_RUNTIME_STATE_ENABLED_BUSY:=2): 'DEBUG_RUNTIME_STATE_ENABLED_BUSY', (DEBUG_RUNTIME_STATE_ENABLED_ERROR:=3): 'DEBUG_RUNTIME_STATE_ENABLED_ERROR'} +@c.record +class struct_kfd_runtime_info(c.Struct): + SIZE = 16 + r_debug: int + runtime_state: int + ttmp_setup: int +struct_kfd_runtime_info.register_fields([('r_debug', ctypes.c_uint64, 0), ('runtime_state', ctypes.c_uint32, 8), ('ttmp_setup', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_runtime_enable_args(c.Struct): + SIZE = 16 + r_debug: int + mode_mask: int + capabilities_mask: int +struct_kfd_ioctl_runtime_enable_args.register_fields([('r_debug', ctypes.c_uint64, 0), ('mode_mask', ctypes.c_uint32, 8), ('capabilities_mask', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_queue_snapshot_entry(c.Struct): + SIZE = 64 + exception_status: int + ring_base_address: int + write_pointer_address: int + read_pointer_address: int + ctx_save_restore_address: int + queue_id: int + gpu_id: int + ring_size: int + queue_type: int + ctx_save_restore_area_size: int + reserved: int +struct_kfd_queue_snapshot_entry.register_fields([('exception_status', ctypes.c_uint64, 0), ('ring_base_address', ctypes.c_uint64, 8), ('write_pointer_address', ctypes.c_uint64, 16), ('read_pointer_address', ctypes.c_uint64, 24), ('ctx_save_restore_address', ctypes.c_uint64, 32), ('queue_id', ctypes.c_uint32, 40), ('gpu_id', ctypes.c_uint32, 44), ('ring_size', ctypes.c_uint32, 48), ('queue_type', ctypes.c_uint32, 52), ('ctx_save_restore_area_size', ctypes.c_uint32, 56), ('reserved', ctypes.c_uint32, 60)]) +@c.record +class struct_kfd_context_save_area_header(c.Struct): + SIZE = 40 + wave_state: struct_kfd_context_save_area_header_wave_state + debug_offset: int + debug_size: int + err_payload_addr: int + err_event_id: int + reserved1: int +@c.record +class struct_kfd_context_save_area_header_wave_state(c.Struct): + SIZE = 16 + control_stack_offset: int + control_stack_size: int + wave_state_offset: int + wave_state_size: int +struct_kfd_context_save_area_header_wave_state.register_fields([('control_stack_offset', ctypes.c_uint32, 0), ('control_stack_size', ctypes.c_uint32, 4), ('wave_state_offset', ctypes.c_uint32, 8), ('wave_state_size', ctypes.c_uint32, 12)]) +struct_kfd_context_save_area_header.register_fields([('wave_state', struct_kfd_context_save_area_header_wave_state, 0), ('debug_offset', ctypes.c_uint32, 16), ('debug_size', ctypes.c_uint32, 20), ('err_payload_addr', ctypes.c_uint64, 24), ('err_event_id', ctypes.c_uint32, 32), ('reserved1', ctypes.c_uint32, 36)]) +enum_kfd_dbg_trap_operations: dict[int, str] = {(KFD_IOC_DBG_TRAP_ENABLE:=0): 'KFD_IOC_DBG_TRAP_ENABLE', (KFD_IOC_DBG_TRAP_DISABLE:=1): 'KFD_IOC_DBG_TRAP_DISABLE', (KFD_IOC_DBG_TRAP_SEND_RUNTIME_EVENT:=2): 'KFD_IOC_DBG_TRAP_SEND_RUNTIME_EVENT', (KFD_IOC_DBG_TRAP_SET_EXCEPTIONS_ENABLED:=3): 'KFD_IOC_DBG_TRAP_SET_EXCEPTIONS_ENABLED', (KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE:=4): 'KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE', (KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE:=5): 'KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE', (KFD_IOC_DBG_TRAP_SUSPEND_QUEUES:=6): 'KFD_IOC_DBG_TRAP_SUSPEND_QUEUES', (KFD_IOC_DBG_TRAP_RESUME_QUEUES:=7): 'KFD_IOC_DBG_TRAP_RESUME_QUEUES', (KFD_IOC_DBG_TRAP_SET_NODE_ADDRESS_WATCH:=8): 'KFD_IOC_DBG_TRAP_SET_NODE_ADDRESS_WATCH', (KFD_IOC_DBG_TRAP_CLEAR_NODE_ADDRESS_WATCH:=9): 'KFD_IOC_DBG_TRAP_CLEAR_NODE_ADDRESS_WATCH', (KFD_IOC_DBG_TRAP_SET_FLAGS:=10): 'KFD_IOC_DBG_TRAP_SET_FLAGS', (KFD_IOC_DBG_TRAP_QUERY_DEBUG_EVENT:=11): 'KFD_IOC_DBG_TRAP_QUERY_DEBUG_EVENT', (KFD_IOC_DBG_TRAP_QUERY_EXCEPTION_INFO:=12): 'KFD_IOC_DBG_TRAP_QUERY_EXCEPTION_INFO', (KFD_IOC_DBG_TRAP_GET_QUEUE_SNAPSHOT:=13): 'KFD_IOC_DBG_TRAP_GET_QUEUE_SNAPSHOT', (KFD_IOC_DBG_TRAP_GET_DEVICE_SNAPSHOT:=14): 'KFD_IOC_DBG_TRAP_GET_DEVICE_SNAPSHOT'} +@c.record +class struct_kfd_ioctl_dbg_trap_enable_args(c.Struct): + SIZE = 24 + exception_mask: int + rinfo_ptr: int + rinfo_size: int + dbg_fd: int +struct_kfd_ioctl_dbg_trap_enable_args.register_fields([('exception_mask', ctypes.c_uint64, 0), ('rinfo_ptr', ctypes.c_uint64, 8), ('rinfo_size', ctypes.c_uint32, 16), ('dbg_fd', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_dbg_trap_send_runtime_event_args(c.Struct): + SIZE = 16 + exception_mask: int + gpu_id: int + queue_id: int +struct_kfd_ioctl_dbg_trap_send_runtime_event_args.register_fields([('exception_mask', ctypes.c_uint64, 0), ('gpu_id', ctypes.c_uint32, 8), ('queue_id', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_dbg_trap_set_exceptions_enabled_args(c.Struct): + SIZE = 8 + exception_mask: int +struct_kfd_ioctl_dbg_trap_set_exceptions_enabled_args.register_fields([('exception_mask', ctypes.c_uint64, 0)]) +@c.record +class struct_kfd_ioctl_dbg_trap_set_wave_launch_override_args(c.Struct): + SIZE = 16 + override_mode: int + enable_mask: int + support_request_mask: int + pad: int +struct_kfd_ioctl_dbg_trap_set_wave_launch_override_args.register_fields([('override_mode', ctypes.c_uint32, 0), ('enable_mask', ctypes.c_uint32, 4), ('support_request_mask', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_dbg_trap_set_wave_launch_mode_args(c.Struct): + SIZE = 8 + launch_mode: int + pad: int +struct_kfd_ioctl_dbg_trap_set_wave_launch_mode_args.register_fields([('launch_mode', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_dbg_trap_suspend_queues_args(c.Struct): + SIZE = 24 + exception_mask: int + queue_array_ptr: int + num_queues: int + grace_period: int +struct_kfd_ioctl_dbg_trap_suspend_queues_args.register_fields([('exception_mask', ctypes.c_uint64, 0), ('queue_array_ptr', ctypes.c_uint64, 8), ('num_queues', ctypes.c_uint32, 16), ('grace_period', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_dbg_trap_resume_queues_args(c.Struct): + SIZE = 16 + queue_array_ptr: int + num_queues: int + pad: int +struct_kfd_ioctl_dbg_trap_resume_queues_args.register_fields([('queue_array_ptr', ctypes.c_uint64, 0), ('num_queues', ctypes.c_uint32, 8), ('pad', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_dbg_trap_set_node_address_watch_args(c.Struct): + SIZE = 24 + address: int + mode: int + mask: int + gpu_id: int + id: int +struct_kfd_ioctl_dbg_trap_set_node_address_watch_args.register_fields([('address', ctypes.c_uint64, 0), ('mode', ctypes.c_uint32, 8), ('mask', ctypes.c_uint32, 12), ('gpu_id', ctypes.c_uint32, 16), ('id', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_dbg_trap_clear_node_address_watch_args(c.Struct): + SIZE = 8 + gpu_id: int + id: int +struct_kfd_ioctl_dbg_trap_clear_node_address_watch_args.register_fields([('gpu_id', ctypes.c_uint32, 0), ('id', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_dbg_trap_set_flags_args(c.Struct): + SIZE = 8 + flags: int + pad: int +struct_kfd_ioctl_dbg_trap_set_flags_args.register_fields([('flags', ctypes.c_uint32, 0), ('pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kfd_ioctl_dbg_trap_query_debug_event_args(c.Struct): + SIZE = 16 + exception_mask: int + gpu_id: int + queue_id: int +struct_kfd_ioctl_dbg_trap_query_debug_event_args.register_fields([('exception_mask', ctypes.c_uint64, 0), ('gpu_id', ctypes.c_uint32, 8), ('queue_id', ctypes.c_uint32, 12)]) +@c.record +class struct_kfd_ioctl_dbg_trap_query_exception_info_args(c.Struct): + SIZE = 24 + info_ptr: int + info_size: int + source_id: int + exception_code: int + clear_exception: int +struct_kfd_ioctl_dbg_trap_query_exception_info_args.register_fields([('info_ptr', ctypes.c_uint64, 0), ('info_size', ctypes.c_uint32, 8), ('source_id', ctypes.c_uint32, 12), ('exception_code', ctypes.c_uint32, 16), ('clear_exception', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_dbg_trap_queue_snapshot_args(c.Struct): + SIZE = 24 + exception_mask: int + snapshot_buf_ptr: int + num_queues: int + entry_size: int +struct_kfd_ioctl_dbg_trap_queue_snapshot_args.register_fields([('exception_mask', ctypes.c_uint64, 0), ('snapshot_buf_ptr', ctypes.c_uint64, 8), ('num_queues', ctypes.c_uint32, 16), ('entry_size', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_dbg_trap_device_snapshot_args(c.Struct): + SIZE = 24 + exception_mask: int + snapshot_buf_ptr: int + num_devices: int + entry_size: int +struct_kfd_ioctl_dbg_trap_device_snapshot_args.register_fields([('exception_mask', ctypes.c_uint64, 0), ('snapshot_buf_ptr', ctypes.c_uint64, 8), ('num_devices', ctypes.c_uint32, 16), ('entry_size', ctypes.c_uint32, 20)]) +@c.record +class struct_kfd_ioctl_dbg_trap_args(c.Struct): + SIZE = 32 + pid: int + op: int + enable: struct_kfd_ioctl_dbg_trap_enable_args + send_runtime_event: struct_kfd_ioctl_dbg_trap_send_runtime_event_args + set_exceptions_enabled: struct_kfd_ioctl_dbg_trap_set_exceptions_enabled_args + launch_override: struct_kfd_ioctl_dbg_trap_set_wave_launch_override_args + launch_mode: struct_kfd_ioctl_dbg_trap_set_wave_launch_mode_args + suspend_queues: struct_kfd_ioctl_dbg_trap_suspend_queues_args + resume_queues: struct_kfd_ioctl_dbg_trap_resume_queues_args + set_node_address_watch: struct_kfd_ioctl_dbg_trap_set_node_address_watch_args + clear_node_address_watch: struct_kfd_ioctl_dbg_trap_clear_node_address_watch_args + set_flags: struct_kfd_ioctl_dbg_trap_set_flags_args + query_debug_event: struct_kfd_ioctl_dbg_trap_query_debug_event_args + query_exception_info: struct_kfd_ioctl_dbg_trap_query_exception_info_args + queue_snapshot: struct_kfd_ioctl_dbg_trap_queue_snapshot_args + device_snapshot: struct_kfd_ioctl_dbg_trap_device_snapshot_args +struct_kfd_ioctl_dbg_trap_args.register_fields([('pid', ctypes.c_uint32, 0), ('op', ctypes.c_uint32, 4), ('enable', struct_kfd_ioctl_dbg_trap_enable_args, 8), ('send_runtime_event', struct_kfd_ioctl_dbg_trap_send_runtime_event_args, 8), ('set_exceptions_enabled', struct_kfd_ioctl_dbg_trap_set_exceptions_enabled_args, 8), ('launch_override', struct_kfd_ioctl_dbg_trap_set_wave_launch_override_args, 8), ('launch_mode', struct_kfd_ioctl_dbg_trap_set_wave_launch_mode_args, 8), ('suspend_queues', struct_kfd_ioctl_dbg_trap_suspend_queues_args, 8), ('resume_queues', struct_kfd_ioctl_dbg_trap_resume_queues_args, 8), ('set_node_address_watch', struct_kfd_ioctl_dbg_trap_set_node_address_watch_args, 8), ('clear_node_address_watch', struct_kfd_ioctl_dbg_trap_clear_node_address_watch_args, 8), ('set_flags', struct_kfd_ioctl_dbg_trap_set_flags_args, 8), ('query_debug_event', struct_kfd_ioctl_dbg_trap_query_debug_event_args, 8), ('query_exception_info', struct_kfd_ioctl_dbg_trap_query_exception_info_args, 8), ('queue_snapshot', struct_kfd_ioctl_dbg_trap_queue_snapshot_args, 8), ('device_snapshot', struct_kfd_ioctl_dbg_trap_device_snapshot_args, 8)]) +enum_kfd_ioctl_pc_sample_op: dict[int, str] = {(KFD_IOCTL_PCS_OP_QUERY_CAPABILITIES:=0): 'KFD_IOCTL_PCS_OP_QUERY_CAPABILITIES', (KFD_IOCTL_PCS_OP_CREATE:=1): 'KFD_IOCTL_PCS_OP_CREATE', (KFD_IOCTL_PCS_OP_DESTROY:=2): 'KFD_IOCTL_PCS_OP_DESTROY', (KFD_IOCTL_PCS_OP_START:=3): 'KFD_IOCTL_PCS_OP_START', (KFD_IOCTL_PCS_OP_STOP:=4): 'KFD_IOCTL_PCS_OP_STOP'} +enum_kfd_ioctl_pc_sample_method: dict[int, str] = {(KFD_IOCTL_PCS_METHOD_HOSTTRAP:=1): 'KFD_IOCTL_PCS_METHOD_HOSTTRAP', (KFD_IOCTL_PCS_METHOD_STOCHASTIC:=2): 'KFD_IOCTL_PCS_METHOD_STOCHASTIC'} +enum_kfd_ioctl_pc_sample_type: dict[int, str] = {(KFD_IOCTL_PCS_TYPE_TIME_US:=0): 'KFD_IOCTL_PCS_TYPE_TIME_US', (KFD_IOCTL_PCS_TYPE_CLOCK_CYCLES:=1): 'KFD_IOCTL_PCS_TYPE_CLOCK_CYCLES', (KFD_IOCTL_PCS_TYPE_INSTRUCTIONS:=2): 'KFD_IOCTL_PCS_TYPE_INSTRUCTIONS'} +@c.record +class struct_kfd_pc_sample_info(c.Struct): + SIZE = 40 + interval: int + interval_min: int + interval_max: int + flags: int + method: int + type: int +struct_kfd_pc_sample_info.register_fields([('interval', ctypes.c_uint64, 0), ('interval_min', ctypes.c_uint64, 8), ('interval_max', ctypes.c_uint64, 16), ('flags', ctypes.c_uint64, 24), ('method', ctypes.c_uint32, 32), ('type', ctypes.c_uint32, 36)]) +@c.record +class struct_kfd_ioctl_pc_sample_args(c.Struct): + SIZE = 32 + sample_info_ptr: int + num_sample_info: int + op: int + gpu_id: int + trace_id: int + flags: int + version: int +struct_kfd_ioctl_pc_sample_args.register_fields([('sample_info_ptr', ctypes.c_uint64, 0), ('num_sample_info', ctypes.c_uint32, 8), ('op', ctypes.c_uint32, 12), ('gpu_id', ctypes.c_uint32, 16), ('trace_id', ctypes.c_uint32, 20), ('flags', ctypes.c_uint32, 24), ('version', ctypes.c_uint32, 28)]) +enum_kfd_profiler_ops: dict[int, str] = {(KFD_IOC_PROFILER_PMC:=0): 'KFD_IOC_PROFILER_PMC', (KFD_IOC_PROFILER_PC_SAMPLE:=1): 'KFD_IOC_PROFILER_PC_SAMPLE', (KFD_IOC_PROFILER_VERSION:=2): 'KFD_IOC_PROFILER_VERSION'} +@c.record +class struct_kfd_ioctl_pmc_settings(c.Struct): + SIZE = 12 + gpu_id: int + lock: int + perfcount_enable: int +struct_kfd_ioctl_pmc_settings.register_fields([('gpu_id', ctypes.c_uint32, 0), ('lock', ctypes.c_uint32, 4), ('perfcount_enable', ctypes.c_uint32, 8)]) +@c.record +class struct_kfd_ioctl_profiler_args(c.Struct): + SIZE = 40 + op: int + pc_sample: struct_kfd_ioctl_pc_sample_args + pmc: struct_kfd_ioctl_pmc_settings + version: int +struct_kfd_ioctl_profiler_args.register_fields([('op', ctypes.c_uint32, 0), ('pc_sample', struct_kfd_ioctl_pc_sample_args, 8), ('pmc', struct_kfd_ioctl_pmc_settings, 8), ('version', ctypes.c_uint32, 8)]) +KFD_IOCTL_MAJOR_VERSION = 1 +KFD_IOCTL_MINOR_VERSION = 17 +KFD_IOC_QUEUE_TYPE_COMPUTE = 0x0 +KFD_IOC_QUEUE_TYPE_SDMA = 0x1 +KFD_IOC_QUEUE_TYPE_COMPUTE_AQL = 0x2 +KFD_IOC_QUEUE_TYPE_SDMA_XGMI = 0x3 +KFD_IOC_QUEUE_TYPE_SDMA_BY_ENG_ID = 0x4 +KFD_MAX_QUEUE_PERCENTAGE = 100 +KFD_MAX_QUEUE_PRIORITY = 15 +KFD_IOC_CACHE_POLICY_COHERENT = 0 +KFD_IOC_CACHE_POLICY_NONCOHERENT = 1 +NUM_OF_SUPPORTED_GPUS = 7 +MAX_ALLOWED_NUM_POINTS = 100 +MAX_ALLOWED_AW_BUFF_SIZE = 4096 +MAX_ALLOWED_WAC_BUFF_SIZE = 128 +KFD_INVALID_FD = 0xffffffff +KFD_IOC_EVENT_SIGNAL = 0 +KFD_IOC_EVENT_NODECHANGE = 1 +KFD_IOC_EVENT_DEVICESTATECHANGE = 2 +KFD_IOC_EVENT_HW_EXCEPTION = 3 +KFD_IOC_EVENT_SYSTEM_EVENT = 4 +KFD_IOC_EVENT_DEBUG_EVENT = 5 +KFD_IOC_EVENT_PROFILE_EVENT = 6 +KFD_IOC_EVENT_QUEUE_EVENT = 7 +KFD_IOC_EVENT_MEMORY = 8 +KFD_IOC_WAIT_RESULT_COMPLETE = 0 +KFD_IOC_WAIT_RESULT_TIMEOUT = 1 +KFD_IOC_WAIT_RESULT_FAIL = 2 +KFD_SIGNAL_EVENT_LIMIT = 4096 +KFD_HW_EXCEPTION_WHOLE_GPU_RESET = 0 +KFD_HW_EXCEPTION_PER_ENGINE_RESET = 1 +KFD_HW_EXCEPTION_GPU_HANG = 0 +KFD_HW_EXCEPTION_ECC = 1 +KFD_MEM_ERR_NO_RAS = 0 +KFD_MEM_ERR_SRAM_ECC = 1 +KFD_MEM_ERR_POISON_CONSUMED = 2 +KFD_MEM_ERR_GPU_HANG = 3 +KFD_IOC_ALLOC_MEM_FLAGS_VRAM = (1 << 0) +KFD_IOC_ALLOC_MEM_FLAGS_GTT = (1 << 1) +KFD_IOC_ALLOC_MEM_FLAGS_USERPTR = (1 << 2) +KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL = (1 << 3) +KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP = (1 << 4) +KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE = (1 << 31) +KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE = (1 << 30) +KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC = (1 << 29) +KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE = (1 << 28) +KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM = (1 << 27) +KFD_IOC_ALLOC_MEM_FLAGS_COHERENT = (1 << 26) +KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED = (1 << 25) +KFD_IOC_ALLOC_MEM_FLAGS_EXT_COHERENT = (1 << 24) +KFD_IOC_ALLOC_MEM_FLAGS_CONTIGUOUS = (1 << 23) +KFD_SMI_EVENT_MASK_FROM_INDEX = lambda i: (1 << ((i) - 1)) # type: ignore +KFD_SMI_EVENT_MSG_SIZE = 96 +KFD_IOCTL_SVM_FLAG_HOST_ACCESS = 0x00000001 +KFD_IOCTL_SVM_FLAG_COHERENT = 0x00000002 +KFD_IOCTL_SVM_FLAG_HIVE_LOCAL = 0x00000004 +KFD_IOCTL_SVM_FLAG_GPU_RO = 0x00000008 +KFD_IOCTL_SVM_FLAG_GPU_EXEC = 0x00000010 +KFD_IOCTL_SVM_FLAG_GPU_READ_MOSTLY = 0x00000020 +KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED = 0x00000040 +KFD_IOCTL_SVM_FLAG_EXT_COHERENT = 0x00000080 +KFD_EC_MASK = lambda ecode: (1 << (ecode - 1)) # type: ignore +KFD_EC_MASK_QUEUE = (KFD_EC_MASK(EC_QUEUE_WAVE_ABORT) | KFD_EC_MASK(EC_QUEUE_WAVE_TRAP) | KFD_EC_MASK(EC_QUEUE_WAVE_MATH_ERROR) | KFD_EC_MASK(EC_QUEUE_WAVE_ILLEGAL_INSTRUCTION) | KFD_EC_MASK(EC_QUEUE_WAVE_MEMORY_VIOLATION) | KFD_EC_MASK(EC_QUEUE_WAVE_APERTURE_VIOLATION) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_DIM_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_GROUP_SEGMENT_SIZE_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_CODE_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_RESERVED) | KFD_EC_MASK(EC_QUEUE_PACKET_UNSUPPORTED) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_WORK_GROUP_SIZE_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_REGISTER_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_VENDOR_UNSUPPORTED) | KFD_EC_MASK(EC_QUEUE_PREEMPTION_ERROR) | KFD_EC_MASK(EC_QUEUE_NEW)) +KFD_EC_MASK_DEVICE = (KFD_EC_MASK(EC_DEVICE_QUEUE_DELETE) | KFD_EC_MASK(EC_DEVICE_RAS_ERROR) | KFD_EC_MASK(EC_DEVICE_FATAL_HALT) | KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION) | KFD_EC_MASK(EC_DEVICE_NEW)) +KFD_EC_MASK_PROCESS = (KFD_EC_MASK(EC_PROCESS_RUNTIME) | KFD_EC_MASK(EC_PROCESS_DEVICE_REMOVE)) +KFD_EC_MASK_PACKET = (KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_DIM_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_GROUP_SEGMENT_SIZE_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_CODE_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_RESERVED) | KFD_EC_MASK(EC_QUEUE_PACKET_UNSUPPORTED) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_WORK_GROUP_SIZE_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_REGISTER_INVALID) | KFD_EC_MASK(EC_QUEUE_PACKET_VENDOR_UNSUPPORTED)) +KFD_DBG_EC_IS_VALID = lambda ecode: (ecode > EC_NONE and ecode < EC_MAX) # type: ignore +KFD_DBG_EC_TYPE_IS_QUEUE = lambda ecode: (KFD_DBG_EC_IS_VALID(ecode) and not not (KFD_EC_MASK(ecode) & KFD_EC_MASK_QUEUE)) # type: ignore +KFD_DBG_EC_TYPE_IS_DEVICE = lambda ecode: (KFD_DBG_EC_IS_VALID(ecode) and not not (KFD_EC_MASK(ecode) & KFD_EC_MASK_DEVICE)) # type: ignore +KFD_DBG_EC_TYPE_IS_PROCESS = lambda ecode: (KFD_DBG_EC_IS_VALID(ecode) and not not (KFD_EC_MASK(ecode) & KFD_EC_MASK_PROCESS)) # type: ignore +KFD_DBG_EC_TYPE_IS_PACKET = lambda ecode: (KFD_DBG_EC_IS_VALID(ecode) and not not (KFD_EC_MASK(ecode) & KFD_EC_MASK_PACKET)) # type: ignore +KFD_RUNTIME_ENABLE_MODE_ENABLE_MASK = 1 +KFD_RUNTIME_ENABLE_MODE_TTMP_SAVE_MASK = 2 +KFD_DBG_QUEUE_ERROR_BIT = 30 +KFD_DBG_QUEUE_INVALID_BIT = 31 +KFD_DBG_QUEUE_ERROR_MASK = (1 << KFD_DBG_QUEUE_ERROR_BIT) +KFD_DBG_QUEUE_INVALID_MASK = (1 << KFD_DBG_QUEUE_INVALID_BIT) +KFD_IOCTL_PCS_FLAG_POWER_OF_2 = 0x00000001 +KFD_IOCTL_PCS_QUERY_TYPE_FULL = (1 << 0) +KFD_IOC_PROFILER_VERSION_NUM = 1 +AMDKFD_IOCTL_BASE = 'K' +AMDKFD_IO = lambda nr: _IO(AMDKFD_IOCTL_BASE, nr) # type: ignore +AMDKFD_IOR = lambda nr,type: _IOR(AMDKFD_IOCTL_BASE, nr, type) # type: ignore +AMDKFD_IOW = lambda nr,type: _IOW(AMDKFD_IOCTL_BASE, nr, type) # type: ignore +AMDKFD_IOWR = lambda nr,type: _IOWR(AMDKFD_IOCTL_BASE, nr, type) # type: ignore +AMDKFD_IOC_GET_VERSION = AMDKFD_IOR(0x01, struct_kfd_ioctl_get_version_args) +AMDKFD_IOC_CREATE_QUEUE = AMDKFD_IOWR(0x02, struct_kfd_ioctl_create_queue_args) +AMDKFD_IOC_DESTROY_QUEUE = AMDKFD_IOWR(0x03, struct_kfd_ioctl_destroy_queue_args) +AMDKFD_IOC_SET_MEMORY_POLICY = AMDKFD_IOW(0x04, struct_kfd_ioctl_set_memory_policy_args) +AMDKFD_IOC_GET_CLOCK_COUNTERS = AMDKFD_IOWR(0x05, struct_kfd_ioctl_get_clock_counters_args) +AMDKFD_IOC_GET_PROCESS_APERTURES = AMDKFD_IOR(0x06, struct_kfd_ioctl_get_process_apertures_args) +AMDKFD_IOC_UPDATE_QUEUE = AMDKFD_IOW(0x07, struct_kfd_ioctl_update_queue_args) +AMDKFD_IOC_CREATE_EVENT = AMDKFD_IOWR(0x08, struct_kfd_ioctl_create_event_args) +AMDKFD_IOC_DESTROY_EVENT = AMDKFD_IOW(0x09, struct_kfd_ioctl_destroy_event_args) +AMDKFD_IOC_SET_EVENT = AMDKFD_IOW(0x0A, struct_kfd_ioctl_set_event_args) +AMDKFD_IOC_RESET_EVENT = AMDKFD_IOW(0x0B, struct_kfd_ioctl_reset_event_args) +AMDKFD_IOC_WAIT_EVENTS = AMDKFD_IOWR(0x0C, struct_kfd_ioctl_wait_events_args) +AMDKFD_IOC_DBG_REGISTER_DEPRECATED = AMDKFD_IOW(0x0D, struct_kfd_ioctl_dbg_register_args) +AMDKFD_IOC_DBG_UNREGISTER_DEPRECATED = AMDKFD_IOW(0x0E, struct_kfd_ioctl_dbg_unregister_args) +AMDKFD_IOC_DBG_ADDRESS_WATCH_DEPRECATED = AMDKFD_IOW(0x0F, struct_kfd_ioctl_dbg_address_watch_args) +AMDKFD_IOC_DBG_WAVE_CONTROL_DEPRECATED = AMDKFD_IOW(0x10, struct_kfd_ioctl_dbg_wave_control_args) +AMDKFD_IOC_SET_SCRATCH_BACKING_VA = AMDKFD_IOWR(0x11, struct_kfd_ioctl_set_scratch_backing_va_args) +AMDKFD_IOC_GET_TILE_CONFIG = AMDKFD_IOWR(0x12, struct_kfd_ioctl_get_tile_config_args) +AMDKFD_IOC_SET_TRAP_HANDLER = AMDKFD_IOW(0x13, struct_kfd_ioctl_set_trap_handler_args) +AMDKFD_IOC_GET_PROCESS_APERTURES_NEW = AMDKFD_IOWR(0x14, struct_kfd_ioctl_get_process_apertures_new_args) +AMDKFD_IOC_ACQUIRE_VM = AMDKFD_IOW(0x15, struct_kfd_ioctl_acquire_vm_args) +AMDKFD_IOC_ALLOC_MEMORY_OF_GPU = AMDKFD_IOWR(0x16, struct_kfd_ioctl_alloc_memory_of_gpu_args) +AMDKFD_IOC_FREE_MEMORY_OF_GPU = AMDKFD_IOW(0x17, struct_kfd_ioctl_free_memory_of_gpu_args) +AMDKFD_IOC_MAP_MEMORY_TO_GPU = AMDKFD_IOWR(0x18, struct_kfd_ioctl_map_memory_to_gpu_args) +AMDKFD_IOC_UNMAP_MEMORY_FROM_GPU = AMDKFD_IOWR(0x19, struct_kfd_ioctl_unmap_memory_from_gpu_args) +AMDKFD_IOC_SET_CU_MASK = AMDKFD_IOW(0x1A, struct_kfd_ioctl_set_cu_mask_args) +AMDKFD_IOC_GET_QUEUE_WAVE_STATE = AMDKFD_IOWR(0x1B, struct_kfd_ioctl_get_queue_wave_state_args) +AMDKFD_IOC_GET_DMABUF_INFO = AMDKFD_IOWR(0x1C, struct_kfd_ioctl_get_dmabuf_info_args) +AMDKFD_IOC_IMPORT_DMABUF = AMDKFD_IOWR(0x1D, struct_kfd_ioctl_import_dmabuf_args) +AMDKFD_IOC_ALLOC_QUEUE_GWS = AMDKFD_IOWR(0x1E, struct_kfd_ioctl_alloc_queue_gws_args) +AMDKFD_IOC_SMI_EVENTS = AMDKFD_IOWR(0x1F, struct_kfd_ioctl_smi_events_args) +AMDKFD_IOC_SVM = AMDKFD_IOWR(0x20, struct_kfd_ioctl_svm_args) +AMDKFD_IOC_SET_XNACK_MODE = AMDKFD_IOWR(0x21, struct_kfd_ioctl_set_xnack_mode_args) +AMDKFD_IOC_CRIU_OP = AMDKFD_IOWR(0x22, struct_kfd_ioctl_criu_args) +AMDKFD_IOC_AVAILABLE_MEMORY = AMDKFD_IOWR(0x23, struct_kfd_ioctl_get_available_memory_args) +AMDKFD_IOC_EXPORT_DMABUF = AMDKFD_IOWR(0x24, struct_kfd_ioctl_export_dmabuf_args) +AMDKFD_IOC_RUNTIME_ENABLE = AMDKFD_IOWR(0x25, struct_kfd_ioctl_runtime_enable_args) +AMDKFD_IOC_DBG_TRAP = AMDKFD_IOWR(0x26, struct_kfd_ioctl_dbg_trap_args) +AMDKFD_COMMAND_START = 0x01 +AMDKFD_COMMAND_END = 0x27 +AMDKFD_IOC_IPC_IMPORT_HANDLE = AMDKFD_IOWR(0x80, struct_kfd_ioctl_ipc_import_handle_args) +AMDKFD_IOC_IPC_EXPORT_HANDLE = AMDKFD_IOWR(0x81, struct_kfd_ioctl_ipc_export_handle_args) +AMDKFD_IOC_DBG_TRAP_DEPRECATED = AMDKFD_IOWR(0x82, struct_kfd_ioctl_dbg_trap_args_deprecated) +AMDKFD_IOC_CROSS_MEMORY_COPY_DEPRECATED = AMDKFD_IOWR(0x83, struct_kfd_ioctl_cross_memory_copy_deprecated_args) +AMDKFD_IOC_RLC_SPM = AMDKFD_IOWR(0x84, struct_kfd_ioctl_spm_args) +AMDKFD_IOC_PC_SAMPLE = AMDKFD_IOWR(0x85, struct_kfd_ioctl_pc_sample_args) +AMDKFD_IOC_PROFILER = AMDKFD_IOWR(0x86, struct_kfd_ioctl_profiler_args) +AMDKFD_COMMAND_START_2 = 0x80 +AMDKFD_COMMAND_END_2 = 0x87 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/kgsl.py b/artifacts/package_runtime/tinygrad/runtime/autogen/kgsl.py new file mode 100644 index 000000000..d21287aa0 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/kgsl.py @@ -0,0 +1,787 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +enum_kgsl_user_mem_type: dict[int, str] = {(KGSL_USER_MEM_TYPE_PMEM:=0): 'KGSL_USER_MEM_TYPE_PMEM', (KGSL_USER_MEM_TYPE_ASHMEM:=1): 'KGSL_USER_MEM_TYPE_ASHMEM', (KGSL_USER_MEM_TYPE_ADDR:=2): 'KGSL_USER_MEM_TYPE_ADDR', (KGSL_USER_MEM_TYPE_ION:=3): 'KGSL_USER_MEM_TYPE_ION', (KGSL_USER_MEM_TYPE_DMABUF:=3): 'KGSL_USER_MEM_TYPE_DMABUF', (KGSL_USER_MEM_TYPE_MAX:=7): 'KGSL_USER_MEM_TYPE_MAX'} +enum_kgsl_ctx_reset_stat: dict[int, str] = {(KGSL_CTX_STAT_NO_ERROR:=0): 'KGSL_CTX_STAT_NO_ERROR', (KGSL_CTX_STAT_GUILTY_CONTEXT_RESET_EXT:=1): 'KGSL_CTX_STAT_GUILTY_CONTEXT_RESET_EXT', (KGSL_CTX_STAT_INNOCENT_CONTEXT_RESET_EXT:=2): 'KGSL_CTX_STAT_INNOCENT_CONTEXT_RESET_EXT', (KGSL_CTX_STAT_UNKNOWN_CONTEXT_RESET_EXT:=3): 'KGSL_CTX_STAT_UNKNOWN_CONTEXT_RESET_EXT'} +enum_kgsl_deviceid: dict[int, str] = {(KGSL_DEVICE_3D0:=0): 'KGSL_DEVICE_3D0', (KGSL_DEVICE_MAX:=1): 'KGSL_DEVICE_MAX'} +@c.record +class struct_kgsl_devinfo(c.Struct): + SIZE = 40 + device_id: int + chip_id: int + mmu_enabled: int + gmem_gpubaseaddr: int + gpu_id: int + gmem_sizebytes: int +struct_kgsl_devinfo.register_fields([('device_id', ctypes.c_uint32, 0), ('chip_id', ctypes.c_uint32, 4), ('mmu_enabled', ctypes.c_uint32, 8), ('gmem_gpubaseaddr', ctypes.c_uint64, 16), ('gpu_id', ctypes.c_uint32, 24), ('gmem_sizebytes', ctypes.c_uint64, 32)]) +@c.record +class struct_kgsl_devmemstore(c.Struct): + SIZE = 40 + soptimestamp: int + sbz: int + eoptimestamp: int + sbz2: int + preempted: int + sbz3: int + ref_wait_ts: int + sbz4: int + current_context: int + sbz5: int +struct_kgsl_devmemstore.register_fields([('soptimestamp', ctypes.c_uint32, 0), ('sbz', ctypes.c_uint32, 4), ('eoptimestamp', ctypes.c_uint32, 8), ('sbz2', ctypes.c_uint32, 12), ('preempted', ctypes.c_uint32, 16), ('sbz3', ctypes.c_uint32, 20), ('ref_wait_ts', ctypes.c_uint32, 24), ('sbz4', ctypes.c_uint32, 28), ('current_context', ctypes.c_uint32, 32), ('sbz5', ctypes.c_uint32, 36)]) +enum_kgsl_timestamp_type: dict[int, str] = {(KGSL_TIMESTAMP_CONSUMED:=1): 'KGSL_TIMESTAMP_CONSUMED', (KGSL_TIMESTAMP_RETIRED:=2): 'KGSL_TIMESTAMP_RETIRED', (KGSL_TIMESTAMP_QUEUED:=3): 'KGSL_TIMESTAMP_QUEUED'} +@c.record +class struct_kgsl_shadowprop(c.Struct): + SIZE = 24 + gpuaddr: int + size: int + flags: int +struct_kgsl_shadowprop.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('flags', ctypes.c_uint32, 16)]) +@c.record +class struct_kgsl_version(c.Struct): + SIZE = 16 + drv_major: int + drv_minor: int + dev_major: int + dev_minor: int +struct_kgsl_version.register_fields([('drv_major', ctypes.c_uint32, 0), ('drv_minor', ctypes.c_uint32, 4), ('dev_major', ctypes.c_uint32, 8), ('dev_minor', ctypes.c_uint32, 12)]) +@c.record +class struct_kgsl_sp_generic_mem(c.Struct): + SIZE = 16 + local: int + pvt: int +struct_kgsl_sp_generic_mem.register_fields([('local', ctypes.c_uint64, 0), ('pvt', ctypes.c_uint64, 8)]) +@c.record +class struct_kgsl_ucode_version(c.Struct): + SIZE = 8 + pfp: int + pm4: int +struct_kgsl_ucode_version.register_fields([('pfp', ctypes.c_uint32, 0), ('pm4', ctypes.c_uint32, 4)]) +@c.record +class struct_kgsl_gpmu_version(c.Struct): + SIZE = 12 + major: int + minor: int + features: int +struct_kgsl_gpmu_version.register_fields([('major', ctypes.c_uint32, 0), ('minor', ctypes.c_uint32, 4), ('features', ctypes.c_uint32, 8)]) +@c.record +class struct_kgsl_ibdesc(c.Struct): + SIZE = 32 + gpuaddr: int + __pad: int + sizedwords: int + ctrl: int +struct_kgsl_ibdesc.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('__pad', ctypes.c_uint64, 8), ('sizedwords', ctypes.c_uint64, 16), ('ctrl', ctypes.c_uint32, 24)]) +@c.record +class struct_kgsl_cmdbatch_profiling_buffer(c.Struct): + SIZE = 40 + wall_clock_s: int + wall_clock_ns: int + gpu_ticks_queued: int + gpu_ticks_submitted: int + gpu_ticks_retired: int +struct_kgsl_cmdbatch_profiling_buffer.register_fields([('wall_clock_s', ctypes.c_uint64, 0), ('wall_clock_ns', ctypes.c_uint64, 8), ('gpu_ticks_queued', ctypes.c_uint64, 16), ('gpu_ticks_submitted', ctypes.c_uint64, 24), ('gpu_ticks_retired', ctypes.c_uint64, 32)]) +@c.record +class struct_kgsl_device_getproperty(c.Struct): + SIZE = 24 + type: int + value: ctypes.c_void_p + sizebytes: int +struct_kgsl_device_getproperty.register_fields([('type', ctypes.c_uint32, 0), ('value', ctypes.c_void_p, 8), ('sizebytes', ctypes.c_uint64, 16)]) +@c.record +class struct_kgsl_device_waittimestamp(c.Struct): + SIZE = 8 + timestamp: int + timeout: int +struct_kgsl_device_waittimestamp.register_fields([('timestamp', ctypes.c_uint32, 0), ('timeout', ctypes.c_uint32, 4)]) +@c.record +class struct_kgsl_device_waittimestamp_ctxtid(c.Struct): + SIZE = 12 + context_id: int + timestamp: int + timeout: int +struct_kgsl_device_waittimestamp_ctxtid.register_fields([('context_id', ctypes.c_uint32, 0), ('timestamp', ctypes.c_uint32, 4), ('timeout', ctypes.c_uint32, 8)]) +@c.record +class struct_kgsl_ringbuffer_issueibcmds(c.Struct): + SIZE = 32 + drawctxt_id: int + ibdesc_addr: int + numibs: int + timestamp: int + flags: int +struct_kgsl_ringbuffer_issueibcmds.register_fields([('drawctxt_id', ctypes.c_uint32, 0), ('ibdesc_addr', ctypes.c_uint64, 8), ('numibs', ctypes.c_uint32, 16), ('timestamp', ctypes.c_uint32, 20), ('flags', ctypes.c_uint32, 24)]) +@c.record +class struct_kgsl_cmdstream_readtimestamp(c.Struct): + SIZE = 8 + type: int + timestamp: int +struct_kgsl_cmdstream_readtimestamp.register_fields([('type', ctypes.c_uint32, 0), ('timestamp', ctypes.c_uint32, 4)]) +@c.record +class struct_kgsl_cmdstream_freememontimestamp(c.Struct): + SIZE = 16 + gpuaddr: int + type: int + timestamp: int +struct_kgsl_cmdstream_freememontimestamp.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('type', ctypes.c_uint32, 8), ('timestamp', ctypes.c_uint32, 12)]) +@c.record +class struct_kgsl_drawctxt_create(c.Struct): + SIZE = 8 + flags: int + drawctxt_id: int +struct_kgsl_drawctxt_create.register_fields([('flags', ctypes.c_uint32, 0), ('drawctxt_id', ctypes.c_uint32, 4)]) +@c.record +class struct_kgsl_drawctxt_destroy(c.Struct): + SIZE = 4 + drawctxt_id: int +struct_kgsl_drawctxt_destroy.register_fields([('drawctxt_id', ctypes.c_uint32, 0)]) +@c.record +class struct_kgsl_map_user_mem(c.Struct): + SIZE = 48 + fd: int + gpuaddr: int + len: int + offset: int + hostptr: int + memtype: int + flags: int +struct_kgsl_map_user_mem.register_fields([('fd', ctypes.c_int32, 0), ('gpuaddr', ctypes.c_uint64, 8), ('len', ctypes.c_uint64, 16), ('offset', ctypes.c_uint64, 24), ('hostptr', ctypes.c_uint64, 32), ('memtype', ctypes.c_uint32, 40), ('flags', ctypes.c_uint32, 44)]) +@c.record +class struct_kgsl_cmdstream_readtimestamp_ctxtid(c.Struct): + SIZE = 12 + context_id: int + type: int + timestamp: int +struct_kgsl_cmdstream_readtimestamp_ctxtid.register_fields([('context_id', ctypes.c_uint32, 0), ('type', ctypes.c_uint32, 4), ('timestamp', ctypes.c_uint32, 8)]) +@c.record +class struct_kgsl_cmdstream_freememontimestamp_ctxtid(c.Struct): + SIZE = 24 + context_id: int + gpuaddr: int + type: int + timestamp: int +struct_kgsl_cmdstream_freememontimestamp_ctxtid.register_fields([('context_id', ctypes.c_uint32, 0), ('gpuaddr', ctypes.c_uint64, 8), ('type', ctypes.c_uint32, 16), ('timestamp', ctypes.c_uint32, 20)]) +@c.record +class struct_kgsl_sharedmem_from_pmem(c.Struct): + SIZE = 24 + pmem_fd: int + gpuaddr: int + len: int + offset: int +struct_kgsl_sharedmem_from_pmem.register_fields([('pmem_fd', ctypes.c_int32, 0), ('gpuaddr', ctypes.c_uint64, 8), ('len', ctypes.c_uint32, 16), ('offset', ctypes.c_uint32, 20)]) +@c.record +class struct_kgsl_sharedmem_free(c.Struct): + SIZE = 8 + gpuaddr: int +struct_kgsl_sharedmem_free.register_fields([('gpuaddr', ctypes.c_uint64, 0)]) +@c.record +class struct_kgsl_cff_user_event(c.Struct): + SIZE = 32 + cff_opcode: int + op1: int + op2: int + op3: int + op4: int + op5: int + __pad: c.Array[ctypes.c_uint32, Literal[2]] +struct_kgsl_cff_user_event.register_fields([('cff_opcode', ctypes.c_ubyte, 0), ('op1', ctypes.c_uint32, 4), ('op2', ctypes.c_uint32, 8), ('op3', ctypes.c_uint32, 12), ('op4', ctypes.c_uint32, 16), ('op5', ctypes.c_uint32, 20), ('__pad', c.Array[ctypes.c_uint32, Literal[2]], 24)]) +@c.record +class struct_kgsl_gmem_desc(c.Struct): + SIZE = 20 + x: int + y: int + width: int + height: int + pitch: int +struct_kgsl_gmem_desc.register_fields([('x', ctypes.c_uint32, 0), ('y', ctypes.c_uint32, 4), ('width', ctypes.c_uint32, 8), ('height', ctypes.c_uint32, 12), ('pitch', ctypes.c_uint32, 16)]) +@c.record +class struct_kgsl_buffer_desc(c.Struct): + SIZE = 32 + hostptr: ctypes.c_void_p + gpuaddr: int + size: int + format: int + pitch: int + enabled: int +struct_kgsl_buffer_desc.register_fields([('hostptr', ctypes.c_void_p, 0), ('gpuaddr', ctypes.c_uint64, 8), ('size', ctypes.c_int32, 16), ('format', ctypes.c_uint32, 20), ('pitch', ctypes.c_uint32, 24), ('enabled', ctypes.c_uint32, 28)]) +@c.record +class struct_kgsl_bind_gmem_shadow(c.Struct): + SIZE = 72 + drawctxt_id: int + gmem_desc: struct_kgsl_gmem_desc + shadow_x: int + shadow_y: int + shadow_buffer: struct_kgsl_buffer_desc + buffer_id: int +struct_kgsl_bind_gmem_shadow.register_fields([('drawctxt_id', ctypes.c_uint32, 0), ('gmem_desc', struct_kgsl_gmem_desc, 4), ('shadow_x', ctypes.c_uint32, 24), ('shadow_y', ctypes.c_uint32, 28), ('shadow_buffer', struct_kgsl_buffer_desc, 32), ('buffer_id', ctypes.c_uint32, 64)]) +@c.record +class struct_kgsl_sharedmem_from_vmalloc(c.Struct): + SIZE = 16 + gpuaddr: int + hostptr: int + flags: int +struct_kgsl_sharedmem_from_vmalloc.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('hostptr', ctypes.c_uint32, 8), ('flags', ctypes.c_uint32, 12)]) +@c.record +class struct_kgsl_drawctxt_set_bin_base_offset(c.Struct): + SIZE = 8 + drawctxt_id: int + offset: int +struct_kgsl_drawctxt_set_bin_base_offset.register_fields([('drawctxt_id', ctypes.c_uint32, 0), ('offset', ctypes.c_uint32, 4)]) +enum_kgsl_cmdwindow_type: dict[int, str] = {(KGSL_CMDWINDOW_MIN:=0): 'KGSL_CMDWINDOW_MIN', (KGSL_CMDWINDOW_2D:=0): 'KGSL_CMDWINDOW_2D', (KGSL_CMDWINDOW_3D:=1): 'KGSL_CMDWINDOW_3D', (KGSL_CMDWINDOW_MMU:=2): 'KGSL_CMDWINDOW_MMU', (KGSL_CMDWINDOW_ARBITER:=255): 'KGSL_CMDWINDOW_ARBITER', (KGSL_CMDWINDOW_MAX:=255): 'KGSL_CMDWINDOW_MAX'} +@c.record +class struct_kgsl_cmdwindow_write(c.Struct): + SIZE = 12 + target: int + addr: int + data: int +struct_kgsl_cmdwindow_write.register_fields([('target', ctypes.c_uint32, 0), ('addr', ctypes.c_uint32, 4), ('data', ctypes.c_uint32, 8)]) +@c.record +class struct_kgsl_gpumem_alloc(c.Struct): + SIZE = 24 + gpuaddr: int + size: int + flags: int +struct_kgsl_gpumem_alloc.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('flags', ctypes.c_uint32, 16)]) +@c.record +class struct_kgsl_cff_syncmem(c.Struct): + SIZE = 24 + gpuaddr: int + len: int + __pad: c.Array[ctypes.c_uint32, Literal[2]] +struct_kgsl_cff_syncmem.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('len', ctypes.c_uint64, 8), ('__pad', c.Array[ctypes.c_uint32, Literal[2]], 16)]) +@c.record +class struct_kgsl_timestamp_event(c.Struct): + SIZE = 32 + type: int + timestamp: int + context_id: int + priv: ctypes.c_void_p + len: int +struct_kgsl_timestamp_event.register_fields([('type', ctypes.c_int32, 0), ('timestamp', ctypes.c_uint32, 4), ('context_id', ctypes.c_uint32, 8), ('priv', ctypes.c_void_p, 16), ('len', ctypes.c_uint64, 24)]) +@c.record +class struct_kgsl_timestamp_event_genlock(c.Struct): + SIZE = 4 + handle: int +struct_kgsl_timestamp_event_genlock.register_fields([('handle', ctypes.c_int32, 0)]) +@c.record +class struct_kgsl_timestamp_event_fence(c.Struct): + SIZE = 4 + fence_fd: int +struct_kgsl_timestamp_event_fence.register_fields([('fence_fd', ctypes.c_int32, 0)]) +@c.record +class struct_kgsl_gpumem_alloc_id(c.Struct): + SIZE = 48 + id: int + flags: int + size: int + mmapsize: int + gpuaddr: int + __pad: c.Array[ctypes.c_uint64, Literal[2]] +struct_kgsl_gpumem_alloc_id.register_fields([('id', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('size', ctypes.c_uint64, 8), ('mmapsize', ctypes.c_uint64, 16), ('gpuaddr', ctypes.c_uint64, 24), ('__pad', c.Array[ctypes.c_uint64, Literal[2]], 32)]) +@c.record +class struct_kgsl_gpumem_free_id(c.Struct): + SIZE = 8 + id: int + __pad: int +struct_kgsl_gpumem_free_id.register_fields([('id', ctypes.c_uint32, 0), ('__pad', ctypes.c_uint32, 4)]) +@c.record +class struct_kgsl_gpumem_get_info(c.Struct): + SIZE = 72 + gpuaddr: int + id: int + flags: int + size: int + mmapsize: int + useraddr: int + __pad: c.Array[ctypes.c_uint64, Literal[4]] +struct_kgsl_gpumem_get_info.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('id', ctypes.c_uint32, 8), ('flags', ctypes.c_uint32, 12), ('size', ctypes.c_uint64, 16), ('mmapsize', ctypes.c_uint64, 24), ('useraddr', ctypes.c_uint64, 32), ('__pad', c.Array[ctypes.c_uint64, Literal[4]], 40)]) +@c.record +class struct_kgsl_gpumem_sync_cache(c.Struct): + SIZE = 32 + gpuaddr: int + id: int + op: int + offset: int + length: int +struct_kgsl_gpumem_sync_cache.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('id', ctypes.c_uint32, 8), ('op', ctypes.c_uint32, 12), ('offset', ctypes.c_uint64, 16), ('length', ctypes.c_uint64, 24)]) +@c.record +class struct_kgsl_perfcounter_get(c.Struct): + SIZE = 20 + groupid: int + countable: int + offset: int + offset_hi: int + __pad: int +struct_kgsl_perfcounter_get.register_fields([('groupid', ctypes.c_uint32, 0), ('countable', ctypes.c_uint32, 4), ('offset', ctypes.c_uint32, 8), ('offset_hi', ctypes.c_uint32, 12), ('__pad', ctypes.c_uint32, 16)]) +@c.record +class struct_kgsl_perfcounter_put(c.Struct): + SIZE = 16 + groupid: int + countable: int + __pad: c.Array[ctypes.c_uint32, Literal[2]] +struct_kgsl_perfcounter_put.register_fields([('groupid', ctypes.c_uint32, 0), ('countable', ctypes.c_uint32, 4), ('__pad', c.Array[ctypes.c_uint32, Literal[2]], 8)]) +@c.record +class struct_kgsl_perfcounter_query(c.Struct): + SIZE = 32 + groupid: int + countables: c.POINTER[ctypes.c_uint32] + count: int + max_counters: int + __pad: c.Array[ctypes.c_uint32, Literal[2]] +struct_kgsl_perfcounter_query.register_fields([('groupid', ctypes.c_uint32, 0), ('countables', c.POINTER[ctypes.c_uint32], 8), ('count', ctypes.c_uint32, 16), ('max_counters', ctypes.c_uint32, 20), ('__pad', c.Array[ctypes.c_uint32, Literal[2]], 24)]) +@c.record +class struct_kgsl_perfcounter_read_group(c.Struct): + SIZE = 16 + groupid: int + countable: int + value: int +struct_kgsl_perfcounter_read_group.register_fields([('groupid', ctypes.c_uint32, 0), ('countable', ctypes.c_uint32, 4), ('value', ctypes.c_uint64, 8)]) +@c.record +class struct_kgsl_perfcounter_read(c.Struct): + SIZE = 24 + reads: c.POINTER[struct_kgsl_perfcounter_read_group] + count: int + __pad: c.Array[ctypes.c_uint32, Literal[2]] +struct_kgsl_perfcounter_read.register_fields([('reads', c.POINTER[struct_kgsl_perfcounter_read_group], 0), ('count', ctypes.c_uint32, 8), ('__pad', c.Array[ctypes.c_uint32, Literal[2]], 12)]) +@c.record +class struct_kgsl_gpumem_sync_cache_bulk(c.Struct): + SIZE = 24 + id_list: c.POINTER[ctypes.c_uint32] + count: int + op: int + __pad: c.Array[ctypes.c_uint32, Literal[2]] +struct_kgsl_gpumem_sync_cache_bulk.register_fields([('id_list', c.POINTER[ctypes.c_uint32], 0), ('count', ctypes.c_uint32, 8), ('op', ctypes.c_uint32, 12), ('__pad', c.Array[ctypes.c_uint32, Literal[2]], 16)]) +@c.record +class struct_kgsl_cmd_syncpoint_timestamp(c.Struct): + SIZE = 8 + context_id: int + timestamp: int +struct_kgsl_cmd_syncpoint_timestamp.register_fields([('context_id', ctypes.c_uint32, 0), ('timestamp', ctypes.c_uint32, 4)]) +@c.record +class struct_kgsl_cmd_syncpoint_fence(c.Struct): + SIZE = 4 + fd: int +struct_kgsl_cmd_syncpoint_fence.register_fields([('fd', ctypes.c_int32, 0)]) +@c.record +class struct_kgsl_cmd_syncpoint(c.Struct): + SIZE = 24 + type: int + priv: ctypes.c_void_p + size: int +struct_kgsl_cmd_syncpoint.register_fields([('type', ctypes.c_int32, 0), ('priv', ctypes.c_void_p, 8), ('size', ctypes.c_uint64, 16)]) +@c.record +class struct_kgsl_submit_commands(c.Struct): + SIZE = 56 + context_id: int + flags: int + cmdlist: c.POINTER[struct_kgsl_ibdesc] + numcmds: int + synclist: c.POINTER[struct_kgsl_cmd_syncpoint] + numsyncs: int + timestamp: int + __pad: c.Array[ctypes.c_uint32, Literal[4]] +struct_kgsl_submit_commands.register_fields([('context_id', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('cmdlist', c.POINTER[struct_kgsl_ibdesc], 8), ('numcmds', ctypes.c_uint32, 16), ('synclist', c.POINTER[struct_kgsl_cmd_syncpoint], 24), ('numsyncs', ctypes.c_uint32, 32), ('timestamp', ctypes.c_uint32, 36), ('__pad', c.Array[ctypes.c_uint32, Literal[4]], 40)]) +@c.record +class struct_kgsl_device_constraint(c.Struct): + SIZE = 24 + type: int + context_id: int + data: ctypes.c_void_p + size: int +struct_kgsl_device_constraint.register_fields([('type', ctypes.c_uint32, 0), ('context_id', ctypes.c_uint32, 4), ('data', ctypes.c_void_p, 8), ('size', ctypes.c_uint64, 16)]) +@c.record +class struct_kgsl_device_constraint_pwrlevel(c.Struct): + SIZE = 4 + level: int +struct_kgsl_device_constraint_pwrlevel.register_fields([('level', ctypes.c_uint32, 0)]) +@c.record +class struct_kgsl_syncsource_create(c.Struct): + SIZE = 16 + id: int + __pad: c.Array[ctypes.c_uint32, Literal[3]] +struct_kgsl_syncsource_create.register_fields([('id', ctypes.c_uint32, 0), ('__pad', c.Array[ctypes.c_uint32, Literal[3]], 4)]) +@c.record +class struct_kgsl_syncsource_destroy(c.Struct): + SIZE = 16 + id: int + __pad: c.Array[ctypes.c_uint32, Literal[3]] +struct_kgsl_syncsource_destroy.register_fields([('id', ctypes.c_uint32, 0), ('__pad', c.Array[ctypes.c_uint32, Literal[3]], 4)]) +@c.record +class struct_kgsl_syncsource_create_fence(c.Struct): + SIZE = 24 + id: int + fence_fd: int + __pad: c.Array[ctypes.c_uint32, Literal[4]] +struct_kgsl_syncsource_create_fence.register_fields([('id', ctypes.c_uint32, 0), ('fence_fd', ctypes.c_int32, 4), ('__pad', c.Array[ctypes.c_uint32, Literal[4]], 8)]) +@c.record +class struct_kgsl_syncsource_signal_fence(c.Struct): + SIZE = 24 + id: int + fence_fd: int + __pad: c.Array[ctypes.c_uint32, Literal[4]] +struct_kgsl_syncsource_signal_fence.register_fields([('id', ctypes.c_uint32, 0), ('fence_fd', ctypes.c_int32, 4), ('__pad', c.Array[ctypes.c_uint32, Literal[4]], 8)]) +@c.record +class struct_kgsl_cff_sync_gpuobj(c.Struct): + SIZE = 24 + offset: int + length: int + id: int +struct_kgsl_cff_sync_gpuobj.register_fields([('offset', ctypes.c_uint64, 0), ('length', ctypes.c_uint64, 8), ('id', ctypes.c_uint32, 16)]) +@c.record +class struct_kgsl_gpuobj_alloc(c.Struct): + SIZE = 48 + size: int + flags: int + va_len: int + mmapsize: int + id: int + metadata_len: int + metadata: int +struct_kgsl_gpuobj_alloc.register_fields([('size', ctypes.c_uint64, 0), ('flags', ctypes.c_uint64, 8), ('va_len', ctypes.c_uint64, 16), ('mmapsize', ctypes.c_uint64, 24), ('id', ctypes.c_uint32, 32), ('metadata_len', ctypes.c_uint32, 36), ('metadata', ctypes.c_uint64, 40)]) +@c.record +class struct_kgsl_gpuobj_free(c.Struct): + SIZE = 32 + flags: int + priv: int + id: int + type: int + len: int +struct_kgsl_gpuobj_free.register_fields([('flags', ctypes.c_uint64, 0), ('priv', ctypes.c_uint64, 8), ('id', ctypes.c_uint32, 16), ('type', ctypes.c_uint32, 20), ('len', ctypes.c_uint32, 24)]) +@c.record +class struct_kgsl_gpu_event_timestamp(c.Struct): + SIZE = 8 + context_id: int + timestamp: int +struct_kgsl_gpu_event_timestamp.register_fields([('context_id', ctypes.c_uint32, 0), ('timestamp', ctypes.c_uint32, 4)]) +@c.record +class struct_kgsl_gpu_event_fence(c.Struct): + SIZE = 4 + fd: int +struct_kgsl_gpu_event_fence.register_fields([('fd', ctypes.c_int32, 0)]) +@c.record +class struct_kgsl_gpuobj_info(c.Struct): + SIZE = 48 + gpuaddr: int + flags: int + size: int + va_len: int + va_addr: int + id: int +struct_kgsl_gpuobj_info.register_fields([('gpuaddr', ctypes.c_uint64, 0), ('flags', ctypes.c_uint64, 8), ('size', ctypes.c_uint64, 16), ('va_len', ctypes.c_uint64, 24), ('va_addr', ctypes.c_uint64, 32), ('id', ctypes.c_uint32, 40)]) +@c.record +class struct_kgsl_gpuobj_import(c.Struct): + SIZE = 32 + priv: int + priv_len: int + flags: int + type: int + id: int +struct_kgsl_gpuobj_import.register_fields([('priv', ctypes.c_uint64, 0), ('priv_len', ctypes.c_uint64, 8), ('flags', ctypes.c_uint64, 16), ('type', ctypes.c_uint32, 24), ('id', ctypes.c_uint32, 28)]) +@c.record +class struct_kgsl_gpuobj_import_dma_buf(c.Struct): + SIZE = 4 + fd: int +struct_kgsl_gpuobj_import_dma_buf.register_fields([('fd', ctypes.c_int32, 0)]) +@c.record +class struct_kgsl_gpuobj_import_useraddr(c.Struct): + SIZE = 8 + virtaddr: int +struct_kgsl_gpuobj_import_useraddr.register_fields([('virtaddr', ctypes.c_uint64, 0)]) +@c.record +class struct_kgsl_gpuobj_sync_obj(c.Struct): + SIZE = 24 + offset: int + length: int + id: int + op: int +struct_kgsl_gpuobj_sync_obj.register_fields([('offset', ctypes.c_uint64, 0), ('length', ctypes.c_uint64, 8), ('id', ctypes.c_uint32, 16), ('op', ctypes.c_uint32, 20)]) +@c.record +class struct_kgsl_gpuobj_sync(c.Struct): + SIZE = 16 + objs: int + obj_len: int + count: int +struct_kgsl_gpuobj_sync.register_fields([('objs', ctypes.c_uint64, 0), ('obj_len', ctypes.c_uint32, 8), ('count', ctypes.c_uint32, 12)]) +@c.record +class struct_kgsl_command_object(c.Struct): + SIZE = 32 + offset: int + gpuaddr: int + size: int + flags: int + id: int +struct_kgsl_command_object.register_fields([('offset', ctypes.c_uint64, 0), ('gpuaddr', ctypes.c_uint64, 8), ('size', ctypes.c_uint64, 16), ('flags', ctypes.c_uint32, 24), ('id', ctypes.c_uint32, 28)]) +@c.record +class struct_kgsl_command_syncpoint(c.Struct): + SIZE = 24 + priv: int + size: int + type: int +struct_kgsl_command_syncpoint.register_fields([('priv', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('type', ctypes.c_uint32, 16)]) +@c.record +class struct_kgsl_gpu_command(c.Struct): + SIZE = 64 + flags: int + cmdlist: int + cmdsize: int + numcmds: int + objlist: int + objsize: int + numobjs: int + synclist: int + syncsize: int + numsyncs: int + context_id: int + timestamp: int +struct_kgsl_gpu_command.register_fields([('flags', ctypes.c_uint64, 0), ('cmdlist', ctypes.c_uint64, 8), ('cmdsize', ctypes.c_uint32, 16), ('numcmds', ctypes.c_uint32, 20), ('objlist', ctypes.c_uint64, 24), ('objsize', ctypes.c_uint32, 32), ('numobjs', ctypes.c_uint32, 36), ('synclist', ctypes.c_uint64, 40), ('syncsize', ctypes.c_uint32, 48), ('numsyncs', ctypes.c_uint32, 52), ('context_id', ctypes.c_uint32, 56), ('timestamp', ctypes.c_uint32, 60)]) +@c.record +class struct_kgsl_preemption_counters_query(c.Struct): + SIZE = 24 + counters: int + size_user: int + size_priority_level: int + max_priority_level: int +struct_kgsl_preemption_counters_query.register_fields([('counters', ctypes.c_uint64, 0), ('size_user', ctypes.c_uint32, 8), ('size_priority_level', ctypes.c_uint32, 12), ('max_priority_level', ctypes.c_uint32, 16)]) +@c.record +class struct_kgsl_gpuobj_set_info(c.Struct): + SIZE = 32 + flags: int + metadata: int + id: int + metadata_len: int + type: int +struct_kgsl_gpuobj_set_info.register_fields([('flags', ctypes.c_uint64, 0), ('metadata', ctypes.c_uint64, 8), ('id', ctypes.c_uint32, 16), ('metadata_len', ctypes.c_uint32, 20), ('type', ctypes.c_uint32, 24)]) +KGSL_VERSION_MAJOR = 3 +KGSL_VERSION_MINOR = 14 +KGSL_CONTEXT_SAVE_GMEM = 0x00000001 +KGSL_CONTEXT_NO_GMEM_ALLOC = 0x00000002 +KGSL_CONTEXT_SUBMIT_IB_LIST = 0x00000004 +KGSL_CONTEXT_CTX_SWITCH = 0x00000008 +KGSL_CONTEXT_PREAMBLE = 0x00000010 +KGSL_CONTEXT_TRASH_STATE = 0x00000020 +KGSL_CONTEXT_PER_CONTEXT_TS = 0x00000040 +KGSL_CONTEXT_USER_GENERATED_TS = 0x00000080 +KGSL_CONTEXT_END_OF_FRAME = 0x00000100 +KGSL_CONTEXT_NO_FAULT_TOLERANCE = 0x00000200 +KGSL_CONTEXT_SYNC = 0x00000400 +KGSL_CONTEXT_PWR_CONSTRAINT = 0x00000800 +KGSL_CONTEXT_PRIORITY_MASK = 0x0000F000 +KGSL_CONTEXT_PRIORITY_SHIFT = 12 +KGSL_CONTEXT_PRIORITY_UNDEF = 0 +KGSL_CONTEXT_IFH_NOP = 0x00010000 +KGSL_CONTEXT_SECURE = 0x00020000 +KGSL_CONTEXT_PREEMPT_STYLE_MASK = 0x0E000000 +KGSL_CONTEXT_PREEMPT_STYLE_SHIFT = 25 +KGSL_CONTEXT_PREEMPT_STYLE_DEFAULT = 0x0 +KGSL_CONTEXT_PREEMPT_STYLE_RINGBUFFER = 0x1 +KGSL_CONTEXT_PREEMPT_STYLE_FINEGRAIN = 0x2 +KGSL_CONTEXT_TYPE_MASK = 0x01F00000 +KGSL_CONTEXT_TYPE_SHIFT = 20 +KGSL_CONTEXT_TYPE_ANY = 0 +KGSL_CONTEXT_TYPE_GL = 1 +KGSL_CONTEXT_TYPE_CL = 2 +KGSL_CONTEXT_TYPE_C2D = 3 +KGSL_CONTEXT_TYPE_RS = 4 +KGSL_CONTEXT_TYPE_UNKNOWN = 0x1E +KGSL_CONTEXT_INVALID = 0xffffffff +KGSL_CMDBATCH_MEMLIST = 0x00000001 +KGSL_CMDBATCH_MARKER = 0x00000002 +KGSL_CMDBATCH_SUBMIT_IB_LIST = KGSL_CONTEXT_SUBMIT_IB_LIST +KGSL_CMDBATCH_CTX_SWITCH = KGSL_CONTEXT_CTX_SWITCH +KGSL_CMDBATCH_PROFILING = 0x00000010 +KGSL_CMDBATCH_PROFILING_KTIME = 0x00000020 +KGSL_CMDBATCH_END_OF_FRAME = KGSL_CONTEXT_END_OF_FRAME +KGSL_CMDBATCH_SYNC = KGSL_CONTEXT_SYNC +KGSL_CMDBATCH_PWR_CONSTRAINT = KGSL_CONTEXT_PWR_CONSTRAINT +KGSL_CMDLIST_IB = 0x00000001 +KGSL_CMDLIST_CTXTSWITCH_PREAMBLE = 0x00000002 +KGSL_CMDLIST_IB_PREAMBLE = 0x00000004 +KGSL_OBJLIST_MEMOBJ = 0x00000008 +KGSL_OBJLIST_PROFILE = 0x00000010 +KGSL_CMD_SYNCPOINT_TYPE_TIMESTAMP = 0 +KGSL_CMD_SYNCPOINT_TYPE_FENCE = 1 +KGSL_MEMFLAGS_SECURE = 0x00000008 +KGSL_MEMFLAGS_GPUREADONLY = 0x01000000 +KGSL_MEMFLAGS_GPUWRITEONLY = 0x02000000 +KGSL_MEMFLAGS_FORCE_32BIT = 0x100000000 +KGSL_CACHEMODE_MASK = 0x0C000000 +KGSL_CACHEMODE_SHIFT = 26 +KGSL_CACHEMODE_WRITECOMBINE = 0 +KGSL_CACHEMODE_UNCACHED = 1 +KGSL_CACHEMODE_WRITETHROUGH = 2 +KGSL_CACHEMODE_WRITEBACK = 3 +KGSL_MEMFLAGS_USE_CPU_MAP = 0x10000000 +KGSL_MEMTYPE_MASK = 0x0000FF00 +KGSL_MEMTYPE_SHIFT = 8 +KGSL_MEMTYPE_OBJECTANY = 0 +KGSL_MEMTYPE_FRAMEBUFFER = 1 +KGSL_MEMTYPE_RENDERBUFFER = 2 +KGSL_MEMTYPE_ARRAYBUFFER = 3 +KGSL_MEMTYPE_ELEMENTARRAYBUFFER = 4 +KGSL_MEMTYPE_VERTEXARRAYBUFFER = 5 +KGSL_MEMTYPE_TEXTURE = 6 +KGSL_MEMTYPE_SURFACE = 7 +KGSL_MEMTYPE_EGL_SURFACE = 8 +KGSL_MEMTYPE_GL = 9 +KGSL_MEMTYPE_CL = 10 +KGSL_MEMTYPE_CL_BUFFER_MAP = 11 +KGSL_MEMTYPE_CL_BUFFER_NOMAP = 12 +KGSL_MEMTYPE_CL_IMAGE_MAP = 13 +KGSL_MEMTYPE_CL_IMAGE_NOMAP = 14 +KGSL_MEMTYPE_CL_KERNEL_STACK = 15 +KGSL_MEMTYPE_COMMAND = 16 +KGSL_MEMTYPE_2D = 17 +KGSL_MEMTYPE_EGL_IMAGE = 18 +KGSL_MEMTYPE_EGL_SHADOW = 19 +KGSL_MEMTYPE_MULTISAMPLE = 20 +KGSL_MEMTYPE_KERNEL = 255 +KGSL_MEMALIGN_MASK = 0x00FF0000 +KGSL_MEMALIGN_SHIFT = 16 +KGSL_MEMFLAGS_USERMEM_MASK = 0x000000e0 +KGSL_MEMFLAGS_USERMEM_SHIFT = 5 +KGSL_USERMEM_FLAG = lambda x: (((x) + 1) << KGSL_MEMFLAGS_USERMEM_SHIFT) # type: ignore +KGSL_MEMFLAGS_NOT_USERMEM = 0 +KGSL_MEMFLAGS_USERMEM_PMEM = KGSL_USERMEM_FLAG(KGSL_USER_MEM_TYPE_PMEM) +KGSL_MEMFLAGS_USERMEM_ASHMEM = KGSL_USERMEM_FLAG(KGSL_USER_MEM_TYPE_ASHMEM) +KGSL_MEMFLAGS_USERMEM_ADDR = KGSL_USERMEM_FLAG(KGSL_USER_MEM_TYPE_ADDR) +KGSL_MEMFLAGS_USERMEM_ION = KGSL_USERMEM_FLAG(KGSL_USER_MEM_TYPE_ION) +KGSL_FLAGS_NORMALMODE = 0x00000000 +KGSL_FLAGS_SAFEMODE = 0x00000001 +KGSL_FLAGS_INITIALIZED0 = 0x00000002 +KGSL_FLAGS_INITIALIZED = 0x00000004 +KGSL_FLAGS_STARTED = 0x00000008 +KGSL_FLAGS_ACTIVE = 0x00000010 +KGSL_FLAGS_RESERVED0 = 0x00000020 +KGSL_FLAGS_RESERVED1 = 0x00000040 +KGSL_FLAGS_RESERVED2 = 0x00000080 +KGSL_FLAGS_SOFT_RESET = 0x00000100 +KGSL_FLAGS_PER_CONTEXT_TIMESTAMPS = 0x00000200 +KGSL_SYNCOBJ_SERVER_TIMEOUT = 2000 +KGSL_CONVERT_TO_MBPS = lambda val: (val*1000*1000) # type: ignore +KGSL_MEMSTORE_OFFSET = lambda ctxt_id,field: ((ctxt_id)*sizeof(struct_kgsl_devmemstore) + offsetof(struct_kgsl_devmemstore, field)) # type: ignore +KGSL_PROP_DEVICE_INFO = 0x1 +KGSL_PROP_DEVICE_SHADOW = 0x2 +KGSL_PROP_DEVICE_POWER = 0x3 +KGSL_PROP_SHMEM = 0x4 +KGSL_PROP_SHMEM_APERTURES = 0x5 +KGSL_PROP_MMU_ENABLE = 0x6 +KGSL_PROP_INTERRUPT_WAITS = 0x7 +KGSL_PROP_VERSION = 0x8 +KGSL_PROP_GPU_RESET_STAT = 0x9 +KGSL_PROP_PWRCTRL = 0xE +KGSL_PROP_PWR_CONSTRAINT = 0x12 +KGSL_PROP_UCHE_GMEM_VADDR = 0x13 +KGSL_PROP_SP_GENERIC_MEM = 0x14 +KGSL_PROP_UCODE_VERSION = 0x15 +KGSL_PROP_GPMU_VERSION = 0x16 +KGSL_PROP_DEVICE_BITNESS = 0x18 +KGSL_PERFCOUNTER_GROUP_CP = 0x0 +KGSL_PERFCOUNTER_GROUP_RBBM = 0x1 +KGSL_PERFCOUNTER_GROUP_PC = 0x2 +KGSL_PERFCOUNTER_GROUP_VFD = 0x3 +KGSL_PERFCOUNTER_GROUP_HLSQ = 0x4 +KGSL_PERFCOUNTER_GROUP_VPC = 0x5 +KGSL_PERFCOUNTER_GROUP_TSE = 0x6 +KGSL_PERFCOUNTER_GROUP_RAS = 0x7 +KGSL_PERFCOUNTER_GROUP_UCHE = 0x8 +KGSL_PERFCOUNTER_GROUP_TP = 0x9 +KGSL_PERFCOUNTER_GROUP_SP = 0xA +KGSL_PERFCOUNTER_GROUP_RB = 0xB +KGSL_PERFCOUNTER_GROUP_PWR = 0xC +KGSL_PERFCOUNTER_GROUP_VBIF = 0xD +KGSL_PERFCOUNTER_GROUP_VBIF_PWR = 0xE +KGSL_PERFCOUNTER_GROUP_MH = 0xF +KGSL_PERFCOUNTER_GROUP_PA_SU = 0x10 +KGSL_PERFCOUNTER_GROUP_SQ = 0x11 +KGSL_PERFCOUNTER_GROUP_SX = 0x12 +KGSL_PERFCOUNTER_GROUP_TCF = 0x13 +KGSL_PERFCOUNTER_GROUP_TCM = 0x14 +KGSL_PERFCOUNTER_GROUP_TCR = 0x15 +KGSL_PERFCOUNTER_GROUP_L2 = 0x16 +KGSL_PERFCOUNTER_GROUP_VSC = 0x17 +KGSL_PERFCOUNTER_GROUP_CCU = 0x18 +KGSL_PERFCOUNTER_GROUP_LRZ = 0x19 +KGSL_PERFCOUNTER_GROUP_CMP = 0x1A +KGSL_PERFCOUNTER_GROUP_ALWAYSON = 0x1B +KGSL_PERFCOUNTER_GROUP_SP_PWR = 0x1C +KGSL_PERFCOUNTER_GROUP_TP_PWR = 0x1D +KGSL_PERFCOUNTER_GROUP_RB_PWR = 0x1E +KGSL_PERFCOUNTER_GROUP_CCU_PWR = 0x1F +KGSL_PERFCOUNTER_GROUP_UCHE_PWR = 0x20 +KGSL_PERFCOUNTER_GROUP_CP_PWR = 0x21 +KGSL_PERFCOUNTER_GROUP_GPMU_PWR = 0x22 +KGSL_PERFCOUNTER_GROUP_ALWAYSON_PWR = 0x23 +KGSL_PERFCOUNTER_GROUP_MAX = 0x24 +KGSL_PERFCOUNTER_NOT_USED = 0xFFFFFFFF +KGSL_PERFCOUNTER_BROKEN = 0xFFFFFFFE +KGSL_IOC_TYPE = 0x09 +IOCTL_KGSL_DEVICE_GETPROPERTY = _IOWR(KGSL_IOC_TYPE, 0x2, struct_kgsl_device_getproperty) +IOCTL_KGSL_DEVICE_WAITTIMESTAMP = _IOW(KGSL_IOC_TYPE, 0x6, struct_kgsl_device_waittimestamp) +IOCTL_KGSL_DEVICE_WAITTIMESTAMP_CTXTID = _IOW(KGSL_IOC_TYPE, 0x7, struct_kgsl_device_waittimestamp_ctxtid) +IOCTL_KGSL_RINGBUFFER_ISSUEIBCMDS = _IOWR(KGSL_IOC_TYPE, 0x10, struct_kgsl_ringbuffer_issueibcmds) +IOCTL_KGSL_CMDSTREAM_READTIMESTAMP_OLD = _IOR(KGSL_IOC_TYPE, 0x11, struct_kgsl_cmdstream_readtimestamp) +IOCTL_KGSL_CMDSTREAM_READTIMESTAMP = _IOWR(KGSL_IOC_TYPE, 0x11, struct_kgsl_cmdstream_readtimestamp) +IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP = _IOW(KGSL_IOC_TYPE, 0x12, struct_kgsl_cmdstream_freememontimestamp) +IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP_OLD = _IOR(KGSL_IOC_TYPE, 0x12, struct_kgsl_cmdstream_freememontimestamp) +IOCTL_KGSL_DRAWCTXT_CREATE = _IOWR(KGSL_IOC_TYPE, 0x13, struct_kgsl_drawctxt_create) +IOCTL_KGSL_DRAWCTXT_DESTROY = _IOW(KGSL_IOC_TYPE, 0x14, struct_kgsl_drawctxt_destroy) +IOCTL_KGSL_MAP_USER_MEM = _IOWR(KGSL_IOC_TYPE, 0x15, struct_kgsl_map_user_mem) +IOCTL_KGSL_CMDSTREAM_READTIMESTAMP_CTXTID = _IOWR(KGSL_IOC_TYPE, 0x16, struct_kgsl_cmdstream_readtimestamp_ctxtid) +IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP_CTXTID = _IOW(KGSL_IOC_TYPE, 0x17, struct_kgsl_cmdstream_freememontimestamp_ctxtid) +IOCTL_KGSL_SHAREDMEM_FROM_PMEM = _IOWR(KGSL_IOC_TYPE, 0x20, struct_kgsl_sharedmem_from_pmem) +IOCTL_KGSL_SHAREDMEM_FREE = _IOW(KGSL_IOC_TYPE, 0x21, struct_kgsl_sharedmem_free) +IOCTL_KGSL_CFF_USER_EVENT = _IOW(KGSL_IOC_TYPE, 0x31, struct_kgsl_cff_user_event) +IOCTL_KGSL_DRAWCTXT_BIND_GMEM_SHADOW = _IOW(KGSL_IOC_TYPE, 0x22, struct_kgsl_bind_gmem_shadow) +IOCTL_KGSL_SHAREDMEM_FROM_VMALLOC = _IOWR(KGSL_IOC_TYPE, 0x23, struct_kgsl_sharedmem_from_vmalloc) +IOCTL_KGSL_SHAREDMEM_FLUSH_CACHE = _IOW(KGSL_IOC_TYPE, 0x24, struct_kgsl_sharedmem_free) +IOCTL_KGSL_DRAWCTXT_SET_BIN_BASE_OFFSET = _IOW(KGSL_IOC_TYPE, 0x25, struct_kgsl_drawctxt_set_bin_base_offset) +IOCTL_KGSL_CMDWINDOW_WRITE = _IOW(KGSL_IOC_TYPE, 0x2e, struct_kgsl_cmdwindow_write) +IOCTL_KGSL_GPUMEM_ALLOC = _IOWR(KGSL_IOC_TYPE, 0x2f, struct_kgsl_gpumem_alloc) +IOCTL_KGSL_CFF_SYNCMEM = _IOW(KGSL_IOC_TYPE, 0x30, struct_kgsl_cff_syncmem) +IOCTL_KGSL_TIMESTAMP_EVENT_OLD = _IOW(KGSL_IOC_TYPE, 0x31, struct_kgsl_timestamp_event) +KGSL_TIMESTAMP_EVENT_GENLOCK = 1 +KGSL_TIMESTAMP_EVENT_FENCE = 2 +IOCTL_KGSL_SETPROPERTY = _IOW(KGSL_IOC_TYPE, 0x32, struct_kgsl_device_getproperty) +IOCTL_KGSL_TIMESTAMP_EVENT = _IOWR(KGSL_IOC_TYPE, 0x33, struct_kgsl_timestamp_event) +IOCTL_KGSL_GPUMEM_ALLOC_ID = _IOWR(KGSL_IOC_TYPE, 0x34, struct_kgsl_gpumem_alloc_id) +IOCTL_KGSL_GPUMEM_FREE_ID = _IOWR(KGSL_IOC_TYPE, 0x35, struct_kgsl_gpumem_free_id) +IOCTL_KGSL_GPUMEM_GET_INFO = _IOWR(KGSL_IOC_TYPE, 0x36, struct_kgsl_gpumem_get_info) +KGSL_GPUMEM_CACHE_CLEAN = (1 << 0) +KGSL_GPUMEM_CACHE_TO_GPU = KGSL_GPUMEM_CACHE_CLEAN +KGSL_GPUMEM_CACHE_INV = (1 << 1) +KGSL_GPUMEM_CACHE_FROM_GPU = KGSL_GPUMEM_CACHE_INV +KGSL_GPUMEM_CACHE_FLUSH = (KGSL_GPUMEM_CACHE_CLEAN | KGSL_GPUMEM_CACHE_INV) +KGSL_GPUMEM_CACHE_RANGE = (1 << 31) +IOCTL_KGSL_GPUMEM_SYNC_CACHE = _IOW(KGSL_IOC_TYPE, 0x37, struct_kgsl_gpumem_sync_cache) +IOCTL_KGSL_PERFCOUNTER_GET = _IOWR(KGSL_IOC_TYPE, 0x38, struct_kgsl_perfcounter_get) +IOCTL_KGSL_PERFCOUNTER_PUT = _IOW(KGSL_IOC_TYPE, 0x39, struct_kgsl_perfcounter_put) +IOCTL_KGSL_PERFCOUNTER_QUERY = _IOWR(KGSL_IOC_TYPE, 0x3A, struct_kgsl_perfcounter_query) +IOCTL_KGSL_PERFCOUNTER_READ = _IOWR(KGSL_IOC_TYPE, 0x3B, struct_kgsl_perfcounter_read) +IOCTL_KGSL_GPUMEM_SYNC_CACHE_BULK = _IOWR(KGSL_IOC_TYPE, 0x3C, struct_kgsl_gpumem_sync_cache_bulk) +KGSL_IBDESC_MEMLIST = 0x1 +KGSL_IBDESC_PROFILING_BUFFER = 0x2 +IOCTL_KGSL_SUBMIT_COMMANDS = _IOWR(KGSL_IOC_TYPE, 0x3D, struct_kgsl_submit_commands) +KGSL_CONSTRAINT_NONE = 0 +KGSL_CONSTRAINT_PWRLEVEL = 1 +KGSL_CONSTRAINT_PWR_MIN = 0 +KGSL_CONSTRAINT_PWR_MAX = 1 +IOCTL_KGSL_SYNCSOURCE_CREATE = _IOWR(KGSL_IOC_TYPE, 0x40, struct_kgsl_syncsource_create) +IOCTL_KGSL_SYNCSOURCE_DESTROY = _IOWR(KGSL_IOC_TYPE, 0x41, struct_kgsl_syncsource_destroy) +IOCTL_KGSL_SYNCSOURCE_CREATE_FENCE = _IOWR(KGSL_IOC_TYPE, 0x42, struct_kgsl_syncsource_create_fence) +IOCTL_KGSL_SYNCSOURCE_SIGNAL_FENCE = _IOWR(KGSL_IOC_TYPE, 0x43, struct_kgsl_syncsource_signal_fence) +IOCTL_KGSL_CFF_SYNC_GPUOBJ = _IOW(KGSL_IOC_TYPE, 0x44, struct_kgsl_cff_sync_gpuobj) +KGSL_GPUOBJ_ALLOC_METADATA_MAX = 64 +IOCTL_KGSL_GPUOBJ_ALLOC = _IOWR(KGSL_IOC_TYPE, 0x45, struct_kgsl_gpuobj_alloc) +KGSL_GPUOBJ_FREE_ON_EVENT = 1 +KGSL_GPU_EVENT_TIMESTAMP = 1 +KGSL_GPU_EVENT_FENCE = 2 +IOCTL_KGSL_GPUOBJ_FREE = _IOW(KGSL_IOC_TYPE, 0x46, struct_kgsl_gpuobj_free) +IOCTL_KGSL_GPUOBJ_INFO = _IOWR(KGSL_IOC_TYPE, 0x47, struct_kgsl_gpuobj_info) +IOCTL_KGSL_GPUOBJ_IMPORT = _IOWR(KGSL_IOC_TYPE, 0x48, struct_kgsl_gpuobj_import) +IOCTL_KGSL_GPUOBJ_SYNC = _IOW(KGSL_IOC_TYPE, 0x49, struct_kgsl_gpuobj_sync) +IOCTL_KGSL_GPU_COMMAND = _IOWR(KGSL_IOC_TYPE, 0x4A, struct_kgsl_gpu_command) +IOCTL_KGSL_PREEMPTIONCOUNTER_QUERY = _IOWR(KGSL_IOC_TYPE, 0x4B, struct_kgsl_preemption_counters_query) +KGSL_GPUOBJ_SET_INFO_METADATA = (1 << 0) +KGSL_GPUOBJ_SET_INFO_TYPE = (1 << 1) +IOCTL_KGSL_GPUOBJ_SET_INFO = _IOW(KGSL_IOC_TYPE, 0x4C, struct_kgsl_gpuobj_set_info) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/libc.py b/artifacts/package_runtime/tinygrad/runtime/autogen/libc.py new file mode 100644 index 000000000..357d329a1 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/libc.py @@ -0,0 +1,4458 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +dll = c.DLL('libc', 'c', use_errno=True) +off_t: TypeAlias = ctypes.c_int64 +mode_t: TypeAlias = ctypes.c_uint32 +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def memfd_create(__name:c.POINTER[ctypes.c_char], __flags:int) -> int: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_uint32) +def mlock2(__addr:ctypes.c_void_p, __length:size_t, __flags:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32, ctypes.c_uint32) +def pkey_alloc(__flags:int, __access_rights:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_uint32) +def pkey_set(__key:int, __access_rights:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def pkey_get(__key:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def pkey_free(__key:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int32, ctypes.c_int32) +def pkey_mprotect(__addr:ctypes.c_void_p, __len:size_t, __prot:int, __pkey:int) -> int: ... +__off_t: TypeAlias = ctypes.c_int64 +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int64) +def mmap(__addr:ctypes.c_void_p, __len:size_t, __prot:int, __flags:int, __fd:int, __offset:ctypes.c_int64) -> ctypes.c_void_p: ... +__off64_t: TypeAlias = ctypes.c_int64 +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int64) +def mmap64(__addr:ctypes.c_void_p, __len:size_t, __prot:int, __flags:int, __fd:int, __offset:ctypes.c_int64) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t) +def munmap(__addr:ctypes.c_void_p, __len:size_t) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int32) +def mprotect(__addr:ctypes.c_void_p, __len:size_t, __prot:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int32) +def msync(__addr:ctypes.c_void_p, __len:size_t, __flags:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int32) +def madvise(__addr:ctypes.c_void_p, __len:size_t, __advice:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int32) +def posix_madvise(__addr:ctypes.c_void_p, __len:size_t, __advice:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t) +def mlock(__addr:ctypes.c_void_p, __len:size_t) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t) +def munlock(__addr:ctypes.c_void_p, __len:size_t) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def mlockall(__flags:int) -> int: ... +@dll.bind(ctypes.c_int32) +def munlockall() -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_ubyte]) +def mincore(__start:ctypes.c_void_p, __len:size_t, __vec:c.POINTER[ctypes.c_ubyte]) -> int: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, ctypes.c_int32) +def mremap(__addr:ctypes.c_void_p, __old_len:size_t, __new_len:size_t, __flags:int) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int32, size_t, ctypes.c_int32) +def remap_file_pages(__start:ctypes.c_void_p, __size:size_t, __prot:int, __pgoff:size_t, __flags:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32, mode_t) +def shm_open(__name:c.POINTER[ctypes.c_char], __oflag:int, __mode:mode_t) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def shm_unlink(__name:c.POINTER[ctypes.c_char]) -> int: ... +__ssize_t: TypeAlias = ctypes.c_int64 +class struct_iovec(c.Struct): pass +@dll.bind(ctypes.c_int64, ctypes.c_int32, c.POINTER[struct_iovec], size_t, ctypes.c_int32, ctypes.c_uint32) +def process_madvise(__pid_fd:int, __iov:c.POINTER[struct_iovec], __count:size_t, __advice:int, __flags:int) -> ctypes.c_int64: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_uint32) +def process_mrelease(pidfd:int, flags:int) -> int: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t) +def memcpy(__dest:ctypes.c_void_p, __src:ctypes.c_void_p, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t) +def memmove(__dest:ctypes.c_void_p, __src:ctypes.c_void_p, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int32, size_t) +def memccpy(__dest:ctypes.c_void_p, __src:ctypes.c_void_p, __c:int, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int32, size_t) +def memset(__s:ctypes.c_void_p, __c:int, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, ctypes.c_void_p, size_t) +def memcmp(__s1:ctypes.c_void_p, __s2:ctypes.c_void_p, __n:size_t) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, ctypes.c_void_p, size_t) +def __memcmpeq(__s1:ctypes.c_void_p, __s2:ctypes.c_void_p, __n:size_t) -> int: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int32, size_t) +def memchr(__s:ctypes.c_void_p, __c:int, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int32) +def rawmemchr(__s:ctypes.c_void_p, __c:int) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int32, size_t) +def memrchr(__s:ctypes.c_void_p, __c:int, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strcpy(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def strncpy(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char], __n:size_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strcat(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def strncat(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char], __n:size_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strcmp(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def strncmp(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char], __n:size_t) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strcoll(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_uint64, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def strxfrm(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char], __n:size_t) -> int: ... +@c.record +class struct___locale_struct(c.Struct): + SIZE = 232 + __locales: c.Array[c.POINTER[struct___locale_data], Literal[13]] + __ctype_b: c.POINTER[ctypes.c_uint16] + __ctype_tolower: c.POINTER[ctypes.c_int32] + __ctype_toupper: c.POINTER[ctypes.c_int32] + __names: c.Array[c.POINTER[ctypes.c_char], Literal[13]] +class struct___locale_data(c.Struct): pass +struct___locale_struct.register_fields([('__locales', c.Array[c.POINTER[struct___locale_data], Literal[13]], 0), ('__ctype_b', c.POINTER[ctypes.c_uint16], 104), ('__ctype_tolower', c.POINTER[ctypes.c_int32], 112), ('__ctype_toupper', c.POINTER[ctypes.c_int32], 120), ('__names', c.Array[c.POINTER[ctypes.c_char], Literal[13]], 128)]) +locale_t: TypeAlias = c.POINTER[struct___locale_struct] +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], locale_t) +def strcoll_l(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char], __l:locale_t) -> int: ... +@dll.bind(size_t, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t, locale_t) +def strxfrm_l(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char], __n:size_t, __l:locale_t) -> size_t: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strdup(__s:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def strndup(__string:c.POINTER[ctypes.c_char], __n:size_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32) +def strchr(__s:c.POINTER[ctypes.c_char], __c:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32) +def strrchr(__s:c.POINTER[ctypes.c_char], __c:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32) +def strchrnul(__s:c.POINTER[ctypes.c_char], __c:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint64, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strcspn(__s:c.POINTER[ctypes.c_char], __reject:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_uint64, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strspn(__s:c.POINTER[ctypes.c_char], __accept:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strpbrk(__s:c.POINTER[ctypes.c_char], __accept:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strstr(__haystack:c.POINTER[ctypes.c_char], __needle:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strtok(__s:c.POINTER[ctypes.c_char], __delim:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]]) +def __strtok_r(__s:c.POINTER[ctypes.c_char], __delim:c.POINTER[ctypes.c_char], __save_ptr:c.POINTER[c.POINTER[ctypes.c_char]]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]]) +def strtok_r(__s:c.POINTER[ctypes.c_char], __delim:c.POINTER[ctypes.c_char], __save_ptr:c.POINTER[c.POINTER[ctypes.c_char]]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strcasestr(__haystack:c.POINTER[ctypes.c_char], __needle:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_void_p, size_t) +def memmem(__haystack:ctypes.c_void_p, __haystacklen:size_t, __needle:ctypes.c_void_p, __needlelen:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t) +def __mempcpy(__dest:ctypes.c_void_p, __src:ctypes.c_void_p, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t) +def mempcpy(__dest:ctypes.c_void_p, __src:ctypes.c_void_p, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_uint64, c.POINTER[ctypes.c_char]) +def strlen(__s:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(size_t, c.POINTER[ctypes.c_char], size_t) +def strnlen(__string:c.POINTER[ctypes.c_char], __maxlen:size_t) -> size_t: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def strerror(__errnum:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def strerror_r(__errnum:int, __buf:c.POINTER[ctypes.c_char], __buflen:size_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def strerrordesc_np(__err:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def strerrorname_np(__err:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32, locale_t) +def strerror_l(__errnum:int, __l:locale_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, ctypes.c_void_p, size_t) +def bcmp(__s1:ctypes.c_void_p, __s2:ctypes.c_void_p, __n:size_t) -> int: ... +@dll.bind(None, ctypes.c_void_p, ctypes.c_void_p, size_t) +def bcopy(__src:ctypes.c_void_p, __dest:ctypes.c_void_p, __n:size_t) -> None: ... +@dll.bind(None, ctypes.c_void_p, size_t) +def bzero(__s:ctypes.c_void_p, __n:size_t) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32) +def index(__s:c.POINTER[ctypes.c_char], __c:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32) +def rindex(__s:c.POINTER[ctypes.c_char], __c:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def ffs(__i:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int64) +def ffsl(__l:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int64) +def ffsll(__ll:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strcasecmp(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def strncasecmp(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char], __n:size_t) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], locale_t) +def strcasecmp_l(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char], __loc:locale_t) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t, locale_t) +def strncasecmp_l(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char], __n:size_t, __loc:locale_t) -> int: ... +@dll.bind(None, ctypes.c_void_p, size_t) +def explicit_bzero(__s:ctypes.c_void_p, __n:size_t) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def strsep(__stringp:c.POINTER[c.POINTER[ctypes.c_char]], __delim:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def strsignal(__sig:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def sigabbrev_np(__sig:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def sigdescr_np(__sig:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def __stpcpy(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def stpcpy(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def __stpncpy(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char], __n:size_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def stpncpy(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char], __n:size_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(size_t, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def strlcpy(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char], __n:size_t) -> size_t: ... +@dll.bind(size_t, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def strlcat(__dest:c.POINTER[ctypes.c_char], __src:c.POINTER[ctypes.c_char], __n:size_t) -> size_t: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strverscmp(__s1:c.POINTER[ctypes.c_char], __s2:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def strfry(__string:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t) +def memfrob(__s:ctypes.c_void_p, __n:size_t) -> ctypes.c_void_p: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def basename(__filename:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +Elf32_Half: TypeAlias = ctypes.c_uint16 +Elf64_Half: TypeAlias = ctypes.c_uint16 +Elf32_Word: TypeAlias = ctypes.c_uint32 +Elf32_Sword: TypeAlias = ctypes.c_int32 +Elf64_Word: TypeAlias = ctypes.c_uint32 +Elf64_Sword: TypeAlias = ctypes.c_int32 +Elf32_Xword: TypeAlias = ctypes.c_uint64 +Elf32_Sxword: TypeAlias = ctypes.c_int64 +Elf64_Xword: TypeAlias = ctypes.c_uint64 +Elf64_Sxword: TypeAlias = ctypes.c_int64 +Elf32_Addr: TypeAlias = ctypes.c_uint32 +Elf64_Addr: TypeAlias = ctypes.c_uint64 +Elf32_Off: TypeAlias = ctypes.c_uint32 +Elf64_Off: TypeAlias = ctypes.c_uint64 +Elf32_Section: TypeAlias = ctypes.c_uint16 +Elf64_Section: TypeAlias = ctypes.c_uint16 +Elf32_Versym: TypeAlias = ctypes.c_uint16 +Elf64_Versym: TypeAlias = ctypes.c_uint16 +@c.record +class Elf32_Ehdr(c.Struct): + SIZE = 52 + e_ident: c.Array[ctypes.c_ubyte, Literal[16]] + e_type: int + e_machine: int + e_version: int + e_entry: int + e_phoff: int + e_shoff: int + e_flags: int + e_ehsize: int + e_phentsize: int + e_phnum: int + e_shentsize: int + e_shnum: int + e_shstrndx: int +Elf32_Ehdr.register_fields([('e_ident', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('e_type', Elf32_Half, 16), ('e_machine', Elf32_Half, 18), ('e_version', Elf32_Word, 20), ('e_entry', Elf32_Addr, 24), ('e_phoff', Elf32_Off, 28), ('e_shoff', Elf32_Off, 32), ('e_flags', Elf32_Word, 36), ('e_ehsize', Elf32_Half, 40), ('e_phentsize', Elf32_Half, 42), ('e_phnum', Elf32_Half, 44), ('e_shentsize', Elf32_Half, 46), ('e_shnum', Elf32_Half, 48), ('e_shstrndx', Elf32_Half, 50)]) +@c.record +class Elf64_Ehdr(c.Struct): + SIZE = 64 + e_ident: c.Array[ctypes.c_ubyte, Literal[16]] + e_type: int + e_machine: int + e_version: int + e_entry: int + e_phoff: int + e_shoff: int + e_flags: int + e_ehsize: int + e_phentsize: int + e_phnum: int + e_shentsize: int + e_shnum: int + e_shstrndx: int +Elf64_Ehdr.register_fields([('e_ident', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('e_type', Elf64_Half, 16), ('e_machine', Elf64_Half, 18), ('e_version', Elf64_Word, 20), ('e_entry', Elf64_Addr, 24), ('e_phoff', Elf64_Off, 32), ('e_shoff', Elf64_Off, 40), ('e_flags', Elf64_Word, 48), ('e_ehsize', Elf64_Half, 52), ('e_phentsize', Elf64_Half, 54), ('e_phnum', Elf64_Half, 56), ('e_shentsize', Elf64_Half, 58), ('e_shnum', Elf64_Half, 60), ('e_shstrndx', Elf64_Half, 62)]) +@c.record +class Elf32_Shdr(c.Struct): + SIZE = 40 + sh_name: int + sh_type: int + sh_flags: int + sh_addr: int + sh_offset: int + sh_size: int + sh_link: int + sh_info: int + sh_addralign: int + sh_entsize: int +Elf32_Shdr.register_fields([('sh_name', Elf32_Word, 0), ('sh_type', Elf32_Word, 4), ('sh_flags', Elf32_Word, 8), ('sh_addr', Elf32_Addr, 12), ('sh_offset', Elf32_Off, 16), ('sh_size', Elf32_Word, 20), ('sh_link', Elf32_Word, 24), ('sh_info', Elf32_Word, 28), ('sh_addralign', Elf32_Word, 32), ('sh_entsize', Elf32_Word, 36)]) +@c.record +class Elf64_Shdr(c.Struct): + SIZE = 64 + sh_name: int + sh_type: int + sh_flags: int + sh_addr: int + sh_offset: int + sh_size: int + sh_link: int + sh_info: int + sh_addralign: int + sh_entsize: int +Elf64_Shdr.register_fields([('sh_name', Elf64_Word, 0), ('sh_type', Elf64_Word, 4), ('sh_flags', Elf64_Xword, 8), ('sh_addr', Elf64_Addr, 16), ('sh_offset', Elf64_Off, 24), ('sh_size', Elf64_Xword, 32), ('sh_link', Elf64_Word, 40), ('sh_info', Elf64_Word, 44), ('sh_addralign', Elf64_Xword, 48), ('sh_entsize', Elf64_Xword, 56)]) +@c.record +class Elf32_Chdr(c.Struct): + SIZE = 12 + ch_type: int + ch_size: int + ch_addralign: int +Elf32_Chdr.register_fields([('ch_type', Elf32_Word, 0), ('ch_size', Elf32_Word, 4), ('ch_addralign', Elf32_Word, 8)]) +@c.record +class Elf64_Chdr(c.Struct): + SIZE = 24 + ch_type: int + ch_reserved: int + ch_size: int + ch_addralign: int +Elf64_Chdr.register_fields([('ch_type', Elf64_Word, 0), ('ch_reserved', Elf64_Word, 4), ('ch_size', Elf64_Xword, 8), ('ch_addralign', Elf64_Xword, 16)]) +@c.record +class Elf32_Sym(c.Struct): + SIZE = 16 + st_name: int + st_value: int + st_size: int + st_info: int + st_other: int + st_shndx: int +Elf32_Sym.register_fields([('st_name', Elf32_Word, 0), ('st_value', Elf32_Addr, 4), ('st_size', Elf32_Word, 8), ('st_info', ctypes.c_ubyte, 12), ('st_other', ctypes.c_ubyte, 13), ('st_shndx', Elf32_Section, 14)]) +@c.record +class Elf64_Sym(c.Struct): + SIZE = 24 + st_name: int + st_info: int + st_other: int + st_shndx: int + st_value: int + st_size: int +Elf64_Sym.register_fields([('st_name', Elf64_Word, 0), ('st_info', ctypes.c_ubyte, 4), ('st_other', ctypes.c_ubyte, 5), ('st_shndx', Elf64_Section, 6), ('st_value', Elf64_Addr, 8), ('st_size', Elf64_Xword, 16)]) +@c.record +class Elf32_Syminfo(c.Struct): + SIZE = 4 + si_boundto: int + si_flags: int +Elf32_Syminfo.register_fields([('si_boundto', Elf32_Half, 0), ('si_flags', Elf32_Half, 2)]) +@c.record +class Elf64_Syminfo(c.Struct): + SIZE = 4 + si_boundto: int + si_flags: int +Elf64_Syminfo.register_fields([('si_boundto', Elf64_Half, 0), ('si_flags', Elf64_Half, 2)]) +@c.record +class Elf32_Rel(c.Struct): + SIZE = 8 + r_offset: int + r_info: int +Elf32_Rel.register_fields([('r_offset', Elf32_Addr, 0), ('r_info', Elf32_Word, 4)]) +@c.record +class Elf64_Rel(c.Struct): + SIZE = 16 + r_offset: int + r_info: int +Elf64_Rel.register_fields([('r_offset', Elf64_Addr, 0), ('r_info', Elf64_Xword, 8)]) +@c.record +class Elf32_Rela(c.Struct): + SIZE = 12 + r_offset: int + r_info: int + r_addend: int +Elf32_Rela.register_fields([('r_offset', Elf32_Addr, 0), ('r_info', Elf32_Word, 4), ('r_addend', Elf32_Sword, 8)]) +@c.record +class Elf64_Rela(c.Struct): + SIZE = 24 + r_offset: int + r_info: int + r_addend: int +Elf64_Rela.register_fields([('r_offset', Elf64_Addr, 0), ('r_info', Elf64_Xword, 8), ('r_addend', Elf64_Sxword, 16)]) +Elf32_Relr: TypeAlias = ctypes.c_uint32 +Elf64_Relr: TypeAlias = ctypes.c_uint64 +@c.record +class Elf32_Phdr(c.Struct): + SIZE = 32 + p_type: int + p_offset: int + p_vaddr: int + p_paddr: int + p_filesz: int + p_memsz: int + p_flags: int + p_align: int +Elf32_Phdr.register_fields([('p_type', Elf32_Word, 0), ('p_offset', Elf32_Off, 4), ('p_vaddr', Elf32_Addr, 8), ('p_paddr', Elf32_Addr, 12), ('p_filesz', Elf32_Word, 16), ('p_memsz', Elf32_Word, 20), ('p_flags', Elf32_Word, 24), ('p_align', Elf32_Word, 28)]) +@c.record +class Elf64_Phdr(c.Struct): + SIZE = 56 + p_type: int + p_flags: int + p_offset: int + p_vaddr: int + p_paddr: int + p_filesz: int + p_memsz: int + p_align: int +Elf64_Phdr.register_fields([('p_type', Elf64_Word, 0), ('p_flags', Elf64_Word, 4), ('p_offset', Elf64_Off, 8), ('p_vaddr', Elf64_Addr, 16), ('p_paddr', Elf64_Addr, 24), ('p_filesz', Elf64_Xword, 32), ('p_memsz', Elf64_Xword, 40), ('p_align', Elf64_Xword, 48)]) +@c.record +class Elf32_Dyn(c.Struct): + SIZE = 8 + d_tag: int + d_un: Elf32_Dyn_d_un +@c.record +class Elf32_Dyn_d_un(c.Struct): + SIZE = 4 + d_val: int + d_ptr: int +Elf32_Dyn_d_un.register_fields([('d_val', Elf32_Word, 0), ('d_ptr', Elf32_Addr, 0)]) +Elf32_Dyn.register_fields([('d_tag', Elf32_Sword, 0), ('d_un', Elf32_Dyn_d_un, 4)]) +@c.record +class Elf64_Dyn(c.Struct): + SIZE = 16 + d_tag: int + d_un: Elf64_Dyn_d_un +@c.record +class Elf64_Dyn_d_un(c.Struct): + SIZE = 8 + d_val: int + d_ptr: int +Elf64_Dyn_d_un.register_fields([('d_val', Elf64_Xword, 0), ('d_ptr', Elf64_Addr, 0)]) +Elf64_Dyn.register_fields([('d_tag', Elf64_Sxword, 0), ('d_un', Elf64_Dyn_d_un, 8)]) +@c.record +class Elf32_Verdef(c.Struct): + SIZE = 20 + vd_version: int + vd_flags: int + vd_ndx: int + vd_cnt: int + vd_hash: int + vd_aux: int + vd_next: int +Elf32_Verdef.register_fields([('vd_version', Elf32_Half, 0), ('vd_flags', Elf32_Half, 2), ('vd_ndx', Elf32_Half, 4), ('vd_cnt', Elf32_Half, 6), ('vd_hash', Elf32_Word, 8), ('vd_aux', Elf32_Word, 12), ('vd_next', Elf32_Word, 16)]) +@c.record +class Elf64_Verdef(c.Struct): + SIZE = 20 + vd_version: int + vd_flags: int + vd_ndx: int + vd_cnt: int + vd_hash: int + vd_aux: int + vd_next: int +Elf64_Verdef.register_fields([('vd_version', Elf64_Half, 0), ('vd_flags', Elf64_Half, 2), ('vd_ndx', Elf64_Half, 4), ('vd_cnt', Elf64_Half, 6), ('vd_hash', Elf64_Word, 8), ('vd_aux', Elf64_Word, 12), ('vd_next', Elf64_Word, 16)]) +@c.record +class Elf32_Verdaux(c.Struct): + SIZE = 8 + vda_name: int + vda_next: int +Elf32_Verdaux.register_fields([('vda_name', Elf32_Word, 0), ('vda_next', Elf32_Word, 4)]) +@c.record +class Elf64_Verdaux(c.Struct): + SIZE = 8 + vda_name: int + vda_next: int +Elf64_Verdaux.register_fields([('vda_name', Elf64_Word, 0), ('vda_next', Elf64_Word, 4)]) +@c.record +class Elf32_Verneed(c.Struct): + SIZE = 16 + vn_version: int + vn_cnt: int + vn_file: int + vn_aux: int + vn_next: int +Elf32_Verneed.register_fields([('vn_version', Elf32_Half, 0), ('vn_cnt', Elf32_Half, 2), ('vn_file', Elf32_Word, 4), ('vn_aux', Elf32_Word, 8), ('vn_next', Elf32_Word, 12)]) +@c.record +class Elf64_Verneed(c.Struct): + SIZE = 16 + vn_version: int + vn_cnt: int + vn_file: int + vn_aux: int + vn_next: int +Elf64_Verneed.register_fields([('vn_version', Elf64_Half, 0), ('vn_cnt', Elf64_Half, 2), ('vn_file', Elf64_Word, 4), ('vn_aux', Elf64_Word, 8), ('vn_next', Elf64_Word, 12)]) +@c.record +class Elf32_Vernaux(c.Struct): + SIZE = 16 + vna_hash: int + vna_flags: int + vna_other: int + vna_name: int + vna_next: int +Elf32_Vernaux.register_fields([('vna_hash', Elf32_Word, 0), ('vna_flags', Elf32_Half, 4), ('vna_other', Elf32_Half, 6), ('vna_name', Elf32_Word, 8), ('vna_next', Elf32_Word, 12)]) +@c.record +class Elf64_Vernaux(c.Struct): + SIZE = 16 + vna_hash: int + vna_flags: int + vna_other: int + vna_name: int + vna_next: int +Elf64_Vernaux.register_fields([('vna_hash', Elf64_Word, 0), ('vna_flags', Elf64_Half, 4), ('vna_other', Elf64_Half, 6), ('vna_name', Elf64_Word, 8), ('vna_next', Elf64_Word, 12)]) +@c.record +class Elf32_auxv_t(c.Struct): + SIZE = 8 + a_type: int + a_un: Elf32_auxv_t_a_un +uint32_t: TypeAlias = ctypes.c_uint32 +@c.record +class Elf32_auxv_t_a_un(c.Struct): + SIZE = 4 + a_val: int +Elf32_auxv_t_a_un.register_fields([('a_val', uint32_t, 0)]) +Elf32_auxv_t.register_fields([('a_type', uint32_t, 0), ('a_un', Elf32_auxv_t_a_un, 4)]) +@c.record +class Elf64_auxv_t(c.Struct): + SIZE = 16 + a_type: int + a_un: Elf64_auxv_t_a_un +uint64_t: TypeAlias = ctypes.c_uint64 +@c.record +class Elf64_auxv_t_a_un(c.Struct): + SIZE = 8 + a_val: int +Elf64_auxv_t_a_un.register_fields([('a_val', uint64_t, 0)]) +Elf64_auxv_t.register_fields([('a_type', uint64_t, 0), ('a_un', Elf64_auxv_t_a_un, 8)]) +@c.record +class Elf32_Nhdr(c.Struct): + SIZE = 12 + n_namesz: int + n_descsz: int + n_type: int +Elf32_Nhdr.register_fields([('n_namesz', Elf32_Word, 0), ('n_descsz', Elf32_Word, 4), ('n_type', Elf32_Word, 8)]) +@c.record +class Elf64_Nhdr(c.Struct): + SIZE = 12 + n_namesz: int + n_descsz: int + n_type: int +Elf64_Nhdr.register_fields([('n_namesz', Elf64_Word, 0), ('n_descsz', Elf64_Word, 4), ('n_type', Elf64_Word, 8)]) +@c.record +class Elf32_Move(c.Struct): + SIZE = 24 + m_value: int + m_info: int + m_poffset: int + m_repeat: int + m_stride: int +Elf32_Move.register_fields([('m_value', Elf32_Xword, 0), ('m_info', Elf32_Word, 8), ('m_poffset', Elf32_Word, 12), ('m_repeat', Elf32_Half, 16), ('m_stride', Elf32_Half, 18)]) +@c.record +class Elf64_Move(c.Struct): + SIZE = 32 + m_value: int + m_info: int + m_poffset: int + m_repeat: int + m_stride: int +Elf64_Move.register_fields([('m_value', Elf64_Xword, 0), ('m_info', Elf64_Xword, 8), ('m_poffset', Elf64_Xword, 16), ('m_repeat', Elf64_Half, 24), ('m_stride', Elf64_Half, 26)]) +@c.record +class Elf32_gptab(c.Struct): + SIZE = 8 + gt_header: Elf32_gptab_gt_header + gt_entry: Elf32_gptab_gt_entry +@c.record +class Elf32_gptab_gt_header(c.Struct): + SIZE = 8 + gt_current_g_value: int + gt_unused: int +Elf32_gptab_gt_header.register_fields([('gt_current_g_value', Elf32_Word, 0), ('gt_unused', Elf32_Word, 4)]) +@c.record +class Elf32_gptab_gt_entry(c.Struct): + SIZE = 8 + gt_g_value: int + gt_bytes: int +Elf32_gptab_gt_entry.register_fields([('gt_g_value', Elf32_Word, 0), ('gt_bytes', Elf32_Word, 4)]) +Elf32_gptab.register_fields([('gt_header', Elf32_gptab_gt_header, 0), ('gt_entry', Elf32_gptab_gt_entry, 0)]) +@c.record +class Elf32_RegInfo(c.Struct): + SIZE = 24 + ri_gprmask: int + ri_cprmask: c.Array[ctypes.c_uint32, Literal[4]] + ri_gp_value: int +Elf32_RegInfo.register_fields([('ri_gprmask', Elf32_Word, 0), ('ri_cprmask', c.Array[Elf32_Word, Literal[4]], 4), ('ri_gp_value', Elf32_Sword, 20)]) +@c.record +class Elf_Options(c.Struct): + SIZE = 8 + kind: int + size: int + section: int + info: int +Elf_Options.register_fields([('kind', ctypes.c_ubyte, 0), ('size', ctypes.c_ubyte, 1), ('section', Elf32_Section, 2), ('info', Elf32_Word, 4)]) +@c.record +class Elf_Options_Hw(c.Struct): + SIZE = 8 + hwp_flags1: int + hwp_flags2: int +Elf_Options_Hw.register_fields([('hwp_flags1', Elf32_Word, 0), ('hwp_flags2', Elf32_Word, 4)]) +@c.record +class Elf32_Lib(c.Struct): + SIZE = 20 + l_name: int + l_time_stamp: int + l_checksum: int + l_version: int + l_flags: int +Elf32_Lib.register_fields([('l_name', Elf32_Word, 0), ('l_time_stamp', Elf32_Word, 4), ('l_checksum', Elf32_Word, 8), ('l_version', Elf32_Word, 12), ('l_flags', Elf32_Word, 16)]) +@c.record +class Elf64_Lib(c.Struct): + SIZE = 20 + l_name: int + l_time_stamp: int + l_checksum: int + l_version: int + l_flags: int +Elf64_Lib.register_fields([('l_name', Elf64_Word, 0), ('l_time_stamp', Elf64_Word, 4), ('l_checksum', Elf64_Word, 8), ('l_version', Elf64_Word, 12), ('l_flags', Elf64_Word, 16)]) +Elf32_Conflict: TypeAlias = ctypes.c_uint32 +@c.record +class Elf_MIPS_ABIFlags_v0(c.Struct): + SIZE = 24 + version: int + isa_level: int + isa_rev: int + gpr_size: int + cpr1_size: int + cpr2_size: int + fp_abi: int + isa_ext: int + ases: int + flags1: int + flags2: int +Elf_MIPS_ABIFlags_v0.register_fields([('version', Elf32_Half, 0), ('isa_level', ctypes.c_ubyte, 2), ('isa_rev', ctypes.c_ubyte, 3), ('gpr_size', ctypes.c_ubyte, 4), ('cpr1_size', ctypes.c_ubyte, 5), ('cpr2_size', ctypes.c_ubyte, 6), ('fp_abi', ctypes.c_ubyte, 7), ('isa_ext', Elf32_Word, 8), ('ases', Elf32_Word, 12), ('flags1', Elf32_Word, 16), ('flags2', Elf32_Word, 20)]) +_anonenum0: dict[int, str] = {(Val_GNU_MIPS_ABI_FP_ANY:=0): 'Val_GNU_MIPS_ABI_FP_ANY', (Val_GNU_MIPS_ABI_FP_DOUBLE:=1): 'Val_GNU_MIPS_ABI_FP_DOUBLE', (Val_GNU_MIPS_ABI_FP_SINGLE:=2): 'Val_GNU_MIPS_ABI_FP_SINGLE', (Val_GNU_MIPS_ABI_FP_SOFT:=3): 'Val_GNU_MIPS_ABI_FP_SOFT', (Val_GNU_MIPS_ABI_FP_OLD_64:=4): 'Val_GNU_MIPS_ABI_FP_OLD_64', (Val_GNU_MIPS_ABI_FP_XX:=5): 'Val_GNU_MIPS_ABI_FP_XX', (Val_GNU_MIPS_ABI_FP_64:=6): 'Val_GNU_MIPS_ABI_FP_64', (Val_GNU_MIPS_ABI_FP_64A:=7): 'Val_GNU_MIPS_ABI_FP_64A', (Val_GNU_MIPS_ABI_FP_MAX:=7): 'Val_GNU_MIPS_ABI_FP_MAX'} +ssize_t: TypeAlias = ctypes.c_int64 +gid_t: TypeAlias = ctypes.c_uint32 +uid_t: TypeAlias = ctypes.c_uint32 +off64_t: TypeAlias = ctypes.c_int64 +useconds_t: TypeAlias = ctypes.c_uint32 +pid_t: TypeAlias = ctypes.c_int32 +intptr_t: TypeAlias = ctypes.c_int64 +socklen_t: TypeAlias = ctypes.c_uint32 +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32) +def access(__name:c.POINTER[ctypes.c_char], __type:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32) +def euidaccess(__name:c.POINTER[ctypes.c_char], __type:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32) +def eaccess(__name:c.POINTER[ctypes.c_char], __type:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], c.Array[c.POINTER[ctypes.c_char], Literal[0]], c.Array[c.POINTER[ctypes.c_char], Literal[0]], ctypes.c_int32) +def execveat(__fd:int, __path:c.POINTER[ctypes.c_char], __argv:c.Array[c.POINTER[ctypes.c_char], Literal[0]], __envp:c.Array[c.POINTER[ctypes.c_char], Literal[0]], __flags:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32, ctypes.c_int32) +def faccessat(__fd:int, __file:c.POINTER[ctypes.c_char], __type:int, __flag:int) -> int: ... +@dll.bind(ctypes.c_int64, ctypes.c_int32, ctypes.c_int64, ctypes.c_int32) +def lseek(__fd:int, __offset:ctypes.c_int64, __whence:int) -> ctypes.c_int64: ... +@dll.bind(ctypes.c_int64, ctypes.c_int32, ctypes.c_int64, ctypes.c_int32) +def lseek64(__fd:int, __offset:ctypes.c_int64, __whence:int) -> ctypes.c_int64: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def close(__fd:int) -> int: ... +@dll.bind(None, ctypes.c_int32) +def closefrom(__lowfd:int) -> None: ... +@dll.bind(ssize_t, ctypes.c_int32, ctypes.c_void_p, size_t) +def read(__fd:int, __buf:ctypes.c_void_p, __nbytes:size_t) -> ssize_t: ... +@dll.bind(ssize_t, ctypes.c_int32, ctypes.c_void_p, size_t) +def write(__fd:int, __buf:ctypes.c_void_p, __n:size_t) -> ssize_t: ... +@dll.bind(ssize_t, ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int64) +def pread(__fd:int, __buf:ctypes.c_void_p, __nbytes:size_t, __offset:ctypes.c_int64) -> ssize_t: ... +@dll.bind(ssize_t, ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int64) +def pwrite(__fd:int, __buf:ctypes.c_void_p, __n:size_t, __offset:ctypes.c_int64) -> ssize_t: ... +@dll.bind(ssize_t, ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int64) +def pread64(__fd:int, __buf:ctypes.c_void_p, __nbytes:size_t, __offset:ctypes.c_int64) -> ssize_t: ... +@dll.bind(ssize_t, ctypes.c_int32, ctypes.c_void_p, size_t, ctypes.c_int64) +def pwrite64(__fd:int, __buf:ctypes.c_void_p, __n:size_t, __offset:ctypes.c_int64) -> ssize_t: ... +@dll.bind(ctypes.c_int32, c.Array[ctypes.c_int32, Literal[2]]) +def pipe(__pipedes:c.Array[ctypes.c_int32, Literal[2]]) -> int: ... +@dll.bind(ctypes.c_int32, c.Array[ctypes.c_int32, Literal[2]], ctypes.c_int32) +def pipe2(__pipedes:c.Array[ctypes.c_int32, Literal[2]], __flags:int) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def alarm(__seconds:int) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def sleep(__seconds:int) -> int: ... +__useconds_t: TypeAlias = ctypes.c_uint32 +@dll.bind(ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32) +def ualarm(__value:ctypes.c_uint32, __interval:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32) +def usleep(__useconds:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32) +def pause() -> int: ... +__uid_t: TypeAlias = ctypes.c_uint32 +__gid_t: TypeAlias = ctypes.c_uint32 +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_uint32, ctypes.c_uint32) +def chown(__file:c.POINTER[ctypes.c_char], __owner:ctypes.c_uint32, __group:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_uint32, ctypes.c_uint32) +def fchown(__fd:int, __owner:ctypes.c_uint32, __group:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_uint32, ctypes.c_uint32) +def lchown(__file:c.POINTER[ctypes.c_char], __owner:ctypes.c_uint32, __group:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_int32) +def fchownat(__fd:int, __file:c.POINTER[ctypes.c_char], __owner:ctypes.c_uint32, __group:ctypes.c_uint32, __flag:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def chdir(__path:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def fchdir(__fd:int) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def getcwd(__buf:c.POINTER[ctypes.c_char], __size:size_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char]) +def get_current_dir_name() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def getwd(__buf:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def dup(__fd:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int32) +def dup2(__fd:int, __fd2:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32) +def dup3(__fd:int, __fd2:int, __flags:int) -> int: ... +try: __environ = c.POINTER[c.POINTER[ctypes.c_char]].in_dll(dll, '__environ') # type: ignore +except (ValueError,AttributeError): pass +try: environ = c.POINTER[c.POINTER[ctypes.c_char]].in_dll(dll, 'environ') # type: ignore +except (ValueError,AttributeError): pass +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.Array[c.POINTER[ctypes.c_char], Literal[0]], c.Array[c.POINTER[ctypes.c_char], Literal[0]]) +def execve(__path:c.POINTER[ctypes.c_char], __argv:c.Array[c.POINTER[ctypes.c_char], Literal[0]], __envp:c.Array[c.POINTER[ctypes.c_char], Literal[0]]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.Array[c.POINTER[ctypes.c_char], Literal[0]], c.Array[c.POINTER[ctypes.c_char], Literal[0]]) +def fexecve(__fd:int, __argv:c.Array[c.POINTER[ctypes.c_char], Literal[0]], __envp:c.Array[c.POINTER[ctypes.c_char], Literal[0]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.Array[c.POINTER[ctypes.c_char], Literal[0]]) +def execv(__path:c.POINTER[ctypes.c_char], __argv:c.Array[c.POINTER[ctypes.c_char], Literal[0]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def execle(__path:c.POINTER[ctypes.c_char], __arg:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def execl(__path:c.POINTER[ctypes.c_char], __arg:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.Array[c.POINTER[ctypes.c_char], Literal[0]]) +def execvp(__file:c.POINTER[ctypes.c_char], __argv:c.Array[c.POINTER[ctypes.c_char], Literal[0]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def execlp(__file:c.POINTER[ctypes.c_char], __arg:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.Array[c.POINTER[ctypes.c_char], Literal[0]], c.Array[c.POINTER[ctypes.c_char], Literal[0]]) +def execvpe(__file:c.POINTER[ctypes.c_char], __argv:c.Array[c.POINTER[ctypes.c_char], Literal[0]], __envp:c.Array[c.POINTER[ctypes.c_char], Literal[0]]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def nice(__inc:int) -> int: ... +@dll.bind(None, ctypes.c_int32) +def _exit(__status:int) -> None: ... +@dll.bind(ctypes.c_int64, c.POINTER[ctypes.c_char], ctypes.c_int32) +def pathconf(__path:c.POINTER[ctypes.c_char], __name:int) -> int: ... +@dll.bind(ctypes.c_int64, ctypes.c_int32, ctypes.c_int32) +def fpathconf(__fd:int, __name:int) -> int: ... +@dll.bind(ctypes.c_int64, ctypes.c_int32) +def sysconf(__name:int) -> int: ... +@dll.bind(size_t, ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def confstr(__name:int, __buf:c.POINTER[ctypes.c_char], __len:size_t) -> size_t: ... +__pid_t: TypeAlias = ctypes.c_int32 +@dll.bind(ctypes.c_int32) +def getpid() -> ctypes.c_int32: ... +@dll.bind(ctypes.c_int32) +def getppid() -> ctypes.c_int32: ... +@dll.bind(ctypes.c_int32) +def getpgrp() -> ctypes.c_int32: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def __getpgid(__pid:ctypes.c_int32) -> ctypes.c_int32: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def getpgid(__pid:ctypes.c_int32) -> ctypes.c_int32: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int32) +def setpgid(__pid:ctypes.c_int32, __pgid:ctypes.c_int32) -> int: ... +@dll.bind(ctypes.c_int32) +def setpgrp() -> int: ... +@dll.bind(ctypes.c_int32) +def setsid() -> ctypes.c_int32: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def getsid(__pid:ctypes.c_int32) -> ctypes.c_int32: ... +@dll.bind(ctypes.c_uint32) +def getuid() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def geteuid() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def getgid() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32) +def getegid() -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.Array[ctypes.c_uint32, Literal[0]]) +def getgroups(__size:int, __list:c.Array[ctypes.c_uint32, Literal[0]]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32) +def group_member(__gid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32) +def setuid(__uid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32, ctypes.c_uint32) +def setreuid(__ruid:ctypes.c_uint32, __euid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32) +def seteuid(__uid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32) +def setgid(__gid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32, ctypes.c_uint32) +def setregid(__rgid:ctypes.c_uint32, __egid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32) +def setegid(__gid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def getresuid(__ruid:c.POINTER[ctypes.c_uint32], __euid:c.POINTER[ctypes.c_uint32], __suid:c.POINTER[ctypes.c_uint32]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def getresgid(__rgid:c.POINTER[ctypes.c_uint32], __egid:c.POINTER[ctypes.c_uint32], __sgid:c.POINTER[ctypes.c_uint32]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32) +def setresuid(__ruid:ctypes.c_uint32, __euid:ctypes.c_uint32, __suid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32) +def setresgid(__rgid:ctypes.c_uint32, __egid:ctypes.c_uint32, __sgid:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_int32) +def fork() -> ctypes.c_int32: ... +@dll.bind(ctypes.c_int32) +def vfork() -> int: ... +@dll.bind(ctypes.c_int32) +def _Fork() -> ctypes.c_int32: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def ttyname(__fd:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def ttyname_r(__fd:int, __buf:c.POINTER[ctypes.c_char], __buflen:size_t) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def isatty(__fd:int) -> int: ... +@dll.bind(ctypes.c_int32) +def ttyslot() -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def link(__from:c.POINTER[ctypes.c_char], __to:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32) +def linkat(__fromfd:int, __from:c.POINTER[ctypes.c_char], __tofd:int, __to:c.POINTER[ctypes.c_char], __flags:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def symlink(__from:c.POINTER[ctypes.c_char], __to:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ssize_t, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def readlink(__path:c.POINTER[ctypes.c_char], __buf:c.POINTER[ctypes.c_char], __len:size_t) -> ssize_t: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[ctypes.c_char]) +def symlinkat(__from:c.POINTER[ctypes.c_char], __tofd:int, __to:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ssize_t, ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], size_t) +def readlinkat(__fd:int, __path:c.POINTER[ctypes.c_char], __buf:c.POINTER[ctypes.c_char], __len:size_t) -> ssize_t: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def unlink(__name:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32) +def unlinkat(__fd:int, __name:c.POINTER[ctypes.c_char], __flag:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def rmdir(__path:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def tcgetpgrp(__fd:int) -> ctypes.c_int32: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int32) +def tcsetpgrp(__fd:int, __pgrp_id:ctypes.c_int32) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char]) +def getlogin() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def getlogin_r(__name:c.POINTER[ctypes.c_char], __name_len:size_t) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def setlogin(__name:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def getopt(___argc:int, ___argv:c.POINTER[c.POINTER[ctypes.c_char]], __shortopts:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def gethostname(__name:c.POINTER[ctypes.c_char], __len:size_t) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def sethostname(__name:c.POINTER[ctypes.c_char], __len:size_t) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int64) +def sethostid(__id:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def getdomainname(__name:c.POINTER[ctypes.c_char], __len:size_t) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def setdomainname(__name:c.POINTER[ctypes.c_char], __len:size_t) -> int: ... +@dll.bind(ctypes.c_int32) +def vhangup() -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def revoke(__file:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_uint16], size_t, size_t, ctypes.c_uint32) +def profil(__sample_buffer:c.POINTER[ctypes.c_uint16], __size:size_t, __offset:size_t, __scale:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def acct(__name:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char]) +def getusershell() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None) +def endusershell() -> None: ... +@dll.bind(None) +def setusershell() -> None: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int32) +def daemon(__nochdir:int, __noclose:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def chroot(__path:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def getpass(__prompt:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def fsync(__fd:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def syncfs(__fd:int) -> int: ... +@dll.bind(ctypes.c_int64) +def gethostid() -> int: ... +@dll.bind(None) +def sync() -> None: ... +@dll.bind(ctypes.c_int32) +def getpagesize() -> int: ... +@dll.bind(ctypes.c_int32) +def getdtablesize() -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int64) +def truncate(__file:c.POINTER[ctypes.c_char], __length:ctypes.c_int64) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int64) +def truncate64(__file:c.POINTER[ctypes.c_char], __length:ctypes.c_int64) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int64) +def ftruncate(__fd:int, __length:ctypes.c_int64) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int64) +def ftruncate64(__fd:int, __length:ctypes.c_int64) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p) +def brk(__addr:ctypes.c_void_p) -> int: ... +@dll.bind(ctypes.c_void_p, intptr_t) +def sbrk(__delta:intptr_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_int64, ctypes.c_int64) +def syscall(__sysno:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int64) +def lockf(__fd:int, __cmd:int, __len:ctypes.c_int64) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int64) +def lockf64(__fd:int, __cmd:int, __len:ctypes.c_int64) -> int: ... +@dll.bind(ssize_t, ctypes.c_int32, c.POINTER[ctypes.c_int64], ctypes.c_int32, c.POINTER[ctypes.c_int64], size_t, ctypes.c_uint32) +def copy_file_range(__infd:int, __pinoff:c.POINTER[ctypes.c_int64], __outfd:int, __poutoff:c.POINTER[ctypes.c_int64], __length:size_t, __flags:int) -> ssize_t: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def fdatasync(__fildes:int) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def crypt(__key:c.POINTER[ctypes.c_char], __salt:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, ctypes.c_void_p, ctypes.c_void_p, ssize_t) +def swab(__from:ctypes.c_void_p, __to:ctypes.c_void_p, __n:ssize_t) -> None: ... +@dll.bind(ctypes.c_int32, ctypes.c_void_p, size_t) +def getentropy(__buffer:ctypes.c_void_p, __length:size_t) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_int32) +def close_range(__fd:int, __max_fd:int, __flags:int) -> int: ... +@dll.bind(ctypes.c_int32) +def gettid() -> ctypes.c_int32: ... +@c.record +class struct___va_list_tag(c.Struct): + SIZE = 24 + gp_offset: int + fp_offset: int + overflow_arg_area: ctypes.c_void_p + reg_save_area: ctypes.c_void_p +struct___va_list_tag.register_fields([('gp_offset', ctypes.c_uint32, 0), ('fp_offset', ctypes.c_uint32, 4), ('overflow_arg_area', ctypes.c_void_p, 8), ('reg_save_area', ctypes.c_void_p, 16)]) +va_list: TypeAlias = c.Array[struct___va_list_tag, Literal[1]] +@c.record +class struct__G_fpos_t(c.Struct): + SIZE = 16 + __pos: int + __state: __mbstate_t +fpos_t: TypeAlias = struct__G_fpos_t +@c.record +class __mbstate_t(c.Struct): + SIZE = 8 + __count: int + __value: __mbstate_t___value +@c.record +class __mbstate_t___value(c.Struct): + SIZE = 4 + __wch: int + __wchb: c.Array[ctypes.c_char, Literal[4]] +__mbstate_t___value.register_fields([('__wch', ctypes.c_uint32, 0), ('__wchb', c.Array[ctypes.c_char, Literal[4]], 0)]) +__mbstate_t.register_fields([('__count', ctypes.c_int32, 0), ('__value', __mbstate_t___value, 4)]) +struct__G_fpos_t.register_fields([('__pos', ctypes.c_int64, 0), ('__state', __mbstate_t, 8)]) +@c.record +class struct__G_fpos64_t(c.Struct): + SIZE = 16 + __pos: int + __state: __mbstate_t +fpos64_t: TypeAlias = struct__G_fpos64_t +struct__G_fpos64_t.register_fields([('__pos', ctypes.c_int64, 0), ('__state', __mbstate_t, 8)]) +@c.record +class struct__IO_FILE(c.Struct): + SIZE = 216 + _flags: int + _IO_read_ptr: c.POINTER[ctypes.c_char] + _IO_read_end: c.POINTER[ctypes.c_char] + _IO_read_base: c.POINTER[ctypes.c_char] + _IO_write_base: c.POINTER[ctypes.c_char] + _IO_write_ptr: c.POINTER[ctypes.c_char] + _IO_write_end: c.POINTER[ctypes.c_char] + _IO_buf_base: c.POINTER[ctypes.c_char] + _IO_buf_end: c.POINTER[ctypes.c_char] + _IO_save_base: c.POINTER[ctypes.c_char] + _IO_backup_base: c.POINTER[ctypes.c_char] + _IO_save_end: c.POINTER[ctypes.c_char] + _markers: c.POINTER[struct__IO_marker] + _chain: c.POINTER[struct__IO_FILE] + _fileno: int + _flags2: int + _old_offset: int + _cur_column: int + _vtable_offset: int + _shortbuf: c.Array[ctypes.c_char, Literal[1]] + _lock: ctypes.c_void_p + _offset: int + _codecvt: c.POINTER[struct__IO_codecvt] + _wide_data: c.POINTER[struct__IO_wide_data] + _freeres_list: c.POINTER[struct__IO_FILE] + _freeres_buf: ctypes.c_void_p + __pad5: int + _mode: int + _unused2: c.Array[ctypes.c_char, Literal[20]] +FILE: TypeAlias = struct__IO_FILE +class struct__IO_marker(c.Struct): pass +_IO_lock_t: TypeAlias = None +class struct__IO_codecvt(c.Struct): pass +class struct__IO_wide_data(c.Struct): pass +struct__IO_FILE.register_fields([('_flags', ctypes.c_int32, 0), ('_IO_read_ptr', c.POINTER[ctypes.c_char], 8), ('_IO_read_end', c.POINTER[ctypes.c_char], 16), ('_IO_read_base', c.POINTER[ctypes.c_char], 24), ('_IO_write_base', c.POINTER[ctypes.c_char], 32), ('_IO_write_ptr', c.POINTER[ctypes.c_char], 40), ('_IO_write_end', c.POINTER[ctypes.c_char], 48), ('_IO_buf_base', c.POINTER[ctypes.c_char], 56), ('_IO_buf_end', c.POINTER[ctypes.c_char], 64), ('_IO_save_base', c.POINTER[ctypes.c_char], 72), ('_IO_backup_base', c.POINTER[ctypes.c_char], 80), ('_IO_save_end', c.POINTER[ctypes.c_char], 88), ('_markers', c.POINTER[struct__IO_marker], 96), ('_chain', c.POINTER[struct__IO_FILE], 104), ('_fileno', ctypes.c_int32, 112), ('_flags2', ctypes.c_int32, 116), ('_old_offset', ctypes.c_int64, 120), ('_cur_column', ctypes.c_uint16, 128), ('_vtable_offset', ctypes.c_byte, 130), ('_shortbuf', c.Array[ctypes.c_char, Literal[1]], 131), ('_lock', c.POINTER[_IO_lock_t], 136), ('_offset', ctypes.c_int64, 144), ('_codecvt', c.POINTER[struct__IO_codecvt], 152), ('_wide_data', c.POINTER[struct__IO_wide_data], 160), ('_freeres_list', c.POINTER[struct__IO_FILE], 168), ('_freeres_buf', ctypes.c_void_p, 176), ('__pad5', size_t, 184), ('_mode', ctypes.c_int32, 192), ('_unused2', c.Array[ctypes.c_char, Literal[20]], 196)]) +try: stdin = c.POINTER[FILE].in_dll(dll, 'stdin') # type: ignore +except (ValueError,AttributeError): pass +try: stdout = c.POINTER[FILE].in_dll(dll, 'stdout') # type: ignore +except (ValueError,AttributeError): pass +try: stderr = c.POINTER[FILE].in_dll(dll, 'stderr') # type: ignore +except (ValueError,AttributeError): pass +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def remove(__filename:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def rename(__old:c.POINTER[ctypes.c_char], __new:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[ctypes.c_char]) +def renameat(__oldfd:int, __old:c.POINTER[ctypes.c_char], __newfd:int, __new:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def renameat2(__oldfd:int, __old:c.POINTER[ctypes.c_char], __newfd:int, __new:c.POINTER[ctypes.c_char], __flags:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def fclose(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(c.POINTER[FILE]) +def tmpfile() -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[FILE]) +def tmpfile64() -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.Array[ctypes.c_char, Literal[20]]) +def tmpnam(_0:c.Array[ctypes.c_char, Literal[20]]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.Array[ctypes.c_char, Literal[20]]) +def tmpnam_r(__s:c.Array[ctypes.c_char, Literal[20]]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def tempnam(__dir:c.POINTER[ctypes.c_char], __pfx:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def fflush(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def fflush_unlocked(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32) +def fcloseall() -> int: ... +@dll.bind(c.POINTER[FILE], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def fopen(__filename:c.POINTER[ctypes.c_char], __modes:c.POINTER[ctypes.c_char]) -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[FILE], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[FILE]) +def freopen(__filename:c.POINTER[ctypes.c_char], __modes:c.POINTER[ctypes.c_char], __stream:c.POINTER[FILE]) -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[FILE], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def fopen64(__filename:c.POINTER[ctypes.c_char], __modes:c.POINTER[ctypes.c_char]) -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[FILE], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[FILE]) +def freopen64(__filename:c.POINTER[ctypes.c_char], __modes:c.POINTER[ctypes.c_char], __stream:c.POINTER[FILE]) -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[FILE], ctypes.c_int32, c.POINTER[ctypes.c_char]) +def fdopen(__fd:int, __modes:c.POINTER[ctypes.c_char]) -> c.POINTER[FILE]: ... +@c.record +class struct__IO_cookie_io_functions_t(c.Struct): + SIZE = 32 + read: c.CFUNCTYPE[ctypes.c_int64, [ctypes.c_void_p, c.POINTER[ctypes.c_char], ctypes.c_uint64]] + write: c.CFUNCTYPE[ctypes.c_int64, [ctypes.c_void_p, c.POINTER[ctypes.c_char], ctypes.c_uint64]] + seek: c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, c.POINTER[ctypes.c_int64], ctypes.c_int32]] + close: c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p]] +cookie_io_functions_t: TypeAlias = struct__IO_cookie_io_functions_t +cookie_read_function_t: TypeAlias = c.CFUNCTYPE[ctypes.c_int64, [ctypes.c_void_p, c.POINTER[ctypes.c_char], ctypes.c_uint64]] +cookie_write_function_t: TypeAlias = c.CFUNCTYPE[ctypes.c_int64, [ctypes.c_void_p, c.POINTER[ctypes.c_char], ctypes.c_uint64]] +cookie_seek_function_t: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, c.POINTER[ctypes.c_int64], ctypes.c_int32]] +cookie_close_function_t: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p]] +struct__IO_cookie_io_functions_t.register_fields([('read', c.POINTER[cookie_read_function_t], 0), ('write', c.POINTER[cookie_write_function_t], 8), ('seek', c.POINTER[cookie_seek_function_t], 16), ('close', c.POINTER[cookie_close_function_t], 24)]) +@dll.bind(c.POINTER[FILE], ctypes.c_void_p, c.POINTER[ctypes.c_char], cookie_io_functions_t) +def fopencookie(__magic_cookie:ctypes.c_void_p, __modes:c.POINTER[ctypes.c_char], __io_funcs:cookie_io_functions_t) -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[FILE], ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char]) +def fmemopen(__s:ctypes.c_void_p, __len:size_t, __modes:c.POINTER[ctypes.c_char]) -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[FILE], c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t]) +def open_memstream(__bufloc:c.POINTER[c.POINTER[ctypes.c_char]], __sizeloc:c.POINTER[size_t]) -> c.POINTER[FILE]: ... +@dll.bind(None, c.POINTER[FILE], c.POINTER[ctypes.c_char]) +def setbuf(__stream:c.POINTER[FILE], __buf:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[ctypes.c_char], ctypes.c_int32, size_t) +def setvbuf(__stream:c.POINTER[FILE], __buf:c.POINTER[ctypes.c_char], __modes:int, __n:size_t) -> int: ... +@dll.bind(None, c.POINTER[FILE], c.POINTER[ctypes.c_char], size_t) +def setbuffer(__stream:c.POINTER[FILE], __buf:c.POINTER[ctypes.c_char], __size:size_t) -> None: ... +@dll.bind(None, c.POINTER[FILE]) +def setlinebuf(__stream:c.POINTER[FILE]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[ctypes.c_char]) +def fprintf(__stream:c.POINTER[FILE], __format:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def printf(__format:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def sprintf(__s:c.POINTER[ctypes.c_char], __format:c.POINTER[ctypes.c_char]) -> int: ... +__gnuc_va_list: TypeAlias = c.Array[struct___va_list_tag, Literal[1]] +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vfprintf(__s:c.POINTER[FILE], __format:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vprintf(__format:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vsprintf(__s:c.POINTER[ctypes.c_char], __format:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char]) +def snprintf(__s:c.POINTER[ctypes.c_char], __maxlen:size_t, __format:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vsnprintf(__s:c.POINTER[ctypes.c_char], __maxlen:size_t, __format:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vasprintf(__ptr:c.POINTER[c.POINTER[ctypes.c_char]], __f:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def __asprintf(__ptr:c.POINTER[c.POINTER[ctypes.c_char]], __fmt:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def asprintf(__ptr:c.POINTER[c.POINTER[ctypes.c_char]], __fmt:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vdprintf(__fd:int, __fmt:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[ctypes.c_char]) +def dprintf(__fd:int, __fmt:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[ctypes.c_char]) +def fscanf(__stream:c.POINTER[FILE], __format:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def scanf(__format:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def sscanf(__s:c.POINTER[ctypes.c_char], __format:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vfscanf(__s:c.POINTER[FILE], __format:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vscanf(__format:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def vsscanf(__s:c.POINTER[ctypes.c_char], __format:c.POINTER[ctypes.c_char], __arg:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def fgetc(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def getc(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32) +def getchar() -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def getc_unlocked(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32) +def getchar_unlocked() -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def fgetc_unlocked(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[FILE]) +def fputc(__c:int, __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[FILE]) +def putc(__c:int, __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def putchar(__c:int) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[FILE]) +def fputc_unlocked(__c:int, __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[FILE]) +def putc_unlocked(__c:int, __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32) +def putchar_unlocked(__c:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def getw(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[FILE]) +def putw(__w:int, __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[FILE]) +def fgets(__s:c.POINTER[ctypes.c_char], __n:int, __stream:c.POINTER[FILE]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[FILE]) +def fgets_unlocked(__s:c.POINTER[ctypes.c_char], __n:int, __stream:c.POINTER[FILE]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int64, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t], ctypes.c_int32, c.POINTER[FILE]) +def __getdelim(__lineptr:c.POINTER[c.POINTER[ctypes.c_char]], __n:c.POINTER[size_t], __delimiter:int, __stream:c.POINTER[FILE]) -> ctypes.c_int64: ... +@dll.bind(ctypes.c_int64, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t], ctypes.c_int32, c.POINTER[FILE]) +def getdelim(__lineptr:c.POINTER[c.POINTER[ctypes.c_char]], __n:c.POINTER[size_t], __delimiter:int, __stream:c.POINTER[FILE]) -> ctypes.c_int64: ... +@dll.bind(ctypes.c_int64, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t], c.POINTER[FILE]) +def getline(__lineptr:c.POINTER[c.POINTER[ctypes.c_char]], __n:c.POINTER[size_t], __stream:c.POINTER[FILE]) -> ctypes.c_int64: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[FILE]) +def fputs(__s:c.POINTER[ctypes.c_char], __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def puts(__s:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[FILE]) +def ungetc(__c:int, __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_uint64, ctypes.c_void_p, size_t, size_t, c.POINTER[FILE]) +def fread(__ptr:ctypes.c_void_p, __size:size_t, __n:size_t, __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_uint64, ctypes.c_void_p, size_t, size_t, c.POINTER[FILE]) +def fwrite(__ptr:ctypes.c_void_p, __size:size_t, __n:size_t, __s:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char], c.POINTER[FILE]) +def fputs_unlocked(__s:c.POINTER[ctypes.c_char], __stream:c.POINTER[FILE]) -> int: ... +@dll.bind(size_t, ctypes.c_void_p, size_t, size_t, c.POINTER[FILE]) +def fread_unlocked(__ptr:ctypes.c_void_p, __size:size_t, __n:size_t, __stream:c.POINTER[FILE]) -> size_t: ... +@dll.bind(size_t, ctypes.c_void_p, size_t, size_t, c.POINTER[FILE]) +def fwrite_unlocked(__ptr:ctypes.c_void_p, __size:size_t, __n:size_t, __stream:c.POINTER[FILE]) -> size_t: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], ctypes.c_int64, ctypes.c_int32) +def fseek(__stream:c.POINTER[FILE], __off:int, __whence:int) -> int: ... +@dll.bind(ctypes.c_int64, c.POINTER[FILE]) +def ftell(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(None, c.POINTER[FILE]) +def rewind(__stream:c.POINTER[FILE]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], ctypes.c_int64, ctypes.c_int32) +def fseeko(__stream:c.POINTER[FILE], __off:ctypes.c_int64, __whence:int) -> int: ... +@dll.bind(ctypes.c_int64, c.POINTER[FILE]) +def ftello(__stream:c.POINTER[FILE]) -> ctypes.c_int64: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[fpos_t]) +def fgetpos(__stream:c.POINTER[FILE], __pos:c.POINTER[fpos_t]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[fpos_t]) +def fsetpos(__stream:c.POINTER[FILE], __pos:c.POINTER[fpos_t]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], ctypes.c_int64, ctypes.c_int32) +def fseeko64(__stream:c.POINTER[FILE], __off:ctypes.c_int64, __whence:int) -> int: ... +@dll.bind(ctypes.c_int64, c.POINTER[FILE]) +def ftello64(__stream:c.POINTER[FILE]) -> ctypes.c_int64: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[fpos64_t]) +def fgetpos64(__stream:c.POINTER[FILE], __pos:c.POINTER[fpos64_t]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], c.POINTER[fpos64_t]) +def fsetpos64(__stream:c.POINTER[FILE], __pos:c.POINTER[fpos64_t]) -> int: ... +@dll.bind(None, c.POINTER[FILE]) +def clearerr(__stream:c.POINTER[FILE]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def feof(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def ferror(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(None, c.POINTER[FILE]) +def clearerr_unlocked(__stream:c.POINTER[FILE]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def feof_unlocked(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def ferror_unlocked(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(None, c.POINTER[ctypes.c_char]) +def perror(__s:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def fileno(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def fileno_unlocked(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def pclose(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(c.POINTER[FILE], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def popen(__command:c.POINTER[ctypes.c_char], __modes:c.POINTER[ctypes.c_char]) -> c.POINTER[FILE]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def ctermid(__s:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def cuserid(__s:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +class struct_obstack(c.Struct): pass +@dll.bind(ctypes.c_int32, c.POINTER[struct_obstack], c.POINTER[ctypes.c_char]) +def obstack_printf(__obstack:c.POINTER[struct_obstack], __format:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[struct_obstack], c.POINTER[ctypes.c_char], c.Array[struct___va_list_tag, Literal[1]]) +def obstack_vprintf(__obstack:c.POINTER[struct_obstack], __format:c.POINTER[ctypes.c_char], __args:c.Array[struct___va_list_tag, Literal[1]]) -> int: ... +@dll.bind(None, c.POINTER[FILE]) +def flockfile(__stream:c.POINTER[FILE]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def ftrylockfile(__stream:c.POINTER[FILE]) -> int: ... +@dll.bind(None, c.POINTER[FILE]) +def funlockfile(__stream:c.POINTER[FILE]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE]) +def __uflow(_0:c.POINTER[FILE]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[FILE], ctypes.c_int32) +def __overflow(_0:c.POINTER[FILE], _1:int) -> int: ... +@c.record +class fd_set(c.Struct): + SIZE = 128 + fds_bits: c.Array[ctypes.c_int64, Literal[16]] +__fd_mask: TypeAlias = ctypes.c_int64 +fd_set.register_fields([('fds_bits', c.Array[ctypes.c_int64, Literal[16]], 0)]) +@c.record +class struct_timeval(c.Struct): + SIZE = 16 + tv_sec: int + tv_usec: int +__time_t: TypeAlias = ctypes.c_int64 +__suseconds_t: TypeAlias = ctypes.c_int64 +struct_timeval.register_fields([('tv_sec', ctypes.c_int64, 0), ('tv_usec', ctypes.c_int64, 8)]) +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[fd_set], c.POINTER[fd_set], c.POINTER[fd_set], c.POINTER[struct_timeval]) +def select(__nfds:int, __readfds:c.POINTER[fd_set], __writefds:c.POINTER[fd_set], __exceptfds:c.POINTER[fd_set], __timeout:c.POINTER[struct_timeval]) -> int: ... +@c.record +class struct_timespec(c.Struct): + SIZE = 16 + tv_sec: int + tv_nsec: int +__syscall_slong_t: TypeAlias = ctypes.c_int64 +struct_timespec.register_fields([('tv_sec', ctypes.c_int64, 0), ('tv_nsec', ctypes.c_int64, 8)]) +@c.record +class __sigset_t(c.Struct): + SIZE = 128 + __val: c.Array[ctypes.c_uint64, Literal[16]] +__sigset_t.register_fields([('__val', c.Array[ctypes.c_uint64, Literal[16]], 0)]) +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[fd_set], c.POINTER[fd_set], c.POINTER[fd_set], c.POINTER[struct_timespec], c.POINTER[__sigset_t]) +def pselect(__nfds:int, __readfds:c.POINTER[fd_set], __writefds:c.POINTER[fd_set], __exceptfds:c.POINTER[fd_set], __timeout:c.POINTER[struct_timespec], __sigmask:c.POINTER[__sigset_t]) -> int: ... +@c.record +class sem_t(c.Struct): + SIZE = 32 + __size: c.Array[ctypes.c_char, Literal[32]] + __align: int +sem_t.register_fields([('__size', c.Array[ctypes.c_char, Literal[32]], 0), ('__align', ctypes.c_int64, 0)]) +@dll.bind(ctypes.c_int32, c.POINTER[sem_t], ctypes.c_int32, ctypes.c_uint32) +def sem_init(__sem:c.POINTER[sem_t], __pshared:int, __value:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[sem_t]) +def sem_destroy(__sem:c.POINTER[sem_t]) -> int: ... +@dll.bind(c.POINTER[sem_t], c.POINTER[ctypes.c_char], ctypes.c_int32) +def sem_open(__name:c.POINTER[ctypes.c_char], __oflag:int) -> c.POINTER[sem_t]: ... +@dll.bind(ctypes.c_int32, c.POINTER[sem_t]) +def sem_close(__sem:c.POINTER[sem_t]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def sem_unlink(__name:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[sem_t]) +def sem_wait(__sem:c.POINTER[sem_t]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[sem_t], c.POINTER[struct_timespec]) +def sem_timedwait(__sem:c.POINTER[sem_t], __abstime:c.POINTER[struct_timespec]) -> int: ... +clockid_t: TypeAlias = ctypes.c_int32 +@dll.bind(ctypes.c_int32, c.POINTER[sem_t], clockid_t, c.POINTER[struct_timespec]) +def sem_clockwait(__sem:c.POINTER[sem_t], clock:clockid_t, __abstime:c.POINTER[struct_timespec]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[sem_t]) +def sem_trywait(__sem:c.POINTER[sem_t]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[sem_t]) +def sem_post(__sem:c.POINTER[sem_t]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[sem_t], c.POINTER[ctypes.c_int32]) +def sem_getvalue(__sem:c.POINTER[sem_t], __sval:c.POINTER[ctypes.c_int32]) -> int: ... +MREMAP_MAYMOVE = 1 +MREMAP_FIXED = 2 +MREMAP_DONTUNMAP = 4 +MFD_CLOEXEC = 1 +MFD_ALLOW_SEALING = 2 +MFD_HUGETLB = 4 +MFD_NOEXEC_SEAL = 8 +MFD_EXEC = 0x10 +MLOCK_ONFAULT = 1 +PKEY_DISABLE_ACCESS = 0x1 +PKEY_DISABLE_WRITE = 0x2 +_SYS_MMAN_H = 1 +_STRING_H = 1 +_ELF_H = 1 +EI_NIDENT = (16) +EI_MAG0 = 0 +ELFMAG0 = 0x7f +EI_MAG1 = 1 +ELFMAG1 = 'E' +EI_MAG2 = 2 +ELFMAG2 = 'L' +EI_MAG3 = 3 +ELFMAG3 = 'F' +ELFMAG = "\177ELF" +SELFMAG = 4 +EI_CLASS = 4 +ELFCLASSNONE = 0 +ELFCLASS32 = 1 +ELFCLASS64 = 2 +ELFCLASSNUM = 3 +EI_DATA = 5 +ELFDATANONE = 0 +ELFDATA2LSB = 1 +ELFDATA2MSB = 2 +ELFDATANUM = 3 +EI_VERSION = 6 +EI_OSABI = 7 +ELFOSABI_NONE = 0 +ELFOSABI_SYSV = 0 +ELFOSABI_HPUX = 1 +ELFOSABI_NETBSD = 2 +ELFOSABI_GNU = 3 +ELFOSABI_LINUX = ELFOSABI_GNU +ELFOSABI_SOLARIS = 6 +ELFOSABI_AIX = 7 +ELFOSABI_IRIX = 8 +ELFOSABI_FREEBSD = 9 +ELFOSABI_TRU64 = 10 +ELFOSABI_MODESTO = 11 +ELFOSABI_OPENBSD = 12 +ELFOSABI_ARM_AEABI = 64 +ELFOSABI_ARM = 97 +ELFOSABI_STANDALONE = 255 +EI_ABIVERSION = 8 +EI_PAD = 9 +ET_NONE = 0 +ET_REL = 1 +ET_EXEC = 2 +ET_DYN = 3 +ET_CORE = 4 +ET_NUM = 5 +ET_LOOS = 0xfe00 +ET_HIOS = 0xfeff +ET_LOPROC = 0xff00 +ET_HIPROC = 0xffff +EM_NONE = 0 +EM_M32 = 1 +EM_SPARC = 2 +EM_386 = 3 +EM_68K = 4 +EM_88K = 5 +EM_IAMCU = 6 +EM_860 = 7 +EM_MIPS = 8 +EM_S370 = 9 +EM_MIPS_RS3_LE = 10 +EM_PARISC = 15 +EM_VPP500 = 17 +EM_SPARC32PLUS = 18 +EM_960 = 19 +EM_PPC = 20 +EM_PPC64 = 21 +EM_S390 = 22 +EM_SPU = 23 +EM_V800 = 36 +EM_FR20 = 37 +EM_RH32 = 38 +EM_RCE = 39 +EM_ARM = 40 +EM_FAKE_ALPHA = 41 +EM_SH = 42 +EM_SPARCV9 = 43 +EM_TRICORE = 44 +EM_ARC = 45 +EM_H8_300 = 46 +EM_H8_300H = 47 +EM_H8S = 48 +EM_H8_500 = 49 +EM_IA_64 = 50 +EM_MIPS_X = 51 +EM_COLDFIRE = 52 +EM_68HC12 = 53 +EM_MMA = 54 +EM_PCP = 55 +EM_NCPU = 56 +EM_NDR1 = 57 +EM_STARCORE = 58 +EM_ME16 = 59 +EM_ST100 = 60 +EM_TINYJ = 61 +EM_X86_64 = 62 +EM_PDSP = 63 +EM_PDP10 = 64 +EM_PDP11 = 65 +EM_FX66 = 66 +EM_ST9PLUS = 67 +EM_ST7 = 68 +EM_68HC16 = 69 +EM_68HC11 = 70 +EM_68HC08 = 71 +EM_68HC05 = 72 +EM_SVX = 73 +EM_ST19 = 74 +EM_VAX = 75 +EM_CRIS = 76 +EM_JAVELIN = 77 +EM_FIREPATH = 78 +EM_ZSP = 79 +EM_MMIX = 80 +EM_HUANY = 81 +EM_PRISM = 82 +EM_AVR = 83 +EM_FR30 = 84 +EM_D10V = 85 +EM_D30V = 86 +EM_V850 = 87 +EM_M32R = 88 +EM_MN10300 = 89 +EM_MN10200 = 90 +EM_PJ = 91 +EM_OPENRISC = 92 +EM_ARC_COMPACT = 93 +EM_XTENSA = 94 +EM_VIDEOCORE = 95 +EM_TMM_GPP = 96 +EM_NS32K = 97 +EM_TPC = 98 +EM_SNP1K = 99 +EM_ST200 = 100 +EM_IP2K = 101 +EM_MAX = 102 +EM_CR = 103 +EM_F2MC16 = 104 +EM_MSP430 = 105 +EM_BLACKFIN = 106 +EM_SE_C33 = 107 +EM_SEP = 108 +EM_ARCA = 109 +EM_UNICORE = 110 +EM_EXCESS = 111 +EM_DXP = 112 +EM_ALTERA_NIOS2 = 113 +EM_CRX = 114 +EM_XGATE = 115 +EM_C166 = 116 +EM_M16C = 117 +EM_DSPIC30F = 118 +EM_CE = 119 +EM_M32C = 120 +EM_TSK3000 = 131 +EM_RS08 = 132 +EM_SHARC = 133 +EM_ECOG2 = 134 +EM_SCORE7 = 135 +EM_DSP24 = 136 +EM_VIDEOCORE3 = 137 +EM_LATTICEMICO32 = 138 +EM_SE_C17 = 139 +EM_TI_C6000 = 140 +EM_TI_C2000 = 141 +EM_TI_C5500 = 142 +EM_TI_ARP32 = 143 +EM_TI_PRU = 144 +EM_MMDSP_PLUS = 160 +EM_CYPRESS_M8C = 161 +EM_R32C = 162 +EM_TRIMEDIA = 163 +EM_QDSP6 = 164 +EM_8051 = 165 +EM_STXP7X = 166 +EM_NDS32 = 167 +EM_ECOG1X = 168 +EM_MAXQ30 = 169 +EM_XIMO16 = 170 +EM_MANIK = 171 +EM_CRAYNV2 = 172 +EM_RX = 173 +EM_METAG = 174 +EM_MCST_ELBRUS = 175 +EM_ECOG16 = 176 +EM_CR16 = 177 +EM_ETPU = 178 +EM_SLE9X = 179 +EM_L10M = 180 +EM_K10M = 181 +EM_AARCH64 = 183 +EM_AVR32 = 185 +EM_STM8 = 186 +EM_TILE64 = 187 +EM_TILEPRO = 188 +EM_MICROBLAZE = 189 +EM_CUDA = 190 +EM_TILEGX = 191 +EM_CLOUDSHIELD = 192 +EM_COREA_1ST = 193 +EM_COREA_2ND = 194 +EM_ARCV2 = 195 +EM_OPEN8 = 196 +EM_RL78 = 197 +EM_VIDEOCORE5 = 198 +EM_78KOR = 199 +EM_56800EX = 200 +EM_BA1 = 201 +EM_BA2 = 202 +EM_XCORE = 203 +EM_MCHP_PIC = 204 +EM_INTELGT = 205 +EM_KM32 = 210 +EM_KMX32 = 211 +EM_EMX16 = 212 +EM_EMX8 = 213 +EM_KVARC = 214 +EM_CDP = 215 +EM_COGE = 216 +EM_COOL = 217 +EM_NORC = 218 +EM_CSR_KALIMBA = 219 +EM_Z80 = 220 +EM_VISIUM = 221 +EM_FT32 = 222 +EM_MOXIE = 223 +EM_AMDGPU = 224 +EM_RISCV = 243 +EM_BPF = 247 +EM_CSKY = 252 +EM_LOONGARCH = 258 +EM_NUM = 259 +EM_ARC_A5 = EM_ARC_COMPACT +EM_ALPHA = 0x9026 +EV_NONE = 0 +EV_CURRENT = 1 +EV_NUM = 2 +SHN_UNDEF = 0 +SHN_LORESERVE = 0xff00 +SHN_LOPROC = 0xff00 +SHN_BEFORE = 0xff00 +SHN_AFTER = 0xff01 +SHN_HIPROC = 0xff1f +SHN_LOOS = 0xff20 +SHN_HIOS = 0xff3f +SHN_ABS = 0xfff1 +SHN_COMMON = 0xfff2 +SHN_XINDEX = 0xffff +SHN_HIRESERVE = 0xffff +SHT_NULL = 0 +SHT_PROGBITS = 1 +SHT_SYMTAB = 2 +SHT_STRTAB = 3 +SHT_RELA = 4 +SHT_HASH = 5 +SHT_DYNAMIC = 6 +SHT_NOTE = 7 +SHT_NOBITS = 8 +SHT_REL = 9 +SHT_SHLIB = 10 +SHT_DYNSYM = 11 +SHT_INIT_ARRAY = 14 +SHT_FINI_ARRAY = 15 +SHT_PREINIT_ARRAY = 16 +SHT_GROUP = 17 +SHT_SYMTAB_SHNDX = 18 +SHT_RELR = 19 +SHT_NUM = 20 +SHT_LOOS = 0x60000000 +SHT_GNU_ATTRIBUTES = 0x6ffffff5 +SHT_GNU_HASH = 0x6ffffff6 +SHT_GNU_LIBLIST = 0x6ffffff7 +SHT_CHECKSUM = 0x6ffffff8 +SHT_LOSUNW = 0x6ffffffa +SHT_SUNW_move = 0x6ffffffa +SHT_SUNW_COMDAT = 0x6ffffffb +SHT_SUNW_syminfo = 0x6ffffffc +SHT_GNU_verdef = 0x6ffffffd +SHT_GNU_verneed = 0x6ffffffe +SHT_GNU_versym = 0x6fffffff +SHT_HISUNW = 0x6fffffff +SHT_HIOS = 0x6fffffff +SHT_LOPROC = 0x70000000 +SHT_HIPROC = 0x7fffffff +SHT_LOUSER = 0x80000000 +SHT_HIUSER = 0x8fffffff +SHF_WRITE = (1 << 0) +SHF_ALLOC = (1 << 1) +SHF_EXECINSTR = (1 << 2) +SHF_MERGE = (1 << 4) +SHF_STRINGS = (1 << 5) +SHF_INFO_LINK = (1 << 6) +SHF_LINK_ORDER = (1 << 7) +SHF_OS_NONCONFORMING = (1 << 8) +SHF_GROUP = (1 << 9) +SHF_TLS = (1 << 10) +SHF_COMPRESSED = (1 << 11) +SHF_MASKOS = 0x0ff00000 +SHF_MASKPROC = 0xf0000000 +SHF_GNU_RETAIN = (1 << 21) +SHF_ORDERED = (1 << 30) +SHF_EXCLUDE = (1 << 31) +ELFCOMPRESS_ZLIB = 1 +ELFCOMPRESS_ZSTD = 2 +ELFCOMPRESS_LOOS = 0x60000000 +ELFCOMPRESS_HIOS = 0x6fffffff +ELFCOMPRESS_LOPROC = 0x70000000 +ELFCOMPRESS_HIPROC = 0x7fffffff +GRP_COMDAT = 0x1 +SYMINFO_BT_SELF = 0xffff +SYMINFO_BT_PARENT = 0xfffe +SYMINFO_BT_LOWRESERVE = 0xff00 +SYMINFO_FLG_DIRECT = 0x0001 +SYMINFO_FLG_PASSTHRU = 0x0002 +SYMINFO_FLG_COPY = 0x0004 +SYMINFO_FLG_LAZYLOAD = 0x0008 +SYMINFO_NONE = 0 +SYMINFO_CURRENT = 1 +SYMINFO_NUM = 2 +ELF32_ST_BIND = lambda val: (( (val)) >> 4) # type: ignore +ELF32_ST_TYPE = lambda val: ((val) & 0xf) # type: ignore +ELF32_ST_INFO = lambda bind,type: (((bind) << 4) + ((type) & 0xf)) # type: ignore +ELF64_ST_BIND = lambda val: ELF32_ST_BIND (val) # type: ignore +ELF64_ST_TYPE = lambda val: ELF32_ST_TYPE (val) # type: ignore +ELF64_ST_INFO = lambda bind,type: ELF32_ST_INFO ((bind), (type)) # type: ignore +STB_LOCAL = 0 +STB_GLOBAL = 1 +STB_WEAK = 2 +STB_NUM = 3 +STB_LOOS = 10 +STB_GNU_UNIQUE = 10 +STB_HIOS = 12 +STB_LOPROC = 13 +STB_HIPROC = 15 +STT_NOTYPE = 0 +STT_OBJECT = 1 +STT_FUNC = 2 +STT_SECTION = 3 +STT_FILE = 4 +STT_COMMON = 5 +STT_TLS = 6 +STT_NUM = 7 +STT_LOOS = 10 +STT_GNU_IFUNC = 10 +STT_HIOS = 12 +STT_LOPROC = 13 +STT_HIPROC = 15 +STN_UNDEF = 0 +ELF32_ST_VISIBILITY = lambda o: ((o) & 0x03) # type: ignore +ELF64_ST_VISIBILITY = lambda o: ELF32_ST_VISIBILITY (o) # type: ignore +STV_DEFAULT = 0 +STV_INTERNAL = 1 +STV_HIDDEN = 2 +STV_PROTECTED = 3 +ELF32_R_SYM = lambda val: ((val) >> 8) # type: ignore +ELF32_R_TYPE = lambda val: ((val) & 0xff) # type: ignore +ELF32_R_INFO = lambda sym,type: (((sym) << 8) + ((type) & 0xff)) # type: ignore +ELF64_R_SYM = lambda i: ((i) >> 32) # type: ignore +ELF64_R_TYPE = lambda i: ((i) & 0xffffffff) # type: ignore +ELF64_R_INFO = lambda sym,type: ((((Elf64_Xword) (sym)) << 32) + (type)) # type: ignore +PN_XNUM = 0xffff +PT_NULL = 0 +PT_LOAD = 1 +PT_DYNAMIC = 2 +PT_INTERP = 3 +PT_NOTE = 4 +PT_SHLIB = 5 +PT_PHDR = 6 +PT_TLS = 7 +PT_NUM = 8 +PT_LOOS = 0x60000000 +PT_GNU_EH_FRAME = 0x6474e550 +PT_GNU_STACK = 0x6474e551 +PT_GNU_RELRO = 0x6474e552 +PT_GNU_PROPERTY = 0x6474e553 +PT_GNU_SFRAME = 0x6474e554 +PT_LOSUNW = 0x6ffffffa +PT_SUNWBSS = 0x6ffffffa +PT_SUNWSTACK = 0x6ffffffb +PT_HISUNW = 0x6fffffff +PT_HIOS = 0x6fffffff +PT_LOPROC = 0x70000000 +PT_HIPROC = 0x7fffffff +PF_X = (1 << 0) +PF_W = (1 << 1) +PF_R = (1 << 2) +PF_MASKOS = 0x0ff00000 +PF_MASKPROC = 0xf0000000 +NT_PRSTATUS = 1 +NT_PRFPREG = 2 +NT_FPREGSET = 2 +NT_PRPSINFO = 3 +NT_PRXREG = 4 +NT_TASKSTRUCT = 4 +NT_PLATFORM = 5 +NT_AUXV = 6 +NT_GWINDOWS = 7 +NT_ASRS = 8 +NT_PSTATUS = 10 +NT_PSINFO = 13 +NT_PRCRED = 14 +NT_UTSNAME = 15 +NT_LWPSTATUS = 16 +NT_LWPSINFO = 17 +NT_PRFPXREG = 20 +NT_SIGINFO = 0x53494749 +NT_FILE = 0x46494c45 +NT_PRXFPREG = 0x46e62b7f +NT_PPC_VMX = 0x100 +NT_PPC_SPE = 0x101 +NT_PPC_VSX = 0x102 +NT_PPC_TAR = 0x103 +NT_PPC_PPR = 0x104 +NT_PPC_DSCR = 0x105 +NT_PPC_EBB = 0x106 +NT_PPC_PMU = 0x107 +NT_PPC_TM_CGPR = 0x108 +NT_PPC_TM_CFPR = 0x109 +NT_PPC_TM_CVMX = 0x10a +NT_PPC_TM_CVSX = 0x10b +NT_PPC_TM_SPR = 0x10c +NT_PPC_TM_CTAR = 0x10d +NT_PPC_TM_CPPR = 0x10e +NT_PPC_TM_CDSCR = 0x10f +NT_PPC_PKEY = 0x110 +NT_PPC_DEXCR = 0x111 +NT_PPC_HASHKEYR = 0x112 +NT_386_TLS = 0x200 +NT_386_IOPERM = 0x201 +NT_X86_XSTATE = 0x202 +NT_X86_SHSTK = 0x204 +NT_S390_HIGH_GPRS = 0x300 +NT_S390_TIMER = 0x301 +NT_S390_TODCMP = 0x302 +NT_S390_TODPREG = 0x303 +NT_S390_CTRS = 0x304 +NT_S390_PREFIX = 0x305 +NT_S390_LAST_BREAK = 0x306 +NT_S390_SYSTEM_CALL = 0x307 +NT_S390_TDB = 0x308 +NT_S390_VXRS_LOW = 0x309 +NT_S390_VXRS_HIGH = 0x30a +NT_S390_GS_CB = 0x30b +NT_S390_GS_BC = 0x30c +NT_S390_RI_CB = 0x30d +NT_S390_PV_CPU_DATA = 0x30e +NT_ARM_VFP = 0x400 +NT_ARM_TLS = 0x401 +NT_ARM_HW_BREAK = 0x402 +NT_ARM_HW_WATCH = 0x403 +NT_ARM_SYSTEM_CALL = 0x404 +NT_ARM_SVE = 0x405 +NT_ARM_PAC_MASK = 0x406 +NT_ARM_PACA_KEYS = 0x407 +NT_ARM_PACG_KEYS = 0x408 +NT_ARM_TAGGED_ADDR_CTRL = 0x409 +NT_ARM_PAC_ENABLED_KEYS = 0x40a +NT_VMCOREDD = 0x700 +NT_MIPS_DSP = 0x800 +NT_MIPS_FP_MODE = 0x801 +NT_MIPS_MSA = 0x802 +NT_RISCV_CSR = 0x900 +NT_RISCV_VECTOR = 0x901 +NT_LOONGARCH_CPUCFG = 0xa00 +NT_LOONGARCH_CSR = 0xa01 +NT_LOONGARCH_LSX = 0xa02 +NT_LOONGARCH_LASX = 0xa03 +NT_LOONGARCH_LBT = 0xa04 +NT_LOONGARCH_HW_BREAK = 0xa05 +NT_LOONGARCH_HW_WATCH = 0xa06 +NT_VERSION = 1 +DT_NULL = 0 +DT_NEEDED = 1 +DT_PLTRELSZ = 2 +DT_PLTGOT = 3 +DT_HASH = 4 +DT_STRTAB = 5 +DT_SYMTAB = 6 +DT_RELA = 7 +DT_RELASZ = 8 +DT_RELAENT = 9 +DT_STRSZ = 10 +DT_SYMENT = 11 +DT_INIT = 12 +DT_FINI = 13 +DT_SONAME = 14 +DT_RPATH = 15 +DT_SYMBOLIC = 16 +DT_REL = 17 +DT_RELSZ = 18 +DT_RELENT = 19 +DT_PLTREL = 20 +DT_DEBUG = 21 +DT_TEXTREL = 22 +DT_JMPREL = 23 +DT_BIND_NOW = 24 +DT_INIT_ARRAY = 25 +DT_FINI_ARRAY = 26 +DT_INIT_ARRAYSZ = 27 +DT_FINI_ARRAYSZ = 28 +DT_RUNPATH = 29 +DT_FLAGS = 30 +DT_ENCODING = 32 +DT_PREINIT_ARRAY = 32 +DT_PREINIT_ARRAYSZ = 33 +DT_SYMTAB_SHNDX = 34 +DT_RELRSZ = 35 +DT_RELR = 36 +DT_RELRENT = 37 +DT_NUM = 38 +DT_LOOS = 0x6000000d +DT_HIOS = 0x6ffff000 +DT_LOPROC = 0x70000000 +DT_HIPROC = 0x7fffffff +DT_VALRNGLO = 0x6ffffd00 +DT_GNU_PRELINKED = 0x6ffffdf5 +DT_GNU_CONFLICTSZ = 0x6ffffdf6 +DT_GNU_LIBLISTSZ = 0x6ffffdf7 +DT_CHECKSUM = 0x6ffffdf8 +DT_PLTPADSZ = 0x6ffffdf9 +DT_MOVEENT = 0x6ffffdfa +DT_MOVESZ = 0x6ffffdfb +DT_FEATURE_1 = 0x6ffffdfc +DT_POSFLAG_1 = 0x6ffffdfd +DT_SYMINSZ = 0x6ffffdfe +DT_SYMINENT = 0x6ffffdff +DT_VALRNGHI = 0x6ffffdff +DT_VALTAGIDX = lambda tag: (DT_VALRNGHI - (tag)) # type: ignore +DT_VALNUM = 12 +DT_ADDRRNGLO = 0x6ffffe00 +DT_GNU_HASH = 0x6ffffef5 +DT_TLSDESC_PLT = 0x6ffffef6 +DT_TLSDESC_GOT = 0x6ffffef7 +DT_GNU_CONFLICT = 0x6ffffef8 +DT_GNU_LIBLIST = 0x6ffffef9 +DT_CONFIG = 0x6ffffefa +DT_DEPAUDIT = 0x6ffffefb +DT_AUDIT = 0x6ffffefc +DT_PLTPAD = 0x6ffffefd +DT_MOVETAB = 0x6ffffefe +DT_SYMINFO = 0x6ffffeff +DT_ADDRRNGHI = 0x6ffffeff +DT_ADDRTAGIDX = lambda tag: (DT_ADDRRNGHI - (tag)) # type: ignore +DT_ADDRNUM = 11 +DT_VERSYM = 0x6ffffff0 +DT_RELACOUNT = 0x6ffffff9 +DT_RELCOUNT = 0x6ffffffa +DT_FLAGS_1 = 0x6ffffffb +DT_VERDEF = 0x6ffffffc +DT_VERDEFNUM = 0x6ffffffd +DT_VERNEED = 0x6ffffffe +DT_VERNEEDNUM = 0x6fffffff +DT_VERSIONTAGIDX = lambda tag: (DT_VERNEEDNUM - (tag)) # type: ignore +DT_VERSIONTAGNUM = 16 +DT_AUXILIARY = 0x7ffffffd +DT_FILTER = 0x7fffffff +DT_EXTRATAGIDX = lambda tag: ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) # type: ignore +DT_EXTRANUM = 3 +DF_ORIGIN = 0x00000001 +DF_SYMBOLIC = 0x00000002 +DF_TEXTREL = 0x00000004 +DF_BIND_NOW = 0x00000008 +DF_STATIC_TLS = 0x00000010 +DF_1_NOW = 0x00000001 +DF_1_GLOBAL = 0x00000002 +DF_1_GROUP = 0x00000004 +DF_1_NODELETE = 0x00000008 +DF_1_LOADFLTR = 0x00000010 +DF_1_INITFIRST = 0x00000020 +DF_1_NOOPEN = 0x00000040 +DF_1_ORIGIN = 0x00000080 +DF_1_DIRECT = 0x00000100 +DF_1_TRANS = 0x00000200 +DF_1_INTERPOSE = 0x00000400 +DF_1_NODEFLIB = 0x00000800 +DF_1_NODUMP = 0x00001000 +DF_1_CONFALT = 0x00002000 +DF_1_ENDFILTEE = 0x00004000 +DF_1_DISPRELDNE = 0x00008000 +DF_1_DISPRELPND = 0x00010000 +DF_1_NODIRECT = 0x00020000 +DF_1_IGNMULDEF = 0x00040000 +DF_1_NOKSYMS = 0x00080000 +DF_1_NOHDR = 0x00100000 +DF_1_EDITED = 0x00200000 +DF_1_NORELOC = 0x00400000 +DF_1_SYMINTPOSE = 0x00800000 +DF_1_GLOBAUDIT = 0x01000000 +DF_1_SINGLETON = 0x02000000 +DF_1_STUB = 0x04000000 +DF_1_PIE = 0x08000000 +DF_1_KMOD = 0x10000000 +DF_1_WEAKFILTER = 0x20000000 +DF_1_NOCOMMON = 0x40000000 +DTF_1_PARINIT = 0x00000001 +DTF_1_CONFEXP = 0x00000002 +DF_P1_LAZYLOAD = 0x00000001 +DF_P1_GROUPPERM = 0x00000002 +VER_DEF_NONE = 0 +VER_DEF_CURRENT = 1 +VER_DEF_NUM = 2 +VER_FLG_BASE = 0x1 +VER_FLG_WEAK = 0x2 +VER_NDX_LOCAL = 0 +VER_NDX_GLOBAL = 1 +VER_NDX_LORESERVE = 0xff00 +VER_NDX_ELIMINATE = 0xff01 +VER_NEED_NONE = 0 +VER_NEED_CURRENT = 1 +VER_NEED_NUM = 2 +AT_NULL = 0 +AT_IGNORE = 1 +AT_EXECFD = 2 +AT_PHDR = 3 +AT_PHENT = 4 +AT_PHNUM = 5 +AT_PAGESZ = 6 +AT_BASE = 7 +AT_FLAGS = 8 +AT_ENTRY = 9 +AT_NOTELF = 10 +AT_UID = 11 +AT_EUID = 12 +AT_GID = 13 +AT_EGID = 14 +AT_CLKTCK = 17 +AT_PLATFORM = 15 +AT_HWCAP = 16 +AT_FPUCW = 18 +AT_DCACHEBSIZE = 19 +AT_ICACHEBSIZE = 20 +AT_UCACHEBSIZE = 21 +AT_IGNOREPPC = 22 +AT_SECURE = 23 +AT_BASE_PLATFORM = 24 +AT_RANDOM = 25 +AT_HWCAP2 = 26 +AT_RSEQ_FEATURE_SIZE = 27 +AT_RSEQ_ALIGN = 28 +AT_HWCAP3 = 29 +AT_HWCAP4 = 30 +AT_EXECFN = 31 +AT_SYSINFO = 32 +AT_SYSINFO_EHDR = 33 +AT_L1I_CACHESHAPE = 34 +AT_L1D_CACHESHAPE = 35 +AT_L2_CACHESHAPE = 36 +AT_L3_CACHESHAPE = 37 +AT_L1I_CACHESIZE = 40 +AT_L1I_CACHEGEOMETRY = 41 +AT_L1D_CACHESIZE = 42 +AT_L1D_CACHEGEOMETRY = 43 +AT_L2_CACHESIZE = 44 +AT_L2_CACHEGEOMETRY = 45 +AT_L3_CACHESIZE = 46 +AT_L3_CACHEGEOMETRY = 47 +AT_MINSIGSTKSZ = 51 +ELF_NOTE_SOLARIS = "SUNW Solaris" +ELF_NOTE_GNU = "GNU" +ELF_NOTE_FDO = "FDO" +ELF_NOTE_PAGESIZE_HINT = 1 +NT_GNU_ABI_TAG = 1 +ELF_NOTE_ABI = NT_GNU_ABI_TAG +ELF_NOTE_OS_LINUX = 0 +ELF_NOTE_OS_GNU = 1 +ELF_NOTE_OS_SOLARIS2 = 2 +ELF_NOTE_OS_FREEBSD = 3 +NT_GNU_HWCAP = 2 +NT_GNU_BUILD_ID = 3 +NT_GNU_GOLD_VERSION = 4 +NT_GNU_PROPERTY_TYPE_0 = 5 +NT_FDO_PACKAGING_METADATA = 0xcafe1a7e +NOTE_GNU_PROPERTY_SECTION_NAME = ".note.gnu.property" +GNU_PROPERTY_STACK_SIZE = 1 +GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2 +GNU_PROPERTY_UINT32_AND_LO = 0xb0000000 +GNU_PROPERTY_UINT32_AND_HI = 0xb0007fff +GNU_PROPERTY_UINT32_OR_LO = 0xb0008000 +GNU_PROPERTY_UINT32_OR_HI = 0xb000ffff +GNU_PROPERTY_1_NEEDED = GNU_PROPERTY_UINT32_OR_LO +GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS = (1 << 0) +GNU_PROPERTY_LOPROC = 0xc0000000 +GNU_PROPERTY_HIPROC = 0xdfffffff +GNU_PROPERTY_LOUSER = 0xe0000000 +GNU_PROPERTY_HIUSER = 0xffffffff +GNU_PROPERTY_AARCH64_FEATURE_1_AND = 0xc0000000 +GNU_PROPERTY_AARCH64_FEATURE_1_BTI = (1 << 0) +GNU_PROPERTY_AARCH64_FEATURE_1_PAC = (1 << 1) +GNU_PROPERTY_X86_ISA_1_USED = 0xc0010002 +GNU_PROPERTY_X86_ISA_1_NEEDED = 0xc0008002 +GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002 +GNU_PROPERTY_X86_ISA_1_BASELINE = (1 << 0) +GNU_PROPERTY_X86_ISA_1_V2 = (1 << 1) +GNU_PROPERTY_X86_ISA_1_V3 = (1 << 2) +GNU_PROPERTY_X86_ISA_1_V4 = (1 << 3) +GNU_PROPERTY_X86_FEATURE_1_IBT = (1 << 0) +GNU_PROPERTY_X86_FEATURE_1_SHSTK = (1 << 1) +ELF32_M_SYM = lambda info: ((info) >> 8) # type: ignore +ELF32_M_SIZE = lambda info: ( (info)) # type: ignore +ELF32_M_INFO = lambda sym,size: (((sym) << 8) + (size)) # type: ignore +ELF64_M_SYM = lambda info: ELF32_M_SYM (info) # type: ignore +ELF64_M_SIZE = lambda info: ELF32_M_SIZE (info) # type: ignore +ELF64_M_INFO = lambda sym,size: ELF32_M_INFO (sym, size) # type: ignore +EF_CPU32 = 0x00810000 +R_68K_NONE = 0 +R_68K_32 = 1 +R_68K_16 = 2 +R_68K_8 = 3 +R_68K_PC32 = 4 +R_68K_PC16 = 5 +R_68K_PC8 = 6 +R_68K_GOT32 = 7 +R_68K_GOT16 = 8 +R_68K_GOT8 = 9 +R_68K_GOT32O = 10 +R_68K_GOT16O = 11 +R_68K_GOT8O = 12 +R_68K_PLT32 = 13 +R_68K_PLT16 = 14 +R_68K_PLT8 = 15 +R_68K_PLT32O = 16 +R_68K_PLT16O = 17 +R_68K_PLT8O = 18 +R_68K_COPY = 19 +R_68K_GLOB_DAT = 20 +R_68K_JMP_SLOT = 21 +R_68K_RELATIVE = 22 +R_68K_TLS_GD32 = 25 +R_68K_TLS_GD16 = 26 +R_68K_TLS_GD8 = 27 +R_68K_TLS_LDM32 = 28 +R_68K_TLS_LDM16 = 29 +R_68K_TLS_LDM8 = 30 +R_68K_TLS_LDO32 = 31 +R_68K_TLS_LDO16 = 32 +R_68K_TLS_LDO8 = 33 +R_68K_TLS_IE32 = 34 +R_68K_TLS_IE16 = 35 +R_68K_TLS_IE8 = 36 +R_68K_TLS_LE32 = 37 +R_68K_TLS_LE16 = 38 +R_68K_TLS_LE8 = 39 +R_68K_TLS_DTPMOD32 = 40 +R_68K_TLS_DTPREL32 = 41 +R_68K_TLS_TPREL32 = 42 +R_68K_NUM = 43 +R_386_NONE = 0 +R_386_32 = 1 +R_386_PC32 = 2 +R_386_GOT32 = 3 +R_386_PLT32 = 4 +R_386_COPY = 5 +R_386_GLOB_DAT = 6 +R_386_JMP_SLOT = 7 +R_386_RELATIVE = 8 +R_386_GOTOFF = 9 +R_386_GOTPC = 10 +R_386_32PLT = 11 +R_386_TLS_TPOFF = 14 +R_386_TLS_IE = 15 +R_386_TLS_GOTIE = 16 +R_386_TLS_LE = 17 +R_386_TLS_GD = 18 +R_386_TLS_LDM = 19 +R_386_16 = 20 +R_386_PC16 = 21 +R_386_8 = 22 +R_386_PC8 = 23 +R_386_TLS_GD_32 = 24 +R_386_TLS_GD_PUSH = 25 +R_386_TLS_GD_CALL = 26 +R_386_TLS_GD_POP = 27 +R_386_TLS_LDM_32 = 28 +R_386_TLS_LDM_PUSH = 29 +R_386_TLS_LDM_CALL = 30 +R_386_TLS_LDM_POP = 31 +R_386_TLS_LDO_32 = 32 +R_386_TLS_IE_32 = 33 +R_386_TLS_LE_32 = 34 +R_386_TLS_DTPMOD32 = 35 +R_386_TLS_DTPOFF32 = 36 +R_386_TLS_TPOFF32 = 37 +R_386_SIZE32 = 38 +R_386_TLS_GOTDESC = 39 +R_386_TLS_DESC_CALL = 40 +R_386_TLS_DESC = 41 +R_386_IRELATIVE = 42 +R_386_GOT32X = 43 +R_386_NUM = 44 +STT_SPARC_REGISTER = 13 +EF_SPARCV9_MM = 3 +EF_SPARCV9_TSO = 0 +EF_SPARCV9_PSO = 1 +EF_SPARCV9_RMO = 2 +EF_SPARC_LEDATA = 0x800000 +EF_SPARC_EXT_MASK = 0xFFFF00 +EF_SPARC_32PLUS = 0x000100 +EF_SPARC_SUN_US1 = 0x000200 +EF_SPARC_HAL_R1 = 0x000400 +EF_SPARC_SUN_US3 = 0x000800 +R_SPARC_NONE = 0 +R_SPARC_8 = 1 +R_SPARC_16 = 2 +R_SPARC_32 = 3 +R_SPARC_DISP8 = 4 +R_SPARC_DISP16 = 5 +R_SPARC_DISP32 = 6 +R_SPARC_WDISP30 = 7 +R_SPARC_WDISP22 = 8 +R_SPARC_HI22 = 9 +R_SPARC_22 = 10 +R_SPARC_13 = 11 +R_SPARC_LO10 = 12 +R_SPARC_GOT10 = 13 +R_SPARC_GOT13 = 14 +R_SPARC_GOT22 = 15 +R_SPARC_PC10 = 16 +R_SPARC_PC22 = 17 +R_SPARC_WPLT30 = 18 +R_SPARC_COPY = 19 +R_SPARC_GLOB_DAT = 20 +R_SPARC_JMP_SLOT = 21 +R_SPARC_RELATIVE = 22 +R_SPARC_UA32 = 23 +R_SPARC_PLT32 = 24 +R_SPARC_HIPLT22 = 25 +R_SPARC_LOPLT10 = 26 +R_SPARC_PCPLT32 = 27 +R_SPARC_PCPLT22 = 28 +R_SPARC_PCPLT10 = 29 +R_SPARC_10 = 30 +R_SPARC_11 = 31 +R_SPARC_64 = 32 +R_SPARC_OLO10 = 33 +R_SPARC_HH22 = 34 +R_SPARC_HM10 = 35 +R_SPARC_LM22 = 36 +R_SPARC_PC_HH22 = 37 +R_SPARC_PC_HM10 = 38 +R_SPARC_PC_LM22 = 39 +R_SPARC_WDISP16 = 40 +R_SPARC_WDISP19 = 41 +R_SPARC_GLOB_JMP = 42 +R_SPARC_7 = 43 +R_SPARC_5 = 44 +R_SPARC_6 = 45 +R_SPARC_DISP64 = 46 +R_SPARC_PLT64 = 47 +R_SPARC_HIX22 = 48 +R_SPARC_LOX10 = 49 +R_SPARC_H44 = 50 +R_SPARC_M44 = 51 +R_SPARC_L44 = 52 +R_SPARC_REGISTER = 53 +R_SPARC_UA64 = 54 +R_SPARC_UA16 = 55 +R_SPARC_TLS_GD_HI22 = 56 +R_SPARC_TLS_GD_LO10 = 57 +R_SPARC_TLS_GD_ADD = 58 +R_SPARC_TLS_GD_CALL = 59 +R_SPARC_TLS_LDM_HI22 = 60 +R_SPARC_TLS_LDM_LO10 = 61 +R_SPARC_TLS_LDM_ADD = 62 +R_SPARC_TLS_LDM_CALL = 63 +R_SPARC_TLS_LDO_HIX22 = 64 +R_SPARC_TLS_LDO_LOX10 = 65 +R_SPARC_TLS_LDO_ADD = 66 +R_SPARC_TLS_IE_HI22 = 67 +R_SPARC_TLS_IE_LO10 = 68 +R_SPARC_TLS_IE_LD = 69 +R_SPARC_TLS_IE_LDX = 70 +R_SPARC_TLS_IE_ADD = 71 +R_SPARC_TLS_LE_HIX22 = 72 +R_SPARC_TLS_LE_LOX10 = 73 +R_SPARC_TLS_DTPMOD32 = 74 +R_SPARC_TLS_DTPMOD64 = 75 +R_SPARC_TLS_DTPOFF32 = 76 +R_SPARC_TLS_DTPOFF64 = 77 +R_SPARC_TLS_TPOFF32 = 78 +R_SPARC_TLS_TPOFF64 = 79 +R_SPARC_GOTDATA_HIX22 = 80 +R_SPARC_GOTDATA_LOX10 = 81 +R_SPARC_GOTDATA_OP_HIX22 = 82 +R_SPARC_GOTDATA_OP_LOX10 = 83 +R_SPARC_GOTDATA_OP = 84 +R_SPARC_H34 = 85 +R_SPARC_SIZE32 = 86 +R_SPARC_SIZE64 = 87 +R_SPARC_WDISP10 = 88 +R_SPARC_JMP_IREL = 248 +R_SPARC_IRELATIVE = 249 +R_SPARC_GNU_VTINHERIT = 250 +R_SPARC_GNU_VTENTRY = 251 +R_SPARC_REV32 = 252 +R_SPARC_NUM = 253 +DT_SPARC_REGISTER = 0x70000001 +DT_SPARC_NUM = 2 +EF_MIPS_NOREORDER = 1 +EF_MIPS_PIC = 2 +EF_MIPS_CPIC = 4 +EF_MIPS_XGOT = 8 +EF_MIPS_UCODE = 16 +EF_MIPS_ABI2 = 32 +EF_MIPS_ABI_ON32 = 64 +EF_MIPS_OPTIONS_FIRST = 0x00000080 +EF_MIPS_32BITMODE = 0x00000100 +EF_MIPS_FP64 = 512 +EF_MIPS_NAN2008 = 1024 +EF_MIPS_ARCH_ASE = 0x0f000000 +EF_MIPS_ARCH_ASE_MDMX = 0x08000000 +EF_MIPS_ARCH_ASE_M16 = 0x04000000 +EF_MIPS_ARCH_ASE_MICROMIPS = 0x02000000 +EF_MIPS_ARCH = 0xf0000000 +EF_MIPS_ARCH_1 = 0x00000000 +EF_MIPS_ARCH_2 = 0x10000000 +EF_MIPS_ARCH_3 = 0x20000000 +EF_MIPS_ARCH_4 = 0x30000000 +EF_MIPS_ARCH_5 = 0x40000000 +EF_MIPS_ARCH_32 = 0x50000000 +EF_MIPS_ARCH_64 = 0x60000000 +EF_MIPS_ARCH_32R2 = 0x70000000 +EF_MIPS_ARCH_64R2 = 0x80000000 +EF_MIPS_ARCH_32R6 = 0x90000000 +EF_MIPS_ARCH_64R6 = 0xa0000000 +EF_MIPS_ABI = 0x0000F000 +EF_MIPS_ABI_O32 = 0x00001000 +EF_MIPS_ABI_O64 = 0x00002000 +EF_MIPS_ABI_EABI32 = 0x00003000 +EF_MIPS_ABI_EABI64 = 0x00004000 +EF_MIPS_MACH = 0x00FF0000 +EF_MIPS_MACH_3900 = 0x00810000 +EF_MIPS_MACH_4010 = 0x00820000 +EF_MIPS_MACH_4100 = 0x00830000 +EF_MIPS_MACH_ALLEGREX = 0x00840000 +EF_MIPS_MACH_4650 = 0x00850000 +EF_MIPS_MACH_4120 = 0x00870000 +EF_MIPS_MACH_4111 = 0x00880000 +EF_MIPS_MACH_SB1 = 0x008a0000 +EF_MIPS_MACH_OCTEON = 0x008b0000 +EF_MIPS_MACH_XLR = 0x008c0000 +EF_MIPS_MACH_OCTEON2 = 0x008d0000 +EF_MIPS_MACH_OCTEON3 = 0x008e0000 +EF_MIPS_MACH_5400 = 0x00910000 +EF_MIPS_MACH_5900 = 0x00920000 +EF_MIPS_MACH_IAMR2 = 0x00930000 +EF_MIPS_MACH_5500 = 0x00980000 +EF_MIPS_MACH_9000 = 0x00990000 +EF_MIPS_MACH_LS2E = 0x00A00000 +EF_MIPS_MACH_LS2F = 0x00A10000 +EF_MIPS_MACH_GS464 = 0x00A20000 +EF_MIPS_MACH_GS464E = 0x00A30000 +EF_MIPS_MACH_GS264E = 0x00A40000 +E_MIPS_ARCH_1 = EF_MIPS_ARCH_1 +E_MIPS_ARCH_2 = EF_MIPS_ARCH_2 +E_MIPS_ARCH_3 = EF_MIPS_ARCH_3 +E_MIPS_ARCH_4 = EF_MIPS_ARCH_4 +E_MIPS_ARCH_5 = EF_MIPS_ARCH_5 +E_MIPS_ARCH_32 = EF_MIPS_ARCH_32 +E_MIPS_ARCH_64 = EF_MIPS_ARCH_64 +SHN_MIPS_ACOMMON = 0xff00 +SHN_MIPS_TEXT = 0xff01 +SHN_MIPS_DATA = 0xff02 +SHN_MIPS_SCOMMON = 0xff03 +SHN_MIPS_SUNDEFINED = 0xff04 +SHT_MIPS_LIBLIST = 0x70000000 +SHT_MIPS_MSYM = 0x70000001 +SHT_MIPS_CONFLICT = 0x70000002 +SHT_MIPS_GPTAB = 0x70000003 +SHT_MIPS_UCODE = 0x70000004 +SHT_MIPS_DEBUG = 0x70000005 +SHT_MIPS_REGINFO = 0x70000006 +SHT_MIPS_PACKAGE = 0x70000007 +SHT_MIPS_PACKSYM = 0x70000008 +SHT_MIPS_RELD = 0x70000009 +SHT_MIPS_IFACE = 0x7000000b +SHT_MIPS_CONTENT = 0x7000000c +SHT_MIPS_OPTIONS = 0x7000000d +SHT_MIPS_SHDR = 0x70000010 +SHT_MIPS_FDESC = 0x70000011 +SHT_MIPS_EXTSYM = 0x70000012 +SHT_MIPS_DENSE = 0x70000013 +SHT_MIPS_PDESC = 0x70000014 +SHT_MIPS_LOCSYM = 0x70000015 +SHT_MIPS_AUXSYM = 0x70000016 +SHT_MIPS_OPTSYM = 0x70000017 +SHT_MIPS_LOCSTR = 0x70000018 +SHT_MIPS_LINE = 0x70000019 +SHT_MIPS_RFDESC = 0x7000001a +SHT_MIPS_DELTASYM = 0x7000001b +SHT_MIPS_DELTAINST = 0x7000001c +SHT_MIPS_DELTACLASS = 0x7000001d +SHT_MIPS_DWARF = 0x7000001e +SHT_MIPS_DELTADECL = 0x7000001f +SHT_MIPS_SYMBOL_LIB = 0x70000020 +SHT_MIPS_EVENTS = 0x70000021 +SHT_MIPS_TRANSLATE = 0x70000022 +SHT_MIPS_PIXIE = 0x70000023 +SHT_MIPS_XLATE = 0x70000024 +SHT_MIPS_XLATE_DEBUG = 0x70000025 +SHT_MIPS_WHIRL = 0x70000026 +SHT_MIPS_EH_REGION = 0x70000027 +SHT_MIPS_XLATE_OLD = 0x70000028 +SHT_MIPS_PDR_EXCEPTION = 0x70000029 +SHT_MIPS_ABIFLAGS = 0x7000002a +SHT_MIPS_XHASH = 0x7000002b +SHF_MIPS_GPREL = 0x10000000 +SHF_MIPS_MERGE = 0x20000000 +SHF_MIPS_ADDR = 0x40000000 +SHF_MIPS_STRINGS = 0x80000000 +SHF_MIPS_NOSTRIP = 0x08000000 +SHF_MIPS_LOCAL = 0x04000000 +SHF_MIPS_NAMES = 0x02000000 +SHF_MIPS_NODUPE = 0x01000000 +STO_MIPS_DEFAULT = 0x0 +STO_MIPS_INTERNAL = 0x1 +STO_MIPS_HIDDEN = 0x2 +STO_MIPS_PROTECTED = 0x3 +STO_MIPS_PLT = 0x8 +STO_MIPS_SC_ALIGN_UNUSED = 0xff +STB_MIPS_SPLIT_COMMON = 13 +ODK_NULL = 0 +ODK_REGINFO = 1 +ODK_EXCEPTIONS = 2 +ODK_PAD = 3 +ODK_HWPATCH = 4 +ODK_FILL = 5 +ODK_TAGS = 6 +ODK_HWAND = 7 +ODK_HWOR = 8 +OEX_FPU_MIN = 0x1f +OEX_FPU_MAX = 0x1f00 +OEX_PAGE0 = 0x10000 +OEX_SMM = 0x20000 +OEX_FPDBUG = 0x40000 +OEX_PRECISEFP = OEX_FPDBUG +OEX_DISMISS = 0x80000 +OEX_FPU_INVAL = 0x10 +OEX_FPU_DIV0 = 0x08 +OEX_FPU_OFLO = 0x04 +OEX_FPU_UFLO = 0x02 +OEX_FPU_INEX = 0x01 +OHW_R4KEOP = 0x1 +OHW_R8KPFETCH = 0x2 +OHW_R5KEOP = 0x4 +OHW_R5KCVTL = 0x8 +OPAD_PREFIX = 0x1 +OPAD_POSTFIX = 0x2 +OPAD_SYMBOL = 0x4 +OHWA0_R4KEOP_CHECKED = 0x00000001 +OHWA1_R4KEOP_CLEAN = 0x00000002 +R_MIPS_NONE = 0 +R_MIPS_16 = 1 +R_MIPS_32 = 2 +R_MIPS_REL32 = 3 +R_MIPS_26 = 4 +R_MIPS_HI16 = 5 +R_MIPS_LO16 = 6 +R_MIPS_GPREL16 = 7 +R_MIPS_LITERAL = 8 +R_MIPS_GOT16 = 9 +R_MIPS_PC16 = 10 +R_MIPS_CALL16 = 11 +R_MIPS_GPREL32 = 12 +R_MIPS_SHIFT5 = 16 +R_MIPS_SHIFT6 = 17 +R_MIPS_64 = 18 +R_MIPS_GOT_DISP = 19 +R_MIPS_GOT_PAGE = 20 +R_MIPS_GOT_OFST = 21 +R_MIPS_GOT_HI16 = 22 +R_MIPS_GOT_LO16 = 23 +R_MIPS_SUB = 24 +R_MIPS_INSERT_A = 25 +R_MIPS_INSERT_B = 26 +R_MIPS_DELETE = 27 +R_MIPS_HIGHER = 28 +R_MIPS_HIGHEST = 29 +R_MIPS_CALL_HI16 = 30 +R_MIPS_CALL_LO16 = 31 +R_MIPS_SCN_DISP = 32 +R_MIPS_REL16 = 33 +R_MIPS_ADD_IMMEDIATE = 34 +R_MIPS_PJUMP = 35 +R_MIPS_RELGOT = 36 +R_MIPS_JALR = 37 +R_MIPS_TLS_DTPMOD32 = 38 +R_MIPS_TLS_DTPREL32 = 39 +R_MIPS_TLS_DTPMOD64 = 40 +R_MIPS_TLS_DTPREL64 = 41 +R_MIPS_TLS_GD = 42 +R_MIPS_TLS_LDM = 43 +R_MIPS_TLS_DTPREL_HI16 = 44 +R_MIPS_TLS_DTPREL_LO16 = 45 +R_MIPS_TLS_GOTTPREL = 46 +R_MIPS_TLS_TPREL32 = 47 +R_MIPS_TLS_TPREL64 = 48 +R_MIPS_TLS_TPREL_HI16 = 49 +R_MIPS_TLS_TPREL_LO16 = 50 +R_MIPS_GLOB_DAT = 51 +R_MIPS_PC21_S2 = 60 +R_MIPS_PC26_S2 = 61 +R_MIPS_PC18_S3 = 62 +R_MIPS_PC19_S2 = 63 +R_MIPS_PCHI16 = 64 +R_MIPS_PCLO16 = 65 +R_MIPS16_26 = 100 +R_MIPS16_GPREL = 101 +R_MIPS16_GOT16 = 102 +R_MIPS16_CALL16 = 103 +R_MIPS16_HI16 = 104 +R_MIPS16_LO16 = 105 +R_MIPS16_TLS_GD = 106 +R_MIPS16_TLS_LDM = 107 +R_MIPS16_TLS_DTPREL_HI16 = 108 +R_MIPS16_TLS_DTPREL_LO16 = 109 +R_MIPS16_TLS_GOTTPREL = 110 +R_MIPS16_TLS_TPREL_HI16 = 111 +R_MIPS16_TLS_TPREL_LO16 = 112 +R_MIPS16_PC16_S1 = 113 +R_MIPS_COPY = 126 +R_MIPS_JUMP_SLOT = 127 +R_MIPS_RELATIVE = 128 +R_MICROMIPS_26_S1 = 133 +R_MICROMIPS_HI16 = 134 +R_MICROMIPS_LO16 = 135 +R_MICROMIPS_GPREL16 = 136 +R_MICROMIPS_LITERAL = 137 +R_MICROMIPS_GOT16 = 138 +R_MICROMIPS_PC7_S1 = 139 +R_MICROMIPS_PC10_S1 = 140 +R_MICROMIPS_PC16_S1 = 141 +R_MICROMIPS_CALL16 = 142 +R_MICROMIPS_GOT_DISP = 145 +R_MICROMIPS_GOT_PAGE = 146 +R_MICROMIPS_GOT_OFST = 147 +R_MICROMIPS_GOT_HI16 = 148 +R_MICROMIPS_GOT_LO16 = 149 +R_MICROMIPS_SUB = 150 +R_MICROMIPS_HIGHER = 151 +R_MICROMIPS_HIGHEST = 152 +R_MICROMIPS_CALL_HI16 = 153 +R_MICROMIPS_CALL_LO16 = 154 +R_MICROMIPS_SCN_DISP = 155 +R_MICROMIPS_JALR = 156 +R_MICROMIPS_HI0_LO16 = 157 +R_MICROMIPS_TLS_GD = 162 +R_MICROMIPS_TLS_LDM = 163 +R_MICROMIPS_TLS_DTPREL_HI16 = 164 +R_MICROMIPS_TLS_DTPREL_LO16 = 165 +R_MICROMIPS_TLS_GOTTPREL = 166 +R_MICROMIPS_TLS_TPREL_HI16 = 169 +R_MICROMIPS_TLS_TPREL_LO16 = 170 +R_MICROMIPS_GPREL7_S2 = 172 +R_MICROMIPS_PC23_S2 = 173 +R_MIPS_PC32 = 248 +R_MIPS_EH = 249 +R_MIPS_GNU_REL16_S2 = 250 +R_MIPS_GNU_VTINHERIT = 253 +R_MIPS_GNU_VTENTRY = 254 +R_MIPS_NUM = 255 +PT_MIPS_REGINFO = 0x70000000 +PT_MIPS_RTPROC = 0x70000001 +PT_MIPS_OPTIONS = 0x70000002 +PT_MIPS_ABIFLAGS = 0x70000003 +PF_MIPS_LOCAL = 0x10000000 +DT_MIPS_RLD_VERSION = 0x70000001 +DT_MIPS_TIME_STAMP = 0x70000002 +DT_MIPS_ICHECKSUM = 0x70000003 +DT_MIPS_IVERSION = 0x70000004 +DT_MIPS_FLAGS = 0x70000005 +DT_MIPS_BASE_ADDRESS = 0x70000006 +DT_MIPS_MSYM = 0x70000007 +DT_MIPS_CONFLICT = 0x70000008 +DT_MIPS_LIBLIST = 0x70000009 +DT_MIPS_LOCAL_GOTNO = 0x7000000a +DT_MIPS_CONFLICTNO = 0x7000000b +DT_MIPS_LIBLISTNO = 0x70000010 +DT_MIPS_SYMTABNO = 0x70000011 +DT_MIPS_UNREFEXTNO = 0x70000012 +DT_MIPS_GOTSYM = 0x70000013 +DT_MIPS_HIPAGENO = 0x70000014 +DT_MIPS_RLD_MAP = 0x70000016 +DT_MIPS_DELTA_CLASS = 0x70000017 +DT_MIPS_DELTA_CLASS_NO = 0x70000018 +DT_MIPS_DELTA_INSTANCE = 0x70000019 +DT_MIPS_DELTA_INSTANCE_NO = 0x7000001a +DT_MIPS_DELTA_RELOC = 0x7000001b +DT_MIPS_DELTA_RELOC_NO = 0x7000001c +DT_MIPS_DELTA_SYM = 0x7000001d +DT_MIPS_DELTA_SYM_NO = 0x7000001e +DT_MIPS_DELTA_CLASSSYM = 0x70000020 +DT_MIPS_DELTA_CLASSSYM_NO = 0x70000021 +DT_MIPS_CXX_FLAGS = 0x70000022 +DT_MIPS_PIXIE_INIT = 0x70000023 +DT_MIPS_SYMBOL_LIB = 0x70000024 +DT_MIPS_LOCALPAGE_GOTIDX = 0x70000025 +DT_MIPS_LOCAL_GOTIDX = 0x70000026 +DT_MIPS_HIDDEN_GOTIDX = 0x70000027 +DT_MIPS_PROTECTED_GOTIDX = 0x70000028 +DT_MIPS_OPTIONS = 0x70000029 +DT_MIPS_INTERFACE = 0x7000002a +DT_MIPS_DYNSTR_ALIGN = 0x7000002b +DT_MIPS_INTERFACE_SIZE = 0x7000002c +DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 0x7000002d +DT_MIPS_PERF_SUFFIX = 0x7000002e +DT_MIPS_COMPACT_SIZE = 0x7000002f +DT_MIPS_GP_VALUE = 0x70000030 +DT_MIPS_AUX_DYNAMIC = 0x70000031 +DT_MIPS_PLTGOT = 0x70000032 +DT_MIPS_RWPLT = 0x70000034 +DT_MIPS_RLD_MAP_REL = 0x70000035 +DT_MIPS_XHASH = 0x70000036 +DT_MIPS_NUM = 0x37 +RHF_NONE = 0 +RHF_QUICKSTART = (1 << 0) +RHF_NOTPOT = (1 << 1) +RHF_NO_LIBRARY_REPLACEMENT = (1 << 2) +RHF_NO_MOVE = (1 << 3) +RHF_SGI_ONLY = (1 << 4) +RHF_GUARANTEE_INIT = (1 << 5) +RHF_DELTA_C_PLUS_PLUS = (1 << 6) +RHF_GUARANTEE_START_INIT = (1 << 7) +RHF_PIXIE = (1 << 8) +RHF_DEFAULT_DELAY_LOAD = (1 << 9) +RHF_REQUICKSTART = (1 << 10) +RHF_REQUICKSTARTED = (1 << 11) +RHF_CORD = (1 << 12) +RHF_NO_UNRES_UNDEF = (1 << 13) +RHF_RLD_ORDER_SAFE = (1 << 14) +LL_NONE = 0 +LL_EXACT_MATCH = (1 << 0) +LL_IGNORE_INT_VER = (1 << 1) +LL_REQUIRE_MINOR = (1 << 2) +LL_EXPORTS = (1 << 3) +LL_DELAY_LOAD = (1 << 4) +LL_DELTA = (1 << 5) +MIPS_AFL_REG_NONE = 0x00 +MIPS_AFL_REG_32 = 0x01 +MIPS_AFL_REG_64 = 0x02 +MIPS_AFL_REG_128 = 0x03 +MIPS_AFL_ASE_DSP = 0x00000001 +MIPS_AFL_ASE_DSPR2 = 0x00000002 +MIPS_AFL_ASE_EVA = 0x00000004 +MIPS_AFL_ASE_MCU = 0x00000008 +MIPS_AFL_ASE_MDMX = 0x00000010 +MIPS_AFL_ASE_MIPS3D = 0x00000020 +MIPS_AFL_ASE_MT = 0x00000040 +MIPS_AFL_ASE_SMARTMIPS = 0x00000080 +MIPS_AFL_ASE_VIRT = 0x00000100 +MIPS_AFL_ASE_MSA = 0x00000200 +MIPS_AFL_ASE_MIPS16 = 0x00000400 +MIPS_AFL_ASE_MICROMIPS = 0x00000800 +MIPS_AFL_ASE_XPA = 0x00001000 +MIPS_AFL_ASE_MASK = 0x00001fff +MIPS_AFL_EXT_XLR = 1 +MIPS_AFL_EXT_OCTEON2 = 2 +MIPS_AFL_EXT_OCTEONP = 3 +MIPS_AFL_EXT_LOONGSON_3A = 4 +MIPS_AFL_EXT_OCTEON = 5 +MIPS_AFL_EXT_5900 = 6 +MIPS_AFL_EXT_4650 = 7 +MIPS_AFL_EXT_4010 = 8 +MIPS_AFL_EXT_4100 = 9 +MIPS_AFL_EXT_3900 = 10 +MIPS_AFL_EXT_10000 = 11 +MIPS_AFL_EXT_SB1 = 12 +MIPS_AFL_EXT_4111 = 13 +MIPS_AFL_EXT_4120 = 14 +MIPS_AFL_EXT_5400 = 15 +MIPS_AFL_EXT_5500 = 16 +MIPS_AFL_EXT_LOONGSON_2E = 17 +MIPS_AFL_EXT_LOONGSON_2F = 18 +MIPS_AFL_FLAGS1_ODDSPREG = 1 +EF_PARISC_TRAPNIL = 0x00010000 +EF_PARISC_EXT = 0x00020000 +EF_PARISC_LSB = 0x00040000 +EF_PARISC_WIDE = 0x00080000 +EF_PARISC_NO_KABP = 0x00100000 +EF_PARISC_LAZYSWAP = 0x00400000 +EF_PARISC_ARCH = 0x0000ffff +EFA_PARISC_1_0 = 0x020b +EFA_PARISC_1_1 = 0x0210 +EFA_PARISC_2_0 = 0x0214 +SHN_PARISC_ANSI_COMMON = 0xff00 +SHN_PARISC_HUGE_COMMON = 0xff01 +SHT_PARISC_EXT = 0x70000000 +SHT_PARISC_UNWIND = 0x70000001 +SHT_PARISC_DOC = 0x70000002 +SHF_PARISC_SHORT = 0x20000000 +SHF_PARISC_HUGE = 0x40000000 +SHF_PARISC_SBP = 0x80000000 +STT_PARISC_MILLICODE = 13 +STT_HP_OPAQUE = (STT_LOOS + 0x1) +STT_HP_STUB = (STT_LOOS + 0x2) +R_PARISC_NONE = 0 +R_PARISC_DIR32 = 1 +R_PARISC_DIR21L = 2 +R_PARISC_DIR17R = 3 +R_PARISC_DIR17F = 4 +R_PARISC_DIR14R = 6 +R_PARISC_PCREL32 = 9 +R_PARISC_PCREL21L = 10 +R_PARISC_PCREL17R = 11 +R_PARISC_PCREL17F = 12 +R_PARISC_PCREL14R = 14 +R_PARISC_DPREL21L = 18 +R_PARISC_DPREL14R = 22 +R_PARISC_GPREL21L = 26 +R_PARISC_GPREL14R = 30 +R_PARISC_LTOFF21L = 34 +R_PARISC_LTOFF14R = 38 +R_PARISC_SECREL32 = 41 +R_PARISC_SEGBASE = 48 +R_PARISC_SEGREL32 = 49 +R_PARISC_PLTOFF21L = 50 +R_PARISC_PLTOFF14R = 54 +R_PARISC_LTOFF_FPTR32 = 57 +R_PARISC_LTOFF_FPTR21L = 58 +R_PARISC_LTOFF_FPTR14R = 62 +R_PARISC_FPTR64 = 64 +R_PARISC_PLABEL32 = 65 +R_PARISC_PLABEL21L = 66 +R_PARISC_PLABEL14R = 70 +R_PARISC_PCREL64 = 72 +R_PARISC_PCREL22F = 74 +R_PARISC_PCREL14WR = 75 +R_PARISC_PCREL14DR = 76 +R_PARISC_PCREL16F = 77 +R_PARISC_PCREL16WF = 78 +R_PARISC_PCREL16DF = 79 +R_PARISC_DIR64 = 80 +R_PARISC_DIR14WR = 83 +R_PARISC_DIR14DR = 84 +R_PARISC_DIR16F = 85 +R_PARISC_DIR16WF = 86 +R_PARISC_DIR16DF = 87 +R_PARISC_GPREL64 = 88 +R_PARISC_GPREL14WR = 91 +R_PARISC_GPREL14DR = 92 +R_PARISC_GPREL16F = 93 +R_PARISC_GPREL16WF = 94 +R_PARISC_GPREL16DF = 95 +R_PARISC_LTOFF64 = 96 +R_PARISC_LTOFF14WR = 99 +R_PARISC_LTOFF14DR = 100 +R_PARISC_LTOFF16F = 101 +R_PARISC_LTOFF16WF = 102 +R_PARISC_LTOFF16DF = 103 +R_PARISC_SECREL64 = 104 +R_PARISC_SEGREL64 = 112 +R_PARISC_PLTOFF14WR = 115 +R_PARISC_PLTOFF14DR = 116 +R_PARISC_PLTOFF16F = 117 +R_PARISC_PLTOFF16WF = 118 +R_PARISC_PLTOFF16DF = 119 +R_PARISC_LTOFF_FPTR64 = 120 +R_PARISC_LTOFF_FPTR14WR = 123 +R_PARISC_LTOFF_FPTR14DR = 124 +R_PARISC_LTOFF_FPTR16F = 125 +R_PARISC_LTOFF_FPTR16WF = 126 +R_PARISC_LTOFF_FPTR16DF = 127 +R_PARISC_LORESERVE = 128 +R_PARISC_COPY = 128 +R_PARISC_IPLT = 129 +R_PARISC_EPLT = 130 +R_PARISC_TPREL32 = 153 +R_PARISC_TPREL21L = 154 +R_PARISC_TPREL14R = 158 +R_PARISC_LTOFF_TP21L = 162 +R_PARISC_LTOFF_TP14R = 166 +R_PARISC_LTOFF_TP14F = 167 +R_PARISC_TPREL64 = 216 +R_PARISC_TPREL14WR = 219 +R_PARISC_TPREL14DR = 220 +R_PARISC_TPREL16F = 221 +R_PARISC_TPREL16WF = 222 +R_PARISC_TPREL16DF = 223 +R_PARISC_LTOFF_TP64 = 224 +R_PARISC_LTOFF_TP14WR = 227 +R_PARISC_LTOFF_TP14DR = 228 +R_PARISC_LTOFF_TP16F = 229 +R_PARISC_LTOFF_TP16WF = 230 +R_PARISC_LTOFF_TP16DF = 231 +R_PARISC_GNU_VTENTRY = 232 +R_PARISC_GNU_VTINHERIT = 233 +R_PARISC_TLS_GD21L = 234 +R_PARISC_TLS_GD14R = 235 +R_PARISC_TLS_GDCALL = 236 +R_PARISC_TLS_LDM21L = 237 +R_PARISC_TLS_LDM14R = 238 +R_PARISC_TLS_LDMCALL = 239 +R_PARISC_TLS_LDO21L = 240 +R_PARISC_TLS_LDO14R = 241 +R_PARISC_TLS_DTPMOD32 = 242 +R_PARISC_TLS_DTPMOD64 = 243 +R_PARISC_TLS_DTPOFF32 = 244 +R_PARISC_TLS_DTPOFF64 = 245 +R_PARISC_TLS_LE21L = R_PARISC_TPREL21L +R_PARISC_TLS_LE14R = R_PARISC_TPREL14R +R_PARISC_TLS_IE21L = R_PARISC_LTOFF_TP21L +R_PARISC_TLS_IE14R = R_PARISC_LTOFF_TP14R +R_PARISC_TLS_TPREL32 = R_PARISC_TPREL32 +R_PARISC_TLS_TPREL64 = R_PARISC_TPREL64 +R_PARISC_HIRESERVE = 255 +PT_HP_TLS = (PT_LOOS + 0x0) +PT_HP_CORE_NONE = (PT_LOOS + 0x1) +PT_HP_CORE_VERSION = (PT_LOOS + 0x2) +PT_HP_CORE_KERNEL = (PT_LOOS + 0x3) +PT_HP_CORE_COMM = (PT_LOOS + 0x4) +PT_HP_CORE_PROC = (PT_LOOS + 0x5) +PT_HP_CORE_LOADABLE = (PT_LOOS + 0x6) +PT_HP_CORE_STACK = (PT_LOOS + 0x7) +PT_HP_CORE_SHM = (PT_LOOS + 0x8) +PT_HP_CORE_MMF = (PT_LOOS + 0x9) +PT_HP_PARALLEL = (PT_LOOS + 0x10) +PT_HP_FASTBIND = (PT_LOOS + 0x11) +PT_HP_OPT_ANNOT = (PT_LOOS + 0x12) +PT_HP_HSL_ANNOT = (PT_LOOS + 0x13) +PT_HP_STACK = (PT_LOOS + 0x14) +PT_PARISC_ARCHEXT = 0x70000000 +PT_PARISC_UNWIND = 0x70000001 +PF_PARISC_SBP = 0x08000000 +PF_HP_PAGE_SIZE = 0x00100000 +PF_HP_FAR_SHARED = 0x00200000 +PF_HP_NEAR_SHARED = 0x00400000 +PF_HP_CODE = 0x01000000 +PF_HP_MODIFY = 0x02000000 +PF_HP_LAZYSWAP = 0x04000000 +PF_HP_SBP = 0x08000000 +EF_ALPHA_32BIT = 1 +EF_ALPHA_CANRELAX = 2 +SHT_ALPHA_DEBUG = 0x70000001 +SHT_ALPHA_REGINFO = 0x70000002 +SHF_ALPHA_GPREL = 0x10000000 +STO_ALPHA_NOPV = 0x80 +STO_ALPHA_STD_GPLOAD = 0x88 +R_ALPHA_NONE = 0 +R_ALPHA_REFLONG = 1 +R_ALPHA_REFQUAD = 2 +R_ALPHA_GPREL32 = 3 +R_ALPHA_LITERAL = 4 +R_ALPHA_LITUSE = 5 +R_ALPHA_GPDISP = 6 +R_ALPHA_BRADDR = 7 +R_ALPHA_HINT = 8 +R_ALPHA_SREL16 = 9 +R_ALPHA_SREL32 = 10 +R_ALPHA_SREL64 = 11 +R_ALPHA_GPRELHIGH = 17 +R_ALPHA_GPRELLOW = 18 +R_ALPHA_GPREL16 = 19 +R_ALPHA_COPY = 24 +R_ALPHA_GLOB_DAT = 25 +R_ALPHA_JMP_SLOT = 26 +R_ALPHA_RELATIVE = 27 +R_ALPHA_TLS_GD_HI = 28 +R_ALPHA_TLSGD = 29 +R_ALPHA_TLS_LDM = 30 +R_ALPHA_DTPMOD64 = 31 +R_ALPHA_GOTDTPREL = 32 +R_ALPHA_DTPREL64 = 33 +R_ALPHA_DTPRELHI = 34 +R_ALPHA_DTPRELLO = 35 +R_ALPHA_DTPREL16 = 36 +R_ALPHA_GOTTPREL = 37 +R_ALPHA_TPREL64 = 38 +R_ALPHA_TPRELHI = 39 +R_ALPHA_TPRELLO = 40 +R_ALPHA_TPREL16 = 41 +R_ALPHA_NUM = 46 +LITUSE_ALPHA_ADDR = 0 +LITUSE_ALPHA_BASE = 1 +LITUSE_ALPHA_BYTOFF = 2 +LITUSE_ALPHA_JSR = 3 +LITUSE_ALPHA_TLS_GD = 4 +LITUSE_ALPHA_TLS_LDM = 5 +DT_ALPHA_PLTRO = (DT_LOPROC + 0) +DT_ALPHA_NUM = 1 +EF_PPC_EMB = 0x80000000 +EF_PPC_RELOCATABLE = 0x00010000 +EF_PPC_RELOCATABLE_LIB = 0x00008000 +R_PPC_NONE = 0 +R_PPC_ADDR32 = 1 +R_PPC_ADDR24 = 2 +R_PPC_ADDR16 = 3 +R_PPC_ADDR16_LO = 4 +R_PPC_ADDR16_HI = 5 +R_PPC_ADDR16_HA = 6 +R_PPC_ADDR14 = 7 +R_PPC_ADDR14_BRTAKEN = 8 +R_PPC_ADDR14_BRNTAKEN = 9 +R_PPC_REL24 = 10 +R_PPC_REL14 = 11 +R_PPC_REL14_BRTAKEN = 12 +R_PPC_REL14_BRNTAKEN = 13 +R_PPC_GOT16 = 14 +R_PPC_GOT16_LO = 15 +R_PPC_GOT16_HI = 16 +R_PPC_GOT16_HA = 17 +R_PPC_PLTREL24 = 18 +R_PPC_COPY = 19 +R_PPC_GLOB_DAT = 20 +R_PPC_JMP_SLOT = 21 +R_PPC_RELATIVE = 22 +R_PPC_LOCAL24PC = 23 +R_PPC_UADDR32 = 24 +R_PPC_UADDR16 = 25 +R_PPC_REL32 = 26 +R_PPC_PLT32 = 27 +R_PPC_PLTREL32 = 28 +R_PPC_PLT16_LO = 29 +R_PPC_PLT16_HI = 30 +R_PPC_PLT16_HA = 31 +R_PPC_SDAREL16 = 32 +R_PPC_SECTOFF = 33 +R_PPC_SECTOFF_LO = 34 +R_PPC_SECTOFF_HI = 35 +R_PPC_SECTOFF_HA = 36 +R_PPC_TLS = 67 +R_PPC_DTPMOD32 = 68 +R_PPC_TPREL16 = 69 +R_PPC_TPREL16_LO = 70 +R_PPC_TPREL16_HI = 71 +R_PPC_TPREL16_HA = 72 +R_PPC_TPREL32 = 73 +R_PPC_DTPREL16 = 74 +R_PPC_DTPREL16_LO = 75 +R_PPC_DTPREL16_HI = 76 +R_PPC_DTPREL16_HA = 77 +R_PPC_DTPREL32 = 78 +R_PPC_GOT_TLSGD16 = 79 +R_PPC_GOT_TLSGD16_LO = 80 +R_PPC_GOT_TLSGD16_HI = 81 +R_PPC_GOT_TLSGD16_HA = 82 +R_PPC_GOT_TLSLD16 = 83 +R_PPC_GOT_TLSLD16_LO = 84 +R_PPC_GOT_TLSLD16_HI = 85 +R_PPC_GOT_TLSLD16_HA = 86 +R_PPC_GOT_TPREL16 = 87 +R_PPC_GOT_TPREL16_LO = 88 +R_PPC_GOT_TPREL16_HI = 89 +R_PPC_GOT_TPREL16_HA = 90 +R_PPC_GOT_DTPREL16 = 91 +R_PPC_GOT_DTPREL16_LO = 92 +R_PPC_GOT_DTPREL16_HI = 93 +R_PPC_GOT_DTPREL16_HA = 94 +R_PPC_TLSGD = 95 +R_PPC_TLSLD = 96 +R_PPC_EMB_NADDR32 = 101 +R_PPC_EMB_NADDR16 = 102 +R_PPC_EMB_NADDR16_LO = 103 +R_PPC_EMB_NADDR16_HI = 104 +R_PPC_EMB_NADDR16_HA = 105 +R_PPC_EMB_SDAI16 = 106 +R_PPC_EMB_SDA2I16 = 107 +R_PPC_EMB_SDA2REL = 108 +R_PPC_EMB_SDA21 = 109 +R_PPC_EMB_MRKREF = 110 +R_PPC_EMB_RELSEC16 = 111 +R_PPC_EMB_RELST_LO = 112 +R_PPC_EMB_RELST_HI = 113 +R_PPC_EMB_RELST_HA = 114 +R_PPC_EMB_BIT_FLD = 115 +R_PPC_EMB_RELSDA = 116 +R_PPC_DIAB_SDA21_LO = 180 +R_PPC_DIAB_SDA21_HI = 181 +R_PPC_DIAB_SDA21_HA = 182 +R_PPC_DIAB_RELSDA_LO = 183 +R_PPC_DIAB_RELSDA_HI = 184 +R_PPC_DIAB_RELSDA_HA = 185 +R_PPC_IRELATIVE = 248 +R_PPC_REL16 = 249 +R_PPC_REL16_LO = 250 +R_PPC_REL16_HI = 251 +R_PPC_REL16_HA = 252 +R_PPC_TOC16 = 255 +DT_PPC_GOT = (DT_LOPROC + 0) +DT_PPC_OPT = (DT_LOPROC + 1) +DT_PPC_NUM = 2 +PPC_OPT_TLS = 1 +R_PPC64_NONE = R_PPC_NONE +R_PPC64_ADDR32 = R_PPC_ADDR32 +R_PPC64_ADDR24 = R_PPC_ADDR24 +R_PPC64_ADDR16 = R_PPC_ADDR16 +R_PPC64_ADDR16_LO = R_PPC_ADDR16_LO +R_PPC64_ADDR16_HI = R_PPC_ADDR16_HI +R_PPC64_ADDR16_HA = R_PPC_ADDR16_HA +R_PPC64_ADDR14 = R_PPC_ADDR14 +R_PPC64_ADDR14_BRTAKEN = R_PPC_ADDR14_BRTAKEN +R_PPC64_ADDR14_BRNTAKEN = R_PPC_ADDR14_BRNTAKEN +R_PPC64_REL24 = R_PPC_REL24 +R_PPC64_REL14 = R_PPC_REL14 +R_PPC64_REL14_BRTAKEN = R_PPC_REL14_BRTAKEN +R_PPC64_REL14_BRNTAKEN = R_PPC_REL14_BRNTAKEN +R_PPC64_GOT16 = R_PPC_GOT16 +R_PPC64_GOT16_LO = R_PPC_GOT16_LO +R_PPC64_GOT16_HI = R_PPC_GOT16_HI +R_PPC64_GOT16_HA = R_PPC_GOT16_HA +R_PPC64_COPY = R_PPC_COPY +R_PPC64_GLOB_DAT = R_PPC_GLOB_DAT +R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT +R_PPC64_RELATIVE = R_PPC_RELATIVE +R_PPC64_UADDR32 = R_PPC_UADDR32 +R_PPC64_UADDR16 = R_PPC_UADDR16 +R_PPC64_REL32 = R_PPC_REL32 +R_PPC64_PLT32 = R_PPC_PLT32 +R_PPC64_PLTREL32 = R_PPC_PLTREL32 +R_PPC64_PLT16_LO = R_PPC_PLT16_LO +R_PPC64_PLT16_HI = R_PPC_PLT16_HI +R_PPC64_PLT16_HA = R_PPC_PLT16_HA +R_PPC64_SECTOFF = R_PPC_SECTOFF +R_PPC64_SECTOFF_LO = R_PPC_SECTOFF_LO +R_PPC64_SECTOFF_HI = R_PPC_SECTOFF_HI +R_PPC64_SECTOFF_HA = R_PPC_SECTOFF_HA +R_PPC64_ADDR30 = 37 +R_PPC64_ADDR64 = 38 +R_PPC64_ADDR16_HIGHER = 39 +R_PPC64_ADDR16_HIGHERA = 40 +R_PPC64_ADDR16_HIGHEST = 41 +R_PPC64_ADDR16_HIGHESTA = 42 +R_PPC64_UADDR64 = 43 +R_PPC64_REL64 = 44 +R_PPC64_PLT64 = 45 +R_PPC64_PLTREL64 = 46 +R_PPC64_TOC16 = 47 +R_PPC64_TOC16_LO = 48 +R_PPC64_TOC16_HI = 49 +R_PPC64_TOC16_HA = 50 +R_PPC64_TOC = 51 +R_PPC64_PLTGOT16 = 52 +R_PPC64_PLTGOT16_LO = 53 +R_PPC64_PLTGOT16_HI = 54 +R_PPC64_PLTGOT16_HA = 55 +R_PPC64_ADDR16_DS = 56 +R_PPC64_ADDR16_LO_DS = 57 +R_PPC64_GOT16_DS = 58 +R_PPC64_GOT16_LO_DS = 59 +R_PPC64_PLT16_LO_DS = 60 +R_PPC64_SECTOFF_DS = 61 +R_PPC64_SECTOFF_LO_DS = 62 +R_PPC64_TOC16_DS = 63 +R_PPC64_TOC16_LO_DS = 64 +R_PPC64_PLTGOT16_DS = 65 +R_PPC64_PLTGOT16_LO_DS = 66 +R_PPC64_TLS = 67 +R_PPC64_DTPMOD64 = 68 +R_PPC64_TPREL16 = 69 +R_PPC64_TPREL16_LO = 70 +R_PPC64_TPREL16_HI = 71 +R_PPC64_TPREL16_HA = 72 +R_PPC64_TPREL64 = 73 +R_PPC64_DTPREL16 = 74 +R_PPC64_DTPREL16_LO = 75 +R_PPC64_DTPREL16_HI = 76 +R_PPC64_DTPREL16_HA = 77 +R_PPC64_DTPREL64 = 78 +R_PPC64_GOT_TLSGD16 = 79 +R_PPC64_GOT_TLSGD16_LO = 80 +R_PPC64_GOT_TLSGD16_HI = 81 +R_PPC64_GOT_TLSGD16_HA = 82 +R_PPC64_GOT_TLSLD16 = 83 +R_PPC64_GOT_TLSLD16_LO = 84 +R_PPC64_GOT_TLSLD16_HI = 85 +R_PPC64_GOT_TLSLD16_HA = 86 +R_PPC64_GOT_TPREL16_DS = 87 +R_PPC64_GOT_TPREL16_LO_DS = 88 +R_PPC64_GOT_TPREL16_HI = 89 +R_PPC64_GOT_TPREL16_HA = 90 +R_PPC64_GOT_DTPREL16_DS = 91 +R_PPC64_GOT_DTPREL16_LO_DS = 92 +R_PPC64_GOT_DTPREL16_HI = 93 +R_PPC64_GOT_DTPREL16_HA = 94 +R_PPC64_TPREL16_DS = 95 +R_PPC64_TPREL16_LO_DS = 96 +R_PPC64_TPREL16_HIGHER = 97 +R_PPC64_TPREL16_HIGHERA = 98 +R_PPC64_TPREL16_HIGHEST = 99 +R_PPC64_TPREL16_HIGHESTA = 100 +R_PPC64_DTPREL16_DS = 101 +R_PPC64_DTPREL16_LO_DS = 102 +R_PPC64_DTPREL16_HIGHER = 103 +R_PPC64_DTPREL16_HIGHERA = 104 +R_PPC64_DTPREL16_HIGHEST = 105 +R_PPC64_DTPREL16_HIGHESTA = 106 +R_PPC64_TLSGD = 107 +R_PPC64_TLSLD = 108 +R_PPC64_TOCSAVE = 109 +R_PPC64_ADDR16_HIGH = 110 +R_PPC64_ADDR16_HIGHA = 111 +R_PPC64_TPREL16_HIGH = 112 +R_PPC64_TPREL16_HIGHA = 113 +R_PPC64_DTPREL16_HIGH = 114 +R_PPC64_DTPREL16_HIGHA = 115 +R_PPC64_JMP_IREL = 247 +R_PPC64_IRELATIVE = 248 +R_PPC64_REL16 = 249 +R_PPC64_REL16_LO = 250 +R_PPC64_REL16_HI = 251 +R_PPC64_REL16_HA = 252 +EF_PPC64_ABI = 3 +DT_PPC64_GLINK = (DT_LOPROC + 0) +DT_PPC64_OPD = (DT_LOPROC + 1) +DT_PPC64_OPDSZ = (DT_LOPROC + 2) +DT_PPC64_OPT = (DT_LOPROC + 3) +DT_PPC64_NUM = 4 +PPC64_OPT_TLS = 1 +PPC64_OPT_MULTI_TOC = 2 +PPC64_OPT_LOCALENTRY = 4 +STO_PPC64_LOCAL_BIT = 5 +STO_PPC64_LOCAL_MASK = (7 << STO_PPC64_LOCAL_BIT) +PPC64_LOCAL_ENTRY_OFFSET = lambda other: (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2) # type: ignore +EF_ARM_RELEXEC = 0x01 +EF_ARM_HASENTRY = 0x02 +EF_ARM_INTERWORK = 0x04 +EF_ARM_APCS_26 = 0x08 +EF_ARM_APCS_FLOAT = 0x10 +EF_ARM_PIC = 0x20 +EF_ARM_ALIGN8 = 0x40 +EF_ARM_NEW_ABI = 0x80 +EF_ARM_OLD_ABI = 0x100 +EF_ARM_SOFT_FLOAT = 0x200 +EF_ARM_VFP_FLOAT = 0x400 +EF_ARM_MAVERICK_FLOAT = 0x800 +EF_ARM_ABI_FLOAT_SOFT = 0x200 +EF_ARM_ABI_FLOAT_HARD = 0x400 +EF_ARM_SYMSARESORTED = 0x04 +EF_ARM_DYNSYMSUSESEGIDX = 0x08 +EF_ARM_MAPSYMSFIRST = 0x10 +EF_ARM_EABIMASK = 0XFF000000 +EF_ARM_BE8 = 0x00800000 +EF_ARM_LE8 = 0x00400000 +EF_ARM_EABI_VERSION = lambda flags: ((flags) & EF_ARM_EABIMASK) # type: ignore +EF_ARM_EABI_UNKNOWN = 0x00000000 +EF_ARM_EABI_VER1 = 0x01000000 +EF_ARM_EABI_VER2 = 0x02000000 +EF_ARM_EABI_VER3 = 0x03000000 +EF_ARM_EABI_VER4 = 0x04000000 +EF_ARM_EABI_VER5 = 0x05000000 +STT_ARM_TFUNC = STT_LOPROC +STT_ARM_16BIT = STT_HIPROC +SHF_ARM_ENTRYSECT = 0x10000000 +SHF_ARM_COMDEF = 0x80000000 +PF_ARM_SB = 0x10000000 +PF_ARM_PI = 0x20000000 +PF_ARM_ABS = 0x40000000 +PT_ARM_EXIDX = (PT_LOPROC + 1) +SHT_ARM_EXIDX = (SHT_LOPROC + 1) +SHT_ARM_PREEMPTMAP = (SHT_LOPROC + 2) +SHT_ARM_ATTRIBUTES = (SHT_LOPROC + 3) +R_AARCH64_NONE = 0 +R_AARCH64_P32_ABS32 = 1 +R_AARCH64_P32_COPY = 180 +R_AARCH64_P32_GLOB_DAT = 181 +R_AARCH64_P32_JUMP_SLOT = 182 +R_AARCH64_P32_RELATIVE = 183 +R_AARCH64_P32_TLS_DTPMOD = 184 +R_AARCH64_P32_TLS_DTPREL = 185 +R_AARCH64_P32_TLS_TPREL = 186 +R_AARCH64_P32_TLSDESC = 187 +R_AARCH64_P32_IRELATIVE = 188 +R_AARCH64_ABS64 = 257 +R_AARCH64_ABS32 = 258 +R_AARCH64_ABS16 = 259 +R_AARCH64_PREL64 = 260 +R_AARCH64_PREL32 = 261 +R_AARCH64_PREL16 = 262 +R_AARCH64_MOVW_UABS_G0 = 263 +R_AARCH64_MOVW_UABS_G0_NC = 264 +R_AARCH64_MOVW_UABS_G1 = 265 +R_AARCH64_MOVW_UABS_G1_NC = 266 +R_AARCH64_MOVW_UABS_G2 = 267 +R_AARCH64_MOVW_UABS_G2_NC = 268 +R_AARCH64_MOVW_UABS_G3 = 269 +R_AARCH64_MOVW_SABS_G0 = 270 +R_AARCH64_MOVW_SABS_G1 = 271 +R_AARCH64_MOVW_SABS_G2 = 272 +R_AARCH64_LD_PREL_LO19 = 273 +R_AARCH64_ADR_PREL_LO21 = 274 +R_AARCH64_ADR_PREL_PG_HI21 = 275 +R_AARCH64_ADR_PREL_PG_HI21_NC = 276 +R_AARCH64_ADD_ABS_LO12_NC = 277 +R_AARCH64_LDST8_ABS_LO12_NC = 278 +R_AARCH64_TSTBR14 = 279 +R_AARCH64_CONDBR19 = 280 +R_AARCH64_JUMP26 = 282 +R_AARCH64_CALL26 = 283 +R_AARCH64_LDST16_ABS_LO12_NC = 284 +R_AARCH64_LDST32_ABS_LO12_NC = 285 +R_AARCH64_LDST64_ABS_LO12_NC = 286 +R_AARCH64_MOVW_PREL_G0 = 287 +R_AARCH64_MOVW_PREL_G0_NC = 288 +R_AARCH64_MOVW_PREL_G1 = 289 +R_AARCH64_MOVW_PREL_G1_NC = 290 +R_AARCH64_MOVW_PREL_G2 = 291 +R_AARCH64_MOVW_PREL_G2_NC = 292 +R_AARCH64_MOVW_PREL_G3 = 293 +R_AARCH64_LDST128_ABS_LO12_NC = 299 +R_AARCH64_MOVW_GOTOFF_G0 = 300 +R_AARCH64_MOVW_GOTOFF_G0_NC = 301 +R_AARCH64_MOVW_GOTOFF_G1 = 302 +R_AARCH64_MOVW_GOTOFF_G1_NC = 303 +R_AARCH64_MOVW_GOTOFF_G2 = 304 +R_AARCH64_MOVW_GOTOFF_G2_NC = 305 +R_AARCH64_MOVW_GOTOFF_G3 = 306 +R_AARCH64_GOTREL64 = 307 +R_AARCH64_GOTREL32 = 308 +R_AARCH64_GOT_LD_PREL19 = 309 +R_AARCH64_LD64_GOTOFF_LO15 = 310 +R_AARCH64_ADR_GOT_PAGE = 311 +R_AARCH64_LD64_GOT_LO12_NC = 312 +R_AARCH64_LD64_GOTPAGE_LO15 = 313 +R_AARCH64_TLSGD_ADR_PREL21 = 512 +R_AARCH64_TLSGD_ADR_PAGE21 = 513 +R_AARCH64_TLSGD_ADD_LO12_NC = 514 +R_AARCH64_TLSGD_MOVW_G1 = 515 +R_AARCH64_TLSGD_MOVW_G0_NC = 516 +R_AARCH64_TLSLD_ADR_PREL21 = 517 +R_AARCH64_TLSLD_ADR_PAGE21 = 518 +R_AARCH64_TLSLD_ADD_LO12_NC = 519 +R_AARCH64_TLSLD_MOVW_G1 = 520 +R_AARCH64_TLSLD_MOVW_G0_NC = 521 +R_AARCH64_TLSLD_LD_PREL19 = 522 +R_AARCH64_TLSLD_MOVW_DTPREL_G2 = 523 +R_AARCH64_TLSLD_MOVW_DTPREL_G1 = 524 +R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC = 525 +R_AARCH64_TLSLD_MOVW_DTPREL_G0 = 526 +R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC = 527 +R_AARCH64_TLSLD_ADD_DTPREL_HI12 = 528 +R_AARCH64_TLSLD_ADD_DTPREL_LO12 = 529 +R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC = 530 +R_AARCH64_TLSLD_LDST8_DTPREL_LO12 = 531 +R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC = 532 +R_AARCH64_TLSLD_LDST16_DTPREL_LO12 = 533 +R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC = 534 +R_AARCH64_TLSLD_LDST32_DTPREL_LO12 = 535 +R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC = 536 +R_AARCH64_TLSLD_LDST64_DTPREL_LO12 = 537 +R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC = 538 +R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 = 539 +R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC = 540 +R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 = 541 +R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 542 +R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 = 543 +R_AARCH64_TLSLE_MOVW_TPREL_G2 = 544 +R_AARCH64_TLSLE_MOVW_TPREL_G1 = 545 +R_AARCH64_TLSLE_MOVW_TPREL_G1_NC = 546 +R_AARCH64_TLSLE_MOVW_TPREL_G0 = 547 +R_AARCH64_TLSLE_MOVW_TPREL_G0_NC = 548 +R_AARCH64_TLSLE_ADD_TPREL_HI12 = 549 +R_AARCH64_TLSLE_ADD_TPREL_LO12 = 550 +R_AARCH64_TLSLE_ADD_TPREL_LO12_NC = 551 +R_AARCH64_TLSLE_LDST8_TPREL_LO12 = 552 +R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC = 553 +R_AARCH64_TLSLE_LDST16_TPREL_LO12 = 554 +R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC = 555 +R_AARCH64_TLSLE_LDST32_TPREL_LO12 = 556 +R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC = 557 +R_AARCH64_TLSLE_LDST64_TPREL_LO12 = 558 +R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC = 559 +R_AARCH64_TLSDESC_LD_PREL19 = 560 +R_AARCH64_TLSDESC_ADR_PREL21 = 561 +R_AARCH64_TLSDESC_ADR_PAGE21 = 562 +R_AARCH64_TLSDESC_LD64_LO12 = 563 +R_AARCH64_TLSDESC_ADD_LO12 = 564 +R_AARCH64_TLSDESC_OFF_G1 = 565 +R_AARCH64_TLSDESC_OFF_G0_NC = 566 +R_AARCH64_TLSDESC_LDR = 567 +R_AARCH64_TLSDESC_ADD = 568 +R_AARCH64_TLSDESC_CALL = 569 +R_AARCH64_TLSLE_LDST128_TPREL_LO12 = 570 +R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC = 571 +R_AARCH64_TLSLD_LDST128_DTPREL_LO12 = 572 +R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC = 573 +R_AARCH64_COPY = 1024 +R_AARCH64_GLOB_DAT = 1025 +R_AARCH64_JUMP_SLOT = 1026 +R_AARCH64_RELATIVE = 1027 +R_AARCH64_TLS_DTPMOD = 1028 +R_AARCH64_TLS_DTPREL = 1029 +R_AARCH64_TLS_TPREL = 1030 +R_AARCH64_TLSDESC = 1031 +R_AARCH64_IRELATIVE = 1032 +PT_AARCH64_MEMTAG_MTE = (PT_LOPROC + 2) +DT_AARCH64_BTI_PLT = (DT_LOPROC + 1) +DT_AARCH64_PAC_PLT = (DT_LOPROC + 3) +DT_AARCH64_VARIANT_PCS = (DT_LOPROC + 5) +DT_AARCH64_NUM = 6 +STO_AARCH64_VARIANT_PCS = 0x80 +R_ARM_NONE = 0 +R_ARM_PC24 = 1 +R_ARM_ABS32 = 2 +R_ARM_REL32 = 3 +R_ARM_PC13 = 4 +R_ARM_ABS16 = 5 +R_ARM_ABS12 = 6 +R_ARM_THM_ABS5 = 7 +R_ARM_ABS8 = 8 +R_ARM_SBREL32 = 9 +R_ARM_THM_PC22 = 10 +R_ARM_THM_PC8 = 11 +R_ARM_AMP_VCALL9 = 12 +R_ARM_SWI24 = 13 +R_ARM_TLS_DESC = 13 +R_ARM_THM_SWI8 = 14 +R_ARM_XPC25 = 15 +R_ARM_THM_XPC22 = 16 +R_ARM_TLS_DTPMOD32 = 17 +R_ARM_TLS_DTPOFF32 = 18 +R_ARM_TLS_TPOFF32 = 19 +R_ARM_COPY = 20 +R_ARM_GLOB_DAT = 21 +R_ARM_JUMP_SLOT = 22 +R_ARM_RELATIVE = 23 +R_ARM_GOTOFF = 24 +R_ARM_GOTPC = 25 +R_ARM_GOT32 = 26 +R_ARM_PLT32 = 27 +R_ARM_CALL = 28 +R_ARM_JUMP24 = 29 +R_ARM_THM_JUMP24 = 30 +R_ARM_BASE_ABS = 31 +R_ARM_ALU_PCREL_7_0 = 32 +R_ARM_ALU_PCREL_15_8 = 33 +R_ARM_ALU_PCREL_23_15 = 34 +R_ARM_LDR_SBREL_11_0 = 35 +R_ARM_ALU_SBREL_19_12 = 36 +R_ARM_ALU_SBREL_27_20 = 37 +R_ARM_TARGET1 = 38 +R_ARM_SBREL31 = 39 +R_ARM_V4BX = 40 +R_ARM_TARGET2 = 41 +R_ARM_PREL31 = 42 +R_ARM_MOVW_ABS_NC = 43 +R_ARM_MOVT_ABS = 44 +R_ARM_MOVW_PREL_NC = 45 +R_ARM_MOVT_PREL = 46 +R_ARM_THM_MOVW_ABS_NC = 47 +R_ARM_THM_MOVT_ABS = 48 +R_ARM_THM_MOVW_PREL_NC = 49 +R_ARM_THM_MOVT_PREL = 50 +R_ARM_THM_JUMP19 = 51 +R_ARM_THM_JUMP6 = 52 +R_ARM_THM_ALU_PREL_11_0 = 53 +R_ARM_THM_PC12 = 54 +R_ARM_ABS32_NOI = 55 +R_ARM_REL32_NOI = 56 +R_ARM_ALU_PC_G0_NC = 57 +R_ARM_ALU_PC_G0 = 58 +R_ARM_ALU_PC_G1_NC = 59 +R_ARM_ALU_PC_G1 = 60 +R_ARM_ALU_PC_G2 = 61 +R_ARM_LDR_PC_G1 = 62 +R_ARM_LDR_PC_G2 = 63 +R_ARM_LDRS_PC_G0 = 64 +R_ARM_LDRS_PC_G1 = 65 +R_ARM_LDRS_PC_G2 = 66 +R_ARM_LDC_PC_G0 = 67 +R_ARM_LDC_PC_G1 = 68 +R_ARM_LDC_PC_G2 = 69 +R_ARM_ALU_SB_G0_NC = 70 +R_ARM_ALU_SB_G0 = 71 +R_ARM_ALU_SB_G1_NC = 72 +R_ARM_ALU_SB_G1 = 73 +R_ARM_ALU_SB_G2 = 74 +R_ARM_LDR_SB_G0 = 75 +R_ARM_LDR_SB_G1 = 76 +R_ARM_LDR_SB_G2 = 77 +R_ARM_LDRS_SB_G0 = 78 +R_ARM_LDRS_SB_G1 = 79 +R_ARM_LDRS_SB_G2 = 80 +R_ARM_LDC_SB_G0 = 81 +R_ARM_LDC_SB_G1 = 82 +R_ARM_LDC_SB_G2 = 83 +R_ARM_MOVW_BREL_NC = 84 +R_ARM_MOVT_BREL = 85 +R_ARM_MOVW_BREL = 86 +R_ARM_THM_MOVW_BREL_NC = 87 +R_ARM_THM_MOVT_BREL = 88 +R_ARM_THM_MOVW_BREL = 89 +R_ARM_TLS_GOTDESC = 90 +R_ARM_TLS_CALL = 91 +R_ARM_TLS_DESCSEQ = 92 +R_ARM_THM_TLS_CALL = 93 +R_ARM_PLT32_ABS = 94 +R_ARM_GOT_ABS = 95 +R_ARM_GOT_PREL = 96 +R_ARM_GOT_BREL12 = 97 +R_ARM_GOTOFF12 = 98 +R_ARM_GOTRELAX = 99 +R_ARM_GNU_VTENTRY = 100 +R_ARM_GNU_VTINHERIT = 101 +R_ARM_THM_PC11 = 102 +R_ARM_THM_PC9 = 103 +R_ARM_TLS_GD32 = 104 +R_ARM_TLS_LDM32 = 105 +R_ARM_TLS_LDO32 = 106 +R_ARM_TLS_IE32 = 107 +R_ARM_TLS_LE32 = 108 +R_ARM_TLS_LDO12 = 109 +R_ARM_TLS_LE12 = 110 +R_ARM_TLS_IE12GP = 111 +R_ARM_ME_TOO = 128 +R_ARM_THM_TLS_DESCSEQ = 129 +R_ARM_THM_TLS_DESCSEQ16 = 129 +R_ARM_THM_TLS_DESCSEQ32 = 130 +R_ARM_THM_GOT_BREL12 = 131 +R_ARM_IRELATIVE = 160 +R_ARM_RXPC25 = 249 +R_ARM_RSBREL32 = 250 +R_ARM_THM_RPC22 = 251 +R_ARM_RREL32 = 252 +R_ARM_RABS22 = 253 +R_ARM_RPC24 = 254 +R_ARM_RBASE = 255 +R_ARM_NUM = 256 +R_CKCORE_NONE = 0 +R_CKCORE_ADDR32 = 1 +R_CKCORE_PCRELIMM8BY4 = 2 +R_CKCORE_PCRELIMM11BY2 = 3 +R_CKCORE_PCREL32 = 5 +R_CKCORE_PCRELJSR_IMM11BY2 = 6 +R_CKCORE_RELATIVE = 9 +R_CKCORE_COPY = 10 +R_CKCORE_GLOB_DAT = 11 +R_CKCORE_JUMP_SLOT = 12 +R_CKCORE_GOTOFF = 13 +R_CKCORE_GOTPC = 14 +R_CKCORE_GOT32 = 15 +R_CKCORE_PLT32 = 16 +R_CKCORE_ADDRGOT = 17 +R_CKCORE_ADDRPLT = 18 +R_CKCORE_PCREL_IMM26BY2 = 19 +R_CKCORE_PCREL_IMM16BY2 = 20 +R_CKCORE_PCREL_IMM16BY4 = 21 +R_CKCORE_PCREL_IMM10BY2 = 22 +R_CKCORE_PCREL_IMM10BY4 = 23 +R_CKCORE_ADDR_HI16 = 24 +R_CKCORE_ADDR_LO16 = 25 +R_CKCORE_GOTPC_HI16 = 26 +R_CKCORE_GOTPC_LO16 = 27 +R_CKCORE_GOTOFF_HI16 = 28 +R_CKCORE_GOTOFF_LO16 = 29 +R_CKCORE_GOT12 = 30 +R_CKCORE_GOT_HI16 = 31 +R_CKCORE_GOT_LO16 = 32 +R_CKCORE_PLT12 = 33 +R_CKCORE_PLT_HI16 = 34 +R_CKCORE_PLT_LO16 = 35 +R_CKCORE_ADDRGOT_HI16 = 36 +R_CKCORE_ADDRGOT_LO16 = 37 +R_CKCORE_ADDRPLT_HI16 = 38 +R_CKCORE_ADDRPLT_LO16 = 39 +R_CKCORE_PCREL_JSR_IMM26BY2 = 40 +R_CKCORE_TOFFSET_LO16 = 41 +R_CKCORE_DOFFSET_LO16 = 42 +R_CKCORE_PCREL_IMM18BY2 = 43 +R_CKCORE_DOFFSET_IMM18 = 44 +R_CKCORE_DOFFSET_IMM18BY2 = 45 +R_CKCORE_DOFFSET_IMM18BY4 = 46 +R_CKCORE_GOT_IMM18BY4 = 48 +R_CKCORE_PLT_IMM18BY4 = 49 +R_CKCORE_PCREL_IMM7BY4 = 50 +R_CKCORE_TLS_LE32 = 51 +R_CKCORE_TLS_IE32 = 52 +R_CKCORE_TLS_GD32 = 53 +R_CKCORE_TLS_LDM32 = 54 +R_CKCORE_TLS_LDO32 = 55 +R_CKCORE_TLS_DTPMOD32 = 56 +R_CKCORE_TLS_DTPOFF32 = 57 +R_CKCORE_TLS_TPOFF32 = 58 +EF_CSKY_ABIMASK = 0XF0000000 +EF_CSKY_OTHER = 0X0FFF0000 +EF_CSKY_PROCESSOR = 0X0000FFFF +EF_CSKY_ABIV1 = 0X10000000 +EF_CSKY_ABIV2 = 0X20000000 +SHT_CSKY_ATTRIBUTES = (SHT_LOPROC + 1) +EF_IA_64_MASKOS = 0x0000000f +EF_IA_64_ABI64 = 0x00000010 +EF_IA_64_ARCH = 0xff000000 +PT_IA_64_ARCHEXT = (PT_LOPROC + 0) +PT_IA_64_UNWIND = (PT_LOPROC + 1) +PT_IA_64_HP_OPT_ANOT = (PT_LOOS + 0x12) +PT_IA_64_HP_HSL_ANOT = (PT_LOOS + 0x13) +PT_IA_64_HP_STACK = (PT_LOOS + 0x14) +PF_IA_64_NORECOV = 0x80000000 +SHT_IA_64_EXT = (SHT_LOPROC + 0) +SHT_IA_64_UNWIND = (SHT_LOPROC + 1) +SHF_IA_64_SHORT = 0x10000000 +SHF_IA_64_NORECOV = 0x20000000 +DT_IA_64_PLT_RESERVE = (DT_LOPROC + 0) +DT_IA_64_NUM = 1 +R_IA64_NONE = 0x00 +R_IA64_IMM14 = 0x21 +R_IA64_IMM22 = 0x22 +R_IA64_IMM64 = 0x23 +R_IA64_DIR32MSB = 0x24 +R_IA64_DIR32LSB = 0x25 +R_IA64_DIR64MSB = 0x26 +R_IA64_DIR64LSB = 0x27 +R_IA64_GPREL22 = 0x2a +R_IA64_GPREL64I = 0x2b +R_IA64_GPREL32MSB = 0x2c +R_IA64_GPREL32LSB = 0x2d +R_IA64_GPREL64MSB = 0x2e +R_IA64_GPREL64LSB = 0x2f +R_IA64_LTOFF22 = 0x32 +R_IA64_LTOFF64I = 0x33 +R_IA64_PLTOFF22 = 0x3a +R_IA64_PLTOFF64I = 0x3b +R_IA64_PLTOFF64MSB = 0x3e +R_IA64_PLTOFF64LSB = 0x3f +R_IA64_FPTR64I = 0x43 +R_IA64_FPTR32MSB = 0x44 +R_IA64_FPTR32LSB = 0x45 +R_IA64_FPTR64MSB = 0x46 +R_IA64_FPTR64LSB = 0x47 +R_IA64_PCREL60B = 0x48 +R_IA64_PCREL21B = 0x49 +R_IA64_PCREL21M = 0x4a +R_IA64_PCREL21F = 0x4b +R_IA64_PCREL32MSB = 0x4c +R_IA64_PCREL32LSB = 0x4d +R_IA64_PCREL64MSB = 0x4e +R_IA64_PCREL64LSB = 0x4f +R_IA64_LTOFF_FPTR22 = 0x52 +R_IA64_LTOFF_FPTR64I = 0x53 +R_IA64_LTOFF_FPTR32MSB = 0x54 +R_IA64_LTOFF_FPTR32LSB = 0x55 +R_IA64_LTOFF_FPTR64MSB = 0x56 +R_IA64_LTOFF_FPTR64LSB = 0x57 +R_IA64_SEGREL32MSB = 0x5c +R_IA64_SEGREL32LSB = 0x5d +R_IA64_SEGREL64MSB = 0x5e +R_IA64_SEGREL64LSB = 0x5f +R_IA64_SECREL32MSB = 0x64 +R_IA64_SECREL32LSB = 0x65 +R_IA64_SECREL64MSB = 0x66 +R_IA64_SECREL64LSB = 0x67 +R_IA64_REL32MSB = 0x6c +R_IA64_REL32LSB = 0x6d +R_IA64_REL64MSB = 0x6e +R_IA64_REL64LSB = 0x6f +R_IA64_LTV32MSB = 0x74 +R_IA64_LTV32LSB = 0x75 +R_IA64_LTV64MSB = 0x76 +R_IA64_LTV64LSB = 0x77 +R_IA64_PCREL21BI = 0x79 +R_IA64_PCREL22 = 0x7a +R_IA64_PCREL64I = 0x7b +R_IA64_IPLTMSB = 0x80 +R_IA64_IPLTLSB = 0x81 +R_IA64_COPY = 0x84 +R_IA64_SUB = 0x85 +R_IA64_LTOFF22X = 0x86 +R_IA64_LDXMOV = 0x87 +R_IA64_TPREL14 = 0x91 +R_IA64_TPREL22 = 0x92 +R_IA64_TPREL64I = 0x93 +R_IA64_TPREL64MSB = 0x96 +R_IA64_TPREL64LSB = 0x97 +R_IA64_LTOFF_TPREL22 = 0x9a +R_IA64_DTPMOD64MSB = 0xa6 +R_IA64_DTPMOD64LSB = 0xa7 +R_IA64_LTOFF_DTPMOD22 = 0xaa +R_IA64_DTPREL14 = 0xb1 +R_IA64_DTPREL22 = 0xb2 +R_IA64_DTPREL64I = 0xb3 +R_IA64_DTPREL32MSB = 0xb4 +R_IA64_DTPREL32LSB = 0xb5 +R_IA64_DTPREL64MSB = 0xb6 +R_IA64_DTPREL64LSB = 0xb7 +R_IA64_LTOFF_DTPREL22 = 0xba +EF_SH_MACH_MASK = 0x1f +EF_SH_UNKNOWN = 0x0 +EF_SH1 = 0x1 +EF_SH2 = 0x2 +EF_SH3 = 0x3 +EF_SH_DSP = 0x4 +EF_SH3_DSP = 0x5 +EF_SH4AL_DSP = 0x6 +EF_SH3E = 0x8 +EF_SH4 = 0x9 +EF_SH2E = 0xb +EF_SH4A = 0xc +EF_SH2A = 0xd +EF_SH4_NOFPU = 0x10 +EF_SH4A_NOFPU = 0x11 +EF_SH4_NOMMU_NOFPU = 0x12 +EF_SH2A_NOFPU = 0x13 +EF_SH3_NOMMU = 0x14 +EF_SH2A_SH4_NOFPU = 0x15 +EF_SH2A_SH3_NOFPU = 0x16 +EF_SH2A_SH4 = 0x17 +EF_SH2A_SH3E = 0x18 +R_SH_NONE = 0 +R_SH_DIR32 = 1 +R_SH_REL32 = 2 +R_SH_DIR8WPN = 3 +R_SH_IND12W = 4 +R_SH_DIR8WPL = 5 +R_SH_DIR8WPZ = 6 +R_SH_DIR8BP = 7 +R_SH_DIR8W = 8 +R_SH_DIR8L = 9 +R_SH_SWITCH16 = 25 +R_SH_SWITCH32 = 26 +R_SH_USES = 27 +R_SH_COUNT = 28 +R_SH_ALIGN = 29 +R_SH_CODE = 30 +R_SH_DATA = 31 +R_SH_LABEL = 32 +R_SH_SWITCH8 = 33 +R_SH_GNU_VTINHERIT = 34 +R_SH_GNU_VTENTRY = 35 +R_SH_TLS_GD_32 = 144 +R_SH_TLS_LD_32 = 145 +R_SH_TLS_LDO_32 = 146 +R_SH_TLS_IE_32 = 147 +R_SH_TLS_LE_32 = 148 +R_SH_TLS_DTPMOD32 = 149 +R_SH_TLS_DTPOFF32 = 150 +R_SH_TLS_TPOFF32 = 151 +R_SH_GOT32 = 160 +R_SH_PLT32 = 161 +R_SH_COPY = 162 +R_SH_GLOB_DAT = 163 +R_SH_JMP_SLOT = 164 +R_SH_RELATIVE = 165 +R_SH_GOTOFF = 166 +R_SH_GOTPC = 167 +R_SH_NUM = 256 +EF_S390_HIGH_GPRS = 0x00000001 +R_390_NONE = 0 +R_390_8 = 1 +R_390_12 = 2 +R_390_16 = 3 +R_390_32 = 4 +R_390_PC32 = 5 +R_390_GOT12 = 6 +R_390_GOT32 = 7 +R_390_PLT32 = 8 +R_390_COPY = 9 +R_390_GLOB_DAT = 10 +R_390_JMP_SLOT = 11 +R_390_RELATIVE = 12 +R_390_GOTOFF32 = 13 +R_390_GOTPC = 14 +R_390_GOT16 = 15 +R_390_PC16 = 16 +R_390_PC16DBL = 17 +R_390_PLT16DBL = 18 +R_390_PC32DBL = 19 +R_390_PLT32DBL = 20 +R_390_GOTPCDBL = 21 +R_390_64 = 22 +R_390_PC64 = 23 +R_390_GOT64 = 24 +R_390_PLT64 = 25 +R_390_GOTENT = 26 +R_390_GOTOFF16 = 27 +R_390_GOTOFF64 = 28 +R_390_GOTPLT12 = 29 +R_390_GOTPLT16 = 30 +R_390_GOTPLT32 = 31 +R_390_GOTPLT64 = 32 +R_390_GOTPLTENT = 33 +R_390_PLTOFF16 = 34 +R_390_PLTOFF32 = 35 +R_390_PLTOFF64 = 36 +R_390_TLS_LOAD = 37 +R_390_TLS_GDCALL = 38 +R_390_TLS_LDCALL = 39 +R_390_TLS_GD32 = 40 +R_390_TLS_GD64 = 41 +R_390_TLS_GOTIE12 = 42 +R_390_TLS_GOTIE32 = 43 +R_390_TLS_GOTIE64 = 44 +R_390_TLS_LDM32 = 45 +R_390_TLS_LDM64 = 46 +R_390_TLS_IE32 = 47 +R_390_TLS_IE64 = 48 +R_390_TLS_IEENT = 49 +R_390_TLS_LE32 = 50 +R_390_TLS_LE64 = 51 +R_390_TLS_LDO32 = 52 +R_390_TLS_LDO64 = 53 +R_390_TLS_DTPMOD = 54 +R_390_TLS_DTPOFF = 55 +R_390_TLS_TPOFF = 56 +R_390_20 = 57 +R_390_GOT20 = 58 +R_390_GOTPLT20 = 59 +R_390_TLS_GOTIE20 = 60 +R_390_IRELATIVE = 61 +R_390_NUM = 62 +R_CRIS_NONE = 0 +R_CRIS_8 = 1 +R_CRIS_16 = 2 +R_CRIS_32 = 3 +R_CRIS_8_PCREL = 4 +R_CRIS_16_PCREL = 5 +R_CRIS_32_PCREL = 6 +R_CRIS_GNU_VTINHERIT = 7 +R_CRIS_GNU_VTENTRY = 8 +R_CRIS_COPY = 9 +R_CRIS_GLOB_DAT = 10 +R_CRIS_JUMP_SLOT = 11 +R_CRIS_RELATIVE = 12 +R_CRIS_16_GOT = 13 +R_CRIS_32_GOT = 14 +R_CRIS_16_GOTPLT = 15 +R_CRIS_32_GOTPLT = 16 +R_CRIS_32_GOTREL = 17 +R_CRIS_32_PLT_GOTREL = 18 +R_CRIS_32_PLT_PCREL = 19 +R_CRIS_NUM = 20 +R_X86_64_NONE = 0 +R_X86_64_64 = 1 +R_X86_64_PC32 = 2 +R_X86_64_GOT32 = 3 +R_X86_64_PLT32 = 4 +R_X86_64_COPY = 5 +R_X86_64_GLOB_DAT = 6 +R_X86_64_JUMP_SLOT = 7 +R_X86_64_RELATIVE = 8 +R_X86_64_GOTPCREL = 9 +R_X86_64_32 = 10 +R_X86_64_32S = 11 +R_X86_64_16 = 12 +R_X86_64_PC16 = 13 +R_X86_64_8 = 14 +R_X86_64_PC8 = 15 +R_X86_64_DTPMOD64 = 16 +R_X86_64_DTPOFF64 = 17 +R_X86_64_TPOFF64 = 18 +R_X86_64_TLSGD = 19 +R_X86_64_TLSLD = 20 +R_X86_64_DTPOFF32 = 21 +R_X86_64_GOTTPOFF = 22 +R_X86_64_TPOFF32 = 23 +R_X86_64_PC64 = 24 +R_X86_64_GOTOFF64 = 25 +R_X86_64_GOTPC32 = 26 +R_X86_64_GOT64 = 27 +R_X86_64_GOTPCREL64 = 28 +R_X86_64_GOTPC64 = 29 +R_X86_64_GOTPLT64 = 30 +R_X86_64_PLTOFF64 = 31 +R_X86_64_SIZE32 = 32 +R_X86_64_SIZE64 = 33 +R_X86_64_GOTPC32_TLSDESC = 34 +R_X86_64_TLSDESC_CALL = 35 +R_X86_64_TLSDESC = 36 +R_X86_64_IRELATIVE = 37 +R_X86_64_RELATIVE64 = 38 +R_X86_64_GOTPCRELX = 41 +R_X86_64_REX_GOTPCRELX = 42 +R_X86_64_NUM = 43 +SHT_X86_64_UNWIND = 0x70000001 +DT_X86_64_PLT = (DT_LOPROC + 0) +DT_X86_64_PLTSZ = (DT_LOPROC + 1) +DT_X86_64_PLTENT = (DT_LOPROC + 3) +DT_X86_64_NUM = 4 +R_MN10300_NONE = 0 +R_MN10300_32 = 1 +R_MN10300_16 = 2 +R_MN10300_8 = 3 +R_MN10300_PCREL32 = 4 +R_MN10300_PCREL16 = 5 +R_MN10300_PCREL8 = 6 +R_MN10300_GNU_VTINHERIT = 7 +R_MN10300_GNU_VTENTRY = 8 +R_MN10300_24 = 9 +R_MN10300_GOTPC32 = 10 +R_MN10300_GOTPC16 = 11 +R_MN10300_GOTOFF32 = 12 +R_MN10300_GOTOFF24 = 13 +R_MN10300_GOTOFF16 = 14 +R_MN10300_PLT32 = 15 +R_MN10300_PLT16 = 16 +R_MN10300_GOT32 = 17 +R_MN10300_GOT24 = 18 +R_MN10300_GOT16 = 19 +R_MN10300_COPY = 20 +R_MN10300_GLOB_DAT = 21 +R_MN10300_JMP_SLOT = 22 +R_MN10300_RELATIVE = 23 +R_MN10300_TLS_GD = 24 +R_MN10300_TLS_LD = 25 +R_MN10300_TLS_LDO = 26 +R_MN10300_TLS_GOTIE = 27 +R_MN10300_TLS_IE = 28 +R_MN10300_TLS_LE = 29 +R_MN10300_TLS_DTPMOD = 30 +R_MN10300_TLS_DTPOFF = 31 +R_MN10300_TLS_TPOFF = 32 +R_MN10300_SYM_DIFF = 33 +R_MN10300_ALIGN = 34 +R_MN10300_NUM = 35 +R_M32R_NONE = 0 +R_M32R_16 = 1 +R_M32R_32 = 2 +R_M32R_24 = 3 +R_M32R_10_PCREL = 4 +R_M32R_18_PCREL = 5 +R_M32R_26_PCREL = 6 +R_M32R_HI16_ULO = 7 +R_M32R_HI16_SLO = 8 +R_M32R_LO16 = 9 +R_M32R_SDA16 = 10 +R_M32R_GNU_VTINHERIT = 11 +R_M32R_GNU_VTENTRY = 12 +R_M32R_16_RELA = 33 +R_M32R_32_RELA = 34 +R_M32R_24_RELA = 35 +R_M32R_10_PCREL_RELA = 36 +R_M32R_18_PCREL_RELA = 37 +R_M32R_26_PCREL_RELA = 38 +R_M32R_HI16_ULO_RELA = 39 +R_M32R_HI16_SLO_RELA = 40 +R_M32R_LO16_RELA = 41 +R_M32R_SDA16_RELA = 42 +R_M32R_RELA_GNU_VTINHERIT = 43 +R_M32R_RELA_GNU_VTENTRY = 44 +R_M32R_REL32 = 45 +R_M32R_GOT24 = 48 +R_M32R_26_PLTREL = 49 +R_M32R_COPY = 50 +R_M32R_GLOB_DAT = 51 +R_M32R_JMP_SLOT = 52 +R_M32R_RELATIVE = 53 +R_M32R_GOTOFF = 54 +R_M32R_GOTPC24 = 55 +R_M32R_GOT16_HI_ULO = 56 +R_M32R_GOT16_HI_SLO = 57 +R_M32R_GOT16_LO = 58 +R_M32R_GOTPC_HI_ULO = 59 +R_M32R_GOTPC_HI_SLO = 60 +R_M32R_GOTPC_LO = 61 +R_M32R_GOTOFF_HI_ULO = 62 +R_M32R_GOTOFF_HI_SLO = 63 +R_M32R_GOTOFF_LO = 64 +R_M32R_NUM = 256 +R_MICROBLAZE_NONE = 0 +R_MICROBLAZE_32 = 1 +R_MICROBLAZE_32_PCREL = 2 +R_MICROBLAZE_64_PCREL = 3 +R_MICROBLAZE_32_PCREL_LO = 4 +R_MICROBLAZE_64 = 5 +R_MICROBLAZE_32_LO = 6 +R_MICROBLAZE_SRO32 = 7 +R_MICROBLAZE_SRW32 = 8 +R_MICROBLAZE_64_NONE = 9 +R_MICROBLAZE_32_SYM_OP_SYM = 10 +R_MICROBLAZE_GNU_VTINHERIT = 11 +R_MICROBLAZE_GNU_VTENTRY = 12 +R_MICROBLAZE_GOTPC_64 = 13 +R_MICROBLAZE_GOT_64 = 14 +R_MICROBLAZE_PLT_64 = 15 +R_MICROBLAZE_REL = 16 +R_MICROBLAZE_JUMP_SLOT = 17 +R_MICROBLAZE_GLOB_DAT = 18 +R_MICROBLAZE_GOTOFF_64 = 19 +R_MICROBLAZE_GOTOFF_32 = 20 +R_MICROBLAZE_COPY = 21 +R_MICROBLAZE_TLS = 22 +R_MICROBLAZE_TLSGD = 23 +R_MICROBLAZE_TLSLD = 24 +R_MICROBLAZE_TLSDTPMOD32 = 25 +R_MICROBLAZE_TLSDTPREL32 = 26 +R_MICROBLAZE_TLSDTPREL64 = 27 +R_MICROBLAZE_TLSGOTTPREL32 = 28 +R_MICROBLAZE_TLSTPREL32 = 29 +DT_NIOS2_GP = 0x70000002 +R_NIOS2_NONE = 0 +R_NIOS2_S16 = 1 +R_NIOS2_U16 = 2 +R_NIOS2_PCREL16 = 3 +R_NIOS2_CALL26 = 4 +R_NIOS2_IMM5 = 5 +R_NIOS2_CACHE_OPX = 6 +R_NIOS2_IMM6 = 7 +R_NIOS2_IMM8 = 8 +R_NIOS2_HI16 = 9 +R_NIOS2_LO16 = 10 +R_NIOS2_HIADJ16 = 11 +R_NIOS2_BFD_RELOC_32 = 12 +R_NIOS2_BFD_RELOC_16 = 13 +R_NIOS2_BFD_RELOC_8 = 14 +R_NIOS2_GPREL = 15 +R_NIOS2_GNU_VTINHERIT = 16 +R_NIOS2_GNU_VTENTRY = 17 +R_NIOS2_UJMP = 18 +R_NIOS2_CJMP = 19 +R_NIOS2_CALLR = 20 +R_NIOS2_ALIGN = 21 +R_NIOS2_GOT16 = 22 +R_NIOS2_CALL16 = 23 +R_NIOS2_GOTOFF_LO = 24 +R_NIOS2_GOTOFF_HA = 25 +R_NIOS2_PCREL_LO = 26 +R_NIOS2_PCREL_HA = 27 +R_NIOS2_TLS_GD16 = 28 +R_NIOS2_TLS_LDM16 = 29 +R_NIOS2_TLS_LDO16 = 30 +R_NIOS2_TLS_IE16 = 31 +R_NIOS2_TLS_LE16 = 32 +R_NIOS2_TLS_DTPMOD = 33 +R_NIOS2_TLS_DTPREL = 34 +R_NIOS2_TLS_TPREL = 35 +R_NIOS2_COPY = 36 +R_NIOS2_GLOB_DAT = 37 +R_NIOS2_JUMP_SLOT = 38 +R_NIOS2_RELATIVE = 39 +R_NIOS2_GOTOFF = 40 +R_NIOS2_CALL26_NOAT = 41 +R_NIOS2_GOT_LO = 42 +R_NIOS2_GOT_HA = 43 +R_NIOS2_CALL_LO = 44 +R_NIOS2_CALL_HA = 45 +R_TILEPRO_NONE = 0 +R_TILEPRO_32 = 1 +R_TILEPRO_16 = 2 +R_TILEPRO_8 = 3 +R_TILEPRO_32_PCREL = 4 +R_TILEPRO_16_PCREL = 5 +R_TILEPRO_8_PCREL = 6 +R_TILEPRO_LO16 = 7 +R_TILEPRO_HI16 = 8 +R_TILEPRO_HA16 = 9 +R_TILEPRO_COPY = 10 +R_TILEPRO_GLOB_DAT = 11 +R_TILEPRO_JMP_SLOT = 12 +R_TILEPRO_RELATIVE = 13 +R_TILEPRO_BROFF_X1 = 14 +R_TILEPRO_JOFFLONG_X1 = 15 +R_TILEPRO_JOFFLONG_X1_PLT = 16 +R_TILEPRO_IMM8_X0 = 17 +R_TILEPRO_IMM8_Y0 = 18 +R_TILEPRO_IMM8_X1 = 19 +R_TILEPRO_IMM8_Y1 = 20 +R_TILEPRO_MT_IMM15_X1 = 21 +R_TILEPRO_MF_IMM15_X1 = 22 +R_TILEPRO_IMM16_X0 = 23 +R_TILEPRO_IMM16_X1 = 24 +R_TILEPRO_IMM16_X0_LO = 25 +R_TILEPRO_IMM16_X1_LO = 26 +R_TILEPRO_IMM16_X0_HI = 27 +R_TILEPRO_IMM16_X1_HI = 28 +R_TILEPRO_IMM16_X0_HA = 29 +R_TILEPRO_IMM16_X1_HA = 30 +R_TILEPRO_IMM16_X0_PCREL = 31 +R_TILEPRO_IMM16_X1_PCREL = 32 +R_TILEPRO_IMM16_X0_LO_PCREL = 33 +R_TILEPRO_IMM16_X1_LO_PCREL = 34 +R_TILEPRO_IMM16_X0_HI_PCREL = 35 +R_TILEPRO_IMM16_X1_HI_PCREL = 36 +R_TILEPRO_IMM16_X0_HA_PCREL = 37 +R_TILEPRO_IMM16_X1_HA_PCREL = 38 +R_TILEPRO_IMM16_X0_GOT = 39 +R_TILEPRO_IMM16_X1_GOT = 40 +R_TILEPRO_IMM16_X0_GOT_LO = 41 +R_TILEPRO_IMM16_X1_GOT_LO = 42 +R_TILEPRO_IMM16_X0_GOT_HI = 43 +R_TILEPRO_IMM16_X1_GOT_HI = 44 +R_TILEPRO_IMM16_X0_GOT_HA = 45 +R_TILEPRO_IMM16_X1_GOT_HA = 46 +R_TILEPRO_MMSTART_X0 = 47 +R_TILEPRO_MMEND_X0 = 48 +R_TILEPRO_MMSTART_X1 = 49 +R_TILEPRO_MMEND_X1 = 50 +R_TILEPRO_SHAMT_X0 = 51 +R_TILEPRO_SHAMT_X1 = 52 +R_TILEPRO_SHAMT_Y0 = 53 +R_TILEPRO_SHAMT_Y1 = 54 +R_TILEPRO_DEST_IMM8_X1 = 55 +R_TILEPRO_TLS_GD_CALL = 60 +R_TILEPRO_IMM8_X0_TLS_GD_ADD = 61 +R_TILEPRO_IMM8_X1_TLS_GD_ADD = 62 +R_TILEPRO_IMM8_Y0_TLS_GD_ADD = 63 +R_TILEPRO_IMM8_Y1_TLS_GD_ADD = 64 +R_TILEPRO_TLS_IE_LOAD = 65 +R_TILEPRO_IMM16_X0_TLS_GD = 66 +R_TILEPRO_IMM16_X1_TLS_GD = 67 +R_TILEPRO_IMM16_X0_TLS_GD_LO = 68 +R_TILEPRO_IMM16_X1_TLS_GD_LO = 69 +R_TILEPRO_IMM16_X0_TLS_GD_HI = 70 +R_TILEPRO_IMM16_X1_TLS_GD_HI = 71 +R_TILEPRO_IMM16_X0_TLS_GD_HA = 72 +R_TILEPRO_IMM16_X1_TLS_GD_HA = 73 +R_TILEPRO_IMM16_X0_TLS_IE = 74 +R_TILEPRO_IMM16_X1_TLS_IE = 75 +R_TILEPRO_IMM16_X0_TLS_IE_LO = 76 +R_TILEPRO_IMM16_X1_TLS_IE_LO = 77 +R_TILEPRO_IMM16_X0_TLS_IE_HI = 78 +R_TILEPRO_IMM16_X1_TLS_IE_HI = 79 +R_TILEPRO_IMM16_X0_TLS_IE_HA = 80 +R_TILEPRO_IMM16_X1_TLS_IE_HA = 81 +R_TILEPRO_TLS_DTPMOD32 = 82 +R_TILEPRO_TLS_DTPOFF32 = 83 +R_TILEPRO_TLS_TPOFF32 = 84 +R_TILEPRO_IMM16_X0_TLS_LE = 85 +R_TILEPRO_IMM16_X1_TLS_LE = 86 +R_TILEPRO_IMM16_X0_TLS_LE_LO = 87 +R_TILEPRO_IMM16_X1_TLS_LE_LO = 88 +R_TILEPRO_IMM16_X0_TLS_LE_HI = 89 +R_TILEPRO_IMM16_X1_TLS_LE_HI = 90 +R_TILEPRO_IMM16_X0_TLS_LE_HA = 91 +R_TILEPRO_IMM16_X1_TLS_LE_HA = 92 +R_TILEPRO_GNU_VTINHERIT = 128 +R_TILEPRO_GNU_VTENTRY = 129 +R_TILEPRO_NUM = 130 +R_TILEGX_NONE = 0 +R_TILEGX_64 = 1 +R_TILEGX_32 = 2 +R_TILEGX_16 = 3 +R_TILEGX_8 = 4 +R_TILEGX_64_PCREL = 5 +R_TILEGX_32_PCREL = 6 +R_TILEGX_16_PCREL = 7 +R_TILEGX_8_PCREL = 8 +R_TILEGX_HW0 = 9 +R_TILEGX_HW1 = 10 +R_TILEGX_HW2 = 11 +R_TILEGX_HW3 = 12 +R_TILEGX_HW0_LAST = 13 +R_TILEGX_HW1_LAST = 14 +R_TILEGX_HW2_LAST = 15 +R_TILEGX_COPY = 16 +R_TILEGX_GLOB_DAT = 17 +R_TILEGX_JMP_SLOT = 18 +R_TILEGX_RELATIVE = 19 +R_TILEGX_BROFF_X1 = 20 +R_TILEGX_JUMPOFF_X1 = 21 +R_TILEGX_JUMPOFF_X1_PLT = 22 +R_TILEGX_IMM8_X0 = 23 +R_TILEGX_IMM8_Y0 = 24 +R_TILEGX_IMM8_X1 = 25 +R_TILEGX_IMM8_Y1 = 26 +R_TILEGX_DEST_IMM8_X1 = 27 +R_TILEGX_MT_IMM14_X1 = 28 +R_TILEGX_MF_IMM14_X1 = 29 +R_TILEGX_MMSTART_X0 = 30 +R_TILEGX_MMEND_X0 = 31 +R_TILEGX_SHAMT_X0 = 32 +R_TILEGX_SHAMT_X1 = 33 +R_TILEGX_SHAMT_Y0 = 34 +R_TILEGX_SHAMT_Y1 = 35 +R_TILEGX_IMM16_X0_HW0 = 36 +R_TILEGX_IMM16_X1_HW0 = 37 +R_TILEGX_IMM16_X0_HW1 = 38 +R_TILEGX_IMM16_X1_HW1 = 39 +R_TILEGX_IMM16_X0_HW2 = 40 +R_TILEGX_IMM16_X1_HW2 = 41 +R_TILEGX_IMM16_X0_HW3 = 42 +R_TILEGX_IMM16_X1_HW3 = 43 +R_TILEGX_IMM16_X0_HW0_LAST = 44 +R_TILEGX_IMM16_X1_HW0_LAST = 45 +R_TILEGX_IMM16_X0_HW1_LAST = 46 +R_TILEGX_IMM16_X1_HW1_LAST = 47 +R_TILEGX_IMM16_X0_HW2_LAST = 48 +R_TILEGX_IMM16_X1_HW2_LAST = 49 +R_TILEGX_IMM16_X0_HW0_PCREL = 50 +R_TILEGX_IMM16_X1_HW0_PCREL = 51 +R_TILEGX_IMM16_X0_HW1_PCREL = 52 +R_TILEGX_IMM16_X1_HW1_PCREL = 53 +R_TILEGX_IMM16_X0_HW2_PCREL = 54 +R_TILEGX_IMM16_X1_HW2_PCREL = 55 +R_TILEGX_IMM16_X0_HW3_PCREL = 56 +R_TILEGX_IMM16_X1_HW3_PCREL = 57 +R_TILEGX_IMM16_X0_HW0_LAST_PCREL = 58 +R_TILEGX_IMM16_X1_HW0_LAST_PCREL = 59 +R_TILEGX_IMM16_X0_HW1_LAST_PCREL = 60 +R_TILEGX_IMM16_X1_HW1_LAST_PCREL = 61 +R_TILEGX_IMM16_X0_HW2_LAST_PCREL = 62 +R_TILEGX_IMM16_X1_HW2_LAST_PCREL = 63 +R_TILEGX_IMM16_X0_HW0_GOT = 64 +R_TILEGX_IMM16_X1_HW0_GOT = 65 +R_TILEGX_IMM16_X0_HW0_PLT_PCREL = 66 +R_TILEGX_IMM16_X1_HW0_PLT_PCREL = 67 +R_TILEGX_IMM16_X0_HW1_PLT_PCREL = 68 +R_TILEGX_IMM16_X1_HW1_PLT_PCREL = 69 +R_TILEGX_IMM16_X0_HW2_PLT_PCREL = 70 +R_TILEGX_IMM16_X1_HW2_PLT_PCREL = 71 +R_TILEGX_IMM16_X0_HW0_LAST_GOT = 72 +R_TILEGX_IMM16_X1_HW0_LAST_GOT = 73 +R_TILEGX_IMM16_X0_HW1_LAST_GOT = 74 +R_TILEGX_IMM16_X1_HW1_LAST_GOT = 75 +R_TILEGX_IMM16_X0_HW3_PLT_PCREL = 76 +R_TILEGX_IMM16_X1_HW3_PLT_PCREL = 77 +R_TILEGX_IMM16_X0_HW0_TLS_GD = 78 +R_TILEGX_IMM16_X1_HW0_TLS_GD = 79 +R_TILEGX_IMM16_X0_HW0_TLS_LE = 80 +R_TILEGX_IMM16_X1_HW0_TLS_LE = 81 +R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE = 82 +R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE = 83 +R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE = 84 +R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE = 85 +R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD = 86 +R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD = 87 +R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD = 88 +R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD = 89 +R_TILEGX_IMM16_X0_HW0_TLS_IE = 92 +R_TILEGX_IMM16_X1_HW0_TLS_IE = 93 +R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL = 94 +R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL = 95 +R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL = 96 +R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL = 97 +R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL = 98 +R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL = 99 +R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE = 100 +R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE = 101 +R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE = 102 +R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE = 103 +R_TILEGX_TLS_DTPMOD64 = 106 +R_TILEGX_TLS_DTPOFF64 = 107 +R_TILEGX_TLS_TPOFF64 = 108 +R_TILEGX_TLS_DTPMOD32 = 109 +R_TILEGX_TLS_DTPOFF32 = 110 +R_TILEGX_TLS_TPOFF32 = 111 +R_TILEGX_TLS_GD_CALL = 112 +R_TILEGX_IMM8_X0_TLS_GD_ADD = 113 +R_TILEGX_IMM8_X1_TLS_GD_ADD = 114 +R_TILEGX_IMM8_Y0_TLS_GD_ADD = 115 +R_TILEGX_IMM8_Y1_TLS_GD_ADD = 116 +R_TILEGX_TLS_IE_LOAD = 117 +R_TILEGX_IMM8_X0_TLS_ADD = 118 +R_TILEGX_IMM8_X1_TLS_ADD = 119 +R_TILEGX_IMM8_Y0_TLS_ADD = 120 +R_TILEGX_IMM8_Y1_TLS_ADD = 121 +R_TILEGX_GNU_VTINHERIT = 128 +R_TILEGX_GNU_VTENTRY = 129 +R_TILEGX_NUM = 130 +EF_RISCV_RVC = 0x0001 +EF_RISCV_FLOAT_ABI = 0x0006 +EF_RISCV_FLOAT_ABI_SOFT = 0x0000 +EF_RISCV_FLOAT_ABI_SINGLE = 0x0002 +EF_RISCV_FLOAT_ABI_DOUBLE = 0x0004 +EF_RISCV_FLOAT_ABI_QUAD = 0x0006 +EF_RISCV_RVE = 0x0008 +EF_RISCV_TSO = 0x0010 +R_RISCV_NONE = 0 +R_RISCV_32 = 1 +R_RISCV_64 = 2 +R_RISCV_RELATIVE = 3 +R_RISCV_COPY = 4 +R_RISCV_JUMP_SLOT = 5 +R_RISCV_TLS_DTPMOD32 = 6 +R_RISCV_TLS_DTPMOD64 = 7 +R_RISCV_TLS_DTPREL32 = 8 +R_RISCV_TLS_DTPREL64 = 9 +R_RISCV_TLS_TPREL32 = 10 +R_RISCV_TLS_TPREL64 = 11 +R_RISCV_BRANCH = 16 +R_RISCV_JAL = 17 +R_RISCV_CALL = 18 +R_RISCV_CALL_PLT = 19 +R_RISCV_GOT_HI20 = 20 +R_RISCV_TLS_GOT_HI20 = 21 +R_RISCV_TLS_GD_HI20 = 22 +R_RISCV_PCREL_HI20 = 23 +R_RISCV_PCREL_LO12_I = 24 +R_RISCV_PCREL_LO12_S = 25 +R_RISCV_HI20 = 26 +R_RISCV_LO12_I = 27 +R_RISCV_LO12_S = 28 +R_RISCV_TPREL_HI20 = 29 +R_RISCV_TPREL_LO12_I = 30 +R_RISCV_TPREL_LO12_S = 31 +R_RISCV_TPREL_ADD = 32 +R_RISCV_ADD8 = 33 +R_RISCV_ADD16 = 34 +R_RISCV_ADD32 = 35 +R_RISCV_ADD64 = 36 +R_RISCV_SUB8 = 37 +R_RISCV_SUB16 = 38 +R_RISCV_SUB32 = 39 +R_RISCV_SUB64 = 40 +R_RISCV_GNU_VTINHERIT = 41 +R_RISCV_GNU_VTENTRY = 42 +R_RISCV_ALIGN = 43 +R_RISCV_RVC_BRANCH = 44 +R_RISCV_RVC_JUMP = 45 +R_RISCV_RVC_LUI = 46 +R_RISCV_GPREL_I = 47 +R_RISCV_GPREL_S = 48 +R_RISCV_TPREL_I = 49 +R_RISCV_TPREL_S = 50 +R_RISCV_RELAX = 51 +R_RISCV_SUB6 = 52 +R_RISCV_SET6 = 53 +R_RISCV_SET8 = 54 +R_RISCV_SET16 = 55 +R_RISCV_SET32 = 56 +R_RISCV_32_PCREL = 57 +R_RISCV_IRELATIVE = 58 +R_RISCV_PLT32 = 59 +R_RISCV_SET_ULEB128 = 60 +R_RISCV_SUB_ULEB128 = 61 +R_RISCV_NUM = 62 +STO_RISCV_VARIANT_CC = 0x80 +SHT_RISCV_ATTRIBUTES = (SHT_LOPROC + 3) +PT_RISCV_ATTRIBUTES = (PT_LOPROC + 3) +DT_RISCV_VARIANT_CC = (DT_LOPROC + 1) +R_BPF_NONE = 0 +R_BPF_64_64 = 1 +R_BPF_64_32 = 10 +R_METAG_HIADDR16 = 0 +R_METAG_LOADDR16 = 1 +R_METAG_ADDR32 = 2 +R_METAG_NONE = 3 +R_METAG_RELBRANCH = 4 +R_METAG_GETSETOFF = 5 +R_METAG_REG32OP1 = 6 +R_METAG_REG32OP2 = 7 +R_METAG_REG32OP3 = 8 +R_METAG_REG16OP1 = 9 +R_METAG_REG16OP2 = 10 +R_METAG_REG16OP3 = 11 +R_METAG_REG32OP4 = 12 +R_METAG_HIOG = 13 +R_METAG_LOOG = 14 +R_METAG_REL8 = 15 +R_METAG_REL16 = 16 +R_METAG_GNU_VTINHERIT = 30 +R_METAG_GNU_VTENTRY = 31 +R_METAG_HI16_GOTOFF = 32 +R_METAG_LO16_GOTOFF = 33 +R_METAG_GETSET_GOTOFF = 34 +R_METAG_GETSET_GOT = 35 +R_METAG_HI16_GOTPC = 36 +R_METAG_LO16_GOTPC = 37 +R_METAG_HI16_PLT = 38 +R_METAG_LO16_PLT = 39 +R_METAG_RELBRANCH_PLT = 40 +R_METAG_GOTOFF = 41 +R_METAG_PLT = 42 +R_METAG_COPY = 43 +R_METAG_JMP_SLOT = 44 +R_METAG_RELATIVE = 45 +R_METAG_GLOB_DAT = 46 +R_METAG_TLS_GD = 47 +R_METAG_TLS_LDM = 48 +R_METAG_TLS_LDO_HI16 = 49 +R_METAG_TLS_LDO_LO16 = 50 +R_METAG_TLS_LDO = 51 +R_METAG_TLS_IE = 52 +R_METAG_TLS_IENONPIC = 53 +R_METAG_TLS_IENONPIC_HI16 = 54 +R_METAG_TLS_IENONPIC_LO16 = 55 +R_METAG_TLS_TPOFF = 56 +R_METAG_TLS_DTPMOD = 57 +R_METAG_TLS_DTPOFF = 58 +R_METAG_TLS_LE = 59 +R_METAG_TLS_LE_HI16 = 60 +R_METAG_TLS_LE_LO16 = 61 +R_NDS32_NONE = 0 +R_NDS32_32_RELA = 20 +R_NDS32_COPY = 39 +R_NDS32_GLOB_DAT = 40 +R_NDS32_JMP_SLOT = 41 +R_NDS32_RELATIVE = 42 +R_NDS32_TLS_TPOFF = 102 +R_NDS32_TLS_DESC = 119 +EF_LARCH_ABI_MODIFIER_MASK = 0x07 +EF_LARCH_ABI_SOFT_FLOAT = 0x01 +EF_LARCH_ABI_SINGLE_FLOAT = 0x02 +EF_LARCH_ABI_DOUBLE_FLOAT = 0x03 +EF_LARCH_OBJABI_V1 = 0x40 +R_LARCH_NONE = 0 +R_LARCH_32 = 1 +R_LARCH_64 = 2 +R_LARCH_RELATIVE = 3 +R_LARCH_COPY = 4 +R_LARCH_JUMP_SLOT = 5 +R_LARCH_TLS_DTPMOD32 = 6 +R_LARCH_TLS_DTPMOD64 = 7 +R_LARCH_TLS_DTPREL32 = 8 +R_LARCH_TLS_DTPREL64 = 9 +R_LARCH_TLS_TPREL32 = 10 +R_LARCH_TLS_TPREL64 = 11 +R_LARCH_IRELATIVE = 12 +R_LARCH_MARK_LA = 20 +R_LARCH_MARK_PCREL = 21 +R_LARCH_SOP_PUSH_PCREL = 22 +R_LARCH_SOP_PUSH_ABSOLUTE = 23 +R_LARCH_SOP_PUSH_DUP = 24 +R_LARCH_SOP_PUSH_GPREL = 25 +R_LARCH_SOP_PUSH_TLS_TPREL = 26 +R_LARCH_SOP_PUSH_TLS_GOT = 27 +R_LARCH_SOP_PUSH_TLS_GD = 28 +R_LARCH_SOP_PUSH_PLT_PCREL = 29 +R_LARCH_SOP_ASSERT = 30 +R_LARCH_SOP_NOT = 31 +R_LARCH_SOP_SUB = 32 +R_LARCH_SOP_SL = 33 +R_LARCH_SOP_SR = 34 +R_LARCH_SOP_ADD = 35 +R_LARCH_SOP_AND = 36 +R_LARCH_SOP_IF_ELSE = 37 +R_LARCH_SOP_POP_32_S_10_5 = 38 +R_LARCH_SOP_POP_32_U_10_12 = 39 +R_LARCH_SOP_POP_32_S_10_12 = 40 +R_LARCH_SOP_POP_32_S_10_16 = 41 +R_LARCH_SOP_POP_32_S_10_16_S2 = 42 +R_LARCH_SOP_POP_32_S_5_20 = 43 +R_LARCH_SOP_POP_32_S_0_5_10_16_S2 = 44 +R_LARCH_SOP_POP_32_S_0_10_10_16_S2 = 45 +R_LARCH_SOP_POP_32_U = 46 +R_LARCH_ADD8 = 47 +R_LARCH_ADD16 = 48 +R_LARCH_ADD24 = 49 +R_LARCH_ADD32 = 50 +R_LARCH_ADD64 = 51 +R_LARCH_SUB8 = 52 +R_LARCH_SUB16 = 53 +R_LARCH_SUB24 = 54 +R_LARCH_SUB32 = 55 +R_LARCH_SUB64 = 56 +R_LARCH_GNU_VTINHERIT = 57 +R_LARCH_GNU_VTENTRY = 58 +R_LARCH_B16 = 64 +R_LARCH_B21 = 65 +R_LARCH_B26 = 66 +R_LARCH_ABS_HI20 = 67 +R_LARCH_ABS_LO12 = 68 +R_LARCH_ABS64_LO20 = 69 +R_LARCH_ABS64_HI12 = 70 +R_LARCH_PCALA_HI20 = 71 +R_LARCH_PCALA_LO12 = 72 +R_LARCH_PCALA64_LO20 = 73 +R_LARCH_PCALA64_HI12 = 74 +R_LARCH_GOT_PC_HI20 = 75 +R_LARCH_GOT_PC_LO12 = 76 +R_LARCH_GOT64_PC_LO20 = 77 +R_LARCH_GOT64_PC_HI12 = 78 +R_LARCH_GOT_HI20 = 79 +R_LARCH_GOT_LO12 = 80 +R_LARCH_GOT64_LO20 = 81 +R_LARCH_GOT64_HI12 = 82 +R_LARCH_TLS_LE_HI20 = 83 +R_LARCH_TLS_LE_LO12 = 84 +R_LARCH_TLS_LE64_LO20 = 85 +R_LARCH_TLS_LE64_HI12 = 86 +R_LARCH_TLS_IE_PC_HI20 = 87 +R_LARCH_TLS_IE_PC_LO12 = 88 +R_LARCH_TLS_IE64_PC_LO20 = 89 +R_LARCH_TLS_IE64_PC_HI12 = 90 +R_LARCH_TLS_IE_HI20 = 91 +R_LARCH_TLS_IE_LO12 = 92 +R_LARCH_TLS_IE64_LO20 = 93 +R_LARCH_TLS_IE64_HI12 = 94 +R_LARCH_TLS_LD_PC_HI20 = 95 +R_LARCH_TLS_LD_HI20 = 96 +R_LARCH_TLS_GD_PC_HI20 = 97 +R_LARCH_TLS_GD_HI20 = 98 +R_LARCH_32_PCREL = 99 +R_LARCH_RELAX = 100 +R_LARCH_DELETE = 101 +R_LARCH_ALIGN = 102 +R_LARCH_PCREL20_S2 = 103 +R_LARCH_CFA = 104 +R_LARCH_ADD6 = 105 +R_LARCH_SUB6 = 106 +R_LARCH_ADD_ULEB128 = 107 +R_LARCH_SUB_ULEB128 = 108 +R_LARCH_64_PCREL = 109 +EF_ARC_MACH_MSK = 0x000000ff +EF_ARC_OSABI_MSK = 0x00000f00 +EF_ARC_ALL_MSK = (EF_ARC_MACH_MSK | EF_ARC_OSABI_MSK) +SHT_ARC_ATTRIBUTES = (SHT_LOPROC + 1) +R_ARC_NONE = 0x0 +R_ARC_8 = 0x1 +R_ARC_16 = 0x2 +R_ARC_24 = 0x3 +R_ARC_32 = 0x4 +R_ARC_B22_PCREL = 0x6 +R_ARC_H30 = 0x7 +R_ARC_N8 = 0x8 +R_ARC_N16 = 0x9 +R_ARC_N24 = 0xA +R_ARC_N32 = 0xB +R_ARC_SDA = 0xC +R_ARC_SECTOFF = 0xD +R_ARC_S21H_PCREL = 0xE +R_ARC_S21W_PCREL = 0xF +R_ARC_S25H_PCREL = 0x10 +R_ARC_S25W_PCREL = 0x11 +R_ARC_SDA32 = 0x12 +R_ARC_SDA_LDST = 0x13 +R_ARC_SDA_LDST1 = 0x14 +R_ARC_SDA_LDST2 = 0x15 +R_ARC_SDA16_LD = 0x16 +R_ARC_SDA16_LD1 = 0x17 +R_ARC_SDA16_LD2 = 0x18 +R_ARC_S13_PCREL = 0x19 +R_ARC_W = 0x1A +R_ARC_32_ME = 0x1B +R_ARC_N32_ME = 0x1C +R_ARC_SECTOFF_ME = 0x1D +R_ARC_SDA32_ME = 0x1E +R_ARC_W_ME = 0x1F +R_ARC_H30_ME = 0x20 +R_ARC_SECTOFF_U8 = 0x21 +R_ARC_SECTOFF_S9 = 0x22 +R_AC_SECTOFF_U8 = 0x23 +R_AC_SECTOFF_U8_1 = 0x24 +R_AC_SECTOFF_U8_2 = 0x25 +R_AC_SECTOFF_S9 = 0x26 +R_AC_SECTOFF_S9_1 = 0x27 +R_AC_SECTOFF_S9_2 = 0x28 +R_ARC_SECTOFF_ME_1 = 0x29 +R_ARC_SECTOFF_ME_2 = 0x2A +R_ARC_SECTOFF_1 = 0x2B +R_ARC_SECTOFF_2 = 0x2C +R_ARC_SDA_12 = 0x2D +R_ARC_SDA16_ST2 = 0x30 +R_ARC_32_PCREL = 0x31 +R_ARC_PC32 = 0x32 +R_ARC_GOTPC32 = 0x33 +R_ARC_PLT32 = 0x34 +R_ARC_COPY = 0x35 +R_ARC_GLOB_DAT = 0x36 +R_ARC_JMP_SLOT = 0x37 +R_ARC_RELATIVE = 0x38 +R_ARC_GOTOFF = 0x39 +R_ARC_GOTPC = 0x3A +R_ARC_GOT32 = 0x3B +R_ARC_S21W_PCREL_PLT = 0x3C +R_ARC_S25H_PCREL_PLT = 0x3D +R_ARC_JLI_SECTOFF = 0x3F +R_ARC_TLS_DTPMOD = 0x42 +R_ARC_TLS_DTPOFF = 0x43 +R_ARC_TLS_TPOFF = 0x44 +R_ARC_TLS_GD_GOT = 0x45 +R_ARC_TLS_GD_LD = 0x46 +R_ARC_TLS_GD_CALL = 0x47 +R_ARC_TLS_IE_GOT = 0x48 +R_ARC_TLS_DTPOFF_S9 = 0x49 +R_ARC_TLS_LE_S9 = 0x4A +R_ARC_TLS_LE_32 = 0x4B +R_ARC_S25W_PCREL_PLT = 0x4C +R_ARC_S21H_PCREL_PLT = 0x4D +R_ARC_NPS_CMEM16 = 0x4E +R_OR1K_NONE = 0 +R_OR1K_32 = 1 +R_OR1K_16 = 2 +R_OR1K_8 = 3 +R_OR1K_LO_16_IN_INSN = 4 +R_OR1K_HI_16_IN_INSN = 5 +R_OR1K_INSN_REL_26 = 6 +R_OR1K_GNU_VTENTRY = 7 +R_OR1K_GNU_VTINHERIT = 8 +R_OR1K_32_PCREL = 9 +R_OR1K_16_PCREL = 10 +R_OR1K_8_PCREL = 11 +R_OR1K_GOTPC_HI16 = 12 +R_OR1K_GOTPC_LO16 = 13 +R_OR1K_GOT16 = 14 +R_OR1K_PLT26 = 15 +R_OR1K_GOTOFF_HI16 = 16 +R_OR1K_GOTOFF_LO16 = 17 +R_OR1K_COPY = 18 +R_OR1K_GLOB_DAT = 19 +R_OR1K_JMP_SLOT = 20 +R_OR1K_RELATIVE = 21 +R_OR1K_TLS_GD_HI16 = 22 +R_OR1K_TLS_GD_LO16 = 23 +R_OR1K_TLS_LDM_HI16 = 24 +R_OR1K_TLS_LDM_LO16 = 25 +R_OR1K_TLS_LDO_HI16 = 26 +R_OR1K_TLS_LDO_LO16 = 27 +R_OR1K_TLS_IE_HI16 = 28 +R_OR1K_TLS_IE_LO16 = 29 +R_OR1K_TLS_LE_HI16 = 30 +R_OR1K_TLS_LE_LO16 = 31 +R_OR1K_TLS_TPOFF = 32 +R_OR1K_TLS_DTPOFF = 33 +R_OR1K_TLS_DTPMOD = 34 +_UNISTD_H = 1 +_POSIX_VERSION = 200809 +__POSIX2_THIS_VERSION = 200809 +_POSIX2_VERSION = __POSIX2_THIS_VERSION +_POSIX2_C_VERSION = __POSIX2_THIS_VERSION +_POSIX2_C_BIND = __POSIX2_THIS_VERSION +_POSIX2_C_DEV = __POSIX2_THIS_VERSION +_POSIX2_SW_DEV = __POSIX2_THIS_VERSION +_POSIX2_LOCALEDEF = __POSIX2_THIS_VERSION +_XOPEN_VERSION = 700 +_XOPEN_XCU_VERSION = 4 +_XOPEN_XPG2 = 1 +_XOPEN_XPG3 = 1 +_XOPEN_XPG4 = 1 +_XOPEN_UNIX = 1 +_XOPEN_ENH_I18N = 1 +_XOPEN_LEGACY = 1 +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 +R_OK = 4 +W_OK = 2 +X_OK = 1 +F_OK = 0 +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 +SEEK_DATA = 3 +SEEK_HOLE = 4 +L_SET = SEEK_SET +L_INCR = SEEK_CUR +L_XTND = SEEK_END +F_ULOCK = 0 +F_LOCK = 1 +F_TLOCK = 2 +F_TEST = 3 +_STDIO_H = 1 +_IOFBF = 0 +_IOLBF = 1 +_IONBF = 2 +BUFSIZ = 8192 +EOF = (-1) +SEEK_SET = 0 +SEEK_CUR = 1 +SEEK_END = 2 +SEEK_DATA = 3 +SEEK_HOLE = 4 +P_tmpdir = "/tmp" +L_tmpnam = 20 +TMP_MAX = 238328 +L_ctermid = 9 +L_cuserid = 9 +FOPEN_MAX = 16 +_PRINTF_NAN_LEN_MAX = 4 +RENAME_NOREPLACE = (1 << 0) +RENAME_EXCHANGE = (1 << 1) +RENAME_WHITEOUT = (1 << 2) +_SEMAPHORE_H = 1 +PROT_READ = 0x1 +PROT_WRITE = 0x2 +PROT_EXEC = 0x4 +PROT_SEM = 0x8 +PROT_NONE = 0x0 +PROT_GROWSDOWN = 0x01000000 +PROT_GROWSUP = 0x02000000 +MAP_TYPE = 0x0f +MAP_FIXED = 0x10 +MAP_ANONYMOUS = 0x20 +MAP_POPULATE = 0x008000 +MAP_NONBLOCK = 0x010000 +MAP_STACK = 0x020000 +MAP_HUGETLB = 0x040000 +MAP_SYNC = 0x080000 +MAP_FIXED_NOREPLACE = 0x100000 +MAP_UNINITIALIZED = 0x4000000 +MLOCK_ONFAULT = 0x01 +MS_ASYNC = 1 +MS_INVALIDATE = 2 +MS_SYNC = 4 +MADV_NORMAL = 0 +MADV_RANDOM = 1 +MADV_SEQUENTIAL = 2 +MADV_WILLNEED = 3 +MADV_DONTNEED = 4 +MADV_FREE = 8 +MADV_REMOVE = 9 +MADV_DONTFORK = 10 +MADV_DOFORK = 11 +MADV_HWPOISON = 100 +MADV_SOFT_OFFLINE = 101 +MADV_MERGEABLE = 12 +MADV_UNMERGEABLE = 13 +MADV_HUGEPAGE = 14 +MADV_NOHUGEPAGE = 15 +MADV_DONTDUMP = 16 +MADV_DODUMP = 17 +MADV_WIPEONFORK = 18 +MADV_KEEPONFORK = 19 +MADV_COLD = 20 +MADV_PAGEOUT = 21 +MADV_POPULATE_READ = 22 +MADV_POPULATE_WRITE = 23 +MADV_DONTNEED_LOCKED = 24 +MADV_COLLAPSE = 25 +MAP_FILE = 0 +PKEY_DISABLE_ACCESS = 0x1 +PKEY_DISABLE_WRITE = 0x2 +PKEY_ACCESS_MASK = (PKEY_DISABLE_ACCESS | PKEY_DISABLE_WRITE) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/libclang.py b/artifacts/package_runtime/tinygrad/runtime/autogen/libclang.py new file mode 100644 index 000000000..d6b5c69ec --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/libclang.py @@ -0,0 +1,1019 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +from tinygrad.helpers import WIN, OSX +dll = c.DLL('libclang', 'C:\\Program Files\\LLVM\\bin\\libclang.dll' if WIN else ['/opt/homebrew/opt/llvm@21/lib/libclang.dylib', '/opt/homebrew/opt/llvm@20/lib/libclang.dylib', '/opt/homebrew/opt/llvm@19/lib/libclang.dylib', '/opt/homebrew/opt/llvm@18/lib/libclang.dylib', '/opt/homebrew/opt/llvm@17/lib/libclang.dylib', '/opt/homebrew/opt/llvm@16/lib/libclang.dylib', '/opt/homebrew/opt/llvm@15/lib/libclang.dylib', '/opt/homebrew/opt/llvm@14/lib/libclang.dylib'] if OSX else ['clang', 'clang-21', 'clang-20', 'clang-19', 'clang-18', 'clang-17', 'clang-16', 'clang-15', 'clang-14']) +CXIndex: TypeAlias = ctypes.c_void_p +class struct_CXTargetInfoImpl(c.Struct): pass +CXTargetInfo: TypeAlias = c.POINTER[struct_CXTargetInfoImpl] +class struct_CXTranslationUnitImpl(c.Struct): pass +CXTranslationUnit: TypeAlias = c.POINTER[struct_CXTranslationUnitImpl] +CXClientData: TypeAlias = ctypes.c_void_p +@c.record +class struct_CXUnsavedFile(c.Struct): + SIZE = 24 + Filename: c.POINTER[ctypes.c_char] + Contents: c.POINTER[ctypes.c_char] + Length: int +struct_CXUnsavedFile.register_fields([('Filename', c.POINTER[ctypes.c_char], 0), ('Contents', c.POINTER[ctypes.c_char], 8), ('Length', ctypes.c_uint64, 16)]) +enum_CXAvailabilityKind: dict[int, str] = {(CXAvailability_Available:=0): 'CXAvailability_Available', (CXAvailability_Deprecated:=1): 'CXAvailability_Deprecated', (CXAvailability_NotAvailable:=2): 'CXAvailability_NotAvailable', (CXAvailability_NotAccessible:=3): 'CXAvailability_NotAccessible'} +@c.record +class struct_CXVersion(c.Struct): + SIZE = 12 + Major: int + Minor: int + Subminor: int +struct_CXVersion.register_fields([('Major', ctypes.c_int32, 0), ('Minor', ctypes.c_int32, 4), ('Subminor', ctypes.c_int32, 8)]) +CXVersion: TypeAlias = struct_CXVersion +enum_CXCursor_ExceptionSpecificationKind: dict[int, str] = {(CXCursor_ExceptionSpecificationKind_None:=0): 'CXCursor_ExceptionSpecificationKind_None', (CXCursor_ExceptionSpecificationKind_DynamicNone:=1): 'CXCursor_ExceptionSpecificationKind_DynamicNone', (CXCursor_ExceptionSpecificationKind_Dynamic:=2): 'CXCursor_ExceptionSpecificationKind_Dynamic', (CXCursor_ExceptionSpecificationKind_MSAny:=3): 'CXCursor_ExceptionSpecificationKind_MSAny', (CXCursor_ExceptionSpecificationKind_BasicNoexcept:=4): 'CXCursor_ExceptionSpecificationKind_BasicNoexcept', (CXCursor_ExceptionSpecificationKind_ComputedNoexcept:=5): 'CXCursor_ExceptionSpecificationKind_ComputedNoexcept', (CXCursor_ExceptionSpecificationKind_Unevaluated:=6): 'CXCursor_ExceptionSpecificationKind_Unevaluated', (CXCursor_ExceptionSpecificationKind_Uninstantiated:=7): 'CXCursor_ExceptionSpecificationKind_Uninstantiated', (CXCursor_ExceptionSpecificationKind_Unparsed:=8): 'CXCursor_ExceptionSpecificationKind_Unparsed', (CXCursor_ExceptionSpecificationKind_NoThrow:=9): 'CXCursor_ExceptionSpecificationKind_NoThrow'} +@dll.bind(CXIndex, ctypes.c_int32, ctypes.c_int32) +def clang_createIndex(excludeDeclarationsFromPCH:int, displayDiagnostics:int) -> CXIndex: ... +@dll.bind(None, CXIndex) +def clang_disposeIndex(index:CXIndex) -> None: ... +CXChoice: dict[int, str] = {(CXChoice_Default:=0): 'CXChoice_Default', (CXChoice_Enabled:=1): 'CXChoice_Enabled', (CXChoice_Disabled:=2): 'CXChoice_Disabled'} +CXGlobalOptFlags: dict[int, str] = {(CXGlobalOpt_None:=0): 'CXGlobalOpt_None', (CXGlobalOpt_ThreadBackgroundPriorityForIndexing:=1): 'CXGlobalOpt_ThreadBackgroundPriorityForIndexing', (CXGlobalOpt_ThreadBackgroundPriorityForEditing:=2): 'CXGlobalOpt_ThreadBackgroundPriorityForEditing', (CXGlobalOpt_ThreadBackgroundPriorityForAll:=3): 'CXGlobalOpt_ThreadBackgroundPriorityForAll'} +@c.record +class struct_CXIndexOptions(c.Struct): + SIZE = 24 + Size: int + ThreadBackgroundPriorityForIndexing: int + ThreadBackgroundPriorityForEditing: int + ExcludeDeclarationsFromPCH: int + DisplayDiagnostics: int + StorePreamblesInMemory: int + PreambleStoragePath: c.POINTER[ctypes.c_char] + InvocationEmissionPath: c.POINTER[ctypes.c_char] +struct_CXIndexOptions.register_fields([('Size', ctypes.c_uint32, 0), ('ThreadBackgroundPriorityForIndexing', ctypes.c_ubyte, 4), ('ThreadBackgroundPriorityForEditing', ctypes.c_ubyte, 5), ('ExcludeDeclarationsFromPCH', ctypes.c_uint32, 6, 1, 0), ('DisplayDiagnostics', ctypes.c_uint32, 6, 1, 1), ('StorePreamblesInMemory', ctypes.c_uint32, 6, 1, 2), ('PreambleStoragePath', c.POINTER[ctypes.c_char], 8), ('InvocationEmissionPath', c.POINTER[ctypes.c_char], 16)]) +CXIndexOptions: TypeAlias = struct_CXIndexOptions +@dll.bind(CXIndex, c.POINTER[CXIndexOptions]) +def clang_createIndexWithOptions(options:c.POINTER[CXIndexOptions]) -> CXIndex: ... +@dll.bind(None, CXIndex, ctypes.c_uint32) +def clang_CXIndex_setGlobalOptions(_0:CXIndex, options:int) -> None: ... +@dll.bind(ctypes.c_uint32, CXIndex) +def clang_CXIndex_getGlobalOptions(_0:CXIndex) -> int: ... +@dll.bind(None, CXIndex, c.POINTER[ctypes.c_char]) +def clang_CXIndex_setInvocationEmissionPathOption(_0:CXIndex, Path:c.POINTER[ctypes.c_char]) -> None: ... +CXFile: TypeAlias = ctypes.c_void_p +@dll.bind(ctypes.c_uint32, CXTranslationUnit, CXFile) +def clang_isFileMultipleIncludeGuarded(tu:CXTranslationUnit, file:CXFile) -> int: ... +@dll.bind(CXFile, CXTranslationUnit, c.POINTER[ctypes.c_char]) +def clang_getFile(tu:CXTranslationUnit, file_name:c.POINTER[ctypes.c_char]) -> CXFile: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(c.POINTER[ctypes.c_char], CXTranslationUnit, CXFile, c.POINTER[size_t]) +def clang_getFileContents(tu:CXTranslationUnit, file:CXFile, size:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@c.record +class CXSourceLocation(c.Struct): + SIZE = 24 + ptr_data: c.Array[ctypes.c_void_p, Literal[2]] + int_data: int +CXSourceLocation.register_fields([('ptr_data', c.Array[ctypes.c_void_p, Literal[2]], 0), ('int_data', ctypes.c_uint32, 16)]) +@dll.bind(CXSourceLocation, CXTranslationUnit, CXFile, ctypes.c_uint32, ctypes.c_uint32) +def clang_getLocation(tu:CXTranslationUnit, file:CXFile, line:int, column:int) -> CXSourceLocation: ... +@dll.bind(CXSourceLocation, CXTranslationUnit, CXFile, ctypes.c_uint32) +def clang_getLocationForOffset(tu:CXTranslationUnit, file:CXFile, offset:int) -> CXSourceLocation: ... +@c.record +class CXSourceRangeList(c.Struct): + SIZE = 16 + count: int + ranges: c.POINTER[CXSourceRange] +@c.record +class CXSourceRange(c.Struct): + SIZE = 24 + ptr_data: c.Array[ctypes.c_void_p, Literal[2]] + begin_int_data: int + end_int_data: int +CXSourceRange.register_fields([('ptr_data', c.Array[ctypes.c_void_p, Literal[2]], 0), ('begin_int_data', ctypes.c_uint32, 16), ('end_int_data', ctypes.c_uint32, 20)]) +CXSourceRangeList.register_fields([('count', ctypes.c_uint32, 0), ('ranges', c.POINTER[CXSourceRange], 8)]) +@dll.bind(c.POINTER[CXSourceRangeList], CXTranslationUnit, CXFile) +def clang_getSkippedRanges(tu:CXTranslationUnit, file:CXFile) -> c.POINTER[CXSourceRangeList]: ... +@dll.bind(c.POINTER[CXSourceRangeList], CXTranslationUnit) +def clang_getAllSkippedRanges(tu:CXTranslationUnit) -> c.POINTER[CXSourceRangeList]: ... +@dll.bind(ctypes.c_uint32, CXTranslationUnit) +def clang_getNumDiagnostics(Unit:CXTranslationUnit) -> int: ... +CXDiagnostic: TypeAlias = ctypes.c_void_p +@dll.bind(CXDiagnostic, CXTranslationUnit, ctypes.c_uint32) +def clang_getDiagnostic(Unit:CXTranslationUnit, Index:int) -> CXDiagnostic: ... +CXDiagnosticSet: TypeAlias = ctypes.c_void_p +@dll.bind(CXDiagnosticSet, CXTranslationUnit) +def clang_getDiagnosticSetFromTU(Unit:CXTranslationUnit) -> CXDiagnosticSet: ... +@c.record +class CXString(c.Struct): + SIZE = 16 + data: ctypes.c_void_p + private_flags: int +CXString.register_fields([('data', ctypes.c_void_p, 0), ('private_flags', ctypes.c_uint32, 8)]) +@dll.bind(CXString, CXTranslationUnit) +def clang_getTranslationUnitSpelling(CTUnit:CXTranslationUnit) -> CXString: ... +@dll.bind(CXTranslationUnit, CXIndex, c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_uint32, c.POINTER[struct_CXUnsavedFile]) +def clang_createTranslationUnitFromSourceFile(CIdx:CXIndex, source_filename:c.POINTER[ctypes.c_char], num_clang_command_line_args:int, clang_command_line_args:c.POINTER[c.POINTER[ctypes.c_char]], num_unsaved_files:int, unsaved_files:c.POINTER[struct_CXUnsavedFile]) -> CXTranslationUnit: ... +@dll.bind(CXTranslationUnit, CXIndex, c.POINTER[ctypes.c_char]) +def clang_createTranslationUnit(CIdx:CXIndex, ast_filename:c.POINTER[ctypes.c_char]) -> CXTranslationUnit: ... +enum_CXErrorCode: dict[int, str] = {(CXError_Success:=0): 'CXError_Success', (CXError_Failure:=1): 'CXError_Failure', (CXError_Crashed:=2): 'CXError_Crashed', (CXError_InvalidArguments:=3): 'CXError_InvalidArguments', (CXError_ASTReadError:=4): 'CXError_ASTReadError'} +@dll.bind(ctypes.c_uint32, CXIndex, c.POINTER[ctypes.c_char], c.POINTER[CXTranslationUnit]) +def clang_createTranslationUnit2(CIdx:CXIndex, ast_filename:c.POINTER[ctypes.c_char], out_TU:c.POINTER[CXTranslationUnit]) -> ctypes.c_uint32: ... +enum_CXTranslationUnit_Flags: dict[int, str] = {(CXTranslationUnit_None:=0): 'CXTranslationUnit_None', (CXTranslationUnit_DetailedPreprocessingRecord:=1): 'CXTranslationUnit_DetailedPreprocessingRecord', (CXTranslationUnit_Incomplete:=2): 'CXTranslationUnit_Incomplete', (CXTranslationUnit_PrecompiledPreamble:=4): 'CXTranslationUnit_PrecompiledPreamble', (CXTranslationUnit_CacheCompletionResults:=8): 'CXTranslationUnit_CacheCompletionResults', (CXTranslationUnit_ForSerialization:=16): 'CXTranslationUnit_ForSerialization', (CXTranslationUnit_CXXChainedPCH:=32): 'CXTranslationUnit_CXXChainedPCH', (CXTranslationUnit_SkipFunctionBodies:=64): 'CXTranslationUnit_SkipFunctionBodies', (CXTranslationUnit_IncludeBriefCommentsInCodeCompletion:=128): 'CXTranslationUnit_IncludeBriefCommentsInCodeCompletion', (CXTranslationUnit_CreatePreambleOnFirstParse:=256): 'CXTranslationUnit_CreatePreambleOnFirstParse', (CXTranslationUnit_KeepGoing:=512): 'CXTranslationUnit_KeepGoing', (CXTranslationUnit_SingleFileParse:=1024): 'CXTranslationUnit_SingleFileParse', (CXTranslationUnit_LimitSkipFunctionBodiesToPreamble:=2048): 'CXTranslationUnit_LimitSkipFunctionBodiesToPreamble', (CXTranslationUnit_IncludeAttributedTypes:=4096): 'CXTranslationUnit_IncludeAttributedTypes', (CXTranslationUnit_VisitImplicitAttributes:=8192): 'CXTranslationUnit_VisitImplicitAttributes', (CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles:=16384): 'CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles', (CXTranslationUnit_RetainExcludedConditionalBlocks:=32768): 'CXTranslationUnit_RetainExcludedConditionalBlocks'} +@dll.bind(ctypes.c_uint32) +def clang_defaultEditingTranslationUnitOptions() -> int: ... +@dll.bind(CXTranslationUnit, CXIndex, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32, c.POINTER[struct_CXUnsavedFile], ctypes.c_uint32, ctypes.c_uint32) +def clang_parseTranslationUnit(CIdx:CXIndex, source_filename:c.POINTER[ctypes.c_char], command_line_args:c.POINTER[c.POINTER[ctypes.c_char]], num_command_line_args:int, unsaved_files:c.POINTER[struct_CXUnsavedFile], num_unsaved_files:int, options:int) -> CXTranslationUnit: ... +@dll.bind(ctypes.c_uint32, CXIndex, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32, c.POINTER[struct_CXUnsavedFile], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[CXTranslationUnit]) +def clang_parseTranslationUnit2(CIdx:CXIndex, source_filename:c.POINTER[ctypes.c_char], command_line_args:c.POINTER[c.POINTER[ctypes.c_char]], num_command_line_args:int, unsaved_files:c.POINTER[struct_CXUnsavedFile], num_unsaved_files:int, options:int, out_TU:c.POINTER[CXTranslationUnit]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, CXIndex, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32, c.POINTER[struct_CXUnsavedFile], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[CXTranslationUnit]) +def clang_parseTranslationUnit2FullArgv(CIdx:CXIndex, source_filename:c.POINTER[ctypes.c_char], command_line_args:c.POINTER[c.POINTER[ctypes.c_char]], num_command_line_args:int, unsaved_files:c.POINTER[struct_CXUnsavedFile], num_unsaved_files:int, options:int, out_TU:c.POINTER[CXTranslationUnit]) -> ctypes.c_uint32: ... +enum_CXSaveTranslationUnit_Flags: dict[int, str] = {(CXSaveTranslationUnit_None:=0): 'CXSaveTranslationUnit_None'} +@dll.bind(ctypes.c_uint32, CXTranslationUnit) +def clang_defaultSaveOptions(TU:CXTranslationUnit) -> int: ... +enum_CXSaveError: dict[int, str] = {(CXSaveError_None:=0): 'CXSaveError_None', (CXSaveError_Unknown:=1): 'CXSaveError_Unknown', (CXSaveError_TranslationErrors:=2): 'CXSaveError_TranslationErrors', (CXSaveError_InvalidTU:=3): 'CXSaveError_InvalidTU'} +@dll.bind(ctypes.c_int32, CXTranslationUnit, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def clang_saveTranslationUnit(TU:CXTranslationUnit, FileName:c.POINTER[ctypes.c_char], options:int) -> int: ... +@dll.bind(ctypes.c_uint32, CXTranslationUnit) +def clang_suspendTranslationUnit(_0:CXTranslationUnit) -> int: ... +@dll.bind(None, CXTranslationUnit) +def clang_disposeTranslationUnit(_0:CXTranslationUnit) -> None: ... +enum_CXReparse_Flags: dict[int, str] = {(CXReparse_None:=0): 'CXReparse_None'} +@dll.bind(ctypes.c_uint32, CXTranslationUnit) +def clang_defaultReparseOptions(TU:CXTranslationUnit) -> int: ... +@dll.bind(ctypes.c_int32, CXTranslationUnit, ctypes.c_uint32, c.POINTER[struct_CXUnsavedFile], ctypes.c_uint32) +def clang_reparseTranslationUnit(TU:CXTranslationUnit, num_unsaved_files:int, unsaved_files:c.POINTER[struct_CXUnsavedFile], options:int) -> int: ... +enum_CXTUResourceUsageKind: dict[int, str] = {(CXTUResourceUsage_AST:=1): 'CXTUResourceUsage_AST', (CXTUResourceUsage_Identifiers:=2): 'CXTUResourceUsage_Identifiers', (CXTUResourceUsage_Selectors:=3): 'CXTUResourceUsage_Selectors', (CXTUResourceUsage_GlobalCompletionResults:=4): 'CXTUResourceUsage_GlobalCompletionResults', (CXTUResourceUsage_SourceManagerContentCache:=5): 'CXTUResourceUsage_SourceManagerContentCache', (CXTUResourceUsage_AST_SideTables:=6): 'CXTUResourceUsage_AST_SideTables', (CXTUResourceUsage_SourceManager_Membuffer_Malloc:=7): 'CXTUResourceUsage_SourceManager_Membuffer_Malloc', (CXTUResourceUsage_SourceManager_Membuffer_MMap:=8): 'CXTUResourceUsage_SourceManager_Membuffer_MMap', (CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:=9): 'CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc', (CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:=10): 'CXTUResourceUsage_ExternalASTSource_Membuffer_MMap', (CXTUResourceUsage_Preprocessor:=11): 'CXTUResourceUsage_Preprocessor', (CXTUResourceUsage_PreprocessingRecord:=12): 'CXTUResourceUsage_PreprocessingRecord', (CXTUResourceUsage_SourceManager_DataStructures:=13): 'CXTUResourceUsage_SourceManager_DataStructures', (CXTUResourceUsage_Preprocessor_HeaderSearch:=14): 'CXTUResourceUsage_Preprocessor_HeaderSearch', (CXTUResourceUsage_MEMORY_IN_BYTES_BEGIN:=1): 'CXTUResourceUsage_MEMORY_IN_BYTES_BEGIN', (CXTUResourceUsage_MEMORY_IN_BYTES_END:=14): 'CXTUResourceUsage_MEMORY_IN_BYTES_END', (CXTUResourceUsage_First:=1): 'CXTUResourceUsage_First', (CXTUResourceUsage_Last:=14): 'CXTUResourceUsage_Last'} +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32) +def clang_getTUResourceUsageName(kind:ctypes.c_uint32) -> c.POINTER[ctypes.c_char]: ... +@c.record +class struct_CXTUResourceUsageEntry(c.Struct): + SIZE = 16 + kind: int + amount: int +struct_CXTUResourceUsageEntry.register_fields([('kind', ctypes.c_uint32, 0), ('amount', ctypes.c_uint64, 8)]) +CXTUResourceUsageEntry: TypeAlias = struct_CXTUResourceUsageEntry +@c.record +class struct_CXTUResourceUsage(c.Struct): + SIZE = 24 + data: ctypes.c_void_p + numEntries: int + entries: c.POINTER[struct_CXTUResourceUsageEntry] +struct_CXTUResourceUsage.register_fields([('data', ctypes.c_void_p, 0), ('numEntries', ctypes.c_uint32, 8), ('entries', c.POINTER[CXTUResourceUsageEntry], 16)]) +CXTUResourceUsage: TypeAlias = struct_CXTUResourceUsage +@dll.bind(CXTUResourceUsage, CXTranslationUnit) +def clang_getCXTUResourceUsage(TU:CXTranslationUnit) -> CXTUResourceUsage: ... +@dll.bind(None, CXTUResourceUsage) +def clang_disposeCXTUResourceUsage(usage:CXTUResourceUsage) -> None: ... +@dll.bind(CXTargetInfo, CXTranslationUnit) +def clang_getTranslationUnitTargetInfo(CTUnit:CXTranslationUnit) -> CXTargetInfo: ... +@dll.bind(None, CXTargetInfo) +def clang_TargetInfo_dispose(Info:CXTargetInfo) -> None: ... +@dll.bind(CXString, CXTargetInfo) +def clang_TargetInfo_getTriple(Info:CXTargetInfo) -> CXString: ... +@dll.bind(ctypes.c_int32, CXTargetInfo) +def clang_TargetInfo_getPointerWidth(Info:CXTargetInfo) -> int: ... +enum_CXCursorKind: dict[int, str] = {(CXCursor_UnexposedDecl:=1): 'CXCursor_UnexposedDecl', (CXCursor_StructDecl:=2): 'CXCursor_StructDecl', (CXCursor_UnionDecl:=3): 'CXCursor_UnionDecl', (CXCursor_ClassDecl:=4): 'CXCursor_ClassDecl', (CXCursor_EnumDecl:=5): 'CXCursor_EnumDecl', (CXCursor_FieldDecl:=6): 'CXCursor_FieldDecl', (CXCursor_EnumConstantDecl:=7): 'CXCursor_EnumConstantDecl', (CXCursor_FunctionDecl:=8): 'CXCursor_FunctionDecl', (CXCursor_VarDecl:=9): 'CXCursor_VarDecl', (CXCursor_ParmDecl:=10): 'CXCursor_ParmDecl', (CXCursor_ObjCInterfaceDecl:=11): 'CXCursor_ObjCInterfaceDecl', (CXCursor_ObjCCategoryDecl:=12): 'CXCursor_ObjCCategoryDecl', (CXCursor_ObjCProtocolDecl:=13): 'CXCursor_ObjCProtocolDecl', (CXCursor_ObjCPropertyDecl:=14): 'CXCursor_ObjCPropertyDecl', (CXCursor_ObjCIvarDecl:=15): 'CXCursor_ObjCIvarDecl', (CXCursor_ObjCInstanceMethodDecl:=16): 'CXCursor_ObjCInstanceMethodDecl', (CXCursor_ObjCClassMethodDecl:=17): 'CXCursor_ObjCClassMethodDecl', (CXCursor_ObjCImplementationDecl:=18): 'CXCursor_ObjCImplementationDecl', (CXCursor_ObjCCategoryImplDecl:=19): 'CXCursor_ObjCCategoryImplDecl', (CXCursor_TypedefDecl:=20): 'CXCursor_TypedefDecl', (CXCursor_CXXMethod:=21): 'CXCursor_CXXMethod', (CXCursor_Namespace:=22): 'CXCursor_Namespace', (CXCursor_LinkageSpec:=23): 'CXCursor_LinkageSpec', (CXCursor_Constructor:=24): 'CXCursor_Constructor', (CXCursor_Destructor:=25): 'CXCursor_Destructor', (CXCursor_ConversionFunction:=26): 'CXCursor_ConversionFunction', (CXCursor_TemplateTypeParameter:=27): 'CXCursor_TemplateTypeParameter', (CXCursor_NonTypeTemplateParameter:=28): 'CXCursor_NonTypeTemplateParameter', (CXCursor_TemplateTemplateParameter:=29): 'CXCursor_TemplateTemplateParameter', (CXCursor_FunctionTemplate:=30): 'CXCursor_FunctionTemplate', (CXCursor_ClassTemplate:=31): 'CXCursor_ClassTemplate', (CXCursor_ClassTemplatePartialSpecialization:=32): 'CXCursor_ClassTemplatePartialSpecialization', (CXCursor_NamespaceAlias:=33): 'CXCursor_NamespaceAlias', (CXCursor_UsingDirective:=34): 'CXCursor_UsingDirective', (CXCursor_UsingDeclaration:=35): 'CXCursor_UsingDeclaration', (CXCursor_TypeAliasDecl:=36): 'CXCursor_TypeAliasDecl', (CXCursor_ObjCSynthesizeDecl:=37): 'CXCursor_ObjCSynthesizeDecl', (CXCursor_ObjCDynamicDecl:=38): 'CXCursor_ObjCDynamicDecl', (CXCursor_CXXAccessSpecifier:=39): 'CXCursor_CXXAccessSpecifier', (CXCursor_FirstDecl:=1): 'CXCursor_FirstDecl', (CXCursor_LastDecl:=39): 'CXCursor_LastDecl', (CXCursor_FirstRef:=40): 'CXCursor_FirstRef', (CXCursor_ObjCSuperClassRef:=40): 'CXCursor_ObjCSuperClassRef', (CXCursor_ObjCProtocolRef:=41): 'CXCursor_ObjCProtocolRef', (CXCursor_ObjCClassRef:=42): 'CXCursor_ObjCClassRef', (CXCursor_TypeRef:=43): 'CXCursor_TypeRef', (CXCursor_CXXBaseSpecifier:=44): 'CXCursor_CXXBaseSpecifier', (CXCursor_TemplateRef:=45): 'CXCursor_TemplateRef', (CXCursor_NamespaceRef:=46): 'CXCursor_NamespaceRef', (CXCursor_MemberRef:=47): 'CXCursor_MemberRef', (CXCursor_LabelRef:=48): 'CXCursor_LabelRef', (CXCursor_OverloadedDeclRef:=49): 'CXCursor_OverloadedDeclRef', (CXCursor_VariableRef:=50): 'CXCursor_VariableRef', (CXCursor_LastRef:=50): 'CXCursor_LastRef', (CXCursor_FirstInvalid:=70): 'CXCursor_FirstInvalid', (CXCursor_InvalidFile:=70): 'CXCursor_InvalidFile', (CXCursor_NoDeclFound:=71): 'CXCursor_NoDeclFound', (CXCursor_NotImplemented:=72): 'CXCursor_NotImplemented', (CXCursor_InvalidCode:=73): 'CXCursor_InvalidCode', (CXCursor_LastInvalid:=73): 'CXCursor_LastInvalid', (CXCursor_FirstExpr:=100): 'CXCursor_FirstExpr', (CXCursor_UnexposedExpr:=100): 'CXCursor_UnexposedExpr', (CXCursor_DeclRefExpr:=101): 'CXCursor_DeclRefExpr', (CXCursor_MemberRefExpr:=102): 'CXCursor_MemberRefExpr', (CXCursor_CallExpr:=103): 'CXCursor_CallExpr', (CXCursor_ObjCMessageExpr:=104): 'CXCursor_ObjCMessageExpr', (CXCursor_BlockExpr:=105): 'CXCursor_BlockExpr', (CXCursor_IntegerLiteral:=106): 'CXCursor_IntegerLiteral', (CXCursor_FloatingLiteral:=107): 'CXCursor_FloatingLiteral', (CXCursor_ImaginaryLiteral:=108): 'CXCursor_ImaginaryLiteral', (CXCursor_StringLiteral:=109): 'CXCursor_StringLiteral', (CXCursor_CharacterLiteral:=110): 'CXCursor_CharacterLiteral', (CXCursor_ParenExpr:=111): 'CXCursor_ParenExpr', (CXCursor_UnaryOperator:=112): 'CXCursor_UnaryOperator', (CXCursor_ArraySubscriptExpr:=113): 'CXCursor_ArraySubscriptExpr', (CXCursor_BinaryOperator:=114): 'CXCursor_BinaryOperator', (CXCursor_CompoundAssignOperator:=115): 'CXCursor_CompoundAssignOperator', (CXCursor_ConditionalOperator:=116): 'CXCursor_ConditionalOperator', (CXCursor_CStyleCastExpr:=117): 'CXCursor_CStyleCastExpr', (CXCursor_CompoundLiteralExpr:=118): 'CXCursor_CompoundLiteralExpr', (CXCursor_InitListExpr:=119): 'CXCursor_InitListExpr', (CXCursor_AddrLabelExpr:=120): 'CXCursor_AddrLabelExpr', (CXCursor_StmtExpr:=121): 'CXCursor_StmtExpr', (CXCursor_GenericSelectionExpr:=122): 'CXCursor_GenericSelectionExpr', (CXCursor_GNUNullExpr:=123): 'CXCursor_GNUNullExpr', (CXCursor_CXXStaticCastExpr:=124): 'CXCursor_CXXStaticCastExpr', (CXCursor_CXXDynamicCastExpr:=125): 'CXCursor_CXXDynamicCastExpr', (CXCursor_CXXReinterpretCastExpr:=126): 'CXCursor_CXXReinterpretCastExpr', (CXCursor_CXXConstCastExpr:=127): 'CXCursor_CXXConstCastExpr', (CXCursor_CXXFunctionalCastExpr:=128): 'CXCursor_CXXFunctionalCastExpr', (CXCursor_CXXTypeidExpr:=129): 'CXCursor_CXXTypeidExpr', (CXCursor_CXXBoolLiteralExpr:=130): 'CXCursor_CXXBoolLiteralExpr', (CXCursor_CXXNullPtrLiteralExpr:=131): 'CXCursor_CXXNullPtrLiteralExpr', (CXCursor_CXXThisExpr:=132): 'CXCursor_CXXThisExpr', (CXCursor_CXXThrowExpr:=133): 'CXCursor_CXXThrowExpr', (CXCursor_CXXNewExpr:=134): 'CXCursor_CXXNewExpr', (CXCursor_CXXDeleteExpr:=135): 'CXCursor_CXXDeleteExpr', (CXCursor_UnaryExpr:=136): 'CXCursor_UnaryExpr', (CXCursor_ObjCStringLiteral:=137): 'CXCursor_ObjCStringLiteral', (CXCursor_ObjCEncodeExpr:=138): 'CXCursor_ObjCEncodeExpr', (CXCursor_ObjCSelectorExpr:=139): 'CXCursor_ObjCSelectorExpr', (CXCursor_ObjCProtocolExpr:=140): 'CXCursor_ObjCProtocolExpr', (CXCursor_ObjCBridgedCastExpr:=141): 'CXCursor_ObjCBridgedCastExpr', (CXCursor_PackExpansionExpr:=142): 'CXCursor_PackExpansionExpr', (CXCursor_SizeOfPackExpr:=143): 'CXCursor_SizeOfPackExpr', (CXCursor_LambdaExpr:=144): 'CXCursor_LambdaExpr', (CXCursor_ObjCBoolLiteralExpr:=145): 'CXCursor_ObjCBoolLiteralExpr', (CXCursor_ObjCSelfExpr:=146): 'CXCursor_ObjCSelfExpr', (CXCursor_ArraySectionExpr:=147): 'CXCursor_ArraySectionExpr', (CXCursor_ObjCAvailabilityCheckExpr:=148): 'CXCursor_ObjCAvailabilityCheckExpr', (CXCursor_FixedPointLiteral:=149): 'CXCursor_FixedPointLiteral', (CXCursor_OMPArrayShapingExpr:=150): 'CXCursor_OMPArrayShapingExpr', (CXCursor_OMPIteratorExpr:=151): 'CXCursor_OMPIteratorExpr', (CXCursor_CXXAddrspaceCastExpr:=152): 'CXCursor_CXXAddrspaceCastExpr', (CXCursor_ConceptSpecializationExpr:=153): 'CXCursor_ConceptSpecializationExpr', (CXCursor_RequiresExpr:=154): 'CXCursor_RequiresExpr', (CXCursor_CXXParenListInitExpr:=155): 'CXCursor_CXXParenListInitExpr', (CXCursor_PackIndexingExpr:=156): 'CXCursor_PackIndexingExpr', (CXCursor_LastExpr:=156): 'CXCursor_LastExpr', (CXCursor_FirstStmt:=200): 'CXCursor_FirstStmt', (CXCursor_UnexposedStmt:=200): 'CXCursor_UnexposedStmt', (CXCursor_LabelStmt:=201): 'CXCursor_LabelStmt', (CXCursor_CompoundStmt:=202): 'CXCursor_CompoundStmt', (CXCursor_CaseStmt:=203): 'CXCursor_CaseStmt', (CXCursor_DefaultStmt:=204): 'CXCursor_DefaultStmt', (CXCursor_IfStmt:=205): 'CXCursor_IfStmt', (CXCursor_SwitchStmt:=206): 'CXCursor_SwitchStmt', (CXCursor_WhileStmt:=207): 'CXCursor_WhileStmt', (CXCursor_DoStmt:=208): 'CXCursor_DoStmt', (CXCursor_ForStmt:=209): 'CXCursor_ForStmt', (CXCursor_GotoStmt:=210): 'CXCursor_GotoStmt', (CXCursor_IndirectGotoStmt:=211): 'CXCursor_IndirectGotoStmt', (CXCursor_ContinueStmt:=212): 'CXCursor_ContinueStmt', (CXCursor_BreakStmt:=213): 'CXCursor_BreakStmt', (CXCursor_ReturnStmt:=214): 'CXCursor_ReturnStmt', (CXCursor_GCCAsmStmt:=215): 'CXCursor_GCCAsmStmt', (CXCursor_AsmStmt:=215): 'CXCursor_AsmStmt', (CXCursor_ObjCAtTryStmt:=216): 'CXCursor_ObjCAtTryStmt', (CXCursor_ObjCAtCatchStmt:=217): 'CXCursor_ObjCAtCatchStmt', (CXCursor_ObjCAtFinallyStmt:=218): 'CXCursor_ObjCAtFinallyStmt', (CXCursor_ObjCAtThrowStmt:=219): 'CXCursor_ObjCAtThrowStmt', (CXCursor_ObjCAtSynchronizedStmt:=220): 'CXCursor_ObjCAtSynchronizedStmt', (CXCursor_ObjCAutoreleasePoolStmt:=221): 'CXCursor_ObjCAutoreleasePoolStmt', (CXCursor_ObjCForCollectionStmt:=222): 'CXCursor_ObjCForCollectionStmt', (CXCursor_CXXCatchStmt:=223): 'CXCursor_CXXCatchStmt', (CXCursor_CXXTryStmt:=224): 'CXCursor_CXXTryStmt', (CXCursor_CXXForRangeStmt:=225): 'CXCursor_CXXForRangeStmt', (CXCursor_SEHTryStmt:=226): 'CXCursor_SEHTryStmt', (CXCursor_SEHExceptStmt:=227): 'CXCursor_SEHExceptStmt', (CXCursor_SEHFinallyStmt:=228): 'CXCursor_SEHFinallyStmt', (CXCursor_MSAsmStmt:=229): 'CXCursor_MSAsmStmt', (CXCursor_NullStmt:=230): 'CXCursor_NullStmt', (CXCursor_DeclStmt:=231): 'CXCursor_DeclStmt', (CXCursor_OMPParallelDirective:=232): 'CXCursor_OMPParallelDirective', (CXCursor_OMPSimdDirective:=233): 'CXCursor_OMPSimdDirective', (CXCursor_OMPForDirective:=234): 'CXCursor_OMPForDirective', (CXCursor_OMPSectionsDirective:=235): 'CXCursor_OMPSectionsDirective', (CXCursor_OMPSectionDirective:=236): 'CXCursor_OMPSectionDirective', (CXCursor_OMPSingleDirective:=237): 'CXCursor_OMPSingleDirective', (CXCursor_OMPParallelForDirective:=238): 'CXCursor_OMPParallelForDirective', (CXCursor_OMPParallelSectionsDirective:=239): 'CXCursor_OMPParallelSectionsDirective', (CXCursor_OMPTaskDirective:=240): 'CXCursor_OMPTaskDirective', (CXCursor_OMPMasterDirective:=241): 'CXCursor_OMPMasterDirective', (CXCursor_OMPCriticalDirective:=242): 'CXCursor_OMPCriticalDirective', (CXCursor_OMPTaskyieldDirective:=243): 'CXCursor_OMPTaskyieldDirective', (CXCursor_OMPBarrierDirective:=244): 'CXCursor_OMPBarrierDirective', (CXCursor_OMPTaskwaitDirective:=245): 'CXCursor_OMPTaskwaitDirective', (CXCursor_OMPFlushDirective:=246): 'CXCursor_OMPFlushDirective', (CXCursor_SEHLeaveStmt:=247): 'CXCursor_SEHLeaveStmt', (CXCursor_OMPOrderedDirective:=248): 'CXCursor_OMPOrderedDirective', (CXCursor_OMPAtomicDirective:=249): 'CXCursor_OMPAtomicDirective', (CXCursor_OMPForSimdDirective:=250): 'CXCursor_OMPForSimdDirective', (CXCursor_OMPParallelForSimdDirective:=251): 'CXCursor_OMPParallelForSimdDirective', (CXCursor_OMPTargetDirective:=252): 'CXCursor_OMPTargetDirective', (CXCursor_OMPTeamsDirective:=253): 'CXCursor_OMPTeamsDirective', (CXCursor_OMPTaskgroupDirective:=254): 'CXCursor_OMPTaskgroupDirective', (CXCursor_OMPCancellationPointDirective:=255): 'CXCursor_OMPCancellationPointDirective', (CXCursor_OMPCancelDirective:=256): 'CXCursor_OMPCancelDirective', (CXCursor_OMPTargetDataDirective:=257): 'CXCursor_OMPTargetDataDirective', (CXCursor_OMPTaskLoopDirective:=258): 'CXCursor_OMPTaskLoopDirective', (CXCursor_OMPTaskLoopSimdDirective:=259): 'CXCursor_OMPTaskLoopSimdDirective', (CXCursor_OMPDistributeDirective:=260): 'CXCursor_OMPDistributeDirective', (CXCursor_OMPTargetEnterDataDirective:=261): 'CXCursor_OMPTargetEnterDataDirective', (CXCursor_OMPTargetExitDataDirective:=262): 'CXCursor_OMPTargetExitDataDirective', (CXCursor_OMPTargetParallelDirective:=263): 'CXCursor_OMPTargetParallelDirective', (CXCursor_OMPTargetParallelForDirective:=264): 'CXCursor_OMPTargetParallelForDirective', (CXCursor_OMPTargetUpdateDirective:=265): 'CXCursor_OMPTargetUpdateDirective', (CXCursor_OMPDistributeParallelForDirective:=266): 'CXCursor_OMPDistributeParallelForDirective', (CXCursor_OMPDistributeParallelForSimdDirective:=267): 'CXCursor_OMPDistributeParallelForSimdDirective', (CXCursor_OMPDistributeSimdDirective:=268): 'CXCursor_OMPDistributeSimdDirective', (CXCursor_OMPTargetParallelForSimdDirective:=269): 'CXCursor_OMPTargetParallelForSimdDirective', (CXCursor_OMPTargetSimdDirective:=270): 'CXCursor_OMPTargetSimdDirective', (CXCursor_OMPTeamsDistributeDirective:=271): 'CXCursor_OMPTeamsDistributeDirective', (CXCursor_OMPTeamsDistributeSimdDirective:=272): 'CXCursor_OMPTeamsDistributeSimdDirective', (CXCursor_OMPTeamsDistributeParallelForSimdDirective:=273): 'CXCursor_OMPTeamsDistributeParallelForSimdDirective', (CXCursor_OMPTeamsDistributeParallelForDirective:=274): 'CXCursor_OMPTeamsDistributeParallelForDirective', (CXCursor_OMPTargetTeamsDirective:=275): 'CXCursor_OMPTargetTeamsDirective', (CXCursor_OMPTargetTeamsDistributeDirective:=276): 'CXCursor_OMPTargetTeamsDistributeDirective', (CXCursor_OMPTargetTeamsDistributeParallelForDirective:=277): 'CXCursor_OMPTargetTeamsDistributeParallelForDirective', (CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective:=278): 'CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective', (CXCursor_OMPTargetTeamsDistributeSimdDirective:=279): 'CXCursor_OMPTargetTeamsDistributeSimdDirective', (CXCursor_BuiltinBitCastExpr:=280): 'CXCursor_BuiltinBitCastExpr', (CXCursor_OMPMasterTaskLoopDirective:=281): 'CXCursor_OMPMasterTaskLoopDirective', (CXCursor_OMPParallelMasterTaskLoopDirective:=282): 'CXCursor_OMPParallelMasterTaskLoopDirective', (CXCursor_OMPMasterTaskLoopSimdDirective:=283): 'CXCursor_OMPMasterTaskLoopSimdDirective', (CXCursor_OMPParallelMasterTaskLoopSimdDirective:=284): 'CXCursor_OMPParallelMasterTaskLoopSimdDirective', (CXCursor_OMPParallelMasterDirective:=285): 'CXCursor_OMPParallelMasterDirective', (CXCursor_OMPDepobjDirective:=286): 'CXCursor_OMPDepobjDirective', (CXCursor_OMPScanDirective:=287): 'CXCursor_OMPScanDirective', (CXCursor_OMPTileDirective:=288): 'CXCursor_OMPTileDirective', (CXCursor_OMPCanonicalLoop:=289): 'CXCursor_OMPCanonicalLoop', (CXCursor_OMPInteropDirective:=290): 'CXCursor_OMPInteropDirective', (CXCursor_OMPDispatchDirective:=291): 'CXCursor_OMPDispatchDirective', (CXCursor_OMPMaskedDirective:=292): 'CXCursor_OMPMaskedDirective', (CXCursor_OMPUnrollDirective:=293): 'CXCursor_OMPUnrollDirective', (CXCursor_OMPMetaDirective:=294): 'CXCursor_OMPMetaDirective', (CXCursor_OMPGenericLoopDirective:=295): 'CXCursor_OMPGenericLoopDirective', (CXCursor_OMPTeamsGenericLoopDirective:=296): 'CXCursor_OMPTeamsGenericLoopDirective', (CXCursor_OMPTargetTeamsGenericLoopDirective:=297): 'CXCursor_OMPTargetTeamsGenericLoopDirective', (CXCursor_OMPParallelGenericLoopDirective:=298): 'CXCursor_OMPParallelGenericLoopDirective', (CXCursor_OMPTargetParallelGenericLoopDirective:=299): 'CXCursor_OMPTargetParallelGenericLoopDirective', (CXCursor_OMPParallelMaskedDirective:=300): 'CXCursor_OMPParallelMaskedDirective', (CXCursor_OMPMaskedTaskLoopDirective:=301): 'CXCursor_OMPMaskedTaskLoopDirective', (CXCursor_OMPMaskedTaskLoopSimdDirective:=302): 'CXCursor_OMPMaskedTaskLoopSimdDirective', (CXCursor_OMPParallelMaskedTaskLoopDirective:=303): 'CXCursor_OMPParallelMaskedTaskLoopDirective', (CXCursor_OMPParallelMaskedTaskLoopSimdDirective:=304): 'CXCursor_OMPParallelMaskedTaskLoopSimdDirective', (CXCursor_OMPErrorDirective:=305): 'CXCursor_OMPErrorDirective', (CXCursor_OMPScopeDirective:=306): 'CXCursor_OMPScopeDirective', (CXCursor_OMPReverseDirective:=307): 'CXCursor_OMPReverseDirective', (CXCursor_OMPInterchangeDirective:=308): 'CXCursor_OMPInterchangeDirective', (CXCursor_OMPAssumeDirective:=309): 'CXCursor_OMPAssumeDirective', (CXCursor_OpenACCComputeConstruct:=320): 'CXCursor_OpenACCComputeConstruct', (CXCursor_OpenACCLoopConstruct:=321): 'CXCursor_OpenACCLoopConstruct', (CXCursor_OpenACCCombinedConstruct:=322): 'CXCursor_OpenACCCombinedConstruct', (CXCursor_OpenACCDataConstruct:=323): 'CXCursor_OpenACCDataConstruct', (CXCursor_OpenACCEnterDataConstruct:=324): 'CXCursor_OpenACCEnterDataConstruct', (CXCursor_OpenACCExitDataConstruct:=325): 'CXCursor_OpenACCExitDataConstruct', (CXCursor_OpenACCHostDataConstruct:=326): 'CXCursor_OpenACCHostDataConstruct', (CXCursor_OpenACCWaitConstruct:=327): 'CXCursor_OpenACCWaitConstruct', (CXCursor_OpenACCInitConstruct:=328): 'CXCursor_OpenACCInitConstruct', (CXCursor_OpenACCShutdownConstruct:=329): 'CXCursor_OpenACCShutdownConstruct', (CXCursor_OpenACCSetConstruct:=330): 'CXCursor_OpenACCSetConstruct', (CXCursor_OpenACCUpdateConstruct:=331): 'CXCursor_OpenACCUpdateConstruct', (CXCursor_LastStmt:=331): 'CXCursor_LastStmt', (CXCursor_TranslationUnit:=350): 'CXCursor_TranslationUnit', (CXCursor_FirstAttr:=400): 'CXCursor_FirstAttr', (CXCursor_UnexposedAttr:=400): 'CXCursor_UnexposedAttr', (CXCursor_IBActionAttr:=401): 'CXCursor_IBActionAttr', (CXCursor_IBOutletAttr:=402): 'CXCursor_IBOutletAttr', (CXCursor_IBOutletCollectionAttr:=403): 'CXCursor_IBOutletCollectionAttr', (CXCursor_CXXFinalAttr:=404): 'CXCursor_CXXFinalAttr', (CXCursor_CXXOverrideAttr:=405): 'CXCursor_CXXOverrideAttr', (CXCursor_AnnotateAttr:=406): 'CXCursor_AnnotateAttr', (CXCursor_AsmLabelAttr:=407): 'CXCursor_AsmLabelAttr', (CXCursor_PackedAttr:=408): 'CXCursor_PackedAttr', (CXCursor_PureAttr:=409): 'CXCursor_PureAttr', (CXCursor_ConstAttr:=410): 'CXCursor_ConstAttr', (CXCursor_NoDuplicateAttr:=411): 'CXCursor_NoDuplicateAttr', (CXCursor_CUDAConstantAttr:=412): 'CXCursor_CUDAConstantAttr', (CXCursor_CUDADeviceAttr:=413): 'CXCursor_CUDADeviceAttr', (CXCursor_CUDAGlobalAttr:=414): 'CXCursor_CUDAGlobalAttr', (CXCursor_CUDAHostAttr:=415): 'CXCursor_CUDAHostAttr', (CXCursor_CUDASharedAttr:=416): 'CXCursor_CUDASharedAttr', (CXCursor_VisibilityAttr:=417): 'CXCursor_VisibilityAttr', (CXCursor_DLLExport:=418): 'CXCursor_DLLExport', (CXCursor_DLLImport:=419): 'CXCursor_DLLImport', (CXCursor_NSReturnsRetained:=420): 'CXCursor_NSReturnsRetained', (CXCursor_NSReturnsNotRetained:=421): 'CXCursor_NSReturnsNotRetained', (CXCursor_NSReturnsAutoreleased:=422): 'CXCursor_NSReturnsAutoreleased', (CXCursor_NSConsumesSelf:=423): 'CXCursor_NSConsumesSelf', (CXCursor_NSConsumed:=424): 'CXCursor_NSConsumed', (CXCursor_ObjCException:=425): 'CXCursor_ObjCException', (CXCursor_ObjCNSObject:=426): 'CXCursor_ObjCNSObject', (CXCursor_ObjCIndependentClass:=427): 'CXCursor_ObjCIndependentClass', (CXCursor_ObjCPreciseLifetime:=428): 'CXCursor_ObjCPreciseLifetime', (CXCursor_ObjCReturnsInnerPointer:=429): 'CXCursor_ObjCReturnsInnerPointer', (CXCursor_ObjCRequiresSuper:=430): 'CXCursor_ObjCRequiresSuper', (CXCursor_ObjCRootClass:=431): 'CXCursor_ObjCRootClass', (CXCursor_ObjCSubclassingRestricted:=432): 'CXCursor_ObjCSubclassingRestricted', (CXCursor_ObjCExplicitProtocolImpl:=433): 'CXCursor_ObjCExplicitProtocolImpl', (CXCursor_ObjCDesignatedInitializer:=434): 'CXCursor_ObjCDesignatedInitializer', (CXCursor_ObjCRuntimeVisible:=435): 'CXCursor_ObjCRuntimeVisible', (CXCursor_ObjCBoxable:=436): 'CXCursor_ObjCBoxable', (CXCursor_FlagEnum:=437): 'CXCursor_FlagEnum', (CXCursor_ConvergentAttr:=438): 'CXCursor_ConvergentAttr', (CXCursor_WarnUnusedAttr:=439): 'CXCursor_WarnUnusedAttr', (CXCursor_WarnUnusedResultAttr:=440): 'CXCursor_WarnUnusedResultAttr', (CXCursor_AlignedAttr:=441): 'CXCursor_AlignedAttr', (CXCursor_LastAttr:=441): 'CXCursor_LastAttr', (CXCursor_PreprocessingDirective:=500): 'CXCursor_PreprocessingDirective', (CXCursor_MacroDefinition:=501): 'CXCursor_MacroDefinition', (CXCursor_MacroExpansion:=502): 'CXCursor_MacroExpansion', (CXCursor_MacroInstantiation:=502): 'CXCursor_MacroInstantiation', (CXCursor_InclusionDirective:=503): 'CXCursor_InclusionDirective', (CXCursor_FirstPreprocessing:=500): 'CXCursor_FirstPreprocessing', (CXCursor_LastPreprocessing:=503): 'CXCursor_LastPreprocessing', (CXCursor_ModuleImportDecl:=600): 'CXCursor_ModuleImportDecl', (CXCursor_TypeAliasTemplateDecl:=601): 'CXCursor_TypeAliasTemplateDecl', (CXCursor_StaticAssert:=602): 'CXCursor_StaticAssert', (CXCursor_FriendDecl:=603): 'CXCursor_FriendDecl', (CXCursor_ConceptDecl:=604): 'CXCursor_ConceptDecl', (CXCursor_FirstExtraDecl:=600): 'CXCursor_FirstExtraDecl', (CXCursor_LastExtraDecl:=604): 'CXCursor_LastExtraDecl', (CXCursor_OverloadCandidate:=700): 'CXCursor_OverloadCandidate'} +@c.record +class CXCursor(c.Struct): + SIZE = 32 + kind: int + xdata: int + data: c.Array[ctypes.c_void_p, Literal[3]] +CXCursor.register_fields([('kind', ctypes.c_uint32, 0), ('xdata', ctypes.c_int32, 4), ('data', c.Array[ctypes.c_void_p, Literal[3]], 8)]) +@dll.bind(CXCursor) +def clang_getNullCursor() -> CXCursor: ... +@dll.bind(CXCursor, CXTranslationUnit) +def clang_getTranslationUnitCursor(_0:CXTranslationUnit) -> CXCursor: ... +@dll.bind(ctypes.c_uint32, CXCursor, CXCursor) +def clang_equalCursors(_0:CXCursor, _1:CXCursor) -> int: ... +@dll.bind(ctypes.c_int32, CXCursor) +def clang_Cursor_isNull(cursor:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_hashCursor(_0:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCursorKind(_0:CXCursor) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isDeclaration(_0:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_isInvalidDeclaration(_0:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isReference(_0:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isExpression(_0:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isStatement(_0:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isAttribute(_0:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_hasAttrs(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isInvalid(_0:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isTranslationUnit(_0:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isPreprocessing(_0:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def clang_isUnexposed(_0:ctypes.c_uint32) -> int: ... +enum_CXLinkageKind: dict[int, str] = {(CXLinkage_Invalid:=0): 'CXLinkage_Invalid', (CXLinkage_NoLinkage:=1): 'CXLinkage_NoLinkage', (CXLinkage_Internal:=2): 'CXLinkage_Internal', (CXLinkage_UniqueExternal:=3): 'CXLinkage_UniqueExternal', (CXLinkage_External:=4): 'CXLinkage_External'} +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCursorLinkage(cursor:CXCursor) -> ctypes.c_uint32: ... +enum_CXVisibilityKind: dict[int, str] = {(CXVisibility_Invalid:=0): 'CXVisibility_Invalid', (CXVisibility_Hidden:=1): 'CXVisibility_Hidden', (CXVisibility_Protected:=2): 'CXVisibility_Protected', (CXVisibility_Default:=3): 'CXVisibility_Default'} +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCursorVisibility(cursor:CXCursor) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCursorAvailability(cursor:CXCursor) -> ctypes.c_uint32: ... +@c.record +class struct_CXPlatformAvailability(c.Struct): + SIZE = 72 + Platform: CXString + Introduced: struct_CXVersion + Deprecated: struct_CXVersion + Obsoleted: struct_CXVersion + Unavailable: int + Message: CXString +struct_CXPlatformAvailability.register_fields([('Platform', CXString, 0), ('Introduced', CXVersion, 16), ('Deprecated', CXVersion, 28), ('Obsoleted', CXVersion, 40), ('Unavailable', ctypes.c_int32, 52), ('Message', CXString, 56)]) +CXPlatformAvailability: TypeAlias = struct_CXPlatformAvailability +@dll.bind(ctypes.c_int32, CXCursor, c.POINTER[ctypes.c_int32], c.POINTER[CXString], c.POINTER[ctypes.c_int32], c.POINTER[CXString], c.POINTER[CXPlatformAvailability], ctypes.c_int32) +def clang_getCursorPlatformAvailability(cursor:CXCursor, always_deprecated:c.POINTER[ctypes.c_int32], deprecated_message:c.POINTER[CXString], always_unavailable:c.POINTER[ctypes.c_int32], unavailable_message:c.POINTER[CXString], availability:c.POINTER[CXPlatformAvailability], availability_size:int) -> int: ... +@dll.bind(None, c.POINTER[CXPlatformAvailability]) +def clang_disposeCXPlatformAvailability(availability:c.POINTER[CXPlatformAvailability]) -> None: ... +@dll.bind(CXCursor, CXCursor) +def clang_Cursor_getVarDeclInitializer(cursor:CXCursor) -> CXCursor: ... +@dll.bind(ctypes.c_int32, CXCursor) +def clang_Cursor_hasVarDeclGlobalStorage(cursor:CXCursor) -> int: ... +@dll.bind(ctypes.c_int32, CXCursor) +def clang_Cursor_hasVarDeclExternalStorage(cursor:CXCursor) -> int: ... +enum_CXLanguageKind: dict[int, str] = {(CXLanguage_Invalid:=0): 'CXLanguage_Invalid', (CXLanguage_C:=1): 'CXLanguage_C', (CXLanguage_ObjC:=2): 'CXLanguage_ObjC', (CXLanguage_CPlusPlus:=3): 'CXLanguage_CPlusPlus'} +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCursorLanguage(cursor:CXCursor) -> ctypes.c_uint32: ... +enum_CXTLSKind: dict[int, str] = {(CXTLS_None:=0): 'CXTLS_None', (CXTLS_Dynamic:=1): 'CXTLS_Dynamic', (CXTLS_Static:=2): 'CXTLS_Static'} +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCursorTLSKind(cursor:CXCursor) -> ctypes.c_uint32: ... +@dll.bind(CXTranslationUnit, CXCursor) +def clang_Cursor_getTranslationUnit(_0:CXCursor) -> CXTranslationUnit: ... +class struct_CXCursorSetImpl(c.Struct): pass +CXCursorSet: TypeAlias = c.POINTER[struct_CXCursorSetImpl] +@dll.bind(CXCursorSet) +def clang_createCXCursorSet() -> CXCursorSet: ... +@dll.bind(None, CXCursorSet) +def clang_disposeCXCursorSet(cset:CXCursorSet) -> None: ... +@dll.bind(ctypes.c_uint32, CXCursorSet, CXCursor) +def clang_CXCursorSet_contains(cset:CXCursorSet, cursor:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursorSet, CXCursor) +def clang_CXCursorSet_insert(cset:CXCursorSet, cursor:CXCursor) -> int: ... +@dll.bind(CXCursor, CXCursor) +def clang_getCursorSemanticParent(cursor:CXCursor) -> CXCursor: ... +@dll.bind(CXCursor, CXCursor) +def clang_getCursorLexicalParent(cursor:CXCursor) -> CXCursor: ... +@dll.bind(None, CXCursor, c.POINTER[c.POINTER[CXCursor]], c.POINTER[ctypes.c_uint32]) +def clang_getOverriddenCursors(cursor:CXCursor, overridden:c.POINTER[c.POINTER[CXCursor]], num_overridden:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, c.POINTER[CXCursor]) +def clang_disposeOverriddenCursors(overridden:c.POINTER[CXCursor]) -> None: ... +@dll.bind(CXFile, CXCursor) +def clang_getIncludedFile(cursor:CXCursor) -> CXFile: ... +@dll.bind(CXCursor, CXTranslationUnit, CXSourceLocation) +def clang_getCursor(_0:CXTranslationUnit, _1:CXSourceLocation) -> CXCursor: ... +@dll.bind(CXSourceLocation, CXCursor) +def clang_getCursorLocation(_0:CXCursor) -> CXSourceLocation: ... +@dll.bind(CXSourceRange, CXCursor) +def clang_getCursorExtent(_0:CXCursor) -> CXSourceRange: ... +enum_CXTypeKind: dict[int, str] = {(CXType_Invalid:=0): 'CXType_Invalid', (CXType_Unexposed:=1): 'CXType_Unexposed', (CXType_Void:=2): 'CXType_Void', (CXType_Bool:=3): 'CXType_Bool', (CXType_Char_U:=4): 'CXType_Char_U', (CXType_UChar:=5): 'CXType_UChar', (CXType_Char16:=6): 'CXType_Char16', (CXType_Char32:=7): 'CXType_Char32', (CXType_UShort:=8): 'CXType_UShort', (CXType_UInt:=9): 'CXType_UInt', (CXType_ULong:=10): 'CXType_ULong', (CXType_ULongLong:=11): 'CXType_ULongLong', (CXType_UInt128:=12): 'CXType_UInt128', (CXType_Char_S:=13): 'CXType_Char_S', (CXType_SChar:=14): 'CXType_SChar', (CXType_WChar:=15): 'CXType_WChar', (CXType_Short:=16): 'CXType_Short', (CXType_Int:=17): 'CXType_Int', (CXType_Long:=18): 'CXType_Long', (CXType_LongLong:=19): 'CXType_LongLong', (CXType_Int128:=20): 'CXType_Int128', (CXType_Float:=21): 'CXType_Float', (CXType_Double:=22): 'CXType_Double', (CXType_LongDouble:=23): 'CXType_LongDouble', (CXType_NullPtr:=24): 'CXType_NullPtr', (CXType_Overload:=25): 'CXType_Overload', (CXType_Dependent:=26): 'CXType_Dependent', (CXType_ObjCId:=27): 'CXType_ObjCId', (CXType_ObjCClass:=28): 'CXType_ObjCClass', (CXType_ObjCSel:=29): 'CXType_ObjCSel', (CXType_Float128:=30): 'CXType_Float128', (CXType_Half:=31): 'CXType_Half', (CXType_Float16:=32): 'CXType_Float16', (CXType_ShortAccum:=33): 'CXType_ShortAccum', (CXType_Accum:=34): 'CXType_Accum', (CXType_LongAccum:=35): 'CXType_LongAccum', (CXType_UShortAccum:=36): 'CXType_UShortAccum', (CXType_UAccum:=37): 'CXType_UAccum', (CXType_ULongAccum:=38): 'CXType_ULongAccum', (CXType_BFloat16:=39): 'CXType_BFloat16', (CXType_Ibm128:=40): 'CXType_Ibm128', (CXType_FirstBuiltin:=2): 'CXType_FirstBuiltin', (CXType_LastBuiltin:=40): 'CXType_LastBuiltin', (CXType_Complex:=100): 'CXType_Complex', (CXType_Pointer:=101): 'CXType_Pointer', (CXType_BlockPointer:=102): 'CXType_BlockPointer', (CXType_LValueReference:=103): 'CXType_LValueReference', (CXType_RValueReference:=104): 'CXType_RValueReference', (CXType_Record:=105): 'CXType_Record', (CXType_Enum:=106): 'CXType_Enum', (CXType_Typedef:=107): 'CXType_Typedef', (CXType_ObjCInterface:=108): 'CXType_ObjCInterface', (CXType_ObjCObjectPointer:=109): 'CXType_ObjCObjectPointer', (CXType_FunctionNoProto:=110): 'CXType_FunctionNoProto', (CXType_FunctionProto:=111): 'CXType_FunctionProto', (CXType_ConstantArray:=112): 'CXType_ConstantArray', (CXType_Vector:=113): 'CXType_Vector', (CXType_IncompleteArray:=114): 'CXType_IncompleteArray', (CXType_VariableArray:=115): 'CXType_VariableArray', (CXType_DependentSizedArray:=116): 'CXType_DependentSizedArray', (CXType_MemberPointer:=117): 'CXType_MemberPointer', (CXType_Auto:=118): 'CXType_Auto', (CXType_Elaborated:=119): 'CXType_Elaborated', (CXType_Pipe:=120): 'CXType_Pipe', (CXType_OCLImage1dRO:=121): 'CXType_OCLImage1dRO', (CXType_OCLImage1dArrayRO:=122): 'CXType_OCLImage1dArrayRO', (CXType_OCLImage1dBufferRO:=123): 'CXType_OCLImage1dBufferRO', (CXType_OCLImage2dRO:=124): 'CXType_OCLImage2dRO', (CXType_OCLImage2dArrayRO:=125): 'CXType_OCLImage2dArrayRO', (CXType_OCLImage2dDepthRO:=126): 'CXType_OCLImage2dDepthRO', (CXType_OCLImage2dArrayDepthRO:=127): 'CXType_OCLImage2dArrayDepthRO', (CXType_OCLImage2dMSAARO:=128): 'CXType_OCLImage2dMSAARO', (CXType_OCLImage2dArrayMSAARO:=129): 'CXType_OCLImage2dArrayMSAARO', (CXType_OCLImage2dMSAADepthRO:=130): 'CXType_OCLImage2dMSAADepthRO', (CXType_OCLImage2dArrayMSAADepthRO:=131): 'CXType_OCLImage2dArrayMSAADepthRO', (CXType_OCLImage3dRO:=132): 'CXType_OCLImage3dRO', (CXType_OCLImage1dWO:=133): 'CXType_OCLImage1dWO', (CXType_OCLImage1dArrayWO:=134): 'CXType_OCLImage1dArrayWO', (CXType_OCLImage1dBufferWO:=135): 'CXType_OCLImage1dBufferWO', (CXType_OCLImage2dWO:=136): 'CXType_OCLImage2dWO', (CXType_OCLImage2dArrayWO:=137): 'CXType_OCLImage2dArrayWO', (CXType_OCLImage2dDepthWO:=138): 'CXType_OCLImage2dDepthWO', (CXType_OCLImage2dArrayDepthWO:=139): 'CXType_OCLImage2dArrayDepthWO', (CXType_OCLImage2dMSAAWO:=140): 'CXType_OCLImage2dMSAAWO', (CXType_OCLImage2dArrayMSAAWO:=141): 'CXType_OCLImage2dArrayMSAAWO', (CXType_OCLImage2dMSAADepthWO:=142): 'CXType_OCLImage2dMSAADepthWO', (CXType_OCLImage2dArrayMSAADepthWO:=143): 'CXType_OCLImage2dArrayMSAADepthWO', (CXType_OCLImage3dWO:=144): 'CXType_OCLImage3dWO', (CXType_OCLImage1dRW:=145): 'CXType_OCLImage1dRW', (CXType_OCLImage1dArrayRW:=146): 'CXType_OCLImage1dArrayRW', (CXType_OCLImage1dBufferRW:=147): 'CXType_OCLImage1dBufferRW', (CXType_OCLImage2dRW:=148): 'CXType_OCLImage2dRW', (CXType_OCLImage2dArrayRW:=149): 'CXType_OCLImage2dArrayRW', (CXType_OCLImage2dDepthRW:=150): 'CXType_OCLImage2dDepthRW', (CXType_OCLImage2dArrayDepthRW:=151): 'CXType_OCLImage2dArrayDepthRW', (CXType_OCLImage2dMSAARW:=152): 'CXType_OCLImage2dMSAARW', (CXType_OCLImage2dArrayMSAARW:=153): 'CXType_OCLImage2dArrayMSAARW', (CXType_OCLImage2dMSAADepthRW:=154): 'CXType_OCLImage2dMSAADepthRW', (CXType_OCLImage2dArrayMSAADepthRW:=155): 'CXType_OCLImage2dArrayMSAADepthRW', (CXType_OCLImage3dRW:=156): 'CXType_OCLImage3dRW', (CXType_OCLSampler:=157): 'CXType_OCLSampler', (CXType_OCLEvent:=158): 'CXType_OCLEvent', (CXType_OCLQueue:=159): 'CXType_OCLQueue', (CXType_OCLReserveID:=160): 'CXType_OCLReserveID', (CXType_ObjCObject:=161): 'CXType_ObjCObject', (CXType_ObjCTypeParam:=162): 'CXType_ObjCTypeParam', (CXType_Attributed:=163): 'CXType_Attributed', (CXType_OCLIntelSubgroupAVCMcePayload:=164): 'CXType_OCLIntelSubgroupAVCMcePayload', (CXType_OCLIntelSubgroupAVCImePayload:=165): 'CXType_OCLIntelSubgroupAVCImePayload', (CXType_OCLIntelSubgroupAVCRefPayload:=166): 'CXType_OCLIntelSubgroupAVCRefPayload', (CXType_OCLIntelSubgroupAVCSicPayload:=167): 'CXType_OCLIntelSubgroupAVCSicPayload', (CXType_OCLIntelSubgroupAVCMceResult:=168): 'CXType_OCLIntelSubgroupAVCMceResult', (CXType_OCLIntelSubgroupAVCImeResult:=169): 'CXType_OCLIntelSubgroupAVCImeResult', (CXType_OCLIntelSubgroupAVCRefResult:=170): 'CXType_OCLIntelSubgroupAVCRefResult', (CXType_OCLIntelSubgroupAVCSicResult:=171): 'CXType_OCLIntelSubgroupAVCSicResult', (CXType_OCLIntelSubgroupAVCImeResultSingleReferenceStreamout:=172): 'CXType_OCLIntelSubgroupAVCImeResultSingleReferenceStreamout', (CXType_OCLIntelSubgroupAVCImeResultDualReferenceStreamout:=173): 'CXType_OCLIntelSubgroupAVCImeResultDualReferenceStreamout', (CXType_OCLIntelSubgroupAVCImeSingleReferenceStreamin:=174): 'CXType_OCLIntelSubgroupAVCImeSingleReferenceStreamin', (CXType_OCLIntelSubgroupAVCImeDualReferenceStreamin:=175): 'CXType_OCLIntelSubgroupAVCImeDualReferenceStreamin', (CXType_OCLIntelSubgroupAVCImeResultSingleRefStreamout:=172): 'CXType_OCLIntelSubgroupAVCImeResultSingleRefStreamout', (CXType_OCLIntelSubgroupAVCImeResultDualRefStreamout:=173): 'CXType_OCLIntelSubgroupAVCImeResultDualRefStreamout', (CXType_OCLIntelSubgroupAVCImeSingleRefStreamin:=174): 'CXType_OCLIntelSubgroupAVCImeSingleRefStreamin', (CXType_OCLIntelSubgroupAVCImeDualRefStreamin:=175): 'CXType_OCLIntelSubgroupAVCImeDualRefStreamin', (CXType_ExtVector:=176): 'CXType_ExtVector', (CXType_Atomic:=177): 'CXType_Atomic', (CXType_BTFTagAttributed:=178): 'CXType_BTFTagAttributed', (CXType_HLSLResource:=179): 'CXType_HLSLResource', (CXType_HLSLAttributedResource:=180): 'CXType_HLSLAttributedResource'} +enum_CXCallingConv: dict[int, str] = {(CXCallingConv_Default:=0): 'CXCallingConv_Default', (CXCallingConv_C:=1): 'CXCallingConv_C', (CXCallingConv_X86StdCall:=2): 'CXCallingConv_X86StdCall', (CXCallingConv_X86FastCall:=3): 'CXCallingConv_X86FastCall', (CXCallingConv_X86ThisCall:=4): 'CXCallingConv_X86ThisCall', (CXCallingConv_X86Pascal:=5): 'CXCallingConv_X86Pascal', (CXCallingConv_AAPCS:=6): 'CXCallingConv_AAPCS', (CXCallingConv_AAPCS_VFP:=7): 'CXCallingConv_AAPCS_VFP', (CXCallingConv_X86RegCall:=8): 'CXCallingConv_X86RegCall', (CXCallingConv_IntelOclBicc:=9): 'CXCallingConv_IntelOclBicc', (CXCallingConv_Win64:=10): 'CXCallingConv_Win64', (CXCallingConv_X86_64Win64:=10): 'CXCallingConv_X86_64Win64', (CXCallingConv_X86_64SysV:=11): 'CXCallingConv_X86_64SysV', (CXCallingConv_X86VectorCall:=12): 'CXCallingConv_X86VectorCall', (CXCallingConv_Swift:=13): 'CXCallingConv_Swift', (CXCallingConv_PreserveMost:=14): 'CXCallingConv_PreserveMost', (CXCallingConv_PreserveAll:=15): 'CXCallingConv_PreserveAll', (CXCallingConv_AArch64VectorCall:=16): 'CXCallingConv_AArch64VectorCall', (CXCallingConv_SwiftAsync:=17): 'CXCallingConv_SwiftAsync', (CXCallingConv_AArch64SVEPCS:=18): 'CXCallingConv_AArch64SVEPCS', (CXCallingConv_M68kRTD:=19): 'CXCallingConv_M68kRTD', (CXCallingConv_PreserveNone:=20): 'CXCallingConv_PreserveNone', (CXCallingConv_RISCVVectorCall:=21): 'CXCallingConv_RISCVVectorCall', (CXCallingConv_Invalid:=100): 'CXCallingConv_Invalid', (CXCallingConv_Unexposed:=200): 'CXCallingConv_Unexposed'} +@c.record +class CXType(c.Struct): + SIZE = 24 + kind: int + data: c.Array[ctypes.c_void_p, Literal[2]] +CXType.register_fields([('kind', ctypes.c_uint32, 0), ('data', c.Array[ctypes.c_void_p, Literal[2]], 8)]) +@dll.bind(CXType, CXCursor) +def clang_getCursorType(C:CXCursor) -> CXType: ... +@dll.bind(CXString, CXType) +def clang_getTypeSpelling(CT:CXType) -> CXString: ... +@dll.bind(CXType, CXCursor) +def clang_getTypedefDeclUnderlyingType(C:CXCursor) -> CXType: ... +@dll.bind(CXType, CXCursor) +def clang_getEnumDeclIntegerType(C:CXCursor) -> CXType: ... +@dll.bind(ctypes.c_int64, CXCursor) +def clang_getEnumConstantDeclValue(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint64, CXCursor) +def clang_getEnumConstantDeclUnsignedValue(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isBitField(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_int32, CXCursor) +def clang_getFieldDeclBitWidth(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_int32, CXCursor) +def clang_Cursor_getNumArguments(C:CXCursor) -> int: ... +@dll.bind(CXCursor, CXCursor, ctypes.c_uint32) +def clang_Cursor_getArgument(C:CXCursor, i:int) -> CXCursor: ... +enum_CXTemplateArgumentKind: dict[int, str] = {(CXTemplateArgumentKind_Null:=0): 'CXTemplateArgumentKind_Null', (CXTemplateArgumentKind_Type:=1): 'CXTemplateArgumentKind_Type', (CXTemplateArgumentKind_Declaration:=2): 'CXTemplateArgumentKind_Declaration', (CXTemplateArgumentKind_NullPtr:=3): 'CXTemplateArgumentKind_NullPtr', (CXTemplateArgumentKind_Integral:=4): 'CXTemplateArgumentKind_Integral', (CXTemplateArgumentKind_Template:=5): 'CXTemplateArgumentKind_Template', (CXTemplateArgumentKind_TemplateExpansion:=6): 'CXTemplateArgumentKind_TemplateExpansion', (CXTemplateArgumentKind_Expression:=7): 'CXTemplateArgumentKind_Expression', (CXTemplateArgumentKind_Pack:=8): 'CXTemplateArgumentKind_Pack', (CXTemplateArgumentKind_Invalid:=9): 'CXTemplateArgumentKind_Invalid'} +@dll.bind(ctypes.c_int32, CXCursor) +def clang_Cursor_getNumTemplateArguments(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor, ctypes.c_uint32) +def clang_Cursor_getTemplateArgumentKind(C:CXCursor, I:int) -> ctypes.c_uint32: ... +@dll.bind(CXType, CXCursor, ctypes.c_uint32) +def clang_Cursor_getTemplateArgumentType(C:CXCursor, I:int) -> CXType: ... +@dll.bind(ctypes.c_int64, CXCursor, ctypes.c_uint32) +def clang_Cursor_getTemplateArgumentValue(C:CXCursor, I:int) -> int: ... +@dll.bind(ctypes.c_uint64, CXCursor, ctypes.c_uint32) +def clang_Cursor_getTemplateArgumentUnsignedValue(C:CXCursor, I:int) -> int: ... +@dll.bind(ctypes.c_uint32, CXType, CXType) +def clang_equalTypes(A:CXType, B:CXType) -> int: ... +@dll.bind(CXType, CXType) +def clang_getCanonicalType(T:CXType) -> CXType: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_isConstQualifiedType(T:CXType) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isMacroFunctionLike(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isMacroBuiltin(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isFunctionInlined(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_isVolatileQualifiedType(T:CXType) -> int: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_isRestrictQualifiedType(T:CXType) -> int: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_getAddressSpace(T:CXType) -> int: ... +@dll.bind(CXString, CXType) +def clang_getTypedefName(CT:CXType) -> CXString: ... +@dll.bind(CXType, CXType) +def clang_getPointeeType(T:CXType) -> CXType: ... +@dll.bind(CXType, CXType) +def clang_getUnqualifiedType(CT:CXType) -> CXType: ... +@dll.bind(CXType, CXType) +def clang_getNonReferenceType(CT:CXType) -> CXType: ... +@dll.bind(CXCursor, CXType) +def clang_getTypeDeclaration(T:CXType) -> CXCursor: ... +@dll.bind(CXString, CXCursor) +def clang_getDeclObjCTypeEncoding(C:CXCursor) -> CXString: ... +@dll.bind(CXString, CXType) +def clang_Type_getObjCEncoding(type:CXType) -> CXString: ... +@dll.bind(CXString, ctypes.c_uint32) +def clang_getTypeKindSpelling(K:ctypes.c_uint32) -> CXString: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_getFunctionTypeCallingConv(T:CXType) -> ctypes.c_uint32: ... +@dll.bind(CXType, CXType) +def clang_getResultType(T:CXType) -> CXType: ... +@dll.bind(ctypes.c_int32, CXType) +def clang_getExceptionSpecificationType(T:CXType) -> int: ... +@dll.bind(ctypes.c_int32, CXType) +def clang_getNumArgTypes(T:CXType) -> int: ... +@dll.bind(CXType, CXType, ctypes.c_uint32) +def clang_getArgType(T:CXType, i:int) -> CXType: ... +@dll.bind(CXType, CXType) +def clang_Type_getObjCObjectBaseType(T:CXType) -> CXType: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_Type_getNumObjCProtocolRefs(T:CXType) -> int: ... +@dll.bind(CXCursor, CXType, ctypes.c_uint32) +def clang_Type_getObjCProtocolDecl(T:CXType, i:int) -> CXCursor: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_Type_getNumObjCTypeArgs(T:CXType) -> int: ... +@dll.bind(CXType, CXType, ctypes.c_uint32) +def clang_Type_getObjCTypeArg(T:CXType, i:int) -> CXType: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_isFunctionTypeVariadic(T:CXType) -> int: ... +@dll.bind(CXType, CXCursor) +def clang_getCursorResultType(C:CXCursor) -> CXType: ... +@dll.bind(ctypes.c_int32, CXCursor) +def clang_getCursorExceptionSpecificationType(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_isPODType(T:CXType) -> int: ... +@dll.bind(CXType, CXType) +def clang_getElementType(T:CXType) -> CXType: ... +@dll.bind(ctypes.c_int64, CXType) +def clang_getNumElements(T:CXType) -> int: ... +@dll.bind(CXType, CXType) +def clang_getArrayElementType(T:CXType) -> CXType: ... +@dll.bind(ctypes.c_int64, CXType) +def clang_getArraySize(T:CXType) -> int: ... +@dll.bind(CXType, CXType) +def clang_Type_getNamedType(T:CXType) -> CXType: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_Type_isTransparentTagTypedef(T:CXType) -> int: ... +enum_CXTypeNullabilityKind: dict[int, str] = {(CXTypeNullability_NonNull:=0): 'CXTypeNullability_NonNull', (CXTypeNullability_Nullable:=1): 'CXTypeNullability_Nullable', (CXTypeNullability_Unspecified:=2): 'CXTypeNullability_Unspecified', (CXTypeNullability_Invalid:=3): 'CXTypeNullability_Invalid', (CXTypeNullability_NullableResult:=4): 'CXTypeNullability_NullableResult'} +@dll.bind(ctypes.c_uint32, CXType) +def clang_Type_getNullability(T:CXType) -> ctypes.c_uint32: ... +enum_CXTypeLayoutError: dict[int, str] = {(CXTypeLayoutError_Invalid:=-1): 'CXTypeLayoutError_Invalid', (CXTypeLayoutError_Incomplete:=-2): 'CXTypeLayoutError_Incomplete', (CXTypeLayoutError_Dependent:=-3): 'CXTypeLayoutError_Dependent', (CXTypeLayoutError_NotConstantSize:=-4): 'CXTypeLayoutError_NotConstantSize', (CXTypeLayoutError_InvalidFieldName:=-5): 'CXTypeLayoutError_InvalidFieldName', (CXTypeLayoutError_Undeduced:=-6): 'CXTypeLayoutError_Undeduced'} +@dll.bind(ctypes.c_int64, CXType) +def clang_Type_getAlignOf(T:CXType) -> int: ... +@dll.bind(CXType, CXType) +def clang_Type_getClassType(T:CXType) -> CXType: ... +@dll.bind(ctypes.c_int64, CXType) +def clang_Type_getSizeOf(T:CXType) -> int: ... +@dll.bind(ctypes.c_int64, CXType, c.POINTER[ctypes.c_char]) +def clang_Type_getOffsetOf(T:CXType, S:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(CXType, CXType) +def clang_Type_getModifiedType(T:CXType) -> CXType: ... +@dll.bind(CXType, CXType) +def clang_Type_getValueType(CT:CXType) -> CXType: ... +@dll.bind(ctypes.c_int64, CXCursor) +def clang_Cursor_getOffsetOfField(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isAnonymous(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isAnonymousRecordDecl(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isInlineNamespace(C:CXCursor) -> int: ... +enum_CXRefQualifierKind: dict[int, str] = {(CXRefQualifier_None:=0): 'CXRefQualifier_None', (CXRefQualifier_LValue:=1): 'CXRefQualifier_LValue', (CXRefQualifier_RValue:=2): 'CXRefQualifier_RValue'} +@dll.bind(ctypes.c_int32, CXType) +def clang_Type_getNumTemplateArguments(T:CXType) -> int: ... +@dll.bind(CXType, CXType, ctypes.c_uint32) +def clang_Type_getTemplateArgumentAsType(T:CXType, i:int) -> CXType: ... +@dll.bind(ctypes.c_uint32, CXType) +def clang_Type_getCXXRefQualifier(T:CXType) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_isVirtualBase(_0:CXCursor) -> int: ... +@dll.bind(ctypes.c_int64, CXCursor, CXCursor) +def clang_getOffsetOfBase(Parent:CXCursor, Base:CXCursor) -> int: ... +enum_CX_CXXAccessSpecifier: dict[int, str] = {(CX_CXXInvalidAccessSpecifier:=0): 'CX_CXXInvalidAccessSpecifier', (CX_CXXPublic:=1): 'CX_CXXPublic', (CX_CXXProtected:=2): 'CX_CXXProtected', (CX_CXXPrivate:=3): 'CX_CXXPrivate'} +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCXXAccessSpecifier(_0:CXCursor) -> ctypes.c_uint32: ... +enum_CX_StorageClass: dict[int, str] = {(CX_SC_Invalid:=0): 'CX_SC_Invalid', (CX_SC_None:=1): 'CX_SC_None', (CX_SC_Extern:=2): 'CX_SC_Extern', (CX_SC_Static:=3): 'CX_SC_Static', (CX_SC_PrivateExtern:=4): 'CX_SC_PrivateExtern', (CX_SC_OpenCLWorkGroupLocal:=5): 'CX_SC_OpenCLWorkGroupLocal', (CX_SC_Auto:=6): 'CX_SC_Auto', (CX_SC_Register:=7): 'CX_SC_Register'} +enum_CX_BinaryOperatorKind: dict[int, str] = {(CX_BO_Invalid:=0): 'CX_BO_Invalid', (CX_BO_PtrMemD:=1): 'CX_BO_PtrMemD', (CX_BO_PtrMemI:=2): 'CX_BO_PtrMemI', (CX_BO_Mul:=3): 'CX_BO_Mul', (CX_BO_Div:=4): 'CX_BO_Div', (CX_BO_Rem:=5): 'CX_BO_Rem', (CX_BO_Add:=6): 'CX_BO_Add', (CX_BO_Sub:=7): 'CX_BO_Sub', (CX_BO_Shl:=8): 'CX_BO_Shl', (CX_BO_Shr:=9): 'CX_BO_Shr', (CX_BO_Cmp:=10): 'CX_BO_Cmp', (CX_BO_LT:=11): 'CX_BO_LT', (CX_BO_GT:=12): 'CX_BO_GT', (CX_BO_LE:=13): 'CX_BO_LE', (CX_BO_GE:=14): 'CX_BO_GE', (CX_BO_EQ:=15): 'CX_BO_EQ', (CX_BO_NE:=16): 'CX_BO_NE', (CX_BO_And:=17): 'CX_BO_And', (CX_BO_Xor:=18): 'CX_BO_Xor', (CX_BO_Or:=19): 'CX_BO_Or', (CX_BO_LAnd:=20): 'CX_BO_LAnd', (CX_BO_LOr:=21): 'CX_BO_LOr', (CX_BO_Assign:=22): 'CX_BO_Assign', (CX_BO_MulAssign:=23): 'CX_BO_MulAssign', (CX_BO_DivAssign:=24): 'CX_BO_DivAssign', (CX_BO_RemAssign:=25): 'CX_BO_RemAssign', (CX_BO_AddAssign:=26): 'CX_BO_AddAssign', (CX_BO_SubAssign:=27): 'CX_BO_SubAssign', (CX_BO_ShlAssign:=28): 'CX_BO_ShlAssign', (CX_BO_ShrAssign:=29): 'CX_BO_ShrAssign', (CX_BO_AndAssign:=30): 'CX_BO_AndAssign', (CX_BO_XorAssign:=31): 'CX_BO_XorAssign', (CX_BO_OrAssign:=32): 'CX_BO_OrAssign', (CX_BO_Comma:=33): 'CX_BO_Comma', (CX_BO_LAST:=33): 'CX_BO_LAST'} +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_getBinaryOpcode(C:CXCursor) -> ctypes.c_uint32: ... +@dll.bind(CXString, ctypes.c_uint32) +def clang_Cursor_getBinaryOpcodeStr(Op:ctypes.c_uint32) -> CXString: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_getStorageClass(_0:CXCursor) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getNumOverloadedDecls(cursor:CXCursor) -> int: ... +@dll.bind(CXCursor, CXCursor, ctypes.c_uint32) +def clang_getOverloadedDecl(cursor:CXCursor, index:int) -> CXCursor: ... +@dll.bind(CXType, CXCursor) +def clang_getIBOutletCollectionType(_0:CXCursor) -> CXType: ... +enum_CXChildVisitResult: dict[int, str] = {(CXChildVisit_Break:=0): 'CXChildVisit_Break', (CXChildVisit_Continue:=1): 'CXChildVisit_Continue', (CXChildVisit_Recurse:=2): 'CXChildVisit_Recurse'} +CXCursorVisitor: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [CXCursor, CXCursor, ctypes.c_void_p]] +@dll.bind(ctypes.c_uint32, CXCursor, CXCursorVisitor, CXClientData) +def clang_visitChildren(parent:CXCursor, visitor:CXCursorVisitor, client_data:CXClientData) -> int: ... +class struct__CXChildVisitResult(c.Struct): pass +CXCursorVisitorBlock: TypeAlias = c.POINTER[struct__CXChildVisitResult] +@dll.bind(ctypes.c_uint32, CXCursor, CXCursorVisitorBlock) +def clang_visitChildrenWithBlock(parent:CXCursor, block:CXCursorVisitorBlock) -> int: ... +@dll.bind(CXString, CXCursor) +def clang_getCursorUSR(_0:CXCursor) -> CXString: ... +@dll.bind(CXString, c.POINTER[ctypes.c_char]) +def clang_constructUSR_ObjCClass(class_name:c.POINTER[ctypes.c_char]) -> CXString: ... +@dll.bind(CXString, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def clang_constructUSR_ObjCCategory(class_name:c.POINTER[ctypes.c_char], category_name:c.POINTER[ctypes.c_char]) -> CXString: ... +@dll.bind(CXString, c.POINTER[ctypes.c_char]) +def clang_constructUSR_ObjCProtocol(protocol_name:c.POINTER[ctypes.c_char]) -> CXString: ... +@dll.bind(CXString, c.POINTER[ctypes.c_char], CXString) +def clang_constructUSR_ObjCIvar(name:c.POINTER[ctypes.c_char], classUSR:CXString) -> CXString: ... +@dll.bind(CXString, c.POINTER[ctypes.c_char], ctypes.c_uint32, CXString) +def clang_constructUSR_ObjCMethod(name:c.POINTER[ctypes.c_char], isInstanceMethod:int, classUSR:CXString) -> CXString: ... +@dll.bind(CXString, c.POINTER[ctypes.c_char], CXString) +def clang_constructUSR_ObjCProperty(property:c.POINTER[ctypes.c_char], classUSR:CXString) -> CXString: ... +@dll.bind(CXString, CXCursor) +def clang_getCursorSpelling(_0:CXCursor) -> CXString: ... +@dll.bind(CXSourceRange, CXCursor, ctypes.c_uint32, ctypes.c_uint32) +def clang_Cursor_getSpellingNameRange(_0:CXCursor, pieceIndex:int, options:int) -> CXSourceRange: ... +CXPrintingPolicy: TypeAlias = ctypes.c_void_p +enum_CXPrintingPolicyProperty: dict[int, str] = {(CXPrintingPolicy_Indentation:=0): 'CXPrintingPolicy_Indentation', (CXPrintingPolicy_SuppressSpecifiers:=1): 'CXPrintingPolicy_SuppressSpecifiers', (CXPrintingPolicy_SuppressTagKeyword:=2): 'CXPrintingPolicy_SuppressTagKeyword', (CXPrintingPolicy_IncludeTagDefinition:=3): 'CXPrintingPolicy_IncludeTagDefinition', (CXPrintingPolicy_SuppressScope:=4): 'CXPrintingPolicy_SuppressScope', (CXPrintingPolicy_SuppressUnwrittenScope:=5): 'CXPrintingPolicy_SuppressUnwrittenScope', (CXPrintingPolicy_SuppressInitializers:=6): 'CXPrintingPolicy_SuppressInitializers', (CXPrintingPolicy_ConstantArraySizeAsWritten:=7): 'CXPrintingPolicy_ConstantArraySizeAsWritten', (CXPrintingPolicy_AnonymousTagLocations:=8): 'CXPrintingPolicy_AnonymousTagLocations', (CXPrintingPolicy_SuppressStrongLifetime:=9): 'CXPrintingPolicy_SuppressStrongLifetime', (CXPrintingPolicy_SuppressLifetimeQualifiers:=10): 'CXPrintingPolicy_SuppressLifetimeQualifiers', (CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors:=11): 'CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors', (CXPrintingPolicy_Bool:=12): 'CXPrintingPolicy_Bool', (CXPrintingPolicy_Restrict:=13): 'CXPrintingPolicy_Restrict', (CXPrintingPolicy_Alignof:=14): 'CXPrintingPolicy_Alignof', (CXPrintingPolicy_UnderscoreAlignof:=15): 'CXPrintingPolicy_UnderscoreAlignof', (CXPrintingPolicy_UseVoidForZeroParams:=16): 'CXPrintingPolicy_UseVoidForZeroParams', (CXPrintingPolicy_TerseOutput:=17): 'CXPrintingPolicy_TerseOutput', (CXPrintingPolicy_PolishForDeclaration:=18): 'CXPrintingPolicy_PolishForDeclaration', (CXPrintingPolicy_Half:=19): 'CXPrintingPolicy_Half', (CXPrintingPolicy_MSWChar:=20): 'CXPrintingPolicy_MSWChar', (CXPrintingPolicy_IncludeNewlines:=21): 'CXPrintingPolicy_IncludeNewlines', (CXPrintingPolicy_MSVCFormatting:=22): 'CXPrintingPolicy_MSVCFormatting', (CXPrintingPolicy_ConstantsAsWritten:=23): 'CXPrintingPolicy_ConstantsAsWritten', (CXPrintingPolicy_SuppressImplicitBase:=24): 'CXPrintingPolicy_SuppressImplicitBase', (CXPrintingPolicy_FullyQualifiedName:=25): 'CXPrintingPolicy_FullyQualifiedName', (CXPrintingPolicy_LastProperty:=25): 'CXPrintingPolicy_LastProperty'} +@dll.bind(ctypes.c_uint32, CXPrintingPolicy, ctypes.c_uint32) +def clang_PrintingPolicy_getProperty(Policy:CXPrintingPolicy, Property:ctypes.c_uint32) -> int: ... +@dll.bind(None, CXPrintingPolicy, ctypes.c_uint32, ctypes.c_uint32) +def clang_PrintingPolicy_setProperty(Policy:CXPrintingPolicy, Property:ctypes.c_uint32, Value:int) -> None: ... +@dll.bind(CXPrintingPolicy, CXCursor) +def clang_getCursorPrintingPolicy(_0:CXCursor) -> CXPrintingPolicy: ... +@dll.bind(None, CXPrintingPolicy) +def clang_PrintingPolicy_dispose(Policy:CXPrintingPolicy) -> None: ... +@dll.bind(CXString, CXCursor, CXPrintingPolicy) +def clang_getCursorPrettyPrinted(Cursor:CXCursor, Policy:CXPrintingPolicy) -> CXString: ... +@dll.bind(CXString, CXType, CXPrintingPolicy) +def clang_getTypePrettyPrinted(CT:CXType, cxPolicy:CXPrintingPolicy) -> CXString: ... +@dll.bind(CXString, CXCursor) +def clang_getCursorDisplayName(_0:CXCursor) -> CXString: ... +@dll.bind(CXCursor, CXCursor) +def clang_getCursorReferenced(_0:CXCursor) -> CXCursor: ... +@dll.bind(CXCursor, CXCursor) +def clang_getCursorDefinition(_0:CXCursor) -> CXCursor: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_isCursorDefinition(_0:CXCursor) -> int: ... +@dll.bind(CXCursor, CXCursor) +def clang_getCanonicalCursor(_0:CXCursor) -> CXCursor: ... +@dll.bind(ctypes.c_int32, CXCursor) +def clang_Cursor_getObjCSelectorIndex(_0:CXCursor) -> int: ... +@dll.bind(ctypes.c_int32, CXCursor) +def clang_Cursor_isDynamicCall(C:CXCursor) -> int: ... +@dll.bind(CXType, CXCursor) +def clang_Cursor_getReceiverType(C:CXCursor) -> CXType: ... +CXObjCPropertyAttrKind: dict[int, str] = {(CXObjCPropertyAttr_noattr:=0): 'CXObjCPropertyAttr_noattr', (CXObjCPropertyAttr_readonly:=1): 'CXObjCPropertyAttr_readonly', (CXObjCPropertyAttr_getter:=2): 'CXObjCPropertyAttr_getter', (CXObjCPropertyAttr_assign:=4): 'CXObjCPropertyAttr_assign', (CXObjCPropertyAttr_readwrite:=8): 'CXObjCPropertyAttr_readwrite', (CXObjCPropertyAttr_retain:=16): 'CXObjCPropertyAttr_retain', (CXObjCPropertyAttr_copy:=32): 'CXObjCPropertyAttr_copy', (CXObjCPropertyAttr_nonatomic:=64): 'CXObjCPropertyAttr_nonatomic', (CXObjCPropertyAttr_setter:=128): 'CXObjCPropertyAttr_setter', (CXObjCPropertyAttr_atomic:=256): 'CXObjCPropertyAttr_atomic', (CXObjCPropertyAttr_weak:=512): 'CXObjCPropertyAttr_weak', (CXObjCPropertyAttr_strong:=1024): 'CXObjCPropertyAttr_strong', (CXObjCPropertyAttr_unsafe_unretained:=2048): 'CXObjCPropertyAttr_unsafe_unretained', (CXObjCPropertyAttr_class:=4096): 'CXObjCPropertyAttr_class'} +@dll.bind(ctypes.c_uint32, CXCursor, ctypes.c_uint32) +def clang_Cursor_getObjCPropertyAttributes(C:CXCursor, reserved:int) -> int: ... +@dll.bind(CXString, CXCursor) +def clang_Cursor_getObjCPropertyGetterName(C:CXCursor) -> CXString: ... +@dll.bind(CXString, CXCursor) +def clang_Cursor_getObjCPropertySetterName(C:CXCursor) -> CXString: ... +CXObjCDeclQualifierKind: dict[int, str] = {(CXObjCDeclQualifier_None:=0): 'CXObjCDeclQualifier_None', (CXObjCDeclQualifier_In:=1): 'CXObjCDeclQualifier_In', (CXObjCDeclQualifier_Inout:=2): 'CXObjCDeclQualifier_Inout', (CXObjCDeclQualifier_Out:=4): 'CXObjCDeclQualifier_Out', (CXObjCDeclQualifier_Bycopy:=8): 'CXObjCDeclQualifier_Bycopy', (CXObjCDeclQualifier_Byref:=16): 'CXObjCDeclQualifier_Byref', (CXObjCDeclQualifier_Oneway:=32): 'CXObjCDeclQualifier_Oneway'} +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_getObjCDeclQualifiers(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isObjCOptional(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_Cursor_isVariadic(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor, c.POINTER[CXString], c.POINTER[CXString], c.POINTER[ctypes.c_uint32]) +def clang_Cursor_isExternalSymbol(C:CXCursor, language:c.POINTER[CXString], definedIn:c.POINTER[CXString], isGenerated:c.POINTER[ctypes.c_uint32]) -> int: ... +@dll.bind(CXSourceRange, CXCursor) +def clang_Cursor_getCommentRange(C:CXCursor) -> CXSourceRange: ... +@dll.bind(CXString, CXCursor) +def clang_Cursor_getRawCommentText(C:CXCursor) -> CXString: ... +@dll.bind(CXString, CXCursor) +def clang_Cursor_getBriefCommentText(C:CXCursor) -> CXString: ... +@dll.bind(CXString, CXCursor) +def clang_Cursor_getMangling(_0:CXCursor) -> CXString: ... +@c.record +class CXStringSet(c.Struct): + SIZE = 16 + Strings: c.POINTER[CXString] + Count: int +CXStringSet.register_fields([('Strings', c.POINTER[CXString], 0), ('Count', ctypes.c_uint32, 8)]) +@dll.bind(c.POINTER[CXStringSet], CXCursor) +def clang_Cursor_getCXXManglings(_0:CXCursor) -> c.POINTER[CXStringSet]: ... +@dll.bind(c.POINTER[CXStringSet], CXCursor) +def clang_Cursor_getObjCManglings(_0:CXCursor) -> c.POINTER[CXStringSet]: ... +CXModule: TypeAlias = ctypes.c_void_p +@dll.bind(CXModule, CXCursor) +def clang_Cursor_getModule(C:CXCursor) -> CXModule: ... +@dll.bind(CXModule, CXTranslationUnit, CXFile) +def clang_getModuleForFile(_0:CXTranslationUnit, _1:CXFile) -> CXModule: ... +@dll.bind(CXFile, CXModule) +def clang_Module_getASTFile(Module:CXModule) -> CXFile: ... +@dll.bind(CXModule, CXModule) +def clang_Module_getParent(Module:CXModule) -> CXModule: ... +@dll.bind(CXString, CXModule) +def clang_Module_getName(Module:CXModule) -> CXString: ... +@dll.bind(CXString, CXModule) +def clang_Module_getFullName(Module:CXModule) -> CXString: ... +@dll.bind(ctypes.c_int32, CXModule) +def clang_Module_isSystem(Module:CXModule) -> int: ... +@dll.bind(ctypes.c_uint32, CXTranslationUnit, CXModule) +def clang_Module_getNumTopLevelHeaders(_0:CXTranslationUnit, Module:CXModule) -> int: ... +@dll.bind(CXFile, CXTranslationUnit, CXModule, ctypes.c_uint32) +def clang_Module_getTopLevelHeader(_0:CXTranslationUnit, Module:CXModule, Index:int) -> CXFile: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXConstructor_isConvertingConstructor(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXConstructor_isCopyConstructor(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXConstructor_isDefaultConstructor(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXConstructor_isMoveConstructor(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXField_isMutable(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isDefaulted(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isDeleted(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isPureVirtual(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isStatic(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isVirtual(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isCopyAssignmentOperator(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isMoveAssignmentOperator(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isExplicit(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXRecord_isAbstract(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_EnumDecl_isScoped(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_CXXMethod_isConst(C:CXCursor) -> int: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getTemplateCursorKind(C:CXCursor) -> ctypes.c_uint32: ... +@dll.bind(CXCursor, CXCursor) +def clang_getSpecializedCursorTemplate(C:CXCursor) -> CXCursor: ... +@dll.bind(CXSourceRange, CXCursor, ctypes.c_uint32, ctypes.c_uint32) +def clang_getCursorReferenceNameRange(C:CXCursor, NameFlags:int, PieceIndex:int) -> CXSourceRange: ... +enum_CXNameRefFlags: dict[int, str] = {(CXNameRange_WantQualifier:=1): 'CXNameRange_WantQualifier', (CXNameRange_WantTemplateArgs:=2): 'CXNameRange_WantTemplateArgs', (CXNameRange_WantSinglePiece:=4): 'CXNameRange_WantSinglePiece'} +enum_CXTokenKind: dict[int, str] = {(CXToken_Punctuation:=0): 'CXToken_Punctuation', (CXToken_Keyword:=1): 'CXToken_Keyword', (CXToken_Identifier:=2): 'CXToken_Identifier', (CXToken_Literal:=3): 'CXToken_Literal', (CXToken_Comment:=4): 'CXToken_Comment'} +CXTokenKind: TypeAlias = ctypes.c_uint32 +@c.record +class CXToken(c.Struct): + SIZE = 24 + int_data: c.Array[ctypes.c_uint32, Literal[4]] + ptr_data: ctypes.c_void_p +CXToken.register_fields([('int_data', c.Array[ctypes.c_uint32, Literal[4]], 0), ('ptr_data', ctypes.c_void_p, 16)]) +@dll.bind(c.POINTER[CXToken], CXTranslationUnit, CXSourceLocation) +def clang_getToken(TU:CXTranslationUnit, Location:CXSourceLocation) -> c.POINTER[CXToken]: ... +@dll.bind(CXTokenKind, CXToken) +def clang_getTokenKind(_0:CXToken) -> CXTokenKind: ... +@dll.bind(CXString, CXTranslationUnit, CXToken) +def clang_getTokenSpelling(_0:CXTranslationUnit, _1:CXToken) -> CXString: ... +@dll.bind(CXSourceLocation, CXTranslationUnit, CXToken) +def clang_getTokenLocation(_0:CXTranslationUnit, _1:CXToken) -> CXSourceLocation: ... +@dll.bind(CXSourceRange, CXTranslationUnit, CXToken) +def clang_getTokenExtent(_0:CXTranslationUnit, _1:CXToken) -> CXSourceRange: ... +@dll.bind(None, CXTranslationUnit, CXSourceRange, c.POINTER[c.POINTER[CXToken]], c.POINTER[ctypes.c_uint32]) +def clang_tokenize(TU:CXTranslationUnit, Range:CXSourceRange, Tokens:c.POINTER[c.POINTER[CXToken]], NumTokens:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, CXTranslationUnit, c.POINTER[CXToken], ctypes.c_uint32, c.POINTER[CXCursor]) +def clang_annotateTokens(TU:CXTranslationUnit, Tokens:c.POINTER[CXToken], NumTokens:int, Cursors:c.POINTER[CXCursor]) -> None: ... +@dll.bind(None, CXTranslationUnit, c.POINTER[CXToken], ctypes.c_uint32) +def clang_disposeTokens(TU:CXTranslationUnit, Tokens:c.POINTER[CXToken], NumTokens:int) -> None: ... +@dll.bind(CXString, ctypes.c_uint32) +def clang_getCursorKindSpelling(Kind:ctypes.c_uint32) -> CXString: ... +@dll.bind(None, CXCursor, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def clang_getDefinitionSpellingAndExtent(_0:CXCursor, startBuf:c.POINTER[c.POINTER[ctypes.c_char]], endBuf:c.POINTER[c.POINTER[ctypes.c_char]], startLine:c.POINTER[ctypes.c_uint32], startColumn:c.POINTER[ctypes.c_uint32], endLine:c.POINTER[ctypes.c_uint32], endColumn:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None) +def clang_enableStackTraces() -> None: ... +@dll.bind(None, c.CFUNCTYPE[None, [ctypes.c_void_p]], ctypes.c_void_p, ctypes.c_uint32) +def clang_executeOnThread(fn:c.CFUNCTYPE[None, [ctypes.c_void_p]], user_data:ctypes.c_void_p, stack_size:int) -> None: ... +CXCompletionString: TypeAlias = ctypes.c_void_p +@c.record +class CXCompletionResult(c.Struct): + SIZE = 16 + CursorKind: int + CompletionString: ctypes.c_void_p +CXCompletionResult.register_fields([('CursorKind', ctypes.c_uint32, 0), ('CompletionString', CXCompletionString, 8)]) +enum_CXCompletionChunkKind: dict[int, str] = {(CXCompletionChunk_Optional:=0): 'CXCompletionChunk_Optional', (CXCompletionChunk_TypedText:=1): 'CXCompletionChunk_TypedText', (CXCompletionChunk_Text:=2): 'CXCompletionChunk_Text', (CXCompletionChunk_Placeholder:=3): 'CXCompletionChunk_Placeholder', (CXCompletionChunk_Informative:=4): 'CXCompletionChunk_Informative', (CXCompletionChunk_CurrentParameter:=5): 'CXCompletionChunk_CurrentParameter', (CXCompletionChunk_LeftParen:=6): 'CXCompletionChunk_LeftParen', (CXCompletionChunk_RightParen:=7): 'CXCompletionChunk_RightParen', (CXCompletionChunk_LeftBracket:=8): 'CXCompletionChunk_LeftBracket', (CXCompletionChunk_RightBracket:=9): 'CXCompletionChunk_RightBracket', (CXCompletionChunk_LeftBrace:=10): 'CXCompletionChunk_LeftBrace', (CXCompletionChunk_RightBrace:=11): 'CXCompletionChunk_RightBrace', (CXCompletionChunk_LeftAngle:=12): 'CXCompletionChunk_LeftAngle', (CXCompletionChunk_RightAngle:=13): 'CXCompletionChunk_RightAngle', (CXCompletionChunk_Comma:=14): 'CXCompletionChunk_Comma', (CXCompletionChunk_ResultType:=15): 'CXCompletionChunk_ResultType', (CXCompletionChunk_Colon:=16): 'CXCompletionChunk_Colon', (CXCompletionChunk_SemiColon:=17): 'CXCompletionChunk_SemiColon', (CXCompletionChunk_Equal:=18): 'CXCompletionChunk_Equal', (CXCompletionChunk_HorizontalSpace:=19): 'CXCompletionChunk_HorizontalSpace', (CXCompletionChunk_VerticalSpace:=20): 'CXCompletionChunk_VerticalSpace'} +@dll.bind(ctypes.c_uint32, CXCompletionString, ctypes.c_uint32) +def clang_getCompletionChunkKind(completion_string:CXCompletionString, chunk_number:int) -> ctypes.c_uint32: ... +@dll.bind(CXString, CXCompletionString, ctypes.c_uint32) +def clang_getCompletionChunkText(completion_string:CXCompletionString, chunk_number:int) -> CXString: ... +@dll.bind(CXCompletionString, CXCompletionString, ctypes.c_uint32) +def clang_getCompletionChunkCompletionString(completion_string:CXCompletionString, chunk_number:int) -> CXCompletionString: ... +@dll.bind(ctypes.c_uint32, CXCompletionString) +def clang_getNumCompletionChunks(completion_string:CXCompletionString) -> int: ... +@dll.bind(ctypes.c_uint32, CXCompletionString) +def clang_getCompletionPriority(completion_string:CXCompletionString) -> int: ... +@dll.bind(ctypes.c_uint32, CXCompletionString) +def clang_getCompletionAvailability(completion_string:CXCompletionString) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, CXCompletionString) +def clang_getCompletionNumAnnotations(completion_string:CXCompletionString) -> int: ... +@dll.bind(CXString, CXCompletionString, ctypes.c_uint32) +def clang_getCompletionAnnotation(completion_string:CXCompletionString, annotation_number:int) -> CXString: ... +@dll.bind(CXString, CXCompletionString, c.POINTER[ctypes.c_uint32]) +def clang_getCompletionParent(completion_string:CXCompletionString, kind:c.POINTER[ctypes.c_uint32]) -> CXString: ... +@dll.bind(CXString, CXCompletionString) +def clang_getCompletionBriefComment(completion_string:CXCompletionString) -> CXString: ... +@dll.bind(CXCompletionString, CXCursor) +def clang_getCursorCompletionString(cursor:CXCursor) -> CXCompletionString: ... +@c.record +class CXCodeCompleteResults(c.Struct): + SIZE = 16 + Results: c.POINTER[CXCompletionResult] + NumResults: int +CXCodeCompleteResults.register_fields([('Results', c.POINTER[CXCompletionResult], 0), ('NumResults', ctypes.c_uint32, 8)]) +@dll.bind(ctypes.c_uint32, c.POINTER[CXCodeCompleteResults], ctypes.c_uint32) +def clang_getCompletionNumFixIts(results:c.POINTER[CXCodeCompleteResults], completion_index:int) -> int: ... +@dll.bind(CXString, c.POINTER[CXCodeCompleteResults], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[CXSourceRange]) +def clang_getCompletionFixIt(results:c.POINTER[CXCodeCompleteResults], completion_index:int, fixit_index:int, replacement_range:c.POINTER[CXSourceRange]) -> CXString: ... +enum_CXCodeComplete_Flags: dict[int, str] = {(CXCodeComplete_IncludeMacros:=1): 'CXCodeComplete_IncludeMacros', (CXCodeComplete_IncludeCodePatterns:=2): 'CXCodeComplete_IncludeCodePatterns', (CXCodeComplete_IncludeBriefComments:=4): 'CXCodeComplete_IncludeBriefComments', (CXCodeComplete_SkipPreamble:=8): 'CXCodeComplete_SkipPreamble', (CXCodeComplete_IncludeCompletionsWithFixIts:=16): 'CXCodeComplete_IncludeCompletionsWithFixIts'} +enum_CXCompletionContext: dict[int, str] = {(CXCompletionContext_Unexposed:=0): 'CXCompletionContext_Unexposed', (CXCompletionContext_AnyType:=1): 'CXCompletionContext_AnyType', (CXCompletionContext_AnyValue:=2): 'CXCompletionContext_AnyValue', (CXCompletionContext_ObjCObjectValue:=4): 'CXCompletionContext_ObjCObjectValue', (CXCompletionContext_ObjCSelectorValue:=8): 'CXCompletionContext_ObjCSelectorValue', (CXCompletionContext_CXXClassTypeValue:=16): 'CXCompletionContext_CXXClassTypeValue', (CXCompletionContext_DotMemberAccess:=32): 'CXCompletionContext_DotMemberAccess', (CXCompletionContext_ArrowMemberAccess:=64): 'CXCompletionContext_ArrowMemberAccess', (CXCompletionContext_ObjCPropertyAccess:=128): 'CXCompletionContext_ObjCPropertyAccess', (CXCompletionContext_EnumTag:=256): 'CXCompletionContext_EnumTag', (CXCompletionContext_UnionTag:=512): 'CXCompletionContext_UnionTag', (CXCompletionContext_StructTag:=1024): 'CXCompletionContext_StructTag', (CXCompletionContext_ClassTag:=2048): 'CXCompletionContext_ClassTag', (CXCompletionContext_Namespace:=4096): 'CXCompletionContext_Namespace', (CXCompletionContext_NestedNameSpecifier:=8192): 'CXCompletionContext_NestedNameSpecifier', (CXCompletionContext_ObjCInterface:=16384): 'CXCompletionContext_ObjCInterface', (CXCompletionContext_ObjCProtocol:=32768): 'CXCompletionContext_ObjCProtocol', (CXCompletionContext_ObjCCategory:=65536): 'CXCompletionContext_ObjCCategory', (CXCompletionContext_ObjCInstanceMessage:=131072): 'CXCompletionContext_ObjCInstanceMessage', (CXCompletionContext_ObjCClassMessage:=262144): 'CXCompletionContext_ObjCClassMessage', (CXCompletionContext_ObjCSelectorName:=524288): 'CXCompletionContext_ObjCSelectorName', (CXCompletionContext_MacroName:=1048576): 'CXCompletionContext_MacroName', (CXCompletionContext_NaturalLanguage:=2097152): 'CXCompletionContext_NaturalLanguage', (CXCompletionContext_IncludedFile:=4194304): 'CXCompletionContext_IncludedFile', (CXCompletionContext_Unknown:=8388607): 'CXCompletionContext_Unknown'} +@dll.bind(ctypes.c_uint32) +def clang_defaultCodeCompleteOptions() -> int: ... +@dll.bind(c.POINTER[CXCodeCompleteResults], CXTranslationUnit, c.POINTER[ctypes.c_char], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[struct_CXUnsavedFile], ctypes.c_uint32, ctypes.c_uint32) +def clang_codeCompleteAt(TU:CXTranslationUnit, complete_filename:c.POINTER[ctypes.c_char], complete_line:int, complete_column:int, unsaved_files:c.POINTER[struct_CXUnsavedFile], num_unsaved_files:int, options:int) -> c.POINTER[CXCodeCompleteResults]: ... +@dll.bind(None, c.POINTER[CXCompletionResult], ctypes.c_uint32) +def clang_sortCodeCompletionResults(Results:c.POINTER[CXCompletionResult], NumResults:int) -> None: ... +@dll.bind(None, c.POINTER[CXCodeCompleteResults]) +def clang_disposeCodeCompleteResults(Results:c.POINTER[CXCodeCompleteResults]) -> None: ... +@dll.bind(ctypes.c_uint32, c.POINTER[CXCodeCompleteResults]) +def clang_codeCompleteGetNumDiagnostics(Results:c.POINTER[CXCodeCompleteResults]) -> int: ... +@dll.bind(CXDiagnostic, c.POINTER[CXCodeCompleteResults], ctypes.c_uint32) +def clang_codeCompleteGetDiagnostic(Results:c.POINTER[CXCodeCompleteResults], Index:int) -> CXDiagnostic: ... +@dll.bind(ctypes.c_uint64, c.POINTER[CXCodeCompleteResults]) +def clang_codeCompleteGetContexts(Results:c.POINTER[CXCodeCompleteResults]) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[CXCodeCompleteResults], c.POINTER[ctypes.c_uint32]) +def clang_codeCompleteGetContainerKind(Results:c.POINTER[CXCodeCompleteResults], IsIncomplete:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... +@dll.bind(CXString, c.POINTER[CXCodeCompleteResults]) +def clang_codeCompleteGetContainerUSR(Results:c.POINTER[CXCodeCompleteResults]) -> CXString: ... +@dll.bind(CXString, c.POINTER[CXCodeCompleteResults]) +def clang_codeCompleteGetObjCSelector(Results:c.POINTER[CXCodeCompleteResults]) -> CXString: ... +@dll.bind(CXString) +def clang_getClangVersion() -> CXString: ... +@dll.bind(None, ctypes.c_uint32) +def clang_toggleCrashRecovery(isEnabled:int) -> None: ... +CXInclusionVisitor: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, c.POINTER[CXSourceLocation], ctypes.c_uint32, ctypes.c_void_p]] +@dll.bind(None, CXTranslationUnit, CXInclusionVisitor, CXClientData) +def clang_getInclusions(tu:CXTranslationUnit, visitor:CXInclusionVisitor, client_data:CXClientData) -> None: ... +CXEvalResultKind: dict[int, str] = {(CXEval_Int:=1): 'CXEval_Int', (CXEval_Float:=2): 'CXEval_Float', (CXEval_ObjCStrLiteral:=3): 'CXEval_ObjCStrLiteral', (CXEval_StrLiteral:=4): 'CXEval_StrLiteral', (CXEval_CFStr:=5): 'CXEval_CFStr', (CXEval_Other:=6): 'CXEval_Other', (CXEval_UnExposed:=0): 'CXEval_UnExposed'} +CXEvalResult: TypeAlias = ctypes.c_void_p +@dll.bind(CXEvalResult, CXCursor) +def clang_Cursor_Evaluate(C:CXCursor) -> CXEvalResult: ... +@dll.bind(ctypes.c_uint32, CXEvalResult) +def clang_EvalResult_getKind(E:CXEvalResult) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_int32, CXEvalResult) +def clang_EvalResult_getAsInt(E:CXEvalResult) -> int: ... +@dll.bind(ctypes.c_int64, CXEvalResult) +def clang_EvalResult_getAsLongLong(E:CXEvalResult) -> int: ... +@dll.bind(ctypes.c_uint32, CXEvalResult) +def clang_EvalResult_isUnsignedInt(E:CXEvalResult) -> int: ... +@dll.bind(ctypes.c_uint64, CXEvalResult) +def clang_EvalResult_getAsUnsigned(E:CXEvalResult) -> int: ... +@dll.bind(ctypes.c_double, CXEvalResult) +def clang_EvalResult_getAsDouble(E:CXEvalResult) -> float: ... +@dll.bind(c.POINTER[ctypes.c_char], CXEvalResult) +def clang_EvalResult_getAsStr(E:CXEvalResult) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, CXEvalResult) +def clang_EvalResult_dispose(E:CXEvalResult) -> None: ... +CXRemapping: TypeAlias = ctypes.c_void_p +@dll.bind(CXRemapping, c.POINTER[ctypes.c_char]) +def clang_getRemappings(path:c.POINTER[ctypes.c_char]) -> CXRemapping: ... +@dll.bind(CXRemapping, c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_uint32) +def clang_getRemappingsFromFileList(filePaths:c.POINTER[c.POINTER[ctypes.c_char]], numFiles:int) -> CXRemapping: ... +@dll.bind(ctypes.c_uint32, CXRemapping) +def clang_remap_getNumFiles(_0:CXRemapping) -> int: ... +@dll.bind(None, CXRemapping, ctypes.c_uint32, c.POINTER[CXString], c.POINTER[CXString]) +def clang_remap_getFilenames(_0:CXRemapping, index:int, original:c.POINTER[CXString], transformed:c.POINTER[CXString]) -> None: ... +@dll.bind(None, CXRemapping) +def clang_remap_dispose(_0:CXRemapping) -> None: ... +enum_CXVisitorResult: dict[int, str] = {(CXVisit_Break:=0): 'CXVisit_Break', (CXVisit_Continue:=1): 'CXVisit_Continue'} +@c.record +class struct_CXCursorAndRangeVisitor(c.Struct): + SIZE = 16 + context: ctypes.c_void_p + visit: c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_void_p, CXCursor, CXSourceRange]] +struct_CXCursorAndRangeVisitor.register_fields([('context', ctypes.c_void_p, 0), ('visit', c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_void_p, CXCursor, CXSourceRange]], 8)]) +CXCursorAndRangeVisitor: TypeAlias = struct_CXCursorAndRangeVisitor +CXResult: dict[int, str] = {(CXResult_Success:=0): 'CXResult_Success', (CXResult_Invalid:=1): 'CXResult_Invalid', (CXResult_VisitBreak:=2): 'CXResult_VisitBreak'} +@dll.bind(ctypes.c_uint32, CXCursor, CXFile, CXCursorAndRangeVisitor) +def clang_findReferencesInFile(cursor:CXCursor, file:CXFile, visitor:CXCursorAndRangeVisitor) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, CXTranslationUnit, CXFile, CXCursorAndRangeVisitor) +def clang_findIncludesInFile(TU:CXTranslationUnit, file:CXFile, visitor:CXCursorAndRangeVisitor) -> ctypes.c_uint32: ... +class struct__CXCursorAndRangeVisitorBlock(c.Struct): pass +CXCursorAndRangeVisitorBlock: TypeAlias = c.POINTER[struct__CXCursorAndRangeVisitorBlock] +@dll.bind(ctypes.c_uint32, CXCursor, CXFile, CXCursorAndRangeVisitorBlock) +def clang_findReferencesInFileWithBlock(_0:CXCursor, _1:CXFile, _2:CXCursorAndRangeVisitorBlock) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, CXTranslationUnit, CXFile, CXCursorAndRangeVisitorBlock) +def clang_findIncludesInFileWithBlock(_0:CXTranslationUnit, _1:CXFile, _2:CXCursorAndRangeVisitorBlock) -> ctypes.c_uint32: ... +CXIdxClientFile: TypeAlias = ctypes.c_void_p +CXIdxClientEntity: TypeAlias = ctypes.c_void_p +CXIdxClientContainer: TypeAlias = ctypes.c_void_p +CXIdxClientASTFile: TypeAlias = ctypes.c_void_p +@c.record +class CXIdxLoc(c.Struct): + SIZE = 24 + ptr_data: c.Array[ctypes.c_void_p, Literal[2]] + int_data: int +CXIdxLoc.register_fields([('ptr_data', c.Array[ctypes.c_void_p, Literal[2]], 0), ('int_data', ctypes.c_uint32, 16)]) +@c.record +class CXIdxIncludedFileInfo(c.Struct): + SIZE = 56 + hashLoc: CXIdxLoc + filename: c.POINTER[ctypes.c_char] + file: ctypes.c_void_p + isImport: int + isAngled: int + isModuleImport: int +CXIdxIncludedFileInfo.register_fields([('hashLoc', CXIdxLoc, 0), ('filename', c.POINTER[ctypes.c_char], 24), ('file', CXFile, 32), ('isImport', ctypes.c_int32, 40), ('isAngled', ctypes.c_int32, 44), ('isModuleImport', ctypes.c_int32, 48)]) +@c.record +class CXIdxImportedASTFileInfo(c.Struct): + SIZE = 48 + file: ctypes.c_void_p + module: ctypes.c_void_p + loc: CXIdxLoc + isImplicit: int +CXIdxImportedASTFileInfo.register_fields([('file', CXFile, 0), ('module', CXModule, 8), ('loc', CXIdxLoc, 16), ('isImplicit', ctypes.c_int32, 40)]) +CXIdxEntityKind: dict[int, str] = {(CXIdxEntity_Unexposed:=0): 'CXIdxEntity_Unexposed', (CXIdxEntity_Typedef:=1): 'CXIdxEntity_Typedef', (CXIdxEntity_Function:=2): 'CXIdxEntity_Function', (CXIdxEntity_Variable:=3): 'CXIdxEntity_Variable', (CXIdxEntity_Field:=4): 'CXIdxEntity_Field', (CXIdxEntity_EnumConstant:=5): 'CXIdxEntity_EnumConstant', (CXIdxEntity_ObjCClass:=6): 'CXIdxEntity_ObjCClass', (CXIdxEntity_ObjCProtocol:=7): 'CXIdxEntity_ObjCProtocol', (CXIdxEntity_ObjCCategory:=8): 'CXIdxEntity_ObjCCategory', (CXIdxEntity_ObjCInstanceMethod:=9): 'CXIdxEntity_ObjCInstanceMethod', (CXIdxEntity_ObjCClassMethod:=10): 'CXIdxEntity_ObjCClassMethod', (CXIdxEntity_ObjCProperty:=11): 'CXIdxEntity_ObjCProperty', (CXIdxEntity_ObjCIvar:=12): 'CXIdxEntity_ObjCIvar', (CXIdxEntity_Enum:=13): 'CXIdxEntity_Enum', (CXIdxEntity_Struct:=14): 'CXIdxEntity_Struct', (CXIdxEntity_Union:=15): 'CXIdxEntity_Union', (CXIdxEntity_CXXClass:=16): 'CXIdxEntity_CXXClass', (CXIdxEntity_CXXNamespace:=17): 'CXIdxEntity_CXXNamespace', (CXIdxEntity_CXXNamespaceAlias:=18): 'CXIdxEntity_CXXNamespaceAlias', (CXIdxEntity_CXXStaticVariable:=19): 'CXIdxEntity_CXXStaticVariable', (CXIdxEntity_CXXStaticMethod:=20): 'CXIdxEntity_CXXStaticMethod', (CXIdxEntity_CXXInstanceMethod:=21): 'CXIdxEntity_CXXInstanceMethod', (CXIdxEntity_CXXConstructor:=22): 'CXIdxEntity_CXXConstructor', (CXIdxEntity_CXXDestructor:=23): 'CXIdxEntity_CXXDestructor', (CXIdxEntity_CXXConversionFunction:=24): 'CXIdxEntity_CXXConversionFunction', (CXIdxEntity_CXXTypeAlias:=25): 'CXIdxEntity_CXXTypeAlias', (CXIdxEntity_CXXInterface:=26): 'CXIdxEntity_CXXInterface', (CXIdxEntity_CXXConcept:=27): 'CXIdxEntity_CXXConcept'} +CXIdxEntityLanguage: dict[int, str] = {(CXIdxEntityLang_None:=0): 'CXIdxEntityLang_None', (CXIdxEntityLang_C:=1): 'CXIdxEntityLang_C', (CXIdxEntityLang_ObjC:=2): 'CXIdxEntityLang_ObjC', (CXIdxEntityLang_CXX:=3): 'CXIdxEntityLang_CXX', (CXIdxEntityLang_Swift:=4): 'CXIdxEntityLang_Swift'} +CXIdxEntityCXXTemplateKind: dict[int, str] = {(CXIdxEntity_NonTemplate:=0): 'CXIdxEntity_NonTemplate', (CXIdxEntity_Template:=1): 'CXIdxEntity_Template', (CXIdxEntity_TemplatePartialSpecialization:=2): 'CXIdxEntity_TemplatePartialSpecialization', (CXIdxEntity_TemplateSpecialization:=3): 'CXIdxEntity_TemplateSpecialization'} +CXIdxAttrKind: dict[int, str] = {(CXIdxAttr_Unexposed:=0): 'CXIdxAttr_Unexposed', (CXIdxAttr_IBAction:=1): 'CXIdxAttr_IBAction', (CXIdxAttr_IBOutlet:=2): 'CXIdxAttr_IBOutlet', (CXIdxAttr_IBOutletCollection:=3): 'CXIdxAttr_IBOutletCollection'} +@c.record +class CXIdxAttrInfo(c.Struct): + SIZE = 64 + kind: int + cursor: CXCursor + loc: CXIdxLoc +CXIdxAttrInfo.register_fields([('kind', ctypes.c_uint32, 0), ('cursor', CXCursor, 8), ('loc', CXIdxLoc, 40)]) +@c.record +class CXIdxEntityInfo(c.Struct): + SIZE = 80 + kind: int + templateKind: int + lang: int + name: c.POINTER[ctypes.c_char] + USR: c.POINTER[ctypes.c_char] + cursor: CXCursor + attributes: c.POINTER[c.POINTER[CXIdxAttrInfo]] + numAttributes: int +CXIdxEntityInfo.register_fields([('kind', ctypes.c_uint32, 0), ('templateKind', ctypes.c_uint32, 4), ('lang', ctypes.c_uint32, 8), ('name', c.POINTER[ctypes.c_char], 16), ('USR', c.POINTER[ctypes.c_char], 24), ('cursor', CXCursor, 32), ('attributes', c.POINTER[c.POINTER[CXIdxAttrInfo]], 64), ('numAttributes', ctypes.c_uint32, 72)]) +@c.record +class CXIdxContainerInfo(c.Struct): + SIZE = 32 + cursor: CXCursor +CXIdxContainerInfo.register_fields([('cursor', CXCursor, 0)]) +@c.record +class CXIdxIBOutletCollectionAttrInfo(c.Struct): + SIZE = 72 + attrInfo: c.POINTER[CXIdxAttrInfo] + objcClass: c.POINTER[CXIdxEntityInfo] + classCursor: CXCursor + classLoc: CXIdxLoc +CXIdxIBOutletCollectionAttrInfo.register_fields([('attrInfo', c.POINTER[CXIdxAttrInfo], 0), ('objcClass', c.POINTER[CXIdxEntityInfo], 8), ('classCursor', CXCursor, 16), ('classLoc', CXIdxLoc, 48)]) +CXIdxDeclInfoFlags: dict[int, str] = {(CXIdxDeclFlag_Skipped:=1): 'CXIdxDeclFlag_Skipped'} +@c.record +class CXIdxDeclInfo(c.Struct): + SIZE = 128 + entityInfo: c.POINTER[CXIdxEntityInfo] + cursor: CXCursor + loc: CXIdxLoc + semanticContainer: c.POINTER[CXIdxContainerInfo] + lexicalContainer: c.POINTER[CXIdxContainerInfo] + isRedeclaration: int + isDefinition: int + isContainer: int + declAsContainer: c.POINTER[CXIdxContainerInfo] + isImplicit: int + attributes: c.POINTER[c.POINTER[CXIdxAttrInfo]] + numAttributes: int + flags: int +CXIdxDeclInfo.register_fields([('entityInfo', c.POINTER[CXIdxEntityInfo], 0), ('cursor', CXCursor, 8), ('loc', CXIdxLoc, 40), ('semanticContainer', c.POINTER[CXIdxContainerInfo], 64), ('lexicalContainer', c.POINTER[CXIdxContainerInfo], 72), ('isRedeclaration', ctypes.c_int32, 80), ('isDefinition', ctypes.c_int32, 84), ('isContainer', ctypes.c_int32, 88), ('declAsContainer', c.POINTER[CXIdxContainerInfo], 96), ('isImplicit', ctypes.c_int32, 104), ('attributes', c.POINTER[c.POINTER[CXIdxAttrInfo]], 112), ('numAttributes', ctypes.c_uint32, 120), ('flags', ctypes.c_uint32, 124)]) +CXIdxObjCContainerKind: dict[int, str] = {(CXIdxObjCContainer_ForwardRef:=0): 'CXIdxObjCContainer_ForwardRef', (CXIdxObjCContainer_Interface:=1): 'CXIdxObjCContainer_Interface', (CXIdxObjCContainer_Implementation:=2): 'CXIdxObjCContainer_Implementation'} +@c.record +class CXIdxObjCContainerDeclInfo(c.Struct): + SIZE = 16 + declInfo: c.POINTER[CXIdxDeclInfo] + kind: int +CXIdxObjCContainerDeclInfo.register_fields([('declInfo', c.POINTER[CXIdxDeclInfo], 0), ('kind', ctypes.c_uint32, 8)]) +@c.record +class CXIdxBaseClassInfo(c.Struct): + SIZE = 64 + base: c.POINTER[CXIdxEntityInfo] + cursor: CXCursor + loc: CXIdxLoc +CXIdxBaseClassInfo.register_fields([('base', c.POINTER[CXIdxEntityInfo], 0), ('cursor', CXCursor, 8), ('loc', CXIdxLoc, 40)]) +@c.record +class CXIdxObjCProtocolRefInfo(c.Struct): + SIZE = 64 + protocol: c.POINTER[CXIdxEntityInfo] + cursor: CXCursor + loc: CXIdxLoc +CXIdxObjCProtocolRefInfo.register_fields([('protocol', c.POINTER[CXIdxEntityInfo], 0), ('cursor', CXCursor, 8), ('loc', CXIdxLoc, 40)]) +@c.record +class CXIdxObjCProtocolRefListInfo(c.Struct): + SIZE = 16 + protocols: c.POINTER[c.POINTER[CXIdxObjCProtocolRefInfo]] + numProtocols: int +CXIdxObjCProtocolRefListInfo.register_fields([('protocols', c.POINTER[c.POINTER[CXIdxObjCProtocolRefInfo]], 0), ('numProtocols', ctypes.c_uint32, 8)]) +@c.record +class CXIdxObjCInterfaceDeclInfo(c.Struct): + SIZE = 24 + containerInfo: c.POINTER[CXIdxObjCContainerDeclInfo] + superInfo: c.POINTER[CXIdxBaseClassInfo] + protocols: c.POINTER[CXIdxObjCProtocolRefListInfo] +CXIdxObjCInterfaceDeclInfo.register_fields([('containerInfo', c.POINTER[CXIdxObjCContainerDeclInfo], 0), ('superInfo', c.POINTER[CXIdxBaseClassInfo], 8), ('protocols', c.POINTER[CXIdxObjCProtocolRefListInfo], 16)]) +@c.record +class CXIdxObjCCategoryDeclInfo(c.Struct): + SIZE = 80 + containerInfo: c.POINTER[CXIdxObjCContainerDeclInfo] + objcClass: c.POINTER[CXIdxEntityInfo] + classCursor: CXCursor + classLoc: CXIdxLoc + protocols: c.POINTER[CXIdxObjCProtocolRefListInfo] +CXIdxObjCCategoryDeclInfo.register_fields([('containerInfo', c.POINTER[CXIdxObjCContainerDeclInfo], 0), ('objcClass', c.POINTER[CXIdxEntityInfo], 8), ('classCursor', CXCursor, 16), ('classLoc', CXIdxLoc, 48), ('protocols', c.POINTER[CXIdxObjCProtocolRefListInfo], 72)]) +@c.record +class CXIdxObjCPropertyDeclInfo(c.Struct): + SIZE = 24 + declInfo: c.POINTER[CXIdxDeclInfo] + getter: c.POINTER[CXIdxEntityInfo] + setter: c.POINTER[CXIdxEntityInfo] +CXIdxObjCPropertyDeclInfo.register_fields([('declInfo', c.POINTER[CXIdxDeclInfo], 0), ('getter', c.POINTER[CXIdxEntityInfo], 8), ('setter', c.POINTER[CXIdxEntityInfo], 16)]) +@c.record +class CXIdxCXXClassDeclInfo(c.Struct): + SIZE = 24 + declInfo: c.POINTER[CXIdxDeclInfo] + bases: c.POINTER[c.POINTER[CXIdxBaseClassInfo]] + numBases: int +CXIdxCXXClassDeclInfo.register_fields([('declInfo', c.POINTER[CXIdxDeclInfo], 0), ('bases', c.POINTER[c.POINTER[CXIdxBaseClassInfo]], 8), ('numBases', ctypes.c_uint32, 16)]) +CXIdxEntityRefKind: dict[int, str] = {(CXIdxEntityRef_Direct:=1): 'CXIdxEntityRef_Direct', (CXIdxEntityRef_Implicit:=2): 'CXIdxEntityRef_Implicit'} +CXSymbolRole: dict[int, str] = {(CXSymbolRole_None:=0): 'CXSymbolRole_None', (CXSymbolRole_Declaration:=1): 'CXSymbolRole_Declaration', (CXSymbolRole_Definition:=2): 'CXSymbolRole_Definition', (CXSymbolRole_Reference:=4): 'CXSymbolRole_Reference', (CXSymbolRole_Read:=8): 'CXSymbolRole_Read', (CXSymbolRole_Write:=16): 'CXSymbolRole_Write', (CXSymbolRole_Call:=32): 'CXSymbolRole_Call', (CXSymbolRole_Dynamic:=64): 'CXSymbolRole_Dynamic', (CXSymbolRole_AddressOf:=128): 'CXSymbolRole_AddressOf', (CXSymbolRole_Implicit:=256): 'CXSymbolRole_Implicit'} +@c.record +class CXIdxEntityRefInfo(c.Struct): + SIZE = 96 + kind: int + cursor: CXCursor + loc: CXIdxLoc + referencedEntity: c.POINTER[CXIdxEntityInfo] + parentEntity: c.POINTER[CXIdxEntityInfo] + container: c.POINTER[CXIdxContainerInfo] + role: int +CXIdxEntityRefInfo.register_fields([('kind', ctypes.c_uint32, 0), ('cursor', CXCursor, 8), ('loc', CXIdxLoc, 40), ('referencedEntity', c.POINTER[CXIdxEntityInfo], 64), ('parentEntity', c.POINTER[CXIdxEntityInfo], 72), ('container', c.POINTER[CXIdxContainerInfo], 80), ('role', ctypes.c_uint32, 88)]) +@c.record +class IndexerCallbacks(c.Struct): + SIZE = 64 + abortQuery: c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, ctypes.c_void_p]] + diagnostic: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]] + enteredMainFile: c.CFUNCTYPE[ctypes.c_void_p, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]] + ppIncludedFile: c.CFUNCTYPE[ctypes.c_void_p, [ctypes.c_void_p, c.POINTER[CXIdxIncludedFileInfo]]] + importedASTFile: c.CFUNCTYPE[ctypes.c_void_p, [ctypes.c_void_p, c.POINTER[CXIdxImportedASTFileInfo]]] + startedTranslationUnit: c.CFUNCTYPE[ctypes.c_void_p, [ctypes.c_void_p, ctypes.c_void_p]] + indexDeclaration: c.CFUNCTYPE[None, [ctypes.c_void_p, c.POINTER[CXIdxDeclInfo]]] + indexEntityReference: c.CFUNCTYPE[None, [ctypes.c_void_p, c.POINTER[CXIdxEntityRefInfo]]] +IndexerCallbacks.register_fields([('abortQuery', c.CFUNCTYPE[ctypes.c_int32, [CXClientData, ctypes.c_void_p]], 0), ('diagnostic', c.CFUNCTYPE[None, [CXClientData, CXDiagnosticSet, ctypes.c_void_p]], 8), ('enteredMainFile', c.CFUNCTYPE[CXIdxClientFile, [CXClientData, CXFile, ctypes.c_void_p]], 16), ('ppIncludedFile', c.CFUNCTYPE[CXIdxClientFile, [CXClientData, c.POINTER[CXIdxIncludedFileInfo]]], 24), ('importedASTFile', c.CFUNCTYPE[CXIdxClientASTFile, [CXClientData, c.POINTER[CXIdxImportedASTFileInfo]]], 32), ('startedTranslationUnit', c.CFUNCTYPE[CXIdxClientContainer, [CXClientData, ctypes.c_void_p]], 40), ('indexDeclaration', c.CFUNCTYPE[None, [CXClientData, c.POINTER[CXIdxDeclInfo]]], 48), ('indexEntityReference', c.CFUNCTYPE[None, [CXClientData, c.POINTER[CXIdxEntityRefInfo]]], 56)]) +@dll.bind(ctypes.c_int32, ctypes.c_uint32) +def clang_index_isEntityObjCContainerKind(_0:ctypes.c_uint32) -> int: ... +@dll.bind(c.POINTER[CXIdxObjCContainerDeclInfo], c.POINTER[CXIdxDeclInfo]) +def clang_index_getObjCContainerDeclInfo(_0:c.POINTER[CXIdxDeclInfo]) -> c.POINTER[CXIdxObjCContainerDeclInfo]: ... +@dll.bind(c.POINTER[CXIdxObjCInterfaceDeclInfo], c.POINTER[CXIdxDeclInfo]) +def clang_index_getObjCInterfaceDeclInfo(_0:c.POINTER[CXIdxDeclInfo]) -> c.POINTER[CXIdxObjCInterfaceDeclInfo]: ... +@dll.bind(c.POINTER[CXIdxObjCCategoryDeclInfo], c.POINTER[CXIdxDeclInfo]) +def clang_index_getObjCCategoryDeclInfo(_0:c.POINTER[CXIdxDeclInfo]) -> c.POINTER[CXIdxObjCCategoryDeclInfo]: ... +@dll.bind(c.POINTER[CXIdxObjCProtocolRefListInfo], c.POINTER[CXIdxDeclInfo]) +def clang_index_getObjCProtocolRefListInfo(_0:c.POINTER[CXIdxDeclInfo]) -> c.POINTER[CXIdxObjCProtocolRefListInfo]: ... +@dll.bind(c.POINTER[CXIdxObjCPropertyDeclInfo], c.POINTER[CXIdxDeclInfo]) +def clang_index_getObjCPropertyDeclInfo(_0:c.POINTER[CXIdxDeclInfo]) -> c.POINTER[CXIdxObjCPropertyDeclInfo]: ... +@dll.bind(c.POINTER[CXIdxIBOutletCollectionAttrInfo], c.POINTER[CXIdxAttrInfo]) +def clang_index_getIBOutletCollectionAttrInfo(_0:c.POINTER[CXIdxAttrInfo]) -> c.POINTER[CXIdxIBOutletCollectionAttrInfo]: ... +@dll.bind(c.POINTER[CXIdxCXXClassDeclInfo], c.POINTER[CXIdxDeclInfo]) +def clang_index_getCXXClassDeclInfo(_0:c.POINTER[CXIdxDeclInfo]) -> c.POINTER[CXIdxCXXClassDeclInfo]: ... +@dll.bind(CXIdxClientContainer, c.POINTER[CXIdxContainerInfo]) +def clang_index_getClientContainer(_0:c.POINTER[CXIdxContainerInfo]) -> CXIdxClientContainer: ... +@dll.bind(None, c.POINTER[CXIdxContainerInfo], CXIdxClientContainer) +def clang_index_setClientContainer(_0:c.POINTER[CXIdxContainerInfo], _1:CXIdxClientContainer) -> None: ... +@dll.bind(CXIdxClientEntity, c.POINTER[CXIdxEntityInfo]) +def clang_index_getClientEntity(_0:c.POINTER[CXIdxEntityInfo]) -> CXIdxClientEntity: ... +@dll.bind(None, c.POINTER[CXIdxEntityInfo], CXIdxClientEntity) +def clang_index_setClientEntity(_0:c.POINTER[CXIdxEntityInfo], _1:CXIdxClientEntity) -> None: ... +CXIndexAction: TypeAlias = ctypes.c_void_p +@dll.bind(CXIndexAction, CXIndex) +def clang_IndexAction_create(CIdx:CXIndex) -> CXIndexAction: ... +@dll.bind(None, CXIndexAction) +def clang_IndexAction_dispose(_0:CXIndexAction) -> None: ... +CXIndexOptFlags: dict[int, str] = {(CXIndexOpt_None:=0): 'CXIndexOpt_None', (CXIndexOpt_SuppressRedundantRefs:=1): 'CXIndexOpt_SuppressRedundantRefs', (CXIndexOpt_IndexFunctionLocalSymbols:=2): 'CXIndexOpt_IndexFunctionLocalSymbols', (CXIndexOpt_IndexImplicitTemplateInstantiations:=4): 'CXIndexOpt_IndexImplicitTemplateInstantiations', (CXIndexOpt_SuppressWarnings:=8): 'CXIndexOpt_SuppressWarnings', (CXIndexOpt_SkipParsedBodiesInSession:=16): 'CXIndexOpt_SkipParsedBodiesInSession'} +@dll.bind(ctypes.c_int32, CXIndexAction, CXClientData, c.POINTER[IndexerCallbacks], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32, c.POINTER[struct_CXUnsavedFile], ctypes.c_uint32, c.POINTER[CXTranslationUnit], ctypes.c_uint32) +def clang_indexSourceFile(_0:CXIndexAction, client_data:CXClientData, index_callbacks:c.POINTER[IndexerCallbacks], index_callbacks_size:int, index_options:int, source_filename:c.POINTER[ctypes.c_char], command_line_args:c.POINTER[c.POINTER[ctypes.c_char]], num_command_line_args:int, unsaved_files:c.POINTER[struct_CXUnsavedFile], num_unsaved_files:int, out_TU:c.POINTER[CXTranslationUnit], TU_options:int) -> int: ... +@dll.bind(ctypes.c_int32, CXIndexAction, CXClientData, c.POINTER[IndexerCallbacks], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32, c.POINTER[struct_CXUnsavedFile], ctypes.c_uint32, c.POINTER[CXTranslationUnit], ctypes.c_uint32) +def clang_indexSourceFileFullArgv(_0:CXIndexAction, client_data:CXClientData, index_callbacks:c.POINTER[IndexerCallbacks], index_callbacks_size:int, index_options:int, source_filename:c.POINTER[ctypes.c_char], command_line_args:c.POINTER[c.POINTER[ctypes.c_char]], num_command_line_args:int, unsaved_files:c.POINTER[struct_CXUnsavedFile], num_unsaved_files:int, out_TU:c.POINTER[CXTranslationUnit], TU_options:int) -> int: ... +@dll.bind(ctypes.c_int32, CXIndexAction, CXClientData, c.POINTER[IndexerCallbacks], ctypes.c_uint32, ctypes.c_uint32, CXTranslationUnit) +def clang_indexTranslationUnit(_0:CXIndexAction, client_data:CXClientData, index_callbacks:c.POINTER[IndexerCallbacks], index_callbacks_size:int, index_options:int, _5:CXTranslationUnit) -> int: ... +@dll.bind(None, CXIdxLoc, c.POINTER[CXIdxClientFile], c.POINTER[CXFile], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def clang_indexLoc_getFileLocation(loc:CXIdxLoc, indexFile:c.POINTER[CXIdxClientFile], file:c.POINTER[CXFile], line:c.POINTER[ctypes.c_uint32], column:c.POINTER[ctypes.c_uint32], offset:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(CXSourceLocation, CXIdxLoc) +def clang_indexLoc_getCXSourceLocation(loc:CXIdxLoc) -> CXSourceLocation: ... +CXFieldVisitor: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [CXCursor, ctypes.c_void_p]] +@dll.bind(ctypes.c_uint32, CXType, CXFieldVisitor, CXClientData) +def clang_Type_visitFields(T:CXType, visitor:CXFieldVisitor, client_data:CXClientData) -> int: ... +@dll.bind(ctypes.c_uint32, CXType, CXFieldVisitor, CXClientData) +def clang_visitCXXBaseClasses(T:CXType, visitor:CXFieldVisitor, client_data:CXClientData) -> int: ... +enum_CXBinaryOperatorKind: dict[int, str] = {(CXBinaryOperator_Invalid:=0): 'CXBinaryOperator_Invalid', (CXBinaryOperator_PtrMemD:=1): 'CXBinaryOperator_PtrMemD', (CXBinaryOperator_PtrMemI:=2): 'CXBinaryOperator_PtrMemI', (CXBinaryOperator_Mul:=3): 'CXBinaryOperator_Mul', (CXBinaryOperator_Div:=4): 'CXBinaryOperator_Div', (CXBinaryOperator_Rem:=5): 'CXBinaryOperator_Rem', (CXBinaryOperator_Add:=6): 'CXBinaryOperator_Add', (CXBinaryOperator_Sub:=7): 'CXBinaryOperator_Sub', (CXBinaryOperator_Shl:=8): 'CXBinaryOperator_Shl', (CXBinaryOperator_Shr:=9): 'CXBinaryOperator_Shr', (CXBinaryOperator_Cmp:=10): 'CXBinaryOperator_Cmp', (CXBinaryOperator_LT:=11): 'CXBinaryOperator_LT', (CXBinaryOperator_GT:=12): 'CXBinaryOperator_GT', (CXBinaryOperator_LE:=13): 'CXBinaryOperator_LE', (CXBinaryOperator_GE:=14): 'CXBinaryOperator_GE', (CXBinaryOperator_EQ:=15): 'CXBinaryOperator_EQ', (CXBinaryOperator_NE:=16): 'CXBinaryOperator_NE', (CXBinaryOperator_And:=17): 'CXBinaryOperator_And', (CXBinaryOperator_Xor:=18): 'CXBinaryOperator_Xor', (CXBinaryOperator_Or:=19): 'CXBinaryOperator_Or', (CXBinaryOperator_LAnd:=20): 'CXBinaryOperator_LAnd', (CXBinaryOperator_LOr:=21): 'CXBinaryOperator_LOr', (CXBinaryOperator_Assign:=22): 'CXBinaryOperator_Assign', (CXBinaryOperator_MulAssign:=23): 'CXBinaryOperator_MulAssign', (CXBinaryOperator_DivAssign:=24): 'CXBinaryOperator_DivAssign', (CXBinaryOperator_RemAssign:=25): 'CXBinaryOperator_RemAssign', (CXBinaryOperator_AddAssign:=26): 'CXBinaryOperator_AddAssign', (CXBinaryOperator_SubAssign:=27): 'CXBinaryOperator_SubAssign', (CXBinaryOperator_ShlAssign:=28): 'CXBinaryOperator_ShlAssign', (CXBinaryOperator_ShrAssign:=29): 'CXBinaryOperator_ShrAssign', (CXBinaryOperator_AndAssign:=30): 'CXBinaryOperator_AndAssign', (CXBinaryOperator_XorAssign:=31): 'CXBinaryOperator_XorAssign', (CXBinaryOperator_OrAssign:=32): 'CXBinaryOperator_OrAssign', (CXBinaryOperator_Comma:=33): 'CXBinaryOperator_Comma'} +@dll.bind(CXString, ctypes.c_uint32) +def clang_getBinaryOperatorKindSpelling(kind:ctypes.c_uint32) -> CXString: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCursorBinaryOperatorKind(cursor:CXCursor) -> ctypes.c_uint32: ... +enum_CXUnaryOperatorKind: dict[int, str] = {(CXUnaryOperator_Invalid:=0): 'CXUnaryOperator_Invalid', (CXUnaryOperator_PostInc:=1): 'CXUnaryOperator_PostInc', (CXUnaryOperator_PostDec:=2): 'CXUnaryOperator_PostDec', (CXUnaryOperator_PreInc:=3): 'CXUnaryOperator_PreInc', (CXUnaryOperator_PreDec:=4): 'CXUnaryOperator_PreDec', (CXUnaryOperator_AddrOf:=5): 'CXUnaryOperator_AddrOf', (CXUnaryOperator_Deref:=6): 'CXUnaryOperator_Deref', (CXUnaryOperator_Plus:=7): 'CXUnaryOperator_Plus', (CXUnaryOperator_Minus:=8): 'CXUnaryOperator_Minus', (CXUnaryOperator_Not:=9): 'CXUnaryOperator_Not', (CXUnaryOperator_LNot:=10): 'CXUnaryOperator_LNot', (CXUnaryOperator_Real:=11): 'CXUnaryOperator_Real', (CXUnaryOperator_Imag:=12): 'CXUnaryOperator_Imag', (CXUnaryOperator_Extension:=13): 'CXUnaryOperator_Extension', (CXUnaryOperator_Coawait:=14): 'CXUnaryOperator_Coawait'} +@dll.bind(CXString, ctypes.c_uint32) +def clang_getUnaryOperatorKindSpelling(kind:ctypes.c_uint32) -> CXString: ... +@dll.bind(ctypes.c_uint32, CXCursor) +def clang_getCursorUnaryOperatorKind(cursor:CXCursor) -> ctypes.c_uint32: ... +@dll.bind(c.POINTER[ctypes.c_char], CXString) +def clang_getCString(string:CXString) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, CXString) +def clang_disposeString(string:CXString) -> None: ... +@dll.bind(None, c.POINTER[CXStringSet]) +def clang_disposeStringSet(set:c.POINTER[CXStringSet]) -> None: ... +@dll.bind(CXSourceLocation) +def clang_getNullLocation() -> CXSourceLocation: ... +@dll.bind(ctypes.c_uint32, CXSourceLocation, CXSourceLocation) +def clang_equalLocations(loc1:CXSourceLocation, loc2:CXSourceLocation) -> int: ... +@dll.bind(ctypes.c_uint32, CXSourceLocation, CXSourceLocation) +def clang_isBeforeInTranslationUnit(loc1:CXSourceLocation, loc2:CXSourceLocation) -> int: ... +@dll.bind(ctypes.c_int32, CXSourceLocation) +def clang_Location_isInSystemHeader(location:CXSourceLocation) -> int: ... +@dll.bind(ctypes.c_int32, CXSourceLocation) +def clang_Location_isFromMainFile(location:CXSourceLocation) -> int: ... +@dll.bind(CXSourceRange) +def clang_getNullRange() -> CXSourceRange: ... +@dll.bind(CXSourceRange, CXSourceLocation, CXSourceLocation) +def clang_getRange(begin:CXSourceLocation, end:CXSourceLocation) -> CXSourceRange: ... +@dll.bind(ctypes.c_uint32, CXSourceRange, CXSourceRange) +def clang_equalRanges(range1:CXSourceRange, range2:CXSourceRange) -> int: ... +@dll.bind(ctypes.c_int32, CXSourceRange) +def clang_Range_isNull(range:CXSourceRange) -> int: ... +@dll.bind(None, CXSourceLocation, c.POINTER[CXFile], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def clang_getExpansionLocation(location:CXSourceLocation, file:c.POINTER[CXFile], line:c.POINTER[ctypes.c_uint32], column:c.POINTER[ctypes.c_uint32], offset:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, CXSourceLocation, c.POINTER[CXString], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def clang_getPresumedLocation(location:CXSourceLocation, filename:c.POINTER[CXString], line:c.POINTER[ctypes.c_uint32], column:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, CXSourceLocation, c.POINTER[CXFile], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def clang_getInstantiationLocation(location:CXSourceLocation, file:c.POINTER[CXFile], line:c.POINTER[ctypes.c_uint32], column:c.POINTER[ctypes.c_uint32], offset:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, CXSourceLocation, c.POINTER[CXFile], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def clang_getSpellingLocation(location:CXSourceLocation, file:c.POINTER[CXFile], line:c.POINTER[ctypes.c_uint32], column:c.POINTER[ctypes.c_uint32], offset:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, CXSourceLocation, c.POINTER[CXFile], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def clang_getFileLocation(location:CXSourceLocation, file:c.POINTER[CXFile], line:c.POINTER[ctypes.c_uint32], column:c.POINTER[ctypes.c_uint32], offset:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(CXSourceLocation, CXSourceRange) +def clang_getRangeStart(range:CXSourceRange) -> CXSourceLocation: ... +@dll.bind(CXSourceLocation, CXSourceRange) +def clang_getRangeEnd(range:CXSourceRange) -> CXSourceLocation: ... +@dll.bind(None, c.POINTER[CXSourceRangeList]) +def clang_disposeSourceRangeList(ranges:c.POINTER[CXSourceRangeList]) -> None: ... +@dll.bind(CXString, CXFile) +def clang_getFileName(SFile:CXFile) -> CXString: ... +time_t: TypeAlias = ctypes.c_int64 +@dll.bind(time_t, CXFile) +def clang_getFileTime(SFile:CXFile) -> time_t: ... +@c.record +class CXFileUniqueID(c.Struct): + SIZE = 24 + data: c.Array[ctypes.c_uint64, Literal[3]] +CXFileUniqueID.register_fields([('data', c.Array[ctypes.c_uint64, Literal[3]], 0)]) +@dll.bind(ctypes.c_int32, CXFile, c.POINTER[CXFileUniqueID]) +def clang_getFileUniqueID(file:CXFile, outID:c.POINTER[CXFileUniqueID]) -> int: ... +@dll.bind(ctypes.c_int32, CXFile, CXFile) +def clang_File_isEqual(file1:CXFile, file2:CXFile) -> int: ... +@dll.bind(CXString, CXFile) +def clang_File_tryGetRealPathName(file:CXFile) -> CXString: ... +CINDEX_VERSION_MAJOR = 0 +CINDEX_VERSION_MINOR = 64 +CINDEX_VERSION_ENCODE = lambda major,minor: (((major)*10000) + ((minor)*1)) # type: ignore +CINDEX_VERSION = CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR) +CINDEX_VERSION_STRINGIZE = lambda major,minor: CINDEX_VERSION_STRINGIZE_(major, minor) # type: ignore \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/libusb.py b/artifacts/package_runtime/tinygrad/runtime/autogen/libusb.py new file mode 100644 index 000000000..463aefa61 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/libusb.py @@ -0,0 +1,490 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +dll = c.DLL('libusb', 'usb-1.0') +enum_libusb_class_code: dict[int, str] = {(LIBUSB_CLASS_PER_INTERFACE:=0): 'LIBUSB_CLASS_PER_INTERFACE', (LIBUSB_CLASS_AUDIO:=1): 'LIBUSB_CLASS_AUDIO', (LIBUSB_CLASS_COMM:=2): 'LIBUSB_CLASS_COMM', (LIBUSB_CLASS_HID:=3): 'LIBUSB_CLASS_HID', (LIBUSB_CLASS_PHYSICAL:=5): 'LIBUSB_CLASS_PHYSICAL', (LIBUSB_CLASS_IMAGE:=6): 'LIBUSB_CLASS_IMAGE', (LIBUSB_CLASS_PTP:=6): 'LIBUSB_CLASS_PTP', (LIBUSB_CLASS_PRINTER:=7): 'LIBUSB_CLASS_PRINTER', (LIBUSB_CLASS_MASS_STORAGE:=8): 'LIBUSB_CLASS_MASS_STORAGE', (LIBUSB_CLASS_HUB:=9): 'LIBUSB_CLASS_HUB', (LIBUSB_CLASS_DATA:=10): 'LIBUSB_CLASS_DATA', (LIBUSB_CLASS_SMART_CARD:=11): 'LIBUSB_CLASS_SMART_CARD', (LIBUSB_CLASS_CONTENT_SECURITY:=13): 'LIBUSB_CLASS_CONTENT_SECURITY', (LIBUSB_CLASS_VIDEO:=14): 'LIBUSB_CLASS_VIDEO', (LIBUSB_CLASS_PERSONAL_HEALTHCARE:=15): 'LIBUSB_CLASS_PERSONAL_HEALTHCARE', (LIBUSB_CLASS_DIAGNOSTIC_DEVICE:=220): 'LIBUSB_CLASS_DIAGNOSTIC_DEVICE', (LIBUSB_CLASS_WIRELESS:=224): 'LIBUSB_CLASS_WIRELESS', (LIBUSB_CLASS_MISCELLANEOUS:=239): 'LIBUSB_CLASS_MISCELLANEOUS', (LIBUSB_CLASS_APPLICATION:=254): 'LIBUSB_CLASS_APPLICATION', (LIBUSB_CLASS_VENDOR_SPEC:=255): 'LIBUSB_CLASS_VENDOR_SPEC'} +enum_libusb_descriptor_type: dict[int, str] = {(LIBUSB_DT_DEVICE:=1): 'LIBUSB_DT_DEVICE', (LIBUSB_DT_CONFIG:=2): 'LIBUSB_DT_CONFIG', (LIBUSB_DT_STRING:=3): 'LIBUSB_DT_STRING', (LIBUSB_DT_INTERFACE:=4): 'LIBUSB_DT_INTERFACE', (LIBUSB_DT_ENDPOINT:=5): 'LIBUSB_DT_ENDPOINT', (LIBUSB_DT_INTERFACE_ASSOCIATION:=11): 'LIBUSB_DT_INTERFACE_ASSOCIATION', (LIBUSB_DT_BOS:=15): 'LIBUSB_DT_BOS', (LIBUSB_DT_DEVICE_CAPABILITY:=16): 'LIBUSB_DT_DEVICE_CAPABILITY', (LIBUSB_DT_HID:=33): 'LIBUSB_DT_HID', (LIBUSB_DT_REPORT:=34): 'LIBUSB_DT_REPORT', (LIBUSB_DT_PHYSICAL:=35): 'LIBUSB_DT_PHYSICAL', (LIBUSB_DT_HUB:=41): 'LIBUSB_DT_HUB', (LIBUSB_DT_SUPERSPEED_HUB:=42): 'LIBUSB_DT_SUPERSPEED_HUB', (LIBUSB_DT_SS_ENDPOINT_COMPANION:=48): 'LIBUSB_DT_SS_ENDPOINT_COMPANION'} +enum_libusb_endpoint_direction: dict[int, str] = {(LIBUSB_ENDPOINT_OUT:=0): 'LIBUSB_ENDPOINT_OUT', (LIBUSB_ENDPOINT_IN:=128): 'LIBUSB_ENDPOINT_IN'} +enum_libusb_endpoint_transfer_type: dict[int, str] = {(LIBUSB_ENDPOINT_TRANSFER_TYPE_CONTROL:=0): 'LIBUSB_ENDPOINT_TRANSFER_TYPE_CONTROL', (LIBUSB_ENDPOINT_TRANSFER_TYPE_ISOCHRONOUS:=1): 'LIBUSB_ENDPOINT_TRANSFER_TYPE_ISOCHRONOUS', (LIBUSB_ENDPOINT_TRANSFER_TYPE_BULK:=2): 'LIBUSB_ENDPOINT_TRANSFER_TYPE_BULK', (LIBUSB_ENDPOINT_TRANSFER_TYPE_INTERRUPT:=3): 'LIBUSB_ENDPOINT_TRANSFER_TYPE_INTERRUPT'} +enum_libusb_standard_request: dict[int, str] = {(LIBUSB_REQUEST_GET_STATUS:=0): 'LIBUSB_REQUEST_GET_STATUS', (LIBUSB_REQUEST_CLEAR_FEATURE:=1): 'LIBUSB_REQUEST_CLEAR_FEATURE', (LIBUSB_REQUEST_SET_FEATURE:=3): 'LIBUSB_REQUEST_SET_FEATURE', (LIBUSB_REQUEST_SET_ADDRESS:=5): 'LIBUSB_REQUEST_SET_ADDRESS', (LIBUSB_REQUEST_GET_DESCRIPTOR:=6): 'LIBUSB_REQUEST_GET_DESCRIPTOR', (LIBUSB_REQUEST_SET_DESCRIPTOR:=7): 'LIBUSB_REQUEST_SET_DESCRIPTOR', (LIBUSB_REQUEST_GET_CONFIGURATION:=8): 'LIBUSB_REQUEST_GET_CONFIGURATION', (LIBUSB_REQUEST_SET_CONFIGURATION:=9): 'LIBUSB_REQUEST_SET_CONFIGURATION', (LIBUSB_REQUEST_GET_INTERFACE:=10): 'LIBUSB_REQUEST_GET_INTERFACE', (LIBUSB_REQUEST_SET_INTERFACE:=11): 'LIBUSB_REQUEST_SET_INTERFACE', (LIBUSB_REQUEST_SYNCH_FRAME:=12): 'LIBUSB_REQUEST_SYNCH_FRAME', (LIBUSB_REQUEST_SET_SEL:=48): 'LIBUSB_REQUEST_SET_SEL', (LIBUSB_SET_ISOCH_DELAY:=49): 'LIBUSB_SET_ISOCH_DELAY'} +enum_libusb_request_type: dict[int, str] = {(LIBUSB_REQUEST_TYPE_STANDARD:=0): 'LIBUSB_REQUEST_TYPE_STANDARD', (LIBUSB_REQUEST_TYPE_CLASS:=32): 'LIBUSB_REQUEST_TYPE_CLASS', (LIBUSB_REQUEST_TYPE_VENDOR:=64): 'LIBUSB_REQUEST_TYPE_VENDOR', (LIBUSB_REQUEST_TYPE_RESERVED:=96): 'LIBUSB_REQUEST_TYPE_RESERVED'} +enum_libusb_request_recipient: dict[int, str] = {(LIBUSB_RECIPIENT_DEVICE:=0): 'LIBUSB_RECIPIENT_DEVICE', (LIBUSB_RECIPIENT_INTERFACE:=1): 'LIBUSB_RECIPIENT_INTERFACE', (LIBUSB_RECIPIENT_ENDPOINT:=2): 'LIBUSB_RECIPIENT_ENDPOINT', (LIBUSB_RECIPIENT_OTHER:=3): 'LIBUSB_RECIPIENT_OTHER'} +enum_libusb_iso_sync_type: dict[int, str] = {(LIBUSB_ISO_SYNC_TYPE_NONE:=0): 'LIBUSB_ISO_SYNC_TYPE_NONE', (LIBUSB_ISO_SYNC_TYPE_ASYNC:=1): 'LIBUSB_ISO_SYNC_TYPE_ASYNC', (LIBUSB_ISO_SYNC_TYPE_ADAPTIVE:=2): 'LIBUSB_ISO_SYNC_TYPE_ADAPTIVE', (LIBUSB_ISO_SYNC_TYPE_SYNC:=3): 'LIBUSB_ISO_SYNC_TYPE_SYNC'} +enum_libusb_iso_usage_type: dict[int, str] = {(LIBUSB_ISO_USAGE_TYPE_DATA:=0): 'LIBUSB_ISO_USAGE_TYPE_DATA', (LIBUSB_ISO_USAGE_TYPE_FEEDBACK:=1): 'LIBUSB_ISO_USAGE_TYPE_FEEDBACK', (LIBUSB_ISO_USAGE_TYPE_IMPLICIT:=2): 'LIBUSB_ISO_USAGE_TYPE_IMPLICIT'} +enum_libusb_supported_speed: dict[int, str] = {(LIBUSB_LOW_SPEED_OPERATION:=1): 'LIBUSB_LOW_SPEED_OPERATION', (LIBUSB_FULL_SPEED_OPERATION:=2): 'LIBUSB_FULL_SPEED_OPERATION', (LIBUSB_HIGH_SPEED_OPERATION:=4): 'LIBUSB_HIGH_SPEED_OPERATION', (LIBUSB_SUPER_SPEED_OPERATION:=8): 'LIBUSB_SUPER_SPEED_OPERATION'} +enum_libusb_usb_2_0_extension_attributes: dict[int, str] = {(LIBUSB_BM_LPM_SUPPORT:=2): 'LIBUSB_BM_LPM_SUPPORT'} +enum_libusb_ss_usb_device_capability_attributes: dict[int, str] = {(LIBUSB_BM_LTM_SUPPORT:=2): 'LIBUSB_BM_LTM_SUPPORT'} +enum_libusb_bos_type: dict[int, str] = {(LIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY:=1): 'LIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY', (LIBUSB_BT_USB_2_0_EXTENSION:=2): 'LIBUSB_BT_USB_2_0_EXTENSION', (LIBUSB_BT_SS_USB_DEVICE_CAPABILITY:=3): 'LIBUSB_BT_SS_USB_DEVICE_CAPABILITY', (LIBUSB_BT_CONTAINER_ID:=4): 'LIBUSB_BT_CONTAINER_ID', (LIBUSB_BT_PLATFORM_DESCRIPTOR:=5): 'LIBUSB_BT_PLATFORM_DESCRIPTOR'} +@c.record +class struct_libusb_device_descriptor(c.Struct): + SIZE = 18 + bLength: int + bDescriptorType: int + bcdUSB: int + bDeviceClass: int + bDeviceSubClass: int + bDeviceProtocol: int + bMaxPacketSize0: int + idVendor: int + idProduct: int + bcdDevice: int + iManufacturer: int + iProduct: int + iSerialNumber: int + bNumConfigurations: int +uint8_t: TypeAlias = ctypes.c_ubyte +uint16_t: TypeAlias = ctypes.c_uint16 +struct_libusb_device_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bcdUSB', uint16_t, 2), ('bDeviceClass', uint8_t, 4), ('bDeviceSubClass', uint8_t, 5), ('bDeviceProtocol', uint8_t, 6), ('bMaxPacketSize0', uint8_t, 7), ('idVendor', uint16_t, 8), ('idProduct', uint16_t, 10), ('bcdDevice', uint16_t, 12), ('iManufacturer', uint8_t, 14), ('iProduct', uint8_t, 15), ('iSerialNumber', uint8_t, 16), ('bNumConfigurations', uint8_t, 17)]) +@c.record +class struct_libusb_endpoint_descriptor(c.Struct): + SIZE = 32 + bLength: int + bDescriptorType: int + bEndpointAddress: int + bmAttributes: int + wMaxPacketSize: int + bInterval: int + bRefresh: int + bSynchAddress: int + extra: c.POINTER[ctypes.c_ubyte] + extra_length: int +struct_libusb_endpoint_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bEndpointAddress', uint8_t, 2), ('bmAttributes', uint8_t, 3), ('wMaxPacketSize', uint16_t, 4), ('bInterval', uint8_t, 6), ('bRefresh', uint8_t, 7), ('bSynchAddress', uint8_t, 8), ('extra', c.POINTER[ctypes.c_ubyte], 16), ('extra_length', ctypes.c_int32, 24)]) +@c.record +class struct_libusb_interface_association_descriptor(c.Struct): + SIZE = 8 + bLength: int + bDescriptorType: int + bFirstInterface: int + bInterfaceCount: int + bFunctionClass: int + bFunctionSubClass: int + bFunctionProtocol: int + iFunction: int +struct_libusb_interface_association_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bFirstInterface', uint8_t, 2), ('bInterfaceCount', uint8_t, 3), ('bFunctionClass', uint8_t, 4), ('bFunctionSubClass', uint8_t, 5), ('bFunctionProtocol', uint8_t, 6), ('iFunction', uint8_t, 7)]) +@c.record +class struct_libusb_interface_association_descriptor_array(c.Struct): + SIZE = 16 + iad: c.POINTER[struct_libusb_interface_association_descriptor] + length: int +struct_libusb_interface_association_descriptor_array.register_fields([('iad', c.POINTER[struct_libusb_interface_association_descriptor], 0), ('length', ctypes.c_int32, 8)]) +@c.record +class struct_libusb_interface_descriptor(c.Struct): + SIZE = 40 + bLength: int + bDescriptorType: int + bInterfaceNumber: int + bAlternateSetting: int + bNumEndpoints: int + bInterfaceClass: int + bInterfaceSubClass: int + bInterfaceProtocol: int + iInterface: int + endpoint: c.POINTER[struct_libusb_endpoint_descriptor] + extra: c.POINTER[ctypes.c_ubyte] + extra_length: int +struct_libusb_interface_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bInterfaceNumber', uint8_t, 2), ('bAlternateSetting', uint8_t, 3), ('bNumEndpoints', uint8_t, 4), ('bInterfaceClass', uint8_t, 5), ('bInterfaceSubClass', uint8_t, 6), ('bInterfaceProtocol', uint8_t, 7), ('iInterface', uint8_t, 8), ('endpoint', c.POINTER[struct_libusb_endpoint_descriptor], 16), ('extra', c.POINTER[ctypes.c_ubyte], 24), ('extra_length', ctypes.c_int32, 32)]) +@c.record +class struct_libusb_interface(c.Struct): + SIZE = 16 + altsetting: c.POINTER[struct_libusb_interface_descriptor] + num_altsetting: int +struct_libusb_interface.register_fields([('altsetting', c.POINTER[struct_libusb_interface_descriptor], 0), ('num_altsetting', ctypes.c_int32, 8)]) +@c.record +class struct_libusb_config_descriptor(c.Struct): + SIZE = 40 + bLength: int + bDescriptorType: int + wTotalLength: int + bNumInterfaces: int + bConfigurationValue: int + iConfiguration: int + bmAttributes: int + MaxPower: int + interface: c.POINTER[struct_libusb_interface] + extra: c.POINTER[ctypes.c_ubyte] + extra_length: int +struct_libusb_config_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('wTotalLength', uint16_t, 2), ('bNumInterfaces', uint8_t, 4), ('bConfigurationValue', uint8_t, 5), ('iConfiguration', uint8_t, 6), ('bmAttributes', uint8_t, 7), ('MaxPower', uint8_t, 8), ('interface', c.POINTER[struct_libusb_interface], 16), ('extra', c.POINTER[ctypes.c_ubyte], 24), ('extra_length', ctypes.c_int32, 32)]) +@c.record +class struct_libusb_ss_endpoint_companion_descriptor(c.Struct): + SIZE = 6 + bLength: int + bDescriptorType: int + bMaxBurst: int + bmAttributes: int + wBytesPerInterval: int +struct_libusb_ss_endpoint_companion_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bMaxBurst', uint8_t, 2), ('bmAttributes', uint8_t, 3), ('wBytesPerInterval', uint16_t, 4)]) +@c.record +class struct_libusb_bos_dev_capability_descriptor(c.Struct): + SIZE = 3 + bLength: int + bDescriptorType: int + bDevCapabilityType: int + dev_capability_data: c.Array[ctypes.c_ubyte, Literal[0]] +struct_libusb_bos_dev_capability_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bDevCapabilityType', uint8_t, 2), ('dev_capability_data', c.Array[uint8_t, Literal[0]], 3)]) +@c.record +class struct_libusb_bos_descriptor(c.Struct): + SIZE = 8 + bLength: int + bDescriptorType: int + wTotalLength: int + bNumDeviceCaps: int + dev_capability: c.Array[c.POINTER[struct_libusb_bos_dev_capability_descriptor], Literal[0]] +struct_libusb_bos_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('wTotalLength', uint16_t, 2), ('bNumDeviceCaps', uint8_t, 4), ('dev_capability', c.Array[c.POINTER[struct_libusb_bos_dev_capability_descriptor], Literal[0]], 8)]) +@c.record +class struct_libusb_usb_2_0_extension_descriptor(c.Struct): + SIZE = 8 + bLength: int + bDescriptorType: int + bDevCapabilityType: int + bmAttributes: int +uint32_t: TypeAlias = ctypes.c_uint32 +struct_libusb_usb_2_0_extension_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bDevCapabilityType', uint8_t, 2), ('bmAttributes', uint32_t, 4)]) +@c.record +class struct_libusb_ss_usb_device_capability_descriptor(c.Struct): + SIZE = 10 + bLength: int + bDescriptorType: int + bDevCapabilityType: int + bmAttributes: int + wSpeedSupported: int + bFunctionalitySupport: int + bU1DevExitLat: int + bU2DevExitLat: int +struct_libusb_ss_usb_device_capability_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bDevCapabilityType', uint8_t, 2), ('bmAttributes', uint8_t, 3), ('wSpeedSupported', uint16_t, 4), ('bFunctionalitySupport', uint8_t, 6), ('bU1DevExitLat', uint8_t, 7), ('bU2DevExitLat', uint16_t, 8)]) +@c.record +class struct_libusb_container_id_descriptor(c.Struct): + SIZE = 20 + bLength: int + bDescriptorType: int + bDevCapabilityType: int + bReserved: int + ContainerID: c.Array[ctypes.c_ubyte, Literal[16]] +struct_libusb_container_id_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bDevCapabilityType', uint8_t, 2), ('bReserved', uint8_t, 3), ('ContainerID', c.Array[uint8_t, Literal[16]], 4)]) +@c.record +class struct_libusb_platform_descriptor(c.Struct): + SIZE = 20 + bLength: int + bDescriptorType: int + bDevCapabilityType: int + bReserved: int + PlatformCapabilityUUID: c.Array[ctypes.c_ubyte, Literal[16]] + CapabilityData: c.Array[ctypes.c_ubyte, Literal[0]] +struct_libusb_platform_descriptor.register_fields([('bLength', uint8_t, 0), ('bDescriptorType', uint8_t, 1), ('bDevCapabilityType', uint8_t, 2), ('bReserved', uint8_t, 3), ('PlatformCapabilityUUID', c.Array[uint8_t, Literal[16]], 4), ('CapabilityData', c.Array[uint8_t, Literal[0]], 20)]) +@c.record +class struct_libusb_control_setup(c.Struct): + SIZE = 8 + bmRequestType: int + bRequest: int + wValue: int + wIndex: int + wLength: int +struct_libusb_control_setup.register_fields([('bmRequestType', uint8_t, 0), ('bRequest', uint8_t, 1), ('wValue', uint16_t, 2), ('wIndex', uint16_t, 4), ('wLength', uint16_t, 6)]) +class struct_libusb_context(c.Struct): pass +class struct_libusb_device(c.Struct): pass +class struct_libusb_device_handle(c.Struct): pass +@c.record +class struct_libusb_version(c.Struct): + SIZE = 24 + major: int + minor: int + micro: int + nano: int + rc: c.POINTER[ctypes.c_char] + describe: c.POINTER[ctypes.c_char] +struct_libusb_version.register_fields([('major', uint16_t, 0), ('minor', uint16_t, 2), ('micro', uint16_t, 4), ('nano', uint16_t, 6), ('rc', c.POINTER[ctypes.c_char], 8), ('describe', c.POINTER[ctypes.c_char], 16)]) +libusb_context: TypeAlias = struct_libusb_context +libusb_device: TypeAlias = struct_libusb_device +libusb_device_handle: TypeAlias = struct_libusb_device_handle +enum_libusb_speed: dict[int, str] = {(LIBUSB_SPEED_UNKNOWN:=0): 'LIBUSB_SPEED_UNKNOWN', (LIBUSB_SPEED_LOW:=1): 'LIBUSB_SPEED_LOW', (LIBUSB_SPEED_FULL:=2): 'LIBUSB_SPEED_FULL', (LIBUSB_SPEED_HIGH:=3): 'LIBUSB_SPEED_HIGH', (LIBUSB_SPEED_SUPER:=4): 'LIBUSB_SPEED_SUPER', (LIBUSB_SPEED_SUPER_PLUS:=5): 'LIBUSB_SPEED_SUPER_PLUS'} +enum_libusb_error: dict[int, str] = {(LIBUSB_SUCCESS:=0): 'LIBUSB_SUCCESS', (LIBUSB_ERROR_IO:=-1): 'LIBUSB_ERROR_IO', (LIBUSB_ERROR_INVALID_PARAM:=-2): 'LIBUSB_ERROR_INVALID_PARAM', (LIBUSB_ERROR_ACCESS:=-3): 'LIBUSB_ERROR_ACCESS', (LIBUSB_ERROR_NO_DEVICE:=-4): 'LIBUSB_ERROR_NO_DEVICE', (LIBUSB_ERROR_NOT_FOUND:=-5): 'LIBUSB_ERROR_NOT_FOUND', (LIBUSB_ERROR_BUSY:=-6): 'LIBUSB_ERROR_BUSY', (LIBUSB_ERROR_TIMEOUT:=-7): 'LIBUSB_ERROR_TIMEOUT', (LIBUSB_ERROR_OVERFLOW:=-8): 'LIBUSB_ERROR_OVERFLOW', (LIBUSB_ERROR_PIPE:=-9): 'LIBUSB_ERROR_PIPE', (LIBUSB_ERROR_INTERRUPTED:=-10): 'LIBUSB_ERROR_INTERRUPTED', (LIBUSB_ERROR_NO_MEM:=-11): 'LIBUSB_ERROR_NO_MEM', (LIBUSB_ERROR_NOT_SUPPORTED:=-12): 'LIBUSB_ERROR_NOT_SUPPORTED', (LIBUSB_ERROR_OTHER:=-99): 'LIBUSB_ERROR_OTHER'} +enum_libusb_transfer_type: dict[int, str] = {(LIBUSB_TRANSFER_TYPE_CONTROL:=0): 'LIBUSB_TRANSFER_TYPE_CONTROL', (LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:=1): 'LIBUSB_TRANSFER_TYPE_ISOCHRONOUS', (LIBUSB_TRANSFER_TYPE_BULK:=2): 'LIBUSB_TRANSFER_TYPE_BULK', (LIBUSB_TRANSFER_TYPE_INTERRUPT:=3): 'LIBUSB_TRANSFER_TYPE_INTERRUPT', (LIBUSB_TRANSFER_TYPE_BULK_STREAM:=4): 'LIBUSB_TRANSFER_TYPE_BULK_STREAM'} +enum_libusb_transfer_status: dict[int, str] = {(LIBUSB_TRANSFER_COMPLETED:=0): 'LIBUSB_TRANSFER_COMPLETED', (LIBUSB_TRANSFER_ERROR:=1): 'LIBUSB_TRANSFER_ERROR', (LIBUSB_TRANSFER_TIMED_OUT:=2): 'LIBUSB_TRANSFER_TIMED_OUT', (LIBUSB_TRANSFER_CANCELLED:=3): 'LIBUSB_TRANSFER_CANCELLED', (LIBUSB_TRANSFER_STALL:=4): 'LIBUSB_TRANSFER_STALL', (LIBUSB_TRANSFER_NO_DEVICE:=5): 'LIBUSB_TRANSFER_NO_DEVICE', (LIBUSB_TRANSFER_OVERFLOW:=6): 'LIBUSB_TRANSFER_OVERFLOW'} +enum_libusb_transfer_flags: dict[int, str] = {(LIBUSB_TRANSFER_SHORT_NOT_OK:=1): 'LIBUSB_TRANSFER_SHORT_NOT_OK', (LIBUSB_TRANSFER_FREE_BUFFER:=2): 'LIBUSB_TRANSFER_FREE_BUFFER', (LIBUSB_TRANSFER_FREE_TRANSFER:=4): 'LIBUSB_TRANSFER_FREE_TRANSFER', (LIBUSB_TRANSFER_ADD_ZERO_PACKET:=8): 'LIBUSB_TRANSFER_ADD_ZERO_PACKET'} +@c.record +class struct_libusb_iso_packet_descriptor(c.Struct): + SIZE = 12 + length: int + actual_length: int + status: int +struct_libusb_iso_packet_descriptor.register_fields([('length', ctypes.c_uint32, 0), ('actual_length', ctypes.c_uint32, 4), ('status', ctypes.c_uint32, 8)]) +@c.record +class struct_libusb_transfer(c.Struct): + SIZE = 64 + dev_handle: c.POINTER[struct_libusb_device_handle] + flags: int + endpoint: int + type: int + timeout: int + status: int + length: int + actual_length: int + callback: c.CFUNCTYPE[None, [c.POINTER[struct_libusb_transfer]]] + user_data: ctypes.c_void_p + buffer: c.POINTER[ctypes.c_ubyte] + num_iso_packets: int + iso_packet_desc: c.Array[struct_libusb_iso_packet_descriptor, Literal[0]] +libusb_transfer_cb_fn: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_libusb_transfer]]] +struct_libusb_transfer.register_fields([('dev_handle', c.POINTER[libusb_device_handle], 0), ('flags', uint8_t, 8), ('endpoint', ctypes.c_ubyte, 9), ('type', ctypes.c_ubyte, 10), ('timeout', ctypes.c_uint32, 12), ('status', ctypes.c_uint32, 16), ('length', ctypes.c_int32, 20), ('actual_length', ctypes.c_int32, 24), ('callback', libusb_transfer_cb_fn, 32), ('user_data', ctypes.c_void_p, 40), ('buffer', c.POINTER[ctypes.c_ubyte], 48), ('num_iso_packets', ctypes.c_int32, 56), ('iso_packet_desc', c.Array[struct_libusb_iso_packet_descriptor, Literal[0]], 60)]) +enum_libusb_capability: dict[int, str] = {(LIBUSB_CAP_HAS_CAPABILITY:=0): 'LIBUSB_CAP_HAS_CAPABILITY', (LIBUSB_CAP_HAS_HOTPLUG:=1): 'LIBUSB_CAP_HAS_HOTPLUG', (LIBUSB_CAP_HAS_HID_ACCESS:=256): 'LIBUSB_CAP_HAS_HID_ACCESS', (LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER:=257): 'LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER'} +enum_libusb_log_level: dict[int, str] = {(LIBUSB_LOG_LEVEL_NONE:=0): 'LIBUSB_LOG_LEVEL_NONE', (LIBUSB_LOG_LEVEL_ERROR:=1): 'LIBUSB_LOG_LEVEL_ERROR', (LIBUSB_LOG_LEVEL_WARNING:=2): 'LIBUSB_LOG_LEVEL_WARNING', (LIBUSB_LOG_LEVEL_INFO:=3): 'LIBUSB_LOG_LEVEL_INFO', (LIBUSB_LOG_LEVEL_DEBUG:=4): 'LIBUSB_LOG_LEVEL_DEBUG'} +enum_libusb_log_cb_mode: dict[int, str] = {(LIBUSB_LOG_CB_GLOBAL:=1): 'LIBUSB_LOG_CB_GLOBAL', (LIBUSB_LOG_CB_CONTEXT:=2): 'LIBUSB_LOG_CB_CONTEXT'} +enum_libusb_option: dict[int, str] = {(LIBUSB_OPTION_LOG_LEVEL:=0): 'LIBUSB_OPTION_LOG_LEVEL', (LIBUSB_OPTION_USE_USBDK:=1): 'LIBUSB_OPTION_USE_USBDK', (LIBUSB_OPTION_NO_DEVICE_DISCOVERY:=2): 'LIBUSB_OPTION_NO_DEVICE_DISCOVERY', (LIBUSB_OPTION_LOG_CB:=3): 'LIBUSB_OPTION_LOG_CB', (LIBUSB_OPTION_MAX:=4): 'LIBUSB_OPTION_MAX'} +libusb_log_cb: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_libusb_context], ctypes.c_uint32, c.POINTER[ctypes.c_char]]] +@c.record +class struct_libusb_init_option(c.Struct): + SIZE = 16 + option: int + value: struct_libusb_init_option_value +@c.record +class struct_libusb_init_option_value(c.Struct): + SIZE = 8 + ival: int + log_cbval: c.CFUNCTYPE[None, [c.POINTER[struct_libusb_context], ctypes.c_uint32, c.POINTER[ctypes.c_char]]] +struct_libusb_init_option_value.register_fields([('ival', ctypes.c_int32, 0), ('log_cbval', libusb_log_cb, 0)]) +struct_libusb_init_option.register_fields([('option', ctypes.c_uint32, 0), ('value', struct_libusb_init_option_value, 8)]) +@dll.bind(ctypes.c_int32, c.POINTER[c.POINTER[libusb_context]]) +def libusb_init(ctx:c.POINTER[c.POINTER[libusb_context]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[c.POINTER[libusb_context]], c.Array[struct_libusb_init_option, Literal[0]], ctypes.c_int32) +def libusb_init_context(ctx:c.POINTER[c.POINTER[libusb_context]], options:c.Array[struct_libusb_init_option, Literal[0]], num_options:int) -> int: ... +@dll.bind(None, c.POINTER[libusb_context]) +def libusb_exit(ctx:c.POINTER[libusb_context]) -> None: ... +@dll.bind(None, c.POINTER[libusb_context], ctypes.c_int32) +def libusb_set_debug(ctx:c.POINTER[libusb_context], level:int) -> None: ... +@dll.bind(None, c.POINTER[libusb_context], libusb_log_cb, ctypes.c_int32) +def libusb_set_log_cb(ctx:c.POINTER[libusb_context], cb:libusb_log_cb, mode:int) -> None: ... +@dll.bind(c.POINTER[struct_libusb_version]) +def libusb_get_version() -> c.POINTER[struct_libusb_version]: ... +@dll.bind(ctypes.c_int32, uint32_t) +def libusb_has_capability(capability:uint32_t) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def libusb_error_name(errcode:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_int32, c.POINTER[ctypes.c_char]) +def libusb_setlocale(locale:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_int32) +def libusb_strerror(errcode:int) -> c.POINTER[ctypes.c_char]: ... +ssize_t: TypeAlias = ctypes.c_int64 +@dll.bind(ssize_t, c.POINTER[libusb_context], c.POINTER[c.POINTER[c.POINTER[libusb_device]]]) +def libusb_get_device_list(ctx:c.POINTER[libusb_context], list:c.POINTER[c.POINTER[c.POINTER[libusb_device]]]) -> ssize_t: ... +@dll.bind(None, c.POINTER[c.POINTER[libusb_device]], ctypes.c_int32) +def libusb_free_device_list(list:c.POINTER[c.POINTER[libusb_device]], unref_devices:int) -> None: ... +@dll.bind(c.POINTER[libusb_device], c.POINTER[libusb_device]) +def libusb_ref_device(dev:c.POINTER[libusb_device]) -> c.POINTER[libusb_device]: ... +@dll.bind(None, c.POINTER[libusb_device]) +def libusb_unref_device(dev:c.POINTER[libusb_device]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], c.POINTER[ctypes.c_int32]) +def libusb_get_configuration(dev:c.POINTER[libusb_device_handle], config:c.POINTER[ctypes.c_int32]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], c.POINTER[struct_libusb_device_descriptor]) +def libusb_get_device_descriptor(dev:c.POINTER[libusb_device], desc:c.POINTER[struct_libusb_device_descriptor]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], c.POINTER[c.POINTER[struct_libusb_config_descriptor]]) +def libusb_get_active_config_descriptor(dev:c.POINTER[libusb_device], config:c.POINTER[c.POINTER[struct_libusb_config_descriptor]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], uint8_t, c.POINTER[c.POINTER[struct_libusb_config_descriptor]]) +def libusb_get_config_descriptor(dev:c.POINTER[libusb_device], config_index:uint8_t, config:c.POINTER[c.POINTER[struct_libusb_config_descriptor]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], uint8_t, c.POINTER[c.POINTER[struct_libusb_config_descriptor]]) +def libusb_get_config_descriptor_by_value(dev:c.POINTER[libusb_device], bConfigurationValue:uint8_t, config:c.POINTER[c.POINTER[struct_libusb_config_descriptor]]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_config_descriptor]) +def libusb_free_config_descriptor(config:c.POINTER[struct_libusb_config_descriptor]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_libusb_endpoint_descriptor], c.POINTER[c.POINTER[struct_libusb_ss_endpoint_companion_descriptor]]) +def libusb_get_ss_endpoint_companion_descriptor(ctx:c.POINTER[libusb_context], endpoint:c.POINTER[struct_libusb_endpoint_descriptor], ep_comp:c.POINTER[c.POINTER[struct_libusb_ss_endpoint_companion_descriptor]]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_ss_endpoint_companion_descriptor]) +def libusb_free_ss_endpoint_companion_descriptor(ep_comp:c.POINTER[struct_libusb_ss_endpoint_companion_descriptor]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], c.POINTER[c.POINTER[struct_libusb_bos_descriptor]]) +def libusb_get_bos_descriptor(dev_handle:c.POINTER[libusb_device_handle], bos:c.POINTER[c.POINTER[struct_libusb_bos_descriptor]]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_bos_descriptor]) +def libusb_free_bos_descriptor(bos:c.POINTER[struct_libusb_bos_descriptor]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_libusb_bos_dev_capability_descriptor], c.POINTER[c.POINTER[struct_libusb_usb_2_0_extension_descriptor]]) +def libusb_get_usb_2_0_extension_descriptor(ctx:c.POINTER[libusb_context], dev_cap:c.POINTER[struct_libusb_bos_dev_capability_descriptor], usb_2_0_extension:c.POINTER[c.POINTER[struct_libusb_usb_2_0_extension_descriptor]]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_usb_2_0_extension_descriptor]) +def libusb_free_usb_2_0_extension_descriptor(usb_2_0_extension:c.POINTER[struct_libusb_usb_2_0_extension_descriptor]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_libusb_bos_dev_capability_descriptor], c.POINTER[c.POINTER[struct_libusb_ss_usb_device_capability_descriptor]]) +def libusb_get_ss_usb_device_capability_descriptor(ctx:c.POINTER[libusb_context], dev_cap:c.POINTER[struct_libusb_bos_dev_capability_descriptor], ss_usb_device_cap:c.POINTER[c.POINTER[struct_libusb_ss_usb_device_capability_descriptor]]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_ss_usb_device_capability_descriptor]) +def libusb_free_ss_usb_device_capability_descriptor(ss_usb_device_cap:c.POINTER[struct_libusb_ss_usb_device_capability_descriptor]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_libusb_bos_dev_capability_descriptor], c.POINTER[c.POINTER[struct_libusb_container_id_descriptor]]) +def libusb_get_container_id_descriptor(ctx:c.POINTER[libusb_context], dev_cap:c.POINTER[struct_libusb_bos_dev_capability_descriptor], container_id:c.POINTER[c.POINTER[struct_libusb_container_id_descriptor]]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_container_id_descriptor]) +def libusb_free_container_id_descriptor(container_id:c.POINTER[struct_libusb_container_id_descriptor]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_libusb_bos_dev_capability_descriptor], c.POINTER[c.POINTER[struct_libusb_platform_descriptor]]) +def libusb_get_platform_descriptor(ctx:c.POINTER[libusb_context], dev_cap:c.POINTER[struct_libusb_bos_dev_capability_descriptor], platform_descriptor:c.POINTER[c.POINTER[struct_libusb_platform_descriptor]]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_platform_descriptor]) +def libusb_free_platform_descriptor(platform_descriptor:c.POINTER[struct_libusb_platform_descriptor]) -> None: ... +@dll.bind(uint8_t, c.POINTER[libusb_device]) +def libusb_get_bus_number(dev:c.POINTER[libusb_device]) -> uint8_t: ... +@dll.bind(uint8_t, c.POINTER[libusb_device]) +def libusb_get_port_number(dev:c.POINTER[libusb_device]) -> uint8_t: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], c.POINTER[uint8_t], ctypes.c_int32) +def libusb_get_port_numbers(dev:c.POINTER[libusb_device], port_numbers:c.POINTER[uint8_t], port_numbers_len:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[libusb_device], c.POINTER[uint8_t], uint8_t) +def libusb_get_port_path(ctx:c.POINTER[libusb_context], dev:c.POINTER[libusb_device], path:c.POINTER[uint8_t], path_length:uint8_t) -> int: ... +@dll.bind(c.POINTER[libusb_device], c.POINTER[libusb_device]) +def libusb_get_parent(dev:c.POINTER[libusb_device]) -> c.POINTER[libusb_device]: ... +@dll.bind(uint8_t, c.POINTER[libusb_device]) +def libusb_get_device_address(dev:c.POINTER[libusb_device]) -> uint8_t: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device]) +def libusb_get_device_speed(dev:c.POINTER[libusb_device]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], ctypes.c_ubyte) +def libusb_get_max_packet_size(dev:c.POINTER[libusb_device], endpoint:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], ctypes.c_ubyte) +def libusb_get_max_iso_packet_size(dev:c.POINTER[libusb_device], endpoint:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], ctypes.c_int32, ctypes.c_int32, ctypes.c_ubyte) +def libusb_get_max_alt_packet_size(dev:c.POINTER[libusb_device], interface_number:int, alternate_setting:int, endpoint:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], uint8_t, c.POINTER[c.POINTER[struct_libusb_interface_association_descriptor_array]]) +def libusb_get_interface_association_descriptors(dev:c.POINTER[libusb_device], config_index:uint8_t, iad_array:c.POINTER[c.POINTER[struct_libusb_interface_association_descriptor_array]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], c.POINTER[c.POINTER[struct_libusb_interface_association_descriptor_array]]) +def libusb_get_active_interface_association_descriptors(dev:c.POINTER[libusb_device], iad_array:c.POINTER[c.POINTER[struct_libusb_interface_association_descriptor_array]]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_interface_association_descriptor_array]) +def libusb_free_interface_association_descriptors(iad_array:c.POINTER[struct_libusb_interface_association_descriptor_array]) -> None: ... +intptr_t: TypeAlias = ctypes.c_int64 +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], intptr_t, c.POINTER[c.POINTER[libusb_device_handle]]) +def libusb_wrap_sys_device(ctx:c.POINTER[libusb_context], sys_dev:intptr_t, dev_handle:c.POINTER[c.POINTER[libusb_device_handle]]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device], c.POINTER[c.POINTER[libusb_device_handle]]) +def libusb_open(dev:c.POINTER[libusb_device], dev_handle:c.POINTER[c.POINTER[libusb_device_handle]]) -> int: ... +@dll.bind(None, c.POINTER[libusb_device_handle]) +def libusb_close(dev_handle:c.POINTER[libusb_device_handle]) -> None: ... +@dll.bind(c.POINTER[libusb_device], c.POINTER[libusb_device_handle]) +def libusb_get_device(dev_handle:c.POINTER[libusb_device_handle]) -> c.POINTER[libusb_device]: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_int32) +def libusb_set_configuration(dev_handle:c.POINTER[libusb_device_handle], configuration:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_int32) +def libusb_claim_interface(dev_handle:c.POINTER[libusb_device_handle], interface_number:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_int32) +def libusb_release_interface(dev_handle:c.POINTER[libusb_device_handle], interface_number:int) -> int: ... +@dll.bind(c.POINTER[libusb_device_handle], c.POINTER[libusb_context], uint16_t, uint16_t) +def libusb_open_device_with_vid_pid(ctx:c.POINTER[libusb_context], vendor_id:uint16_t, product_id:uint16_t) -> c.POINTER[libusb_device_handle]: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_int32, ctypes.c_int32) +def libusb_set_interface_alt_setting(dev_handle:c.POINTER[libusb_device_handle], interface_number:int, alternate_setting:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_ubyte) +def libusb_clear_halt(dev_handle:c.POINTER[libusb_device_handle], endpoint:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle]) +def libusb_reset_device(dev_handle:c.POINTER[libusb_device_handle]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], uint32_t, c.POINTER[ctypes.c_ubyte], ctypes.c_int32) +def libusb_alloc_streams(dev_handle:c.POINTER[libusb_device_handle], num_streams:uint32_t, endpoints:c.POINTER[ctypes.c_ubyte], num_endpoints:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], c.POINTER[ctypes.c_ubyte], ctypes.c_int32) +def libusb_free_streams(dev_handle:c.POINTER[libusb_device_handle], endpoints:c.POINTER[ctypes.c_ubyte], num_endpoints:int) -> int: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(c.POINTER[ctypes.c_ubyte], c.POINTER[libusb_device_handle], size_t) +def libusb_dev_mem_alloc(dev_handle:c.POINTER[libusb_device_handle], length:size_t) -> c.POINTER[ctypes.c_ubyte]: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], c.POINTER[ctypes.c_ubyte], size_t) +def libusb_dev_mem_free(dev_handle:c.POINTER[libusb_device_handle], buffer:c.POINTER[ctypes.c_ubyte], length:size_t) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_int32) +def libusb_kernel_driver_active(dev_handle:c.POINTER[libusb_device_handle], interface_number:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_int32) +def libusb_detach_kernel_driver(dev_handle:c.POINTER[libusb_device_handle], interface_number:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_int32) +def libusb_attach_kernel_driver(dev_handle:c.POINTER[libusb_device_handle], interface_number:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_int32) +def libusb_set_auto_detach_kernel_driver(dev_handle:c.POINTER[libusb_device_handle], enable:int) -> int: ... +@dll.bind(c.POINTER[struct_libusb_transfer], ctypes.c_int32) +def libusb_alloc_transfer(iso_packets:int) -> c.POINTER[struct_libusb_transfer]: ... +@dll.bind(ctypes.c_int32, c.POINTER[struct_libusb_transfer]) +def libusb_submit_transfer(transfer:c.POINTER[struct_libusb_transfer]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[struct_libusb_transfer]) +def libusb_cancel_transfer(transfer:c.POINTER[struct_libusb_transfer]) -> int: ... +@dll.bind(None, c.POINTER[struct_libusb_transfer]) +def libusb_free_transfer(transfer:c.POINTER[struct_libusb_transfer]) -> None: ... +@dll.bind(None, c.POINTER[struct_libusb_transfer], uint32_t) +def libusb_transfer_set_stream_id(transfer:c.POINTER[struct_libusb_transfer], stream_id:uint32_t) -> None: ... +@dll.bind(uint32_t, c.POINTER[struct_libusb_transfer]) +def libusb_transfer_get_stream_id(transfer:c.POINTER[struct_libusb_transfer]) -> uint32_t: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], uint8_t, uint8_t, uint16_t, uint16_t, c.POINTER[ctypes.c_ubyte], uint16_t, ctypes.c_uint32) +def libusb_control_transfer(dev_handle:c.POINTER[libusb_device_handle], request_type:uint8_t, bRequest:uint8_t, wValue:uint16_t, wIndex:uint16_t, data:c.POINTER[ctypes.c_ubyte], wLength:uint16_t, timeout:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_ubyte, c.POINTER[ctypes.c_ubyte], ctypes.c_int32, c.POINTER[ctypes.c_int32], ctypes.c_uint32) +def libusb_bulk_transfer(dev_handle:c.POINTER[libusb_device_handle], endpoint:int, data:c.POINTER[ctypes.c_ubyte], length:int, actual_length:c.POINTER[ctypes.c_int32], timeout:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], ctypes.c_ubyte, c.POINTER[ctypes.c_ubyte], ctypes.c_int32, c.POINTER[ctypes.c_int32], ctypes.c_uint32) +def libusb_interrupt_transfer(dev_handle:c.POINTER[libusb_device_handle], endpoint:int, data:c.POINTER[ctypes.c_ubyte], length:int, actual_length:c.POINTER[ctypes.c_int32], timeout:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_device_handle], uint8_t, c.POINTER[ctypes.c_ubyte], ctypes.c_int32) +def libusb_get_string_descriptor_ascii(dev_handle:c.POINTER[libusb_device_handle], desc_index:uint8_t, data:c.POINTER[ctypes.c_ubyte], length:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context]) +def libusb_try_lock_events(ctx:c.POINTER[libusb_context]) -> int: ... +@dll.bind(None, c.POINTER[libusb_context]) +def libusb_lock_events(ctx:c.POINTER[libusb_context]) -> None: ... +@dll.bind(None, c.POINTER[libusb_context]) +def libusb_unlock_events(ctx:c.POINTER[libusb_context]) -> None: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context]) +def libusb_event_handling_ok(ctx:c.POINTER[libusb_context]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context]) +def libusb_event_handler_active(ctx:c.POINTER[libusb_context]) -> int: ... +@dll.bind(None, c.POINTER[libusb_context]) +def libusb_interrupt_event_handler(ctx:c.POINTER[libusb_context]) -> None: ... +@dll.bind(None, c.POINTER[libusb_context]) +def libusb_lock_event_waiters(ctx:c.POINTER[libusb_context]) -> None: ... +@dll.bind(None, c.POINTER[libusb_context]) +def libusb_unlock_event_waiters(ctx:c.POINTER[libusb_context]) -> None: ... +@c.record +class struct_timeval(c.Struct): + SIZE = 16 + tv_sec: int + tv_usec: int +__time_t: TypeAlias = ctypes.c_int64 +__suseconds_t: TypeAlias = ctypes.c_int64 +struct_timeval.register_fields([('tv_sec', ctypes.c_int64, 0), ('tv_usec', ctypes.c_int64, 8)]) +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_timeval]) +def libusb_wait_for_event(ctx:c.POINTER[libusb_context], tv:c.POINTER[struct_timeval]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_timeval]) +def libusb_handle_events_timeout(ctx:c.POINTER[libusb_context], tv:c.POINTER[struct_timeval]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_timeval], c.POINTER[ctypes.c_int32]) +def libusb_handle_events_timeout_completed(ctx:c.POINTER[libusb_context], tv:c.POINTER[struct_timeval], completed:c.POINTER[ctypes.c_int32]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context]) +def libusb_handle_events(ctx:c.POINTER[libusb_context]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[ctypes.c_int32]) +def libusb_handle_events_completed(ctx:c.POINTER[libusb_context], completed:c.POINTER[ctypes.c_int32]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_timeval]) +def libusb_handle_events_locked(ctx:c.POINTER[libusb_context], tv:c.POINTER[struct_timeval]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context]) +def libusb_pollfds_handle_timeouts(ctx:c.POINTER[libusb_context]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], c.POINTER[struct_timeval]) +def libusb_get_next_timeout(ctx:c.POINTER[libusb_context], tv:c.POINTER[struct_timeval]) -> int: ... +@c.record +class struct_libusb_pollfd(c.Struct): + SIZE = 8 + fd: int + events: int +struct_libusb_pollfd.register_fields([('fd', ctypes.c_int32, 0), ('events', ctypes.c_int16, 4)]) +libusb_pollfd_added_cb: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_int32, ctypes.c_int16, ctypes.c_void_p]] +libusb_pollfd_removed_cb: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_int32, ctypes.c_void_p]] +@dll.bind(c.POINTER[c.POINTER[struct_libusb_pollfd]], c.POINTER[libusb_context]) +def libusb_get_pollfds(ctx:c.POINTER[libusb_context]) -> c.POINTER[c.POINTER[struct_libusb_pollfd]]: ... +@dll.bind(None, c.POINTER[c.POINTER[struct_libusb_pollfd]]) +def libusb_free_pollfds(pollfds:c.POINTER[c.POINTER[struct_libusb_pollfd]]) -> None: ... +@dll.bind(None, c.POINTER[libusb_context], libusb_pollfd_added_cb, libusb_pollfd_removed_cb, ctypes.c_void_p) +def libusb_set_pollfd_notifiers(ctx:c.POINTER[libusb_context], added_cb:libusb_pollfd_added_cb, removed_cb:libusb_pollfd_removed_cb, user_data:ctypes.c_void_p) -> None: ... +libusb_hotplug_callback_handle: TypeAlias = ctypes.c_int32 +libusb_hotplug_event: dict[int, str] = {(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED:=1): 'LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED', (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT:=2): 'LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT'} +libusb_hotplug_flag: dict[int, str] = {(LIBUSB_HOTPLUG_ENUMERATE:=1): 'LIBUSB_HOTPLUG_ENUMERATE'} +libusb_hotplug_callback_fn: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [c.POINTER[struct_libusb_context], c.POINTER[struct_libusb_device], ctypes.c_uint32, ctypes.c_void_p]] +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32, libusb_hotplug_callback_fn, ctypes.c_void_p, c.POINTER[libusb_hotplug_callback_handle]) +def libusb_hotplug_register_callback(ctx:c.POINTER[libusb_context], events:int, flags:int, vendor_id:int, product_id:int, dev_class:int, cb_fn:libusb_hotplug_callback_fn, user_data:ctypes.c_void_p, callback_handle:c.POINTER[libusb_hotplug_callback_handle]) -> int: ... +@dll.bind(None, c.POINTER[libusb_context], libusb_hotplug_callback_handle) +def libusb_hotplug_deregister_callback(ctx:c.POINTER[libusb_context], callback_handle:libusb_hotplug_callback_handle) -> None: ... +@dll.bind(ctypes.c_void_p, c.POINTER[libusb_context], libusb_hotplug_callback_handle) +def libusb_hotplug_get_user_data(ctx:c.POINTER[libusb_context], callback_handle:libusb_hotplug_callback_handle) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_int32, c.POINTER[libusb_context], ctypes.c_uint32) +def libusb_set_option(ctx:c.POINTER[libusb_context], option:ctypes.c_uint32) -> int: ... +LIBUSB_DEPRECATED_FOR = lambda f: __attribute__ ((deprecated)) # type: ignore +LIBUSB_API_VERSION = 0x0100010A +LIBUSBX_API_VERSION = LIBUSB_API_VERSION +LIBUSB_DT_DEVICE_SIZE = 18 +LIBUSB_DT_CONFIG_SIZE = 9 +LIBUSB_DT_INTERFACE_SIZE = 9 +LIBUSB_DT_ENDPOINT_SIZE = 7 +LIBUSB_DT_ENDPOINT_AUDIO_SIZE = 9 +LIBUSB_DT_HUB_NONVAR_SIZE = 7 +LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE = 6 +LIBUSB_DT_BOS_SIZE = 5 +LIBUSB_DT_DEVICE_CAPABILITY_SIZE = 3 +LIBUSB_BT_USB_2_0_EXTENSION_SIZE = 7 +LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE = 10 +LIBUSB_BT_CONTAINER_ID_SIZE = 20 +LIBUSB_BT_PLATFORM_DESCRIPTOR_MIN_SIZE = 20 +LIBUSB_DT_BOS_MAX_SIZE = (LIBUSB_DT_BOS_SIZE + LIBUSB_BT_USB_2_0_EXTENSION_SIZE + LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE + LIBUSB_BT_CONTAINER_ID_SIZE) +LIBUSB_ENDPOINT_ADDRESS_MASK = 0x0f +LIBUSB_ENDPOINT_DIR_MASK = 0x80 +LIBUSB_TRANSFER_TYPE_MASK = 0x03 +LIBUSB_ISO_SYNC_TYPE_MASK = 0x0c +LIBUSB_ISO_USAGE_TYPE_MASK = 0x30 +LIBUSB_ERROR_COUNT = 14 +LIBUSB_OPTION_WEAK_AUTHORITY = LIBUSB_OPTION_NO_DEVICE_DISCOVERY +LIBUSB_HOTPLUG_NO_FLAGS = 0 +LIBUSB_HOTPLUG_MATCH_ANY = -1 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/llvm.py b/artifacts/package_runtime/tinygrad/runtime/autogen/llvm.py new file mode 100644 index 000000000..336010490 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/llvm.py @@ -0,0 +1,3191 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +from tinygrad.helpers import WIN, OSX +dll = c.DLL('llvm', 'C:\\Program Files\\LLVM\\bin\\LLVM-C.dll' if WIN else ['/opt/homebrew/opt/llvm@21/lib/libLLVM.dylib', '/opt/homebrew/opt/llvm@20/lib/libLLVM.dylib', '/opt/homebrew/opt/llvm@19/lib/libLLVM.dylib', '/opt/homebrew/opt/llvm@18/lib/libLLVM.dylib', '/opt/homebrew/opt/llvm@17/lib/libLLVM.dylib', '/opt/homebrew/opt/llvm@16/lib/libLLVM.dylib', '/opt/homebrew/opt/llvm@15/lib/libLLVM.dylib', '/opt/homebrew/opt/llvm@14/lib/libLLVM.dylib'] if OSX else ['LLVM', 'LLVM-21', 'LLVM-20', 'LLVM-19', 'LLVM-18', 'LLVM-17', 'LLVM-16', 'LLVM-15', 'LLVM-14']) +intmax_t: TypeAlias = ctypes.c_int64 +@dll.bind(intmax_t, intmax_t) +def imaxabs(__n:intmax_t) -> intmax_t: ... +@c.record +class imaxdiv_t(c.Struct): + SIZE = 16 + quot: int + rem: int +imaxdiv_t.register_fields([('quot', ctypes.c_int64, 0), ('rem', ctypes.c_int64, 8)]) +@dll.bind(imaxdiv_t, intmax_t, intmax_t) +def imaxdiv(__numer:intmax_t, __denom:intmax_t) -> imaxdiv_t: ... +@dll.bind(intmax_t, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32) +def strtoimax(__nptr:c.POINTER[ctypes.c_char], __endptr:c.POINTER[c.POINTER[ctypes.c_char]], __base:int) -> intmax_t: ... +uintmax_t: TypeAlias = ctypes.c_uint64 +@dll.bind(uintmax_t, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32) +def strtoumax(__nptr:c.POINTER[ctypes.c_char], __endptr:c.POINTER[c.POINTER[ctypes.c_char]], __base:int) -> uintmax_t: ... +__gwchar_t: TypeAlias = ctypes.c_int32 +@dll.bind(intmax_t, c.POINTER[ctypes.c_int32], c.POINTER[c.POINTER[ctypes.c_int32]], ctypes.c_int32) +def wcstoimax(__nptr:c.POINTER[ctypes.c_int32], __endptr:c.POINTER[c.POINTER[ctypes.c_int32]], __base:int) -> intmax_t: ... +@dll.bind(uintmax_t, c.POINTER[ctypes.c_int32], c.POINTER[c.POINTER[ctypes.c_int32]], ctypes.c_int32) +def wcstoumax(__nptr:c.POINTER[ctypes.c_int32], __endptr:c.POINTER[c.POINTER[ctypes.c_int32]], __base:int) -> uintmax_t: ... +@c.record +class fd_set(c.Struct): + SIZE = 128 + fds_bits: c.Array[ctypes.c_int64, Literal[16]] +__fd_mask: TypeAlias = ctypes.c_int64 +fd_set.register_fields([('fds_bits', c.Array[ctypes.c_int64, Literal[16]], 0)]) +@c.record +class struct_timeval(c.Struct): + SIZE = 16 + tv_sec: int + tv_usec: int +__time_t: TypeAlias = ctypes.c_int64 +__suseconds_t: TypeAlias = ctypes.c_int64 +struct_timeval.register_fields([('tv_sec', ctypes.c_int64, 0), ('tv_usec', ctypes.c_int64, 8)]) +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[fd_set], c.POINTER[fd_set], c.POINTER[fd_set], c.POINTER[struct_timeval]) +def select(__nfds:int, __readfds:c.POINTER[fd_set], __writefds:c.POINTER[fd_set], __exceptfds:c.POINTER[fd_set], __timeout:c.POINTER[struct_timeval]) -> int: ... +@c.record +class struct_timespec(c.Struct): + SIZE = 16 + tv_sec: int + tv_nsec: int +__syscall_slong_t: TypeAlias = ctypes.c_int64 +struct_timespec.register_fields([('tv_sec', ctypes.c_int64, 0), ('tv_nsec', ctypes.c_int64, 8)]) +@c.record +class __sigset_t(c.Struct): + SIZE = 128 + __val: c.Array[ctypes.c_uint64, Literal[16]] +__sigset_t.register_fields([('__val', c.Array[ctypes.c_uint64, Literal[16]], 0)]) +@dll.bind(ctypes.c_int32, ctypes.c_int32, c.POINTER[fd_set], c.POINTER[fd_set], c.POINTER[fd_set], c.POINTER[struct_timespec], c.POINTER[__sigset_t]) +def pselect(__nfds:int, __readfds:c.POINTER[fd_set], __writefds:c.POINTER[fd_set], __exceptfds:c.POINTER[fd_set], __timeout:c.POINTER[struct_timespec], __sigmask:c.POINTER[__sigset_t]) -> int: ... +LLVMVerifierFailureAction: dict[int, str] = {(LLVMAbortProcessAction:=0): 'LLVMAbortProcessAction', (LLVMPrintMessageAction:=1): 'LLVMPrintMessageAction', (LLVMReturnStatusAction:=2): 'LLVMReturnStatusAction'} +LLVMBool: TypeAlias = ctypes.c_int32 +class struct_LLVMOpaqueModule(c.Struct): pass +LLVMModuleRef: TypeAlias = c.POINTER[struct_LLVMOpaqueModule] +@dll.bind(LLVMBool, LLVMModuleRef, ctypes.c_uint32, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMVerifyModule(M:LLVMModuleRef, Action:ctypes.c_uint32, OutMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +class struct_LLVMOpaqueValue(c.Struct): pass +LLVMValueRef: TypeAlias = c.POINTER[struct_LLVMOpaqueValue] +@dll.bind(LLVMBool, LLVMValueRef, ctypes.c_uint32) +def LLVMVerifyFunction(Fn:LLVMValueRef, Action:ctypes.c_uint32) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef) +def LLVMViewFunctionCFG(Fn:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMValueRef) +def LLVMViewFunctionCFGOnly(Fn:LLVMValueRef) -> None: ... +class struct_LLVMOpaqueMemoryBuffer(c.Struct): pass +LLVMMemoryBufferRef: TypeAlias = c.POINTER[struct_LLVMOpaqueMemoryBuffer] +@dll.bind(LLVMBool, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMParseBitcode(MemBuf:LLVMMemoryBufferRef, OutModule:c.POINTER[LLVMModuleRef], OutMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef]) +def LLVMParseBitcode2(MemBuf:LLVMMemoryBufferRef, OutModule:c.POINTER[LLVMModuleRef]) -> LLVMBool: ... +class struct_LLVMOpaqueContext(c.Struct): pass +LLVMContextRef: TypeAlias = c.POINTER[struct_LLVMOpaqueContext] +@dll.bind(LLVMBool, LLVMContextRef, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMParseBitcodeInContext(ContextRef:LLVMContextRef, MemBuf:LLVMMemoryBufferRef, OutModule:c.POINTER[LLVMModuleRef], OutMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMContextRef, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef]) +def LLVMParseBitcodeInContext2(ContextRef:LLVMContextRef, MemBuf:LLVMMemoryBufferRef, OutModule:c.POINTER[LLVMModuleRef]) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMContextRef, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMGetBitcodeModuleInContext(ContextRef:LLVMContextRef, MemBuf:LLVMMemoryBufferRef, OutM:c.POINTER[LLVMModuleRef], OutMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMContextRef, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef]) +def LLVMGetBitcodeModuleInContext2(ContextRef:LLVMContextRef, MemBuf:LLVMMemoryBufferRef, OutM:c.POINTER[LLVMModuleRef]) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMGetBitcodeModule(MemBuf:LLVMMemoryBufferRef, OutM:c.POINTER[LLVMModuleRef], OutMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef]) +def LLVMGetBitcodeModule2(MemBuf:LLVMMemoryBufferRef, OutM:c.POINTER[LLVMModuleRef]) -> LLVMBool: ... +@dll.bind(ctypes.c_int32, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMWriteBitcodeToFile(M:LLVMModuleRef, Path:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(ctypes.c_int32, LLVMModuleRef, ctypes.c_int32, ctypes.c_int32, ctypes.c_int32) +def LLVMWriteBitcodeToFD(M:LLVMModuleRef, FD:int, ShouldClose:int, Unbuffered:int) -> int: ... +@dll.bind(ctypes.c_int32, LLVMModuleRef, ctypes.c_int32) +def LLVMWriteBitcodeToFileHandle(M:LLVMModuleRef, Handle:int) -> int: ... +@dll.bind(LLVMMemoryBufferRef, LLVMModuleRef) +def LLVMWriteBitcodeToMemoryBuffer(M:LLVMModuleRef) -> LLVMMemoryBufferRef: ... +LLVMComdatSelectionKind: dict[int, str] = {(LLVMAnyComdatSelectionKind:=0): 'LLVMAnyComdatSelectionKind', (LLVMExactMatchComdatSelectionKind:=1): 'LLVMExactMatchComdatSelectionKind', (LLVMLargestComdatSelectionKind:=2): 'LLVMLargestComdatSelectionKind', (LLVMNoDeduplicateComdatSelectionKind:=3): 'LLVMNoDeduplicateComdatSelectionKind', (LLVMSameSizeComdatSelectionKind:=4): 'LLVMSameSizeComdatSelectionKind'} +class struct_LLVMComdat(c.Struct): pass +LLVMComdatRef: TypeAlias = c.POINTER[struct_LLVMComdat] +@dll.bind(LLVMComdatRef, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMGetOrInsertComdat(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char]) -> LLVMComdatRef: ... +@dll.bind(LLVMComdatRef, LLVMValueRef) +def LLVMGetComdat(V:LLVMValueRef) -> LLVMComdatRef: ... +@dll.bind(None, LLVMValueRef, LLVMComdatRef) +def LLVMSetComdat(V:LLVMValueRef, C:LLVMComdatRef) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMComdatRef) +def LLVMGetComdatSelectionKind(C:LLVMComdatRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMComdatRef, ctypes.c_uint32) +def LLVMSetComdatSelectionKind(C:LLVMComdatRef, Kind:ctypes.c_uint32) -> None: ... +LLVMFatalErrorHandler: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char]]] +@dll.bind(None, LLVMFatalErrorHandler) +def LLVMInstallFatalErrorHandler(Handler:LLVMFatalErrorHandler) -> None: ... +@dll.bind(None) +def LLVMResetFatalErrorHandler() -> None: ... +@dll.bind(None) +def LLVMEnablePrettyStackTrace() -> None: ... +LLVMOpcode: dict[int, str] = {(LLVMRet:=1): 'LLVMRet', (LLVMBr:=2): 'LLVMBr', (LLVMSwitch:=3): 'LLVMSwitch', (LLVMIndirectBr:=4): 'LLVMIndirectBr', (LLVMInvoke:=5): 'LLVMInvoke', (LLVMUnreachable:=7): 'LLVMUnreachable', (LLVMCallBr:=67): 'LLVMCallBr', (LLVMFNeg:=66): 'LLVMFNeg', (LLVMAdd:=8): 'LLVMAdd', (LLVMFAdd:=9): 'LLVMFAdd', (LLVMSub:=10): 'LLVMSub', (LLVMFSub:=11): 'LLVMFSub', (LLVMMul:=12): 'LLVMMul', (LLVMFMul:=13): 'LLVMFMul', (LLVMUDiv:=14): 'LLVMUDiv', (LLVMSDiv:=15): 'LLVMSDiv', (LLVMFDiv:=16): 'LLVMFDiv', (LLVMURem:=17): 'LLVMURem', (LLVMSRem:=18): 'LLVMSRem', (LLVMFRem:=19): 'LLVMFRem', (LLVMShl:=20): 'LLVMShl', (LLVMLShr:=21): 'LLVMLShr', (LLVMAShr:=22): 'LLVMAShr', (LLVMAnd:=23): 'LLVMAnd', (LLVMOr:=24): 'LLVMOr', (LLVMXor:=25): 'LLVMXor', (LLVMAlloca:=26): 'LLVMAlloca', (LLVMLoad:=27): 'LLVMLoad', (LLVMStore:=28): 'LLVMStore', (LLVMGetElementPtr:=29): 'LLVMGetElementPtr', (LLVMTrunc:=30): 'LLVMTrunc', (LLVMZExt:=31): 'LLVMZExt', (LLVMSExt:=32): 'LLVMSExt', (LLVMFPToUI:=33): 'LLVMFPToUI', (LLVMFPToSI:=34): 'LLVMFPToSI', (LLVMUIToFP:=35): 'LLVMUIToFP', (LLVMSIToFP:=36): 'LLVMSIToFP', (LLVMFPTrunc:=37): 'LLVMFPTrunc', (LLVMFPExt:=38): 'LLVMFPExt', (LLVMPtrToInt:=39): 'LLVMPtrToInt', (LLVMIntToPtr:=40): 'LLVMIntToPtr', (LLVMBitCast:=41): 'LLVMBitCast', (LLVMAddrSpaceCast:=60): 'LLVMAddrSpaceCast', (LLVMICmp:=42): 'LLVMICmp', (LLVMFCmp:=43): 'LLVMFCmp', (LLVMPHI:=44): 'LLVMPHI', (LLVMCall:=45): 'LLVMCall', (LLVMSelect:=46): 'LLVMSelect', (LLVMUserOp1:=47): 'LLVMUserOp1', (LLVMUserOp2:=48): 'LLVMUserOp2', (LLVMVAArg:=49): 'LLVMVAArg', (LLVMExtractElement:=50): 'LLVMExtractElement', (LLVMInsertElement:=51): 'LLVMInsertElement', (LLVMShuffleVector:=52): 'LLVMShuffleVector', (LLVMExtractValue:=53): 'LLVMExtractValue', (LLVMInsertValue:=54): 'LLVMInsertValue', (LLVMFreeze:=68): 'LLVMFreeze', (LLVMFence:=55): 'LLVMFence', (LLVMAtomicCmpXchg:=56): 'LLVMAtomicCmpXchg', (LLVMAtomicRMW:=57): 'LLVMAtomicRMW', (LLVMResume:=58): 'LLVMResume', (LLVMLandingPad:=59): 'LLVMLandingPad', (LLVMCleanupRet:=61): 'LLVMCleanupRet', (LLVMCatchRet:=62): 'LLVMCatchRet', (LLVMCatchPad:=63): 'LLVMCatchPad', (LLVMCleanupPad:=64): 'LLVMCleanupPad', (LLVMCatchSwitch:=65): 'LLVMCatchSwitch'} +LLVMTypeKind: dict[int, str] = {(LLVMVoidTypeKind:=0): 'LLVMVoidTypeKind', (LLVMHalfTypeKind:=1): 'LLVMHalfTypeKind', (LLVMFloatTypeKind:=2): 'LLVMFloatTypeKind', (LLVMDoubleTypeKind:=3): 'LLVMDoubleTypeKind', (LLVMX86_FP80TypeKind:=4): 'LLVMX86_FP80TypeKind', (LLVMFP128TypeKind:=5): 'LLVMFP128TypeKind', (LLVMPPC_FP128TypeKind:=6): 'LLVMPPC_FP128TypeKind', (LLVMLabelTypeKind:=7): 'LLVMLabelTypeKind', (LLVMIntegerTypeKind:=8): 'LLVMIntegerTypeKind', (LLVMFunctionTypeKind:=9): 'LLVMFunctionTypeKind', (LLVMStructTypeKind:=10): 'LLVMStructTypeKind', (LLVMArrayTypeKind:=11): 'LLVMArrayTypeKind', (LLVMPointerTypeKind:=12): 'LLVMPointerTypeKind', (LLVMVectorTypeKind:=13): 'LLVMVectorTypeKind', (LLVMMetadataTypeKind:=14): 'LLVMMetadataTypeKind', (LLVMTokenTypeKind:=16): 'LLVMTokenTypeKind', (LLVMScalableVectorTypeKind:=17): 'LLVMScalableVectorTypeKind', (LLVMBFloatTypeKind:=18): 'LLVMBFloatTypeKind', (LLVMX86_AMXTypeKind:=19): 'LLVMX86_AMXTypeKind', (LLVMTargetExtTypeKind:=20): 'LLVMTargetExtTypeKind'} +LLVMLinkage: dict[int, str] = {(LLVMExternalLinkage:=0): 'LLVMExternalLinkage', (LLVMAvailableExternallyLinkage:=1): 'LLVMAvailableExternallyLinkage', (LLVMLinkOnceAnyLinkage:=2): 'LLVMLinkOnceAnyLinkage', (LLVMLinkOnceODRLinkage:=3): 'LLVMLinkOnceODRLinkage', (LLVMLinkOnceODRAutoHideLinkage:=4): 'LLVMLinkOnceODRAutoHideLinkage', (LLVMWeakAnyLinkage:=5): 'LLVMWeakAnyLinkage', (LLVMWeakODRLinkage:=6): 'LLVMWeakODRLinkage', (LLVMAppendingLinkage:=7): 'LLVMAppendingLinkage', (LLVMInternalLinkage:=8): 'LLVMInternalLinkage', (LLVMPrivateLinkage:=9): 'LLVMPrivateLinkage', (LLVMDLLImportLinkage:=10): 'LLVMDLLImportLinkage', (LLVMDLLExportLinkage:=11): 'LLVMDLLExportLinkage', (LLVMExternalWeakLinkage:=12): 'LLVMExternalWeakLinkage', (LLVMGhostLinkage:=13): 'LLVMGhostLinkage', (LLVMCommonLinkage:=14): 'LLVMCommonLinkage', (LLVMLinkerPrivateLinkage:=15): 'LLVMLinkerPrivateLinkage', (LLVMLinkerPrivateWeakLinkage:=16): 'LLVMLinkerPrivateWeakLinkage'} +LLVMVisibility: dict[int, str] = {(LLVMDefaultVisibility:=0): 'LLVMDefaultVisibility', (LLVMHiddenVisibility:=1): 'LLVMHiddenVisibility', (LLVMProtectedVisibility:=2): 'LLVMProtectedVisibility'} +LLVMUnnamedAddr: dict[int, str] = {(LLVMNoUnnamedAddr:=0): 'LLVMNoUnnamedAddr', (LLVMLocalUnnamedAddr:=1): 'LLVMLocalUnnamedAddr', (LLVMGlobalUnnamedAddr:=2): 'LLVMGlobalUnnamedAddr'} +LLVMDLLStorageClass: dict[int, str] = {(LLVMDefaultStorageClass:=0): 'LLVMDefaultStorageClass', (LLVMDLLImportStorageClass:=1): 'LLVMDLLImportStorageClass', (LLVMDLLExportStorageClass:=2): 'LLVMDLLExportStorageClass'} +LLVMCallConv: dict[int, str] = {(LLVMCCallConv:=0): 'LLVMCCallConv', (LLVMFastCallConv:=8): 'LLVMFastCallConv', (LLVMColdCallConv:=9): 'LLVMColdCallConv', (LLVMGHCCallConv:=10): 'LLVMGHCCallConv', (LLVMHiPECallConv:=11): 'LLVMHiPECallConv', (LLVMAnyRegCallConv:=13): 'LLVMAnyRegCallConv', (LLVMPreserveMostCallConv:=14): 'LLVMPreserveMostCallConv', (LLVMPreserveAllCallConv:=15): 'LLVMPreserveAllCallConv', (LLVMSwiftCallConv:=16): 'LLVMSwiftCallConv', (LLVMCXXFASTTLSCallConv:=17): 'LLVMCXXFASTTLSCallConv', (LLVMX86StdcallCallConv:=64): 'LLVMX86StdcallCallConv', (LLVMX86FastcallCallConv:=65): 'LLVMX86FastcallCallConv', (LLVMARMAPCSCallConv:=66): 'LLVMARMAPCSCallConv', (LLVMARMAAPCSCallConv:=67): 'LLVMARMAAPCSCallConv', (LLVMARMAAPCSVFPCallConv:=68): 'LLVMARMAAPCSVFPCallConv', (LLVMMSP430INTRCallConv:=69): 'LLVMMSP430INTRCallConv', (LLVMX86ThisCallCallConv:=70): 'LLVMX86ThisCallCallConv', (LLVMPTXKernelCallConv:=71): 'LLVMPTXKernelCallConv', (LLVMPTXDeviceCallConv:=72): 'LLVMPTXDeviceCallConv', (LLVMSPIRFUNCCallConv:=75): 'LLVMSPIRFUNCCallConv', (LLVMSPIRKERNELCallConv:=76): 'LLVMSPIRKERNELCallConv', (LLVMIntelOCLBICallConv:=77): 'LLVMIntelOCLBICallConv', (LLVMX8664SysVCallConv:=78): 'LLVMX8664SysVCallConv', (LLVMWin64CallConv:=79): 'LLVMWin64CallConv', (LLVMX86VectorCallCallConv:=80): 'LLVMX86VectorCallCallConv', (LLVMHHVMCallConv:=81): 'LLVMHHVMCallConv', (LLVMHHVMCCallConv:=82): 'LLVMHHVMCCallConv', (LLVMX86INTRCallConv:=83): 'LLVMX86INTRCallConv', (LLVMAVRINTRCallConv:=84): 'LLVMAVRINTRCallConv', (LLVMAVRSIGNALCallConv:=85): 'LLVMAVRSIGNALCallConv', (LLVMAVRBUILTINCallConv:=86): 'LLVMAVRBUILTINCallConv', (LLVMAMDGPUVSCallConv:=87): 'LLVMAMDGPUVSCallConv', (LLVMAMDGPUGSCallConv:=88): 'LLVMAMDGPUGSCallConv', (LLVMAMDGPUPSCallConv:=89): 'LLVMAMDGPUPSCallConv', (LLVMAMDGPUCSCallConv:=90): 'LLVMAMDGPUCSCallConv', (LLVMAMDGPUKERNELCallConv:=91): 'LLVMAMDGPUKERNELCallConv', (LLVMX86RegCallCallConv:=92): 'LLVMX86RegCallCallConv', (LLVMAMDGPUHSCallConv:=93): 'LLVMAMDGPUHSCallConv', (LLVMMSP430BUILTINCallConv:=94): 'LLVMMSP430BUILTINCallConv', (LLVMAMDGPULSCallConv:=95): 'LLVMAMDGPULSCallConv', (LLVMAMDGPUESCallConv:=96): 'LLVMAMDGPUESCallConv'} +LLVMValueKind: dict[int, str] = {(LLVMArgumentValueKind:=0): 'LLVMArgumentValueKind', (LLVMBasicBlockValueKind:=1): 'LLVMBasicBlockValueKind', (LLVMMemoryUseValueKind:=2): 'LLVMMemoryUseValueKind', (LLVMMemoryDefValueKind:=3): 'LLVMMemoryDefValueKind', (LLVMMemoryPhiValueKind:=4): 'LLVMMemoryPhiValueKind', (LLVMFunctionValueKind:=5): 'LLVMFunctionValueKind', (LLVMGlobalAliasValueKind:=6): 'LLVMGlobalAliasValueKind', (LLVMGlobalIFuncValueKind:=7): 'LLVMGlobalIFuncValueKind', (LLVMGlobalVariableValueKind:=8): 'LLVMGlobalVariableValueKind', (LLVMBlockAddressValueKind:=9): 'LLVMBlockAddressValueKind', (LLVMConstantExprValueKind:=10): 'LLVMConstantExprValueKind', (LLVMConstantArrayValueKind:=11): 'LLVMConstantArrayValueKind', (LLVMConstantStructValueKind:=12): 'LLVMConstantStructValueKind', (LLVMConstantVectorValueKind:=13): 'LLVMConstantVectorValueKind', (LLVMUndefValueValueKind:=14): 'LLVMUndefValueValueKind', (LLVMConstantAggregateZeroValueKind:=15): 'LLVMConstantAggregateZeroValueKind', (LLVMConstantDataArrayValueKind:=16): 'LLVMConstantDataArrayValueKind', (LLVMConstantDataVectorValueKind:=17): 'LLVMConstantDataVectorValueKind', (LLVMConstantIntValueKind:=18): 'LLVMConstantIntValueKind', (LLVMConstantFPValueKind:=19): 'LLVMConstantFPValueKind', (LLVMConstantPointerNullValueKind:=20): 'LLVMConstantPointerNullValueKind', (LLVMConstantTokenNoneValueKind:=21): 'LLVMConstantTokenNoneValueKind', (LLVMMetadataAsValueValueKind:=22): 'LLVMMetadataAsValueValueKind', (LLVMInlineAsmValueKind:=23): 'LLVMInlineAsmValueKind', (LLVMInstructionValueKind:=24): 'LLVMInstructionValueKind', (LLVMPoisonValueValueKind:=25): 'LLVMPoisonValueValueKind', (LLVMConstantTargetNoneValueKind:=26): 'LLVMConstantTargetNoneValueKind', (LLVMConstantPtrAuthValueKind:=27): 'LLVMConstantPtrAuthValueKind'} +LLVMIntPredicate: dict[int, str] = {(LLVMIntEQ:=32): 'LLVMIntEQ', (LLVMIntNE:=33): 'LLVMIntNE', (LLVMIntUGT:=34): 'LLVMIntUGT', (LLVMIntUGE:=35): 'LLVMIntUGE', (LLVMIntULT:=36): 'LLVMIntULT', (LLVMIntULE:=37): 'LLVMIntULE', (LLVMIntSGT:=38): 'LLVMIntSGT', (LLVMIntSGE:=39): 'LLVMIntSGE', (LLVMIntSLT:=40): 'LLVMIntSLT', (LLVMIntSLE:=41): 'LLVMIntSLE'} +LLVMRealPredicate: dict[int, str] = {(LLVMRealPredicateFalse:=0): 'LLVMRealPredicateFalse', (LLVMRealOEQ:=1): 'LLVMRealOEQ', (LLVMRealOGT:=2): 'LLVMRealOGT', (LLVMRealOGE:=3): 'LLVMRealOGE', (LLVMRealOLT:=4): 'LLVMRealOLT', (LLVMRealOLE:=5): 'LLVMRealOLE', (LLVMRealONE:=6): 'LLVMRealONE', (LLVMRealORD:=7): 'LLVMRealORD', (LLVMRealUNO:=8): 'LLVMRealUNO', (LLVMRealUEQ:=9): 'LLVMRealUEQ', (LLVMRealUGT:=10): 'LLVMRealUGT', (LLVMRealUGE:=11): 'LLVMRealUGE', (LLVMRealULT:=12): 'LLVMRealULT', (LLVMRealULE:=13): 'LLVMRealULE', (LLVMRealUNE:=14): 'LLVMRealUNE', (LLVMRealPredicateTrue:=15): 'LLVMRealPredicateTrue'} +LLVMLandingPadClauseTy: dict[int, str] = {(LLVMLandingPadCatch:=0): 'LLVMLandingPadCatch', (LLVMLandingPadFilter:=1): 'LLVMLandingPadFilter'} +LLVMThreadLocalMode: dict[int, str] = {(LLVMNotThreadLocal:=0): 'LLVMNotThreadLocal', (LLVMGeneralDynamicTLSModel:=1): 'LLVMGeneralDynamicTLSModel', (LLVMLocalDynamicTLSModel:=2): 'LLVMLocalDynamicTLSModel', (LLVMInitialExecTLSModel:=3): 'LLVMInitialExecTLSModel', (LLVMLocalExecTLSModel:=4): 'LLVMLocalExecTLSModel'} +LLVMAtomicOrdering: dict[int, str] = {(LLVMAtomicOrderingNotAtomic:=0): 'LLVMAtomicOrderingNotAtomic', (LLVMAtomicOrderingUnordered:=1): 'LLVMAtomicOrderingUnordered', (LLVMAtomicOrderingMonotonic:=2): 'LLVMAtomicOrderingMonotonic', (LLVMAtomicOrderingAcquire:=4): 'LLVMAtomicOrderingAcquire', (LLVMAtomicOrderingRelease:=5): 'LLVMAtomicOrderingRelease', (LLVMAtomicOrderingAcquireRelease:=6): 'LLVMAtomicOrderingAcquireRelease', (LLVMAtomicOrderingSequentiallyConsistent:=7): 'LLVMAtomicOrderingSequentiallyConsistent'} +LLVMAtomicRMWBinOp: dict[int, str] = {(LLVMAtomicRMWBinOpXchg:=0): 'LLVMAtomicRMWBinOpXchg', (LLVMAtomicRMWBinOpAdd:=1): 'LLVMAtomicRMWBinOpAdd', (LLVMAtomicRMWBinOpSub:=2): 'LLVMAtomicRMWBinOpSub', (LLVMAtomicRMWBinOpAnd:=3): 'LLVMAtomicRMWBinOpAnd', (LLVMAtomicRMWBinOpNand:=4): 'LLVMAtomicRMWBinOpNand', (LLVMAtomicRMWBinOpOr:=5): 'LLVMAtomicRMWBinOpOr', (LLVMAtomicRMWBinOpXor:=6): 'LLVMAtomicRMWBinOpXor', (LLVMAtomicRMWBinOpMax:=7): 'LLVMAtomicRMWBinOpMax', (LLVMAtomicRMWBinOpMin:=8): 'LLVMAtomicRMWBinOpMin', (LLVMAtomicRMWBinOpUMax:=9): 'LLVMAtomicRMWBinOpUMax', (LLVMAtomicRMWBinOpUMin:=10): 'LLVMAtomicRMWBinOpUMin', (LLVMAtomicRMWBinOpFAdd:=11): 'LLVMAtomicRMWBinOpFAdd', (LLVMAtomicRMWBinOpFSub:=12): 'LLVMAtomicRMWBinOpFSub', (LLVMAtomicRMWBinOpFMax:=13): 'LLVMAtomicRMWBinOpFMax', (LLVMAtomicRMWBinOpFMin:=14): 'LLVMAtomicRMWBinOpFMin', (LLVMAtomicRMWBinOpUIncWrap:=15): 'LLVMAtomicRMWBinOpUIncWrap', (LLVMAtomicRMWBinOpUDecWrap:=16): 'LLVMAtomicRMWBinOpUDecWrap', (LLVMAtomicRMWBinOpUSubCond:=17): 'LLVMAtomicRMWBinOpUSubCond', (LLVMAtomicRMWBinOpUSubSat:=18): 'LLVMAtomicRMWBinOpUSubSat'} +LLVMDiagnosticSeverity: dict[int, str] = {(LLVMDSError:=0): 'LLVMDSError', (LLVMDSWarning:=1): 'LLVMDSWarning', (LLVMDSRemark:=2): 'LLVMDSRemark', (LLVMDSNote:=3): 'LLVMDSNote'} +LLVMInlineAsmDialect: dict[int, str] = {(LLVMInlineAsmDialectATT:=0): 'LLVMInlineAsmDialectATT', (LLVMInlineAsmDialectIntel:=1): 'LLVMInlineAsmDialectIntel'} +LLVMModuleFlagBehavior: dict[int, str] = {(LLVMModuleFlagBehaviorError:=0): 'LLVMModuleFlagBehaviorError', (LLVMModuleFlagBehaviorWarning:=1): 'LLVMModuleFlagBehaviorWarning', (LLVMModuleFlagBehaviorRequire:=2): 'LLVMModuleFlagBehaviorRequire', (LLVMModuleFlagBehaviorOverride:=3): 'LLVMModuleFlagBehaviorOverride', (LLVMModuleFlagBehaviorAppend:=4): 'LLVMModuleFlagBehaviorAppend', (LLVMModuleFlagBehaviorAppendUnique:=5): 'LLVMModuleFlagBehaviorAppendUnique'} +_anonenum0: dict[int, str] = {(LLVMAttributeReturnIndex:=0): 'LLVMAttributeReturnIndex', (LLVMAttributeFunctionIndex:=-1): 'LLVMAttributeFunctionIndex'} +LLVMAttributeIndex: TypeAlias = ctypes.c_uint32 +LLVMTailCallKind: dict[int, str] = {(LLVMTailCallKindNone:=0): 'LLVMTailCallKindNone', (LLVMTailCallKindTail:=1): 'LLVMTailCallKindTail', (LLVMTailCallKindMustTail:=2): 'LLVMTailCallKindMustTail', (LLVMTailCallKindNoTail:=3): 'LLVMTailCallKindNoTail'} +_anonenum1: dict[int, str] = {(LLVMFastMathAllowReassoc:=1): 'LLVMFastMathAllowReassoc', (LLVMFastMathNoNaNs:=2): 'LLVMFastMathNoNaNs', (LLVMFastMathNoInfs:=4): 'LLVMFastMathNoInfs', (LLVMFastMathNoSignedZeros:=8): 'LLVMFastMathNoSignedZeros', (LLVMFastMathAllowReciprocal:=16): 'LLVMFastMathAllowReciprocal', (LLVMFastMathAllowContract:=32): 'LLVMFastMathAllowContract', (LLVMFastMathApproxFunc:=64): 'LLVMFastMathApproxFunc', (LLVMFastMathNone:=0): 'LLVMFastMathNone', (LLVMFastMathAll:=127): 'LLVMFastMathAll'} +LLVMFastMathFlags: TypeAlias = ctypes.c_uint32 +_anonenum2: dict[int, str] = {(LLVMGEPFlagInBounds:=1): 'LLVMGEPFlagInBounds', (LLVMGEPFlagNUSW:=2): 'LLVMGEPFlagNUSW', (LLVMGEPFlagNUW:=4): 'LLVMGEPFlagNUW'} +LLVMGEPNoWrapFlags: TypeAlias = ctypes.c_uint32 +@dll.bind(None) +def LLVMShutdown() -> None: ... +@dll.bind(None, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def LLVMGetVersion(Major:c.POINTER[ctypes.c_uint32], Minor:c.POINTER[ctypes.c_uint32], Patch:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def LLVMCreateMessage(Message:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, c.POINTER[ctypes.c_char]) +def LLVMDisposeMessage(Message:c.POINTER[ctypes.c_char]) -> None: ... +class struct_LLVMOpaqueDiagnosticInfo(c.Struct): pass +LLVMDiagnosticHandler: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_LLVMOpaqueDiagnosticInfo], ctypes.c_void_p]] +LLVMYieldCallback: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_LLVMOpaqueContext], ctypes.c_void_p]] +@dll.bind(LLVMContextRef) +def LLVMContextCreate() -> LLVMContextRef: ... +@dll.bind(LLVMContextRef) +def LLVMGetGlobalContext() -> LLVMContextRef: ... +@dll.bind(None, LLVMContextRef, LLVMDiagnosticHandler, ctypes.c_void_p) +def LLVMContextSetDiagnosticHandler(C:LLVMContextRef, Handler:LLVMDiagnosticHandler, DiagnosticContext:ctypes.c_void_p) -> None: ... +@dll.bind(LLVMDiagnosticHandler, LLVMContextRef) +def LLVMContextGetDiagnosticHandler(C:LLVMContextRef) -> LLVMDiagnosticHandler: ... +@dll.bind(ctypes.c_void_p, LLVMContextRef) +def LLVMContextGetDiagnosticContext(C:LLVMContextRef) -> ctypes.c_void_p: ... +@dll.bind(None, LLVMContextRef, LLVMYieldCallback, ctypes.c_void_p) +def LLVMContextSetYieldCallback(C:LLVMContextRef, Callback:LLVMYieldCallback, OpaqueHandle:ctypes.c_void_p) -> None: ... +@dll.bind(LLVMBool, LLVMContextRef) +def LLVMContextShouldDiscardValueNames(C:LLVMContextRef) -> LLVMBool: ... +@dll.bind(None, LLVMContextRef, LLVMBool) +def LLVMContextSetDiscardValueNames(C:LLVMContextRef, Discard:LLVMBool) -> None: ... +@dll.bind(None, LLVMContextRef) +def LLVMContextDispose(C:LLVMContextRef) -> None: ... +LLVMDiagnosticInfoRef: TypeAlias = c.POINTER[struct_LLVMOpaqueDiagnosticInfo] +@dll.bind(c.POINTER[ctypes.c_char], LLVMDiagnosticInfoRef) +def LLVMGetDiagInfoDescription(DI:LLVMDiagnosticInfoRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, LLVMDiagnosticInfoRef) +def LLVMGetDiagInfoSeverity(DI:LLVMDiagnosticInfoRef) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, LLVMContextRef, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMGetMDKindIDInContext(C:LLVMContextRef, Name:c.POINTER[ctypes.c_char], SLen:int) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMGetMDKindID(Name:c.POINTER[ctypes.c_char], SLen:int) -> int: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(ctypes.c_uint32, LLVMContextRef, c.POINTER[ctypes.c_char], size_t) +def LLVMGetSyncScopeID(C:LLVMContextRef, Name:c.POINTER[ctypes.c_char], SLen:size_t) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t) +def LLVMGetEnumAttributeKindForName(Name:c.POINTER[ctypes.c_char], SLen:size_t) -> int: ... +@dll.bind(ctypes.c_uint32) +def LLVMGetLastEnumAttributeKind() -> int: ... +class struct_LLVMOpaqueAttributeRef(c.Struct): pass +LLVMAttributeRef: TypeAlias = c.POINTER[struct_LLVMOpaqueAttributeRef] +uint64_t: TypeAlias = ctypes.c_uint64 +@dll.bind(LLVMAttributeRef, LLVMContextRef, ctypes.c_uint32, uint64_t) +def LLVMCreateEnumAttribute(C:LLVMContextRef, KindID:int, Val:uint64_t) -> LLVMAttributeRef: ... +@dll.bind(ctypes.c_uint32, LLVMAttributeRef) +def LLVMGetEnumAttributeKind(A:LLVMAttributeRef) -> int: ... +@dll.bind(uint64_t, LLVMAttributeRef) +def LLVMGetEnumAttributeValue(A:LLVMAttributeRef) -> uint64_t: ... +class struct_LLVMOpaqueType(c.Struct): pass +LLVMTypeRef: TypeAlias = c.POINTER[struct_LLVMOpaqueType] +@dll.bind(LLVMAttributeRef, LLVMContextRef, ctypes.c_uint32, LLVMTypeRef) +def LLVMCreateTypeAttribute(C:LLVMContextRef, KindID:int, type_ref:LLVMTypeRef) -> LLVMAttributeRef: ... +@dll.bind(LLVMTypeRef, LLVMAttributeRef) +def LLVMGetTypeAttributeValue(A:LLVMAttributeRef) -> LLVMTypeRef: ... +@dll.bind(LLVMAttributeRef, LLVMContextRef, ctypes.c_uint32, ctypes.c_uint32, c.Array[uint64_t, Literal[0]], c.Array[uint64_t, Literal[0]]) +def LLVMCreateConstantRangeAttribute(C:LLVMContextRef, KindID:int, NumBits:int, LowerWords:c.Array[uint64_t, Literal[0]], UpperWords:c.Array[uint64_t, Literal[0]]) -> LLVMAttributeRef: ... +@dll.bind(LLVMAttributeRef, LLVMContextRef, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMCreateStringAttribute(C:LLVMContextRef, K:c.POINTER[ctypes.c_char], KLength:int, V:c.POINTER[ctypes.c_char], VLength:int) -> LLVMAttributeRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMAttributeRef, c.POINTER[ctypes.c_uint32]) +def LLVMGetStringAttributeKind(A:LLVMAttributeRef, Length:c.POINTER[ctypes.c_uint32]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMAttributeRef, c.POINTER[ctypes.c_uint32]) +def LLVMGetStringAttributeValue(A:LLVMAttributeRef, Length:c.POINTER[ctypes.c_uint32]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMBool, LLVMAttributeRef) +def LLVMIsEnumAttribute(A:LLVMAttributeRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMAttributeRef) +def LLVMIsStringAttribute(A:LLVMAttributeRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMAttributeRef) +def LLVMIsTypeAttribute(A:LLVMAttributeRef) -> LLVMBool: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, c.POINTER[ctypes.c_char]) +def LLVMGetTypeByName2(C:LLVMContextRef, Name:c.POINTER[ctypes.c_char]) -> LLVMTypeRef: ... +@dll.bind(LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMModuleCreateWithName(ModuleID:c.POINTER[ctypes.c_char]) -> LLVMModuleRef: ... +@dll.bind(LLVMModuleRef, c.POINTER[ctypes.c_char], LLVMContextRef) +def LLVMModuleCreateWithNameInContext(ModuleID:c.POINTER[ctypes.c_char], C:LLVMContextRef) -> LLVMModuleRef: ... +@dll.bind(LLVMModuleRef, LLVMModuleRef) +def LLVMCloneModule(M:LLVMModuleRef) -> LLVMModuleRef: ... +@dll.bind(None, LLVMModuleRef) +def LLVMDisposeModule(M:LLVMModuleRef) -> None: ... +@dll.bind(LLVMBool, LLVMModuleRef) +def LLVMIsNewDbgInfoFormat(M:LLVMModuleRef) -> LLVMBool: ... +@dll.bind(None, LLVMModuleRef, LLVMBool) +def LLVMSetIsNewDbgInfoFormat(M:LLVMModuleRef, UseNewFormat:LLVMBool) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMModuleRef, c.POINTER[size_t]) +def LLVMGetModuleIdentifier(M:LLVMModuleRef, Len:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMSetModuleIdentifier(M:LLVMModuleRef, Ident:c.POINTER[ctypes.c_char], Len:size_t) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMModuleRef, c.POINTER[size_t]) +def LLVMGetSourceFileName(M:LLVMModuleRef, Len:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMSetSourceFileName(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], Len:size_t) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMModuleRef) +def LLVMGetDataLayoutStr(M:LLVMModuleRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMModuleRef) +def LLVMGetDataLayout(M:LLVMModuleRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMSetDataLayout(M:LLVMModuleRef, DataLayoutStr:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMModuleRef) +def LLVMGetTarget(M:LLVMModuleRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMSetTarget(M:LLVMModuleRef, Triple:c.POINTER[ctypes.c_char]) -> None: ... +class struct_LLVMOpaqueModuleFlagEntry(c.Struct): pass +LLVMModuleFlagEntry: TypeAlias = struct_LLVMOpaqueModuleFlagEntry +@dll.bind(c.POINTER[LLVMModuleFlagEntry], LLVMModuleRef, c.POINTER[size_t]) +def LLVMCopyModuleFlagsMetadata(M:LLVMModuleRef, Len:c.POINTER[size_t]) -> c.POINTER[LLVMModuleFlagEntry]: ... +@dll.bind(None, c.POINTER[LLVMModuleFlagEntry]) +def LLVMDisposeModuleFlagsMetadata(Entries:c.POINTER[LLVMModuleFlagEntry]) -> None: ... +@dll.bind(ctypes.c_uint32, c.POINTER[LLVMModuleFlagEntry], ctypes.c_uint32) +def LLVMModuleFlagEntriesGetFlagBehavior(Entries:c.POINTER[LLVMModuleFlagEntry], Index:int) -> ctypes.c_uint32: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[LLVMModuleFlagEntry], ctypes.c_uint32, c.POINTER[size_t]) +def LLVMModuleFlagEntriesGetKey(Entries:c.POINTER[LLVMModuleFlagEntry], Index:int, Len:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +class struct_LLVMOpaqueMetadata(c.Struct): pass +LLVMMetadataRef: TypeAlias = c.POINTER[struct_LLVMOpaqueMetadata] +@dll.bind(LLVMMetadataRef, c.POINTER[LLVMModuleFlagEntry], ctypes.c_uint32) +def LLVMModuleFlagEntriesGetMetadata(Entries:c.POINTER[LLVMModuleFlagEntry], Index:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMGetModuleFlag(M:LLVMModuleRef, Key:c.POINTER[ctypes.c_char], KeyLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(None, LLVMModuleRef, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef) +def LLVMAddModuleFlag(M:LLVMModuleRef, Behavior:ctypes.c_uint32, Key:c.POINTER[ctypes.c_char], KeyLen:size_t, Val:LLVMMetadataRef) -> None: ... +@dll.bind(None, LLVMModuleRef) +def LLVMDumpModule(M:LLVMModuleRef) -> None: ... +@dll.bind(LLVMBool, LLVMModuleRef, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMPrintModuleToFile(M:LLVMModuleRef, Filename:c.POINTER[ctypes.c_char], ErrorMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMModuleRef) +def LLVMPrintModuleToString(M:LLVMModuleRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMModuleRef, c.POINTER[size_t]) +def LLVMGetModuleInlineAsm(M:LLVMModuleRef, Len:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMSetModuleInlineAsm2(M:LLVMModuleRef, Asm:c.POINTER[ctypes.c_char], Len:size_t) -> None: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMAppendModuleInlineAsm(M:LLVMModuleRef, Asm:c.POINTER[ctypes.c_char], Len:size_t) -> None: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t, LLVMBool, LLVMBool, ctypes.c_uint32, LLVMBool) +def LLVMGetInlineAsm(Ty:LLVMTypeRef, AsmString:c.POINTER[ctypes.c_char], AsmStringSize:size_t, Constraints:c.POINTER[ctypes.c_char], ConstraintsSize:size_t, HasSideEffects:LLVMBool, IsAlignStack:LLVMBool, Dialect:ctypes.c_uint32, CanThrow:LLVMBool) -> LLVMValueRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef, c.POINTER[size_t]) +def LLVMGetInlineAsmAsmString(InlineAsmVal:LLVMValueRef, Len:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef, c.POINTER[size_t]) +def LLVMGetInlineAsmConstraintString(InlineAsmVal:LLVMValueRef, Len:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetInlineAsmDialect(InlineAsmVal:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(LLVMTypeRef, LLVMValueRef) +def LLVMGetInlineAsmFunctionType(InlineAsmVal:LLVMValueRef) -> LLVMTypeRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetInlineAsmHasSideEffects(InlineAsmVal:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetInlineAsmNeedsAlignedStack(InlineAsmVal:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetInlineAsmCanUnwind(InlineAsmVal:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMContextRef, LLVMModuleRef) +def LLVMGetModuleContext(M:LLVMModuleRef) -> LLVMContextRef: ... +@dll.bind(LLVMTypeRef, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMGetTypeByName(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char]) -> LLVMTypeRef: ... +class struct_LLVMOpaqueNamedMDNode(c.Struct): pass +LLVMNamedMDNodeRef: TypeAlias = c.POINTER[struct_LLVMOpaqueNamedMDNode] +@dll.bind(LLVMNamedMDNodeRef, LLVMModuleRef) +def LLVMGetFirstNamedMetadata(M:LLVMModuleRef) -> LLVMNamedMDNodeRef: ... +@dll.bind(LLVMNamedMDNodeRef, LLVMModuleRef) +def LLVMGetLastNamedMetadata(M:LLVMModuleRef) -> LLVMNamedMDNodeRef: ... +@dll.bind(LLVMNamedMDNodeRef, LLVMNamedMDNodeRef) +def LLVMGetNextNamedMetadata(NamedMDNode:LLVMNamedMDNodeRef) -> LLVMNamedMDNodeRef: ... +@dll.bind(LLVMNamedMDNodeRef, LLVMNamedMDNodeRef) +def LLVMGetPreviousNamedMetadata(NamedMDNode:LLVMNamedMDNodeRef) -> LLVMNamedMDNodeRef: ... +@dll.bind(LLVMNamedMDNodeRef, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMGetNamedMetadata(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t) -> LLVMNamedMDNodeRef: ... +@dll.bind(LLVMNamedMDNodeRef, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMGetOrInsertNamedMetadata(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t) -> LLVMNamedMDNodeRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMNamedMDNodeRef, c.POINTER[size_t]) +def LLVMGetNamedMetadataName(NamedMD:LLVMNamedMDNodeRef, NameLen:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMGetNamedMetadataNumOperands(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char], c.POINTER[LLVMValueRef]) +def LLVMGetNamedMetadataOperands(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], Dest:c.POINTER[LLVMValueRef]) -> None: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char], LLVMValueRef) +def LLVMAddNamedMetadataOperand(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], Val:LLVMValueRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef, c.POINTER[ctypes.c_uint32]) +def LLVMGetDebugLocDirectory(Val:LLVMValueRef, Length:c.POINTER[ctypes.c_uint32]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef, c.POINTER[ctypes.c_uint32]) +def LLVMGetDebugLocFilename(Val:LLVMValueRef, Length:c.POINTER[ctypes.c_uint32]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetDebugLocLine(Val:LLVMValueRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetDebugLocColumn(Val:LLVMValueRef) -> int: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, c.POINTER[ctypes.c_char], LLVMTypeRef) +def LLVMAddFunction(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], FunctionTy:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMGetNamedFunction(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMGetNamedFunctionWithLength(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], Length:size_t) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef) +def LLVMGetFirstFunction(M:LLVMModuleRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef) +def LLVMGetLastFunction(M:LLVMModuleRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetNextFunction(Fn:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPreviousFunction(Fn:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMSetModuleInlineAsm(M:LLVMModuleRef, Asm:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMGetTypeKind(Ty:LLVMTypeRef) -> ctypes.c_uint32: ... +@dll.bind(LLVMBool, LLVMTypeRef) +def LLVMTypeIsSized(Ty:LLVMTypeRef) -> LLVMBool: ... +@dll.bind(LLVMContextRef, LLVMTypeRef) +def LLVMGetTypeContext(Ty:LLVMTypeRef) -> LLVMContextRef: ... +@dll.bind(None, LLVMTypeRef) +def LLVMDumpType(Val:LLVMTypeRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTypeRef) +def LLVMPrintTypeToString(Val:LLVMTypeRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMInt1TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMInt8TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMInt16TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMInt32TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMInt64TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMInt128TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, ctypes.c_uint32) +def LLVMIntTypeInContext(C:LLVMContextRef, NumBits:int) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMInt1Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMInt8Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMInt16Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMInt32Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMInt64Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMInt128Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, ctypes.c_uint32) +def LLVMIntType(NumBits:int) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMGetIntTypeWidth(IntegerTy:LLVMTypeRef) -> int: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMHalfTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMBFloatTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMFloatTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMDoubleTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMX86FP80TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMFP128TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMPPCFP128TypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMHalfType() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMBFloatType() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMFloatType() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMDoubleType() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMX86FP80Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMFP128Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMPPCFP128Type() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef, c.POINTER[LLVMTypeRef], ctypes.c_uint32, LLVMBool) +def LLVMFunctionType(ReturnType:LLVMTypeRef, ParamTypes:c.POINTER[LLVMTypeRef], ParamCount:int, IsVarArg:LLVMBool) -> LLVMTypeRef: ... +@dll.bind(LLVMBool, LLVMTypeRef) +def LLVMIsFunctionVarArg(FunctionTy:LLVMTypeRef) -> LLVMBool: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef) +def LLVMGetReturnType(FunctionTy:LLVMTypeRef) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMCountParamTypes(FunctionTy:LLVMTypeRef) -> int: ... +@dll.bind(None, LLVMTypeRef, c.POINTER[LLVMTypeRef]) +def LLVMGetParamTypes(FunctionTy:LLVMTypeRef, Dest:c.POINTER[LLVMTypeRef]) -> None: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, c.POINTER[LLVMTypeRef], ctypes.c_uint32, LLVMBool) +def LLVMStructTypeInContext(C:LLVMContextRef, ElementTypes:c.POINTER[LLVMTypeRef], ElementCount:int, Packed:LLVMBool) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, c.POINTER[LLVMTypeRef], ctypes.c_uint32, LLVMBool) +def LLVMStructType(ElementTypes:c.POINTER[LLVMTypeRef], ElementCount:int, Packed:LLVMBool) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, c.POINTER[ctypes.c_char]) +def LLVMStructCreateNamed(C:LLVMContextRef, Name:c.POINTER[ctypes.c_char]) -> LLVMTypeRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTypeRef) +def LLVMGetStructName(Ty:LLVMTypeRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMTypeRef, c.POINTER[LLVMTypeRef], ctypes.c_uint32, LLVMBool) +def LLVMStructSetBody(StructTy:LLVMTypeRef, ElementTypes:c.POINTER[LLVMTypeRef], ElementCount:int, Packed:LLVMBool) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMCountStructElementTypes(StructTy:LLVMTypeRef) -> int: ... +@dll.bind(None, LLVMTypeRef, c.POINTER[LLVMTypeRef]) +def LLVMGetStructElementTypes(StructTy:LLVMTypeRef, Dest:c.POINTER[LLVMTypeRef]) -> None: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef, ctypes.c_uint32) +def LLVMStructGetTypeAtIndex(StructTy:LLVMTypeRef, i:int) -> LLVMTypeRef: ... +@dll.bind(LLVMBool, LLVMTypeRef) +def LLVMIsPackedStruct(StructTy:LLVMTypeRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMTypeRef) +def LLVMIsOpaqueStruct(StructTy:LLVMTypeRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMTypeRef) +def LLVMIsLiteralStruct(StructTy:LLVMTypeRef) -> LLVMBool: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef) +def LLVMGetElementType(Ty:LLVMTypeRef) -> LLVMTypeRef: ... +@dll.bind(None, LLVMTypeRef, c.POINTER[LLVMTypeRef]) +def LLVMGetSubtypes(Tp:LLVMTypeRef, Arr:c.POINTER[LLVMTypeRef]) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMGetNumContainedTypes(Tp:LLVMTypeRef) -> int: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef, ctypes.c_uint32) +def LLVMArrayType(ElementType:LLVMTypeRef, ElementCount:int) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef, uint64_t) +def LLVMArrayType2(ElementType:LLVMTypeRef, ElementCount:uint64_t) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMGetArrayLength(ArrayTy:LLVMTypeRef) -> int: ... +@dll.bind(uint64_t, LLVMTypeRef) +def LLVMGetArrayLength2(ArrayTy:LLVMTypeRef) -> uint64_t: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef, ctypes.c_uint32) +def LLVMPointerType(ElementType:LLVMTypeRef, AddressSpace:int) -> LLVMTypeRef: ... +@dll.bind(LLVMBool, LLVMTypeRef) +def LLVMPointerTypeIsOpaque(Ty:LLVMTypeRef) -> LLVMBool: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, ctypes.c_uint32) +def LLVMPointerTypeInContext(C:LLVMContextRef, AddressSpace:int) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMGetPointerAddressSpace(PointerTy:LLVMTypeRef) -> int: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef, ctypes.c_uint32) +def LLVMVectorType(ElementType:LLVMTypeRef, ElementCount:int) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef, ctypes.c_uint32) +def LLVMScalableVectorType(ElementType:LLVMTypeRef, ElementCount:int) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMGetVectorSize(VectorTy:LLVMTypeRef) -> int: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetConstantPtrAuthPointer(PtrAuth:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetConstantPtrAuthKey(PtrAuth:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetConstantPtrAuthDiscriminator(PtrAuth:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetConstantPtrAuthAddrDiscriminator(PtrAuth:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMVoidTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMLabelTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMX86AMXTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMTokenTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef) +def LLVMMetadataTypeInContext(C:LLVMContextRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMVoidType() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMLabelType() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef) +def LLVMX86AMXType() -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, c.POINTER[ctypes.c_char], c.POINTER[LLVMTypeRef], ctypes.c_uint32, c.POINTER[ctypes.c_uint32], ctypes.c_uint32) +def LLVMTargetExtTypeInContext(C:LLVMContextRef, Name:c.POINTER[ctypes.c_char], TypeParams:c.POINTER[LLVMTypeRef], TypeParamCount:int, IntParams:c.POINTER[ctypes.c_uint32], IntParamCount:int) -> LLVMTypeRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTypeRef) +def LLVMGetTargetExtTypeName(TargetExtTy:LLVMTypeRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMGetTargetExtTypeNumTypeParams(TargetExtTy:LLVMTypeRef) -> int: ... +@dll.bind(LLVMTypeRef, LLVMTypeRef, ctypes.c_uint32) +def LLVMGetTargetExtTypeTypeParam(TargetExtTy:LLVMTypeRef, Idx:int) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def LLVMGetTargetExtTypeNumIntParams(TargetExtTy:LLVMTypeRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef, ctypes.c_uint32) +def LLVMGetTargetExtTypeIntParam(TargetExtTy:LLVMTypeRef, Idx:int) -> int: ... +@dll.bind(LLVMTypeRef, LLVMValueRef) +def LLVMTypeOf(Val:LLVMValueRef) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetValueKind(Val:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef, c.POINTER[size_t]) +def LLVMGetValueName2(Val:LLVMValueRef, Length:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMValueRef, c.POINTER[ctypes.c_char], size_t) +def LLVMSetValueName2(Val:LLVMValueRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t) -> None: ... +@dll.bind(None, LLVMValueRef) +def LLVMDumpValue(Val:LLVMValueRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef) +def LLVMPrintValueToString(Val:LLVMValueRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMContextRef, LLVMValueRef) +def LLVMGetValueContext(Val:LLVMValueRef) -> LLVMContextRef: ... +class struct_LLVMOpaqueDbgRecord(c.Struct): pass +LLVMDbgRecordRef: TypeAlias = c.POINTER[struct_LLVMOpaqueDbgRecord] +@dll.bind(c.POINTER[ctypes.c_char], LLVMDbgRecordRef) +def LLVMPrintDbgRecordToString(Record:LLVMDbgRecordRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMReplaceAllUsesWith(OldVal:LLVMValueRef, NewVal:LLVMValueRef) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsConstant(Val:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsUndef(Val:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsPoison(Val:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAArgument(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsABasicBlock(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAInlineAsm(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAUser(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstant(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsABlockAddress(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantAggregateZero(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantArray(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantDataSequential(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantDataArray(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantDataVector(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantExpr(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantFP(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantInt(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantPointerNull(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantStruct(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantTokenNone(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantVector(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAConstantPtrAuth(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAGlobalValue(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAGlobalAlias(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAGlobalObject(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFunction(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAGlobalVariable(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAGlobalIFunc(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAUndefValue(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAPoisonValue(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAInstruction(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAUnaryOperator(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsABinaryOperator(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACallInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAIntrinsicInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsADbgInfoIntrinsic(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsADbgVariableIntrinsic(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsADbgDeclareInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsADbgLabelInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAMemIntrinsic(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAMemCpyInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAMemMoveInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAMemSetInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACmpInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFCmpInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAICmpInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAExtractElementInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAGetElementPtrInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAInsertElementInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAInsertValueInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsALandingPadInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAPHINode(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsASelectInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAShuffleVectorInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAStoreInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsABranchInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAIndirectBrInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAInvokeInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAReturnInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsASwitchInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAUnreachableInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAResumeInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACleanupReturnInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACatchReturnInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACatchSwitchInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACallBrInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFuncletPadInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACatchPadInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACleanupPadInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAUnaryInstruction(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAAllocaInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsACastInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAAddrSpaceCastInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsABitCastInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFPExtInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFPToSIInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFPToUIInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFPTruncInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAIntToPtrInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAPtrToIntInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsASExtInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsASIToFPInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsATruncInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAUIToFPInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAZExtInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAExtractValueInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsALoadInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAVAArgInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFreezeInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAAtomicCmpXchgInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAAtomicRMWInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAFenceInst(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAMDNode(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAValueAsMetadata(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsAMDString(Val:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef) +def LLVMGetValueName(Val:LLVMValueRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMSetValueName(Val:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> None: ... +class struct_LLVMOpaqueUse(c.Struct): pass +LLVMUseRef: TypeAlias = c.POINTER[struct_LLVMOpaqueUse] +@dll.bind(LLVMUseRef, LLVMValueRef) +def LLVMGetFirstUse(Val:LLVMValueRef) -> LLVMUseRef: ... +@dll.bind(LLVMUseRef, LLVMUseRef) +def LLVMGetNextUse(U:LLVMUseRef) -> LLVMUseRef: ... +@dll.bind(LLVMValueRef, LLVMUseRef) +def LLVMGetUser(U:LLVMUseRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMUseRef) +def LLVMGetUsedValue(U:LLVMUseRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetOperand(Val:LLVMValueRef, Index:int) -> LLVMValueRef: ... +@dll.bind(LLVMUseRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetOperandUse(Val:LLVMValueRef, Index:int) -> LLVMUseRef: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32, LLVMValueRef) +def LLVMSetOperand(User:LLVMValueRef, Index:int, Val:LLVMValueRef) -> None: ... +@dll.bind(ctypes.c_int32, LLVMValueRef) +def LLVMGetNumOperands(Val:LLVMValueRef) -> int: ... +@dll.bind(LLVMValueRef, LLVMTypeRef) +def LLVMConstNull(Ty:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef) +def LLVMConstAllOnes(Ty:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef) +def LLVMGetUndef(Ty:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef) +def LLVMGetPoison(Ty:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsNull(Val:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMValueRef, LLVMTypeRef) +def LLVMConstPointerNull(Ty:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, ctypes.c_uint64, LLVMBool) +def LLVMConstInt(IntTy:LLVMTypeRef, N:int, SignExtend:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, ctypes.c_uint32, c.Array[uint64_t, Literal[0]]) +def LLVMConstIntOfArbitraryPrecision(IntTy:LLVMTypeRef, NumWords:int, Words:c.Array[uint64_t, Literal[0]]) -> LLVMValueRef: ... +uint8_t: TypeAlias = ctypes.c_ubyte +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char], uint8_t) +def LLVMConstIntOfString(IntTy:LLVMTypeRef, Text:c.POINTER[ctypes.c_char], Radix:uint8_t) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char], ctypes.c_uint32, uint8_t) +def LLVMConstIntOfStringAndSize(IntTy:LLVMTypeRef, Text:c.POINTER[ctypes.c_char], SLen:int, Radix:uint8_t) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, ctypes.c_double) +def LLVMConstReal(RealTy:LLVMTypeRef, N:float) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMConstRealOfString(RealTy:LLVMTypeRef, Text:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMConstRealOfStringAndSize(RealTy:LLVMTypeRef, Text:c.POINTER[ctypes.c_char], SLen:int) -> LLVMValueRef: ... +@dll.bind(ctypes.c_uint64, LLVMValueRef) +def LLVMConstIntGetZExtValue(ConstantVal:LLVMValueRef) -> int: ... +@dll.bind(ctypes.c_int64, LLVMValueRef) +def LLVMConstIntGetSExtValue(ConstantVal:LLVMValueRef) -> int: ... +@dll.bind(ctypes.c_double, LLVMValueRef, c.POINTER[LLVMBool]) +def LLVMConstRealGetDouble(ConstantVal:LLVMValueRef, losesInfo:c.POINTER[LLVMBool]) -> float: ... +@dll.bind(LLVMValueRef, LLVMContextRef, c.POINTER[ctypes.c_char], ctypes.c_uint32, LLVMBool) +def LLVMConstStringInContext(C:LLVMContextRef, Str:c.POINTER[ctypes.c_char], Length:int, DontNullTerminate:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMContextRef, c.POINTER[ctypes.c_char], size_t, LLVMBool) +def LLVMConstStringInContext2(C:LLVMContextRef, Str:c.POINTER[ctypes.c_char], Length:size_t, DontNullTerminate:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[ctypes.c_char], ctypes.c_uint32, LLVMBool) +def LLVMConstString(Str:c.POINTER[ctypes.c_char], Length:int, DontNullTerminate:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsConstantString(c:LLVMValueRef) -> LLVMBool: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef, c.POINTER[size_t]) +def LLVMGetAsString(c:LLVMValueRef, Length:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMValueRef, LLVMContextRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, LLVMBool) +def LLVMConstStructInContext(C:LLVMContextRef, ConstantVals:c.POINTER[LLVMValueRef], Count:int, Packed:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, LLVMBool) +def LLVMConstStruct(ConstantVals:c.POINTER[LLVMValueRef], Count:int, Packed:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMConstArray(ElementTy:LLVMTypeRef, ConstantVals:c.POINTER[LLVMValueRef], Length:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[LLVMValueRef], uint64_t) +def LLVMConstArray2(ElementTy:LLVMTypeRef, ConstantVals:c.POINTER[LLVMValueRef], Length:uint64_t) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMConstNamedStruct(StructTy:LLVMTypeRef, ConstantVals:c.POINTER[LLVMValueRef], Count:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetAggregateElement(C:LLVMValueRef, Idx:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetElementAsConstant(C:LLVMValueRef, idx:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMConstVector(ScalarConstantVals:c.POINTER[LLVMValueRef], Size:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstantPtrAuth(Ptr:LLVMValueRef, Key:LLVMValueRef, Disc:LLVMValueRef, AddrDisc:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetConstOpcode(ConstantVal:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(LLVMValueRef, LLVMTypeRef) +def LLVMAlignOf(Ty:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef) +def LLVMSizeOf(Ty:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMConstNeg(ConstantVal:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMConstNSWNeg(ConstantVal:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMConstNUWNeg(ConstantVal:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMConstNot(ConstantVal:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstAdd(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstNSWAdd(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstNUWAdd(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstSub(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstNSWSub(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstNUWSub(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstMul(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstNSWMul(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstNUWMul(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstXor(LHSConstant:LLVMValueRef, RHSConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMConstGEP2(Ty:LLVMTypeRef, ConstantVal:LLVMValueRef, ConstantIndices:c.POINTER[LLVMValueRef], NumIndices:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMConstInBoundsGEP2(Ty:LLVMTypeRef, ConstantVal:LLVMValueRef, ConstantIndices:c.POINTER[LLVMValueRef], NumIndices:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, LLVMGEPNoWrapFlags) +def LLVMConstGEPWithNoWrapFlags(Ty:LLVMTypeRef, ConstantVal:LLVMValueRef, ConstantIndices:c.POINTER[LLVMValueRef], NumIndices:int, NoWrapFlags:LLVMGEPNoWrapFlags) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMTypeRef) +def LLVMConstTrunc(ConstantVal:LLVMValueRef, ToType:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMTypeRef) +def LLVMConstPtrToInt(ConstantVal:LLVMValueRef, ToType:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMTypeRef) +def LLVMConstIntToPtr(ConstantVal:LLVMValueRef, ToType:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMTypeRef) +def LLVMConstBitCast(ConstantVal:LLVMValueRef, ToType:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMTypeRef) +def LLVMConstAddrSpaceCast(ConstantVal:LLVMValueRef, ToType:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMTypeRef) +def LLVMConstTruncOrBitCast(ConstantVal:LLVMValueRef, ToType:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMTypeRef) +def LLVMConstPointerCast(ConstantVal:LLVMValueRef, ToType:LLVMTypeRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstExtractElement(VectorConstant:LLVMValueRef, IndexConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstInsertElement(VectorConstant:LLVMValueRef, ElementValueConstant:LLVMValueRef, IndexConstant:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMValueRef, LLVMValueRef) +def LLVMConstShuffleVector(VectorAConstant:LLVMValueRef, VectorBConstant:LLVMValueRef, MaskConstant:LLVMValueRef) -> LLVMValueRef: ... +class struct_LLVMOpaqueBasicBlock(c.Struct): pass +LLVMBasicBlockRef: TypeAlias = c.POINTER[struct_LLVMOpaqueBasicBlock] +@dll.bind(LLVMValueRef, LLVMValueRef, LLVMBasicBlockRef) +def LLVMBlockAddress(F:LLVMValueRef, BB:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetBlockAddressFunction(BlockAddr:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetBlockAddressBasicBlock(BlockAddr:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], LLVMBool, LLVMBool) +def LLVMConstInlineAsm(Ty:LLVMTypeRef, AsmString:c.POINTER[ctypes.c_char], Constraints:c.POINTER[ctypes.c_char], HasSideEffects:LLVMBool, IsAlignStack:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMModuleRef, LLVMValueRef) +def LLVMGetGlobalParent(Global:LLVMValueRef) -> LLVMModuleRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsDeclaration(Global:LLVMValueRef) -> LLVMBool: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetLinkage(Global:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetLinkage(Global:LLVMValueRef, Linkage:ctypes.c_uint32) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef) +def LLVMGetSection(Global:LLVMValueRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMSetSection(Global:LLVMValueRef, Section:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetVisibility(Global:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetVisibility(Global:LLVMValueRef, Viz:ctypes.c_uint32) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetDLLStorageClass(Global:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetDLLStorageClass(Global:LLVMValueRef, Class:ctypes.c_uint32) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetUnnamedAddress(Global:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetUnnamedAddress(Global:LLVMValueRef, UnnamedAddr:ctypes.c_uint32) -> None: ... +@dll.bind(LLVMTypeRef, LLVMValueRef) +def LLVMGlobalGetValueType(Global:LLVMValueRef) -> LLVMTypeRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMHasUnnamedAddr(Global:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetUnnamedAddr(Global:LLVMValueRef, HasUnnamedAddr:LLVMBool) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetAlignment(V:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetAlignment(V:LLVMValueRef, Bytes:int) -> None: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32, LLVMMetadataRef) +def LLVMGlobalSetMetadata(Global:LLVMValueRef, Kind:int, MD:LLVMMetadataRef) -> None: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMGlobalEraseMetadata(Global:LLVMValueRef, Kind:int) -> None: ... +@dll.bind(None, LLVMValueRef) +def LLVMGlobalClearMetadata(Global:LLVMValueRef) -> None: ... +class struct_LLVMOpaqueValueMetadataEntry(c.Struct): pass +LLVMValueMetadataEntry: TypeAlias = struct_LLVMOpaqueValueMetadataEntry +@dll.bind(c.POINTER[LLVMValueMetadataEntry], LLVMValueRef, c.POINTER[size_t]) +def LLVMGlobalCopyAllMetadata(Value:LLVMValueRef, NumEntries:c.POINTER[size_t]) -> c.POINTER[LLVMValueMetadataEntry]: ... +@dll.bind(None, c.POINTER[LLVMValueMetadataEntry]) +def LLVMDisposeValueMetadataEntries(Entries:c.POINTER[LLVMValueMetadataEntry]) -> None: ... +@dll.bind(ctypes.c_uint32, c.POINTER[LLVMValueMetadataEntry], ctypes.c_uint32) +def LLVMValueMetadataEntriesGetKind(Entries:c.POINTER[LLVMValueMetadataEntry], Index:int) -> int: ... +@dll.bind(LLVMMetadataRef, c.POINTER[LLVMValueMetadataEntry], ctypes.c_uint32) +def LLVMValueMetadataEntriesGetMetadata(Entries:c.POINTER[LLVMValueMetadataEntry], Index:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMAddGlobal(M:LLVMModuleRef, Ty:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, LLVMTypeRef, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMAddGlobalInAddressSpace(M:LLVMModuleRef, Ty:LLVMTypeRef, Name:c.POINTER[ctypes.c_char], AddressSpace:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, c.POINTER[ctypes.c_char]) +def LLVMGetNamedGlobal(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMGetNamedGlobalWithLength(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], Length:size_t) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef) +def LLVMGetFirstGlobal(M:LLVMModuleRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef) +def LLVMGetLastGlobal(M:LLVMModuleRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetNextGlobal(GlobalVar:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPreviousGlobal(GlobalVar:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef) +def LLVMDeleteGlobal(GlobalVar:LLVMValueRef) -> None: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetInitializer(GlobalVar:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMSetInitializer(GlobalVar:LLVMValueRef, ConstantVal:LLVMValueRef) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsThreadLocal(GlobalVar:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetThreadLocal(GlobalVar:LLVMValueRef, IsThreadLocal:LLVMBool) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsGlobalConstant(GlobalVar:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetGlobalConstant(GlobalVar:LLVMValueRef, IsConstant:LLVMBool) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetThreadLocalMode(GlobalVar:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetThreadLocalMode(GlobalVar:LLVMValueRef, Mode:ctypes.c_uint32) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsExternallyInitialized(GlobalVar:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetExternallyInitialized(GlobalVar:LLVMValueRef, IsExtInit:LLVMBool) -> None: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, LLVMTypeRef, ctypes.c_uint32, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMAddAlias2(M:LLVMModuleRef, ValueTy:LLVMTypeRef, AddrSpace:int, Aliasee:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMGetNamedGlobalAlias(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef) +def LLVMGetFirstGlobalAlias(M:LLVMModuleRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef) +def LLVMGetLastGlobalAlias(M:LLVMModuleRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetNextGlobalAlias(GA:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPreviousGlobalAlias(GA:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMAliasGetAliasee(Alias:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMAliasSetAliasee(Alias:LLVMValueRef, Aliasee:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMValueRef) +def LLVMDeleteFunction(Fn:LLVMValueRef) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMHasPersonalityFn(Fn:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPersonalityFn(Fn:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMSetPersonalityFn(Fn:LLVMValueRef, PersonalityFn:LLVMValueRef) -> None: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t) +def LLVMLookupIntrinsicID(Name:c.POINTER[ctypes.c_char], NameLen:size_t) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetIntrinsicID(Fn:LLVMValueRef) -> int: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, ctypes.c_uint32, c.POINTER[LLVMTypeRef], size_t) +def LLVMGetIntrinsicDeclaration(Mod:LLVMModuleRef, ID:int, ParamTypes:c.POINTER[LLVMTypeRef], ParamCount:size_t) -> LLVMValueRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, ctypes.c_uint32, c.POINTER[LLVMTypeRef], size_t) +def LLVMIntrinsicGetType(Ctx:LLVMContextRef, ID:int, ParamTypes:c.POINTER[LLVMTypeRef], ParamCount:size_t) -> LLVMTypeRef: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[size_t]) +def LLVMIntrinsicGetName(ID:int, NameLength:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[LLVMTypeRef], size_t, c.POINTER[size_t]) +def LLVMIntrinsicCopyOverloadedName(ID:int, ParamTypes:c.POINTER[LLVMTypeRef], ParamCount:size_t, NameLength:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMModuleRef, ctypes.c_uint32, c.POINTER[LLVMTypeRef], size_t, c.POINTER[size_t]) +def LLVMIntrinsicCopyOverloadedName2(Mod:LLVMModuleRef, ID:int, ParamTypes:c.POINTER[LLVMTypeRef], ParamCount:size_t, NameLength:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMBool, ctypes.c_uint32) +def LLVMIntrinsicIsOverloaded(ID:int) -> LLVMBool: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetFunctionCallConv(Fn:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetFunctionCallConv(Fn:LLVMValueRef, CC:int) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef) +def LLVMGetGC(Fn:LLVMValueRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMSetGC(Fn:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPrefixData(Fn:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMHasPrefixData(Fn:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMSetPrefixData(Fn:LLVMValueRef, prefixData:LLVMValueRef) -> None: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPrologueData(Fn:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMHasPrologueData(Fn:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMSetPrologueData(Fn:LLVMValueRef, prologueData:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, LLVMAttributeRef) +def LLVMAddAttributeAtIndex(F:LLVMValueRef, Idx:LLVMAttributeIndex, A:LLVMAttributeRef) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef, LLVMAttributeIndex) +def LLVMGetAttributeCountAtIndex(F:LLVMValueRef, Idx:LLVMAttributeIndex) -> int: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, c.POINTER[LLVMAttributeRef]) +def LLVMGetAttributesAtIndex(F:LLVMValueRef, Idx:LLVMAttributeIndex, Attrs:c.POINTER[LLVMAttributeRef]) -> None: ... +@dll.bind(LLVMAttributeRef, LLVMValueRef, LLVMAttributeIndex, ctypes.c_uint32) +def LLVMGetEnumAttributeAtIndex(F:LLVMValueRef, Idx:LLVMAttributeIndex, KindID:int) -> LLVMAttributeRef: ... +@dll.bind(LLVMAttributeRef, LLVMValueRef, LLVMAttributeIndex, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMGetStringAttributeAtIndex(F:LLVMValueRef, Idx:LLVMAttributeIndex, K:c.POINTER[ctypes.c_char], KLen:int) -> LLVMAttributeRef: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, ctypes.c_uint32) +def LLVMRemoveEnumAttributeAtIndex(F:LLVMValueRef, Idx:LLVMAttributeIndex, KindID:int) -> None: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMRemoveStringAttributeAtIndex(F:LLVMValueRef, Idx:LLVMAttributeIndex, K:c.POINTER[ctypes.c_char], KLen:int) -> None: ... +@dll.bind(None, LLVMValueRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def LLVMAddTargetDependentFunctionAttr(Fn:LLVMValueRef, A:c.POINTER[ctypes.c_char], V:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMCountParams(Fn:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, c.POINTER[LLVMValueRef]) +def LLVMGetParams(Fn:LLVMValueRef, Params:c.POINTER[LLVMValueRef]) -> None: ... +@dll.bind(LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetParam(Fn:LLVMValueRef, Index:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetParamParent(Inst:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetFirstParam(Fn:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetLastParam(Fn:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetNextParam(Arg:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPreviousParam(Arg:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetParamAlignment(Arg:LLVMValueRef, Align:int) -> None: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t, LLVMTypeRef, ctypes.c_uint32, LLVMValueRef) +def LLVMAddGlobalIFunc(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, Ty:LLVMTypeRef, AddrSpace:int, Resolver:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef, c.POINTER[ctypes.c_char], size_t) +def LLVMGetNamedGlobalIFunc(M:LLVMModuleRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef) +def LLVMGetFirstGlobalIFunc(M:LLVMModuleRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMModuleRef) +def LLVMGetLastGlobalIFunc(M:LLVMModuleRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetNextGlobalIFunc(IFunc:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPreviousGlobalIFunc(IFunc:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetGlobalIFuncResolver(IFunc:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMSetGlobalIFuncResolver(IFunc:LLVMValueRef, Resolver:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMValueRef) +def LLVMEraseGlobalIFunc(IFunc:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMValueRef) +def LLVMRemoveGlobalIFunc(IFunc:LLVMValueRef) -> None: ... +@dll.bind(LLVMMetadataRef, LLVMContextRef, c.POINTER[ctypes.c_char], size_t) +def LLVMMDStringInContext2(C:LLVMContextRef, Str:c.POINTER[ctypes.c_char], SLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMContextRef, c.POINTER[LLVMMetadataRef], size_t) +def LLVMMDNodeInContext2(C:LLVMContextRef, MDs:c.POINTER[LLVMMetadataRef], Count:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMValueRef, LLVMContextRef, LLVMMetadataRef) +def LLVMMetadataAsValue(C:LLVMContextRef, MD:LLVMMetadataRef) -> LLVMValueRef: ... +@dll.bind(LLVMMetadataRef, LLVMValueRef) +def LLVMValueAsMetadata(Val:LLVMValueRef) -> LLVMMetadataRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMValueRef, c.POINTER[ctypes.c_uint32]) +def LLVMGetMDString(V:LLVMValueRef, Length:c.POINTER[ctypes.c_uint32]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetMDNodeNumOperands(V:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, c.POINTER[LLVMValueRef]) +def LLVMGetMDNodeOperands(V:LLVMValueRef, Dest:c.POINTER[LLVMValueRef]) -> None: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32, LLVMMetadataRef) +def LLVMReplaceMDNodeOperandWith(V:LLVMValueRef, Index:int, Replacement:LLVMMetadataRef) -> None: ... +@dll.bind(LLVMValueRef, LLVMContextRef, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMMDStringInContext(C:LLVMContextRef, Str:c.POINTER[ctypes.c_char], SLen:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMMDString(Str:c.POINTER[ctypes.c_char], SLen:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMContextRef, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMMDNodeInContext(C:LLVMContextRef, Vals:c.POINTER[LLVMValueRef], Count:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMMDNode(Vals:c.POINTER[LLVMValueRef], Count:int) -> LLVMValueRef: ... +class struct_LLVMOpaqueOperandBundle(c.Struct): pass +LLVMOperandBundleRef: TypeAlias = c.POINTER[struct_LLVMOpaqueOperandBundle] +@dll.bind(LLVMOperandBundleRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMCreateOperandBundle(Tag:c.POINTER[ctypes.c_char], TagLen:size_t, Args:c.POINTER[LLVMValueRef], NumArgs:int) -> LLVMOperandBundleRef: ... +@dll.bind(None, LLVMOperandBundleRef) +def LLVMDisposeOperandBundle(Bundle:LLVMOperandBundleRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMOperandBundleRef, c.POINTER[size_t]) +def LLVMGetOperandBundleTag(Bundle:LLVMOperandBundleRef, Len:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, LLVMOperandBundleRef) +def LLVMGetNumOperandBundleArgs(Bundle:LLVMOperandBundleRef) -> int: ... +@dll.bind(LLVMValueRef, LLVMOperandBundleRef, ctypes.c_uint32) +def LLVMGetOperandBundleArgAtIndex(Bundle:LLVMOperandBundleRef, Index:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBasicBlockRef) +def LLVMBasicBlockAsValue(BB:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMValueIsBasicBlock(Val:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMValueAsBasicBlock(Val:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMBasicBlockRef) +def LLVMGetBasicBlockName(BB:LLVMBasicBlockRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMValueRef, LLVMBasicBlockRef) +def LLVMGetBasicBlockParent(BB:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBasicBlockRef) +def LLVMGetBasicBlockTerminator(BB:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMCountBasicBlocks(Fn:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, c.POINTER[LLVMBasicBlockRef]) +def LLVMGetBasicBlocks(Fn:LLVMValueRef, BasicBlocks:c.POINTER[LLVMBasicBlockRef]) -> None: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetFirstBasicBlock(Fn:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetLastBasicBlock(Fn:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMBasicBlockRef) +def LLVMGetNextBasicBlock(BB:LLVMBasicBlockRef) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMBasicBlockRef) +def LLVMGetPreviousBasicBlock(BB:LLVMBasicBlockRef) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetEntryBasicBlock(Fn:LLVMValueRef) -> LLVMBasicBlockRef: ... +class struct_LLVMOpaqueBuilder(c.Struct): pass +LLVMBuilderRef: TypeAlias = c.POINTER[struct_LLVMOpaqueBuilder] +@dll.bind(None, LLVMBuilderRef, LLVMBasicBlockRef) +def LLVMInsertExistingBasicBlockAfterInsertBlock(Builder:LLVMBuilderRef, BB:LLVMBasicBlockRef) -> None: ... +@dll.bind(None, LLVMValueRef, LLVMBasicBlockRef) +def LLVMAppendExistingBasicBlock(Fn:LLVMValueRef, BB:LLVMBasicBlockRef) -> None: ... +@dll.bind(LLVMBasicBlockRef, LLVMContextRef, c.POINTER[ctypes.c_char]) +def LLVMCreateBasicBlockInContext(C:LLVMContextRef, Name:c.POINTER[ctypes.c_char]) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMContextRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMAppendBasicBlockInContext(C:LLVMContextRef, Fn:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMAppendBasicBlock(Fn:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMContextRef, LLVMBasicBlockRef, c.POINTER[ctypes.c_char]) +def LLVMInsertBasicBlockInContext(C:LLVMContextRef, BB:LLVMBasicBlockRef, Name:c.POINTER[ctypes.c_char]) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMBasicBlockRef, c.POINTER[ctypes.c_char]) +def LLVMInsertBasicBlock(InsertBeforeBB:LLVMBasicBlockRef, Name:c.POINTER[ctypes.c_char]) -> LLVMBasicBlockRef: ... +@dll.bind(None, LLVMBasicBlockRef) +def LLVMDeleteBasicBlock(BB:LLVMBasicBlockRef) -> None: ... +@dll.bind(None, LLVMBasicBlockRef) +def LLVMRemoveBasicBlockFromParent(BB:LLVMBasicBlockRef) -> None: ... +@dll.bind(None, LLVMBasicBlockRef, LLVMBasicBlockRef) +def LLVMMoveBasicBlockBefore(BB:LLVMBasicBlockRef, MovePos:LLVMBasicBlockRef) -> None: ... +@dll.bind(None, LLVMBasicBlockRef, LLVMBasicBlockRef) +def LLVMMoveBasicBlockAfter(BB:LLVMBasicBlockRef, MovePos:LLVMBasicBlockRef) -> None: ... +@dll.bind(LLVMValueRef, LLVMBasicBlockRef) +def LLVMGetFirstInstruction(BB:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBasicBlockRef) +def LLVMGetLastInstruction(BB:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(ctypes.c_int32, LLVMValueRef) +def LLVMHasMetadata(Val:LLVMValueRef) -> int: ... +@dll.bind(LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetMetadata(Val:LLVMValueRef, KindID:int) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32, LLVMValueRef) +def LLVMSetMetadata(Val:LLVMValueRef, KindID:int, Node:LLVMValueRef) -> None: ... +@dll.bind(c.POINTER[LLVMValueMetadataEntry], LLVMValueRef, c.POINTER[size_t]) +def LLVMInstructionGetAllMetadataOtherThanDebugLoc(Instr:LLVMValueRef, NumEntries:c.POINTER[size_t]) -> c.POINTER[LLVMValueMetadataEntry]: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetInstructionParent(Inst:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetNextInstruction(Inst:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetPreviousInstruction(Inst:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef) +def LLVMInstructionRemoveFromParent(Inst:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMValueRef) +def LLVMInstructionEraseFromParent(Inst:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMValueRef) +def LLVMDeleteInstruction(Inst:LLVMValueRef) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetInstructionOpcode(Inst:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetICmpPredicate(Inst:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetFCmpPredicate(Inst:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMInstructionClone(Inst:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMIsATerminatorInst(Inst:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMValueRef) +def LLVMGetFirstDbgRecord(Inst:LLVMValueRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMValueRef) +def LLVMGetLastDbgRecord(Inst:LLVMValueRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMDbgRecordRef) +def LLVMGetNextDbgRecord(DbgRecord:LLVMDbgRecordRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMDbgRecordRef) +def LLVMGetPreviousDbgRecord(DbgRecord:LLVMDbgRecordRef) -> LLVMDbgRecordRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetNumArgOperands(Instr:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetInstructionCallConv(Instr:LLVMValueRef, CC:int) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetInstructionCallConv(Instr:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, ctypes.c_uint32) +def LLVMSetInstrParamAlignment(Instr:LLVMValueRef, Idx:LLVMAttributeIndex, Align:int) -> None: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, LLVMAttributeRef) +def LLVMAddCallSiteAttribute(C:LLVMValueRef, Idx:LLVMAttributeIndex, A:LLVMAttributeRef) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef, LLVMAttributeIndex) +def LLVMGetCallSiteAttributeCount(C:LLVMValueRef, Idx:LLVMAttributeIndex) -> int: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, c.POINTER[LLVMAttributeRef]) +def LLVMGetCallSiteAttributes(C:LLVMValueRef, Idx:LLVMAttributeIndex, Attrs:c.POINTER[LLVMAttributeRef]) -> None: ... +@dll.bind(LLVMAttributeRef, LLVMValueRef, LLVMAttributeIndex, ctypes.c_uint32) +def LLVMGetCallSiteEnumAttribute(C:LLVMValueRef, Idx:LLVMAttributeIndex, KindID:int) -> LLVMAttributeRef: ... +@dll.bind(LLVMAttributeRef, LLVMValueRef, LLVMAttributeIndex, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMGetCallSiteStringAttribute(C:LLVMValueRef, Idx:LLVMAttributeIndex, K:c.POINTER[ctypes.c_char], KLen:int) -> LLVMAttributeRef: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, ctypes.c_uint32) +def LLVMRemoveCallSiteEnumAttribute(C:LLVMValueRef, Idx:LLVMAttributeIndex, KindID:int) -> None: ... +@dll.bind(None, LLVMValueRef, LLVMAttributeIndex, c.POINTER[ctypes.c_char], ctypes.c_uint32) +def LLVMRemoveCallSiteStringAttribute(C:LLVMValueRef, Idx:LLVMAttributeIndex, K:c.POINTER[ctypes.c_char], KLen:int) -> None: ... +@dll.bind(LLVMTypeRef, LLVMValueRef) +def LLVMGetCalledFunctionType(C:LLVMValueRef) -> LLVMTypeRef: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetCalledValue(Instr:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetNumOperandBundles(C:LLVMValueRef) -> int: ... +@dll.bind(LLVMOperandBundleRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetOperandBundleAtIndex(C:LLVMValueRef, Index:int) -> LLVMOperandBundleRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsTailCall(CallInst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetTailCall(CallInst:LLVMValueRef, IsTailCall:LLVMBool) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetTailCallKind(CallInst:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetTailCallKind(CallInst:LLVMValueRef, kind:ctypes.c_uint32) -> None: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetNormalDest(InvokeInst:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetUnwindDest(InvokeInst:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(None, LLVMValueRef, LLVMBasicBlockRef) +def LLVMSetNormalDest(InvokeInst:LLVMValueRef, B:LLVMBasicBlockRef) -> None: ... +@dll.bind(None, LLVMValueRef, LLVMBasicBlockRef) +def LLVMSetUnwindDest(InvokeInst:LLVMValueRef, B:LLVMBasicBlockRef) -> None: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetCallBrDefaultDest(CallBr:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetCallBrNumIndirectDests(CallBr:LLVMValueRef) -> int: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetCallBrIndirectDest(CallBr:LLVMValueRef, Idx:int) -> LLVMBasicBlockRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetNumSuccessors(Term:LLVMValueRef) -> int: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetSuccessor(Term:LLVMValueRef, i:int) -> LLVMBasicBlockRef: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32, LLVMBasicBlockRef) +def LLVMSetSuccessor(Term:LLVMValueRef, i:int, block:LLVMBasicBlockRef) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsConditional(Branch:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetCondition(Branch:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMSetCondition(Branch:LLVMValueRef, Cond:LLVMValueRef) -> None: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef) +def LLVMGetSwitchDefaultDest(SwitchInstr:LLVMValueRef) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMTypeRef, LLVMValueRef) +def LLVMGetAllocatedType(Alloca:LLVMValueRef) -> LLVMTypeRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsInBounds(GEP:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetIsInBounds(GEP:LLVMValueRef, InBounds:LLVMBool) -> None: ... +@dll.bind(LLVMTypeRef, LLVMValueRef) +def LLVMGetGEPSourceElementType(GEP:LLVMValueRef) -> LLVMTypeRef: ... +@dll.bind(LLVMGEPNoWrapFlags, LLVMValueRef) +def LLVMGEPGetNoWrapFlags(GEP:LLVMValueRef) -> LLVMGEPNoWrapFlags: ... +@dll.bind(None, LLVMValueRef, LLVMGEPNoWrapFlags) +def LLVMGEPSetNoWrapFlags(GEP:LLVMValueRef, NoWrapFlags:LLVMGEPNoWrapFlags) -> None: ... +@dll.bind(None, LLVMValueRef, c.POINTER[LLVMValueRef], c.POINTER[LLVMBasicBlockRef], ctypes.c_uint32) +def LLVMAddIncoming(PhiNode:LLVMValueRef, IncomingValues:c.POINTER[LLVMValueRef], IncomingBlocks:c.POINTER[LLVMBasicBlockRef], Count:int) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMCountIncoming(PhiNode:LLVMValueRef) -> int: ... +@dll.bind(LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetIncomingValue(PhiNode:LLVMValueRef, Index:int) -> LLVMValueRef: ... +@dll.bind(LLVMBasicBlockRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetIncomingBlock(PhiNode:LLVMValueRef, Index:int) -> LLVMBasicBlockRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetNumIndices(Inst:LLVMValueRef) -> int: ... +@dll.bind(c.POINTER[ctypes.c_uint32], LLVMValueRef) +def LLVMGetIndices(Inst:LLVMValueRef) -> c.POINTER[ctypes.c_uint32]: ... +@dll.bind(LLVMBuilderRef, LLVMContextRef) +def LLVMCreateBuilderInContext(C:LLVMContextRef) -> LLVMBuilderRef: ... +@dll.bind(LLVMBuilderRef) +def LLVMCreateBuilder() -> LLVMBuilderRef: ... +@dll.bind(None, LLVMBuilderRef, LLVMBasicBlockRef, LLVMValueRef) +def LLVMPositionBuilder(Builder:LLVMBuilderRef, Block:LLVMBasicBlockRef, Instr:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMBasicBlockRef, LLVMValueRef) +def LLVMPositionBuilderBeforeDbgRecords(Builder:LLVMBuilderRef, Block:LLVMBasicBlockRef, Inst:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef) +def LLVMPositionBuilderBefore(Builder:LLVMBuilderRef, Instr:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef) +def LLVMPositionBuilderBeforeInstrAndDbgRecords(Builder:LLVMBuilderRef, Instr:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMBasicBlockRef) +def LLVMPositionBuilderAtEnd(Builder:LLVMBuilderRef, Block:LLVMBasicBlockRef) -> None: ... +@dll.bind(LLVMBasicBlockRef, LLVMBuilderRef) +def LLVMGetInsertBlock(Builder:LLVMBuilderRef) -> LLVMBasicBlockRef: ... +@dll.bind(None, LLVMBuilderRef) +def LLVMClearInsertionPosition(Builder:LLVMBuilderRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef) +def LLVMInsertIntoBuilder(Builder:LLVMBuilderRef, Instr:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMInsertIntoBuilderWithName(Builder:LLVMBuilderRef, Instr:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, LLVMBuilderRef) +def LLVMDisposeBuilder(Builder:LLVMBuilderRef) -> None: ... +@dll.bind(LLVMMetadataRef, LLVMBuilderRef) +def LLVMGetCurrentDebugLocation2(Builder:LLVMBuilderRef) -> LLVMMetadataRef: ... +@dll.bind(None, LLVMBuilderRef, LLVMMetadataRef) +def LLVMSetCurrentDebugLocation2(Builder:LLVMBuilderRef, Loc:LLVMMetadataRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef) +def LLVMSetInstDebugLocation(Builder:LLVMBuilderRef, Inst:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef) +def LLVMAddMetadataToInst(Builder:LLVMBuilderRef, Inst:LLVMValueRef) -> None: ... +@dll.bind(LLVMMetadataRef, LLVMBuilderRef) +def LLVMBuilderGetDefaultFPMathTag(Builder:LLVMBuilderRef) -> LLVMMetadataRef: ... +@dll.bind(None, LLVMBuilderRef, LLVMMetadataRef) +def LLVMBuilderSetDefaultFPMathTag(Builder:LLVMBuilderRef, FPMathTag:LLVMMetadataRef) -> None: ... +@dll.bind(LLVMContextRef, LLVMBuilderRef) +def LLVMGetBuilderContext(Builder:LLVMBuilderRef) -> LLVMContextRef: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef) +def LLVMSetCurrentDebugLocation(Builder:LLVMBuilderRef, L:LLVMValueRef) -> None: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef) +def LLVMGetCurrentDebugLocation(Builder:LLVMBuilderRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef) +def LLVMBuildRetVoid(_0:LLVMBuilderRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef) +def LLVMBuildRet(_0:LLVMBuilderRef, V:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, c.POINTER[LLVMValueRef], ctypes.c_uint32) +def LLVMBuildAggregateRet(_0:LLVMBuilderRef, RetVals:c.POINTER[LLVMValueRef], N:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMBasicBlockRef) +def LLVMBuildBr(_0:LLVMBuilderRef, Dest:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMBasicBlockRef, LLVMBasicBlockRef) +def LLVMBuildCondBr(_0:LLVMBuilderRef, If:LLVMValueRef, Then:LLVMBasicBlockRef, Else:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMBasicBlockRef, ctypes.c_uint32) +def LLVMBuildSwitch(_0:LLVMBuilderRef, V:LLVMValueRef, Else:LLVMBasicBlockRef, NumCases:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, ctypes.c_uint32) +def LLVMBuildIndirectBr(B:LLVMBuilderRef, Addr:LLVMValueRef, NumDests:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, LLVMBasicBlockRef, c.POINTER[LLVMBasicBlockRef], ctypes.c_uint32, c.POINTER[LLVMValueRef], ctypes.c_uint32, c.POINTER[LLVMOperandBundleRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildCallBr(B:LLVMBuilderRef, Ty:LLVMTypeRef, Fn:LLVMValueRef, DefaultDest:LLVMBasicBlockRef, IndirectDests:c.POINTER[LLVMBasicBlockRef], NumIndirectDests:int, Args:c.POINTER[LLVMValueRef], NumArgs:int, Bundles:c.POINTER[LLVMOperandBundleRef], NumBundles:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, LLVMBasicBlockRef, LLVMBasicBlockRef, c.POINTER[ctypes.c_char]) +def LLVMBuildInvoke2(_0:LLVMBuilderRef, Ty:LLVMTypeRef, Fn:LLVMValueRef, Args:c.POINTER[LLVMValueRef], NumArgs:int, Then:LLVMBasicBlockRef, Catch:LLVMBasicBlockRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, LLVMBasicBlockRef, LLVMBasicBlockRef, c.POINTER[LLVMOperandBundleRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildInvokeWithOperandBundles(_0:LLVMBuilderRef, Ty:LLVMTypeRef, Fn:LLVMValueRef, Args:c.POINTER[LLVMValueRef], NumArgs:int, Then:LLVMBasicBlockRef, Catch:LLVMBasicBlockRef, Bundles:c.POINTER[LLVMOperandBundleRef], NumBundles:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef) +def LLVMBuildUnreachable(_0:LLVMBuilderRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef) +def LLVMBuildResume(B:LLVMBuilderRef, Exn:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildLandingPad(B:LLVMBuilderRef, Ty:LLVMTypeRef, PersFn:LLVMValueRef, NumClauses:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMBasicBlockRef) +def LLVMBuildCleanupRet(B:LLVMBuilderRef, CatchPad:LLVMValueRef, BB:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMBasicBlockRef) +def LLVMBuildCatchRet(B:LLVMBuilderRef, CatchPad:LLVMValueRef, BB:LLVMBasicBlockRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildCatchPad(B:LLVMBuilderRef, ParentPad:LLVMValueRef, Args:c.POINTER[LLVMValueRef], NumArgs:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildCleanupPad(B:LLVMBuilderRef, ParentPad:LLVMValueRef, Args:c.POINTER[LLVMValueRef], NumArgs:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMBasicBlockRef, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildCatchSwitch(B:LLVMBuilderRef, ParentPad:LLVMValueRef, UnwindBB:LLVMBasicBlockRef, NumHandlers:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef, LLVMBasicBlockRef) +def LLVMAddCase(Switch:LLVMValueRef, OnVal:LLVMValueRef, Dest:LLVMBasicBlockRef) -> None: ... +@dll.bind(None, LLVMValueRef, LLVMBasicBlockRef) +def LLVMAddDestination(IndirectBr:LLVMValueRef, Dest:LLVMBasicBlockRef) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetNumClauses(LandingPad:LLVMValueRef) -> int: ... +@dll.bind(LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetClause(LandingPad:LLVMValueRef, Idx:int) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMAddClause(LandingPad:LLVMValueRef, ClauseVal:LLVMValueRef) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsCleanup(LandingPad:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetCleanup(LandingPad:LLVMValueRef, Val:LLVMBool) -> None: ... +@dll.bind(None, LLVMValueRef, LLVMBasicBlockRef) +def LLVMAddHandler(CatchSwitch:LLVMValueRef, Dest:LLVMBasicBlockRef) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetNumHandlers(CatchSwitch:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, c.POINTER[LLVMBasicBlockRef]) +def LLVMGetHandlers(CatchSwitch:LLVMValueRef, Handlers:c.POINTER[LLVMBasicBlockRef]) -> None: ... +@dll.bind(LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMGetArgOperand(Funclet:LLVMValueRef, i:int) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32, LLVMValueRef) +def LLVMSetArgOperand(Funclet:LLVMValueRef, i:int, value:LLVMValueRef) -> None: ... +@dll.bind(LLVMValueRef, LLVMValueRef) +def LLVMGetParentCatchSwitch(CatchPad:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(None, LLVMValueRef, LLVMValueRef) +def LLVMSetParentCatchSwitch(CatchPad:LLVMValueRef, CatchSwitch:LLVMValueRef) -> None: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildAdd(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNSWAdd(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNUWAdd(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFAdd(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildSub(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNSWSub(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNUWSub(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFSub(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildMul(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNSWMul(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNUWMul(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFMul(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildUDiv(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildExactUDiv(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildSDiv(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildExactSDiv(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFDiv(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildURem(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildSRem(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFRem(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildShl(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildLShr(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildAShr(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildAnd(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildOr(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildXor(_0:LLVMBuilderRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, ctypes.c_uint32, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildBinOp(B:LLVMBuilderRef, Op:ctypes.c_uint32, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNeg(_0:LLVMBuilderRef, V:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNSWNeg(B:LLVMBuilderRef, V:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNUWNeg(B:LLVMBuilderRef, V:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFNeg(_0:LLVMBuilderRef, V:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildNot(_0:LLVMBuilderRef, V:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetNUW(ArithInst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetNUW(ArithInst:LLVMValueRef, HasNUW:LLVMBool) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetNSW(ArithInst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetNSW(ArithInst:LLVMValueRef, HasNSW:LLVMBool) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetExact(DivOrShrInst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetExact(DivOrShrInst:LLVMValueRef, IsExact:LLVMBool) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetNNeg(NonNegInst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetNNeg(NonNegInst:LLVMValueRef, IsNonNeg:LLVMBool) -> None: ... +@dll.bind(LLVMFastMathFlags, LLVMValueRef) +def LLVMGetFastMathFlags(FPMathInst:LLVMValueRef) -> LLVMFastMathFlags: ... +@dll.bind(None, LLVMValueRef, LLVMFastMathFlags) +def LLVMSetFastMathFlags(FPMathInst:LLVMValueRef, FMF:LLVMFastMathFlags) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMCanValueUseFastMathFlags(Inst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetIsDisjoint(Inst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetIsDisjoint(Inst:LLVMValueRef, IsDisjoint:LLVMBool) -> None: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildMalloc(_0:LLVMBuilderRef, Ty:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildArrayMalloc(_0:LLVMBuilderRef, Ty:LLVMTypeRef, Val:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def LLVMBuildMemSet(B:LLVMBuilderRef, Ptr:LLVMValueRef, Val:LLVMValueRef, Len:LLVMValueRef, Align:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef, ctypes.c_uint32, LLVMValueRef) +def LLVMBuildMemCpy(B:LLVMBuilderRef, Dst:LLVMValueRef, DstAlign:int, Src:LLVMValueRef, SrcAlign:int, Size:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef, ctypes.c_uint32, LLVMValueRef) +def LLVMBuildMemMove(B:LLVMBuilderRef, Dst:LLVMValueRef, DstAlign:int, Src:LLVMValueRef, SrcAlign:int, Size:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildAlloca(_0:LLVMBuilderRef, Ty:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildArrayAlloca(_0:LLVMBuilderRef, Ty:LLVMTypeRef, Val:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef) +def LLVMBuildFree(_0:LLVMBuilderRef, PointerVal:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildLoad2(_0:LLVMBuilderRef, Ty:LLVMTypeRef, PointerVal:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef) +def LLVMBuildStore(_0:LLVMBuilderRef, Val:LLVMValueRef, Ptr:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildGEP2(B:LLVMBuilderRef, Ty:LLVMTypeRef, Pointer:LLVMValueRef, Indices:c.POINTER[LLVMValueRef], NumIndices:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildInBoundsGEP2(B:LLVMBuilderRef, Ty:LLVMTypeRef, Pointer:LLVMValueRef, Indices:c.POINTER[LLVMValueRef], NumIndices:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, c.POINTER[ctypes.c_char], LLVMGEPNoWrapFlags) +def LLVMBuildGEPWithNoWrapFlags(B:LLVMBuilderRef, Ty:LLVMTypeRef, Pointer:LLVMValueRef, Indices:c.POINTER[LLVMValueRef], NumIndices:int, Name:c.POINTER[ctypes.c_char], NoWrapFlags:LLVMGEPNoWrapFlags) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildStructGEP2(B:LLVMBuilderRef, Ty:LLVMTypeRef, Pointer:LLVMValueRef, Idx:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def LLVMBuildGlobalString(B:LLVMBuilderRef, Str:c.POINTER[ctypes.c_char], Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def LLVMBuildGlobalStringPtr(B:LLVMBuilderRef, Str:c.POINTER[ctypes.c_char], Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetVolatile(MemoryAccessInst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetVolatile(MemoryAccessInst:LLVMValueRef, IsVolatile:LLVMBool) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMGetWeak(CmpXchgInst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetWeak(CmpXchgInst:LLVMValueRef, IsWeak:LLVMBool) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetOrdering(MemoryAccessInst:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetOrdering(MemoryAccessInst:LLVMValueRef, Ordering:ctypes.c_uint32) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetAtomicRMWBinOp(AtomicRMWInst:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetAtomicRMWBinOp(AtomicRMWInst:LLVMValueRef, BinOp:ctypes.c_uint32) -> None: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildTrunc(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildZExt(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildSExt(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFPToUI(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFPToSI(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildUIToFP(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildSIToFP(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFPTrunc(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFPExt(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildPtrToInt(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildIntToPtr(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildBitCast(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildAddrSpaceCast(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildZExtOrBitCast(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildSExtOrBitCast(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildTruncOrBitCast(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, ctypes.c_uint32, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildCast(B:LLVMBuilderRef, Op:ctypes.c_uint32, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildPointerCast(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, LLVMBool, c.POINTER[ctypes.c_char]) +def LLVMBuildIntCast2(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, IsSigned:LLVMBool, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFPCast(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildIntCast(_0:LLVMBuilderRef, Val:LLVMValueRef, DestTy:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef, LLVMBool, LLVMTypeRef, LLVMBool) +def LLVMGetCastOpcode(Src:LLVMValueRef, SrcIsSigned:LLVMBool, DestTy:LLVMTypeRef, DestIsSigned:LLVMBool) -> ctypes.c_uint32: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, ctypes.c_uint32, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildICmp(_0:LLVMBuilderRef, Op:ctypes.c_uint32, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, ctypes.c_uint32, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFCmp(_0:LLVMBuilderRef, Op:ctypes.c_uint32, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildPhi(_0:LLVMBuilderRef, Ty:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildCall2(_0:LLVMBuilderRef, _1:LLVMTypeRef, Fn:LLVMValueRef, Args:c.POINTER[LLVMValueRef], NumArgs:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, c.POINTER[LLVMValueRef], ctypes.c_uint32, c.POINTER[LLVMOperandBundleRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildCallWithOperandBundles(_0:LLVMBuilderRef, _1:LLVMTypeRef, Fn:LLVMValueRef, Args:c.POINTER[LLVMValueRef], NumArgs:int, Bundles:c.POINTER[LLVMOperandBundleRef], NumBundles:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildSelect(_0:LLVMBuilderRef, If:LLVMValueRef, Then:LLVMValueRef, Else:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def LLVMBuildVAArg(_0:LLVMBuilderRef, List:LLVMValueRef, Ty:LLVMTypeRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildExtractElement(_0:LLVMBuilderRef, VecVal:LLVMValueRef, Index:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildInsertElement(_0:LLVMBuilderRef, VecVal:LLVMValueRef, EltVal:LLVMValueRef, Index:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildShuffleVector(_0:LLVMBuilderRef, V1:LLVMValueRef, V2:LLVMValueRef, Mask:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildExtractValue(_0:LLVMBuilderRef, AggVal:LLVMValueRef, Index:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildInsertValue(_0:LLVMBuilderRef, AggVal:LLVMValueRef, EltVal:LLVMValueRef, Index:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildFreeze(_0:LLVMBuilderRef, Val:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildIsNull(_0:LLVMBuilderRef, Val:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildIsNotNull(_0:LLVMBuilderRef, Val:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def LLVMBuildPtrDiff2(_0:LLVMBuilderRef, ElemTy:LLVMTypeRef, LHS:LLVMValueRef, RHS:LLVMValueRef, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, ctypes.c_uint32, LLVMBool, c.POINTER[ctypes.c_char]) +def LLVMBuildFence(B:LLVMBuilderRef, ordering:ctypes.c_uint32, singleThread:LLVMBool, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def LLVMBuildFenceSyncScope(B:LLVMBuilderRef, ordering:ctypes.c_uint32, SSID:int, Name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, ctypes.c_uint32, LLVMValueRef, LLVMValueRef, ctypes.c_uint32, LLVMBool) +def LLVMBuildAtomicRMW(B:LLVMBuilderRef, op:ctypes.c_uint32, PTR:LLVMValueRef, Val:LLVMValueRef, ordering:ctypes.c_uint32, singleThread:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, ctypes.c_uint32, LLVMValueRef, LLVMValueRef, ctypes.c_uint32, ctypes.c_uint32) +def LLVMBuildAtomicRMWSyncScope(B:LLVMBuilderRef, op:ctypes.c_uint32, PTR:LLVMValueRef, Val:LLVMValueRef, ordering:ctypes.c_uint32, SSID:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, ctypes.c_uint32, ctypes.c_uint32, LLVMBool) +def LLVMBuildAtomicCmpXchg(B:LLVMBuilderRef, Ptr:LLVMValueRef, Cmp:LLVMValueRef, New:LLVMValueRef, SuccessOrdering:ctypes.c_uint32, FailureOrdering:ctypes.c_uint32, SingleThread:LLVMBool) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32) +def LLVMBuildAtomicCmpXchgSyncScope(B:LLVMBuilderRef, Ptr:LLVMValueRef, Cmp:LLVMValueRef, New:LLVMValueRef, SuccessOrdering:ctypes.c_uint32, FailureOrdering:ctypes.c_uint32, SSID:int) -> LLVMValueRef: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetNumMaskElements(ShuffleVectorInst:LLVMValueRef) -> int: ... +@dll.bind(ctypes.c_int32) +def LLVMGetUndefMaskElem() -> int: ... +@dll.bind(ctypes.c_int32, LLVMValueRef, ctypes.c_uint32) +def LLVMGetMaskValue(ShuffleVectorInst:LLVMValueRef, Elt:int) -> int: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsAtomicSingleThread(AtomicInst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(None, LLVMValueRef, LLVMBool) +def LLVMSetAtomicSingleThread(AtomicInst:LLVMValueRef, SingleThread:LLVMBool) -> None: ... +@dll.bind(LLVMBool, LLVMValueRef) +def LLVMIsAtomic(Inst:LLVMValueRef) -> LLVMBool: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetAtomicSyncScopeID(AtomicInst:LLVMValueRef) -> int: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetAtomicSyncScopeID(AtomicInst:LLVMValueRef, SSID:int) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetCmpXchgSuccessOrdering(CmpXchgInst:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetCmpXchgSuccessOrdering(CmpXchgInst:LLVMValueRef, Ordering:ctypes.c_uint32) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMValueRef) +def LLVMGetCmpXchgFailureOrdering(CmpXchgInst:LLVMValueRef) -> ctypes.c_uint32: ... +@dll.bind(None, LLVMValueRef, ctypes.c_uint32) +def LLVMSetCmpXchgFailureOrdering(CmpXchgInst:LLVMValueRef, Ordering:ctypes.c_uint32) -> None: ... +class struct_LLVMOpaqueModuleProvider(c.Struct): pass +LLVMModuleProviderRef: TypeAlias = c.POINTER[struct_LLVMOpaqueModuleProvider] +@dll.bind(LLVMModuleProviderRef, LLVMModuleRef) +def LLVMCreateModuleProviderForExistingModule(M:LLVMModuleRef) -> LLVMModuleProviderRef: ... +@dll.bind(None, LLVMModuleProviderRef) +def LLVMDisposeModuleProvider(M:LLVMModuleProviderRef) -> None: ... +@dll.bind(LLVMBool, c.POINTER[ctypes.c_char], c.POINTER[LLVMMemoryBufferRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMCreateMemoryBufferWithContentsOfFile(Path:c.POINTER[ctypes.c_char], OutMemBuf:c.POINTER[LLVMMemoryBufferRef], OutMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, c.POINTER[LLVMMemoryBufferRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMCreateMemoryBufferWithSTDIN(OutMemBuf:c.POINTER[LLVMMemoryBufferRef], OutMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMMemoryBufferRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], LLVMBool) +def LLVMCreateMemoryBufferWithMemoryRange(InputData:c.POINTER[ctypes.c_char], InputDataLength:size_t, BufferName:c.POINTER[ctypes.c_char], RequiresNullTerminator:LLVMBool) -> LLVMMemoryBufferRef: ... +@dll.bind(LLVMMemoryBufferRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char]) +def LLVMCreateMemoryBufferWithMemoryRangeCopy(InputData:c.POINTER[ctypes.c_char], InputDataLength:size_t, BufferName:c.POINTER[ctypes.c_char]) -> LLVMMemoryBufferRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMMemoryBufferRef) +def LLVMGetBufferStart(MemBuf:LLVMMemoryBufferRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(size_t, LLVMMemoryBufferRef) +def LLVMGetBufferSize(MemBuf:LLVMMemoryBufferRef) -> size_t: ... +@dll.bind(None, LLVMMemoryBufferRef) +def LLVMDisposeMemoryBuffer(MemBuf:LLVMMemoryBufferRef) -> None: ... +class struct_LLVMOpaquePassManager(c.Struct): pass +LLVMPassManagerRef: TypeAlias = c.POINTER[struct_LLVMOpaquePassManager] +@dll.bind(LLVMPassManagerRef) +def LLVMCreatePassManager() -> LLVMPassManagerRef: ... +@dll.bind(LLVMPassManagerRef, LLVMModuleRef) +def LLVMCreateFunctionPassManagerForModule(M:LLVMModuleRef) -> LLVMPassManagerRef: ... +@dll.bind(LLVMPassManagerRef, LLVMModuleProviderRef) +def LLVMCreateFunctionPassManager(MP:LLVMModuleProviderRef) -> LLVMPassManagerRef: ... +@dll.bind(LLVMBool, LLVMPassManagerRef, LLVMModuleRef) +def LLVMRunPassManager(PM:LLVMPassManagerRef, M:LLVMModuleRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMPassManagerRef) +def LLVMInitializeFunctionPassManager(FPM:LLVMPassManagerRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMPassManagerRef, LLVMValueRef) +def LLVMRunFunctionPassManager(FPM:LLVMPassManagerRef, F:LLVMValueRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMPassManagerRef) +def LLVMFinalizeFunctionPassManager(FPM:LLVMPassManagerRef) -> LLVMBool: ... +@dll.bind(None, LLVMPassManagerRef) +def LLVMDisposePassManager(PM:LLVMPassManagerRef) -> None: ... +@dll.bind(LLVMBool) +def LLVMStartMultithreaded() -> LLVMBool: ... +@dll.bind(None) +def LLVMStopMultithreaded() -> None: ... +@dll.bind(LLVMBool) +def LLVMIsMultithreaded() -> LLVMBool: ... +LLVMDIFlags: dict[int, str] = {(LLVMDIFlagZero:=0): 'LLVMDIFlagZero', (LLVMDIFlagPrivate:=1): 'LLVMDIFlagPrivate', (LLVMDIFlagProtected:=2): 'LLVMDIFlagProtected', (LLVMDIFlagPublic:=3): 'LLVMDIFlagPublic', (LLVMDIFlagFwdDecl:=4): 'LLVMDIFlagFwdDecl', (LLVMDIFlagAppleBlock:=8): 'LLVMDIFlagAppleBlock', (LLVMDIFlagReservedBit4:=16): 'LLVMDIFlagReservedBit4', (LLVMDIFlagVirtual:=32): 'LLVMDIFlagVirtual', (LLVMDIFlagArtificial:=64): 'LLVMDIFlagArtificial', (LLVMDIFlagExplicit:=128): 'LLVMDIFlagExplicit', (LLVMDIFlagPrototyped:=256): 'LLVMDIFlagPrototyped', (LLVMDIFlagObjcClassComplete:=512): 'LLVMDIFlagObjcClassComplete', (LLVMDIFlagObjectPointer:=1024): 'LLVMDIFlagObjectPointer', (LLVMDIFlagVector:=2048): 'LLVMDIFlagVector', (LLVMDIFlagStaticMember:=4096): 'LLVMDIFlagStaticMember', (LLVMDIFlagLValueReference:=8192): 'LLVMDIFlagLValueReference', (LLVMDIFlagRValueReference:=16384): 'LLVMDIFlagRValueReference', (LLVMDIFlagReserved:=32768): 'LLVMDIFlagReserved', (LLVMDIFlagSingleInheritance:=65536): 'LLVMDIFlagSingleInheritance', (LLVMDIFlagMultipleInheritance:=131072): 'LLVMDIFlagMultipleInheritance', (LLVMDIFlagVirtualInheritance:=196608): 'LLVMDIFlagVirtualInheritance', (LLVMDIFlagIntroducedVirtual:=262144): 'LLVMDIFlagIntroducedVirtual', (LLVMDIFlagBitField:=524288): 'LLVMDIFlagBitField', (LLVMDIFlagNoReturn:=1048576): 'LLVMDIFlagNoReturn', (LLVMDIFlagTypePassByValue:=4194304): 'LLVMDIFlagTypePassByValue', (LLVMDIFlagTypePassByReference:=8388608): 'LLVMDIFlagTypePassByReference', (LLVMDIFlagEnumClass:=16777216): 'LLVMDIFlagEnumClass', (LLVMDIFlagFixedEnum:=16777216): 'LLVMDIFlagFixedEnum', (LLVMDIFlagThunk:=33554432): 'LLVMDIFlagThunk', (LLVMDIFlagNonTrivial:=67108864): 'LLVMDIFlagNonTrivial', (LLVMDIFlagBigEndian:=134217728): 'LLVMDIFlagBigEndian', (LLVMDIFlagLittleEndian:=268435456): 'LLVMDIFlagLittleEndian', (LLVMDIFlagIndirectVirtualBase:=36): 'LLVMDIFlagIndirectVirtualBase', (LLVMDIFlagAccessibility:=3): 'LLVMDIFlagAccessibility', (LLVMDIFlagPtrToMemberRep:=196608): 'LLVMDIFlagPtrToMemberRep'} +LLVMDWARFSourceLanguage: dict[int, str] = {(LLVMDWARFSourceLanguageC89:=0): 'LLVMDWARFSourceLanguageC89', (LLVMDWARFSourceLanguageC:=1): 'LLVMDWARFSourceLanguageC', (LLVMDWARFSourceLanguageAda83:=2): 'LLVMDWARFSourceLanguageAda83', (LLVMDWARFSourceLanguageC_plus_plus:=3): 'LLVMDWARFSourceLanguageC_plus_plus', (LLVMDWARFSourceLanguageCobol74:=4): 'LLVMDWARFSourceLanguageCobol74', (LLVMDWARFSourceLanguageCobol85:=5): 'LLVMDWARFSourceLanguageCobol85', (LLVMDWARFSourceLanguageFortran77:=6): 'LLVMDWARFSourceLanguageFortran77', (LLVMDWARFSourceLanguageFortran90:=7): 'LLVMDWARFSourceLanguageFortran90', (LLVMDWARFSourceLanguagePascal83:=8): 'LLVMDWARFSourceLanguagePascal83', (LLVMDWARFSourceLanguageModula2:=9): 'LLVMDWARFSourceLanguageModula2', (LLVMDWARFSourceLanguageJava:=10): 'LLVMDWARFSourceLanguageJava', (LLVMDWARFSourceLanguageC99:=11): 'LLVMDWARFSourceLanguageC99', (LLVMDWARFSourceLanguageAda95:=12): 'LLVMDWARFSourceLanguageAda95', (LLVMDWARFSourceLanguageFortran95:=13): 'LLVMDWARFSourceLanguageFortran95', (LLVMDWARFSourceLanguagePLI:=14): 'LLVMDWARFSourceLanguagePLI', (LLVMDWARFSourceLanguageObjC:=15): 'LLVMDWARFSourceLanguageObjC', (LLVMDWARFSourceLanguageObjC_plus_plus:=16): 'LLVMDWARFSourceLanguageObjC_plus_plus', (LLVMDWARFSourceLanguageUPC:=17): 'LLVMDWARFSourceLanguageUPC', (LLVMDWARFSourceLanguageD:=18): 'LLVMDWARFSourceLanguageD', (LLVMDWARFSourceLanguagePython:=19): 'LLVMDWARFSourceLanguagePython', (LLVMDWARFSourceLanguageOpenCL:=20): 'LLVMDWARFSourceLanguageOpenCL', (LLVMDWARFSourceLanguageGo:=21): 'LLVMDWARFSourceLanguageGo', (LLVMDWARFSourceLanguageModula3:=22): 'LLVMDWARFSourceLanguageModula3', (LLVMDWARFSourceLanguageHaskell:=23): 'LLVMDWARFSourceLanguageHaskell', (LLVMDWARFSourceLanguageC_plus_plus_03:=24): 'LLVMDWARFSourceLanguageC_plus_plus_03', (LLVMDWARFSourceLanguageC_plus_plus_11:=25): 'LLVMDWARFSourceLanguageC_plus_plus_11', (LLVMDWARFSourceLanguageOCaml:=26): 'LLVMDWARFSourceLanguageOCaml', (LLVMDWARFSourceLanguageRust:=27): 'LLVMDWARFSourceLanguageRust', (LLVMDWARFSourceLanguageC11:=28): 'LLVMDWARFSourceLanguageC11', (LLVMDWARFSourceLanguageSwift:=29): 'LLVMDWARFSourceLanguageSwift', (LLVMDWARFSourceLanguageJulia:=30): 'LLVMDWARFSourceLanguageJulia', (LLVMDWARFSourceLanguageDylan:=31): 'LLVMDWARFSourceLanguageDylan', (LLVMDWARFSourceLanguageC_plus_plus_14:=32): 'LLVMDWARFSourceLanguageC_plus_plus_14', (LLVMDWARFSourceLanguageFortran03:=33): 'LLVMDWARFSourceLanguageFortran03', (LLVMDWARFSourceLanguageFortran08:=34): 'LLVMDWARFSourceLanguageFortran08', (LLVMDWARFSourceLanguageRenderScript:=35): 'LLVMDWARFSourceLanguageRenderScript', (LLVMDWARFSourceLanguageBLISS:=36): 'LLVMDWARFSourceLanguageBLISS', (LLVMDWARFSourceLanguageKotlin:=37): 'LLVMDWARFSourceLanguageKotlin', (LLVMDWARFSourceLanguageZig:=38): 'LLVMDWARFSourceLanguageZig', (LLVMDWARFSourceLanguageCrystal:=39): 'LLVMDWARFSourceLanguageCrystal', (LLVMDWARFSourceLanguageC_plus_plus_17:=40): 'LLVMDWARFSourceLanguageC_plus_plus_17', (LLVMDWARFSourceLanguageC_plus_plus_20:=41): 'LLVMDWARFSourceLanguageC_plus_plus_20', (LLVMDWARFSourceLanguageC17:=42): 'LLVMDWARFSourceLanguageC17', (LLVMDWARFSourceLanguageFortran18:=43): 'LLVMDWARFSourceLanguageFortran18', (LLVMDWARFSourceLanguageAda2005:=44): 'LLVMDWARFSourceLanguageAda2005', (LLVMDWARFSourceLanguageAda2012:=45): 'LLVMDWARFSourceLanguageAda2012', (LLVMDWARFSourceLanguageHIP:=46): 'LLVMDWARFSourceLanguageHIP', (LLVMDWARFSourceLanguageAssembly:=47): 'LLVMDWARFSourceLanguageAssembly', (LLVMDWARFSourceLanguageC_sharp:=48): 'LLVMDWARFSourceLanguageC_sharp', (LLVMDWARFSourceLanguageMojo:=49): 'LLVMDWARFSourceLanguageMojo', (LLVMDWARFSourceLanguageGLSL:=50): 'LLVMDWARFSourceLanguageGLSL', (LLVMDWARFSourceLanguageGLSL_ES:=51): 'LLVMDWARFSourceLanguageGLSL_ES', (LLVMDWARFSourceLanguageHLSL:=52): 'LLVMDWARFSourceLanguageHLSL', (LLVMDWARFSourceLanguageOpenCL_CPP:=53): 'LLVMDWARFSourceLanguageOpenCL_CPP', (LLVMDWARFSourceLanguageCPP_for_OpenCL:=54): 'LLVMDWARFSourceLanguageCPP_for_OpenCL', (LLVMDWARFSourceLanguageSYCL:=55): 'LLVMDWARFSourceLanguageSYCL', (LLVMDWARFSourceLanguageRuby:=56): 'LLVMDWARFSourceLanguageRuby', (LLVMDWARFSourceLanguageMove:=57): 'LLVMDWARFSourceLanguageMove', (LLVMDWARFSourceLanguageHylo:=58): 'LLVMDWARFSourceLanguageHylo', (LLVMDWARFSourceLanguageMetal:=59): 'LLVMDWARFSourceLanguageMetal', (LLVMDWARFSourceLanguageMips_Assembler:=60): 'LLVMDWARFSourceLanguageMips_Assembler', (LLVMDWARFSourceLanguageGOOGLE_RenderScript:=61): 'LLVMDWARFSourceLanguageGOOGLE_RenderScript', (LLVMDWARFSourceLanguageBORLAND_Delphi:=62): 'LLVMDWARFSourceLanguageBORLAND_Delphi'} +LLVMDWARFEmissionKind: dict[int, str] = {(LLVMDWARFEmissionNone:=0): 'LLVMDWARFEmissionNone', (LLVMDWARFEmissionFull:=1): 'LLVMDWARFEmissionFull', (LLVMDWARFEmissionLineTablesOnly:=2): 'LLVMDWARFEmissionLineTablesOnly'} +_anonenum3: dict[int, str] = {(LLVMMDStringMetadataKind:=0): 'LLVMMDStringMetadataKind', (LLVMConstantAsMetadataMetadataKind:=1): 'LLVMConstantAsMetadataMetadataKind', (LLVMLocalAsMetadataMetadataKind:=2): 'LLVMLocalAsMetadataMetadataKind', (LLVMDistinctMDOperandPlaceholderMetadataKind:=3): 'LLVMDistinctMDOperandPlaceholderMetadataKind', (LLVMMDTupleMetadataKind:=4): 'LLVMMDTupleMetadataKind', (LLVMDILocationMetadataKind:=5): 'LLVMDILocationMetadataKind', (LLVMDIExpressionMetadataKind:=6): 'LLVMDIExpressionMetadataKind', (LLVMDIGlobalVariableExpressionMetadataKind:=7): 'LLVMDIGlobalVariableExpressionMetadataKind', (LLVMGenericDINodeMetadataKind:=8): 'LLVMGenericDINodeMetadataKind', (LLVMDISubrangeMetadataKind:=9): 'LLVMDISubrangeMetadataKind', (LLVMDIEnumeratorMetadataKind:=10): 'LLVMDIEnumeratorMetadataKind', (LLVMDIBasicTypeMetadataKind:=11): 'LLVMDIBasicTypeMetadataKind', (LLVMDIDerivedTypeMetadataKind:=12): 'LLVMDIDerivedTypeMetadataKind', (LLVMDICompositeTypeMetadataKind:=13): 'LLVMDICompositeTypeMetadataKind', (LLVMDISubroutineTypeMetadataKind:=14): 'LLVMDISubroutineTypeMetadataKind', (LLVMDIFileMetadataKind:=15): 'LLVMDIFileMetadataKind', (LLVMDICompileUnitMetadataKind:=16): 'LLVMDICompileUnitMetadataKind', (LLVMDISubprogramMetadataKind:=17): 'LLVMDISubprogramMetadataKind', (LLVMDILexicalBlockMetadataKind:=18): 'LLVMDILexicalBlockMetadataKind', (LLVMDILexicalBlockFileMetadataKind:=19): 'LLVMDILexicalBlockFileMetadataKind', (LLVMDINamespaceMetadataKind:=20): 'LLVMDINamespaceMetadataKind', (LLVMDIModuleMetadataKind:=21): 'LLVMDIModuleMetadataKind', (LLVMDITemplateTypeParameterMetadataKind:=22): 'LLVMDITemplateTypeParameterMetadataKind', (LLVMDITemplateValueParameterMetadataKind:=23): 'LLVMDITemplateValueParameterMetadataKind', (LLVMDIGlobalVariableMetadataKind:=24): 'LLVMDIGlobalVariableMetadataKind', (LLVMDILocalVariableMetadataKind:=25): 'LLVMDILocalVariableMetadataKind', (LLVMDILabelMetadataKind:=26): 'LLVMDILabelMetadataKind', (LLVMDIObjCPropertyMetadataKind:=27): 'LLVMDIObjCPropertyMetadataKind', (LLVMDIImportedEntityMetadataKind:=28): 'LLVMDIImportedEntityMetadataKind', (LLVMDIMacroMetadataKind:=29): 'LLVMDIMacroMetadataKind', (LLVMDIMacroFileMetadataKind:=30): 'LLVMDIMacroFileMetadataKind', (LLVMDICommonBlockMetadataKind:=31): 'LLVMDICommonBlockMetadataKind', (LLVMDIStringTypeMetadataKind:=32): 'LLVMDIStringTypeMetadataKind', (LLVMDIGenericSubrangeMetadataKind:=33): 'LLVMDIGenericSubrangeMetadataKind', (LLVMDIArgListMetadataKind:=34): 'LLVMDIArgListMetadataKind', (LLVMDIAssignIDMetadataKind:=35): 'LLVMDIAssignIDMetadataKind'} +LLVMMetadataKind: TypeAlias = ctypes.c_uint32 +LLVMDWARFTypeEncoding: TypeAlias = ctypes.c_uint32 +LLVMDWARFMacinfoRecordType: dict[int, str] = {(LLVMDWARFMacinfoRecordTypeDefine:=1): 'LLVMDWARFMacinfoRecordTypeDefine', (LLVMDWARFMacinfoRecordTypeMacro:=2): 'LLVMDWARFMacinfoRecordTypeMacro', (LLVMDWARFMacinfoRecordTypeStartFile:=3): 'LLVMDWARFMacinfoRecordTypeStartFile', (LLVMDWARFMacinfoRecordTypeEndFile:=4): 'LLVMDWARFMacinfoRecordTypeEndFile', (LLVMDWARFMacinfoRecordTypeVendorExt:=255): 'LLVMDWARFMacinfoRecordTypeVendorExt'} +@dll.bind(ctypes.c_uint32) +def LLVMDebugMetadataVersion() -> int: ... +@dll.bind(ctypes.c_uint32, LLVMModuleRef) +def LLVMGetModuleDebugMetadataVersion(Module:LLVMModuleRef) -> int: ... +@dll.bind(LLVMBool, LLVMModuleRef) +def LLVMStripModuleDebugInfo(Module:LLVMModuleRef) -> LLVMBool: ... +class struct_LLVMOpaqueDIBuilder(c.Struct): pass +LLVMDIBuilderRef: TypeAlias = c.POINTER[struct_LLVMOpaqueDIBuilder] +@dll.bind(LLVMDIBuilderRef, LLVMModuleRef) +def LLVMCreateDIBuilderDisallowUnresolved(M:LLVMModuleRef) -> LLVMDIBuilderRef: ... +@dll.bind(LLVMDIBuilderRef, LLVMModuleRef) +def LLVMCreateDIBuilder(M:LLVMModuleRef) -> LLVMDIBuilderRef: ... +@dll.bind(None, LLVMDIBuilderRef) +def LLVMDisposeDIBuilder(Builder:LLVMDIBuilderRef) -> None: ... +@dll.bind(None, LLVMDIBuilderRef) +def LLVMDIBuilderFinalize(Builder:LLVMDIBuilderRef) -> None: ... +@dll.bind(None, LLVMDIBuilderRef, LLVMMetadataRef) +def LLVMDIBuilderFinalizeSubprogram(Builder:LLVMDIBuilderRef, Subprogram:LLVMMetadataRef) -> None: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, ctypes.c_uint32, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMBool, c.POINTER[ctypes.c_char], size_t, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t, ctypes.c_uint32, ctypes.c_uint32, LLVMBool, LLVMBool, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateCompileUnit(Builder:LLVMDIBuilderRef, Lang:ctypes.c_uint32, FileRef:LLVMMetadataRef, Producer:c.POINTER[ctypes.c_char], ProducerLen:size_t, isOptimized:LLVMBool, Flags:c.POINTER[ctypes.c_char], FlagsLen:size_t, RuntimeVer:int, SplitName:c.POINTER[ctypes.c_char], SplitNameLen:size_t, Kind:ctypes.c_uint32, DWOId:int, SplitDebugInlining:LLVMBool, DebugInfoForProfiling:LLVMBool, SysRoot:c.POINTER[ctypes.c_char], SysRootLen:size_t, SDK:c.POINTER[ctypes.c_char], SDKLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateFile(Builder:LLVMDIBuilderRef, Filename:c.POINTER[ctypes.c_char], FilenameLen:size_t, Directory:c.POINTER[ctypes.c_char], DirectoryLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateModule(Builder:LLVMDIBuilderRef, ParentScope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, ConfigMacros:c.POINTER[ctypes.c_char], ConfigMacrosLen:size_t, IncludePath:c.POINTER[ctypes.c_char], IncludePathLen:size_t, APINotesFile:c.POINTER[ctypes.c_char], APINotesFileLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMBool) +def LLVMDIBuilderCreateNameSpace(Builder:LLVMDIBuilderRef, ParentScope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, ExportSymbols:LLVMBool) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, LLVMMetadataRef, LLVMBool, LLVMBool, ctypes.c_uint32, ctypes.c_uint32, LLVMBool) +def LLVMDIBuilderCreateFunction(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, LinkageName:c.POINTER[ctypes.c_char], LinkageNameLen:size_t, File:LLVMMetadataRef, LineNo:int, Ty:LLVMMetadataRef, IsLocalToUnit:LLVMBool, IsDefinition:LLVMBool, ScopeLine:int, Flags:ctypes.c_uint32, IsOptimized:LLVMBool) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, ctypes.c_uint32, ctypes.c_uint32) +def LLVMDIBuilderCreateLexicalBlock(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, File:LLVMMetadataRef, Line:int, Column:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, ctypes.c_uint32) +def LLVMDIBuilderCreateLexicalBlockFile(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, File:LLVMMetadataRef, Discriminator:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, ctypes.c_uint32) +def LLVMDIBuilderCreateImportedModuleFromNamespace(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, NS:LLVMMetadataRef, File:LLVMMetadataRef, Line:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, ctypes.c_uint32, c.POINTER[LLVMMetadataRef], ctypes.c_uint32) +def LLVMDIBuilderCreateImportedModuleFromAlias(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, ImportedEntity:LLVMMetadataRef, File:LLVMMetadataRef, Line:int, Elements:c.POINTER[LLVMMetadataRef], NumElements:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, ctypes.c_uint32, c.POINTER[LLVMMetadataRef], ctypes.c_uint32) +def LLVMDIBuilderCreateImportedModuleFromModule(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, M:LLVMMetadataRef, File:LLVMMetadataRef, Line:int, Elements:c.POINTER[LLVMMetadataRef], NumElements:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t, c.POINTER[LLVMMetadataRef], ctypes.c_uint32) +def LLVMDIBuilderCreateImportedDeclaration(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Decl:LLVMMetadataRef, File:LLVMMetadataRef, Line:int, Name:c.POINTER[ctypes.c_char], NameLen:size_t, Elements:c.POINTER[LLVMMetadataRef], NumElements:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMContextRef, ctypes.c_uint32, ctypes.c_uint32, LLVMMetadataRef, LLVMMetadataRef) +def LLVMDIBuilderCreateDebugLocation(Ctx:LLVMContextRef, Line:int, Column:int, Scope:LLVMMetadataRef, InlinedAt:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(ctypes.c_uint32, LLVMMetadataRef) +def LLVMDILocationGetLine(Location:LLVMMetadataRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMMetadataRef) +def LLVMDILocationGetColumn(Location:LLVMMetadataRef) -> int: ... +@dll.bind(LLVMMetadataRef, LLVMMetadataRef) +def LLVMDILocationGetScope(Location:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMMetadataRef) +def LLVMDILocationGetInlinedAt(Location:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMMetadataRef) +def LLVMDIScopeGetFile(Scope:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMMetadataRef, c.POINTER[ctypes.c_uint32]) +def LLVMDIFileGetDirectory(File:LLVMMetadataRef, Len:c.POINTER[ctypes.c_uint32]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMMetadataRef, c.POINTER[ctypes.c_uint32]) +def LLVMDIFileGetFilename(File:LLVMMetadataRef, Len:c.POINTER[ctypes.c_uint32]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMMetadataRef, c.POINTER[ctypes.c_uint32]) +def LLVMDIFileGetSource(File:LLVMMetadataRef, Len:c.POINTER[ctypes.c_uint32]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[LLVMMetadataRef], size_t) +def LLVMDIBuilderGetOrCreateTypeArray(Builder:LLVMDIBuilderRef, Data:c.POINTER[LLVMMetadataRef], NumElements:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[LLVMMetadataRef], ctypes.c_uint32, ctypes.c_uint32) +def LLVMDIBuilderCreateSubroutineType(Builder:LLVMDIBuilderRef, File:LLVMMetadataRef, ParameterTypes:c.POINTER[LLVMMetadataRef], NumParameterTypes:int, Flags:ctypes.c_uint32) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateMacro(Builder:LLVMDIBuilderRef, ParentMacroFile:LLVMMetadataRef, Line:int, RecordType:ctypes.c_uint32, Name:c.POINTER[ctypes.c_char], NameLen:size_t, Value:c.POINTER[ctypes.c_char], ValueLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, ctypes.c_uint32, LLVMMetadataRef) +def LLVMDIBuilderCreateTempMacroFile(Builder:LLVMDIBuilderRef, ParentMacroFile:LLVMMetadataRef, Line:int, File:LLVMMetadataRef) -> LLVMMetadataRef: ... +int64_t: TypeAlias = ctypes.c_int64 +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[ctypes.c_char], size_t, int64_t, LLVMBool) +def LLVMDIBuilderCreateEnumerator(Builder:LLVMDIBuilderRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, Value:int64_t, IsUnsigned:LLVMBool) -> LLVMMetadataRef: ... +uint32_t: TypeAlias = ctypes.c_uint32 +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, uint64_t, uint32_t, c.POINTER[LLVMMetadataRef], ctypes.c_uint32, LLVMMetadataRef) +def LLVMDIBuilderCreateEnumerationType(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNumber:int, SizeInBits:uint64_t, AlignInBits:uint32_t, Elements:c.POINTER[LLVMMetadataRef], NumElements:int, ClassTy:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, uint64_t, uint32_t, ctypes.c_uint32, c.POINTER[LLVMMetadataRef], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateUnionType(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNumber:int, SizeInBits:uint64_t, AlignInBits:uint32_t, Flags:ctypes.c_uint32, Elements:c.POINTER[LLVMMetadataRef], NumElements:int, RunTimeLang:int, UniqueId:c.POINTER[ctypes.c_char], UniqueIdLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, uint64_t, uint32_t, LLVMMetadataRef, c.POINTER[LLVMMetadataRef], ctypes.c_uint32) +def LLVMDIBuilderCreateArrayType(Builder:LLVMDIBuilderRef, Size:uint64_t, AlignInBits:uint32_t, Ty:LLVMMetadataRef, Subscripts:c.POINTER[LLVMMetadataRef], NumSubscripts:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, uint64_t, uint32_t, LLVMMetadataRef, c.POINTER[LLVMMetadataRef], ctypes.c_uint32) +def LLVMDIBuilderCreateVectorType(Builder:LLVMDIBuilderRef, Size:uint64_t, AlignInBits:uint32_t, Ty:LLVMMetadataRef, Subscripts:c.POINTER[LLVMMetadataRef], NumSubscripts:int) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateUnspecifiedType(Builder:LLVMDIBuilderRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[ctypes.c_char], size_t, uint64_t, LLVMDWARFTypeEncoding, ctypes.c_uint32) +def LLVMDIBuilderCreateBasicType(Builder:LLVMDIBuilderRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, SizeInBits:uint64_t, Encoding:LLVMDWARFTypeEncoding, Flags:ctypes.c_uint32) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, uint64_t, uint32_t, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreatePointerType(Builder:LLVMDIBuilderRef, PointeeTy:LLVMMetadataRef, SizeInBits:uint64_t, AlignInBits:uint32_t, AddressSpace:int, Name:c.POINTER[ctypes.c_char], NameLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, uint64_t, uint32_t, ctypes.c_uint32, LLVMMetadataRef, c.POINTER[LLVMMetadataRef], ctypes.c_uint32, ctypes.c_uint32, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateStructType(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNumber:int, SizeInBits:uint64_t, AlignInBits:uint32_t, Flags:ctypes.c_uint32, DerivedFrom:LLVMMetadataRef, Elements:c.POINTER[LLVMMetadataRef], NumElements:int, RunTimeLang:int, VTableHolder:LLVMMetadataRef, UniqueId:c.POINTER[ctypes.c_char], UniqueIdLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, uint64_t, uint32_t, uint64_t, ctypes.c_uint32, LLVMMetadataRef) +def LLVMDIBuilderCreateMemberType(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNo:int, SizeInBits:uint64_t, AlignInBits:uint32_t, OffsetInBits:uint64_t, Flags:ctypes.c_uint32, Ty:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, LLVMMetadataRef, ctypes.c_uint32, LLVMValueRef, uint32_t) +def LLVMDIBuilderCreateStaticMemberType(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNumber:int, Type:LLVMMetadataRef, Flags:ctypes.c_uint32, ConstantVal:LLVMValueRef, AlignInBits:uint32_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, uint64_t, uint32_t, ctypes.c_uint32) +def LLVMDIBuilderCreateMemberPointerType(Builder:LLVMDIBuilderRef, PointeeType:LLVMMetadataRef, ClassType:LLVMMetadataRef, SizeInBits:uint64_t, AlignInBits:uint32_t, Flags:ctypes.c_uint32) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, uint64_t, uint32_t, uint64_t, ctypes.c_uint32, LLVMMetadataRef, LLVMMetadataRef) +def LLVMDIBuilderCreateObjCIVar(Builder:LLVMDIBuilderRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNo:int, SizeInBits:uint64_t, AlignInBits:uint32_t, OffsetInBits:uint64_t, Flags:ctypes.c_uint32, Ty:LLVMMetadataRef, PropertyNode:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t, ctypes.c_uint32, LLVMMetadataRef) +def LLVMDIBuilderCreateObjCProperty(Builder:LLVMDIBuilderRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNo:int, GetterName:c.POINTER[ctypes.c_char], GetterNameLen:size_t, SetterName:c.POINTER[ctypes.c_char], SetterNameLen:size_t, PropertyAttributes:int, Ty:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMBool) +def LLVMDIBuilderCreateObjectPointerType(Builder:LLVMDIBuilderRef, Type:LLVMMetadataRef, Implicit:LLVMBool) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, ctypes.c_uint32, LLVMMetadataRef) +def LLVMDIBuilderCreateQualifiedType(Builder:LLVMDIBuilderRef, Tag:int, Type:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, ctypes.c_uint32, LLVMMetadataRef) +def LLVMDIBuilderCreateReferenceType(Builder:LLVMDIBuilderRef, Tag:int, Type:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef) +def LLVMDIBuilderCreateNullPtrType(Builder:LLVMDIBuilderRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, LLVMMetadataRef, uint32_t) +def LLVMDIBuilderCreateTypedef(Builder:LLVMDIBuilderRef, Type:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNo:int, Scope:LLVMMetadataRef, AlignInBits:uint32_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, uint64_t, uint32_t, ctypes.c_uint32) +def LLVMDIBuilderCreateInheritance(Builder:LLVMDIBuilderRef, Ty:LLVMMetadataRef, BaseTy:LLVMMetadataRef, BaseOffset:uint64_t, VBPtrOffset:uint32_t, Flags:ctypes.c_uint32) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, LLVMMetadataRef, ctypes.c_uint32, ctypes.c_uint32, uint64_t, uint32_t, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateForwardDecl(Builder:LLVMDIBuilderRef, Tag:int, Name:c.POINTER[ctypes.c_char], NameLen:size_t, Scope:LLVMMetadataRef, File:LLVMMetadataRef, Line:int, RuntimeLang:int, SizeInBits:uint64_t, AlignInBits:uint32_t, UniqueIdentifier:c.POINTER[ctypes.c_char], UniqueIdentifierLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, LLVMMetadataRef, ctypes.c_uint32, ctypes.c_uint32, uint64_t, uint32_t, ctypes.c_uint32, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateReplaceableCompositeType(Builder:LLVMDIBuilderRef, Tag:int, Name:c.POINTER[ctypes.c_char], NameLen:size_t, Scope:LLVMMetadataRef, File:LLVMMetadataRef, Line:int, RuntimeLang:int, SizeInBits:uint64_t, AlignInBits:uint32_t, Flags:ctypes.c_uint32, UniqueIdentifier:c.POINTER[ctypes.c_char], UniqueIdentifierLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, uint64_t, uint64_t, uint64_t, ctypes.c_uint32, LLVMMetadataRef) +def LLVMDIBuilderCreateBitFieldMemberType(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNumber:int, SizeInBits:uint64_t, OffsetInBits:uint64_t, StorageOffsetInBits:uint64_t, Flags:ctypes.c_uint32, Type:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, uint64_t, uint32_t, uint64_t, ctypes.c_uint32, LLVMMetadataRef, c.POINTER[LLVMMetadataRef], ctypes.c_uint32, LLVMMetadataRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t) +def LLVMDIBuilderCreateClassType(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNumber:int, SizeInBits:uint64_t, AlignInBits:uint32_t, OffsetInBits:uint64_t, Flags:ctypes.c_uint32, DerivedFrom:LLVMMetadataRef, Elements:c.POINTER[LLVMMetadataRef], NumElements:int, VTableHolder:LLVMMetadataRef, TemplateParamsNode:LLVMMetadataRef, UniqueIdentifier:c.POINTER[ctypes.c_char], UniqueIdentifierLen:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef) +def LLVMDIBuilderCreateArtificialType(Builder:LLVMDIBuilderRef, Type:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMMetadataRef, c.POINTER[size_t]) +def LLVMDITypeGetName(DType:LLVMMetadataRef, Length:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(uint64_t, LLVMMetadataRef) +def LLVMDITypeGetSizeInBits(DType:LLVMMetadataRef) -> uint64_t: ... +@dll.bind(uint64_t, LLVMMetadataRef) +def LLVMDITypeGetOffsetInBits(DType:LLVMMetadataRef) -> uint64_t: ... +@dll.bind(uint32_t, LLVMMetadataRef) +def LLVMDITypeGetAlignInBits(DType:LLVMMetadataRef) -> uint32_t: ... +@dll.bind(ctypes.c_uint32, LLVMMetadataRef) +def LLVMDITypeGetLine(DType:LLVMMetadataRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMMetadataRef) +def LLVMDITypeGetFlags(DType:LLVMMetadataRef) -> ctypes.c_uint32: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, int64_t, int64_t) +def LLVMDIBuilderGetOrCreateSubrange(Builder:LLVMDIBuilderRef, LowerBound:int64_t, Count:int64_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[LLVMMetadataRef], size_t) +def LLVMDIBuilderGetOrCreateArray(Builder:LLVMDIBuilderRef, Data:c.POINTER[LLVMMetadataRef], NumElements:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, c.POINTER[uint64_t], size_t) +def LLVMDIBuilderCreateExpression(Builder:LLVMDIBuilderRef, Addr:c.POINTER[uint64_t], Length:size_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, uint64_t) +def LLVMDIBuilderCreateConstantValueExpression(Builder:LLVMDIBuilderRef, Value:uint64_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, LLVMMetadataRef, LLVMBool, LLVMMetadataRef, LLVMMetadataRef, uint32_t) +def LLVMDIBuilderCreateGlobalVariableExpression(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, Linkage:c.POINTER[ctypes.c_char], LinkLen:size_t, File:LLVMMetadataRef, LineNo:int, Ty:LLVMMetadataRef, LocalToUnit:LLVMBool, Expr:LLVMMetadataRef, Decl:LLVMMetadataRef, AlignInBits:uint32_t) -> LLVMMetadataRef: ... +uint16_t: TypeAlias = ctypes.c_uint16 +@dll.bind(uint16_t, LLVMMetadataRef) +def LLVMGetDINodeTag(MD:LLVMMetadataRef) -> uint16_t: ... +@dll.bind(LLVMMetadataRef, LLVMMetadataRef) +def LLVMDIGlobalVariableExpressionGetVariable(GVE:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMMetadataRef) +def LLVMDIGlobalVariableExpressionGetExpression(GVE:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMMetadataRef) +def LLVMDIVariableGetFile(Var:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMMetadataRef) +def LLVMDIVariableGetScope(Var:LLVMMetadataRef) -> LLVMMetadataRef: ... +@dll.bind(ctypes.c_uint32, LLVMMetadataRef) +def LLVMDIVariableGetLine(Var:LLVMMetadataRef) -> int: ... +@dll.bind(LLVMMetadataRef, LLVMContextRef, c.POINTER[LLVMMetadataRef], size_t) +def LLVMTemporaryMDNode(Ctx:LLVMContextRef, Data:c.POINTER[LLVMMetadataRef], NumElements:size_t) -> LLVMMetadataRef: ... +@dll.bind(None, LLVMMetadataRef) +def LLVMDisposeTemporaryMDNode(TempNode:LLVMMetadataRef) -> None: ... +@dll.bind(None, LLVMMetadataRef, LLVMMetadataRef) +def LLVMMetadataReplaceAllUsesWith(TempTargetMetadata:LLVMMetadataRef, Replacement:LLVMMetadataRef) -> None: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, LLVMMetadataRef, LLVMBool, LLVMMetadataRef, uint32_t) +def LLVMDIBuilderCreateTempGlobalVariableFwdDecl(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, Linkage:c.POINTER[ctypes.c_char], LnkLen:size_t, File:LLVMMetadataRef, LineNo:int, Ty:LLVMMetadataRef, LocalToUnit:LLVMBool, Decl:LLVMMetadataRef, AlignInBits:uint32_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMValueRef) +def LLVMDIBuilderInsertDeclareRecordBefore(Builder:LLVMDIBuilderRef, Storage:LLVMValueRef, VarInfo:LLVMMetadataRef, Expr:LLVMMetadataRef, DebugLoc:LLVMMetadataRef, Instr:LLVMValueRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMBasicBlockRef) +def LLVMDIBuilderInsertDeclareRecordAtEnd(Builder:LLVMDIBuilderRef, Storage:LLVMValueRef, VarInfo:LLVMMetadataRef, Expr:LLVMMetadataRef, DebugLoc:LLVMMetadataRef, Block:LLVMBasicBlockRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMValueRef) +def LLVMDIBuilderInsertDbgValueRecordBefore(Builder:LLVMDIBuilderRef, Val:LLVMValueRef, VarInfo:LLVMMetadataRef, Expr:LLVMMetadataRef, DebugLoc:LLVMMetadataRef, Instr:LLVMValueRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMDIBuilderRef, LLVMValueRef, LLVMMetadataRef, LLVMMetadataRef, LLVMMetadataRef, LLVMBasicBlockRef) +def LLVMDIBuilderInsertDbgValueRecordAtEnd(Builder:LLVMDIBuilderRef, Val:LLVMValueRef, VarInfo:LLVMMetadataRef, Expr:LLVMMetadataRef, DebugLoc:LLVMMetadataRef, Block:LLVMBasicBlockRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, LLVMMetadataRef, LLVMBool, ctypes.c_uint32, uint32_t) +def LLVMDIBuilderCreateAutoVariable(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNo:int, Ty:LLVMMetadataRef, AlwaysPreserve:LLVMBool, Flags:ctypes.c_uint32, AlignInBits:uint32_t) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, ctypes.c_uint32, LLVMMetadataRef, ctypes.c_uint32, LLVMMetadataRef, LLVMBool, ctypes.c_uint32) +def LLVMDIBuilderCreateParameterVariable(Builder:LLVMDIBuilderRef, Scope:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, ArgNo:int, File:LLVMMetadataRef, LineNo:int, Ty:LLVMMetadataRef, AlwaysPreserve:LLVMBool, Flags:ctypes.c_uint32) -> LLVMMetadataRef: ... +@dll.bind(LLVMMetadataRef, LLVMValueRef) +def LLVMGetSubprogram(Func:LLVMValueRef) -> LLVMMetadataRef: ... +@dll.bind(None, LLVMValueRef, LLVMMetadataRef) +def LLVMSetSubprogram(Func:LLVMValueRef, SP:LLVMMetadataRef) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMMetadataRef) +def LLVMDISubprogramGetLine(Subprogram:LLVMMetadataRef) -> int: ... +@dll.bind(LLVMMetadataRef, LLVMValueRef) +def LLVMInstructionGetDebugLoc(Inst:LLVMValueRef) -> LLVMMetadataRef: ... +@dll.bind(None, LLVMValueRef, LLVMMetadataRef) +def LLVMInstructionSetDebugLoc(Inst:LLVMValueRef, Loc:LLVMMetadataRef) -> None: ... +@dll.bind(LLVMMetadataRef, LLVMDIBuilderRef, LLVMMetadataRef, c.POINTER[ctypes.c_char], size_t, LLVMMetadataRef, ctypes.c_uint32, LLVMBool) +def LLVMDIBuilderCreateLabel(Builder:LLVMDIBuilderRef, Context:LLVMMetadataRef, Name:c.POINTER[ctypes.c_char], NameLen:size_t, File:LLVMMetadataRef, LineNo:int, AlwaysPreserve:LLVMBool) -> LLVMMetadataRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, LLVMValueRef) +def LLVMDIBuilderInsertLabelBefore(Builder:LLVMDIBuilderRef, LabelInfo:LLVMMetadataRef, Location:LLVMMetadataRef, InsertBefore:LLVMValueRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMDbgRecordRef, LLVMDIBuilderRef, LLVMMetadataRef, LLVMMetadataRef, LLVMBasicBlockRef) +def LLVMDIBuilderInsertLabelAtEnd(Builder:LLVMDIBuilderRef, LabelInfo:LLVMMetadataRef, Location:LLVMMetadataRef, InsertAtEnd:LLVMBasicBlockRef) -> LLVMDbgRecordRef: ... +@dll.bind(LLVMMetadataKind, LLVMMetadataRef) +def LLVMGetMetadataKind(Metadata:LLVMMetadataRef) -> LLVMMetadataKind: ... +LLVMDisasmContextRef: TypeAlias = ctypes.c_void_p +LLVMOpInfoCallback: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_int32, ctypes.c_void_p]] +LLVMSymbolLookupCallback: TypeAlias = c.CFUNCTYPE[c.POINTER[ctypes.c_char], [ctypes.c_void_p, ctypes.c_uint64, c.POINTER[ctypes.c_uint64], ctypes.c_uint64, c.POINTER[c.POINTER[ctypes.c_char]]]] +@dll.bind(LLVMDisasmContextRef, c.POINTER[ctypes.c_char], ctypes.c_void_p, ctypes.c_int32, LLVMOpInfoCallback, LLVMSymbolLookupCallback) +def LLVMCreateDisasm(TripleName:c.POINTER[ctypes.c_char], DisInfo:ctypes.c_void_p, TagType:int, GetOpInfo:LLVMOpInfoCallback, SymbolLookUp:LLVMSymbolLookupCallback) -> LLVMDisasmContextRef: ... +@dll.bind(LLVMDisasmContextRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_void_p, ctypes.c_int32, LLVMOpInfoCallback, LLVMSymbolLookupCallback) +def LLVMCreateDisasmCPU(Triple:c.POINTER[ctypes.c_char], CPU:c.POINTER[ctypes.c_char], DisInfo:ctypes.c_void_p, TagType:int, GetOpInfo:LLVMOpInfoCallback, SymbolLookUp:LLVMSymbolLookupCallback) -> LLVMDisasmContextRef: ... +@dll.bind(LLVMDisasmContextRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_void_p, ctypes.c_int32, LLVMOpInfoCallback, LLVMSymbolLookupCallback) +def LLVMCreateDisasmCPUFeatures(Triple:c.POINTER[ctypes.c_char], CPU:c.POINTER[ctypes.c_char], Features:c.POINTER[ctypes.c_char], DisInfo:ctypes.c_void_p, TagType:int, GetOpInfo:LLVMOpInfoCallback, SymbolLookUp:LLVMSymbolLookupCallback) -> LLVMDisasmContextRef: ... +@dll.bind(ctypes.c_int32, LLVMDisasmContextRef, uint64_t) +def LLVMSetDisasmOptions(DC:LLVMDisasmContextRef, Options:uint64_t) -> int: ... +@dll.bind(None, LLVMDisasmContextRef) +def LLVMDisasmDispose(DC:LLVMDisasmContextRef) -> None: ... +@dll.bind(size_t, LLVMDisasmContextRef, c.POINTER[uint8_t], uint64_t, uint64_t, c.POINTER[ctypes.c_char], size_t) +def LLVMDisasmInstruction(DC:LLVMDisasmContextRef, Bytes:c.POINTER[uint8_t], BytesSize:uint64_t, PC:uint64_t, OutString:c.POINTER[ctypes.c_char], OutStringSize:size_t) -> size_t: ... +@c.record +class struct_LLVMOpInfoSymbol1(c.Struct): + SIZE = 24 + Present: int + Name: c.POINTER[ctypes.c_char] + Value: int +struct_LLVMOpInfoSymbol1.register_fields([('Present', uint64_t, 0), ('Name', c.POINTER[ctypes.c_char], 8), ('Value', uint64_t, 16)]) +@c.record +class struct_LLVMOpInfo1(c.Struct): + SIZE = 64 + AddSymbol: struct_LLVMOpInfoSymbol1 + SubtractSymbol: struct_LLVMOpInfoSymbol1 + Value: int + VariantKind: int +struct_LLVMOpInfo1.register_fields([('AddSymbol', struct_LLVMOpInfoSymbol1, 0), ('SubtractSymbol', struct_LLVMOpInfoSymbol1, 24), ('Value', uint64_t, 48), ('VariantKind', uint64_t, 56)]) +class struct_LLVMOpaqueError(c.Struct): pass +LLVMErrorRef: TypeAlias = c.POINTER[struct_LLVMOpaqueError] +LLVMErrorTypeId: TypeAlias = ctypes.c_void_p +@dll.bind(LLVMErrorTypeId, LLVMErrorRef) +def LLVMGetErrorTypeId(Err:LLVMErrorRef) -> LLVMErrorTypeId: ... +@dll.bind(None, LLVMErrorRef) +def LLVMConsumeError(Err:LLVMErrorRef) -> None: ... +@dll.bind(None, LLVMErrorRef) +def LLVMCantFail(Err:LLVMErrorRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMErrorRef) +def LLVMGetErrorMessage(Err:LLVMErrorRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, c.POINTER[ctypes.c_char]) +def LLVMDisposeErrorMessage(ErrMsg:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(LLVMErrorTypeId) +def LLVMGetStringErrorTypeId() -> LLVMErrorTypeId: ... +@dll.bind(LLVMErrorRef, c.POINTER[ctypes.c_char]) +def LLVMCreateStringError(ErrMsg:c.POINTER[ctypes.c_char]) -> LLVMErrorRef: ... +@dll.bind(None) +def LLVMInitializeAArch64TargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeAMDGPUTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeARMTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeAVRTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeBPFTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeHexagonTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeLanaiTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeLoongArchTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeMipsTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeMSP430TargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeNVPTXTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializePowerPCTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeRISCVTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeSparcTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeSPIRVTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeSystemZTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeVETargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeWebAssemblyTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeX86TargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeXCoreTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeM68kTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeXtensaTargetInfo() -> None: ... +@dll.bind(None) +def LLVMInitializeAArch64Target() -> None: ... +@dll.bind(None) +def LLVMInitializeAMDGPUTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeARMTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeAVRTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeBPFTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeHexagonTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeLanaiTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeLoongArchTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeMipsTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeMSP430Target() -> None: ... +@dll.bind(None) +def LLVMInitializeNVPTXTarget() -> None: ... +@dll.bind(None) +def LLVMInitializePowerPCTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeRISCVTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeSparcTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeSPIRVTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeSystemZTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeVETarget() -> None: ... +@dll.bind(None) +def LLVMInitializeWebAssemblyTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeX86Target() -> None: ... +@dll.bind(None) +def LLVMInitializeXCoreTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeM68kTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeXtensaTarget() -> None: ... +@dll.bind(None) +def LLVMInitializeAArch64TargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeAMDGPUTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeARMTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeAVRTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeBPFTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeHexagonTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeLanaiTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeLoongArchTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeMipsTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeMSP430TargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeNVPTXTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializePowerPCTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeRISCVTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeSparcTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeSPIRVTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeSystemZTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeVETargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeWebAssemblyTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeX86TargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeXCoreTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeM68kTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeXtensaTargetMC() -> None: ... +@dll.bind(None) +def LLVMInitializeAArch64AsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeAMDGPUAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeARMAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeAVRAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeBPFAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeHexagonAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeLanaiAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeLoongArchAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeMipsAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeMSP430AsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeNVPTXAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializePowerPCAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeRISCVAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeSparcAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeSPIRVAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeSystemZAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeVEAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeWebAssemblyAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeX86AsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeXCoreAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeM68kAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeXtensaAsmPrinter() -> None: ... +@dll.bind(None) +def LLVMInitializeAArch64AsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeAMDGPUAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeARMAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeAVRAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeBPFAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeHexagonAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeLanaiAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeLoongArchAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeMipsAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeMSP430AsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializePowerPCAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeRISCVAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeSparcAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeSystemZAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeVEAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeWebAssemblyAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeX86AsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeM68kAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeXtensaAsmParser() -> None: ... +@dll.bind(None) +def LLVMInitializeAArch64Disassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeAMDGPUDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeARMDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeAVRDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeBPFDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeHexagonDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeLanaiDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeLoongArchDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeMipsDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeMSP430Disassembler() -> None: ... +@dll.bind(None) +def LLVMInitializePowerPCDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeRISCVDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeSparcDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeSystemZDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeVEDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeWebAssemblyDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeX86Disassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeXCoreDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeM68kDisassembler() -> None: ... +@dll.bind(None) +def LLVMInitializeXtensaDisassembler() -> None: ... +class struct_LLVMOpaqueTargetData(c.Struct): pass +LLVMTargetDataRef: TypeAlias = c.POINTER[struct_LLVMOpaqueTargetData] +@dll.bind(LLVMTargetDataRef, LLVMModuleRef) +def LLVMGetModuleDataLayout(M:LLVMModuleRef) -> LLVMTargetDataRef: ... +@dll.bind(None, LLVMModuleRef, LLVMTargetDataRef) +def LLVMSetModuleDataLayout(M:LLVMModuleRef, DL:LLVMTargetDataRef) -> None: ... +@dll.bind(LLVMTargetDataRef, c.POINTER[ctypes.c_char]) +def LLVMCreateTargetData(StringRep:c.POINTER[ctypes.c_char]) -> LLVMTargetDataRef: ... +@dll.bind(None, LLVMTargetDataRef) +def LLVMDisposeTargetData(TD:LLVMTargetDataRef) -> None: ... +class struct_LLVMOpaqueTargetLibraryInfotData(c.Struct): pass +LLVMTargetLibraryInfoRef: TypeAlias = c.POINTER[struct_LLVMOpaqueTargetLibraryInfotData] +@dll.bind(None, LLVMTargetLibraryInfoRef, LLVMPassManagerRef) +def LLVMAddTargetLibraryInfo(TLI:LLVMTargetLibraryInfoRef, PM:LLVMPassManagerRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTargetDataRef) +def LLVMCopyStringRepOfTargetData(TD:LLVMTargetDataRef) -> c.POINTER[ctypes.c_char]: ... +enum_LLVMByteOrdering: dict[int, str] = {(LLVMBigEndian:=0): 'LLVMBigEndian', (LLVMLittleEndian:=1): 'LLVMLittleEndian'} +@dll.bind(ctypes.c_uint32, LLVMTargetDataRef) +def LLVMByteOrder(TD:LLVMTargetDataRef) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, LLVMTargetDataRef) +def LLVMPointerSize(TD:LLVMTargetDataRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMTargetDataRef, ctypes.c_uint32) +def LLVMPointerSizeForAS(TD:LLVMTargetDataRef, AS:int) -> int: ... +@dll.bind(LLVMTypeRef, LLVMTargetDataRef) +def LLVMIntPtrType(TD:LLVMTargetDataRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMTargetDataRef, ctypes.c_uint32) +def LLVMIntPtrTypeForAS(TD:LLVMTargetDataRef, AS:int) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, LLVMTargetDataRef) +def LLVMIntPtrTypeInContext(C:LLVMContextRef, TD:LLVMTargetDataRef) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, LLVMContextRef, LLVMTargetDataRef, ctypes.c_uint32) +def LLVMIntPtrTypeForASInContext(C:LLVMContextRef, TD:LLVMTargetDataRef, AS:int) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_uint64, LLVMTargetDataRef, LLVMTypeRef) +def LLVMSizeOfTypeInBits(TD:LLVMTargetDataRef, Ty:LLVMTypeRef) -> int: ... +@dll.bind(ctypes.c_uint64, LLVMTargetDataRef, LLVMTypeRef) +def LLVMStoreSizeOfType(TD:LLVMTargetDataRef, Ty:LLVMTypeRef) -> int: ... +@dll.bind(ctypes.c_uint64, LLVMTargetDataRef, LLVMTypeRef) +def LLVMABISizeOfType(TD:LLVMTargetDataRef, Ty:LLVMTypeRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMTargetDataRef, LLVMTypeRef) +def LLVMABIAlignmentOfType(TD:LLVMTargetDataRef, Ty:LLVMTypeRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMTargetDataRef, LLVMTypeRef) +def LLVMCallFrameAlignmentOfType(TD:LLVMTargetDataRef, Ty:LLVMTypeRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMTargetDataRef, LLVMTypeRef) +def LLVMPreferredAlignmentOfType(TD:LLVMTargetDataRef, Ty:LLVMTypeRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMTargetDataRef, LLVMValueRef) +def LLVMPreferredAlignmentOfGlobal(TD:LLVMTargetDataRef, GlobalVar:LLVMValueRef) -> int: ... +@dll.bind(ctypes.c_uint32, LLVMTargetDataRef, LLVMTypeRef, ctypes.c_uint64) +def LLVMElementAtOffset(TD:LLVMTargetDataRef, StructTy:LLVMTypeRef, Offset:int) -> int: ... +@dll.bind(ctypes.c_uint64, LLVMTargetDataRef, LLVMTypeRef, ctypes.c_uint32) +def LLVMOffsetOfElement(TD:LLVMTargetDataRef, StructTy:LLVMTypeRef, Element:int) -> int: ... +class struct_LLVMTarget(c.Struct): pass +LLVMTargetRef: TypeAlias = c.POINTER[struct_LLVMTarget] +@dll.bind(LLVMTargetRef) +def LLVMGetFirstTarget() -> LLVMTargetRef: ... +@dll.bind(LLVMTargetRef, LLVMTargetRef) +def LLVMGetNextTarget(T:LLVMTargetRef) -> LLVMTargetRef: ... +@dll.bind(LLVMTargetRef, c.POINTER[ctypes.c_char]) +def LLVMGetTargetFromName(Name:c.POINTER[ctypes.c_char]) -> LLVMTargetRef: ... +@dll.bind(LLVMBool, c.POINTER[ctypes.c_char], c.POINTER[LLVMTargetRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMGetTargetFromTriple(Triple:c.POINTER[ctypes.c_char], T:c.POINTER[LLVMTargetRef], ErrorMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTargetRef) +def LLVMGetTargetName(T:LLVMTargetRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTargetRef) +def LLVMGetTargetDescription(T:LLVMTargetRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMBool, LLVMTargetRef) +def LLVMTargetHasJIT(T:LLVMTargetRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMTargetRef) +def LLVMTargetHasTargetMachine(T:LLVMTargetRef) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMTargetRef) +def LLVMTargetHasAsmBackend(T:LLVMTargetRef) -> LLVMBool: ... +class struct_LLVMOpaqueTargetMachineOptions(c.Struct): pass +LLVMTargetMachineOptionsRef: TypeAlias = c.POINTER[struct_LLVMOpaqueTargetMachineOptions] +@dll.bind(LLVMTargetMachineOptionsRef) +def LLVMCreateTargetMachineOptions() -> LLVMTargetMachineOptionsRef: ... +@dll.bind(None, LLVMTargetMachineOptionsRef) +def LLVMDisposeTargetMachineOptions(Options:LLVMTargetMachineOptionsRef) -> None: ... +@dll.bind(None, LLVMTargetMachineOptionsRef, c.POINTER[ctypes.c_char]) +def LLVMTargetMachineOptionsSetCPU(Options:LLVMTargetMachineOptionsRef, CPU:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, LLVMTargetMachineOptionsRef, c.POINTER[ctypes.c_char]) +def LLVMTargetMachineOptionsSetFeatures(Options:LLVMTargetMachineOptionsRef, Features:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, LLVMTargetMachineOptionsRef, c.POINTER[ctypes.c_char]) +def LLVMTargetMachineOptionsSetABI(Options:LLVMTargetMachineOptionsRef, ABI:c.POINTER[ctypes.c_char]) -> None: ... +LLVMCodeGenOptLevel: dict[int, str] = {(LLVMCodeGenLevelNone:=0): 'LLVMCodeGenLevelNone', (LLVMCodeGenLevelLess:=1): 'LLVMCodeGenLevelLess', (LLVMCodeGenLevelDefault:=2): 'LLVMCodeGenLevelDefault', (LLVMCodeGenLevelAggressive:=3): 'LLVMCodeGenLevelAggressive'} +@dll.bind(None, LLVMTargetMachineOptionsRef, ctypes.c_uint32) +def LLVMTargetMachineOptionsSetCodeGenOptLevel(Options:LLVMTargetMachineOptionsRef, Level:ctypes.c_uint32) -> None: ... +LLVMRelocMode: dict[int, str] = {(LLVMRelocDefault:=0): 'LLVMRelocDefault', (LLVMRelocStatic:=1): 'LLVMRelocStatic', (LLVMRelocPIC:=2): 'LLVMRelocPIC', (LLVMRelocDynamicNoPic:=3): 'LLVMRelocDynamicNoPic', (LLVMRelocROPI:=4): 'LLVMRelocROPI', (LLVMRelocRWPI:=5): 'LLVMRelocRWPI', (LLVMRelocROPI_RWPI:=6): 'LLVMRelocROPI_RWPI'} +@dll.bind(None, LLVMTargetMachineOptionsRef, ctypes.c_uint32) +def LLVMTargetMachineOptionsSetRelocMode(Options:LLVMTargetMachineOptionsRef, Reloc:ctypes.c_uint32) -> None: ... +LLVMCodeModel: dict[int, str] = {(LLVMCodeModelDefault:=0): 'LLVMCodeModelDefault', (LLVMCodeModelJITDefault:=1): 'LLVMCodeModelJITDefault', (LLVMCodeModelTiny:=2): 'LLVMCodeModelTiny', (LLVMCodeModelSmall:=3): 'LLVMCodeModelSmall', (LLVMCodeModelKernel:=4): 'LLVMCodeModelKernel', (LLVMCodeModelMedium:=5): 'LLVMCodeModelMedium', (LLVMCodeModelLarge:=6): 'LLVMCodeModelLarge'} +@dll.bind(None, LLVMTargetMachineOptionsRef, ctypes.c_uint32) +def LLVMTargetMachineOptionsSetCodeModel(Options:LLVMTargetMachineOptionsRef, CodeModel:ctypes.c_uint32) -> None: ... +class struct_LLVMOpaqueTargetMachine(c.Struct): pass +LLVMTargetMachineRef: TypeAlias = c.POINTER[struct_LLVMOpaqueTargetMachine] +@dll.bind(LLVMTargetMachineRef, LLVMTargetRef, c.POINTER[ctypes.c_char], LLVMTargetMachineOptionsRef) +def LLVMCreateTargetMachineWithOptions(T:LLVMTargetRef, Triple:c.POINTER[ctypes.c_char], Options:LLVMTargetMachineOptionsRef) -> LLVMTargetMachineRef: ... +@dll.bind(LLVMTargetMachineRef, LLVMTargetRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32) +def LLVMCreateTargetMachine(T:LLVMTargetRef, Triple:c.POINTER[ctypes.c_char], CPU:c.POINTER[ctypes.c_char], Features:c.POINTER[ctypes.c_char], Level:ctypes.c_uint32, Reloc:ctypes.c_uint32, CodeModel:ctypes.c_uint32) -> LLVMTargetMachineRef: ... +@dll.bind(None, LLVMTargetMachineRef) +def LLVMDisposeTargetMachine(T:LLVMTargetMachineRef) -> None: ... +@dll.bind(LLVMTargetRef, LLVMTargetMachineRef) +def LLVMGetTargetMachineTarget(T:LLVMTargetMachineRef) -> LLVMTargetRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTargetMachineRef) +def LLVMGetTargetMachineTriple(T:LLVMTargetMachineRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTargetMachineRef) +def LLVMGetTargetMachineCPU(T:LLVMTargetMachineRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMTargetMachineRef) +def LLVMGetTargetMachineFeatureString(T:LLVMTargetMachineRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMTargetDataRef, LLVMTargetMachineRef) +def LLVMCreateTargetDataLayout(T:LLVMTargetMachineRef) -> LLVMTargetDataRef: ... +@dll.bind(None, LLVMTargetMachineRef, LLVMBool) +def LLVMSetTargetMachineAsmVerbosity(T:LLVMTargetMachineRef, VerboseAsm:LLVMBool) -> None: ... +@dll.bind(None, LLVMTargetMachineRef, LLVMBool) +def LLVMSetTargetMachineFastISel(T:LLVMTargetMachineRef, Enable:LLVMBool) -> None: ... +@dll.bind(None, LLVMTargetMachineRef, LLVMBool) +def LLVMSetTargetMachineGlobalISel(T:LLVMTargetMachineRef, Enable:LLVMBool) -> None: ... +LLVMGlobalISelAbortMode: dict[int, str] = {(LLVMGlobalISelAbortEnable:=0): 'LLVMGlobalISelAbortEnable', (LLVMGlobalISelAbortDisable:=1): 'LLVMGlobalISelAbortDisable', (LLVMGlobalISelAbortDisableWithDiag:=2): 'LLVMGlobalISelAbortDisableWithDiag'} +@dll.bind(None, LLVMTargetMachineRef, ctypes.c_uint32) +def LLVMSetTargetMachineGlobalISelAbort(T:LLVMTargetMachineRef, Mode:ctypes.c_uint32) -> None: ... +@dll.bind(None, LLVMTargetMachineRef, LLVMBool) +def LLVMSetTargetMachineMachineOutliner(T:LLVMTargetMachineRef, Enable:LLVMBool) -> None: ... +LLVMCodeGenFileType: dict[int, str] = {(LLVMAssemblyFile:=0): 'LLVMAssemblyFile', (LLVMObjectFile:=1): 'LLVMObjectFile'} +@dll.bind(LLVMBool, LLVMTargetMachineRef, LLVMModuleRef, c.POINTER[ctypes.c_char], ctypes.c_uint32, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMTargetMachineEmitToFile(T:LLVMTargetMachineRef, M:LLVMModuleRef, Filename:c.POINTER[ctypes.c_char], codegen:ctypes.c_uint32, ErrorMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMTargetMachineRef, LLVMModuleRef, ctypes.c_uint32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[LLVMMemoryBufferRef]) +def LLVMTargetMachineEmitToMemoryBuffer(T:LLVMTargetMachineRef, M:LLVMModuleRef, codegen:ctypes.c_uint32, ErrorMessage:c.POINTER[c.POINTER[ctypes.c_char]], OutMemBuf:c.POINTER[LLVMMemoryBufferRef]) -> LLVMBool: ... +@dll.bind(c.POINTER[ctypes.c_char]) +def LLVMGetDefaultTargetTriple() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def LLVMNormalizeTargetTriple(triple:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char]) +def LLVMGetHostCPUName() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char]) +def LLVMGetHostCPUFeatures() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMTargetMachineRef, LLVMPassManagerRef) +def LLVMAddAnalysisPasses(T:LLVMTargetMachineRef, PM:LLVMPassManagerRef) -> None: ... +@dll.bind(None) +def LLVMLinkInMCJIT() -> None: ... +@dll.bind(None) +def LLVMLinkInInterpreter() -> None: ... +class struct_LLVMOpaqueGenericValue(c.Struct): pass +LLVMGenericValueRef: TypeAlias = c.POINTER[struct_LLVMOpaqueGenericValue] +class struct_LLVMOpaqueExecutionEngine(c.Struct): pass +LLVMExecutionEngineRef: TypeAlias = c.POINTER[struct_LLVMOpaqueExecutionEngine] +class struct_LLVMOpaqueMCJITMemoryManager(c.Struct): pass +LLVMMCJITMemoryManagerRef: TypeAlias = c.POINTER[struct_LLVMOpaqueMCJITMemoryManager] +@c.record +class struct_LLVMMCJITCompilerOptions(c.Struct): + SIZE = 24 + OptLevel: int + CodeModel: int + NoFramePointerElim: int + EnableFastISel: int + MCJMM: c.POINTER[struct_LLVMOpaqueMCJITMemoryManager] +struct_LLVMMCJITCompilerOptions.register_fields([('OptLevel', ctypes.c_uint32, 0), ('CodeModel', ctypes.c_uint32, 4), ('NoFramePointerElim', LLVMBool, 8), ('EnableFastISel', LLVMBool, 12), ('MCJMM', LLVMMCJITMemoryManagerRef, 16)]) +@dll.bind(LLVMGenericValueRef, LLVMTypeRef, ctypes.c_uint64, LLVMBool) +def LLVMCreateGenericValueOfInt(Ty:LLVMTypeRef, N:int, IsSigned:LLVMBool) -> LLVMGenericValueRef: ... +@dll.bind(LLVMGenericValueRef, ctypes.c_void_p) +def LLVMCreateGenericValueOfPointer(P:ctypes.c_void_p) -> LLVMGenericValueRef: ... +@dll.bind(LLVMGenericValueRef, LLVMTypeRef, ctypes.c_double) +def LLVMCreateGenericValueOfFloat(Ty:LLVMTypeRef, N:float) -> LLVMGenericValueRef: ... +@dll.bind(ctypes.c_uint32, LLVMGenericValueRef) +def LLVMGenericValueIntWidth(GenValRef:LLVMGenericValueRef) -> int: ... +@dll.bind(ctypes.c_uint64, LLVMGenericValueRef, LLVMBool) +def LLVMGenericValueToInt(GenVal:LLVMGenericValueRef, IsSigned:LLVMBool) -> int: ... +@dll.bind(ctypes.c_void_p, LLVMGenericValueRef) +def LLVMGenericValueToPointer(GenVal:LLVMGenericValueRef) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_double, LLVMTypeRef, LLVMGenericValueRef) +def LLVMGenericValueToFloat(TyRef:LLVMTypeRef, GenVal:LLVMGenericValueRef) -> float: ... +@dll.bind(None, LLVMGenericValueRef) +def LLVMDisposeGenericValue(GenVal:LLVMGenericValueRef) -> None: ... +@dll.bind(LLVMBool, c.POINTER[LLVMExecutionEngineRef], LLVMModuleRef, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMCreateExecutionEngineForModule(OutEE:c.POINTER[LLVMExecutionEngineRef], M:LLVMModuleRef, OutError:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, c.POINTER[LLVMExecutionEngineRef], LLVMModuleRef, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMCreateInterpreterForModule(OutInterp:c.POINTER[LLVMExecutionEngineRef], M:LLVMModuleRef, OutError:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, c.POINTER[LLVMExecutionEngineRef], LLVMModuleRef, ctypes.c_uint32, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMCreateJITCompilerForModule(OutJIT:c.POINTER[LLVMExecutionEngineRef], M:LLVMModuleRef, OptLevel:int, OutError:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(None, c.POINTER[struct_LLVMMCJITCompilerOptions], size_t) +def LLVMInitializeMCJITCompilerOptions(Options:c.POINTER[struct_LLVMMCJITCompilerOptions], SizeOfOptions:size_t) -> None: ... +@dll.bind(LLVMBool, c.POINTER[LLVMExecutionEngineRef], LLVMModuleRef, c.POINTER[struct_LLVMMCJITCompilerOptions], size_t, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMCreateMCJITCompilerForModule(OutJIT:c.POINTER[LLVMExecutionEngineRef], M:LLVMModuleRef, Options:c.POINTER[struct_LLVMMCJITCompilerOptions], SizeOfOptions:size_t, OutError:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(None, LLVMExecutionEngineRef) +def LLVMDisposeExecutionEngine(EE:LLVMExecutionEngineRef) -> None: ... +@dll.bind(None, LLVMExecutionEngineRef) +def LLVMRunStaticConstructors(EE:LLVMExecutionEngineRef) -> None: ... +@dll.bind(None, LLVMExecutionEngineRef) +def LLVMRunStaticDestructors(EE:LLVMExecutionEngineRef) -> None: ... +@dll.bind(ctypes.c_int32, LLVMExecutionEngineRef, LLVMValueRef, ctypes.c_uint32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMRunFunctionAsMain(EE:LLVMExecutionEngineRef, F:LLVMValueRef, ArgC:int, ArgV:c.POINTER[c.POINTER[ctypes.c_char]], EnvP:c.POINTER[c.POINTER[ctypes.c_char]]) -> int: ... +@dll.bind(LLVMGenericValueRef, LLVMExecutionEngineRef, LLVMValueRef, ctypes.c_uint32, c.POINTER[LLVMGenericValueRef]) +def LLVMRunFunction(EE:LLVMExecutionEngineRef, F:LLVMValueRef, NumArgs:int, Args:c.POINTER[LLVMGenericValueRef]) -> LLVMGenericValueRef: ... +@dll.bind(None, LLVMExecutionEngineRef, LLVMValueRef) +def LLVMFreeMachineCodeForFunction(EE:LLVMExecutionEngineRef, F:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMExecutionEngineRef, LLVMModuleRef) +def LLVMAddModule(EE:LLVMExecutionEngineRef, M:LLVMModuleRef) -> None: ... +@dll.bind(LLVMBool, LLVMExecutionEngineRef, LLVMModuleRef, c.POINTER[LLVMModuleRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMRemoveModule(EE:LLVMExecutionEngineRef, M:LLVMModuleRef, OutMod:c.POINTER[LLVMModuleRef], OutError:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +@dll.bind(LLVMBool, LLVMExecutionEngineRef, c.POINTER[ctypes.c_char], c.POINTER[LLVMValueRef]) +def LLVMFindFunction(EE:LLVMExecutionEngineRef, Name:c.POINTER[ctypes.c_char], OutFn:c.POINTER[LLVMValueRef]) -> LLVMBool: ... +@dll.bind(ctypes.c_void_p, LLVMExecutionEngineRef, LLVMValueRef) +def LLVMRecompileAndRelinkFunction(EE:LLVMExecutionEngineRef, Fn:LLVMValueRef) -> ctypes.c_void_p: ... +@dll.bind(LLVMTargetDataRef, LLVMExecutionEngineRef) +def LLVMGetExecutionEngineTargetData(EE:LLVMExecutionEngineRef) -> LLVMTargetDataRef: ... +@dll.bind(LLVMTargetMachineRef, LLVMExecutionEngineRef) +def LLVMGetExecutionEngineTargetMachine(EE:LLVMExecutionEngineRef) -> LLVMTargetMachineRef: ... +@dll.bind(None, LLVMExecutionEngineRef, LLVMValueRef, ctypes.c_void_p) +def LLVMAddGlobalMapping(EE:LLVMExecutionEngineRef, Global:LLVMValueRef, Addr:ctypes.c_void_p) -> None: ... +@dll.bind(ctypes.c_void_p, LLVMExecutionEngineRef, LLVMValueRef) +def LLVMGetPointerToGlobal(EE:LLVMExecutionEngineRef, Global:LLVMValueRef) -> ctypes.c_void_p: ... +@dll.bind(uint64_t, LLVMExecutionEngineRef, c.POINTER[ctypes.c_char]) +def LLVMGetGlobalValueAddress(EE:LLVMExecutionEngineRef, Name:c.POINTER[ctypes.c_char]) -> uint64_t: ... +@dll.bind(uint64_t, LLVMExecutionEngineRef, c.POINTER[ctypes.c_char]) +def LLVMGetFunctionAddress(EE:LLVMExecutionEngineRef, Name:c.POINTER[ctypes.c_char]) -> uint64_t: ... +@dll.bind(LLVMBool, LLVMExecutionEngineRef, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMExecutionEngineGetErrMsg(EE:LLVMExecutionEngineRef, OutError:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +LLVMMemoryManagerAllocateCodeSectionCallback: TypeAlias = c.CFUNCTYPE[c.POINTER[ctypes.c_ubyte], [ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char]]] +LLVMMemoryManagerAllocateDataSectionCallback: TypeAlias = c.CFUNCTYPE[c.POINTER[ctypes.c_ubyte], [ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_int32]] +LLVMMemoryManagerFinalizeMemoryCallback: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, c.POINTER[c.POINTER[ctypes.c_char]]]] +LLVMMemoryManagerDestroyCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +@dll.bind(LLVMMCJITMemoryManagerRef, ctypes.c_void_p, LLVMMemoryManagerAllocateCodeSectionCallback, LLVMMemoryManagerAllocateDataSectionCallback, LLVMMemoryManagerFinalizeMemoryCallback, LLVMMemoryManagerDestroyCallback) +def LLVMCreateSimpleMCJITMemoryManager(Opaque:ctypes.c_void_p, AllocateCodeSection:LLVMMemoryManagerAllocateCodeSectionCallback, AllocateDataSection:LLVMMemoryManagerAllocateDataSectionCallback, FinalizeMemory:LLVMMemoryManagerFinalizeMemoryCallback, Destroy:LLVMMemoryManagerDestroyCallback) -> LLVMMCJITMemoryManagerRef: ... +@dll.bind(None, LLVMMCJITMemoryManagerRef) +def LLVMDisposeMCJITMemoryManager(MM:LLVMMCJITMemoryManagerRef) -> None: ... +class struct_LLVMOpaqueJITEventListener(c.Struct): pass +LLVMJITEventListenerRef: TypeAlias = c.POINTER[struct_LLVMOpaqueJITEventListener] +@dll.bind(LLVMJITEventListenerRef) +def LLVMCreateGDBRegistrationListener() -> LLVMJITEventListenerRef: ... +@dll.bind(LLVMJITEventListenerRef) +def LLVMCreateIntelJITEventListener() -> LLVMJITEventListenerRef: ... +@dll.bind(LLVMJITEventListenerRef) +def LLVMCreateOProfileJITEventListener() -> LLVMJITEventListenerRef: ... +@dll.bind(LLVMJITEventListenerRef) +def LLVMCreatePerfJITEventListener() -> LLVMJITEventListenerRef: ... +@dll.bind(LLVMBool, LLVMContextRef, LLVMMemoryBufferRef, c.POINTER[LLVMModuleRef], c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMParseIRInContext(ContextRef:LLVMContextRef, MemBuf:LLVMMemoryBufferRef, OutM:c.POINTER[LLVMModuleRef], OutMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBool: ... +class struct_LLVMOrcOpaqueExecutionSession(c.Struct): pass +LLVMOrcExecutionSessionRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueExecutionSession] +LLVMOrcErrorReporterFunction: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, c.POINTER[struct_LLVMOpaqueError]]] +@dll.bind(None, LLVMOrcExecutionSessionRef, LLVMOrcErrorReporterFunction, ctypes.c_void_p) +def LLVMOrcExecutionSessionSetErrorReporter(ES:LLVMOrcExecutionSessionRef, ReportError:LLVMOrcErrorReporterFunction, Ctx:ctypes.c_void_p) -> None: ... +class struct_LLVMOrcOpaqueSymbolStringPool(c.Struct): pass +LLVMOrcSymbolStringPoolRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueSymbolStringPool] +@dll.bind(LLVMOrcSymbolStringPoolRef, LLVMOrcExecutionSessionRef) +def LLVMOrcExecutionSessionGetSymbolStringPool(ES:LLVMOrcExecutionSessionRef) -> LLVMOrcSymbolStringPoolRef: ... +@dll.bind(None, LLVMOrcSymbolStringPoolRef) +def LLVMOrcSymbolStringPoolClearDeadEntries(SSP:LLVMOrcSymbolStringPoolRef) -> None: ... +class struct_LLVMOrcOpaqueSymbolStringPoolEntry(c.Struct): pass +LLVMOrcSymbolStringPoolEntryRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry] +@dll.bind(LLVMOrcSymbolStringPoolEntryRef, LLVMOrcExecutionSessionRef, c.POINTER[ctypes.c_char]) +def LLVMOrcExecutionSessionIntern(ES:LLVMOrcExecutionSessionRef, Name:c.POINTER[ctypes.c_char]) -> LLVMOrcSymbolStringPoolEntryRef: ... +LLVMOrcLookupKind: dict[int, str] = {(LLVMOrcLookupKindStatic:=0): 'LLVMOrcLookupKindStatic', (LLVMOrcLookupKindDLSym:=1): 'LLVMOrcLookupKindDLSym'} +@c.record +class LLVMOrcCJITDylibSearchOrderElement(c.Struct): + SIZE = 16 + JD: c.POINTER[struct_LLVMOrcOpaqueJITDylib] + JDLookupFlags: int +class struct_LLVMOrcOpaqueJITDylib(c.Struct): pass +LLVMOrcJITDylibRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueJITDylib] +LLVMOrcJITDylibLookupFlags: dict[int, str] = {(LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly:=0): 'LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly', (LLVMOrcJITDylibLookupFlagsMatchAllSymbols:=1): 'LLVMOrcJITDylibLookupFlagsMatchAllSymbols'} +LLVMOrcCJITDylibSearchOrderElement.register_fields([('JD', LLVMOrcJITDylibRef, 0), ('JDLookupFlags', ctypes.c_uint32, 8)]) +LLVMOrcCJITDylibSearchOrder: TypeAlias = c.POINTER[LLVMOrcCJITDylibSearchOrderElement] +@c.record +class LLVMOrcCLookupSetElement(c.Struct): + SIZE = 16 + Name: c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry] + LookupFlags: int +LLVMOrcSymbolLookupFlags: dict[int, str] = {(LLVMOrcSymbolLookupFlagsRequiredSymbol:=0): 'LLVMOrcSymbolLookupFlagsRequiredSymbol', (LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol:=1): 'LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol'} +LLVMOrcCLookupSetElement.register_fields([('Name', LLVMOrcSymbolStringPoolEntryRef, 0), ('LookupFlags', ctypes.c_uint32, 8)]) +LLVMOrcCLookupSet: TypeAlias = c.POINTER[LLVMOrcCLookupSetElement] +@c.record +class LLVMOrcCSymbolMapPair(c.Struct): + SIZE = 24 + Name: c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry] + Sym: LLVMJITEvaluatedSymbol +@c.record +class LLVMJITEvaluatedSymbol(c.Struct): + SIZE = 16 + Address: int + Flags: LLVMJITSymbolFlags +LLVMOrcExecutorAddress: TypeAlias = ctypes.c_uint64 +@c.record +class LLVMJITSymbolFlags(c.Struct): + SIZE = 2 + GenericFlags: int + TargetFlags: int +LLVMJITSymbolFlags.register_fields([('GenericFlags', uint8_t, 0), ('TargetFlags', uint8_t, 1)]) +LLVMJITEvaluatedSymbol.register_fields([('Address', LLVMOrcExecutorAddress, 0), ('Flags', LLVMJITSymbolFlags, 8)]) +LLVMOrcCSymbolMapPair.register_fields([('Name', LLVMOrcSymbolStringPoolEntryRef, 0), ('Sym', LLVMJITEvaluatedSymbol, 8)]) +LLVMOrcExecutionSessionLookupHandleResultFunction: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_LLVMOpaqueError], c.POINTER[LLVMOrcCSymbolMapPair], ctypes.c_uint64, ctypes.c_void_p]] +@dll.bind(None, LLVMOrcExecutionSessionRef, ctypes.c_uint32, LLVMOrcCJITDylibSearchOrder, size_t, LLVMOrcCLookupSet, size_t, LLVMOrcExecutionSessionLookupHandleResultFunction, ctypes.c_void_p) +def LLVMOrcExecutionSessionLookup(ES:LLVMOrcExecutionSessionRef, K:ctypes.c_uint32, SearchOrder:LLVMOrcCJITDylibSearchOrder, SearchOrderSize:size_t, Symbols:LLVMOrcCLookupSet, SymbolsSize:size_t, HandleResult:LLVMOrcExecutionSessionLookupHandleResultFunction, Ctx:ctypes.c_void_p) -> None: ... +@dll.bind(None, LLVMOrcSymbolStringPoolEntryRef) +def LLVMOrcRetainSymbolStringPoolEntry(S:LLVMOrcSymbolStringPoolEntryRef) -> None: ... +@dll.bind(None, LLVMOrcSymbolStringPoolEntryRef) +def LLVMOrcReleaseSymbolStringPoolEntry(S:LLVMOrcSymbolStringPoolEntryRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMOrcSymbolStringPoolEntryRef) +def LLVMOrcSymbolStringPoolEntryStr(S:LLVMOrcSymbolStringPoolEntryRef) -> c.POINTER[ctypes.c_char]: ... +class struct_LLVMOrcOpaqueResourceTracker(c.Struct): pass +LLVMOrcResourceTrackerRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueResourceTracker] +@dll.bind(None, LLVMOrcResourceTrackerRef) +def LLVMOrcReleaseResourceTracker(RT:LLVMOrcResourceTrackerRef) -> None: ... +@dll.bind(None, LLVMOrcResourceTrackerRef, LLVMOrcResourceTrackerRef) +def LLVMOrcResourceTrackerTransferTo(SrcRT:LLVMOrcResourceTrackerRef, DstRT:LLVMOrcResourceTrackerRef) -> None: ... +@dll.bind(LLVMErrorRef, LLVMOrcResourceTrackerRef) +def LLVMOrcResourceTrackerRemove(RT:LLVMOrcResourceTrackerRef) -> LLVMErrorRef: ... +class struct_LLVMOrcOpaqueDefinitionGenerator(c.Struct): pass +LLVMOrcDefinitionGeneratorRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueDefinitionGenerator] +@dll.bind(None, LLVMOrcDefinitionGeneratorRef) +def LLVMOrcDisposeDefinitionGenerator(DG:LLVMOrcDefinitionGeneratorRef) -> None: ... +class struct_LLVMOrcOpaqueMaterializationUnit(c.Struct): pass +LLVMOrcMaterializationUnitRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueMaterializationUnit] +@dll.bind(None, LLVMOrcMaterializationUnitRef) +def LLVMOrcDisposeMaterializationUnit(MU:LLVMOrcMaterializationUnitRef) -> None: ... +@c.record +class LLVMOrcCSymbolFlagsMapPair(c.Struct): + SIZE = 16 + Name: c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry] + Flags: LLVMJITSymbolFlags +LLVMOrcCSymbolFlagsMapPair.register_fields([('Name', LLVMOrcSymbolStringPoolEntryRef, 0), ('Flags', LLVMJITSymbolFlags, 8)]) +LLVMOrcCSymbolFlagsMapPairs: TypeAlias = c.POINTER[LLVMOrcCSymbolFlagsMapPair] +class struct_LLVMOrcOpaqueMaterializationResponsibility(c.Struct): pass +LLVMOrcMaterializationUnitMaterializeFunction: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, c.POINTER[struct_LLVMOrcOpaqueMaterializationResponsibility]]] +LLVMOrcMaterializationUnitDiscardFunction: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, c.POINTER[struct_LLVMOrcOpaqueJITDylib], c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry]]] +LLVMOrcMaterializationUnitDestroyFunction: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +@dll.bind(LLVMOrcMaterializationUnitRef, c.POINTER[ctypes.c_char], ctypes.c_void_p, LLVMOrcCSymbolFlagsMapPairs, size_t, LLVMOrcSymbolStringPoolEntryRef, LLVMOrcMaterializationUnitMaterializeFunction, LLVMOrcMaterializationUnitDiscardFunction, LLVMOrcMaterializationUnitDestroyFunction) +def LLVMOrcCreateCustomMaterializationUnit(Name:c.POINTER[ctypes.c_char], Ctx:ctypes.c_void_p, Syms:LLVMOrcCSymbolFlagsMapPairs, NumSyms:size_t, InitSym:LLVMOrcSymbolStringPoolEntryRef, Materialize:LLVMOrcMaterializationUnitMaterializeFunction, Discard:LLVMOrcMaterializationUnitDiscardFunction, Destroy:LLVMOrcMaterializationUnitDestroyFunction) -> LLVMOrcMaterializationUnitRef: ... +LLVMOrcCSymbolMapPairs: TypeAlias = c.POINTER[LLVMOrcCSymbolMapPair] +@dll.bind(LLVMOrcMaterializationUnitRef, LLVMOrcCSymbolMapPairs, size_t) +def LLVMOrcAbsoluteSymbols(Syms:LLVMOrcCSymbolMapPairs, NumPairs:size_t) -> LLVMOrcMaterializationUnitRef: ... +class struct_LLVMOrcOpaqueLazyCallThroughManager(c.Struct): pass +LLVMOrcLazyCallThroughManagerRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueLazyCallThroughManager] +class struct_LLVMOrcOpaqueIndirectStubsManager(c.Struct): pass +LLVMOrcIndirectStubsManagerRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueIndirectStubsManager] +@c.record +class LLVMOrcCSymbolAliasMapPair(c.Struct): + SIZE = 24 + Name: c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry] + Entry: LLVMOrcCSymbolAliasMapEntry +@c.record +class LLVMOrcCSymbolAliasMapEntry(c.Struct): + SIZE = 16 + Name: c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry] + Flags: LLVMJITSymbolFlags +LLVMOrcCSymbolAliasMapEntry.register_fields([('Name', LLVMOrcSymbolStringPoolEntryRef, 0), ('Flags', LLVMJITSymbolFlags, 8)]) +LLVMOrcCSymbolAliasMapPair.register_fields([('Name', LLVMOrcSymbolStringPoolEntryRef, 0), ('Entry', LLVMOrcCSymbolAliasMapEntry, 8)]) +LLVMOrcCSymbolAliasMapPairs: TypeAlias = c.POINTER[LLVMOrcCSymbolAliasMapPair] +@dll.bind(LLVMOrcMaterializationUnitRef, LLVMOrcLazyCallThroughManagerRef, LLVMOrcIndirectStubsManagerRef, LLVMOrcJITDylibRef, LLVMOrcCSymbolAliasMapPairs, size_t) +def LLVMOrcLazyReexports(LCTM:LLVMOrcLazyCallThroughManagerRef, ISM:LLVMOrcIndirectStubsManagerRef, SourceRef:LLVMOrcJITDylibRef, CallableAliases:LLVMOrcCSymbolAliasMapPairs, NumPairs:size_t) -> LLVMOrcMaterializationUnitRef: ... +LLVMOrcMaterializationResponsibilityRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueMaterializationResponsibility] +@dll.bind(None, LLVMOrcMaterializationResponsibilityRef) +def LLVMOrcDisposeMaterializationResponsibility(MR:LLVMOrcMaterializationResponsibilityRef) -> None: ... +@dll.bind(LLVMOrcJITDylibRef, LLVMOrcMaterializationResponsibilityRef) +def LLVMOrcMaterializationResponsibilityGetTargetDylib(MR:LLVMOrcMaterializationResponsibilityRef) -> LLVMOrcJITDylibRef: ... +@dll.bind(LLVMOrcExecutionSessionRef, LLVMOrcMaterializationResponsibilityRef) +def LLVMOrcMaterializationResponsibilityGetExecutionSession(MR:LLVMOrcMaterializationResponsibilityRef) -> LLVMOrcExecutionSessionRef: ... +@dll.bind(LLVMOrcCSymbolFlagsMapPairs, LLVMOrcMaterializationResponsibilityRef, c.POINTER[size_t]) +def LLVMOrcMaterializationResponsibilityGetSymbols(MR:LLVMOrcMaterializationResponsibilityRef, NumPairs:c.POINTER[size_t]) -> LLVMOrcCSymbolFlagsMapPairs: ... +@dll.bind(None, LLVMOrcCSymbolFlagsMapPairs) +def LLVMOrcDisposeCSymbolFlagsMap(Pairs:LLVMOrcCSymbolFlagsMapPairs) -> None: ... +@dll.bind(LLVMOrcSymbolStringPoolEntryRef, LLVMOrcMaterializationResponsibilityRef) +def LLVMOrcMaterializationResponsibilityGetInitializerSymbol(MR:LLVMOrcMaterializationResponsibilityRef) -> LLVMOrcSymbolStringPoolEntryRef: ... +@dll.bind(c.POINTER[LLVMOrcSymbolStringPoolEntryRef], LLVMOrcMaterializationResponsibilityRef, c.POINTER[size_t]) +def LLVMOrcMaterializationResponsibilityGetRequestedSymbols(MR:LLVMOrcMaterializationResponsibilityRef, NumSymbols:c.POINTER[size_t]) -> c.POINTER[LLVMOrcSymbolStringPoolEntryRef]: ... +@dll.bind(None, c.POINTER[LLVMOrcSymbolStringPoolEntryRef]) +def LLVMOrcDisposeSymbols(Symbols:c.POINTER[LLVMOrcSymbolStringPoolEntryRef]) -> None: ... +@dll.bind(LLVMErrorRef, LLVMOrcMaterializationResponsibilityRef, LLVMOrcCSymbolMapPairs, size_t) +def LLVMOrcMaterializationResponsibilityNotifyResolved(MR:LLVMOrcMaterializationResponsibilityRef, Symbols:LLVMOrcCSymbolMapPairs, NumPairs:size_t) -> LLVMErrorRef: ... +@c.record +class LLVMOrcCSymbolDependenceGroup(c.Struct): + SIZE = 32 + Symbols: LLVMOrcCSymbolsList + Dependencies: c.POINTER[LLVMOrcCDependenceMapPair] + NumDependencies: int +@c.record +class LLVMOrcCSymbolsList(c.Struct): + SIZE = 16 + Symbols: c.POINTER[c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry]] + Length: int +LLVMOrcCSymbolsList.register_fields([('Symbols', c.POINTER[LLVMOrcSymbolStringPoolEntryRef], 0), ('Length', size_t, 8)]) +@c.record +class LLVMOrcCDependenceMapPair(c.Struct): + SIZE = 24 + JD: c.POINTER[struct_LLVMOrcOpaqueJITDylib] + Names: LLVMOrcCSymbolsList +LLVMOrcCDependenceMapPair.register_fields([('JD', LLVMOrcJITDylibRef, 0), ('Names', LLVMOrcCSymbolsList, 8)]) +LLVMOrcCDependenceMapPairs: TypeAlias = c.POINTER[LLVMOrcCDependenceMapPair] +LLVMOrcCSymbolDependenceGroup.register_fields([('Symbols', LLVMOrcCSymbolsList, 0), ('Dependencies', LLVMOrcCDependenceMapPairs, 16), ('NumDependencies', size_t, 24)]) +@dll.bind(LLVMErrorRef, LLVMOrcMaterializationResponsibilityRef, c.POINTER[LLVMOrcCSymbolDependenceGroup], size_t) +def LLVMOrcMaterializationResponsibilityNotifyEmitted(MR:LLVMOrcMaterializationResponsibilityRef, SymbolDepGroups:c.POINTER[LLVMOrcCSymbolDependenceGroup], NumSymbolDepGroups:size_t) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcMaterializationResponsibilityRef, LLVMOrcCSymbolFlagsMapPairs, size_t) +def LLVMOrcMaterializationResponsibilityDefineMaterializing(MR:LLVMOrcMaterializationResponsibilityRef, Pairs:LLVMOrcCSymbolFlagsMapPairs, NumPairs:size_t) -> LLVMErrorRef: ... +@dll.bind(None, LLVMOrcMaterializationResponsibilityRef) +def LLVMOrcMaterializationResponsibilityFailMaterialization(MR:LLVMOrcMaterializationResponsibilityRef) -> None: ... +@dll.bind(LLVMErrorRef, LLVMOrcMaterializationResponsibilityRef, LLVMOrcMaterializationUnitRef) +def LLVMOrcMaterializationResponsibilityReplace(MR:LLVMOrcMaterializationResponsibilityRef, MU:LLVMOrcMaterializationUnitRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcMaterializationResponsibilityRef, c.POINTER[LLVMOrcSymbolStringPoolEntryRef], size_t, c.POINTER[LLVMOrcMaterializationResponsibilityRef]) +def LLVMOrcMaterializationResponsibilityDelegate(MR:LLVMOrcMaterializationResponsibilityRef, Symbols:c.POINTER[LLVMOrcSymbolStringPoolEntryRef], NumSymbols:size_t, Result:c.POINTER[LLVMOrcMaterializationResponsibilityRef]) -> LLVMErrorRef: ... +@dll.bind(LLVMOrcJITDylibRef, LLVMOrcExecutionSessionRef, c.POINTER[ctypes.c_char]) +def LLVMOrcExecutionSessionCreateBareJITDylib(ES:LLVMOrcExecutionSessionRef, Name:c.POINTER[ctypes.c_char]) -> LLVMOrcJITDylibRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcExecutionSessionRef, c.POINTER[LLVMOrcJITDylibRef], c.POINTER[ctypes.c_char]) +def LLVMOrcExecutionSessionCreateJITDylib(ES:LLVMOrcExecutionSessionRef, Result:c.POINTER[LLVMOrcJITDylibRef], Name:c.POINTER[ctypes.c_char]) -> LLVMErrorRef: ... +@dll.bind(LLVMOrcJITDylibRef, LLVMOrcExecutionSessionRef, c.POINTER[ctypes.c_char]) +def LLVMOrcExecutionSessionGetJITDylibByName(ES:LLVMOrcExecutionSessionRef, Name:c.POINTER[ctypes.c_char]) -> LLVMOrcJITDylibRef: ... +@dll.bind(LLVMOrcResourceTrackerRef, LLVMOrcJITDylibRef) +def LLVMOrcJITDylibCreateResourceTracker(JD:LLVMOrcJITDylibRef) -> LLVMOrcResourceTrackerRef: ... +@dll.bind(LLVMOrcResourceTrackerRef, LLVMOrcJITDylibRef) +def LLVMOrcJITDylibGetDefaultResourceTracker(JD:LLVMOrcJITDylibRef) -> LLVMOrcResourceTrackerRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcJITDylibRef, LLVMOrcMaterializationUnitRef) +def LLVMOrcJITDylibDefine(JD:LLVMOrcJITDylibRef, MU:LLVMOrcMaterializationUnitRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcJITDylibRef) +def LLVMOrcJITDylibClear(JD:LLVMOrcJITDylibRef) -> LLVMErrorRef: ... +@dll.bind(None, LLVMOrcJITDylibRef, LLVMOrcDefinitionGeneratorRef) +def LLVMOrcJITDylibAddGenerator(JD:LLVMOrcJITDylibRef, DG:LLVMOrcDefinitionGeneratorRef) -> None: ... +class struct_LLVMOrcOpaqueLookupState(c.Struct): pass +LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueError], [c.POINTER[struct_LLVMOrcOpaqueDefinitionGenerator], ctypes.c_void_p, c.POINTER[c.POINTER[struct_LLVMOrcOpaqueLookupState]], ctypes.c_uint32, c.POINTER[struct_LLVMOrcOpaqueJITDylib], ctypes.c_uint32, c.POINTER[LLVMOrcCLookupSetElement], ctypes.c_uint64]] +LLVMOrcDisposeCAPIDefinitionGeneratorFunction: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +@dll.bind(LLVMOrcDefinitionGeneratorRef, LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction, ctypes.c_void_p, LLVMOrcDisposeCAPIDefinitionGeneratorFunction) +def LLVMOrcCreateCustomCAPIDefinitionGenerator(F:LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction, Ctx:ctypes.c_void_p, Dispose:LLVMOrcDisposeCAPIDefinitionGeneratorFunction) -> LLVMOrcDefinitionGeneratorRef: ... +LLVMOrcLookupStateRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueLookupState] +@dll.bind(None, LLVMOrcLookupStateRef, LLVMErrorRef) +def LLVMOrcLookupStateContinueLookup(S:LLVMOrcLookupStateRef, Err:LLVMErrorRef) -> None: ... +LLVMOrcSymbolPredicate: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, c.POINTER[struct_LLVMOrcOpaqueSymbolStringPoolEntry]]] +@dll.bind(LLVMErrorRef, c.POINTER[LLVMOrcDefinitionGeneratorRef], ctypes.c_char, LLVMOrcSymbolPredicate, ctypes.c_void_p) +def LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(Result:c.POINTER[LLVMOrcDefinitionGeneratorRef], GlobalPrefx:bytes, Filter:LLVMOrcSymbolPredicate, FilterCtx:ctypes.c_void_p) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, c.POINTER[LLVMOrcDefinitionGeneratorRef], c.POINTER[ctypes.c_char], ctypes.c_char, LLVMOrcSymbolPredicate, ctypes.c_void_p) +def LLVMOrcCreateDynamicLibrarySearchGeneratorForPath(Result:c.POINTER[LLVMOrcDefinitionGeneratorRef], FileName:c.POINTER[ctypes.c_char], GlobalPrefix:bytes, Filter:LLVMOrcSymbolPredicate, FilterCtx:ctypes.c_void_p) -> LLVMErrorRef: ... +class struct_LLVMOrcOpaqueObjectLayer(c.Struct): pass +LLVMOrcObjectLayerRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueObjectLayer] +@dll.bind(LLVMErrorRef, c.POINTER[LLVMOrcDefinitionGeneratorRef], LLVMOrcObjectLayerRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def LLVMOrcCreateStaticLibrarySearchGeneratorForPath(Result:c.POINTER[LLVMOrcDefinitionGeneratorRef], ObjLayer:LLVMOrcObjectLayerRef, FileName:c.POINTER[ctypes.c_char], TargetTriple:c.POINTER[ctypes.c_char]) -> LLVMErrorRef: ... +class struct_LLVMOrcOpaqueThreadSafeContext(c.Struct): pass +LLVMOrcThreadSafeContextRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueThreadSafeContext] +@dll.bind(LLVMOrcThreadSafeContextRef) +def LLVMOrcCreateNewThreadSafeContext() -> LLVMOrcThreadSafeContextRef: ... +@dll.bind(LLVMContextRef, LLVMOrcThreadSafeContextRef) +def LLVMOrcThreadSafeContextGetContext(TSCtx:LLVMOrcThreadSafeContextRef) -> LLVMContextRef: ... +@dll.bind(None, LLVMOrcThreadSafeContextRef) +def LLVMOrcDisposeThreadSafeContext(TSCtx:LLVMOrcThreadSafeContextRef) -> None: ... +class struct_LLVMOrcOpaqueThreadSafeModule(c.Struct): pass +LLVMOrcThreadSafeModuleRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueThreadSafeModule] +@dll.bind(LLVMOrcThreadSafeModuleRef, LLVMModuleRef, LLVMOrcThreadSafeContextRef) +def LLVMOrcCreateNewThreadSafeModule(M:LLVMModuleRef, TSCtx:LLVMOrcThreadSafeContextRef) -> LLVMOrcThreadSafeModuleRef: ... +@dll.bind(None, LLVMOrcThreadSafeModuleRef) +def LLVMOrcDisposeThreadSafeModule(TSM:LLVMOrcThreadSafeModuleRef) -> None: ... +LLVMOrcGenericIRModuleOperationFunction: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueError], [ctypes.c_void_p, c.POINTER[struct_LLVMOpaqueModule]]] +@dll.bind(LLVMErrorRef, LLVMOrcThreadSafeModuleRef, LLVMOrcGenericIRModuleOperationFunction, ctypes.c_void_p) +def LLVMOrcThreadSafeModuleWithModuleDo(TSM:LLVMOrcThreadSafeModuleRef, F:LLVMOrcGenericIRModuleOperationFunction, Ctx:ctypes.c_void_p) -> LLVMErrorRef: ... +class struct_LLVMOrcOpaqueJITTargetMachineBuilder(c.Struct): pass +LLVMOrcJITTargetMachineBuilderRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueJITTargetMachineBuilder] +@dll.bind(LLVMErrorRef, c.POINTER[LLVMOrcJITTargetMachineBuilderRef]) +def LLVMOrcJITTargetMachineBuilderDetectHost(Result:c.POINTER[LLVMOrcJITTargetMachineBuilderRef]) -> LLVMErrorRef: ... +@dll.bind(LLVMOrcJITTargetMachineBuilderRef, LLVMTargetMachineRef) +def LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(TM:LLVMTargetMachineRef) -> LLVMOrcJITTargetMachineBuilderRef: ... +@dll.bind(None, LLVMOrcJITTargetMachineBuilderRef) +def LLVMOrcDisposeJITTargetMachineBuilder(JTMB:LLVMOrcJITTargetMachineBuilderRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMOrcJITTargetMachineBuilderRef) +def LLVMOrcJITTargetMachineBuilderGetTargetTriple(JTMB:LLVMOrcJITTargetMachineBuilderRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMOrcJITTargetMachineBuilderRef, c.POINTER[ctypes.c_char]) +def LLVMOrcJITTargetMachineBuilderSetTargetTriple(JTMB:LLVMOrcJITTargetMachineBuilderRef, TargetTriple:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(LLVMErrorRef, LLVMOrcObjectLayerRef, LLVMOrcJITDylibRef, LLVMMemoryBufferRef) +def LLVMOrcObjectLayerAddObjectFile(ObjLayer:LLVMOrcObjectLayerRef, JD:LLVMOrcJITDylibRef, ObjBuffer:LLVMMemoryBufferRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcObjectLayerRef, LLVMOrcResourceTrackerRef, LLVMMemoryBufferRef) +def LLVMOrcObjectLayerAddObjectFileWithRT(ObjLayer:LLVMOrcObjectLayerRef, RT:LLVMOrcResourceTrackerRef, ObjBuffer:LLVMMemoryBufferRef) -> LLVMErrorRef: ... +@dll.bind(None, LLVMOrcObjectLayerRef, LLVMOrcMaterializationResponsibilityRef, LLVMMemoryBufferRef) +def LLVMOrcObjectLayerEmit(ObjLayer:LLVMOrcObjectLayerRef, R:LLVMOrcMaterializationResponsibilityRef, ObjBuffer:LLVMMemoryBufferRef) -> None: ... +@dll.bind(None, LLVMOrcObjectLayerRef) +def LLVMOrcDisposeObjectLayer(ObjLayer:LLVMOrcObjectLayerRef) -> None: ... +class struct_LLVMOrcOpaqueIRTransformLayer(c.Struct): pass +LLVMOrcIRTransformLayerRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueIRTransformLayer] +@dll.bind(None, LLVMOrcIRTransformLayerRef, LLVMOrcMaterializationResponsibilityRef, LLVMOrcThreadSafeModuleRef) +def LLVMOrcIRTransformLayerEmit(IRTransformLayer:LLVMOrcIRTransformLayerRef, MR:LLVMOrcMaterializationResponsibilityRef, TSM:LLVMOrcThreadSafeModuleRef) -> None: ... +LLVMOrcIRTransformLayerTransformFunction: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueError], [ctypes.c_void_p, c.POINTER[c.POINTER[struct_LLVMOrcOpaqueThreadSafeModule]], c.POINTER[struct_LLVMOrcOpaqueMaterializationResponsibility]]] +@dll.bind(None, LLVMOrcIRTransformLayerRef, LLVMOrcIRTransformLayerTransformFunction, ctypes.c_void_p) +def LLVMOrcIRTransformLayerSetTransform(IRTransformLayer:LLVMOrcIRTransformLayerRef, TransformFunction:LLVMOrcIRTransformLayerTransformFunction, Ctx:ctypes.c_void_p) -> None: ... +class struct_LLVMOrcOpaqueObjectTransformLayer(c.Struct): pass +LLVMOrcObjectTransformLayerRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueObjectTransformLayer] +LLVMOrcObjectTransformLayerTransformFunction: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueError], [ctypes.c_void_p, c.POINTER[c.POINTER[struct_LLVMOpaqueMemoryBuffer]]]] +@dll.bind(None, LLVMOrcObjectTransformLayerRef, LLVMOrcObjectTransformLayerTransformFunction, ctypes.c_void_p) +def LLVMOrcObjectTransformLayerSetTransform(ObjTransformLayer:LLVMOrcObjectTransformLayerRef, TransformFunction:LLVMOrcObjectTransformLayerTransformFunction, Ctx:ctypes.c_void_p) -> None: ... +@dll.bind(LLVMOrcIndirectStubsManagerRef, c.POINTER[ctypes.c_char]) +def LLVMOrcCreateLocalIndirectStubsManager(TargetTriple:c.POINTER[ctypes.c_char]) -> LLVMOrcIndirectStubsManagerRef: ... +@dll.bind(None, LLVMOrcIndirectStubsManagerRef) +def LLVMOrcDisposeIndirectStubsManager(ISM:LLVMOrcIndirectStubsManagerRef) -> None: ... +LLVMOrcJITTargetAddress: TypeAlias = ctypes.c_uint64 +@dll.bind(LLVMErrorRef, c.POINTER[ctypes.c_char], LLVMOrcExecutionSessionRef, LLVMOrcJITTargetAddress, c.POINTER[LLVMOrcLazyCallThroughManagerRef]) +def LLVMOrcCreateLocalLazyCallThroughManager(TargetTriple:c.POINTER[ctypes.c_char], ES:LLVMOrcExecutionSessionRef, ErrorHandlerAddr:LLVMOrcJITTargetAddress, LCTM:c.POINTER[LLVMOrcLazyCallThroughManagerRef]) -> LLVMErrorRef: ... +@dll.bind(None, LLVMOrcLazyCallThroughManagerRef) +def LLVMOrcDisposeLazyCallThroughManager(LCTM:LLVMOrcLazyCallThroughManagerRef) -> None: ... +class struct_LLVMOrcOpaqueDumpObjects(c.Struct): pass +LLVMOrcDumpObjectsRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueDumpObjects] +@dll.bind(LLVMOrcDumpObjectsRef, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def LLVMOrcCreateDumpObjects(DumpDir:c.POINTER[ctypes.c_char], IdentifierOverride:c.POINTER[ctypes.c_char]) -> LLVMOrcDumpObjectsRef: ... +@dll.bind(None, LLVMOrcDumpObjectsRef) +def LLVMOrcDisposeDumpObjects(DumpObjects:LLVMOrcDumpObjectsRef) -> None: ... +@dll.bind(LLVMErrorRef, LLVMOrcDumpObjectsRef, c.POINTER[LLVMMemoryBufferRef]) +def LLVMOrcDumpObjects_CallOperator(DumpObjects:LLVMOrcDumpObjectsRef, ObjBuffer:c.POINTER[LLVMMemoryBufferRef]) -> LLVMErrorRef: ... +LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_LLVMOrcOpaqueObjectLayer], [ctypes.c_void_p, c.POINTER[struct_LLVMOrcOpaqueExecutionSession], c.POINTER[ctypes.c_char]]] +class struct_LLVMOrcOpaqueLLJITBuilder(c.Struct): pass +LLVMOrcLLJITBuilderRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueLLJITBuilder] +class struct_LLVMOrcOpaqueLLJIT(c.Struct): pass +LLVMOrcLLJITRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueLLJIT] +@dll.bind(LLVMOrcLLJITBuilderRef) +def LLVMOrcCreateLLJITBuilder() -> LLVMOrcLLJITBuilderRef: ... +@dll.bind(None, LLVMOrcLLJITBuilderRef) +def LLVMOrcDisposeLLJITBuilder(Builder:LLVMOrcLLJITBuilderRef) -> None: ... +@dll.bind(None, LLVMOrcLLJITBuilderRef, LLVMOrcJITTargetMachineBuilderRef) +def LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(Builder:LLVMOrcLLJITBuilderRef, JTMB:LLVMOrcJITTargetMachineBuilderRef) -> None: ... +@dll.bind(None, LLVMOrcLLJITBuilderRef, LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction, ctypes.c_void_p) +def LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(Builder:LLVMOrcLLJITBuilderRef, F:LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction, Ctx:ctypes.c_void_p) -> None: ... +@dll.bind(LLVMErrorRef, c.POINTER[LLVMOrcLLJITRef], LLVMOrcLLJITBuilderRef) +def LLVMOrcCreateLLJIT(Result:c.POINTER[LLVMOrcLLJITRef], Builder:LLVMOrcLLJITBuilderRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcLLJITRef) +def LLVMOrcDisposeLLJIT(J:LLVMOrcLLJITRef) -> LLVMErrorRef: ... +@dll.bind(LLVMOrcExecutionSessionRef, LLVMOrcLLJITRef) +def LLVMOrcLLJITGetExecutionSession(J:LLVMOrcLLJITRef) -> LLVMOrcExecutionSessionRef: ... +@dll.bind(LLVMOrcJITDylibRef, LLVMOrcLLJITRef) +def LLVMOrcLLJITGetMainJITDylib(J:LLVMOrcLLJITRef) -> LLVMOrcJITDylibRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMOrcLLJITRef) +def LLVMOrcLLJITGetTripleString(J:LLVMOrcLLJITRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_char, LLVMOrcLLJITRef) +def LLVMOrcLLJITGetGlobalPrefix(J:LLVMOrcLLJITRef) -> bytes: ... +@dll.bind(LLVMOrcSymbolStringPoolEntryRef, LLVMOrcLLJITRef, c.POINTER[ctypes.c_char]) +def LLVMOrcLLJITMangleAndIntern(J:LLVMOrcLLJITRef, UnmangledName:c.POINTER[ctypes.c_char]) -> LLVMOrcSymbolStringPoolEntryRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcLLJITRef, LLVMOrcJITDylibRef, LLVMMemoryBufferRef) +def LLVMOrcLLJITAddObjectFile(J:LLVMOrcLLJITRef, JD:LLVMOrcJITDylibRef, ObjBuffer:LLVMMemoryBufferRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcLLJITRef, LLVMOrcResourceTrackerRef, LLVMMemoryBufferRef) +def LLVMOrcLLJITAddObjectFileWithRT(J:LLVMOrcLLJITRef, RT:LLVMOrcResourceTrackerRef, ObjBuffer:LLVMMemoryBufferRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcLLJITRef, LLVMOrcJITDylibRef, LLVMOrcThreadSafeModuleRef) +def LLVMOrcLLJITAddLLVMIRModule(J:LLVMOrcLLJITRef, JD:LLVMOrcJITDylibRef, TSM:LLVMOrcThreadSafeModuleRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcLLJITRef, LLVMOrcResourceTrackerRef, LLVMOrcThreadSafeModuleRef) +def LLVMOrcLLJITAddLLVMIRModuleWithRT(J:LLVMOrcLLJITRef, JD:LLVMOrcResourceTrackerRef, TSM:LLVMOrcThreadSafeModuleRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMOrcLLJITRef, c.POINTER[LLVMOrcExecutorAddress], c.POINTER[ctypes.c_char]) +def LLVMOrcLLJITLookup(J:LLVMOrcLLJITRef, Result:c.POINTER[LLVMOrcExecutorAddress], Name:c.POINTER[ctypes.c_char]) -> LLVMErrorRef: ... +@dll.bind(LLVMOrcObjectLayerRef, LLVMOrcLLJITRef) +def LLVMOrcLLJITGetObjLinkingLayer(J:LLVMOrcLLJITRef) -> LLVMOrcObjectLayerRef: ... +@dll.bind(LLVMOrcObjectTransformLayerRef, LLVMOrcLLJITRef) +def LLVMOrcLLJITGetObjTransformLayer(J:LLVMOrcLLJITRef) -> LLVMOrcObjectTransformLayerRef: ... +@dll.bind(LLVMOrcIRTransformLayerRef, LLVMOrcLLJITRef) +def LLVMOrcLLJITGetIRTransformLayer(J:LLVMOrcLLJITRef) -> LLVMOrcIRTransformLayerRef: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMOrcLLJITRef) +def LLVMOrcLLJITGetDataLayoutStr(J:LLVMOrcLLJITRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(LLVMErrorRef, LLVMOrcLLJITRef) +def LLVMOrcLLJITEnableDebugSupport(J:LLVMOrcLLJITRef) -> LLVMErrorRef: ... +LLVMLinkerMode: dict[int, str] = {(LLVMLinkerDestroySource:=0): 'LLVMLinkerDestroySource', (LLVMLinkerPreserveSource_Removed:=1): 'LLVMLinkerPreserveSource_Removed'} +@dll.bind(LLVMBool, LLVMModuleRef, LLVMModuleRef) +def LLVMLinkModules2(Dest:LLVMModuleRef, Src:LLVMModuleRef) -> LLVMBool: ... +class struct_LLVMOpaqueSectionIterator(c.Struct): pass +LLVMSectionIteratorRef: TypeAlias = c.POINTER[struct_LLVMOpaqueSectionIterator] +class struct_LLVMOpaqueSymbolIterator(c.Struct): pass +LLVMSymbolIteratorRef: TypeAlias = c.POINTER[struct_LLVMOpaqueSymbolIterator] +class struct_LLVMOpaqueRelocationIterator(c.Struct): pass +LLVMRelocationIteratorRef: TypeAlias = c.POINTER[struct_LLVMOpaqueRelocationIterator] +LLVMBinaryType: dict[int, str] = {(LLVMBinaryTypeArchive:=0): 'LLVMBinaryTypeArchive', (LLVMBinaryTypeMachOUniversalBinary:=1): 'LLVMBinaryTypeMachOUniversalBinary', (LLVMBinaryTypeCOFFImportFile:=2): 'LLVMBinaryTypeCOFFImportFile', (LLVMBinaryTypeIR:=3): 'LLVMBinaryTypeIR', (LLVMBinaryTypeWinRes:=4): 'LLVMBinaryTypeWinRes', (LLVMBinaryTypeCOFF:=5): 'LLVMBinaryTypeCOFF', (LLVMBinaryTypeELF32L:=6): 'LLVMBinaryTypeELF32L', (LLVMBinaryTypeELF32B:=7): 'LLVMBinaryTypeELF32B', (LLVMBinaryTypeELF64L:=8): 'LLVMBinaryTypeELF64L', (LLVMBinaryTypeELF64B:=9): 'LLVMBinaryTypeELF64B', (LLVMBinaryTypeMachO32L:=10): 'LLVMBinaryTypeMachO32L', (LLVMBinaryTypeMachO32B:=11): 'LLVMBinaryTypeMachO32B', (LLVMBinaryTypeMachO64L:=12): 'LLVMBinaryTypeMachO64L', (LLVMBinaryTypeMachO64B:=13): 'LLVMBinaryTypeMachO64B', (LLVMBinaryTypeWasm:=14): 'LLVMBinaryTypeWasm', (LLVMBinaryTypeOffload:=15): 'LLVMBinaryTypeOffload'} +class struct_LLVMOpaqueBinary(c.Struct): pass +LLVMBinaryRef: TypeAlias = c.POINTER[struct_LLVMOpaqueBinary] +@dll.bind(LLVMBinaryRef, LLVMMemoryBufferRef, LLVMContextRef, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMCreateBinary(MemBuf:LLVMMemoryBufferRef, Context:LLVMContextRef, ErrorMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBinaryRef: ... +@dll.bind(None, LLVMBinaryRef) +def LLVMDisposeBinary(BR:LLVMBinaryRef) -> None: ... +@dll.bind(LLVMMemoryBufferRef, LLVMBinaryRef) +def LLVMBinaryCopyMemoryBuffer(BR:LLVMBinaryRef) -> LLVMMemoryBufferRef: ... +@dll.bind(ctypes.c_uint32, LLVMBinaryRef) +def LLVMBinaryGetType(BR:LLVMBinaryRef) -> ctypes.c_uint32: ... +@dll.bind(LLVMBinaryRef, LLVMBinaryRef, c.POINTER[ctypes.c_char], size_t, c.POINTER[c.POINTER[ctypes.c_char]]) +def LLVMMachOUniversalBinaryCopyObjectForArch(BR:LLVMBinaryRef, Arch:c.POINTER[ctypes.c_char], ArchLen:size_t, ErrorMessage:c.POINTER[c.POINTER[ctypes.c_char]]) -> LLVMBinaryRef: ... +@dll.bind(LLVMSectionIteratorRef, LLVMBinaryRef) +def LLVMObjectFileCopySectionIterator(BR:LLVMBinaryRef) -> LLVMSectionIteratorRef: ... +@dll.bind(LLVMBool, LLVMBinaryRef, LLVMSectionIteratorRef) +def LLVMObjectFileIsSectionIteratorAtEnd(BR:LLVMBinaryRef, SI:LLVMSectionIteratorRef) -> LLVMBool: ... +@dll.bind(LLVMSymbolIteratorRef, LLVMBinaryRef) +def LLVMObjectFileCopySymbolIterator(BR:LLVMBinaryRef) -> LLVMSymbolIteratorRef: ... +@dll.bind(LLVMBool, LLVMBinaryRef, LLVMSymbolIteratorRef) +def LLVMObjectFileIsSymbolIteratorAtEnd(BR:LLVMBinaryRef, SI:LLVMSymbolIteratorRef) -> LLVMBool: ... +@dll.bind(None, LLVMSectionIteratorRef) +def LLVMDisposeSectionIterator(SI:LLVMSectionIteratorRef) -> None: ... +@dll.bind(None, LLVMSectionIteratorRef) +def LLVMMoveToNextSection(SI:LLVMSectionIteratorRef) -> None: ... +@dll.bind(None, LLVMSectionIteratorRef, LLVMSymbolIteratorRef) +def LLVMMoveToContainingSection(Sect:LLVMSectionIteratorRef, Sym:LLVMSymbolIteratorRef) -> None: ... +@dll.bind(None, LLVMSymbolIteratorRef) +def LLVMDisposeSymbolIterator(SI:LLVMSymbolIteratorRef) -> None: ... +@dll.bind(None, LLVMSymbolIteratorRef) +def LLVMMoveToNextSymbol(SI:LLVMSymbolIteratorRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMSectionIteratorRef) +def LLVMGetSectionName(SI:LLVMSectionIteratorRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(uint64_t, LLVMSectionIteratorRef) +def LLVMGetSectionSize(SI:LLVMSectionIteratorRef) -> uint64_t: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMSectionIteratorRef) +def LLVMGetSectionContents(SI:LLVMSectionIteratorRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(uint64_t, LLVMSectionIteratorRef) +def LLVMGetSectionAddress(SI:LLVMSectionIteratorRef) -> uint64_t: ... +@dll.bind(LLVMBool, LLVMSectionIteratorRef, LLVMSymbolIteratorRef) +def LLVMGetSectionContainsSymbol(SI:LLVMSectionIteratorRef, Sym:LLVMSymbolIteratorRef) -> LLVMBool: ... +@dll.bind(LLVMRelocationIteratorRef, LLVMSectionIteratorRef) +def LLVMGetRelocations(Section:LLVMSectionIteratorRef) -> LLVMRelocationIteratorRef: ... +@dll.bind(None, LLVMRelocationIteratorRef) +def LLVMDisposeRelocationIterator(RI:LLVMRelocationIteratorRef) -> None: ... +@dll.bind(LLVMBool, LLVMSectionIteratorRef, LLVMRelocationIteratorRef) +def LLVMIsRelocationIteratorAtEnd(Section:LLVMSectionIteratorRef, RI:LLVMRelocationIteratorRef) -> LLVMBool: ... +@dll.bind(None, LLVMRelocationIteratorRef) +def LLVMMoveToNextRelocation(RI:LLVMRelocationIteratorRef) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMSymbolIteratorRef) +def LLVMGetSymbolName(SI:LLVMSymbolIteratorRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(uint64_t, LLVMSymbolIteratorRef) +def LLVMGetSymbolAddress(SI:LLVMSymbolIteratorRef) -> uint64_t: ... +@dll.bind(uint64_t, LLVMSymbolIteratorRef) +def LLVMGetSymbolSize(SI:LLVMSymbolIteratorRef) -> uint64_t: ... +@dll.bind(uint64_t, LLVMRelocationIteratorRef) +def LLVMGetRelocationOffset(RI:LLVMRelocationIteratorRef) -> uint64_t: ... +@dll.bind(LLVMSymbolIteratorRef, LLVMRelocationIteratorRef) +def LLVMGetRelocationSymbol(RI:LLVMRelocationIteratorRef) -> LLVMSymbolIteratorRef: ... +@dll.bind(uint64_t, LLVMRelocationIteratorRef) +def LLVMGetRelocationType(RI:LLVMRelocationIteratorRef) -> uint64_t: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMRelocationIteratorRef) +def LLVMGetRelocationTypeName(RI:LLVMRelocationIteratorRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMRelocationIteratorRef) +def LLVMGetRelocationValueString(RI:LLVMRelocationIteratorRef) -> c.POINTER[ctypes.c_char]: ... +class struct_LLVMOpaqueObjectFile(c.Struct): pass +LLVMObjectFileRef: TypeAlias = c.POINTER[struct_LLVMOpaqueObjectFile] +@dll.bind(LLVMObjectFileRef, LLVMMemoryBufferRef) +def LLVMCreateObjectFile(MemBuf:LLVMMemoryBufferRef) -> LLVMObjectFileRef: ... +@dll.bind(None, LLVMObjectFileRef) +def LLVMDisposeObjectFile(ObjectFile:LLVMObjectFileRef) -> None: ... +@dll.bind(LLVMSectionIteratorRef, LLVMObjectFileRef) +def LLVMGetSections(ObjectFile:LLVMObjectFileRef) -> LLVMSectionIteratorRef: ... +@dll.bind(LLVMBool, LLVMObjectFileRef, LLVMSectionIteratorRef) +def LLVMIsSectionIteratorAtEnd(ObjectFile:LLVMObjectFileRef, SI:LLVMSectionIteratorRef) -> LLVMBool: ... +@dll.bind(LLVMSymbolIteratorRef, LLVMObjectFileRef) +def LLVMGetSymbols(ObjectFile:LLVMObjectFileRef) -> LLVMSymbolIteratorRef: ... +@dll.bind(LLVMBool, LLVMObjectFileRef, LLVMSymbolIteratorRef) +def LLVMIsSymbolIteratorAtEnd(ObjectFile:LLVMObjectFileRef, SI:LLVMSymbolIteratorRef) -> LLVMBool: ... +LLVMJITSymbolGenericFlags: dict[int, str] = {(LLVMJITSymbolGenericFlagsNone:=0): 'LLVMJITSymbolGenericFlagsNone', (LLVMJITSymbolGenericFlagsExported:=1): 'LLVMJITSymbolGenericFlagsExported', (LLVMJITSymbolGenericFlagsWeak:=2): 'LLVMJITSymbolGenericFlagsWeak', (LLVMJITSymbolGenericFlagsCallable:=4): 'LLVMJITSymbolGenericFlagsCallable', (LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly:=8): 'LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly'} +LLVMJITSymbolTargetFlags: TypeAlias = ctypes.c_ubyte +class struct_LLVMOrcOpaqueObjectLinkingLayer(c.Struct): pass +LLVMOrcObjectLinkingLayerRef: TypeAlias = c.POINTER[struct_LLVMOrcOpaqueObjectLinkingLayer] +LLVMMemoryManagerCreateContextCallback: TypeAlias = c.CFUNCTYPE[ctypes.c_void_p, [ctypes.c_void_p]] +LLVMMemoryManagerNotifyTerminatingCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +@dll.bind(LLVMOrcObjectLayerRef, LLVMOrcExecutionSessionRef) +def LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(ES:LLVMOrcExecutionSessionRef) -> LLVMOrcObjectLayerRef: ... +@dll.bind(LLVMOrcObjectLayerRef, LLVMOrcExecutionSessionRef, ctypes.c_void_p, LLVMMemoryManagerCreateContextCallback, LLVMMemoryManagerNotifyTerminatingCallback, LLVMMemoryManagerAllocateCodeSectionCallback, LLVMMemoryManagerAllocateDataSectionCallback, LLVMMemoryManagerFinalizeMemoryCallback, LLVMMemoryManagerDestroyCallback) +def LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks(ES:LLVMOrcExecutionSessionRef, CreateContextCtx:ctypes.c_void_p, CreateContext:LLVMMemoryManagerCreateContextCallback, NotifyTerminating:LLVMMemoryManagerNotifyTerminatingCallback, AllocateCodeSection:LLVMMemoryManagerAllocateCodeSectionCallback, AllocateDataSection:LLVMMemoryManagerAllocateDataSectionCallback, FinalizeMemory:LLVMMemoryManagerFinalizeMemoryCallback, Destroy:LLVMMemoryManagerDestroyCallback) -> LLVMOrcObjectLayerRef: ... +@dll.bind(None, LLVMOrcObjectLayerRef, LLVMJITEventListenerRef) +def LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(RTDyldObjLinkingLayer:LLVMOrcObjectLayerRef, Listener:LLVMJITEventListenerRef) -> None: ... +enum_LLVMRemarkType: dict[int, str] = {(LLVMRemarkTypeUnknown:=0): 'LLVMRemarkTypeUnknown', (LLVMRemarkTypePassed:=1): 'LLVMRemarkTypePassed', (LLVMRemarkTypeMissed:=2): 'LLVMRemarkTypeMissed', (LLVMRemarkTypeAnalysis:=3): 'LLVMRemarkTypeAnalysis', (LLVMRemarkTypeAnalysisFPCommute:=4): 'LLVMRemarkTypeAnalysisFPCommute', (LLVMRemarkTypeAnalysisAliasing:=5): 'LLVMRemarkTypeAnalysisAliasing', (LLVMRemarkTypeFailure:=6): 'LLVMRemarkTypeFailure'} +class struct_LLVMRemarkOpaqueString(c.Struct): pass +LLVMRemarkStringRef: TypeAlias = c.POINTER[struct_LLVMRemarkOpaqueString] +@dll.bind(c.POINTER[ctypes.c_char], LLVMRemarkStringRef) +def LLVMRemarkStringGetData(String:LLVMRemarkStringRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(uint32_t, LLVMRemarkStringRef) +def LLVMRemarkStringGetLen(String:LLVMRemarkStringRef) -> uint32_t: ... +class struct_LLVMRemarkOpaqueDebugLoc(c.Struct): pass +LLVMRemarkDebugLocRef: TypeAlias = c.POINTER[struct_LLVMRemarkOpaqueDebugLoc] +@dll.bind(LLVMRemarkStringRef, LLVMRemarkDebugLocRef) +def LLVMRemarkDebugLocGetSourceFilePath(DL:LLVMRemarkDebugLocRef) -> LLVMRemarkStringRef: ... +@dll.bind(uint32_t, LLVMRemarkDebugLocRef) +def LLVMRemarkDebugLocGetSourceLine(DL:LLVMRemarkDebugLocRef) -> uint32_t: ... +@dll.bind(uint32_t, LLVMRemarkDebugLocRef) +def LLVMRemarkDebugLocGetSourceColumn(DL:LLVMRemarkDebugLocRef) -> uint32_t: ... +class struct_LLVMRemarkOpaqueArg(c.Struct): pass +LLVMRemarkArgRef: TypeAlias = c.POINTER[struct_LLVMRemarkOpaqueArg] +@dll.bind(LLVMRemarkStringRef, LLVMRemarkArgRef) +def LLVMRemarkArgGetKey(Arg:LLVMRemarkArgRef) -> LLVMRemarkStringRef: ... +@dll.bind(LLVMRemarkStringRef, LLVMRemarkArgRef) +def LLVMRemarkArgGetValue(Arg:LLVMRemarkArgRef) -> LLVMRemarkStringRef: ... +@dll.bind(LLVMRemarkDebugLocRef, LLVMRemarkArgRef) +def LLVMRemarkArgGetDebugLoc(Arg:LLVMRemarkArgRef) -> LLVMRemarkDebugLocRef: ... +class struct_LLVMRemarkOpaqueEntry(c.Struct): pass +LLVMRemarkEntryRef: TypeAlias = c.POINTER[struct_LLVMRemarkOpaqueEntry] +@dll.bind(None, LLVMRemarkEntryRef) +def LLVMRemarkEntryDispose(Remark:LLVMRemarkEntryRef) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetType(Remark:LLVMRemarkEntryRef) -> ctypes.c_uint32: ... +@dll.bind(LLVMRemarkStringRef, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetPassName(Remark:LLVMRemarkEntryRef) -> LLVMRemarkStringRef: ... +@dll.bind(LLVMRemarkStringRef, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetRemarkName(Remark:LLVMRemarkEntryRef) -> LLVMRemarkStringRef: ... +@dll.bind(LLVMRemarkStringRef, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetFunctionName(Remark:LLVMRemarkEntryRef) -> LLVMRemarkStringRef: ... +@dll.bind(LLVMRemarkDebugLocRef, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetDebugLoc(Remark:LLVMRemarkEntryRef) -> LLVMRemarkDebugLocRef: ... +@dll.bind(uint64_t, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetHotness(Remark:LLVMRemarkEntryRef) -> uint64_t: ... +@dll.bind(uint32_t, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetNumArgs(Remark:LLVMRemarkEntryRef) -> uint32_t: ... +@dll.bind(LLVMRemarkArgRef, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetFirstArg(Remark:LLVMRemarkEntryRef) -> LLVMRemarkArgRef: ... +@dll.bind(LLVMRemarkArgRef, LLVMRemarkArgRef, LLVMRemarkEntryRef) +def LLVMRemarkEntryGetNextArg(It:LLVMRemarkArgRef, Remark:LLVMRemarkEntryRef) -> LLVMRemarkArgRef: ... +class struct_LLVMRemarkOpaqueParser(c.Struct): pass +LLVMRemarkParserRef: TypeAlias = c.POINTER[struct_LLVMRemarkOpaqueParser] +@dll.bind(LLVMRemarkParserRef, ctypes.c_void_p, uint64_t) +def LLVMRemarkParserCreateYAML(Buf:ctypes.c_void_p, Size:uint64_t) -> LLVMRemarkParserRef: ... +@dll.bind(LLVMRemarkParserRef, ctypes.c_void_p, uint64_t) +def LLVMRemarkParserCreateBitstream(Buf:ctypes.c_void_p, Size:uint64_t) -> LLVMRemarkParserRef: ... +@dll.bind(LLVMRemarkEntryRef, LLVMRemarkParserRef) +def LLVMRemarkParserGetNext(Parser:LLVMRemarkParserRef) -> LLVMRemarkEntryRef: ... +@dll.bind(LLVMBool, LLVMRemarkParserRef) +def LLVMRemarkParserHasError(Parser:LLVMRemarkParserRef) -> LLVMBool: ... +@dll.bind(c.POINTER[ctypes.c_char], LLVMRemarkParserRef) +def LLVMRemarkParserGetErrorMessage(Parser:LLVMRemarkParserRef) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMRemarkParserRef) +def LLVMRemarkParserDispose(Parser:LLVMRemarkParserRef) -> None: ... +@dll.bind(uint32_t) +def LLVMRemarkVersion() -> uint32_t: ... +@dll.bind(LLVMBool, c.POINTER[ctypes.c_char]) +def LLVMLoadLibraryPermanently(Filename:c.POINTER[ctypes.c_char]) -> LLVMBool: ... +@dll.bind(None, ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def LLVMParseCommandLineOptions(argc:int, argv:c.POINTER[c.POINTER[ctypes.c_char]], Overview:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(ctypes.c_void_p, c.POINTER[ctypes.c_char]) +def LLVMSearchForAddressOfSymbol(symbolName:c.POINTER[ctypes.c_char]) -> ctypes.c_void_p: ... +@dll.bind(None, c.POINTER[ctypes.c_char], ctypes.c_void_p) +def LLVMAddSymbol(symbolName:c.POINTER[ctypes.c_char], symbolValue:ctypes.c_void_p) -> None: ... +class struct_LLVMOpaquePassBuilderOptions(c.Struct): pass +LLVMPassBuilderOptionsRef: TypeAlias = c.POINTER[struct_LLVMOpaquePassBuilderOptions] +@dll.bind(LLVMErrorRef, LLVMModuleRef, c.POINTER[ctypes.c_char], LLVMTargetMachineRef, LLVMPassBuilderOptionsRef) +def LLVMRunPasses(M:LLVMModuleRef, Passes:c.POINTER[ctypes.c_char], TM:LLVMTargetMachineRef, Options:LLVMPassBuilderOptionsRef) -> LLVMErrorRef: ... +@dll.bind(LLVMErrorRef, LLVMValueRef, c.POINTER[ctypes.c_char], LLVMTargetMachineRef, LLVMPassBuilderOptionsRef) +def LLVMRunPassesOnFunction(F:LLVMValueRef, Passes:c.POINTER[ctypes.c_char], TM:LLVMTargetMachineRef, Options:LLVMPassBuilderOptionsRef) -> LLVMErrorRef: ... +@dll.bind(LLVMPassBuilderOptionsRef) +def LLVMCreatePassBuilderOptions() -> LLVMPassBuilderOptionsRef: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetVerifyEach(Options:LLVMPassBuilderOptionsRef, VerifyEach:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetDebugLogging(Options:LLVMPassBuilderOptionsRef, DebugLogging:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, c.POINTER[ctypes.c_char]) +def LLVMPassBuilderOptionsSetAAPipeline(Options:LLVMPassBuilderOptionsRef, AAPipeline:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetLoopInterleaving(Options:LLVMPassBuilderOptionsRef, LoopInterleaving:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetLoopVectorization(Options:LLVMPassBuilderOptionsRef, LoopVectorization:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetSLPVectorization(Options:LLVMPassBuilderOptionsRef, SLPVectorization:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetLoopUnrolling(Options:LLVMPassBuilderOptionsRef, LoopUnrolling:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll(Options:LLVMPassBuilderOptionsRef, ForgetAllSCEVInLoopUnroll:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, ctypes.c_uint32) +def LLVMPassBuilderOptionsSetLicmMssaOptCap(Options:LLVMPassBuilderOptionsRef, LicmMssaOptCap:int) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, ctypes.c_uint32) +def LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap(Options:LLVMPassBuilderOptionsRef, LicmMssaNoAccForPromotionCap:int) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetCallGraphProfile(Options:LLVMPassBuilderOptionsRef, CallGraphProfile:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, LLVMBool) +def LLVMPassBuilderOptionsSetMergeFunctions(Options:LLVMPassBuilderOptionsRef, MergeFunctions:LLVMBool) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef, ctypes.c_int32) +def LLVMPassBuilderOptionsSetInlinerThreshold(Options:LLVMPassBuilderOptionsRef, Threshold:int) -> None: ... +@dll.bind(None, LLVMPassBuilderOptionsRef) +def LLVMDisposePassBuilderOptions(Options:LLVMPassBuilderOptionsRef) -> None: ... +@c.record +class llvm_blake3_chunk_state(c.Struct): + SIZE = 112 + cv: c.Array[ctypes.c_uint32, Literal[8]] + chunk_counter: int + buf: c.Array[ctypes.c_ubyte, Literal[64]] + buf_len: int + blocks_compressed: int + flags: int +llvm_blake3_chunk_state.register_fields([('cv', c.Array[uint32_t, Literal[8]], 0), ('chunk_counter', uint64_t, 32), ('buf', c.Array[uint8_t, Literal[64]], 40), ('buf_len', uint8_t, 104), ('blocks_compressed', uint8_t, 105), ('flags', uint8_t, 106)]) +@c.record +class llvm_blake3_hasher(c.Struct): + SIZE = 1912 + key: c.Array[ctypes.c_uint32, Literal[8]] + chunk: llvm_blake3_chunk_state + cv_stack_len: int + cv_stack: c.Array[ctypes.c_ubyte, Literal[1760]] +llvm_blake3_hasher.register_fields([('key', c.Array[uint32_t, Literal[8]], 0), ('chunk', llvm_blake3_chunk_state, 32), ('cv_stack_len', uint8_t, 144), ('cv_stack', c.Array[uint8_t, Literal[1760]], 145)]) +@dll.bind(c.POINTER[ctypes.c_char]) +def llvm_blake3_version() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, c.POINTER[llvm_blake3_hasher]) +def llvm_blake3_hasher_init(self:c.POINTER[llvm_blake3_hasher]) -> None: ... +@dll.bind(None, c.POINTER[llvm_blake3_hasher], c.Array[uint8_t, Literal[32]]) +def llvm_blake3_hasher_init_keyed(self:c.POINTER[llvm_blake3_hasher], key:c.Array[uint8_t, Literal[32]]) -> None: ... +@dll.bind(None, c.POINTER[llvm_blake3_hasher], c.POINTER[ctypes.c_char]) +def llvm_blake3_hasher_init_derive_key(self:c.POINTER[llvm_blake3_hasher], context:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, c.POINTER[llvm_blake3_hasher], ctypes.c_void_p, size_t) +def llvm_blake3_hasher_init_derive_key_raw(self:c.POINTER[llvm_blake3_hasher], context:ctypes.c_void_p, context_len:size_t) -> None: ... +@dll.bind(None, c.POINTER[llvm_blake3_hasher], ctypes.c_void_p, size_t) +def llvm_blake3_hasher_update(self:c.POINTER[llvm_blake3_hasher], input:ctypes.c_void_p, input_len:size_t) -> None: ... +@dll.bind(None, c.POINTER[llvm_blake3_hasher], c.POINTER[uint8_t], size_t) +def llvm_blake3_hasher_finalize(self:c.POINTER[llvm_blake3_hasher], out:c.POINTER[uint8_t], out_len:size_t) -> None: ... +@dll.bind(None, c.POINTER[llvm_blake3_hasher], uint64_t, c.POINTER[uint8_t], size_t) +def llvm_blake3_hasher_finalize_seek(self:c.POINTER[llvm_blake3_hasher], seek:uint64_t, out:c.POINTER[uint8_t], out_len:size_t) -> None: ... +@dll.bind(None, c.POINTER[llvm_blake3_hasher]) +def llvm_blake3_hasher_reset(self:c.POINTER[llvm_blake3_hasher]) -> None: ... +lto_bool_t: TypeAlias = ctypes.c_bool +lto_symbol_attributes: dict[int, str] = {(LTO_SYMBOL_ALIGNMENT_MASK:=31): 'LTO_SYMBOL_ALIGNMENT_MASK', (LTO_SYMBOL_PERMISSIONS_MASK:=224): 'LTO_SYMBOL_PERMISSIONS_MASK', (LTO_SYMBOL_PERMISSIONS_CODE:=160): 'LTO_SYMBOL_PERMISSIONS_CODE', (LTO_SYMBOL_PERMISSIONS_DATA:=192): 'LTO_SYMBOL_PERMISSIONS_DATA', (LTO_SYMBOL_PERMISSIONS_RODATA:=128): 'LTO_SYMBOL_PERMISSIONS_RODATA', (LTO_SYMBOL_DEFINITION_MASK:=1792): 'LTO_SYMBOL_DEFINITION_MASK', (LTO_SYMBOL_DEFINITION_REGULAR:=256): 'LTO_SYMBOL_DEFINITION_REGULAR', (LTO_SYMBOL_DEFINITION_TENTATIVE:=512): 'LTO_SYMBOL_DEFINITION_TENTATIVE', (LTO_SYMBOL_DEFINITION_WEAK:=768): 'LTO_SYMBOL_DEFINITION_WEAK', (LTO_SYMBOL_DEFINITION_UNDEFINED:=1024): 'LTO_SYMBOL_DEFINITION_UNDEFINED', (LTO_SYMBOL_DEFINITION_WEAKUNDEF:=1280): 'LTO_SYMBOL_DEFINITION_WEAKUNDEF', (LTO_SYMBOL_SCOPE_MASK:=14336): 'LTO_SYMBOL_SCOPE_MASK', (LTO_SYMBOL_SCOPE_INTERNAL:=2048): 'LTO_SYMBOL_SCOPE_INTERNAL', (LTO_SYMBOL_SCOPE_HIDDEN:=4096): 'LTO_SYMBOL_SCOPE_HIDDEN', (LTO_SYMBOL_SCOPE_PROTECTED:=8192): 'LTO_SYMBOL_SCOPE_PROTECTED', (LTO_SYMBOL_SCOPE_DEFAULT:=6144): 'LTO_SYMBOL_SCOPE_DEFAULT', (LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN:=10240): 'LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN', (LTO_SYMBOL_COMDAT:=16384): 'LTO_SYMBOL_COMDAT', (LTO_SYMBOL_ALIAS:=32768): 'LTO_SYMBOL_ALIAS'} +lto_debug_model: dict[int, str] = {(LTO_DEBUG_MODEL_NONE:=0): 'LTO_DEBUG_MODEL_NONE', (LTO_DEBUG_MODEL_DWARF:=1): 'LTO_DEBUG_MODEL_DWARF'} +lto_codegen_model: dict[int, str] = {(LTO_CODEGEN_PIC_MODEL_STATIC:=0): 'LTO_CODEGEN_PIC_MODEL_STATIC', (LTO_CODEGEN_PIC_MODEL_DYNAMIC:=1): 'LTO_CODEGEN_PIC_MODEL_DYNAMIC', (LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC:=2): 'LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC', (LTO_CODEGEN_PIC_MODEL_DEFAULT:=3): 'LTO_CODEGEN_PIC_MODEL_DEFAULT'} +class struct_LLVMOpaqueLTOModule(c.Struct): pass +lto_module_t: TypeAlias = c.POINTER[struct_LLVMOpaqueLTOModule] +class struct_LLVMOpaqueLTOCodeGenerator(c.Struct): pass +lto_code_gen_t: TypeAlias = c.POINTER[struct_LLVMOpaqueLTOCodeGenerator] +class struct_LLVMOpaqueThinLTOCodeGenerator(c.Struct): pass +thinlto_code_gen_t: TypeAlias = c.POINTER[struct_LLVMOpaqueThinLTOCodeGenerator] +@dll.bind(c.POINTER[ctypes.c_char]) +def lto_get_version() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char]) +def lto_get_error_message() -> c.POINTER[ctypes.c_char]: ... +@dll.bind(lto_bool_t, c.POINTER[ctypes.c_char]) +def lto_module_is_object_file(path:c.POINTER[ctypes.c_char]) -> lto_bool_t: ... +@dll.bind(lto_bool_t, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char]) +def lto_module_is_object_file_for_target(path:c.POINTER[ctypes.c_char], target_triple_prefix:c.POINTER[ctypes.c_char]) -> lto_bool_t: ... +@dll.bind(lto_bool_t, ctypes.c_void_p, size_t) +def lto_module_has_objc_category(mem:ctypes.c_void_p, length:size_t) -> lto_bool_t: ... +@dll.bind(lto_bool_t, ctypes.c_void_p, size_t) +def lto_module_is_object_file_in_memory(mem:ctypes.c_void_p, length:size_t) -> lto_bool_t: ... +@dll.bind(lto_bool_t, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char]) +def lto_module_is_object_file_in_memory_for_target(mem:ctypes.c_void_p, length:size_t, target_triple_prefix:c.POINTER[ctypes.c_char]) -> lto_bool_t: ... +@dll.bind(lto_module_t, c.POINTER[ctypes.c_char]) +def lto_module_create(path:c.POINTER[ctypes.c_char]) -> lto_module_t: ... +@dll.bind(lto_module_t, ctypes.c_void_p, size_t) +def lto_module_create_from_memory(mem:ctypes.c_void_p, length:size_t) -> lto_module_t: ... +@dll.bind(lto_module_t, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char]) +def lto_module_create_from_memory_with_path(mem:ctypes.c_void_p, length:size_t, path:c.POINTER[ctypes.c_char]) -> lto_module_t: ... +@dll.bind(lto_module_t, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char]) +def lto_module_create_in_local_context(mem:ctypes.c_void_p, length:size_t, path:c.POINTER[ctypes.c_char]) -> lto_module_t: ... +@dll.bind(lto_module_t, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char], lto_code_gen_t) +def lto_module_create_in_codegen_context(mem:ctypes.c_void_p, length:size_t, path:c.POINTER[ctypes.c_char], cg:lto_code_gen_t) -> lto_module_t: ... +@dll.bind(lto_module_t, ctypes.c_int32, c.POINTER[ctypes.c_char], size_t) +def lto_module_create_from_fd(fd:int, path:c.POINTER[ctypes.c_char], file_size:size_t) -> lto_module_t: ... +off_t: TypeAlias = ctypes.c_int64 +@dll.bind(lto_module_t, ctypes.c_int32, c.POINTER[ctypes.c_char], size_t, size_t, off_t) +def lto_module_create_from_fd_at_offset(fd:int, path:c.POINTER[ctypes.c_char], file_size:size_t, map_size:size_t, offset:off_t) -> lto_module_t: ... +@dll.bind(None, lto_module_t) +def lto_module_dispose(mod:lto_module_t) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], lto_module_t) +def lto_module_get_target_triple(mod:lto_module_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, lto_module_t, c.POINTER[ctypes.c_char]) +def lto_module_set_target_triple(mod:lto_module_t, triple:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(ctypes.c_uint32, lto_module_t) +def lto_module_get_num_symbols(mod:lto_module_t) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], lto_module_t, ctypes.c_uint32) +def lto_module_get_symbol_name(mod:lto_module_t, index:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, lto_module_t, ctypes.c_uint32) +def lto_module_get_symbol_attribute(mod:lto_module_t, index:int) -> ctypes.c_uint32: ... +@dll.bind(c.POINTER[ctypes.c_char], lto_module_t) +def lto_module_get_linkeropts(mod:lto_module_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(lto_bool_t, lto_module_t, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def lto_module_get_macho_cputype(mod:lto_module_t, out_cputype:c.POINTER[ctypes.c_uint32], out_cpusubtype:c.POINTER[ctypes.c_uint32]) -> lto_bool_t: ... +@dll.bind(lto_bool_t, lto_module_t) +def lto_module_has_ctor_dtor(mod:lto_module_t) -> lto_bool_t: ... +lto_codegen_diagnostic_severity_t: dict[int, str] = {(LTO_DS_ERROR:=0): 'LTO_DS_ERROR', (LTO_DS_WARNING:=1): 'LTO_DS_WARNING', (LTO_DS_REMARK:=3): 'LTO_DS_REMARK', (LTO_DS_NOTE:=2): 'LTO_DS_NOTE'} +lto_diagnostic_handler_t: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_void_p]] +@dll.bind(None, lto_code_gen_t, lto_diagnostic_handler_t, ctypes.c_void_p) +def lto_codegen_set_diagnostic_handler(_0:lto_code_gen_t, _1:lto_diagnostic_handler_t, _2:ctypes.c_void_p) -> None: ... +@dll.bind(lto_code_gen_t) +def lto_codegen_create() -> lto_code_gen_t: ... +@dll.bind(lto_code_gen_t) +def lto_codegen_create_in_local_context() -> lto_code_gen_t: ... +@dll.bind(None, lto_code_gen_t) +def lto_codegen_dispose(_0:lto_code_gen_t) -> None: ... +@dll.bind(lto_bool_t, lto_code_gen_t, lto_module_t) +def lto_codegen_add_module(cg:lto_code_gen_t, mod:lto_module_t) -> lto_bool_t: ... +@dll.bind(None, lto_code_gen_t, lto_module_t) +def lto_codegen_set_module(cg:lto_code_gen_t, mod:lto_module_t) -> None: ... +@dll.bind(lto_bool_t, lto_code_gen_t, ctypes.c_uint32) +def lto_codegen_set_debug_model(cg:lto_code_gen_t, _1:ctypes.c_uint32) -> lto_bool_t: ... +@dll.bind(lto_bool_t, lto_code_gen_t, ctypes.c_uint32) +def lto_codegen_set_pic_model(cg:lto_code_gen_t, _1:ctypes.c_uint32) -> lto_bool_t: ... +@dll.bind(None, lto_code_gen_t, c.POINTER[ctypes.c_char]) +def lto_codegen_set_cpu(cg:lto_code_gen_t, cpu:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, lto_code_gen_t, c.POINTER[ctypes.c_char]) +def lto_codegen_set_assembler_path(cg:lto_code_gen_t, path:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, lto_code_gen_t, c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32) +def lto_codegen_set_assembler_args(cg:lto_code_gen_t, args:c.POINTER[c.POINTER[ctypes.c_char]], nargs:int) -> None: ... +@dll.bind(None, lto_code_gen_t, c.POINTER[ctypes.c_char]) +def lto_codegen_add_must_preserve_symbol(cg:lto_code_gen_t, symbol:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(lto_bool_t, lto_code_gen_t, c.POINTER[ctypes.c_char]) +def lto_codegen_write_merged_modules(cg:lto_code_gen_t, path:c.POINTER[ctypes.c_char]) -> lto_bool_t: ... +@dll.bind(ctypes.c_void_p, lto_code_gen_t, c.POINTER[size_t]) +def lto_codegen_compile(cg:lto_code_gen_t, length:c.POINTER[size_t]) -> ctypes.c_void_p: ... +@dll.bind(lto_bool_t, lto_code_gen_t, c.POINTER[c.POINTER[ctypes.c_char]]) +def lto_codegen_compile_to_file(cg:lto_code_gen_t, name:c.POINTER[c.POINTER[ctypes.c_char]]) -> lto_bool_t: ... +@dll.bind(lto_bool_t, lto_code_gen_t) +def lto_codegen_optimize(cg:lto_code_gen_t) -> lto_bool_t: ... +@dll.bind(ctypes.c_void_p, lto_code_gen_t, c.POINTER[size_t]) +def lto_codegen_compile_optimized(cg:lto_code_gen_t, length:c.POINTER[size_t]) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_uint32) +def lto_api_version() -> int: ... +@dll.bind(None, c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32) +def lto_set_debug_options(options:c.POINTER[c.POINTER[ctypes.c_char]], number:int) -> None: ... +@dll.bind(None, lto_code_gen_t, c.POINTER[ctypes.c_char]) +def lto_codegen_debug_options(cg:lto_code_gen_t, _1:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, lto_code_gen_t, c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32) +def lto_codegen_debug_options_array(cg:lto_code_gen_t, _1:c.POINTER[c.POINTER[ctypes.c_char]], number:int) -> None: ... +@dll.bind(None) +def lto_initialize_disassembler() -> None: ... +@dll.bind(None, lto_code_gen_t, lto_bool_t) +def lto_codegen_set_should_internalize(cg:lto_code_gen_t, ShouldInternalize:lto_bool_t) -> None: ... +@dll.bind(None, lto_code_gen_t, lto_bool_t) +def lto_codegen_set_should_embed_uselists(cg:lto_code_gen_t, ShouldEmbedUselists:lto_bool_t) -> None: ... +class struct_LLVMOpaqueLTOInput(c.Struct): pass +lto_input_t: TypeAlias = c.POINTER[struct_LLVMOpaqueLTOInput] +@dll.bind(lto_input_t, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char]) +def lto_input_create(buffer:ctypes.c_void_p, buffer_size:size_t, path:c.POINTER[ctypes.c_char]) -> lto_input_t: ... +@dll.bind(None, lto_input_t) +def lto_input_dispose(input:lto_input_t) -> None: ... +@dll.bind(ctypes.c_uint32, lto_input_t) +def lto_input_get_num_dependent_libraries(input:lto_input_t) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], lto_input_t, size_t, c.POINTER[size_t]) +def lto_input_get_dependent_library(input:lto_input_t, index:size_t, size:c.POINTER[size_t]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t]) +def lto_runtime_lib_symbols_list(size:c.POINTER[size_t]) -> c.POINTER[c.POINTER[ctypes.c_char]]: ... +@c.record +class LTOObjectBuffer(c.Struct): + SIZE = 16 + Buffer: c.POINTER[ctypes.c_char] + Size: int +LTOObjectBuffer.register_fields([('Buffer', c.POINTER[ctypes.c_char], 0), ('Size', size_t, 8)]) +@dll.bind(thinlto_code_gen_t) +def thinlto_create_codegen() -> thinlto_code_gen_t: ... +@dll.bind(None, thinlto_code_gen_t) +def thinlto_codegen_dispose(cg:thinlto_code_gen_t) -> None: ... +@dll.bind(None, thinlto_code_gen_t, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32) +def thinlto_codegen_add_module(cg:thinlto_code_gen_t, identifier:c.POINTER[ctypes.c_char], data:c.POINTER[ctypes.c_char], length:int) -> None: ... +@dll.bind(None, thinlto_code_gen_t) +def thinlto_codegen_process(cg:thinlto_code_gen_t) -> None: ... +@dll.bind(ctypes.c_uint32, thinlto_code_gen_t) +def thinlto_module_get_num_objects(cg:thinlto_code_gen_t) -> int: ... +@dll.bind(LTOObjectBuffer, thinlto_code_gen_t, ctypes.c_uint32) +def thinlto_module_get_object(cg:thinlto_code_gen_t, index:int) -> LTOObjectBuffer: ... +@dll.bind(ctypes.c_uint32, thinlto_code_gen_t) +def thinlto_module_get_num_object_files(cg:thinlto_code_gen_t) -> int: ... +@dll.bind(c.POINTER[ctypes.c_char], thinlto_code_gen_t, ctypes.c_uint32) +def thinlto_module_get_object_file(cg:thinlto_code_gen_t, index:int) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(lto_bool_t, thinlto_code_gen_t, ctypes.c_uint32) +def thinlto_codegen_set_pic_model(cg:thinlto_code_gen_t, _1:ctypes.c_uint32) -> lto_bool_t: ... +@dll.bind(None, thinlto_code_gen_t, c.POINTER[ctypes.c_char]) +def thinlto_codegen_set_savetemps_dir(cg:thinlto_code_gen_t, save_temps_dir:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, thinlto_code_gen_t, c.POINTER[ctypes.c_char]) +def thinlto_set_generated_objects_dir(cg:thinlto_code_gen_t, save_temps_dir:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, thinlto_code_gen_t, c.POINTER[ctypes.c_char]) +def thinlto_codegen_set_cpu(cg:thinlto_code_gen_t, cpu:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, thinlto_code_gen_t, lto_bool_t) +def thinlto_codegen_disable_codegen(cg:thinlto_code_gen_t, disable:lto_bool_t) -> None: ... +@dll.bind(None, thinlto_code_gen_t, lto_bool_t) +def thinlto_codegen_set_codegen_only(cg:thinlto_code_gen_t, codegen_only:lto_bool_t) -> None: ... +@dll.bind(None, c.POINTER[c.POINTER[ctypes.c_char]], ctypes.c_int32) +def thinlto_debug_options(options:c.POINTER[c.POINTER[ctypes.c_char]], number:int) -> None: ... +@dll.bind(lto_bool_t, lto_module_t) +def lto_module_is_thinlto(mod:lto_module_t) -> lto_bool_t: ... +@dll.bind(None, thinlto_code_gen_t, c.POINTER[ctypes.c_char], ctypes.c_int32) +def thinlto_codegen_add_must_preserve_symbol(cg:thinlto_code_gen_t, name:c.POINTER[ctypes.c_char], length:int) -> None: ... +@dll.bind(None, thinlto_code_gen_t, c.POINTER[ctypes.c_char], ctypes.c_int32) +def thinlto_codegen_add_cross_referenced_symbol(cg:thinlto_code_gen_t, name:c.POINTER[ctypes.c_char], length:int) -> None: ... +@dll.bind(None, thinlto_code_gen_t, c.POINTER[ctypes.c_char]) +def thinlto_codegen_set_cache_dir(cg:thinlto_code_gen_t, cache_dir:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, thinlto_code_gen_t, ctypes.c_int32) +def thinlto_codegen_set_cache_pruning_interval(cg:thinlto_code_gen_t, interval:int) -> None: ... +@dll.bind(None, thinlto_code_gen_t, ctypes.c_uint32) +def thinlto_codegen_set_final_cache_size_relative_to_available_space(cg:thinlto_code_gen_t, percentage:int) -> None: ... +@dll.bind(None, thinlto_code_gen_t, ctypes.c_uint32) +def thinlto_codegen_set_cache_entry_expiration(cg:thinlto_code_gen_t, expiration:int) -> None: ... +@dll.bind(None, thinlto_code_gen_t, ctypes.c_uint32) +def thinlto_codegen_set_cache_size_bytes(cg:thinlto_code_gen_t, max_size_bytes:int) -> None: ... +@dll.bind(None, thinlto_code_gen_t, ctypes.c_uint32) +def thinlto_codegen_set_cache_size_megabytes(cg:thinlto_code_gen_t, max_size_megabytes:int) -> None: ... +@dll.bind(None, thinlto_code_gen_t, ctypes.c_uint32) +def thinlto_codegen_set_cache_size_files(cg:thinlto_code_gen_t, max_size_files:int) -> None: ... +LLVMDisassembler_Option_UseMarkup = 1 +LLVMDisassembler_Option_PrintImmHex = 2 +LLVMDisassembler_Option_AsmPrinterVariant = 4 +LLVMDisassembler_Option_SetInstrComments = 8 +LLVMDisassembler_Option_PrintLatency = 16 +LLVMDisassembler_Option_Color = 32 +LLVMDisassembler_VariantKind_None = 0 +LLVMDisassembler_VariantKind_ARM_HI16 = 1 +LLVMDisassembler_VariantKind_ARM_LO16 = 2 +LLVMDisassembler_VariantKind_ARM64_PAGE = 1 +LLVMDisassembler_VariantKind_ARM64_PAGEOFF = 2 +LLVMDisassembler_VariantKind_ARM64_GOTPAGE = 3 +LLVMDisassembler_VariantKind_ARM64_GOTPAGEOFF = 4 +LLVMDisassembler_VariantKind_ARM64_TLVP = 5 +LLVMDisassembler_VariantKind_ARM64_TLVOFF = 6 +LLVMDisassembler_ReferenceType_InOut_None = 0 +LLVMDisassembler_ReferenceType_In_Branch = 1 +LLVMDisassembler_ReferenceType_In_PCrel_Load = 2 +LLVMDisassembler_ReferenceType_In_ARM64_ADRP = 0x100000001 +LLVMDisassembler_ReferenceType_In_ARM64_ADDXri = 0x100000002 +LLVMDisassembler_ReferenceType_In_ARM64_LDRXui = 0x100000003 +LLVMDisassembler_ReferenceType_In_ARM64_LDRXl = 0x100000004 +LLVMDisassembler_ReferenceType_In_ARM64_ADR = 0x100000005 +LLVMDisassembler_ReferenceType_Out_SymbolStub = 1 +LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr = 2 +LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr = 3 +LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref = 4 +LLVMDisassembler_ReferenceType_Out_Objc_Message = 5 +LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref = 6 +LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref = 7 +LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref = 8 +LLVMDisassembler_ReferenceType_DeMangled_Name = 9 +LLVMErrorSuccess = 0 +REMARKS_API_VERSION = 1 +LLVM_BLAKE3_VERSION_STRING = "1.3.1" +LLVM_BLAKE3_KEY_LEN = 32 +LLVM_BLAKE3_OUT_LEN = 32 +LLVM_BLAKE3_BLOCK_LEN = 64 +LLVM_BLAKE3_CHUNK_LEN = 1024 +LLVM_BLAKE3_MAX_DEPTH = 54 +LTO_API_VERSION = 29 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/llvm_qcom.py b/artifacts/package_runtime/tinygrad/runtime/autogen/llvm_qcom.py new file mode 100644 index 000000000..4b5879b1f --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/llvm_qcom.py @@ -0,0 +1,104 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +dll = c.DLL('llvm_qcom', 'llvm-qcom') +cl_llvm_instance: TypeAlias = ctypes.c_void_p +@dll.bind(cl_llvm_instance) +def cl_compiler_create_llvm_instance() -> cl_llvm_instance: ... +@dll.bind(None, cl_llvm_instance) +def cl_compiler_destroy_llvm_instance(inst:cl_llvm_instance) -> None: ... +enum_cl_handle_type: dict[int, str] = {(CL_HANDLE_COMPILED:=1): 'CL_HANDLE_COMPILED', (CL_HANDLE_LIBRARY:=2): 'CL_HANDLE_LIBRARY', (CL_HANDLE_LINKED:=3): 'CL_HANDLE_LINKED'} +@c.record +class struct_cl_compiled_data(c.Struct): + SIZE = 48 + chip_id: int + mode: int + llvm_bitcode: ctypes.c_void_p + llvm_bitcode_size: int + build_log: c.POINTER[ctypes.c_char] + build_log_len: int + error_code: int +uint64_t: TypeAlias = ctypes.c_uint64 +uint32_t: TypeAlias = ctypes.c_uint32 +struct_cl_compiled_data.register_fields([('chip_id', uint64_t, 0), ('mode', uint32_t, 8), ('llvm_bitcode', ctypes.c_void_p, 16), ('llvm_bitcode_size', uint64_t, 24), ('build_log', c.POINTER[ctypes.c_char], 32), ('build_log_len', uint32_t, 40), ('error_code', uint32_t, 44)]) +@c.record +class struct_cl_executable_data(c.Struct): + SIZE = 80 + num_kernels: int + kernel_props: ctypes.c_void_p + error_code: int + build_log: c.POINTER[ctypes.c_char] + _unk0: c.Array[ctypes.c_char, Literal[32]] + chip_id: int + mode: int +int32_t: TypeAlias = ctypes.c_int32 +struct_cl_executable_data.register_fields([('num_kernels', int32_t, 0), ('kernel_props', ctypes.c_void_p, 8), ('error_code', uint32_t, 16), ('build_log', c.POINTER[ctypes.c_char], 24), ('_unk0', c.Array[ctypes.c_char, Literal[32]], 32), ('chip_id', uint64_t, 64), ('mode', uint32_t, 72)]) +@c.record +class cl_handle(c.Struct): + SIZE = 16 + type: int + compiled: c.POINTER[struct_cl_compiled_data] + executable: c.POINTER[struct_cl_executable_data] +cl_handle.register_fields([('type', ctypes.c_uint32, 0), ('compiled', c.POINTER[struct_cl_compiled_data], 8), ('executable', c.POINTER[struct_cl_executable_data], 8)]) +@dll.bind(c.POINTER[cl_handle], cl_llvm_instance, uint64_t, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32, uint64_t, uint64_t, c.POINTER[ctypes.c_char], uint64_t, uint64_t, ctypes.c_void_p) +def cl_compiler_compile_source(inst:cl_llvm_instance, chip_id:uint64_t, mode:int, options:c.POINTER[ctypes.c_char], p5:int, p6:uint64_t, p7:uint64_t, source:c.POINTER[ctypes.c_char], source_len:uint64_t, source_type:uint64_t, p11:ctypes.c_void_p) -> c.POINTER[cl_handle]: ... +@dll.bind(c.POINTER[cl_handle], cl_llvm_instance, uint64_t, ctypes.c_int32, c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[c.POINTER[cl_handle]]) +def cl_compiler_link_program(inst:cl_llvm_instance, chip_id:uint64_t, mode:int, options:c.POINTER[ctypes.c_char], num_handles:int, input_handles:c.POINTER[c.POINTER[cl_handle]]) -> c.POINTER[cl_handle]: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(None, c.POINTER[cl_handle], c.POINTER[ctypes.c_void_p], c.POINTER[size_t]) +def cl_compiler_handle_create_binary(handle:c.POINTER[cl_handle], out_ptr:c.POINTER[ctypes.c_void_p], out_size:c.POINTER[size_t]) -> None: ... +@c.record +class cl_lib_section(c.Struct): + SIZE = 20 + id: int + offset: int + size: int + count: int + entry_size: int +cl_lib_section.register_fields([('id', uint32_t, 0), ('offset', uint32_t, 4), ('size', uint32_t, 8), ('count', uint32_t, 12), ('entry_size', uint32_t, 16)]) +@c.record +class cl_lib_header(c.Struct): + SIZE = 48 + _unk0: c.Array[ctypes.c_uint32, Literal[6]] + num_sections: int + _unk1: c.Array[ctypes.c_uint32, Literal[5]] + sections: c.Array[cl_lib_section, Literal[0]] +cl_lib_header.register_fields([('_unk0', c.Array[uint32_t, Literal[6]], 0), ('num_sections', uint32_t, 24), ('_unk1', c.Array[uint32_t, Literal[5]], 28), ('sections', c.Array[cl_lib_section, Literal[0]], 48)]) +@c.record +class cl_lib_prog(c.Struct): + SIZE = 28 + name: c.Array[ctypes.c_char, Literal[8]] + _unk0: c.Array[ctypes.c_uint32, Literal[3]] + fregs: int + hregs: int +cl_lib_prog.register_fields([('name', c.Array[ctypes.c_char, Literal[8]], 0), ('_unk0', c.Array[uint32_t, Literal[3]], 8), ('fregs', uint32_t, 20), ('hregs', uint32_t, 24)]) +@c.record +class cl_lib_img_desc(c.Struct): + SIZE = 344 + _unk0: c.Array[ctypes.c_char, Literal[196]] + prg_offset: int + pvtmem: int + _unk1: c.Array[ctypes.c_char, Literal[12]] + shmem: int + samp_cnt: int + _unk2: c.Array[ctypes.c_char, Literal[40]] + brnchstck: int + _unk4: c.Array[ctypes.c_char, Literal[76]] + kernel_name: c.Array[ctypes.c_char, Literal[0]] +cl_lib_img_desc.register_fields([('_unk0', c.Array[ctypes.c_char, Literal[196]], 0), ('prg_offset', uint32_t, 196), ('pvtmem', uint32_t, 200), ('_unk1', c.Array[ctypes.c_char, Literal[12]], 204), ('shmem', uint32_t, 216), ('samp_cnt', uint32_t, 220), ('_unk2', c.Array[ctypes.c_char, Literal[40]], 224), ('brnchstck', uint32_t, 264), ('_unk4', c.Array[ctypes.c_char, Literal[76]], 268), ('kernel_name', c.Array[ctypes.c_char, Literal[0]], 344)]) +@dll.bind(None, c.POINTER[cl_handle]) +def cl_compiler_free_handle(handle:c.POINTER[cl_handle]) -> None: ... +@dll.bind(None, ctypes.c_void_p) +def cl_compiler_free_assembly(ptr:ctypes.c_void_p) -> None: ... +CL_MODE_32BIT = 0 +CL_MODE_64BIT = 1 +CL_SRC_STR = 0 +CL_SRC_BLOB = 1 +CL_LIB_PROGRAM = 0 +CL_LIB_CONSTS = 6 +CL_LIB_IMAGE = 7 +CL_LIB_CODE = 10 +CL_LIB_IMAGE_DESC = 11 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/mesa.py b/artifacts/package_runtime/tinygrad/runtime/autogen/mesa.py new file mode 100644 index 000000000..6b74bf01d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/mesa.py @@ -0,0 +1,10533 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +from tinygrad.helpers import DEV +import gzip, base64, platform, sysconfig, os +dll = c.DLL('mesa', 'tinymesa_cpu' if DEV.renderer == 'LVP' else 'tinymesa', os.path.join(sysconfig.get_paths()['platlib'], 'tinymesa'), emsg='pip install tinymesa==25.2.7.2') +class struct_u_printf_info(c.Struct): pass +u_printf_info: TypeAlias = struct_u_printf_info +uint32_t: TypeAlias = ctypes.c_uint32 +try: nir_debug = uint32_t.in_dll(dll, 'nir_debug') # type: ignore +except (ValueError,AttributeError): pass +try: nir_debug_print_shader = c.Array[ctypes.c_bool, Literal[15]].in_dll(dll, 'nir_debug_print_shader') # type: ignore +except (ValueError,AttributeError): pass +nir_component_mask_t: TypeAlias = ctypes.c_uint16 +@dll.bind(None) +def nir_process_debug_variable() -> None: ... +@dll.bind(ctypes.c_bool, nir_component_mask_t, ctypes.c_uint32, ctypes.c_uint32) +def nir_component_mask_can_reinterpret(mask:nir_component_mask_t, old_bit_size:int, new_bit_size:int) -> bool: ... +@dll.bind(nir_component_mask_t, nir_component_mask_t, ctypes.c_uint32, ctypes.c_uint32) +def nir_component_mask_reinterpret(mask:nir_component_mask_t, old_bit_size:int, new_bit_size:int) -> nir_component_mask_t: ... +@c.record +class struct_nir_state_slot(c.Struct): + SIZE = 8 + tokens: c.Array[ctypes.c_int16, Literal[4]] +gl_state_index16: TypeAlias = ctypes.c_int16 +struct_nir_state_slot.register_fields([('tokens', c.Array[gl_state_index16, Literal[4]], 0)]) +nir_state_slot: TypeAlias = struct_nir_state_slot +nir_rounding_mode: dict[int, str] = {(nir_rounding_mode_undef:=0): 'nir_rounding_mode_undef', (nir_rounding_mode_rtne:=1): 'nir_rounding_mode_rtne', (nir_rounding_mode_ru:=2): 'nir_rounding_mode_ru', (nir_rounding_mode_rd:=3): 'nir_rounding_mode_rd', (nir_rounding_mode_rtz:=4): 'nir_rounding_mode_rtz'} +nir_ray_query_value: dict[int, str] = {(nir_ray_query_value_intersection_type:=0): 'nir_ray_query_value_intersection_type', (nir_ray_query_value_intersection_t:=1): 'nir_ray_query_value_intersection_t', (nir_ray_query_value_intersection_instance_custom_index:=2): 'nir_ray_query_value_intersection_instance_custom_index', (nir_ray_query_value_intersection_instance_id:=3): 'nir_ray_query_value_intersection_instance_id', (nir_ray_query_value_intersection_instance_sbt_index:=4): 'nir_ray_query_value_intersection_instance_sbt_index', (nir_ray_query_value_intersection_geometry_index:=5): 'nir_ray_query_value_intersection_geometry_index', (nir_ray_query_value_intersection_primitive_index:=6): 'nir_ray_query_value_intersection_primitive_index', (nir_ray_query_value_intersection_barycentrics:=7): 'nir_ray_query_value_intersection_barycentrics', (nir_ray_query_value_intersection_front_face:=8): 'nir_ray_query_value_intersection_front_face', (nir_ray_query_value_intersection_object_ray_direction:=9): 'nir_ray_query_value_intersection_object_ray_direction', (nir_ray_query_value_intersection_object_ray_origin:=10): 'nir_ray_query_value_intersection_object_ray_origin', (nir_ray_query_value_intersection_object_to_world:=11): 'nir_ray_query_value_intersection_object_to_world', (nir_ray_query_value_intersection_world_to_object:=12): 'nir_ray_query_value_intersection_world_to_object', (nir_ray_query_value_intersection_candidate_aabb_opaque:=13): 'nir_ray_query_value_intersection_candidate_aabb_opaque', (nir_ray_query_value_tmin:=14): 'nir_ray_query_value_tmin', (nir_ray_query_value_flags:=15): 'nir_ray_query_value_flags', (nir_ray_query_value_world_ray_direction:=16): 'nir_ray_query_value_world_ray_direction', (nir_ray_query_value_world_ray_origin:=17): 'nir_ray_query_value_world_ray_origin', (nir_ray_query_value_intersection_triangle_vertex_positions:=18): 'nir_ray_query_value_intersection_triangle_vertex_positions'} +nir_resource_data_intel: dict[int, str] = {(nir_resource_intel_bindless:=1): 'nir_resource_intel_bindless', (nir_resource_intel_pushable:=2): 'nir_resource_intel_pushable', (nir_resource_intel_sampler:=4): 'nir_resource_intel_sampler', (nir_resource_intel_non_uniform:=8): 'nir_resource_intel_non_uniform', (nir_resource_intel_sampler_embedded:=16): 'nir_resource_intel_sampler_embedded'} +nir_preamble_class: dict[int, str] = {(nir_preamble_class_general:=0): 'nir_preamble_class_general', (nir_preamble_class_image:=1): 'nir_preamble_class_image', (nir_preamble_num_classes:=2): 'nir_preamble_num_classes'} +nir_cmat_signed: dict[int, str] = {(NIR_CMAT_A_SIGNED:=1): 'NIR_CMAT_A_SIGNED', (NIR_CMAT_B_SIGNED:=2): 'NIR_CMAT_B_SIGNED', (NIR_CMAT_C_SIGNED:=4): 'NIR_CMAT_C_SIGNED', (NIR_CMAT_RESULT_SIGNED:=8): 'NIR_CMAT_RESULT_SIGNED'} +@c.record +class nir_const_value(c.Struct): + SIZE = 8 + b: bool + f32: float + f64: float + i8: int + u8: int + i16: int + u16: int + i32: int + u32: int + i64: int + u64: int +int8_t: TypeAlias = ctypes.c_byte +uint8_t: TypeAlias = ctypes.c_ubyte +int16_t: TypeAlias = ctypes.c_int16 +uint16_t: TypeAlias = ctypes.c_uint16 +int32_t: TypeAlias = ctypes.c_int32 +int64_t: TypeAlias = ctypes.c_int64 +uint64_t: TypeAlias = ctypes.c_uint64 +nir_const_value.register_fields([('b', ctypes.c_bool, 0), ('f32', ctypes.c_float, 0), ('f64', ctypes.c_double, 0), ('i8', int8_t, 0), ('u8', uint8_t, 0), ('i16', int16_t, 0), ('u16', uint16_t, 0), ('i32', int32_t, 0), ('u32', uint32_t, 0), ('i64', int64_t, 0), ('u64', uint64_t, 0)]) +@dll.bind(nir_const_value, ctypes.c_double, ctypes.c_uint32) +def nir_const_value_for_float(b:float, bit_size:int) -> nir_const_value: ... +@dll.bind(ctypes.c_double, nir_const_value, ctypes.c_uint32) +def nir_const_value_as_float(value:nir_const_value, bit_size:int) -> float: ... +@c.record +class struct_nir_constant(c.Struct): + SIZE = 144 + values: c.Array[nir_const_value, Literal[16]] + is_null_constant: bool + num_elements: int + elements: c.POINTER[c.POINTER[struct_nir_constant]] +nir_constant: TypeAlias = struct_nir_constant +struct_nir_constant.register_fields([('values', c.Array[nir_const_value, Literal[16]], 0), ('is_null_constant', ctypes.c_bool, 128), ('num_elements', ctypes.c_uint32, 132), ('elements', c.POINTER[c.POINTER[nir_constant]], 136)]) +nir_depth_layout: dict[int, str] = {(nir_depth_layout_none:=0): 'nir_depth_layout_none', (nir_depth_layout_any:=1): 'nir_depth_layout_any', (nir_depth_layout_greater:=2): 'nir_depth_layout_greater', (nir_depth_layout_less:=3): 'nir_depth_layout_less', (nir_depth_layout_unchanged:=4): 'nir_depth_layout_unchanged'} +nir_var_declaration_type: dict[int, str] = {(nir_var_declared_normally:=0): 'nir_var_declared_normally', (nir_var_declared_implicitly:=1): 'nir_var_declared_implicitly', (nir_var_hidden:=2): 'nir_var_hidden'} +@c.record +class struct_nir_variable_data(c.Struct): + SIZE = 56 + mode: int + read_only: int + centroid: int + sample: int + patch: int + invariant: int + explicit_invariant: int + ray_query: int + precision: int + assigned: int + cannot_coalesce: int + always_active_io: int + interpolation: int + location_frac: int + compact: int + fb_fetch_output: int + bindless: int + explicit_binding: int + explicit_location: int + implicit_sized_array: int + max_array_access: int + has_initializer: int + is_implicit_initializer: int + is_xfb: int + is_xfb_only: int + explicit_xfb_buffer: int + explicit_xfb_stride: int + explicit_offset: int + matrix_layout: int + from_named_ifc_block: int + from_ssbo_unsized_array: int + must_be_shader_input: int + used: int + how_declared: int + per_view: int + per_primitive: int + per_vertex: int + aliased_shared_memory: int + depth_layout: int + stream: int + access: int + descriptor_set: int + index: int + binding: int + location: int + alignment: int + driver_location: int + offset: int + image: struct_nir_variable_data_image + sampler: struct_nir_variable_data_sampler + xfb: struct_nir_variable_data_xfb + node_name: c.POINTER[ctypes.c_char] +@c.record +class struct_nir_variable_data_image(c.Struct): + SIZE = 4 + format: int +enum_pipe_format: dict[int, str] = {(PIPE_FORMAT_NONE:=0): 'PIPE_FORMAT_NONE', (PIPE_FORMAT_R64_UINT:=1): 'PIPE_FORMAT_R64_UINT', (PIPE_FORMAT_R64G64_UINT:=2): 'PIPE_FORMAT_R64G64_UINT', (PIPE_FORMAT_R64G64B64_UINT:=3): 'PIPE_FORMAT_R64G64B64_UINT', (PIPE_FORMAT_R64G64B64A64_UINT:=4): 'PIPE_FORMAT_R64G64B64A64_UINT', (PIPE_FORMAT_R64_SINT:=5): 'PIPE_FORMAT_R64_SINT', (PIPE_FORMAT_R64G64_SINT:=6): 'PIPE_FORMAT_R64G64_SINT', (PIPE_FORMAT_R64G64B64_SINT:=7): 'PIPE_FORMAT_R64G64B64_SINT', (PIPE_FORMAT_R64G64B64A64_SINT:=8): 'PIPE_FORMAT_R64G64B64A64_SINT', (PIPE_FORMAT_R64_FLOAT:=9): 'PIPE_FORMAT_R64_FLOAT', (PIPE_FORMAT_R64G64_FLOAT:=10): 'PIPE_FORMAT_R64G64_FLOAT', (PIPE_FORMAT_R64G64B64_FLOAT:=11): 'PIPE_FORMAT_R64G64B64_FLOAT', (PIPE_FORMAT_R64G64B64A64_FLOAT:=12): 'PIPE_FORMAT_R64G64B64A64_FLOAT', (PIPE_FORMAT_R32_FLOAT:=13): 'PIPE_FORMAT_R32_FLOAT', (PIPE_FORMAT_R32G32_FLOAT:=14): 'PIPE_FORMAT_R32G32_FLOAT', (PIPE_FORMAT_R32G32B32_FLOAT:=15): 'PIPE_FORMAT_R32G32B32_FLOAT', (PIPE_FORMAT_R32G32B32A32_FLOAT:=16): 'PIPE_FORMAT_R32G32B32A32_FLOAT', (PIPE_FORMAT_R32_UNORM:=17): 'PIPE_FORMAT_R32_UNORM', (PIPE_FORMAT_R32G32_UNORM:=18): 'PIPE_FORMAT_R32G32_UNORM', (PIPE_FORMAT_R32G32B32_UNORM:=19): 'PIPE_FORMAT_R32G32B32_UNORM', (PIPE_FORMAT_R32G32B32A32_UNORM:=20): 'PIPE_FORMAT_R32G32B32A32_UNORM', (PIPE_FORMAT_R32_USCALED:=21): 'PIPE_FORMAT_R32_USCALED', (PIPE_FORMAT_R32G32_USCALED:=22): 'PIPE_FORMAT_R32G32_USCALED', (PIPE_FORMAT_R32G32B32_USCALED:=23): 'PIPE_FORMAT_R32G32B32_USCALED', (PIPE_FORMAT_R32G32B32A32_USCALED:=24): 'PIPE_FORMAT_R32G32B32A32_USCALED', (PIPE_FORMAT_R32_SNORM:=25): 'PIPE_FORMAT_R32_SNORM', (PIPE_FORMAT_R32G32_SNORM:=26): 'PIPE_FORMAT_R32G32_SNORM', (PIPE_FORMAT_R32G32B32_SNORM:=27): 'PIPE_FORMAT_R32G32B32_SNORM', (PIPE_FORMAT_R32G32B32A32_SNORM:=28): 'PIPE_FORMAT_R32G32B32A32_SNORM', (PIPE_FORMAT_R32_SSCALED:=29): 'PIPE_FORMAT_R32_SSCALED', (PIPE_FORMAT_R32G32_SSCALED:=30): 'PIPE_FORMAT_R32G32_SSCALED', (PIPE_FORMAT_R32G32B32_SSCALED:=31): 'PIPE_FORMAT_R32G32B32_SSCALED', (PIPE_FORMAT_R32G32B32A32_SSCALED:=32): 'PIPE_FORMAT_R32G32B32A32_SSCALED', (PIPE_FORMAT_R16_UNORM:=33): 'PIPE_FORMAT_R16_UNORM', (PIPE_FORMAT_R16G16_UNORM:=34): 'PIPE_FORMAT_R16G16_UNORM', (PIPE_FORMAT_R16G16B16_UNORM:=35): 'PIPE_FORMAT_R16G16B16_UNORM', (PIPE_FORMAT_R16G16B16A16_UNORM:=36): 'PIPE_FORMAT_R16G16B16A16_UNORM', (PIPE_FORMAT_R16_USCALED:=37): 'PIPE_FORMAT_R16_USCALED', (PIPE_FORMAT_R16G16_USCALED:=38): 'PIPE_FORMAT_R16G16_USCALED', (PIPE_FORMAT_R16G16B16_USCALED:=39): 'PIPE_FORMAT_R16G16B16_USCALED', (PIPE_FORMAT_R16G16B16A16_USCALED:=40): 'PIPE_FORMAT_R16G16B16A16_USCALED', (PIPE_FORMAT_R16_SNORM:=41): 'PIPE_FORMAT_R16_SNORM', (PIPE_FORMAT_R16G16_SNORM:=42): 'PIPE_FORMAT_R16G16_SNORM', (PIPE_FORMAT_R16G16B16_SNORM:=43): 'PIPE_FORMAT_R16G16B16_SNORM', (PIPE_FORMAT_R16G16B16A16_SNORM:=44): 'PIPE_FORMAT_R16G16B16A16_SNORM', (PIPE_FORMAT_R16_SSCALED:=45): 'PIPE_FORMAT_R16_SSCALED', (PIPE_FORMAT_R16G16_SSCALED:=46): 'PIPE_FORMAT_R16G16_SSCALED', (PIPE_FORMAT_R16G16B16_SSCALED:=47): 'PIPE_FORMAT_R16G16B16_SSCALED', (PIPE_FORMAT_R16G16B16A16_SSCALED:=48): 'PIPE_FORMAT_R16G16B16A16_SSCALED', (PIPE_FORMAT_R8_UNORM:=49): 'PIPE_FORMAT_R8_UNORM', (PIPE_FORMAT_R8G8_UNORM:=50): 'PIPE_FORMAT_R8G8_UNORM', (PIPE_FORMAT_R8G8B8_UNORM:=51): 'PIPE_FORMAT_R8G8B8_UNORM', (PIPE_FORMAT_B8G8R8_UNORM:=52): 'PIPE_FORMAT_B8G8R8_UNORM', (PIPE_FORMAT_R8G8B8A8_UNORM:=53): 'PIPE_FORMAT_R8G8B8A8_UNORM', (PIPE_FORMAT_B8G8R8A8_UNORM:=54): 'PIPE_FORMAT_B8G8R8A8_UNORM', (PIPE_FORMAT_R8_USCALED:=55): 'PIPE_FORMAT_R8_USCALED', (PIPE_FORMAT_R8G8_USCALED:=56): 'PIPE_FORMAT_R8G8_USCALED', (PIPE_FORMAT_R8G8B8_USCALED:=57): 'PIPE_FORMAT_R8G8B8_USCALED', (PIPE_FORMAT_B8G8R8_USCALED:=58): 'PIPE_FORMAT_B8G8R8_USCALED', (PIPE_FORMAT_R8G8B8A8_USCALED:=59): 'PIPE_FORMAT_R8G8B8A8_USCALED', (PIPE_FORMAT_B8G8R8A8_USCALED:=60): 'PIPE_FORMAT_B8G8R8A8_USCALED', (PIPE_FORMAT_A8B8G8R8_USCALED:=61): 'PIPE_FORMAT_A8B8G8R8_USCALED', (PIPE_FORMAT_R8_SNORM:=62): 'PIPE_FORMAT_R8_SNORM', (PIPE_FORMAT_R8G8_SNORM:=63): 'PIPE_FORMAT_R8G8_SNORM', (PIPE_FORMAT_R8G8B8_SNORM:=64): 'PIPE_FORMAT_R8G8B8_SNORM', (PIPE_FORMAT_B8G8R8_SNORM:=65): 'PIPE_FORMAT_B8G8R8_SNORM', (PIPE_FORMAT_R8G8B8A8_SNORM:=66): 'PIPE_FORMAT_R8G8B8A8_SNORM', (PIPE_FORMAT_B8G8R8A8_SNORM:=67): 'PIPE_FORMAT_B8G8R8A8_SNORM', (PIPE_FORMAT_R8_SSCALED:=68): 'PIPE_FORMAT_R8_SSCALED', (PIPE_FORMAT_R8G8_SSCALED:=69): 'PIPE_FORMAT_R8G8_SSCALED', (PIPE_FORMAT_R8G8B8_SSCALED:=70): 'PIPE_FORMAT_R8G8B8_SSCALED', (PIPE_FORMAT_B8G8R8_SSCALED:=71): 'PIPE_FORMAT_B8G8R8_SSCALED', (PIPE_FORMAT_R8G8B8A8_SSCALED:=72): 'PIPE_FORMAT_R8G8B8A8_SSCALED', (PIPE_FORMAT_B8G8R8A8_SSCALED:=73): 'PIPE_FORMAT_B8G8R8A8_SSCALED', (PIPE_FORMAT_A8B8G8R8_SSCALED:=74): 'PIPE_FORMAT_A8B8G8R8_SSCALED', (PIPE_FORMAT_A8R8G8B8_UNORM:=75): 'PIPE_FORMAT_A8R8G8B8_UNORM', (PIPE_FORMAT_R32_FIXED:=76): 'PIPE_FORMAT_R32_FIXED', (PIPE_FORMAT_R32G32_FIXED:=77): 'PIPE_FORMAT_R32G32_FIXED', (PIPE_FORMAT_R32G32B32_FIXED:=78): 'PIPE_FORMAT_R32G32B32_FIXED', (PIPE_FORMAT_R32G32B32A32_FIXED:=79): 'PIPE_FORMAT_R32G32B32A32_FIXED', (PIPE_FORMAT_R16_FLOAT:=80): 'PIPE_FORMAT_R16_FLOAT', (PIPE_FORMAT_R16G16_FLOAT:=81): 'PIPE_FORMAT_R16G16_FLOAT', (PIPE_FORMAT_R16G16B16_FLOAT:=82): 'PIPE_FORMAT_R16G16B16_FLOAT', (PIPE_FORMAT_R16G16B16A16_FLOAT:=83): 'PIPE_FORMAT_R16G16B16A16_FLOAT', (PIPE_FORMAT_R8_UINT:=84): 'PIPE_FORMAT_R8_UINT', (PIPE_FORMAT_R8G8_UINT:=85): 'PIPE_FORMAT_R8G8_UINT', (PIPE_FORMAT_R8G8B8_UINT:=86): 'PIPE_FORMAT_R8G8B8_UINT', (PIPE_FORMAT_B8G8R8_UINT:=87): 'PIPE_FORMAT_B8G8R8_UINT', (PIPE_FORMAT_R8G8B8A8_UINT:=88): 'PIPE_FORMAT_R8G8B8A8_UINT', (PIPE_FORMAT_B8G8R8A8_UINT:=89): 'PIPE_FORMAT_B8G8R8A8_UINT', (PIPE_FORMAT_R8_SINT:=90): 'PIPE_FORMAT_R8_SINT', (PIPE_FORMAT_R8G8_SINT:=91): 'PIPE_FORMAT_R8G8_SINT', (PIPE_FORMAT_R8G8B8_SINT:=92): 'PIPE_FORMAT_R8G8B8_SINT', (PIPE_FORMAT_B8G8R8_SINT:=93): 'PIPE_FORMAT_B8G8R8_SINT', (PIPE_FORMAT_R8G8B8A8_SINT:=94): 'PIPE_FORMAT_R8G8B8A8_SINT', (PIPE_FORMAT_B8G8R8A8_SINT:=95): 'PIPE_FORMAT_B8G8R8A8_SINT', (PIPE_FORMAT_R16_UINT:=96): 'PIPE_FORMAT_R16_UINT', (PIPE_FORMAT_R16G16_UINT:=97): 'PIPE_FORMAT_R16G16_UINT', (PIPE_FORMAT_R16G16B16_UINT:=98): 'PIPE_FORMAT_R16G16B16_UINT', (PIPE_FORMAT_R16G16B16A16_UINT:=99): 'PIPE_FORMAT_R16G16B16A16_UINT', (PIPE_FORMAT_R16_SINT:=100): 'PIPE_FORMAT_R16_SINT', (PIPE_FORMAT_R16G16_SINT:=101): 'PIPE_FORMAT_R16G16_SINT', (PIPE_FORMAT_R16G16B16_SINT:=102): 'PIPE_FORMAT_R16G16B16_SINT', (PIPE_FORMAT_R16G16B16A16_SINT:=103): 'PIPE_FORMAT_R16G16B16A16_SINT', (PIPE_FORMAT_R32_UINT:=104): 'PIPE_FORMAT_R32_UINT', (PIPE_FORMAT_R32G32_UINT:=105): 'PIPE_FORMAT_R32G32_UINT', (PIPE_FORMAT_R32G32B32_UINT:=106): 'PIPE_FORMAT_R32G32B32_UINT', (PIPE_FORMAT_R32G32B32A32_UINT:=107): 'PIPE_FORMAT_R32G32B32A32_UINT', (PIPE_FORMAT_R32_SINT:=108): 'PIPE_FORMAT_R32_SINT', (PIPE_FORMAT_R32G32_SINT:=109): 'PIPE_FORMAT_R32G32_SINT', (PIPE_FORMAT_R32G32B32_SINT:=110): 'PIPE_FORMAT_R32G32B32_SINT', (PIPE_FORMAT_R32G32B32A32_SINT:=111): 'PIPE_FORMAT_R32G32B32A32_SINT', (PIPE_FORMAT_R10G10B10A2_UNORM:=112): 'PIPE_FORMAT_R10G10B10A2_UNORM', (PIPE_FORMAT_R10G10B10A2_SNORM:=113): 'PIPE_FORMAT_R10G10B10A2_SNORM', (PIPE_FORMAT_R10G10B10A2_USCALED:=114): 'PIPE_FORMAT_R10G10B10A2_USCALED', (PIPE_FORMAT_R10G10B10A2_SSCALED:=115): 'PIPE_FORMAT_R10G10B10A2_SSCALED', (PIPE_FORMAT_B10G10R10A2_UNORM:=116): 'PIPE_FORMAT_B10G10R10A2_UNORM', (PIPE_FORMAT_B10G10R10A2_SNORM:=117): 'PIPE_FORMAT_B10G10R10A2_SNORM', (PIPE_FORMAT_B10G10R10A2_USCALED:=118): 'PIPE_FORMAT_B10G10R10A2_USCALED', (PIPE_FORMAT_B10G10R10A2_SSCALED:=119): 'PIPE_FORMAT_B10G10R10A2_SSCALED', (PIPE_FORMAT_R11G11B10_FLOAT:=120): 'PIPE_FORMAT_R11G11B10_FLOAT', (PIPE_FORMAT_R10G10B10A2_UINT:=121): 'PIPE_FORMAT_R10G10B10A2_UINT', (PIPE_FORMAT_R10G10B10A2_SINT:=122): 'PIPE_FORMAT_R10G10B10A2_SINT', (PIPE_FORMAT_B10G10R10A2_UINT:=123): 'PIPE_FORMAT_B10G10R10A2_UINT', (PIPE_FORMAT_B10G10R10A2_SINT:=124): 'PIPE_FORMAT_B10G10R10A2_SINT', (PIPE_FORMAT_B8G8R8X8_UNORM:=125): 'PIPE_FORMAT_B8G8R8X8_UNORM', (PIPE_FORMAT_X8B8G8R8_UNORM:=126): 'PIPE_FORMAT_X8B8G8R8_UNORM', (PIPE_FORMAT_X8R8G8B8_UNORM:=127): 'PIPE_FORMAT_X8R8G8B8_UNORM', (PIPE_FORMAT_B5G5R5A1_UNORM:=128): 'PIPE_FORMAT_B5G5R5A1_UNORM', (PIPE_FORMAT_R4G4B4A4_UNORM:=129): 'PIPE_FORMAT_R4G4B4A4_UNORM', (PIPE_FORMAT_B4G4R4A4_UNORM:=130): 'PIPE_FORMAT_B4G4R4A4_UNORM', (PIPE_FORMAT_R5G6B5_UNORM:=131): 'PIPE_FORMAT_R5G6B5_UNORM', (PIPE_FORMAT_B5G6R5_UNORM:=132): 'PIPE_FORMAT_B5G6R5_UNORM', (PIPE_FORMAT_L8_UNORM:=133): 'PIPE_FORMAT_L8_UNORM', (PIPE_FORMAT_A8_UNORM:=134): 'PIPE_FORMAT_A8_UNORM', (PIPE_FORMAT_I8_UNORM:=135): 'PIPE_FORMAT_I8_UNORM', (PIPE_FORMAT_L8A8_UNORM:=136): 'PIPE_FORMAT_L8A8_UNORM', (PIPE_FORMAT_L16_UNORM:=137): 'PIPE_FORMAT_L16_UNORM', (PIPE_FORMAT_UYVY:=138): 'PIPE_FORMAT_UYVY', (PIPE_FORMAT_VYUY:=139): 'PIPE_FORMAT_VYUY', (PIPE_FORMAT_YUYV:=140): 'PIPE_FORMAT_YUYV', (PIPE_FORMAT_YVYU:=141): 'PIPE_FORMAT_YVYU', (PIPE_FORMAT_Z16_UNORM:=142): 'PIPE_FORMAT_Z16_UNORM', (PIPE_FORMAT_Z16_UNORM_S8_UINT:=143): 'PIPE_FORMAT_Z16_UNORM_S8_UINT', (PIPE_FORMAT_Z32_UNORM:=144): 'PIPE_FORMAT_Z32_UNORM', (PIPE_FORMAT_Z32_FLOAT:=145): 'PIPE_FORMAT_Z32_FLOAT', (PIPE_FORMAT_Z24_UNORM_S8_UINT:=146): 'PIPE_FORMAT_Z24_UNORM_S8_UINT', (PIPE_FORMAT_S8_UINT_Z24_UNORM:=147): 'PIPE_FORMAT_S8_UINT_Z24_UNORM', (PIPE_FORMAT_Z24X8_UNORM:=148): 'PIPE_FORMAT_Z24X8_UNORM', (PIPE_FORMAT_X8Z24_UNORM:=149): 'PIPE_FORMAT_X8Z24_UNORM', (PIPE_FORMAT_S8_UINT:=150): 'PIPE_FORMAT_S8_UINT', (PIPE_FORMAT_L8_SRGB:=151): 'PIPE_FORMAT_L8_SRGB', (PIPE_FORMAT_R8_SRGB:=152): 'PIPE_FORMAT_R8_SRGB', (PIPE_FORMAT_L8A8_SRGB:=153): 'PIPE_FORMAT_L8A8_SRGB', (PIPE_FORMAT_R8G8_SRGB:=154): 'PIPE_FORMAT_R8G8_SRGB', (PIPE_FORMAT_R8G8B8_SRGB:=155): 'PIPE_FORMAT_R8G8B8_SRGB', (PIPE_FORMAT_B8G8R8_SRGB:=156): 'PIPE_FORMAT_B8G8R8_SRGB', (PIPE_FORMAT_A8B8G8R8_SRGB:=157): 'PIPE_FORMAT_A8B8G8R8_SRGB', (PIPE_FORMAT_X8B8G8R8_SRGB:=158): 'PIPE_FORMAT_X8B8G8R8_SRGB', (PIPE_FORMAT_B8G8R8A8_SRGB:=159): 'PIPE_FORMAT_B8G8R8A8_SRGB', (PIPE_FORMAT_B8G8R8X8_SRGB:=160): 'PIPE_FORMAT_B8G8R8X8_SRGB', (PIPE_FORMAT_A8R8G8B8_SRGB:=161): 'PIPE_FORMAT_A8R8G8B8_SRGB', (PIPE_FORMAT_X8R8G8B8_SRGB:=162): 'PIPE_FORMAT_X8R8G8B8_SRGB', (PIPE_FORMAT_R8G8B8A8_SRGB:=163): 'PIPE_FORMAT_R8G8B8A8_SRGB', (PIPE_FORMAT_DXT1_RGB:=164): 'PIPE_FORMAT_DXT1_RGB', (PIPE_FORMAT_DXT1_RGBA:=165): 'PIPE_FORMAT_DXT1_RGBA', (PIPE_FORMAT_DXT3_RGBA:=166): 'PIPE_FORMAT_DXT3_RGBA', (PIPE_FORMAT_DXT5_RGBA:=167): 'PIPE_FORMAT_DXT5_RGBA', (PIPE_FORMAT_DXT1_SRGB:=168): 'PIPE_FORMAT_DXT1_SRGB', (PIPE_FORMAT_DXT1_SRGBA:=169): 'PIPE_FORMAT_DXT1_SRGBA', (PIPE_FORMAT_DXT3_SRGBA:=170): 'PIPE_FORMAT_DXT3_SRGBA', (PIPE_FORMAT_DXT5_SRGBA:=171): 'PIPE_FORMAT_DXT5_SRGBA', (PIPE_FORMAT_RGTC1_UNORM:=172): 'PIPE_FORMAT_RGTC1_UNORM', (PIPE_FORMAT_RGTC1_SNORM:=173): 'PIPE_FORMAT_RGTC1_SNORM', (PIPE_FORMAT_RGTC2_UNORM:=174): 'PIPE_FORMAT_RGTC2_UNORM', (PIPE_FORMAT_RGTC2_SNORM:=175): 'PIPE_FORMAT_RGTC2_SNORM', (PIPE_FORMAT_R8G8_B8G8_UNORM:=176): 'PIPE_FORMAT_R8G8_B8G8_UNORM', (PIPE_FORMAT_G8R8_G8B8_UNORM:=177): 'PIPE_FORMAT_G8R8_G8B8_UNORM', (PIPE_FORMAT_X6G10_X6B10X6R10_420_UNORM:=178): 'PIPE_FORMAT_X6G10_X6B10X6R10_420_UNORM', (PIPE_FORMAT_X4G12_X4B12X4R12_420_UNORM:=179): 'PIPE_FORMAT_X4G12_X4B12X4R12_420_UNORM', (PIPE_FORMAT_X6R10_UNORM:=180): 'PIPE_FORMAT_X6R10_UNORM', (PIPE_FORMAT_X6R10X6G10_UNORM:=181): 'PIPE_FORMAT_X6R10X6G10_UNORM', (PIPE_FORMAT_X4R12_UNORM:=182): 'PIPE_FORMAT_X4R12_UNORM', (PIPE_FORMAT_X4R12X4G12_UNORM:=183): 'PIPE_FORMAT_X4R12X4G12_UNORM', (PIPE_FORMAT_R8SG8SB8UX8U_NORM:=184): 'PIPE_FORMAT_R8SG8SB8UX8U_NORM', (PIPE_FORMAT_R5SG5SB6U_NORM:=185): 'PIPE_FORMAT_R5SG5SB6U_NORM', (PIPE_FORMAT_A8B8G8R8_UNORM:=186): 'PIPE_FORMAT_A8B8G8R8_UNORM', (PIPE_FORMAT_B5G5R5X1_UNORM:=187): 'PIPE_FORMAT_B5G5R5X1_UNORM', (PIPE_FORMAT_R9G9B9E5_FLOAT:=188): 'PIPE_FORMAT_R9G9B9E5_FLOAT', (PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:=189): 'PIPE_FORMAT_Z32_FLOAT_S8X24_UINT', (PIPE_FORMAT_R1_UNORM:=190): 'PIPE_FORMAT_R1_UNORM', (PIPE_FORMAT_R10G10B10X2_USCALED:=191): 'PIPE_FORMAT_R10G10B10X2_USCALED', (PIPE_FORMAT_R10G10B10X2_SNORM:=192): 'PIPE_FORMAT_R10G10B10X2_SNORM', (PIPE_FORMAT_L4A4_UNORM:=193): 'PIPE_FORMAT_L4A4_UNORM', (PIPE_FORMAT_A2R10G10B10_UNORM:=194): 'PIPE_FORMAT_A2R10G10B10_UNORM', (PIPE_FORMAT_A2B10G10R10_UNORM:=195): 'PIPE_FORMAT_A2B10G10R10_UNORM', (PIPE_FORMAT_R10SG10SB10SA2U_NORM:=196): 'PIPE_FORMAT_R10SG10SB10SA2U_NORM', (PIPE_FORMAT_R8G8Bx_SNORM:=197): 'PIPE_FORMAT_R8G8Bx_SNORM', (PIPE_FORMAT_R8G8B8X8_UNORM:=198): 'PIPE_FORMAT_R8G8B8X8_UNORM', (PIPE_FORMAT_B4G4R4X4_UNORM:=199): 'PIPE_FORMAT_B4G4R4X4_UNORM', (PIPE_FORMAT_X24S8_UINT:=200): 'PIPE_FORMAT_X24S8_UINT', (PIPE_FORMAT_S8X24_UINT:=201): 'PIPE_FORMAT_S8X24_UINT', (PIPE_FORMAT_X32_S8X24_UINT:=202): 'PIPE_FORMAT_X32_S8X24_UINT', (PIPE_FORMAT_R3G3B2_UNORM:=203): 'PIPE_FORMAT_R3G3B2_UNORM', (PIPE_FORMAT_B2G3R3_UNORM:=204): 'PIPE_FORMAT_B2G3R3_UNORM', (PIPE_FORMAT_L16A16_UNORM:=205): 'PIPE_FORMAT_L16A16_UNORM', (PIPE_FORMAT_A16_UNORM:=206): 'PIPE_FORMAT_A16_UNORM', (PIPE_FORMAT_I16_UNORM:=207): 'PIPE_FORMAT_I16_UNORM', (PIPE_FORMAT_LATC1_UNORM:=208): 'PIPE_FORMAT_LATC1_UNORM', (PIPE_FORMAT_LATC1_SNORM:=209): 'PIPE_FORMAT_LATC1_SNORM', (PIPE_FORMAT_LATC2_UNORM:=210): 'PIPE_FORMAT_LATC2_UNORM', (PIPE_FORMAT_LATC2_SNORM:=211): 'PIPE_FORMAT_LATC2_SNORM', (PIPE_FORMAT_A8_SNORM:=212): 'PIPE_FORMAT_A8_SNORM', (PIPE_FORMAT_L8_SNORM:=213): 'PIPE_FORMAT_L8_SNORM', (PIPE_FORMAT_L8A8_SNORM:=214): 'PIPE_FORMAT_L8A8_SNORM', (PIPE_FORMAT_I8_SNORM:=215): 'PIPE_FORMAT_I8_SNORM', (PIPE_FORMAT_A16_SNORM:=216): 'PIPE_FORMAT_A16_SNORM', (PIPE_FORMAT_L16_SNORM:=217): 'PIPE_FORMAT_L16_SNORM', (PIPE_FORMAT_L16A16_SNORM:=218): 'PIPE_FORMAT_L16A16_SNORM', (PIPE_FORMAT_I16_SNORM:=219): 'PIPE_FORMAT_I16_SNORM', (PIPE_FORMAT_A16_FLOAT:=220): 'PIPE_FORMAT_A16_FLOAT', (PIPE_FORMAT_L16_FLOAT:=221): 'PIPE_FORMAT_L16_FLOAT', (PIPE_FORMAT_L16A16_FLOAT:=222): 'PIPE_FORMAT_L16A16_FLOAT', (PIPE_FORMAT_I16_FLOAT:=223): 'PIPE_FORMAT_I16_FLOAT', (PIPE_FORMAT_A32_FLOAT:=224): 'PIPE_FORMAT_A32_FLOAT', (PIPE_FORMAT_L32_FLOAT:=225): 'PIPE_FORMAT_L32_FLOAT', (PIPE_FORMAT_L32A32_FLOAT:=226): 'PIPE_FORMAT_L32A32_FLOAT', (PIPE_FORMAT_I32_FLOAT:=227): 'PIPE_FORMAT_I32_FLOAT', (PIPE_FORMAT_YV12:=228): 'PIPE_FORMAT_YV12', (PIPE_FORMAT_YV16:=229): 'PIPE_FORMAT_YV16', (PIPE_FORMAT_IYUV:=230): 'PIPE_FORMAT_IYUV', (PIPE_FORMAT_NV12:=231): 'PIPE_FORMAT_NV12', (PIPE_FORMAT_NV21:=232): 'PIPE_FORMAT_NV21', (PIPE_FORMAT_NV16:=233): 'PIPE_FORMAT_NV16', (PIPE_FORMAT_NV15:=234): 'PIPE_FORMAT_NV15', (PIPE_FORMAT_NV20:=235): 'PIPE_FORMAT_NV20', (PIPE_FORMAT_Y8_400_UNORM:=236): 'PIPE_FORMAT_Y8_400_UNORM', (PIPE_FORMAT_Y8_U8_V8_422_UNORM:=237): 'PIPE_FORMAT_Y8_U8_V8_422_UNORM', (PIPE_FORMAT_Y8_U8_V8_444_UNORM:=238): 'PIPE_FORMAT_Y8_U8_V8_444_UNORM', (PIPE_FORMAT_Y8_U8_V8_440_UNORM:=239): 'PIPE_FORMAT_Y8_U8_V8_440_UNORM', (PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM:=240): 'PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM', (PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM:=241): 'PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM', (PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM:=242): 'PIPE_FORMAT_Y10X6_U10X6_V10X6_444_UNORM', (PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM:=243): 'PIPE_FORMAT_Y12X4_U12X4_V12X4_420_UNORM', (PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM:=244): 'PIPE_FORMAT_Y12X4_U12X4_V12X4_422_UNORM', (PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM:=245): 'PIPE_FORMAT_Y12X4_U12X4_V12X4_444_UNORM', (PIPE_FORMAT_Y16_U16_V16_420_UNORM:=246): 'PIPE_FORMAT_Y16_U16_V16_420_UNORM', (PIPE_FORMAT_Y16_U16_V16_422_UNORM:=247): 'PIPE_FORMAT_Y16_U16_V16_422_UNORM', (PIPE_FORMAT_Y16_U16V16_422_UNORM:=248): 'PIPE_FORMAT_Y16_U16V16_422_UNORM', (PIPE_FORMAT_Y16_U16_V16_444_UNORM:=249): 'PIPE_FORMAT_Y16_U16_V16_444_UNORM', (PIPE_FORMAT_Y8U8V8_420_UNORM_PACKED:=250): 'PIPE_FORMAT_Y8U8V8_420_UNORM_PACKED', (PIPE_FORMAT_Y10U10V10_420_UNORM_PACKED:=251): 'PIPE_FORMAT_Y10U10V10_420_UNORM_PACKED', (PIPE_FORMAT_A4R4_UNORM:=252): 'PIPE_FORMAT_A4R4_UNORM', (PIPE_FORMAT_R4A4_UNORM:=253): 'PIPE_FORMAT_R4A4_UNORM', (PIPE_FORMAT_R8A8_UNORM:=254): 'PIPE_FORMAT_R8A8_UNORM', (PIPE_FORMAT_A8R8_UNORM:=255): 'PIPE_FORMAT_A8R8_UNORM', (PIPE_FORMAT_A8_UINT:=256): 'PIPE_FORMAT_A8_UINT', (PIPE_FORMAT_I8_UINT:=257): 'PIPE_FORMAT_I8_UINT', (PIPE_FORMAT_L8_UINT:=258): 'PIPE_FORMAT_L8_UINT', (PIPE_FORMAT_L8A8_UINT:=259): 'PIPE_FORMAT_L8A8_UINT', (PIPE_FORMAT_A8_SINT:=260): 'PIPE_FORMAT_A8_SINT', (PIPE_FORMAT_I8_SINT:=261): 'PIPE_FORMAT_I8_SINT', (PIPE_FORMAT_L8_SINT:=262): 'PIPE_FORMAT_L8_SINT', (PIPE_FORMAT_L8A8_SINT:=263): 'PIPE_FORMAT_L8A8_SINT', (PIPE_FORMAT_A16_UINT:=264): 'PIPE_FORMAT_A16_UINT', (PIPE_FORMAT_I16_UINT:=265): 'PIPE_FORMAT_I16_UINT', (PIPE_FORMAT_L16_UINT:=266): 'PIPE_FORMAT_L16_UINT', (PIPE_FORMAT_L16A16_UINT:=267): 'PIPE_FORMAT_L16A16_UINT', (PIPE_FORMAT_A16_SINT:=268): 'PIPE_FORMAT_A16_SINT', (PIPE_FORMAT_I16_SINT:=269): 'PIPE_FORMAT_I16_SINT', (PIPE_FORMAT_L16_SINT:=270): 'PIPE_FORMAT_L16_SINT', (PIPE_FORMAT_L16A16_SINT:=271): 'PIPE_FORMAT_L16A16_SINT', (PIPE_FORMAT_A32_UINT:=272): 'PIPE_FORMAT_A32_UINT', (PIPE_FORMAT_I32_UINT:=273): 'PIPE_FORMAT_I32_UINT', (PIPE_FORMAT_L32_UINT:=274): 'PIPE_FORMAT_L32_UINT', (PIPE_FORMAT_L32A32_UINT:=275): 'PIPE_FORMAT_L32A32_UINT', (PIPE_FORMAT_A32_SINT:=276): 'PIPE_FORMAT_A32_SINT', (PIPE_FORMAT_I32_SINT:=277): 'PIPE_FORMAT_I32_SINT', (PIPE_FORMAT_L32_SINT:=278): 'PIPE_FORMAT_L32_SINT', (PIPE_FORMAT_L32A32_SINT:=279): 'PIPE_FORMAT_L32A32_SINT', (PIPE_FORMAT_A8R8G8B8_UINT:=280): 'PIPE_FORMAT_A8R8G8B8_UINT', (PIPE_FORMAT_A8B8G8R8_UINT:=281): 'PIPE_FORMAT_A8B8G8R8_UINT', (PIPE_FORMAT_A2R10G10B10_UINT:=282): 'PIPE_FORMAT_A2R10G10B10_UINT', (PIPE_FORMAT_A2B10G10R10_UINT:=283): 'PIPE_FORMAT_A2B10G10R10_UINT', (PIPE_FORMAT_R5G6B5_UINT:=284): 'PIPE_FORMAT_R5G6B5_UINT', (PIPE_FORMAT_B5G6R5_UINT:=285): 'PIPE_FORMAT_B5G6R5_UINT', (PIPE_FORMAT_R5G5B5A1_UINT:=286): 'PIPE_FORMAT_R5G5B5A1_UINT', (PIPE_FORMAT_B5G5R5A1_UINT:=287): 'PIPE_FORMAT_B5G5R5A1_UINT', (PIPE_FORMAT_A1R5G5B5_UINT:=288): 'PIPE_FORMAT_A1R5G5B5_UINT', (PIPE_FORMAT_A1B5G5R5_UINT:=289): 'PIPE_FORMAT_A1B5G5R5_UINT', (PIPE_FORMAT_R4G4B4A4_UINT:=290): 'PIPE_FORMAT_R4G4B4A4_UINT', (PIPE_FORMAT_B4G4R4A4_UINT:=291): 'PIPE_FORMAT_B4G4R4A4_UINT', (PIPE_FORMAT_A4R4G4B4_UINT:=292): 'PIPE_FORMAT_A4R4G4B4_UINT', (PIPE_FORMAT_A4B4G4R4_UINT:=293): 'PIPE_FORMAT_A4B4G4R4_UINT', (PIPE_FORMAT_R3G3B2_UINT:=294): 'PIPE_FORMAT_R3G3B2_UINT', (PIPE_FORMAT_B2G3R3_UINT:=295): 'PIPE_FORMAT_B2G3R3_UINT', (PIPE_FORMAT_ETC1_RGB8:=296): 'PIPE_FORMAT_ETC1_RGB8', (PIPE_FORMAT_R8G8_R8B8_UNORM:=297): 'PIPE_FORMAT_R8G8_R8B8_UNORM', (PIPE_FORMAT_R8B8_R8G8_UNORM:=298): 'PIPE_FORMAT_R8B8_R8G8_UNORM', (PIPE_FORMAT_G8R8_B8R8_UNORM:=299): 'PIPE_FORMAT_G8R8_B8R8_UNORM', (PIPE_FORMAT_B8R8_G8R8_UNORM:=300): 'PIPE_FORMAT_B8R8_G8R8_UNORM', (PIPE_FORMAT_G8B8_G8R8_UNORM:=301): 'PIPE_FORMAT_G8B8_G8R8_UNORM', (PIPE_FORMAT_B8G8_R8G8_UNORM:=302): 'PIPE_FORMAT_B8G8_R8G8_UNORM', (PIPE_FORMAT_R8G8B8X8_SNORM:=303): 'PIPE_FORMAT_R8G8B8X8_SNORM', (PIPE_FORMAT_R8G8B8X8_SRGB:=304): 'PIPE_FORMAT_R8G8B8X8_SRGB', (PIPE_FORMAT_R8G8B8X8_UINT:=305): 'PIPE_FORMAT_R8G8B8X8_UINT', (PIPE_FORMAT_R8G8B8X8_SINT:=306): 'PIPE_FORMAT_R8G8B8X8_SINT', (PIPE_FORMAT_B10G10R10X2_UNORM:=307): 'PIPE_FORMAT_B10G10R10X2_UNORM', (PIPE_FORMAT_R16G16B16X16_UNORM:=308): 'PIPE_FORMAT_R16G16B16X16_UNORM', (PIPE_FORMAT_R16G16B16X16_SNORM:=309): 'PIPE_FORMAT_R16G16B16X16_SNORM', (PIPE_FORMAT_R16G16B16X16_FLOAT:=310): 'PIPE_FORMAT_R16G16B16X16_FLOAT', (PIPE_FORMAT_R16G16B16X16_UINT:=311): 'PIPE_FORMAT_R16G16B16X16_UINT', (PIPE_FORMAT_R16G16B16X16_SINT:=312): 'PIPE_FORMAT_R16G16B16X16_SINT', (PIPE_FORMAT_R32G32B32X32_FLOAT:=313): 'PIPE_FORMAT_R32G32B32X32_FLOAT', (PIPE_FORMAT_R32G32B32X32_UINT:=314): 'PIPE_FORMAT_R32G32B32X32_UINT', (PIPE_FORMAT_R32G32B32X32_SINT:=315): 'PIPE_FORMAT_R32G32B32X32_SINT', (PIPE_FORMAT_R8A8_SNORM:=316): 'PIPE_FORMAT_R8A8_SNORM', (PIPE_FORMAT_R16A16_UNORM:=317): 'PIPE_FORMAT_R16A16_UNORM', (PIPE_FORMAT_R16A16_SNORM:=318): 'PIPE_FORMAT_R16A16_SNORM', (PIPE_FORMAT_R16A16_FLOAT:=319): 'PIPE_FORMAT_R16A16_FLOAT', (PIPE_FORMAT_R32A32_FLOAT:=320): 'PIPE_FORMAT_R32A32_FLOAT', (PIPE_FORMAT_R8A8_UINT:=321): 'PIPE_FORMAT_R8A8_UINT', (PIPE_FORMAT_R8A8_SINT:=322): 'PIPE_FORMAT_R8A8_SINT', (PIPE_FORMAT_R16A16_UINT:=323): 'PIPE_FORMAT_R16A16_UINT', (PIPE_FORMAT_R16A16_SINT:=324): 'PIPE_FORMAT_R16A16_SINT', (PIPE_FORMAT_R32A32_UINT:=325): 'PIPE_FORMAT_R32A32_UINT', (PIPE_FORMAT_R32A32_SINT:=326): 'PIPE_FORMAT_R32A32_SINT', (PIPE_FORMAT_B5G6R5_SRGB:=327): 'PIPE_FORMAT_B5G6R5_SRGB', (PIPE_FORMAT_BPTC_RGBA_UNORM:=328): 'PIPE_FORMAT_BPTC_RGBA_UNORM', (PIPE_FORMAT_BPTC_SRGBA:=329): 'PIPE_FORMAT_BPTC_SRGBA', (PIPE_FORMAT_BPTC_RGB_FLOAT:=330): 'PIPE_FORMAT_BPTC_RGB_FLOAT', (PIPE_FORMAT_BPTC_RGB_UFLOAT:=331): 'PIPE_FORMAT_BPTC_RGB_UFLOAT', (PIPE_FORMAT_G8R8_UNORM:=332): 'PIPE_FORMAT_G8R8_UNORM', (PIPE_FORMAT_G8R8_SNORM:=333): 'PIPE_FORMAT_G8R8_SNORM', (PIPE_FORMAT_G16R16_UNORM:=334): 'PIPE_FORMAT_G16R16_UNORM', (PIPE_FORMAT_G16R16_SNORM:=335): 'PIPE_FORMAT_G16R16_SNORM', (PIPE_FORMAT_A8B8G8R8_SNORM:=336): 'PIPE_FORMAT_A8B8G8R8_SNORM', (PIPE_FORMAT_X8B8G8R8_SNORM:=337): 'PIPE_FORMAT_X8B8G8R8_SNORM', (PIPE_FORMAT_ETC2_RGB8:=338): 'PIPE_FORMAT_ETC2_RGB8', (PIPE_FORMAT_ETC2_SRGB8:=339): 'PIPE_FORMAT_ETC2_SRGB8', (PIPE_FORMAT_ETC2_RGB8A1:=340): 'PIPE_FORMAT_ETC2_RGB8A1', (PIPE_FORMAT_ETC2_SRGB8A1:=341): 'PIPE_FORMAT_ETC2_SRGB8A1', (PIPE_FORMAT_ETC2_RGBA8:=342): 'PIPE_FORMAT_ETC2_RGBA8', (PIPE_FORMAT_ETC2_SRGBA8:=343): 'PIPE_FORMAT_ETC2_SRGBA8', (PIPE_FORMAT_ETC2_R11_UNORM:=344): 'PIPE_FORMAT_ETC2_R11_UNORM', (PIPE_FORMAT_ETC2_R11_SNORM:=345): 'PIPE_FORMAT_ETC2_R11_SNORM', (PIPE_FORMAT_ETC2_RG11_UNORM:=346): 'PIPE_FORMAT_ETC2_RG11_UNORM', (PIPE_FORMAT_ETC2_RG11_SNORM:=347): 'PIPE_FORMAT_ETC2_RG11_SNORM', (PIPE_FORMAT_ASTC_4x4:=348): 'PIPE_FORMAT_ASTC_4x4', (PIPE_FORMAT_ASTC_5x4:=349): 'PIPE_FORMAT_ASTC_5x4', (PIPE_FORMAT_ASTC_5x5:=350): 'PIPE_FORMAT_ASTC_5x5', (PIPE_FORMAT_ASTC_6x5:=351): 'PIPE_FORMAT_ASTC_6x5', (PIPE_FORMAT_ASTC_6x6:=352): 'PIPE_FORMAT_ASTC_6x6', (PIPE_FORMAT_ASTC_8x5:=353): 'PIPE_FORMAT_ASTC_8x5', (PIPE_FORMAT_ASTC_8x6:=354): 'PIPE_FORMAT_ASTC_8x6', (PIPE_FORMAT_ASTC_8x8:=355): 'PIPE_FORMAT_ASTC_8x8', (PIPE_FORMAT_ASTC_10x5:=356): 'PIPE_FORMAT_ASTC_10x5', (PIPE_FORMAT_ASTC_10x6:=357): 'PIPE_FORMAT_ASTC_10x6', (PIPE_FORMAT_ASTC_10x8:=358): 'PIPE_FORMAT_ASTC_10x8', (PIPE_FORMAT_ASTC_10x10:=359): 'PIPE_FORMAT_ASTC_10x10', (PIPE_FORMAT_ASTC_12x10:=360): 'PIPE_FORMAT_ASTC_12x10', (PIPE_FORMAT_ASTC_12x12:=361): 'PIPE_FORMAT_ASTC_12x12', (PIPE_FORMAT_ASTC_4x4_SRGB:=362): 'PIPE_FORMAT_ASTC_4x4_SRGB', (PIPE_FORMAT_ASTC_5x4_SRGB:=363): 'PIPE_FORMAT_ASTC_5x4_SRGB', (PIPE_FORMAT_ASTC_5x5_SRGB:=364): 'PIPE_FORMAT_ASTC_5x5_SRGB', (PIPE_FORMAT_ASTC_6x5_SRGB:=365): 'PIPE_FORMAT_ASTC_6x5_SRGB', (PIPE_FORMAT_ASTC_6x6_SRGB:=366): 'PIPE_FORMAT_ASTC_6x6_SRGB', (PIPE_FORMAT_ASTC_8x5_SRGB:=367): 'PIPE_FORMAT_ASTC_8x5_SRGB', (PIPE_FORMAT_ASTC_8x6_SRGB:=368): 'PIPE_FORMAT_ASTC_8x6_SRGB', (PIPE_FORMAT_ASTC_8x8_SRGB:=369): 'PIPE_FORMAT_ASTC_8x8_SRGB', (PIPE_FORMAT_ASTC_10x5_SRGB:=370): 'PIPE_FORMAT_ASTC_10x5_SRGB', (PIPE_FORMAT_ASTC_10x6_SRGB:=371): 'PIPE_FORMAT_ASTC_10x6_SRGB', (PIPE_FORMAT_ASTC_10x8_SRGB:=372): 'PIPE_FORMAT_ASTC_10x8_SRGB', (PIPE_FORMAT_ASTC_10x10_SRGB:=373): 'PIPE_FORMAT_ASTC_10x10_SRGB', (PIPE_FORMAT_ASTC_12x10_SRGB:=374): 'PIPE_FORMAT_ASTC_12x10_SRGB', (PIPE_FORMAT_ASTC_12x12_SRGB:=375): 'PIPE_FORMAT_ASTC_12x12_SRGB', (PIPE_FORMAT_ASTC_3x3x3:=376): 'PIPE_FORMAT_ASTC_3x3x3', (PIPE_FORMAT_ASTC_4x3x3:=377): 'PIPE_FORMAT_ASTC_4x3x3', (PIPE_FORMAT_ASTC_4x4x3:=378): 'PIPE_FORMAT_ASTC_4x4x3', (PIPE_FORMAT_ASTC_4x4x4:=379): 'PIPE_FORMAT_ASTC_4x4x4', (PIPE_FORMAT_ASTC_5x4x4:=380): 'PIPE_FORMAT_ASTC_5x4x4', (PIPE_FORMAT_ASTC_5x5x4:=381): 'PIPE_FORMAT_ASTC_5x5x4', (PIPE_FORMAT_ASTC_5x5x5:=382): 'PIPE_FORMAT_ASTC_5x5x5', (PIPE_FORMAT_ASTC_6x5x5:=383): 'PIPE_FORMAT_ASTC_6x5x5', (PIPE_FORMAT_ASTC_6x6x5:=384): 'PIPE_FORMAT_ASTC_6x6x5', (PIPE_FORMAT_ASTC_6x6x6:=385): 'PIPE_FORMAT_ASTC_6x6x6', (PIPE_FORMAT_ASTC_3x3x3_SRGB:=386): 'PIPE_FORMAT_ASTC_3x3x3_SRGB', (PIPE_FORMAT_ASTC_4x3x3_SRGB:=387): 'PIPE_FORMAT_ASTC_4x3x3_SRGB', (PIPE_FORMAT_ASTC_4x4x3_SRGB:=388): 'PIPE_FORMAT_ASTC_4x4x3_SRGB', (PIPE_FORMAT_ASTC_4x4x4_SRGB:=389): 'PIPE_FORMAT_ASTC_4x4x4_SRGB', (PIPE_FORMAT_ASTC_5x4x4_SRGB:=390): 'PIPE_FORMAT_ASTC_5x4x4_SRGB', (PIPE_FORMAT_ASTC_5x5x4_SRGB:=391): 'PIPE_FORMAT_ASTC_5x5x4_SRGB', (PIPE_FORMAT_ASTC_5x5x5_SRGB:=392): 'PIPE_FORMAT_ASTC_5x5x5_SRGB', (PIPE_FORMAT_ASTC_6x5x5_SRGB:=393): 'PIPE_FORMAT_ASTC_6x5x5_SRGB', (PIPE_FORMAT_ASTC_6x6x5_SRGB:=394): 'PIPE_FORMAT_ASTC_6x6x5_SRGB', (PIPE_FORMAT_ASTC_6x6x6_SRGB:=395): 'PIPE_FORMAT_ASTC_6x6x6_SRGB', (PIPE_FORMAT_ASTC_4x4_FLOAT:=396): 'PIPE_FORMAT_ASTC_4x4_FLOAT', (PIPE_FORMAT_ASTC_5x4_FLOAT:=397): 'PIPE_FORMAT_ASTC_5x4_FLOAT', (PIPE_FORMAT_ASTC_5x5_FLOAT:=398): 'PIPE_FORMAT_ASTC_5x5_FLOAT', (PIPE_FORMAT_ASTC_6x5_FLOAT:=399): 'PIPE_FORMAT_ASTC_6x5_FLOAT', (PIPE_FORMAT_ASTC_6x6_FLOAT:=400): 'PIPE_FORMAT_ASTC_6x6_FLOAT', (PIPE_FORMAT_ASTC_8x5_FLOAT:=401): 'PIPE_FORMAT_ASTC_8x5_FLOAT', (PIPE_FORMAT_ASTC_8x6_FLOAT:=402): 'PIPE_FORMAT_ASTC_8x6_FLOAT', (PIPE_FORMAT_ASTC_8x8_FLOAT:=403): 'PIPE_FORMAT_ASTC_8x8_FLOAT', (PIPE_FORMAT_ASTC_10x5_FLOAT:=404): 'PIPE_FORMAT_ASTC_10x5_FLOAT', (PIPE_FORMAT_ASTC_10x6_FLOAT:=405): 'PIPE_FORMAT_ASTC_10x6_FLOAT', (PIPE_FORMAT_ASTC_10x8_FLOAT:=406): 'PIPE_FORMAT_ASTC_10x8_FLOAT', (PIPE_FORMAT_ASTC_10x10_FLOAT:=407): 'PIPE_FORMAT_ASTC_10x10_FLOAT', (PIPE_FORMAT_ASTC_12x10_FLOAT:=408): 'PIPE_FORMAT_ASTC_12x10_FLOAT', (PIPE_FORMAT_ASTC_12x12_FLOAT:=409): 'PIPE_FORMAT_ASTC_12x12_FLOAT', (PIPE_FORMAT_FXT1_RGB:=410): 'PIPE_FORMAT_FXT1_RGB', (PIPE_FORMAT_FXT1_RGBA:=411): 'PIPE_FORMAT_FXT1_RGBA', (PIPE_FORMAT_P010:=412): 'PIPE_FORMAT_P010', (PIPE_FORMAT_P012:=413): 'PIPE_FORMAT_P012', (PIPE_FORMAT_P016:=414): 'PIPE_FORMAT_P016', (PIPE_FORMAT_P030:=415): 'PIPE_FORMAT_P030', (PIPE_FORMAT_Y210:=416): 'PIPE_FORMAT_Y210', (PIPE_FORMAT_Y212:=417): 'PIPE_FORMAT_Y212', (PIPE_FORMAT_Y216:=418): 'PIPE_FORMAT_Y216', (PIPE_FORMAT_Y410:=419): 'PIPE_FORMAT_Y410', (PIPE_FORMAT_Y412:=420): 'PIPE_FORMAT_Y412', (PIPE_FORMAT_Y416:=421): 'PIPE_FORMAT_Y416', (PIPE_FORMAT_R10G10B10X2_UNORM:=422): 'PIPE_FORMAT_R10G10B10X2_UNORM', (PIPE_FORMAT_A1R5G5B5_UNORM:=423): 'PIPE_FORMAT_A1R5G5B5_UNORM', (PIPE_FORMAT_A1B5G5R5_UNORM:=424): 'PIPE_FORMAT_A1B5G5R5_UNORM', (PIPE_FORMAT_X1B5G5R5_UNORM:=425): 'PIPE_FORMAT_X1B5G5R5_UNORM', (PIPE_FORMAT_R5G5B5A1_UNORM:=426): 'PIPE_FORMAT_R5G5B5A1_UNORM', (PIPE_FORMAT_A4R4G4B4_UNORM:=427): 'PIPE_FORMAT_A4R4G4B4_UNORM', (PIPE_FORMAT_A4B4G4R4_UNORM:=428): 'PIPE_FORMAT_A4B4G4R4_UNORM', (PIPE_FORMAT_G8R8_SINT:=429): 'PIPE_FORMAT_G8R8_SINT', (PIPE_FORMAT_A8B8G8R8_SINT:=430): 'PIPE_FORMAT_A8B8G8R8_SINT', (PIPE_FORMAT_X8B8G8R8_SINT:=431): 'PIPE_FORMAT_X8B8G8R8_SINT', (PIPE_FORMAT_ATC_RGB:=432): 'PIPE_FORMAT_ATC_RGB', (PIPE_FORMAT_ATC_RGBA_EXPLICIT:=433): 'PIPE_FORMAT_ATC_RGBA_EXPLICIT', (PIPE_FORMAT_ATC_RGBA_INTERPOLATED:=434): 'PIPE_FORMAT_ATC_RGBA_INTERPOLATED', (PIPE_FORMAT_Z24_UNORM_S8_UINT_AS_R8G8B8A8:=435): 'PIPE_FORMAT_Z24_UNORM_S8_UINT_AS_R8G8B8A8', (PIPE_FORMAT_AYUV:=436): 'PIPE_FORMAT_AYUV', (PIPE_FORMAT_XYUV:=437): 'PIPE_FORMAT_XYUV', (PIPE_FORMAT_R8G8B8_420_UNORM_PACKED:=438): 'PIPE_FORMAT_R8G8B8_420_UNORM_PACKED', (PIPE_FORMAT_R8_G8B8_420_UNORM:=439): 'PIPE_FORMAT_R8_G8B8_420_UNORM', (PIPE_FORMAT_R8_B8G8_420_UNORM:=440): 'PIPE_FORMAT_R8_B8G8_420_UNORM', (PIPE_FORMAT_G8_B8R8_420_UNORM:=441): 'PIPE_FORMAT_G8_B8R8_420_UNORM', (PIPE_FORMAT_R10G10B10_420_UNORM_PACKED:=442): 'PIPE_FORMAT_R10G10B10_420_UNORM_PACKED', (PIPE_FORMAT_R10_G10B10_420_UNORM:=443): 'PIPE_FORMAT_R10_G10B10_420_UNORM', (PIPE_FORMAT_R10_G10B10_422_UNORM:=444): 'PIPE_FORMAT_R10_G10B10_422_UNORM', (PIPE_FORMAT_R8_G8_B8_420_UNORM:=445): 'PIPE_FORMAT_R8_G8_B8_420_UNORM', (PIPE_FORMAT_R8_B8_G8_420_UNORM:=446): 'PIPE_FORMAT_R8_B8_G8_420_UNORM', (PIPE_FORMAT_G8_B8_R8_420_UNORM:=447): 'PIPE_FORMAT_G8_B8_R8_420_UNORM', (PIPE_FORMAT_R8_G8B8_422_UNORM:=448): 'PIPE_FORMAT_R8_G8B8_422_UNORM', (PIPE_FORMAT_R8_B8G8_422_UNORM:=449): 'PIPE_FORMAT_R8_B8G8_422_UNORM', (PIPE_FORMAT_G8_B8R8_422_UNORM:=450): 'PIPE_FORMAT_G8_B8R8_422_UNORM', (PIPE_FORMAT_R8_G8_B8_UNORM:=451): 'PIPE_FORMAT_R8_G8_B8_UNORM', (PIPE_FORMAT_Y8_UNORM:=452): 'PIPE_FORMAT_Y8_UNORM', (PIPE_FORMAT_B8G8R8X8_SNORM:=453): 'PIPE_FORMAT_B8G8R8X8_SNORM', (PIPE_FORMAT_B8G8R8X8_UINT:=454): 'PIPE_FORMAT_B8G8R8X8_UINT', (PIPE_FORMAT_B8G8R8X8_SINT:=455): 'PIPE_FORMAT_B8G8R8X8_SINT', (PIPE_FORMAT_A8R8G8B8_SNORM:=456): 'PIPE_FORMAT_A8R8G8B8_SNORM', (PIPE_FORMAT_A8R8G8B8_SINT:=457): 'PIPE_FORMAT_A8R8G8B8_SINT', (PIPE_FORMAT_X8R8G8B8_SNORM:=458): 'PIPE_FORMAT_X8R8G8B8_SNORM', (PIPE_FORMAT_X8R8G8B8_SINT:=459): 'PIPE_FORMAT_X8R8G8B8_SINT', (PIPE_FORMAT_R5G5B5X1_UNORM:=460): 'PIPE_FORMAT_R5G5B5X1_UNORM', (PIPE_FORMAT_X1R5G5B5_UNORM:=461): 'PIPE_FORMAT_X1R5G5B5_UNORM', (PIPE_FORMAT_R4G4B4X4_UNORM:=462): 'PIPE_FORMAT_R4G4B4X4_UNORM', (PIPE_FORMAT_B10G10R10X2_SNORM:=463): 'PIPE_FORMAT_B10G10R10X2_SNORM', (PIPE_FORMAT_R5G6B5_SRGB:=464): 'PIPE_FORMAT_R5G6B5_SRGB', (PIPE_FORMAT_R10G10B10X2_SINT:=465): 'PIPE_FORMAT_R10G10B10X2_SINT', (PIPE_FORMAT_B10G10R10X2_SINT:=466): 'PIPE_FORMAT_B10G10R10X2_SINT', (PIPE_FORMAT_G16R16_SINT:=467): 'PIPE_FORMAT_G16R16_SINT', (PIPE_FORMAT_COUNT:=468): 'PIPE_FORMAT_COUNT'} +struct_nir_variable_data_image.register_fields([('format', ctypes.c_uint32, 0)]) +@c.record +class struct_nir_variable_data_sampler(c.Struct): + SIZE = 4 + is_inline_sampler: int + addressing_mode: int + normalized_coordinates: int + filter_mode: int +struct_nir_variable_data_sampler.register_fields([('is_inline_sampler', ctypes.c_uint32, 0, 1, 0), ('addressing_mode', ctypes.c_uint32, 0, 3, 1), ('normalized_coordinates', ctypes.c_uint32, 0, 1, 4), ('filter_mode', ctypes.c_uint32, 0, 1, 5)]) +@c.record +class struct_nir_variable_data_xfb(c.Struct): + SIZE = 4 + buffer: int + stride: int +struct_nir_variable_data_xfb.register_fields([('buffer', uint16_t, 0, 2, 0), ('stride', uint16_t, 2)]) +struct_nir_variable_data.register_fields([('mode', ctypes.c_uint32, 0, 21, 0), ('read_only', ctypes.c_uint32, 2, 1, 5), ('centroid', ctypes.c_uint32, 2, 1, 6), ('sample', ctypes.c_uint32, 2, 1, 7), ('patch', ctypes.c_uint32, 3, 1, 0), ('invariant', ctypes.c_uint32, 3, 1, 1), ('explicit_invariant', ctypes.c_uint32, 3, 1, 2), ('ray_query', ctypes.c_uint32, 3, 1, 3), ('precision', ctypes.c_uint32, 3, 2, 4), ('assigned', ctypes.c_uint32, 3, 1, 6), ('cannot_coalesce', ctypes.c_uint32, 3, 1, 7), ('always_active_io', ctypes.c_uint32, 4, 1, 0), ('interpolation', ctypes.c_uint32, 4, 3, 1), ('location_frac', ctypes.c_uint32, 4, 2, 4), ('compact', ctypes.c_uint32, 4, 1, 6), ('fb_fetch_output', ctypes.c_uint32, 4, 1, 7), ('bindless', ctypes.c_uint32, 5, 1, 0), ('explicit_binding', ctypes.c_uint32, 5, 1, 1), ('explicit_location', ctypes.c_uint32, 5, 1, 2), ('implicit_sized_array', ctypes.c_uint32, 5, 1, 3), ('max_array_access', ctypes.c_int32, 8), ('has_initializer', ctypes.c_uint32, 12, 1, 0), ('is_implicit_initializer', ctypes.c_uint32, 12, 1, 1), ('is_xfb', ctypes.c_uint32, 12, 1, 2), ('is_xfb_only', ctypes.c_uint32, 12, 1, 3), ('explicit_xfb_buffer', ctypes.c_uint32, 12, 1, 4), ('explicit_xfb_stride', ctypes.c_uint32, 12, 1, 5), ('explicit_offset', ctypes.c_uint32, 12, 1, 6), ('matrix_layout', ctypes.c_uint32, 12, 2, 7), ('from_named_ifc_block', ctypes.c_uint32, 13, 1, 1), ('from_ssbo_unsized_array', ctypes.c_uint32, 13, 1, 2), ('must_be_shader_input', ctypes.c_uint32, 13, 1, 3), ('used', ctypes.c_uint32, 13, 1, 4), ('how_declared', ctypes.c_uint32, 13, 2, 5), ('per_view', ctypes.c_uint32, 13, 1, 7), ('per_primitive', ctypes.c_uint32, 14, 1, 0), ('per_vertex', ctypes.c_uint32, 14, 1, 1), ('aliased_shared_memory', ctypes.c_uint32, 14, 1, 2), ('depth_layout', ctypes.c_uint32, 14, 3, 3), ('stream', ctypes.c_uint32, 14, 9, 6), ('access', ctypes.c_uint32, 16, 9, 0), ('descriptor_set', ctypes.c_uint32, 17, 5, 1), ('index', ctypes.c_uint32, 20), ('binding', ctypes.c_uint32, 24), ('location', ctypes.c_int32, 28), ('alignment', ctypes.c_uint32, 32), ('driver_location', ctypes.c_uint32, 36), ('offset', ctypes.c_uint32, 40), ('image', struct_nir_variable_data_image, 44), ('sampler', struct_nir_variable_data_sampler, 44), ('xfb', struct_nir_variable_data_xfb, 44), ('node_name', c.POINTER[ctypes.c_char], 48)]) +nir_variable_data: TypeAlias = struct_nir_variable_data +@c.record +class struct_nir_variable(c.Struct): + SIZE = 152 + node: struct_exec_node + type: c.POINTER[struct_glsl_type] + name: c.POINTER[ctypes.c_char] + data: struct_nir_variable_data + index: int + num_members: int + max_ifc_array_access: c.POINTER[ctypes.c_int32] + num_state_slots: int + state_slots: c.POINTER[struct_nir_state_slot] + constant_initializer: c.POINTER[struct_nir_constant] + pointer_initializer: c.POINTER[struct_nir_variable] + interface_type: c.POINTER[struct_glsl_type] + members: c.POINTER[struct_nir_variable_data] +@c.record +class struct_exec_node(c.Struct): + SIZE = 16 + next: c.POINTER[struct_exec_node] + prev: c.POINTER[struct_exec_node] +struct_exec_node.register_fields([('next', c.POINTER[struct_exec_node], 0), ('prev', c.POINTER[struct_exec_node], 8)]) +@c.record +class struct_glsl_type(c.Struct): + SIZE = 48 + gl_type: int + base_type: int + sampled_type: int + sampler_dimensionality: int + sampler_shadow: int + sampler_array: int + interface_packing: int + interface_row_major: int + cmat_desc: struct_glsl_cmat_description + packed: int + has_builtin_name: int + vector_elements: int + matrix_columns: int + length: int + name_id: int + explicit_stride: int + explicit_alignment: int + fields: struct_glsl_type_fields +enum_glsl_base_type: dict[int, str] = {(GLSL_TYPE_UINT:=0): 'GLSL_TYPE_UINT', (GLSL_TYPE_INT:=1): 'GLSL_TYPE_INT', (GLSL_TYPE_FLOAT:=2): 'GLSL_TYPE_FLOAT', (GLSL_TYPE_FLOAT16:=3): 'GLSL_TYPE_FLOAT16', (GLSL_TYPE_BFLOAT16:=4): 'GLSL_TYPE_BFLOAT16', (GLSL_TYPE_FLOAT_E4M3FN:=5): 'GLSL_TYPE_FLOAT_E4M3FN', (GLSL_TYPE_FLOAT_E5M2:=6): 'GLSL_TYPE_FLOAT_E5M2', (GLSL_TYPE_DOUBLE:=7): 'GLSL_TYPE_DOUBLE', (GLSL_TYPE_UINT8:=8): 'GLSL_TYPE_UINT8', (GLSL_TYPE_INT8:=9): 'GLSL_TYPE_INT8', (GLSL_TYPE_UINT16:=10): 'GLSL_TYPE_UINT16', (GLSL_TYPE_INT16:=11): 'GLSL_TYPE_INT16', (GLSL_TYPE_UINT64:=12): 'GLSL_TYPE_UINT64', (GLSL_TYPE_INT64:=13): 'GLSL_TYPE_INT64', (GLSL_TYPE_BOOL:=14): 'GLSL_TYPE_BOOL', (GLSL_TYPE_COOPERATIVE_MATRIX:=15): 'GLSL_TYPE_COOPERATIVE_MATRIX', (GLSL_TYPE_SAMPLER:=16): 'GLSL_TYPE_SAMPLER', (GLSL_TYPE_TEXTURE:=17): 'GLSL_TYPE_TEXTURE', (GLSL_TYPE_IMAGE:=18): 'GLSL_TYPE_IMAGE', (GLSL_TYPE_ATOMIC_UINT:=19): 'GLSL_TYPE_ATOMIC_UINT', (GLSL_TYPE_STRUCT:=20): 'GLSL_TYPE_STRUCT', (GLSL_TYPE_INTERFACE:=21): 'GLSL_TYPE_INTERFACE', (GLSL_TYPE_ARRAY:=22): 'GLSL_TYPE_ARRAY', (GLSL_TYPE_VOID:=23): 'GLSL_TYPE_VOID', (GLSL_TYPE_SUBROUTINE:=24): 'GLSL_TYPE_SUBROUTINE', (GLSL_TYPE_ERROR:=25): 'GLSL_TYPE_ERROR'} +@c.record +class struct_glsl_cmat_description(c.Struct): + SIZE = 4 + element_type: int + scope: int + rows: int + cols: int + use: int +struct_glsl_cmat_description.register_fields([('element_type', uint8_t, 0, 5, 0), ('scope', uint8_t, 0, 3, 5), ('rows', uint8_t, 1), ('cols', uint8_t, 2), ('use', uint8_t, 3)]) +uintptr_t: TypeAlias = ctypes.c_uint64 +@c.record +class struct_glsl_type_fields(c.Struct): + SIZE = 8 + array: c.POINTER[struct_glsl_type] + structure: c.POINTER[struct_glsl_struct_field] +glsl_type: TypeAlias = struct_glsl_type +@c.record +class struct_glsl_struct_field(c.Struct): + SIZE = 48 + type: c.POINTER[struct_glsl_type] + name: c.POINTER[ctypes.c_char] + location: int + component: int + offset: int + xfb_buffer: int + xfb_stride: int + image_format: int + interpolation: int + centroid: int + sample: int + matrix_layout: int + patch: int + precision: int + memory_read_only: int + memory_write_only: int + memory_coherent: int + memory_volatile: int + memory_restrict: int + explicit_xfb_buffer: int + implicit_sized_array: int + flags: int +glsl_struct_field: TypeAlias = struct_glsl_struct_field +struct_glsl_struct_field.register_fields([('type', c.POINTER[glsl_type], 0), ('name', c.POINTER[ctypes.c_char], 8), ('location', ctypes.c_int32, 16), ('component', ctypes.c_int32, 20), ('offset', ctypes.c_int32, 24), ('xfb_buffer', ctypes.c_int32, 28), ('xfb_stride', ctypes.c_int32, 32), ('image_format', ctypes.c_uint32, 36), ('interpolation', ctypes.c_uint32, 40, 3, 0), ('centroid', ctypes.c_uint32, 40, 1, 3), ('sample', ctypes.c_uint32, 40, 1, 4), ('matrix_layout', ctypes.c_uint32, 40, 2, 5), ('patch', ctypes.c_uint32, 40, 1, 7), ('precision', ctypes.c_uint32, 41, 2, 0), ('memory_read_only', ctypes.c_uint32, 41, 1, 2), ('memory_write_only', ctypes.c_uint32, 41, 1, 3), ('memory_coherent', ctypes.c_uint32, 41, 1, 4), ('memory_volatile', ctypes.c_uint32, 41, 1, 5), ('memory_restrict', ctypes.c_uint32, 41, 1, 6), ('explicit_xfb_buffer', ctypes.c_uint32, 41, 1, 7), ('implicit_sized_array', ctypes.c_uint32, 42, 1, 0), ('flags', ctypes.c_uint32, 40)]) +struct_glsl_type_fields.register_fields([('array', c.POINTER[glsl_type], 0), ('structure', c.POINTER[glsl_struct_field], 0)]) +struct_glsl_type.register_fields([('gl_type', uint32_t, 0), ('base_type', ctypes.c_uint32, 4, 8, 0), ('sampled_type', ctypes.c_uint32, 5, 8, 0), ('sampler_dimensionality', ctypes.c_uint32, 6, 4, 0), ('sampler_shadow', ctypes.c_uint32, 6, 1, 4), ('sampler_array', ctypes.c_uint32, 6, 1, 5), ('interface_packing', ctypes.c_uint32, 6, 2, 6), ('interface_row_major', ctypes.c_uint32, 7, 1, 0), ('cmat_desc', struct_glsl_cmat_description, 8), ('packed', ctypes.c_uint32, 12, 1, 0), ('has_builtin_name', ctypes.c_uint32, 12, 1, 1), ('vector_elements', uint8_t, 13), ('matrix_columns', uint8_t, 14), ('length', ctypes.c_uint32, 16), ('name_id', uintptr_t, 24), ('explicit_stride', ctypes.c_uint32, 32), ('explicit_alignment', ctypes.c_uint32, 36), ('fields', struct_glsl_type_fields, 40)]) +nir_variable: TypeAlias = struct_nir_variable +struct_nir_variable.register_fields([('node', struct_exec_node, 0), ('type', c.POINTER[struct_glsl_type], 16), ('name', c.POINTER[ctypes.c_char], 24), ('data', struct_nir_variable_data, 32), ('index', ctypes.c_uint32, 88), ('num_members', uint16_t, 92), ('max_ifc_array_access', c.POINTER[ctypes.c_int32], 96), ('num_state_slots', uint16_t, 104), ('state_slots', c.POINTER[nir_state_slot], 112), ('constant_initializer', c.POINTER[nir_constant], 120), ('pointer_initializer', c.POINTER[nir_variable], 128), ('interface_type', c.POINTER[struct_glsl_type], 136), ('members', c.POINTER[nir_variable_data], 144)]) +nir_instr_type: dict[int, str] = {(nir_instr_type_alu:=0): 'nir_instr_type_alu', (nir_instr_type_deref:=1): 'nir_instr_type_deref', (nir_instr_type_call:=2): 'nir_instr_type_call', (nir_instr_type_tex:=3): 'nir_instr_type_tex', (nir_instr_type_intrinsic:=4): 'nir_instr_type_intrinsic', (nir_instr_type_load_const:=5): 'nir_instr_type_load_const', (nir_instr_type_jump:=6): 'nir_instr_type_jump', (nir_instr_type_undef:=7): 'nir_instr_type_undef', (nir_instr_type_phi:=8): 'nir_instr_type_phi', (nir_instr_type_parallel_copy:=9): 'nir_instr_type_parallel_copy'} +@c.record +class struct_nir_instr(c.Struct): + SIZE = 32 + node: struct_exec_node + block: c.POINTER[struct_nir_block] + type: int + pass_flags: int + has_debug_info: bool + index: int +@c.record +class struct_nir_block(c.Struct): + SIZE = 160 + cf_node: struct_nir_cf_node + instr_list: struct_exec_list + index: int + divergent: bool + successors: c.Array[c.POINTER[struct_nir_block], Literal[2]] + predecessors: c.POINTER[struct_set] + imm_dom: c.POINTER[struct_nir_block] + num_dom_children: int + dom_children: c.POINTER[c.POINTER[struct_nir_block]] + dom_frontier: c.POINTER[struct_set] + dom_pre_index: int + dom_post_index: int + start_ip: int + end_ip: int + live_in: c.POINTER[ctypes.c_uint32] + live_out: c.POINTER[ctypes.c_uint32] +nir_block: TypeAlias = struct_nir_block +@c.record +class struct_nir_cf_node(c.Struct): + SIZE = 32 + node: struct_exec_node + type: int + parent: c.POINTER[struct_nir_cf_node] +nir_cf_node: TypeAlias = struct_nir_cf_node +nir_cf_node_type: dict[int, str] = {(nir_cf_node_block:=0): 'nir_cf_node_block', (nir_cf_node_if:=1): 'nir_cf_node_if', (nir_cf_node_loop:=2): 'nir_cf_node_loop', (nir_cf_node_function:=3): 'nir_cf_node_function'} +struct_nir_cf_node.register_fields([('node', struct_exec_node, 0), ('type', ctypes.c_uint32, 16), ('parent', c.POINTER[nir_cf_node], 24)]) +@c.record +class struct_exec_list(c.Struct): + SIZE = 32 + head_sentinel: struct_exec_node + tail_sentinel: struct_exec_node +struct_exec_list.register_fields([('head_sentinel', struct_exec_node, 0), ('tail_sentinel', struct_exec_node, 16)]) +@c.record +class struct_set(c.Struct): + SIZE = 72 + mem_ctx: ctypes.c_void_p + table: c.POINTER[struct_set_entry] + key_hash_function: c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_void_p]] + key_equals_function: c.CFUNCTYPE[ctypes.c_bool, [ctypes.c_void_p, ctypes.c_void_p]] + size: int + rehash: int + size_magic: int + rehash_magic: int + max_entries: int + size_index: int + entries: int + deleted_entries: int +@c.record +class struct_set_entry(c.Struct): + SIZE = 16 + hash: int + key: ctypes.c_void_p +struct_set_entry.register_fields([('hash', uint32_t, 0), ('key', ctypes.c_void_p, 8)]) +struct_set.register_fields([('mem_ctx', ctypes.c_void_p, 0), ('table', c.POINTER[struct_set_entry], 8), ('key_hash_function', c.CFUNCTYPE[uint32_t, [ctypes.c_void_p]], 16), ('key_equals_function', c.CFUNCTYPE[ctypes.c_bool, [ctypes.c_void_p, ctypes.c_void_p]], 24), ('size', uint32_t, 32), ('rehash', uint32_t, 36), ('size_magic', uint64_t, 40), ('rehash_magic', uint64_t, 48), ('max_entries', uint32_t, 56), ('size_index', uint32_t, 60), ('entries', uint32_t, 64), ('deleted_entries', uint32_t, 68)]) +struct_nir_block.register_fields([('cf_node', nir_cf_node, 0), ('instr_list', struct_exec_list, 32), ('index', ctypes.c_uint32, 64), ('divergent', ctypes.c_bool, 68), ('successors', c.Array[c.POINTER[nir_block], Literal[2]], 72), ('predecessors', c.POINTER[struct_set], 88), ('imm_dom', c.POINTER[nir_block], 96), ('num_dom_children', ctypes.c_uint32, 104), ('dom_children', c.POINTER[c.POINTER[nir_block]], 112), ('dom_frontier', c.POINTER[struct_set], 120), ('dom_pre_index', uint32_t, 128), ('dom_post_index', uint32_t, 132), ('start_ip', uint32_t, 136), ('end_ip', uint32_t, 140), ('live_in', c.POINTER[ctypes.c_uint32], 144), ('live_out', c.POINTER[ctypes.c_uint32], 152)]) +struct_nir_instr.register_fields([('node', struct_exec_node, 0), ('block', c.POINTER[nir_block], 16), ('type', ctypes.c_ubyte, 24), ('pass_flags', uint8_t, 25), ('has_debug_info', ctypes.c_bool, 26), ('index', uint32_t, 28)]) +nir_instr: TypeAlias = struct_nir_instr +@c.record +class struct_nir_def(c.Struct): + SIZE = 32 + parent_instr: c.POINTER[struct_nir_instr] + uses: struct_list_head + index: int + num_components: int + bit_size: int + divergent: bool + loop_invariant: bool +@c.record +class struct_list_head(c.Struct): + SIZE = 16 + prev: c.POINTER[struct_list_head] + next: c.POINTER[struct_list_head] +struct_list_head.register_fields([('prev', c.POINTER[struct_list_head], 0), ('next', c.POINTER[struct_list_head], 8)]) +struct_nir_def.register_fields([('parent_instr', c.POINTER[nir_instr], 0), ('uses', struct_list_head, 8), ('index', ctypes.c_uint32, 24), ('num_components', uint8_t, 28), ('bit_size', uint8_t, 29), ('divergent', ctypes.c_bool, 30), ('loop_invariant', ctypes.c_bool, 31)]) +nir_def: TypeAlias = struct_nir_def +@c.record +class struct_nir_src(c.Struct): + SIZE = 32 + _parent: int + use_link: struct_list_head + ssa: c.POINTER[struct_nir_def] +struct_nir_src.register_fields([('_parent', uintptr_t, 0), ('use_link', struct_list_head, 8), ('ssa', c.POINTER[nir_def], 24)]) +nir_src: TypeAlias = struct_nir_src +@dll.bind(ctypes.c_bool, c.POINTER[nir_src]) +def nir_src_is_divergent(src:c.POINTER[nir_src]) -> bool: ... +@c.record +class struct_nir_alu_src(c.Struct): + SIZE = 48 + src: struct_nir_src + swizzle: c.Array[ctypes.c_ubyte, Literal[16]] +struct_nir_alu_src.register_fields([('src', nir_src, 0), ('swizzle', c.Array[uint8_t, Literal[16]], 32)]) +nir_alu_src: TypeAlias = struct_nir_alu_src +nir_alu_type: dict[int, str] = {(nir_type_invalid:=0): 'nir_type_invalid', (nir_type_int:=2): 'nir_type_int', (nir_type_uint:=4): 'nir_type_uint', (nir_type_bool:=6): 'nir_type_bool', (nir_type_float:=128): 'nir_type_float', (nir_type_bool1:=7): 'nir_type_bool1', (nir_type_bool8:=14): 'nir_type_bool8', (nir_type_bool16:=22): 'nir_type_bool16', (nir_type_bool32:=38): 'nir_type_bool32', (nir_type_int1:=3): 'nir_type_int1', (nir_type_int8:=10): 'nir_type_int8', (nir_type_int16:=18): 'nir_type_int16', (nir_type_int32:=34): 'nir_type_int32', (nir_type_int64:=66): 'nir_type_int64', (nir_type_uint1:=5): 'nir_type_uint1', (nir_type_uint8:=12): 'nir_type_uint8', (nir_type_uint16:=20): 'nir_type_uint16', (nir_type_uint32:=36): 'nir_type_uint32', (nir_type_uint64:=68): 'nir_type_uint64', (nir_type_float16:=144): 'nir_type_float16', (nir_type_float32:=160): 'nir_type_float32', (nir_type_float64:=192): 'nir_type_float64'} +@dll.bind(ctypes.c_ubyte, ctypes.c_uint32) +def nir_get_nir_type_for_glsl_base_type(base_type:ctypes.c_uint32) -> ctypes.c_ubyte: ... +@dll.bind(ctypes.c_uint32, ctypes.c_ubyte) +def nir_get_glsl_base_type_for_nir_type(base_type:ctypes.c_ubyte) -> ctypes.c_uint32: ... +nir_op: dict[int, str] = {(nir_op_alignbyte_amd:=0): 'nir_op_alignbyte_amd', (nir_op_amul:=1): 'nir_op_amul', (nir_op_andg_ir3:=2): 'nir_op_andg_ir3', (nir_op_b16all_fequal16:=3): 'nir_op_b16all_fequal16', (nir_op_b16all_fequal2:=4): 'nir_op_b16all_fequal2', (nir_op_b16all_fequal3:=5): 'nir_op_b16all_fequal3', (nir_op_b16all_fequal4:=6): 'nir_op_b16all_fequal4', (nir_op_b16all_fequal5:=7): 'nir_op_b16all_fequal5', (nir_op_b16all_fequal8:=8): 'nir_op_b16all_fequal8', (nir_op_b16all_iequal16:=9): 'nir_op_b16all_iequal16', (nir_op_b16all_iequal2:=10): 'nir_op_b16all_iequal2', (nir_op_b16all_iequal3:=11): 'nir_op_b16all_iequal3', (nir_op_b16all_iequal4:=12): 'nir_op_b16all_iequal4', (nir_op_b16all_iequal5:=13): 'nir_op_b16all_iequal5', (nir_op_b16all_iequal8:=14): 'nir_op_b16all_iequal8', (nir_op_b16any_fnequal16:=15): 'nir_op_b16any_fnequal16', (nir_op_b16any_fnequal2:=16): 'nir_op_b16any_fnequal2', (nir_op_b16any_fnequal3:=17): 'nir_op_b16any_fnequal3', (nir_op_b16any_fnequal4:=18): 'nir_op_b16any_fnequal4', (nir_op_b16any_fnequal5:=19): 'nir_op_b16any_fnequal5', (nir_op_b16any_fnequal8:=20): 'nir_op_b16any_fnequal8', (nir_op_b16any_inequal16:=21): 'nir_op_b16any_inequal16', (nir_op_b16any_inequal2:=22): 'nir_op_b16any_inequal2', (nir_op_b16any_inequal3:=23): 'nir_op_b16any_inequal3', (nir_op_b16any_inequal4:=24): 'nir_op_b16any_inequal4', (nir_op_b16any_inequal5:=25): 'nir_op_b16any_inequal5', (nir_op_b16any_inequal8:=26): 'nir_op_b16any_inequal8', (nir_op_b16csel:=27): 'nir_op_b16csel', (nir_op_b2b1:=28): 'nir_op_b2b1', (nir_op_b2b16:=29): 'nir_op_b2b16', (nir_op_b2b32:=30): 'nir_op_b2b32', (nir_op_b2b8:=31): 'nir_op_b2b8', (nir_op_b2f16:=32): 'nir_op_b2f16', (nir_op_b2f32:=33): 'nir_op_b2f32', (nir_op_b2f64:=34): 'nir_op_b2f64', (nir_op_b2i1:=35): 'nir_op_b2i1', (nir_op_b2i16:=36): 'nir_op_b2i16', (nir_op_b2i32:=37): 'nir_op_b2i32', (nir_op_b2i64:=38): 'nir_op_b2i64', (nir_op_b2i8:=39): 'nir_op_b2i8', (nir_op_b32all_fequal16:=40): 'nir_op_b32all_fequal16', (nir_op_b32all_fequal2:=41): 'nir_op_b32all_fequal2', (nir_op_b32all_fequal3:=42): 'nir_op_b32all_fequal3', (nir_op_b32all_fequal4:=43): 'nir_op_b32all_fequal4', (nir_op_b32all_fequal5:=44): 'nir_op_b32all_fequal5', (nir_op_b32all_fequal8:=45): 'nir_op_b32all_fequal8', (nir_op_b32all_iequal16:=46): 'nir_op_b32all_iequal16', (nir_op_b32all_iequal2:=47): 'nir_op_b32all_iequal2', (nir_op_b32all_iequal3:=48): 'nir_op_b32all_iequal3', (nir_op_b32all_iequal4:=49): 'nir_op_b32all_iequal4', (nir_op_b32all_iequal5:=50): 'nir_op_b32all_iequal5', (nir_op_b32all_iequal8:=51): 'nir_op_b32all_iequal8', (nir_op_b32any_fnequal16:=52): 'nir_op_b32any_fnequal16', (nir_op_b32any_fnequal2:=53): 'nir_op_b32any_fnequal2', (nir_op_b32any_fnequal3:=54): 'nir_op_b32any_fnequal3', (nir_op_b32any_fnequal4:=55): 'nir_op_b32any_fnequal4', (nir_op_b32any_fnequal5:=56): 'nir_op_b32any_fnequal5', (nir_op_b32any_fnequal8:=57): 'nir_op_b32any_fnequal8', (nir_op_b32any_inequal16:=58): 'nir_op_b32any_inequal16', (nir_op_b32any_inequal2:=59): 'nir_op_b32any_inequal2', (nir_op_b32any_inequal3:=60): 'nir_op_b32any_inequal3', (nir_op_b32any_inequal4:=61): 'nir_op_b32any_inequal4', (nir_op_b32any_inequal5:=62): 'nir_op_b32any_inequal5', (nir_op_b32any_inequal8:=63): 'nir_op_b32any_inequal8', (nir_op_b32csel:=64): 'nir_op_b32csel', (nir_op_b32fcsel_mdg:=65): 'nir_op_b32fcsel_mdg', (nir_op_b8all_fequal16:=66): 'nir_op_b8all_fequal16', (nir_op_b8all_fequal2:=67): 'nir_op_b8all_fequal2', (nir_op_b8all_fequal3:=68): 'nir_op_b8all_fequal3', (nir_op_b8all_fequal4:=69): 'nir_op_b8all_fequal4', (nir_op_b8all_fequal5:=70): 'nir_op_b8all_fequal5', (nir_op_b8all_fequal8:=71): 'nir_op_b8all_fequal8', (nir_op_b8all_iequal16:=72): 'nir_op_b8all_iequal16', (nir_op_b8all_iequal2:=73): 'nir_op_b8all_iequal2', (nir_op_b8all_iequal3:=74): 'nir_op_b8all_iequal3', (nir_op_b8all_iequal4:=75): 'nir_op_b8all_iequal4', (nir_op_b8all_iequal5:=76): 'nir_op_b8all_iequal5', (nir_op_b8all_iequal8:=77): 'nir_op_b8all_iequal8', (nir_op_b8any_fnequal16:=78): 'nir_op_b8any_fnequal16', (nir_op_b8any_fnequal2:=79): 'nir_op_b8any_fnequal2', (nir_op_b8any_fnequal3:=80): 'nir_op_b8any_fnequal3', (nir_op_b8any_fnequal4:=81): 'nir_op_b8any_fnequal4', (nir_op_b8any_fnequal5:=82): 'nir_op_b8any_fnequal5', (nir_op_b8any_fnequal8:=83): 'nir_op_b8any_fnequal8', (nir_op_b8any_inequal16:=84): 'nir_op_b8any_inequal16', (nir_op_b8any_inequal2:=85): 'nir_op_b8any_inequal2', (nir_op_b8any_inequal3:=86): 'nir_op_b8any_inequal3', (nir_op_b8any_inequal4:=87): 'nir_op_b8any_inequal4', (nir_op_b8any_inequal5:=88): 'nir_op_b8any_inequal5', (nir_op_b8any_inequal8:=89): 'nir_op_b8any_inequal8', (nir_op_b8csel:=90): 'nir_op_b8csel', (nir_op_ball_fequal16:=91): 'nir_op_ball_fequal16', (nir_op_ball_fequal2:=92): 'nir_op_ball_fequal2', (nir_op_ball_fequal3:=93): 'nir_op_ball_fequal3', (nir_op_ball_fequal4:=94): 'nir_op_ball_fequal4', (nir_op_ball_fequal5:=95): 'nir_op_ball_fequal5', (nir_op_ball_fequal8:=96): 'nir_op_ball_fequal8', (nir_op_ball_iequal16:=97): 'nir_op_ball_iequal16', (nir_op_ball_iequal2:=98): 'nir_op_ball_iequal2', (nir_op_ball_iequal3:=99): 'nir_op_ball_iequal3', (nir_op_ball_iequal4:=100): 'nir_op_ball_iequal4', (nir_op_ball_iequal5:=101): 'nir_op_ball_iequal5', (nir_op_ball_iequal8:=102): 'nir_op_ball_iequal8', (nir_op_bany_fnequal16:=103): 'nir_op_bany_fnequal16', (nir_op_bany_fnequal2:=104): 'nir_op_bany_fnequal2', (nir_op_bany_fnequal3:=105): 'nir_op_bany_fnequal3', (nir_op_bany_fnequal4:=106): 'nir_op_bany_fnequal4', (nir_op_bany_fnequal5:=107): 'nir_op_bany_fnequal5', (nir_op_bany_fnequal8:=108): 'nir_op_bany_fnequal8', (nir_op_bany_inequal16:=109): 'nir_op_bany_inequal16', (nir_op_bany_inequal2:=110): 'nir_op_bany_inequal2', (nir_op_bany_inequal3:=111): 'nir_op_bany_inequal3', (nir_op_bany_inequal4:=112): 'nir_op_bany_inequal4', (nir_op_bany_inequal5:=113): 'nir_op_bany_inequal5', (nir_op_bany_inequal8:=114): 'nir_op_bany_inequal8', (nir_op_bcsel:=115): 'nir_op_bcsel', (nir_op_bf2f:=116): 'nir_op_bf2f', (nir_op_bfdot16:=117): 'nir_op_bfdot16', (nir_op_bfdot2:=118): 'nir_op_bfdot2', (nir_op_bfdot2_bfadd:=119): 'nir_op_bfdot2_bfadd', (nir_op_bfdot3:=120): 'nir_op_bfdot3', (nir_op_bfdot4:=121): 'nir_op_bfdot4', (nir_op_bfdot5:=122): 'nir_op_bfdot5', (nir_op_bfdot8:=123): 'nir_op_bfdot8', (nir_op_bffma:=124): 'nir_op_bffma', (nir_op_bfi:=125): 'nir_op_bfi', (nir_op_bfm:=126): 'nir_op_bfm', (nir_op_bfmul:=127): 'nir_op_bfmul', (nir_op_bit_count:=128): 'nir_op_bit_count', (nir_op_bitfield_insert:=129): 'nir_op_bitfield_insert', (nir_op_bitfield_reverse:=130): 'nir_op_bitfield_reverse', (nir_op_bitfield_select:=131): 'nir_op_bitfield_select', (nir_op_bitnz:=132): 'nir_op_bitnz', (nir_op_bitnz16:=133): 'nir_op_bitnz16', (nir_op_bitnz32:=134): 'nir_op_bitnz32', (nir_op_bitnz8:=135): 'nir_op_bitnz8', (nir_op_bitz:=136): 'nir_op_bitz', (nir_op_bitz16:=137): 'nir_op_bitz16', (nir_op_bitz32:=138): 'nir_op_bitz32', (nir_op_bitz8:=139): 'nir_op_bitz8', (nir_op_bounds_agx:=140): 'nir_op_bounds_agx', (nir_op_byte_perm_amd:=141): 'nir_op_byte_perm_amd', (nir_op_cube_amd:=142): 'nir_op_cube_amd', (nir_op_e4m3fn2f:=143): 'nir_op_e4m3fn2f', (nir_op_e5m22f:=144): 'nir_op_e5m22f', (nir_op_extr_agx:=145): 'nir_op_extr_agx', (nir_op_extract_i16:=146): 'nir_op_extract_i16', (nir_op_extract_i8:=147): 'nir_op_extract_i8', (nir_op_extract_u16:=148): 'nir_op_extract_u16', (nir_op_extract_u8:=149): 'nir_op_extract_u8', (nir_op_f2bf:=150): 'nir_op_f2bf', (nir_op_f2e4m3fn:=151): 'nir_op_f2e4m3fn', (nir_op_f2e4m3fn_sat:=152): 'nir_op_f2e4m3fn_sat', (nir_op_f2e4m3fn_satfn:=153): 'nir_op_f2e4m3fn_satfn', (nir_op_f2e5m2:=154): 'nir_op_f2e5m2', (nir_op_f2e5m2_sat:=155): 'nir_op_f2e5m2_sat', (nir_op_f2f16:=156): 'nir_op_f2f16', (nir_op_f2f16_rtne:=157): 'nir_op_f2f16_rtne', (nir_op_f2f16_rtz:=158): 'nir_op_f2f16_rtz', (nir_op_f2f32:=159): 'nir_op_f2f32', (nir_op_f2f64:=160): 'nir_op_f2f64', (nir_op_f2fmp:=161): 'nir_op_f2fmp', (nir_op_f2i1:=162): 'nir_op_f2i1', (nir_op_f2i16:=163): 'nir_op_f2i16', (nir_op_f2i32:=164): 'nir_op_f2i32', (nir_op_f2i64:=165): 'nir_op_f2i64', (nir_op_f2i8:=166): 'nir_op_f2i8', (nir_op_f2imp:=167): 'nir_op_f2imp', (nir_op_f2snorm_16_v3d:=168): 'nir_op_f2snorm_16_v3d', (nir_op_f2u1:=169): 'nir_op_f2u1', (nir_op_f2u16:=170): 'nir_op_f2u16', (nir_op_f2u32:=171): 'nir_op_f2u32', (nir_op_f2u64:=172): 'nir_op_f2u64', (nir_op_f2u8:=173): 'nir_op_f2u8', (nir_op_f2ump:=174): 'nir_op_f2ump', (nir_op_f2unorm_16_v3d:=175): 'nir_op_f2unorm_16_v3d', (nir_op_fabs:=176): 'nir_op_fabs', (nir_op_fadd:=177): 'nir_op_fadd', (nir_op_fall_equal16:=178): 'nir_op_fall_equal16', (nir_op_fall_equal2:=179): 'nir_op_fall_equal2', (nir_op_fall_equal3:=180): 'nir_op_fall_equal3', (nir_op_fall_equal4:=181): 'nir_op_fall_equal4', (nir_op_fall_equal5:=182): 'nir_op_fall_equal5', (nir_op_fall_equal8:=183): 'nir_op_fall_equal8', (nir_op_fany_nequal16:=184): 'nir_op_fany_nequal16', (nir_op_fany_nequal2:=185): 'nir_op_fany_nequal2', (nir_op_fany_nequal3:=186): 'nir_op_fany_nequal3', (nir_op_fany_nequal4:=187): 'nir_op_fany_nequal4', (nir_op_fany_nequal5:=188): 'nir_op_fany_nequal5', (nir_op_fany_nequal8:=189): 'nir_op_fany_nequal8', (nir_op_fceil:=190): 'nir_op_fceil', (nir_op_fclamp_pos:=191): 'nir_op_fclamp_pos', (nir_op_fcos:=192): 'nir_op_fcos', (nir_op_fcos_amd:=193): 'nir_op_fcos_amd', (nir_op_fcos_mdg:=194): 'nir_op_fcos_mdg', (nir_op_fcsel:=195): 'nir_op_fcsel', (nir_op_fcsel_ge:=196): 'nir_op_fcsel_ge', (nir_op_fcsel_gt:=197): 'nir_op_fcsel_gt', (nir_op_fdiv:=198): 'nir_op_fdiv', (nir_op_fdot16:=199): 'nir_op_fdot16', (nir_op_fdot16_replicated:=200): 'nir_op_fdot16_replicated', (nir_op_fdot2:=201): 'nir_op_fdot2', (nir_op_fdot2_replicated:=202): 'nir_op_fdot2_replicated', (nir_op_fdot3:=203): 'nir_op_fdot3', (nir_op_fdot3_replicated:=204): 'nir_op_fdot3_replicated', (nir_op_fdot4:=205): 'nir_op_fdot4', (nir_op_fdot4_replicated:=206): 'nir_op_fdot4_replicated', (nir_op_fdot5:=207): 'nir_op_fdot5', (nir_op_fdot5_replicated:=208): 'nir_op_fdot5_replicated', (nir_op_fdot8:=209): 'nir_op_fdot8', (nir_op_fdot8_replicated:=210): 'nir_op_fdot8_replicated', (nir_op_fdph:=211): 'nir_op_fdph', (nir_op_fdph_replicated:=212): 'nir_op_fdph_replicated', (nir_op_feq:=213): 'nir_op_feq', (nir_op_feq16:=214): 'nir_op_feq16', (nir_op_feq32:=215): 'nir_op_feq32', (nir_op_feq8:=216): 'nir_op_feq8', (nir_op_fequ:=217): 'nir_op_fequ', (nir_op_fequ16:=218): 'nir_op_fequ16', (nir_op_fequ32:=219): 'nir_op_fequ32', (nir_op_fequ8:=220): 'nir_op_fequ8', (nir_op_fexp2:=221): 'nir_op_fexp2', (nir_op_ffloor:=222): 'nir_op_ffloor', (nir_op_ffma:=223): 'nir_op_ffma', (nir_op_ffmaz:=224): 'nir_op_ffmaz', (nir_op_ffract:=225): 'nir_op_ffract', (nir_op_fge:=226): 'nir_op_fge', (nir_op_fge16:=227): 'nir_op_fge16', (nir_op_fge32:=228): 'nir_op_fge32', (nir_op_fge8:=229): 'nir_op_fge8', (nir_op_fgeu:=230): 'nir_op_fgeu', (nir_op_fgeu16:=231): 'nir_op_fgeu16', (nir_op_fgeu32:=232): 'nir_op_fgeu32', (nir_op_fgeu8:=233): 'nir_op_fgeu8', (nir_op_find_lsb:=234): 'nir_op_find_lsb', (nir_op_fisfinite:=235): 'nir_op_fisfinite', (nir_op_fisfinite32:=236): 'nir_op_fisfinite32', (nir_op_fisnormal:=237): 'nir_op_fisnormal', (nir_op_flog2:=238): 'nir_op_flog2', (nir_op_flrp:=239): 'nir_op_flrp', (nir_op_flt:=240): 'nir_op_flt', (nir_op_flt16:=241): 'nir_op_flt16', (nir_op_flt32:=242): 'nir_op_flt32', (nir_op_flt8:=243): 'nir_op_flt8', (nir_op_fltu:=244): 'nir_op_fltu', (nir_op_fltu16:=245): 'nir_op_fltu16', (nir_op_fltu32:=246): 'nir_op_fltu32', (nir_op_fltu8:=247): 'nir_op_fltu8', (nir_op_fmax:=248): 'nir_op_fmax', (nir_op_fmax_agx:=249): 'nir_op_fmax_agx', (nir_op_fmin:=250): 'nir_op_fmin', (nir_op_fmin_agx:=251): 'nir_op_fmin_agx', (nir_op_fmod:=252): 'nir_op_fmod', (nir_op_fmul:=253): 'nir_op_fmul', (nir_op_fmulz:=254): 'nir_op_fmulz', (nir_op_fneg:=255): 'nir_op_fneg', (nir_op_fneo:=256): 'nir_op_fneo', (nir_op_fneo16:=257): 'nir_op_fneo16', (nir_op_fneo32:=258): 'nir_op_fneo32', (nir_op_fneo8:=259): 'nir_op_fneo8', (nir_op_fneu:=260): 'nir_op_fneu', (nir_op_fneu16:=261): 'nir_op_fneu16', (nir_op_fneu32:=262): 'nir_op_fneu32', (nir_op_fneu8:=263): 'nir_op_fneu8', (nir_op_ford:=264): 'nir_op_ford', (nir_op_ford16:=265): 'nir_op_ford16', (nir_op_ford32:=266): 'nir_op_ford32', (nir_op_ford8:=267): 'nir_op_ford8', (nir_op_fpow:=268): 'nir_op_fpow', (nir_op_fquantize2f16:=269): 'nir_op_fquantize2f16', (nir_op_frcp:=270): 'nir_op_frcp', (nir_op_frem:=271): 'nir_op_frem', (nir_op_frexp_exp:=272): 'nir_op_frexp_exp', (nir_op_frexp_sig:=273): 'nir_op_frexp_sig', (nir_op_fround_even:=274): 'nir_op_fround_even', (nir_op_frsq:=275): 'nir_op_frsq', (nir_op_fsat:=276): 'nir_op_fsat', (nir_op_fsat_signed:=277): 'nir_op_fsat_signed', (nir_op_fsign:=278): 'nir_op_fsign', (nir_op_fsin:=279): 'nir_op_fsin', (nir_op_fsin_agx:=280): 'nir_op_fsin_agx', (nir_op_fsin_amd:=281): 'nir_op_fsin_amd', (nir_op_fsin_mdg:=282): 'nir_op_fsin_mdg', (nir_op_fsqrt:=283): 'nir_op_fsqrt', (nir_op_fsub:=284): 'nir_op_fsub', (nir_op_fsum2:=285): 'nir_op_fsum2', (nir_op_fsum3:=286): 'nir_op_fsum3', (nir_op_fsum4:=287): 'nir_op_fsum4', (nir_op_ftrunc:=288): 'nir_op_ftrunc', (nir_op_funord:=289): 'nir_op_funord', (nir_op_funord16:=290): 'nir_op_funord16', (nir_op_funord32:=291): 'nir_op_funord32', (nir_op_funord8:=292): 'nir_op_funord8', (nir_op_i2f16:=293): 'nir_op_i2f16', (nir_op_i2f32:=294): 'nir_op_i2f32', (nir_op_i2f64:=295): 'nir_op_i2f64', (nir_op_i2fmp:=296): 'nir_op_i2fmp', (nir_op_i2i1:=297): 'nir_op_i2i1', (nir_op_i2i16:=298): 'nir_op_i2i16', (nir_op_i2i32:=299): 'nir_op_i2i32', (nir_op_i2i64:=300): 'nir_op_i2i64', (nir_op_i2i8:=301): 'nir_op_i2i8', (nir_op_i2imp:=302): 'nir_op_i2imp', (nir_op_i32csel_ge:=303): 'nir_op_i32csel_ge', (nir_op_i32csel_gt:=304): 'nir_op_i32csel_gt', (nir_op_iabs:=305): 'nir_op_iabs', (nir_op_iadd:=306): 'nir_op_iadd', (nir_op_iadd3:=307): 'nir_op_iadd3', (nir_op_iadd_sat:=308): 'nir_op_iadd_sat', (nir_op_iand:=309): 'nir_op_iand', (nir_op_ibfe:=310): 'nir_op_ibfe', (nir_op_ibitfield_extract:=311): 'nir_op_ibitfield_extract', (nir_op_icsel_eqz:=312): 'nir_op_icsel_eqz', (nir_op_idiv:=313): 'nir_op_idiv', (nir_op_ieq:=314): 'nir_op_ieq', (nir_op_ieq16:=315): 'nir_op_ieq16', (nir_op_ieq32:=316): 'nir_op_ieq32', (nir_op_ieq8:=317): 'nir_op_ieq8', (nir_op_ifind_msb:=318): 'nir_op_ifind_msb', (nir_op_ifind_msb_rev:=319): 'nir_op_ifind_msb_rev', (nir_op_ige:=320): 'nir_op_ige', (nir_op_ige16:=321): 'nir_op_ige16', (nir_op_ige32:=322): 'nir_op_ige32', (nir_op_ige8:=323): 'nir_op_ige8', (nir_op_ihadd:=324): 'nir_op_ihadd', (nir_op_ilea_agx:=325): 'nir_op_ilea_agx', (nir_op_ilt:=326): 'nir_op_ilt', (nir_op_ilt16:=327): 'nir_op_ilt16', (nir_op_ilt32:=328): 'nir_op_ilt32', (nir_op_ilt8:=329): 'nir_op_ilt8', (nir_op_imad:=330): 'nir_op_imad', (nir_op_imad24_ir3:=331): 'nir_op_imad24_ir3', (nir_op_imadsh_mix16:=332): 'nir_op_imadsh_mix16', (nir_op_imadshl_agx:=333): 'nir_op_imadshl_agx', (nir_op_imax:=334): 'nir_op_imax', (nir_op_imin:=335): 'nir_op_imin', (nir_op_imod:=336): 'nir_op_imod', (nir_op_imsubshl_agx:=337): 'nir_op_imsubshl_agx', (nir_op_imul:=338): 'nir_op_imul', (nir_op_imul24:=339): 'nir_op_imul24', (nir_op_imul24_relaxed:=340): 'nir_op_imul24_relaxed', (nir_op_imul_2x32_64:=341): 'nir_op_imul_2x32_64', (nir_op_imul_32x16:=342): 'nir_op_imul_32x16', (nir_op_imul_high:=343): 'nir_op_imul_high', (nir_op_ine:=344): 'nir_op_ine', (nir_op_ine16:=345): 'nir_op_ine16', (nir_op_ine32:=346): 'nir_op_ine32', (nir_op_ine8:=347): 'nir_op_ine8', (nir_op_ineg:=348): 'nir_op_ineg', (nir_op_inot:=349): 'nir_op_inot', (nir_op_insert_u16:=350): 'nir_op_insert_u16', (nir_op_insert_u8:=351): 'nir_op_insert_u8', (nir_op_interleave_agx:=352): 'nir_op_interleave_agx', (nir_op_ior:=353): 'nir_op_ior', (nir_op_irem:=354): 'nir_op_irem', (nir_op_irhadd:=355): 'nir_op_irhadd', (nir_op_ishl:=356): 'nir_op_ishl', (nir_op_ishr:=357): 'nir_op_ishr', (nir_op_isign:=358): 'nir_op_isign', (nir_op_isub:=359): 'nir_op_isub', (nir_op_isub_sat:=360): 'nir_op_isub_sat', (nir_op_ixor:=361): 'nir_op_ixor', (nir_op_ldexp:=362): 'nir_op_ldexp', (nir_op_ldexp16_pan:=363): 'nir_op_ldexp16_pan', (nir_op_lea_nv:=364): 'nir_op_lea_nv', (nir_op_mov:=365): 'nir_op_mov', (nir_op_mqsad_4x8:=366): 'nir_op_mqsad_4x8', (nir_op_msad_4x8:=367): 'nir_op_msad_4x8', (nir_op_pack_2x16_to_snorm_2x8_v3d:=368): 'nir_op_pack_2x16_to_snorm_2x8_v3d', (nir_op_pack_2x16_to_unorm_10_2_v3d:=369): 'nir_op_pack_2x16_to_unorm_10_2_v3d', (nir_op_pack_2x16_to_unorm_2x10_v3d:=370): 'nir_op_pack_2x16_to_unorm_2x10_v3d', (nir_op_pack_2x16_to_unorm_2x8_v3d:=371): 'nir_op_pack_2x16_to_unorm_2x8_v3d', (nir_op_pack_2x32_to_2x16_v3d:=372): 'nir_op_pack_2x32_to_2x16_v3d', (nir_op_pack_32_2x16:=373): 'nir_op_pack_32_2x16', (nir_op_pack_32_2x16_split:=374): 'nir_op_pack_32_2x16_split', (nir_op_pack_32_4x8:=375): 'nir_op_pack_32_4x8', (nir_op_pack_32_4x8_split:=376): 'nir_op_pack_32_4x8_split', (nir_op_pack_32_to_r11g11b10_v3d:=377): 'nir_op_pack_32_to_r11g11b10_v3d', (nir_op_pack_4x16_to_4x8_v3d:=378): 'nir_op_pack_4x16_to_4x8_v3d', (nir_op_pack_64_2x32:=379): 'nir_op_pack_64_2x32', (nir_op_pack_64_2x32_split:=380): 'nir_op_pack_64_2x32_split', (nir_op_pack_64_4x16:=381): 'nir_op_pack_64_4x16', (nir_op_pack_double_2x32_dxil:=382): 'nir_op_pack_double_2x32_dxil', (nir_op_pack_half_2x16:=383): 'nir_op_pack_half_2x16', (nir_op_pack_half_2x16_rtz_split:=384): 'nir_op_pack_half_2x16_rtz_split', (nir_op_pack_half_2x16_split:=385): 'nir_op_pack_half_2x16_split', (nir_op_pack_sint_2x16:=386): 'nir_op_pack_sint_2x16', (nir_op_pack_snorm_2x16:=387): 'nir_op_pack_snorm_2x16', (nir_op_pack_snorm_4x8:=388): 'nir_op_pack_snorm_4x8', (nir_op_pack_uint_2x16:=389): 'nir_op_pack_uint_2x16', (nir_op_pack_uint_32_to_r10g10b10a2_v3d:=390): 'nir_op_pack_uint_32_to_r10g10b10a2_v3d', (nir_op_pack_unorm_2x16:=391): 'nir_op_pack_unorm_2x16', (nir_op_pack_unorm_4x8:=392): 'nir_op_pack_unorm_4x8', (nir_op_pack_uvec2_to_uint:=393): 'nir_op_pack_uvec2_to_uint', (nir_op_pack_uvec4_to_uint:=394): 'nir_op_pack_uvec4_to_uint', (nir_op_prmt_nv:=395): 'nir_op_prmt_nv', (nir_op_sdot_2x16_iadd:=396): 'nir_op_sdot_2x16_iadd', (nir_op_sdot_2x16_iadd_sat:=397): 'nir_op_sdot_2x16_iadd_sat', (nir_op_sdot_4x8_iadd:=398): 'nir_op_sdot_4x8_iadd', (nir_op_sdot_4x8_iadd_sat:=399): 'nir_op_sdot_4x8_iadd_sat', (nir_op_seq:=400): 'nir_op_seq', (nir_op_sge:=401): 'nir_op_sge', (nir_op_shfr:=402): 'nir_op_shfr', (nir_op_shlg_ir3:=403): 'nir_op_shlg_ir3', (nir_op_shlm_ir3:=404): 'nir_op_shlm_ir3', (nir_op_shrg_ir3:=405): 'nir_op_shrg_ir3', (nir_op_shrm_ir3:=406): 'nir_op_shrm_ir3', (nir_op_slt:=407): 'nir_op_slt', (nir_op_sne:=408): 'nir_op_sne', (nir_op_sudot_4x8_iadd:=409): 'nir_op_sudot_4x8_iadd', (nir_op_sudot_4x8_iadd_sat:=410): 'nir_op_sudot_4x8_iadd_sat', (nir_op_u2f16:=411): 'nir_op_u2f16', (nir_op_u2f32:=412): 'nir_op_u2f32', (nir_op_u2f64:=413): 'nir_op_u2f64', (nir_op_u2fmp:=414): 'nir_op_u2fmp', (nir_op_u2u1:=415): 'nir_op_u2u1', (nir_op_u2u16:=416): 'nir_op_u2u16', (nir_op_u2u32:=417): 'nir_op_u2u32', (nir_op_u2u64:=418): 'nir_op_u2u64', (nir_op_u2u8:=419): 'nir_op_u2u8', (nir_op_uabs_isub:=420): 'nir_op_uabs_isub', (nir_op_uabs_usub:=421): 'nir_op_uabs_usub', (nir_op_uadd_carry:=422): 'nir_op_uadd_carry', (nir_op_uadd_sat:=423): 'nir_op_uadd_sat', (nir_op_ubfe:=424): 'nir_op_ubfe', (nir_op_ubitfield_extract:=425): 'nir_op_ubitfield_extract', (nir_op_uclz:=426): 'nir_op_uclz', (nir_op_udiv:=427): 'nir_op_udiv', (nir_op_udiv_aligned_4:=428): 'nir_op_udiv_aligned_4', (nir_op_udot_2x16_uadd:=429): 'nir_op_udot_2x16_uadd', (nir_op_udot_2x16_uadd_sat:=430): 'nir_op_udot_2x16_uadd_sat', (nir_op_udot_4x8_uadd:=431): 'nir_op_udot_4x8_uadd', (nir_op_udot_4x8_uadd_sat:=432): 'nir_op_udot_4x8_uadd_sat', (nir_op_ufind_msb:=433): 'nir_op_ufind_msb', (nir_op_ufind_msb_rev:=434): 'nir_op_ufind_msb_rev', (nir_op_uge:=435): 'nir_op_uge', (nir_op_uge16:=436): 'nir_op_uge16', (nir_op_uge32:=437): 'nir_op_uge32', (nir_op_uge8:=438): 'nir_op_uge8', (nir_op_uhadd:=439): 'nir_op_uhadd', (nir_op_ulea_agx:=440): 'nir_op_ulea_agx', (nir_op_ult:=441): 'nir_op_ult', (nir_op_ult16:=442): 'nir_op_ult16', (nir_op_ult32:=443): 'nir_op_ult32', (nir_op_ult8:=444): 'nir_op_ult8', (nir_op_umad24:=445): 'nir_op_umad24', (nir_op_umad24_relaxed:=446): 'nir_op_umad24_relaxed', (nir_op_umax:=447): 'nir_op_umax', (nir_op_umax_4x8_vc4:=448): 'nir_op_umax_4x8_vc4', (nir_op_umin:=449): 'nir_op_umin', (nir_op_umin_4x8_vc4:=450): 'nir_op_umin_4x8_vc4', (nir_op_umod:=451): 'nir_op_umod', (nir_op_umul24:=452): 'nir_op_umul24', (nir_op_umul24_relaxed:=453): 'nir_op_umul24_relaxed', (nir_op_umul_2x32_64:=454): 'nir_op_umul_2x32_64', (nir_op_umul_32x16:=455): 'nir_op_umul_32x16', (nir_op_umul_high:=456): 'nir_op_umul_high', (nir_op_umul_low:=457): 'nir_op_umul_low', (nir_op_umul_unorm_4x8_vc4:=458): 'nir_op_umul_unorm_4x8_vc4', (nir_op_unpack_32_2x16:=459): 'nir_op_unpack_32_2x16', (nir_op_unpack_32_2x16_split_x:=460): 'nir_op_unpack_32_2x16_split_x', (nir_op_unpack_32_2x16_split_y:=461): 'nir_op_unpack_32_2x16_split_y', (nir_op_unpack_32_4x8:=462): 'nir_op_unpack_32_4x8', (nir_op_unpack_64_2x32:=463): 'nir_op_unpack_64_2x32', (nir_op_unpack_64_2x32_split_x:=464): 'nir_op_unpack_64_2x32_split_x', (nir_op_unpack_64_2x32_split_y:=465): 'nir_op_unpack_64_2x32_split_y', (nir_op_unpack_64_4x16:=466): 'nir_op_unpack_64_4x16', (nir_op_unpack_double_2x32_dxil:=467): 'nir_op_unpack_double_2x32_dxil', (nir_op_unpack_half_2x16:=468): 'nir_op_unpack_half_2x16', (nir_op_unpack_half_2x16_split_x:=469): 'nir_op_unpack_half_2x16_split_x', (nir_op_unpack_half_2x16_split_y:=470): 'nir_op_unpack_half_2x16_split_y', (nir_op_unpack_snorm_2x16:=471): 'nir_op_unpack_snorm_2x16', (nir_op_unpack_snorm_4x8:=472): 'nir_op_unpack_snorm_4x8', (nir_op_unpack_unorm_2x16:=473): 'nir_op_unpack_unorm_2x16', (nir_op_unpack_unorm_4x8:=474): 'nir_op_unpack_unorm_4x8', (nir_op_urhadd:=475): 'nir_op_urhadd', (nir_op_urol:=476): 'nir_op_urol', (nir_op_uror:=477): 'nir_op_uror', (nir_op_usadd_4x8_vc4:=478): 'nir_op_usadd_4x8_vc4', (nir_op_ushr:=479): 'nir_op_ushr', (nir_op_ussub_4x8_vc4:=480): 'nir_op_ussub_4x8_vc4', (nir_op_usub_borrow:=481): 'nir_op_usub_borrow', (nir_op_usub_sat:=482): 'nir_op_usub_sat', (nir_op_vec16:=483): 'nir_op_vec16', (nir_op_vec2:=484): 'nir_op_vec2', (nir_op_vec3:=485): 'nir_op_vec3', (nir_op_vec4:=486): 'nir_op_vec4', (nir_op_vec5:=487): 'nir_op_vec5', (nir_op_vec8:=488): 'nir_op_vec8', (nir_last_opcode:=488): 'nir_last_opcode', (nir_num_opcodes:=489): 'nir_num_opcodes'} +@dll.bind(ctypes.c_uint32, ctypes.c_ubyte, ctypes.c_ubyte, ctypes.c_uint32) +def nir_type_conversion_op(src:ctypes.c_ubyte, dst:ctypes.c_ubyte, rnd:ctypes.c_uint32) -> ctypes.c_uint32: ... +nir_atomic_op: dict[int, str] = {(nir_atomic_op_iadd:=0): 'nir_atomic_op_iadd', (nir_atomic_op_imin:=1): 'nir_atomic_op_imin', (nir_atomic_op_umin:=2): 'nir_atomic_op_umin', (nir_atomic_op_imax:=3): 'nir_atomic_op_imax', (nir_atomic_op_umax:=4): 'nir_atomic_op_umax', (nir_atomic_op_iand:=5): 'nir_atomic_op_iand', (nir_atomic_op_ior:=6): 'nir_atomic_op_ior', (nir_atomic_op_ixor:=7): 'nir_atomic_op_ixor', (nir_atomic_op_xchg:=8): 'nir_atomic_op_xchg', (nir_atomic_op_fadd:=9): 'nir_atomic_op_fadd', (nir_atomic_op_fmin:=10): 'nir_atomic_op_fmin', (nir_atomic_op_fmax:=11): 'nir_atomic_op_fmax', (nir_atomic_op_cmpxchg:=12): 'nir_atomic_op_cmpxchg', (nir_atomic_op_fcmpxchg:=13): 'nir_atomic_op_fcmpxchg', (nir_atomic_op_inc_wrap:=14): 'nir_atomic_op_inc_wrap', (nir_atomic_op_dec_wrap:=15): 'nir_atomic_op_dec_wrap', (nir_atomic_op_ordered_add_gfx12_amd:=16): 'nir_atomic_op_ordered_add_gfx12_amd'} +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def nir_atomic_op_to_alu(op:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def nir_op_vec(num_components:int) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_bool, ctypes.c_uint32) +def nir_op_is_vec(op:ctypes.c_uint32) -> bool: ... +nir_op_algebraic_property: dict[int, str] = {(NIR_OP_IS_2SRC_COMMUTATIVE:=1): 'NIR_OP_IS_2SRC_COMMUTATIVE', (NIR_OP_IS_ASSOCIATIVE:=2): 'NIR_OP_IS_ASSOCIATIVE', (NIR_OP_IS_SELECTION:=4): 'NIR_OP_IS_SELECTION'} +@c.record +class struct_nir_op_info(c.Struct): + SIZE = 56 + name: c.POINTER[ctypes.c_char] + num_inputs: int + output_size: int + output_type: int + input_sizes: c.Array[ctypes.c_ubyte, Literal[16]] + input_types: c.Array[ctypes.c_ubyte, Literal[16]] + algebraic_properties: int + is_conversion: bool +struct_nir_op_info.register_fields([('name', c.POINTER[ctypes.c_char], 0), ('num_inputs', uint8_t, 8), ('output_size', uint8_t, 9), ('output_type', ctypes.c_ubyte, 10), ('input_sizes', c.Array[uint8_t, Literal[16]], 11), ('input_types', c.Array[ctypes.c_ubyte, Literal[16]], 27), ('algebraic_properties', ctypes.c_uint32, 44), ('is_conversion', ctypes.c_bool, 48)]) +nir_op_info: TypeAlias = struct_nir_op_info +try: nir_op_infos = c.Array[nir_op_info, Literal[489]].in_dll(dll, 'nir_op_infos') # type: ignore +except (ValueError,AttributeError): pass +@c.record +class struct_nir_alu_instr(c.Struct): + SIZE = 72 + instr: struct_nir_instr + op: int + exact: bool + no_signed_wrap: bool + no_unsigned_wrap: bool + fp_fast_math: int + _def: struct_nir_def + src: c.Array[struct_nir_alu_src, Literal[0]] +struct_nir_alu_instr.register_fields([('instr', nir_instr, 0), ('op', ctypes.c_uint32, 32), ('exact', ctypes.c_bool, 36, 1, 0), ('no_signed_wrap', ctypes.c_bool, 36, 1, 1), ('no_unsigned_wrap', ctypes.c_bool, 36, 1, 2), ('fp_fast_math', uint32_t, 36, 9, 3), ('_def', nir_def, 40), ('src', c.Array[nir_alu_src, Literal[0]], 72)]) +nir_alu_instr: TypeAlias = struct_nir_alu_instr +@dll.bind(None, c.POINTER[nir_alu_src], c.POINTER[nir_alu_src]) +def nir_alu_src_copy(dest:c.POINTER[nir_alu_src], src:c.POINTER[nir_alu_src]) -> None: ... +@dll.bind(nir_component_mask_t, c.POINTER[nir_alu_instr], ctypes.c_uint32) +def nir_alu_instr_src_read_mask(instr:c.POINTER[nir_alu_instr], src:int) -> nir_component_mask_t: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_alu_instr], ctypes.c_uint32) +def nir_ssa_alu_instr_src_components(instr:c.POINTER[nir_alu_instr], src:int) -> int: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_alu_instr]) +def nir_alu_instr_is_comparison(instr:c.POINTER[nir_alu_instr]) -> bool: ... +@dll.bind(ctypes.c_bool, nir_const_value, nir_const_value, ctypes.c_ubyte) +def nir_const_value_negative_equal(c1:nir_const_value, c2:nir_const_value, full_type:ctypes.c_ubyte) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_alu_instr], c.POINTER[nir_alu_instr], ctypes.c_uint32, ctypes.c_uint32) +def nir_alu_srcs_equal(alu1:c.POINTER[nir_alu_instr], alu2:c.POINTER[nir_alu_instr], src1:int, src2:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_alu_instr], c.POINTER[nir_alu_instr], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_ubyte) +def nir_alu_srcs_negative_equal_typed(alu1:c.POINTER[nir_alu_instr], alu2:c.POINTER[nir_alu_instr], src1:int, src2:int, base_type:ctypes.c_ubyte) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_alu_instr], c.POINTER[nir_alu_instr], ctypes.c_uint32, ctypes.c_uint32) +def nir_alu_srcs_negative_equal(alu1:c.POINTER[nir_alu_instr], alu2:c.POINTER[nir_alu_instr], src1:int, src2:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_alu_instr], ctypes.c_uint32) +def nir_alu_src_is_trivial_ssa(alu:c.POINTER[nir_alu_instr], srcn:int) -> bool: ... +nir_deref_type: dict[int, str] = {(nir_deref_type_var:=0): 'nir_deref_type_var', (nir_deref_type_array:=1): 'nir_deref_type_array', (nir_deref_type_array_wildcard:=2): 'nir_deref_type_array_wildcard', (nir_deref_type_ptr_as_array:=3): 'nir_deref_type_ptr_as_array', (nir_deref_type_struct:=4): 'nir_deref_type_struct', (nir_deref_type_cast:=5): 'nir_deref_type_cast'} +@c.record +class struct_nir_deref_instr(c.Struct): + SIZE = 152 + instr: struct_nir_instr + deref_type: int + modes: int + type: c.POINTER[struct_glsl_type] + var: c.POINTER[struct_nir_variable] + parent: struct_nir_src + arr: struct_nir_deref_instr_arr + strct: struct_nir_deref_instr_strct + cast: struct_nir_deref_instr_cast + _def: struct_nir_def +nir_variable_mode: dict[int, str] = {(nir_var_system_value:=1): 'nir_var_system_value', (nir_var_uniform:=2): 'nir_var_uniform', (nir_var_shader_in:=4): 'nir_var_shader_in', (nir_var_shader_out:=8): 'nir_var_shader_out', (nir_var_image:=16): 'nir_var_image', (nir_var_shader_call_data:=32): 'nir_var_shader_call_data', (nir_var_ray_hit_attrib:=64): 'nir_var_ray_hit_attrib', (nir_var_mem_ubo:=128): 'nir_var_mem_ubo', (nir_var_mem_push_const:=256): 'nir_var_mem_push_const', (nir_var_mem_ssbo:=512): 'nir_var_mem_ssbo', (nir_var_mem_constant:=1024): 'nir_var_mem_constant', (nir_var_mem_task_payload:=2048): 'nir_var_mem_task_payload', (nir_var_mem_node_payload:=4096): 'nir_var_mem_node_payload', (nir_var_mem_node_payload_in:=8192): 'nir_var_mem_node_payload_in', (nir_var_function_in:=16384): 'nir_var_function_in', (nir_var_function_out:=32768): 'nir_var_function_out', (nir_var_function_inout:=65536): 'nir_var_function_inout', (nir_var_shader_temp:=131072): 'nir_var_shader_temp', (nir_var_function_temp:=262144): 'nir_var_function_temp', (nir_var_mem_shared:=524288): 'nir_var_mem_shared', (nir_var_mem_global:=1048576): 'nir_var_mem_global', (nir_var_mem_generic:=1966080): 'nir_var_mem_generic', (nir_var_read_only_modes:=1159): 'nir_var_read_only_modes', (nir_var_vec_indexable_modes:=1969033): 'nir_var_vec_indexable_modes', (nir_num_variable_modes:=21): 'nir_num_variable_modes', (nir_var_all:=2097151): 'nir_var_all'} +@c.record +class struct_nir_deref_instr_arr(c.Struct): + SIZE = 40 + index: struct_nir_src + in_bounds: bool +struct_nir_deref_instr_arr.register_fields([('index', nir_src, 0), ('in_bounds', ctypes.c_bool, 32)]) +@c.record +class struct_nir_deref_instr_strct(c.Struct): + SIZE = 4 + index: int +struct_nir_deref_instr_strct.register_fields([('index', ctypes.c_uint32, 0)]) +@c.record +class struct_nir_deref_instr_cast(c.Struct): + SIZE = 12 + ptr_stride: int + align_mul: int + align_offset: int +struct_nir_deref_instr_cast.register_fields([('ptr_stride', ctypes.c_uint32, 0), ('align_mul', ctypes.c_uint32, 4), ('align_offset', ctypes.c_uint32, 8)]) +struct_nir_deref_instr.register_fields([('instr', nir_instr, 0), ('deref_type', ctypes.c_uint32, 32), ('modes', ctypes.c_uint32, 36), ('type', c.POINTER[struct_glsl_type], 40), ('var', c.POINTER[nir_variable], 48), ('parent', nir_src, 48), ('arr', struct_nir_deref_instr_arr, 80), ('strct', struct_nir_deref_instr_strct, 80), ('cast', struct_nir_deref_instr_cast, 80), ('_def', nir_def, 120)]) +nir_deref_instr: TypeAlias = struct_nir_deref_instr +@dll.bind(ctypes.c_bool, c.POINTER[nir_deref_instr]) +def nir_deref_cast_is_trivial(cast:c.POINTER[nir_deref_instr]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_deref_instr]) +def nir_deref_instr_has_indirect(instr:c.POINTER[nir_deref_instr]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_deref_instr]) +def nir_deref_instr_is_known_out_of_bounds(instr:c.POINTER[nir_deref_instr]) -> bool: ... +nir_deref_instr_has_complex_use_options: dict[int, str] = {(nir_deref_instr_has_complex_use_allow_memcpy_src:=1): 'nir_deref_instr_has_complex_use_allow_memcpy_src', (nir_deref_instr_has_complex_use_allow_memcpy_dst:=2): 'nir_deref_instr_has_complex_use_allow_memcpy_dst', (nir_deref_instr_has_complex_use_allow_atomics:=4): 'nir_deref_instr_has_complex_use_allow_atomics'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_deref_instr], ctypes.c_uint32) +def nir_deref_instr_has_complex_use(instr:c.POINTER[nir_deref_instr], opts:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_deref_instr]) +def nir_deref_instr_remove_if_unused(instr:c.POINTER[nir_deref_instr]) -> bool: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_deref_instr]) +def nir_deref_instr_array_stride(instr:c.POINTER[nir_deref_instr]) -> int: ... +@c.record +class struct_nir_call_instr(c.Struct): + SIZE = 80 + instr: struct_nir_instr + callee: c.POINTER[struct_nir_function] + indirect_callee: struct_nir_src + num_params: int + params: c.Array[struct_nir_src, Literal[0]] +@c.record +class struct_nir_function(c.Struct): + SIZE = 104 + node: struct_exec_node + name: c.POINTER[ctypes.c_char] + shader: c.POINTER[struct_nir_shader] + num_params: int + params: c.POINTER[struct_nir_parameter] + impl: c.POINTER[struct_nir_function_impl] + driver_attributes: int + is_entrypoint: bool + is_exported: bool + is_preamble: bool + should_inline: bool + dont_inline: bool + workgroup_size: c.Array[ctypes.c_uint32, Literal[3]] + is_subroutine: bool + is_tmp_globals_wrapper: bool + num_subroutine_types: int + subroutine_types: c.POINTER[c.POINTER[struct_glsl_type]] + subroutine_index: int + pass_flags: int +nir_function: TypeAlias = struct_nir_function +@c.record +class struct_nir_shader(c.Struct): + SIZE = 520 + gctx: c.POINTER[struct_gc_ctx] + variables: struct_exec_list + options: c.POINTER[struct_nir_shader_compiler_options] + info: struct_shader_info + functions: struct_exec_list + num_inputs: int + num_uniforms: int + num_outputs: int + global_mem_size: int + scratch_size: int + constant_data: ctypes.c_void_p + constant_data_size: int + xfb_info: c.POINTER[struct_nir_xfb_info] + printf_info_count: int + printf_info: c.POINTER[struct_u_printf_info] + has_debug_info: bool +nir_shader: TypeAlias = struct_nir_shader +class struct_gc_ctx(c.Struct): pass +gc_ctx: TypeAlias = struct_gc_ctx +@c.record +class struct_nir_shader_compiler_options(c.Struct): + SIZE = 248 + lower_fdiv: bool + lower_ffma16: bool + lower_ffma32: bool + lower_ffma64: bool + fuse_ffma16: bool + fuse_ffma32: bool + fuse_ffma64: bool + lower_flrp16: bool + lower_flrp32: bool + lower_flrp64: bool + lower_fpow: bool + lower_fsat: bool + lower_fsqrt: bool + lower_sincos: bool + lower_fmod: bool + lower_bitfield_extract8: bool + lower_bitfield_extract16: bool + lower_bitfield_extract: bool + lower_bitfield_insert: bool + lower_bitfield_reverse: bool + lower_bit_count: bool + lower_ifind_msb: bool + lower_ufind_msb: bool + lower_find_lsb: bool + lower_uadd_carry: bool + lower_usub_borrow: bool + lower_mul_high: bool + lower_mul_high16: bool + lower_fneg: bool + lower_ineg: bool + lower_fisnormal: bool + lower_scmp: bool + lower_vector_cmp: bool + lower_bitops: bool + lower_isign: bool + lower_fsign: bool + lower_iabs: bool + lower_umax: bool + lower_umin: bool + lower_fminmax_signed_zero: bool + lower_fdph: bool + fdot_replicates: bool + lower_ffloor: bool + lower_ffract: bool + lower_fceil: bool + lower_ftrunc: bool + lower_fround_even: bool + lower_ldexp: bool + lower_pack_half_2x16: bool + lower_pack_unorm_2x16: bool + lower_pack_snorm_2x16: bool + lower_pack_unorm_4x8: bool + lower_pack_snorm_4x8: bool + lower_pack_64_2x32: bool + lower_pack_64_4x16: bool + lower_pack_32_2x16: bool + lower_pack_64_2x32_split: bool + lower_pack_32_2x16_split: bool + lower_unpack_half_2x16: bool + lower_unpack_unorm_2x16: bool + lower_unpack_snorm_2x16: bool + lower_unpack_unorm_4x8: bool + lower_unpack_snorm_4x8: bool + lower_unpack_64_2x32_split: bool + lower_unpack_32_2x16_split: bool + lower_pack_split: bool + lower_extract_byte: bool + lower_extract_word: bool + lower_insert_byte: bool + lower_insert_word: bool + vertex_id_zero_based: bool + lower_base_vertex: bool + instance_id_includes_base_index: bool + lower_helper_invocation: bool + optimize_sample_mask_in: bool + optimize_load_front_face_fsign: bool + optimize_quad_vote_to_reduce: bool + lower_cs_local_index_to_id: bool + lower_cs_local_id_to_index: bool + has_cs_global_id: bool + lower_device_index_to_zero: bool + lower_wpos_pntc: bool + lower_hadd: bool + lower_hadd64: bool + lower_uadd_sat: bool + lower_usub_sat: bool + lower_iadd_sat: bool + lower_mul_32x16: bool + lower_bfloat16_conversions: bool + vectorize_tess_levels: bool + lower_to_scalar: bool + lower_to_scalar_filter: c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] + vectorize_vec2_16bit: bool + unify_interfaces: bool + lower_interpolate_at: bool + lower_mul_2x32_64: bool + has_rotate8: bool + has_rotate16: bool + has_rotate32: bool + has_shfr32: bool + has_iadd3: bool + has_amul: bool + has_imul24: bool + has_umul24: bool + has_mul24_relaxed: bool + has_imad32: bool + has_umad24: bool + has_fused_comp_and_csel: bool + has_icsel_eqz64: bool + has_icsel_eqz32: bool + has_icsel_eqz16: bool + has_fneo_fcmpu: bool + has_ford_funord: bool + has_fsub: bool + has_isub: bool + has_pack_32_4x8: bool + has_texture_scaling: bool + has_sdot_4x8: bool + has_udot_4x8: bool + has_sudot_4x8: bool + has_sdot_4x8_sat: bool + has_udot_4x8_sat: bool + has_sudot_4x8_sat: bool + has_dot_2x16: bool + has_bfdot2_bfadd: bool + has_fmulz: bool + has_fmulz_no_denorms: bool + has_find_msb_rev: bool + has_pack_half_2x16_rtz: bool + has_bit_test: bool + has_bfe: bool + has_bfm: bool + has_bfi: bool + has_bitfield_select: bool + has_uclz: bool + has_msad: bool + has_f2e4m3fn_satfn: bool + has_load_global_bounded: bool + intel_vec4: bool + avoid_ternary_with_two_constants: bool + support_8bit_alu: bool + support_16bit_alu: bool + max_unroll_iterations: int + max_unroll_iterations_aggressive: int + max_unroll_iterations_fp64: int + lower_uniforms_to_ubo: bool + force_indirect_unrolling_sampler: bool + no_integers: bool + force_indirect_unrolling: int + driver_functions: bool + late_lower_int64: bool + lower_int64_options: int + lower_doubles_options: int + divergence_analysis_options: int + support_indirect_inputs: int + support_indirect_outputs: int + lower_image_offset_to_range_base: bool + lower_atomic_offset_to_range_base: bool + preserve_mediump: bool + lower_fquantize2f16: bool + force_f2f16_rtz: bool + lower_layer_fs_input_to_sysval: bool + compact_arrays: bool + discard_is_demote: bool + has_ddx_intrinsics: bool + scalarize_ddx: bool + per_view_unique_driver_locations: bool + compact_view_index: bool + io_options: int + skip_lower_packing_ops: int + lower_mediump_io: c.CFUNCTYPE[None, [c.POINTER[struct_nir_shader]]] + varying_expression_max_cost: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_nir_shader], c.POINTER[struct_nir_shader]]] + varying_estimate_instr_cost: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_nir_instr]]] + max_varying_expression_cost: int +nir_shader_compiler_options: TypeAlias = struct_nir_shader_compiler_options +nir_instr_filter_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] +nir_lower_int64_options: dict[int, str] = {(nir_lower_imul64:=1): 'nir_lower_imul64', (nir_lower_isign64:=2): 'nir_lower_isign64', (nir_lower_divmod64:=4): 'nir_lower_divmod64', (nir_lower_imul_high64:=8): 'nir_lower_imul_high64', (nir_lower_bcsel64:=16): 'nir_lower_bcsel64', (nir_lower_icmp64:=32): 'nir_lower_icmp64', (nir_lower_iadd64:=64): 'nir_lower_iadd64', (nir_lower_iabs64:=128): 'nir_lower_iabs64', (nir_lower_ineg64:=256): 'nir_lower_ineg64', (nir_lower_logic64:=512): 'nir_lower_logic64', (nir_lower_minmax64:=1024): 'nir_lower_minmax64', (nir_lower_shift64:=2048): 'nir_lower_shift64', (nir_lower_imul_2x32_64:=4096): 'nir_lower_imul_2x32_64', (nir_lower_extract64:=8192): 'nir_lower_extract64', (nir_lower_ufind_msb64:=16384): 'nir_lower_ufind_msb64', (nir_lower_bit_count64:=32768): 'nir_lower_bit_count64', (nir_lower_subgroup_shuffle64:=65536): 'nir_lower_subgroup_shuffle64', (nir_lower_scan_reduce_bitwise64:=131072): 'nir_lower_scan_reduce_bitwise64', (nir_lower_scan_reduce_iadd64:=262144): 'nir_lower_scan_reduce_iadd64', (nir_lower_vote_ieq64:=524288): 'nir_lower_vote_ieq64', (nir_lower_usub_sat64:=1048576): 'nir_lower_usub_sat64', (nir_lower_iadd_sat64:=2097152): 'nir_lower_iadd_sat64', (nir_lower_find_lsb64:=4194304): 'nir_lower_find_lsb64', (nir_lower_conv64:=8388608): 'nir_lower_conv64', (nir_lower_uadd_sat64:=16777216): 'nir_lower_uadd_sat64', (nir_lower_iadd3_64:=33554432): 'nir_lower_iadd3_64', (nir_lower_bitfield_reverse64:=67108864): 'nir_lower_bitfield_reverse64', (nir_lower_bitfield_extract64:=134217728): 'nir_lower_bitfield_extract64'} +nir_lower_doubles_options: dict[int, str] = {(nir_lower_drcp:=1): 'nir_lower_drcp', (nir_lower_dsqrt:=2): 'nir_lower_dsqrt', (nir_lower_drsq:=4): 'nir_lower_drsq', (nir_lower_dtrunc:=8): 'nir_lower_dtrunc', (nir_lower_dfloor:=16): 'nir_lower_dfloor', (nir_lower_dceil:=32): 'nir_lower_dceil', (nir_lower_dfract:=64): 'nir_lower_dfract', (nir_lower_dround_even:=128): 'nir_lower_dround_even', (nir_lower_dmod:=256): 'nir_lower_dmod', (nir_lower_dsub:=512): 'nir_lower_dsub', (nir_lower_ddiv:=1024): 'nir_lower_ddiv', (nir_lower_dsign:=2048): 'nir_lower_dsign', (nir_lower_dminmax:=4096): 'nir_lower_dminmax', (nir_lower_dsat:=8192): 'nir_lower_dsat', (nir_lower_fp64_full_software:=16384): 'nir_lower_fp64_full_software'} +nir_divergence_options: dict[int, str] = {(nir_divergence_single_prim_per_subgroup:=1): 'nir_divergence_single_prim_per_subgroup', (nir_divergence_single_patch_per_tcs_subgroup:=2): 'nir_divergence_single_patch_per_tcs_subgroup', (nir_divergence_single_patch_per_tes_subgroup:=4): 'nir_divergence_single_patch_per_tes_subgroup', (nir_divergence_view_index_uniform:=8): 'nir_divergence_view_index_uniform', (nir_divergence_single_frag_shading_rate_per_subgroup:=16): 'nir_divergence_single_frag_shading_rate_per_subgroup', (nir_divergence_multiple_workgroup_per_compute_subgroup:=32): 'nir_divergence_multiple_workgroup_per_compute_subgroup', (nir_divergence_shader_record_ptr_uniform:=64): 'nir_divergence_shader_record_ptr_uniform', (nir_divergence_uniform_load_tears:=128): 'nir_divergence_uniform_load_tears', (nir_divergence_ignore_undef_if_phi_srcs:=256): 'nir_divergence_ignore_undef_if_phi_srcs'} +nir_io_options: dict[int, str] = {(nir_io_has_flexible_input_interpolation_except_flat:=1): 'nir_io_has_flexible_input_interpolation_except_flat', (nir_io_dont_use_pos_for_non_fs_varyings:=2): 'nir_io_dont_use_pos_for_non_fs_varyings', (nir_io_16bit_input_output_support:=4): 'nir_io_16bit_input_output_support', (nir_io_mediump_is_32bit:=8): 'nir_io_mediump_is_32bit', (nir_io_prefer_scalar_fs_inputs:=16): 'nir_io_prefer_scalar_fs_inputs', (nir_io_mix_convergent_flat_with_interpolated:=32): 'nir_io_mix_convergent_flat_with_interpolated', (nir_io_vectorizer_ignores_types:=64): 'nir_io_vectorizer_ignores_types', (nir_io_always_interpolate_convergent_fs_inputs:=128): 'nir_io_always_interpolate_convergent_fs_inputs', (nir_io_compaction_rotates_color_channels:=256): 'nir_io_compaction_rotates_color_channels', (nir_io_compaction_groups_tes_inputs_into_pos_and_var_groups:=512): 'nir_io_compaction_groups_tes_inputs_into_pos_and_var_groups', (nir_io_radv_intrinsic_component_workaround:=1024): 'nir_io_radv_intrinsic_component_workaround', (nir_io_has_intrinsics:=65536): 'nir_io_has_intrinsics', (nir_io_separate_clip_cull_distance_arrays:=131072): 'nir_io_separate_clip_cull_distance_arrays'} +struct_nir_shader_compiler_options.register_fields([('lower_fdiv', ctypes.c_bool, 0), ('lower_ffma16', ctypes.c_bool, 1), ('lower_ffma32', ctypes.c_bool, 2), ('lower_ffma64', ctypes.c_bool, 3), ('fuse_ffma16', ctypes.c_bool, 4), ('fuse_ffma32', ctypes.c_bool, 5), ('fuse_ffma64', ctypes.c_bool, 6), ('lower_flrp16', ctypes.c_bool, 7), ('lower_flrp32', ctypes.c_bool, 8), ('lower_flrp64', ctypes.c_bool, 9), ('lower_fpow', ctypes.c_bool, 10), ('lower_fsat', ctypes.c_bool, 11), ('lower_fsqrt', ctypes.c_bool, 12), ('lower_sincos', ctypes.c_bool, 13), ('lower_fmod', ctypes.c_bool, 14), ('lower_bitfield_extract8', ctypes.c_bool, 15), ('lower_bitfield_extract16', ctypes.c_bool, 16), ('lower_bitfield_extract', ctypes.c_bool, 17), ('lower_bitfield_insert', ctypes.c_bool, 18), ('lower_bitfield_reverse', ctypes.c_bool, 19), ('lower_bit_count', ctypes.c_bool, 20), ('lower_ifind_msb', ctypes.c_bool, 21), ('lower_ufind_msb', ctypes.c_bool, 22), ('lower_find_lsb', ctypes.c_bool, 23), ('lower_uadd_carry', ctypes.c_bool, 24), ('lower_usub_borrow', ctypes.c_bool, 25), ('lower_mul_high', ctypes.c_bool, 26), ('lower_mul_high16', ctypes.c_bool, 27), ('lower_fneg', ctypes.c_bool, 28), ('lower_ineg', ctypes.c_bool, 29), ('lower_fisnormal', ctypes.c_bool, 30), ('lower_scmp', ctypes.c_bool, 31), ('lower_vector_cmp', ctypes.c_bool, 32), ('lower_bitops', ctypes.c_bool, 33), ('lower_isign', ctypes.c_bool, 34), ('lower_fsign', ctypes.c_bool, 35), ('lower_iabs', ctypes.c_bool, 36), ('lower_umax', ctypes.c_bool, 37), ('lower_umin', ctypes.c_bool, 38), ('lower_fminmax_signed_zero', ctypes.c_bool, 39), ('lower_fdph', ctypes.c_bool, 40), ('fdot_replicates', ctypes.c_bool, 41), ('lower_ffloor', ctypes.c_bool, 42), ('lower_ffract', ctypes.c_bool, 43), ('lower_fceil', ctypes.c_bool, 44), ('lower_ftrunc', ctypes.c_bool, 45), ('lower_fround_even', ctypes.c_bool, 46), ('lower_ldexp', ctypes.c_bool, 47), ('lower_pack_half_2x16', ctypes.c_bool, 48), ('lower_pack_unorm_2x16', ctypes.c_bool, 49), ('lower_pack_snorm_2x16', ctypes.c_bool, 50), ('lower_pack_unorm_4x8', ctypes.c_bool, 51), ('lower_pack_snorm_4x8', ctypes.c_bool, 52), ('lower_pack_64_2x32', ctypes.c_bool, 53), ('lower_pack_64_4x16', ctypes.c_bool, 54), ('lower_pack_32_2x16', ctypes.c_bool, 55), ('lower_pack_64_2x32_split', ctypes.c_bool, 56), ('lower_pack_32_2x16_split', ctypes.c_bool, 57), ('lower_unpack_half_2x16', ctypes.c_bool, 58), ('lower_unpack_unorm_2x16', ctypes.c_bool, 59), ('lower_unpack_snorm_2x16', ctypes.c_bool, 60), ('lower_unpack_unorm_4x8', ctypes.c_bool, 61), ('lower_unpack_snorm_4x8', ctypes.c_bool, 62), ('lower_unpack_64_2x32_split', ctypes.c_bool, 63), ('lower_unpack_32_2x16_split', ctypes.c_bool, 64), ('lower_pack_split', ctypes.c_bool, 65), ('lower_extract_byte', ctypes.c_bool, 66), ('lower_extract_word', ctypes.c_bool, 67), ('lower_insert_byte', ctypes.c_bool, 68), ('lower_insert_word', ctypes.c_bool, 69), ('vertex_id_zero_based', ctypes.c_bool, 70), ('lower_base_vertex', ctypes.c_bool, 71), ('instance_id_includes_base_index', ctypes.c_bool, 72), ('lower_helper_invocation', ctypes.c_bool, 73), ('optimize_sample_mask_in', ctypes.c_bool, 74), ('optimize_load_front_face_fsign', ctypes.c_bool, 75), ('optimize_quad_vote_to_reduce', ctypes.c_bool, 76), ('lower_cs_local_index_to_id', ctypes.c_bool, 77), ('lower_cs_local_id_to_index', ctypes.c_bool, 78), ('has_cs_global_id', ctypes.c_bool, 79), ('lower_device_index_to_zero', ctypes.c_bool, 80), ('lower_wpos_pntc', ctypes.c_bool, 81), ('lower_hadd', ctypes.c_bool, 82), ('lower_hadd64', ctypes.c_bool, 83), ('lower_uadd_sat', ctypes.c_bool, 84), ('lower_usub_sat', ctypes.c_bool, 85), ('lower_iadd_sat', ctypes.c_bool, 86), ('lower_mul_32x16', ctypes.c_bool, 87), ('lower_bfloat16_conversions', ctypes.c_bool, 88), ('vectorize_tess_levels', ctypes.c_bool, 89), ('lower_to_scalar', ctypes.c_bool, 90), ('lower_to_scalar_filter', nir_instr_filter_cb, 96), ('vectorize_vec2_16bit', ctypes.c_bool, 104), ('unify_interfaces', ctypes.c_bool, 105), ('lower_interpolate_at', ctypes.c_bool, 106), ('lower_mul_2x32_64', ctypes.c_bool, 107), ('has_rotate8', ctypes.c_bool, 108), ('has_rotate16', ctypes.c_bool, 109), ('has_rotate32', ctypes.c_bool, 110), ('has_shfr32', ctypes.c_bool, 111), ('has_iadd3', ctypes.c_bool, 112), ('has_amul', ctypes.c_bool, 113), ('has_imul24', ctypes.c_bool, 114), ('has_umul24', ctypes.c_bool, 115), ('has_mul24_relaxed', ctypes.c_bool, 116), ('has_imad32', ctypes.c_bool, 117), ('has_umad24', ctypes.c_bool, 118), ('has_fused_comp_and_csel', ctypes.c_bool, 119), ('has_icsel_eqz64', ctypes.c_bool, 120), ('has_icsel_eqz32', ctypes.c_bool, 121), ('has_icsel_eqz16', ctypes.c_bool, 122), ('has_fneo_fcmpu', ctypes.c_bool, 123), ('has_ford_funord', ctypes.c_bool, 124), ('has_fsub', ctypes.c_bool, 125), ('has_isub', ctypes.c_bool, 126), ('has_pack_32_4x8', ctypes.c_bool, 127), ('has_texture_scaling', ctypes.c_bool, 128), ('has_sdot_4x8', ctypes.c_bool, 129), ('has_udot_4x8', ctypes.c_bool, 130), ('has_sudot_4x8', ctypes.c_bool, 131), ('has_sdot_4x8_sat', ctypes.c_bool, 132), ('has_udot_4x8_sat', ctypes.c_bool, 133), ('has_sudot_4x8_sat', ctypes.c_bool, 134), ('has_dot_2x16', ctypes.c_bool, 135), ('has_bfdot2_bfadd', ctypes.c_bool, 136), ('has_fmulz', ctypes.c_bool, 137), ('has_fmulz_no_denorms', ctypes.c_bool, 138), ('has_find_msb_rev', ctypes.c_bool, 139), ('has_pack_half_2x16_rtz', ctypes.c_bool, 140), ('has_bit_test', ctypes.c_bool, 141), ('has_bfe', ctypes.c_bool, 142), ('has_bfm', ctypes.c_bool, 143), ('has_bfi', ctypes.c_bool, 144), ('has_bitfield_select', ctypes.c_bool, 145), ('has_uclz', ctypes.c_bool, 146), ('has_msad', ctypes.c_bool, 147), ('has_f2e4m3fn_satfn', ctypes.c_bool, 148), ('has_load_global_bounded', ctypes.c_bool, 149), ('intel_vec4', ctypes.c_bool, 150), ('avoid_ternary_with_two_constants', ctypes.c_bool, 151), ('support_8bit_alu', ctypes.c_bool, 152), ('support_16bit_alu', ctypes.c_bool, 153), ('max_unroll_iterations', ctypes.c_uint32, 156), ('max_unroll_iterations_aggressive', ctypes.c_uint32, 160), ('max_unroll_iterations_fp64', ctypes.c_uint32, 164), ('lower_uniforms_to_ubo', ctypes.c_bool, 168), ('force_indirect_unrolling_sampler', ctypes.c_bool, 169), ('no_integers', ctypes.c_bool, 170), ('force_indirect_unrolling', ctypes.c_uint32, 172), ('driver_functions', ctypes.c_bool, 176), ('late_lower_int64', ctypes.c_bool, 177), ('lower_int64_options', ctypes.c_uint32, 180), ('lower_doubles_options', ctypes.c_uint32, 184), ('divergence_analysis_options', ctypes.c_uint32, 188), ('support_indirect_inputs', uint8_t, 192), ('support_indirect_outputs', uint8_t, 193), ('lower_image_offset_to_range_base', ctypes.c_bool, 194), ('lower_atomic_offset_to_range_base', ctypes.c_bool, 195), ('preserve_mediump', ctypes.c_bool, 196), ('lower_fquantize2f16', ctypes.c_bool, 197), ('force_f2f16_rtz', ctypes.c_bool, 198), ('lower_layer_fs_input_to_sysval', ctypes.c_bool, 199), ('compact_arrays', ctypes.c_bool, 200), ('discard_is_demote', ctypes.c_bool, 201), ('has_ddx_intrinsics', ctypes.c_bool, 202), ('scalarize_ddx', ctypes.c_bool, 203), ('per_view_unique_driver_locations', ctypes.c_bool, 204), ('compact_view_index', ctypes.c_bool, 205), ('io_options', ctypes.c_uint32, 208), ('skip_lower_packing_ops', ctypes.c_uint32, 212), ('lower_mediump_io', c.CFUNCTYPE[None, [c.POINTER[struct_nir_shader]]], 216), ('varying_expression_max_cost', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_nir_shader], c.POINTER[struct_nir_shader]]], 224), ('varying_estimate_instr_cost', c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_nir_instr]]], 232), ('max_varying_expression_cost', ctypes.c_uint32, 240)]) +@c.record +class struct_shader_info(c.Struct): + SIZE = 368 + name: c.POINTER[ctypes.c_char] + label: c.POINTER[ctypes.c_char] + internal: bool + source_blake3: c.Array[ctypes.c_ubyte, Literal[32]] + stage: int + prev_stage: int + next_stage: int + prev_stage_has_xfb: bool + num_textures: int + num_ubos: int + num_abos: int + num_ssbos: int + num_images: int + inputs_read: int + dual_slot_inputs: int + outputs_written: int + outputs_read: int + system_values_read: c.Array[ctypes.c_uint32, Literal[4]] + per_primitive_inputs: int + per_primitive_outputs: int + per_view_outputs: int + view_mask: int + inputs_read_16bit: int + outputs_written_16bit: int + outputs_read_16bit: int + inputs_read_indirectly_16bit: int + outputs_read_indirectly_16bit: int + outputs_written_indirectly_16bit: int + patch_inputs_read: int + patch_outputs_written: int + patch_outputs_read: int + inputs_read_indirectly: int + outputs_read_indirectly: int + outputs_written_indirectly: int + patch_inputs_read_indirectly: int + patch_outputs_read_indirectly: int + patch_outputs_written_indirectly: int + textures_used: c.Array[ctypes.c_uint32, Literal[4]] + textures_used_by_txf: c.Array[ctypes.c_uint32, Literal[4]] + samplers_used: c.Array[ctypes.c_uint32, Literal[1]] + images_used: c.Array[ctypes.c_uint32, Literal[2]] + image_buffers: c.Array[ctypes.c_uint32, Literal[2]] + msaa_images: c.Array[ctypes.c_uint32, Literal[2]] + float_controls_execution_mode: int + shared_size: int + task_payload_size: int + ray_queries: int + workgroup_size: c.Array[ctypes.c_uint16, Literal[3]] + subgroup_size: int + num_subgroups: int + uses_wide_subgroup_intrinsics: bool + xfb_stride: c.Array[ctypes.c_ubyte, Literal[4]] + inlinable_uniform_dw_offsets: c.Array[ctypes.c_uint16, Literal[4]] + num_inlinable_uniforms: int + clip_distance_array_size: int + cull_distance_array_size: int + uses_texture_gather: bool + uses_resource_info_query: bool + bit_sizes_float: int + bit_sizes_int: int + first_ubo_is_default_ubo: bool + separate_shader: bool + has_transform_feedback_varyings: bool + flrp_lowered: bool + io_lowered: bool + var_copies_lowered: bool + writes_memory: bool + layer_viewport_relative: bool + uses_control_barrier: bool + uses_memory_barrier: bool + uses_bindless: bool + shared_memory_explicit_layout: bool + zero_initialize_shared_memory: bool + workgroup_size_variable: bool + uses_printf: bool + maximally_reconverges: bool + use_aco_amd: bool + use_lowered_image_to_global: bool + use_legacy_math_rules: bool + derivative_group: int + vs: struct_shader_info_vs + gs: struct_shader_info_gs + fs: struct_shader_info_fs + cs: struct_shader_info_cs + tess: struct_shader_info_tess + mesh: struct_shader_info_mesh +blake3_hash: TypeAlias = c.Array[ctypes.c_ubyte, Literal[32]] +enum_pipe_shader_type: dict[int, str] = {(MESA_SHADER_NONE:=-1): 'MESA_SHADER_NONE', (MESA_SHADER_VERTEX:=0): 'MESA_SHADER_VERTEX', (PIPE_SHADER_VERTEX:=0): 'PIPE_SHADER_VERTEX', (MESA_SHADER_TESS_CTRL:=1): 'MESA_SHADER_TESS_CTRL', (PIPE_SHADER_TESS_CTRL:=1): 'PIPE_SHADER_TESS_CTRL', (MESA_SHADER_TESS_EVAL:=2): 'MESA_SHADER_TESS_EVAL', (PIPE_SHADER_TESS_EVAL:=2): 'PIPE_SHADER_TESS_EVAL', (MESA_SHADER_GEOMETRY:=3): 'MESA_SHADER_GEOMETRY', (PIPE_SHADER_GEOMETRY:=3): 'PIPE_SHADER_GEOMETRY', (MESA_SHADER_FRAGMENT:=4): 'MESA_SHADER_FRAGMENT', (PIPE_SHADER_FRAGMENT:=4): 'PIPE_SHADER_FRAGMENT', (MESA_SHADER_COMPUTE:=5): 'MESA_SHADER_COMPUTE', (PIPE_SHADER_COMPUTE:=5): 'PIPE_SHADER_COMPUTE', (PIPE_SHADER_TYPES:=6): 'PIPE_SHADER_TYPES', (MESA_SHADER_TASK:=6): 'MESA_SHADER_TASK', (PIPE_SHADER_TASK:=6): 'PIPE_SHADER_TASK', (MESA_SHADER_MESH:=7): 'MESA_SHADER_MESH', (PIPE_SHADER_MESH:=7): 'PIPE_SHADER_MESH', (PIPE_SHADER_MESH_TYPES:=8): 'PIPE_SHADER_MESH_TYPES', (MESA_SHADER_RAYGEN:=8): 'MESA_SHADER_RAYGEN', (MESA_SHADER_ANY_HIT:=9): 'MESA_SHADER_ANY_HIT', (MESA_SHADER_CLOSEST_HIT:=10): 'MESA_SHADER_CLOSEST_HIT', (MESA_SHADER_MISS:=11): 'MESA_SHADER_MISS', (MESA_SHADER_INTERSECTION:=12): 'MESA_SHADER_INTERSECTION', (MESA_SHADER_CALLABLE:=13): 'MESA_SHADER_CALLABLE', (MESA_SHADER_KERNEL:=14): 'MESA_SHADER_KERNEL'} +gl_shader_stage: TypeAlias = ctypes.c_int32 +enum_gl_subgroup_size: dict[int, str] = {(SUBGROUP_SIZE_VARYING:=0): 'SUBGROUP_SIZE_VARYING', (SUBGROUP_SIZE_UNIFORM:=1): 'SUBGROUP_SIZE_UNIFORM', (SUBGROUP_SIZE_API_CONSTANT:=2): 'SUBGROUP_SIZE_API_CONSTANT', (SUBGROUP_SIZE_FULL_SUBGROUPS:=3): 'SUBGROUP_SIZE_FULL_SUBGROUPS', (SUBGROUP_SIZE_REQUIRE_4:=4): 'SUBGROUP_SIZE_REQUIRE_4', (SUBGROUP_SIZE_REQUIRE_8:=8): 'SUBGROUP_SIZE_REQUIRE_8', (SUBGROUP_SIZE_REQUIRE_16:=16): 'SUBGROUP_SIZE_REQUIRE_16', (SUBGROUP_SIZE_REQUIRE_32:=32): 'SUBGROUP_SIZE_REQUIRE_32', (SUBGROUP_SIZE_REQUIRE_64:=64): 'SUBGROUP_SIZE_REQUIRE_64', (SUBGROUP_SIZE_REQUIRE_128:=128): 'SUBGROUP_SIZE_REQUIRE_128'} +enum_gl_derivative_group: dict[int, str] = {(DERIVATIVE_GROUP_NONE:=0): 'DERIVATIVE_GROUP_NONE', (DERIVATIVE_GROUP_QUADS:=1): 'DERIVATIVE_GROUP_QUADS', (DERIVATIVE_GROUP_LINEAR:=2): 'DERIVATIVE_GROUP_LINEAR'} +@c.record +class struct_shader_info_vs(c.Struct): + SIZE = 16 + double_inputs: int + blit_sgprs_amd: int + tes_agx: bool + window_space_position: bool + needs_edge_flag: bool +struct_shader_info_vs.register_fields([('double_inputs', uint64_t, 0), ('blit_sgprs_amd', uint8_t, 8, 4, 0), ('tes_agx', ctypes.c_bool, 8, 1, 4), ('window_space_position', ctypes.c_bool, 8, 1, 5), ('needs_edge_flag', ctypes.c_bool, 8, 1, 6)]) +@c.record +class struct_shader_info_gs(c.Struct): + SIZE = 6 + output_primitive: int + input_primitive: int + vertices_out: int + invocations: int + vertices_in: int + uses_end_primitive: bool + active_stream_mask: int +enum_mesa_prim: dict[int, str] = {(MESA_PRIM_POINTS:=0): 'MESA_PRIM_POINTS', (MESA_PRIM_LINES:=1): 'MESA_PRIM_LINES', (MESA_PRIM_LINE_LOOP:=2): 'MESA_PRIM_LINE_LOOP', (MESA_PRIM_LINE_STRIP:=3): 'MESA_PRIM_LINE_STRIP', (MESA_PRIM_TRIANGLES:=4): 'MESA_PRIM_TRIANGLES', (MESA_PRIM_TRIANGLE_STRIP:=5): 'MESA_PRIM_TRIANGLE_STRIP', (MESA_PRIM_TRIANGLE_FAN:=6): 'MESA_PRIM_TRIANGLE_FAN', (MESA_PRIM_QUADS:=7): 'MESA_PRIM_QUADS', (MESA_PRIM_QUAD_STRIP:=8): 'MESA_PRIM_QUAD_STRIP', (MESA_PRIM_POLYGON:=9): 'MESA_PRIM_POLYGON', (MESA_PRIM_LINES_ADJACENCY:=10): 'MESA_PRIM_LINES_ADJACENCY', (MESA_PRIM_LINE_STRIP_ADJACENCY:=11): 'MESA_PRIM_LINE_STRIP_ADJACENCY', (MESA_PRIM_TRIANGLES_ADJACENCY:=12): 'MESA_PRIM_TRIANGLES_ADJACENCY', (MESA_PRIM_TRIANGLE_STRIP_ADJACENCY:=13): 'MESA_PRIM_TRIANGLE_STRIP_ADJACENCY', (MESA_PRIM_PATCHES:=14): 'MESA_PRIM_PATCHES', (MESA_PRIM_MAX:=14): 'MESA_PRIM_MAX', (MESA_PRIM_COUNT:=15): 'MESA_PRIM_COUNT', (MESA_PRIM_UNKNOWN:=28): 'MESA_PRIM_UNKNOWN'} +struct_shader_info_gs.register_fields([('output_primitive', ctypes.c_ubyte, 0), ('input_primitive', ctypes.c_ubyte, 1), ('vertices_out', uint16_t, 2), ('invocations', uint8_t, 4), ('vertices_in', uint8_t, 5, 3, 0), ('uses_end_primitive', ctypes.c_bool, 5, 1, 3), ('active_stream_mask', uint8_t, 5, 4, 4)]) +@c.record +class struct_shader_info_fs(c.Struct): + SIZE = 16 + uses_discard: bool + uses_fbfetch_output: bool + fbfetch_coherent: bool + color_is_dual_source: bool + require_full_quads: bool + quad_derivatives: bool + needs_coarse_quad_helper_invocations: bool + needs_full_quad_helper_invocations: bool + uses_sample_qualifier: bool + uses_sample_shading: bool + early_fragment_tests: bool + inner_coverage: bool + post_depth_coverage: bool + pixel_center_integer: bool + origin_upper_left: bool + pixel_interlock_ordered: bool + pixel_interlock_unordered: bool + sample_interlock_ordered: bool + sample_interlock_unordered: bool + untyped_color_outputs: bool + depth_layout: int + color0_interp: int + color0_sample: bool + color0_centroid: bool + color1_interp: int + color1_sample: bool + color1_centroid: bool + advanced_blend_modes: int + early_and_late_fragment_tests: bool + stencil_front_layout: int + stencil_back_layout: int +enum_gl_frag_depth_layout: dict[int, str] = {(FRAG_DEPTH_LAYOUT_NONE:=0): 'FRAG_DEPTH_LAYOUT_NONE', (FRAG_DEPTH_LAYOUT_ANY:=1): 'FRAG_DEPTH_LAYOUT_ANY', (FRAG_DEPTH_LAYOUT_GREATER:=2): 'FRAG_DEPTH_LAYOUT_GREATER', (FRAG_DEPTH_LAYOUT_LESS:=3): 'FRAG_DEPTH_LAYOUT_LESS', (FRAG_DEPTH_LAYOUT_UNCHANGED:=4): 'FRAG_DEPTH_LAYOUT_UNCHANGED'} +enum_gl_frag_stencil_layout: dict[int, str] = {(FRAG_STENCIL_LAYOUT_NONE:=0): 'FRAG_STENCIL_LAYOUT_NONE', (FRAG_STENCIL_LAYOUT_ANY:=1): 'FRAG_STENCIL_LAYOUT_ANY', (FRAG_STENCIL_LAYOUT_GREATER:=2): 'FRAG_STENCIL_LAYOUT_GREATER', (FRAG_STENCIL_LAYOUT_LESS:=3): 'FRAG_STENCIL_LAYOUT_LESS', (FRAG_STENCIL_LAYOUT_UNCHANGED:=4): 'FRAG_STENCIL_LAYOUT_UNCHANGED'} +struct_shader_info_fs.register_fields([('uses_discard', ctypes.c_bool, 0, 1, 0), ('uses_fbfetch_output', ctypes.c_bool, 0, 1, 1), ('fbfetch_coherent', ctypes.c_bool, 0, 1, 2), ('color_is_dual_source', ctypes.c_bool, 0, 1, 3), ('require_full_quads', ctypes.c_bool, 0, 1, 4), ('quad_derivatives', ctypes.c_bool, 0, 1, 5), ('needs_coarse_quad_helper_invocations', ctypes.c_bool, 0, 1, 6), ('needs_full_quad_helper_invocations', ctypes.c_bool, 0, 1, 7), ('uses_sample_qualifier', ctypes.c_bool, 1, 1, 0), ('uses_sample_shading', ctypes.c_bool, 1, 1, 1), ('early_fragment_tests', ctypes.c_bool, 1, 1, 2), ('inner_coverage', ctypes.c_bool, 1, 1, 3), ('post_depth_coverage', ctypes.c_bool, 1, 1, 4), ('pixel_center_integer', ctypes.c_bool, 1, 1, 5), ('origin_upper_left', ctypes.c_bool, 1, 1, 6), ('pixel_interlock_ordered', ctypes.c_bool, 1, 1, 7), ('pixel_interlock_unordered', ctypes.c_bool, 2, 1, 0), ('sample_interlock_ordered', ctypes.c_bool, 2, 1, 1), ('sample_interlock_unordered', ctypes.c_bool, 2, 1, 2), ('untyped_color_outputs', ctypes.c_bool, 2, 1, 3), ('depth_layout', ctypes.c_uint32, 2, 3, 4), ('color0_interp', ctypes.c_uint32, 2, 3, 7), ('color0_sample', ctypes.c_bool, 3, 1, 2), ('color0_centroid', ctypes.c_bool, 3, 1, 3), ('color1_interp', ctypes.c_uint32, 3, 3, 4), ('color1_sample', ctypes.c_bool, 3, 1, 7), ('color1_centroid', ctypes.c_bool, 4, 1, 0), ('advanced_blend_modes', ctypes.c_uint32, 8), ('early_and_late_fragment_tests', ctypes.c_bool, 12, 1, 0), ('stencil_front_layout', ctypes.c_uint32, 12, 3, 1), ('stencil_back_layout', ctypes.c_uint32, 12, 3, 4)]) +@c.record +class struct_shader_info_cs(c.Struct): + SIZE = 32 + workgroup_size_hint: c.Array[ctypes.c_uint16, Literal[3]] + user_data_components_amd: int + has_variable_shared_mem: bool + has_cooperative_matrix: bool + image_block_size_per_thread_agx: int + ptr_size: int + shader_index: int + node_payloads_size: int + workgroup_count: c.Array[ctypes.c_uint32, Literal[3]] +struct_shader_info_cs.register_fields([('workgroup_size_hint', c.Array[uint16_t, Literal[3]], 0), ('user_data_components_amd', uint8_t, 6, 4, 0), ('has_variable_shared_mem', ctypes.c_bool, 6, 1, 4), ('has_cooperative_matrix', ctypes.c_bool, 6, 1, 5), ('image_block_size_per_thread_agx', uint8_t, 7), ('ptr_size', ctypes.c_uint32, 8), ('shader_index', uint32_t, 12), ('node_payloads_size', uint32_t, 16), ('workgroup_count', c.Array[uint32_t, Literal[3]], 20)]) +@c.record +class struct_shader_info_tess(c.Struct): + SIZE = 56 + _primitive_mode: int + tcs_vertices_out: int + spacing: int + ccw: bool + point_mode: bool + tcs_same_invocation_inputs_read: int + tcs_cross_invocation_inputs_read: int + tcs_cross_invocation_outputs_read: int + tcs_cross_invocation_outputs_written: int + tcs_outputs_read_by_tes: int + tcs_patch_outputs_read_by_tes: int + tcs_outputs_read_by_tes_16bit: int +enum_tess_primitive_mode: dict[int, str] = {(TESS_PRIMITIVE_UNSPECIFIED:=0): 'TESS_PRIMITIVE_UNSPECIFIED', (TESS_PRIMITIVE_TRIANGLES:=1): 'TESS_PRIMITIVE_TRIANGLES', (TESS_PRIMITIVE_QUADS:=2): 'TESS_PRIMITIVE_QUADS', (TESS_PRIMITIVE_ISOLINES:=3): 'TESS_PRIMITIVE_ISOLINES'} +struct_shader_info_tess.register_fields([('_primitive_mode', ctypes.c_uint32, 0), ('tcs_vertices_out', uint8_t, 4), ('spacing', ctypes.c_uint32, 5, 2, 0), ('ccw', ctypes.c_bool, 5, 1, 2), ('point_mode', ctypes.c_bool, 5, 1, 3), ('tcs_same_invocation_inputs_read', uint64_t, 8), ('tcs_cross_invocation_inputs_read', uint64_t, 16), ('tcs_cross_invocation_outputs_read', uint64_t, 24), ('tcs_cross_invocation_outputs_written', uint64_t, 32), ('tcs_outputs_read_by_tes', uint64_t, 40), ('tcs_patch_outputs_read_by_tes', uint32_t, 48), ('tcs_outputs_read_by_tes_16bit', uint16_t, 52)]) +@c.record +class struct_shader_info_mesh(c.Struct): + SIZE = 32 + ms_cross_invocation_output_access: int + ts_mesh_dispatch_dimensions: c.Array[ctypes.c_uint32, Literal[3]] + max_vertices_out: int + max_primitives_out: int + primitive_type: int + nv: bool +struct_shader_info_mesh.register_fields([('ms_cross_invocation_output_access', uint64_t, 0), ('ts_mesh_dispatch_dimensions', c.Array[uint32_t, Literal[3]], 8), ('max_vertices_out', uint16_t, 20), ('max_primitives_out', uint16_t, 22), ('primitive_type', ctypes.c_ubyte, 24), ('nv', ctypes.c_bool, 25)]) +struct_shader_info.register_fields([('name', c.POINTER[ctypes.c_char], 0), ('label', c.POINTER[ctypes.c_char], 8), ('internal', ctypes.c_bool, 16), ('source_blake3', blake3_hash, 17), ('stage', gl_shader_stage, 49, 8, 0), ('prev_stage', gl_shader_stage, 50, 8, 0), ('next_stage', gl_shader_stage, 51, 8, 0), ('prev_stage_has_xfb', ctypes.c_bool, 52), ('num_textures', uint8_t, 53), ('num_ubos', uint8_t, 54), ('num_abos', uint8_t, 55), ('num_ssbos', uint8_t, 56), ('num_images', uint8_t, 57), ('inputs_read', uint64_t, 64), ('dual_slot_inputs', uint64_t, 72), ('outputs_written', uint64_t, 80), ('outputs_read', uint64_t, 88), ('system_values_read', c.Array[ctypes.c_uint32, Literal[4]], 96), ('per_primitive_inputs', uint64_t, 112), ('per_primitive_outputs', uint64_t, 120), ('per_view_outputs', uint64_t, 128), ('view_mask', uint32_t, 136), ('inputs_read_16bit', uint16_t, 140), ('outputs_written_16bit', uint16_t, 142), ('outputs_read_16bit', uint16_t, 144), ('inputs_read_indirectly_16bit', uint16_t, 146), ('outputs_read_indirectly_16bit', uint16_t, 148), ('outputs_written_indirectly_16bit', uint16_t, 150), ('patch_inputs_read', uint32_t, 152), ('patch_outputs_written', uint32_t, 156), ('patch_outputs_read', uint32_t, 160), ('inputs_read_indirectly', uint64_t, 168), ('outputs_read_indirectly', uint64_t, 176), ('outputs_written_indirectly', uint64_t, 184), ('patch_inputs_read_indirectly', uint32_t, 192), ('patch_outputs_read_indirectly', uint32_t, 196), ('patch_outputs_written_indirectly', uint32_t, 200), ('textures_used', c.Array[ctypes.c_uint32, Literal[4]], 204), ('textures_used_by_txf', c.Array[ctypes.c_uint32, Literal[4]], 220), ('samplers_used', c.Array[ctypes.c_uint32, Literal[1]], 236), ('images_used', c.Array[ctypes.c_uint32, Literal[2]], 240), ('image_buffers', c.Array[ctypes.c_uint32, Literal[2]], 248), ('msaa_images', c.Array[ctypes.c_uint32, Literal[2]], 256), ('float_controls_execution_mode', uint32_t, 264), ('shared_size', ctypes.c_uint32, 268), ('task_payload_size', ctypes.c_uint32, 272), ('ray_queries', ctypes.c_uint32, 276), ('workgroup_size', c.Array[uint16_t, Literal[3]], 280), ('subgroup_size', ctypes.c_ubyte, 286), ('num_subgroups', uint8_t, 287), ('uses_wide_subgroup_intrinsics', ctypes.c_bool, 288), ('xfb_stride', c.Array[uint8_t, Literal[4]], 289), ('inlinable_uniform_dw_offsets', c.Array[uint16_t, Literal[4]], 294), ('num_inlinable_uniforms', uint8_t, 302, 4, 0), ('clip_distance_array_size', uint8_t, 302, 4, 4), ('cull_distance_array_size', uint8_t, 303, 4, 0), ('uses_texture_gather', ctypes.c_bool, 303, 1, 4), ('uses_resource_info_query', ctypes.c_bool, 303, 1, 5), ('bit_sizes_float', uint8_t, 304), ('bit_sizes_int', uint8_t, 305), ('first_ubo_is_default_ubo', ctypes.c_bool, 306, 1, 0), ('separate_shader', ctypes.c_bool, 306, 1, 1), ('has_transform_feedback_varyings', ctypes.c_bool, 306, 1, 2), ('flrp_lowered', ctypes.c_bool, 306, 1, 3), ('io_lowered', ctypes.c_bool, 306, 1, 4), ('var_copies_lowered', ctypes.c_bool, 306, 1, 5), ('writes_memory', ctypes.c_bool, 306, 1, 6), ('layer_viewport_relative', ctypes.c_bool, 306, 1, 7), ('uses_control_barrier', ctypes.c_bool, 307, 1, 0), ('uses_memory_barrier', ctypes.c_bool, 307, 1, 1), ('uses_bindless', ctypes.c_bool, 307, 1, 2), ('shared_memory_explicit_layout', ctypes.c_bool, 307, 1, 3), ('zero_initialize_shared_memory', ctypes.c_bool, 307, 1, 4), ('workgroup_size_variable', ctypes.c_bool, 307, 1, 5), ('uses_printf', ctypes.c_bool, 307, 1, 6), ('maximally_reconverges', ctypes.c_bool, 307, 1, 7), ('use_aco_amd', ctypes.c_bool, 308, 1, 0), ('use_lowered_image_to_global', ctypes.c_bool, 308, 1, 1), ('use_legacy_math_rules', ctypes.c_bool, 309), ('derivative_group', ctypes.c_uint32, 310, 2, 0), ('vs', struct_shader_info_vs, 312), ('gs', struct_shader_info_gs, 312), ('fs', struct_shader_info_fs, 312), ('cs', struct_shader_info_cs, 312), ('tess', struct_shader_info_tess, 312), ('mesh', struct_shader_info_mesh, 312)]) +class struct_nir_xfb_info(c.Struct): pass +nir_xfb_info: TypeAlias = struct_nir_xfb_info +struct_nir_shader.register_fields([('gctx', c.POINTER[gc_ctx], 0), ('variables', struct_exec_list, 8), ('options', c.POINTER[nir_shader_compiler_options], 40), ('info', struct_shader_info, 48), ('functions', struct_exec_list, 416), ('num_inputs', ctypes.c_uint32, 448), ('num_uniforms', ctypes.c_uint32, 452), ('num_outputs', ctypes.c_uint32, 456), ('global_mem_size', ctypes.c_uint32, 460), ('scratch_size', ctypes.c_uint32, 464), ('constant_data', ctypes.c_void_p, 472), ('constant_data_size', ctypes.c_uint32, 480), ('xfb_info', c.POINTER[nir_xfb_info], 488), ('printf_info_count', ctypes.c_uint32, 496), ('printf_info', c.POINTER[u_printf_info], 504), ('has_debug_info', ctypes.c_bool, 512)]) +@c.record +class struct_nir_parameter(c.Struct): + SIZE = 32 + num_components: int + bit_size: int + is_return: bool + implicit_conversion_prohibited: bool + is_uniform: bool + mode: int + driver_attributes: int + type: c.POINTER[struct_glsl_type] + name: c.POINTER[ctypes.c_char] +nir_parameter: TypeAlias = struct_nir_parameter +struct_nir_parameter.register_fields([('num_components', uint8_t, 0), ('bit_size', uint8_t, 1), ('is_return', ctypes.c_bool, 2), ('implicit_conversion_prohibited', ctypes.c_bool, 3), ('is_uniform', ctypes.c_bool, 4), ('mode', ctypes.c_uint32, 8), ('driver_attributes', uint32_t, 12), ('type', c.POINTER[struct_glsl_type], 16), ('name', c.POINTER[ctypes.c_char], 24)]) +@c.record +class struct_nir_function_impl(c.Struct): + SIZE = 144 + cf_node: struct_nir_cf_node + function: c.POINTER[struct_nir_function] + preamble: c.POINTER[struct_nir_function] + body: struct_exec_list + end_block: c.POINTER[struct_nir_block] + locals: struct_exec_list + ssa_alloc: int + num_blocks: int + structured: bool + valid_metadata: int + loop_analysis_indirect_mask: int + loop_analysis_force_unroll_sampler_indirect: bool +nir_function_impl: TypeAlias = struct_nir_function_impl +nir_metadata: dict[int, str] = {(nir_metadata_none:=0): 'nir_metadata_none', (nir_metadata_block_index:=1): 'nir_metadata_block_index', (nir_metadata_dominance:=2): 'nir_metadata_dominance', (nir_metadata_live_defs:=4): 'nir_metadata_live_defs', (nir_metadata_not_properly_reset:=8): 'nir_metadata_not_properly_reset', (nir_metadata_loop_analysis:=16): 'nir_metadata_loop_analysis', (nir_metadata_instr_index:=32): 'nir_metadata_instr_index', (nir_metadata_divergence:=64): 'nir_metadata_divergence', (nir_metadata_control_flow:=3): 'nir_metadata_control_flow', (nir_metadata_all:=-9): 'nir_metadata_all'} +struct_nir_function_impl.register_fields([('cf_node', nir_cf_node, 0), ('function', c.POINTER[nir_function], 32), ('preamble', c.POINTER[nir_function], 40), ('body', struct_exec_list, 48), ('end_block', c.POINTER[nir_block], 80), ('locals', struct_exec_list, 88), ('ssa_alloc', ctypes.c_uint32, 120), ('num_blocks', ctypes.c_uint32, 124), ('structured', ctypes.c_bool, 128), ('valid_metadata', ctypes.c_int32, 132), ('loop_analysis_indirect_mask', ctypes.c_uint32, 136), ('loop_analysis_force_unroll_sampler_indirect', ctypes.c_bool, 140)]) +struct_nir_function.register_fields([('node', struct_exec_node, 0), ('name', c.POINTER[ctypes.c_char], 16), ('shader', c.POINTER[nir_shader], 24), ('num_params', ctypes.c_uint32, 32), ('params', c.POINTER[nir_parameter], 40), ('impl', c.POINTER[nir_function_impl], 48), ('driver_attributes', uint32_t, 56), ('is_entrypoint', ctypes.c_bool, 60), ('is_exported', ctypes.c_bool, 61), ('is_preamble', ctypes.c_bool, 62), ('should_inline', ctypes.c_bool, 63), ('dont_inline', ctypes.c_bool, 64), ('workgroup_size', c.Array[ctypes.c_uint32, Literal[3]], 68), ('is_subroutine', ctypes.c_bool, 80), ('is_tmp_globals_wrapper', ctypes.c_bool, 81), ('num_subroutine_types', ctypes.c_int32, 84), ('subroutine_types', c.POINTER[c.POINTER[struct_glsl_type]], 88), ('subroutine_index', ctypes.c_int32, 96), ('pass_flags', uint32_t, 100)]) +struct_nir_call_instr.register_fields([('instr', nir_instr, 0), ('callee', c.POINTER[nir_function], 32), ('indirect_callee', nir_src, 40), ('num_params', ctypes.c_uint32, 72), ('params', c.Array[nir_src, Literal[0]], 80)]) +nir_call_instr: TypeAlias = struct_nir_call_instr +@c.record +class struct_nir_intrinsic_instr(c.Struct): + SIZE = 120 + instr: struct_nir_instr + intrinsic: int + _def: struct_nir_def + num_components: int + const_index: c.Array[ctypes.c_int32, Literal[8]] + name: c.POINTER[ctypes.c_char] + src: c.Array[struct_nir_src, Literal[0]] +nir_intrinsic_op: dict[int, str] = {(nir_intrinsic_accept_ray_intersection:=0): 'nir_intrinsic_accept_ray_intersection', (nir_intrinsic_addr_mode_is:=1): 'nir_intrinsic_addr_mode_is', (nir_intrinsic_al2p_nv:=2): 'nir_intrinsic_al2p_nv', (nir_intrinsic_ald_nv:=3): 'nir_intrinsic_ald_nv', (nir_intrinsic_alpha_to_coverage:=4): 'nir_intrinsic_alpha_to_coverage', (nir_intrinsic_as_uniform:=5): 'nir_intrinsic_as_uniform', (nir_intrinsic_ast_nv:=6): 'nir_intrinsic_ast_nv', (nir_intrinsic_atomic_add_gen_prim_count_amd:=7): 'nir_intrinsic_atomic_add_gen_prim_count_amd', (nir_intrinsic_atomic_add_gs_emit_prim_count_amd:=8): 'nir_intrinsic_atomic_add_gs_emit_prim_count_amd', (nir_intrinsic_atomic_add_shader_invocation_count_amd:=9): 'nir_intrinsic_atomic_add_shader_invocation_count_amd', (nir_intrinsic_atomic_add_xfb_prim_count_amd:=10): 'nir_intrinsic_atomic_add_xfb_prim_count_amd', (nir_intrinsic_atomic_counter_add:=11): 'nir_intrinsic_atomic_counter_add', (nir_intrinsic_atomic_counter_add_deref:=12): 'nir_intrinsic_atomic_counter_add_deref', (nir_intrinsic_atomic_counter_and:=13): 'nir_intrinsic_atomic_counter_and', (nir_intrinsic_atomic_counter_and_deref:=14): 'nir_intrinsic_atomic_counter_and_deref', (nir_intrinsic_atomic_counter_comp_swap:=15): 'nir_intrinsic_atomic_counter_comp_swap', (nir_intrinsic_atomic_counter_comp_swap_deref:=16): 'nir_intrinsic_atomic_counter_comp_swap_deref', (nir_intrinsic_atomic_counter_exchange:=17): 'nir_intrinsic_atomic_counter_exchange', (nir_intrinsic_atomic_counter_exchange_deref:=18): 'nir_intrinsic_atomic_counter_exchange_deref', (nir_intrinsic_atomic_counter_inc:=19): 'nir_intrinsic_atomic_counter_inc', (nir_intrinsic_atomic_counter_inc_deref:=20): 'nir_intrinsic_atomic_counter_inc_deref', (nir_intrinsic_atomic_counter_max:=21): 'nir_intrinsic_atomic_counter_max', (nir_intrinsic_atomic_counter_max_deref:=22): 'nir_intrinsic_atomic_counter_max_deref', (nir_intrinsic_atomic_counter_min:=23): 'nir_intrinsic_atomic_counter_min', (nir_intrinsic_atomic_counter_min_deref:=24): 'nir_intrinsic_atomic_counter_min_deref', (nir_intrinsic_atomic_counter_or:=25): 'nir_intrinsic_atomic_counter_or', (nir_intrinsic_atomic_counter_or_deref:=26): 'nir_intrinsic_atomic_counter_or_deref', (nir_intrinsic_atomic_counter_post_dec:=27): 'nir_intrinsic_atomic_counter_post_dec', (nir_intrinsic_atomic_counter_post_dec_deref:=28): 'nir_intrinsic_atomic_counter_post_dec_deref', (nir_intrinsic_atomic_counter_pre_dec:=29): 'nir_intrinsic_atomic_counter_pre_dec', (nir_intrinsic_atomic_counter_pre_dec_deref:=30): 'nir_intrinsic_atomic_counter_pre_dec_deref', (nir_intrinsic_atomic_counter_read:=31): 'nir_intrinsic_atomic_counter_read', (nir_intrinsic_atomic_counter_read_deref:=32): 'nir_intrinsic_atomic_counter_read_deref', (nir_intrinsic_atomic_counter_xor:=33): 'nir_intrinsic_atomic_counter_xor', (nir_intrinsic_atomic_counter_xor_deref:=34): 'nir_intrinsic_atomic_counter_xor_deref', (nir_intrinsic_ballot:=35): 'nir_intrinsic_ballot', (nir_intrinsic_ballot_bit_count_exclusive:=36): 'nir_intrinsic_ballot_bit_count_exclusive', (nir_intrinsic_ballot_bit_count_inclusive:=37): 'nir_intrinsic_ballot_bit_count_inclusive', (nir_intrinsic_ballot_bit_count_reduce:=38): 'nir_intrinsic_ballot_bit_count_reduce', (nir_intrinsic_ballot_bitfield_extract:=39): 'nir_intrinsic_ballot_bitfield_extract', (nir_intrinsic_ballot_find_lsb:=40): 'nir_intrinsic_ballot_find_lsb', (nir_intrinsic_ballot_find_msb:=41): 'nir_intrinsic_ballot_find_msb', (nir_intrinsic_ballot_relaxed:=42): 'nir_intrinsic_ballot_relaxed', (nir_intrinsic_bar_break_nv:=43): 'nir_intrinsic_bar_break_nv', (nir_intrinsic_bar_set_nv:=44): 'nir_intrinsic_bar_set_nv', (nir_intrinsic_bar_sync_nv:=45): 'nir_intrinsic_bar_sync_nv', (nir_intrinsic_barrier:=46): 'nir_intrinsic_barrier', (nir_intrinsic_begin_invocation_interlock:=47): 'nir_intrinsic_begin_invocation_interlock', (nir_intrinsic_bindgen_return:=48): 'nir_intrinsic_bindgen_return', (nir_intrinsic_bindless_image_agx:=49): 'nir_intrinsic_bindless_image_agx', (nir_intrinsic_bindless_image_atomic:=50): 'nir_intrinsic_bindless_image_atomic', (nir_intrinsic_bindless_image_atomic_swap:=51): 'nir_intrinsic_bindless_image_atomic_swap', (nir_intrinsic_bindless_image_descriptor_amd:=52): 'nir_intrinsic_bindless_image_descriptor_amd', (nir_intrinsic_bindless_image_format:=53): 'nir_intrinsic_bindless_image_format', (nir_intrinsic_bindless_image_fragment_mask_load_amd:=54): 'nir_intrinsic_bindless_image_fragment_mask_load_amd', (nir_intrinsic_bindless_image_levels:=55): 'nir_intrinsic_bindless_image_levels', (nir_intrinsic_bindless_image_load:=56): 'nir_intrinsic_bindless_image_load', (nir_intrinsic_bindless_image_load_raw_intel:=57): 'nir_intrinsic_bindless_image_load_raw_intel', (nir_intrinsic_bindless_image_order:=58): 'nir_intrinsic_bindless_image_order', (nir_intrinsic_bindless_image_samples:=59): 'nir_intrinsic_bindless_image_samples', (nir_intrinsic_bindless_image_samples_identical:=60): 'nir_intrinsic_bindless_image_samples_identical', (nir_intrinsic_bindless_image_size:=61): 'nir_intrinsic_bindless_image_size', (nir_intrinsic_bindless_image_sparse_load:=62): 'nir_intrinsic_bindless_image_sparse_load', (nir_intrinsic_bindless_image_store:=63): 'nir_intrinsic_bindless_image_store', (nir_intrinsic_bindless_image_store_block_agx:=64): 'nir_intrinsic_bindless_image_store_block_agx', (nir_intrinsic_bindless_image_store_raw_intel:=65): 'nir_intrinsic_bindless_image_store_raw_intel', (nir_intrinsic_bindless_image_texel_address:=66): 'nir_intrinsic_bindless_image_texel_address', (nir_intrinsic_bindless_resource_ir3:=67): 'nir_intrinsic_bindless_resource_ir3', (nir_intrinsic_brcst_active_ir3:=68): 'nir_intrinsic_brcst_active_ir3', (nir_intrinsic_btd_retire_intel:=69): 'nir_intrinsic_btd_retire_intel', (nir_intrinsic_btd_spawn_intel:=70): 'nir_intrinsic_btd_spawn_intel', (nir_intrinsic_btd_stack_push_intel:=71): 'nir_intrinsic_btd_stack_push_intel', (nir_intrinsic_bvh64_intersect_ray_amd:=72): 'nir_intrinsic_bvh64_intersect_ray_amd', (nir_intrinsic_bvh8_intersect_ray_amd:=73): 'nir_intrinsic_bvh8_intersect_ray_amd', (nir_intrinsic_bvh_stack_rtn_amd:=74): 'nir_intrinsic_bvh_stack_rtn_amd', (nir_intrinsic_cmat_binary_op:=75): 'nir_intrinsic_cmat_binary_op', (nir_intrinsic_cmat_bitcast:=76): 'nir_intrinsic_cmat_bitcast', (nir_intrinsic_cmat_construct:=77): 'nir_intrinsic_cmat_construct', (nir_intrinsic_cmat_convert:=78): 'nir_intrinsic_cmat_convert', (nir_intrinsic_cmat_copy:=79): 'nir_intrinsic_cmat_copy', (nir_intrinsic_cmat_extract:=80): 'nir_intrinsic_cmat_extract', (nir_intrinsic_cmat_insert:=81): 'nir_intrinsic_cmat_insert', (nir_intrinsic_cmat_length:=82): 'nir_intrinsic_cmat_length', (nir_intrinsic_cmat_load:=83): 'nir_intrinsic_cmat_load', (nir_intrinsic_cmat_muladd:=84): 'nir_intrinsic_cmat_muladd', (nir_intrinsic_cmat_muladd_amd:=85): 'nir_intrinsic_cmat_muladd_amd', (nir_intrinsic_cmat_muladd_nv:=86): 'nir_intrinsic_cmat_muladd_nv', (nir_intrinsic_cmat_scalar_op:=87): 'nir_intrinsic_cmat_scalar_op', (nir_intrinsic_cmat_store:=88): 'nir_intrinsic_cmat_store', (nir_intrinsic_cmat_transpose:=89): 'nir_intrinsic_cmat_transpose', (nir_intrinsic_cmat_unary_op:=90): 'nir_intrinsic_cmat_unary_op', (nir_intrinsic_convert_alu_types:=91): 'nir_intrinsic_convert_alu_types', (nir_intrinsic_convert_cmat_intel:=92): 'nir_intrinsic_convert_cmat_intel', (nir_intrinsic_copy_deref:=93): 'nir_intrinsic_copy_deref', (nir_intrinsic_copy_fs_outputs_nv:=94): 'nir_intrinsic_copy_fs_outputs_nv', (nir_intrinsic_copy_global_to_uniform_ir3:=95): 'nir_intrinsic_copy_global_to_uniform_ir3', (nir_intrinsic_copy_push_const_to_uniform_ir3:=96): 'nir_intrinsic_copy_push_const_to_uniform_ir3', (nir_intrinsic_copy_ubo_to_uniform_ir3:=97): 'nir_intrinsic_copy_ubo_to_uniform_ir3', (nir_intrinsic_ddx:=98): 'nir_intrinsic_ddx', (nir_intrinsic_ddx_coarse:=99): 'nir_intrinsic_ddx_coarse', (nir_intrinsic_ddx_fine:=100): 'nir_intrinsic_ddx_fine', (nir_intrinsic_ddy:=101): 'nir_intrinsic_ddy', (nir_intrinsic_ddy_coarse:=102): 'nir_intrinsic_ddy_coarse', (nir_intrinsic_ddy_fine:=103): 'nir_intrinsic_ddy_fine', (nir_intrinsic_debug_break:=104): 'nir_intrinsic_debug_break', (nir_intrinsic_decl_reg:=105): 'nir_intrinsic_decl_reg', (nir_intrinsic_demote:=106): 'nir_intrinsic_demote', (nir_intrinsic_demote_if:=107): 'nir_intrinsic_demote_if', (nir_intrinsic_demote_samples:=108): 'nir_intrinsic_demote_samples', (nir_intrinsic_deref_atomic:=109): 'nir_intrinsic_deref_atomic', (nir_intrinsic_deref_atomic_swap:=110): 'nir_intrinsic_deref_atomic_swap', (nir_intrinsic_deref_buffer_array_length:=111): 'nir_intrinsic_deref_buffer_array_length', (nir_intrinsic_deref_implicit_array_length:=112): 'nir_intrinsic_deref_implicit_array_length', (nir_intrinsic_deref_mode_is:=113): 'nir_intrinsic_deref_mode_is', (nir_intrinsic_deref_texture_src:=114): 'nir_intrinsic_deref_texture_src', (nir_intrinsic_doorbell_agx:=115): 'nir_intrinsic_doorbell_agx', (nir_intrinsic_dpas_intel:=116): 'nir_intrinsic_dpas_intel', (nir_intrinsic_dpp16_shift_amd:=117): 'nir_intrinsic_dpp16_shift_amd', (nir_intrinsic_elect:=118): 'nir_intrinsic_elect', (nir_intrinsic_elect_any_ir3:=119): 'nir_intrinsic_elect_any_ir3', (nir_intrinsic_emit_primitive_poly:=120): 'nir_intrinsic_emit_primitive_poly', (nir_intrinsic_emit_vertex:=121): 'nir_intrinsic_emit_vertex', (nir_intrinsic_emit_vertex_nv:=122): 'nir_intrinsic_emit_vertex_nv', (nir_intrinsic_emit_vertex_with_counter:=123): 'nir_intrinsic_emit_vertex_with_counter', (nir_intrinsic_end_invocation_interlock:=124): 'nir_intrinsic_end_invocation_interlock', (nir_intrinsic_end_primitive:=125): 'nir_intrinsic_end_primitive', (nir_intrinsic_end_primitive_nv:=126): 'nir_intrinsic_end_primitive_nv', (nir_intrinsic_end_primitive_with_counter:=127): 'nir_intrinsic_end_primitive_with_counter', (nir_intrinsic_enqueue_node_payloads:=128): 'nir_intrinsic_enqueue_node_payloads', (nir_intrinsic_exclusive_scan:=129): 'nir_intrinsic_exclusive_scan', (nir_intrinsic_exclusive_scan_clusters_ir3:=130): 'nir_intrinsic_exclusive_scan_clusters_ir3', (nir_intrinsic_execute_callable:=131): 'nir_intrinsic_execute_callable', (nir_intrinsic_execute_closest_hit_amd:=132): 'nir_intrinsic_execute_closest_hit_amd', (nir_intrinsic_execute_miss_amd:=133): 'nir_intrinsic_execute_miss_amd', (nir_intrinsic_export_agx:=134): 'nir_intrinsic_export_agx', (nir_intrinsic_export_amd:=135): 'nir_intrinsic_export_amd', (nir_intrinsic_export_dual_src_blend_amd:=136): 'nir_intrinsic_export_dual_src_blend_amd', (nir_intrinsic_export_row_amd:=137): 'nir_intrinsic_export_row_amd', (nir_intrinsic_fence_helper_exit_agx:=138): 'nir_intrinsic_fence_helper_exit_agx', (nir_intrinsic_fence_mem_to_tex_agx:=139): 'nir_intrinsic_fence_mem_to_tex_agx', (nir_intrinsic_fence_pbe_to_tex_agx:=140): 'nir_intrinsic_fence_pbe_to_tex_agx', (nir_intrinsic_fence_pbe_to_tex_pixel_agx:=141): 'nir_intrinsic_fence_pbe_to_tex_pixel_agx', (nir_intrinsic_final_primitive_nv:=142): 'nir_intrinsic_final_primitive_nv', (nir_intrinsic_finalize_incoming_node_payload:=143): 'nir_intrinsic_finalize_incoming_node_payload', (nir_intrinsic_first_invocation:=144): 'nir_intrinsic_first_invocation', (nir_intrinsic_fs_out_nv:=145): 'nir_intrinsic_fs_out_nv', (nir_intrinsic_gds_atomic_add_amd:=146): 'nir_intrinsic_gds_atomic_add_amd', (nir_intrinsic_get_ssbo_size:=147): 'nir_intrinsic_get_ssbo_size', (nir_intrinsic_get_ubo_size:=148): 'nir_intrinsic_get_ubo_size', (nir_intrinsic_global_atomic:=149): 'nir_intrinsic_global_atomic', (nir_intrinsic_global_atomic_2x32:=150): 'nir_intrinsic_global_atomic_2x32', (nir_intrinsic_global_atomic_agx:=151): 'nir_intrinsic_global_atomic_agx', (nir_intrinsic_global_atomic_amd:=152): 'nir_intrinsic_global_atomic_amd', (nir_intrinsic_global_atomic_swap:=153): 'nir_intrinsic_global_atomic_swap', (nir_intrinsic_global_atomic_swap_2x32:=154): 'nir_intrinsic_global_atomic_swap_2x32', (nir_intrinsic_global_atomic_swap_agx:=155): 'nir_intrinsic_global_atomic_swap_agx', (nir_intrinsic_global_atomic_swap_amd:=156): 'nir_intrinsic_global_atomic_swap_amd', (nir_intrinsic_ignore_ray_intersection:=157): 'nir_intrinsic_ignore_ray_intersection', (nir_intrinsic_imadsp_nv:=158): 'nir_intrinsic_imadsp_nv', (nir_intrinsic_image_atomic:=159): 'nir_intrinsic_image_atomic', (nir_intrinsic_image_atomic_swap:=160): 'nir_intrinsic_image_atomic_swap', (nir_intrinsic_image_deref_atomic:=161): 'nir_intrinsic_image_deref_atomic', (nir_intrinsic_image_deref_atomic_swap:=162): 'nir_intrinsic_image_deref_atomic_swap', (nir_intrinsic_image_deref_descriptor_amd:=163): 'nir_intrinsic_image_deref_descriptor_amd', (nir_intrinsic_image_deref_format:=164): 'nir_intrinsic_image_deref_format', (nir_intrinsic_image_deref_fragment_mask_load_amd:=165): 'nir_intrinsic_image_deref_fragment_mask_load_amd', (nir_intrinsic_image_deref_levels:=166): 'nir_intrinsic_image_deref_levels', (nir_intrinsic_image_deref_load:=167): 'nir_intrinsic_image_deref_load', (nir_intrinsic_image_deref_load_info_nv:=168): 'nir_intrinsic_image_deref_load_info_nv', (nir_intrinsic_image_deref_load_param_intel:=169): 'nir_intrinsic_image_deref_load_param_intel', (nir_intrinsic_image_deref_load_raw_intel:=170): 'nir_intrinsic_image_deref_load_raw_intel', (nir_intrinsic_image_deref_order:=171): 'nir_intrinsic_image_deref_order', (nir_intrinsic_image_deref_samples:=172): 'nir_intrinsic_image_deref_samples', (nir_intrinsic_image_deref_samples_identical:=173): 'nir_intrinsic_image_deref_samples_identical', (nir_intrinsic_image_deref_size:=174): 'nir_intrinsic_image_deref_size', (nir_intrinsic_image_deref_sparse_load:=175): 'nir_intrinsic_image_deref_sparse_load', (nir_intrinsic_image_deref_store:=176): 'nir_intrinsic_image_deref_store', (nir_intrinsic_image_deref_store_block_agx:=177): 'nir_intrinsic_image_deref_store_block_agx', (nir_intrinsic_image_deref_store_raw_intel:=178): 'nir_intrinsic_image_deref_store_raw_intel', (nir_intrinsic_image_deref_texel_address:=179): 'nir_intrinsic_image_deref_texel_address', (nir_intrinsic_image_descriptor_amd:=180): 'nir_intrinsic_image_descriptor_amd', (nir_intrinsic_image_format:=181): 'nir_intrinsic_image_format', (nir_intrinsic_image_fragment_mask_load_amd:=182): 'nir_intrinsic_image_fragment_mask_load_amd', (nir_intrinsic_image_levels:=183): 'nir_intrinsic_image_levels', (nir_intrinsic_image_load:=184): 'nir_intrinsic_image_load', (nir_intrinsic_image_load_raw_intel:=185): 'nir_intrinsic_image_load_raw_intel', (nir_intrinsic_image_order:=186): 'nir_intrinsic_image_order', (nir_intrinsic_image_samples:=187): 'nir_intrinsic_image_samples', (nir_intrinsic_image_samples_identical:=188): 'nir_intrinsic_image_samples_identical', (nir_intrinsic_image_size:=189): 'nir_intrinsic_image_size', (nir_intrinsic_image_sparse_load:=190): 'nir_intrinsic_image_sparse_load', (nir_intrinsic_image_store:=191): 'nir_intrinsic_image_store', (nir_intrinsic_image_store_block_agx:=192): 'nir_intrinsic_image_store_block_agx', (nir_intrinsic_image_store_raw_intel:=193): 'nir_intrinsic_image_store_raw_intel', (nir_intrinsic_image_texel_address:=194): 'nir_intrinsic_image_texel_address', (nir_intrinsic_inclusive_scan:=195): 'nir_intrinsic_inclusive_scan', (nir_intrinsic_inclusive_scan_clusters_ir3:=196): 'nir_intrinsic_inclusive_scan_clusters_ir3', (nir_intrinsic_initialize_node_payloads:=197): 'nir_intrinsic_initialize_node_payloads', (nir_intrinsic_interp_deref_at_centroid:=198): 'nir_intrinsic_interp_deref_at_centroid', (nir_intrinsic_interp_deref_at_offset:=199): 'nir_intrinsic_interp_deref_at_offset', (nir_intrinsic_interp_deref_at_sample:=200): 'nir_intrinsic_interp_deref_at_sample', (nir_intrinsic_interp_deref_at_vertex:=201): 'nir_intrinsic_interp_deref_at_vertex', (nir_intrinsic_inverse_ballot:=202): 'nir_intrinsic_inverse_ballot', (nir_intrinsic_ipa_nv:=203): 'nir_intrinsic_ipa_nv', (nir_intrinsic_is_helper_invocation:=204): 'nir_intrinsic_is_helper_invocation', (nir_intrinsic_is_sparse_resident_zink:=205): 'nir_intrinsic_is_sparse_resident_zink', (nir_intrinsic_is_sparse_texels_resident:=206): 'nir_intrinsic_is_sparse_texels_resident', (nir_intrinsic_is_subgroup_invocation_lt_amd:=207): 'nir_intrinsic_is_subgroup_invocation_lt_amd', (nir_intrinsic_isberd_nv:=208): 'nir_intrinsic_isberd_nv', (nir_intrinsic_lane_permute_16_amd:=209): 'nir_intrinsic_lane_permute_16_amd', (nir_intrinsic_last_invocation:=210): 'nir_intrinsic_last_invocation', (nir_intrinsic_launch_mesh_workgroups:=211): 'nir_intrinsic_launch_mesh_workgroups', (nir_intrinsic_launch_mesh_workgroups_with_payload_deref:=212): 'nir_intrinsic_launch_mesh_workgroups_with_payload_deref', (nir_intrinsic_ldc_nv:=213): 'nir_intrinsic_ldc_nv', (nir_intrinsic_ldcx_nv:=214): 'nir_intrinsic_ldcx_nv', (nir_intrinsic_ldtram_nv:=215): 'nir_intrinsic_ldtram_nv', (nir_intrinsic_load_aa_line_width:=216): 'nir_intrinsic_load_aa_line_width', (nir_intrinsic_load_accel_struct_amd:=217): 'nir_intrinsic_load_accel_struct_amd', (nir_intrinsic_load_active_samples_agx:=218): 'nir_intrinsic_load_active_samples_agx', (nir_intrinsic_load_active_subgroup_count_agx:=219): 'nir_intrinsic_load_active_subgroup_count_agx', (nir_intrinsic_load_active_subgroup_invocation_agx:=220): 'nir_intrinsic_load_active_subgroup_invocation_agx', (nir_intrinsic_load_agx:=221): 'nir_intrinsic_load_agx', (nir_intrinsic_load_alpha_reference_amd:=222): 'nir_intrinsic_load_alpha_reference_amd', (nir_intrinsic_load_api_sample_mask_agx:=223): 'nir_intrinsic_load_api_sample_mask_agx', (nir_intrinsic_load_attrib_clamp_agx:=224): 'nir_intrinsic_load_attrib_clamp_agx', (nir_intrinsic_load_attribute_pan:=225): 'nir_intrinsic_load_attribute_pan', (nir_intrinsic_load_back_face_agx:=226): 'nir_intrinsic_load_back_face_agx', (nir_intrinsic_load_barycentric_at_offset:=227): 'nir_intrinsic_load_barycentric_at_offset', (nir_intrinsic_load_barycentric_at_offset_nv:=228): 'nir_intrinsic_load_barycentric_at_offset_nv', (nir_intrinsic_load_barycentric_at_sample:=229): 'nir_intrinsic_load_barycentric_at_sample', (nir_intrinsic_load_barycentric_centroid:=230): 'nir_intrinsic_load_barycentric_centroid', (nir_intrinsic_load_barycentric_coord_at_offset:=231): 'nir_intrinsic_load_barycentric_coord_at_offset', (nir_intrinsic_load_barycentric_coord_at_sample:=232): 'nir_intrinsic_load_barycentric_coord_at_sample', (nir_intrinsic_load_barycentric_coord_centroid:=233): 'nir_intrinsic_load_barycentric_coord_centroid', (nir_intrinsic_load_barycentric_coord_pixel:=234): 'nir_intrinsic_load_barycentric_coord_pixel', (nir_intrinsic_load_barycentric_coord_sample:=235): 'nir_intrinsic_load_barycentric_coord_sample', (nir_intrinsic_load_barycentric_model:=236): 'nir_intrinsic_load_barycentric_model', (nir_intrinsic_load_barycentric_optimize_amd:=237): 'nir_intrinsic_load_barycentric_optimize_amd', (nir_intrinsic_load_barycentric_pixel:=238): 'nir_intrinsic_load_barycentric_pixel', (nir_intrinsic_load_barycentric_sample:=239): 'nir_intrinsic_load_barycentric_sample', (nir_intrinsic_load_base_global_invocation_id:=240): 'nir_intrinsic_load_base_global_invocation_id', (nir_intrinsic_load_base_instance:=241): 'nir_intrinsic_load_base_instance', (nir_intrinsic_load_base_vertex:=242): 'nir_intrinsic_load_base_vertex', (nir_intrinsic_load_base_workgroup_id:=243): 'nir_intrinsic_load_base_workgroup_id', (nir_intrinsic_load_blend_const_color_a_float:=244): 'nir_intrinsic_load_blend_const_color_a_float', (nir_intrinsic_load_blend_const_color_aaaa8888_unorm:=245): 'nir_intrinsic_load_blend_const_color_aaaa8888_unorm', (nir_intrinsic_load_blend_const_color_b_float:=246): 'nir_intrinsic_load_blend_const_color_b_float', (nir_intrinsic_load_blend_const_color_g_float:=247): 'nir_intrinsic_load_blend_const_color_g_float', (nir_intrinsic_load_blend_const_color_r_float:=248): 'nir_intrinsic_load_blend_const_color_r_float', (nir_intrinsic_load_blend_const_color_rgba:=249): 'nir_intrinsic_load_blend_const_color_rgba', (nir_intrinsic_load_blend_const_color_rgba8888_unorm:=250): 'nir_intrinsic_load_blend_const_color_rgba8888_unorm', (nir_intrinsic_load_btd_global_arg_addr_intel:=251): 'nir_intrinsic_load_btd_global_arg_addr_intel', (nir_intrinsic_load_btd_local_arg_addr_intel:=252): 'nir_intrinsic_load_btd_local_arg_addr_intel', (nir_intrinsic_load_btd_resume_sbt_addr_intel:=253): 'nir_intrinsic_load_btd_resume_sbt_addr_intel', (nir_intrinsic_load_btd_shader_type_intel:=254): 'nir_intrinsic_load_btd_shader_type_intel', (nir_intrinsic_load_btd_stack_id_intel:=255): 'nir_intrinsic_load_btd_stack_id_intel', (nir_intrinsic_load_buffer_amd:=256): 'nir_intrinsic_load_buffer_amd', (nir_intrinsic_load_callable_sbt_addr_intel:=257): 'nir_intrinsic_load_callable_sbt_addr_intel', (nir_intrinsic_load_callable_sbt_stride_intel:=258): 'nir_intrinsic_load_callable_sbt_stride_intel', (nir_intrinsic_load_clamp_vertex_color_amd:=259): 'nir_intrinsic_load_clamp_vertex_color_amd', (nir_intrinsic_load_clip_half_line_width_amd:=260): 'nir_intrinsic_load_clip_half_line_width_amd', (nir_intrinsic_load_clip_z_coeff_agx:=261): 'nir_intrinsic_load_clip_z_coeff_agx', (nir_intrinsic_load_coalesced_input_count:=262): 'nir_intrinsic_load_coalesced_input_count', (nir_intrinsic_load_coefficients_agx:=263): 'nir_intrinsic_load_coefficients_agx', (nir_intrinsic_load_color0:=264): 'nir_intrinsic_load_color0', (nir_intrinsic_load_color1:=265): 'nir_intrinsic_load_color1', (nir_intrinsic_load_const_buf_base_addr_lvp:=266): 'nir_intrinsic_load_const_buf_base_addr_lvp', (nir_intrinsic_load_const_ir3:=267): 'nir_intrinsic_load_const_ir3', (nir_intrinsic_load_constant:=268): 'nir_intrinsic_load_constant', (nir_intrinsic_load_constant_agx:=269): 'nir_intrinsic_load_constant_agx', (nir_intrinsic_load_constant_base_ptr:=270): 'nir_intrinsic_load_constant_base_ptr', (nir_intrinsic_load_converted_output_pan:=271): 'nir_intrinsic_load_converted_output_pan', (nir_intrinsic_load_core_id_agx:=272): 'nir_intrinsic_load_core_id_agx', (nir_intrinsic_load_cull_any_enabled_amd:=273): 'nir_intrinsic_load_cull_any_enabled_amd', (nir_intrinsic_load_cull_back_face_enabled_amd:=274): 'nir_intrinsic_load_cull_back_face_enabled_amd', (nir_intrinsic_load_cull_ccw_amd:=275): 'nir_intrinsic_load_cull_ccw_amd', (nir_intrinsic_load_cull_front_face_enabled_amd:=276): 'nir_intrinsic_load_cull_front_face_enabled_amd', (nir_intrinsic_load_cull_line_viewport_xy_scale_and_offset_amd:=277): 'nir_intrinsic_load_cull_line_viewport_xy_scale_and_offset_amd', (nir_intrinsic_load_cull_mask:=278): 'nir_intrinsic_load_cull_mask', (nir_intrinsic_load_cull_mask_and_flags_amd:=279): 'nir_intrinsic_load_cull_mask_and_flags_amd', (nir_intrinsic_load_cull_small_line_precision_amd:=280): 'nir_intrinsic_load_cull_small_line_precision_amd', (nir_intrinsic_load_cull_small_lines_enabled_amd:=281): 'nir_intrinsic_load_cull_small_lines_enabled_amd', (nir_intrinsic_load_cull_small_triangle_precision_amd:=282): 'nir_intrinsic_load_cull_small_triangle_precision_amd', (nir_intrinsic_load_cull_small_triangles_enabled_amd:=283): 'nir_intrinsic_load_cull_small_triangles_enabled_amd', (nir_intrinsic_load_cull_triangle_viewport_xy_scale_and_offset_amd:=284): 'nir_intrinsic_load_cull_triangle_viewport_xy_scale_and_offset_amd', (nir_intrinsic_load_debug_log_desc_amd:=285): 'nir_intrinsic_load_debug_log_desc_amd', (nir_intrinsic_load_depth_never_agx:=286): 'nir_intrinsic_load_depth_never_agx', (nir_intrinsic_load_deref:=287): 'nir_intrinsic_load_deref', (nir_intrinsic_load_deref_block_intel:=288): 'nir_intrinsic_load_deref_block_intel', (nir_intrinsic_load_draw_id:=289): 'nir_intrinsic_load_draw_id', (nir_intrinsic_load_esgs_vertex_stride_amd:=290): 'nir_intrinsic_load_esgs_vertex_stride_amd', (nir_intrinsic_load_exported_agx:=291): 'nir_intrinsic_load_exported_agx', (nir_intrinsic_load_fb_layers_v3d:=292): 'nir_intrinsic_load_fb_layers_v3d', (nir_intrinsic_load_fbfetch_image_desc_amd:=293): 'nir_intrinsic_load_fbfetch_image_desc_amd', (nir_intrinsic_load_fbfetch_image_fmask_desc_amd:=294): 'nir_intrinsic_load_fbfetch_image_fmask_desc_amd', (nir_intrinsic_load_fep_w_v3d:=295): 'nir_intrinsic_load_fep_w_v3d', (nir_intrinsic_load_first_vertex:=296): 'nir_intrinsic_load_first_vertex', (nir_intrinsic_load_fixed_point_size_agx:=297): 'nir_intrinsic_load_fixed_point_size_agx', (nir_intrinsic_load_flat_mask:=298): 'nir_intrinsic_load_flat_mask', (nir_intrinsic_load_force_vrs_rates_amd:=299): 'nir_intrinsic_load_force_vrs_rates_amd', (nir_intrinsic_load_frag_coord:=300): 'nir_intrinsic_load_frag_coord', (nir_intrinsic_load_frag_coord_unscaled_ir3:=301): 'nir_intrinsic_load_frag_coord_unscaled_ir3', (nir_intrinsic_load_frag_coord_w:=302): 'nir_intrinsic_load_frag_coord_w', (nir_intrinsic_load_frag_coord_z:=303): 'nir_intrinsic_load_frag_coord_z', (nir_intrinsic_load_frag_coord_zw_pan:=304): 'nir_intrinsic_load_frag_coord_zw_pan', (nir_intrinsic_load_frag_invocation_count:=305): 'nir_intrinsic_load_frag_invocation_count', (nir_intrinsic_load_frag_offset_ir3:=306): 'nir_intrinsic_load_frag_offset_ir3', (nir_intrinsic_load_frag_shading_rate:=307): 'nir_intrinsic_load_frag_shading_rate', (nir_intrinsic_load_frag_size:=308): 'nir_intrinsic_load_frag_size', (nir_intrinsic_load_frag_size_ir3:=309): 'nir_intrinsic_load_frag_size_ir3', (nir_intrinsic_load_from_texture_handle_agx:=310): 'nir_intrinsic_load_from_texture_handle_agx', (nir_intrinsic_load_front_face:=311): 'nir_intrinsic_load_front_face', (nir_intrinsic_load_front_face_fsign:=312): 'nir_intrinsic_load_front_face_fsign', (nir_intrinsic_load_fs_input_interp_deltas:=313): 'nir_intrinsic_load_fs_input_interp_deltas', (nir_intrinsic_load_fs_msaa_intel:=314): 'nir_intrinsic_load_fs_msaa_intel', (nir_intrinsic_load_fully_covered:=315): 'nir_intrinsic_load_fully_covered', (nir_intrinsic_load_geometry_param_buffer_poly:=316): 'nir_intrinsic_load_geometry_param_buffer_poly', (nir_intrinsic_load_global:=317): 'nir_intrinsic_load_global', (nir_intrinsic_load_global_2x32:=318): 'nir_intrinsic_load_global_2x32', (nir_intrinsic_load_global_amd:=319): 'nir_intrinsic_load_global_amd', (nir_intrinsic_load_global_base_ptr:=320): 'nir_intrinsic_load_global_base_ptr', (nir_intrinsic_load_global_block_intel:=321): 'nir_intrinsic_load_global_block_intel', (nir_intrinsic_load_global_bounded:=322): 'nir_intrinsic_load_global_bounded', (nir_intrinsic_load_global_constant:=323): 'nir_intrinsic_load_global_constant', (nir_intrinsic_load_global_constant_bounded:=324): 'nir_intrinsic_load_global_constant_bounded', (nir_intrinsic_load_global_constant_offset:=325): 'nir_intrinsic_load_global_constant_offset', (nir_intrinsic_load_global_constant_uniform_block_intel:=326): 'nir_intrinsic_load_global_constant_uniform_block_intel', (nir_intrinsic_load_global_etna:=327): 'nir_intrinsic_load_global_etna', (nir_intrinsic_load_global_invocation_id:=328): 'nir_intrinsic_load_global_invocation_id', (nir_intrinsic_load_global_invocation_index:=329): 'nir_intrinsic_load_global_invocation_index', (nir_intrinsic_load_global_ir3:=330): 'nir_intrinsic_load_global_ir3', (nir_intrinsic_load_global_size:=331): 'nir_intrinsic_load_global_size', (nir_intrinsic_load_gs_header_ir3:=332): 'nir_intrinsic_load_gs_header_ir3', (nir_intrinsic_load_gs_vertex_offset_amd:=333): 'nir_intrinsic_load_gs_vertex_offset_amd', (nir_intrinsic_load_gs_wave_id_amd:=334): 'nir_intrinsic_load_gs_wave_id_amd', (nir_intrinsic_load_helper_arg_hi_agx:=335): 'nir_intrinsic_load_helper_arg_hi_agx', (nir_intrinsic_load_helper_arg_lo_agx:=336): 'nir_intrinsic_load_helper_arg_lo_agx', (nir_intrinsic_load_helper_invocation:=337): 'nir_intrinsic_load_helper_invocation', (nir_intrinsic_load_helper_op_id_agx:=338): 'nir_intrinsic_load_helper_op_id_agx', (nir_intrinsic_load_hit_attrib_amd:=339): 'nir_intrinsic_load_hit_attrib_amd', (nir_intrinsic_load_hs_out_patch_data_offset_amd:=340): 'nir_intrinsic_load_hs_out_patch_data_offset_amd', (nir_intrinsic_load_hs_patch_stride_ir3:=341): 'nir_intrinsic_load_hs_patch_stride_ir3', (nir_intrinsic_load_initial_edgeflags_amd:=342): 'nir_intrinsic_load_initial_edgeflags_amd', (nir_intrinsic_load_inline_data_intel:=343): 'nir_intrinsic_load_inline_data_intel', (nir_intrinsic_load_input:=344): 'nir_intrinsic_load_input', (nir_intrinsic_load_input_assembly_buffer_poly:=345): 'nir_intrinsic_load_input_assembly_buffer_poly', (nir_intrinsic_load_input_attachment_conv_pan:=346): 'nir_intrinsic_load_input_attachment_conv_pan', (nir_intrinsic_load_input_attachment_coord:=347): 'nir_intrinsic_load_input_attachment_coord', (nir_intrinsic_load_input_attachment_target_pan:=348): 'nir_intrinsic_load_input_attachment_target_pan', (nir_intrinsic_load_input_topology_poly:=349): 'nir_intrinsic_load_input_topology_poly', (nir_intrinsic_load_input_vertex:=350): 'nir_intrinsic_load_input_vertex', (nir_intrinsic_load_instance_id:=351): 'nir_intrinsic_load_instance_id', (nir_intrinsic_load_interpolated_input:=352): 'nir_intrinsic_load_interpolated_input', (nir_intrinsic_load_intersection_opaque_amd:=353): 'nir_intrinsic_load_intersection_opaque_amd', (nir_intrinsic_load_invocation_id:=354): 'nir_intrinsic_load_invocation_id', (nir_intrinsic_load_is_first_fan_agx:=355): 'nir_intrinsic_load_is_first_fan_agx', (nir_intrinsic_load_is_indexed_draw:=356): 'nir_intrinsic_load_is_indexed_draw', (nir_intrinsic_load_kernel_input:=357): 'nir_intrinsic_load_kernel_input', (nir_intrinsic_load_layer_id:=358): 'nir_intrinsic_load_layer_id', (nir_intrinsic_load_lds_ngg_gs_out_vertex_base_amd:=359): 'nir_intrinsic_load_lds_ngg_gs_out_vertex_base_amd', (nir_intrinsic_load_leaf_opaque_intel:=360): 'nir_intrinsic_load_leaf_opaque_intel', (nir_intrinsic_load_leaf_procedural_intel:=361): 'nir_intrinsic_load_leaf_procedural_intel', (nir_intrinsic_load_line_coord:=362): 'nir_intrinsic_load_line_coord', (nir_intrinsic_load_line_width:=363): 'nir_intrinsic_load_line_width', (nir_intrinsic_load_local_invocation_id:=364): 'nir_intrinsic_load_local_invocation_id', (nir_intrinsic_load_local_invocation_index:=365): 'nir_intrinsic_load_local_invocation_index', (nir_intrinsic_load_local_pixel_agx:=366): 'nir_intrinsic_load_local_pixel_agx', (nir_intrinsic_load_local_shared_r600:=367): 'nir_intrinsic_load_local_shared_r600', (nir_intrinsic_load_lshs_vertex_stride_amd:=368): 'nir_intrinsic_load_lshs_vertex_stride_amd', (nir_intrinsic_load_max_polygon_intel:=369): 'nir_intrinsic_load_max_polygon_intel', (nir_intrinsic_load_merged_wave_info_amd:=370): 'nir_intrinsic_load_merged_wave_info_amd', (nir_intrinsic_load_mesh_view_count:=371): 'nir_intrinsic_load_mesh_view_count', (nir_intrinsic_load_mesh_view_indices:=372): 'nir_intrinsic_load_mesh_view_indices', (nir_intrinsic_load_multisampled_pan:=373): 'nir_intrinsic_load_multisampled_pan', (nir_intrinsic_load_noperspective_varyings_pan:=374): 'nir_intrinsic_load_noperspective_varyings_pan', (nir_intrinsic_load_num_subgroups:=375): 'nir_intrinsic_load_num_subgroups', (nir_intrinsic_load_num_vertices:=376): 'nir_intrinsic_load_num_vertices', (nir_intrinsic_load_num_vertices_per_primitive_amd:=377): 'nir_intrinsic_load_num_vertices_per_primitive_amd', (nir_intrinsic_load_num_workgroups:=378): 'nir_intrinsic_load_num_workgroups', (nir_intrinsic_load_ordered_id_amd:=379): 'nir_intrinsic_load_ordered_id_amd', (nir_intrinsic_load_output:=380): 'nir_intrinsic_load_output', (nir_intrinsic_load_packed_passthrough_primitive_amd:=381): 'nir_intrinsic_load_packed_passthrough_primitive_amd', (nir_intrinsic_load_param:=382): 'nir_intrinsic_load_param', (nir_intrinsic_load_patch_vertices_in:=383): 'nir_intrinsic_load_patch_vertices_in', (nir_intrinsic_load_per_primitive_input:=384): 'nir_intrinsic_load_per_primitive_input', (nir_intrinsic_load_per_primitive_output:=385): 'nir_intrinsic_load_per_primitive_output', (nir_intrinsic_load_per_primitive_remap_intel:=386): 'nir_intrinsic_load_per_primitive_remap_intel', (nir_intrinsic_load_per_vertex_input:=387): 'nir_intrinsic_load_per_vertex_input', (nir_intrinsic_load_per_vertex_output:=388): 'nir_intrinsic_load_per_vertex_output', (nir_intrinsic_load_per_view_output:=389): 'nir_intrinsic_load_per_view_output', (nir_intrinsic_load_persp_center_rhw_ir3:=390): 'nir_intrinsic_load_persp_center_rhw_ir3', (nir_intrinsic_load_pipeline_stat_query_enabled_amd:=391): 'nir_intrinsic_load_pipeline_stat_query_enabled_amd', (nir_intrinsic_load_pixel_coord:=392): 'nir_intrinsic_load_pixel_coord', (nir_intrinsic_load_point_coord:=393): 'nir_intrinsic_load_point_coord', (nir_intrinsic_load_point_coord_maybe_flipped:=394): 'nir_intrinsic_load_point_coord_maybe_flipped', (nir_intrinsic_load_poly_line_smooth_enabled:=395): 'nir_intrinsic_load_poly_line_smooth_enabled', (nir_intrinsic_load_polygon_stipple_agx:=396): 'nir_intrinsic_load_polygon_stipple_agx', (nir_intrinsic_load_polygon_stipple_buffer_amd:=397): 'nir_intrinsic_load_polygon_stipple_buffer_amd', (nir_intrinsic_load_preamble:=398): 'nir_intrinsic_load_preamble', (nir_intrinsic_load_prim_gen_query_enabled_amd:=399): 'nir_intrinsic_load_prim_gen_query_enabled_amd', (nir_intrinsic_load_prim_xfb_query_enabled_amd:=400): 'nir_intrinsic_load_prim_xfb_query_enabled_amd', (nir_intrinsic_load_primitive_id:=401): 'nir_intrinsic_load_primitive_id', (nir_intrinsic_load_primitive_location_ir3:=402): 'nir_intrinsic_load_primitive_location_ir3', (nir_intrinsic_load_printf_buffer_address:=403): 'nir_intrinsic_load_printf_buffer_address', (nir_intrinsic_load_printf_buffer_size:=404): 'nir_intrinsic_load_printf_buffer_size', (nir_intrinsic_load_provoking_last:=405): 'nir_intrinsic_load_provoking_last', (nir_intrinsic_load_provoking_vtx_amd:=406): 'nir_intrinsic_load_provoking_vtx_amd', (nir_intrinsic_load_provoking_vtx_in_prim_amd:=407): 'nir_intrinsic_load_provoking_vtx_in_prim_amd', (nir_intrinsic_load_push_constant:=408): 'nir_intrinsic_load_push_constant', (nir_intrinsic_load_push_constant_zink:=409): 'nir_intrinsic_load_push_constant_zink', (nir_intrinsic_load_r600_indirect_per_vertex_input:=410): 'nir_intrinsic_load_r600_indirect_per_vertex_input', (nir_intrinsic_load_rasterization_primitive_amd:=411): 'nir_intrinsic_load_rasterization_primitive_amd', (nir_intrinsic_load_rasterization_samples_amd:=412): 'nir_intrinsic_load_rasterization_samples_amd', (nir_intrinsic_load_rasterization_stream:=413): 'nir_intrinsic_load_rasterization_stream', (nir_intrinsic_load_raw_output_pan:=414): 'nir_intrinsic_load_raw_output_pan', (nir_intrinsic_load_raw_vertex_id_pan:=415): 'nir_intrinsic_load_raw_vertex_id_pan', (nir_intrinsic_load_raw_vertex_offset_pan:=416): 'nir_intrinsic_load_raw_vertex_offset_pan', (nir_intrinsic_load_ray_base_mem_addr_intel:=417): 'nir_intrinsic_load_ray_base_mem_addr_intel', (nir_intrinsic_load_ray_flags:=418): 'nir_intrinsic_load_ray_flags', (nir_intrinsic_load_ray_geometry_index:=419): 'nir_intrinsic_load_ray_geometry_index', (nir_intrinsic_load_ray_hit_kind:=420): 'nir_intrinsic_load_ray_hit_kind', (nir_intrinsic_load_ray_hit_sbt_addr_intel:=421): 'nir_intrinsic_load_ray_hit_sbt_addr_intel', (nir_intrinsic_load_ray_hit_sbt_stride_intel:=422): 'nir_intrinsic_load_ray_hit_sbt_stride_intel', (nir_intrinsic_load_ray_hw_stack_size_intel:=423): 'nir_intrinsic_load_ray_hw_stack_size_intel', (nir_intrinsic_load_ray_instance_custom_index:=424): 'nir_intrinsic_load_ray_instance_custom_index', (nir_intrinsic_load_ray_launch_id:=425): 'nir_intrinsic_load_ray_launch_id', (nir_intrinsic_load_ray_launch_size:=426): 'nir_intrinsic_load_ray_launch_size', (nir_intrinsic_load_ray_miss_sbt_addr_intel:=427): 'nir_intrinsic_load_ray_miss_sbt_addr_intel', (nir_intrinsic_load_ray_miss_sbt_stride_intel:=428): 'nir_intrinsic_load_ray_miss_sbt_stride_intel', (nir_intrinsic_load_ray_num_dss_rt_stacks_intel:=429): 'nir_intrinsic_load_ray_num_dss_rt_stacks_intel', (nir_intrinsic_load_ray_object_direction:=430): 'nir_intrinsic_load_ray_object_direction', (nir_intrinsic_load_ray_object_origin:=431): 'nir_intrinsic_load_ray_object_origin', (nir_intrinsic_load_ray_object_to_world:=432): 'nir_intrinsic_load_ray_object_to_world', (nir_intrinsic_load_ray_query_global_intel:=433): 'nir_intrinsic_load_ray_query_global_intel', (nir_intrinsic_load_ray_sw_stack_size_intel:=434): 'nir_intrinsic_load_ray_sw_stack_size_intel', (nir_intrinsic_load_ray_t_max:=435): 'nir_intrinsic_load_ray_t_max', (nir_intrinsic_load_ray_t_min:=436): 'nir_intrinsic_load_ray_t_min', (nir_intrinsic_load_ray_tracing_stack_base_lvp:=437): 'nir_intrinsic_load_ray_tracing_stack_base_lvp', (nir_intrinsic_load_ray_triangle_vertex_positions:=438): 'nir_intrinsic_load_ray_triangle_vertex_positions', (nir_intrinsic_load_ray_world_direction:=439): 'nir_intrinsic_load_ray_world_direction', (nir_intrinsic_load_ray_world_origin:=440): 'nir_intrinsic_load_ray_world_origin', (nir_intrinsic_load_ray_world_to_object:=441): 'nir_intrinsic_load_ray_world_to_object', (nir_intrinsic_load_readonly_output_pan:=442): 'nir_intrinsic_load_readonly_output_pan', (nir_intrinsic_load_reg:=443): 'nir_intrinsic_load_reg', (nir_intrinsic_load_reg_indirect:=444): 'nir_intrinsic_load_reg_indirect', (nir_intrinsic_load_rel_patch_id_ir3:=445): 'nir_intrinsic_load_rel_patch_id_ir3', (nir_intrinsic_load_reloc_const_intel:=446): 'nir_intrinsic_load_reloc_const_intel', (nir_intrinsic_load_resume_shader_address_amd:=447): 'nir_intrinsic_load_resume_shader_address_amd', (nir_intrinsic_load_ring_attr_amd:=448): 'nir_intrinsic_load_ring_attr_amd', (nir_intrinsic_load_ring_attr_offset_amd:=449): 'nir_intrinsic_load_ring_attr_offset_amd', (nir_intrinsic_load_ring_es2gs_offset_amd:=450): 'nir_intrinsic_load_ring_es2gs_offset_amd', (nir_intrinsic_load_ring_esgs_amd:=451): 'nir_intrinsic_load_ring_esgs_amd', (nir_intrinsic_load_ring_gs2vs_offset_amd:=452): 'nir_intrinsic_load_ring_gs2vs_offset_amd', (nir_intrinsic_load_ring_gsvs_amd:=453): 'nir_intrinsic_load_ring_gsvs_amd', (nir_intrinsic_load_ring_mesh_scratch_amd:=454): 'nir_intrinsic_load_ring_mesh_scratch_amd', (nir_intrinsic_load_ring_mesh_scratch_offset_amd:=455): 'nir_intrinsic_load_ring_mesh_scratch_offset_amd', (nir_intrinsic_load_ring_task_draw_amd:=456): 'nir_intrinsic_load_ring_task_draw_amd', (nir_intrinsic_load_ring_task_payload_amd:=457): 'nir_intrinsic_load_ring_task_payload_amd', (nir_intrinsic_load_ring_tess_factors_amd:=458): 'nir_intrinsic_load_ring_tess_factors_amd', (nir_intrinsic_load_ring_tess_factors_offset_amd:=459): 'nir_intrinsic_load_ring_tess_factors_offset_amd', (nir_intrinsic_load_ring_tess_offchip_amd:=460): 'nir_intrinsic_load_ring_tess_offchip_amd', (nir_intrinsic_load_ring_tess_offchip_offset_amd:=461): 'nir_intrinsic_load_ring_tess_offchip_offset_amd', (nir_intrinsic_load_root_agx:=462): 'nir_intrinsic_load_root_agx', (nir_intrinsic_load_rt_arg_scratch_offset_amd:=463): 'nir_intrinsic_load_rt_arg_scratch_offset_amd', (nir_intrinsic_load_rt_conversion_pan:=464): 'nir_intrinsic_load_rt_conversion_pan', (nir_intrinsic_load_sample_id:=465): 'nir_intrinsic_load_sample_id', (nir_intrinsic_load_sample_id_no_per_sample:=466): 'nir_intrinsic_load_sample_id_no_per_sample', (nir_intrinsic_load_sample_mask:=467): 'nir_intrinsic_load_sample_mask', (nir_intrinsic_load_sample_mask_in:=468): 'nir_intrinsic_load_sample_mask_in', (nir_intrinsic_load_sample_pos:=469): 'nir_intrinsic_load_sample_pos', (nir_intrinsic_load_sample_pos_from_id:=470): 'nir_intrinsic_load_sample_pos_from_id', (nir_intrinsic_load_sample_pos_or_center:=471): 'nir_intrinsic_load_sample_pos_or_center', (nir_intrinsic_load_sample_positions_agx:=472): 'nir_intrinsic_load_sample_positions_agx', (nir_intrinsic_load_sample_positions_amd:=473): 'nir_intrinsic_load_sample_positions_amd', (nir_intrinsic_load_sample_positions_pan:=474): 'nir_intrinsic_load_sample_positions_pan', (nir_intrinsic_load_sampler_handle_agx:=475): 'nir_intrinsic_load_sampler_handle_agx', (nir_intrinsic_load_sampler_lod_parameters:=476): 'nir_intrinsic_load_sampler_lod_parameters', (nir_intrinsic_load_samples_log2_agx:=477): 'nir_intrinsic_load_samples_log2_agx', (nir_intrinsic_load_sbt_base_amd:=478): 'nir_intrinsic_load_sbt_base_amd', (nir_intrinsic_load_sbt_offset_amd:=479): 'nir_intrinsic_load_sbt_offset_amd', (nir_intrinsic_load_sbt_stride_amd:=480): 'nir_intrinsic_load_sbt_stride_amd', (nir_intrinsic_load_scalar_arg_amd:=481): 'nir_intrinsic_load_scalar_arg_amd', (nir_intrinsic_load_scratch:=482): 'nir_intrinsic_load_scratch', (nir_intrinsic_load_scratch_base_ptr:=483): 'nir_intrinsic_load_scratch_base_ptr', (nir_intrinsic_load_shader_call_data_offset_lvp:=484): 'nir_intrinsic_load_shader_call_data_offset_lvp', (nir_intrinsic_load_shader_index:=485): 'nir_intrinsic_load_shader_index', (nir_intrinsic_load_shader_output_pan:=486): 'nir_intrinsic_load_shader_output_pan', (nir_intrinsic_load_shader_part_tests_zs_agx:=487): 'nir_intrinsic_load_shader_part_tests_zs_agx', (nir_intrinsic_load_shader_record_ptr:=488): 'nir_intrinsic_load_shader_record_ptr', (nir_intrinsic_load_shared:=489): 'nir_intrinsic_load_shared', (nir_intrinsic_load_shared2_amd:=490): 'nir_intrinsic_load_shared2_amd', (nir_intrinsic_load_shared_base_ptr:=491): 'nir_intrinsic_load_shared_base_ptr', (nir_intrinsic_load_shared_block_intel:=492): 'nir_intrinsic_load_shared_block_intel', (nir_intrinsic_load_shared_ir3:=493): 'nir_intrinsic_load_shared_ir3', (nir_intrinsic_load_shared_lock_nv:=494): 'nir_intrinsic_load_shared_lock_nv', (nir_intrinsic_load_shared_uniform_block_intel:=495): 'nir_intrinsic_load_shared_uniform_block_intel', (nir_intrinsic_load_simd_width_intel:=496): 'nir_intrinsic_load_simd_width_intel', (nir_intrinsic_load_sm_count_nv:=497): 'nir_intrinsic_load_sm_count_nv', (nir_intrinsic_load_sm_id_nv:=498): 'nir_intrinsic_load_sm_id_nv', (nir_intrinsic_load_smem_amd:=499): 'nir_intrinsic_load_smem_amd', (nir_intrinsic_load_ssbo:=500): 'nir_intrinsic_load_ssbo', (nir_intrinsic_load_ssbo_address:=501): 'nir_intrinsic_load_ssbo_address', (nir_intrinsic_load_ssbo_block_intel:=502): 'nir_intrinsic_load_ssbo_block_intel', (nir_intrinsic_load_ssbo_intel:=503): 'nir_intrinsic_load_ssbo_intel', (nir_intrinsic_load_ssbo_ir3:=504): 'nir_intrinsic_load_ssbo_ir3', (nir_intrinsic_load_ssbo_uniform_block_intel:=505): 'nir_intrinsic_load_ssbo_uniform_block_intel', (nir_intrinsic_load_stack:=506): 'nir_intrinsic_load_stack', (nir_intrinsic_load_stat_query_address_agx:=507): 'nir_intrinsic_load_stat_query_address_agx', (nir_intrinsic_load_streamout_buffer_amd:=508): 'nir_intrinsic_load_streamout_buffer_amd', (nir_intrinsic_load_streamout_config_amd:=509): 'nir_intrinsic_load_streamout_config_amd', (nir_intrinsic_load_streamout_offset_amd:=510): 'nir_intrinsic_load_streamout_offset_amd', (nir_intrinsic_load_streamout_write_index_amd:=511): 'nir_intrinsic_load_streamout_write_index_amd', (nir_intrinsic_load_subgroup_eq_mask:=512): 'nir_intrinsic_load_subgroup_eq_mask', (nir_intrinsic_load_subgroup_ge_mask:=513): 'nir_intrinsic_load_subgroup_ge_mask', (nir_intrinsic_load_subgroup_gt_mask:=514): 'nir_intrinsic_load_subgroup_gt_mask', (nir_intrinsic_load_subgroup_id:=515): 'nir_intrinsic_load_subgroup_id', (nir_intrinsic_load_subgroup_id_shift_ir3:=516): 'nir_intrinsic_load_subgroup_id_shift_ir3', (nir_intrinsic_load_subgroup_invocation:=517): 'nir_intrinsic_load_subgroup_invocation', (nir_intrinsic_load_subgroup_le_mask:=518): 'nir_intrinsic_load_subgroup_le_mask', (nir_intrinsic_load_subgroup_lt_mask:=519): 'nir_intrinsic_load_subgroup_lt_mask', (nir_intrinsic_load_subgroup_size:=520): 'nir_intrinsic_load_subgroup_size', (nir_intrinsic_load_sysval_agx:=521): 'nir_intrinsic_load_sysval_agx', (nir_intrinsic_load_sysval_nv:=522): 'nir_intrinsic_load_sysval_nv', (nir_intrinsic_load_task_payload:=523): 'nir_intrinsic_load_task_payload', (nir_intrinsic_load_task_ring_entry_amd:=524): 'nir_intrinsic_load_task_ring_entry_amd', (nir_intrinsic_load_tcs_header_ir3:=525): 'nir_intrinsic_load_tcs_header_ir3', (nir_intrinsic_load_tcs_in_param_base_r600:=526): 'nir_intrinsic_load_tcs_in_param_base_r600', (nir_intrinsic_load_tcs_mem_attrib_stride:=527): 'nir_intrinsic_load_tcs_mem_attrib_stride', (nir_intrinsic_load_tcs_num_patches_amd:=528): 'nir_intrinsic_load_tcs_num_patches_amd', (nir_intrinsic_load_tcs_out_param_base_r600:=529): 'nir_intrinsic_load_tcs_out_param_base_r600', (nir_intrinsic_load_tcs_primitive_mode_amd:=530): 'nir_intrinsic_load_tcs_primitive_mode_amd', (nir_intrinsic_load_tcs_rel_patch_id_r600:=531): 'nir_intrinsic_load_tcs_rel_patch_id_r600', (nir_intrinsic_load_tcs_tess_factor_base_r600:=532): 'nir_intrinsic_load_tcs_tess_factor_base_r600', (nir_intrinsic_load_tcs_tess_levels_to_tes_amd:=533): 'nir_intrinsic_load_tcs_tess_levels_to_tes_amd', (nir_intrinsic_load_tess_coord:=534): 'nir_intrinsic_load_tess_coord', (nir_intrinsic_load_tess_coord_xy:=535): 'nir_intrinsic_load_tess_coord_xy', (nir_intrinsic_load_tess_factor_base_ir3:=536): 'nir_intrinsic_load_tess_factor_base_ir3', (nir_intrinsic_load_tess_level_inner:=537): 'nir_intrinsic_load_tess_level_inner', (nir_intrinsic_load_tess_level_inner_default:=538): 'nir_intrinsic_load_tess_level_inner_default', (nir_intrinsic_load_tess_level_outer:=539): 'nir_intrinsic_load_tess_level_outer', (nir_intrinsic_load_tess_level_outer_default:=540): 'nir_intrinsic_load_tess_level_outer_default', (nir_intrinsic_load_tess_param_base_ir3:=541): 'nir_intrinsic_load_tess_param_base_ir3', (nir_intrinsic_load_tess_param_buffer_poly:=542): 'nir_intrinsic_load_tess_param_buffer_poly', (nir_intrinsic_load_tess_rel_patch_id_amd:=543): 'nir_intrinsic_load_tess_rel_patch_id_amd', (nir_intrinsic_load_tex_sprite_mask_agx:=544): 'nir_intrinsic_load_tex_sprite_mask_agx', (nir_intrinsic_load_texture_handle_agx:=545): 'nir_intrinsic_load_texture_handle_agx', (nir_intrinsic_load_texture_scale:=546): 'nir_intrinsic_load_texture_scale', (nir_intrinsic_load_texture_size_etna:=547): 'nir_intrinsic_load_texture_size_etna', (nir_intrinsic_load_tlb_color_brcm:=548): 'nir_intrinsic_load_tlb_color_brcm', (nir_intrinsic_load_topology_id_intel:=549): 'nir_intrinsic_load_topology_id_intel', (nir_intrinsic_load_typed_buffer_amd:=550): 'nir_intrinsic_load_typed_buffer_amd', (nir_intrinsic_load_uav_ir3:=551): 'nir_intrinsic_load_uav_ir3', (nir_intrinsic_load_ubo:=552): 'nir_intrinsic_load_ubo', (nir_intrinsic_load_ubo_uniform_block_intel:=553): 'nir_intrinsic_load_ubo_uniform_block_intel', (nir_intrinsic_load_ubo_vec4:=554): 'nir_intrinsic_load_ubo_vec4', (nir_intrinsic_load_uniform:=555): 'nir_intrinsic_load_uniform', (nir_intrinsic_load_user_clip_plane:=556): 'nir_intrinsic_load_user_clip_plane', (nir_intrinsic_load_user_data_amd:=557): 'nir_intrinsic_load_user_data_amd', (nir_intrinsic_load_uvs_index_agx:=558): 'nir_intrinsic_load_uvs_index_agx', (nir_intrinsic_load_vbo_base_agx:=559): 'nir_intrinsic_load_vbo_base_agx', (nir_intrinsic_load_vector_arg_amd:=560): 'nir_intrinsic_load_vector_arg_amd', (nir_intrinsic_load_vertex_id:=561): 'nir_intrinsic_load_vertex_id', (nir_intrinsic_load_vertex_id_zero_base:=562): 'nir_intrinsic_load_vertex_id_zero_base', (nir_intrinsic_load_view_index:=563): 'nir_intrinsic_load_view_index', (nir_intrinsic_load_viewport_offset:=564): 'nir_intrinsic_load_viewport_offset', (nir_intrinsic_load_viewport_scale:=565): 'nir_intrinsic_load_viewport_scale', (nir_intrinsic_load_viewport_x_offset:=566): 'nir_intrinsic_load_viewport_x_offset', (nir_intrinsic_load_viewport_x_scale:=567): 'nir_intrinsic_load_viewport_x_scale', (nir_intrinsic_load_viewport_y_offset:=568): 'nir_intrinsic_load_viewport_y_offset', (nir_intrinsic_load_viewport_y_scale:=569): 'nir_intrinsic_load_viewport_y_scale', (nir_intrinsic_load_viewport_z_offset:=570): 'nir_intrinsic_load_viewport_z_offset', (nir_intrinsic_load_viewport_z_scale:=571): 'nir_intrinsic_load_viewport_z_scale', (nir_intrinsic_load_vs_output_buffer_poly:=572): 'nir_intrinsic_load_vs_output_buffer_poly', (nir_intrinsic_load_vs_outputs_poly:=573): 'nir_intrinsic_load_vs_outputs_poly', (nir_intrinsic_load_vs_primitive_stride_ir3:=574): 'nir_intrinsic_load_vs_primitive_stride_ir3', (nir_intrinsic_load_vs_vertex_stride_ir3:=575): 'nir_intrinsic_load_vs_vertex_stride_ir3', (nir_intrinsic_load_vulkan_descriptor:=576): 'nir_intrinsic_load_vulkan_descriptor', (nir_intrinsic_load_warp_id_nv:=577): 'nir_intrinsic_load_warp_id_nv', (nir_intrinsic_load_warps_per_sm_nv:=578): 'nir_intrinsic_load_warps_per_sm_nv', (nir_intrinsic_load_work_dim:=579): 'nir_intrinsic_load_work_dim', (nir_intrinsic_load_workgroup_id:=580): 'nir_intrinsic_load_workgroup_id', (nir_intrinsic_load_workgroup_index:=581): 'nir_intrinsic_load_workgroup_index', (nir_intrinsic_load_workgroup_num_input_primitives_amd:=582): 'nir_intrinsic_load_workgroup_num_input_primitives_amd', (nir_intrinsic_load_workgroup_num_input_vertices_amd:=583): 'nir_intrinsic_load_workgroup_num_input_vertices_amd', (nir_intrinsic_load_workgroup_size:=584): 'nir_intrinsic_load_workgroup_size', (nir_intrinsic_load_xfb_address:=585): 'nir_intrinsic_load_xfb_address', (nir_intrinsic_load_xfb_index_buffer:=586): 'nir_intrinsic_load_xfb_index_buffer', (nir_intrinsic_load_xfb_size:=587): 'nir_intrinsic_load_xfb_size', (nir_intrinsic_load_xfb_state_address_gfx12_amd:=588): 'nir_intrinsic_load_xfb_state_address_gfx12_amd', (nir_intrinsic_masked_swizzle_amd:=589): 'nir_intrinsic_masked_swizzle_amd', (nir_intrinsic_mbcnt_amd:=590): 'nir_intrinsic_mbcnt_amd', (nir_intrinsic_memcpy_deref:=591): 'nir_intrinsic_memcpy_deref', (nir_intrinsic_nop:=592): 'nir_intrinsic_nop', (nir_intrinsic_nop_amd:=593): 'nir_intrinsic_nop_amd', (nir_intrinsic_optimization_barrier_sgpr_amd:=594): 'nir_intrinsic_optimization_barrier_sgpr_amd', (nir_intrinsic_optimization_barrier_vgpr_amd:=595): 'nir_intrinsic_optimization_barrier_vgpr_amd', (nir_intrinsic_ordered_add_loop_gfx12_amd:=596): 'nir_intrinsic_ordered_add_loop_gfx12_amd', (nir_intrinsic_ordered_xfb_counter_add_gfx11_amd:=597): 'nir_intrinsic_ordered_xfb_counter_add_gfx11_amd', (nir_intrinsic_overwrite_tes_arguments_amd:=598): 'nir_intrinsic_overwrite_tes_arguments_amd', (nir_intrinsic_overwrite_vs_arguments_amd:=599): 'nir_intrinsic_overwrite_vs_arguments_amd', (nir_intrinsic_pin_cx_handle_nv:=600): 'nir_intrinsic_pin_cx_handle_nv', (nir_intrinsic_preamble_end_ir3:=601): 'nir_intrinsic_preamble_end_ir3', (nir_intrinsic_preamble_start_ir3:=602): 'nir_intrinsic_preamble_start_ir3', (nir_intrinsic_prefetch_sam_ir3:=603): 'nir_intrinsic_prefetch_sam_ir3', (nir_intrinsic_prefetch_tex_ir3:=604): 'nir_intrinsic_prefetch_tex_ir3', (nir_intrinsic_prefetch_ubo_ir3:=605): 'nir_intrinsic_prefetch_ubo_ir3', (nir_intrinsic_printf:=606): 'nir_intrinsic_printf', (nir_intrinsic_printf_abort:=607): 'nir_intrinsic_printf_abort', (nir_intrinsic_quad_ballot_agx:=608): 'nir_intrinsic_quad_ballot_agx', (nir_intrinsic_quad_broadcast:=609): 'nir_intrinsic_quad_broadcast', (nir_intrinsic_quad_swap_diagonal:=610): 'nir_intrinsic_quad_swap_diagonal', (nir_intrinsic_quad_swap_horizontal:=611): 'nir_intrinsic_quad_swap_horizontal', (nir_intrinsic_quad_swap_vertical:=612): 'nir_intrinsic_quad_swap_vertical', (nir_intrinsic_quad_swizzle_amd:=613): 'nir_intrinsic_quad_swizzle_amd', (nir_intrinsic_quad_vote_all:=614): 'nir_intrinsic_quad_vote_all', (nir_intrinsic_quad_vote_any:=615): 'nir_intrinsic_quad_vote_any', (nir_intrinsic_r600_indirect_vertex_at_index:=616): 'nir_intrinsic_r600_indirect_vertex_at_index', (nir_intrinsic_ray_intersection_ir3:=617): 'nir_intrinsic_ray_intersection_ir3', (nir_intrinsic_read_attribute_payload_intel:=618): 'nir_intrinsic_read_attribute_payload_intel', (nir_intrinsic_read_first_invocation:=619): 'nir_intrinsic_read_first_invocation', (nir_intrinsic_read_getlast_ir3:=620): 'nir_intrinsic_read_getlast_ir3', (nir_intrinsic_read_invocation:=621): 'nir_intrinsic_read_invocation', (nir_intrinsic_read_invocation_cond_ir3:=622): 'nir_intrinsic_read_invocation_cond_ir3', (nir_intrinsic_reduce:=623): 'nir_intrinsic_reduce', (nir_intrinsic_reduce_clusters_ir3:=624): 'nir_intrinsic_reduce_clusters_ir3', (nir_intrinsic_report_ray_intersection:=625): 'nir_intrinsic_report_ray_intersection', (nir_intrinsic_resource_intel:=626): 'nir_intrinsic_resource_intel', (nir_intrinsic_rotate:=627): 'nir_intrinsic_rotate', (nir_intrinsic_rq_confirm_intersection:=628): 'nir_intrinsic_rq_confirm_intersection', (nir_intrinsic_rq_generate_intersection:=629): 'nir_intrinsic_rq_generate_intersection', (nir_intrinsic_rq_initialize:=630): 'nir_intrinsic_rq_initialize', (nir_intrinsic_rq_load:=631): 'nir_intrinsic_rq_load', (nir_intrinsic_rq_proceed:=632): 'nir_intrinsic_rq_proceed', (nir_intrinsic_rq_terminate:=633): 'nir_intrinsic_rq_terminate', (nir_intrinsic_rt_execute_callable:=634): 'nir_intrinsic_rt_execute_callable', (nir_intrinsic_rt_resume:=635): 'nir_intrinsic_rt_resume', (nir_intrinsic_rt_return_amd:=636): 'nir_intrinsic_rt_return_amd', (nir_intrinsic_rt_trace_ray:=637): 'nir_intrinsic_rt_trace_ray', (nir_intrinsic_sample_mask_agx:=638): 'nir_intrinsic_sample_mask_agx', (nir_intrinsic_select_vertex_poly:=639): 'nir_intrinsic_select_vertex_poly', (nir_intrinsic_sendmsg_amd:=640): 'nir_intrinsic_sendmsg_amd', (nir_intrinsic_set_vertex_and_primitive_count:=641): 'nir_intrinsic_set_vertex_and_primitive_count', (nir_intrinsic_shader_clock:=642): 'nir_intrinsic_shader_clock', (nir_intrinsic_shared_append_amd:=643): 'nir_intrinsic_shared_append_amd', (nir_intrinsic_shared_atomic:=644): 'nir_intrinsic_shared_atomic', (nir_intrinsic_shared_atomic_swap:=645): 'nir_intrinsic_shared_atomic_swap', (nir_intrinsic_shared_consume_amd:=646): 'nir_intrinsic_shared_consume_amd', (nir_intrinsic_shuffle:=647): 'nir_intrinsic_shuffle', (nir_intrinsic_shuffle_down:=648): 'nir_intrinsic_shuffle_down', (nir_intrinsic_shuffle_down_uniform_ir3:=649): 'nir_intrinsic_shuffle_down_uniform_ir3', (nir_intrinsic_shuffle_up:=650): 'nir_intrinsic_shuffle_up', (nir_intrinsic_shuffle_up_uniform_ir3:=651): 'nir_intrinsic_shuffle_up_uniform_ir3', (nir_intrinsic_shuffle_xor:=652): 'nir_intrinsic_shuffle_xor', (nir_intrinsic_shuffle_xor_uniform_ir3:=653): 'nir_intrinsic_shuffle_xor_uniform_ir3', (nir_intrinsic_sleep_amd:=654): 'nir_intrinsic_sleep_amd', (nir_intrinsic_sparse_residency_code_and:=655): 'nir_intrinsic_sparse_residency_code_and', (nir_intrinsic_ssa_bar_nv:=656): 'nir_intrinsic_ssa_bar_nv', (nir_intrinsic_ssbo_atomic:=657): 'nir_intrinsic_ssbo_atomic', (nir_intrinsic_ssbo_atomic_ir3:=658): 'nir_intrinsic_ssbo_atomic_ir3', (nir_intrinsic_ssbo_atomic_swap:=659): 'nir_intrinsic_ssbo_atomic_swap', (nir_intrinsic_ssbo_atomic_swap_ir3:=660): 'nir_intrinsic_ssbo_atomic_swap_ir3', (nir_intrinsic_stack_map_agx:=661): 'nir_intrinsic_stack_map_agx', (nir_intrinsic_stack_unmap_agx:=662): 'nir_intrinsic_stack_unmap_agx', (nir_intrinsic_store_agx:=663): 'nir_intrinsic_store_agx', (nir_intrinsic_store_buffer_amd:=664): 'nir_intrinsic_store_buffer_amd', (nir_intrinsic_store_combined_output_pan:=665): 'nir_intrinsic_store_combined_output_pan', (nir_intrinsic_store_const_ir3:=666): 'nir_intrinsic_store_const_ir3', (nir_intrinsic_store_deref:=667): 'nir_intrinsic_store_deref', (nir_intrinsic_store_deref_block_intel:=668): 'nir_intrinsic_store_deref_block_intel', (nir_intrinsic_store_global:=669): 'nir_intrinsic_store_global', (nir_intrinsic_store_global_2x32:=670): 'nir_intrinsic_store_global_2x32', (nir_intrinsic_store_global_amd:=671): 'nir_intrinsic_store_global_amd', (nir_intrinsic_store_global_block_intel:=672): 'nir_intrinsic_store_global_block_intel', (nir_intrinsic_store_global_etna:=673): 'nir_intrinsic_store_global_etna', (nir_intrinsic_store_global_ir3:=674): 'nir_intrinsic_store_global_ir3', (nir_intrinsic_store_hit_attrib_amd:=675): 'nir_intrinsic_store_hit_attrib_amd', (nir_intrinsic_store_local_pixel_agx:=676): 'nir_intrinsic_store_local_pixel_agx', (nir_intrinsic_store_local_shared_r600:=677): 'nir_intrinsic_store_local_shared_r600', (nir_intrinsic_store_output:=678): 'nir_intrinsic_store_output', (nir_intrinsic_store_per_primitive_output:=679): 'nir_intrinsic_store_per_primitive_output', (nir_intrinsic_store_per_primitive_payload_intel:=680): 'nir_intrinsic_store_per_primitive_payload_intel', (nir_intrinsic_store_per_vertex_output:=681): 'nir_intrinsic_store_per_vertex_output', (nir_intrinsic_store_per_view_output:=682): 'nir_intrinsic_store_per_view_output', (nir_intrinsic_store_preamble:=683): 'nir_intrinsic_store_preamble', (nir_intrinsic_store_raw_output_pan:=684): 'nir_intrinsic_store_raw_output_pan', (nir_intrinsic_store_reg:=685): 'nir_intrinsic_store_reg', (nir_intrinsic_store_reg_indirect:=686): 'nir_intrinsic_store_reg_indirect', (nir_intrinsic_store_scalar_arg_amd:=687): 'nir_intrinsic_store_scalar_arg_amd', (nir_intrinsic_store_scratch:=688): 'nir_intrinsic_store_scratch', (nir_intrinsic_store_shared:=689): 'nir_intrinsic_store_shared', (nir_intrinsic_store_shared2_amd:=690): 'nir_intrinsic_store_shared2_amd', (nir_intrinsic_store_shared_block_intel:=691): 'nir_intrinsic_store_shared_block_intel', (nir_intrinsic_store_shared_ir3:=692): 'nir_intrinsic_store_shared_ir3', (nir_intrinsic_store_shared_unlock_nv:=693): 'nir_intrinsic_store_shared_unlock_nv', (nir_intrinsic_store_ssbo:=694): 'nir_intrinsic_store_ssbo', (nir_intrinsic_store_ssbo_block_intel:=695): 'nir_intrinsic_store_ssbo_block_intel', (nir_intrinsic_store_ssbo_intel:=696): 'nir_intrinsic_store_ssbo_intel', (nir_intrinsic_store_ssbo_ir3:=697): 'nir_intrinsic_store_ssbo_ir3', (nir_intrinsic_store_stack:=698): 'nir_intrinsic_store_stack', (nir_intrinsic_store_task_payload:=699): 'nir_intrinsic_store_task_payload', (nir_intrinsic_store_tf_r600:=700): 'nir_intrinsic_store_tf_r600', (nir_intrinsic_store_tlb_sample_color_v3d:=701): 'nir_intrinsic_store_tlb_sample_color_v3d', (nir_intrinsic_store_uvs_agx:=702): 'nir_intrinsic_store_uvs_agx', (nir_intrinsic_store_vector_arg_amd:=703): 'nir_intrinsic_store_vector_arg_amd', (nir_intrinsic_store_zs_agx:=704): 'nir_intrinsic_store_zs_agx', (nir_intrinsic_strict_wqm_coord_amd:=705): 'nir_intrinsic_strict_wqm_coord_amd', (nir_intrinsic_subfm_nv:=706): 'nir_intrinsic_subfm_nv', (nir_intrinsic_suclamp_nv:=707): 'nir_intrinsic_suclamp_nv', (nir_intrinsic_sueau_nv:=708): 'nir_intrinsic_sueau_nv', (nir_intrinsic_suldga_nv:=709): 'nir_intrinsic_suldga_nv', (nir_intrinsic_sustga_nv:=710): 'nir_intrinsic_sustga_nv', (nir_intrinsic_task_payload_atomic:=711): 'nir_intrinsic_task_payload_atomic', (nir_intrinsic_task_payload_atomic_swap:=712): 'nir_intrinsic_task_payload_atomic_swap', (nir_intrinsic_terminate:=713): 'nir_intrinsic_terminate', (nir_intrinsic_terminate_if:=714): 'nir_intrinsic_terminate_if', (nir_intrinsic_terminate_ray:=715): 'nir_intrinsic_terminate_ray', (nir_intrinsic_trace_ray:=716): 'nir_intrinsic_trace_ray', (nir_intrinsic_trace_ray_intel:=717): 'nir_intrinsic_trace_ray_intel', (nir_intrinsic_unit_test_amd:=718): 'nir_intrinsic_unit_test_amd', (nir_intrinsic_unit_test_divergent_amd:=719): 'nir_intrinsic_unit_test_divergent_amd', (nir_intrinsic_unit_test_uniform_amd:=720): 'nir_intrinsic_unit_test_uniform_amd', (nir_intrinsic_unpin_cx_handle_nv:=721): 'nir_intrinsic_unpin_cx_handle_nv', (nir_intrinsic_use:=722): 'nir_intrinsic_use', (nir_intrinsic_vild_nv:=723): 'nir_intrinsic_vild_nv', (nir_intrinsic_vote_all:=724): 'nir_intrinsic_vote_all', (nir_intrinsic_vote_any:=725): 'nir_intrinsic_vote_any', (nir_intrinsic_vote_feq:=726): 'nir_intrinsic_vote_feq', (nir_intrinsic_vote_ieq:=727): 'nir_intrinsic_vote_ieq', (nir_intrinsic_vulkan_resource_index:=728): 'nir_intrinsic_vulkan_resource_index', (nir_intrinsic_vulkan_resource_reindex:=729): 'nir_intrinsic_vulkan_resource_reindex', (nir_intrinsic_write_invocation_amd:=730): 'nir_intrinsic_write_invocation_amd', (nir_intrinsic_xfb_counter_sub_gfx11_amd:=731): 'nir_intrinsic_xfb_counter_sub_gfx11_amd', (nir_last_intrinsic:=731): 'nir_last_intrinsic', (nir_num_intrinsics:=732): 'nir_num_intrinsics'} +struct_nir_intrinsic_instr.register_fields([('instr', nir_instr, 0), ('intrinsic', ctypes.c_uint32, 32), ('_def', nir_def, 40), ('num_components', uint8_t, 72), ('const_index', c.Array[ctypes.c_int32, Literal[8]], 76), ('name', c.POINTER[ctypes.c_char], 112), ('src', c.Array[nir_src, Literal[0]], 120)]) +nir_intrinsic_instr: TypeAlias = struct_nir_intrinsic_instr +nir_memory_semantics: dict[int, str] = {(NIR_MEMORY_ACQUIRE:=1): 'NIR_MEMORY_ACQUIRE', (NIR_MEMORY_RELEASE:=2): 'NIR_MEMORY_RELEASE', (NIR_MEMORY_ACQ_REL:=3): 'NIR_MEMORY_ACQ_REL', (NIR_MEMORY_MAKE_AVAILABLE:=4): 'NIR_MEMORY_MAKE_AVAILABLE', (NIR_MEMORY_MAKE_VISIBLE:=8): 'NIR_MEMORY_MAKE_VISIBLE'} +nir_intrinsic_semantic_flag: dict[int, str] = {(NIR_INTRINSIC_CAN_ELIMINATE:=1): 'NIR_INTRINSIC_CAN_ELIMINATE', (NIR_INTRINSIC_CAN_REORDER:=2): 'NIR_INTRINSIC_CAN_REORDER', (NIR_INTRINSIC_SUBGROUP:=4): 'NIR_INTRINSIC_SUBGROUP', (NIR_INTRINSIC_QUADGROUP:=8): 'NIR_INTRINSIC_QUADGROUP'} +@c.record +class struct_nir_io_semantics(c.Struct): + SIZE = 4 + location: int + num_slots: int + dual_source_blend_index: int + fb_fetch_output: int + fb_fetch_output_coherent: int + gs_streams: int + medium_precision: int + per_view: int + high_16bits: int + high_dvec2: int + no_varying: int + no_sysval_output: int + interp_explicit_strict: int + _pad: int +struct_nir_io_semantics.register_fields([('location', ctypes.c_uint32, 0, 7, 0), ('num_slots', ctypes.c_uint32, 0, 6, 7), ('dual_source_blend_index', ctypes.c_uint32, 1, 1, 5), ('fb_fetch_output', ctypes.c_uint32, 1, 1, 6), ('fb_fetch_output_coherent', ctypes.c_uint32, 1, 1, 7), ('gs_streams', ctypes.c_uint32, 2, 8, 0), ('medium_precision', ctypes.c_uint32, 3, 1, 0), ('per_view', ctypes.c_uint32, 3, 1, 1), ('high_16bits', ctypes.c_uint32, 3, 1, 2), ('high_dvec2', ctypes.c_uint32, 3, 1, 3), ('no_varying', ctypes.c_uint32, 3, 1, 4), ('no_sysval_output', ctypes.c_uint32, 3, 1, 5), ('interp_explicit_strict', ctypes.c_uint32, 3, 1, 6), ('_pad', ctypes.c_uint32, 3, 1, 7)]) +nir_io_semantics: TypeAlias = struct_nir_io_semantics +@c.record +class struct_nir_io_xfb(c.Struct): + SIZE = 4 + out: c.Array[struct_nir_io_xfb_out, Literal[2]] +@c.record +class struct_nir_io_xfb_out(c.Struct): + SIZE = 2 + num_components: int + buffer: int + offset: int +struct_nir_io_xfb_out.register_fields([('num_components', uint8_t, 0, 4, 0), ('buffer', uint8_t, 0, 4, 4), ('offset', uint8_t, 1)]) +struct_nir_io_xfb.register_fields([('out', c.Array[struct_nir_io_xfb_out, Literal[2]], 0)]) +nir_io_xfb: TypeAlias = struct_nir_io_xfb +@dll.bind(ctypes.c_uint32, c.POINTER[nir_intrinsic_instr]) +def nir_instr_xfb_write_mask(instr:c.POINTER[nir_intrinsic_instr]) -> int: ... +@c.record +class struct_nir_intrinsic_info(c.Struct): + SIZE = 112 + name: c.POINTER[ctypes.c_char] + num_srcs: int + src_components: c.Array[ctypes.c_byte, Literal[11]] + has_dest: bool + dest_components: int + dest_bit_sizes: int + bit_size_src: int + num_indices: int + indices: c.Array[ctypes.c_ubyte, Literal[8]] + index_map: c.Array[ctypes.c_ubyte, Literal[75]] + flags: int +struct_nir_intrinsic_info.register_fields([('name', c.POINTER[ctypes.c_char], 0), ('num_srcs', uint8_t, 8), ('src_components', c.Array[int8_t, Literal[11]], 9), ('has_dest', ctypes.c_bool, 20), ('dest_components', uint8_t, 21), ('dest_bit_sizes', uint8_t, 22), ('bit_size_src', int8_t, 23), ('num_indices', uint8_t, 24), ('indices', c.Array[uint8_t, Literal[8]], 25), ('index_map', c.Array[uint8_t, Literal[75]], 33), ('flags', ctypes.c_uint32, 108)]) +nir_intrinsic_info: TypeAlias = struct_nir_intrinsic_info +try: nir_intrinsic_infos = c.Array[nir_intrinsic_info, Literal[732]].in_dll(dll, 'nir_intrinsic_infos') # type: ignore +except (ValueError,AttributeError): pass +@dll.bind(ctypes.c_uint32, c.POINTER[nir_intrinsic_instr], ctypes.c_uint32) +def nir_intrinsic_src_components(intr:c.POINTER[nir_intrinsic_instr], srcn:int) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_intrinsic_instr]) +def nir_intrinsic_dest_components(intr:c.POINTER[nir_intrinsic_instr]) -> int: ... +@dll.bind(ctypes.c_ubyte, c.POINTER[nir_intrinsic_instr], ctypes.c_uint32) +def nir_intrinsic_instr_src_type(intrin:c.POINTER[nir_intrinsic_instr], src:int) -> ctypes.c_ubyte: ... +@dll.bind(ctypes.c_ubyte, c.POINTER[nir_intrinsic_instr]) +def nir_intrinsic_instr_dest_type(intrin:c.POINTER[nir_intrinsic_instr]) -> ctypes.c_ubyte: ... +@dll.bind(None, c.POINTER[nir_intrinsic_instr], c.POINTER[nir_intrinsic_instr]) +def nir_intrinsic_copy_const_indices(dst:c.POINTER[nir_intrinsic_instr], src:c.POINTER[nir_intrinsic_instr]) -> None: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_intrinsic_instr]) +def nir_image_intrinsic_coord_components(instr:c.POINTER[nir_intrinsic_instr]) -> int: ... +@dll.bind(None, c.POINTER[nir_intrinsic_instr], c.POINTER[nir_def], ctypes.c_bool) +def nir_rewrite_image_intrinsic(instr:c.POINTER[nir_intrinsic_instr], handle:c.POINTER[nir_def], bindless:bool) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_intrinsic_instr]) +def nir_intrinsic_can_reorder(instr:c.POINTER[nir_intrinsic_instr]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_intrinsic_instr]) +def nir_intrinsic_writes_external_memory(instr:c.POINTER[nir_intrinsic_instr]) -> bool: ... +enum_nir_tex_src_type: dict[int, str] = {(nir_tex_src_coord:=0): 'nir_tex_src_coord', (nir_tex_src_projector:=1): 'nir_tex_src_projector', (nir_tex_src_comparator:=2): 'nir_tex_src_comparator', (nir_tex_src_offset:=3): 'nir_tex_src_offset', (nir_tex_src_bias:=4): 'nir_tex_src_bias', (nir_tex_src_lod:=5): 'nir_tex_src_lod', (nir_tex_src_min_lod:=6): 'nir_tex_src_min_lod', (nir_tex_src_lod_bias_min_agx:=7): 'nir_tex_src_lod_bias_min_agx', (nir_tex_src_ms_index:=8): 'nir_tex_src_ms_index', (nir_tex_src_ms_mcs_intel:=9): 'nir_tex_src_ms_mcs_intel', (nir_tex_src_ddx:=10): 'nir_tex_src_ddx', (nir_tex_src_ddy:=11): 'nir_tex_src_ddy', (nir_tex_src_texture_deref:=12): 'nir_tex_src_texture_deref', (nir_tex_src_sampler_deref:=13): 'nir_tex_src_sampler_deref', (nir_tex_src_texture_offset:=14): 'nir_tex_src_texture_offset', (nir_tex_src_sampler_offset:=15): 'nir_tex_src_sampler_offset', (nir_tex_src_texture_handle:=16): 'nir_tex_src_texture_handle', (nir_tex_src_sampler_handle:=17): 'nir_tex_src_sampler_handle', (nir_tex_src_sampler_deref_intrinsic:=18): 'nir_tex_src_sampler_deref_intrinsic', (nir_tex_src_texture_deref_intrinsic:=19): 'nir_tex_src_texture_deref_intrinsic', (nir_tex_src_plane:=20): 'nir_tex_src_plane', (nir_tex_src_backend1:=21): 'nir_tex_src_backend1', (nir_tex_src_backend2:=22): 'nir_tex_src_backend2', (nir_num_tex_src_types:=23): 'nir_num_tex_src_types'} +nir_tex_src_type: TypeAlias = ctypes.c_uint32 +@c.record +class struct_nir_tex_src(c.Struct): + SIZE = 40 + src: struct_nir_src + src_type: int +struct_nir_tex_src.register_fields([('src', nir_src, 0), ('src_type', nir_tex_src_type, 32)]) +nir_tex_src: TypeAlias = struct_nir_tex_src +enum_nir_texop: dict[int, str] = {(nir_texop_tex:=0): 'nir_texop_tex', (nir_texop_txb:=1): 'nir_texop_txb', (nir_texop_txl:=2): 'nir_texop_txl', (nir_texop_txd:=3): 'nir_texop_txd', (nir_texop_txf:=4): 'nir_texop_txf', (nir_texop_txf_ms:=5): 'nir_texop_txf_ms', (nir_texop_txf_ms_fb:=6): 'nir_texop_txf_ms_fb', (nir_texop_txf_ms_mcs_intel:=7): 'nir_texop_txf_ms_mcs_intel', (nir_texop_txs:=8): 'nir_texop_txs', (nir_texop_lod:=9): 'nir_texop_lod', (nir_texop_tg4:=10): 'nir_texop_tg4', (nir_texop_query_levels:=11): 'nir_texop_query_levels', (nir_texop_texture_samples:=12): 'nir_texop_texture_samples', (nir_texop_samples_identical:=13): 'nir_texop_samples_identical', (nir_texop_tex_prefetch:=14): 'nir_texop_tex_prefetch', (nir_texop_lod_bias:=15): 'nir_texop_lod_bias', (nir_texop_fragment_fetch_amd:=16): 'nir_texop_fragment_fetch_amd', (nir_texop_fragment_mask_fetch_amd:=17): 'nir_texop_fragment_mask_fetch_amd', (nir_texop_descriptor_amd:=18): 'nir_texop_descriptor_amd', (nir_texop_sampler_descriptor_amd:=19): 'nir_texop_sampler_descriptor_amd', (nir_texop_image_min_lod_agx:=20): 'nir_texop_image_min_lod_agx', (nir_texop_has_custom_border_color_agx:=21): 'nir_texop_has_custom_border_color_agx', (nir_texop_custom_border_color_agx:=22): 'nir_texop_custom_border_color_agx', (nir_texop_hdr_dim_nv:=23): 'nir_texop_hdr_dim_nv', (nir_texop_tex_type_nv:=24): 'nir_texop_tex_type_nv'} +nir_texop: TypeAlias = ctypes.c_uint32 +@c.record +class struct_nir_tex_instr(c.Struct): + SIZE = 128 + instr: struct_nir_instr + sampler_dim: int + dest_type: int + op: int + _def: struct_nir_def + src: c.POINTER[struct_nir_tex_src] + num_srcs: int + coord_components: int + is_array: bool + is_shadow: bool + is_new_style_shadow: bool + is_sparse: bool + component: int + array_is_lowered_cube: int + is_gather_implicit_lod: int + skip_helpers: int + tg4_offsets: c.Array[c.Array[ctypes.c_byte, Literal[2]], Literal[4]] + texture_non_uniform: bool + sampler_non_uniform: bool + offset_non_uniform: bool + texture_index: int + sampler_index: int + backend_flags: int +enum_glsl_sampler_dim: dict[int, str] = {(GLSL_SAMPLER_DIM_1D:=0): 'GLSL_SAMPLER_DIM_1D', (GLSL_SAMPLER_DIM_2D:=1): 'GLSL_SAMPLER_DIM_2D', (GLSL_SAMPLER_DIM_3D:=2): 'GLSL_SAMPLER_DIM_3D', (GLSL_SAMPLER_DIM_CUBE:=3): 'GLSL_SAMPLER_DIM_CUBE', (GLSL_SAMPLER_DIM_RECT:=4): 'GLSL_SAMPLER_DIM_RECT', (GLSL_SAMPLER_DIM_BUF:=5): 'GLSL_SAMPLER_DIM_BUF', (GLSL_SAMPLER_DIM_EXTERNAL:=6): 'GLSL_SAMPLER_DIM_EXTERNAL', (GLSL_SAMPLER_DIM_MS:=7): 'GLSL_SAMPLER_DIM_MS', (GLSL_SAMPLER_DIM_SUBPASS:=8): 'GLSL_SAMPLER_DIM_SUBPASS', (GLSL_SAMPLER_DIM_SUBPASS_MS:=9): 'GLSL_SAMPLER_DIM_SUBPASS_MS'} +struct_nir_tex_instr.register_fields([('instr', nir_instr, 0), ('sampler_dim', ctypes.c_uint32, 32), ('dest_type', ctypes.c_ubyte, 36), ('op', nir_texop, 40), ('_def', nir_def, 48), ('src', c.POINTER[nir_tex_src], 80), ('num_srcs', ctypes.c_uint32, 88), ('coord_components', ctypes.c_uint32, 92), ('is_array', ctypes.c_bool, 96), ('is_shadow', ctypes.c_bool, 97), ('is_new_style_shadow', ctypes.c_bool, 98), ('is_sparse', ctypes.c_bool, 99), ('component', ctypes.c_uint32, 100, 2, 0), ('array_is_lowered_cube', ctypes.c_uint32, 100, 1, 2), ('is_gather_implicit_lod', ctypes.c_uint32, 100, 1, 3), ('skip_helpers', ctypes.c_uint32, 100, 1, 4), ('tg4_offsets', c.Array[c.Array[int8_t, Literal[2]], Literal[4]], 101), ('texture_non_uniform', ctypes.c_bool, 109), ('sampler_non_uniform', ctypes.c_bool, 110), ('offset_non_uniform', ctypes.c_bool, 111), ('texture_index', ctypes.c_uint32, 112), ('sampler_index', ctypes.c_uint32, 116), ('backend_flags', uint32_t, 120)]) +nir_tex_instr: TypeAlias = struct_nir_tex_instr +@dll.bind(ctypes.c_bool, c.POINTER[nir_tex_instr]) +def nir_tex_instr_need_sampler(instr:c.POINTER[nir_tex_instr]) -> bool: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_tex_instr]) +def nir_tex_instr_result_size(instr:c.POINTER[nir_tex_instr]) -> int: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_tex_instr]) +def nir_tex_instr_is_query(instr:c.POINTER[nir_tex_instr]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_tex_instr]) +def nir_tex_instr_has_implicit_derivative(instr:c.POINTER[nir_tex_instr]) -> bool: ... +@dll.bind(ctypes.c_ubyte, c.POINTER[nir_tex_instr], ctypes.c_uint32) +def nir_tex_instr_src_type(instr:c.POINTER[nir_tex_instr], src:int) -> ctypes.c_ubyte: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_tex_instr], ctypes.c_uint32) +def nir_tex_instr_src_size(instr:c.POINTER[nir_tex_instr], src:int) -> int: ... +@dll.bind(None, c.POINTER[nir_tex_instr], nir_tex_src_type, c.POINTER[nir_def]) +def nir_tex_instr_add_src(tex:c.POINTER[nir_tex_instr], src_type:nir_tex_src_type, src:c.POINTER[nir_def]) -> None: ... +@dll.bind(None, c.POINTER[nir_tex_instr], ctypes.c_uint32) +def nir_tex_instr_remove_src(tex:c.POINTER[nir_tex_instr], src_idx:int) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_tex_instr]) +def nir_tex_instr_has_explicit_tg4_offsets(tex:c.POINTER[nir_tex_instr]) -> bool: ... +@c.record +class struct_nir_load_const_instr(c.Struct): + SIZE = 64 + instr: struct_nir_instr + _def: struct_nir_def + value: c.Array[nir_const_value, Literal[0]] +struct_nir_load_const_instr.register_fields([('instr', nir_instr, 0), ('_def', nir_def, 32), ('value', c.Array[nir_const_value, Literal[0]], 64)]) +nir_load_const_instr: TypeAlias = struct_nir_load_const_instr +nir_jump_type: dict[int, str] = {(nir_jump_return:=0): 'nir_jump_return', (nir_jump_halt:=1): 'nir_jump_halt', (nir_jump_break:=2): 'nir_jump_break', (nir_jump_continue:=3): 'nir_jump_continue', (nir_jump_goto:=4): 'nir_jump_goto', (nir_jump_goto_if:=5): 'nir_jump_goto_if'} +@c.record +class struct_nir_jump_instr(c.Struct): + SIZE = 88 + instr: struct_nir_instr + type: int + condition: struct_nir_src + target: c.POINTER[struct_nir_block] + else_target: c.POINTER[struct_nir_block] +struct_nir_jump_instr.register_fields([('instr', nir_instr, 0), ('type', ctypes.c_uint32, 32), ('condition', nir_src, 40), ('target', c.POINTER[nir_block], 72), ('else_target', c.POINTER[nir_block], 80)]) +nir_jump_instr: TypeAlias = struct_nir_jump_instr +@c.record +class struct_nir_undef_instr(c.Struct): + SIZE = 64 + instr: struct_nir_instr + _def: struct_nir_def +struct_nir_undef_instr.register_fields([('instr', nir_instr, 0), ('_def', nir_def, 32)]) +nir_undef_instr: TypeAlias = struct_nir_undef_instr +@c.record +class struct_nir_phi_src(c.Struct): + SIZE = 56 + node: struct_exec_node + pred: c.POINTER[struct_nir_block] + src: struct_nir_src +struct_nir_phi_src.register_fields([('node', struct_exec_node, 0), ('pred', c.POINTER[nir_block], 16), ('src', nir_src, 24)]) +nir_phi_src: TypeAlias = struct_nir_phi_src +@c.record +class struct_nir_phi_instr(c.Struct): + SIZE = 96 + instr: struct_nir_instr + srcs: struct_exec_list + _def: struct_nir_def +struct_nir_phi_instr.register_fields([('instr', nir_instr, 0), ('srcs', struct_exec_list, 32), ('_def', nir_def, 64)]) +nir_phi_instr: TypeAlias = struct_nir_phi_instr +@c.record +class struct_nir_parallel_copy_entry(c.Struct): + SIZE = 88 + node: struct_exec_node + src_is_reg: bool + dest_is_reg: bool + src: struct_nir_src + dest: struct_nir_parallel_copy_entry_dest +@c.record +class struct_nir_parallel_copy_entry_dest(c.Struct): + SIZE = 32 + _def: struct_nir_def + reg: struct_nir_src +struct_nir_parallel_copy_entry_dest.register_fields([('_def', nir_def, 0), ('reg', nir_src, 0)]) +struct_nir_parallel_copy_entry.register_fields([('node', struct_exec_node, 0), ('src_is_reg', ctypes.c_bool, 16), ('dest_is_reg', ctypes.c_bool, 17), ('src', nir_src, 24), ('dest', struct_nir_parallel_copy_entry_dest, 56)]) +nir_parallel_copy_entry: TypeAlias = struct_nir_parallel_copy_entry +@c.record +class struct_nir_parallel_copy_instr(c.Struct): + SIZE = 64 + instr: struct_nir_instr + entries: struct_exec_list +struct_nir_parallel_copy_instr.register_fields([('instr', nir_instr, 0), ('entries', struct_exec_list, 32)]) +nir_parallel_copy_instr: TypeAlias = struct_nir_parallel_copy_instr +@c.record +class struct_nir_instr_debug_info(c.Struct): + SIZE = 64 + filename: c.POINTER[ctypes.c_char] + line: int + column: int + spirv_offset: int + nir_line: int + variable_name: c.POINTER[ctypes.c_char] + instr: struct_nir_instr +struct_nir_instr_debug_info.register_fields([('filename', c.POINTER[ctypes.c_char], 0), ('line', uint32_t, 8), ('column', uint32_t, 12), ('spirv_offset', uint32_t, 16), ('nir_line', uint32_t, 20), ('variable_name', c.POINTER[ctypes.c_char], 24), ('instr', nir_instr, 32)]) +nir_instr_debug_info: TypeAlias = struct_nir_instr_debug_info +@c.record +class struct_nir_scalar(c.Struct): + SIZE = 16 + _def: c.POINTER[struct_nir_def] + comp: int +struct_nir_scalar.register_fields([('_def', c.POINTER[nir_def], 0), ('comp', ctypes.c_uint32, 8)]) +nir_scalar: TypeAlias = struct_nir_scalar +@dll.bind(nir_scalar, nir_scalar) +def nir_scalar_chase_movs(s:nir_scalar) -> nir_scalar: ... +@c.record +class struct_nir_binding(c.Struct): + SIZE = 168 + success: bool + var: c.POINTER[struct_nir_variable] + desc_set: int + binding: int + num_indices: int + indices: c.Array[struct_nir_src, Literal[4]] + read_first_invocation: bool +struct_nir_binding.register_fields([('success', ctypes.c_bool, 0), ('var', c.POINTER[nir_variable], 8), ('desc_set', ctypes.c_uint32, 16), ('binding', ctypes.c_uint32, 20), ('num_indices', ctypes.c_uint32, 24), ('indices', c.Array[nir_src, Literal[4]], 32), ('read_first_invocation', ctypes.c_bool, 160)]) +nir_binding: TypeAlias = struct_nir_binding +@dll.bind(nir_binding, nir_src) +def nir_chase_binding(rsrc:nir_src) -> nir_binding: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], nir_binding) +def nir_get_binding_variable(shader:c.POINTER[nir_shader], binding:nir_binding) -> c.POINTER[nir_variable]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_block]) +def nir_block_contains_work(block:c.POINTER[nir_block]) -> bool: ... +nir_selection_control: dict[int, str] = {(nir_selection_control_none:=0): 'nir_selection_control_none', (nir_selection_control_flatten:=1): 'nir_selection_control_flatten', (nir_selection_control_dont_flatten:=2): 'nir_selection_control_dont_flatten', (nir_selection_control_divergent_always_taken:=3): 'nir_selection_control_divergent_always_taken'} +@c.record +class struct_nir_if(c.Struct): + SIZE = 136 + cf_node: struct_nir_cf_node + condition: struct_nir_src + control: int + then_list: struct_exec_list + else_list: struct_exec_list +struct_nir_if.register_fields([('cf_node', nir_cf_node, 0), ('condition', nir_src, 32), ('control', ctypes.c_uint32, 64), ('then_list', struct_exec_list, 72), ('else_list', struct_exec_list, 104)]) +nir_if: TypeAlias = struct_nir_if +@c.record +class struct_nir_loop_terminator(c.Struct): + SIZE = 56 + nif: c.POINTER[struct_nir_if] + conditional_instr: c.POINTER[struct_nir_instr] + break_block: c.POINTER[struct_nir_block] + continue_from_block: c.POINTER[struct_nir_block] + continue_from_then: bool + induction_rhs: bool + exact_trip_count_unknown: bool + loop_terminator_link: struct_list_head +struct_nir_loop_terminator.register_fields([('nif', c.POINTER[nir_if], 0), ('conditional_instr', c.POINTER[nir_instr], 8), ('break_block', c.POINTER[nir_block], 16), ('continue_from_block', c.POINTER[nir_block], 24), ('continue_from_then', ctypes.c_bool, 32), ('induction_rhs', ctypes.c_bool, 33), ('exact_trip_count_unknown', ctypes.c_bool, 34), ('loop_terminator_link', struct_list_head, 40)]) +nir_loop_terminator: TypeAlias = struct_nir_loop_terminator +@c.record +class struct_nir_loop_induction_variable(c.Struct): + SIZE = 32 + basis: c.POINTER[struct_nir_def] + _def: c.POINTER[struct_nir_def] + init_src: c.POINTER[struct_nir_src] + update_src: c.POINTER[struct_nir_alu_src] +struct_nir_loop_induction_variable.register_fields([('basis', c.POINTER[nir_def], 0), ('_def', c.POINTER[nir_def], 8), ('init_src', c.POINTER[nir_src], 16), ('update_src', c.POINTER[nir_alu_src], 24)]) +nir_loop_induction_variable: TypeAlias = struct_nir_loop_induction_variable +@c.record +class struct_nir_loop_info(c.Struct): + SIZE = 56 + instr_cost: int + has_soft_fp64: bool + guessed_trip_count: int + max_trip_count: int + exact_trip_count_known: bool + force_unroll: bool + complex_loop: bool + limiting_terminator: c.POINTER[struct_nir_loop_terminator] + loop_terminator_list: struct_list_head + induction_vars: c.POINTER[struct_hash_table] +@c.record +class struct_hash_table(c.Struct): + SIZE = 72 + table: c.POINTER[struct_hash_entry] + key_hash_function: c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_void_p]] + key_equals_function: c.CFUNCTYPE[ctypes.c_bool, [ctypes.c_void_p, ctypes.c_void_p]] + deleted_key: ctypes.c_void_p + size: int + rehash: int + size_magic: int + rehash_magic: int + max_entries: int + size_index: int + entries: int + deleted_entries: int +@c.record +class struct_hash_entry(c.Struct): + SIZE = 24 + hash: int + key: ctypes.c_void_p + data: ctypes.c_void_p +struct_hash_entry.register_fields([('hash', uint32_t, 0), ('key', ctypes.c_void_p, 8), ('data', ctypes.c_void_p, 16)]) +struct_hash_table.register_fields([('table', c.POINTER[struct_hash_entry], 0), ('key_hash_function', c.CFUNCTYPE[uint32_t, [ctypes.c_void_p]], 8), ('key_equals_function', c.CFUNCTYPE[ctypes.c_bool, [ctypes.c_void_p, ctypes.c_void_p]], 16), ('deleted_key', ctypes.c_void_p, 24), ('size', uint32_t, 32), ('rehash', uint32_t, 36), ('size_magic', uint64_t, 40), ('rehash_magic', uint64_t, 48), ('max_entries', uint32_t, 56), ('size_index', uint32_t, 60), ('entries', uint32_t, 64), ('deleted_entries', uint32_t, 68)]) +struct_nir_loop_info.register_fields([('instr_cost', ctypes.c_uint32, 0), ('has_soft_fp64', ctypes.c_bool, 4), ('guessed_trip_count', ctypes.c_uint32, 8), ('max_trip_count', ctypes.c_uint32, 12), ('exact_trip_count_known', ctypes.c_bool, 16), ('force_unroll', ctypes.c_bool, 17), ('complex_loop', ctypes.c_bool, 18), ('limiting_terminator', c.POINTER[nir_loop_terminator], 24), ('loop_terminator_list', struct_list_head, 32), ('induction_vars', c.POINTER[struct_hash_table], 48)]) +nir_loop_info: TypeAlias = struct_nir_loop_info +nir_loop_control: dict[int, str] = {(nir_loop_control_none:=0): 'nir_loop_control_none', (nir_loop_control_unroll:=1): 'nir_loop_control_unroll', (nir_loop_control_dont_unroll:=2): 'nir_loop_control_dont_unroll'} +@c.record +class struct_nir_loop(c.Struct): + SIZE = 112 + cf_node: struct_nir_cf_node + body: struct_exec_list + continue_list: struct_exec_list + info: c.POINTER[struct_nir_loop_info] + control: int + partially_unrolled: bool + divergent_continue: bool + divergent_break: bool +struct_nir_loop.register_fields([('cf_node', nir_cf_node, 0), ('body', struct_exec_list, 32), ('continue_list', struct_exec_list, 64), ('info', c.POINTER[nir_loop_info], 96), ('control', ctypes.c_uint32, 104), ('partially_unrolled', ctypes.c_bool, 108), ('divergent_continue', ctypes.c_bool, 109), ('divergent_break', ctypes.c_bool, 110)]) +nir_loop: TypeAlias = struct_nir_loop +nir_intrin_filter_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_intrinsic_instr], ctypes.c_void_p]] +nir_vectorize_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_ubyte, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] +@dll.bind(None, c.POINTER[nir_shader]) +def nir_remove_non_entrypoints(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_remove_non_exported(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_remove_entrypoints(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_fixup_is_exported(shader:c.POINTER[nir_shader]) -> None: ... +shader_info: TypeAlias = struct_shader_info +@dll.bind(c.POINTER[nir_shader], ctypes.c_void_p, gl_shader_stage, c.POINTER[nir_shader_compiler_options], c.POINTER[shader_info]) +def nir_shader_create(mem_ctx:ctypes.c_void_p, stage:gl_shader_stage, options:c.POINTER[nir_shader_compiler_options], si:c.POINTER[shader_info]) -> c.POINTER[nir_shader]: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_variable]) +def nir_shader_add_variable(shader:c.POINTER[nir_shader], var:c.POINTER[nir_variable]) -> None: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], ctypes.c_uint32, c.POINTER[struct_glsl_type], c.POINTER[ctypes.c_char]) +def nir_variable_create(shader:c.POINTER[nir_shader], mode:ctypes.c_uint32, type:c.POINTER[struct_glsl_type], name:c.POINTER[ctypes.c_char]) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_function_impl], c.POINTER[struct_glsl_type], c.POINTER[ctypes.c_char]) +def nir_local_variable_create(impl:c.POINTER[nir_function_impl], type:c.POINTER[struct_glsl_type], name:c.POINTER[ctypes.c_char]) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], c.POINTER[struct_glsl_type], c.POINTER[ctypes.c_char], c.Array[gl_state_index16, Literal[4]]) +def nir_state_variable_create(shader:c.POINTER[nir_shader], type:c.POINTER[struct_glsl_type], name:c.POINTER[ctypes.c_char], tokens:c.Array[gl_state_index16, Literal[4]]) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_int32, c.POINTER[struct_glsl_type]) +def nir_get_variable_with_location(shader:c.POINTER[nir_shader], mode:ctypes.c_uint32, location:int, type:c.POINTER[struct_glsl_type]) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_int32, c.POINTER[struct_glsl_type]) +def nir_create_variable_with_location(shader:c.POINTER[nir_shader], mode:ctypes.c_uint32, location:int, type:c.POINTER[struct_glsl_type]) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_uint32) +def nir_find_variable_with_location(shader:c.POINTER[nir_shader], mode:ctypes.c_uint32, location:int) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_uint32) +def nir_find_variable_with_driver_location(shader:c.POINTER[nir_shader], mode:ctypes.c_uint32, location:int) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], c.Array[gl_state_index16, Literal[4]]) +def nir_find_state_variable(s:c.POINTER[nir_shader], tokens:c.Array[gl_state_index16, Literal[4]]) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], ctypes.c_uint32) +def nir_find_sampler_variable_with_tex_index(shader:c.POINTER[nir_shader], texture_index:int) -> c.POINTER[nir_variable]: ... +@dll.bind(None, c.POINTER[nir_shader], c.CFUNCTYPE[ctypes.c_int32, [c.POINTER[nir_variable], c.POINTER[nir_variable]]], ctypes.c_uint32) +def nir_sort_variables_with_modes(shader:c.POINTER[nir_shader], compar:c.CFUNCTYPE[ctypes.c_int32, [c.POINTER[nir_variable], c.POINTER[nir_variable]]], modes:ctypes.c_uint32) -> None: ... +@dll.bind(c.POINTER[nir_function], c.POINTER[nir_shader], c.POINTER[ctypes.c_char]) +def nir_function_create(shader:c.POINTER[nir_shader], name:c.POINTER[ctypes.c_char]) -> c.POINTER[nir_function]: ... +@dll.bind(c.POINTER[nir_function_impl], c.POINTER[nir_function]) +def nir_function_impl_create(func:c.POINTER[nir_function]) -> c.POINTER[nir_function_impl]: ... +@dll.bind(c.POINTER[nir_function_impl], c.POINTER[nir_shader]) +def nir_function_impl_create_bare(shader:c.POINTER[nir_shader]) -> c.POINTER[nir_function_impl]: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_shader]) +def nir_block_create(shader:c.POINTER[nir_shader]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_if], c.POINTER[nir_shader]) +def nir_if_create(shader:c.POINTER[nir_shader]) -> c.POINTER[nir_if]: ... +@dll.bind(c.POINTER[nir_loop], c.POINTER[nir_shader]) +def nir_loop_create(shader:c.POINTER[nir_shader]) -> c.POINTER[nir_loop]: ... +@dll.bind(c.POINTER[nir_function_impl], c.POINTER[nir_cf_node]) +def nir_cf_node_get_function(node:c.POINTER[nir_cf_node]) -> c.POINTER[nir_function_impl]: ... +@dll.bind(None, c.POINTER[nir_function_impl], ctypes.c_int32) +def nir_metadata_require(impl:c.POINTER[nir_function_impl], required:ctypes.c_int32) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_shader_preserve_all_metadata(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_metadata_invalidate(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(ctypes.c_bool, ctypes.c_bool, c.POINTER[nir_function_impl], ctypes.c_int32) +def nir_progress(progress:bool, impl:c.POINTER[nir_function_impl], preserved:ctypes.c_int32) -> bool: ... +@dll.bind(c.POINTER[nir_alu_instr], c.POINTER[nir_shader], ctypes.c_uint32) +def nir_alu_instr_create(shader:c.POINTER[nir_shader], op:ctypes.c_uint32) -> c.POINTER[nir_alu_instr]: ... +@dll.bind(c.POINTER[nir_deref_instr], c.POINTER[nir_shader], ctypes.c_uint32) +def nir_deref_instr_create(shader:c.POINTER[nir_shader], deref_type:ctypes.c_uint32) -> c.POINTER[nir_deref_instr]: ... +@dll.bind(c.POINTER[nir_jump_instr], c.POINTER[nir_shader], ctypes.c_uint32) +def nir_jump_instr_create(shader:c.POINTER[nir_shader], type:ctypes.c_uint32) -> c.POINTER[nir_jump_instr]: ... +@dll.bind(c.POINTER[nir_load_const_instr], c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_uint32) +def nir_load_const_instr_create(shader:c.POINTER[nir_shader], num_components:int, bit_size:int) -> c.POINTER[nir_load_const_instr]: ... +@dll.bind(c.POINTER[nir_intrinsic_instr], c.POINTER[nir_shader], ctypes.c_uint32) +def nir_intrinsic_instr_create(shader:c.POINTER[nir_shader], op:ctypes.c_uint32) -> c.POINTER[nir_intrinsic_instr]: ... +@dll.bind(c.POINTER[nir_call_instr], c.POINTER[nir_shader], c.POINTER[nir_function]) +def nir_call_instr_create(shader:c.POINTER[nir_shader], callee:c.POINTER[nir_function]) -> c.POINTER[nir_call_instr]: ... +@dll.bind(c.POINTER[nir_tex_instr], c.POINTER[nir_shader], ctypes.c_uint32) +def nir_tex_instr_create(shader:c.POINTER[nir_shader], num_srcs:int) -> c.POINTER[nir_tex_instr]: ... +@dll.bind(c.POINTER[nir_phi_instr], c.POINTER[nir_shader]) +def nir_phi_instr_create(shader:c.POINTER[nir_shader]) -> c.POINTER[nir_phi_instr]: ... +@dll.bind(c.POINTER[nir_phi_src], c.POINTER[nir_phi_instr], c.POINTER[nir_block], c.POINTER[nir_def]) +def nir_phi_instr_add_src(instr:c.POINTER[nir_phi_instr], pred:c.POINTER[nir_block], src:c.POINTER[nir_def]) -> c.POINTER[nir_phi_src]: ... +@dll.bind(c.POINTER[nir_parallel_copy_instr], c.POINTER[nir_shader]) +def nir_parallel_copy_instr_create(shader:c.POINTER[nir_shader]) -> c.POINTER[nir_parallel_copy_instr]: ... +@dll.bind(c.POINTER[nir_undef_instr], c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_uint32) +def nir_undef_instr_create(shader:c.POINTER[nir_shader], num_components:int, bit_size:int) -> c.POINTER[nir_undef_instr]: ... +@dll.bind(nir_const_value, ctypes.c_uint32, ctypes.c_uint32) +def nir_alu_binop_identity(binop:ctypes.c_uint32, bit_size:int) -> nir_const_value: ... +nir_cursor_option: dict[int, str] = {(nir_cursor_before_block:=0): 'nir_cursor_before_block', (nir_cursor_after_block:=1): 'nir_cursor_after_block', (nir_cursor_before_instr:=2): 'nir_cursor_before_instr', (nir_cursor_after_instr:=3): 'nir_cursor_after_instr'} +@c.record +class struct_nir_cursor(c.Struct): + SIZE = 16 + option: int + block: c.POINTER[struct_nir_block] + instr: c.POINTER[struct_nir_instr] +struct_nir_cursor.register_fields([('option', ctypes.c_uint32, 0), ('block', c.POINTER[nir_block], 8), ('instr', c.POINTER[nir_instr], 8)]) +nir_cursor: TypeAlias = struct_nir_cursor +@dll.bind(ctypes.c_bool, nir_cursor, nir_cursor) +def nir_cursors_equal(a:nir_cursor, b:nir_cursor) -> bool: ... +@dll.bind(None, nir_cursor, c.POINTER[nir_instr]) +def nir_instr_insert(cursor:nir_cursor, instr:c.POINTER[nir_instr]) -> None: ... +@dll.bind(ctypes.c_bool, nir_cursor, c.POINTER[nir_instr]) +def nir_instr_move(cursor:nir_cursor, instr:c.POINTER[nir_instr]) -> bool: ... +@dll.bind(None, c.POINTER[nir_instr]) +def nir_instr_remove_v(instr:c.POINTER[nir_instr]) -> None: ... +@dll.bind(None, c.POINTER[nir_instr]) +def nir_instr_free(instr:c.POINTER[nir_instr]) -> None: ... +@dll.bind(None, c.POINTER[struct_exec_list]) +def nir_instr_free_list(list:c.POINTER[struct_exec_list]) -> None: ... +@dll.bind(nir_cursor, c.POINTER[nir_instr]) +def nir_instr_free_and_dce(instr:c.POINTER[nir_instr]) -> nir_cursor: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_instr]) +def nir_instr_def(instr:c.POINTER[nir_instr]) -> c.POINTER[nir_def]: ... +nir_foreach_def_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_def], ctypes.c_void_p]] +nir_foreach_src_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_src], ctypes.c_void_p]] +@dll.bind(ctypes.c_bool, c.POINTER[nir_block], nir_foreach_src_cb, ctypes.c_void_p) +def nir_foreach_phi_src_leaving_block(instr:c.POINTER[nir_block], cb:nir_foreach_src_cb, state:ctypes.c_void_p) -> bool: ... +@dll.bind(c.POINTER[nir_const_value], nir_src) +def nir_src_as_const_value(src:nir_src) -> c.POINTER[nir_const_value]: ... +@dll.bind(c.POINTER[ctypes.c_char], nir_src) +def nir_src_as_string(src:nir_src) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_bool, nir_src) +def nir_src_is_always_uniform(src:nir_src) -> bool: ... +@dll.bind(ctypes.c_bool, nir_src, nir_src) +def nir_srcs_equal(src1:nir_src, src2:nir_src) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_instr], c.POINTER[nir_instr]) +def nir_instrs_equal(instr1:c.POINTER[nir_instr], instr2:c.POINTER[nir_instr]) -> bool: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_src]) +def nir_src_get_block(src:c.POINTER[nir_src]) -> c.POINTER[nir_block]: ... +@dll.bind(None, c.POINTER[nir_instr], c.POINTER[nir_src], c.POINTER[nir_def]) +def nir_instr_init_src(instr:c.POINTER[nir_instr], src:c.POINTER[nir_src], _def:c.POINTER[nir_def]) -> None: ... +@dll.bind(None, c.POINTER[nir_instr], c.POINTER[nir_src]) +def nir_instr_clear_src(instr:c.POINTER[nir_instr], src:c.POINTER[nir_src]) -> None: ... +@dll.bind(None, c.POINTER[nir_instr], c.POINTER[nir_src], c.POINTER[nir_src]) +def nir_instr_move_src(dest_instr:c.POINTER[nir_instr], dest:c.POINTER[nir_src], src:c.POINTER[nir_src]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_instr], c.POINTER[nir_instr]) +def nir_instr_is_before(first:c.POINTER[nir_instr], second:c.POINTER[nir_instr]) -> bool: ... +@dll.bind(None, c.POINTER[nir_instr], c.POINTER[nir_def], ctypes.c_uint32, ctypes.c_uint32) +def nir_def_init(instr:c.POINTER[nir_instr], _def:c.POINTER[nir_def], num_components:int, bit_size:int) -> None: ... +@dll.bind(None, c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_def_rewrite_uses(_def:c.POINTER[nir_def], new_ssa:c.POINTER[nir_def]) -> None: ... +@dll.bind(None, c.POINTER[nir_def], nir_src) +def nir_def_rewrite_uses_src(_def:c.POINTER[nir_def], new_src:nir_src) -> None: ... +@dll.bind(None, c.POINTER[nir_def], c.POINTER[nir_def], c.POINTER[nir_instr]) +def nir_def_rewrite_uses_after(_def:c.POINTER[nir_def], new_ssa:c.POINTER[nir_def], after_me:c.POINTER[nir_instr]) -> None: ... +@dll.bind(nir_component_mask_t, c.POINTER[nir_src]) +def nir_src_components_read(src:c.POINTER[nir_src]) -> nir_component_mask_t: ... +@dll.bind(nir_component_mask_t, c.POINTER[nir_def]) +def nir_def_components_read(_def:c.POINTER[nir_def]) -> nir_component_mask_t: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_def]) +def nir_def_all_uses_are_fsat(_def:c.POINTER[nir_def]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_def]) +def nir_def_all_uses_ignore_sign_bit(_def:c.POINTER[nir_def]) -> bool: ... +@dll.bind(None, c.POINTER[nir_function_impl]) +def nir_sort_unstructured_blocks(impl:c.POINTER[nir_function_impl]) -> None: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_block]) +def nir_block_unstructured_next(block:c.POINTER[nir_block]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_function_impl]) +def nir_unstructured_start_block(impl:c.POINTER[nir_function_impl]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_block]) +def nir_block_cf_tree_next(block:c.POINTER[nir_block]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_block]) +def nir_block_cf_tree_prev(block:c.POINTER[nir_block]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_cf_node]) +def nir_cf_node_cf_tree_first(node:c.POINTER[nir_cf_node]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_cf_node]) +def nir_cf_node_cf_tree_last(node:c.POINTER[nir_cf_node]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_cf_node]) +def nir_cf_node_cf_tree_next(node:c.POINTER[nir_cf_node]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_cf_node]) +def nir_cf_node_cf_tree_prev(node:c.POINTER[nir_cf_node]) -> c.POINTER[nir_block]: ... +@dll.bind(c.POINTER[nir_if], c.POINTER[nir_block]) +def nir_block_get_following_if(block:c.POINTER[nir_block]) -> c.POINTER[nir_if]: ... +@dll.bind(c.POINTER[nir_loop], c.POINTER[nir_block]) +def nir_block_get_following_loop(block:c.POINTER[nir_block]) -> c.POINTER[nir_loop]: ... +@dll.bind(c.POINTER[c.POINTER[nir_block]], c.POINTER[nir_block], ctypes.c_void_p) +def nir_block_get_predecessors_sorted(block:c.POINTER[nir_block], mem_ctx:ctypes.c_void_p) -> c.POINTER[c.POINTER[nir_block]]: ... +@dll.bind(None, c.POINTER[nir_function_impl]) +def nir_index_ssa_defs(impl:c.POINTER[nir_function_impl]) -> None: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_function_impl]) +def nir_index_instrs(impl:c.POINTER[nir_function_impl]) -> int: ... +@dll.bind(None, c.POINTER[nir_function_impl]) +def nir_index_blocks(impl:c.POINTER[nir_function_impl]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_shader_clear_pass_flags(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_shader_index_vars(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_function_impl]) +def nir_function_impl_index_vars(impl:c.POINTER[nir_function_impl]) -> int: ... +@c.record +class struct__IO_FILE(c.Struct): + SIZE = 216 + _flags: int + _IO_read_ptr: c.POINTER[ctypes.c_char] + _IO_read_end: c.POINTER[ctypes.c_char] + _IO_read_base: c.POINTER[ctypes.c_char] + _IO_write_base: c.POINTER[ctypes.c_char] + _IO_write_ptr: c.POINTER[ctypes.c_char] + _IO_write_end: c.POINTER[ctypes.c_char] + _IO_buf_base: c.POINTER[ctypes.c_char] + _IO_buf_end: c.POINTER[ctypes.c_char] + _IO_save_base: c.POINTER[ctypes.c_char] + _IO_backup_base: c.POINTER[ctypes.c_char] + _IO_save_end: c.POINTER[ctypes.c_char] + _markers: c.POINTER[struct__IO_marker] + _chain: c.POINTER[struct__IO_FILE] + _fileno: int + _flags2: int + _old_offset: int + _cur_column: int + _vtable_offset: int + _shortbuf: c.Array[ctypes.c_char, Literal[1]] + _lock: ctypes.c_void_p + _offset: int + _codecvt: c.POINTER[struct__IO_codecvt] + _wide_data: c.POINTER[struct__IO_wide_data] + _freeres_list: c.POINTER[struct__IO_FILE] + _freeres_buf: ctypes.c_void_p + __pad5: int + _mode: int + _unused2: c.Array[ctypes.c_char, Literal[20]] +FILE: TypeAlias = struct__IO_FILE +class struct__IO_marker(c.Struct): pass +__off_t: TypeAlias = ctypes.c_int64 +_IO_lock_t: TypeAlias = None +__off64_t: TypeAlias = ctypes.c_int64 +class struct__IO_codecvt(c.Struct): pass +class struct__IO_wide_data(c.Struct): pass +size_t: TypeAlias = ctypes.c_uint64 +struct__IO_FILE.register_fields([('_flags', ctypes.c_int32, 0), ('_IO_read_ptr', c.POINTER[ctypes.c_char], 8), ('_IO_read_end', c.POINTER[ctypes.c_char], 16), ('_IO_read_base', c.POINTER[ctypes.c_char], 24), ('_IO_write_base', c.POINTER[ctypes.c_char], 32), ('_IO_write_ptr', c.POINTER[ctypes.c_char], 40), ('_IO_write_end', c.POINTER[ctypes.c_char], 48), ('_IO_buf_base', c.POINTER[ctypes.c_char], 56), ('_IO_buf_end', c.POINTER[ctypes.c_char], 64), ('_IO_save_base', c.POINTER[ctypes.c_char], 72), ('_IO_backup_base', c.POINTER[ctypes.c_char], 80), ('_IO_save_end', c.POINTER[ctypes.c_char], 88), ('_markers', c.POINTER[struct__IO_marker], 96), ('_chain', c.POINTER[struct__IO_FILE], 104), ('_fileno', ctypes.c_int32, 112), ('_flags2', ctypes.c_int32, 116), ('_old_offset', ctypes.c_int64, 120), ('_cur_column', ctypes.c_uint16, 128), ('_vtable_offset', ctypes.c_byte, 130), ('_shortbuf', c.Array[ctypes.c_char, Literal[1]], 131), ('_lock', c.POINTER[_IO_lock_t], 136), ('_offset', ctypes.c_int64, 144), ('_codecvt', c.POINTER[struct__IO_codecvt], 152), ('_wide_data', c.POINTER[struct__IO_wide_data], 160), ('_freeres_list', c.POINTER[struct__IO_FILE], 168), ('_freeres_buf', ctypes.c_void_p, 176), ('__pad5', size_t, 184), ('_mode', ctypes.c_int32, 192), ('_unused2', c.Array[ctypes.c_char, Literal[20]], 196)]) +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[FILE]) +def nir_print_shader(shader:c.POINTER[nir_shader], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_function_impl], c.POINTER[FILE]) +def nir_print_function_body(impl:c.POINTER[nir_function_impl], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[FILE], c.POINTER[struct_hash_table]) +def nir_print_shader_annotated(shader:c.POINTER[nir_shader], fp:c.POINTER[FILE], errors:c.POINTER[struct_hash_table]) -> None: ... +@dll.bind(None, c.POINTER[nir_instr], c.POINTER[FILE]) +def nir_print_instr(instr:c.POINTER[nir_instr], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_deref_instr], c.POINTER[FILE]) +def nir_print_deref(deref:c.POINTER[nir_deref_instr], fp:c.POINTER[FILE]) -> None: ... +enum_mesa_log_level: dict[int, str] = {(MESA_LOG_ERROR:=0): 'MESA_LOG_ERROR', (MESA_LOG_WARN:=1): 'MESA_LOG_WARN', (MESA_LOG_INFO:=2): 'MESA_LOG_INFO', (MESA_LOG_DEBUG:=3): 'MESA_LOG_DEBUG'} +@dll.bind(None, ctypes.c_uint32, c.POINTER[ctypes.c_char], c.POINTER[nir_shader], c.POINTER[struct_hash_table]) +def nir_log_shader_annotated_tagged(level:ctypes.c_uint32, tag:c.POINTER[ctypes.c_char], shader:c.POINTER[nir_shader], annotations:c.POINTER[struct_hash_table]) -> None: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[nir_shader], ctypes.c_void_p) +def nir_shader_as_str(nir:c.POINTER[nir_shader], mem_ctx:ctypes.c_void_p) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[nir_shader], c.POINTER[struct_hash_table], ctypes.c_void_p) +def nir_shader_as_str_annotated(nir:c.POINTER[nir_shader], annotations:c.POINTER[struct_hash_table], mem_ctx:ctypes.c_void_p) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[nir_instr], ctypes.c_void_p) +def nir_instr_as_str(instr:c.POINTER[nir_instr], mem_ctx:ctypes.c_void_p) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[nir_shader], c.POINTER[ctypes.c_char], uint32_t) +def nir_shader_gather_debug_info(shader:c.POINTER[nir_shader], filename:c.POINTER[ctypes.c_char], first_line:uint32_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[nir_instr], c.POINTER[nir_shader], c.POINTER[nir_instr]) +def nir_instr_clone(s:c.POINTER[nir_shader], orig:c.POINTER[nir_instr]) -> c.POINTER[nir_instr]: ... +@dll.bind(c.POINTER[nir_instr], c.POINTER[nir_shader], c.POINTER[nir_instr], c.POINTER[struct_hash_table]) +def nir_instr_clone_deep(s:c.POINTER[nir_shader], orig:c.POINTER[nir_instr], remap_table:c.POINTER[struct_hash_table]) -> c.POINTER[nir_instr]: ... +@dll.bind(c.POINTER[nir_alu_instr], c.POINTER[nir_shader], c.POINTER[nir_alu_instr]) +def nir_alu_instr_clone(s:c.POINTER[nir_shader], orig:c.POINTER[nir_alu_instr]) -> c.POINTER[nir_alu_instr]: ... +@dll.bind(c.POINTER[nir_shader], ctypes.c_void_p, c.POINTER[nir_shader]) +def nir_shader_clone(mem_ctx:ctypes.c_void_p, s:c.POINTER[nir_shader]) -> c.POINTER[nir_shader]: ... +@dll.bind(c.POINTER[nir_function], c.POINTER[nir_shader], c.POINTER[nir_function]) +def nir_function_clone(ns:c.POINTER[nir_shader], fxn:c.POINTER[nir_function]) -> c.POINTER[nir_function]: ... +@dll.bind(c.POINTER[nir_function_impl], c.POINTER[nir_shader], c.POINTER[nir_function_impl]) +def nir_function_impl_clone(shader:c.POINTER[nir_shader], fi:c.POINTER[nir_function_impl]) -> c.POINTER[nir_function_impl]: ... +@dll.bind(c.POINTER[nir_function_impl], c.POINTER[nir_shader], c.POINTER[nir_function_impl], c.POINTER[struct_hash_table]) +def nir_function_impl_clone_remap_globals(shader:c.POINTER[nir_shader], fi:c.POINTER[nir_function_impl], remap_table:c.POINTER[struct_hash_table]) -> c.POINTER[nir_function_impl]: ... +@dll.bind(c.POINTER[nir_constant], c.POINTER[nir_constant], c.POINTER[nir_variable]) +def nir_constant_clone(c:c.POINTER[nir_constant], var:c.POINTER[nir_variable]) -> c.POINTER[nir_constant]: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_variable], c.POINTER[nir_shader]) +def nir_variable_clone(c:c.POINTER[nir_variable], shader:c.POINTER[nir_shader]) -> c.POINTER[nir_variable]: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_shader]) +def nir_shader_replace(dest:c.POINTER[nir_shader], src:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_shader_serialize_deserialize(s:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[ctypes.c_char]) +def nir_validate_shader(shader:c.POINTER[nir_shader], when:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[ctypes.c_char]) +def nir_validate_ssa_dominance(shader:c.POINTER[nir_shader], when:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_metadata_set_validation_flag(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_metadata_check_validation_flag(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_metadata_require_all(shader:c.POINTER[nir_shader]) -> None: ... +nir_instr_writemask_filter_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_instr], ctypes.c_uint32, ctypes.c_void_p]] +@c.record +class struct_nir_builder(c.Struct): + SIZE = 40 + cursor: struct_nir_cursor + exact: bool + fp_fast_math: int + shader: c.POINTER[struct_nir_shader] + impl: c.POINTER[struct_nir_function_impl] +nir_lower_instr_cb: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_nir_def], [c.POINTER[struct_nir_builder], c.POINTER[struct_nir_instr], ctypes.c_void_p]] +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl], nir_instr_filter_cb, nir_lower_instr_cb, ctypes.c_void_p) +def nir_function_impl_lower_instructions(impl:c.POINTER[nir_function_impl], filter:nir_instr_filter_cb, lower:nir_lower_instr_cb, cb_data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_instr_filter_cb, nir_lower_instr_cb, ctypes.c_void_p) +def nir_shader_lower_instructions(shader:c.POINTER[nir_shader], filter:nir_instr_filter_cb, lower:nir_lower_instr_cb, cb_data:ctypes.c_void_p) -> bool: ... +@dll.bind(None, c.POINTER[nir_function_impl]) +def nir_calc_dominance_impl(impl:c.POINTER[nir_function_impl]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_calc_dominance(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(c.POINTER[nir_block], c.POINTER[nir_block], c.POINTER[nir_block]) +def nir_dominance_lca(b1:c.POINTER[nir_block], b2:c.POINTER[nir_block]) -> c.POINTER[nir_block]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_block], c.POINTER[nir_block]) +def nir_block_dominates(parent:c.POINTER[nir_block], child:c.POINTER[nir_block]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_block]) +def nir_block_is_unreachable(block:c.POINTER[nir_block]) -> bool: ... +@dll.bind(None, c.POINTER[nir_function_impl], c.POINTER[FILE]) +def nir_dump_dom_tree_impl(impl:c.POINTER[nir_function_impl], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[FILE]) +def nir_dump_dom_tree(shader:c.POINTER[nir_shader], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_function_impl], c.POINTER[FILE]) +def nir_dump_dom_frontier_impl(impl:c.POINTER[nir_function_impl], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[FILE]) +def nir_dump_dom_frontier(shader:c.POINTER[nir_shader], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_function_impl], c.POINTER[FILE]) +def nir_dump_cfg_impl(impl:c.POINTER[nir_function_impl], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[FILE]) +def nir_dump_cfg(shader:c.POINTER[nir_shader], fp:c.POINTER[FILE]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32], ctypes.c_uint32) +def nir_gs_count_vertices_and_primitives(shader:c.POINTER[nir_shader], out_vtxcnt:c.POINTER[ctypes.c_int32], out_prmcnt:c.POINTER[ctypes.c_int32], out_decomposed_prmcnt:c.POINTER[ctypes.c_int32], num_streams:int) -> None: ... +nir_load_grouping: dict[int, str] = {(nir_group_all:=0): 'nir_group_all', (nir_group_same_resource_only:=1): 'nir_group_same_resource_only'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_uint32) +def nir_group_loads(shader:c.POINTER[nir_shader], grouping:ctypes.c_uint32, max_distance:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_shrink_vec_array_vars(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_split_array_vars(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_split_var_copies(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_split_per_member_structs(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_split_struct_vars(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl]) +def nir_lower_returns_impl(impl:c.POINTER[nir_function_impl]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_returns(shader:c.POINTER[nir_shader]) -> bool: ... +nir_builder: TypeAlias = struct_nir_builder +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_function_impl], c.POINTER[c.POINTER[nir_def]], c.POINTER[struct_hash_table]) +def nir_inline_function_impl(b:c.POINTER[nir_builder], impl:c.POINTER[nir_function_impl], params:c.POINTER[c.POINTER[nir_def]], shader_var_remap:c.POINTER[struct_hash_table]) -> c.POINTER[nir_def]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_inline_functions(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_cleanup_functions(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_shader]) +def nir_link_shader_functions(shader:c.POINTER[nir_shader], link_shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_calls_to_builtins(s:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_find_inlinable_uniforms(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, c.POINTER[uint32_t], c.POINTER[uint16_t]) +def nir_inline_uniforms(shader:c.POINTER[nir_shader], num_uniforms:int, uniform_values:c.POINTER[uint32_t], uniform_dw_offsets:c.POINTER[uint16_t]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_src], ctypes.c_int32, c.POINTER[uint32_t], c.POINTER[uint8_t], ctypes.c_uint32, ctypes.c_uint32) +def nir_collect_src_uniforms(src:c.POINTER[nir_src], component:int, uni_offsets:c.POINTER[uint32_t], num_offsets:c.POINTER[uint8_t], max_num_bo:int, max_offset:int) -> bool: ... +@dll.bind(None, c.POINTER[nir_src], c.POINTER[nir_loop_info], c.POINTER[uint32_t], c.POINTER[uint8_t], ctypes.c_uint32, ctypes.c_uint32) +def nir_add_inlinable_uniforms(cond:c.POINTER[nir_src], info:c.POINTER[nir_loop_info], uni_offsets:c.POINTER[uint32_t], num_offsets:c.POINTER[uint8_t], max_num_bo:int, max_offset:int) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_propagate_invariant(shader:c.POINTER[nir_shader], invariant_prim:bool) -> bool: ... +@dll.bind(None, c.POINTER[nir_intrinsic_instr], c.POINTER[nir_shader]) +def nir_lower_var_copy_instr(copy:c.POINTER[nir_intrinsic_instr], shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_builder], c.POINTER[nir_intrinsic_instr]) +def nir_lower_deref_copy_instr(b:c.POINTER[nir_builder], copy:c.POINTER[nir_intrinsic_instr]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_var_copies(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_memcpy(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_memcpy(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_fixup_deref_modes(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_fixup_deref_types(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_global_vars_to_local(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_lower_constant_to_temp(shader:c.POINTER[nir_shader]) -> None: ... +nir_lower_array_deref_of_vec_options: dict[int, str] = {(nir_lower_direct_array_deref_of_vec_load:=1): 'nir_lower_direct_array_deref_of_vec_load', (nir_lower_indirect_array_deref_of_vec_load:=2): 'nir_lower_indirect_array_deref_of_vec_load', (nir_lower_direct_array_deref_of_vec_store:=4): 'nir_lower_direct_array_deref_of_vec_store', (nir_lower_indirect_array_deref_of_vec_store:=8): 'nir_lower_indirect_array_deref_of_vec_store'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[nir_variable]]], ctypes.c_uint32) +def nir_lower_array_deref_of_vec(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32, filter:c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[nir_variable]]], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, uint32_t) +def nir_lower_indirect_derefs(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32, max_lower_array_len:uint32_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_set]) +def nir_lower_indirect_var_derefs(shader:c.POINTER[nir_shader], vars:c.POINTER[struct_set]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], uint8_t) +def nir_lower_locals_to_regs(shader:c.POINTER[nir_shader], bool_bitsize:uint8_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_function_impl], ctypes.c_bool, ctypes.c_bool) +def nir_lower_io_vars_to_temporaries(shader:c.POINTER[nir_shader], entrypoint:c.POINTER[nir_function_impl], outputs:bool, inputs:bool) -> bool: ... +glsl_type_size_align_func: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_glsl_type], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]]] +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_int32, glsl_type_size_align_func, glsl_type_size_align_func) +def nir_lower_vars_to_scratch(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32, size_threshold:int, variable_size_align:glsl_type_size_align_func, scratch_layout_size_align:glsl_type_size_align_func) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_scratch_to_var(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_clip_halfz(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_function_impl]) +def nir_shader_gather_info(shader:c.POINTER[nir_shader], entrypoint:c.POINTER[nir_function_impl]) -> None: ... +@dll.bind(None, c.POINTER[nir_function_impl], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def nir_gather_types(impl:c.POINTER[nir_function_impl], float_types:c.POINTER[ctypes.c_uint32], int_types:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_shader]) +def nir_remove_unused_varyings(producer:c.POINTER[nir_shader], consumer:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, c.POINTER[uint64_t], c.POINTER[uint64_t]) +def nir_remove_unused_io_vars(shader:c.POINTER[nir_shader], mode:ctypes.c_uint32, used_by_other_stage:c.POINTER[uint64_t], used_by_other_stage_patches:c.POINTER[uint64_t]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_shader], ctypes.c_bool) +def nir_compact_varyings(producer:c.POINTER[nir_shader], consumer:c.POINTER[nir_shader], default_to_smooth_interp:bool) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_shader]) +def nir_link_xfb_varyings(producer:c.POINTER[nir_shader], consumer:c.POINTER[nir_shader]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_shader]) +def nir_link_opt_varyings(producer:c.POINTER[nir_shader], consumer:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_shader]) +def nir_link_varying_precision(producer:c.POINTER[nir_shader], consumer:c.POINTER[nir_shader]) -> None: ... +@dll.bind(c.POINTER[nir_variable], c.POINTER[nir_shader], c.POINTER[nir_variable], ctypes.c_bool) +def nir_clone_uniform_variable(nir:c.POINTER[nir_shader], uniform:c.POINTER[nir_variable], spirv:bool) -> c.POINTER[nir_variable]: ... +@dll.bind(c.POINTER[nir_deref_instr], c.POINTER[nir_builder], c.POINTER[nir_variable], c.POINTER[nir_deref_instr]) +def nir_clone_deref_instr(b:c.POINTER[nir_builder], var:c.POINTER[nir_variable], deref:c.POINTER[nir_deref_instr]) -> c.POINTER[nir_deref_instr]: ... +nir_opt_varyings_progress: dict[int, str] = {(nir_progress_producer:=1): 'nir_progress_producer', (nir_progress_consumer:=2): 'nir_progress_consumer'} +@dll.bind(ctypes.c_uint32, c.POINTER[nir_shader], c.POINTER[nir_shader], ctypes.c_bool, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool) +def nir_opt_varyings(producer:c.POINTER[nir_shader], consumer:c.POINTER[nir_shader], spirv:bool, max_uniform_components:int, max_ubos_per_stage:int, debug_no_algebraic:bool) -> ctypes.c_uint32: ... +gl_varying_slot: dict[int, str] = {(VARYING_SLOT_POS:=0): 'VARYING_SLOT_POS', (VARYING_SLOT_COL0:=1): 'VARYING_SLOT_COL0', (VARYING_SLOT_COL1:=2): 'VARYING_SLOT_COL1', (VARYING_SLOT_FOGC:=3): 'VARYING_SLOT_FOGC', (VARYING_SLOT_TEX0:=4): 'VARYING_SLOT_TEX0', (VARYING_SLOT_TEX1:=5): 'VARYING_SLOT_TEX1', (VARYING_SLOT_TEX2:=6): 'VARYING_SLOT_TEX2', (VARYING_SLOT_TEX3:=7): 'VARYING_SLOT_TEX3', (VARYING_SLOT_TEX4:=8): 'VARYING_SLOT_TEX4', (VARYING_SLOT_TEX5:=9): 'VARYING_SLOT_TEX5', (VARYING_SLOT_TEX6:=10): 'VARYING_SLOT_TEX6', (VARYING_SLOT_TEX7:=11): 'VARYING_SLOT_TEX7', (VARYING_SLOT_PSIZ:=12): 'VARYING_SLOT_PSIZ', (VARYING_SLOT_BFC0:=13): 'VARYING_SLOT_BFC0', (VARYING_SLOT_BFC1:=14): 'VARYING_SLOT_BFC1', (VARYING_SLOT_EDGE:=15): 'VARYING_SLOT_EDGE', (VARYING_SLOT_CLIP_VERTEX:=16): 'VARYING_SLOT_CLIP_VERTEX', (VARYING_SLOT_CLIP_DIST0:=17): 'VARYING_SLOT_CLIP_DIST0', (VARYING_SLOT_CLIP_DIST1:=18): 'VARYING_SLOT_CLIP_DIST1', (VARYING_SLOT_CULL_DIST0:=19): 'VARYING_SLOT_CULL_DIST0', (VARYING_SLOT_CULL_DIST1:=20): 'VARYING_SLOT_CULL_DIST1', (VARYING_SLOT_PRIMITIVE_ID:=21): 'VARYING_SLOT_PRIMITIVE_ID', (VARYING_SLOT_LAYER:=22): 'VARYING_SLOT_LAYER', (VARYING_SLOT_VIEWPORT:=23): 'VARYING_SLOT_VIEWPORT', (VARYING_SLOT_FACE:=24): 'VARYING_SLOT_FACE', (VARYING_SLOT_PNTC:=25): 'VARYING_SLOT_PNTC', (VARYING_SLOT_TESS_LEVEL_OUTER:=26): 'VARYING_SLOT_TESS_LEVEL_OUTER', (VARYING_SLOT_TESS_LEVEL_INNER:=27): 'VARYING_SLOT_TESS_LEVEL_INNER', (VARYING_SLOT_BOUNDING_BOX0:=28): 'VARYING_SLOT_BOUNDING_BOX0', (VARYING_SLOT_BOUNDING_BOX1:=29): 'VARYING_SLOT_BOUNDING_BOX1', (VARYING_SLOT_VIEW_INDEX:=30): 'VARYING_SLOT_VIEW_INDEX', (VARYING_SLOT_VIEWPORT_MASK:=31): 'VARYING_SLOT_VIEWPORT_MASK', (VARYING_SLOT_PRIMITIVE_SHADING_RATE:=24): 'VARYING_SLOT_PRIMITIVE_SHADING_RATE', (VARYING_SLOT_PRIMITIVE_COUNT:=26): 'VARYING_SLOT_PRIMITIVE_COUNT', (VARYING_SLOT_PRIMITIVE_INDICES:=27): 'VARYING_SLOT_PRIMITIVE_INDICES', (VARYING_SLOT_TASK_COUNT:=28): 'VARYING_SLOT_TASK_COUNT', (VARYING_SLOT_CULL_PRIMITIVE:=28): 'VARYING_SLOT_CULL_PRIMITIVE', (VARYING_SLOT_VAR0:=32): 'VARYING_SLOT_VAR0', (VARYING_SLOT_VAR1:=33): 'VARYING_SLOT_VAR1', (VARYING_SLOT_VAR2:=34): 'VARYING_SLOT_VAR2', (VARYING_SLOT_VAR3:=35): 'VARYING_SLOT_VAR3', (VARYING_SLOT_VAR4:=36): 'VARYING_SLOT_VAR4', (VARYING_SLOT_VAR5:=37): 'VARYING_SLOT_VAR5', (VARYING_SLOT_VAR6:=38): 'VARYING_SLOT_VAR6', (VARYING_SLOT_VAR7:=39): 'VARYING_SLOT_VAR7', (VARYING_SLOT_VAR8:=40): 'VARYING_SLOT_VAR8', (VARYING_SLOT_VAR9:=41): 'VARYING_SLOT_VAR9', (VARYING_SLOT_VAR10:=42): 'VARYING_SLOT_VAR10', (VARYING_SLOT_VAR11:=43): 'VARYING_SLOT_VAR11', (VARYING_SLOT_VAR12:=44): 'VARYING_SLOT_VAR12', (VARYING_SLOT_VAR13:=45): 'VARYING_SLOT_VAR13', (VARYING_SLOT_VAR14:=46): 'VARYING_SLOT_VAR14', (VARYING_SLOT_VAR15:=47): 'VARYING_SLOT_VAR15', (VARYING_SLOT_VAR16:=48): 'VARYING_SLOT_VAR16', (VARYING_SLOT_VAR17:=49): 'VARYING_SLOT_VAR17', (VARYING_SLOT_VAR18:=50): 'VARYING_SLOT_VAR18', (VARYING_SLOT_VAR19:=51): 'VARYING_SLOT_VAR19', (VARYING_SLOT_VAR20:=52): 'VARYING_SLOT_VAR20', (VARYING_SLOT_VAR21:=53): 'VARYING_SLOT_VAR21', (VARYING_SLOT_VAR22:=54): 'VARYING_SLOT_VAR22', (VARYING_SLOT_VAR23:=55): 'VARYING_SLOT_VAR23', (VARYING_SLOT_VAR24:=56): 'VARYING_SLOT_VAR24', (VARYING_SLOT_VAR25:=57): 'VARYING_SLOT_VAR25', (VARYING_SLOT_VAR26:=58): 'VARYING_SLOT_VAR26', (VARYING_SLOT_VAR27:=59): 'VARYING_SLOT_VAR27', (VARYING_SLOT_VAR28:=60): 'VARYING_SLOT_VAR28', (VARYING_SLOT_VAR29:=61): 'VARYING_SLOT_VAR29', (VARYING_SLOT_VAR30:=62): 'VARYING_SLOT_VAR30', (VARYING_SLOT_VAR31:=63): 'VARYING_SLOT_VAR31', (VARYING_SLOT_PATCH0:=64): 'VARYING_SLOT_PATCH0', (VARYING_SLOT_PATCH1:=65): 'VARYING_SLOT_PATCH1', (VARYING_SLOT_PATCH2:=66): 'VARYING_SLOT_PATCH2', (VARYING_SLOT_PATCH3:=67): 'VARYING_SLOT_PATCH3', (VARYING_SLOT_PATCH4:=68): 'VARYING_SLOT_PATCH4', (VARYING_SLOT_PATCH5:=69): 'VARYING_SLOT_PATCH5', (VARYING_SLOT_PATCH6:=70): 'VARYING_SLOT_PATCH6', (VARYING_SLOT_PATCH7:=71): 'VARYING_SLOT_PATCH7', (VARYING_SLOT_PATCH8:=72): 'VARYING_SLOT_PATCH8', (VARYING_SLOT_PATCH9:=73): 'VARYING_SLOT_PATCH9', (VARYING_SLOT_PATCH10:=74): 'VARYING_SLOT_PATCH10', (VARYING_SLOT_PATCH11:=75): 'VARYING_SLOT_PATCH11', (VARYING_SLOT_PATCH12:=76): 'VARYING_SLOT_PATCH12', (VARYING_SLOT_PATCH13:=77): 'VARYING_SLOT_PATCH13', (VARYING_SLOT_PATCH14:=78): 'VARYING_SLOT_PATCH14', (VARYING_SLOT_PATCH15:=79): 'VARYING_SLOT_PATCH15', (VARYING_SLOT_PATCH16:=80): 'VARYING_SLOT_PATCH16', (VARYING_SLOT_PATCH17:=81): 'VARYING_SLOT_PATCH17', (VARYING_SLOT_PATCH18:=82): 'VARYING_SLOT_PATCH18', (VARYING_SLOT_PATCH19:=83): 'VARYING_SLOT_PATCH19', (VARYING_SLOT_PATCH20:=84): 'VARYING_SLOT_PATCH20', (VARYING_SLOT_PATCH21:=85): 'VARYING_SLOT_PATCH21', (VARYING_SLOT_PATCH22:=86): 'VARYING_SLOT_PATCH22', (VARYING_SLOT_PATCH23:=87): 'VARYING_SLOT_PATCH23', (VARYING_SLOT_PATCH24:=88): 'VARYING_SLOT_PATCH24', (VARYING_SLOT_PATCH25:=89): 'VARYING_SLOT_PATCH25', (VARYING_SLOT_PATCH26:=90): 'VARYING_SLOT_PATCH26', (VARYING_SLOT_PATCH27:=91): 'VARYING_SLOT_PATCH27', (VARYING_SLOT_PATCH28:=92): 'VARYING_SLOT_PATCH28', (VARYING_SLOT_PATCH29:=93): 'VARYING_SLOT_PATCH29', (VARYING_SLOT_PATCH30:=94): 'VARYING_SLOT_PATCH30', (VARYING_SLOT_PATCH31:=95): 'VARYING_SLOT_PATCH31', (VARYING_SLOT_VAR0_16BIT:=96): 'VARYING_SLOT_VAR0_16BIT', (VARYING_SLOT_VAR1_16BIT:=97): 'VARYING_SLOT_VAR1_16BIT', (VARYING_SLOT_VAR2_16BIT:=98): 'VARYING_SLOT_VAR2_16BIT', (VARYING_SLOT_VAR3_16BIT:=99): 'VARYING_SLOT_VAR3_16BIT', (VARYING_SLOT_VAR4_16BIT:=100): 'VARYING_SLOT_VAR4_16BIT', (VARYING_SLOT_VAR5_16BIT:=101): 'VARYING_SLOT_VAR5_16BIT', (VARYING_SLOT_VAR6_16BIT:=102): 'VARYING_SLOT_VAR6_16BIT', (VARYING_SLOT_VAR7_16BIT:=103): 'VARYING_SLOT_VAR7_16BIT', (VARYING_SLOT_VAR8_16BIT:=104): 'VARYING_SLOT_VAR8_16BIT', (VARYING_SLOT_VAR9_16BIT:=105): 'VARYING_SLOT_VAR9_16BIT', (VARYING_SLOT_VAR10_16BIT:=106): 'VARYING_SLOT_VAR10_16BIT', (VARYING_SLOT_VAR11_16BIT:=107): 'VARYING_SLOT_VAR11_16BIT', (VARYING_SLOT_VAR12_16BIT:=108): 'VARYING_SLOT_VAR12_16BIT', (VARYING_SLOT_VAR13_16BIT:=109): 'VARYING_SLOT_VAR13_16BIT', (VARYING_SLOT_VAR14_16BIT:=110): 'VARYING_SLOT_VAR14_16BIT', (VARYING_SLOT_VAR15_16BIT:=111): 'VARYING_SLOT_VAR15_16BIT', (NUM_TOTAL_VARYING_SLOTS:=112): 'NUM_TOTAL_VARYING_SLOTS'} +@dll.bind(ctypes.c_bool, ctypes.c_uint32, gl_shader_stage) +def nir_slot_is_sysval_output(slot:ctypes.c_uint32, next_shader:gl_shader_stage) -> bool: ... +@dll.bind(ctypes.c_bool, ctypes.c_uint32, gl_shader_stage) +def nir_slot_is_varying(slot:ctypes.c_uint32, next_shader:gl_shader_stage) -> bool: ... +@dll.bind(ctypes.c_bool, ctypes.c_uint32, gl_shader_stage) +def nir_slot_is_sysval_output_and_varying(slot:ctypes.c_uint32, next_shader:gl_shader_stage) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_intrinsic_instr], gl_shader_stage) +def nir_remove_varying(intr:c.POINTER[nir_intrinsic_instr], next_shader:gl_shader_stage) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_intrinsic_instr], gl_shader_stage) +def nir_remove_sysval_output(intr:c.POINTER[nir_intrinsic_instr], next_shader:gl_shader_stage) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.CFUNCTYPE[ctypes.c_int32, [c.POINTER[struct_glsl_type], ctypes.c_bool]]) +def nir_lower_amul(shader:c.POINTER[nir_shader], type_size:c.CFUNCTYPE[ctypes.c_int32, [c.POINTER[struct_glsl_type], ctypes.c_bool]]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_ubo_vec4(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_sort_variables_by_location(shader:c.POINTER[nir_shader], mode:ctypes.c_uint32) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], ctypes.c_uint32, c.POINTER[ctypes.c_uint32], gl_shader_stage) +def nir_assign_io_var_locations(shader:c.POINTER[nir_shader], mode:ctypes.c_uint32, size:c.POINTER[ctypes.c_uint32], stage:gl_shader_stage) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_clip_cull_const(shader:c.POINTER[nir_shader]) -> bool: ... +nir_lower_io_options: dict[int, str] = {(nir_lower_io_lower_64bit_to_32:=1): 'nir_lower_io_lower_64bit_to_32', (nir_lower_io_lower_64bit_float_to_32:=2): 'nir_lower_io_lower_64bit_float_to_32', (nir_lower_io_lower_64bit_to_32_new:=4): 'nir_lower_io_lower_64bit_to_32_new', (nir_lower_io_use_interpolated_input_intrinsics:=8): 'nir_lower_io_use_interpolated_input_intrinsics'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, c.CFUNCTYPE[ctypes.c_int32, [c.POINTER[struct_glsl_type], ctypes.c_bool]], ctypes.c_uint32) +def nir_lower_io(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32, type_size:c.CFUNCTYPE[ctypes.c_int32, [c.POINTER[struct_glsl_type], ctypes.c_bool]], _3:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_io_add_const_offset_to_base(nir:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader], ctypes.c_bool) +def nir_lower_io_passes(nir:c.POINTER[nir_shader], renumber_vs_inputs:bool) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_io_add_intrinsic_xfb_info(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_io_indirect_loads(nir:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, glsl_type_size_align_func) +def nir_lower_vars_to_explicit_types(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32, type_info:glsl_type_size_align_func) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader], ctypes.c_void_p, size_t, ctypes.c_uint32) +def nir_gather_explicit_io_initializers(shader:c.POINTER[nir_shader], dst:ctypes.c_void_p, dst_size:size_t, mode:ctypes.c_uint32) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_vec3_to_vec4(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +nir_address_format: dict[int, str] = {(nir_address_format_32bit_global:=0): 'nir_address_format_32bit_global', (nir_address_format_64bit_global:=1): 'nir_address_format_64bit_global', (nir_address_format_2x32bit_global:=2): 'nir_address_format_2x32bit_global', (nir_address_format_64bit_global_32bit_offset:=3): 'nir_address_format_64bit_global_32bit_offset', (nir_address_format_64bit_bounded_global:=4): 'nir_address_format_64bit_bounded_global', (nir_address_format_32bit_index_offset:=5): 'nir_address_format_32bit_index_offset', (nir_address_format_32bit_index_offset_pack64:=6): 'nir_address_format_32bit_index_offset_pack64', (nir_address_format_vec2_index_32bit_offset:=7): 'nir_address_format_vec2_index_32bit_offset', (nir_address_format_62bit_generic:=8): 'nir_address_format_62bit_generic', (nir_address_format_32bit_offset:=9): 'nir_address_format_32bit_offset', (nir_address_format_32bit_offset_as_64bit:=10): 'nir_address_format_32bit_offset_as_64bit', (nir_address_format_logical:=11): 'nir_address_format_logical'} +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def nir_address_format_bit_size(addr_format:ctypes.c_uint32) -> int: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def nir_address_format_num_components(addr_format:ctypes.c_uint32) -> int: ... +@dll.bind(c.POINTER[nir_const_value], ctypes.c_uint32) +def nir_address_format_null_value(addr_format:ctypes.c_uint32) -> c.POINTER[nir_const_value]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[nir_def]) +def nir_build_addr_iadd(b:c.POINTER[nir_builder], addr:c.POINTER[nir_def], addr_format:ctypes.c_uint32, modes:ctypes.c_uint32, offset:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], ctypes.c_uint32, ctypes.c_uint32, int64_t) +def nir_build_addr_iadd_imm(b:c.POINTER[nir_builder], addr:c.POINTER[nir_def], addr_format:ctypes.c_uint32, modes:ctypes.c_uint32, offset:int64_t) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], c.POINTER[nir_def], ctypes.c_uint32) +def nir_build_addr_ieq(b:c.POINTER[nir_builder], addr0:c.POINTER[nir_def], addr1:c.POINTER[nir_def], addr_format:ctypes.c_uint32) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], c.POINTER[nir_def], ctypes.c_uint32) +def nir_build_addr_isub(b:c.POINTER[nir_builder], addr0:c.POINTER[nir_def], addr1:c.POINTER[nir_def], addr_format:ctypes.c_uint32) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_deref_instr], c.POINTER[nir_def], ctypes.c_uint32) +def nir_explicit_io_address_from_deref(b:c.POINTER[nir_builder], deref:c.POINTER[nir_deref_instr], base_addr:c.POINTER[nir_def], addr_format:ctypes.c_uint32) -> c.POINTER[nir_def]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_deref_instr], ctypes.c_bool, c.POINTER[uint32_t], c.POINTER[uint32_t]) +def nir_get_explicit_deref_align(deref:c.POINTER[nir_deref_instr], default_to_type_align:bool, align_mul:c.POINTER[uint32_t], align_offset:c.POINTER[uint32_t]) -> bool: ... +@dll.bind(None, c.POINTER[nir_builder], c.POINTER[nir_intrinsic_instr], c.POINTER[nir_def], ctypes.c_uint32) +def nir_lower_explicit_io_instr(b:c.POINTER[nir_builder], io_instr:c.POINTER[nir_intrinsic_instr], addr:c.POINTER[nir_def], addr_format:ctypes.c_uint32) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_uint32) +def nir_lower_explicit_io(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32, _2:ctypes.c_uint32) -> bool: ... +nir_mem_access_shift_method: dict[int, str] = {(nir_mem_access_shift_method_scalar:=0): 'nir_mem_access_shift_method_scalar', (nir_mem_access_shift_method_shift64:=1): 'nir_mem_access_shift_method_shift64', (nir_mem_access_shift_method_bytealign_amd:=2): 'nir_mem_access_shift_method_bytealign_amd'} +@c.record +class struct_nir_mem_access_size_align(c.Struct): + SIZE = 8 + num_components: int + bit_size: int + align: int + shift: int +struct_nir_mem_access_size_align.register_fields([('num_components', uint8_t, 0), ('bit_size', uint8_t, 1), ('align', uint16_t, 2), ('shift', ctypes.c_uint32, 4)]) +nir_mem_access_size_align: TypeAlias = struct_nir_mem_access_size_align +enum_gl_access_qualifier: dict[int, str] = {(ACCESS_COHERENT:=1): 'ACCESS_COHERENT', (ACCESS_RESTRICT:=2): 'ACCESS_RESTRICT', (ACCESS_VOLATILE:=4): 'ACCESS_VOLATILE', (ACCESS_NON_READABLE:=8): 'ACCESS_NON_READABLE', (ACCESS_NON_WRITEABLE:=16): 'ACCESS_NON_WRITEABLE', (ACCESS_NON_UNIFORM:=32): 'ACCESS_NON_UNIFORM', (ACCESS_CAN_REORDER:=64): 'ACCESS_CAN_REORDER', (ACCESS_NON_TEMPORAL:=128): 'ACCESS_NON_TEMPORAL', (ACCESS_INCLUDE_HELPERS:=256): 'ACCESS_INCLUDE_HELPERS', (ACCESS_IS_SWIZZLED_AMD:=512): 'ACCESS_IS_SWIZZLED_AMD', (ACCESS_USES_FORMAT_AMD:=1024): 'ACCESS_USES_FORMAT_AMD', (ACCESS_FMASK_LOWERED_AMD:=2048): 'ACCESS_FMASK_LOWERED_AMD', (ACCESS_CAN_SPECULATE:=4096): 'ACCESS_CAN_SPECULATE', (ACCESS_CP_GE_COHERENT_AMD:=8192): 'ACCESS_CP_GE_COHERENT_AMD', (ACCESS_IN_BOUNDS:=16384): 'ACCESS_IN_BOUNDS', (ACCESS_KEEP_SCALAR:=32768): 'ACCESS_KEEP_SCALAR', (ACCESS_SMEM_AMD:=65536): 'ACCESS_SMEM_AMD'} +nir_lower_mem_access_bit_sizes_cb: TypeAlias = c.CFUNCTYPE[struct_nir_mem_access_size_align, [ctypes.c_uint32, ctypes.c_ubyte, ctypes.c_ubyte, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool, ctypes.c_uint32, ctypes.c_void_p]] +@c.record +class struct_nir_lower_mem_access_bit_sizes_options(c.Struct): + SIZE = 24 + callback: c.CFUNCTYPE[struct_nir_mem_access_size_align, [ctypes.c_uint32, ctypes.c_ubyte, ctypes.c_ubyte, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool, ctypes.c_uint32, ctypes.c_void_p]] + modes: int + may_lower_unaligned_stores_to_atomics: bool + cb_data: ctypes.c_void_p +struct_nir_lower_mem_access_bit_sizes_options.register_fields([('callback', nir_lower_mem_access_bit_sizes_cb, 0), ('modes', ctypes.c_uint32, 8), ('may_lower_unaligned_stores_to_atomics', ctypes.c_bool, 12), ('cb_data', ctypes.c_void_p, 16)]) +nir_lower_mem_access_bit_sizes_options: TypeAlias = struct_nir_lower_mem_access_bit_sizes_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_mem_access_bit_sizes_options]) +def nir_lower_mem_access_bit_sizes(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_mem_access_bit_sizes_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_intrin_filter_cb, ctypes.c_void_p) +def nir_lower_robust_access(s:c.POINTER[nir_shader], filter:nir_intrin_filter_cb, data:ctypes.c_void_p) -> bool: ... +nir_should_vectorize_mem_func: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_int64, c.POINTER[struct_nir_intrinsic_instr], c.POINTER[struct_nir_intrinsic_instr], ctypes.c_void_p]] +@c.record +class struct_nir_load_store_vectorize_options(c.Struct): + SIZE = 32 + callback: c.CFUNCTYPE[ctypes.c_bool, [ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_int64, c.POINTER[struct_nir_intrinsic_instr], c.POINTER[struct_nir_intrinsic_instr], ctypes.c_void_p]] + modes: int + robust_modes: int + cb_data: ctypes.c_void_p + has_shared2_amd: bool +struct_nir_load_store_vectorize_options.register_fields([('callback', nir_should_vectorize_mem_func, 0), ('modes', ctypes.c_uint32, 8), ('robust_modes', ctypes.c_uint32, 12), ('cb_data', ctypes.c_void_p, 16), ('has_shared2_amd', ctypes.c_bool, 24)]) +nir_load_store_vectorize_options: TypeAlias = struct_nir_load_store_vectorize_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_load_store_vectorize_options]) +def nir_opt_load_store_vectorize(shader:c.POINTER[nir_shader], options:c.POINTER[nir_load_store_vectorize_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_load_store_update_alignments(shader:c.POINTER[nir_shader]) -> bool: ... +nir_lower_shader_calls_should_remat_func: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] +@c.record +class struct_nir_lower_shader_calls_options(c.Struct): + SIZE = 48 + address_format: int + stack_alignment: int + localized_loads: bool + vectorizer_callback: c.CFUNCTYPE[ctypes.c_bool, [ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_int64, c.POINTER[struct_nir_intrinsic_instr], c.POINTER[struct_nir_intrinsic_instr], ctypes.c_void_p]] + vectorizer_data: ctypes.c_void_p + should_remat_callback: c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] + should_remat_data: ctypes.c_void_p +struct_nir_lower_shader_calls_options.register_fields([('address_format', ctypes.c_uint32, 0), ('stack_alignment', ctypes.c_uint32, 4), ('localized_loads', ctypes.c_bool, 8), ('vectorizer_callback', nir_should_vectorize_mem_func, 16), ('vectorizer_data', ctypes.c_void_p, 24), ('should_remat_callback', nir_lower_shader_calls_should_remat_func, 32), ('should_remat_data', ctypes.c_void_p, 40)]) +nir_lower_shader_calls_options: TypeAlias = struct_nir_lower_shader_calls_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_shader_calls_options], c.POINTER[c.POINTER[c.POINTER[nir_shader]]], c.POINTER[uint32_t], ctypes.c_void_p) +def nir_lower_shader_calls(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_shader_calls_options], resume_shaders_out:c.POINTER[c.POINTER[c.POINTER[nir_shader]]], num_resume_shaders_out:c.POINTER[uint32_t], mem_ctx:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_int32, c.POINTER[nir_intrinsic_instr]) +def nir_get_io_offset_src_number(instr:c.POINTER[nir_intrinsic_instr]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[nir_intrinsic_instr]) +def nir_get_io_index_src_number(instr:c.POINTER[nir_intrinsic_instr]) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[nir_intrinsic_instr]) +def nir_get_io_arrayed_index_src_number(instr:c.POINTER[nir_intrinsic_instr]) -> int: ... +@dll.bind(c.POINTER[nir_src], c.POINTER[nir_intrinsic_instr]) +def nir_get_io_offset_src(instr:c.POINTER[nir_intrinsic_instr]) -> c.POINTER[nir_src]: ... +@dll.bind(c.POINTER[nir_src], c.POINTER[nir_intrinsic_instr]) +def nir_get_io_index_src(instr:c.POINTER[nir_intrinsic_instr]) -> c.POINTER[nir_src]: ... +@dll.bind(c.POINTER[nir_src], c.POINTER[nir_intrinsic_instr]) +def nir_get_io_arrayed_index_src(instr:c.POINTER[nir_intrinsic_instr]) -> c.POINTER[nir_src]: ... +@dll.bind(c.POINTER[nir_src], c.POINTER[nir_intrinsic_instr]) +def nir_get_shader_call_payload_src(call:c.POINTER[nir_intrinsic_instr]) -> c.POINTER[nir_src]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_intrinsic_instr]) +def nir_is_output_load(intr:c.POINTER[nir_intrinsic_instr]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_variable], gl_shader_stage) +def nir_is_arrayed_io(var:c.POINTER[nir_variable], stage:gl_shader_stage) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl]) +def nir_lower_reg_intrinsics_to_ssa_impl(impl:c.POINTER[nir_function_impl]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_reg_intrinsics_to_ssa(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_vars_to_ssa(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_remove_dead_derefs(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl]) +def nir_remove_dead_derefs_impl(impl:c.POINTER[nir_function_impl]) -> bool: ... +@c.record +class struct_nir_remove_dead_variables_options(c.Struct): + SIZE = 16 + can_remove_var: c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_variable], ctypes.c_void_p]] + can_remove_var_data: ctypes.c_void_p +struct_nir_remove_dead_variables_options.register_fields([('can_remove_var', c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[nir_variable], ctypes.c_void_p]], 0), ('can_remove_var_data', ctypes.c_void_p, 8)]) +nir_remove_dead_variables_options: TypeAlias = struct_nir_remove_dead_variables_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, c.POINTER[nir_remove_dead_variables_options]) +def nir_remove_dead_variables(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32, options:c.POINTER[nir_remove_dead_variables_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_variable_initializers(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_uint32) +def nir_zero_initialize_shared_memory(shader:c.POINTER[nir_shader], shared_size:int, chunk_size:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_uint32) +def nir_clear_shared_memory(shader:c.POINTER[nir_shader], shared_size:int, chunk_size:int) -> bool: ... +nir_opt_move_to_top_options: dict[int, str] = {(nir_move_to_entry_block_only:=1): 'nir_move_to_entry_block_only', (nir_move_to_top_input_loads:=2): 'nir_move_to_top_input_loads', (nir_move_to_top_load_smem_amd:=4): 'nir_move_to_top_load_smem_amd'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_opt_move_to_top(nir:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_move_vec_src_uses_to_dest(shader:c.POINTER[nir_shader], skip_const_srcs:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_move_output_stores_to_end(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_instr_writemask_filter_cb, ctypes.c_void_p) +def nir_lower_vec_to_regs(shader:c.POINTER[nir_shader], cb:nir_instr_writemask_filter_cb, _data:ctypes.c_void_p) -> bool: ... +enum_compare_func: dict[int, str] = {(COMPARE_FUNC_NEVER:=0): 'COMPARE_FUNC_NEVER', (COMPARE_FUNC_LESS:=1): 'COMPARE_FUNC_LESS', (COMPARE_FUNC_EQUAL:=2): 'COMPARE_FUNC_EQUAL', (COMPARE_FUNC_LEQUAL:=3): 'COMPARE_FUNC_LEQUAL', (COMPARE_FUNC_GREATER:=4): 'COMPARE_FUNC_GREATER', (COMPARE_FUNC_NOTEQUAL:=5): 'COMPARE_FUNC_NOTEQUAL', (COMPARE_FUNC_GEQUAL:=6): 'COMPARE_FUNC_GEQUAL', (COMPARE_FUNC_ALWAYS:=7): 'COMPARE_FUNC_ALWAYS'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_bool, c.POINTER[gl_state_index16]) +def nir_lower_alpha_test(shader:c.POINTER[nir_shader], func:ctypes.c_uint32, alpha_to_one:bool, alpha_ref_state_tokens:c.POINTER[gl_state_index16]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], uint8_t, ctypes.c_bool) +def nir_lower_alpha_to_coverage(shader:c.POINTER[nir_shader], nr_samples:uint8_t, has_intrinsic:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_alpha_to_one(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_alu(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_bool) +def nir_lower_flrp(shader:c.POINTER[nir_shader], lowering_mask:int, always_precise:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_scale_fdiv(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_instr_filter_cb, ctypes.c_void_p) +def nir_lower_alu_to_scalar(shader:c.POINTER[nir_shader], cb:nir_instr_filter_cb, data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_vectorize_cb, ctypes.c_void_p) +def nir_lower_alu_width(shader:c.POINTER[nir_shader], cb:nir_vectorize_cb, data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_alu_vec8_16_srcs(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_bool_to_bitsize(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_lower_bool_to_float(shader:c.POINTER[nir_shader], has_fcsel_ne:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_bool_to_int32(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_simplify_convert_alu_types(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_const_arrays_to_uniforms(shader:c.POINTER[nir_shader], max_uniform_components:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[nir_intrinsic_instr]]]) +def nir_lower_convert_alu_types(shader:c.POINTER[nir_shader], should_lower:c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[nir_intrinsic_instr]]]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_constant_convert_alu_types(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_alu_conversion_to_intrinsic(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_int_to_float(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_load_const_to_scalar(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_read_invocation_to_scalar(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_vectorize_cb, ctypes.c_void_p) +def nir_lower_phis_to_scalar(shader:c.POINTER[nir_shader], cb:nir_vectorize_cb, data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_all_phis_to_scalar(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_shader]) +def nir_lower_io_array_vars_to_elements(producer:c.POINTER[nir_shader], consumer:c.POINTER[nir_shader]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_lower_io_array_vars_to_elements_no_indirects(shader:c.POINTER[nir_shader], outputs_only:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, nir_instr_filter_cb, ctypes.c_void_p) +def nir_lower_io_to_scalar(shader:c.POINTER[nir_shader], mask:ctypes.c_uint32, filter:nir_instr_filter_cb, filter_data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_io_vars_to_scalar(shader:c.POINTER[nir_shader], mask:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_opt_vectorize_io_vars(shader:c.POINTER[nir_shader], mask:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_tess_level_array_vars_to_vec(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(c.POINTER[nir_shader], c.POINTER[nir_shader_compiler_options], c.POINTER[ctypes.c_uint32], ctypes.c_uint32, uint8_t) +def nir_create_passthrough_tcs_impl(options:c.POINTER[nir_shader_compiler_options], locations:c.POINTER[ctypes.c_uint32], num_locations:int, patch_vertices:uint8_t) -> c.POINTER[nir_shader]: ... +@dll.bind(c.POINTER[nir_shader], c.POINTER[nir_shader_compiler_options], c.POINTER[nir_shader], uint8_t) +def nir_create_passthrough_tcs(options:c.POINTER[nir_shader_compiler_options], vs:c.POINTER[nir_shader], patch_vertices:uint8_t) -> c.POINTER[nir_shader]: ... +@dll.bind(c.POINTER[nir_shader], c.POINTER[nir_shader_compiler_options], c.POINTER[nir_shader], ctypes.c_ubyte, ctypes.c_ubyte, ctypes.c_bool, ctypes.c_bool, ctypes.c_bool) +def nir_create_passthrough_gs(options:c.POINTER[nir_shader_compiler_options], prev_stage:c.POINTER[nir_shader], primitive_type:ctypes.c_ubyte, output_primitive_type:ctypes.c_ubyte, emulate_edgeflags:bool, force_line_strip_out:bool, passthrough_prim_id:bool) -> c.POINTER[nir_shader]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_fragcolor(shader:c.POINTER[nir_shader], max_cbufs:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_fragcoord_wtrans(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_frag_coord_to_pixel_coord(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_frag_coord_to_pixel_coord(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_viewport_transform(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool, ctypes.c_bool) +def nir_lower_uniforms_to_ubo(shader:c.POINTER[nir_shader], dword_packed:bool, load_vec4:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_is_helper_invocation(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_single_sampled(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_instr_filter_cb) +def nir_lower_atomics(shader:c.POINTER[nir_shader], filter:nir_instr_filter_cb) -> bool: ... +@c.record +class struct_nir_lower_subgroups_options(c.Struct): + SIZE = 24 + filter: c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] + filter_data: ctypes.c_void_p + subgroup_size: int + ballot_bit_size: int + ballot_components: int + lower_to_scalar: bool + lower_vote_trivial: bool + lower_vote_feq: bool + lower_vote_ieq: bool + lower_vote_bool_eq: bool + lower_first_invocation_to_ballot: bool + lower_read_first_invocation: bool + lower_subgroup_masks: bool + lower_relative_shuffle: bool + lower_shuffle_to_32bit: bool + lower_shuffle_to_swizzle_amd: bool + lower_shuffle: bool + lower_quad: bool + lower_quad_broadcast_dynamic: bool + lower_quad_broadcast_dynamic_to_const: bool + lower_quad_vote: bool + lower_elect: bool + lower_read_invocation_to_cond: bool + lower_rotate_to_shuffle: bool + lower_rotate_clustered_to_shuffle: bool + lower_ballot_bit_count_to_mbcnt_amd: bool + lower_inverse_ballot: bool + lower_reduce: bool + lower_boolean_reduce: bool + lower_boolean_shuffle: bool +struct_nir_lower_subgroups_options.register_fields([('filter', nir_instr_filter_cb, 0), ('filter_data', ctypes.c_void_p, 8), ('subgroup_size', uint8_t, 16), ('ballot_bit_size', uint8_t, 17), ('ballot_components', uint8_t, 18), ('lower_to_scalar', ctypes.c_bool, 19, 1, 0), ('lower_vote_trivial', ctypes.c_bool, 19, 1, 1), ('lower_vote_feq', ctypes.c_bool, 19, 1, 2), ('lower_vote_ieq', ctypes.c_bool, 19, 1, 3), ('lower_vote_bool_eq', ctypes.c_bool, 19, 1, 4), ('lower_first_invocation_to_ballot', ctypes.c_bool, 19, 1, 5), ('lower_read_first_invocation', ctypes.c_bool, 19, 1, 6), ('lower_subgroup_masks', ctypes.c_bool, 19, 1, 7), ('lower_relative_shuffle', ctypes.c_bool, 20, 1, 0), ('lower_shuffle_to_32bit', ctypes.c_bool, 20, 1, 1), ('lower_shuffle_to_swizzle_amd', ctypes.c_bool, 20, 1, 2), ('lower_shuffle', ctypes.c_bool, 20, 1, 3), ('lower_quad', ctypes.c_bool, 20, 1, 4), ('lower_quad_broadcast_dynamic', ctypes.c_bool, 20, 1, 5), ('lower_quad_broadcast_dynamic_to_const', ctypes.c_bool, 20, 1, 6), ('lower_quad_vote', ctypes.c_bool, 20, 1, 7), ('lower_elect', ctypes.c_bool, 21, 1, 0), ('lower_read_invocation_to_cond', ctypes.c_bool, 21, 1, 1), ('lower_rotate_to_shuffle', ctypes.c_bool, 21, 1, 2), ('lower_rotate_clustered_to_shuffle', ctypes.c_bool, 21, 1, 3), ('lower_ballot_bit_count_to_mbcnt_amd', ctypes.c_bool, 21, 1, 4), ('lower_inverse_ballot', ctypes.c_bool, 21, 1, 5), ('lower_reduce', ctypes.c_bool, 21, 1, 6), ('lower_boolean_reduce', ctypes.c_bool, 21, 1, 7), ('lower_boolean_shuffle', ctypes.c_bool, 22, 1, 0)]) +nir_lower_subgroups_options: TypeAlias = struct_nir_lower_subgroups_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_subgroups_options]) +def nir_lower_subgroups(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_subgroups_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_system_values(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder]) +def nir_build_lowered_load_helper_invocation(b:c.POINTER[nir_builder]) -> c.POINTER[nir_def]: ... +@c.record +class struct_nir_lower_compute_system_values_options(c.Struct): + SIZE = 16 + has_base_global_invocation_id: bool + has_base_workgroup_id: bool + has_global_size: bool + shuffle_local_ids_for_quad_derivatives: bool + lower_local_invocation_index: bool + lower_cs_local_id_to_index: bool + lower_workgroup_id_to_index: bool + global_id_is_32bit: bool + shortcut_1d_workgroup_id: bool + num_workgroups: c.Array[ctypes.c_uint32, Literal[3]] +struct_nir_lower_compute_system_values_options.register_fields([('has_base_global_invocation_id', ctypes.c_bool, 0, 1, 0), ('has_base_workgroup_id', ctypes.c_bool, 0, 1, 1), ('has_global_size', ctypes.c_bool, 0, 1, 2), ('shuffle_local_ids_for_quad_derivatives', ctypes.c_bool, 0, 1, 3), ('lower_local_invocation_index', ctypes.c_bool, 0, 1, 4), ('lower_cs_local_id_to_index', ctypes.c_bool, 0, 1, 5), ('lower_workgroup_id_to_index', ctypes.c_bool, 0, 1, 6), ('global_id_is_32bit', ctypes.c_bool, 0, 1, 7), ('shortcut_1d_workgroup_id', ctypes.c_bool, 1, 1, 0), ('num_workgroups', c.Array[uint32_t, Literal[3]], 4)]) +nir_lower_compute_system_values_options: TypeAlias = struct_nir_lower_compute_system_values_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_compute_system_values_options]) +def nir_lower_compute_system_values(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_compute_system_values_options]) -> bool: ... +@c.record +class struct_nir_lower_sysvals_to_varyings_options(c.Struct): + SIZE = 1 + frag_coord: bool + front_face: bool + point_coord: bool +struct_nir_lower_sysvals_to_varyings_options.register_fields([('frag_coord', ctypes.c_bool, 0, 1, 0), ('front_face', ctypes.c_bool, 0, 1, 1), ('point_coord', ctypes.c_bool, 0, 1, 2)]) +nir_lower_sysvals_to_varyings_options: TypeAlias = struct_nir_lower_sysvals_to_varyings_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_sysvals_to_varyings_options]) +def nir_lower_sysvals_to_varyings(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_sysvals_to_varyings_options]) -> bool: ... +enum_nir_lower_tex_packing: dict[int, str] = {(nir_lower_tex_packing_none:=0): 'nir_lower_tex_packing_none', (nir_lower_tex_packing_16:=1): 'nir_lower_tex_packing_16', (nir_lower_tex_packing_8:=2): 'nir_lower_tex_packing_8'} +@c.record +class struct_nir_lower_tex_options(c.Struct): + SIZE = 416 + lower_txp: int + lower_txp_array: bool + lower_txf_offset: bool + lower_rect_offset: bool + lower_offset_filter: c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] + lower_rect: bool + lower_1d: bool + lower_1d_shadow: bool + lower_y_uv_external: int + lower_y_vu_external: int + lower_y_u_v_external: int + lower_yx_xuxv_external: int + lower_yx_xvxu_external: int + lower_xy_uxvx_external: int + lower_xy_vxux_external: int + lower_ayuv_external: int + lower_xyuv_external: int + lower_yuv_external: int + lower_yu_yv_external: int + lower_yv_yu_external: int + lower_y41x_external: int + lower_sx10_external: int + lower_sx12_external: int + bt709_external: int + bt2020_external: int + yuv_full_range_external: int + saturate_s: int + saturate_t: int + saturate_r: int + swizzle_result: int + swizzles: c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[32]] + scale_factors: c.Array[ctypes.c_float, Literal[32]] + lower_srgb: int + lower_txd_cube_map: bool + lower_txd_3d: bool + lower_txd_array: bool + lower_txd_shadow: bool + lower_txd: bool + lower_txd_clamp: bool + lower_txb_shadow_clamp: bool + lower_txd_shadow_clamp: bool + lower_txd_offset_clamp: bool + lower_txd_clamp_bindless_sampler: bool + lower_txd_clamp_if_sampler_index_not_lt_16: bool + lower_txs_lod: bool + lower_txs_cube_array: bool + lower_tg4_broadcom_swizzle: bool + lower_tg4_offsets: bool + lower_to_fragment_fetch_amd: bool + lower_tex_packing_cb: c.CFUNCTYPE[ctypes.c_ubyte, [c.POINTER[struct_nir_tex_instr], ctypes.c_void_p]] + lower_tex_packing_data: ctypes.c_void_p + lower_lod_zero_width: bool + lower_sampler_lod_bias: bool + lower_invalid_implicit_lod: bool + lower_index_to_offset: bool + callback_data: ctypes.c_void_p +struct_nir_lower_tex_options.register_fields([('lower_txp', ctypes.c_uint32, 0), ('lower_txp_array', ctypes.c_bool, 4), ('lower_txf_offset', ctypes.c_bool, 5), ('lower_rect_offset', ctypes.c_bool, 6), ('lower_offset_filter', nir_instr_filter_cb, 8), ('lower_rect', ctypes.c_bool, 16), ('lower_1d', ctypes.c_bool, 17), ('lower_1d_shadow', ctypes.c_bool, 18), ('lower_y_uv_external', ctypes.c_uint32, 20), ('lower_y_vu_external', ctypes.c_uint32, 24), ('lower_y_u_v_external', ctypes.c_uint32, 28), ('lower_yx_xuxv_external', ctypes.c_uint32, 32), ('lower_yx_xvxu_external', ctypes.c_uint32, 36), ('lower_xy_uxvx_external', ctypes.c_uint32, 40), ('lower_xy_vxux_external', ctypes.c_uint32, 44), ('lower_ayuv_external', ctypes.c_uint32, 48), ('lower_xyuv_external', ctypes.c_uint32, 52), ('lower_yuv_external', ctypes.c_uint32, 56), ('lower_yu_yv_external', ctypes.c_uint32, 60), ('lower_yv_yu_external', ctypes.c_uint32, 64), ('lower_y41x_external', ctypes.c_uint32, 68), ('lower_sx10_external', ctypes.c_uint32, 72), ('lower_sx12_external', ctypes.c_uint32, 76), ('bt709_external', ctypes.c_uint32, 80), ('bt2020_external', ctypes.c_uint32, 84), ('yuv_full_range_external', ctypes.c_uint32, 88), ('saturate_s', ctypes.c_uint32, 92), ('saturate_t', ctypes.c_uint32, 96), ('saturate_r', ctypes.c_uint32, 100), ('swizzle_result', ctypes.c_uint32, 104), ('swizzles', c.Array[c.Array[uint8_t, Literal[4]], Literal[32]], 108), ('scale_factors', c.Array[ctypes.c_float, Literal[32]], 236), ('lower_srgb', ctypes.c_uint32, 364), ('lower_txd_cube_map', ctypes.c_bool, 368), ('lower_txd_3d', ctypes.c_bool, 369), ('lower_txd_array', ctypes.c_bool, 370), ('lower_txd_shadow', ctypes.c_bool, 371), ('lower_txd', ctypes.c_bool, 372), ('lower_txd_clamp', ctypes.c_bool, 373), ('lower_txb_shadow_clamp', ctypes.c_bool, 374), ('lower_txd_shadow_clamp', ctypes.c_bool, 375), ('lower_txd_offset_clamp', ctypes.c_bool, 376), ('lower_txd_clamp_bindless_sampler', ctypes.c_bool, 377), ('lower_txd_clamp_if_sampler_index_not_lt_16', ctypes.c_bool, 378), ('lower_txs_lod', ctypes.c_bool, 379), ('lower_txs_cube_array', ctypes.c_bool, 380), ('lower_tg4_broadcom_swizzle', ctypes.c_bool, 381), ('lower_tg4_offsets', ctypes.c_bool, 382), ('lower_to_fragment_fetch_amd', ctypes.c_bool, 383), ('lower_tex_packing_cb', c.CFUNCTYPE[ctypes.c_ubyte, [c.POINTER[nir_tex_instr], ctypes.c_void_p]], 384), ('lower_tex_packing_data', ctypes.c_void_p, 392), ('lower_lod_zero_width', ctypes.c_bool, 400), ('lower_sampler_lod_bias', ctypes.c_bool, 401), ('lower_invalid_implicit_lod', ctypes.c_bool, 402), ('lower_index_to_offset', ctypes.c_bool, 403), ('callback_data', ctypes.c_void_p, 408)]) +nir_lower_tex_options: TypeAlias = struct_nir_lower_tex_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_tex_options]) +def nir_lower_tex(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_tex_options]) -> bool: ... +@c.record +class struct_nir_lower_tex_shadow_swizzle(c.Struct): + SIZE = 4 + swizzle_r: int + swizzle_g: int + swizzle_b: int + swizzle_a: int +struct_nir_lower_tex_shadow_swizzle.register_fields([('swizzle_r', ctypes.c_uint32, 0, 3, 0), ('swizzle_g', ctypes.c_uint32, 0, 3, 3), ('swizzle_b', ctypes.c_uint32, 0, 3, 6), ('swizzle_a', ctypes.c_uint32, 1, 3, 1)]) +nir_lower_tex_shadow_swizzle: TypeAlias = struct_nir_lower_tex_shadow_swizzle +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[nir_lower_tex_shadow_swizzle], ctypes.c_bool) +def nir_lower_tex_shadow(s:c.POINTER[nir_shader], n_states:int, compare_func:c.POINTER[ctypes.c_uint32], tex_swizzles:c.POINTER[nir_lower_tex_shadow_swizzle], is_fixed_point_format:bool) -> bool: ... +@c.record +class struct_nir_lower_image_options(c.Struct): + SIZE = 3 + lower_cube_size: bool + lower_to_fragment_mask_load_amd: bool + lower_image_samples_to_one: bool +struct_nir_lower_image_options.register_fields([('lower_cube_size', ctypes.c_bool, 0), ('lower_to_fragment_mask_load_amd', ctypes.c_bool, 1), ('lower_image_samples_to_one', ctypes.c_bool, 2)]) +nir_lower_image_options: TypeAlias = struct_nir_lower_image_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_image_options]) +def nir_lower_image(nir:c.POINTER[nir_shader], options:c.POINTER[nir_lower_image_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_intrin_filter_cb, ctypes.c_void_p) +def nir_lower_image_atomics_to_global(s:c.POINTER[nir_shader], filter:nir_intrin_filter_cb, data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_lower_readonly_images_to_tex(shader:c.POINTER[nir_shader], per_variable:bool) -> bool: ... +enum_nir_lower_non_uniform_access_type: dict[int, str] = {(nir_lower_non_uniform_ubo_access:=1): 'nir_lower_non_uniform_ubo_access', (nir_lower_non_uniform_ssbo_access:=2): 'nir_lower_non_uniform_ssbo_access', (nir_lower_non_uniform_texture_access:=4): 'nir_lower_non_uniform_texture_access', (nir_lower_non_uniform_image_access:=8): 'nir_lower_non_uniform_image_access', (nir_lower_non_uniform_get_ssbo_size:=16): 'nir_lower_non_uniform_get_ssbo_size', (nir_lower_non_uniform_texture_offset_access:=32): 'nir_lower_non_uniform_texture_offset_access', (nir_lower_non_uniform_access_type_count:=6): 'nir_lower_non_uniform_access_type_count'} +nir_lower_non_uniform_src_access_callback: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_tex_instr], ctypes.c_uint32, ctypes.c_void_p]] +nir_lower_non_uniform_access_callback: TypeAlias = c.CFUNCTYPE[ctypes.c_uint16, [c.POINTER[struct_nir_src], ctypes.c_void_p]] +@c.record +class struct_nir_lower_non_uniform_access_options(c.Struct): + SIZE = 32 + types: int + tex_src_callback: c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_tex_instr], ctypes.c_uint32, ctypes.c_void_p]] + callback: c.CFUNCTYPE[ctypes.c_uint16, [c.POINTER[struct_nir_src], ctypes.c_void_p]] + callback_data: ctypes.c_void_p +struct_nir_lower_non_uniform_access_options.register_fields([('types', ctypes.c_uint32, 0), ('tex_src_callback', nir_lower_non_uniform_src_access_callback, 8), ('callback', nir_lower_non_uniform_access_callback, 16), ('callback_data', ctypes.c_void_p, 24)]) +nir_lower_non_uniform_access_options: TypeAlias = struct_nir_lower_non_uniform_access_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_has_non_uniform_access(shader:c.POINTER[nir_shader], types:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_non_uniform_access(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_non_uniform_access_options]) +def nir_lower_non_uniform_access(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_non_uniform_access_options]) -> bool: ... +@c.record +class struct_nir_lower_idiv_options(c.Struct): + SIZE = 1 + allow_fp16: bool +struct_nir_lower_idiv_options.register_fields([('allow_fp16', ctypes.c_bool, 0)]) +nir_lower_idiv_options: TypeAlias = struct_nir_lower_idiv_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_idiv_options]) +def nir_lower_idiv(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_idiv_options]) -> bool: ... +@c.record +class struct_nir_input_attachment_options(c.Struct): + SIZE = 12 + use_ia_coord_intrin: bool + use_fragcoord_sysval: bool + use_layer_id_sysval: bool + use_view_id_for_layer: bool + unscaled_depth_stencil_ir3: bool + unscaled_input_attachment_ir3: int +struct_nir_input_attachment_options.register_fields([('use_ia_coord_intrin', ctypes.c_bool, 0), ('use_fragcoord_sysval', ctypes.c_bool, 1), ('use_layer_id_sysval', ctypes.c_bool, 2), ('use_view_id_for_layer', ctypes.c_bool, 3), ('unscaled_depth_stencil_ir3', ctypes.c_bool, 4), ('unscaled_input_attachment_ir3', uint32_t, 8)]) +nir_input_attachment_options: TypeAlias = struct_nir_input_attachment_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_input_attachment_options]) +def nir_lower_input_attachments(shader:c.POINTER[nir_shader], options:c.POINTER[nir_input_attachment_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_bool, ctypes.c_bool, c.Array[c.Array[gl_state_index16, Literal[4]], Literal[0]]) +def nir_lower_clip_vs(shader:c.POINTER[nir_shader], ucp_enables:int, use_vars:bool, use_clipdist_array:bool, clipplane_state_tokens:c.Array[c.Array[gl_state_index16, Literal[4]], Literal[0]]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_bool, c.Array[c.Array[gl_state_index16, Literal[4]], Literal[0]]) +def nir_lower_clip_gs(shader:c.POINTER[nir_shader], ucp_enables:int, use_clipdist_array:bool, clipplane_state_tokens:c.Array[c.Array[gl_state_index16, Literal[4]], Literal[0]]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_bool, ctypes.c_bool) +def nir_lower_clip_fs(shader:c.POINTER[nir_shader], ucp_enables:int, use_clipdist_array:bool, use_load_interp:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_clip_cull_distance_to_vec4s(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_clip_cull_distance_array_vars(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_clip_disable(shader:c.POINTER[nir_shader], clip_plane_enable:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[gl_state_index16]) +def nir_lower_point_size_mov(shader:c.POINTER[nir_shader], pointsize_state_tokens:c.POINTER[gl_state_index16]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_frexp(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_lower_two_sided_color(shader:c.POINTER[nir_shader], face_sysval:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_clamp_color_outputs(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_flatshade(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_passthrough_edgeflags(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, c.POINTER[gl_state_index16]) +def nir_lower_patch_vertices(nir:c.POINTER[nir_shader], static_count:int, uniform_state_tokens:c.POINTER[gl_state_index16]) -> bool: ... +@c.record +class struct_nir_lower_wpos_ytransform_options(c.Struct): + SIZE = 10 + state_tokens: c.Array[ctypes.c_int16, Literal[4]] + fs_coord_origin_upper_left: bool + fs_coord_origin_lower_left: bool + fs_coord_pixel_center_integer: bool + fs_coord_pixel_center_half_integer: bool +struct_nir_lower_wpos_ytransform_options.register_fields([('state_tokens', c.Array[gl_state_index16, Literal[4]], 0), ('fs_coord_origin_upper_left', ctypes.c_bool, 8, 1, 0), ('fs_coord_origin_lower_left', ctypes.c_bool, 8, 1, 1), ('fs_coord_pixel_center_integer', ctypes.c_bool, 8, 1, 2), ('fs_coord_pixel_center_half_integer', ctypes.c_bool, 8, 1, 3)]) +nir_lower_wpos_ytransform_options: TypeAlias = struct_nir_lower_wpos_ytransform_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_wpos_ytransform_options]) +def nir_lower_wpos_ytransform(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_wpos_ytransform_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_wpos_center(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.Array[c.Array[gl_state_index16, Literal[4]], Literal[0]]) +def nir_lower_pntc_ytransform(shader:c.POINTER[nir_shader], clipplane_state_tokens:c.Array[c.Array[gl_state_index16, Literal[4]], Literal[0]]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_instr_filter_cb, ctypes.c_void_p) +def nir_lower_wrmasks(shader:c.POINTER[nir_shader], cb:nir_instr_filter_cb, data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_fb_read(shader:c.POINTER[nir_shader]) -> bool: ... +@c.record +class struct_nir_lower_drawpixels_options(c.Struct): + SIZE = 36 + texcoord_state_tokens: c.Array[ctypes.c_int16, Literal[4]] + scale_state_tokens: c.Array[ctypes.c_int16, Literal[4]] + bias_state_tokens: c.Array[ctypes.c_int16, Literal[4]] + drawpix_sampler: int + pixelmap_sampler: int + pixel_maps: bool + scale_and_bias: bool +struct_nir_lower_drawpixels_options.register_fields([('texcoord_state_tokens', c.Array[gl_state_index16, Literal[4]], 0), ('scale_state_tokens', c.Array[gl_state_index16, Literal[4]], 8), ('bias_state_tokens', c.Array[gl_state_index16, Literal[4]], 16), ('drawpix_sampler', ctypes.c_uint32, 24), ('pixelmap_sampler', ctypes.c_uint32, 28), ('pixel_maps', ctypes.c_bool, 32, 1, 0), ('scale_and_bias', ctypes.c_bool, 32, 1, 1)]) +nir_lower_drawpixels_options: TypeAlias = struct_nir_lower_drawpixels_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_drawpixels_options]) +def nir_lower_drawpixels(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_drawpixels_options]) -> bool: ... +@c.record +class struct_nir_lower_bitmap_options(c.Struct): + SIZE = 8 + sampler: int + swizzle_xxxx: bool +struct_nir_lower_bitmap_options.register_fields([('sampler', ctypes.c_uint32, 0), ('swizzle_xxxx', ctypes.c_bool, 4)]) +nir_lower_bitmap_options: TypeAlias = struct_nir_lower_bitmap_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_bitmap_options]) +def nir_lower_bitmap(shader:c.POINTER[nir_shader], options:c.POINTER[nir_lower_bitmap_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_atomics_to_ssbo(shader:c.POINTER[nir_shader], offset_align_state:int) -> bool: ... +nir_lower_gs_intrinsics_flags: dict[int, str] = {(nir_lower_gs_intrinsics_per_stream:=1): 'nir_lower_gs_intrinsics_per_stream', (nir_lower_gs_intrinsics_count_primitives:=2): 'nir_lower_gs_intrinsics_count_primitives', (nir_lower_gs_intrinsics_count_vertices_per_primitive:=4): 'nir_lower_gs_intrinsics_count_vertices_per_primitive', (nir_lower_gs_intrinsics_overwrite_incomplete:=8): 'nir_lower_gs_intrinsics_overwrite_incomplete'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_gs_intrinsics(shader:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_halt_to_return(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_lower_tess_coord_z(shader:c.POINTER[nir_shader], triangles:bool) -> bool: ... +@c.record +class struct_nir_lower_task_shader_options(c.Struct): + SIZE = 8 + payload_to_shared_for_atomics: bool + payload_to_shared_for_small_types: bool + payload_offset_in_bytes: int +struct_nir_lower_task_shader_options.register_fields([('payload_to_shared_for_atomics', ctypes.c_bool, 0, 1, 0), ('payload_to_shared_for_small_types', ctypes.c_bool, 0, 1, 1), ('payload_offset_in_bytes', uint32_t, 4)]) +nir_lower_task_shader_options: TypeAlias = struct_nir_lower_task_shader_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_lower_task_shader_options) +def nir_lower_task_shader(shader:c.POINTER[nir_shader], options:nir_lower_task_shader_options) -> bool: ... +nir_lower_bit_size_callback: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_lower_bit_size_callback, ctypes.c_void_p) +def nir_lower_bit_size(shader:c.POINTER[nir_shader], callback:nir_lower_bit_size_callback, callback_data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_64bit_phis(shader:c.POINTER[nir_shader]) -> bool: ... +@c.record +class struct_nir_split_conversions_options(c.Struct): + SIZE = 24 + callback: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] + callback_data: ctypes.c_void_p + has_convert_alu_types: bool +struct_nir_split_conversions_options.register_fields([('callback', nir_lower_bit_size_callback, 0), ('callback_data', ctypes.c_void_p, 8), ('has_convert_alu_types', ctypes.c_bool, 16)]) +nir_split_conversions_options: TypeAlias = struct_nir_split_conversions_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_split_conversions_options]) +def nir_split_conversions(shader:c.POINTER[nir_shader], options:c.POINTER[nir_split_conversions_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_split_64bit_vec3_and_vec4(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def nir_lower_int64_op_to_options_mask(opcode:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_int64(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_int64_float_conversions(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def nir_lower_doubles_op_to_options_mask(opcode:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_doubles(shader:c.POINTER[nir_shader], softfp64:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_pack(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(c.POINTER[nir_intrinsic_instr], c.POINTER[nir_instr], ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def nir_get_io_intrinsic(instr:c.POINTER[nir_instr], modes:ctypes.c_uint32, out_mode:c.POINTER[ctypes.c_uint32]) -> c.POINTER[nir_intrinsic_instr]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_recompute_io_bases(nir:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_mediump_vars(nir:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, uint64_t, ctypes.c_bool) +def nir_lower_mediump_io(nir:c.POINTER[nir_shader], modes:ctypes.c_uint32, varying_mask:uint64_t, use_16bit_slots:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_clear_mediump_io_flag(nir:c.POINTER[nir_shader]) -> bool: ... +@c.record +class struct_nir_opt_tex_srcs_options(c.Struct): + SIZE = 8 + sampler_dims: int + src_types: int +struct_nir_opt_tex_srcs_options.register_fields([('sampler_dims', ctypes.c_uint32, 0), ('src_types', ctypes.c_uint32, 4)]) +nir_opt_tex_srcs_options: TypeAlias = struct_nir_opt_tex_srcs_options +@c.record +class struct_nir_opt_16bit_tex_image_options(c.Struct): + SIZE = 24 + rounding_mode: int + opt_tex_dest_types: int + opt_image_dest_types: int + integer_dest_saturates: bool + opt_image_store_data: bool + opt_image_srcs: bool + opt_srcs_options_count: int + opt_srcs_options: c.POINTER[struct_nir_opt_tex_srcs_options] +struct_nir_opt_16bit_tex_image_options.register_fields([('rounding_mode', ctypes.c_uint32, 0), ('opt_tex_dest_types', ctypes.c_ubyte, 4), ('opt_image_dest_types', ctypes.c_ubyte, 5), ('integer_dest_saturates', ctypes.c_bool, 6), ('opt_image_store_data', ctypes.c_bool, 7), ('opt_image_srcs', ctypes.c_bool, 8), ('opt_srcs_options_count', ctypes.c_uint32, 12), ('opt_srcs_options', c.POINTER[nir_opt_tex_srcs_options], 16)]) +nir_opt_16bit_tex_image_options: TypeAlias = struct_nir_opt_16bit_tex_image_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_opt_16bit_tex_image_options]) +def nir_opt_16bit_tex_image(nir:c.POINTER[nir_shader], options:c.POINTER[nir_opt_16bit_tex_image_options]) -> bool: ... +@c.record +class struct_nir_tex_src_type_constraint(c.Struct): + SIZE = 8 + legalize_type: bool + bit_size: int + match_src: int +struct_nir_tex_src_type_constraint.register_fields([('legalize_type', ctypes.c_bool, 0), ('bit_size', uint8_t, 1), ('match_src', nir_tex_src_type, 4)]) +nir_tex_src_type_constraint: TypeAlias = struct_nir_tex_src_type_constraint +nir_tex_src_type_constraints: TypeAlias = c.Array[struct_nir_tex_src_type_constraint, Literal[23]] +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_tex_src_type_constraints) +def nir_legalize_16bit_sampler_srcs(nir:c.POINTER[nir_shader], constraints:nir_tex_src_type_constraints) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_float, ctypes.c_float) +def nir_lower_point_size(shader:c.POINTER[nir_shader], min:float, max:float) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_default_point_size(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_bool, ctypes.c_bool) +def nir_lower_texcoord_replace(s:c.POINTER[nir_shader], coord_replace:int, point_coord_is_sysval:bool, yinvert:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_bool) +def nir_lower_texcoord_replace_late(s:c.POINTER[nir_shader], coord_replace:int, point_coord_is_sysval:bool) -> bool: ... +nir_lower_interpolation_options: dict[int, str] = {(nir_lower_interpolation_at_sample:=2): 'nir_lower_interpolation_at_sample', (nir_lower_interpolation_at_offset:=4): 'nir_lower_interpolation_at_offset', (nir_lower_interpolation_centroid:=8): 'nir_lower_interpolation_centroid', (nir_lower_interpolation_pixel:=16): 'nir_lower_interpolation_pixel', (nir_lower_interpolation_sample:=32): 'nir_lower_interpolation_sample'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_interpolation(shader:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +nir_lower_discard_if_options: dict[int, str] = {(nir_lower_demote_if_to_cf:=1): 'nir_lower_demote_if_to_cf', (nir_lower_terminate_if_to_cf:=2): 'nir_lower_terminate_if_to_cf', (nir_move_terminate_out_of_loops:=4): 'nir_move_terminate_out_of_loops'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_discard_if(shader:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_terminate_to_demote(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_memory_model(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_goto_ifs(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_continue_constructs(shader:c.POINTER[nir_shader]) -> bool: ... +@c.record +class struct_nir_lower_multiview_options(c.Struct): + SIZE = 16 + view_mask: int + allowed_per_view_outputs: int +struct_nir_lower_multiview_options.register_fields([('view_mask', uint32_t, 0), ('allowed_per_view_outputs', uint64_t, 8)]) +nir_lower_multiview_options: TypeAlias = struct_nir_lower_multiview_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_shader_uses_view_index(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_lower_multiview_options) +def nir_can_lower_multiview(shader:c.POINTER[nir_shader], options:nir_lower_multiview_options) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_lower_multiview_options) +def nir_lower_multiview(shader:c.POINTER[nir_shader], options:nir_lower_multiview_options) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_view_index_to_device_index(shader:c.POINTER[nir_shader]) -> bool: ... +nir_lower_fp16_cast_options: dict[int, str] = {(nir_lower_fp16_rtz:=1): 'nir_lower_fp16_rtz', (nir_lower_fp16_rtne:=2): 'nir_lower_fp16_rtne', (nir_lower_fp16_ru:=4): 'nir_lower_fp16_ru', (nir_lower_fp16_rd:=8): 'nir_lower_fp16_rd', (nir_lower_fp16_all:=15): 'nir_lower_fp16_all', (nir_lower_fp16_split_fp64:=16): 'nir_lower_fp16_split_fp64'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_fp16_casts(shader:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_normalize_cubemap_coords(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_shader_supports_implicit_lod(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_function_impl]) +def nir_live_defs_impl(impl:c.POINTER[nir_function_impl]) -> None: ... +@dll.bind(c.POINTER[ctypes.c_uint32], nir_cursor, ctypes.c_void_p) +def nir_get_live_defs(cursor:nir_cursor, mem_ctx:ctypes.c_void_p) -> c.POINTER[ctypes.c_uint32]: ... +@dll.bind(None, c.POINTER[nir_function_impl], ctypes.c_uint32, ctypes.c_bool) +def nir_loop_analyze_impl(impl:c.POINTER[nir_function_impl], indirect_mask:ctypes.c_uint32, force_unroll_sampler_indirect:bool) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_defs_interfere(a:c.POINTER[nir_def], b:c.POINTER[nir_def]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl]) +def nir_repair_ssa_impl(impl:c.POINTER[nir_function_impl]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_repair_ssa(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_loop]) +def nir_convert_loop_to_lcssa(loop:c.POINTER[nir_loop]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool, ctypes.c_bool) +def nir_convert_to_lcssa(shader:c.POINTER[nir_shader], skip_invariants:bool, skip_bool_invariants:bool) -> bool: ... +@dll.bind(None, c.POINTER[nir_function_impl], ctypes.c_uint32) +def nir_divergence_analysis_impl(impl:c.POINTER[nir_function_impl], options:ctypes.c_uint32) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_divergence_analysis(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_vertex_divergence_analysis(shader:c.POINTER[nir_shader]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_has_divergent_loop(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_builder], c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_rewrite_uses_to_load_reg(b:c.POINTER[nir_builder], old:c.POINTER[nir_def], reg:c.POINTER[nir_def]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool, ctypes.c_bool) +def nir_convert_from_ssa(shader:c.POINTER[nir_shader], phi_webs_only:bool, consider_divergence:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_block], ctypes.c_bool) +def nir_lower_phis_to_regs_block(block:c.POINTER[nir_block], place_writes_in_imm_preds:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_block]) +def nir_lower_ssa_defs_to_regs_block(block:c.POINTER[nir_block]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_deref_instr]) +def nir_rematerialize_deref_in_use_blocks(instr:c.POINTER[nir_deref_instr]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl]) +def nir_rematerialize_derefs_in_use_blocks_impl(impl:c.POINTER[nir_function_impl]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_samplers(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool, ctypes.c_bool) +def nir_lower_cl_images(shader:c.POINTER[nir_shader], lower_image_derefs:bool, lower_sampler_derefs:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_dedup_inline_samplers(shader:c.POINTER[nir_shader]) -> bool: ... +@c.record +class struct_nir_lower_ssbo_options(c.Struct): + SIZE = 2 + native_loads: bool + native_offset: bool +struct_nir_lower_ssbo_options.register_fields([('native_loads', ctypes.c_bool, 0), ('native_offset', ctypes.c_bool, 1)]) +nir_lower_ssbo_options: TypeAlias = struct_nir_lower_ssbo_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_ssbo_options]) +def nir_lower_ssbo(shader:c.POINTER[nir_shader], opts:c.POINTER[nir_lower_ssbo_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_lower_helper_writes(shader:c.POINTER[nir_shader], lower_plain_stores:bool) -> bool: ... +@c.record +class struct_nir_lower_printf_options(c.Struct): + SIZE = 12 + max_buffer_size: int + ptr_bit_size: int + hash_format_strings: bool +struct_nir_lower_printf_options.register_fields([('max_buffer_size', ctypes.c_uint32, 0), ('ptr_bit_size', ctypes.c_uint32, 4), ('hash_format_strings', ctypes.c_bool, 8)]) +nir_lower_printf_options: TypeAlias = struct_nir_lower_printf_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_printf_options]) +def nir_lower_printf(nir:c.POINTER[nir_shader], options:c.POINTER[nir_lower_printf_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], uint64_t, uint32_t) +def nir_lower_printf_buffer(nir:c.POINTER[nir_shader], address:uint64_t, size:uint32_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl]) +def nir_opt_comparison_pre_impl(impl:c.POINTER[nir_function_impl]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_comparison_pre(shader:c.POINTER[nir_shader]) -> bool: ... +@c.record +class struct_nir_opt_access_options(c.Struct): + SIZE = 1 + is_vulkan: bool +struct_nir_opt_access_options.register_fields([('is_vulkan', ctypes.c_bool, 0)]) +nir_opt_access_options: TypeAlias = struct_nir_opt_access_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_opt_access_options]) +def nir_opt_access(shader:c.POINTER[nir_shader], options:c.POINTER[nir_opt_access_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_algebraic(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_algebraic_before_ffma(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_algebraic_before_lower_int64(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_algebraic_late(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_algebraic_distribute_src_mods(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_algebraic_integer_promotion(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_reassociate_matrix_mul(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_constant_folding(shader:c.POINTER[nir_shader]) -> bool: ... +nir_combine_barrier_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_intrinsic_instr], c.POINTER[struct_nir_intrinsic_instr], ctypes.c_void_p]] +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_combine_barrier_cb, ctypes.c_void_p) +def nir_opt_combine_barriers(shader:c.POINTER[nir_shader], combine_cb:nir_combine_barrier_cb, data:ctypes.c_void_p) -> bool: ... +mesa_scope: dict[int, str] = {(SCOPE_NONE:=0): 'SCOPE_NONE', (SCOPE_INVOCATION:=1): 'SCOPE_INVOCATION', (SCOPE_SUBGROUP:=2): 'SCOPE_SUBGROUP', (SCOPE_SHADER_CALL:=3): 'SCOPE_SHADER_CALL', (SCOPE_WORKGROUP:=4): 'SCOPE_WORKGROUP', (SCOPE_QUEUE_FAMILY:=5): 'SCOPE_QUEUE_FAMILY', (SCOPE_DEVICE:=6): 'SCOPE_DEVICE'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_opt_acquire_release_barriers(shader:c.POINTER[nir_shader], max_scope:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_barrier_modes(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_minimize_call_live_states(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_opt_combine_stores(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl]) +def nir_copy_prop_impl(impl:c.POINTER[nir_function_impl]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_copy_prop(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_copy_prop_vars(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_cse(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_dce(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_dead_cf(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_dead_write_vars(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_function_impl]) +def nir_opt_deref_impl(impl:c.POINTER[nir_function_impl]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_deref(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_find_array_copies(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_def]) +def nir_def_is_frag_coord_z(_def:c.POINTER[nir_def]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_fragdepth(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_opt_gcm(shader:c.POINTER[nir_shader], value_number:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_generate_bfi(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_opt_idiv_const(shader:c.POINTER[nir_shader], min_bit_size:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_mqsad(shader:c.POINTER[nir_shader]) -> bool: ... +nir_opt_if_options: dict[int, str] = {(nir_opt_if_optimize_phi_true_false:=1): 'nir_opt_if_optimize_phi_true_false', (nir_opt_if_avoid_64bit_phis:=2): 'nir_opt_if_avoid_64bit_phis'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_opt_if(shader:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_intrinsics(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], glsl_type_size_align_func, ctypes.c_uint32) +def nir_opt_large_constants(shader:c.POINTER[nir_shader], size_align:glsl_type_size_align_func, threshold:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_licm(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_loop(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_loop_unroll(shader:c.POINTER[nir_shader]) -> bool: ... +nir_move_options: dict[int, str] = {(nir_move_const_undef:=1): 'nir_move_const_undef', (nir_move_load_ubo:=2): 'nir_move_load_ubo', (nir_move_load_input:=4): 'nir_move_load_input', (nir_move_comparisons:=8): 'nir_move_comparisons', (nir_move_copies:=16): 'nir_move_copies', (nir_move_load_ssbo:=32): 'nir_move_load_ssbo', (nir_move_load_uniform:=64): 'nir_move_load_uniform', (nir_move_alu:=128): 'nir_move_alu', (nir_dont_move_byte_word_vecs:=256): 'nir_dont_move_byte_word_vecs'} +@dll.bind(ctypes.c_bool, c.POINTER[nir_instr], ctypes.c_uint32) +def nir_can_move_instr(instr:c.POINTER[nir_instr], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_opt_sink(shader:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_opt_move(shader:c.POINTER[nir_shader], options:ctypes.c_uint32) -> bool: ... +@c.record +class struct_nir_opt_offsets_options(c.Struct): + SIZE = 48 + uniform_max: int + ubo_vec4_max: int + shared_max: int + shared_atomic_max: int + buffer_max: int + max_offset_cb: c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_nir_intrinsic_instr], ctypes.c_void_p]] + max_offset_data: ctypes.c_void_p + allow_offset_wrap: bool +struct_nir_opt_offsets_options.register_fields([('uniform_max', uint32_t, 0), ('ubo_vec4_max', uint32_t, 4), ('shared_max', uint32_t, 8), ('shared_atomic_max', uint32_t, 12), ('buffer_max', uint32_t, 16), ('max_offset_cb', c.CFUNCTYPE[uint32_t, [c.POINTER[nir_intrinsic_instr], ctypes.c_void_p]], 24), ('max_offset_data', ctypes.c_void_p, 32), ('allow_offset_wrap', ctypes.c_bool, 40)]) +nir_opt_offsets_options: TypeAlias = struct_nir_opt_offsets_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_opt_offsets_options]) +def nir_opt_offsets(shader:c.POINTER[nir_shader], options:c.POINTER[nir_opt_offsets_options]) -> bool: ... +@c.record +class struct_nir_opt_peephole_select_options(c.Struct): + SIZE = 8 + limit: int + indirect_load_ok: bool + expensive_alu_ok: bool + discard_ok: bool +struct_nir_opt_peephole_select_options.register_fields([('limit', ctypes.c_uint32, 0), ('indirect_load_ok', ctypes.c_bool, 4), ('expensive_alu_ok', ctypes.c_bool, 5), ('discard_ok', ctypes.c_bool, 6)]) +nir_opt_peephole_select_options: TypeAlias = struct_nir_opt_peephole_select_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_opt_peephole_select_options]) +def nir_opt_peephole_select(shader:c.POINTER[nir_shader], options:c.POINTER[nir_opt_peephole_select_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_reassociate_bfi(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_rematerialize_compares(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_remove_phis(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_block]) +def nir_remove_single_src_phis_block(block:c.POINTER[nir_block]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_phi_precision(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_phi_to_bool(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_opt_shrink_stores(shader:c.POINTER[nir_shader], shrink_image_store:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_opt_shrink_vectors(shader:c.POINTER[nir_shader], shrink_start:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_undef(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_lower_undef_to_zero(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_opt_uniform_atomics(shader:c.POINTER[nir_shader], fs_atomics_predicated:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_lower_subgroups_options]) +def nir_opt_uniform_subgroup(shader:c.POINTER[nir_shader], _1:c.POINTER[nir_lower_subgroups_options]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], nir_vectorize_cb, ctypes.c_void_p) +def nir_opt_vectorize(shader:c.POINTER[nir_shader], filter:nir_vectorize_cb, data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32, ctypes.c_bool) +def nir_opt_vectorize_io(shader:c.POINTER[nir_shader], modes:ctypes.c_uint32, allow_holes:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_move_discards_to_top(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_ray_queries(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_opt_ray_query_ranges(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_opt_tex_skip_helpers(shader:c.POINTER[nir_shader], no_add_divergence:bool) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader]) +def nir_sweep(shader:c.POINTER[nir_shader]) -> None: ... +gl_system_value: dict[int, str] = {(SYSTEM_VALUE_SUBGROUP_SIZE:=0): 'SYSTEM_VALUE_SUBGROUP_SIZE', (SYSTEM_VALUE_SUBGROUP_INVOCATION:=1): 'SYSTEM_VALUE_SUBGROUP_INVOCATION', (SYSTEM_VALUE_SUBGROUP_EQ_MASK:=2): 'SYSTEM_VALUE_SUBGROUP_EQ_MASK', (SYSTEM_VALUE_SUBGROUP_GE_MASK:=3): 'SYSTEM_VALUE_SUBGROUP_GE_MASK', (SYSTEM_VALUE_SUBGROUP_GT_MASK:=4): 'SYSTEM_VALUE_SUBGROUP_GT_MASK', (SYSTEM_VALUE_SUBGROUP_LE_MASK:=5): 'SYSTEM_VALUE_SUBGROUP_LE_MASK', (SYSTEM_VALUE_SUBGROUP_LT_MASK:=6): 'SYSTEM_VALUE_SUBGROUP_LT_MASK', (SYSTEM_VALUE_NUM_SUBGROUPS:=7): 'SYSTEM_VALUE_NUM_SUBGROUPS', (SYSTEM_VALUE_SUBGROUP_ID:=8): 'SYSTEM_VALUE_SUBGROUP_ID', (SYSTEM_VALUE_VERTEX_ID:=9): 'SYSTEM_VALUE_VERTEX_ID', (SYSTEM_VALUE_INSTANCE_ID:=10): 'SYSTEM_VALUE_INSTANCE_ID', (SYSTEM_VALUE_INSTANCE_INDEX:=11): 'SYSTEM_VALUE_INSTANCE_INDEX', (SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:=12): 'SYSTEM_VALUE_VERTEX_ID_ZERO_BASE', (SYSTEM_VALUE_BASE_VERTEX:=13): 'SYSTEM_VALUE_BASE_VERTEX', (SYSTEM_VALUE_FIRST_VERTEX:=14): 'SYSTEM_VALUE_FIRST_VERTEX', (SYSTEM_VALUE_IS_INDEXED_DRAW:=15): 'SYSTEM_VALUE_IS_INDEXED_DRAW', (SYSTEM_VALUE_BASE_INSTANCE:=16): 'SYSTEM_VALUE_BASE_INSTANCE', (SYSTEM_VALUE_DRAW_ID:=17): 'SYSTEM_VALUE_DRAW_ID', (SYSTEM_VALUE_INVOCATION_ID:=18): 'SYSTEM_VALUE_INVOCATION_ID', (SYSTEM_VALUE_FRAG_COORD:=19): 'SYSTEM_VALUE_FRAG_COORD', (SYSTEM_VALUE_PIXEL_COORD:=20): 'SYSTEM_VALUE_PIXEL_COORD', (SYSTEM_VALUE_FRAG_COORD_Z:=21): 'SYSTEM_VALUE_FRAG_COORD_Z', (SYSTEM_VALUE_FRAG_COORD_W:=22): 'SYSTEM_VALUE_FRAG_COORD_W', (SYSTEM_VALUE_POINT_COORD:=23): 'SYSTEM_VALUE_POINT_COORD', (SYSTEM_VALUE_LINE_COORD:=24): 'SYSTEM_VALUE_LINE_COORD', (SYSTEM_VALUE_FRONT_FACE:=25): 'SYSTEM_VALUE_FRONT_FACE', (SYSTEM_VALUE_FRONT_FACE_FSIGN:=26): 'SYSTEM_VALUE_FRONT_FACE_FSIGN', (SYSTEM_VALUE_SAMPLE_ID:=27): 'SYSTEM_VALUE_SAMPLE_ID', (SYSTEM_VALUE_SAMPLE_POS:=28): 'SYSTEM_VALUE_SAMPLE_POS', (SYSTEM_VALUE_SAMPLE_POS_OR_CENTER:=29): 'SYSTEM_VALUE_SAMPLE_POS_OR_CENTER', (SYSTEM_VALUE_SAMPLE_MASK_IN:=30): 'SYSTEM_VALUE_SAMPLE_MASK_IN', (SYSTEM_VALUE_LAYER_ID:=31): 'SYSTEM_VALUE_LAYER_ID', (SYSTEM_VALUE_HELPER_INVOCATION:=32): 'SYSTEM_VALUE_HELPER_INVOCATION', (SYSTEM_VALUE_COLOR0:=33): 'SYSTEM_VALUE_COLOR0', (SYSTEM_VALUE_COLOR1:=34): 'SYSTEM_VALUE_COLOR1', (SYSTEM_VALUE_TESS_COORD:=35): 'SYSTEM_VALUE_TESS_COORD', (SYSTEM_VALUE_VERTICES_IN:=36): 'SYSTEM_VALUE_VERTICES_IN', (SYSTEM_VALUE_PRIMITIVE_ID:=37): 'SYSTEM_VALUE_PRIMITIVE_ID', (SYSTEM_VALUE_TESS_LEVEL_OUTER:=38): 'SYSTEM_VALUE_TESS_LEVEL_OUTER', (SYSTEM_VALUE_TESS_LEVEL_INNER:=39): 'SYSTEM_VALUE_TESS_LEVEL_INNER', (SYSTEM_VALUE_TESS_LEVEL_OUTER_DEFAULT:=40): 'SYSTEM_VALUE_TESS_LEVEL_OUTER_DEFAULT', (SYSTEM_VALUE_TESS_LEVEL_INNER_DEFAULT:=41): 'SYSTEM_VALUE_TESS_LEVEL_INNER_DEFAULT', (SYSTEM_VALUE_LOCAL_INVOCATION_ID:=42): 'SYSTEM_VALUE_LOCAL_INVOCATION_ID', (SYSTEM_VALUE_LOCAL_INVOCATION_INDEX:=43): 'SYSTEM_VALUE_LOCAL_INVOCATION_INDEX', (SYSTEM_VALUE_GLOBAL_INVOCATION_ID:=44): 'SYSTEM_VALUE_GLOBAL_INVOCATION_ID', (SYSTEM_VALUE_BASE_GLOBAL_INVOCATION_ID:=45): 'SYSTEM_VALUE_BASE_GLOBAL_INVOCATION_ID', (SYSTEM_VALUE_GLOBAL_INVOCATION_INDEX:=46): 'SYSTEM_VALUE_GLOBAL_INVOCATION_INDEX', (SYSTEM_VALUE_WORKGROUP_ID:=47): 'SYSTEM_VALUE_WORKGROUP_ID', (SYSTEM_VALUE_BASE_WORKGROUP_ID:=48): 'SYSTEM_VALUE_BASE_WORKGROUP_ID', (SYSTEM_VALUE_WORKGROUP_INDEX:=49): 'SYSTEM_VALUE_WORKGROUP_INDEX', (SYSTEM_VALUE_NUM_WORKGROUPS:=50): 'SYSTEM_VALUE_NUM_WORKGROUPS', (SYSTEM_VALUE_WORKGROUP_SIZE:=51): 'SYSTEM_VALUE_WORKGROUP_SIZE', (SYSTEM_VALUE_GLOBAL_GROUP_SIZE:=52): 'SYSTEM_VALUE_GLOBAL_GROUP_SIZE', (SYSTEM_VALUE_WORK_DIM:=53): 'SYSTEM_VALUE_WORK_DIM', (SYSTEM_VALUE_USER_DATA_AMD:=54): 'SYSTEM_VALUE_USER_DATA_AMD', (SYSTEM_VALUE_DEVICE_INDEX:=55): 'SYSTEM_VALUE_DEVICE_INDEX', (SYSTEM_VALUE_VIEW_INDEX:=56): 'SYSTEM_VALUE_VIEW_INDEX', (SYSTEM_VALUE_VERTEX_CNT:=57): 'SYSTEM_VALUE_VERTEX_CNT', (SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL:=58): 'SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL', (SYSTEM_VALUE_BARYCENTRIC_PERSP_SAMPLE:=59): 'SYSTEM_VALUE_BARYCENTRIC_PERSP_SAMPLE', (SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID:=60): 'SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID', (SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTER_RHW:=61): 'SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTER_RHW', (SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL:=62): 'SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL', (SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID:=63): 'SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID', (SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE:=64): 'SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE', (SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL:=65): 'SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL', (SYSTEM_VALUE_BARYCENTRIC_PERSP_COORD:=66): 'SYSTEM_VALUE_BARYCENTRIC_PERSP_COORD', (SYSTEM_VALUE_BARYCENTRIC_LINEAR_COORD:=67): 'SYSTEM_VALUE_BARYCENTRIC_LINEAR_COORD', (SYSTEM_VALUE_RAY_LAUNCH_ID:=68): 'SYSTEM_VALUE_RAY_LAUNCH_ID', (SYSTEM_VALUE_RAY_LAUNCH_SIZE:=69): 'SYSTEM_VALUE_RAY_LAUNCH_SIZE', (SYSTEM_VALUE_RAY_WORLD_ORIGIN:=70): 'SYSTEM_VALUE_RAY_WORLD_ORIGIN', (SYSTEM_VALUE_RAY_WORLD_DIRECTION:=71): 'SYSTEM_VALUE_RAY_WORLD_DIRECTION', (SYSTEM_VALUE_RAY_OBJECT_ORIGIN:=72): 'SYSTEM_VALUE_RAY_OBJECT_ORIGIN', (SYSTEM_VALUE_RAY_OBJECT_DIRECTION:=73): 'SYSTEM_VALUE_RAY_OBJECT_DIRECTION', (SYSTEM_VALUE_RAY_T_MIN:=74): 'SYSTEM_VALUE_RAY_T_MIN', (SYSTEM_VALUE_RAY_T_MAX:=75): 'SYSTEM_VALUE_RAY_T_MAX', (SYSTEM_VALUE_RAY_OBJECT_TO_WORLD:=76): 'SYSTEM_VALUE_RAY_OBJECT_TO_WORLD', (SYSTEM_VALUE_RAY_WORLD_TO_OBJECT:=77): 'SYSTEM_VALUE_RAY_WORLD_TO_OBJECT', (SYSTEM_VALUE_RAY_HIT_KIND:=78): 'SYSTEM_VALUE_RAY_HIT_KIND', (SYSTEM_VALUE_RAY_FLAGS:=79): 'SYSTEM_VALUE_RAY_FLAGS', (SYSTEM_VALUE_RAY_GEOMETRY_INDEX:=80): 'SYSTEM_VALUE_RAY_GEOMETRY_INDEX', (SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX:=81): 'SYSTEM_VALUE_RAY_INSTANCE_CUSTOM_INDEX', (SYSTEM_VALUE_CULL_MASK:=82): 'SYSTEM_VALUE_CULL_MASK', (SYSTEM_VALUE_RAY_TRIANGLE_VERTEX_POSITIONS:=83): 'SYSTEM_VALUE_RAY_TRIANGLE_VERTEX_POSITIONS', (SYSTEM_VALUE_MESH_VIEW_COUNT:=84): 'SYSTEM_VALUE_MESH_VIEW_COUNT', (SYSTEM_VALUE_MESH_VIEW_INDICES:=85): 'SYSTEM_VALUE_MESH_VIEW_INDICES', (SYSTEM_VALUE_GS_HEADER_IR3:=86): 'SYSTEM_VALUE_GS_HEADER_IR3', (SYSTEM_VALUE_TCS_HEADER_IR3:=87): 'SYSTEM_VALUE_TCS_HEADER_IR3', (SYSTEM_VALUE_REL_PATCH_ID_IR3:=88): 'SYSTEM_VALUE_REL_PATCH_ID_IR3', (SYSTEM_VALUE_FRAG_SHADING_RATE:=89): 'SYSTEM_VALUE_FRAG_SHADING_RATE', (SYSTEM_VALUE_FULLY_COVERED:=90): 'SYSTEM_VALUE_FULLY_COVERED', (SYSTEM_VALUE_FRAG_SIZE:=91): 'SYSTEM_VALUE_FRAG_SIZE', (SYSTEM_VALUE_FRAG_INVOCATION_COUNT:=92): 'SYSTEM_VALUE_FRAG_INVOCATION_COUNT', (SYSTEM_VALUE_SHADER_INDEX:=93): 'SYSTEM_VALUE_SHADER_INDEX', (SYSTEM_VALUE_COALESCED_INPUT_COUNT:=94): 'SYSTEM_VALUE_COALESCED_INPUT_COUNT', (SYSTEM_VALUE_WARPS_PER_SM_NV:=95): 'SYSTEM_VALUE_WARPS_PER_SM_NV', (SYSTEM_VALUE_SM_COUNT_NV:=96): 'SYSTEM_VALUE_SM_COUNT_NV', (SYSTEM_VALUE_WARP_ID_NV:=97): 'SYSTEM_VALUE_WARP_ID_NV', (SYSTEM_VALUE_SM_ID_NV:=98): 'SYSTEM_VALUE_SM_ID_NV', (SYSTEM_VALUE_MAX:=99): 'SYSTEM_VALUE_MAX'} +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def nir_intrinsic_from_system_value(val:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def nir_system_value_from_intrinsic(intrin:ctypes.c_uint32) -> ctypes.c_uint32: ... +@c.record +class struct_nir_unsigned_upper_bound_config(c.Struct): + SIZE = 164 + min_subgroup_size: int + max_subgroup_size: int + max_workgroup_invocations: int + max_workgroup_count: c.Array[ctypes.c_uint32, Literal[3]] + max_workgroup_size: c.Array[ctypes.c_uint32, Literal[3]] + vertex_attrib_max: c.Array[ctypes.c_uint32, Literal[32]] +struct_nir_unsigned_upper_bound_config.register_fields([('min_subgroup_size', ctypes.c_uint32, 0), ('max_subgroup_size', ctypes.c_uint32, 4), ('max_workgroup_invocations', ctypes.c_uint32, 8), ('max_workgroup_count', c.Array[ctypes.c_uint32, Literal[3]], 12), ('max_workgroup_size', c.Array[ctypes.c_uint32, Literal[3]], 24), ('vertex_attrib_max', c.Array[uint32_t, Literal[32]], 36)]) +nir_unsigned_upper_bound_config: TypeAlias = struct_nir_unsigned_upper_bound_config +@dll.bind(uint32_t, c.POINTER[nir_shader], c.POINTER[struct_hash_table], nir_scalar, c.POINTER[nir_unsigned_upper_bound_config]) +def nir_unsigned_upper_bound(shader:c.POINTER[nir_shader], range_ht:c.POINTER[struct_hash_table], scalar:nir_scalar, config:c.POINTER[nir_unsigned_upper_bound_config]) -> uint32_t: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_hash_table], nir_scalar, ctypes.c_uint32, c.POINTER[nir_unsigned_upper_bound_config]) +def nir_addition_might_overflow(shader:c.POINTER[nir_shader], range_ht:c.POINTER[struct_hash_table], ssa:nir_scalar, const_val:int, config:c.POINTER[nir_unsigned_upper_bound_config]) -> bool: ... +@c.record +class struct_nir_opt_preamble_options(c.Struct): + SIZE = 56 + drawid_uniform: bool + subgroup_size_uniform: bool + load_workgroup_size_allowed: bool + def_size: c.CFUNCTYPE[None, [c.POINTER[struct_nir_def], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]]] + preamble_storage_size: c.Array[ctypes.c_uint32, Literal[2]] + instr_cost_cb: c.CFUNCTYPE[ctypes.c_float, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] + rewrite_cost_cb: c.CFUNCTYPE[ctypes.c_float, [c.POINTER[struct_nir_def], ctypes.c_void_p]] + avoid_instr_cb: c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_instr], ctypes.c_void_p]] + cb_data: ctypes.c_void_p +struct_nir_opt_preamble_options.register_fields([('drawid_uniform', ctypes.c_bool, 0), ('subgroup_size_uniform', ctypes.c_bool, 1), ('load_workgroup_size_allowed', ctypes.c_bool, 2), ('def_size', c.CFUNCTYPE[None, [c.POINTER[nir_def], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]]], 8), ('preamble_storage_size', c.Array[ctypes.c_uint32, Literal[2]], 16), ('instr_cost_cb', c.CFUNCTYPE[ctypes.c_float, [c.POINTER[nir_instr], ctypes.c_void_p]], 24), ('rewrite_cost_cb', c.CFUNCTYPE[ctypes.c_float, [c.POINTER[nir_def], ctypes.c_void_p]], 32), ('avoid_instr_cb', nir_instr_filter_cb, 40), ('cb_data', ctypes.c_void_p, 48)]) +nir_opt_preamble_options: TypeAlias = struct_nir_opt_preamble_options +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_opt_preamble_options], c.POINTER[ctypes.c_uint32]) +def nir_opt_preamble(shader:c.POINTER[nir_shader], options:c.POINTER[nir_opt_preamble_options], size:c.POINTER[ctypes.c_uint32]) -> bool: ... +@dll.bind(c.POINTER[nir_function_impl], c.POINTER[nir_shader]) +def nir_shader_get_preamble(shader:c.POINTER[nir_shader]) -> c.POINTER[nir_function_impl]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_bool) +def nir_lower_point_smooth(shader:c.POINTER[nir_shader], set_barycentrics:bool) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_lower_poly_line_smooth(shader:c.POINTER[nir_shader], num_smooth_aa_sample:int) -> bool: ... +@dll.bind(ctypes.c_bool, nir_scalar, ctypes.c_ubyte, ctypes.c_uint32, c.POINTER[ctypes.c_uint32]) +def nir_mod_analysis(val:nir_scalar, val_type:ctypes.c_ubyte, div:int, mod:c.POINTER[ctypes.c_uint32]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], ctypes.c_uint32) +def nir_remove_tex_shadow(shader:c.POINTER[nir_shader], textures_bitmask:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def nir_trivialize_registers(s:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_shader]) +def nir_static_workgroup_size(s:c.POINTER[nir_shader]) -> int: ... +class struct_nir_use_dominance_state(c.Struct): pass +nir_use_dominance_state: TypeAlias = struct_nir_use_dominance_state +@dll.bind(c.POINTER[nir_use_dominance_state], c.POINTER[nir_function_impl], ctypes.c_bool) +def nir_calc_use_dominance_impl(impl:c.POINTER[nir_function_impl], post_dominance:bool) -> c.POINTER[nir_use_dominance_state]: ... +@dll.bind(c.POINTER[nir_instr], c.POINTER[nir_use_dominance_state], c.POINTER[nir_instr]) +def nir_get_immediate_use_dominator(state:c.POINTER[nir_use_dominance_state], instr:c.POINTER[nir_instr]) -> c.POINTER[nir_instr]: ... +@dll.bind(c.POINTER[nir_instr], c.POINTER[nir_use_dominance_state], c.POINTER[nir_instr], c.POINTER[nir_instr]) +def nir_use_dominance_lca(state:c.POINTER[nir_use_dominance_state], i1:c.POINTER[nir_instr], i2:c.POINTER[nir_instr]) -> c.POINTER[nir_instr]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_use_dominance_state], c.POINTER[nir_instr], c.POINTER[nir_instr]) +def nir_instr_dominates_use(state:c.POINTER[nir_use_dominance_state], parent:c.POINTER[nir_instr], child:c.POINTER[nir_instr]) -> bool: ... +@dll.bind(None, c.POINTER[nir_use_dominance_state], c.POINTER[c.POINTER[nir_instr]], ctypes.c_uint32) +def nir_print_use_dominators(state:c.POINTER[nir_use_dominance_state], instructions:c.POINTER[c.POINTER[nir_instr]], num_instructions:int) -> None: ... +@c.record +class nir_output_deps(c.Struct): + SIZE = 1792 + output: c.Array[nir_output_deps_output, Literal[112]] +@c.record +class nir_output_deps_output(c.Struct): + SIZE = 16 + instr_list: c.POINTER[c.POINTER[struct_nir_instr]] + num_instr: int +nir_output_deps_output.register_fields([('instr_list', c.POINTER[c.POINTER[nir_instr]], 0), ('num_instr', ctypes.c_uint32, 8)]) +nir_output_deps.register_fields([('output', c.Array[nir_output_deps_output, Literal[112]], 0)]) +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_output_deps]) +def nir_gather_output_dependencies(nir:c.POINTER[nir_shader], deps:c.POINTER[nir_output_deps]) -> None: ... +@dll.bind(None, c.POINTER[nir_output_deps]) +def nir_free_output_dependencies(deps:c.POINTER[nir_output_deps]) -> None: ... +@c.record +class nir_input_to_output_deps(c.Struct): + SIZE = 12992 + output: c.Array[nir_input_to_output_deps_output, Literal[112]] +@c.record +class nir_input_to_output_deps_output(c.Struct): + SIZE = 116 + inputs: c.Array[ctypes.c_uint32, Literal[28]] + defined: bool + uses_ssbo_reads: bool + uses_image_reads: bool +nir_input_to_output_deps_output.register_fields([('inputs', c.Array[ctypes.c_uint32, Literal[28]], 0), ('defined', ctypes.c_bool, 112), ('uses_ssbo_reads', ctypes.c_bool, 113), ('uses_image_reads', ctypes.c_bool, 114)]) +nir_input_to_output_deps.register_fields([('output', c.Array[nir_input_to_output_deps_output, Literal[112]], 0)]) +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_input_to_output_deps]) +def nir_gather_input_to_output_dependencies(nir:c.POINTER[nir_shader], out_deps:c.POINTER[nir_input_to_output_deps]) -> None: ... +@dll.bind(None, c.POINTER[nir_input_to_output_deps], c.POINTER[nir_shader], c.POINTER[FILE]) +def nir_print_input_to_output_deps(deps:c.POINTER[nir_input_to_output_deps], nir:c.POINTER[nir_shader], f:c.POINTER[FILE]) -> None: ... +@c.record +class nir_output_clipper_var_groups(c.Struct): + SIZE = 336 + pos_only: c.Array[ctypes.c_uint32, Literal[28]] + var_only: c.Array[ctypes.c_uint32, Literal[28]] + both: c.Array[ctypes.c_uint32, Literal[28]] +nir_output_clipper_var_groups.register_fields([('pos_only', c.Array[ctypes.c_uint32, Literal[28]], 0), ('var_only', c.Array[ctypes.c_uint32, Literal[28]], 112), ('both', c.Array[ctypes.c_uint32, Literal[28]], 224)]) +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[nir_output_clipper_var_groups]) +def nir_gather_output_clipper_var_groups(nir:c.POINTER[nir_shader], groups:c.POINTER[nir_output_clipper_var_groups]) -> None: ... +struct_nir_builder.register_fields([('cursor', nir_cursor, 0), ('exact', ctypes.c_bool, 16), ('fp_fast_math', uint32_t, 20), ('shader', c.POINTER[nir_shader], 24), ('impl', c.POINTER[nir_function_impl], 32)]) +@dll.bind(nir_builder, gl_shader_stage, c.POINTER[nir_shader_compiler_options], c.POINTER[ctypes.c_char]) +def nir_builder_init_simple_shader(stage:gl_shader_stage, options:c.POINTER[nir_shader_compiler_options], name:c.POINTER[ctypes.c_char]) -> nir_builder: ... +nir_instr_pass_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_builder], c.POINTER[struct_nir_instr], ctypes.c_void_p]] +nir_intrinsic_pass_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_builder], c.POINTER[struct_nir_intrinsic_instr], ctypes.c_void_p]] +nir_alu_pass_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_builder], c.POINTER[struct_nir_alu_instr], ctypes.c_void_p]] +nir_tex_pass_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_builder], c.POINTER[struct_nir_tex_instr], ctypes.c_void_p]] +nir_phi_pass_cb: TypeAlias = c.CFUNCTYPE[ctypes.c_bool, [c.POINTER[struct_nir_builder], c.POINTER[struct_nir_phi_instr], ctypes.c_void_p]] +@dll.bind(None, c.POINTER[nir_builder], c.POINTER[nir_instr]) +def nir_builder_instr_insert(build:c.POINTER[nir_builder], instr:c.POINTER[nir_instr]) -> None: ... +@dll.bind(None, c.POINTER[nir_builder], c.POINTER[nir_instr]) +def nir_builder_instr_insert_at_top(build:c.POINTER[nir_builder], instr:c.POINTER[nir_instr]) -> None: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[nir_def], c.POINTER[nir_def], c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_build_alu(build:c.POINTER[nir_builder], op:ctypes.c_uint32, src0:c.POINTER[nir_def], src1:c.POINTER[nir_def], src2:c.POINTER[nir_def], src3:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[nir_def]) +def nir_build_alu1(build:c.POINTER[nir_builder], op:ctypes.c_uint32, src0:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_build_alu2(build:c.POINTER[nir_builder], op:ctypes.c_uint32, src0:c.POINTER[nir_def], src1:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[nir_def], c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_build_alu3(build:c.POINTER[nir_builder], op:ctypes.c_uint32, src0:c.POINTER[nir_def], src1:c.POINTER[nir_def], src2:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[nir_def], c.POINTER[nir_def], c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_build_alu4(build:c.POINTER[nir_builder], op:ctypes.c_uint32, src0:c.POINTER[nir_def], src1:c.POINTER[nir_def], src2:c.POINTER[nir_def], src3:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[c.POINTER[nir_def]]) +def nir_build_alu_src_arr(build:c.POINTER[nir_builder], op:ctypes.c_uint32, srcs:c.POINTER[c.POINTER[nir_def]]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], nir_texop, c.POINTER[nir_deref_instr], c.POINTER[nir_deref_instr], ctypes.c_uint32, c.POINTER[nir_tex_src]) +def nir_build_tex_deref_instr(build:c.POINTER[nir_builder], op:nir_texop, texture:c.POINTER[nir_deref_instr], sampler:c.POINTER[nir_deref_instr], num_extra_srcs:int, extra_srcs:c.POINTER[nir_tex_src]) -> c.POINTER[nir_def]: ... +@dll.bind(None, c.POINTER[nir_builder], c.POINTER[nir_cf_node]) +def nir_builder_cf_insert(build:c.POINTER[nir_builder], cf:c.POINTER[nir_cf_node]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_builder], c.POINTER[nir_cf_node]) +def nir_builder_is_inside_cf(build:c.POINTER[nir_builder], cf_node:c.POINTER[nir_cf_node]) -> bool: ... +@dll.bind(c.POINTER[nir_if], c.POINTER[nir_builder], c.POINTER[nir_def]) +def nir_push_if(build:c.POINTER[nir_builder], condition:c.POINTER[nir_def]) -> c.POINTER[nir_if]: ... +@dll.bind(c.POINTER[nir_if], c.POINTER[nir_builder], c.POINTER[nir_if]) +def nir_push_else(build:c.POINTER[nir_builder], nif:c.POINTER[nir_if]) -> c.POINTER[nir_if]: ... +@dll.bind(None, c.POINTER[nir_builder], c.POINTER[nir_if]) +def nir_pop_if(build:c.POINTER[nir_builder], nif:c.POINTER[nir_if]) -> None: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_if_phi(build:c.POINTER[nir_builder], then_def:c.POINTER[nir_def], else_def:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_loop], c.POINTER[nir_builder]) +def nir_push_loop(build:c.POINTER[nir_builder]) -> c.POINTER[nir_loop]: ... +@dll.bind(c.POINTER[nir_loop], c.POINTER[nir_builder], c.POINTER[nir_loop]) +def nir_push_continue(build:c.POINTER[nir_builder], loop:c.POINTER[nir_loop]) -> c.POINTER[nir_loop]: ... +@dll.bind(None, c.POINTER[nir_builder], c.POINTER[nir_loop]) +def nir_pop_loop(build:c.POINTER[nir_builder], loop:c.POINTER[nir_loop]) -> None: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_alu_instr]) +def nir_builder_alu_instr_finish_and_insert(build:c.POINTER[nir_builder], instr:c.POINTER[nir_alu_instr]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, ctypes.c_int32, ctypes.c_uint32, ctypes.c_uint32) +def nir_load_system_value(build:c.POINTER[nir_builder], op:ctypes.c_uint32, index:int, num_components:int, bit_size:int) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], ctypes.c_ubyte, ctypes.c_ubyte, ctypes.c_uint32) +def nir_type_convert(b:c.POINTER[nir_builder], src:c.POINTER[nir_def], src_type:ctypes.c_ubyte, dest_type:ctypes.c_ubyte, rnd:ctypes.c_uint32) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_scalar], ctypes.c_uint32) +def nir_vec_scalars(build:c.POINTER[nir_builder], comp:c.POINTER[nir_scalar], num_components:int) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_alu_instr], ctypes.c_uint32) +def nir_ssa_for_alu_src(build:c.POINTER[nir_builder], instr:c.POINTER[nir_alu_instr], srcn:int) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[ctypes.c_char]) +def nir_build_string(build:c.POINTER[nir_builder], value:c.POINTER[ctypes.c_char]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_compare_func(b:c.POINTER[nir_builder], func:ctypes.c_uint32, src0:c.POINTER[nir_def], src1:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], c.POINTER[nir_def]) +def nir_gen_rect_vertices(b:c.POINTER[nir_builder], z:c.POINTER[nir_def], w:c.POINTER[nir_def]) -> c.POINTER[nir_def]: ... +@dll.bind(None, c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def nir_printf_fmt(b:c.POINTER[nir_builder], ptr_bit_size:int, fmt:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, c.POINTER[nir_builder], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def nir_printf_fmt_at_px(b:c.POINTER[nir_builder], ptr_bit_size:int, x:int, y:int, fmt:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[uint32_t], size_t, c.POINTER[c.POINTER[nir_def]]) +def nir_call_serialized(build:c.POINTER[nir_builder], serialized:c.POINTER[uint32_t], serialized_size_B:size_t, args:c.POINTER[c.POINTER[nir_def]]) -> c.POINTER[nir_def]: ... +nir_lower_packing_op: dict[int, str] = {(nir_lower_packing_op_pack_64_2x32:=0): 'nir_lower_packing_op_pack_64_2x32', (nir_lower_packing_op_unpack_64_2x32:=1): 'nir_lower_packing_op_unpack_64_2x32', (nir_lower_packing_op_pack_64_4x16:=2): 'nir_lower_packing_op_pack_64_4x16', (nir_lower_packing_op_unpack_64_4x16:=3): 'nir_lower_packing_op_unpack_64_4x16', (nir_lower_packing_op_pack_32_2x16:=4): 'nir_lower_packing_op_pack_32_2x16', (nir_lower_packing_op_unpack_32_2x16:=5): 'nir_lower_packing_op_unpack_32_2x16', (nir_lower_packing_op_pack_32_4x8:=6): 'nir_lower_packing_op_pack_32_4x8', (nir_lower_packing_op_unpack_32_4x8:=7): 'nir_lower_packing_op_unpack_32_4x8', (nir_lower_packing_num_ops:=8): 'nir_lower_packing_num_ops'} +@c.record +class struct_blob(c.Struct): + SIZE = 32 + data: c.POINTER[ctypes.c_ubyte] + allocated: int + size: int + fixed_allocation: bool + out_of_memory: bool +struct_blob.register_fields([('data', c.POINTER[uint8_t], 0), ('allocated', size_t, 8), ('size', size_t, 16), ('fixed_allocation', ctypes.c_bool, 24), ('out_of_memory', ctypes.c_bool, 25)]) +@dll.bind(None, c.POINTER[struct_blob], c.POINTER[nir_shader], ctypes.c_bool) +def nir_serialize(blob:c.POINTER[struct_blob], nir:c.POINTER[nir_shader], strip:bool) -> None: ... +@c.record +class struct_blob_reader(c.Struct): + SIZE = 32 + data: c.POINTER[ctypes.c_ubyte] + end: c.POINTER[ctypes.c_ubyte] + current: c.POINTER[ctypes.c_ubyte] + overrun: bool +struct_blob_reader.register_fields([('data', c.POINTER[uint8_t], 0), ('end', c.POINTER[uint8_t], 8), ('current', c.POINTER[uint8_t], 16), ('overrun', ctypes.c_bool, 24)]) +@dll.bind(c.POINTER[nir_shader], ctypes.c_void_p, c.POINTER[struct_nir_shader_compiler_options], c.POINTER[struct_blob_reader]) +def nir_deserialize(mem_ctx:ctypes.c_void_p, options:c.POINTER[struct_nir_shader_compiler_options], blob:c.POINTER[struct_blob_reader]) -> c.POINTER[nir_shader]: ... +@dll.bind(None, c.POINTER[struct_blob], c.POINTER[nir_function]) +def nir_serialize_function(blob:c.POINTER[struct_blob], fxn:c.POINTER[nir_function]) -> None: ... +@dll.bind(c.POINTER[nir_function], ctypes.c_void_p, c.POINTER[struct_nir_shader_compiler_options], c.POINTER[struct_blob_reader]) +def nir_deserialize_function(mem_ctx:ctypes.c_void_p, options:c.POINTER[struct_nir_shader_compiler_options], blob:c.POINTER[struct_blob_reader]) -> c.POINTER[nir_function]: ... +nir_intrinsic_index_flag: dict[int, str] = {(NIR_INTRINSIC_BASE:=0): 'NIR_INTRINSIC_BASE', (NIR_INTRINSIC_WRITE_MASK:=1): 'NIR_INTRINSIC_WRITE_MASK', (NIR_INTRINSIC_STREAM_ID:=2): 'NIR_INTRINSIC_STREAM_ID', (NIR_INTRINSIC_UCP_ID:=3): 'NIR_INTRINSIC_UCP_ID', (NIR_INTRINSIC_RANGE_BASE:=4): 'NIR_INTRINSIC_RANGE_BASE', (NIR_INTRINSIC_RANGE:=5): 'NIR_INTRINSIC_RANGE', (NIR_INTRINSIC_DESC_SET:=6): 'NIR_INTRINSIC_DESC_SET', (NIR_INTRINSIC_BINDING:=7): 'NIR_INTRINSIC_BINDING', (NIR_INTRINSIC_COMPONENT:=8): 'NIR_INTRINSIC_COMPONENT', (NIR_INTRINSIC_COLUMN:=9): 'NIR_INTRINSIC_COLUMN', (NIR_INTRINSIC_INTERP_MODE:=10): 'NIR_INTRINSIC_INTERP_MODE', (NIR_INTRINSIC_REDUCTION_OP:=11): 'NIR_INTRINSIC_REDUCTION_OP', (NIR_INTRINSIC_CLUSTER_SIZE:=12): 'NIR_INTRINSIC_CLUSTER_SIZE', (NIR_INTRINSIC_PARAM_IDX:=13): 'NIR_INTRINSIC_PARAM_IDX', (NIR_INTRINSIC_IMAGE_DIM:=14): 'NIR_INTRINSIC_IMAGE_DIM', (NIR_INTRINSIC_IMAGE_ARRAY:=15): 'NIR_INTRINSIC_IMAGE_ARRAY', (NIR_INTRINSIC_FORMAT:=16): 'NIR_INTRINSIC_FORMAT', (NIR_INTRINSIC_ACCESS:=17): 'NIR_INTRINSIC_ACCESS', (NIR_INTRINSIC_CALL_IDX:=18): 'NIR_INTRINSIC_CALL_IDX', (NIR_INTRINSIC_STACK_SIZE:=19): 'NIR_INTRINSIC_STACK_SIZE', (NIR_INTRINSIC_ALIGN_MUL:=20): 'NIR_INTRINSIC_ALIGN_MUL', (NIR_INTRINSIC_ALIGN_OFFSET:=21): 'NIR_INTRINSIC_ALIGN_OFFSET', (NIR_INTRINSIC_DESC_TYPE:=22): 'NIR_INTRINSIC_DESC_TYPE', (NIR_INTRINSIC_SRC_TYPE:=23): 'NIR_INTRINSIC_SRC_TYPE', (NIR_INTRINSIC_DEST_TYPE:=24): 'NIR_INTRINSIC_DEST_TYPE', (NIR_INTRINSIC_SRC_BASE_TYPE:=25): 'NIR_INTRINSIC_SRC_BASE_TYPE', (NIR_INTRINSIC_SRC_BASE_TYPE2:=26): 'NIR_INTRINSIC_SRC_BASE_TYPE2', (NIR_INTRINSIC_DEST_BASE_TYPE:=27): 'NIR_INTRINSIC_DEST_BASE_TYPE', (NIR_INTRINSIC_SWIZZLE_MASK:=28): 'NIR_INTRINSIC_SWIZZLE_MASK', (NIR_INTRINSIC_FETCH_INACTIVE:=29): 'NIR_INTRINSIC_FETCH_INACTIVE', (NIR_INTRINSIC_OFFSET0:=30): 'NIR_INTRINSIC_OFFSET0', (NIR_INTRINSIC_OFFSET1:=31): 'NIR_INTRINSIC_OFFSET1', (NIR_INTRINSIC_ST64:=32): 'NIR_INTRINSIC_ST64', (NIR_INTRINSIC_ARG_UPPER_BOUND_U32_AMD:=33): 'NIR_INTRINSIC_ARG_UPPER_BOUND_U32_AMD', (NIR_INTRINSIC_DST_ACCESS:=34): 'NIR_INTRINSIC_DST_ACCESS', (NIR_INTRINSIC_SRC_ACCESS:=35): 'NIR_INTRINSIC_SRC_ACCESS', (NIR_INTRINSIC_DRIVER_LOCATION:=36): 'NIR_INTRINSIC_DRIVER_LOCATION', (NIR_INTRINSIC_MEMORY_SEMANTICS:=37): 'NIR_INTRINSIC_MEMORY_SEMANTICS', (NIR_INTRINSIC_MEMORY_MODES:=38): 'NIR_INTRINSIC_MEMORY_MODES', (NIR_INTRINSIC_MEMORY_SCOPE:=39): 'NIR_INTRINSIC_MEMORY_SCOPE', (NIR_INTRINSIC_EXECUTION_SCOPE:=40): 'NIR_INTRINSIC_EXECUTION_SCOPE', (NIR_INTRINSIC_IO_SEMANTICS:=41): 'NIR_INTRINSIC_IO_SEMANTICS', (NIR_INTRINSIC_IO_XFB:=42): 'NIR_INTRINSIC_IO_XFB', (NIR_INTRINSIC_IO_XFB2:=43): 'NIR_INTRINSIC_IO_XFB2', (NIR_INTRINSIC_RAY_QUERY_VALUE:=44): 'NIR_INTRINSIC_RAY_QUERY_VALUE', (NIR_INTRINSIC_COMMITTED:=45): 'NIR_INTRINSIC_COMMITTED', (NIR_INTRINSIC_ROUNDING_MODE:=46): 'NIR_INTRINSIC_ROUNDING_MODE', (NIR_INTRINSIC_SATURATE:=47): 'NIR_INTRINSIC_SATURATE', (NIR_INTRINSIC_SYNCHRONOUS:=48): 'NIR_INTRINSIC_SYNCHRONOUS', (NIR_INTRINSIC_VALUE_ID:=49): 'NIR_INTRINSIC_VALUE_ID', (NIR_INTRINSIC_SIGN_EXTEND:=50): 'NIR_INTRINSIC_SIGN_EXTEND', (NIR_INTRINSIC_FLAGS:=51): 'NIR_INTRINSIC_FLAGS', (NIR_INTRINSIC_ATOMIC_OP:=52): 'NIR_INTRINSIC_ATOMIC_OP', (NIR_INTRINSIC_RESOURCE_BLOCK_INTEL:=53): 'NIR_INTRINSIC_RESOURCE_BLOCK_INTEL', (NIR_INTRINSIC_RESOURCE_ACCESS_INTEL:=54): 'NIR_INTRINSIC_RESOURCE_ACCESS_INTEL', (NIR_INTRINSIC_NUM_COMPONENTS:=55): 'NIR_INTRINSIC_NUM_COMPONENTS', (NIR_INTRINSIC_NUM_ARRAY_ELEMS:=56): 'NIR_INTRINSIC_NUM_ARRAY_ELEMS', (NIR_INTRINSIC_BIT_SIZE:=57): 'NIR_INTRINSIC_BIT_SIZE', (NIR_INTRINSIC_DIVERGENT:=58): 'NIR_INTRINSIC_DIVERGENT', (NIR_INTRINSIC_LEGACY_FABS:=59): 'NIR_INTRINSIC_LEGACY_FABS', (NIR_INTRINSIC_LEGACY_FNEG:=60): 'NIR_INTRINSIC_LEGACY_FNEG', (NIR_INTRINSIC_LEGACY_FSAT:=61): 'NIR_INTRINSIC_LEGACY_FSAT', (NIR_INTRINSIC_CMAT_DESC:=62): 'NIR_INTRINSIC_CMAT_DESC', (NIR_INTRINSIC_MATRIX_LAYOUT:=63): 'NIR_INTRINSIC_MATRIX_LAYOUT', (NIR_INTRINSIC_CMAT_SIGNED_MASK:=64): 'NIR_INTRINSIC_CMAT_SIGNED_MASK', (NIR_INTRINSIC_ALU_OP:=65): 'NIR_INTRINSIC_ALU_OP', (NIR_INTRINSIC_NEG_LO_AMD:=66): 'NIR_INTRINSIC_NEG_LO_AMD', (NIR_INTRINSIC_NEG_HI_AMD:=67): 'NIR_INTRINSIC_NEG_HI_AMD', (NIR_INTRINSIC_SYSTOLIC_DEPTH:=68): 'NIR_INTRINSIC_SYSTOLIC_DEPTH', (NIR_INTRINSIC_REPEAT_COUNT:=69): 'NIR_INTRINSIC_REPEAT_COUNT', (NIR_INTRINSIC_DST_CMAT_DESC:=70): 'NIR_INTRINSIC_DST_CMAT_DESC', (NIR_INTRINSIC_SRC_CMAT_DESC:=71): 'NIR_INTRINSIC_SRC_CMAT_DESC', (NIR_INTRINSIC_EXPLICIT_COORD:=72): 'NIR_INTRINSIC_EXPLICIT_COORD', (NIR_INTRINSIC_FMT_IDX:=73): 'NIR_INTRINSIC_FMT_IDX', (NIR_INTRINSIC_PREAMBLE_CLASS:=74): 'NIR_INTRINSIC_PREAMBLE_CLASS', (NIR_INTRINSIC_NUM_INDEX_FLAGS:=75): 'NIR_INTRINSIC_NUM_INDEX_FLAGS'} +try: nir_intrinsic_index_names = c.Array[c.POINTER[ctypes.c_char], Literal[75]].in_dll(dll, 'nir_intrinsic_index_names') # type: ignore +except (ValueError,AttributeError): pass +enum_nv_device_type: dict[int, str] = {(NV_DEVICE_TYPE_IGP:=0): 'NV_DEVICE_TYPE_IGP', (NV_DEVICE_TYPE_DIS:=1): 'NV_DEVICE_TYPE_DIS', (NV_DEVICE_TYPE_SOC:=2): 'NV_DEVICE_TYPE_SOC'} +@c.record +class struct_nv_device_info(c.Struct): + SIZE = 128 + type: int + device_id: int + chipset: int + device_name: c.Array[ctypes.c_char, Literal[64]] + chipset_name: c.Array[ctypes.c_char, Literal[16]] + pci: struct_nv_device_info_pci + sm: int + gpc_count: int + tpc_count: int + mp_per_tpc: int + max_warps_per_mp: int + cls_copy: int + cls_eng2d: int + cls_eng3d: int + cls_m2mf: int + cls_compute: int + vram_size_B: int + bar_size_B: int +@c.record +class struct_nv_device_info_pci(c.Struct): + SIZE = 6 + domain: int + bus: int + dev: int + func: int + revision_id: int +struct_nv_device_info_pci.register_fields([('domain', uint16_t, 0), ('bus', uint8_t, 2), ('dev', uint8_t, 3), ('func', uint8_t, 4), ('revision_id', uint8_t, 5)]) +struct_nv_device_info.register_fields([('type', ctypes.c_ubyte, 0), ('device_id', uint16_t, 2), ('chipset', uint16_t, 4), ('device_name', c.Array[ctypes.c_char, Literal[64]], 6), ('chipset_name', c.Array[ctypes.c_char, Literal[16]], 70), ('pci', struct_nv_device_info_pci, 86), ('sm', uint8_t, 92), ('gpc_count', uint8_t, 93), ('tpc_count', uint16_t, 94), ('mp_per_tpc', uint8_t, 96), ('max_warps_per_mp', uint8_t, 97), ('cls_copy', uint16_t, 98), ('cls_eng2d', uint16_t, 100), ('cls_eng3d', uint16_t, 102), ('cls_m2mf', uint16_t, 104), ('cls_compute', uint16_t, 106), ('vram_size_B', uint64_t, 112), ('bar_size_B', uint64_t, 120)]) +class struct_nak_compiler(c.Struct): pass +@dll.bind(c.POINTER[struct_nak_compiler], c.POINTER[struct_nv_device_info]) +def nak_compiler_create(dev:c.POINTER[struct_nv_device_info]) -> c.POINTER[struct_nak_compiler]: ... +@dll.bind(None, c.POINTER[struct_nak_compiler]) +def nak_compiler_destroy(nak:c.POINTER[struct_nak_compiler]) -> None: ... +@dll.bind(uint64_t, c.POINTER[struct_nak_compiler]) +def nak_debug_flags(nak:c.POINTER[struct_nak_compiler]) -> uint64_t: ... +@dll.bind(c.POINTER[struct_nir_shader_compiler_options], c.POINTER[struct_nak_compiler]) +def nak_nir_options(nak:c.POINTER[struct_nak_compiler]) -> c.POINTER[struct_nir_shader_compiler_options]: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[struct_nak_compiler]) +def nak_preprocess_nir(nir:c.POINTER[nir_shader], nak:c.POINTER[struct_nak_compiler]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_nak_compiler]) +def nak_nir_lower_image_addrs(nir:c.POINTER[nir_shader], nak:c.POINTER[struct_nak_compiler]) -> bool: ... +@c.record +class struct_nak_sample_location(c.Struct): + SIZE = 1 + x_u4: int + y_u4: int +struct_nak_sample_location.register_fields([('x_u4', uint8_t, 0, 4, 0), ('y_u4', uint8_t, 0, 4, 4)]) +@c.record +class struct_nak_sample_mask(c.Struct): + SIZE = 2 + sample_mask: int +struct_nak_sample_mask.register_fields([('sample_mask', uint16_t, 0)]) +@c.record +class struct_nak_fs_key(c.Struct): + SIZE = 12 + zs_self_dep: bool + force_sample_shading: bool + uses_underestimate: bool + sample_info_cb: int + sample_locations_offset: int + sample_masks_offset: int +struct_nak_fs_key.register_fields([('zs_self_dep', ctypes.c_bool, 0), ('force_sample_shading', ctypes.c_bool, 1), ('uses_underestimate', ctypes.c_bool, 2), ('sample_info_cb', uint8_t, 3), ('sample_locations_offset', uint32_t, 4), ('sample_masks_offset', uint32_t, 8)]) +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[struct_nak_compiler], ctypes.c_uint32, c.POINTER[struct_nak_fs_key]) +def nak_postprocess_nir(nir:c.POINTER[nir_shader], nak:c.POINTER[struct_nak_compiler], robust2_modes:ctypes.c_uint32, fs_key:c.POINTER[struct_nak_fs_key]) -> None: ... +enum_nak_ts_domain: dict[int, str] = {(NAK_TS_DOMAIN_ISOLINE:=0): 'NAK_TS_DOMAIN_ISOLINE', (NAK_TS_DOMAIN_TRIANGLE:=1): 'NAK_TS_DOMAIN_TRIANGLE', (NAK_TS_DOMAIN_QUAD:=2): 'NAK_TS_DOMAIN_QUAD'} +enum_nak_ts_spacing: dict[int, str] = {(NAK_TS_SPACING_INTEGER:=0): 'NAK_TS_SPACING_INTEGER', (NAK_TS_SPACING_FRACT_ODD:=1): 'NAK_TS_SPACING_FRACT_ODD', (NAK_TS_SPACING_FRACT_EVEN:=2): 'NAK_TS_SPACING_FRACT_EVEN'} +enum_nak_ts_prims: dict[int, str] = {(NAK_TS_PRIMS_POINTS:=0): 'NAK_TS_PRIMS_POINTS', (NAK_TS_PRIMS_LINES:=1): 'NAK_TS_PRIMS_LINES', (NAK_TS_PRIMS_TRIANGLES_CW:=2): 'NAK_TS_PRIMS_TRIANGLES_CW', (NAK_TS_PRIMS_TRIANGLES_CCW:=3): 'NAK_TS_PRIMS_TRIANGLES_CCW'} +@c.record +class struct_nak_xfb_info(c.Struct): + SIZE = 536 + stride: c.Array[ctypes.c_uint32, Literal[4]] + stream: c.Array[ctypes.c_ubyte, Literal[4]] + attr_count: c.Array[ctypes.c_ubyte, Literal[4]] + attr_index: c.Array[c.Array[ctypes.c_ubyte, Literal[128]], Literal[4]] +struct_nak_xfb_info.register_fields([('stride', c.Array[uint32_t, Literal[4]], 0), ('stream', c.Array[uint8_t, Literal[4]], 16), ('attr_count', c.Array[uint8_t, Literal[4]], 20), ('attr_index', c.Array[c.Array[uint8_t, Literal[128]], Literal[4]], 24)]) +@c.record +class struct_nak_shader_info(c.Struct): + SIZE = 728 + stage: int + sm: int + num_gprs: int + num_control_barriers: int + _pad0: int + max_warps_per_sm: int + num_instrs: int + num_static_cycles: int + num_spills_to_mem: int + num_fills_from_mem: int + num_spills_to_reg: int + num_fills_from_reg: int + slm_size: int + crs_size: int + cs: struct_nak_shader_info_cs + fs: struct_nak_shader_info_fs + ts: struct_nak_shader_info_ts + _pad: c.Array[ctypes.c_ubyte, Literal[12]] + vtg: struct_nak_shader_info_vtg + hdr: c.Array[ctypes.c_uint32, Literal[32]] +@c.record +class struct_nak_shader_info_cs(c.Struct): + SIZE = 12 + local_size: c.Array[ctypes.c_uint16, Literal[3]] + smem_size: int + _pad: c.Array[ctypes.c_ubyte, Literal[4]] +struct_nak_shader_info_cs.register_fields([('local_size', c.Array[uint16_t, Literal[3]], 0), ('smem_size', uint16_t, 6), ('_pad', c.Array[uint8_t, Literal[4]], 8)]) +@c.record +class struct_nak_shader_info_fs(c.Struct): + SIZE = 12 + writes_depth: bool + reads_sample_mask: bool + post_depth_coverage: bool + uses_sample_shading: bool + early_fragment_tests: bool + _pad: c.Array[ctypes.c_ubyte, Literal[7]] +struct_nak_shader_info_fs.register_fields([('writes_depth', ctypes.c_bool, 0), ('reads_sample_mask', ctypes.c_bool, 1), ('post_depth_coverage', ctypes.c_bool, 2), ('uses_sample_shading', ctypes.c_bool, 3), ('early_fragment_tests', ctypes.c_bool, 4), ('_pad', c.Array[uint8_t, Literal[7]], 5)]) +@c.record +class struct_nak_shader_info_ts(c.Struct): + SIZE = 12 + domain: int + spacing: int + prims: int + _pad: c.Array[ctypes.c_ubyte, Literal[9]] +struct_nak_shader_info_ts.register_fields([('domain', ctypes.c_ubyte, 0), ('spacing', ctypes.c_ubyte, 1), ('prims', ctypes.c_ubyte, 2), ('_pad', c.Array[uint8_t, Literal[9]], 3)]) +@c.record +class struct_nak_shader_info_vtg(c.Struct): + SIZE = 544 + writes_layer: bool + writes_point_size: bool + writes_vprs_table_index: bool + clip_enable: int + cull_enable: int + _pad: c.Array[ctypes.c_ubyte, Literal[3]] + xfb: struct_nak_xfb_info +struct_nak_shader_info_vtg.register_fields([('writes_layer', ctypes.c_bool, 0), ('writes_point_size', ctypes.c_bool, 1), ('writes_vprs_table_index', ctypes.c_bool, 2), ('clip_enable', uint8_t, 3), ('cull_enable', uint8_t, 4), ('_pad', c.Array[uint8_t, Literal[3]], 5), ('xfb', struct_nak_xfb_info, 8)]) +struct_nak_shader_info.register_fields([('stage', gl_shader_stage, 0), ('sm', uint8_t, 4), ('num_gprs', uint8_t, 5), ('num_control_barriers', uint8_t, 6), ('_pad0', uint8_t, 7), ('max_warps_per_sm', uint32_t, 8), ('num_instrs', uint32_t, 12), ('num_static_cycles', uint32_t, 16), ('num_spills_to_mem', uint32_t, 20), ('num_fills_from_mem', uint32_t, 24), ('num_spills_to_reg', uint32_t, 28), ('num_fills_from_reg', uint32_t, 32), ('slm_size', uint32_t, 36), ('crs_size', uint32_t, 40), ('cs', struct_nak_shader_info_cs, 44), ('fs', struct_nak_shader_info_fs, 44), ('ts', struct_nak_shader_info_ts, 44), ('_pad', c.Array[uint8_t, Literal[12]], 44), ('vtg', struct_nak_shader_info_vtg, 56), ('hdr', c.Array[uint32_t, Literal[32]], 600)]) +@c.record +class struct_nak_shader_bin(c.Struct): + SIZE = 752 + info: struct_nak_shader_info + code_size: int + code: ctypes.c_void_p + asm_str: c.POINTER[ctypes.c_char] +struct_nak_shader_bin.register_fields([('info', struct_nak_shader_info, 0), ('code_size', uint32_t, 728), ('code', ctypes.c_void_p, 736), ('asm_str', c.POINTER[ctypes.c_char], 744)]) +@dll.bind(None, c.POINTER[struct_nak_shader_bin]) +def nak_shader_bin_destroy(bin:c.POINTER[struct_nak_shader_bin]) -> None: ... +@dll.bind(c.POINTER[struct_nak_shader_bin], c.POINTER[nir_shader], ctypes.c_bool, c.POINTER[struct_nak_compiler], ctypes.c_uint32, c.POINTER[struct_nak_fs_key]) +def nak_compile_shader(nir:c.POINTER[nir_shader], dump_asm:bool, nak:c.POINTER[struct_nak_compiler], robust2_modes:ctypes.c_uint32, fs_key:c.POINTER[struct_nak_fs_key]) -> c.POINTER[struct_nak_shader_bin]: ... +@c.record +class struct_nak_qmd_cbuf(c.Struct): + SIZE = 16 + index: int + size: int + addr: int +struct_nak_qmd_cbuf.register_fields([('index', uint32_t, 0), ('size', uint32_t, 4), ('addr', uint64_t, 8)]) +@c.record +class struct_nak_qmd_info(c.Struct): + SIZE = 160 + addr: int + smem_size: int + smem_max: int + global_size: c.Array[ctypes.c_uint32, Literal[3]] + num_cbufs: int + cbufs: c.Array[struct_nak_qmd_cbuf, Literal[8]] +struct_nak_qmd_info.register_fields([('addr', uint64_t, 0), ('smem_size', uint16_t, 8), ('smem_max', uint16_t, 10), ('global_size', c.Array[uint32_t, Literal[3]], 12), ('num_cbufs', uint32_t, 24), ('cbufs', c.Array[struct_nak_qmd_cbuf, Literal[8]], 32)]) +@dll.bind(uint32_t, c.POINTER[struct_nv_device_info]) +def nak_qmd_size_B(dev:c.POINTER[struct_nv_device_info]) -> uint32_t: ... +@dll.bind(None, c.POINTER[struct_nv_device_info], c.POINTER[struct_nak_shader_info], c.POINTER[struct_nak_qmd_info], ctypes.c_void_p, size_t) +def nak_fill_qmd(dev:c.POINTER[struct_nv_device_info], info:c.POINTER[struct_nak_shader_info], qmd_info:c.POINTER[struct_nak_qmd_info], qmd_out:ctypes.c_void_p, qmd_size:size_t) -> None: ... +@c.record +class struct_nak_qmd_dispatch_size_layout(c.Struct): + SIZE = 12 + x_start: int + x_end: int + y_start: int + y_end: int + z_start: int + z_end: int +struct_nak_qmd_dispatch_size_layout.register_fields([('x_start', uint16_t, 0), ('x_end', uint16_t, 2), ('y_start', uint16_t, 4), ('y_end', uint16_t, 6), ('z_start', uint16_t, 8), ('z_end', uint16_t, 10)]) +@dll.bind(struct_nak_qmd_dispatch_size_layout, c.POINTER[struct_nv_device_info]) +def nak_get_qmd_dispatch_size_layout(dev:c.POINTER[struct_nv_device_info]) -> struct_nak_qmd_dispatch_size_layout: ... +@c.record +class struct_nak_qmd_cbuf_desc_layout(c.Struct): + SIZE = 10 + addr_shift: int + addr_lo_start: int + addr_lo_end: int + addr_hi_start: int + addr_hi_end: int +struct_nak_qmd_cbuf_desc_layout.register_fields([('addr_shift', uint16_t, 0), ('addr_lo_start', uint16_t, 2), ('addr_lo_end', uint16_t, 4), ('addr_hi_start', uint16_t, 6), ('addr_hi_end', uint16_t, 8)]) +@dll.bind(struct_nak_qmd_cbuf_desc_layout, c.POINTER[struct_nv_device_info], uint8_t) +def nak_get_qmd_cbuf_desc_layout(dev:c.POINTER[struct_nv_device_info], idx:uint8_t) -> struct_nak_qmd_cbuf_desc_layout: ... +@c.record +class struct_lp_context_ref(c.Struct): + SIZE = 16 + ref: c.POINTER[struct_LLVMOpaqueContext] + owned: bool +class struct_LLVMOpaqueContext(c.Struct): pass +LLVMContextRef: TypeAlias = c.POINTER[struct_LLVMOpaqueContext] +struct_lp_context_ref.register_fields([('ref', LLVMContextRef, 0), ('owned', ctypes.c_bool, 8)]) +lp_context_ref: TypeAlias = struct_lp_context_ref +class struct_lp_passmgr(c.Struct): pass +class struct_LLVMOpaqueModule(c.Struct): pass +LLVMModuleRef: TypeAlias = c.POINTER[struct_LLVMOpaqueModule] +@dll.bind(ctypes.c_bool, LLVMModuleRef, c.POINTER[c.POINTER[struct_lp_passmgr]]) +def lp_passmgr_create(module:LLVMModuleRef, mgr:c.POINTER[c.POINTER[struct_lp_passmgr]]) -> bool: ... +class struct_LLVMOpaqueTargetMachine(c.Struct): pass +LLVMTargetMachineRef: TypeAlias = c.POINTER[struct_LLVMOpaqueTargetMachine] +@dll.bind(None, c.POINTER[struct_lp_passmgr], LLVMModuleRef, LLVMTargetMachineRef, c.POINTER[ctypes.c_char]) +def lp_passmgr_run(mgr:c.POINTER[struct_lp_passmgr], module:LLVMModuleRef, tm:LLVMTargetMachineRef, module_name:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_passmgr]) +def lp_passmgr_dispose(mgr:c.POINTER[struct_lp_passmgr]) -> None: ... +@c.record +class struct_lp_cached_code(c.Struct): + SIZE = 32 + data: ctypes.c_void_p + data_size: int + dont_cache: bool + jit_obj_cache: ctypes.c_void_p +struct_lp_cached_code.register_fields([('data', ctypes.c_void_p, 0), ('data_size', size_t, 8), ('dont_cache', ctypes.c_bool, 16), ('jit_obj_cache', ctypes.c_void_p, 24)]) +class struct_lp_generated_code(c.Struct): pass +class struct_LLVMOpaqueTargetLibraryInfotData(c.Struct): pass +LLVMTargetLibraryInfoRef: TypeAlias = c.POINTER[struct_LLVMOpaqueTargetLibraryInfotData] +@dll.bind(LLVMTargetLibraryInfoRef, c.POINTER[ctypes.c_char]) +def gallivm_create_target_library_info(triple:c.POINTER[ctypes.c_char]) -> LLVMTargetLibraryInfoRef: ... +@dll.bind(None, LLVMTargetLibraryInfoRef) +def gallivm_dispose_target_library_info(library_info:LLVMTargetLibraryInfoRef) -> None: ... +@dll.bind(None) +def lp_set_target_options() -> None: ... +@dll.bind(None) +def lp_bld_init_native_targets() -> None: ... +class struct_LLVMOpaqueExecutionEngine(c.Struct): pass +LLVMExecutionEngineRef: TypeAlias = c.POINTER[struct_LLVMOpaqueExecutionEngine] +class struct_LLVMOpaqueMCJITMemoryManager(c.Struct): pass +LLVMMCJITMemoryManagerRef: TypeAlias = c.POINTER[struct_LLVMOpaqueMCJITMemoryManager] +@dll.bind(ctypes.c_int32, c.POINTER[LLVMExecutionEngineRef], c.POINTER[c.POINTER[struct_lp_generated_code]], c.POINTER[struct_lp_cached_code], LLVMModuleRef, LLVMMCJITMemoryManagerRef, ctypes.c_uint32, c.POINTER[c.POINTER[ctypes.c_char]]) +def lp_build_create_jit_compiler_for_module(OutJIT:c.POINTER[LLVMExecutionEngineRef], OutCode:c.POINTER[c.POINTER[struct_lp_generated_code]], cache_out:c.POINTER[struct_lp_cached_code], M:LLVMModuleRef, MM:LLVMMCJITMemoryManagerRef, OptLevel:int, OutError:c.POINTER[c.POINTER[ctypes.c_char]]) -> int: ... +@dll.bind(None, c.POINTER[struct_lp_generated_code]) +def lp_free_generated_code(code:c.POINTER[struct_lp_generated_code]) -> None: ... +@dll.bind(LLVMMCJITMemoryManagerRef) +def lp_get_default_memory_manager() -> LLVMMCJITMemoryManagerRef: ... +@dll.bind(None, LLVMMCJITMemoryManagerRef) +def lp_free_memory_manager(memorymgr:LLVMMCJITMemoryManagerRef) -> None: ... +class struct_LLVMOpaqueValue(c.Struct): pass +LLVMValueRef: TypeAlias = c.POINTER[struct_LLVMOpaqueValue] +@dll.bind(LLVMValueRef, LLVMValueRef) +def lp_get_called_value(call:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(ctypes.c_bool, LLVMValueRef) +def lp_is_function(v:LLVMValueRef) -> bool: ... +@dll.bind(None, ctypes.c_void_p) +def lp_free_objcache(objcache:ctypes.c_void_p) -> None: ... +@dll.bind(None, LLVMModuleRef, ctypes.c_uint32) +def lp_set_module_stack_alignment_override(M:LLVMModuleRef, align:int) -> None: ... +try: lp_native_vector_width = ctypes.c_uint32.in_dll(dll, 'lp_native_vector_width') # type: ignore +except (ValueError,AttributeError): pass +@c.record +class struct_lp_type(c.Struct): + SIZE = 8 + floating: int + fixed: int + sign: int + norm: int + signed_zero_preserve: int + nan_preserve: int + width: int + length: int +struct_lp_type.register_fields([('floating', ctypes.c_uint32, 0, 1, 0), ('fixed', ctypes.c_uint32, 0, 1, 1), ('sign', ctypes.c_uint32, 0, 1, 2), ('norm', ctypes.c_uint32, 0, 1, 3), ('signed_zero_preserve', ctypes.c_uint32, 0, 1, 4), ('nan_preserve', ctypes.c_uint32, 0, 1, 5), ('width', ctypes.c_uint32, 0, 14, 6), ('length', ctypes.c_uint32, 4, 14, 0)]) +@c.record +class struct_lp_build_context(c.Struct): + SIZE = 72 + gallivm: c.POINTER[struct_gallivm_state] + type: struct_lp_type + elem_type: c.POINTER[struct_LLVMOpaqueType] + vec_type: c.POINTER[struct_LLVMOpaqueType] + int_elem_type: c.POINTER[struct_LLVMOpaqueType] + int_vec_type: c.POINTER[struct_LLVMOpaqueType] + undef: c.POINTER[struct_LLVMOpaqueValue] + zero: c.POINTER[struct_LLVMOpaqueValue] + one: c.POINTER[struct_LLVMOpaqueValue] +@c.record +class struct_gallivm_state(c.Struct): + SIZE = 192 + module_name: c.POINTER[ctypes.c_char] + file_name: c.POINTER[ctypes.c_char] + module: c.POINTER[struct_LLVMOpaqueModule] + target: c.POINTER[struct_LLVMOpaqueTargetData] + engine: c.POINTER[struct_LLVMOpaqueExecutionEngine] + passmgr: c.POINTER[struct_lp_passmgr] + memorymgr: c.POINTER[struct_LLVMOpaqueMCJITMemoryManager] + code: c.POINTER[struct_lp_generated_code] + context: c.POINTER[struct_LLVMOpaqueContext] + builder: c.POINTER[struct_LLVMOpaqueBuilder] + di_builder: c.POINTER[struct_LLVMOpaqueDIBuilder] + cache: c.POINTER[struct_lp_cached_code] + compiled: int + coro_malloc_hook: c.POINTER[struct_LLVMOpaqueValue] + coro_free_hook: c.POINTER[struct_LLVMOpaqueValue] + debug_printf_hook: c.POINTER[struct_LLVMOpaqueValue] + coro_malloc_hook_type: c.POINTER[struct_LLVMOpaqueType] + coro_free_hook_type: c.POINTER[struct_LLVMOpaqueType] + di_function: c.POINTER[struct_LLVMOpaqueMetadata] + file: c.POINTER[struct_LLVMOpaqueMetadata] + get_time_hook: c.POINTER[struct_LLVMOpaqueValue] + texture_descriptor: c.POINTER[struct_LLVMOpaqueValue] + texture_dynamic_state: c.POINTER[struct_lp_jit_texture] + sampler_descriptor: c.POINTER[struct_LLVMOpaqueValue] +class struct_LLVMOpaqueType(c.Struct): pass +LLVMTypeRef: TypeAlias = c.POINTER[struct_LLVMOpaqueType] +struct_lp_build_context.register_fields([('gallivm', c.POINTER[struct_gallivm_state], 0), ('type', struct_lp_type, 8), ('elem_type', LLVMTypeRef, 16), ('vec_type', LLVMTypeRef, 24), ('int_elem_type', LLVMTypeRef, 32), ('int_vec_type', LLVMTypeRef, 40), ('undef', LLVMValueRef, 48), ('zero', LLVMValueRef, 56), ('one', LLVMValueRef, 64)]) +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_elem_type(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_vec_type(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> LLVMTypeRef: ... +@dll.bind(ctypes.c_bool, struct_lp_type, LLVMTypeRef) +def lp_check_elem_type(type:struct_lp_type, elem_type:LLVMTypeRef) -> bool: ... +@dll.bind(ctypes.c_bool, struct_lp_type, LLVMTypeRef) +def lp_check_vec_type(type:struct_lp_type, vec_type:LLVMTypeRef) -> bool: ... +@dll.bind(ctypes.c_bool, struct_lp_type, LLVMValueRef) +def lp_check_value(type:struct_lp_type, val:LLVMValueRef) -> bool: ... +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_int_elem_type(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_int_vec_type(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> LLVMTypeRef: ... +@dll.bind(struct_lp_type, struct_lp_type) +def lp_elem_type(type:struct_lp_type) -> struct_lp_type: ... +@dll.bind(struct_lp_type, struct_lp_type) +def lp_uint_type(type:struct_lp_type) -> struct_lp_type: ... +@dll.bind(struct_lp_type, struct_lp_type) +def lp_int_type(type:struct_lp_type) -> struct_lp_type: ... +@dll.bind(struct_lp_type, struct_lp_type) +def lp_wider_type(type:struct_lp_type) -> struct_lp_type: ... +@dll.bind(ctypes.c_uint32, LLVMTypeRef) +def lp_sizeof_llvm_type(t:LLVMTypeRef) -> int: ... +LLVMTypeKind: dict[int, str] = {(LLVMVoidTypeKind:=0): 'LLVMVoidTypeKind', (LLVMHalfTypeKind:=1): 'LLVMHalfTypeKind', (LLVMFloatTypeKind:=2): 'LLVMFloatTypeKind', (LLVMDoubleTypeKind:=3): 'LLVMDoubleTypeKind', (LLVMX86_FP80TypeKind:=4): 'LLVMX86_FP80TypeKind', (LLVMFP128TypeKind:=5): 'LLVMFP128TypeKind', (LLVMPPC_FP128TypeKind:=6): 'LLVMPPC_FP128TypeKind', (LLVMLabelTypeKind:=7): 'LLVMLabelTypeKind', (LLVMIntegerTypeKind:=8): 'LLVMIntegerTypeKind', (LLVMFunctionTypeKind:=9): 'LLVMFunctionTypeKind', (LLVMStructTypeKind:=10): 'LLVMStructTypeKind', (LLVMArrayTypeKind:=11): 'LLVMArrayTypeKind', (LLVMPointerTypeKind:=12): 'LLVMPointerTypeKind', (LLVMVectorTypeKind:=13): 'LLVMVectorTypeKind', (LLVMMetadataTypeKind:=14): 'LLVMMetadataTypeKind', (LLVMTokenTypeKind:=16): 'LLVMTokenTypeKind', (LLVMScalableVectorTypeKind:=17): 'LLVMScalableVectorTypeKind', (LLVMBFloatTypeKind:=18): 'LLVMBFloatTypeKind', (LLVMX86_AMXTypeKind:=19): 'LLVMX86_AMXTypeKind', (LLVMTargetExtTypeKind:=20): 'LLVMTargetExtTypeKind'} +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32) +def lp_typekind_name(t:ctypes.c_uint32) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, LLVMTypeRef) +def lp_dump_llvmtype(t:LLVMTypeRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_context], c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_context_init(bld:c.POINTER[struct_lp_build_context], gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> None: ... +@dll.bind(ctypes.c_uint32, LLVMModuleRef) +def lp_build_count_ir_module(module:LLVMModuleRef) -> int: ... +@c.record +class struct_lp_jit_texture(c.Struct): + SIZE = 216 + base: ctypes.c_void_p + width: int + height: int + depth: int + row_stride: c.Array[ctypes.c_uint32, Literal[16]] + img_stride: c.Array[ctypes.c_uint32, Literal[16]] + residency: ctypes.c_void_p + first_level: int + last_level: int + mip_offsets: c.Array[ctypes.c_uint32, Literal[16]] + sampler_index: int +class struct_LLVMOpaqueTargetData(c.Struct): pass +LLVMTargetDataRef: TypeAlias = c.POINTER[struct_LLVMOpaqueTargetData] +class struct_LLVMOpaqueBuilder(c.Struct): pass +LLVMBuilderRef: TypeAlias = c.POINTER[struct_LLVMOpaqueBuilder] +class struct_LLVMOpaqueDIBuilder(c.Struct): pass +LLVMDIBuilderRef: TypeAlias = c.POINTER[struct_LLVMOpaqueDIBuilder] +class struct_LLVMOpaqueMetadata(c.Struct): pass +LLVMMetadataRef: TypeAlias = c.POINTER[struct_LLVMOpaqueMetadata] +struct_gallivm_state.register_fields([('module_name', c.POINTER[ctypes.c_char], 0), ('file_name', c.POINTER[ctypes.c_char], 8), ('module', LLVMModuleRef, 16), ('target', LLVMTargetDataRef, 24), ('engine', LLVMExecutionEngineRef, 32), ('passmgr', c.POINTER[struct_lp_passmgr], 40), ('memorymgr', LLVMMCJITMemoryManagerRef, 48), ('code', c.POINTER[struct_lp_generated_code], 56), ('context', LLVMContextRef, 64), ('builder', LLVMBuilderRef, 72), ('di_builder', LLVMDIBuilderRef, 80), ('cache', c.POINTER[struct_lp_cached_code], 88), ('compiled', ctypes.c_uint32, 96), ('coro_malloc_hook', LLVMValueRef, 104), ('coro_free_hook', LLVMValueRef, 112), ('debug_printf_hook', LLVMValueRef, 120), ('coro_malloc_hook_type', LLVMTypeRef, 128), ('coro_free_hook_type', LLVMTypeRef, 136), ('di_function', LLVMMetadataRef, 144), ('file', LLVMMetadataRef, 152), ('get_time_hook', LLVMValueRef, 160), ('texture_descriptor', LLVMValueRef, 168), ('texture_dynamic_state', c.POINTER[struct_lp_jit_texture], 176), ('sampler_descriptor', LLVMValueRef, 184)]) +@dll.bind(ctypes.c_uint32) +def lp_build_init_native_width() -> int: ... +@dll.bind(ctypes.c_bool) +def lp_build_init() -> bool: ... +@dll.bind(c.POINTER[struct_gallivm_state], c.POINTER[ctypes.c_char], c.POINTER[lp_context_ref], c.POINTER[struct_lp_cached_code]) +def gallivm_create(name:c.POINTER[ctypes.c_char], context:c.POINTER[lp_context_ref], cache:c.POINTER[struct_lp_cached_code]) -> c.POINTER[struct_gallivm_state]: ... +@dll.bind(None, c.POINTER[struct_gallivm_state]) +def gallivm_destroy(gallivm:c.POINTER[struct_gallivm_state]) -> None: ... +@dll.bind(None, c.POINTER[struct_gallivm_state]) +def gallivm_free_ir(gallivm:c.POINTER[struct_gallivm_state]) -> None: ... +@dll.bind(None, c.POINTER[struct_gallivm_state], LLVMValueRef) +def gallivm_verify_function(gallivm:c.POINTER[struct_gallivm_state], func:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_gallivm_state], LLVMValueRef, ctypes.c_void_p) +def gallivm_add_global_mapping(gallivm:c.POINTER[struct_gallivm_state], sym:LLVMValueRef, addr:ctypes.c_void_p) -> None: ... +@dll.bind(None, c.POINTER[struct_gallivm_state]) +def gallivm_compile_module(gallivm:c.POINTER[struct_gallivm_state]) -> None: ... +func_pointer: TypeAlias = c.CFUNCTYPE[None, []] +@dll.bind(func_pointer, c.POINTER[struct_gallivm_state], LLVMValueRef, c.POINTER[ctypes.c_char]) +def gallivm_jit_function(gallivm:c.POINTER[struct_gallivm_state], func:LLVMValueRef, func_name:c.POINTER[ctypes.c_char]) -> func_pointer: ... +@dll.bind(None, c.POINTER[struct_gallivm_state], LLVMValueRef) +def gallivm_stub_func(gallivm:c.POINTER[struct_gallivm_state], func:LLVMValueRef) -> None: ... +@dll.bind(ctypes.c_uint32) +def gallivm_get_perf_flags() -> int: ... +@dll.bind(None, c.POINTER[struct_gallivm_state]) +def lp_init_clock_hook(gallivm:c.POINTER[struct_gallivm_state]) -> None: ... +@dll.bind(None) +def lp_init_env_options() -> None: ... +@c.record +class struct_lp_build_tgsi_params(c.Struct): + SIZE = 248 + type: struct_lp_type + mask: c.POINTER[struct_lp_build_mask_context] + consts_ptr: c.POINTER[struct_LLVMOpaqueValue] + const_sizes_ptr: c.POINTER[struct_LLVMOpaqueValue] + system_values: c.POINTER[struct_lp_bld_tgsi_system_values] + inputs: c.POINTER[c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[4]]] + num_inputs: int + context_type: c.POINTER[struct_LLVMOpaqueType] + context_ptr: c.POINTER[struct_LLVMOpaqueValue] + resources_type: c.POINTER[struct_LLVMOpaqueType] + resources_ptr: c.POINTER[struct_LLVMOpaqueValue] + thread_data_type: c.POINTER[struct_LLVMOpaqueType] + thread_data_ptr: c.POINTER[struct_LLVMOpaqueValue] + sampler: c.POINTER[struct_lp_build_sampler_soa] + info: c.POINTER[struct_tgsi_shader_info] + gs_iface: c.POINTER[struct_lp_build_gs_iface] + tcs_iface: c.POINTER[struct_lp_build_tcs_iface] + tes_iface: c.POINTER[struct_lp_build_tes_iface] + mesh_iface: c.POINTER[struct_lp_build_mesh_iface] + ssbo_ptr: c.POINTER[struct_LLVMOpaqueValue] + ssbo_sizes_ptr: c.POINTER[struct_LLVMOpaqueValue] + image: c.POINTER[struct_lp_build_image_soa] + shared_ptr: c.POINTER[struct_LLVMOpaqueValue] + payload_ptr: c.POINTER[struct_LLVMOpaqueValue] + coro: c.POINTER[struct_lp_build_coro_suspend_info] + fs_iface: c.POINTER[struct_lp_build_fs_iface] + gs_vertex_streams: int + current_func: c.POINTER[struct_LLVMOpaqueValue] + fns: c.POINTER[struct_hash_table] + scratch_ptr: c.POINTER[struct_LLVMOpaqueValue] + call_context_ptr: c.POINTER[struct_LLVMOpaqueValue] +@c.record +class struct_lp_build_mask_context(c.Struct): + SIZE = 40 + skip: struct_lp_build_skip_context + reg_type: c.POINTER[struct_LLVMOpaqueType] + var_type: c.POINTER[struct_LLVMOpaqueType] + var: c.POINTER[struct_LLVMOpaqueValue] +@c.record +class struct_lp_build_skip_context(c.Struct): + SIZE = 16 + gallivm: c.POINTER[struct_gallivm_state] + block: c.POINTER[struct_LLVMOpaqueBasicBlock] +class struct_LLVMOpaqueBasicBlock(c.Struct): pass +LLVMBasicBlockRef: TypeAlias = c.POINTER[struct_LLVMOpaqueBasicBlock] +struct_lp_build_skip_context.register_fields([('gallivm', c.POINTER[struct_gallivm_state], 0), ('block', LLVMBasicBlockRef, 8)]) +struct_lp_build_mask_context.register_fields([('skip', struct_lp_build_skip_context, 0), ('reg_type', LLVMTypeRef, 16), ('var_type', LLVMTypeRef, 24), ('var', LLVMValueRef, 32)]) +@c.record +class struct_lp_bld_tgsi_system_values(c.Struct): + SIZE = 272 + instance_id: c.POINTER[struct_LLVMOpaqueValue] + base_instance: c.POINTER[struct_LLVMOpaqueValue] + vertex_id: c.POINTER[struct_LLVMOpaqueValue] + vertex_id_nobase: c.POINTER[struct_LLVMOpaqueValue] + prim_id: c.POINTER[struct_LLVMOpaqueValue] + basevertex: c.POINTER[struct_LLVMOpaqueValue] + firstvertex: c.POINTER[struct_LLVMOpaqueValue] + invocation_id: c.POINTER[struct_LLVMOpaqueValue] + draw_id: c.POINTER[struct_LLVMOpaqueValue] + thread_id: c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[3]] + block_id: c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[3]] + grid_size: c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[3]] + front_facing: c.POINTER[struct_LLVMOpaqueValue] + work_dim: c.POINTER[struct_LLVMOpaqueValue] + block_size: c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[3]] + tess_coord: c.POINTER[struct_LLVMOpaqueValue] + tess_outer: c.POINTER[struct_LLVMOpaqueValue] + tess_inner: c.POINTER[struct_LLVMOpaqueValue] + vertices_in: c.POINTER[struct_LLVMOpaqueValue] + sample_id: c.POINTER[struct_LLVMOpaqueValue] + sample_pos_type: c.POINTER[struct_LLVMOpaqueType] + sample_pos: c.POINTER[struct_LLVMOpaqueValue] + sample_mask_in: c.POINTER[struct_LLVMOpaqueValue] + view_index: c.POINTER[struct_LLVMOpaqueValue] + subgroup_id: c.POINTER[struct_LLVMOpaqueValue] + num_subgroups: c.POINTER[struct_LLVMOpaqueValue] +struct_lp_bld_tgsi_system_values.register_fields([('instance_id', LLVMValueRef, 0), ('base_instance', LLVMValueRef, 8), ('vertex_id', LLVMValueRef, 16), ('vertex_id_nobase', LLVMValueRef, 24), ('prim_id', LLVMValueRef, 32), ('basevertex', LLVMValueRef, 40), ('firstvertex', LLVMValueRef, 48), ('invocation_id', LLVMValueRef, 56), ('draw_id', LLVMValueRef, 64), ('thread_id', c.Array[LLVMValueRef, Literal[3]], 72), ('block_id', c.Array[LLVMValueRef, Literal[3]], 96), ('grid_size', c.Array[LLVMValueRef, Literal[3]], 120), ('front_facing', LLVMValueRef, 144), ('work_dim', LLVMValueRef, 152), ('block_size', c.Array[LLVMValueRef, Literal[3]], 160), ('tess_coord', LLVMValueRef, 184), ('tess_outer', LLVMValueRef, 192), ('tess_inner', LLVMValueRef, 200), ('vertices_in', LLVMValueRef, 208), ('sample_id', LLVMValueRef, 216), ('sample_pos_type', LLVMTypeRef, 224), ('sample_pos', LLVMValueRef, 232), ('sample_mask_in', LLVMValueRef, 240), ('view_index', LLVMValueRef, 248), ('subgroup_id', LLVMValueRef, 256), ('num_subgroups', LLVMValueRef, 264)]) +@c.record +class struct_lp_build_sampler_soa(c.Struct): + SIZE = 16 + emit_tex_sample: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_sampler_soa], c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_sampler_params]]] + emit_size_query: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_sampler_soa], c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_sampler_size_query_params]]] +@c.record +class struct_lp_sampler_params(c.Struct): + SIZE = 152 + type: struct_lp_type + texture_index: int + sampler_index: int + texture_index_offset: c.POINTER[struct_LLVMOpaqueValue] + sample_key: int + resources_type: c.POINTER[struct_LLVMOpaqueType] + resources_ptr: c.POINTER[struct_LLVMOpaqueValue] + thread_data_type: c.POINTER[struct_LLVMOpaqueType] + thread_data_ptr: c.POINTER[struct_LLVMOpaqueValue] + coords: c.POINTER[c.POINTER[struct_LLVMOpaqueValue]] + offsets: c.POINTER[c.POINTER[struct_LLVMOpaqueValue]] + ms_index: c.POINTER[struct_LLVMOpaqueValue] + lod: c.POINTER[struct_LLVMOpaqueValue] + min_lod: c.POINTER[struct_LLVMOpaqueValue] + derivs: c.POINTER[struct_lp_derivatives] + texel: c.POINTER[c.POINTER[struct_LLVMOpaqueValue]] + texture_resource: c.POINTER[struct_LLVMOpaqueValue] + sampler_resource: c.POINTER[struct_LLVMOpaqueValue] + exec_mask: c.POINTER[struct_LLVMOpaqueValue] + exec_mask_nz: bool +@c.record +class struct_lp_derivatives(c.Struct): + SIZE = 48 + ddx: c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[3]] + ddy: c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[3]] +struct_lp_derivatives.register_fields([('ddx', c.Array[LLVMValueRef, Literal[3]], 0), ('ddy', c.Array[LLVMValueRef, Literal[3]], 24)]) +struct_lp_sampler_params.register_fields([('type', struct_lp_type, 0), ('texture_index', ctypes.c_uint32, 8), ('sampler_index', ctypes.c_uint32, 12), ('texture_index_offset', LLVMValueRef, 16), ('sample_key', ctypes.c_uint32, 24), ('resources_type', LLVMTypeRef, 32), ('resources_ptr', LLVMValueRef, 40), ('thread_data_type', LLVMTypeRef, 48), ('thread_data_ptr', LLVMValueRef, 56), ('coords', c.POINTER[LLVMValueRef], 64), ('offsets', c.POINTER[LLVMValueRef], 72), ('ms_index', LLVMValueRef, 80), ('lod', LLVMValueRef, 88), ('min_lod', LLVMValueRef, 96), ('derivs', c.POINTER[struct_lp_derivatives], 104), ('texel', c.POINTER[LLVMValueRef], 112), ('texture_resource', LLVMValueRef, 120), ('sampler_resource', LLVMValueRef, 128), ('exec_mask', LLVMValueRef, 136), ('exec_mask_nz', ctypes.c_bool, 144)]) +@c.record +class struct_lp_sampler_size_query_params(c.Struct): + SIZE = 96 + int_type: struct_lp_type + texture_unit: int + texture_unit_offset: c.POINTER[struct_LLVMOpaqueValue] + target: int + resources_type: c.POINTER[struct_LLVMOpaqueType] + resources_ptr: c.POINTER[struct_LLVMOpaqueValue] + is_sviewinfo: bool + samples_only: bool + ms: bool + lod_property: int + explicit_lod: c.POINTER[struct_LLVMOpaqueValue] + sizes_out: c.POINTER[c.POINTER[struct_LLVMOpaqueValue]] + resource: c.POINTER[struct_LLVMOpaqueValue] + exec_mask: c.POINTER[struct_LLVMOpaqueValue] + exec_mask_nz: bool + format: int +enum_lp_sampler_lod_property: dict[int, str] = {(LP_SAMPLER_LOD_SCALAR:=0): 'LP_SAMPLER_LOD_SCALAR', (LP_SAMPLER_LOD_PER_ELEMENT:=1): 'LP_SAMPLER_LOD_PER_ELEMENT', (LP_SAMPLER_LOD_PER_QUAD:=2): 'LP_SAMPLER_LOD_PER_QUAD'} +struct_lp_sampler_size_query_params.register_fields([('int_type', struct_lp_type, 0), ('texture_unit', ctypes.c_uint32, 8), ('texture_unit_offset', LLVMValueRef, 16), ('target', ctypes.c_uint32, 24), ('resources_type', LLVMTypeRef, 32), ('resources_ptr', LLVMValueRef, 40), ('is_sviewinfo', ctypes.c_bool, 48), ('samples_only', ctypes.c_bool, 49), ('ms', ctypes.c_bool, 50), ('lod_property', ctypes.c_uint32, 52), ('explicit_lod', LLVMValueRef, 56), ('sizes_out', c.POINTER[LLVMValueRef], 64), ('resource', LLVMValueRef, 72), ('exec_mask', LLVMValueRef, 80), ('exec_mask_nz', ctypes.c_bool, 88), ('format', ctypes.c_uint32, 92)]) +struct_lp_build_sampler_soa.register_fields([('emit_tex_sample', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_sampler_soa], c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_sampler_params]]], 0), ('emit_size_query', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_sampler_soa], c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_sampler_size_query_params]]], 8)]) +@c.record +class struct_tgsi_shader_info(c.Struct): + SIZE = 2744 + num_inputs: int + num_outputs: int + input_semantic_name: c.Array[ctypes.c_ubyte, Literal[80]] + input_semantic_index: c.Array[ctypes.c_ubyte, Literal[80]] + input_interpolate: c.Array[ctypes.c_ubyte, Literal[80]] + input_interpolate_loc: c.Array[ctypes.c_ubyte, Literal[80]] + input_usage_mask: c.Array[ctypes.c_ubyte, Literal[80]] + output_semantic_name: c.Array[ctypes.c_ubyte, Literal[80]] + output_semantic_index: c.Array[ctypes.c_ubyte, Literal[80]] + output_usagemask: c.Array[ctypes.c_ubyte, Literal[80]] + output_streams: c.Array[ctypes.c_ubyte, Literal[80]] + num_system_values: int + system_value_semantic_name: c.Array[ctypes.c_ubyte, Literal[80]] + processor: int + file_mask: c.Array[ctypes.c_uint32, Literal[15]] + file_count: c.Array[ctypes.c_uint32, Literal[15]] + file_max: c.Array[ctypes.c_int32, Literal[15]] + const_file_max: c.Array[ctypes.c_int32, Literal[32]] + const_buffers_declared: int + samplers_declared: int + sampler_targets: c.Array[ctypes.c_ubyte, Literal[128]] + sampler_type: c.Array[ctypes.c_ubyte, Literal[128]] + num_stream_output_components: c.Array[ctypes.c_ubyte, Literal[4]] + input_array_first: c.Array[ctypes.c_ubyte, Literal[80]] + output_array_first: c.Array[ctypes.c_ubyte, Literal[80]] + immediate_count: int + num_instructions: int + opcode_count: c.Array[ctypes.c_uint32, Literal[252]] + reads_pervertex_outputs: bool + reads_perpatch_outputs: bool + reads_tessfactor_outputs: bool + reads_z: bool + writes_z: bool + writes_stencil: bool + writes_samplemask: bool + writes_edgeflag: bool + uses_kill: bool + uses_instanceid: bool + uses_vertexid: bool + uses_vertexid_nobase: bool + uses_basevertex: bool + uses_primid: bool + uses_frontface: bool + uses_invocationid: bool + uses_grid_size: bool + writes_position: bool + writes_psize: bool + writes_clipvertex: bool + writes_viewport_index: bool + writes_layer: bool + writes_memory: bool + uses_fbfetch: bool + num_written_culldistance: int + num_written_clipdistance: int + images_declared: int + msaa_images_declared: int + images_buffers: int + shader_buffers_declared: int + shader_buffers_load: int + shader_buffers_store: int + shader_buffers_atomic: int + hw_atomic_declared: int + indirect_files: int + dim_indirect_files: int + properties: c.Array[ctypes.c_uint32, Literal[29]] +struct_tgsi_shader_info.register_fields([('num_inputs', uint8_t, 0), ('num_outputs', uint8_t, 1), ('input_semantic_name', c.Array[uint8_t, Literal[80]], 2), ('input_semantic_index', c.Array[uint8_t, Literal[80]], 82), ('input_interpolate', c.Array[uint8_t, Literal[80]], 162), ('input_interpolate_loc', c.Array[uint8_t, Literal[80]], 242), ('input_usage_mask', c.Array[uint8_t, Literal[80]], 322), ('output_semantic_name', c.Array[uint8_t, Literal[80]], 402), ('output_semantic_index', c.Array[uint8_t, Literal[80]], 482), ('output_usagemask', c.Array[uint8_t, Literal[80]], 562), ('output_streams', c.Array[uint8_t, Literal[80]], 642), ('num_system_values', uint8_t, 722), ('system_value_semantic_name', c.Array[uint8_t, Literal[80]], 723), ('processor', uint8_t, 803), ('file_mask', c.Array[uint32_t, Literal[15]], 804), ('file_count', c.Array[ctypes.c_uint32, Literal[15]], 864), ('file_max', c.Array[ctypes.c_int32, Literal[15]], 924), ('const_file_max', c.Array[ctypes.c_int32, Literal[32]], 984), ('const_buffers_declared', ctypes.c_uint32, 1112), ('samplers_declared', ctypes.c_uint32, 1116), ('sampler_targets', c.Array[uint8_t, Literal[128]], 1120), ('sampler_type', c.Array[uint8_t, Literal[128]], 1248), ('num_stream_output_components', c.Array[uint8_t, Literal[4]], 1376), ('input_array_first', c.Array[uint8_t, Literal[80]], 1380), ('output_array_first', c.Array[uint8_t, Literal[80]], 1460), ('immediate_count', ctypes.c_uint32, 1540), ('num_instructions', ctypes.c_uint32, 1544), ('opcode_count', c.Array[ctypes.c_uint32, Literal[252]], 1548), ('reads_pervertex_outputs', ctypes.c_bool, 2556), ('reads_perpatch_outputs', ctypes.c_bool, 2557), ('reads_tessfactor_outputs', ctypes.c_bool, 2558), ('reads_z', ctypes.c_bool, 2559), ('writes_z', ctypes.c_bool, 2560), ('writes_stencil', ctypes.c_bool, 2561), ('writes_samplemask', ctypes.c_bool, 2562), ('writes_edgeflag', ctypes.c_bool, 2563), ('uses_kill', ctypes.c_bool, 2564), ('uses_instanceid', ctypes.c_bool, 2565), ('uses_vertexid', ctypes.c_bool, 2566), ('uses_vertexid_nobase', ctypes.c_bool, 2567), ('uses_basevertex', ctypes.c_bool, 2568), ('uses_primid', ctypes.c_bool, 2569), ('uses_frontface', ctypes.c_bool, 2570), ('uses_invocationid', ctypes.c_bool, 2571), ('uses_grid_size', ctypes.c_bool, 2572), ('writes_position', ctypes.c_bool, 2573), ('writes_psize', ctypes.c_bool, 2574), ('writes_clipvertex', ctypes.c_bool, 2575), ('writes_viewport_index', ctypes.c_bool, 2576), ('writes_layer', ctypes.c_bool, 2577), ('writes_memory', ctypes.c_bool, 2578), ('uses_fbfetch', ctypes.c_bool, 2579), ('num_written_culldistance', ctypes.c_uint32, 2580), ('num_written_clipdistance', ctypes.c_uint32, 2584), ('images_declared', ctypes.c_uint32, 2588), ('msaa_images_declared', ctypes.c_uint32, 2592), ('images_buffers', ctypes.c_uint32, 2596), ('shader_buffers_declared', ctypes.c_uint32, 2600), ('shader_buffers_load', ctypes.c_uint32, 2604), ('shader_buffers_store', ctypes.c_uint32, 2608), ('shader_buffers_atomic', ctypes.c_uint32, 2612), ('hw_atomic_declared', ctypes.c_uint32, 2616), ('indirect_files', ctypes.c_uint32, 2620), ('dim_indirect_files', ctypes.c_uint32, 2624), ('properties', c.Array[ctypes.c_uint32, Literal[29]], 2628)]) +@c.record +class struct_lp_build_gs_iface(c.Struct): + SIZE = 32 + fetch_input: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_lp_build_gs_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue]]] + emit_vertex: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_gs_iface], c.POINTER[struct_lp_build_context], c.POINTER[c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[4]]], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue]]] + end_primitive: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_gs_iface], c.POINTER[struct_lp_build_context], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32]] + gs_epilogue: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_gs_iface], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32]] +struct_lp_build_gs_iface.register_fields([('fetch_input', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_lp_build_gs_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, LLVMValueRef]], 0), ('emit_vertex', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_gs_iface], c.POINTER[struct_lp_build_context], c.POINTER[c.Array[LLVMValueRef, Literal[4]]], LLVMValueRef, LLVMValueRef, LLVMValueRef]], 8), ('end_primitive', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_gs_iface], c.POINTER[struct_lp_build_context], LLVMValueRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, ctypes.c_uint32]], 16), ('gs_epilogue', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_gs_iface], LLVMValueRef, LLVMValueRef, ctypes.c_uint32]], 24)]) +@c.record +class struct_lp_build_tcs_iface(c.Struct): + SIZE = 48 + emit_prologue: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_context]]] + emit_epilogue: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_context]]] + emit_barrier: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_context]]] + emit_store_output: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_tcs_iface], c.POINTER[struct_lp_build_context], ctypes.c_uint32, ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue]]] + emit_fetch_input: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_lp_build_tcs_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue]]] + emit_fetch_output: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_lp_build_tcs_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32]] +struct_lp_build_tcs_iface.register_fields([('emit_prologue', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_context]]], 0), ('emit_epilogue', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_context]]], 8), ('emit_barrier', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_context]]], 16), ('emit_store_output', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_tcs_iface], c.POINTER[struct_lp_build_context], ctypes.c_uint32, ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, LLVMValueRef, LLVMValueRef]], 24), ('emit_fetch_input', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_lp_build_tcs_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef]], 32), ('emit_fetch_output', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_lp_build_tcs_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, uint32_t]], 40)]) +@c.record +class struct_lp_build_tes_iface(c.Struct): + SIZE = 16 + fetch_vertex_input: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_lp_build_tes_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue]]] + fetch_patch_input: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_lp_build_tes_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue]]] +struct_lp_build_tes_iface.register_fields([('fetch_vertex_input', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_lp_build_tes_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef]], 0), ('fetch_patch_input', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_lp_build_tes_iface], c.POINTER[struct_lp_build_context], ctypes.c_bool, LLVMValueRef, LLVMValueRef]], 8)]) +@c.record +class struct_lp_build_mesh_iface(c.Struct): + SIZE = 16 + emit_store_output: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_mesh_iface], c.POINTER[struct_lp_build_context], ctypes.c_uint32, ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue]]] + emit_vertex_and_primitive_count: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_mesh_iface], c.POINTER[struct_lp_build_context], c.POINTER[struct_LLVMOpaqueValue], c.POINTER[struct_LLVMOpaqueValue]]] +struct_lp_build_mesh_iface.register_fields([('emit_store_output', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_mesh_iface], c.POINTER[struct_lp_build_context], ctypes.c_uint32, ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, ctypes.c_bool, LLVMValueRef, LLVMValueRef, LLVMValueRef]], 0), ('emit_vertex_and_primitive_count', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_mesh_iface], c.POINTER[struct_lp_build_context], LLVMValueRef, LLVMValueRef]], 8)]) +@c.record +class struct_lp_build_image_soa(c.Struct): + SIZE = 16 + emit_op: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_image_soa], c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_img_params]]] + emit_size_query: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_image_soa], c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_sampler_size_query_params]]] +@c.record +class struct_lp_img_params(c.Struct): + SIZE = 192 + type: struct_lp_type + image_index: int + image_index_offset: c.POINTER[struct_LLVMOpaqueValue] + img_op: int + target: int + packed_op: int + op: int + exec_mask: c.POINTER[struct_LLVMOpaqueValue] + exec_mask_nz: bool + resources_type: c.POINTER[struct_LLVMOpaqueType] + resources_ptr: c.POINTER[struct_LLVMOpaqueValue] + thread_data_type: c.POINTER[struct_LLVMOpaqueType] + thread_data_ptr: c.POINTER[struct_LLVMOpaqueValue] + coords: c.POINTER[c.POINTER[struct_LLVMOpaqueValue]] + ms_index: c.POINTER[struct_LLVMOpaqueValue] + indata: c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[4]] + indata2: c.Array[c.POINTER[struct_LLVMOpaqueValue], Literal[4]] + outdata: c.POINTER[c.POINTER[struct_LLVMOpaqueValue]] + resource: c.POINTER[struct_LLVMOpaqueValue] + format: int +LLVMAtomicRMWBinOp: dict[int, str] = {(LLVMAtomicRMWBinOpXchg:=0): 'LLVMAtomicRMWBinOpXchg', (LLVMAtomicRMWBinOpAdd:=1): 'LLVMAtomicRMWBinOpAdd', (LLVMAtomicRMWBinOpSub:=2): 'LLVMAtomicRMWBinOpSub', (LLVMAtomicRMWBinOpAnd:=3): 'LLVMAtomicRMWBinOpAnd', (LLVMAtomicRMWBinOpNand:=4): 'LLVMAtomicRMWBinOpNand', (LLVMAtomicRMWBinOpOr:=5): 'LLVMAtomicRMWBinOpOr', (LLVMAtomicRMWBinOpXor:=6): 'LLVMAtomicRMWBinOpXor', (LLVMAtomicRMWBinOpMax:=7): 'LLVMAtomicRMWBinOpMax', (LLVMAtomicRMWBinOpMin:=8): 'LLVMAtomicRMWBinOpMin', (LLVMAtomicRMWBinOpUMax:=9): 'LLVMAtomicRMWBinOpUMax', (LLVMAtomicRMWBinOpUMin:=10): 'LLVMAtomicRMWBinOpUMin', (LLVMAtomicRMWBinOpFAdd:=11): 'LLVMAtomicRMWBinOpFAdd', (LLVMAtomicRMWBinOpFSub:=12): 'LLVMAtomicRMWBinOpFSub', (LLVMAtomicRMWBinOpFMax:=13): 'LLVMAtomicRMWBinOpFMax', (LLVMAtomicRMWBinOpFMin:=14): 'LLVMAtomicRMWBinOpFMin', (LLVMAtomicRMWBinOpUIncWrap:=15): 'LLVMAtomicRMWBinOpUIncWrap', (LLVMAtomicRMWBinOpUDecWrap:=16): 'LLVMAtomicRMWBinOpUDecWrap', (LLVMAtomicRMWBinOpUSubCond:=17): 'LLVMAtomicRMWBinOpUSubCond', (LLVMAtomicRMWBinOpUSubSat:=18): 'LLVMAtomicRMWBinOpUSubSat'} +struct_lp_img_params.register_fields([('type', struct_lp_type, 0), ('image_index', ctypes.c_uint32, 8), ('image_index_offset', LLVMValueRef, 16), ('img_op', ctypes.c_uint32, 24), ('target', ctypes.c_uint32, 28), ('packed_op', ctypes.c_uint32, 32), ('op', ctypes.c_uint32, 36), ('exec_mask', LLVMValueRef, 40), ('exec_mask_nz', ctypes.c_bool, 48), ('resources_type', LLVMTypeRef, 56), ('resources_ptr', LLVMValueRef, 64), ('thread_data_type', LLVMTypeRef, 72), ('thread_data_ptr', LLVMValueRef, 80), ('coords', c.POINTER[LLVMValueRef], 88), ('ms_index', LLVMValueRef, 96), ('indata', c.Array[LLVMValueRef, Literal[4]], 104), ('indata2', c.Array[LLVMValueRef, Literal[4]], 136), ('outdata', c.POINTER[LLVMValueRef], 168), ('resource', LLVMValueRef, 176), ('format', ctypes.c_uint32, 184)]) +struct_lp_build_image_soa.register_fields([('emit_op', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_image_soa], c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_img_params]]], 0), ('emit_size_query', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_image_soa], c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_sampler_size_query_params]]], 8)]) +class struct_lp_build_coro_suspend_info(c.Struct): pass +@c.record +class struct_lp_build_fs_iface(c.Struct): + SIZE = 16 + interp_fn: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_lp_build_fs_iface], c.POINTER[struct_lp_build_context], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool, ctypes.c_bool, c.POINTER[struct_LLVMOpaqueValue], c.POINTER[c.POINTER[struct_LLVMOpaqueValue]]]] + fb_fetch: c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_fs_iface], c.POINTER[struct_lp_build_context], ctypes.c_int32, c.POINTER[c.POINTER[struct_LLVMOpaqueValue]]]] +struct_lp_build_fs_iface.register_fields([('interp_fn', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_lp_build_fs_iface], c.POINTER[struct_lp_build_context], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool, ctypes.c_bool, LLVMValueRef, c.Array[LLVMValueRef, Literal[2]]]], 0), ('fb_fetch', c.CFUNCTYPE[None, [c.POINTER[struct_lp_build_fs_iface], c.POINTER[struct_lp_build_context], ctypes.c_int32, c.Array[LLVMValueRef, Literal[4]]]], 8)]) +struct_lp_build_tgsi_params.register_fields([('type', struct_lp_type, 0), ('mask', c.POINTER[struct_lp_build_mask_context], 8), ('consts_ptr', LLVMValueRef, 16), ('const_sizes_ptr', LLVMValueRef, 24), ('system_values', c.POINTER[struct_lp_bld_tgsi_system_values], 32), ('inputs', c.POINTER[c.Array[LLVMValueRef, Literal[4]]], 40), ('num_inputs', ctypes.c_int32, 48), ('context_type', LLVMTypeRef, 56), ('context_ptr', LLVMValueRef, 64), ('resources_type', LLVMTypeRef, 72), ('resources_ptr', LLVMValueRef, 80), ('thread_data_type', LLVMTypeRef, 88), ('thread_data_ptr', LLVMValueRef, 96), ('sampler', c.POINTER[struct_lp_build_sampler_soa], 104), ('info', c.POINTER[struct_tgsi_shader_info], 112), ('gs_iface', c.POINTER[struct_lp_build_gs_iface], 120), ('tcs_iface', c.POINTER[struct_lp_build_tcs_iface], 128), ('tes_iface', c.POINTER[struct_lp_build_tes_iface], 136), ('mesh_iface', c.POINTER[struct_lp_build_mesh_iface], 144), ('ssbo_ptr', LLVMValueRef, 152), ('ssbo_sizes_ptr', LLVMValueRef, 160), ('image', c.POINTER[struct_lp_build_image_soa], 168), ('shared_ptr', LLVMValueRef, 176), ('payload_ptr', LLVMValueRef, 184), ('coro', c.POINTER[struct_lp_build_coro_suspend_info], 192), ('fs_iface', c.POINTER[struct_lp_build_fs_iface], 200), ('gs_vertex_streams', ctypes.c_uint32, 208), ('current_func', LLVMValueRef, 216), ('fns', c.POINTER[struct_hash_table], 224), ('scratch_ptr', LLVMValueRef, 232), ('call_context_ptr', LLVMValueRef, 240)]) +@dll.bind(None, c.POINTER[struct_gallivm_state], c.POINTER[struct_nir_shader], c.POINTER[struct_lp_build_tgsi_params], c.POINTER[c.Array[LLVMValueRef, Literal[4]]]) +def lp_build_nir_soa(gallivm:c.POINTER[struct_gallivm_state], shader:c.POINTER[struct_nir_shader], params:c.POINTER[struct_lp_build_tgsi_params], outputs:c.POINTER[c.Array[LLVMValueRef, Literal[4]]]) -> None: ... +@dll.bind(None, c.POINTER[struct_gallivm_state], c.POINTER[struct_nir_shader], c.POINTER[nir_function_impl], c.POINTER[struct_lp_build_tgsi_params], c.POINTER[c.Array[LLVMValueRef, Literal[4]]]) +def lp_build_nir_soa_func(gallivm:c.POINTER[struct_gallivm_state], shader:c.POINTER[struct_nir_shader], impl:c.POINTER[nir_function_impl], params:c.POINTER[struct_lp_build_tgsi_params], outputs:c.POINTER[c.Array[LLVMValueRef, Literal[4]]]) -> None: ... +@c.record +class struct_lp_build_sampler_aos(c.Struct): + SIZE = 8 + emit_fetch_texel: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_lp_build_sampler_aos], c.POINTER[struct_lp_build_context], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue], struct_lp_derivatives, ctypes.c_uint32]] +enum_tgsi_texture_type: dict[int, str] = {(TGSI_TEXTURE_BUFFER:=0): 'TGSI_TEXTURE_BUFFER', (TGSI_TEXTURE_1D:=1): 'TGSI_TEXTURE_1D', (TGSI_TEXTURE_2D:=2): 'TGSI_TEXTURE_2D', (TGSI_TEXTURE_3D:=3): 'TGSI_TEXTURE_3D', (TGSI_TEXTURE_CUBE:=4): 'TGSI_TEXTURE_CUBE', (TGSI_TEXTURE_RECT:=5): 'TGSI_TEXTURE_RECT', (TGSI_TEXTURE_SHADOW1D:=6): 'TGSI_TEXTURE_SHADOW1D', (TGSI_TEXTURE_SHADOW2D:=7): 'TGSI_TEXTURE_SHADOW2D', (TGSI_TEXTURE_SHADOWRECT:=8): 'TGSI_TEXTURE_SHADOWRECT', (TGSI_TEXTURE_1D_ARRAY:=9): 'TGSI_TEXTURE_1D_ARRAY', (TGSI_TEXTURE_2D_ARRAY:=10): 'TGSI_TEXTURE_2D_ARRAY', (TGSI_TEXTURE_SHADOW1D_ARRAY:=11): 'TGSI_TEXTURE_SHADOW1D_ARRAY', (TGSI_TEXTURE_SHADOW2D_ARRAY:=12): 'TGSI_TEXTURE_SHADOW2D_ARRAY', (TGSI_TEXTURE_SHADOWCUBE:=13): 'TGSI_TEXTURE_SHADOWCUBE', (TGSI_TEXTURE_2D_MSAA:=14): 'TGSI_TEXTURE_2D_MSAA', (TGSI_TEXTURE_2D_ARRAY_MSAA:=15): 'TGSI_TEXTURE_2D_ARRAY_MSAA', (TGSI_TEXTURE_CUBE_ARRAY:=16): 'TGSI_TEXTURE_CUBE_ARRAY', (TGSI_TEXTURE_SHADOWCUBE_ARRAY:=17): 'TGSI_TEXTURE_SHADOWCUBE_ARRAY', (TGSI_TEXTURE_UNKNOWN:=18): 'TGSI_TEXTURE_UNKNOWN', (TGSI_TEXTURE_COUNT:=19): 'TGSI_TEXTURE_COUNT'} +enum_lp_build_tex_modifier: dict[int, str] = {(LP_BLD_TEX_MODIFIER_NONE:=0): 'LP_BLD_TEX_MODIFIER_NONE', (LP_BLD_TEX_MODIFIER_PROJECTED:=1): 'LP_BLD_TEX_MODIFIER_PROJECTED', (LP_BLD_TEX_MODIFIER_LOD_BIAS:=2): 'LP_BLD_TEX_MODIFIER_LOD_BIAS', (LP_BLD_TEX_MODIFIER_EXPLICIT_LOD:=3): 'LP_BLD_TEX_MODIFIER_EXPLICIT_LOD', (LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV:=4): 'LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV', (LP_BLD_TEX_MODIFIER_LOD_ZERO:=5): 'LP_BLD_TEX_MODIFIER_LOD_ZERO'} +struct_lp_build_sampler_aos.register_fields([('emit_fetch_texel', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_lp_build_sampler_aos], c.POINTER[struct_lp_build_context], ctypes.c_uint32, ctypes.c_uint32, LLVMValueRef, struct_lp_derivatives, ctypes.c_uint32]], 0)]) +@dll.bind(None, c.POINTER[struct_gallivm_state], c.POINTER[struct_nir_shader], struct_lp_type, c.Array[ctypes.c_ubyte, Literal[4]], LLVMValueRef, c.POINTER[LLVMValueRef], c.POINTER[LLVMValueRef], c.POINTER[struct_lp_build_sampler_aos]) +def lp_build_nir_aos(gallivm:c.POINTER[struct_gallivm_state], shader:c.POINTER[struct_nir_shader], type:struct_lp_type, swizzles:c.Array[ctypes.c_ubyte, Literal[4]], consts_ptr:LLVMValueRef, inputs:c.POINTER[LLVMValueRef], outputs:c.POINTER[LLVMValueRef], sampler:c.POINTER[struct_lp_build_sampler_aos]) -> None: ... +@c.record +class struct_lp_build_fn(c.Struct): + SIZE = 16 + fn_type: c.POINTER[struct_LLVMOpaqueType] + fn: c.POINTER[struct_LLVMOpaqueValue] +struct_lp_build_fn.register_fields([('fn_type', LLVMTypeRef, 0), ('fn', LLVMValueRef, 8)]) +@dll.bind(None, c.POINTER[struct_nir_shader]) +def lp_build_nir_soa_prepasses(nir:c.POINTER[struct_nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[struct_nir_shader]) +def lp_build_opt_nir(nir:c.POINTER[struct_nir_shader]) -> None: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32) +def lp_translate_atomic_op(op:ctypes.c_uint32) -> ctypes.c_uint32: ... +@dll.bind(uint32_t, gl_shader_stage, c.POINTER[nir_tex_instr]) +def lp_build_nir_sample_key(stage:gl_shader_stage, instr:c.POINTER[nir_tex_instr]) -> uint32_t: ... +@dll.bind(None, c.POINTER[struct_lp_img_params], c.POINTER[nir_intrinsic_instr]) +def lp_img_op_from_intrinsic(params:c.POINTER[struct_lp_img_params], instr:c.POINTER[nir_intrinsic_instr]) -> None: ... +@dll.bind(uint32_t, c.POINTER[nir_intrinsic_instr]) +def lp_packed_img_op_from_intrinsic(instr:c.POINTER[nir_intrinsic_instr]) -> uint32_t: ... +enum_lp_nir_call_context_args: dict[int, str] = {(LP_NIR_CALL_CONTEXT_CONTEXT:=0): 'LP_NIR_CALL_CONTEXT_CONTEXT', (LP_NIR_CALL_CONTEXT_RESOURCES:=1): 'LP_NIR_CALL_CONTEXT_RESOURCES', (LP_NIR_CALL_CONTEXT_SHARED:=2): 'LP_NIR_CALL_CONTEXT_SHARED', (LP_NIR_CALL_CONTEXT_SCRATCH:=3): 'LP_NIR_CALL_CONTEXT_SCRATCH', (LP_NIR_CALL_CONTEXT_WORK_DIM:=4): 'LP_NIR_CALL_CONTEXT_WORK_DIM', (LP_NIR_CALL_CONTEXT_THREAD_ID_0:=5): 'LP_NIR_CALL_CONTEXT_THREAD_ID_0', (LP_NIR_CALL_CONTEXT_THREAD_ID_1:=6): 'LP_NIR_CALL_CONTEXT_THREAD_ID_1', (LP_NIR_CALL_CONTEXT_THREAD_ID_2:=7): 'LP_NIR_CALL_CONTEXT_THREAD_ID_2', (LP_NIR_CALL_CONTEXT_BLOCK_ID_0:=8): 'LP_NIR_CALL_CONTEXT_BLOCK_ID_0', (LP_NIR_CALL_CONTEXT_BLOCK_ID_1:=9): 'LP_NIR_CALL_CONTEXT_BLOCK_ID_1', (LP_NIR_CALL_CONTEXT_BLOCK_ID_2:=10): 'LP_NIR_CALL_CONTEXT_BLOCK_ID_2', (LP_NIR_CALL_CONTEXT_GRID_SIZE_0:=11): 'LP_NIR_CALL_CONTEXT_GRID_SIZE_0', (LP_NIR_CALL_CONTEXT_GRID_SIZE_1:=12): 'LP_NIR_CALL_CONTEXT_GRID_SIZE_1', (LP_NIR_CALL_CONTEXT_GRID_SIZE_2:=13): 'LP_NIR_CALL_CONTEXT_GRID_SIZE_2', (LP_NIR_CALL_CONTEXT_BLOCK_SIZE_0:=14): 'LP_NIR_CALL_CONTEXT_BLOCK_SIZE_0', (LP_NIR_CALL_CONTEXT_BLOCK_SIZE_1:=15): 'LP_NIR_CALL_CONTEXT_BLOCK_SIZE_1', (LP_NIR_CALL_CONTEXT_BLOCK_SIZE_2:=16): 'LP_NIR_CALL_CONTEXT_BLOCK_SIZE_2', (LP_NIR_CALL_CONTEXT_MAX_ARGS:=17): 'LP_NIR_CALL_CONTEXT_MAX_ARGS'} +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], ctypes.c_int32, LLVMTypeRef, LLVMTypeRef) +def lp_build_cs_func_call_context(gallivm:c.POINTER[struct_gallivm_state], length:int, context_type:LLVMTypeRef, resources_type:LLVMTypeRef) -> LLVMTypeRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def lp_build_struct_get_ptr2(gallivm:c.POINTER[struct_gallivm_state], ptr_type:LLVMTypeRef, ptr:LLVMValueRef, member:int, name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def lp_build_struct_get2(gallivm:c.POINTER[struct_gallivm_state], ptr_type:LLVMTypeRef, ptr:LLVMValueRef, member:int, name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, LLVMValueRef) +def lp_build_array_get_ptr2(gallivm:c.POINTER[struct_gallivm_state], array_type:LLVMTypeRef, ptr:LLVMValueRef, index:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, LLVMValueRef) +def lp_build_array_get2(gallivm:c.POINTER[struct_gallivm_state], array_type:LLVMTypeRef, ptr:LLVMValueRef, index:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, LLVMValueRef) +def lp_build_pointer_get2(builder:LLVMBuilderRef, ptr_type:LLVMTypeRef, ptr:LLVMValueRef, index:LLVMValueRef) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, LLVMBuilderRef, LLVMTypeRef, LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def lp_build_pointer_get_unaligned2(builder:LLVMBuilderRef, ptr_type:LLVMTypeRef, ptr:LLVMValueRef, index:LLVMValueRef, alignment:int) -> LLVMValueRef: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef) +def lp_build_pointer_set(builder:LLVMBuilderRef, ptr:LLVMValueRef, index:LLVMValueRef, value:LLVMValueRef) -> None: ... +@dll.bind(None, LLVMBuilderRef, LLVMValueRef, LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def lp_build_pointer_set_unaligned(builder:LLVMBuilderRef, ptr:LLVMValueRef, index:LLVMValueRef, value:LLVMValueRef, alignment:int) -> None: ... +@c.record +class struct_lp_sampler_dynamic_state(c.Struct): + SIZE = 144 + width: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + height: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + depth: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + first_level: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + last_level: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + row_stride: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue], c.POINTER[c.POINTER[struct_LLVMOpaqueType]]]] + img_stride: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue], c.POINTER[c.POINTER[struct_LLVMOpaqueType]]]] + base_ptr: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + mip_offsets: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue], c.POINTER[c.POINTER[struct_LLVMOpaqueType]]]] + num_samples: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + sample_stride: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + min_lod: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32]] + max_lod: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32]] + lod_bias: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32]] + border_color: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32]] + cache_ptr: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32]] + residency: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] + base_offset: c.CFUNCTYPE[c.POINTER[struct_LLVMOpaqueValue], [c.POINTER[struct_gallivm_state], c.POINTER[struct_LLVMOpaqueType], c.POINTER[struct_LLVMOpaqueValue], ctypes.c_uint32, c.POINTER[struct_LLVMOpaqueValue]]] +struct_lp_sampler_dynamic_state.register_fields([('width', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 0), ('height', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 8), ('depth', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 16), ('first_level', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 24), ('last_level', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 32), ('row_stride', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef, c.POINTER[LLVMTypeRef]]], 40), ('img_stride', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef, c.POINTER[LLVMTypeRef]]], 48), ('base_ptr', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 56), ('mip_offsets', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef, c.POINTER[LLVMTypeRef]]], 64), ('num_samples', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 72), ('sample_stride', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 80), ('min_lod', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32]], 88), ('max_lod', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32]], 96), ('lod_bias', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32]], 104), ('border_color', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32]], 112), ('cache_ptr', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32]], 120), ('residency', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 128), ('base_offset', c.CFUNCTYPE[LLVMValueRef, [c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, ctypes.c_uint32, LLVMValueRef]], 136)]) +@c.record +class struct_lp_jit_buffer(c.Struct): + SIZE = 16 + u: c.POINTER[ctypes.c_uint32] + f: c.POINTER[ctypes.c_float] + num_elements: int +struct_lp_jit_buffer.register_fields([('u', c.POINTER[uint32_t], 0), ('f', c.POINTER[ctypes.c_float], 0), ('num_elements', uint32_t, 8)]) +_anonenum0: dict[int, str] = {(LP_JIT_BUFFER_BASE:=0): 'LP_JIT_BUFFER_BASE', (LP_JIT_BUFFER_NUM_ELEMENTS:=1): 'LP_JIT_BUFFER_NUM_ELEMENTS', (LP_JIT_BUFFER_NUM_FIELDS:=2): 'LP_JIT_BUFFER_NUM_FIELDS'} +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def lp_llvm_descriptor_base(gallivm:c.POINTER[struct_gallivm_state], buffers_ptr:LLVMValueRef, index:LLVMValueRef, buffers_limit:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def lp_llvm_buffer_base(gallivm:c.POINTER[struct_gallivm_state], buffers_ptr:LLVMValueRef, buffers_offset:LLVMValueRef, buffers_limit:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def lp_llvm_buffer_num_elements(gallivm:c.POINTER[struct_gallivm_state], buffers_ptr:LLVMValueRef, buffers_offset:LLVMValueRef, buffers_limit:int) -> LLVMValueRef: ... +struct_lp_jit_texture.register_fields([('base', ctypes.c_void_p, 0), ('width', uint32_t, 8), ('height', uint16_t, 12), ('depth', uint16_t, 14), ('row_stride', c.Array[uint32_t, Literal[16]], 16), ('img_stride', c.Array[uint32_t, Literal[16]], 80), ('residency', ctypes.c_void_p, 16), ('first_level', uint8_t, 144), ('last_level', uint8_t, 145), ('mip_offsets', c.Array[uint32_t, Literal[16]], 148), ('sampler_index', uint32_t, 212)]) +_anonenum1: dict[int, str] = {(LP_JIT_TEXTURE_BASE:=0): 'LP_JIT_TEXTURE_BASE', (LP_JIT_TEXTURE_WIDTH:=1): 'LP_JIT_TEXTURE_WIDTH', (LP_JIT_TEXTURE_HEIGHT:=2): 'LP_JIT_TEXTURE_HEIGHT', (LP_JIT_TEXTURE_DEPTH:=3): 'LP_JIT_TEXTURE_DEPTH', (LP_JIT_TEXTURE_ROW_STRIDE:=4): 'LP_JIT_TEXTURE_ROW_STRIDE', (LP_JIT_TEXTURE_IMG_STRIDE:=5): 'LP_JIT_TEXTURE_IMG_STRIDE', (LP_JIT_TEXTURE_FIRST_LEVEL:=6): 'LP_JIT_TEXTURE_FIRST_LEVEL', (LP_JIT_TEXTURE_LAST_LEVEL:=7): 'LP_JIT_TEXTURE_LAST_LEVEL', (LP_JIT_TEXTURE_MIP_OFFSETS:=8): 'LP_JIT_TEXTURE_MIP_OFFSETS', (LP_JIT_SAMPLER_INDEX_DUMMY:=9): 'LP_JIT_SAMPLER_INDEX_DUMMY', (LP_JIT_TEXTURE_NUM_FIELDS:=10): 'LP_JIT_TEXTURE_NUM_FIELDS'} +@c.record +class struct_lp_jit_sampler(c.Struct): + SIZE = 28 + min_lod: float + max_lod: float + lod_bias: float + border_color: c.Array[ctypes.c_float, Literal[4]] +struct_lp_jit_sampler.register_fields([('min_lod', ctypes.c_float, 0), ('max_lod', ctypes.c_float, 4), ('lod_bias', ctypes.c_float, 8), ('border_color', c.Array[ctypes.c_float, Literal[4]], 12)]) +_anonenum2: dict[int, str] = {(LP_JIT_SAMPLER_MIN_LOD:=0): 'LP_JIT_SAMPLER_MIN_LOD', (LP_JIT_SAMPLER_MAX_LOD:=1): 'LP_JIT_SAMPLER_MAX_LOD', (LP_JIT_SAMPLER_LOD_BIAS:=2): 'LP_JIT_SAMPLER_LOD_BIAS', (LP_JIT_SAMPLER_BORDER_COLOR:=3): 'LP_JIT_SAMPLER_BORDER_COLOR', (LP_JIT_SAMPLER_NUM_FIELDS:=4): 'LP_JIT_SAMPLER_NUM_FIELDS'} +@c.record +class struct_lp_jit_image(c.Struct): + SIZE = 48 + base: ctypes.c_void_p + width: int + height: int + depth: int + num_samples: int + sample_stride: int + row_stride: int + img_stride: int + residency: ctypes.c_void_p + base_offset: int +struct_lp_jit_image.register_fields([('base', ctypes.c_void_p, 0), ('width', uint32_t, 8), ('height', uint16_t, 12), ('depth', uint16_t, 14), ('num_samples', uint8_t, 16), ('sample_stride', uint32_t, 20), ('row_stride', uint32_t, 24), ('img_stride', uint32_t, 28), ('residency', ctypes.c_void_p, 32), ('base_offset', uint32_t, 40)]) +_anonenum3: dict[int, str] = {(LP_JIT_IMAGE_BASE:=0): 'LP_JIT_IMAGE_BASE', (LP_JIT_IMAGE_WIDTH:=1): 'LP_JIT_IMAGE_WIDTH', (LP_JIT_IMAGE_HEIGHT:=2): 'LP_JIT_IMAGE_HEIGHT', (LP_JIT_IMAGE_DEPTH:=3): 'LP_JIT_IMAGE_DEPTH', (LP_JIT_IMAGE_NUM_SAMPLES:=4): 'LP_JIT_IMAGE_NUM_SAMPLES', (LP_JIT_IMAGE_SAMPLE_STRIDE:=5): 'LP_JIT_IMAGE_SAMPLE_STRIDE', (LP_JIT_IMAGE_ROW_STRIDE:=6): 'LP_JIT_IMAGE_ROW_STRIDE', (LP_JIT_IMAGE_IMG_STRIDE:=7): 'LP_JIT_IMAGE_IMG_STRIDE', (LP_JIT_IMAGE_RESIDENCY:=8): 'LP_JIT_IMAGE_RESIDENCY', (LP_JIT_IMAGE_BASE_OFFSET:=9): 'LP_JIT_IMAGE_BASE_OFFSET', (LP_JIT_IMAGE_NUM_FIELDS:=10): 'LP_JIT_IMAGE_NUM_FIELDS'} +@c.record +class struct_lp_jit_resources(c.Struct): + SIZE = 32384 + constants: c.Array[struct_lp_jit_buffer, Literal[16]] + ssbos: c.Array[struct_lp_jit_buffer, Literal[32]] + textures: c.Array[struct_lp_jit_texture, Literal[128]] + samplers: c.Array[struct_lp_jit_sampler, Literal[32]] + images: c.Array[struct_lp_jit_image, Literal[64]] +struct_lp_jit_resources.register_fields([('constants', c.Array[struct_lp_jit_buffer, Literal[16]], 0), ('ssbos', c.Array[struct_lp_jit_buffer, Literal[32]], 256), ('textures', c.Array[struct_lp_jit_texture, Literal[128]], 768), ('samplers', c.Array[struct_lp_jit_sampler, Literal[32]], 28416), ('images', c.Array[struct_lp_jit_image, Literal[64]], 29312)]) +_anonenum4: dict[int, str] = {(LP_JIT_RES_CONSTANTS:=0): 'LP_JIT_RES_CONSTANTS', (LP_JIT_RES_SSBOS:=1): 'LP_JIT_RES_SSBOS', (LP_JIT_RES_TEXTURES:=2): 'LP_JIT_RES_TEXTURES', (LP_JIT_RES_SAMPLERS:=3): 'LP_JIT_RES_SAMPLERS', (LP_JIT_RES_IMAGES:=4): 'LP_JIT_RES_IMAGES', (LP_JIT_RES_COUNT:=5): 'LP_JIT_RES_COUNT'} +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state]) +def lp_build_jit_resources_type(gallivm:c.POINTER[struct_gallivm_state]) -> LLVMTypeRef: ... +_anonenum5: dict[int, str] = {(LP_JIT_VERTEX_HEADER_VERTEX_ID:=0): 'LP_JIT_VERTEX_HEADER_VERTEX_ID', (LP_JIT_VERTEX_HEADER_CLIP_POS:=1): 'LP_JIT_VERTEX_HEADER_CLIP_POS', (LP_JIT_VERTEX_HEADER_DATA:=2): 'LP_JIT_VERTEX_HEADER_DATA'} +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], ctypes.c_int32) +def lp_build_create_jit_vertex_header_type(gallivm:c.POINTER[struct_gallivm_state], data_elems:int) -> LLVMTypeRef: ... +@dll.bind(None, c.POINTER[struct_lp_sampler_dynamic_state]) +def lp_build_jit_fill_sampler_dynamic_state(state:c.POINTER[struct_lp_sampler_dynamic_state]) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_sampler_dynamic_state]) +def lp_build_jit_fill_image_dynamic_state(state:c.POINTER[struct_lp_sampler_dynamic_state]) -> None: ... +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], uint32_t) +def lp_build_sample_function_type(gallivm:c.POINTER[struct_gallivm_state], sample_key:uint32_t) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_sampler_size_query_params]) +def lp_build_size_function_type(gallivm:c.POINTER[struct_gallivm_state], params:c.POINTER[struct_lp_sampler_size_query_params]) -> LLVMTypeRef: ... +@dll.bind(LLVMTypeRef, c.POINTER[struct_gallivm_state], c.POINTER[struct_lp_img_params], ctypes.c_bool, ctypes.c_bool) +def lp_build_image_function_type(gallivm:c.POINTER[struct_gallivm_state], params:c.POINTER[struct_lp_img_params], ms:bool, is64:bool) -> LLVMTypeRef: ... +@c.record +class struct_lp_texture_handle_state(c.Struct): + SIZE = 232 + static_state: struct_lp_static_texture_state + dynamic_state: struct_lp_jit_texture +@c.record +class struct_lp_static_texture_state(c.Struct): + SIZE = 12 + format: int + res_format: int + swizzle_r: int + swizzle_g: int + swizzle_b: int + swizzle_a: int + target: int + res_target: int + pot_width: int + pot_height: int + pot_depth: int + level_zero_only: int + tiled: int + tiled_samples: int +enum_pipe_texture_target: dict[int, str] = {(PIPE_BUFFER:=0): 'PIPE_BUFFER', (PIPE_TEXTURE_1D:=1): 'PIPE_TEXTURE_1D', (PIPE_TEXTURE_2D:=2): 'PIPE_TEXTURE_2D', (PIPE_TEXTURE_3D:=3): 'PIPE_TEXTURE_3D', (PIPE_TEXTURE_CUBE:=4): 'PIPE_TEXTURE_CUBE', (PIPE_TEXTURE_RECT:=5): 'PIPE_TEXTURE_RECT', (PIPE_TEXTURE_1D_ARRAY:=6): 'PIPE_TEXTURE_1D_ARRAY', (PIPE_TEXTURE_2D_ARRAY:=7): 'PIPE_TEXTURE_2D_ARRAY', (PIPE_TEXTURE_CUBE_ARRAY:=8): 'PIPE_TEXTURE_CUBE_ARRAY', (PIPE_MAX_TEXTURE_TYPES:=9): 'PIPE_MAX_TEXTURE_TYPES'} +struct_lp_static_texture_state.register_fields([('format', ctypes.c_uint32, 0), ('res_format', ctypes.c_uint32, 4), ('swizzle_r', ctypes.c_uint32, 8, 3, 0), ('swizzle_g', ctypes.c_uint32, 8, 3, 3), ('swizzle_b', ctypes.c_uint32, 8, 3, 6), ('swizzle_a', ctypes.c_uint32, 9, 3, 1), ('target', ctypes.c_uint32, 9, 5, 4), ('res_target', ctypes.c_uint32, 10, 5, 1), ('pot_width', ctypes.c_uint32, 10, 1, 6), ('pot_height', ctypes.c_uint32, 10, 1, 7), ('pot_depth', ctypes.c_uint32, 11, 1, 0), ('level_zero_only', ctypes.c_uint32, 11, 1, 1), ('tiled', ctypes.c_uint32, 11, 1, 2), ('tiled_samples', ctypes.c_uint32, 11, 5, 3)]) +struct_lp_texture_handle_state.register_fields([('static_state', struct_lp_static_texture_state, 0), ('dynamic_state', struct_lp_jit_texture, 16)]) +@c.record +class struct_lp_texture_functions(c.Struct): + SIZE = 296 + sample_functions: c.POINTER[c.POINTER[ctypes.c_void_p]] + sampler_count: int + fetch_functions: c.POINTER[ctypes.c_void_p] + size_function: ctypes.c_void_p + samples_function: ctypes.c_void_p + image_functions: c.POINTER[ctypes.c_void_p] + state: struct_lp_texture_handle_state + sampled: bool + storage: bool + matrix: ctypes.c_void_p +struct_lp_texture_functions.register_fields([('sample_functions', c.POINTER[c.POINTER[ctypes.c_void_p]], 0), ('sampler_count', uint32_t, 8), ('fetch_functions', c.POINTER[ctypes.c_void_p], 16), ('size_function', ctypes.c_void_p, 24), ('samples_function', ctypes.c_void_p, 32), ('image_functions', c.POINTER[ctypes.c_void_p], 40), ('state', struct_lp_texture_handle_state, 48), ('sampled', ctypes.c_bool, 280), ('storage', ctypes.c_bool, 281), ('matrix', ctypes.c_void_p, 288)]) +@c.record +class struct_lp_texture_handle(c.Struct): + SIZE = 16 + functions: ctypes.c_void_p + sampler_index: int +struct_lp_texture_handle.register_fields([('functions', ctypes.c_void_p, 0), ('sampler_index', uint32_t, 8)]) +@c.record +class struct_lp_jit_bindless_texture(c.Struct): + SIZE = 24 + base: ctypes.c_void_p + residency: ctypes.c_void_p + sampler_index: int +struct_lp_jit_bindless_texture.register_fields([('base', ctypes.c_void_p, 0), ('residency', ctypes.c_void_p, 8), ('sampler_index', uint32_t, 16)]) +@c.record +class struct_lp_descriptor(c.Struct): + SIZE = 64 + texture: struct_lp_jit_bindless_texture + sampler: struct_lp_jit_sampler + image: struct_lp_jit_image + buffer: struct_lp_jit_buffer + accel_struct: int + functions: ctypes.c_void_p +struct_lp_descriptor.register_fields([('texture', struct_lp_jit_bindless_texture, 0), ('sampler', struct_lp_jit_sampler, 24), ('image', struct_lp_jit_image, 0), ('buffer', struct_lp_jit_buffer, 0), ('accel_struct', uint64_t, 0), ('functions', ctypes.c_void_p, 56)]) +@dll.bind(None, c.POINTER[struct_lp_build_skip_context], c.POINTER[struct_gallivm_state]) +def lp_build_flow_skip_begin(ctx:c.POINTER[struct_lp_build_skip_context], gallivm:c.POINTER[struct_gallivm_state]) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_skip_context], LLVMValueRef) +def lp_build_flow_skip_cond_break(ctx:c.POINTER[struct_lp_build_skip_context], cond:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_skip_context]) +def lp_build_flow_skip_end(ctx:c.POINTER[struct_lp_build_skip_context]) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_mask_context], c.POINTER[struct_gallivm_state], struct_lp_type, LLVMValueRef) +def lp_build_mask_begin(mask:c.POINTER[struct_lp_build_mask_context], gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type, value:LLVMValueRef) -> None: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_lp_build_mask_context]) +def lp_build_mask_value(mask:c.POINTER[struct_lp_build_mask_context]) -> LLVMValueRef: ... +@dll.bind(None, c.POINTER[struct_lp_build_mask_context], LLVMValueRef) +def lp_build_mask_update(mask:c.POINTER[struct_lp_build_mask_context], value:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_mask_context], LLVMValueRef) +def lp_build_mask_force(mask:c.POINTER[struct_lp_build_mask_context], value:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_mask_context]) +def lp_build_mask_check(mask:c.POINTER[struct_lp_build_mask_context]) -> None: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_lp_build_mask_context]) +def lp_build_mask_end(mask:c.POINTER[struct_lp_build_mask_context]) -> LLVMValueRef: ... +@c.record +class struct_lp_build_loop_state(c.Struct): + SIZE = 40 + block: c.POINTER[struct_LLVMOpaqueBasicBlock] + counter_var: c.POINTER[struct_LLVMOpaqueValue] + counter: c.POINTER[struct_LLVMOpaqueValue] + counter_type: c.POINTER[struct_LLVMOpaqueType] + gallivm: c.POINTER[struct_gallivm_state] +struct_lp_build_loop_state.register_fields([('block', LLVMBasicBlockRef, 0), ('counter_var', LLVMValueRef, 8), ('counter', LLVMValueRef, 16), ('counter_type', LLVMTypeRef, 24), ('gallivm', c.POINTER[struct_gallivm_state], 32)]) +@dll.bind(None, c.POINTER[struct_lp_build_loop_state], c.POINTER[struct_gallivm_state], LLVMValueRef) +def lp_build_loop_begin(state:c.POINTER[struct_lp_build_loop_state], gallivm:c.POINTER[struct_gallivm_state], start:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_loop_state], LLVMValueRef, LLVMValueRef) +def lp_build_loop_end(state:c.POINTER[struct_lp_build_loop_state], end:LLVMValueRef, step:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_loop_state], LLVMValueRef) +def lp_build_loop_force_set_counter(state:c.POINTER[struct_lp_build_loop_state], end:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_loop_state]) +def lp_build_loop_force_reload_counter(state:c.POINTER[struct_lp_build_loop_state]) -> None: ... +LLVMIntPredicate: dict[int, str] = {(LLVMIntEQ:=32): 'LLVMIntEQ', (LLVMIntNE:=33): 'LLVMIntNE', (LLVMIntUGT:=34): 'LLVMIntUGT', (LLVMIntUGE:=35): 'LLVMIntUGE', (LLVMIntULT:=36): 'LLVMIntULT', (LLVMIntULE:=37): 'LLVMIntULE', (LLVMIntSGT:=38): 'LLVMIntSGT', (LLVMIntSGE:=39): 'LLVMIntSGE', (LLVMIntSLT:=40): 'LLVMIntSLT', (LLVMIntSLE:=41): 'LLVMIntSLE'} +@dll.bind(None, c.POINTER[struct_lp_build_loop_state], LLVMValueRef, LLVMValueRef, ctypes.c_uint32) +def lp_build_loop_end_cond(state:c.POINTER[struct_lp_build_loop_state], end:LLVMValueRef, step:LLVMValueRef, cond:ctypes.c_uint32) -> None: ... +@c.record +class struct_lp_build_for_loop_state(c.Struct): + SIZE = 80 + begin: c.POINTER[struct_LLVMOpaqueBasicBlock] + body: c.POINTER[struct_LLVMOpaqueBasicBlock] + exit: c.POINTER[struct_LLVMOpaqueBasicBlock] + counter_var: c.POINTER[struct_LLVMOpaqueValue] + counter: c.POINTER[struct_LLVMOpaqueValue] + counter_type: c.POINTER[struct_LLVMOpaqueType] + step: c.POINTER[struct_LLVMOpaqueValue] + cond: int + end: c.POINTER[struct_LLVMOpaqueValue] + gallivm: c.POINTER[struct_gallivm_state] +struct_lp_build_for_loop_state.register_fields([('begin', LLVMBasicBlockRef, 0), ('body', LLVMBasicBlockRef, 8), ('exit', LLVMBasicBlockRef, 16), ('counter_var', LLVMValueRef, 24), ('counter', LLVMValueRef, 32), ('counter_type', LLVMTypeRef, 40), ('step', LLVMValueRef, 48), ('cond', ctypes.c_uint32, 56), ('end', LLVMValueRef, 64), ('gallivm', c.POINTER[struct_gallivm_state], 72)]) +@dll.bind(None, c.POINTER[struct_lp_build_for_loop_state], c.POINTER[struct_gallivm_state], LLVMValueRef, ctypes.c_uint32, LLVMValueRef, LLVMValueRef) +def lp_build_for_loop_begin(state:c.POINTER[struct_lp_build_for_loop_state], gallivm:c.POINTER[struct_gallivm_state], start:LLVMValueRef, llvm_cond:ctypes.c_uint32, end:LLVMValueRef, step:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_for_loop_state]) +def lp_build_for_loop_end(state:c.POINTER[struct_lp_build_for_loop_state]) -> None: ... +@c.record +class struct_lp_build_if_state(c.Struct): + SIZE = 48 + gallivm: c.POINTER[struct_gallivm_state] + condition: c.POINTER[struct_LLVMOpaqueValue] + entry_block: c.POINTER[struct_LLVMOpaqueBasicBlock] + true_block: c.POINTER[struct_LLVMOpaqueBasicBlock] + false_block: c.POINTER[struct_LLVMOpaqueBasicBlock] + merge_block: c.POINTER[struct_LLVMOpaqueBasicBlock] +struct_lp_build_if_state.register_fields([('gallivm', c.POINTER[struct_gallivm_state], 0), ('condition', LLVMValueRef, 8), ('entry_block', LLVMBasicBlockRef, 16), ('true_block', LLVMBasicBlockRef, 24), ('false_block', LLVMBasicBlockRef, 32), ('merge_block', LLVMBasicBlockRef, 40)]) +@dll.bind(None, c.POINTER[struct_lp_build_if_state], c.POINTER[struct_gallivm_state], LLVMValueRef) +def lp_build_if(ctx:c.POINTER[struct_lp_build_if_state], gallivm:c.POINTER[struct_gallivm_state], condition:LLVMValueRef) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_if_state]) +def lp_build_else(ctx:c.POINTER[struct_lp_build_if_state]) -> None: ... +@dll.bind(None, c.POINTER[struct_lp_build_if_state]) +def lp_build_endif(ctx:c.POINTER[struct_lp_build_if_state]) -> None: ... +@dll.bind(LLVMBasicBlockRef, c.POINTER[struct_gallivm_state], c.POINTER[ctypes.c_char]) +def lp_build_insert_new_block(gallivm:c.POINTER[struct_gallivm_state], name:c.POINTER[ctypes.c_char]) -> LLVMBasicBlockRef: ... +@dll.bind(LLVMBuilderRef, c.POINTER[struct_gallivm_state]) +def lp_create_builder_at_entry(gallivm:c.POINTER[struct_gallivm_state]) -> LLVMBuilderRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMTypeRef, c.POINTER[ctypes.c_char]) +def lp_build_alloca(gallivm:c.POINTER[struct_gallivm_state], type:LLVMTypeRef, name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMTypeRef, c.POINTER[ctypes.c_char]) +def lp_build_alloca_undef(gallivm:c.POINTER[struct_gallivm_state], type:LLVMTypeRef, name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], LLVMTypeRef, LLVMValueRef, c.POINTER[ctypes.c_char]) +def lp_build_array_alloca(gallivm:c.POINTER[struct_gallivm_state], type:LLVMTypeRef, count:LLVMValueRef, name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(ctypes.c_uint32, struct_lp_type) +def lp_mantissa(type:struct_lp_type) -> int: ... +@dll.bind(ctypes.c_uint32, struct_lp_type) +def lp_const_shift(type:struct_lp_type) -> int: ... +@dll.bind(ctypes.c_uint32, struct_lp_type) +def lp_const_offset(type:struct_lp_type) -> int: ... +@dll.bind(ctypes.c_double, struct_lp_type) +def lp_const_scale(type:struct_lp_type) -> float: ... +@dll.bind(ctypes.c_double, struct_lp_type) +def lp_const_min(type:struct_lp_type) -> float: ... +@dll.bind(ctypes.c_double, struct_lp_type) +def lp_const_max(type:struct_lp_type) -> float: ... +@dll.bind(ctypes.c_double, struct_lp_type) +def lp_const_eps(type:struct_lp_type) -> float: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_undef(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_zero(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_one(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type, ctypes.c_double) +def lp_build_const_elem(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type, val:float) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type, ctypes.c_double) +def lp_build_const_vec(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type, val:float) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type, ctypes.c_int64) +def lp_build_const_int_vec(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type, val:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type) +def lp_build_const_channel_vec(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type, ctypes.c_double, ctypes.c_double, ctypes.c_double, ctypes.c_double, c.POINTER[ctypes.c_ubyte]) +def lp_build_const_aos(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type, r:float, g:float, b:float, a:float, swizzle:c.POINTER[ctypes.c_ubyte]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type, ctypes.c_uint32, ctypes.c_uint32) +def lp_build_const_mask_aos(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type, mask:int, channels:int) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], struct_lp_type, ctypes.c_uint32, ctypes.c_uint32, c.POINTER[ctypes.c_ubyte]) +def lp_build_const_mask_aos_swizzled(gallivm:c.POINTER[struct_gallivm_state], type:struct_lp_type, mask:int, channels:int, swizzle:c.POINTER[ctypes.c_ubyte]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], c.POINTER[ctypes.c_char]) +def lp_build_const_string(gallivm:c.POINTER[struct_gallivm_state], str:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], ctypes.c_void_p, LLVMTypeRef, c.POINTER[LLVMTypeRef], ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def lp_build_const_func_pointer(gallivm:c.POINTER[struct_gallivm_state], ptr:ctypes.c_void_p, ret_type:LLVMTypeRef, arg_types:c.POINTER[LLVMTypeRef], num_args:int, name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@dll.bind(LLVMValueRef, c.POINTER[struct_gallivm_state], ctypes.c_void_p, LLVMTypeRef, c.POINTER[ctypes.c_char]) +def lp_build_const_func_pointer_from_type(gallivm:c.POINTER[struct_gallivm_state], ptr:ctypes.c_void_p, function_type:LLVMTypeRef, name:c.POINTER[ctypes.c_char]) -> LLVMValueRef: ... +@c.record +class struct_fd_dev_info(c.Struct): + SIZE = 764 + chip: int + tile_align_w: int + tile_align_h: int + gmem_align_w: int + gmem_align_h: int + tile_max_w: int + tile_max_h: int + num_vsc_pipes: int + cs_shared_mem_size: int + wave_granularity: int + highest_bank_bit: int + ubwc_swizzle: int + macrotile_mode: int + fibers_per_sp: int + threadsize_base: int + max_waves: int + compute_lb_size: int + num_sp_cores: int + num_ccu: int + a6xx: struct_fd_dev_info_a6xx + a7xx: struct_fd_dev_info_a7xx +@c.record +class struct_fd_dev_info_a6xx(c.Struct): + SIZE = 656 + reg_size_vec4: int + instr_cache_size: int + has_hw_multiview: bool + has_fs_tex_prefetch: bool + supports_multiview_mask: bool + concurrent_resolve: bool + has_z24uint_s8uint: bool + tess_use_shared: bool + has_legacy_pipeline_shading_rate: bool + storage_16bit: bool + indirect_draw_wfm_quirk: bool + depth_bounds_require_depth_test_quirk: bool + has_tex_filter_cubic: bool + has_separate_chroma_filter: bool + has_sample_locations: bool + has_cp_reg_write: bool + has_8bpp_ubwc: bool + has_lpac: bool + has_getfiberid: bool + mov_half_shared_quirk: bool + has_movs: bool + has_dp2acc: bool + has_dp4acc: bool + enable_lrz_fast_clear: bool + has_lrz_dir_tracking: bool + lrz_track_quirk: bool + has_lrz_feedback: bool + has_per_view_viewport: bool + has_gmem_fast_clear: bool + sysmem_per_ccu_depth_cache_size: int + sysmem_per_ccu_color_cache_size: int + gmem_ccu_color_cache_fraction: int + prim_alloc_threshold: int + vs_max_inputs_count: int + supports_double_threadsize: bool + has_sampler_minmax: bool + broken_ds_ubwc_quirk: bool + has_scalar_alu: bool + has_early_preamble: bool + has_isam_v: bool + has_ssbo_imm_offsets: bool + has_coherent_ubwc_flag_caches: bool + has_attachment_shading_rate: bool + has_ubwc_linear_mipmap_fallback: bool + predtf_nop_quirk: bool + prede_nop_quirk: bool + has_sad: bool + is_a702: bool + magic: struct_fd_dev_info_a6xx_magic + magic_raw: c.Array[struct_fd_dev_info_a6xx_magic_raw, Literal[64]] + max_sets: int + line_width_min: float + line_width_max: float + has_bin_mask: bool +@c.record +class struct_fd_dev_info_a6xx_magic(c.Struct): + SIZE = 56 + PC_POWER_CNTL: int + TPL1_DBG_ECO_CNTL: int + GRAS_DBG_ECO_CNTL: int + SP_CHICKEN_BITS: int + UCHE_CLIENT_PF: int + PC_MODE_CNTL: int + SP_DBG_ECO_CNTL: int + RB_DBG_ECO_CNTL: int + RB_DBG_ECO_CNTL_blit: int + HLSQ_DBG_ECO_CNTL: int + RB_UNKNOWN_8E01: int + VPC_DBG_ECO_CNTL: int + UCHE_UNKNOWN_0E12: int + RB_CCU_DBG_ECO_CNTL: int +struct_fd_dev_info_a6xx_magic.register_fields([('PC_POWER_CNTL', uint32_t, 0), ('TPL1_DBG_ECO_CNTL', uint32_t, 4), ('GRAS_DBG_ECO_CNTL', uint32_t, 8), ('SP_CHICKEN_BITS', uint32_t, 12), ('UCHE_CLIENT_PF', uint32_t, 16), ('PC_MODE_CNTL', uint32_t, 20), ('SP_DBG_ECO_CNTL', uint32_t, 24), ('RB_DBG_ECO_CNTL', uint32_t, 28), ('RB_DBG_ECO_CNTL_blit', uint32_t, 32), ('HLSQ_DBG_ECO_CNTL', uint32_t, 36), ('RB_UNKNOWN_8E01', uint32_t, 40), ('VPC_DBG_ECO_CNTL', uint32_t, 44), ('UCHE_UNKNOWN_0E12', uint32_t, 48), ('RB_CCU_DBG_ECO_CNTL', uint32_t, 52)]) +@c.record +class struct_fd_dev_info_a6xx_magic_raw(c.Struct): + SIZE = 8 + reg: int + value: int +struct_fd_dev_info_a6xx_magic_raw.register_fields([('reg', uint32_t, 0), ('value', uint32_t, 4)]) +struct_fd_dev_info_a6xx.register_fields([('reg_size_vec4', uint32_t, 0), ('instr_cache_size', uint32_t, 4), ('has_hw_multiview', ctypes.c_bool, 8), ('has_fs_tex_prefetch', ctypes.c_bool, 9), ('supports_multiview_mask', ctypes.c_bool, 10), ('concurrent_resolve', ctypes.c_bool, 11), ('has_z24uint_s8uint', ctypes.c_bool, 12), ('tess_use_shared', ctypes.c_bool, 13), ('has_legacy_pipeline_shading_rate', ctypes.c_bool, 14), ('storage_16bit', ctypes.c_bool, 15), ('indirect_draw_wfm_quirk', ctypes.c_bool, 16), ('depth_bounds_require_depth_test_quirk', ctypes.c_bool, 17), ('has_tex_filter_cubic', ctypes.c_bool, 18), ('has_separate_chroma_filter', ctypes.c_bool, 19), ('has_sample_locations', ctypes.c_bool, 20), ('has_cp_reg_write', ctypes.c_bool, 21), ('has_8bpp_ubwc', ctypes.c_bool, 22), ('has_lpac', ctypes.c_bool, 23), ('has_getfiberid', ctypes.c_bool, 24), ('mov_half_shared_quirk', ctypes.c_bool, 25), ('has_movs', ctypes.c_bool, 26), ('has_dp2acc', ctypes.c_bool, 27), ('has_dp4acc', ctypes.c_bool, 28), ('enable_lrz_fast_clear', ctypes.c_bool, 29), ('has_lrz_dir_tracking', ctypes.c_bool, 30), ('lrz_track_quirk', ctypes.c_bool, 31), ('has_lrz_feedback', ctypes.c_bool, 32), ('has_per_view_viewport', ctypes.c_bool, 33), ('has_gmem_fast_clear', ctypes.c_bool, 34), ('sysmem_per_ccu_depth_cache_size', uint32_t, 36), ('sysmem_per_ccu_color_cache_size', uint32_t, 40), ('gmem_ccu_color_cache_fraction', uint32_t, 44), ('prim_alloc_threshold', uint32_t, 48), ('vs_max_inputs_count', uint32_t, 52), ('supports_double_threadsize', ctypes.c_bool, 56), ('has_sampler_minmax', ctypes.c_bool, 57), ('broken_ds_ubwc_quirk', ctypes.c_bool, 58), ('has_scalar_alu', ctypes.c_bool, 59), ('has_early_preamble', ctypes.c_bool, 60), ('has_isam_v', ctypes.c_bool, 61), ('has_ssbo_imm_offsets', ctypes.c_bool, 62), ('has_coherent_ubwc_flag_caches', ctypes.c_bool, 63), ('has_attachment_shading_rate', ctypes.c_bool, 64), ('has_ubwc_linear_mipmap_fallback', ctypes.c_bool, 65), ('predtf_nop_quirk', ctypes.c_bool, 66), ('prede_nop_quirk', ctypes.c_bool, 67), ('has_sad', ctypes.c_bool, 68), ('is_a702', ctypes.c_bool, 69), ('magic', struct_fd_dev_info_a6xx_magic, 72), ('magic_raw', c.Array[struct_fd_dev_info_a6xx_magic_raw, Literal[64]], 128), ('max_sets', uint32_t, 640), ('line_width_min', ctypes.c_float, 644), ('line_width_max', ctypes.c_float, 648), ('has_bin_mask', ctypes.c_bool, 652)]) +@c.record +class struct_fd_dev_info_a7xx(c.Struct): + SIZE = 36 + stsc_duplication_quirk: bool + has_event_write_sample_count: bool + has_64b_ssbo_atomics: bool + cmdbuf_start_a725_quirk: bool + load_inline_uniforms_via_preamble_ldgk: bool + load_shader_consts_via_preamble: bool + has_gmem_vpc_attr_buf: bool + sysmem_vpc_attr_buf_size: int + gmem_vpc_attr_buf_size: int + supports_uav_ubwc: bool + ubwc_unorm_snorm_int_compatible: bool + fs_must_have_non_zero_constlen_quirk: bool + gs_vpc_adjacency_quirk: bool + enable_tp_ubwc_flag_hint: bool + storage_8bit: bool + ubwc_all_formats_compatible: bool + has_compliant_dp4acc: bool + has_generic_clear: bool + r8g8_faulty_fast_clear_quirk: bool + ubwc_coherency_quirk: bool + has_persistent_counter: bool + has_primitive_shading_rate: bool + reading_shading_rate_requires_smask_quirk: bool + has_ray_intersection: bool + has_sw_fuse: bool + has_rt_workaround: bool + has_alias_rt: bool + has_abs_bin_mask: bool + new_control_regs: bool +struct_fd_dev_info_a7xx.register_fields([('stsc_duplication_quirk', ctypes.c_bool, 0), ('has_event_write_sample_count', ctypes.c_bool, 1), ('has_64b_ssbo_atomics', ctypes.c_bool, 2), ('cmdbuf_start_a725_quirk', ctypes.c_bool, 3), ('load_inline_uniforms_via_preamble_ldgk', ctypes.c_bool, 4), ('load_shader_consts_via_preamble', ctypes.c_bool, 5), ('has_gmem_vpc_attr_buf', ctypes.c_bool, 6), ('sysmem_vpc_attr_buf_size', uint32_t, 8), ('gmem_vpc_attr_buf_size', uint32_t, 12), ('supports_uav_ubwc', ctypes.c_bool, 16), ('ubwc_unorm_snorm_int_compatible', ctypes.c_bool, 17), ('fs_must_have_non_zero_constlen_quirk', ctypes.c_bool, 18), ('gs_vpc_adjacency_quirk', ctypes.c_bool, 19), ('enable_tp_ubwc_flag_hint', ctypes.c_bool, 20), ('storage_8bit', ctypes.c_bool, 21), ('ubwc_all_formats_compatible', ctypes.c_bool, 22), ('has_compliant_dp4acc', ctypes.c_bool, 23), ('has_generic_clear', ctypes.c_bool, 24), ('r8g8_faulty_fast_clear_quirk', ctypes.c_bool, 25), ('ubwc_coherency_quirk', ctypes.c_bool, 26), ('has_persistent_counter', ctypes.c_bool, 27), ('has_primitive_shading_rate', ctypes.c_bool, 28), ('reading_shading_rate_requires_smask_quirk', ctypes.c_bool, 29), ('has_ray_intersection', ctypes.c_bool, 30), ('has_sw_fuse', ctypes.c_bool, 31), ('has_rt_workaround', ctypes.c_bool, 32), ('has_alias_rt', ctypes.c_bool, 33), ('has_abs_bin_mask', ctypes.c_bool, 34), ('new_control_regs', ctypes.c_bool, 35)]) +struct_fd_dev_info.register_fields([('chip', uint8_t, 0), ('tile_align_w', uint32_t, 4), ('tile_align_h', uint32_t, 8), ('gmem_align_w', uint32_t, 12), ('gmem_align_h', uint32_t, 16), ('tile_max_w', uint32_t, 20), ('tile_max_h', uint32_t, 24), ('num_vsc_pipes', uint32_t, 28), ('cs_shared_mem_size', uint32_t, 32), ('wave_granularity', ctypes.c_int32, 36), ('highest_bank_bit', uint32_t, 40), ('ubwc_swizzle', uint32_t, 44), ('macrotile_mode', uint32_t, 48), ('fibers_per_sp', uint32_t, 52), ('threadsize_base', uint32_t, 56), ('max_waves', uint32_t, 60), ('compute_lb_size', uint32_t, 64), ('num_sp_cores', uint32_t, 68), ('num_ccu', uint32_t, 68), ('a6xx', struct_fd_dev_info_a6xx, 72), ('a7xx', struct_fd_dev_info_a7xx, 728)]) +@c.record +class struct_fd_dev_id(c.Struct): + SIZE = 16 + gpu_id: int + chip_id: int +struct_fd_dev_id.register_fields([('gpu_id', uint32_t, 0), ('chip_id', uint64_t, 8)]) +@dll.bind(c.POINTER[struct_fd_dev_info], c.POINTER[struct_fd_dev_id]) +def fd_dev_info_raw(id:c.POINTER[struct_fd_dev_id]) -> c.POINTER[struct_fd_dev_info]: ... +@dll.bind(struct_fd_dev_info, c.POINTER[struct_fd_dev_id]) +def fd_dev_info(id:c.POINTER[struct_fd_dev_id]) -> struct_fd_dev_info: ... +@dll.bind(c.POINTER[struct_fd_dev_info], c.POINTER[ctypes.c_char]) +def fd_dev_info_raw_by_name(name:c.POINTER[ctypes.c_char]) -> c.POINTER[struct_fd_dev_info]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[struct_fd_dev_id]) +def fd_dev_name(id:c.POINTER[struct_fd_dev_id]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(None, c.POINTER[struct_fd_dev_info]) +def fd_dev_info_apply_dbg_options(info:c.POINTER[struct_fd_dev_info]) -> None: ... +class struct_ir3_ra_reg_set(c.Struct): pass +@c.record +class struct_ir3_shader(c.Struct): + SIZE = 1216 + type: int + id: int + variant_count: int + initial_variants_done: bool + compiler: c.POINTER[struct_ir3_compiler] + options: struct_ir3_shader_options + nir_finalized: bool + nir: c.POINTER[struct_nir_shader] + stream_output: struct_ir3_stream_output_info + cs: struct_ir3_shader_cs + vs: struct_ir3_shader_vs + variants: c.POINTER[struct_ir3_shader_variant] + variants_lock: pthread_mutex_t + cache_key: c.Array[ctypes.c_ubyte, Literal[20]] + key_mask: struct_ir3_shader_key +@c.record +class struct_ir3_compiler_options(c.Struct): + SIZE = 32 + push_ubo_with_preamble: bool + disable_cache: bool + bindless_fb_read_descriptor: int + bindless_fb_read_slot: int + storage_16bit: bool + storage_8bit: bool + lower_base_vertex: bool + shared_push_consts: bool + dual_color_blend_by_location: bool + uche_trap_base: int +struct_ir3_compiler_options.register_fields([('push_ubo_with_preamble', ctypes.c_bool, 0), ('disable_cache', ctypes.c_bool, 1), ('bindless_fb_read_descriptor', ctypes.c_int32, 4), ('bindless_fb_read_slot', ctypes.c_int32, 8), ('storage_16bit', ctypes.c_bool, 12), ('storage_8bit', ctypes.c_bool, 13), ('lower_base_vertex', ctypes.c_bool, 14), ('shared_push_consts', ctypes.c_bool, 15), ('dual_color_blend_by_location', ctypes.c_bool, 16), ('uche_trap_base', uint64_t, 24)]) +@c.record +class struct_ir3_compiler(c.Struct): + SIZE = 456 + dev: c.POINTER[struct_fd_device] + dev_id: c.POINTER[struct_fd_dev_id] + gen: int + shader_count: int + disk_cache: c.POINTER[struct_disk_cache] + nir_options: struct_nir_shader_compiler_options + options: struct_ir3_compiler_options + is_64bit: bool + flat_bypass: bool + levels_add_one: bool + unminify_coords: bool + txf_ms_with_isaml: bool + array_index_add_half: bool + samgq_workaround: bool + tess_use_shared: bool + mergedregs: bool + max_const_pipeline: int + max_const_geom: int + max_const_frag: int + max_const_safe: int + max_const_compute: int + compute_lb_size: int + instr_align: int + const_upload_unit: int + threadsize_base: int + wave_granularity: int + max_waves: int + reg_size_vec4: int + local_mem_size: int + branchstack_size: int + pvtmem_per_fiber_align: int + has_clip_cull: bool + has_pvtmem: bool + has_isam_ssbo: bool + has_isam_v: bool + has_ssbo_imm_offsets: bool + has_getfiberid: bool + mov_half_shared_quirk: bool + has_movs: bool + has_shfl: bool + has_bitwise_triops: bool + num_predicates: int + bitops_can_write_predicates: bool + has_branch_and_or: bool + has_predication: bool + predtf_nop_quirk: bool + prede_nop_quirk: bool + max_variable_workgroup_size: int + has_dp2acc: bool + has_dp4acc: bool + has_compliant_dp4acc: bool + bool_type: int + has_shared_regfile: bool + has_preamble: bool + shared_consts_base_offset: int + shared_consts_size: int + geom_shared_consts_size_quirk: int + has_fs_tex_prefetch: bool + stsc_duplication_quirk: bool + load_shader_consts_via_preamble: bool + load_inline_uniforms_via_preamble_ldgk: bool + has_scalar_alu: bool + fs_must_have_non_zero_constlen_quirk: bool + has_early_preamble: bool + has_rpt_bary_f: bool + has_alias_tex: bool + has_alias_rt: bool + reading_shading_rate_requires_smask_quirk: bool + delay_slots: struct_ir3_compiler_delay_slots +class struct_fd_device(c.Struct): pass +class struct_disk_cache(c.Struct): pass +type_t: dict[int, str] = {(TYPE_F16:=0): 'TYPE_F16', (TYPE_F32:=1): 'TYPE_F32', (TYPE_U16:=2): 'TYPE_U16', (TYPE_U32:=3): 'TYPE_U32', (TYPE_S16:=4): 'TYPE_S16', (TYPE_S32:=5): 'TYPE_S32', (TYPE_ATOMIC_U64:=6): 'TYPE_ATOMIC_U64', (TYPE_U8:=6): 'TYPE_U8', (TYPE_U8_32:=7): 'TYPE_U8_32'} +@c.record +class struct_ir3_compiler_delay_slots(c.Struct): + SIZE = 12 + alu_to_alu: int + non_alu: int + cat3_src2_read: int +struct_ir3_compiler_delay_slots.register_fields([('alu_to_alu', ctypes.c_uint32, 0), ('non_alu', ctypes.c_uint32, 4), ('cat3_src2_read', ctypes.c_uint32, 8)]) +struct_ir3_compiler.register_fields([('dev', c.POINTER[struct_fd_device], 0), ('dev_id', c.POINTER[struct_fd_dev_id], 8), ('gen', uint8_t, 16), ('shader_count', uint32_t, 20), ('disk_cache', c.POINTER[struct_disk_cache], 24), ('nir_options', struct_nir_shader_compiler_options, 32), ('options', struct_ir3_compiler_options, 280), ('is_64bit', ctypes.c_bool, 312), ('flat_bypass', ctypes.c_bool, 313), ('levels_add_one', ctypes.c_bool, 314), ('unminify_coords', ctypes.c_bool, 315), ('txf_ms_with_isaml', ctypes.c_bool, 316), ('array_index_add_half', ctypes.c_bool, 317), ('samgq_workaround', ctypes.c_bool, 318), ('tess_use_shared', ctypes.c_bool, 319), ('mergedregs', ctypes.c_bool, 320), ('max_const_pipeline', uint16_t, 322), ('max_const_geom', uint16_t, 324), ('max_const_frag', uint16_t, 326), ('max_const_safe', uint16_t, 328), ('max_const_compute', uint16_t, 330), ('compute_lb_size', uint32_t, 332), ('instr_align', uint32_t, 336), ('const_upload_unit', uint32_t, 340), ('threadsize_base', uint32_t, 344), ('wave_granularity', uint32_t, 348), ('max_waves', uint32_t, 352), ('reg_size_vec4', uint32_t, 356), ('local_mem_size', uint32_t, 360), ('branchstack_size', uint32_t, 364), ('pvtmem_per_fiber_align', uint32_t, 368), ('has_clip_cull', ctypes.c_bool, 372), ('has_pvtmem', ctypes.c_bool, 373), ('has_isam_ssbo', ctypes.c_bool, 374), ('has_isam_v', ctypes.c_bool, 375), ('has_ssbo_imm_offsets', ctypes.c_bool, 376), ('has_getfiberid', ctypes.c_bool, 377), ('mov_half_shared_quirk', ctypes.c_bool, 378), ('has_movs', ctypes.c_bool, 379), ('has_shfl', ctypes.c_bool, 380), ('has_bitwise_triops', ctypes.c_bool, 381), ('num_predicates', uint32_t, 384), ('bitops_can_write_predicates', ctypes.c_bool, 388), ('has_branch_and_or', ctypes.c_bool, 389), ('has_predication', ctypes.c_bool, 390), ('predtf_nop_quirk', ctypes.c_bool, 391), ('prede_nop_quirk', ctypes.c_bool, 392), ('max_variable_workgroup_size', uint32_t, 396), ('has_dp2acc', ctypes.c_bool, 400), ('has_dp4acc', ctypes.c_bool, 401), ('has_compliant_dp4acc', ctypes.c_bool, 402), ('bool_type', ctypes.c_uint32, 404), ('has_shared_regfile', ctypes.c_bool, 408), ('has_preamble', ctypes.c_bool, 409), ('shared_consts_base_offset', uint16_t, 410), ('shared_consts_size', uint64_t, 416), ('geom_shared_consts_size_quirk', uint64_t, 424), ('has_fs_tex_prefetch', ctypes.c_bool, 432), ('stsc_duplication_quirk', ctypes.c_bool, 433), ('load_shader_consts_via_preamble', ctypes.c_bool, 434), ('load_inline_uniforms_via_preamble_ldgk', ctypes.c_bool, 435), ('has_scalar_alu', ctypes.c_bool, 436), ('fs_must_have_non_zero_constlen_quirk', ctypes.c_bool, 437), ('has_early_preamble', ctypes.c_bool, 438), ('has_rpt_bary_f', ctypes.c_bool, 439), ('has_alias_tex', ctypes.c_bool, 440), ('has_alias_rt', ctypes.c_bool, 441), ('reading_shading_rate_requires_smask_quirk', ctypes.c_bool, 442), ('delay_slots', struct_ir3_compiler_delay_slots, 444)]) +@dll.bind(None, c.POINTER[struct_ir3_compiler]) +def ir3_compiler_destroy(compiler:c.POINTER[struct_ir3_compiler]) -> None: ... +@dll.bind(c.POINTER[struct_ir3_compiler], c.POINTER[struct_fd_device], c.POINTER[struct_fd_dev_id], c.POINTER[struct_fd_dev_info], c.POINTER[struct_ir3_compiler_options]) +def ir3_compiler_create(dev:c.POINTER[struct_fd_device], dev_id:c.POINTER[struct_fd_dev_id], dev_info:c.POINTER[struct_fd_dev_info], options:c.POINTER[struct_ir3_compiler_options]) -> c.POINTER[struct_ir3_compiler]: ... +@dll.bind(None, c.POINTER[struct_ir3_compiler]) +def ir3_disk_cache_init(compiler:c.POINTER[struct_ir3_compiler]) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_compiler], c.POINTER[struct_ir3_shader]) +def ir3_disk_cache_init_shader_key(compiler:c.POINTER[struct_ir3_compiler], shader:c.POINTER[struct_ir3_shader]) -> None: ... +@c.record +class struct_ir3_shader_variant(c.Struct): + SIZE = 2040 + bo: c.POINTER[struct_fd_bo] + id: int + shader_id: int + key: struct_ir3_shader_key + binning_pass: bool + binning: c.POINTER[struct_ir3_shader_variant] + nonbinning: c.POINTER[struct_ir3_shader_variant] + ir: c.POINTER[struct_ir3] + next: c.POINTER[struct_ir3_shader_variant] + type: int + compiler: c.POINTER[struct_ir3_compiler] + name: c.POINTER[ctypes.c_char] + constant_data: ctypes.c_void_p + disasm_info: struct_ir3_disasm_info + bin: c.POINTER[ctypes.c_uint32] + const_state: c.POINTER[struct_ir3_const_state] + imm_state: struct_ir3_imm_const_state + info: struct_ir3_info + sha1_str: c.Array[ctypes.c_char, Literal[41]] + shader_options: struct_ir3_shader_options + constant_data_size: int + branchstack: int + loops: int + instrlen: int + constlen: int + pvtmem_size: int + pvtmem_per_wave: bool + multi_pos_output: bool + dual_src_blend: bool + early_preamble: bool + shared_size: int + frag_face: bool + color0_mrt: bool + fragcoord_compmask: int + outputs_count: int + outputs: c.Array[struct_ir3_shader_output, Literal[34]] + writes_pos: bool + writes_smask: bool + writes_psize: bool + writes_viewport: bool + writes_stencilref: bool + writes_shading_rate: bool + output_size: int + input_size: int + output_loc: c.Array[ctypes.c_uint32, Literal[45]] + inputs_count: int + inputs: c.Array[struct_ir3_shader_variant_input, Literal[34]] + reads_primid: bool + reads_shading_rate: bool + reads_smask: bool + total_in: int + sysval_in: int + varying_in: int + image_mapping: struct_ir3_ibo_mapping + num_samp: int + fb_read: bool + has_ssbo: bool + bindless_tex: bool + bindless_samp: bool + bindless_ibo: bool + bindless_ubo: bool + need_pixlod: bool + need_full_quad: bool + need_driver_params: bool + no_earlyz: bool + has_kill: bool + per_samp: bool + post_depth_coverage: bool + empty: bool + writes_only_color: bool + mergedregs: bool + clip_mask: int + cull_mask: int + astc_srgb: struct_ir3_shader_variant_astc_srgb + tg4: struct_ir3_shader_variant_tg4 + num_sampler_prefetch: int + sampler_prefetch: c.Array[struct_ir3_sampler_prefetch, Literal[4]] + prefetch_bary_type: int + prefetch_end_of_quad: bool + local_size: c.Array[ctypes.c_uint16, Literal[3]] + local_size_variable: bool + has_barrier: bool + num_ssbos: int + num_uavs: int + tess: struct_ir3_shader_variant_tess + gs: struct_ir3_shader_variant_gs + fs: struct_ir3_shader_variant_fs + cs: struct_ir3_shader_variant_cs + vtxid_base: int + stream_output: struct_ir3_stream_output_info +@dll.bind(c.POINTER[struct_ir3_shader_variant], c.POINTER[struct_blob_reader], c.POINTER[struct_ir3_compiler], ctypes.c_void_p) +def ir3_retrieve_variant(blob:c.POINTER[struct_blob_reader], compiler:c.POINTER[struct_ir3_compiler], mem_ctx:ctypes.c_void_p) -> c.POINTER[struct_ir3_shader_variant]: ... +@dll.bind(None, c.POINTER[struct_blob], c.POINTER[struct_ir3_shader_variant]) +def ir3_store_variant(blob:c.POINTER[struct_blob], v:c.POINTER[struct_ir3_shader_variant]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_ir3_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_disk_cache_retrieve(shader:c.POINTER[struct_ir3_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(None, c.POINTER[struct_ir3_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_disk_cache_store(shader:c.POINTER[struct_ir3_shader], v:c.POINTER[struct_ir3_shader_variant]) -> None: ... +@dll.bind(c.POINTER[nir_shader_compiler_options], c.POINTER[struct_ir3_compiler]) +def ir3_get_compiler_options(compiler:c.POINTER[struct_ir3_compiler]) -> c.POINTER[nir_shader_compiler_options]: ... +@dll.bind(ctypes.c_int32, c.POINTER[struct_ir3_compiler], c.POINTER[struct_ir3_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_compile_shader_nir(compiler:c.POINTER[struct_ir3_compiler], shader:c.POINTER[struct_ir3_shader], so:c.POINTER[struct_ir3_shader_variant]) -> int: ... +enum_ir3_shader_debug: dict[int, str] = {(IR3_DBG_SHADER_VS:=1): 'IR3_DBG_SHADER_VS', (IR3_DBG_SHADER_TCS:=2): 'IR3_DBG_SHADER_TCS', (IR3_DBG_SHADER_TES:=4): 'IR3_DBG_SHADER_TES', (IR3_DBG_SHADER_GS:=8): 'IR3_DBG_SHADER_GS', (IR3_DBG_SHADER_FS:=16): 'IR3_DBG_SHADER_FS', (IR3_DBG_SHADER_CS:=32): 'IR3_DBG_SHADER_CS', (IR3_DBG_DISASM:=64): 'IR3_DBG_DISASM', (IR3_DBG_OPTMSGS:=128): 'IR3_DBG_OPTMSGS', (IR3_DBG_FORCES2EN:=256): 'IR3_DBG_FORCES2EN', (IR3_DBG_NOUBOOPT:=512): 'IR3_DBG_NOUBOOPT', (IR3_DBG_NOFP16:=1024): 'IR3_DBG_NOFP16', (IR3_DBG_NOCACHE:=2048): 'IR3_DBG_NOCACHE', (IR3_DBG_SPILLALL:=4096): 'IR3_DBG_SPILLALL', (IR3_DBG_NOPREAMBLE:=8192): 'IR3_DBG_NOPREAMBLE', (IR3_DBG_SHADER_INTERNAL:=16384): 'IR3_DBG_SHADER_INTERNAL', (IR3_DBG_FULLSYNC:=32768): 'IR3_DBG_FULLSYNC', (IR3_DBG_FULLNOP:=65536): 'IR3_DBG_FULLNOP', (IR3_DBG_NOEARLYPREAMBLE:=131072): 'IR3_DBG_NOEARLYPREAMBLE', (IR3_DBG_NODESCPREFETCH:=262144): 'IR3_DBG_NODESCPREFETCH', (IR3_DBG_EXPANDRPT:=524288): 'IR3_DBG_EXPANDRPT', (IR3_DBG_ASM_ROUNDTRIP:=1048576): 'IR3_DBG_ASM_ROUNDTRIP', (IR3_DBG_SCHEDMSGS:=2097152): 'IR3_DBG_SCHEDMSGS', (IR3_DBG_RAMSGS:=4194304): 'IR3_DBG_RAMSGS', (IR3_DBG_NOALIASTEX:=8388608): 'IR3_DBG_NOALIASTEX', (IR3_DBG_NOALIASRT:=16777216): 'IR3_DBG_NOALIASRT'} +try: ir3_shader_debug = ctypes.c_uint32.in_dll(dll, 'ir3_shader_debug') # type: ignore +except (ValueError,AttributeError): pass +try: ir3_shader_override_path = c.POINTER[ctypes.c_char].in_dll(dll, 'ir3_shader_override_path') # type: ignore +except (ValueError,AttributeError): pass +@dll.bind(c.POINTER[ctypes.c_char]) +def ir3_shader_debug_as_string() -> c.POINTER[ctypes.c_char]: ... +@c.record +class struct_ir3_driver_params_cs(c.Struct): + SIZE = 64 + num_work_groups_x: int + num_work_groups_y: int + num_work_groups_z: int + work_dim: int + base_group_x: int + base_group_y: int + base_group_z: int + subgroup_size: int + local_group_size_x: int + local_group_size_y: int + local_group_size_z: int + subgroup_id_shift: int + workgroup_id_x: int + workgroup_id_y: int + workgroup_id_z: int + __pad: int +struct_ir3_driver_params_cs.register_fields([('num_work_groups_x', uint32_t, 0), ('num_work_groups_y', uint32_t, 4), ('num_work_groups_z', uint32_t, 8), ('work_dim', uint32_t, 12), ('base_group_x', uint32_t, 16), ('base_group_y', uint32_t, 20), ('base_group_z', uint32_t, 24), ('subgroup_size', uint32_t, 28), ('local_group_size_x', uint32_t, 32), ('local_group_size_y', uint32_t, 36), ('local_group_size_z', uint32_t, 40), ('subgroup_id_shift', uint32_t, 44), ('workgroup_id_x', uint32_t, 48), ('workgroup_id_y', uint32_t, 52), ('workgroup_id_z', uint32_t, 56), ('__pad', uint32_t, 60)]) +@c.record +class struct_ir3_driver_params_vs(c.Struct): + SIZE = 160 + draw_id: int + vtxid_base: int + instid_base: int + vtxcnt_max: int + is_indexed_draw: int + ucp: c.Array[struct_ir3_driver_params_vs_ucp, Literal[8]] + __pad_37_39: c.Array[ctypes.c_uint32, Literal[3]] +@c.record +class struct_ir3_driver_params_vs_ucp(c.Struct): + SIZE = 16 + x: int + y: int + z: int + w: int +struct_ir3_driver_params_vs_ucp.register_fields([('x', uint32_t, 0), ('y', uint32_t, 4), ('z', uint32_t, 8), ('w', uint32_t, 12)]) +struct_ir3_driver_params_vs.register_fields([('draw_id', uint32_t, 0), ('vtxid_base', uint32_t, 4), ('instid_base', uint32_t, 8), ('vtxcnt_max', uint32_t, 12), ('is_indexed_draw', uint32_t, 16), ('ucp', c.Array[struct_ir3_driver_params_vs_ucp, Literal[8]], 20), ('__pad_37_39', c.Array[uint32_t, Literal[3]], 148)]) +@c.record +class struct_ir3_driver_params_tcs(c.Struct): + SIZE = 32 + default_outer_level_x: int + default_outer_level_y: int + default_outer_level_z: int + default_outer_level_w: int + default_inner_level_x: int + default_inner_level_y: int + __pad_06_07: c.Array[ctypes.c_uint32, Literal[2]] +struct_ir3_driver_params_tcs.register_fields([('default_outer_level_x', uint32_t, 0), ('default_outer_level_y', uint32_t, 4), ('default_outer_level_z', uint32_t, 8), ('default_outer_level_w', uint32_t, 12), ('default_inner_level_x', uint32_t, 16), ('default_inner_level_y', uint32_t, 20), ('__pad_06_07', c.Array[uint32_t, Literal[2]], 24)]) +@c.record +class struct_ir3_driver_params_fs(c.Struct): + SIZE = 52 + subgroup_size: int + __pad_01_03: c.Array[ctypes.c_uint32, Literal[3]] + frag_invocation_count: int + __pad_05_07: c.Array[ctypes.c_uint32, Literal[3]] + frag_size: int + __pad_09: int + frag_offset: int + __pad_11_12: c.Array[ctypes.c_uint32, Literal[2]] +struct_ir3_driver_params_fs.register_fields([('subgroup_size', uint32_t, 0), ('__pad_01_03', c.Array[uint32_t, Literal[3]], 4), ('frag_invocation_count', uint32_t, 16), ('__pad_05_07', c.Array[uint32_t, Literal[3]], 20), ('frag_size', uint32_t, 32), ('__pad_09', uint32_t, 36), ('frag_offset', uint32_t, 40), ('__pad_11_12', c.Array[uint32_t, Literal[2]], 44)]) +enum_ir3_bary: dict[int, str] = {(IJ_PERSP_PIXEL:=0): 'IJ_PERSP_PIXEL', (IJ_PERSP_SAMPLE:=1): 'IJ_PERSP_SAMPLE', (IJ_PERSP_CENTROID:=2): 'IJ_PERSP_CENTROID', (IJ_PERSP_CENTER_RHW:=3): 'IJ_PERSP_CENTER_RHW', (IJ_LINEAR_PIXEL:=4): 'IJ_LINEAR_PIXEL', (IJ_LINEAR_CENTROID:=5): 'IJ_LINEAR_CENTROID', (IJ_LINEAR_SAMPLE:=6): 'IJ_LINEAR_SAMPLE', (IJ_COUNT:=7): 'IJ_COUNT'} +enum_ir3_wavesize_option: dict[int, str] = {(IR3_SINGLE_ONLY:=0): 'IR3_SINGLE_ONLY', (IR3_SINGLE_OR_DOUBLE:=1): 'IR3_SINGLE_OR_DOUBLE', (IR3_DOUBLE_ONLY:=2): 'IR3_DOUBLE_ONLY'} +@c.record +class struct_ir3_ubo_info(c.Struct): + SIZE = 16 + global_base: c.POINTER[struct_nir_def] + block: int + bindless_base: int + bindless: bool + _global: bool +struct_ir3_ubo_info.register_fields([('global_base', c.POINTER[struct_nir_def], 0), ('block', uint32_t, 8), ('bindless_base', uint16_t, 12), ('bindless', ctypes.c_bool, 14), ('_global', ctypes.c_bool, 15)]) +@c.record +class struct_ir3_ubo_range(c.Struct): + SIZE = 32 + ubo: struct_ir3_ubo_info + offset: int + start: int + end: int +struct_ir3_ubo_range.register_fields([('ubo', struct_ir3_ubo_info, 0), ('offset', uint32_t, 16), ('start', uint32_t, 20), ('end', uint32_t, 24)]) +@c.record +class struct_ir3_ubo_analysis_state(c.Struct): + SIZE = 1032 + range: c.Array[struct_ir3_ubo_range, Literal[32]] + num_enabled: int + size: int +struct_ir3_ubo_analysis_state.register_fields([('range', c.Array[struct_ir3_ubo_range, Literal[32]], 0), ('num_enabled', uint32_t, 1024), ('size', uint32_t, 1028)]) +enum_ir3_push_consts_type: dict[int, str] = {(IR3_PUSH_CONSTS_NONE:=0): 'IR3_PUSH_CONSTS_NONE', (IR3_PUSH_CONSTS_PER_STAGE:=1): 'IR3_PUSH_CONSTS_PER_STAGE', (IR3_PUSH_CONSTS_SHARED:=2): 'IR3_PUSH_CONSTS_SHARED', (IR3_PUSH_CONSTS_SHARED_PREAMBLE:=3): 'IR3_PUSH_CONSTS_SHARED_PREAMBLE'} +@c.record +class struct_ir3_driver_ubo(c.Struct): + SIZE = 8 + idx: int + size: int +struct_ir3_driver_ubo.register_fields([('idx', int32_t, 0), ('size', uint32_t, 4)]) +enum_ir3_const_alloc_type: dict[int, str] = {(IR3_CONST_ALLOC_PUSH_CONSTS:=0): 'IR3_CONST_ALLOC_PUSH_CONSTS', (IR3_CONST_ALLOC_DYN_DESCRIPTOR_OFFSET:=1): 'IR3_CONST_ALLOC_DYN_DESCRIPTOR_OFFSET', (IR3_CONST_ALLOC_INLINE_UNIFORM_ADDRS:=2): 'IR3_CONST_ALLOC_INLINE_UNIFORM_ADDRS', (IR3_CONST_ALLOC_DRIVER_PARAMS:=3): 'IR3_CONST_ALLOC_DRIVER_PARAMS', (IR3_CONST_ALLOC_UBO_RANGES:=4): 'IR3_CONST_ALLOC_UBO_RANGES', (IR3_CONST_ALLOC_PREAMBLE:=5): 'IR3_CONST_ALLOC_PREAMBLE', (IR3_CONST_ALLOC_GLOBAL:=6): 'IR3_CONST_ALLOC_GLOBAL', (IR3_CONST_ALLOC_UBO_PTRS:=7): 'IR3_CONST_ALLOC_UBO_PTRS', (IR3_CONST_ALLOC_IMAGE_DIMS:=8): 'IR3_CONST_ALLOC_IMAGE_DIMS', (IR3_CONST_ALLOC_TFBO:=9): 'IR3_CONST_ALLOC_TFBO', (IR3_CONST_ALLOC_PRIMITIVE_PARAM:=10): 'IR3_CONST_ALLOC_PRIMITIVE_PARAM', (IR3_CONST_ALLOC_PRIMITIVE_MAP:=11): 'IR3_CONST_ALLOC_PRIMITIVE_MAP', (IR3_CONST_ALLOC_MAX:=12): 'IR3_CONST_ALLOC_MAX'} +@c.record +class struct_ir3_const_allocation(c.Struct): + SIZE = 16 + offset_vec4: int + size_vec4: int + reserved_size_vec4: int + reserved_align_vec4: int +struct_ir3_const_allocation.register_fields([('offset_vec4', uint32_t, 0), ('size_vec4', uint32_t, 4), ('reserved_size_vec4', uint32_t, 8), ('reserved_align_vec4', uint32_t, 12)]) +@c.record +class struct_ir3_const_allocations(c.Struct): + SIZE = 200 + consts: c.Array[struct_ir3_const_allocation, Literal[12]] + max_const_offset_vec4: int + reserved_vec4: int +struct_ir3_const_allocations.register_fields([('consts', c.Array[struct_ir3_const_allocation, Literal[12]], 0), ('max_const_offset_vec4', uint32_t, 192), ('reserved_vec4', uint32_t, 196)]) +@c.record +class struct_ir3_const_image_dims(c.Struct): + SIZE = 136 + mask: int + count: int + off: c.Array[ctypes.c_uint32, Literal[32]] +struct_ir3_const_image_dims.register_fields([('mask', uint32_t, 0), ('count', uint32_t, 4), ('off', c.Array[uint32_t, Literal[32]], 8)]) +@c.record +class struct_ir3_imm_const_state(c.Struct): + SIZE = 16 + size: int + count: int + values: c.POINTER[ctypes.c_uint32] +struct_ir3_imm_const_state.register_fields([('size', ctypes.c_uint32, 0), ('count', ctypes.c_uint32, 4), ('values', c.POINTER[uint32_t], 8)]) +@c.record +class struct_ir3_const_state(c.Struct): + SIZE = 1424 + num_ubos: int + num_app_ubos: int + num_driver_params: int + consts_ubo: struct_ir3_driver_ubo + driver_params_ubo: struct_ir3_driver_ubo + primitive_map_ubo: struct_ir3_driver_ubo + primitive_param_ubo: struct_ir3_driver_ubo + allocs: struct_ir3_const_allocations + image_dims: struct_ir3_const_image_dims + ubo_state: struct_ir3_ubo_analysis_state + push_consts_type: int +struct_ir3_const_state.register_fields([('num_ubos', ctypes.c_uint32, 0), ('num_app_ubos', ctypes.c_uint32, 4), ('num_driver_params', ctypes.c_uint32, 8), ('consts_ubo', struct_ir3_driver_ubo, 12), ('driver_params_ubo', struct_ir3_driver_ubo, 20), ('primitive_map_ubo', struct_ir3_driver_ubo, 28), ('primitive_param_ubo', struct_ir3_driver_ubo, 36), ('allocs', struct_ir3_const_allocations, 44), ('image_dims', struct_ir3_const_image_dims, 244), ('ubo_state', struct_ir3_ubo_analysis_state, 384), ('push_consts_type', ctypes.c_uint32, 1416)]) +@c.record +class struct_ir3_stream_output(c.Struct): + SIZE = 4 + register_index: int + start_component: int + num_components: int + output_buffer: int + dst_offset: int + stream: int +struct_ir3_stream_output.register_fields([('register_index', ctypes.c_uint32, 0, 6, 0), ('start_component', ctypes.c_uint32, 0, 2, 6), ('num_components', ctypes.c_uint32, 1, 3, 0), ('output_buffer', ctypes.c_uint32, 1, 3, 3), ('dst_offset', ctypes.c_uint32, 1, 16, 6), ('stream', ctypes.c_uint32, 3, 2, 6)]) +@c.record +class struct_ir3_stream_output_info(c.Struct): + SIZE = 532 + num_outputs: int + stride: c.Array[ctypes.c_uint16, Literal[4]] + streams_written: int + buffer_to_stream: c.Array[ctypes.c_ubyte, Literal[4]] + output: c.Array[struct_ir3_stream_output, Literal[128]] +struct_ir3_stream_output_info.register_fields([('num_outputs', ctypes.c_uint32, 0), ('stride', c.Array[uint16_t, Literal[4]], 4), ('streams_written', uint8_t, 12), ('buffer_to_stream', c.Array[uint8_t, Literal[4]], 13), ('output', c.Array[struct_ir3_stream_output, Literal[128]], 20)]) +@c.record +class struct_ir3_sampler_prefetch(c.Struct): + SIZE = 16 + src: int + bindless: bool + samp_id: int + tex_id: int + samp_bindless_id: int + tex_bindless_id: int + dst: int + wrmask: int + half_precision: int + tex_opc: int +opc_t: dict[int, str] = {(OPC_NOP:=0): 'OPC_NOP', (OPC_JUMP:=2): 'OPC_JUMP', (OPC_CALL:=3): 'OPC_CALL', (OPC_RET:=4): 'OPC_RET', (OPC_KILL:=5): 'OPC_KILL', (OPC_END:=6): 'OPC_END', (OPC_EMIT:=7): 'OPC_EMIT', (OPC_CUT:=8): 'OPC_CUT', (OPC_CHMASK:=9): 'OPC_CHMASK', (OPC_CHSH:=10): 'OPC_CHSH', (OPC_FLOW_REV:=11): 'OPC_FLOW_REV', (OPC_BKT:=16): 'OPC_BKT', (OPC_STKS:=17): 'OPC_STKS', (OPC_STKR:=18): 'OPC_STKR', (OPC_XSET:=19): 'OPC_XSET', (OPC_XCLR:=20): 'OPC_XCLR', (OPC_GETONE:=21): 'OPC_GETONE', (OPC_DBG:=22): 'OPC_DBG', (OPC_SHPS:=23): 'OPC_SHPS', (OPC_SHPE:=24): 'OPC_SHPE', (OPC_GETLAST:=25): 'OPC_GETLAST', (OPC_PREDT:=29): 'OPC_PREDT', (OPC_PREDF:=30): 'OPC_PREDF', (OPC_PREDE:=31): 'OPC_PREDE', (OPC_BR:=40): 'OPC_BR', (OPC_BRAO:=41): 'OPC_BRAO', (OPC_BRAA:=42): 'OPC_BRAA', (OPC_BRAC:=43): 'OPC_BRAC', (OPC_BANY:=44): 'OPC_BANY', (OPC_BALL:=45): 'OPC_BALL', (OPC_BRAX:=46): 'OPC_BRAX', (OPC_DEMOTE:=47): 'OPC_DEMOTE', (OPC_MOV:=128): 'OPC_MOV', (OPC_MOVP:=129): 'OPC_MOVP', (OPC_MOVS:=130): 'OPC_MOVS', (OPC_MOVMSK:=131): 'OPC_MOVMSK', (OPC_SWZ:=132): 'OPC_SWZ', (OPC_GAT:=133): 'OPC_GAT', (OPC_SCT:=134): 'OPC_SCT', (OPC_MOV_IMMED:=168): 'OPC_MOV_IMMED', (OPC_MOV_CONST:=169): 'OPC_MOV_CONST', (OPC_MOV_GPR:=170): 'OPC_MOV_GPR', (OPC_MOV_RELGPR:=171): 'OPC_MOV_RELGPR', (OPC_MOV_RELCONST:=172): 'OPC_MOV_RELCONST', (OPC_MOVS_IMMED:=173): 'OPC_MOVS_IMMED', (OPC_MOVS_A0:=174): 'OPC_MOVS_A0', (OPC_BALLOT_MACRO:=178): 'OPC_BALLOT_MACRO', (OPC_ANY_MACRO:=179): 'OPC_ANY_MACRO', (OPC_ALL_MACRO:=180): 'OPC_ALL_MACRO', (OPC_ELECT_MACRO:=181): 'OPC_ELECT_MACRO', (OPC_READ_COND_MACRO:=182): 'OPC_READ_COND_MACRO', (OPC_READ_FIRST_MACRO:=183): 'OPC_READ_FIRST_MACRO', (OPC_SHPS_MACRO:=184): 'OPC_SHPS_MACRO', (OPC_READ_GETLAST_MACRO:=185): 'OPC_READ_GETLAST_MACRO', (OPC_SCAN_MACRO:=186): 'OPC_SCAN_MACRO', (OPC_SCAN_CLUSTERS_MACRO:=188): 'OPC_SCAN_CLUSTERS_MACRO', (OPC_ADD_F:=256): 'OPC_ADD_F', (OPC_MIN_F:=257): 'OPC_MIN_F', (OPC_MAX_F:=258): 'OPC_MAX_F', (OPC_MUL_F:=259): 'OPC_MUL_F', (OPC_SIGN_F:=260): 'OPC_SIGN_F', (OPC_CMPS_F:=261): 'OPC_CMPS_F', (OPC_ABSNEG_F:=262): 'OPC_ABSNEG_F', (OPC_CMPV_F:=263): 'OPC_CMPV_F', (OPC_FLOOR_F:=265): 'OPC_FLOOR_F', (OPC_CEIL_F:=266): 'OPC_CEIL_F', (OPC_RNDNE_F:=267): 'OPC_RNDNE_F', (OPC_RNDAZ_F:=268): 'OPC_RNDAZ_F', (OPC_TRUNC_F:=269): 'OPC_TRUNC_F', (OPC_ADD_U:=272): 'OPC_ADD_U', (OPC_ADD_S:=273): 'OPC_ADD_S', (OPC_SUB_U:=274): 'OPC_SUB_U', (OPC_SUB_S:=275): 'OPC_SUB_S', (OPC_CMPS_U:=276): 'OPC_CMPS_U', (OPC_CMPS_S:=277): 'OPC_CMPS_S', (OPC_MIN_U:=278): 'OPC_MIN_U', (OPC_MIN_S:=279): 'OPC_MIN_S', (OPC_MAX_U:=280): 'OPC_MAX_U', (OPC_MAX_S:=281): 'OPC_MAX_S', (OPC_ABSNEG_S:=282): 'OPC_ABSNEG_S', (OPC_AND_B:=284): 'OPC_AND_B', (OPC_OR_B:=285): 'OPC_OR_B', (OPC_NOT_B:=286): 'OPC_NOT_B', (OPC_XOR_B:=287): 'OPC_XOR_B', (OPC_CMPV_U:=289): 'OPC_CMPV_U', (OPC_CMPV_S:=290): 'OPC_CMPV_S', (OPC_MUL_U24:=304): 'OPC_MUL_U24', (OPC_MUL_S24:=305): 'OPC_MUL_S24', (OPC_MULL_U:=306): 'OPC_MULL_U', (OPC_BFREV_B:=307): 'OPC_BFREV_B', (OPC_CLZ_S:=308): 'OPC_CLZ_S', (OPC_CLZ_B:=309): 'OPC_CLZ_B', (OPC_SHL_B:=310): 'OPC_SHL_B', (OPC_SHR_B:=311): 'OPC_SHR_B', (OPC_ASHR_B:=312): 'OPC_ASHR_B', (OPC_BARY_F:=313): 'OPC_BARY_F', (OPC_MGEN_B:=314): 'OPC_MGEN_B', (OPC_GETBIT_B:=315): 'OPC_GETBIT_B', (OPC_SETRM:=316): 'OPC_SETRM', (OPC_CBITS_B:=317): 'OPC_CBITS_B', (OPC_SHB:=318): 'OPC_SHB', (OPC_MSAD:=319): 'OPC_MSAD', (OPC_FLAT_B:=320): 'OPC_FLAT_B', (OPC_MAD_U16:=384): 'OPC_MAD_U16', (OPC_MADSH_U16:=385): 'OPC_MADSH_U16', (OPC_MAD_S16:=386): 'OPC_MAD_S16', (OPC_MADSH_M16:=387): 'OPC_MADSH_M16', (OPC_MAD_U24:=388): 'OPC_MAD_U24', (OPC_MAD_S24:=389): 'OPC_MAD_S24', (OPC_MAD_F16:=390): 'OPC_MAD_F16', (OPC_MAD_F32:=391): 'OPC_MAD_F32', (OPC_SEL_B16:=392): 'OPC_SEL_B16', (OPC_SEL_B32:=393): 'OPC_SEL_B32', (OPC_SEL_S16:=394): 'OPC_SEL_S16', (OPC_SEL_S32:=395): 'OPC_SEL_S32', (OPC_SEL_F16:=396): 'OPC_SEL_F16', (OPC_SEL_F32:=397): 'OPC_SEL_F32', (OPC_SAD_S16:=398): 'OPC_SAD_S16', (OPC_SAD_S32:=399): 'OPC_SAD_S32', (OPC_SHRM:=400): 'OPC_SHRM', (OPC_SHLM:=401): 'OPC_SHLM', (OPC_SHRG:=402): 'OPC_SHRG', (OPC_SHLG:=403): 'OPC_SHLG', (OPC_ANDG:=404): 'OPC_ANDG', (OPC_DP2ACC:=405): 'OPC_DP2ACC', (OPC_DP4ACC:=406): 'OPC_DP4ACC', (OPC_WMM:=407): 'OPC_WMM', (OPC_WMM_ACCU:=408): 'OPC_WMM_ACCU', (OPC_RCP:=512): 'OPC_RCP', (OPC_RSQ:=513): 'OPC_RSQ', (OPC_LOG2:=514): 'OPC_LOG2', (OPC_EXP2:=515): 'OPC_EXP2', (OPC_SIN:=516): 'OPC_SIN', (OPC_COS:=517): 'OPC_COS', (OPC_SQRT:=518): 'OPC_SQRT', (OPC_HRSQ:=521): 'OPC_HRSQ', (OPC_HLOG2:=522): 'OPC_HLOG2', (OPC_HEXP2:=523): 'OPC_HEXP2', (OPC_ISAM:=640): 'OPC_ISAM', (OPC_ISAML:=641): 'OPC_ISAML', (OPC_ISAMM:=642): 'OPC_ISAMM', (OPC_SAM:=643): 'OPC_SAM', (OPC_SAMB:=644): 'OPC_SAMB', (OPC_SAML:=645): 'OPC_SAML', (OPC_SAMGQ:=646): 'OPC_SAMGQ', (OPC_GETLOD:=647): 'OPC_GETLOD', (OPC_CONV:=648): 'OPC_CONV', (OPC_CONVM:=649): 'OPC_CONVM', (OPC_GETSIZE:=650): 'OPC_GETSIZE', (OPC_GETBUF:=651): 'OPC_GETBUF', (OPC_GETPOS:=652): 'OPC_GETPOS', (OPC_GETINFO:=653): 'OPC_GETINFO', (OPC_DSX:=654): 'OPC_DSX', (OPC_DSY:=655): 'OPC_DSY', (OPC_GATHER4R:=656): 'OPC_GATHER4R', (OPC_GATHER4G:=657): 'OPC_GATHER4G', (OPC_GATHER4B:=658): 'OPC_GATHER4B', (OPC_GATHER4A:=659): 'OPC_GATHER4A', (OPC_SAMGP0:=660): 'OPC_SAMGP0', (OPC_SAMGP1:=661): 'OPC_SAMGP1', (OPC_SAMGP2:=662): 'OPC_SAMGP2', (OPC_SAMGP3:=663): 'OPC_SAMGP3', (OPC_DSXPP_1:=664): 'OPC_DSXPP_1', (OPC_DSYPP_1:=665): 'OPC_DSYPP_1', (OPC_RGETPOS:=666): 'OPC_RGETPOS', (OPC_RGETINFO:=667): 'OPC_RGETINFO', (OPC_BRCST_ACTIVE:=668): 'OPC_BRCST_ACTIVE', (OPC_QUAD_SHUFFLE_BRCST:=669): 'OPC_QUAD_SHUFFLE_BRCST', (OPC_QUAD_SHUFFLE_HORIZ:=670): 'OPC_QUAD_SHUFFLE_HORIZ', (OPC_QUAD_SHUFFLE_VERT:=671): 'OPC_QUAD_SHUFFLE_VERT', (OPC_QUAD_SHUFFLE_DIAG:=672): 'OPC_QUAD_SHUFFLE_DIAG', (OPC_TCINV:=673): 'OPC_TCINV', (OPC_DSXPP_MACRO:=675): 'OPC_DSXPP_MACRO', (OPC_DSYPP_MACRO:=676): 'OPC_DSYPP_MACRO', (OPC_LDG:=768): 'OPC_LDG', (OPC_LDL:=769): 'OPC_LDL', (OPC_LDP:=770): 'OPC_LDP', (OPC_STG:=771): 'OPC_STG', (OPC_STL:=772): 'OPC_STL', (OPC_STP:=773): 'OPC_STP', (OPC_LDIB:=774): 'OPC_LDIB', (OPC_G2L:=775): 'OPC_G2L', (OPC_L2G:=776): 'OPC_L2G', (OPC_PREFETCH:=777): 'OPC_PREFETCH', (OPC_LDLW:=778): 'OPC_LDLW', (OPC_STLW:=779): 'OPC_STLW', (OPC_RESFMT:=782): 'OPC_RESFMT', (OPC_RESINFO:=783): 'OPC_RESINFO', (OPC_ATOMIC_ADD:=784): 'OPC_ATOMIC_ADD', (OPC_ATOMIC_SUB:=785): 'OPC_ATOMIC_SUB', (OPC_ATOMIC_XCHG:=786): 'OPC_ATOMIC_XCHG', (OPC_ATOMIC_INC:=787): 'OPC_ATOMIC_INC', (OPC_ATOMIC_DEC:=788): 'OPC_ATOMIC_DEC', (OPC_ATOMIC_CMPXCHG:=789): 'OPC_ATOMIC_CMPXCHG', (OPC_ATOMIC_MIN:=790): 'OPC_ATOMIC_MIN', (OPC_ATOMIC_MAX:=791): 'OPC_ATOMIC_MAX', (OPC_ATOMIC_AND:=792): 'OPC_ATOMIC_AND', (OPC_ATOMIC_OR:=793): 'OPC_ATOMIC_OR', (OPC_ATOMIC_XOR:=794): 'OPC_ATOMIC_XOR', (OPC_LDGB:=795): 'OPC_LDGB', (OPC_STGB:=796): 'OPC_STGB', (OPC_STIB:=797): 'OPC_STIB', (OPC_LDC:=798): 'OPC_LDC', (OPC_LDLV:=799): 'OPC_LDLV', (OPC_PIPR:=800): 'OPC_PIPR', (OPC_PIPC:=801): 'OPC_PIPC', (OPC_EMIT2:=802): 'OPC_EMIT2', (OPC_ENDLS:=803): 'OPC_ENDLS', (OPC_GETSPID:=804): 'OPC_GETSPID', (OPC_GETWID:=805): 'OPC_GETWID', (OPC_GETFIBERID:=806): 'OPC_GETFIBERID', (OPC_SHFL:=807): 'OPC_SHFL', (OPC_STC:=808): 'OPC_STC', (OPC_RESINFO_B:=809): 'OPC_RESINFO_B', (OPC_LDIB_B:=810): 'OPC_LDIB_B', (OPC_STIB_B:=811): 'OPC_STIB_B', (OPC_ATOMIC_B_ADD:=812): 'OPC_ATOMIC_B_ADD', (OPC_ATOMIC_B_SUB:=813): 'OPC_ATOMIC_B_SUB', (OPC_ATOMIC_B_XCHG:=814): 'OPC_ATOMIC_B_XCHG', (OPC_ATOMIC_B_INC:=815): 'OPC_ATOMIC_B_INC', (OPC_ATOMIC_B_DEC:=816): 'OPC_ATOMIC_B_DEC', (OPC_ATOMIC_B_CMPXCHG:=817): 'OPC_ATOMIC_B_CMPXCHG', (OPC_ATOMIC_B_MIN:=818): 'OPC_ATOMIC_B_MIN', (OPC_ATOMIC_B_MAX:=819): 'OPC_ATOMIC_B_MAX', (OPC_ATOMIC_B_AND:=820): 'OPC_ATOMIC_B_AND', (OPC_ATOMIC_B_OR:=821): 'OPC_ATOMIC_B_OR', (OPC_ATOMIC_B_XOR:=822): 'OPC_ATOMIC_B_XOR', (OPC_ATOMIC_S_ADD:=823): 'OPC_ATOMIC_S_ADD', (OPC_ATOMIC_S_SUB:=824): 'OPC_ATOMIC_S_SUB', (OPC_ATOMIC_S_XCHG:=825): 'OPC_ATOMIC_S_XCHG', (OPC_ATOMIC_S_INC:=826): 'OPC_ATOMIC_S_INC', (OPC_ATOMIC_S_DEC:=827): 'OPC_ATOMIC_S_DEC', (OPC_ATOMIC_S_CMPXCHG:=828): 'OPC_ATOMIC_S_CMPXCHG', (OPC_ATOMIC_S_MIN:=829): 'OPC_ATOMIC_S_MIN', (OPC_ATOMIC_S_MAX:=830): 'OPC_ATOMIC_S_MAX', (OPC_ATOMIC_S_AND:=831): 'OPC_ATOMIC_S_AND', (OPC_ATOMIC_S_OR:=832): 'OPC_ATOMIC_S_OR', (OPC_ATOMIC_S_XOR:=833): 'OPC_ATOMIC_S_XOR', (OPC_ATOMIC_G_ADD:=834): 'OPC_ATOMIC_G_ADD', (OPC_ATOMIC_G_SUB:=835): 'OPC_ATOMIC_G_SUB', (OPC_ATOMIC_G_XCHG:=836): 'OPC_ATOMIC_G_XCHG', (OPC_ATOMIC_G_INC:=837): 'OPC_ATOMIC_G_INC', (OPC_ATOMIC_G_DEC:=838): 'OPC_ATOMIC_G_DEC', (OPC_ATOMIC_G_CMPXCHG:=839): 'OPC_ATOMIC_G_CMPXCHG', (OPC_ATOMIC_G_MIN:=840): 'OPC_ATOMIC_G_MIN', (OPC_ATOMIC_G_MAX:=841): 'OPC_ATOMIC_G_MAX', (OPC_ATOMIC_G_AND:=842): 'OPC_ATOMIC_G_AND', (OPC_ATOMIC_G_OR:=843): 'OPC_ATOMIC_G_OR', (OPC_ATOMIC_G_XOR:=844): 'OPC_ATOMIC_G_XOR', (OPC_LDG_A:=845): 'OPC_LDG_A', (OPC_STG_A:=846): 'OPC_STG_A', (OPC_SPILL_MACRO:=847): 'OPC_SPILL_MACRO', (OPC_RELOAD_MACRO:=848): 'OPC_RELOAD_MACRO', (OPC_LDC_K:=849): 'OPC_LDC_K', (OPC_STSC:=850): 'OPC_STSC', (OPC_LDG_K:=851): 'OPC_LDG_K', (OPC_PUSH_CONSTS_LOAD_MACRO:=852): 'OPC_PUSH_CONSTS_LOAD_MACRO', (OPC_RAY_INTERSECTION:=858): 'OPC_RAY_INTERSECTION', (OPC_RESBASE:=859): 'OPC_RESBASE', (OPC_BAR:=896): 'OPC_BAR', (OPC_FENCE:=897): 'OPC_FENCE', (OPC_SLEEP:=898): 'OPC_SLEEP', (OPC_ICINV:=899): 'OPC_ICINV', (OPC_DCCLN:=900): 'OPC_DCCLN', (OPC_DCINV:=901): 'OPC_DCINV', (OPC_DCFLU:=902): 'OPC_DCFLU', (OPC_LOCK:=903): 'OPC_LOCK', (OPC_UNLOCK:=904): 'OPC_UNLOCK', (OPC_ALIAS:=905): 'OPC_ALIAS', (OPC_CCINV:=906): 'OPC_CCINV', (OPC_META_INPUT:=1024): 'OPC_META_INPUT', (OPC_META_SPLIT:=1026): 'OPC_META_SPLIT', (OPC_META_COLLECT:=1027): 'OPC_META_COLLECT', (OPC_META_TEX_PREFETCH:=1028): 'OPC_META_TEX_PREFETCH', (OPC_META_PARALLEL_COPY:=1029): 'OPC_META_PARALLEL_COPY', (OPC_META_PHI:=1030): 'OPC_META_PHI', (OPC_META_RAW:=1031): 'OPC_META_RAW'} +struct_ir3_sampler_prefetch.register_fields([('src', uint8_t, 0), ('bindless', ctypes.c_bool, 1), ('samp_id', uint8_t, 2), ('tex_id', uint8_t, 3), ('samp_bindless_id', uint16_t, 4), ('tex_bindless_id', uint16_t, 6), ('dst', uint8_t, 8), ('wrmask', uint8_t, 9), ('half_precision', uint8_t, 10), ('tex_opc', ctypes.c_uint32, 12)]) +@c.record +class struct_ir3_shader_key(c.Struct): + SIZE = 80 + ucp_enables: int + has_per_samp: int + sample_shading: int + msaa: int + rasterflat: int + tessellation: int + has_gs: int + tcs_store_primid: int + safe_constlen: int + force_dual_color_blend: int + _global: int + vsamples: int + fsamples: int + vastc_srgb: int + fastc_srgb: int + vsampler_swizzles: c.Array[ctypes.c_uint16, Literal[16]] + fsampler_swizzles: c.Array[ctypes.c_uint16, Literal[16]] +struct_ir3_shader_key.register_fields([('ucp_enables', ctypes.c_uint32, 0, 8, 0), ('has_per_samp', ctypes.c_uint32, 1, 1, 0), ('sample_shading', ctypes.c_uint32, 1, 1, 1), ('msaa', ctypes.c_uint32, 1, 1, 2), ('rasterflat', ctypes.c_uint32, 1, 1, 3), ('tessellation', ctypes.c_uint32, 1, 2, 4), ('has_gs', ctypes.c_uint32, 1, 1, 6), ('tcs_store_primid', ctypes.c_uint32, 1, 1, 7), ('safe_constlen', ctypes.c_uint32, 2, 1, 0), ('force_dual_color_blend', ctypes.c_uint32, 2, 1, 1), ('_global', uint32_t, 0), ('vsamples', uint32_t, 4), ('fsamples', uint32_t, 8), ('vastc_srgb', uint16_t, 12), ('fastc_srgb', uint16_t, 14), ('vsampler_swizzles', c.Array[uint16_t, Literal[16]], 16), ('fsampler_swizzles', c.Array[uint16_t, Literal[16]], 48)]) +@c.record +class struct_ir3_ibo_mapping(c.Struct): + SIZE = 98 + ssbo_to_tex: c.Array[ctypes.c_ubyte, Literal[32]] + image_to_tex: c.Array[ctypes.c_ubyte, Literal[32]] + tex_to_image: c.Array[ctypes.c_ubyte, Literal[32]] + num_tex: int + tex_base: int +struct_ir3_ibo_mapping.register_fields([('ssbo_to_tex', c.Array[uint8_t, Literal[32]], 0), ('image_to_tex', c.Array[uint8_t, Literal[32]], 32), ('tex_to_image', c.Array[uint8_t, Literal[32]], 64), ('num_tex', uint8_t, 96), ('tex_base', uint8_t, 97)]) +@c.record +class struct_ir3_disasm_info(c.Struct): + SIZE = 24 + write_disasm: bool + nir: c.POINTER[ctypes.c_char] + disasm: c.POINTER[ctypes.c_char] +struct_ir3_disasm_info.register_fields([('write_disasm', ctypes.c_bool, 0), ('nir', c.POINTER[ctypes.c_char], 8), ('disasm', c.POINTER[ctypes.c_char], 16)]) +@c.record +class struct_ir3_shader_nir_options(c.Struct): + SIZE = 4 + robust_modes: int +struct_ir3_shader_nir_options.register_fields([('robust_modes', ctypes.c_uint32, 0)]) +@c.record +class struct_ir3_shader_options(c.Struct): + SIZE = 228 + api_wavesize: int + real_wavesize: int + push_consts_type: int + push_consts_base: int + push_consts_dwords: int + const_allocs: struct_ir3_const_allocations + nir_options: struct_ir3_shader_nir_options + fragdata_dynamic_remap: bool +struct_ir3_shader_options.register_fields([('api_wavesize', ctypes.c_uint32, 0), ('real_wavesize', ctypes.c_uint32, 4), ('push_consts_type', ctypes.c_uint32, 8), ('push_consts_base', uint32_t, 12), ('push_consts_dwords', uint32_t, 16), ('const_allocs', struct_ir3_const_allocations, 20), ('nir_options', struct_ir3_shader_nir_options, 220), ('fragdata_dynamic_remap', ctypes.c_bool, 224)]) +@c.record +class struct_ir3_shader_output(c.Struct): + SIZE = 4 + slot: int + regid: int + view: int + aliased_components: int + half: bool +struct_ir3_shader_output.register_fields([('slot', uint8_t, 0), ('regid', uint8_t, 1), ('view', uint8_t, 2), ('aliased_components', uint8_t, 3, 4, 0), ('half', ctypes.c_bool, 3, 1, 4)]) +class struct_fd_bo(c.Struct): pass +@c.record +class struct_ir3(c.Struct): + SIZE = 152 + compiler: c.POINTER[struct_ir3_compiler] + type: int + inputs_count: int + inputs_sz: int + inputs: c.POINTER[c.POINTER[struct_ir3_instruction]] + baryfs_count: int + baryfs_sz: int + baryfs: c.POINTER[c.POINTER[struct_ir3_instruction]] + a0_users_count: int + a0_users_sz: int + a0_users: c.POINTER[c.POINTER[struct_ir3_instruction]] + a1_users_count: int + a1_users_sz: int + a1_users: c.POINTER[c.POINTER[struct_ir3_instruction]] + astc_srgb_count: int + astc_srgb_sz: int + astc_srgb: c.POINTER[c.POINTER[struct_ir3_instruction]] + tg4_count: int + tg4_sz: int + tg4: c.POINTER[c.POINTER[struct_ir3_instruction]] + block_list: struct_list_head + array_list: struct_list_head + instr_count: int +@c.record +class struct_ir3_instruction(c.Struct): + SIZE = 184 + block: c.POINTER[struct_ir3_block] + opc: int + flags: int + repeat: int + nop: int + srcs_count: int + dsts_count: int + dsts: c.POINTER[c.POINTER[struct_ir3_register]] + srcs: c.POINTER[c.POINTER[struct_ir3_register]] + cat0: struct_ir3_instruction_cat0 + cat1: struct_ir3_instruction_cat1 + cat2: struct_ir3_instruction_cat2 + cat3: struct_ir3_instruction_cat3 + cat5: struct_ir3_instruction_cat5 + cat6: struct_ir3_instruction_cat6 + cat7: struct_ir3_instruction_cat7 + split: struct_ir3_instruction_split + end: struct_ir3_instruction_end + phi: struct_ir3_instruction_phi + prefetch: struct_ir3_instruction_prefetch + input: struct_ir3_instruction_input + push_consts: struct_ir3_instruction_push_consts + raw: struct_ir3_instruction_raw + ip: int + data: ctypes.c_void_p + uses: c.POINTER[struct_set] + use_count: int + address: c.POINTER[struct_ir3_register] + deps_count: int + deps_sz: int + deps: c.POINTER[c.POINTER[struct_ir3_instruction]] + barrier_class: int + barrier_conflict: int + node: struct_list_head + rpt_node: struct_list_head + serialno: int + line: int +@c.record +class struct_ir3_block(c.Struct): + SIZE = 200 + node: struct_list_head + shader: c.POINTER[struct_ir3] + nblock: c.POINTER[struct_nir_block] + instr_list: struct_list_head + successors: c.Array[c.POINTER[struct_ir3_block], Literal[2]] + divergent_condition: bool + predecessors_count: int + predecessors_sz: int + predecessors: c.POINTER[c.POINTER[struct_ir3_block]] + physical_predecessors_count: int + physical_predecessors_sz: int + physical_predecessors: c.POINTER[c.POINTER[struct_ir3_block]] + physical_successors_count: int + physical_successors_sz: int + physical_successors: c.POINTER[c.POINTER[struct_ir3_block]] + start_ip: int + end_ip: int + reconvergence_point: bool + in_early_preamble: bool + keeps_count: int + keeps_sz: int + keeps: c.POINTER[c.POINTER[struct_ir3_instruction]] + data: ctypes.c_void_p + index: int + imm_dom: c.POINTER[struct_ir3_block] + dom_children_count: int + dom_children_sz: int + dom_children: c.POINTER[c.POINTER[struct_ir3_block]] + dom_pre_index: int + dom_post_index: int + loop_depth: int +struct_ir3_block.register_fields([('node', struct_list_head, 0), ('shader', c.POINTER[struct_ir3], 16), ('nblock', c.POINTER[struct_nir_block], 24), ('instr_list', struct_list_head, 32), ('successors', c.Array[c.POINTER[struct_ir3_block], Literal[2]], 48), ('divergent_condition', ctypes.c_bool, 64), ('predecessors_count', ctypes.c_uint32, 68), ('predecessors_sz', ctypes.c_uint32, 72), ('predecessors', c.POINTER[c.POINTER[struct_ir3_block]], 80), ('physical_predecessors_count', ctypes.c_uint32, 88), ('physical_predecessors_sz', ctypes.c_uint32, 92), ('physical_predecessors', c.POINTER[c.POINTER[struct_ir3_block]], 96), ('physical_successors_count', ctypes.c_uint32, 104), ('physical_successors_sz', ctypes.c_uint32, 108), ('physical_successors', c.POINTER[c.POINTER[struct_ir3_block]], 112), ('start_ip', uint16_t, 120), ('end_ip', uint16_t, 122), ('reconvergence_point', ctypes.c_bool, 124), ('in_early_preamble', ctypes.c_bool, 125), ('keeps_count', ctypes.c_uint32, 128), ('keeps_sz', ctypes.c_uint32, 132), ('keeps', c.POINTER[c.POINTER[struct_ir3_instruction]], 136), ('data', ctypes.c_void_p, 144), ('index', uint32_t, 152), ('imm_dom', c.POINTER[struct_ir3_block], 160), ('dom_children_count', ctypes.c_uint32, 168), ('dom_children_sz', ctypes.c_uint32, 172), ('dom_children', c.POINTER[c.POINTER[struct_ir3_block]], 176), ('dom_pre_index', uint32_t, 184), ('dom_post_index', uint32_t, 188), ('loop_depth', uint32_t, 192)]) +enum_ir3_instruction_flags: dict[int, str] = {(IR3_INSTR_SY:=1): 'IR3_INSTR_SY', (IR3_INSTR_SS:=2): 'IR3_INSTR_SS', (IR3_INSTR_JP:=4): 'IR3_INSTR_JP', (IR3_INSTR_EQ:=8): 'IR3_INSTR_EQ', (IR3_INSTR_UL:=16): 'IR3_INSTR_UL', (IR3_INSTR_3D:=32): 'IR3_INSTR_3D', (IR3_INSTR_A:=64): 'IR3_INSTR_A', (IR3_INSTR_O:=128): 'IR3_INSTR_O', (IR3_INSTR_P:=256): 'IR3_INSTR_P', (IR3_INSTR_S:=512): 'IR3_INSTR_S', (IR3_INSTR_S2EN:=1024): 'IR3_INSTR_S2EN', (IR3_INSTR_SAT:=2048): 'IR3_INSTR_SAT', (IR3_INSTR_B:=4096): 'IR3_INSTR_B', (IR3_INSTR_NONUNIF:=8192): 'IR3_INSTR_NONUNIF', (IR3_INSTR_A1EN:=16384): 'IR3_INSTR_A1EN', (IR3_INSTR_U:=32768): 'IR3_INSTR_U', (IR3_INSTR_MARK:=65536): 'IR3_INSTR_MARK', (IR3_INSTR_SHARED_SPILL:=65536): 'IR3_INSTR_SHARED_SPILL', (IR3_INSTR_UNUSED:=131072): 'IR3_INSTR_UNUSED', (IR3_INSTR_NEEDS_HELPERS:=262144): 'IR3_INSTR_NEEDS_HELPERS', (IR3_INSTR_V:=524288): 'IR3_INSTR_V', (IR3_INSTR_INV_1D:=1048576): 'IR3_INSTR_INV_1D', (IR3_INSTR_IMM_OFFSET:=2097152): 'IR3_INSTR_IMM_OFFSET'} +@c.record +class struct_ir3_register(c.Struct): + SIZE = 80 + flags: int + name: int + wrmask: int + size: int + num: int + iim_val: int + uim_val: int + fim_val: float + array: struct_ir3_register_array + instr: c.POINTER[struct_ir3_instruction] + _def: c.POINTER[struct_ir3_register] + tied: c.POINTER[struct_ir3_register] + spill_slot: int + next_use: int + merge_set_offset: int + merge_set: c.POINTER[struct_ir3_merge_set] + interval_start: int + interval_end: int +enum_ir3_register_flags: dict[int, str] = {(IR3_REG_CONST:=1): 'IR3_REG_CONST', (IR3_REG_IMMED:=2): 'IR3_REG_IMMED', (IR3_REG_HALF:=4): 'IR3_REG_HALF', (IR3_REG_SHARED:=8): 'IR3_REG_SHARED', (IR3_REG_RELATIV:=16): 'IR3_REG_RELATIV', (IR3_REG_R:=32): 'IR3_REG_R', (IR3_REG_FNEG:=64): 'IR3_REG_FNEG', (IR3_REG_FABS:=128): 'IR3_REG_FABS', (IR3_REG_SNEG:=256): 'IR3_REG_SNEG', (IR3_REG_SABS:=512): 'IR3_REG_SABS', (IR3_REG_BNOT:=1024): 'IR3_REG_BNOT', (IR3_REG_EI:=2048): 'IR3_REG_EI', (IR3_REG_SSA:=4096): 'IR3_REG_SSA', (IR3_REG_ARRAY:=8192): 'IR3_REG_ARRAY', (IR3_REG_KILL:=16384): 'IR3_REG_KILL', (IR3_REG_FIRST_KILL:=32768): 'IR3_REG_FIRST_KILL', (IR3_REG_UNUSED:=65536): 'IR3_REG_UNUSED', (IR3_REG_EARLY_CLOBBER:=131072): 'IR3_REG_EARLY_CLOBBER', (IR3_REG_LAST_USE:=262144): 'IR3_REG_LAST_USE', (IR3_REG_PREDICATE:=524288): 'IR3_REG_PREDICATE', (IR3_REG_RT:=1048576): 'IR3_REG_RT', (IR3_REG_ALIAS:=2097152): 'IR3_REG_ALIAS', (IR3_REG_FIRST_ALIAS:=4194304): 'IR3_REG_FIRST_ALIAS'} +@c.record +class struct_ir3_register_array(c.Struct): + SIZE = 6 + id: int + offset: int + base: int +struct_ir3_register_array.register_fields([('id', uint16_t, 0), ('offset', int16_t, 2), ('base', uint16_t, 4)]) +@c.record +class struct_ir3_merge_set(c.Struct): + SIZE = 32 + preferred_reg: int + size: int + alignment: int + interval_start: int + spill_slot: int + regs_count: int + regs: c.POINTER[c.POINTER[struct_ir3_register]] +struct_ir3_merge_set.register_fields([('preferred_reg', uint16_t, 0), ('size', uint16_t, 2), ('alignment', uint16_t, 4), ('interval_start', ctypes.c_uint32, 8), ('spill_slot', ctypes.c_uint32, 12), ('regs_count', ctypes.c_uint32, 16), ('regs', c.POINTER[c.POINTER[struct_ir3_register]], 24)]) +struct_ir3_register.register_fields([('flags', ctypes.c_uint32, 0), ('name', ctypes.c_uint32, 4), ('wrmask', ctypes.c_uint32, 8, 16, 0), ('size', ctypes.c_uint32, 10, 16, 0), ('num', uint16_t, 12), ('iim_val', int32_t, 16), ('uim_val', uint32_t, 16), ('fim_val', ctypes.c_float, 16), ('array', struct_ir3_register_array, 16), ('instr', c.POINTER[struct_ir3_instruction], 24), ('_def', c.POINTER[struct_ir3_register], 32), ('tied', c.POINTER[struct_ir3_register], 40), ('spill_slot', ctypes.c_uint32, 48), ('next_use', ctypes.c_uint32, 52), ('merge_set_offset', ctypes.c_uint32, 56), ('merge_set', c.POINTER[struct_ir3_merge_set], 64), ('interval_start', ctypes.c_uint32, 72), ('interval_end', ctypes.c_uint32, 76)]) +@c.record +class struct_ir3_instruction_cat0(c.Struct): + SIZE = 32 + inv1: bytes + inv2: bytes + immed: int + target: c.POINTER[struct_ir3_block] + target_label: c.POINTER[ctypes.c_char] + idx: int +struct_ir3_instruction_cat0.register_fields([('inv1', ctypes.c_char, 0), ('inv2', ctypes.c_char, 1), ('immed', ctypes.c_int32, 4), ('target', c.POINTER[struct_ir3_block], 8), ('target_label', c.POINTER[ctypes.c_char], 16), ('idx', ctypes.c_uint32, 24)]) +@c.record +class struct_ir3_instruction_cat1(c.Struct): + SIZE = 16 + src_type: int + dst_type: int + round: int + reduce_op: int +round_t: dict[int, str] = {(ROUND_ZERO:=0): 'ROUND_ZERO', (ROUND_EVEN:=1): 'ROUND_EVEN', (ROUND_POS_INF:=2): 'ROUND_POS_INF', (ROUND_NEG_INF:=3): 'ROUND_NEG_INF'} +reduce_op_t: dict[int, str] = {(REDUCE_OP_ADD_U:=0): 'REDUCE_OP_ADD_U', (REDUCE_OP_ADD_F:=1): 'REDUCE_OP_ADD_F', (REDUCE_OP_MUL_U:=2): 'REDUCE_OP_MUL_U', (REDUCE_OP_MUL_F:=3): 'REDUCE_OP_MUL_F', (REDUCE_OP_MIN_U:=4): 'REDUCE_OP_MIN_U', (REDUCE_OP_MIN_S:=5): 'REDUCE_OP_MIN_S', (REDUCE_OP_MIN_F:=6): 'REDUCE_OP_MIN_F', (REDUCE_OP_MAX_U:=7): 'REDUCE_OP_MAX_U', (REDUCE_OP_MAX_S:=8): 'REDUCE_OP_MAX_S', (REDUCE_OP_MAX_F:=9): 'REDUCE_OP_MAX_F', (REDUCE_OP_AND_B:=10): 'REDUCE_OP_AND_B', (REDUCE_OP_OR_B:=11): 'REDUCE_OP_OR_B', (REDUCE_OP_XOR_B:=12): 'REDUCE_OP_XOR_B'} +struct_ir3_instruction_cat1.register_fields([('src_type', ctypes.c_uint32, 0), ('dst_type', ctypes.c_uint32, 4), ('round', ctypes.c_uint32, 8), ('reduce_op', ctypes.c_uint32, 12)]) +@c.record +class struct_ir3_instruction_cat2(c.Struct): + SIZE = 4 + condition: int +struct_ir3_instruction_cat2_condition: dict[int, str] = {(IR3_COND_LT:=0): 'IR3_COND_LT', (IR3_COND_LE:=1): 'IR3_COND_LE', (IR3_COND_GT:=2): 'IR3_COND_GT', (IR3_COND_GE:=3): 'IR3_COND_GE', (IR3_COND_EQ:=4): 'IR3_COND_EQ', (IR3_COND_NE:=5): 'IR3_COND_NE'} +struct_ir3_instruction_cat2.register_fields([('condition', ctypes.c_uint32, 0)]) +@c.record +class struct_ir3_instruction_cat3(c.Struct): + SIZE = 12 + signedness: int + packed: int + swapped: bool +struct_ir3_instruction_cat3_signedness: dict[int, str] = {(IR3_SRC_UNSIGNED:=0): 'IR3_SRC_UNSIGNED', (IR3_SRC_MIXED:=1): 'IR3_SRC_MIXED'} +struct_ir3_instruction_cat3_packed: dict[int, str] = {(IR3_SRC_PACKED_LOW:=0): 'IR3_SRC_PACKED_LOW', (IR3_SRC_PACKED_HIGH:=1): 'IR3_SRC_PACKED_HIGH'} +struct_ir3_instruction_cat3.register_fields([('signedness', ctypes.c_uint32, 0), ('packed', ctypes.c_uint32, 4), ('swapped', ctypes.c_bool, 8)]) +@c.record +class struct_ir3_instruction_cat5(c.Struct): + SIZE = 16 + samp: int + tex: int + tex_base: int + cluster_size: int + type: int +struct_ir3_instruction_cat5.register_fields([('samp', ctypes.c_uint32, 0), ('tex', ctypes.c_uint32, 4), ('tex_base', ctypes.c_uint32, 8, 3, 0), ('cluster_size', ctypes.c_uint32, 8, 4, 3), ('type', ctypes.c_uint32, 12)]) +@c.record +class struct_ir3_instruction_cat6(c.Struct): + SIZE = 16 + type: int + dst_offset: int + iim_val: int + d: int + typed: bool + base: int + shfl_mode: int +ir3_shfl_mode: dict[int, str] = {(SHFL_XOR:=1): 'SHFL_XOR', (SHFL_UP:=2): 'SHFL_UP', (SHFL_DOWN:=3): 'SHFL_DOWN', (SHFL_RUP:=6): 'SHFL_RUP', (SHFL_RDOWN:=7): 'SHFL_RDOWN'} +struct_ir3_instruction_cat6.register_fields([('type', ctypes.c_uint32, 0), ('dst_offset', ctypes.c_int32, 4), ('iim_val', ctypes.c_int32, 8), ('d', ctypes.c_uint32, 12, 3, 0), ('typed', ctypes.c_bool, 12, 1, 3), ('base', ctypes.c_uint32, 12, 3, 4), ('shfl_mode', ctypes.c_uint32, 12, 3, 7)]) +@c.record +class struct_ir3_instruction_cat7(c.Struct): + SIZE = 16 + w: int + r: int + l: int + g: int + alias_scope: int + alias_table_size_minus_one: int + alias_type_float: bool +ir3_alias_scope: dict[int, str] = {(ALIAS_TEX:=0): 'ALIAS_TEX', (ALIAS_RT:=1): 'ALIAS_RT', (ALIAS_MEM:=2): 'ALIAS_MEM'} +struct_ir3_instruction_cat7.register_fields([('w', ctypes.c_uint32, 0, 1, 0), ('r', ctypes.c_uint32, 0, 1, 1), ('l', ctypes.c_uint32, 0, 1, 2), ('g', ctypes.c_uint32, 0, 1, 3), ('alias_scope', ctypes.c_uint32, 4), ('alias_table_size_minus_one', ctypes.c_uint32, 8), ('alias_type_float', ctypes.c_bool, 12)]) +@c.record +class struct_ir3_instruction_split(c.Struct): + SIZE = 4 + off: int +struct_ir3_instruction_split.register_fields([('off', ctypes.c_int32, 0)]) +@c.record +class struct_ir3_instruction_end(c.Struct): + SIZE = 8 + outidxs: c.POINTER[ctypes.c_uint32] +struct_ir3_instruction_end.register_fields([('outidxs', c.POINTER[ctypes.c_uint32], 0)]) +@c.record +class struct_ir3_instruction_phi(c.Struct): + SIZE = 16 + nphi: ctypes.c_void_p + comp: int +struct_ir3_instruction_phi.register_fields([('nphi', ctypes.c_void_p, 0), ('comp', ctypes.c_uint32, 8)]) +@c.record +class struct_ir3_instruction_prefetch(c.Struct): + SIZE = 16 + samp: int + tex: int + input_offset: int + samp_base: int + tex_base: int +struct_ir3_instruction_prefetch.register_fields([('samp', ctypes.c_uint32, 0), ('tex', ctypes.c_uint32, 4), ('input_offset', ctypes.c_uint32, 8), ('samp_base', ctypes.c_uint32, 12, 3, 0), ('tex_base', ctypes.c_uint32, 12, 3, 3)]) +@c.record +class struct_ir3_instruction_input(c.Struct): + SIZE = 8 + inidx: int + sysval: int +struct_ir3_instruction_input.register_fields([('inidx', ctypes.c_int32, 0), ('sysval', ctypes.c_uint32, 4)]) +@c.record +class struct_ir3_instruction_push_consts(c.Struct): + SIZE = 12 + src_base: int + src_size: int + dst_base: int +struct_ir3_instruction_push_consts.register_fields([('src_base', ctypes.c_uint32, 0), ('src_size', ctypes.c_uint32, 4), ('dst_base', ctypes.c_uint32, 8)]) +@c.record +class struct_ir3_instruction_raw(c.Struct): + SIZE = 8 + value: int +struct_ir3_instruction_raw.register_fields([('value', uint64_t, 0)]) +struct_ir3_instruction_barrier_class: dict[int, str] = {(IR3_BARRIER_EVERYTHING:=1): 'IR3_BARRIER_EVERYTHING', (IR3_BARRIER_SHARED_R:=2): 'IR3_BARRIER_SHARED_R', (IR3_BARRIER_SHARED_W:=4): 'IR3_BARRIER_SHARED_W', (IR3_BARRIER_IMAGE_R:=8): 'IR3_BARRIER_IMAGE_R', (IR3_BARRIER_IMAGE_W:=16): 'IR3_BARRIER_IMAGE_W', (IR3_BARRIER_BUFFER_R:=32): 'IR3_BARRIER_BUFFER_R', (IR3_BARRIER_BUFFER_W:=64): 'IR3_BARRIER_BUFFER_W', (IR3_BARRIER_ARRAY_R:=128): 'IR3_BARRIER_ARRAY_R', (IR3_BARRIER_ARRAY_W:=256): 'IR3_BARRIER_ARRAY_W', (IR3_BARRIER_PRIVATE_R:=512): 'IR3_BARRIER_PRIVATE_R', (IR3_BARRIER_PRIVATE_W:=1024): 'IR3_BARRIER_PRIVATE_W', (IR3_BARRIER_CONST_W:=2048): 'IR3_BARRIER_CONST_W', (IR3_BARRIER_ACTIVE_FIBERS_R:=4096): 'IR3_BARRIER_ACTIVE_FIBERS_R', (IR3_BARRIER_ACTIVE_FIBERS_W:=8192): 'IR3_BARRIER_ACTIVE_FIBERS_W'} +struct_ir3_instruction.register_fields([('block', c.POINTER[struct_ir3_block], 0), ('opc', ctypes.c_uint32, 8), ('flags', ctypes.c_uint32, 12), ('repeat', uint8_t, 16), ('nop', uint8_t, 17), ('srcs_count', ctypes.c_uint32, 20), ('dsts_count', ctypes.c_uint32, 24), ('dsts', c.POINTER[c.POINTER[struct_ir3_register]], 32), ('srcs', c.POINTER[c.POINTER[struct_ir3_register]], 40), ('cat0', struct_ir3_instruction_cat0, 48), ('cat1', struct_ir3_instruction_cat1, 48), ('cat2', struct_ir3_instruction_cat2, 48), ('cat3', struct_ir3_instruction_cat3, 48), ('cat5', struct_ir3_instruction_cat5, 48), ('cat6', struct_ir3_instruction_cat6, 48), ('cat7', struct_ir3_instruction_cat7, 48), ('split', struct_ir3_instruction_split, 48), ('end', struct_ir3_instruction_end, 48), ('phi', struct_ir3_instruction_phi, 48), ('prefetch', struct_ir3_instruction_prefetch, 48), ('input', struct_ir3_instruction_input, 48), ('push_consts', struct_ir3_instruction_push_consts, 48), ('raw', struct_ir3_instruction_raw, 48), ('ip', uint32_t, 80), ('data', ctypes.c_void_p, 88), ('uses', c.POINTER[struct_set], 96), ('use_count', ctypes.c_int32, 104), ('address', c.POINTER[struct_ir3_register], 112), ('deps_count', ctypes.c_uint32, 120), ('deps_sz', ctypes.c_uint32, 124), ('deps', c.POINTER[c.POINTER[struct_ir3_instruction]], 128), ('barrier_class', ctypes.c_uint32, 136), ('barrier_conflict', ctypes.c_uint32, 140), ('node', struct_list_head, 144), ('rpt_node', struct_list_head, 160), ('serialno', uint32_t, 176), ('line', ctypes.c_int32, 180)]) +struct_ir3.register_fields([('compiler', c.POINTER[struct_ir3_compiler], 0), ('type', gl_shader_stage, 8), ('inputs_count', ctypes.c_uint32, 12), ('inputs_sz', ctypes.c_uint32, 16), ('inputs', c.POINTER[c.POINTER[struct_ir3_instruction]], 24), ('baryfs_count', ctypes.c_uint32, 32), ('baryfs_sz', ctypes.c_uint32, 36), ('baryfs', c.POINTER[c.POINTER[struct_ir3_instruction]], 40), ('a0_users_count', ctypes.c_uint32, 48), ('a0_users_sz', ctypes.c_uint32, 52), ('a0_users', c.POINTER[c.POINTER[struct_ir3_instruction]], 56), ('a1_users_count', ctypes.c_uint32, 64), ('a1_users_sz', ctypes.c_uint32, 68), ('a1_users', c.POINTER[c.POINTER[struct_ir3_instruction]], 72), ('astc_srgb_count', ctypes.c_uint32, 80), ('astc_srgb_sz', ctypes.c_uint32, 84), ('astc_srgb', c.POINTER[c.POINTER[struct_ir3_instruction]], 88), ('tg4_count', ctypes.c_uint32, 96), ('tg4_sz', ctypes.c_uint32, 100), ('tg4', c.POINTER[c.POINTER[struct_ir3_instruction]], 104), ('block_list', struct_list_head, 112), ('array_list', struct_list_head, 128), ('instr_count', ctypes.c_uint32, 144)]) +@c.record +class struct_ir3_info(c.Struct): + SIZE = 64 + size: int + constant_data_offset: int + sizedwords: int + instrs_count: int + preamble_instrs_count: int + nops_count: int + mov_count: int + cov_count: int + stp_count: int + ldp_count: int + max_reg: int + max_half_reg: int + max_const: int + max_waves: int + subgroup_size: int + double_threadsize: bool + multi_dword_ldp_stp: bool + early_preamble: bool + uses_ray_intersection: bool + ss: int + sy: int + sstall: int + systall: int + last_baryf: int + last_helper: int + instrs_per_cat: c.Array[ctypes.c_uint16, Literal[8]] +struct_ir3_info.register_fields([('size', uint32_t, 0), ('constant_data_offset', uint32_t, 4), ('sizedwords', uint16_t, 8), ('instrs_count', uint16_t, 10), ('preamble_instrs_count', uint16_t, 12), ('nops_count', uint16_t, 14), ('mov_count', uint16_t, 16), ('cov_count', uint16_t, 18), ('stp_count', uint16_t, 20), ('ldp_count', uint16_t, 22), ('max_reg', int8_t, 24), ('max_half_reg', int8_t, 25), ('max_const', int16_t, 26), ('max_waves', int8_t, 28), ('subgroup_size', uint8_t, 29), ('double_threadsize', ctypes.c_bool, 30), ('multi_dword_ldp_stp', ctypes.c_bool, 31), ('early_preamble', ctypes.c_bool, 32), ('uses_ray_intersection', ctypes.c_bool, 33), ('ss', uint16_t, 34), ('sy', uint16_t, 36), ('sstall', uint16_t, 38), ('systall', uint16_t, 40), ('last_baryf', uint16_t, 42), ('last_helper', uint16_t, 44), ('instrs_per_cat', c.Array[uint16_t, Literal[8]], 46)]) +@c.record +class struct_ir3_shader_variant_input(c.Struct): + SIZE = 5 + slot: int + regid: int + compmask: int + inloc: int + sysval: bool + bary: bool + rasterflat: bool + half: bool + flat: bool +struct_ir3_shader_variant_input.register_fields([('slot', uint8_t, 0), ('regid', uint8_t, 1), ('compmask', uint8_t, 2), ('inloc', uint8_t, 3), ('sysval', ctypes.c_bool, 4, 1, 0), ('bary', ctypes.c_bool, 4, 1, 1), ('rasterflat', ctypes.c_bool, 4, 1, 2), ('half', ctypes.c_bool, 4, 1, 3), ('flat', ctypes.c_bool, 4, 1, 4)]) +@c.record +class struct_ir3_shader_variant_astc_srgb(c.Struct): + SIZE = 72 + base: int + count: int + orig_idx: c.Array[ctypes.c_uint32, Literal[16]] +struct_ir3_shader_variant_astc_srgb.register_fields([('base', ctypes.c_uint32, 0), ('count', ctypes.c_uint32, 4), ('orig_idx', c.Array[ctypes.c_uint32, Literal[16]], 8)]) +@c.record +class struct_ir3_shader_variant_tg4(c.Struct): + SIZE = 72 + base: int + count: int + orig_idx: c.Array[ctypes.c_uint32, Literal[16]] +struct_ir3_shader_variant_tg4.register_fields([('base', ctypes.c_uint32, 0), ('count', ctypes.c_uint32, 4), ('orig_idx', c.Array[ctypes.c_uint32, Literal[16]], 8)]) +@c.record +class struct_ir3_shader_variant_tess(c.Struct): + SIZE = 8 + primitive_mode: int + tcs_vertices_out: int + spacing: int + ccw: bool + point_mode: bool +enum_gl_tess_spacing: dict[int, str] = {(TESS_SPACING_UNSPECIFIED:=0): 'TESS_SPACING_UNSPECIFIED', (TESS_SPACING_EQUAL:=1): 'TESS_SPACING_EQUAL', (TESS_SPACING_FRACTIONAL_ODD:=2): 'TESS_SPACING_FRACTIONAL_ODD', (TESS_SPACING_FRACTIONAL_EVEN:=3): 'TESS_SPACING_FRACTIONAL_EVEN'} +struct_ir3_shader_variant_tess.register_fields([('primitive_mode', ctypes.c_uint32, 0), ('tcs_vertices_out', uint8_t, 4), ('spacing', ctypes.c_uint32, 5, 2, 0), ('ccw', ctypes.c_bool, 5, 1, 2), ('point_mode', ctypes.c_bool, 5, 1, 3)]) +@c.record +class struct_ir3_shader_variant_gs(c.Struct): + SIZE = 6 + output_primitive: int + vertices_out: int + invocations: int + vertices_in: int +struct_ir3_shader_variant_gs.register_fields([('output_primitive', uint16_t, 0), ('vertices_out', uint16_t, 2), ('invocations', uint8_t, 4), ('vertices_in', uint8_t, 5, 3, 0)]) +@c.record +class struct_ir3_shader_variant_fs(c.Struct): + SIZE = 8 + early_fragment_tests: bool + color_is_dual_source: bool + uses_fbfetch_output: bool + fbfetch_coherent: bool + depth_layout: int +struct_ir3_shader_variant_fs.register_fields([('early_fragment_tests', ctypes.c_bool, 0, 1, 0), ('color_is_dual_source', ctypes.c_bool, 0, 1, 1), ('uses_fbfetch_output', ctypes.c_bool, 0, 1, 2), ('fbfetch_coherent', ctypes.c_bool, 0, 1, 3), ('depth_layout', ctypes.c_uint32, 4)]) +@c.record +class struct_ir3_shader_variant_cs(c.Struct): + SIZE = 16 + req_local_mem: int + force_linear_dispatch: bool + local_invocation_id: int + work_group_id: int +struct_ir3_shader_variant_cs.register_fields([('req_local_mem', ctypes.c_uint32, 0), ('force_linear_dispatch', ctypes.c_bool, 4), ('local_invocation_id', uint32_t, 8), ('work_group_id', uint32_t, 12)]) +struct_ir3_shader_variant.register_fields([('bo', c.POINTER[struct_fd_bo], 0), ('id', uint32_t, 8), ('shader_id', uint32_t, 12), ('key', struct_ir3_shader_key, 16), ('binning_pass', ctypes.c_bool, 96), ('binning', c.POINTER[struct_ir3_shader_variant], 104), ('nonbinning', c.POINTER[struct_ir3_shader_variant], 112), ('ir', c.POINTER[struct_ir3], 120), ('next', c.POINTER[struct_ir3_shader_variant], 128), ('type', gl_shader_stage, 136), ('compiler', c.POINTER[struct_ir3_compiler], 144), ('name', c.POINTER[ctypes.c_char], 152), ('constant_data', ctypes.c_void_p, 160), ('disasm_info', struct_ir3_disasm_info, 168), ('bin', c.POINTER[uint32_t], 192), ('const_state', c.POINTER[struct_ir3_const_state], 200), ('imm_state', struct_ir3_imm_const_state, 208), ('info', struct_ir3_info, 224), ('sha1_str', c.Array[ctypes.c_char, Literal[41]], 288), ('shader_options', struct_ir3_shader_options, 332), ('constant_data_size', uint32_t, 560), ('branchstack', ctypes.c_uint32, 564), ('loops', ctypes.c_uint32, 568), ('instrlen', ctypes.c_uint32, 572), ('constlen', ctypes.c_uint32, 576), ('pvtmem_size', ctypes.c_uint32, 580), ('pvtmem_per_wave', ctypes.c_bool, 584), ('multi_pos_output', ctypes.c_bool, 585), ('dual_src_blend', ctypes.c_bool, 586), ('early_preamble', ctypes.c_bool, 587), ('shared_size', ctypes.c_uint32, 588), ('frag_face', ctypes.c_bool, 592), ('color0_mrt', ctypes.c_bool, 593), ('fragcoord_compmask', uint8_t, 594), ('outputs_count', ctypes.c_uint32, 596), ('outputs', c.Array[struct_ir3_shader_output, Literal[34]], 600), ('writes_pos', ctypes.c_bool, 736), ('writes_smask', ctypes.c_bool, 737), ('writes_psize', ctypes.c_bool, 738), ('writes_viewport', ctypes.c_bool, 739), ('writes_stencilref', ctypes.c_bool, 740), ('writes_shading_rate', ctypes.c_bool, 741), ('output_size', uint32_t, 744), ('input_size', uint32_t, 748), ('output_loc', c.Array[ctypes.c_uint32, Literal[45]], 752), ('inputs_count', ctypes.c_uint32, 932), ('inputs', c.Array[struct_ir3_shader_variant_input, Literal[34]], 936), ('reads_primid', ctypes.c_bool, 1106), ('reads_shading_rate', ctypes.c_bool, 1107), ('reads_smask', ctypes.c_bool, 1108), ('total_in', ctypes.c_uint32, 1112), ('sysval_in', ctypes.c_uint32, 1116), ('varying_in', ctypes.c_uint32, 1120), ('image_mapping', struct_ir3_ibo_mapping, 1124), ('num_samp', ctypes.c_int32, 1224), ('fb_read', ctypes.c_bool, 1228), ('has_ssbo', ctypes.c_bool, 1229), ('bindless_tex', ctypes.c_bool, 1230), ('bindless_samp', ctypes.c_bool, 1231), ('bindless_ibo', ctypes.c_bool, 1232), ('bindless_ubo', ctypes.c_bool, 1233), ('need_pixlod', ctypes.c_bool, 1234), ('need_full_quad', ctypes.c_bool, 1235), ('need_driver_params', ctypes.c_bool, 1236), ('no_earlyz', ctypes.c_bool, 1237), ('has_kill', ctypes.c_bool, 1238), ('per_samp', ctypes.c_bool, 1239), ('post_depth_coverage', ctypes.c_bool, 1240), ('empty', ctypes.c_bool, 1241), ('writes_only_color', ctypes.c_bool, 1242), ('mergedregs', ctypes.c_bool, 1243), ('clip_mask', uint8_t, 1244), ('cull_mask', uint8_t, 1245), ('astc_srgb', struct_ir3_shader_variant_astc_srgb, 1248), ('tg4', struct_ir3_shader_variant_tg4, 1320), ('num_sampler_prefetch', uint32_t, 1392), ('sampler_prefetch', c.Array[struct_ir3_sampler_prefetch, Literal[4]], 1396), ('prefetch_bary_type', ctypes.c_uint32, 1460), ('prefetch_end_of_quad', ctypes.c_bool, 1464), ('local_size', c.Array[uint16_t, Literal[3]], 1466), ('local_size_variable', ctypes.c_bool, 1472), ('has_barrier', ctypes.c_bool, 1473), ('num_ssbos', ctypes.c_uint32, 1476), ('num_uavs', ctypes.c_uint32, 1480), ('tess', struct_ir3_shader_variant_tess, 1484), ('gs', struct_ir3_shader_variant_gs, 1484), ('fs', struct_ir3_shader_variant_fs, 1484), ('cs', struct_ir3_shader_variant_cs, 1484), ('vtxid_base', uint32_t, 1500), ('stream_output', struct_ir3_stream_output_info, 1504)]) +@c.record +class struct_ir3_shader_cs(c.Struct): + SIZE = 8 + req_local_mem: int + force_linear_dispatch: bool +struct_ir3_shader_cs.register_fields([('req_local_mem', ctypes.c_uint32, 0), ('force_linear_dispatch', ctypes.c_bool, 4)]) +@c.record +class struct_ir3_shader_vs(c.Struct): + SIZE = 264 + passthrough_tcs_compiled: int + passthrough_tcs: c.Array[c.POINTER[struct_ir3_shader], Literal[32]] +struct_ir3_shader_vs.register_fields([('passthrough_tcs_compiled', ctypes.c_uint32, 0), ('passthrough_tcs', c.Array[c.POINTER[struct_ir3_shader], Literal[32]], 8)]) +@c.record +class pthread_mutex_t(c.Struct): + SIZE = 40 + __data: struct___pthread_mutex_s + __size: c.Array[ctypes.c_char, Literal[40]] + __align: int +mtx_t: TypeAlias = pthread_mutex_t +@c.record +class struct___pthread_mutex_s(c.Struct): + SIZE = 40 + __lock: int + __count: int + __owner: int + __nusers: int + __kind: int + __spins: int + __elision: int + __list: struct___pthread_internal_list +@c.record +class struct___pthread_internal_list(c.Struct): + SIZE = 16 + __prev: c.POINTER[struct___pthread_internal_list] + __next: c.POINTER[struct___pthread_internal_list] +__pthread_list_t: TypeAlias = struct___pthread_internal_list +struct___pthread_internal_list.register_fields([('__prev', c.POINTER[struct___pthread_internal_list], 0), ('__next', c.POINTER[struct___pthread_internal_list], 8)]) +struct___pthread_mutex_s.register_fields([('__lock', ctypes.c_int32, 0), ('__count', ctypes.c_uint32, 4), ('__owner', ctypes.c_int32, 8), ('__nusers', ctypes.c_uint32, 12), ('__kind', ctypes.c_int32, 16), ('__spins', ctypes.c_int16, 20), ('__elision', ctypes.c_int16, 22), ('__list', struct___pthread_internal_list, 24)]) +pthread_mutex_t.register_fields([('__data', struct___pthread_mutex_s, 0), ('__size', c.Array[ctypes.c_char, Literal[40]], 0), ('__align', ctypes.c_int64, 0)]) +cache_key: TypeAlias = c.Array[ctypes.c_ubyte, Literal[20]] +struct_ir3_shader.register_fields([('type', gl_shader_stage, 0), ('id', uint32_t, 4), ('variant_count', uint32_t, 8), ('initial_variants_done', ctypes.c_bool, 12), ('compiler', c.POINTER[struct_ir3_compiler], 16), ('options', struct_ir3_shader_options, 24), ('nir_finalized', ctypes.c_bool, 252), ('nir', c.POINTER[struct_nir_shader], 256), ('stream_output', struct_ir3_stream_output_info, 264), ('cs', struct_ir3_shader_cs, 800), ('vs', struct_ir3_shader_vs, 800), ('variants', c.POINTER[struct_ir3_shader_variant], 1064), ('variants_lock', mtx_t, 1072), ('cache_key', cache_key, 1112), ('key_mask', struct_ir3_shader_key, 1132)]) +@dll.bind(ctypes.c_bool, c.POINTER[struct_ir3_shader_variant], ctypes.c_uint32) +def ir3_const_ensure_imm_size(v:c.POINTER[struct_ir3_shader_variant], size:int) -> bool: ... +@dll.bind(uint16_t, c.POINTER[struct_ir3_const_state], ctypes.c_uint32) +def ir3_const_imm_index_to_reg(const_state:c.POINTER[struct_ir3_const_state], i:int) -> uint16_t: ... +@dll.bind(uint16_t, c.POINTER[struct_ir3_shader_variant], uint32_t) +def ir3_const_find_imm(v:c.POINTER[struct_ir3_shader_variant], imm:uint32_t) -> uint16_t: ... +@dll.bind(uint16_t, c.POINTER[struct_ir3_shader_variant], uint32_t) +def ir3_const_add_imm(v:c.POINTER[struct_ir3_shader_variant], imm:uint32_t) -> uint16_t: ... +@dll.bind(ctypes.c_void_p, c.POINTER[struct_ir3_shader_variant]) +def ir3_shader_assemble(v:c.POINTER[struct_ir3_shader_variant]) -> ctypes.c_void_p: ... +@dll.bind(c.POINTER[struct_ir3_shader_variant], c.POINTER[struct_ir3_shader], c.POINTER[struct_ir3_shader_key], ctypes.c_bool) +def ir3_shader_create_variant(shader:c.POINTER[struct_ir3_shader], key:c.POINTER[struct_ir3_shader_key], keep_ir:bool) -> c.POINTER[struct_ir3_shader_variant]: ... +@dll.bind(c.POINTER[struct_ir3_shader_variant], c.POINTER[struct_ir3_shader], c.POINTER[struct_ir3_shader_key], ctypes.c_bool, ctypes.c_bool, c.POINTER[ctypes.c_bool]) +def ir3_shader_get_variant(shader:c.POINTER[struct_ir3_shader], key:c.POINTER[struct_ir3_shader_key], binning_pass:bool, keep_ir:bool, created:c.POINTER[ctypes.c_bool]) -> c.POINTER[struct_ir3_shader_variant]: ... +@dll.bind(c.POINTER[struct_ir3_shader], c.POINTER[struct_ir3_compiler], c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_options], c.POINTER[struct_ir3_stream_output_info]) +def ir3_shader_from_nir(compiler:c.POINTER[struct_ir3_compiler], nir:c.POINTER[nir_shader], options:c.POINTER[struct_ir3_shader_options], stream_output:c.POINTER[struct_ir3_stream_output_info]) -> c.POINTER[struct_ir3_shader]: ... +@dll.bind(uint32_t, c.POINTER[c.POINTER[struct_ir3_shader_variant]], c.POINTER[struct_ir3_compiler]) +def ir3_trim_constlen(variants:c.POINTER[c.POINTER[struct_ir3_shader_variant]], compiler:c.POINTER[struct_ir3_compiler]) -> uint32_t: ... +@dll.bind(c.POINTER[struct_ir3_shader], c.POINTER[struct_ir3_shader], ctypes.c_uint32) +def ir3_shader_passthrough_tcs(vs:c.POINTER[struct_ir3_shader], patch_vertices:int) -> c.POINTER[struct_ir3_shader]: ... +@dll.bind(None, c.POINTER[struct_ir3_shader]) +def ir3_shader_destroy(shader:c.POINTER[struct_ir3_shader]) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_shader_variant], c.POINTER[uint32_t], c.POINTER[FILE]) +def ir3_shader_disasm(so:c.POINTER[struct_ir3_shader_variant], bin:c.POINTER[uint32_t], out:c.POINTER[FILE]) -> None: ... +@dll.bind(uint64_t, c.POINTER[struct_ir3_shader]) +def ir3_shader_outputs(so:c.POINTER[struct_ir3_shader]) -> uint64_t: ... +@dll.bind(ctypes.c_int32, c.POINTER[struct_glsl_type], ctypes.c_bool) +def ir3_glsl_type_size(type:c.POINTER[struct_glsl_type], bindless:bool) -> int: ... +@dll.bind(None, c.POINTER[struct_ir3_compiler], c.POINTER[struct_ir3_shader_options], gl_shader_stage, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def ir3_shader_get_subgroup_size(compiler:c.POINTER[struct_ir3_compiler], options:c.POINTER[struct_ir3_shader_options], stage:gl_shader_stage, subgroup_size:c.POINTER[ctypes.c_uint32], max_subgroup_size:c.POINTER[ctypes.c_uint32]) -> None: ... +@c.record +class struct_ir3_shader_linkage(c.Struct): + SIZE = 152 + max_loc: int + cnt: int + varmask: c.Array[ctypes.c_uint32, Literal[4]] + var: c.Array[struct_ir3_shader_linkage_var, Literal[32]] + primid_loc: int + viewid_loc: int + clip0_loc: int + clip1_loc: int +@c.record +class struct_ir3_shader_linkage_var(c.Struct): + SIZE = 4 + slot: int + regid: int + compmask: int + loc: int +struct_ir3_shader_linkage_var.register_fields([('slot', uint8_t, 0), ('regid', uint8_t, 1), ('compmask', uint8_t, 2), ('loc', uint8_t, 3)]) +struct_ir3_shader_linkage.register_fields([('max_loc', uint8_t, 0), ('cnt', uint8_t, 1), ('varmask', c.Array[uint32_t, Literal[4]], 4), ('var', c.Array[struct_ir3_shader_linkage_var, Literal[32]], 20), ('primid_loc', uint8_t, 148), ('viewid_loc', uint8_t, 149), ('clip0_loc', uint8_t, 150), ('clip1_loc', uint8_t, 151)]) +@dll.bind(None, c.POINTER[FILE], c.POINTER[ctypes.c_uint32], size_t) +def print_raw(out:c.POINTER[FILE], data:c.POINTER[ctypes.c_uint32], size:size_t) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_shader_linkage], c.POINTER[struct_ir3_shader_variant]) +def ir3_link_stream_out(l:c.POINTER[struct_ir3_shader_linkage], v:c.POINTER[struct_ir3_shader_variant]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_apply_trig_workarounds(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_imul(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_io_offsets(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_load_barycentric_at_sample(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_load_barycentric_at_offset(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_lower_push_consts_to_preamble(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_lower_driver_params_to_ubo(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_move_varying_inputs(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_int32, c.POINTER[nir_def], c.POINTER[ctypes.c_uint32]) +def ir3_nir_coord_offset(ssa:c.POINTER[nir_def], bary_type:c.POINTER[ctypes.c_uint32]) -> int: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[ctypes.c_uint32]) +def ir3_nir_lower_tex_prefetch(shader:c.POINTER[nir_shader], prefetch_bary_type:c.POINTER[ctypes.c_uint32]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_layer_id(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_frag_shading_rate(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_primitive_shading_rate(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant], ctypes.c_uint32) +def ir3_nir_lower_to_explicit_output(shader:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant], topology:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_lower_to_explicit_input(shader:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant], ctypes.c_uint32) +def ir3_nir_lower_tess_ctrl(shader:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant], topology:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant], ctypes.c_uint32) +def ir3_nir_lower_tess_eval(shader:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant], topology:int) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_gs(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, ctypes.c_uint32) +def ir3_supports_vectorized_nir_op(op:ctypes.c_uint32) -> bool: ... +@dll.bind(uint8_t, c.POINTER[nir_instr], ctypes.c_void_p) +def ir3_nir_vectorize_filter(instr:c.POINTER[nir_instr], data:ctypes.c_void_p) -> uint8_t: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_64b_intrinsics(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_64b_undef(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_64b_global(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_lower_64b_regs(shader:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(nir_mem_access_size_align, ctypes.c_uint32, uint8_t, uint8_t, uint32_t, uint32_t, ctypes.c_bool, ctypes.c_uint32, ctypes.c_void_p) +def ir3_mem_access_size_align(intrin:ctypes.c_uint32, bytes:uint8_t, bit_size:uint8_t, align:uint32_t, align_offset:uint32_t, offset_is_const:bool, access:ctypes.c_uint32, cb_data:ctypes.c_void_p) -> nir_mem_access_size_align: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_opt_branch_and_or_not(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_opt_triops_bitwise(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_ir3_compiler], c.POINTER[struct_ir3_shader_nir_options], c.POINTER[nir_shader]) +def ir3_optimize_loop(compiler:c.POINTER[struct_ir3_compiler], options:c.POINTER[struct_ir3_shader_nir_options], s:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader]) +def ir3_nir_lower_io_vars_to_temporaries(s:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_compiler], c.POINTER[struct_ir3_shader_nir_options], c.POINTER[nir_shader]) +def ir3_finalize_nir(compiler:c.POINTER[struct_ir3_compiler], options:c.POINTER[struct_ir3_shader_nir_options], s:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_shader]) +def ir3_nir_post_finalize(shader:c.POINTER[struct_ir3_shader]) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_shader_variant], c.POINTER[struct_ir3_shader_nir_options], c.POINTER[nir_shader]) +def ir3_nir_lower_variant(so:c.POINTER[struct_ir3_shader_variant], options:c.POINTER[struct_ir3_shader_nir_options], s:c.POINTER[nir_shader]) -> None: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant], c.POINTER[struct_ir3_const_state]) +def ir3_setup_const_state(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant], const_state:c.POINTER[struct_ir3_const_state]) -> None: ... +@dll.bind(uint32_t, c.POINTER[struct_ir3_shader_variant], c.POINTER[struct_ir3_const_state], uint32_t) +def ir3_const_state_get_free_space(v:c.POINTER[struct_ir3_shader_variant], const_state:c.POINTER[struct_ir3_const_state], align_vec4:uint32_t) -> uint32_t: ... +@dll.bind(None, c.POINTER[struct_ir3_const_allocations], ctypes.c_uint32, uint32_t, uint32_t) +def ir3_const_alloc(const_alloc:c.POINTER[struct_ir3_const_allocations], type:ctypes.c_uint32, size_vec4:uint32_t, align_vec4:uint32_t) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_const_allocations], ctypes.c_uint32, uint32_t, uint32_t) +def ir3_const_reserve_space(const_alloc:c.POINTER[struct_ir3_const_allocations], type:ctypes.c_uint32, size_vec4:uint32_t, align_vec4:uint32_t) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_const_allocations], ctypes.c_uint32) +def ir3_const_free_reserved_space(const_alloc:c.POINTER[struct_ir3_const_allocations], type:ctypes.c_uint32) -> None: ... +@dll.bind(None, c.POINTER[struct_ir3_const_allocations]) +def ir3_const_alloc_all_reserved_space(const_alloc:c.POINTER[struct_ir3_const_allocations]) -> None: ... +@dll.bind(uint32_t, c.POINTER[struct_ir3_compiler], c.POINTER[nir_shader], c.POINTER[struct_ir3_const_image_dims]) +def ir3_nir_scan_driver_consts(compiler:c.POINTER[struct_ir3_compiler], shader:c.POINTER[nir_shader], image_dims:c.POINTER[struct_ir3_const_image_dims]) -> uint32_t: ... +@dll.bind(None, c.POINTER[struct_ir3_const_allocations], c.POINTER[uint32_t], c.POINTER[struct_ir3_compiler], ctypes.c_int32) +def ir3_alloc_driver_params(const_alloc:c.POINTER[struct_ir3_const_allocations], num_driver_params:c.POINTER[uint32_t], compiler:c.POINTER[struct_ir3_compiler], shader_type:ctypes.c_int32) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_lower_load_constant(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_analyze_ubo_ranges(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_lower_ubo_loads(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_lower_const_global_loads(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader]) +def ir3_nir_fixup_load_const_ir3(nir:c.POINTER[nir_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_opt_preamble(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_opt_prefetch_descriptors(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_lower_preamble(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], int32_t) +def ir3_nir_try_propagate_bit_shift(b:c.POINTER[nir_builder], offset:c.POINTER[nir_def], shift:int32_t) -> c.POINTER[nir_def]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_instr], ctypes.c_void_p) +def ir3_nir_lower_subgroups_filter(instr:c.POINTER[nir_instr], data:ctypes.c_void_p) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader]) +def ir3_nir_lower_shuffle(nir:c.POINTER[nir_shader], shader:c.POINTER[struct_ir3_shader]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[struct_ir3_shader_variant]) +def ir3_nir_opt_subgroups(nir:c.POINTER[nir_shader], v:c.POINTER[struct_ir3_shader_variant]) -> bool: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[struct_ir3_driver_ubo]) +def ir3_get_shared_driver_ubo(b:c.POINTER[nir_builder], ubo:c.POINTER[struct_ir3_driver_ubo]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[struct_ir3_driver_ubo]) +def ir3_get_driver_ubo(b:c.POINTER[nir_builder], ubo:c.POINTER[struct_ir3_driver_ubo]) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[struct_ir3_shader_variant]) +def ir3_get_driver_consts_ubo(b:c.POINTER[nir_builder], v:c.POINTER[struct_ir3_shader_variant]) -> c.POINTER[nir_def]: ... +@dll.bind(None, c.POINTER[nir_shader], c.POINTER[struct_ir3_driver_ubo], c.POINTER[ctypes.c_char]) +def ir3_update_driver_ubo(nir:c.POINTER[nir_shader], ubo:c.POINTER[struct_ir3_driver_ubo], name:c.POINTER[ctypes.c_char]) -> None: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[struct_ir3_driver_ubo], ctypes.c_uint32) +def ir3_load_shared_driver_ubo(b:c.POINTER[nir_builder], components:int, ubo:c.POINTER[struct_ir3_driver_ubo], offset:int) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[struct_ir3_driver_ubo], ctypes.c_uint32) +def ir3_load_driver_ubo(b:c.POINTER[nir_builder], components:int, ubo:c.POINTER[struct_ir3_driver_ubo], offset:int) -> c.POINTER[nir_def]: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], ctypes.c_uint32, c.POINTER[struct_ir3_driver_ubo], ctypes.c_uint32, c.POINTER[nir_def], ctypes.c_uint32) +def ir3_load_driver_ubo_indirect(b:c.POINTER[nir_builder], components:int, ubo:c.POINTER[struct_ir3_driver_ubo], base:int, offset:c.POINTER[nir_def], range:int) -> c.POINTER[nir_def]: ... +@dll.bind(ctypes.c_bool, c.POINTER[nir_def], c.POINTER[c.POINTER[nir_def]]) +def ir3_def_is_rematerializable_for_preamble(_def:c.POINTER[nir_def], preamble_defs:c.POINTER[c.POINTER[nir_def]]) -> bool: ... +@dll.bind(c.POINTER[nir_def], c.POINTER[nir_builder], c.POINTER[nir_def], c.POINTER[struct_set], c.POINTER[c.POINTER[nir_def]]) +def ir3_rematerialize_def_for_preamble(b:c.POINTER[nir_builder], _def:c.POINTER[nir_def], instr_set:c.POINTER[struct_set], preamble_defs:c.POINTER[c.POINTER[nir_def]]) -> c.POINTER[nir_def]: ... +@c.record +class struct_driver_param_info(c.Struct): + SIZE = 8 + offset: int + extra_size: int +struct_driver_param_info.register_fields([('offset', uint32_t, 0), ('extra_size', uint32_t, 4)]) +@dll.bind(ctypes.c_bool, c.POINTER[nir_shader], c.POINTER[nir_intrinsic_instr], c.POINTER[struct_driver_param_info]) +def ir3_get_driver_param_info(shader:c.POINTER[nir_shader], intr:c.POINTER[nir_intrinsic_instr], param_info:c.POINTER[struct_driver_param_info]) -> bool: ... +@dll.bind(uint32_t, c.POINTER[nir_intrinsic_instr], ctypes.c_void_p) +def ir3_nir_max_imm_offset(intrin:c.POINTER[nir_intrinsic_instr], data:ctypes.c_void_p) -> uint32_t: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nir_intrinsic_instr]) +def ir3_nir_intrinsic_barycentric_sysval(intr:c.POINTER[nir_intrinsic_instr]) -> ctypes.c_uint32: ... +@dll.bind(None) +def glsl_type_singleton_init_or_ref() -> None: ... +@dll.bind(None) +def glsl_type_singleton_decref() -> None: ... +@dll.bind(None, c.POINTER[struct_blob], c.POINTER[glsl_type]) +def encode_type_to_blob(blob:c.POINTER[struct_blob], type:c.POINTER[glsl_type]) -> None: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[struct_blob_reader]) +def decode_type_from_blob(blob:c.POINTER[struct_blob_reader]) -> c.POINTER[glsl_type]: ... +@dll.bind(ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool) +def glsl_apply_signedness_to_base_type(type:ctypes.c_uint32, signedness:bool) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_int32, ctypes.c_uint32) +def glsl_get_sampler_dim_coordinate_components(dim:ctypes.c_uint32) -> int: ... +enum_glsl_matrix_layout: dict[int, str] = {(GLSL_MATRIX_LAYOUT_INHERITED:=0): 'GLSL_MATRIX_LAYOUT_INHERITED', (GLSL_MATRIX_LAYOUT_COLUMN_MAJOR:=1): 'GLSL_MATRIX_LAYOUT_COLUMN_MAJOR', (GLSL_MATRIX_LAYOUT_ROW_MAJOR:=2): 'GLSL_MATRIX_LAYOUT_ROW_MAJOR'} +_anonenum6: dict[int, str] = {(GLSL_PRECISION_NONE:=0): 'GLSL_PRECISION_NONE', (GLSL_PRECISION_HIGH:=1): 'GLSL_PRECISION_HIGH', (GLSL_PRECISION_MEDIUM:=2): 'GLSL_PRECISION_MEDIUM', (GLSL_PRECISION_LOW:=3): 'GLSL_PRECISION_LOW'} +enum_glsl_cmat_use: dict[int, str] = {(GLSL_CMAT_USE_NONE:=0): 'GLSL_CMAT_USE_NONE', (GLSL_CMAT_USE_A:=1): 'GLSL_CMAT_USE_A', (GLSL_CMAT_USE_B:=2): 'GLSL_CMAT_USE_B', (GLSL_CMAT_USE_ACCUMULATOR:=3): 'GLSL_CMAT_USE_ACCUMULATOR'} +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[glsl_type]) +def glsl_get_type_name(type:c.POINTER[glsl_type]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_is_vector(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_is_scalar(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_is_vector_or_scalar(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_is_matrix(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_is_array_or_matrix(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_is_dual_slot(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_is_leaf(type:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_get_bare_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_get_scalar_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_get_base_glsl_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_get_length(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_type_wrap_in_arrays(t:c.POINTER[glsl_type], arrays:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_get_aoa_size(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_get_array_element(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_without_array(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_without_array_or_matrix(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_get_cmat_element(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[struct_glsl_cmat_description], c.POINTER[glsl_type]) +def glsl_get_cmat_description(t:c.POINTER[glsl_type]) -> c.POINTER[struct_glsl_cmat_description]: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_atomic_size(type:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_contains_32bit(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_contains_64bit(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_type_contains_image(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_contains_atomic(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_contains_double(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_contains_integer(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_contains_opaque(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_contains_sampler(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_contains_array(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type]) +def glsl_contains_subroutine(t:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_int32, c.POINTER[glsl_type]) +def glsl_get_sampler_coordinate_components(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_type_compare_no_precision(a:c.POINTER[glsl_type], b:c.POINTER[glsl_type]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[glsl_type], c.POINTER[glsl_type], ctypes.c_bool, ctypes.c_bool, ctypes.c_bool) +def glsl_record_compare(a:c.POINTER[glsl_type], b:c.POINTER[glsl_type], match_name:bool, match_locations:bool, match_precision:bool) -> bool: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_get_struct_field(t:c.POINTER[glsl_type], index:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_struct_field], c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_get_struct_field_data(t:c.POINTER[glsl_type], index:int) -> c.POINTER[glsl_struct_field]: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_get_struct_location_offset(t:c.POINTER[glsl_type], length:int) -> int: ... +@dll.bind(ctypes.c_int32, c.POINTER[glsl_type], c.POINTER[ctypes.c_char]) +def glsl_get_field_index(t:c.POINTER[glsl_type], name:c.POINTER[ctypes.c_char]) -> int: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], c.POINTER[ctypes.c_char]) +def glsl_get_field_type(t:c.POINTER[glsl_type], name:c.POINTER[ctypes.c_char]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_f16vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_bf16vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_e4m3fnvec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_e5m2vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_dvec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_ivec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_uvec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_bvec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_i64vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_u64vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_i16vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_u16vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_i8vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_u8vec_type(components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool, ctypes.c_uint32) +def glsl_simple_explicit_type(base_type:int, rows:int, columns:int, explicit_stride:int, row_major:bool, explicit_alignment:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32, ctypes.c_bool, ctypes.c_bool, ctypes.c_uint32) +def glsl_sampler_type(dim:ctypes.c_uint32, shadow:bool, array:bool, type:ctypes.c_uint32) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type]) +def glsl_bare_sampler_type() -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type]) +def glsl_bare_shadow_sampler_type() -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32, ctypes.c_bool, ctypes.c_uint32) +def glsl_texture_type(dim:ctypes.c_uint32, array:bool, type:ctypes.c_uint32) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], ctypes.c_uint32, ctypes.c_bool, ctypes.c_uint32) +def glsl_image_type(dim:ctypes.c_uint32, array:bool, type:ctypes.c_uint32) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], ctypes.c_uint32, ctypes.c_uint32) +def glsl_array_type(element:c.POINTER[glsl_type], array_size:int, explicit_stride:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[struct_glsl_cmat_description]) +def glsl_cmat_type(desc:c.POINTER[struct_glsl_cmat_description]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_struct_field], ctypes.c_uint32, c.POINTER[ctypes.c_char], ctypes.c_bool, ctypes.c_uint32) +def glsl_struct_type_with_explicit_alignment(fields:c.POINTER[glsl_struct_field], num_fields:int, name:c.POINTER[ctypes.c_char], packed:bool, explicit_alignment:int) -> c.POINTER[glsl_type]: ... +enum_glsl_interface_packing: dict[int, str] = {(GLSL_INTERFACE_PACKING_STD140:=0): 'GLSL_INTERFACE_PACKING_STD140', (GLSL_INTERFACE_PACKING_SHARED:=1): 'GLSL_INTERFACE_PACKING_SHARED', (GLSL_INTERFACE_PACKING_PACKED:=2): 'GLSL_INTERFACE_PACKING_PACKED', (GLSL_INTERFACE_PACKING_STD430:=3): 'GLSL_INTERFACE_PACKING_STD430'} +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_struct_field], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_bool, c.POINTER[ctypes.c_char]) +def glsl_interface_type(fields:c.POINTER[glsl_struct_field], num_fields:int, packing:ctypes.c_uint32, row_major:bool, block_name:c.POINTER[ctypes.c_char]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[ctypes.c_char]) +def glsl_subroutine_type(subroutine_name:c.POINTER[ctypes.c_char]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_get_row_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_get_column_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], glsl_type_size_align_func, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def glsl_get_explicit_type_for_size_align(type:c.POINTER[glsl_type], type_info:glsl_type_size_align_func, size:c.POINTER[ctypes.c_uint32], alignment:c.POINTER[ctypes.c_uint32]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_type_replace_vec3_with_vec4(type:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_float16_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_int16_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_uint16_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_type_to_16bit(old_type:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_replace_vector_type(t:c.POINTER[glsl_type], components:int) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_channel_type(t:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], c.POINTER[glsl_type]) +def glsl_get_mul_type(type_a:c.POINTER[glsl_type], type_b:c.POINTER[glsl_type]) -> c.POINTER[glsl_type]: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_type_get_sampler_count(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_type_get_texture_count(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_type_get_image_count(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool, ctypes.c_bool) +def glsl_count_vec4_slots(t:c.POINTER[glsl_type], is_gl_vertex_input:bool, is_bindless:bool) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool) +def glsl_count_dword_slots(t:c.POINTER[glsl_type], is_bindless:bool) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_get_component_slots(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_uint32) +def glsl_get_component_slots_aligned(t:c.POINTER[glsl_type], offset:int) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_varying_count(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_type_uniform_locations(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_get_cl_size(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type]) +def glsl_get_cl_alignment(t:c.POINTER[glsl_type]) -> int: ... +@dll.bind(None, c.POINTER[glsl_type], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def glsl_get_cl_type_size_align(t:c.POINTER[glsl_type], size:c.POINTER[ctypes.c_uint32], align:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_internal_ifc_packing(t:c.POINTER[glsl_type], std430_supported:bool) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_std140_base_alignment(t:c.POINTER[glsl_type], row_major:bool) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_std140_size(t:c.POINTER[glsl_type], row_major:bool) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_std430_array_stride(t:c.POINTER[glsl_type], row_major:bool) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_std430_base_alignment(t:c.POINTER[glsl_type], row_major:bool) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_std430_size(t:c.POINTER[glsl_type], row_major:bool) -> int: ... +@dll.bind(ctypes.c_uint32, c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_explicit_size(t:c.POINTER[glsl_type], align_to_stride:bool) -> int: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_explicit_std140_type(t:c.POINTER[glsl_type], row_major:bool) -> c.POINTER[glsl_type]: ... +@dll.bind(c.POINTER[glsl_type], c.POINTER[glsl_type], ctypes.c_bool) +def glsl_get_explicit_std430_type(t:c.POINTER[glsl_type], row_major:bool) -> c.POINTER[glsl_type]: ... +@dll.bind(None, c.POINTER[glsl_type], glsl_type_size_align_func, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def glsl_size_align_handle_array_and_structs(type:c.POINTER[glsl_type], size_align:glsl_type_size_align_func, size:c.POINTER[ctypes.c_uint32], align:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, c.POINTER[glsl_type], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def glsl_get_natural_size_align_bytes(t:c.POINTER[glsl_type], size:c.POINTER[ctypes.c_uint32], align:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, c.POINTER[glsl_type], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def glsl_get_word_size_align_bytes(type:c.POINTER[glsl_type], size:c.POINTER[ctypes.c_uint32], align:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, c.POINTER[glsl_type], c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def glsl_get_vec4_size_align_bytes(type:c.POINTER[glsl_type], size:c.POINTER[ctypes.c_uint32], align:c.POINTER[ctypes.c_uint32]) -> None: ... +@dll.bind(None, c.POINTER[struct_blob]) +def blob_init(blob:c.POINTER[struct_blob]) -> None: ... +@dll.bind(None, c.POINTER[struct_blob], ctypes.c_void_p, size_t) +def blob_init_fixed(blob:c.POINTER[struct_blob], data:ctypes.c_void_p, size:size_t) -> None: ... +@dll.bind(None, c.POINTER[struct_blob], c.POINTER[ctypes.c_void_p], c.POINTER[size_t]) +def blob_finish_get_buffer(blob:c.POINTER[struct_blob], buffer:c.POINTER[ctypes.c_void_p], size:c.POINTER[size_t]) -> None: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], size_t) +def blob_align(blob:c.POINTER[struct_blob], alignment:size_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], ctypes.c_void_p, size_t) +def blob_write_bytes(blob:c.POINTER[struct_blob], bytes:ctypes.c_void_p, to_write:size_t) -> bool: ... +intptr_t: TypeAlias = ctypes.c_int64 +@dll.bind(intptr_t, c.POINTER[struct_blob], size_t) +def blob_reserve_bytes(blob:c.POINTER[struct_blob], to_write:size_t) -> intptr_t: ... +@dll.bind(intptr_t, c.POINTER[struct_blob]) +def blob_reserve_uint32(blob:c.POINTER[struct_blob]) -> intptr_t: ... +@dll.bind(intptr_t, c.POINTER[struct_blob]) +def blob_reserve_intptr(blob:c.POINTER[struct_blob]) -> intptr_t: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], size_t, ctypes.c_void_p, size_t) +def blob_overwrite_bytes(blob:c.POINTER[struct_blob], offset:size_t, bytes:ctypes.c_void_p, to_write:size_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], uint8_t) +def blob_write_uint8(blob:c.POINTER[struct_blob], value:uint8_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], size_t, uint8_t) +def blob_overwrite_uint8(blob:c.POINTER[struct_blob], offset:size_t, value:uint8_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], uint16_t) +def blob_write_uint16(blob:c.POINTER[struct_blob], value:uint16_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], uint32_t) +def blob_write_uint32(blob:c.POINTER[struct_blob], value:uint32_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], size_t, uint32_t) +def blob_overwrite_uint32(blob:c.POINTER[struct_blob], offset:size_t, value:uint32_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], uint64_t) +def blob_write_uint64(blob:c.POINTER[struct_blob], value:uint64_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], intptr_t) +def blob_write_intptr(blob:c.POINTER[struct_blob], value:intptr_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], size_t, intptr_t) +def blob_overwrite_intptr(blob:c.POINTER[struct_blob], offset:size_t, value:intptr_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[struct_blob], c.POINTER[ctypes.c_char]) +def blob_write_string(blob:c.POINTER[struct_blob], str:c.POINTER[ctypes.c_char]) -> bool: ... +@dll.bind(None, c.POINTER[struct_blob_reader], ctypes.c_void_p, size_t) +def blob_reader_init(blob:c.POINTER[struct_blob_reader], data:ctypes.c_void_p, size:size_t) -> None: ... +@dll.bind(None, c.POINTER[struct_blob_reader], size_t) +def blob_reader_align(blob:c.POINTER[struct_blob_reader], alignment:size_t) -> None: ... +@dll.bind(ctypes.c_void_p, c.POINTER[struct_blob_reader], size_t) +def blob_read_bytes(blob:c.POINTER[struct_blob_reader], size:size_t) -> ctypes.c_void_p: ... +@dll.bind(None, c.POINTER[struct_blob_reader], ctypes.c_void_p, size_t) +def blob_copy_bytes(blob:c.POINTER[struct_blob_reader], dest:ctypes.c_void_p, size:size_t) -> None: ... +@dll.bind(None, c.POINTER[struct_blob_reader], size_t) +def blob_skip_bytes(blob:c.POINTER[struct_blob_reader], size:size_t) -> None: ... +@dll.bind(uint8_t, c.POINTER[struct_blob_reader]) +def blob_read_uint8(blob:c.POINTER[struct_blob_reader]) -> uint8_t: ... +@dll.bind(uint16_t, c.POINTER[struct_blob_reader]) +def blob_read_uint16(blob:c.POINTER[struct_blob_reader]) -> uint16_t: ... +@dll.bind(uint32_t, c.POINTER[struct_blob_reader]) +def blob_read_uint32(blob:c.POINTER[struct_blob_reader]) -> uint32_t: ... +@dll.bind(uint64_t, c.POINTER[struct_blob_reader]) +def blob_read_uint64(blob:c.POINTER[struct_blob_reader]) -> uint64_t: ... +@dll.bind(intptr_t, c.POINTER[struct_blob_reader]) +def blob_read_intptr(blob:c.POINTER[struct_blob_reader]) -> intptr_t: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[struct_blob_reader]) +def blob_read_string(blob:c.POINTER[struct_blob_reader]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p) +def ralloc_context(ctx:ctypes.c_void_p) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t) +def ralloc_size(ctx:ctypes.c_void_p, size:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t) +def rzalloc_size(ctx:ctypes.c_void_p, size:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t) +def reralloc_size(ctx:ctypes.c_void_p, ptr:ctypes.c_void_p, size:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t) +def rerzalloc_size(ctx:ctypes.c_void_p, ptr:ctypes.c_void_p, old_size:size_t, new_size:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32) +def ralloc_array_size(ctx:ctypes.c_void_p, size:size_t, count:int) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32) +def rzalloc_array_size(ctx:ctypes.c_void_p, size:size_t, count:int) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32) +def reralloc_array_size(ctx:ctypes.c_void_p, ptr:ctypes.c_void_p, size:size_t, count:int) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t, ctypes.c_uint32, ctypes.c_uint32) +def rerzalloc_array_size(ctx:ctypes.c_void_p, ptr:ctypes.c_void_p, size:size_t, old_count:int, new_count:int) -> ctypes.c_void_p: ... +@dll.bind(None, ctypes.c_void_p) +def ralloc_free(ptr:ctypes.c_void_p) -> None: ... +@dll.bind(None, ctypes.c_void_p, ctypes.c_void_p) +def ralloc_steal(new_ctx:ctypes.c_void_p, ptr:ctypes.c_void_p) -> None: ... +@dll.bind(None, ctypes.c_void_p, ctypes.c_void_p) +def ralloc_adopt(new_ctx:ctypes.c_void_p, old_ctx:ctypes.c_void_p) -> None: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p) +def ralloc_parent(ptr:ctypes.c_void_p) -> ctypes.c_void_p: ... +@dll.bind(None, ctypes.c_void_p, c.CFUNCTYPE[None, [ctypes.c_void_p]]) +def ralloc_set_destructor(ptr:ctypes.c_void_p, destructor:c.CFUNCTYPE[None, [ctypes.c_void_p]]) -> None: ... +@dll.bind(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, size_t) +def ralloc_memdup(ctx:ctypes.c_void_p, mem:ctypes.c_void_p, n:size_t) -> ctypes.c_void_p: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_void_p, c.POINTER[ctypes.c_char]) +def ralloc_strdup(ctx:ctypes.c_void_p, str:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_void_p, c.POINTER[ctypes.c_char], size_t) +def ralloc_strndup(ctx:ctypes.c_void_p, str:c.POINTER[ctypes.c_char], n:size_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_bool, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def ralloc_strcat(dest:c.POINTER[c.POINTER[ctypes.c_char]], str:c.POINTER[ctypes.c_char]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char], size_t) +def ralloc_strncat(dest:c.POINTER[c.POINTER[ctypes.c_char]], str:c.POINTER[ctypes.c_char], n:size_t) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char], size_t, size_t) +def ralloc_str_append(dest:c.POINTER[c.POINTER[ctypes.c_char]], str:c.POINTER[ctypes.c_char], existing_length:size_t, str_size:size_t) -> bool: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_void_p, c.POINTER[ctypes.c_char]) +def ralloc_asprintf(ctx:ctypes.c_void_p, fmt:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@c.record +class struct___va_list_tag(c.Struct): + SIZE = 24 + gp_offset: int + fp_offset: int + overflow_arg_area: ctypes.c_void_p + reg_save_area: ctypes.c_void_p +struct___va_list_tag.register_fields([('gp_offset', ctypes.c_uint32, 0), ('fp_offset', ctypes.c_uint32, 4), ('overflow_arg_area', ctypes.c_void_p, 8), ('reg_save_area', ctypes.c_void_p, 16)]) +va_list: TypeAlias = c.Array[struct___va_list_tag, Literal[1]] +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_void_p, c.POINTER[ctypes.c_char], va_list) +def ralloc_vasprintf(ctx:ctypes.c_void_p, fmt:c.POINTER[ctypes.c_char], args:va_list) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_bool, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def ralloc_asprintf_rewrite_tail(str:c.POINTER[c.POINTER[ctypes.c_char]], start:c.POINTER[size_t], fmt:c.POINTER[ctypes.c_char]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t], c.POINTER[ctypes.c_char], va_list) +def ralloc_vasprintf_rewrite_tail(str:c.POINTER[c.POINTER[ctypes.c_char]], start:c.POINTER[size_t], fmt:c.POINTER[ctypes.c_char], args:va_list) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def ralloc_asprintf_append(str:c.POINTER[c.POINTER[ctypes.c_char]], fmt:c.POINTER[ctypes.c_char]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char], va_list) +def ralloc_vasprintf_append(str:c.POINTER[c.POINTER[ctypes.c_char]], fmt:c.POINTER[ctypes.c_char], args:va_list) -> bool: ... +@dll.bind(size_t, ctypes.c_void_p) +def ralloc_total_size(ptr:ctypes.c_void_p) -> size_t: ... +@dll.bind(c.POINTER[gc_ctx], ctypes.c_void_p) +def gc_context(parent:ctypes.c_void_p) -> c.POINTER[gc_ctx]: ... +@dll.bind(ctypes.c_void_p, c.POINTER[gc_ctx], size_t, size_t) +def gc_alloc_size(ctx:c.POINTER[gc_ctx], size:size_t, alignment:size_t) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, c.POINTER[gc_ctx], size_t, size_t) +def gc_zalloc_size(ctx:c.POINTER[gc_ctx], size:size_t, alignment:size_t) -> ctypes.c_void_p: ... +@dll.bind(None, ctypes.c_void_p) +def gc_free(ptr:ctypes.c_void_p) -> None: ... +@dll.bind(c.POINTER[gc_ctx], ctypes.c_void_p) +def gc_get_context(ptr:ctypes.c_void_p) -> c.POINTER[gc_ctx]: ... +@dll.bind(None, c.POINTER[gc_ctx]) +def gc_sweep_start(ctx:c.POINTER[gc_ctx]) -> None: ... +@dll.bind(None, c.POINTER[gc_ctx], ctypes.c_void_p) +def gc_mark_live(ctx:c.POINTER[gc_ctx], mem:ctypes.c_void_p) -> None: ... +@dll.bind(None, c.POINTER[gc_ctx]) +def gc_sweep_end(ctx:c.POINTER[gc_ctx]) -> None: ... +class struct_linear_ctx(c.Struct): pass +linear_ctx: TypeAlias = struct_linear_ctx +@dll.bind(ctypes.c_void_p, c.POINTER[linear_ctx], ctypes.c_uint32) +def linear_alloc_child(ctx:c.POINTER[linear_ctx], size:int) -> ctypes.c_void_p: ... +@c.record +class linear_opts(c.Struct): + SIZE = 4 + min_buffer_size: int +linear_opts.register_fields([('min_buffer_size', ctypes.c_uint32, 0)]) +@dll.bind(c.POINTER[linear_ctx], ctypes.c_void_p) +def linear_context(ralloc_ctx:ctypes.c_void_p) -> c.POINTER[linear_ctx]: ... +@dll.bind(c.POINTER[linear_ctx], ctypes.c_void_p, c.POINTER[linear_opts]) +def linear_context_with_opts(ralloc_ctx:ctypes.c_void_p, opts:c.POINTER[linear_opts]) -> c.POINTER[linear_ctx]: ... +@dll.bind(ctypes.c_void_p, c.POINTER[linear_ctx], ctypes.c_uint32) +def linear_zalloc_child(ctx:c.POINTER[linear_ctx], size:int) -> ctypes.c_void_p: ... +@dll.bind(None, c.POINTER[linear_ctx]) +def linear_free_context(ctx:c.POINTER[linear_ctx]) -> None: ... +@dll.bind(None, ctypes.c_void_p, c.POINTER[linear_ctx]) +def ralloc_steal_linear_context(new_ralloc_ctx:ctypes.c_void_p, ctx:c.POINTER[linear_ctx]) -> None: ... +@dll.bind(ctypes.c_void_p, c.POINTER[linear_ctx]) +def ralloc_parent_of_linear_context(ctx:c.POINTER[linear_ctx]) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, c.POINTER[linear_ctx], size_t, ctypes.c_uint32) +def linear_alloc_child_array(ctx:c.POINTER[linear_ctx], size:size_t, count:int) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, c.POINTER[linear_ctx], size_t, ctypes.c_uint32) +def linear_zalloc_child_array(ctx:c.POINTER[linear_ctx], size:size_t, count:int) -> ctypes.c_void_p: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[linear_ctx], c.POINTER[ctypes.c_char]) +def linear_strdup(ctx:c.POINTER[linear_ctx], str:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[linear_ctx], c.POINTER[ctypes.c_char]) +def linear_asprintf(ctx:c.POINTER[linear_ctx], fmt:c.POINTER[ctypes.c_char]) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], c.POINTER[linear_ctx], c.POINTER[ctypes.c_char], va_list) +def linear_vasprintf(ctx:c.POINTER[linear_ctx], fmt:c.POINTER[ctypes.c_char], args:va_list) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_bool, c.POINTER[linear_ctx], c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def linear_asprintf_append(ctx:c.POINTER[linear_ctx], str:c.POINTER[c.POINTER[ctypes.c_char]], fmt:c.POINTER[ctypes.c_char]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[linear_ctx], c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char], va_list) +def linear_vasprintf_append(ctx:c.POINTER[linear_ctx], str:c.POINTER[c.POINTER[ctypes.c_char]], fmt:c.POINTER[ctypes.c_char], args:va_list) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[linear_ctx], c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t], c.POINTER[ctypes.c_char]) +def linear_asprintf_rewrite_tail(ctx:c.POINTER[linear_ctx], str:c.POINTER[c.POINTER[ctypes.c_char]], start:c.POINTER[size_t], fmt:c.POINTER[ctypes.c_char]) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[linear_ctx], c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t], c.POINTER[ctypes.c_char], va_list) +def linear_vasprintf_rewrite_tail(ctx:c.POINTER[linear_ctx], str:c.POINTER[c.POINTER[ctypes.c_char]], start:c.POINTER[size_t], fmt:c.POINTER[ctypes.c_char], args:va_list) -> bool: ... +@dll.bind(ctypes.c_bool, c.POINTER[linear_ctx], c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[ctypes.c_char]) +def linear_strcat(ctx:c.POINTER[linear_ctx], dest:c.POINTER[c.POINTER[ctypes.c_char]], str:c.POINTER[ctypes.c_char]) -> bool: ... +_anonenum7: dict[int, str] = {(RALLOC_PRINT_INFO_SUMMARY_ONLY:=1): 'RALLOC_PRINT_INFO_SUMMARY_ONLY'} +@dll.bind(None, c.POINTER[FILE], ctypes.c_void_p, ctypes.c_uint32) +def ralloc_print_info(f:c.POINTER[FILE], p:ctypes.c_void_p, flags:int) -> None: ... +@c.record +class struct_isa_decode_options(c.Struct): + SIZE = 80 + gpu_id: int + show_errors: bool + max_errors: int + branch_labels: bool + stop: bool + cbdata: ctypes.c_void_p + field_cb: c.CFUNCTYPE[None, [ctypes.c_void_p, c.POINTER[ctypes.c_char], c.POINTER[struct_isa_decode_value]]] + field_print_cb: c.CFUNCTYPE[None, [c.POINTER[struct_isa_print_state], c.POINTER[ctypes.c_char], ctypes.c_uint64]] + pre_instr_cb: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_void_p]] + post_instr_cb: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_void_p]] + no_match_cb: c.CFUNCTYPE[None, [c.POINTER[struct__IO_FILE], c.POINTER[ctypes.c_uint32], ctypes.c_uint64]] + entrypoint_count: int + entrypoints: c.POINTER[struct_isa_entrypoint] +@c.record +class struct_isa_decode_value(c.Struct): + SIZE = 16 + str: c.POINTER[ctypes.c_char] + num: int +struct_isa_decode_value.register_fields([('str', c.POINTER[ctypes.c_char], 0), ('num', uint64_t, 8)]) +@c.record +class struct_isa_print_state(c.Struct): + SIZE = 16 + out: c.POINTER[struct__IO_FILE] + line_column: int +struct_isa_print_state.register_fields([('out', c.POINTER[FILE], 0), ('line_column', ctypes.c_uint32, 8)]) +@c.record +class struct_isa_entrypoint(c.Struct): + SIZE = 16 + name: c.POINTER[ctypes.c_char] + offset: int +struct_isa_entrypoint.register_fields([('name', c.POINTER[ctypes.c_char], 0), ('offset', uint32_t, 8)]) +struct_isa_decode_options.register_fields([('gpu_id', uint32_t, 0), ('show_errors', ctypes.c_bool, 4), ('max_errors', ctypes.c_uint32, 8), ('branch_labels', ctypes.c_bool, 12), ('stop', ctypes.c_bool, 13), ('cbdata', ctypes.c_void_p, 16), ('field_cb', c.CFUNCTYPE[None, [ctypes.c_void_p, c.POINTER[ctypes.c_char], c.POINTER[struct_isa_decode_value]]], 24), ('field_print_cb', c.CFUNCTYPE[None, [c.POINTER[struct_isa_print_state], c.POINTER[ctypes.c_char], uint64_t]], 32), ('pre_instr_cb', c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_void_p]], 40), ('post_instr_cb', c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_void_p]], 48), ('no_match_cb', c.CFUNCTYPE[None, [c.POINTER[FILE], c.POINTER[ctypes.c_uint32], size_t]], 56), ('entrypoint_count', ctypes.c_uint32, 64), ('entrypoints', c.POINTER[struct_isa_entrypoint], 72)]) +@dll.bind(None, ctypes.c_void_p, ctypes.c_int32, c.POINTER[FILE], c.POINTER[struct_isa_decode_options]) +def ir3_isa_disasm(bin:ctypes.c_void_p, sz:int, out:c.POINTER[FILE], options:c.POINTER[struct_isa_decode_options]) -> None: ... +@dll.bind(ctypes.c_bool, ctypes.c_void_p, ctypes.c_void_p, c.POINTER[struct_isa_decode_options]) +def ir3_isa_decode(out:ctypes.c_void_p, bin:ctypes.c_void_p, options:c.POINTER[struct_isa_decode_options]) -> bool: ... +class struct_decode_scope(c.Struct): pass +@dll.bind(uint32_t, c.POINTER[struct_decode_scope]) +def ir3_isa_get_gpu_id(scope:c.POINTER[struct_decode_scope]) -> uint32_t: ... +try: glsl_type_builtin_error = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_error') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_void = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_void') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bool = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bool') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bvec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bvec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bvec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bvec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bvec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bvec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bvec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bvec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bvec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bvec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bvec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bvec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_int = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_int') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_ivec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_ivec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_ivec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_ivec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_ivec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_ivec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_ivec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_ivec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_ivec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_ivec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_ivec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_ivec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uint = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uint') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uvec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uvec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uvec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uvec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uvec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uvec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uvec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uvec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uvec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uvec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uvec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uvec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_float = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_float') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_float16_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_float16_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_double = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_double') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dvec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dvec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dvec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dvec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dvec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dvec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dvec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dvec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dvec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dvec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dvec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dvec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_int64_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_int64_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uint64_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uint64_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_int16_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_int16_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i16vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i16vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i16vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i16vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i16vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i16vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i16vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i16vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i16vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i16vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i16vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i16vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uint16_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uint16_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u16vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u16vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u16vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u16vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u16vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u16vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u16vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u16vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u16vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u16vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u16vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u16vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_int8_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_int8_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i8vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i8vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i8vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i8vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i8vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i8vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i8vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i8vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i8vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i8vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i8vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i8vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uint8_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uint8_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u8vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u8vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u8vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u8vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u8vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u8vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u8vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u8vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u8vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u8vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u8vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u8vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bfloat16_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bfloat16_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bf16vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bf16vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bf16vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bf16vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bf16vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bf16vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bf16vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bf16vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bf16vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bf16vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_bf16vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_bf16vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e4m3fn_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e4m3fn_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e4m3fnvec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e4m3fnvec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e4m3fnvec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e4m3fnvec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e4m3fnvec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e4m3fnvec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e4m3fnvec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e4m3fnvec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e4m3fnvec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e4m3fnvec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e4m3fnvec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e4m3fnvec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e5m2_t = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e5m2_t') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e5m2vec2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e5m2vec2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e5m2vec3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e5m2vec3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e5m2vec4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e5m2vec4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e5m2vec5 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e5m2vec5') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e5m2vec8 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e5m2vec8') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_e5m2vec16 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_e5m2vec16') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat2x3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat2x3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat2x4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat2x4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat3x2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat3x2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat3x4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat3x4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat4x2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat4x2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_mat4x3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_mat4x3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat2x3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat2x3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat2x4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat2x4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat3x2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat3x2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat3x4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat3x4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat4x2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat4x2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_f16mat4x3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_f16mat4x3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat2x3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat2x3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat2x4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat2x4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat3x2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat3x2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat3x4 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat3x4') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat4x2 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat4x2') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_dmat4x3 = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_dmat4x3') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_atomic_uint = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_atomic_uint') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_samplerCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_samplerCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_samplerCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_samplerCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_samplerBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_samplerBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isampler1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isampler1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isampler2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isampler2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isampler3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isampler3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isamplerCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isamplerCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isampler1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isampler1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isampler2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isampler2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isamplerCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isamplerCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isampler2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isampler2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isamplerBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isamplerBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isampler2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isampler2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isampler2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isampler2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usampler1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usampler1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usampler2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usampler2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usampler3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usampler3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usamplerCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usamplerCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usampler1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usampler1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usampler2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usampler2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usamplerCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usamplerCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usampler2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usampler2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usamplerBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usamplerBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usampler2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usampler2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usampler2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usampler2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_samplerShadow = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_samplerShadow') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler1DShadow = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler1DShadow') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler2DShadow = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler2DShadow') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_samplerCubeShadow = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_samplerCubeShadow') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler1DArrayShadow = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler1DArrayShadow') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler2DArrayShadow = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler2DArrayShadow') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_samplerCubeArrayShadow = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_samplerCubeArrayShadow') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_sampler2DRectShadow = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_sampler2DRectShadow') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_samplerExternalOES = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_samplerExternalOES') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_texture1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_texture1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_texture2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_texture2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_texture3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_texture3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_textureCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_textureCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_texture1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_texture1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_texture2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_texture2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_textureCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_textureCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_texture2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_texture2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_textureBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_textureBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_texture2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_texture2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_texture2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_texture2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itexture1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itexture1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itexture2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itexture2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itexture3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itexture3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itextureCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itextureCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itexture1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itexture1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itexture2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itexture2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itextureCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itextureCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itexture2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itexture2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itextureBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itextureBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itexture2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itexture2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itexture2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itexture2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utexture1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utexture1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utexture2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utexture2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utexture3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utexture3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utextureCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utextureCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utexture1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utexture1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utexture2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utexture2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utextureCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utextureCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utexture2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utexture2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utextureBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utextureBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utexture2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utexture2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utexture2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utexture2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_textureExternalOES = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_textureExternalOES') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vtexture1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vtexture1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vtexture2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vtexture2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vtexture3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vtexture3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vtexture2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vtexture2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vtexture2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vtexture2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vtexture1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vtexture1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vtexture2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vtexture2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vtextureBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vtextureBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_image1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_image1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_image2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_image2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_image3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_image3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_image2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_image2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_imageCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_imageCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_imageBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_imageBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_image1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_image1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_image2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_image2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_imageCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_imageCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_image2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_image2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_image2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_image2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimage1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimage1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimage2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimage2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimage3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimage3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimage2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimage2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimageCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimageCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimageBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimageBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimage1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimage1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimage2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimage2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimageCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimageCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimage2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimage2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_iimage2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_iimage2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimage1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimage1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimage2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimage2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimage3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimage3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimage2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimage2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimageCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimageCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimageBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimageBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimage1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimage1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimage2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimage2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimageCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimageCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimage2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimage2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_uimage2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_uimage2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64image1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64image1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64image2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64image2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64image3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64image3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64image2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64image2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64imageCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64imageCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64imageBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64imageBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64image1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64image1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64image2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64image2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64imageCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64imageCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64image2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64image2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_i64image2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_i64image2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64image1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64image1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64image2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64image2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64image3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64image3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64image2DRect = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64image2DRect') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64imageCube = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64imageCube') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64imageBuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64imageBuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64image1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64image1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64image2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64image2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64imageCubeArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64imageCubeArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64image2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64image2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_u64image2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_u64image2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vbuffer = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vbuffer') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vimage1D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vimage1D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vimage2D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vimage2D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vimage3D = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vimage3D') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vimage2DMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vimage2DMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vimage2DMSArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vimage2DMSArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vimage1DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vimage1DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_vimage2DArray = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_vimage2DArray') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_subpassInput = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_subpassInput') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_subpassInputMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_subpassInputMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isubpassInput = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isubpassInput') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_isubpassInputMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_isubpassInputMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usubpassInput = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usubpassInput') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_usubpassInputMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_usubpassInputMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_textureSubpassInput = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_textureSubpassInput') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_textureSubpassInputMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_textureSubpassInputMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itextureSubpassInput = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itextureSubpassInput') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_itextureSubpassInputMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_itextureSubpassInputMS') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utextureSubpassInput = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utextureSubpassInput') # type: ignore +except (ValueError,AttributeError): pass +try: glsl_type_builtin_utextureSubpassInputMS = struct_glsl_type.in_dll(dll, 'glsl_type_builtin_utextureSubpassInputMS') # type: ignore +except (ValueError,AttributeError): pass +enum_a6xx_shift_amount: dict[int, str] = {(NO_SHIFT:=0): 'NO_SHIFT', (HALF_PIXEL_SHIFT:=1): 'HALF_PIXEL_SHIFT', (FULL_PIXEL_SHIFT:=2): 'FULL_PIXEL_SHIFT'} +enum_a6xx_sequenced_thread_dist: dict[int, str] = {(DIST_SCREEN_COORD:=0): 'DIST_SCREEN_COORD', (DIST_ALL_TO_RB0:=1): 'DIST_ALL_TO_RB0'} +enum_a6xx_single_prim_mode: dict[int, str] = {(NO_FLUSH:=0): 'NO_FLUSH', (FLUSH_PER_OVERLAP_AND_OVERWRITE:=1): 'FLUSH_PER_OVERLAP_AND_OVERWRITE', (FLUSH_PER_OVERLAP:=3): 'FLUSH_PER_OVERLAP'} +enum_a6xx_raster_mode: dict[int, str] = {(TYPE_TILED:=0): 'TYPE_TILED', (TYPE_WRITER:=1): 'TYPE_WRITER'} +enum_a6xx_raster_direction: dict[int, str] = {(LR_TB:=0): 'LR_TB', (RL_TB:=1): 'RL_TB', (LR_BT:=2): 'LR_BT', (RB_BT:=3): 'RB_BT'} +enum_a6xx_render_mode: dict[int, str] = {(RENDERING_PASS:=0): 'RENDERING_PASS', (BINNING_PASS:=1): 'BINNING_PASS'} +enum_a6xx_buffers_location: dict[int, str] = {(BUFFERS_IN_GMEM:=0): 'BUFFERS_IN_GMEM', (BUFFERS_IN_SYSMEM:=3): 'BUFFERS_IN_SYSMEM'} +enum_a6xx_lrz_feedback_mask: dict[int, str] = {(LRZ_FEEDBACK_NONE:=0): 'LRZ_FEEDBACK_NONE', (LRZ_FEEDBACK_EARLY_Z:=1): 'LRZ_FEEDBACK_EARLY_Z', (LRZ_FEEDBACK_EARLY_Z_LATE_Z:=2): 'LRZ_FEEDBACK_EARLY_Z_LATE_Z', (LRZ_FEEDBACK_EARLY_Z_OR_EARLY_Z_LATE_Z:=3): 'LRZ_FEEDBACK_EARLY_Z_OR_EARLY_Z_LATE_Z', (LRZ_FEEDBACK_LATE_Z:=4): 'LRZ_FEEDBACK_LATE_Z'} +enum_a6xx_fsr_combiner: dict[int, str] = {(FSR_COMBINER_OP_KEEP:=0): 'FSR_COMBINER_OP_KEEP', (FSR_COMBINER_OP_REPLACE:=1): 'FSR_COMBINER_OP_REPLACE', (FSR_COMBINER_OP_MIN:=2): 'FSR_COMBINER_OP_MIN', (FSR_COMBINER_OP_MAX:=3): 'FSR_COMBINER_OP_MAX', (FSR_COMBINER_OP_MUL:=4): 'FSR_COMBINER_OP_MUL'} +enum_a6xx_lrz_dir_status: dict[int, str] = {(LRZ_DIR_LE:=1): 'LRZ_DIR_LE', (LRZ_DIR_GE:=2): 'LRZ_DIR_GE', (LRZ_DIR_INVALID:=3): 'LRZ_DIR_INVALID'} +enum_a6xx_fragcoord_sample_mode: dict[int, str] = {(FRAGCOORD_CENTER:=0): 'FRAGCOORD_CENTER', (FRAGCOORD_SAMPLE:=3): 'FRAGCOORD_SAMPLE'} +enum_a6xx_rotation: dict[int, str] = {(ROTATE_0:=0): 'ROTATE_0', (ROTATE_90:=1): 'ROTATE_90', (ROTATE_180:=2): 'ROTATE_180', (ROTATE_270:=3): 'ROTATE_270', (ROTATE_HFLIP:=4): 'ROTATE_HFLIP', (ROTATE_VFLIP:=5): 'ROTATE_VFLIP'} +enum_a6xx_blit_event_type: dict[int, str] = {(BLIT_EVENT_STORE:=0): 'BLIT_EVENT_STORE', (BLIT_EVENT_STORE_AND_CLEAR:=1): 'BLIT_EVENT_STORE_AND_CLEAR', (BLIT_EVENT_CLEAR:=2): 'BLIT_EVENT_CLEAR', (BLIT_EVENT_LOAD:=3): 'BLIT_EVENT_LOAD'} +enum_a7xx_blit_clear_mode: dict[int, str] = {(CLEAR_MODE_SYSMEM:=0): 'CLEAR_MODE_SYSMEM', (CLEAR_MODE_GMEM:=1): 'CLEAR_MODE_GMEM'} +enum_a6xx_ccu_cache_size: dict[int, str] = {(CCU_CACHE_SIZE_FULL:=0): 'CCU_CACHE_SIZE_FULL', (CCU_CACHE_SIZE_HALF:=1): 'CCU_CACHE_SIZE_HALF', (CCU_CACHE_SIZE_QUARTER:=2): 'CCU_CACHE_SIZE_QUARTER', (CCU_CACHE_SIZE_EIGHTH:=3): 'CCU_CACHE_SIZE_EIGHTH'} +enum_a7xx_concurrent_resolve_mode: dict[int, str] = {(CONCURRENT_RESOLVE_MODE_DISABLED:=0): 'CONCURRENT_RESOLVE_MODE_DISABLED', (CONCURRENT_RESOLVE_MODE_1:=1): 'CONCURRENT_RESOLVE_MODE_1', (CONCURRENT_RESOLVE_MODE_2:=2): 'CONCURRENT_RESOLVE_MODE_2'} +enum_a7xx_concurrent_unresolve_mode: dict[int, str] = {(CONCURRENT_UNRESOLVE_MODE_DISABLED:=0): 'CONCURRENT_UNRESOLVE_MODE_DISABLED', (CONCURRENT_UNRESOLVE_MODE_PARTIAL:=1): 'CONCURRENT_UNRESOLVE_MODE_PARTIAL', (CONCURRENT_UNRESOLVE_MODE_FULL:=3): 'CONCURRENT_UNRESOLVE_MODE_FULL'} +enum_a6xx_varying_interp_mode: dict[int, str] = {(INTERP_SMOOTH:=0): 'INTERP_SMOOTH', (INTERP_FLAT:=1): 'INTERP_FLAT', (INTERP_ZERO:=2): 'INTERP_ZERO', (INTERP_ONE:=3): 'INTERP_ONE'} +enum_a6xx_varying_ps_repl_mode: dict[int, str] = {(PS_REPL_NONE:=0): 'PS_REPL_NONE', (PS_REPL_S:=1): 'PS_REPL_S', (PS_REPL_T:=2): 'PS_REPL_T', (PS_REPL_ONE_MINUS_T:=3): 'PS_REPL_ONE_MINUS_T'} +enum_a6xx_threadsize: dict[int, str] = {(THREAD64:=0): 'THREAD64', (THREAD128:=1): 'THREAD128'} +enum_a6xx_const_ram_mode: dict[int, str] = {(CONSTLEN_128:=0): 'CONSTLEN_128', (CONSTLEN_192:=1): 'CONSTLEN_192', (CONSTLEN_256:=2): 'CONSTLEN_256', (CONSTLEN_512:=3): 'CONSTLEN_512'} +enum_a7xx_workitem_rast_order: dict[int, str] = {(WORKITEMRASTORDER_LINEAR:=0): 'WORKITEMRASTORDER_LINEAR', (WORKITEMRASTORDER_TILED:=1): 'WORKITEMRASTORDER_TILED'} +enum_a6xx_bindless_descriptor_size: dict[int, str] = {(BINDLESS_DESCRIPTOR_16B:=1): 'BINDLESS_DESCRIPTOR_16B', (BINDLESS_DESCRIPTOR_64B:=3): 'BINDLESS_DESCRIPTOR_64B'} +enum_a6xx_isam_mode: dict[int, str] = {(ISAMMODE_CL:=1): 'ISAMMODE_CL', (ISAMMODE_GL:=2): 'ISAMMODE_GL'} +enum_a6xx_sp_a2d_output_ifmt_type: dict[int, str] = {(OUTPUT_IFMT_2D_FLOAT:=0): 'OUTPUT_IFMT_2D_FLOAT', (OUTPUT_IFMT_2D_SINT:=1): 'OUTPUT_IFMT_2D_SINT', (OUTPUT_IFMT_2D_UINT:=2): 'OUTPUT_IFMT_2D_UINT'} +enum_a6xx_coord_round: dict[int, str] = {(COORD_TRUNCATE:=0): 'COORD_TRUNCATE', (COORD_ROUND_NEAREST_EVEN:=1): 'COORD_ROUND_NEAREST_EVEN'} +enum_a6xx_nearest_mode: dict[int, str] = {(ROUND_CLAMP_TRUNCATE:=0): 'ROUND_CLAMP_TRUNCATE', (CLAMP_ROUND_TRUNCATE:=1): 'CLAMP_ROUND_TRUNCATE'} +enum_a7xx_cs_yalign: dict[int, str] = {(CS_YALIGN_1:=8): 'CS_YALIGN_1', (CS_YALIGN_2:=4): 'CS_YALIGN_2', (CS_YALIGN_4:=2): 'CS_YALIGN_4', (CS_YALIGN_8:=1): 'CS_YALIGN_8'} +enum_vgt_event_type: dict[int, str] = {(VS_DEALLOC:=0): 'VS_DEALLOC', (PS_DEALLOC:=1): 'PS_DEALLOC', (VS_DONE_TS:=2): 'VS_DONE_TS', (PS_DONE_TS:=3): 'PS_DONE_TS', (CACHE_FLUSH_TS:=4): 'CACHE_FLUSH_TS', (CONTEXT_DONE:=5): 'CONTEXT_DONE', (CACHE_FLUSH:=6): 'CACHE_FLUSH', (VIZQUERY_START:=7): 'VIZQUERY_START', (HLSQ_FLUSH:=7): 'HLSQ_FLUSH', (VIZQUERY_END:=8): 'VIZQUERY_END', (SC_WAIT_WC:=9): 'SC_WAIT_WC', (WRITE_PRIMITIVE_COUNTS:=9): 'WRITE_PRIMITIVE_COUNTS', (START_PRIMITIVE_CTRS:=11): 'START_PRIMITIVE_CTRS', (STOP_PRIMITIVE_CTRS:=12): 'STOP_PRIMITIVE_CTRS', (RST_PIX_CNT:=13): 'RST_PIX_CNT', (RST_VTX_CNT:=14): 'RST_VTX_CNT', (TILE_FLUSH:=15): 'TILE_FLUSH', (STAT_EVENT:=16): 'STAT_EVENT', (CACHE_FLUSH_AND_INV_TS_EVENT:=20): 'CACHE_FLUSH_AND_INV_TS_EVENT', (ZPASS_DONE:=21): 'ZPASS_DONE', (CACHE_FLUSH_AND_INV_EVENT:=22): 'CACHE_FLUSH_AND_INV_EVENT', (RB_DONE_TS:=22): 'RB_DONE_TS', (PERFCOUNTER_START:=23): 'PERFCOUNTER_START', (PERFCOUNTER_STOP:=24): 'PERFCOUNTER_STOP', (VS_FETCH_DONE:=27): 'VS_FETCH_DONE', (FACENESS_FLUSH:=28): 'FACENESS_FLUSH', (WT_DONE_TS:=8): 'WT_DONE_TS', (START_FRAGMENT_CTRS:=13): 'START_FRAGMENT_CTRS', (STOP_FRAGMENT_CTRS:=14): 'STOP_FRAGMENT_CTRS', (START_COMPUTE_CTRS:=15): 'START_COMPUTE_CTRS', (STOP_COMPUTE_CTRS:=16): 'STOP_COMPUTE_CTRS', (FLUSH_SO_0:=17): 'FLUSH_SO_0', (FLUSH_SO_1:=18): 'FLUSH_SO_1', (FLUSH_SO_2:=19): 'FLUSH_SO_2', (FLUSH_SO_3:=20): 'FLUSH_SO_3', (PC_CCU_INVALIDATE_DEPTH:=24): 'PC_CCU_INVALIDATE_DEPTH', (PC_CCU_INVALIDATE_COLOR:=25): 'PC_CCU_INVALIDATE_COLOR', (PC_CCU_RESOLVE_TS:=26): 'PC_CCU_RESOLVE_TS', (PC_CCU_FLUSH_DEPTH_TS:=28): 'PC_CCU_FLUSH_DEPTH_TS', (PC_CCU_FLUSH_COLOR_TS:=29): 'PC_CCU_FLUSH_COLOR_TS', (BLIT:=30): 'BLIT', (LRZ_FLIP_BUFFER:=36): 'LRZ_FLIP_BUFFER', (LRZ_CLEAR:=37): 'LRZ_CLEAR', (LRZ_FLUSH:=38): 'LRZ_FLUSH', (BLIT_OP_FILL_2D:=39): 'BLIT_OP_FILL_2D', (BLIT_OP_COPY_2D:=40): 'BLIT_OP_COPY_2D', (UNK_40:=40): 'UNK_40', (LRZ_Q_CACHE_INVALIDATE:=41): 'LRZ_Q_CACHE_INVALIDATE', (BLIT_OP_SCALE_2D:=42): 'BLIT_OP_SCALE_2D', (CONTEXT_DONE_2D:=43): 'CONTEXT_DONE_2D', (UNK_2C:=44): 'UNK_2C', (UNK_2D:=45): 'UNK_2D', (CACHE_INVALIDATE:=49): 'CACHE_INVALIDATE', (LABEL:=63): 'LABEL', (DUMMY_EVENT:=1): 'DUMMY_EVENT', (CCU_INVALIDATE_DEPTH:=24): 'CCU_INVALIDATE_DEPTH', (CCU_INVALIDATE_COLOR:=25): 'CCU_INVALIDATE_COLOR', (CCU_RESOLVE_CLEAN:=26): 'CCU_RESOLVE_CLEAN', (CCU_FLUSH_DEPTH:=28): 'CCU_FLUSH_DEPTH', (CCU_FLUSH_COLOR:=29): 'CCU_FLUSH_COLOR', (CCU_RESOLVE:=30): 'CCU_RESOLVE', (CCU_END_RESOLVE_GROUP:=31): 'CCU_END_RESOLVE_GROUP', (CCU_CLEAN_DEPTH:=32): 'CCU_CLEAN_DEPTH', (CCU_CLEAN_COLOR:=33): 'CCU_CLEAN_COLOR', (CACHE_RESET:=48): 'CACHE_RESET', (CACHE_CLEAN:=49): 'CACHE_CLEAN', (CACHE_FLUSH7:=50): 'CACHE_FLUSH7', (CACHE_INVALIDATE7:=51): 'CACHE_INVALIDATE7'} +enum_pc_di_primtype: dict[int, str] = {(DI_PT_NONE:=0): 'DI_PT_NONE', (DI_PT_POINTLIST_PSIZE:=1): 'DI_PT_POINTLIST_PSIZE', (DI_PT_LINELIST:=2): 'DI_PT_LINELIST', (DI_PT_LINESTRIP:=3): 'DI_PT_LINESTRIP', (DI_PT_TRILIST:=4): 'DI_PT_TRILIST', (DI_PT_TRIFAN:=5): 'DI_PT_TRIFAN', (DI_PT_TRISTRIP:=6): 'DI_PT_TRISTRIP', (DI_PT_LINELOOP:=7): 'DI_PT_LINELOOP', (DI_PT_RECTLIST:=8): 'DI_PT_RECTLIST', (DI_PT_POINTLIST:=9): 'DI_PT_POINTLIST', (DI_PT_LINE_ADJ:=10): 'DI_PT_LINE_ADJ', (DI_PT_LINESTRIP_ADJ:=11): 'DI_PT_LINESTRIP_ADJ', (DI_PT_TRI_ADJ:=12): 'DI_PT_TRI_ADJ', (DI_PT_TRISTRIP_ADJ:=13): 'DI_PT_TRISTRIP_ADJ', (DI_PT_PATCHES0:=31): 'DI_PT_PATCHES0', (DI_PT_PATCHES1:=32): 'DI_PT_PATCHES1', (DI_PT_PATCHES2:=33): 'DI_PT_PATCHES2', (DI_PT_PATCHES3:=34): 'DI_PT_PATCHES3', (DI_PT_PATCHES4:=35): 'DI_PT_PATCHES4', (DI_PT_PATCHES5:=36): 'DI_PT_PATCHES5', (DI_PT_PATCHES6:=37): 'DI_PT_PATCHES6', (DI_PT_PATCHES7:=38): 'DI_PT_PATCHES7', (DI_PT_PATCHES8:=39): 'DI_PT_PATCHES8', (DI_PT_PATCHES9:=40): 'DI_PT_PATCHES9', (DI_PT_PATCHES10:=41): 'DI_PT_PATCHES10', (DI_PT_PATCHES11:=42): 'DI_PT_PATCHES11', (DI_PT_PATCHES12:=43): 'DI_PT_PATCHES12', (DI_PT_PATCHES13:=44): 'DI_PT_PATCHES13', (DI_PT_PATCHES14:=45): 'DI_PT_PATCHES14', (DI_PT_PATCHES15:=46): 'DI_PT_PATCHES15', (DI_PT_PATCHES16:=47): 'DI_PT_PATCHES16', (DI_PT_PATCHES17:=48): 'DI_PT_PATCHES17', (DI_PT_PATCHES18:=49): 'DI_PT_PATCHES18', (DI_PT_PATCHES19:=50): 'DI_PT_PATCHES19', (DI_PT_PATCHES20:=51): 'DI_PT_PATCHES20', (DI_PT_PATCHES21:=52): 'DI_PT_PATCHES21', (DI_PT_PATCHES22:=53): 'DI_PT_PATCHES22', (DI_PT_PATCHES23:=54): 'DI_PT_PATCHES23', (DI_PT_PATCHES24:=55): 'DI_PT_PATCHES24', (DI_PT_PATCHES25:=56): 'DI_PT_PATCHES25', (DI_PT_PATCHES26:=57): 'DI_PT_PATCHES26', (DI_PT_PATCHES27:=58): 'DI_PT_PATCHES27', (DI_PT_PATCHES28:=59): 'DI_PT_PATCHES28', (DI_PT_PATCHES29:=60): 'DI_PT_PATCHES29', (DI_PT_PATCHES30:=61): 'DI_PT_PATCHES30', (DI_PT_PATCHES31:=62): 'DI_PT_PATCHES31'} +enum_pc_di_src_sel: dict[int, str] = {(DI_SRC_SEL_DMA:=0): 'DI_SRC_SEL_DMA', (DI_SRC_SEL_IMMEDIATE:=1): 'DI_SRC_SEL_IMMEDIATE', (DI_SRC_SEL_AUTO_INDEX:=2): 'DI_SRC_SEL_AUTO_INDEX', (DI_SRC_SEL_AUTO_XFB:=3): 'DI_SRC_SEL_AUTO_XFB'} +enum_pc_di_face_cull_sel: dict[int, str] = {(DI_FACE_CULL_NONE:=0): 'DI_FACE_CULL_NONE', (DI_FACE_CULL_FETCH:=1): 'DI_FACE_CULL_FETCH', (DI_FACE_BACKFACE_CULL:=2): 'DI_FACE_BACKFACE_CULL', (DI_FACE_FRONTFACE_CULL:=3): 'DI_FACE_FRONTFACE_CULL'} +enum_pc_di_index_size: dict[int, str] = {(INDEX_SIZE_IGN:=0): 'INDEX_SIZE_IGN', (INDEX_SIZE_16_BIT:=0): 'INDEX_SIZE_16_BIT', (INDEX_SIZE_32_BIT:=1): 'INDEX_SIZE_32_BIT', (INDEX_SIZE_8_BIT:=2): 'INDEX_SIZE_8_BIT', (INDEX_SIZE_INVALID:=0): 'INDEX_SIZE_INVALID'} +enum_pc_di_vis_cull_mode: dict[int, str] = {(IGNORE_VISIBILITY:=0): 'IGNORE_VISIBILITY', (USE_VISIBILITY:=1): 'USE_VISIBILITY'} +enum_adreno_pm4_packet_type: dict[int, str] = {(CP_TYPE0_PKT:=0): 'CP_TYPE0_PKT', (CP_TYPE1_PKT:=1073741824): 'CP_TYPE1_PKT', (CP_TYPE2_PKT:=2147483648): 'CP_TYPE2_PKT', (CP_TYPE3_PKT:=3221225472): 'CP_TYPE3_PKT', (CP_TYPE4_PKT:=1073741824): 'CP_TYPE4_PKT', (CP_TYPE7_PKT:=1879048192): 'CP_TYPE7_PKT'} +enum_adreno_pm4_type3_packets: dict[int, str] = {(CP_ME_INIT:=72): 'CP_ME_INIT', (CP_NOP:=16): 'CP_NOP', (CP_PREEMPT_ENABLE:=28): 'CP_PREEMPT_ENABLE', (CP_PREEMPT_TOKEN:=30): 'CP_PREEMPT_TOKEN', (CP_INDIRECT_BUFFER:=63): 'CP_INDIRECT_BUFFER', (CP_INDIRECT_BUFFER_CHAIN:=87): 'CP_INDIRECT_BUFFER_CHAIN', (CP_INDIRECT_BUFFER_PFD:=55): 'CP_INDIRECT_BUFFER_PFD', (CP_WAIT_FOR_IDLE:=38): 'CP_WAIT_FOR_IDLE', (CP_WAIT_REG_MEM:=60): 'CP_WAIT_REG_MEM', (CP_WAIT_REG_EQ:=82): 'CP_WAIT_REG_EQ', (CP_WAIT_REG_GTE:=83): 'CP_WAIT_REG_GTE', (CP_WAIT_UNTIL_READ:=92): 'CP_WAIT_UNTIL_READ', (CP_WAIT_IB_PFD_COMPLETE:=93): 'CP_WAIT_IB_PFD_COMPLETE', (CP_REG_RMW:=33): 'CP_REG_RMW', (CP_SET_BIN_DATA:=47): 'CP_SET_BIN_DATA', (CP_SET_BIN_DATA5:=47): 'CP_SET_BIN_DATA5', (CP_REG_TO_MEM:=62): 'CP_REG_TO_MEM', (CP_MEM_WRITE:=61): 'CP_MEM_WRITE', (CP_MEM_WRITE_CNTR:=79): 'CP_MEM_WRITE_CNTR', (CP_COND_EXEC:=68): 'CP_COND_EXEC', (CP_COND_WRITE:=69): 'CP_COND_WRITE', (CP_COND_WRITE5:=69): 'CP_COND_WRITE5', (CP_EVENT_WRITE:=70): 'CP_EVENT_WRITE', (CP_EVENT_WRITE7:=70): 'CP_EVENT_WRITE7', (CP_EVENT_WRITE_SHD:=88): 'CP_EVENT_WRITE_SHD', (CP_EVENT_WRITE_CFL:=89): 'CP_EVENT_WRITE_CFL', (CP_EVENT_WRITE_ZPD:=91): 'CP_EVENT_WRITE_ZPD', (CP_RUN_OPENCL:=49): 'CP_RUN_OPENCL', (CP_DRAW_INDX:=34): 'CP_DRAW_INDX', (CP_DRAW_INDX_2:=54): 'CP_DRAW_INDX_2', (CP_DRAW_INDX_BIN:=52): 'CP_DRAW_INDX_BIN', (CP_DRAW_INDX_2_BIN:=53): 'CP_DRAW_INDX_2_BIN', (CP_VIZ_QUERY:=35): 'CP_VIZ_QUERY', (CP_SET_STATE:=37): 'CP_SET_STATE', (CP_SET_CONSTANT:=45): 'CP_SET_CONSTANT', (CP_IM_LOAD:=39): 'CP_IM_LOAD', (CP_IM_LOAD_IMMEDIATE:=43): 'CP_IM_LOAD_IMMEDIATE', (CP_LOAD_CONSTANT_CONTEXT:=46): 'CP_LOAD_CONSTANT_CONTEXT', (CP_INVALIDATE_STATE:=59): 'CP_INVALIDATE_STATE', (CP_SET_SHADER_BASES:=74): 'CP_SET_SHADER_BASES', (CP_SET_BIN_MASK:=80): 'CP_SET_BIN_MASK', (CP_SET_BIN_SELECT:=81): 'CP_SET_BIN_SELECT', (CP_CONTEXT_UPDATE:=94): 'CP_CONTEXT_UPDATE', (CP_INTERRUPT:=64): 'CP_INTERRUPT', (CP_IM_STORE:=44): 'CP_IM_STORE', (CP_SET_DRAW_INIT_FLAGS:=75): 'CP_SET_DRAW_INIT_FLAGS', (CP_SET_PROTECTED_MODE:=95): 'CP_SET_PROTECTED_MODE', (CP_BOOTSTRAP_UCODE:=111): 'CP_BOOTSTRAP_UCODE', (CP_LOAD_STATE:=48): 'CP_LOAD_STATE', (CP_LOAD_STATE4:=48): 'CP_LOAD_STATE4', (CP_COND_INDIRECT_BUFFER_PFE:=58): 'CP_COND_INDIRECT_BUFFER_PFE', (CP_COND_INDIRECT_BUFFER_PFD:=50): 'CP_COND_INDIRECT_BUFFER_PFD', (CP_INDIRECT_BUFFER_PFE:=63): 'CP_INDIRECT_BUFFER_PFE', (CP_SET_BIN:=76): 'CP_SET_BIN', (CP_TEST_TWO_MEMS:=113): 'CP_TEST_TWO_MEMS', (CP_REG_WR_NO_CTXT:=120): 'CP_REG_WR_NO_CTXT', (CP_RECORD_PFP_TIMESTAMP:=17): 'CP_RECORD_PFP_TIMESTAMP', (CP_SET_SECURE_MODE:=102): 'CP_SET_SECURE_MODE', (CP_WAIT_FOR_ME:=19): 'CP_WAIT_FOR_ME', (CP_SET_DRAW_STATE:=67): 'CP_SET_DRAW_STATE', (CP_DRAW_INDX_OFFSET:=56): 'CP_DRAW_INDX_OFFSET', (CP_DRAW_INDIRECT:=40): 'CP_DRAW_INDIRECT', (CP_DRAW_INDX_INDIRECT:=41): 'CP_DRAW_INDX_INDIRECT', (CP_DRAW_INDIRECT_MULTI:=42): 'CP_DRAW_INDIRECT_MULTI', (CP_DRAW_AUTO:=36): 'CP_DRAW_AUTO', (CP_DRAW_PRED_ENABLE_GLOBAL:=25): 'CP_DRAW_PRED_ENABLE_GLOBAL', (CP_DRAW_PRED_ENABLE_LOCAL:=26): 'CP_DRAW_PRED_ENABLE_LOCAL', (CP_DRAW_PRED_SET:=78): 'CP_DRAW_PRED_SET', (CP_WIDE_REG_WRITE:=116): 'CP_WIDE_REG_WRITE', (CP_SCRATCH_TO_REG:=77): 'CP_SCRATCH_TO_REG', (CP_REG_TO_SCRATCH:=74): 'CP_REG_TO_SCRATCH', (CP_WAIT_MEM_WRITES:=18): 'CP_WAIT_MEM_WRITES', (CP_COND_REG_EXEC:=71): 'CP_COND_REG_EXEC', (CP_MEM_TO_REG:=66): 'CP_MEM_TO_REG', (CP_EXEC_CS_INDIRECT:=65): 'CP_EXEC_CS_INDIRECT', (CP_EXEC_CS:=51): 'CP_EXEC_CS', (CP_PERFCOUNTER_ACTION:=80): 'CP_PERFCOUNTER_ACTION', (CP_SMMU_TABLE_UPDATE:=83): 'CP_SMMU_TABLE_UPDATE', (CP_SET_MARKER:=101): 'CP_SET_MARKER', (CP_SET_PSEUDO_REG:=86): 'CP_SET_PSEUDO_REG', (CP_CONTEXT_REG_BUNCH:=92): 'CP_CONTEXT_REG_BUNCH', (CP_YIELD_ENABLE:=28): 'CP_YIELD_ENABLE', (CP_SKIP_IB2_ENABLE_GLOBAL:=29): 'CP_SKIP_IB2_ENABLE_GLOBAL', (CP_SKIP_IB2_ENABLE_LOCAL:=35): 'CP_SKIP_IB2_ENABLE_LOCAL', (CP_SET_SUBDRAW_SIZE:=53): 'CP_SET_SUBDRAW_SIZE', (CP_WHERE_AM_I:=98): 'CP_WHERE_AM_I', (CP_SET_VISIBILITY_OVERRIDE:=100): 'CP_SET_VISIBILITY_OVERRIDE', (CP_PREEMPT_ENABLE_GLOBAL:=105): 'CP_PREEMPT_ENABLE_GLOBAL', (CP_PREEMPT_ENABLE_LOCAL:=106): 'CP_PREEMPT_ENABLE_LOCAL', (CP_CONTEXT_SWITCH_YIELD:=107): 'CP_CONTEXT_SWITCH_YIELD', (CP_SET_RENDER_MODE:=108): 'CP_SET_RENDER_MODE', (CP_COMPUTE_CHECKPOINT:=110): 'CP_COMPUTE_CHECKPOINT', (CP_MEM_TO_MEM:=115): 'CP_MEM_TO_MEM', (CP_BLIT:=44): 'CP_BLIT', (CP_REG_TEST:=57): 'CP_REG_TEST', (CP_SET_MODE:=99): 'CP_SET_MODE', (CP_LOAD_STATE6_GEOM:=50): 'CP_LOAD_STATE6_GEOM', (CP_LOAD_STATE6_FRAG:=52): 'CP_LOAD_STATE6_FRAG', (CP_LOAD_STATE6:=54): 'CP_LOAD_STATE6', (IN_IB_PREFETCH_END:=23): 'IN_IB_PREFETCH_END', (IN_SUBBLK_PREFETCH:=31): 'IN_SUBBLK_PREFETCH', (IN_INSTR_PREFETCH:=32): 'IN_INSTR_PREFETCH', (IN_INSTR_MATCH:=71): 'IN_INSTR_MATCH', (IN_CONST_PREFETCH:=73): 'IN_CONST_PREFETCH', (IN_INCR_UPDT_STATE:=85): 'IN_INCR_UPDT_STATE', (IN_INCR_UPDT_CONST:=86): 'IN_INCR_UPDT_CONST', (IN_INCR_UPDT_INSTR:=87): 'IN_INCR_UPDT_INSTR', (PKT4:=4): 'PKT4', (IN_IB_END:=10): 'IN_IB_END', (IN_GMU_INTERRUPT:=11): 'IN_GMU_INTERRUPT', (IN_PREEMPT:=15): 'IN_PREEMPT', (CP_SCRATCH_WRITE:=76): 'CP_SCRATCH_WRITE', (CP_REG_TO_MEM_OFFSET_MEM:=116): 'CP_REG_TO_MEM_OFFSET_MEM', (CP_REG_TO_MEM_OFFSET_REG:=114): 'CP_REG_TO_MEM_OFFSET_REG', (CP_WAIT_MEM_GTE:=20): 'CP_WAIT_MEM_GTE', (CP_WAIT_TWO_REGS:=112): 'CP_WAIT_TWO_REGS', (CP_MEMCPY:=117): 'CP_MEMCPY', (CP_SET_BIN_DATA5_OFFSET:=46): 'CP_SET_BIN_DATA5_OFFSET', (CP_SET_UNK_BIN_DATA:=45): 'CP_SET_UNK_BIN_DATA', (CP_CONTEXT_SWITCH:=84): 'CP_CONTEXT_SWITCH', (CP_SET_AMBLE:=85): 'CP_SET_AMBLE', (CP_REG_WRITE:=109): 'CP_REG_WRITE', (CP_START_BIN:=80): 'CP_START_BIN', (CP_END_BIN:=81): 'CP_END_BIN', (CP_PREEMPT_DISABLE:=108): 'CP_PREEMPT_DISABLE', (CP_WAIT_TIMESTAMP:=20): 'CP_WAIT_TIMESTAMP', (CP_GLOBAL_TIMESTAMP:=21): 'CP_GLOBAL_TIMESTAMP', (CP_LOCAL_TIMESTAMP:=22): 'CP_LOCAL_TIMESTAMP', (CP_THREAD_CONTROL:=23): 'CP_THREAD_CONTROL', (CP_RESOURCE_LIST:=24): 'CP_RESOURCE_LIST', (CP_BV_BR_COUNT_OPS:=27): 'CP_BV_BR_COUNT_OPS', (CP_MODIFY_TIMESTAMP:=28): 'CP_MODIFY_TIMESTAMP', (CP_CONTEXT_REG_BUNCH2:=93): 'CP_CONTEXT_REG_BUNCH2', (CP_MEM_TO_SCRATCH_MEM:=73): 'CP_MEM_TO_SCRATCH_MEM', (CP_FIXED_STRIDE_DRAW_TABLE:=127): 'CP_FIXED_STRIDE_DRAW_TABLE', (CP_RESET_CONTEXT_STATE:=31): 'CP_RESET_CONTEXT_STATE', (CP_CCHE_INVALIDATE:=58): 'CP_CCHE_INVALIDATE', (CP_SCOPE_CNTL:=108): 'CP_SCOPE_CNTL'} +enum_adreno_state_block: dict[int, str] = {(SB_VERT_TEX:=0): 'SB_VERT_TEX', (SB_VERT_MIPADDR:=1): 'SB_VERT_MIPADDR', (SB_FRAG_TEX:=2): 'SB_FRAG_TEX', (SB_FRAG_MIPADDR:=3): 'SB_FRAG_MIPADDR', (SB_VERT_SHADER:=4): 'SB_VERT_SHADER', (SB_GEOM_SHADER:=5): 'SB_GEOM_SHADER', (SB_FRAG_SHADER:=6): 'SB_FRAG_SHADER', (SB_COMPUTE_SHADER:=7): 'SB_COMPUTE_SHADER'} +enum_adreno_state_type: dict[int, str] = {(ST_SHADER:=0): 'ST_SHADER', (ST_CONSTANTS:=1): 'ST_CONSTANTS'} +enum_adreno_state_src: dict[int, str] = {(SS_DIRECT:=0): 'SS_DIRECT', (SS_INVALID_ALL_IC:=2): 'SS_INVALID_ALL_IC', (SS_INVALID_PART_IC:=3): 'SS_INVALID_PART_IC', (SS_INDIRECT:=4): 'SS_INDIRECT', (SS_INDIRECT_TCM:=5): 'SS_INDIRECT_TCM', (SS_INDIRECT_STM:=6): 'SS_INDIRECT_STM'} +enum_a4xx_state_block: dict[int, str] = {(SB4_VS_TEX:=0): 'SB4_VS_TEX', (SB4_HS_TEX:=1): 'SB4_HS_TEX', (SB4_DS_TEX:=2): 'SB4_DS_TEX', (SB4_GS_TEX:=3): 'SB4_GS_TEX', (SB4_FS_TEX:=4): 'SB4_FS_TEX', (SB4_CS_TEX:=5): 'SB4_CS_TEX', (SB4_VS_SHADER:=8): 'SB4_VS_SHADER', (SB4_HS_SHADER:=9): 'SB4_HS_SHADER', (SB4_DS_SHADER:=10): 'SB4_DS_SHADER', (SB4_GS_SHADER:=11): 'SB4_GS_SHADER', (SB4_FS_SHADER:=12): 'SB4_FS_SHADER', (SB4_CS_SHADER:=13): 'SB4_CS_SHADER', (SB4_SSBO:=14): 'SB4_SSBO', (SB4_CS_SSBO:=15): 'SB4_CS_SSBO'} +enum_a4xx_state_type: dict[int, str] = {(ST4_SHADER:=0): 'ST4_SHADER', (ST4_CONSTANTS:=1): 'ST4_CONSTANTS', (ST4_UBO:=2): 'ST4_UBO'} +enum_a4xx_state_src: dict[int, str] = {(SS4_DIRECT:=0): 'SS4_DIRECT', (SS4_INDIRECT:=2): 'SS4_INDIRECT'} +enum_a6xx_state_block: dict[int, str] = {(SB6_VS_TEX:=0): 'SB6_VS_TEX', (SB6_HS_TEX:=1): 'SB6_HS_TEX', (SB6_DS_TEX:=2): 'SB6_DS_TEX', (SB6_GS_TEX:=3): 'SB6_GS_TEX', (SB6_FS_TEX:=4): 'SB6_FS_TEX', (SB6_CS_TEX:=5): 'SB6_CS_TEX', (SB6_VS_SHADER:=8): 'SB6_VS_SHADER', (SB6_HS_SHADER:=9): 'SB6_HS_SHADER', (SB6_DS_SHADER:=10): 'SB6_DS_SHADER', (SB6_GS_SHADER:=11): 'SB6_GS_SHADER', (SB6_FS_SHADER:=12): 'SB6_FS_SHADER', (SB6_CS_SHADER:=13): 'SB6_CS_SHADER', (SB6_UAV:=14): 'SB6_UAV', (SB6_CS_UAV:=15): 'SB6_CS_UAV'} +enum_a6xx_state_type: dict[int, str] = {(ST6_SHADER:=0): 'ST6_SHADER', (ST6_CONSTANTS:=1): 'ST6_CONSTANTS', (ST6_UBO:=2): 'ST6_UBO', (ST6_UAV:=3): 'ST6_UAV'} +enum_a6xx_state_src: dict[int, str] = {(SS6_DIRECT:=0): 'SS6_DIRECT', (SS6_BINDLESS:=1): 'SS6_BINDLESS', (SS6_INDIRECT:=2): 'SS6_INDIRECT', (SS6_UBO:=3): 'SS6_UBO'} +enum_a4xx_index_size: dict[int, str] = {(INDEX4_SIZE_8_BIT:=0): 'INDEX4_SIZE_8_BIT', (INDEX4_SIZE_16_BIT:=1): 'INDEX4_SIZE_16_BIT', (INDEX4_SIZE_32_BIT:=2): 'INDEX4_SIZE_32_BIT'} +enum_a6xx_patch_type: dict[int, str] = {(TESS_QUADS:=0): 'TESS_QUADS', (TESS_TRIANGLES:=1): 'TESS_TRIANGLES', (TESS_ISOLINES:=2): 'TESS_ISOLINES'} +enum_a6xx_draw_indirect_opcode: dict[int, str] = {(INDIRECT_OP_NORMAL:=2): 'INDIRECT_OP_NORMAL', (INDIRECT_OP_INDEXED:=4): 'INDIRECT_OP_INDEXED', (INDIRECT_OP_INDIRECT_COUNT:=6): 'INDIRECT_OP_INDIRECT_COUNT', (INDIRECT_OP_INDIRECT_COUNT_INDEXED:=7): 'INDIRECT_OP_INDIRECT_COUNT_INDEXED'} +enum_cp_draw_pred_src: dict[int, str] = {(PRED_SRC_MEM:=5): 'PRED_SRC_MEM'} +enum_cp_draw_pred_test: dict[int, str] = {(NE_0_PASS:=0): 'NE_0_PASS', (EQ_0_PASS:=1): 'EQ_0_PASS'} +enum_a7xx_abs_mask_mode: dict[int, str] = {(ABS_MASK:=1): 'ABS_MASK', (NO_ABS_MASK:=0): 'NO_ABS_MASK'} +enum_cp_cond_function: dict[int, str] = {(WRITE_ALWAYS:=0): 'WRITE_ALWAYS', (WRITE_LT:=1): 'WRITE_LT', (WRITE_LE:=2): 'WRITE_LE', (WRITE_EQ:=3): 'WRITE_EQ', (WRITE_NE:=4): 'WRITE_NE', (WRITE_GE:=5): 'WRITE_GE', (WRITE_GT:=6): 'WRITE_GT'} +enum_poll_memory_type: dict[int, str] = {(POLL_REGISTER:=0): 'POLL_REGISTER', (POLL_MEMORY:=1): 'POLL_MEMORY', (POLL_SCRATCH:=2): 'POLL_SCRATCH', (POLL_ON_CHIP:=3): 'POLL_ON_CHIP'} +enum_render_mode_cmd: dict[int, str] = {(BYPASS:=1): 'BYPASS', (BINNING:=2): 'BINNING', (GMEM:=3): 'GMEM', (BLIT2D:=5): 'BLIT2D', (BLIT2DSCALE:=7): 'BLIT2DSCALE', (END2D:=8): 'END2D'} +enum_event_write_src: dict[int, str] = {(EV_WRITE_USER_32B:=0): 'EV_WRITE_USER_32B', (EV_WRITE_USER_64B:=1): 'EV_WRITE_USER_64B', (EV_WRITE_TIMESTAMP_SUM:=2): 'EV_WRITE_TIMESTAMP_SUM', (EV_WRITE_ALWAYSON:=3): 'EV_WRITE_ALWAYSON', (EV_WRITE_REGS_CONTENT:=4): 'EV_WRITE_REGS_CONTENT'} +enum_event_write_dst: dict[int, str] = {(EV_DST_RAM:=0): 'EV_DST_RAM', (EV_DST_ONCHIP:=1): 'EV_DST_ONCHIP'} +enum_cp_blit_cmd: dict[int, str] = {(BLIT_OP_FILL:=0): 'BLIT_OP_FILL', (BLIT_OP_COPY:=1): 'BLIT_OP_COPY', (BLIT_OP_SCALE:=3): 'BLIT_OP_SCALE'} +enum_set_marker_mode: dict[int, str] = {(SET_RENDER_MODE:=0): 'SET_RENDER_MODE', (SET_IFPC_MODE:=1): 'SET_IFPC_MODE'} +enum_a6xx_ifpc_mode: dict[int, str] = {(IFPC_ENABLE:=0): 'IFPC_ENABLE', (IFPC_DISABLE:=1): 'IFPC_DISABLE'} +enum_a6xx_marker: dict[int, str] = {(RM6_DIRECT_RENDER:=1): 'RM6_DIRECT_RENDER', (RM6_BIN_VISIBILITY:=2): 'RM6_BIN_VISIBILITY', (RM6_BIN_DIRECT:=3): 'RM6_BIN_DIRECT', (RM6_BIN_RENDER_START:=4): 'RM6_BIN_RENDER_START', (RM6_BIN_END_OF_DRAWS:=5): 'RM6_BIN_END_OF_DRAWS', (RM6_BIN_RESOLVE:=6): 'RM6_BIN_RESOLVE', (RM6_BIN_RENDER_END:=7): 'RM6_BIN_RENDER_END', (RM6_COMPUTE:=8): 'RM6_COMPUTE', (RM6_BLIT2DSCALE:=12): 'RM6_BLIT2DSCALE', (RM6_IB1LIST_START:=13): 'RM6_IB1LIST_START', (RM6_IB1LIST_END:=14): 'RM6_IB1LIST_END'} +enum_pseudo_reg: dict[int, str] = {(SMMU_INFO:=0): 'SMMU_INFO', (NON_SECURE_SAVE_ADDR:=1): 'NON_SECURE_SAVE_ADDR', (SECURE_SAVE_ADDR:=2): 'SECURE_SAVE_ADDR', (NON_PRIV_SAVE_ADDR:=3): 'NON_PRIV_SAVE_ADDR', (COUNTER:=4): 'COUNTER', (VSC_PIPE_DATA_DRAW_BASE:=8): 'VSC_PIPE_DATA_DRAW_BASE', (VSC_SIZE_BASE:=9): 'VSC_SIZE_BASE', (VSC_PIPE_DATA_PRIM_BASE:=10): 'VSC_PIPE_DATA_PRIM_BASE', (UNK_STRM_ADDRESS:=11): 'UNK_STRM_ADDRESS', (UNK_STRM_SIZE_ADDRESS:=12): 'UNK_STRM_SIZE_ADDRESS', (BINDLESS_BASE_0_ADDR:=16): 'BINDLESS_BASE_0_ADDR', (BINDLESS_BASE_1_ADDR:=17): 'BINDLESS_BASE_1_ADDR', (BINDLESS_BASE_2_ADDR:=18): 'BINDLESS_BASE_2_ADDR', (BINDLESS_BASE_3_ADDR:=19): 'BINDLESS_BASE_3_ADDR', (BINDLESS_BASE_4_ADDR:=20): 'BINDLESS_BASE_4_ADDR', (BINDLESS_BASE_5_ADDR:=21): 'BINDLESS_BASE_5_ADDR', (BINDLESS_BASE_6_ADDR:=22): 'BINDLESS_BASE_6_ADDR'} +enum_source_type: dict[int, str] = {(SOURCE_REG:=0): 'SOURCE_REG', (SOURCE_SCRATCH_MEM:=1): 'SOURCE_SCRATCH_MEM'} +enum_compare_mode: dict[int, str] = {(PRED_TEST:=1): 'PRED_TEST', (REG_COMPARE:=2): 'REG_COMPARE', (RENDER_MODE:=3): 'RENDER_MODE', (REG_COMPARE_IMM:=4): 'REG_COMPARE_IMM', (THREAD_MODE:=5): 'THREAD_MODE'} +enum_amble_type: dict[int, str] = {(PREAMBLE_AMBLE_TYPE:=0): 'PREAMBLE_AMBLE_TYPE', (BIN_PREAMBLE_AMBLE_TYPE:=1): 'BIN_PREAMBLE_AMBLE_TYPE', (POSTAMBLE_AMBLE_TYPE:=2): 'POSTAMBLE_AMBLE_TYPE', (KMD_AMBLE_TYPE:=3): 'KMD_AMBLE_TYPE'} +enum_reg_tracker: dict[int, str] = {(TRACK_CNTL_REG:=1): 'TRACK_CNTL_REG', (TRACK_RENDER_CNTL:=2): 'TRACK_RENDER_CNTL', (UNK_EVENT_WRITE:=4): 'UNK_EVENT_WRITE', (TRACK_LRZ:=8): 'TRACK_LRZ'} +enum_ts_wait_value_src: dict[int, str] = {(TS_WAIT_GE_32B:=0): 'TS_WAIT_GE_32B', (TS_WAIT_GE_64B:=1): 'TS_WAIT_GE_64B', (TS_WAIT_GE_TIMESTAMP_SUM:=2): 'TS_WAIT_GE_TIMESTAMP_SUM'} +enum_ts_wait_type: dict[int, str] = {(TS_WAIT_RAM:=0): 'TS_WAIT_RAM', (TS_WAIT_ONCHIP:=1): 'TS_WAIT_ONCHIP'} +enum_pipe_count_op: dict[int, str] = {(PIPE_CLEAR_BV_BR:=1): 'PIPE_CLEAR_BV_BR', (PIPE_SET_BR_OFFSET:=2): 'PIPE_SET_BR_OFFSET', (PIPE_BR_WAIT_FOR_BV:=3): 'PIPE_BR_WAIT_FOR_BV', (PIPE_BV_WAIT_FOR_BR:=4): 'PIPE_BV_WAIT_FOR_BR'} +enum_timestamp_op: dict[int, str] = {(MODIFY_TIMESTAMP_CLEAR:=0): 'MODIFY_TIMESTAMP_CLEAR', (MODIFY_TIMESTAMP_ADD_GLOBAL:=1): 'MODIFY_TIMESTAMP_ADD_GLOBAL', (MODIFY_TIMESTAMP_ADD_LOCAL:=2): 'MODIFY_TIMESTAMP_ADD_LOCAL'} +enum_cp_thread: dict[int, str] = {(CP_SET_THREAD_BR:=1): 'CP_SET_THREAD_BR', (CP_SET_THREAD_BV:=2): 'CP_SET_THREAD_BV', (CP_SET_THREAD_BOTH:=3): 'CP_SET_THREAD_BOTH'} +enum_cp_scope: dict[int, str] = {(INTERRUPTS:=0): 'INTERRUPTS'} +enum_a6xx_tile_mode: dict[int, str] = {(TILE6_LINEAR:=0): 'TILE6_LINEAR', (TILE6_2:=2): 'TILE6_2', (TILE6_3:=3): 'TILE6_3'} +enum_a6xx_format: dict[int, str] = {(FMT6_A8_UNORM:=2): 'FMT6_A8_UNORM', (FMT6_8_UNORM:=3): 'FMT6_8_UNORM', (FMT6_8_SNORM:=4): 'FMT6_8_SNORM', (FMT6_8_UINT:=5): 'FMT6_8_UINT', (FMT6_8_SINT:=6): 'FMT6_8_SINT', (FMT6_4_4_4_4_UNORM:=8): 'FMT6_4_4_4_4_UNORM', (FMT6_5_5_5_1_UNORM:=10): 'FMT6_5_5_5_1_UNORM', (FMT6_1_5_5_5_UNORM:=12): 'FMT6_1_5_5_5_UNORM', (FMT6_5_6_5_UNORM:=14): 'FMT6_5_6_5_UNORM', (FMT6_8_8_UNORM:=15): 'FMT6_8_8_UNORM', (FMT6_8_8_SNORM:=16): 'FMT6_8_8_SNORM', (FMT6_8_8_UINT:=17): 'FMT6_8_8_UINT', (FMT6_8_8_SINT:=18): 'FMT6_8_8_SINT', (FMT6_L8_A8_UNORM:=19): 'FMT6_L8_A8_UNORM', (FMT6_16_UNORM:=21): 'FMT6_16_UNORM', (FMT6_16_SNORM:=22): 'FMT6_16_SNORM', (FMT6_16_FLOAT:=23): 'FMT6_16_FLOAT', (FMT6_16_UINT:=24): 'FMT6_16_UINT', (FMT6_16_SINT:=25): 'FMT6_16_SINT', (FMT6_8_8_8_UNORM:=33): 'FMT6_8_8_8_UNORM', (FMT6_8_8_8_SNORM:=34): 'FMT6_8_8_8_SNORM', (FMT6_8_8_8_UINT:=35): 'FMT6_8_8_8_UINT', (FMT6_8_8_8_SINT:=36): 'FMT6_8_8_8_SINT', (FMT6_8_8_8_8_UNORM:=48): 'FMT6_8_8_8_8_UNORM', (FMT6_8_8_8_X8_UNORM:=49): 'FMT6_8_8_8_X8_UNORM', (FMT6_8_8_8_8_SNORM:=50): 'FMT6_8_8_8_8_SNORM', (FMT6_8_8_8_8_UINT:=51): 'FMT6_8_8_8_8_UINT', (FMT6_8_8_8_8_SINT:=52): 'FMT6_8_8_8_8_SINT', (FMT6_9_9_9_E5_FLOAT:=53): 'FMT6_9_9_9_E5_FLOAT', (FMT6_10_10_10_2_UNORM:=54): 'FMT6_10_10_10_2_UNORM', (FMT6_10_10_10_2_UNORM_DEST:=55): 'FMT6_10_10_10_2_UNORM_DEST', (FMT6_10_10_10_2_SNORM:=57): 'FMT6_10_10_10_2_SNORM', (FMT6_10_10_10_2_UINT:=58): 'FMT6_10_10_10_2_UINT', (FMT6_10_10_10_2_SINT:=59): 'FMT6_10_10_10_2_SINT', (FMT6_11_11_10_FLOAT:=66): 'FMT6_11_11_10_FLOAT', (FMT6_16_16_UNORM:=67): 'FMT6_16_16_UNORM', (FMT6_16_16_SNORM:=68): 'FMT6_16_16_SNORM', (FMT6_16_16_FLOAT:=69): 'FMT6_16_16_FLOAT', (FMT6_16_16_UINT:=70): 'FMT6_16_16_UINT', (FMT6_16_16_SINT:=71): 'FMT6_16_16_SINT', (FMT6_32_UNORM:=72): 'FMT6_32_UNORM', (FMT6_32_SNORM:=73): 'FMT6_32_SNORM', (FMT6_32_FLOAT:=74): 'FMT6_32_FLOAT', (FMT6_32_UINT:=75): 'FMT6_32_UINT', (FMT6_32_SINT:=76): 'FMT6_32_SINT', (FMT6_32_FIXED:=77): 'FMT6_32_FIXED', (FMT6_16_16_16_UNORM:=88): 'FMT6_16_16_16_UNORM', (FMT6_16_16_16_SNORM:=89): 'FMT6_16_16_16_SNORM', (FMT6_16_16_16_FLOAT:=90): 'FMT6_16_16_16_FLOAT', (FMT6_16_16_16_UINT:=91): 'FMT6_16_16_16_UINT', (FMT6_16_16_16_SINT:=92): 'FMT6_16_16_16_SINT', (FMT6_16_16_16_16_UNORM:=96): 'FMT6_16_16_16_16_UNORM', (FMT6_16_16_16_16_SNORM:=97): 'FMT6_16_16_16_16_SNORM', (FMT6_16_16_16_16_FLOAT:=98): 'FMT6_16_16_16_16_FLOAT', (FMT6_16_16_16_16_UINT:=99): 'FMT6_16_16_16_16_UINT', (FMT6_16_16_16_16_SINT:=100): 'FMT6_16_16_16_16_SINT', (FMT6_32_32_UNORM:=101): 'FMT6_32_32_UNORM', (FMT6_32_32_SNORM:=102): 'FMT6_32_32_SNORM', (FMT6_32_32_FLOAT:=103): 'FMT6_32_32_FLOAT', (FMT6_32_32_UINT:=104): 'FMT6_32_32_UINT', (FMT6_32_32_SINT:=105): 'FMT6_32_32_SINT', (FMT6_32_32_FIXED:=106): 'FMT6_32_32_FIXED', (FMT6_32_32_32_UNORM:=112): 'FMT6_32_32_32_UNORM', (FMT6_32_32_32_SNORM:=113): 'FMT6_32_32_32_SNORM', (FMT6_32_32_32_UINT:=114): 'FMT6_32_32_32_UINT', (FMT6_32_32_32_SINT:=115): 'FMT6_32_32_32_SINT', (FMT6_32_32_32_FLOAT:=116): 'FMT6_32_32_32_FLOAT', (FMT6_32_32_32_FIXED:=117): 'FMT6_32_32_32_FIXED', (FMT6_32_32_32_32_UNORM:=128): 'FMT6_32_32_32_32_UNORM', (FMT6_32_32_32_32_SNORM:=129): 'FMT6_32_32_32_32_SNORM', (FMT6_32_32_32_32_FLOAT:=130): 'FMT6_32_32_32_32_FLOAT', (FMT6_32_32_32_32_UINT:=131): 'FMT6_32_32_32_32_UINT', (FMT6_32_32_32_32_SINT:=132): 'FMT6_32_32_32_32_SINT', (FMT6_32_32_32_32_FIXED:=133): 'FMT6_32_32_32_32_FIXED', (FMT6_G8R8B8R8_422_UNORM:=140): 'FMT6_G8R8B8R8_422_UNORM', (FMT6_R8G8R8B8_422_UNORM:=141): 'FMT6_R8G8R8B8_422_UNORM', (FMT6_R8_G8B8_2PLANE_420_UNORM:=142): 'FMT6_R8_G8B8_2PLANE_420_UNORM', (FMT6_NV21:=143): 'FMT6_NV21', (FMT6_R8_G8_B8_3PLANE_420_UNORM:=144): 'FMT6_R8_G8_B8_3PLANE_420_UNORM', (FMT6_Z24_UNORM_S8_UINT_AS_R8G8B8A8:=145): 'FMT6_Z24_UNORM_S8_UINT_AS_R8G8B8A8', (FMT6_NV12_Y:=148): 'FMT6_NV12_Y', (FMT6_NV12_UV:=149): 'FMT6_NV12_UV', (FMT6_NV12_VU:=150): 'FMT6_NV12_VU', (FMT6_NV12_4R:=151): 'FMT6_NV12_4R', (FMT6_NV12_4R_Y:=152): 'FMT6_NV12_4R_Y', (FMT6_NV12_4R_UV:=153): 'FMT6_NV12_4R_UV', (FMT6_P010:=154): 'FMT6_P010', (FMT6_P010_Y:=155): 'FMT6_P010_Y', (FMT6_P010_UV:=156): 'FMT6_P010_UV', (FMT6_TP10:=157): 'FMT6_TP10', (FMT6_TP10_Y:=158): 'FMT6_TP10_Y', (FMT6_TP10_UV:=159): 'FMT6_TP10_UV', (FMT6_Z24_UNORM_S8_UINT:=160): 'FMT6_Z24_UNORM_S8_UINT', (FMT6_ETC2_RG11_UNORM:=171): 'FMT6_ETC2_RG11_UNORM', (FMT6_ETC2_RG11_SNORM:=172): 'FMT6_ETC2_RG11_SNORM', (FMT6_ETC2_R11_UNORM:=173): 'FMT6_ETC2_R11_UNORM', (FMT6_ETC2_R11_SNORM:=174): 'FMT6_ETC2_R11_SNORM', (FMT6_ETC1:=175): 'FMT6_ETC1', (FMT6_ETC2_RGB8:=176): 'FMT6_ETC2_RGB8', (FMT6_ETC2_RGBA8:=177): 'FMT6_ETC2_RGBA8', (FMT6_ETC2_RGB8A1:=178): 'FMT6_ETC2_RGB8A1', (FMT6_DXT1:=179): 'FMT6_DXT1', (FMT6_DXT3:=180): 'FMT6_DXT3', (FMT6_DXT5:=181): 'FMT6_DXT5', (FMT6_RGTC1_UNORM:=182): 'FMT6_RGTC1_UNORM', (FMT6_RGTC1_UNORM_FAST:=183): 'FMT6_RGTC1_UNORM_FAST', (FMT6_RGTC1_SNORM:=184): 'FMT6_RGTC1_SNORM', (FMT6_RGTC1_SNORM_FAST:=185): 'FMT6_RGTC1_SNORM_FAST', (FMT6_RGTC2_UNORM:=186): 'FMT6_RGTC2_UNORM', (FMT6_RGTC2_UNORM_FAST:=187): 'FMT6_RGTC2_UNORM_FAST', (FMT6_RGTC2_SNORM:=188): 'FMT6_RGTC2_SNORM', (FMT6_RGTC2_SNORM_FAST:=189): 'FMT6_RGTC2_SNORM_FAST', (FMT6_BPTC_UFLOAT:=190): 'FMT6_BPTC_UFLOAT', (FMT6_BPTC_FLOAT:=191): 'FMT6_BPTC_FLOAT', (FMT6_BPTC:=192): 'FMT6_BPTC', (FMT6_ASTC_4x4:=193): 'FMT6_ASTC_4x4', (FMT6_ASTC_5x4:=194): 'FMT6_ASTC_5x4', (FMT6_ASTC_5x5:=195): 'FMT6_ASTC_5x5', (FMT6_ASTC_6x5:=196): 'FMT6_ASTC_6x5', (FMT6_ASTC_6x6:=197): 'FMT6_ASTC_6x6', (FMT6_ASTC_8x5:=198): 'FMT6_ASTC_8x5', (FMT6_ASTC_8x6:=199): 'FMT6_ASTC_8x6', (FMT6_ASTC_8x8:=200): 'FMT6_ASTC_8x8', (FMT6_ASTC_10x5:=201): 'FMT6_ASTC_10x5', (FMT6_ASTC_10x6:=202): 'FMT6_ASTC_10x6', (FMT6_ASTC_10x8:=203): 'FMT6_ASTC_10x8', (FMT6_ASTC_10x10:=204): 'FMT6_ASTC_10x10', (FMT6_ASTC_12x10:=205): 'FMT6_ASTC_12x10', (FMT6_ASTC_12x12:=206): 'FMT6_ASTC_12x12', (FMT6_Z24_UINT_S8_UINT:=234): 'FMT6_Z24_UINT_S8_UINT', (FMT6_NONE:=255): 'FMT6_NONE'} +enum_a6xx_polygon_mode: dict[int, str] = {(POLYMODE6_POINTS:=1): 'POLYMODE6_POINTS', (POLYMODE6_LINES:=2): 'POLYMODE6_LINES', (POLYMODE6_TRIANGLES:=3): 'POLYMODE6_TRIANGLES'} +enum_a6xx_depth_format: dict[int, str] = {(DEPTH6_NONE:=0): 'DEPTH6_NONE', (DEPTH6_16:=1): 'DEPTH6_16', (DEPTH6_24_8:=2): 'DEPTH6_24_8', (DEPTH6_32:=4): 'DEPTH6_32'} +enum_a6xx_shader_id: dict[int, str] = {(A6XX_TP0_TMO_DATA:=9): 'A6XX_TP0_TMO_DATA', (A6XX_TP0_SMO_DATA:=10): 'A6XX_TP0_SMO_DATA', (A6XX_TP0_MIPMAP_BASE_DATA:=11): 'A6XX_TP0_MIPMAP_BASE_DATA', (A6XX_TP1_TMO_DATA:=25): 'A6XX_TP1_TMO_DATA', (A6XX_TP1_SMO_DATA:=26): 'A6XX_TP1_SMO_DATA', (A6XX_TP1_MIPMAP_BASE_DATA:=27): 'A6XX_TP1_MIPMAP_BASE_DATA', (A6XX_SP_INST_DATA:=41): 'A6XX_SP_INST_DATA', (A6XX_SP_LB_0_DATA:=42): 'A6XX_SP_LB_0_DATA', (A6XX_SP_LB_1_DATA:=43): 'A6XX_SP_LB_1_DATA', (A6XX_SP_LB_2_DATA:=44): 'A6XX_SP_LB_2_DATA', (A6XX_SP_LB_3_DATA:=45): 'A6XX_SP_LB_3_DATA', (A6XX_SP_LB_4_DATA:=46): 'A6XX_SP_LB_4_DATA', (A6XX_SP_LB_5_DATA:=47): 'A6XX_SP_LB_5_DATA', (A6XX_SP_CB_BINDLESS_DATA:=48): 'A6XX_SP_CB_BINDLESS_DATA', (A6XX_SP_CB_LEGACY_DATA:=49): 'A6XX_SP_CB_LEGACY_DATA', (A6XX_SP_GFX_UAV_BASE_DATA:=50): 'A6XX_SP_GFX_UAV_BASE_DATA', (A6XX_SP_INST_TAG:=51): 'A6XX_SP_INST_TAG', (A6XX_SP_CB_BINDLESS_TAG:=52): 'A6XX_SP_CB_BINDLESS_TAG', (A6XX_SP_TMO_UMO_TAG:=53): 'A6XX_SP_TMO_UMO_TAG', (A6XX_SP_SMO_TAG:=54): 'A6XX_SP_SMO_TAG', (A6XX_SP_STATE_DATA:=55): 'A6XX_SP_STATE_DATA', (A6XX_HLSQ_CHUNK_CVS_RAM:=73): 'A6XX_HLSQ_CHUNK_CVS_RAM', (A6XX_HLSQ_CHUNK_CPS_RAM:=74): 'A6XX_HLSQ_CHUNK_CPS_RAM', (A6XX_HLSQ_CHUNK_CVS_RAM_TAG:=75): 'A6XX_HLSQ_CHUNK_CVS_RAM_TAG', (A6XX_HLSQ_CHUNK_CPS_RAM_TAG:=76): 'A6XX_HLSQ_CHUNK_CPS_RAM_TAG', (A6XX_HLSQ_ICB_CVS_CB_BASE_TAG:=77): 'A6XX_HLSQ_ICB_CVS_CB_BASE_TAG', (A6XX_HLSQ_ICB_CPS_CB_BASE_TAG:=78): 'A6XX_HLSQ_ICB_CPS_CB_BASE_TAG', (A6XX_HLSQ_CVS_MISC_RAM:=80): 'A6XX_HLSQ_CVS_MISC_RAM', (A6XX_HLSQ_CPS_MISC_RAM:=81): 'A6XX_HLSQ_CPS_MISC_RAM', (A6XX_HLSQ_INST_RAM:=82): 'A6XX_HLSQ_INST_RAM', (A6XX_HLSQ_GFX_CVS_CONST_RAM:=83): 'A6XX_HLSQ_GFX_CVS_CONST_RAM', (A6XX_HLSQ_GFX_CPS_CONST_RAM:=84): 'A6XX_HLSQ_GFX_CPS_CONST_RAM', (A6XX_HLSQ_CVS_MISC_RAM_TAG:=85): 'A6XX_HLSQ_CVS_MISC_RAM_TAG', (A6XX_HLSQ_CPS_MISC_RAM_TAG:=86): 'A6XX_HLSQ_CPS_MISC_RAM_TAG', (A6XX_HLSQ_INST_RAM_TAG:=87): 'A6XX_HLSQ_INST_RAM_TAG', (A6XX_HLSQ_GFX_CVS_CONST_RAM_TAG:=88): 'A6XX_HLSQ_GFX_CVS_CONST_RAM_TAG', (A6XX_HLSQ_GFX_CPS_CONST_RAM_TAG:=89): 'A6XX_HLSQ_GFX_CPS_CONST_RAM_TAG', (A6XX_HLSQ_PWR_REST_RAM:=90): 'A6XX_HLSQ_PWR_REST_RAM', (A6XX_HLSQ_PWR_REST_TAG:=91): 'A6XX_HLSQ_PWR_REST_TAG', (A6XX_HLSQ_DATAPATH_META:=96): 'A6XX_HLSQ_DATAPATH_META', (A6XX_HLSQ_FRONTEND_META:=97): 'A6XX_HLSQ_FRONTEND_META', (A6XX_HLSQ_INDIRECT_META:=98): 'A6XX_HLSQ_INDIRECT_META', (A6XX_HLSQ_BACKEND_META:=99): 'A6XX_HLSQ_BACKEND_META', (A6XX_SP_LB_6_DATA:=112): 'A6XX_SP_LB_6_DATA', (A6XX_SP_LB_7_DATA:=113): 'A6XX_SP_LB_7_DATA', (A6XX_HLSQ_INST_RAM_1:=115): 'A6XX_HLSQ_INST_RAM_1'} +enum_a6xx_debugbus_id: dict[int, str] = {(A6XX_DBGBUS_CP:=1): 'A6XX_DBGBUS_CP', (A6XX_DBGBUS_RBBM:=2): 'A6XX_DBGBUS_RBBM', (A6XX_DBGBUS_VBIF:=3): 'A6XX_DBGBUS_VBIF', (A6XX_DBGBUS_HLSQ:=4): 'A6XX_DBGBUS_HLSQ', (A6XX_DBGBUS_UCHE:=5): 'A6XX_DBGBUS_UCHE', (A6XX_DBGBUS_DPM:=6): 'A6XX_DBGBUS_DPM', (A6XX_DBGBUS_TESS:=7): 'A6XX_DBGBUS_TESS', (A6XX_DBGBUS_PC:=8): 'A6XX_DBGBUS_PC', (A6XX_DBGBUS_VFDP:=9): 'A6XX_DBGBUS_VFDP', (A6XX_DBGBUS_VPC:=10): 'A6XX_DBGBUS_VPC', (A6XX_DBGBUS_TSE:=11): 'A6XX_DBGBUS_TSE', (A6XX_DBGBUS_RAS:=12): 'A6XX_DBGBUS_RAS', (A6XX_DBGBUS_VSC:=13): 'A6XX_DBGBUS_VSC', (A6XX_DBGBUS_COM:=14): 'A6XX_DBGBUS_COM', (A6XX_DBGBUS_LRZ:=16): 'A6XX_DBGBUS_LRZ', (A6XX_DBGBUS_A2D:=17): 'A6XX_DBGBUS_A2D', (A6XX_DBGBUS_CCUFCHE:=18): 'A6XX_DBGBUS_CCUFCHE', (A6XX_DBGBUS_GMU_CX:=19): 'A6XX_DBGBUS_GMU_CX', (A6XX_DBGBUS_RBP:=20): 'A6XX_DBGBUS_RBP', (A6XX_DBGBUS_DCS:=21): 'A6XX_DBGBUS_DCS', (A6XX_DBGBUS_DBGC:=22): 'A6XX_DBGBUS_DBGC', (A6XX_DBGBUS_CX:=23): 'A6XX_DBGBUS_CX', (A6XX_DBGBUS_GMU_GX:=24): 'A6XX_DBGBUS_GMU_GX', (A6XX_DBGBUS_TPFCHE:=25): 'A6XX_DBGBUS_TPFCHE', (A6XX_DBGBUS_GBIF_GX:=26): 'A6XX_DBGBUS_GBIF_GX', (A6XX_DBGBUS_GPC:=29): 'A6XX_DBGBUS_GPC', (A6XX_DBGBUS_LARC:=30): 'A6XX_DBGBUS_LARC', (A6XX_DBGBUS_HLSQ_SPTP:=31): 'A6XX_DBGBUS_HLSQ_SPTP', (A6XX_DBGBUS_RB_0:=32): 'A6XX_DBGBUS_RB_0', (A6XX_DBGBUS_RB_1:=33): 'A6XX_DBGBUS_RB_1', (A6XX_DBGBUS_RB_2:=34): 'A6XX_DBGBUS_RB_2', (A6XX_DBGBUS_UCHE_WRAPPER:=36): 'A6XX_DBGBUS_UCHE_WRAPPER', (A6XX_DBGBUS_CCU_0:=40): 'A6XX_DBGBUS_CCU_0', (A6XX_DBGBUS_CCU_1:=41): 'A6XX_DBGBUS_CCU_1', (A6XX_DBGBUS_CCU_2:=42): 'A6XX_DBGBUS_CCU_2', (A6XX_DBGBUS_VFD_0:=56): 'A6XX_DBGBUS_VFD_0', (A6XX_DBGBUS_VFD_1:=57): 'A6XX_DBGBUS_VFD_1', (A6XX_DBGBUS_VFD_2:=58): 'A6XX_DBGBUS_VFD_2', (A6XX_DBGBUS_VFD_3:=59): 'A6XX_DBGBUS_VFD_3', (A6XX_DBGBUS_VFD_4:=60): 'A6XX_DBGBUS_VFD_4', (A6XX_DBGBUS_VFD_5:=61): 'A6XX_DBGBUS_VFD_5', (A6XX_DBGBUS_SP_0:=64): 'A6XX_DBGBUS_SP_0', (A6XX_DBGBUS_SP_1:=65): 'A6XX_DBGBUS_SP_1', (A6XX_DBGBUS_SP_2:=66): 'A6XX_DBGBUS_SP_2', (A6XX_DBGBUS_TPL1_0:=72): 'A6XX_DBGBUS_TPL1_0', (A6XX_DBGBUS_TPL1_1:=73): 'A6XX_DBGBUS_TPL1_1', (A6XX_DBGBUS_TPL1_2:=74): 'A6XX_DBGBUS_TPL1_2', (A6XX_DBGBUS_TPL1_3:=75): 'A6XX_DBGBUS_TPL1_3', (A6XX_DBGBUS_TPL1_4:=76): 'A6XX_DBGBUS_TPL1_4', (A6XX_DBGBUS_TPL1_5:=77): 'A6XX_DBGBUS_TPL1_5', (A6XX_DBGBUS_SPTP_0:=88): 'A6XX_DBGBUS_SPTP_0', (A6XX_DBGBUS_SPTP_1:=89): 'A6XX_DBGBUS_SPTP_1', (A6XX_DBGBUS_SPTP_2:=90): 'A6XX_DBGBUS_SPTP_2', (A6XX_DBGBUS_SPTP_3:=91): 'A6XX_DBGBUS_SPTP_3', (A6XX_DBGBUS_SPTP_4:=92): 'A6XX_DBGBUS_SPTP_4', (A6XX_DBGBUS_SPTP_5:=93): 'A6XX_DBGBUS_SPTP_5'} +enum_a6xx_2d_ifmt: dict[int, str] = {(R2D_INT32:=7): 'R2D_INT32', (R2D_INT16:=6): 'R2D_INT16', (R2D_INT8:=5): 'R2D_INT8', (R2D_FLOAT32:=4): 'R2D_FLOAT32', (R2D_FLOAT16:=3): 'R2D_FLOAT16', (R2D_SNORM8:=2): 'R2D_SNORM8', (R2D_UNORM8_SRGB:=1): 'R2D_UNORM8_SRGB', (R2D_UNORM8:=0): 'R2D_UNORM8'} +enum_a6xx_tex_type: dict[int, str] = {(A6XX_TEX_1D:=0): 'A6XX_TEX_1D', (A6XX_TEX_2D:=1): 'A6XX_TEX_2D', (A6XX_TEX_CUBE:=2): 'A6XX_TEX_CUBE', (A6XX_TEX_3D:=3): 'A6XX_TEX_3D', (A6XX_TEX_BUFFER:=4): 'A6XX_TEX_BUFFER', (A6XX_TEX_IMG_BUFFER:=5): 'A6XX_TEX_IMG_BUFFER'} +enum_a6xx_ztest_mode: dict[int, str] = {(A6XX_EARLY_Z:=0): 'A6XX_EARLY_Z', (A6XX_LATE_Z:=1): 'A6XX_LATE_Z', (A6XX_EARLY_Z_LATE_Z:=2): 'A6XX_EARLY_Z_LATE_Z', (A6XX_INVALID_ZTEST:=3): 'A6XX_INVALID_ZTEST'} +enum_a6xx_tess_spacing: dict[int, str] = {(TESS_EQUAL:=0): 'TESS_EQUAL', (TESS_FRACTIONAL_ODD:=2): 'TESS_FRACTIONAL_ODD', (TESS_FRACTIONAL_EVEN:=3): 'TESS_FRACTIONAL_EVEN'} +enum_a6xx_tess_output: dict[int, str] = {(TESS_POINTS:=0): 'TESS_POINTS', (TESS_LINES:=1): 'TESS_LINES', (TESS_CW_TRIS:=2): 'TESS_CW_TRIS', (TESS_CCW_TRIS:=3): 'TESS_CCW_TRIS'} +enum_a6xx_tex_filter: dict[int, str] = {(A6XX_TEX_NEAREST:=0): 'A6XX_TEX_NEAREST', (A6XX_TEX_LINEAR:=1): 'A6XX_TEX_LINEAR', (A6XX_TEX_ANISO:=2): 'A6XX_TEX_ANISO', (A6XX_TEX_CUBIC:=3): 'A6XX_TEX_CUBIC'} +enum_a6xx_tex_clamp: dict[int, str] = {(A6XX_TEX_REPEAT:=0): 'A6XX_TEX_REPEAT', (A6XX_TEX_CLAMP_TO_EDGE:=1): 'A6XX_TEX_CLAMP_TO_EDGE', (A6XX_TEX_MIRROR_REPEAT:=2): 'A6XX_TEX_MIRROR_REPEAT', (A6XX_TEX_CLAMP_TO_BORDER:=3): 'A6XX_TEX_CLAMP_TO_BORDER', (A6XX_TEX_MIRROR_CLAMP:=4): 'A6XX_TEX_MIRROR_CLAMP'} +enum_a6xx_tex_aniso: dict[int, str] = {(A6XX_TEX_ANISO_1:=0): 'A6XX_TEX_ANISO_1', (A6XX_TEX_ANISO_2:=1): 'A6XX_TEX_ANISO_2', (A6XX_TEX_ANISO_4:=2): 'A6XX_TEX_ANISO_4', (A6XX_TEX_ANISO_8:=3): 'A6XX_TEX_ANISO_8', (A6XX_TEX_ANISO_16:=4): 'A6XX_TEX_ANISO_16'} +enum_a6xx_reduction_mode: dict[int, str] = {(A6XX_REDUCTION_MODE_AVERAGE:=0): 'A6XX_REDUCTION_MODE_AVERAGE', (A6XX_REDUCTION_MODE_MIN:=1): 'A6XX_REDUCTION_MODE_MIN', (A6XX_REDUCTION_MODE_MAX:=2): 'A6XX_REDUCTION_MODE_MAX'} +enum_a6xx_fast_border_color: dict[int, str] = {(A6XX_BORDER_COLOR_0_0_0_0:=0): 'A6XX_BORDER_COLOR_0_0_0_0', (A6XX_BORDER_COLOR_0_0_0_1:=1): 'A6XX_BORDER_COLOR_0_0_0_1', (A6XX_BORDER_COLOR_1_1_1_0:=2): 'A6XX_BORDER_COLOR_1_1_1_0', (A6XX_BORDER_COLOR_1_1_1_1:=3): 'A6XX_BORDER_COLOR_1_1_1_1'} +enum_a6xx_tex_swiz: dict[int, str] = {(A6XX_TEX_X:=0): 'A6XX_TEX_X', (A6XX_TEX_Y:=1): 'A6XX_TEX_Y', (A6XX_TEX_Z:=2): 'A6XX_TEX_Z', (A6XX_TEX_W:=3): 'A6XX_TEX_W', (A6XX_TEX_ZERO:=4): 'A6XX_TEX_ZERO', (A6XX_TEX_ONE:=5): 'A6XX_TEX_ONE'} +NIR_DEBUG_CLONE = (1 << 0) +NIR_DEBUG_SERIALIZE = (1 << 1) +NIR_DEBUG_NOVALIDATE = (1 << 2) +NIR_DEBUG_EXTENDED_VALIDATION = (1 << 3) +NIR_DEBUG_TGSI = (1 << 4) +NIR_DEBUG_PRINT_VS = (1 << 5) +NIR_DEBUG_PRINT_TCS = (1 << 6) +NIR_DEBUG_PRINT_TES = (1 << 7) +NIR_DEBUG_PRINT_GS = (1 << 8) +NIR_DEBUG_PRINT_FS = (1 << 9) +NIR_DEBUG_PRINT_CS = (1 << 10) +NIR_DEBUG_PRINT_TS = (1 << 11) +NIR_DEBUG_PRINT_MS = (1 << 12) +NIR_DEBUG_PRINT_RGS = (1 << 13) +NIR_DEBUG_PRINT_AHS = (1 << 14) +NIR_DEBUG_PRINT_CHS = (1 << 15) +NIR_DEBUG_PRINT_MHS = (1 << 16) +NIR_DEBUG_PRINT_IS = (1 << 17) +NIR_DEBUG_PRINT_CBS = (1 << 18) +NIR_DEBUG_PRINT_KS = (1 << 19) +NIR_DEBUG_PRINT_NO_INLINE_CONSTS = (1 << 20) +NIR_DEBUG_PRINT_INTERNAL = (1 << 21) +NIR_DEBUG_PRINT_PASS_FLAGS = (1 << 22) +NIR_DEBUG_INVALIDATE_METADATA = (1 << 23) +NIR_DEBUG_PRINT_STRUCT_DECLS = (1 << 24) +NIR_DEBUG_PRINT = (NIR_DEBUG_PRINT_VS | NIR_DEBUG_PRINT_TCS | NIR_DEBUG_PRINT_TES | NIR_DEBUG_PRINT_GS | NIR_DEBUG_PRINT_FS | NIR_DEBUG_PRINT_CS | NIR_DEBUG_PRINT_TS | NIR_DEBUG_PRINT_MS | NIR_DEBUG_PRINT_RGS | NIR_DEBUG_PRINT_AHS | NIR_DEBUG_PRINT_CHS | NIR_DEBUG_PRINT_MHS | NIR_DEBUG_PRINT_IS | NIR_DEBUG_PRINT_CBS | NIR_DEBUG_PRINT_KS) +NIR_FALSE = 0 +NIR_TRUE = (~0) +NIR_MAX_VEC_COMPONENTS = 16 +NIR_MAX_MATRIX_COLUMNS = 4 +NIR_STREAM_PACKED = (1 << 8) +NIR_VARIABLE_NO_INDEX = ~0 +nir_foreach_variable_in_list = lambda var,var_list: foreach_list_typed(nir_variable, var, node, var_list) # type: ignore +nir_foreach_variable_in_list_safe = lambda var,var_list: foreach_list_typed_safe(nir_variable, var, node, var_list) # type: ignore +nir_foreach_shader_in_variable = lambda var,shader: nir_foreach_variable_with_modes(var, shader, nir_var_shader_in) # type: ignore +nir_foreach_shader_in_variable_safe = lambda var,shader: nir_foreach_variable_with_modes_safe(var, shader, nir_var_shader_in) # type: ignore +nir_foreach_shader_out_variable = lambda var,shader: nir_foreach_variable_with_modes(var, shader, nir_var_shader_out) # type: ignore +nir_foreach_shader_out_variable_safe = lambda var,shader: nir_foreach_variable_with_modes_safe(var, shader, nir_var_shader_out) # type: ignore +nir_foreach_uniform_variable = lambda var,shader: nir_foreach_variable_with_modes(var, shader, nir_var_uniform) # type: ignore +nir_foreach_uniform_variable_safe = lambda var,shader: nir_foreach_variable_with_modes_safe(var, shader, nir_var_uniform) # type: ignore +nir_foreach_image_variable = lambda var,shader: nir_foreach_variable_with_modes(var, shader, nir_var_image) # type: ignore +nir_foreach_image_variable_safe = lambda var,shader: nir_foreach_variable_with_modes_safe(var, shader, nir_var_image) # type: ignore +NIR_SRC_PARENT_IS_IF = (0x1) +NIR_ALU_MAX_INPUTS = NIR_MAX_VEC_COMPONENTS +NIR_INTRINSIC_MAX_CONST_INDEX = 8 +NIR_ALIGN_MUL_MAX = 0x40000000 +NIR_INTRINSIC_MAX_INPUTS = 11 +nir_log_shadere = lambda s: nir_log_shader_annotated_tagged(MESA_LOG_ERROR, (MESA_LOG_TAG), (s), NULL) # type: ignore +nir_log_shaderw = lambda s: nir_log_shader_annotated_tagged(MESA_LOG_WARN, (MESA_LOG_TAG), (s), NULL) # type: ignore +nir_log_shaderi = lambda s: nir_log_shader_annotated_tagged(MESA_LOG_INFO, (MESA_LOG_TAG), (s), NULL) # type: ignore +nir_log_shader_annotated = lambda s,annotations: nir_log_shader_annotated_tagged(MESA_LOG_ERROR, (MESA_LOG_TAG), (s), annotations) # type: ignore +NIR_STRINGIZE = lambda x: NIR_STRINGIZE_INNER(x) # type: ignore +NVIDIA_VENDOR_ID = 0x10de +NAK_SUBGROUP_SIZE = 32 +NAK_QMD_ALIGN_B = 256 +NAK_MAX_QMD_SIZE_B = 384 +NAK_MAX_QMD_DWORDS = (NAK_MAX_QMD_SIZE_B / 4) +LP_MAX_VECTOR_WIDTH = 512 +LP_MIN_VECTOR_ALIGN = 64 +LP_MAX_VECTOR_LENGTH = (LP_MAX_VECTOR_WIDTH/8) +LP_RESV_FUNC_ARGS = 2 +LP_JIT_TEXTURE_SAMPLE_STRIDE = 15 +lp_jit_resources_constants = lambda _gallivm,_type,_ptr: lp_build_struct__get_ptr2(_gallivm, _type, _ptr, LP_JIT_RES_CONSTANTS, "constants") # type: ignore +lp_jit_resources_ssbos = lambda _gallivm,_type,_ptr: lp_build_struct__get_ptr2(_gallivm, _type, _ptr, LP_JIT_RES_SSBOS, "ssbos") # type: ignore +lp_jit_resources_textures = lambda _gallivm,_type,_ptr: lp_build_struct__get_ptr2(_gallivm, _type, _ptr, LP_JIT_RES_TEXTURES, "textures") # type: ignore +lp_jit_resources_samplers = lambda _gallivm,_type,_ptr: lp_build_struct__get_ptr2(_gallivm, _type, _ptr, LP_JIT_RES_SAMPLERS, "samplers") # type: ignore +lp_jit_resources_images = lambda _gallivm,_type,_ptr: lp_build_struct__get_ptr2(_gallivm, _type, _ptr, LP_JIT_RES_IMAGES, "images") # type: ignore +lp_jit_vertex_header_id = lambda _gallivm,_type,_ptr: lp_build_struct__get_ptr2(_gallivm, _type, _ptr, LP_JIT_VERTEX_HEADER_VERTEX_ID, "id") # type: ignore +lp_jit_vertex_header_clip_pos = lambda _gallivm,_type,_ptr: lp_build_struct__get_ptr2(_gallivm, _type, _ptr, LP_JIT_VERTEX_HEADER_CLIP_POS, "clip_pos") # type: ignore +lp_jit_vertex_header_data = lambda _gallivm,_type,_ptr: lp_build_struct__get_ptr2(_gallivm, _type, _ptr, LP_JIT_VERTEX_HEADER_DATA, "data") # type: ignore +LP_MAX_TEX_FUNC_ARGS = 32 +A6XX_CCU_DEPTH_SIZE = (64 * 1024) +A6XX_CCU_GMEM_COLOR_SIZE = (16 * 1024) +dword_offsetof = lambda type,name: DIV_ROUND_UP(offsetof(type, name), 4) # type: ignore +dword_sizeof = lambda type: DIV_ROUND_UP(sizeof(type), 4) # type: ignore +IR3_DP_CS = lambda name: dword_offsetof(struct_ir3_driver_params_cs, name) # type: ignore +IR3_DP_VS = lambda name: dword_offsetof(struct_ir3_driver_params_vs, name) # type: ignore +IR3_DP_TCS = lambda name: dword_offsetof(struct_ir3_driver_params_tcs, name) # type: ignore +IR3_DP_FS = lambda name: dword_offsetof(struct_ir3_driver_params_fs, name) # type: ignore +IR3_MAX_SHADER_BUFFERS = 32 +IR3_MAX_SHADER_IMAGES = 32 +IR3_MAX_SO_BUFFERS = 4 +IR3_MAX_SO_STREAMS = 4 +IR3_MAX_SO_OUTPUTS = 128 +IR3_MAX_UBO_PUSH_RANGES = 32 +IR3_MAX_SAMPLER_PREFETCH = 4 +IR3_SAMPLER_PREFETCH_CMD = 0x4 +IR3_SAMPLER_BINDLESS_PREFETCH_CMD = 0x6 +IR3_TESS_NONE = 0 +IR3_TESS_QUADS = 1 +IR3_TESS_TRIANGLES = 2 +IR3_TESS_ISOLINES = 3 +UAV_INVALID = 0xff +UAV_SSBO = 0x80 +HALF_REG_ID = 0x100 +gc_alloc = lambda ctx,type,count: gc_alloc_size(ctx, sizeof(type) * (count), alignof(type)) # type: ignore +gc_zalloc = lambda ctx,type,count: gc_zalloc_size(ctx, sizeof(type) * (count), alignof(type)) # type: ignore +gc_alloc_zla = lambda ctx,type,type2,count: gc_alloc_size(ctx, sizeof(type) + sizeof(type2) * (count), MAX2(alignof(type), alignof(type2))) # type: ignore +gc_zalloc_zla = lambda ctx,type,type2,count: gc_zalloc_size(ctx, sizeof(type) + sizeof(type2) * (count), MAX2(alignof(type), alignof(type2))) # type: ignore +DECLARE_RALLOC_CXX_OPERATORS = lambda type: DECLARE_RALLOC_CXX_OPERATORS_TEMPLATE(type, ralloc_size) # type: ignore +DECLARE_RZALLOC_CXX_OPERATORS = lambda type: DECLARE_RALLOC_CXX_OPERATORS_TEMPLATE(type, rzalloc_size) # type: ignore +DECLARE_LINEAR_ALLOC_CXX_OPERATORS = lambda type: DECLARE_LINEAR_ALLOC_CXX_OPERATORS_TEMPLATE(type, linear_alloc_child) # type: ignore +DECLARE_LINEAR_ZALLOC_CXX_OPERATORS = lambda type: DECLARE_LINEAR_ALLOC_CXX_OPERATORS_TEMPLATE(type, linear_zalloc_child) # type: ignore +ISA_GPU_ID = lambda: ir3_isa_get_gpu_id(scope) # type: ignore +__struct__cast = lambda X: (struct_X) # type: ignore +A6XX_RBBM_INT_0_MASK_RBBM_GPU_IDLE = 0x00000001 +A6XX_RBBM_INT_0_MASK_CP_AHB_ERROR = 0x00000002 +A6XX_RBBM_INT_0_MASK_CP_IPC_INTR_0 = 0x00000010 +A6XX_RBBM_INT_0_MASK_CP_IPC_INTR_1 = 0x00000020 +A6XX_RBBM_INT_0_MASK_RBBM_ATB_ASYNCFIFO_OVERFLOW = 0x00000040 +A6XX_RBBM_INT_0_MASK_RBBM_GPC_ERROR = 0x00000080 +A6XX_RBBM_INT_0_MASK_CP_SW = 0x00000100 +A6XX_RBBM_INT_0_MASK_CP_HW_ERROR = 0x00000200 +A6XX_RBBM_INT_0_MASK_CP_CCU_FLUSH_DEPTH_TS = 0x00000400 +A6XX_RBBM_INT_0_MASK_CP_CCU_FLUSH_COLOR_TS = 0x00000800 +A6XX_RBBM_INT_0_MASK_CP_CCU_RESOLVE_TS = 0x00001000 +A6XX_RBBM_INT_0_MASK_CP_IB2 = 0x00002000 +A6XX_RBBM_INT_0_MASK_CP_IB1 = 0x00004000 +A6XX_RBBM_INT_0_MASK_CP_RB = 0x00008000 +A6XX_RBBM_INT_0_MASK_PM4CPINTERRUPT = 0x00008000 +A6XX_RBBM_INT_0_MASK_PM4CPINTERRUPTLPAC = 0x00010000 +A6XX_RBBM_INT_0_MASK_CP_RB_DONE_TS = 0x00020000 +A6XX_RBBM_INT_0_MASK_CP_WT_DONE_TS = 0x00040000 +A6XX_RBBM_INT_0_MASK_CP_CACHE_FLUSH_TS = 0x00100000 +A6XX_RBBM_INT_0_MASK_CP_CACHE_FLUSH_TS_LPAC = 0x00200000 +A6XX_RBBM_INT_0_MASK_RBBM_ATB_BUS_OVERFLOW = 0x00400000 +A6XX_RBBM_INT_0_MASK_RBBM_HANG_DETECT = 0x00800000 +A6XX_RBBM_INT_0_MASK_UCHE_OOB_ACCESS = 0x01000000 +A6XX_RBBM_INT_0_MASK_UCHE_TRAP_INTR = 0x02000000 +A6XX_RBBM_INT_0_MASK_DEBBUS_INTR_0 = 0x04000000 +A6XX_RBBM_INT_0_MASK_DEBBUS_INTR_1 = 0x08000000 +A6XX_RBBM_INT_0_MASK_TSBWRITEERROR = 0x10000000 +A6XX_RBBM_INT_0_MASK_SWFUSEVIOLATION = 0x20000000 +A6XX_RBBM_INT_0_MASK_ISDB_CPU_IRQ = 0x40000000 +A6XX_RBBM_INT_0_MASK_ISDB_UNDER_DEBUG = 0x80000000 +A6XX_CP_INT_CP_OPCODE_ERROR = 0x00000001 +A6XX_CP_INT_CP_UCODE_ERROR = 0x00000002 +A6XX_CP_INT_CP_HW_FAULT_ERROR = 0x00000004 +A6XX_CP_INT_CP_REGISTER_PROTECTION_ERROR = 0x00000010 +A6XX_CP_INT_CP_AHB_ERROR = 0x00000020 +A6XX_CP_INT_CP_VSD_PARITY_ERROR = 0x00000040 +A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR = 0x00000080 +A6XX_CP_INT_CP_OPCODE_ERROR_LPAC = 0x00000100 +A6XX_CP_INT_CP_UCODE_ERROR_LPAC = 0x00000200 +A6XX_CP_INT_CP_HW_FAULT_ERROR_LPAC = 0x00000400 +A6XX_CP_INT_CP_REGISTER_PROTECTION_ERROR_LPAC = 0x00000800 +A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR_LPAC = 0x00001000 +A6XX_CP_INT_CP_OPCODE_ERROR_BV = 0x00002000 +A6XX_CP_INT_CP_UCODE_ERROR_BV = 0x00004000 +A6XX_CP_INT_CP_HW_FAULT_ERROR_BV = 0x00008000 +A6XX_CP_INT_CP_REGISTER_PROTECTION_ERROR_BV = 0x00010000 +A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR_BV = 0x00020000 +REG_A6XX_CP_RB_BASE = 0x00000800 +REG_A6XX_CP_RB_CNTL = 0x00000802 +REG_A6XX_CP_RB_RPTR_ADDR = 0x00000804 +REG_A6XX_CP_RB_RPTR = 0x00000806 +REG_A6XX_CP_RB_WPTR = 0x00000807 +REG_A6XX_CP_SQE_CNTL = 0x00000808 +REG_A6XX_CP_CP2GMU_STATUS = 0x00000812 +A6XX_CP_CP2GMU_STATUS_IFPC = 0x00000001 +REG_A6XX_CP_HW_FAULT = 0x00000821 +REG_A6XX_CP_INTERRUPT_STATUS = 0x00000823 +REG_A6XX_CP_PROTECT_STATUS = 0x00000824 +REG_A6XX_CP_STATUS_1 = 0x00000825 +REG_A6XX_CP_SQE_INSTR_BASE = 0x00000830 +REG_A6XX_CP_MISC_CNTL = 0x00000840 +REG_A6XX_CP_APRIV_CNTL = 0x00000844 +A6XX_CP_APRIV_CNTL_CDWRITE = 0x00000040 +A6XX_CP_APRIV_CNTL_CDREAD = 0x00000020 +A6XX_CP_APRIV_CNTL_RBRPWB = 0x00000008 +A6XX_CP_APRIV_CNTL_RBPRIVLEVEL = 0x00000004 +A6XX_CP_APRIV_CNTL_RBFETCH = 0x00000002 +A6XX_CP_APRIV_CNTL_ICACHE = 0x00000001 +REG_A6XX_CP_PREEMPT_THRESHOLD = 0x000008c0 +REG_A6XX_CP_ROQ_THRESHOLDS_1 = 0x000008c1 +A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__MASK = 0x000000ff +A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__SHIFT = 0 +A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__MASK = 0x0000ff00 +A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__SHIFT = 8 +A6XX_CP_ROQ_THRESHOLDS_1_IB1_START__MASK = 0x00ff0000 +A6XX_CP_ROQ_THRESHOLDS_1_IB1_START__SHIFT = 16 +A6XX_CP_ROQ_THRESHOLDS_1_IB2_START__MASK = 0xff000000 +A6XX_CP_ROQ_THRESHOLDS_1_IB2_START__SHIFT = 24 +REG_A6XX_CP_ROQ_THRESHOLDS_2 = 0x000008c2 +A6XX_CP_ROQ_THRESHOLDS_2_SDS_START__MASK = 0x000001ff +A6XX_CP_ROQ_THRESHOLDS_2_SDS_START__SHIFT = 0 +A6XX_CP_ROQ_THRESHOLDS_2_ROQ_SIZE__MASK = 0xffff0000 +A6XX_CP_ROQ_THRESHOLDS_2_ROQ_SIZE__SHIFT = 16 +REG_A6XX_CP_MEM_POOL_SIZE = 0x000008c3 +REG_A6XX_CP_CHICKEN_DBG = 0x00000841 +REG_A6XX_CP_ADDR_MODE_CNTL = 0x00000842 +REG_A6XX_CP_DBG_ECO_CNTL = 0x00000843 +REG_A6XX_CP_PROTECT_CNTL = 0x0000084f +A6XX_CP_PROTECT_CNTL_LAST_SPAN_INF_RANGE = 0x00000008 +A6XX_CP_PROTECT_CNTL_ACCESS_FAULT_ON_VIOL_EN = 0x00000002 +A6XX_CP_PROTECT_CNTL_ACCESS_PROT_EN = 0x00000001 +REG_A6XX_CP_SCRATCH = lambda i0: (0x00000883 + 0x1*i0 ) # type: ignore +REG_A6XX_CP_PROTECT = lambda i0: (0x00000850 + 0x1*i0 ) # type: ignore +A6XX_CP_PROTECT_REG_BASE_ADDR__MASK = 0x0003ffff +A6XX_CP_PROTECT_REG_BASE_ADDR__SHIFT = 0 +A6XX_CP_PROTECT_REG_MASK_LEN__MASK = 0x7ffc0000 +A6XX_CP_PROTECT_REG_MASK_LEN__SHIFT = 18 +A6XX_CP_PROTECT_REG_READ = 0x80000000 +REG_A6XX_CP_CONTEXT_SWITCH_CNTL = 0x000008a0 +A6XX_CP_CONTEXT_SWITCH_CNTL_STOP = 0x00000001 +A6XX_CP_CONTEXT_SWITCH_CNTL_LEVEL__MASK = 0x000000c0 +A6XX_CP_CONTEXT_SWITCH_CNTL_LEVEL__SHIFT = 6 +A6XX_CP_CONTEXT_SWITCH_CNTL_USES_GMEM = 0x00000100 +A6XX_CP_CONTEXT_SWITCH_CNTL_SKIP_SAVE_RESTORE = 0x00000200 +REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO = 0x000008a1 +REG_A6XX_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR = 0x000008a3 +REG_A6XX_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR = 0x000008a5 +REG_A6XX_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR = 0x000008a7 +REG_A7XX_CP_CONTEXT_SWITCH_LEVEL_STATUS = 0x000008ab +REG_A6XX_CP_PERFCTR_CP_SEL = lambda i0: (0x000008d0 + 0x1*i0 ) # type: ignore +REG_A7XX_CP_BV_PERFCTR_CP_SEL = lambda i0: (0x000008e0 + 0x1*i0 ) # type: ignore +REG_A6XX_CP_CRASH_DUMP_SCRIPT_BASE = 0x00000900 +REG_A6XX_CP_CRASH_DUMP_CNTL = 0x00000902 +REG_A6XX_CP_CRASH_DUMP_STATUS = 0x00000903 +REG_A6XX_CP_SQE_STAT_ADDR = 0x00000908 +REG_A6XX_CP_SQE_STAT_DATA = 0x00000909 +REG_A6XX_CP_DRAW_STATE_ADDR = 0x0000090a +REG_A6XX_CP_DRAW_STATE_DATA = 0x0000090b +REG_A6XX_CP_ROQ_DBG_ADDR = 0x0000090c +REG_A6XX_CP_ROQ_DBG_DATA = 0x0000090d +REG_A6XX_CP_MEM_POOL_DBG_ADDR = 0x0000090e +REG_A6XX_CP_MEM_POOL_DBG_DATA = 0x0000090f +REG_A6XX_CP_SQE_UCODE_DBG_ADDR = 0x00000910 +REG_A6XX_CP_SQE_UCODE_DBG_DATA = 0x00000911 +REG_A6XX_CP_IB1_BASE = 0x00000928 +REG_A6XX_CP_IB1_REM_SIZE = 0x0000092a +REG_A6XX_CP_IB2_BASE = 0x0000092b +REG_A6XX_CP_IB2_REM_SIZE = 0x0000092d +REG_A6XX_CP_SDS_BASE = 0x0000092e +REG_A6XX_CP_SDS_REM_SIZE = 0x00000930 +REG_A6XX_CP_MRB_BASE = 0x00000931 +REG_A6XX_CP_MRB_REM_SIZE = 0x00000933 +REG_A6XX_CP_VSD_BASE = 0x00000934 +REG_A6XX_CP_ROQ_RB_STATUS = 0x00000939 +A6XX_CP_ROQ_RB_STATUS_RPTR__MASK = 0x000003ff +A6XX_CP_ROQ_RB_STATUS_RPTR__SHIFT = 0 +A6XX_CP_ROQ_RB_STATUS_WPTR__MASK = 0x03ff0000 +A6XX_CP_ROQ_RB_STATUS_WPTR__SHIFT = 16 +REG_A6XX_CP_ROQ_IB1_STATUS = 0x0000093a +A6XX_CP_ROQ_IB1_STATUS_RPTR__MASK = 0x000003ff +A6XX_CP_ROQ_IB1_STATUS_RPTR__SHIFT = 0 +A6XX_CP_ROQ_IB1_STATUS_WPTR__MASK = 0x03ff0000 +A6XX_CP_ROQ_IB1_STATUS_WPTR__SHIFT = 16 +REG_A6XX_CP_ROQ_IB2_STATUS = 0x0000093b +A6XX_CP_ROQ_IB2_STATUS_RPTR__MASK = 0x000003ff +A6XX_CP_ROQ_IB2_STATUS_RPTR__SHIFT = 0 +A6XX_CP_ROQ_IB2_STATUS_WPTR__MASK = 0x03ff0000 +A6XX_CP_ROQ_IB2_STATUS_WPTR__SHIFT = 16 +REG_A6XX_CP_ROQ_SDS_STATUS = 0x0000093c +A6XX_CP_ROQ_SDS_STATUS_RPTR__MASK = 0x000003ff +A6XX_CP_ROQ_SDS_STATUS_RPTR__SHIFT = 0 +A6XX_CP_ROQ_SDS_STATUS_WPTR__MASK = 0x03ff0000 +A6XX_CP_ROQ_SDS_STATUS_WPTR__SHIFT = 16 +REG_A6XX_CP_ROQ_MRB_STATUS = 0x0000093d +A6XX_CP_ROQ_MRB_STATUS_RPTR__MASK = 0x000003ff +A6XX_CP_ROQ_MRB_STATUS_RPTR__SHIFT = 0 +A6XX_CP_ROQ_MRB_STATUS_WPTR__MASK = 0x03ff0000 +A6XX_CP_ROQ_MRB_STATUS_WPTR__SHIFT = 16 +REG_A6XX_CP_ROQ_VSD_STATUS = 0x0000093e +A6XX_CP_ROQ_VSD_STATUS_RPTR__MASK = 0x000003ff +A6XX_CP_ROQ_VSD_STATUS_RPTR__SHIFT = 0 +A6XX_CP_ROQ_VSD_STATUS_WPTR__MASK = 0x03ff0000 +A6XX_CP_ROQ_VSD_STATUS_WPTR__SHIFT = 16 +REG_A6XX_CP_IB1_INIT_SIZE = 0x00000943 +REG_A6XX_CP_IB2_INIT_SIZE = 0x00000944 +REG_A6XX_CP_SDS_INIT_SIZE = 0x00000945 +REG_A6XX_CP_MRB_INIT_SIZE = 0x00000946 +REG_A6XX_CP_VSD_INIT_SIZE = 0x00000947 +REG_A6XX_CP_ROQ_AVAIL_RB = 0x00000948 +A6XX_CP_ROQ_AVAIL_RB_REM__MASK = 0xffff0000 +A6XX_CP_ROQ_AVAIL_RB_REM__SHIFT = 16 +REG_A6XX_CP_ROQ_AVAIL_IB1 = 0x00000949 +A6XX_CP_ROQ_AVAIL_IB1_REM__MASK = 0xffff0000 +A6XX_CP_ROQ_AVAIL_IB1_REM__SHIFT = 16 +REG_A6XX_CP_ROQ_AVAIL_IB2 = 0x0000094a +A6XX_CP_ROQ_AVAIL_IB2_REM__MASK = 0xffff0000 +A6XX_CP_ROQ_AVAIL_IB2_REM__SHIFT = 16 +REG_A6XX_CP_ROQ_AVAIL_SDS = 0x0000094b +A6XX_CP_ROQ_AVAIL_SDS_REM__MASK = 0xffff0000 +A6XX_CP_ROQ_AVAIL_SDS_REM__SHIFT = 16 +REG_A6XX_CP_ROQ_AVAIL_MRB = 0x0000094c +A6XX_CP_ROQ_AVAIL_MRB_REM__MASK = 0xffff0000 +A6XX_CP_ROQ_AVAIL_MRB_REM__SHIFT = 16 +REG_A6XX_CP_ROQ_AVAIL_VSD = 0x0000094d +A6XX_CP_ROQ_AVAIL_VSD_REM__MASK = 0xffff0000 +A6XX_CP_ROQ_AVAIL_VSD_REM__SHIFT = 16 +REG_A6XX_CP_ALWAYS_ON_COUNTER = 0x00000980 +REG_A6XX_CP_AHB_CNTL = 0x0000098d +REG_A6XX_CP_APERTURE_CNTL_HOST = 0x00000a00 +REG_A7XX_CP_APERTURE_CNTL_HOST = 0x00000a00 +A7XX_CP_APERTURE_CNTL_HOST_PIPE__MASK = 0x00003000 +A7XX_CP_APERTURE_CNTL_HOST_PIPE__SHIFT = 12 +A7XX_CP_APERTURE_CNTL_HOST_CLUSTER__MASK = 0x00000700 +A7XX_CP_APERTURE_CNTL_HOST_CLUSTER__SHIFT = 8 +A7XX_CP_APERTURE_CNTL_HOST_CONTEXT__MASK = 0x00000030 +A7XX_CP_APERTURE_CNTL_HOST_CONTEXT__SHIFT = 4 +REG_A6XX_CP_APERTURE_CNTL_SQE = 0x00000a01 +REG_A6XX_CP_APERTURE_CNTL_CD = 0x00000a03 +REG_A7XX_CP_APERTURE_CNTL_CD = 0x00000a03 +A7XX_CP_APERTURE_CNTL_CD_PIPE__MASK = 0x00003000 +A7XX_CP_APERTURE_CNTL_CD_PIPE__SHIFT = 12 +A7XX_CP_APERTURE_CNTL_CD_CLUSTER__MASK = 0x00000700 +A7XX_CP_APERTURE_CNTL_CD_CLUSTER__SHIFT = 8 +A7XX_CP_APERTURE_CNTL_CD_CONTEXT__MASK = 0x00000030 +A7XX_CP_APERTURE_CNTL_CD_CONTEXT__SHIFT = 4 +REG_A7XX_CP_BV_PROTECT_STATUS = 0x00000a61 +REG_A7XX_CP_BV_HW_FAULT = 0x00000a64 +REG_A7XX_CP_BV_DRAW_STATE_ADDR = 0x00000a81 +REG_A7XX_CP_BV_DRAW_STATE_DATA = 0x00000a82 +REG_A7XX_CP_BV_ROQ_DBG_ADDR = 0x00000a83 +REG_A7XX_CP_BV_ROQ_DBG_DATA = 0x00000a84 +REG_A7XX_CP_BV_SQE_UCODE_DBG_ADDR = 0x00000a85 +REG_A7XX_CP_BV_SQE_UCODE_DBG_DATA = 0x00000a86 +REG_A7XX_CP_BV_SQE_STAT_ADDR = 0x00000a87 +REG_A7XX_CP_BV_SQE_STAT_DATA = 0x00000a88 +REG_A7XX_CP_BV_MEM_POOL_DBG_ADDR = 0x00000a96 +REG_A7XX_CP_BV_MEM_POOL_DBG_DATA = 0x00000a97 +REG_A7XX_CP_BV_RB_RPTR_ADDR = 0x00000a98 +REG_A7XX_CP_RESOURCE_TABLE_DBG_ADDR = 0x00000a9a +REG_A7XX_CP_RESOURCE_TABLE_DBG_DATA = 0x00000a9b +REG_A7XX_CP_BV_APRIV_CNTL = 0x00000ad0 +REG_A7XX_CP_BV_CHICKEN_DBG = 0x00000ada +REG_A7XX_CP_LPAC_DRAW_STATE_ADDR = 0x00000b0a +REG_A7XX_CP_LPAC_DRAW_STATE_DATA = 0x00000b0b +REG_A7XX_CP_LPAC_ROQ_DBG_ADDR = 0x00000b0c +REG_A7XX_CP_SQE_AC_UCODE_DBG_ADDR = 0x00000b27 +REG_A7XX_CP_SQE_AC_UCODE_DBG_DATA = 0x00000b28 +REG_A7XX_CP_SQE_AC_STAT_ADDR = 0x00000b29 +REG_A7XX_CP_SQE_AC_STAT_DATA = 0x00000b2a +REG_A7XX_CP_LPAC_APRIV_CNTL = 0x00000b31 +REG_A6XX_CP_LPAC_PROG_FIFO_SIZE = 0x00000b34 +REG_A7XX_CP_LPAC_ROQ_DBG_DATA = 0x00000b35 +REG_A7XX_CP_LPAC_FIFO_DBG_DATA = 0x00000b36 +REG_A7XX_CP_LPAC_FIFO_DBG_ADDR = 0x00000b40 +REG_A6XX_CP_LPAC_SQE_CNTL = 0x00000b81 +REG_A6XX_CP_LPAC_SQE_INSTR_BASE = 0x00000b82 +REG_A7XX_CP_AQE_INSTR_BASE_0 = 0x00000b70 +REG_A7XX_CP_AQE_INSTR_BASE_1 = 0x00000b72 +REG_A7XX_CP_AQE_APRIV_CNTL = 0x00000b78 +REG_A7XX_CP_AQE_ROQ_DBG_ADDR_0 = 0x00000ba8 +REG_A7XX_CP_AQE_ROQ_DBG_ADDR_1 = 0x00000ba9 +REG_A7XX_CP_AQE_ROQ_DBG_DATA_0 = 0x00000bac +REG_A7XX_CP_AQE_ROQ_DBG_DATA_1 = 0x00000bad +REG_A7XX_CP_AQE_UCODE_DBG_ADDR_0 = 0x00000bb0 +REG_A7XX_CP_AQE_UCODE_DBG_ADDR_1 = 0x00000bb1 +REG_A7XX_CP_AQE_UCODE_DBG_DATA_0 = 0x00000bb4 +REG_A7XX_CP_AQE_UCODE_DBG_DATA_1 = 0x00000bb5 +REG_A7XX_CP_AQE_STAT_ADDR_0 = 0x00000bb8 +REG_A7XX_CP_AQE_STAT_ADDR_1 = 0x00000bb9 +REG_A7XX_CP_AQE_STAT_DATA_0 = 0x00000bbc +REG_A7XX_CP_AQE_STAT_DATA_1 = 0x00000bbd +REG_A6XX_VSC_ADDR_MODE_CNTL = 0x00000c01 +REG_A6XX_RBBM_GPR0_CNTL = 0x00000018 +REG_A6XX_RBBM_INT_0_STATUS = 0x00000201 +REG_A6XX_RBBM_STATUS = 0x00000210 +A6XX_RBBM_STATUS_GPU_BUSY_IGN_AHB = 0x00800000 +A6XX_RBBM_STATUS_GPU_BUSY_IGN_AHB_CP = 0x00400000 +A6XX_RBBM_STATUS_HLSQ_BUSY = 0x00200000 +A6XX_RBBM_STATUS_VSC_BUSY = 0x00100000 +A6XX_RBBM_STATUS_TPL1_BUSY = 0x00080000 +A6XX_RBBM_STATUS_SP_BUSY = 0x00040000 +A6XX_RBBM_STATUS_UCHE_BUSY = 0x00020000 +A6XX_RBBM_STATUS_VPC_BUSY = 0x00010000 +A6XX_RBBM_STATUS_VFD_BUSY = 0x00008000 +A6XX_RBBM_STATUS_TESS_BUSY = 0x00004000 +A6XX_RBBM_STATUS_PC_VSD_BUSY = 0x00002000 +A6XX_RBBM_STATUS_PC_DCALL_BUSY = 0x00001000 +A6XX_RBBM_STATUS_COM_DCOM_BUSY = 0x00000800 +A6XX_RBBM_STATUS_LRZ_BUSY = 0x00000400 +A6XX_RBBM_STATUS_A2D_BUSY = 0x00000200 +A6XX_RBBM_STATUS_CCU_BUSY = 0x00000100 +A6XX_RBBM_STATUS_RB_BUSY = 0x00000080 +A6XX_RBBM_STATUS_RAS_BUSY = 0x00000040 +A6XX_RBBM_STATUS_TSE_BUSY = 0x00000020 +A6XX_RBBM_STATUS_VBIF_BUSY = 0x00000010 +A6XX_RBBM_STATUS_GFX_DBGC_BUSY = 0x00000008 +A6XX_RBBM_STATUS_CP_BUSY = 0x00000004 +A6XX_RBBM_STATUS_CP_AHB_BUSY_CP_MASTER = 0x00000002 +A6XX_RBBM_STATUS_CP_AHB_BUSY_CX_MASTER = 0x00000001 +REG_A6XX_RBBM_STATUS1 = 0x00000211 +REG_A6XX_RBBM_STATUS2 = 0x00000212 +REG_A6XX_RBBM_STATUS3 = 0x00000213 +A6XX_RBBM_STATUS3_SMMU_STALLED_ON_FAULT = 0x01000000 +REG_A6XX_RBBM_VBIF_GX_RESET_STATUS = 0x00000215 +REG_A7XX_RBBM_CLOCK_MODE_CP = 0x00000260 +REG_A7XX_RBBM_CLOCK_MODE_BV_LRZ = 0x00000284 +REG_A7XX_RBBM_CLOCK_MODE_BV_GRAS = 0x00000285 +REG_A7XX_RBBM_CLOCK_MODE2_GRAS = 0x00000286 +REG_A7XX_RBBM_CLOCK_MODE_BV_VFD = 0x00000287 +REG_A7XX_RBBM_CLOCK_MODE_BV_GPC = 0x00000288 +REG_A7XX_RBBM_SW_FUSE_INT_STATUS = 0x000002c0 +REG_A7XX_RBBM_SW_FUSE_INT_MASK = 0x000002c1 +REG_A6XX_RBBM_PERFCTR_CP = lambda i0: (0x00000400 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_RBBM = lambda i0: (0x0000041c + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_PC = lambda i0: (0x00000424 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_VFD = lambda i0: (0x00000434 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_HLSQ = lambda i0: (0x00000444 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_VPC = lambda i0: (0x00000450 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_CCU = lambda i0: (0x0000045c + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_TSE = lambda i0: (0x00000466 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_RAS = lambda i0: (0x0000046e + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_UCHE = lambda i0: (0x00000476 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_TP = lambda i0: (0x0000048e + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_SP = lambda i0: (0x000004a6 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_RB = lambda i0: (0x000004d6 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_VSC = lambda i0: (0x000004e6 + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_LRZ = lambda i0: (0x000004ea + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_CMP = lambda i0: (0x000004f2 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_CP = lambda i0: (0x00000300 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_RBBM = lambda i0: (0x0000031c + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_PC = lambda i0: (0x00000324 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_VFD = lambda i0: (0x00000334 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_HLSQ = lambda i0: (0x00000344 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_VPC = lambda i0: (0x00000350 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_CCU = lambda i0: (0x0000035c + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_TSE = lambda i0: (0x00000366 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_RAS = lambda i0: (0x0000036e + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_UCHE = lambda i0: (0x00000376 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_TP = lambda i0: (0x0000038e + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_SP = lambda i0: (0x000003a6 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_RB = lambda i0: (0x000003d6 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_VSC = lambda i0: (0x000003e6 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_LRZ = lambda i0: (0x000003ea + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_CMP = lambda i0: (0x000003f2 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_UFC = lambda i0: (0x000003fa + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR2_HLSQ = lambda i0: (0x00000410 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR2_CP = lambda i0: (0x0000041c + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR2_SP = lambda i0: (0x0000042a + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR2_TP = lambda i0: (0x00000442 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR2_UFC = lambda i0: (0x0000044e + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_BV_PC = lambda i0: (0x00000460 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_BV_VFD = lambda i0: (0x00000470 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_BV_VPC = lambda i0: (0x00000480 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_BV_TSE = lambda i0: (0x0000048c + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_BV_RAS = lambda i0: (0x00000494 + 0x2*i0 ) # type: ignore +REG_A7XX_RBBM_PERFCTR_BV_LRZ = lambda i0: (0x0000049c + 0x2*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_CNTL = 0x00000500 +REG_A6XX_RBBM_PERFCTR_LOAD_CMD0 = 0x00000501 +REG_A6XX_RBBM_PERFCTR_LOAD_CMD1 = 0x00000502 +REG_A6XX_RBBM_PERFCTR_LOAD_CMD2 = 0x00000503 +REG_A6XX_RBBM_PERFCTR_LOAD_CMD3 = 0x00000504 +REG_A6XX_RBBM_PERFCTR_LOAD_VALUE_LO = 0x00000505 +REG_A6XX_RBBM_PERFCTR_LOAD_VALUE_HI = 0x00000506 +REG_A6XX_RBBM_PERFCTR_RBBM_SEL = lambda i0: (0x00000507 + 0x1*i0 ) # type: ignore +REG_A6XX_RBBM_PERFCTR_GPU_BUSY_MASKED = 0x0000050b +REG_A6XX_RBBM_PERFCTR_SRAM_INIT_CMD = 0x0000050e +REG_A6XX_RBBM_PERFCTR_SRAM_INIT_STATUS = 0x0000050f +REG_A6XX_RBBM_ISDB_CNT = 0x00000533 +REG_A6XX_RBBM_NC_MODE_CNTL = 0x00000534 +REG_A7XX_RBBM_SNAPSHOT_STATUS = 0x00000535 +REG_A6XX_RBBM_PIPESTAT_IAVERTICES = 0x00000540 +REG_A6XX_RBBM_PIPESTAT_IAPRIMITIVES = 0x00000542 +REG_A6XX_RBBM_PIPESTAT_VSINVOCATIONS = 0x00000544 +REG_A6XX_RBBM_PIPESTAT_HSINVOCATIONS = 0x00000546 +REG_A6XX_RBBM_PIPESTAT_DSINVOCATIONS = 0x00000548 +REG_A6XX_RBBM_PIPESTAT_GSINVOCATIONS = 0x0000054a +REG_A6XX_RBBM_PIPESTAT_GSPRIMITIVES = 0x0000054c +REG_A6XX_RBBM_PIPESTAT_CINVOCATIONS = 0x0000054e +REG_A6XX_RBBM_PIPESTAT_CPRIMITIVES = 0x00000550 +REG_A6XX_RBBM_PIPESTAT_PSINVOCATIONS = 0x00000552 +REG_A6XX_RBBM_PIPESTAT_CSINVOCATIONS = 0x00000554 +REG_A6XX_RBBM_SECVID_TRUST_CNTL = 0x0000f400 +REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE = 0x0000f800 +REG_A6XX_RBBM_SECVID_TSB_TRUSTED_SIZE = 0x0000f802 +REG_A6XX_RBBM_SECVID_TSB_CNTL = 0x0000f803 +REG_A6XX_RBBM_SECVID_TSB_ADDR_MODE_CNTL = 0x0000f810 +REG_A7XX_RBBM_SECVID_TSB_STATUS = 0x0000fc00 +REG_A6XX_RBBM_VBIF_CLIENT_QOS_CNTL = 0x00000010 +REG_A6XX_RBBM_GBIF_CLIENT_QOS_CNTL = 0x00000011 +REG_A6XX_RBBM_GBIF_HALT = 0x00000016 +REG_A6XX_RBBM_GBIF_HALT_ACK = 0x00000017 +REG_A6XX_RBBM_WAIT_FOR_GPU_IDLE_CMD = 0x0000001c +A6XX_RBBM_WAIT_FOR_GPU_IDLE_CMD_WAIT_GPU_IDLE = 0x00000001 +REG_A7XX_RBBM_GBIF_HALT = 0x00000016 +REG_A7XX_RBBM_GBIF_HALT_ACK = 0x00000017 +REG_A6XX_RBBM_INTERFACE_HANG_INT_CNTL = 0x0000001f +REG_A6XX_RBBM_INT_CLEAR_CMD = 0x00000037 +REG_A6XX_RBBM_INT_0_MASK = 0x00000038 +REG_A7XX_RBBM_INT_2_MASK = 0x0000003a +REG_A6XX_RBBM_SP_HYST_CNT = 0x00000042 +REG_A6XX_RBBM_SW_RESET_CMD = 0x00000043 +REG_A6XX_RBBM_RAC_THRESHOLD_CNT = 0x00000044 +REG_A6XX_RBBM_BLOCK_SW_RESET_CMD = 0x00000045 +REG_A6XX_RBBM_BLOCK_SW_RESET_CMD2 = 0x00000046 +REG_A7XX_RBBM_CLOCK_CNTL_GLOBAL = 0x000000ad +REG_A6XX_RBBM_CLOCK_CNTL = 0x000000ae +REG_A6XX_RBBM_CLOCK_CNTL_SP0 = 0x000000b0 +REG_A6XX_RBBM_CLOCK_CNTL_SP1 = 0x000000b1 +REG_A6XX_RBBM_CLOCK_CNTL_SP2 = 0x000000b2 +REG_A6XX_RBBM_CLOCK_CNTL_SP3 = 0x000000b3 +REG_A6XX_RBBM_CLOCK_CNTL2_SP0 = 0x000000b4 +REG_A6XX_RBBM_CLOCK_CNTL2_SP1 = 0x000000b5 +REG_A6XX_RBBM_CLOCK_CNTL2_SP2 = 0x000000b6 +REG_A6XX_RBBM_CLOCK_CNTL2_SP3 = 0x000000b7 +REG_A6XX_RBBM_CLOCK_DELAY_SP0 = 0x000000b8 +REG_A6XX_RBBM_CLOCK_DELAY_SP1 = 0x000000b9 +REG_A6XX_RBBM_CLOCK_DELAY_SP2 = 0x000000ba +REG_A6XX_RBBM_CLOCK_DELAY_SP3 = 0x000000bb +REG_A6XX_RBBM_CLOCK_HYST_SP0 = 0x000000bc +REG_A6XX_RBBM_CLOCK_HYST_SP1 = 0x000000bd +REG_A6XX_RBBM_CLOCK_HYST_SP2 = 0x000000be +REG_A6XX_RBBM_CLOCK_HYST_SP3 = 0x000000bf +REG_A6XX_RBBM_CLOCK_CNTL_TP0 = 0x000000c0 +REG_A6XX_RBBM_CLOCK_CNTL_TP1 = 0x000000c1 +REG_A6XX_RBBM_CLOCK_CNTL_TP2 = 0x000000c2 +REG_A6XX_RBBM_CLOCK_CNTL_TP3 = 0x000000c3 +REG_A6XX_RBBM_CLOCK_CNTL2_TP0 = 0x000000c4 +REG_A6XX_RBBM_CLOCK_CNTL2_TP1 = 0x000000c5 +REG_A6XX_RBBM_CLOCK_CNTL2_TP2 = 0x000000c6 +REG_A6XX_RBBM_CLOCK_CNTL2_TP3 = 0x000000c7 +REG_A6XX_RBBM_CLOCK_CNTL3_TP0 = 0x000000c8 +REG_A6XX_RBBM_CLOCK_CNTL3_TP1 = 0x000000c9 +REG_A6XX_RBBM_CLOCK_CNTL3_TP2 = 0x000000ca +REG_A6XX_RBBM_CLOCK_CNTL3_TP3 = 0x000000cb +REG_A6XX_RBBM_CLOCK_CNTL4_TP0 = 0x000000cc +REG_A6XX_RBBM_CLOCK_CNTL4_TP1 = 0x000000cd +REG_A6XX_RBBM_CLOCK_CNTL4_TP2 = 0x000000ce +REG_A6XX_RBBM_CLOCK_CNTL4_TP3 = 0x000000cf +REG_A6XX_RBBM_CLOCK_DELAY_TP0 = 0x000000d0 +REG_A6XX_RBBM_CLOCK_DELAY_TP1 = 0x000000d1 +REG_A6XX_RBBM_CLOCK_DELAY_TP2 = 0x000000d2 +REG_A6XX_RBBM_CLOCK_DELAY_TP3 = 0x000000d3 +REG_A6XX_RBBM_CLOCK_DELAY2_TP0 = 0x000000d4 +REG_A6XX_RBBM_CLOCK_DELAY2_TP1 = 0x000000d5 +REG_A6XX_RBBM_CLOCK_DELAY2_TP2 = 0x000000d6 +REG_A6XX_RBBM_CLOCK_DELAY2_TP3 = 0x000000d7 +REG_A6XX_RBBM_CLOCK_DELAY3_TP0 = 0x000000d8 +REG_A6XX_RBBM_CLOCK_DELAY3_TP1 = 0x000000d9 +REG_A6XX_RBBM_CLOCK_DELAY3_TP2 = 0x000000da +REG_A6XX_RBBM_CLOCK_DELAY3_TP3 = 0x000000db +REG_A6XX_RBBM_CLOCK_DELAY4_TP0 = 0x000000dc +REG_A6XX_RBBM_CLOCK_DELAY4_TP1 = 0x000000dd +REG_A6XX_RBBM_CLOCK_DELAY4_TP2 = 0x000000de +REG_A6XX_RBBM_CLOCK_DELAY4_TP3 = 0x000000df +REG_A6XX_RBBM_CLOCK_HYST_TP0 = 0x000000e0 +REG_A6XX_RBBM_CLOCK_HYST_TP1 = 0x000000e1 +REG_A6XX_RBBM_CLOCK_HYST_TP2 = 0x000000e2 +REG_A6XX_RBBM_CLOCK_HYST_TP3 = 0x000000e3 +REG_A6XX_RBBM_CLOCK_HYST2_TP0 = 0x000000e4 +REG_A6XX_RBBM_CLOCK_HYST2_TP1 = 0x000000e5 +REG_A6XX_RBBM_CLOCK_HYST2_TP2 = 0x000000e6 +REG_A6XX_RBBM_CLOCK_HYST2_TP3 = 0x000000e7 +REG_A6XX_RBBM_CLOCK_HYST3_TP0 = 0x000000e8 +REG_A6XX_RBBM_CLOCK_HYST3_TP1 = 0x000000e9 +REG_A6XX_RBBM_CLOCK_HYST3_TP2 = 0x000000ea +REG_A6XX_RBBM_CLOCK_HYST3_TP3 = 0x000000eb +REG_A6XX_RBBM_CLOCK_HYST4_TP0 = 0x000000ec +REG_A6XX_RBBM_CLOCK_HYST4_TP1 = 0x000000ed +REG_A6XX_RBBM_CLOCK_HYST4_TP2 = 0x000000ee +REG_A6XX_RBBM_CLOCK_HYST4_TP3 = 0x000000ef +REG_A6XX_RBBM_CLOCK_CNTL_RB0 = 0x000000f0 +REG_A6XX_RBBM_CLOCK_CNTL_RB1 = 0x000000f1 +REG_A6XX_RBBM_CLOCK_CNTL_RB2 = 0x000000f2 +REG_A6XX_RBBM_CLOCK_CNTL_RB3 = 0x000000f3 +REG_A6XX_RBBM_CLOCK_CNTL2_RB0 = 0x000000f4 +REG_A6XX_RBBM_CLOCK_CNTL2_RB1 = 0x000000f5 +REG_A6XX_RBBM_CLOCK_CNTL2_RB2 = 0x000000f6 +REG_A6XX_RBBM_CLOCK_CNTL2_RB3 = 0x000000f7 +REG_A6XX_RBBM_CLOCK_CNTL_CCU0 = 0x000000f8 +REG_A6XX_RBBM_CLOCK_CNTL_CCU1 = 0x000000f9 +REG_A6XX_RBBM_CLOCK_CNTL_CCU2 = 0x000000fa +REG_A6XX_RBBM_CLOCK_CNTL_CCU3 = 0x000000fb +REG_A6XX_RBBM_CLOCK_HYST_RB_CCU0 = 0x00000100 +REG_A6XX_RBBM_CLOCK_HYST_RB_CCU1 = 0x00000101 +REG_A6XX_RBBM_CLOCK_HYST_RB_CCU2 = 0x00000102 +REG_A6XX_RBBM_CLOCK_HYST_RB_CCU3 = 0x00000103 +REG_A6XX_RBBM_CLOCK_CNTL_RAC = 0x00000104 +REG_A6XX_RBBM_CLOCK_CNTL2_RAC = 0x00000105 +REG_A6XX_RBBM_CLOCK_DELAY_RAC = 0x00000106 +REG_A6XX_RBBM_CLOCK_HYST_RAC = 0x00000107 +REG_A6XX_RBBM_CLOCK_CNTL_TSE_RAS_RBBM = 0x00000108 +REG_A6XX_RBBM_CLOCK_DELAY_TSE_RAS_RBBM = 0x00000109 +REG_A6XX_RBBM_CLOCK_HYST_TSE_RAS_RBBM = 0x0000010a +REG_A6XX_RBBM_CLOCK_CNTL_UCHE = 0x0000010b +REG_A6XX_RBBM_CLOCK_CNTL2_UCHE = 0x0000010c +REG_A6XX_RBBM_CLOCK_CNTL3_UCHE = 0x0000010d +REG_A6XX_RBBM_CLOCK_CNTL4_UCHE = 0x0000010e +REG_A6XX_RBBM_CLOCK_DELAY_UCHE = 0x0000010f +REG_A6XX_RBBM_CLOCK_HYST_UCHE = 0x00000110 +REG_A6XX_RBBM_CLOCK_MODE_VFD = 0x00000111 +REG_A6XX_RBBM_CLOCK_DELAY_VFD = 0x00000112 +REG_A6XX_RBBM_CLOCK_HYST_VFD = 0x00000113 +REG_A6XX_RBBM_CLOCK_MODE_GPC = 0x00000114 +REG_A6XX_RBBM_CLOCK_DELAY_GPC = 0x00000115 +REG_A6XX_RBBM_CLOCK_HYST_GPC = 0x00000116 +REG_A6XX_RBBM_CLOCK_DELAY_HLSQ_2 = 0x00000117 +REG_A6XX_RBBM_CLOCK_CNTL_GMU_GX = 0x00000118 +REG_A6XX_RBBM_CLOCK_DELAY_GMU_GX = 0x00000119 +REG_A6XX_RBBM_CLOCK_HYST_GMU_GX = 0x0000011a +REG_A6XX_RBBM_CLOCK_MODE_HLSQ = 0x0000011b +REG_A6XX_RBBM_CLOCK_DELAY_HLSQ = 0x0000011c +REG_A6XX_RBBM_CLOCK_HYST_HLSQ = 0x0000011d +REG_A7XX_RBBM_CGC_GLOBAL_LOAD_CMD = 0x0000011e +REG_A7XX_RBBM_CGC_P2S_TRIG_CMD = 0x0000011f +REG_A6XX_RBBM_CLOCK_CNTL_TEX_FCHE = 0x00000120 +REG_A6XX_RBBM_CLOCK_DELAY_TEX_FCHE = 0x00000121 +REG_A6XX_RBBM_CLOCK_HYST_TEX_FCHE = 0x00000122 +REG_A7XX_RBBM_CGC_P2S_STATUS = 0x00000122 +A7XX_RBBM_CGC_P2S_STATUS_TXDONE = 0x00000001 +REG_A6XX_RBBM_CLOCK_CNTL_FCHE = 0x00000123 +REG_A6XX_RBBM_CLOCK_DELAY_FCHE = 0x00000124 +REG_A6XX_RBBM_CLOCK_HYST_FCHE = 0x00000125 +REG_A6XX_RBBM_CLOCK_CNTL_MHUB = 0x00000126 +REG_A6XX_RBBM_CLOCK_DELAY_MHUB = 0x00000127 +REG_A6XX_RBBM_CLOCK_HYST_MHUB = 0x00000128 +REG_A6XX_RBBM_CLOCK_DELAY_GLC = 0x00000129 +REG_A6XX_RBBM_CLOCK_HYST_GLC = 0x0000012a +REG_A6XX_RBBM_CLOCK_CNTL_GLC = 0x0000012b +REG_A7XX_RBBM_CLOCK_HYST2_VFD = 0x0000012f +REG_A6XX_RBBM_LPAC_GBIF_CLIENT_QOS_CNTL = 0x000005ff +REG_A6XX_DBGC_CFG_DBGBUS_SEL_A = 0x00000600 +REG_A6XX_DBGC_CFG_DBGBUS_SEL_B = 0x00000601 +REG_A6XX_DBGC_CFG_DBGBUS_SEL_C = 0x00000602 +REG_A6XX_DBGC_CFG_DBGBUS_SEL_D = 0x00000603 +A6XX_DBGC_CFG_DBGBUS_SEL_D_PING_INDEX__MASK = 0x000000ff +A6XX_DBGC_CFG_DBGBUS_SEL_D_PING_INDEX__SHIFT = 0 +A6XX_DBGC_CFG_DBGBUS_SEL_D_PING_BLK_SEL__MASK = 0x0000ff00 +A6XX_DBGC_CFG_DBGBUS_SEL_D_PING_BLK_SEL__SHIFT = 8 +REG_A6XX_DBGC_CFG_DBGBUS_CNTLT = 0x00000604 +A6XX_DBGC_CFG_DBGBUS_CNTLT_TRACEEN__MASK = 0x0000003f +A6XX_DBGC_CFG_DBGBUS_CNTLT_TRACEEN__SHIFT = 0 +A6XX_DBGC_CFG_DBGBUS_CNTLT_GRANU__MASK = 0x00007000 +A6XX_DBGC_CFG_DBGBUS_CNTLT_GRANU__SHIFT = 12 +A6XX_DBGC_CFG_DBGBUS_CNTLT_SEGT__MASK = 0xf0000000 +A6XX_DBGC_CFG_DBGBUS_CNTLT_SEGT__SHIFT = 28 +REG_A6XX_DBGC_CFG_DBGBUS_CNTLM = 0x00000605 +A6XX_DBGC_CFG_DBGBUS_CNTLM_ENABLE__MASK = 0x0f000000 +A6XX_DBGC_CFG_DBGBUS_CNTLM_ENABLE__SHIFT = 24 +REG_A6XX_DBGC_CFG_DBGBUS_IVTL_0 = 0x00000608 +REG_A6XX_DBGC_CFG_DBGBUS_IVTL_1 = 0x00000609 +REG_A6XX_DBGC_CFG_DBGBUS_IVTL_2 = 0x0000060a +REG_A6XX_DBGC_CFG_DBGBUS_IVTL_3 = 0x0000060b +REG_A6XX_DBGC_CFG_DBGBUS_MASKL_0 = 0x0000060c +REG_A6XX_DBGC_CFG_DBGBUS_MASKL_1 = 0x0000060d +REG_A6XX_DBGC_CFG_DBGBUS_MASKL_2 = 0x0000060e +REG_A6XX_DBGC_CFG_DBGBUS_MASKL_3 = 0x0000060f +REG_A6XX_DBGC_CFG_DBGBUS_BYTEL_0 = 0x00000610 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL0__MASK = 0x0000000f +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL0__SHIFT = 0 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL1__MASK = 0x000000f0 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL1__SHIFT = 4 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL2__MASK = 0x00000f00 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL2__SHIFT = 8 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL3__MASK = 0x0000f000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL3__SHIFT = 12 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL4__MASK = 0x000f0000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL4__SHIFT = 16 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL5__MASK = 0x00f00000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL5__SHIFT = 20 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL6__MASK = 0x0f000000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL6__SHIFT = 24 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL7__MASK = 0xf0000000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL7__SHIFT = 28 +REG_A6XX_DBGC_CFG_DBGBUS_BYTEL_1 = 0x00000611 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL8__MASK = 0x0000000f +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL8__SHIFT = 0 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL9__MASK = 0x000000f0 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL9__SHIFT = 4 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL10__MASK = 0x00000f00 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL10__SHIFT = 8 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL11__MASK = 0x0000f000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL11__SHIFT = 12 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL12__MASK = 0x000f0000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL12__SHIFT = 16 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL13__MASK = 0x00f00000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL13__SHIFT = 20 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL14__MASK = 0x0f000000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL14__SHIFT = 24 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL15__MASK = 0xf0000000 +A6XX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL15__SHIFT = 28 +REG_A6XX_DBGC_CFG_DBGBUS_TRACE_BUF1 = 0x0000062f +REG_A6XX_DBGC_CFG_DBGBUS_TRACE_BUF2 = 0x00000630 +REG_A6XX_VSC_PERFCTR_VSC_SEL = lambda i0: (0x00000cd8 + 0x1*i0 ) # type: ignore +REG_A7XX_VSC_UNKNOWN_0CD8 = 0x00000cd8 +A7XX_VSC_UNKNOWN_0CD8_BINNING = 0x00000001 +REG_A6XX_HLSQ_DBG_AHB_READ_APERTURE = 0x0000c800 +REG_A6XX_HLSQ_DBG_READ_SEL = 0x0000d000 +REG_A6XX_UCHE_ADDR_MODE_CNTL = 0x00000e00 +REG_A6XX_UCHE_MODE_CNTL = 0x00000e01 +REG_A6XX_UCHE_WRITE_RANGE_MAX = 0x00000e05 +REG_A6XX_UCHE_WRITE_THRU_BASE = 0x00000e07 +REG_A6XX_UCHE_TRAP_BASE = 0x00000e09 +REG_A6XX_UCHE_GMEM_RANGE_MIN = 0x00000e0b +REG_A6XX_UCHE_GMEM_RANGE_MAX = 0x00000e0d +REG_A6XX_UCHE_CACHE_WAYS = 0x00000e17 +REG_A6XX_UCHE_FILTER_CNTL = 0x00000e18 +REG_A6XX_UCHE_CLIENT_PF = 0x00000e19 +A6XX_UCHE_CLIENT_PF_PERFSEL__MASK = 0x000000ff +A6XX_UCHE_CLIENT_PF_PERFSEL__SHIFT = 0 +REG_A6XX_UCHE_PERFCTR_UCHE_SEL = lambda i0: (0x00000e1c + 0x1*i0 ) # type: ignore +REG_A6XX_UCHE_GBIF_GX_CONFIG = 0x00000e3a +REG_A6XX_UCHE_CMDQ_CONFIG = 0x00000e3c +REG_A6XX_VBIF_VERSION = 0x00003000 +REG_A6XX_VBIF_CLKON = 0x00003001 +A6XX_VBIF_CLKON_FORCE_ON_TESTBUS = 0x00000002 +REG_A6XX_VBIF_GATE_OFF_WRREQ_EN = 0x0000302a +REG_A6XX_VBIF_XIN_HALT_CTRL0 = 0x00003080 +REG_A6XX_VBIF_XIN_HALT_CTRL1 = 0x00003081 +REG_A6XX_VBIF_TEST_BUS_OUT_CTRL = 0x00003084 +REG_A6XX_VBIF_TEST_BUS1_CTRL0 = 0x00003085 +REG_A6XX_VBIF_TEST_BUS1_CTRL1 = 0x00003086 +A6XX_VBIF_TEST_BUS1_CTRL1_DATA_SEL__MASK = 0x0000000f +A6XX_VBIF_TEST_BUS1_CTRL1_DATA_SEL__SHIFT = 0 +REG_A6XX_VBIF_TEST_BUS2_CTRL0 = 0x00003087 +REG_A6XX_VBIF_TEST_BUS2_CTRL1 = 0x00003088 +A6XX_VBIF_TEST_BUS2_CTRL1_DATA_SEL__MASK = 0x000001ff +A6XX_VBIF_TEST_BUS2_CTRL1_DATA_SEL__SHIFT = 0 +REG_A6XX_VBIF_TEST_BUS_OUT = 0x0000308c +REG_A6XX_VBIF_PERF_CNT_SEL0 = 0x000030d0 +REG_A6XX_VBIF_PERF_CNT_SEL1 = 0x000030d1 +REG_A6XX_VBIF_PERF_CNT_SEL2 = 0x000030d2 +REG_A6XX_VBIF_PERF_CNT_SEL3 = 0x000030d3 +REG_A6XX_VBIF_PERF_CNT_LOW0 = 0x000030d8 +REG_A6XX_VBIF_PERF_CNT_LOW1 = 0x000030d9 +REG_A6XX_VBIF_PERF_CNT_LOW2 = 0x000030da +REG_A6XX_VBIF_PERF_CNT_LOW3 = 0x000030db +REG_A6XX_VBIF_PERF_CNT_HIGH0 = 0x000030e0 +REG_A6XX_VBIF_PERF_CNT_HIGH1 = 0x000030e1 +REG_A6XX_VBIF_PERF_CNT_HIGH2 = 0x000030e2 +REG_A6XX_VBIF_PERF_CNT_HIGH3 = 0x000030e3 +REG_A6XX_VBIF_PERF_PWR_CNT_EN0 = 0x00003100 +REG_A6XX_VBIF_PERF_PWR_CNT_EN1 = 0x00003101 +REG_A6XX_VBIF_PERF_PWR_CNT_EN2 = 0x00003102 +REG_A6XX_VBIF_PERF_PWR_CNT_LOW0 = 0x00003110 +REG_A6XX_VBIF_PERF_PWR_CNT_LOW1 = 0x00003111 +REG_A6XX_VBIF_PERF_PWR_CNT_LOW2 = 0x00003112 +REG_A6XX_VBIF_PERF_PWR_CNT_HIGH0 = 0x00003118 +REG_A6XX_VBIF_PERF_PWR_CNT_HIGH1 = 0x00003119 +REG_A6XX_VBIF_PERF_PWR_CNT_HIGH2 = 0x0000311a +REG_A6XX_GBIF_SCACHE_CNTL0 = 0x00003c01 +REG_A6XX_GBIF_SCACHE_CNTL1 = 0x00003c02 +REG_A6XX_GBIF_QSB_SIDE0 = 0x00003c03 +REG_A6XX_GBIF_QSB_SIDE1 = 0x00003c04 +REG_A6XX_GBIF_QSB_SIDE2 = 0x00003c05 +REG_A6XX_GBIF_QSB_SIDE3 = 0x00003c06 +REG_A6XX_GBIF_HALT = 0x00003c45 +REG_A6XX_GBIF_HALT_ACK = 0x00003c46 +REG_A6XX_GBIF_PERF_PWR_CNT_EN = 0x00003cc0 +REG_A6XX_GBIF_PERF_PWR_CNT_CLR = 0x00003cc1 +REG_A6XX_GBIF_PERF_CNT_SEL = 0x00003cc2 +REG_A6XX_GBIF_PERF_PWR_CNT_SEL = 0x00003cc3 +REG_A6XX_GBIF_PERF_CNT_LOW0 = 0x00003cc4 +REG_A6XX_GBIF_PERF_CNT_LOW1 = 0x00003cc5 +REG_A6XX_GBIF_PERF_CNT_LOW2 = 0x00003cc6 +REG_A6XX_GBIF_PERF_CNT_LOW3 = 0x00003cc7 +REG_A6XX_GBIF_PERF_CNT_HIGH0 = 0x00003cc8 +REG_A6XX_GBIF_PERF_CNT_HIGH1 = 0x00003cc9 +REG_A6XX_GBIF_PERF_CNT_HIGH2 = 0x00003cca +REG_A6XX_GBIF_PERF_CNT_HIGH3 = 0x00003ccb +REG_A6XX_GBIF_PWR_CNT_LOW0 = 0x00003ccc +REG_A6XX_GBIF_PWR_CNT_LOW1 = 0x00003ccd +REG_A6XX_GBIF_PWR_CNT_LOW2 = 0x00003cce +REG_A6XX_GBIF_PWR_CNT_HIGH0 = 0x00003ccf +REG_A6XX_GBIF_PWR_CNT_HIGH1 = 0x00003cd0 +REG_A6XX_GBIF_PWR_CNT_HIGH2 = 0x00003cd1 +REG_A6XX_VSC_DBG_ECO_CNTL = 0x00000c00 +REG_A6XX_VSC_BIN_SIZE = 0x00000c02 +A6XX_VSC_BIN_SIZE_WIDTH__MASK = 0x000000ff +A6XX_VSC_BIN_SIZE_WIDTH__SHIFT = 0 +A6XX_VSC_BIN_SIZE_HEIGHT__MASK = 0x0001ff00 +A6XX_VSC_BIN_SIZE_HEIGHT__SHIFT = 8 +REG_A6XX_VSC_SIZE_BASE = 0x00000c03 +REG_A6XX_VSC_EXPANDED_BIN_CNTL = 0x00000c06 +A6XX_VSC_EXPANDED_BIN_CNTL_NX__MASK = 0x000007fe +A6XX_VSC_EXPANDED_BIN_CNTL_NX__SHIFT = 1 +A6XX_VSC_EXPANDED_BIN_CNTL_NY__MASK = 0x001ff800 +A6XX_VSC_EXPANDED_BIN_CNTL_NY__SHIFT = 11 +REG_A6XX_VSC_PIPE_CONFIG = lambda i0: (0x00000c10 + 0x1*i0 ) # type: ignore +A6XX_VSC_PIPE_CONFIG_REG_X__MASK = 0x000003ff +A6XX_VSC_PIPE_CONFIG_REG_X__SHIFT = 0 +A6XX_VSC_PIPE_CONFIG_REG_Y__MASK = 0x000ffc00 +A6XX_VSC_PIPE_CONFIG_REG_Y__SHIFT = 10 +A6XX_VSC_PIPE_CONFIG_REG_W__MASK = 0x03f00000 +A6XX_VSC_PIPE_CONFIG_REG_W__SHIFT = 20 +A6XX_VSC_PIPE_CONFIG_REG_H__MASK = 0xfc000000 +A6XX_VSC_PIPE_CONFIG_REG_H__SHIFT = 26 +REG_A6XX_VSC_PIPE_DATA_PRIM_BASE = 0x00000c30 +REG_A6XX_VSC_PIPE_DATA_PRIM_STRIDE = 0x00000c32 +REG_A6XX_VSC_PIPE_DATA_PRIM_LENGTH = 0x00000c33 +REG_A6XX_VSC_PIPE_DATA_DRAW_BASE = 0x00000c34 +REG_A6XX_VSC_PIPE_DATA_DRAW_STRIDE = 0x00000c36 +REG_A6XX_VSC_PIPE_DATA_DRAW_LENGTH = 0x00000c37 +REG_A6XX_VSC_CHANNEL_VISIBILITY = lambda i0: (0x00000c38 + 0x1*i0 ) # type: ignore +REG_A6XX_VSC_PIPE_DATA_PRIM_SIZE = lambda i0: (0x00000c58 + 0x1*i0 ) # type: ignore +REG_A6XX_VSC_PIPE_DATA_DRAW_SIZE = lambda i0: (0x00000c78 + 0x1*i0 ) # type: ignore +REG_A7XX_VSC_UNKNOWN_0D08 = 0x00000d08 +REG_A7XX_UCHE_UNKNOWN_0E10 = 0x00000e10 +REG_A7XX_UCHE_UNKNOWN_0E11 = 0x00000e11 +REG_A6XX_UCHE_UNKNOWN_0E12 = 0x00000e12 +REG_A6XX_GRAS_CL_CNTL = 0x00008000 +A6XX_GRAS_CL_CNTL_CLIP_DISABLE = 0x00000001 +A6XX_GRAS_CL_CNTL_ZNEAR_CLIP_DISABLE = 0x00000002 +A6XX_GRAS_CL_CNTL_ZFAR_CLIP_DISABLE = 0x00000004 +A6XX_GRAS_CL_CNTL_Z_CLAMP_ENABLE = 0x00000020 +A6XX_GRAS_CL_CNTL_ZERO_GB_SCALE_Z = 0x00000040 +A6XX_GRAS_CL_CNTL_VP_CLIP_CODE_IGNORE = 0x00000080 +A6XX_GRAS_CL_CNTL_VP_XFORM_DISABLE = 0x00000100 +A6XX_GRAS_CL_CNTL_PERSP_DIVISION_DISABLE = 0x00000200 +REG_A6XX_GRAS_CL_VS_CLIP_CULL_DISTANCE = 0x00008001 +A6XX_GRAS_CL_VS_CLIP_CULL_DISTANCE_CLIP_MASK__MASK = 0x000000ff +A6XX_GRAS_CL_VS_CLIP_CULL_DISTANCE_CLIP_MASK__SHIFT = 0 +A6XX_GRAS_CL_VS_CLIP_CULL_DISTANCE_CULL_MASK__MASK = 0x0000ff00 +A6XX_GRAS_CL_VS_CLIP_CULL_DISTANCE_CULL_MASK__SHIFT = 8 +REG_A6XX_GRAS_CL_DS_CLIP_CULL_DISTANCE = 0x00008002 +A6XX_GRAS_CL_DS_CLIP_CULL_DISTANCE_CLIP_MASK__MASK = 0x000000ff +A6XX_GRAS_CL_DS_CLIP_CULL_DISTANCE_CLIP_MASK__SHIFT = 0 +A6XX_GRAS_CL_DS_CLIP_CULL_DISTANCE_CULL_MASK__MASK = 0x0000ff00 +A6XX_GRAS_CL_DS_CLIP_CULL_DISTANCE_CULL_MASK__SHIFT = 8 +REG_A6XX_GRAS_CL_GS_CLIP_CULL_DISTANCE = 0x00008003 +A6XX_GRAS_CL_GS_CLIP_CULL_DISTANCE_CLIP_MASK__MASK = 0x000000ff +A6XX_GRAS_CL_GS_CLIP_CULL_DISTANCE_CLIP_MASK__SHIFT = 0 +A6XX_GRAS_CL_GS_CLIP_CULL_DISTANCE_CULL_MASK__MASK = 0x0000ff00 +A6XX_GRAS_CL_GS_CLIP_CULL_DISTANCE_CULL_MASK__SHIFT = 8 +REG_A6XX_GRAS_CL_ARRAY_SIZE = 0x00008004 +REG_A6XX_GRAS_CL_INTERP_CNTL = 0x00008005 +A6XX_GRAS_CL_INTERP_CNTL_IJ_PERSP_PIXEL = 0x00000001 +A6XX_GRAS_CL_INTERP_CNTL_IJ_PERSP_CENTROID = 0x00000002 +A6XX_GRAS_CL_INTERP_CNTL_IJ_PERSP_SAMPLE = 0x00000004 +A6XX_GRAS_CL_INTERP_CNTL_IJ_LINEAR_PIXEL = 0x00000008 +A6XX_GRAS_CL_INTERP_CNTL_IJ_LINEAR_CENTROID = 0x00000010 +A6XX_GRAS_CL_INTERP_CNTL_IJ_LINEAR_SAMPLE = 0x00000020 +A6XX_GRAS_CL_INTERP_CNTL_COORD_MASK__MASK = 0x000003c0 +A6XX_GRAS_CL_INTERP_CNTL_COORD_MASK__SHIFT = 6 +A6XX_GRAS_CL_INTERP_CNTL_UNK10 = 0x00000400 +A6XX_GRAS_CL_INTERP_CNTL_UNK11 = 0x00000800 +REG_A6XX_GRAS_CL_GUARDBAND_CLIP_ADJ = 0x00008006 +A6XX_GRAS_CL_GUARDBAND_CLIP_ADJ_HORZ__MASK = 0x000001ff +A6XX_GRAS_CL_GUARDBAND_CLIP_ADJ_HORZ__SHIFT = 0 +A6XX_GRAS_CL_GUARDBAND_CLIP_ADJ_VERT__MASK = 0x0007fc00 +A6XX_GRAS_CL_GUARDBAND_CLIP_ADJ_VERT__SHIFT = 10 +REG_A7XX_GRAS_UNKNOWN_8007 = 0x00008007 +REG_A7XX_GRAS_UNKNOWN_8008 = 0x00008008 +REG_A7XX_GRAS_UNKNOWN_8009 = 0x00008009 +REG_A7XX_GRAS_UNKNOWN_800A = 0x0000800a +REG_A7XX_GRAS_UNKNOWN_800B = 0x0000800b +REG_A7XX_GRAS_UNKNOWN_800C = 0x0000800c +REG_A6XX_GRAS_CL_VIEWPORT = lambda i0: (0x00008010 + 0x6*i0 ) # type: ignore +A6XX_GRAS_CL_VIEWPORT_XOFFSET__MASK = 0xffffffff +A6XX_GRAS_CL_VIEWPORT_XOFFSET__SHIFT = 0 +A6XX_GRAS_CL_VIEWPORT_XSCALE__MASK = 0xffffffff +A6XX_GRAS_CL_VIEWPORT_XSCALE__SHIFT = 0 +A6XX_GRAS_CL_VIEWPORT_YOFFSET__MASK = 0xffffffff +A6XX_GRAS_CL_VIEWPORT_YOFFSET__SHIFT = 0 +A6XX_GRAS_CL_VIEWPORT_YSCALE__MASK = 0xffffffff +A6XX_GRAS_CL_VIEWPORT_YSCALE__SHIFT = 0 +A6XX_GRAS_CL_VIEWPORT_ZOFFSET__MASK = 0xffffffff +A6XX_GRAS_CL_VIEWPORT_ZOFFSET__SHIFT = 0 +A6XX_GRAS_CL_VIEWPORT_ZSCALE__MASK = 0xffffffff +A6XX_GRAS_CL_VIEWPORT_ZSCALE__SHIFT = 0 +REG_A6XX_GRAS_CL_VIEWPORT_ZCLAMP = lambda i0: (0x00008070 + 0x2*i0 ) # type: ignore +A6XX_GRAS_CL_VIEWPORT_ZCLAMP_MIN__MASK = 0xffffffff +A6XX_GRAS_CL_VIEWPORT_ZCLAMP_MIN__SHIFT = 0 +A6XX_GRAS_CL_VIEWPORT_ZCLAMP_MAX__MASK = 0xffffffff +A6XX_GRAS_CL_VIEWPORT_ZCLAMP_MAX__SHIFT = 0 +REG_A6XX_GRAS_SU_CNTL = 0x00008090 +A6XX_GRAS_SU_CNTL_CULL_FRONT = 0x00000001 +A6XX_GRAS_SU_CNTL_CULL_BACK = 0x00000002 +A6XX_GRAS_SU_CNTL_FRONT_CW = 0x00000004 +A6XX_GRAS_SU_CNTL_LINEHALFWIDTH__MASK = 0x000007f8 +A6XX_GRAS_SU_CNTL_LINEHALFWIDTH__SHIFT = 3 +A6XX_GRAS_SU_CNTL_POLY_OFFSET = 0x00000800 +A6XX_GRAS_SU_CNTL_UNK12 = 0x00001000 +A6XX_GRAS_SU_CNTL_LINE_MODE__MASK = 0x00002000 +A6XX_GRAS_SU_CNTL_LINE_MODE__SHIFT = 13 +A6XX_GRAS_SU_CNTL_UNK15__MASK = 0x00018000 +A6XX_GRAS_SU_CNTL_UNK15__SHIFT = 15 +A6XX_GRAS_SU_CNTL_MULTIVIEW_ENABLE = 0x00020000 +A6XX_GRAS_SU_CNTL_RENDERTARGETINDEXINCR = 0x00040000 +A6XX_GRAS_SU_CNTL_VIEWPORTINDEXINCR = 0x00080000 +A6XX_GRAS_SU_CNTL_UNK20__MASK = 0x00700000 +A6XX_GRAS_SU_CNTL_UNK20__SHIFT = 20 +REG_A6XX_GRAS_SU_POINT_MINMAX = 0x00008091 +A6XX_GRAS_SU_POINT_MINMAX_MIN__MASK = 0x0000ffff +A6XX_GRAS_SU_POINT_MINMAX_MIN__SHIFT = 0 +A6XX_GRAS_SU_POINT_MINMAX_MAX__MASK = 0xffff0000 +A6XX_GRAS_SU_POINT_MINMAX_MAX__SHIFT = 16 +REG_A6XX_GRAS_SU_POINT_SIZE = 0x00008092 +A6XX_GRAS_SU_POINT_SIZE__MASK = 0x0000ffff +A6XX_GRAS_SU_POINT_SIZE__SHIFT = 0 +REG_A6XX_GRAS_SU_DEPTH_PLANE_CNTL = 0x00008094 +A6XX_GRAS_SU_DEPTH_PLANE_CNTL_Z_MODE__MASK = 0x00000003 +A6XX_GRAS_SU_DEPTH_PLANE_CNTL_Z_MODE__SHIFT = 0 +REG_A6XX_GRAS_SU_POLY_OFFSET_SCALE = 0x00008095 +A6XX_GRAS_SU_POLY_OFFSET_SCALE__MASK = 0xffffffff +A6XX_GRAS_SU_POLY_OFFSET_SCALE__SHIFT = 0 +REG_A6XX_GRAS_SU_POLY_OFFSET_OFFSET = 0x00008096 +A6XX_GRAS_SU_POLY_OFFSET_OFFSET__MASK = 0xffffffff +A6XX_GRAS_SU_POLY_OFFSET_OFFSET__SHIFT = 0 +REG_A6XX_GRAS_SU_POLY_OFFSET_OFFSET_CLAMP = 0x00008097 +A6XX_GRAS_SU_POLY_OFFSET_OFFSET_CLAMP__MASK = 0xffffffff +A6XX_GRAS_SU_POLY_OFFSET_OFFSET_CLAMP__SHIFT = 0 +REG_A6XX_GRAS_SU_DEPTH_BUFFER_INFO = 0x00008098 +A6XX_GRAS_SU_DEPTH_BUFFER_INFO_DEPTH_FORMAT__MASK = 0x00000007 +A6XX_GRAS_SU_DEPTH_BUFFER_INFO_DEPTH_FORMAT__SHIFT = 0 +A6XX_GRAS_SU_DEPTH_BUFFER_INFO_UNK3 = 0x00000008 +REG_A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL = 0x00008099 +A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL_CONSERVATIVERASEN = 0x00000001 +A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL_SHIFTAMOUNT__MASK = 0x00000006 +A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL_SHIFTAMOUNT__SHIFT = 1 +A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL_INNERCONSERVATIVERASEN = 0x00000008 +A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL_UNK4__MASK = 0x00000030 +A6XX_GRAS_SU_CONSERVATIVE_RAS_CNTL_UNK4__SHIFT = 4 +REG_A6XX_GRAS_SU_PATH_RENDERING_CNTL = 0x0000809a +A6XX_GRAS_SU_PATH_RENDERING_CNTL_UNK0 = 0x00000001 +A6XX_GRAS_SU_PATH_RENDERING_CNTL_LINELENGTHEN = 0x00000002 +REG_A6XX_GRAS_SU_VS_SIV_CNTL = 0x0000809b +A6XX_GRAS_SU_VS_SIV_CNTL_WRITES_LAYER = 0x00000001 +A6XX_GRAS_SU_VS_SIV_CNTL_WRITES_VIEW = 0x00000002 +REG_A6XX_GRAS_SU_GS_SIV_CNTL = 0x0000809c +A6XX_GRAS_SU_GS_SIV_CNTL_WRITES_LAYER = 0x00000001 +A6XX_GRAS_SU_GS_SIV_CNTL_WRITES_VIEW = 0x00000002 +REG_A6XX_GRAS_SU_DS_SIV_CNTL = 0x0000809d +A6XX_GRAS_SU_DS_SIV_CNTL_WRITES_LAYER = 0x00000001 +A6XX_GRAS_SU_DS_SIV_CNTL_WRITES_VIEW = 0x00000002 +REG_A6XX_GRAS_SC_CNTL = 0x000080a0 +A6XX_GRAS_SC_CNTL_CCUSINGLECACHELINESIZE__MASK = 0x00000007 +A6XX_GRAS_SC_CNTL_CCUSINGLECACHELINESIZE__SHIFT = 0 +A6XX_GRAS_SC_CNTL_SINGLE_PRIM_MODE__MASK = 0x00000018 +A6XX_GRAS_SC_CNTL_SINGLE_PRIM_MODE__SHIFT = 3 +A6XX_GRAS_SC_CNTL_RASTER_MODE__MASK = 0x00000020 +A6XX_GRAS_SC_CNTL_RASTER_MODE__SHIFT = 5 +A6XX_GRAS_SC_CNTL_RASTER_DIRECTION__MASK = 0x000000c0 +A6XX_GRAS_SC_CNTL_RASTER_DIRECTION__SHIFT = 6 +A6XX_GRAS_SC_CNTL_SEQUENCED_THREAD_DISTRIBUTION__MASK = 0x00000100 +A6XX_GRAS_SC_CNTL_SEQUENCED_THREAD_DISTRIBUTION__SHIFT = 8 +A6XX_GRAS_SC_CNTL_UNK9 = 0x00000200 +A6XX_GRAS_SC_CNTL_ROTATION__MASK = 0x00000c00 +A6XX_GRAS_SC_CNTL_ROTATION__SHIFT = 10 +A6XX_GRAS_SC_CNTL_EARLYVIZOUTEN = 0x00001000 +REG_A6XX_GRAS_SC_BIN_CNTL = 0x000080a1 +A6XX_GRAS_SC_BIN_CNTL_BINW__MASK = 0x0000003f +A6XX_GRAS_SC_BIN_CNTL_BINW__SHIFT = 0 +A6XX_GRAS_SC_BIN_CNTL_BINH__MASK = 0x00007f00 +A6XX_GRAS_SC_BIN_CNTL_BINH__SHIFT = 8 +A6XX_GRAS_SC_BIN_CNTL_RENDER_MODE__MASK = 0x001c0000 +A6XX_GRAS_SC_BIN_CNTL_RENDER_MODE__SHIFT = 18 +A6XX_GRAS_SC_BIN_CNTL_FORCE_LRZ_WRITE_DIS = 0x00200000 +A6XX_GRAS_SC_BIN_CNTL_BUFFERS_LOCATION__MASK = 0x00c00000 +A6XX_GRAS_SC_BIN_CNTL_BUFFERS_LOCATION__SHIFT = 22 +A6XX_GRAS_SC_BIN_CNTL_LRZ_FEEDBACK_ZMODE_MASK__MASK = 0x07000000 +A6XX_GRAS_SC_BIN_CNTL_LRZ_FEEDBACK_ZMODE_MASK__SHIFT = 24 +A6XX_GRAS_SC_BIN_CNTL_UNK27 = 0x08000000 +REG_A6XX_GRAS_SC_RAS_MSAA_CNTL = 0x000080a2 +A6XX_GRAS_SC_RAS_MSAA_CNTL_SAMPLES__MASK = 0x00000003 +A6XX_GRAS_SC_RAS_MSAA_CNTL_SAMPLES__SHIFT = 0 +A6XX_GRAS_SC_RAS_MSAA_CNTL_UNK2 = 0x00000004 +A6XX_GRAS_SC_RAS_MSAA_CNTL_UNK3 = 0x00000008 +REG_A6XX_GRAS_SC_DEST_MSAA_CNTL = 0x000080a3 +A6XX_GRAS_SC_DEST_MSAA_CNTL_SAMPLES__MASK = 0x00000003 +A6XX_GRAS_SC_DEST_MSAA_CNTL_SAMPLES__SHIFT = 0 +A6XX_GRAS_SC_DEST_MSAA_CNTL_MSAA_DISABLE = 0x00000004 +REG_A6XX_GRAS_SC_MSAA_SAMPLE_POS_CNTL = 0x000080a4 +A6XX_GRAS_SC_MSAA_SAMPLE_POS_CNTL_UNK0 = 0x00000001 +A6XX_GRAS_SC_MSAA_SAMPLE_POS_CNTL_LOCATION_ENABLE = 0x00000002 +REG_A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0 = 0x000080a5 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_X__MASK = 0x0000000f +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_X__SHIFT = 0 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_Y__MASK = 0x000000f0 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_Y__SHIFT = 4 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_X__MASK = 0x00000f00 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_X__SHIFT = 8 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_Y__MASK = 0x0000f000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_Y__SHIFT = 12 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_X__MASK = 0x000f0000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_X__SHIFT = 16 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_Y__MASK = 0x00f00000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_Y__SHIFT = 20 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_X__MASK = 0x0f000000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_X__SHIFT = 24 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_Y__MASK = 0xf0000000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_Y__SHIFT = 28 +REG_A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1 = 0x000080a6 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_X__MASK = 0x0000000f +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_X__SHIFT = 0 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_Y__MASK = 0x000000f0 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_Y__SHIFT = 4 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_X__MASK = 0x00000f00 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_X__SHIFT = 8 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_Y__MASK = 0x0000f000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_Y__SHIFT = 12 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_X__MASK = 0x000f0000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_X__SHIFT = 16 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_Y__MASK = 0x00f00000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_Y__SHIFT = 20 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_X__MASK = 0x0f000000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_X__SHIFT = 24 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_Y__MASK = 0xf0000000 +A6XX_GRAS_SC_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_Y__SHIFT = 28 +REG_A7XX_GRAS_UNKNOWN_80A7 = 0x000080a7 +REG_A6XX_GRAS_UNKNOWN_80AF = 0x000080af +REG_A6XX_GRAS_SC_SCREEN_SCISSOR = lambda i0: (0x000080b0 + 0x2*i0 ) # type: ignore +A6XX_GRAS_SC_SCREEN_SCISSOR_TL_X__MASK = 0x0000ffff +A6XX_GRAS_SC_SCREEN_SCISSOR_TL_X__SHIFT = 0 +A6XX_GRAS_SC_SCREEN_SCISSOR_TL_Y__MASK = 0xffff0000 +A6XX_GRAS_SC_SCREEN_SCISSOR_TL_Y__SHIFT = 16 +A6XX_GRAS_SC_SCREEN_SCISSOR_BR_X__MASK = 0x0000ffff +A6XX_GRAS_SC_SCREEN_SCISSOR_BR_X__SHIFT = 0 +A6XX_GRAS_SC_SCREEN_SCISSOR_BR_Y__MASK = 0xffff0000 +A6XX_GRAS_SC_SCREEN_SCISSOR_BR_Y__SHIFT = 16 +REG_A6XX_GRAS_SC_VIEWPORT_SCISSOR = lambda i0: (0x000080d0 + 0x2*i0 ) # type: ignore +A6XX_GRAS_SC_VIEWPORT_SCISSOR_TL_X__MASK = 0x0000ffff +A6XX_GRAS_SC_VIEWPORT_SCISSOR_TL_X__SHIFT = 0 +A6XX_GRAS_SC_VIEWPORT_SCISSOR_TL_Y__MASK = 0xffff0000 +A6XX_GRAS_SC_VIEWPORT_SCISSOR_TL_Y__SHIFT = 16 +A6XX_GRAS_SC_VIEWPORT_SCISSOR_BR_X__MASK = 0x0000ffff +A6XX_GRAS_SC_VIEWPORT_SCISSOR_BR_X__SHIFT = 0 +A6XX_GRAS_SC_VIEWPORT_SCISSOR_BR_Y__MASK = 0xffff0000 +A6XX_GRAS_SC_VIEWPORT_SCISSOR_BR_Y__SHIFT = 16 +REG_A6XX_GRAS_SC_WINDOW_SCISSOR_TL = 0x000080f0 +A6XX_GRAS_SC_WINDOW_SCISSOR_TL_X__MASK = 0x00003fff +A6XX_GRAS_SC_WINDOW_SCISSOR_TL_X__SHIFT = 0 +A6XX_GRAS_SC_WINDOW_SCISSOR_TL_Y__MASK = 0x3fff0000 +A6XX_GRAS_SC_WINDOW_SCISSOR_TL_Y__SHIFT = 16 +REG_A6XX_GRAS_SC_WINDOW_SCISSOR_BR = 0x000080f1 +A6XX_GRAS_SC_WINDOW_SCISSOR_BR_X__MASK = 0x00003fff +A6XX_GRAS_SC_WINDOW_SCISSOR_BR_X__SHIFT = 0 +A6XX_GRAS_SC_WINDOW_SCISSOR_BR_Y__MASK = 0x3fff0000 +A6XX_GRAS_SC_WINDOW_SCISSOR_BR_Y__SHIFT = 16 +REG_A7XX_GRAS_VRS_CONFIG = 0x000080f4 +A7XX_GRAS_VRS_CONFIG_PIPELINE_FSR_ENABLE = 0x00000001 +A7XX_GRAS_VRS_CONFIG_FRAG_SIZE_X__MASK = 0x00000006 +A7XX_GRAS_VRS_CONFIG_FRAG_SIZE_X__SHIFT = 1 +A7XX_GRAS_VRS_CONFIG_FRAG_SIZE_Y__MASK = 0x00000018 +A7XX_GRAS_VRS_CONFIG_FRAG_SIZE_Y__SHIFT = 3 +A7XX_GRAS_VRS_CONFIG_COMBINER_OP_1__MASK = 0x000000e0 +A7XX_GRAS_VRS_CONFIG_COMBINER_OP_1__SHIFT = 5 +A7XX_GRAS_VRS_CONFIG_COMBINER_OP_2__MASK = 0x00000700 +A7XX_GRAS_VRS_CONFIG_COMBINER_OP_2__SHIFT = 8 +A7XX_GRAS_VRS_CONFIG_ATTACHMENT_FSR_ENABLE = 0x00002000 +A7XX_GRAS_VRS_CONFIG_PRIMITIVE_FSR_ENABLE = 0x00100000 +REG_A7XX_GRAS_QUALITY_BUFFER_INFO = 0x000080f5 +A7XX_GRAS_QUALITY_BUFFER_INFO_LAYERED = 0x00000001 +A7XX_GRAS_QUALITY_BUFFER_INFO_TILE_MODE__MASK = 0x00000006 +A7XX_GRAS_QUALITY_BUFFER_INFO_TILE_MODE__SHIFT = 1 +REG_A7XX_GRAS_QUALITY_BUFFER_DIMENSION = 0x000080f6 +A7XX_GRAS_QUALITY_BUFFER_DIMENSION_WIDTH__MASK = 0x0000ffff +A7XX_GRAS_QUALITY_BUFFER_DIMENSION_WIDTH__SHIFT = 0 +A7XX_GRAS_QUALITY_BUFFER_DIMENSION_HEIGHT__MASK = 0xffff0000 +A7XX_GRAS_QUALITY_BUFFER_DIMENSION_HEIGHT__SHIFT = 16 +REG_A7XX_GRAS_QUALITY_BUFFER_BASE = 0x000080f8 +REG_A7XX_GRAS_QUALITY_BUFFER_PITCH = 0x000080fa +A7XX_GRAS_QUALITY_BUFFER_PITCH_PITCH__MASK = 0x000000ff +A7XX_GRAS_QUALITY_BUFFER_PITCH_PITCH__SHIFT = 0 +A7XX_GRAS_QUALITY_BUFFER_PITCH_ARRAY_PITCH__MASK = 0x1ffffc00 +A7XX_GRAS_QUALITY_BUFFER_PITCH_ARRAY_PITCH__SHIFT = 10 +REG_A6XX_GRAS_LRZ_CNTL = 0x00008100 +A6XX_GRAS_LRZ_CNTL_ENABLE = 0x00000001 +A6XX_GRAS_LRZ_CNTL_LRZ_WRITE = 0x00000002 +A6XX_GRAS_LRZ_CNTL_GREATER = 0x00000004 +A6XX_GRAS_LRZ_CNTL_FC_ENABLE = 0x00000008 +A6XX_GRAS_LRZ_CNTL_Z_WRITE_ENABLE = 0x00000010 +A6XX_GRAS_LRZ_CNTL_Z_BOUNDS_ENABLE = 0x00000020 +A6XX_GRAS_LRZ_CNTL_DIR__MASK = 0x000000c0 +A6XX_GRAS_LRZ_CNTL_DIR__SHIFT = 6 +A6XX_GRAS_LRZ_CNTL_DIR_WRITE = 0x00000100 +A6XX_GRAS_LRZ_CNTL_DISABLE_ON_WRONG_DIR = 0x00000200 +A6XX_GRAS_LRZ_CNTL_Z_FUNC__MASK = 0x00003800 +A6XX_GRAS_LRZ_CNTL_Z_FUNC__SHIFT = 11 +REG_A6XX_GRAS_LRZ_PS_INPUT_CNTL = 0x00008101 +A6XX_GRAS_LRZ_PS_INPUT_CNTL_SAMPLEID = 0x00000001 +A6XX_GRAS_LRZ_PS_INPUT_CNTL_FRAGCOORDSAMPLEMODE__MASK = 0x00000006 +A6XX_GRAS_LRZ_PS_INPUT_CNTL_FRAGCOORDSAMPLEMODE__SHIFT = 1 +REG_A6XX_GRAS_LRZ_MRT_BUFFER_INFO_0 = 0x00008102 +A6XX_GRAS_LRZ_MRT_BUFFER_INFO_0_COLOR_FORMAT__MASK = 0x000000ff +A6XX_GRAS_LRZ_MRT_BUFFER_INFO_0_COLOR_FORMAT__SHIFT = 0 +REG_A6XX_GRAS_LRZ_BUFFER_BASE = 0x00008103 +REG_A6XX_GRAS_LRZ_BUFFER_PITCH = 0x00008105 +A6XX_GRAS_LRZ_BUFFER_PITCH_PITCH__MASK = 0x000000ff +A6XX_GRAS_LRZ_BUFFER_PITCH_PITCH__SHIFT = 0 +A6XX_GRAS_LRZ_BUFFER_PITCH_ARRAY_PITCH__MASK = 0x1ffffc00 +A6XX_GRAS_LRZ_BUFFER_PITCH_ARRAY_PITCH__SHIFT = 10 +REG_A6XX_GRAS_LRZ_FAST_CLEAR_BUFFER_BASE = 0x00008106 +REG_A6XX_GRAS_LRZ_PS_SAMPLEFREQ_CNTL = 0x00008109 +A6XX_GRAS_LRZ_PS_SAMPLEFREQ_CNTL_PER_SAMP_MODE = 0x00000001 +REG_A6XX_GRAS_LRZ_VIEW_INFO = 0x0000810a +A6XX_GRAS_LRZ_VIEW_INFO_BASE_LAYER__MASK = 0x000007ff +A6XX_GRAS_LRZ_VIEW_INFO_BASE_LAYER__SHIFT = 0 +A6XX_GRAS_LRZ_VIEW_INFO_LAYER_COUNT__MASK = 0x07ff0000 +A6XX_GRAS_LRZ_VIEW_INFO_LAYER_COUNT__SHIFT = 16 +A6XX_GRAS_LRZ_VIEW_INFO_BASE_MIP_LEVEL__MASK = 0xf0000000 +A6XX_GRAS_LRZ_VIEW_INFO_BASE_MIP_LEVEL__SHIFT = 28 +REG_A7XX_GRAS_LRZ_CNTL2 = 0x0000810b +A7XX_GRAS_LRZ_CNTL2_DISABLE_ON_WRONG_DIR = 0x00000001 +A7XX_GRAS_LRZ_CNTL2_FC_ENABLE = 0x00000002 +REG_A6XX_GRAS_UNKNOWN_8110 = 0x00008110 +REG_A7XX_GRAS_LRZ_DEPTH_CLEAR = 0x00008111 +A7XX_GRAS_LRZ_DEPTH_CLEAR__MASK = 0xffffffff +A7XX_GRAS_LRZ_DEPTH_CLEAR__SHIFT = 0 +REG_A7XX_GRAS_LRZ_DEPTH_BUFFER_INFO = 0x00008113 +A7XX_GRAS_LRZ_DEPTH_BUFFER_INFO_DEPTH_FORMAT__MASK = 0x00000007 +A7XX_GRAS_LRZ_DEPTH_BUFFER_INFO_DEPTH_FORMAT__SHIFT = 0 +A7XX_GRAS_LRZ_DEPTH_BUFFER_INFO_UNK3 = 0x00000008 +REG_A7XX_GRAS_UNKNOWN_8120 = 0x00008120 +REG_A7XX_GRAS_UNKNOWN_8121 = 0x00008121 +REG_A6XX_GRAS_A2D_BLT_CNTL = 0x00008400 +A6XX_GRAS_A2D_BLT_CNTL_ROTATE__MASK = 0x00000007 +A6XX_GRAS_A2D_BLT_CNTL_ROTATE__SHIFT = 0 +A6XX_GRAS_A2D_BLT_CNTL_OVERWRITEEN = 0x00000008 +A6XX_GRAS_A2D_BLT_CNTL_UNK4__MASK = 0x00000070 +A6XX_GRAS_A2D_BLT_CNTL_UNK4__SHIFT = 4 +A6XX_GRAS_A2D_BLT_CNTL_SOLID_COLOR = 0x00000080 +A6XX_GRAS_A2D_BLT_CNTL_COLOR_FORMAT__MASK = 0x0000ff00 +A6XX_GRAS_A2D_BLT_CNTL_COLOR_FORMAT__SHIFT = 8 +A6XX_GRAS_A2D_BLT_CNTL_SCISSOR = 0x00010000 +A6XX_GRAS_A2D_BLT_CNTL_UNK17__MASK = 0x00060000 +A6XX_GRAS_A2D_BLT_CNTL_UNK17__SHIFT = 17 +A6XX_GRAS_A2D_BLT_CNTL_D24S8 = 0x00080000 +A6XX_GRAS_A2D_BLT_CNTL_MASK__MASK = 0x00f00000 +A6XX_GRAS_A2D_BLT_CNTL_MASK__SHIFT = 20 +A6XX_GRAS_A2D_BLT_CNTL_IFMT__MASK = 0x07000000 +A6XX_GRAS_A2D_BLT_CNTL_IFMT__SHIFT = 24 +A6XX_GRAS_A2D_BLT_CNTL_UNK27 = 0x08000000 +A6XX_GRAS_A2D_BLT_CNTL_UNK28 = 0x10000000 +A6XX_GRAS_A2D_BLT_CNTL_RASTER_MODE__MASK = 0x20000000 +A6XX_GRAS_A2D_BLT_CNTL_RASTER_MODE__SHIFT = 29 +A6XX_GRAS_A2D_BLT_CNTL_COPY = 0x40000000 +REG_A6XX_GRAS_A2D_SRC_XMIN = 0x00008401 +A6XX_GRAS_A2D_SRC_XMIN__MASK = 0x01ffff00 +A6XX_GRAS_A2D_SRC_XMIN__SHIFT = 8 +REG_A6XX_GRAS_A2D_SRC_XMAX = 0x00008402 +A6XX_GRAS_A2D_SRC_XMAX__MASK = 0x01ffff00 +A6XX_GRAS_A2D_SRC_XMAX__SHIFT = 8 +REG_A6XX_GRAS_A2D_SRC_YMIN = 0x00008403 +A6XX_GRAS_A2D_SRC_YMIN__MASK = 0x01ffff00 +A6XX_GRAS_A2D_SRC_YMIN__SHIFT = 8 +REG_A6XX_GRAS_A2D_SRC_YMAX = 0x00008404 +A6XX_GRAS_A2D_SRC_YMAX__MASK = 0x01ffff00 +A6XX_GRAS_A2D_SRC_YMAX__SHIFT = 8 +REG_A6XX_GRAS_A2D_DEST_TL = 0x00008405 +A6XX_GRAS_A2D_DEST_TL_X__MASK = 0x00003fff +A6XX_GRAS_A2D_DEST_TL_X__SHIFT = 0 +A6XX_GRAS_A2D_DEST_TL_Y__MASK = 0x3fff0000 +A6XX_GRAS_A2D_DEST_TL_Y__SHIFT = 16 +REG_A6XX_GRAS_A2D_DEST_BR = 0x00008406 +A6XX_GRAS_A2D_DEST_BR_X__MASK = 0x00003fff +A6XX_GRAS_A2D_DEST_BR_X__SHIFT = 0 +A6XX_GRAS_A2D_DEST_BR_Y__MASK = 0x3fff0000 +A6XX_GRAS_A2D_DEST_BR_Y__SHIFT = 16 +REG_A6XX_GRAS_2D_UNKNOWN_8407 = 0x00008407 +REG_A6XX_GRAS_2D_UNKNOWN_8408 = 0x00008408 +REG_A6XX_GRAS_2D_UNKNOWN_8409 = 0x00008409 +REG_A6XX_GRAS_A2D_SCISSOR_TL = 0x0000840a +A6XX_GRAS_A2D_SCISSOR_TL_X__MASK = 0x00003fff +A6XX_GRAS_A2D_SCISSOR_TL_X__SHIFT = 0 +A6XX_GRAS_A2D_SCISSOR_TL_Y__MASK = 0x3fff0000 +A6XX_GRAS_A2D_SCISSOR_TL_Y__SHIFT = 16 +REG_A6XX_GRAS_A2D_SCISSOR_BR = 0x0000840b +A6XX_GRAS_A2D_SCISSOR_BR_X__MASK = 0x00003fff +A6XX_GRAS_A2D_SCISSOR_BR_X__SHIFT = 0 +A6XX_GRAS_A2D_SCISSOR_BR_Y__MASK = 0x3fff0000 +A6XX_GRAS_A2D_SCISSOR_BR_Y__SHIFT = 16 +REG_A6XX_GRAS_DBG_ECO_CNTL = 0x00008600 +A6XX_GRAS_DBG_ECO_CNTL_UNK7 = 0x00000080 +A6XX_GRAS_DBG_ECO_CNTL_LRZCACHELOCKDIS = 0x00000800 +REG_A6XX_GRAS_ADDR_MODE_CNTL = 0x00008601 +REG_A7XX_GRAS_NC_MODE_CNTL = 0x00008602 +REG_A6XX_GRAS_PERFCTR_TSE_SEL = lambda i0: (0x00008610 + 0x1*i0 ) # type: ignore +REG_A6XX_GRAS_PERFCTR_RAS_SEL = lambda i0: (0x00008614 + 0x1*i0 ) # type: ignore +REG_A6XX_GRAS_PERFCTR_LRZ_SEL = lambda i0: (0x00008618 + 0x1*i0 ) # type: ignore +REG_A6XX_RB_CNTL = 0x00008800 +A6XX_RB_CNTL_BINW__MASK = 0x0000003f +A6XX_RB_CNTL_BINW__SHIFT = 0 +A6XX_RB_CNTL_BINH__MASK = 0x00007f00 +A6XX_RB_CNTL_BINH__SHIFT = 8 +A6XX_RB_CNTL_RENDER_MODE__MASK = 0x001c0000 +A6XX_RB_CNTL_RENDER_MODE__SHIFT = 18 +A6XX_RB_CNTL_FORCE_LRZ_WRITE_DIS = 0x00200000 +A6XX_RB_CNTL_BUFFERS_LOCATION__MASK = 0x00c00000 +A6XX_RB_CNTL_BUFFERS_LOCATION__SHIFT = 22 +A6XX_RB_CNTL_LRZ_FEEDBACK_ZMODE_MASK__MASK = 0x07000000 +A6XX_RB_CNTL_LRZ_FEEDBACK_ZMODE_MASK__SHIFT = 24 +REG_A7XX_RB_CNTL = 0x00008800 +A7XX_RB_CNTL_BINW__MASK = 0x0000003f +A7XX_RB_CNTL_BINW__SHIFT = 0 +A7XX_RB_CNTL_BINH__MASK = 0x00007f00 +A7XX_RB_CNTL_BINH__SHIFT = 8 +A7XX_RB_CNTL_RENDER_MODE__MASK = 0x001c0000 +A7XX_RB_CNTL_RENDER_MODE__SHIFT = 18 +A7XX_RB_CNTL_FORCE_LRZ_WRITE_DIS = 0x00200000 +A7XX_RB_CNTL_LRZ_FEEDBACK_ZMODE_MASK__MASK = 0x07000000 +A7XX_RB_CNTL_LRZ_FEEDBACK_ZMODE_MASK__SHIFT = 24 +REG_A6XX_RB_RENDER_CNTL = 0x00008801 +A6XX_RB_RENDER_CNTL_CCUSINGLECACHELINESIZE__MASK = 0x00000038 +A6XX_RB_RENDER_CNTL_CCUSINGLECACHELINESIZE__SHIFT = 3 +A6XX_RB_RENDER_CNTL_EARLYVIZOUTEN = 0x00000040 +A6XX_RB_RENDER_CNTL_FS_DISABLE = 0x00000080 +A6XX_RB_RENDER_CNTL_UNK8__MASK = 0x00000700 +A6XX_RB_RENDER_CNTL_UNK8__SHIFT = 8 +A6XX_RB_RENDER_CNTL_RASTER_MODE__MASK = 0x00000100 +A6XX_RB_RENDER_CNTL_RASTER_MODE__SHIFT = 8 +A6XX_RB_RENDER_CNTL_RASTER_DIRECTION__MASK = 0x00000600 +A6XX_RB_RENDER_CNTL_RASTER_DIRECTION__SHIFT = 9 +A6XX_RB_RENDER_CNTL_CONSERVATIVERASEN = 0x00000800 +A6XX_RB_RENDER_CNTL_INNERCONSERVATIVERASEN = 0x00001000 +A6XX_RB_RENDER_CNTL_FLAG_DEPTH = 0x00004000 +A6XX_RB_RENDER_CNTL_FLAG_MRTS__MASK = 0x00ff0000 +A6XX_RB_RENDER_CNTL_FLAG_MRTS__SHIFT = 16 +REG_A7XX_RB_RENDER_CNTL = 0x00008801 +A7XX_RB_RENDER_CNTL_EARLYVIZOUTEN = 0x00000040 +A7XX_RB_RENDER_CNTL_FS_DISABLE = 0x00000080 +A7XX_RB_RENDER_CNTL_RASTER_MODE__MASK = 0x00000100 +A7XX_RB_RENDER_CNTL_RASTER_MODE__SHIFT = 8 +A7XX_RB_RENDER_CNTL_RASTER_DIRECTION__MASK = 0x00000600 +A7XX_RB_RENDER_CNTL_RASTER_DIRECTION__SHIFT = 9 +A7XX_RB_RENDER_CNTL_CONSERVATIVERASEN = 0x00000800 +A7XX_RB_RENDER_CNTL_INNERCONSERVATIVERASEN = 0x00001000 +REG_A7XX_GRAS_SU_RENDER_CNTL = 0x00008116 +A7XX_GRAS_SU_RENDER_CNTL_FS_DISABLE = 0x00000080 +REG_A6XX_RB_RAS_MSAA_CNTL = 0x00008802 +A6XX_RB_RAS_MSAA_CNTL_SAMPLES__MASK = 0x00000003 +A6XX_RB_RAS_MSAA_CNTL_SAMPLES__SHIFT = 0 +A6XX_RB_RAS_MSAA_CNTL_UNK2 = 0x00000004 +A6XX_RB_RAS_MSAA_CNTL_UNK3 = 0x00000008 +REG_A6XX_RB_DEST_MSAA_CNTL = 0x00008803 +A6XX_RB_DEST_MSAA_CNTL_SAMPLES__MASK = 0x00000003 +A6XX_RB_DEST_MSAA_CNTL_SAMPLES__SHIFT = 0 +A6XX_RB_DEST_MSAA_CNTL_MSAA_DISABLE = 0x00000004 +REG_A6XX_RB_MSAA_SAMPLE_POS_CNTL = 0x00008804 +A6XX_RB_MSAA_SAMPLE_POS_CNTL_UNK0 = 0x00000001 +A6XX_RB_MSAA_SAMPLE_POS_CNTL_LOCATION_ENABLE = 0x00000002 +REG_A6XX_RB_PROGRAMMABLE_MSAA_POS_0 = 0x00008805 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_X__MASK = 0x0000000f +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_X__SHIFT = 0 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_Y__MASK = 0x000000f0 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_Y__SHIFT = 4 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_X__MASK = 0x00000f00 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_X__SHIFT = 8 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_Y__MASK = 0x0000f000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_Y__SHIFT = 12 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_X__MASK = 0x000f0000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_X__SHIFT = 16 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_Y__MASK = 0x00f00000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_Y__SHIFT = 20 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_X__MASK = 0x0f000000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_X__SHIFT = 24 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_Y__MASK = 0xf0000000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_Y__SHIFT = 28 +REG_A6XX_RB_PROGRAMMABLE_MSAA_POS_1 = 0x00008806 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_X__MASK = 0x0000000f +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_X__SHIFT = 0 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_Y__MASK = 0x000000f0 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_Y__SHIFT = 4 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_X__MASK = 0x00000f00 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_X__SHIFT = 8 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_Y__MASK = 0x0000f000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_Y__SHIFT = 12 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_X__MASK = 0x000f0000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_X__SHIFT = 16 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_Y__MASK = 0x00f00000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_Y__SHIFT = 20 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_X__MASK = 0x0f000000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_X__SHIFT = 24 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_Y__MASK = 0xf0000000 +A6XX_RB_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_Y__SHIFT = 28 +REG_A6XX_RB_INTERP_CNTL = 0x00008809 +A6XX_RB_INTERP_CNTL_IJ_PERSP_PIXEL = 0x00000001 +A6XX_RB_INTERP_CNTL_IJ_PERSP_CENTROID = 0x00000002 +A6XX_RB_INTERP_CNTL_IJ_PERSP_SAMPLE = 0x00000004 +A6XX_RB_INTERP_CNTL_IJ_LINEAR_PIXEL = 0x00000008 +A6XX_RB_INTERP_CNTL_IJ_LINEAR_CENTROID = 0x00000010 +A6XX_RB_INTERP_CNTL_IJ_LINEAR_SAMPLE = 0x00000020 +A6XX_RB_INTERP_CNTL_COORD_MASK__MASK = 0x000003c0 +A6XX_RB_INTERP_CNTL_COORD_MASK__SHIFT = 6 +A6XX_RB_INTERP_CNTL_UNK10 = 0x00000400 +REG_A6XX_RB_PS_INPUT_CNTL = 0x0000880a +A6XX_RB_PS_INPUT_CNTL_SAMPLEMASK = 0x00000001 +A6XX_RB_PS_INPUT_CNTL_POSTDEPTHCOVERAGE = 0x00000002 +A6XX_RB_PS_INPUT_CNTL_FACENESS = 0x00000004 +A6XX_RB_PS_INPUT_CNTL_SAMPLEID = 0x00000008 +A6XX_RB_PS_INPUT_CNTL_FRAGCOORDSAMPLEMODE__MASK = 0x00000030 +A6XX_RB_PS_INPUT_CNTL_FRAGCOORDSAMPLEMODE__SHIFT = 4 +A6XX_RB_PS_INPUT_CNTL_CENTERRHW = 0x00000040 +A6XX_RB_PS_INPUT_CNTL_LINELENGTHEN = 0x00000080 +A6XX_RB_PS_INPUT_CNTL_FOVEATION = 0x00000100 +REG_A6XX_RB_PS_OUTPUT_CNTL = 0x0000880b +A6XX_RB_PS_OUTPUT_CNTL_DUAL_COLOR_IN_ENABLE = 0x00000001 +A6XX_RB_PS_OUTPUT_CNTL_FRAG_WRITES_Z = 0x00000002 +A6XX_RB_PS_OUTPUT_CNTL_FRAG_WRITES_SAMPMASK = 0x00000004 +A6XX_RB_PS_OUTPUT_CNTL_FRAG_WRITES_STENCILREF = 0x00000008 +REG_A6XX_RB_PS_MRT_CNTL = 0x0000880c +A6XX_RB_PS_MRT_CNTL_MRT__MASK = 0x0000000f +A6XX_RB_PS_MRT_CNTL_MRT__SHIFT = 0 +REG_A6XX_RB_PS_OUTPUT_MASK = 0x0000880d +A6XX_RB_PS_OUTPUT_MASK_RT0__MASK = 0x0000000f +A6XX_RB_PS_OUTPUT_MASK_RT0__SHIFT = 0 +A6XX_RB_PS_OUTPUT_MASK_RT1__MASK = 0x000000f0 +A6XX_RB_PS_OUTPUT_MASK_RT1__SHIFT = 4 +A6XX_RB_PS_OUTPUT_MASK_RT2__MASK = 0x00000f00 +A6XX_RB_PS_OUTPUT_MASK_RT2__SHIFT = 8 +A6XX_RB_PS_OUTPUT_MASK_RT3__MASK = 0x0000f000 +A6XX_RB_PS_OUTPUT_MASK_RT3__SHIFT = 12 +A6XX_RB_PS_OUTPUT_MASK_RT4__MASK = 0x000f0000 +A6XX_RB_PS_OUTPUT_MASK_RT4__SHIFT = 16 +A6XX_RB_PS_OUTPUT_MASK_RT5__MASK = 0x00f00000 +A6XX_RB_PS_OUTPUT_MASK_RT5__SHIFT = 20 +A6XX_RB_PS_OUTPUT_MASK_RT6__MASK = 0x0f000000 +A6XX_RB_PS_OUTPUT_MASK_RT6__SHIFT = 24 +A6XX_RB_PS_OUTPUT_MASK_RT7__MASK = 0xf0000000 +A6XX_RB_PS_OUTPUT_MASK_RT7__SHIFT = 28 +REG_A6XX_RB_DITHER_CNTL = 0x0000880e +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT0__MASK = 0x00000003 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT0__SHIFT = 0 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT1__MASK = 0x0000000c +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT1__SHIFT = 2 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT2__MASK = 0x00000030 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT2__SHIFT = 4 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT3__MASK = 0x000000c0 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT3__SHIFT = 6 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT4__MASK = 0x00000300 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT4__SHIFT = 8 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT5__MASK = 0x00000c00 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT5__SHIFT = 10 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT6__MASK = 0x00003000 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT6__SHIFT = 12 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT7__MASK = 0x0000c000 +A6XX_RB_DITHER_CNTL_DITHER_MODE_MRT7__SHIFT = 14 +REG_A6XX_RB_SRGB_CNTL = 0x0000880f +A6XX_RB_SRGB_CNTL_SRGB_MRT0 = 0x00000001 +A6XX_RB_SRGB_CNTL_SRGB_MRT1 = 0x00000002 +A6XX_RB_SRGB_CNTL_SRGB_MRT2 = 0x00000004 +A6XX_RB_SRGB_CNTL_SRGB_MRT3 = 0x00000008 +A6XX_RB_SRGB_CNTL_SRGB_MRT4 = 0x00000010 +A6XX_RB_SRGB_CNTL_SRGB_MRT5 = 0x00000020 +A6XX_RB_SRGB_CNTL_SRGB_MRT6 = 0x00000040 +A6XX_RB_SRGB_CNTL_SRGB_MRT7 = 0x00000080 +REG_A6XX_RB_PS_SAMPLEFREQ_CNTL = 0x00008810 +A6XX_RB_PS_SAMPLEFREQ_CNTL_PER_SAMP_MODE = 0x00000001 +REG_A6XX_RB_UNKNOWN_8811 = 0x00008811 +REG_A7XX_RB_UNKNOWN_8812 = 0x00008812 +REG_A6XX_RB_UNKNOWN_8818 = 0x00008818 +REG_A6XX_RB_UNKNOWN_8819 = 0x00008819 +REG_A6XX_RB_UNKNOWN_881A = 0x0000881a +REG_A6XX_RB_UNKNOWN_881B = 0x0000881b +REG_A6XX_RB_UNKNOWN_881C = 0x0000881c +REG_A6XX_RB_UNKNOWN_881D = 0x0000881d +REG_A6XX_RB_UNKNOWN_881E = 0x0000881e +REG_A6XX_RB_MRT = lambda i0: (0x00008820 + 0x8*i0 ) # type: ignore +A6XX_RB_MRT_CONTROL_BLEND = 0x00000001 +A6XX_RB_MRT_CONTROL_BLEND2 = 0x00000002 +A6XX_RB_MRT_CONTROL_ROP_ENABLE = 0x00000004 +A6XX_RB_MRT_CONTROL_ROP_CODE__MASK = 0x00000078 +A6XX_RB_MRT_CONTROL_ROP_CODE__SHIFT = 3 +A6XX_RB_MRT_CONTROL_COMPONENT_ENABLE__MASK = 0x00000780 +A6XX_RB_MRT_CONTROL_COMPONENT_ENABLE__SHIFT = 7 +A6XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR__MASK = 0x0000001f +A6XX_RB_MRT_BLEND_CONTROL_RGB_SRC_FACTOR__SHIFT = 0 +A6XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE__MASK = 0x000000e0 +A6XX_RB_MRT_BLEND_CONTROL_RGB_BLEND_OPCODE__SHIFT = 5 +A6XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR__MASK = 0x00001f00 +A6XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR__SHIFT = 8 +A6XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR__MASK = 0x001f0000 +A6XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR__SHIFT = 16 +A6XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE__MASK = 0x00e00000 +A6XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE__SHIFT = 21 +A6XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR__MASK = 0x1f000000 +A6XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR__SHIFT = 24 +A6XX_RB_MRT_BUF_INFO_COLOR_FORMAT__MASK = 0x000000ff +A6XX_RB_MRT_BUF_INFO_COLOR_FORMAT__SHIFT = 0 +A6XX_RB_MRT_BUF_INFO_COLOR_TILE_MODE__MASK = 0x00000300 +A6XX_RB_MRT_BUF_INFO_COLOR_TILE_MODE__SHIFT = 8 +A6XX_RB_MRT_BUF_INFO_UNK10 = 0x00000400 +A6XX_RB_MRT_BUF_INFO_COLOR_SWAP__MASK = 0x00006000 +A6XX_RB_MRT_BUF_INFO_COLOR_SWAP__SHIFT = 13 +A7XX_RB_MRT_BUF_INFO_COLOR_FORMAT__MASK = 0x000000ff +A7XX_RB_MRT_BUF_INFO_COLOR_FORMAT__SHIFT = 0 +A7XX_RB_MRT_BUF_INFO_COLOR_TILE_MODE__MASK = 0x00000300 +A7XX_RB_MRT_BUF_INFO_COLOR_TILE_MODE__SHIFT = 8 +A7XX_RB_MRT_BUF_INFO_UNK10 = 0x00000400 +A7XX_RB_MRT_BUF_INFO_LOSSLESSCOMPEN = 0x00000800 +A7XX_RB_MRT_BUF_INFO_COLOR_SWAP__MASK = 0x00006000 +A7XX_RB_MRT_BUF_INFO_COLOR_SWAP__SHIFT = 13 +A7XX_RB_MRT_BUF_INFO_MUTABLEEN = 0x00010000 +A6XX_RB_MRT_PITCH__MASK = 0xffffffff +A6XX_RB_MRT_PITCH__SHIFT = 0 +A6XX_RB_MRT_ARRAY_PITCH__MASK = 0xffffffff +A6XX_RB_MRT_ARRAY_PITCH__SHIFT = 0 +REG_A6XX_RB_BLEND_CONSTANT_RED_FP32 = 0x00008860 +A6XX_RB_BLEND_CONSTANT_RED_FP32__MASK = 0xffffffff +A6XX_RB_BLEND_CONSTANT_RED_FP32__SHIFT = 0 +REG_A6XX_RB_BLEND_CONSTANT_GREEN_FP32 = 0x00008861 +A6XX_RB_BLEND_CONSTANT_GREEN_FP32__MASK = 0xffffffff +A6XX_RB_BLEND_CONSTANT_GREEN_FP32__SHIFT = 0 +REG_A6XX_RB_BLEND_CONSTANT_BLUE_FP32 = 0x00008862 +A6XX_RB_BLEND_CONSTANT_BLUE_FP32__MASK = 0xffffffff +A6XX_RB_BLEND_CONSTANT_BLUE_FP32__SHIFT = 0 +REG_A6XX_RB_BLEND_CONSTANT_ALPHA_FP32 = 0x00008863 +A6XX_RB_BLEND_CONSTANT_ALPHA_FP32__MASK = 0xffffffff +A6XX_RB_BLEND_CONSTANT_ALPHA_FP32__SHIFT = 0 +REG_A6XX_RB_ALPHA_TEST_CNTL = 0x00008864 +A6XX_RB_ALPHA_TEST_CNTL_ALPHA_REF__MASK = 0x000000ff +A6XX_RB_ALPHA_TEST_CNTL_ALPHA_REF__SHIFT = 0 +A6XX_RB_ALPHA_TEST_CNTL_ALPHA_TEST = 0x00000100 +A6XX_RB_ALPHA_TEST_CNTL_ALPHA_TEST_FUNC__MASK = 0x00000e00 +A6XX_RB_ALPHA_TEST_CNTL_ALPHA_TEST_FUNC__SHIFT = 9 +REG_A6XX_RB_BLEND_CNTL = 0x00008865 +A6XX_RB_BLEND_CNTL_BLEND_READS_DEST__MASK = 0x000000ff +A6XX_RB_BLEND_CNTL_BLEND_READS_DEST__SHIFT = 0 +A6XX_RB_BLEND_CNTL_INDEPENDENT_BLEND = 0x00000100 +A6XX_RB_BLEND_CNTL_DUAL_COLOR_IN_ENABLE = 0x00000200 +A6XX_RB_BLEND_CNTL_ALPHA_TO_COVERAGE = 0x00000400 +A6XX_RB_BLEND_CNTL_ALPHA_TO_ONE = 0x00000800 +A6XX_RB_BLEND_CNTL_SAMPLE_MASK__MASK = 0xffff0000 +A6XX_RB_BLEND_CNTL_SAMPLE_MASK__SHIFT = 16 +REG_A6XX_RB_DEPTH_PLANE_CNTL = 0x00008870 +A6XX_RB_DEPTH_PLANE_CNTL_Z_MODE__MASK = 0x00000003 +A6XX_RB_DEPTH_PLANE_CNTL_Z_MODE__SHIFT = 0 +REG_A6XX_RB_DEPTH_CNTL = 0x00008871 +A6XX_RB_DEPTH_CNTL_Z_TEST_ENABLE = 0x00000001 +A6XX_RB_DEPTH_CNTL_Z_WRITE_ENABLE = 0x00000002 +A6XX_RB_DEPTH_CNTL_ZFUNC__MASK = 0x0000001c +A6XX_RB_DEPTH_CNTL_ZFUNC__SHIFT = 2 +A6XX_RB_DEPTH_CNTL_Z_CLAMP_ENABLE = 0x00000020 +A6XX_RB_DEPTH_CNTL_Z_READ_ENABLE = 0x00000040 +A6XX_RB_DEPTH_CNTL_Z_BOUNDS_ENABLE = 0x00000080 +REG_A6XX_GRAS_SU_DEPTH_CNTL = 0x00008114 +A6XX_GRAS_SU_DEPTH_CNTL_Z_TEST_ENABLE = 0x00000001 +REG_A6XX_RB_DEPTH_BUFFER_INFO = 0x00008872 +A6XX_RB_DEPTH_BUFFER_INFO_DEPTH_FORMAT__MASK = 0x00000007 +A6XX_RB_DEPTH_BUFFER_INFO_DEPTH_FORMAT__SHIFT = 0 +A6XX_RB_DEPTH_BUFFER_INFO_UNK3__MASK = 0x00000018 +A6XX_RB_DEPTH_BUFFER_INFO_UNK3__SHIFT = 3 +REG_A7XX_RB_DEPTH_BUFFER_INFO = 0x00008872 +A7XX_RB_DEPTH_BUFFER_INFO_DEPTH_FORMAT__MASK = 0x00000007 +A7XX_RB_DEPTH_BUFFER_INFO_DEPTH_FORMAT__SHIFT = 0 +A7XX_RB_DEPTH_BUFFER_INFO_UNK3__MASK = 0x00000018 +A7XX_RB_DEPTH_BUFFER_INFO_UNK3__SHIFT = 3 +A7XX_RB_DEPTH_BUFFER_INFO_TILEMODE__MASK = 0x00000060 +A7XX_RB_DEPTH_BUFFER_INFO_TILEMODE__SHIFT = 5 +A7XX_RB_DEPTH_BUFFER_INFO_LOSSLESSCOMPEN = 0x00000080 +REG_A6XX_RB_DEPTH_BUFFER_PITCH = 0x00008873 +A6XX_RB_DEPTH_BUFFER_PITCH__MASK = 0x00003fff +A6XX_RB_DEPTH_BUFFER_PITCH__SHIFT = 0 +REG_A6XX_RB_DEPTH_BUFFER_ARRAY_PITCH = 0x00008874 +A6XX_RB_DEPTH_BUFFER_ARRAY_PITCH__MASK = 0x0fffffff +A6XX_RB_DEPTH_BUFFER_ARRAY_PITCH__SHIFT = 0 +REG_A6XX_RB_DEPTH_BUFFER_BASE = 0x00008875 +REG_A6XX_RB_DEPTH_GMEM_BASE = 0x00008877 +REG_A6XX_RB_DEPTH_BOUND_MIN = 0x00008878 +A6XX_RB_DEPTH_BOUND_MIN__MASK = 0xffffffff +A6XX_RB_DEPTH_BOUND_MIN__SHIFT = 0 +REG_A6XX_RB_DEPTH_BOUND_MAX = 0x00008879 +A6XX_RB_DEPTH_BOUND_MAX__MASK = 0xffffffff +A6XX_RB_DEPTH_BOUND_MAX__SHIFT = 0 +REG_A6XX_RB_STENCIL_CNTL = 0x00008880 +A6XX_RB_STENCIL_CNTL_STENCIL_ENABLE = 0x00000001 +A6XX_RB_STENCIL_CNTL_STENCIL_ENABLE_BF = 0x00000002 +A6XX_RB_STENCIL_CNTL_STENCIL_READ = 0x00000004 +A6XX_RB_STENCIL_CNTL_FUNC__MASK = 0x00000700 +A6XX_RB_STENCIL_CNTL_FUNC__SHIFT = 8 +A6XX_RB_STENCIL_CNTL_FAIL__MASK = 0x00003800 +A6XX_RB_STENCIL_CNTL_FAIL__SHIFT = 11 +A6XX_RB_STENCIL_CNTL_ZPASS__MASK = 0x0001c000 +A6XX_RB_STENCIL_CNTL_ZPASS__SHIFT = 14 +A6XX_RB_STENCIL_CNTL_ZFAIL__MASK = 0x000e0000 +A6XX_RB_STENCIL_CNTL_ZFAIL__SHIFT = 17 +A6XX_RB_STENCIL_CNTL_FUNC_BF__MASK = 0x00700000 +A6XX_RB_STENCIL_CNTL_FUNC_BF__SHIFT = 20 +A6XX_RB_STENCIL_CNTL_FAIL_BF__MASK = 0x03800000 +A6XX_RB_STENCIL_CNTL_FAIL_BF__SHIFT = 23 +A6XX_RB_STENCIL_CNTL_ZPASS_BF__MASK = 0x1c000000 +A6XX_RB_STENCIL_CNTL_ZPASS_BF__SHIFT = 26 +A6XX_RB_STENCIL_CNTL_ZFAIL_BF__MASK = 0xe0000000 +A6XX_RB_STENCIL_CNTL_ZFAIL_BF__SHIFT = 29 +REG_A6XX_GRAS_SU_STENCIL_CNTL = 0x00008115 +A6XX_GRAS_SU_STENCIL_CNTL_STENCIL_ENABLE = 0x00000001 +REG_A6XX_RB_STENCIL_BUFFER_INFO = 0x00008881 +A6XX_RB_STENCIL_BUFFER_INFO_SEPARATE_STENCIL = 0x00000001 +A6XX_RB_STENCIL_BUFFER_INFO_UNK1 = 0x00000002 +REG_A7XX_RB_STENCIL_BUFFER_INFO = 0x00008881 +A7XX_RB_STENCIL_BUFFER_INFO_SEPARATE_STENCIL = 0x00000001 +A7XX_RB_STENCIL_BUFFER_INFO_UNK1 = 0x00000002 +A7XX_RB_STENCIL_BUFFER_INFO_TILEMODE__MASK = 0x0000000c +A7XX_RB_STENCIL_BUFFER_INFO_TILEMODE__SHIFT = 2 +REG_A6XX_RB_STENCIL_BUFFER_PITCH = 0x00008882 +A6XX_RB_STENCIL_BUFFER_PITCH__MASK = 0x00000fff +A6XX_RB_STENCIL_BUFFER_PITCH__SHIFT = 0 +REG_A6XX_RB_STENCIL_BUFFER_ARRAY_PITCH = 0x00008883 +A6XX_RB_STENCIL_BUFFER_ARRAY_PITCH__MASK = 0x00ffffff +A6XX_RB_STENCIL_BUFFER_ARRAY_PITCH__SHIFT = 0 +REG_A6XX_RB_STENCIL_BUFFER_BASE = 0x00008884 +REG_A6XX_RB_STENCIL_GMEM_BASE = 0x00008886 +REG_A6XX_RB_STENCIL_REF_CNTL = 0x00008887 +A6XX_RB_STENCIL_REF_CNTL_REF__MASK = 0x000000ff +A6XX_RB_STENCIL_REF_CNTL_REF__SHIFT = 0 +A6XX_RB_STENCIL_REF_CNTL_BFREF__MASK = 0x0000ff00 +A6XX_RB_STENCIL_REF_CNTL_BFREF__SHIFT = 8 +REG_A6XX_RB_STENCIL_MASK = 0x00008888 +A6XX_RB_STENCIL_MASK_MASK__MASK = 0x000000ff +A6XX_RB_STENCIL_MASK_MASK__SHIFT = 0 +A6XX_RB_STENCIL_MASK_BFMASK__MASK = 0x0000ff00 +A6XX_RB_STENCIL_MASK_BFMASK__SHIFT = 8 +REG_A6XX_RB_STENCIL_WRITE_MASK = 0x00008889 +A6XX_RB_STENCIL_WRITE_MASK_WRMASK__MASK = 0x000000ff +A6XX_RB_STENCIL_WRITE_MASK_WRMASK__SHIFT = 0 +A6XX_RB_STENCIL_WRITE_MASK_BFWRMASK__MASK = 0x0000ff00 +A6XX_RB_STENCIL_WRITE_MASK_BFWRMASK__SHIFT = 8 +REG_A6XX_RB_WINDOW_OFFSET = 0x00008890 +A6XX_RB_WINDOW_OFFSET_X__MASK = 0x00003fff +A6XX_RB_WINDOW_OFFSET_X__SHIFT = 0 +A6XX_RB_WINDOW_OFFSET_Y__MASK = 0x3fff0000 +A6XX_RB_WINDOW_OFFSET_Y__SHIFT = 16 +REG_A6XX_RB_SAMPLE_COUNTER_CNTL = 0x00008891 +A6XX_RB_SAMPLE_COUNTER_CNTL_DISABLE = 0x00000001 +A6XX_RB_SAMPLE_COUNTER_CNTL_COPY = 0x00000002 +REG_A6XX_RB_LRZ_CNTL = 0x00008898 +A6XX_RB_LRZ_CNTL_ENABLE = 0x00000001 +REG_A7XX_RB_UNKNOWN_8899 = 0x00008899 +REG_A6XX_RB_VIEWPORT_ZCLAMP_MIN = 0x000088c0 +A6XX_RB_VIEWPORT_ZCLAMP_MIN__MASK = 0xffffffff +A6XX_RB_VIEWPORT_ZCLAMP_MIN__SHIFT = 0 +REG_A6XX_RB_VIEWPORT_ZCLAMP_MAX = 0x000088c1 +A6XX_RB_VIEWPORT_ZCLAMP_MAX__MASK = 0xffffffff +A6XX_RB_VIEWPORT_ZCLAMP_MAX__SHIFT = 0 +REG_A6XX_RB_RESOLVE_CNTL_0 = 0x000088d0 +A6XX_RB_RESOLVE_CNTL_0_UNK0__MASK = 0x00001fff +A6XX_RB_RESOLVE_CNTL_0_UNK0__SHIFT = 0 +A6XX_RB_RESOLVE_CNTL_0_UNK16__MASK = 0x07ff0000 +A6XX_RB_RESOLVE_CNTL_0_UNK16__SHIFT = 16 +REG_A6XX_RB_RESOLVE_CNTL_1 = 0x000088d1 +A6XX_RB_RESOLVE_CNTL_1_X__MASK = 0x00003fff +A6XX_RB_RESOLVE_CNTL_1_X__SHIFT = 0 +A6XX_RB_RESOLVE_CNTL_1_Y__MASK = 0x3fff0000 +A6XX_RB_RESOLVE_CNTL_1_Y__SHIFT = 16 +REG_A6XX_RB_RESOLVE_CNTL_2 = 0x000088d2 +A6XX_RB_RESOLVE_CNTL_2_X__MASK = 0x00003fff +A6XX_RB_RESOLVE_CNTL_2_X__SHIFT = 0 +A6XX_RB_RESOLVE_CNTL_2_Y__MASK = 0x3fff0000 +A6XX_RB_RESOLVE_CNTL_2_Y__SHIFT = 16 +REG_A6XX_RB_RESOLVE_CNTL_3 = 0x000088d3 +A6XX_RB_RESOLVE_CNTL_3_BINW__MASK = 0x0000003f +A6XX_RB_RESOLVE_CNTL_3_BINW__SHIFT = 0 +A6XX_RB_RESOLVE_CNTL_3_BINH__MASK = 0x00007f00 +A6XX_RB_RESOLVE_CNTL_3_BINH__SHIFT = 8 +REG_A6XX_RB_RESOLVE_WINDOW_OFFSET = 0x000088d4 +A6XX_RB_RESOLVE_WINDOW_OFFSET_X__MASK = 0x00003fff +A6XX_RB_RESOLVE_WINDOW_OFFSET_X__SHIFT = 0 +A6XX_RB_RESOLVE_WINDOW_OFFSET_Y__MASK = 0x3fff0000 +A6XX_RB_RESOLVE_WINDOW_OFFSET_Y__SHIFT = 16 +REG_A6XX_RB_RESOLVE_GMEM_BUFFER_INFO = 0x000088d5 +A6XX_RB_RESOLVE_GMEM_BUFFER_INFO_SAMPLES__MASK = 0x00000018 +A6XX_RB_RESOLVE_GMEM_BUFFER_INFO_SAMPLES__SHIFT = 3 +REG_A6XX_RB_RESOLVE_GMEM_BUFFER_BASE = 0x000088d6 +REG_A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO = 0x000088d7 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_TILE_MODE__MASK = 0x00000003 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_TILE_MODE__SHIFT = 0 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_FLAGS = 0x00000004 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_SAMPLES__MASK = 0x00000018 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_SAMPLES__SHIFT = 3 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_COLOR_SWAP__MASK = 0x00000060 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_COLOR_SWAP__SHIFT = 5 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_COLOR_FORMAT__MASK = 0x00007f80 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_COLOR_FORMAT__SHIFT = 7 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_UNK15 = 0x00008000 +A6XX_RB_RESOLVE_SYSTEM_BUFFER_INFO_MUTABLEEN = 0x00010000 +REG_A6XX_RB_RESOLVE_SYSTEM_BUFFER_BASE = 0x000088d8 +REG_A6XX_RB_RESOLVE_SYSTEM_BUFFER_PITCH = 0x000088da +A6XX_RB_RESOLVE_SYSTEM_BUFFER_PITCH__MASK = 0x0000ffff +A6XX_RB_RESOLVE_SYSTEM_BUFFER_PITCH__SHIFT = 0 +REG_A6XX_RB_RESOLVE_SYSTEM_BUFFER_ARRAY_PITCH = 0x000088db +A6XX_RB_RESOLVE_SYSTEM_BUFFER_ARRAY_PITCH__MASK = 0x1fffffff +A6XX_RB_RESOLVE_SYSTEM_BUFFER_ARRAY_PITCH__SHIFT = 0 +REG_A6XX_RB_RESOLVE_SYSTEM_FLAG_BUFFER_BASE = 0x000088dc +REG_A6XX_RB_RESOLVE_SYSTEM_FLAG_BUFFER_PITCH = 0x000088de +A6XX_RB_RESOLVE_SYSTEM_FLAG_BUFFER_PITCH_PITCH__MASK = 0x000007ff +A6XX_RB_RESOLVE_SYSTEM_FLAG_BUFFER_PITCH_PITCH__SHIFT = 0 +A6XX_RB_RESOLVE_SYSTEM_FLAG_BUFFER_PITCH_ARRAY_PITCH__MASK = 0x0ffff800 +A6XX_RB_RESOLVE_SYSTEM_FLAG_BUFFER_PITCH_ARRAY_PITCH__SHIFT = 11 +REG_A6XX_RB_RESOLVE_CLEAR_COLOR_DW0 = 0x000088df +REG_A6XX_RB_RESOLVE_CLEAR_COLOR_DW1 = 0x000088e0 +REG_A6XX_RB_RESOLVE_CLEAR_COLOR_DW2 = 0x000088e1 +REG_A6XX_RB_RESOLVE_CLEAR_COLOR_DW3 = 0x000088e2 +REG_A6XX_RB_RESOLVE_OPERATION = 0x000088e3 +A6XX_RB_RESOLVE_OPERATION_TYPE__MASK = 0x00000003 +A6XX_RB_RESOLVE_OPERATION_TYPE__SHIFT = 0 +A6XX_RB_RESOLVE_OPERATION_SAMPLE_0 = 0x00000004 +A6XX_RB_RESOLVE_OPERATION_DEPTH = 0x00000008 +A6XX_RB_RESOLVE_OPERATION_CLEAR_MASK__MASK = 0x000000f0 +A6XX_RB_RESOLVE_OPERATION_CLEAR_MASK__SHIFT = 4 +A6XX_RB_RESOLVE_OPERATION_LAST__MASK = 0x00000300 +A6XX_RB_RESOLVE_OPERATION_LAST__SHIFT = 8 +A6XX_RB_RESOLVE_OPERATION_BUFFER_ID__MASK = 0x0000f000 +A6XX_RB_RESOLVE_OPERATION_BUFFER_ID__SHIFT = 12 +REG_A7XX_RB_CLEAR_TARGET = 0x000088e4 +A7XX_RB_CLEAR_TARGET_CLEAR_MODE__MASK = 0x00000001 +A7XX_RB_CLEAR_TARGET_CLEAR_MODE__SHIFT = 0 +REG_A7XX_RB_CCU_CACHE_CNTL = 0x000088e5 +A7XX_RB_CCU_CACHE_CNTL_DEPTH_OFFSET_HI__MASK = 0x00000001 +A7XX_RB_CCU_CACHE_CNTL_DEPTH_OFFSET_HI__SHIFT = 0 +A7XX_RB_CCU_CACHE_CNTL_COLOR_OFFSET_HI__MASK = 0x00000004 +A7XX_RB_CCU_CACHE_CNTL_COLOR_OFFSET_HI__SHIFT = 2 +A7XX_RB_CCU_CACHE_CNTL_DEPTH_CACHE_SIZE__MASK = 0x00000c00 +A7XX_RB_CCU_CACHE_CNTL_DEPTH_CACHE_SIZE__SHIFT = 10 +A7XX_RB_CCU_CACHE_CNTL_DEPTH_OFFSET__MASK = 0x001ff000 +A7XX_RB_CCU_CACHE_CNTL_DEPTH_OFFSET__SHIFT = 12 +A7XX_RB_CCU_CACHE_CNTL_COLOR_CACHE_SIZE__MASK = 0x00600000 +A7XX_RB_CCU_CACHE_CNTL_COLOR_CACHE_SIZE__SHIFT = 21 +A7XX_RB_CCU_CACHE_CNTL_COLOR_OFFSET__MASK = 0xff800000 +A7XX_RB_CCU_CACHE_CNTL_COLOR_OFFSET__SHIFT = 23 +REG_A6XX_RB_UNKNOWN_88F0 = 0x000088f0 +REG_A6XX_RB_UNK_FLAG_BUFFER_BASE = 0x000088f1 +REG_A6XX_RB_UNK_FLAG_BUFFER_PITCH = 0x000088f3 +A6XX_RB_UNK_FLAG_BUFFER_PITCH_PITCH__MASK = 0x000007ff +A6XX_RB_UNK_FLAG_BUFFER_PITCH_PITCH__SHIFT = 0 +A6XX_RB_UNK_FLAG_BUFFER_PITCH_ARRAY_PITCH__MASK = 0x00fff800 +A6XX_RB_UNK_FLAG_BUFFER_PITCH_ARRAY_PITCH__SHIFT = 11 +REG_A6XX_RB_VRS_CONFIG = 0x000088f4 +A6XX_RB_VRS_CONFIG_UNK2 = 0x00000004 +A6XX_RB_VRS_CONFIG_PIPELINE_FSR_ENABLE = 0x00000010 +A6XX_RB_VRS_CONFIG_ATTACHMENT_FSR_ENABLE = 0x00000020 +A6XX_RB_VRS_CONFIG_PRIMITIVE_FSR_ENABLE = 0x00040000 +REG_A7XX_RB_UNKNOWN_88F5 = 0x000088f5 +REG_A6XX_RB_DEPTH_FLAG_BUFFER_BASE = 0x00008900 +REG_A6XX_RB_DEPTH_FLAG_BUFFER_PITCH = 0x00008902 +A6XX_RB_DEPTH_FLAG_BUFFER_PITCH_PITCH__MASK = 0x0000007f +A6XX_RB_DEPTH_FLAG_BUFFER_PITCH_PITCH__SHIFT = 0 +A6XX_RB_DEPTH_FLAG_BUFFER_PITCH_UNK8__MASK = 0x00000700 +A6XX_RB_DEPTH_FLAG_BUFFER_PITCH_UNK8__SHIFT = 8 +A6XX_RB_DEPTH_FLAG_BUFFER_PITCH_ARRAY_PITCH__MASK = 0x0ffff800 +A6XX_RB_DEPTH_FLAG_BUFFER_PITCH_ARRAY_PITCH__SHIFT = 11 +REG_A6XX_RB_COLOR_FLAG_BUFFER = lambda i0: (0x00008903 + 0x3*i0 ) # type: ignore +A6XX_RB_COLOR_FLAG_BUFFER_PITCH_PITCH__MASK = 0x000007ff +A6XX_RB_COLOR_FLAG_BUFFER_PITCH_PITCH__SHIFT = 0 +A6XX_RB_COLOR_FLAG_BUFFER_PITCH_ARRAY_PITCH__MASK = 0x1ffff800 +A6XX_RB_COLOR_FLAG_BUFFER_PITCH_ARRAY_PITCH__SHIFT = 11 +REG_A6XX_RB_SAMPLE_COUNTER_BASE = 0x00008927 +REG_A6XX_RB_UNKNOWN_8A00 = 0x00008a00 +REG_A6XX_RB_UNKNOWN_8A10 = 0x00008a10 +REG_A6XX_RB_UNKNOWN_8A20 = 0x00008a20 +REG_A6XX_RB_UNKNOWN_8A30 = 0x00008a30 +REG_A6XX_RB_A2D_BLT_CNTL = 0x00008c00 +A6XX_RB_A2D_BLT_CNTL_ROTATE__MASK = 0x00000007 +A6XX_RB_A2D_BLT_CNTL_ROTATE__SHIFT = 0 +A6XX_RB_A2D_BLT_CNTL_OVERWRITEEN = 0x00000008 +A6XX_RB_A2D_BLT_CNTL_UNK4__MASK = 0x00000070 +A6XX_RB_A2D_BLT_CNTL_UNK4__SHIFT = 4 +A6XX_RB_A2D_BLT_CNTL_SOLID_COLOR = 0x00000080 +A6XX_RB_A2D_BLT_CNTL_COLOR_FORMAT__MASK = 0x0000ff00 +A6XX_RB_A2D_BLT_CNTL_COLOR_FORMAT__SHIFT = 8 +A6XX_RB_A2D_BLT_CNTL_SCISSOR = 0x00010000 +A6XX_RB_A2D_BLT_CNTL_UNK17__MASK = 0x00060000 +A6XX_RB_A2D_BLT_CNTL_UNK17__SHIFT = 17 +A6XX_RB_A2D_BLT_CNTL_D24S8 = 0x00080000 +A6XX_RB_A2D_BLT_CNTL_MASK__MASK = 0x00f00000 +A6XX_RB_A2D_BLT_CNTL_MASK__SHIFT = 20 +A6XX_RB_A2D_BLT_CNTL_IFMT__MASK = 0x07000000 +A6XX_RB_A2D_BLT_CNTL_IFMT__SHIFT = 24 +A6XX_RB_A2D_BLT_CNTL_UNK27 = 0x08000000 +A6XX_RB_A2D_BLT_CNTL_UNK28 = 0x10000000 +A6XX_RB_A2D_BLT_CNTL_RASTER_MODE__MASK = 0x20000000 +A6XX_RB_A2D_BLT_CNTL_RASTER_MODE__SHIFT = 29 +A6XX_RB_A2D_BLT_CNTL_COPY = 0x40000000 +REG_A6XX_RB_A2D_PIXEL_CNTL = 0x00008c01 +REG_A6XX_RB_A2D_DEST_BUFFER_INFO = 0x00008c17 +A6XX_RB_A2D_DEST_BUFFER_INFO_COLOR_FORMAT__MASK = 0x000000ff +A6XX_RB_A2D_DEST_BUFFER_INFO_COLOR_FORMAT__SHIFT = 0 +A6XX_RB_A2D_DEST_BUFFER_INFO_TILE_MODE__MASK = 0x00000300 +A6XX_RB_A2D_DEST_BUFFER_INFO_TILE_MODE__SHIFT = 8 +A6XX_RB_A2D_DEST_BUFFER_INFO_COLOR_SWAP__MASK = 0x00000c00 +A6XX_RB_A2D_DEST_BUFFER_INFO_COLOR_SWAP__SHIFT = 10 +A6XX_RB_A2D_DEST_BUFFER_INFO_FLAGS = 0x00001000 +A6XX_RB_A2D_DEST_BUFFER_INFO_SRGB = 0x00002000 +A6XX_RB_A2D_DEST_BUFFER_INFO_SAMPLES__MASK = 0x0000c000 +A6XX_RB_A2D_DEST_BUFFER_INFO_SAMPLES__SHIFT = 14 +A6XX_RB_A2D_DEST_BUFFER_INFO_MUTABLEEN = 0x00020000 +REG_A6XX_RB_A2D_DEST_BUFFER_BASE = 0x00008c18 +REG_A6XX_RB_A2D_DEST_BUFFER_PITCH = 0x00008c1a +A6XX_RB_A2D_DEST_BUFFER_PITCH__MASK = 0x0000ffff +A6XX_RB_A2D_DEST_BUFFER_PITCH__SHIFT = 0 +REG_A6XX_RB_A2D_DEST_BUFFER_BASE_1 = 0x00008c1b +REG_A6XX_RB_A2D_DEST_BUFFER_PITCH_1 = 0x00008c1d +A6XX_RB_A2D_DEST_BUFFER_PITCH_1__MASK = 0x0000ffff +A6XX_RB_A2D_DEST_BUFFER_PITCH_1__SHIFT = 0 +REG_A6XX_RB_A2D_DEST_BUFFER_BASE_2 = 0x00008c1e +REG_A6XX_RB_A2D_DEST_FLAG_BUFFER_BASE = 0x00008c20 +REG_A6XX_RB_A2D_DEST_FLAG_BUFFER_PITCH = 0x00008c22 +A6XX_RB_A2D_DEST_FLAG_BUFFER_PITCH__MASK = 0x000000ff +A6XX_RB_A2D_DEST_FLAG_BUFFER_PITCH__SHIFT = 0 +REG_A6XX_RB_A2D_DEST_FLAG_BUFFER_BASE_1 = 0x00008c23 +REG_A6XX_RB_A2D_DEST_FLAG_BUFFER_PITCH_1 = 0x00008c25 +A6XX_RB_A2D_DEST_FLAG_BUFFER_PITCH_1__MASK = 0x000000ff +A6XX_RB_A2D_DEST_FLAG_BUFFER_PITCH_1__SHIFT = 0 +REG_A6XX_RB_A2D_CLEAR_COLOR_DW0 = 0x00008c2c +REG_A6XX_RB_A2D_CLEAR_COLOR_DW1 = 0x00008c2d +REG_A6XX_RB_A2D_CLEAR_COLOR_DW2 = 0x00008c2e +REG_A6XX_RB_A2D_CLEAR_COLOR_DW3 = 0x00008c2f +REG_A7XX_RB_UNKNOWN_8C34 = 0x00008c34 +REG_A6XX_RB_UNKNOWN_8E01 = 0x00008e01 +REG_A6XX_RB_DBG_ECO_CNTL = 0x00008e04 +REG_A6XX_RB_ADDR_MODE_CNTL = 0x00008e05 +REG_A7XX_RB_CCU_DBG_ECO_CNTL = 0x00008e06 +REG_A6XX_RB_CCU_CNTL = 0x00008e07 +A6XX_RB_CCU_CNTL_GMEM_FAST_CLEAR_DISABLE = 0x00000001 +A6XX_RB_CCU_CNTL_CONCURRENT_RESOLVE = 0x00000004 +A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__MASK = 0x00000080 +A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__SHIFT = 7 +A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__MASK = 0x00000200 +A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__SHIFT = 9 +A6XX_RB_CCU_CNTL_DEPTH_CACHE_SIZE__MASK = 0x00000c00 +A6XX_RB_CCU_CNTL_DEPTH_CACHE_SIZE__SHIFT = 10 +A6XX_RB_CCU_CNTL_DEPTH_OFFSET__MASK = 0x001ff000 +A6XX_RB_CCU_CNTL_DEPTH_OFFSET__SHIFT = 12 +A6XX_RB_CCU_CNTL_COLOR_CACHE_SIZE__MASK = 0x00600000 +A6XX_RB_CCU_CNTL_COLOR_CACHE_SIZE__SHIFT = 21 +A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK = 0xff800000 +A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT = 23 +REG_A7XX_RB_CCU_CNTL = 0x00008e07 +A7XX_RB_CCU_CNTL_GMEM_FAST_CLEAR_DISABLE = 0x00000001 +A7XX_RB_CCU_CNTL_CONCURRENT_RESOLVE_MODE__MASK = 0x0000000c +A7XX_RB_CCU_CNTL_CONCURRENT_RESOLVE_MODE__SHIFT = 2 +A7XX_RB_CCU_CNTL_CONCURRENT_UNRESOLVE_MODE__MASK = 0x00000060 +A7XX_RB_CCU_CNTL_CONCURRENT_UNRESOLVE_MODE__SHIFT = 5 +REG_A6XX_RB_NC_MODE_CNTL = 0x00008e08 +A6XX_RB_NC_MODE_CNTL_MODE = 0x00000001 +A6XX_RB_NC_MODE_CNTL_LOWER_BIT__MASK = 0x00000006 +A6XX_RB_NC_MODE_CNTL_LOWER_BIT__SHIFT = 1 +A6XX_RB_NC_MODE_CNTL_MIN_ACCESS_LENGTH = 0x00000008 +A6XX_RB_NC_MODE_CNTL_AMSBC = 0x00000010 +A6XX_RB_NC_MODE_CNTL_UPPER_BIT__MASK = 0x00000400 +A6XX_RB_NC_MODE_CNTL_UPPER_BIT__SHIFT = 10 +A6XX_RB_NC_MODE_CNTL_RGB565_PREDICATOR = 0x00000800 +A6XX_RB_NC_MODE_CNTL_UNK12__MASK = 0x00003000 +A6XX_RB_NC_MODE_CNTL_UNK12__SHIFT = 12 +REG_A7XX_RB_UNKNOWN_8E09 = 0x00008e09 +REG_A6XX_RB_PERFCTR_RB_SEL = lambda i0: (0x00008e10 + 0x1*i0 ) # type: ignore +REG_A6XX_RB_PERFCTR_CCU_SEL = lambda i0: (0x00008e18 + 0x1*i0 ) # type: ignore +REG_A6XX_RB_CMP_DBG_ECO_CNTL = 0x00008e28 +REG_A6XX_RB_PERFCTR_CMP_SEL = lambda i0: (0x00008e2c + 0x1*i0 ) # type: ignore +REG_A7XX_RB_PERFCTR_UFC_SEL = lambda i0: (0x00008e30 + 0x1*i0 ) # type: ignore +REG_A6XX_RB_RB_SUB_BLOCK_SEL_CNTL_HOST = 0x00008e3b +REG_A6XX_RB_RB_SUB_BLOCK_SEL_CNTL_CD = 0x00008e3d +REG_A6XX_RB_CONTEXT_SWITCH_GMEM_SAVE_RESTORE_ENABLE = 0x00008e50 +REG_A6XX_RB_CONTEXT_SWITCH_GMEM_SAVE_RESTORE_ADDR = 0x00008e51 +REG_A7XX_RB_UNKNOWN_8E79 = 0x00008e79 +REG_A6XX_VPC_GS_PARAM = 0x00009100 +A6XX_VPC_GS_PARAM_LINELENGTHLOC__MASK = 0x000000ff +A6XX_VPC_GS_PARAM_LINELENGTHLOC__SHIFT = 0 +REG_A6XX_VPC_VS_CLIP_CULL_CNTL = 0x00009101 +A6XX_VPC_VS_CLIP_CULL_CNTL_CLIP_MASK__MASK = 0x000000ff +A6XX_VPC_VS_CLIP_CULL_CNTL_CLIP_MASK__SHIFT = 0 +A6XX_VPC_VS_CLIP_CULL_CNTL_CLIP_DIST_03_LOC__MASK = 0x0000ff00 +A6XX_VPC_VS_CLIP_CULL_CNTL_CLIP_DIST_03_LOC__SHIFT = 8 +A6XX_VPC_VS_CLIP_CULL_CNTL_CLIP_DIST_47_LOC__MASK = 0x00ff0000 +A6XX_VPC_VS_CLIP_CULL_CNTL_CLIP_DIST_47_LOC__SHIFT = 16 +REG_A6XX_VPC_GS_CLIP_CULL_CNTL = 0x00009102 +A6XX_VPC_GS_CLIP_CULL_CNTL_CLIP_MASK__MASK = 0x000000ff +A6XX_VPC_GS_CLIP_CULL_CNTL_CLIP_MASK__SHIFT = 0 +A6XX_VPC_GS_CLIP_CULL_CNTL_CLIP_DIST_03_LOC__MASK = 0x0000ff00 +A6XX_VPC_GS_CLIP_CULL_CNTL_CLIP_DIST_03_LOC__SHIFT = 8 +A6XX_VPC_GS_CLIP_CULL_CNTL_CLIP_DIST_47_LOC__MASK = 0x00ff0000 +A6XX_VPC_GS_CLIP_CULL_CNTL_CLIP_DIST_47_LOC__SHIFT = 16 +REG_A6XX_VPC_DS_CLIP_CULL_CNTL = 0x00009103 +A6XX_VPC_DS_CLIP_CULL_CNTL_CLIP_MASK__MASK = 0x000000ff +A6XX_VPC_DS_CLIP_CULL_CNTL_CLIP_MASK__SHIFT = 0 +A6XX_VPC_DS_CLIP_CULL_CNTL_CLIP_DIST_03_LOC__MASK = 0x0000ff00 +A6XX_VPC_DS_CLIP_CULL_CNTL_CLIP_DIST_03_LOC__SHIFT = 8 +A6XX_VPC_DS_CLIP_CULL_CNTL_CLIP_DIST_47_LOC__MASK = 0x00ff0000 +A6XX_VPC_DS_CLIP_CULL_CNTL_CLIP_DIST_47_LOC__SHIFT = 16 +REG_A6XX_VPC_VS_CLIP_CULL_CNTL_V2 = 0x00009311 +A6XX_VPC_VS_CLIP_CULL_CNTL_V2_CLIP_MASK__MASK = 0x000000ff +A6XX_VPC_VS_CLIP_CULL_CNTL_V2_CLIP_MASK__SHIFT = 0 +A6XX_VPC_VS_CLIP_CULL_CNTL_V2_CLIP_DIST_03_LOC__MASK = 0x0000ff00 +A6XX_VPC_VS_CLIP_CULL_CNTL_V2_CLIP_DIST_03_LOC__SHIFT = 8 +A6XX_VPC_VS_CLIP_CULL_CNTL_V2_CLIP_DIST_47_LOC__MASK = 0x00ff0000 +A6XX_VPC_VS_CLIP_CULL_CNTL_V2_CLIP_DIST_47_LOC__SHIFT = 16 +REG_A6XX_VPC_GS_CLIP_CULL_CNTL_V2 = 0x00009312 +A6XX_VPC_GS_CLIP_CULL_CNTL_V2_CLIP_MASK__MASK = 0x000000ff +A6XX_VPC_GS_CLIP_CULL_CNTL_V2_CLIP_MASK__SHIFT = 0 +A6XX_VPC_GS_CLIP_CULL_CNTL_V2_CLIP_DIST_03_LOC__MASK = 0x0000ff00 +A6XX_VPC_GS_CLIP_CULL_CNTL_V2_CLIP_DIST_03_LOC__SHIFT = 8 +A6XX_VPC_GS_CLIP_CULL_CNTL_V2_CLIP_DIST_47_LOC__MASK = 0x00ff0000 +A6XX_VPC_GS_CLIP_CULL_CNTL_V2_CLIP_DIST_47_LOC__SHIFT = 16 +REG_A6XX_VPC_DS_CLIP_CULL_CNTL_V2 = 0x00009313 +A6XX_VPC_DS_CLIP_CULL_CNTL_V2_CLIP_MASK__MASK = 0x000000ff +A6XX_VPC_DS_CLIP_CULL_CNTL_V2_CLIP_MASK__SHIFT = 0 +A6XX_VPC_DS_CLIP_CULL_CNTL_V2_CLIP_DIST_03_LOC__MASK = 0x0000ff00 +A6XX_VPC_DS_CLIP_CULL_CNTL_V2_CLIP_DIST_03_LOC__SHIFT = 8 +A6XX_VPC_DS_CLIP_CULL_CNTL_V2_CLIP_DIST_47_LOC__MASK = 0x00ff0000 +A6XX_VPC_DS_CLIP_CULL_CNTL_V2_CLIP_DIST_47_LOC__SHIFT = 16 +REG_A6XX_VPC_VS_SIV_CNTL = 0x00009104 +A6XX_VPC_VS_SIV_CNTL_LAYERLOC__MASK = 0x000000ff +A6XX_VPC_VS_SIV_CNTL_LAYERLOC__SHIFT = 0 +A6XX_VPC_VS_SIV_CNTL_VIEWLOC__MASK = 0x0000ff00 +A6XX_VPC_VS_SIV_CNTL_VIEWLOC__SHIFT = 8 +A6XX_VPC_VS_SIV_CNTL_SHADINGRATELOC__MASK = 0x00ff0000 +A6XX_VPC_VS_SIV_CNTL_SHADINGRATELOC__SHIFT = 16 +REG_A6XX_VPC_GS_SIV_CNTL = 0x00009105 +A6XX_VPC_GS_SIV_CNTL_LAYERLOC__MASK = 0x000000ff +A6XX_VPC_GS_SIV_CNTL_LAYERLOC__SHIFT = 0 +A6XX_VPC_GS_SIV_CNTL_VIEWLOC__MASK = 0x0000ff00 +A6XX_VPC_GS_SIV_CNTL_VIEWLOC__SHIFT = 8 +A6XX_VPC_GS_SIV_CNTL_SHADINGRATELOC__MASK = 0x00ff0000 +A6XX_VPC_GS_SIV_CNTL_SHADINGRATELOC__SHIFT = 16 +REG_A6XX_VPC_DS_SIV_CNTL = 0x00009106 +A6XX_VPC_DS_SIV_CNTL_LAYERLOC__MASK = 0x000000ff +A6XX_VPC_DS_SIV_CNTL_LAYERLOC__SHIFT = 0 +A6XX_VPC_DS_SIV_CNTL_VIEWLOC__MASK = 0x0000ff00 +A6XX_VPC_DS_SIV_CNTL_VIEWLOC__SHIFT = 8 +A6XX_VPC_DS_SIV_CNTL_SHADINGRATELOC__MASK = 0x00ff0000 +A6XX_VPC_DS_SIV_CNTL_SHADINGRATELOC__SHIFT = 16 +REG_A6XX_VPC_VS_SIV_CNTL_V2 = 0x00009314 +A6XX_VPC_VS_SIV_CNTL_V2_LAYERLOC__MASK = 0x000000ff +A6XX_VPC_VS_SIV_CNTL_V2_LAYERLOC__SHIFT = 0 +A6XX_VPC_VS_SIV_CNTL_V2_VIEWLOC__MASK = 0x0000ff00 +A6XX_VPC_VS_SIV_CNTL_V2_VIEWLOC__SHIFT = 8 +A6XX_VPC_VS_SIV_CNTL_V2_SHADINGRATELOC__MASK = 0x00ff0000 +A6XX_VPC_VS_SIV_CNTL_V2_SHADINGRATELOC__SHIFT = 16 +REG_A6XX_VPC_GS_SIV_CNTL_V2 = 0x00009315 +A6XX_VPC_GS_SIV_CNTL_V2_LAYERLOC__MASK = 0x000000ff +A6XX_VPC_GS_SIV_CNTL_V2_LAYERLOC__SHIFT = 0 +A6XX_VPC_GS_SIV_CNTL_V2_VIEWLOC__MASK = 0x0000ff00 +A6XX_VPC_GS_SIV_CNTL_V2_VIEWLOC__SHIFT = 8 +A6XX_VPC_GS_SIV_CNTL_V2_SHADINGRATELOC__MASK = 0x00ff0000 +A6XX_VPC_GS_SIV_CNTL_V2_SHADINGRATELOC__SHIFT = 16 +REG_A6XX_VPC_DS_SIV_CNTL_V2 = 0x00009316 +A6XX_VPC_DS_SIV_CNTL_V2_LAYERLOC__MASK = 0x000000ff +A6XX_VPC_DS_SIV_CNTL_V2_LAYERLOC__SHIFT = 0 +A6XX_VPC_DS_SIV_CNTL_V2_VIEWLOC__MASK = 0x0000ff00 +A6XX_VPC_DS_SIV_CNTL_V2_VIEWLOC__SHIFT = 8 +A6XX_VPC_DS_SIV_CNTL_V2_SHADINGRATELOC__MASK = 0x00ff0000 +A6XX_VPC_DS_SIV_CNTL_V2_SHADINGRATELOC__SHIFT = 16 +REG_A6XX_VPC_UNKNOWN_9107 = 0x00009107 +A6XX_VPC_UNKNOWN_9107_RASTER_DISCARD = 0x00000001 +A6XX_VPC_UNKNOWN_9107_UNK2 = 0x00000004 +REG_A6XX_VPC_RAST_CNTL = 0x00009108 +A6XX_VPC_RAST_CNTL_MODE__MASK = 0x00000003 +A6XX_VPC_RAST_CNTL_MODE__SHIFT = 0 +REG_A7XX_VPC_PC_CNTL = 0x00009109 +A7XX_VPC_PC_CNTL_PRIMITIVE_RESTART = 0x00000001 +A7XX_VPC_PC_CNTL_PROVOKING_VTX_LAST = 0x00000002 +A7XX_VPC_PC_CNTL_D3D_VERTEX_ORDERING = 0x00000004 +A7XX_VPC_PC_CNTL_UNK3 = 0x00000008 +REG_A7XX_VPC_GS_PARAM_0 = 0x0000910a +A7XX_VPC_GS_PARAM_0_GS_VERTICES_OUT__MASK = 0x000000ff +A7XX_VPC_GS_PARAM_0_GS_VERTICES_OUT__SHIFT = 0 +A7XX_VPC_GS_PARAM_0_GS_INVOCATIONS__MASK = 0x00007c00 +A7XX_VPC_GS_PARAM_0_GS_INVOCATIONS__SHIFT = 10 +A7XX_VPC_GS_PARAM_0_LINELENGTHEN = 0x00008000 +A7XX_VPC_GS_PARAM_0_GS_OUTPUT__MASK = 0x00030000 +A7XX_VPC_GS_PARAM_0_GS_OUTPUT__SHIFT = 16 +A7XX_VPC_GS_PARAM_0_UNK18 = 0x00040000 +REG_A7XX_VPC_STEREO_RENDERING_VIEWMASK = 0x0000910b +REG_A7XX_VPC_STEREO_RENDERING_CNTL = 0x0000910c +A7XX_VPC_STEREO_RENDERING_CNTL_ENABLE = 0x00000001 +A7XX_VPC_STEREO_RENDERING_CNTL_DISABLEMULTIPOS = 0x00000002 +A7XX_VPC_STEREO_RENDERING_CNTL_VIEWS__MASK = 0x0000007c +A7XX_VPC_STEREO_RENDERING_CNTL_VIEWS__SHIFT = 2 +REG_A6XX_VPC_VARYING_INTERP_MODE = lambda i0: (0x00009200 + 0x1*i0 ) # type: ignore +REG_A6XX_VPC_VARYING_REPLACE_MODE_0 = lambda i0: (0x00009208 + 0x1*i0 ) # type: ignore +REG_A6XX_VPC_UNKNOWN_9210 = 0x00009210 +REG_A6XX_VPC_UNKNOWN_9211 = 0x00009211 +REG_A6XX_VPC_VARYING_LM_TRANSFER_CNTL_0 = lambda i0: (0x00009212 + 0x1*i0 ) # type: ignore +REG_A6XX_VPC_SO_MAPPING_WPTR = 0x00009216 +A6XX_VPC_SO_MAPPING_WPTR_ADDR__MASK = 0x000000ff +A6XX_VPC_SO_MAPPING_WPTR_ADDR__SHIFT = 0 +A6XX_VPC_SO_MAPPING_WPTR_RESET = 0x00010000 +REG_A6XX_VPC_SO_MAPPING_PORT = 0x00009217 +A6XX_VPC_SO_MAPPING_PORT_A_BUF__MASK = 0x00000003 +A6XX_VPC_SO_MAPPING_PORT_A_BUF__SHIFT = 0 +A6XX_VPC_SO_MAPPING_PORT_A_OFF__MASK = 0x000007fc +A6XX_VPC_SO_MAPPING_PORT_A_OFF__SHIFT = 2 +A6XX_VPC_SO_MAPPING_PORT_A_EN = 0x00000800 +A6XX_VPC_SO_MAPPING_PORT_B_BUF__MASK = 0x00003000 +A6XX_VPC_SO_MAPPING_PORT_B_BUF__SHIFT = 12 +A6XX_VPC_SO_MAPPING_PORT_B_OFF__MASK = 0x007fc000 +A6XX_VPC_SO_MAPPING_PORT_B_OFF__SHIFT = 14 +A6XX_VPC_SO_MAPPING_PORT_B_EN = 0x00800000 +REG_A6XX_VPC_SO_QUERY_BASE = 0x00009218 +REG_A6XX_VPC_SO = lambda i0: (0x0000921a + 0x7*i0 ) # type: ignore +REG_A6XX_VPC_REPLACE_MODE_CNTL = 0x00009236 +A6XX_VPC_REPLACE_MODE_CNTL_INVERT = 0x00000001 +REG_A6XX_VPC_UNKNOWN_9300 = 0x00009300 +REG_A6XX_VPC_VS_CNTL = 0x00009301 +A6XX_VPC_VS_CNTL_STRIDE_IN_VPC__MASK = 0x000000ff +A6XX_VPC_VS_CNTL_STRIDE_IN_VPC__SHIFT = 0 +A6XX_VPC_VS_CNTL_POSITIONLOC__MASK = 0x0000ff00 +A6XX_VPC_VS_CNTL_POSITIONLOC__SHIFT = 8 +A6XX_VPC_VS_CNTL_PSIZELOC__MASK = 0x00ff0000 +A6XX_VPC_VS_CNTL_PSIZELOC__SHIFT = 16 +A6XX_VPC_VS_CNTL_EXTRAPOS__MASK = 0x0f000000 +A6XX_VPC_VS_CNTL_EXTRAPOS__SHIFT = 24 +REG_A6XX_VPC_GS_CNTL = 0x00009302 +A6XX_VPC_GS_CNTL_STRIDE_IN_VPC__MASK = 0x000000ff +A6XX_VPC_GS_CNTL_STRIDE_IN_VPC__SHIFT = 0 +A6XX_VPC_GS_CNTL_POSITIONLOC__MASK = 0x0000ff00 +A6XX_VPC_GS_CNTL_POSITIONLOC__SHIFT = 8 +A6XX_VPC_GS_CNTL_PSIZELOC__MASK = 0x00ff0000 +A6XX_VPC_GS_CNTL_PSIZELOC__SHIFT = 16 +A6XX_VPC_GS_CNTL_EXTRAPOS__MASK = 0x0f000000 +A6XX_VPC_GS_CNTL_EXTRAPOS__SHIFT = 24 +REG_A6XX_VPC_DS_CNTL = 0x00009303 +A6XX_VPC_DS_CNTL_STRIDE_IN_VPC__MASK = 0x000000ff +A6XX_VPC_DS_CNTL_STRIDE_IN_VPC__SHIFT = 0 +A6XX_VPC_DS_CNTL_POSITIONLOC__MASK = 0x0000ff00 +A6XX_VPC_DS_CNTL_POSITIONLOC__SHIFT = 8 +A6XX_VPC_DS_CNTL_PSIZELOC__MASK = 0x00ff0000 +A6XX_VPC_DS_CNTL_PSIZELOC__SHIFT = 16 +A6XX_VPC_DS_CNTL_EXTRAPOS__MASK = 0x0f000000 +A6XX_VPC_DS_CNTL_EXTRAPOS__SHIFT = 24 +REG_A6XX_VPC_PS_CNTL = 0x00009304 +A6XX_VPC_PS_CNTL_NUMNONPOSVAR__MASK = 0x000000ff +A6XX_VPC_PS_CNTL_NUMNONPOSVAR__SHIFT = 0 +A6XX_VPC_PS_CNTL_PRIMIDLOC__MASK = 0x0000ff00 +A6XX_VPC_PS_CNTL_PRIMIDLOC__SHIFT = 8 +A6XX_VPC_PS_CNTL_VARYING = 0x00010000 +A6XX_VPC_PS_CNTL_VIEWIDLOC__MASK = 0xff000000 +A6XX_VPC_PS_CNTL_VIEWIDLOC__SHIFT = 24 +REG_A6XX_VPC_SO_CNTL = 0x00009305 +A6XX_VPC_SO_CNTL_BUF0_STREAM__MASK = 0x00000007 +A6XX_VPC_SO_CNTL_BUF0_STREAM__SHIFT = 0 +A6XX_VPC_SO_CNTL_BUF1_STREAM__MASK = 0x00000038 +A6XX_VPC_SO_CNTL_BUF1_STREAM__SHIFT = 3 +A6XX_VPC_SO_CNTL_BUF2_STREAM__MASK = 0x000001c0 +A6XX_VPC_SO_CNTL_BUF2_STREAM__SHIFT = 6 +A6XX_VPC_SO_CNTL_BUF3_STREAM__MASK = 0x00000e00 +A6XX_VPC_SO_CNTL_BUF3_STREAM__SHIFT = 9 +A6XX_VPC_SO_CNTL_STREAM_ENABLE__MASK = 0x00078000 +A6XX_VPC_SO_CNTL_STREAM_ENABLE__SHIFT = 15 +REG_A6XX_VPC_SO_OVERRIDE = 0x00009306 +A6XX_VPC_SO_OVERRIDE_DISABLE = 0x00000001 +REG_A6XX_VPC_PS_RAST_CNTL = 0x00009307 +A6XX_VPC_PS_RAST_CNTL_MODE__MASK = 0x00000003 +A6XX_VPC_PS_RAST_CNTL_MODE__SHIFT = 0 +REG_A7XX_VPC_ATTR_BUF_GMEM_SIZE = 0x00009308 +A7XX_VPC_ATTR_BUF_GMEM_SIZE_SIZE_GMEM__MASK = 0xffffffff +A7XX_VPC_ATTR_BUF_GMEM_SIZE_SIZE_GMEM__SHIFT = 0 +REG_A7XX_VPC_ATTR_BUF_GMEM_BASE = 0x00009309 +A7XX_VPC_ATTR_BUF_GMEM_BASE_BASE_GMEM__MASK = 0xffffffff +A7XX_VPC_ATTR_BUF_GMEM_BASE_BASE_GMEM__SHIFT = 0 +REG_A7XX_PC_ATTR_BUF_GMEM_SIZE = 0x00009b09 +A7XX_PC_ATTR_BUF_GMEM_SIZE_SIZE_GMEM__MASK = 0xffffffff +A7XX_PC_ATTR_BUF_GMEM_SIZE_SIZE_GMEM__SHIFT = 0 +REG_A6XX_VPC_DBG_ECO_CNTL = 0x00009600 +REG_A6XX_VPC_ADDR_MODE_CNTL = 0x00009601 +REG_A6XX_VPC_UNKNOWN_9602 = 0x00009602 +REG_A6XX_VPC_UNKNOWN_9603 = 0x00009603 +REG_A6XX_VPC_PERFCTR_VPC_SEL = lambda i0: (0x00009604 + 0x1*i0 ) # type: ignore +REG_A7XX_VPC_PERFCTR_VPC_SEL = lambda i0: (0x0000960b + 0x1*i0 ) # type: ignore +REG_A6XX_PC_HS_PARAM_0 = 0x00009800 +REG_A6XX_PC_HS_PARAM_1 = 0x00009801 +A6XX_PC_HS_PARAM_1_SIZE__MASK = 0x000007ff +A6XX_PC_HS_PARAM_1_SIZE__SHIFT = 0 +A6XX_PC_HS_PARAM_1_UNK13 = 0x00002000 +REG_A6XX_PC_DS_PARAM = 0x00009802 +A6XX_PC_DS_PARAM_SPACING__MASK = 0x00000003 +A6XX_PC_DS_PARAM_SPACING__SHIFT = 0 +A6XX_PC_DS_PARAM_OUTPUT__MASK = 0x0000000c +A6XX_PC_DS_PARAM_OUTPUT__SHIFT = 2 +REG_A6XX_PC_RESTART_INDEX = 0x00009803 +REG_A6XX_PC_MODE_CNTL = 0x00009804 +REG_A6XX_PC_POWER_CNTL = 0x00009805 +REG_A6XX_PC_PS_CNTL = 0x00009806 +A6XX_PC_PS_CNTL_PRIMITIVEIDEN = 0x00000001 +REG_A6XX_PC_DGEN_SO_CNTL = 0x00009808 +A6XX_PC_DGEN_SO_CNTL_STREAM_ENABLE__MASK = 0x00078000 +A6XX_PC_DGEN_SO_CNTL_STREAM_ENABLE__SHIFT = 15 +REG_A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL = 0x0000980a +A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL_CONSERVATIVERASEN = 0x00000001 +REG_A6XX_PC_DRAW_INITIATOR = 0x00009840 +A6XX_PC_DRAW_INITIATOR_STATE_ID__MASK = 0x000000ff +A6XX_PC_DRAW_INITIATOR_STATE_ID__SHIFT = 0 +REG_A6XX_PC_KERNEL_INITIATOR = 0x00009841 +A6XX_PC_KERNEL_INITIATOR_STATE_ID__MASK = 0x000000ff +A6XX_PC_KERNEL_INITIATOR_STATE_ID__SHIFT = 0 +REG_A6XX_PC_EVENT_INITIATOR = 0x00009842 +A6XX_PC_EVENT_INITIATOR_STATE_ID__MASK = 0x00ff0000 +A6XX_PC_EVENT_INITIATOR_STATE_ID__SHIFT = 16 +A6XX_PC_EVENT_INITIATOR_EVENT__MASK = 0x0000007f +A6XX_PC_EVENT_INITIATOR_EVENT__SHIFT = 0 +REG_A6XX_PC_MARKER = 0x00009880 +REG_A6XX_PC_DGEN_RAST_CNTL = 0x00009981 +A6XX_PC_DGEN_RAST_CNTL_MODE__MASK = 0x00000003 +A6XX_PC_DGEN_RAST_CNTL_MODE__SHIFT = 0 +REG_A7XX_PC_DGEN_RAST_CNTL = 0x00009809 +A7XX_PC_DGEN_RAST_CNTL_MODE__MASK = 0x00000003 +A7XX_PC_DGEN_RAST_CNTL_MODE__SHIFT = 0 +REG_A6XX_VPC_RAST_STREAM_CNTL = 0x00009980 +A6XX_VPC_RAST_STREAM_CNTL_STREAM__MASK = 0x00000003 +A6XX_VPC_RAST_STREAM_CNTL_STREAM__SHIFT = 0 +A6XX_VPC_RAST_STREAM_CNTL_DISCARD = 0x00000004 +REG_A7XX_VPC_RAST_STREAM_CNTL = 0x00009107 +A7XX_VPC_RAST_STREAM_CNTL_STREAM__MASK = 0x00000003 +A7XX_VPC_RAST_STREAM_CNTL_STREAM__SHIFT = 0 +A7XX_VPC_RAST_STREAM_CNTL_DISCARD = 0x00000004 +REG_A7XX_VPC_RAST_STREAM_CNTL_V2 = 0x00009317 +A7XX_VPC_RAST_STREAM_CNTL_V2_STREAM__MASK = 0x00000003 +A7XX_VPC_RAST_STREAM_CNTL_V2_STREAM__SHIFT = 0 +A7XX_VPC_RAST_STREAM_CNTL_V2_DISCARD = 0x00000004 +REG_A7XX_PC_HS_BUFFER_SIZE = 0x00009885 +REG_A7XX_PC_TF_BUFFER_SIZE = 0x00009886 +REG_A6XX_PC_CNTL = 0x00009b00 +A6XX_PC_CNTL_PRIMITIVE_RESTART = 0x00000001 +A6XX_PC_CNTL_PROVOKING_VTX_LAST = 0x00000002 +A6XX_PC_CNTL_D3D_VERTEX_ORDERING = 0x00000004 +A6XX_PC_CNTL_UNK3 = 0x00000008 +REG_A6XX_PC_VS_CNTL = 0x00009b01 +A6XX_PC_VS_CNTL_STRIDE_IN_VPC__MASK = 0x000000ff +A6XX_PC_VS_CNTL_STRIDE_IN_VPC__SHIFT = 0 +A6XX_PC_VS_CNTL_PSIZE = 0x00000100 +A6XX_PC_VS_CNTL_LAYER = 0x00000200 +A6XX_PC_VS_CNTL_VIEW = 0x00000400 +A6XX_PC_VS_CNTL_PRIMITIVE_ID = 0x00000800 +A6XX_PC_VS_CNTL_CLIP_MASK__MASK = 0x00ff0000 +A6XX_PC_VS_CNTL_CLIP_MASK__SHIFT = 16 +A6XX_PC_VS_CNTL_SHADINGRATE = 0x01000000 +REG_A6XX_PC_GS_CNTL = 0x00009b02 +A6XX_PC_GS_CNTL_STRIDE_IN_VPC__MASK = 0x000000ff +A6XX_PC_GS_CNTL_STRIDE_IN_VPC__SHIFT = 0 +A6XX_PC_GS_CNTL_PSIZE = 0x00000100 +A6XX_PC_GS_CNTL_LAYER = 0x00000200 +A6XX_PC_GS_CNTL_VIEW = 0x00000400 +A6XX_PC_GS_CNTL_PRIMITIVE_ID = 0x00000800 +A6XX_PC_GS_CNTL_CLIP_MASK__MASK = 0x00ff0000 +A6XX_PC_GS_CNTL_CLIP_MASK__SHIFT = 16 +A6XX_PC_GS_CNTL_SHADINGRATE = 0x01000000 +REG_A6XX_PC_HS_CNTL = 0x00009b03 +A6XX_PC_HS_CNTL_STRIDE_IN_VPC__MASK = 0x000000ff +A6XX_PC_HS_CNTL_STRIDE_IN_VPC__SHIFT = 0 +A6XX_PC_HS_CNTL_PSIZE = 0x00000100 +A6XX_PC_HS_CNTL_LAYER = 0x00000200 +A6XX_PC_HS_CNTL_VIEW = 0x00000400 +A6XX_PC_HS_CNTL_PRIMITIVE_ID = 0x00000800 +A6XX_PC_HS_CNTL_CLIP_MASK__MASK = 0x00ff0000 +A6XX_PC_HS_CNTL_CLIP_MASK__SHIFT = 16 +A6XX_PC_HS_CNTL_SHADINGRATE = 0x01000000 +REG_A6XX_PC_DS_CNTL = 0x00009b04 +A6XX_PC_DS_CNTL_STRIDE_IN_VPC__MASK = 0x000000ff +A6XX_PC_DS_CNTL_STRIDE_IN_VPC__SHIFT = 0 +A6XX_PC_DS_CNTL_PSIZE = 0x00000100 +A6XX_PC_DS_CNTL_LAYER = 0x00000200 +A6XX_PC_DS_CNTL_VIEW = 0x00000400 +A6XX_PC_DS_CNTL_PRIMITIVE_ID = 0x00000800 +A6XX_PC_DS_CNTL_CLIP_MASK__MASK = 0x00ff0000 +A6XX_PC_DS_CNTL_CLIP_MASK__SHIFT = 16 +A6XX_PC_DS_CNTL_SHADINGRATE = 0x01000000 +REG_A6XX_PC_GS_PARAM_0 = 0x00009b05 +A6XX_PC_GS_PARAM_0_GS_VERTICES_OUT__MASK = 0x000000ff +A6XX_PC_GS_PARAM_0_GS_VERTICES_OUT__SHIFT = 0 +A6XX_PC_GS_PARAM_0_GS_INVOCATIONS__MASK = 0x00007c00 +A6XX_PC_GS_PARAM_0_GS_INVOCATIONS__SHIFT = 10 +A6XX_PC_GS_PARAM_0_LINELENGTHEN = 0x00008000 +A6XX_PC_GS_PARAM_0_GS_OUTPUT__MASK = 0x00030000 +A6XX_PC_GS_PARAM_0_GS_OUTPUT__SHIFT = 16 +A6XX_PC_GS_PARAM_0_UNK18 = 0x00040000 +REG_A6XX_PC_PRIMITIVE_CNTL_6 = 0x00009b06 +A6XX_PC_PRIMITIVE_CNTL_6_STRIDE_IN_VPC__MASK = 0x000007ff +A6XX_PC_PRIMITIVE_CNTL_6_STRIDE_IN_VPC__SHIFT = 0 +REG_A6XX_PC_STEREO_RENDERING_CNTL = 0x00009b07 +A6XX_PC_STEREO_RENDERING_CNTL_ENABLE = 0x00000001 +A6XX_PC_STEREO_RENDERING_CNTL_DISABLEMULTIPOS = 0x00000002 +A6XX_PC_STEREO_RENDERING_CNTL_VIEWS__MASK = 0x0000007c +A6XX_PC_STEREO_RENDERING_CNTL_VIEWS__SHIFT = 2 +REG_A6XX_PC_STEREO_RENDERING_VIEWMASK = 0x00009b08 +REG_A6XX_PC_2D_EVENT_CMD = 0x00009c00 +A6XX_PC_2D_EVENT_CMD_EVENT__MASK = 0x0000007f +A6XX_PC_2D_EVENT_CMD_EVENT__SHIFT = 0 +A6XX_PC_2D_EVENT_CMD_STATE_ID__MASK = 0x0000ff00 +A6XX_PC_2D_EVENT_CMD_STATE_ID__SHIFT = 8 +REG_A6XX_PC_DBG_ECO_CNTL = 0x00009e00 +REG_A6XX_PC_ADDR_MODE_CNTL = 0x00009e01 +REG_A6XX_PC_DMA_BASE = 0x00009e04 +REG_A6XX_PC_DMA_OFFSET = 0x00009e06 +REG_A6XX_PC_DMA_SIZE = 0x00009e07 +REG_A6XX_PC_TESS_BASE = 0x00009e08 +REG_A7XX_PC_TESS_BASE = 0x00009810 +REG_A6XX_PC_DRAWCALL_CNTL = 0x00009e0b +A6XX_PC_DRAWCALL_CNTL_PRIM_TYPE__MASK = 0x0000003f +A6XX_PC_DRAWCALL_CNTL_PRIM_TYPE__SHIFT = 0 +A6XX_PC_DRAWCALL_CNTL_SOURCE_SELECT__MASK = 0x000000c0 +A6XX_PC_DRAWCALL_CNTL_SOURCE_SELECT__SHIFT = 6 +A6XX_PC_DRAWCALL_CNTL_VIS_CULL__MASK = 0x00000300 +A6XX_PC_DRAWCALL_CNTL_VIS_CULL__SHIFT = 8 +A6XX_PC_DRAWCALL_CNTL_INDEX_SIZE__MASK = 0x00000c00 +A6XX_PC_DRAWCALL_CNTL_INDEX_SIZE__SHIFT = 10 +A6XX_PC_DRAWCALL_CNTL_PATCH_TYPE__MASK = 0x00003000 +A6XX_PC_DRAWCALL_CNTL_PATCH_TYPE__SHIFT = 12 +A6XX_PC_DRAWCALL_CNTL_GS_ENABLE = 0x00010000 +A6XX_PC_DRAWCALL_CNTL_TESS_ENABLE = 0x00020000 +REG_A6XX_PC_DRAWCALL_INSTANCE_NUM = 0x00009e0c +REG_A6XX_PC_DRAWCALL_SIZE = 0x00009e0d +REG_A6XX_PC_VIS_STREAM_CNTL = 0x00009e11 +A6XX_PC_VIS_STREAM_CNTL_UNK0__MASK = 0x0000ffff +A6XX_PC_VIS_STREAM_CNTL_UNK0__SHIFT = 0 +A6XX_PC_VIS_STREAM_CNTL_VSC_SIZE__MASK = 0x003f0000 +A6XX_PC_VIS_STREAM_CNTL_VSC_SIZE__SHIFT = 16 +A6XX_PC_VIS_STREAM_CNTL_VSC_N__MASK = 0x07c00000 +A6XX_PC_VIS_STREAM_CNTL_VSC_N__SHIFT = 22 +REG_A6XX_PC_PVIS_STREAM_BIN_BASE = 0x00009e12 +REG_A6XX_PC_DVIS_STREAM_BIN_BASE = 0x00009e14 +REG_A6XX_PC_DRAWCALL_CNTL_OVERRIDE = 0x00009e1c +A6XX_PC_DRAWCALL_CNTL_OVERRIDE_OVERRIDE = 0x00000001 +REG_A7XX_PC_UNKNOWN_9E24 = 0x00009e24 +REG_A6XX_PC_PERFCTR_PC_SEL = lambda i0: (0x00009e34 + 0x1*i0 ) # type: ignore +REG_A7XX_PC_PERFCTR_PC_SEL = lambda i0: (0x00009e42 + 0x1*i0 ) # type: ignore +REG_A6XX_PC_UNKNOWN_9E72 = 0x00009e72 +REG_A6XX_VFD_CNTL_0 = 0x0000a000 +A6XX_VFD_CNTL_0_FETCH_CNT__MASK = 0x0000003f +A6XX_VFD_CNTL_0_FETCH_CNT__SHIFT = 0 +A6XX_VFD_CNTL_0_DECODE_CNT__MASK = 0x00003f00 +A6XX_VFD_CNTL_0_DECODE_CNT__SHIFT = 8 +REG_A6XX_VFD_CNTL_1 = 0x0000a001 +A6XX_VFD_CNTL_1_REGID4VTX__MASK = 0x000000ff +A6XX_VFD_CNTL_1_REGID4VTX__SHIFT = 0 +A6XX_VFD_CNTL_1_REGID4INST__MASK = 0x0000ff00 +A6XX_VFD_CNTL_1_REGID4INST__SHIFT = 8 +A6XX_VFD_CNTL_1_REGID4PRIMID__MASK = 0x00ff0000 +A6XX_VFD_CNTL_1_REGID4PRIMID__SHIFT = 16 +A6XX_VFD_CNTL_1_REGID4VIEWID__MASK = 0xff000000 +A6XX_VFD_CNTL_1_REGID4VIEWID__SHIFT = 24 +REG_A6XX_VFD_CNTL_2 = 0x0000a002 +A6XX_VFD_CNTL_2_REGID_HSRELPATCHID__MASK = 0x000000ff +A6XX_VFD_CNTL_2_REGID_HSRELPATCHID__SHIFT = 0 +A6XX_VFD_CNTL_2_REGID_INVOCATIONID__MASK = 0x0000ff00 +A6XX_VFD_CNTL_2_REGID_INVOCATIONID__SHIFT = 8 +REG_A6XX_VFD_CNTL_3 = 0x0000a003 +A6XX_VFD_CNTL_3_REGID_DSPRIMID__MASK = 0x000000ff +A6XX_VFD_CNTL_3_REGID_DSPRIMID__SHIFT = 0 +A6XX_VFD_CNTL_3_REGID_DSRELPATCHID__MASK = 0x0000ff00 +A6XX_VFD_CNTL_3_REGID_DSRELPATCHID__SHIFT = 8 +A6XX_VFD_CNTL_3_REGID_TESSX__MASK = 0x00ff0000 +A6XX_VFD_CNTL_3_REGID_TESSX__SHIFT = 16 +A6XX_VFD_CNTL_3_REGID_TESSY__MASK = 0xff000000 +A6XX_VFD_CNTL_3_REGID_TESSY__SHIFT = 24 +REG_A6XX_VFD_CNTL_4 = 0x0000a004 +A6XX_VFD_CNTL_4_UNK0__MASK = 0x000000ff +A6XX_VFD_CNTL_4_UNK0__SHIFT = 0 +REG_A6XX_VFD_CNTL_5 = 0x0000a005 +A6XX_VFD_CNTL_5_REGID_GSHEADER__MASK = 0x000000ff +A6XX_VFD_CNTL_5_REGID_GSHEADER__SHIFT = 0 +A6XX_VFD_CNTL_5_UNK8__MASK = 0x0000ff00 +A6XX_VFD_CNTL_5_UNK8__SHIFT = 8 +REG_A6XX_VFD_CNTL_6 = 0x0000a006 +A6XX_VFD_CNTL_6_PRIMID4PSEN = 0x00000001 +REG_A6XX_VFD_RENDER_MODE = 0x0000a007 +A6XX_VFD_RENDER_MODE_RENDER_MODE__MASK = 0x00000007 +A6XX_VFD_RENDER_MODE_RENDER_MODE__SHIFT = 0 +REG_A6XX_VFD_STEREO_RENDERING_CNTL = 0x0000a008 +A6XX_VFD_STEREO_RENDERING_CNTL_ENABLE = 0x00000001 +A6XX_VFD_STEREO_RENDERING_CNTL_DISABLEMULTIPOS = 0x00000002 +A6XX_VFD_STEREO_RENDERING_CNTL_VIEWS__MASK = 0x0000007c +A6XX_VFD_STEREO_RENDERING_CNTL_VIEWS__SHIFT = 2 +REG_A6XX_VFD_MODE_CNTL = 0x0000a009 +A6XX_VFD_MODE_CNTL_VERTEX = 0x00000001 +A6XX_VFD_MODE_CNTL_INSTANCE = 0x00000002 +REG_A6XX_VFD_INDEX_OFFSET = 0x0000a00e +REG_A6XX_VFD_INSTANCE_START_OFFSET = 0x0000a00f +REG_A6XX_VFD_VERTEX_BUFFER = lambda i0: (0x0000a010 + 0x4*i0 ) # type: ignore +REG_A6XX_VFD_FETCH_INSTR = lambda i0: (0x0000a090 + 0x2*i0 ) # type: ignore +A6XX_VFD_FETCH_INSTR_INSTR_IDX__MASK = 0x0000001f +A6XX_VFD_FETCH_INSTR_INSTR_IDX__SHIFT = 0 +A6XX_VFD_FETCH_INSTR_INSTR_OFFSET__MASK = 0x0001ffe0 +A6XX_VFD_FETCH_INSTR_INSTR_OFFSET__SHIFT = 5 +A6XX_VFD_FETCH_INSTR_INSTR_INSTANCED = 0x00020000 +A6XX_VFD_FETCH_INSTR_INSTR_FORMAT__MASK = 0x0ff00000 +A6XX_VFD_FETCH_INSTR_INSTR_FORMAT__SHIFT = 20 +A6XX_VFD_FETCH_INSTR_INSTR_SWAP__MASK = 0x30000000 +A6XX_VFD_FETCH_INSTR_INSTR_SWAP__SHIFT = 28 +A6XX_VFD_FETCH_INSTR_INSTR_UNK30 = 0x40000000 +A6XX_VFD_FETCH_INSTR_INSTR_FLOAT = 0x80000000 +REG_A6XX_VFD_DEST_CNTL = lambda i0: (0x0000a0d0 + 0x1*i0 ) # type: ignore +A6XX_VFD_DEST_CNTL_INSTR_WRITEMASK__MASK = 0x0000000f +A6XX_VFD_DEST_CNTL_INSTR_WRITEMASK__SHIFT = 0 +A6XX_VFD_DEST_CNTL_INSTR_REGID__MASK = 0x00000ff0 +A6XX_VFD_DEST_CNTL_INSTR_REGID__SHIFT = 4 +REG_A6XX_VFD_POWER_CNTL = 0x0000a0f8 +REG_A7XX_VFD_DBG_ECO_CNTL = 0x0000a600 +REG_A6XX_VFD_ADDR_MODE_CNTL = 0x0000a601 +REG_A6XX_VFD_PERFCTR_VFD_SEL = lambda i0: (0x0000a610 + 0x1*i0 ) # type: ignore +REG_A7XX_VFD_PERFCTR_VFD_SEL = lambda i0: (0x0000a610 + 0x1*i0 ) # type: ignore +REG_A6XX_SP_VS_CNTL_0 = 0x0000a800 +A6XX_SP_VS_CNTL_0_THREADMODE__MASK = 0x00000001 +A6XX_SP_VS_CNTL_0_THREADMODE__SHIFT = 0 +A6XX_SP_VS_CNTL_0_HALFREGFOOTPRINT__MASK = 0x0000007e +A6XX_SP_VS_CNTL_0_HALFREGFOOTPRINT__SHIFT = 1 +A6XX_SP_VS_CNTL_0_FULLREGFOOTPRINT__MASK = 0x00001f80 +A6XX_SP_VS_CNTL_0_FULLREGFOOTPRINT__SHIFT = 7 +A6XX_SP_VS_CNTL_0_UNK13 = 0x00002000 +A6XX_SP_VS_CNTL_0_BRANCHSTACK__MASK = 0x000fc000 +A6XX_SP_VS_CNTL_0_BRANCHSTACK__SHIFT = 14 +A6XX_SP_VS_CNTL_0_MERGEDREGS = 0x00100000 +A6XX_SP_VS_CNTL_0_EARLYPREAMBLE = 0x00200000 +REG_A6XX_SP_VS_BOOLEAN_CF_MASK = 0x0000a801 +REG_A6XX_SP_VS_OUTPUT_CNTL = 0x0000a802 +A6XX_SP_VS_OUTPUT_CNTL_OUT__MASK = 0x0000003f +A6XX_SP_VS_OUTPUT_CNTL_OUT__SHIFT = 0 +A6XX_SP_VS_OUTPUT_CNTL_FLAGS_REGID__MASK = 0x00003fc0 +A6XX_SP_VS_OUTPUT_CNTL_FLAGS_REGID__SHIFT = 6 +REG_A6XX_SP_VS_OUTPUT = lambda i0: (0x0000a803 + 0x1*i0 ) # type: ignore +A6XX_SP_VS_OUTPUT_REG_A_REGID__MASK = 0x000000ff +A6XX_SP_VS_OUTPUT_REG_A_REGID__SHIFT = 0 +A6XX_SP_VS_OUTPUT_REG_A_COMPMASK__MASK = 0x00000f00 +A6XX_SP_VS_OUTPUT_REG_A_COMPMASK__SHIFT = 8 +A6XX_SP_VS_OUTPUT_REG_B_REGID__MASK = 0x00ff0000 +A6XX_SP_VS_OUTPUT_REG_B_REGID__SHIFT = 16 +A6XX_SP_VS_OUTPUT_REG_B_COMPMASK__MASK = 0x0f000000 +A6XX_SP_VS_OUTPUT_REG_B_COMPMASK__SHIFT = 24 +REG_A6XX_SP_VS_VPC_DEST = lambda i0: (0x0000a813 + 0x1*i0 ) # type: ignore +A6XX_SP_VS_VPC_DEST_REG_OUTLOC0__MASK = 0x000000ff +A6XX_SP_VS_VPC_DEST_REG_OUTLOC0__SHIFT = 0 +A6XX_SP_VS_VPC_DEST_REG_OUTLOC1__MASK = 0x0000ff00 +A6XX_SP_VS_VPC_DEST_REG_OUTLOC1__SHIFT = 8 +A6XX_SP_VS_VPC_DEST_REG_OUTLOC2__MASK = 0x00ff0000 +A6XX_SP_VS_VPC_DEST_REG_OUTLOC2__SHIFT = 16 +A6XX_SP_VS_VPC_DEST_REG_OUTLOC3__MASK = 0xff000000 +A6XX_SP_VS_VPC_DEST_REG_OUTLOC3__SHIFT = 24 +REG_A6XX_SP_VS_PROGRAM_COUNTER_OFFSET = 0x0000a81b +REG_A6XX_SP_VS_BASE = 0x0000a81c +REG_A6XX_SP_VS_PVT_MEM_PARAM = 0x0000a81e +A6XX_SP_VS_PVT_MEM_PARAM_MEMSIZEPERITEM__MASK = 0x000000ff +A6XX_SP_VS_PVT_MEM_PARAM_MEMSIZEPERITEM__SHIFT = 0 +A6XX_SP_VS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__MASK = 0xff000000 +A6XX_SP_VS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__SHIFT = 24 +REG_A6XX_SP_VS_PVT_MEM_BASE = 0x0000a81f +REG_A6XX_SP_VS_PVT_MEM_SIZE = 0x0000a821 +A6XX_SP_VS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__MASK = 0x0003ffff +A6XX_SP_VS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__SHIFT = 0 +A6XX_SP_VS_PVT_MEM_SIZE_PERWAVEMEMLAYOUT = 0x80000000 +REG_A6XX_SP_VS_TSIZE = 0x0000a822 +REG_A6XX_SP_VS_CONFIG = 0x0000a823 +A6XX_SP_VS_CONFIG_BINDLESS_TEX = 0x00000001 +A6XX_SP_VS_CONFIG_BINDLESS_SAMP = 0x00000002 +A6XX_SP_VS_CONFIG_BINDLESS_UAV = 0x00000004 +A6XX_SP_VS_CONFIG_BINDLESS_UBO = 0x00000008 +A6XX_SP_VS_CONFIG_ENABLED = 0x00000100 +A6XX_SP_VS_CONFIG_NTEX__MASK = 0x0001fe00 +A6XX_SP_VS_CONFIG_NTEX__SHIFT = 9 +A6XX_SP_VS_CONFIG_NSAMP__MASK = 0x003e0000 +A6XX_SP_VS_CONFIG_NSAMP__SHIFT = 17 +A6XX_SP_VS_CONFIG_NUAV__MASK = 0x1fc00000 +A6XX_SP_VS_CONFIG_NUAV__SHIFT = 22 +REG_A6XX_SP_VS_INSTR_SIZE = 0x0000a824 +REG_A6XX_SP_VS_PVT_MEM_STACK_OFFSET = 0x0000a825 +A6XX_SP_VS_PVT_MEM_STACK_OFFSET_OFFSET__MASK = 0x0007ffff +A6XX_SP_VS_PVT_MEM_STACK_OFFSET_OFFSET__SHIFT = 0 +REG_A7XX_SP_VS_VGS_CNTL = 0x0000a82d +REG_A6XX_SP_HS_CNTL_0 = 0x0000a830 +A6XX_SP_HS_CNTL_0_THREADMODE__MASK = 0x00000001 +A6XX_SP_HS_CNTL_0_THREADMODE__SHIFT = 0 +A6XX_SP_HS_CNTL_0_HALFREGFOOTPRINT__MASK = 0x0000007e +A6XX_SP_HS_CNTL_0_HALFREGFOOTPRINT__SHIFT = 1 +A6XX_SP_HS_CNTL_0_FULLREGFOOTPRINT__MASK = 0x00001f80 +A6XX_SP_HS_CNTL_0_FULLREGFOOTPRINT__SHIFT = 7 +A6XX_SP_HS_CNTL_0_UNK13 = 0x00002000 +A6XX_SP_HS_CNTL_0_BRANCHSTACK__MASK = 0x000fc000 +A6XX_SP_HS_CNTL_0_BRANCHSTACK__SHIFT = 14 +A6XX_SP_HS_CNTL_0_EARLYPREAMBLE = 0x00100000 +REG_A6XX_SP_HS_CNTL_1 = 0x0000a831 +REG_A6XX_SP_HS_BOOLEAN_CF_MASK = 0x0000a832 +REG_A6XX_SP_HS_PROGRAM_COUNTER_OFFSET = 0x0000a833 +REG_A6XX_SP_HS_BASE = 0x0000a834 +REG_A6XX_SP_HS_PVT_MEM_PARAM = 0x0000a836 +A6XX_SP_HS_PVT_MEM_PARAM_MEMSIZEPERITEM__MASK = 0x000000ff +A6XX_SP_HS_PVT_MEM_PARAM_MEMSIZEPERITEM__SHIFT = 0 +A6XX_SP_HS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__MASK = 0xff000000 +A6XX_SP_HS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__SHIFT = 24 +REG_A6XX_SP_HS_PVT_MEM_BASE = 0x0000a837 +REG_A6XX_SP_HS_PVT_MEM_SIZE = 0x0000a839 +A6XX_SP_HS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__MASK = 0x0003ffff +A6XX_SP_HS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__SHIFT = 0 +A6XX_SP_HS_PVT_MEM_SIZE_PERWAVEMEMLAYOUT = 0x80000000 +REG_A6XX_SP_HS_TSIZE = 0x0000a83a +REG_A6XX_SP_HS_CONFIG = 0x0000a83b +A6XX_SP_HS_CONFIG_BINDLESS_TEX = 0x00000001 +A6XX_SP_HS_CONFIG_BINDLESS_SAMP = 0x00000002 +A6XX_SP_HS_CONFIG_BINDLESS_UAV = 0x00000004 +A6XX_SP_HS_CONFIG_BINDLESS_UBO = 0x00000008 +A6XX_SP_HS_CONFIG_ENABLED = 0x00000100 +A6XX_SP_HS_CONFIG_NTEX__MASK = 0x0001fe00 +A6XX_SP_HS_CONFIG_NTEX__SHIFT = 9 +A6XX_SP_HS_CONFIG_NSAMP__MASK = 0x003e0000 +A6XX_SP_HS_CONFIG_NSAMP__SHIFT = 17 +A6XX_SP_HS_CONFIG_NUAV__MASK = 0x1fc00000 +A6XX_SP_HS_CONFIG_NUAV__SHIFT = 22 +REG_A6XX_SP_HS_INSTR_SIZE = 0x0000a83c +REG_A6XX_SP_HS_PVT_MEM_STACK_OFFSET = 0x0000a83d +A6XX_SP_HS_PVT_MEM_STACK_OFFSET_OFFSET__MASK = 0x0007ffff +A6XX_SP_HS_PVT_MEM_STACK_OFFSET_OFFSET__SHIFT = 0 +REG_A7XX_SP_HS_VGS_CNTL = 0x0000a82f +REG_A6XX_SP_DS_CNTL_0 = 0x0000a840 +A6XX_SP_DS_CNTL_0_THREADMODE__MASK = 0x00000001 +A6XX_SP_DS_CNTL_0_THREADMODE__SHIFT = 0 +A6XX_SP_DS_CNTL_0_HALFREGFOOTPRINT__MASK = 0x0000007e +A6XX_SP_DS_CNTL_0_HALFREGFOOTPRINT__SHIFT = 1 +A6XX_SP_DS_CNTL_0_FULLREGFOOTPRINT__MASK = 0x00001f80 +A6XX_SP_DS_CNTL_0_FULLREGFOOTPRINT__SHIFT = 7 +A6XX_SP_DS_CNTL_0_UNK13 = 0x00002000 +A6XX_SP_DS_CNTL_0_BRANCHSTACK__MASK = 0x000fc000 +A6XX_SP_DS_CNTL_0_BRANCHSTACK__SHIFT = 14 +A6XX_SP_DS_CNTL_0_EARLYPREAMBLE = 0x00100000 +REG_A6XX_SP_DS_BOOLEAN_CF_MASK = 0x0000a841 +REG_A6XX_SP_DS_OUTPUT_CNTL = 0x0000a842 +A6XX_SP_DS_OUTPUT_CNTL_OUT__MASK = 0x0000003f +A6XX_SP_DS_OUTPUT_CNTL_OUT__SHIFT = 0 +A6XX_SP_DS_OUTPUT_CNTL_FLAGS_REGID__MASK = 0x00003fc0 +A6XX_SP_DS_OUTPUT_CNTL_FLAGS_REGID__SHIFT = 6 +REG_A6XX_SP_DS_OUTPUT = lambda i0: (0x0000a843 + 0x1*i0 ) # type: ignore +A6XX_SP_DS_OUTPUT_REG_A_REGID__MASK = 0x000000ff +A6XX_SP_DS_OUTPUT_REG_A_REGID__SHIFT = 0 +A6XX_SP_DS_OUTPUT_REG_A_COMPMASK__MASK = 0x00000f00 +A6XX_SP_DS_OUTPUT_REG_A_COMPMASK__SHIFT = 8 +A6XX_SP_DS_OUTPUT_REG_B_REGID__MASK = 0x00ff0000 +A6XX_SP_DS_OUTPUT_REG_B_REGID__SHIFT = 16 +A6XX_SP_DS_OUTPUT_REG_B_COMPMASK__MASK = 0x0f000000 +A6XX_SP_DS_OUTPUT_REG_B_COMPMASK__SHIFT = 24 +REG_A6XX_SP_DS_VPC_DEST = lambda i0: (0x0000a853 + 0x1*i0 ) # type: ignore +A6XX_SP_DS_VPC_DEST_REG_OUTLOC0__MASK = 0x000000ff +A6XX_SP_DS_VPC_DEST_REG_OUTLOC0__SHIFT = 0 +A6XX_SP_DS_VPC_DEST_REG_OUTLOC1__MASK = 0x0000ff00 +A6XX_SP_DS_VPC_DEST_REG_OUTLOC1__SHIFT = 8 +A6XX_SP_DS_VPC_DEST_REG_OUTLOC2__MASK = 0x00ff0000 +A6XX_SP_DS_VPC_DEST_REG_OUTLOC2__SHIFT = 16 +A6XX_SP_DS_VPC_DEST_REG_OUTLOC3__MASK = 0xff000000 +A6XX_SP_DS_VPC_DEST_REG_OUTLOC3__SHIFT = 24 +REG_A6XX_SP_DS_PROGRAM_COUNTER_OFFSET = 0x0000a85b +REG_A6XX_SP_DS_BASE = 0x0000a85c +REG_A6XX_SP_DS_PVT_MEM_PARAM = 0x0000a85e +A6XX_SP_DS_PVT_MEM_PARAM_MEMSIZEPERITEM__MASK = 0x000000ff +A6XX_SP_DS_PVT_MEM_PARAM_MEMSIZEPERITEM__SHIFT = 0 +A6XX_SP_DS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__MASK = 0xff000000 +A6XX_SP_DS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__SHIFT = 24 +REG_A6XX_SP_DS_PVT_MEM_BASE = 0x0000a85f +REG_A6XX_SP_DS_PVT_MEM_SIZE = 0x0000a861 +A6XX_SP_DS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__MASK = 0x0003ffff +A6XX_SP_DS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__SHIFT = 0 +A6XX_SP_DS_PVT_MEM_SIZE_PERWAVEMEMLAYOUT = 0x80000000 +REG_A6XX_SP_DS_TSIZE = 0x0000a862 +REG_A6XX_SP_DS_CONFIG = 0x0000a863 +A6XX_SP_DS_CONFIG_BINDLESS_TEX = 0x00000001 +A6XX_SP_DS_CONFIG_BINDLESS_SAMP = 0x00000002 +A6XX_SP_DS_CONFIG_BINDLESS_UAV = 0x00000004 +A6XX_SP_DS_CONFIG_BINDLESS_UBO = 0x00000008 +A6XX_SP_DS_CONFIG_ENABLED = 0x00000100 +A6XX_SP_DS_CONFIG_NTEX__MASK = 0x0001fe00 +A6XX_SP_DS_CONFIG_NTEX__SHIFT = 9 +A6XX_SP_DS_CONFIG_NSAMP__MASK = 0x003e0000 +A6XX_SP_DS_CONFIG_NSAMP__SHIFT = 17 +A6XX_SP_DS_CONFIG_NUAV__MASK = 0x1fc00000 +A6XX_SP_DS_CONFIG_NUAV__SHIFT = 22 +REG_A6XX_SP_DS_INSTR_SIZE = 0x0000a864 +REG_A6XX_SP_DS_PVT_MEM_STACK_OFFSET = 0x0000a865 +A6XX_SP_DS_PVT_MEM_STACK_OFFSET_OFFSET__MASK = 0x0007ffff +A6XX_SP_DS_PVT_MEM_STACK_OFFSET_OFFSET__SHIFT = 0 +REG_A7XX_SP_DS_VGS_CNTL = 0x0000a868 +REG_A6XX_SP_GS_CNTL_0 = 0x0000a870 +A6XX_SP_GS_CNTL_0_THREADMODE__MASK = 0x00000001 +A6XX_SP_GS_CNTL_0_THREADMODE__SHIFT = 0 +A6XX_SP_GS_CNTL_0_HALFREGFOOTPRINT__MASK = 0x0000007e +A6XX_SP_GS_CNTL_0_HALFREGFOOTPRINT__SHIFT = 1 +A6XX_SP_GS_CNTL_0_FULLREGFOOTPRINT__MASK = 0x00001f80 +A6XX_SP_GS_CNTL_0_FULLREGFOOTPRINT__SHIFT = 7 +A6XX_SP_GS_CNTL_0_UNK13 = 0x00002000 +A6XX_SP_GS_CNTL_0_BRANCHSTACK__MASK = 0x000fc000 +A6XX_SP_GS_CNTL_0_BRANCHSTACK__SHIFT = 14 +A6XX_SP_GS_CNTL_0_EARLYPREAMBLE = 0x00100000 +REG_A6XX_SP_GS_CNTL_1 = 0x0000a871 +REG_A6XX_SP_GS_BOOLEAN_CF_MASK = 0x0000a872 +REG_A6XX_SP_GS_OUTPUT_CNTL = 0x0000a873 +A6XX_SP_GS_OUTPUT_CNTL_OUT__MASK = 0x0000003f +A6XX_SP_GS_OUTPUT_CNTL_OUT__SHIFT = 0 +A6XX_SP_GS_OUTPUT_CNTL_FLAGS_REGID__MASK = 0x00003fc0 +A6XX_SP_GS_OUTPUT_CNTL_FLAGS_REGID__SHIFT = 6 +REG_A6XX_SP_GS_OUTPUT = lambda i0: (0x0000a874 + 0x1*i0 ) # type: ignore +A6XX_SP_GS_OUTPUT_REG_A_REGID__MASK = 0x000000ff +A6XX_SP_GS_OUTPUT_REG_A_REGID__SHIFT = 0 +A6XX_SP_GS_OUTPUT_REG_A_COMPMASK__MASK = 0x00000f00 +A6XX_SP_GS_OUTPUT_REG_A_COMPMASK__SHIFT = 8 +A6XX_SP_GS_OUTPUT_REG_B_REGID__MASK = 0x00ff0000 +A6XX_SP_GS_OUTPUT_REG_B_REGID__SHIFT = 16 +A6XX_SP_GS_OUTPUT_REG_B_COMPMASK__MASK = 0x0f000000 +A6XX_SP_GS_OUTPUT_REG_B_COMPMASK__SHIFT = 24 +REG_A6XX_SP_GS_VPC_DEST = lambda i0: (0x0000a884 + 0x1*i0 ) # type: ignore +A6XX_SP_GS_VPC_DEST_REG_OUTLOC0__MASK = 0x000000ff +A6XX_SP_GS_VPC_DEST_REG_OUTLOC0__SHIFT = 0 +A6XX_SP_GS_VPC_DEST_REG_OUTLOC1__MASK = 0x0000ff00 +A6XX_SP_GS_VPC_DEST_REG_OUTLOC1__SHIFT = 8 +A6XX_SP_GS_VPC_DEST_REG_OUTLOC2__MASK = 0x00ff0000 +A6XX_SP_GS_VPC_DEST_REG_OUTLOC2__SHIFT = 16 +A6XX_SP_GS_VPC_DEST_REG_OUTLOC3__MASK = 0xff000000 +A6XX_SP_GS_VPC_DEST_REG_OUTLOC3__SHIFT = 24 +REG_A6XX_SP_GS_PROGRAM_COUNTER_OFFSET = 0x0000a88c +REG_A6XX_SP_GS_BASE = 0x0000a88d +REG_A6XX_SP_GS_PVT_MEM_PARAM = 0x0000a88f +A6XX_SP_GS_PVT_MEM_PARAM_MEMSIZEPERITEM__MASK = 0x000000ff +A6XX_SP_GS_PVT_MEM_PARAM_MEMSIZEPERITEM__SHIFT = 0 +A6XX_SP_GS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__MASK = 0xff000000 +A6XX_SP_GS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__SHIFT = 24 +REG_A6XX_SP_GS_PVT_MEM_BASE = 0x0000a890 +REG_A6XX_SP_GS_PVT_MEM_SIZE = 0x0000a892 +A6XX_SP_GS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__MASK = 0x0003ffff +A6XX_SP_GS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__SHIFT = 0 +A6XX_SP_GS_PVT_MEM_SIZE_PERWAVEMEMLAYOUT = 0x80000000 +REG_A6XX_SP_GS_TSIZE = 0x0000a893 +REG_A6XX_SP_GS_CONFIG = 0x0000a894 +A6XX_SP_GS_CONFIG_BINDLESS_TEX = 0x00000001 +A6XX_SP_GS_CONFIG_BINDLESS_SAMP = 0x00000002 +A6XX_SP_GS_CONFIG_BINDLESS_UAV = 0x00000004 +A6XX_SP_GS_CONFIG_BINDLESS_UBO = 0x00000008 +A6XX_SP_GS_CONFIG_ENABLED = 0x00000100 +A6XX_SP_GS_CONFIG_NTEX__MASK = 0x0001fe00 +A6XX_SP_GS_CONFIG_NTEX__SHIFT = 9 +A6XX_SP_GS_CONFIG_NSAMP__MASK = 0x003e0000 +A6XX_SP_GS_CONFIG_NSAMP__SHIFT = 17 +A6XX_SP_GS_CONFIG_NUAV__MASK = 0x1fc00000 +A6XX_SP_GS_CONFIG_NUAV__SHIFT = 22 +REG_A6XX_SP_GS_INSTR_SIZE = 0x0000a895 +REG_A6XX_SP_GS_PVT_MEM_STACK_OFFSET = 0x0000a896 +A6XX_SP_GS_PVT_MEM_STACK_OFFSET_OFFSET__MASK = 0x0007ffff +A6XX_SP_GS_PVT_MEM_STACK_OFFSET_OFFSET__SHIFT = 0 +REG_A7XX_SP_GS_VGS_CNTL = 0x0000a899 +REG_A6XX_SP_VS_SAMPLER_BASE = 0x0000a8a0 +REG_A6XX_SP_HS_SAMPLER_BASE = 0x0000a8a2 +REG_A6XX_SP_DS_SAMPLER_BASE = 0x0000a8a4 +REG_A6XX_SP_GS_SAMPLER_BASE = 0x0000a8a6 +REG_A6XX_SP_VS_TEXMEMOBJ_BASE = 0x0000a8a8 +REG_A6XX_SP_HS_TEXMEMOBJ_BASE = 0x0000a8aa +REG_A6XX_SP_DS_TEXMEMOBJ_BASE = 0x0000a8ac +REG_A6XX_SP_GS_TEXMEMOBJ_BASE = 0x0000a8ae +REG_A6XX_SP_PS_CNTL_0 = 0x0000a980 +A6XX_SP_PS_CNTL_0_THREADMODE__MASK = 0x00000001 +A6XX_SP_PS_CNTL_0_THREADMODE__SHIFT = 0 +A6XX_SP_PS_CNTL_0_HALFREGFOOTPRINT__MASK = 0x0000007e +A6XX_SP_PS_CNTL_0_HALFREGFOOTPRINT__SHIFT = 1 +A6XX_SP_PS_CNTL_0_FULLREGFOOTPRINT__MASK = 0x00001f80 +A6XX_SP_PS_CNTL_0_FULLREGFOOTPRINT__SHIFT = 7 +A6XX_SP_PS_CNTL_0_UNK13 = 0x00002000 +A6XX_SP_PS_CNTL_0_BRANCHSTACK__MASK = 0x000fc000 +A6XX_SP_PS_CNTL_0_BRANCHSTACK__SHIFT = 14 +A6XX_SP_PS_CNTL_0_THREADSIZE__MASK = 0x00100000 +A6XX_SP_PS_CNTL_0_THREADSIZE__SHIFT = 20 +A6XX_SP_PS_CNTL_0_UNK21 = 0x00200000 +A6XX_SP_PS_CNTL_0_VARYING = 0x00400000 +A6XX_SP_PS_CNTL_0_LODPIXMASK = 0x00800000 +A6XX_SP_PS_CNTL_0_INOUTREGOVERLAP = 0x01000000 +A6XX_SP_PS_CNTL_0_UNK25 = 0x02000000 +A6XX_SP_PS_CNTL_0_PIXLODENABLE = 0x04000000 +A6XX_SP_PS_CNTL_0_UNK27 = 0x08000000 +A6XX_SP_PS_CNTL_0_EARLYPREAMBLE = 0x10000000 +A6XX_SP_PS_CNTL_0_MERGEDREGS = 0x80000000 +REG_A6XX_SP_PS_BOOLEAN_CF_MASK = 0x0000a981 +REG_A6XX_SP_PS_PROGRAM_COUNTER_OFFSET = 0x0000a982 +REG_A6XX_SP_PS_BASE = 0x0000a983 +REG_A6XX_SP_PS_PVT_MEM_PARAM = 0x0000a985 +A6XX_SP_PS_PVT_MEM_PARAM_MEMSIZEPERITEM__MASK = 0x000000ff +A6XX_SP_PS_PVT_MEM_PARAM_MEMSIZEPERITEM__SHIFT = 0 +A6XX_SP_PS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__MASK = 0xff000000 +A6XX_SP_PS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__SHIFT = 24 +REG_A6XX_SP_PS_PVT_MEM_BASE = 0x0000a986 +REG_A6XX_SP_PS_PVT_MEM_SIZE = 0x0000a988 +A6XX_SP_PS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__MASK = 0x0003ffff +A6XX_SP_PS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__SHIFT = 0 +A6XX_SP_PS_PVT_MEM_SIZE_PERWAVEMEMLAYOUT = 0x80000000 +REG_A6XX_SP_BLEND_CNTL = 0x0000a989 +A6XX_SP_BLEND_CNTL_ENABLE_BLEND__MASK = 0x000000ff +A6XX_SP_BLEND_CNTL_ENABLE_BLEND__SHIFT = 0 +A6XX_SP_BLEND_CNTL_UNK8 = 0x00000100 +A6XX_SP_BLEND_CNTL_DUAL_COLOR_IN_ENABLE = 0x00000200 +A6XX_SP_BLEND_CNTL_ALPHA_TO_COVERAGE = 0x00000400 +REG_A6XX_SP_SRGB_CNTL = 0x0000a98a +A6XX_SP_SRGB_CNTL_SRGB_MRT0 = 0x00000001 +A6XX_SP_SRGB_CNTL_SRGB_MRT1 = 0x00000002 +A6XX_SP_SRGB_CNTL_SRGB_MRT2 = 0x00000004 +A6XX_SP_SRGB_CNTL_SRGB_MRT3 = 0x00000008 +A6XX_SP_SRGB_CNTL_SRGB_MRT4 = 0x00000010 +A6XX_SP_SRGB_CNTL_SRGB_MRT5 = 0x00000020 +A6XX_SP_SRGB_CNTL_SRGB_MRT6 = 0x00000040 +A6XX_SP_SRGB_CNTL_SRGB_MRT7 = 0x00000080 +REG_A6XX_SP_PS_OUTPUT_MASK = 0x0000a98b +A6XX_SP_PS_OUTPUT_MASK_RT0__MASK = 0x0000000f +A6XX_SP_PS_OUTPUT_MASK_RT0__SHIFT = 0 +A6XX_SP_PS_OUTPUT_MASK_RT1__MASK = 0x000000f0 +A6XX_SP_PS_OUTPUT_MASK_RT1__SHIFT = 4 +A6XX_SP_PS_OUTPUT_MASK_RT2__MASK = 0x00000f00 +A6XX_SP_PS_OUTPUT_MASK_RT2__SHIFT = 8 +A6XX_SP_PS_OUTPUT_MASK_RT3__MASK = 0x0000f000 +A6XX_SP_PS_OUTPUT_MASK_RT3__SHIFT = 12 +A6XX_SP_PS_OUTPUT_MASK_RT4__MASK = 0x000f0000 +A6XX_SP_PS_OUTPUT_MASK_RT4__SHIFT = 16 +A6XX_SP_PS_OUTPUT_MASK_RT5__MASK = 0x00f00000 +A6XX_SP_PS_OUTPUT_MASK_RT5__SHIFT = 20 +A6XX_SP_PS_OUTPUT_MASK_RT6__MASK = 0x0f000000 +A6XX_SP_PS_OUTPUT_MASK_RT6__SHIFT = 24 +A6XX_SP_PS_OUTPUT_MASK_RT7__MASK = 0xf0000000 +A6XX_SP_PS_OUTPUT_MASK_RT7__SHIFT = 28 +REG_A6XX_SP_PS_OUTPUT_CNTL = 0x0000a98c +A6XX_SP_PS_OUTPUT_CNTL_DUAL_COLOR_IN_ENABLE = 0x00000001 +A6XX_SP_PS_OUTPUT_CNTL_DEPTH_REGID__MASK = 0x0000ff00 +A6XX_SP_PS_OUTPUT_CNTL_DEPTH_REGID__SHIFT = 8 +A6XX_SP_PS_OUTPUT_CNTL_SAMPMASK_REGID__MASK = 0x00ff0000 +A6XX_SP_PS_OUTPUT_CNTL_SAMPMASK_REGID__SHIFT = 16 +A6XX_SP_PS_OUTPUT_CNTL_STENCILREF_REGID__MASK = 0xff000000 +A6XX_SP_PS_OUTPUT_CNTL_STENCILREF_REGID__SHIFT = 24 +REG_A6XX_SP_PS_MRT_CNTL = 0x0000a98d +A6XX_SP_PS_MRT_CNTL_MRT__MASK = 0x0000000f +A6XX_SP_PS_MRT_CNTL_MRT__SHIFT = 0 +REG_A6XX_SP_PS_OUTPUT = lambda i0: (0x0000a98e + 0x1*i0 ) # type: ignore +A6XX_SP_PS_OUTPUT_REG_REGID__MASK = 0x000000ff +A6XX_SP_PS_OUTPUT_REG_REGID__SHIFT = 0 +A6XX_SP_PS_OUTPUT_REG_HALF_PRECISION = 0x00000100 +REG_A6XX_SP_PS_MRT = lambda i0: (0x0000a996 + 0x1*i0 ) # type: ignore +A6XX_SP_PS_MRT_REG_COLOR_FORMAT__MASK = 0x000000ff +A6XX_SP_PS_MRT_REG_COLOR_FORMAT__SHIFT = 0 +A6XX_SP_PS_MRT_REG_COLOR_SINT = 0x00000100 +A6XX_SP_PS_MRT_REG_COLOR_UINT = 0x00000200 +A6XX_SP_PS_MRT_REG_UNK10 = 0x00000400 +REG_A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL = 0x0000a99e +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_COUNT__MASK = 0x00000007 +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_COUNT__SHIFT = 0 +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_IJ_WRITE_DISABLE = 0x00000008 +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_ENDOFQUAD = 0x00000010 +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_WRITE_COLOR_TO_OUTPUT = 0x00000020 +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_CONSTSLOTID__MASK = 0x00007fc0 +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_CONSTSLOTID__SHIFT = 6 +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_CONSTSLOTID4COORD__MASK = 0x01ff0000 +A6XX_SP_PS_INITIAL_TEX_LOAD_CNTL_CONSTSLOTID4COORD__SHIFT = 16 +REG_A6XX_SP_PS_INITIAL_TEX_LOAD = lambda i0: (0x0000a99f + 0x1*i0 ) # type: ignore +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_SRC__MASK = 0x0000007f +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_SRC__SHIFT = 0 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_SAMP_ID__MASK = 0x00000780 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_SAMP_ID__SHIFT = 7 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_TEX_ID__MASK = 0x0000f800 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_TEX_ID__SHIFT = 11 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_DST__MASK = 0x003f0000 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_DST__SHIFT = 16 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_WRMASK__MASK = 0x03c00000 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_WRMASK__SHIFT = 22 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_HALF = 0x04000000 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_UNK27 = 0x08000000 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_BINDLESS = 0x10000000 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_CMD__MASK = 0xe0000000 +A6XX_SP_PS_INITIAL_TEX_LOAD_CMD_CMD__SHIFT = 29 +REG_A7XX_SP_PS_INITIAL_TEX_LOAD = lambda i0: (0x0000a99f + 0x1*i0 ) # type: ignore +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_SRC__MASK = 0x0000007f +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_SRC__SHIFT = 0 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_SAMP_ID__MASK = 0x00000380 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_SAMP_ID__SHIFT = 7 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_TEX_ID__MASK = 0x00001c00 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_TEX_ID__SHIFT = 10 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_DST__MASK = 0x0007e000 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_DST__SHIFT = 13 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_WRMASK__MASK = 0x00780000 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_WRMASK__SHIFT = 19 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_HALF = 0x00800000 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_BINDLESS = 0x02000000 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_CMD__MASK = 0x3c000000 +A7XX_SP_PS_INITIAL_TEX_LOAD_CMD_CMD__SHIFT = 26 +REG_A6XX_SP_PS_INITIAL_TEX_INDEX = lambda i0: (0x0000a9a3 + 0x1*i0 ) # type: ignore +A6XX_SP_PS_INITIAL_TEX_INDEX_CMD_SAMP_ID__MASK = 0x0000ffff +A6XX_SP_PS_INITIAL_TEX_INDEX_CMD_SAMP_ID__SHIFT = 0 +A6XX_SP_PS_INITIAL_TEX_INDEX_CMD_TEX_ID__MASK = 0xffff0000 +A6XX_SP_PS_INITIAL_TEX_INDEX_CMD_TEX_ID__SHIFT = 16 +REG_A6XX_SP_PS_TSIZE = 0x0000a9a7 +REG_A6XX_SP_UNKNOWN_A9A8 = 0x0000a9a8 +REG_A6XX_SP_PS_PVT_MEM_STACK_OFFSET = 0x0000a9a9 +A6XX_SP_PS_PVT_MEM_STACK_OFFSET_OFFSET__MASK = 0x0007ffff +A6XX_SP_PS_PVT_MEM_STACK_OFFSET_OFFSET__SHIFT = 0 +REG_A7XX_SP_PS_UNKNOWN_A9AB = 0x0000a9ab +REG_A6XX_SP_CS_CNTL_0 = 0x0000a9b0 +A6XX_SP_CS_CNTL_0_THREADMODE__MASK = 0x00000001 +A6XX_SP_CS_CNTL_0_THREADMODE__SHIFT = 0 +A6XX_SP_CS_CNTL_0_HALFREGFOOTPRINT__MASK = 0x0000007e +A6XX_SP_CS_CNTL_0_HALFREGFOOTPRINT__SHIFT = 1 +A6XX_SP_CS_CNTL_0_FULLREGFOOTPRINT__MASK = 0x00001f80 +A6XX_SP_CS_CNTL_0_FULLREGFOOTPRINT__SHIFT = 7 +A6XX_SP_CS_CNTL_0_UNK13 = 0x00002000 +A6XX_SP_CS_CNTL_0_BRANCHSTACK__MASK = 0x000fc000 +A6XX_SP_CS_CNTL_0_BRANCHSTACK__SHIFT = 14 +A6XX_SP_CS_CNTL_0_THREADSIZE__MASK = 0x00100000 +A6XX_SP_CS_CNTL_0_THREADSIZE__SHIFT = 20 +A6XX_SP_CS_CNTL_0_UNK21 = 0x00200000 +A6XX_SP_CS_CNTL_0_UNK22 = 0x00400000 +A6XX_SP_CS_CNTL_0_EARLYPREAMBLE = 0x00800000 +A6XX_SP_CS_CNTL_0_MERGEDREGS = 0x80000000 +REG_A6XX_SP_CS_CNTL_1 = 0x0000a9b1 +A6XX_SP_CS_CNTL_1_SHARED_SIZE__MASK = 0x0000001f +A6XX_SP_CS_CNTL_1_SHARED_SIZE__SHIFT = 0 +A6XX_SP_CS_CNTL_1_CONSTANTRAMMODE__MASK = 0x00000060 +A6XX_SP_CS_CNTL_1_CONSTANTRAMMODE__SHIFT = 5 +REG_A6XX_SP_CS_BOOLEAN_CF_MASK = 0x0000a9b2 +REG_A6XX_SP_CS_PROGRAM_COUNTER_OFFSET = 0x0000a9b3 +REG_A6XX_SP_CS_BASE = 0x0000a9b4 +REG_A6XX_SP_CS_PVT_MEM_PARAM = 0x0000a9b6 +A6XX_SP_CS_PVT_MEM_PARAM_MEMSIZEPERITEM__MASK = 0x000000ff +A6XX_SP_CS_PVT_MEM_PARAM_MEMSIZEPERITEM__SHIFT = 0 +A6XX_SP_CS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__MASK = 0xff000000 +A6XX_SP_CS_PVT_MEM_PARAM_HWSTACKSIZEPERTHREAD__SHIFT = 24 +REG_A6XX_SP_CS_PVT_MEM_BASE = 0x0000a9b7 +REG_A6XX_SP_CS_PVT_MEM_SIZE = 0x0000a9b9 +A6XX_SP_CS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__MASK = 0x0003ffff +A6XX_SP_CS_PVT_MEM_SIZE_TOTALPVTMEMSIZE__SHIFT = 0 +A6XX_SP_CS_PVT_MEM_SIZE_PERWAVEMEMLAYOUT = 0x80000000 +REG_A6XX_SP_CS_TSIZE = 0x0000a9ba +REG_A6XX_SP_CS_CONFIG = 0x0000a9bb +A6XX_SP_CS_CONFIG_BINDLESS_TEX = 0x00000001 +A6XX_SP_CS_CONFIG_BINDLESS_SAMP = 0x00000002 +A6XX_SP_CS_CONFIG_BINDLESS_UAV = 0x00000004 +A6XX_SP_CS_CONFIG_BINDLESS_UBO = 0x00000008 +A6XX_SP_CS_CONFIG_ENABLED = 0x00000100 +A6XX_SP_CS_CONFIG_NTEX__MASK = 0x0001fe00 +A6XX_SP_CS_CONFIG_NTEX__SHIFT = 9 +A6XX_SP_CS_CONFIG_NSAMP__MASK = 0x003e0000 +A6XX_SP_CS_CONFIG_NSAMP__SHIFT = 17 +A6XX_SP_CS_CONFIG_NUAV__MASK = 0x1fc00000 +A6XX_SP_CS_CONFIG_NUAV__SHIFT = 22 +REG_A6XX_SP_CS_INSTR_SIZE = 0x0000a9bc +REG_A6XX_SP_CS_PVT_MEM_STACK_OFFSET = 0x0000a9bd +A6XX_SP_CS_PVT_MEM_STACK_OFFSET_OFFSET__MASK = 0x0007ffff +A6XX_SP_CS_PVT_MEM_STACK_OFFSET_OFFSET__SHIFT = 0 +REG_A7XX_SP_CS_UNKNOWN_A9BE = 0x0000a9be +REG_A7XX_SP_CS_VGS_CNTL = 0x0000a9c5 +REG_A6XX_SP_CS_WIE_CNTL_0 = 0x0000a9c2 +A6XX_SP_CS_WIE_CNTL_0_WGIDCONSTID__MASK = 0x000000ff +A6XX_SP_CS_WIE_CNTL_0_WGIDCONSTID__SHIFT = 0 +A6XX_SP_CS_WIE_CNTL_0_WGSIZECONSTID__MASK = 0x0000ff00 +A6XX_SP_CS_WIE_CNTL_0_WGSIZECONSTID__SHIFT = 8 +A6XX_SP_CS_WIE_CNTL_0_WGOFFSETCONSTID__MASK = 0x00ff0000 +A6XX_SP_CS_WIE_CNTL_0_WGOFFSETCONSTID__SHIFT = 16 +A6XX_SP_CS_WIE_CNTL_0_LOCALIDREGID__MASK = 0xff000000 +A6XX_SP_CS_WIE_CNTL_0_LOCALIDREGID__SHIFT = 24 +REG_A6XX_SP_CS_WIE_CNTL_1 = 0x0000a9c3 +A6XX_SP_CS_WIE_CNTL_1_LINEARLOCALIDREGID__MASK = 0x000000ff +A6XX_SP_CS_WIE_CNTL_1_LINEARLOCALIDREGID__SHIFT = 0 +A6XX_SP_CS_WIE_CNTL_1_SINGLE_SP_CORE = 0x00000100 +A6XX_SP_CS_WIE_CNTL_1_THREADSIZE__MASK = 0x00000200 +A6XX_SP_CS_WIE_CNTL_1_THREADSIZE__SHIFT = 9 +A6XX_SP_CS_WIE_CNTL_1_THREADSIZE_SCALAR = 0x00000400 +REG_A7XX_SP_CS_WIE_CNTL_1 = 0x0000a9c3 +A7XX_SP_CS_WIE_CNTL_1_LINEARLOCALIDREGID__MASK = 0x000000ff +A7XX_SP_CS_WIE_CNTL_1_LINEARLOCALIDREGID__SHIFT = 0 +A7XX_SP_CS_WIE_CNTL_1_THREADSIZE__MASK = 0x00000100 +A7XX_SP_CS_WIE_CNTL_1_THREADSIZE__SHIFT = 8 +A7XX_SP_CS_WIE_CNTL_1_THREADSIZE_SCALAR = 0x00000200 +A7XX_SP_CS_WIE_CNTL_1_WORKITEMRASTORDER__MASK = 0x00008000 +A7XX_SP_CS_WIE_CNTL_1_WORKITEMRASTORDER__SHIFT = 15 +REG_A6XX_SP_PS_SAMPLER_BASE = 0x0000a9e0 +REG_A6XX_SP_CS_SAMPLER_BASE = 0x0000a9e2 +REG_A6XX_SP_PS_TEXMEMOBJ_BASE = 0x0000a9e4 +REG_A6XX_SP_CS_TEXMEMOBJ_BASE = 0x0000a9e6 +REG_A6XX_SP_CS_BINDLESS_BASE = lambda i0: (0x0000a9e8 + 0x2*i0 ) # type: ignore +A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK = 0x00000003 +A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT = 0 +A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK = 0xfffffffffffffffc +A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT = 2 +REG_A7XX_SP_CS_BINDLESS_BASE = lambda i0: (0x0000a9e8 + 0x2*i0 ) # type: ignore +A7XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK = 0x00000003 +A7XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT = 0 +A7XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK = 0xfffffffffffffffc +A7XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT = 2 +REG_A6XX_SP_CS_UAV_BASE = 0x0000a9f2 +REG_A7XX_SP_CS_UAV_BASE = 0x0000a9f8 +REG_A6XX_SP_CS_USIZE = 0x0000aa00 +REG_A7XX_SP_PS_VGS_CNTL = 0x0000aa01 +REG_A7XX_SP_PS_OUTPUT_CONST_CNTL = 0x0000aa02 +A7XX_SP_PS_OUTPUT_CONST_CNTL_ENABLED = 0x00000001 +REG_A7XX_SP_PS_OUTPUT_CONST_MASK = 0x0000aa03 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT0__MASK = 0x0000000f +A7XX_SP_PS_OUTPUT_CONST_MASK_RT0__SHIFT = 0 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT1__MASK = 0x000000f0 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT1__SHIFT = 4 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT2__MASK = 0x00000f00 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT2__SHIFT = 8 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT3__MASK = 0x0000f000 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT3__SHIFT = 12 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT4__MASK = 0x000f0000 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT4__SHIFT = 16 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT5__MASK = 0x00f00000 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT5__SHIFT = 20 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT6__MASK = 0x0f000000 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT6__SHIFT = 24 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT7__MASK = 0xf0000000 +A7XX_SP_PS_OUTPUT_CONST_MASK_RT7__SHIFT = 28 +REG_A6XX_SP_UNKNOWN_AAF2 = 0x0000aaf2 +REG_A6XX_SP_MODE_CNTL = 0x0000ab00 +A6XX_SP_MODE_CNTL_CONSTANT_DEMOTION_ENABLE = 0x00000001 +A6XX_SP_MODE_CNTL_ISAMMODE__MASK = 0x00000006 +A6XX_SP_MODE_CNTL_ISAMMODE__SHIFT = 1 +A6XX_SP_MODE_CNTL_SHARED_CONSTS_ENABLE = 0x00000008 +REG_A7XX_SP_UNKNOWN_AB01 = 0x0000ab01 +REG_A7XX_SP_UNKNOWN_AB02 = 0x0000ab02 +REG_A6XX_SP_PS_CONFIG = 0x0000ab04 +A6XX_SP_PS_CONFIG_BINDLESS_TEX = 0x00000001 +A6XX_SP_PS_CONFIG_BINDLESS_SAMP = 0x00000002 +A6XX_SP_PS_CONFIG_BINDLESS_UAV = 0x00000004 +A6XX_SP_PS_CONFIG_BINDLESS_UBO = 0x00000008 +A6XX_SP_PS_CONFIG_ENABLED = 0x00000100 +A6XX_SP_PS_CONFIG_NTEX__MASK = 0x0001fe00 +A6XX_SP_PS_CONFIG_NTEX__SHIFT = 9 +A6XX_SP_PS_CONFIG_NSAMP__MASK = 0x003e0000 +A6XX_SP_PS_CONFIG_NSAMP__SHIFT = 17 +A6XX_SP_PS_CONFIG_NUAV__MASK = 0x1fc00000 +A6XX_SP_PS_CONFIG_NUAV__SHIFT = 22 +REG_A6XX_SP_PS_INSTR_SIZE = 0x0000ab05 +REG_A6XX_SP_GFX_BINDLESS_BASE = lambda i0: (0x0000ab10 + 0x2*i0 ) # type: ignore +A6XX_SP_GFX_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK = 0x00000003 +A6XX_SP_GFX_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT = 0 +A6XX_SP_GFX_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK = 0xfffffffffffffffc +A6XX_SP_GFX_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT = 2 +REG_A7XX_SP_GFX_BINDLESS_BASE = lambda i0: (0x0000ab0a + 0x2*i0 ) # type: ignore +A7XX_SP_GFX_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK = 0x00000003 +A7XX_SP_GFX_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT = 0 +A7XX_SP_GFX_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK = 0xfffffffffffffffc +A7XX_SP_GFX_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT = 2 +REG_A6XX_SP_GFX_UAV_BASE = 0x0000ab1a +REG_A6XX_SP_GFX_USIZE = 0x0000ab20 +REG_A7XX_SP_UNKNOWN_AB22 = 0x0000ab22 +REG_A6XX_SP_A2D_OUTPUT_INFO = 0x0000acc0 +A6XX_SP_A2D_OUTPUT_INFO_HALF_PRECISION = 0x00000001 +A6XX_SP_A2D_OUTPUT_INFO_IFMT_TYPE__MASK = 0x00000006 +A6XX_SP_A2D_OUTPUT_INFO_IFMT_TYPE__SHIFT = 1 +A6XX_SP_A2D_OUTPUT_INFO_COLOR_FORMAT__MASK = 0x000007f8 +A6XX_SP_A2D_OUTPUT_INFO_COLOR_FORMAT__SHIFT = 3 +A6XX_SP_A2D_OUTPUT_INFO_SRGB = 0x00000800 +A6XX_SP_A2D_OUTPUT_INFO_MASK__MASK = 0x0000f000 +A6XX_SP_A2D_OUTPUT_INFO_MASK__SHIFT = 12 +REG_A7XX_SP_A2D_OUTPUT_INFO = 0x0000a9bf +A7XX_SP_A2D_OUTPUT_INFO_HALF_PRECISION = 0x00000001 +A7XX_SP_A2D_OUTPUT_INFO_IFMT_TYPE__MASK = 0x00000006 +A7XX_SP_A2D_OUTPUT_INFO_IFMT_TYPE__SHIFT = 1 +A7XX_SP_A2D_OUTPUT_INFO_COLOR_FORMAT__MASK = 0x000007f8 +A7XX_SP_A2D_OUTPUT_INFO_COLOR_FORMAT__SHIFT = 3 +A7XX_SP_A2D_OUTPUT_INFO_SRGB = 0x00000800 +A7XX_SP_A2D_OUTPUT_INFO_MASK__MASK = 0x0000f000 +A7XX_SP_A2D_OUTPUT_INFO_MASK__SHIFT = 12 +REG_A6XX_SP_DBG_ECO_CNTL = 0x0000ae00 +REG_A6XX_SP_ADDR_MODE_CNTL = 0x0000ae01 +REG_A6XX_SP_NC_MODE_CNTL = 0x0000ae02 +REG_A6XX_SP_CHICKEN_BITS = 0x0000ae03 +REG_A6XX_SP_NC_MODE_CNTL_2 = 0x0000ae04 +A6XX_SP_NC_MODE_CNTL_2_F16_NO_INF = 0x00000008 +REG_A7XX_SP_UNKNOWN_AE06 = 0x0000ae06 +REG_A7XX_SP_CHICKEN_BITS_1 = 0x0000ae08 +REG_A7XX_SP_CHICKEN_BITS_2 = 0x0000ae09 +REG_A7XX_SP_CHICKEN_BITS_3 = 0x0000ae0a +REG_A6XX_SP_PERFCTR_SHADER_MASK = 0x0000ae0f +A6XX_SP_PERFCTR_SHADER_MASK_VS = 0x00000001 +A6XX_SP_PERFCTR_SHADER_MASK_HS = 0x00000002 +A6XX_SP_PERFCTR_SHADER_MASK_DS = 0x00000004 +A6XX_SP_PERFCTR_SHADER_MASK_GS = 0x00000008 +A6XX_SP_PERFCTR_SHADER_MASK_FS = 0x00000010 +A6XX_SP_PERFCTR_SHADER_MASK_CS = 0x00000020 +REG_A6XX_SP_PERFCTR_SP_SEL = lambda i0: (0x0000ae10 + 0x1*i0 ) # type: ignore +REG_A7XX_SP_PERFCTR_HLSQ_SEL = lambda i0: (0x0000ae60 + 0x1*i0 ) # type: ignore +REG_A7XX_SP_UNKNOWN_AE6A = 0x0000ae6a +REG_A7XX_SP_UNKNOWN_AE6B = 0x0000ae6b +REG_A7XX_SP_HLSQ_DBG_ECO_CNTL = 0x0000ae6c +REG_A7XX_SP_READ_SEL = 0x0000ae6d +A7XX_SP_READ_SEL_LOCATION__MASK = 0x000c0000 +A7XX_SP_READ_SEL_LOCATION__SHIFT = 18 +A7XX_SP_READ_SEL_PIPE__MASK = 0x00030000 +A7XX_SP_READ_SEL_PIPE__SHIFT = 16 +A7XX_SP_READ_SEL_STATETYPE__MASK = 0x0000ff00 +A7XX_SP_READ_SEL_STATETYPE__SHIFT = 8 +A7XX_SP_READ_SEL_USPTP__MASK = 0x000000f0 +A7XX_SP_READ_SEL_USPTP__SHIFT = 4 +A7XX_SP_READ_SEL_SPTP__MASK = 0x0000000f +A7XX_SP_READ_SEL_SPTP__SHIFT = 0 +REG_A7XX_SP_DBG_CNTL = 0x0000ae71 +REG_A7XX_SP_UNKNOWN_AE73 = 0x0000ae73 +REG_A7XX_SP_PERFCTR_SP_SEL = lambda i0: (0x0000ae80 + 0x1*i0 ) # type: ignore +REG_A6XX_SP_CONTEXT_SWITCH_GFX_PREEMPTION_SAFE_MODE = 0x0000be22 +REG_A6XX_TPL1_CS_BORDER_COLOR_BASE = 0x0000b180 +REG_A6XX_SP_UNKNOWN_B182 = 0x0000b182 +REG_A6XX_SP_UNKNOWN_B183 = 0x0000b183 +REG_A6XX_SP_UNKNOWN_B190 = 0x0000b190 +REG_A6XX_SP_UNKNOWN_B191 = 0x0000b191 +REG_A6XX_TPL1_RAS_MSAA_CNTL = 0x0000b300 +A6XX_TPL1_RAS_MSAA_CNTL_SAMPLES__MASK = 0x00000003 +A6XX_TPL1_RAS_MSAA_CNTL_SAMPLES__SHIFT = 0 +A6XX_TPL1_RAS_MSAA_CNTL_UNK2__MASK = 0x0000000c +A6XX_TPL1_RAS_MSAA_CNTL_UNK2__SHIFT = 2 +REG_A6XX_TPL1_DEST_MSAA_CNTL = 0x0000b301 +A6XX_TPL1_DEST_MSAA_CNTL_SAMPLES__MASK = 0x00000003 +A6XX_TPL1_DEST_MSAA_CNTL_SAMPLES__SHIFT = 0 +A6XX_TPL1_DEST_MSAA_CNTL_MSAA_DISABLE = 0x00000004 +REG_A6XX_TPL1_GFX_BORDER_COLOR_BASE = 0x0000b302 +REG_A6XX_TPL1_MSAA_SAMPLE_POS_CNTL = 0x0000b304 +A6XX_TPL1_MSAA_SAMPLE_POS_CNTL_UNK0 = 0x00000001 +A6XX_TPL1_MSAA_SAMPLE_POS_CNTL_LOCATION_ENABLE = 0x00000002 +REG_A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0 = 0x0000b305 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_X__MASK = 0x0000000f +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_X__SHIFT = 0 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_Y__MASK = 0x000000f0 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_0_Y__SHIFT = 4 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_X__MASK = 0x00000f00 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_X__SHIFT = 8 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_Y__MASK = 0x0000f000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_1_Y__SHIFT = 12 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_X__MASK = 0x000f0000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_X__SHIFT = 16 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_Y__MASK = 0x00f00000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_2_Y__SHIFT = 20 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_X__MASK = 0x0f000000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_X__SHIFT = 24 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_Y__MASK = 0xf0000000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_0_SAMPLE_3_Y__SHIFT = 28 +REG_A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1 = 0x0000b306 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_X__MASK = 0x0000000f +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_X__SHIFT = 0 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_Y__MASK = 0x000000f0 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_0_Y__SHIFT = 4 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_X__MASK = 0x00000f00 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_X__SHIFT = 8 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_Y__MASK = 0x0000f000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_1_Y__SHIFT = 12 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_X__MASK = 0x000f0000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_X__SHIFT = 16 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_Y__MASK = 0x00f00000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_2_Y__SHIFT = 20 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_X__MASK = 0x0f000000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_X__SHIFT = 24 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_Y__MASK = 0xf0000000 +A6XX_TPL1_PROGRAMMABLE_MSAA_POS_1_SAMPLE_3_Y__SHIFT = 28 +REG_A6XX_TPL1_WINDOW_OFFSET = 0x0000b307 +A6XX_TPL1_WINDOW_OFFSET_X__MASK = 0x00003fff +A6XX_TPL1_WINDOW_OFFSET_X__SHIFT = 0 +A6XX_TPL1_WINDOW_OFFSET_Y__MASK = 0x3fff0000 +A6XX_TPL1_WINDOW_OFFSET_Y__SHIFT = 16 +REG_A6XX_TPL1_MODE_CNTL = 0x0000b309 +A6XX_TPL1_MODE_CNTL_ISAMMODE__MASK = 0x00000003 +A6XX_TPL1_MODE_CNTL_ISAMMODE__SHIFT = 0 +A6XX_TPL1_MODE_CNTL_TEXCOORDROUNDMODE__MASK = 0x00000004 +A6XX_TPL1_MODE_CNTL_TEXCOORDROUNDMODE__SHIFT = 2 +A6XX_TPL1_MODE_CNTL_NEARESTMIPSNAP__MASK = 0x00000020 +A6XX_TPL1_MODE_CNTL_NEARESTMIPSNAP__SHIFT = 5 +A6XX_TPL1_MODE_CNTL_DESTDATATYPEOVERRIDE = 0x00000080 +REG_A7XX_SP_UNKNOWN_B310 = 0x0000b310 +REG_A6XX_TPL1_A2D_SRC_TEXTURE_INFO = 0x0000b4c0 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_COLOR_FORMAT__MASK = 0x000000ff +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_COLOR_FORMAT__SHIFT = 0 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_TILE_MODE__MASK = 0x00000300 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_TILE_MODE__SHIFT = 8 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_COLOR_SWAP__MASK = 0x00000c00 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_COLOR_SWAP__SHIFT = 10 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_FLAGS = 0x00001000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_SRGB = 0x00002000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_SAMPLES__MASK = 0x0000c000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_SAMPLES__SHIFT = 14 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_FILTER = 0x00010000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK17 = 0x00020000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_SAMPLES_AVERAGE = 0x00040000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK19 = 0x00080000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK20 = 0x00100000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK21 = 0x00200000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK22 = 0x00400000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK23__MASK = 0x07800000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK23__SHIFT = 23 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK28 = 0x10000000 +A6XX_TPL1_A2D_SRC_TEXTURE_INFO_MUTABLEEN = 0x20000000 +REG_A6XX_TPL1_A2D_SRC_TEXTURE_SIZE = 0x0000b4c1 +A6XX_TPL1_A2D_SRC_TEXTURE_SIZE_WIDTH__MASK = 0x00007fff +A6XX_TPL1_A2D_SRC_TEXTURE_SIZE_WIDTH__SHIFT = 0 +A6XX_TPL1_A2D_SRC_TEXTURE_SIZE_HEIGHT__MASK = 0x3fff8000 +A6XX_TPL1_A2D_SRC_TEXTURE_SIZE_HEIGHT__SHIFT = 15 +REG_A6XX_TPL1_A2D_SRC_TEXTURE_BASE = 0x0000b4c2 +REG_A6XX_TPL1_A2D_SRC_TEXTURE_PITCH = 0x0000b4c4 +A6XX_TPL1_A2D_SRC_TEXTURE_PITCH_UNK0__MASK = 0x000001ff +A6XX_TPL1_A2D_SRC_TEXTURE_PITCH_UNK0__SHIFT = 0 +A6XX_TPL1_A2D_SRC_TEXTURE_PITCH_PITCH__MASK = 0x00fffe00 +A6XX_TPL1_A2D_SRC_TEXTURE_PITCH_PITCH__SHIFT = 9 +REG_A7XX_TPL1_A2D_SRC_TEXTURE_INFO = 0x0000b2c0 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_COLOR_FORMAT__MASK = 0x000000ff +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_COLOR_FORMAT__SHIFT = 0 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_TILE_MODE__MASK = 0x00000300 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_TILE_MODE__SHIFT = 8 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_COLOR_SWAP__MASK = 0x00000c00 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_COLOR_SWAP__SHIFT = 10 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_FLAGS = 0x00001000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_SRGB = 0x00002000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_SAMPLES__MASK = 0x0000c000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_SAMPLES__SHIFT = 14 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_FILTER = 0x00010000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK17 = 0x00020000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_SAMPLES_AVERAGE = 0x00040000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK19 = 0x00080000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK20 = 0x00100000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK21 = 0x00200000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK22 = 0x00400000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK23__MASK = 0x07800000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK23__SHIFT = 23 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_UNK28 = 0x10000000 +A7XX_TPL1_A2D_SRC_TEXTURE_INFO_MUTABLEEN = 0x20000000 +REG_A7XX_TPL1_A2D_SRC_TEXTURE_SIZE = 0x0000b2c1 +A7XX_TPL1_A2D_SRC_TEXTURE_SIZE_WIDTH__MASK = 0x00007fff +A7XX_TPL1_A2D_SRC_TEXTURE_SIZE_WIDTH__SHIFT = 0 +A7XX_TPL1_A2D_SRC_TEXTURE_SIZE_HEIGHT__MASK = 0x3fff8000 +A7XX_TPL1_A2D_SRC_TEXTURE_SIZE_HEIGHT__SHIFT = 15 +REG_A7XX_TPL1_A2D_SRC_TEXTURE_BASE = 0x0000b2c2 +REG_A7XX_TPL1_A2D_SRC_TEXTURE_PITCH = 0x0000b2c4 +A7XX_TPL1_A2D_SRC_TEXTURE_PITCH_PITCH__MASK = 0x00fffff8 +A7XX_TPL1_A2D_SRC_TEXTURE_PITCH_PITCH__SHIFT = 3 +REG_A6XX_TPL1_A2D_SRC_TEXTURE_BASE_1 = 0x0000b4c5 +REG_A6XX_TPL1_A2D_SRC_TEXTURE_PITCH_1 = 0x0000b4c7 +A6XX_TPL1_A2D_SRC_TEXTURE_PITCH_1__MASK = 0x00000fff +A6XX_TPL1_A2D_SRC_TEXTURE_PITCH_1__SHIFT = 0 +REG_A6XX_TPL1_A2D_SRC_TEXTURE_BASE_2 = 0x0000b4c8 +REG_A7XX_TPL1_A2D_SRC_TEXTURE_BASE_1 = 0x0000b2c5 +REG_A7XX_TPL1_A2D_SRC_TEXTURE_PITCH_1 = 0x0000b2c7 +A7XX_TPL1_A2D_SRC_TEXTURE_PITCH_1__MASK = 0x00000fff +A7XX_TPL1_A2D_SRC_TEXTURE_PITCH_1__SHIFT = 0 +REG_A7XX_TPL1_A2D_SRC_TEXTURE_BASE_2 = 0x0000b2c8 +REG_A6XX_TPL1_A2D_SRC_TEXTURE_FLAG_BASE = 0x0000b4ca +REG_A6XX_TPL1_A2D_SRC_TEXTURE_FLAG_PITCH = 0x0000b4cc +A6XX_TPL1_A2D_SRC_TEXTURE_FLAG_PITCH__MASK = 0x000000ff +A6XX_TPL1_A2D_SRC_TEXTURE_FLAG_PITCH__SHIFT = 0 +REG_A7XX_TPL1_A2D_SRC_TEXTURE_FLAG_BASE = 0x0000b2ca +REG_A7XX_TPL1_A2D_SRC_TEXTURE_FLAG_PITCH = 0x0000b2cc +A7XX_TPL1_A2D_SRC_TEXTURE_FLAG_PITCH__MASK = 0x000000ff +A7XX_TPL1_A2D_SRC_TEXTURE_FLAG_PITCH__SHIFT = 0 +REG_A6XX_SP_PS_UNKNOWN_B4CD = 0x0000b4cd +REG_A6XX_SP_PS_UNKNOWN_B4CE = 0x0000b4ce +REG_A6XX_SP_PS_UNKNOWN_B4CF = 0x0000b4cf +REG_A6XX_SP_PS_UNKNOWN_B4D0 = 0x0000b4d0 +REG_A6XX_SP_WINDOW_OFFSET = 0x0000b4d1 +A6XX_SP_WINDOW_OFFSET_X__MASK = 0x00003fff +A6XX_SP_WINDOW_OFFSET_X__SHIFT = 0 +A6XX_SP_WINDOW_OFFSET_Y__MASK = 0x3fff0000 +A6XX_SP_WINDOW_OFFSET_Y__SHIFT = 16 +REG_A7XX_SP_PS_UNKNOWN_B4CD = 0x0000b2cd +REG_A7XX_SP_PS_UNKNOWN_B4CE = 0x0000b2ce +REG_A7XX_SP_PS_UNKNOWN_B4CF = 0x0000b2cf +REG_A7XX_SP_PS_UNKNOWN_B4D0 = 0x0000b2d0 +REG_A7XX_TPL1_A2D_WINDOW_OFFSET = 0x0000b2d1 +A7XX_TPL1_A2D_WINDOW_OFFSET_X__MASK = 0x00003fff +A7XX_TPL1_A2D_WINDOW_OFFSET_X__SHIFT = 0 +A7XX_TPL1_A2D_WINDOW_OFFSET_Y__MASK = 0x3fff0000 +A7XX_TPL1_A2D_WINDOW_OFFSET_Y__SHIFT = 16 +REG_A7XX_TPL1_A2D_BLT_CNTL = 0x0000b2d2 +A7XX_TPL1_A2D_BLT_CNTL_RAW_COPY = 0x00000001 +A7XX_TPL1_A2D_BLT_CNTL_START_OFFSET_TEXELS__MASK = 0x003f0000 +A7XX_TPL1_A2D_BLT_CNTL_START_OFFSET_TEXELS__SHIFT = 16 +A7XX_TPL1_A2D_BLT_CNTL_TYPE__MASK = 0xe0000000 +A7XX_TPL1_A2D_BLT_CNTL_TYPE__SHIFT = 29 +REG_A7XX_SP_WINDOW_OFFSET = 0x0000ab21 +A7XX_SP_WINDOW_OFFSET_X__MASK = 0x00003fff +A7XX_SP_WINDOW_OFFSET_X__SHIFT = 0 +A7XX_SP_WINDOW_OFFSET_Y__MASK = 0x3fff0000 +A7XX_SP_WINDOW_OFFSET_Y__SHIFT = 16 +REG_A6XX_TPL1_DBG_ECO_CNTL = 0x0000b600 +REG_A6XX_TPL1_ADDR_MODE_CNTL = 0x0000b601 +REG_A6XX_TPL1_DBG_ECO_CNTL1 = 0x0000b602 +A6XX_TPL1_DBG_ECO_CNTL1_TP_UBWC_FLAG_HINT = 0x00040000 +REG_A6XX_TPL1_NC_MODE_CNTL = 0x0000b604 +A6XX_TPL1_NC_MODE_CNTL_MODE = 0x00000001 +A6XX_TPL1_NC_MODE_CNTL_LOWER_BIT__MASK = 0x00000006 +A6XX_TPL1_NC_MODE_CNTL_LOWER_BIT__SHIFT = 1 +A6XX_TPL1_NC_MODE_CNTL_MIN_ACCESS_LENGTH = 0x00000008 +A6XX_TPL1_NC_MODE_CNTL_UPPER_BIT__MASK = 0x00000010 +A6XX_TPL1_NC_MODE_CNTL_UPPER_BIT__SHIFT = 4 +A6XX_TPL1_NC_MODE_CNTL_UNK6__MASK = 0x000000c0 +A6XX_TPL1_NC_MODE_CNTL_UNK6__SHIFT = 6 +REG_A6XX_TPL1_UNKNOWN_B605 = 0x0000b605 +REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_0 = 0x0000b608 +REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_1 = 0x0000b609 +REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_2 = 0x0000b60a +REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_3 = 0x0000b60b +REG_A6XX_TPL1_BICUBIC_WEIGHTS_TABLE_4 = 0x0000b60c +REG_A7XX_TPL1_BICUBIC_WEIGHTS_TABLE_0 = 0x0000b608 +REG_A7XX_TPL1_BICUBIC_WEIGHTS_TABLE_1 = 0x0000b609 +REG_A7XX_TPL1_BICUBIC_WEIGHTS_TABLE_2 = 0x0000b60a +REG_A7XX_TPL1_BICUBIC_WEIGHTS_TABLE_3 = 0x0000b60b +REG_A7XX_TPL1_BICUBIC_WEIGHTS_TABLE_4 = 0x0000b60c +REG_A6XX_TPL1_PERFCTR_TP_SEL = lambda i0: (0x0000b610 + 0x1*i0 ) # type: ignore +REG_A7XX_TPL1_PERFCTR_TP_SEL = lambda i0: (0x0000b610 + 0x1*i0 ) # type: ignore +REG_A6XX_SP_VS_CONST_CONFIG = 0x0000b800 +A6XX_SP_VS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A6XX_SP_VS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A6XX_SP_VS_CONST_CONFIG_ENABLED = 0x00000100 +A6XX_SP_VS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A6XX_SP_HS_CONST_CONFIG = 0x0000b801 +A6XX_SP_HS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A6XX_SP_HS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A6XX_SP_HS_CONST_CONFIG_ENABLED = 0x00000100 +A6XX_SP_HS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A6XX_SP_DS_CONST_CONFIG = 0x0000b802 +A6XX_SP_DS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A6XX_SP_DS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A6XX_SP_DS_CONST_CONFIG_ENABLED = 0x00000100 +A6XX_SP_DS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A6XX_SP_GS_CONST_CONFIG = 0x0000b803 +A6XX_SP_GS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A6XX_SP_GS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A6XX_SP_GS_CONST_CONFIG_ENABLED = 0x00000100 +A6XX_SP_GS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A7XX_SP_VS_CONST_CONFIG = 0x0000a827 +A7XX_SP_VS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A7XX_SP_VS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A7XX_SP_VS_CONST_CONFIG_ENABLED = 0x00000100 +A7XX_SP_VS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A7XX_SP_HS_CONST_CONFIG = 0x0000a83f +A7XX_SP_HS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A7XX_SP_HS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A7XX_SP_HS_CONST_CONFIG_ENABLED = 0x00000100 +A7XX_SP_HS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A7XX_SP_DS_CONST_CONFIG = 0x0000a867 +A7XX_SP_DS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A7XX_SP_DS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A7XX_SP_DS_CONST_CONFIG_ENABLED = 0x00000100 +A7XX_SP_DS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A7XX_SP_GS_CONST_CONFIG = 0x0000a898 +A7XX_SP_GS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A7XX_SP_GS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A7XX_SP_GS_CONST_CONFIG_ENABLED = 0x00000100 +A7XX_SP_GS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A7XX_SP_RENDER_CNTL = 0x0000a9aa +A7XX_SP_RENDER_CNTL_FS_DISABLE = 0x00000001 +REG_A7XX_SP_DITHER_CNTL = 0x0000a9ac +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT0__MASK = 0x00000003 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT0__SHIFT = 0 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT1__MASK = 0x0000000c +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT1__SHIFT = 2 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT2__MASK = 0x00000030 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT2__SHIFT = 4 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT3__MASK = 0x000000c0 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT3__SHIFT = 6 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT4__MASK = 0x00000300 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT4__SHIFT = 8 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT5__MASK = 0x00000c00 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT5__SHIFT = 10 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT6__MASK = 0x00003000 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT6__SHIFT = 12 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT7__MASK = 0x0000c000 +A7XX_SP_DITHER_CNTL_DITHER_MODE_MRT7__SHIFT = 14 +REG_A7XX_SP_VRS_CONFIG = 0x0000a9ad +A7XX_SP_VRS_CONFIG_PIPELINE_FSR_ENABLE = 0x00000001 +A7XX_SP_VRS_CONFIG_ATTACHMENT_FSR_ENABLE = 0x00000002 +A7XX_SP_VRS_CONFIG_PRIMITIVE_FSR_ENABLE = 0x00000008 +REG_A7XX_SP_PS_CNTL_1 = 0x0000a9ae +A7XX_SP_PS_CNTL_1_SYSVAL_REGS_COUNT__MASK = 0x000000ff +A7XX_SP_PS_CNTL_1_SYSVAL_REGS_COUNT__SHIFT = 0 +A7XX_SP_PS_CNTL_1_UNK8 = 0x00000100 +A7XX_SP_PS_CNTL_1_UNK9 = 0x00000200 +REG_A6XX_HLSQ_LOAD_STATE_GEOM_CMD = 0x0000b820 +REG_A6XX_HLSQ_LOAD_STATE_GEOM_EXT_SRC_ADDR = 0x0000b821 +REG_A6XX_HLSQ_LOAD_STATE_GEOM_DATA = 0x0000b823 +REG_A6XX_SP_PS_WAVE_CNTL = 0x0000b980 +A6XX_SP_PS_WAVE_CNTL_THREADSIZE__MASK = 0x00000001 +A6XX_SP_PS_WAVE_CNTL_THREADSIZE__SHIFT = 0 +A6XX_SP_PS_WAVE_CNTL_VARYINGS = 0x00000002 +A6XX_SP_PS_WAVE_CNTL_UNK2__MASK = 0x00000ffc +A6XX_SP_PS_WAVE_CNTL_UNK2__SHIFT = 2 +REG_A6XX_HLSQ_UNKNOWN_B981 = 0x0000b981 +REG_A6XX_SP_LB_PARAM_LIMIT = 0x0000b982 +A6XX_SP_LB_PARAM_LIMIT_PRIMALLOCTHRESHOLD__MASK = 0x00000007 +A6XX_SP_LB_PARAM_LIMIT_PRIMALLOCTHRESHOLD__SHIFT = 0 +REG_A6XX_SP_REG_PROG_ID_0 = 0x0000b983 +A6XX_SP_REG_PROG_ID_0_FACEREGID__MASK = 0x000000ff +A6XX_SP_REG_PROG_ID_0_FACEREGID__SHIFT = 0 +A6XX_SP_REG_PROG_ID_0_SAMPLEID__MASK = 0x0000ff00 +A6XX_SP_REG_PROG_ID_0_SAMPLEID__SHIFT = 8 +A6XX_SP_REG_PROG_ID_0_SAMPLEMASK__MASK = 0x00ff0000 +A6XX_SP_REG_PROG_ID_0_SAMPLEMASK__SHIFT = 16 +A6XX_SP_REG_PROG_ID_0_CENTERRHW__MASK = 0xff000000 +A6XX_SP_REG_PROG_ID_0_CENTERRHW__SHIFT = 24 +REG_A6XX_SP_REG_PROG_ID_1 = 0x0000b984 +A6XX_SP_REG_PROG_ID_1_IJ_PERSP_PIXEL__MASK = 0x000000ff +A6XX_SP_REG_PROG_ID_1_IJ_PERSP_PIXEL__SHIFT = 0 +A6XX_SP_REG_PROG_ID_1_IJ_LINEAR_PIXEL__MASK = 0x0000ff00 +A6XX_SP_REG_PROG_ID_1_IJ_LINEAR_PIXEL__SHIFT = 8 +A6XX_SP_REG_PROG_ID_1_IJ_PERSP_CENTROID__MASK = 0x00ff0000 +A6XX_SP_REG_PROG_ID_1_IJ_PERSP_CENTROID__SHIFT = 16 +A6XX_SP_REG_PROG_ID_1_IJ_LINEAR_CENTROID__MASK = 0xff000000 +A6XX_SP_REG_PROG_ID_1_IJ_LINEAR_CENTROID__SHIFT = 24 +REG_A6XX_SP_REG_PROG_ID_2 = 0x0000b985 +A6XX_SP_REG_PROG_ID_2_IJ_PERSP_SAMPLE__MASK = 0x000000ff +A6XX_SP_REG_PROG_ID_2_IJ_PERSP_SAMPLE__SHIFT = 0 +A6XX_SP_REG_PROG_ID_2_IJ_LINEAR_SAMPLE__MASK = 0x0000ff00 +A6XX_SP_REG_PROG_ID_2_IJ_LINEAR_SAMPLE__SHIFT = 8 +A6XX_SP_REG_PROG_ID_2_XYCOORDREGID__MASK = 0x00ff0000 +A6XX_SP_REG_PROG_ID_2_XYCOORDREGID__SHIFT = 16 +A6XX_SP_REG_PROG_ID_2_ZWCOORDREGID__MASK = 0xff000000 +A6XX_SP_REG_PROG_ID_2_ZWCOORDREGID__SHIFT = 24 +REG_A6XX_SP_REG_PROG_ID_3 = 0x0000b986 +A6XX_SP_REG_PROG_ID_3_LINELENGTHREGID__MASK = 0x000000ff +A6XX_SP_REG_PROG_ID_3_LINELENGTHREGID__SHIFT = 0 +A6XX_SP_REG_PROG_ID_3_FOVEATIONQUALITYREGID__MASK = 0x0000ff00 +A6XX_SP_REG_PROG_ID_3_FOVEATIONQUALITYREGID__SHIFT = 8 +REG_A6XX_SP_CS_CONST_CONFIG = 0x0000b987 +A6XX_SP_CS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A6XX_SP_CS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A6XX_SP_CS_CONST_CONFIG_ENABLED = 0x00000100 +A6XX_SP_CS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A7XX_SP_PS_WAVE_CNTL = 0x0000a9c6 +A7XX_SP_PS_WAVE_CNTL_THREADSIZE__MASK = 0x00000001 +A7XX_SP_PS_WAVE_CNTL_THREADSIZE__SHIFT = 0 +A7XX_SP_PS_WAVE_CNTL_VARYINGS = 0x00000002 +A7XX_SP_PS_WAVE_CNTL_UNK2__MASK = 0x00000ffc +A7XX_SP_PS_WAVE_CNTL_UNK2__SHIFT = 2 +REG_A7XX_SP_LB_PARAM_LIMIT = 0x0000a9c7 +A7XX_SP_LB_PARAM_LIMIT_PRIMALLOCTHRESHOLD__MASK = 0x00000007 +A7XX_SP_LB_PARAM_LIMIT_PRIMALLOCTHRESHOLD__SHIFT = 0 +REG_A7XX_SP_REG_PROG_ID_0 = 0x0000a9c8 +A7XX_SP_REG_PROG_ID_0_FACEREGID__MASK = 0x000000ff +A7XX_SP_REG_PROG_ID_0_FACEREGID__SHIFT = 0 +A7XX_SP_REG_PROG_ID_0_SAMPLEID__MASK = 0x0000ff00 +A7XX_SP_REG_PROG_ID_0_SAMPLEID__SHIFT = 8 +A7XX_SP_REG_PROG_ID_0_SAMPLEMASK__MASK = 0x00ff0000 +A7XX_SP_REG_PROG_ID_0_SAMPLEMASK__SHIFT = 16 +A7XX_SP_REG_PROG_ID_0_CENTERRHW__MASK = 0xff000000 +A7XX_SP_REG_PROG_ID_0_CENTERRHW__SHIFT = 24 +REG_A7XX_SP_REG_PROG_ID_1 = 0x0000a9c9 +A7XX_SP_REG_PROG_ID_1_IJ_PERSP_PIXEL__MASK = 0x000000ff +A7XX_SP_REG_PROG_ID_1_IJ_PERSP_PIXEL__SHIFT = 0 +A7XX_SP_REG_PROG_ID_1_IJ_LINEAR_PIXEL__MASK = 0x0000ff00 +A7XX_SP_REG_PROG_ID_1_IJ_LINEAR_PIXEL__SHIFT = 8 +A7XX_SP_REG_PROG_ID_1_IJ_PERSP_CENTROID__MASK = 0x00ff0000 +A7XX_SP_REG_PROG_ID_1_IJ_PERSP_CENTROID__SHIFT = 16 +A7XX_SP_REG_PROG_ID_1_IJ_LINEAR_CENTROID__MASK = 0xff000000 +A7XX_SP_REG_PROG_ID_1_IJ_LINEAR_CENTROID__SHIFT = 24 +REG_A7XX_SP_REG_PROG_ID_2 = 0x0000a9ca +A7XX_SP_REG_PROG_ID_2_IJ_PERSP_SAMPLE__MASK = 0x000000ff +A7XX_SP_REG_PROG_ID_2_IJ_PERSP_SAMPLE__SHIFT = 0 +A7XX_SP_REG_PROG_ID_2_IJ_LINEAR_SAMPLE__MASK = 0x0000ff00 +A7XX_SP_REG_PROG_ID_2_IJ_LINEAR_SAMPLE__SHIFT = 8 +A7XX_SP_REG_PROG_ID_2_XYCOORDREGID__MASK = 0x00ff0000 +A7XX_SP_REG_PROG_ID_2_XYCOORDREGID__SHIFT = 16 +A7XX_SP_REG_PROG_ID_2_ZWCOORDREGID__MASK = 0xff000000 +A7XX_SP_REG_PROG_ID_2_ZWCOORDREGID__SHIFT = 24 +REG_A7XX_SP_REG_PROG_ID_3 = 0x0000a9cb +A7XX_SP_REG_PROG_ID_3_LINELENGTHREGID__MASK = 0x000000ff +A7XX_SP_REG_PROG_ID_3_LINELENGTHREGID__SHIFT = 0 +A7XX_SP_REG_PROG_ID_3_FOVEATIONQUALITYREGID__MASK = 0x0000ff00 +A7XX_SP_REG_PROG_ID_3_FOVEATIONQUALITYREGID__SHIFT = 8 +REG_A7XX_SP_CS_CONST_CONFIG = 0x0000a9cd +A7XX_SP_CS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A7XX_SP_CS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A7XX_SP_CS_CONST_CONFIG_ENABLED = 0x00000100 +A7XX_SP_CS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A6XX_SP_CS_NDRANGE_0 = 0x0000b990 +A6XX_SP_CS_NDRANGE_0_KERNELDIM__MASK = 0x00000003 +A6XX_SP_CS_NDRANGE_0_KERNELDIM__SHIFT = 0 +A6XX_SP_CS_NDRANGE_0_LOCALSIZEX__MASK = 0x00000ffc +A6XX_SP_CS_NDRANGE_0_LOCALSIZEX__SHIFT = 2 +A6XX_SP_CS_NDRANGE_0_LOCALSIZEY__MASK = 0x003ff000 +A6XX_SP_CS_NDRANGE_0_LOCALSIZEY__SHIFT = 12 +A6XX_SP_CS_NDRANGE_0_LOCALSIZEZ__MASK = 0xffc00000 +A6XX_SP_CS_NDRANGE_0_LOCALSIZEZ__SHIFT = 22 +REG_A6XX_SP_CS_NDRANGE_1 = 0x0000b991 +A6XX_SP_CS_NDRANGE_1_GLOBALSIZE_X__MASK = 0xffffffff +A6XX_SP_CS_NDRANGE_1_GLOBALSIZE_X__SHIFT = 0 +REG_A6XX_SP_CS_NDRANGE_2 = 0x0000b992 +A6XX_SP_CS_NDRANGE_2_GLOBALOFF_X__MASK = 0xffffffff +A6XX_SP_CS_NDRANGE_2_GLOBALOFF_X__SHIFT = 0 +REG_A6XX_SP_CS_NDRANGE_3 = 0x0000b993 +A6XX_SP_CS_NDRANGE_3_GLOBALSIZE_Y__MASK = 0xffffffff +A6XX_SP_CS_NDRANGE_3_GLOBALSIZE_Y__SHIFT = 0 +REG_A6XX_SP_CS_NDRANGE_4 = 0x0000b994 +A6XX_SP_CS_NDRANGE_4_GLOBALOFF_Y__MASK = 0xffffffff +A6XX_SP_CS_NDRANGE_4_GLOBALOFF_Y__SHIFT = 0 +REG_A6XX_SP_CS_NDRANGE_5 = 0x0000b995 +A6XX_SP_CS_NDRANGE_5_GLOBALSIZE_Z__MASK = 0xffffffff +A6XX_SP_CS_NDRANGE_5_GLOBALSIZE_Z__SHIFT = 0 +REG_A6XX_SP_CS_NDRANGE_6 = 0x0000b996 +A6XX_SP_CS_NDRANGE_6_GLOBALOFF_Z__MASK = 0xffffffff +A6XX_SP_CS_NDRANGE_6_GLOBALOFF_Z__SHIFT = 0 +REG_A6XX_SP_CS_CONST_CONFIG_0 = 0x0000b997 +A6XX_SP_CS_CONST_CONFIG_0_WGIDCONSTID__MASK = 0x000000ff +A6XX_SP_CS_CONST_CONFIG_0_WGIDCONSTID__SHIFT = 0 +A6XX_SP_CS_CONST_CONFIG_0_WGSIZECONSTID__MASK = 0x0000ff00 +A6XX_SP_CS_CONST_CONFIG_0_WGSIZECONSTID__SHIFT = 8 +A6XX_SP_CS_CONST_CONFIG_0_WGOFFSETCONSTID__MASK = 0x00ff0000 +A6XX_SP_CS_CONST_CONFIG_0_WGOFFSETCONSTID__SHIFT = 16 +A6XX_SP_CS_CONST_CONFIG_0_LOCALIDREGID__MASK = 0xff000000 +A6XX_SP_CS_CONST_CONFIG_0_LOCALIDREGID__SHIFT = 24 +REG_A6XX_SP_CS_WGE_CNTL = 0x0000b998 +A6XX_SP_CS_WGE_CNTL_LINEARLOCALIDREGID__MASK = 0x000000ff +A6XX_SP_CS_WGE_CNTL_LINEARLOCALIDREGID__SHIFT = 0 +A6XX_SP_CS_WGE_CNTL_SINGLE_SP_CORE = 0x00000100 +A6XX_SP_CS_WGE_CNTL_THREADSIZE__MASK = 0x00000200 +A6XX_SP_CS_WGE_CNTL_THREADSIZE__SHIFT = 9 +A6XX_SP_CS_WGE_CNTL_THREADSIZE_SCALAR = 0x00000400 +REG_A6XX_SP_CS_KERNEL_GROUP_X = 0x0000b999 +REG_A6XX_SP_CS_KERNEL_GROUP_Y = 0x0000b99a +REG_A6XX_SP_CS_KERNEL_GROUP_Z = 0x0000b99b +REG_A7XX_SP_CS_NDRANGE_0 = 0x0000a9d4 +A7XX_SP_CS_NDRANGE_0_KERNELDIM__MASK = 0x00000003 +A7XX_SP_CS_NDRANGE_0_KERNELDIM__SHIFT = 0 +A7XX_SP_CS_NDRANGE_0_LOCALSIZEX__MASK = 0x00000ffc +A7XX_SP_CS_NDRANGE_0_LOCALSIZEX__SHIFT = 2 +A7XX_SP_CS_NDRANGE_0_LOCALSIZEY__MASK = 0x003ff000 +A7XX_SP_CS_NDRANGE_0_LOCALSIZEY__SHIFT = 12 +A7XX_SP_CS_NDRANGE_0_LOCALSIZEZ__MASK = 0xffc00000 +A7XX_SP_CS_NDRANGE_0_LOCALSIZEZ__SHIFT = 22 +REG_A7XX_SP_CS_NDRANGE_1 = 0x0000a9d5 +A7XX_SP_CS_NDRANGE_1_GLOBALSIZE_X__MASK = 0xffffffff +A7XX_SP_CS_NDRANGE_1_GLOBALSIZE_X__SHIFT = 0 +REG_A7XX_SP_CS_NDRANGE_2 = 0x0000a9d6 +A7XX_SP_CS_NDRANGE_2_GLOBALOFF_X__MASK = 0xffffffff +A7XX_SP_CS_NDRANGE_2_GLOBALOFF_X__SHIFT = 0 +REG_A7XX_SP_CS_NDRANGE_3 = 0x0000a9d7 +A7XX_SP_CS_NDRANGE_3_GLOBALSIZE_Y__MASK = 0xffffffff +A7XX_SP_CS_NDRANGE_3_GLOBALSIZE_Y__SHIFT = 0 +REG_A7XX_SP_CS_NDRANGE_4 = 0x0000a9d8 +A7XX_SP_CS_NDRANGE_4_GLOBALOFF_Y__MASK = 0xffffffff +A7XX_SP_CS_NDRANGE_4_GLOBALOFF_Y__SHIFT = 0 +REG_A7XX_SP_CS_NDRANGE_5 = 0x0000a9d9 +A7XX_SP_CS_NDRANGE_5_GLOBALSIZE_Z__MASK = 0xffffffff +A7XX_SP_CS_NDRANGE_5_GLOBALSIZE_Z__SHIFT = 0 +REG_A7XX_SP_CS_NDRANGE_6 = 0x0000a9da +A7XX_SP_CS_NDRANGE_6_GLOBALOFF_Z__MASK = 0xffffffff +A7XX_SP_CS_NDRANGE_6_GLOBALOFF_Z__SHIFT = 0 +REG_A7XX_SP_CS_KERNEL_GROUP_X = 0x0000a9dc +REG_A7XX_SP_CS_KERNEL_GROUP_Y = 0x0000a9dd +REG_A7XX_SP_CS_KERNEL_GROUP_Z = 0x0000a9de +REG_A7XX_SP_CS_WGE_CNTL = 0x0000a9db +A7XX_SP_CS_WGE_CNTL_LINEARLOCALIDREGID__MASK = 0x000000ff +A7XX_SP_CS_WGE_CNTL_LINEARLOCALIDREGID__SHIFT = 0 +A7XX_SP_CS_WGE_CNTL_THREADSIZE__MASK = 0x00000200 +A7XX_SP_CS_WGE_CNTL_THREADSIZE__SHIFT = 9 +A7XX_SP_CS_WGE_CNTL_WORKGROUPRASTORDERZFIRSTEN = 0x00000800 +A7XX_SP_CS_WGE_CNTL_WGTILEWIDTH__MASK = 0x03f00000 +A7XX_SP_CS_WGE_CNTL_WGTILEWIDTH__SHIFT = 20 +A7XX_SP_CS_WGE_CNTL_WGTILEHEIGHT__MASK = 0xfc000000 +A7XX_SP_CS_WGE_CNTL_WGTILEHEIGHT__SHIFT = 26 +REG_A7XX_SP_CS_NDRANGE_7 = 0x0000a9df +A7XX_SP_CS_NDRANGE_7_LOCALSIZEX__MASK = 0x00000ffc +A7XX_SP_CS_NDRANGE_7_LOCALSIZEX__SHIFT = 2 +A7XX_SP_CS_NDRANGE_7_LOCALSIZEY__MASK = 0x003ff000 +A7XX_SP_CS_NDRANGE_7_LOCALSIZEY__SHIFT = 12 +A7XX_SP_CS_NDRANGE_7_LOCALSIZEZ__MASK = 0xffc00000 +A7XX_SP_CS_NDRANGE_7_LOCALSIZEZ__SHIFT = 22 +REG_A6XX_HLSQ_LOAD_STATE_FRAG_CMD = 0x0000b9a0 +REG_A6XX_HLSQ_LOAD_STATE_FRAG_EXT_SRC_ADDR = 0x0000b9a1 +REG_A6XX_HLSQ_LOAD_STATE_FRAG_DATA = 0x0000b9a3 +REG_A6XX_HLSQ_CS_BINDLESS_BASE = lambda i0: (0x0000b9c0 + 0x2*i0 ) # type: ignore +A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK = 0x00000003 +A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT = 0 +A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK = 0xfffffffffffffffc +A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT = 2 +REG_A6XX_HLSQ_CS_CTRL_REG1 = 0x0000b9d0 +A6XX_HLSQ_CS_CTRL_REG1_SHARED_SIZE__MASK = 0x0000001f +A6XX_HLSQ_CS_CTRL_REG1_SHARED_SIZE__SHIFT = 0 +A6XX_HLSQ_CS_CTRL_REG1_CONSTANTRAMMODE__MASK = 0x00000060 +A6XX_HLSQ_CS_CTRL_REG1_CONSTANTRAMMODE__SHIFT = 5 +REG_A6XX_SP_DRAW_INITIATOR = 0x0000bb00 +A6XX_SP_DRAW_INITIATOR_STATE_ID__MASK = 0x000000ff +A6XX_SP_DRAW_INITIATOR_STATE_ID__SHIFT = 0 +REG_A6XX_SP_KERNEL_INITIATOR = 0x0000bb01 +A6XX_SP_KERNEL_INITIATOR_STATE_ID__MASK = 0x000000ff +A6XX_SP_KERNEL_INITIATOR_STATE_ID__SHIFT = 0 +REG_A6XX_SP_EVENT_INITIATOR = 0x0000bb02 +A6XX_SP_EVENT_INITIATOR_STATE_ID__MASK = 0x00ff0000 +A6XX_SP_EVENT_INITIATOR_STATE_ID__SHIFT = 16 +A6XX_SP_EVENT_INITIATOR_EVENT__MASK = 0x0000007f +A6XX_SP_EVENT_INITIATOR_EVENT__SHIFT = 0 +REG_A6XX_SP_UPDATE_CNTL = 0x0000bb08 +A6XX_SP_UPDATE_CNTL_VS_STATE = 0x00000001 +A6XX_SP_UPDATE_CNTL_HS_STATE = 0x00000002 +A6XX_SP_UPDATE_CNTL_DS_STATE = 0x00000004 +A6XX_SP_UPDATE_CNTL_GS_STATE = 0x00000008 +A6XX_SP_UPDATE_CNTL_FS_STATE = 0x00000010 +A6XX_SP_UPDATE_CNTL_CS_STATE = 0x00000020 +A6XX_SP_UPDATE_CNTL_CS_UAV = 0x00000040 +A6XX_SP_UPDATE_CNTL_GFX_UAV = 0x00000080 +A6XX_SP_UPDATE_CNTL_CS_SHARED_CONST = 0x00080000 +A6XX_SP_UPDATE_CNTL_GFX_SHARED_CONST = 0x00000100 +A6XX_SP_UPDATE_CNTL_CS_BINDLESS__MASK = 0x00003e00 +A6XX_SP_UPDATE_CNTL_CS_BINDLESS__SHIFT = 9 +A6XX_SP_UPDATE_CNTL_GFX_BINDLESS__MASK = 0x0007c000 +A6XX_SP_UPDATE_CNTL_GFX_BINDLESS__SHIFT = 14 +REG_A7XX_SP_DRAW_INITIATOR = 0x0000ab1c +A7XX_SP_DRAW_INITIATOR_STATE_ID__MASK = 0x000000ff +A7XX_SP_DRAW_INITIATOR_STATE_ID__SHIFT = 0 +REG_A7XX_SP_KERNEL_INITIATOR = 0x0000ab1d +A7XX_SP_KERNEL_INITIATOR_STATE_ID__MASK = 0x000000ff +A7XX_SP_KERNEL_INITIATOR_STATE_ID__SHIFT = 0 +REG_A7XX_SP_EVENT_INITIATOR = 0x0000ab1e +A7XX_SP_EVENT_INITIATOR_STATE_ID__MASK = 0x00ff0000 +A7XX_SP_EVENT_INITIATOR_STATE_ID__SHIFT = 16 +A7XX_SP_EVENT_INITIATOR_EVENT__MASK = 0x0000007f +A7XX_SP_EVENT_INITIATOR_EVENT__SHIFT = 0 +REG_A7XX_SP_UPDATE_CNTL = 0x0000ab1f +A7XX_SP_UPDATE_CNTL_VS_STATE = 0x00000001 +A7XX_SP_UPDATE_CNTL_HS_STATE = 0x00000002 +A7XX_SP_UPDATE_CNTL_DS_STATE = 0x00000004 +A7XX_SP_UPDATE_CNTL_GS_STATE = 0x00000008 +A7XX_SP_UPDATE_CNTL_FS_STATE = 0x00000010 +A7XX_SP_UPDATE_CNTL_CS_STATE = 0x00000020 +A7XX_SP_UPDATE_CNTL_CS_UAV = 0x00000040 +A7XX_SP_UPDATE_CNTL_GFX_UAV = 0x00000080 +A7XX_SP_UPDATE_CNTL_CS_BINDLESS__MASK = 0x0001fe00 +A7XX_SP_UPDATE_CNTL_CS_BINDLESS__SHIFT = 9 +A7XX_SP_UPDATE_CNTL_GFX_BINDLESS__MASK = 0x01fe0000 +A7XX_SP_UPDATE_CNTL_GFX_BINDLESS__SHIFT = 17 +REG_A6XX_SP_PS_CONST_CONFIG = 0x0000bb10 +A6XX_SP_PS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A6XX_SP_PS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A6XX_SP_PS_CONST_CONFIG_ENABLED = 0x00000100 +A6XX_SP_PS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A7XX_SP_PS_CONST_CONFIG = 0x0000ab03 +A7XX_SP_PS_CONST_CONFIG_CONSTLEN__MASK = 0x000000ff +A7XX_SP_PS_CONST_CONFIG_CONSTLEN__SHIFT = 0 +A7XX_SP_PS_CONST_CONFIG_ENABLED = 0x00000100 +A7XX_SP_PS_CONST_CONFIG_READ_IMM_SHARED_CONSTS = 0x00000200 +REG_A7XX_SP_SHARED_CONSTANT_GFX_0 = lambda i0: (0x0000ab40 + 0x1*i0 ) # type: ignore +REG_A6XX_HLSQ_SHARED_CONSTS = 0x0000bb11 +A6XX_HLSQ_SHARED_CONSTS_ENABLE = 0x00000001 +REG_A6XX_HLSQ_BINDLESS_BASE = lambda i0: (0x0000bb20 + 0x2*i0 ) # type: ignore +A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK = 0x00000003 +A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT = 0 +A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK = 0xfffffffffffffffc +A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT = 2 +REG_A6XX_HLSQ_2D_EVENT_CMD = 0x0000bd80 +A6XX_HLSQ_2D_EVENT_CMD_STATE_ID__MASK = 0x0000ff00 +A6XX_HLSQ_2D_EVENT_CMD_STATE_ID__SHIFT = 8 +A6XX_HLSQ_2D_EVENT_CMD_EVENT__MASK = 0x0000007f +A6XX_HLSQ_2D_EVENT_CMD_EVENT__SHIFT = 0 +REG_A6XX_HLSQ_UNKNOWN_BE00 = 0x0000be00 +REG_A6XX_HLSQ_UNKNOWN_BE01 = 0x0000be01 +REG_A6XX_HLSQ_DBG_ECO_CNTL = 0x0000be04 +REG_A6XX_HLSQ_ADDR_MODE_CNTL = 0x0000be05 +REG_A6XX_HLSQ_UNKNOWN_BE08 = 0x0000be08 +REG_A6XX_HLSQ_PERFCTR_HLSQ_SEL = lambda i0: (0x0000be10 + 0x1*i0 ) # type: ignore +REG_A6XX_HLSQ_CONTEXT_SWITCH_GFX_PREEMPTION_SAFE_MODE = 0x0000be22 +REG_A7XX_SP_AHB_READ_APERTURE = 0x0000c000 +REG_A7XX_SP_UNKNOWN_0CE2 = 0x00000ce2 +REG_A7XX_SP_UNKNOWN_0CE4 = 0x00000ce4 +REG_A7XX_SP_UNKNOWN_0CE6 = 0x00000ce6 +REG_A6XX_CP_EVENT_START = 0x0000d600 +A6XX_CP_EVENT_START_STATE_ID__MASK = 0x000000ff +A6XX_CP_EVENT_START_STATE_ID__SHIFT = 0 +REG_A6XX_CP_EVENT_END = 0x0000d601 +A6XX_CP_EVENT_END_STATE_ID__MASK = 0x000000ff +A6XX_CP_EVENT_END_STATE_ID__SHIFT = 0 +REG_A6XX_CP_2D_EVENT_START = 0x0000d700 +A6XX_CP_2D_EVENT_START_STATE_ID__MASK = 0x000000ff +A6XX_CP_2D_EVENT_START_STATE_ID__SHIFT = 0 +REG_A6XX_CP_2D_EVENT_END = 0x0000d701 +A6XX_CP_2D_EVENT_END_STATE_ID__MASK = 0x000000ff +A6XX_CP_2D_EVENT_END_STATE_ID__SHIFT = 0 +REG_A6XX_PDC_GPU_ENABLE_PDC = 0x00001140 +REG_A6XX_PDC_GPU_SEQ_START_ADDR = 0x00001148 +REG_A6XX_PDC_GPU_TCS0_CONTROL = 0x00001540 +REG_A6XX_PDC_GPU_TCS0_CMD_ENABLE_BANK = 0x00001541 +REG_A6XX_PDC_GPU_TCS0_CMD_WAIT_FOR_CMPL_BANK = 0x00001542 +REG_A6XX_PDC_GPU_TCS0_CMD0_MSGID = 0x00001543 +REG_A6XX_PDC_GPU_TCS0_CMD0_ADDR = 0x00001544 +REG_A6XX_PDC_GPU_TCS0_CMD0_DATA = 0x00001545 +REG_A6XX_PDC_GPU_TCS1_CONTROL = 0x00001572 +REG_A6XX_PDC_GPU_TCS1_CMD_ENABLE_BANK = 0x00001573 +REG_A6XX_PDC_GPU_TCS1_CMD_WAIT_FOR_CMPL_BANK = 0x00001574 +REG_A6XX_PDC_GPU_TCS1_CMD0_MSGID = 0x00001575 +REG_A6XX_PDC_GPU_TCS1_CMD0_ADDR = 0x00001576 +REG_A6XX_PDC_GPU_TCS1_CMD0_DATA = 0x00001577 +REG_A6XX_PDC_GPU_TCS2_CONTROL = 0x000015a4 +REG_A6XX_PDC_GPU_TCS2_CMD_ENABLE_BANK = 0x000015a5 +REG_A6XX_PDC_GPU_TCS2_CMD_WAIT_FOR_CMPL_BANK = 0x000015a6 +REG_A6XX_PDC_GPU_TCS2_CMD0_MSGID = 0x000015a7 +REG_A6XX_PDC_GPU_TCS2_CMD0_ADDR = 0x000015a8 +REG_A6XX_PDC_GPU_TCS2_CMD0_DATA = 0x000015a9 +REG_A6XX_PDC_GPU_TCS3_CONTROL = 0x000015d6 +REG_A6XX_PDC_GPU_TCS3_CMD_ENABLE_BANK = 0x000015d7 +REG_A6XX_PDC_GPU_TCS3_CMD_WAIT_FOR_CMPL_BANK = 0x000015d8 +REG_A6XX_PDC_GPU_TCS3_CMD0_MSGID = 0x000015d9 +REG_A6XX_PDC_GPU_TCS3_CMD0_ADDR = 0x000015da +REG_A6XX_PDC_GPU_TCS3_CMD0_DATA = 0x000015db +REG_A6XX_PDC_GPU_SEQ_MEM_0 = 0x00000000 +REG_A6XX_CX_DBGC_CFG_DBGBUS_SEL_A = 0x00000000 +A6XX_CX_DBGC_CFG_DBGBUS_SEL_A_PING_INDEX__MASK = 0x000000ff +A6XX_CX_DBGC_CFG_DBGBUS_SEL_A_PING_INDEX__SHIFT = 0 +A6XX_CX_DBGC_CFG_DBGBUS_SEL_A_PING_BLK_SEL__MASK = 0x0000ff00 +A6XX_CX_DBGC_CFG_DBGBUS_SEL_A_PING_BLK_SEL__SHIFT = 8 +REG_A6XX_CX_DBGC_CFG_DBGBUS_SEL_B = 0x00000001 +REG_A6XX_CX_DBGC_CFG_DBGBUS_SEL_C = 0x00000002 +REG_A6XX_CX_DBGC_CFG_DBGBUS_SEL_D = 0x00000003 +REG_A6XX_CX_DBGC_CFG_DBGBUS_CNTLT = 0x00000004 +A6XX_CX_DBGC_CFG_DBGBUS_CNTLT_TRACEEN__MASK = 0x0000003f +A6XX_CX_DBGC_CFG_DBGBUS_CNTLT_TRACEEN__SHIFT = 0 +A6XX_CX_DBGC_CFG_DBGBUS_CNTLT_GRANU__MASK = 0x00007000 +A6XX_CX_DBGC_CFG_DBGBUS_CNTLT_GRANU__SHIFT = 12 +A6XX_CX_DBGC_CFG_DBGBUS_CNTLT_SEGT__MASK = 0xf0000000 +A6XX_CX_DBGC_CFG_DBGBUS_CNTLT_SEGT__SHIFT = 28 +REG_A6XX_CX_DBGC_CFG_DBGBUS_CNTLM = 0x00000005 +A6XX_CX_DBGC_CFG_DBGBUS_CNTLM_ENABLE__MASK = 0x0f000000 +A6XX_CX_DBGC_CFG_DBGBUS_CNTLM_ENABLE__SHIFT = 24 +REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_0 = 0x00000008 +REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_1 = 0x00000009 +REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_2 = 0x0000000a +REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_3 = 0x0000000b +REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_0 = 0x0000000c +REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_1 = 0x0000000d +REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_2 = 0x0000000e +REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_3 = 0x0000000f +REG_A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0 = 0x00000010 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL0__MASK = 0x0000000f +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL0__SHIFT = 0 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL1__MASK = 0x000000f0 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL1__SHIFT = 4 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL2__MASK = 0x00000f00 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL2__SHIFT = 8 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL3__MASK = 0x0000f000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL3__SHIFT = 12 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL4__MASK = 0x000f0000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL4__SHIFT = 16 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL5__MASK = 0x00f00000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL5__SHIFT = 20 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL6__MASK = 0x0f000000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL6__SHIFT = 24 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL7__MASK = 0xf0000000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0_BYTEL7__SHIFT = 28 +REG_A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1 = 0x00000011 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL8__MASK = 0x0000000f +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL8__SHIFT = 0 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL9__MASK = 0x000000f0 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL9__SHIFT = 4 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL10__MASK = 0x00000f00 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL10__SHIFT = 8 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL11__MASK = 0x0000f000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL11__SHIFT = 12 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL12__MASK = 0x000f0000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL12__SHIFT = 16 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL13__MASK = 0x00f00000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL13__SHIFT = 20 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL14__MASK = 0x0f000000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL14__SHIFT = 24 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL15__MASK = 0xf0000000 +A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1_BYTEL15__SHIFT = 28 +REG_A6XX_CX_DBGC_CFG_DBGBUS_TRACE_BUF1 = 0x0000002f +REG_A6XX_CX_DBGC_CFG_DBGBUS_TRACE_BUF2 = 0x00000030 +REG_A6XX_CX_MISC_SYSTEM_CACHE_CNTL_0 = 0x00000001 +REG_A6XX_CX_MISC_SYSTEM_CACHE_CNTL_1 = 0x00000002 +REG_A7XX_CX_MISC_TCM_RET_CNTL = 0x00000039 +REG_A7XX_CX_MISC_SW_FUSE_VALUE = 0x00000400 +A7XX_CX_MISC_SW_FUSE_VALUE_FASTBLEND = 0x00000001 +A7XX_CX_MISC_SW_FUSE_VALUE_LPAC = 0x00000002 +A7XX_CX_MISC_SW_FUSE_VALUE_RAYTRACING = 0x00000004 +__struct__cast = lambda X: (struct_X) # type: ignore +REG_CP_LOAD_STATE_0 = 0x00000000 +CP_LOAD_STATE_0_DST_OFF__MASK = 0x0000ffff +CP_LOAD_STATE_0_DST_OFF__SHIFT = 0 +CP_LOAD_STATE_0_STATE_SRC__MASK = 0x00070000 +CP_LOAD_STATE_0_STATE_SRC__SHIFT = 16 +CP_LOAD_STATE_0_STATE_BLOCK__MASK = 0x00380000 +CP_LOAD_STATE_0_STATE_BLOCK__SHIFT = 19 +CP_LOAD_STATE_0_NUM_UNIT__MASK = 0xffc00000 +CP_LOAD_STATE_0_NUM_UNIT__SHIFT = 22 +REG_CP_LOAD_STATE_1 = 0x00000001 +CP_LOAD_STATE_1_STATE_TYPE__MASK = 0x00000003 +CP_LOAD_STATE_1_STATE_TYPE__SHIFT = 0 +CP_LOAD_STATE_1_EXT_SRC_ADDR__MASK = 0xfffffffc +CP_LOAD_STATE_1_EXT_SRC_ADDR__SHIFT = 2 +REG_CP_LOAD_STATE4_0 = 0x00000000 +CP_LOAD_STATE4_0_DST_OFF__MASK = 0x00003fff +CP_LOAD_STATE4_0_DST_OFF__SHIFT = 0 +CP_LOAD_STATE4_0_STATE_SRC__MASK = 0x00030000 +CP_LOAD_STATE4_0_STATE_SRC__SHIFT = 16 +CP_LOAD_STATE4_0_STATE_BLOCK__MASK = 0x003c0000 +CP_LOAD_STATE4_0_STATE_BLOCK__SHIFT = 18 +CP_LOAD_STATE4_0_NUM_UNIT__MASK = 0xffc00000 +CP_LOAD_STATE4_0_NUM_UNIT__SHIFT = 22 +REG_CP_LOAD_STATE4_1 = 0x00000001 +CP_LOAD_STATE4_1_STATE_TYPE__MASK = 0x00000003 +CP_LOAD_STATE4_1_STATE_TYPE__SHIFT = 0 +CP_LOAD_STATE4_1_EXT_SRC_ADDR__MASK = 0xfffffffc +CP_LOAD_STATE4_1_EXT_SRC_ADDR__SHIFT = 2 +REG_CP_LOAD_STATE4_2 = 0x00000002 +CP_LOAD_STATE4_2_EXT_SRC_ADDR_HI__MASK = 0xffffffff +CP_LOAD_STATE4_2_EXT_SRC_ADDR_HI__SHIFT = 0 +REG_CP_LOAD_STATE6_0 = 0x00000000 +CP_LOAD_STATE6_0_DST_OFF__MASK = 0x00003fff +CP_LOAD_STATE6_0_DST_OFF__SHIFT = 0 +CP_LOAD_STATE6_0_STATE_TYPE__MASK = 0x0000c000 +CP_LOAD_STATE6_0_STATE_TYPE__SHIFT = 14 +CP_LOAD_STATE6_0_STATE_SRC__MASK = 0x00030000 +CP_LOAD_STATE6_0_STATE_SRC__SHIFT = 16 +CP_LOAD_STATE6_0_STATE_BLOCK__MASK = 0x003c0000 +CP_LOAD_STATE6_0_STATE_BLOCK__SHIFT = 18 +CP_LOAD_STATE6_0_NUM_UNIT__MASK = 0xffc00000 +CP_LOAD_STATE6_0_NUM_UNIT__SHIFT = 22 +REG_CP_LOAD_STATE6_1 = 0x00000001 +CP_LOAD_STATE6_1_EXT_SRC_ADDR__MASK = 0xfffffffc +CP_LOAD_STATE6_1_EXT_SRC_ADDR__SHIFT = 2 +REG_CP_LOAD_STATE6_2 = 0x00000002 +CP_LOAD_STATE6_2_EXT_SRC_ADDR_HI__MASK = 0xffffffff +CP_LOAD_STATE6_2_EXT_SRC_ADDR_HI__SHIFT = 0 +REG_CP_LOAD_STATE6_EXT_SRC_ADDR = 0x00000001 +REG_CP_DRAW_INDX_0 = 0x00000000 +CP_DRAW_INDX_0_VIZ_QUERY__MASK = 0xffffffff +CP_DRAW_INDX_0_VIZ_QUERY__SHIFT = 0 +REG_CP_DRAW_INDX_1 = 0x00000001 +CP_DRAW_INDX_1_PRIM_TYPE__MASK = 0x0000003f +CP_DRAW_INDX_1_PRIM_TYPE__SHIFT = 0 +CP_DRAW_INDX_1_SOURCE_SELECT__MASK = 0x000000c0 +CP_DRAW_INDX_1_SOURCE_SELECT__SHIFT = 6 +CP_DRAW_INDX_1_VIS_CULL__MASK = 0x00000600 +CP_DRAW_INDX_1_VIS_CULL__SHIFT = 9 +CP_DRAW_INDX_1_INDEX_SIZE__MASK = 0x00000800 +CP_DRAW_INDX_1_INDEX_SIZE__SHIFT = 11 +CP_DRAW_INDX_1_NOT_EOP = 0x00001000 +CP_DRAW_INDX_1_SMALL_INDEX = 0x00002000 +CP_DRAW_INDX_1_PRE_DRAW_INITIATOR_ENABLE = 0x00004000 +CP_DRAW_INDX_1_NUM_INSTANCES__MASK = 0xff000000 +CP_DRAW_INDX_1_NUM_INSTANCES__SHIFT = 24 +REG_CP_DRAW_INDX_2 = 0x00000002 +CP_DRAW_INDX_2_NUM_INDICES__MASK = 0xffffffff +CP_DRAW_INDX_2_NUM_INDICES__SHIFT = 0 +REG_CP_DRAW_INDX_3 = 0x00000003 +CP_DRAW_INDX_3_INDX_BASE__MASK = 0xffffffff +CP_DRAW_INDX_3_INDX_BASE__SHIFT = 0 +REG_CP_DRAW_INDX_4 = 0x00000004 +CP_DRAW_INDX_4_INDX_SIZE__MASK = 0xffffffff +CP_DRAW_INDX_4_INDX_SIZE__SHIFT = 0 +REG_CP_DRAW_INDX_2_0 = 0x00000000 +CP_DRAW_INDX_2_0_VIZ_QUERY__MASK = 0xffffffff +CP_DRAW_INDX_2_0_VIZ_QUERY__SHIFT = 0 +REG_CP_DRAW_INDX_2_1 = 0x00000001 +CP_DRAW_INDX_2_1_PRIM_TYPE__MASK = 0x0000003f +CP_DRAW_INDX_2_1_PRIM_TYPE__SHIFT = 0 +CP_DRAW_INDX_2_1_SOURCE_SELECT__MASK = 0x000000c0 +CP_DRAW_INDX_2_1_SOURCE_SELECT__SHIFT = 6 +CP_DRAW_INDX_2_1_VIS_CULL__MASK = 0x00000600 +CP_DRAW_INDX_2_1_VIS_CULL__SHIFT = 9 +CP_DRAW_INDX_2_1_INDEX_SIZE__MASK = 0x00000800 +CP_DRAW_INDX_2_1_INDEX_SIZE__SHIFT = 11 +CP_DRAW_INDX_2_1_NOT_EOP = 0x00001000 +CP_DRAW_INDX_2_1_SMALL_INDEX = 0x00002000 +CP_DRAW_INDX_2_1_PRE_DRAW_INITIATOR_ENABLE = 0x00004000 +CP_DRAW_INDX_2_1_NUM_INSTANCES__MASK = 0xff000000 +CP_DRAW_INDX_2_1_NUM_INSTANCES__SHIFT = 24 +REG_CP_DRAW_INDX_2_2 = 0x00000002 +CP_DRAW_INDX_2_2_NUM_INDICES__MASK = 0xffffffff +CP_DRAW_INDX_2_2_NUM_INDICES__SHIFT = 0 +REG_CP_DRAW_INDX_OFFSET_0 = 0x00000000 +CP_DRAW_INDX_OFFSET_0_PRIM_TYPE__MASK = 0x0000003f +CP_DRAW_INDX_OFFSET_0_PRIM_TYPE__SHIFT = 0 +CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT__MASK = 0x000000c0 +CP_DRAW_INDX_OFFSET_0_SOURCE_SELECT__SHIFT = 6 +CP_DRAW_INDX_OFFSET_0_VIS_CULL__MASK = 0x00000300 +CP_DRAW_INDX_OFFSET_0_VIS_CULL__SHIFT = 8 +CP_DRAW_INDX_OFFSET_0_INDEX_SIZE__MASK = 0x00000c00 +CP_DRAW_INDX_OFFSET_0_INDEX_SIZE__SHIFT = 10 +CP_DRAW_INDX_OFFSET_0_PATCH_TYPE__MASK = 0x00003000 +CP_DRAW_INDX_OFFSET_0_PATCH_TYPE__SHIFT = 12 +CP_DRAW_INDX_OFFSET_0_GS_ENABLE = 0x00010000 +CP_DRAW_INDX_OFFSET_0_TESS_ENABLE = 0x00020000 +REG_CP_DRAW_INDX_OFFSET_1 = 0x00000001 +CP_DRAW_INDX_OFFSET_1_NUM_INSTANCES__MASK = 0xffffffff +CP_DRAW_INDX_OFFSET_1_NUM_INSTANCES__SHIFT = 0 +REG_CP_DRAW_INDX_OFFSET_2 = 0x00000002 +CP_DRAW_INDX_OFFSET_2_NUM_INDICES__MASK = 0xffffffff +CP_DRAW_INDX_OFFSET_2_NUM_INDICES__SHIFT = 0 +REG_CP_DRAW_INDX_OFFSET_3 = 0x00000003 +CP_DRAW_INDX_OFFSET_3_FIRST_INDX__MASK = 0xffffffff +CP_DRAW_INDX_OFFSET_3_FIRST_INDX__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_OFFSET_4 = 0x00000004 +A5XX_CP_DRAW_INDX_OFFSET_4_INDX_BASE_LO__MASK = 0xffffffff +A5XX_CP_DRAW_INDX_OFFSET_4_INDX_BASE_LO__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_OFFSET_5 = 0x00000005 +A5XX_CP_DRAW_INDX_OFFSET_5_INDX_BASE_HI__MASK = 0xffffffff +A5XX_CP_DRAW_INDX_OFFSET_5_INDX_BASE_HI__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_OFFSET_INDX_BASE = 0x00000004 +REG_A5XX_CP_DRAW_INDX_OFFSET_6 = 0x00000006 +A5XX_CP_DRAW_INDX_OFFSET_6_MAX_INDICES__MASK = 0xffffffff +A5XX_CP_DRAW_INDX_OFFSET_6_MAX_INDICES__SHIFT = 0 +REG_CP_DRAW_INDX_OFFSET_4 = 0x00000004 +CP_DRAW_INDX_OFFSET_4_INDX_BASE__MASK = 0xffffffff +CP_DRAW_INDX_OFFSET_4_INDX_BASE__SHIFT = 0 +REG_CP_DRAW_INDX_OFFSET_5 = 0x00000005 +CP_DRAW_INDX_OFFSET_5_INDX_SIZE__MASK = 0xffffffff +CP_DRAW_INDX_OFFSET_5_INDX_SIZE__SHIFT = 0 +REG_A4XX_CP_DRAW_INDIRECT_0 = 0x00000000 +A4XX_CP_DRAW_INDIRECT_0_PRIM_TYPE__MASK = 0x0000003f +A4XX_CP_DRAW_INDIRECT_0_PRIM_TYPE__SHIFT = 0 +A4XX_CP_DRAW_INDIRECT_0_SOURCE_SELECT__MASK = 0x000000c0 +A4XX_CP_DRAW_INDIRECT_0_SOURCE_SELECT__SHIFT = 6 +A4XX_CP_DRAW_INDIRECT_0_VIS_CULL__MASK = 0x00000300 +A4XX_CP_DRAW_INDIRECT_0_VIS_CULL__SHIFT = 8 +A4XX_CP_DRAW_INDIRECT_0_INDEX_SIZE__MASK = 0x00000c00 +A4XX_CP_DRAW_INDIRECT_0_INDEX_SIZE__SHIFT = 10 +A4XX_CP_DRAW_INDIRECT_0_PATCH_TYPE__MASK = 0x00003000 +A4XX_CP_DRAW_INDIRECT_0_PATCH_TYPE__SHIFT = 12 +A4XX_CP_DRAW_INDIRECT_0_GS_ENABLE = 0x00010000 +A4XX_CP_DRAW_INDIRECT_0_TESS_ENABLE = 0x00020000 +REG_A4XX_CP_DRAW_INDIRECT_1 = 0x00000001 +A4XX_CP_DRAW_INDIRECT_1_INDIRECT__MASK = 0xffffffff +A4XX_CP_DRAW_INDIRECT_1_INDIRECT__SHIFT = 0 +REG_A5XX_CP_DRAW_INDIRECT_1 = 0x00000001 +A5XX_CP_DRAW_INDIRECT_1_INDIRECT_LO__MASK = 0xffffffff +A5XX_CP_DRAW_INDIRECT_1_INDIRECT_LO__SHIFT = 0 +REG_A5XX_CP_DRAW_INDIRECT_2 = 0x00000002 +A5XX_CP_DRAW_INDIRECT_2_INDIRECT_HI__MASK = 0xffffffff +A5XX_CP_DRAW_INDIRECT_2_INDIRECT_HI__SHIFT = 0 +REG_A5XX_CP_DRAW_INDIRECT_INDIRECT = 0x00000001 +REG_A4XX_CP_DRAW_INDX_INDIRECT_0 = 0x00000000 +A4XX_CP_DRAW_INDX_INDIRECT_0_PRIM_TYPE__MASK = 0x0000003f +A4XX_CP_DRAW_INDX_INDIRECT_0_PRIM_TYPE__SHIFT = 0 +A4XX_CP_DRAW_INDX_INDIRECT_0_SOURCE_SELECT__MASK = 0x000000c0 +A4XX_CP_DRAW_INDX_INDIRECT_0_SOURCE_SELECT__SHIFT = 6 +A4XX_CP_DRAW_INDX_INDIRECT_0_VIS_CULL__MASK = 0x00000300 +A4XX_CP_DRAW_INDX_INDIRECT_0_VIS_CULL__SHIFT = 8 +A4XX_CP_DRAW_INDX_INDIRECT_0_INDEX_SIZE__MASK = 0x00000c00 +A4XX_CP_DRAW_INDX_INDIRECT_0_INDEX_SIZE__SHIFT = 10 +A4XX_CP_DRAW_INDX_INDIRECT_0_PATCH_TYPE__MASK = 0x00003000 +A4XX_CP_DRAW_INDX_INDIRECT_0_PATCH_TYPE__SHIFT = 12 +A4XX_CP_DRAW_INDX_INDIRECT_0_GS_ENABLE = 0x00010000 +A4XX_CP_DRAW_INDX_INDIRECT_0_TESS_ENABLE = 0x00020000 +REG_A4XX_CP_DRAW_INDX_INDIRECT_1 = 0x00000001 +A4XX_CP_DRAW_INDX_INDIRECT_1_INDX_BASE__MASK = 0xffffffff +A4XX_CP_DRAW_INDX_INDIRECT_1_INDX_BASE__SHIFT = 0 +REG_A4XX_CP_DRAW_INDX_INDIRECT_2 = 0x00000002 +A4XX_CP_DRAW_INDX_INDIRECT_2_INDX_SIZE__MASK = 0xffffffff +A4XX_CP_DRAW_INDX_INDIRECT_2_INDX_SIZE__SHIFT = 0 +REG_A4XX_CP_DRAW_INDX_INDIRECT_3 = 0x00000003 +A4XX_CP_DRAW_INDX_INDIRECT_3_INDIRECT__MASK = 0xffffffff +A4XX_CP_DRAW_INDX_INDIRECT_3_INDIRECT__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_INDIRECT_1 = 0x00000001 +A5XX_CP_DRAW_INDX_INDIRECT_1_INDX_BASE_LO__MASK = 0xffffffff +A5XX_CP_DRAW_INDX_INDIRECT_1_INDX_BASE_LO__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_INDIRECT_2 = 0x00000002 +A5XX_CP_DRAW_INDX_INDIRECT_2_INDX_BASE_HI__MASK = 0xffffffff +A5XX_CP_DRAW_INDX_INDIRECT_2_INDX_BASE_HI__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_INDIRECT_INDX_BASE = 0x00000001 +REG_A5XX_CP_DRAW_INDX_INDIRECT_3 = 0x00000003 +A5XX_CP_DRAW_INDX_INDIRECT_3_MAX_INDICES__MASK = 0xffffffff +A5XX_CP_DRAW_INDX_INDIRECT_3_MAX_INDICES__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_INDIRECT_4 = 0x00000004 +A5XX_CP_DRAW_INDX_INDIRECT_4_INDIRECT_LO__MASK = 0xffffffff +A5XX_CP_DRAW_INDX_INDIRECT_4_INDIRECT_LO__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_INDIRECT_5 = 0x00000005 +A5XX_CP_DRAW_INDX_INDIRECT_5_INDIRECT_HI__MASK = 0xffffffff +A5XX_CP_DRAW_INDX_INDIRECT_5_INDIRECT_HI__SHIFT = 0 +REG_A5XX_CP_DRAW_INDX_INDIRECT_INDIRECT = 0x00000004 +REG_A6XX_CP_DRAW_INDIRECT_MULTI_0 = 0x00000000 +A6XX_CP_DRAW_INDIRECT_MULTI_0_PRIM_TYPE__MASK = 0x0000003f +A6XX_CP_DRAW_INDIRECT_MULTI_0_PRIM_TYPE__SHIFT = 0 +A6XX_CP_DRAW_INDIRECT_MULTI_0_SOURCE_SELECT__MASK = 0x000000c0 +A6XX_CP_DRAW_INDIRECT_MULTI_0_SOURCE_SELECT__SHIFT = 6 +A6XX_CP_DRAW_INDIRECT_MULTI_0_VIS_CULL__MASK = 0x00000300 +A6XX_CP_DRAW_INDIRECT_MULTI_0_VIS_CULL__SHIFT = 8 +A6XX_CP_DRAW_INDIRECT_MULTI_0_INDEX_SIZE__MASK = 0x00000c00 +A6XX_CP_DRAW_INDIRECT_MULTI_0_INDEX_SIZE__SHIFT = 10 +A6XX_CP_DRAW_INDIRECT_MULTI_0_PATCH_TYPE__MASK = 0x00003000 +A6XX_CP_DRAW_INDIRECT_MULTI_0_PATCH_TYPE__SHIFT = 12 +A6XX_CP_DRAW_INDIRECT_MULTI_0_GS_ENABLE = 0x00010000 +A6XX_CP_DRAW_INDIRECT_MULTI_0_TESS_ENABLE = 0x00020000 +REG_A6XX_CP_DRAW_INDIRECT_MULTI_1 = 0x00000001 +A6XX_CP_DRAW_INDIRECT_MULTI_1_OPCODE__MASK = 0x0000000f +A6XX_CP_DRAW_INDIRECT_MULTI_1_OPCODE__SHIFT = 0 +A6XX_CP_DRAW_INDIRECT_MULTI_1_DST_OFF__MASK = 0x003fff00 +A6XX_CP_DRAW_INDIRECT_MULTI_1_DST_OFF__SHIFT = 8 +REG_A6XX_CP_DRAW_INDIRECT_MULTI_DRAW_COUNT = 0x00000002 +REG_INDIRECT_OP_NORMAL_CP_DRAW_INDIRECT_MULTI_INDIRECT = 0x00000003 +REG_INDIRECT_OP_NORMAL_CP_DRAW_INDIRECT_MULTI_STRIDE = 0x00000005 +REG_INDIRECT_OP_INDEXED_CP_DRAW_INDIRECT_MULTI_INDEX = 0x00000003 +REG_INDIRECT_OP_INDEXED_CP_DRAW_INDIRECT_MULTI_MAX_INDICES = 0x00000005 +REG_INDIRECT_OP_INDEXED_CP_DRAW_INDIRECT_MULTI_INDIRECT = 0x00000006 +REG_INDIRECT_OP_INDEXED_CP_DRAW_INDIRECT_MULTI_STRIDE = 0x00000008 +REG_INDIRECT_OP_INDIRECT_COUNT_CP_DRAW_INDIRECT_MULTI_INDIRECT = 0x00000003 +REG_INDIRECT_OP_INDIRECT_COUNT_CP_DRAW_INDIRECT_MULTI_INDIRECT_COUNT = 0x00000005 +REG_INDIRECT_OP_INDIRECT_COUNT_CP_DRAW_INDIRECT_MULTI_STRIDE = 0x00000007 +REG_INDIRECT_OP_INDIRECT_COUNT_INDEXED_CP_DRAW_INDIRECT_MULTI_INDEX = 0x00000003 +REG_INDIRECT_OP_INDIRECT_COUNT_INDEXED_CP_DRAW_INDIRECT_MULTI_MAX_INDICES = 0x00000005 +REG_INDIRECT_OP_INDIRECT_COUNT_INDEXED_CP_DRAW_INDIRECT_MULTI_INDIRECT = 0x00000006 +REG_INDIRECT_OP_INDIRECT_COUNT_INDEXED_CP_DRAW_INDIRECT_MULTI_INDIRECT_COUNT = 0x00000008 +REG_INDIRECT_OP_INDIRECT_COUNT_INDEXED_CP_DRAW_INDIRECT_MULTI_STRIDE = 0x0000000a +REG_CP_DRAW_AUTO_0 = 0x00000000 +CP_DRAW_AUTO_0_PRIM_TYPE__MASK = 0x0000003f +CP_DRAW_AUTO_0_PRIM_TYPE__SHIFT = 0 +CP_DRAW_AUTO_0_SOURCE_SELECT__MASK = 0x000000c0 +CP_DRAW_AUTO_0_SOURCE_SELECT__SHIFT = 6 +CP_DRAW_AUTO_0_VIS_CULL__MASK = 0x00000300 +CP_DRAW_AUTO_0_VIS_CULL__SHIFT = 8 +CP_DRAW_AUTO_0_INDEX_SIZE__MASK = 0x00000c00 +CP_DRAW_AUTO_0_INDEX_SIZE__SHIFT = 10 +CP_DRAW_AUTO_0_PATCH_TYPE__MASK = 0x00003000 +CP_DRAW_AUTO_0_PATCH_TYPE__SHIFT = 12 +CP_DRAW_AUTO_0_GS_ENABLE = 0x00010000 +CP_DRAW_AUTO_0_TESS_ENABLE = 0x00020000 +REG_CP_DRAW_AUTO_1 = 0x00000001 +CP_DRAW_AUTO_1_NUM_INSTANCES__MASK = 0xffffffff +CP_DRAW_AUTO_1_NUM_INSTANCES__SHIFT = 0 +REG_CP_DRAW_AUTO_NUM_VERTICES_BASE = 0x00000002 +REG_CP_DRAW_AUTO_4 = 0x00000004 +CP_DRAW_AUTO_4_NUM_VERTICES_OFFSET__MASK = 0xffffffff +CP_DRAW_AUTO_4_NUM_VERTICES_OFFSET__SHIFT = 0 +REG_CP_DRAW_AUTO_5 = 0x00000005 +CP_DRAW_AUTO_5_STRIDE__MASK = 0xffffffff +CP_DRAW_AUTO_5_STRIDE__SHIFT = 0 +REG_CP_DRAW_PRED_ENABLE_GLOBAL_0 = 0x00000000 +CP_DRAW_PRED_ENABLE_GLOBAL_0_ENABLE = 0x00000001 +REG_CP_DRAW_PRED_ENABLE_LOCAL_0 = 0x00000000 +CP_DRAW_PRED_ENABLE_LOCAL_0_ENABLE = 0x00000001 +REG_CP_DRAW_PRED_SET_0 = 0x00000000 +CP_DRAW_PRED_SET_0_SRC__MASK = 0x000000f0 +CP_DRAW_PRED_SET_0_SRC__SHIFT = 4 +CP_DRAW_PRED_SET_0_TEST__MASK = 0x00000100 +CP_DRAW_PRED_SET_0_TEST__SHIFT = 8 +REG_CP_DRAW_PRED_SET_MEM_ADDR = 0x00000001 +REG_CP_SET_DRAW_STATE_ = lambda i0: (0x00000000 + 0x3*i0 ) # type: ignore +CP_SET_DRAW_STATE__0_COUNT__MASK = 0x0000ffff +CP_SET_DRAW_STATE__0_COUNT__SHIFT = 0 +CP_SET_DRAW_STATE__0_DIRTY = 0x00010000 +CP_SET_DRAW_STATE__0_DISABLE = 0x00020000 +CP_SET_DRAW_STATE__0_DISABLE_ALL_GROUPS = 0x00040000 +CP_SET_DRAW_STATE__0_LOAD_IMMED = 0x00080000 +CP_SET_DRAW_STATE__0_BINNING = 0x00100000 +CP_SET_DRAW_STATE__0_GMEM = 0x00200000 +CP_SET_DRAW_STATE__0_SYSMEM = 0x00400000 +CP_SET_DRAW_STATE__0_GROUP_ID__MASK = 0x1f000000 +CP_SET_DRAW_STATE__0_GROUP_ID__SHIFT = 24 +CP_SET_DRAW_STATE__1_ADDR_LO__MASK = 0xffffffff +CP_SET_DRAW_STATE__1_ADDR_LO__SHIFT = 0 +CP_SET_DRAW_STATE__2_ADDR_HI__MASK = 0xffffffff +CP_SET_DRAW_STATE__2_ADDR_HI__SHIFT = 0 +REG_CP_SET_BIN_0 = 0x00000000 +REG_CP_SET_BIN_1 = 0x00000001 +CP_SET_BIN_1_X1__MASK = 0x0000ffff +CP_SET_BIN_1_X1__SHIFT = 0 +CP_SET_BIN_1_Y1__MASK = 0xffff0000 +CP_SET_BIN_1_Y1__SHIFT = 16 +REG_CP_SET_BIN_2 = 0x00000002 +CP_SET_BIN_2_X2__MASK = 0x0000ffff +CP_SET_BIN_2_X2__SHIFT = 0 +CP_SET_BIN_2_Y2__MASK = 0xffff0000 +CP_SET_BIN_2_Y2__SHIFT = 16 +REG_CP_SET_BIN_DATA_0 = 0x00000000 +CP_SET_BIN_DATA_0_BIN_DATA_ADDR__MASK = 0xffffffff +CP_SET_BIN_DATA_0_BIN_DATA_ADDR__SHIFT = 0 +REG_CP_SET_BIN_DATA_1 = 0x00000001 +CP_SET_BIN_DATA_1_BIN_SIZE_ADDRESS__MASK = 0xffffffff +CP_SET_BIN_DATA_1_BIN_SIZE_ADDRESS__SHIFT = 0 +REG_CP_SET_BIN_DATA5_0 = 0x00000000 +CP_SET_BIN_DATA5_0_VSC_MASK__MASK = 0x0000ffff +CP_SET_BIN_DATA5_0_VSC_MASK__SHIFT = 0 +CP_SET_BIN_DATA5_0_VSC_SIZE__MASK = 0x003f0000 +CP_SET_BIN_DATA5_0_VSC_SIZE__SHIFT = 16 +CP_SET_BIN_DATA5_0_VSC_N__MASK = 0x07c00000 +CP_SET_BIN_DATA5_0_VSC_N__SHIFT = 22 +CP_SET_BIN_DATA5_0_ABS_MASK__MASK = 0x10000000 +CP_SET_BIN_DATA5_0_ABS_MASK__SHIFT = 28 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_1 = 0x00000001 +NO_ABS_MASK_CP_SET_BIN_DATA5_1_BIN_DATA_ADDR_LO__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_1_BIN_DATA_ADDR_LO__SHIFT = 0 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_2 = 0x00000002 +NO_ABS_MASK_CP_SET_BIN_DATA5_2_BIN_DATA_ADDR_HI__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_2_BIN_DATA_ADDR_HI__SHIFT = 0 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_3 = 0x00000003 +NO_ABS_MASK_CP_SET_BIN_DATA5_3_BIN_SIZE_ADDRESS_LO__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_3_BIN_SIZE_ADDRESS_LO__SHIFT = 0 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_4 = 0x00000004 +NO_ABS_MASK_CP_SET_BIN_DATA5_4_BIN_SIZE_ADDRESS_HI__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_4_BIN_SIZE_ADDRESS_HI__SHIFT = 0 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_5 = 0x00000005 +NO_ABS_MASK_CP_SET_BIN_DATA5_5_BIN_PRIM_STRM_LO__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_5_BIN_PRIM_STRM_LO__SHIFT = 0 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_6 = 0x00000006 +NO_ABS_MASK_CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_HI__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_HI__SHIFT = 0 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_7 = 0x00000007 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_9 = 0x00000009 +REG_ABS_MASK_CP_SET_BIN_DATA5_ABS_MASK = 0x00000001 +REG_ABS_MASK_CP_SET_BIN_DATA5_2 = 0x00000002 +ABS_MASK_CP_SET_BIN_DATA5_2_BIN_DATA_ADDR_LO__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_2_BIN_DATA_ADDR_LO__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_3 = 0x00000003 +ABS_MASK_CP_SET_BIN_DATA5_3_BIN_DATA_ADDR_HI__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_3_BIN_DATA_ADDR_HI__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_4 = 0x00000004 +ABS_MASK_CP_SET_BIN_DATA5_4_BIN_SIZE_ADDRESS_LO__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_4_BIN_SIZE_ADDRESS_LO__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_5 = 0x00000005 +ABS_MASK_CP_SET_BIN_DATA5_5_BIN_SIZE_ADDRESS_HI__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_5_BIN_SIZE_ADDRESS_HI__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_6 = 0x00000006 +ABS_MASK_CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_LO__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_LO__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_7 = 0x00000007 +ABS_MASK_CP_SET_BIN_DATA5_7_BIN_PRIM_STRM_HI__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_7_BIN_PRIM_STRM_HI__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_8 = 0x00000008 +REG_ABS_MASK_CP_SET_BIN_DATA5_10 = 0x0000000a +REG_CP_SET_BIN_DATA5_OFFSET_0 = 0x00000000 +CP_SET_BIN_DATA5_OFFSET_0_VSC_MASK__MASK = 0x0000ffff +CP_SET_BIN_DATA5_OFFSET_0_VSC_MASK__SHIFT = 0 +CP_SET_BIN_DATA5_OFFSET_0_VSC_SIZE__MASK = 0x003f0000 +CP_SET_BIN_DATA5_OFFSET_0_VSC_SIZE__SHIFT = 16 +CP_SET_BIN_DATA5_OFFSET_0_VSC_N__MASK = 0x07c00000 +CP_SET_BIN_DATA5_OFFSET_0_VSC_N__SHIFT = 22 +CP_SET_BIN_DATA5_OFFSET_0_ABS_MASK__MASK = 0x10000000 +CP_SET_BIN_DATA5_OFFSET_0_ABS_MASK__SHIFT = 28 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_1 = 0x00000001 +NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_1_BIN_DATA_OFFSET__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_1_BIN_DATA_OFFSET__SHIFT = 0 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_2 = 0x00000002 +NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_2_BIN_SIZE_OFFSET__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_2_BIN_SIZE_OFFSET__SHIFT = 0 +REG_NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_3 = 0x00000003 +NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_3_BIN_DATA2_OFFSET__MASK = 0xffffffff +NO_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_3_BIN_DATA2_OFFSET__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_ABS_MASK = 0x00000001 +REG_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_2 = 0x00000002 +ABS_MASK_CP_SET_BIN_DATA5_OFFSET_2_BIN_DATA_OFFSET__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_OFFSET_2_BIN_DATA_OFFSET__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_3 = 0x00000003 +ABS_MASK_CP_SET_BIN_DATA5_OFFSET_3_BIN_SIZE_OFFSET__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_OFFSET_3_BIN_SIZE_OFFSET__SHIFT = 0 +REG_ABS_MASK_CP_SET_BIN_DATA5_OFFSET_4 = 0x00000004 +ABS_MASK_CP_SET_BIN_DATA5_OFFSET_4_BIN_DATA2_OFFSET__MASK = 0xffffffff +ABS_MASK_CP_SET_BIN_DATA5_OFFSET_4_BIN_DATA2_OFFSET__SHIFT = 0 +REG_CP_REG_RMW_0 = 0x00000000 +CP_REG_RMW_0_DST_REG__MASK = 0x0003ffff +CP_REG_RMW_0_DST_REG__SHIFT = 0 +CP_REG_RMW_0_DST_SCRATCH = 0x00080000 +CP_REG_RMW_0_SKIP_WAIT_FOR_ME = 0x00800000 +CP_REG_RMW_0_ROTATE__MASK = 0x1f000000 +CP_REG_RMW_0_ROTATE__SHIFT = 24 +CP_REG_RMW_0_SRC1_ADD = 0x20000000 +CP_REG_RMW_0_SRC1_IS_REG = 0x40000000 +CP_REG_RMW_0_SRC0_IS_REG = 0x80000000 +REG_CP_REG_RMW_1 = 0x00000001 +CP_REG_RMW_1_SRC0__MASK = 0xffffffff +CP_REG_RMW_1_SRC0__SHIFT = 0 +REG_CP_REG_RMW_2 = 0x00000002 +CP_REG_RMW_2_SRC1__MASK = 0xffffffff +CP_REG_RMW_2_SRC1__SHIFT = 0 +REG_CP_REG_TO_MEM_0 = 0x00000000 +CP_REG_TO_MEM_0_REG__MASK = 0x0003ffff +CP_REG_TO_MEM_0_REG__SHIFT = 0 +CP_REG_TO_MEM_0_CNT__MASK = 0x3ffc0000 +CP_REG_TO_MEM_0_CNT__SHIFT = 18 +CP_REG_TO_MEM_0_64B = 0x40000000 +CP_REG_TO_MEM_0_ACCUMULATE = 0x80000000 +REG_CP_REG_TO_MEM_1 = 0x00000001 +CP_REG_TO_MEM_1_DEST__MASK = 0xffffffff +CP_REG_TO_MEM_1_DEST__SHIFT = 0 +REG_CP_REG_TO_MEM_2 = 0x00000002 +CP_REG_TO_MEM_2_DEST_HI__MASK = 0xffffffff +CP_REG_TO_MEM_2_DEST_HI__SHIFT = 0 +REG_CP_REG_TO_MEM_OFFSET_REG_0 = 0x00000000 +CP_REG_TO_MEM_OFFSET_REG_0_REG__MASK = 0x0003ffff +CP_REG_TO_MEM_OFFSET_REG_0_REG__SHIFT = 0 +CP_REG_TO_MEM_OFFSET_REG_0_CNT__MASK = 0x3ffc0000 +CP_REG_TO_MEM_OFFSET_REG_0_CNT__SHIFT = 18 +CP_REG_TO_MEM_OFFSET_REG_0_64B = 0x40000000 +CP_REG_TO_MEM_OFFSET_REG_0_ACCUMULATE = 0x80000000 +REG_CP_REG_TO_MEM_OFFSET_REG_1 = 0x00000001 +CP_REG_TO_MEM_OFFSET_REG_1_DEST__MASK = 0xffffffff +CP_REG_TO_MEM_OFFSET_REG_1_DEST__SHIFT = 0 +REG_CP_REG_TO_MEM_OFFSET_REG_2 = 0x00000002 +CP_REG_TO_MEM_OFFSET_REG_2_DEST_HI__MASK = 0xffffffff +CP_REG_TO_MEM_OFFSET_REG_2_DEST_HI__SHIFT = 0 +REG_CP_REG_TO_MEM_OFFSET_REG_3 = 0x00000003 +CP_REG_TO_MEM_OFFSET_REG_3_OFFSET0__MASK = 0x0003ffff +CP_REG_TO_MEM_OFFSET_REG_3_OFFSET0__SHIFT = 0 +CP_REG_TO_MEM_OFFSET_REG_3_OFFSET0_SCRATCH = 0x00080000 +REG_CP_REG_TO_MEM_OFFSET_MEM_0 = 0x00000000 +CP_REG_TO_MEM_OFFSET_MEM_0_REG__MASK = 0x0003ffff +CP_REG_TO_MEM_OFFSET_MEM_0_REG__SHIFT = 0 +CP_REG_TO_MEM_OFFSET_MEM_0_CNT__MASK = 0x3ffc0000 +CP_REG_TO_MEM_OFFSET_MEM_0_CNT__SHIFT = 18 +CP_REG_TO_MEM_OFFSET_MEM_0_64B = 0x40000000 +CP_REG_TO_MEM_OFFSET_MEM_0_ACCUMULATE = 0x80000000 +REG_CP_REG_TO_MEM_OFFSET_MEM_1 = 0x00000001 +CP_REG_TO_MEM_OFFSET_MEM_1_DEST__MASK = 0xffffffff +CP_REG_TO_MEM_OFFSET_MEM_1_DEST__SHIFT = 0 +REG_CP_REG_TO_MEM_OFFSET_MEM_2 = 0x00000002 +CP_REG_TO_MEM_OFFSET_MEM_2_DEST_HI__MASK = 0xffffffff +CP_REG_TO_MEM_OFFSET_MEM_2_DEST_HI__SHIFT = 0 +REG_CP_REG_TO_MEM_OFFSET_MEM_3 = 0x00000003 +CP_REG_TO_MEM_OFFSET_MEM_3_OFFSET_LO__MASK = 0xffffffff +CP_REG_TO_MEM_OFFSET_MEM_3_OFFSET_LO__SHIFT = 0 +REG_CP_REG_TO_MEM_OFFSET_MEM_4 = 0x00000004 +CP_REG_TO_MEM_OFFSET_MEM_4_OFFSET_HI__MASK = 0xffffffff +CP_REG_TO_MEM_OFFSET_MEM_4_OFFSET_HI__SHIFT = 0 +REG_CP_MEM_TO_REG_0 = 0x00000000 +CP_MEM_TO_REG_0_REG__MASK = 0x0003ffff +CP_MEM_TO_REG_0_REG__SHIFT = 0 +CP_MEM_TO_REG_0_CNT__MASK = 0x3ff80000 +CP_MEM_TO_REG_0_CNT__SHIFT = 19 +CP_MEM_TO_REG_0_SHIFT_BY_2 = 0x40000000 +CP_MEM_TO_REG_0_UNK31 = 0x80000000 +REG_CP_MEM_TO_REG_1 = 0x00000001 +CP_MEM_TO_REG_1_SRC__MASK = 0xffffffff +CP_MEM_TO_REG_1_SRC__SHIFT = 0 +REG_CP_MEM_TO_REG_2 = 0x00000002 +CP_MEM_TO_REG_2_SRC_HI__MASK = 0xffffffff +CP_MEM_TO_REG_2_SRC_HI__SHIFT = 0 +REG_CP_MEM_TO_MEM_0 = 0x00000000 +CP_MEM_TO_MEM_0_NEG_A = 0x00000001 +CP_MEM_TO_MEM_0_NEG_B = 0x00000002 +CP_MEM_TO_MEM_0_NEG_C = 0x00000004 +CP_MEM_TO_MEM_0_DOUBLE = 0x20000000 +CP_MEM_TO_MEM_0_WAIT_FOR_MEM_WRITES = 0x40000000 +CP_MEM_TO_MEM_0_UNK31 = 0x80000000 +REG_CP_MEMCPY_0 = 0x00000000 +CP_MEMCPY_0_DWORDS__MASK = 0xffffffff +CP_MEMCPY_0_DWORDS__SHIFT = 0 +REG_CP_MEMCPY_1 = 0x00000001 +CP_MEMCPY_1_SRC_LO__MASK = 0xffffffff +CP_MEMCPY_1_SRC_LO__SHIFT = 0 +REG_CP_MEMCPY_2 = 0x00000002 +CP_MEMCPY_2_SRC_HI__MASK = 0xffffffff +CP_MEMCPY_2_SRC_HI__SHIFT = 0 +REG_CP_MEMCPY_3 = 0x00000003 +CP_MEMCPY_3_DST_LO__MASK = 0xffffffff +CP_MEMCPY_3_DST_LO__SHIFT = 0 +REG_CP_MEMCPY_4 = 0x00000004 +CP_MEMCPY_4_DST_HI__MASK = 0xffffffff +CP_MEMCPY_4_DST_HI__SHIFT = 0 +REG_CP_REG_TO_SCRATCH_0 = 0x00000000 +CP_REG_TO_SCRATCH_0_REG__MASK = 0x0003ffff +CP_REG_TO_SCRATCH_0_REG__SHIFT = 0 +CP_REG_TO_SCRATCH_0_SCRATCH__MASK = 0x00700000 +CP_REG_TO_SCRATCH_0_SCRATCH__SHIFT = 20 +CP_REG_TO_SCRATCH_0_CNT__MASK = 0x07000000 +CP_REG_TO_SCRATCH_0_CNT__SHIFT = 24 +CP_REG_TO_SCRATCH_0_SKIP_WAIT_FOR_ME = 0x08000000 +REG_CP_SCRATCH_TO_REG_0 = 0x00000000 +CP_SCRATCH_TO_REG_0_REG__MASK = 0x0003ffff +CP_SCRATCH_TO_REG_0_REG__SHIFT = 0 +CP_SCRATCH_TO_REG_0_UNK18 = 0x00040000 +CP_SCRATCH_TO_REG_0_SCRATCH__MASK = 0x00700000 +CP_SCRATCH_TO_REG_0_SCRATCH__SHIFT = 20 +CP_SCRATCH_TO_REG_0_CNT__MASK = 0x07000000 +CP_SCRATCH_TO_REG_0_CNT__SHIFT = 24 +REG_CP_SCRATCH_WRITE_0 = 0x00000000 +CP_SCRATCH_WRITE_0_SCRATCH__MASK = 0x00700000 +CP_SCRATCH_WRITE_0_SCRATCH__SHIFT = 20 +REG_CP_MEM_WRITE_0 = 0x00000000 +CP_MEM_WRITE_0_ADDR_LO__MASK = 0xffffffff +CP_MEM_WRITE_0_ADDR_LO__SHIFT = 0 +REG_CP_MEM_WRITE_1 = 0x00000001 +CP_MEM_WRITE_1_ADDR_HI__MASK = 0xffffffff +CP_MEM_WRITE_1_ADDR_HI__SHIFT = 0 +REG_CP_COND_WRITE_0 = 0x00000000 +CP_COND_WRITE_0_FUNCTION__MASK = 0x00000007 +CP_COND_WRITE_0_FUNCTION__SHIFT = 0 +CP_COND_WRITE_0_POLL_MEMORY = 0x00000010 +CP_COND_WRITE_0_WRITE_MEMORY = 0x00000100 +REG_CP_COND_WRITE_1 = 0x00000001 +CP_COND_WRITE_1_POLL_ADDR__MASK = 0xffffffff +CP_COND_WRITE_1_POLL_ADDR__SHIFT = 0 +REG_CP_COND_WRITE_2 = 0x00000002 +CP_COND_WRITE_2_REF__MASK = 0xffffffff +CP_COND_WRITE_2_REF__SHIFT = 0 +REG_CP_COND_WRITE_3 = 0x00000003 +CP_COND_WRITE_3_MASK__MASK = 0xffffffff +CP_COND_WRITE_3_MASK__SHIFT = 0 +REG_CP_COND_WRITE_4 = 0x00000004 +CP_COND_WRITE_4_WRITE_ADDR__MASK = 0xffffffff +CP_COND_WRITE_4_WRITE_ADDR__SHIFT = 0 +REG_CP_COND_WRITE_5 = 0x00000005 +CP_COND_WRITE_5_WRITE_DATA__MASK = 0xffffffff +CP_COND_WRITE_5_WRITE_DATA__SHIFT = 0 +REG_CP_COND_WRITE5_0 = 0x00000000 +CP_COND_WRITE5_0_FUNCTION__MASK = 0x00000007 +CP_COND_WRITE5_0_FUNCTION__SHIFT = 0 +CP_COND_WRITE5_0_SIGNED_COMPARE = 0x00000008 +CP_COND_WRITE5_0_POLL__MASK = 0x00000030 +CP_COND_WRITE5_0_POLL__SHIFT = 4 +CP_COND_WRITE5_0_WRITE_MEMORY = 0x00000100 +REG_CP_COND_WRITE5_1 = 0x00000001 +CP_COND_WRITE5_1_POLL_ADDR_LO__MASK = 0xffffffff +CP_COND_WRITE5_1_POLL_ADDR_LO__SHIFT = 0 +REG_CP_COND_WRITE5_2 = 0x00000002 +CP_COND_WRITE5_2_POLL_ADDR_HI__MASK = 0xffffffff +CP_COND_WRITE5_2_POLL_ADDR_HI__SHIFT = 0 +REG_CP_COND_WRITE5_3 = 0x00000003 +CP_COND_WRITE5_3_REF__MASK = 0xffffffff +CP_COND_WRITE5_3_REF__SHIFT = 0 +REG_CP_COND_WRITE5_4 = 0x00000004 +CP_COND_WRITE5_4_MASK__MASK = 0xffffffff +CP_COND_WRITE5_4_MASK__SHIFT = 0 +REG_CP_COND_WRITE5_5 = 0x00000005 +CP_COND_WRITE5_5_WRITE_ADDR_LO__MASK = 0xffffffff +CP_COND_WRITE5_5_WRITE_ADDR_LO__SHIFT = 0 +REG_CP_COND_WRITE5_6 = 0x00000006 +CP_COND_WRITE5_6_WRITE_ADDR_HI__MASK = 0xffffffff +CP_COND_WRITE5_6_WRITE_ADDR_HI__SHIFT = 0 +REG_CP_COND_WRITE5_7 = 0x00000007 +CP_COND_WRITE5_7_WRITE_DATA__MASK = 0xffffffff +CP_COND_WRITE5_7_WRITE_DATA__SHIFT = 0 +REG_CP_WAIT_MEM_GTE_0 = 0x00000000 +CP_WAIT_MEM_GTE_0_RESERVED__MASK = 0xffffffff +CP_WAIT_MEM_GTE_0_RESERVED__SHIFT = 0 +REG_CP_WAIT_MEM_GTE_1 = 0x00000001 +CP_WAIT_MEM_GTE_1_POLL_ADDR_LO__MASK = 0xffffffff +CP_WAIT_MEM_GTE_1_POLL_ADDR_LO__SHIFT = 0 +REG_CP_WAIT_MEM_GTE_2 = 0x00000002 +CP_WAIT_MEM_GTE_2_POLL_ADDR_HI__MASK = 0xffffffff +CP_WAIT_MEM_GTE_2_POLL_ADDR_HI__SHIFT = 0 +REG_CP_WAIT_MEM_GTE_3 = 0x00000003 +CP_WAIT_MEM_GTE_3_REF__MASK = 0xffffffff +CP_WAIT_MEM_GTE_3_REF__SHIFT = 0 +REG_CP_WAIT_REG_MEM_0 = 0x00000000 +CP_WAIT_REG_MEM_0_FUNCTION__MASK = 0x00000007 +CP_WAIT_REG_MEM_0_FUNCTION__SHIFT = 0 +CP_WAIT_REG_MEM_0_SIGNED_COMPARE = 0x00000008 +CP_WAIT_REG_MEM_0_POLL__MASK = 0x00000030 +CP_WAIT_REG_MEM_0_POLL__SHIFT = 4 +CP_WAIT_REG_MEM_0_WRITE_MEMORY = 0x00000100 +REG_CP_WAIT_REG_MEM_1 = 0x00000001 +CP_WAIT_REG_MEM_1_POLL_ADDR_LO__MASK = 0xffffffff +CP_WAIT_REG_MEM_1_POLL_ADDR_LO__SHIFT = 0 +REG_CP_WAIT_REG_MEM_2 = 0x00000002 +CP_WAIT_REG_MEM_2_POLL_ADDR_HI__MASK = 0xffffffff +CP_WAIT_REG_MEM_2_POLL_ADDR_HI__SHIFT = 0 +REG_CP_WAIT_REG_MEM_3 = 0x00000003 +CP_WAIT_REG_MEM_3_REF__MASK = 0xffffffff +CP_WAIT_REG_MEM_3_REF__SHIFT = 0 +REG_CP_WAIT_REG_MEM_4 = 0x00000004 +CP_WAIT_REG_MEM_4_MASK__MASK = 0xffffffff +CP_WAIT_REG_MEM_4_MASK__SHIFT = 0 +REG_CP_WAIT_REG_MEM_5 = 0x00000005 +CP_WAIT_REG_MEM_5_DELAY_LOOP_CYCLES__MASK = 0xffffffff +CP_WAIT_REG_MEM_5_DELAY_LOOP_CYCLES__SHIFT = 0 +REG_CP_WAIT_TWO_REGS_0 = 0x00000000 +CP_WAIT_TWO_REGS_0_REG0__MASK = 0x0003ffff +CP_WAIT_TWO_REGS_0_REG0__SHIFT = 0 +REG_CP_WAIT_TWO_REGS_1 = 0x00000001 +CP_WAIT_TWO_REGS_1_REG1__MASK = 0x0003ffff +CP_WAIT_TWO_REGS_1_REG1__SHIFT = 0 +REG_CP_WAIT_TWO_REGS_2 = 0x00000002 +CP_WAIT_TWO_REGS_2_REF__MASK = 0xffffffff +CP_WAIT_TWO_REGS_2_REF__SHIFT = 0 +REG_CP_DISPATCH_COMPUTE_0 = 0x00000000 +REG_CP_DISPATCH_COMPUTE_1 = 0x00000001 +CP_DISPATCH_COMPUTE_1_X__MASK = 0xffffffff +CP_DISPATCH_COMPUTE_1_X__SHIFT = 0 +REG_CP_DISPATCH_COMPUTE_2 = 0x00000002 +CP_DISPATCH_COMPUTE_2_Y__MASK = 0xffffffff +CP_DISPATCH_COMPUTE_2_Y__SHIFT = 0 +REG_CP_DISPATCH_COMPUTE_3 = 0x00000003 +CP_DISPATCH_COMPUTE_3_Z__MASK = 0xffffffff +CP_DISPATCH_COMPUTE_3_Z__SHIFT = 0 +REG_CP_SET_RENDER_MODE_0 = 0x00000000 +CP_SET_RENDER_MODE_0_MODE__MASK = 0x000001ff +CP_SET_RENDER_MODE_0_MODE__SHIFT = 0 +REG_CP_SET_RENDER_MODE_1 = 0x00000001 +CP_SET_RENDER_MODE_1_ADDR_0_LO__MASK = 0xffffffff +CP_SET_RENDER_MODE_1_ADDR_0_LO__SHIFT = 0 +REG_CP_SET_RENDER_MODE_2 = 0x00000002 +CP_SET_RENDER_MODE_2_ADDR_0_HI__MASK = 0xffffffff +CP_SET_RENDER_MODE_2_ADDR_0_HI__SHIFT = 0 +REG_CP_SET_RENDER_MODE_3 = 0x00000003 +CP_SET_RENDER_MODE_3_VSC_ENABLE = 0x00000008 +CP_SET_RENDER_MODE_3_GMEM_ENABLE = 0x00000010 +REG_CP_SET_RENDER_MODE_4 = 0x00000004 +REG_CP_SET_RENDER_MODE_5 = 0x00000005 +CP_SET_RENDER_MODE_5_ADDR_1_LEN__MASK = 0xffffffff +CP_SET_RENDER_MODE_5_ADDR_1_LEN__SHIFT = 0 +REG_CP_SET_RENDER_MODE_6 = 0x00000006 +CP_SET_RENDER_MODE_6_ADDR_1_LO__MASK = 0xffffffff +CP_SET_RENDER_MODE_6_ADDR_1_LO__SHIFT = 0 +REG_CP_SET_RENDER_MODE_7 = 0x00000007 +CP_SET_RENDER_MODE_7_ADDR_1_HI__MASK = 0xffffffff +CP_SET_RENDER_MODE_7_ADDR_1_HI__SHIFT = 0 +REG_CP_COMPUTE_CHECKPOINT_0 = 0x00000000 +CP_COMPUTE_CHECKPOINT_0_ADDR_0_LO__MASK = 0xffffffff +CP_COMPUTE_CHECKPOINT_0_ADDR_0_LO__SHIFT = 0 +REG_CP_COMPUTE_CHECKPOINT_1 = 0x00000001 +CP_COMPUTE_CHECKPOINT_1_ADDR_0_HI__MASK = 0xffffffff +CP_COMPUTE_CHECKPOINT_1_ADDR_0_HI__SHIFT = 0 +REG_CP_COMPUTE_CHECKPOINT_2 = 0x00000002 +REG_CP_COMPUTE_CHECKPOINT_3 = 0x00000003 +REG_CP_COMPUTE_CHECKPOINT_4 = 0x00000004 +CP_COMPUTE_CHECKPOINT_4_ADDR_1_LEN__MASK = 0xffffffff +CP_COMPUTE_CHECKPOINT_4_ADDR_1_LEN__SHIFT = 0 +REG_CP_COMPUTE_CHECKPOINT_5 = 0x00000005 +CP_COMPUTE_CHECKPOINT_5_ADDR_1_LO__MASK = 0xffffffff +CP_COMPUTE_CHECKPOINT_5_ADDR_1_LO__SHIFT = 0 +REG_CP_COMPUTE_CHECKPOINT_6 = 0x00000006 +CP_COMPUTE_CHECKPOINT_6_ADDR_1_HI__MASK = 0xffffffff +CP_COMPUTE_CHECKPOINT_6_ADDR_1_HI__SHIFT = 0 +REG_CP_COMPUTE_CHECKPOINT_7 = 0x00000007 +REG_CP_PERFCOUNTER_ACTION_0 = 0x00000000 +REG_CP_PERFCOUNTER_ACTION_1 = 0x00000001 +CP_PERFCOUNTER_ACTION_1_ADDR_0_LO__MASK = 0xffffffff +CP_PERFCOUNTER_ACTION_1_ADDR_0_LO__SHIFT = 0 +REG_CP_PERFCOUNTER_ACTION_2 = 0x00000002 +CP_PERFCOUNTER_ACTION_2_ADDR_0_HI__MASK = 0xffffffff +CP_PERFCOUNTER_ACTION_2_ADDR_0_HI__SHIFT = 0 +REG_CP_EVENT_WRITE_0 = 0x00000000 +CP_EVENT_WRITE_0_EVENT__MASK = 0x000000ff +CP_EVENT_WRITE_0_EVENT__SHIFT = 0 +CP_EVENT_WRITE_0_TIMESTAMP = 0x40000000 +CP_EVENT_WRITE_0_IRQ = 0x80000000 +REG_CP_EVENT_WRITE_1 = 0x00000001 +CP_EVENT_WRITE_1_ADDR_0_LO__MASK = 0xffffffff +CP_EVENT_WRITE_1_ADDR_0_LO__SHIFT = 0 +REG_CP_EVENT_WRITE_2 = 0x00000002 +CP_EVENT_WRITE_2_ADDR_0_HI__MASK = 0xffffffff +CP_EVENT_WRITE_2_ADDR_0_HI__SHIFT = 0 +REG_CP_EVENT_WRITE_3 = 0x00000003 +REG_CP_EVENT_WRITE7_0 = 0x00000000 +CP_EVENT_WRITE7_0_EVENT__MASK = 0x000000ff +CP_EVENT_WRITE7_0_EVENT__SHIFT = 0 +CP_EVENT_WRITE7_0_WRITE_SAMPLE_COUNT = 0x00001000 +CP_EVENT_WRITE7_0_SAMPLE_COUNT_END_OFFSET = 0x00002000 +CP_EVENT_WRITE7_0_WRITE_ACCUM_SAMPLE_COUNT_DIFF = 0x00004000 +CP_EVENT_WRITE7_0_INC_BV_COUNT = 0x00010000 +CP_EVENT_WRITE7_0_INC_BR_COUNT = 0x00020000 +CP_EVENT_WRITE7_0_CLEAR_RENDER_RESOURCE = 0x00040000 +CP_EVENT_WRITE7_0_CLEAR_LRZ_RESOURCE = 0x00080000 +CP_EVENT_WRITE7_0_WRITE_SRC__MASK = 0x00700000 +CP_EVENT_WRITE7_0_WRITE_SRC__SHIFT = 20 +CP_EVENT_WRITE7_0_WRITE_DST__MASK = 0x01000000 +CP_EVENT_WRITE7_0_WRITE_DST__SHIFT = 24 +CP_EVENT_WRITE7_0_WRITE_ENABLED = 0x08000000 +CP_EVENT_WRITE7_0_IRQ = 0x80000000 +REG_EV_DST_RAM_CP_EVENT_WRITE7_1 = 0x00000001 +REG_EV_DST_RAM_CP_EVENT_WRITE7_3 = 0x00000003 +EV_DST_RAM_CP_EVENT_WRITE7_3_PAYLOAD_0__MASK = 0xffffffff +EV_DST_RAM_CP_EVENT_WRITE7_3_PAYLOAD_0__SHIFT = 0 +REG_EV_DST_RAM_CP_EVENT_WRITE7_4 = 0x00000004 +EV_DST_RAM_CP_EVENT_WRITE7_4_PAYLOAD_1__MASK = 0xffffffff +EV_DST_RAM_CP_EVENT_WRITE7_4_PAYLOAD_1__SHIFT = 0 +REG_EV_DST_ONCHIP_CP_EVENT_WRITE7_1 = 0x00000001 +EV_DST_ONCHIP_CP_EVENT_WRITE7_1_ONCHIP_ADDR_0__MASK = 0xffffffff +EV_DST_ONCHIP_CP_EVENT_WRITE7_1_ONCHIP_ADDR_0__SHIFT = 0 +REG_EV_DST_ONCHIP_CP_EVENT_WRITE7_3 = 0x00000003 +EV_DST_ONCHIP_CP_EVENT_WRITE7_3_PAYLOAD_0__MASK = 0xffffffff +EV_DST_ONCHIP_CP_EVENT_WRITE7_3_PAYLOAD_0__SHIFT = 0 +REG_EV_DST_ONCHIP_CP_EVENT_WRITE7_4 = 0x00000004 +EV_DST_ONCHIP_CP_EVENT_WRITE7_4_PAYLOAD_1__MASK = 0xffffffff +EV_DST_ONCHIP_CP_EVENT_WRITE7_4_PAYLOAD_1__SHIFT = 0 +REG_CP_BLIT_0 = 0x00000000 +CP_BLIT_0_OP__MASK = 0x0000000f +CP_BLIT_0_OP__SHIFT = 0 +REG_CP_BLIT_1 = 0x00000001 +CP_BLIT_1_SRC_X1__MASK = 0x00003fff +CP_BLIT_1_SRC_X1__SHIFT = 0 +CP_BLIT_1_SRC_Y1__MASK = 0x3fff0000 +CP_BLIT_1_SRC_Y1__SHIFT = 16 +REG_CP_BLIT_2 = 0x00000002 +CP_BLIT_2_SRC_X2__MASK = 0x00003fff +CP_BLIT_2_SRC_X2__SHIFT = 0 +CP_BLIT_2_SRC_Y2__MASK = 0x3fff0000 +CP_BLIT_2_SRC_Y2__SHIFT = 16 +REG_CP_BLIT_3 = 0x00000003 +CP_BLIT_3_DST_X1__MASK = 0x00003fff +CP_BLIT_3_DST_X1__SHIFT = 0 +CP_BLIT_3_DST_Y1__MASK = 0x3fff0000 +CP_BLIT_3_DST_Y1__SHIFT = 16 +REG_CP_BLIT_4 = 0x00000004 +CP_BLIT_4_DST_X2__MASK = 0x00003fff +CP_BLIT_4_DST_X2__SHIFT = 0 +CP_BLIT_4_DST_Y2__MASK = 0x3fff0000 +CP_BLIT_4_DST_Y2__SHIFT = 16 +REG_CP_EXEC_CS_0 = 0x00000000 +REG_CP_EXEC_CS_1 = 0x00000001 +CP_EXEC_CS_1_NGROUPS_X__MASK = 0xffffffff +CP_EXEC_CS_1_NGROUPS_X__SHIFT = 0 +REG_CP_EXEC_CS_2 = 0x00000002 +CP_EXEC_CS_2_NGROUPS_Y__MASK = 0xffffffff +CP_EXEC_CS_2_NGROUPS_Y__SHIFT = 0 +REG_CP_EXEC_CS_3 = 0x00000003 +CP_EXEC_CS_3_NGROUPS_Z__MASK = 0xffffffff +CP_EXEC_CS_3_NGROUPS_Z__SHIFT = 0 +REG_A4XX_CP_EXEC_CS_INDIRECT_0 = 0x00000000 +REG_A4XX_CP_EXEC_CS_INDIRECT_1 = 0x00000001 +A4XX_CP_EXEC_CS_INDIRECT_1_ADDR__MASK = 0xffffffff +A4XX_CP_EXEC_CS_INDIRECT_1_ADDR__SHIFT = 0 +REG_A4XX_CP_EXEC_CS_INDIRECT_2 = 0x00000002 +A4XX_CP_EXEC_CS_INDIRECT_2_LOCALSIZEX__MASK = 0x00000ffc +A4XX_CP_EXEC_CS_INDIRECT_2_LOCALSIZEX__SHIFT = 2 +A4XX_CP_EXEC_CS_INDIRECT_2_LOCALSIZEY__MASK = 0x003ff000 +A4XX_CP_EXEC_CS_INDIRECT_2_LOCALSIZEY__SHIFT = 12 +A4XX_CP_EXEC_CS_INDIRECT_2_LOCALSIZEZ__MASK = 0xffc00000 +A4XX_CP_EXEC_CS_INDIRECT_2_LOCALSIZEZ__SHIFT = 22 +REG_A5XX_CP_EXEC_CS_INDIRECT_1 = 0x00000001 +A5XX_CP_EXEC_CS_INDIRECT_1_ADDR_LO__MASK = 0xffffffff +A5XX_CP_EXEC_CS_INDIRECT_1_ADDR_LO__SHIFT = 0 +REG_A5XX_CP_EXEC_CS_INDIRECT_2 = 0x00000002 +A5XX_CP_EXEC_CS_INDIRECT_2_ADDR_HI__MASK = 0xffffffff +A5XX_CP_EXEC_CS_INDIRECT_2_ADDR_HI__SHIFT = 0 +REG_A5XX_CP_EXEC_CS_INDIRECT_3 = 0x00000003 +A5XX_CP_EXEC_CS_INDIRECT_3_LOCALSIZEX__MASK = 0x00000ffc +A5XX_CP_EXEC_CS_INDIRECT_3_LOCALSIZEX__SHIFT = 2 +A5XX_CP_EXEC_CS_INDIRECT_3_LOCALSIZEY__MASK = 0x003ff000 +A5XX_CP_EXEC_CS_INDIRECT_3_LOCALSIZEY__SHIFT = 12 +A5XX_CP_EXEC_CS_INDIRECT_3_LOCALSIZEZ__MASK = 0xffc00000 +A5XX_CP_EXEC_CS_INDIRECT_3_LOCALSIZEZ__SHIFT = 22 +REG_A6XX_CP_SET_MARKER_0 = 0x00000000 +A6XX_CP_SET_MARKER_0_MARKER_MODE__MASK = 0x00000100 +A6XX_CP_SET_MARKER_0_MARKER_MODE__SHIFT = 8 +A6XX_CP_SET_MARKER_0_MODE__MASK = 0x0000000f +A6XX_CP_SET_MARKER_0_MODE__SHIFT = 0 +A6XX_CP_SET_MARKER_0_USES_GMEM = 0x00000010 +A6XX_CP_SET_MARKER_0_IFPC_MODE__MASK = 0x00000001 +A6XX_CP_SET_MARKER_0_IFPC_MODE__SHIFT = 0 +A6XX_CP_SET_MARKER_0_SHADER_USES_RT = 0x00000200 +A6XX_CP_SET_MARKER_0_RT_WA_START = 0x00000400 +A6XX_CP_SET_MARKER_0_RT_WA_END = 0x00000800 +REG_A6XX_CP_SET_PSEUDO_REG_ = lambda i0: (0x00000000 + 0x3*i0 ) # type: ignore +A6XX_CP_SET_PSEUDO_REG__0_PSEUDO_REG__MASK = 0x000007ff +A6XX_CP_SET_PSEUDO_REG__0_PSEUDO_REG__SHIFT = 0 +A6XX_CP_SET_PSEUDO_REG__1_LO__MASK = 0xffffffff +A6XX_CP_SET_PSEUDO_REG__1_LO__SHIFT = 0 +A6XX_CP_SET_PSEUDO_REG__2_HI__MASK = 0xffffffff +A6XX_CP_SET_PSEUDO_REG__2_HI__SHIFT = 0 +REG_A6XX_CP_REG_TEST_0 = 0x00000000 +A6XX_CP_REG_TEST_0_REG__MASK = 0x0003ffff +A6XX_CP_REG_TEST_0_REG__SHIFT = 0 +A6XX_CP_REG_TEST_0_SCRATCH_MEM_OFFSET__MASK = 0x0003ffff +A6XX_CP_REG_TEST_0_SCRATCH_MEM_OFFSET__SHIFT = 0 +A6XX_CP_REG_TEST_0_SOURCE__MASK = 0x00040000 +A6XX_CP_REG_TEST_0_SOURCE__SHIFT = 18 +A6XX_CP_REG_TEST_0_BIT__MASK = 0x01f00000 +A6XX_CP_REG_TEST_0_BIT__SHIFT = 20 +A6XX_CP_REG_TEST_0_SKIP_WAIT_FOR_ME = 0x02000000 +A6XX_CP_REG_TEST_0_PRED_BIT__MASK = 0x7c000000 +A6XX_CP_REG_TEST_0_PRED_BIT__SHIFT = 26 +A6XX_CP_REG_TEST_0_PRED_UPDATE = 0x80000000 +REG_A6XX_CP_REG_TEST_PRED_MASK = 0x00000001 +REG_A6XX_CP_REG_TEST_PRED_VAL = 0x00000002 +REG_CP_COND_REG_EXEC_0 = 0x00000000 +CP_COND_REG_EXEC_0_REG0__MASK = 0x0003ffff +CP_COND_REG_EXEC_0_REG0__SHIFT = 0 +CP_COND_REG_EXEC_0_PRED_BIT__MASK = 0x007c0000 +CP_COND_REG_EXEC_0_PRED_BIT__SHIFT = 18 +CP_COND_REG_EXEC_0_SKIP_WAIT_FOR_ME = 0x00800000 +CP_COND_REG_EXEC_0_ONCHIP_MEM = 0x01000000 +CP_COND_REG_EXEC_0_BINNING = 0x02000000 +CP_COND_REG_EXEC_0_GMEM = 0x04000000 +CP_COND_REG_EXEC_0_SYSMEM = 0x08000000 +CP_COND_REG_EXEC_0_BV = 0x02000000 +CP_COND_REG_EXEC_0_BR = 0x04000000 +CP_COND_REG_EXEC_0_LPAC = 0x08000000 +CP_COND_REG_EXEC_0_MODE__MASK = 0xf0000000 +CP_COND_REG_EXEC_0_MODE__SHIFT = 28 +REG_PRED_TEST_CP_COND_REG_EXEC_1 = 0x00000001 +PRED_TEST_CP_COND_REG_EXEC_1_DWORDS__MASK = 0x00ffffff +PRED_TEST_CP_COND_REG_EXEC_1_DWORDS__SHIFT = 0 +REG_REG_COMPARE_CP_COND_REG_EXEC_1 = 0x00000001 +REG_COMPARE_CP_COND_REG_EXEC_1_REG1__MASK = 0x0003ffff +REG_COMPARE_CP_COND_REG_EXEC_1_REG1__SHIFT = 0 +REG_COMPARE_CP_COND_REG_EXEC_1_ONCHIP_MEM = 0x01000000 +REG_RENDER_MODE_CP_COND_REG_EXEC_1 = 0x00000001 +RENDER_MODE_CP_COND_REG_EXEC_1_DWORDS__MASK = 0x00ffffff +RENDER_MODE_CP_COND_REG_EXEC_1_DWORDS__SHIFT = 0 +REG_REG_COMPARE_IMM_CP_COND_REG_EXEC_1 = 0x00000001 +REG_COMPARE_IMM_CP_COND_REG_EXEC_1_IMM__MASK = 0xffffffff +REG_COMPARE_IMM_CP_COND_REG_EXEC_1_IMM__SHIFT = 0 +REG_THREAD_MODE_CP_COND_REG_EXEC_1 = 0x00000001 +THREAD_MODE_CP_COND_REG_EXEC_1_DWORDS__MASK = 0x00ffffff +THREAD_MODE_CP_COND_REG_EXEC_1_DWORDS__SHIFT = 0 +REG_CP_COND_REG_EXEC_2 = 0x00000002 +CP_COND_REG_EXEC_2_DWORDS__MASK = 0x00ffffff +CP_COND_REG_EXEC_2_DWORDS__SHIFT = 0 +REG_CP_COND_EXEC_0 = 0x00000000 +CP_COND_EXEC_0_ADDR0_LO__MASK = 0xffffffff +CP_COND_EXEC_0_ADDR0_LO__SHIFT = 0 +REG_CP_COND_EXEC_1 = 0x00000001 +CP_COND_EXEC_1_ADDR0_HI__MASK = 0xffffffff +CP_COND_EXEC_1_ADDR0_HI__SHIFT = 0 +REG_CP_COND_EXEC_2 = 0x00000002 +CP_COND_EXEC_2_ADDR1_LO__MASK = 0xffffffff +CP_COND_EXEC_2_ADDR1_LO__SHIFT = 0 +REG_CP_COND_EXEC_3 = 0x00000003 +CP_COND_EXEC_3_ADDR1_HI__MASK = 0xffffffff +CP_COND_EXEC_3_ADDR1_HI__SHIFT = 0 +REG_CP_COND_EXEC_4 = 0x00000004 +CP_COND_EXEC_4_REF__MASK = 0xffffffff +CP_COND_EXEC_4_REF__SHIFT = 0 +REG_CP_COND_EXEC_5 = 0x00000005 +CP_COND_EXEC_5_DWORDS__MASK = 0xffffffff +CP_COND_EXEC_5_DWORDS__SHIFT = 0 +REG_CP_SET_AMBLE_0 = 0x00000000 +CP_SET_AMBLE_0_ADDR_LO__MASK = 0xffffffff +CP_SET_AMBLE_0_ADDR_LO__SHIFT = 0 +REG_CP_SET_AMBLE_1 = 0x00000001 +CP_SET_AMBLE_1_ADDR_HI__MASK = 0xffffffff +CP_SET_AMBLE_1_ADDR_HI__SHIFT = 0 +REG_CP_SET_AMBLE_2 = 0x00000002 +CP_SET_AMBLE_2_DWORDS__MASK = 0x000fffff +CP_SET_AMBLE_2_DWORDS__SHIFT = 0 +CP_SET_AMBLE_2_TYPE__MASK = 0x00300000 +CP_SET_AMBLE_2_TYPE__SHIFT = 20 +REG_CP_REG_WRITE_0 = 0x00000000 +CP_REG_WRITE_0_TRACKER__MASK = 0x0000000f +CP_REG_WRITE_0_TRACKER__SHIFT = 0 +REG_CP_REG_WRITE_1 = 0x00000001 +REG_CP_REG_WRITE_2 = 0x00000002 +REG_CP_SMMU_TABLE_UPDATE_0 = 0x00000000 +CP_SMMU_TABLE_UPDATE_0_TTBR0_LO__MASK = 0xffffffff +CP_SMMU_TABLE_UPDATE_0_TTBR0_LO__SHIFT = 0 +REG_CP_SMMU_TABLE_UPDATE_1 = 0x00000001 +CP_SMMU_TABLE_UPDATE_1_TTBR0_HI__MASK = 0x0000ffff +CP_SMMU_TABLE_UPDATE_1_TTBR0_HI__SHIFT = 0 +CP_SMMU_TABLE_UPDATE_1_ASID__MASK = 0xffff0000 +CP_SMMU_TABLE_UPDATE_1_ASID__SHIFT = 16 +REG_CP_SMMU_TABLE_UPDATE_2 = 0x00000002 +CP_SMMU_TABLE_UPDATE_2_CONTEXTIDR__MASK = 0xffffffff +CP_SMMU_TABLE_UPDATE_2_CONTEXTIDR__SHIFT = 0 +REG_CP_SMMU_TABLE_UPDATE_3 = 0x00000003 +CP_SMMU_TABLE_UPDATE_3_CONTEXTBANK__MASK = 0xffffffff +CP_SMMU_TABLE_UPDATE_3_CONTEXTBANK__SHIFT = 0 +REG_CP_START_BIN_BIN_COUNT = 0x00000000 +REG_CP_START_BIN_PREFIX_ADDR = 0x00000001 +REG_CP_START_BIN_PREFIX_DWORDS = 0x00000003 +REG_CP_START_BIN_BODY_DWORDS = 0x00000004 +REG_CP_WAIT_TIMESTAMP_0 = 0x00000000 +CP_WAIT_TIMESTAMP_0_WAIT_VALUE_SRC__MASK = 0x00000003 +CP_WAIT_TIMESTAMP_0_WAIT_VALUE_SRC__SHIFT = 0 +CP_WAIT_TIMESTAMP_0_WAIT_DST__MASK = 0x00000010 +CP_WAIT_TIMESTAMP_0_WAIT_DST__SHIFT = 4 +REG_TS_WAIT_RAM_CP_WAIT_TIMESTAMP_ADDR = 0x00000001 +REG_TS_WAIT_ONCHIP_CP_WAIT_TIMESTAMP_ONCHIP_ADDR_0 = 0x00000001 +REG_CP_WAIT_TIMESTAMP_SRC_0 = 0x00000003 +REG_CP_WAIT_TIMESTAMP_SRC_1 = 0x00000004 +REG_CP_BV_BR_COUNT_OPS_0 = 0x00000000 +CP_BV_BR_COUNT_OPS_0_OP__MASK = 0x0000000f +CP_BV_BR_COUNT_OPS_0_OP__SHIFT = 0 +REG_CP_BV_BR_COUNT_OPS_1 = 0x00000001 +CP_BV_BR_COUNT_OPS_1_BR_OFFSET__MASK = 0x0000ffff +CP_BV_BR_COUNT_OPS_1_BR_OFFSET__SHIFT = 0 +REG_CP_MODIFY_TIMESTAMP_0 = 0x00000000 +CP_MODIFY_TIMESTAMP_0_ADD__MASK = 0x000000ff +CP_MODIFY_TIMESTAMP_0_ADD__SHIFT = 0 +CP_MODIFY_TIMESTAMP_0_OP__MASK = 0xf0000000 +CP_MODIFY_TIMESTAMP_0_OP__SHIFT = 28 +REG_CP_MEM_TO_SCRATCH_MEM_0 = 0x00000000 +CP_MEM_TO_SCRATCH_MEM_0_CNT__MASK = 0x0000003f +CP_MEM_TO_SCRATCH_MEM_0_CNT__SHIFT = 0 +REG_CP_MEM_TO_SCRATCH_MEM_1 = 0x00000001 +CP_MEM_TO_SCRATCH_MEM_1_OFFSET__MASK = 0x0000003f +CP_MEM_TO_SCRATCH_MEM_1_OFFSET__SHIFT = 0 +REG_CP_MEM_TO_SCRATCH_MEM_2 = 0x00000002 +CP_MEM_TO_SCRATCH_MEM_2_SRC__MASK = 0xffffffff +CP_MEM_TO_SCRATCH_MEM_2_SRC__SHIFT = 0 +REG_CP_MEM_TO_SCRATCH_MEM_3 = 0x00000003 +CP_MEM_TO_SCRATCH_MEM_3_SRC_HI__MASK = 0xffffffff +CP_MEM_TO_SCRATCH_MEM_3_SRC_HI__SHIFT = 0 +REG_CP_THREAD_CONTROL_0 = 0x00000000 +CP_THREAD_CONTROL_0_THREAD__MASK = 0x00000003 +CP_THREAD_CONTROL_0_THREAD__SHIFT = 0 +CP_THREAD_CONTROL_0_CONCURRENT_BIN_DISABLE = 0x08000000 +CP_THREAD_CONTROL_0_SYNC_THREADS = 0x80000000 +REG_CP_FIXED_STRIDE_DRAW_TABLE_IB_BASE = 0x00000000 +REG_CP_FIXED_STRIDE_DRAW_TABLE_2 = 0x00000002 +CP_FIXED_STRIDE_DRAW_TABLE_2_IB_SIZE__MASK = 0x00000fff +CP_FIXED_STRIDE_DRAW_TABLE_2_IB_SIZE__SHIFT = 0 +CP_FIXED_STRIDE_DRAW_TABLE_2_STRIDE__MASK = 0xfff00000 +CP_FIXED_STRIDE_DRAW_TABLE_2_STRIDE__SHIFT = 20 +REG_CP_FIXED_STRIDE_DRAW_TABLE_3 = 0x00000003 +CP_FIXED_STRIDE_DRAW_TABLE_3_COUNT__MASK = 0xffffffff +CP_FIXED_STRIDE_DRAW_TABLE_3_COUNT__SHIFT = 0 +REG_CP_RESET_CONTEXT_STATE_0 = 0x00000000 +CP_RESET_CONTEXT_STATE_0_CLEAR_ON_CHIP_TS = 0x00000001 +CP_RESET_CONTEXT_STATE_0_CLEAR_RESOURCE_TABLE = 0x00000002 +CP_RESET_CONTEXT_STATE_0_CLEAR_BV_BR_COUNTER = 0x00000004 +CP_RESET_CONTEXT_STATE_0_RESET_GLOBAL_LOCAL_TS = 0x00000008 +REG_CP_SCOPE_CNTL_0 = 0x00000000 +CP_SCOPE_CNTL_0_DISABLE_PREEMPTION = 0x00000001 +CP_SCOPE_CNTL_0_SCOPE__MASK = 0xf0000000 +CP_SCOPE_CNTL_0_SCOPE__SHIFT = 28 +REG_A5XX_CP_INDIRECT_BUFFER_IB_BASE = 0x00000000 +REG_A5XX_CP_INDIRECT_BUFFER_2 = 0x00000002 +A5XX_CP_INDIRECT_BUFFER_2_IB_SIZE__MASK = 0x000fffff +A5XX_CP_INDIRECT_BUFFER_2_IB_SIZE__SHIFT = 0 +__struct__cast = lambda X: (struct_X) # type: ignore +__struct__cast = lambda X: (struct_X) # type: ignore +REG_A6XX_TEX_SAMP_0 = 0x00000000 +A6XX_TEX_SAMP_0_MIPFILTER_LINEAR_NEAR = 0x00000001 +A6XX_TEX_SAMP_0_XY_MAG__MASK = 0x00000006 +A6XX_TEX_SAMP_0_XY_MAG__SHIFT = 1 +A6XX_TEX_SAMP_0_XY_MIN__MASK = 0x00000018 +A6XX_TEX_SAMP_0_XY_MIN__SHIFT = 3 +A6XX_TEX_SAMP_0_WRAP_S__MASK = 0x000000e0 +A6XX_TEX_SAMP_0_WRAP_S__SHIFT = 5 +A6XX_TEX_SAMP_0_WRAP_T__MASK = 0x00000700 +A6XX_TEX_SAMP_0_WRAP_T__SHIFT = 8 +A6XX_TEX_SAMP_0_WRAP_R__MASK = 0x00003800 +A6XX_TEX_SAMP_0_WRAP_R__SHIFT = 11 +A6XX_TEX_SAMP_0_ANISO__MASK = 0x0001c000 +A6XX_TEX_SAMP_0_ANISO__SHIFT = 14 +A6XX_TEX_SAMP_0_LOD_BIAS__MASK = 0xfff80000 +A6XX_TEX_SAMP_0_LOD_BIAS__SHIFT = 19 +REG_A6XX_TEX_SAMP_1 = 0x00000001 +A6XX_TEX_SAMP_1_CLAMPENABLE = 0x00000001 +A6XX_TEX_SAMP_1_COMPARE_FUNC__MASK = 0x0000000e +A6XX_TEX_SAMP_1_COMPARE_FUNC__SHIFT = 1 +A6XX_TEX_SAMP_1_CUBEMAPSEAMLESSFILTOFF = 0x00000010 +A6XX_TEX_SAMP_1_UNNORM_COORDS = 0x00000020 +A6XX_TEX_SAMP_1_MIPFILTER_LINEAR_FAR = 0x00000040 +A6XX_TEX_SAMP_1_MAX_LOD__MASK = 0x000fff00 +A6XX_TEX_SAMP_1_MAX_LOD__SHIFT = 8 +A6XX_TEX_SAMP_1_MIN_LOD__MASK = 0xfff00000 +A6XX_TEX_SAMP_1_MIN_LOD__SHIFT = 20 +REG_A6XX_TEX_SAMP_2 = 0x00000002 +A6XX_TEX_SAMP_2_REDUCTION_MODE__MASK = 0x00000003 +A6XX_TEX_SAMP_2_REDUCTION_MODE__SHIFT = 0 +A6XX_TEX_SAMP_2_FASTBORDERCOLOR__MASK = 0x0000000c +A6XX_TEX_SAMP_2_FASTBORDERCOLOR__SHIFT = 2 +A6XX_TEX_SAMP_2_FASTBORDERCOLOREN = 0x00000010 +A6XX_TEX_SAMP_2_CHROMA_LINEAR = 0x00000020 +A6XX_TEX_SAMP_2_BCOLOR__MASK = 0xffffff80 +A6XX_TEX_SAMP_2_BCOLOR__SHIFT = 7 +REG_A6XX_TEX_SAMP_3 = 0x00000003 +REG_A6XX_TEX_CONST_0 = 0x00000000 +A6XX_TEX_CONST_0_TILE_MODE__MASK = 0x00000003 +A6XX_TEX_CONST_0_TILE_MODE__SHIFT = 0 +A6XX_TEX_CONST_0_SRGB = 0x00000004 +A6XX_TEX_CONST_0_SWIZ_X__MASK = 0x00000070 +A6XX_TEX_CONST_0_SWIZ_X__SHIFT = 4 +A6XX_TEX_CONST_0_SWIZ_Y__MASK = 0x00000380 +A6XX_TEX_CONST_0_SWIZ_Y__SHIFT = 7 +A6XX_TEX_CONST_0_SWIZ_Z__MASK = 0x00001c00 +A6XX_TEX_CONST_0_SWIZ_Z__SHIFT = 10 +A6XX_TEX_CONST_0_SWIZ_W__MASK = 0x0000e000 +A6XX_TEX_CONST_0_SWIZ_W__SHIFT = 13 +A6XX_TEX_CONST_0_MIPLVLS__MASK = 0x000f0000 +A6XX_TEX_CONST_0_MIPLVLS__SHIFT = 16 +A6XX_TEX_CONST_0_CHROMA_MIDPOINT_X = 0x00010000 +A6XX_TEX_CONST_0_CHROMA_MIDPOINT_Y = 0x00040000 +A6XX_TEX_CONST_0_SAMPLES__MASK = 0x00300000 +A6XX_TEX_CONST_0_SAMPLES__SHIFT = 20 +A6XX_TEX_CONST_0_FMT__MASK = 0x3fc00000 +A6XX_TEX_CONST_0_FMT__SHIFT = 22 +A6XX_TEX_CONST_0_SWAP__MASK = 0xc0000000 +A6XX_TEX_CONST_0_SWAP__SHIFT = 30 +REG_A6XX_TEX_CONST_1 = 0x00000001 +A6XX_TEX_CONST_1_WIDTH__MASK = 0x00007fff +A6XX_TEX_CONST_1_WIDTH__SHIFT = 0 +A6XX_TEX_CONST_1_HEIGHT__MASK = 0x3fff8000 +A6XX_TEX_CONST_1_HEIGHT__SHIFT = 15 +A6XX_TEX_CONST_1_MUTABLEEN = 0x80000000 +REG_A6XX_TEX_CONST_2 = 0x00000002 +A6XX_TEX_CONST_2_STRUCTSIZETEXELS__MASK = 0x0000fff0 +A6XX_TEX_CONST_2_STRUCTSIZETEXELS__SHIFT = 4 +A6XX_TEX_CONST_2_STARTOFFSETTEXELS__MASK = 0x003f0000 +A6XX_TEX_CONST_2_STARTOFFSETTEXELS__SHIFT = 16 +A6XX_TEX_CONST_2_PITCHALIGN__MASK = 0x0000000f +A6XX_TEX_CONST_2_PITCHALIGN__SHIFT = 0 +A6XX_TEX_CONST_2_PITCH__MASK = 0x1fffff80 +A6XX_TEX_CONST_2_PITCH__SHIFT = 7 +A6XX_TEX_CONST_2_TYPE__MASK = 0xe0000000 +A6XX_TEX_CONST_2_TYPE__SHIFT = 29 +REG_A6XX_TEX_CONST_3 = 0x00000003 +A6XX_TEX_CONST_3_ARRAY_PITCH__MASK = 0x007fffff +A6XX_TEX_CONST_3_ARRAY_PITCH__SHIFT = 0 +A6XX_TEX_CONST_3_MIN_LAYERSZ__MASK = 0x07800000 +A6XX_TEX_CONST_3_MIN_LAYERSZ__SHIFT = 23 +A6XX_TEX_CONST_3_TILE_ALL = 0x08000000 +A6XX_TEX_CONST_3_FLAG = 0x10000000 +REG_A6XX_TEX_CONST_4 = 0x00000004 +A6XX_TEX_CONST_4_BASE_LO__MASK = 0xffffffe0 +A6XX_TEX_CONST_4_BASE_LO__SHIFT = 5 +REG_A6XX_TEX_CONST_5 = 0x00000005 +A6XX_TEX_CONST_5_BASE_HI__MASK = 0x0001ffff +A6XX_TEX_CONST_5_BASE_HI__SHIFT = 0 +A6XX_TEX_CONST_5_DEPTH__MASK = 0x3ffe0000 +A6XX_TEX_CONST_5_DEPTH__SHIFT = 17 +REG_A6XX_TEX_CONST_6 = 0x00000006 +A6XX_TEX_CONST_6_MIN_LOD_CLAMP__MASK = 0x00000fff +A6XX_TEX_CONST_6_MIN_LOD_CLAMP__SHIFT = 0 +A6XX_TEX_CONST_6_PLANE_PITCH__MASK = 0xffffff00 +A6XX_TEX_CONST_6_PLANE_PITCH__SHIFT = 8 +REG_A6XX_TEX_CONST_7 = 0x00000007 +A6XX_TEX_CONST_7_FLAG_LO__MASK = 0xffffffe0 +A6XX_TEX_CONST_7_FLAG_LO__SHIFT = 5 +REG_A6XX_TEX_CONST_8 = 0x00000008 +A6XX_TEX_CONST_8_FLAG_HI__MASK = 0x0001ffff +A6XX_TEX_CONST_8_FLAG_HI__SHIFT = 0 +REG_A6XX_TEX_CONST_9 = 0x00000009 +A6XX_TEX_CONST_9_FLAG_BUFFER_ARRAY_PITCH__MASK = 0x0001ffff +A6XX_TEX_CONST_9_FLAG_BUFFER_ARRAY_PITCH__SHIFT = 0 +REG_A6XX_TEX_CONST_10 = 0x0000000a +A6XX_TEX_CONST_10_FLAG_BUFFER_PITCH__MASK = 0x0000007f +A6XX_TEX_CONST_10_FLAG_BUFFER_PITCH__SHIFT = 0 +A6XX_TEX_CONST_10_FLAG_BUFFER_LOGW__MASK = 0x00000f00 +A6XX_TEX_CONST_10_FLAG_BUFFER_LOGW__SHIFT = 8 +A6XX_TEX_CONST_10_FLAG_BUFFER_LOGH__MASK = 0x0000f000 +A6XX_TEX_CONST_10_FLAG_BUFFER_LOGH__SHIFT = 12 +REG_A6XX_TEX_CONST_11 = 0x0000000b +REG_A6XX_TEX_CONST_12 = 0x0000000c +REG_A6XX_TEX_CONST_13 = 0x0000000d +REG_A6XX_TEX_CONST_14 = 0x0000000e +REG_A6XX_TEX_CONST_15 = 0x0000000f +REG_A6XX_UBO_0 = 0x00000000 +A6XX_UBO_0_BASE_LO__MASK = 0xffffffff +A6XX_UBO_0_BASE_LO__SHIFT = 0 +REG_A6XX_UBO_1 = 0x00000001 +A6XX_UBO_1_BASE_HI__MASK = 0x0001ffff +A6XX_UBO_1_BASE_HI__SHIFT = 0 +A6XX_UBO_1_SIZE__MASK = 0xfffe0000 +A6XX_UBO_1_SIZE__SHIFT = 17 +lvp_nir_options = gzip.decompress(base64.b64decode("H4sIAAAAAAAAA2NgZGRkYGAAkYxgCsQFsxigwgwQBoxmhCqFq2WEKwIrAEGIkQxoAEMALwCqVsCiGUwLMHA0QPn29nBJkswHANb8YpH4AAAA")) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/metal.py b/artifacts/package_runtime/tinygrad/runtime/autogen/metal.py new file mode 100644 index 000000000..5713a31b0 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/metal.py @@ -0,0 +1,1465 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +from tinygrad.runtime.support import objc +dll = c.DLL('metal', 'Metal') +@c.record +class MTLDispatchThreadgroupsIndirectArguments(c.Struct): + SIZE = 12 + threadgroupsPerGrid: c.Array[ctypes.c_uint32, Literal[3]] +uint32_t: TypeAlias = ctypes.c_uint32 +MTLDispatchThreadgroupsIndirectArguments.register_fields([('threadgroupsPerGrid', c.Array[uint32_t, Literal[3]], 0)]) +@c.record +class MTLStageInRegionIndirectArguments(c.Struct): + SIZE = 24 + stageInOrigin: c.Array[ctypes.c_uint32, Literal[3]] + stageInSize: c.Array[ctypes.c_uint32, Literal[3]] +MTLStageInRegionIndirectArguments.register_fields([('stageInOrigin', c.Array[uint32_t, Literal[3]], 0), ('stageInSize', c.Array[uint32_t, Literal[3]], 12)]) +class MTLComputeCommandEncoder(objc.Spec): pass +class MTLCommandEncoder(objc.Spec): pass +class MTLComputePipelineState(objc.Spec): pass +NSUInteger: TypeAlias = ctypes.c_uint64 +class MTLBuffer(objc.Spec): pass +class MTLResource(objc.Spec): pass +@c.record +class struct__NSRange(c.Struct): + SIZE = 16 + location: int + length: int +NSRange: TypeAlias = struct__NSRange +struct__NSRange.register_fields([('location', NSUInteger, 0), ('length', NSUInteger, 8)]) +class MTLTexture(objc.Spec): pass +class MTLTextureDescriptor(objc.Spec): pass +enum_MTLTextureType: dict[int, str] = {(MTLTextureType1D:=0): 'MTLTextureType1D', (MTLTextureType1DArray:=1): 'MTLTextureType1DArray', (MTLTextureType2D:=2): 'MTLTextureType2D', (MTLTextureType2DArray:=3): 'MTLTextureType2DArray', (MTLTextureType2DMultisample:=4): 'MTLTextureType2DMultisample', (MTLTextureTypeCube:=5): 'MTLTextureTypeCube', (MTLTextureTypeCubeArray:=6): 'MTLTextureTypeCubeArray', (MTLTextureType3D:=7): 'MTLTextureType3D', (MTLTextureType2DMultisampleArray:=8): 'MTLTextureType2DMultisampleArray', (MTLTextureTypeTextureBuffer:=9): 'MTLTextureTypeTextureBuffer'} +MTLTextureType: TypeAlias = NSUInteger +enum_MTLPixelFormat: dict[int, str] = {(MTLPixelFormatInvalid:=0): 'MTLPixelFormatInvalid', (MTLPixelFormatA8Unorm:=1): 'MTLPixelFormatA8Unorm', (MTLPixelFormatR8Unorm:=10): 'MTLPixelFormatR8Unorm', (MTLPixelFormatR8Unorm_sRGB:=11): 'MTLPixelFormatR8Unorm_sRGB', (MTLPixelFormatR8Snorm:=12): 'MTLPixelFormatR8Snorm', (MTLPixelFormatR8Uint:=13): 'MTLPixelFormatR8Uint', (MTLPixelFormatR8Sint:=14): 'MTLPixelFormatR8Sint', (MTLPixelFormatR16Unorm:=20): 'MTLPixelFormatR16Unorm', (MTLPixelFormatR16Snorm:=22): 'MTLPixelFormatR16Snorm', (MTLPixelFormatR16Uint:=23): 'MTLPixelFormatR16Uint', (MTLPixelFormatR16Sint:=24): 'MTLPixelFormatR16Sint', (MTLPixelFormatR16Float:=25): 'MTLPixelFormatR16Float', (MTLPixelFormatRG8Unorm:=30): 'MTLPixelFormatRG8Unorm', (MTLPixelFormatRG8Unorm_sRGB:=31): 'MTLPixelFormatRG8Unorm_sRGB', (MTLPixelFormatRG8Snorm:=32): 'MTLPixelFormatRG8Snorm', (MTLPixelFormatRG8Uint:=33): 'MTLPixelFormatRG8Uint', (MTLPixelFormatRG8Sint:=34): 'MTLPixelFormatRG8Sint', (MTLPixelFormatB5G6R5Unorm:=40): 'MTLPixelFormatB5G6R5Unorm', (MTLPixelFormatA1BGR5Unorm:=41): 'MTLPixelFormatA1BGR5Unorm', (MTLPixelFormatABGR4Unorm:=42): 'MTLPixelFormatABGR4Unorm', (MTLPixelFormatBGR5A1Unorm:=43): 'MTLPixelFormatBGR5A1Unorm', (MTLPixelFormatR32Uint:=53): 'MTLPixelFormatR32Uint', (MTLPixelFormatR32Sint:=54): 'MTLPixelFormatR32Sint', (MTLPixelFormatR32Float:=55): 'MTLPixelFormatR32Float', (MTLPixelFormatRG16Unorm:=60): 'MTLPixelFormatRG16Unorm', (MTLPixelFormatRG16Snorm:=62): 'MTLPixelFormatRG16Snorm', (MTLPixelFormatRG16Uint:=63): 'MTLPixelFormatRG16Uint', (MTLPixelFormatRG16Sint:=64): 'MTLPixelFormatRG16Sint', (MTLPixelFormatRG16Float:=65): 'MTLPixelFormatRG16Float', (MTLPixelFormatRGBA8Unorm:=70): 'MTLPixelFormatRGBA8Unorm', (MTLPixelFormatRGBA8Unorm_sRGB:=71): 'MTLPixelFormatRGBA8Unorm_sRGB', (MTLPixelFormatRGBA8Snorm:=72): 'MTLPixelFormatRGBA8Snorm', (MTLPixelFormatRGBA8Uint:=73): 'MTLPixelFormatRGBA8Uint', (MTLPixelFormatRGBA8Sint:=74): 'MTLPixelFormatRGBA8Sint', (MTLPixelFormatBGRA8Unorm:=80): 'MTLPixelFormatBGRA8Unorm', (MTLPixelFormatBGRA8Unorm_sRGB:=81): 'MTLPixelFormatBGRA8Unorm_sRGB', (MTLPixelFormatRGB10A2Unorm:=90): 'MTLPixelFormatRGB10A2Unorm', (MTLPixelFormatRGB10A2Uint:=91): 'MTLPixelFormatRGB10A2Uint', (MTLPixelFormatRG11B10Float:=92): 'MTLPixelFormatRG11B10Float', (MTLPixelFormatRGB9E5Float:=93): 'MTLPixelFormatRGB9E5Float', (MTLPixelFormatBGR10A2Unorm:=94): 'MTLPixelFormatBGR10A2Unorm', (MTLPixelFormatBGR10_XR:=554): 'MTLPixelFormatBGR10_XR', (MTLPixelFormatBGR10_XR_sRGB:=555): 'MTLPixelFormatBGR10_XR_sRGB', (MTLPixelFormatRG32Uint:=103): 'MTLPixelFormatRG32Uint', (MTLPixelFormatRG32Sint:=104): 'MTLPixelFormatRG32Sint', (MTLPixelFormatRG32Float:=105): 'MTLPixelFormatRG32Float', (MTLPixelFormatRGBA16Unorm:=110): 'MTLPixelFormatRGBA16Unorm', (MTLPixelFormatRGBA16Snorm:=112): 'MTLPixelFormatRGBA16Snorm', (MTLPixelFormatRGBA16Uint:=113): 'MTLPixelFormatRGBA16Uint', (MTLPixelFormatRGBA16Sint:=114): 'MTLPixelFormatRGBA16Sint', (MTLPixelFormatRGBA16Float:=115): 'MTLPixelFormatRGBA16Float', (MTLPixelFormatBGRA10_XR:=552): 'MTLPixelFormatBGRA10_XR', (MTLPixelFormatBGRA10_XR_sRGB:=553): 'MTLPixelFormatBGRA10_XR_sRGB', (MTLPixelFormatRGBA32Uint:=123): 'MTLPixelFormatRGBA32Uint', (MTLPixelFormatRGBA32Sint:=124): 'MTLPixelFormatRGBA32Sint', (MTLPixelFormatRGBA32Float:=125): 'MTLPixelFormatRGBA32Float', (MTLPixelFormatBC1_RGBA:=130): 'MTLPixelFormatBC1_RGBA', (MTLPixelFormatBC1_RGBA_sRGB:=131): 'MTLPixelFormatBC1_RGBA_sRGB', (MTLPixelFormatBC2_RGBA:=132): 'MTLPixelFormatBC2_RGBA', (MTLPixelFormatBC2_RGBA_sRGB:=133): 'MTLPixelFormatBC2_RGBA_sRGB', (MTLPixelFormatBC3_RGBA:=134): 'MTLPixelFormatBC3_RGBA', (MTLPixelFormatBC3_RGBA_sRGB:=135): 'MTLPixelFormatBC3_RGBA_sRGB', (MTLPixelFormatBC4_RUnorm:=140): 'MTLPixelFormatBC4_RUnorm', (MTLPixelFormatBC4_RSnorm:=141): 'MTLPixelFormatBC4_RSnorm', (MTLPixelFormatBC5_RGUnorm:=142): 'MTLPixelFormatBC5_RGUnorm', (MTLPixelFormatBC5_RGSnorm:=143): 'MTLPixelFormatBC5_RGSnorm', (MTLPixelFormatBC6H_RGBFloat:=150): 'MTLPixelFormatBC6H_RGBFloat', (MTLPixelFormatBC6H_RGBUfloat:=151): 'MTLPixelFormatBC6H_RGBUfloat', (MTLPixelFormatBC7_RGBAUnorm:=152): 'MTLPixelFormatBC7_RGBAUnorm', (MTLPixelFormatBC7_RGBAUnorm_sRGB:=153): 'MTLPixelFormatBC7_RGBAUnorm_sRGB', (MTLPixelFormatPVRTC_RGB_2BPP:=160): 'MTLPixelFormatPVRTC_RGB_2BPP', (MTLPixelFormatPVRTC_RGB_2BPP_sRGB:=161): 'MTLPixelFormatPVRTC_RGB_2BPP_sRGB', (MTLPixelFormatPVRTC_RGB_4BPP:=162): 'MTLPixelFormatPVRTC_RGB_4BPP', (MTLPixelFormatPVRTC_RGB_4BPP_sRGB:=163): 'MTLPixelFormatPVRTC_RGB_4BPP_sRGB', (MTLPixelFormatPVRTC_RGBA_2BPP:=164): 'MTLPixelFormatPVRTC_RGBA_2BPP', (MTLPixelFormatPVRTC_RGBA_2BPP_sRGB:=165): 'MTLPixelFormatPVRTC_RGBA_2BPP_sRGB', (MTLPixelFormatPVRTC_RGBA_4BPP:=166): 'MTLPixelFormatPVRTC_RGBA_4BPP', (MTLPixelFormatPVRTC_RGBA_4BPP_sRGB:=167): 'MTLPixelFormatPVRTC_RGBA_4BPP_sRGB', (MTLPixelFormatEAC_R11Unorm:=170): 'MTLPixelFormatEAC_R11Unorm', (MTLPixelFormatEAC_R11Snorm:=172): 'MTLPixelFormatEAC_R11Snorm', (MTLPixelFormatEAC_RG11Unorm:=174): 'MTLPixelFormatEAC_RG11Unorm', (MTLPixelFormatEAC_RG11Snorm:=176): 'MTLPixelFormatEAC_RG11Snorm', (MTLPixelFormatEAC_RGBA8:=178): 'MTLPixelFormatEAC_RGBA8', (MTLPixelFormatEAC_RGBA8_sRGB:=179): 'MTLPixelFormatEAC_RGBA8_sRGB', (MTLPixelFormatETC2_RGB8:=180): 'MTLPixelFormatETC2_RGB8', (MTLPixelFormatETC2_RGB8_sRGB:=181): 'MTLPixelFormatETC2_RGB8_sRGB', (MTLPixelFormatETC2_RGB8A1:=182): 'MTLPixelFormatETC2_RGB8A1', (MTLPixelFormatETC2_RGB8A1_sRGB:=183): 'MTLPixelFormatETC2_RGB8A1_sRGB', (MTLPixelFormatASTC_4x4_sRGB:=186): 'MTLPixelFormatASTC_4x4_sRGB', (MTLPixelFormatASTC_5x4_sRGB:=187): 'MTLPixelFormatASTC_5x4_sRGB', (MTLPixelFormatASTC_5x5_sRGB:=188): 'MTLPixelFormatASTC_5x5_sRGB', (MTLPixelFormatASTC_6x5_sRGB:=189): 'MTLPixelFormatASTC_6x5_sRGB', (MTLPixelFormatASTC_6x6_sRGB:=190): 'MTLPixelFormatASTC_6x6_sRGB', (MTLPixelFormatASTC_8x5_sRGB:=192): 'MTLPixelFormatASTC_8x5_sRGB', (MTLPixelFormatASTC_8x6_sRGB:=193): 'MTLPixelFormatASTC_8x6_sRGB', (MTLPixelFormatASTC_8x8_sRGB:=194): 'MTLPixelFormatASTC_8x8_sRGB', (MTLPixelFormatASTC_10x5_sRGB:=195): 'MTLPixelFormatASTC_10x5_sRGB', (MTLPixelFormatASTC_10x6_sRGB:=196): 'MTLPixelFormatASTC_10x6_sRGB', (MTLPixelFormatASTC_10x8_sRGB:=197): 'MTLPixelFormatASTC_10x8_sRGB', (MTLPixelFormatASTC_10x10_sRGB:=198): 'MTLPixelFormatASTC_10x10_sRGB', (MTLPixelFormatASTC_12x10_sRGB:=199): 'MTLPixelFormatASTC_12x10_sRGB', (MTLPixelFormatASTC_12x12_sRGB:=200): 'MTLPixelFormatASTC_12x12_sRGB', (MTLPixelFormatASTC_4x4_LDR:=204): 'MTLPixelFormatASTC_4x4_LDR', (MTLPixelFormatASTC_5x4_LDR:=205): 'MTLPixelFormatASTC_5x4_LDR', (MTLPixelFormatASTC_5x5_LDR:=206): 'MTLPixelFormatASTC_5x5_LDR', (MTLPixelFormatASTC_6x5_LDR:=207): 'MTLPixelFormatASTC_6x5_LDR', (MTLPixelFormatASTC_6x6_LDR:=208): 'MTLPixelFormatASTC_6x6_LDR', (MTLPixelFormatASTC_8x5_LDR:=210): 'MTLPixelFormatASTC_8x5_LDR', (MTLPixelFormatASTC_8x6_LDR:=211): 'MTLPixelFormatASTC_8x6_LDR', (MTLPixelFormatASTC_8x8_LDR:=212): 'MTLPixelFormatASTC_8x8_LDR', (MTLPixelFormatASTC_10x5_LDR:=213): 'MTLPixelFormatASTC_10x5_LDR', (MTLPixelFormatASTC_10x6_LDR:=214): 'MTLPixelFormatASTC_10x6_LDR', (MTLPixelFormatASTC_10x8_LDR:=215): 'MTLPixelFormatASTC_10x8_LDR', (MTLPixelFormatASTC_10x10_LDR:=216): 'MTLPixelFormatASTC_10x10_LDR', (MTLPixelFormatASTC_12x10_LDR:=217): 'MTLPixelFormatASTC_12x10_LDR', (MTLPixelFormatASTC_12x12_LDR:=218): 'MTLPixelFormatASTC_12x12_LDR', (MTLPixelFormatASTC_4x4_HDR:=222): 'MTLPixelFormatASTC_4x4_HDR', (MTLPixelFormatASTC_5x4_HDR:=223): 'MTLPixelFormatASTC_5x4_HDR', (MTLPixelFormatASTC_5x5_HDR:=224): 'MTLPixelFormatASTC_5x5_HDR', (MTLPixelFormatASTC_6x5_HDR:=225): 'MTLPixelFormatASTC_6x5_HDR', (MTLPixelFormatASTC_6x6_HDR:=226): 'MTLPixelFormatASTC_6x6_HDR', (MTLPixelFormatASTC_8x5_HDR:=228): 'MTLPixelFormatASTC_8x5_HDR', (MTLPixelFormatASTC_8x6_HDR:=229): 'MTLPixelFormatASTC_8x6_HDR', (MTLPixelFormatASTC_8x8_HDR:=230): 'MTLPixelFormatASTC_8x8_HDR', (MTLPixelFormatASTC_10x5_HDR:=231): 'MTLPixelFormatASTC_10x5_HDR', (MTLPixelFormatASTC_10x6_HDR:=232): 'MTLPixelFormatASTC_10x6_HDR', (MTLPixelFormatASTC_10x8_HDR:=233): 'MTLPixelFormatASTC_10x8_HDR', (MTLPixelFormatASTC_10x10_HDR:=234): 'MTLPixelFormatASTC_10x10_HDR', (MTLPixelFormatASTC_12x10_HDR:=235): 'MTLPixelFormatASTC_12x10_HDR', (MTLPixelFormatASTC_12x12_HDR:=236): 'MTLPixelFormatASTC_12x12_HDR', (MTLPixelFormatGBGR422:=240): 'MTLPixelFormatGBGR422', (MTLPixelFormatBGRG422:=241): 'MTLPixelFormatBGRG422', (MTLPixelFormatDepth16Unorm:=250): 'MTLPixelFormatDepth16Unorm', (MTLPixelFormatDepth32Float:=252): 'MTLPixelFormatDepth32Float', (MTLPixelFormatStencil8:=253): 'MTLPixelFormatStencil8', (MTLPixelFormatDepth24Unorm_Stencil8:=255): 'MTLPixelFormatDepth24Unorm_Stencil8', (MTLPixelFormatDepth32Float_Stencil8:=260): 'MTLPixelFormatDepth32Float_Stencil8', (MTLPixelFormatX32_Stencil8:=261): 'MTLPixelFormatX32_Stencil8', (MTLPixelFormatX24_Stencil8:=262): 'MTLPixelFormatX24_Stencil8'} +MTLPixelFormat: TypeAlias = NSUInteger +enum_MTLResourceOptions: dict[int, str] = {(MTLResourceCPUCacheModeDefaultCache:=0): 'MTLResourceCPUCacheModeDefaultCache', (MTLResourceCPUCacheModeWriteCombined:=1): 'MTLResourceCPUCacheModeWriteCombined', (MTLResourceStorageModeShared:=0): 'MTLResourceStorageModeShared', (MTLResourceStorageModeManaged:=16): 'MTLResourceStorageModeManaged', (MTLResourceStorageModePrivate:=32): 'MTLResourceStorageModePrivate', (MTLResourceStorageModeMemoryless:=48): 'MTLResourceStorageModeMemoryless', (MTLResourceHazardTrackingModeDefault:=0): 'MTLResourceHazardTrackingModeDefault', (MTLResourceHazardTrackingModeUntracked:=256): 'MTLResourceHazardTrackingModeUntracked', (MTLResourceHazardTrackingModeTracked:=512): 'MTLResourceHazardTrackingModeTracked', (MTLResourceOptionCPUCacheModeDefault:=0): 'MTLResourceOptionCPUCacheModeDefault', (MTLResourceOptionCPUCacheModeWriteCombined:=1): 'MTLResourceOptionCPUCacheModeWriteCombined'} +MTLResourceOptions: TypeAlias = NSUInteger +enum_MTLCPUCacheMode: dict[int, str] = {(MTLCPUCacheModeDefaultCache:=0): 'MTLCPUCacheModeDefaultCache', (MTLCPUCacheModeWriteCombined:=1): 'MTLCPUCacheModeWriteCombined'} +MTLCPUCacheMode: TypeAlias = NSUInteger +enum_MTLStorageMode: dict[int, str] = {(MTLStorageModeShared:=0): 'MTLStorageModeShared', (MTLStorageModeManaged:=1): 'MTLStorageModeManaged', (MTLStorageModePrivate:=2): 'MTLStorageModePrivate', (MTLStorageModeMemoryless:=3): 'MTLStorageModeMemoryless'} +MTLStorageMode: TypeAlias = NSUInteger +enum_MTLHazardTrackingMode: dict[int, str] = {(MTLHazardTrackingModeDefault:=0): 'MTLHazardTrackingModeDefault', (MTLHazardTrackingModeUntracked:=1): 'MTLHazardTrackingModeUntracked', (MTLHazardTrackingModeTracked:=2): 'MTLHazardTrackingModeTracked'} +MTLHazardTrackingMode: TypeAlias = NSUInteger +enum_MTLTextureUsage: dict[int, str] = {(MTLTextureUsageUnknown:=0): 'MTLTextureUsageUnknown', (MTLTextureUsageShaderRead:=1): 'MTLTextureUsageShaderRead', (MTLTextureUsageShaderWrite:=2): 'MTLTextureUsageShaderWrite', (MTLTextureUsageRenderTarget:=4): 'MTLTextureUsageRenderTarget', (MTLTextureUsagePixelFormatView:=16): 'MTLTextureUsagePixelFormatView', (MTLTextureUsageShaderAtomic:=32): 'MTLTextureUsageShaderAtomic'} +MTLTextureUsage: TypeAlias = NSUInteger +BOOL: TypeAlias = ctypes.c_int32 +NSInteger: TypeAlias = ctypes.c_int64 +enum_MTLTextureCompressionType: dict[int, str] = {(MTLTextureCompressionTypeLossless:=0): 'MTLTextureCompressionTypeLossless', (MTLTextureCompressionTypeLossy:=1): 'MTLTextureCompressionTypeLossy'} +MTLTextureCompressionType: TypeAlias = NSInteger +@c.record +class MTLTextureSwizzleChannels(c.Struct): + SIZE = 4 + red: int + green: int + blue: int + alpha: int +uint8_t: TypeAlias = ctypes.c_ubyte +enum_MTLTextureSwizzle: dict[int, str] = {(MTLTextureSwizzleZero:=0): 'MTLTextureSwizzleZero', (MTLTextureSwizzleOne:=1): 'MTLTextureSwizzleOne', (MTLTextureSwizzleRed:=2): 'MTLTextureSwizzleRed', (MTLTextureSwizzleGreen:=3): 'MTLTextureSwizzleGreen', (MTLTextureSwizzleBlue:=4): 'MTLTextureSwizzleBlue', (MTLTextureSwizzleAlpha:=5): 'MTLTextureSwizzleAlpha'} +MTLTextureSwizzle: TypeAlias = uint8_t +MTLTextureSwizzleChannels.register_fields([('red', MTLTextureSwizzle, 0), ('green', MTLTextureSwizzle, 1), ('blue', MTLTextureSwizzle, 2), ('alpha', MTLTextureSwizzle, 3)]) +class NSObject(objc.Spec): pass +IMP: TypeAlias = c.CFUNCTYPE[None, []] +class NSInvocation(objc.Spec): pass +class NSMethodSignature(objc.Spec): pass +NSMethodSignature._bases_ = [NSObject] +NSMethodSignature._methods_ = [ + ('getArgumentTypeAtIndex:', c.POINTER[ctypes.c_char], [NSUInteger]), + ('isOneway', BOOL, []), + ('numberOfArguments', NSUInteger, []), + ('frameLength', NSUInteger, []), + ('methodReturnType', c.POINTER[ctypes.c_char], []), + ('methodReturnLength', NSUInteger, []), +] +NSMethodSignature._classmethods_ = [ + ('signatureWithObjCTypes:', NSMethodSignature, [c.POINTER[ctypes.c_char]]), +] +NSInvocation._bases_ = [NSObject] +NSInvocation._methods_ = [ + ('retainArguments', None, []), + ('getReturnValue:', None, [ctypes.c_void_p]), + ('setReturnValue:', None, [ctypes.c_void_p]), + ('getArgument:atIndex:', None, [ctypes.c_void_p, NSInteger]), + ('setArgument:atIndex:', None, [ctypes.c_void_p, NSInteger]), + ('invoke', None, []), + ('invokeWithTarget:', None, [objc.id_]), + ('invokeUsingIMP:', None, [IMP]), + ('methodSignature', NSMethodSignature, []), + ('argumentsRetained', BOOL, []), + ('target', objc.id_, []), + ('setTarget:', None, [objc.id_]), + ('selector', objc.id_, []), + ('setSelector:', None, [objc.id_]), +] +NSInvocation._classmethods_ = [ + ('invocationWithMethodSignature:', NSInvocation, [NSMethodSignature]), +] +class struct__NSZone(c.Struct): pass +class Protocol(objc.Spec): pass +class NSString(objc.Spec): pass +unichar: TypeAlias = ctypes.c_uint16 +class NSCoder(objc.Spec): pass +class NSData(objc.Spec): pass +NSData._bases_ = [NSObject] +NSData._methods_ = [ + ('length', NSUInteger, []), + ('bytes', ctypes.c_void_p, []), +] +NSCoder._bases_ = [NSObject] +NSCoder._methods_ = [ + ('encodeValueOfObjCType:at:', None, [c.POINTER[ctypes.c_char], ctypes.c_void_p]), + ('encodeDataObject:', None, [NSData]), + ('decodeDataObject', NSData, []), + ('decodeValueOfObjCType:at:size:', None, [c.POINTER[ctypes.c_char], ctypes.c_void_p, NSUInteger]), + ('versionForClassName:', NSInteger, [NSString]), +] +NSString._bases_ = [NSObject] +NSString._methods_ = [ + ('characterAtIndex:', unichar, [NSUInteger]), + ('init', 'instancetype', []), + ('initWithCoder:', 'instancetype', [NSCoder]), + ('length', NSUInteger, []), +] +NSObject._methods_ = [ + ('init', 'instancetype', []), + ('dealloc', None, []), + ('finalize', None, []), + ('copy', objc.id_, [], True), + ('mutableCopy', objc.id_, [], True), + ('methodForSelector:', IMP, [objc.id_]), + ('doesNotRecognizeSelector:', None, [objc.id_]), + ('forwardingTargetForSelector:', objc.id_, [objc.id_]), + ('forwardInvocation:', None, [NSInvocation]), + ('methodSignatureForSelector:', NSMethodSignature, [objc.id_]), + ('allowsWeakReference', BOOL, []), + ('retainWeakReference', BOOL, []), +] +NSObject._classmethods_ = [ + ('load', None, []), + ('initialize', None, []), + ('new', 'instancetype', [], True), + ('allocWithZone:', 'instancetype', [c.POINTER[struct__NSZone]], True), + ('alloc', 'instancetype', [], True), + ('copyWithZone:', objc.id_, [c.POINTER[struct__NSZone]], True), + ('mutableCopyWithZone:', objc.id_, [c.POINTER[struct__NSZone]], True), + ('instancesRespondToSelector:', BOOL, [objc.id_]), + ('conformsToProtocol:', BOOL, [Protocol]), + ('instanceMethodForSelector:', IMP, [objc.id_]), + ('instanceMethodSignatureForSelector:', NSMethodSignature, [objc.id_]), + ('resolveClassMethod:', BOOL, [objc.id_]), + ('resolveInstanceMethod:', BOOL, [objc.id_]), + ('hash', NSUInteger, []), + ('description', NSString, []), + ('debugDescription', NSString, []), +] +MTLTextureDescriptor._bases_ = [NSObject] +MTLTextureDescriptor._methods_ = [ + ('textureType', MTLTextureType, []), + ('setTextureType:', None, [MTLTextureType]), + ('pixelFormat', MTLPixelFormat, []), + ('setPixelFormat:', None, [MTLPixelFormat]), + ('width', NSUInteger, []), + ('setWidth:', None, [NSUInteger]), + ('height', NSUInteger, []), + ('setHeight:', None, [NSUInteger]), + ('depth', NSUInteger, []), + ('setDepth:', None, [NSUInteger]), + ('mipmapLevelCount', NSUInteger, []), + ('setMipmapLevelCount:', None, [NSUInteger]), + ('sampleCount', NSUInteger, []), + ('setSampleCount:', None, [NSUInteger]), + ('arrayLength', NSUInteger, []), + ('setArrayLength:', None, [NSUInteger]), + ('resourceOptions', MTLResourceOptions, []), + ('setResourceOptions:', None, [MTLResourceOptions]), + ('cpuCacheMode', MTLCPUCacheMode, []), + ('setCpuCacheMode:', None, [MTLCPUCacheMode]), + ('storageMode', MTLStorageMode, []), + ('setStorageMode:', None, [MTLStorageMode]), + ('hazardTrackingMode', MTLHazardTrackingMode, []), + ('setHazardTrackingMode:', None, [MTLHazardTrackingMode]), + ('usage', MTLTextureUsage, []), + ('setUsage:', None, [MTLTextureUsage]), + ('allowGPUOptimizedContents', BOOL, []), + ('setAllowGPUOptimizedContents:', None, [BOOL]), + ('compressionType', MTLTextureCompressionType, []), + ('setCompressionType:', None, [MTLTextureCompressionType]), + ('swizzle', MTLTextureSwizzleChannels, []), + ('setSwizzle:', None, [MTLTextureSwizzleChannels]), +] +MTLTextureDescriptor._classmethods_ = [ + ('texture2DDescriptorWithPixelFormat:width:height:mipmapped:', MTLTextureDescriptor, [MTLPixelFormat, NSUInteger, NSUInteger, BOOL]), + ('textureCubeDescriptorWithPixelFormat:size:mipmapped:', MTLTextureDescriptor, [MTLPixelFormat, NSUInteger, BOOL]), + ('textureBufferDescriptorWithPixelFormat:width:resourceOptions:usage:', MTLTextureDescriptor, [MTLPixelFormat, NSUInteger, MTLResourceOptions, MTLTextureUsage]), +] +class MTLDevice(objc.Spec): pass +uint64_t: TypeAlias = ctypes.c_uint64 +MTLBuffer._bases_ = [MTLResource] +MTLBuffer._methods_ = [ + ('contents', ctypes.c_void_p, []), + ('didModifyRange:', None, [NSRange]), + ('newTextureWithDescriptor:offset:bytesPerRow:', MTLTexture, [MTLTextureDescriptor, NSUInteger, NSUInteger], True), + ('addDebugMarker:range:', None, [NSString, NSRange]), + ('removeAllDebugMarkers', None, []), + ('newRemoteBufferViewForDevice:', MTLBuffer, [MTLDevice], True), + ('length', NSUInteger, []), + ('remoteStorageBuffer', MTLBuffer, []), + ('gpuAddress', uint64_t, []), +] +class MTLVisibleFunctionTable(objc.Spec): pass +class MTLIntersectionFunctionTable(objc.Spec): pass +class MTLAccelerationStructure(objc.Spec): pass +class MTLSamplerState(objc.Spec): pass +@c.record +class MTLRegion(c.Struct): + SIZE = 48 + origin: MTLOrigin + size: MTLSize +@c.record +class MTLOrigin(c.Struct): + SIZE = 24 + x: int + y: int + z: int +MTLOrigin.register_fields([('x', NSUInteger, 0), ('y', NSUInteger, 8), ('z', NSUInteger, 16)]) +@c.record +class MTLSize(c.Struct): + SIZE = 24 + width: int + height: int + depth: int +MTLSize.register_fields([('width', NSUInteger, 0), ('height', NSUInteger, 8), ('depth', NSUInteger, 16)]) +MTLRegion.register_fields([('origin', MTLOrigin, 0), ('size', MTLSize, 24)]) +class MTLFence(objc.Spec): pass +MTLFence._bases_ = [NSObject] +MTLFence._methods_ = [ + ('device', MTLDevice, []), + ('label', NSString, []), + ('setLabel:', None, [NSString]), +] +enum_MTLPurgeableState: dict[int, str] = {(MTLPurgeableStateKeepCurrent:=1): 'MTLPurgeableStateKeepCurrent', (MTLPurgeableStateNonVolatile:=2): 'MTLPurgeableStateNonVolatile', (MTLPurgeableStateVolatile:=3): 'MTLPurgeableStateVolatile', (MTLPurgeableStateEmpty:=4): 'MTLPurgeableStateEmpty'} +MTLPurgeableState: TypeAlias = NSUInteger +kern_return_t: TypeAlias = ctypes.c_int32 +task_id_token_t: TypeAlias = ctypes.c_uint32 +class MTLHeap(objc.Spec): pass +MTLResource._bases_ = [NSObject] +MTLResource._methods_ = [ + ('setPurgeableState:', MTLPurgeableState, [MTLPurgeableState]), + ('makeAliasable', None, []), + ('isAliasable', BOOL, []), + ('setOwnerWithIdentity:', kern_return_t, [task_id_token_t]), + ('label', NSString, []), + ('setLabel:', None, [NSString]), + ('device', MTLDevice, []), + ('cpuCacheMode', MTLCPUCacheMode, []), + ('storageMode', MTLStorageMode, []), + ('hazardTrackingMode', MTLHazardTrackingMode, []), + ('resourceOptions', MTLResourceOptions, []), + ('heap', MTLHeap, []), + ('heapOffset', NSUInteger, []), + ('allocatedSize', NSUInteger, [], True), +] +enum_MTLResourceUsage: dict[int, str] = {(MTLResourceUsageRead:=1): 'MTLResourceUsageRead', (MTLResourceUsageWrite:=2): 'MTLResourceUsageWrite', (MTLResourceUsageSample:=4): 'MTLResourceUsageSample'} +MTLResourceUsage: TypeAlias = NSUInteger +class MTLIndirectCommandBuffer(objc.Spec): pass +enum_MTLBarrierScope: dict[int, str] = {(MTLBarrierScopeBuffers:=1): 'MTLBarrierScopeBuffers', (MTLBarrierScopeTextures:=2): 'MTLBarrierScopeTextures', (MTLBarrierScopeRenderTargets:=4): 'MTLBarrierScopeRenderTargets'} +MTLBarrierScope: TypeAlias = NSUInteger +class MTLCounterSampleBuffer(objc.Spec): pass +MTLCounterSampleBuffer._bases_ = [NSObject] +MTLCounterSampleBuffer._methods_ = [ + ('resolveCounterRange:', NSData, [NSRange]), + ('device', MTLDevice, []), + ('label', NSString, []), + ('sampleCount', NSUInteger, []), +] +enum_MTLDispatchType: dict[int, str] = {(MTLDispatchTypeSerial:=0): 'MTLDispatchTypeSerial', (MTLDispatchTypeConcurrent:=1): 'MTLDispatchTypeConcurrent'} +MTLDispatchType: TypeAlias = NSUInteger +MTLComputeCommandEncoder._bases_ = [MTLCommandEncoder] +MTLComputeCommandEncoder._methods_ = [ + ('setComputePipelineState:', None, [MTLComputePipelineState]), + ('setBytes:length:atIndex:', None, [ctypes.c_void_p, NSUInteger, NSUInteger]), + ('setBuffer:offset:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger]), + ('setBufferOffset:atIndex:', None, [NSUInteger, NSUInteger]), + ('setBuffers:offsets:withRange:', None, [c.POINTER[MTLBuffer], c.POINTER[NSUInteger], NSRange]), + ('setBuffer:offset:attributeStride:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger, NSUInteger]), + ('setBuffers:offsets:attributeStrides:withRange:', None, [c.POINTER[MTLBuffer], c.POINTER[NSUInteger], c.POINTER[NSUInteger], NSRange]), + ('setBufferOffset:attributeStride:atIndex:', None, [NSUInteger, NSUInteger, NSUInteger]), + ('setBytes:length:attributeStride:atIndex:', None, [ctypes.c_void_p, NSUInteger, NSUInteger, NSUInteger]), + ('setVisibleFunctionTable:atBufferIndex:', None, [MTLVisibleFunctionTable, NSUInteger]), + ('setVisibleFunctionTables:withBufferRange:', None, [c.POINTER[MTLVisibleFunctionTable], NSRange]), + ('setIntersectionFunctionTable:atBufferIndex:', None, [MTLIntersectionFunctionTable, NSUInteger]), + ('setIntersectionFunctionTables:withBufferRange:', None, [c.POINTER[MTLIntersectionFunctionTable], NSRange]), + ('setAccelerationStructure:atBufferIndex:', None, [MTLAccelerationStructure, NSUInteger]), + ('setTexture:atIndex:', None, [MTLTexture, NSUInteger]), + ('setTextures:withRange:', None, [c.POINTER[MTLTexture], NSRange]), + ('setSamplerState:atIndex:', None, [MTLSamplerState, NSUInteger]), + ('setSamplerStates:withRange:', None, [c.POINTER[MTLSamplerState], NSRange]), + ('setSamplerState:lodMinClamp:lodMaxClamp:atIndex:', None, [MTLSamplerState, ctypes.c_float, ctypes.c_float, NSUInteger]), + ('setSamplerStates:lodMinClamps:lodMaxClamps:withRange:', None, [c.POINTER[MTLSamplerState], c.POINTER[ctypes.c_float], c.POINTER[ctypes.c_float], NSRange]), + ('setThreadgroupMemoryLength:atIndex:', None, [NSUInteger, NSUInteger]), + ('setImageblockWidth:height:', None, [NSUInteger, NSUInteger]), + ('setStageInRegion:', None, [MTLRegion]), + ('setStageInRegionWithIndirectBuffer:indirectBufferOffset:', None, [MTLBuffer, NSUInteger]), + ('dispatchThreadgroups:threadsPerThreadgroup:', None, [MTLSize, MTLSize]), + ('dispatchThreadgroupsWithIndirectBuffer:indirectBufferOffset:threadsPerThreadgroup:', None, [MTLBuffer, NSUInteger, MTLSize]), + ('dispatchThreads:threadsPerThreadgroup:', None, [MTLSize, MTLSize]), + ('updateFence:', None, [MTLFence]), + ('waitForFence:', None, [MTLFence]), + ('useResource:usage:', None, [MTLResource, MTLResourceUsage]), + ('useResources:count:usage:', None, [c.POINTER[MTLResource], NSUInteger, MTLResourceUsage]), + ('useHeap:', None, [MTLHeap]), + ('useHeaps:count:', None, [c.POINTER[MTLHeap], NSUInteger]), + ('executeCommandsInBuffer:withRange:', None, [MTLIndirectCommandBuffer, NSRange]), + ('executeCommandsInBuffer:indirectBuffer:indirectBufferOffset:', None, [MTLIndirectCommandBuffer, MTLBuffer, NSUInteger]), + ('memoryBarrierWithScope:', None, [MTLBarrierScope]), + ('memoryBarrierWithResources:count:', None, [c.POINTER[MTLResource], NSUInteger]), + ('sampleCountersInBuffer:atSampleIndex:withBarrier:', None, [MTLCounterSampleBuffer, NSUInteger, BOOL]), + ('dispatchType', MTLDispatchType, []), +] +class MTLComputePipelineReflection(objc.Spec): pass +MTLComputePipelineReflection._bases_ = [NSObject] +class MTLComputePipelineDescriptor(objc.Spec): pass +class MTLFunction(objc.Spec): pass +class MTLArgumentEncoder(objc.Spec): pass +class MTLArgument(objc.Spec): pass +enum_MTLArgumentType: dict[int, str] = {(MTLArgumentTypeBuffer:=0): 'MTLArgumentTypeBuffer', (MTLArgumentTypeThreadgroupMemory:=1): 'MTLArgumentTypeThreadgroupMemory', (MTLArgumentTypeTexture:=2): 'MTLArgumentTypeTexture', (MTLArgumentTypeSampler:=3): 'MTLArgumentTypeSampler', (MTLArgumentTypeImageblockData:=16): 'MTLArgumentTypeImageblockData', (MTLArgumentTypeImageblock:=17): 'MTLArgumentTypeImageblock', (MTLArgumentTypeVisibleFunctionTable:=24): 'MTLArgumentTypeVisibleFunctionTable', (MTLArgumentTypePrimitiveAccelerationStructure:=25): 'MTLArgumentTypePrimitiveAccelerationStructure', (MTLArgumentTypeInstanceAccelerationStructure:=26): 'MTLArgumentTypeInstanceAccelerationStructure', (MTLArgumentTypeIntersectionFunctionTable:=27): 'MTLArgumentTypeIntersectionFunctionTable'} +MTLArgumentType: TypeAlias = NSUInteger +enum_MTLBindingAccess: dict[int, str] = {(MTLBindingAccessReadOnly:=0): 'MTLBindingAccessReadOnly', (MTLBindingAccessReadWrite:=1): 'MTLBindingAccessReadWrite', (MTLBindingAccessWriteOnly:=2): 'MTLBindingAccessWriteOnly', (MTLArgumentAccessReadOnly:=0): 'MTLArgumentAccessReadOnly', (MTLArgumentAccessReadWrite:=1): 'MTLArgumentAccessReadWrite', (MTLArgumentAccessWriteOnly:=2): 'MTLArgumentAccessWriteOnly'} +MTLBindingAccess: TypeAlias = NSUInteger +enum_MTLDataType: dict[int, str] = {(MTLDataTypeNone:=0): 'MTLDataTypeNone', (MTLDataTypeStruct:=1): 'MTLDataTypeStruct', (MTLDataTypeArray:=2): 'MTLDataTypeArray', (MTLDataTypeFloat:=3): 'MTLDataTypeFloat', (MTLDataTypeFloat2:=4): 'MTLDataTypeFloat2', (MTLDataTypeFloat3:=5): 'MTLDataTypeFloat3', (MTLDataTypeFloat4:=6): 'MTLDataTypeFloat4', (MTLDataTypeFloat2x2:=7): 'MTLDataTypeFloat2x2', (MTLDataTypeFloat2x3:=8): 'MTLDataTypeFloat2x3', (MTLDataTypeFloat2x4:=9): 'MTLDataTypeFloat2x4', (MTLDataTypeFloat3x2:=10): 'MTLDataTypeFloat3x2', (MTLDataTypeFloat3x3:=11): 'MTLDataTypeFloat3x3', (MTLDataTypeFloat3x4:=12): 'MTLDataTypeFloat3x4', (MTLDataTypeFloat4x2:=13): 'MTLDataTypeFloat4x2', (MTLDataTypeFloat4x3:=14): 'MTLDataTypeFloat4x3', (MTLDataTypeFloat4x4:=15): 'MTLDataTypeFloat4x4', (MTLDataTypeHalf:=16): 'MTLDataTypeHalf', (MTLDataTypeHalf2:=17): 'MTLDataTypeHalf2', (MTLDataTypeHalf3:=18): 'MTLDataTypeHalf3', (MTLDataTypeHalf4:=19): 'MTLDataTypeHalf4', (MTLDataTypeHalf2x2:=20): 'MTLDataTypeHalf2x2', (MTLDataTypeHalf2x3:=21): 'MTLDataTypeHalf2x3', (MTLDataTypeHalf2x4:=22): 'MTLDataTypeHalf2x4', (MTLDataTypeHalf3x2:=23): 'MTLDataTypeHalf3x2', (MTLDataTypeHalf3x3:=24): 'MTLDataTypeHalf3x3', (MTLDataTypeHalf3x4:=25): 'MTLDataTypeHalf3x4', (MTLDataTypeHalf4x2:=26): 'MTLDataTypeHalf4x2', (MTLDataTypeHalf4x3:=27): 'MTLDataTypeHalf4x3', (MTLDataTypeHalf4x4:=28): 'MTLDataTypeHalf4x4', (MTLDataTypeInt:=29): 'MTLDataTypeInt', (MTLDataTypeInt2:=30): 'MTLDataTypeInt2', (MTLDataTypeInt3:=31): 'MTLDataTypeInt3', (MTLDataTypeInt4:=32): 'MTLDataTypeInt4', (MTLDataTypeUInt:=33): 'MTLDataTypeUInt', (MTLDataTypeUInt2:=34): 'MTLDataTypeUInt2', (MTLDataTypeUInt3:=35): 'MTLDataTypeUInt3', (MTLDataTypeUInt4:=36): 'MTLDataTypeUInt4', (MTLDataTypeShort:=37): 'MTLDataTypeShort', (MTLDataTypeShort2:=38): 'MTLDataTypeShort2', (MTLDataTypeShort3:=39): 'MTLDataTypeShort3', (MTLDataTypeShort4:=40): 'MTLDataTypeShort4', (MTLDataTypeUShort:=41): 'MTLDataTypeUShort', (MTLDataTypeUShort2:=42): 'MTLDataTypeUShort2', (MTLDataTypeUShort3:=43): 'MTLDataTypeUShort3', (MTLDataTypeUShort4:=44): 'MTLDataTypeUShort4', (MTLDataTypeChar:=45): 'MTLDataTypeChar', (MTLDataTypeChar2:=46): 'MTLDataTypeChar2', (MTLDataTypeChar3:=47): 'MTLDataTypeChar3', (MTLDataTypeChar4:=48): 'MTLDataTypeChar4', (MTLDataTypeUChar:=49): 'MTLDataTypeUChar', (MTLDataTypeUChar2:=50): 'MTLDataTypeUChar2', (MTLDataTypeUChar3:=51): 'MTLDataTypeUChar3', (MTLDataTypeUChar4:=52): 'MTLDataTypeUChar4', (MTLDataTypeBool:=53): 'MTLDataTypeBool', (MTLDataTypeBool2:=54): 'MTLDataTypeBool2', (MTLDataTypeBool3:=55): 'MTLDataTypeBool3', (MTLDataTypeBool4:=56): 'MTLDataTypeBool4', (MTLDataTypeTexture:=58): 'MTLDataTypeTexture', (MTLDataTypeSampler:=59): 'MTLDataTypeSampler', (MTLDataTypePointer:=60): 'MTLDataTypePointer', (MTLDataTypeR8Unorm:=62): 'MTLDataTypeR8Unorm', (MTLDataTypeR8Snorm:=63): 'MTLDataTypeR8Snorm', (MTLDataTypeR16Unorm:=64): 'MTLDataTypeR16Unorm', (MTLDataTypeR16Snorm:=65): 'MTLDataTypeR16Snorm', (MTLDataTypeRG8Unorm:=66): 'MTLDataTypeRG8Unorm', (MTLDataTypeRG8Snorm:=67): 'MTLDataTypeRG8Snorm', (MTLDataTypeRG16Unorm:=68): 'MTLDataTypeRG16Unorm', (MTLDataTypeRG16Snorm:=69): 'MTLDataTypeRG16Snorm', (MTLDataTypeRGBA8Unorm:=70): 'MTLDataTypeRGBA8Unorm', (MTLDataTypeRGBA8Unorm_sRGB:=71): 'MTLDataTypeRGBA8Unorm_sRGB', (MTLDataTypeRGBA8Snorm:=72): 'MTLDataTypeRGBA8Snorm', (MTLDataTypeRGBA16Unorm:=73): 'MTLDataTypeRGBA16Unorm', (MTLDataTypeRGBA16Snorm:=74): 'MTLDataTypeRGBA16Snorm', (MTLDataTypeRGB10A2Unorm:=75): 'MTLDataTypeRGB10A2Unorm', (MTLDataTypeRG11B10Float:=76): 'MTLDataTypeRG11B10Float', (MTLDataTypeRGB9E5Float:=77): 'MTLDataTypeRGB9E5Float', (MTLDataTypeRenderPipeline:=78): 'MTLDataTypeRenderPipeline', (MTLDataTypeComputePipeline:=79): 'MTLDataTypeComputePipeline', (MTLDataTypeIndirectCommandBuffer:=80): 'MTLDataTypeIndirectCommandBuffer', (MTLDataTypeLong:=81): 'MTLDataTypeLong', (MTLDataTypeLong2:=82): 'MTLDataTypeLong2', (MTLDataTypeLong3:=83): 'MTLDataTypeLong3', (MTLDataTypeLong4:=84): 'MTLDataTypeLong4', (MTLDataTypeULong:=85): 'MTLDataTypeULong', (MTLDataTypeULong2:=86): 'MTLDataTypeULong2', (MTLDataTypeULong3:=87): 'MTLDataTypeULong3', (MTLDataTypeULong4:=88): 'MTLDataTypeULong4', (MTLDataTypeVisibleFunctionTable:=115): 'MTLDataTypeVisibleFunctionTable', (MTLDataTypeIntersectionFunctionTable:=116): 'MTLDataTypeIntersectionFunctionTable', (MTLDataTypePrimitiveAccelerationStructure:=117): 'MTLDataTypePrimitiveAccelerationStructure', (MTLDataTypeInstanceAccelerationStructure:=118): 'MTLDataTypeInstanceAccelerationStructure', (MTLDataTypeBFloat:=121): 'MTLDataTypeBFloat', (MTLDataTypeBFloat2:=122): 'MTLDataTypeBFloat2', (MTLDataTypeBFloat3:=123): 'MTLDataTypeBFloat3', (MTLDataTypeBFloat4:=124): 'MTLDataTypeBFloat4'} +MTLDataType: TypeAlias = NSUInteger +class MTLStructType(objc.Spec): pass +class MTLStructMember(objc.Spec): pass +class MTLArrayType(objc.Spec): pass +class MTLTextureReferenceType(objc.Spec): pass +class MTLType(objc.Spec): pass +MTLType._bases_ = [NSObject] +MTLType._methods_ = [ + ('dataType', MTLDataType, []), +] +MTLTextureReferenceType._bases_ = [MTLType] +MTLTextureReferenceType._methods_ = [ + ('textureDataType', MTLDataType, []), + ('textureType', MTLTextureType, []), + ('access', MTLBindingAccess, []), + ('isDepthTexture', BOOL, []), +] +class MTLPointerType(objc.Spec): pass +MTLPointerType._bases_ = [MTLType] +MTLPointerType._methods_ = [ + ('elementStructType', MTLStructType, []), + ('elementArrayType', MTLArrayType, []), + ('elementType', MTLDataType, []), + ('access', MTLBindingAccess, []), + ('alignment', NSUInteger, []), + ('dataSize', NSUInteger, []), + ('elementIsArgumentBuffer', BOOL, []), +] +MTLArrayType._bases_ = [MTLType] +MTLArrayType._methods_ = [ + ('elementStructType', MTLStructType, []), + ('elementArrayType', MTLArrayType, []), + ('elementTextureReferenceType', MTLTextureReferenceType, []), + ('elementPointerType', MTLPointerType, []), + ('elementType', MTLDataType, []), + ('arrayLength', NSUInteger, []), + ('stride', NSUInteger, []), + ('argumentIndexStride', NSUInteger, []), +] +MTLStructMember._bases_ = [NSObject] +MTLStructMember._methods_ = [ + ('structType', MTLStructType, []), + ('arrayType', MTLArrayType, []), + ('textureReferenceType', MTLTextureReferenceType, []), + ('pointerType', MTLPointerType, []), + ('name', NSString, []), + ('offset', NSUInteger, []), + ('dataType', MTLDataType, []), + ('argumentIndex', NSUInteger, []), +] +MTLStructType._bases_ = [MTLType] +MTLStructType._methods_ = [ + ('memberByName:', MTLStructMember, [NSString]), +] +MTLArgument._bases_ = [NSObject] +MTLArgument._methods_ = [ + ('name', NSString, []), + ('type', MTLArgumentType, []), + ('access', MTLBindingAccess, []), + ('index', NSUInteger, []), + ('isActive', BOOL, []), + ('bufferAlignment', NSUInteger, []), + ('bufferDataSize', NSUInteger, []), + ('bufferDataType', MTLDataType, []), + ('bufferStructType', MTLStructType, []), + ('bufferPointerType', MTLPointerType, []), + ('threadgroupMemoryAlignment', NSUInteger, []), + ('threadgroupMemoryDataSize', NSUInteger, []), + ('textureType', MTLTextureType, []), + ('textureDataType', MTLDataType, []), + ('isDepthTexture', BOOL, []), + ('arrayLength', NSUInteger, []), +] +enum_MTLFunctionType: dict[int, str] = {(MTLFunctionTypeVertex:=1): 'MTLFunctionTypeVertex', (MTLFunctionTypeFragment:=2): 'MTLFunctionTypeFragment', (MTLFunctionTypeKernel:=3): 'MTLFunctionTypeKernel', (MTLFunctionTypeVisible:=5): 'MTLFunctionTypeVisible', (MTLFunctionTypeIntersection:=6): 'MTLFunctionTypeIntersection', (MTLFunctionTypeMesh:=7): 'MTLFunctionTypeMesh', (MTLFunctionTypeObject:=8): 'MTLFunctionTypeObject'} +MTLFunctionType: TypeAlias = NSUInteger +enum_MTLPatchType: dict[int, str] = {(MTLPatchTypeNone:=0): 'MTLPatchTypeNone', (MTLPatchTypeTriangle:=1): 'MTLPatchTypeTriangle', (MTLPatchTypeQuad:=2): 'MTLPatchTypeQuad'} +MTLPatchType: TypeAlias = NSUInteger +enum_MTLFunctionOptions: dict[int, str] = {(MTLFunctionOptionNone:=0): 'MTLFunctionOptionNone', (MTLFunctionOptionCompileToBinary:=1): 'MTLFunctionOptionCompileToBinary', (MTLFunctionOptionStoreFunctionInMetalScript:=2): 'MTLFunctionOptionStoreFunctionInMetalScript'} +MTLFunctionOptions: TypeAlias = NSUInteger +MTLFunction._bases_ = [NSObject] +MTLFunction._methods_ = [ + ('newArgumentEncoderWithBufferIndex:', MTLArgumentEncoder, [NSUInteger], True), + ('newArgumentEncoderWithBufferIndex:reflection:', MTLArgumentEncoder, [NSUInteger, c.POINTER[MTLArgument]], True), + ('label', NSString, []), + ('setLabel:', None, [NSString]), + ('device', MTLDevice, []), + ('functionType', MTLFunctionType, []), + ('patchType', MTLPatchType, []), + ('patchControlPointCount', NSInteger, []), + ('name', NSString, []), + ('options', MTLFunctionOptions, []), +] +class MTLStageInputOutputDescriptor(objc.Spec): pass +class MTLBufferLayoutDescriptorArray(objc.Spec): pass +class MTLBufferLayoutDescriptor(objc.Spec): pass +enum_MTLStepFunction: dict[int, str] = {(MTLStepFunctionConstant:=0): 'MTLStepFunctionConstant', (MTLStepFunctionPerVertex:=1): 'MTLStepFunctionPerVertex', (MTLStepFunctionPerInstance:=2): 'MTLStepFunctionPerInstance', (MTLStepFunctionPerPatch:=3): 'MTLStepFunctionPerPatch', (MTLStepFunctionPerPatchControlPoint:=4): 'MTLStepFunctionPerPatchControlPoint', (MTLStepFunctionThreadPositionInGridX:=5): 'MTLStepFunctionThreadPositionInGridX', (MTLStepFunctionThreadPositionInGridY:=6): 'MTLStepFunctionThreadPositionInGridY', (MTLStepFunctionThreadPositionInGridXIndexed:=7): 'MTLStepFunctionThreadPositionInGridXIndexed', (MTLStepFunctionThreadPositionInGridYIndexed:=8): 'MTLStepFunctionThreadPositionInGridYIndexed'} +MTLStepFunction: TypeAlias = NSUInteger +MTLBufferLayoutDescriptor._bases_ = [NSObject] +MTLBufferLayoutDescriptor._methods_ = [ + ('stride', NSUInteger, []), + ('setStride:', None, [NSUInteger]), + ('stepFunction', MTLStepFunction, []), + ('setStepFunction:', None, [MTLStepFunction]), + ('stepRate', NSUInteger, []), + ('setStepRate:', None, [NSUInteger]), +] +MTLBufferLayoutDescriptorArray._bases_ = [NSObject] +MTLBufferLayoutDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLBufferLayoutDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLBufferLayoutDescriptor, NSUInteger]), +] +class MTLAttributeDescriptorArray(objc.Spec): pass +class MTLAttributeDescriptor(objc.Spec): pass +enum_MTLAttributeFormat: dict[int, str] = {(MTLAttributeFormatInvalid:=0): 'MTLAttributeFormatInvalid', (MTLAttributeFormatUChar2:=1): 'MTLAttributeFormatUChar2', (MTLAttributeFormatUChar3:=2): 'MTLAttributeFormatUChar3', (MTLAttributeFormatUChar4:=3): 'MTLAttributeFormatUChar4', (MTLAttributeFormatChar2:=4): 'MTLAttributeFormatChar2', (MTLAttributeFormatChar3:=5): 'MTLAttributeFormatChar3', (MTLAttributeFormatChar4:=6): 'MTLAttributeFormatChar4', (MTLAttributeFormatUChar2Normalized:=7): 'MTLAttributeFormatUChar2Normalized', (MTLAttributeFormatUChar3Normalized:=8): 'MTLAttributeFormatUChar3Normalized', (MTLAttributeFormatUChar4Normalized:=9): 'MTLAttributeFormatUChar4Normalized', (MTLAttributeFormatChar2Normalized:=10): 'MTLAttributeFormatChar2Normalized', (MTLAttributeFormatChar3Normalized:=11): 'MTLAttributeFormatChar3Normalized', (MTLAttributeFormatChar4Normalized:=12): 'MTLAttributeFormatChar4Normalized', (MTLAttributeFormatUShort2:=13): 'MTLAttributeFormatUShort2', (MTLAttributeFormatUShort3:=14): 'MTLAttributeFormatUShort3', (MTLAttributeFormatUShort4:=15): 'MTLAttributeFormatUShort4', (MTLAttributeFormatShort2:=16): 'MTLAttributeFormatShort2', (MTLAttributeFormatShort3:=17): 'MTLAttributeFormatShort3', (MTLAttributeFormatShort4:=18): 'MTLAttributeFormatShort4', (MTLAttributeFormatUShort2Normalized:=19): 'MTLAttributeFormatUShort2Normalized', (MTLAttributeFormatUShort3Normalized:=20): 'MTLAttributeFormatUShort3Normalized', (MTLAttributeFormatUShort4Normalized:=21): 'MTLAttributeFormatUShort4Normalized', (MTLAttributeFormatShort2Normalized:=22): 'MTLAttributeFormatShort2Normalized', (MTLAttributeFormatShort3Normalized:=23): 'MTLAttributeFormatShort3Normalized', (MTLAttributeFormatShort4Normalized:=24): 'MTLAttributeFormatShort4Normalized', (MTLAttributeFormatHalf2:=25): 'MTLAttributeFormatHalf2', (MTLAttributeFormatHalf3:=26): 'MTLAttributeFormatHalf3', (MTLAttributeFormatHalf4:=27): 'MTLAttributeFormatHalf4', (MTLAttributeFormatFloat:=28): 'MTLAttributeFormatFloat', (MTLAttributeFormatFloat2:=29): 'MTLAttributeFormatFloat2', (MTLAttributeFormatFloat3:=30): 'MTLAttributeFormatFloat3', (MTLAttributeFormatFloat4:=31): 'MTLAttributeFormatFloat4', (MTLAttributeFormatInt:=32): 'MTLAttributeFormatInt', (MTLAttributeFormatInt2:=33): 'MTLAttributeFormatInt2', (MTLAttributeFormatInt3:=34): 'MTLAttributeFormatInt3', (MTLAttributeFormatInt4:=35): 'MTLAttributeFormatInt4', (MTLAttributeFormatUInt:=36): 'MTLAttributeFormatUInt', (MTLAttributeFormatUInt2:=37): 'MTLAttributeFormatUInt2', (MTLAttributeFormatUInt3:=38): 'MTLAttributeFormatUInt3', (MTLAttributeFormatUInt4:=39): 'MTLAttributeFormatUInt4', (MTLAttributeFormatInt1010102Normalized:=40): 'MTLAttributeFormatInt1010102Normalized', (MTLAttributeFormatUInt1010102Normalized:=41): 'MTLAttributeFormatUInt1010102Normalized', (MTLAttributeFormatUChar4Normalized_BGRA:=42): 'MTLAttributeFormatUChar4Normalized_BGRA', (MTLAttributeFormatUChar:=45): 'MTLAttributeFormatUChar', (MTLAttributeFormatChar:=46): 'MTLAttributeFormatChar', (MTLAttributeFormatUCharNormalized:=47): 'MTLAttributeFormatUCharNormalized', (MTLAttributeFormatCharNormalized:=48): 'MTLAttributeFormatCharNormalized', (MTLAttributeFormatUShort:=49): 'MTLAttributeFormatUShort', (MTLAttributeFormatShort:=50): 'MTLAttributeFormatShort', (MTLAttributeFormatUShortNormalized:=51): 'MTLAttributeFormatUShortNormalized', (MTLAttributeFormatShortNormalized:=52): 'MTLAttributeFormatShortNormalized', (MTLAttributeFormatHalf:=53): 'MTLAttributeFormatHalf', (MTLAttributeFormatFloatRG11B10:=54): 'MTLAttributeFormatFloatRG11B10', (MTLAttributeFormatFloatRGB9E5:=55): 'MTLAttributeFormatFloatRGB9E5'} +MTLAttributeFormat: TypeAlias = NSUInteger +MTLAttributeDescriptor._bases_ = [NSObject] +MTLAttributeDescriptor._methods_ = [ + ('format', MTLAttributeFormat, []), + ('setFormat:', None, [MTLAttributeFormat]), + ('offset', NSUInteger, []), + ('setOffset:', None, [NSUInteger]), + ('bufferIndex', NSUInteger, []), + ('setBufferIndex:', None, [NSUInteger]), +] +MTLAttributeDescriptorArray._bases_ = [NSObject] +MTLAttributeDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLAttributeDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLAttributeDescriptor, NSUInteger]), +] +enum_MTLIndexType: dict[int, str] = {(MTLIndexTypeUInt16:=0): 'MTLIndexTypeUInt16', (MTLIndexTypeUInt32:=1): 'MTLIndexTypeUInt32'} +MTLIndexType: TypeAlias = NSUInteger +MTLStageInputOutputDescriptor._bases_ = [NSObject] +MTLStageInputOutputDescriptor._methods_ = [ + ('reset', None, []), + ('layouts', MTLBufferLayoutDescriptorArray, []), + ('attributes', MTLAttributeDescriptorArray, []), + ('indexType', MTLIndexType, []), + ('setIndexType:', None, [MTLIndexType]), + ('indexBufferIndex', NSUInteger, []), + ('setIndexBufferIndex:', None, [NSUInteger]), +] +MTLStageInputOutputDescriptor._classmethods_ = [ + ('stageInputOutputDescriptor', MTLStageInputOutputDescriptor, []), +] +class MTLPipelineBufferDescriptorArray(objc.Spec): pass +class MTLPipelineBufferDescriptor(objc.Spec): pass +enum_MTLMutability: dict[int, str] = {(MTLMutabilityDefault:=0): 'MTLMutabilityDefault', (MTLMutabilityMutable:=1): 'MTLMutabilityMutable', (MTLMutabilityImmutable:=2): 'MTLMutabilityImmutable'} +MTLMutability: TypeAlias = NSUInteger +MTLPipelineBufferDescriptor._bases_ = [NSObject] +MTLPipelineBufferDescriptor._methods_ = [ + ('mutability', MTLMutability, []), + ('setMutability:', None, [MTLMutability]), +] +MTLPipelineBufferDescriptorArray._bases_ = [NSObject] +MTLPipelineBufferDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLPipelineBufferDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLPipelineBufferDescriptor, NSUInteger]), +] +class MTLLinkedFunctions(objc.Spec): pass +MTLLinkedFunctions._bases_ = [NSObject] +MTLLinkedFunctions._classmethods_ = [ + ('linkedFunctions', MTLLinkedFunctions, []), +] +MTLComputePipelineDescriptor._bases_ = [NSObject] +MTLComputePipelineDescriptor._methods_ = [ + ('reset', None, []), + ('label', NSString, []), + ('setLabel:', None, [NSString]), + ('computeFunction', MTLFunction, []), + ('setComputeFunction:', None, [MTLFunction]), + ('threadGroupSizeIsMultipleOfThreadExecutionWidth', BOOL, []), + ('setThreadGroupSizeIsMultipleOfThreadExecutionWidth:', None, [BOOL]), + ('maxTotalThreadsPerThreadgroup', NSUInteger, []), + ('setMaxTotalThreadsPerThreadgroup:', None, [NSUInteger]), + ('stageInputDescriptor', MTLStageInputOutputDescriptor, []), + ('setStageInputDescriptor:', None, [MTLStageInputOutputDescriptor]), + ('buffers', MTLPipelineBufferDescriptorArray, []), + ('supportIndirectCommandBuffers', BOOL, []), + ('setSupportIndirectCommandBuffers:', None, [BOOL]), + ('linkedFunctions', MTLLinkedFunctions, []), + ('setLinkedFunctions:', None, [MTLLinkedFunctions]), + ('supportAddingBinaryFunctions', BOOL, []), + ('setSupportAddingBinaryFunctions:', None, [BOOL]), + ('maxCallStackDepth', NSUInteger, []), + ('setMaxCallStackDepth:', None, [NSUInteger]), +] +class MTLFunctionHandle(objc.Spec): pass +class MTLVisibleFunctionTableDescriptor(objc.Spec): pass +class MTLIntersectionFunctionTableDescriptor(objc.Spec): pass +@c.record +class struct_MTLResourceID(c.Struct): + SIZE = 8 + _impl: int +MTLResourceID: TypeAlias = struct_MTLResourceID +struct_MTLResourceID.register_fields([('_impl', uint64_t, 0)]) +MTLComputePipelineState._bases_ = [NSObject] +MTLComputePipelineState._methods_ = [ + ('imageblockMemoryLengthForDimensions:', NSUInteger, [MTLSize]), + ('functionHandleWithFunction:', MTLFunctionHandle, [MTLFunction]), + ('newVisibleFunctionTableWithDescriptor:', MTLVisibleFunctionTable, [MTLVisibleFunctionTableDescriptor], True), + ('newIntersectionFunctionTableWithDescriptor:', MTLIntersectionFunctionTable, [MTLIntersectionFunctionTableDescriptor], True), + ('label', NSString, []), + ('device', MTLDevice, []), + ('maxTotalThreadsPerThreadgroup', NSUInteger, []), + ('threadExecutionWidth', NSUInteger, []), + ('staticThreadgroupMemoryLength', NSUInteger, []), + ('supportIndirectCommandBuffers', BOOL, []), + ('gpuResourceID', MTLResourceID, []), +] +class MTLCommandQueue(objc.Spec): pass +class MTLCommandBuffer(objc.Spec): pass +class MTLDrawable(objc.Spec): pass +CFTimeInterval: TypeAlias = ctypes.c_double +class MTLBlitCommandEncoder(objc.Spec): pass +enum_MTLBlitOption: dict[int, str] = {(MTLBlitOptionNone:=0): 'MTLBlitOptionNone', (MTLBlitOptionDepthFromDepthStencil:=1): 'MTLBlitOptionDepthFromDepthStencil', (MTLBlitOptionStencilFromDepthStencil:=2): 'MTLBlitOptionStencilFromDepthStencil', (MTLBlitOptionRowLinearPVRTC:=4): 'MTLBlitOptionRowLinearPVRTC'} +MTLBlitOption: TypeAlias = NSUInteger +MTLBlitCommandEncoder._bases_ = [MTLCommandEncoder] +MTLBlitCommandEncoder._methods_ = [ + ('synchronizeResource:', None, [MTLResource]), + ('synchronizeTexture:slice:level:', None, [MTLTexture, NSUInteger, NSUInteger]), + ('copyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toTexture:destinationSlice:destinationLevel:destinationOrigin:', None, [MTLTexture, NSUInteger, NSUInteger, MTLOrigin, MTLSize, MTLTexture, NSUInteger, NSUInteger, MTLOrigin]), + ('copyFromBuffer:sourceOffset:sourceBytesPerRow:sourceBytesPerImage:sourceSize:toTexture:destinationSlice:destinationLevel:destinationOrigin:', None, [MTLBuffer, NSUInteger, NSUInteger, NSUInteger, MTLSize, MTLTexture, NSUInteger, NSUInteger, MTLOrigin]), + ('copyFromBuffer:sourceOffset:sourceBytesPerRow:sourceBytesPerImage:sourceSize:toTexture:destinationSlice:destinationLevel:destinationOrigin:options:', None, [MTLBuffer, NSUInteger, NSUInteger, NSUInteger, MTLSize, MTLTexture, NSUInteger, NSUInteger, MTLOrigin, MTLBlitOption]), + ('copyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toBuffer:destinationOffset:destinationBytesPerRow:destinationBytesPerImage:', None, [MTLTexture, NSUInteger, NSUInteger, MTLOrigin, MTLSize, MTLBuffer, NSUInteger, NSUInteger, NSUInteger]), + ('copyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toBuffer:destinationOffset:destinationBytesPerRow:destinationBytesPerImage:options:', None, [MTLTexture, NSUInteger, NSUInteger, MTLOrigin, MTLSize, MTLBuffer, NSUInteger, NSUInteger, NSUInteger, MTLBlitOption]), + ('generateMipmapsForTexture:', None, [MTLTexture]), + ('fillBuffer:range:value:', None, [MTLBuffer, NSRange, uint8_t]), + ('copyFromTexture:sourceSlice:sourceLevel:toTexture:destinationSlice:destinationLevel:sliceCount:levelCount:', None, [MTLTexture, NSUInteger, NSUInteger, MTLTexture, NSUInteger, NSUInteger, NSUInteger, NSUInteger]), + ('copyFromTexture:toTexture:', None, [MTLTexture, MTLTexture]), + ('copyFromBuffer:sourceOffset:toBuffer:destinationOffset:size:', None, [MTLBuffer, NSUInteger, MTLBuffer, NSUInteger, NSUInteger]), + ('updateFence:', None, [MTLFence]), + ('waitForFence:', None, [MTLFence]), + ('getTextureAccessCounters:region:mipLevel:slice:resetCounters:countersBuffer:countersBufferOffset:', None, [MTLTexture, MTLRegion, NSUInteger, NSUInteger, BOOL, MTLBuffer, NSUInteger]), + ('resetTextureAccessCounters:region:mipLevel:slice:', None, [MTLTexture, MTLRegion, NSUInteger, NSUInteger]), + ('optimizeContentsForGPUAccess:', None, [MTLTexture]), + ('optimizeContentsForGPUAccess:slice:level:', None, [MTLTexture, NSUInteger, NSUInteger]), + ('optimizeContentsForCPUAccess:', None, [MTLTexture]), + ('optimizeContentsForCPUAccess:slice:level:', None, [MTLTexture, NSUInteger, NSUInteger]), + ('resetCommandsInBuffer:withRange:', None, [MTLIndirectCommandBuffer, NSRange]), + ('copyIndirectCommandBuffer:sourceRange:destination:destinationIndex:', None, [MTLIndirectCommandBuffer, NSRange, MTLIndirectCommandBuffer, NSUInteger]), + ('optimizeIndirectCommandBuffer:withRange:', None, [MTLIndirectCommandBuffer, NSRange]), + ('sampleCountersInBuffer:atSampleIndex:withBarrier:', None, [MTLCounterSampleBuffer, NSUInteger, BOOL]), + ('resolveCounters:inRange:destinationBuffer:destinationOffset:', None, [MTLCounterSampleBuffer, NSRange, MTLBuffer, NSUInteger]), +] +class MTLRenderCommandEncoder(objc.Spec): pass +class MTLRenderPassDescriptor(objc.Spec): pass +@c.record +class MTLSamplePosition(c.Struct): + SIZE = 8 + x: float + y: float +MTLSamplePosition.register_fields([('x', ctypes.c_float, 0), ('y', ctypes.c_float, 4)]) +class MTLRenderPassColorAttachmentDescriptorArray(objc.Spec): pass +class MTLRenderPassColorAttachmentDescriptor(objc.Spec): pass +@c.record +class MTLClearColor(c.Struct): + SIZE = 32 + red: float + green: float + blue: float + alpha: float +MTLClearColor.register_fields([('red', ctypes.c_double, 0), ('green', ctypes.c_double, 8), ('blue', ctypes.c_double, 16), ('alpha', ctypes.c_double, 24)]) +class MTLRenderPassAttachmentDescriptor(objc.Spec): pass +enum_MTLLoadAction: dict[int, str] = {(MTLLoadActionDontCare:=0): 'MTLLoadActionDontCare', (MTLLoadActionLoad:=1): 'MTLLoadActionLoad', (MTLLoadActionClear:=2): 'MTLLoadActionClear'} +MTLLoadAction: TypeAlias = NSUInteger +enum_MTLStoreAction: dict[int, str] = {(MTLStoreActionDontCare:=0): 'MTLStoreActionDontCare', (MTLStoreActionStore:=1): 'MTLStoreActionStore', (MTLStoreActionMultisampleResolve:=2): 'MTLStoreActionMultisampleResolve', (MTLStoreActionStoreAndMultisampleResolve:=3): 'MTLStoreActionStoreAndMultisampleResolve', (MTLStoreActionUnknown:=4): 'MTLStoreActionUnknown', (MTLStoreActionCustomSampleDepthStore:=5): 'MTLStoreActionCustomSampleDepthStore'} +MTLStoreAction: TypeAlias = NSUInteger +enum_MTLStoreActionOptions: dict[int, str] = {(MTLStoreActionOptionNone:=0): 'MTLStoreActionOptionNone', (MTLStoreActionOptionCustomSamplePositions:=1): 'MTLStoreActionOptionCustomSamplePositions'} +MTLStoreActionOptions: TypeAlias = NSUInteger +MTLRenderPassAttachmentDescriptor._bases_ = [NSObject] +MTLRenderPassAttachmentDescriptor._methods_ = [ + ('texture', MTLTexture, []), + ('setTexture:', None, [MTLTexture]), + ('level', NSUInteger, []), + ('setLevel:', None, [NSUInteger]), + ('slice', NSUInteger, []), + ('setSlice:', None, [NSUInteger]), + ('depthPlane', NSUInteger, []), + ('setDepthPlane:', None, [NSUInteger]), + ('resolveTexture', MTLTexture, []), + ('setResolveTexture:', None, [MTLTexture]), + ('resolveLevel', NSUInteger, []), + ('setResolveLevel:', None, [NSUInteger]), + ('resolveSlice', NSUInteger, []), + ('setResolveSlice:', None, [NSUInteger]), + ('resolveDepthPlane', NSUInteger, []), + ('setResolveDepthPlane:', None, [NSUInteger]), + ('loadAction', MTLLoadAction, []), + ('setLoadAction:', None, [MTLLoadAction]), + ('storeAction', MTLStoreAction, []), + ('setStoreAction:', None, [MTLStoreAction]), + ('storeActionOptions', MTLStoreActionOptions, []), + ('setStoreActionOptions:', None, [MTLStoreActionOptions]), +] +MTLRenderPassColorAttachmentDescriptor._bases_ = [MTLRenderPassAttachmentDescriptor] +MTLRenderPassColorAttachmentDescriptor._methods_ = [ + ('clearColor', MTLClearColor, []), + ('setClearColor:', None, [MTLClearColor]), +] +MTLRenderPassColorAttachmentDescriptorArray._bases_ = [NSObject] +MTLRenderPassColorAttachmentDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLRenderPassColorAttachmentDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLRenderPassColorAttachmentDescriptor, NSUInteger]), +] +class MTLRenderPassDepthAttachmentDescriptor(objc.Spec): pass +enum_MTLMultisampleDepthResolveFilter: dict[int, str] = {(MTLMultisampleDepthResolveFilterSample0:=0): 'MTLMultisampleDepthResolveFilterSample0', (MTLMultisampleDepthResolveFilterMin:=1): 'MTLMultisampleDepthResolveFilterMin', (MTLMultisampleDepthResolveFilterMax:=2): 'MTLMultisampleDepthResolveFilterMax'} +MTLMultisampleDepthResolveFilter: TypeAlias = NSUInteger +MTLRenderPassDepthAttachmentDescriptor._bases_ = [MTLRenderPassAttachmentDescriptor] +MTLRenderPassDepthAttachmentDescriptor._methods_ = [ + ('clearDepth', ctypes.c_double, []), + ('setClearDepth:', None, [ctypes.c_double]), + ('depthResolveFilter', MTLMultisampleDepthResolveFilter, []), + ('setDepthResolveFilter:', None, [MTLMultisampleDepthResolveFilter]), +] +class MTLRenderPassStencilAttachmentDescriptor(objc.Spec): pass +enum_MTLMultisampleStencilResolveFilter: dict[int, str] = {(MTLMultisampleStencilResolveFilterSample0:=0): 'MTLMultisampleStencilResolveFilterSample0', (MTLMultisampleStencilResolveFilterDepthResolvedSample:=1): 'MTLMultisampleStencilResolveFilterDepthResolvedSample'} +MTLMultisampleStencilResolveFilter: TypeAlias = NSUInteger +MTLRenderPassStencilAttachmentDescriptor._bases_ = [MTLRenderPassAttachmentDescriptor] +MTLRenderPassStencilAttachmentDescriptor._methods_ = [ + ('clearStencil', uint32_t, []), + ('setClearStencil:', None, [uint32_t]), + ('stencilResolveFilter', MTLMultisampleStencilResolveFilter, []), + ('setStencilResolveFilter:', None, [MTLMultisampleStencilResolveFilter]), +] +class MTLRasterizationRateMap(objc.Spec): pass +class MTLRenderPassSampleBufferAttachmentDescriptorArray(objc.Spec): pass +class MTLRenderPassSampleBufferAttachmentDescriptor(objc.Spec): pass +MTLRenderPassSampleBufferAttachmentDescriptor._bases_ = [NSObject] +MTLRenderPassSampleBufferAttachmentDescriptor._methods_ = [ + ('sampleBuffer', MTLCounterSampleBuffer, []), + ('setSampleBuffer:', None, [MTLCounterSampleBuffer]), + ('startOfVertexSampleIndex', NSUInteger, []), + ('setStartOfVertexSampleIndex:', None, [NSUInteger]), + ('endOfVertexSampleIndex', NSUInteger, []), + ('setEndOfVertexSampleIndex:', None, [NSUInteger]), + ('startOfFragmentSampleIndex', NSUInteger, []), + ('setStartOfFragmentSampleIndex:', None, [NSUInteger]), + ('endOfFragmentSampleIndex', NSUInteger, []), + ('setEndOfFragmentSampleIndex:', None, [NSUInteger]), +] +MTLRenderPassSampleBufferAttachmentDescriptorArray._bases_ = [NSObject] +MTLRenderPassSampleBufferAttachmentDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLRenderPassSampleBufferAttachmentDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLRenderPassSampleBufferAttachmentDescriptor, NSUInteger]), +] +MTLRenderPassDescriptor._bases_ = [NSObject] +MTLRenderPassDescriptor._methods_ = [ + ('setSamplePositions:count:', None, [c.POINTER[MTLSamplePosition], NSUInteger]), + ('getSamplePositions:count:', NSUInteger, [c.POINTER[MTLSamplePosition], NSUInteger]), + ('colorAttachments', MTLRenderPassColorAttachmentDescriptorArray, []), + ('depthAttachment', MTLRenderPassDepthAttachmentDescriptor, []), + ('setDepthAttachment:', None, [MTLRenderPassDepthAttachmentDescriptor]), + ('stencilAttachment', MTLRenderPassStencilAttachmentDescriptor, []), + ('setStencilAttachment:', None, [MTLRenderPassStencilAttachmentDescriptor]), + ('visibilityResultBuffer', MTLBuffer, []), + ('setVisibilityResultBuffer:', None, [MTLBuffer]), + ('renderTargetArrayLength', NSUInteger, []), + ('setRenderTargetArrayLength:', None, [NSUInteger]), + ('imageblockSampleLength', NSUInteger, []), + ('setImageblockSampleLength:', None, [NSUInteger]), + ('threadgroupMemoryLength', NSUInteger, []), + ('setThreadgroupMemoryLength:', None, [NSUInteger]), + ('tileWidth', NSUInteger, []), + ('setTileWidth:', None, [NSUInteger]), + ('tileHeight', NSUInteger, []), + ('setTileHeight:', None, [NSUInteger]), + ('defaultRasterSampleCount', NSUInteger, []), + ('setDefaultRasterSampleCount:', None, [NSUInteger]), + ('renderTargetWidth', NSUInteger, []), + ('setRenderTargetWidth:', None, [NSUInteger]), + ('renderTargetHeight', NSUInteger, []), + ('setRenderTargetHeight:', None, [NSUInteger]), + ('rasterizationRateMap', MTLRasterizationRateMap, []), + ('setRasterizationRateMap:', None, [MTLRasterizationRateMap]), + ('sampleBufferAttachments', MTLRenderPassSampleBufferAttachmentDescriptorArray, []), +] +MTLRenderPassDescriptor._classmethods_ = [ + ('renderPassDescriptor', MTLRenderPassDescriptor, []), +] +class MTLComputePassDescriptor(objc.Spec): pass +class MTLComputePassSampleBufferAttachmentDescriptorArray(objc.Spec): pass +class MTLComputePassSampleBufferAttachmentDescriptor(objc.Spec): pass +MTLComputePassSampleBufferAttachmentDescriptor._bases_ = [NSObject] +MTLComputePassSampleBufferAttachmentDescriptor._methods_ = [ + ('sampleBuffer', MTLCounterSampleBuffer, []), + ('setSampleBuffer:', None, [MTLCounterSampleBuffer]), + ('startOfEncoderSampleIndex', NSUInteger, []), + ('setStartOfEncoderSampleIndex:', None, [NSUInteger]), + ('endOfEncoderSampleIndex', NSUInteger, []), + ('setEndOfEncoderSampleIndex:', None, [NSUInteger]), +] +MTLComputePassSampleBufferAttachmentDescriptorArray._bases_ = [NSObject] +MTLComputePassSampleBufferAttachmentDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLComputePassSampleBufferAttachmentDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLComputePassSampleBufferAttachmentDescriptor, NSUInteger]), +] +MTLComputePassDescriptor._bases_ = [NSObject] +MTLComputePassDescriptor._methods_ = [ + ('dispatchType', MTLDispatchType, []), + ('setDispatchType:', None, [MTLDispatchType]), + ('sampleBufferAttachments', MTLComputePassSampleBufferAttachmentDescriptorArray, []), +] +MTLComputePassDescriptor._classmethods_ = [ + ('computePassDescriptor', MTLComputePassDescriptor, []), +] +class MTLBlitPassDescriptor(objc.Spec): pass +class MTLBlitPassSampleBufferAttachmentDescriptorArray(objc.Spec): pass +class MTLBlitPassSampleBufferAttachmentDescriptor(objc.Spec): pass +MTLBlitPassSampleBufferAttachmentDescriptor._bases_ = [NSObject] +MTLBlitPassSampleBufferAttachmentDescriptor._methods_ = [ + ('sampleBuffer', MTLCounterSampleBuffer, []), + ('setSampleBuffer:', None, [MTLCounterSampleBuffer]), + ('startOfEncoderSampleIndex', NSUInteger, []), + ('setStartOfEncoderSampleIndex:', None, [NSUInteger]), + ('endOfEncoderSampleIndex', NSUInteger, []), + ('setEndOfEncoderSampleIndex:', None, [NSUInteger]), +] +MTLBlitPassSampleBufferAttachmentDescriptorArray._bases_ = [NSObject] +MTLBlitPassSampleBufferAttachmentDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLBlitPassSampleBufferAttachmentDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLBlitPassSampleBufferAttachmentDescriptor, NSUInteger]), +] +MTLBlitPassDescriptor._bases_ = [NSObject] +MTLBlitPassDescriptor._methods_ = [ + ('sampleBufferAttachments', MTLBlitPassSampleBufferAttachmentDescriptorArray, []), +] +MTLBlitPassDescriptor._classmethods_ = [ + ('blitPassDescriptor', MTLBlitPassDescriptor, []), +] +class MTLEvent(objc.Spec): pass +class MTLParallelRenderCommandEncoder(objc.Spec): pass +class MTLResourceStateCommandEncoder(objc.Spec): pass +enum_MTLSparseTextureMappingMode: dict[int, str] = {(MTLSparseTextureMappingModeMap:=0): 'MTLSparseTextureMappingModeMap', (MTLSparseTextureMappingModeUnmap:=1): 'MTLSparseTextureMappingModeUnmap'} +MTLSparseTextureMappingMode: TypeAlias = NSUInteger +MTLResourceStateCommandEncoder._bases_ = [MTLCommandEncoder] +MTLResourceStateCommandEncoder._methods_ = [ + ('updateTextureMappings:mode:regions:mipLevels:slices:numRegions:', None, [MTLTexture, MTLSparseTextureMappingMode, c.POINTER[MTLRegion], c.POINTER[NSUInteger], c.POINTER[NSUInteger], NSUInteger]), + ('updateTextureMapping:mode:region:mipLevel:slice:', None, [MTLTexture, MTLSparseTextureMappingMode, MTLRegion, NSUInteger, NSUInteger]), + ('updateTextureMapping:mode:indirectBuffer:indirectBufferOffset:', None, [MTLTexture, MTLSparseTextureMappingMode, MTLBuffer, NSUInteger]), + ('updateFence:', None, [MTLFence]), + ('waitForFence:', None, [MTLFence]), + ('moveTextureMappingsFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toTexture:destinationSlice:destinationLevel:destinationOrigin:', None, [MTLTexture, NSUInteger, NSUInteger, MTLOrigin, MTLSize, MTLTexture, NSUInteger, NSUInteger, MTLOrigin]), +] +class MTLResourceStatePassDescriptor(objc.Spec): pass +class MTLResourceStatePassSampleBufferAttachmentDescriptorArray(objc.Spec): pass +class MTLResourceStatePassSampleBufferAttachmentDescriptor(objc.Spec): pass +MTLResourceStatePassSampleBufferAttachmentDescriptor._bases_ = [NSObject] +MTLResourceStatePassSampleBufferAttachmentDescriptor._methods_ = [ + ('sampleBuffer', MTLCounterSampleBuffer, []), + ('setSampleBuffer:', None, [MTLCounterSampleBuffer]), + ('startOfEncoderSampleIndex', NSUInteger, []), + ('setStartOfEncoderSampleIndex:', None, [NSUInteger]), + ('endOfEncoderSampleIndex', NSUInteger, []), + ('setEndOfEncoderSampleIndex:', None, [NSUInteger]), +] +MTLResourceStatePassSampleBufferAttachmentDescriptorArray._bases_ = [NSObject] +MTLResourceStatePassSampleBufferAttachmentDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLResourceStatePassSampleBufferAttachmentDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLResourceStatePassSampleBufferAttachmentDescriptor, NSUInteger]), +] +MTLResourceStatePassDescriptor._bases_ = [NSObject] +MTLResourceStatePassDescriptor._methods_ = [ + ('sampleBufferAttachments', MTLResourceStatePassSampleBufferAttachmentDescriptorArray, []), +] +MTLResourceStatePassDescriptor._classmethods_ = [ + ('resourceStatePassDescriptor', MTLResourceStatePassDescriptor, []), +] +class MTLAccelerationStructureCommandEncoder(objc.Spec): pass +class MTLAccelerationStructurePassDescriptor(objc.Spec): pass +class MTLAccelerationStructurePassSampleBufferAttachmentDescriptorArray(objc.Spec): pass +class MTLAccelerationStructurePassSampleBufferAttachmentDescriptor(objc.Spec): pass +MTLAccelerationStructurePassSampleBufferAttachmentDescriptor._bases_ = [NSObject] +MTLAccelerationStructurePassSampleBufferAttachmentDescriptor._methods_ = [ + ('sampleBuffer', MTLCounterSampleBuffer, []), + ('setSampleBuffer:', None, [MTLCounterSampleBuffer]), + ('startOfEncoderSampleIndex', NSUInteger, []), + ('setStartOfEncoderSampleIndex:', None, [NSUInteger]), + ('endOfEncoderSampleIndex', NSUInteger, []), + ('setEndOfEncoderSampleIndex:', None, [NSUInteger]), +] +MTLAccelerationStructurePassSampleBufferAttachmentDescriptorArray._bases_ = [NSObject] +MTLAccelerationStructurePassSampleBufferAttachmentDescriptorArray._methods_ = [ + ('objectAtIndexedSubscript:', MTLAccelerationStructurePassSampleBufferAttachmentDescriptor, [NSUInteger]), + ('setObject:atIndexedSubscript:', None, [MTLAccelerationStructurePassSampleBufferAttachmentDescriptor, NSUInteger]), +] +MTLAccelerationStructurePassDescriptor._bases_ = [NSObject] +MTLAccelerationStructurePassDescriptor._methods_ = [ + ('sampleBufferAttachments', MTLAccelerationStructurePassSampleBufferAttachmentDescriptorArray, []), +] +MTLAccelerationStructurePassDescriptor._classmethods_ = [ + ('accelerationStructurePassDescriptor', MTLAccelerationStructurePassDescriptor, []), +] +enum_MTLCommandBufferErrorOption: dict[int, str] = {(MTLCommandBufferErrorOptionNone:=0): 'MTLCommandBufferErrorOptionNone', (MTLCommandBufferErrorOptionEncoderExecutionStatus:=1): 'MTLCommandBufferErrorOptionEncoderExecutionStatus'} +MTLCommandBufferErrorOption: TypeAlias = NSUInteger +class MTLLogContainer(objc.Spec): pass +enum_MTLCommandBufferStatus: dict[int, str] = {(MTLCommandBufferStatusNotEnqueued:=0): 'MTLCommandBufferStatusNotEnqueued', (MTLCommandBufferStatusEnqueued:=1): 'MTLCommandBufferStatusEnqueued', (MTLCommandBufferStatusCommitted:=2): 'MTLCommandBufferStatusCommitted', (MTLCommandBufferStatusScheduled:=3): 'MTLCommandBufferStatusScheduled', (MTLCommandBufferStatusCompleted:=4): 'MTLCommandBufferStatusCompleted', (MTLCommandBufferStatusError:=5): 'MTLCommandBufferStatusError'} +MTLCommandBufferStatus: TypeAlias = NSUInteger +class NSError(objc.Spec): pass +NSErrorDomain: TypeAlias = NSString +NSError._bases_ = [NSObject] +NSError._methods_ = [ + ('domain', NSErrorDomain, []), + ('code', NSInteger, []), + ('localizedDescription', NSString, []), + ('localizedFailureReason', NSString, []), + ('localizedRecoverySuggestion', NSString, []), + ('recoveryAttempter', objc.id_, []), + ('helpAnchor', NSString, []), +] +MTLCommandBuffer._bases_ = [NSObject] +MTLCommandBuffer._methods_ = [ + ('enqueue', None, []), + ('commit', None, []), + ('presentDrawable:', None, [MTLDrawable]), + ('presentDrawable:atTime:', None, [MTLDrawable, CFTimeInterval]), + ('presentDrawable:afterMinimumDuration:', None, [MTLDrawable, CFTimeInterval]), + ('waitUntilScheduled', None, []), + ('waitUntilCompleted', None, []), + ('blitCommandEncoder', MTLBlitCommandEncoder, []), + ('renderCommandEncoderWithDescriptor:', MTLRenderCommandEncoder, [MTLRenderPassDescriptor]), + ('computeCommandEncoderWithDescriptor:', MTLComputeCommandEncoder, [MTLComputePassDescriptor]), + ('blitCommandEncoderWithDescriptor:', MTLBlitCommandEncoder, [MTLBlitPassDescriptor]), + ('computeCommandEncoder', MTLComputeCommandEncoder, []), + ('computeCommandEncoderWithDispatchType:', MTLComputeCommandEncoder, [MTLDispatchType]), + ('encodeWaitForEvent:value:', None, [MTLEvent, uint64_t]), + ('encodeSignalEvent:value:', None, [MTLEvent, uint64_t]), + ('parallelRenderCommandEncoderWithDescriptor:', MTLParallelRenderCommandEncoder, [MTLRenderPassDescriptor]), + ('resourceStateCommandEncoder', MTLResourceStateCommandEncoder, []), + ('resourceStateCommandEncoderWithDescriptor:', MTLResourceStateCommandEncoder, [MTLResourceStatePassDescriptor]), + ('accelerationStructureCommandEncoder', MTLAccelerationStructureCommandEncoder, []), + ('accelerationStructureCommandEncoderWithDescriptor:', MTLAccelerationStructureCommandEncoder, [MTLAccelerationStructurePassDescriptor]), + ('pushDebugGroup:', None, [NSString]), + ('popDebugGroup', None, []), + ('device', MTLDevice, []), + ('commandQueue', MTLCommandQueue, []), + ('retainedReferences', BOOL, []), + ('errorOptions', MTLCommandBufferErrorOption, []), + ('label', NSString, []), + ('setLabel:', None, [NSString]), + ('kernelStartTime', CFTimeInterval, []), + ('kernelEndTime', CFTimeInterval, []), + ('logs', MTLLogContainer, []), + ('GPUStartTime', CFTimeInterval, []), + ('GPUEndTime', CFTimeInterval, []), + ('status', MTLCommandBufferStatus, []), + ('error', NSError, []), +] +class MTLCommandBufferDescriptor(objc.Spec): pass +MTLCommandBufferDescriptor._bases_ = [NSObject] +MTLCommandBufferDescriptor._methods_ = [ + ('retainedReferences', BOOL, []), + ('setRetainedReferences:', None, [BOOL]), + ('errorOptions', MTLCommandBufferErrorOption, []), + ('setErrorOptions:', None, [MTLCommandBufferErrorOption]), +] +MTLCommandQueue._bases_ = [NSObject] +MTLCommandQueue._methods_ = [ + ('commandBuffer', MTLCommandBuffer, []), + ('commandBufferWithDescriptor:', MTLCommandBuffer, [MTLCommandBufferDescriptor]), + ('commandBufferWithUnretainedReferences', MTLCommandBuffer, []), + ('insertDebugCaptureBoundary', None, []), + ('label', NSString, []), + ('setLabel:', None, [NSString]), + ('device', MTLDevice, []), +] +enum_MTLIOCompressionMethod: dict[int, str] = {(MTLIOCompressionMethodZlib:=0): 'MTLIOCompressionMethodZlib', (MTLIOCompressionMethodLZFSE:=1): 'MTLIOCompressionMethodLZFSE', (MTLIOCompressionMethodLZ4:=2): 'MTLIOCompressionMethodLZ4', (MTLIOCompressionMethodLZMA:=3): 'MTLIOCompressionMethodLZMA', (MTLIOCompressionMethodLZBitmap:=4): 'MTLIOCompressionMethodLZBitmap'} +MTLIOCompressionMethod: TypeAlias = NSInteger +@dll.bind(MTLDevice) +def MTLCreateSystemDefaultDevice() -> MTLDevice: ... +MTLCreateSystemDefaultDevice = objc.returns_retained(MTLCreateSystemDefaultDevice) +MTLDeviceNotificationName: TypeAlias = NSString +try: MTLDeviceWasAddedNotification = MTLDeviceNotificationName.in_dll(dll, 'MTLDeviceWasAddedNotification') # type: ignore +except (ValueError,AttributeError): pass +try: MTLDeviceRemovalRequestedNotification = MTLDeviceNotificationName.in_dll(dll, 'MTLDeviceRemovalRequestedNotification') # type: ignore +except (ValueError,AttributeError): pass +try: MTLDeviceWasRemovedNotification = MTLDeviceNotificationName.in_dll(dll, 'MTLDeviceWasRemovedNotification') # type: ignore +except (ValueError,AttributeError): pass +@dll.bind(None, NSObject) +def MTLRemoveDeviceObserver(observer:NSObject) -> None: ... +enum_MTLFeatureSet: dict[int, str] = {(MTLFeatureSet_iOS_GPUFamily1_v1:=0): 'MTLFeatureSet_iOS_GPUFamily1_v1', (MTLFeatureSet_iOS_GPUFamily2_v1:=1): 'MTLFeatureSet_iOS_GPUFamily2_v1', (MTLFeatureSet_iOS_GPUFamily1_v2:=2): 'MTLFeatureSet_iOS_GPUFamily1_v2', (MTLFeatureSet_iOS_GPUFamily2_v2:=3): 'MTLFeatureSet_iOS_GPUFamily2_v2', (MTLFeatureSet_iOS_GPUFamily3_v1:=4): 'MTLFeatureSet_iOS_GPUFamily3_v1', (MTLFeatureSet_iOS_GPUFamily1_v3:=5): 'MTLFeatureSet_iOS_GPUFamily1_v3', (MTLFeatureSet_iOS_GPUFamily2_v3:=6): 'MTLFeatureSet_iOS_GPUFamily2_v3', (MTLFeatureSet_iOS_GPUFamily3_v2:=7): 'MTLFeatureSet_iOS_GPUFamily3_v2', (MTLFeatureSet_iOS_GPUFamily1_v4:=8): 'MTLFeatureSet_iOS_GPUFamily1_v4', (MTLFeatureSet_iOS_GPUFamily2_v4:=9): 'MTLFeatureSet_iOS_GPUFamily2_v4', (MTLFeatureSet_iOS_GPUFamily3_v3:=10): 'MTLFeatureSet_iOS_GPUFamily3_v3', (MTLFeatureSet_iOS_GPUFamily4_v1:=11): 'MTLFeatureSet_iOS_GPUFamily4_v1', (MTLFeatureSet_iOS_GPUFamily1_v5:=12): 'MTLFeatureSet_iOS_GPUFamily1_v5', (MTLFeatureSet_iOS_GPUFamily2_v5:=13): 'MTLFeatureSet_iOS_GPUFamily2_v5', (MTLFeatureSet_iOS_GPUFamily3_v4:=14): 'MTLFeatureSet_iOS_GPUFamily3_v4', (MTLFeatureSet_iOS_GPUFamily4_v2:=15): 'MTLFeatureSet_iOS_GPUFamily4_v2', (MTLFeatureSet_iOS_GPUFamily5_v1:=16): 'MTLFeatureSet_iOS_GPUFamily5_v1', (MTLFeatureSet_macOS_GPUFamily1_v1:=10000): 'MTLFeatureSet_macOS_GPUFamily1_v1', (MTLFeatureSet_OSX_GPUFamily1_v1:=10000): 'MTLFeatureSet_OSX_GPUFamily1_v1', (MTLFeatureSet_macOS_GPUFamily1_v2:=10001): 'MTLFeatureSet_macOS_GPUFamily1_v2', (MTLFeatureSet_OSX_GPUFamily1_v2:=10001): 'MTLFeatureSet_OSX_GPUFamily1_v2', (MTLFeatureSet_macOS_ReadWriteTextureTier2:=10002): 'MTLFeatureSet_macOS_ReadWriteTextureTier2', (MTLFeatureSet_OSX_ReadWriteTextureTier2:=10002): 'MTLFeatureSet_OSX_ReadWriteTextureTier2', (MTLFeatureSet_macOS_GPUFamily1_v3:=10003): 'MTLFeatureSet_macOS_GPUFamily1_v3', (MTLFeatureSet_macOS_GPUFamily1_v4:=10004): 'MTLFeatureSet_macOS_GPUFamily1_v4', (MTLFeatureSet_macOS_GPUFamily2_v1:=10005): 'MTLFeatureSet_macOS_GPUFamily2_v1', (MTLFeatureSet_tvOS_GPUFamily1_v1:=30000): 'MTLFeatureSet_tvOS_GPUFamily1_v1', (MTLFeatureSet_TVOS_GPUFamily1_v1:=30000): 'MTLFeatureSet_TVOS_GPUFamily1_v1', (MTLFeatureSet_tvOS_GPUFamily1_v2:=30001): 'MTLFeatureSet_tvOS_GPUFamily1_v2', (MTLFeatureSet_tvOS_GPUFamily1_v3:=30002): 'MTLFeatureSet_tvOS_GPUFamily1_v3', (MTLFeatureSet_tvOS_GPUFamily2_v1:=30003): 'MTLFeatureSet_tvOS_GPUFamily2_v1', (MTLFeatureSet_tvOS_GPUFamily1_v4:=30004): 'MTLFeatureSet_tvOS_GPUFamily1_v4', (MTLFeatureSet_tvOS_GPUFamily2_v2:=30005): 'MTLFeatureSet_tvOS_GPUFamily2_v2'} +MTLFeatureSet: TypeAlias = NSUInteger +enum_MTLGPUFamily: dict[int, str] = {(MTLGPUFamilyApple1:=1001): 'MTLGPUFamilyApple1', (MTLGPUFamilyApple2:=1002): 'MTLGPUFamilyApple2', (MTLGPUFamilyApple3:=1003): 'MTLGPUFamilyApple3', (MTLGPUFamilyApple4:=1004): 'MTLGPUFamilyApple4', (MTLGPUFamilyApple5:=1005): 'MTLGPUFamilyApple5', (MTLGPUFamilyApple6:=1006): 'MTLGPUFamilyApple6', (MTLGPUFamilyApple7:=1007): 'MTLGPUFamilyApple7', (MTLGPUFamilyApple8:=1008): 'MTLGPUFamilyApple8', (MTLGPUFamilyApple9:=1009): 'MTLGPUFamilyApple9', (MTLGPUFamilyMac1:=2001): 'MTLGPUFamilyMac1', (MTLGPUFamilyMac2:=2002): 'MTLGPUFamilyMac2', (MTLGPUFamilyCommon1:=3001): 'MTLGPUFamilyCommon1', (MTLGPUFamilyCommon2:=3002): 'MTLGPUFamilyCommon2', (MTLGPUFamilyCommon3:=3003): 'MTLGPUFamilyCommon3', (MTLGPUFamilyMacCatalyst1:=4001): 'MTLGPUFamilyMacCatalyst1', (MTLGPUFamilyMacCatalyst2:=4002): 'MTLGPUFamilyMacCatalyst2', (MTLGPUFamilyMetal3:=5001): 'MTLGPUFamilyMetal3'} +MTLGPUFamily: TypeAlias = NSInteger +enum_MTLDeviceLocation: dict[int, str] = {(MTLDeviceLocationBuiltIn:=0): 'MTLDeviceLocationBuiltIn', (MTLDeviceLocationSlot:=1): 'MTLDeviceLocationSlot', (MTLDeviceLocationExternal:=2): 'MTLDeviceLocationExternal', (MTLDeviceLocationUnspecified:=-1): 'MTLDeviceLocationUnspecified'} +MTLDeviceLocation: TypeAlias = NSUInteger +enum_MTLPipelineOption: dict[int, str] = {(MTLPipelineOptionNone:=0): 'MTLPipelineOptionNone', (MTLPipelineOptionArgumentInfo:=1): 'MTLPipelineOptionArgumentInfo', (MTLPipelineOptionBufferTypeInfo:=2): 'MTLPipelineOptionBufferTypeInfo', (MTLPipelineOptionFailOnBinaryArchiveMiss:=4): 'MTLPipelineOptionFailOnBinaryArchiveMiss'} +MTLPipelineOption: TypeAlias = NSUInteger +enum_MTLReadWriteTextureTier: dict[int, str] = {(MTLReadWriteTextureTierNone:=0): 'MTLReadWriteTextureTierNone', (MTLReadWriteTextureTier1:=1): 'MTLReadWriteTextureTier1', (MTLReadWriteTextureTier2:=2): 'MTLReadWriteTextureTier2'} +MTLReadWriteTextureTier: TypeAlias = NSUInteger +enum_MTLArgumentBuffersTier: dict[int, str] = {(MTLArgumentBuffersTier1:=0): 'MTLArgumentBuffersTier1', (MTLArgumentBuffersTier2:=1): 'MTLArgumentBuffersTier2'} +MTLArgumentBuffersTier: TypeAlias = NSUInteger +enum_MTLSparseTextureRegionAlignmentMode: dict[int, str] = {(MTLSparseTextureRegionAlignmentModeOutward:=0): 'MTLSparseTextureRegionAlignmentModeOutward', (MTLSparseTextureRegionAlignmentModeInward:=1): 'MTLSparseTextureRegionAlignmentModeInward'} +MTLSparseTextureRegionAlignmentMode: TypeAlias = NSUInteger +enum_MTLSparsePageSize: dict[int, str] = {(MTLSparsePageSize16:=101): 'MTLSparsePageSize16', (MTLSparsePageSize64:=102): 'MTLSparsePageSize64', (MTLSparsePageSize256:=103): 'MTLSparsePageSize256'} +MTLSparsePageSize: TypeAlias = NSInteger +@c.record +class MTLAccelerationStructureSizes(c.Struct): + SIZE = 24 + accelerationStructureSize: int + buildScratchBufferSize: int + refitScratchBufferSize: int +MTLAccelerationStructureSizes.register_fields([('accelerationStructureSize', NSUInteger, 0), ('buildScratchBufferSize', NSUInteger, 8), ('refitScratchBufferSize', NSUInteger, 16)]) +enum_MTLCounterSamplingPoint: dict[int, str] = {(MTLCounterSamplingPointAtStageBoundary:=0): 'MTLCounterSamplingPointAtStageBoundary', (MTLCounterSamplingPointAtDrawBoundary:=1): 'MTLCounterSamplingPointAtDrawBoundary', (MTLCounterSamplingPointAtDispatchBoundary:=2): 'MTLCounterSamplingPointAtDispatchBoundary', (MTLCounterSamplingPointAtTileDispatchBoundary:=3): 'MTLCounterSamplingPointAtTileDispatchBoundary', (MTLCounterSamplingPointAtBlitBoundary:=4): 'MTLCounterSamplingPointAtBlitBoundary'} +MTLCounterSamplingPoint: TypeAlias = NSUInteger +@c.record +class MTLSizeAndAlign(c.Struct): + SIZE = 16 + size: int + align: int +MTLSizeAndAlign.register_fields([('size', NSUInteger, 0), ('align', NSUInteger, 8)]) +class MTLRenderPipelineReflection(objc.Spec): pass +class MTLArgumentDescriptor(objc.Spec): pass +MTLArgumentDescriptor._bases_ = [NSObject] +MTLArgumentDescriptor._methods_ = [ + ('dataType', MTLDataType, []), + ('setDataType:', None, [MTLDataType]), + ('index', NSUInteger, []), + ('setIndex:', None, [NSUInteger]), + ('arrayLength', NSUInteger, []), + ('setArrayLength:', None, [NSUInteger]), + ('access', MTLBindingAccess, []), + ('setAccess:', None, [MTLBindingAccess]), + ('textureType', MTLTextureType, []), + ('setTextureType:', None, [MTLTextureType]), + ('constantBlockAlignment', NSUInteger, []), + ('setConstantBlockAlignment:', None, [NSUInteger]), +] +MTLArgumentDescriptor._classmethods_ = [ + ('argumentDescriptor', MTLArgumentDescriptor, []), +] +class MTLArchitecture(objc.Spec): pass +MTLArchitecture._bases_ = [NSObject] +MTLArchitecture._methods_ = [ + ('name', NSString, []), +] +class MTLHeapDescriptor(objc.Spec): pass +class MTLDepthStencilState(objc.Spec): pass +class MTLDepthStencilDescriptor(objc.Spec): pass +class struct___IOSurface(c.Struct): pass +IOSurfaceRef: TypeAlias = c.POINTER[struct___IOSurface] +class MTLSharedTextureHandle(objc.Spec): pass +MTLSharedTextureHandle._bases_ = [NSObject] +MTLSharedTextureHandle._methods_ = [ + ('device', MTLDevice, []), + ('label', NSString, []), +] +class MTLSamplerDescriptor(objc.Spec): pass +class MTLLibrary(objc.Spec): pass +class MTLFunctionConstantValues(objc.Spec): pass +MTLFunctionConstantValues._bases_ = [NSObject] +MTLFunctionConstantValues._methods_ = [ + ('setConstantValue:type:atIndex:', None, [ctypes.c_void_p, MTLDataType, NSUInteger]), + ('setConstantValues:type:withRange:', None, [ctypes.c_void_p, MTLDataType, NSRange]), + ('setConstantValue:type:withName:', None, [ctypes.c_void_p, MTLDataType, NSString]), + ('reset', None, []), +] +class MTLFunctionDescriptor(objc.Spec): pass +MTLFunctionDescriptor._bases_ = [NSObject] +MTLFunctionDescriptor._methods_ = [ + ('name', NSString, []), + ('setName:', None, [NSString]), + ('specializedName', NSString, []), + ('setSpecializedName:', None, [NSString]), + ('constantValues', MTLFunctionConstantValues, []), + ('setConstantValues:', None, [MTLFunctionConstantValues]), + ('options', MTLFunctionOptions, []), + ('setOptions:', None, [MTLFunctionOptions]), +] +MTLFunctionDescriptor._classmethods_ = [ + ('functionDescriptor', MTLFunctionDescriptor, []), +] +class MTLIntersectionFunctionDescriptor(objc.Spec): pass +enum_MTLLibraryType: dict[int, str] = {(MTLLibraryTypeExecutable:=0): 'MTLLibraryTypeExecutable', (MTLLibraryTypeDynamic:=1): 'MTLLibraryTypeDynamic'} +MTLLibraryType: TypeAlias = NSInteger +MTLLibrary._bases_ = [NSObject] +MTLLibrary._methods_ = [ + ('newFunctionWithName:', MTLFunction, [NSString], True), + ('newFunctionWithName:constantValues:error:', MTLFunction, [NSString, MTLFunctionConstantValues, c.POINTER[NSError]], True), + ('newFunctionWithDescriptor:error:', MTLFunction, [MTLFunctionDescriptor, c.POINTER[NSError]], True), + ('newIntersectionFunctionWithDescriptor:error:', MTLFunction, [MTLIntersectionFunctionDescriptor, c.POINTER[NSError]], True), + ('label', NSString, []), + ('setLabel:', None, [NSString]), + ('device', MTLDevice, []), + ('type', MTLLibraryType, []), + ('installName', NSString, []), +] +class NSBundle(objc.Spec): pass +class NSURL(objc.Spec): pass +NSURLResourceKey: TypeAlias = NSString +enum_NSURLBookmarkCreationOptions: dict[int, str] = {(NSURLBookmarkCreationPreferFileIDResolution:=256): 'NSURLBookmarkCreationPreferFileIDResolution', (NSURLBookmarkCreationMinimalBookmark:=512): 'NSURLBookmarkCreationMinimalBookmark', (NSURLBookmarkCreationSuitableForBookmarkFile:=1024): 'NSURLBookmarkCreationSuitableForBookmarkFile', (NSURLBookmarkCreationWithSecurityScope:=2048): 'NSURLBookmarkCreationWithSecurityScope', (NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess:=4096): 'NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess', (NSURLBookmarkCreationWithoutImplicitSecurityScope:=536870912): 'NSURLBookmarkCreationWithoutImplicitSecurityScope'} +NSURLBookmarkCreationOptions: TypeAlias = NSUInteger +enum_NSURLBookmarkResolutionOptions: dict[int, str] = {(NSURLBookmarkResolutionWithoutUI:=256): 'NSURLBookmarkResolutionWithoutUI', (NSURLBookmarkResolutionWithoutMounting:=512): 'NSURLBookmarkResolutionWithoutMounting', (NSURLBookmarkResolutionWithSecurityScope:=1024): 'NSURLBookmarkResolutionWithSecurityScope', (NSURLBookmarkResolutionWithoutImplicitStartAccessing:=32768): 'NSURLBookmarkResolutionWithoutImplicitStartAccessing'} +NSURLBookmarkResolutionOptions: TypeAlias = NSUInteger +class NSNumber(objc.Spec): pass +enum_NSComparisonResult: dict[int, str] = {(NSOrderedAscending:=-1): 'NSOrderedAscending', (NSOrderedSame:=0): 'NSOrderedSame', (NSOrderedDescending:=1): 'NSOrderedDescending'} +NSComparisonResult: TypeAlias = NSInteger +class NSValue(objc.Spec): pass +NSValue._bases_ = [NSObject] +NSValue._methods_ = [ + ('getValue:size:', None, [ctypes.c_void_p, NSUInteger]), + ('initWithBytes:objCType:', 'instancetype', [ctypes.c_void_p, c.POINTER[ctypes.c_char]]), + ('initWithCoder:', 'instancetype', [NSCoder]), + ('objCType', c.POINTER[ctypes.c_char], []), +] +NSNumber._bases_ = [NSValue] +NSNumber._methods_ = [ + ('initWithCoder:', 'instancetype', [NSCoder]), + ('initWithChar:', NSNumber, [ctypes.c_char]), + ('initWithUnsignedChar:', NSNumber, [ctypes.c_ubyte]), + ('initWithShort:', NSNumber, [ctypes.c_int16]), + ('initWithUnsignedShort:', NSNumber, [ctypes.c_uint16]), + ('initWithInt:', NSNumber, [ctypes.c_int32]), + ('initWithUnsignedInt:', NSNumber, [ctypes.c_uint32]), + ('initWithLong:', NSNumber, [ctypes.c_int64]), + ('initWithUnsignedLong:', NSNumber, [ctypes.c_uint64]), + ('initWithLongLong:', NSNumber, [ctypes.c_int64]), + ('initWithUnsignedLongLong:', NSNumber, [ctypes.c_uint64]), + ('initWithFloat:', NSNumber, [ctypes.c_float]), + ('initWithDouble:', NSNumber, [ctypes.c_double]), + ('initWithBool:', NSNumber, [BOOL]), + ('initWithInteger:', NSNumber, [NSInteger]), + ('initWithUnsignedInteger:', NSNumber, [NSUInteger]), + ('compare:', NSComparisonResult, [NSNumber]), + ('isEqualToNumber:', BOOL, [NSNumber]), + ('descriptionWithLocale:', NSString, [objc.id_]), + ('charValue', ctypes.c_char, []), + ('unsignedCharValue', ctypes.c_ubyte, []), + ('shortValue', ctypes.c_int16, []), + ('unsignedShortValue', ctypes.c_uint16, []), + ('intValue', ctypes.c_int32, []), + ('unsignedIntValue', ctypes.c_uint32, []), + ('longValue', ctypes.c_int64, []), + ('unsignedLongValue', ctypes.c_uint64, []), + ('longLongValue', ctypes.c_int64, []), + ('unsignedLongLongValue', ctypes.c_uint64, []), + ('floatValue', ctypes.c_float, []), + ('doubleValue', ctypes.c_double, []), + ('boolValue', BOOL, []), + ('integerValue', NSInteger, []), + ('unsignedIntegerValue', NSUInteger, []), + ('stringValue', NSString, []), +] +NSURLBookmarkFileCreationOptions: TypeAlias = ctypes.c_uint64 +NSURL._bases_ = [NSObject] +NSURL._methods_ = [ + ('initWithScheme:host:path:', 'instancetype', [NSString, NSString, NSString]), + ('initFileURLWithPath:isDirectory:relativeToURL:', 'instancetype', [NSString, BOOL, NSURL]), + ('initFileURLWithPath:relativeToURL:', 'instancetype', [NSString, NSURL]), + ('initFileURLWithPath:isDirectory:', 'instancetype', [NSString, BOOL]), + ('initFileURLWithPath:', 'instancetype', [NSString]), + ('initFileURLWithFileSystemRepresentation:isDirectory:relativeToURL:', 'instancetype', [c.POINTER[ctypes.c_char], BOOL, NSURL]), + ('initWithString:', 'instancetype', [NSString]), + ('initWithString:relativeToURL:', 'instancetype', [NSString, NSURL]), + ('initWithString:encodingInvalidCharacters:', 'instancetype', [NSString, BOOL]), + ('initWithDataRepresentation:relativeToURL:', 'instancetype', [NSData, NSURL]), + ('initAbsoluteURLWithDataRepresentation:relativeToURL:', 'instancetype', [NSData, NSURL]), + ('getFileSystemRepresentation:maxLength:', BOOL, [c.POINTER[ctypes.c_char], NSUInteger]), + ('isFileReferenceURL', BOOL, []), + ('fileReferenceURL', NSURL, []), + ('getResourceValue:forKey:error:', BOOL, [c.POINTER[objc.id_], NSURLResourceKey, c.POINTER[NSError]]), + ('setResourceValue:forKey:error:', BOOL, [objc.id_, NSURLResourceKey, c.POINTER[NSError]]), + ('removeCachedResourceValueForKey:', None, [NSURLResourceKey]), + ('removeAllCachedResourceValues', None, []), + ('setTemporaryResourceValue:forKey:', None, [objc.id_, NSURLResourceKey]), + ('initByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:', 'instancetype', [NSData, NSURLBookmarkResolutionOptions, NSURL, c.POINTER[BOOL], c.POINTER[NSError]]), + ('startAccessingSecurityScopedResource', BOOL, []), + ('stopAccessingSecurityScopedResource', None, []), + ('dataRepresentation', NSData, []), + ('absoluteString', NSString, []), + ('relativeString', NSString, []), + ('baseURL', NSURL, []), + ('absoluteURL', NSURL, []), + ('scheme', NSString, []), + ('resourceSpecifier', NSString, []), + ('host', NSString, []), + ('port', NSNumber, []), + ('user', NSString, []), + ('password', NSString, []), + ('path', NSString, []), + ('fragment', NSString, []), + ('parameterString', NSString, []), + ('query', NSString, []), + ('relativePath', NSString, []), + ('hasDirectoryPath', BOOL, []), + ('fileSystemRepresentation', c.POINTER[ctypes.c_char], []), + ('isFileURL', BOOL, []), + ('standardizedURL', NSURL, []), + ('filePathURL', NSURL, []), +] +NSURL._classmethods_ = [ + ('fileURLWithPath:isDirectory:relativeToURL:', NSURL, [NSString, BOOL, NSURL]), + ('fileURLWithPath:relativeToURL:', NSURL, [NSString, NSURL]), + ('fileURLWithPath:isDirectory:', NSURL, [NSString, BOOL]), + ('fileURLWithPath:', NSURL, [NSString]), + ('fileURLWithFileSystemRepresentation:isDirectory:relativeToURL:', NSURL, [c.POINTER[ctypes.c_char], BOOL, NSURL]), + ('URLWithString:', 'instancetype', [NSString]), + ('URLWithString:relativeToURL:', 'instancetype', [NSString, NSURL]), + ('URLWithString:encodingInvalidCharacters:', 'instancetype', [NSString, BOOL]), + ('URLWithDataRepresentation:relativeToURL:', NSURL, [NSData, NSURL]), + ('absoluteURLWithDataRepresentation:relativeToURL:', NSURL, [NSData, NSURL]), + ('URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:', 'instancetype', [NSData, NSURLBookmarkResolutionOptions, NSURL, c.POINTER[BOOL], c.POINTER[NSError]]), + ('writeBookmarkData:toURL:options:error:', BOOL, [NSData, NSURL, NSURLBookmarkFileCreationOptions, c.POINTER[NSError]]), + ('bookmarkDataWithContentsOfURL:error:', NSData, [NSURL, c.POINTER[NSError]]), + ('URLByResolvingAliasFileAtURL:options:error:', 'instancetype', [NSURL, NSURLBookmarkResolutionOptions, c.POINTER[NSError]]), +] +class NSAttributedString(objc.Spec): pass +NSAttributedString._bases_ = [NSObject] +NSAttributedString._methods_ = [ + ('string', NSString, []), +] +NSBundle._bases_ = [NSObject] +NSBundle._methods_ = [ + ('initWithPath:', 'instancetype', [NSString]), + ('initWithURL:', 'instancetype', [NSURL]), + ('load', BOOL, []), + ('unload', BOOL, []), + ('preflightAndReturnError:', BOOL, [c.POINTER[NSError]]), + ('loadAndReturnError:', BOOL, [c.POINTER[NSError]]), + ('URLForAuxiliaryExecutable:', NSURL, [NSString]), + ('pathForAuxiliaryExecutable:', NSString, [NSString]), + ('URLForResource:withExtension:', NSURL, [NSString, NSString]), + ('URLForResource:withExtension:subdirectory:', NSURL, [NSString, NSString, NSString]), + ('URLForResource:withExtension:subdirectory:localization:', NSURL, [NSString, NSString, NSString, NSString]), + ('pathForResource:ofType:', NSString, [NSString, NSString]), + ('pathForResource:ofType:inDirectory:', NSString, [NSString, NSString, NSString]), + ('pathForResource:ofType:inDirectory:forLocalization:', NSString, [NSString, NSString, NSString, NSString]), + ('localizedStringForKey:value:table:', NSString, [NSString, NSString, NSString]), + ('localizedAttributedStringForKey:value:table:', NSAttributedString, [NSString, NSString, NSString]), + ('objectForInfoDictionaryKey:', objc.id_, [NSString]), + ('isLoaded', BOOL, []), + ('bundleURL', NSURL, []), + ('resourceURL', NSURL, []), + ('executableURL', NSURL, []), + ('privateFrameworksURL', NSURL, []), + ('sharedFrameworksURL', NSURL, []), + ('sharedSupportURL', NSURL, []), + ('builtInPlugInsURL', NSURL, []), + ('appStoreReceiptURL', NSURL, []), + ('bundlePath', NSString, []), + ('resourcePath', NSString, []), + ('executablePath', NSString, []), + ('privateFrameworksPath', NSString, []), + ('sharedFrameworksPath', NSString, []), + ('sharedSupportPath', NSString, []), + ('builtInPlugInsPath', NSString, []), + ('bundleIdentifier', NSString, []), + ('developmentLocalization', NSString, []), +] +NSBundle._classmethods_ = [ + ('bundleWithPath:', 'instancetype', [NSString]), + ('bundleWithURL:', 'instancetype', [NSURL]), + ('bundleWithIdentifier:', NSBundle, [NSString]), + ('URLForResource:withExtension:subdirectory:inBundleWithURL:', NSURL, [NSString, NSString, NSString, NSURL]), + ('pathForResource:ofType:inDirectory:', NSString, [NSString, NSString, NSString]), + ('mainBundle', NSBundle, []), +] +class MTLCompileOptions(objc.Spec): pass +enum_MTLLanguageVersion: dict[int, str] = {(MTLLanguageVersion1_0:=65536): 'MTLLanguageVersion1_0', (MTLLanguageVersion1_1:=65537): 'MTLLanguageVersion1_1', (MTLLanguageVersion1_2:=65538): 'MTLLanguageVersion1_2', (MTLLanguageVersion2_0:=131072): 'MTLLanguageVersion2_0', (MTLLanguageVersion2_1:=131073): 'MTLLanguageVersion2_1', (MTLLanguageVersion2_2:=131074): 'MTLLanguageVersion2_2', (MTLLanguageVersion2_3:=131075): 'MTLLanguageVersion2_3', (MTLLanguageVersion2_4:=131076): 'MTLLanguageVersion2_4', (MTLLanguageVersion3_0:=196608): 'MTLLanguageVersion3_0', (MTLLanguageVersion3_1:=196609): 'MTLLanguageVersion3_1'} +MTLLanguageVersion: TypeAlias = NSUInteger +enum_MTLLibraryOptimizationLevel: dict[int, str] = {(MTLLibraryOptimizationLevelDefault:=0): 'MTLLibraryOptimizationLevelDefault', (MTLLibraryOptimizationLevelSize:=1): 'MTLLibraryOptimizationLevelSize'} +MTLLibraryOptimizationLevel: TypeAlias = NSInteger +enum_MTLCompileSymbolVisibility: dict[int, str] = {(MTLCompileSymbolVisibilityDefault:=0): 'MTLCompileSymbolVisibilityDefault', (MTLCompileSymbolVisibilityHidden:=1): 'MTLCompileSymbolVisibilityHidden'} +MTLCompileSymbolVisibility: TypeAlias = NSInteger +MTLCompileOptions._bases_ = [NSObject] +MTLCompileOptions._methods_ = [ + ('fastMathEnabled', BOOL, []), + ('setFastMathEnabled:', None, [BOOL]), + ('languageVersion', MTLLanguageVersion, []), + ('setLanguageVersion:', None, [MTLLanguageVersion]), + ('libraryType', MTLLibraryType, []), + ('setLibraryType:', None, [MTLLibraryType]), + ('installName', NSString, []), + ('setInstallName:', None, [NSString]), + ('preserveInvariance', BOOL, []), + ('setPreserveInvariance:', None, [BOOL]), + ('optimizationLevel', MTLLibraryOptimizationLevel, []), + ('setOptimizationLevel:', None, [MTLLibraryOptimizationLevel]), + ('compileSymbolVisibility', MTLCompileSymbolVisibility, []), + ('setCompileSymbolVisibility:', None, [MTLCompileSymbolVisibility]), + ('allowReferencingUndefinedSymbols', BOOL, []), + ('setAllowReferencingUndefinedSymbols:', None, [BOOL]), + ('maxTotalThreadsPerThreadgroup', NSUInteger, []), + ('setMaxTotalThreadsPerThreadgroup:', None, [NSUInteger]), +] +class MTLStitchedLibraryDescriptor(objc.Spec): pass +class MTLRenderPipelineState(objc.Spec): pass +class MTLRenderPipelineDescriptor(objc.Spec): pass +class MTLTileRenderPipelineDescriptor(objc.Spec): pass +class MTLMeshRenderPipelineDescriptor(objc.Spec): pass +class MTLRasterizationRateMapDescriptor(objc.Spec): pass +class MTLIndirectCommandBufferDescriptor(objc.Spec): pass +class MTLSharedEvent(objc.Spec): pass +class MTLSharedEventHandle(objc.Spec): pass +class MTLIOFileHandle(objc.Spec): pass +class MTLIOCommandQueue(objc.Spec): pass +class MTLIOCommandQueueDescriptor(objc.Spec): pass +class MTLCounterSampleBufferDescriptor(objc.Spec): pass +class MTLCounterSet(objc.Spec): pass +MTLCounterSet._bases_ = [NSObject] +MTLCounterSet._methods_ = [ + ('name', NSString, []), +] +MTLCounterSampleBufferDescriptor._bases_ = [NSObject] +MTLCounterSampleBufferDescriptor._methods_ = [ + ('counterSet', MTLCounterSet, []), + ('setCounterSet:', None, [MTLCounterSet]), + ('label', NSString, []), + ('setLabel:', None, [NSString]), + ('storageMode', MTLStorageMode, []), + ('setStorageMode:', None, [MTLStorageMode]), + ('sampleCount', NSUInteger, []), + ('setSampleCount:', None, [NSUInteger]), +] +MTLTimestamp: TypeAlias = ctypes.c_uint64 +class MTLBufferBinding(objc.Spec): pass +class MTLBinding(objc.Spec): pass +MTLBufferBinding._bases_ = [MTLBinding] +MTLBufferBinding._methods_ = [ + ('bufferAlignment', NSUInteger, []), + ('bufferDataSize', NSUInteger, []), + ('bufferDataType', MTLDataType, []), + ('bufferStructType', MTLStructType, []), + ('bufferPointerType', MTLPointerType, []), +] +class MTLDynamicLibrary(objc.Spec): pass +class MTLBinaryArchive(objc.Spec): pass +class MTLBinaryArchiveDescriptor(objc.Spec): pass +class MTLAccelerationStructureDescriptor(objc.Spec): pass +MTLDevice._bases_ = [NSObject] +MTLDevice._methods_ = [ + ('newCommandQueue', MTLCommandQueue, [], True), + ('newCommandQueueWithMaxCommandBufferCount:', MTLCommandQueue, [NSUInteger], True), + ('heapTextureSizeAndAlignWithDescriptor:', MTLSizeAndAlign, [MTLTextureDescriptor]), + ('heapBufferSizeAndAlignWithLength:options:', MTLSizeAndAlign, [NSUInteger, MTLResourceOptions]), + ('newHeapWithDescriptor:', MTLHeap, [MTLHeapDescriptor], True), + ('newBufferWithLength:options:', MTLBuffer, [NSUInteger, MTLResourceOptions], True), + ('newBufferWithBytes:length:options:', MTLBuffer, [ctypes.c_void_p, NSUInteger, MTLResourceOptions], True), + ('newDepthStencilStateWithDescriptor:', MTLDepthStencilState, [MTLDepthStencilDescriptor], True), + ('newTextureWithDescriptor:', MTLTexture, [MTLTextureDescriptor], True), + ('newTextureWithDescriptor:iosurface:plane:', MTLTexture, [MTLTextureDescriptor, IOSurfaceRef, NSUInteger], True), + ('newSharedTextureWithDescriptor:', MTLTexture, [MTLTextureDescriptor], True), + ('newSharedTextureWithHandle:', MTLTexture, [MTLSharedTextureHandle], True), + ('newSamplerStateWithDescriptor:', MTLSamplerState, [MTLSamplerDescriptor], True), + ('newDefaultLibrary', MTLLibrary, [], True), + ('newDefaultLibraryWithBundle:error:', MTLLibrary, [NSBundle, c.POINTER[NSError]], True), + ('newLibraryWithFile:error:', MTLLibrary, [NSString, c.POINTER[NSError]], True), + ('newLibraryWithURL:error:', MTLLibrary, [NSURL, c.POINTER[NSError]], True), + ('newLibraryWithData:error:', MTLLibrary, [objc.id_, c.POINTER[NSError]], True), + ('newLibraryWithSource:options:error:', MTLLibrary, [NSString, MTLCompileOptions, c.POINTER[NSError]], True), + ('newLibraryWithStitchedDescriptor:error:', MTLLibrary, [MTLStitchedLibraryDescriptor, c.POINTER[NSError]], True), + ('newRenderPipelineStateWithDescriptor:error:', MTLRenderPipelineState, [MTLRenderPipelineDescriptor, c.POINTER[NSError]], True), + ('newRenderPipelineStateWithDescriptor:options:reflection:error:', MTLRenderPipelineState, [MTLRenderPipelineDescriptor, MTLPipelineOption, c.POINTER[MTLRenderPipelineReflection], c.POINTER[NSError]], True), + ('newComputePipelineStateWithFunction:error:', MTLComputePipelineState, [MTLFunction, c.POINTER[NSError]], True), + ('newComputePipelineStateWithFunction:options:reflection:error:', MTLComputePipelineState, [MTLFunction, MTLPipelineOption, c.POINTER[MTLComputePipelineReflection], c.POINTER[NSError]], True), + ('newComputePipelineStateWithDescriptor:options:reflection:error:', MTLComputePipelineState, [MTLComputePipelineDescriptor, MTLPipelineOption, c.POINTER[MTLComputePipelineReflection], c.POINTER[NSError]], True), + ('newFence', MTLFence, [], True), + ('supportsFeatureSet:', BOOL, [MTLFeatureSet]), + ('supportsFamily:', BOOL, [MTLGPUFamily]), + ('supportsTextureSampleCount:', BOOL, [NSUInteger]), + ('minimumLinearTextureAlignmentForPixelFormat:', NSUInteger, [MTLPixelFormat]), + ('minimumTextureBufferAlignmentForPixelFormat:', NSUInteger, [MTLPixelFormat]), + ('newRenderPipelineStateWithTileDescriptor:options:reflection:error:', MTLRenderPipelineState, [MTLTileRenderPipelineDescriptor, MTLPipelineOption, c.POINTER[MTLRenderPipelineReflection], c.POINTER[NSError]], True), + ('newRenderPipelineStateWithMeshDescriptor:options:reflection:error:', MTLRenderPipelineState, [MTLMeshRenderPipelineDescriptor, MTLPipelineOption, c.POINTER[MTLRenderPipelineReflection], c.POINTER[NSError]], True), + ('getDefaultSamplePositions:count:', None, [c.POINTER[MTLSamplePosition], NSUInteger]), + ('supportsRasterizationRateMapWithLayerCount:', BOOL, [NSUInteger]), + ('newRasterizationRateMapWithDescriptor:', MTLRasterizationRateMap, [MTLRasterizationRateMapDescriptor], True), + ('newIndirectCommandBufferWithDescriptor:maxCommandCount:options:', MTLIndirectCommandBuffer, [MTLIndirectCommandBufferDescriptor, NSUInteger, MTLResourceOptions], True), + ('newEvent', MTLEvent, [], True), + ('newSharedEvent', MTLSharedEvent, [], True), + ('newSharedEventWithHandle:', MTLSharedEvent, [MTLSharedEventHandle], True), + ('newIOHandleWithURL:error:', MTLIOFileHandle, [NSURL, c.POINTER[NSError]], True), + ('newIOCommandQueueWithDescriptor:error:', MTLIOCommandQueue, [MTLIOCommandQueueDescriptor, c.POINTER[NSError]], True), + ('newIOHandleWithURL:compressionMethod:error:', MTLIOFileHandle, [NSURL, MTLIOCompressionMethod, c.POINTER[NSError]], True), + ('newIOFileHandleWithURL:error:', MTLIOFileHandle, [NSURL, c.POINTER[NSError]], True), + ('newIOFileHandleWithURL:compressionMethod:error:', MTLIOFileHandle, [NSURL, MTLIOCompressionMethod, c.POINTER[NSError]], True), + ('sparseTileSizeWithTextureType:pixelFormat:sampleCount:', MTLSize, [MTLTextureType, MTLPixelFormat, NSUInteger]), + ('convertSparsePixelRegions:toTileRegions:withTileSize:alignmentMode:numRegions:', None, [c.POINTER[MTLRegion], c.POINTER[MTLRegion], MTLSize, MTLSparseTextureRegionAlignmentMode, NSUInteger]), + ('convertSparseTileRegions:toPixelRegions:withTileSize:numRegions:', None, [c.POINTER[MTLRegion], c.POINTER[MTLRegion], MTLSize, NSUInteger]), + ('sparseTileSizeInBytesForSparsePageSize:', NSUInteger, [MTLSparsePageSize]), + ('sparseTileSizeWithTextureType:pixelFormat:sampleCount:sparsePageSize:', MTLSize, [MTLTextureType, MTLPixelFormat, NSUInteger, MTLSparsePageSize]), + ('newCounterSampleBufferWithDescriptor:error:', MTLCounterSampleBuffer, [MTLCounterSampleBufferDescriptor, c.POINTER[NSError]], True), + ('sampleTimestamps:gpuTimestamp:', None, [c.POINTER[MTLTimestamp], c.POINTER[MTLTimestamp]]), + ('newArgumentEncoderWithBufferBinding:', MTLArgumentEncoder, [MTLBufferBinding], True), + ('supportsCounterSampling:', BOOL, [MTLCounterSamplingPoint]), + ('supportsVertexAmplificationCount:', BOOL, [NSUInteger]), + ('newDynamicLibrary:error:', MTLDynamicLibrary, [MTLLibrary, c.POINTER[NSError]], True), + ('newDynamicLibraryWithURL:error:', MTLDynamicLibrary, [NSURL, c.POINTER[NSError]], True), + ('newBinaryArchiveWithDescriptor:error:', MTLBinaryArchive, [MTLBinaryArchiveDescriptor, c.POINTER[NSError]], True), + ('accelerationStructureSizesWithDescriptor:', MTLAccelerationStructureSizes, [MTLAccelerationStructureDescriptor]), + ('newAccelerationStructureWithSize:', MTLAccelerationStructure, [NSUInteger], True), + ('newAccelerationStructureWithDescriptor:', MTLAccelerationStructure, [MTLAccelerationStructureDescriptor], True), + ('heapAccelerationStructureSizeAndAlignWithSize:', MTLSizeAndAlign, [NSUInteger]), + ('heapAccelerationStructureSizeAndAlignWithDescriptor:', MTLSizeAndAlign, [MTLAccelerationStructureDescriptor]), + ('name', NSString, []), + ('registryID', uint64_t, []), + ('architecture', MTLArchitecture, []), + ('maxThreadsPerThreadgroup', MTLSize, []), + ('isLowPower', BOOL, []), + ('isHeadless', BOOL, []), + ('isRemovable', BOOL, []), + ('hasUnifiedMemory', BOOL, []), + ('recommendedMaxWorkingSetSize', uint64_t, []), + ('location', MTLDeviceLocation, []), + ('locationNumber', NSUInteger, []), + ('maxTransferRate', uint64_t, []), + ('isDepth24Stencil8PixelFormatSupported', BOOL, []), + ('readWriteTextureSupport', MTLReadWriteTextureTier, []), + ('argumentBuffersSupport', MTLArgumentBuffersTier, []), + ('areRasterOrderGroupsSupported', BOOL, []), + ('supports32BitFloatFiltering', BOOL, []), + ('supports32BitMSAA', BOOL, []), + ('supportsQueryTextureLOD', BOOL, []), + ('supportsBCTextureCompression', BOOL, []), + ('supportsPullModelInterpolation', BOOL, []), + ('areBarycentricCoordsSupported', BOOL, []), + ('supportsShaderBarycentricCoordinates', BOOL, []), + ('currentAllocatedSize', NSUInteger, []), + ('maxThreadgroupMemoryLength', NSUInteger, []), + ('maxArgumentBufferSamplerCount', NSUInteger, []), + ('areProgrammableSamplePositionsSupported', BOOL, []), + ('peerGroupID', uint64_t, []), + ('peerIndex', uint32_t, []), + ('peerCount', uint32_t, []), + ('sparseTileSizeInBytes', NSUInteger, []), + ('maxBufferLength', NSUInteger, []), + ('supportsDynamicLibraries', BOOL, []), + ('supportsRenderDynamicLibraries', BOOL, []), + ('supportsRaytracing', BOOL, []), + ('supportsFunctionPointers', BOOL, []), + ('supportsFunctionPointersFromRender', BOOL, []), + ('supportsRaytracingFromRender', BOOL, []), + ('supportsPrimitiveMotionBlur', BOOL, []), + ('shouldMaximizeConcurrentCompilation', BOOL, []), + ('setShouldMaximizeConcurrentCompilation:', None, [BOOL]), + ('maximumConcurrentCompilationTaskCount', NSUInteger, []), +] +enum_MTLIndirectCommandType: dict[int, str] = {(MTLIndirectCommandTypeDraw:=1): 'MTLIndirectCommandTypeDraw', (MTLIndirectCommandTypeDrawIndexed:=2): 'MTLIndirectCommandTypeDrawIndexed', (MTLIndirectCommandTypeDrawPatches:=4): 'MTLIndirectCommandTypeDrawPatches', (MTLIndirectCommandTypeDrawIndexedPatches:=8): 'MTLIndirectCommandTypeDrawIndexedPatches', (MTLIndirectCommandTypeConcurrentDispatch:=32): 'MTLIndirectCommandTypeConcurrentDispatch', (MTLIndirectCommandTypeConcurrentDispatchThreads:=64): 'MTLIndirectCommandTypeConcurrentDispatchThreads', (MTLIndirectCommandTypeDrawMeshThreadgroups:=128): 'MTLIndirectCommandTypeDrawMeshThreadgroups', (MTLIndirectCommandTypeDrawMeshThreads:=256): 'MTLIndirectCommandTypeDrawMeshThreads'} +MTLIndirectCommandType: TypeAlias = NSUInteger +@c.record +class MTLIndirectCommandBufferExecutionRange(c.Struct): + SIZE = 8 + location: int + length: int +MTLIndirectCommandBufferExecutionRange.register_fields([('location', uint32_t, 0), ('length', uint32_t, 4)]) +MTLIndirectCommandBufferDescriptor._bases_ = [NSObject] +MTLIndirectCommandBufferDescriptor._methods_ = [ + ('commandTypes', MTLIndirectCommandType, []), + ('setCommandTypes:', None, [MTLIndirectCommandType]), + ('inheritPipelineState', BOOL, []), + ('setInheritPipelineState:', None, [BOOL]), + ('inheritBuffers', BOOL, []), + ('setInheritBuffers:', None, [BOOL]), + ('maxVertexBufferBindCount', NSUInteger, []), + ('setMaxVertexBufferBindCount:', None, [NSUInteger]), + ('maxFragmentBufferBindCount', NSUInteger, []), + ('setMaxFragmentBufferBindCount:', None, [NSUInteger]), + ('maxKernelBufferBindCount', NSUInteger, []), + ('setMaxKernelBufferBindCount:', None, [NSUInteger]), + ('maxKernelThreadgroupMemoryBindCount', NSUInteger, []), + ('setMaxKernelThreadgroupMemoryBindCount:', None, [NSUInteger]), + ('maxObjectBufferBindCount', NSUInteger, []), + ('setMaxObjectBufferBindCount:', None, [NSUInteger]), + ('maxMeshBufferBindCount', NSUInteger, []), + ('setMaxMeshBufferBindCount:', None, [NSUInteger]), + ('maxObjectThreadgroupMemoryBindCount', NSUInteger, []), + ('setMaxObjectThreadgroupMemoryBindCount:', None, [NSUInteger]), + ('supportRayTracing', BOOL, []), + ('setSupportRayTracing:', None, [BOOL]), + ('supportDynamicAttributeStride', BOOL, []), + ('setSupportDynamicAttributeStride:', None, [BOOL]), +] +class MTLIndirectRenderCommand(objc.Spec): pass +enum_MTLPrimitiveType: dict[int, str] = {(MTLPrimitiveTypePoint:=0): 'MTLPrimitiveTypePoint', (MTLPrimitiveTypeLine:=1): 'MTLPrimitiveTypeLine', (MTLPrimitiveTypeLineStrip:=2): 'MTLPrimitiveTypeLineStrip', (MTLPrimitiveTypeTriangle:=3): 'MTLPrimitiveTypeTriangle', (MTLPrimitiveTypeTriangleStrip:=4): 'MTLPrimitiveTypeTriangleStrip'} +MTLPrimitiveType: TypeAlias = NSUInteger +MTLIndirectRenderCommand._bases_ = [NSObject] +MTLIndirectRenderCommand._methods_ = [ + ('setRenderPipelineState:', None, [MTLRenderPipelineState]), + ('setVertexBuffer:offset:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger]), + ('setFragmentBuffer:offset:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger]), + ('setVertexBuffer:offset:attributeStride:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger, NSUInteger]), + ('drawPatches:patchStart:patchCount:patchIndexBuffer:patchIndexBufferOffset:instanceCount:baseInstance:tessellationFactorBuffer:tessellationFactorBufferOffset:tessellationFactorBufferInstanceStride:', None, [NSUInteger, NSUInteger, NSUInteger, MTLBuffer, NSUInteger, NSUInteger, NSUInteger, MTLBuffer, NSUInteger, NSUInteger]), + ('drawIndexedPatches:patchStart:patchCount:patchIndexBuffer:patchIndexBufferOffset:controlPointIndexBuffer:controlPointIndexBufferOffset:instanceCount:baseInstance:tessellationFactorBuffer:tessellationFactorBufferOffset:tessellationFactorBufferInstanceStride:', None, [NSUInteger, NSUInteger, NSUInteger, MTLBuffer, NSUInteger, MTLBuffer, NSUInteger, NSUInteger, NSUInteger, MTLBuffer, NSUInteger, NSUInteger]), + ('drawPrimitives:vertexStart:vertexCount:instanceCount:baseInstance:', None, [MTLPrimitiveType, NSUInteger, NSUInteger, NSUInteger, NSUInteger]), + ('drawIndexedPrimitives:indexCount:indexType:indexBuffer:indexBufferOffset:instanceCount:baseVertex:baseInstance:', None, [MTLPrimitiveType, NSUInteger, MTLIndexType, MTLBuffer, NSUInteger, NSUInteger, NSInteger, NSUInteger]), + ('setObjectThreadgroupMemoryLength:atIndex:', None, [NSUInteger, NSUInteger]), + ('setObjectBuffer:offset:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger]), + ('setMeshBuffer:offset:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger]), + ('drawMeshThreadgroups:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup:', None, [MTLSize, MTLSize, MTLSize]), + ('drawMeshThreads:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup:', None, [MTLSize, MTLSize, MTLSize]), + ('setBarrier', None, []), + ('clearBarrier', None, []), + ('reset', None, []), +] +class MTLIndirectComputeCommand(objc.Spec): pass +MTLIndirectComputeCommand._bases_ = [NSObject] +MTLIndirectComputeCommand._methods_ = [ + ('setComputePipelineState:', None, [MTLComputePipelineState]), + ('setKernelBuffer:offset:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger]), + ('setKernelBuffer:offset:attributeStride:atIndex:', None, [MTLBuffer, NSUInteger, NSUInteger, NSUInteger]), + ('concurrentDispatchThreadgroups:threadsPerThreadgroup:', None, [MTLSize, MTLSize]), + ('concurrentDispatchThreads:threadsPerThreadgroup:', None, [MTLSize, MTLSize]), + ('setBarrier', None, []), + ('clearBarrier', None, []), + ('setImageblockWidth:height:', None, [NSUInteger, NSUInteger]), + ('reset', None, []), + ('setThreadgroupMemoryLength:atIndex:', None, [NSUInteger, NSUInteger]), + ('setStageInRegion:', None, [MTLRegion]), +] +MTLIndirectCommandBuffer._bases_ = [MTLResource] +MTLIndirectCommandBuffer._methods_ = [ + ('resetWithRange:', None, [NSRange]), + ('indirectRenderCommandAtIndex:', MTLIndirectRenderCommand, [NSUInteger]), + ('indirectComputeCommandAtIndex:', MTLIndirectComputeCommand, [NSUInteger]), + ('size', NSUInteger, []), + ('gpuResourceID', MTLResourceID, []), +] +MTLCommandEncoder._bases_ = [NSObject] +MTLCommandEncoder._methods_ = [ + ('endEncoding', None, []), + ('insertDebugSignpost:', None, [NSString]), + ('pushDebugGroup:', None, [NSString]), + ('popDebugGroup', None, []), + ('device', MTLDevice, []), + ('label', NSString, []), + ('setLabel:', None, [NSString]), +] +MTLResourceCPUCacheModeShift = 0 +MTLResourceCPUCacheModeMask = (0xf << MTLResourceCPUCacheModeShift) +MTLResourceStorageModeShift = 4 +MTLResourceStorageModeMask = (0xf << MTLResourceStorageModeShift) +MTLResourceHazardTrackingModeShift = 8 +MTLResourceHazardTrackingModeMask = (0x3 << MTLResourceHazardTrackingModeShift) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/mlx5.py b/artifacts/package_runtime/tinygrad/runtime/autogen/mlx5.py new file mode 100644 index 000000000..1d88f1d48 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/mlx5.py @@ -0,0 +1,10524 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +__u8: TypeAlias = ctypes.c_ubyte +@c.record +class struct_mlx5_cmd_layout(c.Struct): + SIZE = 64 + type: int + rsvd0: c.Array[ctypes.c_ubyte, Literal[3]] + inlen: int + in_ptr: int + _in: c.Array[ctypes.c_uint32, Literal[4]] + out: c.Array[ctypes.c_uint32, Literal[4]] + out_ptr: int + outlen: int + token: int + sig: int + rsvd1: int + status_own: int +struct_mlx5_cmd_layout.register_fields([('type', ctypes.c_ubyte, 0), ('rsvd0', c.Array[ctypes.c_ubyte, Literal[3]], 1), ('inlen', ctypes.c_uint32, 4), ('in_ptr', ctypes.c_uint64, 8), ('_in', c.Array[ctypes.c_uint32, Literal[4]], 16), ('out', c.Array[ctypes.c_uint32, Literal[4]], 32), ('out_ptr', ctypes.c_uint64, 48), ('outlen', ctypes.c_uint32, 56), ('token', ctypes.c_ubyte, 60), ('sig', ctypes.c_ubyte, 61), ('rsvd1', ctypes.c_ubyte, 62), ('status_own', ctypes.c_ubyte, 63)]) +@c.record +class struct_mlx5_cmd_prot_block(c.Struct): + SIZE = 576 + data: c.Array[ctypes.c_ubyte, Literal[512]] + rsvd0: c.Array[ctypes.c_ubyte, Literal[48]] + next: int + block_num: int + rsvd1: int + token: int + ctrl_sig: int + sig: int +struct_mlx5_cmd_prot_block.register_fields([('data', c.Array[ctypes.c_ubyte, Literal[512]], 0), ('rsvd0', c.Array[ctypes.c_ubyte, Literal[48]], 512), ('next', ctypes.c_uint64, 560), ('block_num', ctypes.c_uint32, 568), ('rsvd1', ctypes.c_ubyte, 572), ('token', ctypes.c_ubyte, 573), ('ctrl_sig', ctypes.c_ubyte, 574), ('sig', ctypes.c_ubyte, 575)]) +@c.record +class struct_mlx5_init_seg(c.Struct): + SIZE = 512 + fw_rev: int + cmdif_rev_fw_sub: int + rsvd0: c.Array[ctypes.c_uint32, Literal[2]] + cmdq_addr_h: int + cmdq_addr_l_sz: int + cmd_dbell: int + rsvd1: c.Array[ctypes.c_uint32, Literal[120]] + initializing: int +struct_mlx5_init_seg.register_fields([('fw_rev', ctypes.c_uint32, 0), ('cmdif_rev_fw_sub', ctypes.c_uint32, 4), ('rsvd0', c.Array[ctypes.c_uint32, Literal[2]], 8), ('cmdq_addr_h', ctypes.c_uint32, 16), ('cmdq_addr_l_sz', ctypes.c_uint32, 20), ('cmd_dbell', ctypes.c_uint32, 24), ('rsvd1', c.Array[ctypes.c_uint32, Literal[120]], 28), ('initializing', ctypes.c_uint32, 508)]) +_anonenum0: dict[int, str] = {(MLX5_EVENT_TYPE_CODING_COMPLETION_EVENTS:=0): 'MLX5_EVENT_TYPE_CODING_COMPLETION_EVENTS', (MLX5_EVENT_TYPE_CODING_PATH_MIGRATED_SUCCEEDED:=1): 'MLX5_EVENT_TYPE_CODING_PATH_MIGRATED_SUCCEEDED', (MLX5_EVENT_TYPE_CODING_COMMUNICATION_ESTABLISHED:=2): 'MLX5_EVENT_TYPE_CODING_COMMUNICATION_ESTABLISHED', (MLX5_EVENT_TYPE_CODING_SEND_QUEUE_DRAINED:=3): 'MLX5_EVENT_TYPE_CODING_SEND_QUEUE_DRAINED', (MLX5_EVENT_TYPE_CODING_LAST_WQE_REACHED:=19): 'MLX5_EVENT_TYPE_CODING_LAST_WQE_REACHED', (MLX5_EVENT_TYPE_CODING_SRQ_LIMIT:=20): 'MLX5_EVENT_TYPE_CODING_SRQ_LIMIT', (MLX5_EVENT_TYPE_CODING_DCT_ALL_CONNECTIONS_CLOSED:=28): 'MLX5_EVENT_TYPE_CODING_DCT_ALL_CONNECTIONS_CLOSED', (MLX5_EVENT_TYPE_CODING_DCT_ACCESS_KEY_VIOLATION:=29): 'MLX5_EVENT_TYPE_CODING_DCT_ACCESS_KEY_VIOLATION', (MLX5_EVENT_TYPE_CODING_CQ_ERROR:=4): 'MLX5_EVENT_TYPE_CODING_CQ_ERROR', (MLX5_EVENT_TYPE_CODING_LOCAL_WQ_CATASTROPHIC_ERROR:=5): 'MLX5_EVENT_TYPE_CODING_LOCAL_WQ_CATASTROPHIC_ERROR', (MLX5_EVENT_TYPE_CODING_PATH_MIGRATION_FAILED:=7): 'MLX5_EVENT_TYPE_CODING_PATH_MIGRATION_FAILED', (MLX5_EVENT_TYPE_CODING_PAGE_FAULT_EVENT:=12): 'MLX5_EVENT_TYPE_CODING_PAGE_FAULT_EVENT', (MLX5_EVENT_TYPE_CODING_INVALID_REQUEST_LOCAL_WQ_ERROR:=16): 'MLX5_EVENT_TYPE_CODING_INVALID_REQUEST_LOCAL_WQ_ERROR', (MLX5_EVENT_TYPE_CODING_LOCAL_ACCESS_VIOLATION_WQ_ERROR:=17): 'MLX5_EVENT_TYPE_CODING_LOCAL_ACCESS_VIOLATION_WQ_ERROR', (MLX5_EVENT_TYPE_CODING_LOCAL_SRQ_CATASTROPHIC_ERROR:=18): 'MLX5_EVENT_TYPE_CODING_LOCAL_SRQ_CATASTROPHIC_ERROR', (MLX5_EVENT_TYPE_CODING_INTERNAL_ERROR:=8): 'MLX5_EVENT_TYPE_CODING_INTERNAL_ERROR', (MLX5_EVENT_TYPE_CODING_PORT_STATE_CHANGE:=9): 'MLX5_EVENT_TYPE_CODING_PORT_STATE_CHANGE', (MLX5_EVENT_TYPE_CODING_GPIO_EVENT:=21): 'MLX5_EVENT_TYPE_CODING_GPIO_EVENT', (MLX5_EVENT_TYPE_CODING_REMOTE_CONFIGURATION_PROTOCOL_EVENT:=25): 'MLX5_EVENT_TYPE_CODING_REMOTE_CONFIGURATION_PROTOCOL_EVENT', (MLX5_EVENT_TYPE_CODING_DOORBELL_BLUEFLAME_CONGESTION_EVENT:=26): 'MLX5_EVENT_TYPE_CODING_DOORBELL_BLUEFLAME_CONGESTION_EVENT', (MLX5_EVENT_TYPE_CODING_STALL_VL_EVENT:=27): 'MLX5_EVENT_TYPE_CODING_STALL_VL_EVENT', (MLX5_EVENT_TYPE_CODING_DROPPED_PACKET_LOGGED_EVENT:=31): 'MLX5_EVENT_TYPE_CODING_DROPPED_PACKET_LOGGED_EVENT', (MLX5_EVENT_TYPE_CODING_COMMAND_INTERFACE_COMPLETION:=10): 'MLX5_EVENT_TYPE_CODING_COMMAND_INTERFACE_COMPLETION', (MLX5_EVENT_TYPE_CODING_PAGE_REQUEST:=11): 'MLX5_EVENT_TYPE_CODING_PAGE_REQUEST', (MLX5_EVENT_TYPE_CODING_FPGA_ERROR:=32): 'MLX5_EVENT_TYPE_CODING_FPGA_ERROR', (MLX5_EVENT_TYPE_CODING_FPGA_QP_ERROR:=33): 'MLX5_EVENT_TYPE_CODING_FPGA_QP_ERROR'} +_anonenum1: dict[int, str] = {(MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE:=0): 'MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE', (MLX5_SET_HCA_CAP_OP_MOD_ETHERNET_OFFLOADS:=1): 'MLX5_SET_HCA_CAP_OP_MOD_ETHERNET_OFFLOADS', (MLX5_SET_HCA_CAP_OP_MOD_ODP:=2): 'MLX5_SET_HCA_CAP_OP_MOD_ODP', (MLX5_SET_HCA_CAP_OP_MOD_ATOMIC:=3): 'MLX5_SET_HCA_CAP_OP_MOD_ATOMIC', (MLX5_SET_HCA_CAP_OP_MOD_ROCE:=4): 'MLX5_SET_HCA_CAP_OP_MOD_ROCE', (MLX5_SET_HCA_CAP_OP_MOD_IPSEC:=21): 'MLX5_SET_HCA_CAP_OP_MOD_IPSEC', (MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE2:=32): 'MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE2', (MLX5_SET_HCA_CAP_OP_MOD_PORT_SELECTION:=37): 'MLX5_SET_HCA_CAP_OP_MOD_PORT_SELECTION'} +_anonenum2: dict[int, str] = {(MLX5_SHARED_RESOURCE_UID:=65535): 'MLX5_SHARED_RESOURCE_UID'} +_anonenum3: dict[int, str] = {(MLX5_OBJ_TYPE_SW_ICM:=8): 'MLX5_OBJ_TYPE_SW_ICM', (MLX5_OBJ_TYPE_GENEVE_TLV_OPT:=11): 'MLX5_OBJ_TYPE_GENEVE_TLV_OPT', (MLX5_OBJ_TYPE_VIRTIO_NET_Q:=13): 'MLX5_OBJ_TYPE_VIRTIO_NET_Q', (MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS:=28): 'MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS', (MLX5_OBJ_TYPE_MATCH_DEFINER:=24): 'MLX5_OBJ_TYPE_MATCH_DEFINER', (MLX5_OBJ_TYPE_HEADER_MODIFY_ARGUMENT:=35): 'MLX5_OBJ_TYPE_HEADER_MODIFY_ARGUMENT', (MLX5_OBJ_TYPE_STC:=64): 'MLX5_OBJ_TYPE_STC', (MLX5_OBJ_TYPE_RTC:=65): 'MLX5_OBJ_TYPE_RTC', (MLX5_OBJ_TYPE_STE:=66): 'MLX5_OBJ_TYPE_STE', (MLX5_OBJ_TYPE_MODIFY_HDR_PATTERN:=67): 'MLX5_OBJ_TYPE_MODIFY_HDR_PATTERN', (MLX5_OBJ_TYPE_PAGE_TRACK:=70): 'MLX5_OBJ_TYPE_PAGE_TRACK', (MLX5_OBJ_TYPE_MKEY:=65281): 'MLX5_OBJ_TYPE_MKEY', (MLX5_OBJ_TYPE_QP:=65282): 'MLX5_OBJ_TYPE_QP', (MLX5_OBJ_TYPE_PSV:=65283): 'MLX5_OBJ_TYPE_PSV', (MLX5_OBJ_TYPE_RMP:=65284): 'MLX5_OBJ_TYPE_RMP', (MLX5_OBJ_TYPE_XRC_SRQ:=65285): 'MLX5_OBJ_TYPE_XRC_SRQ', (MLX5_OBJ_TYPE_RQ:=65286): 'MLX5_OBJ_TYPE_RQ', (MLX5_OBJ_TYPE_SQ:=65287): 'MLX5_OBJ_TYPE_SQ', (MLX5_OBJ_TYPE_TIR:=65288): 'MLX5_OBJ_TYPE_TIR', (MLX5_OBJ_TYPE_TIS:=65289): 'MLX5_OBJ_TYPE_TIS', (MLX5_OBJ_TYPE_DCT:=65290): 'MLX5_OBJ_TYPE_DCT', (MLX5_OBJ_TYPE_XRQ:=65291): 'MLX5_OBJ_TYPE_XRQ', (MLX5_OBJ_TYPE_RQT:=65294): 'MLX5_OBJ_TYPE_RQT', (MLX5_OBJ_TYPE_FLOW_COUNTER:=65295): 'MLX5_OBJ_TYPE_FLOW_COUNTER', (MLX5_OBJ_TYPE_CQ:=65296): 'MLX5_OBJ_TYPE_CQ', (MLX5_OBJ_TYPE_FT_ALIAS:=65301): 'MLX5_OBJ_TYPE_FT_ALIAS'} +_anonenum4: dict[int, str] = {(MLX5_GENERAL_OBJ_TYPES_CAP_SW_ICM:=256): 'MLX5_GENERAL_OBJ_TYPES_CAP_SW_ICM', (MLX5_GENERAL_OBJ_TYPES_CAP_GENEVE_TLV_OPT:=2048): 'MLX5_GENERAL_OBJ_TYPES_CAP_GENEVE_TLV_OPT', (MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_NET_Q:=8192): 'MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_NET_Q', (MLX5_GENERAL_OBJ_TYPES_CAP_HEADER_MODIFY_ARGUMENT:=34359738368): 'MLX5_GENERAL_OBJ_TYPES_CAP_HEADER_MODIFY_ARGUMENT', (MLX5_GENERAL_OBJ_TYPES_CAP_MACSEC_OFFLOAD:=549755813888): 'MLX5_GENERAL_OBJ_TYPES_CAP_MACSEC_OFFLOAD'} +_anonenum5: dict[int, str] = {(MLX5_CMD_OP_QUERY_HCA_CAP:=256): 'MLX5_CMD_OP_QUERY_HCA_CAP', (MLX5_CMD_OP_QUERY_ADAPTER:=257): 'MLX5_CMD_OP_QUERY_ADAPTER', (MLX5_CMD_OP_INIT_HCA:=258): 'MLX5_CMD_OP_INIT_HCA', (MLX5_CMD_OP_TEARDOWN_HCA:=259): 'MLX5_CMD_OP_TEARDOWN_HCA', (MLX5_CMD_OP_ENABLE_HCA:=260): 'MLX5_CMD_OP_ENABLE_HCA', (MLX5_CMD_OP_DISABLE_HCA:=261): 'MLX5_CMD_OP_DISABLE_HCA', (MLX5_CMD_OP_QUERY_PAGES:=263): 'MLX5_CMD_OP_QUERY_PAGES', (MLX5_CMD_OP_MANAGE_PAGES:=264): 'MLX5_CMD_OP_MANAGE_PAGES', (MLX5_CMD_OP_SET_HCA_CAP:=265): 'MLX5_CMD_OP_SET_HCA_CAP', (MLX5_CMD_OP_QUERY_ISSI:=266): 'MLX5_CMD_OP_QUERY_ISSI', (MLX5_CMD_OP_SET_ISSI:=267): 'MLX5_CMD_OP_SET_ISSI', (MLX5_CMD_OP_SET_DRIVER_VERSION:=269): 'MLX5_CMD_OP_SET_DRIVER_VERSION', (MLX5_CMD_OP_QUERY_SF_PARTITION:=273): 'MLX5_CMD_OP_QUERY_SF_PARTITION', (MLX5_CMD_OP_ALLOC_SF:=275): 'MLX5_CMD_OP_ALLOC_SF', (MLX5_CMD_OP_DEALLOC_SF:=276): 'MLX5_CMD_OP_DEALLOC_SF', (MLX5_CMD_OP_SUSPEND_VHCA:=277): 'MLX5_CMD_OP_SUSPEND_VHCA', (MLX5_CMD_OP_RESUME_VHCA:=278): 'MLX5_CMD_OP_RESUME_VHCA', (MLX5_CMD_OP_QUERY_VHCA_MIGRATION_STATE:=279): 'MLX5_CMD_OP_QUERY_VHCA_MIGRATION_STATE', (MLX5_CMD_OP_SAVE_VHCA_STATE:=280): 'MLX5_CMD_OP_SAVE_VHCA_STATE', (MLX5_CMD_OP_LOAD_VHCA_STATE:=281): 'MLX5_CMD_OP_LOAD_VHCA_STATE', (MLX5_CMD_OP_CREATE_MKEY:=512): 'MLX5_CMD_OP_CREATE_MKEY', (MLX5_CMD_OP_QUERY_MKEY:=513): 'MLX5_CMD_OP_QUERY_MKEY', (MLX5_CMD_OP_DESTROY_MKEY:=514): 'MLX5_CMD_OP_DESTROY_MKEY', (MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS:=515): 'MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS', (MLX5_CMD_OP_PAGE_FAULT_RESUME:=516): 'MLX5_CMD_OP_PAGE_FAULT_RESUME', (MLX5_CMD_OP_ALLOC_MEMIC:=517): 'MLX5_CMD_OP_ALLOC_MEMIC', (MLX5_CMD_OP_DEALLOC_MEMIC:=518): 'MLX5_CMD_OP_DEALLOC_MEMIC', (MLX5_CMD_OP_MODIFY_MEMIC:=519): 'MLX5_CMD_OP_MODIFY_MEMIC', (MLX5_CMD_OP_CREATE_EQ:=769): 'MLX5_CMD_OP_CREATE_EQ', (MLX5_CMD_OP_DESTROY_EQ:=770): 'MLX5_CMD_OP_DESTROY_EQ', (MLX5_CMD_OP_QUERY_EQ:=771): 'MLX5_CMD_OP_QUERY_EQ', (MLX5_CMD_OP_GEN_EQE:=772): 'MLX5_CMD_OP_GEN_EQE', (MLX5_CMD_OP_CREATE_CQ:=1024): 'MLX5_CMD_OP_CREATE_CQ', (MLX5_CMD_OP_DESTROY_CQ:=1025): 'MLX5_CMD_OP_DESTROY_CQ', (MLX5_CMD_OP_QUERY_CQ:=1026): 'MLX5_CMD_OP_QUERY_CQ', (MLX5_CMD_OP_MODIFY_CQ:=1027): 'MLX5_CMD_OP_MODIFY_CQ', (MLX5_CMD_OP_CREATE_QP:=1280): 'MLX5_CMD_OP_CREATE_QP', (MLX5_CMD_OP_DESTROY_QP:=1281): 'MLX5_CMD_OP_DESTROY_QP', (MLX5_CMD_OP_RST2INIT_QP:=1282): 'MLX5_CMD_OP_RST2INIT_QP', (MLX5_CMD_OP_INIT2RTR_QP:=1283): 'MLX5_CMD_OP_INIT2RTR_QP', (MLX5_CMD_OP_RTR2RTS_QP:=1284): 'MLX5_CMD_OP_RTR2RTS_QP', (MLX5_CMD_OP_RTS2RTS_QP:=1285): 'MLX5_CMD_OP_RTS2RTS_QP', (MLX5_CMD_OP_SQERR2RTS_QP:=1286): 'MLX5_CMD_OP_SQERR2RTS_QP', (MLX5_CMD_OP_2ERR_QP:=1287): 'MLX5_CMD_OP_2ERR_QP', (MLX5_CMD_OP_2RST_QP:=1290): 'MLX5_CMD_OP_2RST_QP', (MLX5_CMD_OP_QUERY_QP:=1291): 'MLX5_CMD_OP_QUERY_QP', (MLX5_CMD_OP_SQD_RTS_QP:=1292): 'MLX5_CMD_OP_SQD_RTS_QP', (MLX5_CMD_OP_INIT2INIT_QP:=1294): 'MLX5_CMD_OP_INIT2INIT_QP', (MLX5_CMD_OP_CREATE_PSV:=1536): 'MLX5_CMD_OP_CREATE_PSV', (MLX5_CMD_OP_DESTROY_PSV:=1537): 'MLX5_CMD_OP_DESTROY_PSV', (MLX5_CMD_OP_CREATE_SRQ:=1792): 'MLX5_CMD_OP_CREATE_SRQ', (MLX5_CMD_OP_DESTROY_SRQ:=1793): 'MLX5_CMD_OP_DESTROY_SRQ', (MLX5_CMD_OP_QUERY_SRQ:=1794): 'MLX5_CMD_OP_QUERY_SRQ', (MLX5_CMD_OP_ARM_RQ:=1795): 'MLX5_CMD_OP_ARM_RQ', (MLX5_CMD_OP_CREATE_XRC_SRQ:=1797): 'MLX5_CMD_OP_CREATE_XRC_SRQ', (MLX5_CMD_OP_DESTROY_XRC_SRQ:=1798): 'MLX5_CMD_OP_DESTROY_XRC_SRQ', (MLX5_CMD_OP_QUERY_XRC_SRQ:=1799): 'MLX5_CMD_OP_QUERY_XRC_SRQ', (MLX5_CMD_OP_ARM_XRC_SRQ:=1800): 'MLX5_CMD_OP_ARM_XRC_SRQ', (MLX5_CMD_OP_CREATE_DCT:=1808): 'MLX5_CMD_OP_CREATE_DCT', (MLX5_CMD_OP_DESTROY_DCT:=1809): 'MLX5_CMD_OP_DESTROY_DCT', (MLX5_CMD_OP_DRAIN_DCT:=1810): 'MLX5_CMD_OP_DRAIN_DCT', (MLX5_CMD_OP_QUERY_DCT:=1811): 'MLX5_CMD_OP_QUERY_DCT', (MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION:=1812): 'MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION', (MLX5_CMD_OP_CREATE_XRQ:=1815): 'MLX5_CMD_OP_CREATE_XRQ', (MLX5_CMD_OP_DESTROY_XRQ:=1816): 'MLX5_CMD_OP_DESTROY_XRQ', (MLX5_CMD_OP_QUERY_XRQ:=1817): 'MLX5_CMD_OP_QUERY_XRQ', (MLX5_CMD_OP_ARM_XRQ:=1818): 'MLX5_CMD_OP_ARM_XRQ', (MLX5_CMD_OP_QUERY_XRQ_DC_PARAMS_ENTRY:=1829): 'MLX5_CMD_OP_QUERY_XRQ_DC_PARAMS_ENTRY', (MLX5_CMD_OP_SET_XRQ_DC_PARAMS_ENTRY:=1830): 'MLX5_CMD_OP_SET_XRQ_DC_PARAMS_ENTRY', (MLX5_CMD_OP_QUERY_XRQ_ERROR_PARAMS:=1831): 'MLX5_CMD_OP_QUERY_XRQ_ERROR_PARAMS', (MLX5_CMD_OP_RELEASE_XRQ_ERROR:=1833): 'MLX5_CMD_OP_RELEASE_XRQ_ERROR', (MLX5_CMD_OP_MODIFY_XRQ:=1834): 'MLX5_CMD_OP_MODIFY_XRQ', (MLX5_CMD_OPCODE_QUERY_DELEGATED_VHCA:=1842): 'MLX5_CMD_OPCODE_QUERY_DELEGATED_VHCA', (MLX5_CMD_OPCODE_CREATE_ESW_VPORT:=1843): 'MLX5_CMD_OPCODE_CREATE_ESW_VPORT', (MLX5_CMD_OPCODE_DESTROY_ESW_VPORT:=1844): 'MLX5_CMD_OPCODE_DESTROY_ESW_VPORT', (MLX5_CMD_OP_QUERY_ESW_FUNCTIONS:=1856): 'MLX5_CMD_OP_QUERY_ESW_FUNCTIONS', (MLX5_CMD_OP_QUERY_VPORT_STATE:=1872): 'MLX5_CMD_OP_QUERY_VPORT_STATE', (MLX5_CMD_OP_MODIFY_VPORT_STATE:=1873): 'MLX5_CMD_OP_MODIFY_VPORT_STATE', (MLX5_CMD_OP_QUERY_ESW_VPORT_CONTEXT:=1874): 'MLX5_CMD_OP_QUERY_ESW_VPORT_CONTEXT', (MLX5_CMD_OP_MODIFY_ESW_VPORT_CONTEXT:=1875): 'MLX5_CMD_OP_MODIFY_ESW_VPORT_CONTEXT', (MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT:=1876): 'MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT', (MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT:=1877): 'MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT', (MLX5_CMD_OP_QUERY_ROCE_ADDRESS:=1888): 'MLX5_CMD_OP_QUERY_ROCE_ADDRESS', (MLX5_CMD_OP_SET_ROCE_ADDRESS:=1889): 'MLX5_CMD_OP_SET_ROCE_ADDRESS', (MLX5_CMD_OP_QUERY_HCA_VPORT_CONTEXT:=1890): 'MLX5_CMD_OP_QUERY_HCA_VPORT_CONTEXT', (MLX5_CMD_OP_MODIFY_HCA_VPORT_CONTEXT:=1891): 'MLX5_CMD_OP_MODIFY_HCA_VPORT_CONTEXT', (MLX5_CMD_OP_QUERY_HCA_VPORT_GID:=1892): 'MLX5_CMD_OP_QUERY_HCA_VPORT_GID', (MLX5_CMD_OP_QUERY_HCA_VPORT_PKEY:=1893): 'MLX5_CMD_OP_QUERY_HCA_VPORT_PKEY', (MLX5_CMD_OP_QUERY_VNIC_ENV:=1903): 'MLX5_CMD_OP_QUERY_VNIC_ENV', (MLX5_CMD_OP_QUERY_VPORT_COUNTER:=1904): 'MLX5_CMD_OP_QUERY_VPORT_COUNTER', (MLX5_CMD_OP_ALLOC_Q_COUNTER:=1905): 'MLX5_CMD_OP_ALLOC_Q_COUNTER', (MLX5_CMD_OP_DEALLOC_Q_COUNTER:=1906): 'MLX5_CMD_OP_DEALLOC_Q_COUNTER', (MLX5_CMD_OP_QUERY_Q_COUNTER:=1907): 'MLX5_CMD_OP_QUERY_Q_COUNTER', (MLX5_CMD_OP_SET_MONITOR_COUNTER:=1908): 'MLX5_CMD_OP_SET_MONITOR_COUNTER', (MLX5_CMD_OP_ARM_MONITOR_COUNTER:=1909): 'MLX5_CMD_OP_ARM_MONITOR_COUNTER', (MLX5_CMD_OP_SET_PP_RATE_LIMIT:=1920): 'MLX5_CMD_OP_SET_PP_RATE_LIMIT', (MLX5_CMD_OP_QUERY_RATE_LIMIT:=1921): 'MLX5_CMD_OP_QUERY_RATE_LIMIT', (MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT:=1922): 'MLX5_CMD_OP_CREATE_SCHEDULING_ELEMENT', (MLX5_CMD_OP_DESTROY_SCHEDULING_ELEMENT:=1923): 'MLX5_CMD_OP_DESTROY_SCHEDULING_ELEMENT', (MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT:=1924): 'MLX5_CMD_OP_QUERY_SCHEDULING_ELEMENT', (MLX5_CMD_OP_MODIFY_SCHEDULING_ELEMENT:=1925): 'MLX5_CMD_OP_MODIFY_SCHEDULING_ELEMENT', (MLX5_CMD_OP_CREATE_QOS_PARA_VPORT:=1926): 'MLX5_CMD_OP_CREATE_QOS_PARA_VPORT', (MLX5_CMD_OP_DESTROY_QOS_PARA_VPORT:=1927): 'MLX5_CMD_OP_DESTROY_QOS_PARA_VPORT', (MLX5_CMD_OP_ALLOC_PD:=2048): 'MLX5_CMD_OP_ALLOC_PD', (MLX5_CMD_OP_DEALLOC_PD:=2049): 'MLX5_CMD_OP_DEALLOC_PD', (MLX5_CMD_OP_ALLOC_UAR:=2050): 'MLX5_CMD_OP_ALLOC_UAR', (MLX5_CMD_OP_DEALLOC_UAR:=2051): 'MLX5_CMD_OP_DEALLOC_UAR', (MLX5_CMD_OP_CONFIG_INT_MODERATION:=2052): 'MLX5_CMD_OP_CONFIG_INT_MODERATION', (MLX5_CMD_OP_ACCESS_REG:=2053): 'MLX5_CMD_OP_ACCESS_REG', (MLX5_CMD_OP_ATTACH_TO_MCG:=2054): 'MLX5_CMD_OP_ATTACH_TO_MCG', (MLX5_CMD_OP_DETACH_FROM_MCG:=2055): 'MLX5_CMD_OP_DETACH_FROM_MCG', (MLX5_CMD_OP_GET_DROPPED_PACKET_LOG:=2058): 'MLX5_CMD_OP_GET_DROPPED_PACKET_LOG', (MLX5_CMD_OP_MAD_IFC:=1293): 'MLX5_CMD_OP_MAD_IFC', (MLX5_CMD_OP_QUERY_MAD_DEMUX:=2059): 'MLX5_CMD_OP_QUERY_MAD_DEMUX', (MLX5_CMD_OP_SET_MAD_DEMUX:=2060): 'MLX5_CMD_OP_SET_MAD_DEMUX', (MLX5_CMD_OP_NOP:=2061): 'MLX5_CMD_OP_NOP', (MLX5_CMD_OP_ALLOC_XRCD:=2062): 'MLX5_CMD_OP_ALLOC_XRCD', (MLX5_CMD_OP_DEALLOC_XRCD:=2063): 'MLX5_CMD_OP_DEALLOC_XRCD', (MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN:=2070): 'MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN', (MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN:=2071): 'MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN', (MLX5_CMD_OP_QUERY_CONG_STATUS:=2082): 'MLX5_CMD_OP_QUERY_CONG_STATUS', (MLX5_CMD_OP_MODIFY_CONG_STATUS:=2083): 'MLX5_CMD_OP_MODIFY_CONG_STATUS', (MLX5_CMD_OP_QUERY_CONG_PARAMS:=2084): 'MLX5_CMD_OP_QUERY_CONG_PARAMS', (MLX5_CMD_OP_MODIFY_CONG_PARAMS:=2085): 'MLX5_CMD_OP_MODIFY_CONG_PARAMS', (MLX5_CMD_OP_QUERY_CONG_STATISTICS:=2086): 'MLX5_CMD_OP_QUERY_CONG_STATISTICS', (MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT:=2087): 'MLX5_CMD_OP_ADD_VXLAN_UDP_DPORT', (MLX5_CMD_OP_DELETE_VXLAN_UDP_DPORT:=2088): 'MLX5_CMD_OP_DELETE_VXLAN_UDP_DPORT', (MLX5_CMD_OP_SET_L2_TABLE_ENTRY:=2089): 'MLX5_CMD_OP_SET_L2_TABLE_ENTRY', (MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY:=2090): 'MLX5_CMD_OP_QUERY_L2_TABLE_ENTRY', (MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY:=2091): 'MLX5_CMD_OP_DELETE_L2_TABLE_ENTRY', (MLX5_CMD_OP_SET_WOL_ROL:=2096): 'MLX5_CMD_OP_SET_WOL_ROL', (MLX5_CMD_OP_QUERY_WOL_ROL:=2097): 'MLX5_CMD_OP_QUERY_WOL_ROL', (MLX5_CMD_OP_CREATE_LAG:=2112): 'MLX5_CMD_OP_CREATE_LAG', (MLX5_CMD_OP_MODIFY_LAG:=2113): 'MLX5_CMD_OP_MODIFY_LAG', (MLX5_CMD_OP_QUERY_LAG:=2114): 'MLX5_CMD_OP_QUERY_LAG', (MLX5_CMD_OP_DESTROY_LAG:=2115): 'MLX5_CMD_OP_DESTROY_LAG', (MLX5_CMD_OP_CREATE_VPORT_LAG:=2116): 'MLX5_CMD_OP_CREATE_VPORT_LAG', (MLX5_CMD_OP_DESTROY_VPORT_LAG:=2117): 'MLX5_CMD_OP_DESTROY_VPORT_LAG', (MLX5_CMD_OP_CREATE_TIR:=2304): 'MLX5_CMD_OP_CREATE_TIR', (MLX5_CMD_OP_MODIFY_TIR:=2305): 'MLX5_CMD_OP_MODIFY_TIR', (MLX5_CMD_OP_DESTROY_TIR:=2306): 'MLX5_CMD_OP_DESTROY_TIR', (MLX5_CMD_OP_QUERY_TIR:=2307): 'MLX5_CMD_OP_QUERY_TIR', (MLX5_CMD_OP_CREATE_SQ:=2308): 'MLX5_CMD_OP_CREATE_SQ', (MLX5_CMD_OP_MODIFY_SQ:=2309): 'MLX5_CMD_OP_MODIFY_SQ', (MLX5_CMD_OP_DESTROY_SQ:=2310): 'MLX5_CMD_OP_DESTROY_SQ', (MLX5_CMD_OP_QUERY_SQ:=2311): 'MLX5_CMD_OP_QUERY_SQ', (MLX5_CMD_OP_CREATE_RQ:=2312): 'MLX5_CMD_OP_CREATE_RQ', (MLX5_CMD_OP_MODIFY_RQ:=2313): 'MLX5_CMD_OP_MODIFY_RQ', (MLX5_CMD_OP_SET_DELAY_DROP_PARAMS:=2320): 'MLX5_CMD_OP_SET_DELAY_DROP_PARAMS', (MLX5_CMD_OP_DESTROY_RQ:=2314): 'MLX5_CMD_OP_DESTROY_RQ', (MLX5_CMD_OP_QUERY_RQ:=2315): 'MLX5_CMD_OP_QUERY_RQ', (MLX5_CMD_OP_CREATE_RMP:=2316): 'MLX5_CMD_OP_CREATE_RMP', (MLX5_CMD_OP_MODIFY_RMP:=2317): 'MLX5_CMD_OP_MODIFY_RMP', (MLX5_CMD_OP_DESTROY_RMP:=2318): 'MLX5_CMD_OP_DESTROY_RMP', (MLX5_CMD_OP_QUERY_RMP:=2319): 'MLX5_CMD_OP_QUERY_RMP', (MLX5_CMD_OP_CREATE_TIS:=2322): 'MLX5_CMD_OP_CREATE_TIS', (MLX5_CMD_OP_MODIFY_TIS:=2323): 'MLX5_CMD_OP_MODIFY_TIS', (MLX5_CMD_OP_DESTROY_TIS:=2324): 'MLX5_CMD_OP_DESTROY_TIS', (MLX5_CMD_OP_QUERY_TIS:=2325): 'MLX5_CMD_OP_QUERY_TIS', (MLX5_CMD_OP_CREATE_RQT:=2326): 'MLX5_CMD_OP_CREATE_RQT', (MLX5_CMD_OP_MODIFY_RQT:=2327): 'MLX5_CMD_OP_MODIFY_RQT', (MLX5_CMD_OP_DESTROY_RQT:=2328): 'MLX5_CMD_OP_DESTROY_RQT', (MLX5_CMD_OP_QUERY_RQT:=2329): 'MLX5_CMD_OP_QUERY_RQT', (MLX5_CMD_OP_SET_FLOW_TABLE_ROOT:=2351): 'MLX5_CMD_OP_SET_FLOW_TABLE_ROOT', (MLX5_CMD_OP_CREATE_FLOW_TABLE:=2352): 'MLX5_CMD_OP_CREATE_FLOW_TABLE', (MLX5_CMD_OP_DESTROY_FLOW_TABLE:=2353): 'MLX5_CMD_OP_DESTROY_FLOW_TABLE', (MLX5_CMD_OP_QUERY_FLOW_TABLE:=2354): 'MLX5_CMD_OP_QUERY_FLOW_TABLE', (MLX5_CMD_OP_CREATE_FLOW_GROUP:=2355): 'MLX5_CMD_OP_CREATE_FLOW_GROUP', (MLX5_CMD_OP_DESTROY_FLOW_GROUP:=2356): 'MLX5_CMD_OP_DESTROY_FLOW_GROUP', (MLX5_CMD_OP_QUERY_FLOW_GROUP:=2357): 'MLX5_CMD_OP_QUERY_FLOW_GROUP', (MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY:=2358): 'MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY', (MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY:=2359): 'MLX5_CMD_OP_QUERY_FLOW_TABLE_ENTRY', (MLX5_CMD_OP_DELETE_FLOW_TABLE_ENTRY:=2360): 'MLX5_CMD_OP_DELETE_FLOW_TABLE_ENTRY', (MLX5_CMD_OP_ALLOC_FLOW_COUNTER:=2361): 'MLX5_CMD_OP_ALLOC_FLOW_COUNTER', (MLX5_CMD_OP_DEALLOC_FLOW_COUNTER:=2362): 'MLX5_CMD_OP_DEALLOC_FLOW_COUNTER', (MLX5_CMD_OP_QUERY_FLOW_COUNTER:=2363): 'MLX5_CMD_OP_QUERY_FLOW_COUNTER', (MLX5_CMD_OP_MODIFY_FLOW_TABLE:=2364): 'MLX5_CMD_OP_MODIFY_FLOW_TABLE', (MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT:=2365): 'MLX5_CMD_OP_ALLOC_PACKET_REFORMAT_CONTEXT', (MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT:=2366): 'MLX5_CMD_OP_DEALLOC_PACKET_REFORMAT_CONTEXT', (MLX5_CMD_OP_QUERY_PACKET_REFORMAT_CONTEXT:=2367): 'MLX5_CMD_OP_QUERY_PACKET_REFORMAT_CONTEXT', (MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT:=2368): 'MLX5_CMD_OP_ALLOC_MODIFY_HEADER_CONTEXT', (MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT:=2369): 'MLX5_CMD_OP_DEALLOC_MODIFY_HEADER_CONTEXT', (MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT:=2370): 'MLX5_CMD_OP_QUERY_MODIFY_HEADER_CONTEXT', (MLX5_CMD_OP_FPGA_CREATE_QP:=2400): 'MLX5_CMD_OP_FPGA_CREATE_QP', (MLX5_CMD_OP_FPGA_MODIFY_QP:=2401): 'MLX5_CMD_OP_FPGA_MODIFY_QP', (MLX5_CMD_OP_FPGA_QUERY_QP:=2402): 'MLX5_CMD_OP_FPGA_QUERY_QP', (MLX5_CMD_OP_FPGA_DESTROY_QP:=2403): 'MLX5_CMD_OP_FPGA_DESTROY_QP', (MLX5_CMD_OP_FPGA_QUERY_QP_COUNTERS:=2404): 'MLX5_CMD_OP_FPGA_QUERY_QP_COUNTERS', (MLX5_CMD_OP_CREATE_GENERAL_OBJECT:=2560): 'MLX5_CMD_OP_CREATE_GENERAL_OBJECT', (MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:=2561): 'MLX5_CMD_OP_MODIFY_GENERAL_OBJECT', (MLX5_CMD_OP_QUERY_GENERAL_OBJECT:=2562): 'MLX5_CMD_OP_QUERY_GENERAL_OBJECT', (MLX5_CMD_OP_DESTROY_GENERAL_OBJECT:=2563): 'MLX5_CMD_OP_DESTROY_GENERAL_OBJECT', (MLX5_CMD_OP_CREATE_UCTX:=2564): 'MLX5_CMD_OP_CREATE_UCTX', (MLX5_CMD_OP_DESTROY_UCTX:=2566): 'MLX5_CMD_OP_DESTROY_UCTX', (MLX5_CMD_OP_CREATE_UMEM:=2568): 'MLX5_CMD_OP_CREATE_UMEM', (MLX5_CMD_OP_DESTROY_UMEM:=2570): 'MLX5_CMD_OP_DESTROY_UMEM', (MLX5_CMD_OP_SYNC_STEERING:=2816): 'MLX5_CMD_OP_SYNC_STEERING', (MLX5_CMD_OP_PSP_GEN_SPI:=2832): 'MLX5_CMD_OP_PSP_GEN_SPI', (MLX5_CMD_OP_PSP_ROTATE_KEY:=2833): 'MLX5_CMD_OP_PSP_ROTATE_KEY', (MLX5_CMD_OP_QUERY_VHCA_STATE:=2829): 'MLX5_CMD_OP_QUERY_VHCA_STATE', (MLX5_CMD_OP_MODIFY_VHCA_STATE:=2830): 'MLX5_CMD_OP_MODIFY_VHCA_STATE', (MLX5_CMD_OP_SYNC_CRYPTO:=2834): 'MLX5_CMD_OP_SYNC_CRYPTO', (MLX5_CMD_OP_ALLOW_OTHER_VHCA_ACCESS:=2838): 'MLX5_CMD_OP_ALLOW_OTHER_VHCA_ACCESS', (MLX5_CMD_OP_GENERATE_WQE:=2839): 'MLX5_CMD_OP_GENERATE_WQE', (MLX5_CMD_OPCODE_QUERY_VUID:=2850): 'MLX5_CMD_OPCODE_QUERY_VUID', (MLX5_CMD_OP_MAX:=2851): 'MLX5_CMD_OP_MAX'} +_anonenum6: dict[int, str] = {(MLX5_CMD_OP_GENERAL_START:=2816): 'MLX5_CMD_OP_GENERAL_START', (MLX5_CMD_OP_GENERAL_END:=3328): 'MLX5_CMD_OP_GENERAL_END'} +_anonenum7: dict[int, str] = {(MLX5_FT_NIC_RX_2_NIC_RX_RDMA:=0): 'MLX5_FT_NIC_RX_2_NIC_RX_RDMA', (MLX5_FT_NIC_TX_RDMA_2_NIC_TX:=1): 'MLX5_FT_NIC_TX_RDMA_2_NIC_TX'} +_anonenum8: dict[int, str] = {(MLX5_CMD_OP_MOD_UPDATE_HEADER_MODIFY_ARGUMENT:=1): 'MLX5_CMD_OP_MOD_UPDATE_HEADER_MODIFY_ARGUMENT'} +@c.record +class struct_mlx5_ifc_flow_table_fields_supported_bits(c.Struct): + SIZE = 128 + outer_dmac: c.Array[ctypes.c_ubyte, Literal[1]] + outer_smac: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ether_type: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ip_version: c.Array[ctypes.c_ubyte, Literal[1]] + outer_first_prio: c.Array[ctypes.c_ubyte, Literal[1]] + outer_first_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + outer_first_vid: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ipv4_ttl: c.Array[ctypes.c_ubyte, Literal[1]] + outer_second_prio: c.Array[ctypes.c_ubyte, Literal[1]] + outer_second_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + outer_second_vid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_b: c.Array[ctypes.c_ubyte, Literal[1]] + outer_sip: c.Array[ctypes.c_ubyte, Literal[1]] + outer_dip: c.Array[ctypes.c_ubyte, Literal[1]] + outer_frag: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ip_protocol: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ip_ecn: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ip_dscp: c.Array[ctypes.c_ubyte, Literal[1]] + outer_udp_sport: c.Array[ctypes.c_ubyte, Literal[1]] + outer_udp_dport: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_sport: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_dport: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_flags: c.Array[ctypes.c_ubyte, Literal[1]] + outer_gre_protocol: c.Array[ctypes.c_ubyte, Literal[1]] + outer_gre_key: c.Array[ctypes.c_ubyte, Literal[1]] + outer_vxlan_vni: c.Array[ctypes.c_ubyte, Literal[1]] + outer_geneve_vni: c.Array[ctypes.c_ubyte, Literal[1]] + outer_geneve_oam: c.Array[ctypes.c_ubyte, Literal[1]] + outer_geneve_protocol_type: c.Array[ctypes.c_ubyte, Literal[1]] + outer_geneve_opt_len: c.Array[ctypes.c_ubyte, Literal[1]] + source_vhca_port: c.Array[ctypes.c_ubyte, Literal[1]] + source_eswitch_port: c.Array[ctypes.c_ubyte, Literal[1]] + inner_dmac: c.Array[ctypes.c_ubyte, Literal[1]] + inner_smac: c.Array[ctypes.c_ubyte, Literal[1]] + inner_ether_type: c.Array[ctypes.c_ubyte, Literal[1]] + inner_ip_version: c.Array[ctypes.c_ubyte, Literal[1]] + inner_first_prio: c.Array[ctypes.c_ubyte, Literal[1]] + inner_first_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + inner_first_vid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_27: c.Array[ctypes.c_ubyte, Literal[1]] + inner_second_prio: c.Array[ctypes.c_ubyte, Literal[1]] + inner_second_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + inner_second_vid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2b: c.Array[ctypes.c_ubyte, Literal[1]] + inner_sip: c.Array[ctypes.c_ubyte, Literal[1]] + inner_dip: c.Array[ctypes.c_ubyte, Literal[1]] + inner_frag: c.Array[ctypes.c_ubyte, Literal[1]] + inner_ip_protocol: c.Array[ctypes.c_ubyte, Literal[1]] + inner_ip_ecn: c.Array[ctypes.c_ubyte, Literal[1]] + inner_ip_dscp: c.Array[ctypes.c_ubyte, Literal[1]] + inner_udp_sport: c.Array[ctypes.c_ubyte, Literal[1]] + inner_udp_dport: c.Array[ctypes.c_ubyte, Literal[1]] + inner_tcp_sport: c.Array[ctypes.c_ubyte, Literal[1]] + inner_tcp_dport: c.Array[ctypes.c_ubyte, Literal[1]] + inner_tcp_flags: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_37: c.Array[ctypes.c_ubyte, Literal[9]] + geneve_tlv_option_0_data: c.Array[ctypes.c_ubyte, Literal[1]] + geneve_tlv_option_0_exist: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[3]] + outer_first_mpls_over_udp: c.Array[ctypes.c_ubyte, Literal[4]] + outer_first_mpls_over_gre: c.Array[ctypes.c_ubyte, Literal[4]] + inner_first_mpls: c.Array[ctypes.c_ubyte, Literal[4]] + outer_first_mpls: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_55: c.Array[ctypes.c_ubyte, Literal[2]] + outer_esp_spi: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_58: c.Array[ctypes.c_ubyte, Literal[2]] + bth_dst_qp: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5b: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[24]] + metadata_reg_c_7: c.Array[ctypes.c_ubyte, Literal[1]] + metadata_reg_c_6: c.Array[ctypes.c_ubyte, Literal[1]] + metadata_reg_c_5: c.Array[ctypes.c_ubyte, Literal[1]] + metadata_reg_c_4: c.Array[ctypes.c_ubyte, Literal[1]] + metadata_reg_c_3: c.Array[ctypes.c_ubyte, Literal[1]] + metadata_reg_c_2: c.Array[ctypes.c_ubyte, Literal[1]] + metadata_reg_c_1: c.Array[ctypes.c_ubyte, Literal[1]] + metadata_reg_c_0: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_flow_table_fields_supported_bits.register_fields([('outer_dmac', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('outer_smac', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('outer_ether_type', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('outer_ip_version', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('outer_first_prio', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('outer_first_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('outer_first_vid', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('outer_ipv4_ttl', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('outer_second_prio', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('outer_second_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 9), ('outer_second_vid', c.Array[ctypes.c_ubyte, Literal[1]], 10), ('reserved_at_b', c.Array[ctypes.c_ubyte, Literal[1]], 11), ('outer_sip', c.Array[ctypes.c_ubyte, Literal[1]], 12), ('outer_dip', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('outer_frag', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('outer_ip_protocol', c.Array[ctypes.c_ubyte, Literal[1]], 15), ('outer_ip_ecn', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('outer_ip_dscp', c.Array[ctypes.c_ubyte, Literal[1]], 17), ('outer_udp_sport', c.Array[ctypes.c_ubyte, Literal[1]], 18), ('outer_udp_dport', c.Array[ctypes.c_ubyte, Literal[1]], 19), ('outer_tcp_sport', c.Array[ctypes.c_ubyte, Literal[1]], 20), ('outer_tcp_dport', c.Array[ctypes.c_ubyte, Literal[1]], 21), ('outer_tcp_flags', c.Array[ctypes.c_ubyte, Literal[1]], 22), ('outer_gre_protocol', c.Array[ctypes.c_ubyte, Literal[1]], 23), ('outer_gre_key', c.Array[ctypes.c_ubyte, Literal[1]], 24), ('outer_vxlan_vni', c.Array[ctypes.c_ubyte, Literal[1]], 25), ('outer_geneve_vni', c.Array[ctypes.c_ubyte, Literal[1]], 26), ('outer_geneve_oam', c.Array[ctypes.c_ubyte, Literal[1]], 27), ('outer_geneve_protocol_type', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('outer_geneve_opt_len', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('source_vhca_port', c.Array[ctypes.c_ubyte, Literal[1]], 30), ('source_eswitch_port', c.Array[ctypes.c_ubyte, Literal[1]], 31), ('inner_dmac', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('inner_smac', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('inner_ether_type', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('inner_ip_version', c.Array[ctypes.c_ubyte, Literal[1]], 35), ('inner_first_prio', c.Array[ctypes.c_ubyte, Literal[1]], 36), ('inner_first_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 37), ('inner_first_vid', c.Array[ctypes.c_ubyte, Literal[1]], 38), ('reserved_at_27', c.Array[ctypes.c_ubyte, Literal[1]], 39), ('inner_second_prio', c.Array[ctypes.c_ubyte, Literal[1]], 40), ('inner_second_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 41), ('inner_second_vid', c.Array[ctypes.c_ubyte, Literal[1]], 42), ('reserved_at_2b', c.Array[ctypes.c_ubyte, Literal[1]], 43), ('inner_sip', c.Array[ctypes.c_ubyte, Literal[1]], 44), ('inner_dip', c.Array[ctypes.c_ubyte, Literal[1]], 45), ('inner_frag', c.Array[ctypes.c_ubyte, Literal[1]], 46), ('inner_ip_protocol', c.Array[ctypes.c_ubyte, Literal[1]], 47), ('inner_ip_ecn', c.Array[ctypes.c_ubyte, Literal[1]], 48), ('inner_ip_dscp', c.Array[ctypes.c_ubyte, Literal[1]], 49), ('inner_udp_sport', c.Array[ctypes.c_ubyte, Literal[1]], 50), ('inner_udp_dport', c.Array[ctypes.c_ubyte, Literal[1]], 51), ('inner_tcp_sport', c.Array[ctypes.c_ubyte, Literal[1]], 52), ('inner_tcp_dport', c.Array[ctypes.c_ubyte, Literal[1]], 53), ('inner_tcp_flags', c.Array[ctypes.c_ubyte, Literal[1]], 54), ('reserved_at_37', c.Array[ctypes.c_ubyte, Literal[9]], 55), ('geneve_tlv_option_0_data', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('geneve_tlv_option_0_exist', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[3]], 66), ('outer_first_mpls_over_udp', c.Array[ctypes.c_ubyte, Literal[4]], 69), ('outer_first_mpls_over_gre', c.Array[ctypes.c_ubyte, Literal[4]], 73), ('inner_first_mpls', c.Array[ctypes.c_ubyte, Literal[4]], 77), ('outer_first_mpls', c.Array[ctypes.c_ubyte, Literal[4]], 81), ('reserved_at_55', c.Array[ctypes.c_ubyte, Literal[2]], 85), ('outer_esp_spi', c.Array[ctypes.c_ubyte, Literal[1]], 87), ('reserved_at_58', c.Array[ctypes.c_ubyte, Literal[2]], 88), ('bth_dst_qp', c.Array[ctypes.c_ubyte, Literal[1]], 90), ('reserved_at_5b', c.Array[ctypes.c_ubyte, Literal[5]], 91), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[24]], 96), ('metadata_reg_c_7', c.Array[ctypes.c_ubyte, Literal[1]], 120), ('metadata_reg_c_6', c.Array[ctypes.c_ubyte, Literal[1]], 121), ('metadata_reg_c_5', c.Array[ctypes.c_ubyte, Literal[1]], 122), ('metadata_reg_c_4', c.Array[ctypes.c_ubyte, Literal[1]], 123), ('metadata_reg_c_3', c.Array[ctypes.c_ubyte, Literal[1]], 124), ('metadata_reg_c_2', c.Array[ctypes.c_ubyte, Literal[1]], 125), ('metadata_reg_c_1', c.Array[ctypes.c_ubyte, Literal[1]], 126), ('metadata_reg_c_0', c.Array[ctypes.c_ubyte, Literal[1]], 127)]) +@c.record +class struct_mlx5_ifc_flow_table_fields_supported_2_bits(c.Struct): + SIZE = 128 + inner_l4_type_ext: c.Array[ctypes.c_ubyte, Literal[1]] + outer_l4_type_ext: c.Array[ctypes.c_ubyte, Literal[1]] + inner_l4_type: c.Array[ctypes.c_ubyte, Literal[1]] + outer_l4_type: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[10]] + bth_opcode: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_f: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_header_0_1: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_11: c.Array[ctypes.c_ubyte, Literal[15]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[15]] + ipsec_next_header: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_flow_table_fields_supported_2_bits.register_fields([('inner_l4_type_ext', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('outer_l4_type_ext', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('inner_l4_type', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('outer_l4_type', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[10]], 4), ('bth_opcode', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('reserved_at_f', c.Array[ctypes.c_ubyte, Literal[1]], 15), ('tunnel_header_0_1', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('reserved_at_11', c.Array[ctypes.c_ubyte, Literal[15]], 17), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[15]], 32), ('ipsec_next_header', c.Array[ctypes.c_ubyte, Literal[1]], 47), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_flow_table_prop_layout_bits(c.Struct): + SIZE = 512 + ft_support: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[1]] + flow_counter: c.Array[ctypes.c_ubyte, Literal[1]] + flow_modify_en: c.Array[ctypes.c_ubyte, Literal[1]] + modify_root: c.Array[ctypes.c_ubyte, Literal[1]] + identified_miss_table_mode: c.Array[ctypes.c_ubyte, Literal[1]] + flow_table_modify: c.Array[ctypes.c_ubyte, Literal[1]] + reformat: c.Array[ctypes.c_ubyte, Literal[1]] + decap: c.Array[ctypes.c_ubyte, Literal[1]] + reset_root_to_default: c.Array[ctypes.c_ubyte, Literal[1]] + pop_vlan: c.Array[ctypes.c_ubyte, Literal[1]] + push_vlan: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_c: c.Array[ctypes.c_ubyte, Literal[1]] + pop_vlan_2: c.Array[ctypes.c_ubyte, Literal[1]] + push_vlan_2: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_and_vlan_action: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[1]] + sw_owner: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_l3_tunnel_to_l2: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_l2_to_l3_tunnel: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_and_modify_action: c.Array[ctypes.c_ubyte, Literal[1]] + ignore_flow_level: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_16: c.Array[ctypes.c_ubyte, Literal[1]] + table_miss_action_domain: c.Array[ctypes.c_ubyte, Literal[1]] + termination_table: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_and_fwd_to_table: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1a: c.Array[ctypes.c_ubyte, Literal[2]] + ipsec_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + ipsec_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + sw_owner_v2: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1f: c.Array[ctypes.c_ubyte, Literal[1]] + termination_table_raw_traffic: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_ft_size: c.Array[ctypes.c_ubyte, Literal[6]] + log_max_modify_header_context: c.Array[ctypes.c_ubyte, Literal[8]] + max_modify_header_actions: c.Array[ctypes.c_ubyte, Literal[8]] + max_ft_level: c.Array[ctypes.c_ubyte, Literal[8]] + reformat_add_esp_trasport: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_l2_to_l3_esp_tunnel: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_add_esp_transport_over_udp: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_del_esp_trasport: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_l3_esp_tunnel_to_l2: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_del_esp_transport_over_udp: c.Array[ctypes.c_ubyte, Literal[1]] + execute_aso: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_47: c.Array[ctypes.c_ubyte, Literal[25]] + reformat_l2_to_l3_psp_tunnel: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_l3_psp_tunnel_to_l2: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_insert: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_remove: c.Array[ctypes.c_ubyte, Literal[1]] + macsec_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + macsec_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + psp_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + psp_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_add_macsec: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_remove_macsec: c.Array[ctypes.c_ubyte, Literal[1]] + reparse: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_6b: c.Array[ctypes.c_ubyte, Literal[1]] + cross_vhca_object: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_l2_to_l3_audp_tunnel: c.Array[ctypes.c_ubyte, Literal[1]] + reformat_l3_audp_tunnel_to_l2: c.Array[ctypes.c_ubyte, Literal[1]] + ignore_flow_level_rtc_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_70: c.Array[ctypes.c_ubyte, Literal[8]] + log_max_ft_num: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[16]] + log_max_flow_counter: c.Array[ctypes.c_ubyte, Literal[8]] + log_max_destination: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[24]] + log_max_flow: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + ft_field_support: struct_mlx5_ifc_flow_table_fields_supported_bits + ft_field_bitmask_support: struct_mlx5_ifc_flow_table_fields_supported_bits +struct_mlx5_ifc_flow_table_prop_layout_bits.register_fields([('ft_support', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('flow_counter', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('flow_modify_en', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('modify_root', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('identified_miss_table_mode', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('flow_table_modify', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('reformat', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('decap', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('reset_root_to_default', c.Array[ctypes.c_ubyte, Literal[1]], 9), ('pop_vlan', c.Array[ctypes.c_ubyte, Literal[1]], 10), ('push_vlan', c.Array[ctypes.c_ubyte, Literal[1]], 11), ('reserved_at_c', c.Array[ctypes.c_ubyte, Literal[1]], 12), ('pop_vlan_2', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('push_vlan_2', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('reformat_and_vlan_action', c.Array[ctypes.c_ubyte, Literal[1]], 15), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('sw_owner', c.Array[ctypes.c_ubyte, Literal[1]], 17), ('reformat_l3_tunnel_to_l2', c.Array[ctypes.c_ubyte, Literal[1]], 18), ('reformat_l2_to_l3_tunnel', c.Array[ctypes.c_ubyte, Literal[1]], 19), ('reformat_and_modify_action', c.Array[ctypes.c_ubyte, Literal[1]], 20), ('ignore_flow_level', c.Array[ctypes.c_ubyte, Literal[1]], 21), ('reserved_at_16', c.Array[ctypes.c_ubyte, Literal[1]], 22), ('table_miss_action_domain', c.Array[ctypes.c_ubyte, Literal[1]], 23), ('termination_table', c.Array[ctypes.c_ubyte, Literal[1]], 24), ('reformat_and_fwd_to_table', c.Array[ctypes.c_ubyte, Literal[1]], 25), ('reserved_at_1a', c.Array[ctypes.c_ubyte, Literal[2]], 26), ('ipsec_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('ipsec_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('sw_owner_v2', c.Array[ctypes.c_ubyte, Literal[1]], 30), ('reserved_at_1f', c.Array[ctypes.c_ubyte, Literal[1]], 31), ('termination_table_raw_traffic', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('log_max_ft_size', c.Array[ctypes.c_ubyte, Literal[6]], 34), ('log_max_modify_header_context', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('max_modify_header_actions', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('max_ft_level', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('reformat_add_esp_trasport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reformat_l2_to_l3_esp_tunnel', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reformat_add_esp_transport_over_udp', c.Array[ctypes.c_ubyte, Literal[1]], 66), ('reformat_del_esp_trasport', c.Array[ctypes.c_ubyte, Literal[1]], 67), ('reformat_l3_esp_tunnel_to_l2', c.Array[ctypes.c_ubyte, Literal[1]], 68), ('reformat_del_esp_transport_over_udp', c.Array[ctypes.c_ubyte, Literal[1]], 69), ('execute_aso', c.Array[ctypes.c_ubyte, Literal[1]], 70), ('reserved_at_47', c.Array[ctypes.c_ubyte, Literal[25]], 71), ('reformat_l2_to_l3_psp_tunnel', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('reformat_l3_psp_tunnel_to_l2', c.Array[ctypes.c_ubyte, Literal[1]], 97), ('reformat_insert', c.Array[ctypes.c_ubyte, Literal[1]], 98), ('reformat_remove', c.Array[ctypes.c_ubyte, Literal[1]], 99), ('macsec_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 100), ('macsec_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 101), ('psp_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 102), ('psp_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 103), ('reformat_add_macsec', c.Array[ctypes.c_ubyte, Literal[1]], 104), ('reformat_remove_macsec', c.Array[ctypes.c_ubyte, Literal[1]], 105), ('reparse', c.Array[ctypes.c_ubyte, Literal[1]], 106), ('reserved_at_6b', c.Array[ctypes.c_ubyte, Literal[1]], 107), ('cross_vhca_object', c.Array[ctypes.c_ubyte, Literal[1]], 108), ('reformat_l2_to_l3_audp_tunnel', c.Array[ctypes.c_ubyte, Literal[1]], 109), ('reformat_l3_audp_tunnel_to_l2', c.Array[ctypes.c_ubyte, Literal[1]], 110), ('ignore_flow_level_rtc_valid', c.Array[ctypes.c_ubyte, Literal[1]], 111), ('reserved_at_70', c.Array[ctypes.c_ubyte, Literal[8]], 112), ('log_max_ft_num', c.Array[ctypes.c_ubyte, Literal[8]], 120), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('log_max_flow_counter', c.Array[ctypes.c_ubyte, Literal[8]], 144), ('log_max_destination', c.Array[ctypes.c_ubyte, Literal[8]], 152), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[24]], 160), ('log_max_flow', c.Array[ctypes.c_ubyte, Literal[8]], 184), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('ft_field_support', struct_mlx5_ifc_flow_table_fields_supported_bits, 256), ('ft_field_bitmask_support', struct_mlx5_ifc_flow_table_fields_supported_bits, 384)]) +@c.record +class struct_mlx5_ifc_odp_per_transport_service_cap_bits(c.Struct): + SIZE = 32 + send: c.Array[ctypes.c_ubyte, Literal[1]] + receive: c.Array[ctypes.c_ubyte, Literal[1]] + write: c.Array[ctypes.c_ubyte, Literal[1]] + read: c.Array[ctypes.c_ubyte, Literal[1]] + atomic: c.Array[ctypes.c_ubyte, Literal[1]] + srq_receive: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_6: c.Array[ctypes.c_ubyte, Literal[26]] +struct_mlx5_ifc_odp_per_transport_service_cap_bits.register_fields([('send', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('receive', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('write', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('read', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('atomic', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('srq_receive', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('reserved_at_6', c.Array[ctypes.c_ubyte, Literal[26]], 6)]) +@c.record +class struct_mlx5_ifc_ipv4_layout_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[96]] + ipv4: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_ipv4_layout_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[96]], 0), ('ipv4', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_ipv6_layout_bits(c.Struct): + SIZE = 128 + ipv6: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] +struct_mlx5_ifc_ipv6_layout_bits.register_fields([('ipv6', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 0)]) +@c.record +class struct_mlx5_ifc_ipv6_simple_layout_bits(c.Struct): + SIZE = 128 + ipv6_127_96: c.Array[ctypes.c_ubyte, Literal[32]] + ipv6_95_64: c.Array[ctypes.c_ubyte, Literal[32]] + ipv6_63_32: c.Array[ctypes.c_ubyte, Literal[32]] + ipv6_31_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_ipv6_simple_layout_bits.register_fields([('ipv6_127_96', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('ipv6_95_64', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('ipv6_63_32', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('ipv6_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class union_mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits(c.Struct): + SIZE = 128 + ipv6_simple_layout: struct_mlx5_ifc_ipv6_simple_layout_bits + ipv6_layout: struct_mlx5_ifc_ipv6_layout_bits + ipv4_layout: struct_mlx5_ifc_ipv4_layout_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] +union_mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits.register_fields([('ipv6_simple_layout', struct_mlx5_ifc_ipv6_simple_layout_bits, 0), ('ipv6_layout', struct_mlx5_ifc_ipv6_layout_bits, 0), ('ipv4_layout', struct_mlx5_ifc_ipv4_layout_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0)]) +_anonenum9: dict[int, str] = {(MLX5_PACKET_L4_TYPE_NONE:=0): 'MLX5_PACKET_L4_TYPE_NONE', (MLX5_PACKET_L4_TYPE_TCP:=1): 'MLX5_PACKET_L4_TYPE_TCP', (MLX5_PACKET_L4_TYPE_UDP:=2): 'MLX5_PACKET_L4_TYPE_UDP'} +_anonenum10: dict[int, str] = {(MLX5_PACKET_L4_TYPE_EXT_NONE:=0): 'MLX5_PACKET_L4_TYPE_EXT_NONE', (MLX5_PACKET_L4_TYPE_EXT_TCP:=1): 'MLX5_PACKET_L4_TYPE_EXT_TCP', (MLX5_PACKET_L4_TYPE_EXT_UDP:=2): 'MLX5_PACKET_L4_TYPE_EXT_UDP', (MLX5_PACKET_L4_TYPE_EXT_ICMP:=3): 'MLX5_PACKET_L4_TYPE_EXT_ICMP'} +@c.record +class struct_mlx5_ifc_fte_match_set_lyr_2_4_bits(c.Struct): + SIZE = 512 + smac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + smac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + ethertype: c.Array[ctypes.c_ubyte, Literal[16]] + dmac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + dmac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + first_prio: c.Array[ctypes.c_ubyte, Literal[3]] + first_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + first_vid: c.Array[ctypes.c_ubyte, Literal[12]] + ip_protocol: c.Array[ctypes.c_ubyte, Literal[8]] + ip_dscp: c.Array[ctypes.c_ubyte, Literal[6]] + ip_ecn: c.Array[ctypes.c_ubyte, Literal[2]] + cvlan_tag: c.Array[ctypes.c_ubyte, Literal[1]] + svlan_tag: c.Array[ctypes.c_ubyte, Literal[1]] + frag: c.Array[ctypes.c_ubyte, Literal[1]] + ip_version: c.Array[ctypes.c_ubyte, Literal[4]] + tcp_flags: c.Array[ctypes.c_ubyte, Literal[9]] + tcp_sport: c.Array[ctypes.c_ubyte, Literal[16]] + tcp_dport: c.Array[ctypes.c_ubyte, Literal[16]] + l4_type: c.Array[ctypes.c_ubyte, Literal[2]] + l4_type_ext: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_c6: c.Array[ctypes.c_ubyte, Literal[10]] + ipv4_ihl: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_d4: c.Array[ctypes.c_ubyte, Literal[4]] + ttl_hoplimit: c.Array[ctypes.c_ubyte, Literal[8]] + udp_sport: c.Array[ctypes.c_ubyte, Literal[16]] + udp_dport: c.Array[ctypes.c_ubyte, Literal[16]] + src_ipv4_src_ipv6: union_mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits + dst_ipv4_dst_ipv6: union_mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits +struct_mlx5_ifc_fte_match_set_lyr_2_4_bits.register_fields([('smac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('smac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('ethertype', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('dmac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('dmac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('first_prio', c.Array[ctypes.c_ubyte, Literal[3]], 112), ('first_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 115), ('first_vid', c.Array[ctypes.c_ubyte, Literal[12]], 116), ('ip_protocol', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('ip_dscp', c.Array[ctypes.c_ubyte, Literal[6]], 136), ('ip_ecn', c.Array[ctypes.c_ubyte, Literal[2]], 142), ('cvlan_tag', c.Array[ctypes.c_ubyte, Literal[1]], 144), ('svlan_tag', c.Array[ctypes.c_ubyte, Literal[1]], 145), ('frag', c.Array[ctypes.c_ubyte, Literal[1]], 146), ('ip_version', c.Array[ctypes.c_ubyte, Literal[4]], 147), ('tcp_flags', c.Array[ctypes.c_ubyte, Literal[9]], 151), ('tcp_sport', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('tcp_dport', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('l4_type', c.Array[ctypes.c_ubyte, Literal[2]], 192), ('l4_type_ext', c.Array[ctypes.c_ubyte, Literal[4]], 194), ('reserved_at_c6', c.Array[ctypes.c_ubyte, Literal[10]], 198), ('ipv4_ihl', c.Array[ctypes.c_ubyte, Literal[4]], 208), ('reserved_at_d4', c.Array[ctypes.c_ubyte, Literal[4]], 212), ('ttl_hoplimit', c.Array[ctypes.c_ubyte, Literal[8]], 216), ('udp_sport', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('udp_dport', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('src_ipv4_src_ipv6', union_mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits, 256), ('dst_ipv4_dst_ipv6', union_mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits, 384)]) +@c.record +class struct_mlx5_ifc_nvgre_key_bits(c.Struct): + SIZE = 32 + hi: c.Array[ctypes.c_ubyte, Literal[24]] + lo: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_nvgre_key_bits.register_fields([('hi', c.Array[ctypes.c_ubyte, Literal[24]], 0), ('lo', c.Array[ctypes.c_ubyte, Literal[8]], 24)]) +@c.record +class union_mlx5_ifc_gre_key_bits(c.Struct): + SIZE = 32 + nvgre: struct_mlx5_ifc_nvgre_key_bits + key: c.Array[ctypes.c_ubyte, Literal[32]] +union_mlx5_ifc_gre_key_bits.register_fields([('nvgre', struct_mlx5_ifc_nvgre_key_bits, 0), ('key', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_fte_match_set_misc_bits(c.Struct): + SIZE = 512 + gre_c_present: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[1]] + gre_k_present: c.Array[ctypes.c_ubyte, Literal[1]] + gre_s_present: c.Array[ctypes.c_ubyte, Literal[1]] + source_vhca_port: c.Array[ctypes.c_ubyte, Literal[4]] + source_sqn: c.Array[ctypes.c_ubyte, Literal[24]] + source_eswitch_owner_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + source_port: c.Array[ctypes.c_ubyte, Literal[16]] + outer_second_prio: c.Array[ctypes.c_ubyte, Literal[3]] + outer_second_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + outer_second_vid: c.Array[ctypes.c_ubyte, Literal[12]] + inner_second_prio: c.Array[ctypes.c_ubyte, Literal[3]] + inner_second_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + inner_second_vid: c.Array[ctypes.c_ubyte, Literal[12]] + outer_second_cvlan_tag: c.Array[ctypes.c_ubyte, Literal[1]] + inner_second_cvlan_tag: c.Array[ctypes.c_ubyte, Literal[1]] + outer_second_svlan_tag: c.Array[ctypes.c_ubyte, Literal[1]] + inner_second_svlan_tag: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_64: c.Array[ctypes.c_ubyte, Literal[12]] + gre_protocol: c.Array[ctypes.c_ubyte, Literal[16]] + gre_key: union_mlx5_ifc_gre_key_bits + vxlan_vni: c.Array[ctypes.c_ubyte, Literal[24]] + bth_opcode: c.Array[ctypes.c_ubyte, Literal[8]] + geneve_vni: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_d8: c.Array[ctypes.c_ubyte, Literal[6]] + geneve_tlv_option_0_exist: c.Array[ctypes.c_ubyte, Literal[1]] + geneve_oam: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[12]] + outer_ipv6_flow_label: c.Array[ctypes.c_ubyte, Literal[20]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[12]] + inner_ipv6_flow_label: c.Array[ctypes.c_ubyte, Literal[20]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[10]] + geneve_opt_len: c.Array[ctypes.c_ubyte, Literal[6]] + geneve_protocol_type: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[8]] + bth_dst_qp: c.Array[ctypes.c_ubyte, Literal[24]] + inner_esp_spi: c.Array[ctypes.c_ubyte, Literal[32]] + outer_esp_spi: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1a0: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_fte_match_set_misc_bits.register_fields([('gre_c_present', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('gre_k_present', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('gre_s_present', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('source_vhca_port', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('source_sqn', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('source_eswitch_owner_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('source_port', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('outer_second_prio', c.Array[ctypes.c_ubyte, Literal[3]], 64), ('outer_second_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 67), ('outer_second_vid', c.Array[ctypes.c_ubyte, Literal[12]], 68), ('inner_second_prio', c.Array[ctypes.c_ubyte, Literal[3]], 80), ('inner_second_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 83), ('inner_second_vid', c.Array[ctypes.c_ubyte, Literal[12]], 84), ('outer_second_cvlan_tag', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('inner_second_cvlan_tag', c.Array[ctypes.c_ubyte, Literal[1]], 97), ('outer_second_svlan_tag', c.Array[ctypes.c_ubyte, Literal[1]], 98), ('inner_second_svlan_tag', c.Array[ctypes.c_ubyte, Literal[1]], 99), ('reserved_at_64', c.Array[ctypes.c_ubyte, Literal[12]], 100), ('gre_protocol', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('gre_key', union_mlx5_ifc_gre_key_bits, 128), ('vxlan_vni', c.Array[ctypes.c_ubyte, Literal[24]], 160), ('bth_opcode', c.Array[ctypes.c_ubyte, Literal[8]], 184), ('geneve_vni', c.Array[ctypes.c_ubyte, Literal[24]], 192), ('reserved_at_d8', c.Array[ctypes.c_ubyte, Literal[6]], 216), ('geneve_tlv_option_0_exist', c.Array[ctypes.c_ubyte, Literal[1]], 222), ('geneve_oam', c.Array[ctypes.c_ubyte, Literal[1]], 223), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[12]], 224), ('outer_ipv6_flow_label', c.Array[ctypes.c_ubyte, Literal[20]], 236), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[12]], 256), ('inner_ipv6_flow_label', c.Array[ctypes.c_ubyte, Literal[20]], 268), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[10]], 288), ('geneve_opt_len', c.Array[ctypes.c_ubyte, Literal[6]], 298), ('geneve_protocol_type', c.Array[ctypes.c_ubyte, Literal[16]], 304), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[8]], 320), ('bth_dst_qp', c.Array[ctypes.c_ubyte, Literal[24]], 328), ('inner_esp_spi', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('outer_esp_spi', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('reserved_at_1a0', c.Array[ctypes.c_ubyte, Literal[96]], 416)]) +@c.record +class struct_mlx5_ifc_fte_match_mpls_bits(c.Struct): + SIZE = 32 + mpls_label: c.Array[ctypes.c_ubyte, Literal[20]] + mpls_exp: c.Array[ctypes.c_ubyte, Literal[3]] + mpls_s_bos: c.Array[ctypes.c_ubyte, Literal[1]] + mpls_ttl: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_fte_match_mpls_bits.register_fields([('mpls_label', c.Array[ctypes.c_ubyte, Literal[20]], 0), ('mpls_exp', c.Array[ctypes.c_ubyte, Literal[3]], 20), ('mpls_s_bos', c.Array[ctypes.c_ubyte, Literal[1]], 23), ('mpls_ttl', c.Array[ctypes.c_ubyte, Literal[8]], 24)]) +@c.record +class struct_mlx5_ifc_fte_match_set_misc2_bits(c.Struct): + SIZE = 512 + outer_first_mpls: struct_mlx5_ifc_fte_match_mpls_bits + inner_first_mpls: struct_mlx5_ifc_fte_match_mpls_bits + outer_first_mpls_over_gre: struct_mlx5_ifc_fte_match_mpls_bits + outer_first_mpls_over_udp: struct_mlx5_ifc_fte_match_mpls_bits + metadata_reg_c_7: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_c_6: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_c_5: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_c_4: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_c_3: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_c_2: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_c_1: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_c_0: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_a: c.Array[ctypes.c_ubyte, Literal[32]] + psp_syndrome: c.Array[ctypes.c_ubyte, Literal[8]] + macsec_syndrome: c.Array[ctypes.c_ubyte, Literal[8]] + ipsec_syndrome: c.Array[ctypes.c_ubyte, Literal[8]] + ipsec_next_header: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_fte_match_set_misc2_bits.register_fields([('outer_first_mpls', struct_mlx5_ifc_fte_match_mpls_bits, 0), ('inner_first_mpls', struct_mlx5_ifc_fte_match_mpls_bits, 32), ('outer_first_mpls_over_gre', struct_mlx5_ifc_fte_match_mpls_bits, 64), ('outer_first_mpls_over_udp', struct_mlx5_ifc_fte_match_mpls_bits, 96), ('metadata_reg_c_7', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('metadata_reg_c_6', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('metadata_reg_c_5', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('metadata_reg_c_4', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('metadata_reg_c_3', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('metadata_reg_c_2', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('metadata_reg_c_1', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('metadata_reg_c_0', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('metadata_reg_a', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('psp_syndrome', c.Array[ctypes.c_ubyte, Literal[8]], 416), ('macsec_syndrome', c.Array[ctypes.c_ubyte, Literal[8]], 424), ('ipsec_syndrome', c.Array[ctypes.c_ubyte, Literal[8]], 432), ('ipsec_next_header', c.Array[ctypes.c_ubyte, Literal[8]], 440), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[64]], 448)]) +@c.record +class struct_mlx5_ifc_fte_match_set_misc3_bits(c.Struct): + SIZE = 512 + inner_tcp_seq_num: c.Array[ctypes.c_ubyte, Literal[32]] + outer_tcp_seq_num: c.Array[ctypes.c_ubyte, Literal[32]] + inner_tcp_ack_num: c.Array[ctypes.c_ubyte, Literal[32]] + outer_tcp_ack_num: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + outer_vxlan_gpe_vni: c.Array[ctypes.c_ubyte, Literal[24]] + outer_vxlan_gpe_next_protocol: c.Array[ctypes.c_ubyte, Literal[8]] + outer_vxlan_gpe_flags: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_b0: c.Array[ctypes.c_ubyte, Literal[16]] + icmp_header_data: c.Array[ctypes.c_ubyte, Literal[32]] + icmpv6_header_data: c.Array[ctypes.c_ubyte, Literal[32]] + icmp_type: c.Array[ctypes.c_ubyte, Literal[8]] + icmp_code: c.Array[ctypes.c_ubyte, Literal[8]] + icmpv6_type: c.Array[ctypes.c_ubyte, Literal[8]] + icmpv6_code: c.Array[ctypes.c_ubyte, Literal[8]] + geneve_tlv_option_0_data: c.Array[ctypes.c_ubyte, Literal[32]] + gtpu_teid: c.Array[ctypes.c_ubyte, Literal[32]] + gtpu_msg_type: c.Array[ctypes.c_ubyte, Literal[8]] + gtpu_msg_flags: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_170: c.Array[ctypes.c_ubyte, Literal[16]] + gtpu_dw_2: c.Array[ctypes.c_ubyte, Literal[32]] + gtpu_first_ext_dw_0: c.Array[ctypes.c_ubyte, Literal[32]] + gtpu_dw_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_fte_match_set_misc3_bits.register_fields([('inner_tcp_seq_num', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('outer_tcp_seq_num', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('inner_tcp_ack_num', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('outer_tcp_ack_num', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('outer_vxlan_gpe_vni', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('outer_vxlan_gpe_next_protocol', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('outer_vxlan_gpe_flags', c.Array[ctypes.c_ubyte, Literal[8]], 168), ('reserved_at_b0', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('icmp_header_data', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('icmpv6_header_data', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('icmp_type', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('icmp_code', c.Array[ctypes.c_ubyte, Literal[8]], 264), ('icmpv6_type', c.Array[ctypes.c_ubyte, Literal[8]], 272), ('icmpv6_code', c.Array[ctypes.c_ubyte, Literal[8]], 280), ('geneve_tlv_option_0_data', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('gtpu_teid', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('gtpu_msg_type', c.Array[ctypes.c_ubyte, Literal[8]], 352), ('gtpu_msg_flags', c.Array[ctypes.c_ubyte, Literal[8]], 360), ('reserved_at_170', c.Array[ctypes.c_ubyte, Literal[16]], 368), ('gtpu_dw_2', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('gtpu_first_ext_dw_0', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('gtpu_dw_0', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[32]], 480)]) +@c.record +class struct_mlx5_ifc_fte_match_set_misc4_bits(c.Struct): + SIZE = 512 + prog_sample_field_value_0: c.Array[ctypes.c_ubyte, Literal[32]] + prog_sample_field_id_0: c.Array[ctypes.c_ubyte, Literal[32]] + prog_sample_field_value_1: c.Array[ctypes.c_ubyte, Literal[32]] + prog_sample_field_id_1: c.Array[ctypes.c_ubyte, Literal[32]] + prog_sample_field_value_2: c.Array[ctypes.c_ubyte, Literal[32]] + prog_sample_field_id_2: c.Array[ctypes.c_ubyte, Literal[32]] + prog_sample_field_value_3: c.Array[ctypes.c_ubyte, Literal[32]] + prog_sample_field_id_3: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_fte_match_set_misc4_bits.register_fields([('prog_sample_field_value_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('prog_sample_field_id_0', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('prog_sample_field_value_1', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('prog_sample_field_id_1', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('prog_sample_field_value_2', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('prog_sample_field_id_2', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('prog_sample_field_value_3', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('prog_sample_field_id_3', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[256]], 256)]) +@c.record +class struct_mlx5_ifc_fte_match_set_misc5_bits(c.Struct): + SIZE = 512 + macsec_tag_0: c.Array[ctypes.c_ubyte, Literal[32]] + macsec_tag_1: c.Array[ctypes.c_ubyte, Literal[32]] + macsec_tag_2: c.Array[ctypes.c_ubyte, Literal[32]] + macsec_tag_3: c.Array[ctypes.c_ubyte, Literal[32]] + tunnel_header_0: c.Array[ctypes.c_ubyte, Literal[32]] + tunnel_header_1: c.Array[ctypes.c_ubyte, Literal[32]] + tunnel_header_2: c.Array[ctypes.c_ubyte, Literal[32]] + tunnel_header_3: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_fte_match_set_misc5_bits.register_fields([('macsec_tag_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('macsec_tag_1', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('macsec_tag_2', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('macsec_tag_3', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('tunnel_header_0', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('tunnel_header_1', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('tunnel_header_2', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('tunnel_header_3', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[256]], 256)]) +@c.record +class struct_mlx5_ifc_cmd_pas_bits(c.Struct): + SIZE = 64 + pa_h: c.Array[ctypes.c_ubyte, Literal[32]] + pa_l: c.Array[ctypes.c_ubyte, Literal[20]] + reserved_at_34: c.Array[ctypes.c_ubyte, Literal[12]] +struct_mlx5_ifc_cmd_pas_bits.register_fields([('pa_h', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('pa_l', c.Array[ctypes.c_ubyte, Literal[20]], 32), ('reserved_at_34', c.Array[ctypes.c_ubyte, Literal[12]], 52)]) +@c.record +class struct_mlx5_ifc_uint64_bits(c.Struct): + SIZE = 64 + hi: c.Array[ctypes.c_ubyte, Literal[32]] + lo: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_uint64_bits.register_fields([('hi', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('lo', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +_anonenum11: dict[int, str] = {(MLX5_ADS_STAT_RATE_NO_LIMIT:=0): 'MLX5_ADS_STAT_RATE_NO_LIMIT', (MLX5_ADS_STAT_RATE_2_5GBPS:=7): 'MLX5_ADS_STAT_RATE_2_5GBPS', (MLX5_ADS_STAT_RATE_10GBPS:=8): 'MLX5_ADS_STAT_RATE_10GBPS', (MLX5_ADS_STAT_RATE_30GBPS:=9): 'MLX5_ADS_STAT_RATE_30GBPS', (MLX5_ADS_STAT_RATE_5GBPS:=10): 'MLX5_ADS_STAT_RATE_5GBPS', (MLX5_ADS_STAT_RATE_20GBPS:=11): 'MLX5_ADS_STAT_RATE_20GBPS', (MLX5_ADS_STAT_RATE_40GBPS:=12): 'MLX5_ADS_STAT_RATE_40GBPS', (MLX5_ADS_STAT_RATE_60GBPS:=13): 'MLX5_ADS_STAT_RATE_60GBPS', (MLX5_ADS_STAT_RATE_80GBPS:=14): 'MLX5_ADS_STAT_RATE_80GBPS', (MLX5_ADS_STAT_RATE_120GBPS:=15): 'MLX5_ADS_STAT_RATE_120GBPS'} +@c.record +class struct_mlx5_ifc_ads_bits(c.Struct): + SIZE = 352 + fl: c.Array[ctypes.c_ubyte, Literal[1]] + free_ar: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[14]] + pkey_index: c.Array[ctypes.c_ubyte, Literal[16]] + plane_index: c.Array[ctypes.c_ubyte, Literal[8]] + grh: c.Array[ctypes.c_ubyte, Literal[1]] + mlid: c.Array[ctypes.c_ubyte, Literal[7]] + rlid: c.Array[ctypes.c_ubyte, Literal[16]] + ack_timeout: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_45: c.Array[ctypes.c_ubyte, Literal[3]] + src_addr_index: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[4]] + stat_rate: c.Array[ctypes.c_ubyte, Literal[4]] + hop_limit: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[4]] + tclass: c.Array[ctypes.c_ubyte, Literal[8]] + flow_label: c.Array[ctypes.c_ubyte, Literal[20]] + rgid_rip: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[4]] + f_dscp: c.Array[ctypes.c_ubyte, Literal[1]] + f_ecn: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_106: c.Array[ctypes.c_ubyte, Literal[1]] + f_eth_prio: c.Array[ctypes.c_ubyte, Literal[1]] + ecn: c.Array[ctypes.c_ubyte, Literal[2]] + dscp: c.Array[ctypes.c_ubyte, Literal[6]] + udp_sport: c.Array[ctypes.c_ubyte, Literal[16]] + dei_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + eth_prio: c.Array[ctypes.c_ubyte, Literal[3]] + sl: c.Array[ctypes.c_ubyte, Literal[4]] + vhca_port_num: c.Array[ctypes.c_ubyte, Literal[8]] + rmac_47_32: c.Array[ctypes.c_ubyte, Literal[16]] + rmac_31_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_ads_bits.register_fields([('fl', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('free_ar', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[14]], 2), ('pkey_index', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('plane_index', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('grh', c.Array[ctypes.c_ubyte, Literal[1]], 40), ('mlid', c.Array[ctypes.c_ubyte, Literal[7]], 41), ('rlid', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('ack_timeout', c.Array[ctypes.c_ubyte, Literal[5]], 64), ('reserved_at_45', c.Array[ctypes.c_ubyte, Literal[3]], 69), ('src_addr_index', c.Array[ctypes.c_ubyte, Literal[8]], 72), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[4]], 80), ('stat_rate', c.Array[ctypes.c_ubyte, Literal[4]], 84), ('hop_limit', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[4]], 96), ('tclass', c.Array[ctypes.c_ubyte, Literal[8]], 100), ('flow_label', c.Array[ctypes.c_ubyte, Literal[20]], 108), ('rgid_rip', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 128), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[4]], 256), ('f_dscp', c.Array[ctypes.c_ubyte, Literal[1]], 260), ('f_ecn', c.Array[ctypes.c_ubyte, Literal[1]], 261), ('reserved_at_106', c.Array[ctypes.c_ubyte, Literal[1]], 262), ('f_eth_prio', c.Array[ctypes.c_ubyte, Literal[1]], 263), ('ecn', c.Array[ctypes.c_ubyte, Literal[2]], 264), ('dscp', c.Array[ctypes.c_ubyte, Literal[6]], 266), ('udp_sport', c.Array[ctypes.c_ubyte, Literal[16]], 272), ('dei_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 288), ('eth_prio', c.Array[ctypes.c_ubyte, Literal[3]], 289), ('sl', c.Array[ctypes.c_ubyte, Literal[4]], 292), ('vhca_port_num', c.Array[ctypes.c_ubyte, Literal[8]], 296), ('rmac_47_32', c.Array[ctypes.c_ubyte, Literal[16]], 304), ('rmac_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 320)]) +@c.record +class struct_mlx5_ifc_flow_table_nic_cap_bits(c.Struct): + SIZE = 32768 + nic_rx_multi_path_tirs: c.Array[ctypes.c_ubyte, Literal[1]] + nic_rx_multi_path_tirs_fts: c.Array[ctypes.c_ubyte, Literal[1]] + allow_sniffer_and_nic_rx_shared_tir: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3: c.Array[ctypes.c_ubyte, Literal[4]] + sw_owner_reformat_supported: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + encap_general_header: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[10]] + log_max_packet_reformat_context: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[6]] + max_encap_header_size: c.Array[ctypes.c_ubyte, Literal[10]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[448]] + flow_table_properties_nic_receive: struct_mlx5_ifc_flow_table_prop_layout_bits + flow_table_properties_nic_receive_rdma: struct_mlx5_ifc_flow_table_prop_layout_bits + flow_table_properties_nic_receive_sniffer: struct_mlx5_ifc_flow_table_prop_layout_bits + flow_table_properties_nic_transmit: struct_mlx5_ifc_flow_table_prop_layout_bits + flow_table_properties_nic_transmit_rdma: struct_mlx5_ifc_flow_table_prop_layout_bits + flow_table_properties_nic_transmit_sniffer: struct_mlx5_ifc_flow_table_prop_layout_bits + reserved_at_e00: c.Array[ctypes.c_ubyte, Literal[1536]] + ft_field_support_2_nic_receive: struct_mlx5_ifc_flow_table_fields_supported_2_bits + reserved_at_1480: c.Array[ctypes.c_ubyte, Literal[128]] + ft_field_support_2_nic_receive_rdma: struct_mlx5_ifc_flow_table_fields_supported_2_bits + reserved_at_1580: c.Array[ctypes.c_ubyte, Literal[640]] + ft_field_support_2_nic_transmit_rdma: struct_mlx5_ifc_flow_table_fields_supported_2_bits + reserved_at_1880: c.Array[ctypes.c_ubyte, Literal[1920]] + sw_steering_nic_rx_action_drop_icm_address: c.Array[ctypes.c_ubyte, Literal[64]] + sw_steering_nic_tx_action_drop_icm_address: c.Array[ctypes.c_ubyte, Literal[64]] + sw_steering_nic_tx_action_allow_icm_address: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_20c0: c.Array[ctypes.c_ubyte, Literal[24384]] +struct_mlx5_ifc_flow_table_nic_cap_bits.register_fields([('nic_rx_multi_path_tirs', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('nic_rx_multi_path_tirs_fts', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('allow_sniffer_and_nic_rx_shared_tir', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('reserved_at_3', c.Array[ctypes.c_ubyte, Literal[4]], 3), ('sw_owner_reformat_supported', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('encap_general_header', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[10]], 33), ('log_max_packet_reformat_context', c.Array[ctypes.c_ubyte, Literal[5]], 43), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[6]], 48), ('max_encap_header_size', c.Array[ctypes.c_ubyte, Literal[10]], 54), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[448]], 64), ('flow_table_properties_nic_receive', struct_mlx5_ifc_flow_table_prop_layout_bits, 512), ('flow_table_properties_nic_receive_rdma', struct_mlx5_ifc_flow_table_prop_layout_bits, 1024), ('flow_table_properties_nic_receive_sniffer', struct_mlx5_ifc_flow_table_prop_layout_bits, 1536), ('flow_table_properties_nic_transmit', struct_mlx5_ifc_flow_table_prop_layout_bits, 2048), ('flow_table_properties_nic_transmit_rdma', struct_mlx5_ifc_flow_table_prop_layout_bits, 2560), ('flow_table_properties_nic_transmit_sniffer', struct_mlx5_ifc_flow_table_prop_layout_bits, 3072), ('reserved_at_e00', c.Array[ctypes.c_ubyte, Literal[1536]], 3584), ('ft_field_support_2_nic_receive', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 5120), ('reserved_at_1480', c.Array[ctypes.c_ubyte, Literal[128]], 5248), ('ft_field_support_2_nic_receive_rdma', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 5376), ('reserved_at_1580', c.Array[ctypes.c_ubyte, Literal[640]], 5504), ('ft_field_support_2_nic_transmit_rdma', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 6144), ('reserved_at_1880', c.Array[ctypes.c_ubyte, Literal[1920]], 6272), ('sw_steering_nic_rx_action_drop_icm_address', c.Array[ctypes.c_ubyte, Literal[64]], 8192), ('sw_steering_nic_tx_action_drop_icm_address', c.Array[ctypes.c_ubyte, Literal[64]], 8256), ('sw_steering_nic_tx_action_allow_icm_address', c.Array[ctypes.c_ubyte, Literal[64]], 8320), ('reserved_at_20c0', c.Array[ctypes.c_ubyte, Literal[24384]], 8384)]) +@c.record +class struct_mlx5_ifc_port_selection_cap_bits(c.Struct): + SIZE = 32768 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + port_select_flow_table: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_11: c.Array[ctypes.c_ubyte, Literal[1]] + port_select_flow_table_bypass: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_13: c.Array[ctypes.c_ubyte, Literal[13]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[480]] + flow_table_properties_port_selection: struct_mlx5_ifc_flow_table_prop_layout_bits + ft_field_support_2_port_selection: struct_mlx5_ifc_flow_table_fields_supported_2_bits + reserved_at_480: c.Array[ctypes.c_ubyte, Literal[31616]] +struct_mlx5_ifc_port_selection_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('port_select_flow_table', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('reserved_at_11', c.Array[ctypes.c_ubyte, Literal[1]], 17), ('port_select_flow_table_bypass', c.Array[ctypes.c_ubyte, Literal[1]], 18), ('reserved_at_13', c.Array[ctypes.c_ubyte, Literal[13]], 19), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[480]], 32), ('flow_table_properties_port_selection', struct_mlx5_ifc_flow_table_prop_layout_bits, 512), ('ft_field_support_2_port_selection', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 1024), ('reserved_at_480', c.Array[ctypes.c_ubyte, Literal[31616]], 1152)]) +_anonenum12: dict[int, str] = {(MLX5_FDB_TO_VPORT_REG_C_0:=1): 'MLX5_FDB_TO_VPORT_REG_C_0', (MLX5_FDB_TO_VPORT_REG_C_1:=2): 'MLX5_FDB_TO_VPORT_REG_C_1', (MLX5_FDB_TO_VPORT_REG_C_2:=4): 'MLX5_FDB_TO_VPORT_REG_C_2', (MLX5_FDB_TO_VPORT_REG_C_3:=8): 'MLX5_FDB_TO_VPORT_REG_C_3', (MLX5_FDB_TO_VPORT_REG_C_4:=16): 'MLX5_FDB_TO_VPORT_REG_C_4', (MLX5_FDB_TO_VPORT_REG_C_5:=32): 'MLX5_FDB_TO_VPORT_REG_C_5', (MLX5_FDB_TO_VPORT_REG_C_6:=64): 'MLX5_FDB_TO_VPORT_REG_C_6', (MLX5_FDB_TO_VPORT_REG_C_7:=128): 'MLX5_FDB_TO_VPORT_REG_C_7'} +@c.record +class struct_mlx5_ifc_flow_table_eswitch_cap_bits(c.Struct): + SIZE = 32768 + fdb_to_vport_reg_c_id: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[5]] + fdb_uplink_hairpin: c.Array[ctypes.c_ubyte, Literal[1]] + fdb_multi_path_any_table_limit_regc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_f: c.Array[ctypes.c_ubyte, Literal[1]] + fdb_dynamic_tunnel: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_11: c.Array[ctypes.c_ubyte, Literal[1]] + fdb_multi_path_any_table: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_13: c.Array[ctypes.c_ubyte, Literal[2]] + fdb_modify_header_fwd_to_table: c.Array[ctypes.c_ubyte, Literal[1]] + fdb_ipv4_ttl_modify: c.Array[ctypes.c_ubyte, Literal[1]] + flow_source: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[2]] + multi_fdb_encap: c.Array[ctypes.c_ubyte, Literal[1]] + egress_acl_forward_to_vport: c.Array[ctypes.c_ubyte, Literal[1]] + fdb_multi_path_to_table: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1d: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[480]] + flow_table_properties_nic_esw_fdb: struct_mlx5_ifc_flow_table_prop_layout_bits + flow_table_properties_esw_acl_ingress: struct_mlx5_ifc_flow_table_prop_layout_bits + flow_table_properties_esw_acl_egress: struct_mlx5_ifc_flow_table_prop_layout_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[3072]] + ft_field_support_2_esw_fdb: struct_mlx5_ifc_flow_table_fields_supported_2_bits + ft_field_bitmask_support_2_esw_fdb: struct_mlx5_ifc_flow_table_fields_supported_2_bits + reserved_at_1500: c.Array[ctypes.c_ubyte, Literal[768]] + sw_steering_fdb_action_drop_icm_address_rx: c.Array[ctypes.c_ubyte, Literal[64]] + sw_steering_fdb_action_drop_icm_address_tx: c.Array[ctypes.c_ubyte, Literal[64]] + sw_steering_uplink_icm_address_rx: c.Array[ctypes.c_ubyte, Literal[64]] + sw_steering_uplink_icm_address_tx: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_1900: c.Array[ctypes.c_ubyte, Literal[26368]] +struct_mlx5_ifc_flow_table_eswitch_cap_bits.register_fields([('fdb_to_vport_reg_c_id', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[5]], 8), ('fdb_uplink_hairpin', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('fdb_multi_path_any_table_limit_regc', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('reserved_at_f', c.Array[ctypes.c_ubyte, Literal[1]], 15), ('fdb_dynamic_tunnel', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('reserved_at_11', c.Array[ctypes.c_ubyte, Literal[1]], 17), ('fdb_multi_path_any_table', c.Array[ctypes.c_ubyte, Literal[1]], 18), ('reserved_at_13', c.Array[ctypes.c_ubyte, Literal[2]], 19), ('fdb_modify_header_fwd_to_table', c.Array[ctypes.c_ubyte, Literal[1]], 21), ('fdb_ipv4_ttl_modify', c.Array[ctypes.c_ubyte, Literal[1]], 22), ('flow_source', c.Array[ctypes.c_ubyte, Literal[1]], 23), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[2]], 24), ('multi_fdb_encap', c.Array[ctypes.c_ubyte, Literal[1]], 26), ('egress_acl_forward_to_vport', c.Array[ctypes.c_ubyte, Literal[1]], 27), ('fdb_multi_path_to_table', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('reserved_at_1d', c.Array[ctypes.c_ubyte, Literal[3]], 29), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[480]], 32), ('flow_table_properties_nic_esw_fdb', struct_mlx5_ifc_flow_table_prop_layout_bits, 512), ('flow_table_properties_esw_acl_ingress', struct_mlx5_ifc_flow_table_prop_layout_bits, 1024), ('flow_table_properties_esw_acl_egress', struct_mlx5_ifc_flow_table_prop_layout_bits, 1536), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[3072]], 2048), ('ft_field_support_2_esw_fdb', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 5120), ('ft_field_bitmask_support_2_esw_fdb', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 5248), ('reserved_at_1500', c.Array[ctypes.c_ubyte, Literal[768]], 5376), ('sw_steering_fdb_action_drop_icm_address_rx', c.Array[ctypes.c_ubyte, Literal[64]], 6144), ('sw_steering_fdb_action_drop_icm_address_tx', c.Array[ctypes.c_ubyte, Literal[64]], 6208), ('sw_steering_uplink_icm_address_rx', c.Array[ctypes.c_ubyte, Literal[64]], 6272), ('sw_steering_uplink_icm_address_tx', c.Array[ctypes.c_ubyte, Literal[64]], 6336), ('reserved_at_1900', c.Array[ctypes.c_ubyte, Literal[26368]], 6400)]) +@c.record +class struct_mlx5_ifc_wqe_based_flow_table_cap_bits(c.Struct): + SIZE = 480 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_num_ste: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_num_stc: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_num_rtc: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_num_header_modify_pattern: c.Array[ctypes.c_ubyte, Literal[5]] + rtc_hash_split_table: c.Array[ctypes.c_ubyte, Literal[1]] + rtc_linear_lookup_table: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[1]] + stc_alloc_log_granularity: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_28: c.Array[ctypes.c_ubyte, Literal[3]] + stc_alloc_log_max: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[3]] + ste_alloc_log_granularity: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[3]] + ste_alloc_log_max: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[11]] + rtc_reparse_mode: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[3]] + rtc_index_mode: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_58: c.Array[ctypes.c_ubyte, Literal[3]] + rtc_log_depth_max: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + ste_format: c.Array[ctypes.c_ubyte, Literal[16]] + stc_action_type: c.Array[ctypes.c_ubyte, Literal[128]] + header_insert_type: c.Array[ctypes.c_ubyte, Literal[16]] + header_remove_type: c.Array[ctypes.c_ubyte, Literal[16]] + trivial_match_definer: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[27]] + rtc_max_num_hash_definer_gen_wqe: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[24]] + access_index_mode: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[16]] + ste_format_gen_wqe: c.Array[ctypes.c_ubyte, Literal[16]] + linear_match_definer_reg_c3: c.Array[ctypes.c_ubyte, Literal[32]] + fdb_jump_to_tir_stc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1c1: c.Array[ctypes.c_ubyte, Literal[31]] +struct_mlx5_ifc_wqe_based_flow_table_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('log_max_num_ste', c.Array[ctypes.c_ubyte, Literal[5]], 3), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[3]], 8), ('log_max_num_stc', c.Array[ctypes.c_ubyte, Literal[5]], 11), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[3]], 16), ('log_max_num_rtc', c.Array[ctypes.c_ubyte, Literal[5]], 19), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[3]], 24), ('log_max_num_header_modify_pattern', c.Array[ctypes.c_ubyte, Literal[5]], 27), ('rtc_hash_split_table', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('rtc_linear_lookup_table', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('stc_alloc_log_granularity', c.Array[ctypes.c_ubyte, Literal[5]], 35), ('reserved_at_28', c.Array[ctypes.c_ubyte, Literal[3]], 40), ('stc_alloc_log_max', c.Array[ctypes.c_ubyte, Literal[5]], 43), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[3]], 48), ('ste_alloc_log_granularity', c.Array[ctypes.c_ubyte, Literal[5]], 51), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[3]], 56), ('ste_alloc_log_max', c.Array[ctypes.c_ubyte, Literal[5]], 59), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[11]], 64), ('rtc_reparse_mode', c.Array[ctypes.c_ubyte, Literal[5]], 75), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[3]], 80), ('rtc_index_mode', c.Array[ctypes.c_ubyte, Literal[5]], 83), ('reserved_at_58', c.Array[ctypes.c_ubyte, Literal[3]], 88), ('rtc_log_depth_max', c.Array[ctypes.c_ubyte, Literal[5]], 91), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('ste_format', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('stc_action_type', c.Array[ctypes.c_ubyte, Literal[128]], 128), ('header_insert_type', c.Array[ctypes.c_ubyte, Literal[16]], 256), ('header_remove_type', c.Array[ctypes.c_ubyte, Literal[16]], 272), ('trivial_match_definer', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[27]], 320), ('rtc_max_num_hash_definer_gen_wqe', c.Array[ctypes.c_ubyte, Literal[5]], 347), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[24]], 352), ('access_index_mode', c.Array[ctypes.c_ubyte, Literal[8]], 376), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[16]], 384), ('ste_format_gen_wqe', c.Array[ctypes.c_ubyte, Literal[16]], 400), ('linear_match_definer_reg_c3', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('fdb_jump_to_tir_stc', c.Array[ctypes.c_ubyte, Literal[1]], 448), ('reserved_at_1c1', c.Array[ctypes.c_ubyte, Literal[31]], 449)]) +@c.record +class struct_mlx5_ifc_esw_cap_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[29]] + merged_eswitch: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1e: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[64]] + esw_manager_vport_number_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_61: c.Array[ctypes.c_ubyte, Literal[15]] + esw_manager_vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[1920]] +struct_mlx5_ifc_esw_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[29]], 0), ('merged_eswitch', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('reserved_at_1e', c.Array[ctypes.c_ubyte, Literal[2]], 30), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[64]], 32), ('esw_manager_vport_number_valid', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('reserved_at_61', c.Array[ctypes.c_ubyte, Literal[15]], 97), ('esw_manager_vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[1920]], 128)]) +_anonenum13: dict[int, str] = {(MLX5_COUNTER_SOURCE_ESWITCH:=0): 'MLX5_COUNTER_SOURCE_ESWITCH', (MLX5_COUNTER_FLOW_ESWITCH:=1): 'MLX5_COUNTER_FLOW_ESWITCH'} +@c.record +class struct_mlx5_ifc_e_switch_cap_bits(c.Struct): + SIZE = 2048 + vport_svlan_strip: c.Array[ctypes.c_ubyte, Literal[1]] + vport_cvlan_strip: c.Array[ctypes.c_ubyte, Literal[1]] + vport_svlan_insert: c.Array[ctypes.c_ubyte, Literal[1]] + vport_cvlan_insert_if_not_exist: c.Array[ctypes.c_ubyte, Literal[1]] + vport_cvlan_insert_overwrite: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5: c.Array[ctypes.c_ubyte, Literal[1]] + vport_cvlan_insert_always: c.Array[ctypes.c_ubyte, Literal[1]] + esw_shared_ingress_acl: c.Array[ctypes.c_ubyte, Literal[1]] + esw_uplink_ingress_acl: c.Array[ctypes.c_ubyte, Literal[1]] + root_ft_on_other_esw: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_a: c.Array[ctypes.c_ubyte, Literal[15]] + esw_functions_changed: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1a: c.Array[ctypes.c_ubyte, Literal[1]] + ecpf_vport_exists: c.Array[ctypes.c_ubyte, Literal[1]] + counter_eswitch_affinity: c.Array[ctypes.c_ubyte, Literal[1]] + merged_eswitch: c.Array[ctypes.c_ubyte, Literal[1]] + nic_vport_node_guid_modify: c.Array[ctypes.c_ubyte, Literal[1]] + nic_vport_port_guid_modify: c.Array[ctypes.c_ubyte, Literal[1]] + vxlan_encap_decap: c.Array[ctypes.c_ubyte, Literal[1]] + nvgre_encap_decap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_fdb_encap_uplink: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_packet_reformat_context: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_2b: c.Array[ctypes.c_ubyte, Literal[6]] + max_encap_header_size: c.Array[ctypes.c_ubyte, Literal[10]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[11]] + log_max_esw_sf: c.Array[ctypes.c_ubyte, Literal[5]] + esw_sf_base_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[1952]] +struct_mlx5_ifc_e_switch_cap_bits.register_fields([('vport_svlan_strip', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('vport_cvlan_strip', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('vport_svlan_insert', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('vport_cvlan_insert_if_not_exist', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('vport_cvlan_insert_overwrite', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('reserved_at_5', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('vport_cvlan_insert_always', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('esw_shared_ingress_acl', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('esw_uplink_ingress_acl', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('root_ft_on_other_esw', c.Array[ctypes.c_ubyte, Literal[1]], 9), ('reserved_at_a', c.Array[ctypes.c_ubyte, Literal[15]], 10), ('esw_functions_changed', c.Array[ctypes.c_ubyte, Literal[1]], 25), ('reserved_at_1a', c.Array[ctypes.c_ubyte, Literal[1]], 26), ('ecpf_vport_exists', c.Array[ctypes.c_ubyte, Literal[1]], 27), ('counter_eswitch_affinity', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('merged_eswitch', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('nic_vport_node_guid_modify', c.Array[ctypes.c_ubyte, Literal[1]], 30), ('nic_vport_port_guid_modify', c.Array[ctypes.c_ubyte, Literal[1]], 31), ('vxlan_encap_decap', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('nvgre_encap_decap', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('log_max_fdb_encap_uplink', c.Array[ctypes.c_ubyte, Literal[5]], 35), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[3]], 40), ('log_max_packet_reformat_context', c.Array[ctypes.c_ubyte, Literal[5]], 43), ('reserved_2b', c.Array[ctypes.c_ubyte, Literal[6]], 48), ('max_encap_header_size', c.Array[ctypes.c_ubyte, Literal[10]], 54), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[11]], 64), ('log_max_esw_sf', c.Array[ctypes.c_ubyte, Literal[5]], 75), ('esw_sf_base_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[1952]], 96)]) +@c.record +class struct_mlx5_ifc_qos_cap_bits(c.Struct): + SIZE = 2048 + packet_pacing: c.Array[ctypes.c_ubyte, Literal[1]] + esw_scheduling: c.Array[ctypes.c_ubyte, Literal[1]] + esw_bw_share: c.Array[ctypes.c_ubyte, Literal[1]] + esw_rate_limit: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[1]] + packet_pacing_burst_bound: c.Array[ctypes.c_ubyte, Literal[1]] + packet_pacing_typical_size: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_7: c.Array[ctypes.c_ubyte, Literal[1]] + nic_sq_scheduling: c.Array[ctypes.c_ubyte, Literal[1]] + nic_bw_share: c.Array[ctypes.c_ubyte, Literal[1]] + nic_rate_limit: c.Array[ctypes.c_ubyte, Literal[1]] + packet_pacing_uid: c.Array[ctypes.c_ubyte, Literal[1]] + log_esw_max_sched_depth: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[9]] + esw_cross_esw_sched: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2a: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_qos_nic_queue_group: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[16]] + packet_pacing_max_rate: c.Array[ctypes.c_ubyte, Literal[32]] + packet_pacing_min_rate: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[11]] + log_esw_max_rate_limit: c.Array[ctypes.c_ubyte, Literal[5]] + packet_pacing_rate_table_size: c.Array[ctypes.c_ubyte, Literal[16]] + esw_element_type: c.Array[ctypes.c_ubyte, Literal[16]] + esw_tsar_type: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[16]] + max_qos_para_vport: c.Array[ctypes.c_ubyte, Literal[16]] + max_tsar_bw_share: c.Array[ctypes.c_ubyte, Literal[32]] + nic_element_type: c.Array[ctypes.c_ubyte, Literal[16]] + nic_tsar_type: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[3]] + log_meter_aso_granularity: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_128: c.Array[ctypes.c_ubyte, Literal[3]] + log_meter_aso_max_alloc: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_130: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_num_meter_aso: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_138: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[1728]] +struct_mlx5_ifc_qos_cap_bits.register_fields([('packet_pacing', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('esw_scheduling', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('esw_bw_share', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('esw_rate_limit', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('packet_pacing_burst_bound', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('packet_pacing_typical_size', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('reserved_at_7', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('nic_sq_scheduling', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('nic_bw_share', c.Array[ctypes.c_ubyte, Literal[1]], 9), ('nic_rate_limit', c.Array[ctypes.c_ubyte, Literal[1]], 10), ('packet_pacing_uid', c.Array[ctypes.c_ubyte, Literal[1]], 11), ('log_esw_max_sched_depth', c.Array[ctypes.c_ubyte, Literal[4]], 12), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[9]], 32), ('esw_cross_esw_sched', c.Array[ctypes.c_ubyte, Literal[1]], 41), ('reserved_at_2a', c.Array[ctypes.c_ubyte, Literal[1]], 42), ('log_max_qos_nic_queue_group', c.Array[ctypes.c_ubyte, Literal[5]], 43), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('packet_pacing_max_rate', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('packet_pacing_min_rate', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[11]], 128), ('log_esw_max_rate_limit', c.Array[ctypes.c_ubyte, Literal[5]], 139), ('packet_pacing_rate_table_size', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('esw_element_type', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('esw_tsar_type', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[16]], 192), ('max_qos_para_vport', c.Array[ctypes.c_ubyte, Literal[16]], 208), ('max_tsar_bw_share', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('nic_element_type', c.Array[ctypes.c_ubyte, Literal[16]], 256), ('nic_tsar_type', c.Array[ctypes.c_ubyte, Literal[16]], 272), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[3]], 288), ('log_meter_aso_granularity', c.Array[ctypes.c_ubyte, Literal[5]], 291), ('reserved_at_128', c.Array[ctypes.c_ubyte, Literal[3]], 296), ('log_meter_aso_max_alloc', c.Array[ctypes.c_ubyte, Literal[5]], 299), ('reserved_at_130', c.Array[ctypes.c_ubyte, Literal[3]], 304), ('log_max_num_meter_aso', c.Array[ctypes.c_ubyte, Literal[5]], 307), ('reserved_at_138', c.Array[ctypes.c_ubyte, Literal[8]], 312), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[1728]], 320)]) +@c.record +class struct_mlx5_ifc_debug_cap_bits(c.Struct): + SIZE = 2048 + core_dump_general: c.Array[ctypes.c_ubyte, Literal[1]] + core_dump_qp: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[7]] + resource_dump: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_a: c.Array[ctypes.c_ubyte, Literal[22]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[2]] + stall_detect: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_23: c.Array[ctypes.c_ubyte, Literal[29]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[1984]] +struct_mlx5_ifc_debug_cap_bits.register_fields([('core_dump_general', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('core_dump_qp', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[7]], 2), ('resource_dump', c.Array[ctypes.c_ubyte, Literal[1]], 9), ('reserved_at_a', c.Array[ctypes.c_ubyte, Literal[22]], 10), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[2]], 32), ('stall_detect', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('reserved_at_23', c.Array[ctypes.c_ubyte, Literal[29]], 35), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[1984]], 64)]) +@c.record +class struct_mlx5_ifc_per_protocol_networking_offload_caps_bits(c.Struct): + SIZE = 2048 + csum_cap: c.Array[ctypes.c_ubyte, Literal[1]] + vlan_cap: c.Array[ctypes.c_ubyte, Literal[1]] + lro_cap: c.Array[ctypes.c_ubyte, Literal[1]] + lro_psh_flag: c.Array[ctypes.c_ubyte, Literal[1]] + lro_time_stamp: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5: c.Array[ctypes.c_ubyte, Literal[2]] + wqe_vlan_insert: c.Array[ctypes.c_ubyte, Literal[1]] + self_lb_en_modifiable: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_9: c.Array[ctypes.c_ubyte, Literal[2]] + max_lso_cap: c.Array[ctypes.c_ubyte, Literal[5]] + multi_pkt_send_wqe: c.Array[ctypes.c_ubyte, Literal[2]] + wqe_inline_mode: c.Array[ctypes.c_ubyte, Literal[2]] + rss_ind_tbl_cap: c.Array[ctypes.c_ubyte, Literal[4]] + reg_umr_sq: c.Array[ctypes.c_ubyte, Literal[1]] + scatter_fcs: c.Array[ctypes.c_ubyte, Literal[1]] + enhanced_multi_pkt_send_wqe: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_lso_const_out_ip_id: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_lro_gre: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_lro_vxlan: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_gre: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_vxlan: c.Array[ctypes.c_ubyte, Literal[1]] + swp: c.Array[ctypes.c_ubyte, Literal[1]] + swp_csum: c.Array[ctypes.c_ubyte, Literal[1]] + swp_lso: c.Array[ctypes.c_ubyte, Literal[1]] + cqe_checksum_full: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_geneve_tx: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_mpls_over_udp: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_mpls_over_gre: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_vxlan_gpe: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_ipv4_over_vxlan: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_ip_over_ip: c.Array[ctypes.c_ubyte, Literal[1]] + insert_trailer: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2b: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_ip_over_ip_rx: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_ip_over_ip_tx: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2e: c.Array[ctypes.c_ubyte, Literal[2]] + max_vxlan_udp_ports: c.Array[ctypes.c_ubyte, Literal[8]] + swp_csum_l4_partial: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_39: c.Array[ctypes.c_ubyte, Literal[5]] + max_geneve_opt_len: c.Array[ctypes.c_ubyte, Literal[1]] + tunnel_stateless_geneve_rx: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + lro_min_mss_size: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[288]] + lro_timer_supported_periods: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]] + reserved_at_200: c.Array[ctypes.c_ubyte, Literal[1536]] +struct_mlx5_ifc_per_protocol_networking_offload_caps_bits.register_fields([('csum_cap', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('vlan_cap', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('lro_cap', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('lro_psh_flag', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('lro_time_stamp', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('reserved_at_5', c.Array[ctypes.c_ubyte, Literal[2]], 5), ('wqe_vlan_insert', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('self_lb_en_modifiable', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('reserved_at_9', c.Array[ctypes.c_ubyte, Literal[2]], 9), ('max_lso_cap', c.Array[ctypes.c_ubyte, Literal[5]], 11), ('multi_pkt_send_wqe', c.Array[ctypes.c_ubyte, Literal[2]], 16), ('wqe_inline_mode', c.Array[ctypes.c_ubyte, Literal[2]], 18), ('rss_ind_tbl_cap', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reg_umr_sq', c.Array[ctypes.c_ubyte, Literal[1]], 24), ('scatter_fcs', c.Array[ctypes.c_ubyte, Literal[1]], 25), ('enhanced_multi_pkt_send_wqe', c.Array[ctypes.c_ubyte, Literal[1]], 26), ('tunnel_lso_const_out_ip_id', c.Array[ctypes.c_ubyte, Literal[1]], 27), ('tunnel_lro_gre', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('tunnel_lro_vxlan', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('tunnel_stateless_gre', c.Array[ctypes.c_ubyte, Literal[1]], 30), ('tunnel_stateless_vxlan', c.Array[ctypes.c_ubyte, Literal[1]], 31), ('swp', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('swp_csum', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('swp_lso', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('cqe_checksum_full', c.Array[ctypes.c_ubyte, Literal[1]], 35), ('tunnel_stateless_geneve_tx', c.Array[ctypes.c_ubyte, Literal[1]], 36), ('tunnel_stateless_mpls_over_udp', c.Array[ctypes.c_ubyte, Literal[1]], 37), ('tunnel_stateless_mpls_over_gre', c.Array[ctypes.c_ubyte, Literal[1]], 38), ('tunnel_stateless_vxlan_gpe', c.Array[ctypes.c_ubyte, Literal[1]], 39), ('tunnel_stateless_ipv4_over_vxlan', c.Array[ctypes.c_ubyte, Literal[1]], 40), ('tunnel_stateless_ip_over_ip', c.Array[ctypes.c_ubyte, Literal[1]], 41), ('insert_trailer', c.Array[ctypes.c_ubyte, Literal[1]], 42), ('reserved_at_2b', c.Array[ctypes.c_ubyte, Literal[1]], 43), ('tunnel_stateless_ip_over_ip_rx', c.Array[ctypes.c_ubyte, Literal[1]], 44), ('tunnel_stateless_ip_over_ip_tx', c.Array[ctypes.c_ubyte, Literal[1]], 45), ('reserved_at_2e', c.Array[ctypes.c_ubyte, Literal[2]], 46), ('max_vxlan_udp_ports', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('swp_csum_l4_partial', c.Array[ctypes.c_ubyte, Literal[1]], 56), ('reserved_at_39', c.Array[ctypes.c_ubyte, Literal[5]], 57), ('max_geneve_opt_len', c.Array[ctypes.c_ubyte, Literal[1]], 62), ('tunnel_stateless_geneve_rx', c.Array[ctypes.c_ubyte, Literal[1]], 63), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('lro_min_mss_size', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[288]], 96), ('lro_timer_supported_periods', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]], 384), ('reserved_at_200', c.Array[ctypes.c_ubyte, Literal[1536]], 512)]) +_anonenum14: dict[int, str] = {(MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING:=0): 'MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING', (MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME:=1): 'MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME', (MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME:=2): 'MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME'} +@c.record +class struct_mlx5_ifc_roce_cap_bits(c.Struct): + SIZE = 2048 + roce_apm: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[3]] + sw_r_roce_src_udp_port: c.Array[ctypes.c_ubyte, Literal[1]] + fl_rc_qp_when_roce_disabled: c.Array[ctypes.c_ubyte, Literal[1]] + fl_rc_qp_when_roce_enabled: c.Array[ctypes.c_ubyte, Literal[1]] + roce_cc_general: c.Array[ctypes.c_ubyte, Literal[1]] + qp_ooo_transmit_default: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_9: c.Array[ctypes.c_ubyte, Literal[21]] + qp_ts_format: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[12]] + l3_type: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_90: c.Array[ctypes.c_ubyte, Literal[8]] + roce_version: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[16]] + r_roce_dest_udp_port: c.Array[ctypes.c_ubyte, Literal[16]] + r_roce_max_src_udp_port: c.Array[ctypes.c_ubyte, Literal[16]] + r_roce_min_src_udp_port: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[16]] + roce_address_table_size: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[1792]] +struct_mlx5_ifc_roce_cap_bits.register_fields([('roce_apm', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[3]], 1), ('sw_r_roce_src_udp_port', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('fl_rc_qp_when_roce_disabled', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('fl_rc_qp_when_roce_enabled', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('roce_cc_general', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('qp_ooo_transmit_default', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('reserved_at_9', c.Array[ctypes.c_ubyte, Literal[21]], 9), ('qp_ts_format', c.Array[ctypes.c_ubyte, Literal[2]], 30), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[12]], 128), ('l3_type', c.Array[ctypes.c_ubyte, Literal[4]], 140), ('reserved_at_90', c.Array[ctypes.c_ubyte, Literal[8]], 144), ('roce_version', c.Array[ctypes.c_ubyte, Literal[8]], 152), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('r_roce_dest_udp_port', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('r_roce_max_src_udp_port', c.Array[ctypes.c_ubyte, Literal[16]], 192), ('r_roce_min_src_udp_port', c.Array[ctypes.c_ubyte, Literal[16]], 208), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('roce_address_table_size', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[1792]], 256)]) +@c.record +class struct_mlx5_ifc_sync_steering_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] +struct_mlx5_ifc_sync_steering_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64)]) +@c.record +class struct_mlx5_ifc_sync_steering_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_sync_steering_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_sync_crypto_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + crypto_type: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_sync_crypto_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('crypto_type', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[128]], 128)]) +@c.record +class struct_mlx5_ifc_sync_crypto_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_sync_crypto_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_device_mem_cap_bits(c.Struct): + SIZE = 2048 + memic: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[11]] + log_min_memic_alloc_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[8]] + log_max_memic_addr_alignment: c.Array[ctypes.c_ubyte, Literal[8]] + memic_bar_start_addr: c.Array[ctypes.c_ubyte, Literal[64]] + memic_bar_size: c.Array[ctypes.c_ubyte, Literal[32]] + max_memic_size: c.Array[ctypes.c_ubyte, Literal[32]] + steering_sw_icm_start_address: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[8]] + log_header_modify_sw_icm_size: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_110: c.Array[ctypes.c_ubyte, Literal[2]] + log_sw_icm_alloc_granularity: c.Array[ctypes.c_ubyte, Literal[6]] + log_steering_sw_icm_size: c.Array[ctypes.c_ubyte, Literal[8]] + log_indirect_encap_sw_icm_size: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_128: c.Array[ctypes.c_ubyte, Literal[16]] + log_header_modify_pattern_sw_icm_size: c.Array[ctypes.c_ubyte, Literal[8]] + header_modify_sw_icm_start_address: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[64]] + header_modify_pattern_sw_icm_start_address: c.Array[ctypes.c_ubyte, Literal[64]] + memic_operations: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_220: c.Array[ctypes.c_ubyte, Literal[32]] + indirect_encap_sw_icm_start_address: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[1408]] +struct_mlx5_ifc_device_mem_cap_bits.register_fields([('memic', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[31]], 1), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[11]], 32), ('log_min_memic_alloc_size', c.Array[ctypes.c_ubyte, Literal[5]], 43), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('log_max_memic_addr_alignment', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('memic_bar_start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('memic_bar_size', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('max_memic_size', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('steering_sw_icm_start_address', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('log_header_modify_sw_icm_size', c.Array[ctypes.c_ubyte, Literal[8]], 264), ('reserved_at_110', c.Array[ctypes.c_ubyte, Literal[2]], 272), ('log_sw_icm_alloc_granularity', c.Array[ctypes.c_ubyte, Literal[6]], 274), ('log_steering_sw_icm_size', c.Array[ctypes.c_ubyte, Literal[8]], 280), ('log_indirect_encap_sw_icm_size', c.Array[ctypes.c_ubyte, Literal[8]], 288), ('reserved_at_128', c.Array[ctypes.c_ubyte, Literal[16]], 296), ('log_header_modify_pattern_sw_icm_size', c.Array[ctypes.c_ubyte, Literal[8]], 312), ('header_modify_sw_icm_start_address', c.Array[ctypes.c_ubyte, Literal[64]], 320), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[64]], 384), ('header_modify_pattern_sw_icm_start_address', c.Array[ctypes.c_ubyte, Literal[64]], 448), ('memic_operations', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('reserved_at_220', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('indirect_encap_sw_icm_start_address', c.Array[ctypes.c_ubyte, Literal[64]], 576), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[1408]], 640)]) +@c.record +class struct_mlx5_ifc_device_event_cap_bits(c.Struct): + SIZE = 512 + user_affiliated_events: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[4]] + user_unaffiliated_events: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[4]] +struct_mlx5_ifc_device_event_cap_bits.register_fields([('user_affiliated_events', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[4]], 0), ('user_unaffiliated_events', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[4]], 256)]) +@c.record +class struct_mlx5_ifc_virtio_emulation_cap_bits(c.Struct): + SIZE = 2048 + desc_tunnel_offload_type: c.Array[ctypes.c_ubyte, Literal[1]] + eth_frame_offload_type: c.Array[ctypes.c_ubyte, Literal[1]] + virtio_version_1_0: c.Array[ctypes.c_ubyte, Literal[1]] + device_features_bits_mask: c.Array[ctypes.c_ubyte, Literal[13]] + event_mode: c.Array[ctypes.c_ubyte, Literal[8]] + virtio_queue_type: c.Array[ctypes.c_ubyte, Literal[8]] + max_tunnel_desc: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[3]] + log_doorbell_stride: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[3]] + log_doorbell_bar_size: c.Array[ctypes.c_ubyte, Literal[5]] + doorbell_bar_offset: c.Array[ctypes.c_ubyte, Literal[64]] + max_emulated_devices: c.Array[ctypes.c_ubyte, Literal[8]] + max_num_virtio_queues: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[19]] + desc_group_mkey_supported: c.Array[ctypes.c_ubyte, Literal[1]] + freeze_to_rdy_supported: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_d5: c.Array[ctypes.c_ubyte, Literal[11]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] + umem_1_buffer_param_a: c.Array[ctypes.c_ubyte, Literal[32]] + umem_1_buffer_param_b: c.Array[ctypes.c_ubyte, Literal[32]] + umem_2_buffer_param_a: c.Array[ctypes.c_ubyte, Literal[32]] + umem_2_buffer_param_b: c.Array[ctypes.c_ubyte, Literal[32]] + umem_3_buffer_param_a: c.Array[ctypes.c_ubyte, Literal[32]] + umem_3_buffer_param_b: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[1600]] +struct_mlx5_ifc_virtio_emulation_cap_bits.register_fields([('desc_tunnel_offload_type', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('eth_frame_offload_type', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('virtio_version_1_0', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('device_features_bits_mask', c.Array[ctypes.c_ubyte, Literal[13]], 3), ('event_mode', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('virtio_queue_type', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('max_tunnel_desc', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[3]], 48), ('log_doorbell_stride', c.Array[ctypes.c_ubyte, Literal[5]], 51), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[3]], 56), ('log_doorbell_bar_size', c.Array[ctypes.c_ubyte, Literal[5]], 59), ('doorbell_bar_offset', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('max_emulated_devices', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('max_num_virtio_queues', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[19]], 192), ('desc_group_mkey_supported', c.Array[ctypes.c_ubyte, Literal[1]], 211), ('freeze_to_rdy_supported', c.Array[ctypes.c_ubyte, Literal[1]], 212), ('reserved_at_d5', c.Array[ctypes.c_ubyte, Literal[11]], 213), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('umem_1_buffer_param_a', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('umem_1_buffer_param_b', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('umem_2_buffer_param_a', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('umem_2_buffer_param_b', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('umem_3_buffer_param_a', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('umem_3_buffer_param_b', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[1600]], 448)]) +_anonenum15: dict[int, str] = {(MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_1_BYTE:=0): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_1_BYTE', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_2_BYTES:=2): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_2_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_4_BYTES:=4): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_4_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_8_BYTES:=8): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_8_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_16_BYTES:=16): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_16_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_32_BYTES:=32): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_32_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_64_BYTES:=64): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_64_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_128_BYTES:=128): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_128_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_256_BYTES:=256): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_QP_256_BYTES'} +_anonenum16: dict[int, str] = {(MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_1_BYTE:=1): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_1_BYTE', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_2_BYTES:=2): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_2_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_4_BYTES:=4): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_4_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_8_BYTES:=8): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_8_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_16_BYTES:=16): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_16_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_32_BYTES:=32): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_32_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_64_BYTES:=64): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_64_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_128_BYTES:=128): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_128_BYTES', (MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_256_BYTES:=256): 'MLX5_ATOMIC_CAPS_ATOMIC_SIZE_DC_256_BYTES'} +@c.record +class struct_mlx5_ifc_atomic_caps_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[64]] + atomic_req_8B_endianness_mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[4]] + supported_atomic_req_8B_endianness_mode_1: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_47: c.Array[ctypes.c_ubyte, Literal[25]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[16]] + atomic_operations: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[16]] + atomic_size_qp: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[16]] + atomic_size_dc: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[1824]] +struct_mlx5_ifc_atomic_caps_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('atomic_req_8B_endianness_mode', c.Array[ctypes.c_ubyte, Literal[2]], 64), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[4]], 66), ('supported_atomic_req_8B_endianness_mode_1', c.Array[ctypes.c_ubyte, Literal[1]], 70), ('reserved_at_47', c.Array[ctypes.c_ubyte, Literal[25]], 71), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('atomic_operations', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('atomic_size_qp', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[16]], 192), ('atomic_size_dc', c.Array[ctypes.c_ubyte, Literal[16]], 208), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[1824]], 224)]) +@c.record +class struct_mlx5_ifc_odp_scheme_cap_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[64]] + sig: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[4]] + page_prefetch: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_46: c.Array[ctypes.c_ubyte, Literal[26]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + rc_odp_caps: struct_mlx5_ifc_odp_per_transport_service_cap_bits + uc_odp_caps: struct_mlx5_ifc_odp_per_transport_service_cap_bits + ud_odp_caps: struct_mlx5_ifc_odp_per_transport_service_cap_bits + xrc_odp_caps: struct_mlx5_ifc_odp_per_transport_service_cap_bits + dc_odp_caps: struct_mlx5_ifc_odp_per_transport_service_cap_bits + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[224]] +struct_mlx5_ifc_odp_scheme_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('sig', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[4]], 65), ('page_prefetch', c.Array[ctypes.c_ubyte, Literal[1]], 69), ('reserved_at_46', c.Array[ctypes.c_ubyte, Literal[26]], 70), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('rc_odp_caps', struct_mlx5_ifc_odp_per_transport_service_cap_bits, 128), ('uc_odp_caps', struct_mlx5_ifc_odp_per_transport_service_cap_bits, 160), ('ud_odp_caps', struct_mlx5_ifc_odp_per_transport_service_cap_bits, 192), ('xrc_odp_caps', struct_mlx5_ifc_odp_per_transport_service_cap_bits, 224), ('dc_odp_caps', struct_mlx5_ifc_odp_per_transport_service_cap_bits, 256), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[224]], 288)]) +@c.record +class struct_mlx5_ifc_odp_cap_bits(c.Struct): + SIZE = 2048 + transport_page_fault_scheme_cap: struct_mlx5_ifc_odp_scheme_cap_bits + memory_page_fault_scheme_cap: struct_mlx5_ifc_odp_scheme_cap_bits + reserved_at_400: c.Array[ctypes.c_ubyte, Literal[512]] + mem_page_fault: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_601: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_620: c.Array[ctypes.c_ubyte, Literal[480]] +struct_mlx5_ifc_odp_cap_bits.register_fields([('transport_page_fault_scheme_cap', struct_mlx5_ifc_odp_scheme_cap_bits, 0), ('memory_page_fault_scheme_cap', struct_mlx5_ifc_odp_scheme_cap_bits, 512), ('reserved_at_400', c.Array[ctypes.c_ubyte, Literal[512]], 1024), ('mem_page_fault', c.Array[ctypes.c_ubyte, Literal[1]], 1536), ('reserved_at_601', c.Array[ctypes.c_ubyte, Literal[31]], 1537), ('reserved_at_620', c.Array[ctypes.c_ubyte, Literal[480]], 1568)]) +@c.record +class struct_mlx5_ifc_tls_cap_bits(c.Struct): + SIZE = 2048 + tls_1_2_aes_gcm_128: c.Array[ctypes.c_ubyte, Literal[1]] + tls_1_3_aes_gcm_128: c.Array[ctypes.c_ubyte, Literal[1]] + tls_1_2_aes_gcm_256: c.Array[ctypes.c_ubyte, Literal[1]] + tls_1_3_aes_gcm_256: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[28]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[2016]] +struct_mlx5_ifc_tls_cap_bits.register_fields([('tls_1_2_aes_gcm_128', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('tls_1_3_aes_gcm_128', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('tls_1_2_aes_gcm_256', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('tls_1_3_aes_gcm_256', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[28]], 4), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[2016]], 32)]) +@c.record +class struct_mlx5_ifc_ipsec_cap_bits(c.Struct): + SIZE = 2048 + ipsec_full_offload: c.Array[ctypes.c_ubyte, Literal[1]] + ipsec_crypto_offload: c.Array[ctypes.c_ubyte, Literal[1]] + ipsec_esn: c.Array[ctypes.c_ubyte, Literal[1]] + ipsec_crypto_esp_aes_gcm_256_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + ipsec_crypto_esp_aes_gcm_128_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + ipsec_crypto_esp_aes_gcm_256_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + ipsec_crypto_esp_aes_gcm_128_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_7: c.Array[ctypes.c_ubyte, Literal[4]] + log_max_ipsec_offload: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + min_log_ipsec_full_replay_window: c.Array[ctypes.c_ubyte, Literal[8]] + max_log_ipsec_full_replay_window: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[2000]] +struct_mlx5_ifc_ipsec_cap_bits.register_fields([('ipsec_full_offload', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('ipsec_crypto_offload', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('ipsec_esn', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('ipsec_crypto_esp_aes_gcm_256_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('ipsec_crypto_esp_aes_gcm_128_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('ipsec_crypto_esp_aes_gcm_256_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('ipsec_crypto_esp_aes_gcm_128_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('reserved_at_7', c.Array[ctypes.c_ubyte, Literal[4]], 7), ('log_max_ipsec_offload', c.Array[ctypes.c_ubyte, Literal[5]], 11), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('min_log_ipsec_full_replay_window', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('max_log_ipsec_full_replay_window', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[2000]], 48)]) +@c.record +class struct_mlx5_ifc_macsec_cap_bits(c.Struct): + SIZE = 2048 + macsec_epn: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[2]] + macsec_crypto_esp_aes_gcm_256_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + macsec_crypto_esp_aes_gcm_128_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + macsec_crypto_esp_aes_gcm_256_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + macsec_crypto_esp_aes_gcm_128_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_7: c.Array[ctypes.c_ubyte, Literal[4]] + log_max_macsec_offload: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + min_log_macsec_full_replay_window: c.Array[ctypes.c_ubyte, Literal[8]] + max_log_macsec_full_replay_window: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[1984]] +struct_mlx5_ifc_macsec_cap_bits.register_fields([('macsec_epn', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[2]], 1), ('macsec_crypto_esp_aes_gcm_256_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('macsec_crypto_esp_aes_gcm_128_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('macsec_crypto_esp_aes_gcm_256_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('macsec_crypto_esp_aes_gcm_128_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('reserved_at_7', c.Array[ctypes.c_ubyte, Literal[4]], 7), ('log_max_macsec_offload', c.Array[ctypes.c_ubyte, Literal[5]], 11), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('min_log_macsec_full_replay_window', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('max_log_macsec_full_replay_window', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[1984]], 64)]) +@c.record +class struct_mlx5_ifc_psp_cap_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[1]] + psp_crypto_offload: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[1]] + psp_crypto_esp_aes_gcm_256_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + psp_crypto_esp_aes_gcm_128_encrypt: c.Array[ctypes.c_ubyte, Literal[1]] + psp_crypto_esp_aes_gcm_256_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + psp_crypto_esp_aes_gcm_128_decrypt: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_7: c.Array[ctypes.c_ubyte, Literal[4]] + log_max_num_of_psp_spi: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[2016]] +struct_mlx5_ifc_psp_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('psp_crypto_offload', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('psp_crypto_esp_aes_gcm_256_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('psp_crypto_esp_aes_gcm_128_encrypt', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('psp_crypto_esp_aes_gcm_256_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('psp_crypto_esp_aes_gcm_128_decrypt', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('reserved_at_7', c.Array[ctypes.c_ubyte, Literal[4]], 7), ('log_max_num_of_psp_spi', c.Array[ctypes.c_ubyte, Literal[5]], 11), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[2016]], 32)]) +_anonenum17: dict[int, str] = {(MLX5_WQ_TYPE_LINKED_LIST:=0): 'MLX5_WQ_TYPE_LINKED_LIST', (MLX5_WQ_TYPE_CYCLIC:=1): 'MLX5_WQ_TYPE_CYCLIC', (MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ:=2): 'MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ', (MLX5_WQ_TYPE_CYCLIC_STRIDING_RQ:=3): 'MLX5_WQ_TYPE_CYCLIC_STRIDING_RQ'} +_anonenum18: dict[int, str] = {(MLX5_WQ_END_PAD_MODE_NONE:=0): 'MLX5_WQ_END_PAD_MODE_NONE', (MLX5_WQ_END_PAD_MODE_ALIGN:=1): 'MLX5_WQ_END_PAD_MODE_ALIGN'} +_anonenum19: dict[int, str] = {(MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_8_GID_ENTRIES:=0): 'MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_8_GID_ENTRIES', (MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_16_GID_ENTRIES:=1): 'MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_16_GID_ENTRIES', (MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_32_GID_ENTRIES:=2): 'MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_32_GID_ENTRIES', (MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_64_GID_ENTRIES:=3): 'MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_64_GID_ENTRIES', (MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_128_GID_ENTRIES:=4): 'MLX5_CMD_HCA_CAP_GID_TABLE_SIZE_128_GID_ENTRIES'} +_anonenum20: dict[int, str] = {(MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_128_ENTRIES:=0): 'MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_128_ENTRIES', (MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_256_ENTRIES:=1): 'MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_256_ENTRIES', (MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_512_ENTRIES:=2): 'MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_512_ENTRIES', (MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_1K_ENTRIES:=3): 'MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_1K_ENTRIES', (MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_2K_ENTRIES:=4): 'MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_2K_ENTRIES', (MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_4K_ENTRIES:=5): 'MLX5_CMD_HCA_CAP_PKEY_TABLE_SIZE_4K_ENTRIES'} +_anonenum21: dict[int, str] = {(MLX5_CMD_HCA_CAP_PORT_TYPE_IB:=0): 'MLX5_CMD_HCA_CAP_PORT_TYPE_IB', (MLX5_CMD_HCA_CAP_PORT_TYPE_ETHERNET:=1): 'MLX5_CMD_HCA_CAP_PORT_TYPE_ETHERNET'} +_anonenum22: dict[int, str] = {(MLX5_CMD_HCA_CAP_CMDIF_CHECKSUM_DISABLED:=0): 'MLX5_CMD_HCA_CAP_CMDIF_CHECKSUM_DISABLED', (MLX5_CMD_HCA_CAP_CMDIF_CHECKSUM_INITIAL_STATE:=1): 'MLX5_CMD_HCA_CAP_CMDIF_CHECKSUM_INITIAL_STATE', (MLX5_CMD_HCA_CAP_CMDIF_CHECKSUM_ENABLED:=3): 'MLX5_CMD_HCA_CAP_CMDIF_CHECKSUM_ENABLED'} +_anonenum23: dict[int, str] = {(MLX5_CAP_PORT_TYPE_IB:=0): 'MLX5_CAP_PORT_TYPE_IB', (MLX5_CAP_PORT_TYPE_ETH:=1): 'MLX5_CAP_PORT_TYPE_ETH'} +_anonenum24: dict[int, str] = {(MLX5_CAP_UMR_FENCE_STRONG:=0): 'MLX5_CAP_UMR_FENCE_STRONG', (MLX5_CAP_UMR_FENCE_SMALL:=1): 'MLX5_CAP_UMR_FENCE_SMALL', (MLX5_CAP_UMR_FENCE_NONE:=2): 'MLX5_CAP_UMR_FENCE_NONE'} +_anonenum25: dict[int, str] = {(MLX5_FLEX_IPV4_OVER_VXLAN_ENABLED:=1): 'MLX5_FLEX_IPV4_OVER_VXLAN_ENABLED', (MLX5_FLEX_IPV6_OVER_VXLAN_ENABLED:=2): 'MLX5_FLEX_IPV6_OVER_VXLAN_ENABLED', (MLX5_FLEX_IPV6_OVER_IP_ENABLED:=4): 'MLX5_FLEX_IPV6_OVER_IP_ENABLED', (MLX5_FLEX_PARSER_GENEVE_ENABLED:=8): 'MLX5_FLEX_PARSER_GENEVE_ENABLED', (MLX5_FLEX_PARSER_MPLS_OVER_GRE_ENABLED:=16): 'MLX5_FLEX_PARSER_MPLS_OVER_GRE_ENABLED', (MLX5_FLEX_PARSER_MPLS_OVER_UDP_ENABLED:=32): 'MLX5_FLEX_PARSER_MPLS_OVER_UDP_ENABLED', (MLX5_FLEX_P_BIT_VXLAN_GPE_ENABLED:=64): 'MLX5_FLEX_P_BIT_VXLAN_GPE_ENABLED', (MLX5_FLEX_PARSER_VXLAN_GPE_ENABLED:=128): 'MLX5_FLEX_PARSER_VXLAN_GPE_ENABLED', (MLX5_FLEX_PARSER_ICMP_V4_ENABLED:=256): 'MLX5_FLEX_PARSER_ICMP_V4_ENABLED', (MLX5_FLEX_PARSER_ICMP_V6_ENABLED:=512): 'MLX5_FLEX_PARSER_ICMP_V6_ENABLED', (MLX5_FLEX_PARSER_GENEVE_TLV_OPTION_0_ENABLED:=1024): 'MLX5_FLEX_PARSER_GENEVE_TLV_OPTION_0_ENABLED', (MLX5_FLEX_PARSER_GTPU_ENABLED:=2048): 'MLX5_FLEX_PARSER_GTPU_ENABLED', (MLX5_FLEX_PARSER_GTPU_DW_2_ENABLED:=65536): 'MLX5_FLEX_PARSER_GTPU_DW_2_ENABLED', (MLX5_FLEX_PARSER_GTPU_FIRST_EXT_DW_0_ENABLED:=131072): 'MLX5_FLEX_PARSER_GTPU_FIRST_EXT_DW_0_ENABLED', (MLX5_FLEX_PARSER_GTPU_DW_0_ENABLED:=262144): 'MLX5_FLEX_PARSER_GTPU_DW_0_ENABLED', (MLX5_FLEX_PARSER_GTPU_TEID_ENABLED:=524288): 'MLX5_FLEX_PARSER_GTPU_TEID_ENABLED'} +_anonenum26: dict[int, str] = {(MLX5_UCTX_CAP_RAW_TX:=1): 'MLX5_UCTX_CAP_RAW_TX', (MLX5_UCTX_CAP_INTERNAL_DEV_RES:=2): 'MLX5_UCTX_CAP_INTERNAL_DEV_RES', (MLX5_UCTX_CAP_RDMA_CTRL:=8): 'MLX5_UCTX_CAP_RDMA_CTRL', (MLX5_UCTX_CAP_RDMA_CTRL_OTHER_VHCA:=16): 'MLX5_UCTX_CAP_RDMA_CTRL_OTHER_VHCA'} +enum_mlx5_fc_bulk_alloc_bitmask: dict[int, str] = {(MLX5_FC_BULK_128:=1): 'MLX5_FC_BULK_128', (MLX5_FC_BULK_256:=2): 'MLX5_FC_BULK_256', (MLX5_FC_BULK_512:=4): 'MLX5_FC_BULK_512', (MLX5_FC_BULK_1024:=8): 'MLX5_FC_BULK_1024', (MLX5_FC_BULK_2048:=16): 'MLX5_FC_BULK_2048', (MLX5_FC_BULK_4096:=32): 'MLX5_FC_BULK_4096', (MLX5_FC_BULK_8192:=64): 'MLX5_FC_BULK_8192', (MLX5_FC_BULK_16384:=128): 'MLX5_FC_BULK_16384'} +_anonenum27: dict[int, str] = {(MLX5_STEERING_FORMAT_CONNECTX_5:=0): 'MLX5_STEERING_FORMAT_CONNECTX_5', (MLX5_STEERING_FORMAT_CONNECTX_6DX:=1): 'MLX5_STEERING_FORMAT_CONNECTX_6DX', (MLX5_STEERING_FORMAT_CONNECTX_7:=2): 'MLX5_STEERING_FORMAT_CONNECTX_7', (MLX5_STEERING_FORMAT_CONNECTX_8:=3): 'MLX5_STEERING_FORMAT_CONNECTX_8'} +@c.record +class struct_mlx5_ifc_cmd_hca_cap_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[6]] + page_request_disable: c.Array[ctypes.c_ubyte, Literal[1]] + abs_native_port_num: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[8]] + shared_object_to_user_object_allowed: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_13: c.Array[ctypes.c_ubyte, Literal[14]] + vhca_resource_manager: c.Array[ctypes.c_ubyte, Literal[1]] + hca_cap_2: c.Array[ctypes.c_ubyte, Literal[1]] + create_lag_when_not_master_up: c.Array[ctypes.c_ubyte, Literal[1]] + dtor: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_vhca_state_teardown_request: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_vhca_state_in_use: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_vhca_state_active: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_vhca_state_allocated: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_vhca_state_invalid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_28: c.Array[ctypes.c_ubyte, Literal[8]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + log_max_srq_sz: c.Array[ctypes.c_ubyte, Literal[8]] + log_max_qp_sz: c.Array[ctypes.c_ubyte, Literal[8]] + event_cap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_91: c.Array[ctypes.c_ubyte, Literal[2]] + isolate_vl_tc_new: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_94: c.Array[ctypes.c_ubyte, Literal[4]] + prio_tag_required: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_99: c.Array[ctypes.c_ubyte, Literal[2]] + log_max_qp: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[3]] + ece_support: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_a4: c.Array[ctypes.c_ubyte, Literal[5]] + reg_c_preserve: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_aa: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_srq: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_b0: c.Array[ctypes.c_ubyte, Literal[1]] + uplink_follow: c.Array[ctypes.c_ubyte, Literal[1]] + ts_cqe_to_dest_cqn: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_b3: c.Array[ctypes.c_ubyte, Literal[6]] + go_back_n: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_ba: c.Array[ctypes.c_ubyte, Literal[6]] + max_sgl_for_optimized_performance: c.Array[ctypes.c_ubyte, Literal[8]] + log_max_cq_sz: c.Array[ctypes.c_ubyte, Literal[8]] + relaxed_ordering_write_umr: c.Array[ctypes.c_ubyte, Literal[1]] + relaxed_ordering_read_umr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_d2: c.Array[ctypes.c_ubyte, Literal[7]] + virtio_net_device_emualtion_manager: c.Array[ctypes.c_ubyte, Literal[1]] + virtio_blk_device_emualtion_manager: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_cq: c.Array[ctypes.c_ubyte, Literal[5]] + log_max_eq_sz: c.Array[ctypes.c_ubyte, Literal[8]] + relaxed_ordering_write: c.Array[ctypes.c_ubyte, Literal[1]] + relaxed_ordering_read_pci_enabled: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_mkey: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_f0: c.Array[ctypes.c_ubyte, Literal[6]] + terminate_scatter_list_mkey: c.Array[ctypes.c_ubyte, Literal[1]] + repeated_mkey: c.Array[ctypes.c_ubyte, Literal[1]] + dump_fill_mkey: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_f9: c.Array[ctypes.c_ubyte, Literal[2]] + fast_teardown: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_eq: c.Array[ctypes.c_ubyte, Literal[4]] + max_indirection: c.Array[ctypes.c_ubyte, Literal[8]] + fixed_buffer_size: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_mrw_sz: c.Array[ctypes.c_ubyte, Literal[7]] + force_teardown: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_111: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_bsf_list_size: c.Array[ctypes.c_ubyte, Literal[6]] + umr_extended_translation_offset: c.Array[ctypes.c_ubyte, Literal[1]] + null_mkey: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_klm_list_size: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[2]] + qpc_extension: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_123: c.Array[ctypes.c_ubyte, Literal[7]] + log_max_ra_req_dc: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_130: c.Array[ctypes.c_ubyte, Literal[2]] + eth_wqe_too_small: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_133: c.Array[ctypes.c_ubyte, Literal[6]] + vnic_env_cq_overrun: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_ra_res_dc: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[5]] + release_all_pages: c.Array[ctypes.c_ubyte, Literal[1]] + must_not_use: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_147: c.Array[ctypes.c_ubyte, Literal[2]] + roce_accl: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_ra_req_qp: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_150: c.Array[ctypes.c_ubyte, Literal[10]] + log_max_ra_res_qp: c.Array[ctypes.c_ubyte, Literal[6]] + end_pad: c.Array[ctypes.c_ubyte, Literal[1]] + cc_query_allowed: c.Array[ctypes.c_ubyte, Literal[1]] + cc_modify_allowed: c.Array[ctypes.c_ubyte, Literal[1]] + start_pad: c.Array[ctypes.c_ubyte, Literal[1]] + cache_line_128byte: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_165: c.Array[ctypes.c_ubyte, Literal[4]] + rts2rts_qp_counters_set_id: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_16a: c.Array[ctypes.c_ubyte, Literal[2]] + vnic_env_int_rq_oob: c.Array[ctypes.c_ubyte, Literal[1]] + sbcam_reg: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_16e: c.Array[ctypes.c_ubyte, Literal[1]] + qcam_reg: c.Array[ctypes.c_ubyte, Literal[1]] + gid_table_size: c.Array[ctypes.c_ubyte, Literal[16]] + out_of_seq_cnt: c.Array[ctypes.c_ubyte, Literal[1]] + vport_counters: c.Array[ctypes.c_ubyte, Literal[1]] + retransmission_q_counters: c.Array[ctypes.c_ubyte, Literal[1]] + debug: c.Array[ctypes.c_ubyte, Literal[1]] + modify_rq_counter_set_id: c.Array[ctypes.c_ubyte, Literal[1]] + rq_delay_drop: c.Array[ctypes.c_ubyte, Literal[1]] + max_qp_cnt: c.Array[ctypes.c_ubyte, Literal[10]] + pkey_table_size: c.Array[ctypes.c_ubyte, Literal[16]] + vport_group_manager: c.Array[ctypes.c_ubyte, Literal[1]] + vhca_group_manager: c.Array[ctypes.c_ubyte, Literal[1]] + ib_virt: c.Array[ctypes.c_ubyte, Literal[1]] + eth_virt: c.Array[ctypes.c_ubyte, Literal[1]] + vnic_env_queue_counters: c.Array[ctypes.c_ubyte, Literal[1]] + ets: c.Array[ctypes.c_ubyte, Literal[1]] + nic_flow_table: c.Array[ctypes.c_ubyte, Literal[1]] + eswitch_manager: c.Array[ctypes.c_ubyte, Literal[1]] + device_memory: c.Array[ctypes.c_ubyte, Literal[1]] + mcam_reg: c.Array[ctypes.c_ubyte, Literal[1]] + pcam_reg: c.Array[ctypes.c_ubyte, Literal[1]] + local_ca_ack_delay: c.Array[ctypes.c_ubyte, Literal[5]] + port_module_event: c.Array[ctypes.c_ubyte, Literal[1]] + enhanced_error_q_counters: c.Array[ctypes.c_ubyte, Literal[1]] + ports_check: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1b3: c.Array[ctypes.c_ubyte, Literal[1]] + disable_link_up: c.Array[ctypes.c_ubyte, Literal[1]] + beacon_led: c.Array[ctypes.c_ubyte, Literal[1]] + port_type: c.Array[ctypes.c_ubyte, Literal[2]] + num_ports: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[1]] + pps: c.Array[ctypes.c_ubyte, Literal[1]] + pps_modify: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_msg: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_1c8: c.Array[ctypes.c_ubyte, Literal[4]] + max_tc: c.Array[ctypes.c_ubyte, Literal[4]] + temp_warn_event: c.Array[ctypes.c_ubyte, Literal[1]] + dcbx: c.Array[ctypes.c_ubyte, Literal[1]] + general_notification_event: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1d3: c.Array[ctypes.c_ubyte, Literal[2]] + fpga: c.Array[ctypes.c_ubyte, Literal[1]] + rol_s: c.Array[ctypes.c_ubyte, Literal[1]] + rol_g: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1d8: c.Array[ctypes.c_ubyte, Literal[1]] + wol_s: c.Array[ctypes.c_ubyte, Literal[1]] + wol_g: c.Array[ctypes.c_ubyte, Literal[1]] + wol_a: c.Array[ctypes.c_ubyte, Literal[1]] + wol_b: c.Array[ctypes.c_ubyte, Literal[1]] + wol_m: c.Array[ctypes.c_ubyte, Literal[1]] + wol_u: c.Array[ctypes.c_ubyte, Literal[1]] + wol_p: c.Array[ctypes.c_ubyte, Literal[1]] + stat_rate_support: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_1f0: c.Array[ctypes.c_ubyte, Literal[1]] + pci_sync_for_fw_update_event: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1f2: c.Array[ctypes.c_ubyte, Literal[6]] + init2_lag_tx_port_affinity: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1fa: c.Array[ctypes.c_ubyte, Literal[2]] + wqe_based_flow_table_update_cap: c.Array[ctypes.c_ubyte, Literal[1]] + cqe_version: c.Array[ctypes.c_ubyte, Literal[4]] + compact_address_vector: c.Array[ctypes.c_ubyte, Literal[1]] + striding_rq: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_202: c.Array[ctypes.c_ubyte, Literal[1]] + ipoib_enhanced_offloads: c.Array[ctypes.c_ubyte, Literal[1]] + ipoib_basic_offloads: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_205: c.Array[ctypes.c_ubyte, Literal[1]] + repeated_block_disabled: c.Array[ctypes.c_ubyte, Literal[1]] + umr_modify_entity_size_disabled: c.Array[ctypes.c_ubyte, Literal[1]] + umr_modify_atomic_disabled: c.Array[ctypes.c_ubyte, Literal[1]] + umr_indirect_mkey_disabled: c.Array[ctypes.c_ubyte, Literal[1]] + umr_fence: c.Array[ctypes.c_ubyte, Literal[2]] + dc_req_scat_data_cqe: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_20d: c.Array[ctypes.c_ubyte, Literal[2]] + drain_sigerr: c.Array[ctypes.c_ubyte, Literal[1]] + cmdif_checksum: c.Array[ctypes.c_ubyte, Literal[2]] + sigerr_cqe: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_213: c.Array[ctypes.c_ubyte, Literal[1]] + wq_signature: c.Array[ctypes.c_ubyte, Literal[1]] + sctr_data_cqe: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_216: c.Array[ctypes.c_ubyte, Literal[1]] + sho: c.Array[ctypes.c_ubyte, Literal[1]] + tph: c.Array[ctypes.c_ubyte, Literal[1]] + rf: c.Array[ctypes.c_ubyte, Literal[1]] + dct: c.Array[ctypes.c_ubyte, Literal[1]] + qos: c.Array[ctypes.c_ubyte, Literal[1]] + eth_net_offloads: c.Array[ctypes.c_ubyte, Literal[1]] + roce: c.Array[ctypes.c_ubyte, Literal[1]] + atomic: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21f: c.Array[ctypes.c_ubyte, Literal[1]] + cq_oi: c.Array[ctypes.c_ubyte, Literal[1]] + cq_resize: c.Array[ctypes.c_ubyte, Literal[1]] + cq_moderation: c.Array[ctypes.c_ubyte, Literal[1]] + cq_period_mode_modify: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_224: c.Array[ctypes.c_ubyte, Literal[2]] + cq_eq_remap: c.Array[ctypes.c_ubyte, Literal[1]] + pg: c.Array[ctypes.c_ubyte, Literal[1]] + block_lb_mc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_229: c.Array[ctypes.c_ubyte, Literal[1]] + scqe_break_moderation: c.Array[ctypes.c_ubyte, Literal[1]] + cq_period_start_from_cqe: c.Array[ctypes.c_ubyte, Literal[1]] + cd: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22d: c.Array[ctypes.c_ubyte, Literal[1]] + apm: c.Array[ctypes.c_ubyte, Literal[1]] + vector_calc: c.Array[ctypes.c_ubyte, Literal[1]] + umr_ptr_rlky: c.Array[ctypes.c_ubyte, Literal[1]] + imaicl: c.Array[ctypes.c_ubyte, Literal[1]] + qp_packet_based: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_233: c.Array[ctypes.c_ubyte, Literal[3]] + qkv: c.Array[ctypes.c_ubyte, Literal[1]] + pkv: c.Array[ctypes.c_ubyte, Literal[1]] + set_deth_sqpn: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_239: c.Array[ctypes.c_ubyte, Literal[3]] + xrc: c.Array[ctypes.c_ubyte, Literal[1]] + ud: c.Array[ctypes.c_ubyte, Literal[1]] + uc: c.Array[ctypes.c_ubyte, Literal[1]] + rc: c.Array[ctypes.c_ubyte, Literal[1]] + uar_4k: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_241: c.Array[ctypes.c_ubyte, Literal[7]] + fl_rc_qp_when_roce_disabled: c.Array[ctypes.c_ubyte, Literal[1]] + regexp_params: c.Array[ctypes.c_ubyte, Literal[1]] + uar_sz: c.Array[ctypes.c_ubyte, Literal[6]] + port_selection_cap: c.Array[ctypes.c_ubyte, Literal[1]] + nic_cap_reg: c.Array[ctypes.c_ubyte, Literal[1]] + umem_uid_0: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_253: c.Array[ctypes.c_ubyte, Literal[5]] + log_pg_sz: c.Array[ctypes.c_ubyte, Literal[8]] + bf: c.Array[ctypes.c_ubyte, Literal[1]] + driver_version: c.Array[ctypes.c_ubyte, Literal[1]] + pad_tx_eth_packet: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_263: c.Array[ctypes.c_ubyte, Literal[3]] + mkey_by_name: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_267: c.Array[ctypes.c_ubyte, Literal[4]] + log_bf_reg_size: c.Array[ctypes.c_ubyte, Literal[5]] + disciplined_fr_counter: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_271: c.Array[ctypes.c_ubyte, Literal[2]] + qp_error_syndrome: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_274: c.Array[ctypes.c_ubyte, Literal[2]] + lag_dct: c.Array[ctypes.c_ubyte, Literal[2]] + lag_tx_port_affinity: c.Array[ctypes.c_ubyte, Literal[1]] + lag_native_fdb_selection: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_27a: c.Array[ctypes.c_ubyte, Literal[1]] + lag_master: c.Array[ctypes.c_ubyte, Literal[1]] + num_lag_ports: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[16]] + max_wqe_sz_sq: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_2a0: c.Array[ctypes.c_ubyte, Literal[7]] + mkey_pcie_tph: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2a8: c.Array[ctypes.c_ubyte, Literal[1]] + tis_tir_td_order: c.Array[ctypes.c_ubyte, Literal[1]] + psp: c.Array[ctypes.c_ubyte, Literal[1]] + shampo: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2ac: c.Array[ctypes.c_ubyte, Literal[4]] + max_wqe_sz_rq: c.Array[ctypes.c_ubyte, Literal[16]] + max_flow_counter_31_16: c.Array[ctypes.c_ubyte, Literal[16]] + max_wqe_sz_sq_dc: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_2e0: c.Array[ctypes.c_ubyte, Literal[7]] + max_qp_mcg: c.Array[ctypes.c_ubyte, Literal[25]] + reserved_at_300: c.Array[ctypes.c_ubyte, Literal[16]] + flow_counter_bulk_alloc: c.Array[ctypes.c_ubyte, Literal[8]] + log_max_mcg: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_320: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_transport_domain: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_328: c.Array[ctypes.c_ubyte, Literal[2]] + relaxed_ordering_read: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_pd: c.Array[ctypes.c_ubyte, Literal[5]] + dp_ordering_ooo_all_ud: c.Array[ctypes.c_ubyte, Literal[1]] + dp_ordering_ooo_all_uc: c.Array[ctypes.c_ubyte, Literal[1]] + dp_ordering_ooo_all_xrc: c.Array[ctypes.c_ubyte, Literal[1]] + dp_ordering_ooo_all_dc: c.Array[ctypes.c_ubyte, Literal[1]] + dp_ordering_ooo_all_rc: c.Array[ctypes.c_ubyte, Literal[1]] + pcie_reset_using_hotreset_method: c.Array[ctypes.c_ubyte, Literal[1]] + pci_sync_for_fw_update_with_driver_unload: c.Array[ctypes.c_ubyte, Literal[1]] + vnic_env_cnt_steering_fail: c.Array[ctypes.c_ubyte, Literal[1]] + vport_counter_local_loopback: c.Array[ctypes.c_ubyte, Literal[1]] + q_counter_aggregation: c.Array[ctypes.c_ubyte, Literal[1]] + q_counter_other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_xrcd: c.Array[ctypes.c_ubyte, Literal[5]] + nic_receive_steering_discard: c.Array[ctypes.c_ubyte, Literal[1]] + receive_discard_vport_down: c.Array[ctypes.c_ubyte, Literal[1]] + transmit_discard_vport_down: c.Array[ctypes.c_ubyte, Literal[1]] + eq_overrun_count: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_344: c.Array[ctypes.c_ubyte, Literal[1]] + invalid_command_count: c.Array[ctypes.c_ubyte, Literal[1]] + quota_exceeded_count: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_347: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_flow_counter_bulk: c.Array[ctypes.c_ubyte, Literal[8]] + max_flow_counter_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_360: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_rq: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_368: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_sq: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_370: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_tir: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_378: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_tis: c.Array[ctypes.c_ubyte, Literal[5]] + basic_cyclic_rcv_wqe: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_381: c.Array[ctypes.c_ubyte, Literal[2]] + log_max_rmp: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_388: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_rqt: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_390: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_rqt_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_398: c.Array[ctypes.c_ubyte, Literal[1]] + vnic_env_cnt_bar_uar_access: c.Array[ctypes.c_ubyte, Literal[1]] + vnic_env_cnt_odp_page_fault: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_tis_per_sq: c.Array[ctypes.c_ubyte, Literal[5]] + ext_stride_num_range: c.Array[ctypes.c_ubyte, Literal[1]] + roce_rw_supported: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_current_uc_list_wr_supported: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_stride_sz_rq: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3a8: c.Array[ctypes.c_ubyte, Literal[3]] + log_min_stride_sz_rq: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3b0: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_stride_sz_sq: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3b8: c.Array[ctypes.c_ubyte, Literal[3]] + log_min_stride_sz_sq: c.Array[ctypes.c_ubyte, Literal[5]] + hairpin: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3c1: c.Array[ctypes.c_ubyte, Literal[2]] + log_max_hairpin_queues: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3c8: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_hairpin_wq_data_sz: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3d0: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_hairpin_num_packets: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3d8: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_wq_sz: c.Array[ctypes.c_ubyte, Literal[5]] + nic_vport_change_event: c.Array[ctypes.c_ubyte, Literal[1]] + disable_local_lb_uc: c.Array[ctypes.c_ubyte, Literal[1]] + disable_local_lb_mc: c.Array[ctypes.c_ubyte, Literal[1]] + log_min_hairpin_wq_data_sz: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3e8: c.Array[ctypes.c_ubyte, Literal[1]] + silent_mode: c.Array[ctypes.c_ubyte, Literal[1]] + vhca_state: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_vlan_list: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3f0: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_current_mc_list: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3f8: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_current_uc_list: c.Array[ctypes.c_ubyte, Literal[5]] + general_obj_types: c.Array[ctypes.c_ubyte, Literal[64]] + sq_ts_format: c.Array[ctypes.c_ubyte, Literal[2]] + rq_ts_format: c.Array[ctypes.c_ubyte, Literal[2]] + steering_format_version: c.Array[ctypes.c_ubyte, Literal[4]] + create_qp_start_hint: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_460: c.Array[ctypes.c_ubyte, Literal[1]] + ats: c.Array[ctypes.c_ubyte, Literal[1]] + cross_vhca_rqt: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_uctx: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_468: c.Array[ctypes.c_ubyte, Literal[1]] + crypto: c.Array[ctypes.c_ubyte, Literal[1]] + ipsec_offload: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_umem: c.Array[ctypes.c_ubyte, Literal[5]] + max_num_eqs: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_480: c.Array[ctypes.c_ubyte, Literal[1]] + tls_tx: c.Array[ctypes.c_ubyte, Literal[1]] + tls_rx: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_l2_table: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_488: c.Array[ctypes.c_ubyte, Literal[8]] + log_uar_page_sz: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_4a0: c.Array[ctypes.c_ubyte, Literal[32]] + device_frequency_mhz: c.Array[ctypes.c_ubyte, Literal[32]] + device_frequency_khz: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_500: c.Array[ctypes.c_ubyte, Literal[32]] + num_of_uars_per_page: c.Array[ctypes.c_ubyte, Literal[32]] + flex_parser_protocols: c.Array[ctypes.c_ubyte, Literal[32]] + max_geneve_tlv_options: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_568: c.Array[ctypes.c_ubyte, Literal[3]] + max_geneve_tlv_option_data_len: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_570: c.Array[ctypes.c_ubyte, Literal[1]] + adv_rdma: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_572: c.Array[ctypes.c_ubyte, Literal[7]] + adv_virtualization: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_57a: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_580: c.Array[ctypes.c_ubyte, Literal[11]] + log_max_dci_stream_channels: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_590: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_dci_errored_streams: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_598: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_5a0: c.Array[ctypes.c_ubyte, Literal[16]] + enhanced_cqe_compression: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5b1: c.Array[ctypes.c_ubyte, Literal[1]] + crossing_vhca_mkey: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_dek: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_5b8: c.Array[ctypes.c_ubyte, Literal[4]] + mini_cqe_resp_stride_index: c.Array[ctypes.c_ubyte, Literal[1]] + cqe_128_always: c.Array[ctypes.c_ubyte, Literal[1]] + cqe_compression_128: c.Array[ctypes.c_ubyte, Literal[1]] + cqe_compression: c.Array[ctypes.c_ubyte, Literal[1]] + cqe_compression_timeout: c.Array[ctypes.c_ubyte, Literal[16]] + cqe_compression_max_num: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_5e0: c.Array[ctypes.c_ubyte, Literal[8]] + flex_parser_id_gtpu_dw_0: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_5ec: c.Array[ctypes.c_ubyte, Literal[4]] + tag_matching: c.Array[ctypes.c_ubyte, Literal[1]] + rndv_offload_rc: c.Array[ctypes.c_ubyte, Literal[1]] + rndv_offload_dc: c.Array[ctypes.c_ubyte, Literal[1]] + log_tag_matching_list_sz: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_5f8: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_xrq: c.Array[ctypes.c_ubyte, Literal[5]] + affiliate_nic_vport_criteria: c.Array[ctypes.c_ubyte, Literal[8]] + native_port_num: c.Array[ctypes.c_ubyte, Literal[8]] + num_vhca_ports: c.Array[ctypes.c_ubyte, Literal[8]] + flex_parser_id_gtpu_teid: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_61c: c.Array[ctypes.c_ubyte, Literal[2]] + sw_owner_id: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_61f: c.Array[ctypes.c_ubyte, Literal[1]] + max_num_of_monitor_counters: c.Array[ctypes.c_ubyte, Literal[16]] + num_ppcnt_monitor_counters: c.Array[ctypes.c_ubyte, Literal[16]] + max_num_sf: c.Array[ctypes.c_ubyte, Literal[16]] + num_q_monitor_counters: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_660: c.Array[ctypes.c_ubyte, Literal[32]] + sf: c.Array[ctypes.c_ubyte, Literal[1]] + sf_set_partition: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_682: c.Array[ctypes.c_ubyte, Literal[1]] + log_max_sf: c.Array[ctypes.c_ubyte, Literal[5]] + apu: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_689: c.Array[ctypes.c_ubyte, Literal[4]] + migration: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_68e: c.Array[ctypes.c_ubyte, Literal[2]] + log_min_sf_size: c.Array[ctypes.c_ubyte, Literal[8]] + max_num_sf_partitions: c.Array[ctypes.c_ubyte, Literal[8]] + uctx_cap: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_6c0: c.Array[ctypes.c_ubyte, Literal[4]] + flex_parser_id_geneve_tlv_option_0: c.Array[ctypes.c_ubyte, Literal[4]] + flex_parser_id_icmp_dw1: c.Array[ctypes.c_ubyte, Literal[4]] + flex_parser_id_icmp_dw0: c.Array[ctypes.c_ubyte, Literal[4]] + flex_parser_id_icmpv6_dw1: c.Array[ctypes.c_ubyte, Literal[4]] + flex_parser_id_icmpv6_dw0: c.Array[ctypes.c_ubyte, Literal[4]] + flex_parser_id_outer_first_mpls_over_gre: c.Array[ctypes.c_ubyte, Literal[4]] + flex_parser_id_outer_first_mpls_over_udp_label: c.Array[ctypes.c_ubyte, Literal[4]] + max_num_match_definer: c.Array[ctypes.c_ubyte, Literal[16]] + sf_base_id: c.Array[ctypes.c_ubyte, Literal[16]] + flex_parser_id_gtpu_dw_2: c.Array[ctypes.c_ubyte, Literal[4]] + flex_parser_id_gtpu_first_ext_dw_0: c.Array[ctypes.c_ubyte, Literal[4]] + num_total_dynamic_vf_msix: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_720: c.Array[ctypes.c_ubyte, Literal[20]] + dynamic_msix_table_size: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_740: c.Array[ctypes.c_ubyte, Literal[12]] + min_dynamic_vf_msix_table_size: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_750: c.Array[ctypes.c_ubyte, Literal[2]] + data_direct: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_753: c.Array[ctypes.c_ubyte, Literal[1]] + max_dynamic_vf_msix_table_size: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_760: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_num_header_modify_argument: c.Array[ctypes.c_ubyte, Literal[5]] + log_header_modify_argument_granularity_offset: c.Array[ctypes.c_ubyte, Literal[4]] + log_header_modify_argument_granularity: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_770: c.Array[ctypes.c_ubyte, Literal[3]] + log_header_modify_argument_max_alloc: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_778: c.Array[ctypes.c_ubyte, Literal[8]] + vhca_tunnel_commands: c.Array[ctypes.c_ubyte, Literal[64]] + match_definer_format_supported: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_cmd_hca_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[6]], 0), ('page_request_disable', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('abs_native_port_num', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('shared_object_to_user_object_allowed', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('reserved_at_13', c.Array[ctypes.c_ubyte, Literal[14]], 17), ('vhca_resource_manager', c.Array[ctypes.c_ubyte, Literal[1]], 31), ('hca_cap_2', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('create_lag_when_not_master_up', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('dtor', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('event_on_vhca_state_teardown_request', c.Array[ctypes.c_ubyte, Literal[1]], 35), ('event_on_vhca_state_in_use', c.Array[ctypes.c_ubyte, Literal[1]], 36), ('event_on_vhca_state_active', c.Array[ctypes.c_ubyte, Literal[1]], 37), ('event_on_vhca_state_allocated', c.Array[ctypes.c_ubyte, Literal[1]], 38), ('event_on_vhca_state_invalid', c.Array[ctypes.c_ubyte, Literal[1]], 39), ('reserved_at_28', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('log_max_srq_sz', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('log_max_qp_sz', c.Array[ctypes.c_ubyte, Literal[8]], 136), ('event_cap', c.Array[ctypes.c_ubyte, Literal[1]], 144), ('reserved_at_91', c.Array[ctypes.c_ubyte, Literal[2]], 145), ('isolate_vl_tc_new', c.Array[ctypes.c_ubyte, Literal[1]], 147), ('reserved_at_94', c.Array[ctypes.c_ubyte, Literal[4]], 148), ('prio_tag_required', c.Array[ctypes.c_ubyte, Literal[1]], 152), ('reserved_at_99', c.Array[ctypes.c_ubyte, Literal[2]], 153), ('log_max_qp', c.Array[ctypes.c_ubyte, Literal[5]], 155), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[3]], 160), ('ece_support', c.Array[ctypes.c_ubyte, Literal[1]], 163), ('reserved_at_a4', c.Array[ctypes.c_ubyte, Literal[5]], 164), ('reg_c_preserve', c.Array[ctypes.c_ubyte, Literal[1]], 169), ('reserved_at_aa', c.Array[ctypes.c_ubyte, Literal[1]], 170), ('log_max_srq', c.Array[ctypes.c_ubyte, Literal[5]], 171), ('reserved_at_b0', c.Array[ctypes.c_ubyte, Literal[1]], 176), ('uplink_follow', c.Array[ctypes.c_ubyte, Literal[1]], 177), ('ts_cqe_to_dest_cqn', c.Array[ctypes.c_ubyte, Literal[1]], 178), ('reserved_at_b3', c.Array[ctypes.c_ubyte, Literal[6]], 179), ('go_back_n', c.Array[ctypes.c_ubyte, Literal[1]], 185), ('reserved_at_ba', c.Array[ctypes.c_ubyte, Literal[6]], 186), ('max_sgl_for_optimized_performance', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('log_max_cq_sz', c.Array[ctypes.c_ubyte, Literal[8]], 200), ('relaxed_ordering_write_umr', c.Array[ctypes.c_ubyte, Literal[1]], 208), ('relaxed_ordering_read_umr', c.Array[ctypes.c_ubyte, Literal[1]], 209), ('reserved_at_d2', c.Array[ctypes.c_ubyte, Literal[7]], 210), ('virtio_net_device_emualtion_manager', c.Array[ctypes.c_ubyte, Literal[1]], 217), ('virtio_blk_device_emualtion_manager', c.Array[ctypes.c_ubyte, Literal[1]], 218), ('log_max_cq', c.Array[ctypes.c_ubyte, Literal[5]], 219), ('log_max_eq_sz', c.Array[ctypes.c_ubyte, Literal[8]], 224), ('relaxed_ordering_write', c.Array[ctypes.c_ubyte, Literal[1]], 232), ('relaxed_ordering_read_pci_enabled', c.Array[ctypes.c_ubyte, Literal[1]], 233), ('log_max_mkey', c.Array[ctypes.c_ubyte, Literal[6]], 234), ('reserved_at_f0', c.Array[ctypes.c_ubyte, Literal[6]], 240), ('terminate_scatter_list_mkey', c.Array[ctypes.c_ubyte, Literal[1]], 246), ('repeated_mkey', c.Array[ctypes.c_ubyte, Literal[1]], 247), ('dump_fill_mkey', c.Array[ctypes.c_ubyte, Literal[1]], 248), ('reserved_at_f9', c.Array[ctypes.c_ubyte, Literal[2]], 249), ('fast_teardown', c.Array[ctypes.c_ubyte, Literal[1]], 251), ('log_max_eq', c.Array[ctypes.c_ubyte, Literal[4]], 252), ('max_indirection', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('fixed_buffer_size', c.Array[ctypes.c_ubyte, Literal[1]], 264), ('log_max_mrw_sz', c.Array[ctypes.c_ubyte, Literal[7]], 265), ('force_teardown', c.Array[ctypes.c_ubyte, Literal[1]], 272), ('reserved_at_111', c.Array[ctypes.c_ubyte, Literal[1]], 273), ('log_max_bsf_list_size', c.Array[ctypes.c_ubyte, Literal[6]], 274), ('umr_extended_translation_offset', c.Array[ctypes.c_ubyte, Literal[1]], 280), ('null_mkey', c.Array[ctypes.c_ubyte, Literal[1]], 281), ('log_max_klm_list_size', c.Array[ctypes.c_ubyte, Literal[6]], 282), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[2]], 288), ('qpc_extension', c.Array[ctypes.c_ubyte, Literal[1]], 290), ('reserved_at_123', c.Array[ctypes.c_ubyte, Literal[7]], 291), ('log_max_ra_req_dc', c.Array[ctypes.c_ubyte, Literal[6]], 298), ('reserved_at_130', c.Array[ctypes.c_ubyte, Literal[2]], 304), ('eth_wqe_too_small', c.Array[ctypes.c_ubyte, Literal[1]], 306), ('reserved_at_133', c.Array[ctypes.c_ubyte, Literal[6]], 307), ('vnic_env_cq_overrun', c.Array[ctypes.c_ubyte, Literal[1]], 313), ('log_max_ra_res_dc', c.Array[ctypes.c_ubyte, Literal[6]], 314), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[5]], 320), ('release_all_pages', c.Array[ctypes.c_ubyte, Literal[1]], 325), ('must_not_use', c.Array[ctypes.c_ubyte, Literal[1]], 326), ('reserved_at_147', c.Array[ctypes.c_ubyte, Literal[2]], 327), ('roce_accl', c.Array[ctypes.c_ubyte, Literal[1]], 329), ('log_max_ra_req_qp', c.Array[ctypes.c_ubyte, Literal[6]], 330), ('reserved_at_150', c.Array[ctypes.c_ubyte, Literal[10]], 336), ('log_max_ra_res_qp', c.Array[ctypes.c_ubyte, Literal[6]], 346), ('end_pad', c.Array[ctypes.c_ubyte, Literal[1]], 352), ('cc_query_allowed', c.Array[ctypes.c_ubyte, Literal[1]], 353), ('cc_modify_allowed', c.Array[ctypes.c_ubyte, Literal[1]], 354), ('start_pad', c.Array[ctypes.c_ubyte, Literal[1]], 355), ('cache_line_128byte', c.Array[ctypes.c_ubyte, Literal[1]], 356), ('reserved_at_165', c.Array[ctypes.c_ubyte, Literal[4]], 357), ('rts2rts_qp_counters_set_id', c.Array[ctypes.c_ubyte, Literal[1]], 361), ('reserved_at_16a', c.Array[ctypes.c_ubyte, Literal[2]], 362), ('vnic_env_int_rq_oob', c.Array[ctypes.c_ubyte, Literal[1]], 364), ('sbcam_reg', c.Array[ctypes.c_ubyte, Literal[1]], 365), ('reserved_at_16e', c.Array[ctypes.c_ubyte, Literal[1]], 366), ('qcam_reg', c.Array[ctypes.c_ubyte, Literal[1]], 367), ('gid_table_size', c.Array[ctypes.c_ubyte, Literal[16]], 368), ('out_of_seq_cnt', c.Array[ctypes.c_ubyte, Literal[1]], 384), ('vport_counters', c.Array[ctypes.c_ubyte, Literal[1]], 385), ('retransmission_q_counters', c.Array[ctypes.c_ubyte, Literal[1]], 386), ('debug', c.Array[ctypes.c_ubyte, Literal[1]], 387), ('modify_rq_counter_set_id', c.Array[ctypes.c_ubyte, Literal[1]], 388), ('rq_delay_drop', c.Array[ctypes.c_ubyte, Literal[1]], 389), ('max_qp_cnt', c.Array[ctypes.c_ubyte, Literal[10]], 390), ('pkey_table_size', c.Array[ctypes.c_ubyte, Literal[16]], 400), ('vport_group_manager', c.Array[ctypes.c_ubyte, Literal[1]], 416), ('vhca_group_manager', c.Array[ctypes.c_ubyte, Literal[1]], 417), ('ib_virt', c.Array[ctypes.c_ubyte, Literal[1]], 418), ('eth_virt', c.Array[ctypes.c_ubyte, Literal[1]], 419), ('vnic_env_queue_counters', c.Array[ctypes.c_ubyte, Literal[1]], 420), ('ets', c.Array[ctypes.c_ubyte, Literal[1]], 421), ('nic_flow_table', c.Array[ctypes.c_ubyte, Literal[1]], 422), ('eswitch_manager', c.Array[ctypes.c_ubyte, Literal[1]], 423), ('device_memory', c.Array[ctypes.c_ubyte, Literal[1]], 424), ('mcam_reg', c.Array[ctypes.c_ubyte, Literal[1]], 425), ('pcam_reg', c.Array[ctypes.c_ubyte, Literal[1]], 426), ('local_ca_ack_delay', c.Array[ctypes.c_ubyte, Literal[5]], 427), ('port_module_event', c.Array[ctypes.c_ubyte, Literal[1]], 432), ('enhanced_error_q_counters', c.Array[ctypes.c_ubyte, Literal[1]], 433), ('ports_check', c.Array[ctypes.c_ubyte, Literal[1]], 434), ('reserved_at_1b3', c.Array[ctypes.c_ubyte, Literal[1]], 435), ('disable_link_up', c.Array[ctypes.c_ubyte, Literal[1]], 436), ('beacon_led', c.Array[ctypes.c_ubyte, Literal[1]], 437), ('port_type', c.Array[ctypes.c_ubyte, Literal[2]], 438), ('num_ports', c.Array[ctypes.c_ubyte, Literal[8]], 440), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[1]], 448), ('pps', c.Array[ctypes.c_ubyte, Literal[1]], 449), ('pps_modify', c.Array[ctypes.c_ubyte, Literal[1]], 450), ('log_max_msg', c.Array[ctypes.c_ubyte, Literal[5]], 451), ('reserved_at_1c8', c.Array[ctypes.c_ubyte, Literal[4]], 456), ('max_tc', c.Array[ctypes.c_ubyte, Literal[4]], 460), ('temp_warn_event', c.Array[ctypes.c_ubyte, Literal[1]], 464), ('dcbx', c.Array[ctypes.c_ubyte, Literal[1]], 465), ('general_notification_event', c.Array[ctypes.c_ubyte, Literal[1]], 466), ('reserved_at_1d3', c.Array[ctypes.c_ubyte, Literal[2]], 467), ('fpga', c.Array[ctypes.c_ubyte, Literal[1]], 469), ('rol_s', c.Array[ctypes.c_ubyte, Literal[1]], 470), ('rol_g', c.Array[ctypes.c_ubyte, Literal[1]], 471), ('reserved_at_1d8', c.Array[ctypes.c_ubyte, Literal[1]], 472), ('wol_s', c.Array[ctypes.c_ubyte, Literal[1]], 473), ('wol_g', c.Array[ctypes.c_ubyte, Literal[1]], 474), ('wol_a', c.Array[ctypes.c_ubyte, Literal[1]], 475), ('wol_b', c.Array[ctypes.c_ubyte, Literal[1]], 476), ('wol_m', c.Array[ctypes.c_ubyte, Literal[1]], 477), ('wol_u', c.Array[ctypes.c_ubyte, Literal[1]], 478), ('wol_p', c.Array[ctypes.c_ubyte, Literal[1]], 479), ('stat_rate_support', c.Array[ctypes.c_ubyte, Literal[16]], 480), ('reserved_at_1f0', c.Array[ctypes.c_ubyte, Literal[1]], 496), ('pci_sync_for_fw_update_event', c.Array[ctypes.c_ubyte, Literal[1]], 497), ('reserved_at_1f2', c.Array[ctypes.c_ubyte, Literal[6]], 498), ('init2_lag_tx_port_affinity', c.Array[ctypes.c_ubyte, Literal[1]], 504), ('reserved_at_1fa', c.Array[ctypes.c_ubyte, Literal[2]], 505), ('wqe_based_flow_table_update_cap', c.Array[ctypes.c_ubyte, Literal[1]], 507), ('cqe_version', c.Array[ctypes.c_ubyte, Literal[4]], 508), ('compact_address_vector', c.Array[ctypes.c_ubyte, Literal[1]], 512), ('striding_rq', c.Array[ctypes.c_ubyte, Literal[1]], 513), ('reserved_at_202', c.Array[ctypes.c_ubyte, Literal[1]], 514), ('ipoib_enhanced_offloads', c.Array[ctypes.c_ubyte, Literal[1]], 515), ('ipoib_basic_offloads', c.Array[ctypes.c_ubyte, Literal[1]], 516), ('reserved_at_205', c.Array[ctypes.c_ubyte, Literal[1]], 517), ('repeated_block_disabled', c.Array[ctypes.c_ubyte, Literal[1]], 518), ('umr_modify_entity_size_disabled', c.Array[ctypes.c_ubyte, Literal[1]], 519), ('umr_modify_atomic_disabled', c.Array[ctypes.c_ubyte, Literal[1]], 520), ('umr_indirect_mkey_disabled', c.Array[ctypes.c_ubyte, Literal[1]], 521), ('umr_fence', c.Array[ctypes.c_ubyte, Literal[2]], 522), ('dc_req_scat_data_cqe', c.Array[ctypes.c_ubyte, Literal[1]], 524), ('reserved_at_20d', c.Array[ctypes.c_ubyte, Literal[2]], 525), ('drain_sigerr', c.Array[ctypes.c_ubyte, Literal[1]], 527), ('cmdif_checksum', c.Array[ctypes.c_ubyte, Literal[2]], 528), ('sigerr_cqe', c.Array[ctypes.c_ubyte, Literal[1]], 530), ('reserved_at_213', c.Array[ctypes.c_ubyte, Literal[1]], 531), ('wq_signature', c.Array[ctypes.c_ubyte, Literal[1]], 532), ('sctr_data_cqe', c.Array[ctypes.c_ubyte, Literal[1]], 533), ('reserved_at_216', c.Array[ctypes.c_ubyte, Literal[1]], 534), ('sho', c.Array[ctypes.c_ubyte, Literal[1]], 535), ('tph', c.Array[ctypes.c_ubyte, Literal[1]], 536), ('rf', c.Array[ctypes.c_ubyte, Literal[1]], 537), ('dct', c.Array[ctypes.c_ubyte, Literal[1]], 538), ('qos', c.Array[ctypes.c_ubyte, Literal[1]], 539), ('eth_net_offloads', c.Array[ctypes.c_ubyte, Literal[1]], 540), ('roce', c.Array[ctypes.c_ubyte, Literal[1]], 541), ('atomic', c.Array[ctypes.c_ubyte, Literal[1]], 542), ('reserved_at_21f', c.Array[ctypes.c_ubyte, Literal[1]], 543), ('cq_oi', c.Array[ctypes.c_ubyte, Literal[1]], 544), ('cq_resize', c.Array[ctypes.c_ubyte, Literal[1]], 545), ('cq_moderation', c.Array[ctypes.c_ubyte, Literal[1]], 546), ('cq_period_mode_modify', c.Array[ctypes.c_ubyte, Literal[1]], 547), ('reserved_at_224', c.Array[ctypes.c_ubyte, Literal[2]], 548), ('cq_eq_remap', c.Array[ctypes.c_ubyte, Literal[1]], 550), ('pg', c.Array[ctypes.c_ubyte, Literal[1]], 551), ('block_lb_mc', c.Array[ctypes.c_ubyte, Literal[1]], 552), ('reserved_at_229', c.Array[ctypes.c_ubyte, Literal[1]], 553), ('scqe_break_moderation', c.Array[ctypes.c_ubyte, Literal[1]], 554), ('cq_period_start_from_cqe', c.Array[ctypes.c_ubyte, Literal[1]], 555), ('cd', c.Array[ctypes.c_ubyte, Literal[1]], 556), ('reserved_at_22d', c.Array[ctypes.c_ubyte, Literal[1]], 557), ('apm', c.Array[ctypes.c_ubyte, Literal[1]], 558), ('vector_calc', c.Array[ctypes.c_ubyte, Literal[1]], 559), ('umr_ptr_rlky', c.Array[ctypes.c_ubyte, Literal[1]], 560), ('imaicl', c.Array[ctypes.c_ubyte, Literal[1]], 561), ('qp_packet_based', c.Array[ctypes.c_ubyte, Literal[1]], 562), ('reserved_at_233', c.Array[ctypes.c_ubyte, Literal[3]], 563), ('qkv', c.Array[ctypes.c_ubyte, Literal[1]], 566), ('pkv', c.Array[ctypes.c_ubyte, Literal[1]], 567), ('set_deth_sqpn', c.Array[ctypes.c_ubyte, Literal[1]], 568), ('reserved_at_239', c.Array[ctypes.c_ubyte, Literal[3]], 569), ('xrc', c.Array[ctypes.c_ubyte, Literal[1]], 572), ('ud', c.Array[ctypes.c_ubyte, Literal[1]], 573), ('uc', c.Array[ctypes.c_ubyte, Literal[1]], 574), ('rc', c.Array[ctypes.c_ubyte, Literal[1]], 575), ('uar_4k', c.Array[ctypes.c_ubyte, Literal[1]], 576), ('reserved_at_241', c.Array[ctypes.c_ubyte, Literal[7]], 577), ('fl_rc_qp_when_roce_disabled', c.Array[ctypes.c_ubyte, Literal[1]], 584), ('regexp_params', c.Array[ctypes.c_ubyte, Literal[1]], 585), ('uar_sz', c.Array[ctypes.c_ubyte, Literal[6]], 586), ('port_selection_cap', c.Array[ctypes.c_ubyte, Literal[1]], 592), ('nic_cap_reg', c.Array[ctypes.c_ubyte, Literal[1]], 593), ('umem_uid_0', c.Array[ctypes.c_ubyte, Literal[1]], 594), ('reserved_at_253', c.Array[ctypes.c_ubyte, Literal[5]], 595), ('log_pg_sz', c.Array[ctypes.c_ubyte, Literal[8]], 600), ('bf', c.Array[ctypes.c_ubyte, Literal[1]], 608), ('driver_version', c.Array[ctypes.c_ubyte, Literal[1]], 609), ('pad_tx_eth_packet', c.Array[ctypes.c_ubyte, Literal[1]], 610), ('reserved_at_263', c.Array[ctypes.c_ubyte, Literal[3]], 611), ('mkey_by_name', c.Array[ctypes.c_ubyte, Literal[1]], 614), ('reserved_at_267', c.Array[ctypes.c_ubyte, Literal[4]], 615), ('log_bf_reg_size', c.Array[ctypes.c_ubyte, Literal[5]], 619), ('disciplined_fr_counter', c.Array[ctypes.c_ubyte, Literal[1]], 624), ('reserved_at_271', c.Array[ctypes.c_ubyte, Literal[2]], 625), ('qp_error_syndrome', c.Array[ctypes.c_ubyte, Literal[1]], 627), ('reserved_at_274', c.Array[ctypes.c_ubyte, Literal[2]], 628), ('lag_dct', c.Array[ctypes.c_ubyte, Literal[2]], 630), ('lag_tx_port_affinity', c.Array[ctypes.c_ubyte, Literal[1]], 632), ('lag_native_fdb_selection', c.Array[ctypes.c_ubyte, Literal[1]], 633), ('reserved_at_27a', c.Array[ctypes.c_ubyte, Literal[1]], 634), ('lag_master', c.Array[ctypes.c_ubyte, Literal[1]], 635), ('num_lag_ports', c.Array[ctypes.c_ubyte, Literal[4]], 636), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[16]], 640), ('max_wqe_sz_sq', c.Array[ctypes.c_ubyte, Literal[16]], 656), ('reserved_at_2a0', c.Array[ctypes.c_ubyte, Literal[7]], 672), ('mkey_pcie_tph', c.Array[ctypes.c_ubyte, Literal[1]], 679), ('reserved_at_2a8', c.Array[ctypes.c_ubyte, Literal[1]], 680), ('tis_tir_td_order', c.Array[ctypes.c_ubyte, Literal[1]], 681), ('psp', c.Array[ctypes.c_ubyte, Literal[1]], 682), ('shampo', c.Array[ctypes.c_ubyte, Literal[1]], 683), ('reserved_at_2ac', c.Array[ctypes.c_ubyte, Literal[4]], 684), ('max_wqe_sz_rq', c.Array[ctypes.c_ubyte, Literal[16]], 688), ('max_flow_counter_31_16', c.Array[ctypes.c_ubyte, Literal[16]], 704), ('max_wqe_sz_sq_dc', c.Array[ctypes.c_ubyte, Literal[16]], 720), ('reserved_at_2e0', c.Array[ctypes.c_ubyte, Literal[7]], 736), ('max_qp_mcg', c.Array[ctypes.c_ubyte, Literal[25]], 743), ('reserved_at_300', c.Array[ctypes.c_ubyte, Literal[16]], 768), ('flow_counter_bulk_alloc', c.Array[ctypes.c_ubyte, Literal[8]], 784), ('log_max_mcg', c.Array[ctypes.c_ubyte, Literal[8]], 792), ('reserved_at_320', c.Array[ctypes.c_ubyte, Literal[3]], 800), ('log_max_transport_domain', c.Array[ctypes.c_ubyte, Literal[5]], 803), ('reserved_at_328', c.Array[ctypes.c_ubyte, Literal[2]], 808), ('relaxed_ordering_read', c.Array[ctypes.c_ubyte, Literal[1]], 810), ('log_max_pd', c.Array[ctypes.c_ubyte, Literal[5]], 811), ('dp_ordering_ooo_all_ud', c.Array[ctypes.c_ubyte, Literal[1]], 816), ('dp_ordering_ooo_all_uc', c.Array[ctypes.c_ubyte, Literal[1]], 817), ('dp_ordering_ooo_all_xrc', c.Array[ctypes.c_ubyte, Literal[1]], 818), ('dp_ordering_ooo_all_dc', c.Array[ctypes.c_ubyte, Literal[1]], 819), ('dp_ordering_ooo_all_rc', c.Array[ctypes.c_ubyte, Literal[1]], 820), ('pcie_reset_using_hotreset_method', c.Array[ctypes.c_ubyte, Literal[1]], 821), ('pci_sync_for_fw_update_with_driver_unload', c.Array[ctypes.c_ubyte, Literal[1]], 822), ('vnic_env_cnt_steering_fail', c.Array[ctypes.c_ubyte, Literal[1]], 823), ('vport_counter_local_loopback', c.Array[ctypes.c_ubyte, Literal[1]], 824), ('q_counter_aggregation', c.Array[ctypes.c_ubyte, Literal[1]], 825), ('q_counter_other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 826), ('log_max_xrcd', c.Array[ctypes.c_ubyte, Literal[5]], 827), ('nic_receive_steering_discard', c.Array[ctypes.c_ubyte, Literal[1]], 832), ('receive_discard_vport_down', c.Array[ctypes.c_ubyte, Literal[1]], 833), ('transmit_discard_vport_down', c.Array[ctypes.c_ubyte, Literal[1]], 834), ('eq_overrun_count', c.Array[ctypes.c_ubyte, Literal[1]], 835), ('reserved_at_344', c.Array[ctypes.c_ubyte, Literal[1]], 836), ('invalid_command_count', c.Array[ctypes.c_ubyte, Literal[1]], 837), ('quota_exceeded_count', c.Array[ctypes.c_ubyte, Literal[1]], 838), ('reserved_at_347', c.Array[ctypes.c_ubyte, Literal[1]], 839), ('log_max_flow_counter_bulk', c.Array[ctypes.c_ubyte, Literal[8]], 840), ('max_flow_counter_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 848), ('reserved_at_360', c.Array[ctypes.c_ubyte, Literal[3]], 864), ('log_max_rq', c.Array[ctypes.c_ubyte, Literal[5]], 867), ('reserved_at_368', c.Array[ctypes.c_ubyte, Literal[3]], 872), ('log_max_sq', c.Array[ctypes.c_ubyte, Literal[5]], 875), ('reserved_at_370', c.Array[ctypes.c_ubyte, Literal[3]], 880), ('log_max_tir', c.Array[ctypes.c_ubyte, Literal[5]], 883), ('reserved_at_378', c.Array[ctypes.c_ubyte, Literal[3]], 888), ('log_max_tis', c.Array[ctypes.c_ubyte, Literal[5]], 891), ('basic_cyclic_rcv_wqe', c.Array[ctypes.c_ubyte, Literal[1]], 896), ('reserved_at_381', c.Array[ctypes.c_ubyte, Literal[2]], 897), ('log_max_rmp', c.Array[ctypes.c_ubyte, Literal[5]], 899), ('reserved_at_388', c.Array[ctypes.c_ubyte, Literal[3]], 904), ('log_max_rqt', c.Array[ctypes.c_ubyte, Literal[5]], 907), ('reserved_at_390', c.Array[ctypes.c_ubyte, Literal[3]], 912), ('log_max_rqt_size', c.Array[ctypes.c_ubyte, Literal[5]], 915), ('reserved_at_398', c.Array[ctypes.c_ubyte, Literal[1]], 920), ('vnic_env_cnt_bar_uar_access', c.Array[ctypes.c_ubyte, Literal[1]], 921), ('vnic_env_cnt_odp_page_fault', c.Array[ctypes.c_ubyte, Literal[1]], 922), ('log_max_tis_per_sq', c.Array[ctypes.c_ubyte, Literal[5]], 923), ('ext_stride_num_range', c.Array[ctypes.c_ubyte, Literal[1]], 928), ('roce_rw_supported', c.Array[ctypes.c_ubyte, Literal[1]], 929), ('log_max_current_uc_list_wr_supported', c.Array[ctypes.c_ubyte, Literal[1]], 930), ('log_max_stride_sz_rq', c.Array[ctypes.c_ubyte, Literal[5]], 931), ('reserved_at_3a8', c.Array[ctypes.c_ubyte, Literal[3]], 936), ('log_min_stride_sz_rq', c.Array[ctypes.c_ubyte, Literal[5]], 939), ('reserved_at_3b0', c.Array[ctypes.c_ubyte, Literal[3]], 944), ('log_max_stride_sz_sq', c.Array[ctypes.c_ubyte, Literal[5]], 947), ('reserved_at_3b8', c.Array[ctypes.c_ubyte, Literal[3]], 952), ('log_min_stride_sz_sq', c.Array[ctypes.c_ubyte, Literal[5]], 955), ('hairpin', c.Array[ctypes.c_ubyte, Literal[1]], 960), ('reserved_at_3c1', c.Array[ctypes.c_ubyte, Literal[2]], 961), ('log_max_hairpin_queues', c.Array[ctypes.c_ubyte, Literal[5]], 963), ('reserved_at_3c8', c.Array[ctypes.c_ubyte, Literal[3]], 968), ('log_max_hairpin_wq_data_sz', c.Array[ctypes.c_ubyte, Literal[5]], 971), ('reserved_at_3d0', c.Array[ctypes.c_ubyte, Literal[3]], 976), ('log_max_hairpin_num_packets', c.Array[ctypes.c_ubyte, Literal[5]], 979), ('reserved_at_3d8', c.Array[ctypes.c_ubyte, Literal[3]], 984), ('log_max_wq_sz', c.Array[ctypes.c_ubyte, Literal[5]], 987), ('nic_vport_change_event', c.Array[ctypes.c_ubyte, Literal[1]], 992), ('disable_local_lb_uc', c.Array[ctypes.c_ubyte, Literal[1]], 993), ('disable_local_lb_mc', c.Array[ctypes.c_ubyte, Literal[1]], 994), ('log_min_hairpin_wq_data_sz', c.Array[ctypes.c_ubyte, Literal[5]], 995), ('reserved_at_3e8', c.Array[ctypes.c_ubyte, Literal[1]], 1000), ('silent_mode', c.Array[ctypes.c_ubyte, Literal[1]], 1001), ('vhca_state', c.Array[ctypes.c_ubyte, Literal[1]], 1002), ('log_max_vlan_list', c.Array[ctypes.c_ubyte, Literal[5]], 1003), ('reserved_at_3f0', c.Array[ctypes.c_ubyte, Literal[3]], 1008), ('log_max_current_mc_list', c.Array[ctypes.c_ubyte, Literal[5]], 1011), ('reserved_at_3f8', c.Array[ctypes.c_ubyte, Literal[3]], 1016), ('log_max_current_uc_list', c.Array[ctypes.c_ubyte, Literal[5]], 1019), ('general_obj_types', c.Array[ctypes.c_ubyte, Literal[64]], 1024), ('sq_ts_format', c.Array[ctypes.c_ubyte, Literal[2]], 1088), ('rq_ts_format', c.Array[ctypes.c_ubyte, Literal[2]], 1090), ('steering_format_version', c.Array[ctypes.c_ubyte, Literal[4]], 1092), ('create_qp_start_hint', c.Array[ctypes.c_ubyte, Literal[24]], 1096), ('reserved_at_460', c.Array[ctypes.c_ubyte, Literal[1]], 1120), ('ats', c.Array[ctypes.c_ubyte, Literal[1]], 1121), ('cross_vhca_rqt', c.Array[ctypes.c_ubyte, Literal[1]], 1122), ('log_max_uctx', c.Array[ctypes.c_ubyte, Literal[5]], 1123), ('reserved_at_468', c.Array[ctypes.c_ubyte, Literal[1]], 1128), ('crypto', c.Array[ctypes.c_ubyte, Literal[1]], 1129), ('ipsec_offload', c.Array[ctypes.c_ubyte, Literal[1]], 1130), ('log_max_umem', c.Array[ctypes.c_ubyte, Literal[5]], 1131), ('max_num_eqs', c.Array[ctypes.c_ubyte, Literal[16]], 1136), ('reserved_at_480', c.Array[ctypes.c_ubyte, Literal[1]], 1152), ('tls_tx', c.Array[ctypes.c_ubyte, Literal[1]], 1153), ('tls_rx', c.Array[ctypes.c_ubyte, Literal[1]], 1154), ('log_max_l2_table', c.Array[ctypes.c_ubyte, Literal[5]], 1155), ('reserved_at_488', c.Array[ctypes.c_ubyte, Literal[8]], 1160), ('log_uar_page_sz', c.Array[ctypes.c_ubyte, Literal[16]], 1168), ('reserved_at_4a0', c.Array[ctypes.c_ubyte, Literal[32]], 1184), ('device_frequency_mhz', c.Array[ctypes.c_ubyte, Literal[32]], 1216), ('device_frequency_khz', c.Array[ctypes.c_ubyte, Literal[32]], 1248), ('reserved_at_500', c.Array[ctypes.c_ubyte, Literal[32]], 1280), ('num_of_uars_per_page', c.Array[ctypes.c_ubyte, Literal[32]], 1312), ('flex_parser_protocols', c.Array[ctypes.c_ubyte, Literal[32]], 1344), ('max_geneve_tlv_options', c.Array[ctypes.c_ubyte, Literal[8]], 1376), ('reserved_at_568', c.Array[ctypes.c_ubyte, Literal[3]], 1384), ('max_geneve_tlv_option_data_len', c.Array[ctypes.c_ubyte, Literal[5]], 1387), ('reserved_at_570', c.Array[ctypes.c_ubyte, Literal[1]], 1392), ('adv_rdma', c.Array[ctypes.c_ubyte, Literal[1]], 1393), ('reserved_at_572', c.Array[ctypes.c_ubyte, Literal[7]], 1394), ('adv_virtualization', c.Array[ctypes.c_ubyte, Literal[1]], 1401), ('reserved_at_57a', c.Array[ctypes.c_ubyte, Literal[6]], 1402), ('reserved_at_580', c.Array[ctypes.c_ubyte, Literal[11]], 1408), ('log_max_dci_stream_channels', c.Array[ctypes.c_ubyte, Literal[5]], 1419), ('reserved_at_590', c.Array[ctypes.c_ubyte, Literal[3]], 1424), ('log_max_dci_errored_streams', c.Array[ctypes.c_ubyte, Literal[5]], 1427), ('reserved_at_598', c.Array[ctypes.c_ubyte, Literal[8]], 1432), ('reserved_at_5a0', c.Array[ctypes.c_ubyte, Literal[16]], 1440), ('enhanced_cqe_compression', c.Array[ctypes.c_ubyte, Literal[1]], 1456), ('reserved_at_5b1', c.Array[ctypes.c_ubyte, Literal[1]], 1457), ('crossing_vhca_mkey', c.Array[ctypes.c_ubyte, Literal[1]], 1458), ('log_max_dek', c.Array[ctypes.c_ubyte, Literal[5]], 1459), ('reserved_at_5b8', c.Array[ctypes.c_ubyte, Literal[4]], 1464), ('mini_cqe_resp_stride_index', c.Array[ctypes.c_ubyte, Literal[1]], 1468), ('cqe_128_always', c.Array[ctypes.c_ubyte, Literal[1]], 1469), ('cqe_compression_128', c.Array[ctypes.c_ubyte, Literal[1]], 1470), ('cqe_compression', c.Array[ctypes.c_ubyte, Literal[1]], 1471), ('cqe_compression_timeout', c.Array[ctypes.c_ubyte, Literal[16]], 1472), ('cqe_compression_max_num', c.Array[ctypes.c_ubyte, Literal[16]], 1488), ('reserved_at_5e0', c.Array[ctypes.c_ubyte, Literal[8]], 1504), ('flex_parser_id_gtpu_dw_0', c.Array[ctypes.c_ubyte, Literal[4]], 1512), ('reserved_at_5ec', c.Array[ctypes.c_ubyte, Literal[4]], 1516), ('tag_matching', c.Array[ctypes.c_ubyte, Literal[1]], 1520), ('rndv_offload_rc', c.Array[ctypes.c_ubyte, Literal[1]], 1521), ('rndv_offload_dc', c.Array[ctypes.c_ubyte, Literal[1]], 1522), ('log_tag_matching_list_sz', c.Array[ctypes.c_ubyte, Literal[5]], 1523), ('reserved_at_5f8', c.Array[ctypes.c_ubyte, Literal[3]], 1528), ('log_max_xrq', c.Array[ctypes.c_ubyte, Literal[5]], 1531), ('affiliate_nic_vport_criteria', c.Array[ctypes.c_ubyte, Literal[8]], 1536), ('native_port_num', c.Array[ctypes.c_ubyte, Literal[8]], 1544), ('num_vhca_ports', c.Array[ctypes.c_ubyte, Literal[8]], 1552), ('flex_parser_id_gtpu_teid', c.Array[ctypes.c_ubyte, Literal[4]], 1560), ('reserved_at_61c', c.Array[ctypes.c_ubyte, Literal[2]], 1564), ('sw_owner_id', c.Array[ctypes.c_ubyte, Literal[1]], 1566), ('reserved_at_61f', c.Array[ctypes.c_ubyte, Literal[1]], 1567), ('max_num_of_monitor_counters', c.Array[ctypes.c_ubyte, Literal[16]], 1568), ('num_ppcnt_monitor_counters', c.Array[ctypes.c_ubyte, Literal[16]], 1584), ('max_num_sf', c.Array[ctypes.c_ubyte, Literal[16]], 1600), ('num_q_monitor_counters', c.Array[ctypes.c_ubyte, Literal[16]], 1616), ('reserved_at_660', c.Array[ctypes.c_ubyte, Literal[32]], 1632), ('sf', c.Array[ctypes.c_ubyte, Literal[1]], 1664), ('sf_set_partition', c.Array[ctypes.c_ubyte, Literal[1]], 1665), ('reserved_at_682', c.Array[ctypes.c_ubyte, Literal[1]], 1666), ('log_max_sf', c.Array[ctypes.c_ubyte, Literal[5]], 1667), ('apu', c.Array[ctypes.c_ubyte, Literal[1]], 1672), ('reserved_at_689', c.Array[ctypes.c_ubyte, Literal[4]], 1673), ('migration', c.Array[ctypes.c_ubyte, Literal[1]], 1677), ('reserved_at_68e', c.Array[ctypes.c_ubyte, Literal[2]], 1678), ('log_min_sf_size', c.Array[ctypes.c_ubyte, Literal[8]], 1680), ('max_num_sf_partitions', c.Array[ctypes.c_ubyte, Literal[8]], 1688), ('uctx_cap', c.Array[ctypes.c_ubyte, Literal[32]], 1696), ('reserved_at_6c0', c.Array[ctypes.c_ubyte, Literal[4]], 1728), ('flex_parser_id_geneve_tlv_option_0', c.Array[ctypes.c_ubyte, Literal[4]], 1732), ('flex_parser_id_icmp_dw1', c.Array[ctypes.c_ubyte, Literal[4]], 1736), ('flex_parser_id_icmp_dw0', c.Array[ctypes.c_ubyte, Literal[4]], 1740), ('flex_parser_id_icmpv6_dw1', c.Array[ctypes.c_ubyte, Literal[4]], 1744), ('flex_parser_id_icmpv6_dw0', c.Array[ctypes.c_ubyte, Literal[4]], 1748), ('flex_parser_id_outer_first_mpls_over_gre', c.Array[ctypes.c_ubyte, Literal[4]], 1752), ('flex_parser_id_outer_first_mpls_over_udp_label', c.Array[ctypes.c_ubyte, Literal[4]], 1756), ('max_num_match_definer', c.Array[ctypes.c_ubyte, Literal[16]], 1760), ('sf_base_id', c.Array[ctypes.c_ubyte, Literal[16]], 1776), ('flex_parser_id_gtpu_dw_2', c.Array[ctypes.c_ubyte, Literal[4]], 1792), ('flex_parser_id_gtpu_first_ext_dw_0', c.Array[ctypes.c_ubyte, Literal[4]], 1796), ('num_total_dynamic_vf_msix', c.Array[ctypes.c_ubyte, Literal[24]], 1800), ('reserved_at_720', c.Array[ctypes.c_ubyte, Literal[20]], 1824), ('dynamic_msix_table_size', c.Array[ctypes.c_ubyte, Literal[12]], 1844), ('reserved_at_740', c.Array[ctypes.c_ubyte, Literal[12]], 1856), ('min_dynamic_vf_msix_table_size', c.Array[ctypes.c_ubyte, Literal[4]], 1868), ('reserved_at_750', c.Array[ctypes.c_ubyte, Literal[2]], 1872), ('data_direct', c.Array[ctypes.c_ubyte, Literal[1]], 1874), ('reserved_at_753', c.Array[ctypes.c_ubyte, Literal[1]], 1875), ('max_dynamic_vf_msix_table_size', c.Array[ctypes.c_ubyte, Literal[12]], 1876), ('reserved_at_760', c.Array[ctypes.c_ubyte, Literal[3]], 1888), ('log_max_num_header_modify_argument', c.Array[ctypes.c_ubyte, Literal[5]], 1891), ('log_header_modify_argument_granularity_offset', c.Array[ctypes.c_ubyte, Literal[4]], 1896), ('log_header_modify_argument_granularity', c.Array[ctypes.c_ubyte, Literal[4]], 1900), ('reserved_at_770', c.Array[ctypes.c_ubyte, Literal[3]], 1904), ('log_header_modify_argument_max_alloc', c.Array[ctypes.c_ubyte, Literal[5]], 1907), ('reserved_at_778', c.Array[ctypes.c_ubyte, Literal[8]], 1912), ('vhca_tunnel_commands', c.Array[ctypes.c_ubyte, Literal[64]], 1920), ('match_definer_format_supported', c.Array[ctypes.c_ubyte, Literal[64]], 1984)]) +_anonenum28: dict[int, str] = {(MLX5_CROSS_VHCA_OBJ_TO_OBJ_SUPPORTED_LOCAL_FLOW_TABLE_TO_REMOTE_FLOW_TABLE_MISS:=524288): 'MLX5_CROSS_VHCA_OBJ_TO_OBJ_SUPPORTED_LOCAL_FLOW_TABLE_TO_REMOTE_FLOW_TABLE_MISS', (MLX5_CROSS_VHCA_OBJ_TO_OBJ_SUPPORTED_LOCAL_FLOW_TABLE_ROOT_TO_REMOTE_FLOW_TABLE:=1048576): 'MLX5_CROSS_VHCA_OBJ_TO_OBJ_SUPPORTED_LOCAL_FLOW_TABLE_ROOT_TO_REMOTE_FLOW_TABLE'} +_anonenum29: dict[int, str] = {(MLX5_ALLOWED_OBJ_FOR_OTHER_VHCA_ACCESS_FLOW_TABLE:=512): 'MLX5_ALLOWED_OBJ_FOR_OTHER_VHCA_ACCESS_FLOW_TABLE'} +@c.record +class struct_mlx5_ifc_cmd_hca_cap_2_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] + migratable: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_81: c.Array[ctypes.c_ubyte, Literal[7]] + dp_ordering_force: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_89: c.Array[ctypes.c_ubyte, Literal[9]] + query_vuid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_93: c.Array[ctypes.c_ubyte, Literal[5]] + umr_log_entity_size_5: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_99: c.Array[ctypes.c_ubyte, Literal[7]] + max_reformat_insert_size: c.Array[ctypes.c_ubyte, Literal[8]] + max_reformat_insert_offset: c.Array[ctypes.c_ubyte, Literal[8]] + max_reformat_remove_size: c.Array[ctypes.c_ubyte, Literal[8]] + max_reformat_remove_offset: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + migration_multi_load: c.Array[ctypes.c_ubyte, Literal[1]] + migration_tracking_state: c.Array[ctypes.c_ubyte, Literal[1]] + multiplane_qp_ud: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_cb: c.Array[ctypes.c_ubyte, Literal[5]] + migration_in_chunks: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_d1: c.Array[ctypes.c_ubyte, Literal[1]] + sf_eq_usage: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_d3: c.Array[ctypes.c_ubyte, Literal[5]] + multiplane: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_d9: c.Array[ctypes.c_ubyte, Literal[7]] + cross_vhca_object_to_object_supported: c.Array[ctypes.c_ubyte, Literal[32]] + allowed_object_for_other_vhca_access: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[96]] + flow_table_type_2_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_1a8: c.Array[ctypes.c_ubyte, Literal[2]] + format_select_dw_8_6_ext: c.Array[ctypes.c_ubyte, Literal[1]] + log_min_mkey_entity_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_1b0: c.Array[ctypes.c_ubyte, Literal[16]] + general_obj_types_127_64: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_200: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_220: c.Array[ctypes.c_ubyte, Literal[1]] + sw_vhca_id_valid: c.Array[ctypes.c_ubyte, Literal[1]] + sw_vhca_id: c.Array[ctypes.c_ubyte, Literal[14]] + reserved_at_230: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_240: c.Array[ctypes.c_ubyte, Literal[11]] + ts_cqe_metadata_size2wqe_counter: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_250: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_260: c.Array[ctypes.c_ubyte, Literal[32]] + format_select_dw_gtpu_dw_0: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw_gtpu_dw_1: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw_gtpu_dw_2: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw_gtpu_first_ext_dw_0: c.Array[ctypes.c_ubyte, Literal[8]] + generate_wqe_type: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_2c0: c.Array[ctypes.c_ubyte, Literal[192]] + reserved_at_380: c.Array[ctypes.c_ubyte, Literal[11]] + min_mkey_log_entity_size_fixed_buffer: c.Array[ctypes.c_ubyte, Literal[5]] + ec_vf_vport_base: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_3a0: c.Array[ctypes.c_ubyte, Literal[2]] + max_mkey_log_entity_size_fixed_buffer: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_3a8: c.Array[ctypes.c_ubyte, Literal[2]] + max_mkey_log_entity_size_mtt: c.Array[ctypes.c_ubyte, Literal[6]] + max_rqt_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_3c0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_3e0: c.Array[ctypes.c_ubyte, Literal[16]] + pcc_ifa2: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3f1: c.Array[ctypes.c_ubyte, Literal[15]] + reserved_at_400: c.Array[ctypes.c_ubyte, Literal[1]] + min_mkey_log_entity_size_fixed_buffer_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_402: c.Array[ctypes.c_ubyte, Literal[14]] + return_reg_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_420: c.Array[ctypes.c_ubyte, Literal[28]] + flow_table_hash_type: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_440: c.Array[ctypes.c_ubyte, Literal[8]] + max_num_eqs_24b: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_460: c.Array[ctypes.c_ubyte, Literal[324]] + load_balance_id: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_5a8: c.Array[ctypes.c_ubyte, Literal[24]] + query_adjacent_functions_id: c.Array[ctypes.c_ubyte, Literal[1]] + ingress_egress_esw_vport_connect: c.Array[ctypes.c_ubyte, Literal[1]] + function_id_type_vhca_id: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5c3: c.Array[ctypes.c_ubyte, Literal[1]] + lag_per_mp_group: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5c5: c.Array[ctypes.c_ubyte, Literal[11]] + delegate_vhca_management_profiles: c.Array[ctypes.c_ubyte, Literal[16]] + delegated_vhca_max: c.Array[ctypes.c_ubyte, Literal[16]] + delegate_vhca_max: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_600: c.Array[ctypes.c_ubyte, Literal[512]] +struct_mlx5_ifc_cmd_hca_cap_2_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0), ('migratable', c.Array[ctypes.c_ubyte, Literal[1]], 128), ('reserved_at_81', c.Array[ctypes.c_ubyte, Literal[7]], 129), ('dp_ordering_force', c.Array[ctypes.c_ubyte, Literal[1]], 136), ('reserved_at_89', c.Array[ctypes.c_ubyte, Literal[9]], 137), ('query_vuid', c.Array[ctypes.c_ubyte, Literal[1]], 146), ('reserved_at_93', c.Array[ctypes.c_ubyte, Literal[5]], 147), ('umr_log_entity_size_5', c.Array[ctypes.c_ubyte, Literal[1]], 152), ('reserved_at_99', c.Array[ctypes.c_ubyte, Literal[7]], 153), ('max_reformat_insert_size', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('max_reformat_insert_offset', c.Array[ctypes.c_ubyte, Literal[8]], 168), ('max_reformat_remove_size', c.Array[ctypes.c_ubyte, Literal[8]], 176), ('max_reformat_remove_offset', c.Array[ctypes.c_ubyte, Literal[8]], 184), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('migration_multi_load', c.Array[ctypes.c_ubyte, Literal[1]], 200), ('migration_tracking_state', c.Array[ctypes.c_ubyte, Literal[1]], 201), ('multiplane_qp_ud', c.Array[ctypes.c_ubyte, Literal[1]], 202), ('reserved_at_cb', c.Array[ctypes.c_ubyte, Literal[5]], 203), ('migration_in_chunks', c.Array[ctypes.c_ubyte, Literal[1]], 208), ('reserved_at_d1', c.Array[ctypes.c_ubyte, Literal[1]], 209), ('sf_eq_usage', c.Array[ctypes.c_ubyte, Literal[1]], 210), ('reserved_at_d3', c.Array[ctypes.c_ubyte, Literal[5]], 211), ('multiplane', c.Array[ctypes.c_ubyte, Literal[1]], 216), ('reserved_at_d9', c.Array[ctypes.c_ubyte, Literal[7]], 217), ('cross_vhca_object_to_object_supported', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('allowed_object_for_other_vhca_access', c.Array[ctypes.c_ubyte, Literal[64]], 256), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[96]], 320), ('flow_table_type_2_type', c.Array[ctypes.c_ubyte, Literal[8]], 416), ('reserved_at_1a8', c.Array[ctypes.c_ubyte, Literal[2]], 424), ('format_select_dw_8_6_ext', c.Array[ctypes.c_ubyte, Literal[1]], 426), ('log_min_mkey_entity_size', c.Array[ctypes.c_ubyte, Literal[5]], 427), ('reserved_at_1b0', c.Array[ctypes.c_ubyte, Literal[16]], 432), ('general_obj_types_127_64', c.Array[ctypes.c_ubyte, Literal[64]], 448), ('reserved_at_200', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('reserved_at_220', c.Array[ctypes.c_ubyte, Literal[1]], 544), ('sw_vhca_id_valid', c.Array[ctypes.c_ubyte, Literal[1]], 545), ('sw_vhca_id', c.Array[ctypes.c_ubyte, Literal[14]], 546), ('reserved_at_230', c.Array[ctypes.c_ubyte, Literal[16]], 560), ('reserved_at_240', c.Array[ctypes.c_ubyte, Literal[11]], 576), ('ts_cqe_metadata_size2wqe_counter', c.Array[ctypes.c_ubyte, Literal[5]], 587), ('reserved_at_250', c.Array[ctypes.c_ubyte, Literal[16]], 592), ('reserved_at_260', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('format_select_dw_gtpu_dw_0', c.Array[ctypes.c_ubyte, Literal[8]], 640), ('format_select_dw_gtpu_dw_1', c.Array[ctypes.c_ubyte, Literal[8]], 648), ('format_select_dw_gtpu_dw_2', c.Array[ctypes.c_ubyte, Literal[8]], 656), ('format_select_dw_gtpu_first_ext_dw_0', c.Array[ctypes.c_ubyte, Literal[8]], 664), ('generate_wqe_type', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('reserved_at_2c0', c.Array[ctypes.c_ubyte, Literal[192]], 704), ('reserved_at_380', c.Array[ctypes.c_ubyte, Literal[11]], 896), ('min_mkey_log_entity_size_fixed_buffer', c.Array[ctypes.c_ubyte, Literal[5]], 907), ('ec_vf_vport_base', c.Array[ctypes.c_ubyte, Literal[16]], 912), ('reserved_at_3a0', c.Array[ctypes.c_ubyte, Literal[2]], 928), ('max_mkey_log_entity_size_fixed_buffer', c.Array[ctypes.c_ubyte, Literal[6]], 930), ('reserved_at_3a8', c.Array[ctypes.c_ubyte, Literal[2]], 936), ('max_mkey_log_entity_size_mtt', c.Array[ctypes.c_ubyte, Literal[6]], 938), ('max_rqt_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 944), ('reserved_at_3c0', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('reserved_at_3e0', c.Array[ctypes.c_ubyte, Literal[16]], 992), ('pcc_ifa2', c.Array[ctypes.c_ubyte, Literal[1]], 1008), ('reserved_at_3f1', c.Array[ctypes.c_ubyte, Literal[15]], 1009), ('reserved_at_400', c.Array[ctypes.c_ubyte, Literal[1]], 1024), ('min_mkey_log_entity_size_fixed_buffer_valid', c.Array[ctypes.c_ubyte, Literal[1]], 1025), ('reserved_at_402', c.Array[ctypes.c_ubyte, Literal[14]], 1026), ('return_reg_id', c.Array[ctypes.c_ubyte, Literal[16]], 1040), ('reserved_at_420', c.Array[ctypes.c_ubyte, Literal[28]], 1056), ('flow_table_hash_type', c.Array[ctypes.c_ubyte, Literal[4]], 1084), ('reserved_at_440', c.Array[ctypes.c_ubyte, Literal[8]], 1088), ('max_num_eqs_24b', c.Array[ctypes.c_ubyte, Literal[24]], 1096), ('reserved_at_460', c.Array[ctypes.c_ubyte, Literal[324]], 1120), ('load_balance_id', c.Array[ctypes.c_ubyte, Literal[4]], 1444), ('reserved_at_5a8', c.Array[ctypes.c_ubyte, Literal[24]], 1448), ('query_adjacent_functions_id', c.Array[ctypes.c_ubyte, Literal[1]], 1472), ('ingress_egress_esw_vport_connect', c.Array[ctypes.c_ubyte, Literal[1]], 1473), ('function_id_type_vhca_id', c.Array[ctypes.c_ubyte, Literal[1]], 1474), ('reserved_at_5c3', c.Array[ctypes.c_ubyte, Literal[1]], 1475), ('lag_per_mp_group', c.Array[ctypes.c_ubyte, Literal[1]], 1476), ('reserved_at_5c5', c.Array[ctypes.c_ubyte, Literal[11]], 1477), ('delegate_vhca_management_profiles', c.Array[ctypes.c_ubyte, Literal[16]], 1488), ('delegated_vhca_max', c.Array[ctypes.c_ubyte, Literal[16]], 1504), ('delegate_vhca_max', c.Array[ctypes.c_ubyte, Literal[16]], 1520), ('reserved_at_600', c.Array[ctypes.c_ubyte, Literal[512]], 1536)]) +enum_mlx5_ifc_flow_destination_type: dict[int, str] = {(MLX5_IFC_FLOW_DESTINATION_TYPE_VPORT:=0): 'MLX5_IFC_FLOW_DESTINATION_TYPE_VPORT', (MLX5_IFC_FLOW_DESTINATION_TYPE_FLOW_TABLE:=1): 'MLX5_IFC_FLOW_DESTINATION_TYPE_FLOW_TABLE', (MLX5_IFC_FLOW_DESTINATION_TYPE_TIR:=2): 'MLX5_IFC_FLOW_DESTINATION_TYPE_TIR', (MLX5_IFC_FLOW_DESTINATION_TYPE_FLOW_SAMPLER:=6): 'MLX5_IFC_FLOW_DESTINATION_TYPE_FLOW_SAMPLER', (MLX5_IFC_FLOW_DESTINATION_TYPE_UPLINK:=8): 'MLX5_IFC_FLOW_DESTINATION_TYPE_UPLINK', (MLX5_IFC_FLOW_DESTINATION_TYPE_TABLE_TYPE:=10): 'MLX5_IFC_FLOW_DESTINATION_TYPE_TABLE_TYPE'} +enum_mlx5_flow_table_miss_action: dict[int, str] = {(MLX5_FLOW_TABLE_MISS_ACTION_DEF:=0): 'MLX5_FLOW_TABLE_MISS_ACTION_DEF', (MLX5_FLOW_TABLE_MISS_ACTION_FWD:=1): 'MLX5_FLOW_TABLE_MISS_ACTION_FWD', (MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN:=2): 'MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN'} +@c.record +class struct_mlx5_ifc_dest_format_struct_bits(c.Struct): + SIZE = 64 + destination_type: c.Array[ctypes.c_ubyte, Literal[8]] + destination_id: c.Array[ctypes.c_ubyte, Literal[24]] + destination_eswitch_owner_vhca_id_valid: c.Array[ctypes.c_ubyte, Literal[1]] + packet_reformat: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[6]] + destination_table_type: c.Array[ctypes.c_ubyte, Literal[8]] + destination_eswitch_owner_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_dest_format_struct_bits.register_fields([('destination_type', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('destination_id', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('destination_eswitch_owner_vhca_id_valid', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('packet_reformat', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[6]], 34), ('destination_table_type', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('destination_eswitch_owner_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 48)]) +@c.record +class struct_mlx5_ifc_flow_counter_list_bits(c.Struct): + SIZE = 64 + flow_counter_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_flow_counter_list_bits.register_fields([('flow_counter_id', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_extended_dest_format_bits(c.Struct): + SIZE = 128 + destination_entry: struct_mlx5_ifc_dest_format_struct_bits + packet_reformat_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_extended_dest_format_bits.register_fields([('destination_entry', struct_mlx5_ifc_dest_format_struct_bits, 0), ('packet_reformat_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class union_mlx5_ifc_dest_format_flow_counter_list_auto_bits(c.Struct): + SIZE = 128 + extended_dest_format: struct_mlx5_ifc_extended_dest_format_bits + flow_counter_list: struct_mlx5_ifc_flow_counter_list_bits +union_mlx5_ifc_dest_format_flow_counter_list_auto_bits.register_fields([('extended_dest_format', struct_mlx5_ifc_extended_dest_format_bits, 0), ('flow_counter_list', struct_mlx5_ifc_flow_counter_list_bits, 0)]) +@c.record +class struct_mlx5_ifc_fte_match_param_bits(c.Struct): + SIZE = 4096 + outer_headers: struct_mlx5_ifc_fte_match_set_lyr_2_4_bits + misc_parameters: struct_mlx5_ifc_fte_match_set_misc_bits + inner_headers: struct_mlx5_ifc_fte_match_set_lyr_2_4_bits + misc_parameters_2: struct_mlx5_ifc_fte_match_set_misc2_bits + misc_parameters_3: struct_mlx5_ifc_fte_match_set_misc3_bits + misc_parameters_4: struct_mlx5_ifc_fte_match_set_misc4_bits + misc_parameters_5: struct_mlx5_ifc_fte_match_set_misc5_bits + reserved_at_e00: c.Array[ctypes.c_ubyte, Literal[512]] +struct_mlx5_ifc_fte_match_param_bits.register_fields([('outer_headers', struct_mlx5_ifc_fte_match_set_lyr_2_4_bits, 0), ('misc_parameters', struct_mlx5_ifc_fte_match_set_misc_bits, 512), ('inner_headers', struct_mlx5_ifc_fte_match_set_lyr_2_4_bits, 1024), ('misc_parameters_2', struct_mlx5_ifc_fte_match_set_misc2_bits, 1536), ('misc_parameters_3', struct_mlx5_ifc_fte_match_set_misc3_bits, 2048), ('misc_parameters_4', struct_mlx5_ifc_fte_match_set_misc4_bits, 2560), ('misc_parameters_5', struct_mlx5_ifc_fte_match_set_misc5_bits, 3072), ('reserved_at_e00', c.Array[ctypes.c_ubyte, Literal[512]], 3584)]) +_anonenum30: dict[int, str] = {(MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_SRC_IP:=0): 'MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_SRC_IP', (MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_DST_IP:=1): 'MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_DST_IP', (MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_L4_SPORT:=2): 'MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_L4_SPORT', (MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_L4_DPORT:=3): 'MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_L4_DPORT', (MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_IPSEC_SPI:=4): 'MLX5_RX_HASH_FIELD_SELECT_SELECTED_FIELDS_IPSEC_SPI'} +@c.record +class struct_mlx5_ifc_rx_hash_field_select_bits(c.Struct): + SIZE = 32 + l3_prot_type: c.Array[ctypes.c_ubyte, Literal[1]] + l4_prot_type: c.Array[ctypes.c_ubyte, Literal[1]] + selected_fields: c.Array[ctypes.c_ubyte, Literal[30]] +struct_mlx5_ifc_rx_hash_field_select_bits.register_fields([('l3_prot_type', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('l4_prot_type', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('selected_fields', c.Array[ctypes.c_ubyte, Literal[30]], 2)]) +_anonenum31: dict[int, str] = {(MLX5_WQ_WQ_TYPE_WQ_LINKED_LIST:=0): 'MLX5_WQ_WQ_TYPE_WQ_LINKED_LIST', (MLX5_WQ_WQ_TYPE_WQ_CYCLIC:=1): 'MLX5_WQ_WQ_TYPE_WQ_CYCLIC'} +_anonenum32: dict[int, str] = {(MLX5_WQ_END_PADDING_MODE_END_PAD_NONE:=0): 'MLX5_WQ_END_PADDING_MODE_END_PAD_NONE', (MLX5_WQ_END_PADDING_MODE_END_PAD_ALIGN:=1): 'MLX5_WQ_END_PADDING_MODE_END_PAD_ALIGN'} +@c.record +class struct_mlx5_ifc_wq_bits(c.Struct): + SIZE = 1536 + wq_type: c.Array[ctypes.c_ubyte, Literal[4]] + wq_signature: c.Array[ctypes.c_ubyte, Literal[1]] + end_padding_mode: c.Array[ctypes.c_ubyte, Literal[2]] + cd_slave: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + hds_skip_first_sge: c.Array[ctypes.c_ubyte, Literal[1]] + log2_hds_buf_size: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_24: c.Array[ctypes.c_ubyte, Literal[7]] + page_offset: c.Array[ctypes.c_ubyte, Literal[5]] + lwm: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[8]] + uar_page: c.Array[ctypes.c_ubyte, Literal[24]] + dbr_addr: c.Array[ctypes.c_ubyte, Literal[64]] + hw_counter: c.Array[ctypes.c_ubyte, Literal[32]] + sw_counter: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[12]] + log_wq_stride: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_110: c.Array[ctypes.c_ubyte, Literal[3]] + log_wq_pg_sz: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_118: c.Array[ctypes.c_ubyte, Literal[3]] + log_wq_sz: c.Array[ctypes.c_ubyte, Literal[5]] + dbr_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + wq_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_122: c.Array[ctypes.c_ubyte, Literal[1]] + log_hairpin_num_packets: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_128: c.Array[ctypes.c_ubyte, Literal[3]] + log_hairpin_data_sz: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_130: c.Array[ctypes.c_ubyte, Literal[4]] + log_wqe_num_of_strides: c.Array[ctypes.c_ubyte, Literal[4]] + two_byte_shift_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_139: c.Array[ctypes.c_ubyte, Literal[4]] + log_wqe_stride_size: c.Array[ctypes.c_ubyte, Literal[3]] + dbr_umem_id: c.Array[ctypes.c_ubyte, Literal[32]] + wq_umem_id: c.Array[ctypes.c_ubyte, Literal[32]] + wq_umem_offset: c.Array[ctypes.c_ubyte, Literal[64]] + headers_mkey: c.Array[ctypes.c_ubyte, Literal[32]] + shampo_enable: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1e1: c.Array[ctypes.c_ubyte, Literal[1]] + shampo_mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_1e4: c.Array[ctypes.c_ubyte, Literal[1]] + log_reservation_size: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_1e8: c.Array[ctypes.c_ubyte, Literal[5]] + log_max_num_of_packets_per_reservation: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_1f0: c.Array[ctypes.c_ubyte, Literal[6]] + log_headers_entry_size: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_1f8: c.Array[ctypes.c_ubyte, Literal[4]] + log_headers_buffer_entry_num: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_200: c.Array[ctypes.c_ubyte, Literal[1024]] + pas: c.Array[struct_mlx5_ifc_cmd_pas_bits, Literal[0]] +struct_mlx5_ifc_wq_bits.register_fields([('wq_type', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('wq_signature', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('end_padding_mode', c.Array[ctypes.c_ubyte, Literal[2]], 5), ('cd_slave', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('hds_skip_first_sge', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('log2_hds_buf_size', c.Array[ctypes.c_ubyte, Literal[3]], 33), ('reserved_at_24', c.Array[ctypes.c_ubyte, Literal[7]], 36), ('page_offset', c.Array[ctypes.c_ubyte, Literal[5]], 43), ('lwm', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('uar_page', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('dbr_addr', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('hw_counter', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('sw_counter', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[12]], 256), ('log_wq_stride', c.Array[ctypes.c_ubyte, Literal[4]], 268), ('reserved_at_110', c.Array[ctypes.c_ubyte, Literal[3]], 272), ('log_wq_pg_sz', c.Array[ctypes.c_ubyte, Literal[5]], 275), ('reserved_at_118', c.Array[ctypes.c_ubyte, Literal[3]], 280), ('log_wq_sz', c.Array[ctypes.c_ubyte, Literal[5]], 283), ('dbr_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 288), ('wq_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 289), ('reserved_at_122', c.Array[ctypes.c_ubyte, Literal[1]], 290), ('log_hairpin_num_packets', c.Array[ctypes.c_ubyte, Literal[5]], 291), ('reserved_at_128', c.Array[ctypes.c_ubyte, Literal[3]], 296), ('log_hairpin_data_sz', c.Array[ctypes.c_ubyte, Literal[5]], 299), ('reserved_at_130', c.Array[ctypes.c_ubyte, Literal[4]], 304), ('log_wqe_num_of_strides', c.Array[ctypes.c_ubyte, Literal[4]], 308), ('two_byte_shift_en', c.Array[ctypes.c_ubyte, Literal[1]], 312), ('reserved_at_139', c.Array[ctypes.c_ubyte, Literal[4]], 313), ('log_wqe_stride_size', c.Array[ctypes.c_ubyte, Literal[3]], 317), ('dbr_umem_id', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('wq_umem_id', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('wq_umem_offset', c.Array[ctypes.c_ubyte, Literal[64]], 384), ('headers_mkey', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('shampo_enable', c.Array[ctypes.c_ubyte, Literal[1]], 480), ('reserved_at_1e1', c.Array[ctypes.c_ubyte, Literal[1]], 481), ('shampo_mode', c.Array[ctypes.c_ubyte, Literal[2]], 482), ('reserved_at_1e4', c.Array[ctypes.c_ubyte, Literal[1]], 484), ('log_reservation_size', c.Array[ctypes.c_ubyte, Literal[3]], 485), ('reserved_at_1e8', c.Array[ctypes.c_ubyte, Literal[5]], 488), ('log_max_num_of_packets_per_reservation', c.Array[ctypes.c_ubyte, Literal[3]], 493), ('reserved_at_1f0', c.Array[ctypes.c_ubyte, Literal[6]], 496), ('log_headers_entry_size', c.Array[ctypes.c_ubyte, Literal[2]], 502), ('reserved_at_1f8', c.Array[ctypes.c_ubyte, Literal[4]], 504), ('log_headers_buffer_entry_num', c.Array[ctypes.c_ubyte, Literal[4]], 508), ('reserved_at_200', c.Array[ctypes.c_ubyte, Literal[1024]], 512), ('pas', c.Array[struct_mlx5_ifc_cmd_pas_bits, Literal[0]], 1536)]) +@c.record +class struct_mlx5_ifc_rq_num_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + rq_num: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_rq_num_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('rq_num', c.Array[ctypes.c_ubyte, Literal[24]], 8)]) +@c.record +class struct_mlx5_ifc_rq_vhca_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + rq_num: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + rq_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_rq_vhca_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('rq_num', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('rq_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 48)]) +@c.record +class struct_mlx5_ifc_mac_address_layout_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + mac_addr_47_32: c.Array[ctypes.c_ubyte, Literal[16]] + mac_addr_31_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mac_address_layout_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('mac_addr_47_32', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('mac_addr_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_vlan_layout_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[20]] + vlan: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_vlan_layout_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[20]], 0), ('vlan', c.Array[ctypes.c_ubyte, Literal[12]], 20), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_cong_control_r_roce_ecn_np_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[160]] + min_time_between_cnps: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[18]] + cnp_dscp: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_d8: c.Array[ctypes.c_ubyte, Literal[4]] + cnp_prio_mode: c.Array[ctypes.c_ubyte, Literal[1]] + cnp_802p_prio: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[1824]] +struct_mlx5_ifc_cong_control_r_roce_ecn_np_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[160]], 0), ('min_time_between_cnps', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[18]], 192), ('cnp_dscp', c.Array[ctypes.c_ubyte, Literal[6]], 210), ('reserved_at_d8', c.Array[ctypes.c_ubyte, Literal[4]], 216), ('cnp_prio_mode', c.Array[ctypes.c_ubyte, Literal[1]], 220), ('cnp_802p_prio', c.Array[ctypes.c_ubyte, Literal[3]], 221), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[1824]], 224)]) +@c.record +class struct_mlx5_ifc_cong_control_r_roce_ecn_rp_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[4]] + clamp_tgt_rate: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_65: c.Array[ctypes.c_ubyte, Literal[3]] + clamp_tgt_rate_after_time_inc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_69: c.Array[ctypes.c_ubyte, Literal[23]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_time_reset: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_byte_reset: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_threshold: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_max_rate: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_ai_rate: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_hai_rate: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_gd: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_min_dec_fac: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_min_rate: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[224]] + rate_to_set_on_first_cnp: c.Array[ctypes.c_ubyte, Literal[32]] + dce_tcp_g: c.Array[ctypes.c_ubyte, Literal[32]] + dce_tcp_rtt: c.Array[ctypes.c_ubyte, Literal[32]] + rate_reduce_monitor_period: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_320: c.Array[ctypes.c_ubyte, Literal[32]] + initial_alpha_value: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_360: c.Array[ctypes.c_ubyte, Literal[1184]] +struct_mlx5_ifc_cong_control_r_roce_ecn_rp_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[96]], 0), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[4]], 96), ('clamp_tgt_rate', c.Array[ctypes.c_ubyte, Literal[1]], 100), ('reserved_at_65', c.Array[ctypes.c_ubyte, Literal[3]], 101), ('clamp_tgt_rate_after_time_inc', c.Array[ctypes.c_ubyte, Literal[1]], 104), ('reserved_at_69', c.Array[ctypes.c_ubyte, Literal[23]], 105), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('rpg_time_reset', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('rpg_byte_reset', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('rpg_threshold', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('rpg_max_rate', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('rpg_ai_rate', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('rpg_hai_rate', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('rpg_gd', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('rpg_min_dec_fac', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('rpg_min_rate', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[224]], 448), ('rate_to_set_on_first_cnp', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('dce_tcp_g', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('dce_tcp_rtt', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('rate_reduce_monitor_period', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('reserved_at_320', c.Array[ctypes.c_ubyte, Literal[32]], 800), ('initial_alpha_value', c.Array[ctypes.c_ubyte, Literal[32]], 832), ('reserved_at_360', c.Array[ctypes.c_ubyte, Literal[1184]], 864)]) +@c.record +class struct_mlx5_ifc_cong_control_r_roce_general_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[16]] + rtt_resp_dscp_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_91: c.Array[ctypes.c_ubyte, Literal[9]] + rtt_resp_dscp: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[1888]] +struct_mlx5_ifc_cong_control_r_roce_general_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('rtt_resp_dscp_valid', c.Array[ctypes.c_ubyte, Literal[1]], 144), ('reserved_at_91', c.Array[ctypes.c_ubyte, Literal[9]], 145), ('rtt_resp_dscp', c.Array[ctypes.c_ubyte, Literal[6]], 154), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[1888]], 160)]) +@c.record +class struct_mlx5_ifc_cong_control_802_1qau_rp_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] + rppp_max_rps: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_time_reset: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_byte_reset: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_threshold: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_max_rate: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_ai_rate: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_hai_rate: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_gd: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_min_dec_fac: c.Array[ctypes.c_ubyte, Literal[32]] + rpg_min_rate: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[1600]] +struct_mlx5_ifc_cong_control_802_1qau_rp_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0), ('rppp_max_rps', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('rpg_time_reset', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('rpg_byte_reset', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('rpg_threshold', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('rpg_max_rate', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('rpg_ai_rate', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('rpg_hai_rate', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('rpg_gd', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('rpg_min_dec_fac', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('rpg_min_rate', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[1600]], 448)]) +_anonenum33: dict[int, str] = {(MLX5_RESIZE_FIELD_SELECT_RESIZE_FIELD_SELECT_LOG_CQ_SIZE:=1): 'MLX5_RESIZE_FIELD_SELECT_RESIZE_FIELD_SELECT_LOG_CQ_SIZE', (MLX5_RESIZE_FIELD_SELECT_RESIZE_FIELD_SELECT_PAGE_OFFSET:=2): 'MLX5_RESIZE_FIELD_SELECT_RESIZE_FIELD_SELECT_PAGE_OFFSET', (MLX5_RESIZE_FIELD_SELECT_RESIZE_FIELD_SELECT_LOG_PAGE_SIZE:=4): 'MLX5_RESIZE_FIELD_SELECT_RESIZE_FIELD_SELECT_LOG_PAGE_SIZE'} +@c.record +class struct_mlx5_ifc_resize_field_select_bits(c.Struct): + SIZE = 32 + resize_field_select: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_resize_field_select_bits.register_fields([('resize_field_select', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_resource_dump_bits(c.Struct): + SIZE = 2048 + more_dump: c.Array[ctypes.c_ubyte, Literal[1]] + inline_dump: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[10]] + seq_num: c.Array[ctypes.c_ubyte, Literal[4]] + segment_type: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + index1: c.Array[ctypes.c_ubyte, Literal[32]] + index2: c.Array[ctypes.c_ubyte, Literal[32]] + num_of_obj1: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_obj2: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + device_opaque: c.Array[ctypes.c_ubyte, Literal[64]] + mkey: c.Array[ctypes.c_ubyte, Literal[32]] + size: c.Array[ctypes.c_ubyte, Literal[32]] + address: c.Array[ctypes.c_ubyte, Literal[64]] + inline_data: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[52]] +struct_mlx5_ifc_resource_dump_bits.register_fields([('more_dump', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('inline_dump', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[10]], 2), ('seq_num', c.Array[ctypes.c_ubyte, Literal[4]], 12), ('segment_type', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('index1', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('index2', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('num_of_obj1', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('num_of_obj2', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('device_opaque', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('mkey', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('size', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('address', c.Array[ctypes.c_ubyte, Literal[64]], 320), ('inline_data', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[52]], 384)]) +@c.record +class struct_mlx5_ifc_resource_dump_menu_record_bits(c.Struct): + SIZE = 416 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + num_of_obj2_supports_active: c.Array[ctypes.c_ubyte, Literal[1]] + num_of_obj2_supports_all: c.Array[ctypes.c_ubyte, Literal[1]] + must_have_num_of_obj2: c.Array[ctypes.c_ubyte, Literal[1]] + support_num_of_obj2: c.Array[ctypes.c_ubyte, Literal[1]] + num_of_obj1_supports_active: c.Array[ctypes.c_ubyte, Literal[1]] + num_of_obj1_supports_all: c.Array[ctypes.c_ubyte, Literal[1]] + must_have_num_of_obj1: c.Array[ctypes.c_ubyte, Literal[1]] + support_num_of_obj1: c.Array[ctypes.c_ubyte, Literal[1]] + must_have_index2: c.Array[ctypes.c_ubyte, Literal[1]] + support_index2: c.Array[ctypes.c_ubyte, Literal[1]] + must_have_index1: c.Array[ctypes.c_ubyte, Literal[1]] + support_index1: c.Array[ctypes.c_ubyte, Literal[1]] + segment_type: c.Array[ctypes.c_ubyte, Literal[16]] + segment_name: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]] + index1_name: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]] + index2_name: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]] +struct_mlx5_ifc_resource_dump_menu_record_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('num_of_obj2_supports_active', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('num_of_obj2_supports_all', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('must_have_num_of_obj2', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('support_num_of_obj2', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('num_of_obj1_supports_active', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('num_of_obj1_supports_all', c.Array[ctypes.c_ubyte, Literal[1]], 9), ('must_have_num_of_obj1', c.Array[ctypes.c_ubyte, Literal[1]], 10), ('support_num_of_obj1', c.Array[ctypes.c_ubyte, Literal[1]], 11), ('must_have_index2', c.Array[ctypes.c_ubyte, Literal[1]], 12), ('support_index2', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('must_have_index1', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('support_index1', c.Array[ctypes.c_ubyte, Literal[1]], 15), ('segment_type', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('segment_name', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]], 32), ('index1_name', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]], 160), ('index2_name', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]], 288)]) +@c.record +class struct_mlx5_ifc_resource_dump_segment_header_bits(c.Struct): + SIZE = 32 + length_dw: c.Array[ctypes.c_ubyte, Literal[16]] + segment_type: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_resource_dump_segment_header_bits.register_fields([('length_dw', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('segment_type', c.Array[ctypes.c_ubyte, Literal[16]], 16)]) +@c.record +class struct_mlx5_ifc_resource_dump_command_segment_bits(c.Struct): + SIZE = 160 + segment_header: struct_mlx5_ifc_resource_dump_segment_header_bits + segment_called: c.Array[ctypes.c_ubyte, Literal[16]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + index1: c.Array[ctypes.c_ubyte, Literal[32]] + index2: c.Array[ctypes.c_ubyte, Literal[32]] + num_of_obj1: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_obj2: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_resource_dump_command_segment_bits.register_fields([('segment_header', struct_mlx5_ifc_resource_dump_segment_header_bits, 0), ('segment_called', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('index1', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('index2', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('num_of_obj1', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('num_of_obj2', c.Array[ctypes.c_ubyte, Literal[16]], 144)]) +@c.record +class struct_mlx5_ifc_resource_dump_error_segment_bits(c.Struct): + SIZE = 384 + segment_header: struct_mlx5_ifc_resource_dump_segment_header_bits + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + syndrome_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + error: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] +struct_mlx5_ifc_resource_dump_error_segment_bits.register_fields([('segment_header', struct_mlx5_ifc_resource_dump_segment_header_bits, 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('syndrome_id', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('error', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 128)]) +@c.record +class struct_mlx5_ifc_resource_dump_info_segment_bits(c.Struct): + SIZE = 128 + segment_header: struct_mlx5_ifc_resource_dump_segment_header_bits + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[24]] + dump_version: c.Array[ctypes.c_ubyte, Literal[8]] + hw_version: c.Array[ctypes.c_ubyte, Literal[32]] + fw_version: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_resource_dump_info_segment_bits.register_fields([('segment_header', struct_mlx5_ifc_resource_dump_segment_header_bits, 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[24]], 32), ('dump_version', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('hw_version', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('fw_version', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_resource_dump_menu_segment_bits(c.Struct): + SIZE = 64 + segment_header: struct_mlx5_ifc_resource_dump_segment_header_bits + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_records: c.Array[ctypes.c_ubyte, Literal[16]] + record: c.Array[struct_mlx5_ifc_resource_dump_menu_record_bits, Literal[0]] +struct_mlx5_ifc_resource_dump_menu_segment_bits.register_fields([('segment_header', struct_mlx5_ifc_resource_dump_segment_header_bits, 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('num_of_records', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('record', c.Array[struct_mlx5_ifc_resource_dump_menu_record_bits, Literal[0]], 64)]) +@c.record +class struct_mlx5_ifc_resource_dump_resource_segment_bits(c.Struct): + SIZE = 128 + segment_header: struct_mlx5_ifc_resource_dump_segment_header_bits + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + index1: c.Array[ctypes.c_ubyte, Literal[32]] + index2: c.Array[ctypes.c_ubyte, Literal[32]] + payload: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]] +struct_mlx5_ifc_resource_dump_resource_segment_bits.register_fields([('segment_header', struct_mlx5_ifc_resource_dump_segment_header_bits, 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('index1', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('index2', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('payload', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_resource_dump_terminate_segment_bits(c.Struct): + SIZE = 32 + segment_header: struct_mlx5_ifc_resource_dump_segment_header_bits +struct_mlx5_ifc_resource_dump_terminate_segment_bits.register_fields([('segment_header', struct_mlx5_ifc_resource_dump_segment_header_bits, 0)]) +@c.record +class struct_mlx5_ifc_menu_resource_dump_response_bits(c.Struct): + SIZE = 384 + info: struct_mlx5_ifc_resource_dump_info_segment_bits + cmd: struct_mlx5_ifc_resource_dump_command_segment_bits + menu: struct_mlx5_ifc_resource_dump_menu_segment_bits + terminate: struct_mlx5_ifc_resource_dump_terminate_segment_bits +struct_mlx5_ifc_menu_resource_dump_response_bits.register_fields([('info', struct_mlx5_ifc_resource_dump_info_segment_bits, 0), ('cmd', struct_mlx5_ifc_resource_dump_command_segment_bits, 128), ('menu', struct_mlx5_ifc_resource_dump_menu_segment_bits, 288), ('terminate', struct_mlx5_ifc_resource_dump_terminate_segment_bits, 352)]) +_anonenum34: dict[int, str] = {(MLX5_MODIFY_FIELD_SELECT_MODIFY_FIELD_SELECT_CQ_PERIOD:=1): 'MLX5_MODIFY_FIELD_SELECT_MODIFY_FIELD_SELECT_CQ_PERIOD', (MLX5_MODIFY_FIELD_SELECT_MODIFY_FIELD_SELECT_CQ_MAX_COUNT:=2): 'MLX5_MODIFY_FIELD_SELECT_MODIFY_FIELD_SELECT_CQ_MAX_COUNT', (MLX5_MODIFY_FIELD_SELECT_MODIFY_FIELD_SELECT_OI:=4): 'MLX5_MODIFY_FIELD_SELECT_MODIFY_FIELD_SELECT_OI', (MLX5_MODIFY_FIELD_SELECT_MODIFY_FIELD_SELECT_C_EQN:=8): 'MLX5_MODIFY_FIELD_SELECT_MODIFY_FIELD_SELECT_C_EQN'} +@c.record +class struct_mlx5_ifc_modify_field_select_bits(c.Struct): + SIZE = 32 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_modify_field_select_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_field_select_r_roce_np_bits(c.Struct): + SIZE = 32 + field_select_r_roce_np: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_field_select_r_roce_np_bits.register_fields([('field_select_r_roce_np', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_field_select_r_roce_rp_bits(c.Struct): + SIZE = 32 + field_select_r_roce_rp: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_field_select_r_roce_rp_bits.register_fields([('field_select_r_roce_rp', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +_anonenum35: dict[int, str] = {(MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPPP_MAX_RPS:=4): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPPP_MAX_RPS', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_TIME_RESET:=8): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_TIME_RESET', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_BYTE_RESET:=16): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_BYTE_RESET', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_THRESHOLD:=32): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_THRESHOLD', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_MAX_RATE:=64): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_MAX_RATE', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_AI_RATE:=128): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_AI_RATE', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_HAI_RATE:=256): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_HAI_RATE', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_GD:=512): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_GD', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_MIN_DEC_FAC:=1024): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_MIN_DEC_FAC', (MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_MIN_RATE:=2048): 'MLX5_FIELD_SELECT_802_1QAU_RP_FIELD_SELECT_8021QAURP_RPG_MIN_RATE'} +@c.record +class struct_mlx5_ifc_field_select_802_1qau_rp_bits(c.Struct): + SIZE = 32 + field_select_8021qaurp: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_field_select_802_1qau_rp_bits.register_fields([('field_select_8021qaurp', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_phys_layer_recovery_cntrs_bits(c.Struct): + SIZE = 1984 + total_successful_recovery_events: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[1952]] +struct_mlx5_ifc_phys_layer_recovery_cntrs_bits.register_fields([('total_successful_recovery_events', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[1952]], 32)]) +@c.record +class struct_mlx5_ifc_phys_layer_cntrs_bits(c.Struct): + SIZE = 1984 + time_since_last_clear_high: c.Array[ctypes.c_ubyte, Literal[32]] + time_since_last_clear_low: c.Array[ctypes.c_ubyte, Literal[32]] + symbol_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + symbol_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + sync_headers_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + sync_headers_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + edpl_bip_errors_lane0_high: c.Array[ctypes.c_ubyte, Literal[32]] + edpl_bip_errors_lane0_low: c.Array[ctypes.c_ubyte, Literal[32]] + edpl_bip_errors_lane1_high: c.Array[ctypes.c_ubyte, Literal[32]] + edpl_bip_errors_lane1_low: c.Array[ctypes.c_ubyte, Literal[32]] + edpl_bip_errors_lane2_high: c.Array[ctypes.c_ubyte, Literal[32]] + edpl_bip_errors_lane2_low: c.Array[ctypes.c_ubyte, Literal[32]] + edpl_bip_errors_lane3_high: c.Array[ctypes.c_ubyte, Literal[32]] + edpl_bip_errors_lane3_low: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_corrected_blocks_lane0_high: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_corrected_blocks_lane0_low: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_corrected_blocks_lane1_high: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_corrected_blocks_lane1_low: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_corrected_blocks_lane2_high: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_corrected_blocks_lane2_low: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_corrected_blocks_lane3_high: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_corrected_blocks_lane3_low: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_uncorrectable_blocks_lane0_high: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_uncorrectable_blocks_lane0_low: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_uncorrectable_blocks_lane1_high: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_uncorrectable_blocks_lane1_low: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_uncorrectable_blocks_lane2_high: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_uncorrectable_blocks_lane2_low: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_uncorrectable_blocks_lane3_high: c.Array[ctypes.c_ubyte, Literal[32]] + fc_fec_uncorrectable_blocks_lane3_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_blocks_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_blocks_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_uncorrectable_blocks_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_uncorrectable_blocks_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_no_errors_blocks_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_no_errors_blocks_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_single_error_blocks_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_single_error_blocks_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_total_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_total_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_lane0_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_lane0_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_lane1_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_lane1_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_lane2_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_lane2_low: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_lane3_high: c.Array[ctypes.c_ubyte, Literal[32]] + rs_fec_corrected_symbols_lane3_low: c.Array[ctypes.c_ubyte, Literal[32]] + link_down_events: c.Array[ctypes.c_ubyte, Literal[32]] + successful_recovery_events: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_640: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_phys_layer_cntrs_bits.register_fields([('time_since_last_clear_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('time_since_last_clear_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('symbol_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('symbol_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('sync_headers_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('sync_headers_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('edpl_bip_errors_lane0_high', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('edpl_bip_errors_lane0_low', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('edpl_bip_errors_lane1_high', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('edpl_bip_errors_lane1_low', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('edpl_bip_errors_lane2_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('edpl_bip_errors_lane2_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('edpl_bip_errors_lane3_high', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('edpl_bip_errors_lane3_low', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('fc_fec_corrected_blocks_lane0_high', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('fc_fec_corrected_blocks_lane0_low', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('fc_fec_corrected_blocks_lane1_high', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('fc_fec_corrected_blocks_lane1_low', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('fc_fec_corrected_blocks_lane2_high', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('fc_fec_corrected_blocks_lane2_low', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('fc_fec_corrected_blocks_lane3_high', c.Array[ctypes.c_ubyte, Literal[32]], 640), ('fc_fec_corrected_blocks_lane3_low', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('fc_fec_uncorrectable_blocks_lane0_high', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('fc_fec_uncorrectable_blocks_lane0_low', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('fc_fec_uncorrectable_blocks_lane1_high', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('fc_fec_uncorrectable_blocks_lane1_low', c.Array[ctypes.c_ubyte, Literal[32]], 800), ('fc_fec_uncorrectable_blocks_lane2_high', c.Array[ctypes.c_ubyte, Literal[32]], 832), ('fc_fec_uncorrectable_blocks_lane2_low', c.Array[ctypes.c_ubyte, Literal[32]], 864), ('fc_fec_uncorrectable_blocks_lane3_high', c.Array[ctypes.c_ubyte, Literal[32]], 896), ('fc_fec_uncorrectable_blocks_lane3_low', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('rs_fec_corrected_blocks_high', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('rs_fec_corrected_blocks_low', c.Array[ctypes.c_ubyte, Literal[32]], 992), ('rs_fec_uncorrectable_blocks_high', c.Array[ctypes.c_ubyte, Literal[32]], 1024), ('rs_fec_uncorrectable_blocks_low', c.Array[ctypes.c_ubyte, Literal[32]], 1056), ('rs_fec_no_errors_blocks_high', c.Array[ctypes.c_ubyte, Literal[32]], 1088), ('rs_fec_no_errors_blocks_low', c.Array[ctypes.c_ubyte, Literal[32]], 1120), ('rs_fec_single_error_blocks_high', c.Array[ctypes.c_ubyte, Literal[32]], 1152), ('rs_fec_single_error_blocks_low', c.Array[ctypes.c_ubyte, Literal[32]], 1184), ('rs_fec_corrected_symbols_total_high', c.Array[ctypes.c_ubyte, Literal[32]], 1216), ('rs_fec_corrected_symbols_total_low', c.Array[ctypes.c_ubyte, Literal[32]], 1248), ('rs_fec_corrected_symbols_lane0_high', c.Array[ctypes.c_ubyte, Literal[32]], 1280), ('rs_fec_corrected_symbols_lane0_low', c.Array[ctypes.c_ubyte, Literal[32]], 1312), ('rs_fec_corrected_symbols_lane1_high', c.Array[ctypes.c_ubyte, Literal[32]], 1344), ('rs_fec_corrected_symbols_lane1_low', c.Array[ctypes.c_ubyte, Literal[32]], 1376), ('rs_fec_corrected_symbols_lane2_high', c.Array[ctypes.c_ubyte, Literal[32]], 1408), ('rs_fec_corrected_symbols_lane2_low', c.Array[ctypes.c_ubyte, Literal[32]], 1440), ('rs_fec_corrected_symbols_lane3_high', c.Array[ctypes.c_ubyte, Literal[32]], 1472), ('rs_fec_corrected_symbols_lane3_low', c.Array[ctypes.c_ubyte, Literal[32]], 1504), ('link_down_events', c.Array[ctypes.c_ubyte, Literal[32]], 1536), ('successful_recovery_events', c.Array[ctypes.c_ubyte, Literal[32]], 1568), ('reserved_at_640', c.Array[ctypes.c_ubyte, Literal[384]], 1600)]) +@c.record +class struct_mlx5_ifc_phys_layer_statistical_cntrs_bits(c.Struct): + SIZE = 1984 + time_since_last_clear_high: c.Array[ctypes.c_ubyte, Literal[32]] + time_since_last_clear_low: c.Array[ctypes.c_ubyte, Literal[32]] + phy_received_bits_high: c.Array[ctypes.c_ubyte, Literal[32]] + phy_received_bits_low: c.Array[ctypes.c_ubyte, Literal[32]] + phy_symbol_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + phy_symbol_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_high: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_low: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_lane0_high: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_lane0_low: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_lane1_high: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_lane1_low: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_lane2_high: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_lane2_low: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_lane3_high: c.Array[ctypes.c_ubyte, Literal[32]] + phy_corrected_bits_lane3_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_200: c.Array[ctypes.c_ubyte, Literal[1472]] +struct_mlx5_ifc_phys_layer_statistical_cntrs_bits.register_fields([('time_since_last_clear_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('time_since_last_clear_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('phy_received_bits_high', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('phy_received_bits_low', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('phy_symbol_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('phy_symbol_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('phy_corrected_bits_high', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('phy_corrected_bits_low', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('phy_corrected_bits_lane0_high', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('phy_corrected_bits_lane0_low', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('phy_corrected_bits_lane1_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('phy_corrected_bits_lane1_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('phy_corrected_bits_lane2_high', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('phy_corrected_bits_lane2_low', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('phy_corrected_bits_lane3_high', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('phy_corrected_bits_lane3_low', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('reserved_at_200', c.Array[ctypes.c_ubyte, Literal[1472]], 512)]) +@c.record +class struct_mlx5_ifc_ib_port_cntrs_grp_data_layout_bits(c.Struct): + SIZE = 320 + symbol_error_counter: c.Array[ctypes.c_ubyte, Literal[16]] + link_error_recovery_counter: c.Array[ctypes.c_ubyte, Literal[8]] + link_downed_counter: c.Array[ctypes.c_ubyte, Literal[8]] + port_rcv_errors: c.Array[ctypes.c_ubyte, Literal[16]] + port_rcv_remote_physical_errors: c.Array[ctypes.c_ubyte, Literal[16]] + port_rcv_switch_relay_errors: c.Array[ctypes.c_ubyte, Literal[16]] + port_xmit_discards: c.Array[ctypes.c_ubyte, Literal[16]] + port_xmit_constraint_errors: c.Array[ctypes.c_ubyte, Literal[8]] + port_rcv_constraint_errors: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_70: c.Array[ctypes.c_ubyte, Literal[8]] + link_overrun_errors: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[16]] + vl_15_dropped: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[128]] + port_xmit_wait: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_ib_port_cntrs_grp_data_layout_bits.register_fields([('symbol_error_counter', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('link_error_recovery_counter', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('link_downed_counter', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('port_rcv_errors', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('port_rcv_remote_physical_errors', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('port_rcv_switch_relay_errors', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('port_xmit_discards', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('port_xmit_constraint_errors', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('port_rcv_constraint_errors', c.Array[ctypes.c_ubyte, Literal[8]], 104), ('reserved_at_70', c.Array[ctypes.c_ubyte, Literal[8]], 112), ('link_overrun_errors', c.Array[ctypes.c_ubyte, Literal[8]], 120), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('vl_15_dropped', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[128]], 160), ('port_xmit_wait', c.Array[ctypes.c_ubyte, Literal[32]], 288)]) +@c.record +class struct_mlx5_ifc_ib_ext_port_cntrs_grp_data_layout_bits(c.Struct): + SIZE = 1984 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[768]] + port_xmit_data_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_xmit_data_low: c.Array[ctypes.c_ubyte, Literal[32]] + port_rcv_data_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_rcv_data_low: c.Array[ctypes.c_ubyte, Literal[32]] + port_xmit_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_xmit_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + port_rcv_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_rcv_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_400: c.Array[ctypes.c_ubyte, Literal[128]] + port_unicast_xmit_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_unicast_xmit_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + port_multicast_xmit_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_multicast_xmit_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + port_unicast_rcv_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_unicast_rcv_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + port_multicast_rcv_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_multicast_rcv_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_580: c.Array[ctypes.c_ubyte, Literal[576]] +struct_mlx5_ifc_ib_ext_port_cntrs_grp_data_layout_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[768]], 0), ('port_xmit_data_high', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('port_xmit_data_low', c.Array[ctypes.c_ubyte, Literal[32]], 800), ('port_rcv_data_high', c.Array[ctypes.c_ubyte, Literal[32]], 832), ('port_rcv_data_low', c.Array[ctypes.c_ubyte, Literal[32]], 864), ('port_xmit_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 896), ('port_xmit_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('port_rcv_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('port_rcv_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 992), ('reserved_at_400', c.Array[ctypes.c_ubyte, Literal[128]], 1024), ('port_unicast_xmit_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 1152), ('port_unicast_xmit_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 1184), ('port_multicast_xmit_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 1216), ('port_multicast_xmit_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 1248), ('port_unicast_rcv_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 1280), ('port_unicast_rcv_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 1312), ('port_multicast_rcv_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 1344), ('port_multicast_rcv_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 1376), ('reserved_at_580', c.Array[ctypes.c_ubyte, Literal[576]], 1408)]) +@c.record +class struct_mlx5_ifc_eth_per_tc_prio_grp_data_layout_bits(c.Struct): + SIZE = 1984 + transmit_queue_high: c.Array[ctypes.c_ubyte, Literal[32]] + transmit_queue_low: c.Array[ctypes.c_ubyte, Literal[32]] + no_buffer_discard_uc_high: c.Array[ctypes.c_ubyte, Literal[32]] + no_buffer_discard_uc_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[1856]] +struct_mlx5_ifc_eth_per_tc_prio_grp_data_layout_bits.register_fields([('transmit_queue_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('transmit_queue_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('no_buffer_discard_uc_high', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('no_buffer_discard_uc_low', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[1856]], 128)]) +@c.record +class struct_mlx5_ifc_eth_per_tc_congest_prio_grp_data_layout_bits(c.Struct): + SIZE = 1984 + wred_discard_high: c.Array[ctypes.c_ubyte, Literal[32]] + wred_discard_low: c.Array[ctypes.c_ubyte, Literal[32]] + ecn_marked_tc_high: c.Array[ctypes.c_ubyte, Literal[32]] + ecn_marked_tc_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[1856]] +struct_mlx5_ifc_eth_per_tc_congest_prio_grp_data_layout_bits.register_fields([('wred_discard_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('wred_discard_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('ecn_marked_tc_high', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('ecn_marked_tc_low', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[1856]], 128)]) +@c.record +class struct_mlx5_ifc_eth_per_prio_grp_data_layout_bits(c.Struct): + SIZE = 1984 + rx_octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + rx_frames_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_frames_low: c.Array[ctypes.c_ubyte, Literal[32]] + tx_octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + tx_octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[192]] + tx_frames_high: c.Array[ctypes.c_ubyte, Literal[32]] + tx_frames_low: c.Array[ctypes.c_ubyte, Literal[32]] + rx_pause_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_pause_low: c.Array[ctypes.c_ubyte, Literal[32]] + rx_pause_duration_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_pause_duration_low: c.Array[ctypes.c_ubyte, Literal[32]] + tx_pause_high: c.Array[ctypes.c_ubyte, Literal[32]] + tx_pause_low: c.Array[ctypes.c_ubyte, Literal[32]] + tx_pause_duration_high: c.Array[ctypes.c_ubyte, Literal[32]] + tx_pause_duration_low: c.Array[ctypes.c_ubyte, Literal[32]] + rx_pause_transition_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_pause_transition_low: c.Array[ctypes.c_ubyte, Literal[32]] + rx_discards_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_discards_low: c.Array[ctypes.c_ubyte, Literal[32]] + device_stall_minor_watermark_cnt_high: c.Array[ctypes.c_ubyte, Literal[32]] + device_stall_minor_watermark_cnt_low: c.Array[ctypes.c_ubyte, Literal[32]] + device_stall_critical_watermark_cnt_high: c.Array[ctypes.c_ubyte, Literal[32]] + device_stall_critical_watermark_cnt_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_480: c.Array[ctypes.c_ubyte, Literal[832]] +struct_mlx5_ifc_eth_per_prio_grp_data_layout_bits.register_fields([('rx_octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('rx_octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('rx_frames_high', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('rx_frames_low', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('tx_octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('tx_octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[192]], 384), ('tx_frames_high', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('tx_frames_low', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('rx_pause_high', c.Array[ctypes.c_ubyte, Literal[32]], 640), ('rx_pause_low', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('rx_pause_duration_high', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('rx_pause_duration_low', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('tx_pause_high', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('tx_pause_low', c.Array[ctypes.c_ubyte, Literal[32]], 800), ('tx_pause_duration_high', c.Array[ctypes.c_ubyte, Literal[32]], 832), ('tx_pause_duration_low', c.Array[ctypes.c_ubyte, Literal[32]], 864), ('rx_pause_transition_high', c.Array[ctypes.c_ubyte, Literal[32]], 896), ('rx_pause_transition_low', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('rx_discards_high', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('rx_discards_low', c.Array[ctypes.c_ubyte, Literal[32]], 992), ('device_stall_minor_watermark_cnt_high', c.Array[ctypes.c_ubyte, Literal[32]], 1024), ('device_stall_minor_watermark_cnt_low', c.Array[ctypes.c_ubyte, Literal[32]], 1056), ('device_stall_critical_watermark_cnt_high', c.Array[ctypes.c_ubyte, Literal[32]], 1088), ('device_stall_critical_watermark_cnt_low', c.Array[ctypes.c_ubyte, Literal[32]], 1120), ('reserved_at_480', c.Array[ctypes.c_ubyte, Literal[832]], 1152)]) +@c.record +class struct_mlx5_ifc_eth_extended_cntrs_grp_data_layout_bits(c.Struct): + SIZE = 1984 + port_transmit_wait_high: c.Array[ctypes.c_ubyte, Literal[32]] + port_transmit_wait_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[256]] + rx_buffer_almost_full_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_buffer_almost_full_low: c.Array[ctypes.c_ubyte, Literal[32]] + rx_buffer_full_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_buffer_full_low: c.Array[ctypes.c_ubyte, Literal[32]] + rx_icrc_encapsulated_high: c.Array[ctypes.c_ubyte, Literal[32]] + rx_icrc_encapsulated_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_200: c.Array[ctypes.c_ubyte, Literal[1472]] +struct_mlx5_ifc_eth_extended_cntrs_grp_data_layout_bits.register_fields([('port_transmit_wait_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('port_transmit_wait_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[256]], 64), ('rx_buffer_almost_full_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('rx_buffer_almost_full_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('rx_buffer_full_high', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('rx_buffer_full_low', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('rx_icrc_encapsulated_high', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('rx_icrc_encapsulated_low', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('reserved_at_200', c.Array[ctypes.c_ubyte, Literal[1472]], 512)]) +@c.record +class struct_mlx5_ifc_eth_3635_cntrs_grp_data_layout_bits(c.Struct): + SIZE = 1984 + dot3stats_alignment_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_alignment_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_fcs_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_fcs_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_single_collision_frames_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_single_collision_frames_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_multiple_collision_frames_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_multiple_collision_frames_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_sqe_test_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_sqe_test_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_deferred_transmissions_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_deferred_transmissions_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_late_collisions_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_late_collisions_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_excessive_collisions_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_excessive_collisions_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_internal_mac_transmit_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_internal_mac_transmit_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_carrier_sense_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_carrier_sense_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_frame_too_longs_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_frame_too_longs_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_internal_mac_receive_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_internal_mac_receive_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_symbol_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3stats_symbol_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3control_in_unknown_opcodes_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3control_in_unknown_opcodes_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3in_pause_frames_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3in_pause_frames_low: c.Array[ctypes.c_ubyte, Literal[32]] + dot3out_pause_frames_high: c.Array[ctypes.c_ubyte, Literal[32]] + dot3out_pause_frames_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_400: c.Array[ctypes.c_ubyte, Literal[960]] +struct_mlx5_ifc_eth_3635_cntrs_grp_data_layout_bits.register_fields([('dot3stats_alignment_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('dot3stats_alignment_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('dot3stats_fcs_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('dot3stats_fcs_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('dot3stats_single_collision_frames_high', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('dot3stats_single_collision_frames_low', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('dot3stats_multiple_collision_frames_high', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('dot3stats_multiple_collision_frames_low', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('dot3stats_sqe_test_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('dot3stats_sqe_test_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('dot3stats_deferred_transmissions_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('dot3stats_deferred_transmissions_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('dot3stats_late_collisions_high', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('dot3stats_late_collisions_low', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('dot3stats_excessive_collisions_high', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('dot3stats_excessive_collisions_low', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('dot3stats_internal_mac_transmit_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('dot3stats_internal_mac_transmit_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('dot3stats_carrier_sense_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('dot3stats_carrier_sense_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('dot3stats_frame_too_longs_high', c.Array[ctypes.c_ubyte, Literal[32]], 640), ('dot3stats_frame_too_longs_low', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('dot3stats_internal_mac_receive_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('dot3stats_internal_mac_receive_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('dot3stats_symbol_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('dot3stats_symbol_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 800), ('dot3control_in_unknown_opcodes_high', c.Array[ctypes.c_ubyte, Literal[32]], 832), ('dot3control_in_unknown_opcodes_low', c.Array[ctypes.c_ubyte, Literal[32]], 864), ('dot3in_pause_frames_high', c.Array[ctypes.c_ubyte, Literal[32]], 896), ('dot3in_pause_frames_low', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('dot3out_pause_frames_high', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('dot3out_pause_frames_low', c.Array[ctypes.c_ubyte, Literal[32]], 992), ('reserved_at_400', c.Array[ctypes.c_ubyte, Literal[960]], 1024)]) +@c.record +class struct_mlx5_ifc_eth_2819_cntrs_grp_data_layout_bits(c.Struct): + SIZE = 1984 + ether_stats_drop_events_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_drop_events_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_broadcast_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_broadcast_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_multicast_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_multicast_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_crc_align_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_crc_align_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_undersize_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_undersize_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_oversize_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_oversize_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_fragments_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_fragments_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_jabbers_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_jabbers_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_collisions_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_collisions_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts64octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts64octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts65to127octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts65to127octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts128to255octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts128to255octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts256to511octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts256to511octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts512to1023octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts512to1023octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts1024to1518octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts1024to1518octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts1519to2047octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts1519to2047octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts2048to4095octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts2048to4095octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts4096to8191octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts4096to8191octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts8192to10239octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + ether_stats_pkts8192to10239octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_540: c.Array[ctypes.c_ubyte, Literal[640]] +struct_mlx5_ifc_eth_2819_cntrs_grp_data_layout_bits.register_fields([('ether_stats_drop_events_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('ether_stats_drop_events_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('ether_stats_octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('ether_stats_octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('ether_stats_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('ether_stats_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('ether_stats_broadcast_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('ether_stats_broadcast_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('ether_stats_multicast_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('ether_stats_multicast_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('ether_stats_crc_align_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('ether_stats_crc_align_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('ether_stats_undersize_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('ether_stats_undersize_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('ether_stats_oversize_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('ether_stats_oversize_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('ether_stats_fragments_high', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('ether_stats_fragments_low', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('ether_stats_jabbers_high', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('ether_stats_jabbers_low', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('ether_stats_collisions_high', c.Array[ctypes.c_ubyte, Literal[32]], 640), ('ether_stats_collisions_low', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('ether_stats_pkts64octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('ether_stats_pkts64octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('ether_stats_pkts65to127octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('ether_stats_pkts65to127octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 800), ('ether_stats_pkts128to255octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 832), ('ether_stats_pkts128to255octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 864), ('ether_stats_pkts256to511octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 896), ('ether_stats_pkts256to511octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('ether_stats_pkts512to1023octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('ether_stats_pkts512to1023octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 992), ('ether_stats_pkts1024to1518octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 1024), ('ether_stats_pkts1024to1518octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 1056), ('ether_stats_pkts1519to2047octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 1088), ('ether_stats_pkts1519to2047octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 1120), ('ether_stats_pkts2048to4095octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 1152), ('ether_stats_pkts2048to4095octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 1184), ('ether_stats_pkts4096to8191octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 1216), ('ether_stats_pkts4096to8191octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 1248), ('ether_stats_pkts8192to10239octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 1280), ('ether_stats_pkts8192to10239octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 1312), ('reserved_at_540', c.Array[ctypes.c_ubyte, Literal[640]], 1344)]) +@c.record +class struct_mlx5_ifc_eth_2863_cntrs_grp_data_layout_bits(c.Struct): + SIZE = 1984 + if_in_octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_ucast_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_ucast_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_discards_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_discards_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_unknown_protos_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_unknown_protos_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_octets_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_octets_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_ucast_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_ucast_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_discards_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_discards_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_multicast_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_multicast_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_broadcast_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_in_broadcast_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_multicast_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_multicast_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_broadcast_pkts_high: c.Array[ctypes.c_ubyte, Literal[32]] + if_out_broadcast_pkts_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_340: c.Array[ctypes.c_ubyte, Literal[1152]] +struct_mlx5_ifc_eth_2863_cntrs_grp_data_layout_bits.register_fields([('if_in_octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('if_in_octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('if_in_ucast_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('if_in_ucast_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('if_in_discards_high', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('if_in_discards_low', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('if_in_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('if_in_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('if_in_unknown_protos_high', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('if_in_unknown_protos_low', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('if_out_octets_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('if_out_octets_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('if_out_ucast_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('if_out_ucast_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('if_out_discards_high', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('if_out_discards_low', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('if_out_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('if_out_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('if_in_multicast_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('if_in_multicast_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('if_in_broadcast_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 640), ('if_in_broadcast_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('if_out_multicast_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('if_out_multicast_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('if_out_broadcast_pkts_high', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('if_out_broadcast_pkts_low', c.Array[ctypes.c_ubyte, Literal[32]], 800), ('reserved_at_340', c.Array[ctypes.c_ubyte, Literal[1152]], 832)]) +@c.record +class struct_mlx5_ifc_eth_802_3_cntrs_grp_data_layout_bits(c.Struct): + SIZE = 1984 + a_frames_transmitted_ok_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_frames_transmitted_ok_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_frames_received_ok_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_frames_received_ok_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_frame_check_sequence_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_frame_check_sequence_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_alignment_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_alignment_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_octets_transmitted_ok_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_octets_transmitted_ok_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_octets_received_ok_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_octets_received_ok_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_multicast_frames_xmitted_ok_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_multicast_frames_xmitted_ok_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_broadcast_frames_xmitted_ok_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_broadcast_frames_xmitted_ok_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_multicast_frames_received_ok_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_multicast_frames_received_ok_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_broadcast_frames_received_ok_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_broadcast_frames_received_ok_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_in_range_length_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_in_range_length_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_out_of_range_length_field_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_out_of_range_length_field_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_frame_too_long_errors_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_frame_too_long_errors_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_symbol_error_during_carrier_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_symbol_error_during_carrier_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_mac_control_frames_transmitted_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_mac_control_frames_transmitted_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_mac_control_frames_received_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_mac_control_frames_received_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_unsupported_opcodes_received_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_unsupported_opcodes_received_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_pause_mac_ctrl_frames_received_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_pause_mac_ctrl_frames_received_low: c.Array[ctypes.c_ubyte, Literal[32]] + a_pause_mac_ctrl_frames_transmitted_high: c.Array[ctypes.c_ubyte, Literal[32]] + a_pause_mac_ctrl_frames_transmitted_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_4c0: c.Array[ctypes.c_ubyte, Literal[768]] +struct_mlx5_ifc_eth_802_3_cntrs_grp_data_layout_bits.register_fields([('a_frames_transmitted_ok_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('a_frames_transmitted_ok_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('a_frames_received_ok_high', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('a_frames_received_ok_low', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('a_frame_check_sequence_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('a_frame_check_sequence_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('a_alignment_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('a_alignment_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('a_octets_transmitted_ok_high', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('a_octets_transmitted_ok_low', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('a_octets_received_ok_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('a_octets_received_ok_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('a_multicast_frames_xmitted_ok_high', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('a_multicast_frames_xmitted_ok_low', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('a_broadcast_frames_xmitted_ok_high', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('a_broadcast_frames_xmitted_ok_low', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('a_multicast_frames_received_ok_high', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('a_multicast_frames_received_ok_low', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('a_broadcast_frames_received_ok_high', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('a_broadcast_frames_received_ok_low', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('a_in_range_length_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 640), ('a_in_range_length_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('a_out_of_range_length_field_high', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('a_out_of_range_length_field_low', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('a_frame_too_long_errors_high', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('a_frame_too_long_errors_low', c.Array[ctypes.c_ubyte, Literal[32]], 800), ('a_symbol_error_during_carrier_high', c.Array[ctypes.c_ubyte, Literal[32]], 832), ('a_symbol_error_during_carrier_low', c.Array[ctypes.c_ubyte, Literal[32]], 864), ('a_mac_control_frames_transmitted_high', c.Array[ctypes.c_ubyte, Literal[32]], 896), ('a_mac_control_frames_transmitted_low', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('a_mac_control_frames_received_high', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('a_mac_control_frames_received_low', c.Array[ctypes.c_ubyte, Literal[32]], 992), ('a_unsupported_opcodes_received_high', c.Array[ctypes.c_ubyte, Literal[32]], 1024), ('a_unsupported_opcodes_received_low', c.Array[ctypes.c_ubyte, Literal[32]], 1056), ('a_pause_mac_ctrl_frames_received_high', c.Array[ctypes.c_ubyte, Literal[32]], 1088), ('a_pause_mac_ctrl_frames_received_low', c.Array[ctypes.c_ubyte, Literal[32]], 1120), ('a_pause_mac_ctrl_frames_transmitted_high', c.Array[ctypes.c_ubyte, Literal[32]], 1152), ('a_pause_mac_ctrl_frames_transmitted_low', c.Array[ctypes.c_ubyte, Literal[32]], 1184), ('reserved_at_4c0', c.Array[ctypes.c_ubyte, Literal[768]], 1216)]) +@c.record +class struct_mlx5_ifc_pcie_perf_cntrs_grp_data_layout_bits(c.Struct): + SIZE = 1984 + life_time_counter_high: c.Array[ctypes.c_ubyte, Literal[32]] + life_time_counter_low: c.Array[ctypes.c_ubyte, Literal[32]] + rx_errors: c.Array[ctypes.c_ubyte, Literal[32]] + tx_errors: c.Array[ctypes.c_ubyte, Literal[32]] + l0_to_recovery_eieos: c.Array[ctypes.c_ubyte, Literal[32]] + l0_to_recovery_ts: c.Array[ctypes.c_ubyte, Literal[32]] + l0_to_recovery_framing: c.Array[ctypes.c_ubyte, Literal[32]] + l0_to_recovery_retrain: c.Array[ctypes.c_ubyte, Literal[32]] + crc_error_dllp: c.Array[ctypes.c_ubyte, Literal[32]] + crc_error_tlp: c.Array[ctypes.c_ubyte, Literal[32]] + tx_overflow_buffer_pkt_high: c.Array[ctypes.c_ubyte, Literal[32]] + tx_overflow_buffer_pkt_low: c.Array[ctypes.c_ubyte, Literal[32]] + outbound_stalled_reads: c.Array[ctypes.c_ubyte, Literal[32]] + outbound_stalled_writes: c.Array[ctypes.c_ubyte, Literal[32]] + outbound_stalled_reads_events: c.Array[ctypes.c_ubyte, Literal[32]] + outbound_stalled_writes_events: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_200: c.Array[ctypes.c_ubyte, Literal[1472]] +struct_mlx5_ifc_pcie_perf_cntrs_grp_data_layout_bits.register_fields([('life_time_counter_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('life_time_counter_low', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('rx_errors', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('tx_errors', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('l0_to_recovery_eieos', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('l0_to_recovery_ts', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('l0_to_recovery_framing', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('l0_to_recovery_retrain', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('crc_error_dllp', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('crc_error_tlp', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('tx_overflow_buffer_pkt_high', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('tx_overflow_buffer_pkt_low', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('outbound_stalled_reads', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('outbound_stalled_writes', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('outbound_stalled_reads_events', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('outbound_stalled_writes_events', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('reserved_at_200', c.Array[ctypes.c_ubyte, Literal[1472]], 512)]) +@c.record +class struct_mlx5_ifc_cmd_inter_comp_event_bits(c.Struct): + SIZE = 224 + command_completion_vector: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[192]] +struct_mlx5_ifc_cmd_inter_comp_event_bits.register_fields([('command_completion_vector', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[192]], 32)]) +@c.record +class struct_mlx5_ifc_stall_vl_event_bits(c.Struct): + SIZE = 192 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[24]] + port_num: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_19: c.Array[ctypes.c_ubyte, Literal[3]] + vl: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[160]] +struct_mlx5_ifc_stall_vl_event_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[24]], 0), ('port_num', c.Array[ctypes.c_ubyte, Literal[1]], 24), ('reserved_at_19', c.Array[ctypes.c_ubyte, Literal[3]], 25), ('vl', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[160]], 32)]) +@c.record +class struct_mlx5_ifc_db_bf_congestion_event_bits(c.Struct): + SIZE = 192 + event_subtype: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[8]] + congestion_level: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[160]] +struct_mlx5_ifc_db_bf_congestion_event_bits.register_fields([('event_subtype', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('congestion_level', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[160]], 32)]) +@c.record +class struct_mlx5_ifc_gpio_event_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[96]] + gpio_event_hi: c.Array[ctypes.c_ubyte, Literal[32]] + gpio_event_lo: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_gpio_event_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[96]], 0), ('gpio_event_hi', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('gpio_event_lo', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[64]], 160)]) +@c.record +class struct_mlx5_ifc_port_state_change_event_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[64]] + port_num: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[28]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_port_state_change_event_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('port_num', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[28]], 68), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[128]], 96)]) +@c.record +class struct_mlx5_ifc_dropped_packet_logged_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[224]] +struct_mlx5_ifc_dropped_packet_logged_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[224]], 0)]) +@c.record +class struct_mlx5_ifc_nic_cap_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[26]] + vhca_icm_ctrl: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1b: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_nic_cap_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[26]], 0), ('vhca_icm_ctrl', c.Array[ctypes.c_ubyte, Literal[1]], 26), ('reserved_at_1b', c.Array[ctypes.c_ubyte, Literal[5]], 27), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32)]) +@c.record +class struct_mlx5_ifc_default_timeout_bits(c.Struct): + SIZE = 32 + to_multiplier: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_3: c.Array[ctypes.c_ubyte, Literal[9]] + to_value: c.Array[ctypes.c_ubyte, Literal[20]] +struct_mlx5_ifc_default_timeout_bits.register_fields([('to_multiplier', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('reserved_at_3', c.Array[ctypes.c_ubyte, Literal[9]], 3), ('to_value', c.Array[ctypes.c_ubyte, Literal[20]], 12)]) +@c.record +class struct_mlx5_ifc_dtor_reg_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + pcie_toggle_to: struct_mlx5_ifc_default_timeout_bits + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[96]] + health_poll_to: struct_mlx5_ifc_default_timeout_bits + full_crdump_to: struct_mlx5_ifc_default_timeout_bits + fw_reset_to: struct_mlx5_ifc_default_timeout_bits + flush_on_err_to: struct_mlx5_ifc_default_timeout_bits + pci_sync_update_to: struct_mlx5_ifc_default_timeout_bits + tear_down_to: struct_mlx5_ifc_default_timeout_bits + fsm_reactivate_to: struct_mlx5_ifc_default_timeout_bits + reclaim_pages_to: struct_mlx5_ifc_default_timeout_bits + reclaim_vfs_pages_to: struct_mlx5_ifc_default_timeout_bits + reset_unload_to: struct_mlx5_ifc_default_timeout_bits + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dtor_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('pcie_toggle_to', struct_mlx5_ifc_default_timeout_bits, 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[96]], 64), ('health_poll_to', struct_mlx5_ifc_default_timeout_bits, 160), ('full_crdump_to', struct_mlx5_ifc_default_timeout_bits, 192), ('fw_reset_to', struct_mlx5_ifc_default_timeout_bits, 224), ('flush_on_err_to', struct_mlx5_ifc_default_timeout_bits, 256), ('pci_sync_update_to', struct_mlx5_ifc_default_timeout_bits, 288), ('tear_down_to', struct_mlx5_ifc_default_timeout_bits, 320), ('fsm_reactivate_to', struct_mlx5_ifc_default_timeout_bits, 352), ('reclaim_pages_to', struct_mlx5_ifc_default_timeout_bits, 384), ('reclaim_vfs_pages_to', struct_mlx5_ifc_default_timeout_bits, 416), ('reset_unload_to', struct_mlx5_ifc_default_timeout_bits, 448), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[32]], 480)]) +@c.record +class struct_mlx5_ifc_vhca_icm_ctrl_reg_bits(c.Struct): + SIZE = 512 + vhca_id_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[15]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[160]] + cur_alloc_icm: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[288]] +struct_mlx5_ifc_vhca_icm_ctrl_reg_bits.register_fields([('vhca_id_valid', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[15]], 1), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[160]], 32), ('cur_alloc_icm', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[288]], 224)]) +_anonenum36: dict[int, str] = {(MLX5_CQ_ERROR_SYNDROME_CQ_OVERRUN:=1): 'MLX5_CQ_ERROR_SYNDROME_CQ_OVERRUN', (MLX5_CQ_ERROR_SYNDROME_CQ_ACCESS_VIOLATION_ERROR:=2): 'MLX5_CQ_ERROR_SYNDROME_CQ_ACCESS_VIOLATION_ERROR'} +@c.record +class struct_mlx5_ifc_cq_error_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_cq_error_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('syndrome', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[128]], 96)]) +@c.record +class struct_mlx5_ifc_rdma_page_fault_event_bits(c.Struct): + SIZE = 224 + bytes_committed: c.Array[ctypes.c_ubyte, Literal[32]] + r_key: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + packet_len: c.Array[ctypes.c_ubyte, Literal[16]] + rdma_op_len: c.Array[ctypes.c_ubyte, Literal[32]] + rdma_va: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[5]] + rdma: c.Array[ctypes.c_ubyte, Literal[1]] + write: c.Array[ctypes.c_ubyte, Literal[1]] + requestor: c.Array[ctypes.c_ubyte, Literal[1]] + qp_number: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_rdma_page_fault_event_bits.register_fields([('bytes_committed', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('r_key', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('packet_len', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('rdma_op_len', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('rdma_va', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[5]], 192), ('rdma', c.Array[ctypes.c_ubyte, Literal[1]], 197), ('write', c.Array[ctypes.c_ubyte, Literal[1]], 198), ('requestor', c.Array[ctypes.c_ubyte, Literal[1]], 199), ('qp_number', c.Array[ctypes.c_ubyte, Literal[24]], 200)]) +@c.record +class struct_mlx5_ifc_wqe_associated_page_fault_event_bits(c.Struct): + SIZE = 224 + bytes_committed: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + wqe_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + len: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[5]] + rdma: c.Array[ctypes.c_ubyte, Literal[1]] + write_read: c.Array[ctypes.c_ubyte, Literal[1]] + requestor: c.Array[ctypes.c_ubyte, Literal[1]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_wqe_associated_page_fault_event_bits.register_fields([('bytes_committed', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('wqe_index', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('len', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[96]], 96), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[5]], 192), ('rdma', c.Array[ctypes.c_ubyte, Literal[1]], 197), ('write_read', c.Array[ctypes.c_ubyte, Literal[1]], 198), ('requestor', c.Array[ctypes.c_ubyte, Literal[1]], 199), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 200)]) +@c.record +class struct_mlx5_ifc_qp_events_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[160]] + type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_a8: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + qpn_rqn_sqn: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_qp_events_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[160]], 0), ('type', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('reserved_at_a8', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('qpn_rqn_sqn', c.Array[ctypes.c_ubyte, Literal[24]], 200)]) +@c.record +class struct_mlx5_ifc_dct_events_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[192]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + dct_number: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_dct_events_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[192]], 0), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('dct_number', c.Array[ctypes.c_ubyte, Literal[24]], 200)]) +@c.record +class struct_mlx5_ifc_comp_event_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[192]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + cq_number: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_comp_event_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[192]], 0), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('cq_number', c.Array[ctypes.c_ubyte, Literal[24]], 200)]) +_anonenum37: dict[int, str] = {(MLX5_QPC_STATE_RST:=0): 'MLX5_QPC_STATE_RST', (MLX5_QPC_STATE_INIT:=1): 'MLX5_QPC_STATE_INIT', (MLX5_QPC_STATE_RTR:=2): 'MLX5_QPC_STATE_RTR', (MLX5_QPC_STATE_RTS:=3): 'MLX5_QPC_STATE_RTS', (MLX5_QPC_STATE_SQER:=4): 'MLX5_QPC_STATE_SQER', (MLX5_QPC_STATE_ERR:=6): 'MLX5_QPC_STATE_ERR', (MLX5_QPC_STATE_SQD:=7): 'MLX5_QPC_STATE_SQD', (MLX5_QPC_STATE_SUSPENDED:=9): 'MLX5_QPC_STATE_SUSPENDED'} +_anonenum38: dict[int, str] = {(MLX5_QPC_ST_RC:=0): 'MLX5_QPC_ST_RC', (MLX5_QPC_ST_UC:=1): 'MLX5_QPC_ST_UC', (MLX5_QPC_ST_UD:=2): 'MLX5_QPC_ST_UD', (MLX5_QPC_ST_XRC:=3): 'MLX5_QPC_ST_XRC', (MLX5_QPC_ST_DCI:=5): 'MLX5_QPC_ST_DCI', (MLX5_QPC_ST_QP0:=7): 'MLX5_QPC_ST_QP0', (MLX5_QPC_ST_QP1:=8): 'MLX5_QPC_ST_QP1', (MLX5_QPC_ST_RAW_DATAGRAM:=9): 'MLX5_QPC_ST_RAW_DATAGRAM', (MLX5_QPC_ST_REG_UMR:=12): 'MLX5_QPC_ST_REG_UMR'} +_anonenum39: dict[int, str] = {(MLX5_QPC_PM_STATE_ARMED:=0): 'MLX5_QPC_PM_STATE_ARMED', (MLX5_QPC_PM_STATE_REARM:=1): 'MLX5_QPC_PM_STATE_REARM', (MLX5_QPC_PM_STATE_RESERVED:=2): 'MLX5_QPC_PM_STATE_RESERVED', (MLX5_QPC_PM_STATE_MIGRATED:=3): 'MLX5_QPC_PM_STATE_MIGRATED'} +_anonenum40: dict[int, str] = {(MLX5_QPC_OFFLOAD_TYPE_RNDV:=1): 'MLX5_QPC_OFFLOAD_TYPE_RNDV'} +_anonenum41: dict[int, str] = {(MLX5_QPC_END_PADDING_MODE_SCATTER_AS_IS:=0): 'MLX5_QPC_END_PADDING_MODE_SCATTER_AS_IS', (MLX5_QPC_END_PADDING_MODE_PAD_TO_CACHE_LINE_ALIGNMENT:=1): 'MLX5_QPC_END_PADDING_MODE_PAD_TO_CACHE_LINE_ALIGNMENT'} +_anonenum42: dict[int, str] = {(MLX5_QPC_MTU_256_BYTES:=1): 'MLX5_QPC_MTU_256_BYTES', (MLX5_QPC_MTU_512_BYTES:=2): 'MLX5_QPC_MTU_512_BYTES', (MLX5_QPC_MTU_1K_BYTES:=3): 'MLX5_QPC_MTU_1K_BYTES', (MLX5_QPC_MTU_2K_BYTES:=4): 'MLX5_QPC_MTU_2K_BYTES', (MLX5_QPC_MTU_4K_BYTES:=5): 'MLX5_QPC_MTU_4K_BYTES', (MLX5_QPC_MTU_RAW_ETHERNET_QP:=7): 'MLX5_QPC_MTU_RAW_ETHERNET_QP'} +_anonenum43: dict[int, str] = {(MLX5_QPC_ATOMIC_MODE_IB_SPEC:=1): 'MLX5_QPC_ATOMIC_MODE_IB_SPEC', (MLX5_QPC_ATOMIC_MODE_ONLY_8B:=2): 'MLX5_QPC_ATOMIC_MODE_ONLY_8B', (MLX5_QPC_ATOMIC_MODE_UP_TO_8B:=3): 'MLX5_QPC_ATOMIC_MODE_UP_TO_8B', (MLX5_QPC_ATOMIC_MODE_UP_TO_16B:=4): 'MLX5_QPC_ATOMIC_MODE_UP_TO_16B', (MLX5_QPC_ATOMIC_MODE_UP_TO_32B:=5): 'MLX5_QPC_ATOMIC_MODE_UP_TO_32B', (MLX5_QPC_ATOMIC_MODE_UP_TO_64B:=6): 'MLX5_QPC_ATOMIC_MODE_UP_TO_64B', (MLX5_QPC_ATOMIC_MODE_UP_TO_128B:=7): 'MLX5_QPC_ATOMIC_MODE_UP_TO_128B', (MLX5_QPC_ATOMIC_MODE_UP_TO_256B:=8): 'MLX5_QPC_ATOMIC_MODE_UP_TO_256B'} +_anonenum44: dict[int, str] = {(MLX5_QPC_CS_REQ_DISABLE:=0): 'MLX5_QPC_CS_REQ_DISABLE', (MLX5_QPC_CS_REQ_UP_TO_32B:=17): 'MLX5_QPC_CS_REQ_UP_TO_32B', (MLX5_QPC_CS_REQ_UP_TO_64B:=34): 'MLX5_QPC_CS_REQ_UP_TO_64B'} +_anonenum45: dict[int, str] = {(MLX5_QPC_CS_RES_DISABLE:=0): 'MLX5_QPC_CS_RES_DISABLE', (MLX5_QPC_CS_RES_UP_TO_32B:=1): 'MLX5_QPC_CS_RES_UP_TO_32B', (MLX5_QPC_CS_RES_UP_TO_64B:=2): 'MLX5_QPC_CS_RES_UP_TO_64B'} +_anonenum46: dict[int, str] = {(MLX5_TIMESTAMP_FORMAT_FREE_RUNNING:=0): 'MLX5_TIMESTAMP_FORMAT_FREE_RUNNING', (MLX5_TIMESTAMP_FORMAT_DEFAULT:=1): 'MLX5_TIMESTAMP_FORMAT_DEFAULT', (MLX5_TIMESTAMP_FORMAT_REAL_TIME:=2): 'MLX5_TIMESTAMP_FORMAT_REAL_TIME'} +@c.record +class struct_mlx5_ifc_qpc_bits(c.Struct): + SIZE = 1856 + state: c.Array[ctypes.c_ubyte, Literal[4]] + lag_tx_port_affinity: c.Array[ctypes.c_ubyte, Literal[4]] + st: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[2]] + isolate_vl_tc: c.Array[ctypes.c_ubyte, Literal[1]] + pm_state: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_15: c.Array[ctypes.c_ubyte, Literal[1]] + req_e2e_credit_mode: c.Array[ctypes.c_ubyte, Literal[2]] + offload_type: c.Array[ctypes.c_ubyte, Literal[4]] + end_padding_mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_1e: c.Array[ctypes.c_ubyte, Literal[2]] + wq_signature: c.Array[ctypes.c_ubyte, Literal[1]] + block_lb_mc: c.Array[ctypes.c_ubyte, Literal[1]] + atomic_like_write_en: c.Array[ctypes.c_ubyte, Literal[1]] + latency_sensitive: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_24: c.Array[ctypes.c_ubyte, Literal[1]] + drain_sigerr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_26: c.Array[ctypes.c_ubyte, Literal[1]] + dp_ordering_force: c.Array[ctypes.c_ubyte, Literal[1]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + mtu: c.Array[ctypes.c_ubyte, Literal[3]] + log_msg_max: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[1]] + log_rq_size: c.Array[ctypes.c_ubyte, Literal[4]] + log_rq_stride: c.Array[ctypes.c_ubyte, Literal[3]] + no_sq: c.Array[ctypes.c_ubyte, Literal[1]] + log_sq_size: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_55: c.Array[ctypes.c_ubyte, Literal[1]] + retry_mode: c.Array[ctypes.c_ubyte, Literal[2]] + ts_format: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_5a: c.Array[ctypes.c_ubyte, Literal[1]] + rlky: c.Array[ctypes.c_ubyte, Literal[1]] + ulp_stateless_offload_mode: c.Array[ctypes.c_ubyte, Literal[4]] + counter_set_id: c.Array[ctypes.c_ubyte, Literal[8]] + uar_page: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + user_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[3]] + log_page_size: c.Array[ctypes.c_ubyte, Literal[5]] + remote_qpn: c.Array[ctypes.c_ubyte, Literal[24]] + primary_address_path: struct_mlx5_ifc_ads_bits + secondary_address_path: struct_mlx5_ifc_ads_bits + log_ack_req_freq: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_384: c.Array[ctypes.c_ubyte, Literal[4]] + log_sra_max: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_38b: c.Array[ctypes.c_ubyte, Literal[2]] + retry_count: c.Array[ctypes.c_ubyte, Literal[3]] + rnr_retry: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_393: c.Array[ctypes.c_ubyte, Literal[1]] + fre: c.Array[ctypes.c_ubyte, Literal[1]] + cur_rnr_retry: c.Array[ctypes.c_ubyte, Literal[3]] + cur_retry_count: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_39b: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_3a0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_3c0: c.Array[ctypes.c_ubyte, Literal[8]] + next_send_psn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_3e0: c.Array[ctypes.c_ubyte, Literal[3]] + log_num_dci_stream_channels: c.Array[ctypes.c_ubyte, Literal[5]] + cqn_snd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_400: c.Array[ctypes.c_ubyte, Literal[3]] + log_num_dci_errored_streams: c.Array[ctypes.c_ubyte, Literal[5]] + deth_sqpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_420: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_440: c.Array[ctypes.c_ubyte, Literal[8]] + last_acked_psn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_460: c.Array[ctypes.c_ubyte, Literal[8]] + ssn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_480: c.Array[ctypes.c_ubyte, Literal[8]] + log_rra_max: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_48b: c.Array[ctypes.c_ubyte, Literal[1]] + atomic_mode: c.Array[ctypes.c_ubyte, Literal[4]] + rre: c.Array[ctypes.c_ubyte, Literal[1]] + rwe: c.Array[ctypes.c_ubyte, Literal[1]] + rae: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_493: c.Array[ctypes.c_ubyte, Literal[1]] + page_offset: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_49a: c.Array[ctypes.c_ubyte, Literal[2]] + dp_ordering_1: c.Array[ctypes.c_ubyte, Literal[1]] + cd_slave_receive: c.Array[ctypes.c_ubyte, Literal[1]] + cd_slave_send: c.Array[ctypes.c_ubyte, Literal[1]] + cd_master: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_4a0: c.Array[ctypes.c_ubyte, Literal[3]] + min_rnr_nak: c.Array[ctypes.c_ubyte, Literal[5]] + next_rcv_psn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_4c0: c.Array[ctypes.c_ubyte, Literal[8]] + xrcd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_4e0: c.Array[ctypes.c_ubyte, Literal[8]] + cqn_rcv: c.Array[ctypes.c_ubyte, Literal[24]] + dbr_addr: c.Array[ctypes.c_ubyte, Literal[64]] + q_key: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_560: c.Array[ctypes.c_ubyte, Literal[5]] + rq_type: c.Array[ctypes.c_ubyte, Literal[3]] + srqn_rmpn_xrqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_580: c.Array[ctypes.c_ubyte, Literal[8]] + rmsn: c.Array[ctypes.c_ubyte, Literal[24]] + hw_sq_wqebb_counter: c.Array[ctypes.c_ubyte, Literal[16]] + sw_sq_wqebb_counter: c.Array[ctypes.c_ubyte, Literal[16]] + hw_rq_counter: c.Array[ctypes.c_ubyte, Literal[32]] + sw_rq_counter: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_600: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_620: c.Array[ctypes.c_ubyte, Literal[15]] + cgs: c.Array[ctypes.c_ubyte, Literal[1]] + cs_req: c.Array[ctypes.c_ubyte, Literal[8]] + cs_res: c.Array[ctypes.c_ubyte, Literal[8]] + dc_access_key: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_680: c.Array[ctypes.c_ubyte, Literal[3]] + dbr_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_684: c.Array[ctypes.c_ubyte, Literal[188]] +struct_mlx5_ifc_qpc_bits.register_fields([('state', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('lag_tx_port_affinity', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('st', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[2]], 16), ('isolate_vl_tc', c.Array[ctypes.c_ubyte, Literal[1]], 18), ('pm_state', c.Array[ctypes.c_ubyte, Literal[2]], 19), ('reserved_at_15', c.Array[ctypes.c_ubyte, Literal[1]], 21), ('req_e2e_credit_mode', c.Array[ctypes.c_ubyte, Literal[2]], 22), ('offload_type', c.Array[ctypes.c_ubyte, Literal[4]], 24), ('end_padding_mode', c.Array[ctypes.c_ubyte, Literal[2]], 28), ('reserved_at_1e', c.Array[ctypes.c_ubyte, Literal[2]], 30), ('wq_signature', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('block_lb_mc', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('atomic_like_write_en', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('latency_sensitive', c.Array[ctypes.c_ubyte, Literal[1]], 35), ('reserved_at_24', c.Array[ctypes.c_ubyte, Literal[1]], 36), ('drain_sigerr', c.Array[ctypes.c_ubyte, Literal[1]], 37), ('reserved_at_26', c.Array[ctypes.c_ubyte, Literal[1]], 38), ('dp_ordering_force', c.Array[ctypes.c_ubyte, Literal[1]], 39), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('mtu', c.Array[ctypes.c_ubyte, Literal[3]], 64), ('log_msg_max', c.Array[ctypes.c_ubyte, Literal[5]], 67), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[1]], 72), ('log_rq_size', c.Array[ctypes.c_ubyte, Literal[4]], 73), ('log_rq_stride', c.Array[ctypes.c_ubyte, Literal[3]], 77), ('no_sq', c.Array[ctypes.c_ubyte, Literal[1]], 80), ('log_sq_size', c.Array[ctypes.c_ubyte, Literal[4]], 81), ('reserved_at_55', c.Array[ctypes.c_ubyte, Literal[1]], 85), ('retry_mode', c.Array[ctypes.c_ubyte, Literal[2]], 86), ('ts_format', c.Array[ctypes.c_ubyte, Literal[2]], 88), ('reserved_at_5a', c.Array[ctypes.c_ubyte, Literal[1]], 90), ('rlky', c.Array[ctypes.c_ubyte, Literal[1]], 91), ('ulp_stateless_offload_mode', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('counter_set_id', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('uar_page', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('user_index', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[3]], 160), ('log_page_size', c.Array[ctypes.c_ubyte, Literal[5]], 163), ('remote_qpn', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('primary_address_path', struct_mlx5_ifc_ads_bits, 192), ('secondary_address_path', struct_mlx5_ifc_ads_bits, 544), ('log_ack_req_freq', c.Array[ctypes.c_ubyte, Literal[4]], 896), ('reserved_at_384', c.Array[ctypes.c_ubyte, Literal[4]], 900), ('log_sra_max', c.Array[ctypes.c_ubyte, Literal[3]], 904), ('reserved_at_38b', c.Array[ctypes.c_ubyte, Literal[2]], 907), ('retry_count', c.Array[ctypes.c_ubyte, Literal[3]], 909), ('rnr_retry', c.Array[ctypes.c_ubyte, Literal[3]], 912), ('reserved_at_393', c.Array[ctypes.c_ubyte, Literal[1]], 915), ('fre', c.Array[ctypes.c_ubyte, Literal[1]], 916), ('cur_rnr_retry', c.Array[ctypes.c_ubyte, Literal[3]], 917), ('cur_retry_count', c.Array[ctypes.c_ubyte, Literal[3]], 920), ('reserved_at_39b', c.Array[ctypes.c_ubyte, Literal[5]], 923), ('reserved_at_3a0', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('reserved_at_3c0', c.Array[ctypes.c_ubyte, Literal[8]], 960), ('next_send_psn', c.Array[ctypes.c_ubyte, Literal[24]], 968), ('reserved_at_3e0', c.Array[ctypes.c_ubyte, Literal[3]], 992), ('log_num_dci_stream_channels', c.Array[ctypes.c_ubyte, Literal[5]], 995), ('cqn_snd', c.Array[ctypes.c_ubyte, Literal[24]], 1000), ('reserved_at_400', c.Array[ctypes.c_ubyte, Literal[3]], 1024), ('log_num_dci_errored_streams', c.Array[ctypes.c_ubyte, Literal[5]], 1027), ('deth_sqpn', c.Array[ctypes.c_ubyte, Literal[24]], 1032), ('reserved_at_420', c.Array[ctypes.c_ubyte, Literal[32]], 1056), ('reserved_at_440', c.Array[ctypes.c_ubyte, Literal[8]], 1088), ('last_acked_psn', c.Array[ctypes.c_ubyte, Literal[24]], 1096), ('reserved_at_460', c.Array[ctypes.c_ubyte, Literal[8]], 1120), ('ssn', c.Array[ctypes.c_ubyte, Literal[24]], 1128), ('reserved_at_480', c.Array[ctypes.c_ubyte, Literal[8]], 1152), ('log_rra_max', c.Array[ctypes.c_ubyte, Literal[3]], 1160), ('reserved_at_48b', c.Array[ctypes.c_ubyte, Literal[1]], 1163), ('atomic_mode', c.Array[ctypes.c_ubyte, Literal[4]], 1164), ('rre', c.Array[ctypes.c_ubyte, Literal[1]], 1168), ('rwe', c.Array[ctypes.c_ubyte, Literal[1]], 1169), ('rae', c.Array[ctypes.c_ubyte, Literal[1]], 1170), ('reserved_at_493', c.Array[ctypes.c_ubyte, Literal[1]], 1171), ('page_offset', c.Array[ctypes.c_ubyte, Literal[6]], 1172), ('reserved_at_49a', c.Array[ctypes.c_ubyte, Literal[2]], 1178), ('dp_ordering_1', c.Array[ctypes.c_ubyte, Literal[1]], 1180), ('cd_slave_receive', c.Array[ctypes.c_ubyte, Literal[1]], 1181), ('cd_slave_send', c.Array[ctypes.c_ubyte, Literal[1]], 1182), ('cd_master', c.Array[ctypes.c_ubyte, Literal[1]], 1183), ('reserved_at_4a0', c.Array[ctypes.c_ubyte, Literal[3]], 1184), ('min_rnr_nak', c.Array[ctypes.c_ubyte, Literal[5]], 1187), ('next_rcv_psn', c.Array[ctypes.c_ubyte, Literal[24]], 1192), ('reserved_at_4c0', c.Array[ctypes.c_ubyte, Literal[8]], 1216), ('xrcd', c.Array[ctypes.c_ubyte, Literal[24]], 1224), ('reserved_at_4e0', c.Array[ctypes.c_ubyte, Literal[8]], 1248), ('cqn_rcv', c.Array[ctypes.c_ubyte, Literal[24]], 1256), ('dbr_addr', c.Array[ctypes.c_ubyte, Literal[64]], 1280), ('q_key', c.Array[ctypes.c_ubyte, Literal[32]], 1344), ('reserved_at_560', c.Array[ctypes.c_ubyte, Literal[5]], 1376), ('rq_type', c.Array[ctypes.c_ubyte, Literal[3]], 1381), ('srqn_rmpn_xrqn', c.Array[ctypes.c_ubyte, Literal[24]], 1384), ('reserved_at_580', c.Array[ctypes.c_ubyte, Literal[8]], 1408), ('rmsn', c.Array[ctypes.c_ubyte, Literal[24]], 1416), ('hw_sq_wqebb_counter', c.Array[ctypes.c_ubyte, Literal[16]], 1440), ('sw_sq_wqebb_counter', c.Array[ctypes.c_ubyte, Literal[16]], 1456), ('hw_rq_counter', c.Array[ctypes.c_ubyte, Literal[32]], 1472), ('sw_rq_counter', c.Array[ctypes.c_ubyte, Literal[32]], 1504), ('reserved_at_600', c.Array[ctypes.c_ubyte, Literal[32]], 1536), ('reserved_at_620', c.Array[ctypes.c_ubyte, Literal[15]], 1568), ('cgs', c.Array[ctypes.c_ubyte, Literal[1]], 1583), ('cs_req', c.Array[ctypes.c_ubyte, Literal[8]], 1584), ('cs_res', c.Array[ctypes.c_ubyte, Literal[8]], 1592), ('dc_access_key', c.Array[ctypes.c_ubyte, Literal[64]], 1600), ('reserved_at_680', c.Array[ctypes.c_ubyte, Literal[3]], 1664), ('dbr_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 1667), ('reserved_at_684', c.Array[ctypes.c_ubyte, Literal[188]], 1668)]) +@c.record +class struct_mlx5_ifc_roce_addr_layout_bits(c.Struct): + SIZE = 256 + source_l3_address: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[3]] + vlan_valid: c.Array[ctypes.c_ubyte, Literal[1]] + vlan_id: c.Array[ctypes.c_ubyte, Literal[12]] + source_mac_47_32: c.Array[ctypes.c_ubyte, Literal[16]] + source_mac_31_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[20]] + roce_l3_type: c.Array[ctypes.c_ubyte, Literal[4]] + roce_version: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_roce_addr_layout_bits.register_fields([('source_l3_address', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 0), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[3]], 128), ('vlan_valid', c.Array[ctypes.c_ubyte, Literal[1]], 131), ('vlan_id', c.Array[ctypes.c_ubyte, Literal[12]], 132), ('source_mac_47_32', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('source_mac_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[20]], 192), ('roce_l3_type', c.Array[ctypes.c_ubyte, Literal[4]], 212), ('roce_version', c.Array[ctypes.c_ubyte, Literal[8]], 216), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_crypto_cap_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[3]] + synchronize_dek: c.Array[ctypes.c_ubyte, Literal[1]] + int_kek_manual: c.Array[ctypes.c_ubyte, Literal[1]] + int_kek_auto: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_6: c.Array[ctypes.c_ubyte, Literal[26]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[3]] + log_dek_max_alloc: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_28: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_num_deks: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[3]] + log_dek_granularity: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_num_int_kek: c.Array[ctypes.c_ubyte, Literal[5]] + sw_wrapped_dek: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[1920]] +struct_mlx5_ifc_crypto_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('synchronize_dek', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('int_kek_manual', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('int_kek_auto', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('reserved_at_6', c.Array[ctypes.c_ubyte, Literal[26]], 6), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[3]], 32), ('log_dek_max_alloc', c.Array[ctypes.c_ubyte, Literal[5]], 35), ('reserved_at_28', c.Array[ctypes.c_ubyte, Literal[3]], 40), ('log_max_num_deks', c.Array[ctypes.c_ubyte, Literal[5]], 43), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[3]], 96), ('log_dek_granularity', c.Array[ctypes.c_ubyte, Literal[5]], 99), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[3]], 104), ('log_max_num_int_kek', c.Array[ctypes.c_ubyte, Literal[5]], 107), ('sw_wrapped_dek', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[1920]], 128)]) +@c.record +class struct_mlx5_ifc_shampo_cap_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[3]] + shampo_log_max_reservation_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[3]] + shampo_log_min_reservation_size: c.Array[ctypes.c_ubyte, Literal[5]] + shampo_min_mss_size: c.Array[ctypes.c_ubyte, Literal[16]] + shampo_header_split: c.Array[ctypes.c_ubyte, Literal[1]] + shampo_header_split_data_merge: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[1]] + shampo_log_max_headers_entry_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_28: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[1984]] +struct_mlx5_ifc_shampo_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('shampo_log_max_reservation_size', c.Array[ctypes.c_ubyte, Literal[5]], 3), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[3]], 8), ('shampo_log_min_reservation_size', c.Array[ctypes.c_ubyte, Literal[5]], 11), ('shampo_min_mss_size', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('shampo_header_split', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('shampo_header_split_data_merge', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('shampo_log_max_headers_entry_size', c.Array[ctypes.c_ubyte, Literal[5]], 35), ('reserved_at_28', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[1984]], 64)]) +@c.record +class union_mlx5_ifc_hca_cap_union_bits(c.Struct): + SIZE = 32768 + cmd_hca_cap: struct_mlx5_ifc_cmd_hca_cap_bits + cmd_hca_cap_2: struct_mlx5_ifc_cmd_hca_cap_2_bits + odp_cap: struct_mlx5_ifc_odp_cap_bits + atomic_caps: struct_mlx5_ifc_atomic_caps_bits + roce_cap: struct_mlx5_ifc_roce_cap_bits + per_protocol_networking_offload_caps: struct_mlx5_ifc_per_protocol_networking_offload_caps_bits + flow_table_nic_cap: struct_mlx5_ifc_flow_table_nic_cap_bits + flow_table_eswitch_cap: struct_mlx5_ifc_flow_table_eswitch_cap_bits + wqe_based_flow_table_cap: struct_mlx5_ifc_wqe_based_flow_table_cap_bits + esw_cap: struct_mlx5_ifc_esw_cap_bits + e_switch_cap: struct_mlx5_ifc_e_switch_cap_bits + port_selection_cap: struct_mlx5_ifc_port_selection_cap_bits + qos_cap: struct_mlx5_ifc_qos_cap_bits + debug_cap: struct_mlx5_ifc_debug_cap_bits + fpga_cap: struct_mlx5_ifc_fpga_cap_bits + tls_cap: struct_mlx5_ifc_tls_cap_bits + device_mem_cap: struct_mlx5_ifc_device_mem_cap_bits + virtio_emulation_cap: struct_mlx5_ifc_virtio_emulation_cap_bits + macsec_cap: struct_mlx5_ifc_macsec_cap_bits + crypto_cap: struct_mlx5_ifc_crypto_cap_bits + ipsec_cap: struct_mlx5_ifc_ipsec_cap_bits + psp_cap: struct_mlx5_ifc_psp_cap_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32768]] +@c.record +class struct_mlx5_ifc_fpga_cap_bits(c.Struct): + SIZE = 2048 + fpga_id: c.Array[ctypes.c_ubyte, Literal[8]] + fpga_device: c.Array[ctypes.c_ubyte, Literal[24]] + register_file_ver: c.Array[ctypes.c_ubyte, Literal[32]] + fpga_ctrl_modify: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[5]] + access_reg_query_mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[6]] + access_reg_modify_mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + image_version: c.Array[ctypes.c_ubyte, Literal[32]] + image_date: c.Array[ctypes.c_ubyte, Literal[32]] + image_time: c.Array[ctypes.c_ubyte, Literal[32]] + shell_version: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[128]] + shell_caps: struct_mlx5_ifc_fpga_shell_caps_bits + reserved_at_380: c.Array[ctypes.c_ubyte, Literal[8]] + ieee_vendor_id: c.Array[ctypes.c_ubyte, Literal[24]] + sandbox_product_version: c.Array[ctypes.c_ubyte, Literal[16]] + sandbox_product_id: c.Array[ctypes.c_ubyte, Literal[16]] + sandbox_basic_caps: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_3e0: c.Array[ctypes.c_ubyte, Literal[16]] + sandbox_extended_caps_len: c.Array[ctypes.c_ubyte, Literal[16]] + sandbox_extended_caps_addr: c.Array[ctypes.c_ubyte, Literal[64]] + fpga_ddr_start_addr: c.Array[ctypes.c_ubyte, Literal[64]] + fpga_cr_space_start_addr: c.Array[ctypes.c_ubyte, Literal[64]] + fpga_ddr_size: c.Array[ctypes.c_ubyte, Literal[32]] + fpga_cr_space_size: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_500: c.Array[ctypes.c_ubyte, Literal[768]] +@c.record +class struct_mlx5_ifc_fpga_shell_caps_bits(c.Struct): + SIZE = 512 + max_num_qps: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + total_rcv_credits: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[14]] + qp_type: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[5]] + rae: c.Array[ctypes.c_ubyte, Literal[1]] + rwe: c.Array[ctypes.c_ubyte, Literal[1]] + rre: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[4]] + dc: c.Array[ctypes.c_ubyte, Literal[1]] + ud: c.Array[ctypes.c_ubyte, Literal[1]] + uc: c.Array[ctypes.c_ubyte, Literal[1]] + rc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[26]] + log_ddr_size: c.Array[ctypes.c_ubyte, Literal[6]] + max_fpga_qp_msg_size: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_fpga_shell_caps_bits.register_fields([('max_num_qps', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('total_rcv_credits', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[14]], 32), ('qp_type', c.Array[ctypes.c_ubyte, Literal[2]], 46), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[5]], 48), ('rae', c.Array[ctypes.c_ubyte, Literal[1]], 53), ('rwe', c.Array[ctypes.c_ubyte, Literal[1]], 54), ('rre', c.Array[ctypes.c_ubyte, Literal[1]], 55), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[4]], 56), ('dc', c.Array[ctypes.c_ubyte, Literal[1]], 60), ('ud', c.Array[ctypes.c_ubyte, Literal[1]], 61), ('uc', c.Array[ctypes.c_ubyte, Literal[1]], 62), ('rc', c.Array[ctypes.c_ubyte, Literal[1]], 63), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[26]], 64), ('log_ddr_size', c.Array[ctypes.c_ubyte, Literal[6]], 90), ('max_fpga_qp_msg_size', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +struct_mlx5_ifc_fpga_cap_bits.register_fields([('fpga_id', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('fpga_device', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('register_file_ver', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('fpga_ctrl_modify', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[5]], 65), ('access_reg_query_mode', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[6]], 72), ('access_reg_modify_mode', c.Array[ctypes.c_ubyte, Literal[2]], 78), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('image_version', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('image_date', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('image_time', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('shell_version', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[128]], 256), ('shell_caps', struct_mlx5_ifc_fpga_shell_caps_bits, 384), ('reserved_at_380', c.Array[ctypes.c_ubyte, Literal[8]], 896), ('ieee_vendor_id', c.Array[ctypes.c_ubyte, Literal[24]], 904), ('sandbox_product_version', c.Array[ctypes.c_ubyte, Literal[16]], 928), ('sandbox_product_id', c.Array[ctypes.c_ubyte, Literal[16]], 944), ('sandbox_basic_caps', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('reserved_at_3e0', c.Array[ctypes.c_ubyte, Literal[16]], 992), ('sandbox_extended_caps_len', c.Array[ctypes.c_ubyte, Literal[16]], 1008), ('sandbox_extended_caps_addr', c.Array[ctypes.c_ubyte, Literal[64]], 1024), ('fpga_ddr_start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 1088), ('fpga_cr_space_start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 1152), ('fpga_ddr_size', c.Array[ctypes.c_ubyte, Literal[32]], 1216), ('fpga_cr_space_size', c.Array[ctypes.c_ubyte, Literal[32]], 1248), ('reserved_at_500', c.Array[ctypes.c_ubyte, Literal[768]], 1280)]) +union_mlx5_ifc_hca_cap_union_bits.register_fields([('cmd_hca_cap', struct_mlx5_ifc_cmd_hca_cap_bits, 0), ('cmd_hca_cap_2', struct_mlx5_ifc_cmd_hca_cap_2_bits, 0), ('odp_cap', struct_mlx5_ifc_odp_cap_bits, 0), ('atomic_caps', struct_mlx5_ifc_atomic_caps_bits, 0), ('roce_cap', struct_mlx5_ifc_roce_cap_bits, 0), ('per_protocol_networking_offload_caps', struct_mlx5_ifc_per_protocol_networking_offload_caps_bits, 0), ('flow_table_nic_cap', struct_mlx5_ifc_flow_table_nic_cap_bits, 0), ('flow_table_eswitch_cap', struct_mlx5_ifc_flow_table_eswitch_cap_bits, 0), ('wqe_based_flow_table_cap', struct_mlx5_ifc_wqe_based_flow_table_cap_bits, 0), ('esw_cap', struct_mlx5_ifc_esw_cap_bits, 0), ('e_switch_cap', struct_mlx5_ifc_e_switch_cap_bits, 0), ('port_selection_cap', struct_mlx5_ifc_port_selection_cap_bits, 0), ('qos_cap', struct_mlx5_ifc_qos_cap_bits, 0), ('debug_cap', struct_mlx5_ifc_debug_cap_bits, 0), ('fpga_cap', struct_mlx5_ifc_fpga_cap_bits, 0), ('tls_cap', struct_mlx5_ifc_tls_cap_bits, 0), ('device_mem_cap', struct_mlx5_ifc_device_mem_cap_bits, 0), ('virtio_emulation_cap', struct_mlx5_ifc_virtio_emulation_cap_bits, 0), ('macsec_cap', struct_mlx5_ifc_macsec_cap_bits, 0), ('crypto_cap', struct_mlx5_ifc_crypto_cap_bits, 0), ('ipsec_cap', struct_mlx5_ifc_ipsec_cap_bits, 0), ('psp_cap', struct_mlx5_ifc_psp_cap_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32768]], 0)]) +_anonenum47: dict[int, str] = {(MLX5_FLOW_CONTEXT_ACTION_ALLOW:=1): 'MLX5_FLOW_CONTEXT_ACTION_ALLOW', (MLX5_FLOW_CONTEXT_ACTION_DROP:=2): 'MLX5_FLOW_CONTEXT_ACTION_DROP', (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST:=4): 'MLX5_FLOW_CONTEXT_ACTION_FWD_DEST', (MLX5_FLOW_CONTEXT_ACTION_COUNT:=8): 'MLX5_FLOW_CONTEXT_ACTION_COUNT', (MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT:=16): 'MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT', (MLX5_FLOW_CONTEXT_ACTION_DECAP:=32): 'MLX5_FLOW_CONTEXT_ACTION_DECAP', (MLX5_FLOW_CONTEXT_ACTION_MOD_HDR:=64): 'MLX5_FLOW_CONTEXT_ACTION_MOD_HDR', (MLX5_FLOW_CONTEXT_ACTION_VLAN_POP:=128): 'MLX5_FLOW_CONTEXT_ACTION_VLAN_POP', (MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH:=256): 'MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH', (MLX5_FLOW_CONTEXT_ACTION_VLAN_POP_2:=1024): 'MLX5_FLOW_CONTEXT_ACTION_VLAN_POP_2', (MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH_2:=2048): 'MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH_2', (MLX5_FLOW_CONTEXT_ACTION_CRYPTO_DECRYPT:=4096): 'MLX5_FLOW_CONTEXT_ACTION_CRYPTO_DECRYPT', (MLX5_FLOW_CONTEXT_ACTION_CRYPTO_ENCRYPT:=8192): 'MLX5_FLOW_CONTEXT_ACTION_CRYPTO_ENCRYPT', (MLX5_FLOW_CONTEXT_ACTION_EXECUTE_ASO:=16384): 'MLX5_FLOW_CONTEXT_ACTION_EXECUTE_ASO'} +_anonenum48: dict[int, str] = {(MLX5_FLOW_CONTEXT_FLOW_SOURCE_ANY_VPORT:=0): 'MLX5_FLOW_CONTEXT_FLOW_SOURCE_ANY_VPORT', (MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK:=1): 'MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK', (MLX5_FLOW_CONTEXT_FLOW_SOURCE_LOCAL_VPORT:=2): 'MLX5_FLOW_CONTEXT_FLOW_SOURCE_LOCAL_VPORT'} +_anonenum49: dict[int, str] = {(MLX5_FLOW_CONTEXT_ENCRYPT_DECRYPT_TYPE_IPSEC:=0): 'MLX5_FLOW_CONTEXT_ENCRYPT_DECRYPT_TYPE_IPSEC', (MLX5_FLOW_CONTEXT_ENCRYPT_DECRYPT_TYPE_MACSEC:=1): 'MLX5_FLOW_CONTEXT_ENCRYPT_DECRYPT_TYPE_MACSEC', (MLX5_FLOW_CONTEXT_ENCRYPT_DECRYPT_TYPE_PSP:=2): 'MLX5_FLOW_CONTEXT_ENCRYPT_DECRYPT_TYPE_PSP'} +@c.record +class struct_mlx5_ifc_vlan_bits(c.Struct): + SIZE = 32 + ethtype: c.Array[ctypes.c_ubyte, Literal[16]] + prio: c.Array[ctypes.c_ubyte, Literal[3]] + cfi: c.Array[ctypes.c_ubyte, Literal[1]] + vid: c.Array[ctypes.c_ubyte, Literal[12]] +struct_mlx5_ifc_vlan_bits.register_fields([('ethtype', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('prio', c.Array[ctypes.c_ubyte, Literal[3]], 16), ('cfi', c.Array[ctypes.c_ubyte, Literal[1]], 19), ('vid', c.Array[ctypes.c_ubyte, Literal[12]], 20)]) +_anonenum50: dict[int, str] = {(MLX5_FLOW_METER_COLOR_RED:=0): 'MLX5_FLOW_METER_COLOR_RED', (MLX5_FLOW_METER_COLOR_YELLOW:=1): 'MLX5_FLOW_METER_COLOR_YELLOW', (MLX5_FLOW_METER_COLOR_GREEN:=2): 'MLX5_FLOW_METER_COLOR_GREEN', (MLX5_FLOW_METER_COLOR_UNDEFINED:=3): 'MLX5_FLOW_METER_COLOR_UNDEFINED'} +_anonenum51: dict[int, str] = {(MLX5_EXE_ASO_FLOW_METER:=2): 'MLX5_EXE_ASO_FLOW_METER'} +@c.record +class struct_mlx5_ifc_exe_aso_ctrl_flow_meter_bits(c.Struct): + SIZE = 32 + return_reg_id: c.Array[ctypes.c_ubyte, Literal[4]] + aso_type: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[20]] + action: c.Array[ctypes.c_ubyte, Literal[1]] + init_color: c.Array[ctypes.c_ubyte, Literal[2]] + meter_id: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_exe_aso_ctrl_flow_meter_bits.register_fields([('return_reg_id', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('aso_type', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[20]], 8), ('action', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('init_color', c.Array[ctypes.c_ubyte, Literal[2]], 29), ('meter_id', c.Array[ctypes.c_ubyte, Literal[1]], 31)]) +@c.record +class union_mlx5_ifc_exe_aso_ctrl(c.Struct): + SIZE = 32 + exe_aso_ctrl_flow_meter: struct_mlx5_ifc_exe_aso_ctrl_flow_meter_bits +union_mlx5_ifc_exe_aso_ctrl.register_fields([('exe_aso_ctrl_flow_meter', struct_mlx5_ifc_exe_aso_ctrl_flow_meter_bits, 0)]) +@c.record +class struct_mlx5_ifc_execute_aso_bits(c.Struct): + SIZE = 64 + valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[7]] + aso_object_id: c.Array[ctypes.c_ubyte, Literal[24]] + exe_aso_ctrl: union_mlx5_ifc_exe_aso_ctrl +struct_mlx5_ifc_execute_aso_bits.register_fields([('valid', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[7]], 1), ('aso_object_id', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('exe_aso_ctrl', union_mlx5_ifc_exe_aso_ctrl, 32)]) +@c.record +class struct_mlx5_ifc_flow_context_bits(c.Struct): + SIZE = 6144 + push_vlan: struct_mlx5_ifc_vlan_bits + group_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + flow_tag: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + action: c.Array[ctypes.c_ubyte, Literal[16]] + extended_destination: c.Array[ctypes.c_ubyte, Literal[1]] + uplink_hairpin_en: c.Array[ctypes.c_ubyte, Literal[1]] + flow_source: c.Array[ctypes.c_ubyte, Literal[2]] + encrypt_decrypt_type: c.Array[ctypes.c_ubyte, Literal[4]] + destination_list_size: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + flow_counter_list_size: c.Array[ctypes.c_ubyte, Literal[24]] + packet_reformat_id: c.Array[ctypes.c_ubyte, Literal[32]] + modify_header_id: c.Array[ctypes.c_ubyte, Literal[32]] + push_vlan_2: struct_mlx5_ifc_vlan_bits + encrypt_decrypt_obj_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[192]] + match_value: struct_mlx5_ifc_fte_match_param_bits + execute_aso: c.Array[struct_mlx5_ifc_execute_aso_bits, Literal[4]] + reserved_at_1300: c.Array[ctypes.c_ubyte, Literal[1280]] + destination: c.Array[union_mlx5_ifc_dest_format_flow_counter_list_auto_bits, Literal[0]] +struct_mlx5_ifc_flow_context_bits.register_fields([('push_vlan', struct_mlx5_ifc_vlan_bits, 0), ('group_id', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('flow_tag', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('action', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('extended_destination', c.Array[ctypes.c_ubyte, Literal[1]], 128), ('uplink_hairpin_en', c.Array[ctypes.c_ubyte, Literal[1]], 129), ('flow_source', c.Array[ctypes.c_ubyte, Literal[2]], 130), ('encrypt_decrypt_type', c.Array[ctypes.c_ubyte, Literal[4]], 132), ('destination_list_size', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('flow_counter_list_size', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('packet_reformat_id', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('modify_header_id', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('push_vlan_2', struct_mlx5_ifc_vlan_bits, 256), ('encrypt_decrypt_obj_id', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[192]], 320), ('match_value', struct_mlx5_ifc_fte_match_param_bits, 512), ('execute_aso', c.Array[struct_mlx5_ifc_execute_aso_bits, Literal[4]], 4608), ('reserved_at_1300', c.Array[ctypes.c_ubyte, Literal[1280]], 4864), ('destination', c.Array[union_mlx5_ifc_dest_format_flow_counter_list_auto_bits, Literal[0]], 6144)]) +_anonenum52: dict[int, str] = {(MLX5_XRC_SRQC_STATE_GOOD:=0): 'MLX5_XRC_SRQC_STATE_GOOD', (MLX5_XRC_SRQC_STATE_ERROR:=1): 'MLX5_XRC_SRQC_STATE_ERROR'} +@c.record +class struct_mlx5_ifc_xrc_srqc_bits(c.Struct): + SIZE = 512 + state: c.Array[ctypes.c_ubyte, Literal[4]] + log_xrc_srq_size: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + wq_signature: c.Array[ctypes.c_ubyte, Literal[1]] + cont_srq: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[1]] + rlky: c.Array[ctypes.c_ubyte, Literal[1]] + basic_cyclic_rcv_wqe: c.Array[ctypes.c_ubyte, Literal[1]] + log_rq_stride: c.Array[ctypes.c_ubyte, Literal[3]] + xrcd: c.Array[ctypes.c_ubyte, Literal[24]] + page_offset: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_46: c.Array[ctypes.c_ubyte, Literal[1]] + dbr_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + user_index_equal_xrc_srqn: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_81: c.Array[ctypes.c_ubyte, Literal[1]] + log_page_size: c.Array[ctypes.c_ubyte, Literal[6]] + user_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + lwm: c.Array[ctypes.c_ubyte, Literal[16]] + wqe_cnt: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[64]] + db_record_addr_h: c.Array[ctypes.c_ubyte, Literal[32]] + db_record_addr_l: c.Array[ctypes.c_ubyte, Literal[30]] + reserved_at_17e: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_xrc_srqc_bits.register_fields([('state', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('log_xrc_srq_size', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('wq_signature', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('cont_srq', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('rlky', c.Array[ctypes.c_ubyte, Literal[1]], 35), ('basic_cyclic_rcv_wqe', c.Array[ctypes.c_ubyte, Literal[1]], 36), ('log_rq_stride', c.Array[ctypes.c_ubyte, Literal[3]], 37), ('xrcd', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('page_offset', c.Array[ctypes.c_ubyte, Literal[6]], 64), ('reserved_at_46', c.Array[ctypes.c_ubyte, Literal[1]], 70), ('dbr_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 71), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('user_index_equal_xrc_srqn', c.Array[ctypes.c_ubyte, Literal[1]], 128), ('reserved_at_81', c.Array[ctypes.c_ubyte, Literal[1]], 129), ('log_page_size', c.Array[ctypes.c_ubyte, Literal[6]], 130), ('user_index', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('lwm', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('wqe_cnt', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[64]], 256), ('db_record_addr_h', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('db_record_addr_l', c.Array[ctypes.c_ubyte, Literal[30]], 352), ('reserved_at_17e', c.Array[ctypes.c_ubyte, Literal[2]], 382), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[128]], 384)]) +@c.record +class struct_mlx5_ifc_vnic_diagnostic_statistics_bits(c.Struct): + SIZE = 4096 + counter_error_queues: c.Array[ctypes.c_ubyte, Literal[32]] + total_error_queues: c.Array[ctypes.c_ubyte, Literal[32]] + send_queue_priority_update_flow: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + nic_receive_steering_discard: c.Array[ctypes.c_ubyte, Literal[64]] + receive_discard_vport_down: c.Array[ctypes.c_ubyte, Literal[64]] + transmit_discard_vport_down: c.Array[ctypes.c_ubyte, Literal[64]] + async_eq_overrun: c.Array[ctypes.c_ubyte, Literal[32]] + comp_eq_overrun: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[32]] + invalid_command: c.Array[ctypes.c_ubyte, Literal[32]] + quota_exceeded_command: c.Array[ctypes.c_ubyte, Literal[32]] + internal_rq_out_of_buffer: c.Array[ctypes.c_ubyte, Literal[32]] + cq_overrun: c.Array[ctypes.c_ubyte, Literal[32]] + eth_wqe_too_small: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_220: c.Array[ctypes.c_ubyte, Literal[192]] + generated_pkt_steering_fail: c.Array[ctypes.c_ubyte, Literal[64]] + handled_pkt_steering_fail: c.Array[ctypes.c_ubyte, Literal[64]] + bar_uar_access: c.Array[ctypes.c_ubyte, Literal[32]] + odp_local_triggered_page_fault: c.Array[ctypes.c_ubyte, Literal[32]] + odp_remote_triggered_page_fault: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_3c0: c.Array[ctypes.c_ubyte, Literal[3104]] +struct_mlx5_ifc_vnic_diagnostic_statistics_bits.register_fields([('counter_error_queues', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('total_error_queues', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('send_queue_priority_update_flow', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('nic_receive_steering_discard', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('receive_discard_vport_down', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('transmit_discard_vport_down', c.Array[ctypes.c_ubyte, Literal[64]], 256), ('async_eq_overrun', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('comp_eq_overrun', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('invalid_command', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('quota_exceeded_command', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('internal_rq_out_of_buffer', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('cq_overrun', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('eth_wqe_too_small', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('reserved_at_220', c.Array[ctypes.c_ubyte, Literal[192]], 576), ('generated_pkt_steering_fail', c.Array[ctypes.c_ubyte, Literal[64]], 768), ('handled_pkt_steering_fail', c.Array[ctypes.c_ubyte, Literal[64]], 832), ('bar_uar_access', c.Array[ctypes.c_ubyte, Literal[32]], 896), ('odp_local_triggered_page_fault', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('odp_remote_triggered_page_fault', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('reserved_at_3c0', c.Array[ctypes.c_ubyte, Literal[3104]], 992)]) +@c.record +class struct_mlx5_ifc_traffic_counter_bits(c.Struct): + SIZE = 128 + packets: c.Array[ctypes.c_ubyte, Literal[64]] + octets: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_traffic_counter_bits.register_fields([('packets', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('octets', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_tisc_bits(c.Struct): + SIZE = 1280 + strict_lag_tx_port_affinity: c.Array[ctypes.c_ubyte, Literal[1]] + tls_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[2]] + lag_tx_port_affinity: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[4]] + prio: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[256]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[8]] + transport_domain: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[8]] + underlay_qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[896]] +struct_mlx5_ifc_tisc_bits.register_fields([('strict_lag_tx_port_affinity', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('tls_en', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[2]], 2), ('lag_tx_port_affinity', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[4]], 8), ('prio', c.Array[ctypes.c_ubyte, Literal[4]], 12), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[256]], 32), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[8]], 288), ('transport_domain', c.Array[ctypes.c_ubyte, Literal[24]], 296), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[8]], 320), ('underlay_qpn', c.Array[ctypes.c_ubyte, Literal[24]], 328), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[8]], 352), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 360), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[896]], 384)]) +_anonenum53: dict[int, str] = {(MLX5_TIRC_DISP_TYPE_DIRECT:=0): 'MLX5_TIRC_DISP_TYPE_DIRECT', (MLX5_TIRC_DISP_TYPE_INDIRECT:=1): 'MLX5_TIRC_DISP_TYPE_INDIRECT'} +_anonenum54: dict[int, str] = {(MLX5_TIRC_PACKET_MERGE_MASK_IPV4_LRO:=0): 'MLX5_TIRC_PACKET_MERGE_MASK_IPV4_LRO', (MLX5_TIRC_PACKET_MERGE_MASK_IPV6_LRO:=1): 'MLX5_TIRC_PACKET_MERGE_MASK_IPV6_LRO'} +_anonenum55: dict[int, str] = {(MLX5_RX_HASH_FN_NONE:=0): 'MLX5_RX_HASH_FN_NONE', (MLX5_RX_HASH_FN_INVERTED_XOR8:=1): 'MLX5_RX_HASH_FN_INVERTED_XOR8', (MLX5_RX_HASH_FN_TOEPLITZ:=2): 'MLX5_RX_HASH_FN_TOEPLITZ'} +_anonenum56: dict[int, str] = {(MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST:=1): 'MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST', (MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST:=2): 'MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST'} +@c.record +class struct_mlx5_ifc_tirc_bits(c.Struct): + SIZE = 1920 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + disp_type: c.Array[ctypes.c_ubyte, Literal[4]] + tls_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_25: c.Array[ctypes.c_ubyte, Literal[27]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[4]] + lro_timeout_period_usecs: c.Array[ctypes.c_ubyte, Literal[16]] + packet_merge_mask: c.Array[ctypes.c_ubyte, Literal[4]] + lro_max_ip_payload_size: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[8]] + inline_rqn: c.Array[ctypes.c_ubyte, Literal[24]] + rx_hash_symmetric: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_101: c.Array[ctypes.c_ubyte, Literal[1]] + tunneled_offload_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_103: c.Array[ctypes.c_ubyte, Literal[5]] + indirect_table: c.Array[ctypes.c_ubyte, Literal[24]] + rx_hash_fn: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_124: c.Array[ctypes.c_ubyte, Literal[2]] + self_lb_block: c.Array[ctypes.c_ubyte, Literal[2]] + transport_domain: c.Array[ctypes.c_ubyte, Literal[24]] + rx_hash_toeplitz_key: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[10]] + rx_hash_field_selector_outer: struct_mlx5_ifc_rx_hash_field_select_bits + rx_hash_field_selector_inner: struct_mlx5_ifc_rx_hash_field_select_bits + reserved_at_2c0: c.Array[ctypes.c_ubyte, Literal[1216]] +struct_mlx5_ifc_tirc_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('disp_type', c.Array[ctypes.c_ubyte, Literal[4]], 32), ('tls_en', c.Array[ctypes.c_ubyte, Literal[1]], 36), ('reserved_at_25', c.Array[ctypes.c_ubyte, Literal[27]], 37), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[4]], 128), ('lro_timeout_period_usecs', c.Array[ctypes.c_ubyte, Literal[16]], 132), ('packet_merge_mask', c.Array[ctypes.c_ubyte, Literal[4]], 148), ('lro_max_ip_payload_size', c.Array[ctypes.c_ubyte, Literal[8]], 152), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[64]], 160), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[8]], 224), ('inline_rqn', c.Array[ctypes.c_ubyte, Literal[24]], 232), ('rx_hash_symmetric', c.Array[ctypes.c_ubyte, Literal[1]], 256), ('reserved_at_101', c.Array[ctypes.c_ubyte, Literal[1]], 257), ('tunneled_offload_en', c.Array[ctypes.c_ubyte, Literal[1]], 258), ('reserved_at_103', c.Array[ctypes.c_ubyte, Literal[5]], 259), ('indirect_table', c.Array[ctypes.c_ubyte, Literal[24]], 264), ('rx_hash_fn', c.Array[ctypes.c_ubyte, Literal[4]], 288), ('reserved_at_124', c.Array[ctypes.c_ubyte, Literal[2]], 292), ('self_lb_block', c.Array[ctypes.c_ubyte, Literal[2]], 294), ('transport_domain', c.Array[ctypes.c_ubyte, Literal[24]], 296), ('rx_hash_toeplitz_key', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[10]], 320), ('rx_hash_field_selector_outer', struct_mlx5_ifc_rx_hash_field_select_bits, 640), ('rx_hash_field_selector_inner', struct_mlx5_ifc_rx_hash_field_select_bits, 672), ('reserved_at_2c0', c.Array[ctypes.c_ubyte, Literal[1216]], 704)]) +_anonenum57: dict[int, str] = {(MLX5_SRQC_STATE_GOOD:=0): 'MLX5_SRQC_STATE_GOOD', (MLX5_SRQC_STATE_ERROR:=1): 'MLX5_SRQC_STATE_ERROR'} +@c.record +class struct_mlx5_ifc_srqc_bits(c.Struct): + SIZE = 512 + state: c.Array[ctypes.c_ubyte, Literal[4]] + log_srq_size: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + wq_signature: c.Array[ctypes.c_ubyte, Literal[1]] + cont_srq: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[1]] + rlky: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_24: c.Array[ctypes.c_ubyte, Literal[1]] + log_rq_stride: c.Array[ctypes.c_ubyte, Literal[3]] + xrcd: c.Array[ctypes.c_ubyte, Literal[24]] + page_offset: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_46: c.Array[ctypes.c_ubyte, Literal[2]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[2]] + log_page_size: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + lwm: c.Array[ctypes.c_ubyte, Literal[16]] + wqe_cnt: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[64]] + dbr_addr: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_srqc_bits.register_fields([('state', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('log_srq_size', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('wq_signature', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('cont_srq', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('rlky', c.Array[ctypes.c_ubyte, Literal[1]], 35), ('reserved_at_24', c.Array[ctypes.c_ubyte, Literal[1]], 36), ('log_rq_stride', c.Array[ctypes.c_ubyte, Literal[3]], 37), ('xrcd', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('page_offset', c.Array[ctypes.c_ubyte, Literal[6]], 64), ('reserved_at_46', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[2]], 128), ('log_page_size', c.Array[ctypes.c_ubyte, Literal[6]], 130), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('lwm', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('wqe_cnt', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[64]], 256), ('dbr_addr', c.Array[ctypes.c_ubyte, Literal[64]], 320), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[128]], 384)]) +_anonenum58: dict[int, str] = {(MLX5_SQC_STATE_RST:=0): 'MLX5_SQC_STATE_RST', (MLX5_SQC_STATE_RDY:=1): 'MLX5_SQC_STATE_RDY', (MLX5_SQC_STATE_ERR:=3): 'MLX5_SQC_STATE_ERR'} +@c.record +class struct_mlx5_ifc_sqc_bits(c.Struct): + SIZE = 1920 + rlky: c.Array[ctypes.c_ubyte, Literal[1]] + cd_master: c.Array[ctypes.c_ubyte, Literal[1]] + fre: c.Array[ctypes.c_ubyte, Literal[1]] + flush_in_error_en: c.Array[ctypes.c_ubyte, Literal[1]] + allow_multi_pkt_send_wqe: c.Array[ctypes.c_ubyte, Literal[1]] + min_wqe_inline_mode: c.Array[ctypes.c_ubyte, Literal[3]] + state: c.Array[ctypes.c_ubyte, Literal[4]] + reg_umr: c.Array[ctypes.c_ubyte, Literal[1]] + allow_swp: c.Array[ctypes.c_ubyte, Literal[1]] + hairpin: c.Array[ctypes.c_ubyte, Literal[1]] + non_wire: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[10]] + ts_format: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_1c: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + user_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[8]] + hairpin_peer_rq: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[16]] + hairpin_peer_vhca: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + ts_cqe_to_dest_cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[16]] + packet_pacing_rate_limit_index: c.Array[ctypes.c_ubyte, Literal[16]] + tis_lst_sz: c.Array[ctypes.c_ubyte, Literal[16]] + qos_queue_group_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[8]] + tis_num_0: c.Array[ctypes.c_ubyte, Literal[24]] + wq: struct_mlx5_ifc_wq_bits +struct_mlx5_ifc_sqc_bits.register_fields([('rlky', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('cd_master', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('fre', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('flush_in_error_en', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('allow_multi_pkt_send_wqe', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('min_wqe_inline_mode', c.Array[ctypes.c_ubyte, Literal[3]], 5), ('state', c.Array[ctypes.c_ubyte, Literal[4]], 8), ('reg_umr', c.Array[ctypes.c_ubyte, Literal[1]], 12), ('allow_swp', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('hairpin', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('non_wire', c.Array[ctypes.c_ubyte, Literal[1]], 15), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[10]], 16), ('ts_format', c.Array[ctypes.c_ubyte, Literal[2]], 26), ('reserved_at_1c', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('user_index', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('hairpin_peer_rq', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('hairpin_peer_vhca', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('ts_cqe_to_dest_cqn', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('packet_pacing_rate_limit_index', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('tis_lst_sz', c.Array[ctypes.c_ubyte, Literal[16]], 256), ('qos_queue_group_id', c.Array[ctypes.c_ubyte, Literal[16]], 272), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[64]], 288), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[8]], 352), ('tis_num_0', c.Array[ctypes.c_ubyte, Literal[24]], 360), ('wq', struct_mlx5_ifc_wq_bits, 384)]) +_anonenum59: dict[int, str] = {(SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR:=0): 'SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR', (SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT:=1): 'SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT', (SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT_TC:=2): 'SCHEDULING_CONTEXT_ELEMENT_TYPE_VPORT_TC', (SCHEDULING_CONTEXT_ELEMENT_TYPE_PARA_VPORT_TC:=3): 'SCHEDULING_CONTEXT_ELEMENT_TYPE_PARA_VPORT_TC', (SCHEDULING_CONTEXT_ELEMENT_TYPE_QUEUE_GROUP:=4): 'SCHEDULING_CONTEXT_ELEMENT_TYPE_QUEUE_GROUP', (SCHEDULING_CONTEXT_ELEMENT_TYPE_RATE_LIMIT:=5): 'SCHEDULING_CONTEXT_ELEMENT_TYPE_RATE_LIMIT'} +_anonenum60: dict[int, str] = {(ELEMENT_TYPE_CAP_MASK_TSAR:=1): 'ELEMENT_TYPE_CAP_MASK_TSAR', (ELEMENT_TYPE_CAP_MASK_VPORT:=2): 'ELEMENT_TYPE_CAP_MASK_VPORT', (ELEMENT_TYPE_CAP_MASK_VPORT_TC:=4): 'ELEMENT_TYPE_CAP_MASK_VPORT_TC', (ELEMENT_TYPE_CAP_MASK_PARA_VPORT_TC:=8): 'ELEMENT_TYPE_CAP_MASK_PARA_VPORT_TC', (ELEMENT_TYPE_CAP_MASK_QUEUE_GROUP:=16): 'ELEMENT_TYPE_CAP_MASK_QUEUE_GROUP', (ELEMENT_TYPE_CAP_MASK_RATE_LIMIT:=32): 'ELEMENT_TYPE_CAP_MASK_RATE_LIMIT'} +_anonenum61: dict[int, str] = {(TSAR_ELEMENT_TSAR_TYPE_DWRR:=0): 'TSAR_ELEMENT_TSAR_TYPE_DWRR', (TSAR_ELEMENT_TSAR_TYPE_ROUND_ROBIN:=1): 'TSAR_ELEMENT_TSAR_TYPE_ROUND_ROBIN', (TSAR_ELEMENT_TSAR_TYPE_ETS:=2): 'TSAR_ELEMENT_TSAR_TYPE_ETS', (TSAR_ELEMENT_TSAR_TYPE_TC_ARB:=3): 'TSAR_ELEMENT_TSAR_TYPE_TC_ARB'} +_anonenum62: dict[int, str] = {(TSAR_TYPE_CAP_MASK_DWRR:=1): 'TSAR_TYPE_CAP_MASK_DWRR', (TSAR_TYPE_CAP_MASK_ROUND_ROBIN:=2): 'TSAR_TYPE_CAP_MASK_ROUND_ROBIN', (TSAR_TYPE_CAP_MASK_ETS:=4): 'TSAR_TYPE_CAP_MASK_ETS', (TSAR_TYPE_CAP_MASK_TC_ARB:=8): 'TSAR_TYPE_CAP_MASK_TC_ARB'} +@c.record +class struct_mlx5_ifc_tsar_element_bits(c.Struct): + SIZE = 32 + traffic_class: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[4]] + tsar_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_tsar_element_bits.register_fields([('traffic_class', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('tsar_type', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16)]) +@c.record +class struct_mlx5_ifc_vport_element_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + eswitch_owner_vhca_id_valid: c.Array[ctypes.c_ubyte, Literal[1]] + eswitch_owner_vhca_id: c.Array[ctypes.c_ubyte, Literal[11]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_vport_element_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('eswitch_owner_vhca_id_valid', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('eswitch_owner_vhca_id', c.Array[ctypes.c_ubyte, Literal[11]], 5), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 16)]) +@c.record +class struct_mlx5_ifc_vport_tc_element_bits(c.Struct): + SIZE = 32 + traffic_class: c.Array[ctypes.c_ubyte, Literal[4]] + eswitch_owner_vhca_id_valid: c.Array[ctypes.c_ubyte, Literal[1]] + eswitch_owner_vhca_id: c.Array[ctypes.c_ubyte, Literal[11]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_vport_tc_element_bits.register_fields([('traffic_class', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('eswitch_owner_vhca_id_valid', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('eswitch_owner_vhca_id', c.Array[ctypes.c_ubyte, Literal[11]], 5), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 16)]) +@c.record +class union_mlx5_ifc_element_attributes_bits(c.Struct): + SIZE = 32 + tsar: struct_mlx5_ifc_tsar_element_bits + vport: struct_mlx5_ifc_vport_element_bits + vport_tc: struct_mlx5_ifc_vport_tc_element_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] +union_mlx5_ifc_element_attributes_bits.register_fields([('tsar', struct_mlx5_ifc_tsar_element_bits, 0), ('vport', struct_mlx5_ifc_vport_element_bits, 0), ('vport_tc', struct_mlx5_ifc_vport_tc_element_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_scheduling_context_bits(c.Struct): + SIZE = 512 + element_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + element_attributes: union_mlx5_ifc_element_attributes_bits + parent_element_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[64]] + bw_share: c.Array[ctypes.c_ubyte, Literal[32]] + max_average_bw: c.Array[ctypes.c_ubyte, Literal[32]] + max_bw_obj_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_scheduling_context_bits.register_fields([('element_type', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('element_attributes', union_mlx5_ifc_element_attributes_bits, 32), ('parent_element_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[64]], 96), ('bw_share', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('max_average_bw', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('max_bw_obj_id', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[256]], 256)]) +@c.record +class struct_mlx5_ifc_rqtc_bits(c.Struct): + SIZE = 1920 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[160]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[5]] + list_q_type: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_a8: c.Array[ctypes.c_ubyte, Literal[8]] + rqt_max_size: c.Array[ctypes.c_ubyte, Literal[16]] + rq_vhca_id_format: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_c1: c.Array[ctypes.c_ubyte, Literal[15]] + rqt_actual_size: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[1696]] +struct_mlx5_ifc_rqtc_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[160]], 0), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[5]], 160), ('list_q_type', c.Array[ctypes.c_ubyte, Literal[3]], 165), ('reserved_at_a8', c.Array[ctypes.c_ubyte, Literal[8]], 168), ('rqt_max_size', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('rq_vhca_id_format', c.Array[ctypes.c_ubyte, Literal[1]], 192), ('reserved_at_c1', c.Array[ctypes.c_ubyte, Literal[15]], 193), ('rqt_actual_size', c.Array[ctypes.c_ubyte, Literal[16]], 208), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[1696]], 224)]) +_anonenum63: dict[int, str] = {(MLX5_RQC_MEM_RQ_TYPE_MEMORY_RQ_INLINE:=0): 'MLX5_RQC_MEM_RQ_TYPE_MEMORY_RQ_INLINE', (MLX5_RQC_MEM_RQ_TYPE_MEMORY_RQ_RMP:=1): 'MLX5_RQC_MEM_RQ_TYPE_MEMORY_RQ_RMP'} +_anonenum64: dict[int, str] = {(MLX5_RQC_STATE_RST:=0): 'MLX5_RQC_STATE_RST', (MLX5_RQC_STATE_RDY:=1): 'MLX5_RQC_STATE_RDY', (MLX5_RQC_STATE_ERR:=3): 'MLX5_RQC_STATE_ERR'} +_anonenum65: dict[int, str] = {(MLX5_RQC_SHAMPO_NO_MATCH_ALIGNMENT_GRANULARITY_BYTE:=0): 'MLX5_RQC_SHAMPO_NO_MATCH_ALIGNMENT_GRANULARITY_BYTE', (MLX5_RQC_SHAMPO_NO_MATCH_ALIGNMENT_GRANULARITY_STRIDE:=1): 'MLX5_RQC_SHAMPO_NO_MATCH_ALIGNMENT_GRANULARITY_STRIDE', (MLX5_RQC_SHAMPO_NO_MATCH_ALIGNMENT_GRANULARITY_PAGE:=2): 'MLX5_RQC_SHAMPO_NO_MATCH_ALIGNMENT_GRANULARITY_PAGE'} +_anonenum66: dict[int, str] = {(MLX5_RQC_SHAMPO_MATCH_CRITERIA_TYPE_NO_MATCH:=0): 'MLX5_RQC_SHAMPO_MATCH_CRITERIA_TYPE_NO_MATCH', (MLX5_RQC_SHAMPO_MATCH_CRITERIA_TYPE_EXTENDED:=1): 'MLX5_RQC_SHAMPO_MATCH_CRITERIA_TYPE_EXTENDED', (MLX5_RQC_SHAMPO_MATCH_CRITERIA_TYPE_FIVE_TUPLE:=2): 'MLX5_RQC_SHAMPO_MATCH_CRITERIA_TYPE_FIVE_TUPLE'} +@c.record +class struct_mlx5_ifc_rqc_bits(c.Struct): + SIZE = 1920 + rlky: c.Array[ctypes.c_ubyte, Literal[1]] + delay_drop_en: c.Array[ctypes.c_ubyte, Literal[1]] + scatter_fcs: c.Array[ctypes.c_ubyte, Literal[1]] + vsd: c.Array[ctypes.c_ubyte, Literal[1]] + mem_rq_type: c.Array[ctypes.c_ubyte, Literal[4]] + state: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_c: c.Array[ctypes.c_ubyte, Literal[1]] + flush_in_error_en: c.Array[ctypes.c_ubyte, Literal[1]] + hairpin: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_f: c.Array[ctypes.c_ubyte, Literal[11]] + ts_format: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_1c: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + user_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + counter_set_id: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + rmpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + hairpin_peer_sq: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[16]] + hairpin_peer_vhca: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[70]] + shampo_no_match_alignment_granularity: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_128: c.Array[ctypes.c_ubyte, Literal[6]] + shampo_match_criteria_type: c.Array[ctypes.c_ubyte, Literal[2]] + reservation_timeout: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[64]] + wq: struct_mlx5_ifc_wq_bits +struct_mlx5_ifc_rqc_bits.register_fields([('rlky', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('delay_drop_en', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('scatter_fcs', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('vsd', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('mem_rq_type', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('state', c.Array[ctypes.c_ubyte, Literal[4]], 8), ('reserved_at_c', c.Array[ctypes.c_ubyte, Literal[1]], 12), ('flush_in_error_en', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('hairpin', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('reserved_at_f', c.Array[ctypes.c_ubyte, Literal[11]], 15), ('ts_format', c.Array[ctypes.c_ubyte, Literal[2]], 26), ('reserved_at_1c', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('user_index', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('counter_set_id', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('rmpn', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('hairpin_peer_sq', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[16]], 192), ('hairpin_peer_vhca', c.Array[ctypes.c_ubyte, Literal[16]], 208), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[70]], 224), ('shampo_no_match_alignment_granularity', c.Array[ctypes.c_ubyte, Literal[2]], 294), ('reserved_at_128', c.Array[ctypes.c_ubyte, Literal[6]], 296), ('shampo_match_criteria_type', c.Array[ctypes.c_ubyte, Literal[2]], 302), ('reservation_timeout', c.Array[ctypes.c_ubyte, Literal[16]], 304), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[64]], 320), ('wq', struct_mlx5_ifc_wq_bits, 384)]) +_anonenum67: dict[int, str] = {(MLX5_RMPC_STATE_RDY:=1): 'MLX5_RMPC_STATE_RDY', (MLX5_RMPC_STATE_ERR:=3): 'MLX5_RMPC_STATE_ERR'} +@c.record +class struct_mlx5_ifc_rmpc_bits(c.Struct): + SIZE = 1920 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + state: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_c: c.Array[ctypes.c_ubyte, Literal[20]] + basic_cyclic_rcv_wqe: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[320]] + wq: struct_mlx5_ifc_wq_bits +struct_mlx5_ifc_rmpc_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('state', c.Array[ctypes.c_ubyte, Literal[4]], 8), ('reserved_at_c', c.Array[ctypes.c_ubyte, Literal[20]], 12), ('basic_cyclic_rcv_wqe', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[31]], 33), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[320]], 64), ('wq', struct_mlx5_ifc_wq_bits, 384)]) +_anonenum68: dict[int, str] = {(VHCA_ID_TYPE_HW:=0): 'VHCA_ID_TYPE_HW', (VHCA_ID_TYPE_SW:=1): 'VHCA_ID_TYPE_SW'} +@c.record +class struct_mlx5_ifc_nic_vport_context_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[5]] + min_wqe_inline_mode: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[21]] + disable_mc_local_lb: c.Array[ctypes.c_ubyte, Literal[1]] + disable_uc_local_lb: c.Array[ctypes.c_ubyte, Literal[1]] + roce_en: c.Array[ctypes.c_ubyte, Literal[1]] + arm_change_event: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[26]] + event_on_mtu: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_promisc_change: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_vlan_change: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_mc_address_change: c.Array[ctypes.c_ubyte, Literal[1]] + event_on_uc_address_change: c.Array[ctypes.c_ubyte, Literal[1]] + vhca_id_type: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[11]] + affiliation_criteria: c.Array[ctypes.c_ubyte, Literal[4]] + affiliated_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[160]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[1]] + sd_group: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_104: c.Array[ctypes.c_ubyte, Literal[28]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[16]] + mtu: c.Array[ctypes.c_ubyte, Literal[16]] + system_image_guid: c.Array[ctypes.c_ubyte, Literal[64]] + port_guid: c.Array[ctypes.c_ubyte, Literal[64]] + node_guid: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_200: c.Array[ctypes.c_ubyte, Literal[320]] + qkey_violation_counter: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_350: c.Array[ctypes.c_ubyte, Literal[1072]] + promisc_uc: c.Array[ctypes.c_ubyte, Literal[1]] + promisc_mc: c.Array[ctypes.c_ubyte, Literal[1]] + promisc_all: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_783: c.Array[ctypes.c_ubyte, Literal[2]] + allowed_list_type: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_788: c.Array[ctypes.c_ubyte, Literal[12]] + allowed_list_size: c.Array[ctypes.c_ubyte, Literal[12]] + permanent_address: struct_mlx5_ifc_mac_address_layout_bits + reserved_at_7e0: c.Array[ctypes.c_ubyte, Literal[32]] + current_uc_mac_address: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_nic_vport_context_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[5]], 0), ('min_wqe_inline_mode', c.Array[ctypes.c_ubyte, Literal[3]], 5), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[21]], 8), ('disable_mc_local_lb', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('disable_uc_local_lb', c.Array[ctypes.c_ubyte, Literal[1]], 30), ('roce_en', c.Array[ctypes.c_ubyte, Literal[1]], 31), ('arm_change_event', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[26]], 33), ('event_on_mtu', c.Array[ctypes.c_ubyte, Literal[1]], 59), ('event_on_promisc_change', c.Array[ctypes.c_ubyte, Literal[1]], 60), ('event_on_vlan_change', c.Array[ctypes.c_ubyte, Literal[1]], 61), ('event_on_mc_address_change', c.Array[ctypes.c_ubyte, Literal[1]], 62), ('event_on_uc_address_change', c.Array[ctypes.c_ubyte, Literal[1]], 63), ('vhca_id_type', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[11]], 65), ('affiliation_criteria', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('affiliated_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[160]], 96), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[1]], 256), ('sd_group', c.Array[ctypes.c_ubyte, Literal[3]], 257), ('reserved_at_104', c.Array[ctypes.c_ubyte, Literal[28]], 260), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[16]], 288), ('mtu', c.Array[ctypes.c_ubyte, Literal[16]], 304), ('system_image_guid', c.Array[ctypes.c_ubyte, Literal[64]], 320), ('port_guid', c.Array[ctypes.c_ubyte, Literal[64]], 384), ('node_guid', c.Array[ctypes.c_ubyte, Literal[64]], 448), ('reserved_at_200', c.Array[ctypes.c_ubyte, Literal[320]], 512), ('qkey_violation_counter', c.Array[ctypes.c_ubyte, Literal[16]], 832), ('reserved_at_350', c.Array[ctypes.c_ubyte, Literal[1072]], 848), ('promisc_uc', c.Array[ctypes.c_ubyte, Literal[1]], 1920), ('promisc_mc', c.Array[ctypes.c_ubyte, Literal[1]], 1921), ('promisc_all', c.Array[ctypes.c_ubyte, Literal[1]], 1922), ('reserved_at_783', c.Array[ctypes.c_ubyte, Literal[2]], 1923), ('allowed_list_type', c.Array[ctypes.c_ubyte, Literal[3]], 1925), ('reserved_at_788', c.Array[ctypes.c_ubyte, Literal[12]], 1928), ('allowed_list_size', c.Array[ctypes.c_ubyte, Literal[12]], 1940), ('permanent_address', struct_mlx5_ifc_mac_address_layout_bits, 1952), ('reserved_at_7e0', c.Array[ctypes.c_ubyte, Literal[32]], 2016), ('current_uc_mac_address', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2048)]) +_anonenum69: dict[int, str] = {(MLX5_MKC_ACCESS_MODE_PA:=0): 'MLX5_MKC_ACCESS_MODE_PA', (MLX5_MKC_ACCESS_MODE_MTT:=1): 'MLX5_MKC_ACCESS_MODE_MTT', (MLX5_MKC_ACCESS_MODE_KLMS:=2): 'MLX5_MKC_ACCESS_MODE_KLMS', (MLX5_MKC_ACCESS_MODE_KSM:=3): 'MLX5_MKC_ACCESS_MODE_KSM', (MLX5_MKC_ACCESS_MODE_SW_ICM:=4): 'MLX5_MKC_ACCESS_MODE_SW_ICM', (MLX5_MKC_ACCESS_MODE_MEMIC:=5): 'MLX5_MKC_ACCESS_MODE_MEMIC', (MLX5_MKC_ACCESS_MODE_CROSSING:=6): 'MLX5_MKC_ACCESS_MODE_CROSSING'} +_anonenum70: dict[int, str] = {(MLX5_MKC_PCIE_TPH_NO_STEERING_TAG_INDEX:=0): 'MLX5_MKC_PCIE_TPH_NO_STEERING_TAG_INDEX'} +@c.record +class struct_mlx5_ifc_mkc_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[1]] + free: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[1]] + access_mode_4_2: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_6: c.Array[ctypes.c_ubyte, Literal[7]] + relaxed_ordering_write: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_e: c.Array[ctypes.c_ubyte, Literal[1]] + small_fence_on_rdma_read_response: c.Array[ctypes.c_ubyte, Literal[1]] + umr_en: c.Array[ctypes.c_ubyte, Literal[1]] + a: c.Array[ctypes.c_ubyte, Literal[1]] + rw: c.Array[ctypes.c_ubyte, Literal[1]] + rr: c.Array[ctypes.c_ubyte, Literal[1]] + lw: c.Array[ctypes.c_ubyte, Literal[1]] + lr: c.Array[ctypes.c_ubyte, Literal[1]] + access_mode_1_0: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[2]] + ma_translation_mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_1c: c.Array[ctypes.c_ubyte, Literal[4]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + mkey_7_0: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + length64: c.Array[ctypes.c_ubyte, Literal[1]] + bsf_en: c.Array[ctypes.c_ubyte, Literal[1]] + sync_umr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_63: c.Array[ctypes.c_ubyte, Literal[2]] + expected_sigerr_count: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_66: c.Array[ctypes.c_ubyte, Literal[1]] + en_rinval: c.Array[ctypes.c_ubyte, Literal[1]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + start_addr: c.Array[ctypes.c_ubyte, Literal[64]] + len: c.Array[ctypes.c_ubyte, Literal[64]] + bsf_octword_size: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[96]] + crossing_target_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_190: c.Array[ctypes.c_ubyte, Literal[16]] + translations_octword_size: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[25]] + relaxed_ordering_read: c.Array[ctypes.c_ubyte, Literal[1]] + log_page_size: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[5]] + pcie_tph_en: c.Array[ctypes.c_ubyte, Literal[1]] + pcie_tph_ph: c.Array[ctypes.c_ubyte, Literal[2]] + pcie_tph_steering_tag_index: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_1f0: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_mkc_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('free', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('access_mode_4_2', c.Array[ctypes.c_ubyte, Literal[3]], 3), ('reserved_at_6', c.Array[ctypes.c_ubyte, Literal[7]], 6), ('relaxed_ordering_write', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('reserved_at_e', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('small_fence_on_rdma_read_response', c.Array[ctypes.c_ubyte, Literal[1]], 15), ('umr_en', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('a', c.Array[ctypes.c_ubyte, Literal[1]], 17), ('rw', c.Array[ctypes.c_ubyte, Literal[1]], 18), ('rr', c.Array[ctypes.c_ubyte, Literal[1]], 19), ('lw', c.Array[ctypes.c_ubyte, Literal[1]], 20), ('lr', c.Array[ctypes.c_ubyte, Literal[1]], 21), ('access_mode_1_0', c.Array[ctypes.c_ubyte, Literal[2]], 22), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[2]], 24), ('ma_translation_mode', c.Array[ctypes.c_ubyte, Literal[2]], 26), ('reserved_at_1c', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 32), ('mkey_7_0', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('length64', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('bsf_en', c.Array[ctypes.c_ubyte, Literal[1]], 97), ('sync_umr', c.Array[ctypes.c_ubyte, Literal[1]], 98), ('reserved_at_63', c.Array[ctypes.c_ubyte, Literal[2]], 99), ('expected_sigerr_count', c.Array[ctypes.c_ubyte, Literal[1]], 101), ('reserved_at_66', c.Array[ctypes.c_ubyte, Literal[1]], 102), ('en_rinval', c.Array[ctypes.c_ubyte, Literal[1]], 103), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('len', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('bsf_octword_size', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[96]], 288), ('crossing_target_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 384), ('reserved_at_190', c.Array[ctypes.c_ubyte, Literal[16]], 400), ('translations_octword_size', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[25]], 448), ('relaxed_ordering_read', c.Array[ctypes.c_ubyte, Literal[1]], 473), ('log_page_size', c.Array[ctypes.c_ubyte, Literal[6]], 474), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[5]], 480), ('pcie_tph_en', c.Array[ctypes.c_ubyte, Literal[1]], 485), ('pcie_tph_ph', c.Array[ctypes.c_ubyte, Literal[2]], 486), ('pcie_tph_steering_tag_index', c.Array[ctypes.c_ubyte, Literal[8]], 488), ('reserved_at_1f0', c.Array[ctypes.c_ubyte, Literal[16]], 496)]) +@c.record +class struct_mlx5_ifc_pkey_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + pkey: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_pkey_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('pkey', c.Array[ctypes.c_ubyte, Literal[16]], 16)]) +@c.record +class struct_mlx5_ifc_array128_auto_bits(c.Struct): + SIZE = 128 + array128_auto: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] +struct_mlx5_ifc_array128_auto_bits.register_fields([('array128_auto', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 0)]) +@c.record +class struct_mlx5_ifc_hca_vport_context_bits(c.Struct): + SIZE = 4096 + field_select: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[224]] + sm_virt_aware: c.Array[ctypes.c_ubyte, Literal[1]] + has_smi: c.Array[ctypes.c_ubyte, Literal[1]] + has_raw: c.Array[ctypes.c_ubyte, Literal[1]] + grh_required: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_104: c.Array[ctypes.c_ubyte, Literal[4]] + num_port_plane: c.Array[ctypes.c_ubyte, Literal[8]] + port_physical_state: c.Array[ctypes.c_ubyte, Literal[4]] + vport_state_policy: c.Array[ctypes.c_ubyte, Literal[4]] + port_state: c.Array[ctypes.c_ubyte, Literal[4]] + vport_state: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[32]] + system_image_guid: c.Array[ctypes.c_ubyte, Literal[64]] + port_guid: c.Array[ctypes.c_ubyte, Literal[64]] + node_guid: c.Array[ctypes.c_ubyte, Literal[64]] + cap_mask1: c.Array[ctypes.c_ubyte, Literal[32]] + cap_mask1_field_select: c.Array[ctypes.c_ubyte, Literal[32]] + cap_mask2: c.Array[ctypes.c_ubyte, Literal[32]] + cap_mask2_field_select: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[128]] + lid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_310: c.Array[ctypes.c_ubyte, Literal[4]] + init_type_reply: c.Array[ctypes.c_ubyte, Literal[4]] + lmc: c.Array[ctypes.c_ubyte, Literal[3]] + subnet_timeout: c.Array[ctypes.c_ubyte, Literal[5]] + sm_lid: c.Array[ctypes.c_ubyte, Literal[16]] + sm_sl: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_334: c.Array[ctypes.c_ubyte, Literal[12]] + qkey_violation_counter: c.Array[ctypes.c_ubyte, Literal[16]] + pkey_violation_counter: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_360: c.Array[ctypes.c_ubyte, Literal[3232]] +struct_mlx5_ifc_hca_vport_context_bits.register_fields([('field_select', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[224]], 32), ('sm_virt_aware', c.Array[ctypes.c_ubyte, Literal[1]], 256), ('has_smi', c.Array[ctypes.c_ubyte, Literal[1]], 257), ('has_raw', c.Array[ctypes.c_ubyte, Literal[1]], 258), ('grh_required', c.Array[ctypes.c_ubyte, Literal[1]], 259), ('reserved_at_104', c.Array[ctypes.c_ubyte, Literal[4]], 260), ('num_port_plane', c.Array[ctypes.c_ubyte, Literal[8]], 264), ('port_physical_state', c.Array[ctypes.c_ubyte, Literal[4]], 272), ('vport_state_policy', c.Array[ctypes.c_ubyte, Literal[4]], 276), ('port_state', c.Array[ctypes.c_ubyte, Literal[4]], 280), ('vport_state', c.Array[ctypes.c_ubyte, Literal[4]], 284), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('system_image_guid', c.Array[ctypes.c_ubyte, Literal[64]], 320), ('port_guid', c.Array[ctypes.c_ubyte, Literal[64]], 384), ('node_guid', c.Array[ctypes.c_ubyte, Literal[64]], 448), ('cap_mask1', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('cap_mask1_field_select', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('cap_mask2', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('cap_mask2_field_select', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[128]], 640), ('lid', c.Array[ctypes.c_ubyte, Literal[16]], 768), ('reserved_at_310', c.Array[ctypes.c_ubyte, Literal[4]], 784), ('init_type_reply', c.Array[ctypes.c_ubyte, Literal[4]], 788), ('lmc', c.Array[ctypes.c_ubyte, Literal[3]], 792), ('subnet_timeout', c.Array[ctypes.c_ubyte, Literal[5]], 795), ('sm_lid', c.Array[ctypes.c_ubyte, Literal[16]], 800), ('sm_sl', c.Array[ctypes.c_ubyte, Literal[4]], 816), ('reserved_at_334', c.Array[ctypes.c_ubyte, Literal[12]], 820), ('qkey_violation_counter', c.Array[ctypes.c_ubyte, Literal[16]], 832), ('pkey_violation_counter', c.Array[ctypes.c_ubyte, Literal[16]], 848), ('reserved_at_360', c.Array[ctypes.c_ubyte, Literal[3232]], 864)]) +@c.record +class struct_mlx5_ifc_esw_vport_context_bits(c.Struct): + SIZE = 2048 + fdb_to_vport_reg_c: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[2]] + vport_svlan_strip: c.Array[ctypes.c_ubyte, Literal[1]] + vport_cvlan_strip: c.Array[ctypes.c_ubyte, Literal[1]] + vport_svlan_insert: c.Array[ctypes.c_ubyte, Literal[1]] + vport_cvlan_insert: c.Array[ctypes.c_ubyte, Literal[2]] + fdb_to_vport_reg_c_id: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + svlan_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + svlan_pcp: c.Array[ctypes.c_ubyte, Literal[3]] + svlan_id: c.Array[ctypes.c_ubyte, Literal[12]] + cvlan_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + cvlan_pcp: c.Array[ctypes.c_ubyte, Literal[3]] + cvlan_id: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[1824]] + sw_steering_vport_icm_address_rx: c.Array[ctypes.c_ubyte, Literal[64]] + sw_steering_vport_icm_address_tx: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_esw_vport_context_bits.register_fields([('fdb_to_vport_reg_c', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[2]], 1), ('vport_svlan_strip', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('vport_cvlan_strip', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('vport_svlan_insert', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('vport_cvlan_insert', c.Array[ctypes.c_ubyte, Literal[2]], 6), ('fdb_to_vport_reg_c_id', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('svlan_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('svlan_pcp', c.Array[ctypes.c_ubyte, Literal[3]], 65), ('svlan_id', c.Array[ctypes.c_ubyte, Literal[12]], 68), ('cvlan_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 80), ('cvlan_pcp', c.Array[ctypes.c_ubyte, Literal[3]], 81), ('cvlan_id', c.Array[ctypes.c_ubyte, Literal[12]], 84), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[1824]], 96), ('sw_steering_vport_icm_address_rx', c.Array[ctypes.c_ubyte, Literal[64]], 1920), ('sw_steering_vport_icm_address_tx', c.Array[ctypes.c_ubyte, Literal[64]], 1984)]) +_anonenum71: dict[int, str] = {(MLX5_EQC_STATUS_OK:=0): 'MLX5_EQC_STATUS_OK', (MLX5_EQC_STATUS_EQ_WRITE_FAILURE:=10): 'MLX5_EQC_STATUS_EQ_WRITE_FAILURE'} +_anonenum72: dict[int, str] = {(MLX5_EQC_ST_ARMED:=9): 'MLX5_EQC_ST_ARMED', (MLX5_EQC_ST_FIRED:=10): 'MLX5_EQC_ST_FIRED'} +@c.record +class struct_mlx5_ifc_eqc_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[9]] + ec: c.Array[ctypes.c_ubyte, Literal[1]] + oi: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_f: c.Array[ctypes.c_ubyte, Literal[5]] + st: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[20]] + page_offset: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_5a: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[3]] + log_eq_size: c.Array[ctypes.c_ubyte, Literal[5]] + uar_page: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[20]] + intr: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[3]] + log_page_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_c8: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[8]] + consumer_counter: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[8]] + producer_counter: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_eqc_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[9]], 4), ('ec', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('oi', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('reserved_at_f', c.Array[ctypes.c_ubyte, Literal[5]], 15), ('st', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[20]], 64), ('page_offset', c.Array[ctypes.c_ubyte, Literal[6]], 84), ('reserved_at_5a', c.Array[ctypes.c_ubyte, Literal[6]], 90), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[3]], 96), ('log_eq_size', c.Array[ctypes.c_ubyte, Literal[5]], 99), ('uar_page', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[20]], 160), ('intr', c.Array[ctypes.c_ubyte, Literal[12]], 180), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[3]], 192), ('log_page_size', c.Array[ctypes.c_ubyte, Literal[5]], 195), ('reserved_at_c8', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[96]], 224), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[8]], 320), ('consumer_counter', c.Array[ctypes.c_ubyte, Literal[24]], 328), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[8]], 352), ('producer_counter', c.Array[ctypes.c_ubyte, Literal[24]], 360), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[128]], 384)]) +_anonenum73: dict[int, str] = {(MLX5_DCTC_STATE_ACTIVE:=0): 'MLX5_DCTC_STATE_ACTIVE', (MLX5_DCTC_STATE_DRAINING:=1): 'MLX5_DCTC_STATE_DRAINING', (MLX5_DCTC_STATE_DRAINED:=2): 'MLX5_DCTC_STATE_DRAINED'} +_anonenum74: dict[int, str] = {(MLX5_DCTC_CS_RES_DISABLE:=0): 'MLX5_DCTC_CS_RES_DISABLE', (MLX5_DCTC_CS_RES_NA:=1): 'MLX5_DCTC_CS_RES_NA', (MLX5_DCTC_CS_RES_UP_TO_64B:=2): 'MLX5_DCTC_CS_RES_UP_TO_64B'} +_anonenum75: dict[int, str] = {(MLX5_DCTC_MTU_256_BYTES:=1): 'MLX5_DCTC_MTU_256_BYTES', (MLX5_DCTC_MTU_512_BYTES:=2): 'MLX5_DCTC_MTU_512_BYTES', (MLX5_DCTC_MTU_1K_BYTES:=3): 'MLX5_DCTC_MTU_1K_BYTES', (MLX5_DCTC_MTU_2K_BYTES:=4): 'MLX5_DCTC_MTU_2K_BYTES', (MLX5_DCTC_MTU_4K_BYTES:=5): 'MLX5_DCTC_MTU_4K_BYTES'} +@c.record +class struct_mlx5_ifc_dctc_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + state: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[7]] + dp_ordering_force: c.Array[ctypes.c_ubyte, Literal[1]] + user_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + counter_set_id: c.Array[ctypes.c_ubyte, Literal[8]] + atomic_mode: c.Array[ctypes.c_ubyte, Literal[4]] + rre: c.Array[ctypes.c_ubyte, Literal[1]] + rwe: c.Array[ctypes.c_ubyte, Literal[1]] + rae: c.Array[ctypes.c_ubyte, Literal[1]] + atomic_like_write_en: c.Array[ctypes.c_ubyte, Literal[1]] + latency_sensitive: c.Array[ctypes.c_ubyte, Literal[1]] + rlky: c.Array[ctypes.c_ubyte, Literal[1]] + free_ar: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_73: c.Array[ctypes.c_ubyte, Literal[1]] + dp_ordering_1: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_75: c.Array[ctypes.c_ubyte, Literal[11]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + cs_res: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_90: c.Array[ctypes.c_ubyte, Literal[3]] + min_rnr_nak: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_98: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + srqn_xrqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + tclass: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_e8: c.Array[ctypes.c_ubyte, Literal[4]] + flow_label: c.Array[ctypes.c_ubyte, Literal[20]] + dc_access_key: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[5]] + mtu: c.Array[ctypes.c_ubyte, Literal[3]] + port: c.Array[ctypes.c_ubyte, Literal[8]] + pkey_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[8]] + my_addr_index: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_170: c.Array[ctypes.c_ubyte, Literal[8]] + hop_limit: c.Array[ctypes.c_ubyte, Literal[8]] + dc_access_key_violation_count: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1a0: c.Array[ctypes.c_ubyte, Literal[20]] + dei_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + eth_prio: c.Array[ctypes.c_ubyte, Literal[3]] + ecn: c.Array[ctypes.c_ubyte, Literal[2]] + dscp: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dctc_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('state', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[7]], 32), ('dp_ordering_force', c.Array[ctypes.c_ubyte, Literal[1]], 39), ('user_index', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('counter_set_id', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('atomic_mode', c.Array[ctypes.c_ubyte, Literal[4]], 104), ('rre', c.Array[ctypes.c_ubyte, Literal[1]], 108), ('rwe', c.Array[ctypes.c_ubyte, Literal[1]], 109), ('rae', c.Array[ctypes.c_ubyte, Literal[1]], 110), ('atomic_like_write_en', c.Array[ctypes.c_ubyte, Literal[1]], 111), ('latency_sensitive', c.Array[ctypes.c_ubyte, Literal[1]], 112), ('rlky', c.Array[ctypes.c_ubyte, Literal[1]], 113), ('free_ar', c.Array[ctypes.c_ubyte, Literal[1]], 114), ('reserved_at_73', c.Array[ctypes.c_ubyte, Literal[1]], 115), ('dp_ordering_1', c.Array[ctypes.c_ubyte, Literal[1]], 116), ('reserved_at_75', c.Array[ctypes.c_ubyte, Literal[11]], 117), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('cs_res', c.Array[ctypes.c_ubyte, Literal[8]], 136), ('reserved_at_90', c.Array[ctypes.c_ubyte, Literal[3]], 144), ('min_rnr_nak', c.Array[ctypes.c_ubyte, Literal[5]], 147), ('reserved_at_98', c.Array[ctypes.c_ubyte, Literal[8]], 152), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('srqn_xrqn', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('tclass', c.Array[ctypes.c_ubyte, Literal[8]], 224), ('reserved_at_e8', c.Array[ctypes.c_ubyte, Literal[4]], 232), ('flow_label', c.Array[ctypes.c_ubyte, Literal[20]], 236), ('dc_access_key', c.Array[ctypes.c_ubyte, Literal[64]], 256), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[5]], 320), ('mtu', c.Array[ctypes.c_ubyte, Literal[3]], 325), ('port', c.Array[ctypes.c_ubyte, Literal[8]], 328), ('pkey_index', c.Array[ctypes.c_ubyte, Literal[16]], 336), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[8]], 352), ('my_addr_index', c.Array[ctypes.c_ubyte, Literal[8]], 360), ('reserved_at_170', c.Array[ctypes.c_ubyte, Literal[8]], 368), ('hop_limit', c.Array[ctypes.c_ubyte, Literal[8]], 376), ('dc_access_key_violation_count', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('reserved_at_1a0', c.Array[ctypes.c_ubyte, Literal[20]], 416), ('dei_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 436), ('eth_prio', c.Array[ctypes.c_ubyte, Literal[3]], 437), ('ecn', c.Array[ctypes.c_ubyte, Literal[2]], 440), ('dscp', c.Array[ctypes.c_ubyte, Literal[6]], 442), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 480)]) +_anonenum76: dict[int, str] = {(MLX5_CQC_STATUS_OK:=0): 'MLX5_CQC_STATUS_OK', (MLX5_CQC_STATUS_CQ_OVERFLOW:=9): 'MLX5_CQC_STATUS_CQ_OVERFLOW', (MLX5_CQC_STATUS_CQ_WRITE_FAIL:=10): 'MLX5_CQC_STATUS_CQ_WRITE_FAIL'} +_anonenum77: dict[int, str] = {(MLX5_CQC_CQE_SZ_64_BYTES:=0): 'MLX5_CQC_CQE_SZ_64_BYTES', (MLX5_CQC_CQE_SZ_128_BYTES:=1): 'MLX5_CQC_CQE_SZ_128_BYTES'} +_anonenum78: dict[int, str] = {(MLX5_CQC_ST_SOLICITED_NOTIFICATION_REQUEST_ARMED:=6): 'MLX5_CQC_ST_SOLICITED_NOTIFICATION_REQUEST_ARMED', (MLX5_CQC_ST_NOTIFICATION_REQUEST_ARMED:=9): 'MLX5_CQC_ST_NOTIFICATION_REQUEST_ARMED', (MLX5_CQC_ST_FIRED:=10): 'MLX5_CQC_ST_FIRED'} +enum_mlx5_cq_period_mode: dict[int, str] = {(MLX5_CQ_PERIOD_MODE_START_FROM_EQE:=0): 'MLX5_CQ_PERIOD_MODE_START_FROM_EQE', (MLX5_CQ_PERIOD_MODE_START_FROM_CQE:=1): 'MLX5_CQ_PERIOD_MODE_START_FROM_CQE', (MLX5_CQ_PERIOD_NUM_MODES:=2): 'MLX5_CQ_PERIOD_NUM_MODES'} +@c.record +class struct_mlx5_ifc_cqc_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[2]] + dbr_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + apu_cq: c.Array[ctypes.c_ubyte, Literal[1]] + cqe_sz: c.Array[ctypes.c_ubyte, Literal[3]] + cc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_c: c.Array[ctypes.c_ubyte, Literal[1]] + scqe_break_moderation_en: c.Array[ctypes.c_ubyte, Literal[1]] + oi: c.Array[ctypes.c_ubyte, Literal[1]] + cq_period_mode: c.Array[ctypes.c_ubyte, Literal[2]] + cqe_comp_en: c.Array[ctypes.c_ubyte, Literal[1]] + mini_cqe_res_format: c.Array[ctypes.c_ubyte, Literal[2]] + st: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[6]] + cqe_compression_layout: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[20]] + page_offset: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_5a: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[3]] + log_cq_size: c.Array[ctypes.c_ubyte, Literal[5]] + uar_page: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[4]] + cq_period: c.Array[ctypes.c_ubyte, Literal[12]] + cq_max_count: c.Array[ctypes.c_ubyte, Literal[16]] + c_eqn_or_apu_element: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[3]] + log_page_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_c8: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[8]] + last_notified_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[8]] + last_solicit_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[8]] + consumer_counter: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[8]] + producer_counter: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[64]] + dbr_addr: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_cqc_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[2]], 4), ('dbr_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('apu_cq', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('cqe_sz', c.Array[ctypes.c_ubyte, Literal[3]], 8), ('cc', c.Array[ctypes.c_ubyte, Literal[1]], 11), ('reserved_at_c', c.Array[ctypes.c_ubyte, Literal[1]], 12), ('scqe_break_moderation_en', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('oi', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('cq_period_mode', c.Array[ctypes.c_ubyte, Literal[2]], 15), ('cqe_comp_en', c.Array[ctypes.c_ubyte, Literal[1]], 17), ('mini_cqe_res_format', c.Array[ctypes.c_ubyte, Literal[2]], 18), ('st', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[6]], 24), ('cqe_compression_layout', c.Array[ctypes.c_ubyte, Literal[2]], 30), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[20]], 64), ('page_offset', c.Array[ctypes.c_ubyte, Literal[6]], 84), ('reserved_at_5a', c.Array[ctypes.c_ubyte, Literal[6]], 90), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[3]], 96), ('log_cq_size', c.Array[ctypes.c_ubyte, Literal[5]], 99), ('uar_page', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[4]], 128), ('cq_period', c.Array[ctypes.c_ubyte, Literal[12]], 132), ('cq_max_count', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('c_eqn_or_apu_element', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[3]], 192), ('log_page_size', c.Array[ctypes.c_ubyte, Literal[5]], 195), ('reserved_at_c8', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('last_notified_index', c.Array[ctypes.c_ubyte, Literal[24]], 264), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[8]], 288), ('last_solicit_index', c.Array[ctypes.c_ubyte, Literal[24]], 296), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[8]], 320), ('consumer_counter', c.Array[ctypes.c_ubyte, Literal[24]], 328), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[8]], 352), ('producer_counter', c.Array[ctypes.c_ubyte, Literal[24]], 360), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[64]], 384), ('dbr_addr', c.Array[ctypes.c_ubyte, Literal[64]], 448)]) +@c.record +class union_mlx5_ifc_cong_control_roce_ecn_auto_bits(c.Struct): + SIZE = 2048 + cong_control_802_1qau_rp: struct_mlx5_ifc_cong_control_802_1qau_rp_bits + cong_control_r_roce_ecn_rp: struct_mlx5_ifc_cong_control_r_roce_ecn_rp_bits + cong_control_r_roce_ecn_np: struct_mlx5_ifc_cong_control_r_roce_ecn_np_bits + cong_control_r_roce_general: struct_mlx5_ifc_cong_control_r_roce_general_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[2048]] +union_mlx5_ifc_cong_control_roce_ecn_auto_bits.register_fields([('cong_control_802_1qau_rp', struct_mlx5_ifc_cong_control_802_1qau_rp_bits, 0), ('cong_control_r_roce_ecn_rp', struct_mlx5_ifc_cong_control_r_roce_ecn_rp_bits, 0), ('cong_control_r_roce_ecn_np', struct_mlx5_ifc_cong_control_r_roce_ecn_np_bits, 0), ('cong_control_r_roce_general', struct_mlx5_ifc_cong_control_r_roce_general_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[2048]], 0)]) +@c.record +class struct_mlx5_ifc_query_adapter_param_block_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[192]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + ieee_vendor_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[16]] + vsd_vendor_id: c.Array[ctypes.c_ubyte, Literal[16]] + vsd: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[208]] + vsd_contd_psid: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] +struct_mlx5_ifc_query_adapter_param_block_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[192]], 0), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('ieee_vendor_id', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('vsd_vendor_id', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('vsd', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[208]], 256), ('vsd_contd_psid', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 1920)]) +_anonenum79: dict[int, str] = {(MLX5_XRQC_STATE_GOOD:=0): 'MLX5_XRQC_STATE_GOOD', (MLX5_XRQC_STATE_ERROR:=1): 'MLX5_XRQC_STATE_ERROR'} +_anonenum80: dict[int, str] = {(MLX5_XRQC_TOPOLOGY_NO_SPECIAL_TOPOLOGY:=0): 'MLX5_XRQC_TOPOLOGY_NO_SPECIAL_TOPOLOGY', (MLX5_XRQC_TOPOLOGY_TAG_MATCHING:=1): 'MLX5_XRQC_TOPOLOGY_TAG_MATCHING'} +_anonenum81: dict[int, str] = {(MLX5_XRQC_OFFLOAD_RNDV:=1): 'MLX5_XRQC_OFFLOAD_RNDV'} +@c.record +class struct_mlx5_ifc_tag_matching_topology_context_bits(c.Struct): + SIZE = 128 + log_matching_list_sz: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[12]] + append_next_index: c.Array[ctypes.c_ubyte, Literal[16]] + sw_phase_cnt: c.Array[ctypes.c_ubyte, Literal[16]] + hw_phase_cnt: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_tag_matching_topology_context_bits.register_fields([('log_matching_list_sz', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[12]], 4), ('append_next_index', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('sw_phase_cnt', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('hw_phase_cnt', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_xrqc_bits(c.Struct): + SIZE = 2560 + state: c.Array[ctypes.c_ubyte, Literal[4]] + rlkey: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5: c.Array[ctypes.c_ubyte, Literal[15]] + topology: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[4]] + offload: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + user_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[160]] + tag_matching_topology_context: struct_mlx5_ifc_tag_matching_topology_context_bits + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[640]] + wq: struct_mlx5_ifc_wq_bits +struct_mlx5_ifc_xrqc_bits.register_fields([('state', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('rlkey', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('reserved_at_5', c.Array[ctypes.c_ubyte, Literal[15]], 5), ('topology', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[4]], 24), ('offload', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('user_index', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[160]], 96), ('tag_matching_topology_context', struct_mlx5_ifc_tag_matching_topology_context_bits, 256), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[640]], 384), ('wq', struct_mlx5_ifc_wq_bits, 1024)]) +@c.record +class union_mlx5_ifc_modify_field_select_resize_field_select_auto_bits(c.Struct): + SIZE = 32 + modify_field_select: struct_mlx5_ifc_modify_field_select_bits + resize_field_select: struct_mlx5_ifc_resize_field_select_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] +union_mlx5_ifc_modify_field_select_resize_field_select_auto_bits.register_fields([('modify_field_select', struct_mlx5_ifc_modify_field_select_bits, 0), ('resize_field_select', struct_mlx5_ifc_resize_field_select_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +@c.record +class union_mlx5_ifc_field_select_802_1_r_roce_auto_bits(c.Struct): + SIZE = 32 + field_select_802_1qau_rp: struct_mlx5_ifc_field_select_802_1qau_rp_bits + field_select_r_roce_rp: struct_mlx5_ifc_field_select_r_roce_rp_bits + field_select_r_roce_np: struct_mlx5_ifc_field_select_r_roce_np_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] +union_mlx5_ifc_field_select_802_1_r_roce_auto_bits.register_fields([('field_select_802_1qau_rp', struct_mlx5_ifc_field_select_802_1qau_rp_bits, 0), ('field_select_r_roce_rp', struct_mlx5_ifc_field_select_r_roce_rp_bits, 0), ('field_select_r_roce_np', struct_mlx5_ifc_field_select_r_roce_np_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_rs_histogram_cntrs_bits(c.Struct): + SIZE = 1728 + hist: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[16]] + reserved_at_400: c.Array[ctypes.c_ubyte, Literal[704]] +struct_mlx5_ifc_rs_histogram_cntrs_bits.register_fields([('hist', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[16]], 0), ('reserved_at_400', c.Array[ctypes.c_ubyte, Literal[704]], 1024)]) +@c.record +class union_mlx5_ifc_eth_cntrs_grp_data_layout_auto_bits(c.Struct): + SIZE = 1984 + eth_802_3_cntrs_grp_data_layout: struct_mlx5_ifc_eth_802_3_cntrs_grp_data_layout_bits + eth_2863_cntrs_grp_data_layout: struct_mlx5_ifc_eth_2863_cntrs_grp_data_layout_bits + eth_2819_cntrs_grp_data_layout: struct_mlx5_ifc_eth_2819_cntrs_grp_data_layout_bits + eth_3635_cntrs_grp_data_layout: struct_mlx5_ifc_eth_3635_cntrs_grp_data_layout_bits + eth_extended_cntrs_grp_data_layout: struct_mlx5_ifc_eth_extended_cntrs_grp_data_layout_bits + eth_per_prio_grp_data_layout: struct_mlx5_ifc_eth_per_prio_grp_data_layout_bits + eth_per_tc_prio_grp_data_layout: struct_mlx5_ifc_eth_per_tc_prio_grp_data_layout_bits + eth_per_tc_congest_prio_grp_data_layout: struct_mlx5_ifc_eth_per_tc_congest_prio_grp_data_layout_bits + ib_port_cntrs_grp_data_layout: struct_mlx5_ifc_ib_port_cntrs_grp_data_layout_bits + ib_ext_port_cntrs_grp_data_layout: struct_mlx5_ifc_ib_ext_port_cntrs_grp_data_layout_bits + phys_layer_cntrs: struct_mlx5_ifc_phys_layer_cntrs_bits + phys_layer_statistical_cntrs: struct_mlx5_ifc_phys_layer_statistical_cntrs_bits + phys_layer_recovery_cntrs: struct_mlx5_ifc_phys_layer_recovery_cntrs_bits + rs_histogram_cntrs: struct_mlx5_ifc_rs_histogram_cntrs_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[1984]] +union_mlx5_ifc_eth_cntrs_grp_data_layout_auto_bits.register_fields([('eth_802_3_cntrs_grp_data_layout', struct_mlx5_ifc_eth_802_3_cntrs_grp_data_layout_bits, 0), ('eth_2863_cntrs_grp_data_layout', struct_mlx5_ifc_eth_2863_cntrs_grp_data_layout_bits, 0), ('eth_2819_cntrs_grp_data_layout', struct_mlx5_ifc_eth_2819_cntrs_grp_data_layout_bits, 0), ('eth_3635_cntrs_grp_data_layout', struct_mlx5_ifc_eth_3635_cntrs_grp_data_layout_bits, 0), ('eth_extended_cntrs_grp_data_layout', struct_mlx5_ifc_eth_extended_cntrs_grp_data_layout_bits, 0), ('eth_per_prio_grp_data_layout', struct_mlx5_ifc_eth_per_prio_grp_data_layout_bits, 0), ('eth_per_tc_prio_grp_data_layout', struct_mlx5_ifc_eth_per_tc_prio_grp_data_layout_bits, 0), ('eth_per_tc_congest_prio_grp_data_layout', struct_mlx5_ifc_eth_per_tc_congest_prio_grp_data_layout_bits, 0), ('ib_port_cntrs_grp_data_layout', struct_mlx5_ifc_ib_port_cntrs_grp_data_layout_bits, 0), ('ib_ext_port_cntrs_grp_data_layout', struct_mlx5_ifc_ib_ext_port_cntrs_grp_data_layout_bits, 0), ('phys_layer_cntrs', struct_mlx5_ifc_phys_layer_cntrs_bits, 0), ('phys_layer_statistical_cntrs', struct_mlx5_ifc_phys_layer_statistical_cntrs_bits, 0), ('phys_layer_recovery_cntrs', struct_mlx5_ifc_phys_layer_recovery_cntrs_bits, 0), ('rs_histogram_cntrs', struct_mlx5_ifc_rs_histogram_cntrs_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[1984]], 0)]) +@c.record +class union_mlx5_ifc_pcie_cntrs_grp_data_layout_auto_bits(c.Struct): + SIZE = 1984 + pcie_perf_cntrs_grp_data_layout: struct_mlx5_ifc_pcie_perf_cntrs_grp_data_layout_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[1984]] +union_mlx5_ifc_pcie_cntrs_grp_data_layout_auto_bits.register_fields([('pcie_perf_cntrs_grp_data_layout', struct_mlx5_ifc_pcie_perf_cntrs_grp_data_layout_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[1984]], 0)]) +@c.record +class union_mlx5_ifc_event_auto_bits(c.Struct): + SIZE = 224 + comp_event: struct_mlx5_ifc_comp_event_bits + dct_events: struct_mlx5_ifc_dct_events_bits + qp_events: struct_mlx5_ifc_qp_events_bits + wqe_associated_page_fault_event: struct_mlx5_ifc_wqe_associated_page_fault_event_bits + rdma_page_fault_event: struct_mlx5_ifc_rdma_page_fault_event_bits + cq_error: struct_mlx5_ifc_cq_error_bits + dropped_packet_logged: struct_mlx5_ifc_dropped_packet_logged_bits + port_state_change_event: struct_mlx5_ifc_port_state_change_event_bits + gpio_event: struct_mlx5_ifc_gpio_event_bits + db_bf_congestion_event: struct_mlx5_ifc_db_bf_congestion_event_bits + stall_vl_event: struct_mlx5_ifc_stall_vl_event_bits + cmd_inter_comp_event: struct_mlx5_ifc_cmd_inter_comp_event_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[224]] +union_mlx5_ifc_event_auto_bits.register_fields([('comp_event', struct_mlx5_ifc_comp_event_bits, 0), ('dct_events', struct_mlx5_ifc_dct_events_bits, 0), ('qp_events', struct_mlx5_ifc_qp_events_bits, 0), ('wqe_associated_page_fault_event', struct_mlx5_ifc_wqe_associated_page_fault_event_bits, 0), ('rdma_page_fault_event', struct_mlx5_ifc_rdma_page_fault_event_bits, 0), ('cq_error', struct_mlx5_ifc_cq_error_bits, 0), ('dropped_packet_logged', struct_mlx5_ifc_dropped_packet_logged_bits, 0), ('port_state_change_event', struct_mlx5_ifc_port_state_change_event_bits, 0), ('gpio_event', struct_mlx5_ifc_gpio_event_bits, 0), ('db_bf_congestion_event', struct_mlx5_ifc_db_bf_congestion_event_bits, 0), ('stall_vl_event', struct_mlx5_ifc_stall_vl_event_bits, 0), ('cmd_inter_comp_event', struct_mlx5_ifc_cmd_inter_comp_event_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[224]], 0)]) +@c.record +class struct_mlx5_ifc_health_buffer_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[256]] + assert_existptr: c.Array[ctypes.c_ubyte, Literal[32]] + assert_callra: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[32]] + time: c.Array[ctypes.c_ubyte, Literal[32]] + fw_version: c.Array[ctypes.c_ubyte, Literal[32]] + hw_id: c.Array[ctypes.c_ubyte, Literal[32]] + rfr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1c1: c.Array[ctypes.c_ubyte, Literal[3]] + valid: c.Array[ctypes.c_ubyte, Literal[1]] + severity: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_1c8: c.Array[ctypes.c_ubyte, Literal[24]] + irisc_index: c.Array[ctypes.c_ubyte, Literal[8]] + synd: c.Array[ctypes.c_ubyte, Literal[8]] + ext_synd: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_health_buffer_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[256]], 0), ('assert_existptr', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('assert_callra', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('time', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('fw_version', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('hw_id', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('rfr', c.Array[ctypes.c_ubyte, Literal[1]], 448), ('reserved_at_1c1', c.Array[ctypes.c_ubyte, Literal[3]], 449), ('valid', c.Array[ctypes.c_ubyte, Literal[1]], 452), ('severity', c.Array[ctypes.c_ubyte, Literal[3]], 453), ('reserved_at_1c8', c.Array[ctypes.c_ubyte, Literal[24]], 456), ('irisc_index', c.Array[ctypes.c_ubyte, Literal[8]], 480), ('synd', c.Array[ctypes.c_ubyte, Literal[8]], 488), ('ext_synd', c.Array[ctypes.c_ubyte, Literal[16]], 496)]) +@c.record +class struct_mlx5_ifc_register_loopback_control_bits(c.Struct): + SIZE = 128 + no_lb: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[7]] + port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_register_loopback_control_bits.register_fields([('no_lb', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[7]], 1), ('port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32)]) +_anonenum82: dict[int, str] = {(MLX5_TEARDOWN_HCA_OUT_FORCE_STATE_SUCCESS:=0): 'MLX5_TEARDOWN_HCA_OUT_FORCE_STATE_SUCCESS', (MLX5_TEARDOWN_HCA_OUT_FORCE_STATE_FAIL:=1): 'MLX5_TEARDOWN_HCA_OUT_FORCE_STATE_FAIL'} +@c.record +class struct_mlx5_ifc_teardown_hca_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[63]] + state: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_teardown_hca_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[63]], 64), ('state', c.Array[ctypes.c_ubyte, Literal[1]], 127)]) +_anonenum83: dict[int, str] = {(MLX5_TEARDOWN_HCA_IN_PROFILE_GRACEFUL_CLOSE:=0): 'MLX5_TEARDOWN_HCA_IN_PROFILE_GRACEFUL_CLOSE', (MLX5_TEARDOWN_HCA_IN_PROFILE_FORCE_CLOSE:=1): 'MLX5_TEARDOWN_HCA_IN_PROFILE_FORCE_CLOSE', (MLX5_TEARDOWN_HCA_IN_PROFILE_PREPARE_FAST_TEARDOWN:=2): 'MLX5_TEARDOWN_HCA_IN_PROFILE_PREPARE_FAST_TEARDOWN'} +@c.record +class struct_mlx5_ifc_teardown_hca_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + profile: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_teardown_hca_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('profile', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_sqerr2rts_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_sqerr2rts_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_sqerr2rts_qp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_sqerr2rts_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[128]], 2048)]) +@c.record +class struct_mlx5_ifc_sqd2rts_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_sqd2rts_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_sqd2rts_qp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_sqd2rts_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[128]], 2048)]) +@c.record +class struct_mlx5_ifc_set_roce_address_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_roce_address_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_roce_address_in_bits(c.Struct): + SIZE = 384 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + roce_address_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[12]] + vhca_port_num: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + roce_address: struct_mlx5_ifc_roce_addr_layout_bits +struct_mlx5_ifc_set_roce_address_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('roce_address_index', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[12]], 80), ('vhca_port_num', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('roce_address', struct_mlx5_ifc_roce_addr_layout_bits, 128)]) +@c.record +class struct_mlx5_ifc_set_mad_demux_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_mad_demux_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +_anonenum84: dict[int, str] = {(MLX5_SET_MAD_DEMUX_IN_DEMUX_MODE_PASS_ALL:=0): 'MLX5_SET_MAD_DEMUX_IN_DEMUX_MODE_PASS_ALL', (MLX5_SET_MAD_DEMUX_IN_DEMUX_MODE_SELECTIVE:=2): 'MLX5_SET_MAD_DEMUX_IN_DEMUX_MODE_SELECTIVE'} +@c.record +class struct_mlx5_ifc_set_mad_demux_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[6]] + demux_mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_set_mad_demux_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[6]], 96), ('demux_mode', c.Array[ctypes.c_ubyte, Literal[2]], 102), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[24]], 104)]) +@c.record +class struct_mlx5_ifc_set_l2_table_entry_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_l2_table_entry_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_l2_table_entry_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[16]] + silent_mode_valid: c.Array[ctypes.c_ubyte, Literal[1]] + silent_mode: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_f2: c.Array[ctypes.c_ubyte, Literal[1]] + vlan_valid: c.Array[ctypes.c_ubyte, Literal[1]] + vlan: c.Array[ctypes.c_ubyte, Literal[12]] + mac_address: struct_mlx5_ifc_mac_address_layout_bits + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[192]] +struct_mlx5_ifc_set_l2_table_entry_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[96]], 64), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_index', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('silent_mode_valid', c.Array[ctypes.c_ubyte, Literal[1]], 240), ('silent_mode', c.Array[ctypes.c_ubyte, Literal[1]], 241), ('reserved_at_f2', c.Array[ctypes.c_ubyte, Literal[1]], 242), ('vlan_valid', c.Array[ctypes.c_ubyte, Literal[1]], 243), ('vlan', c.Array[ctypes.c_ubyte, Literal[12]], 244), ('mac_address', struct_mlx5_ifc_mac_address_layout_bits, 256), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[192]], 320)]) +@c.record +class struct_mlx5_ifc_set_issi_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_issi_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_issi_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + current_issi: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_set_issi_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('current_issi', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_set_hca_cap_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_hca_cap_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_hca_cap_in_bits(c.Struct): + SIZE = 32896 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_function: c.Array[ctypes.c_ubyte, Literal[1]] + ec_vf_function: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[1]] + function_id_type: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[12]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + capability: union_mlx5_ifc_hca_cap_union_bits +struct_mlx5_ifc_set_hca_cap_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_function', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('ec_vf_function', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[1]], 66), ('function_id_type', c.Array[ctypes.c_ubyte, Literal[1]], 67), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[12]], 68), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('capability', union_mlx5_ifc_hca_cap_union_bits, 128)]) +_anonenum85: dict[int, str] = {(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION:=0): 'MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION', (MLX5_SET_FTE_MODIFY_ENABLE_MASK_FLOW_TAG:=1): 'MLX5_SET_FTE_MODIFY_ENABLE_MASK_FLOW_TAG', (MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST:=2): 'MLX5_SET_FTE_MODIFY_ENABLE_MASK_DESTINATION_LIST', (MLX5_SET_FTE_MODIFY_ENABLE_MASK_FLOW_COUNTERS:=3): 'MLX5_SET_FTE_MODIFY_ENABLE_MASK_FLOW_COUNTERS', (MLX5_SET_FTE_MODIFY_ENABLE_MASK_IPSEC_OBJ_ID:=4): 'MLX5_SET_FTE_MODIFY_ENABLE_MASK_IPSEC_OBJ_ID'} +@c.record +class struct_mlx5_ifc_set_fte_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_fte_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_fte_in_bits(c.Struct): + SIZE = 6656 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + ignore_flow_level: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_c1: c.Array[ctypes.c_ubyte, Literal[23]] + modify_enable_mask: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] + flow_index: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[224]] + flow_context: struct_mlx5_ifc_flow_context_bits +struct_mlx5_ifc_set_fte_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('ignore_flow_level', c.Array[ctypes.c_ubyte, Literal[1]], 192), ('reserved_at_c1', c.Array[ctypes.c_ubyte, Literal[23]], 193), ('modify_enable_mask', c.Array[ctypes.c_ubyte, Literal[8]], 216), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('flow_index', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[224]], 288), ('flow_context', struct_mlx5_ifc_flow_context_bits, 512)]) +@c.record +class struct_mlx5_ifc_dest_format_bits(c.Struct): + SIZE = 64 + destination_type: c.Array[ctypes.c_ubyte, Literal[8]] + destination_id: c.Array[ctypes.c_ubyte, Literal[24]] + destination_eswitch_owner_vhca_id_valid: c.Array[ctypes.c_ubyte, Literal[1]] + packet_reformat: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[14]] + destination_eswitch_owner_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_dest_format_bits.register_fields([('destination_type', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('destination_id', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('destination_eswitch_owner_vhca_id_valid', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('packet_reformat', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[14]], 34), ('destination_eswitch_owner_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 48)]) +@c.record +class struct_mlx5_ifc_rts2rts_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_rts2rts_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_rts2rts_qp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_rts2rts_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[128]], 2048)]) +@c.record +class struct_mlx5_ifc_rtr2rts_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_rtr2rts_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_rtr2rts_qp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_rtr2rts_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[128]], 2048)]) +@c.record +class struct_mlx5_ifc_rst2init_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_rst2init_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_rst2init_qp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_rst2init_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[128]], 2048)]) +@c.record +class struct_mlx5_ifc_query_xrq_out_bits(c.Struct): + SIZE = 2688 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + xrq_context: struct_mlx5_ifc_xrqc_bits +struct_mlx5_ifc_query_xrq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('xrq_context', struct_mlx5_ifc_xrqc_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_xrq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_xrq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_xrc_srq_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + xrc_srq_context_entry: struct_mlx5_ifc_xrc_srqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[1536]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_query_xrc_srq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('xrc_srq_context_entry', struct_mlx5_ifc_xrc_srqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[1536]], 640), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_query_xrc_srq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrc_srqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_xrc_srq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrc_srqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +_anonenum86: dict[int, str] = {(MLX5_QUERY_VPORT_STATE_OUT_STATE_DOWN:=0): 'MLX5_QUERY_VPORT_STATE_OUT_STATE_DOWN', (MLX5_QUERY_VPORT_STATE_OUT_STATE_UP:=1): 'MLX5_QUERY_VPORT_STATE_OUT_STATE_UP'} +@c.record +class struct_mlx5_ifc_query_vport_state_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[24]] + admin_state: c.Array[ctypes.c_ubyte, Literal[4]] + state: c.Array[ctypes.c_ubyte, Literal[4]] +struct_mlx5_ifc_query_vport_state_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[24]], 96), ('admin_state', c.Array[ctypes.c_ubyte, Literal[4]], 120), ('state', c.Array[ctypes.c_ubyte, Literal[4]], 124)]) +@c.record +class struct_mlx5_ifc_array1024_auto_bits(c.Struct): + SIZE = 1024 + array1024_auto: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[32]] +struct_mlx5_ifc_array1024_auto_bits.register_fields([('array1024_auto', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_query_vuid_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[64]] + query_vfs_vuid: c.Array[ctypes.c_ubyte, Literal[1]] + data_direct: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_62: c.Array[ctypes.c_ubyte, Literal[14]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_query_vuid_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[64]], 32), ('query_vfs_vuid', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('data_direct', c.Array[ctypes.c_ubyte, Literal[1]], 97), ('reserved_at_62', c.Array[ctypes.c_ubyte, Literal[14]], 98), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_query_vuid_out_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[416]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_entries: c.Array[ctypes.c_ubyte, Literal[16]] + vuid: c.Array[struct_mlx5_ifc_array1024_auto_bits, Literal[0]] +struct_mlx5_ifc_query_vuid_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[416]], 64), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[16]], 480), ('num_of_entries', c.Array[ctypes.c_ubyte, Literal[16]], 496), ('vuid', c.Array[struct_mlx5_ifc_array1024_auto_bits, Literal[0]], 512)]) +_anonenum87: dict[int, str] = {(MLX5_VPORT_STATE_OP_MOD_VNIC_VPORT:=0): 'MLX5_VPORT_STATE_OP_MOD_VNIC_VPORT', (MLX5_VPORT_STATE_OP_MOD_ESW_VPORT:=1): 'MLX5_VPORT_STATE_OP_MOD_ESW_VPORT', (MLX5_VPORT_STATE_OP_MOD_UPLINK:=2): 'MLX5_VPORT_STATE_OP_MOD_UPLINK'} +@c.record +class struct_mlx5_ifc_arm_monitor_counter_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_arm_monitor_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_arm_monitor_counter_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_arm_monitor_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +_anonenum88: dict[int, str] = {(MLX5_QUERY_MONITOR_CNT_TYPE_PPCNT:=0): 'MLX5_QUERY_MONITOR_CNT_TYPE_PPCNT', (MLX5_QUERY_MONITOR_CNT_TYPE_Q_COUNTER:=1): 'MLX5_QUERY_MONITOR_CNT_TYPE_Q_COUNTER'} +enum_mlx5_monitor_counter_ppcnt: dict[int, str] = {(MLX5_QUERY_MONITOR_PPCNT_IN_RANGE_LENGTH_ERRORS:=0): 'MLX5_QUERY_MONITOR_PPCNT_IN_RANGE_LENGTH_ERRORS', (MLX5_QUERY_MONITOR_PPCNT_OUT_OF_RANGE_LENGTH_FIELD:=1): 'MLX5_QUERY_MONITOR_PPCNT_OUT_OF_RANGE_LENGTH_FIELD', (MLX5_QUERY_MONITOR_PPCNT_FRAME_TOO_LONG_ERRORS:=2): 'MLX5_QUERY_MONITOR_PPCNT_FRAME_TOO_LONG_ERRORS', (MLX5_QUERY_MONITOR_PPCNT_FRAME_CHECK_SEQUENCE_ERRORS:=3): 'MLX5_QUERY_MONITOR_PPCNT_FRAME_CHECK_SEQUENCE_ERRORS', (MLX5_QUERY_MONITOR_PPCNT_ALIGNMENT_ERRORS:=4): 'MLX5_QUERY_MONITOR_PPCNT_ALIGNMENT_ERRORS', (MLX5_QUERY_MONITOR_PPCNT_IF_OUT_DISCARDS:=5): 'MLX5_QUERY_MONITOR_PPCNT_IF_OUT_DISCARDS'} +_anonenum89: dict[int, str] = {(MLX5_QUERY_MONITOR_Q_COUNTER_RX_OUT_OF_BUFFER:=4): 'MLX5_QUERY_MONITOR_Q_COUNTER_RX_OUT_OF_BUFFER'} +@c.record +class struct_mlx5_ifc_monitor_counter_output_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + type: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[8]] + counter: c.Array[ctypes.c_ubyte, Literal[16]] + counter_group_id: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_monitor_counter_output_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('type', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('counter', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('counter_group_id', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_set_monitor_counter_in_bits(c.Struct): + SIZE = 576 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_counters: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + monitor_counter: c.Array[struct_mlx5_ifc_monitor_counter_output_bits, Literal[7]] +struct_mlx5_ifc_set_monitor_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('num_of_counters', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('monitor_counter', c.Array[struct_mlx5_ifc_monitor_counter_output_bits, Literal[7]], 128)]) +@c.record +class struct_mlx5_ifc_set_monitor_counter_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_monitor_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_query_vport_state_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_vport_state_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_vnic_env_out_bits(c.Struct): + SIZE = 4224 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + vport_env: struct_mlx5_ifc_vnic_diagnostic_statistics_bits +struct_mlx5_ifc_query_vnic_env_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('vport_env', struct_mlx5_ifc_vnic_diagnostic_statistics_bits, 128)]) +_anonenum90: dict[int, str] = {(MLX5_QUERY_VNIC_ENV_IN_OP_MOD_VPORT_DIAG_STATISTICS:=0): 'MLX5_QUERY_VNIC_ENV_IN_OP_MOD_VPORT_DIAG_STATISTICS'} +@c.record +class struct_mlx5_ifc_query_vnic_env_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_vnic_env_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_vport_counter_out_bits(c.Struct): + SIZE = 4224 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + received_errors: struct_mlx5_ifc_traffic_counter_bits + transmit_errors: struct_mlx5_ifc_traffic_counter_bits + received_ib_unicast: struct_mlx5_ifc_traffic_counter_bits + transmitted_ib_unicast: struct_mlx5_ifc_traffic_counter_bits + received_ib_multicast: struct_mlx5_ifc_traffic_counter_bits + transmitted_ib_multicast: struct_mlx5_ifc_traffic_counter_bits + received_eth_broadcast: struct_mlx5_ifc_traffic_counter_bits + transmitted_eth_broadcast: struct_mlx5_ifc_traffic_counter_bits + received_eth_unicast: struct_mlx5_ifc_traffic_counter_bits + transmitted_eth_unicast: struct_mlx5_ifc_traffic_counter_bits + received_eth_multicast: struct_mlx5_ifc_traffic_counter_bits + transmitted_eth_multicast: struct_mlx5_ifc_traffic_counter_bits + local_loopback: struct_mlx5_ifc_traffic_counter_bits + reserved_at_700: c.Array[ctypes.c_ubyte, Literal[2432]] +struct_mlx5_ifc_query_vport_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('received_errors', struct_mlx5_ifc_traffic_counter_bits, 128), ('transmit_errors', struct_mlx5_ifc_traffic_counter_bits, 256), ('received_ib_unicast', struct_mlx5_ifc_traffic_counter_bits, 384), ('transmitted_ib_unicast', struct_mlx5_ifc_traffic_counter_bits, 512), ('received_ib_multicast', struct_mlx5_ifc_traffic_counter_bits, 640), ('transmitted_ib_multicast', struct_mlx5_ifc_traffic_counter_bits, 768), ('received_eth_broadcast', struct_mlx5_ifc_traffic_counter_bits, 896), ('transmitted_eth_broadcast', struct_mlx5_ifc_traffic_counter_bits, 1024), ('received_eth_unicast', struct_mlx5_ifc_traffic_counter_bits, 1152), ('transmitted_eth_unicast', struct_mlx5_ifc_traffic_counter_bits, 1280), ('received_eth_multicast', struct_mlx5_ifc_traffic_counter_bits, 1408), ('transmitted_eth_multicast', struct_mlx5_ifc_traffic_counter_bits, 1536), ('local_loopback', struct_mlx5_ifc_traffic_counter_bits, 1664), ('reserved_at_700', c.Array[ctypes.c_ubyte, Literal[2432]], 1792)]) +_anonenum91: dict[int, str] = {(MLX5_QUERY_VPORT_COUNTER_IN_OP_MOD_VPORT_COUNTERS:=0): 'MLX5_QUERY_VPORT_COUNTER_IN_OP_MOD_VPORT_COUNTERS'} +@c.record +class struct_mlx5_ifc_query_vport_counter_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[11]] + port_num: c.Array[ctypes.c_ubyte, Literal[4]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[96]] + clear: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_c1: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_vport_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[11]], 65), ('port_num', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[96]], 96), ('clear', c.Array[ctypes.c_ubyte, Literal[1]], 192), ('reserved_at_c1', c.Array[ctypes.c_ubyte, Literal[31]], 193), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_query_tis_out_bits(c.Struct): + SIZE = 1408 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + tis_context: struct_mlx5_ifc_tisc_bits +struct_mlx5_ifc_query_tis_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('tis_context', struct_mlx5_ifc_tisc_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_tis_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + tisn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_tis_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('tisn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_tir_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + tir_context: struct_mlx5_ifc_tirc_bits +struct_mlx5_ifc_query_tir_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('tir_context', struct_mlx5_ifc_tirc_bits, 256)]) +@c.record +class struct_mlx5_ifc_query_tir_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + tirn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_tir_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('tirn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_srq_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + srq_context_entry: struct_mlx5_ifc_srqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[1536]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_query_srq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('srq_context_entry', struct_mlx5_ifc_srqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[1536]], 640), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_query_srq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + srqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_srq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('srqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_sq_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + sq_context: struct_mlx5_ifc_sqc_bits +struct_mlx5_ifc_query_sq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('sq_context', struct_mlx5_ifc_sqc_bits, 256)]) +@c.record +class struct_mlx5_ifc_query_sq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + sqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_sq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('sqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_special_contexts_out_bits(c.Struct): + SIZE = 256 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + dump_fill_mkey: c.Array[ctypes.c_ubyte, Literal[32]] + resd_lkey: c.Array[ctypes.c_ubyte, Literal[32]] + null_mkey: c.Array[ctypes.c_ubyte, Literal[32]] + terminate_scatter_list_mkey: c.Array[ctypes.c_ubyte, Literal[32]] + repeated_mkey: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_special_contexts_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('dump_fill_mkey', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('resd_lkey', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('null_mkey', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('terminate_scatter_list_mkey', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('repeated_mkey', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_query_special_contexts_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_special_contexts_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_query_scheduling_element_out_bits(c.Struct): + SIZE = 1024 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + scheduling_context: struct_mlx5_ifc_scheduling_context_bits + reserved_at_300: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_query_scheduling_element_out_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('scheduling_context', struct_mlx5_ifc_scheduling_context_bits, 256), ('reserved_at_300', c.Array[ctypes.c_ubyte, Literal[256]], 768)]) +_anonenum92: dict[int, str] = {(SCHEDULING_HIERARCHY_E_SWITCH:=2): 'SCHEDULING_HIERARCHY_E_SWITCH', (SCHEDULING_HIERARCHY_NIC:=3): 'SCHEDULING_HIERARCHY_NIC'} +@c.record +class struct_mlx5_ifc_query_scheduling_element_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + scheduling_hierarchy: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[24]] + scheduling_element_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_query_scheduling_element_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('scheduling_hierarchy', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('scheduling_element_id', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +@c.record +class struct_mlx5_ifc_query_rqt_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + rqt_context: struct_mlx5_ifc_rqtc_bits +struct_mlx5_ifc_query_rqt_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('rqt_context', struct_mlx5_ifc_rqtc_bits, 256)]) +@c.record +class struct_mlx5_ifc_query_rqt_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rqtn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_rqt_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rqtn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_rq_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + rq_context: struct_mlx5_ifc_rqc_bits +struct_mlx5_ifc_query_rq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('rq_context', struct_mlx5_ifc_rqc_bits, 256)]) +@c.record +class struct_mlx5_ifc_query_rq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_rq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_roce_address_out_bits(c.Struct): + SIZE = 384 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + roce_address: struct_mlx5_ifc_roce_addr_layout_bits +struct_mlx5_ifc_query_roce_address_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('roce_address', struct_mlx5_ifc_roce_addr_layout_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_roce_address_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + roce_address_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[12]] + vhca_port_num: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_roce_address_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('roce_address_index', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[12]], 80), ('vhca_port_num', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_rmp_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + rmp_context: struct_mlx5_ifc_rmpc_bits +struct_mlx5_ifc_query_rmp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('rmp_context', struct_mlx5_ifc_rmpc_bits, 256)]) +@c.record +class struct_mlx5_ifc_query_rmp_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rmpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_rmp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rmpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_cqe_error_syndrome_bits(c.Struct): + SIZE = 32 + hw_error_syndrome: c.Array[ctypes.c_ubyte, Literal[8]] + hw_syndrome_type: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_c: c.Array[ctypes.c_ubyte, Literal[4]] + vendor_error_syndrome: c.Array[ctypes.c_ubyte, Literal[8]] + syndrome: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_cqe_error_syndrome_bits.register_fields([('hw_error_syndrome', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('hw_syndrome_type', c.Array[ctypes.c_ubyte, Literal[4]], 8), ('reserved_at_c', c.Array[ctypes.c_ubyte, Literal[4]], 12), ('vendor_error_syndrome', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('syndrome', c.Array[ctypes.c_ubyte, Literal[8]], 24)]) +@c.record +class struct_mlx5_ifc_qp_context_extension_bits(c.Struct): + SIZE = 1536 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[96]] + error_syndrome: struct_mlx5_ifc_cqe_error_syndrome_bits + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[1408]] +struct_mlx5_ifc_qp_context_extension_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[96]], 0), ('error_syndrome', struct_mlx5_ifc_cqe_error_syndrome_bits, 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[1408]], 128)]) +@c.record +class struct_mlx5_ifc_qpc_extension_and_pas_list_in_bits(c.Struct): + SIZE = 1536 + qpc_data_extension: struct_mlx5_ifc_qp_context_extension_bits + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_qpc_extension_and_pas_list_in_bits.register_fields([('qpc_data_extension', struct_mlx5_ifc_qp_context_extension_bits, 0), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 1536)]) +@c.record +class struct_mlx5_ifc_qp_pas_list_in_bits(c.Struct): + SIZE = 0 + pas: c.Array[struct_mlx5_ifc_cmd_pas_bits, Literal[0]] +struct_mlx5_ifc_qp_pas_list_in_bits.register_fields([('pas', c.Array[struct_mlx5_ifc_cmd_pas_bits, Literal[0]], 0)]) +@c.record +class union_mlx5_ifc_qp_pas_or_qpc_ext_and_pas_bits(c.Struct): + SIZE = 1536 + qp_pas_list: struct_mlx5_ifc_qp_pas_list_in_bits + qpc_ext_and_pas_list: struct_mlx5_ifc_qpc_extension_and_pas_list_in_bits +union_mlx5_ifc_qp_pas_or_qpc_ext_and_pas_bits.register_fields([('qp_pas_list', struct_mlx5_ifc_qp_pas_list_in_bits, 0), ('qpc_ext_and_pas_list', struct_mlx5_ifc_qpc_extension_and_pas_list_in_bits, 0)]) +@c.record +class struct_mlx5_ifc_query_qp_out_bits(c.Struct): + SIZE = 3712 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[128]] + qp_pas_or_qpc_ext_and_pas: union_mlx5_ifc_qp_pas_or_qpc_ext_and_pas_bits +struct_mlx5_ifc_query_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[128]], 2048), ('qp_pas_or_qpc_ext_and_pas', union_mlx5_ifc_qp_pas_or_qpc_ext_and_pas_bits, 2176)]) +@c.record +class struct_mlx5_ifc_query_qp_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + qpc_ext: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[7]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('qpc_ext', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[7]], 65), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_q_counter_out_bits(c.Struct): + SIZE = 2048 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + rx_write_requests: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + rx_read_requests: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] + rx_atomic_requests: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[32]] + rx_dct_connect: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[32]] + out_of_buffer: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1a0: c.Array[ctypes.c_ubyte, Literal[32]] + out_of_sequence: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[32]] + duplicate_request: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_220: c.Array[ctypes.c_ubyte, Literal[32]] + rnr_nak_retry_err: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_260: c.Array[ctypes.c_ubyte, Literal[32]] + packet_seq_err: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_2a0: c.Array[ctypes.c_ubyte, Literal[32]] + implied_nak_seq_err: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_2e0: c.Array[ctypes.c_ubyte, Literal[32]] + local_ack_timeout_err: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_320: c.Array[ctypes.c_ubyte, Literal[96]] + req_rnr_retries_exceeded: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_3a0: c.Array[ctypes.c_ubyte, Literal[32]] + resp_local_length_error: c.Array[ctypes.c_ubyte, Literal[32]] + req_local_length_error: c.Array[ctypes.c_ubyte, Literal[32]] + resp_local_qp_error: c.Array[ctypes.c_ubyte, Literal[32]] + local_operation_error: c.Array[ctypes.c_ubyte, Literal[32]] + resp_local_protection: c.Array[ctypes.c_ubyte, Literal[32]] + req_local_protection: c.Array[ctypes.c_ubyte, Literal[32]] + resp_cqe_error: c.Array[ctypes.c_ubyte, Literal[32]] + req_cqe_error: c.Array[ctypes.c_ubyte, Literal[32]] + req_mw_binding: c.Array[ctypes.c_ubyte, Literal[32]] + req_bad_response: c.Array[ctypes.c_ubyte, Literal[32]] + req_remote_invalid_request: c.Array[ctypes.c_ubyte, Literal[32]] + resp_remote_invalid_request: c.Array[ctypes.c_ubyte, Literal[32]] + req_remote_access_errors: c.Array[ctypes.c_ubyte, Literal[32]] + resp_remote_access_errors: c.Array[ctypes.c_ubyte, Literal[32]] + req_remote_operation_errors: c.Array[ctypes.c_ubyte, Literal[32]] + req_transport_retries_exceeded: c.Array[ctypes.c_ubyte, Literal[32]] + cq_overflow: c.Array[ctypes.c_ubyte, Literal[32]] + resp_cqe_flush_error: c.Array[ctypes.c_ubyte, Literal[32]] + req_cqe_flush_error: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_620: c.Array[ctypes.c_ubyte, Literal[32]] + roce_adp_retrans: c.Array[ctypes.c_ubyte, Literal[32]] + roce_adp_retrans_to: c.Array[ctypes.c_ubyte, Literal[32]] + roce_slow_restart: c.Array[ctypes.c_ubyte, Literal[32]] + roce_slow_restart_cnps: c.Array[ctypes.c_ubyte, Literal[32]] + roce_slow_restart_trans: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_6e0: c.Array[ctypes.c_ubyte, Literal[288]] +struct_mlx5_ifc_query_q_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('rx_write_requests', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('rx_read_requests', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('rx_atomic_requests', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('rx_dct_connect', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('out_of_buffer', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('reserved_at_1a0', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('out_of_sequence', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('duplicate_request', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('reserved_at_220', c.Array[ctypes.c_ubyte, Literal[32]], 544), ('rnr_nak_retry_err', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('reserved_at_260', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('packet_seq_err', c.Array[ctypes.c_ubyte, Literal[32]], 640), ('reserved_at_2a0', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('implied_nak_seq_err', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('reserved_at_2e0', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('local_ack_timeout_err', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('reserved_at_320', c.Array[ctypes.c_ubyte, Literal[96]], 800), ('req_rnr_retries_exceeded', c.Array[ctypes.c_ubyte, Literal[32]], 896), ('reserved_at_3a0', c.Array[ctypes.c_ubyte, Literal[32]], 928), ('resp_local_length_error', c.Array[ctypes.c_ubyte, Literal[32]], 960), ('req_local_length_error', c.Array[ctypes.c_ubyte, Literal[32]], 992), ('resp_local_qp_error', c.Array[ctypes.c_ubyte, Literal[32]], 1024), ('local_operation_error', c.Array[ctypes.c_ubyte, Literal[32]], 1056), ('resp_local_protection', c.Array[ctypes.c_ubyte, Literal[32]], 1088), ('req_local_protection', c.Array[ctypes.c_ubyte, Literal[32]], 1120), ('resp_cqe_error', c.Array[ctypes.c_ubyte, Literal[32]], 1152), ('req_cqe_error', c.Array[ctypes.c_ubyte, Literal[32]], 1184), ('req_mw_binding', c.Array[ctypes.c_ubyte, Literal[32]], 1216), ('req_bad_response', c.Array[ctypes.c_ubyte, Literal[32]], 1248), ('req_remote_invalid_request', c.Array[ctypes.c_ubyte, Literal[32]], 1280), ('resp_remote_invalid_request', c.Array[ctypes.c_ubyte, Literal[32]], 1312), ('req_remote_access_errors', c.Array[ctypes.c_ubyte, Literal[32]], 1344), ('resp_remote_access_errors', c.Array[ctypes.c_ubyte, Literal[32]], 1376), ('req_remote_operation_errors', c.Array[ctypes.c_ubyte, Literal[32]], 1408), ('req_transport_retries_exceeded', c.Array[ctypes.c_ubyte, Literal[32]], 1440), ('cq_overflow', c.Array[ctypes.c_ubyte, Literal[32]], 1472), ('resp_cqe_flush_error', c.Array[ctypes.c_ubyte, Literal[32]], 1504), ('req_cqe_flush_error', c.Array[ctypes.c_ubyte, Literal[32]], 1536), ('reserved_at_620', c.Array[ctypes.c_ubyte, Literal[32]], 1568), ('roce_adp_retrans', c.Array[ctypes.c_ubyte, Literal[32]], 1600), ('roce_adp_retrans_to', c.Array[ctypes.c_ubyte, Literal[32]], 1632), ('roce_slow_restart', c.Array[ctypes.c_ubyte, Literal[32]], 1664), ('roce_slow_restart_cnps', c.Array[ctypes.c_ubyte, Literal[32]], 1696), ('roce_slow_restart_trans', c.Array[ctypes.c_ubyte, Literal[32]], 1728), ('reserved_at_6e0', c.Array[ctypes.c_ubyte, Literal[288]], 1760)]) +@c.record +class struct_mlx5_ifc_query_q_counter_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[96]] + clear: c.Array[ctypes.c_ubyte, Literal[1]] + aggregate: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_c2: c.Array[ctypes.c_ubyte, Literal[30]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[24]] + counter_set_id: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_query_q_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[96]], 96), ('clear', c.Array[ctypes.c_ubyte, Literal[1]], 192), ('aggregate', c.Array[ctypes.c_ubyte, Literal[1]], 193), ('reserved_at_c2', c.Array[ctypes.c_ubyte, Literal[30]], 194), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[24]], 224), ('counter_set_id', c.Array[ctypes.c_ubyte, Literal[8]], 248)]) +@c.record +class struct_mlx5_ifc_query_pages_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + embedded_cpu_function: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + num_pages: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_pages_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('embedded_cpu_function', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('num_pages', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +_anonenum93: dict[int, str] = {(MLX5_QUERY_PAGES_IN_OP_MOD_BOOT_PAGES:=1): 'MLX5_QUERY_PAGES_IN_OP_MOD_BOOT_PAGES', (MLX5_QUERY_PAGES_IN_OP_MOD_INIT_PAGES:=2): 'MLX5_QUERY_PAGES_IN_OP_MOD_INIT_PAGES', (MLX5_QUERY_PAGES_IN_OP_MOD_REGULAR_PAGES:=3): 'MLX5_QUERY_PAGES_IN_OP_MOD_REGULAR_PAGES'} +@c.record +class struct_mlx5_ifc_query_pages_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + embedded_cpu_function: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_pages_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('embedded_cpu_function', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_nic_vport_context_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + nic_vport_context: struct_mlx5_ifc_nic_vport_context_bits +struct_mlx5_ifc_query_nic_vport_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('nic_vport_context', struct_mlx5_ifc_nic_vport_context_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_nic_vport_context_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[5]] + allowed_list_type: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_query_nic_vport_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[5]], 96), ('allowed_list_type', c.Array[ctypes.c_ubyte, Literal[3]], 101), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[24]], 104)]) +@c.record +class struct_mlx5_ifc_query_mkey_out_bits(c.Struct): + SIZE = 2432 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + memory_key_mkey_entry: struct_mlx5_ifc_mkc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[1536]] + bsf0_klm0_pas_mtt0_1: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] + bsf1_klm1_pas_mtt2_3: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] +struct_mlx5_ifc_query_mkey_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('memory_key_mkey_entry', struct_mlx5_ifc_mkc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[1536]], 640), ('bsf0_klm0_pas_mtt0_1', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 2176), ('bsf1_klm1_pas_mtt2_3', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 2304)]) +@c.record +class struct_mlx5_ifc_query_mkey_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + mkey_index: c.Array[ctypes.c_ubyte, Literal[24]] + pg_access: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_61: c.Array[ctypes.c_ubyte, Literal[31]] +struct_mlx5_ifc_query_mkey_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('mkey_index', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('pg_access', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('reserved_at_61', c.Array[ctypes.c_ubyte, Literal[31]], 97)]) +@c.record +class struct_mlx5_ifc_query_mad_demux_out_bits(c.Struct): + SIZE = 160 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + mad_dumux_parameters_block: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_mad_demux_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('mad_dumux_parameters_block', c.Array[ctypes.c_ubyte, Literal[32]], 128)]) +@c.record +class struct_mlx5_ifc_query_mad_demux_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_mad_demux_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_query_l2_table_entry_out_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[160]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[19]] + vlan_valid: c.Array[ctypes.c_ubyte, Literal[1]] + vlan: c.Array[ctypes.c_ubyte, Literal[12]] + mac_address: struct_mlx5_ifc_mac_address_layout_bits + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[192]] +struct_mlx5_ifc_query_l2_table_entry_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[160]], 64), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[19]], 224), ('vlan_valid', c.Array[ctypes.c_ubyte, Literal[1]], 243), ('vlan', c.Array[ctypes.c_ubyte, Literal[12]], 244), ('mac_address', struct_mlx5_ifc_mac_address_layout_bits, 256), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[192]], 320)]) +@c.record +class struct_mlx5_ifc_query_l2_table_entry_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[320]] +struct_mlx5_ifc_query_l2_table_entry_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[96]], 64), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_index', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[320]], 192)]) +@c.record +class struct_mlx5_ifc_query_issi_out_bits(c.Struct): + SIZE = 896 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + current_issi: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[160]] + reserved_at_100: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[76]] + supported_issi_dw0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_issi_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('current_issi', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[160]], 96), ('reserved_at_100', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[76]], 256), ('supported_issi_dw0', c.Array[ctypes.c_ubyte, Literal[32]], 864)]) +@c.record +class struct_mlx5_ifc_query_issi_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_issi_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_driver_version_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_0: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_1: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_driver_version_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_0', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_1', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_driver_version_in_bits(c.Struct): + SIZE = 640 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_0: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_1: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_2: c.Array[ctypes.c_ubyte, Literal[64]] + driver_version: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[64]] +struct_mlx5_ifc_set_driver_version_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_0', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_1', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_2', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('driver_version', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[64]], 128)]) +@c.record +class struct_mlx5_ifc_query_hca_vport_pkey_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + pkey: c.Array[struct_mlx5_ifc_pkey_bits, Literal[0]] +struct_mlx5_ifc_query_hca_vport_pkey_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('pkey', c.Array[struct_mlx5_ifc_pkey_bits, Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_query_hca_vport_pkey_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[11]] + port_num: c.Array[ctypes.c_ubyte, Literal[4]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + pkey_index: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_query_hca_vport_pkey_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[11]], 65), ('port_num', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('pkey_index', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +_anonenum94: dict[int, str] = {(MLX5_HCA_VPORT_SEL_PORT_GUID:=1): 'MLX5_HCA_VPORT_SEL_PORT_GUID', (MLX5_HCA_VPORT_SEL_NODE_GUID:=2): 'MLX5_HCA_VPORT_SEL_NODE_GUID', (MLX5_HCA_VPORT_SEL_STATE_POLICY:=4): 'MLX5_HCA_VPORT_SEL_STATE_POLICY'} +@c.record +class struct_mlx5_ifc_query_hca_vport_gid_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + gids_num: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_70: c.Array[ctypes.c_ubyte, Literal[16]] + gid: c.Array[struct_mlx5_ifc_array128_auto_bits, Literal[0]] +struct_mlx5_ifc_query_hca_vport_gid_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('gids_num', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('reserved_at_70', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('gid', c.Array[struct_mlx5_ifc_array128_auto_bits, Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_query_hca_vport_gid_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[11]] + port_num: c.Array[ctypes.c_ubyte, Literal[4]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + gid_index: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_query_hca_vport_gid_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[11]], 65), ('port_num', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('gid_index', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_query_hca_vport_context_out_bits(c.Struct): + SIZE = 4224 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + hca_vport_context: struct_mlx5_ifc_hca_vport_context_bits +struct_mlx5_ifc_query_hca_vport_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('hca_vport_context', struct_mlx5_ifc_hca_vport_context_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_hca_vport_context_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[11]] + port_num: c.Array[ctypes.c_ubyte, Literal[4]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_hca_vport_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[11]], 65), ('port_num', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_hca_cap_out_bits(c.Struct): + SIZE = 32896 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + capability: union_mlx5_ifc_hca_cap_union_bits +struct_mlx5_ifc_query_hca_cap_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('capability', union_mlx5_ifc_hca_cap_union_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_hca_cap_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_function: c.Array[ctypes.c_ubyte, Literal[1]] + ec_vf_function: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[1]] + function_id_type: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[12]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_hca_cap_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_function', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('ec_vf_function', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[1]], 66), ('function_id_type', c.Array[ctypes.c_ubyte, Literal[1]], 67), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[12]], 68), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_other_hca_cap_bits(c.Struct): + SIZE = 640 + roce: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[639]] +struct_mlx5_ifc_other_hca_cap_bits.register_fields([('roce', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[639]], 1)]) +@c.record +class struct_mlx5_ifc_query_other_hca_cap_out_bits(c.Struct): + SIZE = 768 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + other_capability: struct_mlx5_ifc_other_hca_cap_bits +struct_mlx5_ifc_query_other_hca_cap_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('other_capability', struct_mlx5_ifc_other_hca_cap_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_other_hca_cap_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_other_hca_cap_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_modify_other_hca_cap_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_other_hca_cap_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_other_hca_cap_in_bits(c.Struct): + SIZE = 768 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + field_select: c.Array[ctypes.c_ubyte, Literal[32]] + other_capability: struct_mlx5_ifc_other_hca_cap_bits +struct_mlx5_ifc_modify_other_hca_cap_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('field_select', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('other_capability', struct_mlx5_ifc_other_hca_cap_bits, 128)]) +@c.record +class struct_mlx5_ifc_sw_owner_icm_root_params_bits(c.Struct): + SIZE = 128 + sw_owner_icm_root_1: c.Array[ctypes.c_ubyte, Literal[64]] + sw_owner_icm_root_0: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_sw_owner_icm_root_params_bits.register_fields([('sw_owner_icm_root_1', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('sw_owner_icm_root_0', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_rtc_params_bits(c.Struct): + SIZE = 128 + rtc_id_0: c.Array[ctypes.c_ubyte, Literal[32]] + rtc_id_1: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_rtc_params_bits.register_fields([('rtc_id_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('rtc_id_1', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_flow_table_context_bits(c.Struct): + SIZE = 320 + reformat_en: c.Array[ctypes.c_ubyte, Literal[1]] + decap_en: c.Array[ctypes.c_ubyte, Literal[1]] + sw_owner: c.Array[ctypes.c_ubyte, Literal[1]] + termination_table: c.Array[ctypes.c_ubyte, Literal[1]] + table_miss_action: c.Array[ctypes.c_ubyte, Literal[4]] + level: c.Array[ctypes.c_ubyte, Literal[8]] + rtc_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_11: c.Array[ctypes.c_ubyte, Literal[7]] + log_size: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + table_miss_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + lag_master_next_table_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[96]] + sws: struct_mlx5_ifc_sw_owner_icm_root_params_bits + hws: struct_mlx5_ifc_rtc_params_bits +struct_mlx5_ifc_flow_table_context_bits.register_fields([('reformat_en', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('decap_en', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('sw_owner', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('termination_table', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('table_miss_action', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('level', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('rtc_valid', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('reserved_at_11', c.Array[ctypes.c_ubyte, Literal[7]], 17), ('log_size', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('table_miss_id', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('lag_master_next_table_id', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[96]], 96), ('sws', struct_mlx5_ifc_sw_owner_icm_root_params_bits, 192), ('hws', struct_mlx5_ifc_rtc_params_bits, 192)]) +@c.record +class struct_mlx5_ifc_query_flow_table_out_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[128]] + flow_table_context: struct_mlx5_ifc_flow_table_context_bits +struct_mlx5_ifc_query_flow_table_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[128]], 64), ('flow_table_context', struct_mlx5_ifc_flow_table_context_bits, 192)]) +@c.record +class struct_mlx5_ifc_query_flow_table_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[320]] +struct_mlx5_ifc_query_flow_table_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[320]], 192)]) +@c.record +class struct_mlx5_ifc_query_fte_out_bits(c.Struct): + SIZE = 6656 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[448]] + flow_context: struct_mlx5_ifc_flow_context_bits +struct_mlx5_ifc_query_fte_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[448]], 64), ('flow_context', struct_mlx5_ifc_flow_context_bits, 512)]) +@c.record +class struct_mlx5_ifc_query_fte_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + flow_index: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[224]] +struct_mlx5_ifc_query_fte_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('flow_index', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[224]], 288)]) +@c.record +class struct_mlx5_ifc_match_definer_format_0_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[256]] + metadata_reg_c_0: c.Array[ctypes.c_ubyte, Literal[32]] + metadata_reg_c_1: c.Array[ctypes.c_ubyte, Literal[32]] + outer_dmac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + outer_dmac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + outer_ethertype: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[1]] + sx_sniffer: c.Array[ctypes.c_ubyte, Literal[1]] + functional_lb: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ip_frag: c.Array[ctypes.c_ubyte, Literal[1]] + outer_qp_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_encap_type: c.Array[ctypes.c_ubyte, Literal[2]] + port_number: c.Array[ctypes.c_ubyte, Literal[2]] + outer_l3_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_l4_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_first_vlan_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_first_vlan_prio: c.Array[ctypes.c_ubyte, Literal[3]] + outer_first_vlan_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + outer_first_vlan_vid: c.Array[ctypes.c_ubyte, Literal[12]] + outer_l4_type_ext: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_1a4: c.Array[ctypes.c_ubyte, Literal[2]] + outer_ipsec_layer: c.Array[ctypes.c_ubyte, Literal[2]] + outer_l2_type: c.Array[ctypes.c_ubyte, Literal[2]] + force_lb: c.Array[ctypes.c_ubyte, Literal[1]] + outer_l2_ok: c.Array[ctypes.c_ubyte, Literal[1]] + outer_l3_ok: c.Array[ctypes.c_ubyte, Literal[1]] + outer_l4_ok: c.Array[ctypes.c_ubyte, Literal[1]] + outer_second_vlan_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_second_vlan_prio: c.Array[ctypes.c_ubyte, Literal[3]] + outer_second_vlan_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + outer_second_vlan_vid: c.Array[ctypes.c_ubyte, Literal[12]] + outer_smac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + outer_smac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + inner_ipv4_checksum_ok: c.Array[ctypes.c_ubyte, Literal[1]] + inner_l4_checksum_ok: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ipv4_checksum_ok: c.Array[ctypes.c_ubyte, Literal[1]] + outer_l4_checksum_ok: c.Array[ctypes.c_ubyte, Literal[1]] + inner_l3_ok: c.Array[ctypes.c_ubyte, Literal[1]] + inner_l4_ok: c.Array[ctypes.c_ubyte, Literal[1]] + outer_l3_ok_duplicate: c.Array[ctypes.c_ubyte, Literal[1]] + outer_l4_ok_duplicate: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_cwr: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_ece: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_urg: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_ack: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_psh: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_rst: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_syn: c.Array[ctypes.c_ubyte, Literal[1]] + outer_tcp_fin: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_match_definer_format_0_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[256]], 0), ('metadata_reg_c_0', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('metadata_reg_c_1', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('outer_dmac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('outer_dmac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 352), ('outer_ethertype', c.Array[ctypes.c_ubyte, Literal[16]], 368), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[1]], 384), ('sx_sniffer', c.Array[ctypes.c_ubyte, Literal[1]], 385), ('functional_lb', c.Array[ctypes.c_ubyte, Literal[1]], 386), ('outer_ip_frag', c.Array[ctypes.c_ubyte, Literal[1]], 387), ('outer_qp_type', c.Array[ctypes.c_ubyte, Literal[2]], 388), ('outer_encap_type', c.Array[ctypes.c_ubyte, Literal[2]], 390), ('port_number', c.Array[ctypes.c_ubyte, Literal[2]], 392), ('outer_l3_type', c.Array[ctypes.c_ubyte, Literal[2]], 394), ('outer_l4_type', c.Array[ctypes.c_ubyte, Literal[2]], 396), ('outer_first_vlan_type', c.Array[ctypes.c_ubyte, Literal[2]], 398), ('outer_first_vlan_prio', c.Array[ctypes.c_ubyte, Literal[3]], 400), ('outer_first_vlan_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 403), ('outer_first_vlan_vid', c.Array[ctypes.c_ubyte, Literal[12]], 404), ('outer_l4_type_ext', c.Array[ctypes.c_ubyte, Literal[4]], 416), ('reserved_at_1a4', c.Array[ctypes.c_ubyte, Literal[2]], 420), ('outer_ipsec_layer', c.Array[ctypes.c_ubyte, Literal[2]], 422), ('outer_l2_type', c.Array[ctypes.c_ubyte, Literal[2]], 424), ('force_lb', c.Array[ctypes.c_ubyte, Literal[1]], 426), ('outer_l2_ok', c.Array[ctypes.c_ubyte, Literal[1]], 427), ('outer_l3_ok', c.Array[ctypes.c_ubyte, Literal[1]], 428), ('outer_l4_ok', c.Array[ctypes.c_ubyte, Literal[1]], 429), ('outer_second_vlan_type', c.Array[ctypes.c_ubyte, Literal[2]], 430), ('outer_second_vlan_prio', c.Array[ctypes.c_ubyte, Literal[3]], 432), ('outer_second_vlan_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 435), ('outer_second_vlan_vid', c.Array[ctypes.c_ubyte, Literal[12]], 436), ('outer_smac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('outer_smac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 480), ('inner_ipv4_checksum_ok', c.Array[ctypes.c_ubyte, Literal[1]], 496), ('inner_l4_checksum_ok', c.Array[ctypes.c_ubyte, Literal[1]], 497), ('outer_ipv4_checksum_ok', c.Array[ctypes.c_ubyte, Literal[1]], 498), ('outer_l4_checksum_ok', c.Array[ctypes.c_ubyte, Literal[1]], 499), ('inner_l3_ok', c.Array[ctypes.c_ubyte, Literal[1]], 500), ('inner_l4_ok', c.Array[ctypes.c_ubyte, Literal[1]], 501), ('outer_l3_ok_duplicate', c.Array[ctypes.c_ubyte, Literal[1]], 502), ('outer_l4_ok_duplicate', c.Array[ctypes.c_ubyte, Literal[1]], 503), ('outer_tcp_cwr', c.Array[ctypes.c_ubyte, Literal[1]], 504), ('outer_tcp_ece', c.Array[ctypes.c_ubyte, Literal[1]], 505), ('outer_tcp_urg', c.Array[ctypes.c_ubyte, Literal[1]], 506), ('outer_tcp_ack', c.Array[ctypes.c_ubyte, Literal[1]], 507), ('outer_tcp_psh', c.Array[ctypes.c_ubyte, Literal[1]], 508), ('outer_tcp_rst', c.Array[ctypes.c_ubyte, Literal[1]], 509), ('outer_tcp_syn', c.Array[ctypes.c_ubyte, Literal[1]], 510), ('outer_tcp_fin', c.Array[ctypes.c_ubyte, Literal[1]], 511)]) +@c.record +class struct_mlx5_ifc_match_definer_format_22_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[256]] + outer_ip_src_addr: c.Array[ctypes.c_ubyte, Literal[32]] + outer_ip_dest_addr: c.Array[ctypes.c_ubyte, Literal[32]] + outer_l4_sport: c.Array[ctypes.c_ubyte, Literal[16]] + outer_l4_dport: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[1]] + sx_sniffer: c.Array[ctypes.c_ubyte, Literal[1]] + functional_lb: c.Array[ctypes.c_ubyte, Literal[1]] + outer_ip_frag: c.Array[ctypes.c_ubyte, Literal[1]] + outer_qp_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_encap_type: c.Array[ctypes.c_ubyte, Literal[2]] + port_number: c.Array[ctypes.c_ubyte, Literal[2]] + outer_l3_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_l4_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_first_vlan_type: c.Array[ctypes.c_ubyte, Literal[2]] + outer_first_vlan_prio: c.Array[ctypes.c_ubyte, Literal[3]] + outer_first_vlan_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + outer_first_vlan_vid: c.Array[ctypes.c_ubyte, Literal[12]] + metadata_reg_c_0: c.Array[ctypes.c_ubyte, Literal[32]] + outer_dmac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + outer_smac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + outer_smac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + outer_dmac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_match_definer_format_22_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[256]], 0), ('outer_ip_src_addr', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('outer_ip_dest_addr', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('outer_l4_sport', c.Array[ctypes.c_ubyte, Literal[16]], 320), ('outer_l4_dport', c.Array[ctypes.c_ubyte, Literal[16]], 336), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[1]], 352), ('sx_sniffer', c.Array[ctypes.c_ubyte, Literal[1]], 353), ('functional_lb', c.Array[ctypes.c_ubyte, Literal[1]], 354), ('outer_ip_frag', c.Array[ctypes.c_ubyte, Literal[1]], 355), ('outer_qp_type', c.Array[ctypes.c_ubyte, Literal[2]], 356), ('outer_encap_type', c.Array[ctypes.c_ubyte, Literal[2]], 358), ('port_number', c.Array[ctypes.c_ubyte, Literal[2]], 360), ('outer_l3_type', c.Array[ctypes.c_ubyte, Literal[2]], 362), ('outer_l4_type', c.Array[ctypes.c_ubyte, Literal[2]], 364), ('outer_first_vlan_type', c.Array[ctypes.c_ubyte, Literal[2]], 366), ('outer_first_vlan_prio', c.Array[ctypes.c_ubyte, Literal[3]], 368), ('outer_first_vlan_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 371), ('outer_first_vlan_vid', c.Array[ctypes.c_ubyte, Literal[12]], 372), ('metadata_reg_c_0', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('outer_dmac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('outer_smac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('outer_smac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 480), ('outer_dmac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 496)]) +@c.record +class struct_mlx5_ifc_match_definer_format_23_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[256]] + inner_ip_src_addr: c.Array[ctypes.c_ubyte, Literal[32]] + inner_ip_dest_addr: c.Array[ctypes.c_ubyte, Literal[32]] + inner_l4_sport: c.Array[ctypes.c_ubyte, Literal[16]] + inner_l4_dport: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[1]] + sx_sniffer: c.Array[ctypes.c_ubyte, Literal[1]] + functional_lb: c.Array[ctypes.c_ubyte, Literal[1]] + inner_ip_frag: c.Array[ctypes.c_ubyte, Literal[1]] + inner_qp_type: c.Array[ctypes.c_ubyte, Literal[2]] + inner_encap_type: c.Array[ctypes.c_ubyte, Literal[2]] + port_number: c.Array[ctypes.c_ubyte, Literal[2]] + inner_l3_type: c.Array[ctypes.c_ubyte, Literal[2]] + inner_l4_type: c.Array[ctypes.c_ubyte, Literal[2]] + inner_first_vlan_type: c.Array[ctypes.c_ubyte, Literal[2]] + inner_first_vlan_prio: c.Array[ctypes.c_ubyte, Literal[3]] + inner_first_vlan_cfi: c.Array[ctypes.c_ubyte, Literal[1]] + inner_first_vlan_vid: c.Array[ctypes.c_ubyte, Literal[12]] + tunnel_header_0: c.Array[ctypes.c_ubyte, Literal[32]] + inner_dmac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + inner_smac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + inner_smac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + inner_dmac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_match_definer_format_23_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[256]], 0), ('inner_ip_src_addr', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('inner_ip_dest_addr', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('inner_l4_sport', c.Array[ctypes.c_ubyte, Literal[16]], 320), ('inner_l4_dport', c.Array[ctypes.c_ubyte, Literal[16]], 336), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[1]], 352), ('sx_sniffer', c.Array[ctypes.c_ubyte, Literal[1]], 353), ('functional_lb', c.Array[ctypes.c_ubyte, Literal[1]], 354), ('inner_ip_frag', c.Array[ctypes.c_ubyte, Literal[1]], 355), ('inner_qp_type', c.Array[ctypes.c_ubyte, Literal[2]], 356), ('inner_encap_type', c.Array[ctypes.c_ubyte, Literal[2]], 358), ('port_number', c.Array[ctypes.c_ubyte, Literal[2]], 360), ('inner_l3_type', c.Array[ctypes.c_ubyte, Literal[2]], 362), ('inner_l4_type', c.Array[ctypes.c_ubyte, Literal[2]], 364), ('inner_first_vlan_type', c.Array[ctypes.c_ubyte, Literal[2]], 366), ('inner_first_vlan_prio', c.Array[ctypes.c_ubyte, Literal[3]], 368), ('inner_first_vlan_cfi', c.Array[ctypes.c_ubyte, Literal[1]], 371), ('inner_first_vlan_vid', c.Array[ctypes.c_ubyte, Literal[12]], 372), ('tunnel_header_0', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('inner_dmac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('inner_smac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('inner_smac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 480), ('inner_dmac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 496)]) +@c.record +class struct_mlx5_ifc_match_definer_format_29_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[192]] + outer_ip_dest_addr: c.Array[ctypes.c_ubyte, Literal[128]] + outer_ip_src_addr: c.Array[ctypes.c_ubyte, Literal[128]] + outer_l4_sport: c.Array[ctypes.c_ubyte, Literal[16]] + outer_l4_dport: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_match_definer_format_29_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[192]], 0), ('outer_ip_dest_addr', c.Array[ctypes.c_ubyte, Literal[128]], 192), ('outer_ip_src_addr', c.Array[ctypes.c_ubyte, Literal[128]], 320), ('outer_l4_sport', c.Array[ctypes.c_ubyte, Literal[16]], 448), ('outer_l4_dport', c.Array[ctypes.c_ubyte, Literal[16]], 464), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[32]], 480)]) +@c.record +class struct_mlx5_ifc_match_definer_format_30_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[160]] + outer_ip_dest_addr: c.Array[ctypes.c_ubyte, Literal[128]] + outer_ip_src_addr: c.Array[ctypes.c_ubyte, Literal[128]] + outer_dmac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + outer_smac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + outer_smac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + outer_dmac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_match_definer_format_30_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[160]], 0), ('outer_ip_dest_addr', c.Array[ctypes.c_ubyte, Literal[128]], 160), ('outer_ip_src_addr', c.Array[ctypes.c_ubyte, Literal[128]], 288), ('outer_dmac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('outer_smac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('outer_smac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 480), ('outer_dmac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 496)]) +@c.record +class struct_mlx5_ifc_match_definer_format_31_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[192]] + inner_ip_dest_addr: c.Array[ctypes.c_ubyte, Literal[128]] + inner_ip_src_addr: c.Array[ctypes.c_ubyte, Literal[128]] + inner_l4_sport: c.Array[ctypes.c_ubyte, Literal[16]] + inner_l4_dport: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_match_definer_format_31_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[192]], 0), ('inner_ip_dest_addr', c.Array[ctypes.c_ubyte, Literal[128]], 192), ('inner_ip_src_addr', c.Array[ctypes.c_ubyte, Literal[128]], 320), ('inner_l4_sport', c.Array[ctypes.c_ubyte, Literal[16]], 448), ('inner_l4_dport', c.Array[ctypes.c_ubyte, Literal[16]], 464), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[32]], 480)]) +@c.record +class struct_mlx5_ifc_match_definer_format_32_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[160]] + inner_ip_dest_addr: c.Array[ctypes.c_ubyte, Literal[128]] + inner_ip_src_addr: c.Array[ctypes.c_ubyte, Literal[128]] + inner_dmac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + inner_smac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + inner_smac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + inner_dmac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_match_definer_format_32_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[160]], 0), ('inner_ip_dest_addr', c.Array[ctypes.c_ubyte, Literal[128]], 160), ('inner_ip_src_addr', c.Array[ctypes.c_ubyte, Literal[128]], 288), ('inner_dmac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('inner_smac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('inner_smac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 480), ('inner_dmac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 496)]) +_anonenum95: dict[int, str] = {(MLX5_IFC_DEFINER_FORMAT_ID_SELECT:=61): 'MLX5_IFC_DEFINER_FORMAT_ID_SELECT'} +@c.record +class struct_mlx5_ifc_match_definer_match_mask_bits(c.Struct): + SIZE = 512 + reserved_at_1c0: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[5]] + match_dw_8: c.Array[ctypes.c_ubyte, Literal[32]] + match_dw_7: c.Array[ctypes.c_ubyte, Literal[32]] + match_dw_6: c.Array[ctypes.c_ubyte, Literal[32]] + match_dw_5: c.Array[ctypes.c_ubyte, Literal[32]] + match_dw_4: c.Array[ctypes.c_ubyte, Literal[32]] + match_dw_3: c.Array[ctypes.c_ubyte, Literal[32]] + match_dw_2: c.Array[ctypes.c_ubyte, Literal[32]] + match_dw_1: c.Array[ctypes.c_ubyte, Literal[32]] + match_dw_0: c.Array[ctypes.c_ubyte, Literal[32]] + match_byte_7: c.Array[ctypes.c_ubyte, Literal[8]] + match_byte_6: c.Array[ctypes.c_ubyte, Literal[8]] + match_byte_5: c.Array[ctypes.c_ubyte, Literal[8]] + match_byte_4: c.Array[ctypes.c_ubyte, Literal[8]] + match_byte_3: c.Array[ctypes.c_ubyte, Literal[8]] + match_byte_2: c.Array[ctypes.c_ubyte, Literal[8]] + match_byte_1: c.Array[ctypes.c_ubyte, Literal[8]] + match_byte_0: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_match_definer_match_mask_bits.register_fields([('reserved_at_1c0', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[5]], 0), ('match_dw_8', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('match_dw_7', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('match_dw_6', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('match_dw_5', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('match_dw_4', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('match_dw_3', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('match_dw_2', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('match_dw_1', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('match_dw_0', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('match_byte_7', c.Array[ctypes.c_ubyte, Literal[8]], 448), ('match_byte_6', c.Array[ctypes.c_ubyte, Literal[8]], 456), ('match_byte_5', c.Array[ctypes.c_ubyte, Literal[8]], 464), ('match_byte_4', c.Array[ctypes.c_ubyte, Literal[8]], 472), ('match_byte_3', c.Array[ctypes.c_ubyte, Literal[8]], 480), ('match_byte_2', c.Array[ctypes.c_ubyte, Literal[8]], 488), ('match_byte_1', c.Array[ctypes.c_ubyte, Literal[8]], 496), ('match_byte_0', c.Array[ctypes.c_ubyte, Literal[8]], 504)]) +@c.record +class struct_mlx5_ifc_match_definer_bits(c.Struct): + SIZE = 1024 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[16]] + format_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[96]] + format_select_dw3: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw2: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw1: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw0: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw7: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw6: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw5: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_dw4: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[24]] + format_select_dw8: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[32]] + format_select_byte3: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_byte2: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_byte1: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_byte0: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_byte7: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_byte6: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_byte5: c.Array[ctypes.c_ubyte, Literal[8]] + format_select_byte4: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[64]] + match_mask: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[16]] + match_mask_format: struct_mlx5_ifc_match_definer_match_mask_bits +struct_mlx5_ifc_match_definer_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('format_id', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[96]], 160), ('format_select_dw3', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('format_select_dw2', c.Array[ctypes.c_ubyte, Literal[8]], 264), ('format_select_dw1', c.Array[ctypes.c_ubyte, Literal[8]], 272), ('format_select_dw0', c.Array[ctypes.c_ubyte, Literal[8]], 280), ('format_select_dw7', c.Array[ctypes.c_ubyte, Literal[8]], 288), ('format_select_dw6', c.Array[ctypes.c_ubyte, Literal[8]], 296), ('format_select_dw5', c.Array[ctypes.c_ubyte, Literal[8]], 304), ('format_select_dw4', c.Array[ctypes.c_ubyte, Literal[8]], 312), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[24]], 320), ('format_select_dw8', c.Array[ctypes.c_ubyte, Literal[8]], 344), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('format_select_byte3', c.Array[ctypes.c_ubyte, Literal[8]], 384), ('format_select_byte2', c.Array[ctypes.c_ubyte, Literal[8]], 392), ('format_select_byte1', c.Array[ctypes.c_ubyte, Literal[8]], 400), ('format_select_byte0', c.Array[ctypes.c_ubyte, Literal[8]], 408), ('format_select_byte7', c.Array[ctypes.c_ubyte, Literal[8]], 416), ('format_select_byte6', c.Array[ctypes.c_ubyte, Literal[8]], 424), ('format_select_byte5', c.Array[ctypes.c_ubyte, Literal[8]], 432), ('format_select_byte4', c.Array[ctypes.c_ubyte, Literal[8]], 440), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[64]], 448), ('match_mask', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[16]], 512), ('match_mask_format', struct_mlx5_ifc_match_definer_match_mask_bits, 512)]) +@c.record +class struct_mlx5_ifc_general_obj_create_param_bits(c.Struct): + SIZE = 32 + alias_object: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[2]] + log_obj_range: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_general_obj_create_param_bits.register_fields([('alias_object', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[2]], 1), ('log_obj_range', c.Array[ctypes.c_ubyte, Literal[5]], 3), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8)]) +@c.record +class struct_mlx5_ifc_general_obj_query_param_bits(c.Struct): + SIZE = 32 + alias_object: c.Array[ctypes.c_ubyte, Literal[1]] + obj_offset: c.Array[ctypes.c_ubyte, Literal[31]] +struct_mlx5_ifc_general_obj_query_param_bits.register_fields([('alias_object', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('obj_offset', c.Array[ctypes.c_ubyte, Literal[31]], 1)]) +@c.record +class struct_mlx5_ifc_general_obj_in_cmd_hdr_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + vhca_tunnel_id: c.Array[ctypes.c_ubyte, Literal[16]] + obj_type: c.Array[ctypes.c_ubyte, Literal[16]] + obj_id: c.Array[ctypes.c_ubyte, Literal[32]] + op_param: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits_op_param +@c.record +class struct_mlx5_ifc_general_obj_in_cmd_hdr_bits_op_param(c.Struct): + SIZE = 32 + create: struct_mlx5_ifc_general_obj_create_param_bits + query: struct_mlx5_ifc_general_obj_query_param_bits +struct_mlx5_ifc_general_obj_in_cmd_hdr_bits_op_param.register_fields([('create', struct_mlx5_ifc_general_obj_create_param_bits, 0), ('query', struct_mlx5_ifc_general_obj_query_param_bits, 0)]) +struct_mlx5_ifc_general_obj_in_cmd_hdr_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('vhca_tunnel_id', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('obj_type', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('obj_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('op_param', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits_op_param, 96)]) +@c.record +class struct_mlx5_ifc_general_obj_out_cmd_hdr_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + obj_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_general_obj_out_cmd_hdr_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('obj_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_allow_other_vhca_access_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[80]] + object_type_to_be_accessed: c.Array[ctypes.c_ubyte, Literal[16]] + object_id_to_be_accessed: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + access_key_raw: c.Array[ctypes.c_ubyte, Literal[256]] + access_key: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] +struct_mlx5_ifc_allow_other_vhca_access_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[80]], 64), ('object_type_to_be_accessed', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('object_id_to_be_accessed', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('access_key_raw', c.Array[ctypes.c_ubyte, Literal[256]], 256), ('access_key', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 256)]) +@c.record +class struct_mlx5_ifc_allow_other_vhca_access_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_allow_other_vhca_access_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_header_arg_bits(c.Struct): + SIZE = 160 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + access_pd: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_modify_header_arg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('access_pd', c.Array[ctypes.c_ubyte, Literal[24]], 136)]) +@c.record +class struct_mlx5_ifc_create_modify_header_arg_in_bits(c.Struct): + SIZE = 288 + hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + arg: struct_mlx5_ifc_modify_header_arg_bits +struct_mlx5_ifc_create_modify_header_arg_in_bits.register_fields([('hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('arg', struct_mlx5_ifc_modify_header_arg_bits, 128)]) +@c.record +class struct_mlx5_ifc_create_match_definer_in_bits(c.Struct): + SIZE = 1152 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + obj_context: struct_mlx5_ifc_match_definer_bits +struct_mlx5_ifc_create_match_definer_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('obj_context', struct_mlx5_ifc_match_definer_bits, 128)]) +@c.record +class struct_mlx5_ifc_create_match_definer_out_bits(c.Struct): + SIZE = 128 + general_obj_out_cmd_hdr: struct_mlx5_ifc_general_obj_out_cmd_hdr_bits +struct_mlx5_ifc_create_match_definer_out_bits.register_fields([('general_obj_out_cmd_hdr', struct_mlx5_ifc_general_obj_out_cmd_hdr_bits, 0)]) +@c.record +class struct_mlx5_ifc_alias_context_bits(c.Struct): + SIZE = 512 + vhca_id_to_be_accessed: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[13]] + status: c.Array[ctypes.c_ubyte, Literal[3]] + object_id_to_be_accessed: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + access_key_raw: c.Array[ctypes.c_ubyte, Literal[256]] + access_key: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] + metadata: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_alias_context_bits.register_fields([('vhca_id_to_be_accessed', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[13]], 16), ('status', c.Array[ctypes.c_ubyte, Literal[3]], 29), ('object_id_to_be_accessed', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('access_key_raw', c.Array[ctypes.c_ubyte, Literal[256]], 128), ('access_key', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 128), ('metadata', c.Array[ctypes.c_ubyte, Literal[128]], 384)]) +@c.record +class struct_mlx5_ifc_create_alias_obj_in_bits(c.Struct): + SIZE = 640 + hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + alias_ctx: struct_mlx5_ifc_alias_context_bits +struct_mlx5_ifc_create_alias_obj_in_bits.register_fields([('hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('alias_ctx', struct_mlx5_ifc_alias_context_bits, 128)]) +_anonenum96: dict[int, str] = {(MLX5_QUERY_FLOW_GROUP_OUT_MATCH_CRITERIA_ENABLE_OUTER_HEADERS:=0): 'MLX5_QUERY_FLOW_GROUP_OUT_MATCH_CRITERIA_ENABLE_OUTER_HEADERS', (MLX5_QUERY_FLOW_GROUP_OUT_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS:=1): 'MLX5_QUERY_FLOW_GROUP_OUT_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS', (MLX5_QUERY_FLOW_GROUP_OUT_MATCH_CRITERIA_ENABLE_INNER_HEADERS:=2): 'MLX5_QUERY_FLOW_GROUP_OUT_MATCH_CRITERIA_ENABLE_INNER_HEADERS', (MLX5_QUERY_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_2:=3): 'MLX5_QUERY_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_2', (MLX5_QUERY_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_3:=4): 'MLX5_QUERY_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_3', (MLX5_QUERY_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_4:=5): 'MLX5_QUERY_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_4', (MLX5_QUERY_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_5:=6): 'MLX5_QUERY_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_5'} +@c.record +class struct_mlx5_ifc_query_flow_group_out_bits(c.Struct): + SIZE = 8192 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[160]] + start_flow_index: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[32]] + end_flow_index: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[160]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[24]] + match_criteria_enable: c.Array[ctypes.c_ubyte, Literal[8]] + match_criteria: struct_mlx5_ifc_fte_match_param_bits + reserved_at_1200: c.Array[ctypes.c_ubyte, Literal[3584]] +struct_mlx5_ifc_query_flow_group_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[160]], 64), ('start_flow_index', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('end_flow_index', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[160]], 320), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[24]], 480), ('match_criteria_enable', c.Array[ctypes.c_ubyte, Literal[8]], 504), ('match_criteria', struct_mlx5_ifc_fte_match_param_bits, 512), ('reserved_at_1200', c.Array[ctypes.c_ubyte, Literal[3584]], 4608)]) +@c.record +class struct_mlx5_ifc_query_flow_group_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + group_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[288]] +struct_mlx5_ifc_query_flow_group_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('group_id', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[288]], 224)]) +@c.record +class struct_mlx5_ifc_query_flow_counter_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + flow_statistics: c.Array[struct_mlx5_ifc_traffic_counter_bits, Literal[0]] +struct_mlx5_ifc_query_flow_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('flow_statistics', c.Array[struct_mlx5_ifc_traffic_counter_bits, Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_query_flow_counter_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[128]] + clear: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_c1: c.Array[ctypes.c_ubyte, Literal[15]] + num_of_counters: c.Array[ctypes.c_ubyte, Literal[16]] + flow_counter_id: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_flow_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[128]], 64), ('clear', c.Array[ctypes.c_ubyte, Literal[1]], 192), ('reserved_at_c1', c.Array[ctypes.c_ubyte, Literal[15]], 193), ('num_of_counters', c.Array[ctypes.c_ubyte, Literal[16]], 208), ('flow_counter_id', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_query_esw_vport_context_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + esw_vport_context: struct_mlx5_ifc_esw_vport_context_bits +struct_mlx5_ifc_query_esw_vport_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('esw_vport_context', struct_mlx5_ifc_esw_vport_context_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_esw_vport_context_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_esw_vport_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_esw_vport_out_bits(c.Struct): + SIZE = 96 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_esw_vport_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_esw_vport_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + vport_num: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_esw_vport_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('vport_num', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_modify_esw_vport_context_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_esw_vport_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_esw_vport_context_fields_select_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[27]] + fdb_to_vport_reg_c_id: c.Array[ctypes.c_ubyte, Literal[1]] + vport_cvlan_insert: c.Array[ctypes.c_ubyte, Literal[1]] + vport_svlan_insert: c.Array[ctypes.c_ubyte, Literal[1]] + vport_cvlan_strip: c.Array[ctypes.c_ubyte, Literal[1]] + vport_svlan_strip: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_esw_vport_context_fields_select_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[27]], 0), ('fdb_to_vport_reg_c_id', c.Array[ctypes.c_ubyte, Literal[1]], 27), ('vport_cvlan_insert', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('vport_svlan_insert', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('vport_cvlan_strip', c.Array[ctypes.c_ubyte, Literal[1]], 30), ('vport_svlan_strip', c.Array[ctypes.c_ubyte, Literal[1]], 31)]) +@c.record +class struct_mlx5_ifc_modify_esw_vport_context_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + field_select: struct_mlx5_ifc_esw_vport_context_fields_select_bits + esw_vport_context: struct_mlx5_ifc_esw_vport_context_bits +struct_mlx5_ifc_modify_esw_vport_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('field_select', struct_mlx5_ifc_esw_vport_context_fields_select_bits, 96), ('esw_vport_context', struct_mlx5_ifc_esw_vport_context_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_eq_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + eq_context_entry: struct_mlx5_ifc_eqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[64]] + event_bitmask: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_300: c.Array[ctypes.c_ubyte, Literal[1408]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_query_eq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('eq_context_entry', struct_mlx5_ifc_eqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[64]], 640), ('event_bitmask', c.Array[ctypes.c_ubyte, Literal[64]], 704), ('reserved_at_300', c.Array[ctypes.c_ubyte, Literal[1408]], 768), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_query_eq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + eq_number: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_eq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('eq_number', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_packet_reformat_context_in_bits(c.Struct): + SIZE = 64 + reformat_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[4]] + reformat_param_0: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[6]] + reformat_data_size: c.Array[ctypes.c_ubyte, Literal[10]] + reformat_param_1: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_28: c.Array[ctypes.c_ubyte, Literal[8]] + reformat_data: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[2]] + more_reformat_data: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[0]] +struct_mlx5_ifc_packet_reformat_context_in_bits.register_fields([('reformat_type', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[4]], 8), ('reformat_param_0', c.Array[ctypes.c_ubyte, Literal[4]], 12), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[6]], 16), ('reformat_data_size', c.Array[ctypes.c_ubyte, Literal[10]], 22), ('reformat_param_1', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('reserved_at_28', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('reformat_data', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[2]], 48), ('more_reformat_data', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[0]], 64)]) +@c.record +class struct_mlx5_ifc_query_packet_reformat_context_out_bits(c.Struct): + SIZE = 224 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[160]] + packet_reformat_context: c.Array[struct_mlx5_ifc_packet_reformat_context_in_bits, Literal[0]] +struct_mlx5_ifc_query_packet_reformat_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[160]], 64), ('packet_reformat_context', c.Array[struct_mlx5_ifc_packet_reformat_context_in_bits, Literal[0]], 224)]) +@c.record +class struct_mlx5_ifc_query_packet_reformat_context_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + packet_reformat_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[160]] +struct_mlx5_ifc_query_packet_reformat_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('packet_reformat_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[160]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_packet_reformat_context_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + packet_reformat_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_packet_reformat_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('packet_reformat_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +_anonenum97: dict[int, str] = {(MLX5_REFORMAT_CONTEXT_ANCHOR_MAC_START:=1): 'MLX5_REFORMAT_CONTEXT_ANCHOR_MAC_START', (MLX5_REFORMAT_CONTEXT_ANCHOR_VLAN_START:=2): 'MLX5_REFORMAT_CONTEXT_ANCHOR_VLAN_START', (MLX5_REFORMAT_CONTEXT_ANCHOR_IP_START:=7): 'MLX5_REFORMAT_CONTEXT_ANCHOR_IP_START', (MLX5_REFORMAT_CONTEXT_ANCHOR_TCP_UDP_START:=9): 'MLX5_REFORMAT_CONTEXT_ANCHOR_TCP_UDP_START'} +enum_mlx5_reformat_ctx_type: dict[int, str] = {(MLX5_REFORMAT_TYPE_L2_TO_VXLAN:=0): 'MLX5_REFORMAT_TYPE_L2_TO_VXLAN', (MLX5_REFORMAT_TYPE_L2_TO_NVGRE:=1): 'MLX5_REFORMAT_TYPE_L2_TO_NVGRE', (MLX5_REFORMAT_TYPE_L2_TO_L2_TUNNEL:=2): 'MLX5_REFORMAT_TYPE_L2_TO_L2_TUNNEL', (MLX5_REFORMAT_TYPE_L3_TUNNEL_TO_L2:=3): 'MLX5_REFORMAT_TYPE_L3_TUNNEL_TO_L2', (MLX5_REFORMAT_TYPE_L2_TO_L3_TUNNEL:=4): 'MLX5_REFORMAT_TYPE_L2_TO_L3_TUNNEL', (MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV4:=5): 'MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV4', (MLX5_REFORMAT_TYPE_L2_TO_L3_ESP_TUNNEL:=6): 'MLX5_REFORMAT_TYPE_L2_TO_L3_ESP_TUNNEL', (MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_UDPV4:=7): 'MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_UDPV4', (MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT:=8): 'MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT', (MLX5_REFORMAT_TYPE_L3_ESP_TUNNEL_TO_L2:=9): 'MLX5_REFORMAT_TYPE_L3_ESP_TUNNEL_TO_L2', (MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT_OVER_UDP:=10): 'MLX5_REFORMAT_TYPE_DEL_ESP_TRANSPORT_OVER_UDP', (MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV6:=11): 'MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_IPV6', (MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_UDPV6:=12): 'MLX5_REFORMAT_TYPE_ADD_ESP_TRANSPORT_OVER_UDPV6', (MLX5_REFORMAT_TYPE_ADD_PSP_TUNNEL:=13): 'MLX5_REFORMAT_TYPE_ADD_PSP_TUNNEL', (MLX5_REFORMAT_TYPE_DEL_PSP_TUNNEL:=14): 'MLX5_REFORMAT_TYPE_DEL_PSP_TUNNEL', (MLX5_REFORMAT_TYPE_INSERT_HDR:=15): 'MLX5_REFORMAT_TYPE_INSERT_HDR', (MLX5_REFORMAT_TYPE_REMOVE_HDR:=16): 'MLX5_REFORMAT_TYPE_REMOVE_HDR', (MLX5_REFORMAT_TYPE_ADD_MACSEC:=17): 'MLX5_REFORMAT_TYPE_ADD_MACSEC', (MLX5_REFORMAT_TYPE_DEL_MACSEC:=18): 'MLX5_REFORMAT_TYPE_DEL_MACSEC'} +@c.record +class struct_mlx5_ifc_alloc_packet_reformat_context_in_bits(c.Struct): + SIZE = 288 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[160]] + packet_reformat_context: struct_mlx5_ifc_packet_reformat_context_in_bits +struct_mlx5_ifc_alloc_packet_reformat_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[160]], 64), ('packet_reformat_context', struct_mlx5_ifc_packet_reformat_context_in_bits, 224)]) +@c.record +class struct_mlx5_ifc_dealloc_packet_reformat_context_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_packet_reformat_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_packet_reformat_context_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + packet_reformat_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_packet_reformat_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('packet_reformat_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_set_action_in_bits(c.Struct): + SIZE = 64 + action_type: c.Array[ctypes.c_ubyte, Literal[4]] + field: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[3]] + offset: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[3]] + length: c.Array[ctypes.c_ubyte, Literal[5]] + data: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_set_action_in_bits.register_fields([('action_type', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('field', c.Array[ctypes.c_ubyte, Literal[12]], 4), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[3]], 16), ('offset', c.Array[ctypes.c_ubyte, Literal[5]], 19), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[3]], 24), ('length', c.Array[ctypes.c_ubyte, Literal[5]], 27), ('data', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_add_action_in_bits(c.Struct): + SIZE = 64 + action_type: c.Array[ctypes.c_ubyte, Literal[4]] + field: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + data: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_add_action_in_bits.register_fields([('action_type', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('field', c.Array[ctypes.c_ubyte, Literal[12]], 4), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('data', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_copy_action_in_bits(c.Struct): + SIZE = 64 + action_type: c.Array[ctypes.c_ubyte, Literal[4]] + src_field: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[3]] + src_offset: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[3]] + length: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[4]] + dst_field: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[3]] + dst_offset: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_copy_action_in_bits.register_fields([('action_type', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('src_field', c.Array[ctypes.c_ubyte, Literal[12]], 4), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[3]], 16), ('src_offset', c.Array[ctypes.c_ubyte, Literal[5]], 19), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[3]], 24), ('length', c.Array[ctypes.c_ubyte, Literal[5]], 27), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[4]], 32), ('dst_field', c.Array[ctypes.c_ubyte, Literal[12]], 36), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[3]], 48), ('dst_offset', c.Array[ctypes.c_ubyte, Literal[5]], 51), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[8]], 56)]) +@c.record +class union_mlx5_ifc_set_add_copy_action_in_auto_bits(c.Struct): + SIZE = 64 + set_action_in: struct_mlx5_ifc_set_action_in_bits + add_action_in: struct_mlx5_ifc_add_action_in_bits + copy_action_in: struct_mlx5_ifc_copy_action_in_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[64]] +union_mlx5_ifc_set_add_copy_action_in_auto_bits.register_fields([('set_action_in', struct_mlx5_ifc_set_action_in_bits, 0), ('add_action_in', struct_mlx5_ifc_add_action_in_bits, 0), ('copy_action_in', struct_mlx5_ifc_copy_action_in_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[64]], 0)]) +_anonenum98: dict[int, str] = {(MLX5_ACTION_TYPE_SET:=1): 'MLX5_ACTION_TYPE_SET', (MLX5_ACTION_TYPE_ADD:=2): 'MLX5_ACTION_TYPE_ADD', (MLX5_ACTION_TYPE_COPY:=3): 'MLX5_ACTION_TYPE_COPY'} +_anonenum99: dict[int, str] = {(MLX5_ACTION_IN_FIELD_OUT_SMAC_47_16:=1): 'MLX5_ACTION_IN_FIELD_OUT_SMAC_47_16', (MLX5_ACTION_IN_FIELD_OUT_SMAC_15_0:=2): 'MLX5_ACTION_IN_FIELD_OUT_SMAC_15_0', (MLX5_ACTION_IN_FIELD_OUT_ETHERTYPE:=3): 'MLX5_ACTION_IN_FIELD_OUT_ETHERTYPE', (MLX5_ACTION_IN_FIELD_OUT_DMAC_47_16:=4): 'MLX5_ACTION_IN_FIELD_OUT_DMAC_47_16', (MLX5_ACTION_IN_FIELD_OUT_DMAC_15_0:=5): 'MLX5_ACTION_IN_FIELD_OUT_DMAC_15_0', (MLX5_ACTION_IN_FIELD_OUT_IP_DSCP:=6): 'MLX5_ACTION_IN_FIELD_OUT_IP_DSCP', (MLX5_ACTION_IN_FIELD_OUT_TCP_FLAGS:=7): 'MLX5_ACTION_IN_FIELD_OUT_TCP_FLAGS', (MLX5_ACTION_IN_FIELD_OUT_TCP_SPORT:=8): 'MLX5_ACTION_IN_FIELD_OUT_TCP_SPORT', (MLX5_ACTION_IN_FIELD_OUT_TCP_DPORT:=9): 'MLX5_ACTION_IN_FIELD_OUT_TCP_DPORT', (MLX5_ACTION_IN_FIELD_OUT_IP_TTL:=10): 'MLX5_ACTION_IN_FIELD_OUT_IP_TTL', (MLX5_ACTION_IN_FIELD_OUT_UDP_SPORT:=11): 'MLX5_ACTION_IN_FIELD_OUT_UDP_SPORT', (MLX5_ACTION_IN_FIELD_OUT_UDP_DPORT:=12): 'MLX5_ACTION_IN_FIELD_OUT_UDP_DPORT', (MLX5_ACTION_IN_FIELD_OUT_SIPV6_127_96:=13): 'MLX5_ACTION_IN_FIELD_OUT_SIPV6_127_96', (MLX5_ACTION_IN_FIELD_OUT_SIPV6_95_64:=14): 'MLX5_ACTION_IN_FIELD_OUT_SIPV6_95_64', (MLX5_ACTION_IN_FIELD_OUT_SIPV6_63_32:=15): 'MLX5_ACTION_IN_FIELD_OUT_SIPV6_63_32', (MLX5_ACTION_IN_FIELD_OUT_SIPV6_31_0:=16): 'MLX5_ACTION_IN_FIELD_OUT_SIPV6_31_0', (MLX5_ACTION_IN_FIELD_OUT_DIPV6_127_96:=17): 'MLX5_ACTION_IN_FIELD_OUT_DIPV6_127_96', (MLX5_ACTION_IN_FIELD_OUT_DIPV6_95_64:=18): 'MLX5_ACTION_IN_FIELD_OUT_DIPV6_95_64', (MLX5_ACTION_IN_FIELD_OUT_DIPV6_63_32:=19): 'MLX5_ACTION_IN_FIELD_OUT_DIPV6_63_32', (MLX5_ACTION_IN_FIELD_OUT_DIPV6_31_0:=20): 'MLX5_ACTION_IN_FIELD_OUT_DIPV6_31_0', (MLX5_ACTION_IN_FIELD_OUT_SIPV4:=21): 'MLX5_ACTION_IN_FIELD_OUT_SIPV4', (MLX5_ACTION_IN_FIELD_OUT_DIPV4:=22): 'MLX5_ACTION_IN_FIELD_OUT_DIPV4', (MLX5_ACTION_IN_FIELD_OUT_FIRST_VID:=23): 'MLX5_ACTION_IN_FIELD_OUT_FIRST_VID', (MLX5_ACTION_IN_FIELD_OUT_IPV6_HOPLIMIT:=71): 'MLX5_ACTION_IN_FIELD_OUT_IPV6_HOPLIMIT', (MLX5_ACTION_IN_FIELD_METADATA_REG_A:=73): 'MLX5_ACTION_IN_FIELD_METADATA_REG_A', (MLX5_ACTION_IN_FIELD_METADATA_REG_B:=80): 'MLX5_ACTION_IN_FIELD_METADATA_REG_B', (MLX5_ACTION_IN_FIELD_METADATA_REG_C_0:=81): 'MLX5_ACTION_IN_FIELD_METADATA_REG_C_0', (MLX5_ACTION_IN_FIELD_METADATA_REG_C_1:=82): 'MLX5_ACTION_IN_FIELD_METADATA_REG_C_1', (MLX5_ACTION_IN_FIELD_METADATA_REG_C_2:=83): 'MLX5_ACTION_IN_FIELD_METADATA_REG_C_2', (MLX5_ACTION_IN_FIELD_METADATA_REG_C_3:=84): 'MLX5_ACTION_IN_FIELD_METADATA_REG_C_3', (MLX5_ACTION_IN_FIELD_METADATA_REG_C_4:=85): 'MLX5_ACTION_IN_FIELD_METADATA_REG_C_4', (MLX5_ACTION_IN_FIELD_METADATA_REG_C_5:=86): 'MLX5_ACTION_IN_FIELD_METADATA_REG_C_5', (MLX5_ACTION_IN_FIELD_METADATA_REG_C_6:=87): 'MLX5_ACTION_IN_FIELD_METADATA_REG_C_6', (MLX5_ACTION_IN_FIELD_METADATA_REG_C_7:=88): 'MLX5_ACTION_IN_FIELD_METADATA_REG_C_7', (MLX5_ACTION_IN_FIELD_OUT_TCP_SEQ_NUM:=89): 'MLX5_ACTION_IN_FIELD_OUT_TCP_SEQ_NUM', (MLX5_ACTION_IN_FIELD_OUT_TCP_ACK_NUM:=91): 'MLX5_ACTION_IN_FIELD_OUT_TCP_ACK_NUM', (MLX5_ACTION_IN_FIELD_IPSEC_SYNDROME:=93): 'MLX5_ACTION_IN_FIELD_IPSEC_SYNDROME', (MLX5_ACTION_IN_FIELD_OUT_EMD_47_32:=111): 'MLX5_ACTION_IN_FIELD_OUT_EMD_47_32', (MLX5_ACTION_IN_FIELD_OUT_EMD_31_0:=112): 'MLX5_ACTION_IN_FIELD_OUT_EMD_31_0', (MLX5_ACTION_IN_FIELD_PSP_SYNDROME:=113): 'MLX5_ACTION_IN_FIELD_PSP_SYNDROME'} +@c.record +class struct_mlx5_ifc_alloc_modify_header_context_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + modify_header_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_modify_header_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('modify_header_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_modify_header_context_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_actions: c.Array[ctypes.c_ubyte, Literal[8]] + actions: c.Array[union_mlx5_ifc_set_add_copy_action_in_auto_bits, Literal[0]] +struct_mlx5_ifc_alloc_modify_header_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[16]], 104), ('num_of_actions', c.Array[ctypes.c_ubyte, Literal[8]], 120), ('actions', c.Array[union_mlx5_ifc_set_add_copy_action_in_auto_bits, Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_dealloc_modify_header_context_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_modify_header_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_modify_header_context_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + modify_header_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_modify_header_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('modify_header_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_modify_header_context_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + modify_header_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[160]] +struct_mlx5_ifc_query_modify_header_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('modify_header_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[160]], 96)]) +@c.record +class struct_mlx5_ifc_query_dct_out_bits(c.Struct): + SIZE = 1024 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + dct_context_entry: struct_mlx5_ifc_dctc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_query_dct_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('dct_context_entry', struct_mlx5_ifc_dctc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[384]], 640)]) +@c.record +class struct_mlx5_ifc_query_dct_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + dctn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_dct_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('dctn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_cq_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + cq_context: struct_mlx5_ifc_cqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[1536]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_query_cq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('cq_context', struct_mlx5_ifc_cqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[1536]], 640), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_query_cq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_cq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_cong_status_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + enable: c.Array[ctypes.c_ubyte, Literal[1]] + tag_enable: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_62: c.Array[ctypes.c_ubyte, Literal[30]] +struct_mlx5_ifc_query_cong_status_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('enable', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('tag_enable', c.Array[ctypes.c_ubyte, Literal[1]], 97), ('reserved_at_62', c.Array[ctypes.c_ubyte, Literal[30]], 98)]) +@c.record +class struct_mlx5_ifc_query_cong_status_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + priority: c.Array[ctypes.c_ubyte, Literal[4]] + cong_protocol: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_cong_status_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('priority', c.Array[ctypes.c_ubyte, Literal[4]], 88), ('cong_protocol', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_cong_statistics_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + rp_cur_flows: c.Array[ctypes.c_ubyte, Literal[32]] + sum_flows: c.Array[ctypes.c_ubyte, Literal[32]] + rp_cnp_ignored_high: c.Array[ctypes.c_ubyte, Literal[32]] + rp_cnp_ignored_low: c.Array[ctypes.c_ubyte, Literal[32]] + rp_cnp_handled_high: c.Array[ctypes.c_ubyte, Literal[32]] + rp_cnp_handled_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[256]] + time_stamp_high: c.Array[ctypes.c_ubyte, Literal[32]] + time_stamp_low: c.Array[ctypes.c_ubyte, Literal[32]] + accumulators_period: c.Array[ctypes.c_ubyte, Literal[32]] + np_ecn_marked_roce_packets_high: c.Array[ctypes.c_ubyte, Literal[32]] + np_ecn_marked_roce_packets_low: c.Array[ctypes.c_ubyte, Literal[32]] + np_cnp_sent_high: c.Array[ctypes.c_ubyte, Literal[32]] + np_cnp_sent_low: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_320: c.Array[ctypes.c_ubyte, Literal[1376]] +struct_mlx5_ifc_query_cong_statistics_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('rp_cur_flows', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('sum_flows', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('rp_cnp_ignored_high', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('rp_cnp_ignored_low', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('rp_cnp_handled_high', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('rp_cnp_handled_low', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[256]], 320), ('time_stamp_high', c.Array[ctypes.c_ubyte, Literal[32]], 576), ('time_stamp_low', c.Array[ctypes.c_ubyte, Literal[32]], 608), ('accumulators_period', c.Array[ctypes.c_ubyte, Literal[32]], 640), ('np_ecn_marked_roce_packets_high', c.Array[ctypes.c_ubyte, Literal[32]], 672), ('np_ecn_marked_roce_packets_low', c.Array[ctypes.c_ubyte, Literal[32]], 704), ('np_cnp_sent_high', c.Array[ctypes.c_ubyte, Literal[32]], 736), ('np_cnp_sent_low', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('reserved_at_320', c.Array[ctypes.c_ubyte, Literal[1376]], 800)]) +@c.record +class struct_mlx5_ifc_query_cong_statistics_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + clear: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_cong_statistics_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('clear', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[31]], 65), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_cong_params_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + congestion_parameters: union_mlx5_ifc_cong_control_roce_ecn_auto_bits +struct_mlx5_ifc_query_cong_params_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('congestion_parameters', union_mlx5_ifc_cong_control_roce_ecn_auto_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_cong_params_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[28]] + cong_protocol: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_cong_params_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[28]], 64), ('cong_protocol', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_adapter_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + query_adapter_struct: struct_mlx5_ifc_query_adapter_param_block_bits +struct_mlx5_ifc_query_adapter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('query_adapter_struct', struct_mlx5_ifc_query_adapter_param_block_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_adapter_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_adapter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_function_vhca_rid_info_reg_bits(c.Struct): + SIZE = 128 + host_number: c.Array[ctypes.c_ubyte, Literal[8]] + host_pci_device_function: c.Array[ctypes.c_ubyte, Literal[8]] + host_pci_bus: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[3]] + pci_bus_assigned: c.Array[ctypes.c_ubyte, Literal[1]] + function_type: c.Array[ctypes.c_ubyte, Literal[4]] + parent_pci_device_function: c.Array[ctypes.c_ubyte, Literal[8]] + parent_pci_bus: c.Array[ctypes.c_ubyte, Literal[8]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_function_vhca_rid_info_reg_bits.register_fields([('host_number', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('host_pci_device_function', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('host_pci_bus', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[3]], 24), ('pci_bus_assigned', c.Array[ctypes.c_ubyte, Literal[1]], 27), ('function_type', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('parent_pci_device_function', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('parent_pci_bus', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_delegated_function_vhca_rid_info_bits(c.Struct): + SIZE = 256 + function_vhca_rid_info: struct_mlx5_ifc_function_vhca_rid_info_reg_bits + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[24]] + manage_profile: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_delegated_function_vhca_rid_info_bits.register_fields([('function_vhca_rid_info', struct_mlx5_ifc_function_vhca_rid_info_reg_bits, 0), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[24]], 128), ('manage_profile', c.Array[ctypes.c_ubyte, Literal[8]], 152), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[96]], 160)]) +@c.record +class struct_mlx5_ifc_query_delegated_vhca_out_bits(c.Struct): + SIZE = 256 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + functions_count: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[128]] + delegated_function_vhca_rid_info: c.Array[struct_mlx5_ifc_delegated_function_vhca_rid_info_bits, Literal[0]] +struct_mlx5_ifc_query_delegated_vhca_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('functions_count', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[128]], 128), ('delegated_function_vhca_rid_info', c.Array[struct_mlx5_ifc_delegated_function_vhca_rid_info_bits, Literal[0]], 256)]) +@c.record +class struct_mlx5_ifc_query_delegated_vhca_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_delegated_vhca_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_create_esw_vport_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + vport_num: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_create_esw_vport_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('vport_num', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_create_esw_vport_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + managed_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_esw_vport_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('managed_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_qp_2rst_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_qp_2rst_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_qp_2rst_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_qp_2rst_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_qp_2err_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_qp_2err_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_qp_2err_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_qp_2err_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_trans_page_fault_info_bits(c.Struct): + SIZE = 64 + error: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[4]] + page_fault_type: c.Array[ctypes.c_ubyte, Literal[3]] + wq_number: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + fault_token: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_trans_page_fault_info_bits.register_fields([('error', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[4]], 1), ('page_fault_type', c.Array[ctypes.c_ubyte, Literal[3]], 5), ('wq_number', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('fault_token', c.Array[ctypes.c_ubyte, Literal[24]], 40)]) +@c.record +class struct_mlx5_ifc_mem_page_fault_info_bits(c.Struct): + SIZE = 64 + error: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[15]] + fault_token_47_32: c.Array[ctypes.c_ubyte, Literal[16]] + fault_token_31_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mem_page_fault_info_bits.register_fields([('error', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[15]], 1), ('fault_token_47_32', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('fault_token_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class union_mlx5_ifc_page_fault_resume_in_page_fault_info_auto_bits(c.Struct): + SIZE = 64 + trans_page_fault_info: struct_mlx5_ifc_trans_page_fault_info_bits + mem_page_fault_info: struct_mlx5_ifc_mem_page_fault_info_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[64]] +union_mlx5_ifc_page_fault_resume_in_page_fault_info_auto_bits.register_fields([('trans_page_fault_info', struct_mlx5_ifc_trans_page_fault_info_bits, 0), ('mem_page_fault_info', struct_mlx5_ifc_mem_page_fault_info_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[64]], 0)]) +@c.record +class struct_mlx5_ifc_page_fault_resume_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_page_fault_resume_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_page_fault_resume_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + page_fault_info: union_mlx5_ifc_page_fault_resume_in_page_fault_info_auto_bits +struct_mlx5_ifc_page_fault_resume_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('page_fault_info', union_mlx5_ifc_page_fault_resume_in_page_fault_info_auto_bits, 64)]) +@c.record +class struct_mlx5_ifc_nop_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_nop_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_nop_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_nop_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_vport_state_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_vport_state_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_vport_state_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + ingress_connect: c.Array[ctypes.c_ubyte, Literal[1]] + egress_connect: c.Array[ctypes.c_ubyte, Literal[1]] + ingress_connect_valid: c.Array[ctypes.c_ubyte, Literal[1]] + egress_connect_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_74: c.Array[ctypes.c_ubyte, Literal[4]] + admin_state: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_7c: c.Array[ctypes.c_ubyte, Literal[4]] +struct_mlx5_ifc_modify_vport_state_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('ingress_connect', c.Array[ctypes.c_ubyte, Literal[1]], 112), ('egress_connect', c.Array[ctypes.c_ubyte, Literal[1]], 113), ('ingress_connect_valid', c.Array[ctypes.c_ubyte, Literal[1]], 114), ('egress_connect_valid', c.Array[ctypes.c_ubyte, Literal[1]], 115), ('reserved_at_74', c.Array[ctypes.c_ubyte, Literal[4]], 116), ('admin_state', c.Array[ctypes.c_ubyte, Literal[4]], 120), ('reserved_at_7c', c.Array[ctypes.c_ubyte, Literal[4]], 124)]) +@c.record +class struct_mlx5_ifc_modify_tis_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_tis_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_tis_bitmask_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[29]] + lag_tx_port_affinity: c.Array[ctypes.c_ubyte, Literal[1]] + strict_lag_tx_port_affinity: c.Array[ctypes.c_ubyte, Literal[1]] + prio: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_modify_tis_bitmask_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[29]], 32), ('lag_tx_port_affinity', c.Array[ctypes.c_ubyte, Literal[1]], 61), ('strict_lag_tx_port_affinity', c.Array[ctypes.c_ubyte, Literal[1]], 62), ('prio', c.Array[ctypes.c_ubyte, Literal[1]], 63)]) +@c.record +class struct_mlx5_ifc_modify_tis_in_bits(c.Struct): + SIZE = 1536 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + tisn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + bitmask: struct_mlx5_ifc_modify_tis_bitmask_bits + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + ctx: struct_mlx5_ifc_tisc_bits +struct_mlx5_ifc_modify_tis_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('tisn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('bitmask', struct_mlx5_ifc_modify_tis_bitmask_bits, 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('ctx', struct_mlx5_ifc_tisc_bits, 256)]) +@c.record +class struct_mlx5_ifc_modify_tir_bitmask_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[27]] + self_lb_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3c: c.Array[ctypes.c_ubyte, Literal[1]] + hash: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3e: c.Array[ctypes.c_ubyte, Literal[1]] + packet_merge: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_modify_tir_bitmask_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[27]], 32), ('self_lb_en', c.Array[ctypes.c_ubyte, Literal[1]], 59), ('reserved_at_3c', c.Array[ctypes.c_ubyte, Literal[1]], 60), ('hash', c.Array[ctypes.c_ubyte, Literal[1]], 61), ('reserved_at_3e', c.Array[ctypes.c_ubyte, Literal[1]], 62), ('packet_merge', c.Array[ctypes.c_ubyte, Literal[1]], 63)]) +@c.record +class struct_mlx5_ifc_modify_tir_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_tir_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_tir_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + tirn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + bitmask: struct_mlx5_ifc_modify_tir_bitmask_bits + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + ctx: struct_mlx5_ifc_tirc_bits +struct_mlx5_ifc_modify_tir_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('tirn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('bitmask', struct_mlx5_ifc_modify_tir_bitmask_bits, 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('ctx', struct_mlx5_ifc_tirc_bits, 256)]) +@c.record +class struct_mlx5_ifc_modify_sq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_sq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_sq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + sq_state: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[4]] + sqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + modify_bitmask: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + ctx: struct_mlx5_ifc_sqc_bits +struct_mlx5_ifc_modify_sq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('sq_state', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('sqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('modify_bitmask', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('ctx', struct_mlx5_ifc_sqc_bits, 256)]) +@c.record +class struct_mlx5_ifc_modify_scheduling_element_out_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[448]] +struct_mlx5_ifc_modify_scheduling_element_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[448]], 64)]) +_anonenum100: dict[int, str] = {(MODIFY_SCHEDULING_ELEMENT_IN_MODIFY_BITMASK_BW_SHARE:=1): 'MODIFY_SCHEDULING_ELEMENT_IN_MODIFY_BITMASK_BW_SHARE', (MODIFY_SCHEDULING_ELEMENT_IN_MODIFY_BITMASK_MAX_AVERAGE_BW:=2): 'MODIFY_SCHEDULING_ELEMENT_IN_MODIFY_BITMASK_MAX_AVERAGE_BW'} +@c.record +class struct_mlx5_ifc_modify_scheduling_element_in_bits(c.Struct): + SIZE = 1024 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + scheduling_hierarchy: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[24]] + scheduling_element_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[32]] + modify_bitmask: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + scheduling_context: struct_mlx5_ifc_scheduling_context_bits + reserved_at_300: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_modify_scheduling_element_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('scheduling_hierarchy', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('scheduling_element_id', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('modify_bitmask', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('scheduling_context', struct_mlx5_ifc_scheduling_context_bits, 256), ('reserved_at_300', c.Array[ctypes.c_ubyte, Literal[256]], 768)]) +@c.record +class struct_mlx5_ifc_modify_rqt_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_rqt_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_rqt_bitmask_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[31]] + rqn_list: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_rqt_bitmask_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[31]], 32), ('rqn_list', c.Array[ctypes.c_ubyte, Literal[1]], 63)]) +@c.record +class struct_mlx5_ifc_modify_rqt_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rqtn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + bitmask: struct_mlx5_ifc_rqt_bitmask_bits + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + ctx: struct_mlx5_ifc_rqtc_bits +struct_mlx5_ifc_modify_rqt_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rqtn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('bitmask', struct_mlx5_ifc_rqt_bitmask_bits, 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('ctx', struct_mlx5_ifc_rqtc_bits, 256)]) +@c.record +class struct_mlx5_ifc_modify_rq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_rq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +_anonenum101: dict[int, str] = {(MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_VSD:=2): 'MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_VSD', (MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_SCATTER_FCS:=4): 'MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_SCATTER_FCS', (MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_RQ_COUNTER_SET_ID:=8): 'MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_RQ_COUNTER_SET_ID'} +@c.record +class struct_mlx5_ifc_modify_rq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + rq_state: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[4]] + rqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + modify_bitmask: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + ctx: struct_mlx5_ifc_rqc_bits +struct_mlx5_ifc_modify_rq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('rq_state', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('rqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('modify_bitmask', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('ctx', struct_mlx5_ifc_rqc_bits, 256)]) +@c.record +class struct_mlx5_ifc_modify_rmp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_rmp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_rmp_bitmask_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[31]] + lwm: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_rmp_bitmask_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[31]], 32), ('lwm', c.Array[ctypes.c_ubyte, Literal[1]], 63)]) +@c.record +class struct_mlx5_ifc_modify_rmp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + rmp_state: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[4]] + rmpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + bitmask: struct_mlx5_ifc_rmp_bitmask_bits + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + ctx: struct_mlx5_ifc_rmpc_bits +struct_mlx5_ifc_modify_rmp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('rmp_state', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('rmpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('bitmask', struct_mlx5_ifc_rmp_bitmask_bits, 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('ctx', struct_mlx5_ifc_rmpc_bits, 256)]) +@c.record +class struct_mlx5_ifc_modify_nic_vport_context_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_nic_vport_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_nic_vport_field_select_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[18]] + affiliation: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_13: c.Array[ctypes.c_ubyte, Literal[1]] + disable_uc_local_lb: c.Array[ctypes.c_ubyte, Literal[1]] + disable_mc_local_lb: c.Array[ctypes.c_ubyte, Literal[1]] + node_guid: c.Array[ctypes.c_ubyte, Literal[1]] + port_guid: c.Array[ctypes.c_ubyte, Literal[1]] + min_inline: c.Array[ctypes.c_ubyte, Literal[1]] + mtu: c.Array[ctypes.c_ubyte, Literal[1]] + change_event: c.Array[ctypes.c_ubyte, Literal[1]] + promisc: c.Array[ctypes.c_ubyte, Literal[1]] + permanent_address: c.Array[ctypes.c_ubyte, Literal[1]] + addresses_list: c.Array[ctypes.c_ubyte, Literal[1]] + roce_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1f: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_modify_nic_vport_field_select_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[18]], 0), ('affiliation', c.Array[ctypes.c_ubyte, Literal[1]], 18), ('reserved_at_13', c.Array[ctypes.c_ubyte, Literal[1]], 19), ('disable_uc_local_lb', c.Array[ctypes.c_ubyte, Literal[1]], 20), ('disable_mc_local_lb', c.Array[ctypes.c_ubyte, Literal[1]], 21), ('node_guid', c.Array[ctypes.c_ubyte, Literal[1]], 22), ('port_guid', c.Array[ctypes.c_ubyte, Literal[1]], 23), ('min_inline', c.Array[ctypes.c_ubyte, Literal[1]], 24), ('mtu', c.Array[ctypes.c_ubyte, Literal[1]], 25), ('change_event', c.Array[ctypes.c_ubyte, Literal[1]], 26), ('promisc', c.Array[ctypes.c_ubyte, Literal[1]], 27), ('permanent_address', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('addresses_list', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('roce_en', c.Array[ctypes.c_ubyte, Literal[1]], 30), ('reserved_at_1f', c.Array[ctypes.c_ubyte, Literal[1]], 31)]) +@c.record +class struct_mlx5_ifc_modify_nic_vport_context_in_bits(c.Struct): + SIZE = 4096 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + field_select: struct_mlx5_ifc_modify_nic_vport_field_select_bits + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[1920]] + nic_vport_context: struct_mlx5_ifc_nic_vport_context_bits +struct_mlx5_ifc_modify_nic_vport_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('field_select', struct_mlx5_ifc_modify_nic_vport_field_select_bits, 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[1920]], 128), ('nic_vport_context', struct_mlx5_ifc_nic_vport_context_bits, 2048)]) +@c.record +class struct_mlx5_ifc_modify_hca_vport_context_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_hca_vport_context_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_hca_vport_context_in_bits(c.Struct): + SIZE = 4224 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[11]] + port_num: c.Array[ctypes.c_ubyte, Literal[4]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + hca_vport_context: struct_mlx5_ifc_hca_vport_context_bits +struct_mlx5_ifc_modify_hca_vport_context_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[11]], 65), ('port_num', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('hca_vport_context', struct_mlx5_ifc_hca_vport_context_bits, 128)]) +@c.record +class struct_mlx5_ifc_modify_cq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_cq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +_anonenum102: dict[int, str] = {(MLX5_MODIFY_CQ_IN_OP_MOD_MODIFY_CQ:=0): 'MLX5_MODIFY_CQ_IN_OP_MOD_MODIFY_CQ', (MLX5_MODIFY_CQ_IN_OP_MOD_RESIZE_CQ:=1): 'MLX5_MODIFY_CQ_IN_OP_MOD_RESIZE_CQ'} +@c.record +class struct_mlx5_ifc_modify_cq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + modify_field_select_resize_field_select: union_mlx5_ifc_modify_field_select_resize_field_select_auto_bits + cq_context: struct_mlx5_ifc_cqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[96]] + cq_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2e1: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_300: c.Array[ctypes.c_ubyte, Literal[1408]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_modify_cq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('modify_field_select_resize_field_select', union_mlx5_ifc_modify_field_select_resize_field_select_auto_bits, 96), ('cq_context', struct_mlx5_ifc_cqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[96]], 640), ('cq_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 736), ('reserved_at_2e1', c.Array[ctypes.c_ubyte, Literal[31]], 737), ('reserved_at_300', c.Array[ctypes.c_ubyte, Literal[1408]], 768), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_modify_cong_status_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_cong_status_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_cong_status_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + priority: c.Array[ctypes.c_ubyte, Literal[4]] + cong_protocol: c.Array[ctypes.c_ubyte, Literal[4]] + enable: c.Array[ctypes.c_ubyte, Literal[1]] + tag_enable: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_62: c.Array[ctypes.c_ubyte, Literal[30]] +struct_mlx5_ifc_modify_cong_status_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('priority', c.Array[ctypes.c_ubyte, Literal[4]], 88), ('cong_protocol', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('enable', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('tag_enable', c.Array[ctypes.c_ubyte, Literal[1]], 97), ('reserved_at_62', c.Array[ctypes.c_ubyte, Literal[30]], 98)]) +@c.record +class struct_mlx5_ifc_modify_cong_params_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_cong_params_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_cong_params_in_bits(c.Struct): + SIZE = 2304 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[28]] + cong_protocol: c.Array[ctypes.c_ubyte, Literal[4]] + field_select: union_mlx5_ifc_field_select_802_1_r_roce_auto_bits + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[128]] + congestion_parameters: union_mlx5_ifc_cong_control_roce_ecn_auto_bits +struct_mlx5_ifc_modify_cong_params_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[28]], 64), ('cong_protocol', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('field_select', union_mlx5_ifc_field_select_802_1_r_roce_auto_bits, 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[128]], 128), ('congestion_parameters', union_mlx5_ifc_cong_control_roce_ecn_auto_bits, 256)]) +@c.record +class struct_mlx5_ifc_manage_pages_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + output_num_entries: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_manage_pages_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('output_num_entries', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 128)]) +_anonenum103: dict[int, str] = {(MLX5_MANAGE_PAGES_IN_OP_MOD_ALLOCATION_FAIL:=0): 'MLX5_MANAGE_PAGES_IN_OP_MOD_ALLOCATION_FAIL', (MLX5_MANAGE_PAGES_IN_OP_MOD_ALLOCATION_SUCCESS:=1): 'MLX5_MANAGE_PAGES_IN_OP_MOD_ALLOCATION_SUCCESS', (MLX5_MANAGE_PAGES_IN_OP_MOD_HCA_RETURN_PAGES:=2): 'MLX5_MANAGE_PAGES_IN_OP_MOD_HCA_RETURN_PAGES'} +@c.record +class struct_mlx5_ifc_manage_pages_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + embedded_cpu_function: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + input_num_entries: c.Array[ctypes.c_ubyte, Literal[32]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_manage_pages_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('embedded_cpu_function', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('input_num_entries', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_mad_ifc_out_bits(c.Struct): + SIZE = 2176 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + response_mad_packet: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[256]] +struct_mlx5_ifc_mad_ifc_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('response_mad_packet', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[256]], 128)]) +@c.record +class struct_mlx5_ifc_mad_ifc_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + remote_lid: c.Array[ctypes.c_ubyte, Literal[16]] + plane_index: c.Array[ctypes.c_ubyte, Literal[8]] + port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + mad: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[256]] +struct_mlx5_ifc_mad_ifc_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('remote_lid', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('plane_index', c.Array[ctypes.c_ubyte, Literal[8]], 80), ('port', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('mad', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[256]], 128)]) +@c.record +class struct_mlx5_ifc_init_hca_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_init_hca_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_init_hca_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[2]] + sw_vhca_id: c.Array[ctypes.c_ubyte, Literal[14]] + reserved_at_70: c.Array[ctypes.c_ubyte, Literal[16]] + sw_owner_id: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]] +struct_mlx5_ifc_init_hca_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[2]], 96), ('sw_vhca_id', c.Array[ctypes.c_ubyte, Literal[14]], 98), ('reserved_at_70', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('sw_owner_id', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]], 128)]) +@c.record +class struct_mlx5_ifc_init2rtr_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_init2rtr_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_init2rtr_qp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_init2rtr_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[128]], 2048)]) +@c.record +class struct_mlx5_ifc_init2init_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_init2init_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_init2init_qp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_init2init_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[128]], 2048)]) +@c.record +class struct_mlx5_ifc_get_dropped_packet_log_out_bits(c.Struct): + SIZE = 1664 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + packet_headers_log: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[128]] + packet_syndrome: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[64]] +struct_mlx5_ifc_get_dropped_packet_log_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('packet_headers_log', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[128]], 128), ('packet_syndrome', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[64]], 1152)]) +@c.record +class struct_mlx5_ifc_get_dropped_packet_log_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_get_dropped_packet_log_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_gen_eqe_in_bits(c.Struct): + SIZE = 640 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + eq_number: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + eqe: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[64]] +struct_mlx5_ifc_gen_eqe_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('eq_number', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('eqe', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[64]], 128)]) +@c.record +class struct_mlx5_ifc_gen_eq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_gen_eq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_enable_hca_out_bits(c.Struct): + SIZE = 96 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_enable_hca_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64)]) +@c.record +class struct_mlx5_ifc_enable_hca_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + embedded_cpu_function: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_enable_hca_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('embedded_cpu_function', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_drain_dct_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_drain_dct_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_drain_dct_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + dctn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_drain_dct_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('dctn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_disable_hca_out_bits(c.Struct): + SIZE = 96 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_disable_hca_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64)]) +@c.record +class struct_mlx5_ifc_disable_hca_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + embedded_cpu_function: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_disable_hca_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('embedded_cpu_function', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_detach_from_mcg_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_detach_from_mcg_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_detach_from_mcg_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + multicast_gid: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] +struct_mlx5_ifc_detach_from_mcg_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('multicast_gid', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 128)]) +@c.record +class struct_mlx5_ifc_destroy_xrq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_xrq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_xrq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_xrq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_xrc_srq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_xrc_srq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_xrc_srq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrc_srqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_xrc_srq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrc_srqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_tis_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_tis_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_tis_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + tisn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_tis_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('tisn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_tir_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_tir_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_tir_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + tirn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_tir_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('tirn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_srq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_srq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_srq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + srqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_srq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('srqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_sq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_sq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_sq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + sqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_sq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('sqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_scheduling_element_out_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[448]] +struct_mlx5_ifc_destroy_scheduling_element_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[448]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_scheduling_element_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + scheduling_hierarchy: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[24]] + scheduling_element_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_destroy_scheduling_element_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('scheduling_hierarchy', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('scheduling_element_id', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +@c.record +class struct_mlx5_ifc_destroy_rqt_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_rqt_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_rqt_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rqtn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_rqt_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rqtn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_rq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_rq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_rq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_rq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_set_delay_drop_params_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + delay_drop_timeout: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_set_delay_drop_params_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('delay_drop_timeout', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_set_delay_drop_params_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_delay_drop_params_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_rmp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_rmp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_rmp_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rmpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_rmp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rmpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_qp_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_psv_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_psv_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_psv_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + psvn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_psv_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('psvn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_mkey_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_mkey_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_mkey_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + mkey_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_mkey_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('mkey_index', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_flow_table_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_flow_table_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_flow_table_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[320]] +struct_mlx5_ifc_destroy_flow_table_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[320]], 192)]) +@c.record +class struct_mlx5_ifc_destroy_flow_group_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_flow_group_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_flow_group_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + group_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[288]] +struct_mlx5_ifc_destroy_flow_group_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('group_id', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[288]], 224)]) +@c.record +class struct_mlx5_ifc_destroy_eq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_eq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_eq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + eq_number: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_eq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('eq_number', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_dct_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_dct_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_dct_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + dctn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_dct_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('dctn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_cq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_cq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_cq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_cq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_delete_vxlan_udp_dport_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_delete_vxlan_udp_dport_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_delete_vxlan_udp_dport_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + vxlan_udp_port: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_delete_vxlan_udp_dport_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('vxlan_udp_port', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_delete_l2_table_entry_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_delete_l2_table_entry_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_delete_l2_table_entry_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[320]] +struct_mlx5_ifc_delete_l2_table_entry_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[96]], 64), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_index', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[320]], 192)]) +@c.record +class struct_mlx5_ifc_delete_fte_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_delete_fte_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_delete_fte_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + flow_index: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[224]] +struct_mlx5_ifc_delete_fte_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('flow_index', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[224]], 288)]) +@c.record +class struct_mlx5_ifc_dealloc_xrcd_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_xrcd_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_xrcd_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrcd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_xrcd_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrcd', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_dealloc_uar_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_uar_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_uar_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + uar: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_uar_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('uar', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_dealloc_transport_domain_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_transport_domain_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_transport_domain_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + transport_domain: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_transport_domain_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('transport_domain', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_dealloc_q_counter_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_q_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_q_counter_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + counter_set_id: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_q_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('counter_set_id', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_dealloc_pd_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_pd_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_pd_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_pd_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_dealloc_flow_counter_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_flow_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_flow_counter_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + flow_counter_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_flow_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('flow_counter_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_xrq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_xrq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_xrq_in_bits(c.Struct): + SIZE = 2688 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + xrq_context: struct_mlx5_ifc_xrqc_bits +struct_mlx5_ifc_create_xrq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('xrq_context', struct_mlx5_ifc_xrqc_bits, 128)]) +@c.record +class struct_mlx5_ifc_create_xrc_srq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrc_srqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_xrc_srq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrc_srqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_xrc_srq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + xrc_srq_context_entry: struct_mlx5_ifc_xrc_srqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[96]] + xrc_srq_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2e1: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_300: c.Array[ctypes.c_ubyte, Literal[1408]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_create_xrc_srq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('xrc_srq_context_entry', struct_mlx5_ifc_xrc_srqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[96]], 640), ('xrc_srq_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 736), ('reserved_at_2e1', c.Array[ctypes.c_ubyte, Literal[31]], 737), ('reserved_at_300', c.Array[ctypes.c_ubyte, Literal[1408]], 768), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_create_tis_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + tisn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_tis_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('tisn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_tis_in_bits(c.Struct): + SIZE = 1536 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + ctx: struct_mlx5_ifc_tisc_bits +struct_mlx5_ifc_create_tis_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('ctx', struct_mlx5_ifc_tisc_bits, 256)]) +@c.record +class struct_mlx5_ifc_create_tir_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + icm_address_63_40: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + icm_address_39_32: c.Array[ctypes.c_ubyte, Literal[8]] + tirn: c.Array[ctypes.c_ubyte, Literal[24]] + icm_address_31_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_tir_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('icm_address_63_40', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('icm_address_39_32', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('tirn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('icm_address_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_tir_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + ctx: struct_mlx5_ifc_tirc_bits +struct_mlx5_ifc_create_tir_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('ctx', struct_mlx5_ifc_tirc_bits, 256)]) +@c.record +class struct_mlx5_ifc_create_srq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + srqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_srq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('srqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_srq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + srq_context_entry: struct_mlx5_ifc_srqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[1536]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_create_srq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('srq_context_entry', struct_mlx5_ifc_srqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[1536]], 640), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_create_sq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + sqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_sq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('sqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_sq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + ctx: struct_mlx5_ifc_sqc_bits +struct_mlx5_ifc_create_sq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('ctx', struct_mlx5_ifc_sqc_bits, 256)]) +@c.record +class struct_mlx5_ifc_create_scheduling_element_out_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + scheduling_element_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[352]] +struct_mlx5_ifc_create_scheduling_element_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('scheduling_element_id', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[352]], 160)]) +@c.record +class struct_mlx5_ifc_create_scheduling_element_in_bits(c.Struct): + SIZE = 1024 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + scheduling_hierarchy: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[160]] + scheduling_context: struct_mlx5_ifc_scheduling_context_bits + reserved_at_300: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_create_scheduling_element_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('scheduling_hierarchy', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[160]], 96), ('scheduling_context', struct_mlx5_ifc_scheduling_context_bits, 256), ('reserved_at_300', c.Array[ctypes.c_ubyte, Literal[256]], 768)]) +@c.record +class struct_mlx5_ifc_create_rqt_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rqtn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_rqt_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rqtn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_rqt_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + rqt_context: struct_mlx5_ifc_rqtc_bits +struct_mlx5_ifc_create_rqt_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('rqt_context', struct_mlx5_ifc_rqtc_bits, 256)]) +@c.record +class struct_mlx5_ifc_create_rq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_rq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_rq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + ctx: struct_mlx5_ifc_rqc_bits +struct_mlx5_ifc_create_rq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('ctx', struct_mlx5_ifc_rqc_bits, 256)]) +@c.record +class struct_mlx5_ifc_create_rmp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + rmpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_rmp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('rmpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_rmp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[192]] + ctx: struct_mlx5_ifc_rmpc_bits +struct_mlx5_ifc_create_rmp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[192]], 64), ('ctx', struct_mlx5_ifc_rmpc_bits, 256)]) +@c.record +class struct_mlx5_ifc_create_qp_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_qp_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_qp_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + qpc_ext: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[7]] + input_qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + opt_param_mask: c.Array[ctypes.c_ubyte, Literal[32]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] + qpc: struct_mlx5_ifc_qpc_bits + wq_umem_offset: c.Array[ctypes.c_ubyte, Literal[64]] + wq_umem_id: c.Array[ctypes.c_ubyte, Literal[32]] + wq_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_861: c.Array[ctypes.c_ubyte, Literal[31]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_create_qp_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('qpc_ext', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[7]], 65), ('input_qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('opt_param_mask', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('qpc', struct_mlx5_ifc_qpc_bits, 192), ('wq_umem_offset', c.Array[ctypes.c_ubyte, Literal[64]], 2048), ('wq_umem_id', c.Array[ctypes.c_ubyte, Literal[32]], 2112), ('wq_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 2144), ('reserved_at_861', c.Array[ctypes.c_ubyte, Literal[31]], 2145), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_create_psv_out_bits(c.Struct): + SIZE = 256 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + psv0_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + psv1_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + psv2_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[8]] + psv3_index: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_create_psv_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('psv0_index', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('psv1_index', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('psv2_index', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[8]], 224), ('psv3_index', c.Array[ctypes.c_ubyte, Literal[24]], 232)]) +@c.record +class struct_mlx5_ifc_create_psv_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + num_psv: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[4]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_psv_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('num_psv', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_mkey_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + mkey_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_mkey_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('mkey_index', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_mkey_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + pg_access: c.Array[ctypes.c_ubyte, Literal[1]] + mkey_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + data_direct: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_63: c.Array[ctypes.c_ubyte, Literal[29]] + memory_key_mkey_entry: struct_mlx5_ifc_mkc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[128]] + translations_octword_actual_size: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_320: c.Array[ctypes.c_ubyte, Literal[1376]] + klm_pas_mtt: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]] +struct_mlx5_ifc_create_mkey_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('pg_access', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('mkey_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 97), ('data_direct', c.Array[ctypes.c_ubyte, Literal[1]], 98), ('reserved_at_63', c.Array[ctypes.c_ubyte, Literal[29]], 99), ('memory_key_mkey_entry', struct_mlx5_ifc_mkc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[128]], 640), ('translations_octword_actual_size', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('reserved_at_320', c.Array[ctypes.c_ubyte, Literal[1376]], 800), ('klm_pas_mtt', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]], 2176)]) +_anonenum104: dict[int, str] = {(MLX5_FLOW_TABLE_TYPE_NIC_RX:=0): 'MLX5_FLOW_TABLE_TYPE_NIC_RX', (MLX5_FLOW_TABLE_TYPE_NIC_TX:=1): 'MLX5_FLOW_TABLE_TYPE_NIC_TX', (MLX5_FLOW_TABLE_TYPE_ESW_EGRESS_ACL:=2): 'MLX5_FLOW_TABLE_TYPE_ESW_EGRESS_ACL', (MLX5_FLOW_TABLE_TYPE_ESW_INGRESS_ACL:=3): 'MLX5_FLOW_TABLE_TYPE_ESW_INGRESS_ACL', (MLX5_FLOW_TABLE_TYPE_FDB:=4): 'MLX5_FLOW_TABLE_TYPE_FDB', (MLX5_FLOW_TABLE_TYPE_SNIFFER_RX:=5): 'MLX5_FLOW_TABLE_TYPE_SNIFFER_RX', (MLX5_FLOW_TABLE_TYPE_SNIFFER_TX:=6): 'MLX5_FLOW_TABLE_TYPE_SNIFFER_TX'} +@c.record +class struct_mlx5_ifc_create_flow_table_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + icm_address_63_40: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + icm_address_39_32: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + icm_address_31_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_flow_table_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('icm_address_63_40', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('icm_address_39_32', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('icm_address_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_flow_table_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + flow_table_context: struct_mlx5_ifc_flow_table_context_bits +struct_mlx5_ifc_create_flow_table_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('flow_table_context', struct_mlx5_ifc_flow_table_context_bits, 192)]) +@c.record +class struct_mlx5_ifc_create_flow_group_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + group_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_flow_group_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('group_id', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +_anonenum105: dict[int, str] = {(MLX5_CREATE_FLOW_GROUP_IN_GROUP_TYPE_TCAM_SUBTABLE:=0): 'MLX5_CREATE_FLOW_GROUP_IN_GROUP_TYPE_TCAM_SUBTABLE', (MLX5_CREATE_FLOW_GROUP_IN_GROUP_TYPE_HASH_SPLIT:=1): 'MLX5_CREATE_FLOW_GROUP_IN_GROUP_TYPE_HASH_SPLIT'} +_anonenum106: dict[int, str] = {(MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_OUTER_HEADERS:=0): 'MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_OUTER_HEADERS', (MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS:=1): 'MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS', (MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_INNER_HEADERS:=2): 'MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_INNER_HEADERS', (MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_2:=3): 'MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_2'} +@c.record +class struct_mlx5_ifc_create_flow_group_in_bits(c.Struct): + SIZE = 8192 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[4]] + group_type: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_90: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + source_eswitch_owner_vhca_id_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_c1: c.Array[ctypes.c_ubyte, Literal[31]] + start_flow_index: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[32]] + end_flow_index: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[16]] + match_definer_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[128]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[24]] + match_criteria_enable: c.Array[ctypes.c_ubyte, Literal[8]] + match_criteria: struct_mlx5_ifc_fte_match_param_bits + reserved_at_1200: c.Array[ctypes.c_ubyte, Literal[3584]] +struct_mlx5_ifc_create_flow_group_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[4]], 136), ('group_type', c.Array[ctypes.c_ubyte, Literal[4]], 140), ('reserved_at_90', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('source_eswitch_owner_vhca_id_valid', c.Array[ctypes.c_ubyte, Literal[1]], 192), ('reserved_at_c1', c.Array[ctypes.c_ubyte, Literal[31]], 193), ('start_flow_index', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('end_flow_index', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[16]], 320), ('match_definer_id', c.Array[ctypes.c_ubyte, Literal[16]], 336), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[128]], 352), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[24]], 480), ('match_criteria_enable', c.Array[ctypes.c_ubyte, Literal[8]], 504), ('match_criteria', struct_mlx5_ifc_fte_match_param_bits, 512), ('reserved_at_1200', c.Array[ctypes.c_ubyte, Literal[3584]], 4608)]) +@c.record +class struct_mlx5_ifc_create_eq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + eq_number: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_eq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('eq_number', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_eq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + eq_context_entry: struct_mlx5_ifc_eqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[64]] + event_bitmask: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[4]] + reserved_at_3c0: c.Array[ctypes.c_ubyte, Literal[1216]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_create_eq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('eq_context_entry', struct_mlx5_ifc_eqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[64]], 640), ('event_bitmask', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[4]], 704), ('reserved_at_3c0', c.Array[ctypes.c_ubyte, Literal[1216]], 960), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_create_dct_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + dctn: c.Array[ctypes.c_ubyte, Literal[24]] + ece: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_dct_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('dctn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('ece', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_dct_in_bits(c.Struct): + SIZE = 1024 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + dct_context_entry: struct_mlx5_ifc_dctc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_create_dct_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('dct_context_entry', struct_mlx5_ifc_dctc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[384]], 640)]) +@c.record +class struct_mlx5_ifc_create_cq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + cqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_cq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('cqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_create_cq_in_bits(c.Struct): + SIZE = 2176 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + cq_context: struct_mlx5_ifc_cqc_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[96]] + cq_umem_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2e1: c.Array[ctypes.c_ubyte, Literal[1439]] + pas: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_create_cq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('cq_context', struct_mlx5_ifc_cqc_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[96]], 640), ('cq_umem_valid', c.Array[ctypes.c_ubyte, Literal[1]], 736), ('reserved_at_2e1', c.Array[ctypes.c_ubyte, Literal[1439]], 737), ('pas', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 2176)]) +@c.record +class struct_mlx5_ifc_config_int_moderation_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[4]] + min_delay: c.Array[ctypes.c_ubyte, Literal[12]] + int_vector: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_config_int_moderation_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('min_delay', c.Array[ctypes.c_ubyte, Literal[12]], 68), ('int_vector', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +_anonenum107: dict[int, str] = {(MLX5_CONFIG_INT_MODERATION_IN_OP_MOD_WRITE:=0): 'MLX5_CONFIG_INT_MODERATION_IN_OP_MOD_WRITE', (MLX5_CONFIG_INT_MODERATION_IN_OP_MOD_READ:=1): 'MLX5_CONFIG_INT_MODERATION_IN_OP_MOD_READ'} +@c.record +class struct_mlx5_ifc_config_int_moderation_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[4]] + min_delay: c.Array[ctypes.c_ubyte, Literal[12]] + int_vector: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_config_int_moderation_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('min_delay', c.Array[ctypes.c_ubyte, Literal[12]], 68), ('int_vector', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_attach_to_mcg_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_attach_to_mcg_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_attach_to_mcg_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + multicast_gid: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] +struct_mlx5_ifc_attach_to_mcg_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('multicast_gid', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 128)]) +@c.record +class struct_mlx5_ifc_arm_xrq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_arm_xrq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_arm_xrq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + lwm: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_arm_xrq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('lwm', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_arm_xrc_srq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_arm_xrc_srq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +_anonenum108: dict[int, str] = {(MLX5_ARM_XRC_SRQ_IN_OP_MOD_XRC_SRQ:=1): 'MLX5_ARM_XRC_SRQ_IN_OP_MOD_XRC_SRQ'} +@c.record +class struct_mlx5_ifc_arm_xrc_srq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrc_srqn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + lwm: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_arm_xrc_srq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrc_srqn', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('lwm', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_arm_rq_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_arm_rq_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +_anonenum109: dict[int, str] = {(MLX5_ARM_RQ_IN_OP_MOD_SRQ:=1): 'MLX5_ARM_RQ_IN_OP_MOD_SRQ', (MLX5_ARM_RQ_IN_OP_MOD_XRQ:=2): 'MLX5_ARM_RQ_IN_OP_MOD_XRQ'} +@c.record +class struct_mlx5_ifc_arm_rq_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + srq_number: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + lwm: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_arm_rq_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('srq_number', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('lwm', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_arm_dct_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_arm_dct_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_arm_dct_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + dct_number: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_arm_dct_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('dct_number', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_xrcd_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + xrcd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_xrcd_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('xrcd', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_xrcd_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_alloc_xrcd_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_alloc_uar_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + uar: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_uar_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('uar', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_uar_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_alloc_uar_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_alloc_transport_domain_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + transport_domain: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_transport_domain_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('transport_domain', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_transport_domain_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_alloc_transport_domain_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_alloc_q_counter_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + counter_set_id: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_q_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('counter_set_id', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_q_counter_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_alloc_q_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_alloc_pd_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_pd_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_pd_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_alloc_pd_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_alloc_flow_counter_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + flow_counter_id: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_flow_counter_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('flow_counter_id', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_flow_counter_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[51]] + flow_counter_bulk_log_size: c.Array[ctypes.c_ubyte, Literal[5]] + flow_counter_bulk: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_alloc_flow_counter_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[51]], 64), ('flow_counter_bulk_log_size', c.Array[ctypes.c_ubyte, Literal[5]], 115), ('flow_counter_bulk', c.Array[ctypes.c_ubyte, Literal[8]], 120)]) +@c.record +class struct_mlx5_ifc_add_vxlan_udp_dport_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_add_vxlan_udp_dport_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_add_vxlan_udp_dport_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + vxlan_udp_port: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_add_vxlan_udp_dport_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('vxlan_udp_port', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_set_pp_rate_limit_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_pp_rate_limit_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_pp_rate_limit_context_bits(c.Struct): + SIZE = 384 + rate_limit: c.Array[ctypes.c_ubyte, Literal[32]] + burst_upper_bound: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + typical_packet_size: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[288]] +struct_mlx5_ifc_set_pp_rate_limit_context_bits.register_fields([('rate_limit', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('burst_upper_bound', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('typical_packet_size', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[288]], 96)]) +@c.record +class struct_mlx5_ifc_set_pp_rate_limit_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + rate_limit_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + ctx: struct_mlx5_ifc_set_pp_rate_limit_context_bits +struct_mlx5_ifc_set_pp_rate_limit_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('rate_limit_index', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('ctx', struct_mlx5_ifc_set_pp_rate_limit_context_bits, 128)]) +@c.record +class struct_mlx5_ifc_access_register_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + register_data: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]] +struct_mlx5_ifc_access_register_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('register_data', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]], 128)]) +_anonenum110: dict[int, str] = {(MLX5_ACCESS_REGISTER_IN_OP_MOD_WRITE:=0): 'MLX5_ACCESS_REGISTER_IN_OP_MOD_WRITE', (MLX5_ACCESS_REGISTER_IN_OP_MOD_READ:=1): 'MLX5_ACCESS_REGISTER_IN_OP_MOD_READ'} +@c.record +class struct_mlx5_ifc_access_register_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + register_id: c.Array[ctypes.c_ubyte, Literal[16]] + argument: c.Array[ctypes.c_ubyte, Literal[32]] + register_data: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]] +struct_mlx5_ifc_access_register_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('register_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('argument', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('register_data', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_sltp_reg_bits(c.Struct): + SIZE = 160 + status: c.Array[ctypes.c_ubyte, Literal[4]] + version: c.Array[ctypes.c_ubyte, Literal[4]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + pnat: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_12: c.Array[ctypes.c_ubyte, Literal[2]] + lane: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[7]] + polarity: c.Array[ctypes.c_ubyte, Literal[1]] + ob_tap0: c.Array[ctypes.c_ubyte, Literal[8]] + ob_tap1: c.Array[ctypes.c_ubyte, Literal[8]] + ob_tap2: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[12]] + ob_preemp_mode: c.Array[ctypes.c_ubyte, Literal[4]] + ob_reg: c.Array[ctypes.c_ubyte, Literal[8]] + ob_bias: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_sltp_reg_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('version', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('pnat', c.Array[ctypes.c_ubyte, Literal[2]], 16), ('reserved_at_12', c.Array[ctypes.c_ubyte, Literal[2]], 18), ('lane', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[7]], 64), ('polarity', c.Array[ctypes.c_ubyte, Literal[1]], 71), ('ob_tap0', c.Array[ctypes.c_ubyte, Literal[8]], 72), ('ob_tap1', c.Array[ctypes.c_ubyte, Literal[8]], 80), ('ob_tap2', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[12]], 96), ('ob_preemp_mode', c.Array[ctypes.c_ubyte, Literal[4]], 108), ('ob_reg', c.Array[ctypes.c_ubyte, Literal[8]], 112), ('ob_bias', c.Array[ctypes.c_ubyte, Literal[8]], 120), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[32]], 128)]) +@c.record +class struct_mlx5_ifc_slrg_reg_bits(c.Struct): + SIZE = 320 + status: c.Array[ctypes.c_ubyte, Literal[4]] + version: c.Array[ctypes.c_ubyte, Literal[4]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + pnat: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_12: c.Array[ctypes.c_ubyte, Literal[2]] + lane: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[8]] + time_to_link_up: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[12]] + grade_lane_speed: c.Array[ctypes.c_ubyte, Literal[4]] + grade_version: c.Array[ctypes.c_ubyte, Literal[8]] + grade: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[4]] + height_grade_type: c.Array[ctypes.c_ubyte, Literal[4]] + height_grade: c.Array[ctypes.c_ubyte, Literal[24]] + height_dz: c.Array[ctypes.c_ubyte, Literal[16]] + height_dv: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[16]] + height_sigma: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[4]] + phase_grade_type: c.Array[ctypes.c_ubyte, Literal[4]] + phase_grade: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[8]] + phase_eo_pos: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_110: c.Array[ctypes.c_ubyte, Literal[8]] + phase_eo_neg: c.Array[ctypes.c_ubyte, Literal[8]] + ffe_set_tested: c.Array[ctypes.c_ubyte, Literal[16]] + test_errors_per_lane: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_slrg_reg_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('version', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('pnat', c.Array[ctypes.c_ubyte, Literal[2]], 16), ('reserved_at_12', c.Array[ctypes.c_ubyte, Literal[2]], 18), ('lane', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('time_to_link_up', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[12]], 48), ('grade_lane_speed', c.Array[ctypes.c_ubyte, Literal[4]], 60), ('grade_version', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('grade', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[4]], 96), ('height_grade_type', c.Array[ctypes.c_ubyte, Literal[4]], 100), ('height_grade', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('height_dz', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('height_dv', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('height_sigma', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[4]], 224), ('phase_grade_type', c.Array[ctypes.c_ubyte, Literal[4]], 228), ('phase_grade', c.Array[ctypes.c_ubyte, Literal[24]], 232), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('phase_eo_pos', c.Array[ctypes.c_ubyte, Literal[8]], 264), ('reserved_at_110', c.Array[ctypes.c_ubyte, Literal[8]], 272), ('phase_eo_neg', c.Array[ctypes.c_ubyte, Literal[8]], 280), ('ffe_set_tested', c.Array[ctypes.c_ubyte, Literal[16]], 288), ('test_errors_per_lane', c.Array[ctypes.c_ubyte, Literal[16]], 304)]) +@c.record +class struct_mlx5_ifc_pvlc_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[28]] + vl_hw_cap: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[28]] + vl_admin: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[28]] + vl_operational: c.Array[ctypes.c_ubyte, Literal[4]] +struct_mlx5_ifc_pvlc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[28]], 32), ('vl_hw_cap', c.Array[ctypes.c_ubyte, Literal[4]], 60), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[28]], 64), ('vl_admin', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[28]], 96), ('vl_operational', c.Array[ctypes.c_ubyte, Literal[4]], 124)]) +@c.record +class struct_mlx5_ifc_pude_reg_bits(c.Struct): + SIZE = 128 + swid: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[4]] + admin_status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[4]] + oper_status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_pude_reg_bits.register_fields([('swid', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[4]], 16), ('admin_status', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[4]], 24), ('oper_status', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32)]) +_anonenum111: dict[int, str] = {(MLX5_PTYS_CONNECTOR_TYPE_PORT_DA:=7): 'MLX5_PTYS_CONNECTOR_TYPE_PORT_DA'} +@c.record +class struct_mlx5_ifc_ptys_reg_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[1]] + an_disable_admin: c.Array[ctypes.c_ubyte, Literal[1]] + an_disable_cap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3: c.Array[ctypes.c_ubyte, Literal[5]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + plane_ind: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_1c: c.Array[ctypes.c_ubyte, Literal[1]] + proto_mask: c.Array[ctypes.c_ubyte, Literal[3]] + an_status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_24: c.Array[ctypes.c_ubyte, Literal[12]] + data_rate_oper: c.Array[ctypes.c_ubyte, Literal[16]] + ext_eth_proto_capability: c.Array[ctypes.c_ubyte, Literal[32]] + eth_proto_capability: c.Array[ctypes.c_ubyte, Literal[32]] + ib_link_width_capability: c.Array[ctypes.c_ubyte, Literal[16]] + ib_proto_capability: c.Array[ctypes.c_ubyte, Literal[16]] + ext_eth_proto_admin: c.Array[ctypes.c_ubyte, Literal[32]] + eth_proto_admin: c.Array[ctypes.c_ubyte, Literal[32]] + ib_link_width_admin: c.Array[ctypes.c_ubyte, Literal[16]] + ib_proto_admin: c.Array[ctypes.c_ubyte, Literal[16]] + ext_eth_proto_oper: c.Array[ctypes.c_ubyte, Literal[32]] + eth_proto_oper: c.Array[ctypes.c_ubyte, Literal[32]] + ib_link_width_oper: c.Array[ctypes.c_ubyte, Literal[16]] + ib_proto_oper: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[8]] + lane_rate_oper: c.Array[ctypes.c_ubyte, Literal[20]] + connector_type: c.Array[ctypes.c_ubyte, Literal[4]] + eth_proto_lp_advertise: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1a0: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_ptys_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('an_disable_admin', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('an_disable_cap', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('reserved_at_3', c.Array[ctypes.c_ubyte, Literal[5]], 3), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('plane_ind', c.Array[ctypes.c_ubyte, Literal[4]], 24), ('reserved_at_1c', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('proto_mask', c.Array[ctypes.c_ubyte, Literal[3]], 29), ('an_status', c.Array[ctypes.c_ubyte, Literal[4]], 32), ('reserved_at_24', c.Array[ctypes.c_ubyte, Literal[12]], 36), ('data_rate_oper', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('ext_eth_proto_capability', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('eth_proto_capability', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('ib_link_width_capability', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('ib_proto_capability', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('ext_eth_proto_admin', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('eth_proto_admin', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('ib_link_width_admin', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('ib_proto_admin', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('ext_eth_proto_oper', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('eth_proto_oper', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('ib_link_width_oper', c.Array[ctypes.c_ubyte, Literal[16]], 320), ('ib_proto_oper', c.Array[ctypes.c_ubyte, Literal[16]], 336), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[8]], 352), ('lane_rate_oper', c.Array[ctypes.c_ubyte, Literal[20]], 360), ('connector_type', c.Array[ctypes.c_ubyte, Literal[4]], 380), ('eth_proto_lp_advertise', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('reserved_at_1a0', c.Array[ctypes.c_ubyte, Literal[96]], 416)]) +@c.record +class struct_mlx5_ifc_mlcr_reg_bits(c.Struct): + SIZE = 96 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[32]] + beacon_duration: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + beacon_remain: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_mlcr_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[32]], 16), ('beacon_duration', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('beacon_remain', c.Array[ctypes.c_ubyte, Literal[16]], 80)]) +@c.record +class struct_mlx5_ifc_ptas_reg_bits(c.Struct): + SIZE = 352 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + algorithm_options: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[4]] + repetitions_mode: c.Array[ctypes.c_ubyte, Literal[4]] + num_of_repetitions: c.Array[ctypes.c_ubyte, Literal[8]] + grade_version: c.Array[ctypes.c_ubyte, Literal[8]] + height_grade_type: c.Array[ctypes.c_ubyte, Literal[4]] + phase_grade_type: c.Array[ctypes.c_ubyte, Literal[4]] + height_grade_weight: c.Array[ctypes.c_ubyte, Literal[8]] + phase_grade_weight: c.Array[ctypes.c_ubyte, Literal[8]] + gisim_measure_bits: c.Array[ctypes.c_ubyte, Literal[16]] + adaptive_tap_measure_bits: c.Array[ctypes.c_ubyte, Literal[16]] + ber_bath_high_error_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + ber_bath_mid_error_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + ber_bath_low_error_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + one_ratio_high_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + one_ratio_high_mid_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + one_ratio_low_mid_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + one_ratio_low_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + ndeo_error_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + mixer_offset_step_size: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_110: c.Array[ctypes.c_ubyte, Literal[8]] + mix90_phase_for_voltage_bath: c.Array[ctypes.c_ubyte, Literal[8]] + mixer_offset_start: c.Array[ctypes.c_ubyte, Literal[16]] + mixer_offset_end: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[21]] + ber_test_time: c.Array[ctypes.c_ubyte, Literal[11]] +struct_mlx5_ifc_ptas_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('algorithm_options', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[4]], 48), ('repetitions_mode', c.Array[ctypes.c_ubyte, Literal[4]], 52), ('num_of_repetitions', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('grade_version', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('height_grade_type', c.Array[ctypes.c_ubyte, Literal[4]], 72), ('phase_grade_type', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('height_grade_weight', c.Array[ctypes.c_ubyte, Literal[8]], 80), ('phase_grade_weight', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('gisim_measure_bits', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('adaptive_tap_measure_bits', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('ber_bath_high_error_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('ber_bath_mid_error_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('ber_bath_low_error_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('one_ratio_high_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('one_ratio_high_mid_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 192), ('one_ratio_low_mid_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 208), ('one_ratio_low_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('ndeo_error_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('mixer_offset_step_size', c.Array[ctypes.c_ubyte, Literal[16]], 256), ('reserved_at_110', c.Array[ctypes.c_ubyte, Literal[8]], 272), ('mix90_phase_for_voltage_bath', c.Array[ctypes.c_ubyte, Literal[8]], 280), ('mixer_offset_start', c.Array[ctypes.c_ubyte, Literal[16]], 288), ('mixer_offset_end', c.Array[ctypes.c_ubyte, Literal[16]], 304), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[21]], 320), ('ber_test_time', c.Array[ctypes.c_ubyte, Literal[11]], 341)]) +@c.record +class struct_mlx5_ifc_pspa_reg_bits(c.Struct): + SIZE = 64 + swid: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + sub_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_pspa_reg_bits.register_fields([('swid', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('sub_port', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_pqdr_reg_bits(c.Struct): + SIZE = 256 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[5]] + prio: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[6]] + mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + min_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + max_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[16]] + mark_probability_denominator: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_pqdr_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[5]], 16), ('prio', c.Array[ctypes.c_ubyte, Literal[3]], 21), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[6]], 24), ('mode', c.Array[ctypes.c_ubyte, Literal[2]], 30), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('min_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('max_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('mark_probability_denominator', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[96]], 160)]) +@c.record +class struct_mlx5_ifc_ppsc_reg_bits(c.Struct): + SIZE = 384 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[28]] + wrps_admin: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[28]] + wrps_status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + up_threshold: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_d0: c.Array[ctypes.c_ubyte, Literal[8]] + down_threshold: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[28]] + srps_admin: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[28]] + srps_status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_ppsc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[28]], 128), ('wrps_admin', c.Array[ctypes.c_ubyte, Literal[4]], 156), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[28]], 160), ('wrps_status', c.Array[ctypes.c_ubyte, Literal[4]], 188), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('up_threshold', c.Array[ctypes.c_ubyte, Literal[8]], 200), ('reserved_at_d0', c.Array[ctypes.c_ubyte, Literal[8]], 208), ('down_threshold', c.Array[ctypes.c_ubyte, Literal[8]], 216), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[28]], 256), ('srps_admin', c.Array[ctypes.c_ubyte, Literal[4]], 284), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[28]], 288), ('srps_status', c.Array[ctypes.c_ubyte, Literal[4]], 316), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[64]], 320)]) +@c.record +class struct_mlx5_ifc_pplr_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + lb_cap: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[8]] + lb_en: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_pplr_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('lb_cap', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('lb_en', c.Array[ctypes.c_ubyte, Literal[8]], 56)]) +@c.record +class struct_mlx5_ifc_pplm_reg_bits(c.Struct): + SIZE = 960 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + port_profile_mode: c.Array[ctypes.c_ubyte, Literal[8]] + static_port_profile: c.Array[ctypes.c_ubyte, Literal[8]] + active_port_profile: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_58: c.Array[ctypes.c_ubyte, Literal[8]] + retransmission_active: c.Array[ctypes.c_ubyte, Literal[8]] + fec_mode_active: c.Array[ctypes.c_ubyte, Literal[24]] + rs_fec_correction_bypass_cap: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_84: c.Array[ctypes.c_ubyte, Literal[8]] + fec_override_cap_56g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_cap_100g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_cap_50g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_cap_25g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_cap_10g_40g: c.Array[ctypes.c_ubyte, Literal[4]] + rs_fec_correction_bypass_admin: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_a4: c.Array[ctypes.c_ubyte, Literal[8]] + fec_override_admin_56g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_admin_100g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_admin_50g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_admin_25g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_admin_10g_40g: c.Array[ctypes.c_ubyte, Literal[4]] + fec_override_cap_400g_8x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_200g_4x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_100g_2x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_50g_1x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_400g_8x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_200g_4x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_100g_2x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_50g_1x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_800g_8x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_400g_4x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_200g_2x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_100g_1x: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_180: c.Array[ctypes.c_ubyte, Literal[160]] + fec_override_admin_800g_8x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_400g_4x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_200g_2x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_100g_1x: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_260: c.Array[ctypes.c_ubyte, Literal[96]] + fec_override_cap_1600g_8x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_800g_4x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_400g_2x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_cap_200g_1x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_1600g_8x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_800g_4x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_400g_2x: c.Array[ctypes.c_ubyte, Literal[16]] + fec_override_admin_200g_1x: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_340: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_pplm_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('port_profile_mode', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('static_port_profile', c.Array[ctypes.c_ubyte, Literal[8]], 72), ('active_port_profile', c.Array[ctypes.c_ubyte, Literal[8]], 80), ('reserved_at_58', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('retransmission_active', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('fec_mode_active', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('rs_fec_correction_bypass_cap', c.Array[ctypes.c_ubyte, Literal[4]], 128), ('reserved_at_84', c.Array[ctypes.c_ubyte, Literal[8]], 132), ('fec_override_cap_56g', c.Array[ctypes.c_ubyte, Literal[4]], 140), ('fec_override_cap_100g', c.Array[ctypes.c_ubyte, Literal[4]], 144), ('fec_override_cap_50g', c.Array[ctypes.c_ubyte, Literal[4]], 148), ('fec_override_cap_25g', c.Array[ctypes.c_ubyte, Literal[4]], 152), ('fec_override_cap_10g_40g', c.Array[ctypes.c_ubyte, Literal[4]], 156), ('rs_fec_correction_bypass_admin', c.Array[ctypes.c_ubyte, Literal[4]], 160), ('reserved_at_a4', c.Array[ctypes.c_ubyte, Literal[8]], 164), ('fec_override_admin_56g', c.Array[ctypes.c_ubyte, Literal[4]], 172), ('fec_override_admin_100g', c.Array[ctypes.c_ubyte, Literal[4]], 176), ('fec_override_admin_50g', c.Array[ctypes.c_ubyte, Literal[4]], 180), ('fec_override_admin_25g', c.Array[ctypes.c_ubyte, Literal[4]], 184), ('fec_override_admin_10g_40g', c.Array[ctypes.c_ubyte, Literal[4]], 188), ('fec_override_cap_400g_8x', c.Array[ctypes.c_ubyte, Literal[16]], 192), ('fec_override_cap_200g_4x', c.Array[ctypes.c_ubyte, Literal[16]], 208), ('fec_override_cap_100g_2x', c.Array[ctypes.c_ubyte, Literal[16]], 224), ('fec_override_cap_50g_1x', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('fec_override_admin_400g_8x', c.Array[ctypes.c_ubyte, Literal[16]], 256), ('fec_override_admin_200g_4x', c.Array[ctypes.c_ubyte, Literal[16]], 272), ('fec_override_admin_100g_2x', c.Array[ctypes.c_ubyte, Literal[16]], 288), ('fec_override_admin_50g_1x', c.Array[ctypes.c_ubyte, Literal[16]], 304), ('fec_override_cap_800g_8x', c.Array[ctypes.c_ubyte, Literal[16]], 320), ('fec_override_cap_400g_4x', c.Array[ctypes.c_ubyte, Literal[16]], 336), ('fec_override_cap_200g_2x', c.Array[ctypes.c_ubyte, Literal[16]], 352), ('fec_override_cap_100g_1x', c.Array[ctypes.c_ubyte, Literal[16]], 368), ('reserved_at_180', c.Array[ctypes.c_ubyte, Literal[160]], 384), ('fec_override_admin_800g_8x', c.Array[ctypes.c_ubyte, Literal[16]], 544), ('fec_override_admin_400g_4x', c.Array[ctypes.c_ubyte, Literal[16]], 560), ('fec_override_admin_200g_2x', c.Array[ctypes.c_ubyte, Literal[16]], 576), ('fec_override_admin_100g_1x', c.Array[ctypes.c_ubyte, Literal[16]], 592), ('reserved_at_260', c.Array[ctypes.c_ubyte, Literal[96]], 608), ('fec_override_cap_1600g_8x', c.Array[ctypes.c_ubyte, Literal[16]], 704), ('fec_override_cap_800g_4x', c.Array[ctypes.c_ubyte, Literal[16]], 720), ('fec_override_cap_400g_2x', c.Array[ctypes.c_ubyte, Literal[16]], 736), ('fec_override_cap_200g_1x', c.Array[ctypes.c_ubyte, Literal[16]], 752), ('fec_override_admin_1600g_8x', c.Array[ctypes.c_ubyte, Literal[16]], 768), ('fec_override_admin_800g_4x', c.Array[ctypes.c_ubyte, Literal[16]], 784), ('fec_override_admin_400g_2x', c.Array[ctypes.c_ubyte, Literal[16]], 800), ('fec_override_admin_200g_1x', c.Array[ctypes.c_ubyte, Literal[16]], 816), ('reserved_at_340', c.Array[ctypes.c_ubyte, Literal[128]], 832)]) +@c.record +class struct_mlx5_ifc_ppcnt_reg_bits(c.Struct): + SIZE = 2048 + swid: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + pnat: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_12: c.Array[ctypes.c_ubyte, Literal[8]] + grp: c.Array[ctypes.c_ubyte, Literal[6]] + clr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[19]] + plane_ind: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[3]] + prio_tc: c.Array[ctypes.c_ubyte, Literal[5]] + counter_set: union_mlx5_ifc_eth_cntrs_grp_data_layout_auto_bits +struct_mlx5_ifc_ppcnt_reg_bits.register_fields([('swid', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('pnat', c.Array[ctypes.c_ubyte, Literal[2]], 16), ('reserved_at_12', c.Array[ctypes.c_ubyte, Literal[8]], 18), ('grp', c.Array[ctypes.c_ubyte, Literal[6]], 26), ('clr', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[19]], 33), ('plane_ind', c.Array[ctypes.c_ubyte, Literal[4]], 52), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[3]], 56), ('prio_tc', c.Array[ctypes.c_ubyte, Literal[5]], 59), ('counter_set', union_mlx5_ifc_eth_cntrs_grp_data_layout_auto_bits, 64)]) +@c.record +class struct_mlx5_ifc_mpein_reg_bits(c.Struct): + SIZE = 384 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[2]] + depth: c.Array[ctypes.c_ubyte, Literal[6]] + pcie_index: c.Array[ctypes.c_ubyte, Literal[8]] + node: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[8]] + capability_mask: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + link_width_enabled: c.Array[ctypes.c_ubyte, Literal[8]] + link_speed_enabled: c.Array[ctypes.c_ubyte, Literal[16]] + lane0_physical_position: c.Array[ctypes.c_ubyte, Literal[8]] + link_width_active: c.Array[ctypes.c_ubyte, Literal[8]] + link_speed_active: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_pfs: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_vfs: c.Array[ctypes.c_ubyte, Literal[16]] + bdf0: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_b0: c.Array[ctypes.c_ubyte, Literal[16]] + max_read_request_size: c.Array[ctypes.c_ubyte, Literal[4]] + max_payload_size: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_c8: c.Array[ctypes.c_ubyte, Literal[5]] + pwr_status: c.Array[ctypes.c_ubyte, Literal[3]] + port_type: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_d4: c.Array[ctypes.c_ubyte, Literal[11]] + lane_reversal: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[20]] + pci_power: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[32]] + device_status: c.Array[ctypes.c_ubyte, Literal[16]] + port_state: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_138: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[16]] + receiver_detect_result: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_160: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mpein_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[2]], 0), ('depth', c.Array[ctypes.c_ubyte, Literal[6]], 2), ('pcie_index', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('node', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('capability_mask', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('link_width_enabled', c.Array[ctypes.c_ubyte, Literal[8]], 72), ('link_speed_enabled', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('lane0_physical_position', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('link_width_active', c.Array[ctypes.c_ubyte, Literal[8]], 104), ('link_speed_active', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('num_of_pfs', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('num_of_vfs', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('bdf0', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('reserved_at_b0', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('max_read_request_size', c.Array[ctypes.c_ubyte, Literal[4]], 192), ('max_payload_size', c.Array[ctypes.c_ubyte, Literal[4]], 196), ('reserved_at_c8', c.Array[ctypes.c_ubyte, Literal[5]], 200), ('pwr_status', c.Array[ctypes.c_ubyte, Literal[3]], 205), ('port_type', c.Array[ctypes.c_ubyte, Literal[4]], 208), ('reserved_at_d4', c.Array[ctypes.c_ubyte, Literal[11]], 212), ('lane_reversal', c.Array[ctypes.c_ubyte, Literal[1]], 223), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[20]], 224), ('pci_power', c.Array[ctypes.c_ubyte, Literal[12]], 244), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('device_status', c.Array[ctypes.c_ubyte, Literal[16]], 288), ('port_state', c.Array[ctypes.c_ubyte, Literal[8]], 304), ('reserved_at_138', c.Array[ctypes.c_ubyte, Literal[8]], 312), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[16]], 320), ('receiver_detect_result', c.Array[ctypes.c_ubyte, Literal[16]], 336), ('reserved_at_160', c.Array[ctypes.c_ubyte, Literal[32]], 352)]) +@c.record +class struct_mlx5_ifc_mpcnt_reg_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + pcie_index: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[10]] + grp: c.Array[ctypes.c_ubyte, Literal[6]] + clr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[31]] + counter_set: union_mlx5_ifc_pcie_cntrs_grp_data_layout_auto_bits +struct_mlx5_ifc_mpcnt_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('pcie_index', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[10]], 16), ('grp', c.Array[ctypes.c_ubyte, Literal[6]], 26), ('clr', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[31]], 33), ('counter_set', union_mlx5_ifc_pcie_cntrs_grp_data_layout_auto_bits, 64)]) +@c.record +class struct_mlx5_ifc_ppad_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[3]] + single_mac: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[4]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + mac_47_32: c.Array[ctypes.c_ubyte, Literal[16]] + mac_31_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_ppad_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('single_mac', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('mac_47_32', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('mac_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_pmtu_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + max_mtu: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[16]] + admin_mtu: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[16]] + oper_mtu: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_70: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_pmtu_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('max_mtu', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('admin_mtu', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('oper_mtu', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('reserved_at_70', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_pmpr_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + module: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[24]] + attenuation_5g: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + attenuation_7g: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[24]] + attenuation_12g: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_pmpr_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('module', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[24]], 32), ('attenuation_5g', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('attenuation_7g', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[24]], 96), ('attenuation_12g', c.Array[ctypes.c_ubyte, Literal[8]], 120)]) +@c.record +class struct_mlx5_ifc_pmpe_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + module: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[12]] + module_status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_pmpe_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('module', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[12]], 16), ('module_status', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32)]) +@c.record +class struct_mlx5_ifc_pmpc_reg_bits(c.Struct): + SIZE = 256 + module_state_updated: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[32]] +struct_mlx5_ifc_pmpc_reg_bits.register_fields([('module_state_updated', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[32]], 0)]) +@c.record +class struct_mlx5_ifc_pmlpn_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + mlpn_status: c.Array[ctypes.c_ubyte, Literal[4]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + e: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[31]] +struct_mlx5_ifc_pmlpn_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('mlpn_status', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('e', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[31]], 33)]) +@c.record +class struct_mlx5_ifc_pmlp_reg_bits(c.Struct): + SIZE = 512 + rxtx: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[7]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + width: c.Array[ctypes.c_ubyte, Literal[8]] + lane0_module_mapping: c.Array[ctypes.c_ubyte, Literal[32]] + lane1_module_mapping: c.Array[ctypes.c_ubyte, Literal[32]] + lane2_module_mapping: c.Array[ctypes.c_ubyte, Literal[32]] + lane3_module_mapping: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[352]] +struct_mlx5_ifc_pmlp_reg_bits.register_fields([('rxtx', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[7]], 1), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('width', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('lane0_module_mapping', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('lane1_module_mapping', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('lane2_module_mapping', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('lane3_module_mapping', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[352]], 160)]) +@c.record +class struct_mlx5_ifc_pmaos_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + module: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[4]] + admin_status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[4]] + oper_status: c.Array[ctypes.c_ubyte, Literal[4]] + ase: c.Array[ctypes.c_ubyte, Literal[1]] + ee: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[28]] + e: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_pmaos_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('module', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[4]], 16), ('admin_status', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[4]], 24), ('oper_status', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('ase', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('ee', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[28]], 34), ('e', c.Array[ctypes.c_ubyte, Literal[2]], 62), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_plpc_reg_bits(c.Struct): + SIZE = 320 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + profile_id: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[4]] + proto_mask: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + lane_speed: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[23]] + lpbf: c.Array[ctypes.c_ubyte, Literal[1]] + fec_mode_policy: c.Array[ctypes.c_ubyte, Literal[8]] + retransmission_capability: c.Array[ctypes.c_ubyte, Literal[8]] + fec_mode_capability: c.Array[ctypes.c_ubyte, Literal[24]] + retransmission_support_admin: c.Array[ctypes.c_ubyte, Literal[8]] + fec_mode_support_admin: c.Array[ctypes.c_ubyte, Literal[24]] + retransmission_request_admin: c.Array[ctypes.c_ubyte, Literal[8]] + fec_mode_request_admin: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_plpc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('profile_id', c.Array[ctypes.c_ubyte, Literal[12]], 4), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[4]], 16), ('proto_mask', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('lane_speed', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[23]], 64), ('lpbf', c.Array[ctypes.c_ubyte, Literal[1]], 87), ('fec_mode_policy', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('retransmission_capability', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('fec_mode_capability', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('retransmission_support_admin', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('fec_mode_support_admin', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('retransmission_request_admin', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('fec_mode_request_admin', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[128]], 192)]) +@c.record +class struct_mlx5_ifc_plib_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + ib_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_plib_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('ib_port', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32)]) +@c.record +class struct_mlx5_ifc_plbf_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[13]] + lbf_mode: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_plbf_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[13]], 16), ('lbf_mode', c.Array[ctypes.c_ubyte, Literal[3]], 29), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_pipg_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + dic: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[25]] + ipg: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_3e: c.Array[ctypes.c_ubyte, Literal[2]] +struct_mlx5_ifc_pipg_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('dic', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[25]], 33), ('ipg', c.Array[ctypes.c_ubyte, Literal[4]], 58), ('reserved_at_3e', c.Array[ctypes.c_ubyte, Literal[2]], 62)]) +@c.record +class struct_mlx5_ifc_pifr_reg_bits(c.Struct): + SIZE = 768 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[224]] + port_filter: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] + port_filter_update_en: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] +struct_mlx5_ifc_pifr_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[224]], 32), ('port_filter', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 256), ('port_filter_update_en', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 512)]) +_anonenum112: dict[int, str] = {(MLX5_BUF_OWNERSHIP_UNKNOWN:=0): 'MLX5_BUF_OWNERSHIP_UNKNOWN', (MLX5_BUF_OWNERSHIP_FW_OWNED:=1): 'MLX5_BUF_OWNERSHIP_FW_OWNED', (MLX5_BUF_OWNERSHIP_SW_OWNED:=2): 'MLX5_BUF_OWNERSHIP_SW_OWNED'} +@c.record +class struct_mlx5_ifc_pfcc_reg_bits(c.Struct): + SIZE = 256 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + buf_ownership: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_6: c.Array[ctypes.c_ubyte, Literal[2]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[10]] + cable_length_mask: c.Array[ctypes.c_ubyte, Literal[1]] + ppan_mask_n: c.Array[ctypes.c_ubyte, Literal[1]] + minor_stall_mask: c.Array[ctypes.c_ubyte, Literal[1]] + critical_stall_mask: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1e: c.Array[ctypes.c_ubyte, Literal[2]] + ppan: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_24: c.Array[ctypes.c_ubyte, Literal[4]] + prio_mask_tx: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[8]] + prio_mask_rx: c.Array[ctypes.c_ubyte, Literal[8]] + pptx: c.Array[ctypes.c_ubyte, Literal[1]] + aptx: c.Array[ctypes.c_ubyte, Literal[1]] + pptx_mask_n: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_43: c.Array[ctypes.c_ubyte, Literal[5]] + pfctx: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[16]] + pprx: c.Array[ctypes.c_ubyte, Literal[1]] + aprx: c.Array[ctypes.c_ubyte, Literal[1]] + pprx_mask_n: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_63: c.Array[ctypes.c_ubyte, Literal[5]] + pfcrx: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_70: c.Array[ctypes.c_ubyte, Literal[16]] + device_stall_minor_watermark: c.Array[ctypes.c_ubyte, Literal[16]] + device_stall_critical_watermark: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[24]] + cable_length: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_pfcc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('buf_ownership', c.Array[ctypes.c_ubyte, Literal[2]], 4), ('reserved_at_6', c.Array[ctypes.c_ubyte, Literal[2]], 6), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[10]], 16), ('cable_length_mask', c.Array[ctypes.c_ubyte, Literal[1]], 26), ('ppan_mask_n', c.Array[ctypes.c_ubyte, Literal[1]], 27), ('minor_stall_mask', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('critical_stall_mask', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('reserved_at_1e', c.Array[ctypes.c_ubyte, Literal[2]], 30), ('ppan', c.Array[ctypes.c_ubyte, Literal[4]], 32), ('reserved_at_24', c.Array[ctypes.c_ubyte, Literal[4]], 36), ('prio_mask_tx', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('prio_mask_rx', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('pptx', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('aptx', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('pptx_mask_n', c.Array[ctypes.c_ubyte, Literal[1]], 66), ('reserved_at_43', c.Array[ctypes.c_ubyte, Literal[5]], 67), ('pfctx', c.Array[ctypes.c_ubyte, Literal[8]], 72), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('pprx', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('aprx', c.Array[ctypes.c_ubyte, Literal[1]], 97), ('pprx_mask_n', c.Array[ctypes.c_ubyte, Literal[1]], 98), ('reserved_at_63', c.Array[ctypes.c_ubyte, Literal[5]], 99), ('pfcrx', c.Array[ctypes.c_ubyte, Literal[8]], 104), ('reserved_at_70', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('device_stall_minor_watermark', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('device_stall_critical_watermark', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[24]], 160), ('cable_length', c.Array[ctypes.c_ubyte, Literal[8]], 184), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192)]) +@c.record +class struct_mlx5_ifc_pelc_reg_bits(c.Struct): + SIZE = 448 + op: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[4]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + op_admin: c.Array[ctypes.c_ubyte, Literal[8]] + op_capability: c.Array[ctypes.c_ubyte, Literal[8]] + op_request: c.Array[ctypes.c_ubyte, Literal[8]] + op_active: c.Array[ctypes.c_ubyte, Literal[8]] + admin: c.Array[ctypes.c_ubyte, Literal[64]] + capability: c.Array[ctypes.c_ubyte, Literal[64]] + request: c.Array[ctypes.c_ubyte, Literal[64]] + active: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_pelc_reg_bits.register_fields([('op', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('op_admin', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('op_capability', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('op_request', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('op_active', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('admin', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('capability', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('request', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('active', c.Array[ctypes.c_ubyte, Literal[64]], 256), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[128]], 320)]) +@c.record +class struct_mlx5_ifc_peir_reg_bits(c.Struct): + SIZE = 96 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[12]] + error_count: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[12]] + lane: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[8]] + error_type: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_peir_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[12]], 32), ('error_count', c.Array[ctypes.c_ubyte, Literal[4]], 44), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[12]], 64), ('lane', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[8]], 80), ('error_type', c.Array[ctypes.c_ubyte, Literal[8]], 88)]) +@c.record +class struct_mlx5_ifc_mpegc_reg_bits(c.Struct): + SIZE = 352 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[48]] + field_select: c.Array[ctypes.c_ubyte, Literal[16]] + tx_overflow_sense: c.Array[ctypes.c_ubyte, Literal[1]] + mark_cqe: c.Array[ctypes.c_ubyte, Literal[1]] + mark_cnp: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_43: c.Array[ctypes.c_ubyte, Literal[27]] + tx_lossy_overflow_oper: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_mpegc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[48]], 0), ('field_select', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('tx_overflow_sense', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('mark_cqe', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('mark_cnp', c.Array[ctypes.c_ubyte, Literal[1]], 66), ('reserved_at_43', c.Array[ctypes.c_ubyte, Literal[27]], 67), ('tx_lossy_overflow_oper', c.Array[ctypes.c_ubyte, Literal[2]], 94), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[256]], 96)]) +@c.record +class struct_mlx5_ifc_mpir_reg_bits(c.Struct): + SIZE = 128 + sdm: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[27]] + host_buses: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_28: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mpir_reg_bits.register_fields([('sdm', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[27]], 1), ('host_buses', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('reserved_at_28', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +_anonenum113: dict[int, str] = {(MLX5_MTUTC_FREQ_ADJ_UNITS_PPB:=0): 'MLX5_MTUTC_FREQ_ADJ_UNITS_PPB', (MLX5_MTUTC_FREQ_ADJ_UNITS_SCALED_PPM:=1): 'MLX5_MTUTC_FREQ_ADJ_UNITS_SCALED_PPM'} +_anonenum114: dict[int, str] = {(MLX5_MTUTC_OPERATION_SET_TIME_IMMEDIATE:=1): 'MLX5_MTUTC_OPERATION_SET_TIME_IMMEDIATE', (MLX5_MTUTC_OPERATION_ADJUST_TIME:=2): 'MLX5_MTUTC_OPERATION_ADJUST_TIME', (MLX5_MTUTC_OPERATION_ADJUST_FREQ_UTC:=3): 'MLX5_MTUTC_OPERATION_ADJUST_FREQ_UTC'} +@c.record +class struct_mlx5_ifc_mtutc_reg_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[5]] + freq_adj_units: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[3]] + log_max_freq_adjustment: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[12]] + operation: c.Array[ctypes.c_ubyte, Literal[4]] + freq_adjustment: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + utc_sec: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[2]] + utc_nsec: c.Array[ctypes.c_ubyte, Literal[30]] + time_adjustment: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mtutc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[5]], 0), ('freq_adj_units', c.Array[ctypes.c_ubyte, Literal[3]], 5), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[3]], 8), ('log_max_freq_adjustment', c.Array[ctypes.c_ubyte, Literal[5]], 11), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[12]], 16), ('operation', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('freq_adjustment', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('utc_sec', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[2]], 160), ('utc_nsec', c.Array[ctypes.c_ubyte, Literal[30]], 162), ('time_adjustment', c.Array[ctypes.c_ubyte, Literal[32]], 192)]) +@c.record +class struct_mlx5_ifc_pcam_enhanced_features_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + ppcnt_recovery_counters: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_11: c.Array[ctypes.c_ubyte, Literal[7]] + cable_length: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_19: c.Array[ctypes.c_ubyte, Literal[4]] + fec_200G_per_lane_in_pplm: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1e: c.Array[ctypes.c_ubyte, Literal[42]] + fec_100G_per_lane_in_pplm: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_49: c.Array[ctypes.c_ubyte, Literal[10]] + buffer_ownership: c.Array[ctypes.c_ubyte, Literal[1]] + resereved_at_54: c.Array[ctypes.c_ubyte, Literal[20]] + fec_50G_per_lane_in_pplm: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_69: c.Array[ctypes.c_ubyte, Literal[4]] + rx_icrc_encapsulated_counter: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_6e: c.Array[ctypes.c_ubyte, Literal[4]] + ptys_extended_ethernet: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_73: c.Array[ctypes.c_ubyte, Literal[3]] + pfcc_mask: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_77: c.Array[ctypes.c_ubyte, Literal[3]] + per_lane_error_counters: c.Array[ctypes.c_ubyte, Literal[1]] + rx_buffer_fullness_counters: c.Array[ctypes.c_ubyte, Literal[1]] + ptys_connector_type: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_7d: c.Array[ctypes.c_ubyte, Literal[1]] + ppcnt_discard_group: c.Array[ctypes.c_ubyte, Literal[1]] + ppcnt_statistical_group: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_pcam_enhanced_features_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('ppcnt_recovery_counters', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('reserved_at_11', c.Array[ctypes.c_ubyte, Literal[7]], 17), ('cable_length', c.Array[ctypes.c_ubyte, Literal[1]], 24), ('reserved_at_19', c.Array[ctypes.c_ubyte, Literal[4]], 25), ('fec_200G_per_lane_in_pplm', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('reserved_at_1e', c.Array[ctypes.c_ubyte, Literal[42]], 30), ('fec_100G_per_lane_in_pplm', c.Array[ctypes.c_ubyte, Literal[1]], 72), ('reserved_at_49', c.Array[ctypes.c_ubyte, Literal[10]], 73), ('buffer_ownership', c.Array[ctypes.c_ubyte, Literal[1]], 83), ('resereved_at_54', c.Array[ctypes.c_ubyte, Literal[20]], 84), ('fec_50G_per_lane_in_pplm', c.Array[ctypes.c_ubyte, Literal[1]], 104), ('reserved_at_69', c.Array[ctypes.c_ubyte, Literal[4]], 105), ('rx_icrc_encapsulated_counter', c.Array[ctypes.c_ubyte, Literal[1]], 109), ('reserved_at_6e', c.Array[ctypes.c_ubyte, Literal[4]], 110), ('ptys_extended_ethernet', c.Array[ctypes.c_ubyte, Literal[1]], 114), ('reserved_at_73', c.Array[ctypes.c_ubyte, Literal[3]], 115), ('pfcc_mask', c.Array[ctypes.c_ubyte, Literal[1]], 118), ('reserved_at_77', c.Array[ctypes.c_ubyte, Literal[3]], 119), ('per_lane_error_counters', c.Array[ctypes.c_ubyte, Literal[1]], 122), ('rx_buffer_fullness_counters', c.Array[ctypes.c_ubyte, Literal[1]], 123), ('ptys_connector_type', c.Array[ctypes.c_ubyte, Literal[1]], 124), ('reserved_at_7d', c.Array[ctypes.c_ubyte, Literal[1]], 125), ('ppcnt_discard_group', c.Array[ctypes.c_ubyte, Literal[1]], 126), ('ppcnt_statistical_group', c.Array[ctypes.c_ubyte, Literal[1]], 127)]) +@c.record +class struct_mlx5_ifc_pcam_regs_5000_to_507f_bits(c.Struct): + SIZE = 128 + port_access_reg_cap_mask_127_to_96: c.Array[ctypes.c_ubyte, Literal[32]] + port_access_reg_cap_mask_95_to_64: c.Array[ctypes.c_ubyte, Literal[32]] + port_access_reg_cap_mask_63: c.Array[ctypes.c_ubyte, Literal[1]] + pphcr: c.Array[ctypes.c_ubyte, Literal[1]] + port_access_reg_cap_mask_61_to_36: c.Array[ctypes.c_ubyte, Literal[26]] + pplm: c.Array[ctypes.c_ubyte, Literal[1]] + port_access_reg_cap_mask_34_to_32: c.Array[ctypes.c_ubyte, Literal[3]] + port_access_reg_cap_mask_31_to_13: c.Array[ctypes.c_ubyte, Literal[19]] + pbmc: c.Array[ctypes.c_ubyte, Literal[1]] + pptb: c.Array[ctypes.c_ubyte, Literal[1]] + port_access_reg_cap_mask_10_to_09: c.Array[ctypes.c_ubyte, Literal[2]] + ppcnt: c.Array[ctypes.c_ubyte, Literal[1]] + port_access_reg_cap_mask_07_to_00: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_pcam_regs_5000_to_507f_bits.register_fields([('port_access_reg_cap_mask_127_to_96', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('port_access_reg_cap_mask_95_to_64', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('port_access_reg_cap_mask_63', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('pphcr', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('port_access_reg_cap_mask_61_to_36', c.Array[ctypes.c_ubyte, Literal[26]], 66), ('pplm', c.Array[ctypes.c_ubyte, Literal[1]], 92), ('port_access_reg_cap_mask_34_to_32', c.Array[ctypes.c_ubyte, Literal[3]], 93), ('port_access_reg_cap_mask_31_to_13', c.Array[ctypes.c_ubyte, Literal[19]], 96), ('pbmc', c.Array[ctypes.c_ubyte, Literal[1]], 115), ('pptb', c.Array[ctypes.c_ubyte, Literal[1]], 116), ('port_access_reg_cap_mask_10_to_09', c.Array[ctypes.c_ubyte, Literal[2]], 117), ('ppcnt', c.Array[ctypes.c_ubyte, Literal[1]], 119), ('port_access_reg_cap_mask_07_to_00', c.Array[ctypes.c_ubyte, Literal[8]], 120)]) +@c.record +class struct_mlx5_ifc_pcam_reg_bits(c.Struct): + SIZE = 640 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + feature_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + access_reg_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + port_access_reg_cap_mask: struct_mlx5_ifc_pcam_reg_bits_port_access_reg_cap_mask + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[128]] + feature_cap_mask: struct_mlx5_ifc_pcam_reg_bits_feature_cap_mask + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[192]] +@c.record +class struct_mlx5_ifc_pcam_reg_bits_port_access_reg_cap_mask(c.Struct): + SIZE = 128 + regs_5000_to_507f: struct_mlx5_ifc_pcam_regs_5000_to_507f_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_pcam_reg_bits_port_access_reg_cap_mask.register_fields([('regs_5000_to_507f', struct_mlx5_ifc_pcam_regs_5000_to_507f_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0)]) +@c.record +class struct_mlx5_ifc_pcam_reg_bits_feature_cap_mask(c.Struct): + SIZE = 128 + enhanced_features: struct_mlx5_ifc_pcam_enhanced_features_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_pcam_reg_bits_feature_cap_mask.register_fields([('enhanced_features', struct_mlx5_ifc_pcam_enhanced_features_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0)]) +struct_mlx5_ifc_pcam_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('feature_group', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('access_reg_group', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('port_access_reg_cap_mask', struct_mlx5_ifc_pcam_reg_bits_port_access_reg_cap_mask, 64), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[128]], 192), ('feature_cap_mask', struct_mlx5_ifc_pcam_reg_bits_feature_cap_mask, 320), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[192]], 448)]) +@c.record +class struct_mlx5_ifc_mcam_enhanced_features_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[80]] + mtutc_freq_adj_units: c.Array[ctypes.c_ubyte, Literal[1]] + mtutc_time_adjustment_extended_range: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_52: c.Array[ctypes.c_ubyte, Literal[11]] + mcia_32dwords: c.Array[ctypes.c_ubyte, Literal[1]] + out_pulse_duration_ns: c.Array[ctypes.c_ubyte, Literal[1]] + npps_period: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[10]] + reset_state: c.Array[ctypes.c_ubyte, Literal[1]] + ptpcyc2realtime_modify: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_6c: c.Array[ctypes.c_ubyte, Literal[2]] + pci_status_and_power: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_6f: c.Array[ctypes.c_ubyte, Literal[5]] + mark_tx_action_cnp: c.Array[ctypes.c_ubyte, Literal[1]] + mark_tx_action_cqe: c.Array[ctypes.c_ubyte, Literal[1]] + dynamic_tx_overflow: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_77: c.Array[ctypes.c_ubyte, Literal[4]] + pcie_outbound_stalled: c.Array[ctypes.c_ubyte, Literal[1]] + tx_overflow_buffer_pkt: c.Array[ctypes.c_ubyte, Literal[1]] + mtpps_enh_out_per_adj: c.Array[ctypes.c_ubyte, Literal[1]] + mtpps_fs: c.Array[ctypes.c_ubyte, Literal[1]] + pcie_performance_group: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_mcam_enhanced_features_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[80]], 0), ('mtutc_freq_adj_units', c.Array[ctypes.c_ubyte, Literal[1]], 80), ('mtutc_time_adjustment_extended_range', c.Array[ctypes.c_ubyte, Literal[1]], 81), ('reserved_at_52', c.Array[ctypes.c_ubyte, Literal[11]], 82), ('mcia_32dwords', c.Array[ctypes.c_ubyte, Literal[1]], 93), ('out_pulse_duration_ns', c.Array[ctypes.c_ubyte, Literal[1]], 94), ('npps_period', c.Array[ctypes.c_ubyte, Literal[1]], 95), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[10]], 96), ('reset_state', c.Array[ctypes.c_ubyte, Literal[1]], 106), ('ptpcyc2realtime_modify', c.Array[ctypes.c_ubyte, Literal[1]], 107), ('reserved_at_6c', c.Array[ctypes.c_ubyte, Literal[2]], 108), ('pci_status_and_power', c.Array[ctypes.c_ubyte, Literal[1]], 110), ('reserved_at_6f', c.Array[ctypes.c_ubyte, Literal[5]], 111), ('mark_tx_action_cnp', c.Array[ctypes.c_ubyte, Literal[1]], 116), ('mark_tx_action_cqe', c.Array[ctypes.c_ubyte, Literal[1]], 117), ('dynamic_tx_overflow', c.Array[ctypes.c_ubyte, Literal[1]], 118), ('reserved_at_77', c.Array[ctypes.c_ubyte, Literal[4]], 119), ('pcie_outbound_stalled', c.Array[ctypes.c_ubyte, Literal[1]], 123), ('tx_overflow_buffer_pkt', c.Array[ctypes.c_ubyte, Literal[1]], 124), ('mtpps_enh_out_per_adj', c.Array[ctypes.c_ubyte, Literal[1]], 125), ('mtpps_fs', c.Array[ctypes.c_ubyte, Literal[1]], 126), ('pcie_performance_group', c.Array[ctypes.c_ubyte, Literal[1]], 127)]) +@c.record +class struct_mlx5_ifc_mcam_access_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[28]] + mcda: c.Array[ctypes.c_ubyte, Literal[1]] + mcc: c.Array[ctypes.c_ubyte, Literal[1]] + mcqi: c.Array[ctypes.c_ubyte, Literal[1]] + mcqs: c.Array[ctypes.c_ubyte, Literal[1]] + regs_95_to_90: c.Array[ctypes.c_ubyte, Literal[6]] + mpir: c.Array[ctypes.c_ubyte, Literal[1]] + regs_88_to_87: c.Array[ctypes.c_ubyte, Literal[2]] + mpegc: c.Array[ctypes.c_ubyte, Literal[1]] + mtutc: c.Array[ctypes.c_ubyte, Literal[1]] + regs_84_to_68: c.Array[ctypes.c_ubyte, Literal[17]] + tracer_registers: c.Array[ctypes.c_ubyte, Literal[4]] + regs_63_to_46: c.Array[ctypes.c_ubyte, Literal[18]] + mrtc: c.Array[ctypes.c_ubyte, Literal[1]] + regs_44_to_41: c.Array[ctypes.c_ubyte, Literal[4]] + mfrl: c.Array[ctypes.c_ubyte, Literal[1]] + regs_39_to_32: c.Array[ctypes.c_ubyte, Literal[8]] + regs_31_to_11: c.Array[ctypes.c_ubyte, Literal[21]] + mtmp: c.Array[ctypes.c_ubyte, Literal[1]] + regs_9_to_0: c.Array[ctypes.c_ubyte, Literal[10]] +struct_mlx5_ifc_mcam_access_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[28]], 0), ('mcda', c.Array[ctypes.c_ubyte, Literal[1]], 28), ('mcc', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('mcqi', c.Array[ctypes.c_ubyte, Literal[1]], 30), ('mcqs', c.Array[ctypes.c_ubyte, Literal[1]], 31), ('regs_95_to_90', c.Array[ctypes.c_ubyte, Literal[6]], 32), ('mpir', c.Array[ctypes.c_ubyte, Literal[1]], 38), ('regs_88_to_87', c.Array[ctypes.c_ubyte, Literal[2]], 39), ('mpegc', c.Array[ctypes.c_ubyte, Literal[1]], 41), ('mtutc', c.Array[ctypes.c_ubyte, Literal[1]], 42), ('regs_84_to_68', c.Array[ctypes.c_ubyte, Literal[17]], 43), ('tracer_registers', c.Array[ctypes.c_ubyte, Literal[4]], 60), ('regs_63_to_46', c.Array[ctypes.c_ubyte, Literal[18]], 64), ('mrtc', c.Array[ctypes.c_ubyte, Literal[1]], 82), ('regs_44_to_41', c.Array[ctypes.c_ubyte, Literal[4]], 83), ('mfrl', c.Array[ctypes.c_ubyte, Literal[1]], 87), ('regs_39_to_32', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('regs_31_to_11', c.Array[ctypes.c_ubyte, Literal[21]], 96), ('mtmp', c.Array[ctypes.c_ubyte, Literal[1]], 117), ('regs_9_to_0', c.Array[ctypes.c_ubyte, Literal[10]], 118)]) +@c.record +class struct_mlx5_ifc_mcam_access_reg_bits1(c.Struct): + SIZE = 128 + regs_127_to_96: c.Array[ctypes.c_ubyte, Literal[32]] + regs_95_to_64: c.Array[ctypes.c_ubyte, Literal[32]] + regs_63_to_32: c.Array[ctypes.c_ubyte, Literal[32]] + regs_31_to_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mcam_access_reg_bits1.register_fields([('regs_127_to_96', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('regs_95_to_64', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('regs_63_to_32', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('regs_31_to_0', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_mcam_access_reg_bits2(c.Struct): + SIZE = 128 + regs_127_to_99: c.Array[ctypes.c_ubyte, Literal[29]] + mirc: c.Array[ctypes.c_ubyte, Literal[1]] + regs_97_to_96: c.Array[ctypes.c_ubyte, Literal[2]] + regs_95_to_87: c.Array[ctypes.c_ubyte, Literal[9]] + synce_registers: c.Array[ctypes.c_ubyte, Literal[2]] + regs_84_to_64: c.Array[ctypes.c_ubyte, Literal[21]] + regs_63_to_32: c.Array[ctypes.c_ubyte, Literal[32]] + regs_31_to_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mcam_access_reg_bits2.register_fields([('regs_127_to_99', c.Array[ctypes.c_ubyte, Literal[29]], 0), ('mirc', c.Array[ctypes.c_ubyte, Literal[1]], 29), ('regs_97_to_96', c.Array[ctypes.c_ubyte, Literal[2]], 30), ('regs_95_to_87', c.Array[ctypes.c_ubyte, Literal[9]], 32), ('synce_registers', c.Array[ctypes.c_ubyte, Literal[2]], 41), ('regs_84_to_64', c.Array[ctypes.c_ubyte, Literal[21]], 43), ('regs_63_to_32', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('regs_31_to_0', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_mcam_access_reg_bits3(c.Struct): + SIZE = 128 + regs_127_to_96: c.Array[ctypes.c_ubyte, Literal[32]] + regs_95_to_64: c.Array[ctypes.c_ubyte, Literal[32]] + regs_63_to_32: c.Array[ctypes.c_ubyte, Literal[32]] + regs_31_to_3: c.Array[ctypes.c_ubyte, Literal[29]] + mrtcq: c.Array[ctypes.c_ubyte, Literal[1]] + mtctr: c.Array[ctypes.c_ubyte, Literal[1]] + mtptm: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_mcam_access_reg_bits3.register_fields([('regs_127_to_96', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('regs_95_to_64', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('regs_63_to_32', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('regs_31_to_3', c.Array[ctypes.c_ubyte, Literal[29]], 96), ('mrtcq', c.Array[ctypes.c_ubyte, Literal[1]], 125), ('mtctr', c.Array[ctypes.c_ubyte, Literal[1]], 126), ('mtptm', c.Array[ctypes.c_ubyte, Literal[1]], 127)]) +@c.record +class struct_mlx5_ifc_mcam_reg_bits(c.Struct): + SIZE = 576 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + feature_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + access_reg_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + mng_access_reg_cap_mask: struct_mlx5_ifc_mcam_reg_bits_mng_access_reg_cap_mask + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[128]] + mng_feature_cap_mask: struct_mlx5_ifc_mcam_reg_bits_mng_feature_cap_mask + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[128]] +@c.record +class struct_mlx5_ifc_mcam_reg_bits_mng_access_reg_cap_mask(c.Struct): + SIZE = 128 + access_regs: struct_mlx5_ifc_mcam_access_reg_bits + access_regs1: struct_mlx5_ifc_mcam_access_reg_bits1 + access_regs2: struct_mlx5_ifc_mcam_access_reg_bits2 + access_regs3: struct_mlx5_ifc_mcam_access_reg_bits3 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_mcam_reg_bits_mng_access_reg_cap_mask.register_fields([('access_regs', struct_mlx5_ifc_mcam_access_reg_bits, 0), ('access_regs1', struct_mlx5_ifc_mcam_access_reg_bits1, 0), ('access_regs2', struct_mlx5_ifc_mcam_access_reg_bits2, 0), ('access_regs3', struct_mlx5_ifc_mcam_access_reg_bits3, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0)]) +@c.record +class struct_mlx5_ifc_mcam_reg_bits_mng_feature_cap_mask(c.Struct): + SIZE = 128 + enhanced_features: struct_mlx5_ifc_mcam_enhanced_features_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_mcam_reg_bits_mng_feature_cap_mask.register_fields([('enhanced_features', struct_mlx5_ifc_mcam_enhanced_features_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0)]) +struct_mlx5_ifc_mcam_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('feature_group', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('access_reg_group', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('mng_access_reg_cap_mask', struct_mlx5_ifc_mcam_reg_bits_mng_access_reg_cap_mask, 64), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[128]], 192), ('mng_feature_cap_mask', struct_mlx5_ifc_mcam_reg_bits_mng_feature_cap_mask, 320), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[128]], 448)]) +@c.record +class struct_mlx5_ifc_qcam_access_reg_cap_mask(c.Struct): + SIZE = 128 + qcam_access_reg_cap_mask_127_to_20: c.Array[ctypes.c_ubyte, Literal[108]] + qpdpm: c.Array[ctypes.c_ubyte, Literal[1]] + qcam_access_reg_cap_mask_18_to_4: c.Array[ctypes.c_ubyte, Literal[15]] + qdpm: c.Array[ctypes.c_ubyte, Literal[1]] + qpts: c.Array[ctypes.c_ubyte, Literal[1]] + qcap: c.Array[ctypes.c_ubyte, Literal[1]] + qcam_access_reg_cap_mask_0: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_qcam_access_reg_cap_mask.register_fields([('qcam_access_reg_cap_mask_127_to_20', c.Array[ctypes.c_ubyte, Literal[108]], 0), ('qpdpm', c.Array[ctypes.c_ubyte, Literal[1]], 108), ('qcam_access_reg_cap_mask_18_to_4', c.Array[ctypes.c_ubyte, Literal[15]], 109), ('qdpm', c.Array[ctypes.c_ubyte, Literal[1]], 124), ('qpts', c.Array[ctypes.c_ubyte, Literal[1]], 125), ('qcap', c.Array[ctypes.c_ubyte, Literal[1]], 126), ('qcam_access_reg_cap_mask_0', c.Array[ctypes.c_ubyte, Literal[1]], 127)]) +@c.record +class struct_mlx5_ifc_qcam_qos_feature_cap_mask(c.Struct): + SIZE = 128 + qcam_qos_feature_cap_mask_127_to_1: c.Array[ctypes.c_ubyte, Literal[127]] + qpts_trust_both: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_qcam_qos_feature_cap_mask.register_fields([('qcam_qos_feature_cap_mask_127_to_1', c.Array[ctypes.c_ubyte, Literal[127]], 0), ('qpts_trust_both', c.Array[ctypes.c_ubyte, Literal[1]], 127)]) +@c.record +class struct_mlx5_ifc_qcam_reg_bits(c.Struct): + SIZE = 576 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + feature_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + access_reg_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + qos_access_reg_cap_mask: struct_mlx5_ifc_qcam_reg_bits_qos_access_reg_cap_mask + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[128]] + qos_feature_cap_mask: struct_mlx5_ifc_qcam_reg_bits_qos_feature_cap_mask + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[128]] +@c.record +class struct_mlx5_ifc_qcam_reg_bits_qos_access_reg_cap_mask(c.Struct): + SIZE = 128 + reg_cap: struct_mlx5_ifc_qcam_access_reg_cap_mask + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_qcam_reg_bits_qos_access_reg_cap_mask.register_fields([('reg_cap', struct_mlx5_ifc_qcam_access_reg_cap_mask, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0)]) +@c.record +class struct_mlx5_ifc_qcam_reg_bits_qos_feature_cap_mask(c.Struct): + SIZE = 128 + feature_cap: struct_mlx5_ifc_qcam_qos_feature_cap_mask + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_qcam_reg_bits_qos_feature_cap_mask.register_fields([('feature_cap', struct_mlx5_ifc_qcam_qos_feature_cap_mask, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0)]) +struct_mlx5_ifc_qcam_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('feature_group', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('access_reg_group', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('qos_access_reg_cap_mask', struct_mlx5_ifc_qcam_reg_bits_qos_access_reg_cap_mask, 64), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[128]], 192), ('qos_feature_cap_mask', struct_mlx5_ifc_qcam_reg_bits_qos_feature_cap_mask, 320), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[128]], 448)]) +@c.record +class struct_mlx5_ifc_core_dump_reg_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[24]] + core_dump_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[48]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[8]] + qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_core_dump_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[24]], 0), ('core_dump_type', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[48]], 32), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('qpn', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +@c.record +class struct_mlx5_ifc_pcap_reg_bits(c.Struct): + SIZE = 160 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + port_capability_mask: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]] +struct_mlx5_ifc_pcap_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('port_capability_mask', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]], 32)]) +@c.record +class struct_mlx5_ifc_paos_reg_bits(c.Struct): + SIZE = 128 + swid: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[4]] + admin_status: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[4]] + oper_status: c.Array[ctypes.c_ubyte, Literal[4]] + ase: c.Array[ctypes.c_ubyte, Literal[1]] + ee: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[28]] + e: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_paos_reg_bits.register_fields([('swid', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[4]], 16), ('admin_status', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[4]], 24), ('oper_status', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('ase', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('ee', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[28]], 34), ('e', c.Array[ctypes.c_ubyte, Literal[2]], 62), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_pamp_reg_bits(c.Struct): + SIZE = 352 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + opamp_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[12]] + opamp_group_type: c.Array[ctypes.c_ubyte, Literal[4]] + start_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[4]] + num_of_indices: c.Array[ctypes.c_ubyte, Literal[12]] + index_data: c.Array[c.Array[ctypes.c_ubyte, Literal[16]], Literal[18]] +struct_mlx5_ifc_pamp_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('opamp_group', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[12]], 16), ('opamp_group_type', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('start_index', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[4]], 48), ('num_of_indices', c.Array[ctypes.c_ubyte, Literal[12]], 52), ('index_data', c.Array[c.Array[ctypes.c_ubyte, Literal[16]], Literal[18]], 64)]) +@c.record +class struct_mlx5_ifc_pcmr_reg_bits(c.Struct): + SIZE = 96 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + entropy_force_cap: c.Array[ctypes.c_ubyte, Literal[1]] + entropy_calc_cap: c.Array[ctypes.c_ubyte, Literal[1]] + entropy_gre_calc_cap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_23: c.Array[ctypes.c_ubyte, Literal[15]] + rx_ts_over_crc_cap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_33: c.Array[ctypes.c_ubyte, Literal[11]] + fcs_cap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3f: c.Array[ctypes.c_ubyte, Literal[1]] + entropy_force: c.Array[ctypes.c_ubyte, Literal[1]] + entropy_calc: c.Array[ctypes.c_ubyte, Literal[1]] + entropy_gre_calc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_43: c.Array[ctypes.c_ubyte, Literal[15]] + rx_ts_over_crc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_53: c.Array[ctypes.c_ubyte, Literal[11]] + fcs_chk: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5f: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_pcmr_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('entropy_force_cap', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('entropy_calc_cap', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('entropy_gre_calc_cap', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('reserved_at_23', c.Array[ctypes.c_ubyte, Literal[15]], 35), ('rx_ts_over_crc_cap', c.Array[ctypes.c_ubyte, Literal[1]], 50), ('reserved_at_33', c.Array[ctypes.c_ubyte, Literal[11]], 51), ('fcs_cap', c.Array[ctypes.c_ubyte, Literal[1]], 62), ('reserved_at_3f', c.Array[ctypes.c_ubyte, Literal[1]], 63), ('entropy_force', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('entropy_calc', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('entropy_gre_calc', c.Array[ctypes.c_ubyte, Literal[1]], 66), ('reserved_at_43', c.Array[ctypes.c_ubyte, Literal[15]], 67), ('rx_ts_over_crc', c.Array[ctypes.c_ubyte, Literal[1]], 82), ('reserved_at_53', c.Array[ctypes.c_ubyte, Literal[11]], 83), ('fcs_chk', c.Array[ctypes.c_ubyte, Literal[1]], 94), ('reserved_at_5f', c.Array[ctypes.c_ubyte, Literal[1]], 95)]) +@c.record +class struct_mlx5_ifc_lane_2_module_mapping_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + rx_lane: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[4]] + tx_lane: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + module: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_lane_2_module_mapping_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('rx_lane', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[4]], 8), ('tx_lane', c.Array[ctypes.c_ubyte, Literal[4]], 12), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('module', c.Array[ctypes.c_ubyte, Literal[8]], 24)]) +@c.record +class struct_mlx5_ifc_bufferx_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[6]] + lossy: c.Array[ctypes.c_ubyte, Literal[1]] + epsb: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[8]] + size: c.Array[ctypes.c_ubyte, Literal[16]] + xoff_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + xon_threshold: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_bufferx_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[6]], 0), ('lossy', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('epsb', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('size', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('xoff_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('xon_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 48)]) +@c.record +class struct_mlx5_ifc_set_node_in_bits(c.Struct): + SIZE = 512 + node_description: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[64]] +struct_mlx5_ifc_set_node_in_bits.register_fields([('node_description', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[64]], 0)]) +@c.record +class struct_mlx5_ifc_register_power_settings_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[24]] + power_settings_level: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_register_power_settings_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[24]], 0), ('power_settings_level', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32)]) +@c.record +class struct_mlx5_ifc_register_host_endianness_bits(c.Struct): + SIZE = 128 + he: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_register_host_endianness_bits.register_fields([('he', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[31]], 1), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32)]) +@c.record +class struct_mlx5_ifc_umr_pointer_desc_argument_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + mkey: c.Array[ctypes.c_ubyte, Literal[32]] + addressh_63_32: c.Array[ctypes.c_ubyte, Literal[32]] + addressl_31_0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_umr_pointer_desc_argument_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('mkey', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('addressh_63_32', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('addressl_31_0', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_ud_adrs_vector_bits(c.Struct): + SIZE = 384 + dc_key: c.Array[ctypes.c_ubyte, Literal[64]] + ext: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[7]] + destination_qp_dct: c.Array[ctypes.c_ubyte, Literal[24]] + static_rate: c.Array[ctypes.c_ubyte, Literal[4]] + sl_eth_prio: c.Array[ctypes.c_ubyte, Literal[4]] + fl: c.Array[ctypes.c_ubyte, Literal[1]] + mlid: c.Array[ctypes.c_ubyte, Literal[7]] + rlid_udp_sport: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[32]] + rmac_47_16: c.Array[ctypes.c_ubyte, Literal[32]] + rmac_15_0: c.Array[ctypes.c_ubyte, Literal[16]] + tclass: c.Array[ctypes.c_ubyte, Literal[8]] + hop_limit: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[1]] + grh: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_e2: c.Array[ctypes.c_ubyte, Literal[2]] + src_addr_index: c.Array[ctypes.c_ubyte, Literal[8]] + flow_label: c.Array[ctypes.c_ubyte, Literal[20]] + rgid_rip: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] +struct_mlx5_ifc_ud_adrs_vector_bits.register_fields([('dc_key', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('ext', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[7]], 65), ('destination_qp_dct', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('static_rate', c.Array[ctypes.c_ubyte, Literal[4]], 96), ('sl_eth_prio', c.Array[ctypes.c_ubyte, Literal[4]], 100), ('fl', c.Array[ctypes.c_ubyte, Literal[1]], 104), ('mlid', c.Array[ctypes.c_ubyte, Literal[7]], 105), ('rlid_udp_sport', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('rmac_47_16', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('rmac_15_0', c.Array[ctypes.c_ubyte, Literal[16]], 192), ('tclass', c.Array[ctypes.c_ubyte, Literal[8]], 208), ('hop_limit', c.Array[ctypes.c_ubyte, Literal[8]], 216), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[1]], 224), ('grh', c.Array[ctypes.c_ubyte, Literal[1]], 225), ('reserved_at_e2', c.Array[ctypes.c_ubyte, Literal[2]], 226), ('src_addr_index', c.Array[ctypes.c_ubyte, Literal[8]], 228), ('flow_label', c.Array[ctypes.c_ubyte, Literal[20]], 236), ('rgid_rip', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 256)]) +@c.record +class struct_mlx5_ifc_pages_req_event_bits(c.Struct): + SIZE = 224 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + num_pages: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[160]] +struct_mlx5_ifc_pages_req_event_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('num_pages', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[160]], 64)]) +@c.record +class struct_mlx5_ifc_eqe_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + event_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + event_sub_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[224]] + event_data: union_mlx5_ifc_event_auto_bits + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[16]] + signature: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_1f8: c.Array[ctypes.c_ubyte, Literal[7]] + owner: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_eqe_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('event_type', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('event_sub_type', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[224]], 32), ('event_data', union_mlx5_ifc_event_auto_bits, 256), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[16]], 480), ('signature', c.Array[ctypes.c_ubyte, Literal[8]], 496), ('reserved_at_1f8', c.Array[ctypes.c_ubyte, Literal[7]], 504), ('owner', c.Array[ctypes.c_ubyte, Literal[1]], 511)]) +_anonenum115: dict[int, str] = {(MLX5_CMD_QUEUE_ENTRY_TYPE_PCIE_CMD_IF_TRANSPORT:=7): 'MLX5_CMD_QUEUE_ENTRY_TYPE_PCIE_CMD_IF_TRANSPORT'} +@c.record +class struct_mlx5_ifc_cmd_queue_entry_bits(c.Struct): + SIZE = 512 + type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + input_length: c.Array[ctypes.c_ubyte, Literal[32]] + input_mailbox_pointer_63_32: c.Array[ctypes.c_ubyte, Literal[32]] + input_mailbox_pointer_31_9: c.Array[ctypes.c_ubyte, Literal[23]] + reserved_at_77: c.Array[ctypes.c_ubyte, Literal[9]] + command_input_inline_data: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] + command_output_inline_data: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]] + output_mailbox_pointer_63_32: c.Array[ctypes.c_ubyte, Literal[32]] + output_mailbox_pointer_31_9: c.Array[ctypes.c_ubyte, Literal[23]] + reserved_at_1b7: c.Array[ctypes.c_ubyte, Literal[9]] + output_length: c.Array[ctypes.c_ubyte, Literal[32]] + token: c.Array[ctypes.c_ubyte, Literal[8]] + signature: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_1f0: c.Array[ctypes.c_ubyte, Literal[8]] + status: c.Array[ctypes.c_ubyte, Literal[7]] + ownership: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_cmd_queue_entry_bits.register_fields([('type', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('input_length', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('input_mailbox_pointer_63_32', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('input_mailbox_pointer_31_9', c.Array[ctypes.c_ubyte, Literal[23]], 96), ('reserved_at_77', c.Array[ctypes.c_ubyte, Literal[9]], 119), ('command_input_inline_data', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 128), ('command_output_inline_data', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[16]], 256), ('output_mailbox_pointer_63_32', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('output_mailbox_pointer_31_9', c.Array[ctypes.c_ubyte, Literal[23]], 416), ('reserved_at_1b7', c.Array[ctypes.c_ubyte, Literal[9]], 439), ('output_length', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('token', c.Array[ctypes.c_ubyte, Literal[8]], 480), ('signature', c.Array[ctypes.c_ubyte, Literal[8]], 488), ('reserved_at_1f0', c.Array[ctypes.c_ubyte, Literal[8]], 496), ('status', c.Array[ctypes.c_ubyte, Literal[7]], 504), ('ownership', c.Array[ctypes.c_ubyte, Literal[1]], 511)]) +@c.record +class struct_mlx5_ifc_cmd_out_bits(c.Struct): + SIZE = 96 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + command_output: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_cmd_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('command_output', c.Array[ctypes.c_ubyte, Literal[32]], 64)]) +@c.record +class struct_mlx5_ifc_cmd_in_bits(c.Struct): + SIZE = 64 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + command: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]] +struct_mlx5_ifc_cmd_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('command', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]], 64)]) +@c.record +class struct_mlx5_ifc_cmd_if_box_bits(c.Struct): + SIZE = 4608 + mailbox_data: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[512]] + reserved_at_1000: c.Array[ctypes.c_ubyte, Literal[384]] + next_pointer_63_32: c.Array[ctypes.c_ubyte, Literal[32]] + next_pointer_31_10: c.Array[ctypes.c_ubyte, Literal[22]] + reserved_at_11b6: c.Array[ctypes.c_ubyte, Literal[10]] + block_number: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_11e0: c.Array[ctypes.c_ubyte, Literal[8]] + token: c.Array[ctypes.c_ubyte, Literal[8]] + ctrl_signature: c.Array[ctypes.c_ubyte, Literal[8]] + signature: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_cmd_if_box_bits.register_fields([('mailbox_data', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[512]], 0), ('reserved_at_1000', c.Array[ctypes.c_ubyte, Literal[384]], 4096), ('next_pointer_63_32', c.Array[ctypes.c_ubyte, Literal[32]], 4480), ('next_pointer_31_10', c.Array[ctypes.c_ubyte, Literal[22]], 4512), ('reserved_at_11b6', c.Array[ctypes.c_ubyte, Literal[10]], 4534), ('block_number', c.Array[ctypes.c_ubyte, Literal[32]], 4544), ('reserved_at_11e0', c.Array[ctypes.c_ubyte, Literal[8]], 4576), ('token', c.Array[ctypes.c_ubyte, Literal[8]], 4584), ('ctrl_signature', c.Array[ctypes.c_ubyte, Literal[8]], 4592), ('signature', c.Array[ctypes.c_ubyte, Literal[8]], 4600)]) +@c.record +class struct_mlx5_ifc_mtt_bits(c.Struct): + SIZE = 64 + ptag_63_32: c.Array[ctypes.c_ubyte, Literal[32]] + ptag_31_8: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[6]] + wr_en: c.Array[ctypes.c_ubyte, Literal[1]] + rd_en: c.Array[ctypes.c_ubyte, Literal[1]] +struct_mlx5_ifc_mtt_bits.register_fields([('ptag_63_32', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('ptag_31_8', c.Array[ctypes.c_ubyte, Literal[24]], 32), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[6]], 56), ('wr_en', c.Array[ctypes.c_ubyte, Literal[1]], 62), ('rd_en', c.Array[ctypes.c_ubyte, Literal[1]], 63)]) +@c.record +class struct_mlx5_ifc_query_wol_rol_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + rol_mode: c.Array[ctypes.c_ubyte, Literal[8]] + wol_mode: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_wol_rol_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('rol_mode', c.Array[ctypes.c_ubyte, Literal[8]], 80), ('wol_mode', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_wol_rol_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_wol_rol_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_wol_rol_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_wol_rol_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_wol_rol_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + rol_mode_valid: c.Array[ctypes.c_ubyte, Literal[1]] + wol_mode_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[14]] + rol_mode: c.Array[ctypes.c_ubyte, Literal[8]] + wol_mode: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_set_wol_rol_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('rol_mode_valid', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('wol_mode_valid', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[14]], 66), ('rol_mode', c.Array[ctypes.c_ubyte, Literal[8]], 80), ('wol_mode', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +_anonenum116: dict[int, str] = {(MLX5_INITIAL_SEG_NIC_INTERFACE_FULL_DRIVER:=0): 'MLX5_INITIAL_SEG_NIC_INTERFACE_FULL_DRIVER', (MLX5_INITIAL_SEG_NIC_INTERFACE_DISABLED:=1): 'MLX5_INITIAL_SEG_NIC_INTERFACE_DISABLED', (MLX5_INITIAL_SEG_NIC_INTERFACE_NO_DRAM_NIC:=2): 'MLX5_INITIAL_SEG_NIC_INTERFACE_NO_DRAM_NIC', (MLX5_INITIAL_SEG_NIC_INTERFACE_SW_RESET:=7): 'MLX5_INITIAL_SEG_NIC_INTERFACE_SW_RESET'} +_anonenum117: dict[int, str] = {(MLX5_INITIAL_SEG_NIC_INTERFACE_SUPPORTED_FULL_DRIVER:=0): 'MLX5_INITIAL_SEG_NIC_INTERFACE_SUPPORTED_FULL_DRIVER', (MLX5_INITIAL_SEG_NIC_INTERFACE_SUPPORTED_DISABLED:=1): 'MLX5_INITIAL_SEG_NIC_INTERFACE_SUPPORTED_DISABLED', (MLX5_INITIAL_SEG_NIC_INTERFACE_SUPPORTED_NO_DRAM_NIC:=2): 'MLX5_INITIAL_SEG_NIC_INTERFACE_SUPPORTED_NO_DRAM_NIC'} +_anonenum118: dict[int, str] = {(MLX5_INITIAL_SEG_HEALTH_SYNDROME_FW_INTERNAL_ERR:=1): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_FW_INTERNAL_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_DEAD_IRISC:=7): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_DEAD_IRISC', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_HW_FATAL_ERR:=8): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_HW_FATAL_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_FW_CRC_ERR:=9): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_FW_CRC_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_ICM_FETCH_PCI_ERR:=10): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_ICM_FETCH_PCI_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_ICM_PAGE_ERR:=11): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_ICM_PAGE_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_ASYNCHRONOUS_EQ_BUF_OVERRUN:=12): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_ASYNCHRONOUS_EQ_BUF_OVERRUN', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_EQ_IN_ERR:=13): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_EQ_IN_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_EQ_INV:=14): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_EQ_INV', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_FFSER_ERR:=15): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_FFSER_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_HIGH_TEMP_ERR:=16): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_HIGH_TEMP_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_ICM_PCI_POISONED_ERR:=18): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_ICM_PCI_POISONED_ERR', (MLX5_INITIAL_SEG_HEALTH_SYNDROME_TRUST_LOCKDOWN_ERR:=19): 'MLX5_INITIAL_SEG_HEALTH_SYNDROME_TRUST_LOCKDOWN_ERR'} +@c.record +class struct_mlx5_ifc_initial_seg_bits(c.Struct): + SIZE = 131168 + fw_rev_minor: c.Array[ctypes.c_ubyte, Literal[16]] + fw_rev_major: c.Array[ctypes.c_ubyte, Literal[16]] + cmd_interface_rev: c.Array[ctypes.c_ubyte, Literal[16]] + fw_rev_subminor: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + cmdq_phy_addr_63_32: c.Array[ctypes.c_ubyte, Literal[32]] + cmdq_phy_addr_31_12: c.Array[ctypes.c_ubyte, Literal[20]] + reserved_at_b4: c.Array[ctypes.c_ubyte, Literal[2]] + nic_interface: c.Array[ctypes.c_ubyte, Literal[2]] + log_cmdq_size: c.Array[ctypes.c_ubyte, Literal[4]] + log_cmdq_stride: c.Array[ctypes.c_ubyte, Literal[4]] + command_doorbell_vector: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[3840]] + initializing: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_fe1: c.Array[ctypes.c_ubyte, Literal[4]] + nic_interface_supported: c.Array[ctypes.c_ubyte, Literal[3]] + embedded_cpu: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_fe9: c.Array[ctypes.c_ubyte, Literal[23]] + health_buffer: struct_mlx5_ifc_health_buffer_bits + no_dram_nic_offset: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1220: c.Array[ctypes.c_ubyte, Literal[28224]] + reserved_at_8060: c.Array[ctypes.c_ubyte, Literal[31]] + clear_int: c.Array[ctypes.c_ubyte, Literal[1]] + health_syndrome: c.Array[ctypes.c_ubyte, Literal[8]] + health_counter: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80a0: c.Array[ctypes.c_ubyte, Literal[98240]] +struct_mlx5_ifc_initial_seg_bits.register_fields([('fw_rev_minor', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('fw_rev_major', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('cmd_interface_rev', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('fw_rev_subminor', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('cmdq_phy_addr_63_32', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('cmdq_phy_addr_31_12', c.Array[ctypes.c_ubyte, Literal[20]], 160), ('reserved_at_b4', c.Array[ctypes.c_ubyte, Literal[2]], 180), ('nic_interface', c.Array[ctypes.c_ubyte, Literal[2]], 182), ('log_cmdq_size', c.Array[ctypes.c_ubyte, Literal[4]], 184), ('log_cmdq_stride', c.Array[ctypes.c_ubyte, Literal[4]], 188), ('command_doorbell_vector', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[3840]], 224), ('initializing', c.Array[ctypes.c_ubyte, Literal[1]], 4064), ('reserved_at_fe1', c.Array[ctypes.c_ubyte, Literal[4]], 4065), ('nic_interface_supported', c.Array[ctypes.c_ubyte, Literal[3]], 4069), ('embedded_cpu', c.Array[ctypes.c_ubyte, Literal[1]], 4072), ('reserved_at_fe9', c.Array[ctypes.c_ubyte, Literal[23]], 4073), ('health_buffer', struct_mlx5_ifc_health_buffer_bits, 4096), ('no_dram_nic_offset', c.Array[ctypes.c_ubyte, Literal[32]], 4608), ('reserved_at_1220', c.Array[ctypes.c_ubyte, Literal[28224]], 4640), ('reserved_at_8060', c.Array[ctypes.c_ubyte, Literal[31]], 32864), ('clear_int', c.Array[ctypes.c_ubyte, Literal[1]], 32895), ('health_syndrome', c.Array[ctypes.c_ubyte, Literal[8]], 32896), ('health_counter', c.Array[ctypes.c_ubyte, Literal[24]], 32904), ('reserved_at_80a0', c.Array[ctypes.c_ubyte, Literal[98240]], 32928)]) +@c.record +class struct_mlx5_ifc_mtpps_reg_bits(c.Struct): + SIZE = 480 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[12]] + cap_number_of_pps_pins: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[4]] + cap_max_num_of_pps_in_pins: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[4]] + cap_max_num_of_pps_out_pins: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[19]] + cap_log_min_npps_period: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[3]] + cap_log_min_out_pulse_duration_ns: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[4]] + cap_pin_3_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[4]] + cap_pin_2_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[4]] + cap_pin_1_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_58: c.Array[ctypes.c_ubyte, Literal[4]] + cap_pin_0_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[4]] + cap_pin_7_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[4]] + cap_pin_6_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_70: c.Array[ctypes.c_ubyte, Literal[4]] + cap_pin_5_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_78: c.Array[ctypes.c_ubyte, Literal[4]] + cap_pin_4_mode: c.Array[ctypes.c_ubyte, Literal[4]] + field_select: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + npps_period: c.Array[ctypes.c_ubyte, Literal[64]] + enable: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_101: c.Array[ctypes.c_ubyte, Literal[11]] + pattern: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_110: c.Array[ctypes.c_ubyte, Literal[4]] + pin_mode: c.Array[ctypes.c_ubyte, Literal[4]] + pin: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[2]] + out_pulse_duration_ns: c.Array[ctypes.c_ubyte, Literal[30]] + time_stamp: c.Array[ctypes.c_ubyte, Literal[64]] + out_pulse_duration: c.Array[ctypes.c_ubyte, Literal[16]] + out_periodic_adjustment: c.Array[ctypes.c_ubyte, Literal[16]] + enhanced_out_periodic_adjustment: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mtpps_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[12]], 0), ('cap_number_of_pps_pins', c.Array[ctypes.c_ubyte, Literal[4]], 12), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[4]], 16), ('cap_max_num_of_pps_in_pins', c.Array[ctypes.c_ubyte, Literal[4]], 20), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[4]], 24), ('cap_max_num_of_pps_out_pins', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[19]], 32), ('cap_log_min_npps_period', c.Array[ctypes.c_ubyte, Literal[5]], 51), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[3]], 56), ('cap_log_min_out_pulse_duration_ns', c.Array[ctypes.c_ubyte, Literal[5]], 59), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('cap_pin_3_mode', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[4]], 72), ('cap_pin_2_mode', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[4]], 80), ('cap_pin_1_mode', c.Array[ctypes.c_ubyte, Literal[4]], 84), ('reserved_at_58', c.Array[ctypes.c_ubyte, Literal[4]], 88), ('cap_pin_0_mode', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[4]], 96), ('cap_pin_7_mode', c.Array[ctypes.c_ubyte, Literal[4]], 100), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[4]], 104), ('cap_pin_6_mode', c.Array[ctypes.c_ubyte, Literal[4]], 108), ('reserved_at_70', c.Array[ctypes.c_ubyte, Literal[4]], 112), ('cap_pin_5_mode', c.Array[ctypes.c_ubyte, Literal[4]], 116), ('reserved_at_78', c.Array[ctypes.c_ubyte, Literal[4]], 120), ('cap_pin_4_mode', c.Array[ctypes.c_ubyte, Literal[4]], 124), ('field_select', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('npps_period', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('enable', c.Array[ctypes.c_ubyte, Literal[1]], 256), ('reserved_at_101', c.Array[ctypes.c_ubyte, Literal[11]], 257), ('pattern', c.Array[ctypes.c_ubyte, Literal[4]], 268), ('reserved_at_110', c.Array[ctypes.c_ubyte, Literal[4]], 272), ('pin_mode', c.Array[ctypes.c_ubyte, Literal[4]], 276), ('pin', c.Array[ctypes.c_ubyte, Literal[8]], 280), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[2]], 288), ('out_pulse_duration_ns', c.Array[ctypes.c_ubyte, Literal[30]], 290), ('time_stamp', c.Array[ctypes.c_ubyte, Literal[64]], 320), ('out_pulse_duration', c.Array[ctypes.c_ubyte, Literal[16]], 384), ('out_periodic_adjustment', c.Array[ctypes.c_ubyte, Literal[16]], 400), ('enhanced_out_periodic_adjustment', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[32]], 448)]) +@c.record +class struct_mlx5_ifc_mtppse_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[24]] + pin: c.Array[ctypes.c_ubyte, Literal[8]] + event_arm: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[27]] + event_generation_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_mtppse_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[24]], 0), ('pin', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('event_arm', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[27]], 33), ('event_generation_mode', c.Array[ctypes.c_ubyte, Literal[4]], 60), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_mcqs_reg_bits(c.Struct): + SIZE = 128 + last_index_flag: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[7]] + fw_device: c.Array[ctypes.c_ubyte, Literal[8]] + component_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + identifier: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[23]] + component_status: c.Array[ctypes.c_ubyte, Literal[5]] + component_update_state: c.Array[ctypes.c_ubyte, Literal[4]] + last_update_state_changer_type: c.Array[ctypes.c_ubyte, Literal[4]] + last_update_state_changer_host_id: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_mcqs_reg_bits.register_fields([('last_index_flag', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[7]], 1), ('fw_device', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('component_index', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('identifier', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[23]], 64), ('component_status', c.Array[ctypes.c_ubyte, Literal[5]], 87), ('component_update_state', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('last_update_state_changer_type', c.Array[ctypes.c_ubyte, Literal[4]], 96), ('last_update_state_changer_host_id', c.Array[ctypes.c_ubyte, Literal[4]], 100), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[24]], 104)]) +@c.record +class struct_mlx5_ifc_mcqi_cap_bits(c.Struct): + SIZE = 160 + supported_info_bitmask: c.Array[ctypes.c_ubyte, Literal[32]] + component_size: c.Array[ctypes.c_ubyte, Literal[32]] + max_component_size: c.Array[ctypes.c_ubyte, Literal[32]] + log_mcda_word_size: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_64: c.Array[ctypes.c_ubyte, Literal[12]] + mcda_max_write_size: c.Array[ctypes.c_ubyte, Literal[16]] + rd_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_81: c.Array[ctypes.c_ubyte, Literal[1]] + match_chip_id: c.Array[ctypes.c_ubyte, Literal[1]] + match_psid: c.Array[ctypes.c_ubyte, Literal[1]] + check_user_timestamp: c.Array[ctypes.c_ubyte, Literal[1]] + match_base_guid_mac: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_86: c.Array[ctypes.c_ubyte, Literal[26]] +struct_mlx5_ifc_mcqi_cap_bits.register_fields([('supported_info_bitmask', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('component_size', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('max_component_size', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('log_mcda_word_size', c.Array[ctypes.c_ubyte, Literal[4]], 96), ('reserved_at_64', c.Array[ctypes.c_ubyte, Literal[12]], 100), ('mcda_max_write_size', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('rd_en', c.Array[ctypes.c_ubyte, Literal[1]], 128), ('reserved_at_81', c.Array[ctypes.c_ubyte, Literal[1]], 129), ('match_chip_id', c.Array[ctypes.c_ubyte, Literal[1]], 130), ('match_psid', c.Array[ctypes.c_ubyte, Literal[1]], 131), ('check_user_timestamp', c.Array[ctypes.c_ubyte, Literal[1]], 132), ('match_base_guid_mac', c.Array[ctypes.c_ubyte, Literal[1]], 133), ('reserved_at_86', c.Array[ctypes.c_ubyte, Literal[26]], 134)]) +@c.record +class struct_mlx5_ifc_mcqi_version_bits(c.Struct): + SIZE = 992 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[2]] + build_time_valid: c.Array[ctypes.c_ubyte, Literal[1]] + user_defined_time_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[20]] + version_string_length: c.Array[ctypes.c_ubyte, Literal[8]] + version: c.Array[ctypes.c_ubyte, Literal[32]] + build_time: c.Array[ctypes.c_ubyte, Literal[64]] + user_defined_time: c.Array[ctypes.c_ubyte, Literal[64]] + build_tool_version: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] + version_string: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[92]] +struct_mlx5_ifc_mcqi_version_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[2]], 0), ('build_time_valid', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('user_defined_time_valid', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[20]], 4), ('version_string_length', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('version', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('build_time', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('user_defined_time', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('build_tool_version', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('version_string', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[92]], 256)]) +@c.record +class struct_mlx5_ifc_mcqi_activation_method_bits(c.Struct): + SIZE = 32 + pending_server_ac_power_cycle: c.Array[ctypes.c_ubyte, Literal[1]] + pending_server_dc_power_cycle: c.Array[ctypes.c_ubyte, Literal[1]] + pending_server_reboot: c.Array[ctypes.c_ubyte, Literal[1]] + pending_fw_reset: c.Array[ctypes.c_ubyte, Literal[1]] + auto_activate: c.Array[ctypes.c_ubyte, Literal[1]] + all_hosts_sync: c.Array[ctypes.c_ubyte, Literal[1]] + device_hw_reset: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_7: c.Array[ctypes.c_ubyte, Literal[25]] +struct_mlx5_ifc_mcqi_activation_method_bits.register_fields([('pending_server_ac_power_cycle', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('pending_server_dc_power_cycle', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('pending_server_reboot', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('pending_fw_reset', c.Array[ctypes.c_ubyte, Literal[1]], 3), ('auto_activate', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('all_hosts_sync', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('device_hw_reset', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('reserved_at_7', c.Array[ctypes.c_ubyte, Literal[25]], 7)]) +@c.record +class union_mlx5_ifc_mcqi_reg_data_bits(c.Struct): + SIZE = 992 + mcqi_caps: struct_mlx5_ifc_mcqi_cap_bits + mcqi_version: struct_mlx5_ifc_mcqi_version_bits + mcqi_activation_mathod: struct_mlx5_ifc_mcqi_activation_method_bits +union_mlx5_ifc_mcqi_reg_data_bits.register_fields([('mcqi_caps', struct_mlx5_ifc_mcqi_cap_bits, 0), ('mcqi_version', struct_mlx5_ifc_mcqi_version_bits, 0), ('mcqi_activation_mathod', struct_mlx5_ifc_mcqi_activation_method_bits, 0)]) +@c.record +class struct_mlx5_ifc_mcqi_reg_bits(c.Struct): + SIZE = 192 + read_pending_component: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[15]] + component_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[27]] + info_type: c.Array[ctypes.c_ubyte, Literal[5]] + info_size: c.Array[ctypes.c_ubyte, Literal[32]] + offset: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[16]] + data_size: c.Array[ctypes.c_ubyte, Literal[16]] + data: c.Array[union_mlx5_ifc_mcqi_reg_data_bits, Literal[0]] +struct_mlx5_ifc_mcqi_reg_bits.register_fields([('read_pending_component', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[15]], 1), ('component_index', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[27]], 64), ('info_type', c.Array[ctypes.c_ubyte, Literal[5]], 91), ('info_size', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('offset', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('data_size', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('data', c.Array[union_mlx5_ifc_mcqi_reg_data_bits, Literal[0]], 192)]) +@c.record +class struct_mlx5_ifc_mcc_reg_bits(c.Struct): + SIZE = 256 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[4]] + time_elapsed_since_last_cmd: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + instruction: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + component_index: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + update_handle: c.Array[ctypes.c_ubyte, Literal[24]] + handle_owner_type: c.Array[ctypes.c_ubyte, Literal[4]] + handle_owner_host_id: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[1]] + control_progress: c.Array[ctypes.c_ubyte, Literal[7]] + error_code: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_78: c.Array[ctypes.c_ubyte, Literal[4]] + control_state: c.Array[ctypes.c_ubyte, Literal[4]] + component_size: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_mcc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('time_elapsed_since_last_cmd', c.Array[ctypes.c_ubyte, Literal[12]], 4), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('instruction', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('component_index', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('update_handle', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('handle_owner_type', c.Array[ctypes.c_ubyte, Literal[4]], 96), ('handle_owner_host_id', c.Array[ctypes.c_ubyte, Literal[4]], 100), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[1]], 104), ('control_progress', c.Array[ctypes.c_ubyte, Literal[7]], 105), ('error_code', c.Array[ctypes.c_ubyte, Literal[8]], 112), ('reserved_at_78', c.Array[ctypes.c_ubyte, Literal[4]], 120), ('control_state', c.Array[ctypes.c_ubyte, Literal[4]], 124), ('component_size', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[96]], 160)]) +@c.record +class struct_mlx5_ifc_mcda_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + update_handle: c.Array[ctypes.c_ubyte, Literal[24]] + offset: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + size: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + data: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]] +struct_mlx5_ifc_mcda_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('update_handle', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('offset', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('size', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('data', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[0]], 128)]) +_anonenum119: dict[int, str] = {(MLX5_MFRL_REG_PCI_RESET_METHOD_LINK_TOGGLE:=0): 'MLX5_MFRL_REG_PCI_RESET_METHOD_LINK_TOGGLE', (MLX5_MFRL_REG_PCI_RESET_METHOD_HOT_RESET:=1): 'MLX5_MFRL_REG_PCI_RESET_METHOD_HOT_RESET'} +_anonenum120: dict[int, str] = {(MLX5_MFRL_REG_RESET_STATE_IDLE:=0): 'MLX5_MFRL_REG_RESET_STATE_IDLE', (MLX5_MFRL_REG_RESET_STATE_IN_NEGOTIATION:=1): 'MLX5_MFRL_REG_RESET_STATE_IN_NEGOTIATION', (MLX5_MFRL_REG_RESET_STATE_RESET_IN_PROGRESS:=2): 'MLX5_MFRL_REG_RESET_STATE_RESET_IN_PROGRESS', (MLX5_MFRL_REG_RESET_STATE_NEG_TIMEOUT:=3): 'MLX5_MFRL_REG_RESET_STATE_NEG_TIMEOUT', (MLX5_MFRL_REG_RESET_STATE_NACK:=4): 'MLX5_MFRL_REG_RESET_STATE_NACK', (MLX5_MFRL_REG_RESET_STATE_UNLOAD_TIMEOUT:=5): 'MLX5_MFRL_REG_RESET_STATE_UNLOAD_TIMEOUT'} +_anonenum121: dict[int, str] = {(MLX5_MFRL_REG_RESET_TYPE_FULL_CHIP:=0): 'MLX5_MFRL_REG_RESET_TYPE_FULL_CHIP', (MLX5_MFRL_REG_RESET_TYPE_NET_PORT_ALIVE:=1): 'MLX5_MFRL_REG_RESET_TYPE_NET_PORT_ALIVE'} +_anonenum122: dict[int, str] = {(MLX5_MFRL_REG_RESET_LEVEL0:=0): 'MLX5_MFRL_REG_RESET_LEVEL0', (MLX5_MFRL_REG_RESET_LEVEL3:=1): 'MLX5_MFRL_REG_RESET_LEVEL3', (MLX5_MFRL_REG_RESET_LEVEL6:=2): 'MLX5_MFRL_REG_RESET_LEVEL6'} +@c.record +class struct_mlx5_ifc_mfrl_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[2]] + pci_sync_for_fw_update_start: c.Array[ctypes.c_ubyte, Literal[1]] + pci_sync_for_fw_update_resp: c.Array[ctypes.c_ubyte, Literal[2]] + rst_type_sel: c.Array[ctypes.c_ubyte, Literal[3]] + pci_reset_req_method: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_2b: c.Array[ctypes.c_ubyte, Literal[1]] + reset_state: c.Array[ctypes.c_ubyte, Literal[4]] + reset_type: c.Array[ctypes.c_ubyte, Literal[8]] + reset_level: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_mfrl_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[2]], 32), ('pci_sync_for_fw_update_start', c.Array[ctypes.c_ubyte, Literal[1]], 34), ('pci_sync_for_fw_update_resp', c.Array[ctypes.c_ubyte, Literal[2]], 35), ('rst_type_sel', c.Array[ctypes.c_ubyte, Literal[3]], 37), ('pci_reset_req_method', c.Array[ctypes.c_ubyte, Literal[3]], 40), ('reserved_at_2b', c.Array[ctypes.c_ubyte, Literal[1]], 43), ('reset_state', c.Array[ctypes.c_ubyte, Literal[4]], 44), ('reset_type', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('reset_level', c.Array[ctypes.c_ubyte, Literal[8]], 56)]) +@c.record +class struct_mlx5_ifc_mirc_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[24]] + status_code: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mirc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[24]], 0), ('status_code', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +@c.record +class struct_mlx5_ifc_pddr_monitor_opcode_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + monitor_opcode: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_pddr_monitor_opcode_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('monitor_opcode', c.Array[ctypes.c_ubyte, Literal[16]], 16)]) +@c.record +class union_mlx5_ifc_pddr_troubleshooting_page_status_opcode_auto_bits(c.Struct): + SIZE = 32 + pddr_monitor_opcode: struct_mlx5_ifc_pddr_monitor_opcode_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] +union_mlx5_ifc_pddr_troubleshooting_page_status_opcode_auto_bits.register_fields([('pddr_monitor_opcode', struct_mlx5_ifc_pddr_monitor_opcode_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0)]) +_anonenum123: dict[int, str] = {(MLX5_PDDR_REG_TRBLSH_GROUP_OPCODE_MONITOR:=0): 'MLX5_PDDR_REG_TRBLSH_GROUP_OPCODE_MONITOR'} +@c.record +class struct_mlx5_ifc_pddr_troubleshooting_page_bits(c.Struct): + SIZE = 1984 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + group_opcode: c.Array[ctypes.c_ubyte, Literal[16]] + status_opcode: union_mlx5_ifc_pddr_troubleshooting_page_status_opcode_auto_bits + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + status_message: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[59]] +struct_mlx5_ifc_pddr_troubleshooting_page_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('group_opcode', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('status_opcode', union_mlx5_ifc_pddr_troubleshooting_page_status_opcode_auto_bits, 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('status_message', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[59]], 96)]) +@c.record +class union_mlx5_ifc_pddr_reg_page_data_auto_bits(c.Struct): + SIZE = 1984 + pddr_troubleshooting_page: struct_mlx5_ifc_pddr_troubleshooting_page_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[1984]] +union_mlx5_ifc_pddr_reg_page_data_auto_bits.register_fields([('pddr_troubleshooting_page', struct_mlx5_ifc_pddr_troubleshooting_page_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[1984]], 0)]) +_anonenum124: dict[int, str] = {(MLX5_PDDR_REG_PAGE_SELECT_TROUBLESHOOTING_INFO_PAGE:=1): 'MLX5_PDDR_REG_PAGE_SELECT_TROUBLESHOOTING_INFO_PAGE'} +@c.record +class struct_mlx5_ifc_pddr_reg_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + pnat: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_12: c.Array[ctypes.c_ubyte, Literal[14]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[24]] + page_select: c.Array[ctypes.c_ubyte, Literal[8]] + page_data: union_mlx5_ifc_pddr_reg_page_data_auto_bits +struct_mlx5_ifc_pddr_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('pnat', c.Array[ctypes.c_ubyte, Literal[2]], 16), ('reserved_at_12', c.Array[ctypes.c_ubyte, Literal[14]], 18), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[24]], 32), ('page_select', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('page_data', union_mlx5_ifc_pddr_reg_page_data_auto_bits, 64)]) +@c.record +class struct_mlx5_ifc_mrtc_reg_bits(c.Struct): + SIZE = 128 + time_synced: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + time_h: c.Array[ctypes.c_ubyte, Literal[32]] + time_l: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mrtc_reg_bits.register_fields([('time_synced', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[31]], 1), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('time_h', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('time_l', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_mtcap_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[25]] + sensor_count: c.Array[ctypes.c_ubyte, Literal[7]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + sensor_map: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_mtcap_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[25]], 0), ('sensor_count', c.Array[ctypes.c_ubyte, Literal[7]], 25), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('sensor_map', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_mtmp_reg_bits(c.Struct): + SIZE = 256 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[20]] + sensor_index: c.Array[ctypes.c_ubyte, Literal[12]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + temperature: c.Array[ctypes.c_ubyte, Literal[16]] + mte: c.Array[ctypes.c_ubyte, Literal[1]] + mtr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[14]] + max_temperature: c.Array[ctypes.c_ubyte, Literal[16]] + tee: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_62: c.Array[ctypes.c_ubyte, Literal[14]] + temp_threshold_hi: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[16]] + temp_threshold_lo: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + sensor_name_hi: c.Array[ctypes.c_ubyte, Literal[32]] + sensor_name_lo: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mtmp_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[20]], 0), ('sensor_index', c.Array[ctypes.c_ubyte, Literal[12]], 20), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('temperature', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('mte', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('mtr', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[14]], 66), ('max_temperature', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('tee', c.Array[ctypes.c_ubyte, Literal[2]], 96), ('reserved_at_62', c.Array[ctypes.c_ubyte, Literal[14]], 98), ('temp_threshold_hi', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('temp_threshold_lo', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('sensor_name_hi', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('sensor_name_lo', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_mtptm_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + psta: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_11: c.Array[ctypes.c_ubyte, Literal[15]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_mtptm_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('psta', c.Array[ctypes.c_ubyte, Literal[1]], 16), ('reserved_at_11', c.Array[ctypes.c_ubyte, Literal[15]], 17), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32)]) +_anonenum125: dict[int, str] = {(MLX5_MTCTR_REQUEST_NOP:=0): 'MLX5_MTCTR_REQUEST_NOP', (MLX5_MTCTR_REQUEST_PTM_ROOT_CLOCK:=1): 'MLX5_MTCTR_REQUEST_PTM_ROOT_CLOCK', (MLX5_MTCTR_REQUEST_FREE_RUNNING_COUNTER:=2): 'MLX5_MTCTR_REQUEST_FREE_RUNNING_COUNTER', (MLX5_MTCTR_REQUEST_REAL_TIME_CLOCK:=3): 'MLX5_MTCTR_REQUEST_REAL_TIME_CLOCK'} +@c.record +class struct_mlx5_ifc_mtctr_reg_bits(c.Struct): + SIZE = 192 + first_clock_timestamp_request: c.Array[ctypes.c_ubyte, Literal[8]] + second_clock_timestamp_request: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + first_clock_valid: c.Array[ctypes.c_ubyte, Literal[1]] + second_clock_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_22: c.Array[ctypes.c_ubyte, Literal[30]] + first_clock_timestamp: c.Array[ctypes.c_ubyte, Literal[64]] + second_clock_timestamp: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_mtctr_reg_bits.register_fields([('first_clock_timestamp_request', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('second_clock_timestamp_request', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('first_clock_valid', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('second_clock_valid', c.Array[ctypes.c_ubyte, Literal[1]], 33), ('reserved_at_22', c.Array[ctypes.c_ubyte, Literal[30]], 34), ('first_clock_timestamp', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('second_clock_timestamp', c.Array[ctypes.c_ubyte, Literal[64]], 128)]) +@c.record +class struct_mlx5_ifc_bin_range_layout_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[10]] + high_val: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[10]] + low_val: c.Array[ctypes.c_ubyte, Literal[6]] +struct_mlx5_ifc_bin_range_layout_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[10]], 0), ('high_val', c.Array[ctypes.c_ubyte, Literal[6]], 10), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[10]], 16), ('low_val', c.Array[ctypes.c_ubyte, Literal[6]], 26)]) +@c.record +class struct_mlx5_ifc_pphcr_reg_bits(c.Struct): + SIZE = 640 + active_hist_type: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[4]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + num_of_bins: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + bin_range: c.Array[struct_mlx5_ifc_bin_range_layout_bits, Literal[16]] +struct_mlx5_ifc_pphcr_reg_bits.register_fields([('active_hist_type', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('num_of_bins', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('bin_range', c.Array[struct_mlx5_ifc_bin_range_layout_bits, Literal[16]], 128)]) +@c.record +class union_mlx5_ifc_ports_control_registers_document_bits(c.Struct): + SIZE = 24800 + bufferx_reg: struct_mlx5_ifc_bufferx_reg_bits + eth_2819_cntrs_grp_data_layout: struct_mlx5_ifc_eth_2819_cntrs_grp_data_layout_bits + eth_2863_cntrs_grp_data_layout: struct_mlx5_ifc_eth_2863_cntrs_grp_data_layout_bits + eth_3635_cntrs_grp_data_layout: struct_mlx5_ifc_eth_3635_cntrs_grp_data_layout_bits + eth_802_3_cntrs_grp_data_layout: struct_mlx5_ifc_eth_802_3_cntrs_grp_data_layout_bits + eth_extended_cntrs_grp_data_layout: struct_mlx5_ifc_eth_extended_cntrs_grp_data_layout_bits + eth_per_prio_grp_data_layout: struct_mlx5_ifc_eth_per_prio_grp_data_layout_bits + eth_per_tc_prio_grp_data_layout: struct_mlx5_ifc_eth_per_tc_prio_grp_data_layout_bits + eth_per_tc_congest_prio_grp_data_layout: struct_mlx5_ifc_eth_per_tc_congest_prio_grp_data_layout_bits + lane_2_module_mapping: struct_mlx5_ifc_lane_2_module_mapping_bits + pamp_reg: struct_mlx5_ifc_pamp_reg_bits + paos_reg: struct_mlx5_ifc_paos_reg_bits + pcap_reg: struct_mlx5_ifc_pcap_reg_bits + pddr_monitor_opcode: struct_mlx5_ifc_pddr_monitor_opcode_bits + pddr_reg: struct_mlx5_ifc_pddr_reg_bits + pddr_troubleshooting_page: struct_mlx5_ifc_pddr_troubleshooting_page_bits + peir_reg: struct_mlx5_ifc_peir_reg_bits + pelc_reg: struct_mlx5_ifc_pelc_reg_bits + pfcc_reg: struct_mlx5_ifc_pfcc_reg_bits + ib_port_cntrs_grp_data_layout: struct_mlx5_ifc_ib_port_cntrs_grp_data_layout_bits + phys_layer_cntrs: struct_mlx5_ifc_phys_layer_cntrs_bits + pifr_reg: struct_mlx5_ifc_pifr_reg_bits + pipg_reg: struct_mlx5_ifc_pipg_reg_bits + plbf_reg: struct_mlx5_ifc_plbf_reg_bits + plib_reg: struct_mlx5_ifc_plib_reg_bits + plpc_reg: struct_mlx5_ifc_plpc_reg_bits + pmaos_reg: struct_mlx5_ifc_pmaos_reg_bits + pmlp_reg: struct_mlx5_ifc_pmlp_reg_bits + pmlpn_reg: struct_mlx5_ifc_pmlpn_reg_bits + pmpc_reg: struct_mlx5_ifc_pmpc_reg_bits + pmpe_reg: struct_mlx5_ifc_pmpe_reg_bits + pmpr_reg: struct_mlx5_ifc_pmpr_reg_bits + pmtu_reg: struct_mlx5_ifc_pmtu_reg_bits + ppad_reg: struct_mlx5_ifc_ppad_reg_bits + ppcnt_reg: struct_mlx5_ifc_ppcnt_reg_bits + mpein_reg: struct_mlx5_ifc_mpein_reg_bits + mpcnt_reg: struct_mlx5_ifc_mpcnt_reg_bits + pplm_reg: struct_mlx5_ifc_pplm_reg_bits + pplr_reg: struct_mlx5_ifc_pplr_reg_bits + ppsc_reg: struct_mlx5_ifc_ppsc_reg_bits + pqdr_reg: struct_mlx5_ifc_pqdr_reg_bits + pspa_reg: struct_mlx5_ifc_pspa_reg_bits + ptas_reg: struct_mlx5_ifc_ptas_reg_bits + ptys_reg: struct_mlx5_ifc_ptys_reg_bits + mlcr_reg: struct_mlx5_ifc_mlcr_reg_bits + pude_reg: struct_mlx5_ifc_pude_reg_bits + pvlc_reg: struct_mlx5_ifc_pvlc_reg_bits + slrg_reg: struct_mlx5_ifc_slrg_reg_bits + sltp_reg: struct_mlx5_ifc_sltp_reg_bits + mtpps_reg: struct_mlx5_ifc_mtpps_reg_bits + mtppse_reg: struct_mlx5_ifc_mtppse_reg_bits + fpga_access_reg: struct_mlx5_ifc_fpga_access_reg_bits + fpga_ctrl_bits: struct_mlx5_ifc_fpga_ctrl_bits + fpga_cap_bits: struct_mlx5_ifc_fpga_cap_bits + mcqi_reg: struct_mlx5_ifc_mcqi_reg_bits + mcc_reg: struct_mlx5_ifc_mcc_reg_bits + mcda_reg: struct_mlx5_ifc_mcda_reg_bits + mirc_reg: struct_mlx5_ifc_mirc_reg_bits + mfrl_reg: struct_mlx5_ifc_mfrl_reg_bits + mtutc_reg: struct_mlx5_ifc_mtutc_reg_bits + mrtc_reg: struct_mlx5_ifc_mrtc_reg_bits + mtcap_reg: struct_mlx5_ifc_mtcap_reg_bits + mtmp_reg: struct_mlx5_ifc_mtmp_reg_bits + mtptm_reg: struct_mlx5_ifc_mtptm_reg_bits + mtctr_reg: struct_mlx5_ifc_mtctr_reg_bits + pphcr_reg: struct_mlx5_ifc_pphcr_reg_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[24800]] +@c.record +class struct_mlx5_ifc_fpga_access_reg_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + size: c.Array[ctypes.c_ubyte, Literal[16]] + address: c.Array[ctypes.c_ubyte, Literal[64]] + data: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[0]] +struct_mlx5_ifc_fpga_access_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('size', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('address', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('data', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_fpga_ctrl_bits(c.Struct): + SIZE = 128 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + operation: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + flash_select_admin: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[8]] + flash_select_oper: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_fpga_ctrl_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('operation', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('status', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('flash_select_admin', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('flash_select_oper', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +union_mlx5_ifc_ports_control_registers_document_bits.register_fields([('bufferx_reg', struct_mlx5_ifc_bufferx_reg_bits, 0), ('eth_2819_cntrs_grp_data_layout', struct_mlx5_ifc_eth_2819_cntrs_grp_data_layout_bits, 0), ('eth_2863_cntrs_grp_data_layout', struct_mlx5_ifc_eth_2863_cntrs_grp_data_layout_bits, 0), ('eth_3635_cntrs_grp_data_layout', struct_mlx5_ifc_eth_3635_cntrs_grp_data_layout_bits, 0), ('eth_802_3_cntrs_grp_data_layout', struct_mlx5_ifc_eth_802_3_cntrs_grp_data_layout_bits, 0), ('eth_extended_cntrs_grp_data_layout', struct_mlx5_ifc_eth_extended_cntrs_grp_data_layout_bits, 0), ('eth_per_prio_grp_data_layout', struct_mlx5_ifc_eth_per_prio_grp_data_layout_bits, 0), ('eth_per_tc_prio_grp_data_layout', struct_mlx5_ifc_eth_per_tc_prio_grp_data_layout_bits, 0), ('eth_per_tc_congest_prio_grp_data_layout', struct_mlx5_ifc_eth_per_tc_congest_prio_grp_data_layout_bits, 0), ('lane_2_module_mapping', struct_mlx5_ifc_lane_2_module_mapping_bits, 0), ('pamp_reg', struct_mlx5_ifc_pamp_reg_bits, 0), ('paos_reg', struct_mlx5_ifc_paos_reg_bits, 0), ('pcap_reg', struct_mlx5_ifc_pcap_reg_bits, 0), ('pddr_monitor_opcode', struct_mlx5_ifc_pddr_monitor_opcode_bits, 0), ('pddr_reg', struct_mlx5_ifc_pddr_reg_bits, 0), ('pddr_troubleshooting_page', struct_mlx5_ifc_pddr_troubleshooting_page_bits, 0), ('peir_reg', struct_mlx5_ifc_peir_reg_bits, 0), ('pelc_reg', struct_mlx5_ifc_pelc_reg_bits, 0), ('pfcc_reg', struct_mlx5_ifc_pfcc_reg_bits, 0), ('ib_port_cntrs_grp_data_layout', struct_mlx5_ifc_ib_port_cntrs_grp_data_layout_bits, 0), ('phys_layer_cntrs', struct_mlx5_ifc_phys_layer_cntrs_bits, 0), ('pifr_reg', struct_mlx5_ifc_pifr_reg_bits, 0), ('pipg_reg', struct_mlx5_ifc_pipg_reg_bits, 0), ('plbf_reg', struct_mlx5_ifc_plbf_reg_bits, 0), ('plib_reg', struct_mlx5_ifc_plib_reg_bits, 0), ('plpc_reg', struct_mlx5_ifc_plpc_reg_bits, 0), ('pmaos_reg', struct_mlx5_ifc_pmaos_reg_bits, 0), ('pmlp_reg', struct_mlx5_ifc_pmlp_reg_bits, 0), ('pmlpn_reg', struct_mlx5_ifc_pmlpn_reg_bits, 0), ('pmpc_reg', struct_mlx5_ifc_pmpc_reg_bits, 0), ('pmpe_reg', struct_mlx5_ifc_pmpe_reg_bits, 0), ('pmpr_reg', struct_mlx5_ifc_pmpr_reg_bits, 0), ('pmtu_reg', struct_mlx5_ifc_pmtu_reg_bits, 0), ('ppad_reg', struct_mlx5_ifc_ppad_reg_bits, 0), ('ppcnt_reg', struct_mlx5_ifc_ppcnt_reg_bits, 0), ('mpein_reg', struct_mlx5_ifc_mpein_reg_bits, 0), ('mpcnt_reg', struct_mlx5_ifc_mpcnt_reg_bits, 0), ('pplm_reg', struct_mlx5_ifc_pplm_reg_bits, 0), ('pplr_reg', struct_mlx5_ifc_pplr_reg_bits, 0), ('ppsc_reg', struct_mlx5_ifc_ppsc_reg_bits, 0), ('pqdr_reg', struct_mlx5_ifc_pqdr_reg_bits, 0), ('pspa_reg', struct_mlx5_ifc_pspa_reg_bits, 0), ('ptas_reg', struct_mlx5_ifc_ptas_reg_bits, 0), ('ptys_reg', struct_mlx5_ifc_ptys_reg_bits, 0), ('mlcr_reg', struct_mlx5_ifc_mlcr_reg_bits, 0), ('pude_reg', struct_mlx5_ifc_pude_reg_bits, 0), ('pvlc_reg', struct_mlx5_ifc_pvlc_reg_bits, 0), ('slrg_reg', struct_mlx5_ifc_slrg_reg_bits, 0), ('sltp_reg', struct_mlx5_ifc_sltp_reg_bits, 0), ('mtpps_reg', struct_mlx5_ifc_mtpps_reg_bits, 0), ('mtppse_reg', struct_mlx5_ifc_mtppse_reg_bits, 0), ('fpga_access_reg', struct_mlx5_ifc_fpga_access_reg_bits, 0), ('fpga_ctrl_bits', struct_mlx5_ifc_fpga_ctrl_bits, 0), ('fpga_cap_bits', struct_mlx5_ifc_fpga_cap_bits, 0), ('mcqi_reg', struct_mlx5_ifc_mcqi_reg_bits, 0), ('mcc_reg', struct_mlx5_ifc_mcc_reg_bits, 0), ('mcda_reg', struct_mlx5_ifc_mcda_reg_bits, 0), ('mirc_reg', struct_mlx5_ifc_mirc_reg_bits, 0), ('mfrl_reg', struct_mlx5_ifc_mfrl_reg_bits, 0), ('mtutc_reg', struct_mlx5_ifc_mtutc_reg_bits, 0), ('mrtc_reg', struct_mlx5_ifc_mrtc_reg_bits, 0), ('mtcap_reg', struct_mlx5_ifc_mtcap_reg_bits, 0), ('mtmp_reg', struct_mlx5_ifc_mtmp_reg_bits, 0), ('mtptm_reg', struct_mlx5_ifc_mtptm_reg_bits, 0), ('mtctr_reg', struct_mlx5_ifc_mtctr_reg_bits, 0), ('pphcr_reg', struct_mlx5_ifc_pphcr_reg_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[24800]], 0)]) +@c.record +class union_mlx5_ifc_debug_enhancements_document_bits(c.Struct): + SIZE = 512 + health_buffer: struct_mlx5_ifc_health_buffer_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[512]] +union_mlx5_ifc_debug_enhancements_document_bits.register_fields([('health_buffer', struct_mlx5_ifc_health_buffer_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[512]], 0)]) +@c.record +class union_mlx5_ifc_uplink_pci_interface_document_bits(c.Struct): + SIZE = 131168 + initial_seg: struct_mlx5_ifc_initial_seg_bits + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[131168]] +union_mlx5_ifc_uplink_pci_interface_document_bits.register_fields([('initial_seg', struct_mlx5_ifc_initial_seg_bits, 0), ('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[131168]], 0)]) +@c.record +class struct_mlx5_ifc_set_flow_table_root_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_set_flow_table_root_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_set_flow_table_root_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[7]] + table_of_other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + table_vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + underlay_qpn: c.Array[ctypes.c_ubyte, Literal[24]] + table_eswitch_owner_vhca_id_valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_e1: c.Array[ctypes.c_ubyte, Literal[15]] + table_eswitch_owner_vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_set_flow_table_root_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[7]], 136), ('table_of_other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 143), ('table_vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('underlay_qpn', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('table_eswitch_owner_vhca_id_valid', c.Array[ctypes.c_ubyte, Literal[1]], 224), ('reserved_at_e1', c.Array[ctypes.c_ubyte, Literal[15]], 225), ('table_eswitch_owner_vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 240), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[256]], 256)]) +_anonenum126: dict[int, str] = {(MLX5_MODIFY_FLOW_TABLE_MISS_TABLE_ID:=1): 'MLX5_MODIFY_FLOW_TABLE_MISS_TABLE_ID', (MLX5_MODIFY_FLOW_TABLE_LAG_NEXT_TABLE_ID:=32768): 'MLX5_MODIFY_FLOW_TABLE_LAG_NEXT_TABLE_ID'} +@c.record +class struct_mlx5_ifc_modify_flow_table_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_flow_table_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_flow_table_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + other_vport: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[15]] + vport_number: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + modify_field_select: c.Array[ctypes.c_ubyte, Literal[16]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_88: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + table_id: c.Array[ctypes.c_ubyte, Literal[24]] + flow_table_context: struct_mlx5_ifc_flow_table_context_bits +struct_mlx5_ifc_modify_flow_table_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('other_vport', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[15]], 65), ('vport_number', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('modify_field_select', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('reserved_at_88', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('flow_table_context', struct_mlx5_ifc_flow_table_context_bits, 192)]) +@c.record +class struct_mlx5_ifc_ets_tcn_config_reg_bits(c.Struct): + SIZE = 64 + g: c.Array[ctypes.c_ubyte, Literal[1]] + b: c.Array[ctypes.c_ubyte, Literal[1]] + r: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3: c.Array[ctypes.c_ubyte, Literal[9]] + group: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[9]] + bw_allocation: c.Array[ctypes.c_ubyte, Literal[7]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[12]] + max_bw_units: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[8]] + max_bw_value: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_ets_tcn_config_reg_bits.register_fields([('g', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('b', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('r', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('reserved_at_3', c.Array[ctypes.c_ubyte, Literal[9]], 3), ('group', c.Array[ctypes.c_ubyte, Literal[4]], 12), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[9]], 16), ('bw_allocation', c.Array[ctypes.c_ubyte, Literal[7]], 25), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[12]], 32), ('max_bw_units', c.Array[ctypes.c_ubyte, Literal[4]], 44), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('max_bw_value', c.Array[ctypes.c_ubyte, Literal[8]], 56)]) +@c.record +class struct_mlx5_ifc_ets_global_config_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[2]] + r: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3: c.Array[ctypes.c_ubyte, Literal[29]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[12]] + max_bw_units: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[8]] + max_bw_value: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_ets_global_config_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[2]], 0), ('r', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('reserved_at_3', c.Array[ctypes.c_ubyte, Literal[29]], 3), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[12]], 32), ('max_bw_units', c.Array[ctypes.c_ubyte, Literal[4]], 44), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[8]], 48), ('max_bw_value', c.Array[ctypes.c_ubyte, Literal[8]], 56)]) +@c.record +class struct_mlx5_ifc_qetc_reg_bits(c.Struct): + SIZE = 640 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + port_number: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[48]] + tc_configuration: c.Array[struct_mlx5_ifc_ets_tcn_config_reg_bits, Literal[8]] + global_configuration: struct_mlx5_ifc_ets_global_config_reg_bits +struct_mlx5_ifc_qetc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('port_number', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[48]], 16), ('tc_configuration', c.Array[struct_mlx5_ifc_ets_tcn_config_reg_bits, Literal[8]], 64), ('global_configuration', struct_mlx5_ifc_ets_global_config_reg_bits, 576)]) +@c.record +class struct_mlx5_ifc_qpdpm_dscp_reg_bits(c.Struct): + SIZE = 16 + e: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_01: c.Array[ctypes.c_ubyte, Literal[11]] + prio: c.Array[ctypes.c_ubyte, Literal[4]] +struct_mlx5_ifc_qpdpm_dscp_reg_bits.register_fields([('e', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_01', c.Array[ctypes.c_ubyte, Literal[11]], 1), ('prio', c.Array[ctypes.c_ubyte, Literal[4]], 12)]) +@c.record +class struct_mlx5_ifc_qpdpm_reg_bits(c.Struct): + SIZE = 1056 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + dscp: c.Array[struct_mlx5_ifc_qpdpm_dscp_reg_bits, Literal[64]] +struct_mlx5_ifc_qpdpm_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('dscp', c.Array[struct_mlx5_ifc_qpdpm_dscp_reg_bits, Literal[64]], 32)]) +@c.record +class struct_mlx5_ifc_qpts_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[45]] + trust_state: c.Array[ctypes.c_ubyte, Literal[3]] +struct_mlx5_ifc_qpts_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[45]], 16), ('trust_state', c.Array[ctypes.c_ubyte, Literal[3]], 61)]) +@c.record +class struct_mlx5_ifc_pptb_reg_bits(c.Struct): + SIZE = 96 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[2]] + mm: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[4]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[6]] + cm: c.Array[ctypes.c_ubyte, Literal[1]] + um: c.Array[ctypes.c_ubyte, Literal[1]] + pm: c.Array[ctypes.c_ubyte, Literal[8]] + prio_x_buff: c.Array[ctypes.c_ubyte, Literal[32]] + pm_msb: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[16]] + ctrl_buff: c.Array[ctypes.c_ubyte, Literal[4]] + untagged_buff: c.Array[ctypes.c_ubyte, Literal[4]] +struct_mlx5_ifc_pptb_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[2]], 0), ('mm', c.Array[ctypes.c_ubyte, Literal[2]], 2), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[6]], 16), ('cm', c.Array[ctypes.c_ubyte, Literal[1]], 22), ('um', c.Array[ctypes.c_ubyte, Literal[1]], 23), ('pm', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('prio_x_buff', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('pm_msb', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[16]], 72), ('ctrl_buff', c.Array[ctypes.c_ubyte, Literal[4]], 88), ('untagged_buff', c.Array[ctypes.c_ubyte, Literal[4]], 92)]) +@c.record +class struct_mlx5_ifc_sbcam_reg_bits(c.Struct): + SIZE = 608 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + feature_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + access_reg_group: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + sb_access_reg_cap_mask: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[128]] + sb_feature_cap_mask: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[64]] + cap_total_buffer_size: c.Array[ctypes.c_ubyte, Literal[32]] + cap_cell_size: c.Array[ctypes.c_ubyte, Literal[16]] + cap_max_pg_buffers: c.Array[ctypes.c_ubyte, Literal[8]] + cap_num_pool_supported: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_240: c.Array[ctypes.c_ubyte, Literal[8]] + cap_sbsr_stat_size: c.Array[ctypes.c_ubyte, Literal[8]] + cap_max_tclass_data: c.Array[ctypes.c_ubyte, Literal[8]] + cap_max_cpu_ingress_tclass_sb: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_sbcam_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('feature_group', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('access_reg_group', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('sb_access_reg_cap_mask', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]], 64), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[128]], 192), ('sb_feature_cap_mask', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[4]], 320), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[64]], 448), ('cap_total_buffer_size', c.Array[ctypes.c_ubyte, Literal[32]], 512), ('cap_cell_size', c.Array[ctypes.c_ubyte, Literal[16]], 544), ('cap_max_pg_buffers', c.Array[ctypes.c_ubyte, Literal[8]], 560), ('cap_num_pool_supported', c.Array[ctypes.c_ubyte, Literal[8]], 568), ('reserved_at_240', c.Array[ctypes.c_ubyte, Literal[8]], 576), ('cap_sbsr_stat_size', c.Array[ctypes.c_ubyte, Literal[8]], 584), ('cap_max_tclass_data', c.Array[ctypes.c_ubyte, Literal[8]], 592), ('cap_max_cpu_ingress_tclass_sb', c.Array[ctypes.c_ubyte, Literal[8]], 600)]) +@c.record +class struct_mlx5_ifc_pbmc_reg_bits(c.Struct): + SIZE = 864 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + xoff_timer_value: c.Array[ctypes.c_ubyte, Literal[16]] + xoff_refresh: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[9]] + fullness_threshold: c.Array[ctypes.c_ubyte, Literal[7]] + port_buffer_size: c.Array[ctypes.c_ubyte, Literal[16]] + buffer: c.Array[struct_mlx5_ifc_bufferx_reg_bits, Literal[10]] + reserved_at_2e0: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_pbmc_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('xoff_timer_value', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('xoff_refresh', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[9]], 64), ('fullness_threshold', c.Array[ctypes.c_ubyte, Literal[7]], 73), ('port_buffer_size', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('buffer', c.Array[struct_mlx5_ifc_bufferx_reg_bits, Literal[10]], 96), ('reserved_at_2e0', c.Array[ctypes.c_ubyte, Literal[128]], 736)]) +@c.record +class struct_mlx5_ifc_sbpr_reg_bits(c.Struct): + SIZE = 192 + desc: c.Array[ctypes.c_ubyte, Literal[1]] + snap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[4]] + dir: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[20]] + pool: c.Array[ctypes.c_ubyte, Literal[4]] + infi_size: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_21: c.Array[ctypes.c_ubyte, Literal[7]] + size: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[28]] + mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[8]] + buff_occupancy: c.Array[ctypes.c_ubyte, Literal[24]] + clr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_81: c.Array[ctypes.c_ubyte, Literal[7]] + max_buff_occupancy: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + ext_buff_occupancy: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_sbpr_reg_bits.register_fields([('desc', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('snap', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[4]], 2), ('dir', c.Array[ctypes.c_ubyte, Literal[2]], 6), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[20]], 8), ('pool', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('infi_size', c.Array[ctypes.c_ubyte, Literal[1]], 32), ('reserved_at_21', c.Array[ctypes.c_ubyte, Literal[7]], 33), ('size', c.Array[ctypes.c_ubyte, Literal[24]], 40), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[28]], 64), ('mode', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('buff_occupancy', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('clr', c.Array[ctypes.c_ubyte, Literal[1]], 128), ('reserved_at_81', c.Array[ctypes.c_ubyte, Literal[7]], 129), ('max_buff_occupancy', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('ext_buff_occupancy', c.Array[ctypes.c_ubyte, Literal[24]], 168)]) +@c.record +class struct_mlx5_ifc_sbcm_reg_bits(c.Struct): + SIZE = 320 + desc: c.Array[ctypes.c_ubyte, Literal[1]] + snap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[6]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + pnat: c.Array[ctypes.c_ubyte, Literal[2]] + pg_buff: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[6]] + dir: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[31]] + exc: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + buff_occupancy: c.Array[ctypes.c_ubyte, Literal[24]] + clr: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_a1: c.Array[ctypes.c_ubyte, Literal[7]] + max_buff_occupancy: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[8]] + min_buff: c.Array[ctypes.c_ubyte, Literal[24]] + infi_max: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_e1: c.Array[ctypes.c_ubyte, Literal[7]] + max_buff: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[28]] + pool: c.Array[ctypes.c_ubyte, Literal[4]] +struct_mlx5_ifc_sbcm_reg_bits.register_fields([('desc', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('snap', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[6]], 2), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('pnat', c.Array[ctypes.c_ubyte, Literal[2]], 16), ('pg_buff', c.Array[ctypes.c_ubyte, Literal[6]], 18), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[6]], 24), ('dir', c.Array[ctypes.c_ubyte, Literal[2]], 30), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[31]], 32), ('exc', c.Array[ctypes.c_ubyte, Literal[1]], 63), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('buff_occupancy', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('clr', c.Array[ctypes.c_ubyte, Literal[1]], 160), ('reserved_at_a1', c.Array[ctypes.c_ubyte, Literal[7]], 161), ('max_buff_occupancy', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[8]], 192), ('min_buff', c.Array[ctypes.c_ubyte, Literal[24]], 200), ('infi_max', c.Array[ctypes.c_ubyte, Literal[1]], 224), ('reserved_at_e1', c.Array[ctypes.c_ubyte, Literal[7]], 225), ('max_buff', c.Array[ctypes.c_ubyte, Literal[24]], 232), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[28]], 288), ('pool', c.Array[ctypes.c_ubyte, Literal[4]], 316)]) +@c.record +class struct_mlx5_ifc_qtct_reg_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + port_number: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[13]] + prio: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[29]] + tclass: c.Array[ctypes.c_ubyte, Literal[3]] +struct_mlx5_ifc_qtct_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('port_number', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[13]], 16), ('prio', c.Array[ctypes.c_ubyte, Literal[3]], 29), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[29]], 32), ('tclass', c.Array[ctypes.c_ubyte, Literal[3]], 61)]) +@c.record +class struct_mlx5_ifc_mcia_reg_bits(c.Struct): + SIZE = 512 + l: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[7]] + module: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[8]] + status: c.Array[ctypes.c_ubyte, Literal[8]] + i2c_device_address: c.Array[ctypes.c_ubyte, Literal[8]] + page_number: c.Array[ctypes.c_ubyte, Literal[8]] + device_address: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + size: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + dword_0: c.Array[ctypes.c_ubyte, Literal[32]] + dword_1: c.Array[ctypes.c_ubyte, Literal[32]] + dword_2: c.Array[ctypes.c_ubyte, Literal[32]] + dword_3: c.Array[ctypes.c_ubyte, Literal[32]] + dword_4: c.Array[ctypes.c_ubyte, Literal[32]] + dword_5: c.Array[ctypes.c_ubyte, Literal[32]] + dword_6: c.Array[ctypes.c_ubyte, Literal[32]] + dword_7: c.Array[ctypes.c_ubyte, Literal[32]] + dword_8: c.Array[ctypes.c_ubyte, Literal[32]] + dword_9: c.Array[ctypes.c_ubyte, Literal[32]] + dword_10: c.Array[ctypes.c_ubyte, Literal[32]] + dword_11: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_mcia_reg_bits.register_fields([('l', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[7]], 1), ('module', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('status', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('i2c_device_address', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('page_number', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('device_address', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('size', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('dword_0', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('dword_1', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('dword_2', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('dword_3', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('dword_4', c.Array[ctypes.c_ubyte, Literal[32]], 256), ('dword_5', c.Array[ctypes.c_ubyte, Literal[32]], 288), ('dword_6', c.Array[ctypes.c_ubyte, Literal[32]], 320), ('dword_7', c.Array[ctypes.c_ubyte, Literal[32]], 352), ('dword_8', c.Array[ctypes.c_ubyte, Literal[32]], 384), ('dword_9', c.Array[ctypes.c_ubyte, Literal[32]], 416), ('dword_10', c.Array[ctypes.c_ubyte, Literal[32]], 448), ('dword_11', c.Array[ctypes.c_ubyte, Literal[32]], 480)]) +@c.record +class struct_mlx5_ifc_dcbx_param_bits(c.Struct): + SIZE = 512 + dcbx_cee_cap: c.Array[ctypes.c_ubyte, Literal[1]] + dcbx_ieee_cap: c.Array[ctypes.c_ubyte, Literal[1]] + dcbx_standby_cap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_3: c.Array[ctypes.c_ubyte, Literal[5]] + port_number: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[10]] + max_application_table_size: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[21]] + version_oper: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[5]] + version_admin: c.Array[ctypes.c_ubyte, Literal[3]] + willing_admin: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[3]] + pfc_cap_oper: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[4]] + pfc_cap_admin: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[4]] + num_of_tc_oper: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_58: c.Array[ctypes.c_ubyte, Literal[4]] + num_of_tc_admin: c.Array[ctypes.c_ubyte, Literal[4]] + remote_willing: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_61: c.Array[ctypes.c_ubyte, Literal[3]] + remote_pfc_cap: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[20]] + remote_num_of_tc: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[24]] + error: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[352]] +struct_mlx5_ifc_dcbx_param_bits.register_fields([('dcbx_cee_cap', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('dcbx_ieee_cap', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('dcbx_standby_cap', c.Array[ctypes.c_ubyte, Literal[1]], 2), ('reserved_at_3', c.Array[ctypes.c_ubyte, Literal[5]], 3), ('port_number', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[10]], 16), ('max_application_table_size', c.Array[ctypes.c_ubyte, Literal[6]], 26), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[21]], 32), ('version_oper', c.Array[ctypes.c_ubyte, Literal[3]], 53), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[5]], 56), ('version_admin', c.Array[ctypes.c_ubyte, Literal[3]], 61), ('willing_admin', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[3]], 65), ('pfc_cap_oper', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[4]], 72), ('pfc_cap_admin', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[4]], 80), ('num_of_tc_oper', c.Array[ctypes.c_ubyte, Literal[4]], 84), ('reserved_at_58', c.Array[ctypes.c_ubyte, Literal[4]], 88), ('num_of_tc_admin', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('remote_willing', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('reserved_at_61', c.Array[ctypes.c_ubyte, Literal[3]], 97), ('remote_pfc_cap', c.Array[ctypes.c_ubyte, Literal[4]], 100), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[20]], 104), ('remote_num_of_tc', c.Array[ctypes.c_ubyte, Literal[4]], 124), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[24]], 128), ('error', c.Array[ctypes.c_ubyte, Literal[8]], 152), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[352]], 160)]) +_anonenum127: dict[int, str] = {(MLX5_LAG_PORT_SELECT_MODE_QUEUE_AFFINITY:=0): 'MLX5_LAG_PORT_SELECT_MODE_QUEUE_AFFINITY', (MLX5_LAG_PORT_SELECT_MODE_PORT_SELECT_FT:=1): 'MLX5_LAG_PORT_SELECT_MODE_PORT_SELECT_FT', (MLX5_LAG_PORT_SELECT_MODE_PORT_SELECT_MPESW:=2): 'MLX5_LAG_PORT_SELECT_MODE_PORT_SELECT_MPESW'} +@c.record +class struct_mlx5_ifc_lagc_bits(c.Struct): + SIZE = 64 + fdb_selection_mode: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[20]] + port_select_mode: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_18: c.Array[ctypes.c_ubyte, Literal[5]] + lag_state: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[12]] + active_port: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[4]] + tx_remap_affinity_2: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[4]] + tx_remap_affinity_1: c.Array[ctypes.c_ubyte, Literal[4]] +struct_mlx5_ifc_lagc_bits.register_fields([('fdb_selection_mode', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[20]], 1), ('port_select_mode', c.Array[ctypes.c_ubyte, Literal[3]], 21), ('reserved_at_18', c.Array[ctypes.c_ubyte, Literal[5]], 24), ('lag_state', c.Array[ctypes.c_ubyte, Literal[3]], 29), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[12]], 32), ('active_port', c.Array[ctypes.c_ubyte, Literal[4]], 44), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[4]], 48), ('tx_remap_affinity_2', c.Array[ctypes.c_ubyte, Literal[4]], 52), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[4]], 56), ('tx_remap_affinity_1', c.Array[ctypes.c_ubyte, Literal[4]], 60)]) +@c.record +class struct_mlx5_ifc_create_lag_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_create_lag_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_create_lag_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + ctx: struct_mlx5_ifc_lagc_bits +struct_mlx5_ifc_create_lag_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('ctx', struct_mlx5_ifc_lagc_bits, 64)]) +@c.record +class struct_mlx5_ifc_modify_lag_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_modify_lag_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_modify_lag_in_bits(c.Struct): + SIZE = 192 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + field_select: c.Array[ctypes.c_ubyte, Literal[32]] + ctx: struct_mlx5_ifc_lagc_bits +struct_mlx5_ifc_modify_lag_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('field_select', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('ctx', struct_mlx5_ifc_lagc_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_lag_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + ctx: struct_mlx5_ifc_lagc_bits +struct_mlx5_ifc_query_lag_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('ctx', struct_mlx5_ifc_lagc_bits, 64)]) +@c.record +class struct_mlx5_ifc_query_lag_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_lag_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_lag_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_lag_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_lag_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_lag_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_create_vport_lag_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_create_vport_lag_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_create_vport_lag_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_create_vport_lag_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_vport_lag_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_vport_lag_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_destroy_vport_lag_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_vport_lag_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +_anonenum128: dict[int, str] = {(MLX5_MODIFY_MEMIC_OP_MOD_ALLOC:=0): 'MLX5_MODIFY_MEMIC_OP_MOD_ALLOC', (MLX5_MODIFY_MEMIC_OP_MOD_DEALLOC:=1): 'MLX5_MODIFY_MEMIC_OP_MOD_DEALLOC'} +@c.record +class struct_mlx5_ifc_modify_memic_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[24]] + memic_operation_type: c.Array[ctypes.c_ubyte, Literal[8]] + memic_start_addr: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[320]] +struct_mlx5_ifc_modify_memic_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[24]], 96), ('memic_operation_type', c.Array[ctypes.c_ubyte, Literal[8]], 120), ('memic_start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[320]], 192)]) +@c.record +class struct_mlx5_ifc_modify_memic_out_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + memic_operation_addr: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[320]] +struct_mlx5_ifc_modify_memic_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('memic_operation_addr', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[320]], 192)]) +@c.record +class struct_mlx5_ifc_alloc_memic_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + log_memic_addr_alignment: c.Array[ctypes.c_ubyte, Literal[8]] + range_start_addr: c.Array[ctypes.c_ubyte, Literal[64]] + range_size: c.Array[ctypes.c_ubyte, Literal[32]] + memic_size: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_memic_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 96), ('log_memic_addr_alignment', c.Array[ctypes.c_ubyte, Literal[8]], 120), ('range_start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('range_size', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('memic_size', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_alloc_memic_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + memic_start_addr: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_alloc_memic_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('memic_start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_memic_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + memic_start_addr: c.Array[ctypes.c_ubyte, Literal[64]] + memic_size: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_memic_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('memic_start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('memic_size', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_dealloc_memic_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_memic_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_umem_bits(c.Struct): + SIZE = 256 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[128]] + ats: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_81: c.Array[ctypes.c_ubyte, Literal[26]] + log_page_size: c.Array[ctypes.c_ubyte, Literal[5]] + page_offset: c.Array[ctypes.c_ubyte, Literal[32]] + num_of_mtt: c.Array[ctypes.c_ubyte, Literal[64]] + mtt: c.Array[struct_mlx5_ifc_mtt_bits, Literal[0]] +struct_mlx5_ifc_umem_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[128]], 0), ('ats', c.Array[ctypes.c_ubyte, Literal[1]], 128), ('reserved_at_81', c.Array[ctypes.c_ubyte, Literal[26]], 129), ('log_page_size', c.Array[ctypes.c_ubyte, Literal[5]], 155), ('page_offset', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('num_of_mtt', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('mtt', c.Array[struct_mlx5_ifc_mtt_bits, Literal[0]], 256)]) +@c.record +class struct_mlx5_ifc_uctx_bits(c.Struct): + SIZE = 384 + cap: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[352]] +struct_mlx5_ifc_uctx_bits.register_fields([('cap', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[352]], 32)]) +@c.record +class struct_mlx5_ifc_sw_icm_bits(c.Struct): + SIZE = 512 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + log_sw_icm_size: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + sw_icm_start_addr: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[320]] +struct_mlx5_ifc_sw_icm_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('log_sw_icm_size', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('sw_icm_start_addr', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[320]], 192)]) +@c.record +class struct_mlx5_ifc_geneve_tlv_option_bits(c.Struct): + SIZE = 512 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + geneve_option_fte_index: c.Array[ctypes.c_ubyte, Literal[8]] + option_class: c.Array[ctypes.c_ubyte, Literal[16]] + option_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_78: c.Array[ctypes.c_ubyte, Literal[3]] + option_data_length: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_geneve_tlv_option_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('geneve_option_fte_index', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('option_class', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('option_type', c.Array[ctypes.c_ubyte, Literal[8]], 112), ('reserved_at_78', c.Array[ctypes.c_ubyte, Literal[3]], 120), ('option_data_length', c.Array[ctypes.c_ubyte, Literal[5]], 123), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +@c.record +class struct_mlx5_ifc_create_umem_in_bits(c.Struct): + SIZE = 384 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + umem: struct_mlx5_ifc_umem_bits +struct_mlx5_ifc_create_umem_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('umem', struct_mlx5_ifc_umem_bits, 128)]) +@c.record +class struct_mlx5_ifc_create_umem_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + umem_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_umem_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('umem_id', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_umem_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[8]] + umem_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_umem_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('umem_id', c.Array[ctypes.c_ubyte, Literal[24]], 72), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_umem_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_umem_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_create_uctx_in_bits(c.Struct): + SIZE = 512 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + uctx: struct_mlx5_ifc_uctx_bits +struct_mlx5_ifc_create_uctx_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('uctx', struct_mlx5_ifc_uctx_bits, 128)]) +@c.record +class struct_mlx5_ifc_create_uctx_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_create_uctx_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_uctx_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_destroy_uctx_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_destroy_uctx_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_destroy_uctx_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_create_sw_icm_in_bits(c.Struct): + SIZE = 640 + hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + sw_icm: struct_mlx5_ifc_sw_icm_bits +struct_mlx5_ifc_create_sw_icm_in_bits.register_fields([('hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('sw_icm', struct_mlx5_ifc_sw_icm_bits, 128)]) +@c.record +class struct_mlx5_ifc_create_geneve_tlv_option_in_bits(c.Struct): + SIZE = 640 + hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + geneve_tlv_opt: struct_mlx5_ifc_geneve_tlv_option_bits +struct_mlx5_ifc_create_geneve_tlv_option_in_bits.register_fields([('hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('geneve_tlv_opt', struct_mlx5_ifc_geneve_tlv_option_bits, 128)]) +@c.record +class struct_mlx5_ifc_mtrc_string_db_param_bits(c.Struct): + SIZE = 64 + string_db_base_address: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[8]] + string_db_size: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_mtrc_string_db_param_bits.register_fields([('string_db_base_address', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('string_db_size', c.Array[ctypes.c_ubyte, Literal[24]], 40)]) +@c.record +class struct_mlx5_ifc_mtrc_cap_bits(c.Struct): + SIZE = 1024 + trace_owner: c.Array[ctypes.c_ubyte, Literal[1]] + trace_to_memory: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[4]] + trc_ver: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[20]] + num_string_db: c.Array[ctypes.c_ubyte, Literal[4]] + first_string_trace: c.Array[ctypes.c_ubyte, Literal[8]] + num_string_trace: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[40]] + log_max_trace_buffer_size: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + string_db_param: c.Array[struct_mlx5_ifc_mtrc_string_db_param_bits, Literal[8]] + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_mtrc_cap_bits.register_fields([('trace_owner', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('trace_to_memory', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[4]], 2), ('trc_ver', c.Array[ctypes.c_ubyte, Literal[2]], 6), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[20]], 8), ('num_string_db', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('first_string_trace', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('num_string_trace', c.Array[ctypes.c_ubyte, Literal[8]], 40), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[40]], 48), ('log_max_trace_buffer_size', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('string_db_param', c.Array[struct_mlx5_ifc_mtrc_string_db_param_bits, Literal[8]], 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[384]], 640)]) +@c.record +class struct_mlx5_ifc_mtrc_conf_bits(c.Struct): + SIZE = 1024 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[28]] + trace_mode: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[24]] + log_trace_buffer_size: c.Array[ctypes.c_ubyte, Literal[8]] + trace_mkey: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[928]] +struct_mlx5_ifc_mtrc_conf_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[28]], 0), ('trace_mode', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[24]], 32), ('log_trace_buffer_size', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('trace_mkey', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[928]], 96)]) +@c.record +class struct_mlx5_ifc_mtrc_stdb_bits(c.Struct): + SIZE = 64 + string_db_index: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_4: c.Array[ctypes.c_ubyte, Literal[4]] + read_size: c.Array[ctypes.c_ubyte, Literal[24]] + start_offset: c.Array[ctypes.c_ubyte, Literal[32]] + string_db_data: c.Array[ctypes.c_ubyte, Literal[0]] +struct_mlx5_ifc_mtrc_stdb_bits.register_fields([('string_db_index', c.Array[ctypes.c_ubyte, Literal[4]], 0), ('reserved_at_4', c.Array[ctypes.c_ubyte, Literal[4]], 4), ('read_size', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('start_offset', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('string_db_data', c.Array[ctypes.c_ubyte, Literal[0]], 64)]) +@c.record +class struct_mlx5_ifc_mtrc_ctrl_bits(c.Struct): + SIZE = 512 + trace_status: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[2]] + arm_event: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5: c.Array[ctypes.c_ubyte, Literal[11]] + modify_field_select: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[43]] + current_timestamp52_32: c.Array[ctypes.c_ubyte, Literal[21]] + current_timestamp31_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_mtrc_ctrl_bits.register_fields([('trace_status', c.Array[ctypes.c_ubyte, Literal[2]], 0), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[2]], 2), ('arm_event', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('reserved_at_5', c.Array[ctypes.c_ubyte, Literal[11]], 5), ('modify_field_select', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[43]], 32), ('current_timestamp52_32', c.Array[ctypes.c_ubyte, Literal[21]], 75), ('current_timestamp31_0', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +@c.record +class struct_mlx5_ifc_host_params_context_bits(c.Struct): + SIZE = 512 + host_number: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[5]] + host_pf_not_exist: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_14: c.Array[ctypes.c_ubyte, Literal[1]] + host_pf_disabled: c.Array[ctypes.c_ubyte, Literal[1]] + host_num_of_vfs: c.Array[ctypes.c_ubyte, Literal[16]] + host_total_vfs: c.Array[ctypes.c_ubyte, Literal[16]] + host_pci_bus: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + host_pci_device: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[16]] + host_pci_function: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_host_params_context_bits.register_fields([('host_number', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[5]], 8), ('host_pf_not_exist', c.Array[ctypes.c_ubyte, Literal[1]], 13), ('reserved_at_14', c.Array[ctypes.c_ubyte, Literal[1]], 14), ('host_pf_disabled', c.Array[ctypes.c_ubyte, Literal[1]], 15), ('host_num_of_vfs', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('host_total_vfs', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('host_pci_bus', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('host_pci_device', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('host_pci_function', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +@c.record +class struct_mlx5_ifc_query_esw_functions_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_esw_functions_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_query_esw_functions_out_bits(c.Struct): + SIZE = 1024 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + host_params_context: struct_mlx5_ifc_host_params_context_bits + reserved_at_280: c.Array[ctypes.c_ubyte, Literal[384]] + host_sf_enable: c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]] +struct_mlx5_ifc_query_esw_functions_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('host_params_context', struct_mlx5_ifc_host_params_context_bits, 128), ('reserved_at_280', c.Array[ctypes.c_ubyte, Literal[384]], 640), ('host_sf_enable', c.Array[c.Array[ctypes.c_ubyte, Literal[64]], Literal[0]], 1024)]) +@c.record +class struct_mlx5_ifc_sf_partition_bits(c.Struct): + SIZE = 32 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + log_num_sf: c.Array[ctypes.c_ubyte, Literal[8]] + log_sf_bar_size: c.Array[ctypes.c_ubyte, Literal[8]] +struct_mlx5_ifc_sf_partition_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('log_num_sf', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('log_sf_bar_size', c.Array[ctypes.c_ubyte, Literal[8]], 24)]) +@c.record +class struct_mlx5_ifc_query_sf_partitions_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[24]] + num_sf_partitions: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + sf_partition: c.Array[struct_mlx5_ifc_sf_partition_bits, Literal[0]] +struct_mlx5_ifc_query_sf_partitions_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[24]], 64), ('num_sf_partitions', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('sf_partition', c.Array[struct_mlx5_ifc_sf_partition_bits, Literal[0]], 128)]) +@c.record +class struct_mlx5_ifc_query_sf_partitions_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_query_sf_partitions_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_sf_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_dealloc_sf_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_dealloc_sf_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_dealloc_sf_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_alloc_sf_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_alloc_sf_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_alloc_sf_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_10: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + function_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_alloc_sf_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('reserved_at_10', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('function_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_affiliated_event_header_bits(c.Struct): + SIZE = 64 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[16]] + obj_type: c.Array[ctypes.c_ubyte, Literal[16]] + obj_id: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_affiliated_event_header_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('obj_type', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('obj_id', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +_anonenum129: dict[int, str] = {(MLX5_GENERAL_OBJECT_TYPES_ENCRYPTION_KEY:=12): 'MLX5_GENERAL_OBJECT_TYPES_ENCRYPTION_KEY', (MLX5_GENERAL_OBJECT_TYPES_IPSEC:=19): 'MLX5_GENERAL_OBJECT_TYPES_IPSEC', (MLX5_GENERAL_OBJECT_TYPES_SAMPLER:=32): 'MLX5_GENERAL_OBJECT_TYPES_SAMPLER', (MLX5_GENERAL_OBJECT_TYPES_FLOW_METER_ASO:=36): 'MLX5_GENERAL_OBJECT_TYPES_FLOW_METER_ASO', (MLX5_GENERAL_OBJECT_TYPES_MACSEC:=39): 'MLX5_GENERAL_OBJECT_TYPES_MACSEC', (MLX5_GENERAL_OBJECT_TYPES_INT_KEK:=71): 'MLX5_GENERAL_OBJECT_TYPES_INT_KEK', (MLX5_GENERAL_OBJECT_TYPES_RDMA_CTRL:=83): 'MLX5_GENERAL_OBJECT_TYPES_RDMA_CTRL', (MLX5_GENERAL_OBJECT_TYPES_PCIE_CONG_EVENT:=88): 'MLX5_GENERAL_OBJECT_TYPES_PCIE_CONG_EVENT', (MLX5_GENERAL_OBJECT_TYPES_FLOW_TABLE_ALIAS:=65301): 'MLX5_GENERAL_OBJECT_TYPES_FLOW_TABLE_ALIAS'} +_anonenum130: dict[int, str] = {(MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_ENCRYPTION_KEY:=0): 'MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_ENCRYPTION_KEY', (MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_IPSEC:=1): 'MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_IPSEC', (MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_SAMPLER:=2): 'MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_SAMPLER', (MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_FLOW_METER_ASO:=3): 'MLX5_HCA_CAP_GENERAL_OBJECT_TYPES_FLOW_METER_ASO'} +_anonenum131: dict[int, str] = {(MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_RDMA_CTRL:=0): 'MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_RDMA_CTRL', (MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_PCIE_CONG_EVENT:=1): 'MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_PCIE_CONG_EVENT'} +_anonenum132: dict[int, str] = {(MLX5_IPSEC_OBJECT_ICV_LEN_16B:=0): 'MLX5_IPSEC_OBJECT_ICV_LEN_16B'} +_anonenum133: dict[int, str] = {(MLX5_IPSEC_ASO_REG_C_0_1:=0): 'MLX5_IPSEC_ASO_REG_C_0_1', (MLX5_IPSEC_ASO_REG_C_2_3:=1): 'MLX5_IPSEC_ASO_REG_C_2_3', (MLX5_IPSEC_ASO_REG_C_4_5:=2): 'MLX5_IPSEC_ASO_REG_C_4_5', (MLX5_IPSEC_ASO_REG_C_6_7:=3): 'MLX5_IPSEC_ASO_REG_C_6_7'} +_anonenum134: dict[int, str] = {(MLX5_IPSEC_ASO_MODE:=0): 'MLX5_IPSEC_ASO_MODE', (MLX5_IPSEC_ASO_REPLAY_PROTECTION:=1): 'MLX5_IPSEC_ASO_REPLAY_PROTECTION', (MLX5_IPSEC_ASO_INC_SN:=2): 'MLX5_IPSEC_ASO_INC_SN'} +_anonenum135: dict[int, str] = {(MLX5_IPSEC_ASO_REPLAY_WIN_32BIT:=0): 'MLX5_IPSEC_ASO_REPLAY_WIN_32BIT', (MLX5_IPSEC_ASO_REPLAY_WIN_64BIT:=1): 'MLX5_IPSEC_ASO_REPLAY_WIN_64BIT', (MLX5_IPSEC_ASO_REPLAY_WIN_128BIT:=2): 'MLX5_IPSEC_ASO_REPLAY_WIN_128BIT', (MLX5_IPSEC_ASO_REPLAY_WIN_256BIT:=3): 'MLX5_IPSEC_ASO_REPLAY_WIN_256BIT'} +@c.record +class struct_mlx5_ifc_ipsec_aso_bits(c.Struct): + SIZE = 512 + valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_201: c.Array[ctypes.c_ubyte, Literal[1]] + mode: c.Array[ctypes.c_ubyte, Literal[2]] + window_sz: c.Array[ctypes.c_ubyte, Literal[2]] + soft_lft_arm: c.Array[ctypes.c_ubyte, Literal[1]] + hard_lft_arm: c.Array[ctypes.c_ubyte, Literal[1]] + remove_flow_enable: c.Array[ctypes.c_ubyte, Literal[1]] + esn_event_arm: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_20a: c.Array[ctypes.c_ubyte, Literal[22]] + remove_flow_pkt_cnt: c.Array[ctypes.c_ubyte, Literal[32]] + remove_flow_soft_lft: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_260: c.Array[ctypes.c_ubyte, Literal[128]] + mode_parameter: c.Array[ctypes.c_ubyte, Literal[32]] + replay_protection_window: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_ipsec_aso_bits.register_fields([('valid', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_201', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('mode', c.Array[ctypes.c_ubyte, Literal[2]], 2), ('window_sz', c.Array[ctypes.c_ubyte, Literal[2]], 4), ('soft_lft_arm', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('hard_lft_arm', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('remove_flow_enable', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('esn_event_arm', c.Array[ctypes.c_ubyte, Literal[1]], 9), ('reserved_at_20a', c.Array[ctypes.c_ubyte, Literal[22]], 10), ('remove_flow_pkt_cnt', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('remove_flow_soft_lft', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_260', c.Array[ctypes.c_ubyte, Literal[128]], 96), ('mode_parameter', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('replay_protection_window', c.Array[ctypes.c_ubyte, Literal[256]], 256)]) +@c.record +class struct_mlx5_ifc_ipsec_obj_bits(c.Struct): + SIZE = 1024 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + full_offload: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[1]] + esn_en: c.Array[ctypes.c_ubyte, Literal[1]] + esn_overlap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[2]] + icv_length: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[4]] + aso_return_reg: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[16]] + esn_msb: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + dekn: c.Array[ctypes.c_ubyte, Literal[24]] + salt: c.Array[ctypes.c_ubyte, Literal[32]] + implicit_iv: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[8]] + ipsec_aso_access_pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[224]] + ipsec_aso: struct_mlx5_ifc_ipsec_aso_bits +struct_mlx5_ifc_ipsec_obj_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('full_offload', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('esn_en', c.Array[ctypes.c_ubyte, Literal[1]], 66), ('esn_overlap', c.Array[ctypes.c_ubyte, Literal[1]], 67), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[2]], 68), ('icv_length', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[4]], 72), ('aso_return_reg', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('esn_msb', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('dekn', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('salt', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('implicit_iv', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('ipsec_aso_access_pd', c.Array[ctypes.c_ubyte, Literal[24]], 264), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[224]], 288), ('ipsec_aso', struct_mlx5_ifc_ipsec_aso_bits, 512)]) +@c.record +class struct_mlx5_ifc_create_ipsec_obj_in_bits(c.Struct): + SIZE = 1152 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + ipsec_object: struct_mlx5_ifc_ipsec_obj_bits +struct_mlx5_ifc_create_ipsec_obj_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('ipsec_object', struct_mlx5_ifc_ipsec_obj_bits, 128)]) +_anonenum136: dict[int, str] = {(MLX5_MODIFY_IPSEC_BITMASK_ESN_OVERLAP:=0): 'MLX5_MODIFY_IPSEC_BITMASK_ESN_OVERLAP', (MLX5_MODIFY_IPSEC_BITMASK_ESN_MSB:=1): 'MLX5_MODIFY_IPSEC_BITMASK_ESN_MSB'} +@c.record +class struct_mlx5_ifc_query_ipsec_obj_out_bits(c.Struct): + SIZE = 1152 + general_obj_out_cmd_hdr: struct_mlx5_ifc_general_obj_out_cmd_hdr_bits + ipsec_object: struct_mlx5_ifc_ipsec_obj_bits +struct_mlx5_ifc_query_ipsec_obj_out_bits.register_fields([('general_obj_out_cmd_hdr', struct_mlx5_ifc_general_obj_out_cmd_hdr_bits, 0), ('ipsec_object', struct_mlx5_ifc_ipsec_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_modify_ipsec_obj_in_bits(c.Struct): + SIZE = 1152 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + ipsec_object: struct_mlx5_ifc_ipsec_obj_bits +struct_mlx5_ifc_modify_ipsec_obj_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('ipsec_object', struct_mlx5_ifc_ipsec_obj_bits, 128)]) +_anonenum137: dict[int, str] = {(MLX5_MACSEC_ASO_REPLAY_PROTECTION:=1): 'MLX5_MACSEC_ASO_REPLAY_PROTECTION'} +_anonenum138: dict[int, str] = {(MLX5_MACSEC_ASO_REPLAY_WIN_32BIT:=0): 'MLX5_MACSEC_ASO_REPLAY_WIN_32BIT', (MLX5_MACSEC_ASO_REPLAY_WIN_64BIT:=1): 'MLX5_MACSEC_ASO_REPLAY_WIN_64BIT', (MLX5_MACSEC_ASO_REPLAY_WIN_128BIT:=2): 'MLX5_MACSEC_ASO_REPLAY_WIN_128BIT', (MLX5_MACSEC_ASO_REPLAY_WIN_256BIT:=3): 'MLX5_MACSEC_ASO_REPLAY_WIN_256BIT'} +@c.record +class struct_mlx5_ifc_macsec_aso_bits(c.Struct): + SIZE = 512 + valid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_1: c.Array[ctypes.c_ubyte, Literal[1]] + mode: c.Array[ctypes.c_ubyte, Literal[2]] + window_size: c.Array[ctypes.c_ubyte, Literal[2]] + soft_lifetime_arm: c.Array[ctypes.c_ubyte, Literal[1]] + hard_lifetime_arm: c.Array[ctypes.c_ubyte, Literal[1]] + remove_flow_enable: c.Array[ctypes.c_ubyte, Literal[1]] + epn_event_arm: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_a: c.Array[ctypes.c_ubyte, Literal[22]] + remove_flow_packet_count: c.Array[ctypes.c_ubyte, Literal[32]] + remove_flow_soft_lifetime: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[128]] + mode_parameter: c.Array[ctypes.c_ubyte, Literal[32]] + replay_protection_window: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] +struct_mlx5_ifc_macsec_aso_bits.register_fields([('valid', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('reserved_at_1', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('mode', c.Array[ctypes.c_ubyte, Literal[2]], 2), ('window_size', c.Array[ctypes.c_ubyte, Literal[2]], 4), ('soft_lifetime_arm', c.Array[ctypes.c_ubyte, Literal[1]], 6), ('hard_lifetime_arm', c.Array[ctypes.c_ubyte, Literal[1]], 7), ('remove_flow_enable', c.Array[ctypes.c_ubyte, Literal[1]], 8), ('epn_event_arm', c.Array[ctypes.c_ubyte, Literal[1]], 9), ('reserved_at_a', c.Array[ctypes.c_ubyte, Literal[22]], 10), ('remove_flow_packet_count', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('remove_flow_soft_lifetime', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[128]], 96), ('mode_parameter', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('replay_protection_window', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 256)]) +@c.record +class struct_mlx5_ifc_macsec_offload_obj_bits(c.Struct): + SIZE = 1024 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + confidentiality_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_41: c.Array[ctypes.c_ubyte, Literal[1]] + epn_en: c.Array[ctypes.c_ubyte, Literal[1]] + epn_overlap: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[2]] + confidentiality_offset: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_48: c.Array[ctypes.c_ubyte, Literal[4]] + aso_return_reg: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[16]] + epn_msb: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + dekn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + sci: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[8]] + macsec_aso_access_pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[96]] + salt: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[3]] + reserved_at_1e0: c.Array[ctypes.c_ubyte, Literal[32]] + macsec_aso: struct_mlx5_ifc_macsec_aso_bits +struct_mlx5_ifc_macsec_offload_obj_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('confidentiality_en', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('reserved_at_41', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('epn_en', c.Array[ctypes.c_ubyte, Literal[1]], 66), ('epn_overlap', c.Array[ctypes.c_ubyte, Literal[1]], 67), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[2]], 68), ('confidentiality_offset', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('reserved_at_48', c.Array[ctypes.c_ubyte, Literal[4]], 72), ('aso_return_reg', c.Array[ctypes.c_ubyte, Literal[4]], 76), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('epn_msb', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('dekn', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('sci', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('macsec_aso_access_pd', c.Array[ctypes.c_ubyte, Literal[24]], 264), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[96]], 288), ('salt', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[3]], 384), ('reserved_at_1e0', c.Array[ctypes.c_ubyte, Literal[32]], 480), ('macsec_aso', struct_mlx5_ifc_macsec_aso_bits, 512)]) +@c.record +class struct_mlx5_ifc_create_macsec_obj_in_bits(c.Struct): + SIZE = 1152 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + macsec_object: struct_mlx5_ifc_macsec_offload_obj_bits +struct_mlx5_ifc_create_macsec_obj_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('macsec_object', struct_mlx5_ifc_macsec_offload_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_modify_macsec_obj_in_bits(c.Struct): + SIZE = 1152 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + macsec_object: struct_mlx5_ifc_macsec_offload_obj_bits +struct_mlx5_ifc_modify_macsec_obj_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('macsec_object', struct_mlx5_ifc_macsec_offload_obj_bits, 128)]) +_anonenum139: dict[int, str] = {(MLX5_MODIFY_MACSEC_BITMASK_EPN_OVERLAP:=0): 'MLX5_MODIFY_MACSEC_BITMASK_EPN_OVERLAP', (MLX5_MODIFY_MACSEC_BITMASK_EPN_MSB:=1): 'MLX5_MODIFY_MACSEC_BITMASK_EPN_MSB'} +@c.record +class struct_mlx5_ifc_query_macsec_obj_out_bits(c.Struct): + SIZE = 1152 + general_obj_out_cmd_hdr: struct_mlx5_ifc_general_obj_out_cmd_hdr_bits + macsec_object: struct_mlx5_ifc_macsec_offload_obj_bits +struct_mlx5_ifc_query_macsec_obj_out_bits.register_fields([('general_obj_out_cmd_hdr', struct_mlx5_ifc_general_obj_out_cmd_hdr_bits, 0), ('macsec_object', struct_mlx5_ifc_macsec_offload_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_wrapped_dek_bits(c.Struct): + SIZE = 1024 + gcm_iv: c.Array[ctypes.c_ubyte, Literal[96]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + const0: c.Array[ctypes.c_ubyte, Literal[1]] + key_size: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_82: c.Array[ctypes.c_ubyte, Literal[2]] + key2_invalid: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_85: c.Array[ctypes.c_ubyte, Literal[3]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + key_purpose: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_a5: c.Array[ctypes.c_ubyte, Literal[19]] + kek_id: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[64]] + key1: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] + key2: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] + reserved_at_300: c.Array[ctypes.c_ubyte, Literal[64]] + const1: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_341: c.Array[ctypes.c_ubyte, Literal[31]] + reserved_at_360: c.Array[ctypes.c_ubyte, Literal[32]] + auth_tag: c.Array[ctypes.c_ubyte, Literal[128]] +struct_mlx5_ifc_wrapped_dek_bits.register_fields([('gcm_iv', c.Array[ctypes.c_ubyte, Literal[96]], 0), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('const0', c.Array[ctypes.c_ubyte, Literal[1]], 128), ('key_size', c.Array[ctypes.c_ubyte, Literal[1]], 129), ('reserved_at_82', c.Array[ctypes.c_ubyte, Literal[2]], 130), ('key2_invalid', c.Array[ctypes.c_ubyte, Literal[1]], 132), ('reserved_at_85', c.Array[ctypes.c_ubyte, Literal[3]], 133), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('key_purpose', c.Array[ctypes.c_ubyte, Literal[5]], 160), ('reserved_at_a5', c.Array[ctypes.c_ubyte, Literal[19]], 165), ('kek_id', c.Array[ctypes.c_ubyte, Literal[8]], 184), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('key1', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 256), ('key2', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 512), ('reserved_at_300', c.Array[ctypes.c_ubyte, Literal[64]], 768), ('const1', c.Array[ctypes.c_ubyte, Literal[1]], 832), ('reserved_at_341', c.Array[ctypes.c_ubyte, Literal[31]], 833), ('reserved_at_360', c.Array[ctypes.c_ubyte, Literal[32]], 864), ('auth_tag', c.Array[ctypes.c_ubyte, Literal[128]], 896)]) +@c.record +class struct_mlx5_ifc_encryption_key_obj_bits(c.Struct): + SIZE = 4096 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + state: c.Array[ctypes.c_ubyte, Literal[8]] + sw_wrapped: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_49: c.Array[ctypes.c_ubyte, Literal[11]] + key_size: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_58: c.Array[ctypes.c_ubyte, Literal[4]] + key_purpose: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[256]] + opaque: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_1c0: c.Array[ctypes.c_ubyte, Literal[64]] + key: c.Array[c.Array[ctypes.c_ubyte, Literal[128]], Literal[8]] + sw_wrapped_dek: c.Array[c.Array[ctypes.c_ubyte, Literal[128]], Literal[8]] + reserved_at_a00: c.Array[ctypes.c_ubyte, Literal[1536]] +struct_mlx5_ifc_encryption_key_obj_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('state', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('sw_wrapped', c.Array[ctypes.c_ubyte, Literal[1]], 72), ('reserved_at_49', c.Array[ctypes.c_ubyte, Literal[11]], 73), ('key_size', c.Array[ctypes.c_ubyte, Literal[4]], 84), ('reserved_at_58', c.Array[ctypes.c_ubyte, Literal[4]], 88), ('key_purpose', c.Array[ctypes.c_ubyte, Literal[4]], 92), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[256]], 128), ('opaque', c.Array[ctypes.c_ubyte, Literal[64]], 384), ('reserved_at_1c0', c.Array[ctypes.c_ubyte, Literal[64]], 448), ('key', c.Array[c.Array[ctypes.c_ubyte, Literal[128]], Literal[8]], 512), ('sw_wrapped_dek', c.Array[c.Array[ctypes.c_ubyte, Literal[128]], Literal[8]], 1536), ('reserved_at_a00', c.Array[ctypes.c_ubyte, Literal[1536]], 2560)]) +@c.record +class struct_mlx5_ifc_create_encryption_key_in_bits(c.Struct): + SIZE = 4224 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + encryption_key_object: struct_mlx5_ifc_encryption_key_obj_bits +struct_mlx5_ifc_create_encryption_key_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('encryption_key_object', struct_mlx5_ifc_encryption_key_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_modify_encryption_key_in_bits(c.Struct): + SIZE = 4224 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + encryption_key_object: struct_mlx5_ifc_encryption_key_obj_bits +struct_mlx5_ifc_modify_encryption_key_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('encryption_key_object', struct_mlx5_ifc_encryption_key_obj_bits, 128)]) +_anonenum140: dict[int, str] = {(MLX5_FLOW_METER_MODE_BYTES_IP_LENGTH:=0): 'MLX5_FLOW_METER_MODE_BYTES_IP_LENGTH', (MLX5_FLOW_METER_MODE_BYTES_CALC_WITH_L2:=1): 'MLX5_FLOW_METER_MODE_BYTES_CALC_WITH_L2', (MLX5_FLOW_METER_MODE_BYTES_CALC_WITH_L2_IPG:=2): 'MLX5_FLOW_METER_MODE_BYTES_CALC_WITH_L2_IPG', (MLX5_FLOW_METER_MODE_NUM_PACKETS:=3): 'MLX5_FLOW_METER_MODE_NUM_PACKETS'} +@c.record +class struct_mlx5_ifc_flow_meter_parameters_bits(c.Struct): + SIZE = 256 + valid: c.Array[ctypes.c_ubyte, Literal[1]] + bucket_overflow: c.Array[ctypes.c_ubyte, Literal[1]] + start_color: c.Array[ctypes.c_ubyte, Literal[2]] + both_buckets_on_green: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_5: c.Array[ctypes.c_ubyte, Literal[1]] + meter_mode: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[3]] + cbs_exponent: c.Array[ctypes.c_ubyte, Literal[5]] + cbs_mantissa: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[3]] + cir_exponent: c.Array[ctypes.c_ubyte, Literal[5]] + cir_mantissa: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[3]] + ebs_exponent: c.Array[ctypes.c_ubyte, Literal[5]] + ebs_mantissa: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_90: c.Array[ctypes.c_ubyte, Literal[3]] + eir_exponent: c.Array[ctypes.c_ubyte, Literal[5]] + eir_mantissa: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[96]] +struct_mlx5_ifc_flow_meter_parameters_bits.register_fields([('valid', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('bucket_overflow', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('start_color', c.Array[ctypes.c_ubyte, Literal[2]], 2), ('both_buckets_on_green', c.Array[ctypes.c_ubyte, Literal[1]], 4), ('reserved_at_5', c.Array[ctypes.c_ubyte, Literal[1]], 5), ('meter_mode', c.Array[ctypes.c_ubyte, Literal[2]], 6), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[3]], 64), ('cbs_exponent', c.Array[ctypes.c_ubyte, Literal[5]], 67), ('cbs_mantissa', c.Array[ctypes.c_ubyte, Literal[8]], 72), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[3]], 80), ('cir_exponent', c.Array[ctypes.c_ubyte, Literal[5]], 83), ('cir_mantissa', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[3]], 128), ('ebs_exponent', c.Array[ctypes.c_ubyte, Literal[5]], 131), ('ebs_mantissa', c.Array[ctypes.c_ubyte, Literal[8]], 136), ('reserved_at_90', c.Array[ctypes.c_ubyte, Literal[3]], 144), ('eir_exponent', c.Array[ctypes.c_ubyte, Literal[5]], 147), ('eir_mantissa', c.Array[ctypes.c_ubyte, Literal[8]], 152), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[96]], 160)]) +@c.record +class struct_mlx5_ifc_flow_meter_aso_obj_bits(c.Struct): + SIZE = 1024 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + meter_aso_access_pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[352]] + flow_meter_parameters: c.Array[struct_mlx5_ifc_flow_meter_parameters_bits, Literal[2]] +struct_mlx5_ifc_flow_meter_aso_obj_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('meter_aso_access_pd', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[352]], 160), ('flow_meter_parameters', c.Array[struct_mlx5_ifc_flow_meter_parameters_bits, Literal[2]], 512)]) +@c.record +class struct_mlx5_ifc_create_flow_meter_aso_obj_in_bits(c.Struct): + SIZE = 1152 + hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + flow_meter_aso_obj: struct_mlx5_ifc_flow_meter_aso_obj_bits +struct_mlx5_ifc_create_flow_meter_aso_obj_in_bits.register_fields([('hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('flow_meter_aso_obj', struct_mlx5_ifc_flow_meter_aso_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_int_kek_obj_bits(c.Struct): + SIZE = 2048 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + state: c.Array[ctypes.c_ubyte, Literal[8]] + auto_gen: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_49: c.Array[ctypes.c_ubyte, Literal[11]] + key_size: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_58: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[8]] + pd: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] + key: c.Array[c.Array[ctypes.c_ubyte, Literal[128]], Literal[8]] + reserved_at_600: c.Array[ctypes.c_ubyte, Literal[512]] +struct_mlx5_ifc_int_kek_obj_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('state', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('auto_gen', c.Array[ctypes.c_ubyte, Literal[1]], 72), ('reserved_at_49', c.Array[ctypes.c_ubyte, Literal[11]], 73), ('key_size', c.Array[ctypes.c_ubyte, Literal[4]], 84), ('reserved_at_58', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[8]], 96), ('pd', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128), ('key', c.Array[c.Array[ctypes.c_ubyte, Literal[128]], Literal[8]], 512), ('reserved_at_600', c.Array[ctypes.c_ubyte, Literal[512]], 1536)]) +@c.record +class struct_mlx5_ifc_create_int_kek_obj_in_bits(c.Struct): + SIZE = 2176 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + int_kek_object: struct_mlx5_ifc_int_kek_obj_bits +struct_mlx5_ifc_create_int_kek_obj_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('int_kek_object', struct_mlx5_ifc_int_kek_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_create_int_kek_obj_out_bits(c.Struct): + SIZE = 2176 + general_obj_out_cmd_hdr: struct_mlx5_ifc_general_obj_out_cmd_hdr_bits + int_kek_object: struct_mlx5_ifc_int_kek_obj_bits +struct_mlx5_ifc_create_int_kek_obj_out_bits.register_fields([('general_obj_out_cmd_hdr', struct_mlx5_ifc_general_obj_out_cmd_hdr_bits, 0), ('int_kek_object', struct_mlx5_ifc_int_kek_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_sampler_obj_bits(c.Struct): + SIZE = 480 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + table_type: c.Array[ctypes.c_ubyte, Literal[8]] + level: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_50: c.Array[ctypes.c_ubyte, Literal[15]] + ignore_flow_level: c.Array[ctypes.c_ubyte, Literal[1]] + sample_ratio: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[8]] + sample_table_id: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + default_table_id: c.Array[ctypes.c_ubyte, Literal[24]] + sw_steering_icm_address_rx: c.Array[ctypes.c_ubyte, Literal[64]] + sw_steering_icm_address_tx: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_140: c.Array[ctypes.c_ubyte, Literal[160]] +struct_mlx5_ifc_sampler_obj_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('table_type', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('level', c.Array[ctypes.c_ubyte, Literal[8]], 72), ('reserved_at_50', c.Array[ctypes.c_ubyte, Literal[15]], 80), ('ignore_flow_level', c.Array[ctypes.c_ubyte, Literal[1]], 95), ('sample_ratio', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[8]], 128), ('sample_table_id', c.Array[ctypes.c_ubyte, Literal[24]], 136), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('default_table_id', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('sw_steering_icm_address_rx', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('sw_steering_icm_address_tx', c.Array[ctypes.c_ubyte, Literal[64]], 256), ('reserved_at_140', c.Array[ctypes.c_ubyte, Literal[160]], 320)]) +@c.record +class struct_mlx5_ifc_create_sampler_obj_in_bits(c.Struct): + SIZE = 608 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + sampler_object: struct_mlx5_ifc_sampler_obj_bits +struct_mlx5_ifc_create_sampler_obj_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('sampler_object', struct_mlx5_ifc_sampler_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_sampler_obj_out_bits(c.Struct): + SIZE = 608 + general_obj_out_cmd_hdr: struct_mlx5_ifc_general_obj_out_cmd_hdr_bits + sampler_object: struct_mlx5_ifc_sampler_obj_bits +struct_mlx5_ifc_query_sampler_obj_out_bits.register_fields([('general_obj_out_cmd_hdr', struct_mlx5_ifc_general_obj_out_cmd_hdr_bits, 0), ('sampler_object', struct_mlx5_ifc_sampler_obj_bits, 128)]) +_anonenum141: dict[int, str] = {(MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_KEY_SIZE_128:=0): 'MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_KEY_SIZE_128', (MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_KEY_SIZE_256:=1): 'MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_KEY_SIZE_256'} +_anonenum142: dict[int, str] = {(MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_PURPOSE_TLS:=1): 'MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_PURPOSE_TLS', (MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_PURPOSE_IPSEC:=2): 'MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_PURPOSE_IPSEC', (MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_PURPOSE_MACSEC:=4): 'MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_PURPOSE_MACSEC', (MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_PURPOSE_PSP:=6): 'MLX5_GENERAL_OBJECT_TYPE_ENCRYPTION_KEY_PURPOSE_PSP'} +@c.record +class struct_mlx5_ifc_tls_static_params_bits(c.Struct): + SIZE = 512 + const_2: c.Array[ctypes.c_ubyte, Literal[2]] + tls_version: c.Array[ctypes.c_ubyte, Literal[4]] + const_1: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[20]] + encryption_standard: c.Array[ctypes.c_ubyte, Literal[4]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[32]] + initial_record_number: c.Array[ctypes.c_ubyte, Literal[64]] + resync_tcp_sn: c.Array[ctypes.c_ubyte, Literal[32]] + gcm_iv: c.Array[ctypes.c_ubyte, Literal[32]] + implicit_iv: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[8]] + dek_index: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_120: c.Array[ctypes.c_ubyte, Literal[224]] +struct_mlx5_ifc_tls_static_params_bits.register_fields([('const_2', c.Array[ctypes.c_ubyte, Literal[2]], 0), ('tls_version', c.Array[ctypes.c_ubyte, Literal[4]], 2), ('const_1', c.Array[ctypes.c_ubyte, Literal[2]], 6), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[20]], 8), ('encryption_standard', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('initial_record_number', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('resync_tcp_sn', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('gcm_iv', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('implicit_iv', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[8]], 256), ('dek_index', c.Array[ctypes.c_ubyte, Literal[24]], 264), ('reserved_at_120', c.Array[ctypes.c_ubyte, Literal[224]], 288)]) +@c.record +class struct_mlx5_ifc_tls_progress_params_bits(c.Struct): + SIZE = 96 + next_record_tcp_sn: c.Array[ctypes.c_ubyte, Literal[32]] + hw_resync_tcp_sn: c.Array[ctypes.c_ubyte, Literal[32]] + record_tracker_state: c.Array[ctypes.c_ubyte, Literal[2]] + auth_state: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_44: c.Array[ctypes.c_ubyte, Literal[4]] + hw_offset_record_number: c.Array[ctypes.c_ubyte, Literal[24]] +struct_mlx5_ifc_tls_progress_params_bits.register_fields([('next_record_tcp_sn', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('hw_resync_tcp_sn', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('record_tracker_state', c.Array[ctypes.c_ubyte, Literal[2]], 64), ('auth_state', c.Array[ctypes.c_ubyte, Literal[2]], 66), ('reserved_at_44', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('hw_offset_record_number', c.Array[ctypes.c_ubyte, Literal[24]], 72)]) +_anonenum143: dict[int, str] = {(MLX5_MTT_PERM_READ:=1): 'MLX5_MTT_PERM_READ', (MLX5_MTT_PERM_WRITE:=2): 'MLX5_MTT_PERM_WRITE', (MLX5_MTT_PERM_RW:=3): 'MLX5_MTT_PERM_RW'} +_anonenum144: dict[int, str] = {(MLX5_SUSPEND_VHCA_IN_OP_MOD_SUSPEND_INITIATOR:=0): 'MLX5_SUSPEND_VHCA_IN_OP_MOD_SUSPEND_INITIATOR', (MLX5_SUSPEND_VHCA_IN_OP_MOD_SUSPEND_RESPONDER:=1): 'MLX5_SUSPEND_VHCA_IN_OP_MOD_SUSPEND_RESPONDER'} +@c.record +class struct_mlx5_ifc_suspend_vhca_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_suspend_vhca_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_suspend_vhca_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_suspend_vhca_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +_anonenum145: dict[int, str] = {(MLX5_RESUME_VHCA_IN_OP_MOD_RESUME_RESPONDER:=0): 'MLX5_RESUME_VHCA_IN_OP_MOD_RESUME_RESPONDER', (MLX5_RESUME_VHCA_IN_OP_MOD_RESUME_INITIATOR:=1): 'MLX5_RESUME_VHCA_IN_OP_MOD_RESUME_INITIATOR'} +@c.record +class struct_mlx5_ifc_resume_vhca_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_resume_vhca_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_resume_vhca_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_resume_vhca_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_query_vhca_migration_state_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + incremental: c.Array[ctypes.c_ubyte, Literal[1]] + chunk: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[14]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_query_vhca_migration_state_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('incremental', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('chunk', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[14]], 66), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_query_vhca_migration_state_out_bits(c.Struct): + SIZE = 512 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] + required_umem_size: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[32]] + remaining_total_size: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_100: c.Array[ctypes.c_ubyte, Literal[256]] +struct_mlx5_ifc_query_vhca_migration_state_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('required_umem_size', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[32]], 160), ('remaining_total_size', c.Array[ctypes.c_ubyte, Literal[64]], 192), ('reserved_at_100', c.Array[ctypes.c_ubyte, Literal[256]], 256)]) +@c.record +class struct_mlx5_ifc_save_vhca_state_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + incremental: c.Array[ctypes.c_ubyte, Literal[1]] + set_track: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[14]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + va: c.Array[ctypes.c_ubyte, Literal[64]] + mkey: c.Array[ctypes.c_ubyte, Literal[32]] + size: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_save_vhca_state_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('incremental', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('set_track', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[14]], 66), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('va', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('mkey', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('size', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_save_vhca_state_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + actual_image_size: c.Array[ctypes.c_ubyte, Literal[32]] + next_required_umem_size: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_save_vhca_state_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('actual_image_size', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('next_required_umem_size', c.Array[ctypes.c_ubyte, Literal[32]], 96)]) +@c.record +class struct_mlx5_ifc_load_vhca_state_in_bits(c.Struct): + SIZE = 256 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + va: c.Array[ctypes.c_ubyte, Literal[64]] + mkey: c.Array[ctypes.c_ubyte, Literal[32]] + size: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_load_vhca_state_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('va', c.Array[ctypes.c_ubyte, Literal[64]], 128), ('mkey', c.Array[ctypes.c_ubyte, Literal[32]], 192), ('size', c.Array[ctypes.c_ubyte, Literal[32]], 224)]) +@c.record +class struct_mlx5_ifc_load_vhca_state_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_load_vhca_state_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_adv_rdma_cap_bits(c.Struct): + SIZE = 16384 + rdma_transport_manager: c.Array[ctypes.c_ubyte, Literal[1]] + rdma_transport_manager_other_eswitch: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_2: c.Array[ctypes.c_ubyte, Literal[30]] + rcx_type: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_28: c.Array[ctypes.c_ubyte, Literal[2]] + ps_entry_log_max_value: c.Array[ctypes.c_ubyte, Literal[6]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[6]] + qp_max_ps_num_entry: c.Array[ctypes.c_ubyte, Literal[10]] + mp_max_num_queues: c.Array[ctypes.c_ubyte, Literal[8]] + ps_user_context_max_log_size: c.Array[ctypes.c_ubyte, Literal[8]] + message_based_qp_and_striding_wq: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_58: c.Array[ctypes.c_ubyte, Literal[8]] + max_receive_send_message_size_stride: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_70: c.Array[ctypes.c_ubyte, Literal[16]] + max_receive_send_message_size_byte: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[352]] + rdma_transport_rx_flow_table_properties: struct_mlx5_ifc_flow_table_prop_layout_bits + rdma_transport_tx_flow_table_properties: struct_mlx5_ifc_flow_table_prop_layout_bits + rdma_transport_rx_ft_field_support_2: struct_mlx5_ifc_flow_table_fields_supported_2_bits + rdma_transport_tx_ft_field_support_2: struct_mlx5_ifc_flow_table_fields_supported_2_bits + rdma_transport_rx_ft_field_bitmask_support_2: struct_mlx5_ifc_flow_table_fields_supported_2_bits + rdma_transport_tx_ft_field_bitmask_support_2: struct_mlx5_ifc_flow_table_fields_supported_2_bits + reserved_at_800: c.Array[ctypes.c_ubyte, Literal[14336]] +struct_mlx5_ifc_adv_rdma_cap_bits.register_fields([('rdma_transport_manager', c.Array[ctypes.c_ubyte, Literal[1]], 0), ('rdma_transport_manager_other_eswitch', c.Array[ctypes.c_ubyte, Literal[1]], 1), ('reserved_at_2', c.Array[ctypes.c_ubyte, Literal[30]], 2), ('rcx_type', c.Array[ctypes.c_ubyte, Literal[8]], 32), ('reserved_at_28', c.Array[ctypes.c_ubyte, Literal[2]], 40), ('ps_entry_log_max_value', c.Array[ctypes.c_ubyte, Literal[6]], 42), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[6]], 48), ('qp_max_ps_num_entry', c.Array[ctypes.c_ubyte, Literal[10]], 54), ('mp_max_num_queues', c.Array[ctypes.c_ubyte, Literal[8]], 64), ('ps_user_context_max_log_size', c.Array[ctypes.c_ubyte, Literal[8]], 72), ('message_based_qp_and_striding_wq', c.Array[ctypes.c_ubyte, Literal[8]], 80), ('reserved_at_58', c.Array[ctypes.c_ubyte, Literal[8]], 88), ('max_receive_send_message_size_stride', c.Array[ctypes.c_ubyte, Literal[16]], 96), ('reserved_at_70', c.Array[ctypes.c_ubyte, Literal[16]], 112), ('max_receive_send_message_size_byte', c.Array[ctypes.c_ubyte, Literal[32]], 128), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[352]], 160), ('rdma_transport_rx_flow_table_properties', struct_mlx5_ifc_flow_table_prop_layout_bits, 512), ('rdma_transport_tx_flow_table_properties', struct_mlx5_ifc_flow_table_prop_layout_bits, 1024), ('rdma_transport_rx_ft_field_support_2', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 1536), ('rdma_transport_tx_ft_field_support_2', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 1664), ('rdma_transport_rx_ft_field_bitmask_support_2', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 1792), ('rdma_transport_tx_ft_field_bitmask_support_2', struct_mlx5_ifc_flow_table_fields_supported_2_bits, 1920), ('reserved_at_800', c.Array[ctypes.c_ubyte, Literal[14336]], 2048)]) +@c.record +class struct_mlx5_ifc_adv_virtualization_cap_bits(c.Struct): + SIZE = 2048 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[3]] + pg_track_log_max_num: c.Array[ctypes.c_ubyte, Literal[5]] + pg_track_max_num_range: c.Array[ctypes.c_ubyte, Literal[8]] + pg_track_log_min_addr_space: c.Array[ctypes.c_ubyte, Literal[8]] + pg_track_log_max_addr_space: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[3]] + pg_track_log_min_msg_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_28: c.Array[ctypes.c_ubyte, Literal[3]] + pg_track_log_max_msg_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_30: c.Array[ctypes.c_ubyte, Literal[3]] + pg_track_log_min_page_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_38: c.Array[ctypes.c_ubyte, Literal[3]] + pg_track_log_max_page_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[1984]] +struct_mlx5_ifc_adv_virtualization_cap_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('pg_track_log_max_num', c.Array[ctypes.c_ubyte, Literal[5]], 3), ('pg_track_max_num_range', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('pg_track_log_min_addr_space', c.Array[ctypes.c_ubyte, Literal[8]], 16), ('pg_track_log_max_addr_space', c.Array[ctypes.c_ubyte, Literal[8]], 24), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[3]], 32), ('pg_track_log_min_msg_size', c.Array[ctypes.c_ubyte, Literal[5]], 35), ('reserved_at_28', c.Array[ctypes.c_ubyte, Literal[3]], 40), ('pg_track_log_max_msg_size', c.Array[ctypes.c_ubyte, Literal[5]], 43), ('reserved_at_30', c.Array[ctypes.c_ubyte, Literal[3]], 48), ('pg_track_log_min_page_size', c.Array[ctypes.c_ubyte, Literal[5]], 51), ('reserved_at_38', c.Array[ctypes.c_ubyte, Literal[3]], 56), ('pg_track_log_max_page_size', c.Array[ctypes.c_ubyte, Literal[5]], 59), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[1984]], 64)]) +@c.record +class struct_mlx5_ifc_page_track_report_entry_bits(c.Struct): + SIZE = 64 + dirty_address_high: c.Array[ctypes.c_ubyte, Literal[32]] + dirty_address_low: c.Array[ctypes.c_ubyte, Literal[32]] +struct_mlx5_ifc_page_track_report_entry_bits.register_fields([('dirty_address_high', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('dirty_address_low', c.Array[ctypes.c_ubyte, Literal[32]], 32)]) +_anonenum146: dict[int, str] = {(MLX5_PAGE_TRACK_STATE_TRACKING:=0): 'MLX5_PAGE_TRACK_STATE_TRACKING', (MLX5_PAGE_TRACK_STATE_REPORTING:=1): 'MLX5_PAGE_TRACK_STATE_REPORTING', (MLX5_PAGE_TRACK_STATE_ERROR:=2): 'MLX5_PAGE_TRACK_STATE_ERROR'} +@c.record +class struct_mlx5_ifc_page_track_range_bits(c.Struct): + SIZE = 128 + start_address: c.Array[ctypes.c_ubyte, Literal[64]] + length: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_page_track_range_bits.register_fields([('start_address', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('length', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_page_track_bits(c.Struct): + SIZE = 384 + modify_field_select: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + vhca_id: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + state: c.Array[ctypes.c_ubyte, Literal[4]] + track_type: c.Array[ctypes.c_ubyte, Literal[4]] + log_addr_space_size: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_90: c.Array[ctypes.c_ubyte, Literal[3]] + log_page_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_98: c.Array[ctypes.c_ubyte, Literal[3]] + log_msg_size: c.Array[ctypes.c_ubyte, Literal[5]] + reserved_at_a0: c.Array[ctypes.c_ubyte, Literal[8]] + reporting_qpn: c.Array[ctypes.c_ubyte, Literal[24]] + reserved_at_c0: c.Array[ctypes.c_ubyte, Literal[24]] + num_ranges: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[32]] + range_start_address: c.Array[ctypes.c_ubyte, Literal[64]] + length: c.Array[ctypes.c_ubyte, Literal[64]] + track_range: c.Array[struct_mlx5_ifc_page_track_range_bits, Literal[0]] +struct_mlx5_ifc_page_track_bits.register_fields([('modify_field_select', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('vhca_id', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('state', c.Array[ctypes.c_ubyte, Literal[4]], 128), ('track_type', c.Array[ctypes.c_ubyte, Literal[4]], 132), ('log_addr_space_size', c.Array[ctypes.c_ubyte, Literal[8]], 136), ('reserved_at_90', c.Array[ctypes.c_ubyte, Literal[3]], 144), ('log_page_size', c.Array[ctypes.c_ubyte, Literal[5]], 147), ('reserved_at_98', c.Array[ctypes.c_ubyte, Literal[3]], 152), ('log_msg_size', c.Array[ctypes.c_ubyte, Literal[5]], 155), ('reserved_at_a0', c.Array[ctypes.c_ubyte, Literal[8]], 160), ('reporting_qpn', c.Array[ctypes.c_ubyte, Literal[24]], 168), ('reserved_at_c0', c.Array[ctypes.c_ubyte, Literal[24]], 192), ('num_ranges', c.Array[ctypes.c_ubyte, Literal[8]], 216), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[32]], 224), ('range_start_address', c.Array[ctypes.c_ubyte, Literal[64]], 256), ('length', c.Array[ctypes.c_ubyte, Literal[64]], 320), ('track_range', c.Array[struct_mlx5_ifc_page_track_range_bits, Literal[0]], 384)]) +@c.record +class struct_mlx5_ifc_create_page_track_obj_in_bits(c.Struct): + SIZE = 512 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + obj_context: struct_mlx5_ifc_page_track_bits +struct_mlx5_ifc_create_page_track_obj_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('obj_context', struct_mlx5_ifc_page_track_bits, 128)]) +@c.record +class struct_mlx5_ifc_modify_page_track_obj_in_bits(c.Struct): + SIZE = 512 + general_obj_in_cmd_hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + obj_context: struct_mlx5_ifc_page_track_bits +struct_mlx5_ifc_modify_page_track_obj_in_bits.register_fields([('general_obj_in_cmd_hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('obj_context', struct_mlx5_ifc_page_track_bits, 128)]) +@c.record +class struct_mlx5_ifc_query_page_track_obj_out_bits(c.Struct): + SIZE = 512 + general_obj_out_cmd_hdr: struct_mlx5_ifc_general_obj_out_cmd_hdr_bits + obj_context: struct_mlx5_ifc_page_track_bits +struct_mlx5_ifc_query_page_track_obj_out_bits.register_fields([('general_obj_out_cmd_hdr', struct_mlx5_ifc_general_obj_out_cmd_hdr_bits, 0), ('obj_context', struct_mlx5_ifc_page_track_bits, 128)]) +@c.record +class struct_mlx5_ifc_msecq_reg_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[18]] + network_option: c.Array[ctypes.c_ubyte, Literal[2]] + local_ssm_code: c.Array[ctypes.c_ubyte, Literal[4]] + local_enhanced_ssm_code: c.Array[ctypes.c_ubyte, Literal[8]] + local_clock_identity: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_msecq_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[18]], 32), ('network_option', c.Array[ctypes.c_ubyte, Literal[2]], 50), ('local_ssm_code', c.Array[ctypes.c_ubyte, Literal[4]], 52), ('local_enhanced_ssm_code', c.Array[ctypes.c_ubyte, Literal[8]], 56), ('local_clock_identity', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +_anonenum147: dict[int, str] = {(MLX5_MSEES_FIELD_SELECT_ENABLE:=0): 'MLX5_MSEES_FIELD_SELECT_ENABLE', (MLX5_MSEES_FIELD_SELECT_ADMIN_STATUS:=1): 'MLX5_MSEES_FIELD_SELECT_ADMIN_STATUS', (MLX5_MSEES_FIELD_SELECT_ADMIN_FREQ_MEASURE:=2): 'MLX5_MSEES_FIELD_SELECT_ADMIN_FREQ_MEASURE'} +enum_mlx5_msees_admin_status: dict[int, str] = {(MLX5_MSEES_ADMIN_STATUS_FREE_RUNNING:=0): 'MLX5_MSEES_ADMIN_STATUS_FREE_RUNNING', (MLX5_MSEES_ADMIN_STATUS_TRACK:=1): 'MLX5_MSEES_ADMIN_STATUS_TRACK'} +enum_mlx5_msees_oper_status: dict[int, str] = {(MLX5_MSEES_OPER_STATUS_FREE_RUNNING:=0): 'MLX5_MSEES_OPER_STATUS_FREE_RUNNING', (MLX5_MSEES_OPER_STATUS_SELF_TRACK:=1): 'MLX5_MSEES_OPER_STATUS_SELF_TRACK', (MLX5_MSEES_OPER_STATUS_OTHER_TRACK:=2): 'MLX5_MSEES_OPER_STATUS_OTHER_TRACK', (MLX5_MSEES_OPER_STATUS_HOLDOVER:=3): 'MLX5_MSEES_OPER_STATUS_HOLDOVER', (MLX5_MSEES_OPER_STATUS_FAIL_HOLDOVER:=4): 'MLX5_MSEES_OPER_STATUS_FAIL_HOLDOVER', (MLX5_MSEES_OPER_STATUS_FAIL_FREE_RUNNING:=5): 'MLX5_MSEES_OPER_STATUS_FAIL_FREE_RUNNING'} +enum_mlx5_msees_failure_reason: dict[int, str] = {(MLX5_MSEES_FAILURE_REASON_UNDEFINED_ERROR:=0): 'MLX5_MSEES_FAILURE_REASON_UNDEFINED_ERROR', (MLX5_MSEES_FAILURE_REASON_PORT_DOWN:=1): 'MLX5_MSEES_FAILURE_REASON_PORT_DOWN', (MLX5_MSEES_FAILURE_REASON_TOO_HIGH_FREQUENCY_DIFF:=2): 'MLX5_MSEES_FAILURE_REASON_TOO_HIGH_FREQUENCY_DIFF', (MLX5_MSEES_FAILURE_REASON_NET_SYNCHRONIZER_DEVICE_ERROR:=3): 'MLX5_MSEES_FAILURE_REASON_NET_SYNCHRONIZER_DEVICE_ERROR', (MLX5_MSEES_FAILURE_REASON_LACK_OF_RESOURCES:=4): 'MLX5_MSEES_FAILURE_REASON_LACK_OF_RESOURCES'} +@c.record +class struct_mlx5_ifc_msees_reg_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[8]] + local_port: c.Array[ctypes.c_ubyte, Literal[8]] + pnat: c.Array[ctypes.c_ubyte, Literal[2]] + lp_msb: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_14: c.Array[ctypes.c_ubyte, Literal[12]] + field_select: c.Array[ctypes.c_ubyte, Literal[32]] + admin_status: c.Array[ctypes.c_ubyte, Literal[4]] + oper_status: c.Array[ctypes.c_ubyte, Literal[4]] + ho_acq: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_49: c.Array[ctypes.c_ubyte, Literal[12]] + admin_freq_measure: c.Array[ctypes.c_ubyte, Literal[1]] + oper_freq_measure: c.Array[ctypes.c_ubyte, Literal[1]] + failure_reason: c.Array[ctypes.c_ubyte, Literal[9]] + frequency_diff: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_msees_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('local_port', c.Array[ctypes.c_ubyte, Literal[8]], 8), ('pnat', c.Array[ctypes.c_ubyte, Literal[2]], 16), ('lp_msb', c.Array[ctypes.c_ubyte, Literal[2]], 18), ('reserved_at_14', c.Array[ctypes.c_ubyte, Literal[12]], 20), ('field_select', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('admin_status', c.Array[ctypes.c_ubyte, Literal[4]], 64), ('oper_status', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('ho_acq', c.Array[ctypes.c_ubyte, Literal[1]], 72), ('reserved_at_49', c.Array[ctypes.c_ubyte, Literal[12]], 73), ('admin_freq_measure', c.Array[ctypes.c_ubyte, Literal[1]], 85), ('oper_freq_measure', c.Array[ctypes.c_ubyte, Literal[1]], 86), ('failure_reason', c.Array[ctypes.c_ubyte, Literal[9]], 87), ('frequency_diff', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +@c.record +class struct_mlx5_ifc_mrtcq_reg_bits(c.Struct): + SIZE = 512 + reserved_at_0: c.Array[ctypes.c_ubyte, Literal[64]] + rt_clock_identity: c.Array[ctypes.c_ubyte, Literal[64]] + reserved_at_80: c.Array[ctypes.c_ubyte, Literal[384]] +struct_mlx5_ifc_mrtcq_reg_bits.register_fields([('reserved_at_0', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('rt_clock_identity', c.Array[ctypes.c_ubyte, Literal[64]], 64), ('reserved_at_80', c.Array[ctypes.c_ubyte, Literal[384]], 128)]) +@c.record +class struct_mlx5_ifc_pcie_cong_event_obj_bits(c.Struct): + SIZE = 1024 + modify_select_field: c.Array[ctypes.c_ubyte, Literal[64]] + inbound_event_en: c.Array[ctypes.c_ubyte, Literal[1]] + outbound_event_en: c.Array[ctypes.c_ubyte, Literal[1]] + reserved_at_42: c.Array[ctypes.c_ubyte, Literal[30]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[1]] + inbound_cong_state: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_64: c.Array[ctypes.c_ubyte, Literal[1]] + outbound_cong_state: c.Array[ctypes.c_ubyte, Literal[3]] + reserved_at_68: c.Array[ctypes.c_ubyte, Literal[24]] + inbound_cong_low_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + inbound_cong_high_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + outbound_cong_low_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + outbound_cong_high_threshold: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_e0: c.Array[ctypes.c_ubyte, Literal[832]] +struct_mlx5_ifc_pcie_cong_event_obj_bits.register_fields([('modify_select_field', c.Array[ctypes.c_ubyte, Literal[64]], 0), ('inbound_event_en', c.Array[ctypes.c_ubyte, Literal[1]], 64), ('outbound_event_en', c.Array[ctypes.c_ubyte, Literal[1]], 65), ('reserved_at_42', c.Array[ctypes.c_ubyte, Literal[30]], 66), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[1]], 96), ('inbound_cong_state', c.Array[ctypes.c_ubyte, Literal[3]], 97), ('reserved_at_64', c.Array[ctypes.c_ubyte, Literal[1]], 100), ('outbound_cong_state', c.Array[ctypes.c_ubyte, Literal[3]], 101), ('reserved_at_68', c.Array[ctypes.c_ubyte, Literal[24]], 104), ('inbound_cong_low_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 128), ('inbound_cong_high_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 144), ('outbound_cong_low_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 160), ('outbound_cong_high_threshold', c.Array[ctypes.c_ubyte, Literal[16]], 176), ('reserved_at_e0', c.Array[ctypes.c_ubyte, Literal[832]], 192)]) +@c.record +class struct_mlx5_ifc_pcie_cong_event_cmd_in_bits(c.Struct): + SIZE = 1152 + hdr: struct_mlx5_ifc_general_obj_in_cmd_hdr_bits + cong_obj: struct_mlx5_ifc_pcie_cong_event_obj_bits +struct_mlx5_ifc_pcie_cong_event_cmd_in_bits.register_fields([('hdr', struct_mlx5_ifc_general_obj_in_cmd_hdr_bits, 0), ('cong_obj', struct_mlx5_ifc_pcie_cong_event_obj_bits, 128)]) +@c.record +class struct_mlx5_ifc_pcie_cong_event_cmd_out_bits(c.Struct): + SIZE = 1152 + hdr: struct_mlx5_ifc_general_obj_out_cmd_hdr_bits + cong_obj: struct_mlx5_ifc_pcie_cong_event_obj_bits +struct_mlx5_ifc_pcie_cong_event_cmd_out_bits.register_fields([('hdr', struct_mlx5_ifc_general_obj_out_cmd_hdr_bits, 0), ('cong_obj', struct_mlx5_ifc_pcie_cong_event_obj_bits, 128)]) +enum_mlx5e_pcie_cong_event_mod_field: dict[int, str] = {(MLX5_PCIE_CONG_EVENT_MOD_EVENT_EN:=0): 'MLX5_PCIE_CONG_EVENT_MOD_EVENT_EN', (MLX5_PCIE_CONG_EVENT_MOD_THRESH:=1): 'MLX5_PCIE_CONG_EVENT_MOD_THRESH'} +@c.record +class struct_mlx5_ifc_psp_rotate_key_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_psp_rotate_key_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +@c.record +class struct_mlx5_ifc_psp_rotate_key_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[64]] +struct_mlx5_ifc_psp_rotate_key_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[64]], 64)]) +enum_mlx5_psp_gen_spi_in_key_size: dict[int, str] = {(MLX5_PSP_GEN_SPI_IN_KEY_SIZE_128:=0): 'MLX5_PSP_GEN_SPI_IN_KEY_SIZE_128', (MLX5_PSP_GEN_SPI_IN_KEY_SIZE_256:=1): 'MLX5_PSP_GEN_SPI_IN_KEY_SIZE_256'} +@c.record +class struct_mlx5_ifc_key_spi_bits(c.Struct): + SIZE = 384 + spi: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[96]] + key: c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]] +struct_mlx5_ifc_key_spi_bits.register_fields([('spi', c.Array[ctypes.c_ubyte, Literal[32]], 0), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[96]], 32), ('key', c.Array[c.Array[ctypes.c_ubyte, Literal[32]], Literal[8]], 128)]) +@c.record +class struct_mlx5_ifc_psp_gen_spi_in_bits(c.Struct): + SIZE = 128 + opcode: c.Array[ctypes.c_ubyte, Literal[16]] + uid: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_20: c.Array[ctypes.c_ubyte, Literal[16]] + op_mod: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[32]] + key_size: c.Array[ctypes.c_ubyte, Literal[2]] + reserved_at_62: c.Array[ctypes.c_ubyte, Literal[14]] + num_of_spi: c.Array[ctypes.c_ubyte, Literal[16]] +struct_mlx5_ifc_psp_gen_spi_in_bits.register_fields([('opcode', c.Array[ctypes.c_ubyte, Literal[16]], 0), ('uid', c.Array[ctypes.c_ubyte, Literal[16]], 16), ('reserved_at_20', c.Array[ctypes.c_ubyte, Literal[16]], 32), ('op_mod', c.Array[ctypes.c_ubyte, Literal[16]], 48), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[32]], 64), ('key_size', c.Array[ctypes.c_ubyte, Literal[2]], 96), ('reserved_at_62', c.Array[ctypes.c_ubyte, Literal[14]], 98), ('num_of_spi', c.Array[ctypes.c_ubyte, Literal[16]], 112)]) +@c.record +class struct_mlx5_ifc_psp_gen_spi_out_bits(c.Struct): + SIZE = 128 + status: c.Array[ctypes.c_ubyte, Literal[8]] + reserved_at_8: c.Array[ctypes.c_ubyte, Literal[24]] + syndrome: c.Array[ctypes.c_ubyte, Literal[32]] + reserved_at_40: c.Array[ctypes.c_ubyte, Literal[16]] + num_of_spi: c.Array[ctypes.c_ubyte, Literal[16]] + reserved_at_60: c.Array[ctypes.c_ubyte, Literal[32]] + key_spi: c.Array[struct_mlx5_ifc_key_spi_bits, Literal[0]] +struct_mlx5_ifc_psp_gen_spi_out_bits.register_fields([('status', c.Array[ctypes.c_ubyte, Literal[8]], 0), ('reserved_at_8', c.Array[ctypes.c_ubyte, Literal[24]], 8), ('syndrome', c.Array[ctypes.c_ubyte, Literal[32]], 32), ('reserved_at_40', c.Array[ctypes.c_ubyte, Literal[16]], 64), ('num_of_spi', c.Array[ctypes.c_ubyte, Literal[16]], 80), ('reserved_at_60', c.Array[ctypes.c_ubyte, Literal[32]], 96), ('key_spi', c.Array[struct_mlx5_ifc_key_spi_bits, Literal[0]], 128)]) +MLX5_CMD_OP_QUERY_HCA_CAP = 0x100 +MLX5_CMD_OP_QUERY_ADAPTER = 0x101 +MLX5_CMD_OP_INIT_HCA = 0x102 +MLX5_CMD_OP_TEARDOWN_HCA = 0x103 +MLX5_CMD_OP_ENABLE_HCA = 0x104 +MLX5_CMD_OP_DISABLE_HCA = 0x105 +MLX5_CMD_OP_QUERY_PAGES = 0x107 +MLX5_CMD_OP_MANAGE_PAGES = 0x108 +MLX5_CMD_OP_SET_HCA_CAP = 0x109 +MLX5_CMD_OP_QUERY_ISSI = 0x10a +MLX5_CMD_OP_SET_ISSI = 0x10b +MLX5_CMD_OP_SET_DRIVER_VERSION = 0x10d +MLX5_CMD_OP_CREATE_MKEY = 0x200 +MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS = 0x203 +MLX5_CMD_OP_CREATE_EQ = 0x301 +MLX5_CMD_OP_DESTROY_EQ = 0x302 +MLX5_CMD_OP_CREATE_CQ = 0x400 +MLX5_CMD_OP_DESTROY_CQ = 0x401 +MLX5_CMD_OP_CREATE_QP = 0x500 +MLX5_CMD_OP_DESTROY_QP = 0x501 +MLX5_CMD_OP_RST2INIT_QP = 0x502 +MLX5_CMD_OP_INIT2RTR_QP = 0x503 +MLX5_CMD_OP_RTR2RTS_QP = 0x504 +MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT = 0x754 +MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT = 0x755 +MLX5_CMD_OP_SET_ROCE_ADDRESS = 0x761 +MLX5_CMD_OP_ALLOC_PD = 0x800 +MLX5_CMD_OP_ALLOC_UAR = 0x802 +MLX5_CMD_OP_ACCESS_REG = 0x805 +MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN = 0x816 +MLX5_CMD_STAT_OK = 0x0 +MLX5_CMD_STAT_INT_ERR = 0x1 +MLX5_CMD_STAT_BAD_OP_ERR = 0x2 +MLX5_CMD_STAT_BAD_PARAM_ERR = 0x3 +MLX5_CMD_STAT_BAD_SYS_STATE_ERR = 0x4 +MLX5_CMD_STAT_BAD_RES_ERR = 0x5 +MLX5_CMD_STAT_RES_BUSY = 0x6 +MLX5_CMD_STAT_LIM_ERR = 0x8 +MLX5_CMD_STAT_BAD_RES_STATE_ERR = 0x9 +MLX5_CMD_STAT_NO_RES_ERR = 0xf +MLX5_CMD_STAT_BAD_INP_LEN_ERR = 0x50 +MLX5_CMD_STAT_BAD_OUTP_LEN_ERR = 0x51 +MLX5_CAP_GENERAL = 0x0 +MLX5_CAP_ODP = 0x2 +MLX5_CAP_ATOMIC = 0x3 +MLX5_CAP_ROCE = 0x4 +HCA_CAP_OPMOD_GET_MAX = 0 +HCA_CAP_OPMOD_GET_CUR = 1 +MLX5_PAGES_GIVE = 1 +MLX5_PAGES_TAKE = 2 +MLX5_BOOT_PAGES = 1 +MLX5_INIT_PAGES = 2 +MLX5_REG_HOST_ENDIANNESS = 0x7004 +MLX5_REG_DTOR = 0xC00E +MLX5_PCI_CMD_XPORT = 0x07 +MLX5_CMD_DATA_BLOCK_SIZE = 512 +CMD_OWNER_HW = 0x01 +CAP_GEN_ABS_NATIVE_PORT_NUM = 0x007 +CAP_GEN_HCA_CAP_2 = 0x020 +CAP_GEN_EVENT_ON_VHCA_STATE_ALLOCATED = 0x023 +CAP_GEN_EVENT_ON_VHCA_STATE_ACTIVE = 0x024 +CAP_GEN_EVENT_ON_VHCA_STATE_IN_USE = 0x025 +CAP_GEN_EVENT_ON_VHCA_STATE_TEARDOWN_REQUEST = 0x026 +CAP_GEN_LOG_MAX_QP = 0x09B +CAP_GEN_LOG_MAX_CQ = 0x0DB +CAP_GEN_RELEASE_ALL_PAGES = 0x145 +CAP_GEN_CACHE_LINE_128BYTE = 0x164 +CAP_GEN_NUM_PORTS = 0x1B8 +CAP_GEN_PKEY_TABLE_SIZE = 0x190 +CAP_GEN_PCI_SYNC_FOR_FW_UPDATE_EVENT = 0x1F1 +CAP_GEN_CMDIF_CHECKSUM = 0x210 +CAP_GEN_DCT = 0x21A +CAP_GEN_ROCE = 0x21D +CAP_GEN_ATOMIC = 0x21E +CAP_GEN_ODP = 0x227 +CAP_GEN_MKEY_BY_NAME = 0x266 +CAP_GEN_LOG_MAX_PD = 0x32B +CAP_GEN_PCIE_RESET_USING_HOTRESET = 0x335 +CAP_GEN_PCI_SYNC_FOR_FW_UPDATE_WITH_DRIVER_UNLOAD = 0x336 +CAP_GEN_VHCA_STATE = 0x3EA +CAP_GEN_ROCE_RW_SUPPORTED = 0x3A1 +CAP_GEN_LOG_MAX_CURRENT_UC_LIST = 0x3FB +CAP_GEN_LOG_UAR_PAGE_SZ = 0x490 +CAP_GEN_NUM_VHCA_PORTS = 0x610 +CAP_GEN_SW_OWNER_ID = 0x61E +CAP_GEN_NUM_TOTAL_DYNAMIC_VF_MSIX = 0x708 +MLX5_FC_BULK_SIZE_FACTOR = 128 +MLX5_FC_BULK_NUM_FCS = lambda fc_enum: (MLX5_FC_BULK_SIZE_FACTOR * (fc_enum)) # type: ignore +MLX5_FT_MAX_MULTIPATH_LEVEL = 63 +MLX5_CMD_SET_MONITOR_NUM_PPCNT_COUNTER_SET1 = (6) +MLX5_CMD_SET_MONITOR_NUM_Q_COUNTERS_SET1 = (1) +MLX5_CMD_SET_MONITOR_NUM_COUNTER = (MLX5_CMD_SET_MONITOR_NUM_PPCNT_COUNTER_SET1 + MLX5_CMD_SET_MONITOR_NUM_Q_COUNTERS_SET1) +MLX5_IFC_DEFINER_FORMAT_OFFSET_UNUSED = 0x0 +MLX5_IFC_DEFINER_FORMAT_OFFSET_OUTER_ETH_PKT_LEN = 0x48 +MLX5_IFC_DEFINER_DW_SELECTORS_NUM = 9 +MLX5_IFC_DEFINER_BYTE_SELECTORS_NUM = 8 +MLX5_MACSEC_ASO_INC_SN = 0x2 +MLX5_MACSEC_ASO_REG_C_4_5 = 0x2 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv.py new file mode 100644 index 000000000..6fb82400d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv.py @@ -0,0 +1,4929 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class MCTP_HEADER(c.Struct): + SIZE = 7 + constBlob: int + msgType: int + vendorId: int +NvU32: TypeAlias = ctypes.c_uint32 +NvU8: TypeAlias = ctypes.c_ubyte +NvU16: TypeAlias = ctypes.c_uint16 +MCTP_HEADER.register_fields([('constBlob', NvU32, 0), ('msgType', NvU8, 4), ('vendorId', NvU16, 5)]) +@c.record +class NVDM_PAYLOAD_COT(c.Struct): + SIZE = 860 + version: int + size: int + gspFmcSysmemOffset: int + frtsSysmemOffset: int + frtsSysmemSize: int + frtsVidmemOffset: int + frtsVidmemSize: int + hash384: c.Array[ctypes.c_uint32, Literal[12]] + publicKey: c.Array[ctypes.c_uint32, Literal[96]] + signature: c.Array[ctypes.c_uint32, Literal[96]] + gspBootArgsSysmemOffset: int +NvU64: TypeAlias = ctypes.c_uint64 +NVDM_PAYLOAD_COT.register_fields([('version', NvU16, 0), ('size', NvU16, 2), ('gspFmcSysmemOffset', NvU64, 4), ('frtsSysmemOffset', NvU64, 12), ('frtsSysmemSize', NvU32, 20), ('frtsVidmemOffset', NvU64, 24), ('frtsVidmemSize', NvU32, 32), ('hash384', c.Array[NvU32, Literal[12]], 36), ('publicKey', c.Array[NvU32, Literal[96]], 84), ('signature', c.Array[NvU32, Literal[96]], 468), ('gspBootArgsSysmemOffset', NvU64, 852)]) +@c.record +class MESSAGE_QUEUE_INIT_ARGUMENTS(c.Struct): + SIZE = 32 + sharedMemPhysAddr: int + pageTableEntryCount: int + cmdQueueOffset: int + statQueueOffset: int +NvLength: TypeAlias = ctypes.c_uint64 +MESSAGE_QUEUE_INIT_ARGUMENTS.register_fields([('sharedMemPhysAddr', NvU64, 0), ('pageTableEntryCount', NvU32, 8), ('cmdQueueOffset', NvLength, 16), ('statQueueOffset', NvLength, 24)]) +@c.record +class GSP_SR_INIT_ARGUMENTS(c.Struct): + SIZE = 12 + oldLevel: int + flags: int + bInPMTransition: int +NvBool: TypeAlias = ctypes.c_ubyte +GSP_SR_INIT_ARGUMENTS.register_fields([('oldLevel', NvU32, 0), ('flags', NvU32, 4), ('bInPMTransition', NvBool, 8)]) +@c.record +class GSP_ARGUMENTS_CACHED(c.Struct): + SIZE = 72 + messageQueueInitArguments: MESSAGE_QUEUE_INIT_ARGUMENTS + srInitArguments: GSP_SR_INIT_ARGUMENTS + gpuInstance: int + bDmemStack: int + profilerArgs: GSP_ARGUMENTS_CACHED_profilerArgs +@c.record +class GSP_ARGUMENTS_CACHED_profilerArgs(c.Struct): + SIZE = 16 + pa: int + size: int +GSP_ARGUMENTS_CACHED_profilerArgs.register_fields([('pa', NvU64, 0), ('size', NvU64, 8)]) +GSP_ARGUMENTS_CACHED.register_fields([('messageQueueInitArguments', MESSAGE_QUEUE_INIT_ARGUMENTS, 0), ('srInitArguments', GSP_SR_INIT_ARGUMENTS, 32), ('gpuInstance', NvU32, 44), ('bDmemStack', NvBool, 48), ('profilerArgs', GSP_ARGUMENTS_CACHED_profilerArgs, 56)]) +GSP_DMA_TARGET: dict[int, str] = {(GSP_DMA_TARGET_LOCAL_FB:=0): 'GSP_DMA_TARGET_LOCAL_FB', (GSP_DMA_TARGET_COHERENT_SYSTEM:=1): 'GSP_DMA_TARGET_COHERENT_SYSTEM', (GSP_DMA_TARGET_NONCOHERENT_SYSTEM:=2): 'GSP_DMA_TARGET_NONCOHERENT_SYSTEM', (GSP_DMA_TARGET_COUNT:=3): 'GSP_DMA_TARGET_COUNT'} +@c.record +class struct_GSP_FMC_INIT_PARAMS(c.Struct): + SIZE = 4 + regkeys: int +struct_GSP_FMC_INIT_PARAMS.register_fields([('regkeys', NvU32, 0)]) +GSP_FMC_INIT_PARAMS: TypeAlias = struct_GSP_FMC_INIT_PARAMS +@c.record +class struct_GSP_ACR_BOOT_GSP_RM_PARAMS(c.Struct): + SIZE = 32 + target: int + gspRmDescSize: int + gspRmDescOffset: int + wprCarveoutOffset: int + wprCarveoutSize: int + bIsGspRmBoot: int +struct_GSP_ACR_BOOT_GSP_RM_PARAMS.register_fields([('target', ctypes.c_uint32, 0), ('gspRmDescSize', NvU32, 4), ('gspRmDescOffset', NvU64, 8), ('wprCarveoutOffset', NvU64, 16), ('wprCarveoutSize', NvU32, 24), ('bIsGspRmBoot', NvBool, 28)]) +GSP_ACR_BOOT_GSP_RM_PARAMS: TypeAlias = struct_GSP_ACR_BOOT_GSP_RM_PARAMS +@c.record +class struct_GSP_RM_PARAMS(c.Struct): + SIZE = 16 + target: int + bootArgsOffset: int +struct_GSP_RM_PARAMS.register_fields([('target', ctypes.c_uint32, 0), ('bootArgsOffset', NvU64, 8)]) +GSP_RM_PARAMS: TypeAlias = struct_GSP_RM_PARAMS +@c.record +class struct_GSP_SPDM_PARAMS(c.Struct): + SIZE = 24 + target: int + payloadBufferOffset: int + payloadBufferSize: int +struct_GSP_SPDM_PARAMS.register_fields([('target', ctypes.c_uint32, 0), ('payloadBufferOffset', NvU64, 8), ('payloadBufferSize', NvU32, 16)]) +GSP_SPDM_PARAMS: TypeAlias = struct_GSP_SPDM_PARAMS +@c.record +class struct_GSP_FMC_BOOT_PARAMS(c.Struct): + SIZE = 80 + initParams: struct_GSP_FMC_INIT_PARAMS + bootGspRmParams: struct_GSP_ACR_BOOT_GSP_RM_PARAMS + gspRmParams: struct_GSP_RM_PARAMS + gspSpdmParams: struct_GSP_SPDM_PARAMS +struct_GSP_FMC_BOOT_PARAMS.register_fields([('initParams', GSP_FMC_INIT_PARAMS, 0), ('bootGspRmParams', GSP_ACR_BOOT_GSP_RM_PARAMS, 8), ('gspRmParams', GSP_RM_PARAMS, 40), ('gspSpdmParams', GSP_SPDM_PARAMS, 56)]) +GSP_FMC_BOOT_PARAMS: TypeAlias = struct_GSP_FMC_BOOT_PARAMS +@c.record +class GspFwWprMeta(c.Struct): + SIZE = 256 + magic: int + revision: int + sysmemAddrOfRadix3Elf: int + sizeOfRadix3Elf: int + sysmemAddrOfBootloader: int + sizeOfBootloader: int + bootloaderCodeOffset: int + bootloaderDataOffset: int + bootloaderManifestOffset: int + sysmemAddrOfSignature: int + sizeOfSignature: int + gspFwHeapFreeListWprOffset: int + unused0: int + unused1: int + gspFwRsvdStart: int + nonWprHeapOffset: int + nonWprHeapSize: int + gspFwWprStart: int + gspFwHeapOffset: int + gspFwHeapSize: int + gspFwOffset: int + bootBinOffset: int + frtsOffset: int + frtsSize: int + gspFwWprEnd: int + fbSize: int + vgaWorkspaceOffset: int + vgaWorkspaceSize: int + bootCount: int + partitionRpcAddr: int + partitionRpcRequestOffset: int + partitionRpcReplyOffset: int + elfCodeOffset: int + elfDataOffset: int + elfCodeSize: int + elfDataSize: int + lsUcodeVersion: int + partitionRpcPadding: c.Array[ctypes.c_uint32, Literal[4]] + sysmemAddrOfCrashReportQueue: int + sizeOfCrashReportQueue: int + lsUcodeVersionPadding: c.Array[ctypes.c_uint32, Literal[1]] + gspFwHeapVfPartitionCount: int + flags: int + padding: c.Array[ctypes.c_ubyte, Literal[2]] + pmuReservedSize: int + verified: int +GspFwWprMeta.register_fields([('magic', NvU64, 0), ('revision', NvU64, 8), ('sysmemAddrOfRadix3Elf', NvU64, 16), ('sizeOfRadix3Elf', NvU64, 24), ('sysmemAddrOfBootloader', NvU64, 32), ('sizeOfBootloader', NvU64, 40), ('bootloaderCodeOffset', NvU64, 48), ('bootloaderDataOffset', NvU64, 56), ('bootloaderManifestOffset', NvU64, 64), ('sysmemAddrOfSignature', NvU64, 72), ('sizeOfSignature', NvU64, 80), ('gspFwHeapFreeListWprOffset', NvU32, 72), ('unused0', NvU32, 76), ('unused1', NvU64, 80), ('gspFwRsvdStart', NvU64, 88), ('nonWprHeapOffset', NvU64, 96), ('nonWprHeapSize', NvU64, 104), ('gspFwWprStart', NvU64, 112), ('gspFwHeapOffset', NvU64, 120), ('gspFwHeapSize', NvU64, 128), ('gspFwOffset', NvU64, 136), ('bootBinOffset', NvU64, 144), ('frtsOffset', NvU64, 152), ('frtsSize', NvU64, 160), ('gspFwWprEnd', NvU64, 168), ('fbSize', NvU64, 176), ('vgaWorkspaceOffset', NvU64, 184), ('vgaWorkspaceSize', NvU64, 192), ('bootCount', NvU64, 200), ('partitionRpcAddr', NvU64, 208), ('partitionRpcRequestOffset', NvU16, 216), ('partitionRpcReplyOffset', NvU16, 218), ('elfCodeOffset', NvU32, 220), ('elfDataOffset', NvU32, 224), ('elfCodeSize', NvU32, 228), ('elfDataSize', NvU32, 232), ('lsUcodeVersion', NvU32, 236), ('partitionRpcPadding', c.Array[NvU32, Literal[4]], 208), ('sysmemAddrOfCrashReportQueue', NvU64, 224), ('sizeOfCrashReportQueue', NvU32, 232), ('lsUcodeVersionPadding', c.Array[NvU32, Literal[1]], 236), ('gspFwHeapVfPartitionCount', NvU8, 240), ('flags', NvU8, 241), ('padding', c.Array[NvU8, Literal[2]], 242), ('pmuReservedSize', NvU32, 244), ('verified', NvU64, 248)]) +@c.record +class GspFwHeapFreeRegion(c.Struct): + SIZE = 8 + offs: int + length: int +GspFwHeapFreeRegion.register_fields([('offs', NvU32, 0), ('length', NvU32, 4)]) +@c.record +class GspFwHeapFreeList(c.Struct): + SIZE = 1040 + magic: int + nregions: int + regions: c.Array[GspFwHeapFreeRegion, Literal[128]] +GspFwHeapFreeList.register_fields([('magic', NvU64, 0), ('nregions', NvU32, 8), ('regions', c.Array[GspFwHeapFreeRegion, Literal[128]], 12)]) +@c.record +class GspFwSRMeta(c.Struct): + SIZE = 256 + magic: int + revision: int + sysmemAddrOfSuspendResumeData: int + sizeOfSuspendResumeData: int + internal: c.Array[ctypes.c_uint32, Literal[32]] + flags: int + subrevision: int + padding: c.Array[ctypes.c_uint32, Literal[22]] +GspFwSRMeta.register_fields([('magic', NvU64, 0), ('revision', NvU64, 8), ('sysmemAddrOfSuspendResumeData', NvU64, 16), ('sizeOfSuspendResumeData', NvU64, 24), ('internal', c.Array[NvU32, Literal[32]], 32), ('flags', NvU32, 160), ('subrevision', NvU32, 164), ('padding', c.Array[NvU32, Literal[22]], 168)]) +@c.record +class RM_RISCV_UCODE_DESC(c.Struct): + SIZE = 84 + version: int + bootloaderOffset: int + bootloaderSize: int + bootloaderParamOffset: int + bootloaderParamSize: int + riscvElfOffset: int + riscvElfSize: int + appVersion: int + manifestOffset: int + manifestSize: int + monitorDataOffset: int + monitorDataSize: int + monitorCodeOffset: int + monitorCodeSize: int + bIsMonitorEnabled: int + swbromCodeOffset: int + swbromCodeSize: int + swbromDataOffset: int + swbromDataSize: int + fbReservedSize: int + bSignedAsCode: int +RM_RISCV_UCODE_DESC.register_fields([('version', NvU32, 0), ('bootloaderOffset', NvU32, 4), ('bootloaderSize', NvU32, 8), ('bootloaderParamOffset', NvU32, 12), ('bootloaderParamSize', NvU32, 16), ('riscvElfOffset', NvU32, 20), ('riscvElfSize', NvU32, 24), ('appVersion', NvU32, 28), ('manifestOffset', NvU32, 32), ('manifestSize', NvU32, 36), ('monitorDataOffset', NvU32, 40), ('monitorDataSize', NvU32, 44), ('monitorCodeOffset', NvU32, 48), ('monitorCodeSize', NvU32, 52), ('bIsMonitorEnabled', NvU32, 56), ('swbromCodeOffset', NvU32, 60), ('swbromCodeSize', NvU32, 64), ('swbromDataOffset', NvU32, 68), ('swbromDataSize', NvU32, 72), ('fbReservedSize', NvU32, 76), ('bSignedAsCode', NvU32, 80)]) +RPC_GR_BUFFER_TYPE: dict[int, str] = {(RPC_GR_BUFFER_TYPE_GRAPHICS:=0): 'RPC_GR_BUFFER_TYPE_GRAPHICS', (RPC_GR_BUFFER_TYPE_GRAPHICS_ZCULL:=1): 'RPC_GR_BUFFER_TYPE_GRAPHICS_ZCULL', (RPC_GR_BUFFER_TYPE_GRAPHICS_GRAPHICS_PM:=2): 'RPC_GR_BUFFER_TYPE_GRAPHICS_GRAPHICS_PM', (RPC_GR_BUFFER_TYPE_COMPUTE_PREEMPT:=3): 'RPC_GR_BUFFER_TYPE_COMPUTE_PREEMPT', (RPC_GR_BUFFER_TYPE_GRAPHICS_PATCH:=4): 'RPC_GR_BUFFER_TYPE_GRAPHICS_PATCH', (RPC_GR_BUFFER_TYPE_GRAPHICS_BUNDLE_CB:=5): 'RPC_GR_BUFFER_TYPE_GRAPHICS_BUNDLE_CB', (RPC_GR_BUFFER_TYPE_GRAPHICS_PAGEPOOL_GLOBAL:=6): 'RPC_GR_BUFFER_TYPE_GRAPHICS_PAGEPOOL_GLOBAL', (RPC_GR_BUFFER_TYPE_GRAPHICS_ATTRIBUTE_CB:=7): 'RPC_GR_BUFFER_TYPE_GRAPHICS_ATTRIBUTE_CB', (RPC_GR_BUFFER_TYPE_GRAPHICS_RTV_CB_GLOBAL:=8): 'RPC_GR_BUFFER_TYPE_GRAPHICS_RTV_CB_GLOBAL', (RPC_GR_BUFFER_TYPE_GRAPHICS_GFXP_POOL:=9): 'RPC_GR_BUFFER_TYPE_GRAPHICS_GFXP_POOL', (RPC_GR_BUFFER_TYPE_GRAPHICS_GFXP_CTRL_BLK:=10): 'RPC_GR_BUFFER_TYPE_GRAPHICS_GFXP_CTRL_BLK', (RPC_GR_BUFFER_TYPE_GRAPHICS_FECS_EVENT:=11): 'RPC_GR_BUFFER_TYPE_GRAPHICS_FECS_EVENT', (RPC_GR_BUFFER_TYPE_GRAPHICS_PRIV_ACCESS_MAP:=12): 'RPC_GR_BUFFER_TYPE_GRAPHICS_PRIV_ACCESS_MAP', (RPC_GR_BUFFER_TYPE_GRAPHICS_MAX:=13): 'RPC_GR_BUFFER_TYPE_GRAPHICS_MAX'} +FECS_ERROR_EVENT_TYPE: dict[int, str] = {(FECS_ERROR_EVENT_TYPE_NONE:=0): 'FECS_ERROR_EVENT_TYPE_NONE', (FECS_ERROR_EVENT_TYPE_BUFFER_RESET_REQUIRED:=1): 'FECS_ERROR_EVENT_TYPE_BUFFER_RESET_REQUIRED', (FECS_ERROR_EVENT_TYPE_BUFFER_FULL:=2): 'FECS_ERROR_EVENT_TYPE_BUFFER_FULL', (FECS_ERROR_EVENT_TYPE_MAX:=3): 'FECS_ERROR_EVENT_TYPE_MAX'} +NV_RPC_UPDATE_PDE_BAR_TYPE: dict[int, str] = {(NV_RPC_UPDATE_PDE_BAR_1:=0): 'NV_RPC_UPDATE_PDE_BAR_1', (NV_RPC_UPDATE_PDE_BAR_2:=1): 'NV_RPC_UPDATE_PDE_BAR_2', (NV_RPC_UPDATE_PDE_BAR_INVALID:=2): 'NV_RPC_UPDATE_PDE_BAR_INVALID'} +@c.record +class struct_VIRTUAL_DISPLAY_GET_MAX_RESOLUTION_PARAMS(c.Struct): + SIZE = 12 + headIndex: int + maxHResolution: int + maxVResolution: int +struct_VIRTUAL_DISPLAY_GET_MAX_RESOLUTION_PARAMS.register_fields([('headIndex', NvU32, 0), ('maxHResolution', NvU32, 4), ('maxVResolution', NvU32, 8)]) +VIRTUAL_DISPLAY_GET_MAX_RESOLUTION_PARAMS: TypeAlias = struct_VIRTUAL_DISPLAY_GET_MAX_RESOLUTION_PARAMS +@c.record +class struct_VIRTUAL_DISPLAY_GET_NUM_HEADS_PARAMS(c.Struct): + SIZE = 8 + numHeads: int + maxNumHeads: int +struct_VIRTUAL_DISPLAY_GET_NUM_HEADS_PARAMS.register_fields([('numHeads', NvU32, 0), ('maxNumHeads', NvU32, 4)]) +VIRTUAL_DISPLAY_GET_NUM_HEADS_PARAMS: TypeAlias = struct_VIRTUAL_DISPLAY_GET_NUM_HEADS_PARAMS +GPU_RECOVERY_EVENT_TYPE: dict[int, str] = {(GPU_RECOVERY_EVENT_TYPE_REFRESH:=0): 'GPU_RECOVERY_EVENT_TYPE_REFRESH', (GPU_RECOVERY_EVENT_TYPE_GPU_DRAIN_P2P:=1): 'GPU_RECOVERY_EVENT_TYPE_GPU_DRAIN_P2P', (GPU_RECOVERY_EVENT_TYPE_SYS_REBOOT:=2): 'GPU_RECOVERY_EVENT_TYPE_SYS_REBOOT'} +rpc_fns: dict[int, str] = {(NV_VGPU_MSG_FUNCTION_NOP:=0): 'NV_VGPU_MSG_FUNCTION_NOP', (NV_VGPU_MSG_FUNCTION_SET_GUEST_SYSTEM_INFO:=1): 'NV_VGPU_MSG_FUNCTION_SET_GUEST_SYSTEM_INFO', (NV_VGPU_MSG_FUNCTION_ALLOC_ROOT:=2): 'NV_VGPU_MSG_FUNCTION_ALLOC_ROOT', (NV_VGPU_MSG_FUNCTION_ALLOC_DEVICE:=3): 'NV_VGPU_MSG_FUNCTION_ALLOC_DEVICE', (NV_VGPU_MSG_FUNCTION_ALLOC_MEMORY:=4): 'NV_VGPU_MSG_FUNCTION_ALLOC_MEMORY', (NV_VGPU_MSG_FUNCTION_ALLOC_CTX_DMA:=5): 'NV_VGPU_MSG_FUNCTION_ALLOC_CTX_DMA', (NV_VGPU_MSG_FUNCTION_ALLOC_CHANNEL_DMA:=6): 'NV_VGPU_MSG_FUNCTION_ALLOC_CHANNEL_DMA', (NV_VGPU_MSG_FUNCTION_MAP_MEMORY:=7): 'NV_VGPU_MSG_FUNCTION_MAP_MEMORY', (NV_VGPU_MSG_FUNCTION_BIND_CTX_DMA:=8): 'NV_VGPU_MSG_FUNCTION_BIND_CTX_DMA', (NV_VGPU_MSG_FUNCTION_ALLOC_OBJECT:=9): 'NV_VGPU_MSG_FUNCTION_ALLOC_OBJECT', (NV_VGPU_MSG_FUNCTION_FREE:=10): 'NV_VGPU_MSG_FUNCTION_FREE', (NV_VGPU_MSG_FUNCTION_LOG:=11): 'NV_VGPU_MSG_FUNCTION_LOG', (NV_VGPU_MSG_FUNCTION_ALLOC_VIDMEM:=12): 'NV_VGPU_MSG_FUNCTION_ALLOC_VIDMEM', (NV_VGPU_MSG_FUNCTION_UNMAP_MEMORY:=13): 'NV_VGPU_MSG_FUNCTION_UNMAP_MEMORY', (NV_VGPU_MSG_FUNCTION_MAP_MEMORY_DMA:=14): 'NV_VGPU_MSG_FUNCTION_MAP_MEMORY_DMA', (NV_VGPU_MSG_FUNCTION_UNMAP_MEMORY_DMA:=15): 'NV_VGPU_MSG_FUNCTION_UNMAP_MEMORY_DMA', (NV_VGPU_MSG_FUNCTION_GET_EDID:=16): 'NV_VGPU_MSG_FUNCTION_GET_EDID', (NV_VGPU_MSG_FUNCTION_ALLOC_DISP_CHANNEL:=17): 'NV_VGPU_MSG_FUNCTION_ALLOC_DISP_CHANNEL', (NV_VGPU_MSG_FUNCTION_ALLOC_DISP_OBJECT:=18): 'NV_VGPU_MSG_FUNCTION_ALLOC_DISP_OBJECT', (NV_VGPU_MSG_FUNCTION_ALLOC_SUBDEVICE:=19): 'NV_VGPU_MSG_FUNCTION_ALLOC_SUBDEVICE', (NV_VGPU_MSG_FUNCTION_ALLOC_DYNAMIC_MEMORY:=20): 'NV_VGPU_MSG_FUNCTION_ALLOC_DYNAMIC_MEMORY', (NV_VGPU_MSG_FUNCTION_DUP_OBJECT:=21): 'NV_VGPU_MSG_FUNCTION_DUP_OBJECT', (NV_VGPU_MSG_FUNCTION_IDLE_CHANNELS:=22): 'NV_VGPU_MSG_FUNCTION_IDLE_CHANNELS', (NV_VGPU_MSG_FUNCTION_ALLOC_EVENT:=23): 'NV_VGPU_MSG_FUNCTION_ALLOC_EVENT', (NV_VGPU_MSG_FUNCTION_SEND_EVENT:=24): 'NV_VGPU_MSG_FUNCTION_SEND_EVENT', (NV_VGPU_MSG_FUNCTION_REMAPPER_CONTROL:=25): 'NV_VGPU_MSG_FUNCTION_REMAPPER_CONTROL', (NV_VGPU_MSG_FUNCTION_DMA_CONTROL:=26): 'NV_VGPU_MSG_FUNCTION_DMA_CONTROL', (NV_VGPU_MSG_FUNCTION_DMA_FILL_PTE_MEM:=27): 'NV_VGPU_MSG_FUNCTION_DMA_FILL_PTE_MEM', (NV_VGPU_MSG_FUNCTION_MANAGE_HW_RESOURCE:=28): 'NV_VGPU_MSG_FUNCTION_MANAGE_HW_RESOURCE', (NV_VGPU_MSG_FUNCTION_BIND_ARBITRARY_CTX_DMA:=29): 'NV_VGPU_MSG_FUNCTION_BIND_ARBITRARY_CTX_DMA', (NV_VGPU_MSG_FUNCTION_CREATE_FB_SEGMENT:=30): 'NV_VGPU_MSG_FUNCTION_CREATE_FB_SEGMENT', (NV_VGPU_MSG_FUNCTION_DESTROY_FB_SEGMENT:=31): 'NV_VGPU_MSG_FUNCTION_DESTROY_FB_SEGMENT', (NV_VGPU_MSG_FUNCTION_ALLOC_SHARE_DEVICE:=32): 'NV_VGPU_MSG_FUNCTION_ALLOC_SHARE_DEVICE', (NV_VGPU_MSG_FUNCTION_DEFERRED_API_CONTROL:=33): 'NV_VGPU_MSG_FUNCTION_DEFERRED_API_CONTROL', (NV_VGPU_MSG_FUNCTION_REMOVE_DEFERRED_API:=34): 'NV_VGPU_MSG_FUNCTION_REMOVE_DEFERRED_API', (NV_VGPU_MSG_FUNCTION_SIM_ESCAPE_READ:=35): 'NV_VGPU_MSG_FUNCTION_SIM_ESCAPE_READ', (NV_VGPU_MSG_FUNCTION_SIM_ESCAPE_WRITE:=36): 'NV_VGPU_MSG_FUNCTION_SIM_ESCAPE_WRITE', (NV_VGPU_MSG_FUNCTION_SIM_MANAGE_DISPLAY_CONTEXT_DMA:=37): 'NV_VGPU_MSG_FUNCTION_SIM_MANAGE_DISPLAY_CONTEXT_DMA', (NV_VGPU_MSG_FUNCTION_FREE_VIDMEM_VIRT:=38): 'NV_VGPU_MSG_FUNCTION_FREE_VIDMEM_VIRT', (NV_VGPU_MSG_FUNCTION_PERF_GET_PSTATE_INFO:=39): 'NV_VGPU_MSG_FUNCTION_PERF_GET_PSTATE_INFO', (NV_VGPU_MSG_FUNCTION_PERF_GET_PERFMON_SAMPLE:=40): 'NV_VGPU_MSG_FUNCTION_PERF_GET_PERFMON_SAMPLE', (NV_VGPU_MSG_FUNCTION_PERF_GET_VIRTUAL_PSTATE_INFO:=41): 'NV_VGPU_MSG_FUNCTION_PERF_GET_VIRTUAL_PSTATE_INFO', (NV_VGPU_MSG_FUNCTION_PERF_GET_LEVEL_INFO:=42): 'NV_VGPU_MSG_FUNCTION_PERF_GET_LEVEL_INFO', (NV_VGPU_MSG_FUNCTION_MAP_SEMA_MEMORY:=43): 'NV_VGPU_MSG_FUNCTION_MAP_SEMA_MEMORY', (NV_VGPU_MSG_FUNCTION_UNMAP_SEMA_MEMORY:=44): 'NV_VGPU_MSG_FUNCTION_UNMAP_SEMA_MEMORY', (NV_VGPU_MSG_FUNCTION_SET_SURFACE_PROPERTIES:=45): 'NV_VGPU_MSG_FUNCTION_SET_SURFACE_PROPERTIES', (NV_VGPU_MSG_FUNCTION_CLEANUP_SURFACE:=46): 'NV_VGPU_MSG_FUNCTION_CLEANUP_SURFACE', (NV_VGPU_MSG_FUNCTION_UNLOADING_GUEST_DRIVER:=47): 'NV_VGPU_MSG_FUNCTION_UNLOADING_GUEST_DRIVER', (NV_VGPU_MSG_FUNCTION_TDR_SET_TIMEOUT_STATE:=48): 'NV_VGPU_MSG_FUNCTION_TDR_SET_TIMEOUT_STATE', (NV_VGPU_MSG_FUNCTION_SWITCH_TO_VGA:=49): 'NV_VGPU_MSG_FUNCTION_SWITCH_TO_VGA', (NV_VGPU_MSG_FUNCTION_GPU_EXEC_REG_OPS:=50): 'NV_VGPU_MSG_FUNCTION_GPU_EXEC_REG_OPS', (NV_VGPU_MSG_FUNCTION_GET_STATIC_INFO:=51): 'NV_VGPU_MSG_FUNCTION_GET_STATIC_INFO', (NV_VGPU_MSG_FUNCTION_ALLOC_VIRTMEM:=52): 'NV_VGPU_MSG_FUNCTION_ALLOC_VIRTMEM', (NV_VGPU_MSG_FUNCTION_UPDATE_PDE_2:=53): 'NV_VGPU_MSG_FUNCTION_UPDATE_PDE_2', (NV_VGPU_MSG_FUNCTION_SET_PAGE_DIRECTORY:=54): 'NV_VGPU_MSG_FUNCTION_SET_PAGE_DIRECTORY', (NV_VGPU_MSG_FUNCTION_GET_STATIC_PSTATE_INFO:=55): 'NV_VGPU_MSG_FUNCTION_GET_STATIC_PSTATE_INFO', (NV_VGPU_MSG_FUNCTION_TRANSLATE_GUEST_GPU_PTES:=56): 'NV_VGPU_MSG_FUNCTION_TRANSLATE_GUEST_GPU_PTES', (NV_VGPU_MSG_FUNCTION_RESERVED_57:=57): 'NV_VGPU_MSG_FUNCTION_RESERVED_57', (NV_VGPU_MSG_FUNCTION_RESET_CURRENT_GR_CONTEXT:=58): 'NV_VGPU_MSG_FUNCTION_RESET_CURRENT_GR_CONTEXT', (NV_VGPU_MSG_FUNCTION_SET_SEMA_MEM_VALIDATION_STATE:=59): 'NV_VGPU_MSG_FUNCTION_SET_SEMA_MEM_VALIDATION_STATE', (NV_VGPU_MSG_FUNCTION_GET_ENGINE_UTILIZATION:=60): 'NV_VGPU_MSG_FUNCTION_GET_ENGINE_UTILIZATION', (NV_VGPU_MSG_FUNCTION_UPDATE_GPU_PDES:=61): 'NV_VGPU_MSG_FUNCTION_UPDATE_GPU_PDES', (NV_VGPU_MSG_FUNCTION_GET_ENCODER_CAPACITY:=62): 'NV_VGPU_MSG_FUNCTION_GET_ENCODER_CAPACITY', (NV_VGPU_MSG_FUNCTION_VGPU_PF_REG_READ32:=63): 'NV_VGPU_MSG_FUNCTION_VGPU_PF_REG_READ32', (NV_VGPU_MSG_FUNCTION_SET_GUEST_SYSTEM_INFO_EXT:=64): 'NV_VGPU_MSG_FUNCTION_SET_GUEST_SYSTEM_INFO_EXT', (NV_VGPU_MSG_FUNCTION_GET_GSP_STATIC_INFO:=65): 'NV_VGPU_MSG_FUNCTION_GET_GSP_STATIC_INFO', (NV_VGPU_MSG_FUNCTION_RMFS_INIT:=66): 'NV_VGPU_MSG_FUNCTION_RMFS_INIT', (NV_VGPU_MSG_FUNCTION_RMFS_CLOSE_QUEUE:=67): 'NV_VGPU_MSG_FUNCTION_RMFS_CLOSE_QUEUE', (NV_VGPU_MSG_FUNCTION_RMFS_CLEANUP:=68): 'NV_VGPU_MSG_FUNCTION_RMFS_CLEANUP', (NV_VGPU_MSG_FUNCTION_RMFS_TEST:=69): 'NV_VGPU_MSG_FUNCTION_RMFS_TEST', (NV_VGPU_MSG_FUNCTION_UPDATE_BAR_PDE:=70): 'NV_VGPU_MSG_FUNCTION_UPDATE_BAR_PDE', (NV_VGPU_MSG_FUNCTION_CONTINUATION_RECORD:=71): 'NV_VGPU_MSG_FUNCTION_CONTINUATION_RECORD', (NV_VGPU_MSG_FUNCTION_GSP_SET_SYSTEM_INFO:=72): 'NV_VGPU_MSG_FUNCTION_GSP_SET_SYSTEM_INFO', (NV_VGPU_MSG_FUNCTION_SET_REGISTRY:=73): 'NV_VGPU_MSG_FUNCTION_SET_REGISTRY', (NV_VGPU_MSG_FUNCTION_GSP_INIT_POST_OBJGPU:=74): 'NV_VGPU_MSG_FUNCTION_GSP_INIT_POST_OBJGPU', (NV_VGPU_MSG_FUNCTION_SUBDEV_EVENT_SET_NOTIFICATION:=75): 'NV_VGPU_MSG_FUNCTION_SUBDEV_EVENT_SET_NOTIFICATION', (NV_VGPU_MSG_FUNCTION_GSP_RM_CONTROL:=76): 'NV_VGPU_MSG_FUNCTION_GSP_RM_CONTROL', (NV_VGPU_MSG_FUNCTION_GET_STATIC_INFO2:=77): 'NV_VGPU_MSG_FUNCTION_GET_STATIC_INFO2', (NV_VGPU_MSG_FUNCTION_DUMP_PROTOBUF_COMPONENT:=78): 'NV_VGPU_MSG_FUNCTION_DUMP_PROTOBUF_COMPONENT', (NV_VGPU_MSG_FUNCTION_UNSET_PAGE_DIRECTORY:=79): 'NV_VGPU_MSG_FUNCTION_UNSET_PAGE_DIRECTORY', (NV_VGPU_MSG_FUNCTION_GET_CONSOLIDATED_STATIC_INFO:=80): 'NV_VGPU_MSG_FUNCTION_GET_CONSOLIDATED_STATIC_INFO', (NV_VGPU_MSG_FUNCTION_GMMU_REGISTER_FAULT_BUFFER:=81): 'NV_VGPU_MSG_FUNCTION_GMMU_REGISTER_FAULT_BUFFER', (NV_VGPU_MSG_FUNCTION_GMMU_UNREGISTER_FAULT_BUFFER:=82): 'NV_VGPU_MSG_FUNCTION_GMMU_UNREGISTER_FAULT_BUFFER', (NV_VGPU_MSG_FUNCTION_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER:=83): 'NV_VGPU_MSG_FUNCTION_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER', (NV_VGPU_MSG_FUNCTION_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER:=84): 'NV_VGPU_MSG_FUNCTION_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER', (NV_VGPU_MSG_FUNCTION_CTRL_SET_VGPU_FB_USAGE:=85): 'NV_VGPU_MSG_FUNCTION_CTRL_SET_VGPU_FB_USAGE', (NV_VGPU_MSG_FUNCTION_CTRL_NVFBC_SW_SESSION_UPDATE_INFO:=86): 'NV_VGPU_MSG_FUNCTION_CTRL_NVFBC_SW_SESSION_UPDATE_INFO', (NV_VGPU_MSG_FUNCTION_CTRL_NVENC_SW_SESSION_UPDATE_INFO:=87): 'NV_VGPU_MSG_FUNCTION_CTRL_NVENC_SW_SESSION_UPDATE_INFO', (NV_VGPU_MSG_FUNCTION_CTRL_RESET_CHANNEL:=88): 'NV_VGPU_MSG_FUNCTION_CTRL_RESET_CHANNEL', (NV_VGPU_MSG_FUNCTION_CTRL_RESET_ISOLATED_CHANNEL:=89): 'NV_VGPU_MSG_FUNCTION_CTRL_RESET_ISOLATED_CHANNEL', (NV_VGPU_MSG_FUNCTION_CTRL_GPU_HANDLE_VF_PRI_FAULT:=90): 'NV_VGPU_MSG_FUNCTION_CTRL_GPU_HANDLE_VF_PRI_FAULT', (NV_VGPU_MSG_FUNCTION_CTRL_CLK_GET_EXTENDED_INFO:=91): 'NV_VGPU_MSG_FUNCTION_CTRL_CLK_GET_EXTENDED_INFO', (NV_VGPU_MSG_FUNCTION_CTRL_PERF_BOOST:=92): 'NV_VGPU_MSG_FUNCTION_CTRL_PERF_BOOST', (NV_VGPU_MSG_FUNCTION_CTRL_PERF_VPSTATES_GET_CONTROL:=93): 'NV_VGPU_MSG_FUNCTION_CTRL_PERF_VPSTATES_GET_CONTROL', (NV_VGPU_MSG_FUNCTION_CTRL_GET_ZBC_CLEAR_TABLE:=94): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_ZBC_CLEAR_TABLE', (NV_VGPU_MSG_FUNCTION_CTRL_SET_ZBC_COLOR_CLEAR:=95): 'NV_VGPU_MSG_FUNCTION_CTRL_SET_ZBC_COLOR_CLEAR', (NV_VGPU_MSG_FUNCTION_CTRL_SET_ZBC_DEPTH_CLEAR:=96): 'NV_VGPU_MSG_FUNCTION_CTRL_SET_ZBC_DEPTH_CLEAR', (NV_VGPU_MSG_FUNCTION_CTRL_GPFIFO_SCHEDULE:=97): 'NV_VGPU_MSG_FUNCTION_CTRL_GPFIFO_SCHEDULE', (NV_VGPU_MSG_FUNCTION_CTRL_SET_TIMESLICE:=98): 'NV_VGPU_MSG_FUNCTION_CTRL_SET_TIMESLICE', (NV_VGPU_MSG_FUNCTION_CTRL_PREEMPT:=99): 'NV_VGPU_MSG_FUNCTION_CTRL_PREEMPT', (NV_VGPU_MSG_FUNCTION_CTRL_FIFO_DISABLE_CHANNELS:=100): 'NV_VGPU_MSG_FUNCTION_CTRL_FIFO_DISABLE_CHANNELS', (NV_VGPU_MSG_FUNCTION_CTRL_SET_TSG_INTERLEAVE_LEVEL:=101): 'NV_VGPU_MSG_FUNCTION_CTRL_SET_TSG_INTERLEAVE_LEVEL', (NV_VGPU_MSG_FUNCTION_CTRL_SET_CHANNEL_INTERLEAVE_LEVEL:=102): 'NV_VGPU_MSG_FUNCTION_CTRL_SET_CHANNEL_INTERLEAVE_LEVEL', (NV_VGPU_MSG_FUNCTION_GSP_RM_ALLOC:=103): 'NV_VGPU_MSG_FUNCTION_GSP_RM_ALLOC', (NV_VGPU_MSG_FUNCTION_CTRL_GET_P2P_CAPS_V2:=104): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_P2P_CAPS_V2', (NV_VGPU_MSG_FUNCTION_CTRL_CIPHER_AES_ENCRYPT:=105): 'NV_VGPU_MSG_FUNCTION_CTRL_CIPHER_AES_ENCRYPT', (NV_VGPU_MSG_FUNCTION_CTRL_CIPHER_SESSION_KEY:=106): 'NV_VGPU_MSG_FUNCTION_CTRL_CIPHER_SESSION_KEY', (NV_VGPU_MSG_FUNCTION_CTRL_CIPHER_SESSION_KEY_STATUS:=107): 'NV_VGPU_MSG_FUNCTION_CTRL_CIPHER_SESSION_KEY_STATUS', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_CLEAR_ALL_SM_ERROR_STATES:=108): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_CLEAR_ALL_SM_ERROR_STATES', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_READ_ALL_SM_ERROR_STATES:=109): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_READ_ALL_SM_ERROR_STATES', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_EXCEPTION_MASK:=110): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_EXCEPTION_MASK', (NV_VGPU_MSG_FUNCTION_CTRL_GPU_PROMOTE_CTX:=111): 'NV_VGPU_MSG_FUNCTION_CTRL_GPU_PROMOTE_CTX', (NV_VGPU_MSG_FUNCTION_CTRL_GR_CTXSW_PREEMPTION_BIND:=112): 'NV_VGPU_MSG_FUNCTION_CTRL_GR_CTXSW_PREEMPTION_BIND', (NV_VGPU_MSG_FUNCTION_CTRL_GR_SET_CTXSW_PREEMPTION_MODE:=113): 'NV_VGPU_MSG_FUNCTION_CTRL_GR_SET_CTXSW_PREEMPTION_MODE', (NV_VGPU_MSG_FUNCTION_CTRL_GR_CTXSW_ZCULL_BIND:=114): 'NV_VGPU_MSG_FUNCTION_CTRL_GR_CTXSW_ZCULL_BIND', (NV_VGPU_MSG_FUNCTION_CTRL_GPU_INITIALIZE_CTX:=115): 'NV_VGPU_MSG_FUNCTION_CTRL_GPU_INITIALIZE_CTX', (NV_VGPU_MSG_FUNCTION_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES:=116): 'NV_VGPU_MSG_FUNCTION_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES', (NV_VGPU_MSG_FUNCTION_CTRL_FIFO_CLEAR_FAULTED_BIT:=117): 'NV_VGPU_MSG_FUNCTION_CTRL_FIFO_CLEAR_FAULTED_BIT', (NV_VGPU_MSG_FUNCTION_CTRL_GET_LATEST_ECC_ADDRESSES:=118): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_LATEST_ECC_ADDRESSES', (NV_VGPU_MSG_FUNCTION_CTRL_MC_SERVICE_INTERRUPTS:=119): 'NV_VGPU_MSG_FUNCTION_CTRL_MC_SERVICE_INTERRUPTS', (NV_VGPU_MSG_FUNCTION_CTRL_DMA_SET_DEFAULT_VASPACE:=120): 'NV_VGPU_MSG_FUNCTION_CTRL_DMA_SET_DEFAULT_VASPACE', (NV_VGPU_MSG_FUNCTION_CTRL_GET_CE_PCE_MASK:=121): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_CE_PCE_MASK', (NV_VGPU_MSG_FUNCTION_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY:=122): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY', (NV_VGPU_MSG_FUNCTION_CTRL_GET_NVLINK_PEER_ID_MASK:=123): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_NVLINK_PEER_ID_MASK', (NV_VGPU_MSG_FUNCTION_CTRL_GET_NVLINK_STATUS:=124): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_NVLINK_STATUS', (NV_VGPU_MSG_FUNCTION_CTRL_GET_P2P_CAPS:=125): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_P2P_CAPS', (NV_VGPU_MSG_FUNCTION_CTRL_GET_P2P_CAPS_MATRIX:=126): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_P2P_CAPS_MATRIX', (NV_VGPU_MSG_FUNCTION_RESERVED_0:=127): 'NV_VGPU_MSG_FUNCTION_RESERVED_0', (NV_VGPU_MSG_FUNCTION_CTRL_RESERVE_PM_AREA_SMPC:=128): 'NV_VGPU_MSG_FUNCTION_CTRL_RESERVE_PM_AREA_SMPC', (NV_VGPU_MSG_FUNCTION_CTRL_RESERVE_HWPM_LEGACY:=129): 'NV_VGPU_MSG_FUNCTION_CTRL_RESERVE_HWPM_LEGACY', (NV_VGPU_MSG_FUNCTION_CTRL_B0CC_EXEC_REG_OPS:=130): 'NV_VGPU_MSG_FUNCTION_CTRL_B0CC_EXEC_REG_OPS', (NV_VGPU_MSG_FUNCTION_CTRL_BIND_PM_RESOURCES:=131): 'NV_VGPU_MSG_FUNCTION_CTRL_BIND_PM_RESOURCES', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_SUSPEND_CONTEXT:=132): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_SUSPEND_CONTEXT', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_RESUME_CONTEXT:=133): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_RESUME_CONTEXT', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_EXEC_REG_OPS:=134): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_EXEC_REG_OPS', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_MODE_MMU_DEBUG:=135): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_MODE_MMU_DEBUG', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_READ_SINGLE_SM_ERROR_STATE:=136): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_READ_SINGLE_SM_ERROR_STATE', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_CLEAR_SINGLE_SM_ERROR_STATE:=137): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_CLEAR_SINGLE_SM_ERROR_STATE', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_MODE_ERRBAR_DEBUG:=138): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_MODE_ERRBAR_DEBUG', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_NEXT_STOP_TRIGGER_TYPE:=139): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_NEXT_STOP_TRIGGER_TYPE', (NV_VGPU_MSG_FUNCTION_CTRL_ALLOC_PMA_STREAM:=140): 'NV_VGPU_MSG_FUNCTION_CTRL_ALLOC_PMA_STREAM', (NV_VGPU_MSG_FUNCTION_CTRL_PMA_STREAM_UPDATE_GET_PUT:=141): 'NV_VGPU_MSG_FUNCTION_CTRL_PMA_STREAM_UPDATE_GET_PUT', (NV_VGPU_MSG_FUNCTION_CTRL_FB_GET_INFO_V2:=142): 'NV_VGPU_MSG_FUNCTION_CTRL_FB_GET_INFO_V2', (NV_VGPU_MSG_FUNCTION_CTRL_FIFO_SET_CHANNEL_PROPERTIES:=143): 'NV_VGPU_MSG_FUNCTION_CTRL_FIFO_SET_CHANNEL_PROPERTIES', (NV_VGPU_MSG_FUNCTION_CTRL_GR_GET_CTX_BUFFER_INFO:=144): 'NV_VGPU_MSG_FUNCTION_CTRL_GR_GET_CTX_BUFFER_INFO', (NV_VGPU_MSG_FUNCTION_CTRL_KGR_GET_CTX_BUFFER_PTES:=145): 'NV_VGPU_MSG_FUNCTION_CTRL_KGR_GET_CTX_BUFFER_PTES', (NV_VGPU_MSG_FUNCTION_CTRL_GPU_EVICT_CTX:=146): 'NV_VGPU_MSG_FUNCTION_CTRL_GPU_EVICT_CTX', (NV_VGPU_MSG_FUNCTION_CTRL_FB_GET_FS_INFO:=147): 'NV_VGPU_MSG_FUNCTION_CTRL_FB_GET_FS_INFO', (NV_VGPU_MSG_FUNCTION_CTRL_GRMGR_GET_GR_FS_INFO:=148): 'NV_VGPU_MSG_FUNCTION_CTRL_GRMGR_GET_GR_FS_INFO', (NV_VGPU_MSG_FUNCTION_CTRL_STOP_CHANNEL:=149): 'NV_VGPU_MSG_FUNCTION_CTRL_STOP_CHANNEL', (NV_VGPU_MSG_FUNCTION_CTRL_GR_PC_SAMPLING_MODE:=150): 'NV_VGPU_MSG_FUNCTION_CTRL_GR_PC_SAMPLING_MODE', (NV_VGPU_MSG_FUNCTION_CTRL_PERF_RATED_TDP_GET_STATUS:=151): 'NV_VGPU_MSG_FUNCTION_CTRL_PERF_RATED_TDP_GET_STATUS', (NV_VGPU_MSG_FUNCTION_CTRL_PERF_RATED_TDP_SET_CONTROL:=152): 'NV_VGPU_MSG_FUNCTION_CTRL_PERF_RATED_TDP_SET_CONTROL', (NV_VGPU_MSG_FUNCTION_CTRL_FREE_PMA_STREAM:=153): 'NV_VGPU_MSG_FUNCTION_CTRL_FREE_PMA_STREAM', (NV_VGPU_MSG_FUNCTION_CTRL_TIMER_SET_GR_TICK_FREQ:=154): 'NV_VGPU_MSG_FUNCTION_CTRL_TIMER_SET_GR_TICK_FREQ', (NV_VGPU_MSG_FUNCTION_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB:=155): 'NV_VGPU_MSG_FUNCTION_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB', (NV_VGPU_MSG_FUNCTION_GET_CONSOLIDATED_GR_STATIC_INFO:=156): 'NV_VGPU_MSG_FUNCTION_GET_CONSOLIDATED_GR_STATIC_INFO', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_SINGLE_SM_SINGLE_STEP:=157): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_SINGLE_SM_SINGLE_STEP', (NV_VGPU_MSG_FUNCTION_CTRL_GR_GET_TPC_PARTITION_MODE:=158): 'NV_VGPU_MSG_FUNCTION_CTRL_GR_GET_TPC_PARTITION_MODE', (NV_VGPU_MSG_FUNCTION_CTRL_GR_SET_TPC_PARTITION_MODE:=159): 'NV_VGPU_MSG_FUNCTION_CTRL_GR_SET_TPC_PARTITION_MODE', (NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_ALLOCATE:=160): 'NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_ALLOCATE', (NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_DESTROY:=161): 'NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_DESTROY', (NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_MAP:=162): 'NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_MAP', (NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_UNMAP:=163): 'NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_UNMAP', (NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_PUSH_STREAM:=164): 'NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_PUSH_STREAM', (NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_SET_HANDLES:=165): 'NV_VGPU_MSG_FUNCTION_UVM_PAGING_CHANNEL_SET_HANDLES', (NV_VGPU_MSG_FUNCTION_UVM_METHOD_STREAM_GUEST_PAGES_OPERATION:=166): 'NV_VGPU_MSG_FUNCTION_UVM_METHOD_STREAM_GUEST_PAGES_OPERATION', (NV_VGPU_MSG_FUNCTION_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL:=167): 'NV_VGPU_MSG_FUNCTION_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL', (NV_VGPU_MSG_FUNCTION_DCE_RM_INIT:=168): 'NV_VGPU_MSG_FUNCTION_DCE_RM_INIT', (NV_VGPU_MSG_FUNCTION_REGISTER_VIRTUAL_EVENT_BUFFER:=169): 'NV_VGPU_MSG_FUNCTION_REGISTER_VIRTUAL_EVENT_BUFFER', (NV_VGPU_MSG_FUNCTION_CTRL_EVENT_BUFFER_UPDATE_GET:=170): 'NV_VGPU_MSG_FUNCTION_CTRL_EVENT_BUFFER_UPDATE_GET', (NV_VGPU_MSG_FUNCTION_GET_PLCABLE_ADDRESS_KIND:=171): 'NV_VGPU_MSG_FUNCTION_GET_PLCABLE_ADDRESS_KIND', (NV_VGPU_MSG_FUNCTION_CTRL_PERF_LIMITS_SET_STATUS_V2:=172): 'NV_VGPU_MSG_FUNCTION_CTRL_PERF_LIMITS_SET_STATUS_V2', (NV_VGPU_MSG_FUNCTION_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM:=173): 'NV_VGPU_MSG_FUNCTION_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM', (NV_VGPU_MSG_FUNCTION_CTRL_GET_MMU_DEBUG_MODE:=174): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_MMU_DEBUG_MODE', (NV_VGPU_MSG_FUNCTION_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS:=175): 'NV_VGPU_MSG_FUNCTION_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS', (NV_VGPU_MSG_FUNCTION_CTRL_FLCN_GET_CTX_BUFFER_SIZE:=176): 'NV_VGPU_MSG_FUNCTION_CTRL_FLCN_GET_CTX_BUFFER_SIZE', (NV_VGPU_MSG_FUNCTION_CTRL_FLCN_GET_CTX_BUFFER_INFO:=177): 'NV_VGPU_MSG_FUNCTION_CTRL_FLCN_GET_CTX_BUFFER_INFO', (NV_VGPU_MSG_FUNCTION_DISABLE_CHANNELS:=178): 'NV_VGPU_MSG_FUNCTION_DISABLE_CHANNELS', (NV_VGPU_MSG_FUNCTION_CTRL_FABRIC_MEMORY_DESCRIBE:=179): 'NV_VGPU_MSG_FUNCTION_CTRL_FABRIC_MEMORY_DESCRIBE', (NV_VGPU_MSG_FUNCTION_CTRL_FABRIC_MEM_STATS:=180): 'NV_VGPU_MSG_FUNCTION_CTRL_FABRIC_MEM_STATS', (NV_VGPU_MSG_FUNCTION_SAVE_HIBERNATION_DATA:=181): 'NV_VGPU_MSG_FUNCTION_SAVE_HIBERNATION_DATA', (NV_VGPU_MSG_FUNCTION_RESTORE_HIBERNATION_DATA:=182): 'NV_VGPU_MSG_FUNCTION_RESTORE_HIBERNATION_DATA', (NV_VGPU_MSG_FUNCTION_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED:=183): 'NV_VGPU_MSG_FUNCTION_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED', (NV_VGPU_MSG_FUNCTION_CTRL_EXEC_PARTITIONS_CREATE:=184): 'NV_VGPU_MSG_FUNCTION_CTRL_EXEC_PARTITIONS_CREATE', (NV_VGPU_MSG_FUNCTION_CTRL_EXEC_PARTITIONS_DELETE:=185): 'NV_VGPU_MSG_FUNCTION_CTRL_EXEC_PARTITIONS_DELETE', (NV_VGPU_MSG_FUNCTION_CTRL_GPFIFO_GET_WORK_SUBMIT_TOKEN:=186): 'NV_VGPU_MSG_FUNCTION_CTRL_GPFIFO_GET_WORK_SUBMIT_TOKEN', (NV_VGPU_MSG_FUNCTION_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX:=187): 'NV_VGPU_MSG_FUNCTION_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX', (NV_VGPU_MSG_FUNCTION_PMA_SCRUBBER_SHARED_BUFFER_GUEST_PAGES_OPERATION:=188): 'NV_VGPU_MSG_FUNCTION_PMA_SCRUBBER_SHARED_BUFFER_GUEST_PAGES_OPERATION', (NV_VGPU_MSG_FUNCTION_CTRL_MASTER_GET_VIRTUAL_FUNCTION_ERROR_CONT_INTR_MASK:=189): 'NV_VGPU_MSG_FUNCTION_CTRL_MASTER_GET_VIRTUAL_FUNCTION_ERROR_CONT_INTR_MASK', (NV_VGPU_MSG_FUNCTION_SET_SYSMEM_DIRTY_PAGE_TRACKING_BUFFER:=190): 'NV_VGPU_MSG_FUNCTION_SET_SYSMEM_DIRTY_PAGE_TRACKING_BUFFER', (NV_VGPU_MSG_FUNCTION_CTRL_SUBDEVICE_GET_P2P_CAPS:=191): 'NV_VGPU_MSG_FUNCTION_CTRL_SUBDEVICE_GET_P2P_CAPS', (NV_VGPU_MSG_FUNCTION_CTRL_BUS_SET_P2P_MAPPING:=192): 'NV_VGPU_MSG_FUNCTION_CTRL_BUS_SET_P2P_MAPPING', (NV_VGPU_MSG_FUNCTION_CTRL_BUS_UNSET_P2P_MAPPING:=193): 'NV_VGPU_MSG_FUNCTION_CTRL_BUS_UNSET_P2P_MAPPING', (NV_VGPU_MSG_FUNCTION_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK:=194): 'NV_VGPU_MSG_FUNCTION_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK', (NV_VGPU_MSG_FUNCTION_CTRL_GPU_MIGRATABLE_OPS:=195): 'NV_VGPU_MSG_FUNCTION_CTRL_GPU_MIGRATABLE_OPS', (NV_VGPU_MSG_FUNCTION_CTRL_GET_TOTAL_HS_CREDITS:=196): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_TOTAL_HS_CREDITS', (NV_VGPU_MSG_FUNCTION_CTRL_GET_HS_CREDITS:=197): 'NV_VGPU_MSG_FUNCTION_CTRL_GET_HS_CREDITS', (NV_VGPU_MSG_FUNCTION_CTRL_SET_HS_CREDITS:=198): 'NV_VGPU_MSG_FUNCTION_CTRL_SET_HS_CREDITS', (NV_VGPU_MSG_FUNCTION_CTRL_PM_AREA_PC_SAMPLER:=199): 'NV_VGPU_MSG_FUNCTION_CTRL_PM_AREA_PC_SAMPLER', (NV_VGPU_MSG_FUNCTION_INVALIDATE_TLB:=200): 'NV_VGPU_MSG_FUNCTION_INVALIDATE_TLB', (NV_VGPU_MSG_FUNCTION_CTRL_GPU_QUERY_ECC_STATUS:=201): 'NV_VGPU_MSG_FUNCTION_CTRL_GPU_QUERY_ECC_STATUS', (NV_VGPU_MSG_FUNCTION_ECC_NOTIFIER_WRITE_ACK:=202): 'NV_VGPU_MSG_FUNCTION_ECC_NOTIFIER_WRITE_ACK', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_GET_MODE_MMU_DEBUG:=203): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_GET_MODE_MMU_DEBUG', (NV_VGPU_MSG_FUNCTION_RM_API_CONTROL:=204): 'NV_VGPU_MSG_FUNCTION_RM_API_CONTROL', (NV_VGPU_MSG_FUNCTION_CTRL_CMD_INTERNAL_GPU_START_FABRIC_PROBE:=205): 'NV_VGPU_MSG_FUNCTION_CTRL_CMD_INTERNAL_GPU_START_FABRIC_PROBE', (NV_VGPU_MSG_FUNCTION_CTRL_NVLINK_GET_INBAND_RECEIVED_DATA:=206): 'NV_VGPU_MSG_FUNCTION_CTRL_NVLINK_GET_INBAND_RECEIVED_DATA', (NV_VGPU_MSG_FUNCTION_GET_STATIC_DATA:=207): 'NV_VGPU_MSG_FUNCTION_GET_STATIC_DATA', (NV_VGPU_MSG_FUNCTION_RESERVED_208:=208): 'NV_VGPU_MSG_FUNCTION_RESERVED_208', (NV_VGPU_MSG_FUNCTION_CTRL_GPU_GET_INFO_V2:=209): 'NV_VGPU_MSG_FUNCTION_CTRL_GPU_GET_INFO_V2', (NV_VGPU_MSG_FUNCTION_GET_BRAND_CAPS:=210): 'NV_VGPU_MSG_FUNCTION_GET_BRAND_CAPS', (NV_VGPU_MSG_FUNCTION_CTRL_CMD_NVLINK_INBAND_SEND_DATA:=211): 'NV_VGPU_MSG_FUNCTION_CTRL_CMD_NVLINK_INBAND_SEND_DATA', (NV_VGPU_MSG_FUNCTION_UPDATE_GPM_GUEST_BUFFER_INFO:=212): 'NV_VGPU_MSG_FUNCTION_UPDATE_GPM_GUEST_BUFFER_INFO', (NV_VGPU_MSG_FUNCTION_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE:=213): 'NV_VGPU_MSG_FUNCTION_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE', (NV_VGPU_MSG_FUNCTION_CTRL_SET_ZBC_STENCIL_CLEAR:=214): 'NV_VGPU_MSG_FUNCTION_CTRL_SET_ZBC_STENCIL_CLEAR', (NV_VGPU_MSG_FUNCTION_CTRL_SUBDEVICE_GET_VGPU_HEAP_STATS:=215): 'NV_VGPU_MSG_FUNCTION_CTRL_SUBDEVICE_GET_VGPU_HEAP_STATS', (NV_VGPU_MSG_FUNCTION_CTRL_SUBDEVICE_GET_LIBOS_HEAP_STATS:=216): 'NV_VGPU_MSG_FUNCTION_CTRL_SUBDEVICE_GET_LIBOS_HEAP_STATS', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_MODE_MMU_GCC_DEBUG:=217): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_SET_MODE_MMU_GCC_DEBUG', (NV_VGPU_MSG_FUNCTION_CTRL_DBG_GET_MODE_MMU_GCC_DEBUG:=218): 'NV_VGPU_MSG_FUNCTION_CTRL_DBG_GET_MODE_MMU_GCC_DEBUG', (NV_VGPU_MSG_FUNCTION_CTRL_RESERVE_HES:=219): 'NV_VGPU_MSG_FUNCTION_CTRL_RESERVE_HES', (NV_VGPU_MSG_FUNCTION_CTRL_RELEASE_HES:=220): 'NV_VGPU_MSG_FUNCTION_CTRL_RELEASE_HES', (NV_VGPU_MSG_FUNCTION_CTRL_RESERVE_CCU_PROF:=221): 'NV_VGPU_MSG_FUNCTION_CTRL_RESERVE_CCU_PROF', (NV_VGPU_MSG_FUNCTION_CTRL_RELEASE_CCU_PROF:=222): 'NV_VGPU_MSG_FUNCTION_CTRL_RELEASE_CCU_PROF', (NV_VGPU_MSG_FUNCTION_NUM_FUNCTIONS:=223): 'NV_VGPU_MSG_FUNCTION_NUM_FUNCTIONS'} +rpc_events: dict[int, str] = {(NV_VGPU_MSG_EVENT_FIRST_EVENT:=4096): 'NV_VGPU_MSG_EVENT_FIRST_EVENT', (NV_VGPU_MSG_EVENT_GSP_INIT_DONE:=4097): 'NV_VGPU_MSG_EVENT_GSP_INIT_DONE', (NV_VGPU_MSG_EVENT_GSP_RUN_CPU_SEQUENCER:=4098): 'NV_VGPU_MSG_EVENT_GSP_RUN_CPU_SEQUENCER', (NV_VGPU_MSG_EVENT_POST_EVENT:=4099): 'NV_VGPU_MSG_EVENT_POST_EVENT', (NV_VGPU_MSG_EVENT_RC_TRIGGERED:=4100): 'NV_VGPU_MSG_EVENT_RC_TRIGGERED', (NV_VGPU_MSG_EVENT_MMU_FAULT_QUEUED:=4101): 'NV_VGPU_MSG_EVENT_MMU_FAULT_QUEUED', (NV_VGPU_MSG_EVENT_OS_ERROR_LOG:=4102): 'NV_VGPU_MSG_EVENT_OS_ERROR_LOG', (NV_VGPU_MSG_EVENT_RG_LINE_INTR:=4103): 'NV_VGPU_MSG_EVENT_RG_LINE_INTR', (NV_VGPU_MSG_EVENT_GPUACCT_PERFMON_UTIL_SAMPLES:=4104): 'NV_VGPU_MSG_EVENT_GPUACCT_PERFMON_UTIL_SAMPLES', (NV_VGPU_MSG_EVENT_SIM_READ:=4105): 'NV_VGPU_MSG_EVENT_SIM_READ', (NV_VGPU_MSG_EVENT_SIM_WRITE:=4106): 'NV_VGPU_MSG_EVENT_SIM_WRITE', (NV_VGPU_MSG_EVENT_SEMAPHORE_SCHEDULE_CALLBACK:=4107): 'NV_VGPU_MSG_EVENT_SEMAPHORE_SCHEDULE_CALLBACK', (NV_VGPU_MSG_EVENT_UCODE_LIBOS_PRINT:=4108): 'NV_VGPU_MSG_EVENT_UCODE_LIBOS_PRINT', (NV_VGPU_MSG_EVENT_VGPU_GSP_PLUGIN_TRIGGERED:=4109): 'NV_VGPU_MSG_EVENT_VGPU_GSP_PLUGIN_TRIGGERED', (NV_VGPU_MSG_EVENT_PERF_GPU_BOOST_SYNC_LIMITS_CALLBACK:=4110): 'NV_VGPU_MSG_EVENT_PERF_GPU_BOOST_SYNC_LIMITS_CALLBACK', (NV_VGPU_MSG_EVENT_PERF_BRIDGELESS_INFO_UPDATE:=4111): 'NV_VGPU_MSG_EVENT_PERF_BRIDGELESS_INFO_UPDATE', (NV_VGPU_MSG_EVENT_VGPU_CONFIG:=4112): 'NV_VGPU_MSG_EVENT_VGPU_CONFIG', (NV_VGPU_MSG_EVENT_DISPLAY_MODESET:=4113): 'NV_VGPU_MSG_EVENT_DISPLAY_MODESET', (NV_VGPU_MSG_EVENT_EXTDEV_INTR_SERVICE:=4114): 'NV_VGPU_MSG_EVENT_EXTDEV_INTR_SERVICE', (NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_256:=4115): 'NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_256', (NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_512:=4116): 'NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_512', (NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_1024:=4117): 'NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_1024', (NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_2048:=4118): 'NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_2048', (NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_4096:=4119): 'NV_VGPU_MSG_EVENT_NVLINK_INBAND_RECEIVED_DATA_4096', (NV_VGPU_MSG_EVENT_TIMED_SEMAPHORE_RELEASE:=4120): 'NV_VGPU_MSG_EVENT_TIMED_SEMAPHORE_RELEASE', (NV_VGPU_MSG_EVENT_NVLINK_IS_GPU_DEGRADED:=4121): 'NV_VGPU_MSG_EVENT_NVLINK_IS_GPU_DEGRADED', (NV_VGPU_MSG_EVENT_PFM_REQ_HNDLR_STATE_SYNC_CALLBACK:=4122): 'NV_VGPU_MSG_EVENT_PFM_REQ_HNDLR_STATE_SYNC_CALLBACK', (NV_VGPU_MSG_EVENT_NVLINK_FAULT_UP:=4123): 'NV_VGPU_MSG_EVENT_NVLINK_FAULT_UP', (NV_VGPU_MSG_EVENT_GSP_LOCKDOWN_NOTICE:=4124): 'NV_VGPU_MSG_EVENT_GSP_LOCKDOWN_NOTICE', (NV_VGPU_MSG_EVENT_MIG_CI_CONFIG_UPDATE:=4125): 'NV_VGPU_MSG_EVENT_MIG_CI_CONFIG_UPDATE', (NV_VGPU_MSG_EVENT_UPDATE_GSP_TRACE:=4126): 'NV_VGPU_MSG_EVENT_UPDATE_GSP_TRACE', (NV_VGPU_MSG_EVENT_NVLINK_FATAL_ERROR_RECOVERY:=4127): 'NV_VGPU_MSG_EVENT_NVLINK_FATAL_ERROR_RECOVERY', (NV_VGPU_MSG_EVENT_GSP_POST_NOCAT_RECORD:=4128): 'NV_VGPU_MSG_EVENT_GSP_POST_NOCAT_RECORD', (NV_VGPU_MSG_EVENT_FECS_ERROR:=4129): 'NV_VGPU_MSG_EVENT_FECS_ERROR', (NV_VGPU_MSG_EVENT_RECOVERY_ACTION:=4130): 'NV_VGPU_MSG_EVENT_RECOVERY_ACTION', (NV_VGPU_MSG_EVENT_NUM_EVENTS:=4131): 'NV_VGPU_MSG_EVENT_NUM_EVENTS'} +LibosAddress: TypeAlias = ctypes.c_uint64 +LibosMemoryRegionKind: dict[int, str] = {(LIBOS_MEMORY_REGION_NONE:=0): 'LIBOS_MEMORY_REGION_NONE', (LIBOS_MEMORY_REGION_CONTIGUOUS:=1): 'LIBOS_MEMORY_REGION_CONTIGUOUS', (LIBOS_MEMORY_REGION_RADIX3:=2): 'LIBOS_MEMORY_REGION_RADIX3'} +LibosMemoryRegionLoc: dict[int, str] = {(LIBOS_MEMORY_REGION_LOC_NONE:=0): 'LIBOS_MEMORY_REGION_LOC_NONE', (LIBOS_MEMORY_REGION_LOC_SYSMEM:=1): 'LIBOS_MEMORY_REGION_LOC_SYSMEM', (LIBOS_MEMORY_REGION_LOC_FB:=2): 'LIBOS_MEMORY_REGION_LOC_FB'} +@c.record +class LibosMemoryRegionInitArgument(c.Struct): + SIZE = 32 + id8: int + pa: int + size: int + kind: int + loc: int +LibosMemoryRegionInitArgument.register_fields([('id8', LibosAddress, 0), ('pa', LibosAddress, 8), ('size', LibosAddress, 16), ('kind', NvU8, 24), ('loc', NvU8, 25)]) +@c.record +class msgqTxHeader(c.Struct): + SIZE = 32 + version: int + size: int + msgSize: int + msgCount: int + writePtr: int + flags: int + rxHdrOff: int + entryOff: int +msgqTxHeader.register_fields([('version', NvU32, 0), ('size', NvU32, 4), ('msgSize', NvU32, 8), ('msgCount', NvU32, 12), ('writePtr', NvU32, 16), ('flags', NvU32, 20), ('rxHdrOff', NvU32, 24), ('entryOff', NvU32, 28)]) +@c.record +class msgqRxHeader(c.Struct): + SIZE = 4 + readPtr: int +msgqRxHeader.register_fields([('readPtr', NvU32, 0)]) +@c.record +class msgqMetadata(c.Struct): + SIZE = 232 + pOurTxHdr: c.POINTER[msgqTxHeader] + pTheirTxHdr: c.POINTER[volatile_msgqTxHeader] + pOurRxHdr: c.POINTER[msgqRxHeader] + pTheirRxHdr: c.POINTER[msgqRxHeader] + pOurEntries: c.POINTER[ctypes.c_ubyte] + pTheirEntries: c.POINTER[ctypes.c_ubyte] + pReadIncoming: c.POINTER[ctypes.c_uint32] + pWriteIncoming: c.POINTER[ctypes.c_uint32] + pReadOutgoing: c.POINTER[ctypes.c_uint32] + pWriteOutgoing: c.POINTER[ctypes.c_uint32] + tx: msgqTxHeader + txReadPtr: int + txFree: int + txLinked: int + rx: msgqTxHeader + rxReadPtr: int + rxAvail: int + rxLinked: int + rxSwapped: int + fcnNotify: c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_int32, ctypes.c_void_p]] + fcnNotifyArg: ctypes.c_void_p + fcnBackendRw: c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_void_p]] + fcnBackendRwArg: ctypes.c_void_p + fcnInvalidate: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32]] + fcnFlush: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32]] + fcnZero: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32]] + fcnBarrier: c.CFUNCTYPE[None, []] +msgqFcnNotifyRemote: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_int32, ctypes.c_void_p]] +msgqFcnBackendRw: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_void_p]] +msgqFcnCacheOp: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32]] +msgqFcnBarrier: TypeAlias = c.CFUNCTYPE[None, []] +@c.record +class volatile_msgqTxHeader(c.Struct): + SIZE = 32 + version: int + size: int + msgSize: int + msgCount: int + writePtr: int + flags: int + rxHdrOff: int + entryOff: int +volatile_msgqTxHeader.register_fields([('version', NvU32, 0), ('size', NvU32, 4), ('msgSize', NvU32, 8), ('msgCount', NvU32, 12), ('writePtr', NvU32, 16), ('flags', NvU32, 20), ('rxHdrOff', NvU32, 24), ('entryOff', NvU32, 28)]) +msgqMetadata.register_fields([('pOurTxHdr', c.POINTER[msgqTxHeader], 0), ('pTheirTxHdr', c.POINTER[msgqTxHeader], 8), ('pOurRxHdr', c.POINTER[msgqRxHeader], 16), ('pTheirRxHdr', c.POINTER[msgqRxHeader], 24), ('pOurEntries', c.POINTER[NvU8], 32), ('pTheirEntries', c.POINTER[NvU8], 40), ('pReadIncoming', c.POINTER[NvU32], 48), ('pWriteIncoming', c.POINTER[NvU32], 56), ('pReadOutgoing', c.POINTER[NvU32], 64), ('pWriteOutgoing', c.POINTER[NvU32], 72), ('tx', msgqTxHeader, 80), ('txReadPtr', NvU32, 112), ('txFree', NvU32, 116), ('txLinked', NvBool, 120), ('rx', msgqTxHeader, 124), ('rxReadPtr', NvU32, 156), ('rxAvail', NvU32, 160), ('rxLinked', NvBool, 164), ('rxSwapped', NvBool, 165), ('fcnNotify', msgqFcnNotifyRemote, 168), ('fcnNotifyArg', ctypes.c_void_p, 176), ('fcnBackendRw', msgqFcnBackendRw, 184), ('fcnBackendRwArg', ctypes.c_void_p, 192), ('fcnInvalidate', msgqFcnCacheOp, 200), ('fcnFlush', msgqFcnCacheOp, 208), ('fcnZero', msgqFcnCacheOp, 216), ('fcnBarrier', msgqFcnBarrier, 224)]) +@c.record +class struct_rpc_set_guest_system_info_v03_00(c.Struct): + SIZE = 792 + vgxVersionMajorNum: int + vgxVersionMinorNum: int + guestDriverVersionBufferLength: int + guestVersionBufferLength: int + guestTitleBufferLength: int + guestClNum: int + guestDriverVersion: c.Array[ctypes.c_char, Literal[256]] + guestVersion: c.Array[ctypes.c_char, Literal[256]] + guestTitle: c.Array[ctypes.c_char, Literal[256]] +struct_rpc_set_guest_system_info_v03_00.register_fields([('vgxVersionMajorNum', NvU32, 0), ('vgxVersionMinorNum', NvU32, 4), ('guestDriverVersionBufferLength', NvU32, 8), ('guestVersionBufferLength', NvU32, 12), ('guestTitleBufferLength', NvU32, 16), ('guestClNum', NvU32, 20), ('guestDriverVersion', c.Array[ctypes.c_char, Literal[256]], 24), ('guestVersion', c.Array[ctypes.c_char, Literal[256]], 280), ('guestTitle', c.Array[ctypes.c_char, Literal[256]], 536)]) +rpc_set_guest_system_info_v03_00: TypeAlias = struct_rpc_set_guest_system_info_v03_00 +rpc_set_guest_system_info_v: TypeAlias = struct_rpc_set_guest_system_info_v03_00 +@c.record +class struct_rpc_set_guest_system_info_ext_v15_02(c.Struct): + SIZE = 264 + guestDriverBranch: c.Array[ctypes.c_char, Literal[256]] + domain: int + bus: int + device: int +struct_rpc_set_guest_system_info_ext_v15_02.register_fields([('guestDriverBranch', c.Array[ctypes.c_char, Literal[256]], 0), ('domain', NvU32, 256), ('bus', NvU16, 260), ('device', NvU16, 262)]) +rpc_set_guest_system_info_ext_v15_02: TypeAlias = struct_rpc_set_guest_system_info_ext_v15_02 +@c.record +class struct_rpc_set_guest_system_info_ext_v25_1B(c.Struct): + SIZE = 268 + guestDriverBranch: c.Array[ctypes.c_char, Literal[256]] + domain: int + bus: int + device: int + gridBuildCsp: int +struct_rpc_set_guest_system_info_ext_v25_1B.register_fields([('guestDriverBranch', c.Array[ctypes.c_char, Literal[256]], 0), ('domain', NvU32, 256), ('bus', NvU16, 260), ('device', NvU16, 262), ('gridBuildCsp', NvU32, 264)]) +rpc_set_guest_system_info_ext_v25_1B: TypeAlias = struct_rpc_set_guest_system_info_ext_v25_1B +rpc_set_guest_system_info_ext_v: TypeAlias = struct_rpc_set_guest_system_info_ext_v25_1B +@c.record +class struct_rpc_alloc_root_v07_00(c.Struct): + SIZE = 108 + hClient: int + processID: int + processName: c.Array[ctypes.c_char, Literal[100]] +NvHandle: TypeAlias = ctypes.c_uint32 +struct_rpc_alloc_root_v07_00.register_fields([('hClient', NvHandle, 0), ('processID', NvU32, 4), ('processName', c.Array[ctypes.c_char, Literal[100]], 8)]) +rpc_alloc_root_v07_00: TypeAlias = struct_rpc_alloc_root_v07_00 +rpc_alloc_root_v: TypeAlias = struct_rpc_alloc_root_v07_00 +@c.record +class struct_rpc_alloc_memory_v13_01(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hMemory: int + hClass: int + flags: int + pteAdjust: int + format: int + length: int + pageCount: int + pteDesc: struct_pte_desc +@c.record +class struct_pte_desc(c.Struct): + SIZE = 8 + idr: int + reserved1: int + length: int + pte_pde: c.Array[struct_pte_desc_pte_pde, Literal[0]] +@c.record +class struct_pte_desc_pte_pde(c.Struct): + SIZE = 8 + pte: int + pde: int +struct_pte_desc_pte_pde.register_fields([('pte', NvU64, 0), ('pde', NvU64, 0)]) +struct_pte_desc.register_fields([('idr', NvU32, 0, 2, 0), ('reserved1', NvU32, 0, 14, 2), ('length', NvU32, 2, 16, 0), ('pte_pde', c.Array[struct_pte_desc_pte_pde, Literal[0]], 8)]) +struct_rpc_alloc_memory_v13_01.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('hClass', NvU32, 12), ('flags', NvU32, 16), ('pteAdjust', NvU32, 20), ('format', NvU32, 24), ('length', NvU64, 32), ('pageCount', NvU32, 40), ('pteDesc', struct_pte_desc, 48)]) +rpc_alloc_memory_v13_01: TypeAlias = struct_rpc_alloc_memory_v13_01 +rpc_alloc_memory_v: TypeAlias = struct_rpc_alloc_memory_v13_01 +@c.record +class struct_rpc_alloc_channel_dma_v1F_04(c.Struct): + SIZE = 248 + hClient: int + hDevice: int + hChannel: int + hClass: int + flags: int + params: struct_NV_CHANNEL_ALLOC_PARAMS_v1F_04 + chid: int +@c.record +class struct_NV_CHANNEL_ALLOC_PARAMS_v1F_04(c.Struct): + SIZE = 216 + hObjectError: int + hObjectBuffer: int + gpFifoOffset: int + gpFifoEntries: int + flags: int + hContextShare: int + hVASpace: int + hUserdMemory: c.Array[ctypes.c_uint32, Literal[1]] + userdOffset: c.Array[ctypes.c_uint64, Literal[1]] + engineType: int + hObjectEccError: int + instanceMem: struct_NV_MEMORY_DESC_PARAMS_v18_01 + ramfcMem: struct_NV_MEMORY_DESC_PARAMS_v18_01 + userdMem: struct_NV_MEMORY_DESC_PARAMS_v18_01 + mthdbufMem: struct_NV_MEMORY_DESC_PARAMS_v18_01 + hPhysChannelGroup: int + subDeviceId: int + internalFlags: int + errorNotifierMem: struct_NV_MEMORY_DESC_PARAMS_v18_01 + eccErrorNotifierMem: struct_NV_MEMORY_DESC_PARAMS_v18_01 +NV_CHANNEL_ALLOC_PARAMS_v1F_04: TypeAlias = struct_NV_CHANNEL_ALLOC_PARAMS_v1F_04 +@c.record +class struct_NV_MEMORY_DESC_PARAMS_v18_01(c.Struct): + SIZE = 24 + base: int + size: int + addressSpace: int + cacheAttrib: int +NV_MEMORY_DESC_PARAMS_v18_01: TypeAlias = struct_NV_MEMORY_DESC_PARAMS_v18_01 +struct_NV_MEMORY_DESC_PARAMS_v18_01.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('addressSpace', NvU32, 16), ('cacheAttrib', NvU32, 20)]) +struct_NV_CHANNEL_ALLOC_PARAMS_v1F_04.register_fields([('hObjectError', NvHandle, 0), ('hObjectBuffer', NvHandle, 4), ('gpFifoOffset', NvU64, 8), ('gpFifoEntries', NvU32, 16), ('flags', NvU32, 20), ('hContextShare', NvHandle, 24), ('hVASpace', NvHandle, 28), ('hUserdMemory', c.Array[NvHandle, Literal[1]], 32), ('userdOffset', c.Array[NvU64, Literal[1]], 40), ('engineType', NvU32, 48), ('hObjectEccError', NvHandle, 52), ('instanceMem', NV_MEMORY_DESC_PARAMS_v18_01, 56), ('ramfcMem', NV_MEMORY_DESC_PARAMS_v18_01, 80), ('userdMem', NV_MEMORY_DESC_PARAMS_v18_01, 104), ('mthdbufMem', NV_MEMORY_DESC_PARAMS_v18_01, 128), ('hPhysChannelGroup', NvHandle, 152), ('subDeviceId', NvHandle, 156), ('internalFlags', NvU32, 160), ('errorNotifierMem', NV_MEMORY_DESC_PARAMS_v18_01, 168), ('eccErrorNotifierMem', NV_MEMORY_DESC_PARAMS_v18_01, 192)]) +struct_rpc_alloc_channel_dma_v1F_04.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hChannel', NvHandle, 8), ('hClass', NvU32, 12), ('flags', NvU32, 16), ('params', NV_CHANNEL_ALLOC_PARAMS_v1F_04, 24), ('chid', NvU32, 240)]) +rpc_alloc_channel_dma_v1F_04: TypeAlias = struct_rpc_alloc_channel_dma_v1F_04 +rpc_alloc_channel_dma_v: TypeAlias = struct_rpc_alloc_channel_dma_v1F_04 +@c.record +class struct_rpc_alloc_object_v25_08(c.Struct): + SIZE = 64 + hClient: int + hParent: int + hObject: int + hClass: int + param_len: int + params: union_alloc_object_params_v25_08 +@c.record +class union_alloc_object_params_v25_08(c.Struct): + SIZE = 40 + param_NV50_TESLA: struct_alloc_object_NV50_TESLA_v03_00 + param_GT212_DMA_COPY: struct_alloc_object_GT212_DMA_COPY_v03_00 + param_GF100_DISP_SW: struct_alloc_object_GF100_DISP_SW_v03_00 + param_KEPLER_CHANNEL_GROUP_A: struct_alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08 + param_FERMI_CONTEXT_SHARE_A: struct_alloc_object_FERMI_CONTEXT_SHARE_A_v04_00 + param_NVD0B7_VIDEO_ENCODER: struct_alloc_object_NVD0B7_VIDEO_ENCODER_v03_00 + param_FERMI_VASPACE_A: struct_alloc_object_FERMI_VASPACE_A_v03_00 + param_NVB0B0_VIDEO_DECODER: struct_alloc_object_NVB0B0_VIDEO_DECODER_v03_00 + param_NV83DE_ALLOC_PARAMETERS: struct_alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00 + param_NVENC_SW_SESSION: struct_alloc_object_NVENC_SW_SESSION_v06_01 + param_NVC4B0_VIDEO_DECODER: struct_alloc_object_NVC4B0_VIDEO_DECODER_v12_02 + param_NVFBC_SW_SESSION: struct_alloc_object_NVFBC_SW_SESSION_v12_04 + param_NV_NVJPG_ALLOCATION_PARAMETERS: struct_alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02 + param_NV503B_ALLOC_PARAMETERS: struct_alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02 + param_NVC637_ALLOCATION_PARAMETERS: struct_alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00 + param_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS: struct_alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03 + param_NVC638_ALLOCATION_PARAMETERS: struct_alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06 + param_NV503C_ALLOC_PARAMETERS: struct_alloc_object_NV503C_ALLOC_PARAMETERS_v18_15 + param_NVC670_ALLOCATION_PARAMETERS: struct_alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01 + param_NVB1CC_ALLOC_PARAMETERS: struct_alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03 + param_NVB2CC_ALLOC_PARAMETERS: struct_alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03 + param_NV_GR_ALLOCATION_PARAMETERS: struct_NV_GR_ALLOCATION_PARAMETERS_v1A_17 + param_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS: struct_alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B + param_NV00F8_ALLOCATION_PARAMETERS: struct_alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C + param_NVC9FA_VIDEO_OFA: struct_alloc_object_NVC9FA_VIDEO_OFA_v1F_00 + param_NV2081_ALLOC_PARAMETERS: struct_alloc_object_NV2081_ALLOC_PARAMETERS_v25_08 +alloc_object_params_v25_08: TypeAlias = union_alloc_object_params_v25_08 +@c.record +class struct_alloc_object_NV50_TESLA_v03_00(c.Struct): + SIZE = 16 + version: int + flags: int + size: int + caps: int +alloc_object_NV50_TESLA_v03_00: TypeAlias = struct_alloc_object_NV50_TESLA_v03_00 +struct_alloc_object_NV50_TESLA_v03_00.register_fields([('version', NvU32, 0), ('flags', NvU32, 4), ('size', NvU32, 8), ('caps', NvU32, 12)]) +@c.record +class struct_alloc_object_GT212_DMA_COPY_v03_00(c.Struct): + SIZE = 8 + version: int + engineInstance: int +alloc_object_GT212_DMA_COPY_v03_00: TypeAlias = struct_alloc_object_GT212_DMA_COPY_v03_00 +struct_alloc_object_GT212_DMA_COPY_v03_00.register_fields([('version', NvU32, 0), ('engineInstance', NvU32, 4)]) +@c.record +class struct_alloc_object_GF100_DISP_SW_v03_00(c.Struct): + SIZE = 32 + _reserved1: int + _reserved2: int + logicalHeadId: int + displayMask: int + caps: int +alloc_object_GF100_DISP_SW_v03_00: TypeAlias = struct_alloc_object_GF100_DISP_SW_v03_00 +struct_alloc_object_GF100_DISP_SW_v03_00.register_fields([('_reserved1', NvU32, 0), ('_reserved2', NvU64, 8), ('logicalHeadId', NvU32, 16), ('displayMask', NvU32, 20), ('caps', NvU32, 24)]) +@c.record +class struct_alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08(c.Struct): + SIZE = 12 + hObjectError: int + hVASpace: int + engineType: int +alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08: TypeAlias = struct_alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08 +struct_alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08.register_fields([('hObjectError', NvU32, 0), ('hVASpace', NvU32, 4), ('engineType', NvU32, 8)]) +@c.record +class struct_alloc_object_FERMI_CONTEXT_SHARE_A_v04_00(c.Struct): + SIZE = 12 + hVASpace: int + flags: int + subctxId: int +alloc_object_FERMI_CONTEXT_SHARE_A_v04_00: TypeAlias = struct_alloc_object_FERMI_CONTEXT_SHARE_A_v04_00 +struct_alloc_object_FERMI_CONTEXT_SHARE_A_v04_00.register_fields([('hVASpace', NvU32, 0), ('flags', NvU32, 4), ('subctxId', NvU32, 8)]) +@c.record +class struct_alloc_object_NVD0B7_VIDEO_ENCODER_v03_00(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +alloc_object_NVD0B7_VIDEO_ENCODER_v03_00: TypeAlias = struct_alloc_object_NVD0B7_VIDEO_ENCODER_v03_00 +struct_alloc_object_NVD0B7_VIDEO_ENCODER_v03_00.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class struct_alloc_object_FERMI_VASPACE_A_v03_00(c.Struct): + SIZE = 32 + index: int + flags: int + vaSize: int + bigPageSize: int + vaBase: int +alloc_object_FERMI_VASPACE_A_v03_00: TypeAlias = struct_alloc_object_FERMI_VASPACE_A_v03_00 +struct_alloc_object_FERMI_VASPACE_A_v03_00.register_fields([('index', NvU32, 0), ('flags', NvU32, 4), ('vaSize', NvU64, 8), ('bigPageSize', NvU32, 16), ('vaBase', NvU64, 24)]) +@c.record +class struct_alloc_object_NVB0B0_VIDEO_DECODER_v03_00(c.Struct): + SIZE = 8 + size: int + prohibitMultipleInstances: int +alloc_object_NVB0B0_VIDEO_DECODER_v03_00: TypeAlias = struct_alloc_object_NVB0B0_VIDEO_DECODER_v03_00 +struct_alloc_object_NVB0B0_VIDEO_DECODER_v03_00.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4)]) +@c.record +class struct_alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00(c.Struct): + SIZE = 12 + hDebuggerClient: int + hAppClient: int + hClass3dObject: int +alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00: TypeAlias = struct_alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00 +struct_alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00.register_fields([('hDebuggerClient', NvHandle, 0), ('hAppClient', NvHandle, 4), ('hClass3dObject', NvHandle, 8)]) +@c.record +class struct_alloc_object_NVENC_SW_SESSION_v06_01(c.Struct): + SIZE = 12 + codecType: int + hResolution: int + vResolution: int +alloc_object_NVENC_SW_SESSION_v06_01: TypeAlias = struct_alloc_object_NVENC_SW_SESSION_v06_01 +struct_alloc_object_NVENC_SW_SESSION_v06_01.register_fields([('codecType', NvU32, 0), ('hResolution', NvU32, 4), ('vResolution', NvU32, 8)]) +@c.record +class struct_alloc_object_NVC4B0_VIDEO_DECODER_v12_02(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +alloc_object_NVC4B0_VIDEO_DECODER_v12_02: TypeAlias = struct_alloc_object_NVC4B0_VIDEO_DECODER_v12_02 +struct_alloc_object_NVC4B0_VIDEO_DECODER_v12_02.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class struct_alloc_object_NVFBC_SW_SESSION_v12_04(c.Struct): + SIZE = 20 + displayOrdinal: int + sessionType: int + sessionFlags: int + hMaxResolution: int + vMaxResolution: int +alloc_object_NVFBC_SW_SESSION_v12_04: TypeAlias = struct_alloc_object_NVFBC_SW_SESSION_v12_04 +struct_alloc_object_NVFBC_SW_SESSION_v12_04.register_fields([('displayOrdinal', NvU32, 0), ('sessionType', NvU32, 4), ('sessionFlags', NvU32, 8), ('hMaxResolution', NvU32, 12), ('vMaxResolution', NvU32, 16)]) +@c.record +class struct_alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02: TypeAlias = struct_alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02 +struct_alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class struct_alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02(c.Struct): + SIZE = 32 + hSubDevice: int + hPeerSubDevice: int + subDevicePeerIdMask: int + peerSubDevicePeerIdMask: int + mailboxBar1Addr: int + mailboxTotalSize: int + flags: int +alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02: TypeAlias = struct_alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02 +struct_alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02.register_fields([('hSubDevice', NvHandle, 0), ('hPeerSubDevice', NvHandle, 4), ('subDevicePeerIdMask', NvU32, 8), ('peerSubDevicePeerIdMask', NvU32, 12), ('mailboxBar1Addr', NvU64, 16), ('mailboxTotalSize', NvU32, 24), ('flags', NvU32, 28)]) +@c.record +class struct_alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00(c.Struct): + SIZE = 4 + swizzId: int +alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00: TypeAlias = struct_alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00 +struct_alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00.register_fields([('swizzId', NvU32, 0)]) +@c.record +class struct_alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03(c.Struct): + SIZE = 24 + offset: int + limit: int + hVASpace: int +alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03: TypeAlias = struct_alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03 +struct_alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03.register_fields([('offset', NvU64, 0), ('limit', NvU64, 8), ('hVASpace', NvHandle, 16)]) +@c.record +class struct_alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06(c.Struct): + SIZE = 4 + execPartitionId: int +alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06: TypeAlias = struct_alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06 +struct_alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06.register_fields([('execPartitionId', NvU32, 0)]) +@c.record +class struct_alloc_object_NV503C_ALLOC_PARAMETERS_v18_15(c.Struct): + SIZE = 16 + flags: int + p2pToken: int +alloc_object_NV503C_ALLOC_PARAMETERS_v18_15: TypeAlias = struct_alloc_object_NV503C_ALLOC_PARAMETERS_v18_15 +struct_alloc_object_NV503C_ALLOC_PARAMETERS_v18_15.register_fields([('flags', NvU32, 0), ('p2pToken', NvU64, 8)]) +@c.record +class struct_alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01(c.Struct): + SIZE = 12 + numHeads: int + numSors: int + numDsis: int +alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01: TypeAlias = struct_alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01 +struct_alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01.register_fields([('numHeads', NvU32, 0), ('numSors', NvU32, 4), ('numDsis', NvU32, 8)]) +@c.record +class struct_alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03(c.Struct): + SIZE = 4 + hSubDevice: int +alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03: TypeAlias = struct_alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03 +struct_alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03.register_fields([('hSubDevice', NvHandle, 0)]) +@c.record +class struct_alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03(c.Struct): + SIZE = 8 + hClientTarget: int + hContextTarget: int +alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03: TypeAlias = struct_alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03 +struct_alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03.register_fields([('hClientTarget', NvHandle, 0), ('hContextTarget', NvHandle, 4)]) +@c.record +class struct_NV_GR_ALLOCATION_PARAMETERS_v1A_17(c.Struct): + SIZE = 16 + version: int + flags: int + size: int + caps: int +NV_GR_ALLOCATION_PARAMETERS_v1A_17: TypeAlias = struct_NV_GR_ALLOCATION_PARAMETERS_v1A_17 +struct_NV_GR_ALLOCATION_PARAMETERS_v1A_17.register_fields([('version', NvU32, 0), ('flags', NvU32, 4), ('size', NvU32, 8), ('caps', NvU32, 12)]) +@c.record +class struct_alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B(c.Struct): + SIZE = 8 + hClient: int + hChannel: int +alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B: TypeAlias = struct_alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B +struct_alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4)]) +@c.record +class struct_alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C(c.Struct): + SIZE = 40 + alignment: int + allocSize: int + pageSize: int + allocFlags: int + map: struct_NV00F8_ALLOCATION_PARAMETERS_MAP_STRUCT_v1E_0C +alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C: TypeAlias = struct_alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C +@c.record +class struct_NV00F8_ALLOCATION_PARAMETERS_MAP_STRUCT_v1E_0C(c.Struct): + SIZE = 16 + offset: int + hVidMem: int + flags: int +NV00F8_ALLOCATION_PARAMETERS_MAP_STRUCT_v1E_0C: TypeAlias = struct_NV00F8_ALLOCATION_PARAMETERS_MAP_STRUCT_v1E_0C +struct_NV00F8_ALLOCATION_PARAMETERS_MAP_STRUCT_v1E_0C.register_fields([('offset', NvU64, 0), ('hVidMem', NvHandle, 8), ('flags', NvU32, 12)]) +struct_alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C.register_fields([('alignment', NvU64, 0), ('allocSize', NvU64, 8), ('pageSize', NvU32, 16), ('allocFlags', NvU32, 20), ('map', NV00F8_ALLOCATION_PARAMETERS_MAP_STRUCT_v1E_0C, 24)]) +@c.record +class struct_alloc_object_NVC9FA_VIDEO_OFA_v1F_00(c.Struct): + SIZE = 8 + size: int + prohibitMultipleInstances: int +alloc_object_NVC9FA_VIDEO_OFA_v1F_00: TypeAlias = struct_alloc_object_NVC9FA_VIDEO_OFA_v1F_00 +struct_alloc_object_NVC9FA_VIDEO_OFA_v1F_00.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4)]) +@c.record +class struct_alloc_object_NV2081_ALLOC_PARAMETERS_v25_08(c.Struct): + SIZE = 4 + reserved: int +alloc_object_NV2081_ALLOC_PARAMETERS_v25_08: TypeAlias = struct_alloc_object_NV2081_ALLOC_PARAMETERS_v25_08 +struct_alloc_object_NV2081_ALLOC_PARAMETERS_v25_08.register_fields([('reserved', NvU32, 0)]) +union_alloc_object_params_v25_08.register_fields([('param_NV50_TESLA', alloc_object_NV50_TESLA_v03_00, 0), ('param_GT212_DMA_COPY', alloc_object_GT212_DMA_COPY_v03_00, 0), ('param_GF100_DISP_SW', alloc_object_GF100_DISP_SW_v03_00, 0), ('param_KEPLER_CHANNEL_GROUP_A', alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08, 0), ('param_FERMI_CONTEXT_SHARE_A', alloc_object_FERMI_CONTEXT_SHARE_A_v04_00, 0), ('param_NVD0B7_VIDEO_ENCODER', alloc_object_NVD0B7_VIDEO_ENCODER_v03_00, 0), ('param_FERMI_VASPACE_A', alloc_object_FERMI_VASPACE_A_v03_00, 0), ('param_NVB0B0_VIDEO_DECODER', alloc_object_NVB0B0_VIDEO_DECODER_v03_00, 0), ('param_NV83DE_ALLOC_PARAMETERS', alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00, 0), ('param_NVENC_SW_SESSION', alloc_object_NVENC_SW_SESSION_v06_01, 0), ('param_NVC4B0_VIDEO_DECODER', alloc_object_NVC4B0_VIDEO_DECODER_v12_02, 0), ('param_NVFBC_SW_SESSION', alloc_object_NVFBC_SW_SESSION_v12_04, 0), ('param_NV_NVJPG_ALLOCATION_PARAMETERS', alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02, 0), ('param_NV503B_ALLOC_PARAMETERS', alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02, 0), ('param_NVC637_ALLOCATION_PARAMETERS', alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00, 0), ('param_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS', alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03, 0), ('param_NVC638_ALLOCATION_PARAMETERS', alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06, 0), ('param_NV503C_ALLOC_PARAMETERS', alloc_object_NV503C_ALLOC_PARAMETERS_v18_15, 0), ('param_NVC670_ALLOCATION_PARAMETERS', alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01, 0), ('param_NVB1CC_ALLOC_PARAMETERS', alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03, 0), ('param_NVB2CC_ALLOC_PARAMETERS', alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03, 0), ('param_NV_GR_ALLOCATION_PARAMETERS', NV_GR_ALLOCATION_PARAMETERS_v1A_17, 0), ('param_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS', alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B, 0), ('param_NV00F8_ALLOCATION_PARAMETERS', alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C, 0), ('param_NVC9FA_VIDEO_OFA', alloc_object_NVC9FA_VIDEO_OFA_v1F_00, 0), ('param_NV2081_ALLOC_PARAMETERS', alloc_object_NV2081_ALLOC_PARAMETERS_v25_08, 0)]) +struct_rpc_alloc_object_v25_08.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClass', NvU32, 12), ('param_len', NvU32, 16), ('params', alloc_object_params_v25_08, 24)]) +rpc_alloc_object_v25_08: TypeAlias = struct_rpc_alloc_object_v25_08 +@c.record +class struct_rpc_alloc_object_v26_00(c.Struct): + SIZE = 80 + hClient: int + hParent: int + hObject: int + hClass: int + param_len: int + params: union_alloc_object_params_v26_00 +@c.record +class union_alloc_object_params_v26_00(c.Struct): + SIZE = 56 + param_NV50_TESLA: struct_alloc_object_NV50_TESLA_v03_00 + param_GT212_DMA_COPY: struct_alloc_object_GT212_DMA_COPY_v03_00 + param_GF100_DISP_SW: struct_alloc_object_GF100_DISP_SW_v03_00 + param_KEPLER_CHANNEL_GROUP_A: struct_alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08 + param_FERMI_CONTEXT_SHARE_A: struct_alloc_object_FERMI_CONTEXT_SHARE_A_v04_00 + param_NVD0B7_VIDEO_ENCODER: struct_alloc_object_NVD0B7_VIDEO_ENCODER_v03_00 + param_FERMI_VASPACE_A: struct_alloc_object_FERMI_VASPACE_A_v03_00 + param_NVB0B0_VIDEO_DECODER: struct_alloc_object_NVB0B0_VIDEO_DECODER_v03_00 + param_NV83DE_ALLOC_PARAMETERS: struct_alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00 + param_NVENC_SW_SESSION: struct_alloc_object_NVENC_SW_SESSION_v06_01 + param_NVC4B0_VIDEO_DECODER: struct_alloc_object_NVC4B0_VIDEO_DECODER_v12_02 + param_NVFBC_SW_SESSION: struct_alloc_object_NVFBC_SW_SESSION_v12_04 + param_NV_NVJPG_ALLOCATION_PARAMETERS: struct_alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02 + param_NV503B_ALLOC_PARAMETERS: struct_alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02 + param_NVC637_ALLOCATION_PARAMETERS: struct_alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00 + param_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS: struct_alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03 + param_NVC638_ALLOCATION_PARAMETERS: struct_alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06 + param_NV503C_ALLOC_PARAMETERS: struct_alloc_object_NV503C_ALLOC_PARAMETERS_v18_15 + param_NVC670_ALLOCATION_PARAMETERS: struct_alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01 + param_NVB1CC_ALLOC_PARAMETERS: struct_alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03 + param_NVB2CC_ALLOC_PARAMETERS: struct_alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03 + param_NV_GR_ALLOCATION_PARAMETERS: struct_NV_GR_ALLOCATION_PARAMETERS_v1A_17 + param_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS: struct_alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B + param_NV00F8_ALLOCATION_PARAMETERS: struct_alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C + param_NVC9FA_VIDEO_OFA: struct_alloc_object_NVC9FA_VIDEO_OFA_v1F_00 + param_NV2081_ALLOC_PARAMETERS: struct_alloc_object_NV2081_ALLOC_PARAMETERS_v25_08 + param_padding: c.Array[ctypes.c_ubyte, Literal[56]] +alloc_object_params_v26_00: TypeAlias = union_alloc_object_params_v26_00 +union_alloc_object_params_v26_00.register_fields([('param_NV50_TESLA', alloc_object_NV50_TESLA_v03_00, 0), ('param_GT212_DMA_COPY', alloc_object_GT212_DMA_COPY_v03_00, 0), ('param_GF100_DISP_SW', alloc_object_GF100_DISP_SW_v03_00, 0), ('param_KEPLER_CHANNEL_GROUP_A', alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08, 0), ('param_FERMI_CONTEXT_SHARE_A', alloc_object_FERMI_CONTEXT_SHARE_A_v04_00, 0), ('param_NVD0B7_VIDEO_ENCODER', alloc_object_NVD0B7_VIDEO_ENCODER_v03_00, 0), ('param_FERMI_VASPACE_A', alloc_object_FERMI_VASPACE_A_v03_00, 0), ('param_NVB0B0_VIDEO_DECODER', alloc_object_NVB0B0_VIDEO_DECODER_v03_00, 0), ('param_NV83DE_ALLOC_PARAMETERS', alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00, 0), ('param_NVENC_SW_SESSION', alloc_object_NVENC_SW_SESSION_v06_01, 0), ('param_NVC4B0_VIDEO_DECODER', alloc_object_NVC4B0_VIDEO_DECODER_v12_02, 0), ('param_NVFBC_SW_SESSION', alloc_object_NVFBC_SW_SESSION_v12_04, 0), ('param_NV_NVJPG_ALLOCATION_PARAMETERS', alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02, 0), ('param_NV503B_ALLOC_PARAMETERS', alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02, 0), ('param_NVC637_ALLOCATION_PARAMETERS', alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00, 0), ('param_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS', alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03, 0), ('param_NVC638_ALLOCATION_PARAMETERS', alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06, 0), ('param_NV503C_ALLOC_PARAMETERS', alloc_object_NV503C_ALLOC_PARAMETERS_v18_15, 0), ('param_NVC670_ALLOCATION_PARAMETERS', alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01, 0), ('param_NVB1CC_ALLOC_PARAMETERS', alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03, 0), ('param_NVB2CC_ALLOC_PARAMETERS', alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03, 0), ('param_NV_GR_ALLOCATION_PARAMETERS', NV_GR_ALLOCATION_PARAMETERS_v1A_17, 0), ('param_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS', alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B, 0), ('param_NV00F8_ALLOCATION_PARAMETERS', alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C, 0), ('param_NVC9FA_VIDEO_OFA', alloc_object_NVC9FA_VIDEO_OFA_v1F_00, 0), ('param_NV2081_ALLOC_PARAMETERS', alloc_object_NV2081_ALLOC_PARAMETERS_v25_08, 0), ('param_padding', c.Array[NvU8, Literal[56]], 0)]) +struct_rpc_alloc_object_v26_00.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClass', NvU32, 12), ('param_len', NvU32, 16), ('params', alloc_object_params_v26_00, 24)]) +rpc_alloc_object_v26_00: TypeAlias = struct_rpc_alloc_object_v26_00 +@c.record +class struct_rpc_alloc_object_v27_00(c.Struct): + SIZE = 80 + hClient: int + hParent: int + hObject: int + hClass: int + param_len: int + params: union_alloc_object_params_v27_00 +@c.record +class union_alloc_object_params_v27_00(c.Struct): + SIZE = 56 + param_NV50_TESLA: struct_alloc_object_NV50_TESLA_v03_00 + param_GT212_DMA_COPY: struct_alloc_object_GT212_DMA_COPY_v03_00 + param_GF100_DISP_SW: struct_alloc_object_GF100_DISP_SW_v03_00 + param_KEPLER_CHANNEL_GROUP_A: struct_alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08 + param_FERMI_CONTEXT_SHARE_A: struct_alloc_object_FERMI_CONTEXT_SHARE_A_v04_00 + param_NVD0B7_VIDEO_ENCODER: struct_alloc_object_NVD0B7_VIDEO_ENCODER_v03_00 + param_FERMI_VASPACE_A: struct_alloc_object_FERMI_VASPACE_A_v03_00 + param_NVB0B0_VIDEO_DECODER: struct_alloc_object_NVB0B0_VIDEO_DECODER_v03_00 + param_NV83DE_ALLOC_PARAMETERS: struct_alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00 + param_NVENC_SW_SESSION: struct_alloc_object_NVENC_SW_SESSION_v06_01 + param_NVC4B0_VIDEO_DECODER: struct_alloc_object_NVC4B0_VIDEO_DECODER_v12_02 + param_NVFBC_SW_SESSION: struct_alloc_object_NVFBC_SW_SESSION_v12_04 + param_NV_NVJPG_ALLOCATION_PARAMETERS: struct_alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02 + param_NV503B_ALLOC_PARAMETERS: struct_alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02 + param_NVC637_ALLOCATION_PARAMETERS: struct_alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00 + param_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS: struct_alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03 + param_NVC638_ALLOCATION_PARAMETERS: struct_alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06 + param_NV503C_ALLOC_PARAMETERS: struct_alloc_object_NV503C_ALLOC_PARAMETERS_v18_15 + param_NVC670_ALLOCATION_PARAMETERS: struct_alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01 + param_NVB1CC_ALLOC_PARAMETERS: struct_alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03 + param_NVB2CC_ALLOC_PARAMETERS: struct_alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03 + param_NV_GR_ALLOCATION_PARAMETERS: struct_NV_GR_ALLOCATION_PARAMETERS_v1A_17 + param_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS: struct_alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B + param_NV00F8_ALLOCATION_PARAMETERS: struct_alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C + param_NVC9FA_VIDEO_OFA: struct_alloc_object_NVC9FA_VIDEO_OFA_v1F_00 + param_NV2081_ALLOC_PARAMETERS: struct_alloc_object_NV2081_ALLOC_PARAMETERS_v25_08 + param_padding: c.Array[ctypes.c_ubyte, Literal[56]] +alloc_object_params_v27_00: TypeAlias = union_alloc_object_params_v27_00 +union_alloc_object_params_v27_00.register_fields([('param_NV50_TESLA', alloc_object_NV50_TESLA_v03_00, 0), ('param_GT212_DMA_COPY', alloc_object_GT212_DMA_COPY_v03_00, 0), ('param_GF100_DISP_SW', alloc_object_GF100_DISP_SW_v03_00, 0), ('param_KEPLER_CHANNEL_GROUP_A', alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08, 0), ('param_FERMI_CONTEXT_SHARE_A', alloc_object_FERMI_CONTEXT_SHARE_A_v04_00, 0), ('param_NVD0B7_VIDEO_ENCODER', alloc_object_NVD0B7_VIDEO_ENCODER_v03_00, 0), ('param_FERMI_VASPACE_A', alloc_object_FERMI_VASPACE_A_v03_00, 0), ('param_NVB0B0_VIDEO_DECODER', alloc_object_NVB0B0_VIDEO_DECODER_v03_00, 0), ('param_NV83DE_ALLOC_PARAMETERS', alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00, 0), ('param_NVENC_SW_SESSION', alloc_object_NVENC_SW_SESSION_v06_01, 0), ('param_NVC4B0_VIDEO_DECODER', alloc_object_NVC4B0_VIDEO_DECODER_v12_02, 0), ('param_NVFBC_SW_SESSION', alloc_object_NVFBC_SW_SESSION_v12_04, 0), ('param_NV_NVJPG_ALLOCATION_PARAMETERS', alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02, 0), ('param_NV503B_ALLOC_PARAMETERS', alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02, 0), ('param_NVC637_ALLOCATION_PARAMETERS', alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00, 0), ('param_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS', alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03, 0), ('param_NVC638_ALLOCATION_PARAMETERS', alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06, 0), ('param_NV503C_ALLOC_PARAMETERS', alloc_object_NV503C_ALLOC_PARAMETERS_v18_15, 0), ('param_NVC670_ALLOCATION_PARAMETERS', alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01, 0), ('param_NVB1CC_ALLOC_PARAMETERS', alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03, 0), ('param_NVB2CC_ALLOC_PARAMETERS', alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03, 0), ('param_NV_GR_ALLOCATION_PARAMETERS', NV_GR_ALLOCATION_PARAMETERS_v1A_17, 0), ('param_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS', alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B, 0), ('param_NV00F8_ALLOCATION_PARAMETERS', alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C, 0), ('param_NVC9FA_VIDEO_OFA', alloc_object_NVC9FA_VIDEO_OFA_v1F_00, 0), ('param_NV2081_ALLOC_PARAMETERS', alloc_object_NV2081_ALLOC_PARAMETERS_v25_08, 0), ('param_padding', c.Array[NvU8, Literal[56]], 0)]) +struct_rpc_alloc_object_v27_00.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClass', NvU32, 12), ('param_len', NvU32, 16), ('params', alloc_object_params_v27_00, 24)]) +rpc_alloc_object_v27_00: TypeAlias = struct_rpc_alloc_object_v27_00 +@c.record +class struct_rpc_alloc_object_v29_06(c.Struct): + SIZE = 80 + hClient: int + hParent: int + hObject: int + hClass: int + param_len: int + params: union_alloc_object_params_v29_06 +@c.record +class union_alloc_object_params_v29_06(c.Struct): + SIZE = 56 + param_NV50_TESLA: struct_alloc_object_NV50_TESLA_v03_00 + param_GT212_DMA_COPY: struct_alloc_object_GT212_DMA_COPY_v03_00 + param_GF100_DISP_SW: struct_alloc_object_GF100_DISP_SW_v03_00 + param_KEPLER_CHANNEL_GROUP_A: struct_alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08 + param_FERMI_CONTEXT_SHARE_A: struct_alloc_object_FERMI_CONTEXT_SHARE_A_v04_00 + param_NVD0B7_VIDEO_ENCODER: struct_alloc_object_NVD0B7_VIDEO_ENCODER_v03_00 + param_FERMI_VASPACE_A: struct_alloc_object_FERMI_VASPACE_A_v03_00 + param_NVB0B0_VIDEO_DECODER: struct_alloc_object_NVB0B0_VIDEO_DECODER_v03_00 + param_NV83DE_ALLOC_PARAMETERS: struct_alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00 + param_NVENC_SW_SESSION: struct_alloc_object_NVENC_SW_SESSION_v06_01 + param_NVC4B0_VIDEO_DECODER: struct_alloc_object_NVC4B0_VIDEO_DECODER_v12_02 + param_NVFBC_SW_SESSION: struct_alloc_object_NVFBC_SW_SESSION_v12_04 + param_NV_NVJPG_ALLOCATION_PARAMETERS: struct_alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02 + param_NV503B_ALLOC_PARAMETERS: struct_alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02 + param_NVC637_ALLOCATION_PARAMETERS: struct_alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00 + param_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS: struct_alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03 + param_NVC638_ALLOCATION_PARAMETERS: struct_alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06 + param_NV503C_ALLOC_PARAMETERS: struct_alloc_object_NV503C_ALLOC_PARAMETERS_v18_15 + param_NVC670_ALLOCATION_PARAMETERS: struct_alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01 + param_NVB1CC_ALLOC_PARAMETERS: struct_alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03 + param_NVB2CC_ALLOC_PARAMETERS: struct_alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03 + param_NV_GR_ALLOCATION_PARAMETERS: struct_NV_GR_ALLOCATION_PARAMETERS_v1A_17 + param_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS: struct_alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B + param_NV00F8_ALLOCATION_PARAMETERS: struct_alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C + param_NVC9FA_VIDEO_OFA: struct_alloc_object_NVC9FA_VIDEO_OFA_v29_06 + param_NV2081_ALLOC_PARAMETERS: struct_alloc_object_NV2081_ALLOC_PARAMETERS_v25_08 + param_padding: c.Array[ctypes.c_ubyte, Literal[56]] +alloc_object_params_v29_06: TypeAlias = union_alloc_object_params_v29_06 +@c.record +class struct_alloc_object_NVC9FA_VIDEO_OFA_v29_06(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +alloc_object_NVC9FA_VIDEO_OFA_v29_06: TypeAlias = struct_alloc_object_NVC9FA_VIDEO_OFA_v29_06 +struct_alloc_object_NVC9FA_VIDEO_OFA_v29_06.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +union_alloc_object_params_v29_06.register_fields([('param_NV50_TESLA', alloc_object_NV50_TESLA_v03_00, 0), ('param_GT212_DMA_COPY', alloc_object_GT212_DMA_COPY_v03_00, 0), ('param_GF100_DISP_SW', alloc_object_GF100_DISP_SW_v03_00, 0), ('param_KEPLER_CHANNEL_GROUP_A', alloc_object_KEPLER_CHANNEL_GROUP_A_v12_08, 0), ('param_FERMI_CONTEXT_SHARE_A', alloc_object_FERMI_CONTEXT_SHARE_A_v04_00, 0), ('param_NVD0B7_VIDEO_ENCODER', alloc_object_NVD0B7_VIDEO_ENCODER_v03_00, 0), ('param_FERMI_VASPACE_A', alloc_object_FERMI_VASPACE_A_v03_00, 0), ('param_NVB0B0_VIDEO_DECODER', alloc_object_NVB0B0_VIDEO_DECODER_v03_00, 0), ('param_NV83DE_ALLOC_PARAMETERS', alloc_object_NV83DE_ALLOC_PARAMETERS_v03_00, 0), ('param_NVENC_SW_SESSION', alloc_object_NVENC_SW_SESSION_v06_01, 0), ('param_NVC4B0_VIDEO_DECODER', alloc_object_NVC4B0_VIDEO_DECODER_v12_02, 0), ('param_NVFBC_SW_SESSION', alloc_object_NVFBC_SW_SESSION_v12_04, 0), ('param_NV_NVJPG_ALLOCATION_PARAMETERS', alloc_object_NV_NVJPG_ALLOCATION_PARAMETERS_v20_02, 0), ('param_NV503B_ALLOC_PARAMETERS', alloc_object_NV503B_ALLOC_PARAMETERS_v1D_02, 0), ('param_NVC637_ALLOCATION_PARAMETERS', alloc_object_NVC637_ALLOCATION_PARAMETERS_v13_00, 0), ('param_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS', alloc_object_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_v13_03, 0), ('param_NVC638_ALLOCATION_PARAMETERS', alloc_object_NVC638_ALLOCATION_PARAMETERS_v18_06, 0), ('param_NV503C_ALLOC_PARAMETERS', alloc_object_NV503C_ALLOC_PARAMETERS_v18_15, 0), ('param_NVC670_ALLOCATION_PARAMETERS', alloc_object_NVC670_ALLOCATION_PARAMETERS_v1A_01, 0), ('param_NVB1CC_ALLOC_PARAMETERS', alloc_object_NVB1CC_ALLOC_PARAMETERS_v1A_03, 0), ('param_NVB2CC_ALLOC_PARAMETERS', alloc_object_NVB2CC_ALLOC_PARAMETERS_v1A_03, 0), ('param_NV_GR_ALLOCATION_PARAMETERS', NV_GR_ALLOCATION_PARAMETERS_v1A_17, 0), ('param_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS', alloc_object_NV_UVM_CHANNEL_RETAINER_ALLOC_PARAMS_v1A_1B, 0), ('param_NV00F8_ALLOCATION_PARAMETERS', alloc_object_NV00F8_ALLOCATION_PARAMETERS_v1E_0C, 0), ('param_NVC9FA_VIDEO_OFA', alloc_object_NVC9FA_VIDEO_OFA_v29_06, 0), ('param_NV2081_ALLOC_PARAMETERS', alloc_object_NV2081_ALLOC_PARAMETERS_v25_08, 0), ('param_padding', c.Array[NvU8, Literal[56]], 0)]) +struct_rpc_alloc_object_v29_06.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClass', NvU32, 12), ('param_len', NvU32, 16), ('params', alloc_object_params_v29_06, 24)]) +rpc_alloc_object_v29_06: TypeAlias = struct_rpc_alloc_object_v29_06 +rpc_alloc_object_v: TypeAlias = struct_rpc_alloc_object_v29_06 +@c.record +class struct_rpc_free_v03_00(c.Struct): + SIZE = 16 + params: struct_NVOS00_PARAMETERS_v03_00 +@c.record +class struct_NVOS00_PARAMETERS_v03_00(c.Struct): + SIZE = 16 + hRoot: int + hObjectParent: int + hObjectOld: int + status: int +NVOS00_PARAMETERS_v03_00: TypeAlias = struct_NVOS00_PARAMETERS_v03_00 +NvV32: TypeAlias = ctypes.c_uint32 +struct_NVOS00_PARAMETERS_v03_00.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectOld', NvHandle, 8), ('status', NvV32, 12)]) +struct_rpc_free_v03_00.register_fields([('params', NVOS00_PARAMETERS_v03_00, 0)]) +rpc_free_v03_00: TypeAlias = struct_rpc_free_v03_00 +rpc_free_v: TypeAlias = struct_rpc_free_v03_00 +@c.record +class struct_rpc_log_v03_00(c.Struct): + SIZE = 8 + level: int + log_len: int + log_msg: c.Array[ctypes.c_char, Literal[0]] +struct_rpc_log_v03_00.register_fields([('level', NvU32, 0), ('log_len', NvU32, 4), ('log_msg', c.Array[ctypes.c_char, Literal[0]], 8)]) +rpc_log_v03_00: TypeAlias = struct_rpc_log_v03_00 +rpc_log_v: TypeAlias = struct_rpc_log_v03_00 +@c.record +class struct_rpc_map_memory_dma_v03_00(c.Struct): + SIZE = 56 + params: struct_NVOS46_PARAMETERS_v03_00 +@c.record +class struct_NVOS46_PARAMETERS_v03_00(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hDma: int + hMemory: int + offset: int + length: int + flags: int + dmaOffset: int + status: int +NVOS46_PARAMETERS_v03_00: TypeAlias = struct_NVOS46_PARAMETERS_v03_00 +struct_NVOS46_PARAMETERS_v03_00.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hDma', NvHandle, 8), ('hMemory', NvHandle, 12), ('offset', NvU64, 16), ('length', NvU64, 24), ('flags', NvV32, 32), ('dmaOffset', NvU64, 40), ('status', NvV32, 48)]) +struct_rpc_map_memory_dma_v03_00.register_fields([('params', NVOS46_PARAMETERS_v03_00, 0)]) +rpc_map_memory_dma_v03_00: TypeAlias = struct_rpc_map_memory_dma_v03_00 +rpc_map_memory_dma_v: TypeAlias = struct_rpc_map_memory_dma_v03_00 +@c.record +class struct_rpc_unmap_memory_dma_v03_00(c.Struct): + SIZE = 40 + params: struct_NVOS47_PARAMETERS_v03_00 +@c.record +class struct_NVOS47_PARAMETERS_v03_00(c.Struct): + SIZE = 40 + hClient: int + hDevice: int + hDma: int + hMemory: int + flags: int + dmaOffset: int + status: int +NVOS47_PARAMETERS_v03_00: TypeAlias = struct_NVOS47_PARAMETERS_v03_00 +struct_NVOS47_PARAMETERS_v03_00.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hDma', NvHandle, 8), ('hMemory', NvHandle, 12), ('flags', NvV32, 16), ('dmaOffset', NvU64, 24), ('status', NvV32, 32)]) +struct_rpc_unmap_memory_dma_v03_00.register_fields([('params', NVOS47_PARAMETERS_v03_00, 0)]) +rpc_unmap_memory_dma_v03_00: TypeAlias = struct_rpc_unmap_memory_dma_v03_00 +rpc_unmap_memory_dma_v: TypeAlias = struct_rpc_unmap_memory_dma_v03_00 +@c.record +class struct_rpc_alloc_subdevice_v08_01(c.Struct): + SIZE = 40 + subDeviceInst: int + params: struct_NVOS21_PARAMETERS_v03_00 +@c.record +class struct_NVOS21_PARAMETERS_v03_00(c.Struct): + SIZE = 32 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + pAllocParms: ctypes.c_void_p + status: int +NVOS21_PARAMETERS_v03_00: TypeAlias = struct_NVOS21_PARAMETERS_v03_00 +NvP64: TypeAlias = ctypes.c_void_p +struct_NVOS21_PARAMETERS_v03_00.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('pAllocParms', NvP64, 16), ('status', NvV32, 24)]) +struct_rpc_alloc_subdevice_v08_01.register_fields([('subDeviceInst', NvU32, 0), ('params', NVOS21_PARAMETERS_v03_00, 8)]) +rpc_alloc_subdevice_v08_01: TypeAlias = struct_rpc_alloc_subdevice_v08_01 +rpc_alloc_subdevice_v: TypeAlias = struct_rpc_alloc_subdevice_v08_01 +@c.record +class struct_rpc_dup_object_v03_00(c.Struct): + SIZE = 28 + params: struct_NVOS55_PARAMETERS_v03_00 +@c.record +class struct_NVOS55_PARAMETERS_v03_00(c.Struct): + SIZE = 28 + hClient: int + hParent: int + hObject: int + hClientSrc: int + hObjectSrc: int + flags: int + status: int +NVOS55_PARAMETERS_v03_00: TypeAlias = struct_NVOS55_PARAMETERS_v03_00 +struct_NVOS55_PARAMETERS_v03_00.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClientSrc', NvHandle, 12), ('hObjectSrc', NvHandle, 16), ('flags', NvU32, 20), ('status', NvU32, 24)]) +struct_rpc_dup_object_v03_00.register_fields([('params', NVOS55_PARAMETERS_v03_00, 0)]) +rpc_dup_object_v03_00: TypeAlias = struct_rpc_dup_object_v03_00 +rpc_dup_object_v: TypeAlias = struct_rpc_dup_object_v03_00 +@c.record +class struct_rpc_idle_channels_v03_00(c.Struct): + SIZE = 12 + flags: int + timeout: int + nchannels: int + channel_list: c.Array[struct_idle_channel_list_v03_00, Literal[0]] +@c.record +class struct_idle_channel_list_v03_00(c.Struct): + SIZE = 12 + phClient: int + phDevice: int + phChannel: int +idle_channel_list_v03_00: TypeAlias = struct_idle_channel_list_v03_00 +struct_idle_channel_list_v03_00.register_fields([('phClient', NvU32, 0), ('phDevice', NvU32, 4), ('phChannel', NvU32, 8)]) +struct_rpc_idle_channels_v03_00.register_fields([('flags', NvU32, 0), ('timeout', NvU32, 4), ('nchannels', NvU32, 8), ('channel_list', c.Array[idle_channel_list_v03_00, Literal[0]], 12)]) +rpc_idle_channels_v03_00: TypeAlias = struct_rpc_idle_channels_v03_00 +rpc_idle_channels_v: TypeAlias = struct_rpc_idle_channels_v03_00 +@c.record +class struct_rpc_alloc_event_v03_00(c.Struct): + SIZE = 28 + hClient: int + hParentClient: int + hChannel: int + hObject: int + hEvent: int + hClass: int + notifyIndex: int +struct_rpc_alloc_event_v03_00.register_fields([('hClient', NvHandle, 0), ('hParentClient', NvHandle, 4), ('hChannel', NvHandle, 8), ('hObject', NvHandle, 12), ('hEvent', NvHandle, 16), ('hClass', NvU32, 20), ('notifyIndex', NvU32, 24)]) +rpc_alloc_event_v03_00: TypeAlias = struct_rpc_alloc_event_v03_00 +rpc_alloc_event_v: TypeAlias = struct_rpc_alloc_event_v03_00 +@c.record +class struct_rpc_rm_api_control_v25_0D(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +@c.record +class struct_NVOS54_PARAMETERS_v03_00(c.Struct): + SIZE = 32 + hClient: int + hObject: int + cmd: int + params: ctypes.c_void_p + paramsSize: int + status: int +NVOS54_PARAMETERS_v03_00: TypeAlias = struct_NVOS54_PARAMETERS_v03_00 +NvRmctrlCmd: TypeAlias = ctypes.c_uint32 +struct_NVOS54_PARAMETERS_v03_00.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvRmctrlCmd, 8), ('params', NvP64, 16), ('paramsSize', NvU32, 24), ('status', NvV32, 28)]) +struct_rpc_rm_api_control_v25_0D.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_0D: TypeAlias = struct_rpc_rm_api_control_v25_0D +@c.record +class struct_rpc_rm_api_control_v25_0F(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_0F.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_0F: TypeAlias = struct_rpc_rm_api_control_v25_0F +@c.record +class struct_rpc_rm_api_control_v25_10(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_10.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_10: TypeAlias = struct_rpc_rm_api_control_v25_10 +@c.record +class struct_rpc_rm_api_control_v25_14(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_14.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_14: TypeAlias = struct_rpc_rm_api_control_v25_14 +@c.record +class struct_rpc_rm_api_control_v25_15(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_15.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_15: TypeAlias = struct_rpc_rm_api_control_v25_15 +@c.record +class struct_rpc_rm_api_control_v25_16(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_16.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_16: TypeAlias = struct_rpc_rm_api_control_v25_16 +@c.record +class struct_rpc_rm_api_control_v25_17(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_17.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_17: TypeAlias = struct_rpc_rm_api_control_v25_17 +@c.record +class struct_rpc_rm_api_control_v25_18(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_18.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_18: TypeAlias = struct_rpc_rm_api_control_v25_18 +@c.record +class struct_rpc_rm_api_control_v25_19(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_19.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_19: TypeAlias = struct_rpc_rm_api_control_v25_19 +@c.record +class struct_rpc_rm_api_control_v25_1A(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v25_1A.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v25_1A: TypeAlias = struct_rpc_rm_api_control_v25_1A +@c.record +class struct_rpc_rm_api_control_v27_03(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v27_03.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v27_03: TypeAlias = struct_rpc_rm_api_control_v27_03 +@c.record +class struct_rpc_rm_api_control_v29_04(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v29_04.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v29_04: TypeAlias = struct_rpc_rm_api_control_v29_04 +@c.record +class struct_rpc_rm_api_control_v29_09(c.Struct): + SIZE = 40 + params: struct_NVOS54_PARAMETERS_v03_00 + rm_api_params: ctypes.c_void_p +struct_rpc_rm_api_control_v29_09.register_fields([('params', NVOS54_PARAMETERS_v03_00, 0), ('rm_api_params', NvP64, 32)]) +rpc_rm_api_control_v29_09: TypeAlias = struct_rpc_rm_api_control_v29_09 +rpc_rm_api_control_v: TypeAlias = struct_rpc_rm_api_control_v29_09 +@c.record +class struct_rpc_alloc_share_device_v03_00(c.Struct): + SIZE = 64 + hClient: int + hDevice: int + hClass: int + params: struct_NV_DEVICE_ALLOCATION_PARAMETERS_v03_00 +@c.record +class struct_NV_DEVICE_ALLOCATION_PARAMETERS_v03_00(c.Struct): + SIZE = 48 + szName: ctypes.c_void_p + hClientShare: int + hTargetClient: int + hTargetDevice: int + flags: int + vaSpaceSize: int + vaMode: int + vaBase: int +NV_DEVICE_ALLOCATION_PARAMETERS_v03_00: TypeAlias = struct_NV_DEVICE_ALLOCATION_PARAMETERS_v03_00 +struct_NV_DEVICE_ALLOCATION_PARAMETERS_v03_00.register_fields([('szName', NvP64, 0), ('hClientShare', NvHandle, 8), ('hTargetClient', NvHandle, 12), ('hTargetDevice', NvHandle, 16), ('flags', NvV32, 20), ('vaSpaceSize', NvU64, 24), ('vaMode', NvV32, 32), ('vaBase', NvU64, 40)]) +struct_rpc_alloc_share_device_v03_00.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hClass', NvU32, 8), ('params', NV_DEVICE_ALLOCATION_PARAMETERS_v03_00, 16)]) +rpc_alloc_share_device_v03_00: TypeAlias = struct_rpc_alloc_share_device_v03_00 +rpc_alloc_share_device_v: TypeAlias = struct_rpc_alloc_share_device_v03_00 +@c.record +class struct_rpc_get_engine_utilization_v1F_0E(c.Struct): + SIZE = 4048 + hClient: int + hObject: int + cmd: int + params: union_vgpuGetEngineUtilization_data_v1F_0E +@c.record +class union_vgpuGetEngineUtilization_data_v1F_0E(c.Struct): + SIZE = 4032 + vidPerfmonSample: struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_v05_00 + getAccountingState: struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_v09_0C + setAccountingState: struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_v09_0C + getAccountingPidList: struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_v09_0C + procAccountingInfo: struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_v09_0C + clearAccountingInfo: struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_v09_0C + gpumonPerfmonsampleV2: c.Array[struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE_v1F_0E, Literal[72]] +vgpuGetEngineUtilization_data_v1F_0E: TypeAlias = union_vgpuGetEngineUtilization_data_v1F_0E +@c.record +class struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_v05_00(c.Struct): + SIZE = 12 + engineType: int + clkPercentBusy: int + samplingPeriodUs: int +NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_v05_00: TypeAlias = struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_v05_00 +enum_NV2080_CTRL_CMD_PERF_VID_ENG: dict[int, str] = {(NV2080_CTRL_CMD_PERF_VID_ENG_NVENC:=1): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVENC', (NV2080_CTRL_CMD_PERF_VID_ENG_NVDEC:=2): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVDEC', (NV2080_CTRL_CMD_PERF_VID_ENG_NVJPG:=3): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVJPG', (NV2080_CTRL_CMD_PERF_VID_ENG_NVOFA:=4): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVOFA'} +NV2080_CTRL_CMD_PERF_VID_ENG: TypeAlias = ctypes.c_uint32 +struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_v05_00.register_fields([('engineType', NV2080_CTRL_CMD_PERF_VID_ENG, 0), ('clkPercentBusy', NvU32, 4), ('samplingPeriodUs', NvU32, 8)]) +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_v09_0C(c.Struct): + SIZE = 12 + gpuId: int + vmPid: int + state: int +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_v09_0C: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_v09_0C +struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_v09_0C.register_fields([('gpuId', NvU32, 0), ('vmPid', NvU32, 4), ('state', NvU32, 8)]) +@c.record +class struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_v09_0C(c.Struct): + SIZE = 12 + gpuId: int + vmPid: int + newState: int +NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_v09_0C: TypeAlias = struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_v09_0C +struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_v09_0C.register_fields([('gpuId', NvU32, 0), ('vmPid', NvU32, 4), ('newState', NvU32, 8)]) +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_v09_0C(c.Struct): + SIZE = 4016 + gpuId: int + vmPid: int + passIndex: int + pidCount: int + pidTable: c.Array[ctypes.c_uint32, Literal[1000]] +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_v09_0C: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_v09_0C +struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_v09_0C.register_fields([('gpuId', NvU32, 0), ('vmPid', NvU32, 4), ('passIndex', NvU32, 8), ('pidCount', NvU32, 12), ('pidTable', c.Array[NvU32, Literal[1000]], 16)]) +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_v09_0C(c.Struct): + SIZE = 48 + gpuId: int + pid: int + subPid: int + gpuUtil: int + fbUtil: int + maxFbUsage: int + startTime: int + endTime: int +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_v09_0C: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_v09_0C +struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_v09_0C.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('subPid', NvU32, 8), ('gpuUtil', NvU32, 12), ('fbUtil', NvU32, 16), ('maxFbUsage', NvU64, 24), ('startTime', NvU64, 32), ('endTime', NvU64, 40)]) +@c.record +class struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_v09_0C(c.Struct): + SIZE = 8 + gpuId: int + vmPid: int +NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_v09_0C: TypeAlias = struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_v09_0C +struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_v09_0C.register_fields([('gpuId', NvU32, 0), ('vmPid', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE_v1F_0E(c.Struct): + SIZE = 56 + timeStamp: int + fb: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00 + gr: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00 + nvenc: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00 + nvdec: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00 +NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE_v1F_0E: TypeAlias = struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE_v1F_0E +@c.record +class struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00(c.Struct): + SIZE = 12 + util: int + procId: int + subProcessID: int +NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00: TypeAlias = struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00 +struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00.register_fields([('util', NvU32, 0), ('procId', NvU32, 4), ('subProcessID', NvU32, 8)]) +struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE_v1F_0E.register_fields([('timeStamp', NvU64, 0), ('fb', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00, 8), ('gr', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00, 20), ('nvenc', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00, 32), ('nvdec', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE_v17_00, 44)]) +union_vgpuGetEngineUtilization_data_v1F_0E.register_fields([('vidPerfmonSample', NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_v05_00, 0), ('getAccountingState', NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_v09_0C, 0), ('setAccountingState', NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_v09_0C, 0), ('getAccountingPidList', NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_v09_0C, 0), ('procAccountingInfo', NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_v09_0C, 0), ('clearAccountingInfo', NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_v09_0C, 0), ('gpumonPerfmonsampleV2', c.Array[NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE_v1F_0E, Literal[72]], 0)]) +struct_rpc_get_engine_utilization_v1F_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvU32, 8), ('params', vgpuGetEngineUtilization_data_v1F_0E, 16)]) +rpc_get_engine_utilization_v1F_0E: TypeAlias = struct_rpc_get_engine_utilization_v1F_0E +rpc_get_engine_utilization_v: TypeAlias = struct_rpc_get_engine_utilization_v1F_0E +@c.record +class struct_rpc_perf_get_level_info_v03_00(c.Struct): + SIZE = 24 + hClient: int + hObject: int + level: int + flags: int + perfGetClkInfoListSize: int + param_size: int + params: c.Array[ctypes.c_uint32, Literal[0]] +struct_rpc_perf_get_level_info_v03_00.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('level', NvU32, 8), ('flags', NvU32, 12), ('perfGetClkInfoListSize', NvU32, 16), ('param_size', NvU32, 20), ('params', c.Array[NvU32, Literal[0]], 24)]) +rpc_perf_get_level_info_v03_00: TypeAlias = struct_rpc_perf_get_level_info_v03_00 +rpc_perf_get_level_info_v: TypeAlias = struct_rpc_perf_get_level_info_v03_00 +@c.record +class struct_rpc_set_surface_properties_v07_07(c.Struct): + SIZE = 76 + hClient: int + params: struct_NVA080_CTRL_VGPU_DISPLAY_SET_SURFACE_PROPERTIES_v07_07 +@c.record +class struct_NVA080_CTRL_VGPU_DISPLAY_SET_SURFACE_PROPERTIES_v07_07(c.Struct): + SIZE = 72 + headIndex: int + isPrimary: int + offset: int + surfaceType: int + surfaceBlockHeight: int + surfacePitch: int + surfaceFormat: int + surfaceWidth: int + surfaceHeight: int + rectX: int + rectY: int + rectWidth: int + rectHeight: int + surfaceSize: int + surfaceKind: int + hHwResDevice: int + hHwResHandle: int + effectiveFbPageSize: int +NVA080_CTRL_VGPU_DISPLAY_SET_SURFACE_PROPERTIES_v07_07: TypeAlias = struct_NVA080_CTRL_VGPU_DISPLAY_SET_SURFACE_PROPERTIES_v07_07 +struct_NVA080_CTRL_VGPU_DISPLAY_SET_SURFACE_PROPERTIES_v07_07.register_fields([('headIndex', NvU32, 0), ('isPrimary', NvU32, 4), ('offset', NvU32, 8), ('surfaceType', NvU32, 12), ('surfaceBlockHeight', NvU32, 16), ('surfacePitch', NvU32, 20), ('surfaceFormat', NvU32, 24), ('surfaceWidth', NvU32, 28), ('surfaceHeight', NvU32, 32), ('rectX', NvU32, 36), ('rectY', NvU32, 40), ('rectWidth', NvU32, 44), ('rectHeight', NvU32, 48), ('surfaceSize', NvU32, 52), ('surfaceKind', NvU32, 56), ('hHwResDevice', NvU32, 60), ('hHwResHandle', NvU32, 64), ('effectiveFbPageSize', NvU32, 68)]) +struct_rpc_set_surface_properties_v07_07.register_fields([('hClient', NvHandle, 0), ('params', NVA080_CTRL_VGPU_DISPLAY_SET_SURFACE_PROPERTIES_v07_07, 4)]) +rpc_set_surface_properties_v07_07: TypeAlias = struct_rpc_set_surface_properties_v07_07 +rpc_set_surface_properties_v: TypeAlias = struct_rpc_set_surface_properties_v07_07 +@c.record +class struct_rpc_cleanup_surface_v03_00(c.Struct): + SIZE = 8 + params: struct_NVA080_CTRL_VGPU_DISPLAY_CLEANUP_SURFACE_PARAMS_v03_00 +@c.record +class struct_NVA080_CTRL_VGPU_DISPLAY_CLEANUP_SURFACE_PARAMS_v03_00(c.Struct): + SIZE = 8 + headIndex: int + blankingEnabled: int +NVA080_CTRL_VGPU_DISPLAY_CLEANUP_SURFACE_PARAMS_v03_00: TypeAlias = struct_NVA080_CTRL_VGPU_DISPLAY_CLEANUP_SURFACE_PARAMS_v03_00 +struct_NVA080_CTRL_VGPU_DISPLAY_CLEANUP_SURFACE_PARAMS_v03_00.register_fields([('headIndex', NvU32, 0), ('blankingEnabled', NvU32, 4)]) +struct_rpc_cleanup_surface_v03_00.register_fields([('params', NVA080_CTRL_VGPU_DISPLAY_CLEANUP_SURFACE_PARAMS_v03_00, 0)]) +rpc_cleanup_surface_v03_00: TypeAlias = struct_rpc_cleanup_surface_v03_00 +rpc_cleanup_surface_v: TypeAlias = struct_rpc_cleanup_surface_v03_00 +@c.record +class struct_rpc_unloading_guest_driver_v1F_07(c.Struct): + SIZE = 8 + bInPMTransition: int + bGc6Entering: int + newLevel: int +struct_rpc_unloading_guest_driver_v1F_07.register_fields([('bInPMTransition', NvBool, 0), ('bGc6Entering', NvBool, 1), ('newLevel', NvU32, 4)]) +rpc_unloading_guest_driver_v1F_07: TypeAlias = struct_rpc_unloading_guest_driver_v1F_07 +rpc_unloading_guest_driver_v: TypeAlias = struct_rpc_unloading_guest_driver_v1F_07 +@c.record +class struct_rpc_gpu_exec_reg_ops_v12_01(c.Struct): + SIZE = 56 + hClient: int + hObject: int + params: struct_gpu_exec_reg_ops_v12_01 +@c.record +class struct_gpu_exec_reg_ops_v12_01(c.Struct): + SIZE = 48 + reg_op_params: struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_v12_01 + operations: c.Array[struct_NV2080_CTRL_GPU_REG_OP_v03_00, Literal[0]] +gpu_exec_reg_ops_v12_01: TypeAlias = struct_gpu_exec_reg_ops_v12_01 +@c.record +class struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_v12_01(c.Struct): + SIZE = 48 + hClientTarget: int + hChannelTarget: int + reserved00: c.Array[ctypes.c_uint32, Literal[3]] + regOpCount: int + grRouteInfo: struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01 + regOps: ctypes.c_void_p +NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_v12_01: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_v12_01 +@c.record +class struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01(c.Struct): + SIZE = 16 + flags: int + route: int +NV2080_CTRL_GR_ROUTE_INFO_v12_01: TypeAlias = struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01 +struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01.register_fields([('flags', NvU32, 0), ('route', NvU64, 8)]) +struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_v12_01.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('reserved00', c.Array[NvU32, Literal[3]], 8), ('regOpCount', NvU32, 20), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO_v12_01, 24), ('regOps', NvP64, 40)]) +@c.record +class struct_NV2080_CTRL_GPU_REG_OP_v03_00(c.Struct): + SIZE = 32 + regOp: int + regType: int + regStatus: int + regQuad: int + regGroupMask: int + regSubGroupMask: int + regOffset: int + regValueHi: int + regValueLo: int + regAndNMaskHi: int + regAndNMaskLo: int +NV2080_CTRL_GPU_REG_OP_v03_00: TypeAlias = struct_NV2080_CTRL_GPU_REG_OP_v03_00 +struct_NV2080_CTRL_GPU_REG_OP_v03_00.register_fields([('regOp', NvU8, 0), ('regType', NvU8, 1), ('regStatus', NvU8, 2), ('regQuad', NvU8, 3), ('regGroupMask', NvU32, 4), ('regSubGroupMask', NvU32, 8), ('regOffset', NvU32, 12), ('regValueHi', NvU32, 16), ('regValueLo', NvU32, 20), ('regAndNMaskHi', NvU32, 24), ('regAndNMaskLo', NvU32, 28)]) +struct_gpu_exec_reg_ops_v12_01.register_fields([('reg_op_params', NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_v12_01, 0), ('operations', c.Array[NV2080_CTRL_GPU_REG_OP_v03_00, Literal[0]], 48)]) +struct_rpc_gpu_exec_reg_ops_v12_01.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', gpu_exec_reg_ops_v12_01, 8)]) +rpc_gpu_exec_reg_ops_v12_01: TypeAlias = struct_rpc_gpu_exec_reg_ops_v12_01 +rpc_gpu_exec_reg_ops_v: TypeAlias = struct_rpc_gpu_exec_reg_ops_v12_01 +@c.record +class struct_rpc_get_static_data_v25_0E(c.Struct): + SIZE = 8 + offset: int + size: int + payload: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_get_static_data_v25_0E.register_fields([('offset', NvU32, 0), ('size', NvU32, 4), ('payload', c.Array[NvU8, Literal[0]], 8)]) +rpc_get_static_data_v25_0E: TypeAlias = struct_rpc_get_static_data_v25_0E +@c.record +class struct_rpc_get_static_data_v27_01(c.Struct): + SIZE = 8 + offset: int + size: int + payload: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_get_static_data_v27_01.register_fields([('offset', NvU32, 0), ('size', NvU32, 4), ('payload', c.Array[NvU8, Literal[0]], 8)]) +rpc_get_static_data_v27_01: TypeAlias = struct_rpc_get_static_data_v27_01 +rpc_get_static_data_v: TypeAlias = struct_rpc_get_static_data_v27_01 +@c.record +class struct_rpc_get_consolidated_gr_static_info_v1B_04(c.Struct): + SIZE = 8 + offset: int + size: int + payload: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_get_consolidated_gr_static_info_v1B_04.register_fields([('offset', NvU32, 0), ('size', NvU32, 4), ('payload', c.Array[NvU8, Literal[0]], 8)]) +rpc_get_consolidated_gr_static_info_v1B_04: TypeAlias = struct_rpc_get_consolidated_gr_static_info_v1B_04 +rpc_get_consolidated_gr_static_info_v: TypeAlias = struct_rpc_get_consolidated_gr_static_info_v1B_04 +@c.record +class struct_rpc_set_page_directory_v1E_05(c.Struct): + SIZE = 48 + hClient: int + hDevice: int + pasid: int + params: struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_v1E_05 +@c.record +class struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_v1E_05(c.Struct): + SIZE = 32 + physAddress: int + numEntries: int + flags: int + hVASpace: int + chId: int + subDeviceId: int + pasid: int +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_v1E_05: TypeAlias = struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_v1E_05 +struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_v1E_05.register_fields([('physAddress', NvU64, 0), ('numEntries', NvU32, 8), ('flags', NvU32, 12), ('hVASpace', NvHandle, 16), ('chId', NvU32, 20), ('subDeviceId', NvU32, 24), ('pasid', NvU32, 28)]) +struct_rpc_set_page_directory_v1E_05.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('pasid', NvU32, 8), ('params', NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_v1E_05, 16)]) +rpc_set_page_directory_v1E_05: TypeAlias = struct_rpc_set_page_directory_v1E_05 +rpc_set_page_directory_v: TypeAlias = struct_rpc_set_page_directory_v1E_05 +@c.record +class struct_rpc_unset_page_directory_v1E_05(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + params: struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_v1E_05 +@c.record +class struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_v1E_05(c.Struct): + SIZE = 8 + hVASpace: int + subDeviceId: int +NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_v1E_05: TypeAlias = struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_v1E_05 +struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_v1E_05.register_fields([('hVASpace', NvHandle, 0), ('subDeviceId', NvU32, 4)]) +struct_rpc_unset_page_directory_v1E_05.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('params', NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_v1E_05, 8)]) +rpc_unset_page_directory_v1E_05: TypeAlias = struct_rpc_unset_page_directory_v1E_05 +rpc_unset_page_directory_v: TypeAlias = struct_rpc_unset_page_directory_v1E_05 +@c.record +class struct_rpc_get_gsp_static_info_v14_00(c.Struct): + SIZE = 4 + data: int +struct_rpc_get_gsp_static_info_v14_00.register_fields([('data', NvU32, 0)]) +rpc_get_gsp_static_info_v14_00: TypeAlias = struct_rpc_get_gsp_static_info_v14_00 +rpc_get_gsp_static_info_v: TypeAlias = struct_rpc_get_gsp_static_info_v14_00 +@c.record +class struct_rpc_update_bar_pde_v15_00(c.Struct): + SIZE = 24 + info: struct_UpdateBarPde_v15_00 +@c.record +class struct_UpdateBarPde_v15_00(c.Struct): + SIZE = 24 + barType: int + entryValue: int + entryLevelShift: int +UpdateBarPde_v15_00: TypeAlias = struct_UpdateBarPde_v15_00 +struct_UpdateBarPde_v15_00.register_fields([('barType', ctypes.c_uint32, 0), ('entryValue', NvU64, 8), ('entryLevelShift', NvU64, 16)]) +struct_rpc_update_bar_pde_v15_00.register_fields([('info', UpdateBarPde_v15_00, 0)]) +rpc_update_bar_pde_v15_00: TypeAlias = struct_rpc_update_bar_pde_v15_00 +rpc_update_bar_pde_v: TypeAlias = struct_rpc_update_bar_pde_v15_00 +@c.record +class struct_rpc_get_encoder_capacity_v07_00(c.Struct): + SIZE = 12 + hClient: int + hObject: int + encoderCapacity: int +struct_rpc_get_encoder_capacity_v07_00.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('encoderCapacity', NvU32, 8)]) +rpc_get_encoder_capacity_v07_00: TypeAlias = struct_rpc_get_encoder_capacity_v07_00 +rpc_get_encoder_capacity_v: TypeAlias = struct_rpc_get_encoder_capacity_v07_00 +@c.record +class struct_rpc_vgpu_pf_reg_read32_v15_00(c.Struct): + SIZE = 16 + address: int + value: int + grEngId: int +struct_rpc_vgpu_pf_reg_read32_v15_00.register_fields([('address', NvU64, 0), ('value', NvU32, 8), ('grEngId', NvU32, 12)]) +rpc_vgpu_pf_reg_read32_v15_00: TypeAlias = struct_rpc_vgpu_pf_reg_read32_v15_00 +rpc_vgpu_pf_reg_read32_v: TypeAlias = struct_rpc_vgpu_pf_reg_read32_v15_00 +@c.record +class struct_rpc_ctrl_set_vgpu_fb_usage_v1A_08(c.Struct): + SIZE = 8 + setFbUsage: struct_NVA080_CTRL_SET_FB_USAGE_PARAMS_v07_02 +@c.record +class struct_NVA080_CTRL_SET_FB_USAGE_PARAMS_v07_02(c.Struct): + SIZE = 8 + fbUsed: int +NVA080_CTRL_SET_FB_USAGE_PARAMS_v07_02: TypeAlias = struct_NVA080_CTRL_SET_FB_USAGE_PARAMS_v07_02 +struct_NVA080_CTRL_SET_FB_USAGE_PARAMS_v07_02.register_fields([('fbUsed', NvU64, 0)]) +struct_rpc_ctrl_set_vgpu_fb_usage_v1A_08.register_fields([('setFbUsage', NVA080_CTRL_SET_FB_USAGE_PARAMS_v07_02, 0)]) +rpc_ctrl_set_vgpu_fb_usage_v1A_08: TypeAlias = struct_rpc_ctrl_set_vgpu_fb_usage_v1A_08 +rpc_ctrl_set_vgpu_fb_usage_v: TypeAlias = struct_rpc_ctrl_set_vgpu_fb_usage_v1A_08 +@c.record +class struct_rpc_ctrl_nvenc_sw_session_update_info_v1A_09(c.Struct): + SIZE = 40 + hClient: int + hObject: int + nvencSessionUpdate: struct_NVA0BC_CTRL_NVENC_SW_SESSION_UPDATE_INFO_PARAMS_v06_01 +@c.record +class struct_NVA0BC_CTRL_NVENC_SW_SESSION_UPDATE_INFO_PARAMS_v06_01(c.Struct): + SIZE = 32 + hResolution: int + vResolution: int + averageEncodeLatency: int + averageEncodeFps: int + timestampBufferSize: int + timestampBuffer: ctypes.c_void_p +NVA0BC_CTRL_NVENC_SW_SESSION_UPDATE_INFO_PARAMS_v06_01: TypeAlias = struct_NVA0BC_CTRL_NVENC_SW_SESSION_UPDATE_INFO_PARAMS_v06_01 +struct_NVA0BC_CTRL_NVENC_SW_SESSION_UPDATE_INFO_PARAMS_v06_01.register_fields([('hResolution', NvU32, 0), ('vResolution', NvU32, 4), ('averageEncodeLatency', NvU32, 8), ('averageEncodeFps', NvU32, 12), ('timestampBufferSize', NvU32, 16), ('timestampBuffer', NvP64, 24)]) +struct_rpc_ctrl_nvenc_sw_session_update_info_v1A_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('nvencSessionUpdate', NVA0BC_CTRL_NVENC_SW_SESSION_UPDATE_INFO_PARAMS_v06_01, 8)]) +rpc_ctrl_nvenc_sw_session_update_info_v1A_09: TypeAlias = struct_rpc_ctrl_nvenc_sw_session_update_info_v1A_09 +rpc_ctrl_nvenc_sw_session_update_info_v: TypeAlias = struct_rpc_ctrl_nvenc_sw_session_update_info_v1A_09 +@c.record +class struct_rpc_ctrl_reset_channel_v1A_09(c.Struct): + SIZE = 20 + hClient: int + hObject: int + resetChannel: struct_NV906F_CTRL_CMD_RESET_CHANNEL_PARAMS_v10_01 +@c.record +class struct_NV906F_CTRL_CMD_RESET_CHANNEL_PARAMS_v10_01(c.Struct): + SIZE = 12 + engineID: int + subdeviceInstance: int + resetReason: int +NV906F_CTRL_CMD_RESET_CHANNEL_PARAMS_v10_01: TypeAlias = struct_NV906F_CTRL_CMD_RESET_CHANNEL_PARAMS_v10_01 +struct_NV906F_CTRL_CMD_RESET_CHANNEL_PARAMS_v10_01.register_fields([('engineID', NvU32, 0), ('subdeviceInstance', NvU32, 4), ('resetReason', NvU32, 8)]) +struct_rpc_ctrl_reset_channel_v1A_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('resetChannel', NV906F_CTRL_CMD_RESET_CHANNEL_PARAMS_v10_01, 8)]) +rpc_ctrl_reset_channel_v1A_09: TypeAlias = struct_rpc_ctrl_reset_channel_v1A_09 +rpc_ctrl_reset_channel_v: TypeAlias = struct_rpc_ctrl_reset_channel_v1A_09 +@c.record +class struct_rpc_ctrl_reset_isolated_channel_v1A_09(c.Struct): + SIZE = 16 + hClient: int + hObject: int + resetIsolatedChannel: struct_NV506F_CTRL_CMD_RESET_ISOLATED_CHANNEL_PARAMS_v03_00 +@c.record +class struct_NV506F_CTRL_CMD_RESET_ISOLATED_CHANNEL_PARAMS_v03_00(c.Struct): + SIZE = 8 + exceptType: int + engineID: int +NV506F_CTRL_CMD_RESET_ISOLATED_CHANNEL_PARAMS_v03_00: TypeAlias = struct_NV506F_CTRL_CMD_RESET_ISOLATED_CHANNEL_PARAMS_v03_00 +struct_NV506F_CTRL_CMD_RESET_ISOLATED_CHANNEL_PARAMS_v03_00.register_fields([('exceptType', NvU32, 0), ('engineID', NvU32, 4)]) +struct_rpc_ctrl_reset_isolated_channel_v1A_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('resetIsolatedChannel', NV506F_CTRL_CMD_RESET_ISOLATED_CHANNEL_PARAMS_v03_00, 8)]) +rpc_ctrl_reset_isolated_channel_v1A_09: TypeAlias = struct_rpc_ctrl_reset_isolated_channel_v1A_09 +rpc_ctrl_reset_isolated_channel_v: TypeAlias = struct_rpc_ctrl_reset_isolated_channel_v1A_09 +@c.record +class struct_rpc_ctrl_gpu_handle_vf_pri_fault_v1A_09(c.Struct): + SIZE = 12 + hClient: int + hObject: int + handleVfPriFault: struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_v18_09 +@c.record +class struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_v18_09(c.Struct): + SIZE = 4 + faultType: int +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_v18_09: TypeAlias = struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_v18_09 +struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_v18_09.register_fields([('faultType', NvU32, 0)]) +struct_rpc_ctrl_gpu_handle_vf_pri_fault_v1A_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('handleVfPriFault', NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_v18_09, 8)]) +rpc_ctrl_gpu_handle_vf_pri_fault_v1A_09: TypeAlias = struct_rpc_ctrl_gpu_handle_vf_pri_fault_v1A_09 +rpc_ctrl_gpu_handle_vf_pri_fault_v: TypeAlias = struct_rpc_ctrl_gpu_handle_vf_pri_fault_v1A_09 +@c.record +class struct_rpc_ctrl_perf_boost_v1A_09(c.Struct): + SIZE = 16 + hClient: int + hObject: int + perfBoost: struct_NV2080_CTRL_PERF_BOOST_PARAMS_v03_00 +@c.record +class struct_NV2080_CTRL_PERF_BOOST_PARAMS_v03_00(c.Struct): + SIZE = 8 + flags: int + duration: int +NV2080_CTRL_PERF_BOOST_PARAMS_v03_00: TypeAlias = struct_NV2080_CTRL_PERF_BOOST_PARAMS_v03_00 +struct_NV2080_CTRL_PERF_BOOST_PARAMS_v03_00.register_fields([('flags', NvU32, 0), ('duration', NvU32, 4)]) +struct_rpc_ctrl_perf_boost_v1A_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('perfBoost', NV2080_CTRL_PERF_BOOST_PARAMS_v03_00, 8)]) +rpc_ctrl_perf_boost_v1A_09: TypeAlias = struct_rpc_ctrl_perf_boost_v1A_09 +rpc_ctrl_perf_boost_v: TypeAlias = struct_rpc_ctrl_perf_boost_v1A_09 +@c.record +class struct_rpc_ctrl_get_zbc_clear_table_v1A_09(c.Struct): + SIZE = 64 + hClient: int + hObject: int + getZbcClearTable: struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_v04_00 +@c.record +class struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_v04_00(c.Struct): + SIZE = 56 + value: struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_value_v04_00 + indexSize: int + indexUsed: int + format: int + valType: int +NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_v04_00: TypeAlias = struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_v04_00 +@c.record +class struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_value_v04_00(c.Struct): + SIZE = 40 + colorFB: c.Array[ctypes.c_uint32, Literal[4]] + colorDS: c.Array[ctypes.c_uint32, Literal[4]] + depth: int + stencil: int +NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_value_v04_00: TypeAlias = struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_value_v04_00 +struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_value_v04_00.register_fields([('colorFB', c.Array[NvU32, Literal[4]], 0), ('colorDS', c.Array[NvU32, Literal[4]], 16), ('depth', NvU32, 32), ('stencil', NvU32, 36)]) +struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_v04_00.register_fields([('value', NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_value_v04_00, 0), ('indexSize', NvU32, 40), ('indexUsed', NvU32, 44), ('format', NvU32, 48), ('valType', NvU32, 52)]) +struct_rpc_ctrl_get_zbc_clear_table_v1A_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('getZbcClearTable', NV9096_CTRL_GET_ZBC_CLEAR_TABLE_PARAMS_v04_00, 8)]) +rpc_ctrl_get_zbc_clear_table_v1A_09: TypeAlias = struct_rpc_ctrl_get_zbc_clear_table_v1A_09 +rpc_ctrl_get_zbc_clear_table_v: TypeAlias = struct_rpc_ctrl_get_zbc_clear_table_v1A_09 +@c.record +class struct_rpc_ctrl_set_zbc_color_clear_v1A_09(c.Struct): + SIZE = 44 + hClient: int + hObject: int + setZbcColorClr: struct_NV9096_CTRL_SET_ZBC_COLOR_CLEAR_PARAMS_v03_00 +@c.record +class struct_NV9096_CTRL_SET_ZBC_COLOR_CLEAR_PARAMS_v03_00(c.Struct): + SIZE = 36 + colorFB: c.Array[ctypes.c_uint32, Literal[4]] + colorDS: c.Array[ctypes.c_uint32, Literal[4]] + format: int +NV9096_CTRL_SET_ZBC_COLOR_CLEAR_PARAMS_v03_00: TypeAlias = struct_NV9096_CTRL_SET_ZBC_COLOR_CLEAR_PARAMS_v03_00 +struct_NV9096_CTRL_SET_ZBC_COLOR_CLEAR_PARAMS_v03_00.register_fields([('colorFB', c.Array[NvU32, Literal[4]], 0), ('colorDS', c.Array[NvU32, Literal[4]], 16), ('format', NvU32, 32)]) +struct_rpc_ctrl_set_zbc_color_clear_v1A_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('setZbcColorClr', NV9096_CTRL_SET_ZBC_COLOR_CLEAR_PARAMS_v03_00, 8)]) +rpc_ctrl_set_zbc_color_clear_v1A_09: TypeAlias = struct_rpc_ctrl_set_zbc_color_clear_v1A_09 +rpc_ctrl_set_zbc_color_clear_v: TypeAlias = struct_rpc_ctrl_set_zbc_color_clear_v1A_09 +@c.record +class struct_rpc_ctrl_set_zbc_depth_clear_v1A_09(c.Struct): + SIZE = 16 + hClient: int + hObject: int + setZbcDepthClr: struct_NV9096_CTRL_SET_ZBC_DEPTH_CLEAR_PARAMS_v03_00 +@c.record +class struct_NV9096_CTRL_SET_ZBC_DEPTH_CLEAR_PARAMS_v03_00(c.Struct): + SIZE = 8 + depth: int + format: int +NV9096_CTRL_SET_ZBC_DEPTH_CLEAR_PARAMS_v03_00: TypeAlias = struct_NV9096_CTRL_SET_ZBC_DEPTH_CLEAR_PARAMS_v03_00 +struct_NV9096_CTRL_SET_ZBC_DEPTH_CLEAR_PARAMS_v03_00.register_fields([('depth', NvU32, 0), ('format', NvU32, 4)]) +struct_rpc_ctrl_set_zbc_depth_clear_v1A_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('setZbcDepthClr', NV9096_CTRL_SET_ZBC_DEPTH_CLEAR_PARAMS_v03_00, 8)]) +rpc_ctrl_set_zbc_depth_clear_v1A_09: TypeAlias = struct_rpc_ctrl_set_zbc_depth_clear_v1A_09 +rpc_ctrl_set_zbc_depth_clear_v: TypeAlias = struct_rpc_ctrl_set_zbc_depth_clear_v1A_09 +@c.record +class struct_rpc_ctrl_set_zbc_stencil_clear_v27_06(c.Struct): + SIZE = 20 + hClient: int + hObject: int + setZbcStencilClr: struct_NV9096_CTRL_SET_ZBC_STENCIL_CLEAR_PARAMS_v27_06 +@c.record +class struct_NV9096_CTRL_SET_ZBC_STENCIL_CLEAR_PARAMS_v27_06(c.Struct): + SIZE = 12 + stencil: int + format: int + bSkipL2Table: int +NV9096_CTRL_SET_ZBC_STENCIL_CLEAR_PARAMS_v27_06: TypeAlias = struct_NV9096_CTRL_SET_ZBC_STENCIL_CLEAR_PARAMS_v27_06 +struct_NV9096_CTRL_SET_ZBC_STENCIL_CLEAR_PARAMS_v27_06.register_fields([('stencil', NvU32, 0), ('format', NvU32, 4), ('bSkipL2Table', NvBool, 8)]) +struct_rpc_ctrl_set_zbc_stencil_clear_v27_06.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('setZbcStencilClr', NV9096_CTRL_SET_ZBC_STENCIL_CLEAR_PARAMS_v27_06, 8)]) +rpc_ctrl_set_zbc_stencil_clear_v27_06: TypeAlias = struct_rpc_ctrl_set_zbc_stencil_clear_v27_06 +rpc_ctrl_set_zbc_stencil_clear_v: TypeAlias = struct_rpc_ctrl_set_zbc_stencil_clear_v27_06 +@c.record +class struct_rpc_ctrl_gpfifo_schedule_v1A_0A(c.Struct): + SIZE = 16 + hClient: int + hObject: int + cmd: int + gpfifoSchedule: struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_v03_00 +@c.record +class struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_v03_00(c.Struct): + SIZE = 1 + bEnable: int +NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_v03_00: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_v03_00 +struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_v03_00.register_fields([('bEnable', NvBool, 0)]) +struct_rpc_ctrl_gpfifo_schedule_v1A_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvU32, 8), ('gpfifoSchedule', NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_v03_00, 12)]) +rpc_ctrl_gpfifo_schedule_v1A_0A: TypeAlias = struct_rpc_ctrl_gpfifo_schedule_v1A_0A +rpc_ctrl_gpfifo_schedule_v: TypeAlias = struct_rpc_ctrl_gpfifo_schedule_v1A_0A +@c.record +class struct_rpc_ctrl_set_timeslice_v1A_0A(c.Struct): + SIZE = 16 + hClient: int + hObject: int + setTimeSlice: struct_NVA06C_CTRL_TIMESLICE_PARAMS_v06_00 +@c.record +class struct_NVA06C_CTRL_TIMESLICE_PARAMS_v06_00(c.Struct): + SIZE = 8 + timesliceUs: int +NVA06C_CTRL_TIMESLICE_PARAMS_v06_00: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS_v06_00 +struct_NVA06C_CTRL_TIMESLICE_PARAMS_v06_00.register_fields([('timesliceUs', NvU64, 0)]) +struct_rpc_ctrl_set_timeslice_v1A_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('setTimeSlice', NVA06C_CTRL_TIMESLICE_PARAMS_v06_00, 8)]) +rpc_ctrl_set_timeslice_v1A_0A: TypeAlias = struct_rpc_ctrl_set_timeslice_v1A_0A +rpc_ctrl_set_timeslice_v: TypeAlias = struct_rpc_ctrl_set_timeslice_v1A_0A +@c.record +class struct_rpc_ctrl_fifo_disable_channels_v1A_0A(c.Struct): + SIZE = 544 + hClient: int + hObject: int + fifoDisableChannels: struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_v06_00 +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_v06_00(c.Struct): + SIZE = 536 + bDisable: int + numChannels: int + bOnlyDisableScheduling: int + bRewindGpPut: int + pRunlistPreemptEvent: ctypes.c_void_p + hClientList: c.Array[ctypes.c_uint32, Literal[64]] + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] +NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_v06_00: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_v06_00 +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_v06_00.register_fields([('bDisable', NvBool, 0), ('numChannels', NvU32, 4), ('bOnlyDisableScheduling', NvBool, 8), ('bRewindGpPut', NvBool, 9), ('pRunlistPreemptEvent', NvP64, 16), ('hClientList', c.Array[NvHandle, Literal[64]], 24), ('hChannelList', c.Array[NvHandle, Literal[64]], 280)]) +struct_rpc_ctrl_fifo_disable_channels_v1A_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('fifoDisableChannels', NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_v06_00, 8)]) +rpc_ctrl_fifo_disable_channels_v1A_0A: TypeAlias = struct_rpc_ctrl_fifo_disable_channels_v1A_0A +rpc_ctrl_fifo_disable_channels_v: TypeAlias = struct_rpc_ctrl_fifo_disable_channels_v1A_0A +@c.record +class struct_rpc_ctrl_preempt_v1A_0A(c.Struct): + SIZE = 16 + hClient: int + hObject: int + cmdPreempt: struct_NVA06C_CTRL_PREEMPT_PARAMS_v09_0A +@c.record +class struct_NVA06C_CTRL_PREEMPT_PARAMS_v09_0A(c.Struct): + SIZE = 8 + bWait: int + bManualTimeout: int + timeoutUs: int +NVA06C_CTRL_PREEMPT_PARAMS_v09_0A: TypeAlias = struct_NVA06C_CTRL_PREEMPT_PARAMS_v09_0A +struct_NVA06C_CTRL_PREEMPT_PARAMS_v09_0A.register_fields([('bWait', NvBool, 0), ('bManualTimeout', NvBool, 1), ('timeoutUs', NvU32, 4)]) +struct_rpc_ctrl_preempt_v1A_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmdPreempt', NVA06C_CTRL_PREEMPT_PARAMS_v09_0A, 8)]) +rpc_ctrl_preempt_v1A_0A: TypeAlias = struct_rpc_ctrl_preempt_v1A_0A +rpc_ctrl_preempt_v: TypeAlias = struct_rpc_ctrl_preempt_v1A_0A +@c.record +class struct_rpc_ctrl_set_tsg_interleave_level_v1A_0A(c.Struct): + SIZE = 12 + hClient: int + hObject: int + interleaveLevelTSG: struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02 +@c.record +class struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02(c.Struct): + SIZE = 4 + tsgInterleaveLevel: int +NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02 +struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02.register_fields([('tsgInterleaveLevel', NvU32, 0)]) +struct_rpc_ctrl_set_tsg_interleave_level_v1A_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('interleaveLevelTSG', NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02, 8)]) +rpc_ctrl_set_tsg_interleave_level_v1A_0A: TypeAlias = struct_rpc_ctrl_set_tsg_interleave_level_v1A_0A +rpc_ctrl_set_tsg_interleave_level_v: TypeAlias = struct_rpc_ctrl_set_tsg_interleave_level_v1A_0A +@c.record +class struct_rpc_ctrl_set_channel_interleave_level_v1A_0A(c.Struct): + SIZE = 12 + hClient: int + hObject: int + interleaveLevelChannel: struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02 +@c.record +class struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02(c.Struct): + SIZE = 4 + channelInterleaveLevel: int +NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02 +struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02.register_fields([('channelInterleaveLevel', NvU32, 0)]) +struct_rpc_ctrl_set_channel_interleave_level_v1A_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('interleaveLevelChannel', NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS_v17_02, 8)]) +rpc_ctrl_set_channel_interleave_level_v1A_0A: TypeAlias = struct_rpc_ctrl_set_channel_interleave_level_v1A_0A +rpc_ctrl_set_channel_interleave_level_v: TypeAlias = struct_rpc_ctrl_set_channel_interleave_level_v1A_0A +@c.record +class struct_rpc_ctrl_gr_ctxsw_preemption_bind_v1A_0E(c.Struct): + SIZE = 112 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v12_01 +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v12_01(c.Struct): + SIZE = 104 + flags: int + hClient: int + hChannel: int + vMemPtrs: c.Array[ctypes.c_uint64, Literal[8]] + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01 +NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v12_01: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v12_01 +struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v12_01.register_fields([('flags', NvU32, 0), ('hClient', NvHandle, 4), ('hChannel', NvHandle, 8), ('vMemPtrs', c.Array[NvU64, Literal[8]], 16), ('gfxpPreemptMode', NvU32, 80), ('cilpPreemptMode', NvU32, 84), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO_v12_01, 88)]) +struct_rpc_ctrl_gr_ctxsw_preemption_bind_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v12_01, 8)]) +rpc_ctrl_gr_ctxsw_preemption_bind_v1A_0E: TypeAlias = struct_rpc_ctrl_gr_ctxsw_preemption_bind_v1A_0E +@c.record +class struct_rpc_ctrl_gr_ctxsw_preemption_bind_v28_07(c.Struct): + SIZE = 120 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v28_07 +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v28_07(c.Struct): + SIZE = 112 + flags: int + hClient: int + hChannel: int + vMemPtrs: c.Array[ctypes.c_uint64, Literal[9]] + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01 +NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v28_07: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v28_07 +struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v28_07.register_fields([('flags', NvU32, 0), ('hClient', NvHandle, 4), ('hChannel', NvHandle, 8), ('vMemPtrs', c.Array[NvU64, Literal[9]], 16), ('gfxpPreemptMode', NvU32, 88), ('cilpPreemptMode', NvU32, 92), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO_v12_01, 96)]) +struct_rpc_ctrl_gr_ctxsw_preemption_bind_v28_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_v28_07, 8)]) +rpc_ctrl_gr_ctxsw_preemption_bind_v28_07: TypeAlias = struct_rpc_ctrl_gr_ctxsw_preemption_bind_v28_07 +rpc_ctrl_gr_ctxsw_preemption_bind_v: TypeAlias = struct_rpc_ctrl_gr_ctxsw_preemption_bind_v28_07 +@c.record +class struct_rpc_ctrl_gr_set_ctxsw_preemption_mode_v1A_0E(c.Struct): + SIZE = 40 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_v12_01 +@c.record +class struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_v12_01(c.Struct): + SIZE = 32 + flags: int + hChannel: int + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01 +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_v12_01: TypeAlias = struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_v12_01 +struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_v12_01.register_fields([('flags', NvU32, 0), ('hChannel', NvHandle, 4), ('gfxpPreemptMode', NvU32, 8), ('cilpPreemptMode', NvU32, 12), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO_v12_01, 16)]) +struct_rpc_ctrl_gr_set_ctxsw_preemption_mode_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_v12_01, 8)]) +rpc_ctrl_gr_set_ctxsw_preemption_mode_v1A_0E: TypeAlias = struct_rpc_ctrl_gr_set_ctxsw_preemption_mode_v1A_0E +rpc_ctrl_gr_set_ctxsw_preemption_mode_v: TypeAlias = struct_rpc_ctrl_gr_set_ctxsw_preemption_mode_v1A_0E +@c.record +class struct_rpc_ctrl_gr_ctxsw_zcull_bind_v1A_0E(c.Struct): + SIZE = 32 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_v03_00 +@c.record +class struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_v03_00(c.Struct): + SIZE = 24 + hClient: int + hChannel: int + vMemPtr: int + zcullMode: int +NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_v03_00: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_v03_00 +struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_v03_00.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8), ('zcullMode', NvU32, 16)]) +struct_rpc_ctrl_gr_ctxsw_zcull_bind_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_v03_00, 8)]) +rpc_ctrl_gr_ctxsw_zcull_bind_v1A_0E: TypeAlias = struct_rpc_ctrl_gr_ctxsw_zcull_bind_v1A_0E +rpc_ctrl_gr_ctxsw_zcull_bind_v: TypeAlias = struct_rpc_ctrl_gr_ctxsw_zcull_bind_v1A_0E +@c.record +class struct_rpc_ctrl_gpu_initialize_ctx_v1A_0E(c.Struct): + SIZE = 64 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_v03_00 +@c.record +class struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_v03_00(c.Struct): + SIZE = 56 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int + hVirtMemory: int + physAddress: int + physAttr: int + hDmaHandle: int + index: int + size: int +NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_v03_00: TypeAlias = struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_v03_00 +struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_v03_00.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16), ('hVirtMemory', NvHandle, 20), ('physAddress', NvU64, 24), ('physAttr', NvU32, 32), ('hDmaHandle', NvHandle, 36), ('index', NvU32, 40), ('size', NvU64, 48)]) +struct_rpc_ctrl_gpu_initialize_ctx_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_v03_00, 8)]) +rpc_ctrl_gpu_initialize_ctx_v1A_0E: TypeAlias = struct_rpc_ctrl_gpu_initialize_ctx_v1A_0E +rpc_ctrl_gpu_initialize_ctx_v: TypeAlias = struct_rpc_ctrl_gpu_initialize_ctx_v1A_0E +@c.record +class struct_rpc_ctrl_vaspace_copy_server_reserved_pdes_v1E_04(c.Struct): + SIZE = 192 + hClient: int + hObject: int + ctrlParams: struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_v1E_04 +@c.record +class struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_v1E_04(c.Struct): + SIZE = 184 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int + numLevelsToCopy: int + levels: c.Array[struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_levels_v1E_04, Literal[6]] +NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_v1E_04: TypeAlias = struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_v1E_04 +@c.record +class struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_levels_v1E_04(c.Struct): + SIZE = 24 + physAddress: int + size: int + aperture: int + pageShift: int +NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_levels_v1E_04: TypeAlias = struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_levels_v1E_04 +struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_levels_v1E_04.register_fields([('physAddress', NvU64, 0), ('size', NvU64, 8), ('aperture', NvU32, 16), ('pageShift', NvU8, 20)]) +struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_v1E_04.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24), ('numLevelsToCopy', NvU32, 32), ('levels', c.Array[NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_levels_v1E_04, Literal[6]], 40)]) +struct_rpc_ctrl_vaspace_copy_server_reserved_pdes_v1E_04.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_v1E_04, 8)]) +rpc_ctrl_vaspace_copy_server_reserved_pdes_v1E_04: TypeAlias = struct_rpc_ctrl_vaspace_copy_server_reserved_pdes_v1E_04 +rpc_ctrl_vaspace_copy_server_reserved_pdes_v: TypeAlias = struct_rpc_ctrl_vaspace_copy_server_reserved_pdes_v1E_04 +@c.record +class struct_rpc_ctrl_mc_service_interrupts_v1A_0E(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_v15_01 +@c.record +class struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_v15_01(c.Struct): + SIZE = 4 + engines: int +NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_v15_01: TypeAlias = struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_v15_01 +struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_v15_01.register_fields([('engines', NvU32, 0)]) +struct_rpc_ctrl_mc_service_interrupts_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_v15_01, 8)]) +rpc_ctrl_mc_service_interrupts_v1A_0E: TypeAlias = struct_rpc_ctrl_mc_service_interrupts_v1A_0E +rpc_ctrl_mc_service_interrupts_v: TypeAlias = struct_rpc_ctrl_mc_service_interrupts_v1A_0E +@c.record +class struct_rpc_ctrl_get_p2p_caps_v2_v1F_0D(c.Struct): + SIZE = 2208 + iter: int + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuCount: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerIds: c.Array[ctypes.c_uint32, Literal[512]] +struct_rpc_ctrl_get_p2p_caps_v2_v1F_0D.register_fields([('iter', NvU8, 0), ('gpuIds', c.Array[NvU32, Literal[32]], 4), ('gpuCount', NvU32, 132), ('p2pCaps', NvU32, 136), ('p2pOptimalReadCEs', NvU32, 140), ('p2pOptimalWriteCEs', NvU32, 144), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 148), ('busPeerIds', c.Array[NvU32, Literal[512]], 160)]) +rpc_ctrl_get_p2p_caps_v2_v1F_0D: TypeAlias = struct_rpc_ctrl_get_p2p_caps_v2_v1F_0D +rpc_ctrl_get_p2p_caps_v2_v: TypeAlias = struct_rpc_ctrl_get_p2p_caps_v2_v1F_0D +@c.record +class struct_rpc_ctrl_subdevice_get_p2p_caps_v21_02(c.Struct): + SIZE = 1544 + ctrlParams: struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS_v21_02 +@c.record +class struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS_v21_02(c.Struct): + SIZE = 1544 + bAllCaps: int + bUseUuid: int + peerGpuCount: int + peerGpuCaps: c.Array[struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO_v21_02, Literal[32]] +NV2080_CTRL_GET_P2P_CAPS_PARAMS_v21_02: TypeAlias = struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS_v21_02 +@c.record +class struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO_v21_02(c.Struct): + SIZE = 48 + gpuId: int + gpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerId: int +NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO_v21_02: TypeAlias = struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO_v21_02 +struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO_v21_02.register_fields([('gpuId', NvU32, 0), ('gpuUuid', c.Array[NvU8, Literal[16]], 4), ('p2pCaps', NvU32, 20), ('p2pOptimalReadCEs', NvU32, 24), ('p2pOptimalWriteCEs', NvU32, 28), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 32), ('busPeerId', NvU32, 44)]) +struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS_v21_02.register_fields([('bAllCaps', NvBool, 0), ('bUseUuid', NvBool, 1), ('peerGpuCount', NvU32, 4), ('peerGpuCaps', c.Array[NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO_v21_02, Literal[32]], 8)]) +struct_rpc_ctrl_subdevice_get_p2p_caps_v21_02.register_fields([('ctrlParams', NV2080_CTRL_GET_P2P_CAPS_PARAMS_v21_02, 0)]) +rpc_ctrl_subdevice_get_p2p_caps_v21_02: TypeAlias = struct_rpc_ctrl_subdevice_get_p2p_caps_v21_02 +rpc_ctrl_subdevice_get_p2p_caps_v: TypeAlias = struct_rpc_ctrl_subdevice_get_p2p_caps_v21_02 +@c.record +class struct_rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_03(c.Struct): + SIZE = 40 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_03 +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_03(c.Struct): + SIZE = 32 + allocatedSize: int + peakAllocatedSize: int + managedSize: int + allocationCount: int + peakAllocationCount: int +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_03: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_03 +struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_03.register_fields([('allocatedSize', NvU64, 0), ('peakAllocatedSize', NvU64, 8), ('managedSize', NvU64, 16), ('allocationCount', NvU32, 24), ('peakAllocationCount', NvU32, 28)]) +struct_rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_03.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_03, 8)]) +rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_03: TypeAlias = struct_rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_03 +@c.record +class struct_rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_06(c.Struct): + SIZE = 48 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_06 +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_06(c.Struct): + SIZE = 40 + allocatedSize: int + peakAllocatedSize: int + managedSize: int + allocationCount: int + peakAllocationCount: int + largestFreeChunkSize: int +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_06: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_06 +struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_06.register_fields([('allocatedSize', NvU64, 0), ('peakAllocatedSize', NvU64, 8), ('managedSize', NvU64, 16), ('allocationCount', NvU32, 24), ('peakAllocationCount', NvU32, 28), ('largestFreeChunkSize', NvU64, 32)]) +struct_rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_06.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_v28_06, 8)]) +rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_06: TypeAlias = struct_rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_06 +rpc_ctrl_subdevice_get_vgpu_heap_stats_v: TypeAlias = struct_rpc_ctrl_subdevice_get_vgpu_heap_stats_v28_06 +@c.record +class struct_rpc_ctrl_dbg_clear_all_sm_error_states_v1A_0C(c.Struct): + SIZE = 16 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_v03_00 +@c.record +class struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_v03_00(c.Struct): + SIZE = 8 + hTargetChannel: int + numSMsToClear: int +NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_v03_00: TypeAlias = struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_v03_00 +struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_v03_00.register_fields([('hTargetChannel', NvHandle, 0), ('numSMsToClear', NvU32, 4)]) +struct_rpc_ctrl_dbg_clear_all_sm_error_states_v1A_0C.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_v03_00, 8)]) +rpc_ctrl_dbg_clear_all_sm_error_states_v1A_0C: TypeAlias = struct_rpc_ctrl_dbg_clear_all_sm_error_states_v1A_0C +rpc_ctrl_dbg_clear_all_sm_error_states_v: TypeAlias = struct_rpc_ctrl_dbg_clear_all_sm_error_states_v1A_0C +@c.record +class struct_rpc_ctrl_dbg_read_all_sm_error_states_v21_06(c.Struct): + SIZE = 3872 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_v21_06 +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_v21_06(c.Struct): + SIZE = 3864 + hTargetChannel: int + numSMsToRead: int + smErrorStateArray: c.Array[struct_NV83DE_SM_ERROR_STATE_REGISTERS_v21_06, Literal[80]] + mmuFaultInfo: int + mmuFault: struct_NV83DE_MMU_FAULT_INFO_v16_03 + startingSM: int +NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_v21_06: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_v21_06 +@c.record +class struct_NV83DE_SM_ERROR_STATE_REGISTERS_v21_06(c.Struct): + SIZE = 48 + hwwGlobalEsr: int + hwwWarpEsr: int + hwwWarpEsrPc: int + hwwGlobalEsrReportMask: int + hwwWarpEsrReportMask: int + hwwEsrAddr: int + hwwWarpEsrPc64: int + hwwCgaEsr: int + hwwCgaEsrReportMask: int +NV83DE_SM_ERROR_STATE_REGISTERS_v21_06: TypeAlias = struct_NV83DE_SM_ERROR_STATE_REGISTERS_v21_06 +struct_NV83DE_SM_ERROR_STATE_REGISTERS_v21_06.register_fields([('hwwGlobalEsr', NvU32, 0), ('hwwWarpEsr', NvU32, 4), ('hwwWarpEsrPc', NvU32, 8), ('hwwGlobalEsrReportMask', NvU32, 12), ('hwwWarpEsrReportMask', NvU32, 16), ('hwwEsrAddr', NvU64, 24), ('hwwWarpEsrPc64', NvU64, 32), ('hwwCgaEsr', NvU32, 40), ('hwwCgaEsrReportMask', NvU32, 44)]) +@c.record +class struct_NV83DE_MMU_FAULT_INFO_v16_03(c.Struct): + SIZE = 8 + valid: int + faultInfo: int +NV83DE_MMU_FAULT_INFO_v16_03: TypeAlias = struct_NV83DE_MMU_FAULT_INFO_v16_03 +struct_NV83DE_MMU_FAULT_INFO_v16_03.register_fields([('valid', NvBool, 0), ('faultInfo', NvU32, 4)]) +struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_v21_06.register_fields([('hTargetChannel', NvHandle, 0), ('numSMsToRead', NvU32, 4), ('smErrorStateArray', c.Array[NV83DE_SM_ERROR_STATE_REGISTERS_v21_06, Literal[80]], 8), ('mmuFaultInfo', NvU32, 3848), ('mmuFault', NV83DE_MMU_FAULT_INFO_v16_03, 3852), ('startingSM', NvU32, 3860)]) +struct_rpc_ctrl_dbg_read_all_sm_error_states_v21_06.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_v21_06, 8)]) +rpc_ctrl_dbg_read_all_sm_error_states_v21_06: TypeAlias = struct_rpc_ctrl_dbg_read_all_sm_error_states_v21_06 +rpc_ctrl_dbg_read_all_sm_error_states_v: TypeAlias = struct_rpc_ctrl_dbg_read_all_sm_error_states_v21_06 +@c.record +class struct_rpc_ctrl_dbg_set_exception_mask_v1A_0C(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_v03_00 +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_v03_00(c.Struct): + SIZE = 4 + exceptionMask: int +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_v03_00: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_v03_00 +struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_v03_00.register_fields([('exceptionMask', NvU32, 0)]) +struct_rpc_ctrl_dbg_set_exception_mask_v1A_0C.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_v03_00, 8)]) +rpc_ctrl_dbg_set_exception_mask_v1A_0C: TypeAlias = struct_rpc_ctrl_dbg_set_exception_mask_v1A_0C +rpc_ctrl_dbg_set_exception_mask_v: TypeAlias = struct_rpc_ctrl_dbg_set_exception_mask_v1A_0C +@c.record +class struct_rpc_ctrl_gpu_promote_ctx_v1A_20(c.Struct): + SIZE = 568 + hClient: int + hObject: int + promoteCtx: struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_v1A_20 +@c.record +class struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_v1A_20(c.Struct): + SIZE = 560 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int + hVirtMemory: int + virtAddress: int + size: int + entryCount: int + promoteEntry: c.Array[struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY_v1A_20, Literal[16]] +NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_v1A_20: TypeAlias = struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_v1A_20 +@c.record +class struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY_v1A_20(c.Struct): + SIZE = 32 + gpuPhysAddr: int + gpuVirtAddr: int + size: int + physAttr: int + bufferId: int + bInitialize: int + bNonmapped: int +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY_v1A_20: TypeAlias = struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY_v1A_20 +struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY_v1A_20.register_fields([('gpuPhysAddr', NvU64, 0), ('gpuVirtAddr', NvU64, 8), ('size', NvU64, 16), ('physAttr', NvU32, 24), ('bufferId', NvU16, 28), ('bInitialize', NvU8, 30), ('bNonmapped', NvU8, 31)]) +struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_v1A_20.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16), ('hVirtMemory', NvHandle, 20), ('virtAddress', NvU64, 24), ('size', NvU64, 32), ('entryCount', NvU32, 40), ('promoteEntry', c.Array[NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY_v1A_20, Literal[16]], 48)]) +struct_rpc_ctrl_gpu_promote_ctx_v1A_20.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('promoteCtx', NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_v1A_20, 8)]) +rpc_ctrl_gpu_promote_ctx_v1A_20: TypeAlias = struct_rpc_ctrl_gpu_promote_ctx_v1A_20 +rpc_ctrl_gpu_promote_ctx_v: TypeAlias = struct_rpc_ctrl_gpu_promote_ctx_v1A_20 +@c.record +class struct_rpc_ctrl_dbg_suspend_context_v1A_10(c.Struct): + SIZE = 16 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_v1A_06 +@c.record +class struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_v1A_06(c.Struct): + SIZE = 8 + waitForEvent: int + hResidentChannel: int +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_v1A_06: TypeAlias = struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_v1A_06 +struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_v1A_06.register_fields([('waitForEvent', NvU32, 0), ('hResidentChannel', NvHandle, 4)]) +struct_rpc_ctrl_dbg_suspend_context_v1A_10.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_v1A_06, 8)]) +rpc_ctrl_dbg_suspend_context_v1A_10: TypeAlias = struct_rpc_ctrl_dbg_suspend_context_v1A_10 +rpc_ctrl_dbg_suspend_context_v: TypeAlias = struct_rpc_ctrl_dbg_suspend_context_v1A_10 +@c.record +class struct_rpc_ctrl_dbg_resume_context_v1A_10(c.Struct): + SIZE = 8 + hClient: int + hObject: int +struct_rpc_ctrl_dbg_resume_context_v1A_10.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4)]) +rpc_ctrl_dbg_resume_context_v1A_10: TypeAlias = struct_rpc_ctrl_dbg_resume_context_v1A_10 +rpc_ctrl_dbg_resume_context_v: TypeAlias = struct_rpc_ctrl_dbg_resume_context_v1A_10 +@c.record +class struct_rpc_ctrl_dbg_exec_reg_ops_v1A_10(c.Struct): + SIZE = 3216 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_v1A_06 +@c.record +class struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_v1A_06(c.Struct): + SIZE = 3208 + bNonTransactional: int + regOpCount: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP_v03_00, Literal[100]] +NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_v1A_06: TypeAlias = struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_v1A_06 +struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_v1A_06.register_fields([('bNonTransactional', NvBool, 0), ('regOpCount', NvU32, 4), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP_v03_00, Literal[100]], 8)]) +struct_rpc_ctrl_dbg_exec_reg_ops_v1A_10.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_v1A_06, 8)]) +rpc_ctrl_dbg_exec_reg_ops_v1A_10: TypeAlias = struct_rpc_ctrl_dbg_exec_reg_ops_v1A_10 +rpc_ctrl_dbg_exec_reg_ops_v: TypeAlias = struct_rpc_ctrl_dbg_exec_reg_ops_v1A_10 +@c.record +class struct_rpc_ctrl_dbg_set_mode_mmu_debug_v1A_10(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_v1A_06 +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_v1A_06(c.Struct): + SIZE = 4 + action: int +NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_v1A_06: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_v1A_06 +struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_v1A_06.register_fields([('action', NvU32, 0)]) +struct_rpc_ctrl_dbg_set_mode_mmu_debug_v1A_10.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_v1A_06, 8)]) +rpc_ctrl_dbg_set_mode_mmu_debug_v1A_10: TypeAlias = struct_rpc_ctrl_dbg_set_mode_mmu_debug_v1A_10 +rpc_ctrl_dbg_set_mode_mmu_debug_v: TypeAlias = struct_rpc_ctrl_dbg_set_mode_mmu_debug_v1A_10 +@c.record +class struct_rpc_ctrl_dbg_set_mode_mmu_gcc_debug_v29_07(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07 +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07(c.Struct): + SIZE = 4 + action: int +NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07 +struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07.register_fields([('action', NvU32, 0)]) +struct_rpc_ctrl_dbg_set_mode_mmu_gcc_debug_v29_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07, 8)]) +rpc_ctrl_dbg_set_mode_mmu_gcc_debug_v29_07: TypeAlias = struct_rpc_ctrl_dbg_set_mode_mmu_gcc_debug_v29_07 +rpc_ctrl_dbg_set_mode_mmu_gcc_debug_v: TypeAlias = struct_rpc_ctrl_dbg_set_mode_mmu_gcc_debug_v29_07 +@c.record +class struct_rpc_ctrl_dbg_read_single_sm_error_state_v21_06(c.Struct): + SIZE = 64 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_v21_06 +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_v21_06(c.Struct): + SIZE = 56 + hTargetChannel: int + smID: int + smErrorState: struct_NV83DE_SM_ERROR_STATE_REGISTERS_v21_06 +NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_v21_06: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_v21_06 +struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_v21_06.register_fields([('hTargetChannel', NvHandle, 0), ('smID', NvU32, 4), ('smErrorState', NV83DE_SM_ERROR_STATE_REGISTERS_v21_06, 8)]) +struct_rpc_ctrl_dbg_read_single_sm_error_state_v21_06.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_v21_06, 8)]) +rpc_ctrl_dbg_read_single_sm_error_state_v21_06: TypeAlias = struct_rpc_ctrl_dbg_read_single_sm_error_state_v21_06 +rpc_ctrl_dbg_read_single_sm_error_state_v: TypeAlias = struct_rpc_ctrl_dbg_read_single_sm_error_state_v21_06 +@c.record +class struct_rpc_ctrl_dbg_clear_single_sm_error_state_v1A_10(c.Struct): + SIZE = 16 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_v1A_06 +@c.record +class struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_v1A_06(c.Struct): + SIZE = 8 + hTargetChannel: int + smID: int +NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_v1A_06: TypeAlias = struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_v1A_06 +struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_v1A_06.register_fields([('hTargetChannel', NvHandle, 0), ('smID', NvU32, 4)]) +struct_rpc_ctrl_dbg_clear_single_sm_error_state_v1A_10.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_v1A_06, 8)]) +rpc_ctrl_dbg_clear_single_sm_error_state_v1A_10: TypeAlias = struct_rpc_ctrl_dbg_clear_single_sm_error_state_v1A_10 +rpc_ctrl_dbg_clear_single_sm_error_state_v: TypeAlias = struct_rpc_ctrl_dbg_clear_single_sm_error_state_v1A_10 +@c.record +class struct_rpc_ctrl_dbg_set_mode_errbar_debug_v1A_10(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_v1A_06 +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_v1A_06(c.Struct): + SIZE = 4 + action: int +NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_v1A_06: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_v1A_06 +struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_v1A_06.register_fields([('action', NvU32, 0)]) +struct_rpc_ctrl_dbg_set_mode_errbar_debug_v1A_10.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_v1A_06, 8)]) +rpc_ctrl_dbg_set_mode_errbar_debug_v1A_10: TypeAlias = struct_rpc_ctrl_dbg_set_mode_errbar_debug_v1A_10 +rpc_ctrl_dbg_set_mode_errbar_debug_v: TypeAlias = struct_rpc_ctrl_dbg_set_mode_errbar_debug_v1A_10 +@c.record +class struct_rpc_ctrl_dbg_set_next_stop_trigger_type_v1A_10(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_v1A_06 +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_v1A_06(c.Struct): + SIZE = 4 + stopTriggerType: int +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_v1A_06: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_v1A_06 +struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_v1A_06.register_fields([('stopTriggerType', NvU32, 0)]) +struct_rpc_ctrl_dbg_set_next_stop_trigger_type_v1A_10.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_v1A_06, 8)]) +rpc_ctrl_dbg_set_next_stop_trigger_type_v1A_10: TypeAlias = struct_rpc_ctrl_dbg_set_next_stop_trigger_type_v1A_10 +rpc_ctrl_dbg_set_next_stop_trigger_type_v: TypeAlias = struct_rpc_ctrl_dbg_set_next_stop_trigger_type_v1A_10 +@c.record +class struct_rpc_ctrl_dma_set_default_vaspace_v1A_0E(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_v03_00 +@c.record +class struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_v03_00(c.Struct): + SIZE = 4 + hVASpace: int +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_v03_00: TypeAlias = struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_v03_00 +struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_v03_00.register_fields([('hVASpace', NvHandle, 0)]) +struct_rpc_ctrl_dma_set_default_vaspace_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_v03_00, 8)]) +rpc_ctrl_dma_set_default_vaspace_v1A_0E: TypeAlias = struct_rpc_ctrl_dma_set_default_vaspace_v1A_0E +rpc_ctrl_dma_set_default_vaspace_v: TypeAlias = struct_rpc_ctrl_dma_set_default_vaspace_v1A_0E +@c.record +class struct_rpc_ctrl_get_ce_pce_mask_v1A_0E(c.Struct): + SIZE = 16 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_v1A_07 +@c.record +class struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_v1A_07(c.Struct): + SIZE = 8 + ceEngineType: int + pceMask: int +NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_v1A_07: TypeAlias = struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_v1A_07 +struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_v1A_07.register_fields([('ceEngineType', NvU32, 0), ('pceMask', NvU32, 4)]) +struct_rpc_ctrl_get_ce_pce_mask_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_v1A_07, 8)]) +rpc_ctrl_get_ce_pce_mask_v1A_0E: TypeAlias = struct_rpc_ctrl_get_ce_pce_mask_v1A_0E +rpc_ctrl_get_ce_pce_mask_v: TypeAlias = struct_rpc_ctrl_get_ce_pce_mask_v1A_0E +@c.record +class struct_rpc_ctrl_get_zbc_clear_table_entry_v1A_0E(c.Struct): + SIZE = 64 + hClient: int + hObject: int + ctrlParams: struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_v1A_07 +@c.record +class struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_v1A_07(c.Struct): + SIZE = 56 + value: struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_value_v1A_07 + format: int + index: int + bIndexValid: int + tableType: int +NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_v1A_07: TypeAlias = struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_v1A_07 +@c.record +class struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_value_v1A_07(c.Struct): + SIZE = 40 + colorFB: c.Array[ctypes.c_uint32, Literal[4]] + colorDS: c.Array[ctypes.c_uint32, Literal[4]] + depth: int + stencil: int +NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_value_v1A_07: TypeAlias = struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_value_v1A_07 +struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_value_v1A_07.register_fields([('colorFB', c.Array[NvU32, Literal[4]], 0), ('colorDS', c.Array[NvU32, Literal[4]], 16), ('depth', NvU32, 32), ('stencil', NvU32, 36)]) +enum_NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE: dict[int, str] = {(NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_INVALID:=0): 'NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_INVALID', (NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_COLOR:=1): 'NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_COLOR', (NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_DEPTH:=2): 'NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_DEPTH', (NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_STENCIL:=3): 'NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_STENCIL', (NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_COUNT:=4): 'NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE_COUNT'} +NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE: TypeAlias = ctypes.c_uint32 +struct_NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_v1A_07.register_fields([('value', NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_value_v1A_07, 0), ('format', NvU32, 40), ('index', NvU32, 44), ('bIndexValid', NvBool, 48), ('tableType', NV9096_CTRL_ZBC_CLEAR_TABLE_TYPE, 52)]) +struct_rpc_ctrl_get_zbc_clear_table_entry_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV9096_CTRL_GET_ZBC_CLEAR_TABLE_ENTRY_PARAMS_v1A_07, 8)]) +rpc_ctrl_get_zbc_clear_table_entry_v1A_0E: TypeAlias = struct_rpc_ctrl_get_zbc_clear_table_entry_v1A_0E +rpc_ctrl_get_zbc_clear_table_entry_v: TypeAlias = struct_rpc_ctrl_get_zbc_clear_table_entry_v1A_0E +@c.record +class struct_rpc_ctrl_get_nvlink_status_v23_04(c.Struct): + SIZE = 3088 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v23_04 +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v23_04(c.Struct): + SIZE = 3080 + enabledLinkMask: int + linkInfo: c.Array[struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v18_0D, Literal[24]] +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v23_04: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v23_04 +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v18_0D(c.Struct): + SIZE = 128 + capsTbl: int + phyType: int + subLinkWidth: int + linkState: int + rxSublinkStatus: int + txSublinkStatus: int + nvlinkVersion: int + nciVersion: int + phyVersion: int + nvlinkLinkClockKHz: int + nvlinkLineRateMbps: int + connected: int + remoteDeviceLinkNumber: int + localDeviceLinkNumber: int + remoteDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v15_02 + localDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v15_02 +NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v18_0D: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v18_0D +@c.record +class struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v15_02(c.Struct): + SIZE = 48 + deviceIdFlags: int + domain: int + bus: int + device: int + function: int + pciDeviceId: int + deviceType: int + deviceUUID: c.Array[ctypes.c_ubyte, Literal[16]] +NV2080_CTRL_NVLINK_DEVICE_INFO_v15_02: TypeAlias = struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v15_02 +struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v15_02.register_fields([('deviceIdFlags', NvU32, 0), ('domain', NvU32, 4), ('bus', NvU16, 8), ('device', NvU16, 10), ('function', NvU16, 12), ('pciDeviceId', NvU32, 16), ('deviceType', NvU64, 24), ('deviceUUID', c.Array[NvU8, Literal[16]], 32)]) +struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v18_0D.register_fields([('capsTbl', NvU32, 0), ('phyType', NvU8, 4), ('subLinkWidth', NvU8, 5), ('linkState', NvU32, 8), ('rxSublinkStatus', NvU8, 12), ('txSublinkStatus', NvU8, 13), ('nvlinkVersion', NvU8, 14), ('nciVersion', NvU8, 15), ('phyVersion', NvU8, 16), ('nvlinkLinkClockKHz', NvU32, 20), ('nvlinkLineRateMbps', NvU32, 24), ('connected', NvBool, 28), ('remoteDeviceLinkNumber', NvU8, 29), ('localDeviceLinkNumber', NvU8, 30), ('remoteDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO_v15_02, 32), ('localDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO_v15_02, 80)]) +struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v23_04.register_fields([('enabledLinkMask', NvU32, 0), ('linkInfo', c.Array[NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v18_0D, Literal[24]], 8)]) +struct_rpc_ctrl_get_nvlink_status_v23_04.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v23_04, 8)]) +rpc_ctrl_get_nvlink_status_v23_04: TypeAlias = struct_rpc_ctrl_get_nvlink_status_v23_04 +@c.record +class struct_rpc_ctrl_get_nvlink_status_v28_09(c.Struct): + SIZE = 3472 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v28_09 +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v28_09(c.Struct): + SIZE = 3464 + enabledLinkMask: int + linkInfo: c.Array[struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v28_09, Literal[24]] +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v28_09: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v28_09 +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v28_09(c.Struct): + SIZE = 144 + capsTbl: int + phyType: int + subLinkWidth: int + linkState: int + rxSublinkStatus: int + txSublinkStatus: int + nvlinkVersion: int + nciVersion: int + phyVersion: int + nvlinkLinkClockKHz: int + nvlinkLineRateMbps: int + connected: int + remoteDeviceLinkNumber: int + localDeviceLinkNumber: int + remoteDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v28_09 + localDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v28_09 +NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v28_09: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v28_09 +@c.record +class struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v28_09(c.Struct): + SIZE = 56 + deviceIdFlags: int + domain: int + bus: int + device: int + function: int + pciDeviceId: int + deviceType: int + deviceUUID: c.Array[ctypes.c_ubyte, Literal[16]] + fabricRecoveryStatusMask: int +NV2080_CTRL_NVLINK_DEVICE_INFO_v28_09: TypeAlias = struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v28_09 +struct_NV2080_CTRL_NVLINK_DEVICE_INFO_v28_09.register_fields([('deviceIdFlags', NvU32, 0), ('domain', NvU32, 4), ('bus', NvU16, 8), ('device', NvU16, 10), ('function', NvU16, 12), ('pciDeviceId', NvU32, 16), ('deviceType', NvU64, 24), ('deviceUUID', c.Array[NvU8, Literal[16]], 32), ('fabricRecoveryStatusMask', NvU32, 48)]) +struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v28_09.register_fields([('capsTbl', NvU32, 0), ('phyType', NvU8, 4), ('subLinkWidth', NvU8, 5), ('linkState', NvU32, 8), ('rxSublinkStatus', NvU8, 12), ('txSublinkStatus', NvU8, 13), ('nvlinkVersion', NvU8, 14), ('nciVersion', NvU8, 15), ('phyVersion', NvU8, 16), ('nvlinkLinkClockKHz', NvU32, 20), ('nvlinkLineRateMbps', NvU32, 24), ('connected', NvBool, 28), ('remoteDeviceLinkNumber', NvU8, 29), ('localDeviceLinkNumber', NvU8, 30), ('remoteDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO_v28_09, 32), ('localDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO_v28_09, 88)]) +struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v28_09.register_fields([('enabledLinkMask', NvU32, 0), ('linkInfo', c.Array[NV2080_CTRL_NVLINK_LINK_STATUS_INFO_v28_09, Literal[24]], 8)]) +struct_rpc_ctrl_get_nvlink_status_v28_09.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_v28_09, 8)]) +rpc_ctrl_get_nvlink_status_v28_09: TypeAlias = struct_rpc_ctrl_get_nvlink_status_v28_09 +rpc_ctrl_get_nvlink_status_v: TypeAlias = struct_rpc_ctrl_get_nvlink_status_v28_09 +@c.record +class struct_rpc_ctrl_get_p2p_caps_v1F_0D(c.Struct): + SIZE = 164 + hClient: int + hObject: int + ctrlParams: struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_v1F_0D +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_v1F_0D(c.Struct): + SIZE = 156 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuCount: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_v1F_0D: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_v1F_0D +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_v1F_0D.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('gpuCount', NvU32, 128), ('p2pCaps', NvU32, 132), ('p2pOptimalReadCEs', NvU32, 136), ('p2pOptimalWriteCEs', NvU32, 140), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 144)]) +struct_rpc_ctrl_get_p2p_caps_v1F_0D.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_v1F_0D, 8)]) +rpc_ctrl_get_p2p_caps_v1F_0D: TypeAlias = struct_rpc_ctrl_get_p2p_caps_v1F_0D +rpc_ctrl_get_p2p_caps_v: TypeAlias = struct_rpc_ctrl_get_p2p_caps_v1F_0D +@c.record +class struct_rpc_ctrl_get_p2p_caps_matrix_v1A_0E(c.Struct): + SIZE = 1360 + hClient: int + hObject: int + ctrlParams: struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_v18_0A +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_v18_0A(c.Struct): + SIZE = 1352 + grpACount: int + grpBCount: int + gpuIdGrpA: c.Array[ctypes.c_uint32, Literal[8]] + gpuIdGrpB: c.Array[ctypes.c_uint32, Literal[8]] + p2pCaps: c.Array[struct_NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]] + a2bOptimalReadCes: c.Array[struct_NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]] + a2bOptimalWriteCes: c.Array[struct_NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]] + b2aOptimalReadCes: c.Array[struct_NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]] + b2aOptimalWriteCes: c.Array[struct_NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]] +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_v18_0A: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_v18_0A +@c.record +class struct_NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A(c.Struct): + SIZE = 32 + array: c.Array[ctypes.c_uint32, Literal[8]] +NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A: TypeAlias = struct_NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A +struct_NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A.register_fields([('array', c.Array[NvU32, Literal[8]], 0)]) +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_v18_0A.register_fields([('grpACount', NvU32, 0), ('grpBCount', NvU32, 4), ('gpuIdGrpA', c.Array[NvU32, Literal[8]], 8), ('gpuIdGrpB', c.Array[NvU32, Literal[8]], 40), ('p2pCaps', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]], 72), ('a2bOptimalReadCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]], 328), ('a2bOptimalWriteCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]], 584), ('b2aOptimalReadCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]], 840), ('b2aOptimalWriteCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW_v18_0A, Literal[8]], 1096)]) +struct_rpc_ctrl_get_p2p_caps_matrix_v1A_0E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_v18_0A, 8)]) +rpc_ctrl_get_p2p_caps_matrix_v1A_0E: TypeAlias = struct_rpc_ctrl_get_p2p_caps_matrix_v1A_0E +rpc_ctrl_get_p2p_caps_matrix_v: TypeAlias = struct_rpc_ctrl_get_p2p_caps_matrix_v1A_0E +@c.record +class struct_rpc_ctrl_reserve_pm_area_smpc_v1A_0F(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_v1A_0F +@c.record +class struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_v1A_0F(c.Struct): + SIZE = 1 + ctxsw: int +NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_v1A_0F: TypeAlias = struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_v1A_0F +struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_v1A_0F.register_fields([('ctxsw', NvBool, 0)]) +struct_rpc_ctrl_reserve_pm_area_smpc_v1A_0F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_v1A_0F, 8)]) +rpc_ctrl_reserve_pm_area_smpc_v1A_0F: TypeAlias = struct_rpc_ctrl_reserve_pm_area_smpc_v1A_0F +rpc_ctrl_reserve_pm_area_smpc_v: TypeAlias = struct_rpc_ctrl_reserve_pm_area_smpc_v1A_0F +@c.record +class struct_rpc_ctrl_reserve_hwpm_legacy_v1A_0F(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_v1A_0F +@c.record +class struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_v1A_0F(c.Struct): + SIZE = 1 + ctxsw: int +NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_v1A_0F: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_v1A_0F +struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_v1A_0F.register_fields([('ctxsw', NvBool, 0)]) +struct_rpc_ctrl_reserve_hwpm_legacy_v1A_0F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_v1A_0F, 8)]) +rpc_ctrl_reserve_hwpm_legacy_v1A_0F: TypeAlias = struct_rpc_ctrl_reserve_hwpm_legacy_v1A_0F +rpc_ctrl_reserve_hwpm_legacy_v: TypeAlias = struct_rpc_ctrl_reserve_hwpm_legacy_v1A_0F +@c.record +class struct_rpc_ctrl_b0cc_exec_reg_ops_v1A_0F(c.Struct): + SIZE = 3988 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_v1A_0F +@c.record +class struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_v1A_0F(c.Struct): + SIZE = 3980 + regOpCount: int + mode: int + bPassed: int + bDirect: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP_v03_00, Literal[124]] +NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_v1A_0F: TypeAlias = struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_v1A_0F +enum_NVB0CC_REGOPS_MODE: dict[int, str] = {(NVB0CC_REGOPS_MODE_ALL_OR_NONE:=0): 'NVB0CC_REGOPS_MODE_ALL_OR_NONE', (NVB0CC_REGOPS_MODE_CONTINUE_ON_ERROR:=1): 'NVB0CC_REGOPS_MODE_CONTINUE_ON_ERROR'} +NVB0CC_REGOPS_MODE: TypeAlias = ctypes.c_uint32 +struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_v1A_0F.register_fields([('regOpCount', NvU32, 0), ('mode', NVB0CC_REGOPS_MODE, 4), ('bPassed', NvBool, 8), ('bDirect', NvBool, 9), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP_v03_00, Literal[124]], 12)]) +struct_rpc_ctrl_b0cc_exec_reg_ops_v1A_0F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_v1A_0F, 8)]) +rpc_ctrl_b0cc_exec_reg_ops_v1A_0F: TypeAlias = struct_rpc_ctrl_b0cc_exec_reg_ops_v1A_0F +rpc_ctrl_b0cc_exec_reg_ops_v: TypeAlias = struct_rpc_ctrl_b0cc_exec_reg_ops_v1A_0F +@c.record +class struct_rpc_ctrl_bind_pm_resources_v1A_0F(c.Struct): + SIZE = 8 + hClient: int + hObject: int +struct_rpc_ctrl_bind_pm_resources_v1A_0F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4)]) +rpc_ctrl_bind_pm_resources_v1A_0F: TypeAlias = struct_rpc_ctrl_bind_pm_resources_v1A_0F +rpc_ctrl_bind_pm_resources_v: TypeAlias = struct_rpc_ctrl_bind_pm_resources_v1A_0F +@c.record +class struct_rpc_ctrl_alloc_pma_stream_v1A_14(c.Struct): + SIZE = 64 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_v1A_14 +@c.record +class struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_v1A_14(c.Struct): + SIZE = 56 + hMemPmaBuffer: int + pmaBufferOffset: int + pmaBufferSize: int + hMemPmaBytesAvailable: int + pmaBytesAvailableOffset: int + ctxsw: int + pmaChannelIdx: int + pmaBufferVA: int +NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_v1A_14: TypeAlias = struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_v1A_14 +struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_v1A_14.register_fields([('hMemPmaBuffer', NvHandle, 0), ('pmaBufferOffset', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('hMemPmaBytesAvailable', NvHandle, 24), ('pmaBytesAvailableOffset', NvU64, 32), ('ctxsw', NvBool, 40), ('pmaChannelIdx', NvU32, 44), ('pmaBufferVA', NvU64, 48)]) +struct_rpc_ctrl_alloc_pma_stream_v1A_14.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_v1A_14, 8)]) +rpc_ctrl_alloc_pma_stream_v1A_14: TypeAlias = struct_rpc_ctrl_alloc_pma_stream_v1A_14 +rpc_ctrl_alloc_pma_stream_v: TypeAlias = struct_rpc_ctrl_alloc_pma_stream_v1A_14 +@c.record +class struct_rpc_ctrl_pma_stream_update_get_put_v1A_14(c.Struct): + SIZE = 56 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_v1A_14 +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_v1A_14(c.Struct): + SIZE = 48 + bytesConsumed: int + bUpdateAvailableBytes: int + bWait: int + bytesAvailable: int + bReturnPut: int + putPtr: int + pmaChannelIdx: int +NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_v1A_14: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_v1A_14 +struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_v1A_14.register_fields([('bytesConsumed', NvU64, 0), ('bUpdateAvailableBytes', NvBool, 8), ('bWait', NvBool, 9), ('bytesAvailable', NvU64, 16), ('bReturnPut', NvBool, 24), ('putPtr', NvU64, 32), ('pmaChannelIdx', NvU32, 40)]) +struct_rpc_ctrl_pma_stream_update_get_put_v1A_14.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_v1A_14, 8)]) +rpc_ctrl_pma_stream_update_get_put_v1A_14: TypeAlias = struct_rpc_ctrl_pma_stream_update_get_put_v1A_14 +rpc_ctrl_pma_stream_update_get_put_v: TypeAlias = struct_rpc_ctrl_pma_stream_update_get_put_v1A_14 +@c.record +class struct_rpc_ctrl_fb_get_info_v2_v25_0A(c.Struct): + SIZE = 452 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v25_0A +@c.record +class struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v25_0A(c.Struct): + SIZE = 444 + fbInfoListSize: int + fbInfoList: c.Array[struct_NV2080_CTRL_FB_INFO_v1A_15, Literal[55]] +NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v25_0A: TypeAlias = struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v25_0A +@c.record +class struct_NV2080_CTRL_FB_INFO_v1A_15(c.Struct): + SIZE = 8 + index: int + data: int +NV2080_CTRL_FB_INFO_v1A_15: TypeAlias = struct_NV2080_CTRL_FB_INFO_v1A_15 +struct_NV2080_CTRL_FB_INFO_v1A_15.register_fields([('index', NvU32, 0), ('data', NvU32, 4)]) +struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v25_0A.register_fields([('fbInfoListSize', NvU32, 0), ('fbInfoList', c.Array[NV2080_CTRL_FB_INFO_v1A_15, Literal[55]], 4)]) +struct_rpc_ctrl_fb_get_info_v2_v25_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v25_0A, 8)]) +rpc_ctrl_fb_get_info_v2_v25_0A: TypeAlias = struct_rpc_ctrl_fb_get_info_v2_v25_0A +@c.record +class struct_rpc_ctrl_fb_get_info_v2_v27_00(c.Struct): + SIZE = 468 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v27_00 +@c.record +class struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v27_00(c.Struct): + SIZE = 460 + fbInfoListSize: int + fbInfoList: c.Array[struct_NV2080_CTRL_FB_INFO_v1A_15, Literal[57]] +NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v27_00: TypeAlias = struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v27_00 +struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v27_00.register_fields([('fbInfoListSize', NvU32, 0), ('fbInfoList', c.Array[NV2080_CTRL_FB_INFO_v1A_15, Literal[57]], 4)]) +struct_rpc_ctrl_fb_get_info_v2_v27_00.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_FB_GET_INFO_V2_PARAMS_v27_00, 8)]) +rpc_ctrl_fb_get_info_v2_v27_00: TypeAlias = struct_rpc_ctrl_fb_get_info_v2_v27_00 +rpc_ctrl_fb_get_info_v2_v: TypeAlias = struct_rpc_ctrl_fb_get_info_v2_v27_00 +@c.record +class struct_rpc_ctrl_fifo_set_channel_properties_v1A_16(c.Struct): + SIZE = 24 + hClient: int + hObject: int + ctrlParams: struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_v03_00 +@c.record +class struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_v03_00(c.Struct): + SIZE = 16 + hChannel: int + property: int + value: int +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_v03_00: TypeAlias = struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_v03_00 +struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_v03_00.register_fields([('hChannel', NvHandle, 0), ('property', NvU32, 4), ('value', NvU64, 8)]) +struct_rpc_ctrl_fifo_set_channel_properties_v1A_16.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_v03_00, 8)]) +rpc_ctrl_fifo_set_channel_properties_v1A_16: TypeAlias = struct_rpc_ctrl_fifo_set_channel_properties_v1A_16 +rpc_ctrl_fifo_set_channel_properties_v: TypeAlias = struct_rpc_ctrl_fifo_set_channel_properties_v1A_16 +@c.record +class struct_rpc_ctrl_gpu_evict_ctx_v1A_1C(c.Struct): + SIZE = 28 + hClient: int + hObject: int + params: struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS_v03_00 +@c.record +class struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS_v03_00(c.Struct): + SIZE = 20 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int +NV2080_CTRL_GPU_EVICT_CTX_PARAMS_v03_00: TypeAlias = struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS_v03_00 +struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS_v03_00.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16)]) +struct_rpc_ctrl_gpu_evict_ctx_v1A_1C.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_GPU_EVICT_CTX_PARAMS_v03_00, 8)]) +rpc_ctrl_gpu_evict_ctx_v1A_1C: TypeAlias = struct_rpc_ctrl_gpu_evict_ctx_v1A_1C +rpc_ctrl_gpu_evict_ctx_v: TypeAlias = struct_rpc_ctrl_gpu_evict_ctx_v1A_1C +@c.record +class struct_rpc_ctrl_fb_get_fs_info_v24_00(c.Struct): + SIZE = 3856 + hClient: int + hObject: int + params: struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v24_00 +@c.record +class struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v24_00(c.Struct): + SIZE = 3848 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_FB_FS_INFO_QUERY_v1A_1D, Literal[120]] +NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v24_00: TypeAlias = struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v24_00 +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_QUERY_v1A_1D(c.Struct): + SIZE = 32 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryParams: union_NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v1A_1D +NV2080_CTRL_FB_FS_INFO_QUERY_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_QUERY_v1A_1D +@c.record +class union_NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v1A_1D(c.Struct): + SIZE = 24 + inv: struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS_v1A_1D + fbp: struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS_v1A_1D + ltc: struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS_v1A_1D + lts: struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS_v1A_1D + fbpa: struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS_v1A_1D + rop: struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS_v1A_1D + dmLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS_v1A_1D + dmLts: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS_v1A_1D + dmFbpa: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS_v1A_1D + dmRop: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS_v1A_1D + dmFbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS_v1A_1D + fbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS_v1A_1D + fbpLogicalMap: struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS_v1A_1D +NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v1A_1D: TypeAlias = union_NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v1A_1D +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS_v1A_1D(c.Struct): + SIZE = 24 + data: c.Array[ctypes.c_ubyte, Literal[24]] +NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS_v1A_1D.register_fields([('data', c.Array[NvU8, Literal[24]], 0)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 16 + swizzId: int + fbpEnMask: int +NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS_v1A_1D.register_fields([('swizzId', NvU32, 0), ('fbpEnMask', NvU64, 8)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + fbpIndex: int + ltcEnMask: int +NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('ltcEnMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + fbpIndex: int + ltsEnMask: int +NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('ltsEnMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + fbpIndex: int + fbpaEnMask: int +NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('fbpaEnMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + fbpIndex: int + ropEnMask: int +NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('ropEnMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ltcEnMask: int +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ltcEnMask', NvU32, 8)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ltsEnMask: int +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ltsEnMask', NvU32, 8)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + fbpaEnMask: int +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('fbpaEnMask', NvU32, 8)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ropEnMask: int +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ropEnMask', NvU32, 8)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 16 + fbpIndex: int + swizzId: int + fbpaSubpEnMask: int +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('fbpaSubpEnMask', NvU64, 8)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + fbpIndex: int + fbpaSubpEnMask: int +NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('fbpaSubpEnMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + fbpIndex: int + fbpLogicalIndex: int +NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS_v1A_1D +struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS_v1A_1D.register_fields([('fbpIndex', NvU32, 0), ('fbpLogicalIndex', NvU32, 4)]) +union_NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v1A_1D.register_fields([('inv', NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS_v1A_1D, 0), ('fbp', NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS_v1A_1D, 0), ('ltc', NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS_v1A_1D, 0), ('lts', NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS_v1A_1D, 0), ('fbpa', NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS_v1A_1D, 0), ('rop', NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS_v1A_1D, 0), ('dmLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS_v1A_1D, 0), ('dmLts', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS_v1A_1D, 0), ('dmFbpa', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS_v1A_1D, 0), ('dmRop', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS_v1A_1D, 0), ('dmFbpaSubp', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS_v1A_1D, 0), ('fbpaSubp', NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS_v1A_1D, 0), ('fbpLogicalMap', NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS_v1A_1D, 0)]) +struct_NV2080_CTRL_FB_FS_INFO_QUERY_v1A_1D.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryParams', NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v1A_1D, 8)]) +struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v24_00.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_FB_FS_INFO_QUERY_v1A_1D, Literal[120]], 8)]) +struct_rpc_ctrl_fb_get_fs_info_v24_00.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v24_00, 8)]) +rpc_ctrl_fb_get_fs_info_v24_00: TypeAlias = struct_rpc_ctrl_fb_get_fs_info_v24_00 +@c.record +class struct_rpc_ctrl_fb_get_fs_info_v26_04(c.Struct): + SIZE = 3856 + hClient: int + hObject: int + params: struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v26_04 +@c.record +class struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v26_04(c.Struct): + SIZE = 3848 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_FB_FS_INFO_QUERY_v26_04, Literal[120]] +NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v26_04: TypeAlias = struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v26_04 +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_QUERY_v26_04(c.Struct): + SIZE = 32 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryParams: union_NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v26_04 +NV2080_CTRL_FB_FS_INFO_QUERY_v26_04: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_QUERY_v26_04 +@c.record +class union_NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v26_04(c.Struct): + SIZE = 24 + inv: struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS_v1A_1D + fbp: struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS_v1A_1D + ltc: struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS_v1A_1D + lts: struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS_v1A_1D + fbpa: struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS_v1A_1D + rop: struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS_v1A_1D + dmLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS_v1A_1D + dmLts: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS_v1A_1D + dmFbpa: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS_v1A_1D + dmRop: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS_v1A_1D + dmFbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS_v1A_1D + fbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS_v1A_1D + fbpLogicalMap: struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS_v1A_1D + sysl2Ltc: struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS_v26_04 + pac: struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS_v26_04 + logicalLtc: struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS_v26_04 + dmLogicalLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS_v26_04 +NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v26_04: TypeAlias = union_NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v26_04 +@c.record +class struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS_v26_04(c.Struct): + SIZE = 8 + sysIdx: int + sysl2LtcEnMask: int +NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS_v26_04: TypeAlias = struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS_v26_04 +struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS_v26_04.register_fields([('sysIdx', NvU32, 0), ('sysl2LtcEnMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS_v26_04(c.Struct): + SIZE = 8 + fbpIndex: int + pacEnMask: int +NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS_v26_04: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS_v26_04 +struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS_v26_04.register_fields([('fbpIndex', NvU32, 0), ('pacEnMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS_v26_04(c.Struct): + SIZE = 16 + fbpIndex: int + logicalLtcEnMask: int +NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS_v26_04: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS_v26_04 +struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS_v26_04.register_fields([('fbpIndex', NvU32, 0), ('logicalLtcEnMask', NvU64, 8)]) +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS_v26_04(c.Struct): + SIZE = 16 + fbpIndex: int + swizzId: int + logicalLtcEnMask: int +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS_v26_04: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS_v26_04 +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS_v26_04.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('logicalLtcEnMask', NvU64, 8)]) +union_NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v26_04.register_fields([('inv', NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS_v1A_1D, 0), ('fbp', NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS_v1A_1D, 0), ('ltc', NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS_v1A_1D, 0), ('lts', NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS_v1A_1D, 0), ('fbpa', NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS_v1A_1D, 0), ('rop', NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS_v1A_1D, 0), ('dmLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS_v1A_1D, 0), ('dmLts', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS_v1A_1D, 0), ('dmFbpa', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS_v1A_1D, 0), ('dmRop', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS_v1A_1D, 0), ('dmFbpaSubp', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS_v1A_1D, 0), ('fbpaSubp', NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS_v1A_1D, 0), ('fbpLogicalMap', NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS_v1A_1D, 0), ('sysl2Ltc', NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS_v26_04, 0), ('pac', NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS_v26_04, 0), ('logicalLtc', NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS_v26_04, 0), ('dmLogicalLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS_v26_04, 0)]) +struct_NV2080_CTRL_FB_FS_INFO_QUERY_v26_04.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryParams', NV2080_CTRL_FB_FS_INFO_QUERY_DATA_v26_04, 8)]) +struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v26_04.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_FB_FS_INFO_QUERY_v26_04, Literal[120]], 8)]) +struct_rpc_ctrl_fb_get_fs_info_v26_04.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_FB_GET_FS_INFO_PARAMS_v26_04, 8)]) +rpc_ctrl_fb_get_fs_info_v26_04: TypeAlias = struct_rpc_ctrl_fb_get_fs_info_v26_04 +rpc_ctrl_fb_get_fs_info_v: TypeAlias = struct_rpc_ctrl_fb_get_fs_info_v26_04 +@c.record +class struct_rpc_ctrl_grmgr_get_gr_fs_info_v1A_1D(c.Struct): + SIZE = 1936 + hClient: int + hObject: int + params: struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_v1A_1D +@c.record +class struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_v1A_1D(c.Struct): + SIZE = 1928 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_v1A_1D, Literal[96]] +NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_v1A_1D +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_v1A_1D(c.Struct): + SIZE = 20 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryData: union_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_DATA_v1A_1D +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_v1A_1D +@c.record +class union_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_DATA_v1A_1D(c.Struct): + SIZE = 12 + gpcCountData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS_v1A_1D + chipletGpcMapData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS_v1A_1D + tpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS_v1A_1D + ppcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS_v1A_1D + partitionGpcMapData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS_v1A_1D + syspipeMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS_v1A_1D + partitionChipletSyspipeData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS_v1A_1D + dmGpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS_v1A_1D + partitionSyspipeIdData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS_v1A_1D + ropMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS_v1A_1D +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_DATA_v1A_1D: TypeAlias = union_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_DATA_v1A_1D +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS_v1A_1D(c.Struct): + SIZE = 4 + gpcCount: int +NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS_v1A_1D.register_fields([('gpcCount', NvU32, 0)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + gpcId: int + chipletGpcMap: int +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS_v1A_1D.register_fields([('gpcId', NvU32, 0), ('chipletGpcMap', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + gpcId: int + tpcMask: int +NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS_v1A_1D.register_fields([('gpcId', NvU32, 0), ('tpcMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + gpcId: int + ppcMask: int +NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS_v1A_1D.register_fields([('gpcId', NvU32, 0), ('ppcMask', NvU32, 4)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS_v1A_1D(c.Struct): + SIZE = 12 + swizzId: int + gpcId: int + chipletGpcMap: int +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS_v1A_1D.register_fields([('swizzId', NvU32, 0), ('gpcId', NvU32, 4), ('chipletGpcMap', NvU32, 8)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 4 + chipletSyspipeMask: int +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS_v1A_1D.register_fields([('chipletSyspipeMask', NvU32, 0)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS_v1A_1D(c.Struct): + SIZE = 12 + swizzId: int + physSyspipeIdCount: int + physSyspipeId: c.Array[ctypes.c_ubyte, Literal[8]] +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS_v1A_1D.register_fields([('swizzId', NvU16, 0), ('physSyspipeIdCount', NvU16, 2), ('physSyspipeId', c.Array[NvU8, Literal[8]], 4)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 12 + swizzId: int + grIdx: int + gpcEnMask: int +NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS_v1A_1D.register_fields([('swizzId', NvU32, 0), ('grIdx', NvU32, 4), ('gpcEnMask', NvU32, 8)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS_v1A_1D(c.Struct): + SIZE = 4 + syspipeId: int +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS_v1A_1D.register_fields([('syspipeId', NvU32, 0)]) +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS_v1A_1D(c.Struct): + SIZE = 8 + gpcId: int + ropMask: int +NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS_v1A_1D: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS_v1A_1D +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS_v1A_1D.register_fields([('gpcId', NvU32, 0), ('ropMask', NvU32, 4)]) +union_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_DATA_v1A_1D.register_fields([('gpcCountData', NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS_v1A_1D, 0), ('chipletGpcMapData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS_v1A_1D, 0), ('tpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS_v1A_1D, 0), ('ppcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS_v1A_1D, 0), ('partitionGpcMapData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS_v1A_1D, 0), ('syspipeMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS_v1A_1D, 0), ('partitionChipletSyspipeData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS_v1A_1D, 0), ('dmGpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS_v1A_1D, 0), ('partitionSyspipeIdData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS_v1A_1D, 0), ('ropMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS_v1A_1D, 0)]) +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_v1A_1D.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryData', NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_DATA_v1A_1D, 8)]) +struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_v1A_1D.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_v1A_1D, Literal[96]], 8)]) +struct_rpc_ctrl_grmgr_get_gr_fs_info_v1A_1D.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_v1A_1D, 8)]) +rpc_ctrl_grmgr_get_gr_fs_info_v1A_1D: TypeAlias = struct_rpc_ctrl_grmgr_get_gr_fs_info_v1A_1D +rpc_ctrl_grmgr_get_gr_fs_info_v: TypeAlias = struct_rpc_ctrl_grmgr_get_gr_fs_info_v1A_1D +@c.record +class struct_rpc_ctrl_stop_channel_v1A_1E(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS_v1A_1E +@c.record +class struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS_v1A_1E(c.Struct): + SIZE = 1 + bImmediate: int +NVA06F_CTRL_STOP_CHANNEL_PARAMS_v1A_1E: TypeAlias = struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS_v1A_1E +struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS_v1A_1E.register_fields([('bImmediate', NvBool, 0)]) +struct_rpc_ctrl_stop_channel_v1A_1E.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVA06F_CTRL_STOP_CHANNEL_PARAMS_v1A_1E, 8)]) +rpc_ctrl_stop_channel_v1A_1E: TypeAlias = struct_rpc_ctrl_stop_channel_v1A_1E +rpc_ctrl_stop_channel_v: TypeAlias = struct_rpc_ctrl_stop_channel_v1A_1E +@c.record +class struct_rpc_ctrl_gr_pc_sampling_mode_v1A_1F(c.Struct): + SIZE = 32 + hClient: int + hObject: int + params: struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_v1A_1F +@c.record +class struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_v1A_1F(c.Struct): + SIZE = 24 + hChannel: int + samplingMode: int + grRouteInfo: struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01 +NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_v1A_1F: TypeAlias = struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_v1A_1F +struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_v1A_1F.register_fields([('hChannel', NvHandle, 0), ('samplingMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO_v12_01, 8)]) +struct_rpc_ctrl_gr_pc_sampling_mode_v1A_1F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_v1A_1F, 8)]) +rpc_ctrl_gr_pc_sampling_mode_v1A_1F: TypeAlias = struct_rpc_ctrl_gr_pc_sampling_mode_v1A_1F +rpc_ctrl_gr_pc_sampling_mode_v: TypeAlias = struct_rpc_ctrl_gr_pc_sampling_mode_v1A_1F +@c.record +class struct_rpc_ctrl_perf_rated_tdp_get_status_v1A_1F(c.Struct): + SIZE = 40 + hClient: int + hObject: int + params: struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_v1A_1F +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_v1A_1F(c.Struct): + SIZE = 32 + rm: struct_PERF_RATED_TDP_RM_INTERNAL_STATE_STRUCT_v1A_1F + output: int + inputs: c.Array[ctypes.c_uint32, Literal[5]] +NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_v1A_1F: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_v1A_1F +@c.record +class struct_PERF_RATED_TDP_RM_INTERNAL_STATE_STRUCT_v1A_1F(c.Struct): + SIZE = 8 + clientActiveMask: int + bRegkeyLimitRatedTdp: int +PERF_RATED_TDP_RM_INTERNAL_STATE_STRUCT_v1A_1F: TypeAlias = struct_PERF_RATED_TDP_RM_INTERNAL_STATE_STRUCT_v1A_1F +struct_PERF_RATED_TDP_RM_INTERNAL_STATE_STRUCT_v1A_1F.register_fields([('clientActiveMask', NvU32, 0), ('bRegkeyLimitRatedTdp', NvU8, 4)]) +enum_NV2080_CTRL_PERF_RATED_TDP_ACTION: dict[int, str] = {(NV2080_CTRL_PERF_RATED_TDP_ACTION_DEFAULT:=0): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_DEFAULT', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_EXCEED:=1): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_EXCEED', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LIMIT:=2): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LIMIT', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LOCK:=3): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LOCK', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_FLOOR:=4): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_FLOOR'} +NV2080_CTRL_PERF_RATED_TDP_ACTION: TypeAlias = ctypes.c_uint32 +struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_v1A_1F.register_fields([('rm', PERF_RATED_TDP_RM_INTERNAL_STATE_STRUCT_v1A_1F, 0), ('output', NV2080_CTRL_PERF_RATED_TDP_ACTION, 8), ('inputs', c.Array[NV2080_CTRL_PERF_RATED_TDP_ACTION, Literal[5]], 12)]) +struct_rpc_ctrl_perf_rated_tdp_get_status_v1A_1F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_v1A_1F, 8)]) +rpc_ctrl_perf_rated_tdp_get_status_v1A_1F: TypeAlias = struct_rpc_ctrl_perf_rated_tdp_get_status_v1A_1F +rpc_ctrl_perf_rated_tdp_get_status_v: TypeAlias = struct_rpc_ctrl_perf_rated_tdp_get_status_v1A_1F +@c.record +class struct_rpc_ctrl_perf_rated_tdp_set_control_v1A_1F(c.Struct): + SIZE = 16 + hClient: int + hObject: int + params: struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS_v1A_1F +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS_v1A_1F(c.Struct): + SIZE = 8 + client: int + input: int +NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS_v1A_1F: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS_v1A_1F +enum_NV2080_CTRL_PERF_RATED_TDP_CLIENT: dict[int, str] = {(NV2080_CTRL_PERF_RATED_TDP_CLIENT_RM:=0): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_RM', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_WAR_BUG_1785342:=1): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_WAR_BUG_1785342', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_GLOBAL:=2): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_GLOBAL', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_OS:=3): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_OS', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_PROFILE:=4): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_PROFILE', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_NUM_CLIENTS:=5): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_NUM_CLIENTS'} +NV2080_CTRL_PERF_RATED_TDP_CLIENT: TypeAlias = ctypes.c_uint32 +struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS_v1A_1F.register_fields([('client', NV2080_CTRL_PERF_RATED_TDP_CLIENT, 0), ('input', NV2080_CTRL_PERF_RATED_TDP_ACTION, 4)]) +struct_rpc_ctrl_perf_rated_tdp_set_control_v1A_1F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS_v1A_1F, 8)]) +rpc_ctrl_perf_rated_tdp_set_control_v1A_1F: TypeAlias = struct_rpc_ctrl_perf_rated_tdp_set_control_v1A_1F +rpc_ctrl_perf_rated_tdp_set_control_v: TypeAlias = struct_rpc_ctrl_perf_rated_tdp_set_control_v1A_1F +@c.record +class struct_rpc_ctrl_timer_set_gr_tick_freq_v1A_1F(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_v1A_1F +@c.record +class struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_v1A_1F(c.Struct): + SIZE = 1 + bSetMaxFreq: int +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_v1A_1F: TypeAlias = struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_v1A_1F +struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_v1A_1F.register_fields([('bSetMaxFreq', NvBool, 0)]) +struct_rpc_ctrl_timer_set_gr_tick_freq_v1A_1F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_v1A_1F, 8)]) +rpc_ctrl_timer_set_gr_tick_freq_v1A_1F: TypeAlias = struct_rpc_ctrl_timer_set_gr_tick_freq_v1A_1F +rpc_ctrl_timer_set_gr_tick_freq_v: TypeAlias = struct_rpc_ctrl_timer_set_gr_tick_freq_v1A_1F +@c.record +class struct_rpc_ctrl_free_pma_stream_v1A_1F(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_v1A_1F +@c.record +class struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_v1A_1F(c.Struct): + SIZE = 4 + pmaChannelIdx: int +NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_v1A_1F: TypeAlias = struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_v1A_1F +struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_v1A_1F.register_fields([('pmaChannelIdx', NvU32, 0)]) +struct_rpc_ctrl_free_pma_stream_v1A_1F.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_v1A_1F, 8)]) +rpc_ctrl_free_pma_stream_v1A_1F: TypeAlias = struct_rpc_ctrl_free_pma_stream_v1A_1F +rpc_ctrl_free_pma_stream_v: TypeAlias = struct_rpc_ctrl_free_pma_stream_v1A_1F +@c.record +class struct_rpc_ctrl_fifo_setup_vf_zombie_subctx_pdb_v1A_23(c.Struct): + SIZE = 32 + hClient: int + hObject: int + params: struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_v1A_23 +@c.record +class struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_v1A_23(c.Struct): + SIZE = 24 + base: int + size: int + addressSpace: int + cacheAttrib: int +NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_v1A_23: TypeAlias = struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_v1A_23 +struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_v1A_23.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('addressSpace', NvU32, 16), ('cacheAttrib', NvU32, 20)]) +struct_rpc_ctrl_fifo_setup_vf_zombie_subctx_pdb_v1A_23.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_v1A_23, 8)]) +rpc_ctrl_fifo_setup_vf_zombie_subctx_pdb_v1A_23: TypeAlias = struct_rpc_ctrl_fifo_setup_vf_zombie_subctx_pdb_v1A_23 +rpc_ctrl_fifo_setup_vf_zombie_subctx_pdb_v: TypeAlias = struct_rpc_ctrl_fifo_setup_vf_zombie_subctx_pdb_v1A_23 +@c.record +class struct_rpc_ctrl_dbg_set_single_sm_single_step_v1C_02(c.Struct): + SIZE = 16 + hClient: int + hObject: int + params: struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_v1C_02 +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_v1C_02(c.Struct): + SIZE = 8 + smID: int + bSingleStep: int +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_v1C_02: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_v1C_02 +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_v1C_02.register_fields([('smID', NvU32, 0), ('bSingleStep', NvBool, 4)]) +struct_rpc_ctrl_dbg_set_single_sm_single_step_v1C_02.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_v1C_02, 8)]) +rpc_ctrl_dbg_set_single_sm_single_step_v1C_02: TypeAlias = struct_rpc_ctrl_dbg_set_single_sm_single_step_v1C_02 +rpc_ctrl_dbg_set_single_sm_single_step_v: TypeAlias = struct_rpc_ctrl_dbg_set_single_sm_single_step_v1C_02 +@c.record +class struct_rpc_ctrl_gr_get_tpc_partition_mode_v1C_04(c.Struct): + SIZE = 40 + hClient: int + hObject: int + params: struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS_v1C_04 +@c.record +class struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS_v1C_04(c.Struct): + SIZE = 32 + hChannelGroup: int + mode: int + bEnableAllTpcs: int + grRouteInfo: struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01 +NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS_v1C_04: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS_v1C_04 +enum_NV0080_CTRL_GR_TPC_PARTITION_MODE: dict[int, str] = {(NV0080_CTRL_GR_TPC_PARTITION_MODE_NONE:=0): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_NONE', (NV0080_CTRL_GR_TPC_PARTITION_MODE_STATIC:=1): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_STATIC', (NV0080_CTRL_GR_TPC_PARTITION_MODE_DYNAMIC:=2): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_DYNAMIC'} +NV0080_CTRL_GR_TPC_PARTITION_MODE: TypeAlias = ctypes.c_uint32 +struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS_v1C_04.register_fields([('hChannelGroup', NvHandle, 0), ('mode', NV0080_CTRL_GR_TPC_PARTITION_MODE, 4), ('bEnableAllTpcs', NvBool, 8), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO_v12_01, 16)]) +struct_rpc_ctrl_gr_get_tpc_partition_mode_v1C_04.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS_v1C_04, 8)]) +rpc_ctrl_gr_get_tpc_partition_mode_v1C_04: TypeAlias = struct_rpc_ctrl_gr_get_tpc_partition_mode_v1C_04 +rpc_ctrl_gr_get_tpc_partition_mode_v: TypeAlias = struct_rpc_ctrl_gr_get_tpc_partition_mode_v1C_04 +@c.record +class struct_rpc_ctrl_gr_set_tpc_partition_mode_v1C_04(c.Struct): + SIZE = 40 + hClient: int + hObject: int + params: struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS_v1C_04 +struct_rpc_ctrl_gr_set_tpc_partition_mode_v1C_04.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS_v1C_04, 8)]) +rpc_ctrl_gr_set_tpc_partition_mode_v1C_04: TypeAlias = struct_rpc_ctrl_gr_set_tpc_partition_mode_v1C_04 +rpc_ctrl_gr_set_tpc_partition_mode_v: TypeAlias = struct_rpc_ctrl_gr_set_tpc_partition_mode_v1C_04 +@c.record +class struct_rpc_ctrl_internal_promote_fault_method_buffers_v1E_07(c.Struct): + SIZE = 96 + hClient: int + hObject: int + params: struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_v1E_07 +@c.record +class struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_v1E_07(c.Struct): + SIZE = 88 + methodBufferMemdesc: c.Array[struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO_v1E_07, Literal[2]] + bar2Addr: c.Array[ctypes.c_uint64, Literal[2]] + numValidEntries: int +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_v1E_07: TypeAlias = struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_v1E_07 +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO_v1E_07(c.Struct): + SIZE = 32 + base: int + size: int + alignment: int + addressSpace: int + cpuCacheAttrib: int +NV2080_CTRL_INTERNAL_MEMDESC_INFO_v1E_07: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO_v1E_07 +struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO_v1E_07.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('alignment', NvU64, 16), ('addressSpace', NvU32, 24), ('cpuCacheAttrib', NvU32, 28)]) +struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_v1E_07.register_fields([('methodBufferMemdesc', c.Array[NV2080_CTRL_INTERNAL_MEMDESC_INFO_v1E_07, Literal[2]], 0), ('bar2Addr', c.Array[NvU64, Literal[2]], 64), ('numValidEntries', NvU32, 80)]) +struct_rpc_ctrl_internal_promote_fault_method_buffers_v1E_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_v1E_07, 8)]) +rpc_ctrl_internal_promote_fault_method_buffers_v1E_07: TypeAlias = struct_rpc_ctrl_internal_promote_fault_method_buffers_v1E_07 +rpc_ctrl_internal_promote_fault_method_buffers_v: TypeAlias = struct_rpc_ctrl_internal_promote_fault_method_buffers_v1E_07 +@c.record +class struct_rpc_ctrl_internal_memsys_set_zbc_referenced_v1F_05(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_v1F_05 +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_v1F_05(c.Struct): + SIZE = 1 + bZbcSurfacesExist: int +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_v1F_05: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_v1F_05 +struct_NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_v1F_05.register_fields([('bZbcSurfacesExist', NvBool, 0)]) +struct_rpc_ctrl_internal_memsys_set_zbc_referenced_v1F_05.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_v1F_05, 8)]) +rpc_ctrl_internal_memsys_set_zbc_referenced_v1F_05: TypeAlias = struct_rpc_ctrl_internal_memsys_set_zbc_referenced_v1F_05 +rpc_ctrl_internal_memsys_set_zbc_referenced_v: TypeAlias = struct_rpc_ctrl_internal_memsys_set_zbc_referenced_v1F_05 +@c.record +class struct_rpc_ctrl_fabric_memory_describe_v1E_0C(c.Struct): + SIZE = 2080 + hClient: int + hObject: int + params: struct_NV00F8_CTRL_DESCRIBE_PARAMS_v1E_0C +@c.record +class struct_NV00F8_CTRL_DESCRIBE_PARAMS_v1E_0C(c.Struct): + SIZE = 2072 + offset: int + totalPfns: int + pfnArray: c.Array[ctypes.c_uint32, Literal[512]] + numPfns: int +NV00F8_CTRL_DESCRIBE_PARAMS_v1E_0C: TypeAlias = struct_NV00F8_CTRL_DESCRIBE_PARAMS_v1E_0C +struct_NV00F8_CTRL_DESCRIBE_PARAMS_v1E_0C.register_fields([('offset', NvU64, 0), ('totalPfns', NvU64, 8), ('pfnArray', c.Array[NvU32, Literal[512]], 16), ('numPfns', NvU32, 2064)]) +struct_rpc_ctrl_fabric_memory_describe_v1E_0C.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV00F8_CTRL_DESCRIBE_PARAMS_v1E_0C, 8)]) +rpc_ctrl_fabric_memory_describe_v1E_0C: TypeAlias = struct_rpc_ctrl_fabric_memory_describe_v1E_0C +rpc_ctrl_fabric_memory_describe_v: TypeAlias = struct_rpc_ctrl_fabric_memory_describe_v1E_0C +@c.record +class struct_rpc_ctrl_fabric_mem_stats_v1E_0C(c.Struct): + SIZE = 24 + hClient: int + hObject: int + params: struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_v1E_0C +@c.record +class struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_v1E_0C(c.Struct): + SIZE = 16 + totalSize: int + freeSize: int +NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_v1E_0C: TypeAlias = struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_v1E_0C +struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_v1E_0C.register_fields([('totalSize', NvU64, 0), ('freeSize', NvU64, 8)]) +struct_rpc_ctrl_fabric_mem_stats_v1E_0C.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_v1E_0C, 8)]) +rpc_ctrl_fabric_mem_stats_v1E_0C: TypeAlias = struct_rpc_ctrl_fabric_mem_stats_v1E_0C +rpc_ctrl_fabric_mem_stats_v: TypeAlias = struct_rpc_ctrl_fabric_mem_stats_v1E_0C +@c.record +class struct_rpc_ctrl_bus_set_p2p_mapping_v21_03(c.Struct): + SIZE = 44 + hClient: int + hObject: int + params: struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v21_03 +@c.record +class struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v21_03(c.Struct): + SIZE = 36 + connectionType: int + peerId: int + bSpaAccessOnly: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v21_03: TypeAlias = struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v21_03 +struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v21_03.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bSpaAccessOnly', NvU32, 8), ('bUseUuid', NvBool, 12), ('remoteGpuId', NvU32, 16), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 20)]) +struct_rpc_ctrl_bus_set_p2p_mapping_v21_03.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v21_03, 8)]) +rpc_ctrl_bus_set_p2p_mapping_v21_03: TypeAlias = struct_rpc_ctrl_bus_set_p2p_mapping_v21_03 +@c.record +class struct_rpc_ctrl_bus_set_p2p_mapping_v29_08(c.Struct): + SIZE = 48 + hClient: int + hObject: int + params: struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v29_08 +@c.record +class struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v29_08(c.Struct): + SIZE = 40 + connectionType: int + peerId: int + bEgmPeer: int + bSpaAccessOnly: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v29_08: TypeAlias = struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v29_08 +struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v29_08.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bEgmPeer', NvBool, 8), ('bSpaAccessOnly', NvU32, 12), ('bUseUuid', NvBool, 16), ('remoteGpuId', NvU32, 20), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 24)]) +struct_rpc_ctrl_bus_set_p2p_mapping_v29_08.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_v29_08, 8)]) +rpc_ctrl_bus_set_p2p_mapping_v29_08: TypeAlias = struct_rpc_ctrl_bus_set_p2p_mapping_v29_08 +rpc_ctrl_bus_set_p2p_mapping_v: TypeAlias = struct_rpc_ctrl_bus_set_p2p_mapping_v29_08 +@c.record +class struct_rpc_ctrl_bus_unset_p2p_mapping_v21_03(c.Struct): + SIZE = 40 + hClient: int + hObject: int + params: struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_v21_03 +@c.record +class struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_v21_03(c.Struct): + SIZE = 32 + connectionType: int + peerId: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_v21_03: TypeAlias = struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_v21_03 +struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_v21_03.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bUseUuid', NvBool, 8), ('remoteGpuId', NvU32, 12), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 16)]) +struct_rpc_ctrl_bus_unset_p2p_mapping_v21_03.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_v21_03, 8)]) +rpc_ctrl_bus_unset_p2p_mapping_v21_03: TypeAlias = struct_rpc_ctrl_bus_unset_p2p_mapping_v21_03 +rpc_ctrl_bus_unset_p2p_mapping_v: TypeAlias = struct_rpc_ctrl_bus_unset_p2p_mapping_v21_03 +@c.record +class struct_rpc_ctrl_gpu_get_info_v2_v25_11(c.Struct): + SIZE = 532 + hClient: int + hObject: int + params: struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_v25_11 +@c.record +class struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_v25_11(c.Struct): + SIZE = 524 + gpuInfoListSize: int + gpuInfoList: c.Array[struct_NV2080_CTRL_GPU_INFO_v25_11, Literal[65]] +NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_v25_11: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_v25_11 +@c.record +class struct_NV2080_CTRL_GPU_INFO_v25_11(c.Struct): + SIZE = 8 + index: int + data: int +NV2080_CTRL_GPU_INFO_v25_11: TypeAlias = struct_NV2080_CTRL_GPU_INFO_v25_11 +struct_NV2080_CTRL_GPU_INFO_v25_11.register_fields([('index', NvU32, 0), ('data', NvU32, 4)]) +struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_v25_11.register_fields([('gpuInfoListSize', NvU32, 0), ('gpuInfoList', c.Array[NV2080_CTRL_GPU_INFO_v25_11, Literal[65]], 4)]) +struct_rpc_ctrl_gpu_get_info_v2_v25_11.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_v25_11, 8)]) +rpc_ctrl_gpu_get_info_v2_v25_11: TypeAlias = struct_rpc_ctrl_gpu_get_info_v2_v25_11 +rpc_ctrl_gpu_get_info_v2_v: TypeAlias = struct_rpc_ctrl_gpu_get_info_v2_v25_11 +@c.record +class struct_rpc_update_gpm_guest_buffer_info_v27_01(c.Struct): + SIZE = 24 + gpfn: int + swizzId: int + computeId: int + bufSize: int + bMap: int +struct_rpc_update_gpm_guest_buffer_info_v27_01.register_fields([('gpfn', NvU64, 0), ('swizzId', NvU32, 8), ('computeId', NvU32, 12), ('bufSize', NvU32, 16), ('bMap', NvBool, 20)]) +rpc_update_gpm_guest_buffer_info_v27_01: TypeAlias = struct_rpc_update_gpm_guest_buffer_info_v27_01 +rpc_update_gpm_guest_buffer_info_v: TypeAlias = struct_rpc_update_gpm_guest_buffer_info_v27_01 +@c.record +class struct_rpc_ctrl_internal_quiesce_pma_channel_v1C_08(c.Struct): + SIZE = 16 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_v1C_08 +@c.record +class struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_v1C_08(c.Struct): + SIZE = 8 + pmaChannelIdx: int + bMembytesPollingRequired: int +NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_v1C_08: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_v1C_08 +struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_v1C_08.register_fields([('pmaChannelIdx', NvU32, 0), ('bMembytesPollingRequired', NvBool, 4)]) +struct_rpc_ctrl_internal_quiesce_pma_channel_v1C_08.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_v1C_08, 8)]) +rpc_ctrl_internal_quiesce_pma_channel_v1C_08: TypeAlias = struct_rpc_ctrl_internal_quiesce_pma_channel_v1C_08 +rpc_ctrl_internal_quiesce_pma_channel_v: TypeAlias = struct_rpc_ctrl_internal_quiesce_pma_channel_v1C_08 +@c.record +class struct_rpc_ctrl_internal_sriov_promote_pma_stream_v1C_0C(c.Struct): + SIZE = 56 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_v1C_0C +@c.record +class struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_v1C_0C(c.Struct): + SIZE = 48 + pmaChannelIdx: int + pmaBufferVA: int + pmaBufferSize: int + membytesVA: int + hwpmIBPA: int + hwpmIBAperture: int +NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_v1C_0C: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_v1C_0C +struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_v1C_0C.register_fields([('pmaChannelIdx', NvU32, 0), ('pmaBufferVA', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('membytesVA', NvU64, 24), ('hwpmIBPA', NvU64, 32), ('hwpmIBAperture', NvU8, 40)]) +struct_rpc_ctrl_internal_sriov_promote_pma_stream_v1C_0C.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_v1C_0C, 8)]) +rpc_ctrl_internal_sriov_promote_pma_stream_v1C_0C: TypeAlias = struct_rpc_ctrl_internal_sriov_promote_pma_stream_v1C_0C +rpc_ctrl_internal_sriov_promote_pma_stream_v: TypeAlias = struct_rpc_ctrl_internal_sriov_promote_pma_stream_v1C_0C +@c.record +class struct_rpc_ctrl_exec_partitions_create_v24_05(c.Struct): + SIZE = 436 + hClient: int + hObject: int + status: int + execPartitionsCreate: struct_NVC637_CTRL_EXEC_PARTITIONS_CREATE_PARAMS_v24_05 +@c.record +class struct_NVC637_CTRL_EXEC_PARTITIONS_CREATE_PARAMS_v24_05(c.Struct): + SIZE = 424 + bQuery: int + execPartCount: int + execPartInfo: c.Array[struct_NVC637_CTRL_EXEC_PARTITIONS_INFO_v24_05, Literal[8]] + execPartId: c.Array[ctypes.c_uint32, Literal[8]] +NVC637_CTRL_EXEC_PARTITIONS_CREATE_PARAMS_v24_05: TypeAlias = struct_NVC637_CTRL_EXEC_PARTITIONS_CREATE_PARAMS_v24_05 +@c.record +class struct_NVC637_CTRL_EXEC_PARTITIONS_INFO_v24_05(c.Struct): + SIZE = 48 + gpcCount: int + gfxGpcCount: int + veidCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + ofaCount: int + sharedEngFlag: int + smCount: int + spanStart: int + computeSize: int +NVC637_CTRL_EXEC_PARTITIONS_INFO_v24_05: TypeAlias = struct_NVC637_CTRL_EXEC_PARTITIONS_INFO_v24_05 +struct_NVC637_CTRL_EXEC_PARTITIONS_INFO_v24_05.register_fields([('gpcCount', NvU32, 0), ('gfxGpcCount', NvU32, 4), ('veidCount', NvU32, 8), ('ceCount', NvU32, 12), ('nvEncCount', NvU32, 16), ('nvDecCount', NvU32, 20), ('nvJpgCount', NvU32, 24), ('ofaCount', NvU32, 28), ('sharedEngFlag', NvU32, 32), ('smCount', NvU32, 36), ('spanStart', NvU32, 40), ('computeSize', NvU32, 44)]) +struct_NVC637_CTRL_EXEC_PARTITIONS_CREATE_PARAMS_v24_05.register_fields([('bQuery', NvBool, 0), ('execPartCount', NvU32, 4), ('execPartInfo', c.Array[NVC637_CTRL_EXEC_PARTITIONS_INFO_v24_05, Literal[8]], 8), ('execPartId', c.Array[NvU32, Literal[8]], 392)]) +struct_rpc_ctrl_exec_partitions_create_v24_05.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('status', NvU32, 8), ('execPartitionsCreate', NVC637_CTRL_EXEC_PARTITIONS_CREATE_PARAMS_v24_05, 12)]) +rpc_ctrl_exec_partitions_create_v24_05: TypeAlias = struct_rpc_ctrl_exec_partitions_create_v24_05 +rpc_ctrl_exec_partitions_create_v: TypeAlias = struct_rpc_ctrl_exec_partitions_create_v24_05 +@c.record +class struct_rpc_ctrl_fla_setup_instance_mem_block_v21_05(c.Struct): + SIZE = 24 + hClient: int + hObject: int + params: struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_v13_04 +@c.record +class struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_v13_04(c.Struct): + SIZE = 16 + imbPhysAddr: int + addrSpace: int + flaAction: int +NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_v13_04: TypeAlias = struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_v13_04 +struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_v13_04.register_fields([('imbPhysAddr', NvU64, 0), ('addrSpace', NvU32, 8), ('flaAction', NvU32, 12)]) +struct_rpc_ctrl_fla_setup_instance_mem_block_v21_05.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_v13_04, 8)]) +rpc_ctrl_fla_setup_instance_mem_block_v21_05: TypeAlias = struct_rpc_ctrl_fla_setup_instance_mem_block_v21_05 +rpc_ctrl_fla_setup_instance_mem_block_v: TypeAlias = struct_rpc_ctrl_fla_setup_instance_mem_block_v21_05 +@c.record +class struct_rpc_ctrl_get_total_hs_credits_v21_08(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_v21_08 +@c.record +class struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_v21_08(c.Struct): + SIZE = 4 + numCredits: int +NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_v21_08: TypeAlias = struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_v21_08 +struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_v21_08.register_fields([('numCredits', NvU32, 0)]) +struct_rpc_ctrl_get_total_hs_credits_v21_08.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_v21_08, 8)]) +rpc_ctrl_get_total_hs_credits_v21_08: TypeAlias = struct_rpc_ctrl_get_total_hs_credits_v21_08 +rpc_ctrl_get_total_hs_credits_v: TypeAlias = struct_rpc_ctrl_get_total_hs_credits_v21_08 +@c.record +class struct_rpc_ctrl_get_hs_credits_v21_08(c.Struct): + SIZE = 264 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_v21_08 +@c.record +class struct_NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_v21_08(c.Struct): + SIZE = 256 + pmaChannelIdx: int + numEntries: int + statusInfo: struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS_v21_08 + creditInfo: c.Array[struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO_v21_08, Literal[63]] +NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_v21_08: TypeAlias = struct_NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_v21_08 +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS_v21_08(c.Struct): + SIZE = 2 + status: int + entryIndex: int +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS_v21_08: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS_v21_08 +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS_v21_08.register_fields([('status', NvU8, 0), ('entryIndex', NvU8, 1)]) +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO_v21_08(c.Struct): + SIZE = 4 + chipletType: int + chipletIndex: int + numCredits: int +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO_v21_08: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO_v21_08 +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO_v21_08.register_fields([('chipletType', NvU8, 0), ('chipletIndex', NvU8, 1), ('numCredits', NvU16, 2)]) +struct_NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_v21_08.register_fields([('pmaChannelIdx', NvU8, 0), ('numEntries', NvU8, 1), ('statusInfo', NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS_v21_08, 2), ('creditInfo', c.Array[NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO_v21_08, Literal[63]], 4)]) +struct_rpc_ctrl_get_hs_credits_v21_08.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_v21_08, 8)]) +rpc_ctrl_get_hs_credits_v21_08: TypeAlias = struct_rpc_ctrl_get_hs_credits_v21_08 +rpc_ctrl_get_hs_credits_v: TypeAlias = struct_rpc_ctrl_get_hs_credits_v21_08 +@c.record +class struct_rpc_ctrl_reserve_hes_v29_07(c.Struct): + SIZE = 16 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_RESERVE_HES_PARAMS_v29_07 +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_PARAMS_v29_07(c.Struct): + SIZE = 8 + type: int + reserveParams: struct_NVB0CC_CTRL_HES_RESERVATION_UNION_v29_07 +NVB0CC_CTRL_RESERVE_HES_PARAMS_v29_07: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_PARAMS_v29_07 +@c.record +class struct_NVB0CC_CTRL_HES_RESERVATION_UNION_v29_07(c.Struct): + SIZE = 1 + cwd: struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS_v29_07 +NVB0CC_CTRL_HES_RESERVATION_UNION_v29_07: TypeAlias = struct_NVB0CC_CTRL_HES_RESERVATION_UNION_v29_07 +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS_v29_07(c.Struct): + SIZE = 1 + ctxsw: int +NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS_v29_07: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS_v29_07 +struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS_v29_07.register_fields([('ctxsw', NvBool, 0)]) +struct_NVB0CC_CTRL_HES_RESERVATION_UNION_v29_07.register_fields([('cwd', NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS_v29_07, 0)]) +struct_NVB0CC_CTRL_RESERVE_HES_PARAMS_v29_07.register_fields([('type', NvU32, 0), ('reserveParams', NVB0CC_CTRL_HES_RESERVATION_UNION_v29_07, 4)]) +struct_rpc_ctrl_reserve_hes_v29_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_RESERVE_HES_PARAMS_v29_07, 8)]) +rpc_ctrl_reserve_hes_v29_07: TypeAlias = struct_rpc_ctrl_reserve_hes_v29_07 +rpc_ctrl_reserve_hes_v: TypeAlias = struct_rpc_ctrl_reserve_hes_v29_07 +@c.record +class struct_rpc_ctrl_release_hes_v29_07(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_RELEASE_HES_PARAMS_v29_07 +@c.record +class struct_NVB0CC_CTRL_RELEASE_HES_PARAMS_v29_07(c.Struct): + SIZE = 4 + type: int +NVB0CC_CTRL_RELEASE_HES_PARAMS_v29_07: TypeAlias = struct_NVB0CC_CTRL_RELEASE_HES_PARAMS_v29_07 +struct_NVB0CC_CTRL_RELEASE_HES_PARAMS_v29_07.register_fields([('type', NvU32, 0)]) +struct_rpc_ctrl_release_hes_v29_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_RELEASE_HES_PARAMS_v29_07, 8)]) +rpc_ctrl_release_hes_v29_07: TypeAlias = struct_rpc_ctrl_release_hes_v29_07 +rpc_ctrl_release_hes_v: TypeAlias = struct_rpc_ctrl_release_hes_v29_07 +@c.record +class struct_rpc_ctrl_reserve_ccu_prof_v29_07(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_v29_07 +@c.record +class struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_v29_07(c.Struct): + SIZE = 1 + ctxsw: int +NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_v29_07: TypeAlias = struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_v29_07 +struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_v29_07.register_fields([('ctxsw', NvBool, 0)]) +struct_rpc_ctrl_reserve_ccu_prof_v29_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_v29_07, 8)]) +rpc_ctrl_reserve_ccu_prof_v29_07: TypeAlias = struct_rpc_ctrl_reserve_ccu_prof_v29_07 +rpc_ctrl_reserve_ccu_prof_v: TypeAlias = struct_rpc_ctrl_reserve_ccu_prof_v29_07 +@c.record +class struct_rpc_ctrl_release_ccu_prof_v29_07(c.Struct): + SIZE = 8 + hClient: int + hObject: int +struct_rpc_ctrl_release_ccu_prof_v29_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4)]) +rpc_ctrl_release_ccu_prof_v29_07: TypeAlias = struct_rpc_ctrl_release_ccu_prof_v29_07 +rpc_ctrl_release_ccu_prof_v: TypeAlias = struct_rpc_ctrl_release_ccu_prof_v29_07 +@c.record +class struct_rpc_ctrl_set_hs_credits_v21_08(c.Struct): + SIZE = 264 + hClient: int + hObject: int + params: struct_NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_v21_08 +@c.record +class struct_NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_v21_08(c.Struct): + SIZE = 256 + pmaChannelIdx: int + numEntries: int + statusInfo: struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS_v21_08 + creditInfo: c.Array[struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO_v21_08, Literal[63]] +NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_v21_08: TypeAlias = struct_NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_v21_08 +struct_NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_v21_08.register_fields([('pmaChannelIdx', NvU8, 0), ('numEntries', NvU8, 1), ('statusInfo', NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS_v21_08, 2), ('creditInfo', c.Array[NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO_v21_08, Literal[63]], 4)]) +struct_rpc_ctrl_set_hs_credits_v21_08.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_v21_08, 8)]) +rpc_ctrl_set_hs_credits_v21_08: TypeAlias = struct_rpc_ctrl_set_hs_credits_v21_08 +rpc_ctrl_set_hs_credits_v: TypeAlias = struct_rpc_ctrl_set_hs_credits_v21_08 +@c.record +class struct_rpc_ctrl_pm_area_pc_sampler_v21_0B(c.Struct): + SIZE = 12 + hClient: int + hObject: int + cmd: int +struct_rpc_ctrl_pm_area_pc_sampler_v21_0B.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvU32, 8)]) +rpc_ctrl_pm_area_pc_sampler_v21_0B: TypeAlias = struct_rpc_ctrl_pm_area_pc_sampler_v21_0B +rpc_ctrl_pm_area_pc_sampler_v: TypeAlias = struct_rpc_ctrl_pm_area_pc_sampler_v21_0B +@c.record +class struct_rpc_ctrl_exec_partitions_delete_v1F_0A(c.Struct): + SIZE = 44 + hClient: int + hObject: int + execPartitionsDelete: struct_NVC637_CTRL_EXEC_PARTITIONS_DELETE_PARAMS_v18_05 +@c.record +class struct_NVC637_CTRL_EXEC_PARTITIONS_DELETE_PARAMS_v18_05(c.Struct): + SIZE = 36 + execPartCount: int + execPartId: c.Array[ctypes.c_uint32, Literal[8]] +NVC637_CTRL_EXEC_PARTITIONS_DELETE_PARAMS_v18_05: TypeAlias = struct_NVC637_CTRL_EXEC_PARTITIONS_DELETE_PARAMS_v18_05 +struct_NVC637_CTRL_EXEC_PARTITIONS_DELETE_PARAMS_v18_05.register_fields([('execPartCount', NvU32, 0), ('execPartId', c.Array[NvU32, Literal[8]], 4)]) +struct_rpc_ctrl_exec_partitions_delete_v1F_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('execPartitionsDelete', NVC637_CTRL_EXEC_PARTITIONS_DELETE_PARAMS_v18_05, 8)]) +rpc_ctrl_exec_partitions_delete_v1F_0A: TypeAlias = struct_rpc_ctrl_exec_partitions_delete_v1F_0A +rpc_ctrl_exec_partitions_delete_v: TypeAlias = struct_rpc_ctrl_exec_partitions_delete_v1F_0A +@c.record +class struct_rpc_ctrl_gpfifo_get_work_submit_token_v1F_0A(c.Struct): + SIZE = 12 + hClient: int + hObject: int + workSubmitToken: struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_v08_00 +@c.record +class struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_v08_00(c.Struct): + SIZE = 4 + workSubmitToken: int +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_v08_00: TypeAlias = struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_v08_00 +struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_v08_00.register_fields([('workSubmitToken', NvU32, 0)]) +struct_rpc_ctrl_gpfifo_get_work_submit_token_v1F_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('workSubmitToken', NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_v08_00, 8)]) +rpc_ctrl_gpfifo_get_work_submit_token_v1F_0A: TypeAlias = struct_rpc_ctrl_gpfifo_get_work_submit_token_v1F_0A +rpc_ctrl_gpfifo_get_work_submit_token_v: TypeAlias = struct_rpc_ctrl_gpfifo_get_work_submit_token_v1F_0A +@c.record +class struct_rpc_ctrl_gpfifo_set_work_submit_token_notif_index_v1F_0A(c.Struct): + SIZE = 12 + hClient: int + hObject: int + setWorkSubmitTokenIndex: struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_v16_04 +@c.record +class struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_v16_04(c.Struct): + SIZE = 4 + index: int +NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_v16_04: TypeAlias = struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_v16_04 +struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_v16_04.register_fields([('index', NvU32, 0)]) +struct_rpc_ctrl_gpfifo_set_work_submit_token_notif_index_v1F_0A.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('setWorkSubmitTokenIndex', NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_v16_04, 8)]) +rpc_ctrl_gpfifo_set_work_submit_token_notif_index_v1F_0A: TypeAlias = struct_rpc_ctrl_gpfifo_set_work_submit_token_notif_index_v1F_0A +rpc_ctrl_gpfifo_set_work_submit_token_notif_index_v: TypeAlias = struct_rpc_ctrl_gpfifo_set_work_submit_token_notif_index_v1F_0A +@c.record +class struct_rpc_ctrl_master_get_virtual_function_error_cont_intr_mask_v1F_0D(c.Struct): + SIZE = 16 + hClient: int + hObject: int + vfErrContIntrMask: struct_NV90E6_CTRL_MASTER_GET_VIRTUAL_FUNCTION_ERROR_CONT_INTR_MASK_PARAMS_v18_0B +@c.record +class struct_NV90E6_CTRL_MASTER_GET_VIRTUAL_FUNCTION_ERROR_CONT_INTR_MASK_PARAMS_v18_0B(c.Struct): + SIZE = 8 + eccMask: int + nvlinkMask: int +NV90E6_CTRL_MASTER_GET_VIRTUAL_FUNCTION_ERROR_CONT_INTR_MASK_PARAMS_v18_0B: TypeAlias = struct_NV90E6_CTRL_MASTER_GET_VIRTUAL_FUNCTION_ERROR_CONT_INTR_MASK_PARAMS_v18_0B +struct_NV90E6_CTRL_MASTER_GET_VIRTUAL_FUNCTION_ERROR_CONT_INTR_MASK_PARAMS_v18_0B.register_fields([('eccMask', NvU32, 0), ('nvlinkMask', NvU32, 4)]) +struct_rpc_ctrl_master_get_virtual_function_error_cont_intr_mask_v1F_0D.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('vfErrContIntrMask', NV90E6_CTRL_MASTER_GET_VIRTUAL_FUNCTION_ERROR_CONT_INTR_MASK_PARAMS_v18_0B, 8)]) +rpc_ctrl_master_get_virtual_function_error_cont_intr_mask_v1F_0D: TypeAlias = struct_rpc_ctrl_master_get_virtual_function_error_cont_intr_mask_v1F_0D +rpc_ctrl_master_get_virtual_function_error_cont_intr_mask_v: TypeAlias = struct_rpc_ctrl_master_get_virtual_function_error_cont_intr_mask_v1F_0D +@c.record +class struct_rpc_save_hibernation_data_v1E_0E(c.Struct): + SIZE = 4 + remainedBytes: int + payload: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_save_hibernation_data_v1E_0E.register_fields([('remainedBytes', NvU32, 0), ('payload', c.Array[NvU8, Literal[0]], 4)]) +rpc_save_hibernation_data_v1E_0E: TypeAlias = struct_rpc_save_hibernation_data_v1E_0E +rpc_save_hibernation_data_v: TypeAlias = struct_rpc_save_hibernation_data_v1E_0E +@c.record +class struct_rpc_restore_hibernation_data_v1E_0E(c.Struct): + SIZE = 4 + remainedBytes: int + payload: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_restore_hibernation_data_v1E_0E.register_fields([('remainedBytes', NvU32, 0), ('payload', c.Array[NvU8, Literal[0]], 4)]) +rpc_restore_hibernation_data_v1E_0E: TypeAlias = struct_rpc_restore_hibernation_data_v1E_0E +rpc_restore_hibernation_data_v: TypeAlias = struct_rpc_restore_hibernation_data_v1E_0E +@c.record +class struct_rpc_ctrl_get_mmu_debug_mode_v1E_06(c.Struct): + SIZE = 12 + hClient: int + hObject: int + params: struct_NV0090_CTRL_GET_MMU_DEBUG_MODE_PARAMS_v1E_06 +@c.record +class struct_NV0090_CTRL_GET_MMU_DEBUG_MODE_PARAMS_v1E_06(c.Struct): + SIZE = 1 + bMode: int +NV0090_CTRL_GET_MMU_DEBUG_MODE_PARAMS_v1E_06: TypeAlias = struct_NV0090_CTRL_GET_MMU_DEBUG_MODE_PARAMS_v1E_06 +struct_NV0090_CTRL_GET_MMU_DEBUG_MODE_PARAMS_v1E_06.register_fields([('bMode', NvBool, 0)]) +struct_rpc_ctrl_get_mmu_debug_mode_v1E_06.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV0090_CTRL_GET_MMU_DEBUG_MODE_PARAMS_v1E_06, 8)]) +rpc_ctrl_get_mmu_debug_mode_v1E_06: TypeAlias = struct_rpc_ctrl_get_mmu_debug_mode_v1E_06 +rpc_ctrl_get_mmu_debug_mode_v: TypeAlias = struct_rpc_ctrl_get_mmu_debug_mode_v1E_06 +@c.record +class struct_rpc_disable_channels_v1E_0B(c.Struct): + SIZE = 4 + bDisable: int +struct_rpc_disable_channels_v1E_0B.register_fields([('bDisable', NvU32, 0)]) +rpc_disable_channels_v1E_0B: TypeAlias = struct_rpc_disable_channels_v1E_0B +rpc_disable_channels_v: TypeAlias = struct_rpc_disable_channels_v1E_0B +@c.record +class struct_rpc_ctrl_gpu_migratable_ops_v21_07(c.Struct): + SIZE = 1840 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_v21_07 +@c.record +class struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_v21_07(c.Struct): + SIZE = 1832 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + regOpCount: int + smIds: c.Array[ctypes.c_uint32, Literal[50]] + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP_v03_00, Literal[50]] + grRouteInfo: struct_NV2080_CTRL_GR_ROUTE_INFO_v12_01 +NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_v21_07: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_v21_07 +struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_v21_07.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('regOpCount', NvU32, 12), ('smIds', c.Array[NvU32, Literal[50]], 16), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP_v03_00, Literal[50]], 216), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO_v12_01, 1816)]) +struct_rpc_ctrl_gpu_migratable_ops_v21_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_v21_07, 8)]) +rpc_ctrl_gpu_migratable_ops_v21_07: TypeAlias = struct_rpc_ctrl_gpu_migratable_ops_v21_07 +rpc_ctrl_gpu_migratable_ops_v: TypeAlias = struct_rpc_ctrl_gpu_migratable_ops_v21_07 +@c.record +class struct_rpc_invalidate_tlb_v23_03(c.Struct): + SIZE = 16 + pdbAddress: int + regVal: int +struct_rpc_invalidate_tlb_v23_03.register_fields([('pdbAddress', NvU64, 0), ('regVal', NvU32, 8)]) +rpc_invalidate_tlb_v23_03: TypeAlias = struct_rpc_invalidate_tlb_v23_03 +rpc_invalidate_tlb_v: TypeAlias = struct_rpc_invalidate_tlb_v23_03 +@c.record +class struct_rpc_get_brand_caps_v25_12(c.Struct): + SIZE = 4 + brands: int +struct_rpc_get_brand_caps_v25_12.register_fields([('brands', NvU32, 0)]) +rpc_get_brand_caps_v25_12: TypeAlias = struct_rpc_get_brand_caps_v25_12 +rpc_get_brand_caps_v: TypeAlias = struct_rpc_get_brand_caps_v25_12 +@c.record +class struct_rpc_gsp_set_system_info_v17_00(c.Struct): + SIZE = 4 + data: int +struct_rpc_gsp_set_system_info_v17_00.register_fields([('data', NvU32, 0)]) +rpc_gsp_set_system_info_v17_00: TypeAlias = struct_rpc_gsp_set_system_info_v17_00 +rpc_gsp_set_system_info_v: TypeAlias = struct_rpc_gsp_set_system_info_v17_00 +@c.record +class struct_rpc_gsp_rm_alloc_v03_00(c.Struct): + SIZE = 32 + hClient: int + hParent: int + hObject: int + hClass: int + status: int + paramsSize: int + flags: int + reserved: c.Array[ctypes.c_ubyte, Literal[4]] + params: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_gsp_rm_alloc_v03_00.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClass', NvU32, 12), ('status', NvU32, 16), ('paramsSize', NvU32, 20), ('flags', NvU32, 24), ('reserved', c.Array[NvU8, Literal[4]], 28), ('params', c.Array[NvU8, Literal[0]], 32)]) +rpc_gsp_rm_alloc_v03_00: TypeAlias = struct_rpc_gsp_rm_alloc_v03_00 +rpc_gsp_rm_alloc_v: TypeAlias = struct_rpc_gsp_rm_alloc_v03_00 +@c.record +class struct_rpc_gsp_rm_control_v03_00(c.Struct): + SIZE = 24 + hClient: int + hObject: int + cmd: int + status: int + paramsSize: int + flags: int + params: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_gsp_rm_control_v03_00.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvU32, 8), ('status', NvU32, 12), ('paramsSize', NvU32, 16), ('flags', NvU32, 20), ('params', c.Array[NvU8, Literal[0]], 24)]) +rpc_gsp_rm_control_v03_00: TypeAlias = struct_rpc_gsp_rm_control_v03_00 +rpc_gsp_rm_control_v: TypeAlias = struct_rpc_gsp_rm_control_v03_00 +@c.record +class struct_rpc_dump_protobuf_component_v18_12(c.Struct): + SIZE = 16 + component: int + nvDumpType: int + countOnly: int + bugCheckCode: int + internalCode: int + bufferSize: int + blob: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_dump_protobuf_component_v18_12.register_fields([('component', NvU16, 0), ('nvDumpType', NvU8, 2), ('countOnly', NvBool, 3), ('bugCheckCode', NvU32, 4), ('internalCode', NvU32, 8), ('bufferSize', NvU32, 12), ('blob', c.Array[NvU8, Literal[0]], 16)]) +rpc_dump_protobuf_component_v18_12: TypeAlias = struct_rpc_dump_protobuf_component_v18_12 +rpc_dump_protobuf_component_v: TypeAlias = struct_rpc_dump_protobuf_component_v18_12 +@c.record +class struct_rpc_run_cpu_sequencer_v17_00(c.Struct): + SIZE = 40 + bufferSizeDWord: int + cmdIndex: int + regSaveArea: c.Array[ctypes.c_uint32, Literal[8]] + commandBuffer: c.Array[ctypes.c_uint32, Literal[0]] +struct_rpc_run_cpu_sequencer_v17_00.register_fields([('bufferSizeDWord', NvU32, 0), ('cmdIndex', NvU32, 4), ('regSaveArea', c.Array[NvU32, Literal[8]], 8), ('commandBuffer', c.Array[NvU32, Literal[0]], 40)]) +rpc_run_cpu_sequencer_v17_00: TypeAlias = struct_rpc_run_cpu_sequencer_v17_00 +rpc_run_cpu_sequencer_v: TypeAlias = struct_rpc_run_cpu_sequencer_v17_00 +@c.record +class struct_rpc_post_event_v17_00(c.Struct): + SIZE = 32 + hClient: int + hEvent: int + notifyIndex: int + data: int + info16: int + status: int + eventDataSize: int + bNotifyList: int + eventData: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_post_event_v17_00.register_fields([('hClient', NvHandle, 0), ('hEvent', NvHandle, 4), ('notifyIndex', NvU32, 8), ('data', NvU32, 12), ('info16', NvU16, 16), ('status', NvU32, 20), ('eventDataSize', NvU32, 24), ('bNotifyList', NvBool, 28), ('eventData', c.Array[NvU8, Literal[0]], 29)]) +rpc_post_event_v17_00: TypeAlias = struct_rpc_post_event_v17_00 +rpc_post_event_v: TypeAlias = struct_rpc_post_event_v17_00 +@c.record +class struct_rpc_rc_triggered_v17_02(c.Struct): + SIZE = 48 + nv2080EngineType: int + chid: int + gfid: int + exceptLevel: int + exceptType: int + scope: int + partitionAttributionId: int + mmuFaultAddrLo: int + mmuFaultAddrHi: int + mmuFaultType: int + bCallbackNeeded: int + rcJournalBufferSize: int + rcJournalBuffer: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_rc_triggered_v17_02.register_fields([('nv2080EngineType', NvU32, 0), ('chid', NvU32, 4), ('gfid', NvU32, 8), ('exceptLevel', NvU32, 12), ('exceptType', NvU32, 16), ('scope', NvU32, 20), ('partitionAttributionId', NvU16, 24), ('mmuFaultAddrLo', NvU32, 28), ('mmuFaultAddrHi', NvU32, 32), ('mmuFaultType', NvU32, 36), ('bCallbackNeeded', NvBool, 40), ('rcJournalBufferSize', NvU32, 44), ('rcJournalBuffer', c.Array[NvU8, Literal[0]], 48)]) +rpc_rc_triggered_v17_02: TypeAlias = struct_rpc_rc_triggered_v17_02 +rpc_rc_triggered_v: TypeAlias = struct_rpc_rc_triggered_v17_02 +@c.record +class struct_rpc_os_error_log_v17_00(c.Struct): + SIZE = 268 + exceptType: int + runlistId: int + chid: int + errString: c.Array[ctypes.c_char, Literal[256]] +struct_rpc_os_error_log_v17_00.register_fields([('exceptType', NvU32, 0), ('runlistId', NvU32, 4), ('chid', NvU32, 8), ('errString', c.Array[ctypes.c_char, Literal[256]], 12)]) +rpc_os_error_log_v17_00: TypeAlias = struct_rpc_os_error_log_v17_00 +rpc_os_error_log_v: TypeAlias = struct_rpc_os_error_log_v17_00 +@c.record +class struct_rpc_rg_line_intr_v17_00(c.Struct): + SIZE = 8 + head: int + rgIntr: int +struct_rpc_rg_line_intr_v17_00.register_fields([('head', NvU32, 0), ('rgIntr', NvU32, 4)]) +rpc_rg_line_intr_v17_00: TypeAlias = struct_rpc_rg_line_intr_v17_00 +rpc_rg_line_intr_v: TypeAlias = struct_rpc_rg_line_intr_v17_00 +@c.record +class struct_rpc_display_modeset_v01_00(c.Struct): + SIZE = 12 + bModesetStart: int + minRequiredIsoBandwidthKBPS: int + minRequiredFloorBandwidthKBPS: int +struct_rpc_display_modeset_v01_00.register_fields([('bModesetStart', NvBool, 0), ('minRequiredIsoBandwidthKBPS', NvU32, 4), ('minRequiredFloorBandwidthKBPS', NvU32, 8)]) +rpc_display_modeset_v01_00: TypeAlias = struct_rpc_display_modeset_v01_00 +rpc_display_modeset_v: TypeAlias = struct_rpc_display_modeset_v01_00 +@c.record +class struct_rpc_gpuacct_perfmon_util_samples_v1F_0E(c.Struct): + SIZE = 4048 + params: struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_v1F_0E +@c.record +class struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_v1F_0E(c.Struct): + SIZE = 4048 + type: int + bufSize: int + count: int + tracker: int + samples: c.Array[struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE_v1F_0E, Literal[72]] +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_v1F_0E: TypeAlias = struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_v1F_0E +struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_v1F_0E.register_fields([('type', NvU8, 0), ('bufSize', NvU32, 4), ('count', NvU32, 8), ('tracker', NvU32, 12), ('samples', c.Array[NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE_v1F_0E, Literal[72]], 16)]) +struct_rpc_gpuacct_perfmon_util_samples_v1F_0E.register_fields([('params', NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_v1F_0E, 0)]) +rpc_gpuacct_perfmon_util_samples_v1F_0E: TypeAlias = struct_rpc_gpuacct_perfmon_util_samples_v1F_0E +rpc_gpuacct_perfmon_util_samples_v: TypeAlias = struct_rpc_gpuacct_perfmon_util_samples_v1F_0E +@c.record +class struct_rpc_vgpu_gsp_plugin_triggered_v17_00(c.Struct): + SIZE = 8 + gfid: int + notifyIndex: int +struct_rpc_vgpu_gsp_plugin_triggered_v17_00.register_fields([('gfid', NvU32, 0), ('notifyIndex', NvU32, 4)]) +rpc_vgpu_gsp_plugin_triggered_v17_00: TypeAlias = struct_rpc_vgpu_gsp_plugin_triggered_v17_00 +rpc_vgpu_gsp_plugin_triggered_v: TypeAlias = struct_rpc_vgpu_gsp_plugin_triggered_v17_00 +@c.record +class struct_rpc_vgpu_config_event_v17_00(c.Struct): + SIZE = 4 + notifyIndex: int +struct_rpc_vgpu_config_event_v17_00.register_fields([('notifyIndex', NvU32, 0)]) +rpc_vgpu_config_event_v17_00: TypeAlias = struct_rpc_vgpu_config_event_v17_00 +rpc_vgpu_config_event_v: TypeAlias = struct_rpc_vgpu_config_event_v17_00 +@c.record +class struct_rpc_dce_rm_init_v01_00(c.Struct): + SIZE = 8 + bInit: int + hInternalClient: int +struct_rpc_dce_rm_init_v01_00.register_fields([('bInit', NvBool, 0), ('hInternalClient', NvU32, 4)]) +rpc_dce_rm_init_v01_00: TypeAlias = struct_rpc_dce_rm_init_v01_00 +rpc_dce_rm_init_v: TypeAlias = struct_rpc_dce_rm_init_v01_00 +@c.record +class struct_rpc_sim_read_v1E_01(c.Struct): + SIZE = 264 + path: c.Array[ctypes.c_char, Literal[256]] + index: int + count: int +struct_rpc_sim_read_v1E_01.register_fields([('path', c.Array[ctypes.c_char, Literal[256]], 0), ('index', NvU32, 256), ('count', NvU32, 260)]) +rpc_sim_read_v1E_01: TypeAlias = struct_rpc_sim_read_v1E_01 +rpc_sim_read_v: TypeAlias = struct_rpc_sim_read_v1E_01 +@c.record +class struct_rpc_sim_write_v1E_01(c.Struct): + SIZE = 268 + path: c.Array[ctypes.c_char, Literal[256]] + index: int + count: int + data: int +struct_rpc_sim_write_v1E_01.register_fields([('path', c.Array[ctypes.c_char, Literal[256]], 0), ('index', NvU32, 256), ('count', NvU32, 260), ('data', NvU32, 264)]) +rpc_sim_write_v1E_01: TypeAlias = struct_rpc_sim_write_v1E_01 +rpc_sim_write_v: TypeAlias = struct_rpc_sim_write_v1E_01 +@c.record +class struct_rpc_ucode_libos_print_v1E_08(c.Struct): + SIZE = 8 + ucodeEngDesc: int + libosPrintBufSize: int + libosPrintBuf: c.Array[ctypes.c_ubyte, Literal[0]] +struct_rpc_ucode_libos_print_v1E_08.register_fields([('ucodeEngDesc', NvU32, 0), ('libosPrintBufSize', NvU32, 4), ('libosPrintBuf', c.Array[NvU8, Literal[0]], 8)]) +rpc_ucode_libos_print_v1E_08: TypeAlias = struct_rpc_ucode_libos_print_v1E_08 +rpc_ucode_libos_print_v: TypeAlias = struct_rpc_ucode_libos_print_v1E_08 +@c.record +class struct_rpc_init_done_v17_00(c.Struct): + SIZE = 4 + not_used: int +struct_rpc_init_done_v17_00.register_fields([('not_used', NvU32, 0)]) +rpc_init_done_v17_00: TypeAlias = struct_rpc_init_done_v17_00 +rpc_init_done_v: TypeAlias = struct_rpc_init_done_v17_00 +@c.record +class struct_rpc_semaphore_schedule_callback_v17_00(c.Struct): + SIZE = 32 + GPUVA: int + hVASpace: int + ReleaseValue: int + Flags: int + completionStatus: int + hClient: int + hEvent: int +struct_rpc_semaphore_schedule_callback_v17_00.register_fields([('GPUVA', NvU64, 0), ('hVASpace', NvU32, 8), ('ReleaseValue', NvU32, 12), ('Flags', NvU32, 16), ('completionStatus', NvU32, 20), ('hClient', NvHandle, 24), ('hEvent', NvHandle, 28)]) +rpc_semaphore_schedule_callback_v17_00: TypeAlias = struct_rpc_semaphore_schedule_callback_v17_00 +rpc_semaphore_schedule_callback_v: TypeAlias = struct_rpc_semaphore_schedule_callback_v17_00 +@c.record +class struct_rpc_timed_semaphore_release_v01_00(c.Struct): + SIZE = 40 + semaphoreVA: int + notifierVA: int + hVASpace: int + releaseValue: int + completionStatus: int + hClient: int + hDevice: int +struct_rpc_timed_semaphore_release_v01_00.register_fields([('semaphoreVA', NvU64, 0), ('notifierVA', NvU64, 8), ('hVASpace', NvU32, 16), ('releaseValue', NvU32, 20), ('completionStatus', NvU32, 24), ('hClient', NvHandle, 28), ('hDevice', NvHandle, 32)]) +rpc_timed_semaphore_release_v01_00: TypeAlias = struct_rpc_timed_semaphore_release_v01_00 +rpc_timed_semaphore_release_v: TypeAlias = struct_rpc_timed_semaphore_release_v01_00 +@c.record +class struct_rpc_perf_gpu_boost_sync_limits_callback_v17_00(c.Struct): + SIZE = 16 + params: struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_v17_00 +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_v17_00(c.Struct): + SIZE = 16 + flags: int + bBridgeless: int + currLimits: c.Array[ctypes.c_uint32, Literal[2]] +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_v17_00: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_v17_00 +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_v17_00.register_fields([('flags', NvU32, 0), ('bBridgeless', NvBool, 4), ('currLimits', c.Array[NvU32, Literal[2]], 8)]) +struct_rpc_perf_gpu_boost_sync_limits_callback_v17_00.register_fields([('params', NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_v17_00, 0)]) +rpc_perf_gpu_boost_sync_limits_callback_v17_00: TypeAlias = struct_rpc_perf_gpu_boost_sync_limits_callback_v17_00 +rpc_perf_gpu_boost_sync_limits_callback_v: TypeAlias = struct_rpc_perf_gpu_boost_sync_limits_callback_v17_00 +@c.record +class struct_rpc_perf_bridgeless_info_update_v17_00(c.Struct): + SIZE = 8 + bBridgeless: int +struct_rpc_perf_bridgeless_info_update_v17_00.register_fields([('bBridgeless', NvU64, 0)]) +rpc_perf_bridgeless_info_update_v17_00: TypeAlias = struct_rpc_perf_bridgeless_info_update_v17_00 +rpc_perf_bridgeless_info_update_v: TypeAlias = struct_rpc_perf_bridgeless_info_update_v17_00 +@c.record +class struct_rpc_nvlink_fault_up_v17_00(c.Struct): + SIZE = 4 + linkId: int +struct_rpc_nvlink_fault_up_v17_00.register_fields([('linkId', NvU32, 0)]) +rpc_nvlink_fault_up_v17_00: TypeAlias = struct_rpc_nvlink_fault_up_v17_00 +rpc_nvlink_fault_up_v: TypeAlias = struct_rpc_nvlink_fault_up_v17_00 +@c.record +class struct_rpc_nvlink_inband_received_data_256_v17_00(c.Struct): + SIZE = 260 + params: struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_256_PARAMS_v17_00 +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_256_PARAMS_v17_00(c.Struct): + SIZE = 260 + dataSize: int + data: c.Array[ctypes.c_ubyte, Literal[256]] +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_256_PARAMS_v17_00: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_256_PARAMS_v17_00 +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_256_PARAMS_v17_00.register_fields([('dataSize', NvU32, 0), ('data', c.Array[NvU8, Literal[256]], 4)]) +struct_rpc_nvlink_inband_received_data_256_v17_00.register_fields([('params', NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_256_PARAMS_v17_00, 0)]) +rpc_nvlink_inband_received_data_256_v17_00: TypeAlias = struct_rpc_nvlink_inband_received_data_256_v17_00 +rpc_nvlink_inband_received_data_256_v: TypeAlias = struct_rpc_nvlink_inband_received_data_256_v17_00 +@c.record +class struct_rpc_nvlink_inband_received_data_512_v17_00(c.Struct): + SIZE = 516 + params: struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_512_PARAMS_v17_00 +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_512_PARAMS_v17_00(c.Struct): + SIZE = 516 + dataSize: int + data: c.Array[ctypes.c_ubyte, Literal[512]] +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_512_PARAMS_v17_00: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_512_PARAMS_v17_00 +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_512_PARAMS_v17_00.register_fields([('dataSize', NvU32, 0), ('data', c.Array[NvU8, Literal[512]], 4)]) +struct_rpc_nvlink_inband_received_data_512_v17_00.register_fields([('params', NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_512_PARAMS_v17_00, 0)]) +rpc_nvlink_inband_received_data_512_v17_00: TypeAlias = struct_rpc_nvlink_inband_received_data_512_v17_00 +rpc_nvlink_inband_received_data_512_v: TypeAlias = struct_rpc_nvlink_inband_received_data_512_v17_00 +@c.record +class struct_rpc_nvlink_inband_received_data_1024_v17_00(c.Struct): + SIZE = 1028 + params: struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_1024_PARAMS_v17_00 +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_1024_PARAMS_v17_00(c.Struct): + SIZE = 1028 + dataSize: int + data: c.Array[ctypes.c_ubyte, Literal[1024]] +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_1024_PARAMS_v17_00: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_1024_PARAMS_v17_00 +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_1024_PARAMS_v17_00.register_fields([('dataSize', NvU32, 0), ('data', c.Array[NvU8, Literal[1024]], 4)]) +struct_rpc_nvlink_inband_received_data_1024_v17_00.register_fields([('params', NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_1024_PARAMS_v17_00, 0)]) +rpc_nvlink_inband_received_data_1024_v17_00: TypeAlias = struct_rpc_nvlink_inband_received_data_1024_v17_00 +rpc_nvlink_inband_received_data_1024_v: TypeAlias = struct_rpc_nvlink_inband_received_data_1024_v17_00 +@c.record +class struct_rpc_nvlink_inband_received_data_2048_v17_00(c.Struct): + SIZE = 2052 + params: struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_2048_PARAMS_v17_00 +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_2048_PARAMS_v17_00(c.Struct): + SIZE = 2052 + dataSize: int + data: c.Array[ctypes.c_ubyte, Literal[2048]] +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_2048_PARAMS_v17_00: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_2048_PARAMS_v17_00 +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_2048_PARAMS_v17_00.register_fields([('dataSize', NvU32, 0), ('data', c.Array[NvU8, Literal[2048]], 4)]) +struct_rpc_nvlink_inband_received_data_2048_v17_00.register_fields([('params', NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_2048_PARAMS_v17_00, 0)]) +rpc_nvlink_inband_received_data_2048_v17_00: TypeAlias = struct_rpc_nvlink_inband_received_data_2048_v17_00 +rpc_nvlink_inband_received_data_2048_v: TypeAlias = struct_rpc_nvlink_inband_received_data_2048_v17_00 +@c.record +class struct_rpc_nvlink_inband_received_data_4096_v17_00(c.Struct): + SIZE = 4100 + params: struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_4096_PARAMS_v17_00 +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_4096_PARAMS_v17_00(c.Struct): + SIZE = 4100 + dataSize: int + data: c.Array[ctypes.c_ubyte, Literal[4096]] +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_4096_PARAMS_v17_00: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_4096_PARAMS_v17_00 +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_4096_PARAMS_v17_00.register_fields([('dataSize', NvU32, 0), ('data', c.Array[NvU8, Literal[4096]], 4)]) +struct_rpc_nvlink_inband_received_data_4096_v17_00.register_fields([('params', NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_4096_PARAMS_v17_00, 0)]) +rpc_nvlink_inband_received_data_4096_v17_00: TypeAlias = struct_rpc_nvlink_inband_received_data_4096_v17_00 +rpc_nvlink_inband_received_data_4096_v: TypeAlias = struct_rpc_nvlink_inband_received_data_4096_v17_00 +@c.record +class struct_rpc_nvlink_is_gpu_degraded_v17_00(c.Struct): + SIZE = 8 + params: struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_v17_00 +@c.record +class struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_v17_00(c.Struct): + SIZE = 8 + linkId: int + bIsGpuDegraded: int +NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_v17_00: TypeAlias = struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_v17_00 +struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_v17_00.register_fields([('linkId', NvU32, 0), ('bIsGpuDegraded', NvBool, 4)]) +struct_rpc_nvlink_is_gpu_degraded_v17_00.register_fields([('params', NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_v17_00, 0)]) +rpc_nvlink_is_gpu_degraded_v17_00: TypeAlias = struct_rpc_nvlink_is_gpu_degraded_v17_00 +rpc_nvlink_is_gpu_degraded_v: TypeAlias = struct_rpc_nvlink_is_gpu_degraded_v17_00 +@c.record +class struct_rpc_nvlink_fatal_error_recovery_v17_00(c.Struct): + SIZE = 2 + params: struct_NV2080_CTRL_NVLINK_FATAL_ERROR_RECOVERY_PARAMS_v17_00 +@c.record +class struct_NV2080_CTRL_NVLINK_FATAL_ERROR_RECOVERY_PARAMS_v17_00(c.Struct): + SIZE = 2 + bRecoverable: int + bLazy: int +NV2080_CTRL_NVLINK_FATAL_ERROR_RECOVERY_PARAMS_v17_00: TypeAlias = struct_NV2080_CTRL_NVLINK_FATAL_ERROR_RECOVERY_PARAMS_v17_00 +struct_NV2080_CTRL_NVLINK_FATAL_ERROR_RECOVERY_PARAMS_v17_00.register_fields([('bRecoverable', NvBool, 0), ('bLazy', NvBool, 1)]) +struct_rpc_nvlink_fatal_error_recovery_v17_00.register_fields([('params', NV2080_CTRL_NVLINK_FATAL_ERROR_RECOVERY_PARAMS_v17_00, 0)]) +rpc_nvlink_fatal_error_recovery_v17_00: TypeAlias = struct_rpc_nvlink_fatal_error_recovery_v17_00 +rpc_nvlink_fatal_error_recovery_v: TypeAlias = struct_rpc_nvlink_fatal_error_recovery_v17_00 +@c.record +class struct_rpc_update_gsp_trace_v01_00(c.Struct): + SIZE = 8 + records: int + data: int +struct_rpc_update_gsp_trace_v01_00.register_fields([('records', NvU32, 0), ('data', NvU32, 4)]) +rpc_update_gsp_trace_v01_00: TypeAlias = struct_rpc_update_gsp_trace_v01_00 +rpc_update_gsp_trace_v: TypeAlias = struct_rpc_update_gsp_trace_v01_00 +@c.record +class struct_rpc_gsp_post_nocat_record_v01_00(c.Struct): + SIZE = 4 + data: int +struct_rpc_gsp_post_nocat_record_v01_00.register_fields([('data', NvU32, 0)]) +rpc_gsp_post_nocat_record_v01_00: TypeAlias = struct_rpc_gsp_post_nocat_record_v01_00 +rpc_gsp_post_nocat_record_v: TypeAlias = struct_rpc_gsp_post_nocat_record_v01_00 +@c.record +class struct_rpc_extdev_intr_service_v17_00(c.Struct): + SIZE = 4 + lossRegStatus: int + gainRegStatus: int + miscRegStatus: int + rmStatus: int +struct_rpc_extdev_intr_service_v17_00.register_fields([('lossRegStatus', NvU8, 0), ('gainRegStatus', NvU8, 1), ('miscRegStatus', NvU8, 2), ('rmStatus', NvBool, 3)]) +rpc_extdev_intr_service_v17_00: TypeAlias = struct_rpc_extdev_intr_service_v17_00 +rpc_extdev_intr_service_v: TypeAlias = struct_rpc_extdev_intr_service_v17_00 +@c.record +class struct_rpc_pfm_req_hndlr_state_sync_callback_v21_04(c.Struct): + SIZE = 16 + params: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS_v21_04 +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS_v21_04(c.Struct): + SIZE = 16 + flags: int + syncData: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_data_v21_04 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS_v21_04: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS_v21_04 +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_data_v21_04(c.Struct): + SIZE = 12 + type: int + data: union_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_type_v21_04 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_data_v21_04: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_data_v21_04 +@c.record +class union_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_type_v21_04(c.Struct): + SIZE = 8 + smbpbi: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI_v21_04 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_type_v21_04: TypeAlias = union_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_type_v21_04 +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI_v21_04(c.Struct): + SIZE = 8 + sensorId: int + limit: int +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI_v21_04: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI_v21_04 +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI_v21_04.register_fields([('sensorId', NvU32, 0), ('limit', NvU32, 4)]) +union_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_type_v21_04.register_fields([('smbpbi', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI_v21_04, 0)]) +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_data_v21_04.register_fields([('type', NvU8, 0), ('data', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_type_v21_04, 4)]) +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS_v21_04.register_fields([('flags', NvU8, 0), ('syncData', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_data_v21_04, 4)]) +struct_rpc_pfm_req_hndlr_state_sync_callback_v21_04.register_fields([('params', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS_v21_04, 0)]) +rpc_pfm_req_hndlr_state_sync_callback_v21_04: TypeAlias = struct_rpc_pfm_req_hndlr_state_sync_callback_v21_04 +rpc_pfm_req_hndlr_state_sync_callback_v: TypeAlias = struct_rpc_pfm_req_hndlr_state_sync_callback_v21_04 +@c.record +class struct_rpc_vgpu_gsp_mig_ci_config_v21_03(c.Struct): + SIZE = 44 + execPartCount: int + execPartId: c.Array[ctypes.c_uint32, Literal[8]] + gfid: int + bDelete: int +struct_rpc_vgpu_gsp_mig_ci_config_v21_03.register_fields([('execPartCount', NvU32, 0), ('execPartId', c.Array[NvU32, Literal[8]], 4), ('gfid', NvU32, 36), ('bDelete', NvBool, 40)]) +rpc_vgpu_gsp_mig_ci_config_v21_03: TypeAlias = struct_rpc_vgpu_gsp_mig_ci_config_v21_03 +rpc_vgpu_gsp_mig_ci_config_v: TypeAlias = struct_rpc_vgpu_gsp_mig_ci_config_v21_03 +@c.record +class struct_rpc_gsp_lockdown_notice_v17_00(c.Struct): + SIZE = 1 + bLockdownEngaging: int +struct_rpc_gsp_lockdown_notice_v17_00.register_fields([('bLockdownEngaging', NvBool, 0)]) +rpc_gsp_lockdown_notice_v17_00: TypeAlias = struct_rpc_gsp_lockdown_notice_v17_00 +rpc_gsp_lockdown_notice_v: TypeAlias = struct_rpc_gsp_lockdown_notice_v17_00 +@c.record +class struct_rpc_ctrl_gpu_query_ecc_status_v24_06(c.Struct): + SIZE = 1016 + hClient: int + hObject: int + params: struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_DEPRECATED_RPC_PARAMS_v24_06 +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_DEPRECATED_RPC_PARAMS_v24_06(c.Struct): + SIZE = 1008 + units: c.Array[struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS_v15_01, Literal[25]] + bFatalPoisonError: int + flags: int +NV2080_CTRL_GPU_QUERY_ECC_STATUS_DEPRECATED_RPC_PARAMS_v24_06: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_DEPRECATED_RPC_PARAMS_v24_06 +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS_v15_01(c.Struct): + SIZE = 40 + enabled: int + scrubComplete: int + supported: int + dbe: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01 + dbeNonResettable: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01 + sbe: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01 + sbeNonResettable: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01 +NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS_v15_01: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS_v15_01 +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01(c.Struct): + SIZE = 8 + count: int +NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01 +struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01.register_fields([('count', NvU64, 0)]) +struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS_v15_01.register_fields([('enabled', NvBool, 0), ('scrubComplete', NvBool, 1), ('supported', NvBool, 2), ('dbe', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01, 8), ('dbeNonResettable', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01, 16), ('sbe', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01, 24), ('sbeNonResettable', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS_v15_01, 32)]) +struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_DEPRECATED_RPC_PARAMS_v24_06.register_fields([('units', c.Array[NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS_v15_01, Literal[25]], 0), ('bFatalPoisonError', NvBool, 1000), ('flags', NvU32, 1004)]) +struct_rpc_ctrl_gpu_query_ecc_status_v24_06.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_GPU_QUERY_ECC_STATUS_DEPRECATED_RPC_PARAMS_v24_06, 8)]) +rpc_ctrl_gpu_query_ecc_status_v24_06: TypeAlias = struct_rpc_ctrl_gpu_query_ecc_status_v24_06 +@c.record +class struct_rpc_ctrl_gpu_query_ecc_status_v26_02(c.Struct): + SIZE = 1216 + hClient: int + hObject: int + params: struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_v26_02 +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_v26_02(c.Struct): + SIZE = 1208 + units: c.Array[struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS_v15_01, Literal[30]] + bFatalPoisonError: int + flags: int +NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_v26_02: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_v26_02 +struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_v26_02.register_fields([('units', c.Array[NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS_v15_01, Literal[30]], 0), ('bFatalPoisonError', NvBool, 1200), ('flags', NvU32, 1204)]) +struct_rpc_ctrl_gpu_query_ecc_status_v26_02.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('params', NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_v26_02, 8)]) +rpc_ctrl_gpu_query_ecc_status_v26_02: TypeAlias = struct_rpc_ctrl_gpu_query_ecc_status_v26_02 +rpc_ctrl_gpu_query_ecc_status_v: TypeAlias = struct_rpc_ctrl_gpu_query_ecc_status_v26_02 +@c.record +class struct_rpc_ctrl_dbg_get_mode_mmu_debug_v25_04(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_v25_04 +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_v25_04(c.Struct): + SIZE = 4 + value: int +NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_v25_04: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_v25_04 +struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_v25_04.register_fields([('value', NvU32, 0)]) +struct_rpc_ctrl_dbg_get_mode_mmu_debug_v25_04.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_v25_04, 8)]) +rpc_ctrl_dbg_get_mode_mmu_debug_v25_04: TypeAlias = struct_rpc_ctrl_dbg_get_mode_mmu_debug_v25_04 +rpc_ctrl_dbg_get_mode_mmu_debug_v: TypeAlias = struct_rpc_ctrl_dbg_get_mode_mmu_debug_v25_04 +@c.record +class struct_rpc_ctrl_dbg_get_mode_mmu_gcc_debug_v29_07(c.Struct): + SIZE = 12 + hClient: int + hObject: int + ctrlParams: struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07 +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07(c.Struct): + SIZE = 4 + value: int +NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07 +struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07.register_fields([('value', NvU32, 0)]) +struct_rpc_ctrl_dbg_get_mode_mmu_gcc_debug_v29_07.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_v29_07, 8)]) +rpc_ctrl_dbg_get_mode_mmu_gcc_debug_v29_07: TypeAlias = struct_rpc_ctrl_dbg_get_mode_mmu_gcc_debug_v29_07 +rpc_ctrl_dbg_get_mode_mmu_gcc_debug_v: TypeAlias = struct_rpc_ctrl_dbg_get_mode_mmu_gcc_debug_v29_07 +@c.record +class struct_rpc_ctrl_cmd_internal_gpu_start_fabric_probe_v25_09(c.Struct): + SIZE = 1 + bwMode: int +struct_rpc_ctrl_cmd_internal_gpu_start_fabric_probe_v25_09.register_fields([('bwMode', NvU8, 0)]) +rpc_ctrl_cmd_internal_gpu_start_fabric_probe_v25_09: TypeAlias = struct_rpc_ctrl_cmd_internal_gpu_start_fabric_probe_v25_09 +rpc_ctrl_cmd_internal_gpu_start_fabric_probe_v: TypeAlias = struct_rpc_ctrl_cmd_internal_gpu_start_fabric_probe_v25_09 +@c.record +class struct_rpc_ctrl_nvlink_get_inband_received_data_v25_0C(c.Struct): + SIZE = 520 + message_type: int + more: int + payload: struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_v25_0C +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_v25_0C(c.Struct): + SIZE = 516 + dataSize: int + data: c.Array[ctypes.c_ubyte, Literal[512]] +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_v25_0C: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_v25_0C +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_v25_0C.register_fields([('dataSize', NvU32, 0), ('data', c.Array[NvU8, Literal[512]], 4)]) +struct_rpc_ctrl_nvlink_get_inband_received_data_v25_0C.register_fields([('message_type', NvU16, 0), ('more', NvBool, 2), ('payload', NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_v25_0C, 4)]) +rpc_ctrl_nvlink_get_inband_received_data_v25_0C: TypeAlias = struct_rpc_ctrl_nvlink_get_inband_received_data_v25_0C +rpc_ctrl_nvlink_get_inband_received_data_v: TypeAlias = struct_rpc_ctrl_nvlink_get_inband_received_data_v25_0C +@c.record +class struct_rpc_fecs_error_v26_02(c.Struct): + SIZE = 8 + grIdx: int + error_type: int +struct_rpc_fecs_error_v26_02.register_fields([('grIdx', NvU32, 0), ('error_type', NvU8, 4)]) +rpc_fecs_error_v26_02: TypeAlias = struct_rpc_fecs_error_v26_02 +rpc_fecs_error_v: TypeAlias = struct_rpc_fecs_error_v26_02 +@c.record +class struct_rpc_ctrl_cmd_nvlink_inband_send_data_v26_05(c.Struct): + SIZE = 1028 + buffer: c.Array[ctypes.c_ubyte, Literal[1024]] + dataSize: int +struct_rpc_ctrl_cmd_nvlink_inband_send_data_v26_05.register_fields([('buffer', c.Array[NvU8, Literal[1024]], 0), ('dataSize', NvU32, 1024)]) +rpc_ctrl_cmd_nvlink_inband_send_data_v26_05: TypeAlias = struct_rpc_ctrl_cmd_nvlink_inband_send_data_v26_05 +rpc_ctrl_cmd_nvlink_inband_send_data_v: TypeAlias = struct_rpc_ctrl_cmd_nvlink_inband_send_data_v26_05 +@c.record +class struct_rpc_ctrl_cmd_internal_control_gsp_trace_v28_00(c.Struct): + SIZE = 32 + bufferSize: int + tracepointMask: int + bufferWatermark: int + bufferAddr: int + flag: int +struct_rpc_ctrl_cmd_internal_control_gsp_trace_v28_00.register_fields([('bufferSize', NvU32, 0), ('tracepointMask', NvU32, 4), ('bufferWatermark', NvU32, 8), ('bufferAddr', NvU64, 16), ('flag', NvU8, 24)]) +rpc_ctrl_cmd_internal_control_gsp_trace_v28_00: TypeAlias = struct_rpc_ctrl_cmd_internal_control_gsp_trace_v28_00 +rpc_ctrl_cmd_internal_control_gsp_trace_v: TypeAlias = struct_rpc_ctrl_cmd_internal_control_gsp_trace_v28_00 +@c.record +class struct_rpc_recovery_action_v28_01(c.Struct): + SIZE = 8 + type: int + value: int +struct_rpc_recovery_action_v28_01.register_fields([('type', NvU32, 0), ('value', NvBool, 4)]) +rpc_recovery_action_v28_01: TypeAlias = struct_rpc_recovery_action_v28_01 +rpc_recovery_action_v: TypeAlias = struct_rpc_recovery_action_v28_01 +@c.record +class struct_rpc_ctrl_subdevice_get_libos_heap_stats_v29_02(c.Struct): + SIZE = 1048 + hClient: int + hObject: int + ctrlParams: struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_v29_02 +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_v29_02(c.Struct): + SIZE = 1040 + poolStats: c.Array[struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS_v29_02, Literal[64]] + totalHeapSize: int + poolCount: int +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_v29_02: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_v29_02 +@c.record +class struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS_v29_02(c.Struct): + SIZE = 16 + allocations: int + peakAllocations: int + objectSize: int +NV2080_CTRL_GSP_LIBOS_POOL_STATS_v29_02: TypeAlias = struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS_v29_02 +struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS_v29_02.register_fields([('allocations', NvU32, 0), ('peakAllocations', NvU32, 4), ('objectSize', NvU64, 8)]) +struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_v29_02.register_fields([('poolStats', c.Array[NV2080_CTRL_GSP_LIBOS_POOL_STATS_v29_02, Literal[64]], 0), ('totalHeapSize', NvU64, 1024), ('poolCount', NvU8, 1032)]) +struct_rpc_ctrl_subdevice_get_libos_heap_stats_v29_02.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('ctrlParams', NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_v29_02, 8)]) +rpc_ctrl_subdevice_get_libos_heap_stats_v29_02: TypeAlias = struct_rpc_ctrl_subdevice_get_libos_heap_stats_v29_02 +rpc_ctrl_subdevice_get_libos_heap_stats_v: TypeAlias = struct_rpc_ctrl_subdevice_get_libos_heap_stats_v29_02 +@c.record +class struct_GSP_MSG_QUEUE_ELEMENT(c.Struct): + SIZE = 48 + authTagBuffer: c.Array[ctypes.c_ubyte, Literal[16]] + aadBuffer: c.Array[ctypes.c_ubyte, Literal[16]] + checkSum: int + seqNum: int + elemCount: int + padding: int +struct_GSP_MSG_QUEUE_ELEMENT.register_fields([('authTagBuffer', c.Array[NvU8, Literal[16]], 0), ('aadBuffer', c.Array[NvU8, Literal[16]], 16), ('checkSum', NvU32, 32), ('seqNum', NvU32, 36), ('elemCount', NvU32, 40), ('padding', NvU32, 44)]) +GSP_MSG_QUEUE_ELEMENT: TypeAlias = struct_GSP_MSG_QUEUE_ELEMENT +@c.record +class union_rpc_message_rpc_union_field_v03_00(c.Struct): + SIZE = 4 + spare: int + cpuRmGfid: int +union_rpc_message_rpc_union_field_v03_00.register_fields([('spare', NvU32, 0), ('cpuRmGfid', NvU32, 0)]) +rpc_message_rpc_union_field_v03_00: TypeAlias = union_rpc_message_rpc_union_field_v03_00 +rpc_message_rpc_union_field_v: TypeAlias = union_rpc_message_rpc_union_field_v03_00 +@c.record +class struct_rpc_message_header_v03_00(c.Struct): + SIZE = 32 + header_version: int + signature: int + length: int + function: int + rpc_result: int + rpc_result_private: int + sequence: int + u: union_rpc_message_rpc_union_field_v03_00 +struct_rpc_message_header_v03_00.register_fields([('header_version', NvU32, 0), ('signature', NvU32, 4), ('length', NvU32, 8), ('function', NvU32, 12), ('rpc_result', NvU32, 16), ('rpc_result_private', NvU32, 20), ('sequence', NvU32, 24), ('u', rpc_message_rpc_union_field_v, 28)]) +rpc_message_header_v03_00: TypeAlias = struct_rpc_message_header_v03_00 +rpc_message_header_v: TypeAlias = struct_rpc_message_header_v03_00 +@c.record +class struct_PACKED_REGISTRY_ENTRY(c.Struct): + SIZE = 16 + nameOffset: int + type: int + data: int + length: int +struct_PACKED_REGISTRY_ENTRY.register_fields([('nameOffset', NvU32, 0), ('type', NvU8, 4), ('data', NvU32, 8), ('length', NvU32, 12)]) +PACKED_REGISTRY_ENTRY: TypeAlias = struct_PACKED_REGISTRY_ENTRY +@c.record +class struct_PACKED_REGISTRY_TABLE(c.Struct): + SIZE = 8 + size: int + numEntries: int +struct_PACKED_REGISTRY_TABLE.register_fields([('size', NvU32, 0), ('numEntries', NvU32, 4)]) +PACKED_REGISTRY_TABLE: TypeAlias = struct_PACKED_REGISTRY_TABLE +DISPMUXSTATE: dict[int, str] = {(dispMuxState_None:=0): 'dispMuxState_None', (dispMuxState_IntegratedGPU:=1): 'dispMuxState_IntegratedGPU', (dispMuxState_DiscreteGPU:=2): 'dispMuxState_DiscreteGPU'} +@c.record +class ACPI_DSM_CACHE(c.Struct): + SIZE = 28 + suppFuncStatus: int + suppFuncs: c.Array[ctypes.c_ubyte, Literal[8]] + suppFuncsLen: int + bArg3isInteger: int + callbackStatus: int + callback: int +ACPI_DSM_CACHE.register_fields([('suppFuncStatus', NvU32, 0), ('suppFuncs', c.Array[NvU8, Literal[8]], 4), ('suppFuncsLen', NvU32, 12), ('bArg3isInteger', NvBool, 16), ('callbackStatus', NvU32, 20), ('callback', NvU32, 24)]) +@c.record +class ACPI_DATA(c.Struct): + SIZE = 472 + dsm: c.Array[ACPI_DSM_CACHE, Literal[12]] + dispStatusHotplugFunc: int + dispStatusConfigFunc: int + perfPostPowerStateFunc: int + stereo3dStateActiveFunc: int + dsmPlatCapsCache: c.Array[ctypes.c_uint32, Literal[12]] + MDTLFeatureSupport: int + dsmCurrentFunc: c.Array[ctypes.c_uint32, Literal[8]] + dsmCurrentSubFunc: c.Array[ctypes.c_uint32, Literal[8]] + dsmCurrentFuncSupport: int +enum__ACPI_DSM_FUNCTION: dict[int, str] = {(ACPI_DSM_FUNCTION_NBSI:=0): 'ACPI_DSM_FUNCTION_NBSI', (ACPI_DSM_FUNCTION_NVHG:=1): 'ACPI_DSM_FUNCTION_NVHG', (ACPI_DSM_FUNCTION_MXM:=2): 'ACPI_DSM_FUNCTION_MXM', (ACPI_DSM_FUNCTION_NBCI:=3): 'ACPI_DSM_FUNCTION_NBCI', (ACPI_DSM_FUNCTION_NVOP:=4): 'ACPI_DSM_FUNCTION_NVOP', (ACPI_DSM_FUNCTION_PCFG:=5): 'ACPI_DSM_FUNCTION_PCFG', (ACPI_DSM_FUNCTION_GPS_2X:=6): 'ACPI_DSM_FUNCTION_GPS_2X', (ACPI_DSM_FUNCTION_JT:=7): 'ACPI_DSM_FUNCTION_JT', (ACPI_DSM_FUNCTION_PEX:=8): 'ACPI_DSM_FUNCTION_PEX', (ACPI_DSM_FUNCTION_NVPCF_2X:=9): 'ACPI_DSM_FUNCTION_NVPCF_2X', (ACPI_DSM_FUNCTION_GPS:=10): 'ACPI_DSM_FUNCTION_GPS', (ACPI_DSM_FUNCTION_NVPCF:=11): 'ACPI_DSM_FUNCTION_NVPCF', (ACPI_DSM_FUNCTION_COUNT:=12): 'ACPI_DSM_FUNCTION_COUNT', (ACPI_DSM_FUNCTION_CURRENT:=13): 'ACPI_DSM_FUNCTION_CURRENT', (ACPI_DSM_FUNCTION_INVALID:=255): 'ACPI_DSM_FUNCTION_INVALID'} +ACPI_DSM_FUNCTION: TypeAlias = ctypes.c_uint32 +ACPI_DATA.register_fields([('dsm', c.Array[ACPI_DSM_CACHE, Literal[12]], 0), ('dispStatusHotplugFunc', ACPI_DSM_FUNCTION, 336), ('dispStatusConfigFunc', ACPI_DSM_FUNCTION, 340), ('perfPostPowerStateFunc', ACPI_DSM_FUNCTION, 344), ('stereo3dStateActiveFunc', ACPI_DSM_FUNCTION, 348), ('dsmPlatCapsCache', c.Array[NvU32, Literal[12]], 352), ('MDTLFeatureSupport', NvU32, 400), ('dsmCurrentFunc', c.Array[ACPI_DSM_FUNCTION, Literal[8]], 404), ('dsmCurrentSubFunc', c.Array[NvU32, Literal[8]], 436), ('dsmCurrentFuncSupport', NvU32, 468)]) +@c.record +class struct_DOD_METHOD_DATA(c.Struct): + SIZE = 72 + status: int + acpiIdListLen: int + acpiIdList: c.Array[ctypes.c_uint32, Literal[16]] +NV_STATUS: TypeAlias = ctypes.c_uint32 +struct_DOD_METHOD_DATA.register_fields([('status', NV_STATUS, 0), ('acpiIdListLen', NvU32, 4), ('acpiIdList', c.Array[NvU32, Literal[16]], 8)]) +DOD_METHOD_DATA: TypeAlias = struct_DOD_METHOD_DATA +@c.record +class struct_JT_METHOD_DATA(c.Struct): + SIZE = 12 + status: int + jtCaps: int + jtRevId: int + bSBIOSCaps: int +struct_JT_METHOD_DATA.register_fields([('status', NV_STATUS, 0), ('jtCaps', NvU32, 4), ('jtRevId', NvU16, 8), ('bSBIOSCaps', NvBool, 10)]) +JT_METHOD_DATA: TypeAlias = struct_JT_METHOD_DATA +@c.record +class struct_MUX_METHOD_DATA_ELEMENT(c.Struct): + SIZE = 12 + acpiId: int + mode: int + status: int +struct_MUX_METHOD_DATA_ELEMENT.register_fields([('acpiId', NvU32, 0), ('mode', NvU32, 4), ('status', NV_STATUS, 8)]) +MUX_METHOD_DATA_ELEMENT: TypeAlias = struct_MUX_METHOD_DATA_ELEMENT +@c.record +class struct_MUX_METHOD_DATA(c.Struct): + SIZE = 580 + tableLen: int + acpiIdMuxModeTable: c.Array[struct_MUX_METHOD_DATA_ELEMENT, Literal[16]] + acpiIdMuxPartTable: c.Array[struct_MUX_METHOD_DATA_ELEMENT, Literal[16]] + acpiIdMuxStateTable: c.Array[struct_MUX_METHOD_DATA_ELEMENT, Literal[16]] +struct_MUX_METHOD_DATA.register_fields([('tableLen', NvU32, 0), ('acpiIdMuxModeTable', c.Array[MUX_METHOD_DATA_ELEMENT, Literal[16]], 4), ('acpiIdMuxPartTable', c.Array[MUX_METHOD_DATA_ELEMENT, Literal[16]], 196), ('acpiIdMuxStateTable', c.Array[MUX_METHOD_DATA_ELEMENT, Literal[16]], 388)]) +MUX_METHOD_DATA: TypeAlias = struct_MUX_METHOD_DATA +@c.record +class struct_CAPS_METHOD_DATA(c.Struct): + SIZE = 8 + status: int + optimusCaps: int +struct_CAPS_METHOD_DATA.register_fields([('status', NV_STATUS, 0), ('optimusCaps', NvU32, 4)]) +CAPS_METHOD_DATA: TypeAlias = struct_CAPS_METHOD_DATA +@c.record +class struct_ACPI_METHOD_DATA(c.Struct): + SIZE = 676 + bValid: int + dodMethodData: struct_DOD_METHOD_DATA + jtMethodData: struct_JT_METHOD_DATA + muxMethodData: struct_MUX_METHOD_DATA + capsMethodData: struct_CAPS_METHOD_DATA +struct_ACPI_METHOD_DATA.register_fields([('bValid', NvBool, 0), ('dodMethodData', DOD_METHOD_DATA, 4), ('jtMethodData', JT_METHOD_DATA, 76), ('muxMethodData', MUX_METHOD_DATA, 88), ('capsMethodData', CAPS_METHOD_DATA, 668)]) +ACPI_METHOD_DATA: TypeAlias = struct_ACPI_METHOD_DATA +RM_ENGINE_TYPE: dict[int, str] = {(RM_ENGINE_TYPE_NULL:=0): 'RM_ENGINE_TYPE_NULL', (RM_ENGINE_TYPE_GR0:=1): 'RM_ENGINE_TYPE_GR0', (RM_ENGINE_TYPE_GR1:=2): 'RM_ENGINE_TYPE_GR1', (RM_ENGINE_TYPE_GR2:=3): 'RM_ENGINE_TYPE_GR2', (RM_ENGINE_TYPE_GR3:=4): 'RM_ENGINE_TYPE_GR3', (RM_ENGINE_TYPE_GR4:=5): 'RM_ENGINE_TYPE_GR4', (RM_ENGINE_TYPE_GR5:=6): 'RM_ENGINE_TYPE_GR5', (RM_ENGINE_TYPE_GR6:=7): 'RM_ENGINE_TYPE_GR6', (RM_ENGINE_TYPE_GR7:=8): 'RM_ENGINE_TYPE_GR7', (RM_ENGINE_TYPE_COPY0:=9): 'RM_ENGINE_TYPE_COPY0', (RM_ENGINE_TYPE_COPY1:=10): 'RM_ENGINE_TYPE_COPY1', (RM_ENGINE_TYPE_COPY2:=11): 'RM_ENGINE_TYPE_COPY2', (RM_ENGINE_TYPE_COPY3:=12): 'RM_ENGINE_TYPE_COPY3', (RM_ENGINE_TYPE_COPY4:=13): 'RM_ENGINE_TYPE_COPY4', (RM_ENGINE_TYPE_COPY5:=14): 'RM_ENGINE_TYPE_COPY5', (RM_ENGINE_TYPE_COPY6:=15): 'RM_ENGINE_TYPE_COPY6', (RM_ENGINE_TYPE_COPY7:=16): 'RM_ENGINE_TYPE_COPY7', (RM_ENGINE_TYPE_COPY8:=17): 'RM_ENGINE_TYPE_COPY8', (RM_ENGINE_TYPE_COPY9:=18): 'RM_ENGINE_TYPE_COPY9', (RM_ENGINE_TYPE_COPY10:=19): 'RM_ENGINE_TYPE_COPY10', (RM_ENGINE_TYPE_COPY11:=20): 'RM_ENGINE_TYPE_COPY11', (RM_ENGINE_TYPE_COPY12:=21): 'RM_ENGINE_TYPE_COPY12', (RM_ENGINE_TYPE_COPY13:=22): 'RM_ENGINE_TYPE_COPY13', (RM_ENGINE_TYPE_COPY14:=23): 'RM_ENGINE_TYPE_COPY14', (RM_ENGINE_TYPE_COPY15:=24): 'RM_ENGINE_TYPE_COPY15', (RM_ENGINE_TYPE_COPY16:=25): 'RM_ENGINE_TYPE_COPY16', (RM_ENGINE_TYPE_COPY17:=26): 'RM_ENGINE_TYPE_COPY17', (RM_ENGINE_TYPE_COPY18:=27): 'RM_ENGINE_TYPE_COPY18', (RM_ENGINE_TYPE_COPY19:=28): 'RM_ENGINE_TYPE_COPY19', (RM_ENGINE_TYPE_NVDEC0:=29): 'RM_ENGINE_TYPE_NVDEC0', (RM_ENGINE_TYPE_NVDEC1:=30): 'RM_ENGINE_TYPE_NVDEC1', (RM_ENGINE_TYPE_NVDEC2:=31): 'RM_ENGINE_TYPE_NVDEC2', (RM_ENGINE_TYPE_NVDEC3:=32): 'RM_ENGINE_TYPE_NVDEC3', (RM_ENGINE_TYPE_NVDEC4:=33): 'RM_ENGINE_TYPE_NVDEC4', (RM_ENGINE_TYPE_NVDEC5:=34): 'RM_ENGINE_TYPE_NVDEC5', (RM_ENGINE_TYPE_NVDEC6:=35): 'RM_ENGINE_TYPE_NVDEC6', (RM_ENGINE_TYPE_NVDEC7:=36): 'RM_ENGINE_TYPE_NVDEC7', (RM_ENGINE_TYPE_NVENC0:=37): 'RM_ENGINE_TYPE_NVENC0', (RM_ENGINE_TYPE_NVENC1:=38): 'RM_ENGINE_TYPE_NVENC1', (RM_ENGINE_TYPE_NVENC2:=39): 'RM_ENGINE_TYPE_NVENC2', (RM_ENGINE_TYPE_NVENC3:=40): 'RM_ENGINE_TYPE_NVENC3', (RM_ENGINE_TYPE_VP:=41): 'RM_ENGINE_TYPE_VP', (RM_ENGINE_TYPE_ME:=42): 'RM_ENGINE_TYPE_ME', (RM_ENGINE_TYPE_PPP:=43): 'RM_ENGINE_TYPE_PPP', (RM_ENGINE_TYPE_MPEG:=44): 'RM_ENGINE_TYPE_MPEG', (RM_ENGINE_TYPE_SW:=45): 'RM_ENGINE_TYPE_SW', (RM_ENGINE_TYPE_TSEC:=46): 'RM_ENGINE_TYPE_TSEC', (RM_ENGINE_TYPE_VIC:=47): 'RM_ENGINE_TYPE_VIC', (RM_ENGINE_TYPE_MP:=48): 'RM_ENGINE_TYPE_MP', (RM_ENGINE_TYPE_SEC2:=49): 'RM_ENGINE_TYPE_SEC2', (RM_ENGINE_TYPE_HOST:=50): 'RM_ENGINE_TYPE_HOST', (RM_ENGINE_TYPE_DPU:=51): 'RM_ENGINE_TYPE_DPU', (RM_ENGINE_TYPE_PMU:=52): 'RM_ENGINE_TYPE_PMU', (RM_ENGINE_TYPE_FBFLCN:=53): 'RM_ENGINE_TYPE_FBFLCN', (RM_ENGINE_TYPE_NVJPEG0:=54): 'RM_ENGINE_TYPE_NVJPEG0', (RM_ENGINE_TYPE_NVJPEG1:=55): 'RM_ENGINE_TYPE_NVJPEG1', (RM_ENGINE_TYPE_NVJPEG2:=56): 'RM_ENGINE_TYPE_NVJPEG2', (RM_ENGINE_TYPE_NVJPEG3:=57): 'RM_ENGINE_TYPE_NVJPEG3', (RM_ENGINE_TYPE_NVJPEG4:=58): 'RM_ENGINE_TYPE_NVJPEG4', (RM_ENGINE_TYPE_NVJPEG5:=59): 'RM_ENGINE_TYPE_NVJPEG5', (RM_ENGINE_TYPE_NVJPEG6:=60): 'RM_ENGINE_TYPE_NVJPEG6', (RM_ENGINE_TYPE_NVJPEG7:=61): 'RM_ENGINE_TYPE_NVJPEG7', (RM_ENGINE_TYPE_OFA0:=62): 'RM_ENGINE_TYPE_OFA0', (RM_ENGINE_TYPE_OFA1:=63): 'RM_ENGINE_TYPE_OFA1', (RM_ENGINE_TYPE_RESERVED40:=64): 'RM_ENGINE_TYPE_RESERVED40', (RM_ENGINE_TYPE_RESERVED41:=65): 'RM_ENGINE_TYPE_RESERVED41', (RM_ENGINE_TYPE_RESERVED42:=66): 'RM_ENGINE_TYPE_RESERVED42', (RM_ENGINE_TYPE_RESERVED43:=67): 'RM_ENGINE_TYPE_RESERVED43', (RM_ENGINE_TYPE_RESERVED44:=68): 'RM_ENGINE_TYPE_RESERVED44', (RM_ENGINE_TYPE_RESERVED45:=69): 'RM_ENGINE_TYPE_RESERVED45', (RM_ENGINE_TYPE_RESERVED46:=70): 'RM_ENGINE_TYPE_RESERVED46', (RM_ENGINE_TYPE_RESERVED47:=71): 'RM_ENGINE_TYPE_RESERVED47', (RM_ENGINE_TYPE_RESERVED48:=72): 'RM_ENGINE_TYPE_RESERVED48', (RM_ENGINE_TYPE_RESERVED49:=73): 'RM_ENGINE_TYPE_RESERVED49', (RM_ENGINE_TYPE_RESERVED4a:=74): 'RM_ENGINE_TYPE_RESERVED4a', (RM_ENGINE_TYPE_RESERVED4b:=75): 'RM_ENGINE_TYPE_RESERVED4b', (RM_ENGINE_TYPE_RESERVED4c:=76): 'RM_ENGINE_TYPE_RESERVED4c', (RM_ENGINE_TYPE_RESERVED4d:=77): 'RM_ENGINE_TYPE_RESERVED4d', (RM_ENGINE_TYPE_RESERVED4e:=78): 'RM_ENGINE_TYPE_RESERVED4e', (RM_ENGINE_TYPE_RESERVED4f:=79): 'RM_ENGINE_TYPE_RESERVED4f', (RM_ENGINE_TYPE_RESERVED50:=80): 'RM_ENGINE_TYPE_RESERVED50', (RM_ENGINE_TYPE_RESERVED51:=81): 'RM_ENGINE_TYPE_RESERVED51', (RM_ENGINE_TYPE_RESERVED52:=82): 'RM_ENGINE_TYPE_RESERVED52', (RM_ENGINE_TYPE_RESERVED53:=83): 'RM_ENGINE_TYPE_RESERVED53', (RM_ENGINE_TYPE_LAST:=84): 'RM_ENGINE_TYPE_LAST'} +@c.record +class BUSINFO(c.Struct): + SIZE = 10 + deviceID: int + vendorID: int + subdeviceID: int + subvendorID: int + revisionID: int +BUSINFO.register_fields([('deviceID', NvU16, 0), ('vendorID', NvU16, 2), ('subdeviceID', NvU16, 4), ('subvendorID', NvU16, 6), ('revisionID', NvU8, 8)]) +@c.record +class struct_GSP_VF_INFO(c.Struct): + SIZE = 40 + totalVFs: int + firstVFOffset: int + FirstVFBar0Address: int + FirstVFBar1Address: int + FirstVFBar2Address: int + b64bitBar0: int + b64bitBar1: int + b64bitBar2: int +struct_GSP_VF_INFO.register_fields([('totalVFs', NvU32, 0), ('firstVFOffset', NvU32, 4), ('FirstVFBar0Address', NvU64, 8), ('FirstVFBar1Address', NvU64, 16), ('FirstVFBar2Address', NvU64, 24), ('b64bitBar0', NvBool, 32), ('b64bitBar1', NvBool, 33), ('b64bitBar2', NvBool, 34)]) +GSP_VF_INFO: TypeAlias = struct_GSP_VF_INFO +@c.record +class GSP_PCIE_CONFIG_REG(c.Struct): + SIZE = 4 + linkCap: int +GSP_PCIE_CONFIG_REG.register_fields([('linkCap', NvU32, 0)]) +@c.record +class EcidManufacturingInfo(c.Struct): + SIZE = 12 + ecidLow: int + ecidHigh: int + ecidExtended: int +EcidManufacturingInfo.register_fields([('ecidLow', NvU32, 0), ('ecidHigh', NvU32, 4), ('ecidExtended', NvU32, 8)]) +@c.record +class FW_WPR_LAYOUT_OFFSET(c.Struct): + SIZE = 16 + nonWprHeapOffset: int + frtsOffset: int +FW_WPR_LAYOUT_OFFSET.register_fields([('nonWprHeapOffset', NvU64, 0), ('frtsOffset', NvU64, 8)]) +@c.record +class struct_GspStaticConfigInfo_t(c.Struct): + SIZE = 1656 + grCapsBits: c.Array[ctypes.c_ubyte, Literal[23]] + gidInfo: struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS + SKUInfo: struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS + fbRegionInfoParams: struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS + sriovCaps: struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS + sriovMaxGfid: int + engineCaps: c.Array[ctypes.c_uint32, Literal[3]] + poisonFuseEnabled: int + fb_length: int + fbio_mask: int + fb_bus_width: int + fb_ram_type: int + fbp_mask: int + l2_cache_size: int + gpuNameString: c.Array[ctypes.c_ubyte, Literal[64]] + gpuShortNameString: c.Array[ctypes.c_ubyte, Literal[64]] + gpuNameString_Unicode: c.Array[ctypes.c_uint16, Literal[64]] + bGpuInternalSku: int + bIsQuadroGeneric: int + bIsQuadroAd: int + bIsNvidiaNvs: int + bIsVgx: int + bGeforceSmb: int + bIsTitan: int + bIsTesla: int + bIsMobile: int + bIsGc6Rtd3Allowed: int + bIsGc8Rtd3Allowed: int + bIsGcOffRtd3Allowed: int + bIsGcoffLegacyAllowed: int + bIsMigSupported: int + RTD3GC6TotalBoardPower: int + RTD3GC6PerstDelay: int + bar1PdeBase: int + bar2PdeBase: int + bVbiosValid: int + vbiosSubVendor: int + vbiosSubDevice: int + bPageRetirementSupported: int + bSplitVasBetweenServerClientRm: int + bClRootportNeedsNosnoopWAR: int + displaylessMaxHeads: struct_VIRTUAL_DISPLAY_GET_NUM_HEADS_PARAMS + displaylessMaxResolution: struct_VIRTUAL_DISPLAY_GET_MAX_RESOLUTION_PARAMS + displaylessMaxPixels: int + hInternalClient: int + hInternalDevice: int + hInternalSubdevice: int + bSelfHostedMode: int + bAtsSupported: int + bIsGpuUefi: int + bIsEfiInit: int + ecidInfo: c.Array[EcidManufacturingInfo, Literal[2]] + fwWprLayoutOffset: FW_WPR_LAYOUT_OFFSET +@c.record +class struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS(c.Struct): + SIZE = 268 + index: int + flags: int + length: int + data: c.Array[ctypes.c_ubyte, Literal[256]] +NV2080_CTRL_GPU_GET_GID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS +struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS.register_fields([('index', NvU32, 0), ('flags', NvU32, 4), ('length', NvU32, 8), ('data', c.Array[NvU8, Literal[256]], 12)]) +@c.record +class struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS(c.Struct): + SIZE = 48 + BoardID: int + chipSKU: c.Array[ctypes.c_char, Literal[9]] + chipSKUMod: c.Array[ctypes.c_char, Literal[5]] + skuConfigVersion: int + project: c.Array[ctypes.c_char, Literal[5]] + projectSKU: c.Array[ctypes.c_char, Literal[5]] + CDP: c.Array[ctypes.c_char, Literal[6]] + projectSKUMod: c.Array[ctypes.c_char, Literal[2]] + businessCycle: int +NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS +struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS.register_fields([('BoardID', NvU32, 0), ('chipSKU', c.Array[ctypes.c_char, Literal[9]], 4), ('chipSKUMod', c.Array[ctypes.c_char, Literal[5]], 13), ('skuConfigVersion', NvU32, 20), ('project', c.Array[ctypes.c_char, Literal[5]], 24), ('projectSKU', c.Array[ctypes.c_char, Literal[5]], 29), ('CDP', c.Array[ctypes.c_char, Literal[6]], 34), ('projectSKUMod', c.Array[ctypes.c_char, Literal[2]], 40), ('businessCycle', NvU32, 44)]) +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS(c.Struct): + SIZE = 776 + numFBRegions: int + fbRegion: c.Array[struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO, Literal[16]] +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO(c.Struct): + SIZE = 48 + base: int + limit: int + reserved: int + performance: int + supportCompressed: int + supportISO: int + bProtected: int + blackList: c.Array[ctypes.c_ubyte, Literal[17]] +NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO +NV2080_CTRL_CMD_FB_GET_FB_REGION_SURFACE_MEM_TYPE_FLAG: TypeAlias = c.Array[ctypes.c_ubyte, Literal[17]] +struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO.register_fields([('base', NvU64, 0), ('limit', NvU64, 8), ('reserved', NvU64, 16), ('performance', NvU32, 24), ('supportCompressed', NvBool, 28), ('supportISO', NvBool, 29), ('bProtected', NvBool, 30), ('blackList', NV2080_CTRL_CMD_FB_GET_FB_REGION_SURFACE_MEM_TYPE_FLAG, 31)]) +struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS.register_fields([('numFBRegions', NvU32, 0), ('fbRegion', c.Array[NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO, Literal[16]], 8)]) +@c.record +class struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS(c.Struct): + SIZE = 80 + totalVFs: int + firstVfOffset: int + vfFeatureMask: int + FirstVFBar0Address: int + FirstVFBar1Address: int + FirstVFBar2Address: int + bar0Size: int + bar1Size: int + bar2Size: int + b64bitBar0: int + b64bitBar1: int + b64bitBar2: int + bSriovEnabled: int + bSriovHeavyEnabled: int + bEmulateVFBar0TlbInvalidationRegister: int + bClientRmAllocatedCtxBuffer: int + bNonPowerOf2ChannelCountSupported: int + bVfResizableBAR1Supported: int +NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS +struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS.register_fields([('totalVFs', NvU32, 0), ('firstVfOffset', NvU32, 4), ('vfFeatureMask', NvU32, 8), ('FirstVFBar0Address', NvU64, 16), ('FirstVFBar1Address', NvU64, 24), ('FirstVFBar2Address', NvU64, 32), ('bar0Size', NvU64, 40), ('bar1Size', NvU64, 48), ('bar2Size', NvU64, 56), ('b64bitBar0', NvBool, 64), ('b64bitBar1', NvBool, 65), ('b64bitBar2', NvBool, 66), ('bSriovEnabled', NvBool, 67), ('bSriovHeavyEnabled', NvBool, 68), ('bEmulateVFBar0TlbInvalidationRegister', NvBool, 69), ('bClientRmAllocatedCtxBuffer', NvBool, 70), ('bNonPowerOf2ChannelCountSupported', NvBool, 71), ('bVfResizableBAR1Supported', NvBool, 72)]) +struct_GspStaticConfigInfo_t.register_fields([('grCapsBits', c.Array[NvU8, Literal[23]], 0), ('gidInfo', NV2080_CTRL_GPU_GET_GID_INFO_PARAMS, 24), ('SKUInfo', NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS, 292), ('fbRegionInfoParams', NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS, 344), ('sriovCaps', NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS, 1120), ('sriovMaxGfid', NvU32, 1200), ('engineCaps', c.Array[NvU32, Literal[3]], 1204), ('poisonFuseEnabled', NvBool, 1216), ('fb_length', NvU64, 1224), ('fbio_mask', NvU64, 1232), ('fb_bus_width', NvU32, 1240), ('fb_ram_type', NvU32, 1244), ('fbp_mask', NvU64, 1248), ('l2_cache_size', NvU32, 1256), ('gpuNameString', c.Array[NvU8, Literal[64]], 1260), ('gpuShortNameString', c.Array[NvU8, Literal[64]], 1324), ('gpuNameString_Unicode', c.Array[NvU16, Literal[64]], 1388), ('bGpuInternalSku', NvBool, 1516), ('bIsQuadroGeneric', NvBool, 1517), ('bIsQuadroAd', NvBool, 1518), ('bIsNvidiaNvs', NvBool, 1519), ('bIsVgx', NvBool, 1520), ('bGeforceSmb', NvBool, 1521), ('bIsTitan', NvBool, 1522), ('bIsTesla', NvBool, 1523), ('bIsMobile', NvBool, 1524), ('bIsGc6Rtd3Allowed', NvBool, 1525), ('bIsGc8Rtd3Allowed', NvBool, 1526), ('bIsGcOffRtd3Allowed', NvBool, 1527), ('bIsGcoffLegacyAllowed', NvBool, 1528), ('bIsMigSupported', NvBool, 1529), ('RTD3GC6TotalBoardPower', NvU16, 1530), ('RTD3GC6PerstDelay', NvU16, 1532), ('bar1PdeBase', NvU64, 1536), ('bar2PdeBase', NvU64, 1544), ('bVbiosValid', NvBool, 1552), ('vbiosSubVendor', NvU32, 1556), ('vbiosSubDevice', NvU32, 1560), ('bPageRetirementSupported', NvBool, 1564), ('bSplitVasBetweenServerClientRm', NvBool, 1565), ('bClRootportNeedsNosnoopWAR', NvBool, 1566), ('displaylessMaxHeads', VIRTUAL_DISPLAY_GET_NUM_HEADS_PARAMS, 1568), ('displaylessMaxResolution', VIRTUAL_DISPLAY_GET_MAX_RESOLUTION_PARAMS, 1576), ('displaylessMaxPixels', NvU64, 1592), ('hInternalClient', NvHandle, 1600), ('hInternalDevice', NvHandle, 1604), ('hInternalSubdevice', NvHandle, 1608), ('bSelfHostedMode', NvBool, 1612), ('bAtsSupported', NvBool, 1613), ('bIsGpuUefi', NvBool, 1614), ('bIsEfiInit', NvBool, 1615), ('ecidInfo', c.Array[EcidManufacturingInfo, Literal[2]], 1616), ('fwWprLayoutOffset', FW_WPR_LAYOUT_OFFSET, 1640)]) +GspStaticConfigInfo: TypeAlias = struct_GspStaticConfigInfo_t +@c.record +class struct_GspSystemInfo(c.Struct): + SIZE = 928 + gpuPhysAddr: int + gpuPhysFbAddr: int + gpuPhysInstAddr: int + gpuPhysIoAddr: int + nvDomainBusDeviceFunc: int + simAccessBufPhysAddr: int + notifyOpSharedSurfacePhysAddr: int + pcieAtomicsOpMask: int + consoleMemSize: int + maxUserVa: int + pciConfigMirrorBase: int + pciConfigMirrorSize: int + PCIDeviceID: int + PCISubDeviceID: int + PCIRevisionID: int + pcieAtomicsCplDeviceCapMask: int + oorArch: int + clPdbProperties: int + Chipset: int + bGpuBehindBridge: int + bFlrSupported: int + b64bBar0Supported: int + bMnocAvailable: int + chipsetL1ssEnable: int + bUpstreamL0sUnsupported: int + bUpstreamL1Unsupported: int + bUpstreamL1PorSupported: int + bUpstreamL1PorMobileOnly: int + bSystemHasMux: int + upstreamAddressValid: int + FHBBusInfo: BUSINFO + chipsetIDInfo: BUSINFO + acpiMethodData: struct_ACPI_METHOD_DATA + hypervisorType: int + bIsPassthru: int + sysTimerOffsetNs: int + gspVFInfo: struct_GSP_VF_INFO + bIsPrimary: int + isGridBuild: int + pcieConfigReg: GSP_PCIE_CONFIG_REG + gridBuildCsp: int + bPreserveVideoMemoryAllocations: int + bTdrEventSupported: int + bFeatureStretchVblankCapable: int + bEnableDynamicGranularityPageArrays: int + bClockBoostSupported: int + bRouteDispIntrsToCPU: int + hostPageSize: int +struct_GspSystemInfo.register_fields([('gpuPhysAddr', NvU64, 0), ('gpuPhysFbAddr', NvU64, 8), ('gpuPhysInstAddr', NvU64, 16), ('gpuPhysIoAddr', NvU64, 24), ('nvDomainBusDeviceFunc', NvU64, 32), ('simAccessBufPhysAddr', NvU64, 40), ('notifyOpSharedSurfacePhysAddr', NvU64, 48), ('pcieAtomicsOpMask', NvU64, 56), ('consoleMemSize', NvU64, 64), ('maxUserVa', NvU64, 72), ('pciConfigMirrorBase', NvU32, 80), ('pciConfigMirrorSize', NvU32, 84), ('PCIDeviceID', NvU32, 88), ('PCISubDeviceID', NvU32, 92), ('PCIRevisionID', NvU32, 96), ('pcieAtomicsCplDeviceCapMask', NvU32, 100), ('oorArch', NvU8, 104), ('clPdbProperties', NvU64, 112), ('Chipset', NvU32, 120), ('bGpuBehindBridge', NvBool, 124), ('bFlrSupported', NvBool, 125), ('b64bBar0Supported', NvBool, 126), ('bMnocAvailable', NvBool, 127), ('chipsetL1ssEnable', NvU32, 128), ('bUpstreamL0sUnsupported', NvBool, 132), ('bUpstreamL1Unsupported', NvBool, 133), ('bUpstreamL1PorSupported', NvBool, 134), ('bUpstreamL1PorMobileOnly', NvBool, 135), ('bSystemHasMux', NvBool, 136), ('upstreamAddressValid', NvU8, 137), ('FHBBusInfo', BUSINFO, 138), ('chipsetIDInfo', BUSINFO, 148), ('acpiMethodData', ACPI_METHOD_DATA, 160), ('hypervisorType', NvU32, 836), ('bIsPassthru', NvBool, 840), ('sysTimerOffsetNs', NvU64, 848), ('gspVFInfo', GSP_VF_INFO, 856), ('bIsPrimary', NvBool, 896), ('isGridBuild', NvBool, 897), ('pcieConfigReg', GSP_PCIE_CONFIG_REG, 900), ('gridBuildCsp', NvU32, 904), ('bPreserveVideoMemoryAllocations', NvBool, 908), ('bTdrEventSupported', NvBool, 909), ('bFeatureStretchVblankCapable', NvBool, 910), ('bEnableDynamicGranularityPageArrays', NvBool, 911), ('bClockBoostSupported', NvBool, 912), ('bRouteDispIntrsToCPU', NvBool, 913), ('hostPageSize', NvU64, 920)]) +GspSystemInfo: TypeAlias = struct_GspSystemInfo +@c.record +class FALCON_APPLICATION_INTERFACE_HEADER_V1(c.Struct): + SIZE = 4 + version: int + headerSize: int + entrySize: int + entryCount: int +FALCON_APPLICATION_INTERFACE_HEADER_V1.register_fields([('version', NvU8, 0), ('headerSize', NvU8, 1), ('entrySize', NvU8, 2), ('entryCount', NvU8, 3)]) +@c.record +class FALCON_APPLICATION_INTERFACE_ENTRY_V1(c.Struct): + SIZE = 8 + id: int + dmemOffset: int +FALCON_APPLICATION_INTERFACE_ENTRY_V1.register_fields([('id', NvU32, 0), ('dmemOffset', NvU32, 4)]) +@c.record +class FALCON_APPLICATION_INTERFACE_DMEM_MAPPER_V3(c.Struct): + SIZE = 64 + signature: int + version: int + size: int + cmd_in_buffer_offset: int + cmd_in_buffer_size: int + cmd_out_buffer_offset: int + cmd_out_buffer_size: int + nvf_img_data_buffer_offset: int + nvf_img_data_buffer_size: int + printfBufferHdr: int + ucode_build_time_stamp: int + ucode_signature: int + init_cmd: int + ucode_feature: int + ucode_cmd_mask0: int + ucode_cmd_mask1: int + multiTgtTbl: int +FALCON_APPLICATION_INTERFACE_DMEM_MAPPER_V3.register_fields([('signature', NvU32, 0), ('version', NvU16, 4), ('size', NvU16, 6), ('cmd_in_buffer_offset', NvU32, 8), ('cmd_in_buffer_size', NvU32, 12), ('cmd_out_buffer_offset', NvU32, 16), ('cmd_out_buffer_size', NvU32, 20), ('nvf_img_data_buffer_offset', NvU32, 24), ('nvf_img_data_buffer_size', NvU32, 28), ('printfBufferHdr', NvU32, 32), ('ucode_build_time_stamp', NvU32, 36), ('ucode_signature', NvU32, 40), ('init_cmd', NvU32, 44), ('ucode_feature', NvU32, 48), ('ucode_cmd_mask0', NvU32, 52), ('ucode_cmd_mask1', NvU32, 56), ('multiTgtTbl', NvU32, 60)]) +@c.record +class struct_BIT_HEADER_V1_00(c.Struct): + SIZE = 12 + Id: int + Signature: int + BCD_Version: int + HeaderSize: int + TokenSize: int + TokenEntries: int + HeaderChksum: int +struct_BIT_HEADER_V1_00.register_fields([('Id', ctypes.c_uint16, 0), ('Signature', ctypes.c_uint32, 2), ('BCD_Version', ctypes.c_uint16, 6), ('HeaderSize', ctypes.c_ubyte, 8), ('TokenSize', ctypes.c_ubyte, 9), ('TokenEntries', ctypes.c_ubyte, 10), ('HeaderChksum', ctypes.c_ubyte, 11)]) +BIT_HEADER_V1_00: TypeAlias = struct_BIT_HEADER_V1_00 +@c.record +class struct_BIT_TOKEN_V1_00(c.Struct): + SIZE = 8 + TokenId: int + DataVersion: int + DataSize: int + DataPtr: int +struct_BIT_TOKEN_V1_00.register_fields([('TokenId', ctypes.c_ubyte, 0), ('DataVersion', ctypes.c_ubyte, 1), ('DataSize', ctypes.c_uint16, 2), ('DataPtr', ctypes.c_uint32, 4)]) +BIT_TOKEN_V1_00: TypeAlias = struct_BIT_TOKEN_V1_00 +@c.record +class BIT_DATA_BIOSDATA_BINVER(c.Struct): + SIZE = 5 + Version: int + OemVersion: int +BIT_DATA_BIOSDATA_BINVER.register_fields([('Version', ctypes.c_uint32, 0), ('OemVersion', ctypes.c_ubyte, 4)]) +@c.record +class BIT_DATA_FALCON_DATA_V2(c.Struct): + SIZE = 4 + FalconUcodeTablePtr: int +BIT_DATA_FALCON_DATA_V2.register_fields([('FalconUcodeTablePtr', ctypes.c_uint32, 0)]) +@c.record +class FALCON_UCODE_TABLE_HDR_V1(c.Struct): + SIZE = 6 + Version: int + HeaderSize: int + EntrySize: int + EntryCount: int + DescVersion: int + DescSize: int +FALCON_UCODE_TABLE_HDR_V1.register_fields([('Version', ctypes.c_ubyte, 0), ('HeaderSize', ctypes.c_ubyte, 1), ('EntrySize', ctypes.c_ubyte, 2), ('EntryCount', ctypes.c_ubyte, 3), ('DescVersion', ctypes.c_ubyte, 4), ('DescSize', ctypes.c_ubyte, 5)]) +@c.record +class FALCON_UCODE_TABLE_ENTRY_V1(c.Struct): + SIZE = 6 + ApplicationID: int + TargetID: int + DescPtr: int +FALCON_UCODE_TABLE_ENTRY_V1.register_fields([('ApplicationID', ctypes.c_ubyte, 0), ('TargetID', ctypes.c_ubyte, 1), ('DescPtr', ctypes.c_uint32, 2)]) +@c.record +class FALCON_UCODE_DESC_HEADER(c.Struct): + SIZE = 4 + vDesc: int +FALCON_UCODE_DESC_HEADER.register_fields([('vDesc', ctypes.c_uint32, 0)]) +@c.record +class FALCON_UCODE_DESC_V3(c.Struct): + SIZE = 44 + Hdr: FALCON_UCODE_DESC_HEADER + StoredSize: int + PKCDataOffset: int + InterfaceOffset: int + IMEMPhysBase: int + IMEMLoadSize: int + IMEMVirtBase: int + DMEMPhysBase: int + DMEMLoadSize: int + EngineIdMask: int + UcodeId: int + SignatureCount: int + SignatureVersions: int + Reserved: int +FALCON_UCODE_DESC_V3.register_fields([('Hdr', FALCON_UCODE_DESC_HEADER, 0), ('StoredSize', ctypes.c_uint32, 4), ('PKCDataOffset', ctypes.c_uint32, 8), ('InterfaceOffset', ctypes.c_uint32, 12), ('IMEMPhysBase', ctypes.c_uint32, 16), ('IMEMLoadSize', ctypes.c_uint32, 20), ('IMEMVirtBase', ctypes.c_uint32, 24), ('DMEMPhysBase', ctypes.c_uint32, 28), ('DMEMLoadSize', ctypes.c_uint32, 32), ('EngineIdMask', ctypes.c_uint16, 36), ('UcodeId', ctypes.c_ubyte, 38), ('SignatureCount', ctypes.c_ubyte, 39), ('SignatureVersions', ctypes.c_uint16, 40), ('Reserved', ctypes.c_uint16, 42)]) +@c.record +class FWSECLIC_READ_VBIOS_DESC(c.Struct): + SIZE = 24 + version: int + size: int + gfwImageOffset: int + gfwImageSize: int + flags: int +FWSECLIC_READ_VBIOS_DESC.register_fields([('version', NvU32, 0), ('size', NvU32, 4), ('gfwImageOffset', NvU64, 8), ('gfwImageSize', NvU32, 16), ('flags', NvU32, 20)]) +@c.record +class FWSECLIC_FRTS_REGION_DESC(c.Struct): + SIZE = 20 + version: int + size: int + frtsRegionOffset4K: int + frtsRegionSize: int + frtsRegionMediaType: int +FWSECLIC_FRTS_REGION_DESC.register_fields([('version', NvU32, 0), ('size', NvU32, 4), ('frtsRegionOffset4K', NvU32, 8), ('frtsRegionSize', NvU32, 12), ('frtsRegionMediaType', NvU32, 16)]) +@c.record +class FWSECLIC_FRTS_CMD(c.Struct): + SIZE = 44 + readVbiosDesc: FWSECLIC_READ_VBIOS_DESC + frtsRegionDesc: FWSECLIC_FRTS_REGION_DESC +FWSECLIC_FRTS_CMD.register_fields([('readVbiosDesc', FWSECLIC_READ_VBIOS_DESC, 0), ('frtsRegionDesc', FWSECLIC_FRTS_REGION_DESC, 24)]) +@c.record +class struct__PCI_EXP_ROM_STANDARD(c.Struct): + SIZE = 30 + sig: int + reserved: c.Array[ctypes.c_ubyte, Literal[22]] + pciDataStrucPtr: int + sizeOfBlock: int +struct__PCI_EXP_ROM_STANDARD.register_fields([('sig', NvU16, 0), ('reserved', c.Array[NvU8, Literal[22]], 2), ('pciDataStrucPtr', NvU16, 24), ('sizeOfBlock', NvU32, 26)]) +PCI_EXP_ROM_STANDARD: TypeAlias = struct__PCI_EXP_ROM_STANDARD +PPCI_EXP_ROM_STANDARD: TypeAlias = c.POINTER[struct__PCI_EXP_ROM_STANDARD] +@c.record +class struct__PCI_EXP_ROM_NBSI(c.Struct): + SIZE = 30 + sig: int + reserved: c.Array[ctypes.c_ubyte, Literal[20]] + nbsiDataOffset: int + pciDataStrucPtr: int + sizeOfBlock: int +struct__PCI_EXP_ROM_NBSI.register_fields([('sig', NvU16, 0), ('reserved', c.Array[NvU8, Literal[20]], 2), ('nbsiDataOffset', NvU16, 22), ('pciDataStrucPtr', NvU16, 24), ('sizeOfBlock', NvU32, 26)]) +PCI_EXP_ROM_NBSI: TypeAlias = struct__PCI_EXP_ROM_NBSI +PPCI_EXP_ROM_NBSI: TypeAlias = c.POINTER[struct__PCI_EXP_ROM_NBSI] +@c.record +class union__PCI_EXP_ROM(c.Struct): + SIZE = 30 + standard: struct__PCI_EXP_ROM_STANDARD + nbsi: struct__PCI_EXP_ROM_NBSI +union__PCI_EXP_ROM.register_fields([('standard', PCI_EXP_ROM_STANDARD, 0), ('nbsi', PCI_EXP_ROM_NBSI, 0)]) +PCI_EXP_ROM: TypeAlias = union__PCI_EXP_ROM +PPCI_EXP_ROM: TypeAlias = c.POINTER[union__PCI_EXP_ROM] +@c.record +class struct__PCI_DATA_STRUCT(c.Struct): + SIZE = 24 + sig: int + vendorID: int + deviceID: int + deviceListPtr: int + pciDataStructLen: int + pciDataStructRev: int + classCode: c.Array[ctypes.c_ubyte, Literal[3]] + imageLen: int + vendorRomRev: int + codeType: int + lastImage: int + maxRunTimeImageLen: int +struct__PCI_DATA_STRUCT.register_fields([('sig', NvU32, 0), ('vendorID', NvU16, 4), ('deviceID', NvU16, 6), ('deviceListPtr', NvU16, 8), ('pciDataStructLen', NvU16, 10), ('pciDataStructRev', NvU8, 12), ('classCode', c.Array[NvU8, Literal[3]], 13), ('imageLen', NvU16, 16), ('vendorRomRev', NvU16, 18), ('codeType', NvU8, 20), ('lastImage', NvU8, 21), ('maxRunTimeImageLen', NvU16, 22)]) +PCI_DATA_STRUCT: TypeAlias = struct__PCI_DATA_STRUCT +PPCI_DATA_STRUCT: TypeAlias = c.POINTER[struct__PCI_DATA_STRUCT] +@c.record +class struct__NV_PCI_DATA_EXT_STRUCT(c.Struct): + SIZE = 12 + signature: int + nvPciDataExtRev: int + nvPciDataExtLen: int + subimageLen: int + privLastImage: int + flags: int +struct__NV_PCI_DATA_EXT_STRUCT.register_fields([('signature', NvU32, 0), ('nvPciDataExtRev', NvU16, 4), ('nvPciDataExtLen', NvU16, 6), ('subimageLen', NvU16, 8), ('privLastImage', NvU8, 10), ('flags', NvU8, 11)]) +NV_PCI_DATA_EXT_STRUCT: TypeAlias = struct__NV_PCI_DATA_EXT_STRUCT +PNV_PCI_DATA_EXT_STRUCT: TypeAlias = c.POINTER[struct__NV_PCI_DATA_EXT_STRUCT] +u32: TypeAlias = ctypes.c_uint32 +@c.record +class struct_nvfw_bin_hdr(c.Struct): + SIZE = 24 + bin_magic: int + bin_ver: int + bin_size: int + header_offset: int + data_offset: int + data_size: int +struct_nvfw_bin_hdr.register_fields([('bin_magic', u32, 0), ('bin_ver', u32, 4), ('bin_size', u32, 8), ('header_offset', u32, 12), ('data_offset', u32, 16), ('data_size', u32, 20)]) +@c.record +class struct_nvfw_bl_desc(c.Struct): + SIZE = 24 + start_tag: int + dmem_load_off: int + code_off: int + code_size: int + data_off: int + data_size: int +struct_nvfw_bl_desc.register_fields([('start_tag', u32, 0), ('dmem_load_off', u32, 4), ('code_off', u32, 8), ('code_size', u32, 12), ('data_off', u32, 16), ('data_size', u32, 20)]) +@c.record +class struct_nvfw_hs_header(c.Struct): + SIZE = 32 + sig_dbg_offset: int + sig_dbg_size: int + sig_prod_offset: int + sig_prod_size: int + patch_loc: int + patch_sig: int + hdr_offset: int + hdr_size: int +struct_nvfw_hs_header.register_fields([('sig_dbg_offset', u32, 0), ('sig_dbg_size', u32, 4), ('sig_prod_offset', u32, 8), ('sig_prod_size', u32, 12), ('patch_loc', u32, 16), ('patch_sig', u32, 20), ('hdr_offset', u32, 24), ('hdr_size', u32, 28)]) +@c.record +class struct_nvfw_hs_header_v2(c.Struct): + SIZE = 36 + sig_prod_offset: int + sig_prod_size: int + patch_loc: int + patch_sig: int + meta_data_offset: int + meta_data_size: int + num_sig: int + header_offset: int + header_size: int +struct_nvfw_hs_header_v2.register_fields([('sig_prod_offset', u32, 0), ('sig_prod_size', u32, 4), ('patch_loc', u32, 8), ('patch_sig', u32, 12), ('meta_data_offset', u32, 16), ('meta_data_size', u32, 20), ('num_sig', u32, 24), ('header_offset', u32, 28), ('header_size', u32, 32)]) +@c.record +class struct_nvfw_hs_load_header(c.Struct): + SIZE = 20 + non_sec_code_off: int + non_sec_code_size: int + data_dma_base: int + data_size: int + num_apps: int + apps: c.Array[ctypes.c_uint32, Literal[0]] +struct_nvfw_hs_load_header.register_fields([('non_sec_code_off', u32, 0), ('non_sec_code_size', u32, 4), ('data_dma_base', u32, 8), ('data_size', u32, 12), ('num_apps', u32, 16), ('apps', c.Array[u32, Literal[0]], 20)]) +@c.record +class struct_nvfw_hs_load_header_v2(c.Struct): + SIZE = 20 + os_code_offset: int + os_code_size: int + os_data_offset: int + os_data_size: int + num_apps: int + app: c.Array[struct_nvfw_hs_load_header_v2_app, Literal[0]] +@c.record +class struct_nvfw_hs_load_header_v2_app(c.Struct): + SIZE = 16 + offset: int + size: int + data_offset: int + data_size: int +struct_nvfw_hs_load_header_v2_app.register_fields([('offset', u32, 0), ('size', u32, 4), ('data_offset', u32, 8), ('data_size', u32, 12)]) +struct_nvfw_hs_load_header_v2.register_fields([('os_code_offset', u32, 0), ('os_code_size', u32, 4), ('os_data_offset', u32, 8), ('os_data_size', u32, 12), ('num_apps', u32, 16), ('app', c.Array[struct_nvfw_hs_load_header_v2_app, Literal[0]], 20)]) +GSP_FW_WPR_META_VERIFIED = 0xa0a0a0a0a0a0a0a0 +GSP_FW_WPR_META_REVISION = 1 +GSP_FW_WPR_META_MAGIC = 0xdc3aae21371a60b3 +GSP_FW_WPR_HEAP_FREE_REGION_COUNT = 128 +GSP_FW_HEAP_FREE_LIST_MAGIC = 0x4845415046524545 +GSP_FW_SR_META_MAGIC = 0x8a3bb9e6c6c39d93 +GSP_FW_SR_META_REVISION = 2 +GSP_FW_SR_META_INTERNAL_SIZE = 128 +NVDM_TYPE_HULK = 0x11 +NVDM_TYPE_FIRMWARE_UPDATE = 0x12 +NVDM_TYPE_PRC = 0x13 +NVDM_TYPE_COT = 0x14 +NVDM_TYPE_FSP_RESPONSE = 0x15 +NVDM_TYPE_CAPS_QUERY = 0x16 +NVDM_TYPE_INFOROM = 0x17 +NVDM_TYPE_SMBPBI = 0x18 +NVDM_TYPE_ROMREAD = 0x1A +NVDM_TYPE_UEFI_RM = 0x1C +NVDM_TYPE_UEFI_XTL_DEBUG_INTR = 0x1D +NVDM_TYPE_TNVL = 0x1F +NVDM_TYPE_CLOCK_BOOST = 0x20 +NVDM_TYPE_FSP_GSP_COMM = 0x21 +MAX_GPC_COUNT = 32 +VGPU_MAX_REGOPS_PER_RPC = 100 +VGPU_RESERVED_HANDLE_BASE = 0xCAF3F000 +VGPU_RESERVED_HANDLE_RANGE = 0x1000 +VGPU_CALC_PARAM_OFFSET = lambda prev_offset,prev_params: (prev_offset + NV_ALIGN_UP(sizeof(prev_params), sizeof(NvU32))) # type: ignore +NV_VGPU_MSG_HEADER_VERSION_MAJOR_TOT = 0x00000003 +NV_VGPU_MSG_HEADER_VERSION_MINOR_TOT = 0x00000000 +NV_VGPU_MSG_SIGNATURE_VALID = 0x43505256 +NV_VGPU_MSG_RESULT_VMIOP_INVAL = 0xFF000001 +NV_VGPU_MSG_RESULT_VMIOP_RESOURCE = 0xFF000002 +NV_VGPU_MSG_RESULT_VMIOP_RANGE = 0xFF000003 +NV_VGPU_MSG_RESULT_VMIOP_READ_ONLY = 0xFF000004 +NV_VGPU_MSG_RESULT_VMIOP_NOT_FOUND = 0xFF000005 +NV_VGPU_MSG_RESULT_VMIOP_NO_ADDRESS_SPACE = 0xFF000006 +NV_VGPU_MSG_RESULT_VMIOP_TIMEOUT = 0xFF000007 +NV_VGPU_MSG_RESULT_VMIOP_NOT_ALLOWED_IN_CALLBACK = 0xFF000008 +NV_VGPU_MSG_RESULT_VMIOP_ECC_MISMATCH = 0xFF000009 +NV_VGPU_MSG_RESULT_VMIOP_NOT_SUPPORTED = 0xFF00000a +NV_VGPU_MSG_RESULT_RPC_UNKNOWN_FUNCTION = 0xFF100001 +NV_VGPU_MSG_RESULT_RPC_INVALID_MESSAGE_FORMAT = 0xFF100002 +NV_VGPU_MSG_RESULT_RPC_HANDLE_NOT_FOUND = 0xFF100003 +NV_VGPU_MSG_RESULT_RPC_HANDLE_EXISTS = 0xFF100004 +NV_VGPU_MSG_RESULT_RPC_UNKNOWN_RM_ERROR = 0xFF100005 +NV_VGPU_MSG_RESULT_RPC_UNKNOWN_VMIOP_ERROR = 0xFF100006 +NV_VGPU_MSG_RESULT_RPC_RESERVED_HANDLE = 0xFF100007 +NV_VGPU_MSG_RESULT_RPC_CUDA_PROFILING_DISABLED = 0xFF100008 +NV_VGPU_MSG_RESULT_RPC_API_CONTROL_NOT_SUPPORTED = 0xFF100009 +NV_VGPU_MSG_RESULT_RPC_PENDING = 0xFFFFFFFF +NV_VGPU_MSG_UNION_INIT = 0x00000000 +NV_VGPU_PTEDESC_INIT = 0x00000000 +NV_VGPU_PTEDESC__PROD = 0x00000000 +NV_VGPU_PTEDESC_IDR_NONE = 0x00000000 +NV_VGPU_PTEDESC_IDR_SINGLE = 0x00000001 +NV_VGPU_PTEDESC_IDR_DOUBLE = 0x00000002 +NV_VGPU_PTEDESC_IDR_TRIPLE = 0x00000003 +NV_VGPU_PTE_PAGE_SIZE = 0x1000 +NV_VGPU_PTE_SIZE = 4 +NV_VGPU_PTE_INDEX_SHIFT = 10 +NV_VGPU_PTE_INDEX_MASK = 0x3FF +NV_VGPU_PTE_64_PAGE_SIZE = 0x1000 +NV_VGPU_PTE_64_SIZE = 8 +NV_VGPU_PTE_64_INDEX_SHIFT = 9 +NV_VGPU_PTE_64_INDEX_MASK = 0x1FF +NV_VGPU_LOG_LEVEL_FATAL = 0x00000000 +NV_VGPU_LOG_LEVEL_ERROR = 0x00000001 +NV_VGPU_LOG_LEVEL_NOTICE = 0x00000002 +NV_VGPU_LOG_LEVEL_STATUS = 0x00000003 +NV_VGPU_LOG_LEVEL_DEBUG = 0x00000004 +VGPU_RPC_GET_P2P_CAPS_V2_MAX_GPUS_SQUARED_PER_RPC = 512 +GR_MAX_RPC_CTX_BUFFER_COUNT = 32 +VGPU_RPC_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PER_RPC_v21_06 = 80 +LIBOS_MEMORY_REGION_INIT_ARGUMENTS_MAX = 4096 +LIBOS_MEMORY_REGION_RADIX_PAGE_SIZE = 4096 +LIBOS_MEMORY_REGION_RADIX_PAGE_LOG2 = 12 +MSGQ_VERSION = 0 +MAX_DSM_SUPPORTED_FUNCS_RTN_LEN = 8 +NV_ACPI_GENERIC_FUNC_COUNT = 8 +REGISTRY_TABLE_ENTRY_TYPE_UNKNOWN = 0 +REGISTRY_TABLE_ENTRY_TYPE_DWORD = 1 +REGISTRY_TABLE_ENTRY_TYPE_BINARY = 2 +REGISTRY_TABLE_ENTRY_TYPE_STRING = 3 +MAX_GROUP_COUNT = 2 +RM_ENGINE_TYPE_GRAPHICS = RM_ENGINE_TYPE_GR0 +RM_ENGINE_TYPE_BSP = RM_ENGINE_TYPE_NVDEC0 +RM_ENGINE_TYPE_MSENC = RM_ENGINE_TYPE_NVENC0 +RM_ENGINE_TYPE_CIPHER = RM_ENGINE_TYPE_TSEC +RM_ENGINE_TYPE_NVJPG = RM_ENGINE_TYPE_NVJPEG0 +RM_ENGINE_TYPE_COPY_SIZE = 20 +RM_ENGINE_TYPE_NVENC_SIZE = 4 +RM_ENGINE_TYPE_NVJPEG_SIZE = 8 +RM_ENGINE_TYPE_NVDEC_SIZE = 8 +RM_ENGINE_TYPE_OFA_SIZE = 2 +RM_ENGINE_TYPE_GR_SIZE = 8 +NVGPU_ENGINE_CAPS_MASK_BITS = 32 +NVGPU_ENGINE_CAPS_MASK_ARRAY_MAX = ((RM_ENGINE_TYPE_LAST-1)/NVGPU_ENGINE_CAPS_MASK_BITS + 1) +NVGPU_GET_ENGINE_CAPS_MASK = lambda caps,id: (caps[(id)/NVGPU_ENGINE_CAPS_MASK_BITS] & NVBIT((id) % NVGPU_ENGINE_CAPS_MASK_BITS)) # type: ignore +FALCON_APPLICATION_INTERFACE_ENTRY_ID_DMEMMAPPER = (0x4) +FALCON_APPLICATION_INTERFACE_DMEM_MAPPER_V3_CMD_FRTS = (0x15) +FALCON_APPLICATION_INTERFACE_DMEM_MAPPER_V3_CMD_SB = (0x19) +BIT_HEADER_ID = 0xB8FF +BIT_HEADER_SIGNATURE = 0x00544942 +BIT_HEADER_SIZE_OFFSET = 8 +BIT_HEADER_V1_00_FMT = "1w1d1w4b" +BIT_TOKEN_V1_00_SIZE_6 = 6 +BIT_TOKEN_V1_00_SIZE_8 = 8 +BIT_TOKEN_V1_00_FMT_SIZE_6 = "2b2w" +BIT_TOKEN_V1_00_FMT_SIZE_8 = "2b1w1d" +BIT_TOKEN_BIOSDATA = 0x42 +BIT_DATA_BIOSDATA_VERSION_1 = 0x1 +BIT_DATA_BIOSDATA_VERSION_2 = 0x2 +BIT_DATA_BIOSDATA_BINVER_FMT = "1d1b" +BIT_DATA_BIOSDATA_BINVER_SIZE_5 = 5 +BIT_TOKEN_FALCON_DATA = 0x70 +BIT_DATA_FALCON_DATA_V2_4_FMT = "1d" +BIT_DATA_FALCON_DATA_V2_SIZE_4 = 4 +FALCON_UCODE_TABLE_HDR_V1_VERSION = 1 +FALCON_UCODE_TABLE_HDR_V1_SIZE_6 = 6 +FALCON_UCODE_TABLE_HDR_V1_6_FMT = "6b" +FALCON_UCODE_TABLE_ENTRY_V1_VERSION = 1 +FALCON_UCODE_TABLE_ENTRY_V1_SIZE_6 = 6 +FALCON_UCODE_TABLE_ENTRY_V1_6_FMT = "2b1d" +FALCON_UCODE_ENTRY_APPID_FIRMWARE_SEC_LIC = 0x05 +FALCON_UCODE_ENTRY_APPID_FWSEC_DBG = 0x45 +FALCON_UCODE_ENTRY_APPID_FWSEC_PROD = 0x85 +NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC_FLAGS_VERSION_UNAVAILABLE = 0x00 +NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC_FLAGS_VERSION_AVAILABLE = 0x01 +NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC_VERSION_V1 = 0x01 +NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC_VERSION_V2 = 0x02 +NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC_VERSION_V3 = 0x03 +NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC_VERSION_V4 = 0x04 +FALCON_UCODE_DESC_HEADER_FORMAT = "1d" +FALCON_UCODE_DESC_V3_SIZE_44 = 44 +FALCON_UCODE_DESC_V3_44_FMT = "9d1w2b2w" +BCRT30_RSA3K_SIG_SIZE = 384 +FWSECLIC_READ_VBIOS_STRUCT_FLAGS = (2) +FWSECLIC_FRTS_REGION_MEDIA_FB = (2) +FWSECLIC_FRTS_REGION_SIZE_1MB_IN_4K = (0x100) +NV_BCRT_HASH_INFO_BASE_CODE_TYPE_VBIOS_BASE = 0x00 +NV_BCRT_HASH_INFO_BASE_CODE_TYPE_VBIOS_EXT = 0xE0 +PCI_EXP_ROM_SIGNATURE = 0xaa55 +PCI_EXP_ROM_SIGNATURE_NV = 0x4e56 +PCI_EXP_ROM_SIGNATURE_NV2 = 0xbb77 +IS_VALID_PCI_ROM_SIG = lambda sig: ((sig == PCI_EXP_ROM_SIGNATURE) or (sig == PCI_EXP_ROM_SIGNATURE_NV) or (sig == PCI_EXP_ROM_SIGNATURE_NV2)) # type: ignore +OFFSETOF_PCI_EXP_ROM_SIG = 0x0 +OFFSETOF_PCI_EXP_ROM_NBSI_DATA_OFFSET = 0x16 +OFFSETOF_PCI_EXP_ROM_PCI_DATA_STRUCT_PTR = 0x18 +PCI_DATA_STRUCT_SIGNATURE = 0x52494350 +PCI_DATA_STRUCT_SIGNATURE_NV = 0x5344504E +PCI_DATA_STRUCT_SIGNATURE_NV2 = 0x53494752 +IS_VALID_PCI_DATA_SIG = lambda sig: ((sig == PCI_DATA_STRUCT_SIGNATURE) or (sig == PCI_DATA_STRUCT_SIGNATURE_NV) or (sig == PCI_DATA_STRUCT_SIGNATURE_NV2)) # type: ignore +PCI_ROM_IMAGE_BLOCK_SIZE = 512 +OFFSETOF_PCI_DATA_STRUCT_SIG = 0x0 +OFFSETOF_PCI_DATA_STRUCT_VENDOR_ID = 0x4 +OFFSETOF_PCI_DATA_STRUCT_LEN = 0xa +OFFSETOF_PCI_DATA_STRUCT_CLASS_CODE = 0xd +OFFSETOF_PCI_DATA_STRUCT_CODE_TYPE = 0x14 +OFFSETOF_PCI_DATA_STRUCT_IMAGE_LEN = 0x10 +OFFSETOF_PCI_DATA_STRUCT_LAST_IMAGE = 0x15 +NV_PCI_DATA_EXT_SIG = 0x4544504E +NV_PCI_DATA_EXT_REV_10 = 0x100 +NV_PCI_DATA_EXT_REV_11 = 0x101 +OFFSETOF_PCI_DATA_EXT_STRUCT_SIG = 0x0 +OFFSETOF_PCI_DATA_EXT_STRUCT_LEN = 0x6 +OFFSETOF_PCI_DATA_EXT_STRUCT_REV = 0x4 +OFFSETOF_PCI_DATA_EXT_STRUCT_SUBIMAGE_LEN = 0x8 +OFFSETOF_PCI_DATA_EXT_STRUCT_LAST_IMAGE = 0xa +OFFSETOF_PCI_DATA_EXT_STRUCT_FLAGS = 0xb +PCI_DATA_EXT_STRUCT_FLAGS_CHECKSUM_DISABLED = 0x04 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_570.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_570.py new file mode 100644 index 000000000..517b83cc3 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_570.py @@ -0,0 +1,24867 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +_anonenum0: dict[int, str] = {(AES128_NONE:=0): 'AES128_NONE', (AES128_CTR:=1): 'AES128_CTR', (AES128_CBC:=2): 'AES128_CBC', (AES128_ECB:=3): 'AES128_ECB', (AES128_OFB:=4): 'AES128_OFB', (AES128_CTR_LSB16B:=5): 'AES128_CTR_LSB16B', (AES128_CLR_AS_ENCRYPT:=6): 'AES128_CLR_AS_ENCRYPT', (AES128_RESERVED:=7): 'AES128_RESERVED'} +_anonenum1: dict[int, str] = {(AES128_CTS_DISABLE:=0): 'AES128_CTS_DISABLE', (AES128_CTS_ENABLE:=1): 'AES128_CTS_ENABLE'} +_anonenum2: dict[int, str] = {(AES128_PADDING_NONE:=0): 'AES128_PADDING_NONE', (AES128_PADDING_CARRY_OVER:=1): 'AES128_PADDING_CARRY_OVER', (AES128_PADDING_RFC2630:=2): 'AES128_PADDING_RFC2630', (AES128_PADDING_RESERVED:=7): 'AES128_PADDING_RESERVED'} +ENCR_MODE: dict[int, str] = {(ENCR_MODE_CTR64:=0): 'ENCR_MODE_CTR64', (ENCR_MODE_CBC:=1): 'ENCR_MODE_CBC', (ENCR_MODE_ECB:=2): 'ENCR_MODE_ECB', (ENCR_MODE_ECB_PARTIAL:=3): 'ENCR_MODE_ECB_PARTIAL', (ENCR_MODE_CBC_PARTIAL:=4): 'ENCR_MODE_CBC_PARTIAL', (ENCR_MODE_CLEAR_INTO_VPR:=5): 'ENCR_MODE_CLEAR_INTO_VPR', (ENCR_MODE_FORCE_INTO_VPR:=6): 'ENCR_MODE_FORCE_INTO_VPR'} +_anonenum3: dict[int, str] = {(DRM_MS_PIFF_CTR:=17): 'DRM_MS_PIFF_CTR'} +_anonenum4: dict[int, str] = {(DRM_MS_PIFF_CBC:=2): 'DRM_MS_PIFF_CBC'} +_anonenum5: dict[int, str] = {(DRM_MARLIN_CTR:=1): 'DRM_MARLIN_CTR'} +_anonenum6: dict[int, str] = {(DRM_MARLIN_CBC:=34): 'DRM_MARLIN_CBC'} +_anonenum7: dict[int, str] = {(DRM_WIDEVINE:=10): 'DRM_WIDEVINE'} +_anonenum8: dict[int, str] = {(DRM_WIDEVINE_CTR:=17): 'DRM_WIDEVINE_CTR'} +_anonenum9: dict[int, str] = {(DRM_ULTRA_VIOLET:=5): 'DRM_ULTRA_VIOLET'} +_anonenum10: dict[int, str] = {(DRM_NONE:=0): 'DRM_NONE'} +_anonenum11: dict[int, str] = {(DRM_CLR_AS_ENCRYPT:=6): 'DRM_CLR_AS_ENCRYPT'} +@c.record +class struct__nvdec_ssm_s(c.Struct): + SIZE = 8 + bytes_of_protected_data: int + bytes_of_clear_data: int + skip_byte_blk: int + crypt_byte_blk: int + skip: int + last: int + pad: int + mode: int + entry_type: int + reserved: int +struct__nvdec_ssm_s.register_fields([('bytes_of_protected_data', ctypes.c_uint32, 0), ('bytes_of_clear_data', ctypes.c_uint32, 4, 16, 0), ('skip_byte_blk', ctypes.c_uint32, 6, 4, 0), ('crypt_byte_blk', ctypes.c_uint32, 6, 4, 4), ('skip', ctypes.c_uint32, 7, 1, 0), ('last', ctypes.c_uint32, 7, 1, 1), ('pad', ctypes.c_uint32, 7, 1, 2), ('mode', ctypes.c_uint32, 7, 1, 3), ('entry_type', ctypes.c_uint32, 7, 1, 4), ('reserved', ctypes.c_uint32, 7, 3, 5)]) +nvdec_ssm_s: TypeAlias = struct__nvdec_ssm_s +@c.record +class struct__nvdec_pass2_otf_ext_s(c.Struct): + SIZE = 12 + ssm_entry_num: int + ssm_iv_num: int + real_stream_length: int + non_slice_data: int + drm_mode: int + reserved: int +struct__nvdec_pass2_otf_ext_s.register_fields([('ssm_entry_num', ctypes.c_uint32, 0, 16, 0), ('ssm_iv_num', ctypes.c_uint32, 2, 16, 0), ('real_stream_length', ctypes.c_uint32, 4), ('non_slice_data', ctypes.c_uint32, 8, 16, 0), ('drm_mode', ctypes.c_uint32, 10, 7, 0), ('reserved', ctypes.c_uint32, 10, 9, 7)]) +nvdec_pass2_otf_ext_s: TypeAlias = struct__nvdec_pass2_otf_ext_s +@c.record +class struct__nvdec_substream_entry_s(c.Struct): + SIZE = 12 + substream_start_offset: int + substream_length: int + substream_first_tile_idx: int + substream_last_tile_idx: int + last_substream_entry_in_frame: int + reserved: int +struct__nvdec_substream_entry_s.register_fields([('substream_start_offset', ctypes.c_uint32, 0), ('substream_length', ctypes.c_uint32, 4), ('substream_first_tile_idx', ctypes.c_uint32, 8, 8, 0), ('substream_last_tile_idx', ctypes.c_uint32, 9, 8, 0), ('last_substream_entry_in_frame', ctypes.c_uint32, 10, 1, 0), ('reserved', ctypes.c_uint32, 10, 15, 1)]) +nvdec_substream_entry_s: TypeAlias = struct__nvdec_substream_entry_s +@c.record +class struct__nvdec_ecdma_config_s(c.Struct): + SIZE = 24 + ecdma_enable: int + ecdma_blk_x_src: int + ecdma_blk_y_src: int + ecdma_blk_x_dst: int + ecdma_blk_y_dst: int + ref_pic_idx: int + boundary0_top: int + boundary0_bottom: int + boundary1_left: int + boundary1_right: int + blk_copy_flag: int + ctb_size: int +struct__nvdec_ecdma_config_s.register_fields([('ecdma_enable', ctypes.c_uint32, 0), ('ecdma_blk_x_src', ctypes.c_uint16, 4), ('ecdma_blk_y_src', ctypes.c_uint16, 6), ('ecdma_blk_x_dst', ctypes.c_uint16, 8), ('ecdma_blk_y_dst', ctypes.c_uint16, 10), ('ref_pic_idx', ctypes.c_uint16, 12), ('boundary0_top', ctypes.c_uint16, 14), ('boundary0_bottom', ctypes.c_uint16, 16), ('boundary1_left', ctypes.c_uint16, 18), ('boundary1_right', ctypes.c_uint16, 20), ('blk_copy_flag', ctypes.c_ubyte, 22), ('ctb_size', ctypes.c_ubyte, 23)]) +nvdec_ecdma_config_s: TypeAlias = struct__nvdec_ecdma_config_s +@c.record +class struct__nvdec_status_hevc_s(c.Struct): + SIZE = 36 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + error_ctb_pos: int + error_slice_pos: int +struct__nvdec_status_hevc_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('error_ctb_pos', ctypes.c_uint32, 28), ('error_slice_pos', ctypes.c_uint32, 32)]) +nvdec_status_hevc_s: TypeAlias = struct__nvdec_status_hevc_s +@c.record +class struct__nvdec_status_vp9_s(c.Struct): + SIZE = 36 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + error_ctb_pos: int + error_slice_pos: int +struct__nvdec_status_vp9_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('error_ctb_pos', ctypes.c_uint32, 28), ('error_slice_pos', ctypes.c_uint32, 32)]) +nvdec_status_vp9_s: TypeAlias = struct__nvdec_status_vp9_s +@c.record +class struct__nvdec_status_s(c.Struct): + SIZE = 56 + mbs_correctly_decoded: int + mbs_in_error: int + cycle_count: int + error_status: int + hevc: struct__nvdec_status_hevc_s + vp9: struct__nvdec_status_vp9_s + slice_header_error_code: int +struct__nvdec_status_s.register_fields([('mbs_correctly_decoded', ctypes.c_uint32, 0), ('mbs_in_error', ctypes.c_uint32, 4), ('cycle_count', ctypes.c_uint32, 8), ('error_status', ctypes.c_uint32, 12), ('hevc', nvdec_status_hevc_s, 16), ('vp9', nvdec_status_vp9_s, 16), ('slice_header_error_code', ctypes.c_uint32, 52)]) +nvdec_status_s: TypeAlias = struct__nvdec_status_s +@c.record +class struct__external_mv_s(c.Struct): + SIZE = 4 + mvx: int + mvy: int + refidx: int +struct__external_mv_s.register_fields([('mvx', ctypes.c_int32, 0, 14, 0), ('mvy', ctypes.c_int32, 1, 14, 6), ('refidx', ctypes.c_uint32, 3, 4, 4)]) +external_mv_s: TypeAlias = struct__external_mv_s +@c.record +class struct__nvdec_hevc_main10_444_ext_s(c.Struct): + SIZE = 28 + transformSkipRotationEnableFlag: int + transformSkipContextEnableFlag: int + intraBlockCopyEnableFlag: int + implicitRdpcmEnableFlag: int + explicitRdpcmEnableFlag: int + extendedPrecisionProcessingFlag: int + intraSmoothingDisabledFlag: int + highPrecisionOffsetsEnableFlag: int + fastRiceAdaptationEnableFlag: int + cabacBypassAlignmentEnableFlag: int + sps_444_extension_reserved: int + log2MaxTransformSkipSize: int + crossComponentPredictionEnableFlag: int + chromaQpAdjustmentEnableFlag: int + diffCuChromaQpAdjustmentDepth: int + chromaQpAdjustmentTableSize: int + log2SaoOffsetScaleLuma: int + log2SaoOffsetScaleChroma: int + pps_444_extension_reserved: int + cb_qp_adjustment: c.Array[ctypes.c_char, Literal[6]] + cr_qp_adjustment: c.Array[ctypes.c_char, Literal[6]] + HevcFltAboveOffset: int + HevcSaoAboveOffset: int +struct__nvdec_hevc_main10_444_ext_s.register_fields([('transformSkipRotationEnableFlag', ctypes.c_uint32, 0, 1, 0), ('transformSkipContextEnableFlag', ctypes.c_uint32, 0, 1, 1), ('intraBlockCopyEnableFlag', ctypes.c_uint32, 0, 1, 2), ('implicitRdpcmEnableFlag', ctypes.c_uint32, 0, 1, 3), ('explicitRdpcmEnableFlag', ctypes.c_uint32, 0, 1, 4), ('extendedPrecisionProcessingFlag', ctypes.c_uint32, 0, 1, 5), ('intraSmoothingDisabledFlag', ctypes.c_uint32, 0, 1, 6), ('highPrecisionOffsetsEnableFlag', ctypes.c_uint32, 0, 1, 7), ('fastRiceAdaptationEnableFlag', ctypes.c_uint32, 1, 1, 0), ('cabacBypassAlignmentEnableFlag', ctypes.c_uint32, 1, 1, 1), ('sps_444_extension_reserved', ctypes.c_uint32, 1, 22, 2), ('log2MaxTransformSkipSize', ctypes.c_uint32, 4, 4, 0), ('crossComponentPredictionEnableFlag', ctypes.c_uint32, 4, 1, 4), ('chromaQpAdjustmentEnableFlag', ctypes.c_uint32, 4, 1, 5), ('diffCuChromaQpAdjustmentDepth', ctypes.c_uint32, 4, 2, 6), ('chromaQpAdjustmentTableSize', ctypes.c_uint32, 5, 3, 0), ('log2SaoOffsetScaleLuma', ctypes.c_uint32, 5, 3, 3), ('log2SaoOffsetScaleChroma', ctypes.c_uint32, 5, 3, 6), ('pps_444_extension_reserved', ctypes.c_uint32, 6, 15, 1), ('cb_qp_adjustment', c.Array[ctypes.c_char, Literal[6]], 8), ('cr_qp_adjustment', c.Array[ctypes.c_char, Literal[6]], 14), ('HevcFltAboveOffset', ctypes.c_uint32, 20), ('HevcSaoAboveOffset', ctypes.c_uint32, 24)]) +nvdec_hevc_main10_444_ext_s: TypeAlias = struct__nvdec_hevc_main10_444_ext_s +@c.record +class struct__nvdec_hevc_pic_v1_s(c.Struct): + SIZE = 32 + hevc_main10_444_ext: struct__nvdec_hevc_main10_444_ext_s + sw_skip_start_length: int + external_ref_mem_dis: int + error_recovery_start_pos: int + error_external_mv_en: int + reserved0: int +struct__nvdec_hevc_pic_v1_s.register_fields([('hevc_main10_444_ext', nvdec_hevc_main10_444_ext_s, 0), ('sw_skip_start_length', ctypes.c_uint32, 28, 14, 0), ('external_ref_mem_dis', ctypes.c_uint32, 29, 1, 6), ('error_recovery_start_pos', ctypes.c_uint32, 29, 2, 7), ('error_external_mv_en', ctypes.c_uint32, 30, 1, 1), ('reserved0', ctypes.c_uint32, 30, 14, 2)]) +nvdec_hevc_pic_v1_s: TypeAlias = struct__nvdec_hevc_pic_v1_s +@c.record +class struct__nvdec_hevc_pic_v2_s(c.Struct): + SIZE = 4 + mv_hevc_enable: int + nuh_layer_id: int + default_ref_layers_active_flag: int + NumDirectRefLayers: int + max_one_active_ref_layer_flag: int + NumActiveRefLayerPics: int + poc_lsb_not_present_flag: int + reserved0: int +struct__nvdec_hevc_pic_v2_s.register_fields([('mv_hevc_enable', ctypes.c_uint32, 0, 1, 0), ('nuh_layer_id', ctypes.c_uint32, 0, 6, 1), ('default_ref_layers_active_flag', ctypes.c_uint32, 0, 1, 7), ('NumDirectRefLayers', ctypes.c_uint32, 1, 6, 0), ('max_one_active_ref_layer_flag', ctypes.c_uint32, 1, 1, 6), ('NumActiveRefLayerPics', ctypes.c_uint32, 1, 6, 7), ('poc_lsb_not_present_flag', ctypes.c_uint32, 2, 1, 5), ('reserved0', ctypes.c_uint32, 2, 10, 6)]) +nvdec_hevc_pic_v2_s: TypeAlias = struct__nvdec_hevc_pic_v2_s +@c.record +class struct__nvdec_hevc_pic_v3_s(c.Struct): + SIZE = 8 + slice_decoding_enable: int + slice_ec_enable: int + slice_ec_mv_type: int + err_detected_sw: int + slice_ec_slice_type: int + slice_strm_recfg_en: int + reserved: int + HevcSliceEdgeOffset: int +struct__nvdec_hevc_pic_v3_s.register_fields([('slice_decoding_enable', ctypes.c_uint32, 0, 1, 0), ('slice_ec_enable', ctypes.c_uint32, 0, 1, 1), ('slice_ec_mv_type', ctypes.c_uint32, 0, 2, 2), ('err_detected_sw', ctypes.c_uint32, 0, 1, 4), ('slice_ec_slice_type', ctypes.c_uint32, 0, 2, 5), ('slice_strm_recfg_en', ctypes.c_uint32, 0, 1, 7), ('reserved', ctypes.c_uint32, 1, 24, 0), ('HevcSliceEdgeOffset', ctypes.c_uint32, 4)]) +nvdec_hevc_pic_v3_s: TypeAlias = struct__nvdec_hevc_pic_v3_s +@c.record +class struct__nvdec_hevc_pic_s(c.Struct): + SIZE = 276 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + stream_len: int + enable_encryption: int + key_increment: int + encryption_mode: int + key_slot_index: int + ssm_en: int + enable_histogram: int + enable_substream_decoding: int + reserved0: int + gptimer_timeout_value: int + tileformat: int + gob_height: int + reserverd_surface_format: int + sw_start_code_e: int + disp_output_mode: int + reserved1: int + framestride: c.Array[ctypes.c_uint32, Literal[2]] + colMvBuffersize: int + HevcSaoBufferOffset: int + HevcBsdCtrlOffset: int + pic_width_in_luma_samples: int + pic_height_in_luma_samples: int + chroma_format_idc: int + bit_depth_luma: int + bit_depth_chroma: int + log2_min_luma_coding_block_size: int + log2_max_luma_coding_block_size: int + log2_min_transform_block_size: int + log2_max_transform_block_size: int + reserved2: int + max_transform_hierarchy_depth_inter: int + max_transform_hierarchy_depth_intra: int + scalingListEnable: int + amp_enable_flag: int + sample_adaptive_offset_enabled_flag: int + pcm_enabled_flag: int + pcm_sample_bit_depth_luma: int + pcm_sample_bit_depth_chroma: int + log2_min_pcm_luma_coding_block_size: int + log2_max_pcm_luma_coding_block_size: int + pcm_loop_filter_disabled_flag: int + sps_temporal_mvp_enabled_flag: int + strong_intra_smoothing_enabled_flag: int + reserved3: int + dependent_slice_segments_enabled_flag: int + output_flag_present_flag: int + num_extra_slice_header_bits: int + sign_data_hiding_enabled_flag: int + cabac_init_present_flag: int + num_ref_idx_l0_default_active: int + num_ref_idx_l1_default_active: int + init_qp: int + constrained_intra_pred_flag: int + transform_skip_enabled_flag: int + cu_qp_delta_enabled_flag: int + diff_cu_qp_delta_depth: int + reserved4: int + pps_cb_qp_offset: bytes + pps_cr_qp_offset: bytes + pps_beta_offset: bytes + pps_tc_offset: bytes + pps_slice_chroma_qp_offsets_present_flag: int + weighted_pred_flag: int + weighted_bipred_flag: int + transquant_bypass_enabled_flag: int + tiles_enabled_flag: int + entropy_coding_sync_enabled_flag: int + num_tile_columns: int + num_tile_rows: int + loop_filter_across_tiles_enabled_flag: int + loop_filter_across_slices_enabled_flag: int + deblocking_filter_control_present_flag: int + deblocking_filter_override_enabled_flag: int + pps_deblocking_filter_disabled_flag: int + lists_modification_present_flag: int + log2_parallel_merge_level: int + slice_segment_header_extension_present_flag: int + reserved5: int + num_ref_frames: int + reserved6: int + longtermflag: int + initreflistidxl0: c.Array[ctypes.c_ubyte, Literal[16]] + initreflistidxl1: c.Array[ctypes.c_ubyte, Literal[16]] + RefDiffPicOrderCnts: c.Array[ctypes.c_int16, Literal[16]] + IDR_picture_flag: int + RAP_picture_flag: int + curr_pic_idx: int + pattern_id: int + sw_hdr_skip_length: int + reserved7: int + ecdma_cfg: struct__nvdec_ecdma_config_s + separate_colour_plane_flag: int + log2_max_pic_order_cnt_lsb_minus4: int + num_short_term_ref_pic_sets: int + num_long_term_ref_pics_sps: int + bBitParsingDisable: int + num_delta_pocs_of_rps_idx: int + long_term_ref_pics_present_flag: int + reserved_dxva: int + num_bits_short_term_ref_pics_in_slice: int + v1: struct__nvdec_hevc_pic_v1_s + v2: struct__nvdec_hevc_pic_v2_s + v3: struct__nvdec_hevc_pic_v3_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_hevc_pic_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('stream_len', ctypes.c_uint32, 48), ('enable_encryption', ctypes.c_uint32, 52), ('key_increment', ctypes.c_uint32, 56, 6, 0), ('encryption_mode', ctypes.c_uint32, 56, 4, 6), ('key_slot_index', ctypes.c_uint32, 57, 4, 2), ('ssm_en', ctypes.c_uint32, 57, 1, 6), ('enable_histogram', ctypes.c_uint32, 57, 1, 7), ('enable_substream_decoding', ctypes.c_uint32, 58, 1, 0), ('reserved0', ctypes.c_uint32, 58, 15, 1), ('gptimer_timeout_value', ctypes.c_uint32, 60), ('tileformat', ctypes.c_ubyte, 64, 2, 0), ('gob_height', ctypes.c_ubyte, 64, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 64, 3, 5), ('sw_start_code_e', ctypes.c_ubyte, 65), ('disp_output_mode', ctypes.c_ubyte, 66), ('reserved1', ctypes.c_ubyte, 67), ('framestride', c.Array[ctypes.c_uint32, Literal[2]], 68), ('colMvBuffersize', ctypes.c_uint32, 76), ('HevcSaoBufferOffset', ctypes.c_uint32, 80), ('HevcBsdCtrlOffset', ctypes.c_uint32, 84), ('pic_width_in_luma_samples', ctypes.c_uint16, 88), ('pic_height_in_luma_samples', ctypes.c_uint16, 90), ('chroma_format_idc', ctypes.c_uint32, 92, 4, 0), ('bit_depth_luma', ctypes.c_uint32, 92, 4, 4), ('bit_depth_chroma', ctypes.c_uint32, 93, 4, 0), ('log2_min_luma_coding_block_size', ctypes.c_uint32, 93, 4, 4), ('log2_max_luma_coding_block_size', ctypes.c_uint32, 94, 4, 0), ('log2_min_transform_block_size', ctypes.c_uint32, 94, 4, 4), ('log2_max_transform_block_size', ctypes.c_uint32, 95, 4, 0), ('reserved2', ctypes.c_uint32, 95, 4, 4), ('max_transform_hierarchy_depth_inter', ctypes.c_uint32, 96, 3, 0), ('max_transform_hierarchy_depth_intra', ctypes.c_uint32, 96, 3, 3), ('scalingListEnable', ctypes.c_uint32, 96, 1, 6), ('amp_enable_flag', ctypes.c_uint32, 96, 1, 7), ('sample_adaptive_offset_enabled_flag', ctypes.c_uint32, 97, 1, 0), ('pcm_enabled_flag', ctypes.c_uint32, 97, 1, 1), ('pcm_sample_bit_depth_luma', ctypes.c_uint32, 97, 4, 2), ('pcm_sample_bit_depth_chroma', ctypes.c_uint32, 97, 4, 6), ('log2_min_pcm_luma_coding_block_size', ctypes.c_uint32, 98, 4, 2), ('log2_max_pcm_luma_coding_block_size', ctypes.c_uint32, 98, 4, 6), ('pcm_loop_filter_disabled_flag', ctypes.c_uint32, 99, 1, 2), ('sps_temporal_mvp_enabled_flag', ctypes.c_uint32, 99, 1, 3), ('strong_intra_smoothing_enabled_flag', ctypes.c_uint32, 99, 1, 4), ('reserved3', ctypes.c_uint32, 99, 3, 5), ('dependent_slice_segments_enabled_flag', ctypes.c_uint32, 100, 1, 0), ('output_flag_present_flag', ctypes.c_uint32, 100, 1, 1), ('num_extra_slice_header_bits', ctypes.c_uint32, 100, 3, 2), ('sign_data_hiding_enabled_flag', ctypes.c_uint32, 100, 1, 5), ('cabac_init_present_flag', ctypes.c_uint32, 100, 1, 6), ('num_ref_idx_l0_default_active', ctypes.c_uint32, 100, 4, 7), ('num_ref_idx_l1_default_active', ctypes.c_uint32, 101, 4, 3), ('init_qp', ctypes.c_uint32, 101, 7, 7), ('constrained_intra_pred_flag', ctypes.c_uint32, 102, 1, 6), ('transform_skip_enabled_flag', ctypes.c_uint32, 102, 1, 7), ('cu_qp_delta_enabled_flag', ctypes.c_uint32, 103, 1, 0), ('diff_cu_qp_delta_depth', ctypes.c_uint32, 103, 2, 1), ('reserved4', ctypes.c_uint32, 103, 5, 3), ('pps_cb_qp_offset', ctypes.c_char, 104), ('pps_cr_qp_offset', ctypes.c_char, 105), ('pps_beta_offset', ctypes.c_char, 106), ('pps_tc_offset', ctypes.c_char, 107), ('pps_slice_chroma_qp_offsets_present_flag', ctypes.c_uint32, 108, 1, 0), ('weighted_pred_flag', ctypes.c_uint32, 108, 1, 1), ('weighted_bipred_flag', ctypes.c_uint32, 108, 1, 2), ('transquant_bypass_enabled_flag', ctypes.c_uint32, 108, 1, 3), ('tiles_enabled_flag', ctypes.c_uint32, 108, 1, 4), ('entropy_coding_sync_enabled_flag', ctypes.c_uint32, 108, 1, 5), ('num_tile_columns', ctypes.c_uint32, 108, 5, 6), ('num_tile_rows', ctypes.c_uint32, 109, 5, 3), ('loop_filter_across_tiles_enabled_flag', ctypes.c_uint32, 110, 1, 0), ('loop_filter_across_slices_enabled_flag', ctypes.c_uint32, 110, 1, 1), ('deblocking_filter_control_present_flag', ctypes.c_uint32, 110, 1, 2), ('deblocking_filter_override_enabled_flag', ctypes.c_uint32, 110, 1, 3), ('pps_deblocking_filter_disabled_flag', ctypes.c_uint32, 110, 1, 4), ('lists_modification_present_flag', ctypes.c_uint32, 110, 1, 5), ('log2_parallel_merge_level', ctypes.c_uint32, 110, 3, 6), ('slice_segment_header_extension_present_flag', ctypes.c_uint32, 111, 1, 1), ('reserved5', ctypes.c_uint32, 111, 6, 2), ('num_ref_frames', ctypes.c_ubyte, 112), ('reserved6', ctypes.c_ubyte, 113), ('longtermflag', ctypes.c_uint16, 114), ('initreflistidxl0', c.Array[ctypes.c_ubyte, Literal[16]], 116), ('initreflistidxl1', c.Array[ctypes.c_ubyte, Literal[16]], 132), ('RefDiffPicOrderCnts', c.Array[ctypes.c_int16, Literal[16]], 148), ('IDR_picture_flag', ctypes.c_ubyte, 180), ('RAP_picture_flag', ctypes.c_ubyte, 181), ('curr_pic_idx', ctypes.c_ubyte, 182), ('pattern_id', ctypes.c_ubyte, 183), ('sw_hdr_skip_length', ctypes.c_uint16, 184), ('reserved7', ctypes.c_uint16, 186), ('ecdma_cfg', nvdec_ecdma_config_s, 188), ('separate_colour_plane_flag', ctypes.c_uint32, 212, 1, 0), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_uint32, 212, 4, 1), ('num_short_term_ref_pic_sets', ctypes.c_uint32, 212, 7, 5), ('num_long_term_ref_pics_sps', ctypes.c_uint32, 213, 6, 4), ('bBitParsingDisable', ctypes.c_uint32, 214, 1, 2), ('num_delta_pocs_of_rps_idx', ctypes.c_uint32, 214, 8, 3), ('long_term_ref_pics_present_flag', ctypes.c_uint32, 215, 1, 3), ('reserved_dxva', ctypes.c_uint32, 215, 4, 4), ('num_bits_short_term_ref_pics_in_slice', ctypes.c_uint32, 216), ('v1', nvdec_hevc_pic_v1_s, 220), ('v2', nvdec_hevc_pic_v2_s, 252), ('v3', nvdec_hevc_pic_v3_s, 256), ('ssm', nvdec_pass2_otf_ext_s, 264)]) +nvdec_hevc_pic_s: TypeAlias = struct__nvdec_hevc_pic_s +@c.record +class struct__hevc_slice_info_s(c.Struct): + SIZE = 16 + first_flag: int + err_flag: int + last_flag: int + conceal_partial_slice: int + available: int + reserved0: int + ctb_count: int + bs_offset: int + bs_length: int + start_ctbx: int + start_ctby: int +struct__hevc_slice_info_s.register_fields([('first_flag', ctypes.c_uint32, 0, 1, 0), ('err_flag', ctypes.c_uint32, 0, 1, 1), ('last_flag', ctypes.c_uint32, 0, 1, 2), ('conceal_partial_slice', ctypes.c_uint32, 0, 1, 3), ('available', ctypes.c_uint32, 0, 1, 4), ('reserved0', ctypes.c_uint32, 0, 7, 5), ('ctb_count', ctypes.c_uint32, 1, 20, 4), ('bs_offset', ctypes.c_uint32, 4), ('bs_length', ctypes.c_uint32, 8), ('start_ctbx', ctypes.c_uint16, 12), ('start_ctby', ctypes.c_uint16, 14)]) +hevc_slice_info_s: TypeAlias = struct__hevc_slice_info_s +@c.record +class struct__slice_edge_ctb_pos_ctx_s(c.Struct): + SIZE = 8 + next_slice_pos_ctbxy: int + next_slice_segment_addr: int +struct__slice_edge_ctb_pos_ctx_s.register_fields([('next_slice_pos_ctbxy', ctypes.c_uint32, 0), ('next_slice_segment_addr', ctypes.c_uint32, 4)]) +slice_edge_ctb_pos_ctx_s: TypeAlias = struct__slice_edge_ctb_pos_ctx_s +@c.record +class struct__slice_edge_tile_ctx_s(c.Struct): + SIZE = 12 + tileInfo1: int + tileInfo2: int + tileInfo3: int +struct__slice_edge_tile_ctx_s.register_fields([('tileInfo1', ctypes.c_uint32, 0), ('tileInfo2', ctypes.c_uint32, 4), ('tileInfo3', ctypes.c_uint32, 8)]) +slice_edge_tile_ctx_s: TypeAlias = struct__slice_edge_tile_ctx_s +@c.record +class struct__slice_edge_stats_ctx_s(c.Struct): + SIZE = 32 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + frame_status_mv_cnt_ext: int +struct__slice_edge_stats_ctx_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('frame_status_mv_cnt_ext', ctypes.c_uint32, 28)]) +slice_edge_stats_ctx_s: TypeAlias = struct__slice_edge_stats_ctx_s +@c.record +class struct__slice_vpc_edge_ctx_s(c.Struct): + SIZE = 4 + reserved: int +struct__slice_vpc_edge_ctx_s.register_fields([('reserved', ctypes.c_uint32, 0)]) +slice_vpc_edge_ctx_s: TypeAlias = struct__slice_vpc_edge_ctx_s +@c.record +class struct__slice_vpc_main_ctx_s(c.Struct): + SIZE = 4 + reserved: int +struct__slice_vpc_main_ctx_s.register_fields([('reserved', ctypes.c_uint32, 0)]) +slice_vpc_main_ctx_s: TypeAlias = struct__slice_vpc_main_ctx_s +@c.record +class struct__slice_edge_ctx_s(c.Struct): + SIZE = 60 + slice_ctb_pos_ctx: struct__slice_edge_ctb_pos_ctx_s + slice_stats_ctx: struct__slice_edge_stats_ctx_s + slice_tile_ctx: struct__slice_edge_tile_ctx_s + slice_vpc_edge_ctx: struct__slice_vpc_edge_ctx_s + slice_vpc_main_ctx: struct__slice_vpc_main_ctx_s +struct__slice_edge_ctx_s.register_fields([('slice_ctb_pos_ctx', slice_edge_ctb_pos_ctx_s, 0), ('slice_stats_ctx', slice_edge_stats_ctx_s, 8), ('slice_tile_ctx', slice_edge_tile_ctx_s, 40), ('slice_vpc_edge_ctx', slice_vpc_edge_ctx_s, 52), ('slice_vpc_main_ctx', slice_vpc_main_ctx_s, 56)]) +slice_edge_ctx_s: TypeAlias = struct__slice_edge_ctx_s +@c.record +class struct__nvdec_vp9_pic_v1_s(c.Struct): + SIZE = 8 + Vp9FltAboveOffset: int + external_ref_mem_dis: int + bit_depth: int + error_recovery_start_pos: int + error_external_mv_en: int + Reserved0: int +struct__nvdec_vp9_pic_v1_s.register_fields([('Vp9FltAboveOffset', ctypes.c_uint32, 0), ('external_ref_mem_dis', ctypes.c_uint32, 4, 1, 0), ('bit_depth', ctypes.c_uint32, 4, 4, 1), ('error_recovery_start_pos', ctypes.c_uint32, 4, 2, 5), ('error_external_mv_en', ctypes.c_uint32, 4, 1, 7), ('Reserved0', ctypes.c_uint32, 5, 24, 0)]) +nvdec_vp9_pic_v1_s: TypeAlias = struct__nvdec_vp9_pic_v1_s +enum_VP9_FRAME_SFC_ID: dict[int, str] = {(VP9_LAST_FRAME_SFC:=0): 'VP9_LAST_FRAME_SFC', (VP9_GOLDEN_FRAME_SFC:=1): 'VP9_GOLDEN_FRAME_SFC', (VP9_ALTREF_FRAME_SFC:=2): 'VP9_ALTREF_FRAME_SFC', (VP9_CURR_FRAME_SFC:=3): 'VP9_CURR_FRAME_SFC'} +@c.record +class struct__nvdec_vp9_pic_s(c.Struct): + SIZE = 256 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + stream_len: int + enable_encryption: int + key_increment: int + encryption_mode: int + sw_hdr_skip_length: int + key_slot_index: int + ssm_en: int + enable_histogram: int + reserved0: int + gptimer_timeout_value: int + tileformat: int + gob_height: int + reserverd_surface_format: int + reserved1: c.Array[ctypes.c_ubyte, Literal[3]] + Vp9BsdCtrlOffset: int + ref0_width: int + ref0_height: int + ref0_stride: c.Array[ctypes.c_uint16, Literal[2]] + ref1_width: int + ref1_height: int + ref1_stride: c.Array[ctypes.c_uint16, Literal[2]] + ref2_width: int + ref2_height: int + ref2_stride: c.Array[ctypes.c_uint16, Literal[2]] + width: int + height: int + framestride: c.Array[ctypes.c_uint16, Literal[2]] + keyFrame: int + prevIsKeyFrame: int + resolutionChange: int + errorResilient: int + prevShowFrame: int + intraOnly: int + reserved2: int + reserved3: c.Array[ctypes.c_ubyte, Literal[3]] + refFrameSignBias: c.Array[ctypes.c_ubyte, Literal[4]] + loopFilterLevel: bytes + loopFilterSharpness: bytes + qpYAc: int + qpYDc: bytes + qpChAc: bytes + qpChDc: bytes + lossless: bytes + transform_mode: bytes + allow_high_precision_mv: bytes + mcomp_filter_type: bytes + comp_pred_mode: bytes + comp_fixed_ref: bytes + comp_var_ref: c.Array[ctypes.c_char, Literal[2]] + log2_tile_columns: bytes + log2_tile_rows: bytes + segmentEnabled: int + segmentMapUpdate: int + segmentMapTemporalUpdate: int + segmentFeatureMode: int + segmentFeatureEnable: c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[8]] + segmentFeatureData: c.Array[c.Array[ctypes.c_int16, Literal[4]], Literal[8]] + modeRefLfEnabled: bytes + mbRefLfDelta: c.Array[ctypes.c_char, Literal[4]] + mbModeLfDelta: c.Array[ctypes.c_char, Literal[2]] + reserved5: bytes + v1: struct__nvdec_vp9_pic_v1_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vp9_pic_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('stream_len', ctypes.c_uint32, 48), ('enable_encryption', ctypes.c_uint32, 52), ('key_increment', ctypes.c_uint32, 56, 6, 0), ('encryption_mode', ctypes.c_uint32, 56, 4, 6), ('sw_hdr_skip_length', ctypes.c_uint32, 57, 14, 2), ('key_slot_index', ctypes.c_uint32, 59, 4, 0), ('ssm_en', ctypes.c_uint32, 59, 1, 4), ('enable_histogram', ctypes.c_uint32, 59, 1, 5), ('reserved0', ctypes.c_uint32, 59, 2, 6), ('gptimer_timeout_value', ctypes.c_uint32, 60), ('tileformat', ctypes.c_ubyte, 64, 2, 0), ('gob_height', ctypes.c_ubyte, 64, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 64, 3, 5), ('reserved1', c.Array[ctypes.c_ubyte, Literal[3]], 65), ('Vp9BsdCtrlOffset', ctypes.c_uint32, 68), ('ref0_width', ctypes.c_uint16, 72), ('ref0_height', ctypes.c_uint16, 74), ('ref0_stride', c.Array[ctypes.c_uint16, Literal[2]], 76), ('ref1_width', ctypes.c_uint16, 80), ('ref1_height', ctypes.c_uint16, 82), ('ref1_stride', c.Array[ctypes.c_uint16, Literal[2]], 84), ('ref2_width', ctypes.c_uint16, 88), ('ref2_height', ctypes.c_uint16, 90), ('ref2_stride', c.Array[ctypes.c_uint16, Literal[2]], 92), ('width', ctypes.c_uint16, 96), ('height', ctypes.c_uint16, 98), ('framestride', c.Array[ctypes.c_uint16, Literal[2]], 100), ('keyFrame', ctypes.c_ubyte, 104, 1, 0), ('prevIsKeyFrame', ctypes.c_ubyte, 104, 1, 1), ('resolutionChange', ctypes.c_ubyte, 104, 1, 2), ('errorResilient', ctypes.c_ubyte, 104, 1, 3), ('prevShowFrame', ctypes.c_ubyte, 104, 1, 4), ('intraOnly', ctypes.c_ubyte, 104, 1, 5), ('reserved2', ctypes.c_ubyte, 104, 2, 6), ('reserved3', c.Array[ctypes.c_ubyte, Literal[3]], 105), ('refFrameSignBias', c.Array[ctypes.c_ubyte, Literal[4]], 108), ('loopFilterLevel', ctypes.c_char, 112), ('loopFilterSharpness', ctypes.c_char, 113), ('qpYAc', ctypes.c_ubyte, 114), ('qpYDc', ctypes.c_char, 115), ('qpChAc', ctypes.c_char, 116), ('qpChDc', ctypes.c_char, 117), ('lossless', ctypes.c_char, 118), ('transform_mode', ctypes.c_char, 119), ('allow_high_precision_mv', ctypes.c_char, 120), ('mcomp_filter_type', ctypes.c_char, 121), ('comp_pred_mode', ctypes.c_char, 122), ('comp_fixed_ref', ctypes.c_char, 123), ('comp_var_ref', c.Array[ctypes.c_char, Literal[2]], 124), ('log2_tile_columns', ctypes.c_char, 126), ('log2_tile_rows', ctypes.c_char, 127), ('segmentEnabled', ctypes.c_ubyte, 128), ('segmentMapUpdate', ctypes.c_ubyte, 129), ('segmentMapTemporalUpdate', ctypes.c_ubyte, 130), ('segmentFeatureMode', ctypes.c_ubyte, 131), ('segmentFeatureEnable', c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[8]], 132), ('segmentFeatureData', c.Array[c.Array[ctypes.c_int16, Literal[4]], Literal[8]], 164), ('modeRefLfEnabled', ctypes.c_char, 228), ('mbRefLfDelta', c.Array[ctypes.c_char, Literal[4]], 229), ('mbModeLfDelta', c.Array[ctypes.c_char, Literal[2]], 233), ('reserved5', ctypes.c_char, 235), ('v1', nvdec_vp9_pic_v1_s, 236), ('ssm', nvdec_pass2_otf_ext_s, 244)]) +nvdec_vp9_pic_s: TypeAlias = struct__nvdec_vp9_pic_s +@c.record +class nvdec_nmv_context(c.Struct): + SIZE = 69 + joints: c.Array[ctypes.c_ubyte, Literal[3]] + sign: c.Array[ctypes.c_ubyte, Literal[2]] + class0: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]] + fp: c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]] + class0_hp: c.Array[ctypes.c_ubyte, Literal[2]] + hp: c.Array[ctypes.c_ubyte, Literal[2]] + classes: c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]] + class0_fp: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], Literal[2]] + bits: c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]] +nvdec_nmv_context.register_fields([('joints', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('sign', c.Array[ctypes.c_ubyte, Literal[2]], 3), ('class0', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]], 5), ('fp', c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], 7), ('class0_hp', c.Array[ctypes.c_ubyte, Literal[2]], 13), ('hp', c.Array[ctypes.c_ubyte, Literal[2]], 15), ('classes', c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]], 17), ('class0_fp', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], Literal[2]], 37), ('bits', c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]], 49)]) +@c.record +class nvdec_nmv_context_counts(c.Struct): + SIZE = 424 + joints: c.Array[ctypes.c_uint32, Literal[4]] + sign: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + classes: c.Array[c.Array[ctypes.c_uint32, Literal[11]], Literal[2]] + class0: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + bits: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[10]], Literal[2]] + class0_fp: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], Literal[2]] + fp: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]] + class0_hp: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + hp: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] +nvdec_nmv_context_counts.register_fields([('joints', c.Array[ctypes.c_uint32, Literal[4]], 0), ('sign', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 16), ('classes', c.Array[c.Array[ctypes.c_uint32, Literal[11]], Literal[2]], 32), ('class0', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 120), ('bits', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[10]], Literal[2]], 136), ('class0_fp', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], Literal[2]], 296), ('fp', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], 360), ('class0_hp', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 392), ('hp', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 408)]) +@c.record +class struct_nvdec_vp9AdaptiveEntropyProbs_s(c.Struct): + SIZE = 2720 + inter_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[7]] + intra_inter_prob: c.Array[ctypes.c_ubyte, Literal[4]] + uv_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]] + tx8x8_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]] + tx16x16_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[2]] + tx32x32_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]] + sb_ymode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[4]] + sb_ymode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[4]] + partition_prob: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[16]], Literal[2]] + uv_mode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]] + switchable_interp_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[4]] + comp_inter_prob: c.Array[ctypes.c_ubyte, Literal[5]] + mbskip_probs: c.Array[ctypes.c_ubyte, Literal[3]] + pad1: c.Array[ctypes.c_ubyte, Literal[1]] + nmvc: nvdec_nmv_context + single_ref_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[5]] + comp_ref_prob: c.Array[ctypes.c_ubyte, Literal[5]] + pad2: c.Array[ctypes.c_ubyte, Literal[17]] + probCoeffs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs8x8: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs16x16: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs32x32: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] +struct_nvdec_vp9AdaptiveEntropyProbs_s.register_fields([('inter_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[7]], 0), ('intra_inter_prob', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('uv_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], 32), ('tx8x8_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]], 112), ('tx16x16_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[2]], 114), ('tx32x32_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], 118), ('sb_ymode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[4]], 124), ('sb_ymode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[4]], 128), ('partition_prob', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[16]], Literal[2]], 160), ('uv_mode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], 288), ('switchable_interp_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[4]], 298), ('comp_inter_prob', c.Array[ctypes.c_ubyte, Literal[5]], 306), ('mbskip_probs', c.Array[ctypes.c_ubyte, Literal[3]], 311), ('pad1', c.Array[ctypes.c_ubyte, Literal[1]], 314), ('nmvc', nvdec_nmv_context, 315), ('single_ref_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[5]], 384), ('comp_ref_prob', c.Array[ctypes.c_ubyte, Literal[5]], 394), ('pad2', c.Array[ctypes.c_ubyte, Literal[17]], 399), ('probCoeffs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 416), ('probCoeffs8x8', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 992), ('probCoeffs16x16', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 1568), ('probCoeffs32x32', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 2144)]) +nvdec_vp9AdaptiveEntropyProbs_t: TypeAlias = struct_nvdec_vp9AdaptiveEntropyProbs_s +@c.record +class struct_nvdec_vp9EntropyProbs_s(c.Struct): + SIZE = 3744 + kf_bmode_prob: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], Literal[10]] + kf_bmode_probB: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], Literal[10]] + ref_pred_probs: c.Array[ctypes.c_ubyte, Literal[3]] + mb_segment_tree_probs: c.Array[ctypes.c_ubyte, Literal[7]] + segment_pred_probs: c.Array[ctypes.c_ubyte, Literal[3]] + ref_scores: c.Array[ctypes.c_ubyte, Literal[4]] + prob_comppred: c.Array[ctypes.c_ubyte, Literal[2]] + pad1: c.Array[ctypes.c_ubyte, Literal[9]] + kf_uv_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]] + kf_uv_mode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]] + pad2: c.Array[ctypes.c_ubyte, Literal[6]] + a: struct_nvdec_vp9AdaptiveEntropyProbs_s +struct_nvdec_vp9EntropyProbs_s.register_fields([('kf_bmode_prob', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], Literal[10]], 0), ('kf_bmode_probB', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], Literal[10]], 800), ('ref_pred_probs', c.Array[ctypes.c_ubyte, Literal[3]], 900), ('mb_segment_tree_probs', c.Array[ctypes.c_ubyte, Literal[7]], 903), ('segment_pred_probs', c.Array[ctypes.c_ubyte, Literal[3]], 910), ('ref_scores', c.Array[ctypes.c_ubyte, Literal[4]], 913), ('prob_comppred', c.Array[ctypes.c_ubyte, Literal[2]], 917), ('pad1', c.Array[ctypes.c_ubyte, Literal[9]], 919), ('kf_uv_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], 928), ('kf_uv_mode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], 1008), ('pad2', c.Array[ctypes.c_ubyte, Literal[6]], 1018), ('a', nvdec_vp9AdaptiveEntropyProbs_t, 1024)]) +nvdec_vp9EntropyProbs_t: TypeAlias = struct_nvdec_vp9EntropyProbs_s +@c.record +class struct_nvdec_vp9EntropyCounts_s(c.Struct): + SIZE = 13264 + inter_mode_counts: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], Literal[7]] + sb_ymode_counts: c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[4]] + uv_mode_counts: c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[10]] + partition_counts: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[16]] + switchable_interp_counts: c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[4]] + intra_inter_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[4]] + comp_inter_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]] + single_ref_count: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], Literal[5]] + comp_ref_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]] + tx32x32_count: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]] + tx16x16_count: c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[2]] + tx8x8_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + mbskip_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]] + nmvcount: nvdec_nmv_context_counts + countCoeffs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs8x8: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs16x16: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs32x32: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countEobs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[6]], Literal[6]], Literal[2]], Literal[2]], Literal[4]] +struct_nvdec_vp9EntropyCounts_s.register_fields([('inter_mode_counts', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], Literal[7]], 0), ('sb_ymode_counts', c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[4]], 168), ('uv_mode_counts', c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[10]], 328), ('partition_counts', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[16]], 728), ('switchable_interp_counts', c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[4]], 984), ('intra_inter_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[4]], 1032), ('comp_inter_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]], 1064), ('single_ref_count', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], Literal[5]], 1104), ('comp_ref_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]], 1184), ('tx32x32_count', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], 1224), ('tx16x16_count', c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[2]], 1256), ('tx8x8_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 1280), ('mbskip_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], 1296), ('nmvcount', nvdec_nmv_context_counts, 1320), ('countCoeffs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 1744), ('countCoeffs8x8', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 4048), ('countCoeffs16x16', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 6352), ('countCoeffs32x32', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 8656), ('countEobs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[6]], Literal[6]], Literal[2]], Literal[2]], Literal[4]], 10960)]) +nvdec_vp9EntropyCounts_t: TypeAlias = struct_nvdec_vp9EntropyCounts_s +@c.record +class struct__nvdec_pass2_otf_s(c.Struct): + SIZE = 52 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + enable_encryption: int + key_increment: int + encryption_mode: int + key_slot_index: int + ssm_en: int + reserved1: int +struct__nvdec_pass2_otf_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('enable_encryption', ctypes.c_uint32, 48, 1, 0), ('key_increment', ctypes.c_uint32, 48, 6, 1), ('encryption_mode', ctypes.c_uint32, 48, 4, 7), ('key_slot_index', ctypes.c_uint32, 49, 4, 3), ('ssm_en', ctypes.c_uint32, 49, 1, 7), ('reserved1', ctypes.c_uint32, 50, 16, 0)]) +nvdec_pass2_otf_s: TypeAlias = struct__nvdec_pass2_otf_s +@c.record +class struct__nvdec_display_param_s(c.Struct): + SIZE = 28 + enableTFOutput: int + VC1MapYFlag: int + MapYValue: int + VC1MapUVFlag: int + MapUVValue: int + OutStride: int + TilingFormat: int + OutputStructure: int + reserved0: int + OutputTop: c.Array[ctypes.c_int32, Literal[2]] + OutputBottom: c.Array[ctypes.c_int32, Literal[2]] + enableHistogram: int + HistogramStartX: int + HistogramStartY: int + reserved1: int + HistogramEndX: int + HistogramEndY: int + reserved2: int +struct__nvdec_display_param_s.register_fields([('enableTFOutput', ctypes.c_uint32, 0, 1, 0), ('VC1MapYFlag', ctypes.c_uint32, 0, 1, 1), ('MapYValue', ctypes.c_uint32, 0, 3, 2), ('VC1MapUVFlag', ctypes.c_uint32, 0, 1, 5), ('MapUVValue', ctypes.c_uint32, 0, 3, 6), ('OutStride', ctypes.c_uint32, 1, 8, 1), ('TilingFormat', ctypes.c_uint32, 2, 3, 1), ('OutputStructure', ctypes.c_uint32, 2, 1, 4), ('reserved0', ctypes.c_uint32, 2, 11, 5), ('OutputTop', c.Array[ctypes.c_int32, Literal[2]], 4), ('OutputBottom', c.Array[ctypes.c_int32, Literal[2]], 12), ('enableHistogram', ctypes.c_uint32, 20, 1, 0), ('HistogramStartX', ctypes.c_uint32, 20, 12, 1), ('HistogramStartY', ctypes.c_uint32, 21, 12, 5), ('reserved1', ctypes.c_uint32, 23, 7, 1), ('HistogramEndX', ctypes.c_uint32, 24, 12, 0), ('HistogramEndY', ctypes.c_uint32, 25, 12, 4), ('reserved2', ctypes.c_uint32, 27, 8, 0)]) +nvdec_display_param_s: TypeAlias = struct__nvdec_display_param_s +@c.record +class struct__nvdec_dpb_entry_s(c.Struct): + SIZE = 16 + index: int + col_idx: int + state: int + is_long_term: int + not_existing: int + is_field: int + top_field_marking: int + bottom_field_marking: int + output_memory_layout: int + reserved: int + FieldOrderCnt: c.Array[ctypes.c_uint32, Literal[2]] + FrameIdx: int +struct__nvdec_dpb_entry_s.register_fields([('index', ctypes.c_uint32, 0, 7, 0), ('col_idx', ctypes.c_uint32, 0, 5, 7), ('state', ctypes.c_uint32, 1, 2, 4), ('is_long_term', ctypes.c_uint32, 1, 1, 6), ('not_existing', ctypes.c_uint32, 1, 1, 7), ('is_field', ctypes.c_uint32, 2, 1, 0), ('top_field_marking', ctypes.c_uint32, 2, 4, 1), ('bottom_field_marking', ctypes.c_uint32, 2, 4, 5), ('output_memory_layout', ctypes.c_uint32, 3, 1, 1), ('reserved', ctypes.c_uint32, 3, 6, 2), ('FieldOrderCnt', c.Array[ctypes.c_uint32, Literal[2]], 4), ('FrameIdx', ctypes.c_int32, 12)]) +nvdec_dpb_entry_s: TypeAlias = struct__nvdec_dpb_entry_s +@c.record +class struct__nvdec_h264_pic_s(c.Struct): + SIZE = 764 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + hint_dump_en: int + reserved0: c.Array[ctypes.c_ubyte, Literal[2]] + stream_len: int + slice_count: int + mbhist_buffer_size: int + gptimer_timeout_value: int + log2_max_pic_order_cnt_lsb_minus4: int + delta_pic_order_always_zero_flag: int + frame_mbs_only_flag: int + PicWidthInMbs: int + FrameHeightInMbs: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + entropy_coding_mode_flag: int + pic_order_present_flag: int + num_ref_idx_l0_active_minus1: int + num_ref_idx_l1_active_minus1: int + deblocking_filter_control_present_flag: int + redundant_pic_cnt_present_flag: int + transform_8x8_mode_flag: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + MbaffFrameFlag: int + direct_8x8_inference_flag: int + weighted_pred_flag: int + constrained_intra_pred_flag: int + ref_pic_flag: int + field_pic_flag: int + bottom_field_flag: int + second_field: int + log2_max_frame_num_minus4: int + chroma_format_idc: int + pic_order_cnt_type: int + pic_init_qp_minus26: int + chroma_qp_index_offset: int + second_chroma_qp_index_offset: int + weighted_bipred_idc: int + CurrPicIdx: int + CurrColIdx: int + frame_num: int + frame_surfaces: int + output_memory_layout: int + CurrFieldOrderCnt: c.Array[ctypes.c_int32, Literal[2]] + dpb: c.Array[struct__nvdec_dpb_entry_s, Literal[16]] + WeightScale: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]] + WeightScale8x8: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]] + num_inter_view_refs_lX: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_char, Literal[14]] + inter_view_refidx_lX: c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]] + lossless_ipred8x8_filter_enable: int + qpprime_y_zero_transform_bypass_flag: int + reserved2: int + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_h264_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('hint_dump_en', ctypes.c_ubyte, 69), ('reserved0', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('mbhist_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_int32, 88), ('delta_pic_order_always_zero_flag', ctypes.c_int32, 92), ('frame_mbs_only_flag', ctypes.c_int32, 96), ('PicWidthInMbs', ctypes.c_int32, 100), ('FrameHeightInMbs', ctypes.c_int32, 104), ('tileFormat', ctypes.c_uint32, 108, 2, 0), ('gob_height', ctypes.c_uint32, 108, 3, 2), ('reserverd_surface_format', ctypes.c_uint32, 108, 27, 5), ('entropy_coding_mode_flag', ctypes.c_int32, 112), ('pic_order_present_flag', ctypes.c_int32, 116), ('num_ref_idx_l0_active_minus1', ctypes.c_int32, 120), ('num_ref_idx_l1_active_minus1', ctypes.c_int32, 124), ('deblocking_filter_control_present_flag', ctypes.c_int32, 128), ('redundant_pic_cnt_present_flag', ctypes.c_int32, 132), ('transform_8x8_mode_flag', ctypes.c_int32, 136), ('pitch_luma', ctypes.c_uint32, 140), ('pitch_chroma', ctypes.c_uint32, 144), ('luma_top_offset', ctypes.c_uint32, 148), ('luma_bot_offset', ctypes.c_uint32, 152), ('luma_frame_offset', ctypes.c_uint32, 156), ('chroma_top_offset', ctypes.c_uint32, 160), ('chroma_bot_offset', ctypes.c_uint32, 164), ('chroma_frame_offset', ctypes.c_uint32, 168), ('HistBufferSize', ctypes.c_uint32, 172), ('MbaffFrameFlag', ctypes.c_uint32, 176, 1, 0), ('direct_8x8_inference_flag', ctypes.c_uint32, 176, 1, 1), ('weighted_pred_flag', ctypes.c_uint32, 176, 1, 2), ('constrained_intra_pred_flag', ctypes.c_uint32, 176, 1, 3), ('ref_pic_flag', ctypes.c_uint32, 176, 1, 4), ('field_pic_flag', ctypes.c_uint32, 176, 1, 5), ('bottom_field_flag', ctypes.c_uint32, 176, 1, 6), ('second_field', ctypes.c_uint32, 176, 1, 7), ('log2_max_frame_num_minus4', ctypes.c_uint32, 177, 4, 0), ('chroma_format_idc', ctypes.c_uint32, 177, 2, 4), ('pic_order_cnt_type', ctypes.c_uint32, 177, 2, 6), ('pic_init_qp_minus26', ctypes.c_int32, 178, 6, 0), ('chroma_qp_index_offset', ctypes.c_int32, 178, 5, 6), ('second_chroma_qp_index_offset', ctypes.c_int32, 179, 5, 3), ('weighted_bipred_idc', ctypes.c_uint32, 180, 2, 0), ('CurrPicIdx', ctypes.c_uint32, 180, 7, 2), ('CurrColIdx', ctypes.c_uint32, 181, 5, 1), ('frame_num', ctypes.c_uint32, 181, 16, 6), ('frame_surfaces', ctypes.c_uint32, 183, 1, 6), ('output_memory_layout', ctypes.c_uint32, 183, 1, 7), ('CurrFieldOrderCnt', c.Array[ctypes.c_int32, Literal[2]], 184), ('dpb', c.Array[nvdec_dpb_entry_s, Literal[16]], 192), ('WeightScale', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]], 448), ('WeightScale8x8', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]], 544), ('num_inter_view_refs_lX', c.Array[ctypes.c_ubyte, Literal[2]], 672), ('reserved1', c.Array[ctypes.c_char, Literal[14]], 674), ('inter_view_refidx_lX', c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]], 688), ('lossless_ipred8x8_filter_enable', ctypes.c_uint32, 720, 1, 0), ('qpprime_y_zero_transform_bypass_flag', ctypes.c_uint32, 720, 1, 1), ('reserved2', ctypes.c_uint32, 720, 30, 2), ('displayPara', nvdec_display_param_s, 724), ('ssm', nvdec_pass2_otf_ext_s, 752)]) +nvdec_h264_pic_s: TypeAlias = struct__nvdec_h264_pic_s +enum__vc1_fcm_e: dict[int, str] = {(FCM_PROGRESSIVE:=0): 'FCM_PROGRESSIVE', (FCM_FRAME_INTERLACE:=2): 'FCM_FRAME_INTERLACE', (FCM_FIELD_INTERLACE:=3): 'FCM_FIELD_INTERLACE'} +vc1_fcm_e: TypeAlias = ctypes.c_uint32 +enum__syntax_vc1_ptype_e: dict[int, str] = {(PTYPE_I:=0): 'PTYPE_I', (PTYPE_P:=1): 'PTYPE_P', (PTYPE_B:=2): 'PTYPE_B', (PTYPE_BI:=3): 'PTYPE_BI', (PTYPE_SKIPPED:=4): 'PTYPE_SKIPPED'} +syntax_vc1_ptype_e: TypeAlias = ctypes.c_uint32 +enum_vc1_mvmode_e: dict[int, str] = {(MVMODE_MIXEDMV:=0): 'MVMODE_MIXEDMV', (MVMODE_1MV:=1): 'MVMODE_1MV', (MVMODE_1MV_HALFPEL:=2): 'MVMODE_1MV_HALFPEL', (MVMODE_1MV_HALFPEL_BILINEAR:=3): 'MVMODE_1MV_HALFPEL_BILINEAR', (MVMODE_INTENSITY_COMPENSATION:=4): 'MVMODE_INTENSITY_COMPENSATION'} +enum__vc1_fptype_e: dict[int, str] = {(FPTYPE_I_I:=0): 'FPTYPE_I_I', (FPTYPE_I_P:=1): 'FPTYPE_I_P', (FPTYPE_P_I:=2): 'FPTYPE_P_I', (FPTYPE_P_P:=3): 'FPTYPE_P_P', (FPTYPE_B_B:=4): 'FPTYPE_B_B', (FPTYPE_B_BI:=5): 'FPTYPE_B_BI', (FPTYPE_BI_B:=6): 'FPTYPE_BI_B', (FPTYPE_BI_BI:=7): 'FPTYPE_BI_BI'} +vc1_fptype_e: TypeAlias = ctypes.c_uint32 +enum__vc1_dqprofile_e: dict[int, str] = {(DQPROFILE_ALL_FOUR_EDGES:=0): 'DQPROFILE_ALL_FOUR_EDGES', (DQPROFILE_DOUBLE_EDGE:=1): 'DQPROFILE_DOUBLE_EDGE', (DQPROFILE_SINGLE_EDGE:=2): 'DQPROFILE_SINGLE_EDGE', (DQPROFILE_ALL_MACROBLOCKS:=3): 'DQPROFILE_ALL_MACROBLOCKS'} +vc1_dqprofile_e: TypeAlias = ctypes.c_uint32 +@c.record +class struct__nvdec_vc1_pic_s(c.Struct): + SIZE = 404 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + prefixStartCode: c.Array[ctypes.c_ubyte, Literal[4]] + bitstream_offset: int + explicitEOSPresentFlag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + scratch_pic_buffer_size: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + profile: int + postprocflag: int + pulldown: int + interlace: int + tfcntrflag: int + finterpflag: int + psf: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + multires: int + syncmarker: int + rangered: int + maxbframes: int + dquant: int + panscan_flag: int + refdist_flag: int + quantizer: int + extended_mv: int + extended_dmv: int + overlap: int + vstransform: int + refdist: bytes + reserved1: c.Array[ctypes.c_char, Literal[3]] + fcm: int + ptype: int + tfcntr: int + rptfrm: int + tff: int + rndctrl: int + pqindex: int + halfqp: int + pquantizer: int + postproc: int + condover: int + transacfrm: int + transacfrm2: int + transdctab: int + pqdiff: int + abspq: int + dquantfrm: int + dqprofile: int + dqsbedge: int + dqdbedge: int + dqbilevel: int + mvrange: int + mvmode: int + mvmode2: int + lumscale: int + lumshift: int + mvtab: int + cbptab: int + ttmbf: int + ttfrm: int + bfraction: int + fptype: int + numref: int + reffield: int + dmvrange: int + intcompfield: int + lumscale1: int + lumshift1: int + lumscale2: int + lumshift2: int + mbmodetab: int + imvtab: int + icbptab: int + fourmvbptab: int + fourmvswitch: int + intcomp: int + twomvbptab: int + rangeredfrm: int + HistBufferSize: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + CodedWidth: int + CodedHeight: int + loopfilter: int + fastuvmc: int + output_memory_layout: int + ref_memory_layout: c.Array[ctypes.c_ubyte, Literal[2]] + reserved3: c.Array[ctypes.c_ubyte, Literal[3]] + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vc1_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('prefixStartCode', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('bitstream_offset', ctypes.c_uint32, 72), ('explicitEOSPresentFlag', ctypes.c_ubyte, 76), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 77), ('stream_len', ctypes.c_uint32, 80), ('slice_count', ctypes.c_uint32, 84), ('scratch_pic_buffer_size', ctypes.c_uint32, 88), ('gptimer_timeout_value', ctypes.c_uint32, 92), ('FrameWidth', ctypes.c_uint16, 96), ('FrameHeight', ctypes.c_uint16, 98), ('profile', ctypes.c_ubyte, 100), ('postprocflag', ctypes.c_ubyte, 101), ('pulldown', ctypes.c_ubyte, 102), ('interlace', ctypes.c_ubyte, 103), ('tfcntrflag', ctypes.c_ubyte, 104), ('finterpflag', ctypes.c_ubyte, 105), ('psf', ctypes.c_ubyte, 106), ('tileFormat', ctypes.c_ubyte, 107, 2, 0), ('gob_height', ctypes.c_ubyte, 107, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 107, 3, 5), ('multires', ctypes.c_ubyte, 108), ('syncmarker', ctypes.c_ubyte, 109), ('rangered', ctypes.c_ubyte, 110), ('maxbframes', ctypes.c_ubyte, 111), ('dquant', ctypes.c_ubyte, 112), ('panscan_flag', ctypes.c_ubyte, 113), ('refdist_flag', ctypes.c_ubyte, 114), ('quantizer', ctypes.c_ubyte, 115), ('extended_mv', ctypes.c_ubyte, 116), ('extended_dmv', ctypes.c_ubyte, 117), ('overlap', ctypes.c_ubyte, 118), ('vstransform', ctypes.c_ubyte, 119), ('refdist', ctypes.c_char, 120), ('reserved1', c.Array[ctypes.c_char, Literal[3]], 121), ('fcm', vc1_fcm_e, 124), ('ptype', syntax_vc1_ptype_e, 128), ('tfcntr', ctypes.c_int32, 132), ('rptfrm', ctypes.c_int32, 136), ('tff', ctypes.c_int32, 140), ('rndctrl', ctypes.c_int32, 144), ('pqindex', ctypes.c_int32, 148), ('halfqp', ctypes.c_int32, 152), ('pquantizer', ctypes.c_int32, 156), ('postproc', ctypes.c_int32, 160), ('condover', ctypes.c_int32, 164), ('transacfrm', ctypes.c_int32, 168), ('transacfrm2', ctypes.c_int32, 172), ('transdctab', ctypes.c_int32, 176), ('pqdiff', ctypes.c_int32, 180), ('abspq', ctypes.c_int32, 184), ('dquantfrm', ctypes.c_int32, 188), ('dqprofile', vc1_dqprofile_e, 192), ('dqsbedge', ctypes.c_int32, 196), ('dqdbedge', ctypes.c_int32, 200), ('dqbilevel', ctypes.c_int32, 204), ('mvrange', ctypes.c_int32, 208), ('mvmode', ctypes.c_uint32, 212), ('mvmode2', ctypes.c_uint32, 216), ('lumscale', ctypes.c_int32, 220), ('lumshift', ctypes.c_int32, 224), ('mvtab', ctypes.c_int32, 228), ('cbptab', ctypes.c_int32, 232), ('ttmbf', ctypes.c_int32, 236), ('ttfrm', ctypes.c_int32, 240), ('bfraction', ctypes.c_int32, 244), ('fptype', vc1_fptype_e, 248), ('numref', ctypes.c_int32, 252), ('reffield', ctypes.c_int32, 256), ('dmvrange', ctypes.c_int32, 260), ('intcompfield', ctypes.c_int32, 264), ('lumscale1', ctypes.c_int32, 268), ('lumshift1', ctypes.c_int32, 272), ('lumscale2', ctypes.c_int32, 276), ('lumshift2', ctypes.c_int32, 280), ('mbmodetab', ctypes.c_int32, 284), ('imvtab', ctypes.c_int32, 288), ('icbptab', ctypes.c_int32, 292), ('fourmvbptab', ctypes.c_int32, 296), ('fourmvswitch', ctypes.c_int32, 300), ('intcomp', ctypes.c_int32, 304), ('twomvbptab', ctypes.c_int32, 308), ('rangeredfrm', ctypes.c_int32, 312), ('HistBufferSize', ctypes.c_uint32, 316), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 320), ('luma_top_offset', ctypes.c_uint32, 328), ('luma_bot_offset', ctypes.c_uint32, 332), ('luma_frame_offset', ctypes.c_uint32, 336), ('chroma_top_offset', ctypes.c_uint32, 340), ('chroma_bot_offset', ctypes.c_uint32, 344), ('chroma_frame_offset', ctypes.c_uint32, 348), ('CodedWidth', ctypes.c_uint16, 352), ('CodedHeight', ctypes.c_uint16, 354), ('loopfilter', ctypes.c_ubyte, 356), ('fastuvmc', ctypes.c_ubyte, 357), ('output_memory_layout', ctypes.c_ubyte, 358), ('ref_memory_layout', c.Array[ctypes.c_ubyte, Literal[2]], 359), ('reserved3', c.Array[ctypes.c_ubyte, Literal[3]], 361), ('displayPara', nvdec_display_param_s, 364), ('ssm', nvdec_pass2_otf_ext_s, 392)]) +nvdec_vc1_pic_s: TypeAlias = struct__nvdec_vc1_pic_s +@c.record +class struct__nvdec_mpeg2_pic_s(c.Struct): + SIZE = 344 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + picture_structure: int + picture_coding_type: int + intra_dc_precision: int + frame_pred_frame_dct: bytes + concealment_motion_vectors: bytes + intra_vlc_format: bytes + tileFormat: int + gob_height: int + reserverd_surface_format: int + reserved1: bytes + f_code: c.Array[ctypes.c_char, Literal[4]] + PicWidthInMbs: int + FrameHeightInMbs: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + output_memory_layout: int + alternate_scan: int + secondfield: int + rounding_type: int + MbInfoSizeInBytes: int + q_scale_type: int + top_field_first: int + full_pel_fwd_vector: int + full_pel_bwd_vector: int + quant_mat_8x8intra: c.Array[ctypes.c_ubyte, Literal[64]] + quant_mat_8x8nonintra: c.Array[ctypes.c_ubyte, Literal[64]] + ref_memory_layout: c.Array[ctypes.c_uint32, Literal[2]] + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_mpeg2_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 69), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('gptimer_timeout_value', ctypes.c_uint32, 80), ('FrameWidth', ctypes.c_int16, 84), ('FrameHeight', ctypes.c_int16, 86), ('picture_structure', ctypes.c_ubyte, 88), ('picture_coding_type', ctypes.c_ubyte, 89), ('intra_dc_precision', ctypes.c_ubyte, 90), ('frame_pred_frame_dct', ctypes.c_char, 91), ('concealment_motion_vectors', ctypes.c_char, 92), ('intra_vlc_format', ctypes.c_char, 93), ('tileFormat', ctypes.c_ubyte, 94, 2, 0), ('gob_height', ctypes.c_ubyte, 94, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 94, 3, 5), ('reserved1', ctypes.c_char, 95), ('f_code', c.Array[ctypes.c_char, Literal[4]], 96), ('PicWidthInMbs', ctypes.c_uint16, 100), ('FrameHeightInMbs', ctypes.c_uint16, 102), ('pitch_luma', ctypes.c_uint32, 104), ('pitch_chroma', ctypes.c_uint32, 108), ('luma_top_offset', ctypes.c_uint32, 112), ('luma_bot_offset', ctypes.c_uint32, 116), ('luma_frame_offset', ctypes.c_uint32, 120), ('chroma_top_offset', ctypes.c_uint32, 124), ('chroma_bot_offset', ctypes.c_uint32, 128), ('chroma_frame_offset', ctypes.c_uint32, 132), ('HistBufferSize', ctypes.c_uint32, 136), ('output_memory_layout', ctypes.c_uint16, 140), ('alternate_scan', ctypes.c_uint16, 142), ('secondfield', ctypes.c_uint16, 144), ('rounding_type', ctypes.c_uint16, 146), ('MbInfoSizeInBytes', ctypes.c_uint32, 148), ('q_scale_type', ctypes.c_uint32, 152), ('top_field_first', ctypes.c_uint32, 156), ('full_pel_fwd_vector', ctypes.c_uint32, 160), ('full_pel_bwd_vector', ctypes.c_uint32, 164), ('quant_mat_8x8intra', c.Array[ctypes.c_ubyte, Literal[64]], 168), ('quant_mat_8x8nonintra', c.Array[ctypes.c_ubyte, Literal[64]], 232), ('ref_memory_layout', c.Array[ctypes.c_uint32, Literal[2]], 296), ('displayPara', nvdec_display_param_s, 304), ('ssm', nvdec_pass2_otf_ext_s, 332)]) +nvdec_mpeg2_pic_s: TypeAlias = struct__nvdec_mpeg2_pic_s +@c.record +class struct__nvdec_mpeg4_pic_s(c.Struct): + SIZE = 368 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + reserved2: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + scratch_pic_buffer_size: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + vop_time_increment_bitcount: bytes + resync_marker_disable: bytes + tileFormat: int + gob_height: int + reserverd_surface_format: int + reserved3: bytes + width: int + height: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + trd: c.Array[ctypes.c_int32, Literal[2]] + trb: c.Array[ctypes.c_int32, Literal[2]] + divx_flags: int + vop_fcode_forward: int + vop_fcode_backward: int + interlaced: int + quant_type: int + quarter_sample: int + short_video_header: int + curr_output_memory_layout: int + ptype: int + rnd: int + alternate_vertical_scan_flag: int + top_field_flag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + intra_quant_mat: c.Array[ctypes.c_ubyte, Literal[64]] + nonintra_quant_mat: c.Array[ctypes.c_ubyte, Literal[64]] + ref_memory_layout: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_ubyte, Literal[34]] + displayPara: struct__nvdec_display_param_s +struct__nvdec_mpeg4_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('reserved2', c.Array[ctypes.c_ubyte, Literal[3]], 69), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('scratch_pic_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('FrameWidth', ctypes.c_int16, 88), ('FrameHeight', ctypes.c_int16, 90), ('vop_time_increment_bitcount', ctypes.c_char, 92), ('resync_marker_disable', ctypes.c_char, 93), ('tileFormat', ctypes.c_ubyte, 94, 2, 0), ('gob_height', ctypes.c_ubyte, 94, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 94, 3, 5), ('reserved3', ctypes.c_char, 95), ('width', ctypes.c_int32, 96), ('height', ctypes.c_int32, 100), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 104), ('luma_top_offset', ctypes.c_uint32, 112), ('luma_bot_offset', ctypes.c_uint32, 116), ('luma_frame_offset', ctypes.c_uint32, 120), ('chroma_top_offset', ctypes.c_uint32, 124), ('chroma_bot_offset', ctypes.c_uint32, 128), ('chroma_frame_offset', ctypes.c_uint32, 132), ('HistBufferSize', ctypes.c_uint32, 136), ('trd', c.Array[ctypes.c_int32, Literal[2]], 140), ('trb', c.Array[ctypes.c_int32, Literal[2]], 148), ('divx_flags', ctypes.c_int32, 156), ('vop_fcode_forward', ctypes.c_int16, 160), ('vop_fcode_backward', ctypes.c_int16, 162), ('interlaced', ctypes.c_ubyte, 164), ('quant_type', ctypes.c_ubyte, 165), ('quarter_sample', ctypes.c_ubyte, 166), ('short_video_header', ctypes.c_ubyte, 167), ('curr_output_memory_layout', ctypes.c_ubyte, 168), ('ptype', ctypes.c_ubyte, 169), ('rnd', ctypes.c_ubyte, 170), ('alternate_vertical_scan_flag', ctypes.c_ubyte, 171), ('top_field_flag', ctypes.c_ubyte, 172), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 173), ('intra_quant_mat', c.Array[ctypes.c_ubyte, Literal[64]], 176), ('nonintra_quant_mat', c.Array[ctypes.c_ubyte, Literal[64]], 240), ('ref_memory_layout', c.Array[ctypes.c_ubyte, Literal[2]], 304), ('reserved1', c.Array[ctypes.c_ubyte, Literal[34]], 306), ('displayPara', nvdec_display_param_s, 340)]) +nvdec_mpeg4_pic_s: TypeAlias = struct__nvdec_mpeg4_pic_s +enum_VP8_FRAME_TYPE: dict[int, str] = {(VP8_KEYFRAME:=0): 'VP8_KEYFRAME', (VP8_INTERFRAME:=1): 'VP8_INTERFRAME'} +enum_VP8_FRAME_SFC_ID: dict[int, str] = {(VP8_GOLDEN_FRAME_SFC:=0): 'VP8_GOLDEN_FRAME_SFC', (VP8_ALTREF_FRAME_SFC:=1): 'VP8_ALTREF_FRAME_SFC', (VP8_LAST_FRAME_SFC:=2): 'VP8_LAST_FRAME_SFC', (VP8_CURR_FRAME_SFC:=3): 'VP8_CURR_FRAME_SFC'} +@c.record +class struct__nvdec_vp8_pic_s(c.Struct): + SIZE = 192 + encryption_params: struct__nvdec_pass2_otf_s + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + keyFrame: int + version: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + errorConcealOn: int + firstPartSize: int + HistBufferSize: int + VLDBufferSize: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + displayPara: struct__nvdec_display_param_s + current_output_memory_layout: bytes + output_memory_layout: c.Array[ctypes.c_char, Literal[3]] + segmentation_feature_data_update: int + reserved1: c.Array[ctypes.c_ubyte, Literal[3]] + resultValue: int + partition_offset: c.Array[ctypes.c_uint32, Literal[8]] + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vp8_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('gptimer_timeout_value', ctypes.c_uint32, 52), ('FrameWidth', ctypes.c_uint16, 56), ('FrameHeight', ctypes.c_uint16, 58), ('keyFrame', ctypes.c_ubyte, 60), ('version', ctypes.c_ubyte, 61), ('tileFormat', ctypes.c_ubyte, 62, 2, 0), ('gob_height', ctypes.c_ubyte, 62, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 62, 3, 5), ('errorConcealOn', ctypes.c_ubyte, 63), ('firstPartSize', ctypes.c_uint32, 64), ('HistBufferSize', ctypes.c_uint32, 68), ('VLDBufferSize', ctypes.c_uint32, 72), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 76), ('luma_top_offset', ctypes.c_uint32, 84), ('luma_bot_offset', ctypes.c_uint32, 88), ('luma_frame_offset', ctypes.c_uint32, 92), ('chroma_top_offset', ctypes.c_uint32, 96), ('chroma_bot_offset', ctypes.c_uint32, 100), ('chroma_frame_offset', ctypes.c_uint32, 104), ('displayPara', nvdec_display_param_s, 108), ('current_output_memory_layout', ctypes.c_char, 136), ('output_memory_layout', c.Array[ctypes.c_char, Literal[3]], 137), ('segmentation_feature_data_update', ctypes.c_ubyte, 140), ('reserved1', c.Array[ctypes.c_ubyte, Literal[3]], 141), ('resultValue', ctypes.c_uint32, 144), ('partition_offset', c.Array[ctypes.c_uint32, Literal[8]], 148), ('ssm', nvdec_pass2_otf_ext_s, 180)]) +nvdec_vp8_pic_s: TypeAlias = struct__nvdec_vp8_pic_s +@c.record +class struct__bytes_of_data_s(c.Struct): + SIZE = 8 + clear_bytes: int + encypted_bytes: int +struct__bytes_of_data_s.register_fields([('clear_bytes', ctypes.c_uint32, 0), ('encypted_bytes', ctypes.c_uint32, 4)]) +bytes_of_data_s: TypeAlias = struct__bytes_of_data_s +@c.record +class struct__nvdec_pass1_input_data_s(c.Struct): + SIZE = 836 + sample_size: c.Array[struct__bytes_of_data_s, Literal[32]] + initialization_vector: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[32]] + IvValid: c.Array[ctypes.c_ubyte, Literal[32]] + stream_len: int + clearBufferSize: int + reencryptBufferSize: int + vp8coeffPartitonBufferSize: int + PrevWidth: int + num_nals: int + drm_mode: int + key_sel: int + codec: int + TotalSizeOfClearData: int + SliceHdrOffset: int + EncryptBlkCnt: int + SkipBlkCnt: int +struct__nvdec_pass1_input_data_s.register_fields([('sample_size', c.Array[bytes_of_data_s, Literal[32]], 0), ('initialization_vector', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[32]], 256), ('IvValid', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('stream_len', ctypes.c_uint32, 800), ('clearBufferSize', ctypes.c_uint32, 804), ('reencryptBufferSize', ctypes.c_uint32, 808), ('vp8coeffPartitonBufferSize', ctypes.c_uint32, 812), ('PrevWidth', ctypes.c_uint32, 816), ('num_nals', ctypes.c_uint32, 820, 16, 0), ('drm_mode', ctypes.c_uint32, 822, 8, 0), ('key_sel', ctypes.c_uint32, 823, 4, 0), ('codec', ctypes.c_uint32, 823, 4, 4), ('TotalSizeOfClearData', ctypes.c_uint32, 824), ('SliceHdrOffset', ctypes.c_uint32, 828), ('EncryptBlkCnt', ctypes.c_uint32, 832, 16, 0), ('SkipBlkCnt', ctypes.c_uint32, 834, 16, 0)]) +nvdec_pass1_input_data_s: TypeAlias = struct__nvdec_pass1_input_data_s +@c.record +class struct__nvdec_pass1_output_data_s(c.Struct): + SIZE = 128 + clear_header_size: int + reencrypt_data_size: int + clear_token_data_size: int + key_increment: int + encryption_mode: int + bReEncrypted: int + bvp9SuperFrame: int + vp9NumFramesMinus1: int + reserved1: int + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + partition_size: c.Array[ctypes.c_uint32, Literal[8]] + vp9_frame_sizes: c.Array[ctypes.c_uint32, Literal[8]] + vp9_clear_hdr_size: c.Array[ctypes.c_uint32, Literal[8]] +struct__nvdec_pass1_output_data_s.register_fields([('clear_header_size', ctypes.c_uint32, 0), ('reencrypt_data_size', ctypes.c_uint32, 4), ('clear_token_data_size', ctypes.c_uint32, 8), ('key_increment', ctypes.c_uint32, 12, 6, 0), ('encryption_mode', ctypes.c_uint32, 12, 4, 6), ('bReEncrypted', ctypes.c_uint32, 13, 1, 2), ('bvp9SuperFrame', ctypes.c_uint32, 13, 1, 3), ('vp9NumFramesMinus1', ctypes.c_uint32, 13, 3, 4), ('reserved1', ctypes.c_uint32, 13, 17, 7), ('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 32), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 48), ('partition_size', c.Array[ctypes.c_uint32, Literal[8]], 64), ('vp9_frame_sizes', c.Array[ctypes.c_uint32, Literal[8]], 64), ('vp9_clear_hdr_size', c.Array[ctypes.c_uint32, Literal[8]], 96)]) +nvdec_pass1_output_data_s: TypeAlias = struct__nvdec_pass1_output_data_s +@c.record +class struct__scale_factors_reference_s(c.Struct): + SIZE = 4 + x_scale_fp: int + y_scale_fp: int +struct__scale_factors_reference_s.register_fields([('x_scale_fp', ctypes.c_int16, 0), ('y_scale_fp', ctypes.c_int16, 2)]) +scale_factors_reference_s: TypeAlias = struct__scale_factors_reference_s +@c.record +class struct__frame_info_t(c.Struct): + SIZE = 12 + width: int + height: int + stride: c.Array[ctypes.c_uint16, Literal[2]] + frame_buffer_idx: int +struct__frame_info_t.register_fields([('width', ctypes.c_uint16, 0), ('height', ctypes.c_uint16, 2), ('stride', c.Array[ctypes.c_uint16, Literal[2]], 4), ('frame_buffer_idx', ctypes.c_uint32, 8)]) +frame_info_t: TypeAlias = struct__frame_info_t +@c.record +class struct__ref_frame_struct_s(c.Struct): + SIZE = 24 + info: struct__frame_info_t + sf: struct__scale_factors_reference_s + sign_bias: int + wmtype: int + reserved_rf: int + frame_off: int + roffset: int +struct__ref_frame_struct_s.register_fields([('info', frame_info_t, 0), ('sf', scale_factors_reference_s, 12), ('sign_bias', ctypes.c_ubyte, 16, 1, 0), ('wmtype', ctypes.c_ubyte, 16, 2, 1), ('reserved_rf', ctypes.c_ubyte, 16, 5, 3), ('frame_off', ctypes.c_int16, 18), ('roffset', ctypes.c_int16, 20)]) +ref_frame_struct_s: TypeAlias = struct__ref_frame_struct_s +@c.record +class struct__av1_fgs_cfg_t(c.Struct): + SIZE = 12 + apply_grain: int + overlap_flag: int + clip_to_restricted_range: int + chroma_scaling_from_luma: int + num_y_points_b: int + num_cb_points_b: int + num_cr_points_b: int + scaling_shift: int + reserved_fgs: int + sw_random_seed: int + cb_offset: int + cr_offset: int + cb_mult: bytes + cb_luma_mult: bytes + cr_mult: bytes + cr_luma_mult: bytes +struct__av1_fgs_cfg_t.register_fields([('apply_grain', ctypes.c_uint16, 0, 1, 0), ('overlap_flag', ctypes.c_uint16, 0, 1, 1), ('clip_to_restricted_range', ctypes.c_uint16, 0, 1, 2), ('chroma_scaling_from_luma', ctypes.c_uint16, 0, 1, 3), ('num_y_points_b', ctypes.c_uint16, 0, 1, 4), ('num_cb_points_b', ctypes.c_uint16, 0, 1, 5), ('num_cr_points_b', ctypes.c_uint16, 0, 1, 6), ('scaling_shift', ctypes.c_uint16, 0, 4, 7), ('reserved_fgs', ctypes.c_uint16, 1, 5, 3), ('sw_random_seed', ctypes.c_uint16, 2), ('cb_offset', ctypes.c_int16, 4), ('cr_offset', ctypes.c_int16, 6), ('cb_mult', ctypes.c_char, 8), ('cb_luma_mult', ctypes.c_char, 9), ('cr_mult', ctypes.c_char, 10), ('cr_luma_mult', ctypes.c_char, 11)]) +av1_fgs_cfg_t: TypeAlias = struct__av1_fgs_cfg_t +@c.record +class struct__nvdec_av1_pic_s(c.Struct): + SIZE = 572 + encryption_params: struct__nvdec_pass2_otf_s + ssm: struct__nvdec_pass2_otf_ext_s + fgs_cfg: struct__av1_fgs_cfg_t + gptimer_timeout_value: int + stream_len: int + reserved12: int + use_128x128_superblock: int + chroma_format: int + bit_depth: int + enable_filter_intra: int + enable_intra_edge_filter: int + enable_interintra_compound: int + enable_masked_compound: int + enable_dual_filter: int + reserved10: int + reserved0: int + enable_jnt_comp: int + reserved1: int + enable_cdef: int + reserved11: int + enable_fgs: int + enable_substream_decoding: int + reserved2: int + frame_type: int + show_frame: int + reserved13: int + disable_cdf_update: int + allow_screen_content_tools: int + cur_frame_force_integer_mv: int + scale_denom_minus9: int + allow_intrabc: int + allow_high_precision_mv: int + interp_filter: int + switchable_motion_mode: int + use_ref_frame_mvs: int + refresh_frame_context: int + delta_q_present_flag: int + delta_q_res: int + delta_lf_present_flag: int + delta_lf_res: int + delta_lf_multi: int + reserved3: int + coded_lossless: int + tile_enabled: int + reserved4: int + superres_is_scaled: int + reserved_fh: int + tile_cols: int + tile_rows: int + context_update_tile_id: int + cdef_damping_minus_3: int + cdef_bits: int + frame_tx_mode: int + frame_reference_mode: int + skip_mode_flag: int + skip_ref0: int + skip_ref1: int + allow_warp: int + reduced_tx_set_used: int + ref_scaling_enable: int + reserved5: int + reserved6: int + superres_upscaled_width: int + superres_luma_step: int + superres_chroma_step: int + superres_init_luma_subpel_x: int + superres_init_chroma_subpel_x: int + base_qindex: int + y_dc_delta_q: bytes + u_dc_delta_q: bytes + v_dc_delta_q: bytes + u_ac_delta_q: bytes + v_ac_delta_q: bytes + qm_y: int + qm_u: int + qm_v: int + cdef_y_pri_strength: int + cdef_uv_pri_strength: int + cdef_y_sec_strength: int + cdef_uv_sec_strength: int + segment_enabled: int + segment_update_map: int + reserved7: int + segment_temporal_update: int + segment_feature_data: c.Array[c.Array[ctypes.c_int16, Literal[8]], Literal[8]] + last_active_segid: int + segid_preskip: int + prevsegid_flag: int + segment_quant_sign: int + filter_level: c.Array[ctypes.c_ubyte, Literal[2]] + filter_level_u: int + filter_level_v: int + lf_sharpness_level: int + lf_ref_deltas: c.Array[ctypes.c_char, Literal[8]] + lf_mode_deltas: c.Array[ctypes.c_char, Literal[2]] + lr_type: int + lr_unit_size: int + current_frame: struct__frame_info_t + ref_frame: c.Array[struct__ref_frame_struct_s, Literal[7]] + use_temporal0_mvs: int + use_temporal1_mvs: int + use_temporal2_mvs: int + mf1_type: int + mf2_type: int + mf3_type: int + reserved_mfmv: int + mfmv_offset: c.Array[c.Array[ctypes.c_int16, Literal[7]], Literal[3]] + mfmv_side: c.Array[c.Array[ctypes.c_char, Literal[7]], Literal[3]] + tileformat: int + gob_height: int + errorConcealOn: int + reserver8: int + stream_error_detection: int + mv_error_detection: int + coeff_error_detection: int + reserved_eh: int + Av1FltTopOffset: int + Av1FltVertOffset: int + Av1CdefVertOffset: int + Av1LrVertOffset: int + Av1HusVertOffset: int + Av1FgsVertOffset: int + enable_histogram: int + sw_skip_start_length: int + reserved_stat: int +struct__nvdec_av1_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('ssm', nvdec_pass2_otf_ext_s, 52), ('fgs_cfg', av1_fgs_cfg_t, 64), ('gptimer_timeout_value', ctypes.c_uint32, 76), ('stream_len', ctypes.c_uint32, 80), ('reserved12', ctypes.c_uint32, 84), ('use_128x128_superblock', ctypes.c_uint32, 88, 1, 0), ('chroma_format', ctypes.c_uint32, 88, 2, 1), ('bit_depth', ctypes.c_uint32, 88, 4, 3), ('enable_filter_intra', ctypes.c_uint32, 88, 1, 7), ('enable_intra_edge_filter', ctypes.c_uint32, 89, 1, 0), ('enable_interintra_compound', ctypes.c_uint32, 89, 1, 1), ('enable_masked_compound', ctypes.c_uint32, 89, 1, 2), ('enable_dual_filter', ctypes.c_uint32, 89, 1, 3), ('reserved10', ctypes.c_uint32, 89, 1, 4), ('reserved0', ctypes.c_uint32, 89, 3, 5), ('enable_jnt_comp', ctypes.c_uint32, 90, 1, 0), ('reserved1', ctypes.c_uint32, 90, 1, 1), ('enable_cdef', ctypes.c_uint32, 90, 1, 2), ('reserved11', ctypes.c_uint32, 90, 1, 3), ('enable_fgs', ctypes.c_uint32, 90, 1, 4), ('enable_substream_decoding', ctypes.c_uint32, 90, 1, 5), ('reserved2', ctypes.c_uint32, 90, 10, 6), ('frame_type', ctypes.c_uint32, 92, 2, 0), ('show_frame', ctypes.c_uint32, 92, 1, 2), ('reserved13', ctypes.c_uint32, 92, 1, 3), ('disable_cdf_update', ctypes.c_uint32, 92, 1, 4), ('allow_screen_content_tools', ctypes.c_uint32, 92, 1, 5), ('cur_frame_force_integer_mv', ctypes.c_uint32, 92, 1, 6), ('scale_denom_minus9', ctypes.c_uint32, 92, 3, 7), ('allow_intrabc', ctypes.c_uint32, 93, 1, 2), ('allow_high_precision_mv', ctypes.c_uint32, 93, 1, 3), ('interp_filter', ctypes.c_uint32, 93, 3, 4), ('switchable_motion_mode', ctypes.c_uint32, 93, 1, 7), ('use_ref_frame_mvs', ctypes.c_uint32, 94, 1, 0), ('refresh_frame_context', ctypes.c_uint32, 94, 1, 1), ('delta_q_present_flag', ctypes.c_uint32, 94, 1, 2), ('delta_q_res', ctypes.c_uint32, 94, 2, 3), ('delta_lf_present_flag', ctypes.c_uint32, 94, 1, 5), ('delta_lf_res', ctypes.c_uint32, 94, 2, 6), ('delta_lf_multi', ctypes.c_uint32, 95, 1, 0), ('reserved3', ctypes.c_uint32, 95, 1, 1), ('coded_lossless', ctypes.c_uint32, 95, 1, 2), ('tile_enabled', ctypes.c_uint32, 95, 1, 3), ('reserved4', ctypes.c_uint32, 95, 2, 4), ('superres_is_scaled', ctypes.c_uint32, 95, 1, 6), ('reserved_fh', ctypes.c_uint32, 95, 1, 7), ('tile_cols', ctypes.c_uint32, 96, 8, 0), ('tile_rows', ctypes.c_uint32, 97, 8, 0), ('context_update_tile_id', ctypes.c_uint32, 98, 16, 0), ('cdef_damping_minus_3', ctypes.c_uint32, 100, 2, 0), ('cdef_bits', ctypes.c_uint32, 100, 2, 2), ('frame_tx_mode', ctypes.c_uint32, 100, 3, 4), ('frame_reference_mode', ctypes.c_uint32, 100, 2, 7), ('skip_mode_flag', ctypes.c_uint32, 101, 1, 1), ('skip_ref0', ctypes.c_uint32, 101, 4, 2), ('skip_ref1', ctypes.c_uint32, 101, 4, 6), ('allow_warp', ctypes.c_uint32, 102, 1, 2), ('reduced_tx_set_used', ctypes.c_uint32, 102, 1, 3), ('ref_scaling_enable', ctypes.c_uint32, 102, 1, 4), ('reserved5', ctypes.c_uint32, 102, 1, 5), ('reserved6', ctypes.c_uint32, 102, 10, 6), ('superres_upscaled_width', ctypes.c_uint16, 104), ('superres_luma_step', ctypes.c_uint16, 106), ('superres_chroma_step', ctypes.c_uint16, 108), ('superres_init_luma_subpel_x', ctypes.c_uint16, 110), ('superres_init_chroma_subpel_x', ctypes.c_uint16, 112), ('base_qindex', ctypes.c_ubyte, 114), ('y_dc_delta_q', ctypes.c_char, 115), ('u_dc_delta_q', ctypes.c_char, 116), ('v_dc_delta_q', ctypes.c_char, 117), ('u_ac_delta_q', ctypes.c_char, 118), ('v_ac_delta_q', ctypes.c_char, 119), ('qm_y', ctypes.c_ubyte, 120), ('qm_u', ctypes.c_ubyte, 121), ('qm_v', ctypes.c_ubyte, 122), ('cdef_y_pri_strength', ctypes.c_uint32, 124), ('cdef_uv_pri_strength', ctypes.c_uint32, 128), ('cdef_y_sec_strength', ctypes.c_uint32, 132, 16, 0), ('cdef_uv_sec_strength', ctypes.c_uint32, 134, 16, 0), ('segment_enabled', ctypes.c_ubyte, 136), ('segment_update_map', ctypes.c_ubyte, 137), ('reserved7', ctypes.c_ubyte, 138), ('segment_temporal_update', ctypes.c_ubyte, 139), ('segment_feature_data', c.Array[c.Array[ctypes.c_int16, Literal[8]], Literal[8]], 140), ('last_active_segid', ctypes.c_ubyte, 268), ('segid_preskip', ctypes.c_ubyte, 269), ('prevsegid_flag', ctypes.c_ubyte, 270), ('segment_quant_sign', ctypes.c_ubyte, 271, 8, 0), ('filter_level', c.Array[ctypes.c_ubyte, Literal[2]], 272), ('filter_level_u', ctypes.c_ubyte, 274), ('filter_level_v', ctypes.c_ubyte, 275), ('lf_sharpness_level', ctypes.c_ubyte, 276), ('lf_ref_deltas', c.Array[ctypes.c_char, Literal[8]], 277), ('lf_mode_deltas', c.Array[ctypes.c_char, Literal[2]], 285), ('lr_type', ctypes.c_ubyte, 287), ('lr_unit_size', ctypes.c_ubyte, 288), ('current_frame', frame_info_t, 292), ('ref_frame', c.Array[ref_frame_struct_s, Literal[7]], 304), ('use_temporal0_mvs', ctypes.c_uint32, 472, 1, 0), ('use_temporal1_mvs', ctypes.c_uint32, 472, 1, 1), ('use_temporal2_mvs', ctypes.c_uint32, 472, 1, 2), ('mf1_type', ctypes.c_uint32, 472, 3, 3), ('mf2_type', ctypes.c_uint32, 472, 3, 6), ('mf3_type', ctypes.c_uint32, 473, 3, 1), ('reserved_mfmv', ctypes.c_uint32, 473, 20, 4), ('mfmv_offset', c.Array[c.Array[ctypes.c_int16, Literal[7]], Literal[3]], 476), ('mfmv_side', c.Array[c.Array[ctypes.c_char, Literal[7]], Literal[3]], 518), ('tileformat', ctypes.c_ubyte, 539, 2, 0), ('gob_height', ctypes.c_ubyte, 539, 3, 2), ('errorConcealOn', ctypes.c_ubyte, 539, 1, 5), ('reserver8', ctypes.c_ubyte, 539, 2, 6), ('stream_error_detection', ctypes.c_ubyte, 540, 1, 0), ('mv_error_detection', ctypes.c_ubyte, 540, 1, 1), ('coeff_error_detection', ctypes.c_ubyte, 540, 1, 2), ('reserved_eh', ctypes.c_ubyte, 540, 5, 3), ('Av1FltTopOffset', ctypes.c_uint32, 544), ('Av1FltVertOffset', ctypes.c_uint32, 548), ('Av1CdefVertOffset', ctypes.c_uint32, 552), ('Av1LrVertOffset', ctypes.c_uint32, 556), ('Av1HusVertOffset', ctypes.c_uint32, 560), ('Av1FgsVertOffset', ctypes.c_uint32, 564), ('enable_histogram', ctypes.c_uint32, 568, 1, 0), ('sw_skip_start_length', ctypes.c_uint32, 568, 14, 1), ('reserved_stat', ctypes.c_uint32, 569, 17, 7)]) +nvdec_av1_pic_s: TypeAlias = struct__nvdec_av1_pic_s +@c.record +class struct__AV1FilmGrainMemory(c.Struct): + SIZE = 13056 + scaling_lut_y: c.Array[ctypes.c_ubyte, Literal[256]] + scaling_lut_cb: c.Array[ctypes.c_ubyte, Literal[256]] + scaling_lut_cr: c.Array[ctypes.c_ubyte, Literal[256]] + cropped_luma_grain_block: c.Array[ctypes.c_int16, Literal[4096]] + cropped_cb_grain_block: c.Array[ctypes.c_int16, Literal[1024]] + cropped_cr_grain_block: c.Array[ctypes.c_int16, Literal[1024]] +struct__AV1FilmGrainMemory.register_fields([('scaling_lut_y', c.Array[ctypes.c_ubyte, Literal[256]], 0), ('scaling_lut_cb', c.Array[ctypes.c_ubyte, Literal[256]], 256), ('scaling_lut_cr', c.Array[ctypes.c_ubyte, Literal[256]], 512), ('cropped_luma_grain_block', c.Array[ctypes.c_int16, Literal[4096]], 768), ('cropped_cb_grain_block', c.Array[ctypes.c_int16, Literal[1024]], 8960), ('cropped_cr_grain_block', c.Array[ctypes.c_int16, Literal[1024]], 11008)]) +AV1FilmGrainMemory: TypeAlias = struct__AV1FilmGrainMemory +@c.record +class struct__AV1TileInfo_OLD(c.Struct): + SIZE = 16 + width_in_sb: int + height_in_sb: int + tile_start_b0: int + tile_start_b1: int + tile_start_b2: int + tile_start_b3: int + tile_end_b0: int + tile_end_b1: int + tile_end_b2: int + tile_end_b3: int + padding: c.Array[ctypes.c_ubyte, Literal[6]] +struct__AV1TileInfo_OLD.register_fields([('width_in_sb', ctypes.c_ubyte, 0), ('height_in_sb', ctypes.c_ubyte, 1), ('tile_start_b0', ctypes.c_ubyte, 2), ('tile_start_b1', ctypes.c_ubyte, 3), ('tile_start_b2', ctypes.c_ubyte, 4), ('tile_start_b3', ctypes.c_ubyte, 5), ('tile_end_b0', ctypes.c_ubyte, 6), ('tile_end_b1', ctypes.c_ubyte, 7), ('tile_end_b2', ctypes.c_ubyte, 8), ('tile_end_b3', ctypes.c_ubyte, 9), ('padding', c.Array[ctypes.c_ubyte, Literal[6]], 10)]) +AV1TileInfo_OLD: TypeAlias = struct__AV1TileInfo_OLD +@c.record +class struct__AV1TileInfo(c.Struct): + SIZE = 4 + width_in_sb: int + padding_w: int + height_in_sb: int + padding_h: int +struct__AV1TileInfo.register_fields([('width_in_sb', ctypes.c_ubyte, 0), ('padding_w', ctypes.c_ubyte, 1), ('height_in_sb', ctypes.c_ubyte, 2), ('padding_h', ctypes.c_ubyte, 3)]) +AV1TileInfo: TypeAlias = struct__AV1TileInfo +@c.record +class struct__AV1TileStreamInfo(c.Struct): + SIZE = 16 + tile_start: int + tile_end: int + padding: c.Array[ctypes.c_ubyte, Literal[8]] +struct__AV1TileStreamInfo.register_fields([('tile_start', ctypes.c_uint32, 0), ('tile_end', ctypes.c_uint32, 4), ('padding', c.Array[ctypes.c_ubyte, Literal[8]], 8)]) +AV1TileStreamInfo: TypeAlias = struct__AV1TileStreamInfo +@c.record +class struct__nvdec_new_h264_pic_s(c.Struct): + SIZE = 764 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + hint_dump_en: int + reserved0: c.Array[ctypes.c_ubyte, Literal[2]] + stream_len: int + slice_count: int + mbhist_buffer_size: int + gptimer_timeout_value: int + log2_max_pic_order_cnt_lsb_minus4: int + delta_pic_order_always_zero_flag: int + frame_mbs_only_flag: int + PicWidthInMbs: int + FrameHeightInMbs: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + entropy_coding_mode_flag: int + pic_order_present_flag: int + num_ref_idx_l0_active_minus1: int + num_ref_idx_l1_active_minus1: int + deblocking_filter_control_present_flag: int + redundant_pic_cnt_present_flag: int + transform_8x8_mode_flag: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + MbaffFrameFlag: int + direct_8x8_inference_flag: int + weighted_pred_flag: int + constrained_intra_pred_flag: int + ref_pic_flag: int + field_pic_flag: int + bottom_field_flag: int + second_field: int + log2_max_frame_num_minus4: int + chroma_format_idc: int + pic_order_cnt_type: int + pic_init_qp_minus26: int + chroma_qp_index_offset: int + second_chroma_qp_index_offset: int + weighted_bipred_idc: int + CurrPicIdx: int + CurrColIdx: int + frame_num: int + frame_surfaces: int + output_memory_layout: int + CurrFieldOrderCnt: c.Array[ctypes.c_int32, Literal[2]] + dpb: c.Array[struct__nvdec_dpb_entry_s, Literal[16]] + WeightScale: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]] + WeightScale8x8: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]] + num_inter_view_refs_lX: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_char, Literal[14]] + inter_view_refidx_lX: c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]] + lossless_ipred8x8_filter_enable: int + qpprime_y_zero_transform_bypass_flag: int + reserved2: int + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_new_h264_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('hint_dump_en', ctypes.c_ubyte, 69), ('reserved0', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('mbhist_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_int32, 88), ('delta_pic_order_always_zero_flag', ctypes.c_int32, 92), ('frame_mbs_only_flag', ctypes.c_int32, 96), ('PicWidthInMbs', ctypes.c_int32, 100), ('FrameHeightInMbs', ctypes.c_int32, 104), ('tileFormat', ctypes.c_uint32, 108, 2, 0), ('gob_height', ctypes.c_uint32, 108, 3, 2), ('reserverd_surface_format', ctypes.c_uint32, 108, 27, 5), ('entropy_coding_mode_flag', ctypes.c_int32, 112), ('pic_order_present_flag', ctypes.c_int32, 116), ('num_ref_idx_l0_active_minus1', ctypes.c_int32, 120), ('num_ref_idx_l1_active_minus1', ctypes.c_int32, 124), ('deblocking_filter_control_present_flag', ctypes.c_int32, 128), ('redundant_pic_cnt_present_flag', ctypes.c_int32, 132), ('transform_8x8_mode_flag', ctypes.c_int32, 136), ('pitch_luma', ctypes.c_uint32, 140), ('pitch_chroma', ctypes.c_uint32, 144), ('luma_top_offset', ctypes.c_uint32, 148), ('luma_bot_offset', ctypes.c_uint32, 152), ('luma_frame_offset', ctypes.c_uint32, 156), ('chroma_top_offset', ctypes.c_uint32, 160), ('chroma_bot_offset', ctypes.c_uint32, 164), ('chroma_frame_offset', ctypes.c_uint32, 168), ('HistBufferSize', ctypes.c_uint32, 172), ('MbaffFrameFlag', ctypes.c_uint32, 176, 1, 0), ('direct_8x8_inference_flag', ctypes.c_uint32, 176, 1, 1), ('weighted_pred_flag', ctypes.c_uint32, 176, 1, 2), ('constrained_intra_pred_flag', ctypes.c_uint32, 176, 1, 3), ('ref_pic_flag', ctypes.c_uint32, 176, 1, 4), ('field_pic_flag', ctypes.c_uint32, 176, 1, 5), ('bottom_field_flag', ctypes.c_uint32, 176, 1, 6), ('second_field', ctypes.c_uint32, 176, 1, 7), ('log2_max_frame_num_minus4', ctypes.c_uint32, 177, 4, 0), ('chroma_format_idc', ctypes.c_uint32, 177, 2, 4), ('pic_order_cnt_type', ctypes.c_uint32, 177, 2, 6), ('pic_init_qp_minus26', ctypes.c_int32, 178, 6, 0), ('chroma_qp_index_offset', ctypes.c_int32, 178, 5, 6), ('second_chroma_qp_index_offset', ctypes.c_int32, 179, 5, 3), ('weighted_bipred_idc', ctypes.c_uint32, 180, 2, 0), ('CurrPicIdx', ctypes.c_uint32, 180, 7, 2), ('CurrColIdx', ctypes.c_uint32, 181, 5, 1), ('frame_num', ctypes.c_uint32, 181, 16, 6), ('frame_surfaces', ctypes.c_uint32, 183, 1, 6), ('output_memory_layout', ctypes.c_uint32, 183, 1, 7), ('CurrFieldOrderCnt', c.Array[ctypes.c_int32, Literal[2]], 184), ('dpb', c.Array[nvdec_dpb_entry_s, Literal[16]], 192), ('WeightScale', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]], 448), ('WeightScale8x8', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]], 544), ('num_inter_view_refs_lX', c.Array[ctypes.c_ubyte, Literal[2]], 672), ('reserved1', c.Array[ctypes.c_char, Literal[14]], 674), ('inter_view_refidx_lX', c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]], 688), ('lossless_ipred8x8_filter_enable', ctypes.c_uint32, 720, 1, 0), ('qpprime_y_zero_transform_bypass_flag', ctypes.c_uint32, 720, 1, 1), ('reserved2', ctypes.c_uint32, 720, 30, 2), ('displayPara', nvdec_display_param_s, 724), ('ssm', nvdec_pass2_otf_ext_s, 752)]) +nvdec_new_h264_pic_s: TypeAlias = struct__nvdec_new_h264_pic_s +@c.record +class nvdec_crc_s(c.Struct): + SIZE = 128 + dbg_crc_enable_partb: int + dbg_crc_enable_partc: int + dbg_crc_enable_partd: int + dbg_crc_enable_parte: int + dbg_crc_intf_partb: int + dbg_crc_intf_partc: int + dbg_crc_intf_partd: int + dbg_crc_intf_parte: int + reserved0: int + dbg_crc_partb_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_partc_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_partd_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_parte_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_comp_partb: int + dbg_crc_comp_partc: int + dbg_crc_comp_partd: int + dbg_crc_comp_parte: int + reserved1: int + reserved2: c.Array[ctypes.c_ubyte, Literal[56]] +nvdec_crc_s.register_fields([('dbg_crc_enable_partb', ctypes.c_uint32, 0, 1, 0), ('dbg_crc_enable_partc', ctypes.c_uint32, 0, 1, 1), ('dbg_crc_enable_partd', ctypes.c_uint32, 0, 1, 2), ('dbg_crc_enable_parte', ctypes.c_uint32, 0, 1, 3), ('dbg_crc_intf_partb', ctypes.c_uint32, 0, 6, 4), ('dbg_crc_intf_partc', ctypes.c_uint32, 1, 6, 2), ('dbg_crc_intf_partd', ctypes.c_uint32, 2, 6, 0), ('dbg_crc_intf_parte', ctypes.c_uint32, 2, 6, 6), ('reserved0', ctypes.c_uint32, 3, 4, 4), ('dbg_crc_partb_golden', c.Array[ctypes.c_uint32, Literal[4]], 4), ('dbg_crc_partc_golden', c.Array[ctypes.c_uint32, Literal[4]], 20), ('dbg_crc_partd_golden', c.Array[ctypes.c_uint32, Literal[4]], 36), ('dbg_crc_parte_golden', c.Array[ctypes.c_uint32, Literal[4]], 52), ('dbg_crc_comp_partb', ctypes.c_uint32, 68, 4, 0), ('dbg_crc_comp_partc', ctypes.c_uint32, 68, 4, 4), ('dbg_crc_comp_partd', ctypes.c_uint32, 69, 4, 0), ('dbg_crc_comp_parte', ctypes.c_uint32, 69, 4, 4), ('reserved1', ctypes.c_uint32, 70, 16, 0), ('reserved2', c.Array[ctypes.c_ubyte, Literal[56]], 72)]) +@c.record +class struct_NV0000_ALLOC_PARAMETERS(c.Struct): + SIZE = 120 + hClient: int + processID: int + processName: c.Array[ctypes.c_char, Literal[100]] + pOsPidInfo: ctypes.c_void_p +NvHandle: TypeAlias = ctypes.c_uint32 +NvU32: TypeAlias = ctypes.c_uint32 +NvP64: TypeAlias = ctypes.c_void_p +struct_NV0000_ALLOC_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('processID', NvU32, 4), ('processName', c.Array[ctypes.c_char, Literal[100]], 8), ('pOsPidInfo', NvP64, 112)]) +NV0000_ALLOC_PARAMETERS: TypeAlias = struct_NV0000_ALLOC_PARAMETERS +@c.record +class struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS(c.Struct): + SIZE = 24 + offset: int + limit: int + hVASpace: int +NvU64: TypeAlias = ctypes.c_uint64 +struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS.register_fields([('offset', NvU64, 0), ('limit', NvU64, 8), ('hVASpace', NvHandle, 16)]) +NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS: TypeAlias = struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS +@c.record +class struct_NV0080_ALLOC_PARAMETERS(c.Struct): + SIZE = 56 + deviceId: int + hClientShare: int + hTargetClient: int + hTargetDevice: int + flags: int + vaSpaceSize: int + vaStartInternal: int + vaLimitInternal: int + vaMode: int +NvV32: TypeAlias = ctypes.c_uint32 +struct_NV0080_ALLOC_PARAMETERS.register_fields([('deviceId', NvU32, 0), ('hClientShare', NvHandle, 4), ('hTargetClient', NvHandle, 8), ('hTargetDevice', NvHandle, 12), ('flags', NvV32, 16), ('vaSpaceSize', NvU64, 24), ('vaStartInternal', NvU64, 32), ('vaLimitInternal', NvU64, 40), ('vaMode', NvV32, 48)]) +NV0080_ALLOC_PARAMETERS: TypeAlias = struct_NV0080_ALLOC_PARAMETERS +@c.record +class struct_NV2080_ALLOC_PARAMETERS(c.Struct): + SIZE = 4 + subDeviceId: int +struct_NV2080_ALLOC_PARAMETERS.register_fields([('subDeviceId', NvU32, 0)]) +NV2080_ALLOC_PARAMETERS: TypeAlias = struct_NV2080_ALLOC_PARAMETERS +@c.record +class struct__cl2080_tag0(c.Struct): + SIZE = 7936 + Reserved00: c.Array[ctypes.c_uint32, Literal[1984]] +struct__cl2080_tag0.register_fields([('Reserved00', c.Array[NvV32, Literal[1984]], 0)]) +@c.record +class volatile_struct__cl2080_tag0(c.Struct): + SIZE = 7936 + Reserved00: c.Array[ctypes.c_uint32, Literal[1984]] +Nv2080Typedef: TypeAlias = volatile_struct__cl2080_tag0 +volatile_struct__cl2080_tag0.register_fields([('Reserved00', c.Array[NvV32, Literal[1984]], 0)]) +Nv20Subdevice0: TypeAlias = volatile_struct__cl2080_tag0 +@c.record +class struct_Nv2080HdcpStatusChangeNotificationRec(c.Struct): + SIZE = 8 + displayId: int + hdcpStatusChangeNotif: int +struct_Nv2080HdcpStatusChangeNotificationRec.register_fields([('displayId', NvU32, 0), ('hdcpStatusChangeNotif', NvU32, 4)]) +Nv2080HdcpStatusChangeNotification: TypeAlias = struct_Nv2080HdcpStatusChangeNotificationRec +@c.record +class struct_Nv2080PStateChangeNotificationRec(c.Struct): + SIZE = 12 + timeStamp: struct_Nv2080PStateChangeNotificationRec_timeStamp + NewPstate: int +@c.record +class struct_Nv2080PStateChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080PStateChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +struct_Nv2080PStateChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080PStateChangeNotificationRec_timeStamp, 0), ('NewPstate', NvU32, 8)]) +Nv2080PStateChangeNotification: TypeAlias = struct_Nv2080PStateChangeNotificationRec +@c.record +class struct_Nv2080ClocksChangeNotificationRec(c.Struct): + SIZE = 8 + timeStamp: struct_Nv2080ClocksChangeNotificationRec_timeStamp +@c.record +class struct_Nv2080ClocksChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080ClocksChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +struct_Nv2080ClocksChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080ClocksChangeNotificationRec_timeStamp, 0)]) +Nv2080ClocksChangeNotification: TypeAlias = struct_Nv2080ClocksChangeNotificationRec +@c.record +class struct_Nv2080WorkloadModulationChangeNotificationRec(c.Struct): + SIZE = 12 + timeStamp: struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp + WorkloadModulationEnabled: int +@c.record +class struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +NvBool: TypeAlias = ctypes.c_ubyte +struct_Nv2080WorkloadModulationChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp, 0), ('WorkloadModulationEnabled', NvBool, 8)]) +Nv2080WorkloadModulationChangeNotification: TypeAlias = struct_Nv2080WorkloadModulationChangeNotificationRec +@c.record +class Nv2080HotplugNotification(c.Struct): + SIZE = 8 + plugDisplayMask: int + unplugDisplayMask: int +Nv2080HotplugNotification.register_fields([('plugDisplayMask', NvU32, 0), ('unplugDisplayMask', NvU32, 4)]) +@c.record +class Nv2080PowerEventNotification(c.Struct): + SIZE = 8 + bSwitchToAC: int + bGPUCapabilityChanged: int + displayMaskAffected: int +Nv2080PowerEventNotification.register_fields([('bSwitchToAC', NvBool, 0), ('bGPUCapabilityChanged', NvBool, 1), ('displayMaskAffected', NvU32, 4)]) +@c.record +class struct_Nv2080DpIrqNotificationRec(c.Struct): + SIZE = 4 + displayId: int +struct_Nv2080DpIrqNotificationRec.register_fields([('displayId', NvU32, 0)]) +Nv2080DpIrqNotification: TypeAlias = struct_Nv2080DpIrqNotificationRec +@c.record +class struct_Nv2080DstateXusbPpcNotificationRec(c.Struct): + SIZE = 8 + dstateXusb: int + dstatePpc: int +struct_Nv2080DstateXusbPpcNotificationRec.register_fields([('dstateXusb', NvU32, 0), ('dstatePpc', NvU32, 4)]) +Nv2080DstateXusbPpcNotification: TypeAlias = struct_Nv2080DstateXusbPpcNotificationRec +@c.record +class struct_Nv2080XusbPpcConnectStateNotificationRec(c.Struct): + SIZE = 1 + bConnected: int +struct_Nv2080XusbPpcConnectStateNotificationRec.register_fields([('bConnected', NvBool, 0)]) +Nv2080XusbPpcConnectStateNotification: TypeAlias = struct_Nv2080XusbPpcConnectStateNotificationRec +@c.record +class struct_Nv2080ACPIEvent(c.Struct): + SIZE = 4 + event: int +struct_Nv2080ACPIEvent.register_fields([('event', NvU32, 0)]) +Nv2080ACPIEvent: TypeAlias = struct_Nv2080ACPIEvent +@c.record +class struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC(c.Struct): + SIZE = 4 + currentZone: int +struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC.register_fields([('currentZone', NvU32, 0)]) +NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC: TypeAlias = struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC +@c.record +class struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC(c.Struct): + SIZE = 4 + currentZone: int +struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC.register_fields([('currentZone', NvU32, 0)]) +NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC: TypeAlias = struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC +@c.record +class struct_Nv2080AudioHdcpRequestRec(c.Struct): + SIZE = 8 + displayId: int + requestedState: int +struct_Nv2080AudioHdcpRequestRec.register_fields([('displayId', NvU32, 0), ('requestedState', NvU32, 4)]) +Nv2080AudioHdcpRequest: TypeAlias = struct_Nv2080AudioHdcpRequestRec +@c.record +class struct_Nv2080GC5GpuReadyParams(c.Struct): + SIZE = 12 + event: int + sciIntr0: int + sciIntr1: int +struct_Nv2080GC5GpuReadyParams.register_fields([('event', NvU32, 0), ('sciIntr0', NvU32, 4), ('sciIntr1', NvU32, 8)]) +Nv2080GC5GpuReadyParams: TypeAlias = struct_Nv2080GC5GpuReadyParams +@c.record +class Nv2080PrivRegAccessFaultNotification(c.Struct): + SIZE = 4 + errAddr: int +Nv2080PrivRegAccessFaultNotification.register_fields([('errAddr', NvU32, 0)]) +@c.record +class struct_Nv2080DstateHdaCodecNotificationRec(c.Struct): + SIZE = 4 + dstateHdaCodec: int +struct_Nv2080DstateHdaCodecNotificationRec.register_fields([('dstateHdaCodec', NvU32, 0)]) +Nv2080DstateHdaCodecNotification: TypeAlias = struct_Nv2080DstateHdaCodecNotificationRec +@c.record +class struct_Nv2080HdmiFrlRequestNotificationRec(c.Struct): + SIZE = 4 + displayId: int +struct_Nv2080HdmiFrlRequestNotificationRec.register_fields([('displayId', NvU32, 0)]) +Nv2080HdmiFrlRequestNotification: TypeAlias = struct_Nv2080HdmiFrlRequestNotificationRec +@c.record +class struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS(c.Struct): + SIZE = 3 + platformPowerModeIndex: int + platformPowerModeMask: int + eventReason: int +NvU8: TypeAlias = ctypes.c_ubyte +struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS.register_fields([('platformPowerModeIndex', NvU8, 0), ('platformPowerModeMask', NvU8, 1), ('eventReason', NvU8, 2)]) +NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS: TypeAlias = struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS +@c.record +class struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE(c.Struct): + SIZE = 1 + workloadType: int +struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE.register_fields([('workloadType', NvU8, 0)]) +NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE: TypeAlias = struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE +@c.record +class Nv2080QosIntrNotification(c.Struct): + SIZE = 4 + engineType: int +Nv2080QosIntrNotification.register_fields([('engineType', NvU32, 0)]) +@c.record +class Nv2080EccDbeNotification(c.Struct): + SIZE = 8 + physAddress: int +Nv2080EccDbeNotification.register_fields([('physAddress', NvU64, 0)]) +@c.record +class Nv2080LpwrDifrPrefetchNotification(c.Struct): + SIZE = 4 + l2CacheSize: int +Nv2080LpwrDifrPrefetchNotification.register_fields([('l2CacheSize', NvU32, 0)]) +@c.record +class Nv2080NvlinkLnkChangeNotification(c.Struct): + SIZE = 8 + GpuId: int + linkId: int +Nv2080NvlinkLnkChangeNotification.register_fields([('GpuId', NvU32, 0), ('linkId', NvU32, 4)]) +@c.record +class Nv2080VrrSetTimeoutNotification(c.Struct): + SIZE = 4 + head: int +Nv2080VrrSetTimeoutNotification.register_fields([('head', NvU32, 0)]) +@c.record +class struct_Nvc56fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc56fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc56fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +Nvc56fControl: TypeAlias = volatile_struct_Nvc56fControl_struct +volatile_struct_Nvc56fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +AmpereAControlGPFifo: TypeAlias = volatile_struct_Nvc56fControl_struct +@c.record +class struct_Nvc86fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc86fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc86fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +Nvc86fControl: TypeAlias = volatile_struct_Nvc86fControl_struct +volatile_struct_Nvc86fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +HopperAControlGPFifo: TypeAlias = volatile_struct_Nvc86fControl_struct +@c.record +class struct_Nvc96fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[35]] + GPPut: int + Ignored01: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc96fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[35]], 0), ('GPPut', NvU32, 140), ('Ignored01', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc96fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[35]] + GPPut: int + Ignored01: c.Array[ctypes.c_uint32, Literal[92]] +Nvc96fControl: TypeAlias = volatile_struct_Nvc96fControl_struct +volatile_struct_Nvc96fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[35]], 0), ('GPPut', NvU32, 140), ('Ignored01', c.Array[NvU32, Literal[92]], 144)]) +BlackwellAControlGPFifo: TypeAlias = volatile_struct_Nvc96fControl_struct +@c.record +class struct_NV83DE_ALLOC_PARAMETERS(c.Struct): + SIZE = 12 + hDebuggerClient_Obsolete: int + hAppClient: int + hClass3dObject: int +struct_NV83DE_ALLOC_PARAMETERS.register_fields([('hDebuggerClient_Obsolete', NvHandle, 0), ('hAppClient', NvHandle, 4), ('hClass3dObject', NvHandle, 8)]) +NV83DE_ALLOC_PARAMETERS: TypeAlias = struct_NV83DE_ALLOC_PARAMETERS +@c.record +class struct_NVB2CC_ALLOC_PARAMETERS(c.Struct): + SIZE = 8 + hClientTarget: int + hContextTarget: int +struct_NVB2CC_ALLOC_PARAMETERS.register_fields([('hClientTarget', NvHandle, 0), ('hContextTarget', NvHandle, 4)]) +NVB2CC_ALLOC_PARAMETERS: TypeAlias = struct_NVB2CC_ALLOC_PARAMETERS +@c.record +class struct__clc9b5_tag0(c.Struct): + SIZE = 8192 + Reserved00: c.Array[ctypes.c_uint32, Literal[64]] + Nop: int + Reserved01: c.Array[ctypes.c_uint32, Literal[15]] + PmTrigger: int + Reserved02: c.Array[ctypes.c_uint32, Literal[54]] + SetMonitoredFenceType: int + SetMonitoredFenceSignalAddrBaseUpper: int + SetMonitoredFenceSignalAddrBaseLower: int + Reserved03: c.Array[ctypes.c_uint32, Literal[6]] + SetSemaphoreA: int + SetSemaphoreB: int + SetSemaphorePayload: int + SetSemaphorePayloadUpper: int + Reserved04: c.Array[ctypes.c_uint32, Literal[1]] + SetRenderEnableA: int + SetRenderEnableB: int + SetRenderEnableC: int + SetSrcPhysMode: int + SetDstPhysMode: int + Reserved05: c.Array[ctypes.c_uint32, Literal[38]] + LaunchDma: int + Reserved06: c.Array[ctypes.c_uint32, Literal[63]] + OffsetInUpper: int + OffsetInLower: int + OffsetOutUpper: int + OffsetOutLower: int + PitchIn: int + PitchOut: int + LineLengthIn: int + LineCount: int + Reserved07: c.Array[ctypes.c_uint32, Literal[56]] + SetSecureCopyMode: int + SetDecryptIv0: int + SetDecryptIv1: int + SetDecryptIv2: int + Reserved_SetAESCounter: int + SetDecryptAuthTagCompareAddrUpper: int + SetDecryptAuthTagCompareAddrLower: int + Reserved08: c.Array[ctypes.c_uint32, Literal[5]] + SetEncryptAuthTagAddrUpper: int + SetEncryptAuthTagAddrLower: int + SetEncryptIvAddrUpper: int + SetEncryptIvAddrLower: int + Reserved09: c.Array[ctypes.c_uint32, Literal[16]] + SetCompressionParameters: int + SetDecompressOutLength: int + SetDecompressOutLengthAddrUpper: int + SetDecompressOutLengthAddrLower: int + SetDecompressChecksum: int + Reserved10: c.Array[ctypes.c_uint32, Literal[90]] + SetMemoryScrubParameters: int + SetRemapConstA: int + SetRemapConstB: int + SetRemapComponents: int + SetDstBlockSize: int + SetDstWidth: int + SetDstHeight: int + SetDstDepth: int + SetDstLayer: int + SetDstOrigin: int + Reserved11: c.Array[ctypes.c_uint32, Literal[1]] + SetSrcBlockSize: int + SetSrcWidth: int + SetSrcHeight: int + SetSrcDepth: int + SetSrcLayer: int + SetSrcOrigin: int + Reserved12: c.Array[ctypes.c_uint32, Literal[1]] + SrcOriginX: int + SrcOriginY: int + DstOriginX: int + DstOriginY: int + Reserved13: c.Array[ctypes.c_uint32, Literal[624]] + PmTriggerEnd: int + Reserved14: c.Array[ctypes.c_uint32, Literal[954]] +struct__clc9b5_tag0.register_fields([('Reserved00', c.Array[NvV32, Literal[64]], 0), ('Nop', NvV32, 256), ('Reserved01', c.Array[NvV32, Literal[15]], 260), ('PmTrigger', NvV32, 320), ('Reserved02', c.Array[NvV32, Literal[54]], 324), ('SetMonitoredFenceType', NvV32, 540), ('SetMonitoredFenceSignalAddrBaseUpper', NvV32, 544), ('SetMonitoredFenceSignalAddrBaseLower', NvV32, 548), ('Reserved03', c.Array[NvV32, Literal[6]], 552), ('SetSemaphoreA', NvV32, 576), ('SetSemaphoreB', NvV32, 580), ('SetSemaphorePayload', NvV32, 584), ('SetSemaphorePayloadUpper', NvV32, 588), ('Reserved04', c.Array[NvV32, Literal[1]], 592), ('SetRenderEnableA', NvV32, 596), ('SetRenderEnableB', NvV32, 600), ('SetRenderEnableC', NvV32, 604), ('SetSrcPhysMode', NvV32, 608), ('SetDstPhysMode', NvV32, 612), ('Reserved05', c.Array[NvV32, Literal[38]], 616), ('LaunchDma', NvV32, 768), ('Reserved06', c.Array[NvV32, Literal[63]], 772), ('OffsetInUpper', NvV32, 1024), ('OffsetInLower', NvV32, 1028), ('OffsetOutUpper', NvV32, 1032), ('OffsetOutLower', NvV32, 1036), ('PitchIn', NvV32, 1040), ('PitchOut', NvV32, 1044), ('LineLengthIn', NvV32, 1048), ('LineCount', NvV32, 1052), ('Reserved07', c.Array[NvV32, Literal[56]], 1056), ('SetSecureCopyMode', NvV32, 1280), ('SetDecryptIv0', NvV32, 1284), ('SetDecryptIv1', NvV32, 1288), ('SetDecryptIv2', NvV32, 1292), ('Reserved_SetAESCounter', NvV32, 1296), ('SetDecryptAuthTagCompareAddrUpper', NvV32, 1300), ('SetDecryptAuthTagCompareAddrLower', NvV32, 1304), ('Reserved08', c.Array[NvV32, Literal[5]], 1308), ('SetEncryptAuthTagAddrUpper', NvV32, 1328), ('SetEncryptAuthTagAddrLower', NvV32, 1332), ('SetEncryptIvAddrUpper', NvV32, 1336), ('SetEncryptIvAddrLower', NvV32, 1340), ('Reserved09', c.Array[NvV32, Literal[16]], 1344), ('SetCompressionParameters', NvV32, 1408), ('SetDecompressOutLength', NvV32, 1412), ('SetDecompressOutLengthAddrUpper', NvV32, 1416), ('SetDecompressOutLengthAddrLower', NvV32, 1420), ('SetDecompressChecksum', NvV32, 1424), ('Reserved10', c.Array[NvV32, Literal[90]], 1428), ('SetMemoryScrubParameters', NvV32, 1788), ('SetRemapConstA', NvV32, 1792), ('SetRemapConstB', NvV32, 1796), ('SetRemapComponents', NvV32, 1800), ('SetDstBlockSize', NvV32, 1804), ('SetDstWidth', NvV32, 1808), ('SetDstHeight', NvV32, 1812), ('SetDstDepth', NvV32, 1816), ('SetDstLayer', NvV32, 1820), ('SetDstOrigin', NvV32, 1824), ('Reserved11', c.Array[NvV32, Literal[1]], 1828), ('SetSrcBlockSize', NvV32, 1832), ('SetSrcWidth', NvV32, 1836), ('SetSrcHeight', NvV32, 1840), ('SetSrcDepth', NvV32, 1844), ('SetSrcLayer', NvV32, 1848), ('SetSrcOrigin', NvV32, 1852), ('Reserved12', c.Array[NvV32, Literal[1]], 1856), ('SrcOriginX', NvV32, 1860), ('SrcOriginY', NvV32, 1864), ('DstOriginX', NvV32, 1868), ('DstOriginY', NvV32, 1872), ('Reserved13', c.Array[NvV32, Literal[624]], 1876), ('PmTriggerEnd', NvV32, 4372), ('Reserved14', c.Array[NvV32, Literal[954]], 4376)]) +@c.record +class volatile_struct__clc9b5_tag0(c.Struct): + SIZE = 8192 + Reserved00: c.Array[ctypes.c_uint32, Literal[64]] + Nop: int + Reserved01: c.Array[ctypes.c_uint32, Literal[15]] + PmTrigger: int + Reserved02: c.Array[ctypes.c_uint32, Literal[54]] + SetMonitoredFenceType: int + SetMonitoredFenceSignalAddrBaseUpper: int + SetMonitoredFenceSignalAddrBaseLower: int + Reserved03: c.Array[ctypes.c_uint32, Literal[6]] + SetSemaphoreA: int + SetSemaphoreB: int + SetSemaphorePayload: int + SetSemaphorePayloadUpper: int + Reserved04: c.Array[ctypes.c_uint32, Literal[1]] + SetRenderEnableA: int + SetRenderEnableB: int + SetRenderEnableC: int + SetSrcPhysMode: int + SetDstPhysMode: int + Reserved05: c.Array[ctypes.c_uint32, Literal[38]] + LaunchDma: int + Reserved06: c.Array[ctypes.c_uint32, Literal[63]] + OffsetInUpper: int + OffsetInLower: int + OffsetOutUpper: int + OffsetOutLower: int + PitchIn: int + PitchOut: int + LineLengthIn: int + LineCount: int + Reserved07: c.Array[ctypes.c_uint32, Literal[56]] + SetSecureCopyMode: int + SetDecryptIv0: int + SetDecryptIv1: int + SetDecryptIv2: int + Reserved_SetAESCounter: int + SetDecryptAuthTagCompareAddrUpper: int + SetDecryptAuthTagCompareAddrLower: int + Reserved08: c.Array[ctypes.c_uint32, Literal[5]] + SetEncryptAuthTagAddrUpper: int + SetEncryptAuthTagAddrLower: int + SetEncryptIvAddrUpper: int + SetEncryptIvAddrLower: int + Reserved09: c.Array[ctypes.c_uint32, Literal[16]] + SetCompressionParameters: int + SetDecompressOutLength: int + SetDecompressOutLengthAddrUpper: int + SetDecompressOutLengthAddrLower: int + SetDecompressChecksum: int + Reserved10: c.Array[ctypes.c_uint32, Literal[90]] + SetMemoryScrubParameters: int + SetRemapConstA: int + SetRemapConstB: int + SetRemapComponents: int + SetDstBlockSize: int + SetDstWidth: int + SetDstHeight: int + SetDstDepth: int + SetDstLayer: int + SetDstOrigin: int + Reserved11: c.Array[ctypes.c_uint32, Literal[1]] + SetSrcBlockSize: int + SetSrcWidth: int + SetSrcHeight: int + SetSrcDepth: int + SetSrcLayer: int + SetSrcOrigin: int + Reserved12: c.Array[ctypes.c_uint32, Literal[1]] + SrcOriginX: int + SrcOriginY: int + DstOriginX: int + DstOriginY: int + Reserved13: c.Array[ctypes.c_uint32, Literal[624]] + PmTriggerEnd: int + Reserved14: c.Array[ctypes.c_uint32, Literal[954]] +blackwell_dma_copy_aControlPio: TypeAlias = volatile_struct__clc9b5_tag0 +volatile_struct__clc9b5_tag0.register_fields([('Reserved00', c.Array[NvV32, Literal[64]], 0), ('Nop', NvV32, 256), ('Reserved01', c.Array[NvV32, Literal[15]], 260), ('PmTrigger', NvV32, 320), ('Reserved02', c.Array[NvV32, Literal[54]], 324), ('SetMonitoredFenceType', NvV32, 540), ('SetMonitoredFenceSignalAddrBaseUpper', NvV32, 544), ('SetMonitoredFenceSignalAddrBaseLower', NvV32, 548), ('Reserved03', c.Array[NvV32, Literal[6]], 552), ('SetSemaphoreA', NvV32, 576), ('SetSemaphoreB', NvV32, 580), ('SetSemaphorePayload', NvV32, 584), ('SetSemaphorePayloadUpper', NvV32, 588), ('Reserved04', c.Array[NvV32, Literal[1]], 592), ('SetRenderEnableA', NvV32, 596), ('SetRenderEnableB', NvV32, 600), ('SetRenderEnableC', NvV32, 604), ('SetSrcPhysMode', NvV32, 608), ('SetDstPhysMode', NvV32, 612), ('Reserved05', c.Array[NvV32, Literal[38]], 616), ('LaunchDma', NvV32, 768), ('Reserved06', c.Array[NvV32, Literal[63]], 772), ('OffsetInUpper', NvV32, 1024), ('OffsetInLower', NvV32, 1028), ('OffsetOutUpper', NvV32, 1032), ('OffsetOutLower', NvV32, 1036), ('PitchIn', NvV32, 1040), ('PitchOut', NvV32, 1044), ('LineLengthIn', NvV32, 1048), ('LineCount', NvV32, 1052), ('Reserved07', c.Array[NvV32, Literal[56]], 1056), ('SetSecureCopyMode', NvV32, 1280), ('SetDecryptIv0', NvV32, 1284), ('SetDecryptIv1', NvV32, 1288), ('SetDecryptIv2', NvV32, 1292), ('Reserved_SetAESCounter', NvV32, 1296), ('SetDecryptAuthTagCompareAddrUpper', NvV32, 1300), ('SetDecryptAuthTagCompareAddrLower', NvV32, 1304), ('Reserved08', c.Array[NvV32, Literal[5]], 1308), ('SetEncryptAuthTagAddrUpper', NvV32, 1328), ('SetEncryptAuthTagAddrLower', NvV32, 1332), ('SetEncryptIvAddrUpper', NvV32, 1336), ('SetEncryptIvAddrLower', NvV32, 1340), ('Reserved09', c.Array[NvV32, Literal[16]], 1344), ('SetCompressionParameters', NvV32, 1408), ('SetDecompressOutLength', NvV32, 1412), ('SetDecompressOutLengthAddrUpper', NvV32, 1416), ('SetDecompressOutLengthAddrLower', NvV32, 1420), ('SetDecompressChecksum', NvV32, 1424), ('Reserved10', c.Array[NvV32, Literal[90]], 1428), ('SetMemoryScrubParameters', NvV32, 1788), ('SetRemapConstA', NvV32, 1792), ('SetRemapConstB', NvV32, 1796), ('SetRemapComponents', NvV32, 1800), ('SetDstBlockSize', NvV32, 1804), ('SetDstWidth', NvV32, 1808), ('SetDstHeight', NvV32, 1812), ('SetDstDepth', NvV32, 1816), ('SetDstLayer', NvV32, 1820), ('SetDstOrigin', NvV32, 1824), ('Reserved11', c.Array[NvV32, Literal[1]], 1828), ('SetSrcBlockSize', NvV32, 1832), ('SetSrcWidth', NvV32, 1836), ('SetSrcHeight', NvV32, 1840), ('SetSrcDepth', NvV32, 1844), ('SetSrcLayer', NvV32, 1848), ('SetSrcOrigin', NvV32, 1852), ('Reserved12', c.Array[NvV32, Literal[1]], 1856), ('SrcOriginX', NvV32, 1860), ('SrcOriginY', NvV32, 1864), ('DstOriginX', NvV32, 1868), ('DstOriginY', NvV32, 1872), ('Reserved13', c.Array[NvV32, Literal[624]], 1876), ('PmTriggerEnd', NvV32, 4372), ('Reserved14', c.Array[NvV32, Literal[954]], 4376)]) +@c.record +class UVM_RESERVE_VA_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +NV_STATUS: TypeAlias = ctypes.c_uint32 +UVM_RESERVE_VA_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_RELEASE_VA_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_RELEASE_VA_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGION_COMMIT_PARAMS(c.Struct): + SIZE = 48 + requestedBase: int + length: int + streamId: int + gpuUuid: struct_nv_uuid + rmStatus: int +UvmStream: TypeAlias = ctypes.c_uint64 +@c.record +class struct_nv_uuid(c.Struct): + SIZE = 16 + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +NvProcessorUuid: TypeAlias = struct_nv_uuid +struct_nv_uuid.register_fields([('uuid', c.Array[NvU8, Literal[16]], 0)]) +UVM_REGION_COMMIT_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('streamId', UvmStream, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_REGION_DECOMMIT_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_REGION_DECOMMIT_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGION_SET_STREAM_PARAMS(c.Struct): + SIZE = 48 + requestedBase: int + length: int + newStreamId: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_REGION_SET_STREAM_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('newStreamId', UvmStream, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_SET_STREAM_RUNNING_PARAMS(c.Struct): + SIZE = 16 + streamId: int + rmStatus: int +UVM_SET_STREAM_RUNNING_PARAMS.register_fields([('streamId', UvmStream, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_SET_STREAM_STOPPED_PARAMS(c.Struct): + SIZE = 272 + streamIdArray: c.Array[ctypes.c_uint64, Literal[32]] + nStreams: int + rmStatus: int +UVM_SET_STREAM_STOPPED_PARAMS.register_fields([('streamIdArray', c.Array[UvmStream, Literal[32]], 0), ('nStreams', NvU64, 256), ('rmStatus', NV_STATUS, 264)]) +@c.record +class UVM_RUN_TEST_PARAMS(c.Struct): + SIZE = 44 + gpuUuid: struct_nv_uuid + test: int + multiGpu: UVM_RUN_TEST_PARAMS_multiGpu + rmStatus: int +@c.record +class UVM_RUN_TEST_PARAMS_multiGpu(c.Struct): + SIZE = 20 + peerGpuUuid: struct_nv_uuid + peerId: int +UVM_RUN_TEST_PARAMS_multiGpu.register_fields([('peerGpuUuid', NvProcessorUuid, 0), ('peerId', NvU32, 16)]) +UVM_RUN_TEST_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('test', NvU32, 16), ('multiGpu', UVM_RUN_TEST_PARAMS_multiGpu, 20), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_ADD_SESSION_PARAMS(c.Struct): + SIZE = 24 + pidTarget: int + countersBaseAddress: ctypes.c_void_p + sessionIndex: int + rmStatus: int +NvS32: TypeAlias = ctypes.c_int32 +UVM_ADD_SESSION_PARAMS.register_fields([('pidTarget', NvU32, 0), ('countersBaseAddress', NvP64, 8), ('sessionIndex', NvS32, 16), ('rmStatus', NV_STATUS, 20)]) +@c.record +class UVM_REMOVE_SESSION_PARAMS(c.Struct): + SIZE = 8 + sessionIndex: int + rmStatus: int +UVM_REMOVE_SESSION_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_ENABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 908 + sessionIndex: int + config: c.Array[UvmCounterConfig, Literal[32]] + count: int + rmStatus: int +@c.record +class UvmCounterConfig(c.Struct): + SIZE = 28 + scope: int + name: int + gpuid: struct_nv_uuid + state: int +UvmCounterConfig.register_fields([('scope', NvU32, 0), ('name', NvU32, 4), ('gpuid', NvProcessorUuid, 8), ('state', NvU32, 24)]) +UVM_ENABLE_COUNTERS_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('config', c.Array[UvmCounterConfig, Literal[32]], 4), ('count', NvU32, 900), ('rmStatus', NV_STATUS, 904)]) +@c.record +class UVM_MAP_COUNTER_PARAMS(c.Struct): + SIZE = 48 + sessionIndex: int + scope: int + counterName: int + gpuUuid: struct_nv_uuid + addr: ctypes.c_void_p + rmStatus: int +UVM_MAP_COUNTER_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('scope', NvU32, 4), ('counterName', NvU32, 8), ('gpuUuid', NvProcessorUuid, 12), ('addr', NvP64, 32), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_CREATE_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 32 + sessionIndex: int + eventQueueIndex: int + queueSize: int + notificationCount: int + timeStampType: int + rmStatus: int +UVM_CREATE_EVENT_QUEUE_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('eventQueueIndex', NvU32, 4), ('queueSize', NvU64, 8), ('notificationCount', NvU64, 16), ('timeStampType', NvU32, 24), ('rmStatus', NV_STATUS, 28)]) +@c.record +class UVM_REMOVE_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 12 + sessionIndex: int + eventQueueIndex: int + rmStatus: int +UVM_REMOVE_EVENT_QUEUE_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('eventQueueIndex', NvU32, 4), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_MAP_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 56 + sessionIndex: int + eventQueueIndex: int + userRODataAddr: ctypes.c_void_p + userRWDataAddr: ctypes.c_void_p + readIndexAddr: ctypes.c_void_p + writeIndexAddr: ctypes.c_void_p + queueBufferAddr: ctypes.c_void_p + rmStatus: int +UVM_MAP_EVENT_QUEUE_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('eventQueueIndex', NvU32, 4), ('userRODataAddr', NvP64, 8), ('userRWDataAddr', NvP64, 16), ('readIndexAddr', NvP64, 24), ('writeIndexAddr', NvP64, 32), ('queueBufferAddr', NvP64, 40), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_EVENT_CTRL_PARAMS(c.Struct): + SIZE = 20 + sessionIndex: int + eventQueueIndex: int + eventType: int + enable: int + rmStatus: int +UVM_EVENT_CTRL_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('eventQueueIndex', NvU32, 4), ('eventType', NvS32, 8), ('enable', NvU32, 12), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGISTER_MPS_SERVER_PARAMS(c.Struct): + SIZE = 536 + gpuUuidArray: c.Array[struct_nv_uuid, Literal[32]] + numGpus: int + serverId: int + rmStatus: int +UVM_REGISTER_MPS_SERVER_PARAMS.register_fields([('gpuUuidArray', c.Array[NvProcessorUuid, Literal[32]], 0), ('numGpus', NvU32, 512), ('serverId', NvU64, 520), ('rmStatus', NV_STATUS, 528)]) +@c.record +class UVM_REGISTER_MPS_CLIENT_PARAMS(c.Struct): + SIZE = 16 + serverId: int + rmStatus: int +UVM_REGISTER_MPS_CLIENT_PARAMS.register_fields([('serverId', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_GET_GPU_UUID_TABLE_PARAMS(c.Struct): + SIZE = 520 + gpuUuidArray: c.Array[struct_nv_uuid, Literal[32]] + validCount: int + rmStatus: int +UVM_GET_GPU_UUID_TABLE_PARAMS.register_fields([('gpuUuidArray', c.Array[NvProcessorUuid, Literal[32]], 0), ('validCount', NvU32, 512), ('rmStatus', NV_STATUS, 516)]) +@c.record +class UVM_CREATE_RANGE_GROUP_PARAMS(c.Struct): + SIZE = 16 + rangeGroupId: int + rmStatus: int +UVM_CREATE_RANGE_GROUP_PARAMS.register_fields([('rangeGroupId', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_DESTROY_RANGE_GROUP_PARAMS(c.Struct): + SIZE = 16 + rangeGroupId: int + rmStatus: int +UVM_DESTROY_RANGE_GROUP_PARAMS.register_fields([('rangeGroupId', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_REGISTER_GPU_VASPACE_PARAMS(c.Struct): + SIZE = 32 + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hVaSpace: int + rmStatus: int +UVM_REGISTER_GPU_VASPACE_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmCtrlFd', NvS32, 16), ('hClient', NvHandle, 20), ('hVaSpace', NvHandle, 24), ('rmStatus', NV_STATUS, 28)]) +@c.record +class UVM_UNREGISTER_GPU_VASPACE_PARAMS(c.Struct): + SIZE = 20 + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_UNREGISTER_GPU_VASPACE_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGISTER_CHANNEL_PARAMS(c.Struct): + SIZE = 56 + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hChannel: int + base: int + length: int + rmStatus: int +UVM_REGISTER_CHANNEL_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmCtrlFd', NvS32, 16), ('hClient', NvHandle, 20), ('hChannel', NvHandle, 24), ('base', NvU64, 32), ('length', NvU64, 40), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_UNREGISTER_CHANNEL_PARAMS(c.Struct): + SIZE = 28 + gpuUuid: struct_nv_uuid + hClient: int + hChannel: int + rmStatus: int +UVM_UNREGISTER_CHANNEL_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('hClient', NvHandle, 16), ('hChannel', NvHandle, 20), ('rmStatus', NV_STATUS, 24)]) +@c.record +class UVM_ENABLE_PEER_ACCESS_PARAMS(c.Struct): + SIZE = 36 + gpuUuidA: struct_nv_uuid + gpuUuidB: struct_nv_uuid + rmStatus: int +UVM_ENABLE_PEER_ACCESS_PARAMS.register_fields([('gpuUuidA', NvProcessorUuid, 0), ('gpuUuidB', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_DISABLE_PEER_ACCESS_PARAMS(c.Struct): + SIZE = 36 + gpuUuidA: struct_nv_uuid + gpuUuidB: struct_nv_uuid + rmStatus: int +UVM_DISABLE_PEER_ACCESS_PARAMS.register_fields([('gpuUuidA', NvProcessorUuid, 0), ('gpuUuidB', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_SET_RANGE_GROUP_PARAMS(c.Struct): + SIZE = 32 + rangeGroupId: int + requestedBase: int + length: int + rmStatus: int +UVM_SET_RANGE_GROUP_PARAMS.register_fields([('rangeGroupId', NvU64, 0), ('requestedBase', NvU64, 8), ('length', NvU64, 16), ('rmStatus', NV_STATUS, 24)]) +@c.record +class UVM_MAP_EXTERNAL_ALLOCATION_PARAMS(c.Struct): + SIZE = 9264 + base: int + length: int + offset: int + perGpuAttributes: c.Array[UvmGpuMappingAttributes, Literal[256]] + gpuAttributesCount: int + rmCtrlFd: int + hClient: int + hMemory: int + rmStatus: int +@c.record +class UvmGpuMappingAttributes(c.Struct): + SIZE = 36 + gpuUuid: struct_nv_uuid + gpuMappingType: int + gpuCachingType: int + gpuFormatType: int + gpuElementBits: int + gpuCompressionType: int +UvmGpuMappingAttributes.register_fields([('gpuUuid', NvProcessorUuid, 0), ('gpuMappingType', NvU32, 16), ('gpuCachingType', NvU32, 20), ('gpuFormatType', NvU32, 24), ('gpuElementBits', NvU32, 28), ('gpuCompressionType', NvU32, 32)]) +UVM_MAP_EXTERNAL_ALLOCATION_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('offset', NvU64, 16), ('perGpuAttributes', c.Array[UvmGpuMappingAttributes, Literal[256]], 24), ('gpuAttributesCount', NvU64, 9240), ('rmCtrlFd', NvS32, 9248), ('hClient', NvU32, 9252), ('hMemory', NvU32, 9256), ('rmStatus', NV_STATUS, 9260)]) +@c.record +class UVM_FREE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + rmStatus: int +UVM_FREE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_MEM_MAP_PARAMS(c.Struct): + SIZE = 24 + regionBase: ctypes.c_void_p + regionLength: int + rmStatus: int +UVM_MEM_MAP_PARAMS.register_fields([('regionBase', NvP64, 0), ('regionLength', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_DEBUG_ACCESS_MEMORY_PARAMS(c.Struct): + SIZE = 64 + sessionIndex: int + baseAddress: int + sizeInBytes: int + accessType: int + buffer: int + isBitmaskSet: int + bitmask: int + rmStatus: int +UVM_DEBUG_ACCESS_MEMORY_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('baseAddress', NvU64, 8), ('sizeInBytes', NvU64, 16), ('accessType', NvU32, 24), ('buffer', NvU64, 32), ('isBitmaskSet', NvBool, 40), ('bitmask', NvU64, 48), ('rmStatus', NV_STATUS, 56)]) +@c.record +class UVM_REGISTER_GPU_PARAMS(c.Struct): + SIZE = 40 + gpu_uuid: struct_nv_uuid + numaEnabled: int + numaNodeId: int + rmCtrlFd: int + hClient: int + hSmcPartRef: int + rmStatus: int +UVM_REGISTER_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('numaEnabled', NvBool, 16), ('numaNodeId', NvS32, 20), ('rmCtrlFd', NvS32, 24), ('hClient', NvHandle, 28), ('hSmcPartRef', NvHandle, 32), ('rmStatus', NV_STATUS, 36)]) +@c.record +class UVM_UNREGISTER_GPU_PARAMS(c.Struct): + SIZE = 20 + gpu_uuid: struct_nv_uuid + rmStatus: int +UVM_UNREGISTER_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_PAGEABLE_MEM_ACCESS_PARAMS(c.Struct): + SIZE = 8 + pageableMemAccess: int + rmStatus: int +UVM_PAGEABLE_MEM_ACCESS_PARAMS.register_fields([('pageableMemAccess', NvBool, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_PREVENT_MIGRATION_RANGE_GROUPS_PARAMS(c.Struct): + SIZE = 272 + rangeGroupIds: c.Array[ctypes.c_uint64, Literal[32]] + numGroupIds: int + rmStatus: int +UVM_PREVENT_MIGRATION_RANGE_GROUPS_PARAMS.register_fields([('rangeGroupIds', c.Array[NvU64, Literal[32]], 0), ('numGroupIds', NvU64, 256), ('rmStatus', NV_STATUS, 264)]) +@c.record +class UVM_ALLOW_MIGRATION_RANGE_GROUPS_PARAMS(c.Struct): + SIZE = 272 + rangeGroupIds: c.Array[ctypes.c_uint64, Literal[32]] + numGroupIds: int + rmStatus: int +UVM_ALLOW_MIGRATION_RANGE_GROUPS_PARAMS.register_fields([('rangeGroupIds', c.Array[NvU64, Literal[32]], 0), ('numGroupIds', NvU64, 256), ('rmStatus', NV_STATUS, 264)]) +@c.record +class UVM_SET_PREFERRED_LOCATION_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + preferredLocation: struct_nv_uuid + preferredCpuNumaNode: int + rmStatus: int +UVM_SET_PREFERRED_LOCATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('preferredLocation', NvProcessorUuid, 16), ('preferredCpuNumaNode', NvS32, 32), ('rmStatus', NV_STATUS, 36)]) +@c.record +class UVM_UNSET_PREFERRED_LOCATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_UNSET_PREFERRED_LOCATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_ENABLE_READ_DUPLICATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_ENABLE_READ_DUPLICATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_DISABLE_READ_DUPLICATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_DISABLE_READ_DUPLICATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_SET_ACCESSED_BY_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + accessedByUuid: struct_nv_uuid + rmStatus: int +UVM_SET_ACCESSED_BY_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('accessedByUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_UNSET_ACCESSED_BY_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + accessedByUuid: struct_nv_uuid + rmStatus: int +UVM_UNSET_ACCESSED_BY_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('accessedByUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_MIGRATE_PARAMS(c.Struct): + SIZE = 80 + base: int + length: int + destinationUuid: struct_nv_uuid + flags: int + semaphoreAddress: int + semaphorePayload: int + cpuNumaNode: int + userSpaceStart: int + userSpaceLength: int + rmStatus: int +UVM_MIGRATE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('destinationUuid', NvProcessorUuid, 16), ('flags', NvU32, 32), ('semaphoreAddress', NvU64, 40), ('semaphorePayload', NvU32, 48), ('cpuNumaNode', NvS32, 52), ('userSpaceStart', NvU64, 56), ('userSpaceLength', NvU64, 64), ('rmStatus', NV_STATUS, 72)]) +@c.record +class UVM_MIGRATE_RANGE_GROUP_PARAMS(c.Struct): + SIZE = 32 + rangeGroupId: int + destinationUuid: struct_nv_uuid + rmStatus: int +UVM_MIGRATE_RANGE_GROUP_PARAMS.register_fields([('rangeGroupId', NvU64, 0), ('destinationUuid', NvProcessorUuid, 8), ('rmStatus', NV_STATUS, 24)]) +@c.record +class UVM_ENABLE_SYSTEM_WIDE_ATOMICS_PARAMS(c.Struct): + SIZE = 20 + gpu_uuid: struct_nv_uuid + rmStatus: int +UVM_ENABLE_SYSTEM_WIDE_ATOMICS_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_DISABLE_SYSTEM_WIDE_ATOMICS_PARAMS(c.Struct): + SIZE = 20 + gpu_uuid: struct_nv_uuid + rmStatus: int +UVM_DISABLE_SYSTEM_WIDE_ATOMICS_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS(c.Struct): + SIZE = 56 + queueBuffer: int + queueBufferSize: int + controlBuffer: int + processor: struct_nv_uuid + allProcessors: int + uvmFd: int + rmStatus: int +UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS.register_fields([('queueBuffer', NvU64, 0), ('queueBufferSize', NvU64, 8), ('controlBuffer', NvU64, 16), ('processor', NvProcessorUuid, 24), ('allProcessors', NvU32, 40), ('uvmFd', NvU32, 44), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_TOOLS_SET_NOTIFICATION_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + notificationThreshold: int + rmStatus: int +UVM_TOOLS_SET_NOTIFICATION_THRESHOLD_PARAMS.register_fields([('notificationThreshold', NvU32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS_PARAMS(c.Struct): + SIZE = 16 + eventTypeFlags: int + rmStatus: int +UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS_PARAMS.register_fields([('eventTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS_PARAMS(c.Struct): + SIZE = 16 + eventTypeFlags: int + rmStatus: int +UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS_PARAMS.register_fields([('eventTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_ENABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterTypeFlags: int + rmStatus: int +UVM_TOOLS_ENABLE_COUNTERS_PARAMS.register_fields([('counterTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_DISABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterTypeFlags: int + rmStatus: int +UVM_TOOLS_DISABLE_COUNTERS_PARAMS.register_fields([('counterTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_READ_PROCESS_MEMORY_PARAMS(c.Struct): + SIZE = 40 + buffer: int + size: int + targetVa: int + bytesRead: int + rmStatus: int +UVM_TOOLS_READ_PROCESS_MEMORY_PARAMS.register_fields([('buffer', NvU64, 0), ('size', NvU64, 8), ('targetVa', NvU64, 16), ('bytesRead', NvU64, 24), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_WRITE_PROCESS_MEMORY_PARAMS(c.Struct): + SIZE = 40 + buffer: int + size: int + targetVa: int + bytesWritten: int + rmStatus: int +UVM_TOOLS_WRITE_PROCESS_MEMORY_PARAMS.register_fields([('buffer', NvU64, 0), ('size', NvU64, 8), ('targetVa', NvU64, 16), ('bytesWritten', NvU64, 24), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS(c.Struct): + SIZE = 16 + tablePtr: int + rmStatus: int +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS.register_fields([('tablePtr', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_MAP_DYNAMIC_PARALLELISM_REGION_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_MAP_DYNAMIC_PARALLELISM_REGION_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_UNMAP_EXTERNAL_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_UNMAP_EXTERNAL_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_FLUSH_EVENTS_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_TOOLS_FLUSH_EVENTS_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_ALLOC_SEMAPHORE_POOL_PARAMS(c.Struct): + SIZE = 9248 + base: int + length: int + perGpuAttributes: c.Array[UvmGpuMappingAttributes, Literal[256]] + gpuAttributesCount: int + rmStatus: int +UVM_ALLOC_SEMAPHORE_POOL_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('perGpuAttributes', c.Array[UvmGpuMappingAttributes, Literal[256]], 16), ('gpuAttributesCount', NvU64, 9232), ('rmStatus', NV_STATUS, 9240)]) +@c.record +class UVM_CLEAN_UP_ZOMBIE_RESOURCES_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_CLEAN_UP_ZOMBIE_RESOURCES_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_PAGEABLE_MEM_ACCESS_ON_GPU_PARAMS(c.Struct): + SIZE = 24 + gpu_uuid: struct_nv_uuid + pageableMemAccess: int + rmStatus: int +UVM_PAGEABLE_MEM_ACCESS_ON_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('pageableMemAccess', NvBool, 16), ('rmStatus', NV_STATUS, 20)]) +@c.record +class UVM_POPULATE_PAGEABLE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + flags: int + rmStatus: int +UVM_POPULATE_PAGEABLE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('flags', NvU32, 16), ('rmStatus', NV_STATUS, 20)]) +@c.record +class UVM_VALIDATE_VA_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + rmStatus: int +UVM_VALIDATE_VA_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_CREATE_EXTERNAL_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + rmStatus: int +UVM_CREATE_EXTERNAL_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_MAP_EXTERNAL_SPARSE_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_MAP_EXTERNAL_SPARSE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_MM_INITIALIZE_PARAMS(c.Struct): + SIZE = 8 + uvmFd: int + rmStatus: int +UVM_MM_INITIALIZE_PARAMS.register_fields([('uvmFd', NvS32, 0), ('rmStatus', NV_STATUS, 4)]) +UVM_TOOLS_INIT_EVENT_TRACKER_V2_PARAMS: TypeAlias = UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_V2_PARAMS: TypeAlias = UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS +@c.record +class UVM_ALLOC_DEVICE_P2P_PARAMS(c.Struct): + SIZE = 56 + base: int + length: int + offset: int + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hMemory: int + rmStatus: int +UVM_ALLOC_DEVICE_P2P_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('offset', NvU64, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmCtrlFd', NvS32, 40), ('hClient', NvU32, 44), ('hMemory', NvU32, 48), ('rmStatus', NV_STATUS, 52)]) +@c.record +class UVM_CLEAR_ALL_ACCESS_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_CLEAR_ALL_ACCESS_COUNTERS_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_IS_8_SUPPORTED_PARAMS(c.Struct): + SIZE = 8 + is8Supported: int + rmStatus: int +UVM_IS_8_SUPPORTED_PARAMS.register_fields([('is8Supported', NvU32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_INITIALIZE_PARAMS(c.Struct): + SIZE = 16 + flags: int + rmStatus: int +UVM_INITIALIZE_PARAMS.register_fields([('flags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class nv_pci_info_t(c.Struct): + SIZE = 12 + domain: int + bus: int + slot: int + function: int + vendor_id: int + device_id: int +NvU16: TypeAlias = ctypes.c_uint16 +nv_pci_info_t.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('function', NvU8, 6), ('vendor_id', NvU16, 8), ('device_id', NvU16, 10)]) +@c.record +class struct_nv_ioctl_xfer(c.Struct): + SIZE = 16 + cmd: int + size: int + ptr: ctypes.c_void_p +struct_nv_ioctl_xfer.register_fields([('cmd', NvU32, 0), ('size', NvU32, 4), ('ptr', NvP64, 8)]) +nv_ioctl_xfer_t: TypeAlias = struct_nv_ioctl_xfer +@c.record +class struct_nv_ioctl_card_info(c.Struct): + SIZE = 72 + valid: int + pci_info: nv_pci_info_t + gpu_id: int + interrupt_line: int + reg_address: int + reg_size: int + fb_address: int + fb_size: int + minor_number: int + dev_name: c.Array[ctypes.c_ubyte, Literal[10]] +struct_nv_ioctl_card_info.register_fields([('valid', NvBool, 0), ('pci_info', nv_pci_info_t, 4), ('gpu_id', NvU32, 16), ('interrupt_line', NvU16, 20), ('reg_address', NvU64, 24), ('reg_size', NvU64, 32), ('fb_address', NvU64, 40), ('fb_size', NvU64, 48), ('minor_number', NvU32, 56), ('dev_name', c.Array[NvU8, Literal[10]], 60)]) +nv_ioctl_card_info_t: TypeAlias = struct_nv_ioctl_card_info +@c.record +class struct_nv_ioctl_alloc_os_event(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + fd: int + Status: int +struct_nv_ioctl_alloc_os_event.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('fd', NvU32, 8), ('Status', NvU32, 12)]) +nv_ioctl_alloc_os_event_t: TypeAlias = struct_nv_ioctl_alloc_os_event +@c.record +class struct_nv_ioctl_free_os_event(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + fd: int + Status: int +struct_nv_ioctl_free_os_event.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('fd', NvU32, 8), ('Status', NvU32, 12)]) +nv_ioctl_free_os_event_t: TypeAlias = struct_nv_ioctl_free_os_event +@c.record +class struct_nv_ioctl_status_code(c.Struct): + SIZE = 12 + domain: int + bus: int + slot: int + status: int +struct_nv_ioctl_status_code.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('status', NvU32, 8)]) +nv_ioctl_status_code_t: TypeAlias = struct_nv_ioctl_status_code +@c.record +class struct_nv_ioctl_rm_api_version(c.Struct): + SIZE = 72 + cmd: int + reply: int + versionString: c.Array[ctypes.c_char, Literal[64]] +struct_nv_ioctl_rm_api_version.register_fields([('cmd', NvU32, 0), ('reply', NvU32, 4), ('versionString', c.Array[ctypes.c_char, Literal[64]], 8)]) +nv_ioctl_rm_api_version_t: TypeAlias = struct_nv_ioctl_rm_api_version +@c.record +class struct_nv_ioctl_query_device_intr(c.Struct): + SIZE = 8 + intrStatus: int + status: int +struct_nv_ioctl_query_device_intr.register_fields([('intrStatus', NvU32, 0), ('status', NvU32, 4)]) +nv_ioctl_query_device_intr: TypeAlias = struct_nv_ioctl_query_device_intr +@c.record +class struct_nv_ioctl_sys_params(c.Struct): + SIZE = 8 + memblock_size: int +struct_nv_ioctl_sys_params.register_fields([('memblock_size', NvU64, 0)]) +nv_ioctl_sys_params_t: TypeAlias = struct_nv_ioctl_sys_params +@c.record +class struct_nv_ioctl_register_fd(c.Struct): + SIZE = 4 + ctl_fd: int +struct_nv_ioctl_register_fd.register_fields([('ctl_fd', ctypes.c_int32, 0)]) +nv_ioctl_register_fd_t: TypeAlias = struct_nv_ioctl_register_fd +@c.record +class struct_nv_ioctl_export_to_dma_buf_fd(c.Struct): + SIZE = 2608 + fd: int + hClient: int + totalObjects: int + numObjects: int + index: int + totalSize: int + mappingType: int + handles: c.Array[ctypes.c_uint32, Literal[128]] + offsets: c.Array[ctypes.c_uint64, Literal[128]] + sizes: c.Array[ctypes.c_uint64, Literal[128]] + status: int +struct_nv_ioctl_export_to_dma_buf_fd.register_fields([('fd', ctypes.c_int32, 0), ('hClient', NvHandle, 4), ('totalObjects', NvU32, 8), ('numObjects', NvU32, 12), ('index', NvU32, 16), ('totalSize', NvU64, 24), ('mappingType', NvU8, 32), ('handles', c.Array[NvHandle, Literal[128]], 36), ('offsets', c.Array[NvU64, Literal[128]], 552), ('sizes', c.Array[NvU64, Literal[128]], 1576), ('status', NvU32, 2600)]) +nv_ioctl_export_to_dma_buf_fd_t: TypeAlias = struct_nv_ioctl_export_to_dma_buf_fd +@c.record +class struct_nv_ioctl_wait_open_complete(c.Struct): + SIZE = 8 + rc: int + adapterStatus: int +struct_nv_ioctl_wait_open_complete.register_fields([('rc', ctypes.c_int32, 0), ('adapterStatus', NvU32, 4)]) +nv_ioctl_wait_open_complete_t: TypeAlias = struct_nv_ioctl_wait_open_complete +@c.record +class struct_offline_addresses(c.Struct): + SIZE = 520 + addresses: c.Array[ctypes.c_uint64, Literal[64]] + numEntries: int +uint64_t: TypeAlias = ctypes.c_uint64 +uint32_t: TypeAlias = ctypes.c_uint32 +struct_offline_addresses.register_fields([('addresses', c.Array[uint64_t, Literal[64]], 0), ('numEntries', uint32_t, 512)]) +nv_offline_addresses_t: TypeAlias = struct_offline_addresses +@c.record +class struct_nv_ioctl_numa_info(c.Struct): + SIZE = 560 + nid: int + status: int + memblock_size: int + numa_mem_addr: int + numa_mem_size: int + use_auto_online: int + offline_addresses: struct_offline_addresses +int32_t: TypeAlias = ctypes.c_int32 +uint8_t: TypeAlias = ctypes.c_ubyte +struct_nv_ioctl_numa_info.register_fields([('nid', int32_t, 0), ('status', int32_t, 4), ('memblock_size', uint64_t, 8), ('numa_mem_addr', uint64_t, 16), ('numa_mem_size', uint64_t, 24), ('use_auto_online', uint8_t, 32), ('offline_addresses', nv_offline_addresses_t, 40)]) +nv_ioctl_numa_info_t: TypeAlias = struct_nv_ioctl_numa_info +@c.record +class struct_nv_ioctl_set_numa_status(c.Struct): + SIZE = 4 + status: int +struct_nv_ioctl_set_numa_status.register_fields([('status', int32_t, 0)]) +nv_ioctl_set_numa_status_t: TypeAlias = struct_nv_ioctl_set_numa_status +@c.record +class nv_ioctl_nvos02_parameters_with_fd(c.Struct): + SIZE = 56 + params: NVOS02_PARAMETERS + fd: int +@c.record +class NVOS02_PARAMETERS(c.Struct): + SIZE = 48 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + flags: int + pMemory: ctypes.c_void_p + limit: int + status: int +NVOS02_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('flags', NvV32, 16), ('pMemory', NvP64, 24), ('limit', NvU64, 32), ('status', NvV32, 40)]) +nv_ioctl_nvos02_parameters_with_fd.register_fields([('params', NVOS02_PARAMETERS, 0), ('fd', ctypes.c_int32, 48)]) +@c.record +class nv_ioctl_nvos33_parameters_with_fd(c.Struct): + SIZE = 56 + params: NVOS33_PARAMETERS + fd: int +@c.record +class NVOS33_PARAMETERS(c.Struct): + SIZE = 48 + hClient: int + hDevice: int + hMemory: int + offset: int + length: int + pLinearAddress: ctypes.c_void_p + status: int + flags: int +NVOS33_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('offset', NvU64, 16), ('length', NvU64, 24), ('pLinearAddress', NvP64, 32), ('status', NvU32, 40), ('flags', NvU32, 44)]) +nv_ioctl_nvos33_parameters_with_fd.register_fields([('params', NVOS33_PARAMETERS, 0), ('fd', ctypes.c_int32, 48)]) +@c.record +class struct_NV_MEMORY_DESC_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + addressSpace: int + cacheAttrib: int +struct_NV_MEMORY_DESC_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('addressSpace', NvU32, 16), ('cacheAttrib', NvU32, 20)]) +NV_MEMORY_DESC_PARAMS: TypeAlias = struct_NV_MEMORY_DESC_PARAMS +@c.record +class struct_NV_CHANNEL_ALLOC_PARAMS(c.Struct): + SIZE = 368 + hObjectError: int + hObjectBuffer: int + gpFifoOffset: int + gpFifoEntries: int + flags: int + hContextShare: int + hVASpace: int + hUserdMemory: c.Array[ctypes.c_uint32, Literal[8]] + userdOffset: c.Array[ctypes.c_uint64, Literal[8]] + engineType: int + cid: int + subDeviceId: int + hObjectEccError: int + instanceMem: struct_NV_MEMORY_DESC_PARAMS + userdMem: struct_NV_MEMORY_DESC_PARAMS + ramfcMem: struct_NV_MEMORY_DESC_PARAMS + mthdbufMem: struct_NV_MEMORY_DESC_PARAMS + hPhysChannelGroup: int + internalFlags: int + errorNotifierMem: struct_NV_MEMORY_DESC_PARAMS + eccErrorNotifierMem: struct_NV_MEMORY_DESC_PARAMS + ProcessID: int + SubProcessID: int + encryptIv: c.Array[ctypes.c_uint32, Literal[3]] + decryptIv: c.Array[ctypes.c_uint32, Literal[3]] + hmacNonce: c.Array[ctypes.c_uint32, Literal[8]] + tpcConfigID: int +struct_NV_CHANNEL_ALLOC_PARAMS.register_fields([('hObjectError', NvHandle, 0), ('hObjectBuffer', NvHandle, 4), ('gpFifoOffset', NvU64, 8), ('gpFifoEntries', NvU32, 16), ('flags', NvU32, 20), ('hContextShare', NvHandle, 24), ('hVASpace', NvHandle, 28), ('hUserdMemory', c.Array[NvHandle, Literal[8]], 32), ('userdOffset', c.Array[NvU64, Literal[8]], 64), ('engineType', NvU32, 128), ('cid', NvU32, 132), ('subDeviceId', NvU32, 136), ('hObjectEccError', NvHandle, 140), ('instanceMem', NV_MEMORY_DESC_PARAMS, 144), ('userdMem', NV_MEMORY_DESC_PARAMS, 168), ('ramfcMem', NV_MEMORY_DESC_PARAMS, 192), ('mthdbufMem', NV_MEMORY_DESC_PARAMS, 216), ('hPhysChannelGroup', NvHandle, 240), ('internalFlags', NvU32, 244), ('errorNotifierMem', NV_MEMORY_DESC_PARAMS, 248), ('eccErrorNotifierMem', NV_MEMORY_DESC_PARAMS, 272), ('ProcessID', NvU32, 296), ('SubProcessID', NvU32, 300), ('encryptIv', c.Array[NvU32, Literal[3]], 304), ('decryptIv', c.Array[NvU32, Literal[3]], 316), ('hmacNonce', c.Array[NvU32, Literal[8]], 328), ('tpcConfigID', NvU32, 360)]) +NV_CHANNEL_ALLOC_PARAMS: TypeAlias = struct_NV_CHANNEL_ALLOC_PARAMS +NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS: TypeAlias = struct_NV_CHANNEL_ALLOC_PARAMS +@c.record +class NVOS00_PARAMETERS(c.Struct): + SIZE = 16 + hRoot: int + hObjectParent: int + hObjectOld: int + status: int +NVOS00_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectOld', NvHandle, 8), ('status', NvV32, 12)]) +@c.record +class NVOS05_PARAMETERS(c.Struct): + SIZE = 20 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + status: int +NVOS05_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('status', NvV32, 16)]) +Callback1ArgVoidReturn: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +Callback5ArgVoidReturn: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +@c.record +class NVOS10_EVENT_KERNEL_CALLBACK(c.Struct): + SIZE = 16 + func: c.CFUNCTYPE[None, [ctypes.c_void_p]] + arg: ctypes.c_void_p +NVOS10_EVENT_KERNEL_CALLBACK.register_fields([('func', Callback1ArgVoidReturn, 0), ('arg', ctypes.c_void_p, 8)]) +@c.record +class NVOS10_EVENT_KERNEL_CALLBACK_EX(c.Struct): + SIZE = 16 + func: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] + arg: ctypes.c_void_p +NVOS10_EVENT_KERNEL_CALLBACK_EX.register_fields([('func', Callback5ArgVoidReturn, 0), ('arg', ctypes.c_void_p, 8)]) +@c.record +class NVOS_I2C_ACCESS_PARAMS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + paramSize: int + paramStructPtr: ctypes.c_void_p + status: int +NVOS_I2C_ACCESS_PARAMS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('paramSize', NvU32, 8), ('paramStructPtr', NvP64, 16), ('status', NvV32, 24)]) +@c.record +class NVOS21_PARAMETERS(c.Struct): + SIZE = 32 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + pAllocParms: ctypes.c_void_p + paramsSize: int + status: int +NVOS21_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('pAllocParms', NvP64, 16), ('paramsSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS64_PARAMETERS(c.Struct): + SIZE = 48 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + pAllocParms: ctypes.c_void_p + pRightsRequested: ctypes.c_void_p + paramsSize: int + flags: int + status: int +NVOS64_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('pAllocParms', NvP64, 16), ('pRightsRequested', NvP64, 24), ('paramsSize', NvU32, 32), ('flags', NvU32, 36), ('status', NvV32, 40)]) +@c.record +class NVOS62_PARAMETERS(c.Struct): + SIZE = 24 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + paramSize: int + status: int +NVOS62_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('paramSize', NvU32, 16), ('status', NvV32, 20)]) +@c.record +class NVOS65_PARAMETERS(c.Struct): + SIZE = 32 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + paramSize: int + versionMagic: int + maskSize: int + status: int +NVOS65_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('paramSize', NvU32, 16), ('versionMagic', NvU32, 20), ('maskSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS30_PARAMETERS(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hChannel: int + numChannels: int + phClients: ctypes.c_void_p + phDevices: ctypes.c_void_p + phChannels: ctypes.c_void_p + flags: int + timeout: int + status: int +NVOS30_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hChannel', NvHandle, 8), ('numChannels', NvV32, 12), ('phClients', NvP64, 16), ('phDevices', NvP64, 24), ('phChannels', NvP64, 32), ('flags', NvV32, 40), ('timeout', NvV32, 44), ('status', NvV32, 48)]) +BindResultFunc: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +@c.record +class NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR_PARAMETERS(c.Struct): + SIZE = 16 + sgt: ctypes.c_void_p + gem: ctypes.c_void_p +NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR_PARAMETERS.register_fields([('sgt', NvP64, 0), ('gem', NvP64, 8)]) +@c.record +class NVOS32_BLOCKINFO(c.Struct): + SIZE = 24 + startOffset: int + size: int + flags: int +NVOS32_BLOCKINFO.register_fields([('startOffset', NvU64, 0), ('size', NvU64, 8), ('flags', NvU32, 16)]) +@c.record +class NVOS32_PARAMETERS(c.Struct): + SIZE = 184 + hRoot: int + hObjectParent: int + function: int + hVASpace: int + ivcHeapNumber: int + status: int + total: int + free: int + data: NVOS32_PARAMETERS_data +NvS16: TypeAlias = ctypes.c_int16 +@c.record +class NVOS32_PARAMETERS_data(c.Struct): + SIZE = 144 + AllocSize: NVOS32_PARAMETERS_data_AllocSize + AllocTiledPitchHeight: NVOS32_PARAMETERS_data_AllocTiledPitchHeight + Free: NVOS32_PARAMETERS_data_Free + ReleaseCompr: NVOS32_PARAMETERS_data_ReleaseCompr + ReacquireCompr: NVOS32_PARAMETERS_data_ReacquireCompr + Info: NVOS32_PARAMETERS_data_Info + Dump: NVOS32_PARAMETERS_data_Dump + AllocSizeRange: NVOS32_PARAMETERS_data_AllocSizeRange + AllocHintAlignment: NVOS32_PARAMETERS_data_AllocHintAlignment + HwAlloc: NVOS32_PARAMETERS_data_HwAlloc + HwFree: NVOS32_PARAMETERS_data_HwFree + AllocOsDesc: NVOS32_PARAMETERS_data_AllocOsDesc +@c.record +class NVOS32_PARAMETERS_data_AllocSize(c.Struct): + SIZE = 120 + owner: int + hMemory: int + type: int + flags: int + attr: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + width: int + height: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + rangeBegin: int + rangeEnd: int + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocSize.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('attr', NvU32, 16), ('format', NvU32, 20), ('comprCovg', NvU32, 24), ('zcullCovg', NvU32, 28), ('partitionStride', NvU32, 32), ('width', NvU32, 36), ('height', NvU32, 40), ('size', NvU64, 48), ('alignment', NvU64, 56), ('offset', NvU64, 64), ('limit', NvU64, 72), ('address', NvP64, 80), ('rangeBegin', NvU64, 88), ('rangeEnd', NvU64, 96), ('attr2', NvU32, 104), ('ctagOffset', NvU32, 108), ('numaNode', NvS32, 112)]) +@c.record +class NVOS32_PARAMETERS_data_AllocTiledPitchHeight(c.Struct): + SIZE = 120 + owner: int + hMemory: int + type: int + flags: int + height: int + pitch: int + attr: int + width: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + rangeBegin: int + rangeEnd: int + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocTiledPitchHeight.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('height', NvU32, 16), ('pitch', NvS32, 20), ('attr', NvU32, 24), ('width', NvU32, 28), ('format', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('partitionStride', NvU32, 44), ('size', NvU64, 48), ('alignment', NvU64, 56), ('offset', NvU64, 64), ('limit', NvU64, 72), ('address', NvP64, 80), ('rangeBegin', NvU64, 88), ('rangeEnd', NvU64, 96), ('attr2', NvU32, 104), ('ctagOffset', NvU32, 108), ('numaNode', NvS32, 112)]) +@c.record +class NVOS32_PARAMETERS_data_Free(c.Struct): + SIZE = 12 + owner: int + hMemory: int + flags: int +NVOS32_PARAMETERS_data_Free.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('flags', NvU32, 8)]) +@c.record +class NVOS32_PARAMETERS_data_ReleaseCompr(c.Struct): + SIZE = 12 + owner: int + flags: int + hMemory: int +NVOS32_PARAMETERS_data_ReleaseCompr.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('hMemory', NvHandle, 8)]) +@c.record +class NVOS32_PARAMETERS_data_ReacquireCompr(c.Struct): + SIZE = 12 + owner: int + flags: int + hMemory: int +NVOS32_PARAMETERS_data_ReacquireCompr.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('hMemory', NvHandle, 8)]) +@c.record +class NVOS32_PARAMETERS_data_Info(c.Struct): + SIZE = 32 + attr: int + offset: int + size: int + base: int +NVOS32_PARAMETERS_data_Info.register_fields([('attr', NvU32, 0), ('offset', NvU64, 8), ('size', NvU64, 16), ('base', NvU64, 24)]) +@c.record +class NVOS32_PARAMETERS_data_Dump(c.Struct): + SIZE = 24 + flags: int + pBuffer: ctypes.c_void_p + numBlocks: int +NVOS32_PARAMETERS_data_Dump.register_fields([('flags', NvU32, 0), ('pBuffer', NvP64, 8), ('numBlocks', NvU32, 16)]) +@c.record +class NVOS32_PARAMETERS_data_AllocSizeRange(c.Struct): + SIZE = 112 + owner: int + hMemory: int + type: int + flags: int + attr: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + size: int + alignment: int + offset: int + limit: int + rangeBegin: int + rangeEnd: int + address: ctypes.c_void_p + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocSizeRange.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('attr', NvU32, 16), ('format', NvU32, 20), ('comprCovg', NvU32, 24), ('zcullCovg', NvU32, 28), ('partitionStride', NvU32, 32), ('size', NvU64, 40), ('alignment', NvU64, 48), ('offset', NvU64, 56), ('limit', NvU64, 64), ('rangeBegin', NvU64, 72), ('rangeEnd', NvU64, 80), ('address', NvP64, 88), ('attr2', NvU32, 96), ('ctagOffset', NvU32, 100), ('numaNode', NvS32, 104)]) +@c.record +class NVOS32_PARAMETERS_data_AllocHintAlignment(c.Struct): + SIZE = 88 + alignType: int + alignAttr: int + alignInputFlags: int + alignSize: int + alignHeight: int + alignWidth: int + alignPitch: int + alignPad: int + alignMask: int + alignOutputFlags: c.Array[ctypes.c_uint32, Literal[4]] + alignBank: c.Array[ctypes.c_uint32, Literal[4]] + alignKind: int + alignAdjust: int + alignAttr2: int +NVOS32_PARAMETERS_data_AllocHintAlignment.register_fields([('alignType', NvU32, 0), ('alignAttr', NvU32, 4), ('alignInputFlags', NvU32, 8), ('alignSize', NvU64, 16), ('alignHeight', NvU32, 24), ('alignWidth', NvU32, 28), ('alignPitch', NvU32, 32), ('alignPad', NvU32, 36), ('alignMask', NvU32, 40), ('alignOutputFlags', c.Array[NvU32, Literal[4]], 44), ('alignBank', c.Array[NvU32, Literal[4]], 60), ('alignKind', NvU32, 76), ('alignAdjust', NvU32, 80), ('alignAttr2', NvU32, 84)]) +@c.record +class NVOS32_PARAMETERS_data_HwAlloc(c.Struct): + SIZE = 144 + allocOwner: int + allochMemory: int + flags: int + allocType: int + allocAttr: int + allocInputFlags: int + allocSize: int + allocHeight: int + allocWidth: int + allocPitch: int + allocMask: int + allocComprCovg: int + allocZcullCovg: int + bindResultFunc: ctypes.c_void_p + pHandle: ctypes.c_void_p + hResourceHandle: int + retAttr: int + kind: int + osDeviceHandle: int + allocAttr2: int + retAttr2: int + allocAddr: int + comprInfo: NVOS32_PARAMETERS_data_HwAlloc_comprInfo + uncompressedKind: int +@c.record +class NVOS32_PARAMETERS_data_HwAlloc_comprInfo(c.Struct): + SIZE = 24 + compPageShift: int + compressedKind: int + compTagLineMin: int + compPageIndexLo: int + compPageIndexHi: int + compTagLineMultiplier: int +NVOS32_PARAMETERS_data_HwAlloc_comprInfo.register_fields([('compPageShift', NvU32, 0), ('compressedKind', NvU32, 4), ('compTagLineMin', NvU32, 8), ('compPageIndexLo', NvU32, 12), ('compPageIndexHi', NvU32, 16), ('compTagLineMultiplier', NvU32, 20)]) +NVOS32_PARAMETERS_data_HwAlloc.register_fields([('allocOwner', NvU32, 0), ('allochMemory', NvHandle, 4), ('flags', NvU32, 8), ('allocType', NvU32, 12), ('allocAttr', NvU32, 16), ('allocInputFlags', NvU32, 20), ('allocSize', NvU64, 24), ('allocHeight', NvU32, 32), ('allocWidth', NvU32, 36), ('allocPitch', NvU32, 40), ('allocMask', NvU32, 44), ('allocComprCovg', NvU32, 48), ('allocZcullCovg', NvU32, 52), ('bindResultFunc', NvP64, 56), ('pHandle', NvP64, 64), ('hResourceHandle', NvHandle, 72), ('retAttr', NvU32, 76), ('kind', NvU32, 80), ('osDeviceHandle', NvU64, 88), ('allocAttr2', NvU32, 96), ('retAttr2', NvU32, 100), ('allocAddr', NvU64, 104), ('comprInfo', NVOS32_PARAMETERS_data_HwAlloc_comprInfo, 112), ('uncompressedKind', NvU32, 136)]) +@c.record +class NVOS32_PARAMETERS_data_HwFree(c.Struct): + SIZE = 8 + hResourceHandle: int + flags: int +NVOS32_PARAMETERS_data_HwFree.register_fields([('hResourceHandle', NvHandle, 0), ('flags', NvU32, 4)]) +@c.record +class NVOS32_PARAMETERS_data_AllocOsDesc(c.Struct): + SIZE = 48 + hMemory: int + type: int + flags: int + attr: int + attr2: int + descriptor: ctypes.c_void_p + limit: int + descriptorType: int +NVOS32_PARAMETERS_data_AllocOsDesc.register_fields([('hMemory', NvHandle, 0), ('type', NvU32, 4), ('flags', NvU32, 8), ('attr', NvU32, 12), ('attr2', NvU32, 16), ('descriptor', NvP64, 24), ('limit', NvU64, 32), ('descriptorType', NvU32, 40)]) +NVOS32_PARAMETERS_data.register_fields([('AllocSize', NVOS32_PARAMETERS_data_AllocSize, 0), ('AllocTiledPitchHeight', NVOS32_PARAMETERS_data_AllocTiledPitchHeight, 0), ('Free', NVOS32_PARAMETERS_data_Free, 0), ('ReleaseCompr', NVOS32_PARAMETERS_data_ReleaseCompr, 0), ('ReacquireCompr', NVOS32_PARAMETERS_data_ReacquireCompr, 0), ('Info', NVOS32_PARAMETERS_data_Info, 0), ('Dump', NVOS32_PARAMETERS_data_Dump, 0), ('AllocSizeRange', NVOS32_PARAMETERS_data_AllocSizeRange, 0), ('AllocHintAlignment', NVOS32_PARAMETERS_data_AllocHintAlignment, 0), ('HwAlloc', NVOS32_PARAMETERS_data_HwAlloc, 0), ('HwFree', NVOS32_PARAMETERS_data_HwFree, 0), ('AllocOsDesc', NVOS32_PARAMETERS_data_AllocOsDesc, 0)]) +NVOS32_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('function', NvU32, 8), ('hVASpace', NvHandle, 12), ('ivcHeapNumber', NvS16, 16), ('status', NvV32, 20), ('total', NvU64, 24), ('free', NvU64, 32), ('data', NVOS32_PARAMETERS_data, 40)]) +@c.record +class NVOS32_HEAP_DUMP_BLOCK(c.Struct): + SIZE = 32 + owner: int + format: int + begin: int + align: int + end: int +NVOS32_HEAP_DUMP_BLOCK.register_fields([('owner', NvU32, 0), ('format', NvU32, 4), ('begin', NvU64, 8), ('align', NvU64, 16), ('end', NvU64, 24)]) +@c.record +class NV_CONTEXT_DMA_ALLOCATION_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + flags: int + hMemory: int + offset: int + limit: int +NV_CONTEXT_DMA_ALLOCATION_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('flags', NvV32, 4), ('hMemory', NvHandle, 8), ('offset', NvU64, 16), ('limit', NvU64, 24)]) +@c.record +class NV_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 128 + owner: int + type: int + flags: int + width: int + height: int + pitch: int + attr: int + attr2: int + format: int + comprCovg: int + zcullCovg: int + rangeLo: int + rangeHi: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + ctagOffset: int + hVASpace: int + internalflags: int + tag: int + numaNode: int +NV_MEMORY_ALLOCATION_PARAMS.register_fields([('owner', NvU32, 0), ('type', NvU32, 4), ('flags', NvU32, 8), ('width', NvU32, 12), ('height', NvU32, 16), ('pitch', NvS32, 20), ('attr', NvU32, 24), ('attr2', NvU32, 28), ('format', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('rangeLo', NvU64, 48), ('rangeHi', NvU64, 56), ('size', NvU64, 64), ('alignment', NvU64, 72), ('offset', NvU64, 80), ('limit', NvU64, 88), ('address', NvP64, 96), ('ctagOffset', NvU32, 104), ('hVASpace', NvHandle, 108), ('internalflags', NvU32, 112), ('tag', NvU32, 116), ('numaNode', NvS32, 120)]) +@c.record +class NV_OS_DESC_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 40 + type: int + flags: int + attr: int + attr2: int + descriptor: ctypes.c_void_p + limit: int + descriptorType: int + tag: int +NV_OS_DESC_MEMORY_ALLOCATION_PARAMS.register_fields([('type', NvU32, 0), ('flags', NvU32, 4), ('attr', NvU32, 8), ('attr2', NvU32, 12), ('descriptor', NvP64, 16), ('limit', NvU64, 24), ('descriptorType', NvU32, 32), ('tag', NvU32, 36)]) +@c.record +class NV_USER_LOCAL_DESC_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 32 + flags: int + physAddr: int + size: int + tag: int + bGuestAllocated: int +NV_USER_LOCAL_DESC_MEMORY_ALLOCATION_PARAMS.register_fields([('flags', NvU32, 0), ('physAddr', NvU64, 8), ('size', NvU64, 16), ('tag', NvU32, 24), ('bGuestAllocated', NvBool, 28)]) +@c.record +class NV_MEMORY_HW_RESOURCES_ALLOCATION_PARAMS(c.Struct): + SIZE = 120 + owner: int + flags: int + type: int + attr: int + attr2: int + height: int + width: int + pitch: int + alignment: int + comprCovg: int + zcullCovg: int + kind: int + bindResultFunc: ctypes.c_void_p + pHandle: ctypes.c_void_p + osDeviceHandle: int + size: int + allocAddr: int + compPageShift: int + compressedKind: int + compTagLineMin: int + compPageIndexLo: int + compPageIndexHi: int + compTagLineMultiplier: int + uncompressedKind: int + tag: int +NV_MEMORY_HW_RESOURCES_ALLOCATION_PARAMS.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('type', NvU32, 8), ('attr', NvU32, 12), ('attr2', NvU32, 16), ('height', NvU32, 20), ('width', NvU32, 24), ('pitch', NvU32, 28), ('alignment', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('kind', NvU32, 44), ('bindResultFunc', NvP64, 48), ('pHandle', NvP64, 56), ('osDeviceHandle', NvU64, 64), ('size', NvU64, 72), ('allocAddr', NvU64, 80), ('compPageShift', NvU32, 88), ('compressedKind', NvU32, 92), ('compTagLineMin', NvU32, 96), ('compPageIndexLo', NvU32, 100), ('compPageIndexHi', NvU32, 104), ('compTagLineMultiplier', NvU32, 108), ('uncompressedKind', NvU32, 112), ('tag', NvU32, 116)]) +@c.record +class NVOS34_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + hMemory: int + pLinearAddress: ctypes.c_void_p + status: int + flags: int +NVOS34_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('pLinearAddress', NvP64, 16), ('status', NvU32, 24), ('flags', NvU32, 28)]) +@c.record +class NVOS38_PARAMETERS(c.Struct): + SIZE = 72 + hClient: int + hObject: int + AccessType: int + DevNodeLength: int + pDevNode: ctypes.c_void_p + ParmStrLength: int + pParmStr: ctypes.c_void_p + BinaryDataLength: int + pBinaryData: ctypes.c_void_p + Data: int + Entry: int + status: int +NVOS38_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('AccessType', NvV32, 8), ('DevNodeLength', NvV32, 12), ('pDevNode', NvP64, 16), ('ParmStrLength', NvV32, 24), ('pParmStr', NvP64, 32), ('BinaryDataLength', NvV32, 40), ('pBinaryData', NvP64, 48), ('Data', NvV32, 56), ('Entry', NvV32, 60), ('status', NvV32, 64)]) +@c.record +class NVOS39_PARAMETERS(c.Struct): + SIZE = 56 + hObjectParent: int + hSubDevice: int + hObjectNew: int + hClass: int + flags: int + selector: int + hMemory: int + offset: int + limit: int + status: int +NVOS39_PARAMETERS.register_fields([('hObjectParent', NvHandle, 0), ('hSubDevice', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('flags', NvV32, 16), ('selector', NvU32, 20), ('hMemory', NvHandle, 24), ('offset', NvU64, 32), ('limit', NvU64, 40), ('status', NvV32, 48)]) +@c.record +class NvUnixEvent(c.Struct): + SIZE = 16 + hObject: int + NotifyIndex: int + info32: int + info16: int +NvUnixEvent.register_fields([('hObject', NvHandle, 0), ('NotifyIndex', NvV32, 4), ('info32', NvV32, 8), ('info16', NvU16, 12)]) +@c.record +class NVOS41_PARAMETERS(c.Struct): + SIZE = 16 + pEvent: ctypes.c_void_p + MoreEvents: int + status: int +NVOS41_PARAMETERS.register_fields([('pEvent', NvP64, 0), ('MoreEvents', NvV32, 8), ('status', NvV32, 12)]) +@c.record +class NVOS2C_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + offset: int + bar: int + bytes: int + write: int + data: int + status: int +NVOS2C_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('offset', NvU32, 8), ('bar', NvU32, 12), ('bytes', NvU32, 16), ('write', NvU32, 20), ('data', NvU32, 24), ('status', NvU32, 28)]) +@c.record +class NVOS46_PARAMETERS(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hDma: int + hMemory: int + offset: int + length: int + flags: int + dmaOffset: int + status: int +NVOS46_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hDma', NvHandle, 8), ('hMemory', NvHandle, 12), ('offset', NvU64, 16), ('length', NvU64, 24), ('flags', NvV32, 32), ('dmaOffset', NvU64, 40), ('status', NvV32, 48)]) +@c.record +class NVOS47_PARAMETERS(c.Struct): + SIZE = 48 + hClient: int + hDevice: int + hDma: int + hMemory: int + flags: int + dmaOffset: int + size: int + status: int +NVOS47_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hDma', NvHandle, 8), ('hMemory', NvHandle, 12), ('flags', NvV32, 16), ('dmaOffset', NvU64, 24), ('size', NvU64, 32), ('status', NvV32, 40)]) +@c.record +class NVOS49_PARAMETERS(c.Struct): + SIZE = 16 + hClient: int + hChannel: int + hCtxDma: int + status: int +NVOS49_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('hCtxDma', NvHandle, 8), ('status', NvV32, 12)]) +@c.record +class NVOS54_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hObject: int + cmd: int + flags: int + params: ctypes.c_void_p + paramsSize: int + status: int +NVOS54_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvV32, 8), ('flags', NvU32, 12), ('params', NvP64, 16), ('paramsSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS63_PARAMETERS(c.Struct): + SIZE = 20 + hClient: int + hObject: int + cmd: int + paramsSize: int + status: int +NVOS63_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvV32, 8), ('paramsSize', NvU32, 12), ('status', NvV32, 16)]) +@c.record +class NVOS55_PARAMETERS(c.Struct): + SIZE = 28 + hClient: int + hParent: int + hObject: int + hClientSrc: int + hObjectSrc: int + flags: int + status: int +NVOS55_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClientSrc', NvHandle, 12), ('hObjectSrc', NvHandle, 16), ('flags', NvU32, 20), ('status', NvU32, 24)]) +@c.record +class NVOS56_PARAMETERS(c.Struct): + SIZE = 40 + hClient: int + hDevice: int + hMemory: int + pOldCpuAddress: ctypes.c_void_p + pNewCpuAddress: ctypes.c_void_p + status: int +NVOS56_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('pOldCpuAddress', NvP64, 16), ('pNewCpuAddress', NvP64, 24), ('status', NvV32, 32)]) +@c.record +class NVOS57_PARAMETERS(c.Struct): + SIZE = 24 + hClient: int + hObject: int + sharePolicy: struct_RS_SHARE_POLICY + status: int +@c.record +class struct_RS_SHARE_POLICY(c.Struct): + SIZE = 12 + target: int + accessMask: struct_RS_ACCESS_MASK + type: int + action: int +RS_SHARE_POLICY: TypeAlias = struct_RS_SHARE_POLICY +@c.record +class struct_RS_ACCESS_MASK(c.Struct): + SIZE = 4 + limbs: c.Array[ctypes.c_uint32, Literal[1]] +RS_ACCESS_MASK: TypeAlias = struct_RS_ACCESS_MASK +RsAccessLimb: TypeAlias = ctypes.c_uint32 +struct_RS_ACCESS_MASK.register_fields([('limbs', c.Array[RsAccessLimb, Literal[1]], 0)]) +struct_RS_SHARE_POLICY.register_fields([('target', NvU32, 0), ('accessMask', RS_ACCESS_MASK, 4), ('type', NvU16, 8), ('action', NvU8, 10)]) +NVOS57_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('sharePolicy', RS_SHARE_POLICY, 8), ('status', NvU32, 20)]) +@c.record +class NVPOWERSTATE_PARAMETERS(c.Struct): + SIZE = 28 + deviceReference: int + head: int + state: int + forceMonitorState: int + bForcePerfBiosLevel: int + bIsD3HotTransition: int + bForcePowerStateFail: int + errorStatus: int + fastBootPowerState: int + bGC8Transition: int + bGC8InputRailCutOff: int +NVPOWERSTATE_PARAMETERS.register_fields([('deviceReference', NvU32, 0), ('head', NvU32, 4), ('state', NvU32, 8), ('forceMonitorState', NvU8, 12), ('bForcePerfBiosLevel', NvU8, 13), ('bIsD3HotTransition', NvU8, 14), ('bForcePowerStateFail', NvU8, 15), ('errorStatus', NvU32, 16), ('fastBootPowerState', NvU32, 20), ('bGC8Transition', NvU8, 24), ('bGC8InputRailCutOff', NvU8, 25)]) +PNVPOWERSTATE_PARAMETERS: TypeAlias = c.POINTER[NVPOWERSTATE_PARAMETERS] +@c.record +class NV_GR_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 16 + version: int + flags: int + size: int + caps: int +NV_GR_ALLOCATION_PARAMETERS.register_fields([('version', NvU32, 0), ('flags', NvU32, 4), ('size', NvU32, 8), ('caps', NvU32, 12)]) +ChannelPBSize: dict[int, str] = {(PB_SIZE_4KB:=0): 'PB_SIZE_4KB', (PB_SIZE_8KB:=1): 'PB_SIZE_8KB', (PB_SIZE_16KB:=2): 'PB_SIZE_16KB', (PB_SIZE_32KB:=3): 'PB_SIZE_32KB', (PB_SIZE_64KB:=4): 'PB_SIZE_64KB'} +@c.record +class NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 40 + channelInstance: int + hObjectBuffer: int + hObjectNotify: int + offset: int + pControl: ctypes.c_void_p + flags: int + channelPBSize: int + subDeviceId: int +NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS.register_fields([('channelInstance', NvV32, 0), ('hObjectBuffer', NvHandle, 4), ('hObjectNotify', NvHandle, 8), ('offset', NvU32, 12), ('pControl', NvP64, 16), ('flags', NvU32, 24), ('channelPBSize', ctypes.c_uint32, 28), ('subDeviceId', NvU32, 32)]) +@c.record +class NV50VAIO_CHANNELPIO_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 16 + channelInstance: int + hObjectNotify: int + pControl: ctypes.c_void_p +NV50VAIO_CHANNELPIO_ALLOCATION_PARAMETERS.register_fields([('channelInstance', NvV32, 0), ('hObjectNotify', NvHandle, 4), ('pControl', NvP64, 8)]) +@c.record +class NV_CHANNEL_GROUP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 20 + hObjectError: int + hObjectEccError: int + hVASpace: int + engineType: int + bIsCallingContextVgpuPlugin: int +NV_CHANNEL_GROUP_ALLOCATION_PARAMETERS.register_fields([('hObjectError', NvHandle, 0), ('hObjectEccError', NvHandle, 4), ('hVASpace', NvHandle, 8), ('engineType', NvU32, 12), ('bIsCallingContextVgpuPlugin', NvBool, 16)]) +@c.record +class NV_SWRUNLIST_ALLOCATION_PARAMS(c.Struct): + SIZE = 12 + engineId: int + maxTSGs: int + qosIntrEnableMask: int +NV_SWRUNLIST_ALLOCATION_PARAMS.register_fields([('engineId', NvU32, 0), ('maxTSGs', NvU32, 4), ('qosIntrEnableMask', NvU32, 8)]) +@c.record +class NV_ME_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + caps: int +NV_ME_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('caps', NvU32, 4)]) +@c.record +class NV_BSP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_BSP_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_VP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 80 + size: int + caps: int + flags: int + altUcode: int + rawUcode: ctypes.c_void_p + rawUcodeSize: int + numSubClasses: int + numSubSets: int + subClasses: ctypes.c_void_p + prohibitMultipleInstances: int + pControl: ctypes.c_void_p + hMemoryCmdBuffer: int + offset: int +NV_VP_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('caps', NvU32, 4), ('flags', NvU32, 8), ('altUcode', NvU32, 12), ('rawUcode', NvP64, 16), ('rawUcodeSize', NvU32, 24), ('numSubClasses', NvU32, 28), ('numSubSets', NvU32, 32), ('subClasses', NvP64, 40), ('prohibitMultipleInstances', NvU32, 48), ('pControl', NvP64, 56), ('hMemoryCmdBuffer', NvHandle, 64), ('offset', NvU64, 72)]) +@c.record +class NV_PPP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + prohibitMultipleInstances: int +NV_PPP_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4)]) +@c.record +class NV_MSENC_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_MSENC_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_SEC2_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + prohibitMultipleInstances: int +NV_SEC2_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4)]) +@c.record +class NV_NVJPG_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_NVJPG_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_OFA_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_OFA_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NVOS61_PARAMETERS(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hVblank: int + pProc: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p]] + LogicalHead: int + pParm1: ctypes.c_void_p + pParm2: ctypes.c_void_p + bAdd: int + status: int +OSVBLANKCALLBACKPROC: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p]] +NVOS61_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hVblank', NvHandle, 8), ('pProc', OSVBLANKCALLBACKPROC, 16), ('LogicalHead', NvV32, 24), ('pParm1', ctypes.c_void_p, 32), ('pParm2', ctypes.c_void_p, 40), ('bAdd', NvU32, 48), ('status', NvV32, 52)]) +@c.record +class NV_VASPACE_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 48 + index: int + flags: int + vaSize: int + vaStartInternal: int + vaLimitInternal: int + bigPageSize: int + vaBase: int +NV_VASPACE_ALLOCATION_PARAMETERS.register_fields([('index', NvU32, 0), ('flags', NvV32, 4), ('vaSize', NvU64, 8), ('vaStartInternal', NvU64, 16), ('vaLimitInternal', NvU64, 24), ('bigPageSize', NvU32, 32), ('vaBase', NvU64, 40)]) +@c.record +class NV_CTXSHARE_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + hVASpace: int + flags: int + subctxId: int +NV_CTXSHARE_ALLOCATION_PARAMETERS.register_fields([('hVASpace', NvHandle, 0), ('flags', NvU32, 4), ('subctxId', NvU32, 8)]) +@c.record +class NV_TIMEOUT_CONTROL_PARAMETERS(c.Struct): + SIZE = 12 + cmd: int + timeoutInMs: int + deviceInstance: int +NV_TIMEOUT_CONTROL_PARAMETERS.register_fields([('cmd', NvU32, 0), ('timeoutInMs', NvU32, 4), ('deviceInstance', NvU32, 8)]) +NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS_ADDR_SPACE: dict[int, str] = {(NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_DEFAULT:=0): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_DEFAULT', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_COH:=1): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_COH', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_NCOH:=2): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_NCOH', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_VID:=3): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_VID'} +@c.record +class NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS(c.Struct): + SIZE = 528 + bDirtyTracking: int + granularity: int + accessBitMask: c.Array[ctypes.c_uint64, Literal[64]] + noOfEntries: int + addrSpace: int +NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS.register_fields([('bDirtyTracking', NvBool, 0), ('granularity', NvU32, 4), ('accessBitMask', c.Array[NvU64, Literal[64]], 8), ('noOfEntries', NvU32, 520), ('addrSpace', ctypes.c_uint32, 524)]) +@c.record +class NV_HOPPER_USERMODE_A_PARAMS(c.Struct): + SIZE = 2 + bBar1Mapping: int + bPriv: int +NV_HOPPER_USERMODE_A_PARAMS.register_fields([('bBar1Mapping', NvBool, 0), ('bPriv', NvBool, 1)]) +@c.record +class struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS(c.Struct): + SIZE = 4 + workSubmitToken: int +struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS.register_fields([('workSubmitToken', NvU32, 0)]) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS: TypeAlias = struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS +@c.record +class struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS(c.Struct): + SIZE = 16 + bar2Addr: c.Array[ctypes.c_uint64, Literal[2]] +struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS.register_fields([('bar2Addr', c.Array[NvU64, Literal[2]], 0)]) +NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS: TypeAlias = struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS +@c.record +class struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS(c.Struct): + SIZE = 4 + index: int +struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS.register_fields([('index', NvU32, 0)]) +NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS: TypeAlias = struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS +NVC36F_CTRL_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS: TypeAlias = struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS(c.Struct): + SIZE = 6 + cpuCapability: int + gpusCapability: int + environment: int + ccFeature: int + devToolsMode: int + multiGpuMode: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS.register_fields([('cpuCapability', NvU8, 0), ('gpusCapability', NvU8, 1), ('environment', NvU8, 2), ('ccFeature', NvU8, 3), ('devToolsMode', NvU8, 4), ('multiGpuMode', NvU8, 5)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS(c.Struct): + SIZE = 24 + hSubDevice: int + protectedMemSizeInKb: int + unprotectedMemSizeInKb: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('protectedMemSizeInKb', NvU64, 8), ('unprotectedMemSizeInKb', NvU64, 16)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS(c.Struct): + SIZE = 24 + hSubDevice: int + protectedMemSizeInKb: int + unprotectedMemSizeInKb: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('protectedMemSizeInKb', NvU64, 8), ('unprotectedMemSizeInKb', NvU64, 16)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 12 + hSubDevice: int + numSupportedSec2CCSecureChannels: int + numSupportedCeCCSecureChannels: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('numSupportedSec2CCSecureChannels', NvU32, 4), ('numSupportedCeCCSecureChannels', NvU32, 8)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS(c.Struct): + SIZE = 9228 + hSubDevice: int + certChain: c.Array[ctypes.c_ubyte, Literal[4096]] + certChainSize: int + attestationCertChain: c.Array[ctypes.c_ubyte, Literal[5120]] + attestationCertChainSize: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('certChain', c.Array[NvU8, Literal[4096]], 4), ('certChainSize', NvU32, 4100), ('attestationCertChain', c.Array[NvU8, Literal[5120]], 4104), ('attestationCertChainSize', NvU32, 9224)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS(c.Struct): + SIZE = 12336 + hSubDevice: int + nonce: c.Array[ctypes.c_ubyte, Literal[32]] + attestationReport: c.Array[ctypes.c_ubyte, Literal[8192]] + attestationReportSize: int + isCecAttestationReportPresent: int + cecAttestationReport: c.Array[ctypes.c_ubyte, Literal[4096]] + cecAttestationReportSize: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('nonce', c.Array[NvU8, Literal[32]], 4), ('attestationReport', c.Array[NvU8, Literal[8192]], 36), ('attestationReportSize', NvU32, 8228), ('isCecAttestationReportPresent', NvBool, 8232), ('cecAttestationReport', c.Array[NvU8, Literal[4096]], 8233), ('cecAttestationReportSize', NvU32, 12332)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 12 + hSubDevice: int + maxSec2Channels: int + maxCeChannels: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('maxSec2Channels', NvU32, 4), ('maxCeChannels', NvU32, 8)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS(c.Struct): + SIZE = 8 + hSubDevice: int + keyRotationState: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('keyRotationState', NvU32, 4)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS +@c.record +class struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS(c.Struct): + SIZE = 2 + bEnable: int + bSkipSubmit: int +NVA06C_CTRL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS.register_fields([('bEnable', NvBool, 0), ('bSkipSubmit', NvBool, 1)]) +@c.record +class struct_NVA06F_CTRL_BIND_PARAMS(c.Struct): + SIZE = 4 + engineType: int +NVA06C_CTRL_BIND_PARAMS: TypeAlias = struct_NVA06F_CTRL_BIND_PARAMS +struct_NVA06F_CTRL_BIND_PARAMS.register_fields([('engineType', NvU32, 0)]) +@c.record +class struct_NVA06C_CTRL_TIMESLICE_PARAMS(c.Struct): + SIZE = 8 + timesliceUs: int +struct_NVA06C_CTRL_TIMESLICE_PARAMS.register_fields([('timesliceUs', NvU64, 0)]) +NVA06C_CTRL_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +NVA06C_CTRL_SET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +NVA06C_CTRL_GET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +@c.record +class struct_NVA06C_CTRL_PREEMPT_PARAMS(c.Struct): + SIZE = 8 + bWait: int + bManualTimeout: int + timeoutUs: int +struct_NVA06C_CTRL_PREEMPT_PARAMS.register_fields([('bWait', NvBool, 0), ('bManualTimeout', NvBool, 1), ('timeoutUs', NvU32, 4)]) +NVA06C_CTRL_PREEMPT_PARAMS: TypeAlias = struct_NVA06C_CTRL_PREEMPT_PARAMS +@c.record +class struct_NVA06C_CTRL_GET_INFO_PARAMS(c.Struct): + SIZE = 4 + tsgID: int +struct_NVA06C_CTRL_GET_INFO_PARAMS.register_fields([('tsgID', NvU32, 0)]) +NVA06C_CTRL_GET_INFO_PARAMS: TypeAlias = struct_NVA06C_CTRL_GET_INFO_PARAMS +@c.record +class struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS(c.Struct): + SIZE = 4 + tsgInterleaveLevel: int +struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS.register_fields([('tsgInterleaveLevel', NvU32, 0)]) +NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06C_CTRL_SET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06C_CTRL_GET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +enum_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE: dict[int, str] = {(NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_NONE:=0): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_NONE', (NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_64B:=1): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_64B', (NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_128B:=2): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_128B'} +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD(c.Struct): + SIZE = 4 + size: int +struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD.register_fields([('size', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE, 0)]) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD: TypeAlias = struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD +@c.record +class struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS(c.Struct): + SIZE = 8 + l1: struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD + t1: struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD +struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS.register_fields([('l1', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD, 0), ('t1', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD, 4)]) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS: TypeAlias = struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS +@c.record +class struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS(c.Struct): + SIZE = 88 + methodBufferMemdesc: c.Array[struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]] + bar2Addr: c.Array[ctypes.c_uint64, Literal[2]] + numValidEntries: int +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO(c.Struct): + SIZE = 32 + base: int + size: int + alignment: int + addressSpace: int + cpuCacheAttrib: int +NV2080_CTRL_INTERNAL_MEMDESC_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO +struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('alignment', NvU64, 16), ('addressSpace', NvU32, 24), ('cpuCacheAttrib', NvU32, 28)]) +struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS.register_fields([('methodBufferMemdesc', c.Array[NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], 0), ('bar2Addr', c.Array[NvU64, Literal[2]], 64), ('numValidEntries', NvU32, 80)]) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS +@c.record +class struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS(c.Struct): + SIZE = 1 + bRealtime: int +struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS.register_fields([('bRealtime', NvBool, 0)]) +NVA06C_CTRL_MAKE_REALTIME_PARAMS: TypeAlias = struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS +NVA06C_CTRL_INTERNAL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +NVA06C_CTRL_INTERNAL_SET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS(c.Struct): + SIZE = 16 + hSubDevice: int + subDeviceId: int + pFmt: ctypes.c_void_p +struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pFmt', NvP64, 8)]) +NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS +@c.record +class struct_NV_CTRL_VASPACE_PAGE_LEVEL(c.Struct): + SIZE = 112 + pFmt: c.POINTER[struct_MMU_FMT_LEVEL] + levelFmt: struct_MMU_FMT_LEVEL + sublevelFmt: c.Array[struct_MMU_FMT_LEVEL, Literal[2]] + physAddress: int + aperture: int + size: int + entryIndex: int +@c.record +class struct_MMU_FMT_LEVEL(c.Struct): + SIZE = 24 + virtAddrBitLo: int + virtAddrBitHi: int + entrySize: int + bPageTable: int + numSubLevels: int + pageLevelIdTag: int + subLevels: c.POINTER[struct_MMU_FMT_LEVEL] +struct_MMU_FMT_LEVEL.register_fields([('virtAddrBitLo', NvU8, 0), ('virtAddrBitHi', NvU8, 1), ('entrySize', NvU8, 2), ('bPageTable', NvBool, 3), ('numSubLevels', NvU8, 4), ('pageLevelIdTag', NvU32, 8), ('subLevels', c.POINTER[struct_MMU_FMT_LEVEL], 16)]) +MMU_FMT_LEVEL: TypeAlias = struct_MMU_FMT_LEVEL +struct_NV_CTRL_VASPACE_PAGE_LEVEL.register_fields([('pFmt', c.POINTER[struct_MMU_FMT_LEVEL], 0), ('levelFmt', MMU_FMT_LEVEL, 8), ('sublevelFmt', c.Array[MMU_FMT_LEVEL, Literal[2]], 32), ('physAddress', NvU64, 80), ('aperture', NvU32, 88), ('size', NvU64, 96), ('entryIndex', NvU32, 104)]) +NV_CTRL_VASPACE_PAGE_LEVEL: TypeAlias = struct_NV_CTRL_VASPACE_PAGE_LEVEL +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS(c.Struct): + SIZE = 712 + hSubDevice: int + subDeviceId: int + virtAddress: int + pageSize: int + flags: int + numLevels: int + levels: c.Array[struct_NV_CTRL_VASPACE_PAGE_LEVEL, Literal[6]] +struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('virtAddress', NvU64, 8), ('pageSize', NvU64, 16), ('flags', NvU64, 24), ('numLevels', NvU32, 32), ('levels', c.Array[NV_CTRL_VASPACE_PAGE_LEVEL, Literal[6]], 40)]) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int +struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24)]) +NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int +struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24)]) +NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_VERIF_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS(c.Struct): + SIZE = 184 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int + numLevelsToCopy: int + levels: c.Array[struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level, Literal[6]] +@c.record +class struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level(c.Struct): + SIZE = 24 + physAddress: int + size: int + aperture: int + pageShift: int +struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level.register_fields([('physAddress', NvU64, 0), ('size', NvU64, 8), ('aperture', NvU32, 16), ('pageShift', NvU8, 20)]) +struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24), ('numLevelsToCopy', NvU32, 32), ('levels', c.Array[struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level, Literal[6]], 40)]) +NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS(c.Struct): + SIZE = 16 + hSubDevice: int + subDeviceId: int + requiredVaRange: int +struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('requiredVaRange', NvU64, 8)]) +NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS(c.Struct): + SIZE = 56 + hSubDevice: int + subDeviceId: int + bytesFree: int + bytesTotal: int + largestFreeOffset: int + largestFreeSize: int + usableBytesFree: int + numFreeBlocks: int +struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('bytesFree', NvU64, 8), ('bytesTotal', NvU64, 16), ('largestFreeOffset', NvU64, 24), ('largestFreeSize', NvU64, 32), ('usableBytesFree', NvU64, 40), ('numFreeBlocks', NvU32, 48)]) +NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS +NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +NVA06F_CTRL_BIND_PARAMS: TypeAlias = struct_NVA06F_CTRL_BIND_PARAMS +@c.record +class struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS(c.Struct): + SIZE = 1 + bNotifyEachChannelInTSG: int +struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS.register_fields([('bNotifyEachChannelInTSG', NvBool, 0)]) +NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS: TypeAlias = struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS +@c.record +class struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS(c.Struct): + SIZE = 4 + channelInterleaveLevel: int +struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS.register_fields([('channelInterleaveLevel', NvU32, 0)]) +NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06F_CTRL_SET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06F_CTRL_GET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +@c.record +class struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS(c.Struct): + SIZE = 2 + bForceRestart: int + bBypassWait: int +struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS.register_fields([('bForceRestart', NvBool, 0), ('bBypassWait', NvBool, 1)]) +NVA06F_CTRL_RESTART_RUNLIST_PARAMS: TypeAlias = struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS +@c.record +class struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS(c.Struct): + SIZE = 1 + bImmediate: int +struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS.register_fields([('bImmediate', NvBool, 0)]) +NVA06F_CTRL_STOP_CHANNEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS +@c.record +class struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS(c.Struct): + SIZE = 4 + contextId: int +struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS.register_fields([('contextId', NvU32, 0)]) +NVA06F_CTRL_GET_CONTEXT_ID_PARAMS: TypeAlias = struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS(c.Struct): + SIZE = 12 + hObject: int + mapFlags: int + addrSpaceType: int +struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS.register_fields([('hObject', NvHandle, 0), ('mapFlags', NvU32, 4), ('addrSpaceType', NvU32, 8)]) +NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS(c.Struct): + SIZE = 16 + hObject: int + index: int + data: struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data +@c.record +class struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data(c.Struct): + SIZE = 8 + hResult: int + iResult: int +struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data.register_fields([('hResult', NvHandle, 0), ('iResult', NvU64, 0)]) +struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS.register_fields([('hObject', NvHandle, 0), ('index', NvU32, 4), ('data', struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data, 8)]) +NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS(c.Struct): + SIZE = 12 + hObject: int + hClient: int + maskResult: struct_RS_ACCESS_MASK +struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS.register_fields([('hObject', NvHandle, 0), ('hClient', NvHandle, 4), ('maskResult', RS_ACCESS_MASK, 8)]) +NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS(c.Struct): + SIZE = 12 + sharePolicy: struct_RS_SHARE_POLICY +struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS.register_fields([('sharePolicy', RS_SHARE_POLICY, 0)]) +NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS(c.Struct): + SIZE = 12 + hParent: int + classId: int + hObject: int +struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS.register_fields([('hParent', NvHandle, 0), ('classId', NvU32, 4), ('hObject', NvHandle, 8)]) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS(c.Struct): + SIZE = 16 + hObject: int + sharePolicy: struct_RS_SHARE_POLICY +struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS.register_fields([('hObject', NvHandle, 0), ('sharePolicy', RS_SHARE_POLICY, 4)]) +NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS(c.Struct): + SIZE = 12 + hObject1: int + hObject2: int + bDuplicates: int +struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS.register_fields([('hObject1', NvHandle, 0), ('hObject2', NvHandle, 4), ('bDuplicates', NvBool, 8)]) +NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS(c.Struct): + SIZE = 16 + devDescriptor: int + channel: int +struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS.register_fields([('devDescriptor', NvU64, 0), ('channel', NvU32, 8)]) +NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS(c.Struct): + SIZE = 16 + state: int + count: int + missedCount: int + bCircularBuffer: int +struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS.register_fields([('state', NvU32, 0), ('count', NvU32, 4), ('missedCount', NvU32, 8), ('bCircularBuffer', NvBool, 12)]) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS(c.Struct): + SIZE = 8 + state: int + bCircularBuffer: int +struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS.register_fields([('state', NvU32, 0), ('bCircularBuffer', NvBool, 4)]) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY(c.Struct): + SIZE = 56 + counter: int + line: int + filename: c.Array[ctypes.c_ubyte, Literal[12]] + tag: int + cpuNum: int + irql: int + threadId: int + data0: int + data1: int + data2: int +struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY.register_fields([('counter', NvU64, 0), ('line', NvU32, 8), ('filename', c.Array[NvU8, Literal[12]], 12), ('tag', NvU16, 24), ('cpuNum', NvU8, 26), ('irql', NvU8, 27), ('threadId', NvU64, 32), ('data0', NvU32, 40), ('data1', NvU32, 44), ('data2', NvU32, 48)]) +NV0000_CTRL_DIAG_LOCK_METER_ENTRY: TypeAlias = struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY +@c.record +class struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS(c.Struct): + SIZE = 3592 + entryCount: int + entries: c.Array[struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY, Literal[64]] +struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS.register_fields([('entryCount', NvU32, 0), ('entries', c.Array[NV0000_CTRL_DIAG_LOCK_METER_ENTRY, Literal[64]], 8)]) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS +@c.record +class struct_RPC_METER_ENTRY(c.Struct): + SIZE = 32 + startTimeInNs: int + endTimeInNs: int + rpcDataTag: int + rpcExtraData: int +struct_RPC_METER_ENTRY.register_fields([('startTimeInNs', NvU64, 0), ('endTimeInNs', NvU64, 8), ('rpcDataTag', NvU64, 16), ('rpcExtraData', NvU64, 24)]) +RPC_METER_ENTRY: TypeAlias = struct_RPC_METER_ENTRY +@c.record +class struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS(c.Struct): + SIZE = 4 + rpcProfileCmd: int +struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS.register_fields([('rpcProfileCmd', NvU32, 0)]) +NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS(c.Struct): + SIZE = 3224 + firstEntryOffset: int + outputEntryCount: int + remainingEntryCount: int + elapsedTimeInNs: int + rpcProfilerBuffer: c.Array[struct_RPC_METER_ENTRY, Literal[100]] +struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS.register_fields([('firstEntryOffset', NvU32, 0), ('outputEntryCount', NvU32, 4), ('remainingEntryCount', NvU32, 8), ('elapsedTimeInNs', NvU64, 16), ('rpcProfilerBuffer', c.Array[RPC_METER_ENTRY, Literal[100]], 24)]) +NV0000_CTRL_DIAG_DUMP_RPC_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS +@c.record +class struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS(c.Struct): + SIZE = 8 + event: int + action: int +struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS.register_fields([('event', NvU32, 0), ('action', NvU32, 4)]) +NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS: TypeAlias = struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS +@c.record +class struct_NV0000_CTRL_GET_SYSTEM_EVENT_STATUS_PARAMS(c.Struct): + SIZE = 8 + event: int + status: int +struct_NV0000_CTRL_GET_SYSTEM_EVENT_STATUS_PARAMS.register_fields([('event', NvU32, 0), ('status', NvU32, 4)]) +NV0000_CTRL_GET_SYSTEM_EVENT_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_GET_SYSTEM_EVENT_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS(c.Struct): + SIZE = 128 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0)]) +NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS(c.Struct): + SIZE = 40 + gpuId: int + gpuFlags: int + deviceInstance: int + subDeviceInstance: int + szName: ctypes.c_void_p + sliStatus: int + boardId: int + gpuInstance: int + numaId: int +struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('gpuFlags', NvU32, 4), ('deviceInstance', NvU32, 8), ('subDeviceInstance', NvU32, 12), ('szName', NvP64, 16), ('sliStatus', NvU32, 24), ('boardId', NvU32, 28), ('gpuInstance', NvU32, 32), ('numaId', NvS32, 36)]) +NV0000_CTRL_GPU_GET_ID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS(c.Struct): + SIZE = 32 + gpuId: int + gpuFlags: int + deviceInstance: int + subDeviceInstance: int + sliStatus: int + boardId: int + gpuInstance: int + numaId: int +struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS.register_fields([('gpuId', NvU32, 0), ('gpuFlags', NvU32, 4), ('deviceInstance', NvU32, 8), ('subDeviceInstance', NvU32, 12), ('sliStatus', NvU32, 16), ('boardId', NvU32, 20), ('gpuInstance', NvU32, 24), ('numaId', NvS32, 28)]) +NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + status: int +struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS.register_fields([('gpuId', NvU32, 0), ('status', NvU32, 4)]) +NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS(c.Struct): + SIZE = 4 + deviceIds: int +struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS.register_fields([('deviceIds', NvU32, 0)]) +NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS(c.Struct): + SIZE = 256 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + excludedGpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('excludedGpuIds', c.Array[NvU32, Literal[32]], 128)]) +NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + domain: int + bus: int + slot: int +struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('domain', NvU32, 4), ('bus', NvU16, 8), ('slot', NvU16, 10)]) +NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS(c.Struct): + SIZE = 132 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + failedId: int +struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('failedId', NvU32, 128)]) +NV0000_CTRL_GPU_ATTACH_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS(c.Struct): + SIZE = 128 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0)]) +NV0000_CTRL_GPU_DETACH_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_VIDEO_LINKS(c.Struct): + SIZE = 36 + gpuId: int + connectedGpuIds: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV0000_CTRL_GPU_VIDEO_LINKS.register_fields([('gpuId', NvU32, 0), ('connectedGpuIds', c.Array[NvU32, Literal[8]], 4)]) +NV0000_CTRL_GPU_VIDEO_LINKS: TypeAlias = struct_NV0000_CTRL_GPU_VIDEO_LINKS +@c.record +class struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS(c.Struct): + SIZE = 1152 + links: c.Array[struct_NV0000_CTRL_GPU_VIDEO_LINKS, Literal[32]] +struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS.register_fields([('links', c.Array[NV0000_CTRL_GPU_VIDEO_LINKS, Literal[32]], 0)]) +NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + svmSize: int +struct_NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS.register_fields([('gpuId', NvU32, 0), ('svmSize', NvU32, 4)]) +NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS(c.Struct): + SIZE = 272 + gpuUuid: c.Array[ctypes.c_ubyte, Literal[256]] + flags: int + gpuId: int + deviceInstance: int + subdeviceInstance: int +struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS.register_fields([('gpuUuid', c.Array[NvU8, Literal[256]], 0), ('flags', NvU32, 256), ('gpuId', NvU32, 260), ('deviceInstance', NvU32, 264), ('subdeviceInstance', NvU32, 268)]) +NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS(c.Struct): + SIZE = 268 + gpuId: int + flags: int + gpuUuid: c.Array[ctypes.c_ubyte, Literal[256]] + uuidStrLen: int +struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS.register_fields([('gpuId', NvU32, 0), ('flags', NvU32, 4), ('gpuUuid', c.Array[NvU8, Literal[256]], 8), ('uuidStrLen', NvU32, 264)]) +NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + newState: int + flags: int +struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('newState', NvU32, 4), ('flags', NvU32, 8)]) +NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + drainState: int + flags: int +struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('drainState', NvU32, 4), ('flags', NvU32, 8)]) +NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DISCOVER_PARAMS(c.Struct): + SIZE = 8 + domain: int + bus: int + slot: int + function: int +struct_NV0000_CTRL_GPU_DISCOVER_PARAMS.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('function', NvU8, 6)]) +NV0000_CTRL_GPU_DISCOVER_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DISCOVER_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS(c.Struct): + SIZE = 4 + enableMask: int +struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS.register_fields([('enableMask', NvU32, 0)]) +NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + mask: int + bSkipHwNvlinkDisable: int +struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS.register_fields([('gpuId', NvU32, 0), ('mask', NvU32, 4), ('bSkipHwNvlinkDisable', NvBool, 8)]) +NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS(c.Struct): + SIZE = 396 + hContext: int + opType: int + index: int + dataType: int + data: struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data(c.Struct): + SIZE = 380 + configSet: struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configSet + configEx: struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configEx + reservedProperty: struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_reservedProperty +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configSet(c.Struct): + SIZE = 8 + newValue: int + oldValue: int +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configSet.register_fields([('newValue', NvU32, 0), ('oldValue', NvU32, 4)]) +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configEx(c.Struct): + SIZE = 380 + paramData: c.Array[ctypes.c_ubyte, Literal[373]] + paramSize: int +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configEx.register_fields([('paramData', c.Array[NvU8, Literal[373]], 0), ('paramSize', NvU32, 376)]) +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_reservedProperty(c.Struct): + SIZE = 48 + propertyId: int + propertyIn: c.Array[ctypes.c_uint32, Literal[6]] + propertyOut: c.Array[ctypes.c_uint32, Literal[5]] +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_reservedProperty.register_fields([('propertyId', NvU32, 0), ('propertyIn', c.Array[NvU32, Literal[6]], 4), ('propertyOut', c.Array[NvU32, Literal[5]], 28)]) +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data.register_fields([('configSet', struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configSet, 0), ('configEx', struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configEx, 0), ('reservedProperty', struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_reservedProperty, 0)]) +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS.register_fields([('hContext', NvHandle, 0), ('opType', NvU32, 4), ('index', NvV32, 8), ('dataType', NvU32, 12), ('data', struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data, 16)]) +NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS(c.Struct): + SIZE = 48 + hDevice: int + hChannel: int + numChannels: int + phClients: ctypes.c_void_p + phDevices: ctypes.c_void_p + phChannels: ctypes.c_void_p + flags: int + timeout: int +struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS.register_fields([('hDevice', NvHandle, 0), ('hChannel', NvHandle, 4), ('numChannels', NvV32, 8), ('phClients', NvP64, 16), ('phDevices', NvP64, 24), ('phChannels', NvP64, 32), ('flags', NvV32, 40), ('timeout', NvV32, 44)]) +NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS(c.Struct): + SIZE = 24 + image: int + totalSize: int + pData: ctypes.c_void_p +struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS.register_fields([('image', NvU8, 0), ('totalSize', NvU64, 8), ('pData', NvP64, 16)]) +NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS(c.Struct): + SIZE = 1 + mode: int +struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS.register_fields([('mode', NvU8, 0)]) +NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS(c.Struct): + SIZE = 2 + mode: int + bwModeScope: int +struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS.register_fields([('mode', NvU8, 0), ('bwModeScope', NvU8, 1)]) +NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ACTIVE_DEVICE(c.Struct): + SIZE = 12 + gpuId: int + gpuInstanceId: int + computeInstanceId: int +struct_NV0000_CTRL_GPU_ACTIVE_DEVICE.register_fields([('gpuId', NvU32, 0), ('gpuInstanceId', NvU32, 4), ('computeInstanceId', NvU32, 8)]) +NV0000_CTRL_GPU_ACTIVE_DEVICE: TypeAlias = struct_NV0000_CTRL_GPU_ACTIVE_DEVICE +@c.record +class struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS(c.Struct): + SIZE = 3076 + numDevices: int + devices: c.Array[struct_NV0000_CTRL_GPU_ACTIVE_DEVICE, Literal[256]] +struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS.register_fields([('numDevices', NvU32, 0), ('devices', c.Array[NV0000_CTRL_GPU_ACTIVE_DEVICE, Literal[256]], 4)]) +NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + pid: int + newState: int +struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('newState', NvU32, 8)]) +NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + pid: int + state: int +struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('state', NvU32, 8)]) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS(c.Struct): + SIZE = 48 + gpuId: int + pid: int + subPid: int + gpuUtil: int + fbUtil: int + maxFbUsage: int + startTime: int + endTime: int +struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('subPid', NvU32, 8), ('gpuUtil', NvU32, 12), ('fbUtil', NvU32, 16), ('maxFbUsage', NvU64, 24), ('startTime', NvU64, 32), ('endTime', NvU64, 40)]) +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS(c.Struct): + SIZE = 16012 + gpuId: int + pid: int + pidTbl: c.Array[ctypes.c_uint32, Literal[4000]] + pidCount: int +struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('pidTbl', c.Array[NvU32, Literal[4000]], 8), ('pidCount', NvU32, 16008)]) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + pid: int +struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4)]) +NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS(c.Struct): + SIZE = 16 + gsyncIds: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS.register_fields([('gsyncIds', c.Array[NvU32, Literal[4]], 0)]) +NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS(c.Struct): + SIZE = 12 + gsyncId: int + gsyncFlags: int + gsyncInstance: int +struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS.register_fields([('gsyncId', NvU32, 0), ('gsyncFlags', NvU32, 4), ('gsyncInstance', NvU32, 8)]) +NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS(c.Struct): + SIZE = 8 + component: int + size: int +struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS.register_fields([('component', NvU32, 0), ('size', NvU32, 4)]) +NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS(c.Struct): + SIZE = 16 + pBuffer: ctypes.c_void_p + component: int + size: int +struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS.register_fields([('pBuffer', NvP64, 0), ('component', NvU32, 8), ('size', NvU32, 12)]) +NV0000_CTRL_NVD_GET_DUMP_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS(c.Struct): + SIZE = 16 + timestamp: int + cpuClkId: int +struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS.register_fields([('timestamp', NvU64, 0), ('cpuClkId', NvU8, 8)]) +NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS(c.Struct): + SIZE = 15404 + component: int + version: int + runtimeSizes: c.Array[ctypes.c_ubyte, Literal[16]] + printFlags: int + signature: c.Array[ctypes.c_uint32, Literal[4]] + bufferTags: c.Array[ctypes.c_uint32, Literal[3840]] +struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS.register_fields([('component', NvU32, 0), ('version', NvU32, 4), ('runtimeSizes', c.Array[NvU8, Literal[16]], 8), ('printFlags', NvU32, 24), ('signature', c.Array[NvU32, Literal[4]], 28), ('bufferTags', c.Array[NvU32, Literal[3840]], 44)]) +NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 28 + component: int + buffer: int + tag: int + size: int + flags: int + pos: int + overflow: int +struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS.register_fields([('component', NvU32, 0), ('buffer', NvU32, 4), ('tag', NvU32, 8), ('size', NvU32, 12), ('flags', NvU32, 16), ('pos', NvU32, 20), ('overflow', NvU32, 24)]) +NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS(c.Struct): + SIZE = 4016 + component: int + buffer: int + blockNum: int + size: int + data: c.Array[ctypes.c_ubyte, Literal[4000]] +struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS.register_fields([('component', NvU32, 0), ('buffer', NvU32, 4), ('blockNum', NvU32, 8), ('size', NvU32, 12), ('data', c.Array[NvU8, Literal[4000]], 16)]) +NV0000_CTRL_NVD_GET_NVLOG_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY(c.Struct): + SIZE = 12 + tag: int + value: int + attribute: int +struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY.register_fields([('tag', NvU32, 0), ('value', NvU32, 4), ('attribute', NvU32, 8)]) +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY: TypeAlias = struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY +@c.record +class struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS(c.Struct): + SIZE = 2436 + reqIdx: int + rptIdx: int + GPUTag: int + rptTime: int + startIdx: int + endIdx: int + rptType: int + flags: int + rptCount: int + owner: int + processId: int + report: c.Array[struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY, Literal[200]] +struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS.register_fields([('reqIdx', NvU16, 0), ('rptIdx', NvU16, 2), ('GPUTag', NvU32, 4), ('rptTime', NvU32, 8), ('startIdx', NvU16, 12), ('endIdx', NvU16, 14), ('rptType', NvU16, 16), ('flags', NvU32, 20), ('rptCount', NvU16, 24), ('owner', NvU32, 28), ('processId', NvU32, 32), ('report', c.Array[NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY, Literal[200]], 36)]) +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS(c.Struct): + SIZE = 16 + tsBufferSize: int + pTSBuffer: ctypes.c_void_p +struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS.register_fields([('tsBufferSize', NvU32, 0), ('pTSBuffer', NvP64, 8)]) +NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS +@c.record +class struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS(c.Struct): + SIZE = 104 + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] +struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS.register_fields([('subProcessID', NvU32, 0), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 4)]) +NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS +@c.record +class struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS(c.Struct): + SIZE = 1 + bIsSubProcessDisabled: int +struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS.register_fields([('bIsSubProcessDisabled', NvBool, 0)]) +NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS: TypeAlias = struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS(c.Struct): + SIZE = 1 + bEnabled: int +struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS.register_fields([('bEnabled', NvBool, 0)]) +NV0000_SYNC_GPU_BOOST_INFO_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG(c.Struct): + SIZE = 140 + gpuCount: int + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + boostGroupId: int + bBridgeless: int +struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG.register_fields([('gpuCount', NvU32, 0), ('gpuIds', c.Array[NvU32, Literal[32]], 4), ('boostGroupId', NvU32, 132), ('bBridgeless', NvBool, 136)]) +NV0000_SYNC_GPU_BOOST_GROUP_CONFIG: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS(c.Struct): + SIZE = 140 + boostConfig: struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG +struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS.register_fields([('boostConfig', NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, 0)]) +NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS(c.Struct): + SIZE = 4 + boostGroupId: int +struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS.register_fields([('boostGroupId', NvU32, 0)]) +NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS(c.Struct): + SIZE = 2244 + groupCount: int + pBoostGroups: c.Array[struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, Literal[16]] +struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS.register_fields([('groupCount', NvU32, 0), ('pBoostGroups', c.Array[NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, Literal[16]], 4)]) +NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS(c.Struct): + SIZE = 4 + featuresMask: int +struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS.register_fields([('featuresMask', NvU32, 0)]) +NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS(c.Struct): + SIZE = 40 + sizeOfStrings: int + pDriverVersionBuffer: ctypes.c_void_p + pVersionBuffer: ctypes.c_void_p + pTitleBuffer: ctypes.c_void_p + changelistNumber: int + officialChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS.register_fields([('sizeOfStrings', NvU32, 0), ('pDriverVersionBuffer', NvP64, 8), ('pVersionBuffer', NvP64, 16), ('pTitleBuffer', NvP64, 24), ('changelistNumber', NvU32, 32), ('officialChangelistNumber', NvU32, 36)]) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS +enum_NV0000_CTRL_SYSTEM_SH_SOC_TYPE: dict[int, str] = {(NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NA:=0): 'NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NA', (NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NV_GRACE:=1): 'NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NV_GRACE'} +NV0000_CTRL_SYSTEM_SH_SOC_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS(c.Struct): + SIZE = 108 + type: int + capabilities: int + clock: int + L1DataCacheSize: int + L2DataCacheSize: int + dataCacheLineSize: int + numLogicalCpus: int + numPhysicalCpus: int + name: c.Array[ctypes.c_ubyte, Literal[52]] + family: int + model: int + stepping: int + coresOnDie: int + bCCEnabled: int + selfHostedSocType: int +struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS.register_fields([('type', NvU32, 0), ('capabilities', NvU32, 4), ('clock', NvU32, 8), ('L1DataCacheSize', NvU32, 12), ('L2DataCacheSize', NvU32, 16), ('dataCacheLineSize', NvU32, 20), ('numLogicalCpus', NvU32, 24), ('numPhysicalCpus', NvU32, 28), ('name', c.Array[NvU8, Literal[52]], 32), ('family', NvU32, 84), ('model', NvU32, 88), ('stepping', NvU8, 92), ('coresOnDie', NvU32, 96), ('bCCEnabled', NvBool, 100), ('selfHostedSocType', NV0000_CTRL_SYSTEM_SH_SOC_TYPE, 104)]) +NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS(c.Struct): + SIZE = 152 + vendorId: int + deviceId: int + subSysVendorId: int + subSysDeviceId: int + HBvendorId: int + HBdeviceId: int + HBsubSysVendorId: int + HBsubSysDeviceId: int + sliBondId: int + vendorNameString: c.Array[ctypes.c_ubyte, Literal[32]] + subSysVendorNameString: c.Array[ctypes.c_ubyte, Literal[32]] + chipsetNameString: c.Array[ctypes.c_ubyte, Literal[32]] + sliBondNameString: c.Array[ctypes.c_ubyte, Literal[32]] + flags: int +struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS.register_fields([('vendorId', NvU16, 0), ('deviceId', NvU16, 2), ('subSysVendorId', NvU16, 4), ('subSysDeviceId', NvU16, 6), ('HBvendorId', NvU16, 8), ('HBdeviceId', NvU16, 10), ('HBsubSysVendorId', NvU16, 12), ('HBsubSysDeviceId', NvU16, 14), ('sliBondId', NvU32, 16), ('vendorNameString', c.Array[NvU8, Literal[32]], 20), ('subSysVendorNameString', c.Array[NvU8, Literal[32]], 52), ('chipsetNameString', c.Array[NvU8, Literal[32]], 84), ('sliBondNameString', c.Array[NvU8, Literal[32]], 116), ('flags', NvU32, 148)]) +NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS(c.Struct): + SIZE = 1 + bIsPresent: int +struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS.register_fields([('bIsPresent', NvBool, 0)]) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS(c.Struct): + SIZE = 40 + waitApiLock: int + holdRoApiLock: int + holdRwApiLock: int + waitGpuLock: int + holdGpuLock: int +struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS.register_fields([('waitApiLock', NvU64, 0), ('holdRoApiLock', NvU64, 8), ('holdRwApiLock', NvU64, 16), ('waitGpuLock', NvU64, 24), ('holdGpuLock', NvU64, 32)]) +NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS(c.Struct): + SIZE = 132 + numClasses: int + classes: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS.register_fields([('numClasses', NvU32, 0), ('classes', c.Array[NvU32, Literal[32]], 4)]) +NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS(c.Struct): + SIZE = 12 + eventType: int + eventData: int + bEventDataForced: int +struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS.register_fields([('eventType', NvU32, 0), ('eventData', NvU32, 4), ('bEventDataForced', NvBool, 8)]) +NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS(c.Struct): + SIZE = 4 + systemType: int +struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS.register_fields([('systemType', NvU32, 0)]) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS(c.Struct): + SIZE = 520 + cmd: int + count: int + data: c.Array[ctypes.c_ubyte, Literal[512]] +struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('count', NvU32, 4), ('data', c.Array[NvU8, Literal[512]], 8)]) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_HWBC_INFO(c.Struct): + SIZE = 16 + hwbcId: int + firmwareVersion: int + subordinateBus: int + secondaryBus: int +struct_NV0000_CTRL_SYSTEM_HWBC_INFO.register_fields([('hwbcId', NvU32, 0), ('firmwareVersion', NvU32, 4), ('subordinateBus', NvU32, 8), ('secondaryBus', NvU32, 12)]) +NV0000_CTRL_SYSTEM_HWBC_INFO: TypeAlias = struct_NV0000_CTRL_SYSTEM_HWBC_INFO +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS(c.Struct): + SIZE = 2048 + hwbcInfo: c.Array[struct_NV0000_CTRL_SYSTEM_HWBC_INFO, Literal[128]] +struct_NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS.register_fields([('hwbcInfo', c.Array[NV0000_CTRL_SYSTEM_HWBC_INFO, Literal[128]], 0)]) +NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS(c.Struct): + SIZE = 136 + cmdCount: int + succeeded: int + cmdData: c.Array[struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData, Literal[16]] +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS.register_fields([('cmdCount', NvU32, 0), ('succeeded', NvU32, 4), ('cmdData', c.Array[struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData, Literal[16]], 8)]) +NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 176 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuCount: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerIds: ctypes.c_void_p + busEgmPeerIds: ctypes.c_void_p +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('gpuCount', NvU32, 128), ('p2pCaps', NvU32, 132), ('p2pOptimalReadCEs', NvU32, 136), ('p2pOptimalWriteCEs', NvU32, 140), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 144), ('busPeerIds', NvP64, 160), ('busEgmPeerIds', NvP64, 168)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS(c.Struct): + SIZE = 8348 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuCount: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerIds: c.Array[ctypes.c_uint32, Literal[1024]] + busEgmPeerIds: c.Array[ctypes.c_uint32, Literal[1024]] +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('gpuCount', NvU32, 128), ('p2pCaps', NvU32, 132), ('p2pOptimalReadCEs', NvU32, 136), ('p2pOptimalWriteCEs', NvU32, 140), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 144), ('busPeerIds', c.Array[NvU32, Literal[1024]], 156), ('busEgmPeerIds', c.Array[NvU32, Literal[1024]], 4252)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS +NV0000_CTRL_P2P_CAPS_MATRIX_ROW: TypeAlias = c.Array[ctypes.c_uint32, Literal[8]] +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS(c.Struct): + SIZE = 1352 + grpACount: int + grpBCount: int + gpuIdGrpA: c.Array[ctypes.c_uint32, Literal[8]] + gpuIdGrpB: c.Array[ctypes.c_uint32, Literal[8]] + p2pCaps: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + a2bOptimalReadCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + a2bOptimalWriteCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + b2aOptimalReadCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + b2aOptimalWriteCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS.register_fields([('grpACount', NvU32, 0), ('grpBCount', NvU32, 4), ('gpuIdGrpA', c.Array[NvU32, Literal[8]], 8), ('gpuIdGrpB', c.Array[NvU32, Literal[8]], 40), ('p2pCaps', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 72), ('a2bOptimalReadCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 328), ('a2bOptimalWriteCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 584), ('b2aOptimalReadCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 840), ('b2aOptimalWriteCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 1096)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + input: c.Array[ctypes.c_int32, Literal[2]] + result: c.Array[ctypes.c_int32, Literal[4]] +struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('input', c.Array[NvS32, Literal[2]], 4), ('result', c.Array[NvS32, Literal[4]], 12)]) +NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS(c.Struct): + SIZE = 148 + objHndl: int + blockId: int + nextExpectedSampleTimems: int + countersReq: int + countersReturned: int + counterBlock: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS.register_fields([('objHndl', NvU32, 0), ('blockId', NvU32, 4), ('nextExpectedSampleTimems', NvU32, 8), ('countersReq', NvU32, 12), ('countersReturned', NvU32, 16), ('counterBlock', c.Array[NvU32, Literal[32]], 20)]) +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS(c.Struct): + SIZE = 1164 + cmd: int + input: int + resultSz: int + result: c.Array[ctypes.c_uint32, Literal[288]] +struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS.register_fields([('cmd', NvU32, 0), ('input', NvU32, 4), ('resultSz', NvU32, 8), ('result', c.Array[NvU32, Literal[288]], 12)]) +NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS(c.Struct): + SIZE = 40 + method: int + inData: ctypes.c_void_p + inDataSize: int + outStatus: int + outData: ctypes.c_void_p + outDataSize: int +struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS.register_fields([('method', NvU32, 0), ('inData', NvP64, 8), ('inDataSize', NvU16, 16), ('outStatus', NvU32, 20), ('outData', NvP64, 24), ('outDataSize', NvU16, 32)]) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS(c.Struct): + SIZE = 4 + moduleMask: int +struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS.register_fields([('moduleMask', NvU32, 0)]) +NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE(c.Struct): + SIZE = 8 + frameTime: int + renderTime: int + targetTime: int + sleepTime: int + sampleNumber: int +struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE.register_fields([('frameTime', NvU16, 0), ('renderTime', NvU16, 2), ('targetTime', NvU16, 4), ('sleepTime', NvU8, 6), ('sampleNumber', NvU8, 7)]) +NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS(c.Struct): + SIZE = 514 + samples: c.Array[struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, Literal[64]] + nextSampleNumber: int +struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS.register_fields([('samples', c.Array[NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, Literal[64]], 0), ('nextSampleNumber', NvU8, 512)]) +NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS(c.Struct): + SIZE = 8 + sampleData: struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE +struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS.register_fields([('sampleData', NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, 0)]) +NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS(c.Struct): + SIZE = 1288 + szHostDriverVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostTitleBuffer: c.Array[ctypes.c_char, Literal[256]] + szPluginTitleBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostUnameBuffer: c.Array[ctypes.c_char, Literal[256]] + iHostChangelistNumber: int + iPluginChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS.register_fields([('szHostDriverVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 0), ('szHostVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 256), ('szHostTitleBuffer', c.Array[ctypes.c_char, Literal[256]], 512), ('szPluginTitleBuffer', c.Array[ctypes.c_char, Literal[256]], 768), ('szHostUnameBuffer', c.Array[ctypes.c_char, Literal[256]], 1024), ('iHostChangelistNumber', NvU32, 1280), ('iPluginChangelistNumber', NvU32, 1284)]) +NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS(c.Struct): + SIZE = 65 + gpuCount: int + gpuBus: c.Array[ctypes.c_ubyte, Literal[32]] + gpuExternalPowerStatus: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS.register_fields([('gpuCount', NvU8, 0), ('gpuBus', c.Array[NvU8, Literal[32]], 1), ('gpuExternalPowerStatus', c.Array[NvU8, Literal[32]], 33)]) +NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS(c.Struct): + SIZE = 1 + privStatusFlags: int +struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS.register_fields([('privStatusFlags', NvU8, 0)]) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS +enum_NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS: dict[int, str] = {(NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_SKIP:=1): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_SKIP', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_UNINITIALIZED:=2): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_UNINITIALIZED', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_IN_PROGRESS:=3): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_IN_PROGRESS', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_INITIALIZED:=4): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_INITIALIZED'} +NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS(c.Struct): + SIZE = 4 + fabricStatus: int +struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS.register_fields([('fabricStatus', NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS, 0)]) +NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS(c.Struct): + SIZE = 16 + host_min_supported_version: int + host_max_supported_version: int + user_min_supported_version: int + user_max_supported_version: int +struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS.register_fields([('host_min_supported_version', NvU32, 0), ('host_max_supported_version', NvU32, 4), ('user_min_supported_version', NvU32, 8), ('user_max_supported_version', NvU32, 12)]) +NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS(c.Struct): + SIZE = 8 + min_version: int + max_version: int +struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS.register_fields([('min_version', NvU32, 0), ('max_version', NvU32, 4)]) +NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS(c.Struct): + SIZE = 8 + rm_instance_id: int +struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS.register_fields([('rm_instance_id', NvU64, 0)]) +NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT(c.Struct): + SIZE = 24 + batteryStateOfChargePercent: int + batteryCurrentLimitmA: int + restOfSytemReservedPowermW: int + minCpuTdpmW: int + maxCpuTdpmW: int + shortTimescaleBatteryCurrentLimitmA: int +struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT.register_fields([('batteryStateOfChargePercent', NvU8, 0), ('batteryCurrentLimitmA', NvU32, 4), ('restOfSytemReservedPowermW', NvU32, 8), ('minCpuTdpmW', NvU32, 12), ('maxCpuTdpmW', NvU32, 16), ('shortTimescaleBatteryCurrentLimitmA', NvU32, 20)]) +NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS(c.Struct): + SIZE = 860 + gpuId: int + tpp: int + ratedTgp: int + subFunc: int + ctgpOffsetmW: int + targetTppOffsetmW: int + maxOutputOffsetmW: int + minOutputOffsetmW: int + ctgpBattOffsetmW: int + targetTppBattOffsetmW: int + dcRosReserveOverridemW: int + dcTspLongTimescaleLimitmA: int + dcTspShortTimescaleLimitmA: int + bRequireDcSysPowerLimitsTable: int + bAllowDcRestOfSystemReserveOverride: int + bSupportDcTsp: int + bEnableForAC: int + bEnableForDC: int + version: int + samplingPeriodmS: int + samplingMulti: int + filterType: int + filterParam: struct_NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam + filterReserved: int + bIsBoostController: int + incRatio: int + decRatio: int + bSupportBatt: int + cpuType: int + gpuType: int + sysPwrIndex: int + sysPwrGetInfo: c.Array[struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT, Literal[32]] + bIsTspSupported: int + sysPwrLimitsTableVersion: int + type: int + cpuTdpmw: int +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam(c.Struct): + SIZE = 1 + weight: int + windowSize: int +struct_NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam.register_fields([('weight', NvU8, 0), ('windowSize', NvU8, 0)]) +struct_NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('tpp', NvU32, 4), ('ratedTgp', NvU32, 8), ('subFunc', NvU32, 12), ('ctgpOffsetmW', NvS32, 16), ('targetTppOffsetmW', NvS32, 20), ('maxOutputOffsetmW', NvS32, 24), ('minOutputOffsetmW', NvS32, 28), ('ctgpBattOffsetmW', NvS32, 32), ('targetTppBattOffsetmW', NvS32, 36), ('dcRosReserveOverridemW', NvU32, 40), ('dcTspLongTimescaleLimitmA', NvU32, 44), ('dcTspShortTimescaleLimitmA', NvU32, 48), ('bRequireDcSysPowerLimitsTable', NvBool, 52), ('bAllowDcRestOfSystemReserveOverride', NvBool, 53), ('bSupportDcTsp', NvBool, 54), ('bEnableForAC', NvBool, 55), ('bEnableForDC', NvBool, 56), ('version', NvU8, 57), ('samplingPeriodmS', NvU16, 58), ('samplingMulti', NvU16, 60), ('filterType', NvU8, 62), ('filterParam', struct_NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam, 63), ('filterReserved', NvU16, 64), ('bIsBoostController', NvBool, 66), ('incRatio', NvU16, 68), ('decRatio', NvU16, 70), ('bSupportBatt', NvBool, 72), ('cpuType', NvU8, 73), ('gpuType', NvU8, 74), ('sysPwrIndex', NvU32, 76), ('sysPwrGetInfo', c.Array[NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT, Literal[32]], 80), ('bIsTspSupported', NvBool, 848), ('sysPwrLimitsTableVersion', NvU8, 849), ('type', NvU32, 852), ('cpuTdpmw', NvU32, 856)]) +NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS +NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS(c.Struct): + SIZE = 1 + bExternalFabricMgmt: int +struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS.register_fields([('bExternalFabricMgmt', NvBool, 0)]) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS(c.Struct): + SIZE = 16 + clientCount: int + resourceCount: int +struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS.register_fields([('clientCount', NvU32, 0), ('resourceCount', NvU64, 8)]) +NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS(c.Struct): + SIZE = 1032 + driverVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + versionBuffer: c.Array[ctypes.c_char, Literal[256]] + driverBranch: c.Array[ctypes.c_char, Literal[256]] + titleBuffer: c.Array[ctypes.c_char, Literal[256]] + changelistNumber: int + officialChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS.register_fields([('driverVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 0), ('versionBuffer', c.Array[ctypes.c_char, Literal[256]], 256), ('driverBranch', c.Array[ctypes.c_char, Literal[256]], 512), ('titleBuffer', c.Array[ctypes.c_char, Literal[256]], 768), ('changelistNumber', NvU32, 1024), ('officialChangelistNumber', NvU32, 1028)]) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS(c.Struct): + SIZE = 8 + cmd: int + mode: int +struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('mode', NvU32, 4)]) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS(c.Struct): + SIZE = 136 + cmdCount: int + succeeded: int + cmdData: c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData, Literal[16]] +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS.register_fields([('cmdCount', NvU32, 0), ('succeeded', NvU32, 4), ('cmdData', c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData, Literal[16]], 8)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + input: c.Array[ctypes.c_int32, Literal[2]] + result: c.Array[ctypes.c_int32, Literal[4]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('input', c.Array[NvS32, Literal[2]], 4), ('result', c.Array[NvS32, Literal[4]], 12)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS(c.Struct): + SIZE = 148 + objHndl: int + blockId: int + nextExpectedSampleTimems: int + countersReq: int + countersReturned: int + counterBlock: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS.register_fields([('objHndl', NvU32, 0), ('blockId', NvU32, 4), ('nextExpectedSampleTimems', NvU32, 8), ('countersReq', NvU32, 12), ('countersReturned', NvU32, 16), ('counterBlock', c.Array[NvU32, Literal[32]], 20)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS(c.Struct): + SIZE = 1164 + cmd: int + input: int + resultSz: int + result: c.Array[ctypes.c_uint32, Literal[288]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS.register_fields([('cmd', NvU32, 0), ('input', NvU32, 4), ('resultSz', NvU32, 8), ('result', c.Array[NvU32, Literal[288]], 12)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE(c.Struct): + SIZE = 8 + frameTime: int + renderTime: int + targetTime: int + sleepTime: int + sampleNumber: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE.register_fields([('frameTime', NvU16, 0), ('renderTime', NvU16, 2), ('targetTime', NvU16, 4), ('sleepTime', NvU8, 6), ('sampleNumber', NvU8, 7)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS(c.Struct): + SIZE = 514 + samples: c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, Literal[64]] + nextSampleNumber: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS.register_fields([('samples', c.Array[NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, Literal[64]], 0), ('nextSampleNumber', NvU8, 512)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS(c.Struct): + SIZE = 8 + sampleData: struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS.register_fields([('sampleData', NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, 0)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS(c.Struct): + SIZE = 40 + offset: int + length: int + cacheOps: int + hDevice: int + hObject: int + internalOnly: int +struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS.register_fields([('offset', NvU64, 0), ('length', NvU64, 8), ('cacheOps', NvU32, 16), ('hDevice', NvHandle, 20), ('hObject', NvHandle, 24), ('internalOnly', NvU64, 32)]) +NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS(c.Struct): + SIZE = 4 + fd: int +struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS.register_fields([('fd', NvS32, 0)]) +NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS +enum_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE: dict[int, str] = {(NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_NONE:=0): 'NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_NONE', (NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_RM:=1): 'NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_RM'} +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT(c.Struct): + SIZE = 16 + type: int + data: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data(c.Struct): + SIZE = 12 + rmObject: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject(c.Struct): + SIZE = 12 + hDevice: int + hParent: int + hObject: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject.register_fields([('hDevice', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8)]) +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data.register_fields([('rmObject', struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject, 0)]) +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT.register_fields([('type', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE, 0), ('data', struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data, 4)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS(c.Struct): + SIZE = 24 + object: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT + fd: int + flags: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS.register_fields([('object', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT, 0), ('fd', NvS32, 16), ('flags', NvU32, 20)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS(c.Struct): + SIZE = 20 + fd: int + object: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT +struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS.register_fields([('fd', NvS32, 0), ('object', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT, 4)]) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + minorNum: int +struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('minorNum', NvU32, 4)]) +NV0000_CTRL_OS_GET_GPU_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS(c.Struct): + SIZE = 80 + fd: int + deviceInstance: int + gpuInstanceId: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS.register_fields([('fd', NvS32, 0), ('deviceInstance', NvU32, 4), ('gpuInstanceId', NvU32, 8), ('maxObjects', NvU16, 12), ('metadata', c.Array[NvU8, Literal[64]], 14)]) +NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS(c.Struct): + SIZE = 76 + hDevice: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] + fd: int +struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS.register_fields([('hDevice', NvHandle, 0), ('maxObjects', NvU16, 4), ('metadata', c.Array[NvU8, Literal[64]], 6), ('fd', NvS32, 72)]) +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS(c.Struct): + SIZE = 2128 + fd: int + hDevice: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] + objects: c.Array[ctypes.c_uint32, Literal[512]] + numObjects: int + index: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS.register_fields([('fd', NvS32, 0), ('hDevice', NvHandle, 4), ('maxObjects', NvU16, 8), ('metadata', c.Array[NvU8, Literal[64]], 10), ('objects', c.Array[NvHandle, Literal[512]], 76), ('numObjects', NvU16, 2124), ('index', NvU16, 2126)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS(c.Struct): + SIZE = 652 + fd: int + hParent: int + objects: c.Array[ctypes.c_uint32, Literal[128]] + objectTypes: c.Array[ctypes.c_ubyte, Literal[128]] + numObjects: int + index: int +struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS.register_fields([('fd', NvS32, 0), ('hParent', NvHandle, 4), ('objects', c.Array[NvHandle, Literal[128]], 8), ('objectTypes', c.Array[NvU8, Literal[128]], 520), ('numObjects', NvU16, 648), ('index', NvU16, 650)]) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS(c.Struct): + SIZE = 40 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + gpuPciId: int + gpuPciBdf: int + vgpuTypeId: int + vgpuId: int + gpuInstanceId: int + placementId: int +struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('gpuPciId', NvU32, 16), ('gpuPciBdf', NvU32, 20), ('vgpuTypeId', NvU32, 24), ('vgpuId', NvU16, 28), ('gpuInstanceId', NvU32, 32), ('placementId', NvU32, 36)]) +NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS(c.Struct): + SIZE = 524 + gpuPciId: int + gpuPciBdf: int + numVgpuTypes: int + vgpuTypeIds: c.Array[ctypes.c_uint32, Literal[64]] + availableInstances: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS.register_fields([('gpuPciId', NvU32, 0), ('gpuPciBdf', NvU32, 4), ('numVgpuTypes', NvU32, 8), ('vgpuTypeIds', c.Array[NvU32, Literal[64]], 12), ('availableInstances', c.Array[NvU32, Literal[64]], 268)]) +NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS(c.Struct): + SIZE = 18 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + vgpuId: int +struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('vgpuId', NvU16, 16)]) +NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS(c.Struct): + SIZE = 8 + returnStatus: int + gpuId: int +struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS.register_fields([('returnStatus', NvU32, 0), ('gpuId', NvU32, 4)]) +NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS(c.Struct): + SIZE = 24 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + mode: int + sysfs_val: int +struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('mode', NvU32, 16), ('sysfs_val', NvU32, 20)]) +NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS +@c.record +class struct_NV0080_CTRL_BIF_RESET_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV0080_CTRL_BIF_RESET_PARAMS.register_fields([('flags', NvU32, 0)]) +NV0080_CTRL_BIF_RESET_PARAMS: TypeAlias = struct_NV0080_CTRL_BIF_RESET_PARAMS +@c.record +class struct_NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS(c.Struct): + SIZE = 4 + aspmFeatureSupported: int +struct_NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS.register_fields([('aspmFeatureSupported', NvU32, 0)]) +NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS: TypeAlias = struct_NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS +@c.record +class struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS(c.Struct): + SIZE = 2 + bL0sEnable: int + bL1Enable: int +struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS.register_fields([('bL0sEnable', NvBool, 0), ('bL1Enable', NvBool, 1)]) +NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS: TypeAlias = struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS(c.Struct): + SIZE = 12 + pciePowerControlMask: int + pciePowerControlIdentifiedKeyOrder: int + pciePowerControlIdentifiedKeyLocation: int +struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS.register_fields([('pciePowerControlMask', NvU32, 0), ('pciePowerControlIdentifiedKeyOrder', NvU32, 4), ('pciePowerControlIdentifiedKeyLocation', NvU32, 8)]) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS +@c.record +class struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS(c.Struct): + SIZE = 24 + capsTblSize: int + capsTbl: ctypes.c_void_p + instanceId: int +struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8), ('instanceId', NvU32, 16)]) +NV0080_CTRL_BSP_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2(c.Struct): + SIZE = 12 + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] + instanceId: int +struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2.register_fields([('capsTbl', c.Array[NvU8, Literal[8]], 0), ('instanceId', NvU32, 8)]) +NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2: TypeAlias = struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2 +@c.record +class struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK(c.Struct): + SIZE = 32 + pageSize: int + pteEntrySize: int + comptagLine: int + kind: int + pteFlags: int +struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK.register_fields([('pageSize', NvU64, 0), ('pteEntrySize', NvU64, 8), ('comptagLine', NvU32, 16), ('kind', NvU32, 20), ('pteFlags', NvU32, 24)]) +NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK: TypeAlias = struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK +@c.record +class struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS(c.Struct): + SIZE = 184 + gpuAddr: int + subDeviceId: int + skipVASpaceInit: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]] + hVASpace: int +struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('subDeviceId', NvU32, 8), ('skipVASpaceInit', NvU8, 12), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]], 16), ('hVASpace', NvHandle, 176)]) +NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS(c.Struct): + SIZE = 184 + gpuAddr: int + subDeviceId: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]] + hVASpace: int +struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('subDeviceId', NvU32, 8), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]], 16), ('hVASpace', NvHandle, 176)]) +NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS(c.Struct): + SIZE = 96 + pageCount: int + hwResource: struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource + comprInfo: struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo + offset: int + gpuAddr: int + pageArray: ctypes.c_void_p + pteMem: ctypes.c_void_p + pteMemPfn: int + pageSize: int + startPageIndex: int + flags: int + hSrcVASpace: int + hTgtVASpace: int + peerId: int +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + hMemory: int + subDeviceId: int +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('subDeviceId', NvU32, 12)]) +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo(c.Struct): + SIZE = 12 + fbKind: int + sysKind: int + compTagStartOffset: int +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo.register_fields([('fbKind', NvU32, 0), ('sysKind', NvU32, 4), ('compTagStartOffset', NvU32, 8)]) +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS.register_fields([('pageCount', NvU32, 0), ('hwResource', struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource, 4), ('comprInfo', struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo, 20), ('offset', NvU64, 32), ('gpuAddr', NvU64, 40), ('pageArray', NvP64, 48), ('pteMem', NvP64, 56), ('pteMemPfn', NvU32, 64), ('pageSize', NvU32, 68), ('startPageIndex', NvU32, 72), ('flags', NvU32, 76), ('hSrcVASpace', NvHandle, 80), ('hTgtVASpace', NvHandle, 84), ('peerId', NvU32, 88)]) +NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_FLUSH_PARAMS(c.Struct): + SIZE = 4 + targetUnit: int +struct_NV0080_CTRL_DMA_FLUSH_PARAMS.register_fields([('targetUnit', NvU32, 0)]) +NV0080_CTRL_DMA_FLUSH_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_FLUSH_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT(c.Struct): + SIZE = 8 + pageTableSize: int + pageTableCoverage: int +struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT.register_fields([('pageTableSize', NvU32, 0), ('pageTableCoverage', NvU32, 4)]) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT: TypeAlias = struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT +@c.record +class struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS(c.Struct): + SIZE = 192 + vaBitCount: int + pdeCoverageBitCount: int + num4KPageTableFormats: int + bigPageSize: int + compressionPageSize: int + dualPageTableSupported: int + idealVRAMPageSize: int + pageTableBigFormat: struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT + pageTable4KFormat: c.Array[struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, Literal[16]] + hVASpace: int + vaRangeLo: int + vaSpaceId: int + supportedPageSizeMask: int +struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS.register_fields([('vaBitCount', NvU32, 0), ('pdeCoverageBitCount', NvU32, 4), ('num4KPageTableFormats', NvU32, 8), ('bigPageSize', NvU32, 12), ('compressionPageSize', NvU32, 16), ('dualPageTableSupported', NvU32, 20), ('idealVRAMPageSize', NvU32, 24), ('pageTableBigFormat', NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, 28), ('pageTable4KFormat', c.Array[NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, Literal[16]], 36), ('hVASpace', NvHandle, 164), ('vaRangeLo', NvU64, 168), ('vaSpaceId', NvU32, 176), ('supportedPageSizeMask', NvU64, 184)]) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK(c.Struct): + SIZE = 32 + ptePhysAddr: int + pteCacheAttrib: int + pteEntrySize: int + pageSize: int + pteAddrSpace: int + pdeVASpaceSize: int + pdeFlags: int +struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK.register_fields([('ptePhysAddr', NvU64, 0), ('pteCacheAttrib', NvU32, 8), ('pteEntrySize', NvU32, 12), ('pageSize', NvU32, 16), ('pteAddrSpace', NvU32, 20), ('pdeVASpaceSize', NvU32, 24), ('pdeFlags', NvU32, 28)]) +NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK: TypeAlias = struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK +@c.record +class struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS(c.Struct): + SIZE = 208 + gpuAddr: int + pdeVirtAddr: int + pdeEntrySize: int + pdeAddrSpace: int + pdeSize: int + subDeviceId: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK, Literal[5]] + pdbAddr: int + hVASpace: int +struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('pdeVirtAddr', NvU64, 8), ('pdeEntrySize', NvU32, 16), ('pdeAddrSpace', NvU32, 20), ('pdeSize', NvU32, 24), ('subDeviceId', NvU32, 28), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK, Literal[5]], 32), ('pdbAddr', NvU64, 192), ('hVASpace', NvHandle, 200)]) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS(c.Struct): + SIZE = 8 + hVASpace: int + flags: int +struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS.register_fields([('hVASpace', NvHandle, 0), ('flags', NvU32, 4)]) +NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS(c.Struct): + SIZE = 12 + capsTblSize: int + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', c.Array[NvU8, Literal[8]], 4)]) +NV0080_CTRL_DMA_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS(c.Struct): + SIZE = 16 + vaSpaceSize: int + hVASpace: int +struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS.register_fields([('vaSpaceSize', NvU64, 0), ('hVASpace', NvHandle, 8)]) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS(c.Struct): + SIZE = 16 + physAddr: int + numEntries: int + aperture: int +struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS.register_fields([('physAddr', NvU64, 0), ('numEntries', NvU32, 8), ('aperture', NvU32, 12)]) +NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS(c.Struct): + SIZE = 64 + pdeIndex: int + flags: int + ptParams: c.Array[struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS, Literal[2]] + hVASpace: int + pPdeBuffer: ctypes.c_void_p + subDeviceId: int +struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS.register_fields([('pdeIndex', NvU32, 0), ('flags', NvU32, 4), ('ptParams', c.Array[NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS, Literal[2]], 8), ('hVASpace', NvHandle, 40), ('pPdeBuffer', NvP64, 48), ('subDeviceId', NvU32, 56)]) +NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS(c.Struct): + SIZE = 4 + hVASpace: int +struct_NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS.register_fields([('hVASpace', NvHandle, 0)]) +NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS(c.Struct): + SIZE = 4 + hVASpace: int +struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS.register_fields([('hVASpace', NvHandle, 0)]) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS(c.Struct): + SIZE = 32 + physAddress: int + numEntries: int + flags: int + hVASpace: int + chId: int + subDeviceId: int + pasid: int +struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS.register_fields([('physAddress', NvU64, 0), ('numEntries', NvU32, 8), ('flags', NvU32, 12), ('hVASpace', NvHandle, 16), ('chId', NvU32, 20), ('subDeviceId', NvU32, 24), ('pasid', NvU32, 28)]) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS(c.Struct): + SIZE = 8 + hVASpace: int + subDeviceId: int +struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS.register_fields([('hVASpace', NvHandle, 0), ('subDeviceId', NvU32, 4)]) +NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_FB_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_FB_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS(c.Struct): + SIZE = 80 + Size: int + Address: int + AddressSpace: int + MaxCompbitLine: int + comptagsPerCacheLine: int + cacheLineSize: int + cacheLineSizePerSlice: int + cacheLineFetchAlignment: int + backingStoreBase: int + gobsPerComptagPerSlice: int + backingStoreCbcBase: int + comptaglineAllocationPolicy: int + privRegionStartOffset: int + cbcCoveragePerSlice: int +struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS.register_fields([('Size', NvU64, 0), ('Address', NvU64, 8), ('AddressSpace', NvU32, 16), ('MaxCompbitLine', NvU32, 20), ('comptagsPerCacheLine', NvU32, 24), ('cacheLineSize', NvU32, 28), ('cacheLineSizePerSlice', NvU32, 32), ('cacheLineFetchAlignment', NvU32, 36), ('backingStoreBase', NvU64, 40), ('gobsPerComptagPerSlice', NvU32, 48), ('backingStoreCbcBase', NvU32, 52), ('comptaglineAllocationPolicy', NvU32, 56), ('privRegionStartOffset', NvU64, 64), ('cbcCoveragePerSlice', NvU32, 72)]) +NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 3 + capsTbl: c.Array[ctypes.c_ubyte, Literal[3]] +struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[3]], 0)]) +NV0080_CTRL_FB_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS.register_fields([('value', NvU32, 0)]) +NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS +enum_NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY: dict[int, str] = {(NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_DEFAULT:=0): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_DEFAULT', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_NONCONTIGUOUS:=1): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_NONCONTIGUOUS', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_CONTIGUOUS:=2): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_CONTIGUOUS', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_ALLOW_NONCONTIGUOUS:=3): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_ALLOW_NONCONTIGUOUS'} +NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_FIFO_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS(c.Struct): + SIZE = 12 + engineId: int + alignment: int + size: int +struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS.register_fields([('engineId', NvU32, 0), ('alignment', NvU32, 4), ('size', NvU32, 8)]) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_RUNLIST_GROUP_CHANNELS_PARAM(c.Struct): + SIZE = 8 + hChannel1: int + hChannel2: int +struct_NV0080_CTRL_FIFO_RUNLIST_GROUP_CHANNELS_PARAM.register_fields([('hChannel1', NvHandle, 0), ('hChannel2', NvHandle, 4)]) +NV0080_CTRL_FIFO_RUNLIST_GROUP_CHANNELS_PARAM: TypeAlias = struct_NV0080_CTRL_FIFO_RUNLIST_GROUP_CHANNELS_PARAM +@c.record +class struct_NV0080_CTRL_FIFO_RUNLIST_DIVIDE_TIMESLICE_PARAM(c.Struct): + SIZE = 8 + hChannel: int + tsDivisor: int +struct_NV0080_CTRL_FIFO_RUNLIST_DIVIDE_TIMESLICE_PARAM.register_fields([('hChannel', NvHandle, 0), ('tsDivisor', NvU32, 4)]) +NV0080_CTRL_FIFO_RUNLIST_DIVIDE_TIMESLICE_PARAM: TypeAlias = struct_NV0080_CTRL_FIFO_RUNLIST_DIVIDE_TIMESLICE_PARAM +@c.record +class struct_NV0080_CTRL_FIFO_PREEMPT_RUNLIST_PARAMS(c.Struct): + SIZE = 8 + hRunlist: int + engineID: int +struct_NV0080_CTRL_FIFO_PREEMPT_RUNLIST_PARAMS.register_fields([('hRunlist', NvHandle, 0), ('engineID', NvU32, 4)]) +NV0080_CTRL_FIFO_PREEMPT_RUNLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_PREEMPT_RUNLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS(c.Struct): + SIZE = 24 + numChannels: int + pChannelHandleList: ctypes.c_void_p + pChannelList: ctypes.c_void_p +struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS.register_fields([('numChannels', NvU32, 0), ('pChannelHandleList', NvP64, 8), ('pChannelList', NvP64, 16)]) +NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 12 + engineID: int + gpEntries: int + pbEntries: int +struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS.register_fields([('engineID', NvU32, 0), ('gpEntries', NvU32, 4), ('pbEntries', NvU32, 8)]) +NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + property: int + value: int +struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('property', NvU32, 4), ('value', NvU64, 8)]) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS(c.Struct): + SIZE = 4 + engineID: int +struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS.register_fields([('engineID', NvU32, 0)]) +NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS(c.Struct): + SIZE = 4 + engineID: int +struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS.register_fields([('engineID', NvU32, 0)]) +NV0080_CTRL_FIFO_START_RUNLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 2 + capsTbl: c.Array[ctypes.c_ubyte, Literal[2]] +struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[2]], 0)]) +NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS(c.Struct): + SIZE = 16396 + numChannels: int + hChannels: c.Array[ctypes.c_uint32, Literal[4096]] + flags: int + timeout: int +struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS.register_fields([('numChannels', NvU32, 0), ('hChannels', c.Array[NvHandle, Literal[4096]], 4), ('flags', NvU32, 16388), ('timeout', NvU32, 16392)]) +NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS(c.Struct): + SIZE = 16 + numClasses: int + classList: ctypes.c_void_p +struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS.register_fields([('numClasses', NvU32, 0), ('classList', NvP64, 8)]) +NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS(c.Struct): + SIZE = 4 + numSubDevices: int +struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS.register_fields([('numSubDevices', NvU32, 0)]) +NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS(c.Struct): + SIZE = 36 + ConnectionCount: int + Order: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS.register_fields([('ConnectionCount', NvU32, 0), ('Order', c.Array[NvU32, Literal[8]], 4)]) +NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS(c.Struct): + SIZE = 4 + subDeviceInstance: int +struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS.register_fields([('subDeviceInstance', NvU32, 0)]) +NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS(c.Struct): + SIZE = 4 + subDeviceInstance: int +struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS.register_fields([('subDeviceInstance', NvU32, 0)]) +NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS(c.Struct): + SIZE = 4 + enable: int +struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS.register_fields([('enable', NvU32, 0)]) +NV0080_CTRL_GPU_SET_VIDLINK_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS(c.Struct): + SIZE = 4 + newState: int +struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS.register_fields([('newState', NvU32, 0)]) +NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS(c.Struct): + SIZE = 4 + swStatePersistence: int +struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS.register_fields([('swStatePersistence', NvU32, 0)]) +NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS(c.Struct): + SIZE = 8 + virtualizationMode: int + isGridBuild: int +struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS.register_fields([('virtualizationMode', NvU32, 0), ('isGridBuild', NvBool, 4)]) +NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS(c.Struct): + SIZE = 12 + defaultSetting: int + currentSetting: int + pendingSetting: int +struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS.register_fields([('defaultSetting', NvU32, 0), ('currentSetting', NvU32, 4), ('pendingSetting', NvU32, 8)]) +NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS(c.Struct): + SIZE = 4 + setting: int +struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS.register_fields([('setting', NvU32, 0)]) +NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS(c.Struct): + SIZE = 1 + isVgx: int +struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS.register_fields([('isVgx', NvBool, 0)]) +NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS(c.Struct): + SIZE = 80 + totalVFs: int + firstVfOffset: int + vfFeatureMask: int + FirstVFBar0Address: int + FirstVFBar1Address: int + FirstVFBar2Address: int + bar0Size: int + bar1Size: int + bar2Size: int + b64bitBar0: int + b64bitBar1: int + b64bitBar2: int + bSriovEnabled: int + bSriovHeavyEnabled: int + bEmulateVFBar0TlbInvalidationRegister: int + bClientRmAllocatedCtxBuffer: int + bNonPowerOf2ChannelCountSupported: int + bVfResizableBAR1Supported: int +struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS.register_fields([('totalVFs', NvU32, 0), ('firstVfOffset', NvU32, 4), ('vfFeatureMask', NvU32, 8), ('FirstVFBar0Address', NvU64, 16), ('FirstVFBar1Address', NvU64, 24), ('FirstVFBar2Address', NvU64, 32), ('bar0Size', NvU64, 40), ('bar1Size', NvU64, 48), ('bar2Size', NvU64, 56), ('b64bitBar0', NvBool, 64), ('b64bitBar1', NvBool, 65), ('b64bitBar2', NvBool, 66), ('bSriovEnabled', NvBool, 67), ('bSriovHeavyEnabled', NvBool, 68), ('bEmulateVFBar0TlbInvalidationRegister', NvBool, 69), ('bClientRmAllocatedCtxBuffer', NvBool, 70), ('bNonPowerOf2ChannelCountSupported', NvBool, 71), ('bVfResizableBAR1Supported', NvBool, 72)]) +NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS(c.Struct): + SIZE = 404 + numClasses: int + classList: c.Array[ctypes.c_uint32, Literal[100]] +struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS.register_fields([('numClasses', NvU32, 0), ('classList', c.Array[NvU32, Literal[100]], 4)]) +NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM(c.Struct): + SIZE = 8 + subDeviceInst: int + hSubDevice: int +struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM.register_fields([('subDeviceInst', NvU32, 0), ('hSubDevice', NvHandle, 4)]) +NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM: TypeAlias = struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM +@c.record +class struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS(c.Struct): + SIZE = 4 + brands: int +struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS.register_fields([('brands', NvU32, 0)]) +NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS(c.Struct): + SIZE = 8 + vfBar1SizeMB: int + numVfs: int +struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS.register_fields([('vfBar1SizeMB', NvU32, 0), ('numVfs', NvU32, 4)]) +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 1 + bHeterogeneousMode: int +struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0)]) +NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 1 + bHeterogeneousMode: int +struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0)]) +NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GR_ROUTE_INFO(c.Struct): + SIZE = 16 + flags: int + route: int +struct_NV0080_CTRL_GR_ROUTE_INFO.register_fields([('flags', NvU32, 0), ('route', NvU64, 8)]) +NV0080_CTRL_GR_ROUTE_INFO: TypeAlias = struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV0080_CTRL_GR_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_GR_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_GR_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_PARAMS +@c.record +class struct_NVXXXX_CTRL_XXX_INFO(c.Struct): + SIZE = 8 + index: int + data: int +NV0080_CTRL_GR_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +struct_NVXXXX_CTRL_XXX_INFO.register_fields([('index', NvU32, 0), ('data', NvU32, 4)]) +@c.record +class struct_NV0080_CTRL_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + grInfoListSize: int + grInfoList: ctypes.c_void_p +struct_NV0080_CTRL_GR_GET_INFO_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', NvP64, 8)]) +NV0080_CTRL_GR_GET_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_PARAMS +enum_NV0080_CTRL_GR_TPC_PARTITION_MODE: dict[int, str] = {(NV0080_CTRL_GR_TPC_PARTITION_MODE_NONE:=0): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_NONE', (NV0080_CTRL_GR_TPC_PARTITION_MODE_STATIC:=1): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_STATIC', (NV0080_CTRL_GR_TPC_PARTITION_MODE_DYNAMIC:=2): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_DYNAMIC'} +NV0080_CTRL_GR_TPC_PARTITION_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS(c.Struct): + SIZE = 32 + hChannelGroup: int + mode: int + bEnableAllTpcs: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS.register_fields([('hChannelGroup', NvHandle, 0), ('mode', NV0080_CTRL_GR_TPC_PARTITION_MODE, 4), ('bEnableAllTpcs', NvBool, 8), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 16)]) +NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +NV0080_CTRL_GR_GET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +NV0080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 48 + capsTbl: c.Array[ctypes.c_ubyte, Literal[23]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + bCapsPopulated: int +struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[23]], 0), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 24), ('bCapsPopulated', NvBool, 40)]) +NV0080_CTRL_GR_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 488 + grInfoListSize: int + grInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[58]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', c.Array[NV0080_CTRL_GR_INFO, Literal[58]], 4), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 472)]) +NV0080_CTRL_GR_GET_INFO_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS +@c.record +class struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_HOST_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 3 + capsTbl: c.Array[ctypes.c_ubyte, Literal[3]] +struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[3]], 0)]) +NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS(c.Struct): + SIZE = 32 + params: struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS.register_fields([('params', NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS, 0)]) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS(c.Struct): + SIZE = 32 + params: struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS.register_fields([('params', NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS, 0)]) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS +@c.record +class struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS(c.Struct): + SIZE = 804 + numClients: int + clientHandles: c.Array[ctypes.c_uint32, Literal[200]] +struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS.register_fields([('numClients', NvU32, 0), ('clientHandles', c.Array[NvHandle, Literal[200]], 4)]) +NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS +@c.record +class struct_NV0080_CTRL_MSENC_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_MSENC_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_MSENC_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_MSENC_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 8 + capsTbl: c.Array[ctypes.c_ubyte, Literal[4]] + instanceId: int +struct_NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[4]], 0), ('instanceId', NvU32, 4)]) +NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 16 + capsTbl: c.Array[ctypes.c_ubyte, Literal[9]] + instanceId: int +struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[9]], 0), ('instanceId', NvU32, 12)]) +NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bActivate: int +struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS.register_fields([('bActivate', NvBool, 0)]) +NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS: TypeAlias = struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS +@c.record +class struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bCudaLimit: int +struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS.register_fields([('bCudaLimit', NvBool, 0)]) +NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS: TypeAlias = struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS +@c.record +class struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS(c.Struct): + SIZE = 4 + cmd: int +struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS.register_fields([('cmd', NvU32, 0)]) +NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS: TypeAlias = struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS +@c.record +class struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS(c.Struct): + SIZE = 32 + subDeviceInstance: int + width: int + height: int + depth: int + pitch: int + baseAddress: int + size: int +struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS.register_fields([('subDeviceInstance', NvU32, 0), ('width', NvU16, 4), ('height', NvU16, 6), ('depth', NvU16, 8), ('pitch', NvU16, 10), ('baseAddress', NvU64, 16), ('size', NvU64, 24)]) +NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS +NV2080_CTRL_BIOS_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + biosInfoListSize: int + biosInfoList: ctypes.c_void_p +struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS.register_fields([('biosInfoListSize', NvU32, 0), ('biosInfoList', NvP64, 8)]) +NV2080_CTRL_BIOS_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 124 + biosInfoListSize: int + biosInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[15]] +struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS.register_fields([('biosInfoListSize', NvU32, 0), ('biosInfoList', c.Array[NV2080_CTRL_BIOS_INFO, Literal[15]], 4)]) +NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_NBSI_REG_STRING(c.Struct): + SIZE = 520 + size: int + type: int + value: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value +@c.record +class struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value(c.Struct): + SIZE = 512 + ascii: c.Array[ctypes.c_ubyte, Literal[256]] + unicode: c.Array[ctypes.c_uint16, Literal[256]] + hash: int +struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value.register_fields([('ascii', c.Array[NvU8, Literal[256]], 0), ('unicode', c.Array[NvU16, Literal[256]], 0), ('hash', NvU16, 0)]) +struct_NV2080_CTRL_BIOS_NBSI_REG_STRING.register_fields([('size', NvU32, 0), ('type', NvU32, 4), ('value', struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value, 8)]) +NV2080_CTRL_BIOS_NBSI_REG_STRING: TypeAlias = struct_NV2080_CTRL_BIOS_NBSI_REG_STRING +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS(c.Struct): + SIZE = 1064 + module: int + path: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + valueName: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + retBuf: ctypes.c_void_p + retSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS.register_fields([('module', NvU32, 0), ('path', NV2080_CTRL_BIOS_NBSI_REG_STRING, 4), ('valueName', NV2080_CTRL_BIOS_NBSI_REG_STRING, 524), ('retBuf', NvP64, 1048), ('retSize', NvU32, 1056), ('errorCode', NvU32, 1060)]) +NV2080_CTRL_BIOS_GET_NBSI_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS(c.Struct): + SIZE = 1308 + module: int + path: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + valueName: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + retBuf: c.Array[ctypes.c_ubyte, Literal[256]] + retSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS.register_fields([('module', NvU32, 0), ('path', NV2080_CTRL_BIOS_NBSI_REG_STRING, 4), ('valueName', NV2080_CTRL_BIOS_NBSI_REG_STRING, 524), ('retBuf', c.Array[NvU8, Literal[256]], 1044), ('retSize', NvU32, 1300), ('errorCode', NvU32, 1304)]) +NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS(c.Struct): + SIZE = 40 + globType: int + globIndex: int + globSource: int + retBufOffset: int + retBuf: ctypes.c_void_p + retSize: int + totalObjSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS.register_fields([('globType', NvU16, 0), ('globIndex', NvU8, 2), ('globSource', NvU16, 4), ('retBufOffset', NvU32, 8), ('retBuf', NvP64, 16), ('retSize', NvU32, 24), ('totalObjSize', NvU32, 28), ('errorCode', NvU32, 32)]) +NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS(c.Struct): + SIZE = 48 + BoardID: int + chipSKU: c.Array[ctypes.c_char, Literal[9]] + chipSKUMod: c.Array[ctypes.c_char, Literal[5]] + skuConfigVersion: int + project: c.Array[ctypes.c_char, Literal[5]] + projectSKU: c.Array[ctypes.c_char, Literal[5]] + CDP: c.Array[ctypes.c_char, Literal[6]] + projectSKUMod: c.Array[ctypes.c_char, Literal[2]] + businessCycle: int +struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS.register_fields([('BoardID', NvU32, 0), ('chipSKU', c.Array[ctypes.c_char, Literal[9]], 4), ('chipSKUMod', c.Array[ctypes.c_char, Literal[5]], 13), ('skuConfigVersion', NvU32, 20), ('project', c.Array[ctypes.c_char, Literal[5]], 24), ('projectSKU', c.Array[ctypes.c_char, Literal[5]], 29), ('CDP', c.Array[ctypes.c_char, Literal[6]], 34), ('projectSKUMod', c.Array[ctypes.c_char, Literal[2]], 40), ('businessCycle', NvU32, 44)]) +NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS(c.Struct): + SIZE = 8 + vbiosPostTime: int +struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS.register_fields([('vbiosPostTime', NvU64, 0)]) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS(c.Struct): + SIZE = 8 + version: int + flags: int +struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS.register_fields([('version', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS(c.Struct): + SIZE = 16 + pciDeviceId: int + pciSubSystemId: int + pciRevisionId: int + pciExtDeviceId: int +struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS.register_fields([('pciDeviceId', NvU32, 0), ('pciSubSystemId', NvU32, 4), ('pciRevisionId', NvU32, 8), ('pciExtDeviceId', NvU32, 12)]) +NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS +NV2080_CTRL_BUS_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_BUS_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + busInfoListSize: int + busInfoList: ctypes.c_void_p +struct_NV2080_CTRL_BUS_GET_INFO_PARAMS.register_fields([('busInfoListSize', NvU32, 0), ('busInfoList', NvP64, 8)]) +NV2080_CTRL_BUS_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 420 + busInfoListSize: int + busInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[52]] +struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS.register_fields([('busInfoListSize', NvU32, 0), ('busInfoList', c.Array[NV2080_CTRL_BUS_INFO, Literal[52]], 4)]) +NV2080_CTRL_BUS_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_PCI_BAR_INFO(c.Struct): + SIZE = 24 + flags: int + barSize: int + barSizeBytes: int + barOffset: int +struct_NV2080_CTRL_BUS_PCI_BAR_INFO.register_fields([('flags', NvU32, 0), ('barSize', NvU32, 4), ('barSizeBytes', NvU64, 8), ('barOffset', NvU64, 16)]) +NV2080_CTRL_BUS_PCI_BAR_INFO: TypeAlias = struct_NV2080_CTRL_BUS_PCI_BAR_INFO +@c.record +class struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS(c.Struct): + SIZE = 200 + pciBarCount: int + pciBarInfo: c.Array[struct_NV2080_CTRL_BUS_PCI_BAR_INFO, Literal[8]] +struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS.register_fields([('pciBarCount', NvU32, 0), ('pciBarInfo', c.Array[NV2080_CTRL_BUS_PCI_BAR_INFO, Literal[8]], 8)]) +NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS(c.Struct): + SIZE = 8 + pcieLinkWidth: int + failingReason: int +struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS.register_fields([('pcieLinkWidth', NvU32, 0), ('failingReason', NvU32, 4)]) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS(c.Struct): + SIZE = 4 + busSpeed: int +struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS.register_fields([('busSpeed', NvU32, 0)]) +NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_BUS_MAP_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS(c.Struct): + SIZE = 12 + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0), ('offset', NvU32, 4), ('size', NvU32, 8)]) +NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS(c.Struct): + SIZE = 8 + command: int + deviceState: int +struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS.register_fields([('command', NvU8, 0), ('deviceState', NvU32, 4)]) +NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 76 + pexCounterMask: int + pexTotalCorrectableErrors: int + pexCorrectableErrors: int + pexTotalNonFatalErrors: int + pexTotalFatalErrors: int + pexTotalUnsupportedReqs: int + pexCounters: c.Array[ctypes.c_uint16, Literal[31]] +struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('pexTotalCorrectableErrors', NvU32, 4), ('pexCorrectableErrors', NvU16, 8), ('pexTotalNonFatalErrors', NvU8, 10), ('pexTotalFatalErrors', NvU8, 11), ('pexTotalUnsupportedReqs', NvU8, 12), ('pexCounters', c.Array[NvU16, Literal[31]], 14)]) +NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + pexCounterMask: int +struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0)]) +NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 8 + pexCounterMask: int + bFreezeRmCounter: int +struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('bFreezeRmCounter', NvBool, 4)]) +NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS(c.Struct): + SIZE = 18 + pexLaneErrorStatus: int + pexLaneCounter: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS.register_fields([('pexLaneErrorStatus', NvU16, 0), ('pexLaneCounter', c.Array[NvU8, Literal[16]], 2)]) +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS(c.Struct): + SIZE = 12 + bPexLtrRegkeyOverride: int + bPexRootPortLtrSupported: int + bPexGpuLtrSupported: int + pexLtrSnoopLatencyValue: int + pexLtrSnoopLatencyScale: int + pexLtrNoSnoopLatencyValue: int + pexLtrNoSnoopLatencyScale: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS.register_fields([('bPexLtrRegkeyOverride', NvBool, 0), ('bPexRootPortLtrSupported', NvBool, 1), ('bPexGpuLtrSupported', NvBool, 2), ('pexLtrSnoopLatencyValue', NvU16, 4), ('pexLtrSnoopLatencyScale', NvU8, 6), ('pexLtrNoSnoopLatencyValue', NvU16, 8), ('pexLtrNoSnoopLatencyScale', NvU8, 10)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS(c.Struct): + SIZE = 8 + pexLtrSnoopLatencyValue: int + pexLtrSnoopLatencyScale: int + pexLtrNoSnoopLatencyValue: int + pexLtrNoSnoopLatencyScale: int +struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS.register_fields([('pexLtrSnoopLatencyValue', NvU16, 0), ('pexLtrSnoopLatencyScale', NvU8, 2), ('pexLtrNoSnoopLatencyValue', NvU16, 4), ('pexLtrNoSnoopLatencyScale', NvU8, 6)]) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS(c.Struct): + SIZE = 32 + pexCounterMask: int + pexCounters: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('pexCounters', c.Array[NvU32, Literal[7]], 4)]) +NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + pexCounterMask: int +struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0)]) +NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_BFD_PARAMS(c.Struct): + SIZE = 20 + valid: int + deviceID: int + vendorID: int + domain: int + bus: int + device: int + function: int +struct_NV2080_CTRL_BUS_GET_BFD_PARAMS.register_fields([('valid', NvBool, 0), ('deviceID', NvU16, 2), ('vendorID', NvU16, 4), ('domain', NvU32, 8), ('bus', NvU16, 12), ('device', NvU16, 14), ('function', NvU8, 16)]) +NV2080_CTRL_BUS_GET_BFD_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_BFD_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_BFD_PARAMSARR(c.Struct): + SIZE = 640 + params: c.Array[struct_NV2080_CTRL_BUS_GET_BFD_PARAMS, Literal[32]] +struct_NV2080_CTRL_BUS_GET_BFD_PARAMSARR.register_fields([('params', c.Array[NV2080_CTRL_BUS_GET_BFD_PARAMS, Literal[32]], 0)]) +NV2080_CTRL_BUS_GET_BFD_PARAMSARR: TypeAlias = struct_NV2080_CTRL_BUS_GET_BFD_PARAMSARR +@c.record +class struct_NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS(c.Struct): + SIZE = 9 + aspmDisableFlags: c.Array[ctypes.c_ubyte, Literal[9]] +struct_NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS.register_fields([('aspmDisableFlags', c.Array[NvBool, Literal[9]], 0)]) +NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS(c.Struct): + SIZE = 128 + nvlinkPeerIdMask: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS.register_fields([('nvlinkPeerIdMask', c.Array[NvU32, Literal[32]], 0)]) +NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS(c.Struct): + SIZE = 3 + eomMode: int + eomNblks: int + eomNerrs: int +struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS.register_fields([('eomMode', NvU8, 0), ('eomNblks', NvU8, 1), ('eomNerrs', NvU8, 2)]) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS(c.Struct): + SIZE = 12 + regAddress: int + laneSelectMask: int + regValue: int +struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS.register_fields([('regAddress', NvU32, 0), ('laneSelectMask', NvU32, 4), ('regValue', NvU16, 8)]) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS(c.Struct): + SIZE = 76 + eomMode: int + eomNblks: int + eomNerrs: int + eomBerEyeSel: int + eomPamEyeSel: int + laneMask: int + eomStatus: c.Array[ctypes.c_uint16, Literal[32]] +struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS.register_fields([('eomMode', NvU8, 0), ('eomNblks', NvU8, 1), ('eomNerrs', NvU8, 2), ('eomBerEyeSel', NvU8, 3), ('eomPamEyeSel', NvU8, 4), ('laneMask', NvU32, 8), ('eomStatus', c.Array[NvU16, Literal[32]], 12)]) +NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS(c.Struct): + SIZE = 12 + capType: int + dbdf: int + atomicsCaps: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS.register_fields([('capType', NvU32, 0), ('dbdf', NvU32, 4), ('atomicsCaps', NvU32, 8)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO(c.Struct): + SIZE = 8 + bSupported: int + attributes: int +struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO.register_fields([('bSupported', NvBool, 0), ('attributes', NvU32, 4)]) +NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO: TypeAlias = struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS(c.Struct): + SIZE = 112 + capType: int + dbdf: int + atomicOp: c.Array[struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO, Literal[13]] +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS.register_fields([('capType', NvU32, 0), ('dbdf', NvU32, 4), ('atomicOp', c.Array[NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO, Literal[13]], 8)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS(c.Struct): + SIZE = 28 + bIsLinkUp: int + nrLinks: int + maxNrLinks: int + linkMask: int + perLinkBwMBps: int + perLinkLaneWidth: int + remoteType: int +struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS.register_fields([('bIsLinkUp', NvBool, 0), ('nrLinks', NvU32, 4), ('maxNrLinks', NvU32, 8), ('linkMask', NvU32, 12), ('perLinkBwMBps', NvU32, 16), ('perLinkLaneWidth', NvU32, 20), ('remoteType', NvU32, 24)]) +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS(c.Struct): + SIZE = 32 + connectionType: int + peerId: int + bEgmPeer: int + bSpaAccessOnly: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bEgmPeer', NvBool, 8), ('bSpaAccessOnly', NvBool, 9), ('bUseUuid', NvBool, 10), ('remoteGpuId', NvU32, 12), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 16)]) +NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS(c.Struct): + SIZE = 32 + connectionType: int + peerId: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bUseUuid', NvBool, 8), ('remoteGpuId', NvU32, 12), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 16)]) +NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS(c.Struct): + SIZE = 4 + atomicsCaps: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS.register_fields([('atomicsCaps', NvU32, 0)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + ceEngineType: int + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV2080_CTRL_CE_GET_CAPS_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('capsTblSize', NvU32, 4), ('capsTbl', NvP64, 8)]) +NV2080_CTRL_CE_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 8 + ceEngineType: int + capsTbl: c.Array[ctypes.c_ubyte, Literal[2]] +struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('capsTbl', c.Array[NvU8, Literal[2]], 4)]) +NV2080_CTRL_CE_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS(c.Struct): + SIZE = 8 + ceEngineType: int + pceMask: int +struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('pceMask', NvU32, 4)]) +NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS(c.Struct): + SIZE = 148 + ceEngineType: int + pceLceMap: c.Array[ctypes.c_uint32, Literal[32]] + grceSharedLceMap: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('pceLceMap', c.Array[NvU32, Literal[32]], 4), ('grceSharedLceMap', c.Array[NvU32, Literal[4]], 132)]) +NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS(c.Struct): + SIZE = 152 + pceLceMap: c.Array[ctypes.c_uint32, Literal[32]] + grceConfig: c.Array[ctypes.c_uint32, Literal[4]] + exposeCeMask: int + bUpdateNvlinkPceLce: int +struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS.register_fields([('pceLceMap', c.Array[NvU32, Literal[32]], 0), ('grceConfig', c.Array[NvU32, Literal[4]], 128), ('exposeCeMask', NvU32, 144), ('bUpdateNvlinkPceLce', NvBool, 148)]) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS(c.Struct): + SIZE = 4 + stubbedCeMask: int +struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS.register_fields([('stubbedCeMask', NvU32, 0)]) +NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS +NV2080_CTRL_CE_GET_PHYSICAL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 4 + size: int +struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS.register_fields([('size', NvU32, 0)]) +NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS(c.Struct): + SIZE = 132 + hshubPceMasks: c.Array[ctypes.c_uint32, Literal[32]] + fbhubPceMask: int +struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS.register_fields([('hshubPceMasks', c.Array[NvU32, Literal[32]], 0), ('fbhubPceMask', NvU32, 128)]) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS(c.Struct): + SIZE = 136 + capsTbl: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[64]] + present: int +struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS.register_fields([('capsTbl', c.Array[c.Array[NvU8, Literal[2]], Literal[64]], 0), ('present', NvU64, 128)]) +NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS +NV2080_CTRL_CE_GET_ALL_PHYSICAL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS(c.Struct): + SIZE = 12 + ceEngineType: int + shimInstance: int + shimLocalLceIdx: int +struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('shimInstance', NvU32, 4), ('shimLocalLceIdx', NvU32, 8)]) +NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS(c.Struct): + SIZE = 156 + pceLceMap: c.Array[ctypes.c_uint32, Literal[32]] + grceConfig: c.Array[ctypes.c_uint32, Literal[4]] + exposeCeMask: int + bUpdateNvlinkPceLce: int + shimInstance: int +struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS.register_fields([('pceLceMap', c.Array[NvU32, Literal[32]], 0), ('grceConfig', c.Array[NvU32, Literal[4]], 128), ('exposeCeMask', NvU32, 144), ('bUpdateNvlinkPceLce', NvBool, 148), ('shimInstance', NvU32, 152)]) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS(c.Struct): + SIZE = 136 + connectingHubPceMasks: c.Array[ctypes.c_uint32, Literal[32]] + fbhubPceMask: int + shimInstance: int +struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS.register_fields([('connectingHubPceMasks', c.Array[NvU32, Literal[32]], 0), ('fbhubPceMask', NvU32, 128), ('shimInstance', NvU32, 132)]) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS +enum_NV2080_CTRL_CE_LCE_TYPE: dict[int, str] = {(NV2080_CTRL_CE_LCE_TYPE_PCIE:=1): 'NV2080_CTRL_CE_LCE_TYPE_PCIE', (NV2080_CTRL_CE_LCE_TYPE_DECOMP:=2): 'NV2080_CTRL_CE_LCE_TYPE_DECOMP', (NV2080_CTRL_CE_LCE_TYPE_SCRUB:=3): 'NV2080_CTRL_CE_LCE_TYPE_SCRUB', (NV2080_CTRL_CE_LCE_TYPE_NVLINK_PEER:=4): 'NV2080_CTRL_CE_LCE_TYPE_NVLINK_PEER', (NV2080_CTRL_CE_LCE_TYPE_C2C:=5): 'NV2080_CTRL_CE_LCE_TYPE_C2C', (NV2080_CTRL_CE_LCE_TYPE_PCIE_RD:=6): 'NV2080_CTRL_CE_LCE_TYPE_PCIE_RD', (NV2080_CTRL_CE_LCE_TYPE_PCIE_WR:=7): 'NV2080_CTRL_CE_LCE_TYPE_PCIE_WR', (NV2080_CTRL_CE_LCE_TYPE_C2C_H2D:=8): 'NV2080_CTRL_CE_LCE_TYPE_C2C_H2D', (NV2080_CTRL_CE_LCE_TYPE_C2C_D2H:=9): 'NV2080_CTRL_CE_LCE_TYPE_C2C_D2H'} +NV2080_CTRL_CE_LCE_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS(c.Struct): + SIZE = 24 + lceType: int + numPces: int + numLces: int + supportedPceMask: int + supportedLceMask: int + pcePerHshub: int +struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS.register_fields([('lceType', NV2080_CTRL_CE_LCE_TYPE, 0), ('numPces', NvU32, 4), ('numLces', NvU32, 8), ('supportedPceMask', NvU32, 12), ('supportedLceMask', NvU32, 16), ('pcePerHshub', NvU32, 20)]) +NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS(c.Struct): + SIZE = 16 + decompLceMask: int + shimInstance: int +struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS.register_fields([('decompLceMask', NvU64, 0), ('shimInstance', NvU32, 8)]) +NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS(c.Struct): + SIZE = 8 + lceIndex: int + bDecompEnabled: int +struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS.register_fields([('lceIndex', NvU32, 0), ('bDecompEnabled', NvBool, 4)]) +NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS +@c.record +class struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + engine: int + hVASpace: int +struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('engine', NvU32, 8), ('hVASpace', NvHandle, 12)]) +NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS: TypeAlias = struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS +NV2080_CTRL_DMA_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_DMA_GET_INFO_PARAMS(c.Struct): + SIZE = 2052 + dmaInfoTblSize: int + dmaInfoTbl: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[256]] +struct_NV2080_CTRL_DMA_GET_INFO_PARAMS.register_fields([('dmaInfoTblSize', NvU32, 0), ('dmaInfoTbl', c.Array[NV2080_CTRL_DMA_INFO, Literal[256]], 4)]) +NV2080_CTRL_DMA_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_DMA_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO(c.Struct): + SIZE = 12 + srcAddr: int + dstAddr: int + relComptagIndex: int +struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO.register_fields([('srcAddr', NvU32, 0), ('dstAddr', NvU32, 4), ('relComptagIndex', NvU16, 8)]) +NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO: TypeAlias = struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO +@c.record +class struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO(c.Struct): + SIZE = 24 + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO.register_fields([('hMemory', NvHandle, 0), ('offset', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_DMABUF_MEM_HANDLE_INFO: TypeAlias = struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO +@c.record +class struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS(c.Struct): + SIZE = 3104 + fd: int + totalObjects: int + numObjects: int + index: int + totalSize: int + mappingType: int + handles: c.Array[struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO, Literal[128]] +struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS.register_fields([('fd', NvS32, 0), ('totalObjects', NvU32, 4), ('numObjects', NvU32, 8), ('index', NvU32, 12), ('totalSize', NvU64, 16), ('mappingType', NvU8, 24), ('handles', c.Array[NV2080_CTRL_DMABUF_MEM_HANDLE_INFO, Literal[128]], 32)]) +NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS(c.Struct): + SIZE = 96 + sramParityUncorrectedUnique: int + sramSecDedUncorrectedUnique: int + sramCorrectedUnique: int + dramUncorrectedTotal: int + dramCorrectedTotal: int + lastClearedTimestamp: int + sramBucketL2: int + sramBucketSM: int + sramBucketPcie: int + sramBucketFirmware: int + sramBucketOther: int + sramErrorThresholdExceeded: int +struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS.register_fields([('sramParityUncorrectedUnique', NvU64, 0), ('sramSecDedUncorrectedUnique', NvU64, 8), ('sramCorrectedUnique', NvU64, 16), ('dramUncorrectedTotal', NvU64, 24), ('dramCorrectedTotal', NvU64, 32), ('lastClearedTimestamp', NvU32, 40), ('sramBucketL2', NvU64, 48), ('sramBucketSM', NvU64, 56), ('sramBucketPcie', NvU64, 64), ('sramBucketFirmware', NvU64, 72), ('sramBucketOther', NvU64, 80), ('sramErrorThresholdExceeded', NvBool, 88)]) +NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS(c.Struct): + SIZE = 40 + sramCorUni: int + sramUncParityUni: int + sramUncSecDedUni: int + dramCorTot: int + dramUncTot: int +struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS.register_fields([('sramCorUni', NvU64, 0), ('sramUncParityUni', NvU64, 8), ('sramUncSecDedUni', NvU64, 16), ('dramCorTot', NvU64, 24), ('dramUncTot', NvU64, 32)]) +NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS(c.Struct): + SIZE = 20 + event: int + action: int + bNotifyState: int + info32: int + info16: int +struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS.register_fields([('event', NvU32, 0), ('action', NvU32, 4), ('bNotifyState', NvBool, 8), ('info32', NvU32, 12), ('info16', NvU16, 16)]) +NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS +enum_NV2080_EVENT_HDACODEC_DSTATE: dict[int, str] = {(NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D0:=0): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D0', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D1:=1): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D1', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D2:=2): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D2', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_HOT:=3): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_HOT', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_COLD:=4): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_COLD', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_DSTATE_MAX:=5): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_DSTATE_MAX'} +NV2080_EVENT_HDACODEC_DSTATE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS(c.Struct): + SIZE = 8 + hSemMemory: int + semOffset: int +struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS.register_fields([('hSemMemory', NvHandle, 0), ('semOffset', NvU32, 4)]) +NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS(c.Struct): + SIZE = 48 + guestMSIAddr: int + guestMSIData: int + hSemMemory: int + isReset: int + vgpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] + domainId: int +struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS.register_fields([('guestMSIAddr', NvU64, 0), ('guestMSIData', NvU32, 8), ('hSemMemory', NvHandle, 12), ('isReset', NvBool, 16), ('vgpuUuid', c.Array[NvU8, Literal[16]], 17), ('domainId', NvU64, 40)]) +NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS(c.Struct): + SIZE = 8 + hSemMemory: int + isSemaMemValidationEnabled: int +struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS.register_fields([('hSemMemory', NvHandle, 0), ('isSemaMemValidationEnabled', NvBool, 4)]) +NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS(c.Struct): + SIZE = 4 + hEvent: int +struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS.register_fields([('hEvent', NvHandle, 0)]) +NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS +enum_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD: dict[int, str] = {(NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_FULL:=0): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_FULL', (NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_SIMPLE:=1): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_SIMPLE', (NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_CUSTOM:=2): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_CUSTOM'} +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS(c.Struct): + SIZE = 20 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int +struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16)]) +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS(c.Struct): + SIZE = 24 + hEventBuffer: int + tracepointMask: int + gspLoggingBufferSize: int + gspLoggingBufferWatermark: int +struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('tracepointMask', NvU64, 8), ('gspLoggingBufferSize', NvU32, 16), ('gspLoggingBufferWatermark', NvU32, 20)]) +NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS +NV2080_CTRL_FB_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_FB_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + fbInfoListSize: int + fbInfoList: ctypes.c_void_p +struct_NV2080_CTRL_FB_GET_INFO_PARAMS.register_fields([('fbInfoListSize', NvU32, 0), ('fbInfoList', NvP64, 8)]) +NV2080_CTRL_FB_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 460 + fbInfoListSize: int + fbInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[57]] +struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS.register_fields([('fbInfoListSize', NvU32, 0), ('fbInfoList', c.Array[NV2080_CTRL_FB_INFO, Literal[57]], 4)]) +NV2080_CTRL_FB_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS(c.Struct): + SIZE = 16 + cpuVirtAddress: ctypes.c_void_p + gpuVirtAddress: int +struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS.register_fields([('cpuVirtAddress', NvP64, 0), ('gpuVirtAddress', NvU64, 8)]) +NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS(c.Struct): + SIZE = 24 + flags: int + driveStrengthRiseCount: int + driveStrengthFallCount: int + driveStrengthTermCount: int + slewStrengthRiseCount: int + slewStrengthFallCount: int +struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS.register_fields([('flags', NvU32, 0), ('driveStrengthRiseCount', NvU32, 4), ('driveStrengthFallCount', NvU32, 8), ('driveStrengthTermCount', NvU32, 12), ('slewStrengthRiseCount', NvU32, 16), ('slewStrengthFallCount', NvU32, 20)]) +NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS(c.Struct): + SIZE = 4024 + addressArray: c.Array[ctypes.c_uint64, Literal[500]] + addressArraySize: int + addressAlign: int + memBlockSizeBytes: int + flags: int +struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS.register_fields([('addressArray', c.Array[NvU64, Literal[500]], 0), ('addressArraySize', NvU32, 4000), ('addressAlign', NvU32, 4004), ('memBlockSizeBytes', NvU64, 4008), ('flags', NvU32, 4016)]) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS +@c.record +class struct_NV2080_CTRL_FB_IS_KIND_PARAMS(c.Struct): + SIZE = 12 + operation: int + kind: int + result: int +struct_NV2080_CTRL_FB_IS_KIND_PARAMS.register_fields([('operation', NvU32, 0), ('kind', NvU32, 4), ('result', NvBool, 8)]) +NV2080_CTRL_FB_IS_KIND_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_IS_KIND_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS(c.Struct): + SIZE = 16 + powerState: int + writeMode: int + bypassMode: int + rcmState: int +struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS.register_fields([('powerState', NvU32, 0), ('writeMode', NvU32, 4), ('bypassMode', NvU32, 8), ('rcmState', NvU32, 12)]) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS +NV2080_CTRL_CMD_FB_GET_FB_REGION_SURFACE_MEM_TYPE_FLAG: TypeAlias = c.Array[ctypes.c_ubyte, Literal[17]] +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO(c.Struct): + SIZE = 48 + base: int + limit: int + reserved: int + performance: int + supportCompressed: int + supportISO: int + bProtected: int + blackList: c.Array[ctypes.c_ubyte, Literal[17]] +struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO.register_fields([('base', NvU64, 0), ('limit', NvU64, 8), ('reserved', NvU64, 16), ('performance', NvU32, 24), ('supportCompressed', NvBool, 28), ('supportISO', NvBool, 29), ('bProtected', NvBool, 30), ('blackList', NV2080_CTRL_CMD_FB_GET_FB_REGION_SURFACE_MEM_TYPE_FLAG, 31)]) +NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS(c.Struct): + SIZE = 776 + numFBRegions: int + fbRegion: c.Array[struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO, Literal[16]] +struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS.register_fields([('numFBRegions', NvU32, 0), ('fbRegion', c.Array[NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO, Literal[16]], 8)]) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO(c.Struct): + SIZE = 32 + pageAddressWithEccOn: int + pageAddressWithEccOff: int + rbcAddress: int + source: int + status: int + timestamp: int +struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO.register_fields([('pageAddressWithEccOn', NvU64, 0), ('pageAddressWithEccOff', NvU64, 8), ('rbcAddress', NvU32, 16), ('source', NvU32, 20), ('status', NvU32, 24), ('timestamp', NvU32, 28)]) +NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO: TypeAlias = struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO +@c.record +class struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS(c.Struct): + SIZE = 2064 + offlined: c.Array[struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]] + pageSize: int + validEntries: int + numPagesAdded: int +struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('pageSize', NvU32, 2048), ('validEntries', NvU32, 2052), ('numPagesAdded', NvU32, 2056)]) +NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 2056 + offlined: c.Array[struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]] + validEntries: int + bRetirementPending: int + retirementPending: int +struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('validEntries', NvU32, 2048), ('bRetirementPending', NvBool, 2052), ('retirementPending', NvU8, 2053)]) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS +enum_NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_CMD_FB_ACR_QUERY_GET_CLIENT_REGION_STATUS:=0): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_CLIENT_REGION_STATUS', (NV2080_CTRL_CMD_FB_ACR_QUERY_GET_REGION_PROPERTY:=1): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_REGION_PROPERTY', (NV2080_CTRL_CMD_FB_ACR_QUERY_GET_FALCON_STATUS:=2): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_FALCON_STATUS'} +NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE: dict[int, str] = {(NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_NONE:=0): 'NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_NONE', (NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_INVALID_CLIENT_REQUEST:=1): 'NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_INVALID_CLIENT_REQUEST'} +NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_ACR_REQUEST_PARAMS(c.Struct): + SIZE = 16 + clientId: int + reqReadMask: int + reqWriteMask: int + regionSize: int +struct_ACR_REQUEST_PARAMS.register_fields([('clientId', NvU32, 0), ('reqReadMask', NvU32, 4), ('reqWriteMask', NvU32, 8), ('regionSize', NvU32, 12)]) +ACR_REQUEST_PARAMS: TypeAlias = struct_ACR_REQUEST_PARAMS +@c.record +class struct_ACR_REGION_ID_PROP(c.Struct): + SIZE = 32 + regionId: int + readMask: int + writeMask: int + regionSize: int + clientMask: int + physicalAddress: int +struct_ACR_REGION_ID_PROP.register_fields([('regionId', NvU32, 0), ('readMask', NvU32, 4), ('writeMask', NvU32, 8), ('regionSize', NvU32, 12), ('clientMask', NvU32, 16), ('physicalAddress', NvU64, 24)]) +ACR_REGION_ID_PROP: TypeAlias = struct_ACR_REGION_ID_PROP +@c.record +class struct_ACR_STATUS_PARAMS(c.Struct): + SIZE = 16 + allocStatus: int + regionId: int + physicalAddress: int +struct_ACR_STATUS_PARAMS.register_fields([('allocStatus', NvU32, 0), ('regionId', NvU32, 4), ('physicalAddress', NvU64, 8)]) +ACR_STATUS_PARAMS: TypeAlias = struct_ACR_STATUS_PARAMS +@c.record +class struct_ACR_REGION_HANDLE(c.Struct): + SIZE = 20 + hClient: int + hParent: int + hMemory: int + hClass: int + hDevice: int +struct_ACR_REGION_HANDLE.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hMemory', NvHandle, 8), ('hClass', NvU32, 12), ('hDevice', NvHandle, 16)]) +ACR_REGION_HANDLE: TypeAlias = struct_ACR_REGION_HANDLE +@c.record +class struct_ACR_FALCON_LS_STATUS(c.Struct): + SIZE = 4 + falconId: int + bIsInLs: int +struct_ACR_FALCON_LS_STATUS.register_fields([('falconId', NvU16, 0), ('bIsInLs', NvBool, 2)]) +ACR_FALCON_LS_STATUS: TypeAlias = struct_ACR_FALCON_LS_STATUS +@c.record +class struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS(c.Struct): + SIZE = 96 + queryType: int + errorCode: int + acrRegionIdProp: struct_ACR_REGION_ID_PROP + clientReq: struct_ACR_REQUEST_PARAMS + clientReqStatus: struct_ACR_STATUS_PARAMS + handle: struct_ACR_REGION_HANDLE + falconStatus: struct_ACR_FALCON_LS_STATUS +struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS.register_fields([('queryType', NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE, 0), ('errorCode', NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE, 4), ('acrRegionIdProp', ACR_REGION_ID_PROP, 8), ('clientReq', ACR_REQUEST_PARAMS, 40), ('clientReqStatus', ACR_STATUS_PARAMS, 56), ('handle', ACR_REGION_HANDLE, 72), ('falconStatus', ACR_FALCON_LS_STATUS, 92)]) +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 4 + sourceMask: int +struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS.register_fields([('sourceMask', NvU32, 0)]) +NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS(c.Struct): + SIZE = 16 + pCompBitCopyObj: ctypes.c_void_p + pSwizzleParams: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS.register_fields([('pCompBitCopyObj', NvP64, 0), ('pSwizzleParams', NvP64, 8)]) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS(c.Struct): + SIZE = 20 + fbpIndex: int + ltcMask: int + ltcCount: int + ltsMask: int + ltsCount: int +struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS.register_fields([('fbpIndex', NvU8, 0), ('ltcMask', NvU32, 4), ('ltcCount', NvU32, 8), ('ltsMask', NvU32, 12), ('ltsCount', NvU32, 16)]) +NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS(c.Struct): + SIZE = 72 + CBCBaseAddress: int + backingStorePA: int + backingStoreVA: c.POINTER[ctypes.c_ubyte] + backingStoreChunkPA: int + backingStoreChunkVA: c.POINTER[ctypes.c_ubyte] + backingStoreChunkSize: int + cacheWriteBitMap: c.POINTER[ctypes.c_ubyte] + backingStoreChunkOverfetch: int + PageSizeSrc: int + PageSizeDest: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS.register_fields([('CBCBaseAddress', NvU32, 0), ('backingStorePA', NvU64, 8), ('backingStoreVA', c.POINTER[NvU8], 16), ('backingStoreChunkPA', NvU64, 24), ('backingStoreChunkVA', c.POINTER[NvU8], 32), ('backingStoreChunkSize', NvU32, 40), ('cacheWriteBitMap', c.POINTER[NvU8], 48), ('backingStoreChunkOverfetch', NvBool, 56), ('PageSizeSrc', NvU32, 60), ('PageSizeDest', NvU32, 64)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS(c.Struct): + SIZE = 40 + fcbits: c.POINTER[ctypes.c_uint32] + compbits: c.POINTER[ctypes.c_uint32] + dataPhysicalStart: int + surfaceOffset: int + comptagLine: int + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS.register_fields([('fcbits', c.POINTER[NvU32], 0), ('compbits', c.POINTER[NvU32], 8), ('dataPhysicalStart', NvU64, 16), ('surfaceOffset', NvU64, 24), ('comptagLine', NvU32, 32), ('upper64KBCompbitSel', NvBool, 36)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS(c.Struct): + SIZE = 40 + fcbits: int + compbits: int + writeFc: int + dataPhysicalStart: int + surfaceOffset: int + comptagLine: int + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS.register_fields([('fcbits', NvU32, 0), ('compbits', NvU32, 4), ('writeFc', NvBool, 8), ('dataPhysicalStart', NvU64, 16), ('surfaceOffset', NvU64, 24), ('comptagLine', NvU32, 32), ('upper64KBCompbitSel', NvBool, 36)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS(c.Struct): + SIZE = 32 + SrcDataPhysicalStart: int + SrcComptagLine: int + page64KB: int + compbitBuffer: c.POINTER[ctypes.c_uint32] + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS.register_fields([('SrcDataPhysicalStart', NvU64, 0), ('SrcComptagLine', NvU32, 8), ('page64KB', NvU32, 12), ('compbitBuffer', c.POINTER[NvU32], 16), ('upper64KBCompbitSel', NvBool, 24)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS(c.Struct): + SIZE = 32 + DstDataPhysicalStart: int + DstComptagLine: int + page64KB: int + compbitBuffer: c.POINTER[ctypes.c_uint32] + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS.register_fields([('DstDataPhysicalStart', NvU64, 0), ('DstComptagLine', NvU32, 8), ('page64KB', NvU32, 12), ('compbitBuffer', c.POINTER[NvU32], 16), ('upper64KBCompbitSel', NvBool, 24)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS(c.Struct): + SIZE = 1 + bForceBar1: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS.register_fields([('bForceBar1', NvBool, 0)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS(c.Struct): + SIZE = 16 + pAmapConfParams: ctypes.c_void_p + pCbcSwizzleParams: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS.register_fields([('pAmapConfParams', NvP64, 0), ('pCbcSwizzleParams', NvP64, 8)]) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS +enum_CTRL_CMD_FB_CBC_OP: dict[int, str] = {(CTRL_CMD_FB_CBC_OP_CLEAN:=0): 'CTRL_CMD_FB_CBC_OP_CLEAN', (CTRL_CMD_FB_CBC_OP_INVALIDATE:=1): 'CTRL_CMD_FB_CBC_OP_INVALIDATE'} +CTRL_CMD_FB_CBC_OP: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS(c.Struct): + SIZE = 4 + fbCBCOp: int +struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS.register_fields([('fbCBCOp', CTRL_CMD_FB_CBC_OP, 0)]) +NV2080_CTRL_CMD_FB_CBC_OP_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS(c.Struct): + SIZE = 512 + pCompTags: c.Array[ctypes.c_uint32, Literal[127]] + numCompTags: int +struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS.register_fields([('pCompTags', c.Array[NvU32, Literal[127]], 0), ('numCompTags', NvU32, 508)]) +NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS(c.Struct): + SIZE = 28 + attr: int + attr2: int + size: int + ctagOffset: int + hwResId: int + retCompTagLineMin: int + retCompTagLineMax: int +struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS.register_fields([('attr', NvU32, 0), ('attr2', NvU32, 4), ('size', NvU32, 8), ('ctagOffset', NvU32, 12), ('hwResId', NvU32, 16), ('retCompTagLineMin', NvU32, 20), ('retCompTagLineMax', NvU32, 24)]) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS(c.Struct): + SIZE = 4 + hwResId: int +struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS.register_fields([('hwResId', NvU32, 0)]) +NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS +enum_NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE: dict[int, str] = {(NV2080_CTRL_CMD_FB_SET_VPR:=0): 'NV2080_CTRL_CMD_FB_SET_VPR'} +NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_CMD_FB_VPR_ERROR_CODE: dict[int, str] = {(NV2080_CTRL_CMD_FB_VPR_ERROR_GENERIC:=0): 'NV2080_CTRL_CMD_FB_VPR_ERROR_GENERIC', (NV2080_CTRL_CMD_FB_VPR_ERROR_INVALID_CLIENT_REQUEST:=1): 'NV2080_CTRL_CMD_FB_VPR_ERROR_INVALID_CLIENT_REQUEST'} +NV2080_CTRL_CMD_FB_VPR_ERROR_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_VPR_REQUEST_PARAMS(c.Struct): + SIZE = 8 + startAddr: int + size: int +struct_VPR_REQUEST_PARAMS.register_fields([('startAddr', NvU32, 0), ('size', NvU32, 4)]) +VPR_REQUEST_PARAMS: TypeAlias = struct_VPR_REQUEST_PARAMS +@c.record +class struct_VPR_STATUS_PARAMS(c.Struct): + SIZE = 4 + status: int +struct_VPR_STATUS_PARAMS.register_fields([('status', NvU32, 0)]) +VPR_STATUS_PARAMS: TypeAlias = struct_VPR_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS(c.Struct): + SIZE = 16 + requestType: int + requestParams: struct_VPR_REQUEST_PARAMS + statusParams: struct_VPR_STATUS_PARAMS +struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS.register_fields([('requestType', NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE, 0), ('requestParams', VPR_REQUEST_PARAMS, 4), ('statusParams', VPR_STATUS_PARAMS, 12)]) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS +PNV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS] +@c.record +class struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 264 + offlinedPages: c.Array[ctypes.c_uint32, Literal[64]] + pageSize: int + validEntries: int +struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS.register_fields([('offlinedPages', c.Array[NvU32, Literal[64]], 0), ('pageSize', NvU32, 256), ('validEntries', NvU32, 260)]) +NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS(c.Struct): + SIZE = 56 + defaultPageSize: int + comptagsPerCacheLine: int + unpackedComptagLinesPerCacheLine: int + compCacheLineSizePerLTC: int + unpackedCompCacheLineSizePerLTC: int + slicesPerLTC: int + numActiveLTCs: int + familyName: int + chipName: int + bitsPerRAMEntry: int + ramBankWidth: int + bitsPerComptagLine: int + ramEntriesPerCompCacheLine: int + comptagLineSize: int +struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS.register_fields([('defaultPageSize', NvU32, 0), ('comptagsPerCacheLine', NvU32, 4), ('unpackedComptagLinesPerCacheLine', NvU32, 8), ('compCacheLineSizePerLTC', NvU32, 12), ('unpackedCompCacheLineSizePerLTC', NvU32, 16), ('slicesPerLTC', NvU32, 20), ('numActiveLTCs', NvU32, 24), ('familyName', NvU32, 28), ('chipName', NvU32, 32), ('bitsPerRAMEntry', NvU32, 36), ('ramBankWidth', NvU32, 40), ('bitsPerComptagLine', NvU32, 44), ('ramEntriesPerCompCacheLine', NvU32, 48), ('comptagLineSize', NvU32, 52)]) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_RRD_PARAMS(c.Struct): + SIZE = 4 + rrd: int +struct_NV2080_CTRL_FB_SET_RRD_PARAMS.register_fields([('rrd', NvU32, 0)]) +NV2080_CTRL_FB_SET_RRD_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_RRD_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS(c.Struct): + SIZE = 1 + limit: int +struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS.register_fields([('limit', NvU8, 0)]) +NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +NV2080_CTRL_FB_SET_READ_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +NV2080_CTRL_FB_SET_WRITE_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS(c.Struct): + SIZE = 88 + alignType: int + alignAttr: int + alignInputFlags: int + alignHead: int + alignSize: int + alignHeight: int + alignWidth: int + alignPitch: int + alignPad: int + alignMask: int + alignOutputFlags: c.Array[ctypes.c_uint32, Literal[4]] + alignBank: c.Array[ctypes.c_uint32, Literal[4]] + alignKind: int + alignAdjust: int + alignAttr2: int +struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS.register_fields([('alignType', NvU32, 0), ('alignAttr', NvU32, 4), ('alignInputFlags', NvU32, 8), ('alignHead', NvU32, 12), ('alignSize', NvU64, 16), ('alignHeight', NvU32, 24), ('alignWidth', NvU32, 28), ('alignPitch', NvU32, 32), ('alignPad', NvU32, 36), ('alignMask', NvU32, 40), ('alignOutputFlags', c.Array[NvU32, Literal[4]], 44), ('alignBank', c.Array[NvU32, Literal[4]], 60), ('alignKind', NvU32, 76), ('alignAdjust', NvU32, 80), ('alignAttr2', NvU32, 84)]) +NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS(c.Struct): + SIZE = 32 + cbcBaseAddress: int + compCacheLineSize: int + backingStoreStartPA: int + backingStoreAllocPA: int + backingStoreChunkOverfetch: int +struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS.register_fields([('cbcBaseAddress', NvU32, 0), ('compCacheLineSize', NvU32, 4), ('backingStoreStartPA', NvU64, 8), ('backingStoreAllocPA', NvU64, 16), ('backingStoreChunkOverfetch', NvU32, 24)]) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_FB_REMAP_ENTRY(c.Struct): + SIZE = 12 + remapRegVal: int + timestamp: int + fbpa: int + sublocation: int + source: int + flags: int +struct_NV2080_CTRL_FB_REMAP_ENTRY.register_fields([('remapRegVal', NvU32, 0), ('timestamp', NvU32, 4), ('fbpa', NvU8, 8), ('sublocation', NvU8, 9), ('source', NvU8, 10), ('flags', NvU8, 11)]) +NV2080_CTRL_FB_REMAP_ENTRY: TypeAlias = struct_NV2080_CTRL_FB_REMAP_ENTRY +@c.record +class struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS(c.Struct): + SIZE = 6152 + entryCount: int + flags: int + entries: c.Array[struct_NV2080_CTRL_FB_REMAP_ENTRY, Literal[512]] +struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS.register_fields([('entryCount', NvU32, 0), ('flags', NvU8, 4), ('entries', c.Array[NV2080_CTRL_FB_REMAP_ENTRY, Literal[512]], 8)]) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS(c.Struct): + SIZE = 24 + data: c.Array[ctypes.c_ubyte, Literal[24]] +struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS.register_fields([('data', c.Array[NvU8, Literal[24]], 0)]) +NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS(c.Struct): + SIZE = 16 + swizzId: int + fbpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('fbpEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ltcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ltcEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ltsEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ltsEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpaEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpaEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpaSubpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpaSubpEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpLogicalIndex: int +struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpLogicalIndex', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ropEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ropEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ltcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ltcEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ltsEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ltsEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + fbpaEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('fbpaEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ropEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ropEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + swizzId: int + fbpaSubpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('fbpaSubpEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS(c.Struct): + SIZE = 8 + sysIdx: int + sysl2LtcEnMask: int +struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS.register_fields([('sysIdx', NvU32, 0), ('sysl2LtcEnMask', NvU32, 4)]) +NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS(c.Struct): + SIZE = 16 + sysIdx: int + sysl2LtsEnMask: int +struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS.register_fields([('sysIdx', NvU32, 0), ('sysl2LtsEnMask', NvU64, 8)]) +NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + pacEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('pacEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + logicalLtcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('logicalLtcEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + swizzId: int + logicalLtcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('logicalLtcEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_QUERY(c.Struct): + SIZE = 32 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryParams: struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams(c.Struct): + SIZE = 24 + inv: struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS + fbp: struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS + ltc: struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS + lts: struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS + fbpa: struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS + rop: struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS + dmLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS + dmLts: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS + dmFbpa: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS + dmRop: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS + dmFbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS + fbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS + fbpLogicalMap: struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS + sysl2Ltc: struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS + pac: struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS + logicalLtc: struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS + dmLogicalLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS + sysl2Lts: struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS +struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams.register_fields([('inv', NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS, 0), ('fbp', NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS, 0), ('ltc', NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS, 0), ('lts', NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS, 0), ('fbpa', NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS, 0), ('rop', NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS, 0), ('dmLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS, 0), ('dmLts', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS, 0), ('dmFbpa', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS, 0), ('dmRop', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS, 0), ('dmFbpaSubp', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS, 0), ('fbpaSubp', NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS, 0), ('fbpLogicalMap', NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS, 0), ('sysl2Ltc', NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS, 0), ('pac', NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS, 0), ('logicalLtc', NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS, 0), ('dmLogicalLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS, 0), ('sysl2Lts', NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS, 0)]) +struct_NV2080_CTRL_FB_FS_INFO_QUERY.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryParams', struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams, 8)]) +NV2080_CTRL_FB_FS_INFO_QUERY: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_QUERY +@c.record +class struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS(c.Struct): + SIZE = 3848 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_FB_FS_INFO_QUERY, Literal[120]] +struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_FB_FS_INFO_QUERY, Literal[120]], 8)]) +NV2080_CTRL_FB_GET_FS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS(c.Struct): + SIZE = 20 + histogram: c.Array[ctypes.c_uint32, Literal[5]] +struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS.register_fields([('histogram', c.Array[NvU32, Literal[5]], 0)]) +NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS +@c.record +class struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO(c.Struct): + SIZE = 16 + pageNumber: int + source: int +struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO.register_fields([('pageNumber', NvU64, 0), ('source', NvU8, 8)]) +NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO: TypeAlias = struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO +@c.record +class struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 1040 + offlined: c.Array[struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO, Literal[64]] + validEntries: int + baseIndex: int + bMore: int +struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('validEntries', NvU32, 1024), ('baseIndex', NvU32, 1028), ('bMore', NvBool, 1032)]) +NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO(c.Struct): + SIZE = 24 + client: int + flags: int + beginAddr: int + size: int +struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO.register_fields([('client', NvU32, 0), ('flags', NvU32, 4), ('beginAddr', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_CMD_FB_ALLOCATION_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_CLIENT_INFO(c.Struct): + SIZE = 112 + handle: int + pid: int + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] +struct_NV2080_CTRL_CMD_FB_CLIENT_INFO.register_fields([('handle', NvHandle, 0), ('pid', NvU32, 4), ('subProcessID', NvU32, 8), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 12)]) +NV2080_CTRL_CMD_FB_CLIENT_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_CLIENT_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS(c.Struct): + SIZE = 32 + allocCount: int + pAllocInfo: ctypes.c_void_p + clientCount: int + pClientInfo: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS.register_fields([('allocCount', NvU64, 0), ('pAllocInfo', NvP64, 8), ('clientCount', NvU64, 16), ('pClientInfo', NvP64, 24)]) +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS(c.Struct): + SIZE = 1 + bOnline: int +struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS.register_fields([('bOnline', NvBool, 0)]) +NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS(c.Struct): + SIZE = 544 + numaNodeId: int + numaMemAddr: int + numaMemSize: int + numaOfflineAddressesCount: int + numaOfflineAddresses: c.Array[ctypes.c_uint64, Literal[64]] +struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS.register_fields([('numaNodeId', NvS32, 0), ('numaMemAddr', NvU64, 8), ('numaMemSize', NvU64, 16), ('numaOfflineAddressesCount', NvU32, 24), ('numaOfflineAddresses', c.Array[NvU64, Literal[64]], 32)]) +NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS(c.Struct): + SIZE = 32 + maxSubmittedSemaphoreValueOffset: int + monitoredFenceThresholdOffset: int + size: int + caps: int +struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS.register_fields([('maxSubmittedSemaphoreValueOffset', NvU64, 0), ('monitoredFenceThresholdOffset', NvU64, 8), ('size', NvU64, 16), ('caps', NvU32, 24)]) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_STATS_ENTRY(c.Struct): + SIZE = 48 + totalSize: int + rsvdSize: int + osSize: int + r1Size: int + r2Size: int + freeSize: int +struct_NV2080_CTRL_CMD_FB_STATS_ENTRY.register_fields([('totalSize', NvU64, 0), ('rsvdSize', NvU64, 8), ('osSize', NvU64, 16), ('r1Size', NvU64, 24), ('r2Size', NvU64, 32), ('freeSize', NvU64, 40)]) +NV2080_CTRL_CMD_FB_STATS_ENTRY: TypeAlias = struct_NV2080_CTRL_CMD_FB_STATS_ENTRY +@c.record +class struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS(c.Struct): + SIZE = 8 + gfid: int + invalidateAll: int +struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS.register_fields([('gfid', NvU32, 0), ('invalidateAll', NvBool, 4)]) +NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS: TypeAlias = struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO(c.Struct): + SIZE = 24 + allocSize: int + numBlocks: int + rsvdSize: int +struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO.register_fields([('allocSize', NvU64, 0), ('numBlocks', NvU32, 8), ('rsvdSize', NvU64, 16)]) +NV2080_CTRL_CMD_FB_STATS_OWNER_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS(c.Struct): + SIZE = 4856 + version: int + fbSizeInfo: struct_NV2080_CTRL_CMD_FB_STATS_ENTRY + fbBlockInfo: c.Array[struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO, Literal[200]] +struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS.register_fields([('version', NvU64, 0), ('fbSizeInfo', NV2080_CTRL_CMD_FB_STATS_ENTRY, 8), ('fbBlockInfo', c.Array[NV2080_CTRL_CMD_FB_STATS_OWNER_INFO, Literal[200]], 56)]) +NV2080_CTRL_CMD_FB_STATS_GET_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS(c.Struct): + SIZE = 24 + bStaticBar1Enabled: int + staticBar1StartOffset: int + staticBar1Size: int +struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS.register_fields([('bStaticBar1Enabled', NvBool, 0), ('staticBar1StartOffset', NvU64, 8), ('staticBar1Size', NvU64, 16)]) +NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + currentConfiguration: int +struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS.register_fields([('currentConfiguration', NvU32, 0)]) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + newConfiguration: int +struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS.register_fields([('newConfiguration', NvU32, 0)]) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_STATUS_PARAMS(c.Struct): + SIZE = 4 + fbStatus: int +struct_NV2080_CTRL_FB_GET_STATUS_PARAMS.register_fields([('fbStatus', NvU32, 0)]) +NV2080_CTRL_FB_GET_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS(c.Struct): + SIZE = 4 + isSupported: int +struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS.register_fields([('isSupported', NvU32, 0)]) +NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS(c.Struct): + SIZE = 4 + currentStatus: int +struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS.register_fields([('currentStatus', NvU32, 0)]) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + base: int + numEntries: int +struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS.register_fields([('hChannel', NvHandle, 0), ('base', NvU64, 8), ('numEntries', NvU32, 16)]) +NV2080_CTRL_CMD_SET_GPFIFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_BIND_CHANNEL(c.Struct): + SIZE = 8 + hClient: int + hChannel: int +struct_NV2080_CTRL_FIFO_BIND_CHANNEL.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4)]) +NV2080_CTRL_FIFO_BIND_CHANNEL: TypeAlias = struct_NV2080_CTRL_FIFO_BIND_CHANNEL +@c.record +class struct_NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS(c.Struct): + SIZE = 132 + bindChannelCount: int + bindChannels: c.Array[struct_NV2080_CTRL_FIFO_BIND_CHANNEL, Literal[16]] +struct_NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS.register_fields([('bindChannelCount', NvU32, 0), ('bindChannels', c.Array[NV2080_CTRL_FIFO_BIND_CHANNEL, Literal[16]], 4)]) +NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS(c.Struct): + SIZE = 8 + physChannelCount: int + physChannelCountInUse: int +struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS.register_fields([('physChannelCount', NvU32, 0), ('physChannelCountInUse', NvU32, 4)]) +NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS +NV2080_CTRL_FIFO_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS(c.Struct): + SIZE = 2056 + fifoInfoTblSize: int + fifoInfoTbl: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[256]] + engineType: int +struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS.register_fields([('fifoInfoTblSize', NvU32, 0), ('fifoInfoTbl', c.Array[NV2080_CTRL_FIFO_INFO, Literal[256]], 4), ('engineType', NvU32, 2052)]) +NV2080_CTRL_FIFO_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS(c.Struct): + SIZE = 4 + hChannel: int +struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS.register_fields([('hChannel', NvHandle, 0)]) +NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS(c.Struct): + SIZE = 536 + bDisable: int + numChannels: int + bOnlyDisableScheduling: int + bRewindGpPut: int + pRunlistPreemptEvent: ctypes.c_void_p + hClientList: c.Array[ctypes.c_uint32, Literal[64]] + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS.register_fields([('bDisable', NvBool, 0), ('numChannels', NvU32, 4), ('bOnlyDisableScheduling', NvBool, 8), ('bRewindGpPut', NvBool, 9), ('pRunlistPreemptEvent', NvP64, 16), ('hClientList', c.Array[NvHandle, Literal[64]], 24), ('hChannelList', c.Array[NvHandle, Literal[64]], 280)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_MEM_INFO(c.Struct): + SIZE = 24 + aperture: int + base: int + size: int +struct_NV2080_CTRL_FIFO_MEM_INFO.register_fields([('aperture', NvU32, 0), ('base', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_FIFO_MEM_INFO: TypeAlias = struct_NV2080_CTRL_FIFO_MEM_INFO +@c.record +class struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO(c.Struct): + SIZE = 104 + inst: struct_NV2080_CTRL_FIFO_MEM_INFO + ramfc: struct_NV2080_CTRL_FIFO_MEM_INFO + methodBuf: c.Array[struct_NV2080_CTRL_FIFO_MEM_INFO, Literal[2]] + methodBufCount: int +struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO.register_fields([('inst', NV2080_CTRL_FIFO_MEM_INFO, 0), ('ramfc', NV2080_CTRL_FIFO_MEM_INFO, 24), ('methodBuf', c.Array[NV2080_CTRL_FIFO_MEM_INFO, Literal[2]], 48), ('methodBufCount', NvU32, 96)]) +NV2080_CTRL_FIFO_CHANNEL_MEM_INFO: TypeAlias = struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO +@c.record +class struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS(c.Struct): + SIZE = 112 + hChannel: int + chMemInfo: struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO +struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS.register_fields([('hChannel', NvHandle, 0), ('chMemInfo', NV2080_CTRL_FIFO_CHANNEL_MEM_INFO, 8)]) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS(c.Struct): + SIZE = 8 + aperture: int + attribute: int +struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS.register_fields([('aperture', NvU32, 0), ('attribute', NvU32, 4)]) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS(c.Struct): + SIZE = 20824 + engineId: int + count: int + entry: c.Array[struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS_entry, Literal[200]] + schedPolicy: int + arrEnabled: int + arrAvgFactor: int + targetTimesliceNs: int +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS_entry(c.Struct): + SIZE = 104 + timestampNs: int + timeRunTotalNs: int + timeRunNs: int + swrlId: int + targetTimeSlice: int + cumulativePreemptionTime: int + counters: c.Array[ctypes.c_uint64, Literal[8]] +NvS64: TypeAlias = ctypes.c_int64 +struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS_entry.register_fields([('timestampNs', NvU64, 0), ('timeRunTotalNs', NvS64, 8), ('timeRunNs', NvU32, 16), ('swrlId', NvU32, 20), ('targetTimeSlice', NvU32, 24), ('cumulativePreemptionTime', NvU64, 32), ('counters', c.Array[NvU64, Literal[8]], 40)]) +struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS.register_fields([('engineId', NvU32, 0), ('count', NvU32, 4), ('entry', c.Array[struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS_entry, Literal[200]], 8), ('schedPolicy', NvU32, 20808), ('arrEnabled', NvU32, 20812), ('arrAvgFactor', NvU32, 20816), ('targetTimesliceNs', NvU32, 20820)]) +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DEVICE_ENTRY(c.Struct): + SIZE = 100 + engineData: c.Array[ctypes.c_uint32, Literal[16]] + pbdmaIds: c.Array[ctypes.c_uint32, Literal[2]] + pbdmaFaultIds: c.Array[ctypes.c_uint32, Literal[2]] + numPbdmas: int + engineName: c.Array[ctypes.c_char, Literal[16]] +struct_NV2080_CTRL_FIFO_DEVICE_ENTRY.register_fields([('engineData', c.Array[NvU32, Literal[16]], 0), ('pbdmaIds', c.Array[NvU32, Literal[2]], 64), ('pbdmaFaultIds', c.Array[NvU32, Literal[2]], 72), ('numPbdmas', NvU32, 80), ('engineName', c.Array[ctypes.c_char, Literal[16]], 84)]) +NV2080_CTRL_FIFO_DEVICE_ENTRY: TypeAlias = struct_NV2080_CTRL_FIFO_DEVICE_ENTRY +@c.record +class struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS(c.Struct): + SIZE = 3212 + baseIndex: int + numEntries: int + bMore: int + entries: c.Array[struct_NV2080_CTRL_FIFO_DEVICE_ENTRY, Literal[32]] +struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS.register_fields([('baseIndex', NvU32, 0), ('numEntries', NvU32, 4), ('bMore', NvBool, 8), ('entries', c.Array[NV2080_CTRL_FIFO_DEVICE_ENTRY, Literal[32]], 12)]) +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS(c.Struct): + SIZE = 12 + engineType: int + vChid: int + faultType: int +struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS.register_fields([('engineType', NvU32, 0), ('vChid', NvU32, 4), ('faultType', NvU32, 8)]) +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS(c.Struct): + SIZE = 8 + flags: int + schedPolicy: int +struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS.register_fields([('flags', NvU32, 0), ('schedPolicy', NvU32, 4)]) +NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS(c.Struct): + SIZE = 32 + hClient: int + hChannel: int + hUserdMemory: int + gpFifoEntries: int + gpFifoOffset: int + userdOffset: int +struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('hUserdMemory', NvHandle, 8), ('gpFifoEntries', NvU32, 12), ('gpFifoOffset', NvU64, 16), ('userdOffset', NvU64, 24)]) +NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + addressSpace: int + cacheAttrib: int +struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('addressSpace', NvU32, 16), ('cacheAttrib', NvU32, 20)]) +NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS(c.Struct): + SIZE = 516 + runlistId: int + bitMask: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS.register_fields([('runlistId', NvU32, 0), ('bitMask', c.Array[NvU32, Literal[128]], 4)]) +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS(c.Struct): + SIZE = 520 + numChannels: int + hClientList: c.Array[ctypes.c_uint32, Literal[64]] + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] + bEnableAfterKeyRotation: int +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS.register_fields([('numChannels', NvU32, 0), ('hClientList', c.Array[NvHandle, Literal[64]], 4), ('hChannelList', c.Array[NvHandle, Literal[64]], 260), ('bEnableAfterKeyRotation', NvBool, 516)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS(c.Struct): + SIZE = 264 + numChannels: int + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] + bEnableAfterKeyRotation: int +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS.register_fields([('numChannels', NvU32, 0), ('hChannelList', c.Array[NvHandle, Literal[64]], 4), ('bEnableAfterKeyRotation', NvBool, 260)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS(c.Struct): + SIZE = 20 + engineId: int + schedPolicy: int + arrEnabled: int + targetTimesliceNs: int + arrAvgFactor: int +struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS.register_fields([('engineId', NvU32, 0), ('schedPolicy', NvU32, 4), ('arrEnabled', NvU32, 8), ('targetTimesliceNs', NvU32, 12), ('arrAvgFactor', NvU32, 16)]) +NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS(c.Struct): + SIZE = 24 + engineId: int + schedPolicy: int + enableArr: int + timesliceTargetNs: int + frequencyForARR: int + avgFactorForARR: int +struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS.register_fields([('engineId', NvU32, 0), ('schedPolicy', NvU32, 4), ('enableArr', NvU32, 8), ('timesliceTargetNs', NvU32, 12), ('frequencyForARR', NvU32, 16), ('avgFactorForARR', NvU32, 20)]) +NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS(c.Struct): + SIZE = 44 + engineId: int + supportedSchedulers: c.Array[ctypes.c_uint32, Literal[3]] + bIsArrModeSupported: int + maxTimesliceNs: int + minTimesliceNs: int + maxFrequencyForARR: int + minFrequencyForARR: int + maxAvgFactorForARR: int + minAvgFactorForARR: int +struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS.register_fields([('engineId', NvU32, 0), ('supportedSchedulers', c.Array[NvU32, Literal[3]], 4), ('bIsArrModeSupported', NvBool, 16), ('maxTimesliceNs', NvU32, 20), ('minTimesliceNs', NvU32, 24), ('maxFrequencyForARR', NvU32, 28), ('minFrequencyForARR', NvU32, 32), ('maxAvgFactorForARR', NvU32, 36), ('minAvgFactorForARR', NvU32, 40)]) +NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS(c.Struct): + SIZE = 1552 + hClient: int + hChannelOrTsg: int + tsgId: int + numChannels: int + channelUniqueID: c.Array[ctypes.c_uint32, Literal[128]] + vasUniqueID: c.Array[ctypes.c_uint32, Literal[128]] + veid: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannelOrTsg', NvHandle, 4), ('tsgId', NvU32, 8), ('numChannels', NvU32, 12), ('channelUniqueID', c.Array[NvU32, Literal[128]], 16), ('vasUniqueID', c.Array[NvU32, Literal[128]], 528), ('veid', c.Array[NvU32, Literal[128]], 1040)]) +NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS(c.Struct): + SIZE = 1540 + hClients: c.Array[ctypes.c_uint32, Literal[128]] + hChannels: c.Array[ctypes.c_uint32, Literal[128]] + numChannels: int + channelUniqueIDs: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS.register_fields([('hClients', c.Array[NvHandle, Literal[128]], 0), ('hChannels', c.Array[NvHandle, Literal[128]], 512), ('numChannels', NvU32, 1024), ('channelUniqueIDs', c.Array[NvU32, Literal[128]], 1028)]) +NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + mode: int + hVASpace: int +struct_NV2080_CTRL_FLA_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('mode', NvU32, 16), ('hVASpace', NvHandle, 20)]) +NV2080_CTRL_FLA_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_RANGE_PARAMS +enum_NV2080_CTRL_FLA_ADDRSPACE: dict[int, str] = {(NV2080_CTRL_FLA_ADDRSPACE_SYSMEM:=0): 'NV2080_CTRL_FLA_ADDRSPACE_SYSMEM', (NV2080_CTRL_FLA_ADDRSPACE_FBMEM:=1): 'NV2080_CTRL_FLA_ADDRSPACE_FBMEM'} +NV2080_CTRL_FLA_ADDRSPACE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_FLA_ACTION: dict[int, str] = {(NV2080_CTRL_FLA_ACTION_BIND:=0): 'NV2080_CTRL_FLA_ACTION_BIND', (NV2080_CTRL_FLA_ACTION_UNBIND:=1): 'NV2080_CTRL_FLA_ACTION_UNBIND'} +NV2080_CTRL_FLA_ACTION: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS(c.Struct): + SIZE = 16 + imbPhysAddr: int + addrSpace: int + flaAction: int +struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS.register_fields([('imbPhysAddr', NvU64, 0), ('addrSpace', NV2080_CTRL_FLA_ADDRSPACE, 8), ('flaAction', NV2080_CTRL_FLA_ACTION, 12)]) +NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS(c.Struct): + SIZE = 16 + base: int + size: int +struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8)]) +NV2080_CTRL_FLA_GET_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS(c.Struct): + SIZE = 16 + totalSize: int + freeSize: int +struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS.register_fields([('totalSize', NvU64, 0), ('freeSize', NvU64, 8)]) +NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS(c.Struct): + SIZE = 12 + flcnID: int + heapSize: int + heapFree: int +struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS.register_fields([('flcnID', NvU32, 0), ('heapSize', NvU32, 4), ('heapFree', NvU32, 8)]) +NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS(c.Struct): + SIZE = 8 + engine: int + engineArch: int +struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS.register_fields([('engine', NvU32, 0), ('engineArch', NvU32, 4)]) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER(c.Struct): + SIZE = 36 + mask: c.Array[ctypes.c_ubyte, Literal[36]] +struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER.register_fields([('mask', c.Array[NvU8, Literal[36]], 0)]) +NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS(c.Struct): + SIZE = 24 + engine: int + pageSize: int + offset: int + size: int + queueFeatureId: int +NvUPtr: TypeAlias = ctypes.c_uint64 +struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS.register_fields([('engine', NvU32, 0), ('pageSize', NvU32, 4), ('offset', NvUPtr, 8), ('size', NvU32, 16), ('queueFeatureId', NvU8, 20)]) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS(c.Struct): + SIZE = 44 + engine: int + eventFilter: struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER + queueId: int +struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS.register_fields([('engine', NvU32, 0), ('eventFilter', NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER, 4), ('queueId', NvU8, 40)]) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +NV2080_CTRL_FLCN_USTREAMER_CONTROL_GET_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +NV2080_CTRL_FLCN_USTREAMER_CONTROL_SET_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 80 + hUserClient: int + hChannel: int + alignment: int + size: int + bufferHandle: ctypes.c_void_p + pageCount: int + physAddr: int + aperture: int + kind: int + pageSize: int + bIsContigous: int + bDeviceDescendant: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('alignment', NvU64, 8), ('size', NvU64, 16), ('bufferHandle', NvP64, 24), ('pageCount', NvU64, 32), ('physAddr', NvU64, 40), ('aperture', NvU32, 48), ('kind', NvU32, 52), ('pageSize', NvU32, 56), ('bIsContigous', NvBool, 60), ('bDeviceDescendant', NvBool, 61), ('uuid', c.Array[NvU8, Literal[16]], 62)]) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + totalBufferSize: int +struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('totalBufferSize', NvU64, 8)]) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + bInput: int +struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS.register_fields([('gpioPin', NvU32, 0), ('bInput', NvBool, 4)]) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + value: int +struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS.register_fields([('gpioPin', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + value: int +struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS.register_fields([('gpioPin', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS(c.Struct): + SIZE = 8 + function: int + pin: int +struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS.register_fields([('function', NvU32, 0), ('pin', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS +NV2080_CTRL_GPU_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + gpuInfoListSize: int + gpuInfoList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_INFO_PARAMS.register_fields([('gpuInfoListSize', NvU32, 0), ('gpuInfoList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 524 + gpuInfoListSize: int + gpuInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[65]] +struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS.register_fields([('gpuInfoListSize', NvU32, 0), ('gpuInfoList', c.Array[NV2080_CTRL_GPU_INFO, Literal[65]], 4)]) +NV2080_CTRL_GPU_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS(c.Struct): + SIZE = 132 + gpuNameStringFlags: int + gpuNameString: struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString +@c.record +class struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString(c.Struct): + SIZE = 128 + ascii: c.Array[ctypes.c_ubyte, Literal[64]] + unicode: c.Array[ctypes.c_uint16, Literal[64]] +struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString.register_fields([('ascii', c.Array[NvU8, Literal[64]], 0), ('unicode', c.Array[NvU16, Literal[64]], 0)]) +struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS.register_fields([('gpuNameStringFlags', NvU32, 0), ('gpuNameString', struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString, 4)]) +NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS(c.Struct): + SIZE = 64 + gpuShortNameString: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS.register_fields([('gpuShortNameString', c.Array[NvU8, Literal[64]], 0)]) +NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_POWER_PARAMS(c.Struct): + SIZE = 12 + target: int + newLevel: int + oldLevel: int +struct_NV2080_CTRL_GPU_SET_POWER_PARAMS.register_fields([('target', NvU32, 0), ('newLevel', NvU32, 4), ('oldLevel', NvU32, 8)]) +NV2080_CTRL_GPU_SET_POWER_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_POWER_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SDM_PARAMS(c.Struct): + SIZE = 4 + subdeviceMask: int +struct_NV2080_CTRL_GPU_GET_SDM_PARAMS.register_fields([('subdeviceMask', NvU32, 0)]) +NV2080_CTRL_GPU_GET_SDM_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SDM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_SDM_PARAMS(c.Struct): + SIZE = 4 + subdeviceMask: int +struct_NV2080_CTRL_GPU_SET_SDM_PARAMS.register_fields([('subdeviceMask', NvU32, 0)]) +NV2080_CTRL_GPU_SET_SDM_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_SDM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS(c.Struct): + SIZE = 4 + type: int +struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS.register_fields([('type', NvU32, 0)]) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_REG_OP(c.Struct): + SIZE = 32 + regOp: int + regType: int + regStatus: int + regQuad: int + regGroupMask: int + regSubGroupMask: int + regOffset: int + regValueHi: int + regValueLo: int + regAndNMaskHi: int + regAndNMaskLo: int +struct_NV2080_CTRL_GPU_REG_OP.register_fields([('regOp', NvU8, 0), ('regType', NvU8, 1), ('regStatus', NvU8, 2), ('regQuad', NvU8, 3), ('regGroupMask', NvU32, 4), ('regSubGroupMask', NvU32, 8), ('regOffset', NvU32, 12), ('regValueHi', NvU32, 16), ('regValueLo', NvU32, 20), ('regAndNMaskHi', NvU32, 24), ('regAndNMaskLo', NvU32, 28)]) +NV2080_CTRL_GPU_REG_OP: TypeAlias = struct_NV2080_CTRL_GPU_REG_OP +@c.record +class struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 48 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + reserved00: c.Array[ctypes.c_uint32, Literal[2]] + regOpCount: int + regOps: ctypes.c_void_p + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +NV2080_CTRL_GR_ROUTE_INFO: TypeAlias = struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('reserved00', c.Array[NvU32, Literal[2]], 12), ('regOpCount', NvU32, 20), ('regOps', NvP64, 24), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 32)]) +NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS(c.Struct): + SIZE = 16 + engineCount: int + engineList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS(c.Struct): + SIZE = 340 + engineCount: int + engineList: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', c.Array[NvU32, Literal[84]], 4)]) +NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS(c.Struct): + SIZE = 16 + engineType: int + numClasses: int + classList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS.register_fields([('engineType', NvU32, 0), ('numClasses', NvU32, 4), ('classList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS(c.Struct): + SIZE = 12 + engineType: int + mmuFaultId: int + bSubcontextSupported: int +struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS.register_fields([('engineType', NvU32, 0), ('mmuFaultId', NvU32, 4), ('bSubcontextSupported', NvBool, 8)]) +NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_GPU_QUERY_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_GPU_QUERY_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY(c.Struct): + SIZE = 32 + gpuPhysAddr: int + gpuVirtAddr: int + size: int + physAttr: int + bufferId: int + bInitialize: int + bNonmapped: int +struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY.register_fields([('gpuPhysAddr', NvU64, 0), ('gpuVirtAddr', NvU64, 8), ('size', NvU64, 16), ('physAttr', NvU32, 24), ('bufferId', NvU16, 28), ('bInitialize', NvU8, 30), ('bNonmapped', NvU8, 31)]) +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY: TypeAlias = struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY +@c.record +class struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS(c.Struct): + SIZE = 560 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int + hVirtMemory: int + virtAddress: int + size: int + entryCount: int + promoteEntry: c.Array[struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY, Literal[16]] +struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16), ('hVirtMemory', NvHandle, 20), ('virtAddress', NvU64, 24), ('size', NvU64, 32), ('entryCount', NvU32, 40), ('promoteEntry', c.Array[NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY, Literal[16]], 48)]) +NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS +PNV2080_CTRL_GPU_PROMOTE_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS(c.Struct): + SIZE = 20 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int +struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16)]) +NV2080_CTRL_GPU_EVICT_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS +PNV2080_CTRL_GPU_EVICT_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS(c.Struct): + SIZE = 56 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int + hVirtMemory: int + physAddress: int + physAttr: int + hDmaHandle: int + index: int + size: int +struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16), ('hVirtMemory', NvHandle, 20), ('physAddress', NvU64, 24), ('physAttr', NvU32, 32), ('hDmaHandle', NvHandle, 36), ('index', NvU32, 40), ('size', NvU64, 48)]) +NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS +PNV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS(c.Struct): + SIZE = 4 + eccIntrStatus: int +struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS.register_fields([('eccIntrStatus', NvU32, 0)]) +NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS(c.Struct): + SIZE = 8 + count: int +struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS.register_fields([('count', NvU64, 0)]) +NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS(c.Struct): + SIZE = 40 + enabled: int + scrubComplete: int + supported: int + dbe: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + dbeNonResettable: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + sbe: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + sbeNonResettable: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS +struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS.register_fields([('enabled', NvBool, 0), ('scrubComplete', NvBool, 1), ('supported', NvBool, 2), ('dbe', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 8), ('dbeNonResettable', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 16), ('sbe', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 24), ('sbeNonResettable', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 32)]) +NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS(c.Struct): + SIZE = 1464 + units: c.Array[struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS, Literal[36]] + bFatalPoisonError: int + uncorrectableError: int + flags: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS.register_fields([('units', c.Array[NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS, Literal[36]], 0), ('bFatalPoisonError', NvBool, 1440), ('uncorrectableError', NvU8, 1441), ('flags', NvU32, 1444), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 1448)]) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS(c.Struct): + SIZE = 8 + rules: int + flags: int +struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS.register_fields([('rules', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS(c.Struct): + SIZE = 4 + rules: int +struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS.register_fields([('rules', NvU32, 0)]) +NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS(c.Struct): + SIZE = 8 + currentConfiguration: int + defaultConfiguration: int +struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS.register_fields([('currentConfiguration', NvU32, 0), ('defaultConfiguration', NvU32, 4)]) +NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + newConfiguration: int +struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS.register_fields([('newConfiguration', NvU32, 0)]) +NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS(c.Struct): + SIZE = 8 + statuses: int + flags: int +struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS.register_fields([('statuses', NvU32, 0), ('flags', NvU8, 4)]) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS(c.Struct): + SIZE = 4 + gpcMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS.register_fields([('gpcMask', NvU32, 0)]) +NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('tpcMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + zcullMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('zcullMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS(c.Struct): + SIZE = 136 + buildDate: int + marketingName: c.Array[ctypes.c_ubyte, Literal[24]] + serialNumber: c.Array[ctypes.c_ubyte, Literal[16]] + memoryManufacturer: int + memoryPartID: c.Array[ctypes.c_ubyte, Literal[20]] + memoryDateCode: c.Array[ctypes.c_ubyte, Literal[6]] + productPartNumber: c.Array[ctypes.c_ubyte, Literal[20]] + boardRevision: c.Array[ctypes.c_ubyte, Literal[3]] + boardType: int + board699PartNumber: c.Array[ctypes.c_ubyte, Literal[20]] + board965PartNumber: c.Array[ctypes.c_ubyte, Literal[20]] +struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS.register_fields([('buildDate', NvU32, 0), ('marketingName', c.Array[NvU8, Literal[24]], 4), ('serialNumber', c.Array[NvU8, Literal[16]], 28), ('memoryManufacturer', NvU8, 44), ('memoryPartID', c.Array[NvU8, Literal[20]], 45), ('memoryDateCode', c.Array[NvU8, Literal[6]], 65), ('productPartNumber', c.Array[NvU8, Literal[20]], 71), ('boardRevision', c.Array[NvU8, Literal[3]], 91), ('boardType', NvU8, 94), ('board699PartNumber', c.Array[NvU8, Literal[20]], 95), ('board965PartNumber', c.Array[NvU8, Literal[20]], 115)]) +NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV2080_CTRL_GPU_GET_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV2080_CTRL_GPU_GET_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS(c.Struct): + SIZE = 4 + currentMode: int +struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS.register_fields([('currentMode', NvU32, 0)]) +NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS(c.Struct): + SIZE = 144 + engineType: int + partnershipClassId: int + runqueue: int + numPartners: int + partnerList: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS.register_fields([('engineType', NvU32, 0), ('partnershipClassId', NvU32, 4), ('runqueue', NvU32, 8), ('numPartners', NvU32, 12), ('partnerList', c.Array[NvU32, Literal[32]], 16)]) +NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS(c.Struct): + SIZE = 268 + index: int + flags: int + length: int + data: c.Array[ctypes.c_ubyte, Literal[256]] +struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS.register_fields([('index', NvU32, 0), ('flags', NvU32, 4), ('length', NvU32, 8), ('data', c.Array[NvU8, Literal[256]], 12)]) +NV2080_CTRL_GPU_GET_GID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS(c.Struct): + SIZE = 5 + objectType: c.Array[ctypes.c_char, Literal[3]] + version: int + subversion: int +struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS.register_fields([('objectType', c.Array[ctypes.c_char, Literal[3]], 0), ('version', NvU8, 3), ('subversion', NvU8, 4)]) +NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS(c.Struct): + SIZE = 1 + isOptimusEnabled: int +struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS.register_fields([('isOptimusEnabled', NvBool, 0)]) +NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS(c.Struct): + SIZE = 8 + targetEngine: int + ipVersion: int +struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS.register_fields([('targetEngine', NvU32, 0), ('ipVersion', NvU32, 4)]) +NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS(c.Struct): + SIZE = 8 + attribute: int + bSupported: int +struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS.register_fields([('attribute', NvU32, 0), ('bSupported', NvBool, 4)]) +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS(c.Struct): + SIZE = 8 + attribute: int + value: int +struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS.register_fields([('attribute', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_CMD_GPU_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +NV2080_CTRL_GPU_GET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +NV2080_CTRL_GPU_SET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS(c.Struct): + SIZE = 16 + version: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS.register_fields([('version', c.Array[NvU8, Literal[16]], 0)]) +NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS(c.Struct): + SIZE = 8 + fwVersion: int + oemVersion: int + siliconRevision: int + hwbcResourceType: int +struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS.register_fields([('fwVersion', NvU32, 0), ('oemVersion', NvU8, 4), ('siliconRevision', NvU8, 5), ('hwbcResourceType', NvU8, 6)]) +NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS(c.Struct): + SIZE = 1204 + bridgeCount: int + hPhysicalBridges: c.Array[ctypes.c_uint32, Literal[100]] + bridgeList: c.Array[struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS, Literal[100]] +struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS.register_fields([('bridgeCount', NvU8, 0), ('hPhysicalBridges', c.Array[NvHandle, Literal[100]], 4), ('bridgeList', c.Array[NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS, Literal[100]], 404)]) +NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS(c.Struct): + SIZE = 16 + bus: int + device: int + func: int + oemVersion: int + siliconRevision: int + hwbcResourceType: int + domain: int + fwVersion: int +struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS.register_fields([('bus', NvU8, 0), ('device', NvU8, 1), ('func', NvU8, 2), ('oemVersion', NvU8, 3), ('siliconRevision', NvU8, 4), ('hwbcResourceType', NvU8, 5), ('domain', NvU32, 8), ('fwVersion', NvU32, 12)]) +NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS(c.Struct): + SIZE = 2004 + bridgeCount: int + physicalBridgeIds: c.Array[ctypes.c_uint32, Literal[100]] + bridgeList: c.Array[struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS, Literal[100]] +struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS.register_fields([('bridgeCount', NvU8, 0), ('physicalBridgeIds', c.Array[NvU32, Literal[100]], 4), ('bridgeList', c.Array[NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS, Literal[100]], 404)]) +NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS(c.Struct): + SIZE = 24 + scrubberStatus: int + remainingTimeMs: int + scrubStartAddr: int + scrubEndAddr: int +struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS.register_fields([('scrubberStatus', NvU32, 0), ('remainingTimeMs', NvU32, 4), ('scrubStartAddr', NvU64, 8), ('scrubEndAddr', NvU64, 16)]) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS(c.Struct): + SIZE = 16 + minStartAddr: int + maxEndAddr: int +struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS.register_fields([('minStartAddr', NvU64, 0), ('maxEndAddr', NvU64, 8)]) +NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS(c.Struct): + SIZE = 56 + gpcId: int + numPesInGpc: int + activePesMask: int + maxTpcPerGpcCount: int + tpcToPesMap: c.Array[ctypes.c_uint32, Literal[10]] +struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('numPesInGpc', NvU32, 4), ('activePesMask', NvU32, 8), ('maxTpcPerGpcCount', NvU32, 12), ('tpcToPesMap', c.Array[NvU32, Literal[10]], 16)]) +NV2080_CTRL_GPU_GET_PES_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS(c.Struct): + SIZE = 504 + oemInfo: c.Array[ctypes.c_ubyte, Literal[504]] +struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS.register_fields([('oemInfo', c.Array[NvU8, Literal[504]], 0)]) +NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS +enum_NV2080_CTRL_VPR_INFO_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_VPR_CAPS:=0): 'NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_VPR_CAPS', (NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_CUR_VPR_RANGE:=1): 'NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_CUR_VPR_RANGE'} +NV2080_CTRL_VPR_INFO_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS(c.Struct): + SIZE = 24 + queryType: int + bIsVprEnabled: int + vprStartAddressInBytes: int + vprEndAddressInBytes: int +struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS.register_fields([('queryType', NV2080_CTRL_VPR_INFO_QUERY_TYPE, 0), ('bIsVprEnabled', NvBool, 4), ('vprStartAddressInBytes', NvU64, 8), ('vprEndAddressInBytes', NvU64, 16)]) +NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS +enum_NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_H264:=0): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_H264', (NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_HEVC:=1): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_HEVC', (NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_AV1:=2): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_AV1'} +NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS(c.Struct): + SIZE = 8 + queryType: int + encoderCapacity: int +struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS.register_fields([('queryType', NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE, 0), ('encoderCapacity', NvU32, 4)]) +NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS(c.Struct): + SIZE = 12 + encoderSessionCount: int + averageEncodeFps: int + averageEncodeLatency: int +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS.register_fields([('encoderSessionCount', NvU32, 0), ('averageEncodeFps', NvU32, 4), ('averageEncodeLatency', NvU32, 8)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_NVENC_SW_SESSION_INFO(c.Struct): + SIZE = 32 + processId: int + subProcessId: int + sessionId: int + codecType: int + hResolution: int + vResolution: int + averageEncodeFps: int + averageEncodeLatency: int +struct_NV2080_CTRL_NVENC_SW_SESSION_INFO.register_fields([('processId', NvU32, 0), ('subProcessId', NvU32, 4), ('sessionId', NvU32, 8), ('codecType', NvU32, 12), ('hResolution', NvU32, 16), ('vResolution', NvU32, 20), ('averageEncodeFps', NvU32, 24), ('averageEncodeLatency', NvU32, 28)]) +NV2080_CTRL_NVENC_SW_SESSION_INFO: TypeAlias = struct_NV2080_CTRL_NVENC_SW_SESSION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS(c.Struct): + SIZE = 16 + sessionInfoTblEntry: int + sessionInfoTbl: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS.register_fields([('sessionInfoTblEntry', NvU32, 0), ('sessionInfoTbl', NvP64, 8)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS(c.Struct): + SIZE = 8 + fabricBaseAddr: int +struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS.register_fields([('fabricBaseAddr', NvU64, 0)]) +NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS(c.Struct): + SIZE = 4 + handle: int +struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS.register_fields([('handle', NvU32, 0)]) +NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS(c.Struct): + SIZE = 12 + statusMask: int + xusbData: int + ppcData: int +struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS.register_fields([('statusMask', NvU32, 0), ('xusbData', NvU32, 4), ('ppcData', NvU32, 8)]) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PARTITION_SPAN(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_GPU_PARTITION_SPAN.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_GPU_PARTITION_SPAN: TypeAlias = struct_NV2080_CTRL_GPU_PARTITION_SPAN +@c.record +class struct_NV2080_CTRL_EXEC_PARTITION_SPAN(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_EXEC_PARTITION_SPAN.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_EXEC_PARTITION_SPAN: TypeAlias = struct_NV2080_CTRL_EXEC_PARTITION_SPAN +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITION_INFO(c.Struct): + SIZE = 48 + swizzId: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] + partitionFlag: int + bValid: int + placement: struct_NV2080_CTRL_GPU_PARTITION_SPAN +struct_NV2080_CTRL_GPU_SET_PARTITION_INFO.register_fields([('swizzId', NvU32, 0), ('uuid', c.Array[NvU8, Literal[16]], 4), ('partitionFlag', NvU32, 20), ('bValid', NvBool, 24), ('placement', NV2080_CTRL_GPU_PARTITION_SPAN, 32)]) +NV2080_CTRL_GPU_SET_PARTITION_INFO: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITION_INFO +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS(c.Struct): + SIZE = 392 + partitionCount: int + partitionInfo: c.Array[struct_NV2080_CTRL_GPU_SET_PARTITION_INFO, Literal[8]] +struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS.register_fields([('partitionCount', NvU32, 0), ('partitionInfo', c.Array[NV2080_CTRL_GPU_SET_PARTITION_INFO, Literal[8]], 8)]) +NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITION_INFO(c.Struct): + SIZE = 232 + swizzId: int + partitionFlag: int + grEngCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + gpcsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + virtualGpcsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + gfxGpcPerGr: c.Array[ctypes.c_uint32, Literal[8]] + veidsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + memSize: int + span: struct_NV2080_CTRL_GPU_PARTITION_SPAN + bValid: int + bPartitionError: int + validCTSIdMask: int + validGfxCTSIdMask: int +struct_NV2080_CTRL_GPU_GET_PARTITION_INFO.register_fields([('swizzId', NvU32, 0), ('partitionFlag', NvU32, 4), ('grEngCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16), ('ceCount', NvU32, 20), ('nvEncCount', NvU32, 24), ('nvDecCount', NvU32, 28), ('nvJpgCount', NvU32, 32), ('nvOfaCount', NvU32, 36), ('gpcCount', NvU32, 40), ('virtualGpcCount', NvU32, 44), ('gfxGpcCount', NvU32, 48), ('gpcsPerGr', c.Array[NvU32, Literal[8]], 52), ('virtualGpcsPerGr', c.Array[NvU32, Literal[8]], 84), ('gfxGpcPerGr', c.Array[NvU32, Literal[8]], 116), ('veidsPerGr', c.Array[NvU32, Literal[8]], 148), ('memSize', NvU64, 184), ('span', NV2080_CTRL_GPU_PARTITION_SPAN, 192), ('bValid', NvBool, 208), ('bPartitionError', NvBool, 209), ('validCTSIdMask', NvU64, 216), ('validGfxCTSIdMask', NvU64, 224)]) +NV2080_CTRL_GPU_GET_PARTITION_INFO: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS(c.Struct): + SIZE = 1864 + queryPartitionInfo: c.Array[struct_NV2080_CTRL_GPU_GET_PARTITION_INFO, Literal[8]] + validPartitionCount: int + bGetAllPartitionInfo: int +struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS.register_fields([('queryPartitionInfo', c.Array[NV2080_CTRL_GPU_GET_PARTITION_INFO, Literal[8]], 0), ('validPartitionCount', NvU32, 1856), ('bGetAllPartitionInfo', NvBool, 1860)]) +NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS(c.Struct): + SIZE = 44 + swizzId: int + gpcCountPerSmcEng: c.Array[ctypes.c_uint32, Literal[8]] + updateSmcEngMask: int + bUseAllGPCs: int +struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS.register_fields([('swizzId', NvU32, 0), ('gpcCountPerSmcEng', c.Array[NvU32, Literal[8]], 4), ('updateSmcEngMask', NvU32, 36), ('bUseAllGPCs', NvBool, 40)]) +NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_FAULT_PACKET(c.Struct): + SIZE = 32 + data: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV2080_CTRL_GPU_FAULT_PACKET.register_fields([('data', c.Array[NvU8, Literal[32]], 0)]) +NV2080_CTRL_GPU_FAULT_PACKET: TypeAlias = struct_NV2080_CTRL_GPU_FAULT_PACKET +@c.record +class struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS(c.Struct): + SIZE = 32 + faultPacket: struct_NV2080_CTRL_GPU_FAULT_PACKET +struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS.register_fields([('faultPacket', NV2080_CTRL_GPU_FAULT_PACKET, 0)]) +NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS +NV2080_CTRL_GPU_EXEC_REG_OPS_VGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS(c.Struct): + SIZE = 1008 + engineList: c.Array[ctypes.c_uint32, Literal[84]] + runlistPriBase: c.Array[ctypes.c_uint32, Literal[84]] + runlistId: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS.register_fields([('engineList', c.Array[NvU32, Literal[84]], 0), ('runlistPriBase', c.Array[NvU32, Literal[84]], 336), ('runlistId', c.Array[NvU32, Literal[84]], 672)]) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS(c.Struct): + SIZE = 672 + engineList: c.Array[ctypes.c_uint32, Literal[84]] + hwEngineID: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS.register_fields([('engineList', c.Array[NvU32, Literal[84]], 0), ('hwEngineID', c.Array[NvU32, Literal[84]], 336)]) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS(c.Struct): + SIZE = 12 + sessionCount: int + averageFPS: int + averageLatency: int +struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS.register_fields([('sessionCount', NvU32, 0), ('averageFPS', NvU32, 4), ('averageLatency', NvU32, 8)]) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO(c.Struct): + SIZE = 52 + processId: int + subProcessId: int + vgpuInstanceId: int + sessionId: int + sessionType: int + displayOrdinal: int + sessionFlags: int + hMaxResolution: int + vMaxResolution: int + hResolution: int + vResolution: int + averageFPS: int + averageLatency: int +struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO.register_fields([('processId', NvU32, 0), ('subProcessId', NvU32, 4), ('vgpuInstanceId', NvU32, 8), ('sessionId', NvU32, 12), ('sessionType', NvU32, 16), ('displayOrdinal', NvU32, 20), ('sessionFlags', NvU32, 24), ('hMaxResolution', NvU32, 28), ('vMaxResolution', NvU32, 32), ('hResolution', NvU32, 36), ('vResolution', NvU32, 40), ('averageFPS', NvU32, 44), ('averageLatency', NvU32, 48)]) +NV2080_CTRL_NVFBC_SW_SESSION_INFO: TypeAlias = struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS(c.Struct): + SIZE = 13316 + sessionInfoCount: int + sessionInfoTbl: c.Array[struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO, Literal[256]] +struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS.register_fields([('sessionInfoCount', NvU32, 0), ('sessionInfoTbl', c.Array[NV2080_CTRL_NVFBC_SW_SESSION_INFO, Literal[256]], 4)]) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS(c.Struct): + SIZE = 4 + firstAsyncCEIdx: int +struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS.register_fields([('firstAsyncCEIdx', NvU32, 0)]) +NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS(c.Struct): + SIZE = 8 + vmmuSegmentSize: int +struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS.register_fields([('vmmuSegmentSize', NvU64, 0)]) +NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS(c.Struct): + SIZE = 280 + partitionFlag: int + partitionCount: int + availableSpans: c.Array[struct_NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]] + availableSpansCount: int + totalPartitionCount: int + totalSpans: c.Array[struct_NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]] + totalSpansCount: int + bStaticInfo: int +struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('partitionCount', NvU32, 4), ('availableSpans', c.Array[NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]], 8), ('availableSpansCount', NvU32, 136), ('totalPartitionCount', NvU32, 140), ('totalSpans', c.Array[NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]], 144), ('totalSpansCount', NvU32, 272), ('bStaticInfo', NvBool, 276)]) +NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS +NV2080_CTRL_GPU_GET_CACHED_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS(c.Struct): + SIZE = 4 + partitioningMode: int +struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS.register_fields([('partitioningMode', NvU32, 0)]) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO(c.Struct): + SIZE = 64 + partitionFlag: int + grCount: int + gfxGrCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + memorySize: int +struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO.register_fields([('partitionFlag', NvU32, 0), ('grCount', NvU32, 4), ('gfxGrCount', NvU32, 8), ('gpcCount', NvU32, 12), ('virtualGpcCount', NvU32, 16), ('gfxGpcCount', NvU32, 20), ('veidCount', NvU32, 24), ('smCount', NvU32, 28), ('ceCount', NvU32, 32), ('nvEncCount', NvU32, 36), ('nvDecCount', NvU32, 40), ('nvJpgCount', NvU32, 44), ('nvOfaCount', NvU32, 48), ('memorySize', NvU64, 56)]) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO: TypeAlias = struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO +@c.record +class struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS(c.Struct): + SIZE = 2568 + descCount: int + partitionDescs: c.Array[struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO, Literal[40]] +struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS.register_fields([('descCount', NvU32, 0), ('partitionDescs', c.Array[NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO, Literal[40]], 8)]) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS(c.Struct): + SIZE = 8 + maxSupportedPageSize: int +struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS.register_fields([('maxSupportedPageSize', NvU64, 0)]) +NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS(c.Struct): + SIZE = 24 + gpcId: int + count: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS.register_fields([('gpcId', NvU32, 0), ('count', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS(c.Struct): + SIZE = 40 + swizzId: c.Array[ctypes.c_uint32, Literal[9]] + partitionCount: int +struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS.register_fields([('swizzId', c.Array[NvU32, Literal[9]], 0), ('partitionCount', NvU32, 36)]) +NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS(c.Struct): + SIZE = 3812 + idType: int + id: int + pidTblCount: int + pidTbl: c.Array[ctypes.c_uint32, Literal[950]] +struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS.register_fields([('idType', NvU32, 0), ('id', NvU32, 4), ('pidTblCount', NvU32, 8), ('pidTbl', c.Array[NvU32, Literal[950]], 12)]) +NV2080_CTRL_GPU_GET_PIDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS +@c.record +class struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO(c.Struct): + SIZE = 8 + computeInstanceId: int + gpuInstanceId: int +struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO.register_fields([('computeInstanceId', NvU32, 0), ('gpuInstanceId', NvU32, 4)]) +NV2080_CTRL_SMC_SUBSCRIPTION_INFO: TypeAlias = struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO +@c.record +class struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA(c.Struct): + SIZE = 48 + memPrivate: int + memSharedOwned: int + memSharedDuped: int + protectedMemPrivate: int + protectedMemSharedOwned: int + protectedMemSharedDuped: int +struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA.register_fields([('memPrivate', NvU64, 0), ('memSharedOwned', NvU64, 8), ('memSharedDuped', NvU64, 16), ('protectedMemPrivate', NvU64, 24), ('protectedMemSharedOwned', NvU64, 32), ('protectedMemSharedDuped', NvU64, 40)]) +NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA: TypeAlias = struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA +@c.record +class union_NV2080_CTRL_GPU_PID_INFO_DATA(c.Struct): + SIZE = 48 + vidMemUsage: struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA +union_NV2080_CTRL_GPU_PID_INFO_DATA.register_fields([('vidMemUsage', NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA, 0)]) +NV2080_CTRL_GPU_PID_INFO_DATA: TypeAlias = union_NV2080_CTRL_GPU_PID_INFO_DATA +@c.record +class struct_NV2080_CTRL_GPU_PID_INFO(c.Struct): + SIZE = 72 + pid: int + index: int + result: int + data: union_NV2080_CTRL_GPU_PID_INFO_DATA + smcSubscription: struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO +struct_NV2080_CTRL_GPU_PID_INFO.register_fields([('pid', NvU32, 0), ('index', NvU32, 4), ('result', NvU32, 8), ('data', NV2080_CTRL_GPU_PID_INFO_DATA, 16), ('smcSubscription', NV2080_CTRL_SMC_SUBSCRIPTION_INFO, 64)]) +NV2080_CTRL_GPU_PID_INFO: TypeAlias = struct_NV2080_CTRL_GPU_PID_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS(c.Struct): + SIZE = 14408 + pidInfoListCount: int + pidInfoList: c.Array[struct_NV2080_CTRL_GPU_PID_INFO, Literal[200]] +struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS.register_fields([('pidInfoListCount', NvU32, 0), ('pidInfoList', c.Array[NV2080_CTRL_GPU_PID_INFO, Literal[200]], 8)]) +NV2080_CTRL_GPU_GET_PID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS(c.Struct): + SIZE = 4 + faultType: int +struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS.register_fields([('faultType', NvU32, 0)]) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS +enum_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE: dict[int, str] = {(NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_DEFAULT:=0): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_DEFAULT', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_SHORT:=1): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_SHORT', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MEDIUM:=2): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MEDIUM', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_LONG:=3): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_LONG', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MAX:=4): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MAX'} +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG(c.Struct): + SIZE = 8 + type: int + data: struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data(c.Struct): + SIZE = 4 + timeslice: int +struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data.register_fields([('timeslice', NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE, 0)]) +struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG.register_fields([('type', NvU32, 0), ('data', struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data, 4)]) +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG: TypeAlias = struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG +@c.record +class struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS(c.Struct): + SIZE = 8 + config: struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG +struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS.register_fields([('config', NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, 0)]) +NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS(c.Struct): + SIZE = 260 + numConfigs: int + configList: c.Array[struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, Literal[32]] +struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS.register_fields([('numConfigs', NvU32, 0), ('configList', c.Array[NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, Literal[32]], 4)]) +NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GFID_PARAMS(c.Struct): + SIZE = 16 + domain: int + bus: int + device: int + func: int + gfid: int + gfidMask: int +struct_NV2080_CTRL_GPU_GET_GFID_PARAMS.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('device', NvU8, 5), ('func', NvU8, 6), ('gfid', NvU32, 8), ('gfidMask', NvU32, 12)]) +NV2080_CTRL_GPU_GET_GFID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GFID_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS(c.Struct): + SIZE = 12 + gfid: int + bEnable: int + fabricPartitionId: int +struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS.register_fields([('gfid', NvU32, 0), ('bEnable', NvBool, 4), ('fabricPartitionId', NvU32, 8)]) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS(c.Struct): + SIZE = 24 + addressStart: int + addressLength: int + protection: int +struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS.register_fields([('addressStart', NvU64, 0), ('addressLength', NvU64, 8), ('protection', NvU32, 16)]) +NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_EGM_GPA_FABRIC_BASE_ADDR_PARAMS(c.Struct): + SIZE = 8 + egmGpaFabricBaseAddr: int +struct_NV2080_CTRL_GPU_SET_EGM_GPA_FABRIC_BASE_ADDR_PARAMS.register_fields([('egmGpaFabricBaseAddr', NvU64, 0)]) +NV2080_CTRL_GPU_SET_EGM_GPA_FABRIC_BASE_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_EGM_GPA_FABRIC_BASE_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS(c.Struct): + SIZE = 2608 + engineCount: int + engineList: c.Array[ctypes.c_uint32, Literal[200]] + engineStateLoadTime: c.Array[ctypes.c_uint64, Literal[200]] + engineIsInit: c.Array[ctypes.c_ubyte, Literal[200]] +struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', c.Array[NvU32, Literal[200]], 4), ('engineStateLoadTime', c.Array[NvU64, Literal[200]], 808), ('engineIsInit', c.Array[NvBool, Literal[200]], 2408)]) +NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS(c.Struct): + SIZE = 20804 + engineCount: int + engineID: c.Array[ctypes.c_uint32, Literal[200]] + engineName: c.Array[c.Array[ctypes.c_char, Literal[100]], Literal[200]] +struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineID', c.Array[NvU32, Literal[200]], 4), ('engineName', c.Array[c.Array[ctypes.c_char, Literal[100]], Literal[200]], 804)]) +NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS(c.Struct): + SIZE = 3240 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + reserved00: c.Array[ctypes.c_uint32, Literal[2]] + regOpCount: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[100]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('reserved00', c.Array[NvU32, Literal[2]], 12), ('regOpCount', NvU32, 20), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[100]], 24), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 3224)]) +NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO(c.Struct): + SIZE = 52 + gpuId: int + gpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerId: int + busEgmPeerId: int +struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO.register_fields([('gpuId', NvU32, 0), ('gpuUuid', c.Array[NvU8, Literal[16]], 4), ('p2pCaps', NvU32, 20), ('p2pOptimalReadCEs', NvU32, 24), ('p2pOptimalWriteCEs', NvU32, 28), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 32), ('busPeerId', NvU32, 44), ('busEgmPeerId', NvU32, 48)]) +NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO: TypeAlias = struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO +@c.record +class struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 1672 + bAllCaps: int + bUseUuid: int + peerGpuCount: int + peerGpuCaps: c.Array[struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO, Literal[32]] +struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS.register_fields([('bAllCaps', NvBool, 0), ('bUseUuid', NvBool, 1), ('peerGpuCount', NvU32, 4), ('peerGpuCaps', c.Array[NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO, Literal[32]], 8)]) +NV2080_CTRL_GET_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_PROFILE(c.Struct): + SIZE = 20 + computeSize: int + gfxGpcCount: int + gpcCount: int + veidCount: int + smCount: int +struct_NV2080_CTRL_GPU_COMPUTE_PROFILE.register_fields([('computeSize', NvU8, 0), ('gfxGpcCount', NvU32, 4), ('gpcCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16)]) +NV2080_CTRL_GPU_COMPUTE_PROFILE: TypeAlias = struct_NV2080_CTRL_GPU_COMPUTE_PROFILE +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS(c.Struct): + SIZE = 168 + partitionFlag: int + profileCount: int + profiles: c.Array[struct_NV2080_CTRL_GPU_COMPUTE_PROFILE, Literal[8]] +struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('profileCount', NvU32, 4), ('profiles', c.Array[NV2080_CTRL_GPU_COMPUTE_PROFILE, Literal[8]], 8)]) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 48 + state: int + status: int + clusterUuid: c.Array[ctypes.c_ubyte, Literal[16]] + fabricPartitionId: int + fabricCaps: int + fabricCliqueId: int + fabricHealthMask: int +struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('state', NvU8, 0), ('status', NV_STATUS, 4), ('clusterUuid', c.Array[NvU8, Literal[16]], 8), ('fabricPartitionId', NvU16, 24), ('fabricCaps', NvU64, 32), ('fabricCliqueId', NvU32, 40), ('fabricHealthMask', NvU32, 44)]) +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS(c.Struct): + SIZE = 16 + pciDevId: int + chipSku: c.Array[ctypes.c_ubyte, Literal[4]] + chipMajor: int + chipMinor: int +struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS.register_fields([('pciDevId', NvU32, 0), ('chipSku', c.Array[NvU8, Literal[4]], 4), ('chipMajor', NvU32, 8), ('chipMinor', NvU32, 12)]) +NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS(c.Struct): + SIZE = 4 + swizzId: int +struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS.register_fields([('swizzId', NvU32, 0)]) +NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS(c.Struct): + SIZE = 1832 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + regOpCount: int + smIds: c.Array[ctypes.c_uint32, Literal[50]] + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[50]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('regOpCount', NvU32, 12), ('smIds', c.Array[NvU32, Literal[50]], 16), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[50]], 216), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 1816)]) +NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_GSP_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_VGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS(c.Struct): + SIZE = 1 + bResetRequired: int +struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS.register_fields([('bResetRequired', NvBool, 0)]) +NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS(c.Struct): + SIZE = 1 + bDrainRecommended: int +struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS.register_fields([('bDrainRecommended', NvBool, 0)]) +NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS(c.Struct): + SIZE = 16388 + sessionInfoTblEntry: int + sessionInfoTbl: c.Array[struct_NV2080_CTRL_NVENC_SW_SESSION_INFO, Literal[512]] +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS.register_fields([('sessionInfoTblEntry', NvU32, 0), ('sessionInfoTbl', c.Array[NV2080_CTRL_NVENC_SW_SESSION_INFO, Literal[512]], 4)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO(c.Struct): + SIZE = 20 + engDesc: int + ctxAttr: int + ctxBufferSize: int + addrSpaceList: int + registerBase: int +struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO.register_fields([('engDesc', NvU32, 0), ('ctxAttr', NvU32, 4), ('ctxBufferSize', NvU32, 8), ('addrSpaceList', NvU32, 12), ('registerBase', NvU32, 16)]) +NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO: TypeAlias = struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS(c.Struct): + SIZE = 1284 + numConstructedFalcons: int + constructedFalconsTable: c.Array[struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO, Literal[64]] +struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS.register_fields([('numConstructedFalcons', NvU32, 0), ('constructedFalconsTable', c.Array[NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO, Literal[64]], 4)]) +NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS +@c.record +class struct_NV2080_VF_MSIX_CAPS(c.Struct): + SIZE = 12 + msix_header: int + msix_table: int + msix_pba: int +struct_NV2080_VF_MSIX_CAPS.register_fields([('msix_header', NvU32, 0), ('msix_table', NvU32, 4), ('msix_pba', NvU32, 8)]) +NV2080_VF_MSIX_CAPS: TypeAlias = struct_NV2080_VF_MSIX_CAPS +@c.record +class struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS(c.Struct): + SIZE = 16 + gfid: int + vfMsixCap: struct_NV2080_VF_MSIX_CAPS +struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS.register_fields([('gfid', NvU32, 0), ('vfMsixCap', NV2080_VF_MSIX_CAPS, 4)]) +NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS +enum_NV2080_CTRL_GPU_RECOVERY_ACTION: dict[int, str] = {(NV2080_CTRL_GPU_RECOVERY_ACTION_NONE:=0): 'NV2080_CTRL_GPU_RECOVERY_ACTION_NONE', (NV2080_CTRL_GPU_RECOVERY_ACTION_GPU_RESET:=1): 'NV2080_CTRL_GPU_RECOVERY_ACTION_GPU_RESET', (NV2080_CTRL_GPU_RECOVERY_ACTION_NODE_REBOOT:=2): 'NV2080_CTRL_GPU_RECOVERY_ACTION_NODE_REBOOT', (NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_P2P:=3): 'NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_P2P', (NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_AND_RESET:=4): 'NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_AND_RESET'} +NV2080_CTRL_GPU_RECOVERY_ACTION: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS.register_fields([('action', NV2080_CTRL_GPU_RECOVERY_ACTION, 0)]) +NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS(c.Struct): + SIZE = 1 + bFipsEnabled: int +struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS.register_fields([('bFipsEnabled', NvBool, 0)]) +NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS +enum_NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE: dict[int, str] = {(NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_INVALID:=0): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_INVALID', (NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_TPC:=1): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_TPC', (NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_GPC:=2): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_GPC'} +NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_RAFTS_FLOORSWEEP_INFO(c.Struct): + SIZE = 12 + unitType: int + parentId: int + mask: int +struct_NV2080_RAFTS_FLOORSWEEP_INFO.register_fields([('unitType', NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE, 0), ('parentId', NvU32, 4), ('mask', NvU32, 8)]) +NV2080_RAFTS_FLOORSWEEP_INFO: TypeAlias = struct_NV2080_RAFTS_FLOORSWEEP_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS(c.Struct): + SIZE = 344 + tpcCountMatrix: c.Array[c.Array[ctypes.c_ubyte, Literal[12]], Literal[2]] + bValid: int + floorSweepConfig: c.Array[struct_NV2080_RAFTS_FLOORSWEEP_INFO, Literal[26]] + gfxGpcCount: int + gfxTpcPerGpcCount: int + maxUgpuTpcDiff: int +struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS.register_fields([('tpcCountMatrix', c.Array[c.Array[NvU8, Literal[12]], Literal[2]], 0), ('bValid', NvBool, 24), ('floorSweepConfig', c.Array[NV2080_RAFTS_FLOORSWEEP_INFO, Literal[26]], 28), ('gfxGpcCount', NvU8, 340), ('gfxTpcPerGpcCount', NvU8, 341), ('maxUgpuTpcDiff', NvU8, 342)]) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS(c.Struct): + SIZE = 152 + partitionFlag: int + computeSize: int + totalProfileCount: int + totalSpans: c.Array[struct_NV2080_CTRL_EXEC_PARTITION_SPAN, Literal[8]] + totalSpansCount: int +struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('computeSize', NvU32, 4), ('totalProfileCount', NvU32, 8), ('totalSpans', c.Array[NV2080_CTRL_EXEC_PARTITION_SPAN, Literal[8]], 16), ('totalSpansCount', NvU32, 144)]) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS(c.Struct): + SIZE = 8 + gpc: int + tpcReconfigMask: int +struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS.register_fields([('gpc', NvU32, 0), ('tpcReconfigMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GPUMON_SAMPLE(c.Struct): + SIZE = 8 + timeStamp: int +struct_NV2080_CTRL_GPUMON_SAMPLE.register_fields([('timeStamp', NvU64, 0)]) +NV2080_CTRL_GPUMON_SAMPLE: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLE +@c.record +class struct_NV2080_CTRL_GPUMON_SAMPLES(c.Struct): + SIZE = 24 + type: int + bufSize: int + count: int + tracker: int + pSamples: ctypes.c_void_p +struct_NV2080_CTRL_GPUMON_SAMPLES.register_fields([('type', NvU8, 0), ('bufSize', NvU32, 4), ('count', NvU32, 8), ('tracker', NvU32, 12), ('pSamples', NvP64, 16)]) +NV2080_CTRL_GPUMON_SAMPLES: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLES +NV2080_CTRL_GR_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 32 + grInfoListSize: int + grInfoList: ctypes.c_void_p + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_INFO_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', NvP64, 8), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 16)]) +NV2080_CTRL_GR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + hShareClient: int + hShareChannel: int + zcullMode: int +struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('hShareClient', NvHandle, 4), ('hShareChannel', NvHandle, 8), ('zcullMode', NvU32, 12)]) +NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 40 + widthAlignPixels: int + heightAlignPixels: int + pixelSquaresByAliquots: int + aliquotTotal: int + zcullRegionByteMultiplier: int + zcullRegionHeaderSize: int + zcullSubregionHeaderSize: int + subregionCount: int + subregionWidthAlignPixels: int + subregionHeightAlignPixels: int +struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS.register_fields([('widthAlignPixels', NvU32, 0), ('heightAlignPixels', NvU32, 4), ('pixelSquaresByAliquots', NvU32, 8), ('aliquotTotal', NvU32, 12), ('zcullRegionByteMultiplier', NvU32, 16), ('zcullRegionHeaderSize', NvU32, 20), ('zcullSubregionHeaderSize', NvU32, 24), ('subregionCount', NvU32, 28), ('subregionWidthAlignPixels', NvU32, 32), ('subregionHeightAlignPixels', NvU32, 36)]) +NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + pmMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('pmMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS(c.Struct): + SIZE = 24 + hClient: int + hChannel: int + vMemPtr: int + zcullMode: int +struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8), ('zcullMode', NvU32, 16)]) +NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS(c.Struct): + SIZE = 40 + hClient: int + hChannel: int + vMemPtr: int + pmMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8), ('pmMode', NvU32, 16), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 24)]) +NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS(c.Struct): + SIZE = 16 + hClient: int + hChannel: int + vMemPtr: int +struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8)]) +NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS(c.Struct): + SIZE = 152 + mapValueCount: int + mapValues: c.Array[ctypes.c_ubyte, Literal[128]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS.register_fields([('mapValueCount', NvU32, 0), ('mapValues', c.Array[NvU8, Literal[128]], 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 136)]) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + smpcMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('smpcMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS(c.Struct): + SIZE = 1944 + smId: c.Array[struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId, Literal[240]] + smCount: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId(c.Struct): + SIZE = 8 + gpcId: int + tpcId: int +struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId.register_fields([('gpcId', NvU32, 0), ('tpcId', NvU32, 4)]) +struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS.register_fields([('smId', c.Array[struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId, Literal[240]], 0), ('smCount', NvU32, 1920), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 1928)]) +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS(c.Struct): + SIZE = 32 + flags: int + hChannel: int + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS.register_fields([('flags', NvU32, 0), ('hChannel', NvHandle, 4), ('gfxpPreemptMode', NvU32, 8), ('cilpPreemptMode', NvU32, 12), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 16)]) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS +enum_NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS: dict[int, str] = {(NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_MAIN:=0): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_MAIN', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SPILL:=1): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SPILL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_PAGEPOOL:=2): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_PAGEPOOL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_BETACB:=3): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_BETACB', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_RTV:=4): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_RTV', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL:=5): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL:=6): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL_CPU:=7): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL_CPU', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SETUP:=8): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SETUP', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_END:=9): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_END'} +NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS(c.Struct): + SIZE = 112 + flags: int + hClient: int + hChannel: int + vMemPtrs: c.Array[ctypes.c_uint64, Literal[9]] + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS.register_fields([('flags', NvU32, 0), ('hClient', NvHandle, 4), ('hChannel', NvHandle, 8), ('vMemPtrs', c.Array[NvU64, Literal[9]], 16), ('gfxpPreemptMode', NvU32, 88), ('cilpPreemptMode', NvU32, 92), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 96)]) +NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + samplingMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('samplingMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS(c.Struct): + SIZE = 12 + ropUnitCount: int + ropOperationsFactor: int + ropOperationsCount: int +struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS.register_fields([('ropUnitCount', NvU32, 0), ('ropOperationsFactor', NvU32, 4), ('ropOperationsCount', NvU32, 8)]) +NV2080_CTRL_GR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS(c.Struct): + SIZE = 32 + hChannel: int + flags: int + saveCnt: int + restoreCnt: int + wfiSaveCnt: int + ctaSaveCnt: int + cilpSaveCnt: int + gfxpSaveCnt: int +struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS.register_fields([('hChannel', NvHandle, 0), ('flags', NvU32, 4), ('saveCnt', NvU32, 8), ('restoreCnt', NvU32, 12), ('wfiSaveCnt', NvU32, 16), ('ctaSaveCnt', NvU32, 20), ('cilpSaveCnt', NvU32, 24), ('gfxpSaveCnt', NvU32, 28)]) +NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + totalBufferSize: int +struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('totalBufferSize', NvU64, 8)]) +NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTX_BUFFER_INFO(c.Struct): + SIZE = 80 + alignment: int + size: int + bufferHandle: ctypes.c_void_p + pageCount: int + physAddr: int + bufferType: int + aperture: int + kind: int + pageSize: int + bIsContigous: int + bGlobalBuffer: int + bLocalBuffer: int + bDeviceDescendant: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_GR_CTX_BUFFER_INFO.register_fields([('alignment', NvU64, 0), ('size', NvU64, 8), ('bufferHandle', NvP64, 16), ('pageCount', NvU64, 24), ('physAddr', NvU64, 32), ('bufferType', NvU32, 40), ('aperture', NvU32, 44), ('kind', NvU32, 48), ('pageSize', NvU32, 52), ('bIsContigous', NvBool, 56), ('bGlobalBuffer', NvBool, 57), ('bLocalBuffer', NvBool, 58), ('bDeviceDescendant', NvBool, 59), ('uuid', c.Array[NvU8, Literal[16]], 60)]) +NV2080_CTRL_GR_CTX_BUFFER_INFO: TypeAlias = struct_NV2080_CTRL_GR_CTX_BUFFER_INFO +PNV2080_CTRL_GR_CTX_BUFFER_INFO: TypeAlias = c.POINTER[struct_NV2080_CTRL_GR_CTX_BUFFER_INFO] +@c.record +class struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 5136 + hUserClient: int + hChannel: int + bufferCount: int + ctxBufferInfo: c.Array[struct_NV2080_CTRL_GR_CTX_BUFFER_INFO, Literal[64]] +struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('bufferCount', NvU32, 8), ('ctxBufferInfo', c.Array[NV2080_CTRL_GR_CTX_BUFFER_INFO, Literal[64]], 16)]) +NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS(c.Struct): + SIZE = 6168 + globalSmId: c.Array[struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId, Literal[512]] + numSm: int + numTpc: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId(c.Struct): + SIZE = 12 + gpcId: int + localTpcId: int + localSmId: int + globalTpcId: int + virtualGpcId: int + migratableTpcId: int +struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId.register_fields([('gpcId', NvU16, 0), ('localTpcId', NvU16, 2), ('localSmId', NvU16, 4), ('globalTpcId', NvU16, 6), ('virtualGpcId', NvU16, 8), ('migratableTpcId', NvU16, 10)]) +struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS.register_fields([('globalSmId', c.Array[struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId, Literal[512]], 0), ('numSm', NvU16, 6144), ('numTpc', NvU16, 6146), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 6152)]) +NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS(c.Struct): + SIZE = 24 + chID: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS.register_fields([('chID', NvU32, 0), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS +@c.record +class struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC(c.Struct): + SIZE = 32 + errorCounter: int + errorTimestamp: int + warningCounter: int + warningTimestamp: int +struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC.register_fields([('errorCounter', NvU64, 0), ('errorTimestamp', NvU64, 8), ('warningCounter', NvU64, 16), ('warningTimestamp', NvU64, 24)]) +NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC: TypeAlias = struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC +@c.record +class struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC(c.Struct): + SIZE = 320 + tpc: c.Array[struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC, Literal[10]] +struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC.register_fields([('tpc', c.Array[NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC, Literal[10]], 0)]) +NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC: TypeAlias = struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC +@c.record +class struct_NV2080_CTRL_GR_VAT_ALARM_DATA(c.Struct): + SIZE = 3200 + gpc: c.Array[struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC, Literal[10]] +struct_NV2080_CTRL_GR_VAT_ALARM_DATA.register_fields([('gpc', c.Array[NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC, Literal[10]], 0)]) +NV2080_CTRL_GR_VAT_ALARM_DATA: TypeAlias = struct_NV2080_CTRL_GR_VAT_ALARM_DATA +@c.record +class struct_NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS(c.Struct): + SIZE = 3208 + smVatAlarm: struct_NV2080_CTRL_GR_VAT_ALARM_DATA + maxGpcCount: int + maxTpcPerGpcCount: int +struct_NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS.register_fields([('smVatAlarm', NV2080_CTRL_GR_VAT_ALARM_DATA, 0), ('maxGpcCount', NvU32, 3200), ('maxTpcPerGpcCount', NvU32, 3204)]) +NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS +PNV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS] +@c.record +class struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 4 + attribBufferSize: int +struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS.register_fields([('attribBufferSize', NvU32, 0)]) +NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS(c.Struct): + SIZE = 40 + maxSlots: int + slotStride: int + ctrlStructSize: int + ctrlStructAlign: int + poolSize: int + poolAlign: int +struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS.register_fields([('maxSlots', NvU32, 0), ('slotStride', NvU32, 4), ('ctrlStructSize', NvU64, 8), ('ctrlStructAlign', NvU64, 16), ('poolSize', NvU64, 24), ('poolAlign', NvU64, 32)]) +NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS(c.Struct): + SIZE = 16 + maxSlots: int + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS.register_fields([('maxSlots', NvU32, 0), ('hMemory', NvHandle, 4), ('offset', NvU32, 8), ('size', NvU32, 12)]) +NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS(c.Struct): + SIZE = 272 + numSlots: int + slots: c.Array[ctypes.c_uint32, Literal[64]] + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS.register_fields([('numSlots', NvU32, 0), ('slots', c.Array[NvU32, Literal[64]], 4), ('hMemory', NvHandle, 260), ('offset', NvU32, 264), ('size', NvU32, 268)]) +NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS(c.Struct): + SIZE = 276 + numSlots: int + slots: c.Array[ctypes.c_uint32, Literal[64]] + bRemoveSpecificSlots: int + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS.register_fields([('numSlots', NvU32, 0), ('slots', c.Array[NvU32, Literal[64]], 4), ('bRemoveSpecificSlots', NvBool, 260), ('hMemory', NvHandle, 264), ('offset', NvU32, 268), ('size', NvU32, 272)]) +NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS +NV2080_CTRL_GR_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS +NV2080_CTRL_GR_GET_INFO_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcMask: int +struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcMask', NvU32, 16)]) +NV2080_CTRL_GR_GET_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcId', NvU32, 16), ('tpcMask', NvU32, 20)]) +NV2080_CTRL_GR_GET_TPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS +NV2080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS(c.Struct): + SIZE = 32 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + engineId: int + alignment: int + size: int + bInfoPopulated: int +struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('engineId', NvU32, 16), ('alignment', NvU32, 20), ('size', NvU32, 24), ('bInfoPopulated', NvBool, 28)]) +NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS(c.Struct): + SIZE = 32 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + imla0: int + fmla16: int + dp: int + fmla32: int + ffma: int + imla1: int + imla2: int + imla3: int + imla4: int +struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('imla0', NvU8, 16), ('fmla16', NvU8, 17), ('dp', NvU8, 18), ('fmla32', NvU8, 19), ('ffma', NvU8, 20), ('imla1', NvU8, 21), ('imla2', NvU8, 22), ('imla3', NvU8, 23), ('imla4', NvU8, 24)]) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +enum_NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD: dict[int, str] = {(NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_FULL:=0): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_FULL', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_SIMPLE:=1): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_SIMPLE', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_COMPAT:=2): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_COMPAT', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_CUSTOM:=3): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_CUSTOM'} +NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS(c.Struct): + SIZE = 20 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int +struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16)]) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS(c.Struct): + SIZE = 8 + physSyspipeId: int + gpcMask: int +struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS.register_fields([('physSyspipeId', NvU32, 0), ('gpcMask', NvU32, 4)]) +NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcId: int + ppcMask: int +struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcId', NvU32, 16), ('ppcMask', NvU32, 20)]) +NV2080_CTRL_GR_GET_PPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + numTpcs: int +struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS.register_fields([('gpcId', NvU32, 0), ('numTpcs', NvU32, 4)]) +NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + zcullMode: int + pmMode: int + smpcMode: int + cilpPreemptMode: int + gfxpPreemptMode: int +struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('zcullMode', NvU32, 4), ('pmMode', NvU32, 8), ('smpcMode', NvU32, 12), ('cilpPreemptMode', NvU32, 16), ('gfxpPreemptMode', NvU32, 20)]) +NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS +NV2080_CTRL_GR_GET_GPC_TILE_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + zcullMask: int +struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('zcullMask', NvU32, 4)]) +NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS +enum_NV2080_CTRL_GR_FECS_BIND_EVTBUF_REASON_CODE: dict[int, str] = {(NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NONE:=0): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NONE', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_GPU_TOO_OLD:=1): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_GPU_TOO_OLD', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED_GPU:=2): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED_GPU', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED:=3): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_ADMIN:=4): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_ADMIN', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_CAPABILITY:=5): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_CAPABILITY'} +NV2080_CTRL_GR_FECS_BIND_EVTBUF_REASON_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS(c.Struct): + SIZE = 24 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int + reasonCode: int +struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16), ('reasonCode', NvU32, 20)]) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + physGfxGpcMask: int + numGfxTpc: int +struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('physGfxGpcMask', NvU32, 16), ('numGfxTpc', NvU32, 20)]) +NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS(c.Struct): + SIZE = 24 + gpc: int + tpcReconfigMask: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS.register_fields([('gpc', NvU32, 0), ('tpcReconfigMask', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS(c.Struct): + SIZE = 4 + gpcCount: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS.register_fields([('gpcCount', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + chipletGpcMap: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS.register_fields([('gpcId', NvU32, 0), ('chipletGpcMap', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('tpcMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + ppcMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('ppcMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + gpcId: int + chipletGpcMap: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS.register_fields([('swizzId', NvU32, 0), ('gpcId', NvU32, 4), ('chipletGpcMap', NvU32, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + ropMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('ropMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS(c.Struct): + SIZE = 4 + chipletSyspipeMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS.register_fields([('chipletSyspipeMask', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + physSyspipeIdCount: int + physSyspipeId: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS.register_fields([('swizzId', NvU16, 0), ('physSyspipeIdCount', NvU16, 2), ('physSyspipeId', c.Array[NvU8, Literal[8]], 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + grIdx: int + gpcEnMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('grIdx', NvU32, 4), ('gpcEnMask', NvU32, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS(c.Struct): + SIZE = 4 + syspipeId: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS.register_fields([('syspipeId', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS(c.Struct): + SIZE = 20 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData(c.Struct): + SIZE = 12 + gpcCountData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS + chipletGpcMapData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS + tpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS + ppcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS + partitionGpcMapData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS + syspipeMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS + partitionChipletSyspipeData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS + dmGpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS + partitionSyspipeIdData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS + ropMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData.register_fields([('gpcCountData', NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS, 0), ('chipletGpcMapData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS, 0), ('tpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS, 0), ('ppcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS, 0), ('partitionGpcMapData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS, 0), ('syspipeMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS, 0), ('partitionChipletSyspipeData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS, 0), ('dmGpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS, 0), ('partitionSyspipeIdData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS, 0), ('ropMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS, 0)]) +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryData', struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS(c.Struct): + SIZE = 1928 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS, Literal[96]] +struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS, Literal[96]], 8)]) +NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS(c.Struct): + SIZE = 72 + gspFeatures: int + bValid: int + bDefaultGspRmGpu: int + firmwareVersion: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS.register_fields([('gspFeatures', NvU32, 0), ('bValid', NvBool, 4), ('bDefaultGspRmGpu', NvBool, 5), ('firmwareVersion', c.Array[NvU8, Literal[64]], 6)]) +NV2080_CTRL_GSP_GET_FEATURES_PARAMS: TypeAlias = struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT(c.Struct): + SIZE = 32 + allocatedSize: int + usableSize: int + memTrackOverhead: int + allocationCount: int +struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT.register_fields([('allocatedSize', NvU64, 0), ('usableSize', NvU64, 8), ('memTrackOverhead', NvU64, 16), ('allocationCount', NvU32, 24)]) +NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT: TypeAlias = struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT +@c.record +class struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS(c.Struct): + SIZE = 88 + gfid: int + managedSize: int + largestFreeChunkSize: int + current: struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT + peak: struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT +struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS.register_fields([('gfid', NvU32, 0), ('managedSize', NvU64, 8), ('largestFreeChunkSize', NvU64, 16), ('current', NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT, 24), ('peak', NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT, 56)]) +NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS(c.Struct): + SIZE = 40 + allocatedSize: int + peakAllocatedSize: int + managedSize: int + allocationCount: int + peakAllocationCount: int + largestFreeChunkSize: int +struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS.register_fields([('allocatedSize', NvU64, 0), ('peakAllocatedSize', NvU64, 8), ('managedSize', NvU64, 16), ('allocationCount', NvU32, 24), ('peakAllocationCount', NvU32, 28), ('largestFreeChunkSize', NvU64, 32)]) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS(c.Struct): + SIZE = 16 + allocations: int + peakAllocations: int + objectSize: int +struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS.register_fields([('allocations', NvU32, 0), ('peakAllocations', NvU32, 4), ('objectSize', NvU64, 8)]) +NV2080_CTRL_GSP_LIBOS_POOL_STATS: TypeAlias = struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS(c.Struct): + SIZE = 1040 + poolStats: c.Array[struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS, Literal[64]] + totalHeapSize: int + poolCount: int +struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS.register_fields([('poolStats', c.Array[NV2080_CTRL_GSP_LIBOS_POOL_STATS, Literal[64]], 0), ('totalHeapSize', NvU64, 1024), ('poolCount', NvU8, 1032)]) +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS(c.Struct): + SIZE = 8 + hshubNcisocMask: int + hshubNvlMask: int +struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS.register_fields([('hshubNcisocMask', NvU32, 0), ('hshubNvlMask', NvU32, 4)]) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS(c.Struct): + SIZE = 8 + ecMode: int + status: int +struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS.register_fields([('ecMode', NvU32, 0), ('status', NvU32, 4)]) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS(c.Struct): + SIZE = 532 + version: int + port: int + flags: int + inputCount: int + inputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] + outputCount: int + outputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] +struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('inputCount', NvU32, 12), ('inputBuffer', c.Array[NvU8, Literal[256]], 16), ('outputCount', NvU32, 272), ('outputBuffer', c.Array[NvU8, Literal[256]], 276)]) +NV2080_CTRL_I2C_READ_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS(c.Struct): + SIZE = 276 + version: int + port: int + flags: int + inputCount: int + inputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] + encrClientID: int +struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('inputCount', NvU32, 12), ('inputBuffer', c.Array[NvU8, Literal[256]], 16), ('encrClientID', NvU32, 272)]) +NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_RW_REG_PARAMS(c.Struct): + SIZE = 276 + version: int + port: int + flags: int + addr: int + reg: int + bufsize: int + buffer: c.Array[ctypes.c_ubyte, Literal[255]] +struct_NV2080_CTRL_I2C_RW_REG_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('addr', NvU32, 12), ('reg', NvU8, 16), ('bufsize', NvU8, 17), ('buffer', c.Array[NvU8, Literal[255]], 18)]) +NV2080_CTRL_I2C_RW_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +NV2080_CTRL_I2C_READ_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +NV2080_CTRL_I2C_WRITE_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_ACCESS_PARAMS(c.Struct): + SIZE = 40 + token: int + cmd: int + port: int + flags: int + data: ctypes.c_void_p + status: int + dataBuffSize: int + speed: int + encrClientID: int +struct_NV2080_CTRL_I2C_ACCESS_PARAMS.register_fields([('token', NvU32, 0), ('cmd', NvU32, 4), ('port', NvU32, 8), ('flags', NvU32, 12), ('data', NvP64, 16), ('status', NvU32, 24), ('dataBuffSize', NvU32, 28), ('speed', NvU32, 32), ('encrClientID', NvU32, 36)]) +NV2080_CTRL_I2C_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS(c.Struct): + SIZE = 12 + head: int + authType: int + status: int +struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS.register_fields([('head', NvU32, 0), ('authType', NvU32, 4), ('status', NvU32, 8)]) +NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 36 + feHwSysCap: int + windowPresentMask: int + bFbRemapperEnabled: int + numHeads: int + i2cPort: int + internalDispActiveMask: int + embeddedDisplayPortMask: int + bExternalMuxSupported: int + bInternalMuxSupported: int + numDispChannels: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS.register_fields([('feHwSysCap', NvU32, 0), ('windowPresentMask', NvU32, 4), ('bFbRemapperEnabled', NvBool, 8), ('numHeads', NvU32, 12), ('i2cPort', NvU32, 16), ('internalDispActiveMask', NvU32, 20), ('embeddedDisplayPortMask', NvU32, 24), ('bExternalMuxSupported', NvBool, 28), ('bInternalMuxSupported', NvBool, 29), ('numDispChannels', NvU32, 32)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS(c.Struct): + SIZE = 40 + bOneToOneComptagLineAllocation: int + bUseOneToFourComptagLineAllocation: int + bUseRawModeComptaglineAllocation: int + bDisableCompbitBacking: int + bDisablePostL2Compression: int + bEnabledEccFBPA: int + bL2PreFill: int + l2CacheSize: int + bFbpaPresent: int + comprPageSize: int + comprPageShift: int + ramType: int + ltcCount: int + ltsPerLtcCount: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS.register_fields([('bOneToOneComptagLineAllocation', NvBool, 0), ('bUseOneToFourComptagLineAllocation', NvBool, 1), ('bUseRawModeComptaglineAllocation', NvBool, 2), ('bDisableCompbitBacking', NvBool, 3), ('bDisablePostL2Compression', NvBool, 4), ('bEnabledEccFBPA', NvBool, 5), ('bL2PreFill', NvBool, 6), ('l2CacheSize', NvU64, 8), ('bFbpaPresent', NvBool, 16), ('comprPageSize', NvU32, 20), ('comprPageShift', NvU32, 24), ('ramType', NvU32, 28), ('ltcCount', NvU32, 32), ('ltsPerLtcCount', NvU32, 36)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS(c.Struct): + SIZE = 520 + accessCounterIndex: int + bufferSize: int + bufferPteArray: c.Array[ctypes.c_uint64, Literal[64]] +struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS.register_fields([('accessCounterIndex', NvU32, 0), ('bufferSize', NvU32, 4), ('bufferPteArray', c.Array[NvU64, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS(c.Struct): + SIZE = 4 + accessCounterIndex: int +struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS.register_fields([('accessCounterIndex', NvU32, 0)]) +NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS(c.Struct): + SIZE = 23 + capsTbl: c.Array[ctypes.c_ubyte, Literal[23]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[23]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS(c.Struct): + SIZE = 184 + engineCaps: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS.register_fields([('engineCaps', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_CAPS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER(c.Struct): + SIZE = 2884 + globalSmId: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId, Literal[240]] + numSm: int + numTpc: int +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId(c.Struct): + SIZE = 12 + gpcId: int + localTpcId: int + localSmId: int + globalTpcId: int + virtualGpcId: int + migratableTpcId: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId.register_fields([('gpcId', NvU16, 0), ('localTpcId', NvU16, 2), ('localSmId', NvU16, 4), ('globalTpcId', NvU16, 6), ('virtualGpcId', NvU16, 8), ('migratableTpcId', NvU16, 10)]) +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER.register_fields([('globalSmId', c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId, Literal[240]], 0), ('numSm', NvU16, 2880), ('numTpc', NvU16, 2882)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS(c.Struct): + SIZE = 23072 + globalSmOrder: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS.register_fields([('globalSmOrder', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BSP_CAPS(c.Struct): + SIZE = 8 + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_BSP_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_BSP_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BSP_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS(c.Struct): + SIZE = 72 + caps: c.Array[struct_NV2080_CTRL_INTERNAL_BSP_CAPS, Literal[8]] + valid: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS.register_fields([('caps', c.Array[NV2080_CTRL_INTERNAL_BSP_CAPS, Literal[8]], 0), ('valid', c.Array[NvBool, Literal[8]], 64)]) +NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MSENC_CAPS(c.Struct): + SIZE = 4 + capsTbl: c.Array[ctypes.c_ubyte, Literal[4]] +struct_NV2080_CTRL_INTERNAL_MSENC_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[4]], 0)]) +NV2080_CTRL_INTERNAL_MSENC_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MSENC_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS(c.Struct): + SIZE = 40 + caps: c.Array[struct_NV2080_CTRL_INTERNAL_MSENC_CAPS, Literal[8]] + valid: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS.register_fields([('caps', c.Array[NV2080_CTRL_INTERNAL_MSENC_CAPS, Literal[8]], 0), ('valid', c.Array[NvBool, Literal[8]], 32)]) +NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS(c.Struct): + SIZE = 296 + gpcMask: int + tpcMask: c.Array[ctypes.c_uint32, Literal[12]] + tpcCount: c.Array[ctypes.c_uint32, Literal[12]] + physGpcMask: int + mmuPerGpc: c.Array[ctypes.c_uint32, Literal[12]] + tpcToPesMap: c.Array[ctypes.c_uint32, Literal[10]] + numPesPerGpc: c.Array[ctypes.c_uint32, Literal[12]] + zcullMask: c.Array[ctypes.c_uint32, Literal[12]] + physGfxGpcMask: int + numGfxTpc: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS.register_fields([('gpcMask', NvU32, 0), ('tpcMask', c.Array[NvU32, Literal[12]], 4), ('tpcCount', c.Array[NvU32, Literal[12]], 52), ('physGpcMask', NvU32, 100), ('mmuPerGpc', c.Array[NvU32, Literal[12]], 104), ('tpcToPesMap', c.Array[NvU32, Literal[10]], 152), ('numPesPerGpc', c.Array[NvU32, Literal[12]], 192), ('zcullMask', c.Array[NvU32, Literal[12]], 240), ('physGfxGpcMask', NvU32, 288), ('numGfxTpc', NvU32, 292)]) +NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS(c.Struct): + SIZE = 2368 + floorsweepingMasks: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS.register_fields([('floorsweepingMasks', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS +@c.record +class struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS(c.Struct): + SIZE = 1056 + hUserClient: int + hChannel: int + bufferType: int + firstPage: int + numPages: int + physAddrs: c.Array[ctypes.c_uint64, Literal[128]] + bNoMorePages: int +struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('bufferType', NvU32, 8), ('firstPage', NvU32, 12), ('numPages', NvU32, 16), ('physAddrs', c.Array[NvU64, Literal[128]], 24), ('bNoMorePages', NvBool, 1048)]) +NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS: TypeAlias = struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_INFO(c.Struct): + SIZE = 8 + index: int + data: int +struct_NV2080_CTRL_INTERNAL_GR_INFO.register_fields([('index', NvU32, 0), ('data', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GR_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO(c.Struct): + SIZE = 464 + infoList: c.Array[struct_NV2080_CTRL_INTERNAL_GR_INFO, Literal[58]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO.register_fields([('infoList', c.Array[NV2080_CTRL_INTERNAL_GR_INFO, Literal[58]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 3712 + engineInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS.register_fields([('engineInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO(c.Struct): + SIZE = 40 + widthAlignPixels: int + heightAlignPixels: int + pixelSquaresByAliquots: int + aliquotTotal: int + zcullRegionByteMultiplier: int + zcullRegionHeaderSize: int + zcullSubregionHeaderSize: int + subregionCount: int + subregionWidthAlignPixels: int + subregionHeightAlignPixels: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO.register_fields([('widthAlignPixels', NvU32, 0), ('heightAlignPixels', NvU32, 4), ('pixelSquaresByAliquots', NvU32, 8), ('aliquotTotal', NvU32, 12), ('zcullRegionByteMultiplier', NvU32, 16), ('zcullRegionHeaderSize', NvU32, 20), ('zcullSubregionHeaderSize', NvU32, 24), ('subregionCount', NvU32, 28), ('subregionWidthAlignPixels', NvU32, 32), ('subregionHeightAlignPixels', NvU32, 36)]) +NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 320 + engineZcullInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS.register_fields([('engineZcullInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO(c.Struct): + SIZE = 12 + ropUnitCount: int + ropOperationsFactor: int + ropOperationsCount: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO.register_fields([('ropUnitCount', NvU32, 0), ('ropOperationsFactor', NvU32, 4), ('ropOperationsCount', NvU32, 8)]) +NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS(c.Struct): + SIZE = 96 + engineRopInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS.register_fields([('engineRopInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS(c.Struct): + SIZE = 48 + mask: c.Array[ctypes.c_uint32, Literal[12]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS.register_fields([('mask', c.Array[NvU32, Literal[12]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS(c.Struct): + SIZE = 384 + enginePpcMasks: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS.register_fields([('enginePpcMasks', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PPC_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO(c.Struct): + SIZE = 8 + size: int + alignment: int +struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO.register_fields([('size', NvU32, 0), ('alignment', NvU32, 4)]) +NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO(c.Struct): + SIZE = 208 + engine: c.Array[struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO, Literal[26]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO.register_fields([('engine', c.Array[NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO, Literal[26]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS(c.Struct): + SIZE = 1664 + engineContextBuffersInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS.register_fields([('engineContextBuffersInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER(c.Struct): + SIZE = 9 + imla0: int + fmla16: int + dp: int + fmla32: int + ffma: int + imla1: int + imla2: int + imla3: int + imla4: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER.register_fields([('imla0', NvU8, 0), ('fmla16', NvU8, 1), ('dp', NvU8, 2), ('fmla32', NvU8, 3), ('ffma', NvU8, 4), ('imla1', NvU8, 5), ('imla2', NvU8, 6), ('imla3', NvU8, 7), ('imla4', NvU8, 8)]) +NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS(c.Struct): + SIZE = 72 + smIssueRateModifier: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS.register_fields([('smIssueRateModifier', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS(c.Struct): + SIZE = 88 + chipSubRev: int + emulationRev1: int + isCmpSku: int + pciDeviceId: int + pciSubDeviceId: int + pciRevisionId: int + regBases: c.Array[ctypes.c_uint32, Literal[16]] +struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS.register_fields([('chipSubRev', NvU8, 0), ('emulationRev1', NvU32, 4), ('isCmpSku', NvBool, 8), ('pciDeviceId', NvU32, 12), ('pciSubDeviceId', NvU32, 16), ('pciRevisionId', NvU32, 20), ('regBases', c.Array[NvU32, Literal[16]], 24)]) +NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + bEnable: int +struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('bEnable', NvBool, 16)]) +NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + offset: int +struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('offset', NvU32, 16)]) +NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE(c.Struct): + SIZE = 4 + fecsRecordSize: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE.register_fields([('fecsRecordSize', NvU32, 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS(c.Struct): + SIZE = 32 + fecsRecordSize: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS.register_fields([('fecsRecordSize', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES(c.Struct): + SIZE = 32 + fecsRecordSize: int + timestampHiTagMask: int + timestampHiTagShift: int + timestampVMask: int + numLowerBitsZeroShift: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES.register_fields([('fecsRecordSize', NvU32, 0), ('timestampHiTagMask', NvU32, 4), ('timestampHiTagShift', NvU8, 8), ('timestampVMask', NvU64, 16), ('numLowerBitsZeroShift', NvU8, 24)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS(c.Struct): + SIZE = 256 + fecsTraceDefines: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS.register_fields([('fecsTraceDefines', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DEVICE_INFO(c.Struct): + SIZE = 48 + faultId: int + instanceId: int + typeEnum: int + resetId: int + devicePriBase: int + isEngine: int + rlEngId: int + runlistPriBase: int + groupId: int + ginTargetId: int + deviceBroadcastPriBase: int + groupLocalInstanceId: int +struct_NV2080_CTRL_INTERNAL_DEVICE_INFO.register_fields([('faultId', NvU32, 0), ('instanceId', NvU32, 4), ('typeEnum', NvU32, 8), ('resetId', NvU32, 12), ('devicePriBase', NvU32, 16), ('isEngine', NvU32, 20), ('rlEngId', NvU32, 24), ('runlistPriBase', NvU32, 28), ('groupId', NvU32, 32), ('ginTargetId', NvU32, 36), ('deviceBroadcastPriBase', NvU32, 40), ('groupLocalInstanceId', NvU32, 44)]) +NV2080_CTRL_INTERNAL_DEVICE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_DEVICE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS(c.Struct): + SIZE = 24580 + numEntries: int + deviceInfoTable: c.Array[struct_NV2080_CTRL_INTERNAL_DEVICE_INFO, Literal[512]] +struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS.register_fields([('numEntries', NvU32, 0), ('deviceInfoTable', c.Array[NV2080_CTRL_INTERNAL_DEVICE_INFO, Literal[512]], 4)]) +NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS(c.Struct): + SIZE = 8204 + userRegisterAccessMapSize: int + compressedSize: int + compressedData: c.Array[ctypes.c_ubyte, Literal[4096]] + profilingRangesSize: int + profilingRanges: c.Array[ctypes.c_ubyte, Literal[4096]] +struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS.register_fields([('userRegisterAccessMapSize', NvU32, 0), ('compressedSize', NvU32, 4), ('compressedData', c.Array[NvU8, Literal[4096]], 8), ('profilingRangesSize', NvU32, 4104), ('profilingRanges', c.Array[NvU8, Literal[4096]], 4108)]) +NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NV_RANGE(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_INTERNAL_NV_RANGE.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NV_RANGE: TypeAlias = struct_NV2080_CTRL_INTERNAL_NV_RANGE +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS(c.Struct): + SIZE = 24 + swizzId: int + memAddrRange: struct_NV2080_CTRL_INTERNAL_NV_RANGE +struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS.register_fields([('swizzId', NvU32, 0), ('memAddrRange', NV2080_CTRL_INTERNAL_NV_RANGE, 8)]) +NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS(c.Struct): + SIZE = 1 + bTeardown: int +struct_NV2080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS.register_fields([('bTeardown', NvBool, 0)]) +NV2080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS +NV2080_CTRL_INTERNAL_KGR_INIT_BUG4208224_WAR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES(c.Struct): + SIZE = 1 + bPerSubCtxheaderSupported: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES.register_fields([('bPerSubCtxheaderSupported', NvBool, 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS(c.Struct): + SIZE = 8 + pdbTable: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS.register_fields([('pdbTable', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS(c.Struct): + SIZE = 24 + instMemPhysAddr: int + instMemSize: int + instMemAddrSpace: int + instMemCpuCacheAttr: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS.register_fields([('instMemPhysAddr', NvU64, 0), ('instMemSize', NvU64, 8), ('instMemAddrSpace', NvU32, 16), ('instMemCpuCacheAttr', NvU32, 20)]) +NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS(c.Struct): + SIZE = 4 + ipVersion: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS.register_fields([('ipVersion', NvU32, 0)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS(c.Struct): + SIZE = 4 + smcMode: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS.register_fields([('smcMode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS(c.Struct): + SIZE = 16 + head: int + rgLineNum: int + intrLine: int + bEnable: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS.register_fields([('head', NvU32, 0), ('rgLineNum', NvU32, 4), ('intrLine', NvU32, 8), ('bEnable', NvBool, 12)]) +NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO(c.Struct): + SIZE = 72 + partitionFlag: int + grCount: int + gfxGrCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + validCTSIdMask: int + validGfxCTSIdMask: int +struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO.register_fields([('partitionFlag', NvU32, 0), ('grCount', NvU32, 4), ('gfxGrCount', NvU32, 8), ('gpcCount', NvU32, 12), ('virtualGpcCount', NvU32, 16), ('gfxGpcCount', NvU32, 20), ('veidCount', NvU32, 24), ('smCount', NvU32, 28), ('ceCount', NvU32, 32), ('nvEncCount', NvU32, 36), ('nvDecCount', NvU32, 40), ('nvJpgCount', NvU32, 44), ('nvOfaCount', NvU32, 48), ('validCTSIdMask', NvU64, 56), ('validGfxCTSIdMask', NvU64, 64)]) +NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS(c.Struct): + SIZE = 4328 + count: int + table: c.Array[struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO, Literal[60]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS.register_fields([('count', NvU32, 0), ('table', c.Array[NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO, Literal[60]], 8)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS(c.Struct): + SIZE = 40 + partitionableMemSize: int + bottomRsvdSize: int + topRsvdSize: int + partitionableStartAddr: int + partitionableEndAddr: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS.register_fields([('partitionableMemSize', NvU64, 0), ('bottomRsvdSize', NvU64, 8), ('topRsvdSize', NvU64, 16), ('partitionableStartAddr', NvU64, 24), ('partitionableEndAddr', NvU64, 32)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS(c.Struct): + SIZE = 32 + engineMask: c.Array[ctypes.c_uint64, Literal[4]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS.register_fields([('engineMask', c.Array[NvU64, Literal[4]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS(c.Struct): + SIZE = 4112 + rlBuffers: c.Array[c.Array[struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], Literal[64]] + runlistIdMask: int + swizzId: int +struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS.register_fields([('rlBuffers', c.Array[c.Array[NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], Literal[64]], 0), ('runlistIdMask', NvU64, 4096), ('swizzId', NvU32, 4104)]) +NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS(c.Struct): + SIZE = 492 + tegraImpImportData: struct_TEGRA_IMP_IMPORT_DATA +@c.record +class struct_TEGRA_IMP_IMPORT_DATA(c.Struct): + SIZE = 492 + max_iso_bw_kbps: int + num_dram_channels: int + num_dram_clk_entries: int + dram_clk_instance: c.Array[struct_DRAM_CLK_INSTANCE, Literal[24]] +TEGRA_IMP_IMPORT_DATA: TypeAlias = struct_TEGRA_IMP_IMPORT_DATA +@c.record +class struct_DRAM_CLK_INSTANCE(c.Struct): + SIZE = 20 + dram_clk_freq_khz: int + mchub_clk_khz: int + mc_clk_khz: int + max_iso_bw_kbps: int + switch_latency_ns: int +DRAM_CLK_INSTANCE: TypeAlias = struct_DRAM_CLK_INSTANCE +struct_DRAM_CLK_INSTANCE.register_fields([('dram_clk_freq_khz', NvU32, 0), ('mchub_clk_khz', NvU32, 4), ('mc_clk_khz', NvU32, 8), ('max_iso_bw_kbps', NvU32, 12), ('switch_latency_ns', NvU32, 16)]) +struct_TEGRA_IMP_IMPORT_DATA.register_fields([('max_iso_bw_kbps', NvU32, 0), ('num_dram_channels', NvU32, 4), ('num_dram_clk_entries', NvU32, 8), ('dram_clk_instance', c.Array[DRAM_CLK_INSTANCE, Literal[24]], 12)]) +struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS.register_fields([('tegraImpImportData', TEGRA_IMP_IMPORT_DATA, 0)]) +NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS(c.Struct): + SIZE = 6 + pciDeviceId: int + pciSubDeviceId: int + iseGPUBridge: int + approvedBusType: int +struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS.register_fields([('pciDeviceId', NvU16, 0), ('pciSubDeviceId', NvU16, 2), ('iseGPUBridge', NvBool, 4), ('approvedBusType', NvU8, 5)]) +NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS(c.Struct): + SIZE = 48 + local2Remote: int + remote2Local: int + localP2PDomainRemoteAddr: int + remoteP2PDomainLocalAddr: int + remoteWMBoxLocalAddr: int + p2pWmbTag: int + bNeedWarBug999673: int +struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS.register_fields([('local2Remote', NvU32, 0), ('remote2Local', NvU32, 4), ('localP2PDomainRemoteAddr', NvU64, 8), ('remoteP2PDomainLocalAddr', NvU64, 16), ('remoteWMBoxLocalAddr', NvU64, 24), ('p2pWmbTag', NvU64, 32), ('bNeedWarBug999673', NvBool, 40)]) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS(c.Struct): + SIZE = 40 + local2Remote: int + remote2Local: int + localP2PDomainRemoteAddr: int + remoteP2PDomainLocalAddr: int + remoteWMBoxAddrU64: int + p2pWmbTag: int +struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS.register_fields([('local2Remote', NvU32, 0), ('remote2Local', NvU32, 4), ('localP2PDomainRemoteAddr', NvU64, 8), ('remoteP2PDomainLocalAddr', NvU64, 16), ('remoteWMBoxAddrU64', NvU64, 24), ('p2pWmbTag', NvU64, 32)]) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS(c.Struct): + SIZE = 8 + peerIdx: int + bNeedWarBug999673: int +struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS.register_fields([('peerIdx', NvU32, 0), ('bNeedWarBug999673', NvBool, 4)]) +NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS(c.Struct): + SIZE = 4 + peerId: int +struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS.register_fields([('peerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS(c.Struct): + SIZE = 4 + peerId: int +struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS.register_fields([('peerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS(c.Struct): + SIZE = 2056 + gfid: int + numEntries: int + gpaEntries: c.Array[ctypes.c_uint64, Literal[128]] + spaEntries: c.Array[ctypes.c_uint64, Literal[128]] +struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS.register_fields([('gfid', NvU32, 0), ('numEntries', NvU32, 4), ('gpaEntries', c.Array[NvU64, Literal[128]], 8), ('spaEntries', c.Array[NvU64, Literal[128]], 1032)]) +NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS(c.Struct): + SIZE = 56 + addressSpace: int + physicalAddr: int + limit: int + cacheSnoop: int + hclass: int + channelInstance: int + valid: int + pbTargetAperture: int + channelPBSize: int + subDeviceId: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS.register_fields([('addressSpace', NvU32, 0), ('physicalAddr', NvU64, 8), ('limit', NvU64, 16), ('cacheSnoop', NvU32, 24), ('hclass', NvU32, 28), ('channelInstance', NvU32, 32), ('valid', NvBool, 36), ('pbTargetAperture', NvU32, 40), ('channelPBSize', NvU32, 44), ('subDeviceId', NvU32, 48)]) +NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 16 + replayableFaultBufferSize: int + replayableShadowFaultBufferMetadataSize: int + nonReplayableFaultBufferSize: int + nonReplayableShadowFaultBufferMetadataSize: int +struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS.register_fields([('replayableFaultBufferSize', NvU32, 0), ('replayableShadowFaultBufferMetadataSize', NvU32, 4), ('nonReplayableFaultBufferSize', NvU32, 8), ('nonReplayableShadowFaultBufferMetadataSize', NvU32, 12)]) +NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_CTXSW_MODES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS(c.Struct): + SIZE = 8 + moduleIndex: int + size: int +struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS.register_fields([('moduleIndex', NvU32, 0), ('size', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS +enum_NV2080_INTR_CATEGORY: dict[int, str] = {(NV2080_INTR_CATEGORY_DEFAULT:=0): 'NV2080_INTR_CATEGORY_DEFAULT', (NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE:=1): 'NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE', (NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE_NOTIFICATION:=2): 'NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE_NOTIFICATION', (NV2080_INTR_CATEGORY_RUNLIST:=3): 'NV2080_INTR_CATEGORY_RUNLIST', (NV2080_INTR_CATEGORY_RUNLIST_NOTIFICATION:=4): 'NV2080_INTR_CATEGORY_RUNLIST_NOTIFICATION', (NV2080_INTR_CATEGORY_UVM_OWNED:=5): 'NV2080_INTR_CATEGORY_UVM_OWNED', (NV2080_INTR_CATEGORY_UVM_SHARED:=6): 'NV2080_INTR_CATEGORY_UVM_SHARED', (NV2080_INTR_CATEGORY_ENUM_COUNT:=7): 'NV2080_INTR_CATEGORY_ENUM_COUNT'} +NV2080_INTR_CATEGORY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_INTR_CATEGORY_SUBTREE_MAP(c.Struct): + SIZE = 2 + subtreeStart: int + subtreeEnd: int +struct_NV2080_INTR_CATEGORY_SUBTREE_MAP.register_fields([('subtreeStart', NvU8, 0), ('subtreeEnd', NvU8, 1)]) +NV2080_INTR_CATEGORY_SUBTREE_MAP: TypeAlias = struct_NV2080_INTR_CATEGORY_SUBTREE_MAP +@c.record +class struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY(c.Struct): + SIZE = 16 + engineIdx: int + pmcIntrMask: int + vectorStall: int + vectorNonStall: int +struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY.register_fields([('engineIdx', NvU16, 0), ('pmcIntrMask', NvU32, 4), ('vectorStall', NvU32, 8), ('vectorNonStall', NvU32, 12)]) +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY: TypeAlias = struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY +@c.record +class struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS(c.Struct): + SIZE = 2068 + tableLen: int + table: c.Array[struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY, Literal[128]] + subtreeMap: c.Array[struct_NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]] +struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS.register_fields([('tableLen', NvU32, 0), ('table', c.Array[NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY, Literal[128]], 4), ('subtreeMap', c.Array[NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]], 2052)]) +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS(c.Struct): + SIZE = 1 + bReservation: int +struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS.register_fields([('bReservation', NvBool, 0)]) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS(c.Struct): + SIZE = 3 + bReservation: int + bClientHandlesGrGating: int + bRmHandlesIdleSlow: int +struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS.register_fields([('bReservation', NvBool, 0), ('bClientHandlesGrGating', NvBool, 1), ('bRmHandlesIdleSlow', NvBool, 2)]) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS(c.Struct): + SIZE = 8 + displayMask: int + numHeads: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS.register_fields([('displayMask', NvU32, 0), ('numHeads', NvU32, 4)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS(c.Struct): + SIZE = 240 + fbMemPageRanges: c.Array[struct_NV2080_CTRL_INTERNAL_NV_RANGE, Literal[15]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS.register_fields([('fbMemPageRanges', c.Array[NV2080_CTRL_INTERNAL_NV_RANGE, Literal[15]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS(c.Struct): + SIZE = 8 + runlistId: int + numChannels: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS.register_fields([('runlistId', NvU32, 0), ('numChannels', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS(c.Struct): + SIZE = 32 + memBoundaryCfgA: int + memBoundaryCfgB: int + memBoundaryCfgC: int + memBoundaryCfg: int + memBoundaryCfgValInit: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS.register_fields([('memBoundaryCfgA', NvU64, 0), ('memBoundaryCfgB', NvU64, 8), ('memBoundaryCfgC', NvU32, 16), ('memBoundaryCfg', NvU32, 20), ('memBoundaryCfgValInit', NvU32, 24)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS +NV2080_CTRL_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS(c.Struct): + SIZE = 32 + data: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS.register_fields([('data', c.Array[NvU32, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X(c.Struct): + SIZE = 8 + flags: int + duration: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X.register_fields([('flags', NvBool, 0), ('duration', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bActivate: int +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS.register_fields([('bActivate', NvBool, 0)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS(c.Struct): + SIZE = 16 + flags: int + bBridgeless: int + currLimits: c.Array[ctypes.c_uint32, Literal[2]] +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS.register_fields([('flags', NvU32, 0), ('bBridgeless', NvBool, 4), ('currLimits', c.Array[NvU32, Literal[2]], 8)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + hysteresisus: int + bHystersisEnable: int + bSliGpuBoostSyncEnable: int +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS.register_fields([('hysteresisus', NvU64, 0), ('bHystersisEnable', NvBool, 8), ('bSliGpuBoostSyncEnable', NvBool, 9)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 2064 + hClient: int + hObject: int + faultBufferSize: int + faultBufferPteArray: c.Array[ctypes.c_uint64, Literal[256]] +struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('faultBufferSize', NvU32, 8), ('faultBufferPteArray', c.Array[NvU64, Literal[256]], 16)]) +NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 24032 + shadowFaultBufferQueuePhysAddr: int + shadowFaultBufferSize: int + shadowFaultBufferMetadataSize: int + shadowFaultBufferPteArray: c.Array[ctypes.c_uint64, Literal[3000]] + shadowFaultBufferType: int + faultBufferSharedMemoryPhysAddr: int +struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS.register_fields([('shadowFaultBufferQueuePhysAddr', NvU64, 0), ('shadowFaultBufferSize', NvU32, 8), ('shadowFaultBufferMetadataSize', NvU32, 12), ('shadowFaultBufferPteArray', c.Array[NvU64, Literal[3000]], 16), ('shadowFaultBufferType', NvU32, 24016), ('faultBufferSharedMemoryPhysAddr', NvU64, 24024)]) +NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 4 + shadowFaultBufferType: int +struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS.register_fields([('shadowFaultBufferType', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS(c.Struct): + SIZE = 184 + PdeCopyParams: struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS +struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS.register_fields([('PdeCopyParams', NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS, 0)]) +NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X(c.Struct): + SIZE = 16 + flags: int + boostDuration: int + gfId: int + bOverrideInfinite: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X.register_fields([('flags', NvU32, 0), ('boostDuration', NvU32, 4), ('gfId', NvU32, 8), ('bOverrideInfinite', NvBool, 12)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X(c.Struct): + SIZE = 8 + bIsCudaClient: int + gfId: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X.register_fields([('bIsCudaClient', NvBool, 0), ('gfId', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X +@c.record +class struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO(c.Struct): + SIZE = 28 + skylineVgpcSize: c.Array[ctypes.c_ubyte, Literal[12]] + singletonVgpcMask: int + maxInstances: int + computeSizeFlag: int + numNonSingletonVgpcs: int +struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO.register_fields([('skylineVgpcSize', c.Array[NvU8, Literal[12]], 0), ('singletonVgpcMask', NvU32, 12), ('maxInstances', NvU32, 16), ('computeSizeFlag', NvU32, 20), ('numNonSingletonVgpcs', NvU32, 24)]) +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS(c.Struct): + SIZE = 228 + skylineTable: c.Array[struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO, Literal[8]] + validEntries: int +struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS.register_fields([('skylineTable', c.Array[NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO, Literal[8]], 0), ('validEntries', NvU32, 224)]) +NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_SET_PARTITIONING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_SET_GPU_INSTANCES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_GET_GPU_INSTANCES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS(c.Struct): + SIZE = 1 + bZbcSurfacesExist: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS.register_fields([('bZbcSurfacesExist', NvBool, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO(c.Struct): + SIZE = 56 + enginesMask: c.Array[ctypes.c_uint64, Literal[4]] + partitionFlags: int + gpcMask: int + virtualGpcCount: int + veidOffset: int + veidCount: int +struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO.register_fields([('enginesMask', c.Array[NvU64, Literal[4]], 0), ('partitionFlags', NvU32, 32), ('gpcMask', NvU32, 36), ('virtualGpcCount', NvU32, 40), ('veidOffset', NvU32, 44), ('veidCount', NvU32, 48)]) +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS(c.Struct): + SIZE = 80 + swizzId: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] + info: struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO +struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS.register_fields([('swizzId', NvU32, 0), ('uuid', c.Array[NvU8, Literal[16]], 4), ('info', NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO, 24)]) +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 4 + bPcieGen4Capable: int + bIsC2CLinkUp: int + bIsDeviceMultiFunction: int + bGcxPmuCfgSpaceRestore: int +struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS.register_fields([('bPcieGen4Capable', NvBool, 0), ('bIsC2CLinkUp', NvBool, 1), ('bIsDeviceMultiFunction', NvBool, 2), ('bGcxPmuCfgSpaceRestore', NvBool, 3)]) +NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS(c.Struct): + SIZE = 12 + programPeerMask: int + invalidatePeerMask: int + programPciePeerMask: int +struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS.register_fields([('programPeerMask', NvU32, 0), ('invalidatePeerMask', NvU32, 4), ('programPciePeerMask', NvU32, 8)]) +NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS(c.Struct): + SIZE = 36 + linkMask: int + hshubIds: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS.register_fields([('linkMask', NvU32, 0), ('hshubIds', c.Array[NvU8, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS(c.Struct): + SIZE = 4 + numHshubs: int +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS.register_fields([('numHshubs', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS(c.Struct): + SIZE = 1 + hshubId: int +struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS.register_fields([('hshubId', NvU8, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS(c.Struct): + SIZE = 4 + egmPeerId: int +struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS.register_fields([('egmPeerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS(c.Struct): + SIZE = 16 + bGet: int + addr: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS.register_fields([('bGet', NvBool, 0), ('addr', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS(c.Struct): + SIZE = 2 + bCyaMaskL1: int + bEnableAspmDtL1: int +struct_NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS.register_fields([('bCyaMaskL1', NvBool, 0), ('bEnableAspmDtL1', NvBool, 1)]) +NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS(c.Struct): + SIZE = 1 + maxActiveVGpuVMCount: int +struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS.register_fields([('maxActiveVGpuVMCount', NvU8, 0)]) +NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS(c.Struct): + SIZE = 1 + bRawMode: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS.register_fields([('bRawMode', NvBool, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS(c.Struct): + SIZE = 4 + ccuSampleSize: int +struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS.register_fields([('ccuSampleSize', NvU32, 0)]) +NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO(c.Struct): + SIZE = 16 + phyAddr: int + shrBufSize: int + cntBlkSize: int +struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO.register_fields([('phyAddr', NvU64, 0), ('shrBufSize', NvU32, 8), ('cntBlkSize', NvU32, 12)]) +NV2080_CTRL_INTERNAL_CCU_MAP_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS(c.Struct): + SIZE = 144 + mapInfo: c.Array[struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO, Literal[9]] +struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS.register_fields([('mapInfo', c.Array[NV2080_CTRL_INTERNAL_CCU_MAP_INFO, Literal[9]], 0)]) +NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS(c.Struct): + SIZE = 2 + bDevShrBuf: int + bMigShrBuf: int +struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS.register_fields([('bDevShrBuf', NvBool, 0), ('bMigShrBuf', NvBool, 1)]) +NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO(c.Struct): + SIZE = 40 + gpuId: int + gpuInstance: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerId: int + busEgmPeerId: int +struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO.register_fields([('gpuId', NvU32, 0), ('gpuInstance', NvU32, 4), ('p2pCaps', NvU32, 8), ('p2pOptimalReadCEs', NvU32, 12), ('p2pOptimalWriteCEs', NvU32, 16), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 20), ('busPeerId', NvU32, 32), ('busEgmPeerId', NvU32, 36)]) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 1284 + peerGpuCount: int + peerGpuInfos: c.Array[struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO, Literal[32]] +struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS.register_fields([('peerGpuCount', NvU32, 0), ('peerGpuInfos', c.Array[NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS(c.Struct): + SIZE = 132 + peerGpuIdCount: int + peerGpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS.register_fields([('peerGpuIdCount', NvU32, 0), ('peerGpuIds', c.Array[NvU32, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS(c.Struct): + SIZE = 3 + bCommonPciSwitchFound: int + p2pReadCapsStatus: int + p2pWriteCapsStatus: int +struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS.register_fields([('bCommonPciSwitchFound', NvBool, 0), ('p2pReadCapsStatus', NvU8, 1), ('p2pWriteCapsStatus', NvU8, 2)]) +NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS(c.Struct): + SIZE = 1 + enableRo: int +struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS.register_fields([('enableRo', NvBool, 0)]) +NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS(c.Struct): + SIZE = 3 + bSave: int + bUseVbios: int + bReturnEarly: int +struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS.register_fields([('bSave', NvBool, 0), ('bUseVbios', NvBool, 1), ('bReturnEarly', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS(c.Struct): + SIZE = 3 + bSave: int + bUseVbios: int + bVbiosCallSuccessful: int +struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS.register_fields([('bSave', NvBool, 0), ('bUseVbios', NvBool, 1), ('bVbiosCallSuccessful', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE(c.Struct): + SIZE = 24 + computeSize: int + gfxGpcCount: int + gpcCount: int + veidCount: int + smCount: int + physicalSlots: int +struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE.register_fields([('computeSize', NvU8, 0), ('gfxGpcCount', NvU32, 4), ('gpcCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16), ('physicalSlots', NvU32, 20)]) +NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS(c.Struct): + SIZE = 196 + profileCount: int + profiles: c.Array[struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS.register_fields([('profileCount', NvU32, 0), ('profiles', c.Array[NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE, Literal[8]], 4)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS(c.Struct): + SIZE = 1 + bStreamState: int +struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS.register_fields([('bStreamState', NvBool, 0)]) +NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS(c.Struct): + SIZE = 1 + bExtDevFound: int +struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS.register_fields([('bExtDevFound', NvBool, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS(c.Struct): + SIZE = 96 + timingParameters: struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS +@c.record +class struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS(c.Struct): + SIZE = 96 + gpuId: int + output: int + protocol: int + structure: int + adjust: int + hDeltaStep: int + hDeltaMax: int + vDeltaStep: int + vDeltaMax: int + hSyncEnd: int + hBlankEnd: int + hBlankStart: int + hTotal: int + vSyncEnd: int + vBlankEnd: int + vBlankStart: int + vInterlacedBlankEnd: int + vInterlacedBlankStart: int + vTotal: int + refreshX10K: int + pixelClockHz: int + bOptimized: int +NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS: TypeAlias = struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS +struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS.register_fields([('gpuId', NvU32, 0), ('output', NvU32, 4), ('protocol', NvU32, 8), ('structure', NvU32, 12), ('adjust', NvU32, 16), ('hDeltaStep', NvU32, 20), ('hDeltaMax', NvU32, 24), ('vDeltaStep', NvU32, 28), ('vDeltaMax', NvU32, 32), ('hSyncEnd', NvU32, 36), ('hBlankEnd', NvU32, 40), ('hBlankStart', NvU32, 44), ('hTotal', NvU32, 48), ('vSyncEnd', NvU32, 52), ('vBlankEnd', NvU32, 56), ('vBlankStart', NvU32, 60), ('vInterlacedBlankEnd', NvU32, 64), ('vInterlacedBlankStart', NvU32, 68), ('vTotal', NvU32, 72), ('refreshX10K', NvU32, 76), ('pixelClockHz', NvU64, 80), ('bOptimized', NvBool, 88)]) +struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS.register_fields([('timingParameters', NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS(c.Struct): + SIZE = 16 + displayIds: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS.register_fields([('displayIds', c.Array[NvU32, Literal[4]], 0)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS(c.Struct): + SIZE = 52 + slave: c.Array[ctypes.c_uint32, Literal[4]] + localSlave: c.Array[ctypes.c_uint32, Literal[4]] + master: c.Array[ctypes.c_uint32, Literal[4]] + regStatus: int +struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS.register_fields([('slave', c.Array[NvU32, Literal[4]], 0), ('localSlave', c.Array[NvU32, Literal[4]], 16), ('master', c.Array[NvU32, Literal[4]], 32), ('regStatus', NvU32, 48)]) +NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS(c.Struct): + SIZE = 8 + headIdx: int + vActiveLines: int +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS.register_fields([('headIdx', NvU32, 0), ('vActiveLines', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS(c.Struct): + SIZE = 8 + displays: int + displayId: int +struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS.register_fields([('displays', NvU32, 0), ('displayId', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS(c.Struct): + SIZE = 8 + bEnableMaster: int + bRasterSyncGpioSaved: int + bRasterSyncGpioDirection: int +struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS.register_fields([('bEnableMaster', NvBool, 0), ('bRasterSyncGpioSaved', NvBool, 1), ('bRasterSyncGpioDirection', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS(c.Struct): + SIZE = 24 + hClient: int + hSysMem: int + bEnteringGcoffState: int + sysmemAddrOfSuspendResumeData: int +struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS.register_fields([('hClient', NvHandle, 0), ('hSysMem', NvHandle, 4), ('bEnteringGcoffState', NvBool, 8), ('sysmemAddrOfSuspendResumeData', NvU64, 16)]) +NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS(c.Struct): + SIZE = 1 + bDisableActiveChannels: int +struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS.register_fields([('bDisableActiveChannels', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS(c.Struct): + SIZE = 16 + hostReservedFb: int + vgpuTypeId: int +struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS.register_fields([('hostReservedFb', NvU64, 0), ('vgpuTypeId', NvU32, 8)]) +NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS(c.Struct): + SIZE = 4104 + status: int + backLightDataSize: int + backLightData: c.Array[ctypes.c_ubyte, Literal[4096]] +struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS.register_fields([('status', NvU32, 0), ('backLightDataSize', NvU16, 4), ('backLightData', c.Array[NvU8, Literal[4096]], 6)]) +NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS(c.Struct): + SIZE = 4 + numActiveLinksPerIoctrl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS.register_fields([('numActiveLinksPerIoctrl', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS(c.Struct): + SIZE = 4 + numLinksPerIoctrl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS.register_fields([('numLinksPerIoctrl', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS(c.Struct): + SIZE = 2 + bIsSysCtrlSupported: int + bIsPlatformLegacy: int +struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS.register_fields([('bIsSysCtrlSupported', NvBool, 0), ('bIsPlatformLegacy', NvBool, 1)]) +NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI(c.Struct): + SIZE = 8 + sensorId: int + limit: int +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI.register_fields([('sensorId', NvU32, 0), ('limit', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA(c.Struct): + SIZE = 12 + type: int + data: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data(c.Struct): + SIZE = 8 + smbpbi: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data.register_fields([('smbpbi', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI, 0)]) +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA.register_fields([('type', NvU8, 0), ('data', struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS(c.Struct): + SIZE = 16 + flags: int + syncData: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS.register_fields([('flags', NvU8, 0), ('syncData', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +NV2080_CTRL_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +NV2080_CTRL_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS(c.Struct): + SIZE = 2 + flag: int + bStatus: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS.register_fields([('flag', NvU8, 0), ('bStatus', NvBool, 1)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS(c.Struct): + SIZE = 8 + bEnable: int + clientLimit: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS.register_fields([('bEnable', NvBool, 0), ('clientLimit', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS(c.Struct): + SIZE = 4 + targetTemp: int +struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS.register_fields([('targetTemp', NvS32, 0)]) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS(c.Struct): + SIZE = 4 + ctgpOffsetmW: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS.register_fields([('ctgpOffsetmW', NvU32, 0)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS(c.Struct): + SIZE = 8 + bVpsPs20Supported: int + vPstateIdxHighest: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS.register_fields([('bVpsPs20Supported', NvBool, 0), ('vPstateIdxHighest', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS(c.Struct): + SIZE = 8 + pStateIdx: int + vPstateIdxMapping: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS.register_fields([('pStateIdx', NvU32, 0), ('vPstateIdxMapping', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS(c.Struct): + SIZE = 4 + vPstateIdx: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS.register_fields([('vPstateIdx', NvU32, 0)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS(c.Struct): + SIZE = 2 + bIsGC6Satisfied: int + bIsGCOFFSatisfied: int +struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS.register_fields([('bIsGC6Satisfied', NvBool, 0), ('bIsGCOFFSatisfied', NvBool, 1)]) +NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 8 + maxSec2SecureChannels: int + maxCeSecureChannels: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS.register_fields([('maxSec2SecureChannels', NvU32, 0), ('maxCeSecureChannels', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS(c.Struct): + SIZE = 24 + pinSetIn: int + pinSetOut: int + bMasterScanLock: int + masterScanLockPin: int + bSlaveScanLock: int + slaveScanLockPin: int +struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS.register_fields([('pinSetIn', NvU32, 0), ('pinSetOut', NvU32, 4), ('bMasterScanLock', NvBool, 8), ('masterScanLockPin', NvU32, 12), ('bSlaveScanLock', NvBool, 16), ('slaveScanLockPin', NvU32, 20)]) +NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS(c.Struct): + SIZE = 16 + pinSet: int + gpioFunction: int + gpioPin: int + gpioDirection: int +struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS.register_fields([('pinSet', NvU32, 0), ('gpioFunction', NvU32, 4), ('gpioPin', NvU32, 8), ('gpioDirection', NvBool, 12)]) +NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_EDID_DATA(c.Struct): + SIZE = 524 + status: int + acpiId: int + bufferSize: int + edidBuffer: c.Array[ctypes.c_ubyte, Literal[512]] +struct_NV2080_CTRL_INTERNAL_EDID_DATA.register_fields([('status', NvU32, 0), ('acpiId', NvU32, 4), ('bufferSize', NvU32, 8), ('edidBuffer', c.Array[NvU8, Literal[512]], 12)]) +NV2080_CTRL_INTERNAL_EDID_DATA: TypeAlias = struct_NV2080_CTRL_INTERNAL_EDID_DATA +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS(c.Struct): + SIZE = 8388 + tableLen: int + edidTable: c.Array[struct_NV2080_CTRL_INTERNAL_EDID_DATA, Literal[16]] +struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS.register_fields([('tableLen', NvU32, 0), ('edidTable', c.Array[NV2080_CTRL_INTERNAL_EDID_DATA, Literal[16]], 4)]) +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 8 + numProbes: int +struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('numProbes', NvU64, 0)]) +NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 2 + bwMode: int + bLocalEgmEnabled: int +struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('bwMode', NvU8, 0), ('bLocalEgmEnabled', NvBool, 1)]) +NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 1 + bwMode: int +struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('bwMode', NvU8, 0)]) +NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 2 + bIsBar1Trusted: int + bIsPcieTrusted: int +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS.register_fields([('bIsBar1Trusted', NvBool, 0), ('bIsPcieTrusted', NvBool, 1)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK(c.Struct): + SIZE = 12 + ivMask: c.Array[ctypes.c_uint32, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK.register_fields([('ivMask', c.Array[NvU32, Literal[3]], 0)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS(c.Struct): + SIZE = 40 + engineId: int + ivMaskSet: c.Array[struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS.register_fields([('engineId', NvU32, 0), ('ivMaskSet', c.Array[NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[3]], 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS(c.Struct): + SIZE = 76 + engineId: int + ivMaskSet: c.Array[struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[6]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS.register_fields([('engineId', NvU32, 0), ('ivMaskSet', c.Array[NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[6]], 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS(c.Struct): + SIZE = 28 + globalH2DKey: int + updatedEncryptIVMask: c.Array[ctypes.c_uint32, Literal[3]] + updatedDecryptIVMask: c.Array[ctypes.c_uint32, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS.register_fields([('globalH2DKey', NvU32, 0), ('updatedEncryptIVMask', c.Array[NvU32, Literal[3]], 4), ('updatedDecryptIVMask', c.Array[NvU32, Literal[3]], 16)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS(c.Struct): + SIZE = 8 + exceptionType: int + globalH2DKey: int +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS.register_fields([('exceptionType', NvU32, 0), ('globalH2DKey', NvU32, 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS(c.Struct): + SIZE = 8 + attackerAdvantage: int +struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS.register_fields([('attackerAdvantage', NvU64, 0)]) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS(c.Struct): + SIZE = 1 + logicalUprocId: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS.register_fields([('logicalUprocId', NvU8, 0)]) +NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS +enum_NV2080_CTRL_MEMMGR_MEMORY_OP: dict[int, str] = {(NV2080_CTRL_MEMMGR_MEMORY_OP_MEMCPY:=0): 'NV2080_CTRL_MEMMGR_MEMORY_OP_MEMCPY', (NV2080_CTRL_MEMMGR_MEMORY_OP_MEMSET:=1): 'NV2080_CTRL_MEMMGR_MEMORY_OP_MEMSET'} +NV2080_CTRL_MEMMGR_MEMORY_OP: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO(c.Struct): + SIZE = 32 + baseAddr: int + size: int + offset: int + aperture: int + cpuCacheAttrib: int +struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO.register_fields([('baseAddr', NvU64, 0), ('size', NvU64, 8), ('offset', NvU64, 16), ('aperture', NvU32, 24), ('cpuCacheAttrib', NvU32, 28)]) +NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS(c.Struct): + SIZE = 96 + src: struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO + authTag: c.Array[ctypes.c_ubyte, Literal[16]] + dst: struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO + transferSize: int + value: int + memop: int +struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS.register_fields([('src', NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO, 0), ('authTag', c.Array[NvU8, Literal[16]], 32), ('dst', NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO, 48), ('transferSize', NvU64, 80), ('value', NvU32, 88), ('memop', NV2080_CTRL_MEMMGR_MEMORY_OP, 92)]) +NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS(c.Struct): + SIZE = 24 + addrSysPhys: int + addrWidth: int + mask: int + maskWidth: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS.register_fields([('addrSysPhys', NvU64, 0), ('addrWidth', NvU32, 8), ('mask', NvU32, 12), ('maskWidth', NvU32, 16)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS(c.Struct): + SIZE = 32 + peerId: int + addrSysPhys: int + addrWidth: int + mask: int + maskWidth: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS.register_fields([('peerId', NvU32, 0), ('addrSysPhys', NvU64, 8), ('addrWidth', NvU32, 16), ('mask', NvU32, 20), ('maskWidth', NvU32, 24)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS(c.Struct): + SIZE = 24 + limitMin: int + limitRated: int + limitMax: int + limitCurr: int + limitBattRated: int + limitBattMax: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS.register_fields([('limitMin', NvU32, 0), ('limitRated', NvU32, 4), ('limitMax', NvU32, 8), ('limitCurr', NvU32, 12), ('limitBattRated', NvU32, 16), ('limitBattMax', NvU32, 20)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS(c.Struct): + SIZE = 8 + physAddr: int +struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS.register_fields([('physAddr', NvU64, 0)]) +NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS(c.Struct): + SIZE = 16 + polledDataMask: int + pollFrequencyMs: int +struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS.register_fields([('polledDataMask', NvU64, 0), ('pollFrequencyMs', NvU32, 8)]) +NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS(c.Struct): + SIZE = 32 + tracepointMask: int + bufferAddr: int + bufferSize: int + bufferWatermark: int + flag: int +struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS.register_fields([('tracepointMask', NvU64, 0), ('bufferAddr', NvU64, 8), ('bufferSize', NvU32, 16), ('bufferWatermark', NvU32, 20), ('flag', NvU8, 24)]) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS(c.Struct): + SIZE = 3 + bMaxwellSec2Enabled: int + bNv95A1TsecEnabled: int + bHopperSec2WorkLaunchAEnabled: int +struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS.register_fields([('bMaxwellSec2Enabled', NvBool, 0), ('bNv95A1TsecEnabled', NvBool, 1), ('bHopperSec2WorkLaunchAEnabled', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS +NV2080_CTRL_INTERNAL_GR_CTXSW_SETUP_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS(c.Struct): + SIZE = 8 + bInPMTransition: int + newPMLevel: int +struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS.register_fields([('bInPMTransition', NvBool, 0), ('newPMLevel', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS(c.Struct): + SIZE = 1 + bSuccessful: int +struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS.register_fields([('bSuccessful', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS(c.Struct): + SIZE = 8 + freeHeapSize: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS.register_fields([('freeHeapSize', NvU64, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS(c.Struct): + SIZE = 8 + attribute: int + value: int +struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS.register_fields([('attribute', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS(c.Struct): + SIZE = 1 + bApplyStereoPinAlwaysHiWar: int +struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS.register_fields([('bApplyStereoPinAlwaysHiWar', NvBool, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS(c.Struct): + SIZE = 4 + maxHshubs: int +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS.register_fields([('maxHshubs', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS(c.Struct): + SIZE = 4 + rasterSyncDecodeMode: int +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS.register_fields([('rasterSyncDecodeMode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS(c.Struct): + SIZE = 8 + spaValue: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS.register_fields([('spaValue', NvU64, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 8 + peerMask: int + bEnable: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0), ('bEnable', NvBool, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS(c.Struct): + SIZE = 28 + seedData: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS.register_fields([('seedData', c.Array[NvU32, Literal[7]], 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS(c.Struct): + SIZE = 8 + remoteDeviceType: int + ipVerDlPl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS.register_fields([('remoteDeviceType', NvU32, 0), ('ipVerDlPl', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS(c.Struct): + SIZE = 28 + seedData: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS.register_fields([('seedData', c.Array[NvU32, Literal[7]], 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO(c.Struct): + SIZE = 24 + remoteSid: int + remoteDeviceType: int + remoteLinkId: int + localSid: int +struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO.register_fields([('remoteSid', NvU64, 0), ('remoteDeviceType', NvU32, 8), ('remoteLinkId', NvU32, 12), ('localSid', NvU64, 16)]) +NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS(c.Struct): + SIZE = 32 + bInitnegotiateConfigGood: int + remoteLocalSidInfo: struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS.register_fields([('bInitnegotiateConfigGood', NvBool, 0), ('remoteLocalSidInfo', NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS(c.Struct): + SIZE = 1 + bPollDone: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS.register_fields([('bPollDone', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS(c.Struct): + SIZE = 48 + mode: int + bSync: int + linkMode: int + linkModeParams: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams(c.Struct): + SIZE = 32 + linkModeOffParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS + linkModePreHsParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS + linkModeInitPhase1Params: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS + linkModePostInitNegotiateParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS + linkModePostInitOptimizeParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams.register_fields([('linkModeOffParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS, 0), ('linkModePreHsParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS, 0), ('linkModeInitPhase1Params', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS, 0), ('linkModePostInitNegotiateParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS, 0), ('linkModePostInitOptimizeParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS, 0)]) +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8), ('linkMode', NvU32, 12), ('linkModeParams', struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams, 16)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 8 + sublinkMode: int + sublinkSubMode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS.register_fields([('sublinkMode', NvU32, 0), ('sublinkSubMode', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS(c.Struct): + SIZE = 4 + laneRxdetStatusMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS.register_fields([('laneRxdetStatusMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS(c.Struct): + SIZE = 1 + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS.register_fields([('bSync', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS(c.Struct): + SIZE = 16 + ipVerDlPl: int + token: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS.register_fields([('ipVerDlPl', NvU32, 0), ('token', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS(c.Struct): + SIZE = 1 + bUnlocked: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS.register_fields([('bUnlocked', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE(c.Struct): + SIZE = 56 + type: int + callbackParams: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams(c.Struct): + SIZE = 48 + getDlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS + setDlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS + getTlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS + setTlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS + getTxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS + setTxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS + getRxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS + setRxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS + getRxSublinkDetect: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS + setRxSublinkDetect: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS + writeDiscoveryToken: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS + readDiscoveryToken: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS + getUphyLoad: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams.register_fields([('getDlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS, 0), ('setDlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS, 0), ('getTlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS, 0), ('setTlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS, 0), ('getTxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS, 0), ('setTxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS, 0), ('getRxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS, 0), ('setRxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS, 0), ('getRxSublinkDetect', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS, 0), ('setRxSublinkDetect', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS, 0), ('writeDiscoveryToken', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS, 0), ('readDiscoveryToken', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS, 0), ('getUphyLoad', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS, 0)]) +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE.register_fields([('type', NvU8, 0), ('callbackParams', struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS(c.Struct): + SIZE = 64 + linkId: int + callbackType: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE +struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS.register_fields([('linkId', NvU32, 0), ('callbackType', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS(c.Struct): + SIZE = 32 + linkId: int + remoteLocalSidInfo: struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS.register_fields([('linkId', NvU32, 0), ('remoteLocalSidInfo', NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS(c.Struct): + SIZE = 1 + bEnableAli: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS.register_fields([('bEnableAli', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS(c.Struct): + SIZE = 8 + updateType: int + bSysMem: int + peerMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS.register_fields([('updateType', NvBool, 0), ('bSysMem', NvBool, 1), ('peerMask', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 12 + peerId: int + peerLinkMask: int + bEgmPeer: int + bNvswitchConn: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS.register_fields([('peerId', NvU32, 0), ('peerLinkMask', NvU32, 4), ('bEgmPeer', NvBool, 8), ('bNvswitchConn', NvBool, 9)]) +NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 4 + peerMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS(c.Struct): + SIZE = 92 + xid: int + message: c.Array[ctypes.c_ubyte, Literal[81]] + len: int +struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS.register_fields([('xid', NvU32, 0), ('message', c.Array[NvU8, Literal[81]], 4), ('len', NvU32, 88)]) +NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS(c.Struct): + SIZE = 12 + mapTypeMask: int + peerMask: int + bL2Entry: int +struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS.register_fields([('mapTypeMask', NvU32, 0), ('peerMask', NvU32, 4), ('bL2Entry', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS(c.Struct): + SIZE = 8 + bSave: int + linkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS.register_fields([('bSave', NvBool, 0), ('linkMask', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS(c.Struct): + SIZE = 12 + flags: int + bSysmem: int + peerLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS.register_fields([('flags', NvU32, 0), ('bSysmem', NvBool, 4), ('peerLinkMask', NvU32, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bNvlinkSysmemEnabled: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS.register_fields([('bNvlinkSysmemEnabled', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS(c.Struct): + SIZE = 8 + gpuInst: int + peerLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS.register_fields([('gpuInst', NvU32, 0), ('peerLinkMask', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS(c.Struct): + SIZE = 40 + remoteDeviceType: int + remoteChipSid: int + linkId: int + laneRxdetStatusMask: int + remoteLinkNumber: int + remotePciDeviceId: int + remoteDomain: int + remoteBus: int + remoteDevice: int + remoteFunction: int + bConnected: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS.register_fields([('remoteDeviceType', NvU64, 0), ('remoteChipSid', NvU64, 8), ('linkId', NvU32, 16), ('laneRxdetStatusMask', NvU32, 20), ('remoteLinkNumber', NvU32, 24), ('remotePciDeviceId', NvU32, 28), ('remoteDomain', NvU32, 32), ('remoteBus', NvU8, 36), ('remoteDevice', NvU8, 37), ('remoteFunction', NvU8, 38), ('bConnected', NvBool, 39)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + initializedLinks: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS.register_fields([('linkMask', NvU32, 0), ('initializedLinks', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS.register_fields([('linkMask', NvU32, 0), ('bSync', NvBool, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS(c.Struct): + SIZE = 264 + postRxDetLinkMask: int + laneRxdetStatusMask: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS.register_fields([('postRxDetLinkMask', NvU64, 0), ('laneRxdetStatusMask', c.Array[NvU32, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS.register_fields([('linkMask', NvU32, 0), ('bSync', NvBool, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES(c.Struct): + SIZE = 16 + bValid: int + linkId: int + ioctrlId: int + pllMasterLinkId: int + pllSlaveLinkId: int + ipVerDlPl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES.register_fields([('bValid', NvBool, 0), ('linkId', NvU8, 1), ('ioctrlId', NvU32, 4), ('pllMasterLinkId', NvU8, 8), ('pllSlaveLinkId', NvU8, 9), ('ipVerDlPl', NvU32, 12)]) +NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 1056 + ioctrlMask: int + ioctrlNumEntries: int + ioctrlSize: int + discoveredLinks: int + ipVerNvlink: int + linkInfo: c.Array[struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS.register_fields([('ioctrlMask', NvU32, 0), ('ioctrlNumEntries', NvU8, 4), ('ioctrlSize', NvU32, 8), ('discoveredLinks', NvU64, 16), ('ipVerNvlink', NvU32, 24), ('linkInfo', c.Array[NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES, Literal[64]], 28)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES(c.Struct): + SIZE = 8 + ipVerIoctrl: int + ipVerMinion: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES.register_fields([('ipVerIoctrl', NvU32, 0), ('ipVerMinion', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 32 + ioctrlIdx: int + PublicId: int + localDiscoveredLinks: int + localGlobalLinkOffset: int + ioctrlDiscoverySize: int + numDevices: int + ipRevisions: struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS.register_fields([('ioctrlIdx', NvU32, 0), ('PublicId', NvU32, 4), ('localDiscoveredLinks', NvU32, 8), ('localGlobalLinkOffset', NvU32, 12), ('ioctrlDiscoverySize', NvU32, 16), ('numDevices', NvU8, 20), ('ipRevisions', NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES, 24)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS(c.Struct): + SIZE = 12 + bPlatformLinerateDefined: int + platformLineRate: int + nvlinkLinkSpeed: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS.register_fields([('bPlatformLinerateDefined', NvBool, 0), ('platformLineRate', NvU32, 4), ('nvlinkLinkSpeed', NvU32, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS(c.Struct): + SIZE = 72 + linkMask: int + bActiveOnly: int + bIsLinkActive: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS.register_fields([('linkMask', NvU32, 0), ('bActiveOnly', NvBool, 4), ('bIsLinkActive', c.Array[NvBool, Literal[64]], 5)]) +NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + flags: int +struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS.register_fields([('linkMask', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS(c.Struct): + SIZE = 4 + linkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS.register_fields([('linkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES(c.Struct): + SIZE = 56 + bLinkConnectedToSystem: int + bLinkConnectedToPeer: int + bLinkReset: int + subLinkWidth: int + linkState: int + txSublinkState: int + rxSublinkState: int + bLaneReversal: int + nvlinkLinkClockKHz: int + nvlinkLineRateMbps: int + nvlinkLinkClockMhz: int + nvlinkLinkDataRateKiBps: int + nvlinkRefClkType: int + nvlinkReqLinkClockMhz: int + nvlinkMinL1Threshold: int + nvlinkMaxL1Threshold: int + nvlinkL1ThresholdUnits: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES.register_fields([('bLinkConnectedToSystem', NvBool, 0), ('bLinkConnectedToPeer', NvBool, 1), ('bLinkReset', NvBool, 2), ('subLinkWidth', NvU8, 3), ('linkState', NvU32, 4), ('txSublinkState', NvU32, 8), ('rxSublinkState', NvU32, 12), ('bLaneReversal', NvBool, 16), ('nvlinkLinkClockKHz', NvU32, 20), ('nvlinkLineRateMbps', NvU32, 24), ('nvlinkLinkClockMhz', NvU32, 28), ('nvlinkLinkDataRateKiBps', NvU32, 32), ('nvlinkRefClkType', NvU8, 36), ('nvlinkReqLinkClockMhz', NvU32, 40), ('nvlinkMinL1Threshold', NvU32, 44), ('nvlinkMaxL1Threshold', NvU32, 48), ('nvlinkL1ThresholdUnits', NvU32, 52)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS(c.Struct): + SIZE = 3600 + linkMask: int + nvlinkRefClkSpeedKHz: int + bSublinkStateInst: int + linkInfo: c.Array[struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS.register_fields([('linkMask', NvU64, 0), ('nvlinkRefClkSpeedKHz', NvU32, 8), ('bSublinkStateInst', NvBool, 12), ('linkInfo', c.Array[NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES, Literal[64]], 16)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS(c.Struct): + SIZE = 4 + sysmemLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS.register_fields([('sysmemLinkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS(c.Struct): + SIZE = 264 + bLegacyForcedConfig: int + bOverrideComputePeerMode: int + phase: int + linkConnection: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS.register_fields([('bLegacyForcedConfig', NvBool, 0), ('bOverrideComputePeerMode', NvBool, 1), ('phase', NvU32, 4), ('linkConnection', c.Array[NvU32, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS(c.Struct): + SIZE = 1 + bLaneShutdownOnUnload: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS.register_fields([('bLaneShutdownOnUnload', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS(c.Struct): + SIZE = 4 + notUsed: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS.register_fields([('notUsed', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS(c.Struct): + SIZE = 4 + sysmemLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS.register_fields([('sysmemLinkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS(c.Struct): + SIZE = 4 + ctrlParamVal: int +struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS.register_fields([('ctrlParamVal', NvU32, 0)]) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS(c.Struct): + SIZE = 4 + responseVal: int +struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS.register_fields([('responseVal', NvU32, 0)]) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS +@c.record +class struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS(c.Struct): + SIZE = 16 + architecture: int + implementation: int + revision: int + subRevision: int +struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS.register_fields([('architecture', NvU32, 0), ('implementation', NvU32, 4), ('revision', NvU32, 8), ('subRevision', NvU8, 12)]) +NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS(c.Struct): + SIZE = 4 + engines: int +struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS.register_fields([('engines', NvU32, 0)]) +NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS +@c.record +class struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS(c.Struct): + SIZE = 4 + manufacturer: int +struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS.register_fields([('manufacturer', NvU32, 0)]) +NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS +@c.record +class struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS(c.Struct): + SIZE = 1 + bOwnedByRm: int +struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS.register_fields([('bOwnedByRm', NvBool, 0)]) +NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS +@c.record +class struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY(c.Struct): + SIZE = 8 + nv2080EngineType: int + notificationIntrVector: int +struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY.register_fields([('nv2080EngineType', NvU32, 0), ('notificationIntrVector', NvU32, 4)]) +NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY: TypeAlias = struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY +@c.record +class struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS(c.Struct): + SIZE = 2052 + numEntries: int + entries: c.Array[struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY, Literal[256]] +struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS.register_fields([('numEntries', NvU32, 0), ('entries', c.Array[NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY, Literal[256]], 4)]) +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS +@c.record +class struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY(c.Struct): + SIZE = 16 + nv2080IntrType: int + pmcIntrMask: int + intrVectorStall: int + intrVectorNonStall: int +struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY.register_fields([('nv2080IntrType', NvU32, 0), ('pmcIntrMask', NvU32, 4), ('intrVectorStall', NvU32, 8), ('intrVectorNonStall', NvU32, 12)]) +NV2080_CTRL_MC_STATIC_INTR_ENTRY: TypeAlias = struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY +@c.record +class struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS(c.Struct): + SIZE = 516 + numEntries: int + entries: c.Array[struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY, Literal[32]] +struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS.register_fields([('numEntries', NvU32, 0), ('entries', c.Array[NV2080_CTRL_MC_STATIC_INTR_ENTRY, Literal[32]], 4)]) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS(c.Struct): + SIZE = 8 + component: int + size: int +struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS.register_fields([('component', NvU32, 0), ('size', NvU32, 4)]) +NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS(c.Struct): + SIZE = 16 + pBuffer: ctypes.c_void_p + component: int + size: int +struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS.register_fields([('pBuffer', NvP64, 0), ('component', NvU32, 8), ('size', NvU32, 12)]) +NV2080_CTRL_NVD_GET_DUMP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS +@c.record +class struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS(c.Struct): + SIZE = 32 + userMinOffset: int + userMaxOffset: int + factoryMinOffset: int + factoryMaxOffset: int + lastActiveClock: int + lastActiveVolt: int + lastActivePoint: int + kappa: int +struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS.register_fields([('userMinOffset', NvS32, 0), ('userMaxOffset', NvS32, 4), ('factoryMinOffset', NvU32, 8), ('factoryMaxOffset', NvU32, 12), ('lastActiveClock', NvU32, 16), ('lastActiveVolt', NvU32, 20), ('lastActivePoint', NvU32, 24), ('kappa', NvU32, 28)]) +NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS: TypeAlias = struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS +@c.record +class struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG(c.Struct): + SIZE = 72 + pstateVer: int + gpcOverclock: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS + mclkOverclock: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS + bUserOverclocked: int + bFactoryOverclocked: int +struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG.register_fields([('pstateVer', NvU32, 0), ('gpcOverclock', NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS, 4), ('mclkOverclock', NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS, 36), ('bUserOverclocked', NvBool, 68), ('bFactoryOverclocked', NvBool, 69)]) +NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG: TypeAlias = struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG +@c.record +class struct_NV2080_NOCAT_JOURNAL_GPU_STATE(c.Struct): + SIZE = 240 + bValid: int + strap: int + deviceId: int + vendorId: int + subsystemVendor: int + subsystemId: int + revision: int + type: int + vbiosVersion: int + bOptimus: int + bMsHybrid: int + bFullPower: int + vbiosOemVersion: int + memoryType: int + tag: c.Array[ctypes.c_ubyte, Literal[65]] + vbiosProject: c.Array[ctypes.c_ubyte, Literal[65]] + bInFullchipReset: int + bInSecBusReset: int + bInGc6Reset: int + overclockCfg: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG +struct_NV2080_NOCAT_JOURNAL_GPU_STATE.register_fields([('bValid', NvBool, 0), ('strap', NvU32, 4), ('deviceId', NvU16, 8), ('vendorId', NvU16, 10), ('subsystemVendor', NvU16, 12), ('subsystemId', NvU16, 14), ('revision', NvU16, 16), ('type', NvU16, 18), ('vbiosVersion', NvU32, 20), ('bOptimus', NvBool, 24), ('bMsHybrid', NvBool, 25), ('bFullPower', NvBool, 26), ('vbiosOemVersion', NvU32, 28), ('memoryType', NvU16, 32), ('tag', c.Array[NvU8, Literal[65]], 34), ('vbiosProject', c.Array[NvU8, Literal[65]], 99), ('bInFullchipReset', NvBool, 164), ('bInSecBusReset', NvBool, 165), ('bInGc6Reset', NvBool, 166), ('overclockCfg', NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG, 168)]) +NV2080_NOCAT_JOURNAL_GPU_STATE: TypeAlias = struct_NV2080_NOCAT_JOURNAL_GPU_STATE +@c.record +class struct_NV2080_NOCAT_JOURNAL_ENTRY(c.Struct): + SIZE = 1272 + recType: int + bugcheck: int + tdrBucketId: int + source: c.Array[ctypes.c_ubyte, Literal[65]] + subsystem: int + errorCode: int + diagBufferLen: int + diagBuffer: c.Array[ctypes.c_ubyte, Literal[1024]] + faultingEngine: c.Array[ctypes.c_ubyte, Literal[65]] + mmuFaultType: int + mmuErrorSrc: int + tdrReason: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080_NOCAT_JOURNAL_ENTRY.register_fields([('recType', NvU8, 0), ('bugcheck', NvU32, 4), ('tdrBucketId', NvU32, 8), ('source', c.Array[NvU8, Literal[65]], 12), ('subsystem', NvU32, 80), ('errorCode', NvU64, 88), ('diagBufferLen', NvU32, 96), ('diagBuffer', c.Array[NvU8, Literal[1024]], 100), ('faultingEngine', c.Array[NvU8, Literal[65]], 1124), ('mmuFaultType', NvU32, 1192), ('mmuErrorSrc', NvU32, 1196), ('tdrReason', c.Array[NvU8, Literal[65]], 1200)]) +NV2080_NOCAT_JOURNAL_ENTRY: TypeAlias = struct_NV2080_NOCAT_JOURNAL_ENTRY +@c.record +class struct_NV2080_NOCAT_JOURNAL_RECORD(c.Struct): + SIZE = 1544 + GPUTag: int + loadAddress: int + timeStamp: int + stateMask: int + nocatGpuState: struct_NV2080_NOCAT_JOURNAL_GPU_STATE + nocatJournalEntry: struct_NV2080_NOCAT_JOURNAL_ENTRY +struct_NV2080_NOCAT_JOURNAL_RECORD.register_fields([('GPUTag', NvU32, 0), ('loadAddress', NvU64, 8), ('timeStamp', NvU64, 16), ('stateMask', NvU64, 24), ('nocatGpuState', NV2080_NOCAT_JOURNAL_GPU_STATE, 32), ('nocatJournalEntry', NV2080_NOCAT_JOURNAL_ENTRY, 272)]) +NV2080_NOCAT_JOURNAL_RECORD: TypeAlias = struct_NV2080_NOCAT_JOURNAL_RECORD +@c.record +class struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS(c.Struct): + SIZE = 15656 + flags: int + nocatRecordCount: int + nocatOutstandingRecordCount: int + journalRecords: c.Array[struct_NV2080_NOCAT_JOURNAL_RECORD, Literal[10]] + activityCounters: c.Array[ctypes.c_uint32, Literal[32]] + reserved: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS.register_fields([('flags', NvU32, 0), ('nocatRecordCount', NvU32, 4), ('nocatOutstandingRecordCount', NvU32, 8), ('journalRecords', c.Array[NV2080_NOCAT_JOURNAL_RECORD, Literal[10]], 16), ('activityCounters', c.Array[NvU32, Literal[32]], 15456), ('reserved', c.Array[NvU8, Literal[65]], 15584)]) +NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS +@c.record +class struct_NV2080CtrlNocatJournalDataTdrReason(c.Struct): + SIZE = 96 + flags: int + source: c.Array[ctypes.c_ubyte, Literal[65]] + subsystem: int + errorCode: int + reasonCode: int +struct_NV2080CtrlNocatJournalDataTdrReason.register_fields([('flags', NvU32, 0), ('source', c.Array[NvU8, Literal[65]], 4), ('subsystem', NvU32, 72), ('errorCode', NvU64, 80), ('reasonCode', NvU32, 88)]) +NV2080CtrlNocatJournalDataTdrReason: TypeAlias = struct_NV2080CtrlNocatJournalDataTdrReason +@c.record +class struct_NV2080CtrlNocatJournalSetTag(c.Struct): + SIZE = 72 + flags: int + tag: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080CtrlNocatJournalSetTag.register_fields([('flags', NvU32, 0), ('tag', c.Array[NvU8, Literal[65]], 4)]) +NV2080CtrlNocatJournalSetTag: TypeAlias = struct_NV2080CtrlNocatJournalSetTag +@c.record +class struct_NV2080CtrlNocatJournalRclog(c.Struct): + SIZE = 92 + flags: int + rclogSize: int + rmGpuId: int + APIType: int + contextType: int + exceptType: int + processImageName: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080CtrlNocatJournalRclog.register_fields([('flags', NvU32, 0), ('rclogSize', NvU32, 4), ('rmGpuId', NvU32, 8), ('APIType', NvU32, 12), ('contextType', NvU32, 16), ('exceptType', NvU32, 20), ('processImageName', c.Array[NvU8, Literal[65]], 24)]) +NV2080CtrlNocatJournalRclog: TypeAlias = struct_NV2080CtrlNocatJournalRclog +@c.record +class struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS(c.Struct): + SIZE = 104 + dataType: int + targetRecordType: int + nocatJournalData: struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData +@c.record +class struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData(c.Struct): + SIZE = 96 + tdrReason: struct_NV2080CtrlNocatJournalDataTdrReason + tagData: struct_NV2080CtrlNocatJournalSetTag + rclog: struct_NV2080CtrlNocatJournalRclog +struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData.register_fields([('tdrReason', NV2080CtrlNocatJournalDataTdrReason, 0), ('tagData', NV2080CtrlNocatJournalSetTag, 0), ('rclog', NV2080CtrlNocatJournalRclog, 0)]) +struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS.register_fields([('dataType', NvU32, 0), ('targetRecordType', NvU32, 4), ('nocatJournalData', struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData, 8)]) +NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS +@c.record +class struct_NV2080CtrlNocatJournalInsertRecord(c.Struct): + SIZE = 1208 + flags: int + timestamp: int + recType: int + bugcheck: int + source: c.Array[ctypes.c_char, Literal[65]] + subsystem: int + errorCode: int + faultingEngine: c.Array[ctypes.c_char, Literal[65]] + tdrReason: int + diagBufferLen: int + diagBuffer: c.Array[ctypes.c_ubyte, Literal[1024]] +struct_NV2080CtrlNocatJournalInsertRecord.register_fields([('flags', NvU32, 0), ('timestamp', NvU64, 8), ('recType', NvU8, 16), ('bugcheck', NvU32, 20), ('source', c.Array[ctypes.c_char, Literal[65]], 24), ('subsystem', NvU32, 92), ('errorCode', NvU64, 96), ('faultingEngine', c.Array[ctypes.c_char, Literal[65]], 104), ('tdrReason', NvU32, 172), ('diagBufferLen', NvU32, 176), ('diagBuffer', c.Array[NvU8, Literal[1024]], 180)]) +NV2080CtrlNocatJournalInsertRecord: TypeAlias = struct_NV2080CtrlNocatJournalInsertRecord +@c.record +class struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS(c.Struct): + SIZE = 1208 + nocatJournalRecord: struct_NV2080CtrlNocatJournalInsertRecord +struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS.register_fields([('nocatJournalRecord', NV2080CtrlNocatJournalInsertRecord, 0)]) +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS(c.Struct): + SIZE = 32 + capsTbl: int + lowestNvlinkVersion: int + highestNvlinkVersion: int + lowestNciVersion: int + highestNciVersion: int + discoveredLinkMask: int + enabledLinkMask: int + discoveredLinks: int + enabledLinks: int +struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS.register_fields([('capsTbl', NvU32, 0), ('lowestNvlinkVersion', NvU8, 4), ('highestNvlinkVersion', NvU8, 5), ('lowestNciVersion', NvU8, 6), ('highestNciVersion', NvU8, 7), ('discoveredLinkMask', NvU32, 8), ('enabledLinkMask', NvU32, 12), ('discoveredLinks', NvU64, 16), ('enabledLinks', NvU64, 24)]) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_DEVICE_INFO(c.Struct): + SIZE = 56 + deviceIdFlags: int + domain: int + bus: int + device: int + function: int + pciDeviceId: int + deviceType: int + deviceUUID: c.Array[ctypes.c_ubyte, Literal[16]] + fabricRecoveryStatusMask: int +struct_NV2080_CTRL_NVLINK_DEVICE_INFO.register_fields([('deviceIdFlags', NvU32, 0), ('domain', NvU32, 4), ('bus', NvU16, 8), ('device', NvU16, 10), ('function', NvU16, 12), ('pciDeviceId', NvU32, 16), ('deviceType', NvU64, 24), ('deviceUUID', c.Array[NvU8, Literal[16]], 32), ('fabricRecoveryStatusMask', NvU32, 48)]) +NV2080_CTRL_NVLINK_DEVICE_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_DEVICE_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO(c.Struct): + SIZE = 208 + capsTbl: int + phyType: int + subLinkWidth: int + linkState: int + rxSublinkStatus: int + txSublinkStatus: int + bLaneReversal: int + nvlinkVersion: int + nciVersion: int + phyVersion: int + nvlinkLinkClockKHz: int + nvlinkCommonClockSpeedKHz: int + nvlinkRefClkSpeedKHz: int + nvlinkCommonClockSpeedMhz: int + nvlinkLineRateMbps: int + nvlinkLinkClockMhz: int + nvlinkRefClkType: int + nvlinkLinkDataRateKiBps: int + nvlinkRefClkSpeedMhz: int + connected: int + loopProperty: int + remoteDeviceLinkNumber: int + localDeviceLinkNumber: int + remoteLinkSid: int + localLinkSid: int + laneRxdetStatusMask: int + nvlinkMinL1Threshold: int + nvlinkMaxL1Threshold: int + nvlinkL1ThresholdUnits: int + remoteDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO + localDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO +struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO.register_fields([('capsTbl', NvU32, 0), ('phyType', NvU8, 4), ('subLinkWidth', NvU8, 5), ('linkState', NvU32, 8), ('rxSublinkStatus', NvU8, 12), ('txSublinkStatus', NvU8, 13), ('bLaneReversal', NvBool, 14), ('nvlinkVersion', NvU8, 15), ('nciVersion', NvU8, 16), ('phyVersion', NvU8, 17), ('nvlinkLinkClockKHz', NvU32, 20), ('nvlinkCommonClockSpeedKHz', NvU32, 24), ('nvlinkRefClkSpeedKHz', NvU32, 28), ('nvlinkCommonClockSpeedMhz', NvU32, 32), ('nvlinkLineRateMbps', NvU32, 36), ('nvlinkLinkClockMhz', NvU32, 40), ('nvlinkRefClkType', NvU8, 44), ('nvlinkLinkDataRateKiBps', NvU32, 48), ('nvlinkRefClkSpeedMhz', NvU32, 52), ('connected', NvBool, 56), ('loopProperty', NvU8, 57), ('remoteDeviceLinkNumber', NvU8, 58), ('localDeviceLinkNumber', NvU8, 59), ('remoteLinkSid', NvU64, 64), ('localLinkSid', NvU64, 72), ('laneRxdetStatusMask', NvU32, 80), ('nvlinkMinL1Threshold', NvU32, 84), ('nvlinkMaxL1Threshold', NvU32, 88), ('nvlinkL1ThresholdUnits', NvU32, 92), ('remoteDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 96), ('localDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 152)]) +NV2080_CTRL_NVLINK_LINK_STATUS_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO +enum_NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT: dict[int, str] = {(NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_100US:=0): 'NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_100US', (NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_50US:=1): 'NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_50US'} +NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS(c.Struct): + SIZE = 13320 + enabledLinkMask: int + bSublinkStateInst: int + linkInfo: c.Array[struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO, Literal[64]] +struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS.register_fields([('enabledLinkMask', NvU32, 0), ('bSublinkStateInst', NvBool, 4), ('linkInfo', c.Array[NV2080_CTRL_NVLINK_LINK_STATUS_INFO, Literal[64]], 8)]) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_ERR_INFO(c.Struct): + SIZE = 112 + TLErrlog: int + TLIntrEn: int + TLCTxErrStatus0: int + TLCTxErrStatus1: int + TLCTxSysErrStatus0: int + TLCRxErrStatus0: int + TLCRxErrStatus1: int + TLCRxSysErrStatus0: int + TLCTxErrLogEn0: int + TLCTxErrLogEn1: int + TLCTxSysErrLogEn0: int + TLCRxErrLogEn0: int + TLCRxErrLogEn1: int + TLCRxSysErrLogEn0: int + MIFTxErrStatus0: int + MIFRxErrStatus0: int + NVLIPTLnkErrStatus0: int + NVLIPTLnkErrLogEn0: int + NVLIPTLnkCtrlLinkStateRequest: int + DLSpeedStatusTx: int + DLSpeedStatusRx: int + NVLDLRxSlsmErrCntl: int + NVLDLTopLinkState: int + NVLDLTopIntr: int + DLStatMN00: int + DLStatUC01: int + MinionNvlinkLinkIntr: int + bExcessErrorDL: int +struct_NV2080_CTRL_NVLINK_ERR_INFO.register_fields([('TLErrlog', NvU32, 0), ('TLIntrEn', NvU32, 4), ('TLCTxErrStatus0', NvU32, 8), ('TLCTxErrStatus1', NvU32, 12), ('TLCTxSysErrStatus0', NvU32, 16), ('TLCRxErrStatus0', NvU32, 20), ('TLCRxErrStatus1', NvU32, 24), ('TLCRxSysErrStatus0', NvU32, 28), ('TLCTxErrLogEn0', NvU32, 32), ('TLCTxErrLogEn1', NvU32, 36), ('TLCTxSysErrLogEn0', NvU32, 40), ('TLCRxErrLogEn0', NvU32, 44), ('TLCRxErrLogEn1', NvU32, 48), ('TLCRxSysErrLogEn0', NvU32, 52), ('MIFTxErrStatus0', NvU32, 56), ('MIFRxErrStatus0', NvU32, 60), ('NVLIPTLnkErrStatus0', NvU32, 64), ('NVLIPTLnkErrLogEn0', NvU32, 68), ('NVLIPTLnkCtrlLinkStateRequest', NvU32, 72), ('DLSpeedStatusTx', NvU32, 76), ('DLSpeedStatusRx', NvU32, 80), ('NVLDLRxSlsmErrCntl', NvU32, 84), ('NVLDLTopLinkState', NvU32, 88), ('NVLDLTopIntr', NvU32, 92), ('DLStatMN00', NvU32, 96), ('DLStatUC01', NvU32, 100), ('MinionNvlinkLinkIntr', NvU32, 104), ('bExcessErrorDL', NvBool, 108)]) +NV2080_CTRL_NVLINK_ERR_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_ERR_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO(c.Struct): + SIZE = 8 + NVLIPTErrStatus0: int + NVLIPTErrLogEn0: int +struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO.register_fields([('NVLIPTErrStatus0', NvU32, 0), ('NVLIPTErrLogEn0', NvU32, 4)]) +NV2080_CTRL_NVLINK_COMMON_ERR_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS(c.Struct): + SIZE = 7204 + linkMask: int + linkErrInfo: c.Array[struct_NV2080_CTRL_NVLINK_ERR_INFO, Literal[64]] + ioctrlMask: int + commonErrInfo: c.Array[struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO, Literal[3]] + ErrInfoFlags: int +struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS.register_fields([('linkMask', NvU32, 0), ('linkErrInfo', c.Array[NV2080_CTRL_NVLINK_ERR_INFO, Literal[64]], 4), ('ioctrlMask', NvU32, 7172), ('commonErrInfo', c.Array[NV2080_CTRL_NVLINK_COMMON_ERR_INFO, Literal[3]], 7176), ('ErrInfoFlags', NvU8, 7200)]) +NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES(c.Struct): + SIZE = 264 + bTx0TlCounterOverflow: int + bTx1TlCounterOverflow: int + bRx0TlCounterOverflow: int + bRx1TlCounterOverflow: int + value: c.Array[ctypes.c_uint64, Literal[32]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES.register_fields([('bTx0TlCounterOverflow', NvBool, 0), ('bTx1TlCounterOverflow', NvBool, 1), ('bRx0TlCounterOverflow', NvBool, 2), ('bRx1TlCounterOverflow', NvBool, 3), ('value', c.Array[NvU64, Literal[32]], 8)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS(c.Struct): + SIZE = 16912 + counterMask: int + linkMask: int + counters: c.Array[struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS.register_fields([('counterMask', NvU32, 0), ('linkMask', NvU64, 8), ('counters', c.Array[NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES, Literal[64]], 16)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterMask: int + linkMask: int +struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS.register_fields([('counterMask', NvU32, 0), ('linkMask', NvU64, 8)]) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES(c.Struct): + SIZE = 16 + overFlow: int + value: int +struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES.register_fields([('overFlow', NvBool, 0), ('value', NvU64, 8)]) +NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS(c.Struct): + SIZE = 28696 + linkMask: int + counterMask: c.Array[ctypes.c_uint64, Literal[2]] + counter: c.Array[c.Array[struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES, Literal[28]], Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS.register_fields([('linkMask', NvU64, 0), ('counterMask', c.Array[NvU64, Literal[2]], 8), ('counter', c.Array[c.Array[NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES, Literal[28]], Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS(c.Struct): + SIZE = 24 + linkMask: int + counterMask: c.Array[ctypes.c_uint64, Literal[2]] +struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS.register_fields([('linkMask', NvU64, 0), ('counterMask', c.Array[NvU64, Literal[2]], 8)]) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + bFatalError: int +struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS.register_fields([('linkMask', NvU32, 0), ('bFatalError', NvBool, 4)]) +NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS +enum_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE: dict[int, str] = {(NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_TX_ERR:=1): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_TX_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_PKT_ERR:=2): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_PKT_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_AUTH_TAG_ERR:=3): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_AUTH_TAG_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_LINK_ERR:=4): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_LINK_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_MAX:=5): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_MAX'} +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG(c.Struct): + SIZE = 16 + errType: int + errSettings: int +struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG.register_fields([('errType', NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE, 0), ('errSettings', NvU64, 8)]) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG: TypeAlias = struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG +@c.record +class struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS(c.Struct): + SIZE = 1032 + linkMask: int + errCfg: c.Array[struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG, Literal[64]] +struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS.register_fields([('linkMask', NvU64, 0), ('errCfg', c.Array[NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG, Literal[64]], 8)]) +NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO(c.Struct): + SIZE = 20 + txErrInfo: int + packetErrInfo: int + authErrInfo: int + linkStatus: int + errInjectStatus: int +struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO.register_fields([('txErrInfo', NvU32, 0), ('packetErrInfo', NvU32, 4), ('authErrInfo', NvU32, 8), ('linkStatus', NvU32, 12), ('errInjectStatus', NvU32, 16)]) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS(c.Struct): + SIZE = 1288 + linkMask: int + errInfo: c.Array[struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS.register_fields([('linkMask', NvU64, 0), ('errInfo', c.Array[NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO, Literal[64]], 8)]) +NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS(c.Struct): + SIZE = 260 + linkMask: int + numRecoveries: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS.register_fields([('linkMask', NvU32, 0), ('numRecoveries', c.Array[NvU32, Literal[64]], 4)]) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + remoteType: int +struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS.register_fields([('linkId', NvU32, 0), ('remoteType', NvU32, 4)]) +NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS(c.Struct): + SIZE = 80 + linkId: int + supportedCounts: int + fatalErrorCounts: c.Array[ctypes.c_ubyte, Literal[63]] +struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS.register_fields([('linkId', NvU32, 0), ('supportedCounts', NvU64, 8), ('fatalErrorCounts', c.Array[NvU8, Literal[63]], 16)]) +NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE(c.Struct): + SIZE = 8 + errorsPerMinute: int + timestamp: int +struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE.register_fields([('errorsPerMinute', NvU32, 0), ('timestamp', NvU32, 4)]) +NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE: TypeAlias = struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS(c.Struct): + SIZE = 92 + linkId: int + numDailyMaxNonfatalErrorRates: int + dailyMaxNonfatalErrorRates: c.Array[struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]] + numMonthlyMaxNonfatalErrorRates: int + monthlyMaxNonfatalErrorRates: c.Array[struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]] +struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS.register_fields([('linkId', NvU32, 0), ('numDailyMaxNonfatalErrorRates', NvU32, 4), ('dailyMaxNonfatalErrorRates', c.Array[NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]], 8), ('numMonthlyMaxNonfatalErrorRates', NvU32, 48), ('monthlyMaxNonfatalErrorRates', c.Array[NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]], 52)]) +NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS(c.Struct): + SIZE = 1 + bEnabled: int +struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS.register_fields([('bEnabled', NvBool, 0)]) +NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS(c.Struct): + SIZE = 8 + linkId: int + params: int +struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS.register_fields([('linkId', NvU8, 0), ('params', NvU32, 4)]) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + powerState: int +struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS.register_fields([('linkMask', NvU32, 0), ('powerState', NvU32, 4)]) +NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + powerState: int +struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS.register_fields([('linkId', NvU32, 0), ('powerState', NvU32, 4)]) +NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS +enum_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE: dict[int, str] = {(TLC_RX_LNK:=0): 'TLC_RX_LNK', (TLC_TX_SYS:=1): 'TLC_TX_SYS'} +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE: dict[int, str] = {(TX_SYS_TX_RSP_STATUS_HW_ERR:=0): 'TX_SYS_TX_RSP_STATUS_HW_ERR', (TX_SYS_TX_RSP_STATUS_UR_ERR:=1): 'TX_SYS_TX_RSP_STATUS_UR_ERR', (TX_SYS_TX_RSP_STATUS_PRIV_ERR:=2): 'TX_SYS_TX_RSP_STATUS_PRIV_ERR'} +NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE: dict[int, str] = {(RX_LNK_RX_RSP_STATUS_HW_ERR:=0): 'RX_LNK_RX_RSP_STATUS_HW_ERR', (RX_LNK_RX_RSP_STATUS_UR_ERR:=1): 'RX_LNK_RX_RSP_STATUS_UR_ERR', (RX_LNK_RX_RSP_STATUS_PRIV_ERR:=2): 'RX_LNK_RX_RSP_STATUS_PRIV_ERR'} +NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE(c.Struct): + SIZE = 4 + txSysErrorType: int + rxLnkErrorType: int +union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE.register_fields([('txSysErrorType', NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE, 0), ('rxLnkErrorType', NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE, 0)]) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE: TypeAlias = union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS(c.Struct): + SIZE = 16 + linkId: int + device: int + bBroadcast: int + errorType: union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE +struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS.register_fields([('linkId', NvU32, 0), ('device', NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE, 4), ('bBroadcast', NvBool, 8), ('errorType', NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE, 12)]) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS(c.Struct): + SIZE = 16 + linkId: int + numLanes: int + figureOfMeritValues: c.Array[ctypes.c_uint16, Literal[4]] +struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS.register_fields([('linkId', NvU32, 0), ('numLanes', NvU8, 4), ('figureOfMeritValues', c.Array[NvU16, Literal[4]], 6)]) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 8 + peerMask: int + bEnable: int +struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0), ('bEnable', NvBool, 4)]) +NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS(c.Struct): + SIZE = 8 + linkId: int + lane: int + addr: int + phyConfigData: int +struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS.register_fields([('linkId', NvU8, 0), ('lane', NvU8, 1), ('addr', NvU16, 2), ('phyConfigData', NvU32, 4)]) +NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_LANE_ERROR(c.Struct): + SIZE = 12 + bValid: int + eccErrorValue: int + overflowed: int +struct_NV2080_CTRL_NVLINK_LANE_ERROR.register_fields([('bValid', NvBool, 0), ('eccErrorValue', NvU32, 4), ('overflowed', NvBool, 8)]) +NV2080_CTRL_NVLINK_LANE_ERROR: TypeAlias = struct_NV2080_CTRL_NVLINK_LANE_ERROR +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR(c.Struct): + SIZE = 56 + errorLane: c.Array[struct_NV2080_CTRL_NVLINK_LANE_ERROR, Literal[4]] + eccDecFailed: int + eccDecFailedOverflowed: int +struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR.register_fields([('errorLane', c.Array[NV2080_CTRL_NVLINK_LANE_ERROR, Literal[4]], 0), ('eccDecFailed', NvU32, 48), ('eccDecFailedOverflowed', NvBool, 52)]) +NV2080_CTRL_NVLINK_LINK_ECC_ERROR: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR +@c.record +class struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS(c.Struct): + SIZE = 3588 + linkMask: int + errorLink: c.Array[struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS.register_fields([('linkMask', NvU32, 0), ('errorLink', c.Array[NV2080_CTRL_NVLINK_LINK_ECC_ERROR, Literal[64]], 4)]) +NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES(c.Struct): + SIZE = 32 + value: c.Array[ctypes.c_uint64, Literal[4]] +struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES.register_fields([('value', c.Array[NvU64, Literal[4]], 0)]) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS(c.Struct): + SIZE = 2064 + counterMask: int + linkMask: int + counters: c.Array[struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES, Literal[64]] +struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS.register_fields([('counterMask', NvU16, 0), ('linkMask', NvU64, 8), ('counters', c.Array[NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES, Literal[64]], 16)]) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS(c.Struct): + SIZE = 1 + bLockPowerMode: int +struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS.register_fields([('bLockPowerMode', NvBool, 0)]) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS(c.Struct): + SIZE = 72 + linkId: int + counterValidMask: int + counterValues: c.Array[ctypes.c_uint32, Literal[16]] +struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS.register_fields([('linkId', NvU32, 0), ('counterValidMask', NvU32, 4), ('counterValues', c.Array[NvU32, Literal[16]], 8)]) +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + loopbackMode: int +struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS.register_fields([('linkId', NvU32, 0), ('loopbackMode', NvU8, 4)]) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO(c.Struct): + SIZE = 6 + bValid: int + passCount: int + failCount: int +struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO.register_fields([('bValid', NvBool, 0), ('passCount', NvU16, 2), ('failCount', NvU16, 4)]) +NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS(c.Struct): + SIZE = 196 + linkMask: int + refreshCount: c.Array[struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO, Literal[32]] +struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS.register_fields([('linkMask', NvU32, 0), ('refreshCount', c.Array[NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO, Literal[32]], 4)]) +NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + linkMask: int +struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS.register_fields([('linkMask', NvU32, 0)]) +NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS(c.Struct): + SIZE = 16 + bGet: int + addr: int +struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS.register_fields([('bGet', NvBool, 0), ('addr', NvU64, 8)]) +NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS(c.Struct): + SIZE = 48 + discoveredLinks: int + connectedLinksMask: int + bridgeSensableLinks: int + bridgedLinks: int + initDisabledLinksMask: int + vbiosDisabledLinkMask: int + initializedLinks: int + bEnableTrainingAtLoad: int + bEnableSafeModeAtLoad: int +struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS.register_fields([('discoveredLinks', NvU64, 0), ('connectedLinksMask', NvU32, 8), ('bridgeSensableLinks', NvU64, 16), ('bridgedLinks', NvU32, 24), ('initDisabledLinksMask', NvU32, 28), ('vbiosDisabledLinkMask', NvU64, 32), ('initializedLinks', NvU32, 40), ('bEnableTrainingAtLoad', NvBool, 44), ('bEnableSafeModeAtLoad', NvBool, 45)]) +NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS(c.Struct): + SIZE = 8 + initDisabledLinksMask: int + bSkipHwNvlinkDisable: int +struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS.register_fields([('initDisabledLinksMask', NvU32, 0), ('bSkipHwNvlinkDisable', NvBool, 4)]) +NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS +enum_NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND: dict[int, str] = {(NVLINK_EOM_CONTROL_START_EOM:=0): 'NVLINK_EOM_CONTROL_START_EOM', (NVLINK_EOM_CONTROL_END_EOM:=1): 'NVLINK_EOM_CONTROL_END_EOM', (NVLINK_EOM_CONTROL_CONFIG_EOM:=2): 'NVLINK_EOM_CONTROL_CONFIG_EOM', (NVLINK_EOM_CONTROL_FULL_EOM_SEQUENCE:=3): 'NVLINK_EOM_CONTROL_FULL_EOM_SEQUENCE'} +NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT(c.Struct): + SIZE = 4 + upper: int + middle: int + lower: int + composite: int +struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT.register_fields([('upper', NvU8, 0), ('middle', NvU8, 1), ('lower', NvU8, 2), ('composite', NvU8, 3)]) +NV2080_CTRL_NVLINK_EOM_MEASUREMENT: TypeAlias = struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT +@c.record +class struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + linkId: int + params: int + measurements: c.Array[struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT, Literal[4]] +struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS.register_fields([('cmd', NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND, 0), ('linkId', NvU32, 4), ('params', NvU32, 8), ('measurements', c.Array[NV2080_CTRL_NVLINK_EOM_MEASUREMENT, Literal[4]], 12)]) +NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS(c.Struct): + SIZE = 5124 + data: c.Array[ctypes.c_ubyte, Literal[5120]] + dataSize: int +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS.register_fields([('data', c.Array[NvU8, Literal[5120]], 0), ('dataSize', NvU32, 5120)]) +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + l1Threshold: int + l1ExitThreshold: int +struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS.register_fields([('l1Threshold', NvU32, 0), ('l1ExitThreshold', NvU32, 4)]) +NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + l1Threshold: int + l1ExitThreshold: int +struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS.register_fields([('l1Threshold', NvU32, 0), ('l1ExitThreshold', NvU32, 4)]) +NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS(c.Struct): + SIZE = 5124 + buffer: c.Array[ctypes.c_ubyte, Literal[5120]] + dataSize: int +struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS.register_fields([('buffer', c.Array[NvU8, Literal[5120]], 0), ('dataSize', NvU32, 5120)]) +NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS(c.Struct): + SIZE = 8 + linkId: int + bIsGpuDegraded: int +struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS.register_fields([('linkId', NvU32, 0), ('bIsGpuDegraded', NvBool, 4)]) +NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS(c.Struct): + SIZE = 12 + bIsEnoughNvLink: int + numBridge: int + bridgePresenceMask: int +struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS.register_fields([('bIsEnoughNvLink', NvBool, 0), ('numBridge', NvU32, 4), ('bridgePresenceMask', NvU32, 8)]) +NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS(c.Struct): + SIZE = 4 + linkId: int +struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS.register_fields([('linkId', NvU32, 0)]) +NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PORT_EVENT(c.Struct): + SIZE = 24 + portEventType: int + gpuId: int + linkId: int + time: int +struct_NV2080_CTRL_NVLINK_PORT_EVENT.register_fields([('portEventType', NvU32, 0), ('gpuId', NvU32, 4), ('linkId', NvU32, 8), ('time', NvU64, 16)]) +NV2080_CTRL_NVLINK_PORT_EVENT: TypeAlias = struct_NV2080_CTRL_NVLINK_PORT_EVENT +@c.record +class struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS(c.Struct): + SIZE = 1560 + portEventIndex: int + nextPortEventIndex: int + portEventCount: int + bOverflow: int + portEvent: c.Array[struct_NV2080_CTRL_NVLINK_PORT_EVENT, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS.register_fields([('portEventIndex', NvU64, 0), ('nextPortEventIndex', NvU64, 8), ('portEventCount', NvU32, 16), ('bOverflow', NvBool, 20), ('portEvent', c.Array[NV2080_CTRL_NVLINK_PORT_EVENT, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS(c.Struct): + SIZE = 4 + linkId: int +struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS.register_fields([('linkId', NvU32, 0)]) +NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bReducedNvlinkConfig: int +struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS.register_fields([('bReducedNvlinkConfig', NvBool, 0)]) +NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_DATA(c.Struct): + SIZE = 496 + data: c.Array[ctypes.c_ubyte, Literal[496]] +struct_NV2080_CTRL_NVLINK_PRM_DATA.register_fields([('data', c.Array[NvU8, Literal[496]], 0)]) +NV2080_CTRL_NVLINK_PRM_DATA: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_DATA +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS(c.Struct): + SIZE = 510 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + plane_ind: int + admin_status: int + lp_msb: int + local_port: int + swid: int + e: int + fd: int + ps_e: int + ls_e: int + ee_ps: int + ee_ls: int + ee: int + ase: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('plane_ind', NvU8, 497), ('admin_status', NvU8, 498), ('lp_msb', NvU8, 499), ('local_port', NvU8, 500), ('swid', NvU8, 501), ('e', NvU8, 502), ('fd', NvU8, 503), ('ps_e', NvU8, 504), ('ls_e', NvU8, 505), ('ee_ps', NvU8, 506), ('ee_ls', NvU8, 507), ('ee', NvU8, 508), ('ase', NvU8, 509)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS(c.Struct): + SIZE = 503 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lane_mask: int + lp_msb: int + pnat: int + local_port: int + local_tx_precoding_admin: int + local_rx_precoding_admin: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lane_mask', NvU8, 497), ('lp_msb', NvU8, 498), ('pnat', NvU8, 499), ('local_port', NvU8, 500), ('local_tx_precoding_admin', NvU8, 501), ('local_rx_precoding_admin', NvU8, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS(c.Struct): + SIZE = 526 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + test_mode: int + plane_ind: int + port_type: int + lp_msb: int + pnat: int + local_port: int + fec_override_admin_10g_40g: int + fec_override_admin_25g: int + fec_override_admin_50g: int + fec_override_admin_100g: int + fec_override_admin_56g: int + rs_fec_correction_bypass_admin: int + fec_override_admin_200g_4x: int + fec_override_admin_400g_8x: int + fec_override_admin_50g_1x: int + fec_override_admin_100g_2x: int + fec_override_admin_400g_4x: int + fec_override_admin_800g_8x: int + fec_override_admin_100g_1x: int + fec_override_admin_200g_2x: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('test_mode', NvBool, 497), ('plane_ind', NvU8, 498), ('port_type', NvU8, 499), ('lp_msb', NvU8, 500), ('pnat', NvU8, 501), ('local_port', NvU8, 502), ('fec_override_admin_10g_40g', NvU8, 503), ('fec_override_admin_25g', NvU8, 504), ('fec_override_admin_50g', NvU8, 505), ('fec_override_admin_100g', NvU8, 506), ('fec_override_admin_56g', NvU8, 507), ('rs_fec_correction_bypass_admin', NvU8, 508), ('fec_override_admin_200g_4x', NvU16, 510), ('fec_override_admin_400g_8x', NvU16, 512), ('fec_override_admin_50g_1x', NvU16, 514), ('fec_override_admin_100g_2x', NvU16, 516), ('fec_override_admin_400g_4x', NvU16, 518), ('fec_override_admin_800g_8x', NvU16, 520), ('fec_override_admin_100g_1x', NvU16, 522), ('fec_override_admin_200g_2x', NvU16, 524)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS(c.Struct): + SIZE = 520 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + local_port: int + l1_req_en: int + l1_fw_req_en: int + l1_cap_adv: int + l1_fw_cap_adv: int + hp_queues_bitmap: int + l1_hw_active_time: int + l1_hw_inactive_time: int + qem: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('local_port', NvU8, 498), ('l1_req_en', NvBool, 499), ('l1_fw_req_en', NvBool, 500), ('l1_cap_adv', NvBool, 501), ('l1_fw_cap_adv', NvBool, 502), ('hp_queues_bitmap', NvU32, 504), ('l1_hw_active_time', NvU16, 508), ('l1_hw_inactive_time', NvU16, 510), ('qem', c.Array[NvU8, Literal[8]], 512)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS(c.Struct): + SIZE = 499 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + access_reg_group: int + feature_group: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('access_reg_group', NvU8, 497), ('feature_group', NvU8, 498)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + slot_index: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('slot_index', NvU8, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + slot_index: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('slot_index', NvU8, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + slot_index: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('slot_index', NvU8, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + slot_index: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('slot_index', NvU8, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + itre: int + i_e: int + lp_msb: int + local_port: int + protocol: int + admin_mtu: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('itre', NvBool, 497), ('i_e', NvU8, 498), ('lp_msb', NvU8, 499), ('local_port', NvU8, 500), ('protocol', NvU8, 501), ('admin_mtu', NvU16, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS(c.Struct): + SIZE = 503 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + width: int + plane_ind: int + lp_msb: int + local_port: int + m_lane_m: int + rxtx: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('width', NvU8, 497), ('plane_ind', NvU8, 498), ('lp_msb', NvU8, 499), ('local_port', NvU8, 500), ('m_lane_m', NvBool, 501), ('rxtx', NvBool, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS(c.Struct): + SIZE = 502 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + trap_id: int + action: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('trap_id', NvU16, 498), ('action', NvU8, 500)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + port_type: int + plane_ind: int + lp_msb: int + pnat: int + local_port: int + page_select: int + module_info_ext: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('port_type', NvU8, 497), ('plane_ind', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501), ('page_select', NvU8, 502), ('module_info_ext', NvU8, 503)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS(c.Struct): + SIZE = 512 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + le: int + port_type: int + lane: int + lp_msb: int + pnat: int + local_port: int + sw: int + dm_ig: int + p: int + e: int + modulation: int + prbs_mode_admin: int + prbs_fec_admin: int + lane_rate_admin: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('le', NvBool, 497), ('port_type', NvU8, 498), ('lane', NvU8, 499), ('lp_msb', NvU8, 500), ('pnat', NvU8, 501), ('local_port', NvU8, 502), ('sw', NvBool, 503), ('dm_ig', NvBool, 504), ('p', NvBool, 505), ('e', NvBool, 506), ('modulation', NvU8, 507), ('prbs_mode_admin', NvU8, 508), ('prbs_fec_admin', NvBool, 509), ('lane_rate_admin', NvU16, 510)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS(c.Struct): + SIZE = 509 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + grp: int + port_type: int + lp_msb: int + pnat: int + local_port: int + swid: int + prio_tc: int + grp_profile: int + plane_ind: int + counters_cap: int + lp_gl: int + clr: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('grp', NvU8, 497), ('port_type', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501), ('swid', NvU8, 502), ('prio_tc', NvU8, 503), ('grp_profile', NvU8, 504), ('plane_ind', NvU8, 505), ('counters_cap', NvBool, 506), ('lp_gl', NvBool, 507), ('clr', NvBool, 508)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS(c.Struct): + SIZE = 497 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + port_type: int + phy_test_mode_admin: int + lp_msb: int + local_port: int + swid: int + plane_ind: int + phy_status_admin: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('port_type', NvU8, 497), ('phy_test_mode_admin', NvU8, 498), ('lp_msb', NvU8, 499), ('local_port', NvU8, 500), ('swid', NvU8, 501), ('plane_ind', NvU8, 502), ('phy_status_admin', NvU8, 503)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS(c.Struct): + SIZE = 503 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + plane_ind: int + port_type: int + lp_msb: int + pnat: int + local_port: int + hist_type: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('plane_ind', NvU8, 497), ('port_type', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501), ('hist_type', NvU8, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS(c.Struct): + SIZE = 505 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + c_db: int + port_type: int + lane_speed: int + lane: int + tx_policy: int + pnat: int + local_port: int + lp_msb: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('c_db', NvBool, 497), ('port_type', NvU8, 498), ('lane_speed', NvU8, 499), ('lane', NvU8, 500), ('tx_policy', NvBool, 501), ('pnat', NvU8, 502), ('local_port', NvU8, 503), ('lp_msb', NvU8, 504)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS(c.Struct): + SIZE = 500 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + pnat: int + local_port: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('pnat', NvU8, 498), ('local_port', NvU8, 499)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS(c.Struct): + SIZE = 512 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + le: int + port_type: int + lane: int + lp_msb: int + pnat: int + local_port: int + sw: int + dm_ig: int + p: int + s: int + e: int + modulation: int + prbs_mode_admin: int + lane_rate_oper: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('le', NvBool, 497), ('port_type', NvU8, 498), ('lane', NvU8, 499), ('lp_msb', NvU8, 500), ('pnat', NvU8, 501), ('local_port', NvU8, 502), ('sw', NvBool, 503), ('dm_ig', NvBool, 504), ('p', NvBool, 505), ('s', NvBool, 506), ('e', NvBool, 507), ('modulation', NvU8, 508), ('prbs_mode_admin', NvU8, 509), ('lane_rate_oper', NvU16, 510)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS(c.Struct): + SIZE = 524 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + proto_mask: int + transmit_allowed: int + plane_ind: int + port_type: int + lp_msb: int + local_port: int + tx_ready_e: int + ee_tx_ready: int + an_disable_admin: int + ext_eth_proto_admin: int + eth_proto_admin: int + ib_proto_admin: int + ib_link_width_admin: int + xdr_2x_slow_admin: int + force_lt_frames_admin: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('proto_mask', NvU8, 497), ('transmit_allowed', NvBool, 498), ('plane_ind', NvU8, 499), ('port_type', NvU8, 500), ('lp_msb', NvU8, 501), ('local_port', NvU8, 502), ('tx_ready_e', NvU8, 503), ('ee_tx_ready', NvBool, 504), ('an_disable_admin', NvBool, 505), ('ext_eth_proto_admin', NvU32, 508), ('eth_proto_admin', NvU32, 512), ('ib_proto_admin', NvU16, 516), ('ib_link_width_admin', NvU16, 518), ('xdr_2x_slow_admin', NvBool, 520), ('force_lt_frames_admin', NvU8, 521)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS(c.Struct): + SIZE = 502 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + port_type: int + lane: int + lp_msb: int + pnat: int + local_port: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('port_type', NvU8, 497), ('lane', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + admin_status: int + module: int + slot_index: int + rst: int + e: int + ee: int + ase: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('admin_status', NvU8, 497), ('module', NvU8, 498), ('slot_index', NvU8, 499), ('rst', NvBool, 500), ('e', NvU8, 501), ('ee', NvBool, 502), ('ase', NvBool, 503)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS(c.Struct): + SIZE = 506 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + plane_ind: int + port_type: int + op_mod: int + apply_im: int + lp_msb: int + local_port: int + lb_en: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('plane_ind', NvU8, 497), ('port_type', NvU8, 498), ('op_mod', NvBool, 499), ('apply_im', NvBool, 500), ('lp_msb', NvU8, 501), ('local_port', NvU8, 502), ('lb_en', NvU16, 504)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterMask: c.Array[ctypes.c_uint64, Literal[2]] +struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS.register_fields([('counterMask', c.Array[NvU64, Literal[2]], 0)]) +NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS(c.Struct): + SIZE = 544 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + segment_type: int + seq_num: int + vhca_id_valid: int + inline_dump: int + vhca_id: int + index1: int + index2: int + num_of_obj2: int + num_of_obj1: int + device_opaque: int + mkey: int + address: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('segment_type', NvU16, 498), ('seq_num', NvU8, 500), ('vhca_id_valid', NvBool, 501), ('inline_dump', NvBool, 502), ('vhca_id', NvU16, 504), ('index1', NvU32, 508), ('index2', NvU32, 512), ('num_of_obj2', NvU16, 516), ('num_of_obj1', NvU16, 518), ('device_opaque', NvU64, 520), ('mkey', NvU32, 528), ('address', NvU64, 536)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + trace_owner: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('trace_owner', NvBool, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS(c.Struct): + SIZE = 500 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + trace_mode: int + log_trace_buffer_size: int + trace_mkey: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('trace_mode', NvU8, 497), ('log_trace_buffer_size', NvU8, 498), ('trace_mkey', NvU8, 499)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS(c.Struct): + SIZE = 502 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + modify_field_select: int + arm_event: int + trace_status: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('modify_field_select', NvU16, 498), ('arm_event', NvBool, 500), ('trace_status', NvU8, 501)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS(c.Struct): + SIZE = 497 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS(c.Struct): + SIZE = 532 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + enable_all: int + log_delay: int + source_id_bitmask: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('enable_all', NvU8, 497), ('log_delay', NvU8, 498), ('source_id_bitmask', c.Array[NvU32, Literal[8]], 500)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + log_level: int + log_bit_mask: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('log_level', NvU8, 497), ('log_bit_mask', NvU32, 500)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS(c.Struct): + SIZE = 502 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + warning_inactive_time: int + warning_active_time: int + critical_inactive_time: int + critical_active_time: int + cc: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('warning_inactive_time', NvU8, 497), ('warning_active_time', NvU8, 498), ('critical_inactive_time', NvU8, 499), ('critical_active_time', NvU8, 500), ('cc', NvBool, 501)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS(c.Struct): + SIZE = 497 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS(c.Struct): + SIZE = 499 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + local_port: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('local_port', NvU8, 498)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS(c.Struct): + SIZE = 520 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + local_port: int + cnt_64bit: int + stop_at_ff: int + counter_rst: int + counter_en: int + force_count_mask: int + cnt_type: c.Array[ctypes.c_ubyte, Literal[8]] + cnt_val: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('local_port', NvU8, 498), ('cnt_64bit', NvU8, 499), ('stop_at_ff', NvBool, 500), ('counter_rst', NvBool, 501), ('counter_en', NvBool, 502), ('force_count_mask', NvU8, 503), ('cnt_type', c.Array[NvU8, Literal[8]], 504), ('cnt_val', c.Array[NvU8, Literal[8]], 512)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + ib_port: int + lp_msb: int + local_port: int + split_num: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('ib_port', NvU16, 498), ('lp_msb', NvU8, 500), ('local_port', NvU8, 501), ('split_num', NvU8, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS(c.Struct): + SIZE = 37 + ibGuid: c.Array[ctypes.c_ubyte, Literal[16]] + rackGuid: c.Array[ctypes.c_ubyte, Literal[16]] + chassisPhysicalSlotNumber: int + computeSlotIndex: int + nodeIndex: int + peerType: int + moduleId: int +struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS.register_fields([('ibGuid', c.Array[NvU8, Literal[16]], 0), ('rackGuid', c.Array[NvU8, Literal[16]], 16), ('chassisPhysicalSlotNumber', NvU8, 32), ('computeSlotIndex', NvU8, 33), ('nodeIndex', NvU8, 34), ('peerType', NvU8, 35), ('moduleId', NvU8, 36)]) +NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD(c.Struct): + SIZE = 4 + pllIndex: int + address: int +struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD.register_fields([('pllIndex', NvU8, 0), ('address', NvU16, 2)]) +NV2080_CTRL_NVLINK_UPHY_CLN_CMD: TypeAlias = struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD +@c.record +class struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS(c.Struct): + SIZE = 148 + linkMask: int + uphyCmd: c.Array[struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD, Literal[18]] + data: c.Array[ctypes.c_uint32, Literal[18]] +struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS.register_fields([('linkMask', NvU32, 0), ('uphyCmd', c.Array[NV2080_CTRL_NVLINK_UPHY_CLN_CMD, Literal[18]], 4), ('data', c.Array[NvU32, Literal[18]], 76)]) +NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS(c.Struct): + SIZE = 24 + rbmModesList: c.Array[ctypes.c_ubyte, Literal[23]] + rbmTotalModes: int +struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS.register_fields([('rbmModesList', c.Array[NvU8, Literal[23]], 0), ('rbmTotalModes', NvU8, 23)]) +NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS(c.Struct): + SIZE = 1 + rbmMode: int +struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS.register_fields([('rbmMode', NvU8, 0)]) +NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS(c.Struct): + SIZE = 1 + rbmMode: int +struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS.register_fields([('rbmMode', NvU8, 0)]) +NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 56 + localDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO +struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS.register_fields([('localDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 0)]) +NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS +enum_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY: dict[int, str] = {(NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_NONFATAL:=0): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_NONFATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_APP_FATAL:=1): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_APP_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_FATAL:=2): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_DEGRADATION:=3): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_DEGRADATION', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_WATCHDOG_TIMEOUT:=4): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_WATCHDOG_TIMEOUT', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_NON_FATAL:=5): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MSE:=6): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MSE', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_NON_FATAL:=7): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_FATAL:=8): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_PRIV_ERR:=9): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_PRIV_ERR', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_NON_FATAL:=10): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_FATAL:=11): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TREX_NON_FATAL:=12): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TREX_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_NON_FATAL:=13): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_FATAL:=14): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_NON_FATAL:=15): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_FATAL:=16): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_NON_FATAL:=17): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_FATAL:=18): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_NON_FATAL:=19): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_FATAL:=20): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MAX:=21): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MAX'} +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + severity: int +struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS.register_fields([('linkMask', NvU32, 0), ('severity', NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY, 4)]) +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS +enum_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE: dict[int, str] = {(NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DISABLED:=0): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DISABLED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_TRIGGER_ONCE:=1): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_TRIGGER_ONCE', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_EXITED:=2): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_EXITED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_ENTERED:=3): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_ENTERED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DUTY_CYCLE:=4): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DUTY_CYCLE'} +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG(c.Struct): + SIZE = 8 + mode: int + toggleActiveTime: int + toggleInactiveTime: int + bTrigger: int +struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG.register_fields([('mode', NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE, 0), ('toggleActiveTime', NvU8, 4), ('toggleInactiveTime', NvU8, 5), ('bTrigger', NvBool, 6)]) +NV2080_CTRL_NVLINK_L1_FORCE_CONFIG: TypeAlias = struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG +@c.record +class struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS(c.Struct): + SIZE = 12 + linkMask: int + config: struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG +struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS.register_fields([('linkMask', NvU32, 0), ('config', NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, 4)]) +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS(c.Struct): + SIZE = 260 + linkMask: int + config: c.Array[struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, Literal[32]] +struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS.register_fields([('linkMask', NvU32, 0), ('config', c.Array[NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, Literal[32]], 4)]) +NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_BOOST_PARAMS(c.Struct): + SIZE = 8 + flags: int + duration: int +struct_NV2080_CTRL_PERF_BOOST_PARAMS.register_fields([('flags', NvU32, 0), ('duration', NvU32, 4)]) +NV2080_CTRL_PERF_BOOST_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_BOOST_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS(c.Struct): + SIZE = 1 + bAcquire: int +struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS.register_fields([('bAcquire', NvBool, 0)]) +NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_PERF_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerStateInfo: struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS.register_fields([('powerStateInfo', NV2080_CTRL_PERF_POWERSTATE_PARAMS, 0)]) +NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS +enum_NV2080_CTRL_PERF_RATED_TDP_CLIENT: dict[int, str] = {(NV2080_CTRL_PERF_RATED_TDP_CLIENT_RM:=0): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_RM', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_WAR_BUG_1785342:=1): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_WAR_BUG_1785342', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_GLOBAL:=2): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_GLOBAL', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_OS:=3): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_OS', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_PROFILE:=4): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_PROFILE', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_NUM_CLIENTS:=5): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_NUM_CLIENTS'} +NV2080_CTRL_PERF_RATED_TDP_CLIENT: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_PERF_RATED_TDP_ACTION: dict[int, str] = {(NV2080_CTRL_PERF_RATED_TDP_ACTION_DEFAULT:=0): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_DEFAULT', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_EXCEED:=1): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_EXCEED', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LIMIT:=2): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LIMIT', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LOCK:=3): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LOCK', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_FLOOR:=4): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_FLOOR'} +NV2080_CTRL_PERF_RATED_TDP_ACTION: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE: dict[int, str] = {(NV2080_CTRL_PERF_VPSTATE_RATED_TDP:=0): 'NV2080_CTRL_PERF_VPSTATE_RATED_TDP', (NV2080_CTRL_PERF_VPSTATE_TURBO_BOOST:=1): 'NV2080_CTRL_PERF_VPSTATE_TURBO_BOOST', (NV2080_CTRL_PERF_VPSTATE_NUM_VPSTATES:=2): 'NV2080_CTRL_PERF_VPSTATE_NUM_VPSTATES'} +NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST(c.Struct): + SIZE = 8 + action: int + vPstateType: int +struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST.register_fields([('action', NV2080_CTRL_PERF_RATED_TDP_ACTION, 0), ('vPstateType', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 4)]) +NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS(c.Struct): + SIZE = 56 + rm: struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm + output: int + outputVPstate: int + inputs: c.Array[ctypes.c_uint32, Literal[5]] + vPstateTypes: c.Array[ctypes.c_uint32, Literal[5]] +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm(c.Struct): + SIZE = 8 + clientActiveMask: int + bRegkeyLimitRatedTdp: int +struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm.register_fields([('clientActiveMask', NvU32, 0), ('bRegkeyLimitRatedTdp', NvU8, 4)]) +struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS.register_fields([('rm', struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm, 0), ('output', NV2080_CTRL_PERF_RATED_TDP_ACTION, 8), ('outputVPstate', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 12), ('inputs', c.Array[NV2080_CTRL_PERF_RATED_TDP_ACTION, Literal[5]], 16), ('vPstateTypes', c.Array[NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, Literal[5]], 36)]) +NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS(c.Struct): + SIZE = 12 + client: int + input: int + vPstateType: int +struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS.register_fields([('client', NV2080_CTRL_PERF_RATED_TDP_CLIENT, 0), ('input', NV2080_CTRL_PERF_RATED_TDP_ACTION, 4), ('vPstateType', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 8)]) +NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +NV2080_CTRL_PERF_RATED_TDP_GET_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +NV2080_CTRL_PERF_RATED_TDP_SET_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE(c.Struct): + SIZE = 128 + util: int + vgpuScale: int + procId: int + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] + pOsPidInfo: int +struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE.register_fields([('util', NvU32, 0), ('vgpuScale', NvU32, 4), ('procId', NvU32, 8), ('subProcessID', NvU32, 12), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 16), ('pOsPidInfo', NvU64, 120)]) +NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE: TypeAlias = struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE +@c.record +class struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE(c.Struct): + SIZE = 776 + base: struct_NV2080_CTRL_GPUMON_SAMPLE + fb: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + gr: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvenc: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvdec: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvjpg: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvofa: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE +struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE.register_fields([('base', NV2080_CTRL_GPUMON_SAMPLE, 0), ('fb', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 8), ('gr', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 136), ('nvenc', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 264), ('nvdec', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 392), ('nvjpg', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 520), ('nvofa', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 648)]) +NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE: TypeAlias = struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_PARAM: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLES +@c.record +class struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS(c.Struct): + SIZE = 55888 + type: int + bufSize: int + count: int + tracker: int + samples: c.Array[struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE, Literal[72]] +struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS.register_fields([('type', NvU8, 0), ('bufSize', NvU32, 4), ('count', NvU32, 8), ('tracker', NvU32, 12), ('samples', c.Array[NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE, Literal[72]], 16)]) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS(c.Struct): + SIZE = 8 + prevPstate: int + action: int +struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS.register_fields([('prevPstate', NvU32, 0), ('action', NvU32, 4)]) +NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS(c.Struct): + SIZE = 24 + bGpuIsIdle: int + bRestoreToMax: int + idleTimeUs: int + busyTimeUs: int +struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS.register_fields([('bGpuIsIdle', NvBool, 0), ('bRestoreToMax', NvBool, 1), ('idleTimeUs', NvU64, 8), ('busyTimeUs', NvU64, 16)]) +NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_CLK_INFO(c.Struct): + SIZE = 24 + flags: int + domain: int + currentFreq: int + defaultFreq: int + minFreq: int + maxFreq: int +struct_NV2080_CTRL_PERF_GET_CLK_INFO.register_fields([('flags', NvU32, 0), ('domain', NvU32, 4), ('currentFreq', NvU32, 8), ('defaultFreq', NvU32, 12), ('minFreq', NvU32, 16), ('maxFreq', NvU32, 20)]) +NV2080_CTRL_PERF_GET_CLK_INFO: TypeAlias = struct_NV2080_CTRL_PERF_GET_CLK_INFO +@c.record +class struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS(c.Struct): + SIZE = 24 + level: int + flags: int + perfGetClkInfoList: ctypes.c_void_p + perfGetClkInfoListSize: int +struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS.register_fields([('level', NvU32, 0), ('flags', NvU32, 4), ('perfGetClkInfoList', NvP64, 8), ('perfGetClkInfoListSize', NvU32, 16)]) +NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS(c.Struct): + SIZE = 780 + level: int + flags: int + perfGetClkInfoList: c.Array[struct_NV2080_CTRL_PERF_GET_CLK_INFO, Literal[32]] + perfGetClkInfoListSize: int +struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS.register_fields([('level', NvU32, 0), ('flags', NvU32, 4), ('perfGetClkInfoList', c.Array[NV2080_CTRL_PERF_GET_CLK_INFO, Literal[32]], 8), ('perfGetClkInfoListSize', NvU32, 776)]) +NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS +enum_NV2080_CTRL_CMD_PERF_VID_ENG: dict[int, str] = {(NV2080_CTRL_CMD_PERF_VID_ENG_NVENC:=1): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVENC', (NV2080_CTRL_CMD_PERF_VID_ENG_NVDEC:=2): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVDEC', (NV2080_CTRL_CMD_PERF_VID_ENG_NVJPG:=3): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVJPG', (NV2080_CTRL_CMD_PERF_VID_ENG_NVOFA:=4): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVOFA'} +NV2080_CTRL_CMD_PERF_VID_ENG: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS(c.Struct): + SIZE = 12 + engineType: int + clkPercentBusy: int + samplingPeriodUs: int +struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS.register_fields([('engineType', NV2080_CTRL_CMD_PERF_VID_ENG, 0), ('clkPercentBusy', NvU32, 4), ('samplingPeriodUs', NvU32, 8)]) +NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerStateInfo: struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS.register_fields([('powerStateInfo', NV2080_CTRL_PERF_POWERSTATE_PARAMS, 0)]) +NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS(c.Struct): + SIZE = 4 + videoEvent: int +struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS.register_fields([('videoEvent', NvU32, 0)]) +NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS +NV2080_CTRL_PERF_PSTATES_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS(c.Struct): + SIZE = 4 + currPstate: int +struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS.register_fields([('currPstate', NvU32, 0)]) +NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS(c.Struct): + SIZE = 8 + moduleId: int + nvswitchSupport: int +struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS.register_fields([('moduleId', NvU32, 0), ('nvswitchSupport', NvU8, 4)]) +NV2080_CTRL_PMGR_MODULE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS +enum_NV2080_CTRL_GC6_FLAVOR_ID: dict[int, str] = {(NV2080_CTRL_GC6_FLAVOR_ID_MSHYBRID:=0): 'NV2080_CTRL_GC6_FLAVOR_ID_MSHYBRID', (NV2080_CTRL_GC6_FLAVOR_ID_OPTIMUS:=1): 'NV2080_CTRL_GC6_FLAVOR_ID_OPTIMUS', (NV2080_CTRL_GC6_FLAVOR_ID_MAX:=4): 'NV2080_CTRL_GC6_FLAVOR_ID_MAX'} +NV2080_CTRL_GC6_FLAVOR_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GC6_ENTRY_PARAMS(c.Struct): + SIZE = 12 + flavorId: int + stepMask: int + params: struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params +@c.record +class struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params(c.Struct): + SIZE = 3 + bIsRTD3Transition: int + bIsRTD3CoreRailPowerCut: int + bSkipPstateSanity: int +struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params.register_fields([('bIsRTD3Transition', NvBool, 0), ('bIsRTD3CoreRailPowerCut', NvBool, 1), ('bSkipPstateSanity', NvBool, 2)]) +struct_NV2080_CTRL_GC6_ENTRY_PARAMS.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('stepMask', NvU32, 4), ('params', struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params, 8)]) +NV2080_CTRL_GC6_ENTRY_PARAMS: TypeAlias = struct_NV2080_CTRL_GC6_ENTRY_PARAMS +@c.record +class struct_NV2080_CTRL_GC6_EXIT_PARAMS(c.Struct): + SIZE = 8 + flavorId: int + params: struct_NV2080_CTRL_GC6_EXIT_PARAMS_params +@c.record +class struct_NV2080_CTRL_GC6_EXIT_PARAMS_params(c.Struct): + SIZE = 3 + bIsGpuSelfWake: int + bIsRTD3Transition: int + bIsRTD3HotTransition: int +struct_NV2080_CTRL_GC6_EXIT_PARAMS_params.register_fields([('bIsGpuSelfWake', NvBool, 0), ('bIsRTD3Transition', NvBool, 1), ('bIsRTD3HotTransition', NvBool, 2)]) +struct_NV2080_CTRL_GC6_EXIT_PARAMS.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('params', struct_NV2080_CTRL_GC6_EXIT_PARAMS_params, 4)]) +NV2080_CTRL_GC6_EXIT_PARAMS: TypeAlias = struct_NV2080_CTRL_GC6_EXIT_PARAMS +enum_NV2080_CTRL_GC6_STEP_ID: dict[int, str] = {(NV2080_CTRL_GC6_STEP_ID_SR_ENTRY:=0): 'NV2080_CTRL_GC6_STEP_ID_SR_ENTRY', (NV2080_CTRL_GC6_STEP_ID_GPU_OFF:=1): 'NV2080_CTRL_GC6_STEP_ID_GPU_OFF', (NV2080_CTRL_GC6_STEP_ID_MAX:=2): 'NV2080_CTRL_GC6_STEP_ID_MAX'} +NV2080_CTRL_GC6_STEP_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GC6_FLAVOR_INFO(c.Struct): + SIZE = 8 + flavorId: int + stepMask: int +struct_NV2080_CTRL_GC6_FLAVOR_INFO.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('stepMask', NvU32, 4)]) +NV2080_CTRL_GC6_FLAVOR_INFO: TypeAlias = struct_NV2080_CTRL_GC6_FLAVOR_INFO +@c.record +class struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS(c.Struct): + SIZE = 32 + hChannel: int + virtAddress: int + bufferPtr: ctypes.c_void_p + bufferSize: int +struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS.register_fields([('hChannel', NvHandle, 0), ('virtAddress', NvU64, 8), ('bufferPtr', NvP64, 16), ('bufferSize', NvU32, 24)]) +NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS(c.Struct): + SIZE = 4 + errorCount: int +struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS.register_fields([('errorCount', NvU32, 0)]) +NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS(c.Struct): + SIZE = 8200 + whichBuffer: int + outputRecordSize: int + recordBuffer: c.Array[ctypes.c_ubyte, Literal[8192]] +struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS.register_fields([('whichBuffer', NvU32, 0), ('outputRecordSize', NvU32, 4), ('recordBuffer', c.Array[NvU8, Literal[8192]], 8)]) +NV2080_CTRL_RC_GET_ERROR_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS(c.Struct): + SIZE = 4 + watchdogStatusFlags: int +struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS.register_fields([('watchdogStatusFlags', NvU32, 0)]) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS(c.Struct): + SIZE = 4 + rcEnable: int +struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS.register_fields([('rcEnable', NvU32, 0)]) +NV2080_CTRL_CMD_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +NV2080_CTRL_SET_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +NV2080_CTRL_GET_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +@c.record +class struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS(c.Struct): + SIZE = 8 + cmd: int + status: int +struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS.register_fields([('cmd', NvU32, 0), ('status', NvS32, 4)]) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_RC_INFO_PARAMS(c.Struct): + SIZE = 8 + rcMode: int + rcBreak: int +struct_NV2080_CTRL_CMD_RC_INFO_PARAMS.register_fields([('rcMode', NvU32, 0), ('rcBreak', NvU32, 4)]) +NV2080_CTRL_CMD_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +NV2080_CTRL_SET_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +NV2080_CTRL_GET_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +@c.record +class struct_RM_GSP_SPDM_CMD_CC_INIT(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_INIT.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_INIT: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_INIT +PRM_GSP_SPDM_CMD_CC_INIT: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_INIT] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_DEINIT(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_DEINIT.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_DEINIT: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_DEINIT +PRM_GSP_SPDM_CMD_CC_DEINIT: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_DEINIT] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_CTRL(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_CTRL.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_CTRL: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_CTRL +PRM_GSP_SPDM_CMD_CC_CTRL: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_CTRL] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA(c.Struct): + SIZE = 68 + cmdType: int + rsvd0: c.Array[ctypes.c_uint32, Literal[2]] + rsvd1: int + rsvd2: c.Array[ctypes.c_char, Literal[9]] + rsvd3: c.Array[ctypes.c_char, Literal[5]] + rsvd4: c.Array[ctypes.c_char, Literal[5]] + rsvd5: c.Array[ctypes.c_char, Literal[5]] + rsvd6: c.Array[ctypes.c_char, Literal[2]] + rsvd7: c.Array[ctypes.c_char, Literal[16]] + rsvd8: c.Array[ctypes.c_uint32, Literal[2]] +struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA.register_fields([('cmdType', NvU8, 0), ('rsvd0', c.Array[NvU32, Literal[2]], 4), ('rsvd1', NvU32, 12), ('rsvd2', c.Array[ctypes.c_char, Literal[9]], 16), ('rsvd3', c.Array[ctypes.c_char, Literal[5]], 25), ('rsvd4', c.Array[ctypes.c_char, Literal[5]], 30), ('rsvd5', c.Array[ctypes.c_char, Literal[5]], 35), ('rsvd6', c.Array[ctypes.c_char, Literal[2]], 40), ('rsvd7', c.Array[ctypes.c_char, Literal[16]], 42), ('rsvd8', c.Array[NvU32, Literal[2]], 60)]) +RM_GSP_SPDM_CMD_CC_INIT_RM_DATA: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA +PRM_GSP_SPDM_CMD_CC_INIT_RM_DATA: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL(c.Struct): + SIZE = 2 + cmdType: int + bEnable: int +struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL.register_fields([('cmdType', NvU8, 0), ('bEnable', NvBool, 1)]) +RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL +PRM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL] +@c.record +class struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST(c.Struct): + SIZE = 160 + cmdType: int + isEnc: int + kmb: struct_CC_KMB + text: c.Array[ctypes.c_ubyte, Literal[16]] + authTag: c.Array[ctypes.c_ubyte, Literal[16]] +@c.record +class struct_CC_KMB(c.Struct): + SIZE = 124 + encryptBundle: struct_CC_AES_CRYPTOBUNDLE + hmacBundle: struct_CC_HMAC_CRYPTOBUNDLE + decryptBundle: struct_CC_AES_CRYPTOBUNDLE + bIsWorkLaunch: int +CC_KMB: TypeAlias = struct_CC_KMB +@c.record +class struct_CC_AES_CRYPTOBUNDLE(c.Struct): + SIZE = 56 + iv: c.Array[ctypes.c_uint32, Literal[3]] + key: c.Array[ctypes.c_uint32, Literal[8]] + ivMask: c.Array[ctypes.c_uint32, Literal[3]] +CC_AES_CRYPTOBUNDLE: TypeAlias = struct_CC_AES_CRYPTOBUNDLE +struct_CC_AES_CRYPTOBUNDLE.register_fields([('iv', c.Array[NvU32, Literal[3]], 0), ('key', c.Array[NvU32, Literal[8]], 12), ('ivMask', c.Array[NvU32, Literal[3]], 44)]) +@c.record +class struct_CC_HMAC_CRYPTOBUNDLE(c.Struct): + SIZE = 64 + nonce: c.Array[ctypes.c_uint32, Literal[8]] + key: c.Array[ctypes.c_uint32, Literal[8]] +CC_HMAC_CRYPTOBUNDLE: TypeAlias = struct_CC_HMAC_CRYPTOBUNDLE +struct_CC_HMAC_CRYPTOBUNDLE.register_fields([('nonce', c.Array[NvU32, Literal[8]], 0), ('key', c.Array[NvU32, Literal[8]], 32)]) +struct_CC_KMB.register_fields([('encryptBundle', CC_AES_CRYPTOBUNDLE, 0), ('hmacBundle', CC_HMAC_CRYPTOBUNDLE, 56), ('decryptBundle', CC_AES_CRYPTOBUNDLE, 56), ('bIsWorkLaunch', NvBool, 120)]) +struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST.register_fields([('cmdType', NvU8, 0), ('isEnc', NvU8, 1), ('kmb', CC_KMB, 4), ('text', c.Array[NvU8, Literal[16]], 128), ('authTag', c.Array[NvU8, Literal[16]], 144)]) +RM_GSP_SPDM_CMD_FIPS_SELFTEST: TypeAlias = struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST +PRM_GSP_SPDM_CMD_FIPS_SELFTEST: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST] +@c.record +class union_RM_GSP_SPDM_CMD(c.Struct): + SIZE = 160 + cmdType: int + ccInit: struct_RM_GSP_SPDM_CMD_CC_INIT + ccDeinit: struct_RM_GSP_SPDM_CMD_CC_DEINIT + ccCtrl: struct_RM_GSP_SPDM_CMD_CC_CTRL + rmDataInitCmd: struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA + ccHeartbeatCtrl: struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL + ccFipsTest: struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST +union_RM_GSP_SPDM_CMD.register_fields([('cmdType', NvU8, 0), ('ccInit', RM_GSP_SPDM_CMD_CC_INIT, 0), ('ccDeinit', RM_GSP_SPDM_CMD_CC_DEINIT, 0), ('ccCtrl', RM_GSP_SPDM_CMD_CC_CTRL, 0), ('rmDataInitCmd', RM_GSP_SPDM_CMD_CC_INIT_RM_DATA, 0), ('ccHeartbeatCtrl', RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL, 0), ('ccFipsTest', RM_GSP_SPDM_CMD_FIPS_SELFTEST, 0)]) +RM_GSP_SPDM_CMD: TypeAlias = union_RM_GSP_SPDM_CMD +PRM_GSP_SPDM_CMD: TypeAlias = c.POINTER[union_RM_GSP_SPDM_CMD] +@c.record +class struct_RM_GSP_SPDM_MSG(c.Struct): + SIZE = 28 + msgType: int + status: int + rsvd1: int + rsvd2: int + rsvd3: int + rsvd4: int + rsvd5: int +struct_RM_GSP_SPDM_MSG.register_fields([('msgType', NvU8, 0), ('status', NvU32, 4), ('rsvd1', NvU32, 8), ('rsvd2', NvU32, 12), ('rsvd3', NvU32, 16), ('rsvd4', NvU32, 20), ('rsvd5', NvU32, 24)]) +RM_GSP_SPDM_MSG: TypeAlias = struct_RM_GSP_SPDM_MSG +PRM_GSP_SPDM_MSG: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_MSG] +@c.record +class struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS(c.Struct): + SIZE = 192 + index: int + cmd: union_RM_GSP_SPDM_CMD + msg: struct_RM_GSP_SPDM_MSG +struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS.register_fields([('index', NvU8, 0), ('cmd', RM_GSP_SPDM_CMD, 4), ('msg', RM_GSP_SPDM_MSG, 164)]) +NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS(c.Struct): + SIZE = 9220 + transcript: c.Array[ctypes.c_ubyte, Literal[9216]] + transcriptSize: int +struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS.register_fields([('transcript', c.Array[NvU8, Literal[9216]], 0), ('transcriptSize', NvU32, 9216)]) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS(c.Struct): + SIZE = 16 + time_nsec: int + flags: int +struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS.register_fields([('time_nsec', NvU64, 0), ('flags', NvU32, 8)]) +NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS(c.Struct): + SIZE = 8 + time_nsec: int +struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS.register_fields([('time_nsec', NvU64, 0)]) +NV2080_CTRL_TIMER_GET_TIME_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS(c.Struct): + SIZE = 4 + tmr_offset: int +struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS.register_fields([('tmr_offset', NvU32, 0)]) +NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE(c.Struct): + SIZE = 16 + cpuTime: int + gpuTime: int +struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE.register_fields([('cpuTime', NvU64, 0), ('gpuTime', NvU64, 8)]) +NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE: TypeAlias = struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE +@c.record +class struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS(c.Struct): + SIZE = 264 + cpuClkId: int + sampleCount: int + samples: c.Array[struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE, Literal[16]] +struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS.register_fields([('cpuClkId', NvU8, 0), ('sampleCount', NvU8, 1), ('samples', c.Array[NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE, Literal[16]], 8)]) +NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS(c.Struct): + SIZE = 1 + bSetMaxFreq: int +struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS.register_fields([('bSetMaxFreq', NvBool, 0)]) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS.register_fields([('action', NvU32, 0)]) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS.register_fields([('action', NvU32, 0)]) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS(c.Struct): + SIZE = 1 + bEnter: int +struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS.register_fields([('bEnter', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS(c.Struct): + SIZE = 24 + hNotifierResource: int + notifyDataSize: int + hNotifyDataMemory: int + perfmonIdCount: int + snapshotBufferSize: int + hSnapshotMemory: int +struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS.register_fields([('hNotifierResource', NvHandle, 0), ('notifyDataSize', NvU32, 4), ('hNotifyDataMemory', NvHandle, 8), ('perfmonIdCount', NvU32, 12), ('snapshotBufferSize', NvU32, 16), ('hSnapshotMemory', NvHandle, 20)]) +NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS(c.Struct): + SIZE = 1 + bVidmemPersistent: int +struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS.register_fields([('bVidmemPersistent', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS(c.Struct): + SIZE = 1 + bUpdateTGP: int +struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS.register_fields([('bUpdateTGP', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS(c.Struct): + SIZE = 6616 + dbdf: int + gfid: int + vgpuType: int + vmPid: int + swizzId: int + numChannels: int + numPluginChannels: int + chidOffset: c.Array[ctypes.c_uint32, Literal[84]] + bDisableDefaultSmcExecPartRestore: int + numGuestFbSegments: int + guestFbPhysAddrList: c.Array[ctypes.c_uint64, Literal[384]] + guestFbLengthList: c.Array[ctypes.c_uint64, Literal[384]] + pluginHeapMemoryPhysAddr: int + pluginHeapMemoryLength: int + ctrlBuffOffset: int + initTaskLogBuffOffset: int + initTaskLogBuffSize: int + vgpuTaskLogBuffOffset: int + vgpuTaskLogBuffSize: int + kernelLogBuffOffset: int + kernelLogBuffSize: int + migRmHeapMemoryPhysAddr: int + migRmHeapMemoryLength: int + bDeviceProfilingEnabled: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS.register_fields([('dbdf', NvU32, 0), ('gfid', NvU32, 4), ('vgpuType', NvU32, 8), ('vmPid', NvU32, 12), ('swizzId', NvU32, 16), ('numChannels', NvU32, 20), ('numPluginChannels', NvU32, 24), ('chidOffset', c.Array[NvU32, Literal[84]], 28), ('bDisableDefaultSmcExecPartRestore', NvBool, 364), ('numGuestFbSegments', NvU32, 368), ('guestFbPhysAddrList', c.Array[NvU64, Literal[384]], 376), ('guestFbLengthList', c.Array[NvU64, Literal[384]], 3448), ('pluginHeapMemoryPhysAddr', NvU64, 6520), ('pluginHeapMemoryLength', NvU64, 6528), ('ctrlBuffOffset', NvU64, 6536), ('initTaskLogBuffOffset', NvU64, 6544), ('initTaskLogBuffSize', NvU64, 6552), ('vgpuTaskLogBuffOffset', NvU64, 6560), ('vgpuTaskLogBuffSize', NvU64, 6568), ('kernelLogBuffOffset', NvU64, 6576), ('kernelLogBuffSize', NvU64, 6584), ('migRmHeapMemoryPhysAddr', NvU64, 6592), ('migRmHeapMemoryLength', NvU64, 6600), ('bDeviceProfilingEnabled', NvBool, 6608)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS(c.Struct): + SIZE = 334344 + discardVgpuTypes: int + vgpuInfoCount: int + vgpuInfo: c.Array[struct_NVA081_CTRL_VGPU_INFO, Literal[64]] +@c.record +class struct_NVA081_CTRL_VGPU_INFO(c.Struct): + SIZE = 5224 + vgpuType: int + vgpuName: c.Array[ctypes.c_ubyte, Literal[32]] + vgpuClass: c.Array[ctypes.c_ubyte, Literal[32]] + vgpuSignature: c.Array[ctypes.c_ubyte, Literal[128]] + license: c.Array[ctypes.c_ubyte, Literal[128]] + maxInstance: int + numHeads: int + maxResolutionX: int + maxResolutionY: int + maxPixels: int + frlConfig: int + cudaEnabled: int + eccSupported: int + gpuInstanceSize: int + multiVgpuSupported: int + vdevId: int + pdevId: int + profileSize: int + fbLength: int + gspHeapSize: int + fbReservation: int + mappableVideoSize: int + encoderCapacity: int + bar1Length: int + frlEnable: int + adapterName: c.Array[ctypes.c_ubyte, Literal[64]] + adapterName_Unicode: c.Array[ctypes.c_uint16, Literal[64]] + shortGpuNameString: c.Array[ctypes.c_ubyte, Literal[64]] + licensedProductName: c.Array[ctypes.c_ubyte, Literal[128]] + vgpuExtraParams: c.Array[ctypes.c_uint32, Literal[1024]] + ftraceEnable: int + gpuDirectSupported: int + nvlinkP2PSupported: int + multiVgpuExclusive: int + exclusiveType: int + exclusiveSize: int + gpuInstanceProfileId: int + placementSize: int + homogeneousPlacementCount: int + homogeneousPlacementIds: c.Array[ctypes.c_uint32, Literal[32]] + heterogeneousPlacementCount: int + heterogeneousPlacementIds: c.Array[ctypes.c_uint32, Literal[32]] +NVA081_CTRL_VGPU_INFO: TypeAlias = struct_NVA081_CTRL_VGPU_INFO +struct_NVA081_CTRL_VGPU_INFO.register_fields([('vgpuType', NvU32, 0), ('vgpuName', c.Array[NvU8, Literal[32]], 4), ('vgpuClass', c.Array[NvU8, Literal[32]], 36), ('vgpuSignature', c.Array[NvU8, Literal[128]], 68), ('license', c.Array[NvU8, Literal[128]], 196), ('maxInstance', NvU32, 324), ('numHeads', NvU32, 328), ('maxResolutionX', NvU32, 332), ('maxResolutionY', NvU32, 336), ('maxPixels', NvU32, 340), ('frlConfig', NvU32, 344), ('cudaEnabled', NvU32, 348), ('eccSupported', NvU32, 352), ('gpuInstanceSize', NvU32, 356), ('multiVgpuSupported', NvU32, 360), ('vdevId', NvU64, 368), ('pdevId', NvU64, 376), ('profileSize', NvU64, 384), ('fbLength', NvU64, 392), ('gspHeapSize', NvU64, 400), ('fbReservation', NvU64, 408), ('mappableVideoSize', NvU64, 416), ('encoderCapacity', NvU32, 424), ('bar1Length', NvU64, 432), ('frlEnable', NvU32, 440), ('adapterName', c.Array[NvU8, Literal[64]], 444), ('adapterName_Unicode', c.Array[NvU16, Literal[64]], 508), ('shortGpuNameString', c.Array[NvU8, Literal[64]], 636), ('licensedProductName', c.Array[NvU8, Literal[128]], 700), ('vgpuExtraParams', c.Array[NvU32, Literal[1024]], 828), ('ftraceEnable', NvU32, 4924), ('gpuDirectSupported', NvU32, 4928), ('nvlinkP2PSupported', NvU32, 4932), ('multiVgpuExclusive', NvU32, 4936), ('exclusiveType', NvU32, 4940), ('exclusiveSize', NvU32, 4944), ('gpuInstanceProfileId', NvU32, 4948), ('placementSize', NvU32, 4952), ('homogeneousPlacementCount', NvU32, 4956), ('homogeneousPlacementIds', c.Array[NvU32, Literal[32]], 4960), ('heterogeneousPlacementCount', NvU32, 5088), ('heterogeneousPlacementIds', c.Array[NvU32, Literal[32]], 5092)]) +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS.register_fields([('discardVgpuTypes', NvBool, 0), ('vgpuInfoCount', NvU32, 4), ('vgpuInfo', c.Array[NVA081_CTRL_VGPU_INFO, Literal[64]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS +@c.record +class struct_NV2080_GUEST_VM_INFO(c.Struct): + SIZE = 104 + vmPid: int + guestOs: int + migrationProhibited: int + guestNegotiatedVgpuVersion: int + frameRateLimit: int + licensed: int + licenseState: int + licenseExpiryTimestamp: int + licenseExpiryStatus: int + guestDriverVersion: c.Array[ctypes.c_ubyte, Literal[32]] + guestDriverBranch: c.Array[ctypes.c_ubyte, Literal[32]] + guestVmInfoState: int +enum_GUEST_VM_INFO_STATE: dict[int, str] = {(GUEST_VM_INFO_STATE_UNINITIALIZED:=0): 'GUEST_VM_INFO_STATE_UNINITIALIZED', (GUEST_VM_INFO_STATE_INITIALIZED:=1): 'GUEST_VM_INFO_STATE_INITIALIZED'} +GUEST_VM_INFO_STATE: TypeAlias = ctypes.c_uint32 +struct_NV2080_GUEST_VM_INFO.register_fields([('vmPid', NvU32, 0), ('guestOs', NvU32, 4), ('migrationProhibited', NvU32, 8), ('guestNegotiatedVgpuVersion', NvU32, 12), ('frameRateLimit', NvU32, 16), ('licensed', NvBool, 20), ('licenseState', NvU32, 24), ('licenseExpiryTimestamp', NvU32, 28), ('licenseExpiryStatus', NvU8, 32), ('guestDriverVersion', c.Array[NvU8, Literal[32]], 33), ('guestDriverBranch', c.Array[NvU8, Literal[32]], 65), ('guestVmInfoState', GUEST_VM_INFO_STATE, 100)]) +NV2080_GUEST_VM_INFO: TypeAlias = struct_NV2080_GUEST_VM_INFO +@c.record +class struct_NV2080_HOST_VGPU_DEVICE(c.Struct): + SIZE = 48 + gfid: int + vgpuPciId: int + vgpuDeviceInstanceId: int + fbUsed: int + encoderCapacity: int + eccState: int + bDriverLoaded: int +struct_NV2080_HOST_VGPU_DEVICE.register_fields([('gfid', NvU32, 0), ('vgpuPciId', NvU64, 8), ('vgpuDeviceInstanceId', NvU32, 16), ('fbUsed', NvU64, 24), ('encoderCapacity', NvU32, 32), ('eccState', NvU32, 36), ('bDriverLoaded', NvBool, 40)]) +NV2080_HOST_VGPU_DEVICE: TypeAlias = struct_NV2080_HOST_VGPU_DEVICE +@c.record +class struct_NV2080_VGPU_GUEST(c.Struct): + SIZE = 152 + guestVmInfo: struct_NV2080_GUEST_VM_INFO + vgpuDevice: struct_NV2080_HOST_VGPU_DEVICE +struct_NV2080_VGPU_GUEST.register_fields([('guestVmInfo', NV2080_GUEST_VM_INFO, 0), ('vgpuDevice', NV2080_HOST_VGPU_DEVICE, 104)]) +NV2080_VGPU_GUEST: TypeAlias = struct_NV2080_VGPU_GUEST +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS(c.Struct): + SIZE = 4872 + numVgpu: int + vgpuGuest: c.Array[struct_NV2080_VGPU_GUEST, Literal[32]] +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS.register_fields([('numVgpu', NvU32, 0), ('vgpuGuest', c.Array[NV2080_VGPU_GUEST, Literal[32]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS +@c.record +class struct_NV2080_VGPU_FB_USAGE(c.Struct): + SIZE = 16 + gfid: int + fbUsed: int +struct_NV2080_VGPU_FB_USAGE.register_fields([('gfid', NvU32, 0), ('fbUsed', NvU64, 8)]) +NV2080_VGPU_FB_USAGE: TypeAlias = struct_NV2080_VGPU_FB_USAGE +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS(c.Struct): + SIZE = 520 + vgpuCount: int + vgpuFbUsage: c.Array[struct_NV2080_VGPU_FB_USAGE, Literal[32]] +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS.register_fields([('vgpuCount', NvU32, 0), ('vgpuFbUsage', c.Array[NV2080_VGPU_FB_USAGE, Literal[32]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS(c.Struct): + SIZE = 8 + gfid: int + encoderCapacity: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS.register_fields([('gfid', NvU32, 0), ('encoderCapacity', NvU32, 4)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS(c.Struct): + SIZE = 260 + pgpuString: c.Array[ctypes.c_ubyte, Literal[256]] + pgpuStringSize: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS.register_fields([('pgpuString', c.Array[NvU8, Literal[256]], 0), ('pgpuStringSize', NvU32, 256)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS(c.Struct): + SIZE = 1 + bIsMigrationSupported: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS.register_fields([('bIsMigrationSupported', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bSupportHeterogeneousTimeSlicedVgpuTypes: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS.register_fields([('bSupportHeterogeneousTimeSlicedVgpuTypes', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS(c.Struct): + SIZE = 8 + gfid: int + flags: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS.register_fields([('gfid', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS(c.Struct): + SIZE = 1 + bFlrDisabled: int +struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS.register_fields([('bFlrDisabled', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 1 + bHeterogeneousMode: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS(c.Struct): + SIZE = 4 + exceptionMask: int +struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS.register_fields([('exceptionMask', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS +@c.record +class struct_NV83DE_SM_ERROR_STATE_REGISTERS(c.Struct): + SIZE = 48 + hwwGlobalEsr: int + hwwWarpEsr: int + hwwWarpEsrPc: int + hwwGlobalEsrReportMask: int + hwwWarpEsrReportMask: int + hwwEsrAddr: int + hwwWarpEsrPc64: int + hwwCgaEsr: int + hwwCgaEsrReportMask: int +struct_NV83DE_SM_ERROR_STATE_REGISTERS.register_fields([('hwwGlobalEsr', NvU32, 0), ('hwwWarpEsr', NvU32, 4), ('hwwWarpEsrPc', NvU32, 8), ('hwwGlobalEsrReportMask', NvU32, 12), ('hwwWarpEsrReportMask', NvU32, 16), ('hwwEsrAddr', NvU64, 24), ('hwwWarpEsrPc64', NvU64, 32), ('hwwCgaEsr', NvU32, 40), ('hwwCgaEsrReportMask', NvU32, 44)]) +NV83DE_SM_ERROR_STATE_REGISTERS: TypeAlias = struct_NV83DE_SM_ERROR_STATE_REGISTERS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS(c.Struct): + SIZE = 56 + hTargetChannel: int + smID: int + smErrorState: struct_NV83DE_SM_ERROR_STATE_REGISTERS +struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('smID', NvU32, 4), ('smErrorState', NV83DE_SM_ERROR_STATE_REGISTERS, 8)]) +NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS +@c.record +class struct_NV83DE_MMU_FAULT_INFO(c.Struct): + SIZE = 8 + valid: int + faultInfo: int +struct_NV83DE_MMU_FAULT_INFO.register_fields([('valid', NvBool, 0), ('faultInfo', NvU32, 4)]) +NV83DE_MMU_FAULT_INFO: TypeAlias = struct_NV83DE_MMU_FAULT_INFO +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS(c.Struct): + SIZE = 4824 + hTargetChannel: int + numSMsToRead: int + smErrorStateArray: c.Array[struct_NV83DE_SM_ERROR_STATE_REGISTERS, Literal[100]] + mmuFaultInfo: int + mmuFault: struct_NV83DE_MMU_FAULT_INFO + startingSM: int +struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('numSMsToRead', NvU32, 4), ('smErrorStateArray', c.Array[NV83DE_SM_ERROR_STATE_REGISTERS, Literal[100]], 8), ('mmuFaultInfo', NvU32, 4808), ('mmuFault', NV83DE_MMU_FAULT_INFO, 4812), ('startingSM', NvU32, 4820)]) +NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS(c.Struct): + SIZE = 8 + hTargetChannel: int + smID: int +struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('smID', NvU32, 4)]) +NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS(c.Struct): + SIZE = 8 + hTargetChannel: int + numSMsToClear: int +struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('numSMsToClear', NvU32, 4)]) +NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS +@c.record +class struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS(c.Struct): + SIZE = 8 + waitForEvent: int + hResidentChannel: int +struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS.register_fields([('waitForEvent', NvU32, 0), ('hResidentChannel', NvHandle, 4)]) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS: TypeAlias = struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS(c.Struct): + SIZE = 4 + stopTriggerType: int +struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS.register_fields([('stopTriggerType', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS(c.Struct): + SIZE = 4 + singleStepHandling: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS.register_fields([('singleStepHandling', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS(c.Struct): + SIZE = 24 + hMemory: int + length: int + offset: int + buffer: ctypes.c_void_p +struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS.register_fields([('hMemory', NvU32, 0), ('length', NvU32, 4), ('offset', NvU64, 8), ('buffer', NvP64, 16)]) +NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS(c.Struct): + SIZE = 24 + hMemory: int + length: int + offset: int + buffer: ctypes.c_void_p +struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS.register_fields([('hMemory', NvU32, 0), ('length', NvU32, 4), ('offset', NvU64, 8), ('buffer', NvP64, 16)]) +NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS: TypeAlias = struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS(c.Struct): + SIZE = 8 + hChannel: int + hSubdevice: int +struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('hSubdevice', NvHandle, 4)]) +NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_OP(c.Struct): + SIZE = 24 + gpuVA: int + pCpuVA: ctypes.c_void_p + size: int + valid: int +struct_NV83DE_CTRL_DEBUG_ACCESS_OP.register_fields([('gpuVA', NvU64, 0), ('pCpuVA', NvP64, 8), ('size', NvU32, 16), ('valid', NvU32, 20)]) +NV83DE_CTRL_DEBUG_ACCESS_OP: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_OP +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS(c.Struct): + SIZE = 1544 + count: int + opsBuffer: c.Array[struct_NV83DE_CTRL_DEBUG_ACCESS_OP, Literal[64]] +struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS.register_fields([('count', NvU32, 0), ('opsBuffer', c.Array[NV83DE_CTRL_DEBUG_ACCESS_OP, Literal[64]], 8)]) +NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP(c.Struct): + SIZE = 16 + gpuVA: int + size: int +struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP.register_fields([('gpuVA', NvU64, 0), ('size', NvU32, 8)]) +NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS(c.Struct): + SIZE = 1048 + vaLo: int + vaHi: int + count: int + hasMore: int + opsBuffer: c.Array[struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP, Literal[64]] +struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS.register_fields([('vaLo', NvU64, 0), ('vaHi', NvU64, 8), ('count', NvU32, 16), ('hasMore', NvU32, 20), ('opsBuffer', c.Array[NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP, Literal[64]], 24)]) +NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS +@c.record +class struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 3208 + bNonTransactional: int + regOpCount: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[100]] +struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS.register_fields([('bNonTransactional', NvBool, 0), ('regOpCount', NvU32, 4), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[100]], 8)]) +NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS(c.Struct): + SIZE = 8 + smID: int + bSingleStep: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS.register_fields([('smID', NvU32, 0), ('bSingleStep', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS(c.Struct): + SIZE = 8 + smID: int + bStopTrigger: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS.register_fields([('smID', NvU32, 0), ('bStopTrigger', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS(c.Struct): + SIZE = 8 + smID: int + bRunTrigger: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS.register_fields([('smID', NvU32, 0), ('bRunTrigger', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS(c.Struct): + SIZE = 8 + smID: int + bSkipIdleWarpDetect: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS.register_fields([('smID', NvU32, 0), ('bSkipIdleWarpDetect', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS(c.Struct): + SIZE = 5 + bInTrapMode: int + bCrsFlushDone: int + bRunTriggerInProgress: int + bComputeContext: int + bLockedDown: int +struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS.register_fields([('bInTrapMode', NvBool, 0), ('bCrsFlushDone', NvBool, 1), ('bRunTriggerInProgress', NvBool, 2), ('bComputeContext', NvBool, 3), ('bLockedDown', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS(c.Struct): + SIZE = 12 + smID: int + smDebuggerStatus: struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS +struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS.register_fields([('smID', NvU32, 0), ('smDebuggerStatus', NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS, 4)]) +NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY(c.Struct): + SIZE = 24 + hMemory: int + length: int + memOffset: int + dataOffset: int + status: int +struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY.register_fields([('hMemory', NvHandle, 0), ('length', NvU32, 4), ('memOffset', NvU64, 8), ('dataOffset', NvU32, 16), ('status', NV_STATUS, 20)]) +NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS(c.Struct): + SIZE = 3616 + pData: ctypes.c_void_p + dataLength: int + count: int + entries: c.Array[struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY, Literal[150]] +struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS.register_fields([('pData', NvP64, 0), ('dataLength', NvU32, 8), ('count', NvU32, 12), ('entries', c.Array[NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY, Literal[150]], 16)]) +NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY(c.Struct): + SIZE = 16 + faultAddress: int + faultType: int + accessType: int +struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY.register_fields([('faultAddress', NvU64, 0), ('faultType', NvU32, 8), ('accessType', NvU32, 12)]) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS(c.Struct): + SIZE = 72 + mmuFaultInfoList: c.Array[struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY, Literal[4]] + count: int +struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS.register_fields([('mmuFaultInfoList', c.Array[NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY, Literal[4]], 0), ('count', NvU32, 64)]) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS(c.Struct): + SIZE = 1 + bDropDeferredRc: int +struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS.register_fields([('bDropDeferredRc', NvBool, 0)]) +NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS +@c.record +class struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS(c.Struct): + SIZE = 56 + params: struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS(c.Struct): + SIZE = 56 + hMemPmaBuffer: int + pmaBufferOffset: int + pmaBufferSize: int + hMemPmaBytesAvailable: int + pmaBytesAvailableOffset: int + ctxsw: int + pmaChannelIdx: int + pmaBufferVA: int +NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS +struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS.register_fields([('hMemPmaBuffer', NvHandle, 0), ('pmaBufferOffset', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('hMemPmaBytesAvailable', NvHandle, 24), ('pmaBytesAvailableOffset', NvU64, 32), ('ctxsw', NvBool, 40), ('pmaChannelIdx', NvU32, 44), ('pmaBufferVA', NvU64, 48)]) +struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS.register_fields([('params', NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS, 0)]) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS: TypeAlias = struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS(c.Struct): + SIZE = 8 + pmaChannelIdx: int + bMembytesPollingRequired: int +struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0), ('bMembytesPollingRequired', NvBool, 4)]) +NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 48 + pmaChannelIdx: int + pmaBufferVA: int + pmaBufferSize: int + membytesVA: int + hwpmIBPA: int + hwpmIBAperture: int +struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0), ('pmaBufferVA', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('membytesVA', NvU64, 24), ('hwpmIBPA', NvU64, 32), ('hwpmIBAperture', NvU8, 40)]) +NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS(c.Struct): + SIZE = 5 + bAdminProfilingPermitted: int + bDevProfilingPermitted: int + bCtxProfilingPermitted: int + bVideoMemoryProfilingPermitted: int + bSysMemoryProfilingPermitted: int +struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS.register_fields([('bAdminProfilingPermitted', NvBool, 0), ('bDevProfilingPermitted', NvBool, 1), ('bCtxProfilingPermitted', NvBool, 2), ('bVideoMemoryProfilingPermitted', NvBool, 3), ('bSysMemoryProfilingPermitted', NvBool, 4)]) +NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS(c.Struct): + SIZE = 64 + hMemPmaBuffer: int + pmaBufferOffset: int + pmaBufferSize: int + hMemPmaBytesAvailable: int + pmaBytesAvailableOffset: int + ctxsw: int + pmaChannelIdx: int + pmaBufferVA: int + bInputPmaChIdx: int +struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS.register_fields([('hMemPmaBuffer', NvHandle, 0), ('pmaBufferOffset', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('hMemPmaBytesAvailable', NvHandle, 24), ('pmaBytesAvailableOffset', NvU64, 32), ('ctxsw', NvBool, 40), ('pmaChannelIdx', NvU32, 44), ('pmaBufferVA', NvU64, 48), ('bInputPmaChIdx', NvBool, 56)]) +NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 4 + pmaChannelIdx: int +struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0)]) +NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS(c.Struct): + SIZE = 4 + maxPmaChannels: int +struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS.register_fields([('maxPmaChannels', NvU32, 0)]) +NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS +@c.record +class struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS(c.Struct): + SIZE = 12 + globalStatus: int + controlMask: int + statusMask: int +struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS.register_fields([('globalStatus', NvU32, 0), ('controlMask', NvU32, 4), ('statusMask', NvU32, 8)]) +NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS +@c.record +class struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS(c.Struct): + SIZE = 4 + controlMask: int +struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS.register_fields([('controlMask', NvU32, 0)]) +NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS +@c.record +class struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 4 + pmaChannelIdx: int +struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0)]) +NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS(c.Struct): + SIZE = 48 + bytesConsumed: int + bUpdateAvailableBytes: int + bWait: int + bytesAvailable: int + bReturnPut: int + putPtr: int + pmaChannelIdx: int + bOverflowStatus: int +struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS.register_fields([('bytesConsumed', NvU64, 0), ('bUpdateAvailableBytes', NvBool, 8), ('bWait', NvBool, 9), ('bytesAvailable', NvU64, 16), ('bReturnPut', NvBool, 24), ('putPtr', NvU64, 32), ('pmaChannelIdx', NvU32, 40), ('bOverflowStatus', NvBool, 44)]) +NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS +NVB0CC_GPU_REG_OP: TypeAlias = struct_NV2080_CTRL_GPU_REG_OP +enum_NVB0CC_REGOPS_MODE: dict[int, str] = {(NVB0CC_REGOPS_MODE_ALL_OR_NONE:=0): 'NVB0CC_REGOPS_MODE_ALL_OR_NONE', (NVB0CC_REGOPS_MODE_CONTINUE_ON_ERROR:=1): 'NVB0CC_REGOPS_MODE_CONTINUE_ON_ERROR'} +NVB0CC_REGOPS_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 3980 + regOpCount: int + mode: int + bPassed: int + bDirect: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[124]] +struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS.register_fields([('regOpCount', NvU32, 0), ('mode', NVB0CC_REGOPS_MODE, 4), ('bPassed', NvBool, 8), ('bDirect', NvBool, 9), ('regOps', c.Array[NVB0CC_GPU_REG_OP, Literal[124]], 12)]) +NVB0CC_CTRL_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS +@c.record +class struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS(c.Struct): + SIZE = 4 + numCredits: int +struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS.register_fields([('numCredits', NvU32, 0)]) +NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS +enum_NVB0CC_CHIPLET_TYPE: dict[int, str] = {(NVB0CC_CHIPLET_TYPE_INVALID:=0): 'NVB0CC_CHIPLET_TYPE_INVALID', (NVB0CC_CHIPLET_TYPE_FBP:=1): 'NVB0CC_CHIPLET_TYPE_FBP', (NVB0CC_CHIPLET_TYPE_GPC:=2): 'NVB0CC_CHIPLET_TYPE_GPC', (NVB0CC_CHIPLET_TYPE_SYS:=3): 'NVB0CC_CHIPLET_TYPE_SYS'} +NVB0CC_CHIPLET_TYPE: TypeAlias = ctypes.c_uint32 +enum_NVB0CC_HS_CREDITS_CMD_STATUS: dict[int, str] = {(NVB0CC_HS_CREDITS_CMD_STATUS_OK:=0): 'NVB0CC_HS_CREDITS_CMD_STATUS_OK', (NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CREDITS:=1): 'NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CREDITS', (NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CHIPLET:=2): 'NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CHIPLET'} +NVB0CC_HS_CREDITS_CMD_STATUS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO(c.Struct): + SIZE = 4 + chipletType: int + chipletIndex: int + numCredits: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO.register_fields([('chipletType', NvU8, 0), ('chipletIndex', NvU8, 1), ('numCredits', NvU16, 2)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS(c.Struct): + SIZE = 2 + status: int + entryIndex: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS.register_fields([('status', NvU8, 0), ('entryIndex', NvU8, 1)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS +@c.record +class struct_NVB0CC_CTRL_HS_CREDITS_PARAMS(c.Struct): + SIZE = 256 + pmaChannelIdx: int + numEntries: int + statusInfo: struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS + creditInfo: c.Array[struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO, Literal[63]] +struct_NVB0CC_CTRL_HS_CREDITS_PARAMS.register_fields([('pmaChannelIdx', NvU8, 0), ('numEntries', NvU8, 1), ('statusInfo', NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS, 2), ('creditInfo', c.Array[NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO, Literal[63]], 4)]) +NVB0CC_CTRL_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +NVB0CC_CTRL_SET_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +NVB0CC_CTRL_GET_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +enum_NVB0CC_CTRL_HES_TYPE: dict[int, str] = {(NVB0CC_CTRL_HES_INVALID:=0): 'NVB0CC_CTRL_HES_INVALID', (NVB0CC_CTRL_HES_CWD:=1): 'NVB0CC_CTRL_HES_CWD'} +NVB0CC_CTRL_HES_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS +@c.record +class union_NVB0CC_CTRL_HES_RESERVATION_UNION(c.Struct): + SIZE = 1 + cwd: struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS +union_NVB0CC_CTRL_HES_RESERVATION_UNION.register_fields([('cwd', NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS, 0)]) +NVB0CC_CTRL_HES_RESERVATION_UNION: TypeAlias = union_NVB0CC_CTRL_HES_RESERVATION_UNION +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_PARAMS(c.Struct): + SIZE = 8 + type: int + reserveParams: union_NVB0CC_CTRL_HES_RESERVATION_UNION +struct_NVB0CC_CTRL_RESERVE_HES_PARAMS.register_fields([('type', NvU32, 0), ('reserveParams', NVB0CC_CTRL_HES_RESERVATION_UNION, 4)]) +NVB0CC_CTRL_RESERVE_HES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_PARAMS +@c.record +class struct_NVB0CC_CTRL_RELEASE_HES_PARAMS(c.Struct): + SIZE = 4 + type: int +struct_NVB0CC_CTRL_RELEASE_HES_PARAMS.register_fields([('type', NVB0CC_CTRL_HES_TYPE, 0)]) +NVB0CC_CTRL_RELEASE_HES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RELEASE_HES_PARAMS +@c.record +class struct_NVB0CC_CTRL_CREDIT_POOL_INFO(c.Struct): + SIZE = 4 + numCredits: int + poolIndex: int + chipletType: int +struct_NVB0CC_CTRL_CREDIT_POOL_INFO.register_fields([('numCredits', NvU16, 0), ('poolIndex', NvU8, 2), ('chipletType', NvU8, 3)]) +NVB0CC_CTRL_CREDIT_POOL_INFO: TypeAlias = struct_NVB0CC_CTRL_CREDIT_POOL_INFO +@c.record +class struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL(c.Struct): + SIZE = 124 + poolInfos: c.Array[struct_NVB0CC_CTRL_CREDIT_POOL_INFO, Literal[30]] + poolInfosCount: int +struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL.register_fields([('poolInfos', c.Array[NVB0CC_CTRL_CREDIT_POOL_INFO, Literal[30]], 0), ('poolInfosCount', NvU32, 120)]) +NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL: TypeAlias = struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO(c.Struct): + SIZE = 3 + chipletType: int + chipletIndex: int + poolIndex: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO.register_fields([('chipletType', NvU8, 0), ('chipletIndex', NvU8, 1), ('poolIndex', NvU8, 2)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO +@c.record +class struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS(c.Struct): + SIZE = 194 + numQueries: int + statusInfo: struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS + queries: c.Array[struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO, Literal[63]] +struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS.register_fields([('numQueries', NvU16, 0), ('statusInfo', NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS, 2), ('queries', c.Array[NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO, Literal[63]], 4)]) +NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS +@c.record +class struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS(c.Struct): + SIZE = 1 + disable: int +struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS.register_fields([('disable', NvBool, 0)]) +NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS: TypeAlias = struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS +@c.record +class struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS(c.Struct): + SIZE = 1 + enabled: int +struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS.register_fields([('enabled', NvBool, 0)]) +NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS +nv_status_codes: dict[int, str] = {(NV_OK:=0): 'NV_OK', (NV_ERR_GENERIC:=65535): 'NV_ERR_GENERIC', (NV_ERR_BROKEN_FB:=1): 'NV_ERR_BROKEN_FB', (NV_ERR_BUFFER_TOO_SMALL:=2): 'NV_ERR_BUFFER_TOO_SMALL', (NV_ERR_BUSY_RETRY:=3): 'NV_ERR_BUSY_RETRY', (NV_ERR_CALLBACK_NOT_SCHEDULED:=4): 'NV_ERR_CALLBACK_NOT_SCHEDULED', (NV_ERR_CARD_NOT_PRESENT:=5): 'NV_ERR_CARD_NOT_PRESENT', (NV_ERR_CYCLE_DETECTED:=6): 'NV_ERR_CYCLE_DETECTED', (NV_ERR_DMA_IN_USE:=7): 'NV_ERR_DMA_IN_USE', (NV_ERR_DMA_MEM_NOT_LOCKED:=8): 'NV_ERR_DMA_MEM_NOT_LOCKED', (NV_ERR_DMA_MEM_NOT_UNLOCKED:=9): 'NV_ERR_DMA_MEM_NOT_UNLOCKED', (NV_ERR_DUAL_LINK_INUSE:=10): 'NV_ERR_DUAL_LINK_INUSE', (NV_ERR_ECC_ERROR:=11): 'NV_ERR_ECC_ERROR', (NV_ERR_FIFO_BAD_ACCESS:=12): 'NV_ERR_FIFO_BAD_ACCESS', (NV_ERR_FREQ_NOT_SUPPORTED:=13): 'NV_ERR_FREQ_NOT_SUPPORTED', (NV_ERR_GPU_DMA_NOT_INITIALIZED:=14): 'NV_ERR_GPU_DMA_NOT_INITIALIZED', (NV_ERR_GPU_IS_LOST:=15): 'NV_ERR_GPU_IS_LOST', (NV_ERR_GPU_IN_FULLCHIP_RESET:=16): 'NV_ERR_GPU_IN_FULLCHIP_RESET', (NV_ERR_GPU_NOT_FULL_POWER:=17): 'NV_ERR_GPU_NOT_FULL_POWER', (NV_ERR_GPU_UUID_NOT_FOUND:=18): 'NV_ERR_GPU_UUID_NOT_FOUND', (NV_ERR_HOT_SWITCH:=19): 'NV_ERR_HOT_SWITCH', (NV_ERR_I2C_ERROR:=20): 'NV_ERR_I2C_ERROR', (NV_ERR_I2C_SPEED_TOO_HIGH:=21): 'NV_ERR_I2C_SPEED_TOO_HIGH', (NV_ERR_ILLEGAL_ACTION:=22): 'NV_ERR_ILLEGAL_ACTION', (NV_ERR_IN_USE:=23): 'NV_ERR_IN_USE', (NV_ERR_INFLATE_COMPRESSED_DATA_FAILED:=24): 'NV_ERR_INFLATE_COMPRESSED_DATA_FAILED', (NV_ERR_INSERT_DUPLICATE_NAME:=25): 'NV_ERR_INSERT_DUPLICATE_NAME', (NV_ERR_INSUFFICIENT_RESOURCES:=26): 'NV_ERR_INSUFFICIENT_RESOURCES', (NV_ERR_INSUFFICIENT_PERMISSIONS:=27): 'NV_ERR_INSUFFICIENT_PERMISSIONS', (NV_ERR_INSUFFICIENT_POWER:=28): 'NV_ERR_INSUFFICIENT_POWER', (NV_ERR_INVALID_ACCESS_TYPE:=29): 'NV_ERR_INVALID_ACCESS_TYPE', (NV_ERR_INVALID_ADDRESS:=30): 'NV_ERR_INVALID_ADDRESS', (NV_ERR_INVALID_ARGUMENT:=31): 'NV_ERR_INVALID_ARGUMENT', (NV_ERR_INVALID_BASE:=32): 'NV_ERR_INVALID_BASE', (NV_ERR_INVALID_CHANNEL:=33): 'NV_ERR_INVALID_CHANNEL', (NV_ERR_INVALID_CLASS:=34): 'NV_ERR_INVALID_CLASS', (NV_ERR_INVALID_CLIENT:=35): 'NV_ERR_INVALID_CLIENT', (NV_ERR_INVALID_COMMAND:=36): 'NV_ERR_INVALID_COMMAND', (NV_ERR_INVALID_DATA:=37): 'NV_ERR_INVALID_DATA', (NV_ERR_INVALID_DEVICE:=38): 'NV_ERR_INVALID_DEVICE', (NV_ERR_INVALID_DMA_SPECIFIER:=39): 'NV_ERR_INVALID_DMA_SPECIFIER', (NV_ERR_INVALID_EVENT:=40): 'NV_ERR_INVALID_EVENT', (NV_ERR_INVALID_FLAGS:=41): 'NV_ERR_INVALID_FLAGS', (NV_ERR_INVALID_FUNCTION:=42): 'NV_ERR_INVALID_FUNCTION', (NV_ERR_INVALID_HEAP:=43): 'NV_ERR_INVALID_HEAP', (NV_ERR_INVALID_INDEX:=44): 'NV_ERR_INVALID_INDEX', (NV_ERR_INVALID_IRQ_LEVEL:=45): 'NV_ERR_INVALID_IRQ_LEVEL', (NV_ERR_INVALID_LIMIT:=46): 'NV_ERR_INVALID_LIMIT', (NV_ERR_INVALID_LOCK_STATE:=47): 'NV_ERR_INVALID_LOCK_STATE', (NV_ERR_INVALID_METHOD:=48): 'NV_ERR_INVALID_METHOD', (NV_ERR_INVALID_OBJECT:=49): 'NV_ERR_INVALID_OBJECT', (NV_ERR_INVALID_OBJECT_BUFFER:=50): 'NV_ERR_INVALID_OBJECT_BUFFER', (NV_ERR_INVALID_OBJECT_HANDLE:=51): 'NV_ERR_INVALID_OBJECT_HANDLE', (NV_ERR_INVALID_OBJECT_NEW:=52): 'NV_ERR_INVALID_OBJECT_NEW', (NV_ERR_INVALID_OBJECT_OLD:=53): 'NV_ERR_INVALID_OBJECT_OLD', (NV_ERR_INVALID_OBJECT_PARENT:=54): 'NV_ERR_INVALID_OBJECT_PARENT', (NV_ERR_INVALID_OFFSET:=55): 'NV_ERR_INVALID_OFFSET', (NV_ERR_INVALID_OPERATION:=56): 'NV_ERR_INVALID_OPERATION', (NV_ERR_INVALID_OWNER:=57): 'NV_ERR_INVALID_OWNER', (NV_ERR_INVALID_PARAM_STRUCT:=58): 'NV_ERR_INVALID_PARAM_STRUCT', (NV_ERR_INVALID_PARAMETER:=59): 'NV_ERR_INVALID_PARAMETER', (NV_ERR_INVALID_PATH:=60): 'NV_ERR_INVALID_PATH', (NV_ERR_INVALID_POINTER:=61): 'NV_ERR_INVALID_POINTER', (NV_ERR_INVALID_REGISTRY_KEY:=62): 'NV_ERR_INVALID_REGISTRY_KEY', (NV_ERR_INVALID_REQUEST:=63): 'NV_ERR_INVALID_REQUEST', (NV_ERR_INVALID_STATE:=64): 'NV_ERR_INVALID_STATE', (NV_ERR_INVALID_STRING_LENGTH:=65): 'NV_ERR_INVALID_STRING_LENGTH', (NV_ERR_INVALID_READ:=66): 'NV_ERR_INVALID_READ', (NV_ERR_INVALID_WRITE:=67): 'NV_ERR_INVALID_WRITE', (NV_ERR_INVALID_XLATE:=68): 'NV_ERR_INVALID_XLATE', (NV_ERR_IRQ_NOT_FIRING:=69): 'NV_ERR_IRQ_NOT_FIRING', (NV_ERR_IRQ_EDGE_TRIGGERED:=70): 'NV_ERR_IRQ_EDGE_TRIGGERED', (NV_ERR_MEMORY_TRAINING_FAILED:=71): 'NV_ERR_MEMORY_TRAINING_FAILED', (NV_ERR_MISMATCHED_SLAVE:=72): 'NV_ERR_MISMATCHED_SLAVE', (NV_ERR_MISMATCHED_TARGET:=73): 'NV_ERR_MISMATCHED_TARGET', (NV_ERR_MISSING_TABLE_ENTRY:=74): 'NV_ERR_MISSING_TABLE_ENTRY', (NV_ERR_MODULE_LOAD_FAILED:=75): 'NV_ERR_MODULE_LOAD_FAILED', (NV_ERR_MORE_DATA_AVAILABLE:=76): 'NV_ERR_MORE_DATA_AVAILABLE', (NV_ERR_MORE_PROCESSING_REQUIRED:=77): 'NV_ERR_MORE_PROCESSING_REQUIRED', (NV_ERR_MULTIPLE_MEMORY_TYPES:=78): 'NV_ERR_MULTIPLE_MEMORY_TYPES', (NV_ERR_NO_FREE_FIFOS:=79): 'NV_ERR_NO_FREE_FIFOS', (NV_ERR_NO_INTR_PENDING:=80): 'NV_ERR_NO_INTR_PENDING', (NV_ERR_NO_MEMORY:=81): 'NV_ERR_NO_MEMORY', (NV_ERR_NO_SUCH_DOMAIN:=82): 'NV_ERR_NO_SUCH_DOMAIN', (NV_ERR_NO_VALID_PATH:=83): 'NV_ERR_NO_VALID_PATH', (NV_ERR_NOT_COMPATIBLE:=84): 'NV_ERR_NOT_COMPATIBLE', (NV_ERR_NOT_READY:=85): 'NV_ERR_NOT_READY', (NV_ERR_NOT_SUPPORTED:=86): 'NV_ERR_NOT_SUPPORTED', (NV_ERR_OBJECT_NOT_FOUND:=87): 'NV_ERR_OBJECT_NOT_FOUND', (NV_ERR_OBJECT_TYPE_MISMATCH:=88): 'NV_ERR_OBJECT_TYPE_MISMATCH', (NV_ERR_OPERATING_SYSTEM:=89): 'NV_ERR_OPERATING_SYSTEM', (NV_ERR_OTHER_DEVICE_FOUND:=90): 'NV_ERR_OTHER_DEVICE_FOUND', (NV_ERR_OUT_OF_RANGE:=91): 'NV_ERR_OUT_OF_RANGE', (NV_ERR_OVERLAPPING_UVM_COMMIT:=92): 'NV_ERR_OVERLAPPING_UVM_COMMIT', (NV_ERR_PAGE_TABLE_NOT_AVAIL:=93): 'NV_ERR_PAGE_TABLE_NOT_AVAIL', (NV_ERR_PID_NOT_FOUND:=94): 'NV_ERR_PID_NOT_FOUND', (NV_ERR_PROTECTION_FAULT:=95): 'NV_ERR_PROTECTION_FAULT', (NV_ERR_RC_ERROR:=96): 'NV_ERR_RC_ERROR', (NV_ERR_REJECTED_VBIOS:=97): 'NV_ERR_REJECTED_VBIOS', (NV_ERR_RESET_REQUIRED:=98): 'NV_ERR_RESET_REQUIRED', (NV_ERR_STATE_IN_USE:=99): 'NV_ERR_STATE_IN_USE', (NV_ERR_SIGNAL_PENDING:=100): 'NV_ERR_SIGNAL_PENDING', (NV_ERR_TIMEOUT:=101): 'NV_ERR_TIMEOUT', (NV_ERR_TIMEOUT_RETRY:=102): 'NV_ERR_TIMEOUT_RETRY', (NV_ERR_TOO_MANY_PRIMARIES:=103): 'NV_ERR_TOO_MANY_PRIMARIES', (NV_ERR_UVM_ADDRESS_IN_USE:=104): 'NV_ERR_UVM_ADDRESS_IN_USE', (NV_ERR_MAX_SESSION_LIMIT_REACHED:=105): 'NV_ERR_MAX_SESSION_LIMIT_REACHED', (NV_ERR_LIB_RM_VERSION_MISMATCH:=106): 'NV_ERR_LIB_RM_VERSION_MISMATCH', (NV_ERR_PRIV_SEC_VIOLATION:=107): 'NV_ERR_PRIV_SEC_VIOLATION', (NV_ERR_GPU_IN_DEBUG_MODE:=108): 'NV_ERR_GPU_IN_DEBUG_MODE', (NV_ERR_FEATURE_NOT_ENABLED:=109): 'NV_ERR_FEATURE_NOT_ENABLED', (NV_ERR_RESOURCE_LOST:=110): 'NV_ERR_RESOURCE_LOST', (NV_ERR_PMU_NOT_READY:=111): 'NV_ERR_PMU_NOT_READY', (NV_ERR_FLCN_ERROR:=112): 'NV_ERR_FLCN_ERROR', (NV_ERR_FATAL_ERROR:=113): 'NV_ERR_FATAL_ERROR', (NV_ERR_MEMORY_ERROR:=114): 'NV_ERR_MEMORY_ERROR', (NV_ERR_INVALID_LICENSE:=115): 'NV_ERR_INVALID_LICENSE', (NV_ERR_NVLINK_INIT_ERROR:=116): 'NV_ERR_NVLINK_INIT_ERROR', (NV_ERR_NVLINK_MINION_ERROR:=117): 'NV_ERR_NVLINK_MINION_ERROR', (NV_ERR_NVLINK_CLOCK_ERROR:=118): 'NV_ERR_NVLINK_CLOCK_ERROR', (NV_ERR_NVLINK_TRAINING_ERROR:=119): 'NV_ERR_NVLINK_TRAINING_ERROR', (NV_ERR_NVLINK_CONFIGURATION_ERROR:=120): 'NV_ERR_NVLINK_CONFIGURATION_ERROR', (NV_ERR_RISCV_ERROR:=121): 'NV_ERR_RISCV_ERROR', (NV_ERR_FABRIC_MANAGER_NOT_PRESENT:=122): 'NV_ERR_FABRIC_MANAGER_NOT_PRESENT', (NV_ERR_ALREADY_SIGNALLED:=123): 'NV_ERR_ALREADY_SIGNALLED', (NV_ERR_QUEUE_TASK_SLOT_NOT_AVAILABLE:=124): 'NV_ERR_QUEUE_TASK_SLOT_NOT_AVAILABLE', (NV_ERR_KEY_ROTATION_IN_PROGRESS:=125): 'NV_ERR_KEY_ROTATION_IN_PROGRESS', (NV_ERR_TEST_ONLY_CODE_NOT_ENABLED:=126): 'NV_ERR_TEST_ONLY_CODE_NOT_ENABLED', (NV_ERR_SECURE_BOOT_FAILED:=127): 'NV_ERR_SECURE_BOOT_FAILED', (NV_ERR_INSUFFICIENT_ZBC_ENTRY:=128): 'NV_ERR_INSUFFICIENT_ZBC_ENTRY', (NV_ERR_NVLINK_FABRIC_NOT_READY:=129): 'NV_ERR_NVLINK_FABRIC_NOT_READY', (NV_ERR_NVLINK_FABRIC_FAILURE:=130): 'NV_ERR_NVLINK_FABRIC_FAILURE', (NV_ERR_GPU_MEMORY_ONLINING_FAILURE:=131): 'NV_ERR_GPU_MEMORY_ONLINING_FAILURE', (NV_ERR_REDUCTION_MANAGER_NOT_AVAILABLE:=132): 'NV_ERR_REDUCTION_MANAGER_NOT_AVAILABLE', (NV_WARN_HOT_SWITCH:=65537): 'NV_WARN_HOT_SWITCH', (NV_WARN_INCORRECT_PERFMON_DATA:=65538): 'NV_WARN_INCORRECT_PERFMON_DATA', (NV_WARN_MISMATCHED_SLAVE:=65539): 'NV_WARN_MISMATCHED_SLAVE', (NV_WARN_MISMATCHED_TARGET:=65540): 'NV_WARN_MISMATCHED_TARGET', (NV_WARN_MORE_PROCESSING_REQUIRED:=65541): 'NV_WARN_MORE_PROCESSING_REQUIRED', (NV_WARN_NOTHING_TO_DO:=65542): 'NV_WARN_NOTHING_TO_DO', (NV_WARN_NULL_OBJECT:=65543): 'NV_WARN_NULL_OBJECT', (NV_WARN_OUT_OF_RANGE:=65544): 'NV_WARN_OUT_OF_RANGE'} +NVC9B0_VIDEO_DECODER = (0x0000C9B0) +NVC9B0_NOP = (0x00000100) +NVC9B0_NOP_PARAMETER = (31, 0) +NVC9B0_PM_TRIGGER = (0x00000140) +NVC9B0_PM_TRIGGER_V = (31, 0) +NVC9B0_SET_APPLICATION_ID = (0x00000200) +NVC9B0_SET_APPLICATION_ID_ID = (31, 0) +NVC9B0_SET_APPLICATION_ID_ID_MPEG12 = (0x00000001) +NVC9B0_SET_APPLICATION_ID_ID_VC1 = (0x00000002) +NVC9B0_SET_APPLICATION_ID_ID_H264 = (0x00000003) +NVC9B0_SET_APPLICATION_ID_ID_MPEG4 = (0x00000004) +NVC9B0_SET_APPLICATION_ID_ID_VP8 = (0x00000005) +NVC9B0_SET_APPLICATION_ID_ID_CTR64 = (0x00000006) +NVC9B0_SET_APPLICATION_ID_ID_HEVC = (0x00000007) +NVC9B0_SET_APPLICATION_ID_ID_NEW_H264 = (0x00000008) +NVC9B0_SET_APPLICATION_ID_ID_VP9 = (0x00000009) +NVC9B0_SET_APPLICATION_ID_ID_PASS1 = (0x0000000A) +NVC9B0_SET_APPLICATION_ID_ID_HEVC_PARSER = (0x0000000C) +NVC9B0_SET_APPLICATION_ID_ID_UCODE_TEST = (0x0000000D) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_DECRYPTAUDIO = (0x0000000E) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_DECRYPTAUDIOMULTIPLE = (0x0000000F) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_PREPROCESSENCRYPTEDDATA = (0x00000010) +NVC9B0_SET_APPLICATION_ID_ID_VP9_WITH_PARSER = (0x00000011) +NVC9B0_SET_APPLICATION_ID_ID_AVD = (0x00000012) +NVC9B0_SET_APPLICATION_ID_ID_HW_DRM_PR4_DECRYPTCONTENTMULTIPLE = (0x00000013) +NVC9B0_SET_APPLICATION_ID_ID_DHKE = (0x00000020) +NVC9B0_SET_WATCHDOG_TIMER = (0x00000204) +NVC9B0_SET_WATCHDOG_TIMER_TIMER = (31, 0) +NVC9B0_SEMAPHORE_A = (0x00000240) +NVC9B0_SEMAPHORE_A_UPPER = (7, 0) +NVC9B0_SEMAPHORE_B = (0x00000244) +NVC9B0_SEMAPHORE_B_LOWER = (31, 0) +NVC9B0_SEMAPHORE_C = (0x00000248) +NVC9B0_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC9B0_CTX_SAVE_AREA = (0x0000024C) +NVC9B0_CTX_SAVE_AREA_OFFSET = (31, 0) +NVC9B0_CTX_SWITCH = (0x00000250) +NVC9B0_CTX_SWITCH_OP = (1, 0) +NVC9B0_CTX_SWITCH_OP_CTX_UPDATE = (0x00000000) +NVC9B0_CTX_SWITCH_OP_CTX_SAVE = (0x00000001) +NVC9B0_CTX_SWITCH_OP_CTX_RESTORE = (0x00000002) +NVC9B0_CTX_SWITCH_OP_CTX_FORCERESTORE = (0x00000003) +NVC9B0_CTX_SWITCH_CTXID_VALID = (2, 2) +NVC9B0_CTX_SWITCH_CTXID_VALID_FALSE = (0x00000000) +NVC9B0_CTX_SWITCH_CTXID_VALID_TRUE = (0x00000001) +NVC9B0_CTX_SWITCH_RESERVED0 = (7, 3) +NVC9B0_CTX_SWITCH_CTX_ID = (23, 8) +NVC9B0_CTX_SWITCH_RESERVED1 = (31, 24) +NVC9B0_SET_SEMAPHORE_PAYLOAD_LOWER = (0x00000254) +NVC9B0_SET_SEMAPHORE_PAYLOAD_LOWER_PAYLOAD_LOWER = (31, 0) +NVC9B0_SET_SEMAPHORE_PAYLOAD_UPPER = (0x00000258) +NVC9B0_SET_SEMAPHORE_PAYLOAD_UPPER_PAYLOAD_UPPER = (31, 0) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_A = (0x0000025C) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_A_LOWER = (31, 0) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_B = (0x00000260) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_B_UPPER = (31, 0) +NVC9B0_EXECUTE = (0x00000300) +NVC9B0_EXECUTE_NOTIFY = (0, 0) +NVC9B0_EXECUTE_NOTIFY_DISABLE = (0x00000000) +NVC9B0_EXECUTE_NOTIFY_ENABLE = (0x00000001) +NVC9B0_EXECUTE_NOTIFY_ON = (1, 1) +NVC9B0_EXECUTE_NOTIFY_ON_END = (0x00000000) +NVC9B0_EXECUTE_NOTIFY_ON_BEGIN = (0x00000001) +NVC9B0_EXECUTE_PREDICATION = (2, 2) +NVC9B0_EXECUTE_PREDICATION_DISABLE = (0x00000000) +NVC9B0_EXECUTE_PREDICATION_ENABLE = (0x00000001) +NVC9B0_EXECUTE_PREDICATION_OP = (3, 3) +NVC9B0_EXECUTE_PREDICATION_OP_EQUAL_ZERO = (0x00000000) +NVC9B0_EXECUTE_PREDICATION_OP_NOT_EQUAL_ZERO = (0x00000001) +NVC9B0_EXECUTE_AWAKEN = (8, 8) +NVC9B0_EXECUTE_AWAKEN_DISABLE = (0x00000000) +NVC9B0_EXECUTE_AWAKEN_ENABLE = (0x00000001) +NVC9B0_SEMAPHORE_D = (0x00000304) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE = (1, 0) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_ONE = (0x00000000) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_FOUR = (0x00000001) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_TWO = (0x00000002) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE = (8, 8) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE_FALSE = (0x00000000) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE_TRUE = (0x00000001) +NVC9B0_SEMAPHORE_D_OPERATION = (17, 16) +NVC9B0_SEMAPHORE_D_OPERATION_RELEASE = (0x00000000) +NVC9B0_SEMAPHORE_D_OPERATION_RESERVED_0 = (0x00000001) +NVC9B0_SEMAPHORE_D_OPERATION_RESERVED_1 = (0x00000002) +NVC9B0_SEMAPHORE_D_OPERATION_TRAP = (0x00000003) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE = (21, 21) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE_FALSE = (0x00000000) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE_TRUE = (0x00000001) +NVC9B0_SEMAPHORE_D_TRAP_TYPE = (23, 22) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_UNCONDITIONAL = (0x00000000) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_CONDITIONAL = (0x00000001) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_CONDITIONAL_EXT = (0x00000002) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE = (24, 24) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE_32BIT = (0x00000000) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE_64BIT = (0x00000001) +NVC9B0_SET_PREDICATION_OFFSET_UPPER = (0x00000308) +NVC9B0_SET_PREDICATION_OFFSET_UPPER_OFFSET = (7, 0) +NVC9B0_SET_PREDICATION_OFFSET_LOWER = (0x0000030C) +NVC9B0_SET_PREDICATION_OFFSET_LOWER_OFFSET = (31, 0) +NVC9B0_SET_AUXILIARY_DATA_BUFFER = (0x00000310) +NVC9B0_SET_AUXILIARY_DATA_BUFFER_OFFSET = (31, 0) +NVC9B0_SET_CONTROL_PARAMS = (0x00000400) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE = (3, 0) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG1 = (0x00000000) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG2 = (0x00000001) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VC1 = (0x00000002) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_H264 = (0x00000003) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG4 = (0x00000004) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_DIVX3 = (0x00000004) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VP8 = (0x00000005) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_HEVC = (0x00000007) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VP9 = (0x00000009) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_AV1 = (0x0000000A) +NVC9B0_SET_CONTROL_PARAMS_GPTIMER_ON = (4, 4) +NVC9B0_SET_CONTROL_PARAMS_RET_ERROR = (5, 5) +NVC9B0_SET_CONTROL_PARAMS_ERR_CONCEAL_ON = (6, 6) +NVC9B0_SET_CONTROL_PARAMS_ERROR_FRM_IDX = (12, 7) +NVC9B0_SET_CONTROL_PARAMS_MBTIMER_ON = (13, 13) +NVC9B0_SET_CONTROL_PARAMS_EC_INTRA_FRAME_USING_PSLC = (14, 14) +NVC9B0_SET_CONTROL_PARAMS_IGNORE_SOME_FIELDS_CRC_CHECK = (15, 15) +NVC9B0_SET_CONTROL_PARAMS_EVENT_TRACE_LOGGING_ON = (16, 16) +NVC9B0_SET_CONTROL_PARAMS_ALL_INTRA_FRAME = (17, 17) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV = (19, 18) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV_TRACE3D_RUN = (0x00000000) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV_PROD_RUN = (0x00000001) +NVC9B0_SET_CONTROL_PARAMS_HINT_DUMP_EN = (20, 20) +NVC9B0_SET_CONTROL_PARAMS_RESERVED = (25, 21) +NVC9B0_SET_CONTROL_PARAMS_NVDECSIM_SKIP_SCP = (26, 26) +NVC9B0_SET_CONTROL_PARAMS_ENABLE_ENCRYPT = (27, 27) +NVC9B0_SET_CONTROL_PARAMS_ENCRYPTMODE = (31, 28) +NVC9B0_SET_DRV_PIC_SETUP_OFFSET = (0x00000404) +NVC9B0_SET_DRV_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_IN_BUF_BASE_OFFSET = (0x00000408) +NVC9B0_SET_IN_BUF_BASE_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_INDEX = (0x0000040C) +NVC9B0_SET_PICTURE_INDEX_INDEX = (31, 0) +NVC9B0_SET_SLICE_OFFSETS_BUF_OFFSET = (0x00000410) +NVC9B0_SET_SLICE_OFFSETS_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_COLOC_DATA_OFFSET = (0x00000414) +NVC9B0_SET_COLOC_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_HISTORY_OFFSET = (0x00000418) +NVC9B0_SET_HISTORY_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_SIZE = (0x0000041C) +NVC9B0_SET_DISPLAY_BUF_SIZE_SIZE = (31, 0) +NVC9B0_SET_HISTOGRAM_OFFSET = (0x00000420) +NVC9B0_SET_HISTOGRAM_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_NVDEC_STATUS_OFFSET = (0x00000424) +NVC9B0_SET_NVDEC_STATUS_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_LUMA_OFFSET = (0x00000428) +NVC9B0_SET_DISPLAY_BUF_LUMA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_CHROMA_OFFSET = (0x0000042C) +NVC9B0_SET_DISPLAY_BUF_CHROMA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET0 = (0x00000430) +NVC9B0_SET_PICTURE_LUMA_OFFSET0_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET1 = (0x00000434) +NVC9B0_SET_PICTURE_LUMA_OFFSET1_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET2 = (0x00000438) +NVC9B0_SET_PICTURE_LUMA_OFFSET2_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET3 = (0x0000043C) +NVC9B0_SET_PICTURE_LUMA_OFFSET3_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET4 = (0x00000440) +NVC9B0_SET_PICTURE_LUMA_OFFSET4_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET5 = (0x00000444) +NVC9B0_SET_PICTURE_LUMA_OFFSET5_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET6 = (0x00000448) +NVC9B0_SET_PICTURE_LUMA_OFFSET6_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET7 = (0x0000044C) +NVC9B0_SET_PICTURE_LUMA_OFFSET7_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET8 = (0x00000450) +NVC9B0_SET_PICTURE_LUMA_OFFSET8_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET9 = (0x00000454) +NVC9B0_SET_PICTURE_LUMA_OFFSET9_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET10 = (0x00000458) +NVC9B0_SET_PICTURE_LUMA_OFFSET10_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET11 = (0x0000045C) +NVC9B0_SET_PICTURE_LUMA_OFFSET11_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET12 = (0x00000460) +NVC9B0_SET_PICTURE_LUMA_OFFSET12_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET13 = (0x00000464) +NVC9B0_SET_PICTURE_LUMA_OFFSET13_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET14 = (0x00000468) +NVC9B0_SET_PICTURE_LUMA_OFFSET14_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET15 = (0x0000046C) +NVC9B0_SET_PICTURE_LUMA_OFFSET15_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET16 = (0x00000470) +NVC9B0_SET_PICTURE_LUMA_OFFSET16_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET0 = (0x00000474) +NVC9B0_SET_PICTURE_CHROMA_OFFSET0_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET1 = (0x00000478) +NVC9B0_SET_PICTURE_CHROMA_OFFSET1_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET2 = (0x0000047C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET2_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET3 = (0x00000480) +NVC9B0_SET_PICTURE_CHROMA_OFFSET3_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET4 = (0x00000484) +NVC9B0_SET_PICTURE_CHROMA_OFFSET4_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET5 = (0x00000488) +NVC9B0_SET_PICTURE_CHROMA_OFFSET5_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET6 = (0x0000048C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET6_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET7 = (0x00000490) +NVC9B0_SET_PICTURE_CHROMA_OFFSET7_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET8 = (0x00000494) +NVC9B0_SET_PICTURE_CHROMA_OFFSET8_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET9 = (0x00000498) +NVC9B0_SET_PICTURE_CHROMA_OFFSET9_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET10 = (0x0000049C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET10_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET11 = (0x000004A0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET11_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET12 = (0x000004A4) +NVC9B0_SET_PICTURE_CHROMA_OFFSET12_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET13 = (0x000004A8) +NVC9B0_SET_PICTURE_CHROMA_OFFSET13_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET14 = (0x000004AC) +NVC9B0_SET_PICTURE_CHROMA_OFFSET14_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET15 = (0x000004B0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET15_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET16 = (0x000004B4) +NVC9B0_SET_PICTURE_CHROMA_OFFSET16_OFFSET = (31, 0) +NVC9B0_SET_PIC_SCRATCH_BUF_OFFSET = (0x000004B8) +NVC9B0_SET_PIC_SCRATCH_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_EXTERNAL_MVBUFFER_OFFSET = (0x000004BC) +NVC9B0_SET_EXTERNAL_MVBUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SUB_SAMPLE_MAP_OFFSET = (0x000004C0) +NVC9B0_SET_SUB_SAMPLE_MAP_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SUB_SAMPLE_MAP_IV_OFFSET = (0x000004C4) +NVC9B0_SET_SUB_SAMPLE_MAP_IV_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_INTRA_TOP_BUF_OFFSET = (0x000004C8) +NVC9B0_SET_INTRA_TOP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_TILE_SIZE_BUF_OFFSET = (0x000004CC) +NVC9B0_SET_TILE_SIZE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_FILTER_BUFFER_OFFSET = (0x000004D0) +NVC9B0_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_CRC_STRUCT_OFFSET = (0x000004D4) +NVC9B0_SET_CRC_STRUCT_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PR_SSM_CONTENT_INFO_BUF_OFFSET = (0x000004D8) +NVC9B0_SET_PR_SSM_CONTENT_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_MBHIST_BUF_OFFSET = (0x00000500) +NVC9B0_H264_SET_MBHIST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP8_SET_PROB_DATA_OFFSET = (0x00000540) +NVC9B0_VP8_SET_PROB_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_VP8_SET_HEADER_PARTITION_BUF_BASE_OFFSET = (0x00000544) +NVC9B0_VP8_SET_HEADER_PARTITION_BUF_BASE_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SCALING_LIST_OFFSET = (0x00000580) +NVC9B0_HEVC_SET_SCALING_LIST_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_TILE_SIZES_OFFSET = (0x00000584) +NVC9B0_HEVC_SET_TILE_SIZES_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_FILTER_BUFFER_OFFSET = (0x00000588) +NVC9B0_HEVC_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SAO_BUFFER_OFFSET = (0x0000058C) +NVC9B0_HEVC_SET_SAO_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SLICE_INFO_BUFFER_OFFSET = (0x00000590) +NVC9B0_HEVC_SET_SLICE_INFO_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SLICE_GROUP_INDEX = (0x00000594) +NVC9B0_HEVC_SET_SLICE_GROUP_INDEX_OFFSET = (31, 0) +NVC9B0_VP9_SET_PROB_TAB_BUF_OFFSET = (0x000005C0) +NVC9B0_VP9_SET_PROB_TAB_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_CTX_COUNTER_BUF_OFFSET = (0x000005C4) +NVC9B0_VP9_SET_CTX_COUNTER_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_SEGMENT_READ_BUF_OFFSET = (0x000005C8) +NVC9B0_VP9_SET_SEGMENT_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_SEGMENT_WRITE_BUF_OFFSET = (0x000005CC) +NVC9B0_VP9_SET_SEGMENT_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_TILE_SIZE_BUF_OFFSET = (0x000005D0) +NVC9B0_VP9_SET_TILE_SIZE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_COL_MVWRITE_BUF_OFFSET = (0x000005D4) +NVC9B0_VP9_SET_COL_MVWRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_COL_MVREAD_BUF_OFFSET = (0x000005D8) +NVC9B0_VP9_SET_COL_MVREAD_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_FILTER_BUFFER_OFFSET = (0x000005DC) +NVC9B0_VP9_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PIC_SETUP_OFFSET = (0x000005E0) +NVC9B0_VP9_PARSER_SET_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PREV_PIC_SETUP_OFFSET = (0x000005E4) +NVC9B0_VP9_PARSER_SET_PREV_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PROB_TAB_BUF_OFFSET = (0x000005E8) +NVC9B0_VP9_PARSER_SET_PROB_TAB_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_HINT_DUMP_BUF_OFFSET = (0x000005EC) +NVC9B0_VP9_SET_HINT_DUMP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_CLEAR_HEADER_OFFSET = (0x00000600) +NVC9B0_PASS1_SET_CLEAR_HEADER_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_RE_ENCRYPT_OFFSET = (0x00000604) +NVC9B0_PASS1_SET_RE_ENCRYPT_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_VP8_TOKEN_OFFSET = (0x00000608) +NVC9B0_PASS1_SET_VP8_TOKEN_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_INPUT_DATA_OFFSET = (0x0000060C) +NVC9B0_PASS1_SET_INPUT_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_OUTPUT_DATA_SIZE_OFFSET = (0x00000610) +NVC9B0_PASS1_SET_OUTPUT_DATA_SIZE_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_PROB_TAB_READ_BUF_OFFSET = (0x00000640) +NVC9B0_AV1_SET_PROB_TAB_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_PROB_TAB_WRITE_BUF_OFFSET = (0x00000644) +NVC9B0_AV1_SET_PROB_TAB_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SEGMENT_READ_BUF_OFFSET = (0x00000648) +NVC9B0_AV1_SET_SEGMENT_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SEGMENT_WRITE_BUF_OFFSET = (0x0000064C) +NVC9B0_AV1_SET_SEGMENT_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV0_READ_BUF_OFFSET = (0x00000650) +NVC9B0_AV1_SET_COL_MV0_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV1_READ_BUF_OFFSET = (0x00000654) +NVC9B0_AV1_SET_COL_MV1_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV2_READ_BUF_OFFSET = (0x00000658) +NVC9B0_AV1_SET_COL_MV2_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MVWRITE_BUF_OFFSET = (0x0000065C) +NVC9B0_AV1_SET_COL_MVWRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_GLOBAL_MODEL_BUF_OFFSET = (0x00000660) +NVC9B0_AV1_SET_GLOBAL_MODEL_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_FILM_GRAIN_BUF_OFFSET = (0x00000664) +NVC9B0_AV1_SET_FILM_GRAIN_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_TILE_STREAM_INFO_BUF_OFFSET = (0x00000668) +NVC9B0_AV1_SET_TILE_STREAM_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SUB_STREAM_ENTRY_BUF_OFFSET = (0x0000066C) +NVC9B0_AV1_SET_SUB_STREAM_ENTRY_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_HINT_DUMP_BUF_OFFSET = (0x00000670) +NVC9B0_AV1_SET_HINT_DUMP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_SCALING_LIST_OFFSET = (0x00000680) +NVC9B0_H264_SET_SCALING_LIST_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_VLDHIST_BUF_OFFSET = (0x00000684) +NVC9B0_H264_SET_VLDHIST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET0 = (0x00000688) +NVC9B0_H264_SET_EDOBOFFSET0_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET1 = (0x0000068C) +NVC9B0_H264_SET_EDOBOFFSET1_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET2 = (0x00000690) +NVC9B0_H264_SET_EDOBOFFSET2_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET3 = (0x00000694) +NVC9B0_H264_SET_EDOBOFFSET3_OFFSET = (31, 0) +NVC9B0_SET_CONTENT_INITIAL_VECTOR = lambda b: (0x00000C00 + (b)*0x00000004) # type: ignore +NVC9B0_SET_CONTENT_INITIAL_VECTOR_VALUE = (31, 0) +NVC9B0_SET_CTL_COUNT = (0x00000C10) +NVC9B0_SET_CTL_COUNT_VALUE = (31, 0) +NVC9B0_SET_UPPER_SRC = (0x00000C14) +NVC9B0_SET_UPPER_SRC_OFFSET = (7, 0) +NVC9B0_SET_LOWER_SRC = (0x00000C18) +NVC9B0_SET_LOWER_SRC_OFFSET = (31, 0) +NVC9B0_SET_UPPER_DST = (0x00000C1C) +NVC9B0_SET_UPPER_DST_OFFSET = (7, 0) +NVC9B0_SET_LOWER_DST = (0x00000C20) +NVC9B0_SET_LOWER_DST_OFFSET = (31, 0) +NVC9B0_SET_BLOCK_COUNT = (0x00000C24) +NVC9B0_SET_BLOCK_COUNT_VALUE = (31, 0) +NVC9B0_PR_SET_REQUEST_BUF_OFFSET = (0x00000D00) +NVC9B0_PR_SET_REQUEST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_REQUEST_BUF_SIZE = (0x00000D04) +NVC9B0_PR_SET_REQUEST_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_RESPONSE_BUF_OFFSET = (0x00000D08) +NVC9B0_PR_SET_RESPONSE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_RESPONSE_BUF_SIZE = (0x00000D0C) +NVC9B0_PR_SET_RESPONSE_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_REQUEST_MESSAGE_BUF_OFFSET = (0x00000D10) +NVC9B0_PR_SET_REQUEST_MESSAGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_RESPONSE_MESSAGE_BUF_OFFSET = (0x00000D14) +NVC9B0_PR_SET_RESPONSE_MESSAGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_OFFSET = (0x00000D18) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_SIZE = (0x00000D1C) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_CONTENT_DECRYPT_INFO_BUF_OFFSET = (0x00000D20) +NVC9B0_PR_SET_CONTENT_DECRYPT_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_REENCRYPTED_BITSTREAM_BUF_OFFSET = (0x00000D24) +NVC9B0_PR_SET_REENCRYPTED_BITSTREAM_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_DH_KE_SET_CHALLENGE_BUF_OFFSET = (0x00000E00) +NVC9B0_DH_KE_SET_CHALLENGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_DH_KE_SET_RESPONSE_BUF_OFFSET = (0x00000E04) +NVC9B0_DH_KE_SET_RESPONSE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SESSION_KEY = lambda b: (0x00000F00 + (b)*0x00000004) # type: ignore +NVC9B0_SET_SESSION_KEY_VALUE = (31, 0) +NVC9B0_SET_CONTENT_KEY = lambda b: (0x00000F10 + (b)*0x00000004) # type: ignore +NVC9B0_SET_CONTENT_KEY_VALUE = (31, 0) +NVC9B0_PM_TRIGGER_END = (0x00001114) +NVC9B0_PM_TRIGGER_END_V = (31, 0) +NVC9B0_ERROR_NONE = (0x00000000) +NVC9B0_OS_ERROR_EXECUTE_INSUFFICIENT_DATA = (0x00000001) +NVC9B0_OS_ERROR_SEMAPHORE_INSUFFICIENT_DATA = (0x00000002) +NVC9B0_OS_ERROR_INVALID_METHOD = (0x00000003) +NVC9B0_OS_ERROR_INVALID_DMA_PAGE = (0x00000004) +NVC9B0_OS_ERROR_UNHANDLED_INTERRUPT = (0x00000005) +NVC9B0_OS_ERROR_EXCEPTION = (0x00000006) +NVC9B0_OS_ERROR_INVALID_CTXSW_REQUEST = (0x00000007) +NVC9B0_OS_ERROR_APPLICATION = (0x00000008) +NVC9B0_OS_ERROR_SW_BREAKPT = (0x00000009) +NVC9B0_OS_INTERRUPT_EXECUTE_AWAKEN = (0x00000100) +NVC9B0_OS_INTERRUPT_BACKEND_SEMAPHORE_AWAKEN = (0x00000200) +NVC9B0_OS_INTERRUPT_CTX_ERROR_FBIF = (0x00000300) +NVC9B0_OS_INTERRUPT_LIMIT_VIOLATION = (0x00000400) +NVC9B0_OS_INTERRUPT_LIMIT_AND_FBIF_CTX_ERROR = (0x00000500) +NVC9B0_OS_INTERRUPT_HALT_ENGINE = (0x00000600) +NVC9B0_OS_INTERRUPT_TRAP_NONSTALL = (0x00000700) +NVC9B0_H264_VLD_ERR_SEQ_DATA_INCONSISTENT = (0x00004001) +NVC9B0_H264_VLD_ERR_PIC_DATA_INCONSISTENT = (0x00004002) +NVC9B0_H264_VLD_ERR_SLC_DATA_BUF_ADDR_OUT_OF_BOUNDS = (0x00004100) +NVC9B0_H264_VLD_ERR_BITSTREAM_ERROR = (0x00004101) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x000041F8) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_SIZE_NOT_MULT256 = (0x00004200) +NVC9B0_H264_VLD_ERR_SLC_DATA_OUT_SIZE_NOT_MULT256 = (0x00004201) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00004203) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_SLC_HDR_OUT_INVALID = (0x00004204) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00004205) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_BUF_ALREADY_VALID = (0x00004206) +NVC9B0_H264_VLD_ERR_SLC_DATA_OUT_BUF_TOO_SMALL = (0x00004207) +NVC9B0_H264_VLD_ERR_DATA_BUF_CNT_TOO_SMALL = (0x00004208) +NVC9B0_H264_VLD_ERR_BITSTREAM_EMPTY = (0x00004209) +NVC9B0_H264_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000420A) +NVC9B0_H264_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000420B) +NVC9B0_H264_VLD_ERR_HIST_BUF_TOO_SMALL = (0x00004300) +NVC9B0_VC1_VLD_ERR_PIC_DATA_BUF_ADDR_OUT_OF_BOUND = (0x00005100) +NVC9B0_VC1_VLD_ERR_BITSTREAM_ERROR = (0x00005101) +NVC9B0_VC1_VLD_ERR_PIC_HDR_OUT_SIZE_NOT_MULT256 = (0x00005200) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_SIZE_NOT_MULT256 = (0x00005201) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00005202) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00005203) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_PIC_HDR_OUT_INVALID = (0x00005204) +NVC9B0_VC1_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00005205) +NVC9B0_VC1_VLD_ERR_PIC_HDR_OUT_BUF_ALREADY_VALID = (0x00005206) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_BUF_TOO_SMALL = (0x00005207) +NVC9B0_VC1_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00005208) +NVC9B0_VC1_VLD_ERR_BITSTREAM_EMPTY = (0x00005209) +NVC9B0_VC1_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000520A) +NVC9B0_VC1_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000520B) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00005300) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_BUF_ADDR_OUT_OF_BOUNDS = (0x00006100) +NVC9B0_MPEG12_VLD_ERR_BITSTREAM_ERROR = (0x00006101) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_SIZE_NOT_MULT256 = (0x00006200) +NVC9B0_MPEG12_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00006201) +NVC9B0_MPEG12_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00006202) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_BUF_TOO_SMALL = (0x00006203) +NVC9B0_MPEG12_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00006204) +NVC9B0_MPEG12_VLD_ERR_BITSTREAM_EMPTY = (0x00006205) +NVC9B0_MPEG12_VLD_ERR_INVALID_PIC_STRUCTURE = (0x00006206) +NVC9B0_MPEG12_VLD_ERR_INVALID_PIC_CODING_TYPE = (0x00006207) +NVC9B0_MPEG12_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x00006208) +NVC9B0_MPEG12_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x00006209) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00006300) +NVC9B0_CMN_VLD_ERR_PDEC_RETURNED_ERROR = (0x00007101) +NVC9B0_CMN_VLD_ERR_EDOB_FLUSH_TIME_OUT = (0x00007102) +NVC9B0_CMN_VLD_ERR_EDOB_REWIND_TIME_OUT = (0x00007103) +NVC9B0_CMN_VLD_ERR_VLD_WD_TIME_OUT = (0x00007104) +NVC9B0_CMN_VLD_ERR_NUM_SLICES_ZERO = (0x00007105) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_BUF_ADDR_OUT_OF_BOUND = (0x00008100) +NVC9B0_MPEG4_VLD_ERR_BITSTREAM_ERROR = (0x00008101) +NVC9B0_MPEG4_VLD_ERR_PIC_HDR_OUT_SIZE_NOT_MULT256 = (0x00008200) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_SIZE_NOT_MULT256 = (0x00008201) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00008202) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00008203) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_PIC_HDR_OUT_INVALID = (0x00008204) +NVC9B0_MPEG4_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00008205) +NVC9B0_MPEG4_VLD_ERR_PIC_HDR_OUT_BUF_ALREADY_VALID = (0x00008206) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_BUF_TOO_SMALL = (0x00008207) +NVC9B0_MPEG4_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00008208) +NVC9B0_MPEG4_VLD_ERR_BITSTREAM_EMPTY = (0x00008209) +NVC9B0_MPEG4_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000820A) +NVC9B0_MPEG4_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000820B) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00051E01) +NVC9B0_DEC_ERROR_MPEG12_APPTIMER_EXPIRED = (0xDEC10001) +NVC9B0_DEC_ERROR_MPEG12_MVTIMER_EXPIRED = (0xDEC10002) +NVC9B0_DEC_ERROR_MPEG12_INVALID_TOKEN = (0xDEC10003) +NVC9B0_DEC_ERROR_MPEG12_SLICEDATA_MISSING = (0xDEC10004) +NVC9B0_DEC_ERROR_MPEG12_HWERR_INTERRUPT = (0xDEC10005) +NVC9B0_DEC_ERROR_MPEG12_DETECTED_VLD_FAILURE = (0xDEC10006) +NVC9B0_DEC_ERROR_MPEG12_PICTURE_INIT = (0xDEC10100) +NVC9B0_DEC_ERROR_MPEG12_STATEMACHINE_FAILURE = (0xDEC10101) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_PIC = (0xDEC10901) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_UCODE = (0xDEC10902) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_FC = (0xDEC10903) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_SLH = (0xDEC10904) +NVC9B0_DEC_ERROR_MPEG12_INVALID_UCODE_SIZE = (0xDEC10905) +NVC9B0_DEC_ERROR_MPEG12_INVALID_SLICE_COUNT = (0xDEC10906) +NVC9B0_DEC_ERROR_VC1_APPTIMER_EXPIRED = (0xDEC20001) +NVC9B0_DEC_ERROR_VC1_MVTIMER_EXPIRED = (0xDEC20002) +NVC9B0_DEC_ERROR_VC1_INVALID_TOKEN = (0xDEC20003) +NVC9B0_DEC_ERROR_VC1_SLICEDATA_MISSING = (0xDEC20004) +NVC9B0_DEC_ERROR_VC1_HWERR_INTERRUPT = (0xDEC20005) +NVC9B0_DEC_ERROR_VC1_DETECTED_VLD_FAILURE = (0xDEC20006) +NVC9B0_DEC_ERROR_VC1_TIMEOUT_POLLING_FOR_DATA = (0xDEC20007) +NVC9B0_DEC_ERROR_VC1_PDEC_PIC_END_UNALIGNED = (0xDEC20008) +NVC9B0_DEC_ERROR_VC1_WDTIMER_EXPIRED = (0xDEC20009) +NVC9B0_DEC_ERROR_VC1_ERRINTSTART = (0xDEC20010) +NVC9B0_DEC_ERROR_VC1_IQT_ERRINT = (0xDEC20011) +NVC9B0_DEC_ERROR_VC1_MC_ERRINT = (0xDEC20012) +NVC9B0_DEC_ERROR_VC1_MC_IQT_ERRINT = (0xDEC20013) +NVC9B0_DEC_ERROR_VC1_REC_ERRINT = (0xDEC20014) +NVC9B0_DEC_ERROR_VC1_REC_IQT_ERRINT = (0xDEC20015) +NVC9B0_DEC_ERROR_VC1_REC_MC_ERRINT = (0xDEC20016) +NVC9B0_DEC_ERROR_VC1_REC_MC_IQT_ERRINT = (0xDEC20017) +NVC9B0_DEC_ERROR_VC1_DBF_ERRINT = (0xDEC20018) +NVC9B0_DEC_ERROR_VC1_DBF_IQT_ERRINT = (0xDEC20019) +NVC9B0_DEC_ERROR_VC1_DBF_MC_ERRINT = (0xDEC2001A) +NVC9B0_DEC_ERROR_VC1_DBF_MC_IQT_ERRINT = (0xDEC2001B) +NVC9B0_DEC_ERROR_VC1_DBF_REC_ERRINT = (0xDEC2001C) +NVC9B0_DEC_ERROR_VC1_DBF_REC_IQT_ERRINT = (0xDEC2001D) +NVC9B0_DEC_ERROR_VC1_DBF_REC_MC_ERRINT = (0xDEC2001E) +NVC9B0_DEC_ERROR_VC1_DBF_REC_MC_IQT_ERRINT = (0xDEC2001F) +NVC9B0_DEC_ERROR_VC1_PICTURE_INIT = (0xDEC20100) +NVC9B0_DEC_ERROR_VC1_STATEMACHINE_FAILURE = (0xDEC20101) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_PIC = (0xDEC20901) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_UCODE = (0xDEC20902) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_FC = (0xDEC20903) +NVC9B0_DEC_ERROR_VC1_INVAILD_CTXID_SLH = (0xDEC20904) +NVC9B0_DEC_ERROR_VC1_INVALID_UCODE_SIZE = (0xDEC20905) +NVC9B0_DEC_ERROR_VC1_INVALID_SLICE_COUNT = (0xDEC20906) +NVC9B0_DEC_ERROR_H264_APPTIMER_EXPIRED = (0xDEC30001) +NVC9B0_DEC_ERROR_H264_MVTIMER_EXPIRED = (0xDEC30002) +NVC9B0_DEC_ERROR_H264_INVALID_TOKEN = (0xDEC30003) +NVC9B0_DEC_ERROR_H264_SLICEDATA_MISSING = (0xDEC30004) +NVC9B0_DEC_ERROR_H264_HWERR_INTERRUPT = (0xDEC30005) +NVC9B0_DEC_ERROR_H264_DETECTED_VLD_FAILURE = (0xDEC30006) +NVC9B0_DEC_ERROR_H264_ERRINTSTART = (0xDEC30010) +NVC9B0_DEC_ERROR_H264_IQT_ERRINT = (0xDEC30011) +NVC9B0_DEC_ERROR_H264_MC_ERRINT = (0xDEC30012) +NVC9B0_DEC_ERROR_H264_MC_IQT_ERRINT = (0xDEC30013) +NVC9B0_DEC_ERROR_H264_REC_ERRINT = (0xDEC30014) +NVC9B0_DEC_ERROR_H264_REC_IQT_ERRINT = (0xDEC30015) +NVC9B0_DEC_ERROR_H264_REC_MC_ERRINT = (0xDEC30016) +NVC9B0_DEC_ERROR_H264_REC_MC_IQT_ERRINT = (0xDEC30017) +NVC9B0_DEC_ERROR_H264_DBF_ERRINT = (0xDEC30018) +NVC9B0_DEC_ERROR_H264_DBF_IQT_ERRINT = (0xDEC30019) +NVC9B0_DEC_ERROR_H264_DBF_MC_ERRINT = (0xDEC3001A) +NVC9B0_DEC_ERROR_H264_DBF_MC_IQT_ERRINT = (0xDEC3001B) +NVC9B0_DEC_ERROR_H264_DBF_REC_ERRINT = (0xDEC3001C) +NVC9B0_DEC_ERROR_H264_DBF_REC_IQT_ERRINT = (0xDEC3001D) +NVC9B0_DEC_ERROR_H264_DBF_REC_MC_ERRINT = (0xDEC3001E) +NVC9B0_DEC_ERROR_H264_DBF_REC_MC_IQT_ERRINT = (0xDEC3001F) +NVC9B0_DEC_ERROR_H264_PICTURE_INIT = (0xDEC30100) +NVC9B0_DEC_ERROR_H264_STATEMACHINE_FAILURE = (0xDEC30101) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_PIC = (0xDEC30901) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_UCODE = (0xDEC30902) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_FC = (0xDEC30903) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_SLH = (0xDEC30904) +NVC9B0_DEC_ERROR_H264_INVALID_UCODE_SIZE = (0xDEC30905) +NVC9B0_DEC_ERROR_H264_INVALID_SLICE_COUNT = (0xDEC30906) +NVC9B0_DEC_ERROR_MPEG4_APPTIMER_EXPIRED = (0xDEC40001) +NVC9B0_DEC_ERROR_MPEG4_MVTIMER_EXPIRED = (0xDEC40002) +NVC9B0_DEC_ERROR_MPEG4_INVALID_TOKEN = (0xDEC40003) +NVC9B0_DEC_ERROR_MPEG4_SLICEDATA_MISSING = (0xDEC40004) +NVC9B0_DEC_ERROR_MPEG4_HWERR_INTERRUPT = (0xDEC40005) +NVC9B0_DEC_ERROR_MPEG4_DETECTED_VLD_FAILURE = (0xDEC40006) +NVC9B0_DEC_ERROR_MPEG4_TIMEOUT_POLLING_FOR_DATA = (0xDEC40007) +NVC9B0_DEC_ERROR_MPEG4_PDEC_PIC_END_UNALIGNED = (0xDEC40008) +NVC9B0_DEC_ERROR_MPEG4_WDTIMER_EXPIRED = (0xDEC40009) +NVC9B0_DEC_ERROR_MPEG4_ERRINTSTART = (0xDEC40010) +NVC9B0_DEC_ERROR_MPEG4_IQT_ERRINT = (0xDEC40011) +NVC9B0_DEC_ERROR_MPEG4_MC_ERRINT = (0xDEC40012) +NVC9B0_DEC_ERROR_MPEG4_MC_IQT_ERRINT = (0xDEC40013) +NVC9B0_DEC_ERROR_MPEG4_REC_ERRINT = (0xDEC40014) +NVC9B0_DEC_ERROR_MPEG4_REC_IQT_ERRINT = (0xDEC40015) +NVC9B0_DEC_ERROR_MPEG4_REC_MC_ERRINT = (0xDEC40016) +NVC9B0_DEC_ERROR_MPEG4_REC_MC_IQT_ERRINT = (0xDEC40017) +NVC9B0_DEC_ERROR_MPEG4_DBF_ERRINT = (0xDEC40018) +NVC9B0_DEC_ERROR_MPEG4_DBF_IQT_ERRINT = (0xDEC40019) +NVC9B0_DEC_ERROR_MPEG4_DBF_MC_ERRINT = (0xDEC4001A) +NVC9B0_DEC_ERROR_MPEG4_DBF_MC_IQT_ERRINT = (0xDEC4001B) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_ERRINT = (0xDEC4001C) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_IQT_ERRINT = (0xDEC4001D) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_MC_ERRINT = (0xDEC4001E) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_MC_IQT_ERRINT = (0xDEC4001F) +NVC9B0_DEC_ERROR_MPEG4_PICTURE_INIT = (0xDEC40100) +NVC9B0_DEC_ERROR_MPEG4_STATEMACHINE_FAILURE = (0xDEC40101) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_PIC = (0xDEC40901) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_UCODE = (0xDEC40902) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_FC = (0xDEC40903) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_SLH = (0xDEC40904) +NVC9B0_DEC_ERROR_MPEG4_INVALID_UCODE_SIZE = (0xDEC40905) +NVC9B0_DEC_ERROR_MPEG4_INVALID_SLICE_COUNT = (0xDEC40906) +NVC6C0_QMDV02_03_OUTER_PUT = (30, 0) +NVC6C0_QMDV02_03_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV02_03_OUTER_GET = (62, 32) +NVC6C0_QMDV02_03_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV02_03_INNER_GET = (94, 64) +NVC6C0_QMDV02_03_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV02_03_INNER_PUT = (126, 96) +NVC6C0_QMDV02_03_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV02_03_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV02_03_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV02_03_IS_QUEUE = (136, 136) +NVC6C0_QMDV02_03_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0 = (138, 138) +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0_TRUE = 0x00000001 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1 = (139, 139) +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1_TRUE = 0x00000001 +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE = (141, 141) +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE = (142, 142) +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE_QUEUE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE_GRID = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY = (143, 143) +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY_FALSE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY_TRUE = 0x00000001 +NVC6C0_QMDV02_03_QMD_RESERVED_B = (159, 144) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV02_03_QMD_RESERVED_C = (185, 185) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV02_03_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV02_03_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV02_03_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE = (366, 366) +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV02_03_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV02_03_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV02_03_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV02_03_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV02_03_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV02_03_QMD_RESERVED13A = (447, 432) +NVC6C0_QMDV02_03_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV02_03_QMD_RESERVED14A = (479, 464) +NVC6C0_QMDV02_03_DEPENDENT_QMD_POINTER = (511, 480) +NVC6C0_QMDV02_03_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV02_03_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV02_03_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV02_03_MIN_SM_CONFIG_SHARED_MEM_SIZE = (568, 562) +NVC6C0_QMDV02_03_MAX_SM_CONFIG_SHARED_MEM_SIZE = (575, 569) +NVC6C0_QMDV02_03_QMD_VERSION = (579, 576) +NVC6C0_QMDV02_03_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV02_03_QMD_RESERVED_H = (591, 584) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_03_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV02_03_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (663, 657) +NVC6C0_QMDV02_03_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV02_03_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV02_03_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV02_03_RELEASE0_ADDRESS_LOWER = (767, 736) +NVC6C0_QMDV02_03_RELEASE0_ADDRESS_UPPER = (775, 768) +NVC6C0_QMDV02_03_QMD_RESERVED_J = (783, 776) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP = (790, 788) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_03_QMD_RESERVED_K = (791, 791) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT = (793, 792) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE = (794, 794) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE = (799, 799) +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_PAYLOAD = (831, 800) +NVC6C0_QMDV02_03_RELEASE1_ADDRESS_LOWER = (863, 832) +NVC6C0_QMDV02_03_RELEASE1_ADDRESS_UPPER = (871, 864) +NVC6C0_QMDV02_03_QMD_RESERVED_L = (879, 872) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP = (886, 884) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_03_QMD_RESERVED_M = (887, 887) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT = (889, 888) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE = (890, 890) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE = (895, 895) +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_PAYLOAD = (927, 896) +NVC6C0_QMDV02_03_SHADER_LOCAL_MEMORY_LOW_SIZE = (951, 928) +NVC6C0_QMDV02_03_QMD_RESERVED_N = (954, 952) +NVC6C0_QMDV02_03_BARRIER_COUNT = (959, 955) +NVC6C0_QMDV02_03_SHADER_LOCAL_MEMORY_HIGH_SIZE = (983, 960) +NVC6C0_QMDV02_03_REGISTER_COUNT = (991, 984) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1000, 992) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_SIZE = (1009, 1001) +NVC6C0_QMDV02_03_QMD_RESERVED_A = (1015, 1010) +NVC6C0_QMDV02_03_SASS_VERSION = (1023, 1016) +NVC6C0_QMDV02_03_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV02_03_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV02_03_QMD_RESERVED_S = (1599, 1585) +NVC6C0_QMDV02_03_HW_ONLY_INNER_GET = (1630, 1600) +NVC6C0_QMDV02_03_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1631, 1631) +NVC6C0_QMDV02_03_HW_ONLY_INNER_PUT = (1662, 1632) +NVC6C0_QMDV02_03_HW_ONLY_SCG_TYPE = (1663, 1663) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1693, 1664) +NVC6C0_QMDV02_03_QMD_RESERVED_Q = (1694, 1694) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1695, 1695) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_03_HW_ONLY_SKED_NEXT_QMD_POINTER = (1727, 1696) +NVC6C0_QMDV02_03_QMD_SPARE_G = (1759, 1728) +NVC6C0_QMDV02_03_QMD_SPARE_H = (1791, 1760) +NVC6C0_QMDV02_03_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV02_03_QMD_SPARE_J = (1855, 1824) +NVC6C0_QMDV02_03_QMD_SPARE_K = (1887, 1856) +NVC6C0_QMDV02_03_QMD_SPARE_L = (1919, 1888) +NVC6C0_QMDV02_03_QMD_SPARE_M = (1951, 1920) +NVC6C0_QMDV02_03_QMD_SPARE_N = (1983, 1952) +NVC6C0_QMDV02_03_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV02_03_DEBUG_ID_LOWER = (2047, 2016) +NVC6C0_QMDV02_04_OUTER_PUT = (30, 0) +NVC6C0_QMDV02_04_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV02_04_OUTER_GET = (62, 32) +NVC6C0_QMDV02_04_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV02_04_INNER_GET = (94, 64) +NVC6C0_QMDV02_04_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV02_04_INNER_PUT = (126, 96) +NVC6C0_QMDV02_04_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV02_04_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV02_04_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV02_04_IS_QUEUE = (136, 136) +NVC6C0_QMDV02_04_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0 = (138, 138) +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0_TRUE = 0x00000001 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1 = (139, 139) +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1_TRUE = 0x00000001 +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE = (141, 141) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION = (144, 142) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH = (145, 145) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE = (146, 146) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION = (149, 147) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH = (150, 150) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENCE_COUNTER = (157, 151) +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION = (158, 158) +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVC6C0_QMDV02_04_QMD_RESERVED_B = (159, 159) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV02_04_DEMOTE_L2_EVICT_LAST = (185, 185) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV02_04_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV02_04_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV02_04_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE = (366, 366) +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV02_04_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV02_04_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV02_04_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE = (383, 383) +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV02_04_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV02_04_QMD_RESERVED13A = (447, 432) +NVC6C0_QMDV02_04_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV02_04_QMD_RESERVED14A = (479, 464) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_POINTER = (511, 480) +NVC6C0_QMDV02_04_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV02_04_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV02_04_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV02_04_MIN_SM_CONFIG_SHARED_MEM_SIZE = (568, 562) +NVC6C0_QMDV02_04_MAX_SM_CONFIG_SHARED_MEM_SIZE = (575, 569) +NVC6C0_QMDV02_04_QMD_VERSION = (579, 576) +NVC6C0_QMDV02_04_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV02_04_QMD_RESERVED_H = (591, 584) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_04_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV02_04_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (663, 657) +NVC6C0_QMDV02_04_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV02_04_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV02_04_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV02_04_RELEASE0_ADDRESS_LOWER = (767, 736) +NVC6C0_QMDV02_04_RELEASE0_ADDRESS_UPPER = (775, 768) +NVC6C0_QMDV02_04_QMD_RESERVED_J = (783, 776) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP = (790, 788) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_04_QMD_RESERVED_K = (791, 791) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT = (793, 792) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE = (794, 794) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE = (799, 799) +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_PAYLOAD = (831, 800) +NVC6C0_QMDV02_04_RELEASE1_ADDRESS_LOWER = (863, 832) +NVC6C0_QMDV02_04_RELEASE1_ADDRESS_UPPER = (871, 864) +NVC6C0_QMDV02_04_QMD_RESERVED_L = (879, 872) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP = (886, 884) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_04_QMD_RESERVED_M = (887, 887) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT = (889, 888) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE = (890, 890) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE = (895, 895) +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_PAYLOAD = (927, 896) +NVC6C0_QMDV02_04_SHADER_LOCAL_MEMORY_LOW_SIZE = (951, 928) +NVC6C0_QMDV02_04_QMD_RESERVED_N = (954, 952) +NVC6C0_QMDV02_04_BARRIER_COUNT = (959, 955) +NVC6C0_QMDV02_04_SHADER_LOCAL_MEMORY_HIGH_SIZE = (983, 960) +NVC6C0_QMDV02_04_QMD_RESERVED_G = (991, 984) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1000, 992) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_SIZE = (1009, 1001) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE = (1011, 1010) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVC6C0_QMDV02_04_QMD_RESERVED_A = (1015, 1012) +NVC6C0_QMDV02_04_SASS_VERSION = (1023, 1016) +NVC6C0_QMDV02_04_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV02_04_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV02_04_QMD_RESERVED_S = (1599, 1585) +NVC6C0_QMDV02_04_HW_ONLY_INNER_GET = (1630, 1600) +NVC6C0_QMDV02_04_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1631, 1631) +NVC6C0_QMDV02_04_HW_ONLY_INNER_PUT = (1662, 1632) +NVC6C0_QMDV02_04_HW_ONLY_SCG_TYPE = (1663, 1663) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1693, 1664) +NVC6C0_QMDV02_04_QMD_RESERVED_Q = (1694, 1694) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1695, 1695) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_04_HW_ONLY_SKED_NEXT_QMD_POINTER = (1727, 1696) +NVC6C0_QMDV02_04_HW_ONLY_DEPENDENCE_COUNTER = (1734, 1728) +NVC6C0_QMDV02_04_QMD_RESERVED_I = (1759, 1735) +NVC6C0_QMDV02_04_QMD_SPARE_H = (1791, 1760) +NVC6C0_QMDV02_04_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV02_04_QMD_SPARE_J = (1855, 1824) +NVC6C0_QMDV02_04_QMD_SPARE_K = (1887, 1856) +NVC6C0_QMDV02_04_QMD_SPARE_L = (1919, 1888) +NVC6C0_QMDV02_04_QMD_SPARE_M = (1951, 1920) +NVC6C0_QMDV02_04_QMD_SPARE_N = (1983, 1952) +NVC6C0_QMDV02_04_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV02_04_DEBUG_ID_LOWER = (2047, 2016) +NVC6C0_QMDV03_00_OUTER_PUT = (30, 0) +NVC6C0_QMDV03_00_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV03_00_OUTER_GET = (62, 32) +NVC6C0_QMDV03_00_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV03_00_INNER_GET = (94, 64) +NVC6C0_QMDV03_00_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV03_00_INNER_PUT = (126, 96) +NVC6C0_QMDV03_00_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV03_00_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV03_00_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV03_00_IS_QUEUE = (136, 136) +NVC6C0_QMDV03_00_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04A = (139, 138) +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04B = (141, 141) +NVC6C0_QMDV03_00_DEPENDENCE_COUNTER = (157, 142) +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION = (158, 158) +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04C = (159, 159) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV03_00_DEMOTE_L2_EVICT_LAST = (185, 185) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV03_00_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV03_00_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV03_00_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV03_00_QMD_RESERVED11A = (366, 366) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED11B = (377, 372) +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED11C = (381, 379) +NVC6C0_QMDV03_00_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV03_00_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV03_00_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE = (383, 383) +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV03_00_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV03_00_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_POINTER = (511, 480) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE = (512, 512) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION = (515, 513) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH = (516, 516) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE = (517, 517) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION = (520, 518) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH = (521, 521) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV03_00_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV03_00_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV03_00_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV03_00_MIN_SM_CONFIG_SHARED_MEM_SIZE = (567, 562) +NVC6C0_QMDV03_00_QMD_RESERVED17A = (568, 568) +NVC6C0_QMDV03_00_MAX_SM_CONFIG_SHARED_MEM_SIZE = (574, 569) +NVC6C0_QMDV03_00_QMD_RESERVED17B = (575, 575) +NVC6C0_QMDV03_00_QMD_VERSION = (579, 576) +NVC6C0_QMDV03_00_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV03_00_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV03_00_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (662, 657) +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE = (663, 663) +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV03_00_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV03_00_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV03_00_SHADER_LOCAL_MEMORY_LOW_SIZE = (759, 736) +NVC6C0_QMDV03_00_BARRIER_COUNT = (767, 763) +NVC6C0_QMDV03_00_RELEASE0_ADDRESS_LOWER = (799, 768) +NVC6C0_QMDV03_00_RELEASE0_ADDRESS_UPPER = (807, 800) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED25A = (818, 808) +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE = (819, 819) +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP = (822, 820) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE0_ENABLE = (823, 823) +NVC6C0_QMDV03_00_RELEASE0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT = (825, 824) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE = (826, 826) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE = (828, 827) +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B = (829, 829) +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE = (831, 830) +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD_LOWER = (863, 832) +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD_UPPER = (895, 864) +NVC6C0_QMDV03_00_RELEASE1_ADDRESS_LOWER = (927, 896) +NVC6C0_QMDV03_00_RELEASE1_ADDRESS_UPPER = (935, 928) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED29A = (946, 936) +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE = (947, 947) +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP = (950, 948) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE1_ENABLE = (951, 951) +NVC6C0_QMDV03_00_RELEASE1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT = (953, 952) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE = (954, 954) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE = (956, 955) +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B = (957, 957) +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE = (959, 958) +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD_LOWER = (991, 960) +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD_UPPER = (1023, 992) +NVC6C0_QMDV03_00_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV03_00_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV03_00_SHADER_LOCAL_MEMORY_HIGH_SIZE = (1623, 1600) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1640, 1632) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_SIZE = (1649, 1641) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE = (1651, 1650) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVC6C0_QMDV03_00_SASS_VERSION = (1663, 1656) +NVC6C0_QMDV03_00_RELEASE2_ADDRESS_LOWER = (1695, 1664) +NVC6C0_QMDV03_00_RELEASE2_ADDRESS_UPPER = (1703, 1696) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED53A = (1714, 1704) +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE = (1715, 1715) +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP = (1718, 1716) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE2_ENABLE = (1719, 1719) +NVC6C0_QMDV03_00_RELEASE2_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT = (1721, 1720) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE = (1722, 1722) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE = (1724, 1723) +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B = (1725, 1725) +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE = (1727, 1726) +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD_LOWER = (1759, 1728) +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD_UPPER = (1791, 1760) +NVC6C0_QMDV03_00_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV03_00_HW_ONLY_INNER_GET = (1854, 1824) +NVC6C0_QMDV03_00_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1855, 1855) +NVC6C0_QMDV03_00_HW_ONLY_INNER_PUT = (1886, 1856) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1917, 1888) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1919, 1919) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV03_00_HW_ONLY_SKED_NEXT_QMD_POINTER = (1951, 1920) +NVC6C0_QMDV03_00_HW_ONLY_DEPENDENCE_COUNTER = (1958, 1952) +NVC6C0_QMDV03_00_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV03_00_DEBUG_ID_LOWER = (2047, 2016) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX = (29, 0) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (30, 30) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (31, 31) +NVCEC0_QMDV05_00_HW_ONLY_SKED_NEXT_QMD_POINTER = (63, 32) +NVCEC0_QMDV05_00_INNER_GET = (94, 64) +NVCEC0_QMDV05_00_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV05_00_INNER_PUT = (126, 96) +NVCEC0_QMDV05_00_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV05_00_DEPENDENCE_COUNTER = (143, 128) +NVCEC0_QMDV05_00_QMD_GROUP_ID = (149, 144) +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (150, 150) +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV05_00_QMD_TYPE = (153, 151) +NVCEC0_QMDV05_00_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV05_00_NUM_SUB_TASKS_PER_TASK = (157, 154) +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS = (158, 158) +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID = (159, 159) +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CIRCULAR_QUEUE_SIZE = (184, 160) +NVCEC0_QMDV05_00_HW_ONLY_DEPENDENCE_COUNTER = (207, 192) +NVCEC0_QMDV05_00_RESUME_SUB_TASK_ID = (210, 208) +NVCEC0_QMDV05_00_COMPLETED_SUB_TASK_MASK = (218, 211) +NVCEC0_QMDV05_00_GRID_WIDTH_RESUME = (255, 224) +NVCEC0_QMDV05_00_GRID_HEIGHT_RESUME = (271, 256) +NVCEC0_QMDV05_00_GRID_DEPTH_RESUME = (287, 272) +NVCEC0_QMDV05_00_RELEASE_ENABLE = lambda i: ((288+(i)*16), (288+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE0_ENABLE = NVCEC0_QMDV05_00_RELEASE_ENABLE(0) +NVCEC0_QMDV05_00_RELEASE1_ENABLE = NVCEC0_QMDV05_00_RELEASE_ENABLE(1) +NVCEC0_QMDV05_00_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE = lambda i: ((290+(i)*16), (289+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE = lambda i: ((291+(i)*16), (291+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE = lambda i: ((292+(i)*16), (292+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP = lambda i: ((295+(i)*16), (293+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT = lambda i: ((297+(i)*16), (296+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE = lambda i: ((299+(i)*16), (298+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B = lambda i: ((300+(i)*16), (300+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_RESERVED_INFO = lambda i: ((303+(i)*16), (301+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE = (336, 336) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION = (339, 337) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH = (340, 340) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION = (341, 341) +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST = (342, 342) +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE = (343, 343) +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE = (344, 344) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION = (347, 345) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH = (348, 348) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL = (349, 349) +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE = (350, 350) +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE = (351, 351) +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CORRELATION_ID = (383, 352) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_POINTER = (415, 384) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_POINTER = (447, 416) +NVCEC0_QMDV05_00_SASS_VERSION = (455, 448) +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT = (456, 456) +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV05_00_SAMPLER_INDEX = (457, 457) +NVCEC0_QMDV05_00_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV05_00_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BANK_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (463, 458) +NVCEC0_QMDV05_00_QMD_MINOR_VERSION = (467, 464) +NVCEC0_QMDV05_00_QMD_MAJOR_VERSION = (471, 468) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE = (472, 472) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE = (473, 473) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE = (474, 474) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE = (475, 475) +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE = (476, 476) +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE = (477, 477) +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (478, 478) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (479, 479) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_ADDR_LOWER = (511, 480) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_ADDR_UPPER = (536, 512) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (575, 544) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (607, 576) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (615, 608) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_ID = (621, 616) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE = (622, 622) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE = (623, 623) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE = (625, 624) +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE = (626, 626) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CTA_LAUNCH_QUEUE = (627, 627) +NVCEC0_QMDV05_00_FREE_CTA_SLOTS_EMPTY_SM = (635, 628) +NVCEC0_QMDV05_00_SYNC_DOMAIN_ID = (637, 636) +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH = (638, 638) +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT = (639, 639) +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_ID = (671, 640) +NVCEC0_QMDV05_00_WAIT_ON_LATCH_ID = (703, 672) +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_SHARED_MEM = (721, 714) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_SHARED_MEM = (729, 722) +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID = (730, 730) +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID = (731, 731) +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE = (732, 732) +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE = (733, 733) +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE = (734, 734) +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE = (735, 735) +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_WARP = (743, 736) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_WARP = (751, 744) +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_REGISTER = (759, 752) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_REGISTER = (767, 760) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_ADDR_LOWER = (799, 768) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_ADDR_UPPER = (824, 800) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_PAYLOAD_LOWER = (863, 832) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_PAYLOAD_UPPER = (895, 864) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_ADDR_LOWER = (927, 896) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_ADDR_UPPER = (952, 928) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_PAYLOAD_LOWER = (991, 960) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_PAYLOAD_UPPER = (1023, 992) +NVCEC0_QMDV05_00_PROGRAM_ADDRESS_LOWER_SHIFTED4 = (1055, 1024) +NVCEC0_QMDV05_00_PROGRAM_ADDRESS_UPPER_SHIFTED4 = (1076, 1056) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_SIZE = (1085, 1077) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE = (1087, 1086) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION0 = (1103, 1088) +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION1 = (1119, 1104) +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION2 = (1127, 1120) +NVCEC0_QMDV05_00_REGISTER_COUNT = (1136, 1128) +NVCEC0_QMDV05_00_BARRIER_COUNT = (1141, 1137) +NVCEC0_QMDV05_00_ICC_PREFETCH_SIZE = (1147, 1142) +NVCEC0_QMDV05_00_SHARED_MEMORY_SIZE_SHIFTED7 = (1162, 1152) +NVCEC0_QMDV05_00_MIN_SM_CONFIG_SHARED_MEM_SIZE = (1168, 1163) +NVCEC0_QMDV05_00_MAX_SM_CONFIG_SHARED_MEM_SIZE = (1174, 1169) +NVCEC0_QMDV05_00_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (1180, 1175) +NVCEC0_QMDV05_00_SHARED_MEM_BARRIER_INIT_ENABLE = (1181, 1181) +NVCEC0_QMDV05_00_SHADER_LOCAL_MEMORY_LOW_SIZE_SHIFTED4 = (1199, 1184) +NVCEC0_QMDV05_00_SHADER_LOCAL_MEMORY_HIGH_SIZE_SHIFTED4 = (1215, 1200) +NVCEC0_QMDV05_00_VIRTUAL_RESOURCE_COUNT = (1223, 1216) +NVCEC0_QMDV05_00_GRID_WIDTH = (1279, 1248) +NVCEC0_QMDV05_00_GRID_HEIGHT = (1295, 1280) +NVCEC0_QMDV05_00_GRID_DEPTH = (1327, 1312) +NVCEC0_QMDV05_00_CONSTANT_BUFFER_ADDR_LOWER_SHIFTED6 = lambda i: ((1375+(i)*64), (1344+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_ADDR_UPPER_SHIFTED6 = lambda i: ((1394+(i)*64), (1376+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1407+(i)*64), (1395+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID = lambda i: ((1856+(i)*4), (1856+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH = lambda i: ((1858+(i)*4), (1857+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1859+(i)*4), (1859+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (1919, 1888) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1936, 1920) +NVCEC0_QMDV05_00_GPC_CGA_WIDTH = (2053, 2048) +NVCEC0_QMDV05_00_GPC_CGA_HEIGHT = (2061, 2056) +NVCEC0_QMDV05_00_GPC_CGA_DEPTH = (2069, 2064) +NVCEC0_QMDV05_00_LARGE_GPC_CGA_WIDTH_MINUS_ONE = (2075, 2072) +NVCEC0_QMDV05_00_LARGE_GPC_CGA_HEIGHT_MINUS_ONE = (2079, 2076) +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE = (2111, 2111) +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE_LOAD_BALANCING = 0x00000000 +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE_MULTI_CAST = 0x00000001 +NVCEC0_QMDV05_00_GPU_CGA_WIDTH = (2127, 2112) +NVCEC0_QMDV05_00_GPU_CGA_HEIGHT = (2143, 2128) +NVCEC0_QMDV05_00_GPU_CGA_DEPTH = (2159, 2144) +NVCEC0_QMDV05_00_DEBUG_ID_LOWER = (2207, 2176) +NVCEC0_QMDV05_00_DEBUG_ID_UPPER = (2239, 2208) +NVCEC0_QMDV05_00_TPC_DISABLE_MASK = lambda i: ((2271+(i)*32), (2240+(i)*32)) # type: ignore +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_WIDTH_RESUME = (2527, 2496) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_HEIGHT_RESUME = (2543, 2528) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_DEPTH_RESUME = (2559, 2544) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_OFFSET_WIDTH_RESUME = (2563, 2560) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_OFFSET_HEIGHT_RESUME = (2567, 2564) +NVCEC0_QMDV05_00_QUEUE_ENTRIES_PER_CTA_LOG2 = (2596, 2592) +NVCEC0_QMDV05_00_HW_ONLY_INNER_GET = (2654, 2624) +NVCEC0_QMDV05_00_HW_ONLY_INNER_PUT = (2686, 2656) +NVCEC0_QMDV05_00_OUTER_PUT = (3038, 3008) +NVCEC0_QMDV05_00_OUTER_OVERFLOW = (3039, 3039) +NVCEC0_QMDV05_00_OUTER_GET = (3070, 3040) +NVCEC0_QMDV05_00_OUTER_STICKY_OVERFLOW = (3071, 3071) +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE = lambda i: ((336+(i)*8), (336+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION = lambda i: ((339+(i)*8), (337+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH = lambda i: ((340+(i)*8), (340+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_POINTER = lambda i: ((415+(i)*32), (384+(i)*32)) # type: ignore +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX = (29, 0) +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (30, 30) +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (31, 31) +NVCEC0_QMDV05_01_HW_ONLY_SKED_NEXT_QMD_POINTER = (63, 32) +NVCEC0_QMDV05_01_INNER_GET = (94, 64) +NVCEC0_QMDV05_01_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV05_01_INNER_PUT = (126, 96) +NVCEC0_QMDV05_01_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV05_01_DEPENDENCE_COUNTER = (143, 128) +NVCEC0_QMDV05_01_QMD_GROUP_ID = (149, 144) +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (150, 150) +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV05_01_QMD_TYPE = (153, 151) +NVCEC0_QMDV05_01_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV05_01_NUM_SUB_TASKS_PER_TASK = (157, 154) +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS = (158, 158) +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID = (159, 159) +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CIRCULAR_QUEUE_SIZE = (184, 160) +NVCEC0_QMDV05_01_HW_ONLY_DEPENDENCE_COUNTER = (207, 192) +NVCEC0_QMDV05_01_RESUME_SUB_TASK_ID = (210, 208) +NVCEC0_QMDV05_01_COMPLETED_SUB_TASK_MASK = (218, 211) +NVCEC0_QMDV05_01_GRID_WIDTH_RESUME = (255, 224) +NVCEC0_QMDV05_01_GRID_HEIGHT_RESUME = (271, 256) +NVCEC0_QMDV05_01_GRID_DEPTH_RESUME = (287, 272) +NVCEC0_QMDV05_01_RELEASE_ENABLE = lambda i: ((288+(i)*16), (288+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE = lambda i: ((290+(i)*16), (289+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE = lambda i: ((291+(i)*16), (291+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE = lambda i: ((292+(i)*16), (292+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP = lambda i: ((295+(i)*16), (293+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT = lambda i: ((297+(i)*16), (296+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE = lambda i: ((299+(i)*16), (298+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B = lambda i: ((300+(i)*16), (300+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_RESERVED_INFO = lambda i: ((303+(i)*16), (301+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE = (336, 336) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION = (339, 337) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH = (340, 340) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION = (341, 341) +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST = (342, 342) +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE = (343, 343) +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE = (344, 344) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION = (347, 345) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH = (348, 348) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL = (349, 349) +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE = (350, 350) +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE = (351, 351) +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CORRELATION_ID = (383, 352) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_POINTER = (415, 384) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_POINTER = (447, 416) +NVCEC0_QMDV05_01_SASS_VERSION = (455, 448) +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT = (456, 456) +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV05_01_SAMPLER_INDEX = (457, 457) +NVCEC0_QMDV05_01_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV05_01_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV05_01_CONSTANT_BANK_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (463, 458) +NVCEC0_QMDV05_01_QMD_MINOR_VERSION = (467, 464) +NVCEC0_QMDV05_01_QMD_MAJOR_VERSION = (471, 468) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE = (472, 472) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE = (473, 473) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE = (474, 474) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE = (475, 475) +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE = (476, 476) +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE = (477, 477) +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (478, 478) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (479, 479) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_ADDR_LOWER = (511, 480) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_ADDR_UPPER = (536, 512) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (575, 544) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (607, 576) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (615, 608) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_ID = (621, 616) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE = (622, 622) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE = (623, 623) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE = (625, 624) +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE = (626, 626) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CTA_LAUNCH_QUEUE = (627, 627) +NVCEC0_QMDV05_01_FREE_CTA_SLOTS_EMPTY_SM = (635, 628) +NVCEC0_QMDV05_01_SYNC_DOMAIN_ID = (637, 636) +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH = (638, 638) +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT = (639, 639) +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_ID = (671, 640) +NVCEC0_QMDV05_01_WAIT_ON_LATCH_ID = (703, 672) +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_SHARED_MEM = (721, 714) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_SHARED_MEM = (729, 722) +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID = (730, 730) +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID = (731, 731) +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE = (732, 732) +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE = (733, 733) +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE = (734, 734) +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE = (735, 735) +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_WARP = (743, 736) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_WARP = (751, 744) +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_REGISTER = (759, 752) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_REGISTER = (767, 760) +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_ADDRESS_LOWER_SHIFTED4 = lambda i: ((799+(i)*416), (768+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_ADDRESS_UPPER_SHIFTED4 = lambda i: ((820+(i)*416), (800+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_SIZE = lambda i: ((829+(i)*416), (821+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE = lambda i: ((831+(i)*416), (830+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION0 = lambda i: ((847+(i)*416), (832+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION1 = lambda i: ((863+(i)*416), (848+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION2 = lambda i: ((871+(i)*416), (864+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_REGISTER_COUNT = lambda i: ((880+(i)*416), (872+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_BARRIER_COUNT = lambda i: ((885+(i)*416), (881+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID = lambda i: ((886+(i)*416), (886+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH = lambda i: ((888+(i)*416), (887+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE = lambda i: ((889+(i)*416), (889+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_ICC_PREFETCH_SIZE = lambda i: ((895+(i)*416), (890+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHARED_MEMORY_SIZE_SHIFTED7 = lambda i: ((906+(i)*416), (896+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_MIN_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((912+(i)*416), (907+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_MAX_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((918+(i)*416), (913+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_TARGET_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((924+(i)*416), (919+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHARED_MEM_BARRIER_INIT_ENABLE = lambda i: ((925+(i)*416), (925+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHADER_LOCAL_MEMORY_LOW_SIZE_SHIFTED4 = lambda i: ((943+(i)*416), (928+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHADER_LOCAL_MEMORY_HIGH_SIZE_SHIFTED4 = lambda i: ((959+(i)*416), (944+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_ADDR_LOWER_SHIFTED6 = lambda i: ((991+(i)*416), (960+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_ADDR_UPPER_SHIFTED6 = lambda i: ((1010+(i)*416), (992+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_SIZE_SHIFTED4 = lambda i: ((1023+(i)*416), (1011+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_ADDR_LOWER_SHIFTED6 = lambda i: ((1055+(i)*416), (1024+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_ADDR_UPPER_SHIFTED6 = lambda i: ((1074+(i)*416), (1056+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_SIZE_SHIFTED4 = lambda i: ((1087+(i)*416), (1075+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID = lambda i: ((1088+(i)*416), (1088+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH = lambda i: ((1090+(i)*416), (1089+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE = lambda i: ((1091+(i)*416), (1091+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_VIRTUAL_RESOURCE_COUNT = lambda i: ((1099+(i)*416), (1092+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_WIDTH = lambda i: ((1151+(i)*416), (1120+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_HEIGHT = lambda i: ((1167+(i)*416), (1152+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_DEPTH = lambda i: ((1183+(i)*416), (1168+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE = lambda i: ((336+(i)*8), (336+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION = lambda i: ((339+(i)*8), (337+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH = lambda i: ((340+(i)*8), (340+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_POINTER = lambda i: ((415+(i)*32), (384+(i)*32)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID = lambda i,j: ((886+(i)*416+(j)*202), (886+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH = lambda i,j: ((888+(i)*416+(j)*202), (887+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE = lambda i,j: ((889+(i)*416+(j)*202), (889+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_ADDR_LOWER_SHIFTED6 = lambda i,j: ((991+(i)*416+(j)*64), (960+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_ADDR_UPPER_SHIFTED6 = lambda i,j: ((1010+(i)*416+(j)*64), (992+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_SIZE_SHIFTED4 = lambda i,j: ((1023+(i)*416+(j)*64), (1011+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENCE_COUNTER = (15, 0) +NVCEC0_QMDV04_01_QMD_GROUP_ID = (21, 16) +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (22, 22) +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV04_01_QMD_TYPE = (25, 23) +NVCEC0_QMDV04_01_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV04_01_ARRIVE_AT_LATCH_VALID = (28, 28) +NVCEC0_QMDV04_01_WAIT_ON_LATCH_VALID = (29, 29) +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS = (30, 30) +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID = (31, 31) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CIRCULAR_QUEUE_SIZE = (56, 32) +NVCEC0_QMDV04_01_INNER_GET = (94, 64) +NVCEC0_QMDV04_01_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV04_01_INNER_PUT = (126, 96) +NVCEC0_QMDV04_01_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV04_01_HW_ONLY_INNER_GET = (190, 160) +NVCEC0_QMDV04_01_HW_ONLY_INNER_PUT = (222, 192) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX = (253, 224) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (254, 254) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_HW_ONLY_SKED_NEXT_QMD_POINTER = (287, 256) +NVCEC0_QMDV04_01_HW_ONLY_DEPENDENCE_COUNTER = (303, 288) +NVCEC0_QMDV04_01_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (304, 304) +NVCEC0_QMDV04_01_RELEASE_ENABLE = lambda i: ((320+(i)*16), (320+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE = lambda i: ((322+(i)*16), (321+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE = lambda i: ((323+(i)*16), (323+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE = lambda i: ((324+(i)*16), (324+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP = lambda i: ((327+(i)*16), (325+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT = lambda i: ((329+(i)*16), (328+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE = lambda i: ((331+(i)*16), (330+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B = lambda i: ((332+(i)*16), (332+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_RESERVED_INFO = lambda i: ((335+(i)*16), (333+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE = lambda i: ((368+(i)*5), (368+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION = lambda i: ((371+(i)*5), (369+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH = lambda i: ((372+(i)*5), (372+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION = (378, 378) +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST = (379, 379) +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE = (380, 380) +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL = (381, 381) +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE = (382, 382) +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CORRELATION_ID = (415, 384) +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID = lambda i: ((416+(i)*4), (416+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH = lambda i: ((418+(i)*4), (417+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE = lambda i: ((419+(i)*4), (419+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD0_POINTER = (479, 448) +NVCEC0_QMDV04_01_DEPENDENT_QMD1_POINTER = (511, 480) +NVCEC0_QMDV04_01_SHADER_LOCAL_MEMORY_LOW_SIZE = (535, 512) +NVCEC0_QMDV04_01_SASS_VERSION = (543, 536) +NVCEC0_QMDV04_01_SHADER_LOCAL_MEMORY_HIGH_SIZE = (567, 544) +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT = (568, 568) +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV04_01_SAMPLER_INDEX = (569, 569) +NVCEC0_QMDV04_01_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV04_01_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (575, 570) +NVCEC0_QMDV04_01_QMD_MINOR_VERSION = (579, 576) +NVCEC0_QMDV04_01_QMD_MAJOR_VERSION = (583, 580) +NVCEC0_QMDV04_01_SHARED_MEMORY_SIZE = (601, 584) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE = (602, 602) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE = (603, 603) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE = (604, 604) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE = (605, 605) +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE = (606, 606) +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE = (607, 607) +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_MIN_SM_CONFIG_SHARED_MEM_SIZE = (613, 608) +NVCEC0_QMDV04_01_MAX_SM_CONFIG_SHARED_MEM_SIZE = (619, 614) +NVCEC0_QMDV04_01_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (625, 620) +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE = (626, 626) +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_ADDR_LOWER = (671, 640) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_ADDR_UPPER = (696, 672) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (735, 704) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (767, 736) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_ADDR_LOWER = (799, 768) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_ADDR_UPPER = (824, 800) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_PAYLOAD_LOWER = (863, 832) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_PAYLOAD_UPPER = (895, 864) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_ADDR_LOWER = (927, 896) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_ADDR_UPPER = (952, 928) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_PAYLOAD_LOWER = (991, 960) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_PAYLOAD_UPPER = (1023, 992) +NVCEC0_QMDV04_01_GRID_WIDTH = (1055, 1024) +NVCEC0_QMDV04_01_GRID_HEIGHT = (1071, 1056) +NVCEC0_QMDV04_01_GRID_DEPTH = (1103, 1088) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (1127, 1120) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_ID = (1133, 1128) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE = (1134, 1134) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE = (1135, 1135) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE = (1137, 1136) +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS = (1138, 1138) +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CTA_LAUNCH_QUEUE = (1139, 1139) +NVCEC0_QMDV04_01_FREE_CTA_SLOTS_EMPTY_SM = (1147, 1140) +NVCEC0_QMDV04_01_SYNC_DOMAIN_ID = (1149, 1148) +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH = (1150, 1150) +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT = (1151, 1151) +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION0 = (1167, 1152) +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION1 = (1183, 1168) +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION2 = (1191, 1184) +NVCEC0_QMDV04_01_VIRTUAL_RESOURCE_COUNT = (1199, 1192) +NVCEC0_QMDV04_01_REGISTER_COUNT = (1208, 1200) +NVCEC0_QMDV04_01_SHARED_MEM_BARRIER_INIT_ENABLE = (1210, 1210) +NVCEC0_QMDV04_01_BARRIER_COUNT = (1215, 1211) +NVCEC0_QMDV04_01_PROGRAM_ADDRESS_LOWER = (1247, 1216) +NVCEC0_QMDV04_01_PROGRAM_ADDRESS_UPPER = (1272, 1248) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_WARP = (1287, 1280) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_WARP = (1295, 1288) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_REGISTER = (1303, 1296) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_REGISTER = (1311, 1304) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_SHARED_MEM = (1319, 1312) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_SHARED_MEM = (1327, 1320) +NVCEC0_QMDV04_01_ICC_PREFETCH_SIZE = (1333, 1328) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (1375, 1344) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1392, 1376) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_SIZE = (1401, 1393) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE = (1403, 1402) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (1406, 1406) +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (1407, 1407) +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_GRID_WIDTH_RESUME = (1439, 1408) +NVCEC0_QMDV04_01_GRID_HEIGHT_RESUME = (1455, 1440) +NVCEC0_QMDV04_01_GRID_DEPTH_RESUME = (1471, 1456) +NVCEC0_QMDV04_01_ARRIVE_AT_LATCH_ID = (1503, 1472) +NVCEC0_QMDV04_01_WAIT_ON_LATCH_ID = (1535, 1504) +NVCEC0_QMDV04_01_CONSTANT_BUFFER_ADDR_LOWER_SHIFTED6 = lambda i: ((1567+(i)*64), (1536+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_ADDR_UPPER_SHIFTED6 = lambda i: ((1586+(i)*64), (1568+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1599+(i)*64), (1587+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_COALESCE_WAITING_PERIOD = (2135, 2128) +NVCEC0_QMDV04_01_QUEUE_ENTRIES_PER_CTA_LOG2 = (2140, 2136) +NVCEC0_QMDV04_01_GPC_CGA_WIDTH = (2149, 2144) +NVCEC0_QMDV04_01_GPC_CGA_HEIGHT = (2157, 2152) +NVCEC0_QMDV04_01_GPC_CGA_DEPTH = (2165, 2160) +NVCEC0_QMDV04_01_LARGE_GPC_CGA_WIDTH_MINUS_ONE = (2171, 2168) +NVCEC0_QMDV04_01_LARGE_GPC_CGA_HEIGHT_MINUS_ONE = (2175, 2172) +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE = (2207, 2207) +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE_LOAD_BALANCING = 0x00000000 +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE_MULTI_CAST = 0x00000001 +NVCEC0_QMDV04_01_GPU_CGA_WIDTH = (2223, 2208) +NVCEC0_QMDV04_01_GPU_CGA_HEIGHT = (2239, 2224) +NVCEC0_QMDV04_01_GPU_CGA_DEPTH = (2255, 2240) +NVCEC0_QMDV04_01_DEBUG_ID_LOWER = (2399, 2368) +NVCEC0_QMDV04_01_DEBUG_ID_UPPER = (2431, 2400) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK = lambda i: ((2463+(i)*32), (2432+(i)*32)) # type: ignore +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_WIDTH_RESUME = (2591, 2560) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_HEIGHT_RESUME = (2607, 2592) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_DEPTH_RESUME = (2623, 2608) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_OFFSET_WIDTH_RESUME = (2627, 2624) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_OFFSET_HEIGHT_RESUME = (2631, 2628) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_UPPER = lambda i: ((2719+(i)*32), (2688+(i)*32)) # type: ignore +NVCEC0_QMDV04_01_OUTER_PUT = (3038, 3008) +NVCEC0_QMDV04_01_OUTER_OVERFLOW = (3039, 3039) +NVCEC0_QMDV04_01_OUTER_GET = (3070, 3040) +NVCEC0_QMDV04_01_OUTER_STICKY_OVERFLOW = (3071, 3071) +ALIGN_UP = lambda v,n: (((v) + ((n)-1)) &~ ((n)-1)) # type: ignore +NVDEC_ALIGN = lambda value: ALIGN_UP(value,256) # type: ignore +NVDEC_MAX_MPEG2_SLICE = 65536 +NVDEC_CODEC_MPEG1 = 0 +NVDEC_CODEC_MPEG2 = 1 +NVDEC_CODEC_VC1 = 2 +NVDEC_CODEC_H264 = 3 +NVDEC_CODEC_MPEG4 = 4 +NVDEC_CODEC_DIVX = NVDEC_CODEC_MPEG4 +NVDEC_CODEC_VP8 = 5 +NVDEC_CODEC_HEVC = 7 +NVDEC_CODEC_VP9 = 9 +NVDEC_CODEC_HEVC_PARSER = 12 +NVDEC_CODEC_AV1 = 10 +AES_MODE_MASK = 0x7 +AES_CTS_MASK = 0x1 +AES_PADDING_TYPE_MASK = 0x7 +AES_UNWRAP_KEY_MASK = 0x1 +AES_MODE_SHIFT = 0 +AES_CTS_SHIFT = 3 +AES_PADDING_TYPE_SHIFT = 4 +AES_UNWRAP_KEY_SHIFT = 7 +AES_SET_FLAG = lambda M,C,P: ((M & AES_MODE_MASK) << AES_MODE_SHIFT) | ((C & AES_CTS_MASK) << AES_CTS_SHIFT) | ((P & AES_PADDING_TYPE_MASK) << AES_PADDING_TYPE_SHIFT) # type: ignore +DRM_MODE_MASK = 0x7f +AES_GET_DRM_MODE = lambda V: (V & DRM_MODE_MASK) # type: ignore +GIP_ASIC_VERT_FILTER_RAM_SIZE = 16 +GIP_ASIC_BSD_CTRL_RAM_SIZE = 4 +GIP_ASIC_SCALING_LIST_SIZE = (16*64) +GIP_ASIC_VERT_SAO_RAM_SIZE = 16 +GIP_ASIC_TILE_SIZE = ((20*22*2*2+16+15) & ~0xF) +GIP_ASIC_VP9_CTB_SEG_SIZE = 32 +HEVC_DBLK_TOP_SIZE_IN_SB16 = ALIGN_UP(632, 128) +HEVC_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,16)/16 + 2) * HEVC_DBLK_TOP_SIZE_IN_SB16) # type: ignore +HEVC_DBLK_LEFT_SIZE_IN_SB16 = ALIGN_UP(506, 128) +HEVC_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,16)/16 + 2) * HEVC_DBLK_LEFT_SIZE_IN_SB16) # type: ignore +HEVC_SAO_LEFT_SIZE_IN_SB16 = ALIGN_UP(713, 128) +HEVC_SAO_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,16)/16 + 2) * HEVC_SAO_LEFT_SIZE_IN_SB16) # type: ignore +VP9_DBLK_TOP_SIZE_IN_SB64 = ALIGN_UP(2000, 128) +VP9_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,64)/64 + 2) * VP9_DBLK_TOP_SIZE_IN_SB64) # type: ignore +VP9_DBLK_LEFT_SIZE_IN_SB64 = ALIGN_UP(1600, 128) +VP9_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * VP9_DBLK_LEFT_SIZE_IN_SB64) # type: ignore +VP9_HINT_DUMP_SIZE_IN_SB64 = ((64*64)/(4*4)*8) +VP9_HINT_DUMP_SIZE = lambda w,h: NVDEC_ALIGN(VP9_HINT_DUMP_SIZE_IN_SB64*((w+63)/64)*((h+63)/64)) # type: ignore +NUM_SUBSAMPLES = 32 +VP8_MAX_TOKEN_PARTITIONS = 8 +VP9_MAX_FRAMES_IN_SUPERFRAME = 8 +AV1_MAX_TILES = 256 +MAX_SUBSTREAM_ENTRY_SIZE = 32 +AV1_TEMPORAL_MV_SIZE_IN_64x64 = 256 +AV1_TEMPORAL_MV_BUF_SIZE = lambda w,h: ALIGN_UP( ALIGN_UP(w,128) * ALIGN_UP(h,128) / (64*64) * AV1_TEMPORAL_MV_SIZE_IN_64x64, 4096) # type: ignore +AV1_SEGMENT_ID_SIZE_IN_64x64 = 128 +AV1_SEGMENT_ID_BUF_SIZE = lambda w,h: ALIGN_UP( ALIGN_UP(w,128) * ALIGN_UP(h,128) / (64*64) * AV1_SEGMENT_ID_SIZE_IN_64x64, 4096) # type: ignore +AV1_GLOBAL_MOTION_BUF_SIZE = NVDEC_ALIGN(7*32) +AV1_INTRA_TOP_BUF_SIZE = NVDEC_ALIGN(8*8192) +AV1_HISTOGRAM_BUF_SIZE = NVDEC_ALIGN(1024) +AV1_DBLK_TOP_SIZE_IN_SB64 = ALIGN_UP(1920, 128) +AV1_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,64)/64 + 2) * AV1_DBLK_TOP_SIZE_IN_SB64) # type: ignore +AV1_DBLK_LEFT_SIZE_IN_SB64 = ALIGN_UP(1536, 128) +AV1_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_DBLK_LEFT_SIZE_IN_SB64) # type: ignore +AV1_CDEF_LEFT_SIZE_IN_SB64 = ALIGN_UP(1792, 128) +AV1_CDEF_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_CDEF_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HUS_LEFT_SIZE_IN_SB64 = ALIGN_UP(12544, 128) +AV1_ASIC_HUS_LEFT_BUFFER_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_HUS_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HUS_LEFT_BUF_SIZE = lambda h: 2*AV1_ASIC_HUS_LEFT_BUFFER_SIZE(h) # type: ignore +AV1_LR_LEFT_SIZE_IN_SB64 = ALIGN_UP(1920, 128) +AV1_LR_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_LR_LEFT_SIZE_IN_SB64) # type: ignore +AV1_FGS_LEFT_SIZE_IN_SB64 = ALIGN_UP(320, 128) +AV1_FGS_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_FGS_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HINT_DUMP_SIZE_IN_SB64 = ((64*64)/(4*4)*8) +AV1_HINT_DUMP_SIZE_IN_SB128 = ((128*128)/(4*4)*8) +AV1_HINT_DUMP_SIZE = lambda w,h: NVDEC_ALIGN(AV1_HINT_DUMP_SIZE_IN_SB128*((w+127)/128)*((h+127)/128)) # type: ignore +NVBIT = lambda b: (1<<(b)) # type: ignore +NVBIT32 = lambda b: NVBIT_TYPE(b, NvU32) # type: ignore +NVBIT64 = lambda b: NVBIT_TYPE(b, NvU64) # type: ignore +NV_BITMASK32_IDX = lambda chId: (((chId) & ~(0x1F)) >> 5) # type: ignore +NV_BITMASK32_OFFSET = lambda chId: ((chId) & (0x1F)) # type: ignore +NV_BITMASK32_GET = lambda pChannelMask,chId: ((pChannelMask)[NV_BITMASK32_IDX(chId)] & NVBIT(NV_BITMASK32_OFFSET(chId))) # type: ignore +DRF_SHIFT = lambda drf: ((DRF_ISBIT(0,drf)) % 32) # type: ignore +DRF_SHIFT_RT = lambda drf: ((DRF_ISBIT(1,drf)) % 32) # type: ignore +DRF_SIZE = lambda drf: (DRF_EXTENT(drf)-DRF_BASE(drf)+1) # type: ignore +DRF_MASK = lambda drf: (0xFFFFFFFF>>(31-((DRF_ISBIT(1,drf)) % 32)+((DRF_ISBIT(0,drf)) % 32))) # type: ignore +DRF_SHIFTMASK = lambda drf: (DRF_MASK(drf)<<(DRF_SHIFT(drf))) # type: ignore +DRF_SHIFT64 = lambda drf: ((DRF_ISBIT(0,drf)) % 64) # type: ignore +DRF_MASK64 = lambda drf: (NV_U64_MAX>>(63-((DRF_ISBIT(1,drf)) % 64)+((DRF_ISBIT(0,drf)) % 64))) # type: ignore +DRF_SHIFTMASK64 = lambda drf: (DRF_MASK64(drf)<<(DRF_SHIFT64(drf))) # type: ignore +FLD_TEST_DRF_NUM64 = lambda d,r,f,n,v: (DRF_VAL64(d, r, f, (v)) == (n)) # type: ignore +REF_VAL64 = lambda drf,v: (((NvU64)(v)>>DRF_SHIFT64(drf))&DRF_MASK64(drf)) # type: ignore +REF_NUM64 = lambda drf,n: (((NvU64)(n)&DRF_MASK64(drf))<>DRF_SHIFT(drf))&DRF_MASK(drf)) # type: ignore +REF_NUM = lambda drf,n: (((n)&DRF_MASK(drf))<>((31-(DRF_EXTENT_MW(drf))+(DRF_BASE_MW(drf)))%32)) # type: ignore +DRF_SHIFTMASK_MW = lambda drf: ((DRF_MASK_MW(drf))<<(DRF_SHIFT_MW(drf))) # type: ignore +DRF_SIZE_MW = lambda drf: (DRF_EXTENT_MW(drf)-DRF_BASE_MW(drf)+1) # type: ignore +DRF_WORD_MW_LOW = lambda drf: (DRF_PICK_MW(drf,0)/32) # type: ignore +DRF_WORD_MW_HIGH = lambda drf: (DRF_PICK_MW(drf,1)/32) # type: ignore +DRF_MASK_MW_LOW = lambda drf: (0xFFFFFFFF) # type: ignore +DRF_MASK_MW_HIGH = lambda drf: (0xFFFFFFFF>>(31-(DRF_EXTENT_MW(drf)))) # type: ignore +DRF_SHIFT_MW_LOW = lambda drf: (DRF_PICK_MW(drf,0)%32) # type: ignore +DRF_SHIFT_MW_HIGH = lambda drf: (0) # type: ignore +DRF_MERGE_SHIFT = lambda drf: ((32-((DRF_PICK_MW(drf,0)%32)))%32) # type: ignore +FLD_MERGE_MW = lambda drf,n,v: (((v)[DRF_WORD_MW(drf)] & ~DRF_SHIFTMASK_MW(drf)) | n) # type: ignore +FLD_IDX_MERGE_MW = lambda drf,i,n,v: (((v)[DRF_WORD_MW(drf(i))] & ~DRF_SHIFTMASK_MW(drf(i))) | n) # type: ignore +FLD_TEST_DRF_NUM_MW = lambda d,r,f,n,v: ((DRF_VAL_MW(d, r, f, (v)) == n)) # type: ignore +NV_TWO_N_MINUS_ONE = lambda n: (((1<<(n/2))<<((n+1)/2))-1) # type: ignore +LOWESTBIT = lambda x: ( (x) & (((x) - 1) ^ (x)) ) # type: ignore +NV_ANYSIZE_ARRAY = 1 +NV_CEIL = lambda a,b: (((a)+(b)-1)/(b)) # type: ignore +NV_DIV_AND_CEIL = lambda a,b: NV_CEIL(a,b) # type: ignore +NV_SIGN = lambda s: ((NvS8)(((s) > 0) - ((s) < 0))) # type: ignore +NV_ZERO_SIGN = lambda s: ((NvS8)((((s) >= 0) * 2) - 1)) # type: ignore +NV_UNSIGNED_ROUNDED_DIV = lambda a,b: (((a) + ((b) / 2)) / (b)) # type: ignore +NV_UNSIGNED_DIV_CEIL = lambda a,b: (((a) + (b - 1)) / (b)) # type: ignore +NV_ALIGN_DOWN = lambda v,gran: ((v) & ~((v) - (v) + (gran) - 1)) # type: ignore +NV_ALIGN_UP = lambda v,gran: (((v) + ((gran) - 1)) & ~((v) - (v) + (gran) - 1)) # type: ignore +NV_IS_ALIGNED = lambda v,gran: (0 == ((v) & ((gran) - 1))) # type: ignore +NV_BIT_GET = lambda k,x: (((x) >> (k)) & 1) # type: ignore +NV_ARRAY_ELEMENTS = lambda x: ((sizeof(x)/sizeof((x)[0]))) # type: ignore +BIT = lambda b: (1<<(b)) # type: ignore +NV01_NULL_OBJECT = (0x0) +NV1_NULL_OBJECT = NV01_NULL_OBJECT +NV01_ROOT = (0x0) +NV0000_ALLOC_PARAMETERS_MESSAGE_ID = (0x0000) +NV01_MEMORY_VIRTUAL = (0x70) +NV01_MEMORY_SYSTEM_DYNAMIC = (0x70) +NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_MESSAGE_ID = (0x0070) +NV_MEMORY_VIRTUAL_SYSMEM_DYNAMIC_HVASPACE = 0xffffffff +NV01_DEVICE_0 = (0x80) +NV0080_ALLOC_PARAMETERS_MESSAGE_ID = (0x0080) +NV20_SUBDEVICE_0 = (0x2080) +NV2080_ALLOC_PARAMETERS_MESSAGE_ID = (0x2080) +NV2080_NOTIFIERS_SW = (0) +NV2080_NOTIFIERS_HOTPLUG = (1) +NV2080_NOTIFIERS_POWER_CONNECTOR = (2) +NV2080_NOTIFIERS_THERMAL_SW = (3) +NV2080_NOTIFIERS_THERMAL_HW = (4) +NV2080_NOTIFIERS_FULL_SCREEN_CHANGE = (5) +NV2080_NOTIFIERS_EVENTBUFFER = (6) +NV2080_NOTIFIERS_DP_IRQ = (7) +NV2080_NOTIFIERS_GR_DEBUG_INTR = (8) +NV2080_NOTIFIERS_PMU_EVENT = (9) +NV2080_NOTIFIERS_PMU_COMMAND = (10) +NV2080_NOTIFIERS_TIMER = (11) +NV2080_NOTIFIERS_GRAPHICS = (12) +NV2080_NOTIFIERS_PPP = (13) +NV2080_NOTIFIERS_VLD = (14) +NV2080_NOTIFIERS_NVDEC0 = NV2080_NOTIFIERS_VLD +NV2080_NOTIFIERS_NVDEC1 = (15) +NV2080_NOTIFIERS_NVDEC2 = (16) +NV2080_NOTIFIERS_NVDEC3 = (17) +NV2080_NOTIFIERS_NVDEC4 = (18) +NV2080_NOTIFIERS_NVDEC5 = (19) +NV2080_NOTIFIERS_NVDEC6 = (20) +NV2080_NOTIFIERS_NVDEC7 = (21) +NV2080_NOTIFIERS_PDEC = (22) +NV2080_NOTIFIERS_CE0 = (23) +NV2080_NOTIFIERS_CE1 = (24) +NV2080_NOTIFIERS_CE2 = (25) +NV2080_NOTIFIERS_CE3 = (26) +NV2080_NOTIFIERS_CE4 = (27) +NV2080_NOTIFIERS_CE5 = (28) +NV2080_NOTIFIERS_CE6 = (29) +NV2080_NOTIFIERS_CE7 = (30) +NV2080_NOTIFIERS_CE8 = (31) +NV2080_NOTIFIERS_CE9 = (32) +NV2080_NOTIFIERS_PSTATE_CHANGE = (33) +NV2080_NOTIFIERS_HDCP_STATUS_CHANGE = (34) +NV2080_NOTIFIERS_FIFO_EVENT_MTHD = (35) +NV2080_NOTIFIERS_PRIV_RING_HANG = (36) +NV2080_NOTIFIERS_RC_ERROR = (37) +NV2080_NOTIFIERS_MSENC = (38) +NV2080_NOTIFIERS_NVENC0 = NV2080_NOTIFIERS_MSENC +NV2080_NOTIFIERS_NVENC1 = (39) +NV2080_NOTIFIERS_NVENC2 = (40) +NV2080_NOTIFIERS_UNUSED_0 = (41) +NV2080_NOTIFIERS_ACPI_NOTIFY = (42) +NV2080_NOTIFIERS_COOLER_DIAG_ZONE = (43) +NV2080_NOTIFIERS_THERMAL_DIAG_ZONE = (44) +NV2080_NOTIFIERS_AUDIO_HDCP_REQUEST = (45) +NV2080_NOTIFIERS_WORKLOAD_MODULATION_CHANGE = (46) +NV2080_NOTIFIERS_GPIO_0_RISING_INTERRUPT = (47) +NV2080_NOTIFIERS_GPIO_1_RISING_INTERRUPT = (48) +NV2080_NOTIFIERS_GPIO_2_RISING_INTERRUPT = (49) +NV2080_NOTIFIERS_GPIO_3_RISING_INTERRUPT = (50) +NV2080_NOTIFIERS_GPIO_4_RISING_INTERRUPT = (51) +NV2080_NOTIFIERS_GPIO_5_RISING_INTERRUPT = (52) +NV2080_NOTIFIERS_GPIO_6_RISING_INTERRUPT = (53) +NV2080_NOTIFIERS_GPIO_7_RISING_INTERRUPT = (54) +NV2080_NOTIFIERS_GPIO_8_RISING_INTERRUPT = (55) +NV2080_NOTIFIERS_GPIO_9_RISING_INTERRUPT = (56) +NV2080_NOTIFIERS_GPIO_10_RISING_INTERRUPT = (57) +NV2080_NOTIFIERS_GPIO_11_RISING_INTERRUPT = (58) +NV2080_NOTIFIERS_GPIO_12_RISING_INTERRUPT = (59) +NV2080_NOTIFIERS_GPIO_13_RISING_INTERRUPT = (60) +NV2080_NOTIFIERS_GPIO_14_RISING_INTERRUPT = (61) +NV2080_NOTIFIERS_GPIO_15_RISING_INTERRUPT = (62) +NV2080_NOTIFIERS_GPIO_16_RISING_INTERRUPT = (63) +NV2080_NOTIFIERS_GPIO_17_RISING_INTERRUPT = (64) +NV2080_NOTIFIERS_GPIO_18_RISING_INTERRUPT = (65) +NV2080_NOTIFIERS_GPIO_19_RISING_INTERRUPT = (66) +NV2080_NOTIFIERS_GPIO_20_RISING_INTERRUPT = (67) +NV2080_NOTIFIERS_GPIO_21_RISING_INTERRUPT = (68) +NV2080_NOTIFIERS_GPIO_22_RISING_INTERRUPT = (69) +NV2080_NOTIFIERS_GPIO_23_RISING_INTERRUPT = (70) +NV2080_NOTIFIERS_GPIO_24_RISING_INTERRUPT = (71) +NV2080_NOTIFIERS_GPIO_25_RISING_INTERRUPT = (72) +NV2080_NOTIFIERS_GPIO_26_RISING_INTERRUPT = (73) +NV2080_NOTIFIERS_GPIO_27_RISING_INTERRUPT = (74) +NV2080_NOTIFIERS_GPIO_28_RISING_INTERRUPT = (75) +NV2080_NOTIFIERS_GPIO_29_RISING_INTERRUPT = (76) +NV2080_NOTIFIERS_GPIO_30_RISING_INTERRUPT = (77) +NV2080_NOTIFIERS_GPIO_31_RISING_INTERRUPT = (78) +NV2080_NOTIFIERS_GPIO_0_FALLING_INTERRUPT = (79) +NV2080_NOTIFIERS_GPIO_1_FALLING_INTERRUPT = (80) +NV2080_NOTIFIERS_GPIO_2_FALLING_INTERRUPT = (81) +NV2080_NOTIFIERS_GPIO_3_FALLING_INTERRUPT = (82) +NV2080_NOTIFIERS_GPIO_4_FALLING_INTERRUPT = (83) +NV2080_NOTIFIERS_GPIO_5_FALLING_INTERRUPT = (84) +NV2080_NOTIFIERS_GPIO_6_FALLING_INTERRUPT = (85) +NV2080_NOTIFIERS_GPIO_7_FALLING_INTERRUPT = (86) +NV2080_NOTIFIERS_GPIO_8_FALLING_INTERRUPT = (87) +NV2080_NOTIFIERS_GPIO_9_FALLING_INTERRUPT = (88) +NV2080_NOTIFIERS_GPIO_10_FALLING_INTERRUPT = (89) +NV2080_NOTIFIERS_GPIO_11_FALLING_INTERRUPT = (90) +NV2080_NOTIFIERS_GPIO_12_FALLING_INTERRUPT = (91) +NV2080_NOTIFIERS_GPIO_13_FALLING_INTERRUPT = (92) +NV2080_NOTIFIERS_GPIO_14_FALLING_INTERRUPT = (93) +NV2080_NOTIFIERS_GPIO_15_FALLING_INTERRUPT = (94) +NV2080_NOTIFIERS_GPIO_16_FALLING_INTERRUPT = (95) +NV2080_NOTIFIERS_GPIO_17_FALLING_INTERRUPT = (96) +NV2080_NOTIFIERS_GPIO_18_FALLING_INTERRUPT = (97) +NV2080_NOTIFIERS_GPIO_19_FALLING_INTERRUPT = (98) +NV2080_NOTIFIERS_GPIO_20_FALLING_INTERRUPT = (99) +NV2080_NOTIFIERS_GPIO_21_FALLING_INTERRUPT = (100) +NV2080_NOTIFIERS_GPIO_22_FALLING_INTERRUPT = (101) +NV2080_NOTIFIERS_GPIO_23_FALLING_INTERRUPT = (102) +NV2080_NOTIFIERS_GPIO_24_FALLING_INTERRUPT = (103) +NV2080_NOTIFIERS_GPIO_25_FALLING_INTERRUPT = (104) +NV2080_NOTIFIERS_GPIO_26_FALLING_INTERRUPT = (105) +NV2080_NOTIFIERS_GPIO_27_FALLING_INTERRUPT = (106) +NV2080_NOTIFIERS_GPIO_28_FALLING_INTERRUPT = (107) +NV2080_NOTIFIERS_GPIO_29_FALLING_INTERRUPT = (108) +NV2080_NOTIFIERS_GPIO_30_FALLING_INTERRUPT = (109) +NV2080_NOTIFIERS_GPIO_31_FALLING_INTERRUPT = (110) +NV2080_NOTIFIERS_ECC_SBE = (111) +NV2080_NOTIFIERS_ECC_DBE = (112) +NV2080_NOTIFIERS_STEREO_EMITTER_DETECTION = (113) +NV2080_NOTIFIERS_GC5_GPU_READY = (114) +NV2080_NOTIFIERS_SEC2 = (115) +NV2080_NOTIFIERS_GC6_REFCOUNT_INC = (116) +NV2080_NOTIFIERS_GC6_REFCOUNT_DEC = (117) +NV2080_NOTIFIERS_POWER_EVENT = (118) +NV2080_NOTIFIERS_CLOCKS_CHANGE = (119) +NV2080_NOTIFIERS_HOTPLUG_PROCESSING_COMPLETE = (120) +NV2080_NOTIFIERS_PHYSICAL_PAGE_FAULT = (121) +NV2080_NOTIFIERS_RESERVED122 = (122) +NV2080_NOTIFIERS_NVLINK_ERROR_FATAL = (123) +NV2080_NOTIFIERS_PRIV_REG_ACCESS_FAULT = (124) +NV2080_NOTIFIERS_NVLINK_ERROR_RECOVERY_REQUIRED = (125) +NV2080_NOTIFIERS_NVJPG = (126) +NV2080_NOTIFIERS_NVJPEG0 = NV2080_NOTIFIERS_NVJPG +NV2080_NOTIFIERS_NVJPEG1 = (127) +NV2080_NOTIFIERS_NVJPEG2 = (128) +NV2080_NOTIFIERS_NVJPEG3 = (129) +NV2080_NOTIFIERS_NVJPEG4 = (130) +NV2080_NOTIFIERS_NVJPEG5 = (131) +NV2080_NOTIFIERS_NVJPEG6 = (132) +NV2080_NOTIFIERS_NVJPEG7 = (133) +NV2080_NOTIFIERS_RUNLIST_AND_ENG_IDLE = (134) +NV2080_NOTIFIERS_RUNLIST_ACQUIRE = (135) +NV2080_NOTIFIERS_RUNLIST_ACQUIRE_AND_ENG_IDLE = (136) +NV2080_NOTIFIERS_RUNLIST_IDLE = (137) +NV2080_NOTIFIERS_TSG_PREEMPT_COMPLETE = (138) +NV2080_NOTIFIERS_RUNLIST_PREEMPT_COMPLETE = (139) +NV2080_NOTIFIERS_CTXSW_TIMEOUT = (140) +NV2080_NOTIFIERS_INFOROM_ECC_OBJECT_UPDATED = (141) +NV2080_NOTIFIERS_NVTELEMETRY_REPORT_EVENT = (142) +NV2080_NOTIFIERS_DSTATE_XUSB_PPC = (143) +NV2080_NOTIFIERS_FECS_CTX_SWITCH = (144) +NV2080_NOTIFIERS_XUSB_PPC_CONNECTED = (145) +NV2080_NOTIFIERS_GR0 = NV2080_NOTIFIERS_GRAPHICS +NV2080_NOTIFIERS_GR1 = (146) +NV2080_NOTIFIERS_GR2 = (147) +NV2080_NOTIFIERS_GR3 = (148) +NV2080_NOTIFIERS_GR4 = (149) +NV2080_NOTIFIERS_GR5 = (150) +NV2080_NOTIFIERS_GR6 = (151) +NV2080_NOTIFIERS_GR7 = (152) +NV2080_NOTIFIERS_OFA = (153) +NV2080_NOTIFIERS_OFA0 = NV2080_NOTIFIERS_OFA +NV2080_NOTIFIERS_DSTATE_HDA = (154) +NV2080_NOTIFIERS_POISON_ERROR_NON_FATAL = (155) +NV2080_NOTIFIERS_POISON_ERROR_FATAL = (156) +NV2080_NOTIFIERS_UCODE_RESET = (157) +NV2080_NOTIFIERS_PLATFORM_POWER_MODE_CHANGE = (158) +NV2080_NOTIFIERS_SMC_CONFIG_UPDATE = (159) +NV2080_NOTIFIERS_INFOROM_RRL_OBJECT_UPDATED = (160) +NV2080_NOTIFIERS_INFOROM_PBL_OBJECT_UPDATED = (161) +NV2080_NOTIFIERS_LPWR_DIFR_PREFETCH_REQUEST = (162) +NV2080_NOTIFIERS_SEC_FAULT_ERROR = (163) +NV2080_NOTIFIERS_UNUSED_1 = (164) +NV2080_NOTIFIERS_NVLINK_INFO_LINK_UP = (165) +NV2080_NOTIFIERS_CE10 = (166) +NV2080_NOTIFIERS_CE11 = (167) +NV2080_NOTIFIERS_CE12 = (168) +NV2080_NOTIFIERS_CE13 = (169) +NV2080_NOTIFIERS_CE14 = (170) +NV2080_NOTIFIERS_CE15 = (171) +NV2080_NOTIFIERS_CE16 = (172) +NV2080_NOTIFIERS_CE17 = (173) +NV2080_NOTIFIERS_CE18 = (174) +NV2080_NOTIFIERS_CE19 = (175) +NV2080_NOTIFIERS_NVLINK_INFO_LINK_DOWN = (176) +NV2080_NOTIFIERS_NVPCF_EVENTS = (177) +NV2080_NOTIFIERS_HDMI_FRL_RETRAINING_REQUEST = (178) +NV2080_NOTIFIERS_VRR_SET_TIMEOUT = (179) +NV2080_NOTIFIERS_OFA1 = (180) +NV2080_NOTIFIERS_AUX_POWER_EVENT = (181) +NV2080_NOTIFIERS_AUX_POWER_STATE_CHANGE = (182) +NV2080_NOTIFIERS_NVENC3 = (183) +NV2080_NOTIFIERS_GSP_PERF_TRACE = (184) +NV2080_NOTIFIERS_INBAND_RESPONSE = (185) +NV2080_NOTIFIERS_RESERVED_186 = (186) +NV2080_NOTIFIERS_ECC_SBE_STORM = (187) +NV2080_NOTIFIERS_DRAM_RETIREMENT_EVENT = (188) +NV2080_NOTIFIERS_DRAM_RETIREMENT_FAILURE = (189) +NV2080_NOTIFIERS_NVLINK_UNCONTAINED_ERROR = (190) +NV2080_NOTIFIERS_GPU_UNAVAILABLE = (191) +NV2080_NOTIFIERS_GPU_RECOVERY_ACTION = (192) +NV2080_NOTIFIERS_POWER_SUSPEND = (193) +NV2080_NOTIFIERS_POWER_RESUME = (194) +NV2080_NOTIFIERS_CTXSW_UCODE_ERROR = (195) +NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD = (196) +NV2080_NOTIFIERS_MAXCOUNT = (197) +NV2080_NOTIFIERS_GR_IDX = lambda x: ((x) - NV2080_NOTIFIERS_GR0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_GR = lambda x: (((x) == NV2080_NOTIFIERS_GR0) or (((x) >= NV2080_NOTIFIERS_GR1) and ((x) <= NV2080_NOTIFIERS_GR7))) # type: ignore +NV2080_NOTIFIER_TYPE_IS_CE = lambda x: ((((x) >= NV2080_NOTIFIERS_CE0) and ((x) <= NV2080_NOTIFIERS_CE9)) or (((x) >= NV2080_NOTIFIERS_CE10) and ((x) <= NV2080_NOTIFIERS_CE19))) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVENC = lambda x: ((((x) >= NV2080_NOTIFIERS_NVENC0) and ((x) <= NV2080_NOTIFIERS_NVENC2)) or (((x) == NV2080_NOTIFIERS_NVENC3))) # type: ignore +NV2080_NOTIFIERS_NVDEC = lambda x: (NV2080_NOTIFIERS_NVDEC0 + (x)) # type: ignore +NV2080_NOTIFIERS_NVDEC_IDX = lambda x: ((x) - NV2080_NOTIFIERS_NVDEC0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVDEC = lambda x: (((x) >= NV2080_NOTIFIERS_NVDEC0) and ((x) <= NV2080_NOTIFIERS_NVDEC7)) # type: ignore +NV2080_NOTIFIERS_NVJPEG = lambda x: (NV2080_NOTIFIERS_NVJPEG0 + (x)) # type: ignore +NV2080_NOTIFIERS_NVJPEG_IDX = lambda x: ((x) - NV2080_NOTIFIERS_NVJPEG0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVJPEG = lambda x: (((x) >= NV2080_NOTIFIERS_NVJPEG0) and ((x) <= NV2080_NOTIFIERS_NVJPEG7)) # type: ignore +NV2080_NOTIFIER_TYPE_IS_OFA = lambda x: (((x) == NV2080_NOTIFIERS_OFA0) or ((x) == NV2080_NOTIFIERS_OFA1)) # type: ignore +NV2080_NOTIFIERS_GPIO_RISING_INTERRUPT = lambda pin: (NV2080_NOTIFIERS_GPIO_0_RISING_INTERRUPT + (pin)) # type: ignore +NV2080_NOTIFIERS_GPIO_FALLING_INTERRUPT = lambda pin: (NV2080_NOTIFIERS_GPIO_0_FALLING_INTERRUPT + (pin)) # type: ignore +NV2080_SUBDEVICE_NOTIFICATION_STATUS_IN_PROGRESS = (0x8000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_BAD_ARGUMENT = (0x4000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_ERROR_INVALID_STATE = (0x2000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_ERROR_STATE_IN_USE = (0x1000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_DONE_SUCCESS = (0x0000) +NV2080_ENGINE_TYPE_NULL = (0x00000000) +NV2080_ENGINE_TYPE_GRAPHICS = (0x00000001) +NV2080_ENGINE_TYPE_GR0 = NV2080_ENGINE_TYPE_GRAPHICS +NV2080_ENGINE_TYPE_GR1 = (0x00000002) +NV2080_ENGINE_TYPE_GR2 = (0x00000003) +NV2080_ENGINE_TYPE_GR3 = (0x00000004) +NV2080_ENGINE_TYPE_GR4 = (0x00000005) +NV2080_ENGINE_TYPE_GR5 = (0x00000006) +NV2080_ENGINE_TYPE_GR6 = (0x00000007) +NV2080_ENGINE_TYPE_GR7 = (0x00000008) +NV2080_ENGINE_TYPE_COPY0 = (0x00000009) +NV2080_ENGINE_TYPE_COPY1 = (0x0000000a) +NV2080_ENGINE_TYPE_COPY2 = (0x0000000b) +NV2080_ENGINE_TYPE_COPY3 = (0x0000000c) +NV2080_ENGINE_TYPE_COPY4 = (0x0000000d) +NV2080_ENGINE_TYPE_COPY5 = (0x0000000e) +NV2080_ENGINE_TYPE_COPY6 = (0x0000000f) +NV2080_ENGINE_TYPE_COPY7 = (0x00000010) +NV2080_ENGINE_TYPE_COPY8 = (0x00000011) +NV2080_ENGINE_TYPE_COPY9 = (0x00000012) +NV2080_ENGINE_TYPE_BSP = (0x00000013) +NV2080_ENGINE_TYPE_NVDEC0 = NV2080_ENGINE_TYPE_BSP +NV2080_ENGINE_TYPE_NVDEC1 = (0x00000014) +NV2080_ENGINE_TYPE_NVDEC2 = (0x00000015) +NV2080_ENGINE_TYPE_NVDEC3 = (0x00000016) +NV2080_ENGINE_TYPE_NVDEC4 = (0x00000017) +NV2080_ENGINE_TYPE_NVDEC5 = (0x00000018) +NV2080_ENGINE_TYPE_NVDEC6 = (0x00000019) +NV2080_ENGINE_TYPE_NVDEC7 = (0x0000001a) +NV2080_ENGINE_TYPE_MSENC = (0x0000001b) +NV2080_ENGINE_TYPE_NVENC0 = NV2080_ENGINE_TYPE_MSENC +NV2080_ENGINE_TYPE_NVENC1 = (0x0000001c) +NV2080_ENGINE_TYPE_NVENC2 = (0x0000001d) +NV2080_ENGINE_TYPE_VP = (0x0000001e) +NV2080_ENGINE_TYPE_ME = (0x0000001f) +NV2080_ENGINE_TYPE_PPP = (0x00000020) +NV2080_ENGINE_TYPE_MPEG = (0x00000021) +NV2080_ENGINE_TYPE_SW = (0x00000022) +NV2080_ENGINE_TYPE_CIPHER = (0x00000023) +NV2080_ENGINE_TYPE_TSEC = NV2080_ENGINE_TYPE_CIPHER +NV2080_ENGINE_TYPE_VIC = (0x00000024) +NV2080_ENGINE_TYPE_MP = (0x00000025) +NV2080_ENGINE_TYPE_SEC2 = (0x00000026) +NV2080_ENGINE_TYPE_HOST = (0x00000027) +NV2080_ENGINE_TYPE_DPU = (0x00000028) +NV2080_ENGINE_TYPE_PMU = (0x00000029) +NV2080_ENGINE_TYPE_FBFLCN = (0x0000002a) +NV2080_ENGINE_TYPE_NVJPG = (0x0000002b) +NV2080_ENGINE_TYPE_NVJPEG0 = NV2080_ENGINE_TYPE_NVJPG +NV2080_ENGINE_TYPE_NVJPEG1 = (0x0000002c) +NV2080_ENGINE_TYPE_NVJPEG2 = (0x0000002d) +NV2080_ENGINE_TYPE_NVJPEG3 = (0x0000002e) +NV2080_ENGINE_TYPE_NVJPEG4 = (0x0000002f) +NV2080_ENGINE_TYPE_NVJPEG5 = (0x00000030) +NV2080_ENGINE_TYPE_NVJPEG6 = (0x00000031) +NV2080_ENGINE_TYPE_NVJPEG7 = (0x00000032) +NV2080_ENGINE_TYPE_OFA = (0x00000033) +NV2080_ENGINE_TYPE_OFA0 = NV2080_ENGINE_TYPE_OFA +NV2080_ENGINE_TYPE_COPY10 = (0x00000034) +NV2080_ENGINE_TYPE_COPY11 = (0x00000035) +NV2080_ENGINE_TYPE_COPY12 = (0x00000036) +NV2080_ENGINE_TYPE_COPY13 = (0x00000037) +NV2080_ENGINE_TYPE_COPY14 = (0x00000038) +NV2080_ENGINE_TYPE_COPY15 = (0x00000039) +NV2080_ENGINE_TYPE_COPY16 = (0x0000003a) +NV2080_ENGINE_TYPE_COPY17 = (0x0000003b) +NV2080_ENGINE_TYPE_COPY18 = (0x0000003c) +NV2080_ENGINE_TYPE_COPY19 = (0x0000003d) +NV2080_ENGINE_TYPE_OFA1 = (0x0000003e) +NV2080_ENGINE_TYPE_NVENC3 = (0x0000003f) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0 = (0x00000040) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY1 = (0x00000041) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY2 = (0x00000042) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY3 = (0x00000043) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY4 = (0x00000044) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY5 = (0x00000045) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY6 = (0x00000046) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY7 = (0x00000047) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY8 = (0x00000048) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY9 = (0x00000049) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY10 = (0x0000004a) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY11 = (0x0000004b) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY12 = (0x0000004c) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY13 = (0x0000004d) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY14 = (0x0000004e) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY15 = (0x0000004f) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY16 = (0x00000050) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY17 = (0x00000051) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY18 = (0x00000052) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY19 = (0x00000053) +NV2080_ENGINE_TYPE_LAST = (0x00000054) +NV2080_ENGINE_TYPE_ALLENGINES = (0xffffffff) +NV2080_ENGINE_TYPE_COPY_SIZE = 64 +NV2080_ENGINE_TYPE_NVENC_SIZE = 4 +NV2080_ENGINE_TYPE_NVJPEG_SIZE = 8 +NV2080_ENGINE_TYPE_NVDEC_SIZE = 8 +NV2080_ENGINE_TYPE_GR_SIZE = 8 +NV2080_ENGINE_TYPE_OFA_SIZE = 2 +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY = lambda i: (NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0 + (i)) # type: ignore +NV2080_ENGINE_TYPE_IS_COMP_DECOMP_COPY = lambda i: (((i) >= NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0) and ((i) <= NV2080_ENGINE_TYPE_COMP_DECOMP_COPY19)) # type: ignore +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0) # type: ignore +NV2080_ENGINE_TYPE_IS_COPY = lambda i: ((((i) >= NV2080_ENGINE_TYPE_COPY0) and ((i) <= NV2080_ENGINE_TYPE_COPY9)) or (((i) >= NV2080_ENGINE_TYPE_COPY10) and ((i) <= NV2080_ENGINE_TYPE_COPY19))) # type: ignore +NV2080_ENGINE_TYPE_IS_NVENC = lambda i: ((((i) >= NV2080_ENGINE_TYPE_NVENC0) and ((i) <= NV2080_ENGINE_TYPE_NVENC2)) or (((i) == NV2080_ENGINE_TYPE_NVENC3))) # type: ignore +NV2080_ENGINE_TYPE_NVDEC = lambda i: (NV2080_ENGINE_TYPE_NVDEC0+(i)) # type: ignore +NV2080_ENGINE_TYPE_IS_NVDEC = lambda i: (((i) >= NV2080_ENGINE_TYPE_NVDEC0) and ((i) < NV2080_ENGINE_TYPE_NVDEC(NV2080_ENGINE_TYPE_NVDEC_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_NVDEC_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_NVDEC0) # type: ignore +NV2080_ENGINE_TYPE_NVJPEG = lambda i: (NV2080_ENGINE_TYPE_NVJPEG0+(i)) # type: ignore +NV2080_ENGINE_TYPE_IS_NVJPEG = lambda i: (((i) >= NV2080_ENGINE_TYPE_NVJPEG0) and ((i) < NV2080_ENGINE_TYPE_NVJPEG(NV2080_ENGINE_TYPE_NVJPEG_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_NVJPEG_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_NVJPEG0) # type: ignore +NV2080_ENGINE_TYPE_GR = lambda i: (NV2080_ENGINE_TYPE_GR0 + (i)) # type: ignore +NV2080_ENGINE_TYPE_IS_GR = lambda i: (((i) >= NV2080_ENGINE_TYPE_GR0) and ((i) < NV2080_ENGINE_TYPE_GR(NV2080_ENGINE_TYPE_GR_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_GR_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_GR0) # type: ignore +NV2080_ENGINE_TYPE_IS_OFA = lambda i: (((i) == NV2080_ENGINE_TYPE_OFA0) or ((i) == NV2080_ENGINE_TYPE_OFA1)) # type: ignore +NV2080_ENGINE_TYPE_IS_VALID = lambda i: (((i) > (NV2080_ENGINE_TYPE_NULL)) and ((i) < (NV2080_ENGINE_TYPE_LAST))) # type: ignore +NV2080_CLIENT_TYPE_TEX = (0x00000001) +NV2080_CLIENT_TYPE_COLOR = (0x00000002) +NV2080_CLIENT_TYPE_DEPTH = (0x00000003) +NV2080_CLIENT_TYPE_DA = (0x00000004) +NV2080_CLIENT_TYPE_FE = (0x00000005) +NV2080_CLIENT_TYPE_SCC = (0x00000006) +NV2080_CLIENT_TYPE_WID = (0x00000007) +NV2080_CLIENT_TYPE_MSVLD = (0x00000008) +NV2080_CLIENT_TYPE_MSPDEC = (0x00000009) +NV2080_CLIENT_TYPE_MSPPP = (0x0000000a) +NV2080_CLIENT_TYPE_VIC = (0x0000000b) +NV2080_CLIENT_TYPE_ALLCLIENTS = (0xffffffff) +NV2080_GC5_EXIT_COMPLETE = (0x00000001) +NV2080_GC5_ENTRY_ABORTED = (0x00000002) +NV2080_PLATFORM_POWER_MODE_CHANGE_COMPLETION = (0x00000000) +NV2080_PLATFORM_POWER_MODE_CHANGE_ACPI_NOTIFICATION = (0x00000001) +NV2080_NOTIFICATION_STATUS_ERROR_PROTECTION_FAULT = (0x4000) +NV2080_TYPEDEF = Nv20Subdevice0 +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_INDEX = (7, 0) +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_MASK = (15, 8) +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_REASON = (23, 16) +AMPERE_CHANNEL_GPFIFO_A = (0x0000C56F) +NVC56F_NUMBER_OF_SUBCHANNELS = (8) +NVC56F_SET_OBJECT = (0x00000000) +NVC56F_SET_OBJECT_NVCLASS = (15, 0) +NVC56F_SET_OBJECT_ENGINE = (20, 16) +NVC56F_SET_OBJECT_ENGINE_SW = 0x0000001f +NVC56F_ILLEGAL = (0x00000004) +NVC56F_ILLEGAL_HANDLE = (31, 0) +NVC56F_NOP = (0x00000008) +NVC56F_NOP_HANDLE = (31, 0) +NVC56F_SEMAPHOREA = (0x00000010) +NVC56F_SEMAPHOREA_OFFSET_UPPER = (7, 0) +NVC56F_SEMAPHOREB = (0x00000014) +NVC56F_SEMAPHOREB_OFFSET_LOWER = (31, 2) +NVC56F_SEMAPHOREC = (0x00000018) +NVC56F_SEMAPHOREC_PAYLOAD = (31, 0) +NVC56F_SEMAPHORED = (0x0000001C) +NVC56F_SEMAPHORED_OPERATION = (4, 0) +NVC56F_SEMAPHORED_OPERATION_ACQUIRE = 0x00000001 +NVC56F_SEMAPHORED_OPERATION_RELEASE = 0x00000002 +NVC56F_SEMAPHORED_OPERATION_ACQ_GEQ = 0x00000004 +NVC56F_SEMAPHORED_OPERATION_ACQ_AND = 0x00000008 +NVC56F_SEMAPHORED_OPERATION_REDUCTION = 0x00000010 +NVC56F_SEMAPHORED_ACQUIRE_SWITCH = (12, 12) +NVC56F_SEMAPHORED_ACQUIRE_SWITCH_DISABLED = 0x00000000 +NVC56F_SEMAPHORED_ACQUIRE_SWITCH_ENABLED = 0x00000001 +NVC56F_SEMAPHORED_RELEASE_WFI = (20, 20) +NVC56F_SEMAPHORED_RELEASE_WFI_EN = 0x00000000 +NVC56F_SEMAPHORED_RELEASE_WFI_DIS = 0x00000001 +NVC56F_SEMAPHORED_RELEASE_SIZE = (24, 24) +NVC56F_SEMAPHORED_RELEASE_SIZE_16BYTE = 0x00000000 +NVC56F_SEMAPHORED_RELEASE_SIZE_4BYTE = 0x00000001 +NVC56F_SEMAPHORED_REDUCTION = (30, 27) +NVC56F_SEMAPHORED_REDUCTION_MIN = 0x00000000 +NVC56F_SEMAPHORED_REDUCTION_MAX = 0x00000001 +NVC56F_SEMAPHORED_REDUCTION_XOR = 0x00000002 +NVC56F_SEMAPHORED_REDUCTION_AND = 0x00000003 +NVC56F_SEMAPHORED_REDUCTION_OR = 0x00000004 +NVC56F_SEMAPHORED_REDUCTION_ADD = 0x00000005 +NVC56F_SEMAPHORED_REDUCTION_INC = 0x00000006 +NVC56F_SEMAPHORED_REDUCTION_DEC = 0x00000007 +NVC56F_SEMAPHORED_FORMAT = (31, 31) +NVC56F_SEMAPHORED_FORMAT_SIGNED = 0x00000000 +NVC56F_SEMAPHORED_FORMAT_UNSIGNED = 0x00000001 +NVC56F_NON_STALL_INTERRUPT = (0x00000020) +NVC56F_NON_STALL_INTERRUPT_HANDLE = (31, 0) +NVC56F_FB_FLUSH = (0x00000024) +NVC56F_FB_FLUSH_HANDLE = (31, 0) +NVC56F_MEM_OP_A = (0x00000028) +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_CLIENT_UNIT_ID = (5, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE = (5, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_GPC_ID = (10, 6) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE = (7, 6) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_ALL_TLBS = 0 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_LINK_TLBS = 1 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_NON_LINK_TLBS = 2 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_RSVRVD = 3 +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_MMU_ENGINE_ID = (6, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR = (11, 11) +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN = 0x00000001 +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS = 0x00000000 +NVC56F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO = (31, 12) +NVC56F_MEM_OP_B = (0x0000002c) +NVC56F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI = (31, 0) +NVC56F_MEM_OP_C = (0x00000030) +NVC56F_MEM_OP_C_MEMBAR_TYPE = (2, 0) +NVC56F_MEM_OP_C_MEMBAR_TYPE_SYS_MEMBAR = 0x00000000 +NVC56F_MEM_OP_C_MEMBAR_TYPE_MEMBAR = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB = (0, 0) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC = (1, 1) +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY = (4, 2) +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START_ACK_ALL = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_TARGETED = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_GLOBAL = 0x00000004 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_VA_GLOBAL = 0x00000005 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE = (6, 5) +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_INTRANODE = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE = (9, 7) +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_READ = 0 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE = 1 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 2 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_RSVRVD = 3 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 4 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_ALL = 5 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE_AND_ATOMIC = 6 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ALL = 7 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL = (9, 7) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE0 = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE1 = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE2 = 0x00000004 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE3 = 0x00000005 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 = 0x00000006 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE5 = 0x00000007 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE = (11, 10) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_NONCOHERENT = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO = (31, 12) +NVC56F_MEM_OP_C_ACCESS_COUNTER_CLR_TARGETED_NOTIFY_TAG = (19, 0) +NVC56F_MEM_OP_D = (0x00000034) +NVC56F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI = (26, 0) +NVC56F_MEM_OP_D_OPERATION = (31, 27) +NVC56F_MEM_OP_D_OPERATION_MEMBAR = 0x00000005 +NVC56F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE = 0x00000009 +NVC56F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED = 0x0000000a +NVC56F_MEM_OP_D_OPERATION_L2_PEERMEM_INVALIDATE = 0x0000000d +NVC56F_MEM_OP_D_OPERATION_L2_SYSMEM_INVALIDATE = 0x0000000e +NVC56F_MEM_OP_B_OPERATION_L2_INVALIDATE_CLEAN_LINES = 0x0000000e +NVC56F_MEM_OP_D_OPERATION_L2_CLEAN_COMPTAGS = 0x0000000f +NVC56F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY = 0x00000010 +NVC56F_MEM_OP_D_OPERATION_L2_WAIT_FOR_SYS_PENDING_READS = 0x00000015 +NVC56F_MEM_OP_D_OPERATION_ACCESS_COUNTER_CLR = 0x00000016 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE = (1, 0) +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MIMC = 0x00000000 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MOMC = 0x00000001 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_ALL = 0x00000002 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_TARGETED = 0x00000003 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE = (2, 2) +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MIMC = 0x00000000 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MOMC = 0x00000001 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_BANK = (6, 3) +NVC56F_SET_REFERENCE = (0x00000050) +NVC56F_SET_REFERENCE_COUNT = (31, 0) +NVC56F_SEM_ADDR_LO = (0x0000005c) +NVC56F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC56F_SEM_ADDR_HI = (0x00000060) +NVC56F_SEM_ADDR_HI_OFFSET = (7, 0) +NVC56F_SEM_PAYLOAD_LO = (0x00000064) +NVC56F_SEM_PAYLOAD_LO_PAYLOAD = (31, 0) +NVC56F_SEM_PAYLOAD_HI = (0x00000068) +NVC56F_SEM_PAYLOAD_HI_PAYLOAD = (31, 0) +NVC56F_SEM_EXECUTE = (0x0000006c) +NVC56F_SEM_EXECUTE_OPERATION = (2, 0) +NVC56F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC56F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_STRICT_GEQ = 0x00000002 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_CIRC_GEQ = 0x00000003 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_AND = 0x00000004 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_NOR = 0x00000005 +NVC56F_SEM_EXECUTE_OPERATION_REDUCTION = 0x00000006 +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG = (12, 12) +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG_EN = 0x00000001 +NVC56F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC56F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_RELEASE_WFI_EN = 0x00000001 +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE_64BIT = 0x00000001 +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP = (25, 25) +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP_EN = 0x00000001 +NVC56F_SEM_EXECUTE_REDUCTION = (30, 27) +NVC56F_SEM_EXECUTE_REDUCTION_IMIN = 0x00000000 +NVC56F_SEM_EXECUTE_REDUCTION_IMAX = 0x00000001 +NVC56F_SEM_EXECUTE_REDUCTION_IXOR = 0x00000002 +NVC56F_SEM_EXECUTE_REDUCTION_IAND = 0x00000003 +NVC56F_SEM_EXECUTE_REDUCTION_IOR = 0x00000004 +NVC56F_SEM_EXECUTE_REDUCTION_IADD = 0x00000005 +NVC56F_SEM_EXECUTE_REDUCTION_INC = 0x00000006 +NVC56F_SEM_EXECUTE_REDUCTION_DEC = 0x00000007 +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT = (31, 31) +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT_SIGNED = 0x00000000 +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT_UNSIGNED = 0x00000001 +NVC56F_WFI = (0x00000078) +NVC56F_WFI_SCOPE = (0, 0) +NVC56F_WFI_SCOPE_CURRENT_SCG_TYPE = 0x00000000 +NVC56F_WFI_SCOPE_CURRENT_VEID = 0x00000000 +NVC56F_WFI_SCOPE_ALL = 0x00000001 +NVC56F_YIELD = (0x00000080) +NVC56F_YIELD_OP = (1, 0) +NVC56F_YIELD_OP_NOP = 0x00000000 +NVC56F_YIELD_OP_TSG = 0x00000003 +NVC56F_CLEAR_FAULTED = (0x00000084) +NVC56F_CLEAR_FAULTED_HANDLE = (30, 0) +NVC56F_CLEAR_FAULTED_TYPE = (31, 31) +NVC56F_CLEAR_FAULTED_TYPE_PBDMA_FAULTED = 0x00000000 +NVC56F_CLEAR_FAULTED_TYPE_ENG_FAULTED = 0x00000001 +NVC56F_GP_ENTRY__SIZE = 8 +NVC56F_GP_ENTRY0_FETCH = (0, 0) +NVC56F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC56F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC56F_GP_ENTRY0_GET = (31, 2) +NVC56F_GP_ENTRY0_OPERAND = (31, 0) +NVC56F_GP_ENTRY1_GET_HI = (7, 0) +NVC56F_GP_ENTRY1_LEVEL = (9, 9) +NVC56F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC56F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC56F_GP_ENTRY1_LENGTH = (30, 10) +NVC56F_GP_ENTRY1_SYNC = (31, 31) +NVC56F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC56F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC56F_GP_ENTRY1_OPCODE = (7, 0) +NVC56F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC56F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC56F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC56F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC56F_DMA_METHOD_ADDRESS_OLD = (12, 2) +NVC56F_DMA_METHOD_ADDRESS = (11, 0) +NVC56F_DMA_SUBDEVICE_MASK = (15, 4) +NVC56F_DMA_METHOD_SUBCHANNEL = (15, 13) +NVC56F_DMA_TERT_OP = (17, 16) +NVC56F_DMA_TERT_OP_GRP0_INC_METHOD = (0x00000000) +NVC56F_DMA_TERT_OP_GRP0_SET_SUB_DEV_MASK = (0x00000001) +NVC56F_DMA_TERT_OP_GRP0_STORE_SUB_DEV_MASK = (0x00000002) +NVC56F_DMA_TERT_OP_GRP0_USE_SUB_DEV_MASK = (0x00000003) +NVC56F_DMA_TERT_OP_GRP2_NON_INC_METHOD = (0x00000000) +NVC56F_DMA_METHOD_COUNT_OLD = (28, 18) +NVC56F_DMA_METHOD_COUNT = (28, 16) +NVC56F_DMA_IMMD_DATA = (28, 16) +NVC56F_DMA_SEC_OP = (31, 29) +NVC56F_DMA_SEC_OP_GRP0_USE_TERT = (0x00000000) +NVC56F_DMA_SEC_OP_INC_METHOD = (0x00000001) +NVC56F_DMA_SEC_OP_GRP2_USE_TERT = (0x00000002) +NVC56F_DMA_SEC_OP_NON_INC_METHOD = (0x00000003) +NVC56F_DMA_SEC_OP_IMMD_DATA_METHOD = (0x00000004) +NVC56F_DMA_SEC_OP_ONE_INC = (0x00000005) +NVC56F_DMA_SEC_OP_RESERVED6 = (0x00000006) +NVC56F_DMA_SEC_OP_END_PB_SEGMENT = (0x00000007) +NVC56F_DMA_INCR_ADDRESS = (11, 0) +NVC56F_DMA_INCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_INCR_COUNT = (28, 16) +NVC56F_DMA_INCR_OPCODE = (31, 29) +NVC56F_DMA_INCR_OPCODE_VALUE = (0x00000001) +NVC56F_DMA_INCR_DATA = (31, 0) +NVC56F_DMA_NONINCR_ADDRESS = (11, 0) +NVC56F_DMA_NONINCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_NONINCR_COUNT = (28, 16) +NVC56F_DMA_NONINCR_OPCODE = (31, 29) +NVC56F_DMA_NONINCR_OPCODE_VALUE = (0x00000003) +NVC56F_DMA_NONINCR_DATA = (31, 0) +NVC56F_DMA_ONEINCR_ADDRESS = (11, 0) +NVC56F_DMA_ONEINCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_ONEINCR_COUNT = (28, 16) +NVC56F_DMA_ONEINCR_OPCODE = (31, 29) +NVC56F_DMA_ONEINCR_OPCODE_VALUE = (0x00000005) +NVC56F_DMA_ONEINCR_DATA = (31, 0) +NVC56F_DMA_NOP = (0x00000000) +NVC56F_DMA_IMMD_ADDRESS = (11, 0) +NVC56F_DMA_IMMD_SUBCHANNEL = (15, 13) +NVC56F_DMA_IMMD_DATA = (28, 16) +NVC56F_DMA_IMMD_OPCODE = (31, 29) +NVC56F_DMA_IMMD_OPCODE_VALUE = (0x00000004) +NVC56F_DMA_SET_SUBDEVICE_MASK_VALUE = (15, 4) +NVC56F_DMA_SET_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_SET_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000001) +NVC56F_DMA_STORE_SUBDEVICE_MASK_VALUE = (15, 4) +NVC56F_DMA_STORE_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_STORE_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000002) +NVC56F_DMA_USE_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_USE_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000003) +NVC56F_DMA_ENDSEG_OPCODE = (31, 29) +NVC56F_DMA_ENDSEG_OPCODE_VALUE = (0x00000007) +NVC56F_DMA_ADDRESS = (12, 2) +NVC56F_DMA_SUBCH = (15, 13) +NVC56F_DMA_OPCODE3 = (17, 16) +NVC56F_DMA_OPCODE3_NONE = (0x00000000) +NVC56F_DMA_COUNT = (28, 18) +NVC56F_DMA_OPCODE = (31, 29) +NVC56F_DMA_OPCODE_METHOD = (0x00000000) +NVC56F_DMA_OPCODE_NONINC_METHOD = (0x00000002) +NVC56F_DMA_DATA = (31, 0) +HOPPER_CHANNEL_GPFIFO_A = (0x0000C86F) +NVC86F_SET_OBJECT = (0x00000000) +NVC86F_SEM_ADDR_LO = (0x0000005c) +NVC86F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC86F_SEM_ADDR_HI = (0x00000060) +NVC86F_SEM_ADDR_HI_OFFSET = (24, 0) +NVC86F_SEM_PAYLOAD_LO = (0x00000064) +NVC86F_SEM_PAYLOAD_HI = (0x00000068) +NVC86F_SEM_EXECUTE = (0x0000006c) +NVC86F_SEM_EXECUTE_OPERATION = (2, 0) +NVC86F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC86F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC86F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC86F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC86F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC86F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC86F_GP_ENTRY__SIZE = 8 +NVC86F_GP_ENTRY0_FETCH = (0, 0) +NVC86F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC86F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC86F_GP_ENTRY0_GET = (31, 2) +NVC86F_GP_ENTRY0_OPERAND = (31, 0) +NVC86F_GP_ENTRY0_PB_EXTENDED_BASE_OPERAND = (24, 8) +NVC86F_GP_ENTRY1_GET_HI = (7, 0) +NVC86F_GP_ENTRY1_LEVEL = (9, 9) +NVC86F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC86F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC86F_GP_ENTRY1_LENGTH = (30, 10) +NVC86F_GP_ENTRY1_SYNC = (31, 31) +NVC86F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC86F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC86F_GP_ENTRY1_OPCODE = (7, 0) +NVC86F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC86F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC86F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC86F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC86F_GP_ENTRY1_OPCODE_SET_PB_SEGMENT_EXTENDED_BASE = 0x00000004 +NVC86F_WFI = (0x00000078) +NVC86F_WFI_SCOPE = (0, 0) +NVC86F_WFI_SCOPE_CURRENT_SCG_TYPE = 0x00000000 +NVC86F_WFI_SCOPE_CURRENT_VEID = 0x00000000 +NVC86F_WFI_SCOPE_ALL = 0x00000001 +NVC86F_MEM_OP_A = (0x00000028) +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_CLIENT_UNIT_ID = (5, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE = (5, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_GPC_ID = (10, 6) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE = (7, 6) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_ALL_TLBS = 0 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_LINK_TLBS = 1 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_NON_LINK_TLBS = 2 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_RSVRVD = 3 +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_MMU_ENGINE_ID = (8, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR = (11, 11) +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN = 0x00000001 +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS = 0x00000000 +NVC86F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO = (31, 12) +NVC86F_MEM_OP_B = (0x0000002c) +NVC86F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI = (31, 0) +NVC86F_MEM_OP_C = (0x00000030) +NVC86F_MEM_OP_C_MEMBAR_TYPE = (2, 0) +NVC86F_MEM_OP_C_MEMBAR_TYPE_SYS_MEMBAR = 0x00000000 +NVC86F_MEM_OP_C_MEMBAR_TYPE_MEMBAR = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB = (0, 0) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC = (1, 1) +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY = (4, 2) +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START_ACK_ALL = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_TARGETED = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_GLOBAL = 0x00000004 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_VA_GLOBAL = 0x00000005 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE = (6, 5) +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_INTRANODE = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE = (9, 7) +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_READ = 0 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE = 1 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 2 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_RSVRVD = 3 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 4 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_ALL = 5 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE_AND_ATOMIC = 6 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ALL = 7 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL = (9, 7) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE0 = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE1 = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE2 = 0x00000004 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE3 = 0x00000005 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 = 0x00000006 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE5 = 0x00000007 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE = (11, 10) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_NONCOHERENT = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO = (31, 12) +NVC86F_MEM_OP_C_ACCESS_COUNTER_CLR_TARGETED_NOTIFY_TAG = (19, 0) +NVC86F_MEM_OP_D = (0x00000034) +NVC86F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI = (26, 0) +NVC86F_MEM_OP_D_OPERATION = (31, 27) +NVC86F_MEM_OP_D_OPERATION_MEMBAR = 0x00000005 +NVC86F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE = 0x00000009 +NVC86F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED = 0x0000000a +NVC86F_MEM_OP_D_OPERATION_MMU_OPERATION = 0x0000000b +NVC86F_MEM_OP_D_OPERATION_L2_PEERMEM_INVALIDATE = 0x0000000d +NVC86F_MEM_OP_D_OPERATION_L2_SYSMEM_INVALIDATE = 0x0000000e +NVC86F_MEM_OP_B_OPERATION_L2_INVALIDATE_CLEAN_LINES = 0x0000000e +NVC86F_MEM_OP_D_OPERATION_L2_CLEAN_COMPTAGS = 0x0000000f +NVC86F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY = 0x00000010 +NVC86F_MEM_OP_D_OPERATION_L2_WAIT_FOR_SYS_PENDING_READS = 0x00000015 +NVC86F_MEM_OP_D_OPERATION_ACCESS_COUNTER_CLR = 0x00000016 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE = (1, 0) +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MIMC = 0x00000000 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MOMC = 0x00000001 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_ALL = 0x00000002 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_TARGETED = 0x00000003 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE = (2, 2) +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MIMC = 0x00000000 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MOMC = 0x00000001 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_BANK = (6, 3) +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE = (23, 20) +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE_RESERVED = 0x00000000 +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE_VIDMEM_ACCESS_BIT_DUMP = 0x00000001 +BLACKWELL_CHANNEL_GPFIFO_A = (0x0000C96F) +NVC96F_SET_OBJECT = (0x00000000) +NVC96F_SEM_ADDR_LO = (0x0000005c) +NVC96F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC96F_SEM_ADDR_HI = (0x00000060) +NVC96F_SEM_ADDR_HI_OFFSET = (24, 0) +NVC96F_SEM_PAYLOAD_LO = (0x00000064) +NVC96F_SEM_PAYLOAD_HI = (0x00000068) +NVC96F_SEM_EXECUTE = (0x0000006c) +NVC96F_SEM_EXECUTE_OPERATION = (2, 0) +NVC96F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC96F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC96F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC96F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC96F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC96F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC96F_GP_ENTRY__SIZE = 8 +NVC96F_GP_ENTRY0_FETCH = (0, 0) +NVC96F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC96F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC96F_GP_ENTRY0_GET = (31, 2) +NVC96F_GP_ENTRY0_OPERAND = (31, 0) +NVC96F_GP_ENTRY0_PB_EXTENDED_BASE_OPERAND = (24, 8) +NVC96F_GP_ENTRY1_GET_HI = (7, 0) +NVC96F_GP_ENTRY1_LEVEL = (9, 9) +NVC96F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC96F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC96F_GP_ENTRY1_LENGTH = (30, 10) +NVC96F_GP_ENTRY1_SYNC = (31, 31) +NVC96F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC96F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC96F_GP_ENTRY1_OPCODE = (7, 0) +NVC96F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC96F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC96F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC96F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC96F_GP_ENTRY1_OPCODE_SET_PB_SEGMENT_EXTENDED_BASE = 0x00000004 +BLACKWELL_USERMODE_A = (0xc761) +GT200_DEBUGGER = (0x83de) +NV83DE_ALLOC_PARAMETERS_MESSAGE_ID = (0x83de) +MAXWELL_PROFILER_DEVICE = (0xb2cc) +NVB2CC_ALLOC_PARAMETERS_MESSAGE_ID = (0xb2cc) +AMPERE_COMPUTE_A = 0xC6C0 +NVC6C0_SET_OBJECT = 0x0000 +NVC6C0_SET_OBJECT_CLASS_ID = (15, 0) +NVC6C0_SET_OBJECT_ENGINE_ID = (20, 16) +NVC6C0_NO_OPERATION = 0x0100 +NVC6C0_NO_OPERATION_V = (31, 0) +NVC6C0_SET_NOTIFY_A = 0x0104 +NVC6C0_SET_NOTIFY_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_NOTIFY_B = 0x0108 +NVC6C0_SET_NOTIFY_B_ADDRESS_LOWER = (31, 0) +NVC6C0_NOTIFY = 0x010c +NVC6C0_NOTIFY_TYPE = (31, 0) +NVC6C0_NOTIFY_TYPE_WRITE_ONLY = 0x00000000 +NVC6C0_NOTIFY_TYPE_WRITE_THEN_AWAKEN = 0x00000001 +NVC6C0_WAIT_FOR_IDLE = 0x0110 +NVC6C0_WAIT_FOR_IDLE_V = (31, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_A = 0x0130 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_B = 0x0134 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C = 0x0138 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE = (2, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_FALSE = 0x00000000 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_TRUE = 0x00000001 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_CONDITIONAL = 0x00000002 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = 0x00000003 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = 0x00000004 +NVC6C0_SEND_GO_IDLE = 0x013c +NVC6C0_SEND_GO_IDLE_V = (31, 0) +NVC6C0_PM_TRIGGER = 0x0140 +NVC6C0_PM_TRIGGER_V = (31, 0) +NVC6C0_PM_TRIGGER_WFI = 0x0144 +NVC6C0_PM_TRIGGER_WFI_V = (31, 0) +NVC6C0_FE_ATOMIC_SEQUENCE_BEGIN = 0x0148 +NVC6C0_FE_ATOMIC_SEQUENCE_BEGIN_V = (31, 0) +NVC6C0_FE_ATOMIC_SEQUENCE_END = 0x014c +NVC6C0_FE_ATOMIC_SEQUENCE_END_V = (31, 0) +NVC6C0_SET_INSTRUMENTATION_METHOD_HEADER = 0x0150 +NVC6C0_SET_INSTRUMENTATION_METHOD_HEADER_V = (31, 0) +NVC6C0_SET_INSTRUMENTATION_METHOD_DATA = 0x0154 +NVC6C0_SET_INSTRUMENTATION_METHOD_DATA_V = (31, 0) +NVC6C0_LINE_LENGTH_IN = 0x0180 +NVC6C0_LINE_LENGTH_IN_VALUE = (31, 0) +NVC6C0_LINE_COUNT = 0x0184 +NVC6C0_LINE_COUNT_VALUE = (31, 0) +NVC6C0_OFFSET_OUT_UPPER = 0x0188 +NVC6C0_OFFSET_OUT_UPPER_VALUE = (16, 0) +NVC6C0_OFFSET_OUT = 0x018c +NVC6C0_OFFSET_OUT_VALUE = (31, 0) +NVC6C0_PITCH_OUT = 0x0190 +NVC6C0_PITCH_OUT_VALUE = (31, 0) +NVC6C0_SET_DST_BLOCK_SIZE = 0x0194 +NVC6C0_SET_DST_BLOCK_SIZE_WIDTH = (3, 0) +NVC6C0_SET_DST_BLOCK_SIZE_WIDTH_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_TWO_GOBS = 0x00000001 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_FOUR_GOBS = 0x00000002 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = 0x00000003 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = 0x00000004 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = 0x00000005 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH = (11, 8) +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_TWO_GOBS = 0x00000001 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_FOUR_GOBS = 0x00000002 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_EIGHT_GOBS = 0x00000003 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = 0x00000004 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = 0x00000005 +NVC6C0_SET_DST_WIDTH = 0x0198 +NVC6C0_SET_DST_WIDTH_V = (31, 0) +NVC6C0_SET_DST_HEIGHT = 0x019c +NVC6C0_SET_DST_HEIGHT_V = (31, 0) +NVC6C0_SET_DST_DEPTH = 0x01a0 +NVC6C0_SET_DST_DEPTH_V = (31, 0) +NVC6C0_SET_DST_LAYER = 0x01a4 +NVC6C0_SET_DST_LAYER_V = (31, 0) +NVC6C0_SET_DST_ORIGIN_BYTES_X = 0x01a8 +NVC6C0_SET_DST_ORIGIN_BYTES_X_V = (20, 0) +NVC6C0_SET_DST_ORIGIN_SAMPLES_Y = 0x01ac +NVC6C0_SET_DST_ORIGIN_SAMPLES_Y_V = (16, 0) +NVC6C0_LAUNCH_DMA = 0x01b0 +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT = (0, 0) +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT_BLOCKLINEAR = 0x00000000 +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT_PITCH = 0x00000001 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE = (5, 4) +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_FLUSH_DISABLE = 0x00000000 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_FLUSH_ONLY = 0x00000001 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_RELEASE_SEMAPHORE = 0x00000002 +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE = (9, 8) +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE_NONE = 0x00000000 +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE_INTERRUPT = 0x00000001 +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE = (12, 12) +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE_ONE_WORD = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE = (1, 1) +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_OP = (15, 13) +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT = (3, 2) +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE = (6, 6) +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE_FALSE = 0x00000000 +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE_TRUE = 0x00000001 +NVC6C0_LOAD_INLINE_DATA = 0x01b4 +NVC6C0_LOAD_INLINE_DATA_V = (31, 0) +NVC6C0_SET_I2M_SEMAPHORE_A = 0x01dc +NVC6C0_SET_I2M_SEMAPHORE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_I2M_SEMAPHORE_B = 0x01e0 +NVC6C0_SET_I2M_SEMAPHORE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_I2M_SEMAPHORE_C = 0x01e4 +NVC6C0_SET_I2M_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC6C0_SET_SM_SCG_CONTROL = 0x01e8 +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS = (0, 0) +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS_FALSE = 0x00000000 +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS_TRUE = 0x00000001 +NVC6C0_SET_I2M_SPARE_NOOP00 = 0x01f0 +NVC6C0_SET_I2M_SPARE_NOOP00_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP01 = 0x01f4 +NVC6C0_SET_I2M_SPARE_NOOP01_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP02 = 0x01f8 +NVC6C0_SET_I2M_SPARE_NOOP02_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP03 = 0x01fc +NVC6C0_SET_I2M_SPARE_NOOP03_V = (31, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_A = 0x0200 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_B = 0x0204 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_C = 0x0208 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_C_SIZE = (31, 0) +NVC6C0_PERFMON_TRANSFER = 0x0210 +NVC6C0_PERFMON_TRANSFER_V = (31, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_A = 0x0214 +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_B = 0x0218 +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_B_ADDRESS_LOWER = (31, 0) +NVC6C0_INVALIDATE_SHADER_CACHES = 0x021c +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION = (0, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_DATA = (4, 4) +NVC6C0_INVALIDATE_SHADER_CACHES_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_DATA_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT = (12, 12) +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS = (1, 1) +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA = (2, 2) +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA_TRUE = 0x00000001 +NVC6C0_SET_RESERVED_SW_METHOD00 = 0x0220 +NVC6C0_SET_RESERVED_SW_METHOD00_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD01 = 0x0224 +NVC6C0_SET_RESERVED_SW_METHOD01_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD02 = 0x0228 +NVC6C0_SET_RESERVED_SW_METHOD02_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD03 = 0x022c +NVC6C0_SET_RESERVED_SW_METHOD03_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD04 = 0x0230 +NVC6C0_SET_RESERVED_SW_METHOD04_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD05 = 0x0234 +NVC6C0_SET_RESERVED_SW_METHOD05_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD06 = 0x0238 +NVC6C0_SET_RESERVED_SW_METHOD06_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD07 = 0x023c +NVC6C0_SET_RESERVED_SW_METHOD07_V = (31, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI = 0x0244 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_SET_CWD_REF_COUNTER = 0x0248 +NVC6C0_SET_CWD_REF_COUNTER_SELECT = (5, 0) +NVC6C0_SET_CWD_REF_COUNTER_VALUE = (23, 8) +NVC6C0_SET_RESERVED_SW_METHOD08 = 0x024c +NVC6C0_SET_RESERVED_SW_METHOD08_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD09 = 0x0250 +NVC6C0_SET_RESERVED_SW_METHOD09_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD10 = 0x0254 +NVC6C0_SET_RESERVED_SW_METHOD10_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD11 = 0x0258 +NVC6C0_SET_RESERVED_SW_METHOD11_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD12 = 0x025c +NVC6C0_SET_RESERVED_SW_METHOD12_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD13 = 0x0260 +NVC6C0_SET_RESERVED_SW_METHOD13_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD14 = 0x0264 +NVC6C0_SET_RESERVED_SW_METHOD14_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD15 = 0x0268 +NVC6C0_SET_RESERVED_SW_METHOD15_V = (31, 0) +NVC6C0_SET_SCG_CONTROL = 0x0270 +NVC6C0_SET_SCG_CONTROL_COMPUTE1_MAX_SM_COUNT = (8, 0) +NVC6C0_SET_SCG_CONTROL_COMPUTE1_MIN_SM_COUNT = (20, 12) +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE = (24, 24) +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE_FALSE = 0x00000000 +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE_TRUE = 0x00000001 +NVC6C0_SET_COMPUTE_CLASS_VERSION = 0x0280 +NVC6C0_SET_COMPUTE_CLASS_VERSION_CURRENT = (15, 0) +NVC6C0_SET_COMPUTE_CLASS_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_CHECK_COMPUTE_CLASS_VERSION = 0x0284 +NVC6C0_CHECK_COMPUTE_CLASS_VERSION_CURRENT = (15, 0) +NVC6C0_CHECK_COMPUTE_CLASS_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_SET_QMD_VERSION = 0x0288 +NVC6C0_SET_QMD_VERSION_CURRENT = (15, 0) +NVC6C0_SET_QMD_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_CHECK_QMD_VERSION = 0x0290 +NVC6C0_CHECK_QMD_VERSION_CURRENT = (15, 0) +NVC6C0_CHECK_QMD_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_INVALIDATE_SKED_CACHES = 0x0298 +NVC6C0_INVALIDATE_SKED_CACHES_V = (0, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL = 0x029c +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_CONSTANT_BUFFER_MASK = (7, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE = (8, 8) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE = (12, 12) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE = (16, 16) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE = (20, 20) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE = (24, 24) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_A = 0x02a0 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_A_BASE_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_B = 0x02a4 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_B_BASE_ADDRESS = (31, 0) +NVC6C0_SCG_HYSTERESIS_CONTROL = 0x02a8 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE = (0, 0) +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE_FALSE = 0x00000000 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE_TRUE = 0x00000001 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE = (1, 1) +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE_FALSE = 0x00000000 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE_TRUE = 0x00000001 +NVC6C0_SET_CWD_SLOT_COUNT = 0x02b0 +NVC6C0_SET_CWD_SLOT_COUNT_V = (7, 0) +NVC6C0_SEND_PCAS_A = 0x02b4 +NVC6C0_SEND_PCAS_A_QMD_ADDRESS_SHIFTED8 = (31, 0) +NVC6C0_SEND_PCAS_B = 0x02b8 +NVC6C0_SEND_PCAS_B_FROM = (23, 0) +NVC6C0_SEND_PCAS_B_DELTA = (31, 24) +NVC6C0_SEND_SIGNALING_PCAS_B = 0x02bc +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE = (0, 0) +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE_FALSE = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE_TRUE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE = (1, 1) +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE_FALSE = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE_TRUE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS2_B = 0x02c0 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION = (3, 0) +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_NOP = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_SCHEDULE = 0x00000002 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INCREMENT_PUT = 0x00000006 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_DECREMENT_DEPENDENCE = 0x00000007 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_PREFETCH = 0x00000008 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_PREFETCH_SCHEDULE = 0x00000009 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_PREFETCH_COPY_SCHEDULE = 0x0000000A +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_PREFETCH_COPY_FORCE_REQUIRE_SCHEDULING = 0x0000000B +NVC6C0_SET_SKED_CACHE_CONTROL = 0x02cc +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID = (0, 0) +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID_FALSE = 0x00000000 +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID_TRUE = 0x00000001 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A = 0x02e4 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A_SIZE_UPPER = (7, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_B = 0x02e8 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_B_SIZE_LOWER = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C = 0x02ec +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C_MAX_SM_COUNT = (8, 0) +NVC6C0_SET_SPA_VERSION = 0x0310 +NVC6C0_SET_SPA_VERSION_MINOR = (7, 0) +NVC6C0_SET_SPA_VERSION_MAJOR = (15, 8) +NVC6C0_SET_INLINE_QMD_ADDRESS_A = 0x0318 +NVC6C0_SET_INLINE_QMD_ADDRESS_A_QMD_ADDRESS_SHIFTED8_UPPER = (31, 0) +NVC6C0_SET_INLINE_QMD_ADDRESS_B = 0x031c +NVC6C0_SET_INLINE_QMD_ADDRESS_B_QMD_ADDRESS_SHIFTED8_LOWER = (31, 0) +NVC6C0_LOAD_INLINE_QMD_DATA = lambda i: (0x0320+(i)*4) # type: ignore +NVC6C0_LOAD_INLINE_QMD_DATA_V = (31, 0) +NVC6C0_SET_FALCON00 = 0x0500 +NVC6C0_SET_FALCON00_V = (31, 0) +NVC6C0_SET_FALCON01 = 0x0504 +NVC6C0_SET_FALCON01_V = (31, 0) +NVC6C0_SET_FALCON02 = 0x0508 +NVC6C0_SET_FALCON02_V = (31, 0) +NVC6C0_SET_FALCON03 = 0x050c +NVC6C0_SET_FALCON03_V = (31, 0) +NVC6C0_SET_FALCON04 = 0x0510 +NVC6C0_SET_FALCON04_V = (31, 0) +NVC6C0_SET_FALCON05 = 0x0514 +NVC6C0_SET_FALCON05_V = (31, 0) +NVC6C0_SET_FALCON06 = 0x0518 +NVC6C0_SET_FALCON06_V = (31, 0) +NVC6C0_SET_FALCON07 = 0x051c +NVC6C0_SET_FALCON07_V = (31, 0) +NVC6C0_SET_FALCON08 = 0x0520 +NVC6C0_SET_FALCON08_V = (31, 0) +NVC6C0_SET_FALCON09 = 0x0524 +NVC6C0_SET_FALCON09_V = (31, 0) +NVC6C0_SET_FALCON10 = 0x0528 +NVC6C0_SET_FALCON10_V = (31, 0) +NVC6C0_SET_FALCON11 = 0x052c +NVC6C0_SET_FALCON11_V = (31, 0) +NVC6C0_SET_FALCON12 = 0x0530 +NVC6C0_SET_FALCON12_V = (31, 0) +NVC6C0_SET_FALCON13 = 0x0534 +NVC6C0_SET_FALCON13_V = (31, 0) +NVC6C0_SET_FALCON14 = 0x0538 +NVC6C0_SET_FALCON14_V = (31, 0) +NVC6C0_SET_FALCON15 = 0x053c +NVC6C0_SET_FALCON15_V = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_A = 0x0790 +NVC6C0_SET_SHADER_LOCAL_MEMORY_A_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_B = 0x0794 +NVC6C0_SET_SHADER_LOCAL_MEMORY_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_A = 0x07b0 +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_A_BASE_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_B = 0x07b4 +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_B_BASE_ADDRESS = (31, 0) +NVC6C0_SET_SHADER_CACHE_CONTROL = 0x0d94 +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE = (0, 0) +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_SCG_COMPUTE_SCHEDULING_PARAMETERS = lambda i: (0x0da0+(i)*4) # type: ignore +NVC6C0_SET_SCG_COMPUTE_SCHEDULING_PARAMETERS_V = (31, 0) +NVC6C0_SET_SM_TIMEOUT_INTERVAL = 0x0de4 +NVC6C0_SET_SM_TIMEOUT_INTERVAL_COUNTER_BIT = (5, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI = 0x1288 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT = 0x12a8 +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL = (0, 0) +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL_FALSE = 0x00000000 +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE = 0x1330 +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE = 0x1334 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE = 0x1338 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI = 0x1424 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_SET_SHADER_EXCEPTIONS = 0x1528 +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE = (0, 0) +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_A = 0x1550 +NVC6C0_SET_RENDER_ENABLE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_RENDER_ENABLE_B = 0x1554 +NVC6C0_SET_RENDER_ENABLE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_RENDER_ENABLE_C = 0x1558 +NVC6C0_SET_RENDER_ENABLE_C_MODE = (2, 0) +NVC6C0_SET_RENDER_ENABLE_C_MODE_FALSE = 0x00000000 +NVC6C0_SET_RENDER_ENABLE_C_MODE_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_C_MODE_CONDITIONAL = 0x00000002 +NVC6C0_SET_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = 0x00000003 +NVC6C0_SET_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = 0x00000004 +NVC6C0_SET_TEX_SAMPLER_POOL_A = 0x155c +NVC6C0_SET_TEX_SAMPLER_POOL_A_OFFSET_UPPER = (16, 0) +NVC6C0_SET_TEX_SAMPLER_POOL_B = 0x1560 +NVC6C0_SET_TEX_SAMPLER_POOL_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_TEX_SAMPLER_POOL_C = 0x1564 +NVC6C0_SET_TEX_SAMPLER_POOL_C_MAXIMUM_INDEX = (19, 0) +NVC6C0_SET_TEX_HEADER_POOL_A = 0x1574 +NVC6C0_SET_TEX_HEADER_POOL_A_OFFSET_UPPER = (16, 0) +NVC6C0_SET_TEX_HEADER_POOL_B = 0x1578 +NVC6C0_SET_TEX_HEADER_POOL_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_TEX_HEADER_POOL_C = 0x157c +NVC6C0_SET_TEX_HEADER_POOL_C_MAXIMUM_INDEX = (21, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI = 0x1698 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION = (0, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA = (4, 4) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT = (12, 12) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE = 0x1944 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE = (1, 0) +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_USE_RENDER_ENABLE = 0x00000000 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_ALWAYS_RENDER = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_NEVER_RENDER = 0x00000002 +NVC6C0_PIPE_NOP = 0x1a2c +NVC6C0_PIPE_NOP_V = (31, 0) +NVC6C0_SET_SPARE00 = 0x1a30 +NVC6C0_SET_SPARE00_V = (31, 0) +NVC6C0_SET_SPARE01 = 0x1a34 +NVC6C0_SET_SPARE01_V = (31, 0) +NVC6C0_SET_SPARE02 = 0x1a38 +NVC6C0_SET_SPARE02_V = (31, 0) +NVC6C0_SET_SPARE03 = 0x1a3c +NVC6C0_SET_SPARE03_V = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_A = 0x1b00 +NVC6C0_SET_REPORT_SEMAPHORE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_REPORT_SEMAPHORE_B = 0x1b04 +NVC6C0_SET_REPORT_SEMAPHORE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_C = 0x1b08 +NVC6C0_SET_REPORT_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_D = 0x1b0c +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION = (1, 0) +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION_RELEASE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION_TRAP = 0x00000003 +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE = (20, 20) +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE = (28, 28) +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE = (2, 2) +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE = (3, 3) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP = (11, 9) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT = (18, 17) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP = (19, 19) +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP_TRUE = 0x00000001 +NVC6C0_SET_TRAP_HANDLER_A = 0x25f8 +NVC6C0_SET_TRAP_HANDLER_A_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_TRAP_HANDLER_B = 0x25fc +NVC6C0_SET_TRAP_HANDLER_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_BINDLESS_TEXTURE = 0x2608 +NVC6C0_SET_BINDLESS_TEXTURE_CONSTANT_BUFFER_SLOT_SELECT = (2, 0) +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE = lambda i: (0x32f4+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_UPPER = lambda i: (0x3314+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_UPPER_V = (31, 0) +NVC6C0_ENABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER = 0x3334 +NVC6C0_ENABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_V = (0, 0) +NVC6C0_DISABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER = 0x3338 +NVC6C0_DISABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_V = (0, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_UPPER = lambda i: (0x333c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_UPPER_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE = lambda i: (0x335c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_EVENT = lambda i: (0x337c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_EVENT_EVENT = (7, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A = lambda i: (0x339c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT0 = (1, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT0 = (4, 2) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT1 = (6, 5) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT1 = (9, 7) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT2 = (11, 10) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT2 = (14, 12) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT3 = (16, 15) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT3 = (19, 17) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT4 = (21, 20) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT4 = (24, 22) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT5 = (26, 25) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT5 = (29, 27) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_SPARE = (31, 30) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B = lambda i: (0x33bc+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_EDGE = (0, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_MODE = (2, 1) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_WINDOWED = (3, 3) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_FUNC = (19, 4) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_TRAP_CONTROL = 0x33dc +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_TRAP_CONTROL_MASK = (7, 0) +NVC6C0_START_SHADER_PERFORMANCE_COUNTER = 0x33e0 +NVC6C0_START_SHADER_PERFORMANCE_COUNTER_COUNTER_MASK = (7, 0) +NVC6C0_STOP_SHADER_PERFORMANCE_COUNTER = 0x33e4 +NVC6C0_STOP_SHADER_PERFORMANCE_COUNTER_COUNTER_MASK = (7, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_SCTL_FILTER = 0x33e8 +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_SCTL_FILTER_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CORE_MIO_FILTER = 0x33ec +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CORE_MIO_FILTER_V = (31, 0) +NVC6C0_SET_MME_SHADOW_SCRATCH = lambda i: (0x3400+(i)*4) # type: ignore +NVC6C0_SET_MME_SHADOW_SCRATCH_V = (31, 0) +BLACKWELL_COMPUTE_A = 0xCDC0 +AMPERE_DMA_COPY_A = (0x0000C6B5) +NVC6B5_NOP = (0x00000100) +NVC6B5_NOP_PARAMETER = (31, 0) +NVC6B5_PM_TRIGGER = (0x00000140) +NVC6B5_PM_TRIGGER_V = (31, 0) +NVC6B5_SET_SEMAPHORE_A = (0x00000240) +NVC6B5_SET_SEMAPHORE_A_UPPER = (16, 0) +NVC6B5_SET_SEMAPHORE_B = (0x00000244) +NVC6B5_SET_SEMAPHORE_B_LOWER = (31, 0) +NVC6B5_SET_SEMAPHORE_PAYLOAD = (0x00000248) +NVC6B5_SET_SEMAPHORE_PAYLOAD_PAYLOAD = (31, 0) +NVC6B5_SET_RENDER_ENABLE_A = (0x00000254) +NVC6B5_SET_RENDER_ENABLE_A_UPPER = (7, 0) +NVC6B5_SET_RENDER_ENABLE_B = (0x00000258) +NVC6B5_SET_RENDER_ENABLE_B_LOWER = (31, 0) +NVC6B5_SET_RENDER_ENABLE_C = (0x0000025C) +NVC6B5_SET_RENDER_ENABLE_C_MODE = (2, 0) +NVC6B5_SET_RENDER_ENABLE_C_MODE_FALSE = (0x00000000) +NVC6B5_SET_RENDER_ENABLE_C_MODE_TRUE = (0x00000001) +NVC6B5_SET_RENDER_ENABLE_C_MODE_CONDITIONAL = (0x00000002) +NVC6B5_SET_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = (0x00000003) +NVC6B5_SET_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = (0x00000004) +NVC6B5_SET_SRC_PHYS_MODE = (0x00000260) +NVC6B5_SET_SRC_PHYS_MODE_TARGET = (1, 0) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_LOCAL_FB = (0x00000000) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_PEERMEM = (0x00000003) +NVC6B5_SET_SRC_PHYS_MODE_BASIC_KIND = (5, 2) +NVC6B5_SET_SRC_PHYS_MODE_PEER_ID = (8, 6) +NVC6B5_SET_SRC_PHYS_MODE_FLA = (9, 9) +NVC6B5_SET_DST_PHYS_MODE = (0x00000264) +NVC6B5_SET_DST_PHYS_MODE_TARGET = (1, 0) +NVC6B5_SET_DST_PHYS_MODE_TARGET_LOCAL_FB = (0x00000000) +NVC6B5_SET_DST_PHYS_MODE_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC6B5_SET_DST_PHYS_MODE_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC6B5_SET_DST_PHYS_MODE_TARGET_PEERMEM = (0x00000003) +NVC6B5_SET_DST_PHYS_MODE_BASIC_KIND = (5, 2) +NVC6B5_SET_DST_PHYS_MODE_PEER_ID = (8, 6) +NVC6B5_SET_DST_PHYS_MODE_FLA = (9, 9) +NVC6B5_LAUNCH_DMA = (0x00000300) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE = (1, 0) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_PIPELINED = (0x00000001) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_NON_PIPELINED = (0x00000002) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE = (2, 2) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE = (25, 25) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE_SYS = (0x00000000) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE_GL = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE = (4, 3) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_ONE_WORD_SEMAPHORE = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_FOUR_WORD_SEMAPHORE = (0x00000002) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_CONDITIONAL_INTR_SEMAPHORE = (0x00000003) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE = (6, 5) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_BLOCKING = (0x00000001) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_NON_BLOCKING = (0x00000002) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT = (7, 7) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT_BLOCKLINEAR = (0x00000000) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT_PITCH = (0x00000001) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT = (8, 8) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT_BLOCKLINEAR = (0x00000000) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT_PITCH = (0x00000001) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE = (9, 9) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE = (10, 10) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE = (11, 11) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_SRC_TYPE = (12, 12) +NVC6B5_LAUNCH_DMA_SRC_TYPE_VIRTUAL = (0x00000000) +NVC6B5_LAUNCH_DMA_SRC_TYPE_PHYSICAL = (0x00000001) +NVC6B5_LAUNCH_DMA_DST_TYPE = (13, 13) +NVC6B5_LAUNCH_DMA_DST_TYPE_VIRTUAL = (0x00000000) +NVC6B5_LAUNCH_DMA_DST_TYPE_PHYSICAL = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION = (17, 14) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IMIN = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IMAX = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IXOR = (0x00000002) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IAND = (0x00000003) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IOR = (0x00000004) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IADD = (0x00000005) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INC = (0x00000006) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_DEC = (0x00000007) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_FADD = (0x0000000A) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN = (18, 18) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN_SIGNED = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN_UNSIGNED = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE = (19, 19) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_VPRMODE = (23, 22) +NVC6B5_LAUNCH_DMA_VPRMODE_VPR_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_VPRMODE_VPR_VID2VID = (0x00000001) +NVC6B5_LAUNCH_DMA_RESERVED_START_OF_COPY = (24, 24) +NVC6B5_LAUNCH_DMA_DISABLE_PLC = (26, 26) +NVC6B5_LAUNCH_DMA_DISABLE_PLC_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_DISABLE_PLC_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_RESERVED_ERR_CODE = (31, 28) +NVC6B5_OFFSET_IN_UPPER = (0x00000400) +NVC6B5_OFFSET_IN_UPPER_UPPER = (16, 0) +NVC6B5_OFFSET_IN_LOWER = (0x00000404) +NVC6B5_OFFSET_IN_LOWER_VALUE = (31, 0) +NVC6B5_OFFSET_OUT_UPPER = (0x00000408) +NVC6B5_OFFSET_OUT_UPPER_UPPER = (16, 0) +NVC6B5_OFFSET_OUT_LOWER = (0x0000040C) +NVC6B5_OFFSET_OUT_LOWER_VALUE = (31, 0) +NVC6B5_PITCH_IN = (0x00000410) +NVC6B5_PITCH_IN_VALUE = (31, 0) +NVC6B5_PITCH_OUT = (0x00000414) +NVC6B5_PITCH_OUT_VALUE = (31, 0) +NVC6B5_LINE_LENGTH_IN = (0x00000418) +NVC6B5_LINE_LENGTH_IN_VALUE = (31, 0) +NVC6B5_LINE_COUNT = (0x0000041C) +NVC6B5_LINE_COUNT_VALUE = (31, 0) +NVC6B5_SET_REMAP_CONST_A = (0x00000700) +NVC6B5_SET_REMAP_CONST_A_V = (31, 0) +NVC6B5_SET_REMAP_CONST_B = (0x00000704) +NVC6B5_SET_REMAP_CONST_B_V = (31, 0) +NVC6B5_SET_REMAP_COMPONENTS = (0x00000708) +NVC6B5_SET_REMAP_COMPONENTS_DST_X = (2, 0) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y = (6, 4) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z = (10, 8) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_W = (14, 12) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE = (17, 16) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_FOUR = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS = (21, 20) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_FOUR = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS = (25, 24) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_FOUR = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE = (0x0000070C) +NVC6B5_SET_DST_BLOCK_SIZE_WIDTH = (3, 0) +NVC6B5_SET_DST_BLOCK_SIZE_WIDTH_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_TWO_GOBS = (0x00000001) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_FOUR_GOBS = (0x00000002) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH = (11, 8) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_TWO_GOBS = (0x00000001) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_FOUR_GOBS = (0x00000002) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_DST_BLOCK_SIZE_GOB_HEIGHT = (15, 12) +NVC6B5_SET_DST_BLOCK_SIZE_GOB_HEIGHT_GOB_HEIGHT_FERMI_8 = (0x00000001) +NVC6B5_SET_DST_WIDTH = (0x00000710) +NVC6B5_SET_DST_WIDTH_V = (31, 0) +NVC6B5_SET_DST_HEIGHT = (0x00000714) +NVC6B5_SET_DST_HEIGHT_V = (31, 0) +NVC6B5_SET_DST_DEPTH = (0x00000718) +NVC6B5_SET_DST_DEPTH_V = (31, 0) +NVC6B5_SET_DST_LAYER = (0x0000071C) +NVC6B5_SET_DST_LAYER_V = (31, 0) +NVC6B5_SET_DST_ORIGIN = (0x00000720) +NVC6B5_SET_DST_ORIGIN_X = (15, 0) +NVC6B5_SET_DST_ORIGIN_Y = (31, 16) +NVC6B5_SET_SRC_BLOCK_SIZE = (0x00000728) +NVC6B5_SET_SRC_BLOCK_SIZE_WIDTH = (3, 0) +NVC6B5_SET_SRC_BLOCK_SIZE_WIDTH_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_TWO_GOBS = (0x00000001) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_FOUR_GOBS = (0x00000002) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH = (11, 8) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_TWO_GOBS = (0x00000001) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_FOUR_GOBS = (0x00000002) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_SRC_BLOCK_SIZE_GOB_HEIGHT = (15, 12) +NVC6B5_SET_SRC_BLOCK_SIZE_GOB_HEIGHT_GOB_HEIGHT_FERMI_8 = (0x00000001) +NVC6B5_SET_SRC_WIDTH = (0x0000072C) +NVC6B5_SET_SRC_WIDTH_V = (31, 0) +NVC6B5_SET_SRC_HEIGHT = (0x00000730) +NVC6B5_SET_SRC_HEIGHT_V = (31, 0) +NVC6B5_SET_SRC_DEPTH = (0x00000734) +NVC6B5_SET_SRC_DEPTH_V = (31, 0) +NVC6B5_SET_SRC_LAYER = (0x00000738) +NVC6B5_SET_SRC_LAYER_V = (31, 0) +NVC6B5_SET_SRC_ORIGIN = (0x0000073C) +NVC6B5_SET_SRC_ORIGIN_X = (15, 0) +NVC6B5_SET_SRC_ORIGIN_Y = (31, 16) +NVC6B5_SRC_ORIGIN_X = (0x00000744) +NVC6B5_SRC_ORIGIN_X_VALUE = (31, 0) +NVC6B5_SRC_ORIGIN_Y = (0x00000748) +NVC6B5_SRC_ORIGIN_Y_VALUE = (31, 0) +NVC6B5_DST_ORIGIN_X = (0x0000074C) +NVC6B5_DST_ORIGIN_X_VALUE = (31, 0) +NVC6B5_DST_ORIGIN_Y = (0x00000750) +NVC6B5_DST_ORIGIN_Y_VALUE = (31, 0) +NVC6B5_PM_TRIGGER_END = (0x00001114) +NVC6B5_PM_TRIGGER_END_V = (31, 0) +BLACKWELL_DMA_COPY_A = (0x0000C9B5) +NVC9B5_NOP = (0x00000100) +NVC9B5_NOP_PARAMETER = (31, 0) +NVC9B5_PM_TRIGGER = (0x00000140) +NVC9B5_PM_TRIGGER_V = (31, 0) +NVC9B5_SET_MONITORED_FENCE_TYPE = (0x0000021C) +NVC9B5_SET_MONITORED_FENCE_TYPE_TYPE = (0, 0) +NVC9B5_SET_MONITORED_FENCE_TYPE_TYPE_MONITORED_FENCE = (0x00000000) +NVC9B5_SET_MONITORED_FENCE_TYPE_TYPE_MONITORED_FENCE_EXT = (0x00000001) +NVC9B5_SET_MONITORED_FENCE_SIGNAL_ADDR_BASE_UPPER = (0x00000220) +NVC9B5_SET_MONITORED_FENCE_SIGNAL_ADDR_BASE_UPPER_UPPER = (24, 0) +NVC9B5_SET_MONITORED_FENCE_SIGNAL_ADDR_BASE_LOWER = (0x00000224) +NVC9B5_SET_MONITORED_FENCE_SIGNAL_ADDR_BASE_LOWER_LOWER = (31, 0) +NVC9B5_SET_SEMAPHORE_A = (0x00000240) +NVC9B5_SET_SEMAPHORE_A_UPPER = (24, 0) +NVC9B5_SET_SEMAPHORE_B = (0x00000244) +NVC9B5_SET_SEMAPHORE_B_LOWER = (31, 0) +NVC9B5_SET_SEMAPHORE_PAYLOAD = (0x00000248) +NVC9B5_SET_SEMAPHORE_PAYLOAD_PAYLOAD = (31, 0) +NVC9B5_SET_SEMAPHORE_PAYLOAD_UPPER = (0x0000024C) +NVC9B5_SET_SEMAPHORE_PAYLOAD_UPPER_PAYLOAD = (31, 0) +NVC9B5_SET_RENDER_ENABLE_A = (0x00000254) +NVC9B5_SET_RENDER_ENABLE_A_UPPER = (24, 0) +NVC9B5_SET_RENDER_ENABLE_B = (0x00000258) +NVC9B5_SET_RENDER_ENABLE_B_LOWER = (31, 0) +NVC9B5_SET_RENDER_ENABLE_C = (0x0000025C) +NVC9B5_SET_RENDER_ENABLE_C_MODE = (2, 0) +NVC9B5_SET_RENDER_ENABLE_C_MODE_FALSE = (0x00000000) +NVC9B5_SET_RENDER_ENABLE_C_MODE_TRUE = (0x00000001) +NVC9B5_SET_RENDER_ENABLE_C_MODE_CONDITIONAL = (0x00000002) +NVC9B5_SET_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = (0x00000003) +NVC9B5_SET_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = (0x00000004) +NVC9B5_SET_SRC_PHYS_MODE = (0x00000260) +NVC9B5_SET_SRC_PHYS_MODE_TARGET = (1, 0) +NVC9B5_SET_SRC_PHYS_MODE_TARGET_LOCAL_FB = (0x00000000) +NVC9B5_SET_SRC_PHYS_MODE_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC9B5_SET_SRC_PHYS_MODE_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC9B5_SET_SRC_PHYS_MODE_TARGET_PEERMEM = (0x00000003) +NVC9B5_SET_SRC_PHYS_MODE_BASIC_KIND = (5, 2) +NVC9B5_SET_SRC_PHYS_MODE_PEER_ID = (8, 6) +NVC9B5_SET_SRC_PHYS_MODE_FLA = (9, 9) +NVC9B5_SET_DST_PHYS_MODE = (0x00000264) +NVC9B5_SET_DST_PHYS_MODE_TARGET = (1, 0) +NVC9B5_SET_DST_PHYS_MODE_TARGET_LOCAL_FB = (0x00000000) +NVC9B5_SET_DST_PHYS_MODE_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC9B5_SET_DST_PHYS_MODE_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC9B5_SET_DST_PHYS_MODE_TARGET_PEERMEM = (0x00000003) +NVC9B5_SET_DST_PHYS_MODE_BASIC_KIND = (5, 2) +NVC9B5_SET_DST_PHYS_MODE_PEER_ID = (8, 6) +NVC9B5_SET_DST_PHYS_MODE_FLA = (9, 9) +NVC9B5_LAUNCH_DMA = (0x00000300) +NVC9B5_LAUNCH_DMA_DATA_TRANSFER_TYPE = (1, 0) +NVC9B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_NONE = (0x00000000) +NVC9B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_PIPELINED = (0x00000001) +NVC9B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_NON_PIPELINED = (0x00000002) +NVC9B5_LAUNCH_DMA_FLUSH_ENABLE = (2, 2) +NVC9B5_LAUNCH_DMA_FLUSH_ENABLE_FALSE = (0x00000000) +NVC9B5_LAUNCH_DMA_FLUSH_ENABLE_TRUE = (0x00000001) +NVC9B5_LAUNCH_DMA_FLUSH_TYPE = (25, 25) +NVC9B5_LAUNCH_DMA_FLUSH_TYPE_SYS = (0x00000000) +NVC9B5_LAUNCH_DMA_FLUSH_TYPE_GL = (0x00000001) +NVC9B5_LAUNCH_DMA_SEMAPHORE_TYPE = (4, 3) +NVC9B5_LAUNCH_DMA_SEMAPHORE_TYPE_NONE = (0x00000000) +NVC9B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_SEMAPHORE_NO_TIMESTAMP = (0x00000001) +NVC9B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_SEMAPHORE_WITH_TIMESTAMP = (0x00000002) +NVC9B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_ONE_WORD_SEMAPHORE = (0x00000001) +NVC9B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_FOUR_WORD_SEMAPHORE = (0x00000002) +NVC9B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_CONDITIONAL_INTR_SEMAPHORE = (0x00000003) +NVC9B5_LAUNCH_DMA_INTERRUPT_TYPE = (6, 5) +NVC9B5_LAUNCH_DMA_INTERRUPT_TYPE_NONE = (0x00000000) +NVC9B5_LAUNCH_DMA_INTERRUPT_TYPE_BLOCKING = (0x00000001) +NVC9B5_LAUNCH_DMA_INTERRUPT_TYPE_NON_BLOCKING = (0x00000002) +NVC9B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT = (7, 7) +NVC9B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT_BLOCKLINEAR = (0x00000000) +NVC9B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT_PITCH = (0x00000001) +NVC9B5_LAUNCH_DMA_DST_MEMORY_LAYOUT = (8, 8) +NVC9B5_LAUNCH_DMA_DST_MEMORY_LAYOUT_BLOCKLINEAR = (0x00000000) +NVC9B5_LAUNCH_DMA_DST_MEMORY_LAYOUT_PITCH = (0x00000001) +NVC9B5_LAUNCH_DMA_MULTI_LINE_ENABLE = (9, 9) +NVC9B5_LAUNCH_DMA_MULTI_LINE_ENABLE_FALSE = (0x00000000) +NVC9B5_LAUNCH_DMA_MULTI_LINE_ENABLE_TRUE = (0x00000001) +NVC9B5_LAUNCH_DMA_REMAP_ENABLE = (10, 10) +NVC9B5_LAUNCH_DMA_REMAP_ENABLE_FALSE = (0x00000000) +NVC9B5_LAUNCH_DMA_REMAP_ENABLE_TRUE = (0x00000001) +NVC9B5_LAUNCH_DMA_COMPRESSION_ENABLE = (11, 11) +NVC9B5_LAUNCH_DMA_COMPRESSION_ENABLE_FALSE = (0x00000000) +NVC9B5_LAUNCH_DMA_COMPRESSION_ENABLE_TRUE = (0x00000001) +NVC9B5_LAUNCH_DMA_SRC_TYPE = (12, 12) +NVC9B5_LAUNCH_DMA_SRC_TYPE_VIRTUAL = (0x00000000) +NVC9B5_LAUNCH_DMA_SRC_TYPE_PHYSICAL = (0x00000001) +NVC9B5_LAUNCH_DMA_DST_TYPE = (13, 13) +NVC9B5_LAUNCH_DMA_DST_TYPE_VIRTUAL = (0x00000000) +NVC9B5_LAUNCH_DMA_DST_TYPE_PHYSICAL = (0x00000001) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION = (17, 14) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IMIN = (0x00000000) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IMAX = (0x00000001) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IXOR = (0x00000002) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IAND = (0x00000003) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IOR = (0x00000004) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IADD = (0x00000005) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INC = (0x00000006) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_DEC = (0x00000007) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INVALIDA = (0x00000008) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INVALIDB = (0x00000009) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_FADD = (0x0000000A) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_FMIN = (0x0000000B) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_FMAX = (0x0000000C) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INVALIDC = (0x0000000D) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INVALIDD = (0x0000000E) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INVALIDE = (0x0000000F) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN = (18, 18) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN_SIGNED = (0x00000000) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN_UNSIGNED = (0x00000001) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE = (19, 19) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE_FALSE = (0x00000000) +NVC9B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE_TRUE = (0x00000001) +NVC9B5_LAUNCH_DMA_COPY_TYPE = (21, 20) +NVC9B5_LAUNCH_DMA_COPY_TYPE_PROT2PROT = (0x00000000) +NVC9B5_LAUNCH_DMA_COPY_TYPE_DEFAULT = (0x00000000) +NVC9B5_LAUNCH_DMA_COPY_TYPE_SECURE = (0x00000001) +NVC9B5_LAUNCH_DMA_COPY_TYPE_NONPROT2NONPROT = (0x00000002) +NVC9B5_LAUNCH_DMA_COPY_TYPE_RESERVED = (0x00000003) +NVC9B5_LAUNCH_DMA_VPRMODE = (22, 22) +NVC9B5_LAUNCH_DMA_VPRMODE_VPR_NONE = (0x00000000) +NVC9B5_LAUNCH_DMA_VPRMODE_VPR_VID2VID = (0x00000001) +NVC9B5_LAUNCH_DMA_MEMORY_SCRUB_ENABLE = (23, 23) +NVC9B5_LAUNCH_DMA_MEMORY_SCRUB_ENABLE_FALSE = (0x00000000) +NVC9B5_LAUNCH_DMA_MEMORY_SCRUB_ENABLE_TRUE = (0x00000001) +NVC9B5_LAUNCH_DMA_RESERVED_START_OF_COPY = (24, 24) +NVC9B5_LAUNCH_DMA_DISABLE_PLC = (26, 26) +NVC9B5_LAUNCH_DMA_DISABLE_PLC_FALSE = (0x00000000) +NVC9B5_LAUNCH_DMA_DISABLE_PLC_TRUE = (0x00000001) +NVC9B5_LAUNCH_DMA_SEMAPHORE_PAYLOAD_SIZE = (27, 27) +NVC9B5_LAUNCH_DMA_SEMAPHORE_PAYLOAD_SIZE_ONE_WORD = (0x00000000) +NVC9B5_LAUNCH_DMA_SEMAPHORE_PAYLOAD_SIZE_TWO_WORD = (0x00000001) +NVC9B5_LAUNCH_DMA_RESERVED_ERR_CODE = (31, 28) +NVC9B5_OFFSET_IN_UPPER = (0x00000400) +NVC9B5_OFFSET_IN_UPPER_UPPER = (24, 0) +NVC9B5_OFFSET_IN_LOWER = (0x00000404) +NVC9B5_OFFSET_IN_LOWER_VALUE = (31, 0) +NVC9B5_OFFSET_OUT_UPPER = (0x00000408) +NVC9B5_OFFSET_OUT_UPPER_UPPER = (24, 0) +NVC9B5_OFFSET_OUT_LOWER = (0x0000040C) +NVC9B5_OFFSET_OUT_LOWER_VALUE = (31, 0) +NVC9B5_PITCH_IN = (0x00000410) +NVC9B5_PITCH_IN_VALUE = (31, 0) +NVC9B5_PITCH_OUT = (0x00000414) +NVC9B5_PITCH_OUT_VALUE = (31, 0) +NVC9B5_LINE_LENGTH_IN = (0x00000418) +NVC9B5_LINE_LENGTH_IN_VALUE = (31, 0) +NVC9B5_LINE_COUNT = (0x0000041C) +NVC9B5_LINE_COUNT_VALUE = (31, 0) +NVC9B5_SET_SECURE_COPY_MODE = (0x00000500) +NVC9B5_SET_SECURE_COPY_MODE_MODE = (0, 0) +NVC9B5_SET_SECURE_COPY_MODE_MODE_ENCRYPT = (0x00000000) +NVC9B5_SET_SECURE_COPY_MODE_MODE_DECRYPT = (0x00000001) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_SRC_TARGET = (20, 19) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_SRC_TARGET_LOCAL_FB = (0x00000000) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_SRC_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_SRC_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_SRC_TARGET_PEERMEM = (0x00000003) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_SRC_PEER_ID = (23, 21) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_SRC_FLA = (24, 24) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_DST_TARGET = (26, 25) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_DST_TARGET_LOCAL_FB = (0x00000000) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_DST_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_DST_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_DST_TARGET_PEERMEM = (0x00000003) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_DST_PEER_ID = (29, 27) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_DST_FLA = (30, 30) +NVC9B5_SET_SECURE_COPY_MODE_RESERVED_END_OF_COPY = (31, 31) +NVC9B5_SET_DECRYPT_IV0 = (0x00000504) +NVC9B5_SET_DECRYPT_IV0_VALUE = (31, 0) +NVC9B5_SET_DECRYPT_IV1 = (0x00000508) +NVC9B5_SET_DECRYPT_IV1_VALUE = (31, 0) +NVC9B5_SET_DECRYPT_IV2 = (0x0000050C) +NVC9B5_SET_DECRYPT_IV2_VALUE = (31, 0) +NVC9B5_RESERVED_SET_AESCOUNTER = (0x00000510) +NVC9B5_RESERVED_SET_AESCOUNTER_VALUE = (31, 0) +NVC9B5_SET_DECRYPT_AUTH_TAG_COMPARE_ADDR_UPPER = (0x00000514) +NVC9B5_SET_DECRYPT_AUTH_TAG_COMPARE_ADDR_UPPER_UPPER = (24, 0) +NVC9B5_SET_DECRYPT_AUTH_TAG_COMPARE_ADDR_LOWER = (0x00000518) +NVC9B5_SET_DECRYPT_AUTH_TAG_COMPARE_ADDR_LOWER_LOWER = (31, 0) +NVC9B5_SET_ENCRYPT_AUTH_TAG_ADDR_UPPER = (0x00000530) +NVC9B5_SET_ENCRYPT_AUTH_TAG_ADDR_UPPER_UPPER = (24, 0) +NVC9B5_SET_ENCRYPT_AUTH_TAG_ADDR_LOWER = (0x00000534) +NVC9B5_SET_ENCRYPT_AUTH_TAG_ADDR_LOWER_LOWER = (31, 0) +NVC9B5_SET_ENCRYPT_IV_ADDR_UPPER = (0x00000538) +NVC9B5_SET_ENCRYPT_IV_ADDR_UPPER_UPPER = (24, 0) +NVC9B5_SET_ENCRYPT_IV_ADDR_LOWER = (0x0000053C) +NVC9B5_SET_ENCRYPT_IV_ADDR_LOWER_LOWER = (31, 0) +NVC9B5_SET_COMPRESSION_PARAMETERS = (0x00000580) +NVC9B5_SET_COMPRESSION_PARAMETERS_OPERATION = (0, 0) +NVC9B5_SET_COMPRESSION_PARAMETERS_OPERATION_DECOMPRESS = (0x00000000) +NVC9B5_SET_COMPRESSION_PARAMETERS_OPERATION_COMPRESS = (0x00000001) +NVC9B5_SET_COMPRESSION_PARAMETERS_ALGO = (3, 1) +NVC9B5_SET_COMPRESSION_PARAMETERS_ALGO_SNAPPY = (0x00000000) +NVC9B5_SET_COMPRESSION_PARAMETERS_ALGO_LZ4_DATA_ONLY = (0x00000001) +NVC9B5_SET_COMPRESSION_PARAMETERS_ALGO_LZ4_BLOCK = (0x00000002) +NVC9B5_SET_COMPRESSION_PARAMETERS_ALGO_LZ4_BLOCK_CHECKSUM = (0x00000003) +NVC9B5_SET_COMPRESSION_PARAMETERS_ALGO_DEFLATE = (0x00000004) +NVC9B5_SET_COMPRESSION_PARAMETERS_ALGO_SNAPPY_WITH_LONG_FETCH = (0x00000005) +NVC9B5_SET_COMPRESSION_PARAMETERS_CHECK_SUM = (29, 28) +NVC9B5_SET_COMPRESSION_PARAMETERS_CHECK_SUM_NONE = (0x00000000) +NVC9B5_SET_COMPRESSION_PARAMETERS_CHECK_SUM_ADLER32 = (0x00000001) +NVC9B5_SET_COMPRESSION_PARAMETERS_CHECK_SUM_CRC32 = (0x00000002) +NVC9B5_SET_COMPRESSION_PARAMETERS_CHECK_SUM_SNAPPY_CRC = (0x00000003) +NVC9B5_SET_DECOMPRESS_OUT_LENGTH = (0x00000584) +NVC9B5_SET_DECOMPRESS_OUT_LENGTH_V = (31, 0) +NVC9B5_SET_DECOMPRESS_OUT_LENGTH_ADDR_UPPER = (0x00000588) +NVC9B5_SET_DECOMPRESS_OUT_LENGTH_ADDR_UPPER_UPPER = (24, 0) +NVC9B5_SET_DECOMPRESS_OUT_LENGTH_ADDR_LOWER = (0x0000058C) +NVC9B5_SET_DECOMPRESS_OUT_LENGTH_ADDR_LOWER_LOWER = (31, 0) +NVC9B5_SET_DECOMPRESS_CHECKSUM = (0x00000590) +NVC9B5_SET_DECOMPRESS_CHECKSUM_V = (31, 0) +NVC9B5_SET_MEMORY_SCRUB_PARAMETERS = (0x000006FC) +NVC9B5_SET_MEMORY_SCRUB_PARAMETERS_DISCARDABLE = (0, 0) +NVC9B5_SET_MEMORY_SCRUB_PARAMETERS_DISCARDABLE_FALSE = (0x00000000) +NVC9B5_SET_MEMORY_SCRUB_PARAMETERS_DISCARDABLE_TRUE = (0x00000001) +NVC9B5_SET_REMAP_CONST_A = (0x00000700) +NVC9B5_SET_REMAP_CONST_A_V = (31, 0) +NVC9B5_SET_REMAP_CONST_B = (0x00000704) +NVC9B5_SET_REMAP_CONST_B_V = (31, 0) +NVC9B5_SET_REMAP_COMPONENTS = (0x00000708) +NVC9B5_SET_REMAP_COMPONENTS_DST_X = (2, 0) +NVC9B5_SET_REMAP_COMPONENTS_DST_X_SRC_X = (0x00000000) +NVC9B5_SET_REMAP_COMPONENTS_DST_X_SRC_Y = (0x00000001) +NVC9B5_SET_REMAP_COMPONENTS_DST_X_SRC_Z = (0x00000002) +NVC9B5_SET_REMAP_COMPONENTS_DST_X_SRC_W = (0x00000003) +NVC9B5_SET_REMAP_COMPONENTS_DST_X_CONST_A = (0x00000004) +NVC9B5_SET_REMAP_COMPONENTS_DST_X_CONST_B = (0x00000005) +NVC9B5_SET_REMAP_COMPONENTS_DST_X_NO_WRITE = (0x00000006) +NVC9B5_SET_REMAP_COMPONENTS_DST_Y = (6, 4) +NVC9B5_SET_REMAP_COMPONENTS_DST_Y_SRC_X = (0x00000000) +NVC9B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Y = (0x00000001) +NVC9B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Z = (0x00000002) +NVC9B5_SET_REMAP_COMPONENTS_DST_Y_SRC_W = (0x00000003) +NVC9B5_SET_REMAP_COMPONENTS_DST_Y_CONST_A = (0x00000004) +NVC9B5_SET_REMAP_COMPONENTS_DST_Y_CONST_B = (0x00000005) +NVC9B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE = (0x00000006) +NVC9B5_SET_REMAP_COMPONENTS_DST_Z = (10, 8) +NVC9B5_SET_REMAP_COMPONENTS_DST_Z_SRC_X = (0x00000000) +NVC9B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Y = (0x00000001) +NVC9B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Z = (0x00000002) +NVC9B5_SET_REMAP_COMPONENTS_DST_Z_SRC_W = (0x00000003) +NVC9B5_SET_REMAP_COMPONENTS_DST_Z_CONST_A = (0x00000004) +NVC9B5_SET_REMAP_COMPONENTS_DST_Z_CONST_B = (0x00000005) +NVC9B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE = (0x00000006) +NVC9B5_SET_REMAP_COMPONENTS_DST_W = (14, 12) +NVC9B5_SET_REMAP_COMPONENTS_DST_W_SRC_X = (0x00000000) +NVC9B5_SET_REMAP_COMPONENTS_DST_W_SRC_Y = (0x00000001) +NVC9B5_SET_REMAP_COMPONENTS_DST_W_SRC_Z = (0x00000002) +NVC9B5_SET_REMAP_COMPONENTS_DST_W_SRC_W = (0x00000003) +NVC9B5_SET_REMAP_COMPONENTS_DST_W_CONST_A = (0x00000004) +NVC9B5_SET_REMAP_COMPONENTS_DST_W_CONST_B = (0x00000005) +NVC9B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE = (0x00000006) +NVC9B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE = (17, 16) +NVC9B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_ONE = (0x00000000) +NVC9B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_TWO = (0x00000001) +NVC9B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_THREE = (0x00000002) +NVC9B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_FOUR = (0x00000003) +NVC9B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS = (21, 20) +NVC9B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_ONE = (0x00000000) +NVC9B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_TWO = (0x00000001) +NVC9B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_THREE = (0x00000002) +NVC9B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_FOUR = (0x00000003) +NVC9B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS = (25, 24) +NVC9B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_ONE = (0x00000000) +NVC9B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_TWO = (0x00000001) +NVC9B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_THREE = (0x00000002) +NVC9B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_FOUR = (0x00000003) +NVC9B5_SET_DST_BLOCK_SIZE = (0x0000070C) +NVC9B5_SET_DST_BLOCK_SIZE_WIDTH = (3, 0) +NVC9B5_SET_DST_BLOCK_SIZE_WIDTH_ONE_GOB = (0x00000000) +NVC9B5_SET_DST_BLOCK_SIZE_HEIGHT = (7, 4) +NVC9B5_SET_DST_BLOCK_SIZE_HEIGHT_ONE_GOB = (0x00000000) +NVC9B5_SET_DST_BLOCK_SIZE_HEIGHT_TWO_GOBS = (0x00000001) +NVC9B5_SET_DST_BLOCK_SIZE_HEIGHT_FOUR_GOBS = (0x00000002) +NVC9B5_SET_DST_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = (0x00000003) +NVC9B5_SET_DST_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = (0x00000004) +NVC9B5_SET_DST_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = (0x00000005) +NVC9B5_SET_DST_BLOCK_SIZE_DEPTH = (11, 8) +NVC9B5_SET_DST_BLOCK_SIZE_DEPTH_ONE_GOB = (0x00000000) +NVC9B5_SET_DST_BLOCK_SIZE_DEPTH_TWO_GOBS = (0x00000001) +NVC9B5_SET_DST_BLOCK_SIZE_DEPTH_FOUR_GOBS = (0x00000002) +NVC9B5_SET_DST_BLOCK_SIZE_DEPTH_EIGHT_GOBS = (0x00000003) +NVC9B5_SET_DST_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = (0x00000004) +NVC9B5_SET_DST_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = (0x00000005) +NVC9B5_SET_DST_BLOCK_SIZE_GOB_HEIGHT = (15, 12) +NVC9B5_SET_DST_BLOCK_SIZE_GOB_HEIGHT_GOB_HEIGHT_FERMI_8 = (0x00000001) +NVC9B5_SET_DST_WIDTH = (0x00000710) +NVC9B5_SET_DST_WIDTH_V = (31, 0) +NVC9B5_SET_DST_HEIGHT = (0x00000714) +NVC9B5_SET_DST_HEIGHT_V = (31, 0) +NVC9B5_SET_DST_DEPTH = (0x00000718) +NVC9B5_SET_DST_DEPTH_V = (31, 0) +NVC9B5_SET_DST_LAYER = (0x0000071C) +NVC9B5_SET_DST_LAYER_V = (31, 0) +NVC9B5_SET_DST_ORIGIN = (0x00000720) +NVC9B5_SET_DST_ORIGIN_X = (15, 0) +NVC9B5_SET_DST_ORIGIN_Y = (31, 16) +NVC9B5_SET_SRC_BLOCK_SIZE = (0x00000728) +NVC9B5_SET_SRC_BLOCK_SIZE_WIDTH = (3, 0) +NVC9B5_SET_SRC_BLOCK_SIZE_WIDTH_ONE_GOB = (0x00000000) +NVC9B5_SET_SRC_BLOCK_SIZE_HEIGHT = (7, 4) +NVC9B5_SET_SRC_BLOCK_SIZE_HEIGHT_ONE_GOB = (0x00000000) +NVC9B5_SET_SRC_BLOCK_SIZE_HEIGHT_TWO_GOBS = (0x00000001) +NVC9B5_SET_SRC_BLOCK_SIZE_HEIGHT_FOUR_GOBS = (0x00000002) +NVC9B5_SET_SRC_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = (0x00000003) +NVC9B5_SET_SRC_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = (0x00000004) +NVC9B5_SET_SRC_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = (0x00000005) +NVC9B5_SET_SRC_BLOCK_SIZE_DEPTH = (11, 8) +NVC9B5_SET_SRC_BLOCK_SIZE_DEPTH_ONE_GOB = (0x00000000) +NVC9B5_SET_SRC_BLOCK_SIZE_DEPTH_TWO_GOBS = (0x00000001) +NVC9B5_SET_SRC_BLOCK_SIZE_DEPTH_FOUR_GOBS = (0x00000002) +NVC9B5_SET_SRC_BLOCK_SIZE_DEPTH_EIGHT_GOBS = (0x00000003) +NVC9B5_SET_SRC_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = (0x00000004) +NVC9B5_SET_SRC_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = (0x00000005) +NVC9B5_SET_SRC_BLOCK_SIZE_GOB_HEIGHT = (15, 12) +NVC9B5_SET_SRC_BLOCK_SIZE_GOB_HEIGHT_GOB_HEIGHT_FERMI_8 = (0x00000001) +NVC9B5_SET_SRC_WIDTH = (0x0000072C) +NVC9B5_SET_SRC_WIDTH_V = (31, 0) +NVC9B5_SET_SRC_HEIGHT = (0x00000730) +NVC9B5_SET_SRC_HEIGHT_V = (31, 0) +NVC9B5_SET_SRC_DEPTH = (0x00000734) +NVC9B5_SET_SRC_DEPTH_V = (31, 0) +NVC9B5_SET_SRC_LAYER = (0x00000738) +NVC9B5_SET_SRC_LAYER_V = (31, 0) +NVC9B5_SET_SRC_ORIGIN = (0x0000073C) +NVC9B5_SET_SRC_ORIGIN_X = (15, 0) +NVC9B5_SET_SRC_ORIGIN_Y = (31, 16) +NVC9B5_SRC_ORIGIN_X = (0x00000744) +NVC9B5_SRC_ORIGIN_X_VALUE = (31, 0) +NVC9B5_SRC_ORIGIN_Y = (0x00000748) +NVC9B5_SRC_ORIGIN_Y_VALUE = (31, 0) +NVC9B5_DST_ORIGIN_X = (0x0000074C) +NVC9B5_DST_ORIGIN_X_VALUE = (31, 0) +NVC9B5_DST_ORIGIN_Y = (0x00000750) +NVC9B5_DST_ORIGIN_Y_VALUE = (31, 0) +NVC9B5_PM_TRIGGER_END = (0x00001114) +NVC9B5_PM_TRIGGER_END_V = (31, 0) +UVM_IOCTL_BASE = lambda i: i # type: ignore +UVM_RESERVE_VA = UVM_IOCTL_BASE(1) +UVM_RELEASE_VA = UVM_IOCTL_BASE(2) +UVM_REGION_COMMIT = UVM_IOCTL_BASE(3) +UVM_REGION_DECOMMIT = UVM_IOCTL_BASE(4) +UVM_REGION_SET_STREAM = UVM_IOCTL_BASE(5) +UVM_SET_STREAM_RUNNING = UVM_IOCTL_BASE(6) +UVM_MAX_STREAMS_PER_IOCTL_CALL = 32 +UVM_SET_STREAM_STOPPED = UVM_IOCTL_BASE(7) +UVM_RUN_TEST = UVM_IOCTL_BASE(9) +UVM_EVENTS_OFFSET_BASE = (1 << 63) +UVM_COUNTERS_OFFSET_BASE = (1 << 62) +UVM_ADD_SESSION = UVM_IOCTL_BASE(10) +UVM_REMOVE_SESSION = UVM_IOCTL_BASE(11) +UVM_MAX_COUNTERS_PER_IOCTL_CALL = 32 +UVM_ENABLE_COUNTERS = UVM_IOCTL_BASE(12) +UVM_MAP_COUNTER = UVM_IOCTL_BASE(13) +UVM_CREATE_EVENT_QUEUE = UVM_IOCTL_BASE(14) +UVM_REMOVE_EVENT_QUEUE = UVM_IOCTL_BASE(15) +UVM_MAP_EVENT_QUEUE = UVM_IOCTL_BASE(16) +UVM_EVENT_CTRL = UVM_IOCTL_BASE(17) +UVM_REGISTER_MPS_SERVER = UVM_IOCTL_BASE(18) +UVM_REGISTER_MPS_CLIENT = UVM_IOCTL_BASE(19) +UVM_GET_GPU_UUID_TABLE = UVM_IOCTL_BASE(20) +UVM_CREATE_RANGE_GROUP = UVM_IOCTL_BASE(23) +UVM_DESTROY_RANGE_GROUP = UVM_IOCTL_BASE(24) +UVM_REGISTER_GPU_VASPACE = UVM_IOCTL_BASE(25) +UVM_UNREGISTER_GPU_VASPACE = UVM_IOCTL_BASE(26) +UVM_REGISTER_CHANNEL = UVM_IOCTL_BASE(27) +UVM_UNREGISTER_CHANNEL = UVM_IOCTL_BASE(28) +UVM_ENABLE_PEER_ACCESS = UVM_IOCTL_BASE(29) +UVM_DISABLE_PEER_ACCESS = UVM_IOCTL_BASE(30) +UVM_SET_RANGE_GROUP = UVM_IOCTL_BASE(31) +UVM_MAP_EXTERNAL_ALLOCATION = UVM_IOCTL_BASE(33) +UVM_FREE = UVM_IOCTL_BASE(34) +UVM_MEM_MAP = UVM_IOCTL_BASE(35) +UVM_DEBUG_ACCESS_MEMORY = UVM_IOCTL_BASE(36) +UVM_REGISTER_GPU = UVM_IOCTL_BASE(37) +UVM_UNREGISTER_GPU = UVM_IOCTL_BASE(38) +UVM_PAGEABLE_MEM_ACCESS = UVM_IOCTL_BASE(39) +UVM_MAX_RANGE_GROUPS_PER_IOCTL_CALL = 32 +UVM_PREVENT_MIGRATION_RANGE_GROUPS = UVM_IOCTL_BASE(40) +UVM_ALLOW_MIGRATION_RANGE_GROUPS = UVM_IOCTL_BASE(41) +UVM_SET_PREFERRED_LOCATION = UVM_IOCTL_BASE(42) +UVM_UNSET_PREFERRED_LOCATION = UVM_IOCTL_BASE(43) +UVM_ENABLE_READ_DUPLICATION = UVM_IOCTL_BASE(44) +UVM_DISABLE_READ_DUPLICATION = UVM_IOCTL_BASE(45) +UVM_SET_ACCESSED_BY = UVM_IOCTL_BASE(46) +UVM_UNSET_ACCESSED_BY = UVM_IOCTL_BASE(47) +UVM_MIGRATE_FLAG_ASYNC = 0x00000001 +UVM_MIGRATE_FLAG_SKIP_CPU_MAP = 0x00000002 +UVM_MIGRATE_FLAG_NO_GPU_VA_SPACE = 0x00000004 +UVM_MIGRATE_FLAGS_TEST_ALL = (UVM_MIGRATE_FLAG_SKIP_CPU_MAP | UVM_MIGRATE_FLAG_NO_GPU_VA_SPACE) +UVM_MIGRATE_FLAGS_ALL = (UVM_MIGRATE_FLAG_ASYNC | UVM_MIGRATE_FLAGS_TEST_ALL) +UVM_MIGRATE = UVM_IOCTL_BASE(51) +UVM_MIGRATE_RANGE_GROUP = UVM_IOCTL_BASE(53) +UVM_ENABLE_SYSTEM_WIDE_ATOMICS = UVM_IOCTL_BASE(54) +UVM_DISABLE_SYSTEM_WIDE_ATOMICS = UVM_IOCTL_BASE(55) +UVM_TOOLS_INIT_EVENT_TRACKER = UVM_IOCTL_BASE(56) +UVM_TOOLS_SET_NOTIFICATION_THRESHOLD = UVM_IOCTL_BASE(57) +UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS = UVM_IOCTL_BASE(58) +UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS = UVM_IOCTL_BASE(59) +UVM_TOOLS_ENABLE_COUNTERS = UVM_IOCTL_BASE(60) +UVM_TOOLS_DISABLE_COUNTERS = UVM_IOCTL_BASE(61) +UVM_TOOLS_READ_PROCESS_MEMORY = UVM_IOCTL_BASE(62) +UVM_TOOLS_WRITE_PROCESS_MEMORY = UVM_IOCTL_BASE(63) +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE = UVM_IOCTL_BASE(64) +UVM_MAP_DYNAMIC_PARALLELISM_REGION = UVM_IOCTL_BASE(65) +UVM_UNMAP_EXTERNAL = UVM_IOCTL_BASE(66) +UVM_TOOLS_FLUSH_EVENTS = UVM_IOCTL_BASE(67) +UVM_ALLOC_SEMAPHORE_POOL = UVM_IOCTL_BASE(68) +UVM_CLEAN_UP_ZOMBIE_RESOURCES = UVM_IOCTL_BASE(69) +UVM_PAGEABLE_MEM_ACCESS_ON_GPU = UVM_IOCTL_BASE(70) +UVM_POPULATE_PAGEABLE = UVM_IOCTL_BASE(71) +UVM_POPULATE_PAGEABLE_FLAG_ALLOW_MANAGED = 0x00000001 +UVM_POPULATE_PAGEABLE_FLAG_SKIP_PROT_CHECK = 0x00000002 +UVM_POPULATE_PAGEABLE_FLAGS_TEST_ALL = (UVM_POPULATE_PAGEABLE_FLAG_ALLOW_MANAGED | UVM_POPULATE_PAGEABLE_FLAG_SKIP_PROT_CHECK) +UVM_POPULATE_PAGEABLE_FLAGS_ALL = UVM_POPULATE_PAGEABLE_FLAGS_TEST_ALL +UVM_VALIDATE_VA_RANGE = UVM_IOCTL_BASE(72) +UVM_CREATE_EXTERNAL_RANGE = UVM_IOCTL_BASE(73) +UVM_MAP_EXTERNAL_SPARSE = UVM_IOCTL_BASE(74) +UVM_MM_INITIALIZE = UVM_IOCTL_BASE(75) +UVM_TOOLS_INIT_EVENT_TRACKER_V2 = UVM_IOCTL_BASE(76) +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_V2 = UVM_IOCTL_BASE(77) +UVM_ALLOC_DEVICE_P2P = UVM_IOCTL_BASE(78) +UVM_CLEAR_ALL_ACCESS_COUNTERS = UVM_IOCTL_BASE(79) +UVM_IS_8_SUPPORTED = UVM_IOCTL_BASE(2047) +UVM_INITIALIZE = 0x30000001 +UVM_DEINITIALIZE = 0x30000002 +NV_PFAULT_MMU_ENG_ID_GRAPHICS = 64 +NV_PFAULT_MMU_ENG_ID_DISPLAY = 1 +NV_PFAULT_MMU_ENG_ID_GSP = 2 +NV_PFAULT_MMU_ENG_ID_IFB = 9 +NV_PFAULT_MMU_ENG_ID_FLA = 4 +NV_PFAULT_MMU_ENG_ID_BAR1 = 128 +NV_PFAULT_MMU_ENG_ID_BAR2 = 192 +NV_PFAULT_MMU_ENG_ID_SEC = 14 +NV_PFAULT_MMU_ENG_ID_PERF = 8 +NV_PFAULT_MMU_ENG_ID_NVDEC = 25 +NV_PFAULT_MMU_ENG_ID_NVDEC0 = 25 +NV_PFAULT_MMU_ENG_ID_NVDEC1 = 26 +NV_PFAULT_MMU_ENG_ID_NVDEC2 = 27 +NV_PFAULT_MMU_ENG_ID_NVDEC3 = 28 +NV_PFAULT_MMU_ENG_ID_NVDEC4 = 29 +NV_PFAULT_MMU_ENG_ID_NVJPG0 = 30 +NV_PFAULT_MMU_ENG_ID_GRCOPY = 15 +NV_PFAULT_MMU_ENG_ID_CE0 = 15 +NV_PFAULT_MMU_ENG_ID_CE1 = 16 +NV_PFAULT_MMU_ENG_ID_CE2 = 17 +NV_PFAULT_MMU_ENG_ID_CE3 = 18 +NV_PFAULT_MMU_ENG_ID_CE4 = 19 +NV_PFAULT_MMU_ENG_ID_CE5 = 20 +NV_PFAULT_MMU_ENG_ID_CE6 = 21 +NV_PFAULT_MMU_ENG_ID_CE7 = 22 +NV_PFAULT_MMU_ENG_ID_CE8 = 23 +NV_PFAULT_MMU_ENG_ID_CE9 = 24 +NV_PFAULT_MMU_ENG_ID_PWR_PMU = 6 +NV_PFAULT_MMU_ENG_ID_PTP = 3 +NV_PFAULT_MMU_ENG_ID_NVENC0 = 11 +NV_PFAULT_MMU_ENG_ID_NVENC1 = 12 +NV_PFAULT_MMU_ENG_ID_NVENC2 = 13 +NV_PFAULT_MMU_ENG_ID_OFA0 = 10 +NV_PFAULT_MMU_ENG_ID_PHYSICAL = 31 +NV_PFAULT_MMU_ENG_ID_HOST0 = 32 +NV_PFAULT_MMU_ENG_ID_HOST1 = 33 +NV_PFAULT_MMU_ENG_ID_HOST2 = 34 +NV_PFAULT_MMU_ENG_ID_HOST3 = 35 +NV_PFAULT_MMU_ENG_ID_HOST4 = 36 +NV_PFAULT_MMU_ENG_ID_HOST5 = 37 +NV_PFAULT_MMU_ENG_ID_HOST6 = 38 +NV_PFAULT_MMU_ENG_ID_HOST7 = 39 +NV_PFAULT_MMU_ENG_ID_HOST8 = 40 +NV_PFAULT_MMU_ENG_ID_HOST9 = 41 +NV_PFAULT_MMU_ENG_ID_HOST10 = 42 +NV_PFAULT_MMU_ENG_ID_HOST11 = 43 +NV_PFAULT_MMU_ENG_ID_HOST12 = 44 +NV_PFAULT_MMU_ENG_ID_HOST13 = 45 +NV_PFAULT_MMU_ENG_ID_HOST14 = 46 +NV_PFAULT_MMU_ENG_ID_HOST15 = 47 +NV_PFAULT_MMU_ENG_ID_HOST16 = 48 +NV_PFAULT_MMU_ENG_ID_HOST17 = 49 +NV_PFAULT_MMU_ENG_ID_HOST18 = 50 +NV_PFAULT_MMU_ENG_ID_HOST19 = 51 +NV_PFAULT_MMU_ENG_ID_HOST20 = 52 +NV_PFAULT_MMU_ENG_ID_HOST21 = 53 +NV_PFAULT_MMU_ENG_ID_HOST22 = 54 +NV_PFAULT_MMU_ENG_ID_HOST23 = 55 +NV_PFAULT_MMU_ENG_ID_HOST24 = 56 +NV_PFAULT_MMU_ENG_ID_HOST25 = 57 +NV_PFAULT_MMU_ENG_ID_HOST26 = 58 +NV_PFAULT_MMU_ENG_ID_HOST27 = 59 +NV_PFAULT_MMU_ENG_ID_HOST28 = 60 +NV_PFAULT_MMU_ENG_ID_HOST29 = 61 +NV_PFAULT_MMU_ENG_ID_HOST30 = 62 +NV_PFAULT_MMU_ENG_ID_HOST31 = 63 +NV_PFAULT_MMU_ENG_ID_BAR1_FN0 = 128 +NV_PFAULT_MMU_ENG_ID_BAR1_FN1 = 129 +NV_PFAULT_MMU_ENG_ID_BAR1_FN2 = 130 +NV_PFAULT_MMU_ENG_ID_BAR1_FN3 = 131 +NV_PFAULT_MMU_ENG_ID_BAR1_FN4 = 132 +NV_PFAULT_MMU_ENG_ID_BAR1_FN5 = 133 +NV_PFAULT_MMU_ENG_ID_BAR1_FN6 = 134 +NV_PFAULT_MMU_ENG_ID_BAR1_FN7 = 135 +NV_PFAULT_MMU_ENG_ID_BAR1_FN8 = 136 +NV_PFAULT_MMU_ENG_ID_BAR1_FN9 = 137 +NV_PFAULT_MMU_ENG_ID_BAR1_FN10 = 138 +NV_PFAULT_MMU_ENG_ID_BAR1_FN11 = 139 +NV_PFAULT_MMU_ENG_ID_BAR1_FN12 = 140 +NV_PFAULT_MMU_ENG_ID_BAR1_FN13 = 141 +NV_PFAULT_MMU_ENG_ID_BAR1_FN14 = 142 +NV_PFAULT_MMU_ENG_ID_BAR1_FN15 = 143 +NV_PFAULT_MMU_ENG_ID_BAR1_FN16 = 144 +NV_PFAULT_MMU_ENG_ID_BAR1_FN17 = 145 +NV_PFAULT_MMU_ENG_ID_BAR1_FN18 = 146 +NV_PFAULT_MMU_ENG_ID_BAR1_FN19 = 147 +NV_PFAULT_MMU_ENG_ID_BAR1_FN20 = 148 +NV_PFAULT_MMU_ENG_ID_BAR1_FN21 = 149 +NV_PFAULT_MMU_ENG_ID_BAR1_FN22 = 150 +NV_PFAULT_MMU_ENG_ID_BAR1_FN23 = 151 +NV_PFAULT_MMU_ENG_ID_BAR1_FN24 = 152 +NV_PFAULT_MMU_ENG_ID_BAR1_FN25 = 153 +NV_PFAULT_MMU_ENG_ID_BAR1_FN26 = 154 +NV_PFAULT_MMU_ENG_ID_BAR1_FN27 = 155 +NV_PFAULT_MMU_ENG_ID_BAR1_FN28 = 156 +NV_PFAULT_MMU_ENG_ID_BAR1_FN29 = 157 +NV_PFAULT_MMU_ENG_ID_BAR1_FN30 = 158 +NV_PFAULT_MMU_ENG_ID_BAR1_FN31 = 159 +NV_PFAULT_MMU_ENG_ID_BAR1_FN32 = 160 +NV_PFAULT_MMU_ENG_ID_BAR1_FN33 = 161 +NV_PFAULT_MMU_ENG_ID_BAR1_FN34 = 162 +NV_PFAULT_MMU_ENG_ID_BAR1_FN35 = 163 +NV_PFAULT_MMU_ENG_ID_BAR1_FN36 = 164 +NV_PFAULT_MMU_ENG_ID_BAR1_FN37 = 165 +NV_PFAULT_MMU_ENG_ID_BAR1_FN38 = 166 +NV_PFAULT_MMU_ENG_ID_BAR1_FN39 = 167 +NV_PFAULT_MMU_ENG_ID_BAR1_FN40 = 168 +NV_PFAULT_MMU_ENG_ID_BAR1_FN41 = 169 +NV_PFAULT_MMU_ENG_ID_BAR1_FN42 = 170 +NV_PFAULT_MMU_ENG_ID_BAR1_FN43 = 171 +NV_PFAULT_MMU_ENG_ID_BAR1_FN44 = 172 +NV_PFAULT_MMU_ENG_ID_BAR1_FN45 = 173 +NV_PFAULT_MMU_ENG_ID_BAR1_FN46 = 174 +NV_PFAULT_MMU_ENG_ID_BAR1_FN47 = 175 +NV_PFAULT_MMU_ENG_ID_BAR1_FN48 = 176 +NV_PFAULT_MMU_ENG_ID_BAR1_FN49 = 177 +NV_PFAULT_MMU_ENG_ID_BAR1_FN50 = 178 +NV_PFAULT_MMU_ENG_ID_BAR1_FN51 = 179 +NV_PFAULT_MMU_ENG_ID_BAR1_FN52 = 180 +NV_PFAULT_MMU_ENG_ID_BAR1_FN53 = 181 +NV_PFAULT_MMU_ENG_ID_BAR1_FN54 = 182 +NV_PFAULT_MMU_ENG_ID_BAR1_FN55 = 183 +NV_PFAULT_MMU_ENG_ID_BAR1_FN56 = 184 +NV_PFAULT_MMU_ENG_ID_BAR1_FN57 = 185 +NV_PFAULT_MMU_ENG_ID_BAR1_FN58 = 186 +NV_PFAULT_MMU_ENG_ID_BAR1_FN59 = 187 +NV_PFAULT_MMU_ENG_ID_BAR1_FN60 = 188 +NV_PFAULT_MMU_ENG_ID_BAR1_FN61 = 189 +NV_PFAULT_MMU_ENG_ID_BAR1_FN62 = 190 +NV_PFAULT_MMU_ENG_ID_BAR1_FN63 = 191 +NV_PFAULT_MMU_ENG_ID_BAR2_FN0 = 192 +NV_PFAULT_MMU_ENG_ID_BAR2_FN1 = 193 +NV_PFAULT_MMU_ENG_ID_BAR2_FN2 = 194 +NV_PFAULT_MMU_ENG_ID_BAR2_FN3 = 195 +NV_PFAULT_MMU_ENG_ID_BAR2_FN4 = 196 +NV_PFAULT_MMU_ENG_ID_BAR2_FN5 = 197 +NV_PFAULT_MMU_ENG_ID_BAR2_FN6 = 198 +NV_PFAULT_MMU_ENG_ID_BAR2_FN7 = 199 +NV_PFAULT_MMU_ENG_ID_BAR2_FN8 = 200 +NV_PFAULT_MMU_ENG_ID_BAR2_FN9 = 201 +NV_PFAULT_MMU_ENG_ID_BAR2_FN10 = 202 +NV_PFAULT_MMU_ENG_ID_BAR2_FN11 = 203 +NV_PFAULT_MMU_ENG_ID_BAR2_FN12 = 204 +NV_PFAULT_MMU_ENG_ID_BAR2_FN13 = 205 +NV_PFAULT_MMU_ENG_ID_BAR2_FN14 = 206 +NV_PFAULT_MMU_ENG_ID_BAR2_FN15 = 207 +NV_PFAULT_MMU_ENG_ID_BAR2_FN16 = 208 +NV_PFAULT_MMU_ENG_ID_BAR2_FN17 = 209 +NV_PFAULT_MMU_ENG_ID_BAR2_FN18 = 210 +NV_PFAULT_MMU_ENG_ID_BAR2_FN19 = 211 +NV_PFAULT_MMU_ENG_ID_BAR2_FN20 = 212 +NV_PFAULT_MMU_ENG_ID_BAR2_FN21 = 213 +NV_PFAULT_MMU_ENG_ID_BAR2_FN22 = 214 +NV_PFAULT_MMU_ENG_ID_BAR2_FN23 = 215 +NV_PFAULT_MMU_ENG_ID_BAR2_FN24 = 216 +NV_PFAULT_MMU_ENG_ID_BAR2_FN25 = 217 +NV_PFAULT_MMU_ENG_ID_BAR2_FN26 = 218 +NV_PFAULT_MMU_ENG_ID_BAR2_FN27 = 219 +NV_PFAULT_MMU_ENG_ID_BAR2_FN28 = 220 +NV_PFAULT_MMU_ENG_ID_BAR2_FN29 = 221 +NV_PFAULT_MMU_ENG_ID_BAR2_FN30 = 222 +NV_PFAULT_MMU_ENG_ID_BAR2_FN31 = 223 +NV_PFAULT_MMU_ENG_ID_BAR2_FN32 = 224 +NV_PFAULT_MMU_ENG_ID_BAR2_FN33 = 225 +NV_PFAULT_MMU_ENG_ID_BAR2_FN34 = 226 +NV_PFAULT_MMU_ENG_ID_BAR2_FN35 = 227 +NV_PFAULT_MMU_ENG_ID_BAR2_FN36 = 228 +NV_PFAULT_MMU_ENG_ID_BAR2_FN37 = 229 +NV_PFAULT_MMU_ENG_ID_BAR2_FN38 = 230 +NV_PFAULT_MMU_ENG_ID_BAR2_FN39 = 231 +NV_PFAULT_MMU_ENG_ID_BAR2_FN40 = 232 +NV_PFAULT_MMU_ENG_ID_BAR2_FN41 = 233 +NV_PFAULT_MMU_ENG_ID_BAR2_FN42 = 234 +NV_PFAULT_MMU_ENG_ID_BAR2_FN43 = 235 +NV_PFAULT_MMU_ENG_ID_BAR2_FN44 = 236 +NV_PFAULT_MMU_ENG_ID_BAR2_FN45 = 237 +NV_PFAULT_MMU_ENG_ID_BAR2_FN46 = 238 +NV_PFAULT_MMU_ENG_ID_BAR2_FN47 = 239 +NV_PFAULT_MMU_ENG_ID_BAR2_FN48 = 240 +NV_PFAULT_MMU_ENG_ID_BAR2_FN49 = 241 +NV_PFAULT_MMU_ENG_ID_BAR2_FN50 = 242 +NV_PFAULT_MMU_ENG_ID_BAR2_FN51 = 243 +NV_PFAULT_MMU_ENG_ID_BAR2_FN52 = 244 +NV_PFAULT_MMU_ENG_ID_BAR2_FN53 = 245 +NV_PFAULT_MMU_ENG_ID_BAR2_FN54 = 246 +NV_PFAULT_MMU_ENG_ID_BAR2_FN55 = 247 +NV_PFAULT_MMU_ENG_ID_BAR2_FN56 = 248 +NV_PFAULT_MMU_ENG_ID_BAR2_FN57 = 249 +NV_PFAULT_MMU_ENG_ID_BAR2_FN58 = 250 +NV_PFAULT_MMU_ENG_ID_BAR2_FN59 = 251 +NV_PFAULT_MMU_ENG_ID_BAR2_FN60 = 252 +NV_PFAULT_MMU_ENG_ID_BAR2_FN61 = 253 +NV_PFAULT_MMU_ENG_ID_BAR2_FN62 = 254 +NV_PFAULT_MMU_ENG_ID_BAR2_FN63 = 255 +NV_PFAULT_FAULT_TYPE = (4, 0) +NV_PFAULT_FAULT_TYPE_PDE = 0x00000000 +NV_PFAULT_FAULT_TYPE_PDE_SIZE = 0x00000001 +NV_PFAULT_FAULT_TYPE_PTE = 0x00000002 +NV_PFAULT_FAULT_TYPE_VA_LIMIT_VIOLATION = 0x00000003 +NV_PFAULT_FAULT_TYPE_UNBOUND_INST_BLOCK = 0x00000004 +NV_PFAULT_FAULT_TYPE_PRIV_VIOLATION = 0x00000005 +NV_PFAULT_FAULT_TYPE_RO_VIOLATION = 0x00000006 +NV_PFAULT_FAULT_TYPE_WO_VIOLATION = 0x00000007 +NV_PFAULT_FAULT_TYPE_PITCH_MASK_VIOLATION = 0x00000008 +NV_PFAULT_FAULT_TYPE_WORK_CREATION = 0x00000009 +NV_PFAULT_FAULT_TYPE_UNSUPPORTED_APERTURE = 0x0000000a +NV_PFAULT_FAULT_TYPE_COMPRESSION_FAILURE = 0x0000000b +NV_PFAULT_FAULT_TYPE_UNSUPPORTED_KIND = 0x0000000c +NV_PFAULT_FAULT_TYPE_REGION_VIOLATION = 0x0000000d +NV_PFAULT_FAULT_TYPE_POISONED = 0x0000000e +NV_PFAULT_FAULT_TYPE_ATOMIC_VIOLATION = 0x0000000f +NV_PFAULT_CLIENT = (14, 8) +NV_PFAULT_CLIENT_GPC_T1_0 = 0x00000000 +NV_PFAULT_CLIENT_GPC_T1_1 = 0x00000001 +NV_PFAULT_CLIENT_GPC_T1_2 = 0x00000002 +NV_PFAULT_CLIENT_GPC_T1_3 = 0x00000003 +NV_PFAULT_CLIENT_GPC_T1_4 = 0x00000004 +NV_PFAULT_CLIENT_GPC_T1_5 = 0x00000005 +NV_PFAULT_CLIENT_GPC_T1_6 = 0x00000006 +NV_PFAULT_CLIENT_GPC_T1_7 = 0x00000007 +NV_PFAULT_CLIENT_GPC_PE_0 = 0x00000008 +NV_PFAULT_CLIENT_GPC_PE_1 = 0x00000009 +NV_PFAULT_CLIENT_GPC_PE_2 = 0x0000000A +NV_PFAULT_CLIENT_GPC_PE_3 = 0x0000000B +NV_PFAULT_CLIENT_GPC_PE_4 = 0x0000000C +NV_PFAULT_CLIENT_GPC_PE_5 = 0x0000000D +NV_PFAULT_CLIENT_GPC_PE_6 = 0x0000000E +NV_PFAULT_CLIENT_GPC_PE_7 = 0x0000000F +NV_PFAULT_CLIENT_GPC_RAST = 0x00000010 +NV_PFAULT_CLIENT_GPC_GCC = 0x00000011 +NV_PFAULT_CLIENT_GPC_GPCCS = 0x00000012 +NV_PFAULT_CLIENT_GPC_PROP_0 = 0x00000013 +NV_PFAULT_CLIENT_GPC_PROP_1 = 0x00000014 +NV_PFAULT_CLIENT_GPC_PROP_2 = 0x00000015 +NV_PFAULT_CLIENT_GPC_PROP_3 = 0x00000016 +NV_PFAULT_CLIENT_GPC_T1_8 = 0x00000021 +NV_PFAULT_CLIENT_GPC_T1_9 = 0x00000022 +NV_PFAULT_CLIENT_GPC_T1_10 = 0x00000023 +NV_PFAULT_CLIENT_GPC_T1_11 = 0x00000024 +NV_PFAULT_CLIENT_GPC_T1_12 = 0x00000025 +NV_PFAULT_CLIENT_GPC_T1_13 = 0x00000026 +NV_PFAULT_CLIENT_GPC_T1_14 = 0x00000027 +NV_PFAULT_CLIENT_GPC_T1_15 = 0x00000028 +NV_PFAULT_CLIENT_GPC_TPCCS_0 = 0x00000029 +NV_PFAULT_CLIENT_GPC_TPCCS_1 = 0x0000002A +NV_PFAULT_CLIENT_GPC_TPCCS_2 = 0x0000002B +NV_PFAULT_CLIENT_GPC_TPCCS_3 = 0x0000002C +NV_PFAULT_CLIENT_GPC_TPCCS_4 = 0x0000002D +NV_PFAULT_CLIENT_GPC_TPCCS_5 = 0x0000002E +NV_PFAULT_CLIENT_GPC_TPCCS_6 = 0x0000002F +NV_PFAULT_CLIENT_GPC_TPCCS_7 = 0x00000030 +NV_PFAULT_CLIENT_GPC_PE_8 = 0x00000031 +NV_PFAULT_CLIENT_GPC_PE_9 = 0x00000032 +NV_PFAULT_CLIENT_GPC_TPCCS_8 = 0x00000033 +NV_PFAULT_CLIENT_GPC_TPCCS_9 = 0x00000034 +NV_PFAULT_CLIENT_GPC_T1_16 = 0x00000035 +NV_PFAULT_CLIENT_GPC_T1_17 = 0x00000036 +NV_PFAULT_CLIENT_GPC_T1_18 = 0x00000037 +NV_PFAULT_CLIENT_GPC_T1_19 = 0x00000038 +NV_PFAULT_CLIENT_GPC_PE_10 = 0x00000039 +NV_PFAULT_CLIENT_GPC_PE_11 = 0x0000003A +NV_PFAULT_CLIENT_GPC_TPCCS_10 = 0x0000003B +NV_PFAULT_CLIENT_GPC_TPCCS_11 = 0x0000003C +NV_PFAULT_CLIENT_GPC_T1_20 = 0x0000003D +NV_PFAULT_CLIENT_GPC_T1_21 = 0x0000003E +NV_PFAULT_CLIENT_GPC_T1_22 = 0x0000003F +NV_PFAULT_CLIENT_GPC_T1_23 = 0x00000040 +NV_PFAULT_CLIENT_GPC_PE_12 = 0x00000041 +NV_PFAULT_CLIENT_GPC_PE_13 = 0x00000042 +NV_PFAULT_CLIENT_GPC_TPCCS_12 = 0x00000043 +NV_PFAULT_CLIENT_GPC_TPCCS_13 = 0x00000044 +NV_PFAULT_CLIENT_GPC_T1_24 = 0x00000045 +NV_PFAULT_CLIENT_GPC_T1_25 = 0x00000046 +NV_PFAULT_CLIENT_GPC_T1_26 = 0x00000047 +NV_PFAULT_CLIENT_GPC_T1_27 = 0x00000048 +NV_PFAULT_CLIENT_GPC_PE_14 = 0x00000049 +NV_PFAULT_CLIENT_GPC_PE_15 = 0x0000004A +NV_PFAULT_CLIENT_GPC_TPCCS_14 = 0x0000004B +NV_PFAULT_CLIENT_GPC_TPCCS_15 = 0x0000004C +NV_PFAULT_CLIENT_GPC_T1_28 = 0x0000004D +NV_PFAULT_CLIENT_GPC_T1_29 = 0x0000004E +NV_PFAULT_CLIENT_GPC_T1_30 = 0x0000004F +NV_PFAULT_CLIENT_GPC_T1_31 = 0x00000050 +NV_PFAULT_CLIENT_GPC_PE_16 = 0x00000051 +NV_PFAULT_CLIENT_GPC_PE_17 = 0x00000052 +NV_PFAULT_CLIENT_GPC_TPCCS_16 = 0x00000053 +NV_PFAULT_CLIENT_GPC_TPCCS_17 = 0x00000054 +NV_PFAULT_CLIENT_GPC_T1_32 = 0x00000055 +NV_PFAULT_CLIENT_GPC_T1_33 = 0x00000056 +NV_PFAULT_CLIENT_GPC_T1_34 = 0x00000057 +NV_PFAULT_CLIENT_GPC_T1_35 = 0x00000058 +NV_PFAULT_CLIENT_GPC_PE_18 = 0x00000059 +NV_PFAULT_CLIENT_GPC_PE_19 = 0x0000005A +NV_PFAULT_CLIENT_GPC_TPCCS_18 = 0x0000005B +NV_PFAULT_CLIENT_GPC_TPCCS_19 = 0x0000005C +NV_PFAULT_CLIENT_GPC_T1_36 = 0x0000005D +NV_PFAULT_CLIENT_GPC_T1_37 = 0x0000005E +NV_PFAULT_CLIENT_GPC_T1_38 = 0x0000005F +NV_PFAULT_CLIENT_GPC_T1_39 = 0x00000060 +NV_PFAULT_CLIENT_GPC_ROP_0 = 0x00000070 +NV_PFAULT_CLIENT_GPC_ROP_1 = 0x00000071 +NV_PFAULT_CLIENT_GPC_ROP_2 = 0x00000072 +NV_PFAULT_CLIENT_GPC_ROP_3 = 0x00000073 +NV_PFAULT_CLIENT_GPC_GPM = 0x00000017 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_0 = 0x00000018 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_1 = 0x00000019 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_2 = 0x0000001A +NV_PFAULT_CLIENT_GPC_LTP_UTLB_3 = 0x0000001B +NV_PFAULT_CLIENT_GPC_LTP_UTLB_4 = 0x0000001C +NV_PFAULT_CLIENT_GPC_LTP_UTLB_5 = 0x0000001D +NV_PFAULT_CLIENT_GPC_LTP_UTLB_6 = 0x0000001E +NV_PFAULT_CLIENT_GPC_LTP_UTLB_7 = 0x0000001F +NV_PFAULT_CLIENT_GPC_RGG_UTLB = 0x00000020 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_8 = 0x00000031 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_9 = 0x00000032 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_10 = 0x00000033 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_11 = 0x00000034 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_12 = 0x00000035 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_13 = 0x00000036 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_14 = 0x00000037 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_15 = 0x00000038 +NV_PFAULT_CLIENT_HUB_VIP = 0x00000000 +NV_PFAULT_CLIENT_HUB_CE0 = 0x00000001 +NV_PFAULT_CLIENT_HUB_CE1 = 0x00000002 +NV_PFAULT_CLIENT_HUB_DNISO = 0x00000003 +NV_PFAULT_CLIENT_HUB_DISPNISO = 0x00000003 +NV_PFAULT_CLIENT_HUB_FE0 = 0x00000004 +NV_PFAULT_CLIENT_HUB_FE = 0x00000004 +NV_PFAULT_CLIENT_HUB_FECS0 = 0x00000005 +NV_PFAULT_CLIENT_HUB_FECS = 0x00000005 +NV_PFAULT_CLIENT_HUB_HOST = 0x00000006 +NV_PFAULT_CLIENT_HUB_HOST_CPU = 0x00000007 +NV_PFAULT_CLIENT_HUB_HOST_CPU_NB = 0x00000008 +NV_PFAULT_CLIENT_HUB_ISO = 0x00000009 +NV_PFAULT_CLIENT_HUB_MMU = 0x0000000A +NV_PFAULT_CLIENT_HUB_NVDEC0 = 0x0000000B +NV_PFAULT_CLIENT_HUB_NVDEC = 0x0000000B +NV_PFAULT_CLIENT_HUB_NVENC1 = 0x0000000D +NV_PFAULT_CLIENT_HUB_NISO = 0x0000000E +NV_PFAULT_CLIENT_HUB_ACTRS = 0x0000000E +NV_PFAULT_CLIENT_HUB_P2P = 0x0000000F +NV_PFAULT_CLIENT_HUB_PD = 0x00000010 +NV_PFAULT_CLIENT_HUB_PERF0 = 0x00000011 +NV_PFAULT_CLIENT_HUB_PERF = 0x00000011 +NV_PFAULT_CLIENT_HUB_PMU = 0x00000012 +NV_PFAULT_CLIENT_HUB_RASTERTWOD = 0x00000013 +NV_PFAULT_CLIENT_HUB_SCC = 0x00000014 +NV_PFAULT_CLIENT_HUB_SCC_NB = 0x00000015 +NV_PFAULT_CLIENT_HUB_SEC = 0x00000016 +NV_PFAULT_CLIENT_HUB_SSYNC = 0x00000017 +NV_PFAULT_CLIENT_HUB_GRCOPY = 0x00000018 +NV_PFAULT_CLIENT_HUB_CE2 = 0x00000018 +NV_PFAULT_CLIENT_HUB_XV = 0x00000019 +NV_PFAULT_CLIENT_HUB_MMU_NB = 0x0000001A +NV_PFAULT_CLIENT_HUB_NVENC0 = 0x0000001B +NV_PFAULT_CLIENT_HUB_NVENC = 0x0000001B +NV_PFAULT_CLIENT_HUB_DFALCON = 0x0000001C +NV_PFAULT_CLIENT_HUB_SKED0 = 0x0000001D +NV_PFAULT_CLIENT_HUB_SKED = 0x0000001D +NV_PFAULT_CLIENT_HUB_AFALCON = 0x0000001E +NV_PFAULT_CLIENT_HUB_DONT_CARE = 0x0000001F +NV_PFAULT_CLIENT_HUB_HSCE0 = 0x00000020 +NV_PFAULT_CLIENT_HUB_HSCE1 = 0x00000021 +NV_PFAULT_CLIENT_HUB_HSCE2 = 0x00000022 +NV_PFAULT_CLIENT_HUB_HSCE3 = 0x00000023 +NV_PFAULT_CLIENT_HUB_HSCE4 = 0x00000024 +NV_PFAULT_CLIENT_HUB_HSCE5 = 0x00000025 +NV_PFAULT_CLIENT_HUB_HSCE6 = 0x00000026 +NV_PFAULT_CLIENT_HUB_HSCE7 = 0x00000027 +NV_PFAULT_CLIENT_HUB_HSCE8 = 0x00000028 +NV_PFAULT_CLIENT_HUB_HSCE9 = 0x00000029 +NV_PFAULT_CLIENT_HUB_HSHUB = 0x0000002A +NV_PFAULT_CLIENT_HUB_PTP_X0 = 0x0000002B +NV_PFAULT_CLIENT_HUB_PTP_X1 = 0x0000002C +NV_PFAULT_CLIENT_HUB_PTP_X2 = 0x0000002D +NV_PFAULT_CLIENT_HUB_PTP_X3 = 0x0000002E +NV_PFAULT_CLIENT_HUB_PTP_X4 = 0x0000002F +NV_PFAULT_CLIENT_HUB_PTP_X5 = 0x00000030 +NV_PFAULT_CLIENT_HUB_PTP_X6 = 0x00000031 +NV_PFAULT_CLIENT_HUB_PTP_X7 = 0x00000032 +NV_PFAULT_CLIENT_HUB_NVENC2 = 0x00000033 +NV_PFAULT_CLIENT_HUB_VPR_SCRUBBER0 = 0x00000034 +NV_PFAULT_CLIENT_HUB_VPR_SCRUBBER1 = 0x00000035 +NV_PFAULT_CLIENT_HUB_DWBIF = 0x00000036 +NV_PFAULT_CLIENT_HUB_FBFALCON = 0x00000037 +NV_PFAULT_CLIENT_HUB_CE_SHIM = 0x00000038 +NV_PFAULT_CLIENT_HUB_GSP = 0x00000039 +NV_PFAULT_CLIENT_HUB_NVDEC1 = 0x0000003A +NV_PFAULT_CLIENT_HUB_NVDEC2 = 0x0000003B +NV_PFAULT_CLIENT_HUB_NVJPG0 = 0x0000003C +NV_PFAULT_CLIENT_HUB_NVDEC3 = 0x0000003D +NV_PFAULT_CLIENT_HUB_NVDEC4 = 0x0000003E +NV_PFAULT_CLIENT_HUB_OFA0 = 0x0000003F +NV_PFAULT_CLIENT_HUB_HSCE10 = 0x00000040 +NV_PFAULT_CLIENT_HUB_HSCE11 = 0x00000041 +NV_PFAULT_CLIENT_HUB_HSCE12 = 0x00000042 +NV_PFAULT_CLIENT_HUB_HSCE13 = 0x00000043 +NV_PFAULT_CLIENT_HUB_HSCE14 = 0x00000044 +NV_PFAULT_CLIENT_HUB_HSCE15 = 0x00000045 +NV_PFAULT_CLIENT_HUB_PTP_X8 = 0x00000046 +NV_PFAULT_CLIENT_HUB_PTP_X9 = 0x00000047 +NV_PFAULT_CLIENT_HUB_PTP_X10 = 0x00000048 +NV_PFAULT_CLIENT_HUB_PTP_X11 = 0x00000049 +NV_PFAULT_CLIENT_HUB_PTP_X12 = 0x0000004A +NV_PFAULT_CLIENT_HUB_PTP_X13 = 0x0000004B +NV_PFAULT_CLIENT_HUB_PTP_X14 = 0x0000004C +NV_PFAULT_CLIENT_HUB_PTP_X15 = 0x0000004D +NV_PFAULT_CLIENT_HUB_FE1 = 0x0000004E +NV_PFAULT_CLIENT_HUB_FE2 = 0x0000004F +NV_PFAULT_CLIENT_HUB_FE3 = 0x00000050 +NV_PFAULT_CLIENT_HUB_FE4 = 0x00000051 +NV_PFAULT_CLIENT_HUB_FE5 = 0x00000052 +NV_PFAULT_CLIENT_HUB_FE6 = 0x00000053 +NV_PFAULT_CLIENT_HUB_FE7 = 0x00000054 +NV_PFAULT_CLIENT_HUB_FECS1 = 0x00000055 +NV_PFAULT_CLIENT_HUB_FECS2 = 0x00000056 +NV_PFAULT_CLIENT_HUB_FECS3 = 0x00000057 +NV_PFAULT_CLIENT_HUB_FECS4 = 0x00000058 +NV_PFAULT_CLIENT_HUB_FECS5 = 0x00000059 +NV_PFAULT_CLIENT_HUB_FECS6 = 0x0000005A +NV_PFAULT_CLIENT_HUB_FECS7 = 0x0000005B +NV_PFAULT_CLIENT_HUB_SKED1 = 0x0000005C +NV_PFAULT_CLIENT_HUB_SKED2 = 0x0000005D +NV_PFAULT_CLIENT_HUB_SKED3 = 0x0000005E +NV_PFAULT_CLIENT_HUB_SKED4 = 0x0000005F +NV_PFAULT_CLIENT_HUB_SKED5 = 0x00000060 +NV_PFAULT_CLIENT_HUB_SKED6 = 0x00000061 +NV_PFAULT_CLIENT_HUB_SKED7 = 0x00000062 +NV_PFAULT_CLIENT_HUB_ESC = 0x00000063 +NV_PFAULT_ACCESS_TYPE = (19, 16) +NV_PFAULT_ACCESS_TYPE_READ = 0x00000000 +NV_PFAULT_ACCESS_TYPE_WRITE = 0x00000001 +NV_PFAULT_ACCESS_TYPE_ATOMIC = 0x00000002 +NV_PFAULT_ACCESS_TYPE_PREFETCH = 0x00000003 +NV_PFAULT_ACCESS_TYPE_VIRT_READ = 0x00000000 +NV_PFAULT_ACCESS_TYPE_VIRT_WRITE = 0x00000001 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC = 0x00000002 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 0x00000002 +NV_PFAULT_ACCESS_TYPE_VIRT_PREFETCH = 0x00000003 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 0x00000004 +NV_PFAULT_ACCESS_TYPE_PHYS_READ = 0x00000008 +NV_PFAULT_ACCESS_TYPE_PHYS_WRITE = 0x00000009 +NV_PFAULT_ACCESS_TYPE_PHYS_ATOMIC = 0x0000000a +NV_PFAULT_ACCESS_TYPE_PHYS_PREFETCH = 0x0000000b +NV_PFAULT_MMU_CLIENT_TYPE = (20, 20) +NV_PFAULT_MMU_CLIENT_TYPE_GPC = 0x00000000 +NV_PFAULT_MMU_CLIENT_TYPE_HUB = 0x00000001 +NV_PFAULT_GPC_ID = (28, 24) +NV_PFAULT_PROTECTED_MODE = (29, 29) +NV_PFAULT_REPLAYABLE_FAULT_EN = (30, 30) +NV_PFAULT_VALID = (31, 31) +NV_ESC_RM_ALLOC_MEMORY = 0x27 +NV_ESC_RM_ALLOC_OBJECT = 0x28 +NV_ESC_RM_FREE = 0x29 +NV_ESC_RM_CONTROL = 0x2A +NV_ESC_RM_ALLOC = 0x2B +NV_ESC_RM_CONFIG_GET = 0x32 +NV_ESC_RM_CONFIG_SET = 0x33 +NV_ESC_RM_DUP_OBJECT = 0x34 +NV_ESC_RM_SHARE = 0x35 +NV_ESC_RM_CONFIG_GET_EX = 0x37 +NV_ESC_RM_CONFIG_SET_EX = 0x38 +NV_ESC_RM_I2C_ACCESS = 0x39 +NV_ESC_RM_IDLE_CHANNELS = 0x41 +NV_ESC_RM_VID_HEAP_CONTROL = 0x4A +NV_ESC_RM_ACCESS_REGISTRY = 0x4D +NV_ESC_RM_MAP_MEMORY = 0x4E +NV_ESC_RM_UNMAP_MEMORY = 0x4F +NV_ESC_RM_GET_EVENT_DATA = 0x52 +NV_ESC_RM_ALLOC_CONTEXT_DMA2 = 0x54 +NV_ESC_RM_ADD_VBLANK_CALLBACK = 0x56 +NV_ESC_RM_MAP_MEMORY_DMA = 0x57 +NV_ESC_RM_UNMAP_MEMORY_DMA = 0x58 +NV_ESC_RM_BIND_CONTEXT_DMA = 0x59 +NV_ESC_RM_EXPORT_OBJECT_TO_FD = 0x5C +NV_ESC_RM_IMPORT_OBJECT_FROM_FD = 0x5D +NV_ESC_RM_UPDATE_DEVICE_MAPPING_INFO = 0x5E +NV_ESC_RM_LOCKLESS_DIAGNOSTIC = 0x5F +NV_RM_API_VERSION_STRING_LENGTH = 64 +NV_RM_API_VERSION_CMD_STRICT = 0 +NV_RM_API_VERSION_CMD_RELAXED = '1' +NV_RM_API_VERSION_CMD_QUERY = '2' +NV_RM_API_VERSION_REPLY_UNRECOGNIZED = 0 +NV_RM_API_VERSION_REPLY_RECOGNIZED = 1 +NV_DMABUF_EXPORT_MAX_HANDLES = 128 +NV_DMABUF_EXPORT_MAPPING_TYPE_DEFAULT = 0 +NV_DMABUF_EXPORT_MAPPING_TYPE_FORCE_PCIE = 1 +NV_IOCTL_MAGIC = 'F' +NV_IOCTL_BASE = 200 +NV_ESC_CARD_INFO = (NV_IOCTL_BASE + 0) +NV_ESC_REGISTER_FD = (NV_IOCTL_BASE + 1) +NV_ESC_ALLOC_OS_EVENT = (NV_IOCTL_BASE + 6) +NV_ESC_FREE_OS_EVENT = (NV_IOCTL_BASE + 7) +NV_ESC_STATUS_CODE = (NV_IOCTL_BASE + 9) +NV_ESC_CHECK_VERSION_STR = (NV_IOCTL_BASE + 10) +NV_ESC_IOCTL_XFER_CMD = (NV_IOCTL_BASE + 11) +NV_ESC_ATTACH_GPUS_TO_FD = (NV_IOCTL_BASE + 12) +NV_ESC_QUERY_DEVICE_INTR = (NV_IOCTL_BASE + 13) +NV_ESC_SYS_PARAMS = (NV_IOCTL_BASE + 14) +NV_ESC_EXPORT_TO_DMABUF_FD = (NV_IOCTL_BASE + 17) +NV_ESC_WAIT_OPEN_COMPLETE = (NV_IOCTL_BASE + 18) +__aligned = lambda n: __attribute__((aligned(n))) # type: ignore +NV_ESC_NUMA_INFO = (NV_IOCTL_BASE + 15) +NV_ESC_SET_NUMA_STATUS = (NV_IOCTL_BASE + 16) +NV_IOCTL_NUMA_INFO_MAX_OFFLINE_ADDRESSES = 64 +NV_IOCTL_NUMA_STATUS_DISABLED = 0 +NV_IOCTL_NUMA_STATUS_OFFLINE = 1 +NV_IOCTL_NUMA_STATUS_ONLINE_IN_PROGRESS = 2 +NV_IOCTL_NUMA_STATUS_ONLINE = 3 +NV_IOCTL_NUMA_STATUS_ONLINE_FAILED = 4 +NV_IOCTL_NUMA_STATUS_OFFLINE_IN_PROGRESS = 5 +NV_IOCTL_NUMA_STATUS_OFFLINE_FAILED = 6 +NVOS04_FLAGS_CHANNEL_TYPE = (1, 0) +NVOS04_FLAGS_CHANNEL_TYPE_PHYSICAL = 0x00000000 +NVOS04_FLAGS_CHANNEL_TYPE_VIRTUAL = 0x00000001 +NVOS04_FLAGS_CHANNEL_TYPE_PHYSICAL_FOR_VIRTUAL = 0x00000002 +NVOS04_FLAGS_VPR = (2, 2) +NVOS04_FLAGS_VPR_FALSE = 0x00000000 +NVOS04_FLAGS_VPR_TRUE = 0x00000001 +NVOS04_FLAGS_CC_SECURE = (2, 2) +NVOS04_FLAGS_CC_SECURE_FALSE = 0x00000000 +NVOS04_FLAGS_CC_SECURE_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING = (3, 3) +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING_TRUE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE = (4, 4) +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE_DEFAULT = 0x00000000 +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE_ONE = 0x00000001 +NVOS04_FLAGS_PRIVILEGED_CHANNEL = (5, 5) +NVOS04_FLAGS_PRIVILEGED_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_PRIVILEGED_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING = (6, 6) +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING_FALSE = 0x00000000 +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE = (7, 7) +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_VALUE = (10, 8) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED = (11, 11) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_VALUE = (20, 12) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED = (21, 21) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV = (22, 22) +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER = (23, 23) +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO = (24, 24) +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO_TRUE = 0x00000001 +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL = (25, 25) +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT = (26, 26) +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT = (27, 27) +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT_TRUE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD = (29, 28) +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_DEFAULT = 0x00000000 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_ONE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_TWO = 0x00000002 +NVOS04_FLAGS_MAP_CHANNEL = (30, 30) +NVOS04_FLAGS_MAP_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_MAP_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC = (31, 31) +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC_FALSE = 0x00000000 +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC_TRUE = 0x00000001 +CC_CHAN_ALLOC_IV_SIZE_DWORD = 3 +CC_CHAN_ALLOC_NONCE_SIZE_DWORD = 8 +NV_CHANNEL_ALLOC_PARAMS_MESSAGE_ID = (0x906f) +FILE_DEVICE_NV = 0x00008000 +NV_IOCTL_FCT_BASE = 0x00000800 +NVOS_MAX_SUBDEVICES = 8 +UNIFIED_NV_STATUS = 1 +NVOS_STATUS = NV_STATUS +NVOS_STATUS_SUCCESS = NV_OK +NVOS_STATUS_ERROR_CARD_NOT_PRESENT = NV_ERR_CARD_NOT_PRESENT +NVOS_STATUS_ERROR_DUAL_LINK_INUSE = NV_ERR_DUAL_LINK_INUSE +NVOS_STATUS_ERROR_GENERIC = NV_ERR_GENERIC +NVOS_STATUS_ERROR_GPU_NOT_FULL_POWER = NV_ERR_GPU_NOT_FULL_POWER +NVOS_STATUS_ERROR_ILLEGAL_ACTION = NV_ERR_ILLEGAL_ACTION +NVOS_STATUS_ERROR_IN_USE = NV_ERR_STATE_IN_USE +NVOS_STATUS_ERROR_INSUFFICIENT_RESOURCES = NV_ERR_INSUFFICIENT_RESOURCES +NVOS_STATUS_ERROR_INVALID_ACCESS_TYPE = NV_ERR_INVALID_ACCESS_TYPE +NVOS_STATUS_ERROR_INVALID_ARGUMENT = NV_ERR_INVALID_ARGUMENT +NVOS_STATUS_ERROR_INVALID_BASE = NV_ERR_INVALID_BASE +NVOS_STATUS_ERROR_INVALID_CHANNEL = NV_ERR_INVALID_CHANNEL +NVOS_STATUS_ERROR_INVALID_CLASS = NV_ERR_INVALID_CLASS +NVOS_STATUS_ERROR_INVALID_CLIENT = NV_ERR_INVALID_CLIENT +NVOS_STATUS_ERROR_INVALID_COMMAND = NV_ERR_INVALID_COMMAND +NVOS_STATUS_ERROR_INVALID_DATA = NV_ERR_INVALID_DATA +NVOS_STATUS_ERROR_INVALID_DEVICE = NV_ERR_INVALID_DEVICE +NVOS_STATUS_ERROR_INVALID_DMA_SPECIFIER = NV_ERR_INVALID_DMA_SPECIFIER +NVOS_STATUS_ERROR_INVALID_EVENT = NV_ERR_INVALID_EVENT +NVOS_STATUS_ERROR_INVALID_FLAGS = NV_ERR_INVALID_FLAGS +NVOS_STATUS_ERROR_INVALID_FUNCTION = NV_ERR_INVALID_FUNCTION +NVOS_STATUS_ERROR_INVALID_HEAP = NV_ERR_INVALID_HEAP +NVOS_STATUS_ERROR_INVALID_INDEX = NV_ERR_INVALID_INDEX +NVOS_STATUS_ERROR_INVALID_LIMIT = NV_ERR_INVALID_LIMIT +NVOS_STATUS_ERROR_INVALID_METHOD = NV_ERR_INVALID_METHOD +NVOS_STATUS_ERROR_INVALID_OBJECT_BUFFER = NV_ERR_BUFFER_TOO_SMALL +NVOS_STATUS_ERROR_INVALID_OBJECT_ERROR = NV_ERR_INVALID_OBJECT +NVOS_STATUS_ERROR_INVALID_OBJECT_HANDLE = NV_ERR_INVALID_OBJECT_HANDLE +NVOS_STATUS_ERROR_INVALID_OBJECT_NEW = NV_ERR_INVALID_OBJECT_NEW +NVOS_STATUS_ERROR_INVALID_OBJECT_OLD = NV_ERR_INVALID_OBJECT_OLD +NVOS_STATUS_ERROR_INVALID_OBJECT_PARENT = NV_ERR_INVALID_OBJECT_PARENT +NVOS_STATUS_ERROR_INVALID_OFFSET = NV_ERR_INVALID_OFFSET +NVOS_STATUS_ERROR_INVALID_OWNER = NV_ERR_INVALID_OWNER +NVOS_STATUS_ERROR_INVALID_PARAM_STRUCT = NV_ERR_INVALID_PARAM_STRUCT +NVOS_STATUS_ERROR_INVALID_PARAMETER = NV_ERR_INVALID_PARAMETER +NVOS_STATUS_ERROR_INVALID_POINTER = NV_ERR_INVALID_POINTER +NVOS_STATUS_ERROR_INVALID_REGISTRY_KEY = NV_ERR_INVALID_REGISTRY_KEY +NVOS_STATUS_ERROR_INVALID_STATE = NV_ERR_INVALID_STATE +NVOS_STATUS_ERROR_INVALID_STRING_LENGTH = NV_ERR_INVALID_STRING_LENGTH +NVOS_STATUS_ERROR_INVALID_XLATE = NV_ERR_INVALID_XLATE +NVOS_STATUS_ERROR_IRQ_NOT_FIRING = NV_ERR_IRQ_NOT_FIRING +NVOS_STATUS_ERROR_MULTIPLE_MEMORY_TYPES = NV_ERR_MULTIPLE_MEMORY_TYPES +NVOS_STATUS_ERROR_NOT_SUPPORTED = NV_ERR_NOT_SUPPORTED +NVOS_STATUS_ERROR_OPERATING_SYSTEM = NV_ERR_OPERATING_SYSTEM +NVOS_STATUS_ERROR_LIB_RM_VERSION_MISMATCH = NV_ERR_LIB_RM_VERSION_MISMATCH +NVOS_STATUS_ERROR_PROTECTION_FAULT = NV_ERR_PROTECTION_FAULT +NVOS_STATUS_ERROR_TIMEOUT = NV_ERR_TIMEOUT +NVOS_STATUS_ERROR_TOO_MANY_PRIMARIES = NV_ERR_TOO_MANY_PRIMARIES +NVOS_STATUS_ERROR_IRQ_EDGE_TRIGGERED = NV_ERR_IRQ_EDGE_TRIGGERED +NVOS_STATUS_ERROR_INVALID_OPERATION = NV_ERR_INVALID_OPERATION +NVOS_STATUS_ERROR_NOT_COMPATIBLE = NV_ERR_NOT_COMPATIBLE +NVOS_STATUS_ERROR_MORE_PROCESSING_REQUIRED = NV_WARN_MORE_PROCESSING_REQUIRED +NVOS_STATUS_ERROR_INSUFFICIENT_PERMISSIONS = NV_ERR_INSUFFICIENT_PERMISSIONS +NVOS_STATUS_ERROR_TIMEOUT_RETRY = NV_ERR_TIMEOUT_RETRY +NVOS_STATUS_ERROR_NOT_READY = NV_ERR_NOT_READY +NVOS_STATUS_ERROR_GPU_IS_LOST = NV_ERR_GPU_IS_LOST +NVOS_STATUS_ERROR_IN_FULLCHIP_RESET = NV_ERR_GPU_IN_FULLCHIP_RESET +NVOS_STATUS_ERROR_INVALID_LOCK_STATE = NV_ERR_INVALID_LOCK_STATE +NVOS_STATUS_ERROR_INVALID_ADDRESS = NV_ERR_INVALID_ADDRESS +NVOS_STATUS_ERROR_INVALID_IRQ_LEVEL = NV_ERR_INVALID_IRQ_LEVEL +NVOS_STATUS_ERROR_MEMORY_TRAINING_FAILED = NV_ERR_MEMORY_TRAINING_FAILED +NVOS_STATUS_ERROR_BUSY_RETRY = NV_ERR_BUSY_RETRY +NVOS_STATUS_ERROR_INSUFFICIENT_POWER = NV_ERR_INSUFFICIENT_POWER +NVOS_STATUS_ERROR_OBJECT_NOT_FOUND = NV_ERR_OBJECT_NOT_FOUND +NVOS_STATUS_ERROR_RESOURCE_LOST = NV_ERR_RESOURCE_LOST +NVOS_STATUS_ERROR_BUFFER_TOO_SMALL = NV_ERR_BUFFER_TOO_SMALL +NVOS_STATUS_ERROR_RESET_REQUIRED = NV_ERR_RESET_REQUIRED +NVOS_STATUS_ERROR_INVALID_REQUEST = NV_ERR_INVALID_REQUEST +NVOS_STATUS_ERROR_PRIV_SEC_VIOLATION = NV_ERR_PRIV_SEC_VIOLATION +NVOS_STATUS_ERROR_GPU_IN_DEBUG_MODE = NV_ERR_GPU_IN_DEBUG_MODE +NVOS_STATUS_ERROR_ALREADY_SIGNALLED = NV_ERR_ALREADY_SIGNALLED +NV01_FREE = (0x00000000) +NV01_ROOT = (0x0) +NV01_ROOT_NON_PRIV = (0x00000001) +NV01_ROOT_CLIENT = (0x00000041) +NV01_ALLOC_MEMORY = (0x00000002) +NVOS02_FLAGS_PHYSICALITY = (7, 4) +NVOS02_FLAGS_PHYSICALITY_CONTIGUOUS = (0x00000000) +NVOS02_FLAGS_PHYSICALITY_NONCONTIGUOUS = (0x00000001) +NVOS02_FLAGS_LOCATION = (11, 8) +NVOS02_FLAGS_LOCATION_PCI = (0x00000000) +NVOS02_FLAGS_LOCATION_VIDMEM = (0x00000002) +NVOS02_FLAGS_COHERENCY = (15, 12) +NVOS02_FLAGS_COHERENCY_UNCACHED = (0x00000000) +NVOS02_FLAGS_COHERENCY_CACHED = (0x00000001) +NVOS02_FLAGS_COHERENCY_WRITE_COMBINE = (0x00000002) +NVOS02_FLAGS_COHERENCY_WRITE_THROUGH = (0x00000003) +NVOS02_FLAGS_COHERENCY_WRITE_PROTECT = (0x00000004) +NVOS02_FLAGS_COHERENCY_WRITE_BACK = (0x00000005) +NVOS02_FLAGS_ALLOC = (17, 16) +NVOS02_FLAGS_ALLOC_NONE = (0x00000001) +NVOS02_FLAGS_GPU_CACHEABLE = (18, 18) +NVOS02_FLAGS_GPU_CACHEABLE_NO = (0x00000000) +NVOS02_FLAGS_GPU_CACHEABLE_YES = (0x00000001) +NVOS02_FLAGS_KERNEL_MAPPING = (19, 19) +NVOS02_FLAGS_KERNEL_MAPPING_NO_MAP = (0x00000000) +NVOS02_FLAGS_KERNEL_MAPPING_MAP = (0x00000001) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY = (20, 20) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY_YES = (0x00000001) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY = (21, 21) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY_YES = (0x00000001) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY = (22, 22) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY_YES = (0x00000001) +NVOS02_FLAGS_PEER_MAP_OVERRIDE = (23, 23) +NVOS02_FLAGS_PEER_MAP_OVERRIDE_DEFAULT = (0x00000000) +NVOS02_FLAGS_PEER_MAP_OVERRIDE_REQUIRED = (0x00000001) +NVOS02_FLAGS_ALLOC_TYPE_SYNCPOINT = (24, 24) +NVOS02_FLAGS_ALLOC_TYPE_SYNCPOINT_APERTURE = (0x00000001) +NVOS02_FLAGS_MEMORY_PROTECTION = (26, 25) +NVOS02_FLAGS_MEMORY_PROTECTION_DEFAULT = (0x00000000) +NVOS02_FLAGS_MEMORY_PROTECTION_PROTECTED = (0x00000001) +NVOS02_FLAGS_MEMORY_PROTECTION_UNPROTECTED = (0x00000002) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM = (27, 27) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM_FALSE = (0x00000000) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM_TRUE = (0x00000001) +NVOS02_FLAGS_MAPPING = (31, 30) +NVOS02_FLAGS_MAPPING_DEFAULT = (0x00000000) +NVOS02_FLAGS_MAPPING_NO_MAP = (0x00000001) +NVOS02_FLAGS_MAPPING_NEVER_MAP = (0x00000002) +NVOS03_FLAGS_ACCESS = (1, 0) +NVOS03_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS03_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS03_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS03_FLAGS_PREALLOCATE = (2, 2) +NVOS03_FLAGS_PREALLOCATE_DISABLE = (0x00000000) +NVOS03_FLAGS_PREALLOCATE_ENABLE = (0x00000001) +NVOS03_FLAGS_GPU_MAPPABLE = (15, 15) +NVOS03_FLAGS_GPU_MAPPABLE_DISABLE = (0x00000000) +NVOS03_FLAGS_GPU_MAPPABLE_ENABLE = (0x00000001) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE = (16, 16) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE_FALSE = (0x00000000) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE_TRUE = (0x00000001) +NVOS03_FLAGS_PTE_KIND = (17, 16) +NVOS03_FLAGS_PTE_KIND_NONE = (0x00000000) +NVOS03_FLAGS_PTE_KIND_BL = (0x00000001) +NVOS03_FLAGS_PTE_KIND_PITCH = (0x00000002) +NVOS03_FLAGS_TYPE = (23, 20) +NVOS03_FLAGS_TYPE_NOTIFIER = (0x00000001) +NVOS03_FLAGS_MAPPING = (20, 20) +NVOS03_FLAGS_MAPPING_NONE = (0x00000000) +NVOS03_FLAGS_MAPPING_KERNEL = (0x00000001) +NVOS03_FLAGS_CACHE_SNOOP = (28, 28) +NVOS03_FLAGS_CACHE_SNOOP_ENABLE = (0x00000000) +NVOS03_FLAGS_CACHE_SNOOP_DISABLE = (0x00000001) +NVOS03_FLAGS_HASH_TABLE = (29, 29) +NVOS03_FLAGS_HASH_TABLE_ENABLE = (0x00000000) +NVOS03_FLAGS_HASH_TABLE_DISABLE = (0x00000001) +NV01_ALLOC_OBJECT = (0x00000005) +NV01_EVENT_KERNEL_CALLBACK = (0x00000078) +NV01_EVENT_OS_EVENT = (0x00000079) +NV01_EVENT_WIN32_EVENT = NV01_EVENT_OS_EVENT +NV01_EVENT_KERNEL_CALLBACK_EX = (0x0000007E) +NV01_EVENT_BROADCAST = (0x80000000) +NV01_EVENT_PERMIT_NON_ROOT_EVENT_KERNEL_CALLBACK_CREATION = (0x40000000) +NV01_EVENT_SUBDEVICE_SPECIFIC = (0x20000000) +NV01_EVENT_WITHOUT_EVENT_DATA = (0x10000000) +NV01_EVENT_NONSTALL_INTR = (0x08000000) +NV01_EVENT_CLIENT_RM = (0x04000000) +NV04_I2C_ACCESS = (0x00000013) +NVOS_I2C_ACCESS_MAX_BUFFER_SIZE = 2048 +NVOS20_COMMAND_unused0001 = 0x0001 +NVOS20_COMMAND_unused0002 = 0x0002 +NVOS20_COMMAND_STRING_PRINT = 0x0003 +NV04_ALLOC = (0x00000015) +NVOS64_FLAGS_NONE = (0x00000000) +NVOS64_FLAGS_FINN_SERIALIZED = (0x00000001) +NVOS65_PARAMETERS_VERSION_MAGIC = 0x77FEF81E +NV04_IDLE_CHANNELS = (0x0000001E) +NVOS30_FLAGS_BEHAVIOR = (3, 0) +NVOS30_FLAGS_BEHAVIOR_SPIN = (0x00000000) +NVOS30_FLAGS_BEHAVIOR_SLEEP = (0x00000001) +NVOS30_FLAGS_BEHAVIOR_QUERY = (0x00000002) +NVOS30_FLAGS_BEHAVIOR_FORCE_BUSY_CHECK = (0x00000003) +NVOS30_FLAGS_CHANNEL = (7, 4) +NVOS30_FLAGS_CHANNEL_LIST = (0x00000000) +NVOS30_FLAGS_CHANNEL_SINGLE = (0x00000001) +NVOS30_FLAGS_IDLE = (30, 8) +NVOS30_FLAGS_IDLE_PUSH_BUFFER = (0x00000001) +NVOS30_FLAGS_IDLE_CACHE1 = (0x00000002) +NVOS30_FLAGS_IDLE_GRAPHICS = (0x00000004) +NVOS30_FLAGS_IDLE_MPEG = (0x00000008) +NVOS30_FLAGS_IDLE_MOTION_ESTIMATION = (0x00000010) +NVOS30_FLAGS_IDLE_VIDEO_PROCESSOR = (0x00000020) +NVOS30_FLAGS_IDLE_MSPDEC = (0x00000020) +NVOS30_FLAGS_IDLE_BITSTREAM_PROCESSOR = (0x00000040) +NVOS30_FLAGS_IDLE_MSVLD = (0x00000040) +NVOS30_FLAGS_IDLE_NVDEC0 = NVOS30_FLAGS_IDLE_MSVLD +NVOS30_FLAGS_IDLE_CIPHER_DMA = (0x00000080) +NVOS30_FLAGS_IDLE_SEC = (0x00000080) +NVOS30_FLAGS_IDLE_CALLBACKS = (0x00000100) +NVOS30_FLAGS_IDLE_MSPPP = (0x00000200) +NVOS30_FLAGS_IDLE_CE0 = (0x00000400) +NVOS30_FLAGS_IDLE_CE1 = (0x00000800) +NVOS30_FLAGS_IDLE_CE2 = (0x00001000) +NVOS30_FLAGS_IDLE_CE3 = (0x00002000) +NVOS30_FLAGS_IDLE_CE4 = (0x00004000) +NVOS30_FLAGS_IDLE_CE5 = (0x00008000) +NVOS30_FLAGS_IDLE_VIC = (0x00010000) +NVOS30_FLAGS_IDLE_MSENC = (0x00020000) +NVOS30_FLAGS_IDLE_NVENC0 = NVOS30_FLAGS_IDLE_MSENC +NVOS30_FLAGS_IDLE_NVENC1 = (0x00040000) +NVOS30_FLAGS_IDLE_NVENC2 = (0x00080000) +NVOS30_FLAGS_IDLE_NVJPG = (0x00100000) +NVOS30_FLAGS_IDLE_NVDEC1 = (0x00200000) +NVOS30_FLAGS_IDLE_NVDEC2 = (0x00400000) +NVOS30_FLAGS_IDLE_ACTIVECHANNELS = (0x00800000) +NVOS30_FLAGS_IDLE_ALL_ENGINES = (NVOS30_FLAGS_IDLE_GRAPHICS | NVOS30_FLAGS_IDLE_MPEG | NVOS30_FLAGS_IDLE_MOTION_ESTIMATION | NVOS30_FLAGS_IDLE_VIDEO_PROCESSOR | NVOS30_FLAGS_IDLE_BITSTREAM_PROCESSOR | NVOS30_FLAGS_IDLE_CIPHER_DMA | NVOS30_FLAGS_IDLE_MSPDEC | NVOS30_FLAGS_IDLE_NVDEC0 | NVOS30_FLAGS_IDLE_SEC | NVOS30_FLAGS_IDLE_MSPPP | NVOS30_FLAGS_IDLE_CE0 | NVOS30_FLAGS_IDLE_CE1 | NVOS30_FLAGS_IDLE_CE2 | NVOS30_FLAGS_IDLE_CE3 | NVOS30_FLAGS_IDLE_CE4 | NVOS30_FLAGS_IDLE_CE5 | NVOS30_FLAGS_IDLE_NVENC0 | NVOS30_FLAGS_IDLE_NVENC1 | NVOS30_FLAGS_IDLE_NVENC2 | NVOS30_FLAGS_IDLE_VIC | NVOS30_FLAGS_IDLE_NVJPG | NVOS30_FLAGS_IDLE_NVDEC1 | NVOS30_FLAGS_IDLE_NVDEC2) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON = (31, 31) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON_NO = (0x00000000) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON_YES = (0x00000001) +NV04_VID_HEAP_CONTROL = (0x00000020) +NVOS32_DESCRIPTOR_TYPE_VIRTUAL_ADDRESS = 0 +NVOS32_DESCRIPTOR_TYPE_OS_PAGE_ARRAY = 1 +NVOS32_DESCRIPTOR_TYPE_OS_IO_MEMORY = 2 +NVOS32_DESCRIPTOR_TYPE_OS_PHYS_ADDR = 3 +NVOS32_DESCRIPTOR_TYPE_OS_FILE_HANDLE = 4 +NVOS32_DESCRIPTOR_TYPE_OS_DMA_BUF_PTR = 5 +NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR = 6 +NVOS32_DESCRIPTOR_TYPE_KERNEL_VIRTUAL_ADDRESS = 7 +NVOS32_FUNCTION_ALLOC_SIZE = 2 +NVOS32_FUNCTION_FREE = 3 +NVOS32_FUNCTION_INFO = 5 +NVOS32_FUNCTION_ALLOC_TILED_PITCH_HEIGHT = 6 +NVOS32_FUNCTION_DUMP = 11 +NVOS32_FUNCTION_ALLOC_SIZE_RANGE = 14 +NVOS32_FUNCTION_REACQUIRE_COMPR = 15 +NVOS32_FUNCTION_RELEASE_COMPR = 16 +NVOS32_FUNCTION_GET_MEM_ALIGNMENT = 18 +NVOS32_FUNCTION_HW_ALLOC = 19 +NVOS32_FUNCTION_HW_FREE = 20 +NVOS32_FUNCTION_ALLOC_OS_DESCRIPTOR = 27 +NVOS32_FLAGS_BLOCKINFO_VISIBILITY_CPU = (0x00000001) +NVOS32_IVC_HEAP_NUMBER_DONT_ALLOCATE_ON_IVC_HEAP = 0 +NVAL_MAX_BANKS = (4) +NVAL_MAP_DIRECTION = (0, 0) +NVAL_MAP_DIRECTION_DOWN = 0x00000000 +NVAL_MAP_DIRECTION_UP = 0x00000001 +NV_RM_OS32_ALLOC_OS_DESCRIPTOR_WITH_OS32_ATTR = 1 +NVOS32_DELETE_RESOURCES_ALL = 0 +NVOS32_TYPE_IMAGE = 0 +NVOS32_TYPE_DEPTH = 1 +NVOS32_TYPE_TEXTURE = 2 +NVOS32_TYPE_VIDEO = 3 +NVOS32_TYPE_FONT = 4 +NVOS32_TYPE_CURSOR = 5 +NVOS32_TYPE_DMA = 6 +NVOS32_TYPE_INSTANCE = 7 +NVOS32_TYPE_PRIMARY = 8 +NVOS32_TYPE_ZCULL = 9 +NVOS32_TYPE_UNUSED = 10 +NVOS32_TYPE_SHADER_PROGRAM = 11 +NVOS32_TYPE_OWNER_RM = 12 +NVOS32_TYPE_NOTIFIER = 13 +NVOS32_TYPE_RESERVED = 14 +NVOS32_TYPE_PMA = 15 +NVOS32_TYPE_STENCIL = 16 +NVOS32_NUM_MEM_TYPES = 17 +NVOS32_ATTR_NONE = 0x00000000 +NVOS32_ATTR_DEPTH = (2, 0) +NVOS32_ATTR_DEPTH_UNKNOWN = 0x00000000 +NVOS32_ATTR_DEPTH_8 = 0x00000001 +NVOS32_ATTR_DEPTH_16 = 0x00000002 +NVOS32_ATTR_DEPTH_24 = 0x00000003 +NVOS32_ATTR_DEPTH_32 = 0x00000004 +NVOS32_ATTR_DEPTH_64 = 0x00000005 +NVOS32_ATTR_DEPTH_128 = 0x00000006 +NVOS32_ATTR_COMPR_COVG = (3, 3) +NVOS32_ATTR_COMPR_COVG_DEFAULT = 0x00000000 +NVOS32_ATTR_COMPR_COVG_PROVIDED = 0x00000001 +NVOS32_ATTR_AA_SAMPLES = (7, 4) +NVOS32_ATTR_AA_SAMPLES_1 = 0x00000000 +NVOS32_ATTR_AA_SAMPLES_2 = 0x00000001 +NVOS32_ATTR_AA_SAMPLES_4 = 0x00000002 +NVOS32_ATTR_AA_SAMPLES_4_ROTATED = 0x00000003 +NVOS32_ATTR_AA_SAMPLES_6 = 0x00000004 +NVOS32_ATTR_AA_SAMPLES_8 = 0x00000005 +NVOS32_ATTR_AA_SAMPLES_16 = 0x00000006 +NVOS32_ATTR_AA_SAMPLES_4_VIRTUAL_8 = 0x00000007 +NVOS32_ATTR_AA_SAMPLES_4_VIRTUAL_16 = 0x00000008 +NVOS32_ATTR_AA_SAMPLES_8_VIRTUAL_16 = 0x00000009 +NVOS32_ATTR_AA_SAMPLES_8_VIRTUAL_32 = 0x0000000A +NVOS32_ATTR_ZCULL = (11, 10) +NVOS32_ATTR_ZCULL_NONE = 0x00000000 +NVOS32_ATTR_ZCULL_REQUIRED = 0x00000001 +NVOS32_ATTR_ZCULL_ANY = 0x00000002 +NVOS32_ATTR_ZCULL_SHARED = 0x00000003 +NVOS32_ATTR_COMPR = (13, 12) +NVOS32_ATTR_COMPR_NONE = 0x00000000 +NVOS32_ATTR_COMPR_REQUIRED = 0x00000001 +NVOS32_ATTR_COMPR_ANY = 0x00000002 +NVOS32_ATTR_COMPR_PLC_REQUIRED = NVOS32_ATTR_COMPR_REQUIRED +NVOS32_ATTR_COMPR_PLC_ANY = NVOS32_ATTR_COMPR_ANY +NVOS32_ATTR_COMPR_DISABLE_PLC_ANY = 0x00000003 +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP = (14, 14) +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP_NO = 0x00000000 +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP_YES = 0x00000001 +NVOS32_ATTR_FORMAT = (17, 16) +NVOS32_ATTR_FORMAT_LOW_FIELD = 16 +NVOS32_ATTR_FORMAT_HIGH_FIELD = 17 +NVOS32_ATTR_FORMAT_PITCH = 0x00000000 +NVOS32_ATTR_FORMAT_SWIZZLED = 0x00000001 +NVOS32_ATTR_FORMAT_BLOCK_LINEAR = 0x00000002 +NVOS32_ATTR_Z_TYPE = (18, 18) +NVOS32_ATTR_Z_TYPE_FIXED = 0x00000000 +NVOS32_ATTR_Z_TYPE_FLOAT = 0x00000001 +NVOS32_ATTR_ZS_PACKING = (21, 19) +NVOS32_ATTR_ZS_PACKING_S8 = 0x00000000 +NVOS32_ATTR_ZS_PACKING_Z24S8 = 0x00000000 +NVOS32_ATTR_ZS_PACKING_S8Z24 = 0x00000001 +NVOS32_ATTR_ZS_PACKING_Z32 = 0x00000002 +NVOS32_ATTR_ZS_PACKING_Z24X8 = 0x00000003 +NVOS32_ATTR_ZS_PACKING_X8Z24 = 0x00000004 +NVOS32_ATTR_ZS_PACKING_Z32_X24S8 = 0x00000005 +NVOS32_ATTR_ZS_PACKING_X8Z24_X24S8 = 0x00000006 +NVOS32_ATTR_ZS_PACKING_Z16 = 0x00000007 +NVOS32_ATTR_COLOR_PACKING = NVOS32_ATTR_ZS_PACKING +NVOS32_ATTR_COLOR_PACKING_A8R8G8B8 = 0x00000000 +NVOS32_ATTR_COLOR_PACKING_X8R8G8B8 = 0x00000001 +NVOS32_ATTR_PAGE_SIZE = (24, 23) +NVOS32_ATTR_PAGE_SIZE_DEFAULT = 0x00000000 +NVOS32_ATTR_PAGE_SIZE_4KB = 0x00000001 +NVOS32_ATTR_PAGE_SIZE_BIG = 0x00000002 +NVOS32_ATTR_PAGE_SIZE_HUGE = 0x00000003 +NVOS32_ATTR_LOCATION = (26, 25) +NVOS32_ATTR_LOCATION_VIDMEM = 0x00000000 +NVOS32_ATTR_LOCATION_PCI = 0x00000001 +NVOS32_ATTR_LOCATION_ANY = 0x00000003 +NVOS32_ATTR_PHYSICALITY = (28, 27) +NVOS32_ATTR_PHYSICALITY_DEFAULT = 0x00000000 +NVOS32_ATTR_PHYSICALITY_NONCONTIGUOUS = 0x00000001 +NVOS32_ATTR_PHYSICALITY_CONTIGUOUS = 0x00000002 +NVOS32_ATTR_PHYSICALITY_ALLOW_NONCONTIGUOUS = 0x00000003 +NVOS32_ATTR_COHERENCY = (31, 29) +NVOS32_ATTR_COHERENCY_UNCACHED = 0x00000000 +NVOS32_ATTR_COHERENCY_CACHED = 0x00000001 +NVOS32_ATTR_COHERENCY_WRITE_COMBINE = 0x00000002 +NVOS32_ATTR_COHERENCY_WRITE_THROUGH = 0x00000003 +NVOS32_ATTR_COHERENCY_WRITE_PROTECT = 0x00000004 +NVOS32_ATTR_COHERENCY_WRITE_BACK = 0x00000005 +NVOS32_ATTR2_NONE = 0x00000000 +NVOS32_ATTR2_ZBC = (1, 0) +NVOS32_ATTR2_ZBC_DEFAULT = 0x00000000 +NVOS32_ATTR2_ZBC_PREFER_NO_ZBC = 0x00000001 +NVOS32_ATTR2_ZBC_PREFER_ZBC = 0x00000002 +NVOS32_ATTR2_ZBC_REQUIRE_ONLY_ZBC = 0x00000003 +NVOS32_ATTR2_ZBC_INVALID = 0x00000003 +NVOS32_ATTR2_GPU_CACHEABLE = (3, 2) +NVOS32_ATTR2_GPU_CACHEABLE_DEFAULT = 0x00000000 +NVOS32_ATTR2_GPU_CACHEABLE_YES = 0x00000001 +NVOS32_ATTR2_GPU_CACHEABLE_NO = 0x00000002 +NVOS32_ATTR2_GPU_CACHEABLE_INVALID = 0x00000003 +NVOS32_ATTR2_P2P_GPU_CACHEABLE = (5, 4) +NVOS32_ATTR2_P2P_GPU_CACHEABLE_DEFAULT = 0x00000000 +NVOS32_ATTR2_P2P_GPU_CACHEABLE_YES = 0x00000001 +NVOS32_ATTR2_P2P_GPU_CACHEABLE_NO = 0x00000002 +NVOS32_ATTR2_32BIT_POINTER = (6, 6) +NVOS32_ATTR2_32BIT_POINTER_DISABLE = 0x00000000 +NVOS32_ATTR2_32BIT_POINTER_ENABLE = 0x00000001 +NVOS32_ATTR2_FIXED_NUMA_NODE_ID = (7, 7) +NVOS32_ATTR2_FIXED_NUMA_NODE_ID_NO = 0x00000000 +NVOS32_ATTR2_FIXED_NUMA_NODE_ID_YES = 0x00000001 +NVOS32_ATTR2_SMMU_ON_GPU = (9, 8) +NVOS32_ATTR2_SMMU_ON_GPU_DEFAULT = 0x00000000 +NVOS32_ATTR2_SMMU_ON_GPU_DISABLE = 0x00000001 +NVOS32_ATTR2_SMMU_ON_GPU_ENABLE = 0x00000002 +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT = (10, 10) +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT_FALSE = 0x00000000 +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT_TRUE = 0x00000001 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN = (11, 11) +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_OFF = 0x0 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_ON = 0x1 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_DEFAULT = NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_OFF +NVOS32_ATTR2_PRIORITY = (13, 12) +NVOS32_ATTR2_PRIORITY_DEFAULT = 0x0 +NVOS32_ATTR2_PRIORITY_HIGH = 0x1 +NVOS32_ATTR2_PRIORITY_LOW = 0x2 +NVOS32_ATTR2_INTERNAL = (14, 14) +NVOS32_ATTR2_INTERNAL_NO = 0x0 +NVOS32_ATTR2_INTERNAL_YES = 0x1 +NVOS32_ATTR2_PREFER_2C = (15, 15) +NVOS32_ATTR2_PREFER_2C_NO = 0x00000000 +NVOS32_ATTR2_PREFER_2C_YES = 0x00000001 +NVOS32_ATTR2_NISO_DISPLAY = (16, 16) +NVOS32_ATTR2_NISO_DISPLAY_NO = 0x00000000 +NVOS32_ATTR2_NISO_DISPLAY_YES = 0x00000001 +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT = (17, 17) +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT_NO = 0x00000000 +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT_YES = 0x00000001 +NVOS32_ATTR2_ISO = (18, 18) +NVOS32_ATTR2_ISO_NO = 0x00000000 +NVOS32_ATTR2_ISO_YES = 0x00000001 +NVOS32_ATTR2_BLACKLIST = (19, 19) +NVOS32_ATTR2_BLACKLIST_ON = 0x00000000 +NVOS32_ATTR2_BLACKLIST_OFF = 0x00000001 +NVOS32_ATTR2_PAGE_OFFLINING = (19, 19) +NVOS32_ATTR2_PAGE_OFFLINING_ON = 0x00000000 +NVOS32_ATTR2_PAGE_OFFLINING_OFF = 0x00000001 +NVOS32_ATTR2_PAGE_SIZE_HUGE = (21, 20) +NVOS32_ATTR2_PAGE_SIZE_HUGE_DEFAULT = 0x00000000 +NVOS32_ATTR2_PAGE_SIZE_HUGE_2MB = 0x00000001 +NVOS32_ATTR2_PAGE_SIZE_HUGE_512MB = 0x00000002 +NVOS32_ATTR2_PAGE_SIZE_HUGE_256GB = 0x00000003 +NVOS32_ATTR2_PROTECTION_USER = (22, 22) +NVOS32_ATTR2_PROTECTION_USER_READ_WRITE = 0x00000000 +NVOS32_ATTR2_PROTECTION_USER_READ_ONLY = 0x00000001 +NVOS32_ATTR2_PROTECTION_DEVICE = (23, 23) +NVOS32_ATTR2_PROTECTION_DEVICE_READ_WRITE = 0x00000000 +NVOS32_ATTR2_PROTECTION_DEVICE_READ_ONLY = 0x00000001 +NVOS32_ATTR2_USE_EGM = (24, 24) +NVOS32_ATTR2_USE_EGM_FALSE = 0x00000000 +NVOS32_ATTR2_USE_EGM_TRUE = 0x00000001 +NVOS32_ATTR2_MEMORY_PROTECTION = (26, 25) +NVOS32_ATTR2_MEMORY_PROTECTION_DEFAULT = 0x00000000 +NVOS32_ATTR2_MEMORY_PROTECTION_PROTECTED = 0x00000001 +NVOS32_ATTR2_MEMORY_PROTECTION_UNPROTECTED = 0x00000002 +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP = (27, 27) +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP_NO = 0x00000000 +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP_YES = 0x00000001 +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM = (31, 31) +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM_FALSE = 0x00000000 +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM_TRUE = 0x00000001 +NVOS32_ALLOC_FLAGS_IGNORE_BANK_PLACEMENT = 0x00000001 +NVOS32_ALLOC_FLAGS_FORCE_MEM_GROWS_UP = 0x00000002 +NVOS32_ALLOC_FLAGS_FORCE_MEM_GROWS_DOWN = 0x00000004 +NVOS32_ALLOC_FLAGS_FORCE_ALIGN_HOST_PAGE = 0x00000008 +NVOS32_ALLOC_FLAGS_FIXED_ADDRESS_ALLOCATE = 0x00000010 +NVOS32_ALLOC_FLAGS_BANK_HINT = 0x00000020 +NVOS32_ALLOC_FLAGS_BANK_FORCE = 0x00000040 +NVOS32_ALLOC_FLAGS_ALIGNMENT_HINT = 0x00000080 +NVOS32_ALLOC_FLAGS_ALIGNMENT_FORCE = 0x00000100 +NVOS32_ALLOC_FLAGS_BANK_GROW_UP = 0x00000000 +NVOS32_ALLOC_FLAGS_BANK_GROW_DOWN = 0x00000200 +NVOS32_ALLOC_FLAGS_LAZY = 0x00000400 +NVOS32_ALLOC_FLAGS_FORCE_REVERSE_ALLOC = 0x00000800 +NVOS32_ALLOC_FLAGS_NO_SCANOUT = 0x00001000 +NVOS32_ALLOC_FLAGS_PITCH_FORCE = 0x00002000 +NVOS32_ALLOC_FLAGS_MEMORY_HANDLE_PROVIDED = 0x00004000 +NVOS32_ALLOC_FLAGS_MAP_NOT_REQUIRED = 0x00008000 +NVOS32_ALLOC_FLAGS_PERSISTENT_VIDMEM = 0x00010000 +NVOS32_ALLOC_FLAGS_USE_BEGIN_END = 0x00020000 +NVOS32_ALLOC_FLAGS_TURBO_CIPHER_ENCRYPTED = 0x00040000 +NVOS32_ALLOC_FLAGS_VIRTUAL = 0x00080000 +NVOS32_ALLOC_FLAGS_FORCE_INTERNAL_INDEX = 0x00100000 +NVOS32_ALLOC_FLAGS_ZCULL_COVG_SPECIFIED = 0x00200000 +NVOS32_ALLOC_FLAGS_EXTERNALLY_MANAGED = 0x00400000 +NVOS32_ALLOC_FLAGS_FORCE_DEDICATED_PDE = 0x00800000 +NVOS32_ALLOC_FLAGS_PROTECTED = 0x01000000 +NVOS32_ALLOC_FLAGS_KERNEL_MAPPING_MAP = 0x02000000 +NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE = 0x02000000 +NVOS32_ALLOC_FLAGS_SPARSE = 0x04000000 +NVOS32_ALLOC_FLAGS_USER_READ_ONLY = 0x04000000 +NVOS32_ALLOC_FLAGS_DEVICE_READ_ONLY = 0x08000000 +NVOS32_ALLOC_FLAGS_ALLOCATE_KERNEL_PRIVILEGED = 0x08000000 +NVOS32_ALLOC_FLAGS_SKIP_RESOURCE_ALLOC = 0x10000000 +NVOS32_ALLOC_FLAGS_PREFER_PTES_IN_SYSMEMORY = 0x20000000 +NVOS32_ALLOC_FLAGS_SKIP_ALIGN_PAD = 0x40000000 +NVOS32_ALLOC_FLAGS_WPR1 = 0x40000000 +NVOS32_ALLOC_FLAGS_ZCULL_DONT_ALLOCATE_SHARED_1X = 0x80000000 +NVOS32_ALLOC_FLAGS_WPR2 = 0x80000000 +NVOS32_ALLOC_INTERNAL_FLAGS_CLIENTALLOC = 0x00000001 +NVOS32_ALLOC_INTERNAL_FLAGS_SKIP_SCRUB = 0x00000004 +NVOS32_ALLOC_FLAGS_MAXIMIZE_4GB_ADDRESS_SPACE = NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE +NVOS32_ALLOC_FLAGS_VIRTUAL_ONLY = ( NVOS32_ALLOC_FLAGS_VIRTUAL | NVOS32_ALLOC_FLAGS_LAZY | NVOS32_ALLOC_FLAGS_EXTERNALLY_MANAGED | NVOS32_ALLOC_FLAGS_SPARSE | NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE | NVOS32_ALLOC_FLAGS_PREFER_PTES_IN_SYSMEMORY ) +NVOS32_ALLOC_COMPR_COVG_SCALE = 10 +NVOS32_ALLOC_COMPR_COVG_BITS = (1, 0) +NVOS32_ALLOC_COMPR_COVG_BITS_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPR_COVG_BITS_1 = 0x00000001 +NVOS32_ALLOC_COMPR_COVG_BITS_2 = 0x00000002 +NVOS32_ALLOC_COMPR_COVG_BITS_4 = 0x00000003 +NVOS32_ALLOC_COMPR_COVG_MAX = (11, 2) +NVOS32_ALLOC_COMPR_COVG_MIN = (21, 12) +NVOS32_ALLOC_COMPR_COVG_START = (31, 22) +NVOS32_ALLOC_ZCULL_COVG_FORMAT = (3, 0) +NVOS32_ALLOC_ZCULL_COVG_FORMAT_LOW_RES_Z = 0x00000000 +NVOS32_ALLOC_ZCULL_COVG_FORMAT_HIGH_RES_Z = 0x00000002 +NVOS32_ALLOC_ZCULL_COVG_FORMAT_LOW_RES_ZS = 0x00000003 +NVOS32_ALLOC_ZCULL_COVG_FALLBACK = (4, 4) +NVOS32_ALLOC_ZCULL_COVG_FALLBACK_DISALLOW = 0x00000000 +NVOS32_ALLOC_ZCULL_COVG_FALLBACK_ALLOW = 0x00000001 +NVOS32_ALLOC_COMPTAG_OFFSET_START = (19, 0) +NVOS32_ALLOC_COMPTAG_OFFSET_START_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE = (31, 30) +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_OFF = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_FIXED = 0x00000001 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_MIN = 0x00000002 +NVOS32_REALLOC_FLAGS_GROW_ALLOCATION = 0x00000000 +NVOS32_REALLOC_FLAGS_SHRINK_ALLOCATION = 0x00000001 +NVOS32_REALLOC_FLAGS_REALLOC_UP = 0x00000000 +NVOS32_REALLOC_FLAGS_REALLOC_DOWN = 0x00000002 +NVOS32_RELEASE_COMPR_FLAGS_MEMORY_HANDLE_PROVIDED = 0x000000001 +NVOS32_REACQUIRE_COMPR_FLAGS_MEMORY_HANDLE_PROVIDED = 0x000000001 +NVOS32_FREE_FLAGS_MEMORY_HANDLE_PROVIDED = 0x00000001 +NVOS32_DUMP_FLAGS_TYPE = (1, 0) +NVOS32_DUMP_FLAGS_TYPE_FB = 0x00000000 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_PD = 0x00000001 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_VA = 0x00000002 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_VAPTE = 0x00000003 +NVOS32_BLOCK_TYPE_FREE = 0xFFFFFFFF +NVOS32_INVALID_BLOCK_FREE_OFFSET = 0xFFFFFFFF +NVOS32_MEM_TAG_NONE = 0x00000000 +NV04_MAP_MEMORY = (0x00000021) +NV04_MAP_MEMORY_FLAGS_NONE = (0x00000000) +NV04_MAP_MEMORY_FLAGS_USER = (0x00004000) +NVOS33_FLAGS_ACCESS = (1, 0) +NVOS33_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS33_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS33_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS33_FLAGS_PERSISTENT = (4, 4) +NVOS33_FLAGS_PERSISTENT_DISABLE = (0x00000000) +NVOS33_FLAGS_PERSISTENT_ENABLE = (0x00000001) +NVOS33_FLAGS_SKIP_SIZE_CHECK = (8, 8) +NVOS33_FLAGS_SKIP_SIZE_CHECK_DISABLE = (0x00000000) +NVOS33_FLAGS_SKIP_SIZE_CHECK_ENABLE = (0x00000001) +NVOS33_FLAGS_MEM_SPACE = (14, 14) +NVOS33_FLAGS_MEM_SPACE_CLIENT = (0x00000000) +NVOS33_FLAGS_MEM_SPACE_USER = (0x00000001) +NVOS33_FLAGS_MAPPING = (16, 15) +NVOS33_FLAGS_MAPPING_DEFAULT = (0x00000000) +NVOS33_FLAGS_MAPPING_DIRECT = (0x00000001) +NVOS33_FLAGS_MAPPING_REFLECTED = (0x00000002) +NVOS33_FLAGS_FIFO_MAPPING = (17, 17) +NVOS33_FLAGS_FIFO_MAPPING_DEFAULT = (0x00000000) +NVOS33_FLAGS_FIFO_MAPPING_ENABLE = (0x00000001) +NVOS33_FLAGS_MAP_FIXED = (18, 18) +NVOS33_FLAGS_MAP_FIXED_DISABLE = (0x00000000) +NVOS33_FLAGS_MAP_FIXED_ENABLE = (0x00000001) +NVOS33_FLAGS_RESERVE_ON_UNMAP = (19, 19) +NVOS33_FLAGS_RESERVE_ON_UNMAP_DISABLE = (0x00000000) +NVOS33_FLAGS_RESERVE_ON_UNMAP_ENABLE = (0x00000001) +NVOS33_FLAGS_OS_DESCRIPTOR = (22, 22) +NVOS33_FLAGS_OS_DESCRIPTOR_DISABLE = (0x00000000) +NVOS33_FLAGS_OS_DESCRIPTOR_ENABLE = (0x00000001) +NVOS33_FLAGS_CACHING_TYPE = (25, 23) +NVOS33_FLAGS_CACHING_TYPE_CACHED = 0 +NVOS33_FLAGS_CACHING_TYPE_UNCACHED = 1 +NVOS33_FLAGS_CACHING_TYPE_WRITECOMBINED = 2 +NVOS33_FLAGS_CACHING_TYPE_WRITEBACK = 5 +NVOS33_FLAGS_CACHING_TYPE_DEFAULT = 6 +NVOS33_FLAGS_CACHING_TYPE_UNCACHED_WEAK = 7 +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC = (26, 26) +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC_NO = (0x00000000) +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC_YES = (0x00000001) +NV04_UNMAP_MEMORY = (0x00000022) +NV04_ACCESS_REGISTRY = (0x00000026) +NVOS38_ACCESS_TYPE_READ_DWORD = 1 +NVOS38_ACCESS_TYPE_WRITE_DWORD = 2 +NVOS38_ACCESS_TYPE_READ_BINARY = 6 +NVOS38_ACCESS_TYPE_WRITE_BINARY = 7 +NVOS38_MAX_REGISTRY_STRING_LENGTH = 256 +NVOS38_MAX_REGISTRY_BINARY_LENGTH = 256 +NV04_ALLOC_CONTEXT_DMA = (0x00000027) +NV04_GET_EVENT_DATA = (0x00000028) +NVSIM01_BUS_XACT = (0x0000002C) +NV04_MAP_MEMORY_DMA = (0x0000002E) +NVOS46_FLAGS_ACCESS = (1, 0) +NVOS46_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS46_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS46_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS46_FLAGS_32BIT_POINTER = (2, 2) +NVOS46_FLAGS_32BIT_POINTER_DISABLE = (0x00000000) +NVOS46_FLAGS_32BIT_POINTER_ENABLE = (0x00000001) +NVOS46_FLAGS_PAGE_KIND = (3, 3) +NVOS46_FLAGS_PAGE_KIND_PHYSICAL = (0x00000000) +NVOS46_FLAGS_PAGE_KIND_VIRTUAL = (0x00000001) +NVOS46_FLAGS_CACHE_SNOOP = (4, 4) +NVOS46_FLAGS_CACHE_SNOOP_DISABLE = (0x00000000) +NVOS46_FLAGS_CACHE_SNOOP_ENABLE = (0x00000001) +NVOS46_FLAGS_KERNEL_MAPPING = (5, 5) +NVOS46_FLAGS_KERNEL_MAPPING_NONE = (0x00000000) +NVOS46_FLAGS_KERNEL_MAPPING_ENABLE = (0x00000001) +NVOS46_FLAGS_SHADER_ACCESS = (7, 6) +NVOS46_FLAGS_SHADER_ACCESS_DEFAULT = (0x00000000) +NVOS46_FLAGS_SHADER_ACCESS_READ_ONLY = (0x00000001) +NVOS46_FLAGS_SHADER_ACCESS_WRITE_ONLY = (0x00000002) +NVOS46_FLAGS_SHADER_ACCESS_READ_WRITE = (0x00000003) +NVOS46_FLAGS_PAGE_SIZE = (11, 8) +NVOS46_FLAGS_PAGE_SIZE_DEFAULT = (0x00000000) +NVOS46_FLAGS_PAGE_SIZE_4KB = (0x00000001) +NVOS46_FLAGS_PAGE_SIZE_BIG = (0x00000002) +NVOS46_FLAGS_PAGE_SIZE_BOTH = (0x00000003) +NVOS46_FLAGS_PAGE_SIZE_HUGE = (0x00000004) +NVOS46_FLAGS_PAGE_SIZE_512M = (0x00000005) +NVOS46_FLAGS_SYSTEM_L3_ALLOC = (13, 13) +NVOS46_FLAGS_SYSTEM_L3_ALLOC_DEFAULT = (0x00000000) +NVOS46_FLAGS_SYSTEM_L3_ALLOC_ENABLE_HINT = (0x00000001) +NVOS46_FLAGS_DMA_OFFSET_GROWS = (14, 14) +NVOS46_FLAGS_DMA_OFFSET_GROWS_UP = (0x00000000) +NVOS46_FLAGS_DMA_OFFSET_GROWS_DOWN = (0x00000001) +NVOS46_FLAGS_DMA_OFFSET_FIXED = (15, 15) +NVOS46_FLAGS_DMA_OFFSET_FIXED_FALSE = (0x00000000) +NVOS46_FLAGS_DMA_OFFSET_FIXED_TRUE = (0x00000001) +NVOS46_FLAGS_DISABLE_ENCRYPTION = (16, 16) +NVOS46_FLAGS_DISABLE_ENCRYPTION_FALSE = (0x00000000) +NVOS46_FLAGS_DISABLE_ENCRYPTION_TRUE = (0x00000001) +NVOS46_FLAGS_P2P = (27, 20) +NVOS46_FLAGS_P2P_ENABLE = (21, 20) +NVOS46_FLAGS_P2P_ENABLE_NO = (0x00000000) +NVOS46_FLAGS_P2P_ENABLE_YES = (0x00000001) +NVOS46_FLAGS_P2P_ENABLE_NONE = NVOS46_FLAGS_P2P_ENABLE_NO +NVOS46_FLAGS_P2P_ENABLE_SLI = NVOS46_FLAGS_P2P_ENABLE_YES +NVOS46_FLAGS_P2P_ENABLE_NOSLI = (0x00000002) +NVOS46_FLAGS_P2P_SUBDEVICE_ID = (24, 22) +NVOS46_FLAGS_P2P_SUBDEV_ID_SRC = NVOS46_FLAGS_P2P_SUBDEVICE_ID +NVOS46_FLAGS_P2P_SUBDEV_ID_TGT = (27, 25) +NVOS46_FLAGS_TLB_LOCK = (28, 28) +NVOS46_FLAGS_TLB_LOCK_DISABLE = (0x00000000) +NVOS46_FLAGS_TLB_LOCK_ENABLE = (0x00000001) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC = (29, 29) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC_FALSE = (0x00000000) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC_TRUE = (0x00000001) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP = (30, 30) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP_FALSE = (0x00000000) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP_TRUE = (0x00000001) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION = (31, 31) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION_FALSE = (0x00000000) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION_TRUE = (0x00000001) +NV04_UNMAP_MEMORY_DMA = (0x0000002F) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION = (0, 0) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION_FALSE = (0x00000000) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION_TRUE = (0x00000001) +NV04_BIND_CONTEXT_DMA = (0x00000031) +NV04_CONTROL = (0x00000036) +NVOS54_FLAGS_NONE = (0x00000000) +NVOS54_FLAGS_IRQL_RAISED = (0x00000001) +NVOS54_FLAGS_LOCK_BYPASS = (0x00000002) +NVOS54_FLAGS_FINN_SERIALIZED = (0x00000004) +NV04_DUP_OBJECT = (0x00000037) +NV04_DUP_HANDLE_FLAGS_NONE = (0x00000000) +NV04_DUP_HANDLE_FLAGS_REJECT_KERNEL_DUP_PRIVILEGE = (0x00000001) +NV04_UPDATE_DEVICE_MAPPING_INFO = (0x00000038) +NV04_SHARE = (0x0000003E) +NV_DEVICE_ALLOCATION_SZNAME_MAXLEN = 128 +NV_DEVICE_ALLOCATION_FLAGS_NONE = (0x00000000) +NV_DEVICE_ALLOCATION_FLAGS_MAP_PTE_GLOBALLY = (0x00000001) +NV_DEVICE_ALLOCATION_FLAGS_MINIMIZE_PTETABLE_SIZE = (0x00000002) +NV_DEVICE_ALLOCATION_FLAGS_RETRY_PTE_ALLOC_IN_SYS = (0x00000004) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_SIZE = (0x00000008) +NV_DEVICE_ALLOCATION_FLAGS_MAP_PTE = (0x00000010) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_IS_TARGET = (0x00000020) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_SHARED_MANAGEMENT = (0x00000100) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_BIG_PAGE_SIZE_64k = (0x00000200) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_BIG_PAGE_SIZE_128k = (0x00000400) +NV_DEVICE_ALLOCATION_FLAGS_RESTRICT_RESERVED_VALIMITS = (0x00000800) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_IS_MIRRORED = (0x00000040) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_PTABLE_PMA_MANAGED = (0x00001000) +NV_DEVICE_ALLOCATION_FLAGS_HOST_VGPU_DEVICE = (0x00002000) +NV_DEVICE_ALLOCATION_FLAGS_PLUGIN_CONTEXT = (0x00004000) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_REQUIRE_FIXED_OFFSET = (0x00008000) +NV_DEVICE_ALLOCATION_VAMODE_OPTIONAL_MULTIPLE_VASPACES = (0x00000000) +NV_DEVICE_ALLOCATION_VAMODE_SINGLE_VASPACE = (0x00000001) +NV_DEVICE_ALLOCATION_VAMODE_MULTIPLE_VASPACES = (0x00000002) +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_ERROR = 0x00000000 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_WORK_SUBMIT_TOKEN = 0x00000001 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_KEY_ROTATION_STATUS = 0x00000002 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE__SIZE_1 = 3 +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_VALUE = (14, 0) +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS = (15, 15) +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS_TRUE = 0x1 +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS_FALSE = 0x0 +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB = (1, 1) +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB_YES = 0x00000000 +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB_NO = 0x00000001 +NV_SWRUNLIST_QOS_INTR_NONE = 0x00000000 +NV_VP_ALLOCATION_FLAGS_STANDARD_UCODE = (0x00000000) +NV_VP_ALLOCATION_FLAGS_STATIC_UCODE = (0x00000001) +NV_VP_ALLOCATION_FLAGS_DYNAMIC_UCODE = (0x00000002) +NV_VP_ALLOCATION_FLAGS_AVP_CLIENT_VIDEO = (0x00000000) +NV_VP_ALLOCATION_FLAGS_AVP_CLIENT_AUDIO = (0x00000001) +NV04_ADD_VBLANK_CALLBACK = (0x0000003D) +NV_VASPACE_ALLOCATION_FLAGS_NONE = (0x00000000) +NV_VASPACE_ALLOCATION_FLAGS_MINIMIZE_PTETABLE_SIZE = BIT(0) +NV_VASPACE_ALLOCATION_FLAGS_RETRY_PTE_ALLOC_IN_SYS = BIT(1) +NV_VASPACE_ALLOCATION_FLAGS_SHARED_MANAGEMENT = BIT(2) +NV_VASPACE_ALLOCATION_FLAGS_IS_EXTERNALLY_OWNED = BIT(3) +NV_VASPACE_ALLOCATION_FLAGS_ENABLE_NVLINK_ATS = BIT(4) +NV_VASPACE_ALLOCATION_FLAGS_IS_MIRRORED = BIT(5) +NV_VASPACE_ALLOCATION_FLAGS_ENABLE_PAGE_FAULTING = BIT(6) +NV_VASPACE_ALLOCATION_FLAGS_VA_INTERNAL_LIMIT = BIT(7) +NV_VASPACE_ALLOCATION_FLAGS_ALLOW_ZERO_ADDRESS = BIT(8) +NV_VASPACE_ALLOCATION_FLAGS_IS_FLA = BIT(9) +NV_VASPACE_ALLOCATION_FLAGS_SKIP_SCRUB_MEMPOOL = BIT(10) +NV_VASPACE_ALLOCATION_FLAGS_OPTIMIZE_PTETABLE_MEMPOOL_USAGE = BIT(11) +NV_VASPACE_ALLOCATION_FLAGS_REQUIRE_FIXED_OFFSET = BIT(12) +NV_VASPACE_ALLOCATION_FLAGS_PTETABLE_HEAP_MANAGED = BIT(13) +NV_VASPACE_ALLOCATION_INDEX_GPU_NEW = 0x00 +NV_VASPACE_ALLOCATION_INDEX_GPU_HOST = 0x01 +NV_VASPACE_ALLOCATION_INDEX_GPU_GLOBAL = 0x02 +NV_VASPACE_ALLOCATION_INDEX_GPU_DEVICE = 0x03 +NV_VASPACE_ALLOCATION_INDEX_GPU_FLA = 0x04 +NV_VASPACE_ALLOCATION_INDEX_GPU_MAX = 0x05 +NV_VASPACE_BIG_PAGE_SIZE_64K = (64 * 1024) +NV_VASPACE_BIG_PAGE_SIZE_128K = (128 * 1024) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT = (1, 0) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_SYNC = (0x00000000) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_ASYNC = (0x00000001) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_SPECIFIED = (0x00000002) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_ASYNC_PREFER_LOWER = (0x00000003) +NV_CTXSHARE_ALLOCATION_SUBCTXID_SUBCTXID = (30, 0) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION = (31, 31) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION_SUCCESS = (0x00000001) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION_FAIL = (0x00000000) +NV_TIMEOUT_CONTROL_CMD_SET_DEVICE_TIMEOUT = (0x00000002) +NV_TIMEOUT_CONTROL_CMD_RESET_DEVICE_TIMEOUT = (0x00000003) +NVC36F_CTRL_RESERVED = (0x00) +NVC36F_CTRL_GPFIFO = (0x01) +NVC36F_CTRL_EVENT = (0x02) +NVC36F_CTRL_INTERNAL = (0x03) +NVC36F_CTRL_CMD_NULL = (0xc36f0000) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN = (0xc36f0108) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_MESSAGE_ID = (0x8) +NVC36F_CTRL_CMD_GPFIFO_FAULT_METHOD_BUFFER_MAX_RUNQUEUES = 0x2 +NVC36F_CTRL_CMD_GPFIFO_UPDATE_FAULT_METHOD_BUFFER = (0xc36f0109) +NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS_MESSAGE_ID = (0x9) +NVC36F_CTRL_CMD_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX = (0xc36f010a) +NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_MESSAGE_ID = (0xA) +NVC36F_CTRL_CMD_EVENT_SET_NOTIFICATION = (0xc36f0205) +NVC36F_CTRL_CMD_EVENT_SET_TRIGGER = (0xc36f0206) +NVC36F_CTRL_CMD_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN = (0xc36f0301) +NVC36F_CTRL_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_MESSAGE_ID = (0x1) +NVCB33_CTRL_RESERVED = (0x00) +NVCB33_CTRL_CONF_COMPUTE = (0x01) +NV_CONF_COMPUTE_CTRL_CMD_NULL = (0xcb330000) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES = (0xcb330101) +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SEV = 1 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_INTEL_TDX = 2 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SEV_SNP = 3 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SNP_VTOM = 4 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_APM = 1 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_HCC = 2 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_UNAVAILABLE = 0 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_SIM = 1 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_PROD = 2 +NV_CONF_COMPUTE_SYSTEM_FEATURE_DISABLED = 0 +NV_CONF_COMPUTE_SYSTEM_FEATURE_APM_ENABLED = 1 +NV_CONF_COMPUTE_SYSTEM_FEATURE_HCC_ENABLED = 2 +NV_CONF_COMPUTE_SYSTEM_DEVTOOLS_MODE_DISABLED = 0 +NV_CONF_COMPUTE_SYSTEM_DEVTOOLS_MODE_ENABLED = 1 +NV_CONF_COMPUTE_SYSTEM_MULTI_GPU_MODE_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_MULTI_GPU_MODE_PROTECTED_PCIE = 1 +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE = (0xcb330104) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE = (0xcb330105) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE = (0xcb330106) +NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE = (0xcb330107) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS = (0xcb330108) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0x8) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE = (0xcb330109) +NV_CONF_COMPUTE_CERT_CHAIN_MAX_SIZE = 0x1000 +NV_CONF_COMPUTE_ATTESTATION_CERT_CHAIN_MAX_SIZE = 0x1400 +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS_MESSAGE_ID = (0x9) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT = (0xcb33010a) +NV_CONF_COMPUTE_GPU_ATTESTATION_REPORT_MAX_SIZE = 0x2000 +NV_CONF_COMPUTE_GPU_CEC_ATTESTATION_REPORT_MAX_SIZE = 0x1000 +NV_CONF_COMPUTE_NONCE_SIZE = 0x20 +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS_MESSAGE_ID = (0xA) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS = (0xcb33010b) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0xB) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE = (0xcb33010c) +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_DISABLED = 0 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_KERN_ENABLED = 1 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_USER_ENABLED = 2 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_BOTH_ENABLED = 3 +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS_MESSAGE_ID = (0xC) +NVA06C_CTRL_RESERVED = (0x00) +NVA06C_CTRL_GPFIFO = (0x01) +NVA06C_CTRL_INTERNAL = (0x02) +NVA06C_CTRL_CMD_NULL = (0xa06c0000) +NVA06C_CTRL_CMD_GPFIFO_SCHEDULE = (0xa06c0101) +NVA06C_CTRL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NVA06C_CTRL_CMD_BIND = (0xa06c0102) +NVA06C_CTRL_BIND_PARAMS_MESSAGE_ID = (0x2) +NVA06C_CTRL_CMD_SET_TIMESLICE = (0xa06c0103) +NVA06C_CTRL_SET_TIMESLICE_PARAMS_MESSAGE_ID = (0x3) +NVA06C_CTRL_CMD_GET_TIMESLICE = (0xa06c0104) +NVA06C_CTRL_GET_TIMESLICE_PARAMS_MESSAGE_ID = (0x4) +NVA06C_CTRL_CMD_PREEMPT = (0xa06c0105) +NVA06C_CTRL_PREEMPT_PARAMS_MESSAGE_ID = (0x5) +NVA06C_CTRL_CMD_PREEMPT_MAX_MANUAL_TIMEOUT_US = (1000000) +NVA06C_CTRL_CMD_GET_INFO = (0xa06c0106) +NVA06C_CTRL_GET_INFO_PARAMS_MESSAGE_ID = (0x6) +NVA06C_CTRL_CMD_SET_INTERLEAVE_LEVEL = (0xa06c0107) +NVA06C_CTRL_INTERLEAVE_LEVEL_LOW = (0x00000000) +NVA06C_CTRL_INTERLEAVE_LEVEL_MEDIUM = (0x00000001) +NVA06C_CTRL_INTERLEAVE_LEVEL_HIGH = (0x00000002) +NVA06C_CTRL_SET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x7) +NVA06C_CTRL_CMD_GET_INTERLEAVE_LEVEL = (0xa06c0108) +NVA06C_CTRL_GET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x8) +NVA06C_CTRL_CMD_PROGRAM_VIDMEM_PROMOTE = (0xa06c0109) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS_MESSAGE_ID = (0x9) +NVA06C_CTRL_CMD_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS = (0xa06c010a) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_MAX_RUNQUEUES = (NVC36F_CTRL_CMD_GPFIFO_FAULT_METHOD_BUFFER_MAX_RUNQUEUES) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_MESSAGE_ID = (0xa) +NVA06C_CTRL_CMD_MAKE_REALTIME = (0xa06c0110) +NVA06C_CTRL_MAKE_REALTIME_PARAMS_MESSAGE_ID = (0x10) +NVA06C_CTRL_CMD_INTERNAL_GPFIFO_SCHEDULE = (0xa06c0201) +NVA06C_CTRL_INTERNAL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NVA06C_CTRL_CMD_INTERNAL_SET_TIMESLICE = (0xa06c0202) +NVA06C_CTRL_INTERNAL_SET_TIMESLICE_PARAMS_MESSAGE_ID = (0x2) +GMMU_FMT_MAX_LEVELS = 6 +NV90F1_CTRL_RESERVED = (0x00) +NV90F1_CTRL_VASPACE = (0x01) +NV90F1_CTRL_CMD_NULL = (0x90f10000) +NV90F1_CTRL_CMD_VASPACE_GET_GMMU_FORMAT = (0x90f10101) +NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS_MESSAGE_ID = (0x1) +NV90F1_CTRL_CMD_VASPACE_GET_PAGE_LEVEL_INFO = (0x90f10102) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS_MESSAGE_ID = (0x2) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_FLAG_NONE = 0x0 +NV90F1_CTRL_CMD_VASPACE_RESERVE_ENTRIES = (0x90f10103) +NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS_MESSAGE_ID = (0x3) +NV90F1_CTRL_CMD_VASPACE_RELEASE_ENTRIES = (0x90f10104) +NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS_MESSAGE_ID = (0x4) +NV90F1_CTRL_CMD_VASPACE_GET_PAGE_LEVEL_INFO_VERIF = (0x90f10105) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_VERIF_PARAMS_MESSAGE_ID = (0x5) +NV90F1_CTRL_CMD_VASPACE_COPY_SERVER_RESERVED_PDES = (0x90f10106) +NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_MESSAGE_ID = (0x6) +NV90F1_CTRL_CMD_VASPACE_GET_HOST_RM_MANAGED_SIZE = (0x90f10107) +NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS_MESSAGE_ID = (0x7) +NV90F1_CTRL_CMD_VASPACE_GET_VAS_HEAP_INFO = (0x90f10108) +NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS_MESSAGE_ID = (0x8) +NVA06F_CTRL_CMD_GPFIFO_SCHEDULE = (0xa06f0103) +NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x3) +NVA06F_CTRL_CMD_BIND = (0xa06f0104) +NVA06F_CTRL_BIND_PARAMS_MESSAGE_ID = (0x4) +NVA06F_CTRL_CMD_SET_ERROR_NOTIFIER = (0xa06f0108) +NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS_MESSAGE_ID = (0x8) +NVA06F_CTRL_CMD_SET_INTERLEAVE_LEVEL = (0xa06f0109) +NVA06F_CTRL_SET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x9) +NVA06F_CTRL_CMD_GET_INTERLEAVE_LEVEL = (0xa06f0110) +NVA06F_CTRL_GET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x10) +NVA06F_CTRL_CMD_RESTART_RUNLIST = (0xa06f0111) +NVA06F_CTRL_RESTART_RUNLIST_PARAMS_MESSAGE_ID = (0x11) +NVA06F_CTRL_CMD_STOP_CHANNEL = (0xa06f0112) +NVA06F_CTRL_STOP_CHANNEL_PARAMS_MESSAGE_ID = (0x12) +NVA06F_CTRL_CMD_GET_CONTEXT_ID = (0xa06f0113) +NVA06F_CTRL_GET_CONTEXT_ID_PARAMS_MESSAGE_ID = (0x13) +NV0000_CTRL_RESERVED = (0x00) +NV0000_CTRL_SYSTEM = (0x01) +NV0000_CTRL_GPU = (0x02) +NV0000_CTRL_GSYNC = (0x03) +NV0000_CTRL_DIAG = (0x04) +NV0000_CTRL_EVENT = (0x05) +NV0000_CTRL_NVD = (0x06) +NV0000_CTRL_SWINSTR = (0x07) +NV0000_CTRL_PROC = (0x09) +NV0000_CTRL_SYNC_GPU_BOOST = (0x0A) +NV0000_CTRL_GPUACCT = (0x0B) +NV0000_CTRL_VGPU = (0x0C) +NV0000_CTRL_CLIENT = (0x0D) +NV0000_CTRL_OS_WINDOWS = (0x3F) +NV0000_CTRL_OS_MACOS = (0x3E) +NV0000_CTRL_OS_UNIX = (0x3D) +NV0000_CTRL_CMD_NULL = (0x0) +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE = (0xd01) +NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_INVALID = 0x00000000 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_SYSMEM = 0x00000001 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_VIDMEM = 0x00000002 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_REGMEM = 0x00000003 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_FABRIC = 0x00000004 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO = (0xd02) +NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_INVALID = 0x00000000 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_PARENT = 0x00000001 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_CLASSID = 0x00000002 +NV0000_CTRL_CMD_CLIENT_GET_ACCESS_RIGHTS = (0xd03) +NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_CLIENT_SET_INHERITED_SHARE_POLICY = (0xd04) +NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE = (0xd05) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_CLIENT_SHARE_OBJECT = (0xd06) +NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_CLIENT_OBJECTS_ARE_DUPLICATES = (0xd07) +NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL = (0xd08) +NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_DIAG_GET_LOCK_METER_STATE = (0x480) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS_MESSAGE_ID = (0x80) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_DISABLED = (0x00000000) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_ENABLED = (0x00000001) +NV0000_CTRL_DIAG_LOCK_METER_MAX_TABLE_ENTRIES = (0x20000) +NV0000_CTRL_CMD_DIAG_SET_LOCK_METER_STATE = (0x481) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS_MESSAGE_ID = (0x81) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_DISABLE = (0x00000000) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_ENABLE = (0x00000001) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_RESET = (0x00000002) +NV0000_CTRL_DIAG_LOCK_METER_ENTRY_FILENAME_LENGTH = (0xc) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA = (0x00000001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA_FORCED = (0x00000002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA_COND = (0x00000003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_SEMA = (0x00000004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_API = (0x00000010) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_API = (0x00000011) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_GPUS = (0x00000020) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_GPUS = (0x00000021) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DATA = (0x00000100) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RMCTRL = (0x00001000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_CFG_GET = (0x00002000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_CFG_SET = (0x00002001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_CFG_GETEX = (0x00002002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_CFG_SETEX = (0x00002003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_VIDHEAP = (0x00003000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_MAPMEM = (0x00003001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_UNMAPMEM = (0x00003002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_MAPMEM_DMA = (0x00003003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_UNMAPMEM_DMA = (0x00003004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC = (0x00004000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC_MEM = (0x00004001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DUP_OBJECT = (0x00004010) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CLIENT = (0x00005000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DEVICE = (0x00005001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_SUBDEVICE = (0x00005002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_SUBDEVICE_DIAG = (0x00005003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DISP = (0x00005004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DISP_CMN = (0x00005005) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL = (0x00005006) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL_MPEG = (0x00005007) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL_DISP = (0x00005008) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_MEMORY = (0x00005009) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_FBMEM = (0x0000500A) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_OBJECT = (0x0000500B) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_EVENT = (0x0000500C) +NV0000_CTRL_DIAG_LOCK_METER_TAG_IDLE_CHANNELS = (0x00006000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_BIND_CTXDMA = (0x00007000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC_CTXDMA = (0x00007001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ISR = (0x0000F000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DPC = (0x0000F00F) +NV0000_CTRL_CMD_DIAG_GET_LOCK_METER_ENTRIES = (0x485) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_MAX = (0x40) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS_MESSAGE_ID = (0x85) +NV0000_CTRL_CMD_DIAG_PROFILE_RPC = (0x488) +NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS_MESSAGE_ID = (0x88) +NV0000_CTRL_PROFILE_RPC_CMD_DISABLE = (0x00000000) +NV0000_CTRL_PROFILE_RPC_CMD_ENABLE = (0x00000001) +NV0000_CTRL_PROFILE_RPC_CMD_RESET = (0x00000002) +NV0000_CTRL_CMD_DIAG_DUMP_RPC = (0x489) +NV0000_CTRL_DIAG_RPC_MAX_ENTRIES = (100) +NV0000_CTRL_DIAG_DUMP_RPC_PARAMS_MESSAGE_ID = (0x89) +NV0000_CTRL_CMD_EVENT_SET_NOTIFICATION = (0x501) +NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_DISABLE = (0x00000000) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_SINGLE = (0x00000001) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_REPEAT = (0x00000002) +NV0000_CTRL_CMD_GET_SYSTEM_EVENT_STATUS = (0x502) +NV0000_CTRL_GET_SYSTEM_EVENT_STATUS_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_GPU_GET_ATTACHED_IDS = (0x201) +NV0000_CTRL_GPU_MAX_ATTACHED_GPUS = 32 +NV0000_CTRL_GPU_INVALID_ID = (0xffffffff) +NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_GPU_GET_ID_INFO = (0x202) +NV0000_CTRL_GPU_MAX_SZNAME = 128 +NV0000_CTRL_NO_NUMA_NODE = (-1) +NV0000_CTRL_GPU_GET_ID_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_SLI_STATUS_OK = (0x00000000) +NV0000_CTRL_SLI_STATUS_OS_NOT_SUPPORTED = (0x00000002) +NV0000_CTRL_SLI_STATUS_GPU_NOT_SUPPORTED = (0x00000040) +NV0000_CTRL_SLI_STATUS_INVALID_GPU_COUNT = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_ID_INFO_V2 = (0x205) +NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_GPU_ID_INFO_IN_USE = (0, 0) +NV0000_CTRL_GPU_ID_INFO_IN_USE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_IN_USE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE = (1, 1) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_MOBILE = (2, 2) +NV0000_CTRL_GPU_ID_INFO_MOBILE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_MOBILE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER = (3, 3) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_SOC = (5, 5) +NV0000_CTRL_GPU_ID_INFO_SOC_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_SOC_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED = (6, 6) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED_TRUE = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_INIT_STATUS = (0x203) +NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_GPU_GET_DEVICE_IDS = (0x204) +NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_GPU_GET_PROBED_IDS = (0x214) +NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS_MESSAGE_ID = (0x14) +NV0000_CTRL_CMD_GPU_GET_PCI_INFO = (0x21b) +NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS_MESSAGE_ID = (0x1B) +NV0000_CTRL_CMD_GPU_ATTACH_IDS = (0x215) +NV0000_CTRL_GPU_ATTACH_ALL_PROBED_IDS = (0x0000ffff) +NV0000_CTRL_GPU_ATTACH_IDS_PARAMS_MESSAGE_ID = (0x15) +NV0000_CTRL_CMD_GPU_DETACH_IDS = (0x216) +NV0000_CTRL_GPU_DETACH_ALL_ATTACHED_IDS = (0x0000ffff) +NV0000_CTRL_GPU_DETACH_IDS_PARAMS_MESSAGE_ID = (0x16) +NV0000_CTRL_CMD_GPU_GET_VIDEO_LINKS = (0x219) +NV0000_CTRL_GPU_MAX_VIDEO_LINKS = 8 +NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS_MESSAGE_ID = (0x19) +NV0000_CTRL_CMD_GPU_GET_SVM_SIZE = (0x240) +NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS_MESSAGE_ID = (0x40) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO = (0x274) +NV0000_GPU_MAX_GID_LENGTH = (0x00000100) +NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS_MESSAGE_ID = (0x74) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT = (1, 0) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT_ASCII = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT_BINARY = (0x00000002) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE = (2, 2) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE_SHA1 = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE_SHA256 = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID = (0x275) +NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS_MESSAGE_ID = (0x75) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT = (1, 0) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT_ASCII = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT_BINARY = (0x00000002) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE = (2, 2) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE_SHA1 = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE_SHA256 = (0x00000001) +NV0000_CTRL_CMD_GPU_MODIFY_DRAIN_STATE = (0x278) +NV0000_CTRL_GPU_DRAIN_STATE_DISABLED = (0x00000000) +NV0000_CTRL_GPU_DRAIN_STATE_ENABLED = (0x00000001) +NV0000_CTRL_GPU_DRAIN_STATE_FLAG_REMOVE_DEVICE = (0x00000001) +NV0000_CTRL_GPU_DRAIN_STATE_FLAG_LINK_DISABLE = (0x00000002) +NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS_MESSAGE_ID = (0x78) +NV0000_CTRL_CMD_GPU_QUERY_DRAIN_STATE = (0x279) +NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS_MESSAGE_ID = (0x79) +NV0000_CTRL_CMD_GPU_DISCOVER = (0x27a) +NV0000_CTRL_CMD_GPU_GET_MEMOP_ENABLE = (0x27b) +NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS_MESSAGE_ID = (0x7B) +NV0000_CTRL_GPU_FLAGS_MEMOP_ENABLE = (0x00000001) +NV0000_CTRL_CMD_GPU_DISABLE_NVLINK_INIT = (0x281) +NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS_MESSAGE_ID = (0x81) +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PARAM_DATA = 0x00000175 +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PROPERTIES_IN = 6 +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PROPERTIES_OUT = 5 +NV0000_CTRL_CMD_GPU_LEGACY_CONFIG = (0x282) +NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_MESSAGE_ID = (0x82) +NV0000_CTRL_GPU_LEGACY_CONFIG_OP_TYPE_SET = (0x00000001) +NV0000_CTRL_GPU_LEGACY_CONFIG_OP_TYPE_GET_EX = (0x00000002) +NV0000_CTRL_GPU_LEGACY_CONFIG_OP_TYPE_SET_EX = (0x00000003) +NV0000_CTRL_GPU_LEGACY_CONFIG_OP_TYPE_RESERVED = (0x00000004) +NV0000_CTRL_CMD_IDLE_CHANNELS = (0x283) +NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS_MESSAGE_ID = (0x83) +NV0000_CTRL_GPU_IMAGE_TYPE_GSP = (0x00000001) +NV0000_CTRL_GPU_IMAGE_TYPE_GSP_LOG = (0x00000002) +NV0000_CTRL_GPU_IMAGE_TYPE_BINDATA_IMAGE = (0x00000003) +NV0000_CTRL_CMD_PUSH_UCODE_IMAGE = (0x285) +NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS_MESSAGE_ID = (0x85) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SETTING_LEGACY = (2, 0) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SETTING_LINK_COUNT = (7, 3) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_FULL = (0x00) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_OFF = (0x01) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_MIN = (0x02) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_HALF = (0x03) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_3QUARTER = (0x04) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_LINK_COUNT = (0x05) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_UNSET = (0x00) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_PER_NODE = (0x01) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_PER_GPU = (0x02) +NV0000_CTRL_CMD_GPU_SET_NVLINK_BW_MODE = (0x286) +NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS_MESSAGE_ID = (0x86) +NV0000_CTRL_CMD_GPU_GET_NVLINK_BW_MODE = (0x287) +NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS_MESSAGE_ID = (0x87) +NV0000_CTRL_CMD_GPU_GET_ACTIVE_DEVICE_IDS = (0x288) +NV0000_CTRL_GPU_MAX_ACTIVE_DEVICES = 256 +NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS_MESSAGE_ID = (0x88) +NV0000_CTRL_CMD_GPU_ASYNC_ATTACH_ID = (0x289) +NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS_MESSAGE_ID = (0x89) +NV0000_CTRL_CMD_GPU_WAIT_ATTACH_ID = (0x290) +NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS_MESSAGE_ID = (0x90) +NV0000_CTRL_CMD_GPUACCT_SET_ACCOUNTING_STATE = (0xb01) +NV0000_CTRL_GPU_ACCOUNTING_STATE_ENABLED = (0x00000000) +NV0000_CTRL_GPU_ACCOUNTING_STATE_DISABLED = (0x00000001) +NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_GPUACCT_GET_ACCOUNTING_STATE = (0xb02) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_GPUACCT_GET_PROC_ACCOUNTING_INFO = (0xb03) +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_GPUACCT_GET_ACCOUNTING_PIDS = (0xb04) +NV0000_GPUACCT_PID_MAX_COUNT = 4000 +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_GPUACCT_CLEAR_ACCOUNTING_DATA = (0xb05) +NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_GSYNC_GET_ATTACHED_IDS = (0x301) +NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_GSYNC_INVALID_ID = (0xffffffff) +NV0000_CTRL_CMD_GSYNC_GET_ID_INFO = (0x302) +NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_NVD_DUMP_COMPONENT_SYS = (0x400) +NV0000_CTRL_NVD_DUMP_COMPONENT_NVLOG = (0x800) +NV0000_CTRL_NVD_DUMP_COMPONENT_RESERVED = (0xB00) +NV0000_CTRL_CMD_NVD_GET_DUMP_SIZE = (0x601) +NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_NVD_MAX_DUMP_SIZE = (1000000) +NV0000_CTRL_CMD_NVD_GET_DUMP = (0x602) +NV0000_CTRL_NVD_GET_DUMP_PARAMS_MESSAGE_ID = (0x2) +NV0000_NVD_CPU_TIME_CLK_ID_DEFAULT = (0x00000000) +NV0000_NVD_CPU_TIME_CLK_ID_OSTIME = (0x00000001) +NV0000_NVD_CPU_TIME_CLK_ID_TSC = (0x00000002) +NV0000_NVD_CPU_TIME_CLK_ID_PLATFORM_API = (0x00000003) +NV0000_CTRL_CMD_NVD_GET_TIMESTAMP = (0x603) +NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_NVD_GET_NVLOG_INFO = (0x604) +NV0000_CTRL_NVD_MAX_RUNTIME_SIZES = (16) +NV0000_CTRL_NVD_SIGNATURE_SIZE = (4) +NV0000_CTRL_NVD_MAX_BUFFERS = (3840) +NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_NVD_RUNTIME_SIZE_UNUSED = (0) +NV0000_CTRL_NVD_RUNTIME_SIZE_INT = (1) +NV0000_CTRL_NVD_RUNTIME_SIZE_LONG_LONG = (2) +NV0000_CTRL_NVD_RUNTIME_SIZE_STRING = (3) +NV0000_CTRL_NVD_RUNTIME_SIZE_PTR = (4) +NV0000_CTRL_NVD_RUNTIME_SIZE_CHAR = (5) +NV0000_CTRL_NVD_RUNTIME_SIZE_FLOAT = (6) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_INFO = (7, 0) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE = (23, 8) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE_DISABLE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE_DEFAULT = (0x00000004) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_RUNTIME_LEVEL = (28, 25) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP = (30, 29) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_NONE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_32 = (0x00000001) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_64 = (0x00000002) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_32_DIFF = (0x00000003) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED = (31, 31) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED_YES = (0x00000001) +NV0000_CTRL_CMD_NVD_GET_NVLOG_BUFFER_INFO = (0x605) +NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE = (0, 0) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED = (0, 0) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE = (1, 1) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE_RING = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE_NOWRAP = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE = (2, 2) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED = (3, 3) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING = (5, 4) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_NONE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_STATE = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_FULL = (0x00000002) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA = (6, 6) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA_YES = (0x00000001) +NV0000_CTRL_CMD_NVD_GET_NVLOG = (0x606) +NV0000_CTRL_NVLOG_MAX_BLOCK_SIZE = (4000) +NV0000_CTRL_NVD_GET_NVLOG_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT = (0x607) +NV0000_CTRL_CMD_NVD_RCERR_RPT_MAX_ENTRIES = 200 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_TEST = 0 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_GRSTATUS = 1 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_GPCSTATUS = 2 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_MMU_FAULT_STATUS = 3 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_EMPTY = 0x00000000 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_OVERFLOWED = 0x00000001 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_MAX_PSEDO_REG = 0x0000000f +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_POS_FIRST = 0x00000001 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_POS_LAST = 0x00000002 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_RANGE_VALID = 0x00000004 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_DATA_VALID = 0x00000008 +TPC_REG_ATTR = lambda gpcId,tpcId: ((gpcId << 8) | (tpcId)) # type: ignore +ROP_REG_ATTR = lambda gpcId,ropId: ((gpcId << 8) | (ropId)) # type: ignore +SM_REG_ATTR = lambda gpcId,tpcId,smId: ((((gpcId) << 16) | ((tpcId) << 8)) | (smId)) # type: ignore +NV0000_CTRL_CMD_NVD_RCERR_RPT_ANY_PROCESS_ID = 0x00000000 +NV0000_CTRL_CMD_NVD_RCERR_RPT_ANY_OWNER_ID = 0xFFFFFFFF +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_NVD_GET_DPC_ISR_TS = (0x608) +NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_SET_SUB_PROCESS_ID = (0x901) +NV0000_CTRL_CMD_DISABLE_SUB_PROCESS_USERD_ISOLATION = (0x902) +NV0000_SYNC_GPU_BOOST_MAX_GROUPS = (0x10) +NV0000_SYNC_GPU_BOOST_INVALID_GROUP_ID = 0xFFFFFFFF +NV0000_CTRL_CMD_SYNC_GPU_BOOST_INFO = (0xa01) +NV0000_SYNC_GPU_BOOST_INFO_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_CREATE = (0xa02) +NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_DESTROY = (0xa03) +NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_INFO = (0xa04) +NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_SYSTEM_GET_FEATURES = (0x1f0) +NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS_MESSAGE_ID = (0xF0) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI = (0, 0) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_FEATURES_IS_EFI_INIT = (2, 2) +NV0000_CTRL_SYSTEM_GET_FEATURES_IS_EFI_INIT_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_IS_EFI_INIT_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING = (3, 3) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED = (4, 4) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED_TRUE = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION = (0x101) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_SYSTEM_GET_CPU_INFO = (0x102) +NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_SYSTEM_CPU_FAMILY = (3, 0) +NV0000_CTRL_SYSTEM_CPU_EXTENDED_FAMILY = (11, 4) +NV0000_CTRL_SYSTEM_CPU_MODEL = (3, 0) +NV0000_CTRL_SYSTEM_CPU_EXTENDED_MODEL = (7, 4) +NV0000_CTRL_SYSTEM_CPU_ID_AMD_FAMILY = 0xF +NV0000_CTRL_SYSTEM_CPU_ID_AMD_EXTENDED_FAMILY = 0xA +NV0000_CTRL_SYSTEM_CPU_ID_AMD_MODEL = 0x0 +NV0000_CTRL_SYSTEM_CPU_ID_AMD_EXTENDED_MODEL = 0x4 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_FAMILY = 0x6 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_EXTENDED_FAMILY = 0x0 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_CORE_S_MODEL = 0x7 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_CORE_P_MODEL = 0xA +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_EXTENDED_MODEL = 0x9 +NV0000_CTRL_SYSTEM_CPU_TYPE_UNKNOWN = (0x00000000) +NV0000_CTRL_SYSTEM_CPU_TYPE_P5 = (0x00000001) +NV0000_CTRL_SYSTEM_CPU_TYPE_P55 = (0x00000002) +NV0000_CTRL_SYSTEM_CPU_TYPE_P6 = (0x00000003) +NV0000_CTRL_SYSTEM_CPU_TYPE_P2 = (0x00000004) +NV0000_CTRL_SYSTEM_CPU_TYPE_P2XC = (0x00000005) +NV0000_CTRL_SYSTEM_CPU_TYPE_CELA = (0x00000006) +NV0000_CTRL_SYSTEM_CPU_TYPE_P3 = (0x00000007) +NV0000_CTRL_SYSTEM_CPU_TYPE_P3_INTL2 = (0x00000008) +NV0000_CTRL_SYSTEM_CPU_TYPE_P4 = (0x00000009) +NV0000_CTRL_SYSTEM_CPU_TYPE_CORE2 = (0x00000010) +NV0000_CTRL_SYSTEM_CPU_TYPE_CELN_M16H = (0x00000011) +NV0000_CTRL_SYSTEM_CPU_TYPE_CORE2_EXTRM = (0x00000012) +NV0000_CTRL_SYSTEM_CPU_TYPE_ATOM = (0x00000013) +NV0000_CTRL_SYSTEM_CPU_TYPE_XEON_SPR = (0x00000014) +NV0000_CTRL_SYSTEM_CPU_TYPE_K5 = (0x00000030) +NV0000_CTRL_SYSTEM_CPU_TYPE_K6 = (0x00000031) +NV0000_CTRL_SYSTEM_CPU_TYPE_K62 = (0x00000032) +NV0000_CTRL_SYSTEM_CPU_TYPE_K63 = (0x00000033) +NV0000_CTRL_SYSTEM_CPU_TYPE_K7 = (0x00000034) +NV0000_CTRL_SYSTEM_CPU_TYPE_K8 = (0x00000035) +NV0000_CTRL_SYSTEM_CPU_TYPE_K10 = (0x00000036) +NV0000_CTRL_SYSTEM_CPU_TYPE_K11 = (0x00000037) +NV0000_CTRL_SYSTEM_CPU_TYPE_RYZEN = (0x00000038) +NV0000_CTRL_SYSTEM_CPU_TYPE_C6 = (0x00000060) +NV0000_CTRL_SYSTEM_CPU_TYPE_C62 = (0x00000061) +NV0000_CTRL_SYSTEM_CPU_TYPE_GX = (0x00000070) +NV0000_CTRL_SYSTEM_CPU_TYPE_M1 = (0x00000071) +NV0000_CTRL_SYSTEM_CPU_TYPE_M2 = (0x00000072) +NV0000_CTRL_SYSTEM_CPU_TYPE_MGX = (0x00000073) +NV0000_CTRL_SYSTEM_CPU_TYPE_TM_CRUSOE = (0x00000080) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC603 = (0x00000090) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC604 = (0x00000091) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC750 = (0x00000092) +NV0000_CTRL_SYSTEM_CPU_TYPE_POWERN = (0x00000093) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_UNKNOWN = (0xA0000000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_A9 = (0xA0000009) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_A15 = (0xA000000F) +NV0000_CTRL_SYSTEM_CPU_TYPE_NV_DENVER_1_0 = (0xA0001000) +NV0000_CTRL_SYSTEM_CPU_TYPE_NV_DENVER_2_0 = (0xA0002000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARMV8A_GENERIC = (0xA00FF000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARMV9A_GENERIC = (0xA00FF001) +NV0000_CTRL_SYSTEM_CPU_CAP_MMX = (0x00000001) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE = (0x00000002) +NV0000_CTRL_SYSTEM_CPU_CAP_3DNOW = (0x00000004) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE2 = (0x00000008) +NV0000_CTRL_SYSTEM_CPU_CAP_SFENCE = (0x00000010) +NV0000_CTRL_SYSTEM_CPU_CAP_WRITE_COMBINING = (0x00000020) +NV0000_CTRL_SYSTEM_CPU_CAP_ALTIVEC = (0x00000040) +NV0000_CTRL_SYSTEM_CPU_CAP_PUT_NEEDS_IO = (0x00000080) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WC_WORKAROUND = (0x00000100) +NV0000_CTRL_SYSTEM_CPU_CAP_3DNOW_EXT = (0x00000200) +NV0000_CTRL_SYSTEM_CPU_CAP_MMX_EXT = (0x00000400) +NV0000_CTRL_SYSTEM_CPU_CAP_CMOV = (0x00000800) +NV0000_CTRL_SYSTEM_CPU_CAP_CLFLUSH = (0x00001000) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WAR_190854 = (0x00002000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE3 = (0x00004000) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WAR_124888 = (0x00008000) +NV0000_CTRL_SYSTEM_CPU_CAP_HT_CAPABLE = (0x00010000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE41 = (0x00020000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE42 = (0x00040000) +NV0000_CTRL_SYSTEM_CPU_CAP_AVX = (0x00080000) +NV0000_CTRL_SYSTEM_CPU_CAP_ERMS = (0x00100000) +NV0000_CTRL_CMD_SYSTEM_GET_CHIPSET_INFO = (0x104) +NV0000_SYSTEM_MAX_CHIPSET_STRING_LENGTH = (0x0000020) +NV0000_SYSTEM_CHIPSET_INVALID_ID = (0xffff) +NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE = (0, 0) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE_NO = (0x00000000) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE_YES = (0x00000001) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT = (0x107) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_SYSTEM_GET_LOCK_TIMES = (0x109) +NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS_MESSAGE_ID = (0x9) +NV0000_CTRL_CMD_SYSTEM_GET_CLASSLIST = (0x108) +NV0000_CTRL_SYSTEM_MAX_CLASSLIST_SIZE = (32) +NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_SYSTEM_NOTIFY_EVENT = (0x110) +NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS_MESSAGE_ID = (0x10) +NV0000_CTRL_SYSTEM_EVENT_TYPE_LID_STATE = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_TYPE_POWER_SOURCE = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_TYPE_DOCK_STATE = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_TYPE_TRUST_LID = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_TYPE_TRUST_DOCK = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_LID_OPEN = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_LID_CLOSED = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_POWER_BATTERY = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_POWER_AC = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_UNDOCKED = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_DOCKED = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_DSM = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_DCS = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_NVIF = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_ACPI = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_POLL = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_COUNT = (0x5) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_DSM = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_DCS = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_NVIF = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_ACPI = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_POLL = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_COUNT = (0x5) +NV0000_CTRL_SYSTEM_EVENT_DATA_FORCED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_FORCED_TRUE = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE = (0x111) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS_MESSAGE_ID = (0x11) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_DESKTOP = (0x000000) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_MOBILE_GENERIC = (0x000001) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_MOBILE_TOSHIBA = (0x000002) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_SOC = (0x000003) +NV0000_CTRL_CMD_SYSTEM_DEBUG_RMMSG_CTRL = (0x121) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_SIZE = 512 +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_CMD_GET = (0x00000000) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_CMD_SET = (0x00000001) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS_MESSAGE_ID = (0x21) +NV0000_CTRL_SYSTEM_HWBC_INVALID_ID = (0xFFFFFFFF) +NV0000_CTRL_CMD_SYSTEM_GET_HWBC_INFO = (0x124) +NV0000_CTRL_SYSTEM_MAX_HWBCS = (0x00000080) +NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS_MESSAGE_ID = (0x24) +NV0000_CTRL_CMD_SYSTEM_GPS_CONTROL = (0x122) +NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS_MESSAGE_ID = (0x22) +NV0000_CTRL_CMD_SYSTEM_GPS_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_INIT = (0x0000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_EXEC = (0x0001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_EXEC = (0x0002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_ACTIONS = (0x0003) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_ACTIONS = (0x0004) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_LOGIC = (0x0005) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_LOGIC = (0x0006) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_PREFERENCE = (0x0007) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_PREFERENCE = (0x0008) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_GPU2CPU_LIMIT = (0x0009) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_GPU2CPU_LIMIT = (0x000A) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_PMU_GPS_STATE = (0x000B) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_PMU_GPS_STATE = (0x000C) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_MAX_POWER = (0x0100) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_MAX_POWER = (0x0101) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_COOLING_BUDGET = (0x0102) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_COOLING_BUDGET = (0x0103) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_INTEGRAL_PERIOD = (0x0104) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_INTEGRAL_PERIOD = (0x0105) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_RULESET = (0x0106) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_RULESET = (0x0107) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_RULE_COUNT = (0x0108) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_APP_BOOST = (0x0109) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_APP_BOOST = (0x010A) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_PWR_SUPPLY_MODE = (0x010B) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_PWR_SUPPLY_MODE = (0x010C) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_VCT_SUPPORT_INFO = (0x010D) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_SUPPORTED_FUNCTIONS = (0x010E) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER = (0x0200) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_DELTA = (0x0201) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_FUTURE = (0x0202) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_LTMAVG = (0x0203) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_INTEGRAL = (0x0204) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_BURDEN = (0x0205) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_INTERMEDIATE = (0x0206) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_SENSOR_PARAMETERS = (0x0210) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP = (0x0220) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP_DELTA = (0x0221) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP_FUTURE = (0x0222) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE = (0x0240) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_CAP = (0x0241) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_MIN = (0x0242) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_MAX = (0x0243) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_ACTION = (0x0244) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_SLFM_PRESENT = (0x0245) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_SET_POWER_SIM_STATE = (0x0250) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_SIM_STATE = (0x0251) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_SET_POWER_SIM_DATA = (0x0252) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_SIM_DATA = (0x0253) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_INIT_USING_SBIOS_AND_ACK = (0x0320) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_PING_SBIOS_FOR_EVENT = (0x0321) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_SYSTEM = (0x0000) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_CPU = lambda i: (0x0100+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_GPU = lambda i: (0x0200+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INVALID = (0x80000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INIT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INIT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_EXEC_STOP = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_EXEC_START = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_ACTIONS_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_ACTIONS_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_FUZZY = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_DETERMINISTIC = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_CPU = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_GPU = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_BOTH = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_NO_MAP_OVERRIDE = (0xFFFFFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PMU_GPS_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PMU_GPS_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_REAL = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_FAKE_AC = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_FAKE_BATT = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SUPPORT = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_VENTURASTATUS = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_GETPSS = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SETPPC = (0x00000008) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_GETPPC = (0x00000010) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_VENTURACB = (0x00000020) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SYSPARAMS = (0x00000040) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DEC_TO_P0 = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DEC_BY_1 = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DO_NOTHING = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_SET_CURRENT = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_BY_1 = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_BY_2 = (0x00000005) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_TO_LFM = (0x00000006) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_TO_SLFM = (0x00000007) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_SLFM_PRESENT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_SLFM_PRESENT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_POWER_SIM_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_POWER_SIM_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_BATCH_CONTROL = (0x123) +NV0000_CTRL_CMD_SYSTEM_GPS_BATCH_COMMAND_MAX = (16) +NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_MESSAGE_ID = (0x23) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS = (0x127) +NV0000_CTRL_SYSTEM_MAX_ATTACHED_GPUS = 32 +NV0000_CTRL_SYSTEM_MAX_ATTACHED_GPUS_SQUARED = 1024 +NV0000_CTRL_SYSTEM_MAX_P2P_GROUP_GPUS = 8 +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INVALID_PEER = 0xffffffff +NV0000_CTRL_P2P_CAPS_INDEX_READ = 0 +NV0000_CTRL_P2P_CAPS_INDEX_WRITE = 1 +NV0000_CTRL_P2P_CAPS_INDEX_NVLINK = 2 +NV0000_CTRL_P2P_CAPS_INDEX_ATOMICS = 3 +NV0000_CTRL_P2P_CAPS_INDEX_PROP = 4 +NV0000_CTRL_P2P_CAPS_INDEX_LOOPBACK = 5 +NV0000_CTRL_P2P_CAPS_INDEX_PCI = 6 +NV0000_CTRL_P2P_CAPS_INDEX_C2C = 7 +NV0000_CTRL_P2P_CAPS_INDEX_PCI_BAR1 = 8 +NV0000_CTRL_P2P_CAPS_INDEX_TABLE_SIZE = 9 +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_MESSAGE_ID = (0x27) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED = (0, 0) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED = (1, 1) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED = (2, 2) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED = (3, 3) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED = (4, 4) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED = (5, 5) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED = (6, 6) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED = (7, 7) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED = (8, 8) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED = (9, 9) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED = (10, 10) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED = (12, 12) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED = (13, 13) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED_TRUE = (0x00000001) +NV0000_P2P_CAPS_STATUS_OK = (0x00) +NV0000_P2P_CAPS_STATUS_CHIPSET_NOT_SUPPORTED = (0x01) +NV0000_P2P_CAPS_STATUS_GPU_NOT_SUPPORTED = (0x02) +NV0000_P2P_CAPS_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED = (0x03) +NV0000_P2P_CAPS_STATUS_DISABLED_BY_REGKEY = (0x04) +NV0000_P2P_CAPS_STATUS_NOT_SUPPORTED = (0x05) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS_V2 = (0x12b) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS_MESSAGE_ID = (0x2B) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS_MATRIX = (0x13a) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_MESSAGE_ID = (0x3A) +NV0000_CTRL_CMD_SYSTEM_GPS_CTRL = (0x12a) +NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS_MESSAGE_ID = (0x2A) +NV0000_CTRL_GPS_PSHARE_PARAMS_PSP_CURRENT_VERSION = (0x00010000) +NV0000_CTRL_GPS_CMD_TYPE_GET_THERM_LIMIT = (0x00000002) +NV0000_CTRL_GPS_INPUT_SENSOR_INDEX = (0x00000000) +NV0000_CTRL_GPS_RESULT_THERMAL_LIMIT = (0x00000000) +NV0000_CTRL_GPS_RESULT_MIN_LIMIT = (0x00000001) +NV0000_CTRL_GPS_RESULT_MAX_LIMIT = (0x00000002) +NV0000_CTRL_GPS_RESULT_LIMIT_SOURCE = (0x00000003) +NV0000_CTRL_GPS_CMD_TYPE_SET_THERM_LIMIT = (0x00000003) +NV0000_CTRL_GPS_INPUT_THERMAL_LIMIT = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_DOWN_N_DELTA = (0x00000004) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_DOWN_N_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_DOWN_N_DELTA = (0x00000005) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_DOWN_N_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_HOLD_DELTA = (0x00000006) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_HOLD_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_HOLD_DELTA = (0x00000007) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_HOLD_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_UP_DELTA = (0x00000008) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_UP_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_UP_DELTA = (0x00000009) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_UP_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000A) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_ENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000B) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_ENGAGE_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000C) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000D) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_STATUS = (0x00000016) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_STATUS = (0x00000017) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_GET_UTIL_AVG_NUM = (0x00000018) +NV0000_CTRL_GPS_RESULT_CPU_SET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_SET_UTIL_AVG_NUM = (0x00000019) +NV0000_CTRL_GPS_INPUT_CPU_GET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_PERF_SENSOR = (0x0000001A) +NV0000_CTRL_GPS_INPUT_NEXT_EXPECTED_POLL = (0x00000001) +NV0000_CTRL_GPS_RESULT_PERF_SENSOR_VALUE = (0x00000000) +NV0000_CTRL_GPS_RESULT_PERF_SENSOR_AVAILABLE = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_CALL_ACPI = (0x0000001B) +NV0000_CTRL_GPS_INPUT_ACPI_CMD = (0x00000000) +NV0000_CTRL_GPS_INPUT_ACPI_PARAM_IN = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_RESULT_1 = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_RESULT_2 = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_STATUS = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_VERSION = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_SZ = (0x00000002) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSS_SZ = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSS_COUNT = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_IGPU_TURBO = (0x0000001C) +NV0000_CTRL_GPS_INPUT_SET_IGPU_TURBO = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_PERIOD = (0x00000026) +NV0000_CTRL_GPS_INPUT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_PERIOD = (0x00000027) +NV0000_CTRL_GPS_RESULT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_NUDGE_FACTOR = (0x00000028) +NV0000_CTRL_GPS_INPUT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_NUDGE_FACTOR = (0x00000029) +NV0000_CTRL_GPS_RESULT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_THRESHOLD_SAMPLES = (0x0000002A) +NV0000_CTRL_GPS_INPUT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_THRESHOLD_SAMPLES = (0x0000002B) +NV0000_CTRL_GPS_RESULT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_PERF_LIMITS = (0x0000002C) +NV0000_CTRL_GPS_INPUT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_PERF_LIMITS = (0x0000002D) +NV0000_CTRL_GPS_RESULT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_PM1_AVAILABLE = (0x0000002E) +NV0000_CTRL_GPS_INPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_PM1_AVAILABLE = (0x0000002F) +NV0000_CTRL_GPS_OUTPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS = (0x00000044) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL2 = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_PACKAGE_LIMITS = (0x00000045) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_FREQ_LIMIT = (0x00000046) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_FREQ_LIMIT = (0x00000047) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM = (0x00000048) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM_INDEX = (0) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM_AVAILABLE_MASK = (1) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM = (0x00000049) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM_INDEX = (0) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM_INDEX_MAX = (2) +NV0000_CTRL_GPS_PPM_INDEX = (7, 0) +NV0000_CTRL_GPS_PPM_INDEX_MAXPERF = (0) +NV0000_CTRL_GPS_PPM_INDEX_BALANCED = (1) +NV0000_CTRL_GPS_PPM_INDEX_QUIET = (2) +NV0000_CTRL_GPS_PPM_INDEX_INVALID = (0xFF) +NV0000_CTRL_GPS_PPM_MASK = (15, 8) +NV0000_CTRL_GPS_PPM_MASK_INVALID = (0) +NV0000_CTRL_GPS_CMD_PS_STATUS_OFF = (0) +NV0000_CTRL_GPS_CMD_PS_STATUS_ON = (1) +NV0000_CTRL_CMD_SYSTEM_SET_SECURITY_SETTINGS = (0x129) +GPS_MAX_COUNTERS_PER_BLOCK = 32 +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS_MESSAGE_ID = (0x29) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_PERF_SENSORS = (0x12c) +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x2C) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS = (0x12e) +NV0000_CTRL_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x2E) +GPS_MAX_ACPI_OUTPUT_BUFFER_SIZE = 288 +NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS_MESSAGE_ID = (0x2D) +NV0000_CTRL_CMD_SYSTEM_GPS_CALL_ACPI = (0x12d) +NV0000_CTRL_SYSTEM_PARAM_TGPU = (0x00000000) +NV0000_CTRL_SYSTEM_PARAM_PDTS = (0x00000001) +NV0000_CTRL_SYSTEM_PARAM_SFAN = (0x00000002) +NV0000_CTRL_SYSTEM_PARAM_SKNT = (0x00000003) +NV0000_CTRL_SYSTEM_PARAM_CPUE = (0x00000004) +NV0000_CTRL_SYSTEM_PARAM_TMP1 = (0x00000005) +NV0000_CTRL_SYSTEM_PARAM_TMP2 = (0x00000006) +NV0000_CTRL_SYSTEM_PARAM_CTGP = (0x00000007) +NV0000_CTRL_SYSTEM_PARAM_PPMD = (0x00000008) +NV0000_CTRL_SYSTEM_PARAM_COUNT = (0x00000009) +NV0000_CTRL_CMD_SYSTEM_EXECUTE_ACPI_METHOD = (0x130) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS_MESSAGE_ID = (0x30) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_NVOP_OPTIMUSCAPS = (0x00000000) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_NVOP_OPTIMUSFLAG = (0x00000001) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_JT_CAPS = (0x00000002) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_JT_PLATPOLICY = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_ENABLE_ETW_EVENTS = (0x131) +NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS_MESSAGE_ID = (0x31) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_ALL = (0x00000001) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NOFREQ = (0x00000002) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_FLUSH = (0x00000004) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PERF = (0x00000010) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_ELPG = (0x00000020) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NVDPS = (0x00000040) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_POWER = (0x00000080) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_DISP = (0x00000100) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_RMAPI = (0x00000200) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_INTR = (0x00000400) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_LOCK = (0x00000800) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_RCJOURNAL = (0x00001000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_GENERIC = (0x00002000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_THERM = (0x00004000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_GPS = (0x00008000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PCIE = (0x00010000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NVTELEMETRY = (0x00020000) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_FRM_DATA = (0x12f) +NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE_SIZE = 64 +NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS_MESSAGE_ID = (0x2F) +NV0000_CTRL_CMD_SYSTEM_GPS_SET_FRM_DATA = (0x132) +NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS_MESSAGE_ID = (0x32) +NV0000_CTRL_CMD_SYSTEM_GET_VGX_SYSTEM_INFO_BUFFER_SIZE = 256 +NV0000_CTRL_CMD_SYSTEM_GET_VGX_SYSTEM_INFO = (0x133) +NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS_MESSAGE_ID = (0x33) +NV0000_CTRL_CMD_SYSTEM_GET_GPUS_POWER_STATUS = (0x134) +NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS_MESSAGE_ID = (0x34) +NV0000_CTRL_SYSTEM_GPU_EXTERNAL_POWER_STATUS_CONNECTED = 0 +NV0000_CTRL_SYSTEM_GPU_EXTERNAL_POWER_STATUS_NOT_CONNECTED = 1 +NV0000_CTRL_CMD_SYSTEM_GET_PRIVILEGED_STATUS = (0x135) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS_MESSAGE_ID = (0x35) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PRIV_USER_FLAG = (0x00000001) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_KERNEL_HANDLE_FLAG = (0x00000002) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PRIV_HANDLE_FLAG = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GET_FABRIC_STATUS = (0x136) +NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS_MESSAGE_ID = (0x36) +NV0000_CTRL_VGPU_GET_VGPU_VERSION = (0x137) +NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS_MESSAGE_ID = (0x37) +NV0000_CTRL_VGPU_SET_VGPU_VERSION = (0x138) +NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS_MESSAGE_ID = (0x38) +NV0000_CTRL_CMD_SYSTEM_GET_RM_INSTANCE_ID = (0x139) +NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS_MESSAGE_ID = (0x39) +NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO = (0x13b) +NVPCF_CTRL_SYSPWRLIMIT_TYPE_BASE = 1 +NV0000_CTRL_SYSTEM_POWER_INFO_INDEX_MAX_SIZE = 32 +NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT_MESSAGE_ID = (0x48) +NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_MESSAGE_ID = (0x3B) +CONTROLLER_FILTER_TYPE_EMWA = 0 +CONTROLLER_FILTER_TYPE_MOVING_MAX = 1 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_SUPPORTED_CASE = 2 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DYNAMIC_CASE = 3 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_STATIC_CASE = 4 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DC_SYSTEM_POWER_LIMITS_CASE = 5 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_CPU_TDP_LIMIT_CONTROL_CASE = 6 +NVPCF0100_CTRL_CONFIG_DSM_1X_FUNC_GET_SUPPORTED = (0x00000000) +NVPCF0100_CTRL_CONFIG_DSM_1X_FUNC_GET_DYNAMIC_PARAMS = (0x00000002) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED = (0, 0) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED_YES = 1 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED_NO = 0 +NVPCF0100_CTRL_CONFIG_DSM_2X_VERSION = (0x00000200) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_SUPPORTED = (0x00000000) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_STATIC_CONFIG_TABLES = (0x00000001) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DYNAMIC_PARAMS = (0x00000002) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DC_SYSTEM_POWER_LIMITS_TABLE = (0x00000008) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_CPU_TDP_LIMIT_CONTROL = (0x00000009) +NVPCF0100_CTRL_CONFIG_2X_BUFF_SIZE_MAX = (255) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT = (0x13c) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS_MESSAGE_ID = (0x3C) +NV0000_CTRL_CMD_SYSTEM_GET_CLIENT_DATABASE_INFO = (0x13d) +NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS_MESSAGE_ID = (0x3D) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_MAX_STRING_SIZE = 256 +NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION_V2 = (0x13e) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS_MESSAGE_ID = (0x3E) +NV0000_CTRL_CMD_SYSTEM_RMCTRL_CACHE_MODE_CTRL = (0x13f) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS_MESSAGE_ID = (0x3F) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_CMD_GET = (0x00000000) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_CMD_SET = (0x00000001) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_DISABLE = (0x00000000) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_ENABLE = (0x00000001) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_VERIFY_ONLY = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CONTROL = (0x140) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS_MESSAGE_ID = (0x40) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_INIT = (0x0000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_EXEC = (0x0001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_EXEC = (0x0002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_ACTIONS = (0x0003) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_ACTIONS = (0x0004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_LOGIC = (0x0005) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_LOGIC = (0x0006) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_PREFERENCE = (0x0007) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_PREFERENCE = (0x0008) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_GPU2CPU_LIMIT = (0x0009) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_GPU2CPU_LIMIT = (0x000A) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_PMU_PFM_REQ_HNDLR_STATE = (0x000B) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_PMU_PFM_REQ_HNDLR_STATE = (0x000C) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_MAX_POWER = (0x0100) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_MAX_POWER = (0x0101) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_COOLING_BUDGET = (0x0102) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_COOLING_BUDGET = (0x0103) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_INTEGRAL_PERIOD = (0x0104) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_INTEGRAL_PERIOD = (0x0105) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_RULESET = (0x0106) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_RULESET = (0x0107) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_RULE_COUNT = (0x0108) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_APP_BOOST = (0x0109) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_APP_BOOST = (0x010A) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_PWR_SUPPLY_MODE = (0x010B) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_PWR_SUPPLY_MODE = (0x010C) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_VCT_SUPPORT_INFO = (0x010D) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_SUPPORTED_FUNCTIONS = (0x010E) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER = (0x0200) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_DELTA = (0x0201) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_FUTURE = (0x0202) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_LTMAVG = (0x0203) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_INTEGRAL = (0x0204) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_BURDEN = (0x0205) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_INTERMEDIATE = (0x0206) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_SENSOR_PARAMETERS = (0x0210) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP = (0x0220) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP_DELTA = (0x0221) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP_FUTURE = (0x0222) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE = (0x0240) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_CAP = (0x0241) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_MIN = (0x0242) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_MAX = (0x0243) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_ACTION = (0x0244) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_SLFM_PRESENT = (0x0245) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_SET_POWER_SIM_STATE = (0x0250) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_SIM_STATE = (0x0251) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_SET_POWER_SIM_DATA = (0x0252) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_SIM_DATA = (0x0253) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_INIT_USING_SBIOS_AND_ACK = (0x0320) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_PING_SBIOS_FOR_EVENT = (0x0321) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_SYSTEM = (0x0000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_CPU = lambda i: (0x0100+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_GPU = lambda i: (0x0200+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INVALID = (0x80000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INIT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INIT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_EXEC_STOP = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_EXEC_START = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_ACTIONS_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_ACTIONS_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_FUZZY = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_DETERMINISTIC = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_CPU = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_GPU = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_BOTH = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_NO_MAP_OVERRIDE = (0xFFFFFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PMU_PFM_REQ_HNDLR_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PMU_PFM_REQ_HNDLR_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_REAL = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_FAKE_AC = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_FAKE_BATT = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SUPPORT = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_VENTURASTATUS = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_GETPSS = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SETPPC = (0x00000008) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_GETPPC = (0x00000010) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_VENTURACB = (0x00000020) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SYSPARAMS = (0x00000040) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DEC_TO_P0 = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DEC_BY_1 = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DO_NOTHING = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_SET_CURRENT = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_BY_1 = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_BY_2 = (0x00000005) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_TO_LFM = (0x00000006) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_TO_SLFM = (0x00000007) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_SLFM_PRESENT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_SLFM_PRESENT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_POWER_SIM_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_POWER_SIM_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL = (0x141) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_BATCH_COMMAND_MAX = (16) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_MESSAGE_ID = (0x41) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CTRL = (0x142) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS_MESSAGE_ID = (0x42) +NV0000_CTRL_PFM_REQ_HNDLR_PSHARE_PARAMS_PSP_CURRENT_VERSION = (0x00010000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_THERM_LIMIT = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_SENSOR_INDEX = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_THERMAL_LIMIT = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_MIN_LIMIT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_MAX_LIMIT = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_LIMIT_SOURCE = (0x00000003) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_THERM_LIMIT = (0x00000003) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_THERMAL_LIMIT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_DOWN_N_DELTA = (0x00000004) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_DOWN_N_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_DOWN_N_DELTA = (0x00000005) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_DOWN_N_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_HOLD_DELTA = (0x00000006) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_HOLD_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_HOLD_DELTA = (0x00000007) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_HOLD_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_UP_DELTA = (0x00000008) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_UP_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_UP_DELTA = (0x00000009) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_UP_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000A) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_ENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000B) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_ENGAGE_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000C) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000D) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_STATUS = (0x00000016) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_STATUS = (0x00000017) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_GET_UTIL_AVG_NUM = (0x00000018) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_CPU_SET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_SET_UTIL_AVG_NUM = (0x00000019) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_CPU_GET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PERF_SENSOR = (0x0000001A) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_NEXT_EXPECTED_POLL = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_PERF_SENSOR_VALUE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_PERF_SENSOR_AVAILABLE = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_CALL_ACPI = (0x0000001B) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_ACPI_CMD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_ACPI_PARAM_IN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_RESULT_1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_RESULT_2 = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_VERSION = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_SZ = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSS_SZ = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSS_COUNT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_IGPU_TURBO = (0x0000001C) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_SET_IGPU_TURBO = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_PERIOD = (0x00000026) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_PERIOD = (0x00000027) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_NUDGE_FACTOR = (0x00000028) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_NUDGE_FACTOR = (0x00000029) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_THRESHOLD_SAMPLES = (0x0000002A) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_THRESHOLD_SAMPLES = (0x0000002B) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_PERF_LIMITS = (0x0000002C) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_PERF_LIMITS = (0x0000002D) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PM1_AVAILABLE = (0x0000002E) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PM1_AVAILABLE = (0x0000002F) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS = (0x00000044) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL2 = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_PACKAGE_LIMITS = (0x00000045) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_FREQ_LIMIT = (0x00000046) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_FREQ_LIMIT = (0x00000047) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM = (0x00000048) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM_INDEX = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM_AVAILABLE_MASK = (1) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM = (0x00000049) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM_INDEX = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM_INDEX_MAX = (2) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX = (7, 0) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_MAXPERF = (0) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_BALANCED = (1) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_QUIET = (2) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_INVALID = (0xFF) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_MASK = (15, 8) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_MASK_INVALID = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_PS_STATUS_OFF = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_PS_STATUS_ON = (1) +PFM_REQ_HNDLR_MAX_COUNTERS_PER_BLOCK = 32 +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS = (0x146) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x46) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS = (0x147) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x47) +PFM_REQ_HNDLR_MAX_ACPI_OUTPUT_BUFFER_SIZE = 288 +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS_MESSAGE_ID = (0x43) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI = (0x143) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PFM_REQ_HNDLR = (0x00008000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA = (0x144) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE_SIZE = 64 +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS_MESSAGE_ID = (0x44) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA = (0x145) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS_MESSAGE_ID = (0x45) +NV0000_CTRL_CMD_OS_UNIX_FLUSH_USER_CACHE = (0x3d02) +NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_FLUSH = (0x00000001) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_INVALIDATE = (0x00000002) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_FLUSH_INVALIDATE = (0x00000003) +NV0000_CTRL_CMD_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR = (0x3d04) +NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECT_TO_FD = (0x3d05) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD = (0, 0) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD_FALSE = (0x00000000) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD_TRUE = (0x00000001) +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_FROM_FD = (0x3d06) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_OS_GET_GPU_INFO = (0x3d07) +NV0000_CTRL_CMD_OS_UNIX_GET_EXPORT_OBJECT_INFO = (0x3d08) +NV0000_OS_UNIX_EXPORT_OBJECT_FD_BUFFER_SIZE = 64 +NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_OS_UNIX_REFRESH_RMAPI_DEVICE_LIST = (0x3d09) +NV0000_CTRL_CMD_OS_UNIX_CREATE_EXPORT_OBJECT_FD = (0x3d0a) +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_BUFFER_SIZE = NV0000_OS_UNIX_EXPORT_OBJECT_FD_BUFFER_SIZE +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS_MESSAGE_ID = (0xA) +NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECTS_TO_FD = (0x3d0b) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_MAX_OBJECTS = 512 +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS_MESSAGE_ID = (0xB) +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECTS_FROM_FD = (0x3d0c) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_TO_FD_MAX_OBJECTS = 128 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_NONE = 0 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_VIDMEM = 1 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_SYSMEM = 2 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_FABRIC = 3 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_FABRIC_MC = 4 +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS_MESSAGE_ID = (0xC) +NV0000_BUSDEVICE_DOMAIN = (31, 16) +NV0000_BUSDEVICE_BUS = (15, 8) +NV0000_BUSDEVICE_DEVICE = (7, 0) +NV0000_CTRL_CMD_VGPU_CREATE_DEVICE = (0xc02) +NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_VGPU_GET_INSTANCES = (0xc03) +NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_VGPU_DELETE_DEVICE = (0xc04) +NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_VGPU_VFIO_NOTIFY_RM_STATUS = (0xc05) +NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_GPU_UPDATE_SYSFS_NODE = (0x206) +NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_RESERVED = (0x00) +NV0080_CTRL_BIF = (0x01) +NV0080_CTRL_GPU = (0x02) +NV0080_CTRL_CLK = (0x10) +NV0080_CTRL_GR = (0x11) +NV0080_CTRL_CIPHER = (0x12) +NV0080_CTRL_FB = (0x13) +NV0080_CTRL_HOST = (0x14) +NV0080_CTRL_VIDEO = (0x15) +NV0080_CTRL_FIFO = (0x17) +NV0080_CTRL_DMA = (0x18) +NV0080_CTRL_PERF = (0x19) +NV0080_CTRL_PERF_LEGACY_NON_PRIVILEGED = (0x99) +NV0080_CTRL_MSENC = (0x1B) +NV0080_CTRL_BSP = (0x1C) +NV0080_CTRL_RC = (0x1D) +NV0080_CTRL_OS_UNIX = (0x1E) +NV0080_CTRL_NVJPG = (0x1F) +NV0080_CTRL_INTERNAL = (0x20) +NV0080_CTRL_NVLINK = (0x21) +NV0080_CTRL_CMD_NULL = (0x800000) +NV0080_CTRL_CMD_BIF_RESET = (0x800102) +NV0080_CTRL_BIF_RESET_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_BIF_RESET_FLAGS_TYPE = (4, 0) +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_SW_RESET = 0x1 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_SBR = 0x2 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_FUNDAMENTAL = 0x3 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BOOT_DEVICE_FUSE = 0x4 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BOOT_DEVICE = 0x5 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_PEX = 0x6 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_OOBHUB_TRIGGER = 0x7 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BASE = 0x8 +NV0080_CTRL_CMD_BIF_SET_ASPM_FEATURE = (0x800104) +NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS_MESSAGE_ID = (0x4) +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L0S = (0, 0) +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L0S_ENABLED = 0x000000001 +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L0S_DISABLED = 0x000000000 +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L1 = (1, 1) +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L1_ENABLED = 0x000000001 +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L1_DISABLED = 0x000000000 +NV0080_CTRL_CMD_BIF_ASPM_CYA_UPDATE = (0x800105) +NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS_MESSAGE_ID = (0x5) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK = (0x800106) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_CMD_BSP_GET_CAPS = (0x801c01) +NV0080_CTRL_BSP_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_BSP_CAPS_TBL_SIZE = 8 +NV0080_CTRL_CMD_BSP_GET_CAPS_V2 = (0x801c02) +NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2_MESSAGE_ID = (0x2) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID = (0, 0) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED = (2, 1) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_NOT_SUPPORTED = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE = (6, 3) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_PEER_MEMORY = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_SYSTEM_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_SYSTEM_NON_COHERENT_MEMORY = (0x00000003) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS = (10, 7) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_NONE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_1 = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_2 = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_4 = (0x00000004) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED = (12, 11) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_NOT_SUPPORTED = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS = (14, 13) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_READ_WRITE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_READ_ONLY = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_WRITE_ONLY = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_NOT_SUPPORTED = (0x00000003) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY = (15, 15) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC = (16, 16) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC_DISABLE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC_ENABLE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING = (17, 17) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING_DISABLE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING_ENABLE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED = (18, 18) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_GET_PTE_INFO = (0x801801) +NV0080_CTRL_DMA_GET_PTE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_CMD_DMA_SET_PTE_INFO = (0x80180a) +NV0080_CTRL_DMA_SET_PTE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS_MESSAGE_ID = (0xA) +NV0080_CTRL_CMD_DMA_FILL_PTE_MEM = (0x801802) +NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_DMA_FLUSH = (0x801805) +NV0080_CTRL_DMA_FLUSH_PARAMS_MESSAGE_ID = (0x5) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2 = (0, 0) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG = (1, 1) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB = (2, 2) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE = (4, 3) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE_SYSMEM = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE_PEERMEM = (0x00000002) +NV0080_CTRL_CMD_DMA_ADV_SCHED_GET_VA_CAPS = (0x801806) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_MAX_NUM_PAGE_TABLE_FORMATS = (16) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_CMD_DMA_ADV_SCHED_GET_VA_CAPS_WITH_VA_RANGE_LO = 0x1 +NV0080_CTRL_CMD_DMA_GET_PDE_INFO = (0x801809) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_SYSTEM_COHERENT_MEMORY = (0x00000001) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_SYSTEM_NON_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_SYSTEM_COHERENT_MEMORY = (0x00000001) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_SYSTEM_NON_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_FULL = 1 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_HALF = 2 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_QUARTER = 3 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_EIGHTH = 4 +NV0080_CTRL_CMD_DMA_INVALIDATE_TLB = (0x80180c) +NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS_MESSAGE_ID = (0xC) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL = (0, 0) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL_FALSE = (0x00000000) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_GET_CAPS = (0x80180d) +NV0080_CTRL_DMA_CAPS_TBL_SIZE = 8 +NV0080_CTRL_DMA_GET_CAPS_PARAMS_MESSAGE_ID = (0xD) +NV0080_CTRL_CMD_DMA_SET_VA_SPACE_SIZE = (0x80180e) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS_MESSAGE_ID = (0xE) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_MAX = (0xFFFFFFFFFFFFFFFF) +NV0080_CTRL_CMD_DMA_UPDATE_PDE_2 = (0x80180f) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_INVALID = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_VIDEO_MEMORY = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_SYSTEM_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_SYSTEM_NON_COHERENT_MEMORY = (0x00000003) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX_SMALL = 0 +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX_BIG = 1 +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX__SIZE = 2 +NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS_MESSAGE_ID = (0xF) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE = (0, 0) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE_TRUE = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE = (1, 1) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE_TRUE = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE = (3, 2) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_FULL = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_HALF = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_QUARTER = (0x00000002) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_EIGHTH = (0x00000003) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE = (4, 4) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE_TRUE = (0x00000001) +NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE = (0x801810) +NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS_MESSAGE_ID = (0x10) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE = (0x801812) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_MESSAGE_ID = (0x12) +NV0080_CTRL_CMD_DMA_SET_PAGE_DIRECTORY = (0x801813) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_MESSAGE_ID = (0x13) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE = (1, 0) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_VIDMEM = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_SYSMEM_COH = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_SYSMEM_NONCOH = (0x00000002) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES = (2, 2) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS = (3, 3) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY = (4, 4) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE = (5, 5) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_UNSET_PAGE_DIRECTORY = (0x801814) +NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_MESSAGE_ID = (0x14) +NV0080_CTRL_CMD_FB_GET_CAPS = (0x801301) +NV0080_CTRL_FB_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_FB_CAPS_TBL_SIZE = 3 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO = (0x801306) +NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_UNKNOWN = 0 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_SYSMEM = 1 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_FBMEM = 2 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_LEGACY = 0 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_1TO1 = 1 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_1TO4 = 2 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_RAWMODE = 3 +NV0080_CTRL_CMD_FB_GET_CAPS_V2 = (0x801307) +NV0080_CTRL_FB_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_CMD_FB_SET_DEFAULT_VIDMEM_PHYSICALITY = (0x801308) +NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS_MESSAGE_ID = (0x8) +NV0080_CTRL_CMD_FIFO_GET_CAPS = (0x801701) +NV0080_CTRL_FIFO_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_FIFO_CAPS_TBL_SIZE = 2 +NV0080_CTRL_CMD_FIFO_GET_ENGINE_CONTEXT_PROPERTIES = (0x801707) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID = (4, 0) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS = (0x00000000) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_VLD = (0x00000001) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_VIDEO = (0x00000002) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_MPEG = (0x00000003) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_CAPTURE = (0x00000004) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_DISPLAY = (0x00000005) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_ENCRYPTION = (0x00000006) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_POSTPROCESS = (0x00000007) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_ZCULL = (0x00000008) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PM = (0x00000009) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COMPUTE_PREEMPT = (0x0000000a) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PREEMPT = (0x0000000b) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_SPILL = (0x0000000c) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PAGEPOOL = (0x0000000d) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_BETACB = (0x0000000e) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_RTV = (0x0000000f) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PATCH = (0x00000010) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_BUNDLE_CB = (0x00000011) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PAGEPOOL_GLOBAL = (0x00000012) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_ATTRIBUTE_CB = (0x00000013) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_RTV_CB_GLOBAL = (0x00000014) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_GFXP_POOL = (0x00000015) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_GFXP_CTRL_BLK = (0x00000016) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_FECS_EVENT = (0x00000017) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PRIV_ACCESS_MAP = (0x00000018) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_SETUP = (0x00000019) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COUNT = (0x0000001a) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_CMD_FIFO_RUNLIST_GROUP_CHANNELS = (0x801709) +NV0080_CTRL_FIFO_RUNLIST_GROUP_MAX_CHANNELS = (8) +NV0080_CTRL_CMD_FIFO_RUNLIST_DIVIDE_TIMESLICE = (0x80170b) +NV0080_CTRL_FIFO_RUNLIST_MAX_TIMESLICE_DIVISOR = (12) +NV0080_CTRL_CMD_FIFO_PREEMPT_RUNLIST = (0x80170c) +NV0080_CTRL_CMD_FIFO_GET_CHANNELLIST = (0x80170d) +NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS_MESSAGE_ID = (0xD) +NV0080_CTRL_CMD_FIFO_GET_LATENCY_BUFFER_SIZE = (0x80170e) +NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0xE) +NV0080_CTRL_FIFO_GET_CHANNELLIST_INVALID_CHANNEL = (0xffffffff) +NV0080_CTRL_CMD_FIFO_SET_CHANNEL_PROPERTIES = (0x80170f) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_MESSAGE_ID = (0xF) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_ENGINETIMESLICEINMICROSECONDS = (0x00000000) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PBDMATIMESLICEINMICROSECONDS = (0x00000001) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_ENGINETIMESLICEDISABLE = (0x00000002) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PBDMATIMESLICEDISABLE = (0x00000003) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_INVALIDATE_PDB_TARGET = (0x00000004) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_RESETENGINECONTEXT = (0x00000005) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_NOOP = (0x00000007) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_RESETENGINECONTEXT_NOPREEMPT = (0x00000008) +NV0080_CTRL_CMD_FIFO_STOP_RUNLIST = (0x801711) +NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS_MESSAGE_ID = (0x11) +NV0080_CTRL_CMD_FIFO_START_RUNLIST = (0x801712) +NV0080_CTRL_FIFO_START_RUNLIST_PARAMS_MESSAGE_ID = (0x12) +NV0080_CTRL_CMD_FIFO_GET_CAPS_V2 = (0x801713) +NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x13) +NV0080_CTRL_CMD_FIFO_IDLE_CHANNELS = (0x801714) +NV0080_CTRL_CMD_FIFO_IDLE_CHANNELS_MAX_CHANNELS = 4096 +NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS_MESSAGE_ID = (0x14) +NV0080_CTRL_CMD_GPU_GET_CLASSLIST = (0x800201) +NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_CMD_GPU_GET_NUM_SUBDEVICES = (0x800280) +NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS_MESSAGE_ID = (0x80) +NV0080_CTRL_CMD_GPU_GET_VIDLINK_ORDER = (0x800281) +NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS_MESSAGE_ID = (0x81) +NV0080_CTRL_CMD_GPU_SET_DISPLAY_OWNER = (0x800282) +NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS_MESSAGE_ID = (0x82) +NV0080_CTRL_CMD_GPU_GET_DISPLAY_OWNER = (0x800283) +NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS_MESSAGE_ID = (0x83) +NV0080_CTRL_CMD_GPU_SET_VIDLINK = (0x800285) +NV0080_CTRL_GPU_SET_VIDLINK_PARAMS_MESSAGE_ID = (0x85) +NV0080_CTRL_GPU_SET_VIDLINK_ENABLE_FALSE = (0x00000000) +NV0080_CTRL_GPU_SET_VIDLINK_ENABLE_TRUE = (0x00000001) +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_GET_STATUS = 0 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_POWERDOWN = 1 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_POWERUP = 2 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWER_ON = 0 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWERING_DOWN = 1 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_GATED = 2 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWERING_UP = 3 +NV0080_CTRL_CMD_GPU_MODIFY_SW_STATE_PERSISTENCE = (0x800287) +NV0080_CTRL_GPU_SW_STATE_PERSISTENCE_ENABLED = (0x00000000) +NV0080_CTRL_GPU_SW_STATE_PERSISTENCE_DISABLED = (0x00000001) +NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS_MESSAGE_ID = (0x87) +NV0080_CTRL_CMD_GPU_QUERY_SW_STATE_PERSISTENCE = (0x800288) +NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS_MESSAGE_ID = (0x88) +NV0080_CTRL_CMD_GPU_GET_VIRTUALIZATION_MODE = (0x800289) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_NONE = (0x00000000) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_NMOS = (0x00000001) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_VGX = (0x00000002) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST = (0x00000003) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST_VGPU = NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST_VSGA = (0x00000004) +NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS_MESSAGE_ID = (0x89) +NV0080_CTRL_CMD_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE = (0x80028c) +NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS_MESSAGE_ID = (0x8C) +NV0080_CTRL_CMD_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE = (0x80028d) +NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS_MESSAGE_ID = (0x8D) +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_DEFAULT = 0 +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_OPTIMIZE_COMPUTE = 1 +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_OPTIMIZE_SPARSE_TEXTURE = 2 +NV0080_CTRL_CMD_GPU_GET_VGX_CAPS = (0x80028e) +NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS_MESSAGE_ID = (0x8E) +NV0080_CTRL_CMD_GPU_GET_SRIOV_CAPS = (0x800291) +NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS_MESSAGE_ID = (0x91) +NV0080_CTRL_GPU_CLASSLIST_MAX_SIZE = 100 +NV0080_CTRL_CMD_GPU_GET_CLASSLIST_V2 = (0x800292) +NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS_MESSAGE_ID = (0x92) +NV0080_CTRL_CMD_GPU_FIND_SUBDEVICE_HANDLE = (0x800293) +NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM_MESSAGE_ID = (0x93) +NV0080_CTRL_GPU_GET_BRAND_CAPS_QUADRO = NVBIT(0) +NV0080_CTRL_GPU_GET_BRAND_CAPS_NVS = NVBIT(1) +NV0080_CTRL_GPU_GET_BRAND_CAPS_TITAN = NVBIT(2) +NV0080_CTRL_CMD_GPU_GET_BRAND_CAPS = (0x800294) +NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS_MESSAGE_ID = (0x94) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64M = (1 << 6) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_128M = (1 << 7) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256M = (1 << 8) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_512M = (1 << 9) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_1G = (1 << 10) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_2G = (1 << 11) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_4G = (1 << 12) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_8G = (1 << 13) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_16G = (1 << 14) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_32G = (1 << 15) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64G = (1 << 16) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_128G = (1 << 17) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256G = (1 << 18) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_MIN = NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64M +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_MAX = NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256G +NV0080_CTRL_GPU_VGPU_NUM_VFS_INVALID = 0x0 +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE = (0x800296) +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS_MESSAGE_ID = (0x96) +NV0080_CTRL_CMD_GPU_SET_VGPU_HETEROGENEOUS_MODE = (0x800297) +NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0x97) +NV0080_CTRL_CMD_GPU_GET_VGPU_HETEROGENEOUS_MODE = (0x800298) +NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0x98) +NV0080_CTRL_CMD_GR_GET_CAPS = (0x801102) +NV0080_CTRL_GR_GET_CAPS_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_GR_CAPS_TBL_SIZE = 23 +NV0080_CTRL_GR_INFO_INDEX_MAXCLIPS = (0x00000000) +NV0080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 = (0x00000001) +NV0080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK = (0x00000002) +NV0080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT = (0x00000003) +NV0080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT = (0x00000004) +NV0080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE = (0x00000005) +NV0080_CTRL_GR_INFO_INDEX_VPE_COUNT = (0x00000006) +NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT = (0x00000007) +NV0080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR = (0x00000008) +NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT = (0x00000009) +NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT = (0x0000000A) +NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT = (0x0000000B) +NV0080_CTRL_GR_INFO_INDEX_SM_VERSION = (0x0000000C) +NV0080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM = (0x0000000D) +NV0080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP = (0x0000000E) +NV0080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES = (0x0000000F) +NV0080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES = (0x00000010) +NV0080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY = (0x00000011) +NV0080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY = (0x00000012) +NV0080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM = (0x00000013) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS = (0x00000014) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS = (0x00000015) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS = (0x00000016) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC = (0x00000017) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS = (0x00000018) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS = (0x00000019) +NV0080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED = (0x0000001A) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS = (0x0000001B) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC = (0x0000001C) +NV0080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT = (0x0000001D) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES = (0x0000001E) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS = (0x0000001F) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC = (0x00000020) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS = (0x00000021) +NV0080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT = (0x00000022) +NV0080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT = (0x00000023) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS = (0x00000024) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS = (0x00000025) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES = (0x00000026) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC = (0x00000027) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP = (0x00000028) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC = (0x00000029) +NV0080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC = (0x0000002A) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP = (0x0000002B) +NV0080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT = (0x0000002C) +NV0080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT = (0x0000002D) +NV0080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT = (0x0000002E) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC = (0x00000032) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES = (0x00000033) +NV0080_CTRL_GR_INFO_INDEX_DUMMY = (0x00000033) +NV0080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES = (0x00000034) +NV0080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES = (0x00000035) +NV0080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS = (0x00000036) +NV0080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG = (0x00000037) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET = (0x00000038) +NV0080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET = (0x00000039) +NV0080_CTRL_GR_INFO_INDEX_MAX = (0x00000039) +NV0080_CTRL_GR_INFO_MAX_SIZE = (0x3a) +NV0080_CTRL_CMD_GR_GET_INFO = (0x801104) +NV0080_CTRL_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0080_CTRL_CMD_GR_GET_TPC_PARTITION_MODE = (0x801107) +NV0080_CTRL_CMD_GR_SET_TPC_PARTITION_MODE = (0x801108) +NV0080_CTRL_GR_GET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x8) +NV0080_CTRL_CMD_GR_GET_CAPS_V2 = (0x801109) +NV0080_CTRL_GR_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_CMD_GR_GET_INFO_V2 = (0x801110) +NV0080_CTRL_GR_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x10) +NV0080_CTRL_CMD_HOST_GET_CAPS = (0x801401) +NV0080_CTRL_HOST_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_HOST_CAPS_TBL_SIZE = 3 +NV0080_CTRL_CMD_HOST_GET_CAPS_V2 = (0x801402) +NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE = (0x802002) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE = (0x802003) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS_MESSAGE_ID = (0x3) +NV0080_CTRL_CMD_INTERNAL_PERF_CUDA_LIMIT_SET_CONTROL = (0x802009) +NV0080_CTRL_CMD_INTERNAL_PERF_CUDA_LIMIT_DISABLE = (0x802004) +NV0080_CTRL_CMD_INTERNAL_PERF_SLI_GPU_BOOST_SYNC_SET_CONTROL = (0x802007) +NV0080_CTRL_CMD_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS = (0x802008) +NV_FIFO_PERMANENTLY_DISABLE_CHANNELS_MAX_CLIENTS = 200 +NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS_MESSAGE_ID = (0x08) +NV0080_CTRL_CMD_MSENC_GET_CAPS = (0x801b01) +NV0080_CTRL_MSENC_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_MSENC_CAPS_TBL_SIZE = 4 +NV0080_CTRL_CMD_MSENC_GET_CAPS_V2 = (0x801b02) +NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_NVJPG_CAPS_TBL_SIZE = 9 +NV0080_CTRL_CMD_NVJPG_GET_CAPS_V2 = (0x801f02) +NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_CMD_PERF_CUDA_LIMIT_SET_CONTROL = (0x801909) +NV0080_CTRL_CMD_OS_UNIX_VT_SWITCH = (0x801e01) +NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_SAVE_VT_STATE = (0x00000001) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_RESTORE_VT_STATE = (0x00000002) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_CONSOLE_RESTORED = (0x00000003) +NV0080_CTRL_CMD_OS_UNIX_VT_GET_FB_INFO = (0x801e02) +NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_RESERVED = (0x00) +NV2080_CTRL_GPU = (0x01) +NV2080_CTRL_GPU_LEGACY_NON_PRIVILEGED = (0x81) +NV2080_CTRL_FUSE = (0x02) +NV2080_CTRL_FUSE_LEGACY_NON_PRIVILEGED = (0x82) +NV2080_CTRL_EVENT = (0x03) +NV2080_CTRL_TIMER = (0x04) +NV2080_CTRL_THERMAL = (0x05) +NV2080_CTRL_THERMAL_LEGACY_PRIVILEGED = (0xc5) +NV2080_CTRL_THERMAL_LEGACY_NON_PRIVILEGED = (0x85) +NV2080_CTRL_I2C = (0x06) +NV2080_CTRL_EXTI2C = (0x07) +NV2080_CTRL_BIOS = (0x08) +NV2080_CTRL_CIPHER = (0x09) +NV2080_CTRL_INTERNAL = (0x0A) +NV2080_CTRL_CLK_LEGACY_PRIVILEGED = (0xd0) +NV2080_CTRL_CLK_LEGACY_NON_PRIVILEGED = (0x90) +NV2080_CTRL_CLK = (0x10) +NV2080_CTRL_FIFO = (0x11) +NV2080_CTRL_GR = (0x12) +NV2080_CTRL_FB = (0x13) +NV2080_CTRL_MC = (0x17) +NV2080_CTRL_BUS = (0x18) +NV2080_CTRL_PERF_LEGACY_PRIVILEGED = (0xe0) +NV2080_CTRL_PERF_LEGACY_NON_PRIVILEGED = (0xa0) +NV2080_CTRL_PERF = (0x20) +NV2080_CTRL_NVIF = (0x21) +NV2080_CTRL_RC = (0x22) +NV2080_CTRL_GPIO = (0x23) +NV2080_CTRL_GPIO_LEGACY_NON_PRIVILEGED = (0xa3) +NV2080_CTRL_NVD = (0x24) +NV2080_CTRL_DMA = (0x25) +NV2080_CTRL_PMGR = (0x26) +NV2080_CTRL_PMGR_LEGACY_PRIVILEGED = (0xe6) +NV2080_CTRL_PMGR_LEGACY_NON_PRIVILEGED = (0xa6) +NV2080_CTRL_POWER = (0x27) +NV2080_CTRL_POWER_LEGACY_NON_PRIVILEGED = (0xa7) +NV2080_CTRL_LPWR = (0x28) +NV2080_CTRL_LPWR_LEGACY_NON_PRIVILEGED = (0xa8) +NV2080_CTRL_LPWR_LEGACY_PRIVILEGED = (0xe8) +NV2080_CTRL_ACR = (0x29) +NV2080_CTRL_CE = (0x2A) +NV2080_CTRL_SPI = (0x2B) +NV2080_CTRL_NVLINK = (0x30) +NV2080_CTRL_FLCN = (0x31) +NV2080_CTRL_VOLT = (0x32) +NV2080_CTRL_VOLT_LEGACY_PRIVILEGED = (0xf2) +NV2080_CTRL_VOLT_LEGACY_NON_PRIVILEGED = (0xb2) +NV2080_CTRL_FAS = (0x33) +NV2080_CTRL_ECC = (0x34) +NV2080_CTRL_ECC_NON_PRIVILEGED = (0xb4) +NV2080_CTRL_FLA = (0x35) +NV2080_CTRL_GSP = (0x36) +NV2080_CTRL_NNE = (0x37) +NV2080_CTRL_NNE_LEGACY_NON_PRIVILEGED = (0xb7) +NV2080_CTRL_GRMGR = (0x38) +NV2080_CTRL_UCODE_FUZZER = (0x39) +NV2080_CTRL_DMABUF = (0x3A) +NV2080_CTRL_BIF = (0x3B) +NV2080_CTRL_OS_WINDOWS = (0x3F) +NV2080_CTRL_OS_MACOS = (0x3E) +NV2080_CTRL_OS_UNIX = (0x3D) +NV2080_CTRL_CMD_NULL = (0x20800000) +NV2080_CTRL_BIOS_INFO_MAX_SIZE = (0x0000000F) +NV2080_CTRL_BIOS_INFO_INDEX_REVISION = (0x00000000) +NV2080_CTRL_BIOS_INFO_INDEX_OEM_REVISION = (0x00000001) +NV2080_CTRL_CMD_BIOS_GET_INFO = (0x20800802) +NV2080_CTRL_CMD_BIOS_GET_INFO_V2 = (0x20800810) +NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_BIOS_NBSI_MAX_REG_STRING_LENGTH = (0x00000100) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_ASCII = (0x00000000) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_UNICODE = (0x00000001) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_HASH = (0x00000002) +NV2080_CTRL_BIOS_NBSI_MODULE_ROOT = (0x00000000) +NV2080_CTRL_BIOS_NBSI_MODULE_RM = (0x00000001) +NV2080_CTRL_BIOS_NBSI_MODULE_DISPLAYDRIVER = (0x00000002) +NV2080_CTRL_BIOS_NBSI_MODULE_VIDEO = (0x00000003) +NV2080_CTRL_BIOS_NBSI_MODULE_CPL = (0x00000004) +NV2080_CTRL_BIOS_NBSI_MODULE_D3D = (0x00000005) +NV2080_CTRL_BIOS_NBSI_MODULE_OGL = (0x00000006) +NV2080_CTRL_BIOS_NBSI_MODULE_PMU = (0x00000007) +NV2080_CTRL_BIOS_NBSI_MODULE_MODE = (0x00000008) +NV2080_CTRL_BIOS_NBSI_NUM_MODULES = (0x00000009) +NV2080_CTRL_BIOS_NBSI_MODULE_UNKNOWN = (0x80000000) +NV2080_CTRL_BIOS_GET_NBSI_SUCCESS = (0x00000000) +NV2080_CTRL_BIOS_GET_NBSI_OVERRIDE = (0x00000001) +NV2080_CTRL_BIOS_GET_NBSI_BAD_HASH = (0xFFFFFFFA) +NV2080_CTRL_BIOS_GET_NBSI_APITEST_SUCCESS = (0xFFFFFFFB) +NV2080_CTRL_BIOS_GET_NBSI_BAD_TABLE = (0xFFFFFFFC) +NV2080_CTRL_BIOS_GET_NBSI_NO_TABLE = (0xFFFFFFFD) +NV2080_CTRL_BIOS_GET_NBSI_INCOMPLETE = (0xFFFFFFFE) +NV2080_CTRL_BIOS_GET_NBSI_NOT_FOUND = (0xFFFFFFFF) +NV2080_CTRL_CMD_BIOS_GET_NBSI = (0x20800803) +NV2080_CTRL_BIOS_GET_NBSI_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_BIOS_GET_NBSI_V2 = (0x2080080e) +NV2080_BIOS_GET_NBSI_MAX_RET_SIZE = (0x100) +NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_BIOS_GET_NBSI_OBJ = (0x20800806) +NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS_MESSAGE_ID = (0x6) +GLOB_TYPE_GET_NBSI_DIR = 0xfffe +GLOB_TYPE_APITEST = 0xffff +GLOB_TYPE_GET_NBSI_ACPI_RAW = 0xfffd +NV2080_CTRL_CMD_BIOS_GET_SKU_INFO = (0x20800808) +NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME = (0x20800809) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_BIOS_GET_UEFI_SUPPORT = (0x2080080b) +NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE = (1, 0) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_NO = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_YES = (0x00000001) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_PLACEHOLDER = (0x00000002) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_HIDDEN = (0x00000003) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING = (2, 2) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING_FALSE = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING_TRUE = (0x00000001) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT = (3, 3) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT_FALSE = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT_TRUE = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCI_INFO = (0x20801801) +NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_BUS_INFO_INDEX_TYPE = (0x00000000) +NV2080_CTRL_BUS_INFO_INDEX_INTLINE = (0x00000001) +NV2080_CTRL_BUS_INFO_INDEX_CAPS = (0x00000002) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CAPS = (0x00000003) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_CAPS = (0x00000004) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_LINK_CAPS = (0x00000005) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_DOWNSTREAM_LINK_CAPS = (0x00000006) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CTRL_STATUS = (0x00000007) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_CTRL_STATUS = (0x00000008) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_LINK_CTRL_STATUS = (0x00000009) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_DOWNSTREAM_LINK_CTRL_STATUS = (0x0000000A) +NV2080_CTRL_BUS_INFO_INDEX_COHERENT_DMA_FLAGS = (0x0000000B) +NV2080_CTRL_BUS_INFO_INDEX_NONCOHERENT_DMA_FLAGS = (0x0000000C) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_SIZE = (0x0000000D) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_FLAGS = (0x0000000E) +NV2080_CTRL_BUS_INFO_INDEX_BUS_NUMBER = (0x0000000F) +NV2080_CTRL_BUS_INFO_INDEX_DEVICE_NUMBER = (0x00000010) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_ERRORS = (0x00000011) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_ERRORS = (0x00000012) +NV2080_CTRL_BUS_INFO_INDEX_INTERFACE_TYPE = (0x00000013) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GEN2_INFO = (0x00000014) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_AER = (0x00000015) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_LINK_CAPS = (0x00000016) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_LINK_CTRL_STATUS = (0x00000017) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ASLM_STATUS = (0x00000018) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_LINK_WIDTH_SWITCH_ERROR_COUNT = (0x00000019) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_LINK_SPEED_SWITCH_ERROR_COUNT = (0x0000001A) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_CYA_ASPM = (0x0000001B) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_LINECODE_ERRORS = (0x0000001C) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CRC_ERRORS = (0x0000001D) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NAKS_RECEIVED = (0x0000001E) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FAILED_L0S_EXITS = (0x0000001F) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_LINECODE_ERRORS_CLEAR = (0x00000020) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CRC_ERRORS_CLEAR = (0x00000021) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NAKS_RECEIVED_CLEAR = (0x00000022) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FAILED_L0S_EXITS_CLEAR = (0x00000023) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CORRECTABLE_ERRORS = (0x00000024) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NONFATAL_ERRORS = (0x00000025) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FATAL_ERRORS = (0x00000026) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_UNSUPPORTED_REQUESTS = (0x00000027) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CORRECTABLE_ERRORS_CLEAR = (0x00000028) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NONFATAL_ERRORS_CLEAR = (0x00000029) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FATAL_ERRORS_CLEAR = (0x0000002A) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_UNSUPPORTED_REQUESTS_CLEAR = (0x0000002B) +NV2080_CTRL_BUS_INFO_INDEX_DOMAIN_NUMBER = (0x0000002C) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GEN_INFO = (0x0000002D) +NV2080_CTRL_BUS_INFO_INDEX_GPU_INTERFACE_TYPE = (0x0000002E) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_GEN_INFO = (0x0000002F) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_GEN_INFO = (0x00000030) +NV2080_CTRL_BUS_INFO_INDEX_MSI_INFO = (0x00000031) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_SIZE_HI = (0x00000032) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE = (0x00000033) +NV2080_CTRL_BUS_INFO_INDEX_MAX = NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE +NV2080_CTRL_BUS_INFO_MAX_LIST_SIZE = (0x00000034) +NV2080_CTRL_BUS_INFO_TYPE_PCI = (0x00000001) +NV2080_CTRL_BUS_INFO_TYPE_PCI_EXPRESS = (0x00000003) +NV2080_CTRL_BUS_INFO_TYPE_FPCI = (0x00000004) +NV2080_CTRL_BUS_INFO_TYPE_AXI = (0x00000008) +NV2080_CTRL_BUS_INFO_CAPS_NEED_IO_FLUSH = (0x00000001) +NV2080_CTRL_BUS_INFO_CAPS_CHIP_INTEGRATED = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED = (3, 0) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_WIDTH = (9, 4) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM = (11, 10) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_NONE = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN = (15, 12) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL = (19, 16) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN = (23, 20) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES = (24, 24) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES_ENABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES_DISABLED = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM = (1, 0) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L1 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED = (19, 16) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH = (25, 20) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_UNDEFINED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X1 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X2 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X4 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X8 = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X12 = (0x0000000C) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X16 = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X32 = (0x00000020) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA = (0, 0) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART = (2, 2) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA = (0, 0) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART = (2, 2) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE = (3, 3) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH = (0, 0) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED = (1, 1) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_CORR_ERROR = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_NON_FATAL_ERROR = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_FATAL_ERROR = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_UNSUPP_REQUEST = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_ENTERED_RECOVERY = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_TRAINING_ERR = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_DLINK_PROTO_ERR = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_POISONED_TLP = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_FC_PROTO_ERR = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_CPL_TIMEOUT = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_CPL_ABORT = (0x00000020) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNEXP_CPL = (0x00000040) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_RCVR_OVERFLOW = (0x00000080) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_MALFORMED_TLP = (0x00000100) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_ECRC_ERROR = (0x00000200) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNSUPPORTED_REQ = (0x00000400) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RCV_ERR = (0x00010000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_TLP = (0x00020000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_DLLP = (0x00040000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_ROLLOVER = (0x00080000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_TIMEOUT = (0x00100000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_ADVISORY_NONFATAL = (0x00200000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE_ERROR = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE_PRESENT = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04 = (4, 4) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04_MISSING = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04_PRESENT = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM = (2, 1) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L1 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_MSI_STATUS = (0, 0) +NV2080_CTRL_BUS_INFO_MSI_STATUS_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_MSI_STATUS_ENABLED = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED = (4, 4) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_RESERVED = (7, 5) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PORT_RESTORE_TIME = (15, 8) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_T_POWER_ON_SCALE = (17, 16) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_T_POWER_ON_VALUE = (23, 19) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_COMMON_MODE_RESTORE_TIME = (15, 8) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_LTR_L1_2_THRESHOLD_VALUE = (25, 16) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_LTR_L1_2_THRESHOLD_SCALE = (31, 29) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL2_T_POWER_ON_SCALE = (1, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL2_T_POWER_ON_VALUE = (7, 3) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_PCIE = (0x00000000) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_NVLINK = (0x00000001) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_C2C = (0x00000002) +NV2080_CTRL_CMD_BUS_GET_INFO = (0x20801802) +NV2080_CTRL_BUS_GET_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_BUS_GET_INFO_V2 = (0x20801823) +NV2080_CTRL_BUS_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_BUS_GET_PCI_BAR_INFO = (0x20801803) +NV2080_CTRL_BUS_MAX_PCI_BARS = (8) +NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_BUS_SET_PCIE_LINK_WIDTH = (0x20801804) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_PSTATE = (0x00000001) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_PCIE_CFG_ACCESS = (0x00000002) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_TRAINING = (0x00000004) +NV2080_CTRL_CMD_BUS_SET_PCIE_SPEED = (0x20801805) +NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_BUS_SET_PCIE_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_SET_PCIE_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_SET_PCIE_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_SET_PCIE_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_SET_PCIE_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_SET_PCIE_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_CMD_BUS_MAP_BAR2 = (0x20801809) +NV2080_CTRL_BUS_MAP_BAR2_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_BUS_UNMAP_BAR2 = (0x2080180a) +NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_BUS_VERIFY_BAR2 = (0x2080180b) +NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_BUS_SERVICE_GPU_MULTIFUNC_STATE = (0x20801812) +NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_BUS_ENABLE_GPU_MULTIFUNC_STATE = (0x00000000) +NV2080_CTRL_BUS_DISABLE_GPU_MULTIFUNC_STATE = (0x00000001) +NV2080_CTRL_BUS_GET_GPU_MULTIFUNC_STATE = (0x00000002) +NV2080_CTRL_CMD_BUS_GET_PEX_COUNTERS = (0x20801813) +NV2080_CTRL_PEX_MAX_COUNTER_TYPES = 31 +NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_BUS_PEX_COUNTER_TYPE = 0x00000000 +NV2080_CTRL_BUS_PEX_COUNTER_RECEIVER_ERRORS = 0x00000001 +NV2080_CTRL_BUS_PEX_COUNTER_REPLAY_COUNT = 0x00000002 +NV2080_CTRL_BUS_PEX_COUNTER_REPLAY_ROLLOVER_COUNT = 0x00000004 +NV2080_CTRL_BUS_PEX_COUNTER_BAD_DLLP_COUNT = 0x00000008 +NV2080_CTRL_BUS_PEX_COUNTER_BAD_TLP_COUNT = 0x00000010 +NV2080_CTRL_BUS_PEX_COUNTER_8B10B_ERRORS_COUNT = 0x00000020 +NV2080_CTRL_BUS_PEX_COUNTER_SYNC_HEADER_ERRORS_COUNT = 0x00000040 +NV2080_CTRL_BUS_PEX_COUNTER_LCRC_ERRORS_COUNT = 0x00000080 +NV2080_CTRL_BUS_PEX_COUNTER_FAILED_L0S_EXITS_COUNT = 0x00000100 +NV2080_CTRL_BUS_PEX_COUNTER_NAKS_SENT_COUNT = 0x00000200 +NV2080_CTRL_BUS_PEX_COUNTER_NAKS_RCVD_COUNT = 0x00000400 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_ERRORS = 0x00000800 +NV2080_CTRL_BUS_PEX_COUNTER_L1_TO_RECOVERY_COUNT = 0x00001000 +NV2080_CTRL_BUS_PEX_COUNTER_L0_TO_RECOVERY_COUNT = 0x00002000 +NV2080_CTRL_BUS_PEX_COUNTER_RECOVERY_COUNT = 0x00004000 +NV2080_CTRL_BUS_PEX_COUNTER_CHIPSET_XMIT_L0S_ENTRY_COUNT = 0x00008000 +NV2080_CTRL_BUS_PEX_COUNTER_GPU_XMIT_L0S_ENTRY_COUNT = 0x00010000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_ENTRY_COUNT = 0x00020000 +NV2080_CTRL_BUS_PEX_COUNTER_L1P_ENTRY_COUNT = 0x00040000 +NV2080_CTRL_BUS_PEX_COUNTER_DEEP_L1_ENTRY_COUNT = 0x00080000 +NV2080_CTRL_BUS_PEX_COUNTER_ASLM_COUNT = 0x00100000 +NV2080_CTRL_BUS_PEX_COUNTER_TOTAL_CORR_ERROR_COUNT = 0x00200000 +NV2080_CTRL_BUS_PEX_COUNTER_CORR_ERROR_COUNT = 0x00400000 +NV2080_CTRL_BUS_PEX_COUNTER_NON_FATAL_ERROR_COUNT = 0x00800000 +NV2080_CTRL_BUS_PEX_COUNTER_FATAL_ERROR_COUNT = 0x01000000 +NV2080_CTRL_BUS_PEX_COUNTER_UNSUPP_REQ_COUNT = 0x02000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_1_ENTRY_COUNT = 0x04000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_2_ENTRY_COUNT = 0x08000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_2_ABORT_COUNT = 0x10000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1SS_TO_DEEP_L1_TIMEOUT_COUNT = 0x20000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_SHORT_DURATION_COUNT = 0x40000000 +NV2080_CTRL_CMD_BUS_CLEAR_PEX_COUNTERS = (0x20801814) +NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_BUS_FREEZE_PEX_COUNTERS = (0x20801815) +NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS = (0x20801816) +NV2080_CTRL_PEX_MAX_LANES = 16 +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_BUS_PEX_COUNTER_LANE_TYPE = 0x00000000 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SYNC_HDR_CODING_ERR = 0x00000001 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SYNC_HDR_ORDER_ERR = 0x00000002 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_OS_DATA_SEQ_ERR = 0x00000004 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_TSX_DATA_SEQ_ERR = 0x00000008 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SKPOS_LFSR_ERR = 0x00000010 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RX_CLK_FIFO_OVERFLOW = 0x00000020 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_ELASTIC_FIFO_OVERFLOW = 0x00000040 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RCVD_LINK_NUM_ERR = 0x00000080 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RCVD_LANE_NUM_ERR = 0x00000100 +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY = (0x20801817) +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS_MESSAGE_ID = (0x17) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY = (0x20801818) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_BYTES = 0x00000001 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_BYTES = 0x00000002 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_L0 = 0x00000004 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_L0 = 0x00000008 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_L0S = 0x00000010 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_L0S = 0x00000020 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_NON_L0_L0S = 0x00000040 +NV2080_CTRL_PEX_UTIL_MAX_COUNTER_TYPES = 7 +NV2080_CTRL_CMD_BUS_GET_PEX_UTIL_COUNTERS = (0x20801819) +NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_CMD_BUS_CLEAR_PEX_UTIL_COUNTERS = (0x20801820) +NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_BUS_GET_BFD = (0x20801821) +NV2080_CTRL_BUS_GET_BFD_PARAMSARR_MESSAGE_ID = (0x21) +NV2080_CTRL_ASPM_DISABLE_FLAGS_L1_MASK_REGKEY_OVERRIDE = 0x00000000 +NV2080_CTRL_ASPM_DISABLE_FLAGS_OS_RM_MAKES_POLICY_DECISIONS = 0x00000001 +NV2080_CTRL_ASPM_DISABLE_FLAGS_GPU_BEHIND_BRIDGE = 0x00000002 +NV2080_CTRL_ASPM_DISABLE_FLAGS_GPU_UPSTREAM_PORT_L1_UNSUPPORTED = 0x00000003 +NV2080_CTRL_ASPM_DISABLE_FLAGS_GPU_UPSTREAM_PORT_L1_POR_SUPPORTED = 0x00000004 +NV2080_CTRL_ASPM_DISABLE_FLAGS_GPU_UPSTREAM_PORT_L1_POR_MOBILE_ONLY = 0x00000005 +NV2080_CTRL_ASPM_DISABLE_FLAGS_CL_ASPM_L1_CHIPSET_DISABLED = 0x00000006 +NV2080_CTRL_ASPM_DISABLE_FLAGS_CL_ASPM_L1_CHIPSET_ENABLED_MOBILE_ONLY = 0x00000007 +NV2080_CTRL_ASPM_DISABLE_FLAGS_BIF_ENABLE_ASPM_DT_L1 = 0x00000008 +NV2080_CTRL_ASPM_DISABLE_FLAGS_MAX_FLAGS = 9 +NV2080_CTRL_CMD_BUS_GET_ASPM_DISABLE_FLAGS = (0x20801822) +NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS = (0x20801824) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_BUS_GET_NVLINK_PEER_ID_MASK = (0x20801825) +NV2080_CTRL_BUS_MAX_NUM_GPUS = 32 +NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS = (0x20801826) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE = (0x20801827) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_BUS_GET_EOM_STATUS = (0x20801828) +NV2080_CTRL_BUS_MAX_NUM_LANES = 32 +NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS = (0x20801829) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_SYSMEM = 0x0 +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_GPU = 0x1 +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_P2P = 0x2 +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32 = (0, 0) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64 = (1, 1) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32 = (2, 2) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64 = (3, 3) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32 = (4, 4) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64 = (5, 5) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128 = (6, 6) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS = (0x2080182a) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IADD = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IMIN = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IMAX = 2 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_INC = 3 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_DEC = 4 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IAND = 5 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IOR = 6 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IXOR = 7 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_EXCH = 8 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_CAS = 9 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FADD = 10 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FMIN = 11 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FMAX = 12 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_COUNT = 13 +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR = (0, 0) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR = (1, 1) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION = (2, 2) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32 = (3, 3) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64 = (4, 4) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128 = (5, 5) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED = (6, 6) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED = (7, 7) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED_NO = 0 +NV2080_CTRL_CMD_BUS_GET_C2C_INFO = (0x2080182b) +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_BUS_GET_C2C_INFO_REMOTE_TYPE_CPU = 1 +NV2080_CTRL_BUS_GET_C2C_INFO_REMOTE_TYPE_GPU = 2 +NV2080_CTRL_CMD_BUS_SYSMEM_ACCESS = (0x2080182c) +NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING = (0x2080182e) +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_INVALID = 0 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_NVLINK = 1 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_PCIE = 2 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_PCIE_BAR1 = 3 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_C2C = 4 +NV2080_SET_P2P_MAPPING_UUID_LEN = 16 +NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_MESSAGE_ID = (0x2E) +NV2080_CTRL_CMD_BUS_UNSET_P2P_MAPPING = (0x2080182f) +NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS = (0x20801830) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32 = (0, 0) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64 = (1, 1) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32 = (2, 2) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64 = (3, 3) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32 = (4, 4) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64 = (5, 5) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128 = (6, 6) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128_NO = (0x00000000) +NV2080_CTRL_CMD_CE_GET_CAPS = (0x20802a01) +NV2080_CTRL_CE_CAPS_TBL_SIZE = 2 +NV2080_CTRL_CE_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_CE_GET_CAPS_V2 = (0x20802a03) +NV2080_CTRL_CE_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_CE_GET_CE_PCE_MASK = (0x20802a02) +NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_CE_SET_PCE_LCE_CONFIG = (0x20802a04) +NV2080_CTRL_MAX_PCES = 32 +NV2080_CTRL_MAX_GRCES = 4 +NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_CE_UPDATE_PCE_LCE_MAPPINGS = (0x20802a05) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_INVALID_LCE = 0xf +NV2080_CTRL_CMD_CE_UPDATE_CLASS_DB = (0x20802a06) +NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_CE_GET_PHYSICAL_CAPS = (0x20802a07) +NV2080_CTRL_CE_GET_PHYSICAL_CAPS_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_CE_GET_FAULT_METHOD_BUFFER_SIZE = (0x20802a08) +NV2080_CTRL_CMD_CE_GET_HUB_PCE_MASK = (0x20802a09) +NV2080_CTRL_CE_MAX_HSHUBS = 32 +NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_CE_GET_ALL_CAPS = (0x20802a0a) +NV2080_CTRL_MAX_CES = 64 +NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS_MESSAGE_ID = (0xa) +NV2080_CTRL_CMD_CE_GET_ALL_PHYSICAL_CAPS = (0x20802a0b) +NV2080_CTRL_CE_GET_ALL_PHYSICAL_CAPS_PARAMS_MESSAGE_ID = (0xb) +NV2080_CTRL_CMD_CE_GET_LCE_SHIM_INFO = (0x20802a0c) +NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS_MESSAGE_ID = (0xc) +NV2080_CTRL_CMD_CE_UPDATE_PCE_LCE_MAPPINGS_V2 = (0x20802a0d) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS_MESSAGE_ID = (0xd) +NV2080_CTRL_CMD_CE_GET_HUB_PCE_MASK_V2 = (0x20802a0e) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS_MESSAGE_ID = (0xe) +NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE = (0x20802a0f) +NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS_MESSAGE_ID = (0xf) +NV2080_CTRL_CMD_CE_GET_DECOMP_LCE_MASK = (0x20802a11) +NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_CE_IS_DECOMP_LCE_ENABLED = (0x20802a12) +NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_DMA_INVALIDATE_TLB = (0x20802502) +NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS = (0, 0) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO = (1, 1) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY = (2, 2) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE = (3, 3) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB = (4, 4) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV = (5, 5) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG = (6, 6) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD = (7, 7) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION = (8, 8) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON = (9, 9) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS = (10, 10) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR = (11, 11) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR_TRUE = (0x00000001) +NV2080_CTRL_DMA_INFO_INDEX_SYSTEM_ADDRESS_SIZE = (0x000000000) +NV2080_CTRL_DMA_INFO_INDEX_MAX = NV2080_CTRL_DMA_INFO_INDEX_SYSTEM_ADDRESS_SIZE +NV2080_CTRL_CMD_DMA_GET_INFO = (0x20802503) +NV2080_CTRL_DMA_GET_INFO_MAX_ENTRIES = (256) +NV2080_CTRL_DMA_GET_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_DMABUF_EXPORT_OBJECTS_TO_FD = (0x20803a01) +NV2080_CTRL_DMABUF_MAX_HANDLES = 128 +NV2080_CTRL_DMABUF_EXPORT_MAPPING_TYPE_DEFAULT = (0x00000000) +NV2080_CTRL_DMABUF_EXPORT_MAPPING_TYPE_FORCE_PCIE = (0x00000001) +NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_ECC_GET_CLIENT_EXPOSED_COUNTERS = (0x20803400) +NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS_MESSAGE_ID = (0x0) +NV2080_CTRL_CMD_ECC_GET_VOLATILE_COUNTS = (0x20803401) +NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_EVENT_SET_NOTIFICATION = (0x20800301) +NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_DISABLE = (0x00000000) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_SINGLE = (0x00000001) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_REPEAT = (0x00000002) +NV2080_EVENT_DSTATE_XUSB_D0 = (0x00000000) +NV2080_EVENT_DSTATE_XUSB_D3 = (0x00000003) +NV2080_EVENT_DSTATE_XUSB_INVALID = (0xFFFFFFFF) +NV2080_EVENT_DSTATE_PPC_D0 = (0x00000000) +NV2080_EVENT_DSTATE_PPC_D3 = (0x00000003) +NV2080_EVENT_DSTATE_PPC_INVALID = (0xFFFFFFFF) +NV2080_CTRL_CMD_EVENT_SET_TRIGGER = (0x20800302) +NV2080_CTRL_CMD_EVENT_SET_MEMORY_NOTIFIES = (0x20800303) +NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS_MESSAGE_ID = (0x3) +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_NOTIFIED = 0 +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_PENDING = 1 +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_ERROR = 2 +NV2080_CTRL_CMD_EVENT_SET_SEMAPHORE_MEMORY = (0x20800304) +NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_EVENT_SET_GUEST_MSI = (0x20800305) +NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_EVENT_SET_SEMA_MEM_VALIDATION = (0x20800306) +NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_EVENT_SET_TRIGGER_FIFO = (0x20800308) +NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_EVENT_VIDEO_BIND_EVTBUF = (0x20800309) +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_EVENT_RATS_GSP_TRACE_BIND_EVTBUF = (0x2080030a) +NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_FB_INFO_INDEX_TILE_REGION_COUNT = (0x00000000) +NV2080_CTRL_FB_INFO_INDEX_COMPRESSION_SIZE = (0x00000001) +NV2080_CTRL_FB_INFO_INDEX_DRAM_PAGE_STRIDE = (0x00000002) +NV2080_CTRL_FB_INFO_INDEX_TILE_REGION_FREE_COUNT = (0x00000003) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_COUNT = (0x00000004) +NV2080_CTRL_FB_INFO_INDEX_BAR1_SIZE = (0x00000005) +NV2080_CTRL_FB_INFO_INDEX_BANK_SWIZZLE_ALIGNMENT = (0x00000006) +NV2080_CTRL_FB_INFO_INDEX_RAM_SIZE = (0x00000007) +NV2080_CTRL_FB_INFO_INDEX_TOTAL_RAM_SIZE = (0x00000008) +NV2080_CTRL_FB_INFO_INDEX_HEAP_SIZE = (0x00000009) +NV2080_CTRL_FB_INFO_INDEX_MAPPABLE_HEAP_SIZE = (0x0000000A) +NV2080_CTRL_FB_INFO_INDEX_BUS_WIDTH = (0x0000000B) +NV2080_CTRL_FB_INFO_INDEX_RAM_CFG = (0x0000000C) +NV2080_CTRL_FB_INFO_INDEX_RAM_TYPE = (0x0000000D) +NV2080_CTRL_FB_INFO_INDEX_BANK_COUNT = (0x0000000E) +NV2080_CTRL_FB_INFO_INDEX_OVERLAY_OFFSET_ADJUSTMENT = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_SPACE_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_HEAP_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_MAPPBLE_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_EFFECTIVE_BW = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_FB_TAX_SIZE_KB = (0x00000010) +NV2080_CTRL_FB_INFO_INDEX_HEAP_BASE_KB = (0x00000011) +NV2080_CTRL_FB_INFO_INDEX_LARGEST_FREE_REGION_SIZE_KB = (0x00000012) +NV2080_CTRL_FB_INFO_INDEX_LARGEST_FREE_REGION_BASE_KB = (0x00000013) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK = (0x00000014) +NV2080_CTRL_FB_INFO_INDEX_VISTA_RESERVED_HEAP_SIZE = (0x00000015) +NV2080_CTRL_FB_INFO_INDEX_HEAP_FREE = (0x00000016) +NV2080_CTRL_FB_INFO_INDEX_RAM_LOCATION = (0x00000017) +NV2080_CTRL_FB_INFO_INDEX_FB_IS_BROKEN = (0x00000018) +NV2080_CTRL_FB_INFO_INDEX_FBP_COUNT = (0x00000019) +NV2080_CTRL_FB_INFO_INDEX_FBP_MASK = (0x0000001A) +NV2080_CTRL_FB_INFO_INDEX_L2CACHE_SIZE = (0x0000001B) +NV2080_CTRL_FB_INFO_INDEX_MEMORYINFO_VENDOR_ID = (0x0000001C) +NV2080_CTRL_FB_INFO_INDEX_BAR1_AVAIL_SIZE = (0x0000001D) +NV2080_CTRL_FB_INFO_INDEX_HEAP_START = (0x0000001E) +NV2080_CTRL_FB_INFO_INDEX_BAR1_MAX_CONTIGUOUS_AVAIL_SIZE = (0x0000001F) +NV2080_CTRL_FB_INFO_INDEX_USABLE_RAM_SIZE = (0x00000020) +NV2080_CTRL_FB_INFO_INDEX_TRAINIG_2T = (0x00000021) +NV2080_CTRL_FB_INFO_INDEX_LTC_COUNT = (0x00000022) +NV2080_CTRL_FB_INFO_INDEX_LTS_COUNT = (0x00000023) +NV2080_CTRL_FB_INFO_INDEX_L2CACHE_ONLY_MODE = (0x00000024) +NV2080_CTRL_FB_INFO_INDEX_PSEUDO_CHANNEL_MODE = (0x00000025) +NV2080_CTRL_FB_INFO_INDEX_SMOOTHDISP_RSVD_BAR1_SIZE = (0x00000026) +NV2080_CTRL_FB_INFO_INDEX_HEAP_OFFLINE_SIZE = (0x00000027) +NV2080_CTRL_FB_INFO_INDEX_1TO1_COMPTAG_ENABLED = (0x00000028) +NV2080_CTRL_FB_INFO_INDEX_SUSPEND_RESUME_RSVD_SIZE = (0x00000029) +NV2080_CTRL_FB_INFO_INDEX_ALLOW_PAGE_RETIREMENT = (0x0000002A) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK = (0x0000002B) +NV2080_CTRL_FB_INFO_POISON_FUSE_ENABLED = (0x0000002C) +NV2080_CTRL_FB_INFO_FBPA_ECC_ENABLED = (0x0000002D) +NV2080_CTRL_FB_INFO_DYNAMIC_PAGE_OFFLINING_ENABLED = (0x0000002E) +NV2080_CTRL_FB_INFO_INDEX_FORCED_BAR1_64KB_MAPPING_ENABLED = (0x0000002F) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_SIZE = (0x00000030) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_ALIGNMENT = (0x00000031) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_BAR1_MAX_OFFSET_64KB = (0x00000032) +NV2080_CTRL_FB_INFO_INDEX_PROTECTED_MEM_SIZE_TOTAL_KB = (0x00000033) +NV2080_CTRL_FB_INFO_INDEX_PROTECTED_MEM_SIZE_FREE_KB = (0x00000034) +NV2080_CTRL_FB_INFO_INDEX_ECC_STATUS_SIZE = (0x00000035) +NV2080_CTRL_FB_INFO_INDEX_IS_ZERO_FB = (0x00000036) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK_0 = (NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK_1 = (0x00000037) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_0 = (NV2080_CTRL_FB_INFO_INDEX_LTC_MASK) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_1 = (0x00000038) +NV2080_CTRL_FB_INFO_MAX_LIST_SIZE = (0x00000039) +NV2080_CTRL_FB_INFO_INDEX_MAX = (0x38) +NV2080_CTRL_FB_INFO_RAM_TYPE_UNKNOWN = (0x00000000) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDRAM = (0x00000001) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR1 = (0x00000002) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR2 = (0x00000003) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR2 = NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR2 +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR2 = (0x00000004) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR3 = (0x00000005) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR4 = (0x00000006) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR3 = (0x00000007) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR3 = NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR3 +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR5 = (0x00000008) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR2 = (0x00000009) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR4 = (0x0000000C) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR4 = (0x0000000D) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM1 = (0x0000000E) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM2 = (0x0000000F) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR5X = (0x00000010) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR6 = (0x00000011) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR6X = (0x00000012) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR5 = (0x00000013) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM3 = (0x00000014) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR7 = (0x00000015) +NV2080_CTRL_FB_INFO_RAM_LOCATION_GPU_DEDICATED = (0x00000000) +NV2080_CTRL_FB_INFO_RAM_LOCATION_SYS_SHARED = (0x00000001) +NV2080_CTRL_FB_INFO_RAM_LOCATION_SYS_DEDICATED = (0x00000002) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_SAMSUNG = (0x00000001) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_QIMONDA = (0x00000002) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ELPIDA = (0x00000003) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ETRON = (0x00000004) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_NANYA = (0x00000005) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_HYNIX = (0x00000006) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_MOSEL = (0x00000007) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_WINBOND = (0x00000008) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ESMT = (0x00000009) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_MICRON = (0x0000000F) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_UNKNOWN = (0xFFFFFFFF) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_UNSUPPORTED = (0x00000000) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_DISABLED = (0x00000001) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_ENABLED = (0x00000002) +NV2080_CTRL_CMD_FB_GET_INFO = (0x20801301) +NV2080_CTRL_FB_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_FB_GET_INFO_V2 = (0x20801303) +NV2080_CTRL_FB_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_FB_GET_BAR1_OFFSET = (0x20801310) +NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_CMD_FB_GET_CALIBRATION_LOCK_FAILED = (0x2080130c) +NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_FB_GET_CAL_FLAG_NONE = (0x00000000) +NV2080_CTRL_CMD_FB_GET_CAL_FLAG_RESET = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL = (0x2080130d) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK = (0, 0) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE = (1, 1) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH = (2, 2) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE = (0x2080130e) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_MAX_ADDRESSES = 500 +NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE = (1, 0) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_VIDEO_MEMORY = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_SYSTEM_MEMORY = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_PEER_MEMORY = (0x00000002) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK = (2, 2) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK_YES = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE = (3, 3) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE_YES = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE = (4, 4) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE_ADDRESS_ARRAY = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE_FULL_CACHE = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH = (5, 5) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH_YES = (0x00000001) +NV2080_CTRL_CMD_FB_IS_KIND = (0x20801313) +NV2080_CTRL_FB_IS_KIND_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_FB_IS_KIND_OPERATION_SUPPORTED = (0x00000000) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE = (0x00000001) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_1 = (0x00000002) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_2 = (0x00000003) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_4 = (0x00000004) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC = (0x00000005) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_1 = (0x00000006) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_2 = (0x00000007) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_4 = (0x00000008) +NV2080_CTRL_CMD_FB_GET_GPU_CACHE_INFO = (0x20801315) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_POWER_STATE_ENABLED = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_POWER_STATE_DISABLED = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_WRITE_MODE_WRITETHROUGH = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_WRITE_MODE_WRITEBACK = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_BYPASS_MODE_DISABLED = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_BYPASS_MODE_ENABLED = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_FULL = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_TRANSITIONING = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_REDUCED = (0x00000002) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_ZERO_CACHE = (0x00000003) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO = (0x20801320) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_MEM_TYPES = 17 +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_MAX_ENTRIES = 16 +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FB_OFFLINE_PAGES = (0x20801321) +NV2080_CTRL_FB_OFFLINED_PAGES_MAX_PAGES = (0x00000040) +NV2080_CTRL_FB_OFFLINED_PAGES_INVALID_ADDRESS = (0xffffffffffffffff) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_4K = (0x00000000) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_64K = (0x00000001) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_128K = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_MULTIPLE_SBE = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_DBE = (0x00000004) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_OK = (0x00000000) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_PENDING_RETIREMENT = (0x00000001) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_BLACKLISTING_FAILED = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_TABLE_FULL = (0x00000003) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_INTERNAL_ERROR = (0x00000004) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_MULTIPLE_SBE = NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_MULTIPLE_SBE +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DBE = NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_DBE +NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_FB_GET_OFFLINED_PAGES = (0x20801322) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE = (0, 0) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE_FALSE = 0 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE_TRUE = 1 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE = (1, 1) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE_FALSE = 0 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE_TRUE = 1 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION = (0x20801325) +NV2080_CTRL_CMD_FB_ACR_CLIENT_ID = 2 +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_FB_CLEAR_OFFLINED_PAGES = (0x20801326) +NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO = (0x20801327) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_FB_GET_LTC_INFO_FOR_FBP = (0x20801328) +NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT = (0x20801329) +NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS = (0x2080132a) +NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS = (0x2080132b) +NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB = (0x2080132c) +NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB = (0x2080132d) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1 = (0x20801335) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF = (0x20801336) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_FB_CBC_OP = (0x20801337) +NV2080_CTRL_CMD_FB_CBC_OP_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_FB_GET_CTAGS_FOR_CBC_EVICTION = (0x20801338) +NV2080_MAX_CTAGS_FOR_CBC_EVICTION = 0x7F +NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE = (0x20801339) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_FB_FREE_TILE = (0x2080133a) +NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION = (0x2080133b) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS_MESSAGE_ID = (0x3B) +NV2080_CTRL_CMD_FB_GET_CLI_MANAGED_OFFLINED_PAGES = (0x2080133c) +NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x3C) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO = (0x2080133d) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS_MESSAGE_ID = (0x3D) +NV2080_CTRL_CMD_FB_SET_RRD = (0x2080133e) +NV2080_CTRL_FB_SET_RRD_PARAMS_MESSAGE_ID = (0x3E) +NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE = (0xff) +NV2080_CTRL_CMD_FB_SET_READ_LIMIT = (0x2080133f) +NV2080_CTRL_FB_SET_READ_LIMIT_RESET_VALUE = NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE +NV2080_CTRL_FB_SET_READ_LIMIT_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_FB_SET_WRITE_LIMIT = (0x20801340) +NV2080_CTRL_FB_SET_WRITE_LIMIT_RESET_VALUE = NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE +NV2080_CTRL_FB_SET_WRITE_LIMIT_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_FB_PATCH_PBR_FOR_MINING = (0x20801341) +NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_CMD_FB_GET_MEM_ALIGNMENT = (0x20801342) +NV2080_CTRL_FB_GET_MEM_ALIGNMENT_MAX_BANKS = (4) +NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR = (0x20801343) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING = (0, 0) +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_FALSE = 0 +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_TRUE = 1 +NV2080_CTRL_FB_REMAPPED_ROW_SOURCE_SBE_FIELD = (0x00000002) +NV2080_CTRL_FB_REMAPPED_ROW_SOURCE_DBE_FIELD = (0x00000003) +NV2080_CTRL_FB_REMAPPED_ROWS_MAX_ROWS = (0x00000200) +NV2080_CTRL_CMD_FB_GET_REMAPPED_ROWS = (0x20801344) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING_FALSE = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_FALSE +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING_TRUE = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_TRUE +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE = (1, 1) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE_FALSE = 0 +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE_TRUE = 1 +NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_FB_FS_INFO_MAX_QUERY_SIZE = 24 +NV2080_CTRL_FB_FS_INFO_INVALID_QUERY = 0x0 +NV2080_CTRL_FB_FS_INFO_FBP_MASK = 0x1 +NV2080_CTRL_FB_FS_INFO_LTC_MASK = 0x2 +NV2080_CTRL_FB_FS_INFO_LTS_MASK = 0x3 +NV2080_CTRL_FB_FS_INFO_FBPA_MASK = 0x4 +NV2080_CTRL_FB_FS_INFO_ROP_MASK = 0x5 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK = 0x6 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK = 0x7 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK = 0x8 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK = 0x9 +NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK = 0xA +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK = 0xB +NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP = 0xC +NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK = 0xD +NV2080_CTRL_FB_FS_INFO_PAC_MASK = 0xE +NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK = 0xF +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK = 0x10 +NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK = 0x11 +NV2080_CTRL_FB_FS_INFO_MAX_QUERIES = 120 +NV2080_CTRL_FB_GET_FS_INFO_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_CMD_FB_GET_FS_INFO = (0x20801346) +NV2080_CTRL_FB_HISTOGRAM_IDX_NO_REMAPPED_ROWS = (0x0) +NV2080_CTRL_FB_HISTOGRAM_IDX_SINGLE_REMAPPED_ROW = (0x1) +NV2080_CTRL_FB_HISTOGRAM_IDX_MIXED_REMAPPED_REMAINING_ROWS = (0x2) +NV2080_CTRL_FB_HISTOGRAM_IDX_SINGLE_REMAINING_ROW = (0x3) +NV2080_CTRL_FB_HISTOGRAM_IDX_MAX_REMAPPED_ROWS = (0x4) +NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_FB_GET_ROW_REMAPPER_HISTOGRAM = (0x20801347) +NV2080_CTRL_CMD_FB_GET_DYNAMIC_OFFLINED_PAGES = (0x20801348) +NV2080_CTRL_FB_DYNAMIC_BLACKLIST_MAX_PAGES = 512 +NV2080_CTRL_FB_DYNAMIC_BLACKLIST_MAX_ENTRIES = 64 +NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x48) +NV2080_CTRL_FB_DYNAMIC_BLACKLISTED_PAGES_SOURCE_INVALID = (0x00000000) +NV2080_CTRL_FB_DYNAMIC_BLACKLISTED_PAGES_SOURCE_DPR_DBE = (0x00000001) +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO = (0x20801349) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE = (4, 0) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE_SYSMEM = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE_VIDMEM = 1 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED = (5, 5) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED_FALSE = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED_TRUE = 1 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER = (6, 6) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER_FALSE = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER_TRUE = 1 +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS_MESSAGE_ID = (0x49) +NV2080_CTRL_CMD_FB_UPDATE_NUMA_STATUS = (0x20801350) +NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_FB_GET_NUMA_INFO = (0x20801351) +NV2080_CTRL_FB_NUMA_INFO_MAX_OFFLINE_ADDRESSES = 64 +NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_CMD_FB_GET_SEMAPHORE_SURFACE_LAYOUT = (0x20801352) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_CAPS_MONITORED_FENCE_SUPPORTED = (0x00000001) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_CAPS_64BIT_SEMAPHORES_SUPPORTED = (0x00000002) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS_MESSAGE_ID = (0x52) +NV2080_CTRL_CMD_GMMU_COMMIT_TLB_INVALIDATE = (0x20801353) +NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_FB_STATS_MAX_OWNER = 200 +NV2080_CTRL_CMD_FB_STATS_GET = (0x2080132a) +NV2080_CTRL_CMD_FB_STATS_GET_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_CMD_FB_GET_STATIC_BAR1_INFO = (0x20801354) +NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION = (0x20801355) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_DISABLED = (0x00000000) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_ENABLED = (0x00000001) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_CMD_FB_SET_DRAM_ENCRYPTION_CONFIGURATION = (0x20801356) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_DISABLE = (0x00000000) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_ENABLE = (0x00000001) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_CMD_FB_GET_STATUS = (0x20801357) +NV2080_CTRL_FB_STATUS_FAILED = (0x00000000) +NV2080_CTRL_FB_STATUS_READY = (0x00000001) +NV2080_CTRL_FB_STATUS_PENDING = (0x00000002) +NV2080_CTRL_FB_STATUS_NOT_APPLICABLE = (0x00000003) +NV2080_CTRL_FB_GET_STATUS_PARAMS_MESSAGE_ID = (0x57) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT = (0x20801358) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT_DISABLED = (0x00000000) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT_ENABLED = (0x00000001) +NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS_MESSAGE_ID = (0x58) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS = (0x20801359) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS_DISABLED = (0x00000000) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS_ENABLED = (0x00000001) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS_MESSAGE_ID = (0x59) +NV2080_CTRL_CMD_SET_GPFIFO = (0x20801102) +NV2080_CTRL_CMD_SET_GPFIFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_FIFO_BIND_ENGINES_MAX_CHANNELS = (16) +NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_FIFO_BIND_ENGINES = (0x20801103) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES = (0x20801104) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_FLAGS_ERROR_ON_STUCK_SEMAPHORE = (0, 0) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_FLAGS_ERROR_ON_STUCK_SEMAPHORE_FALSE = (0x00000000) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_FLAGS_ERROR_ON_STUCK_SEMAPHORE_TRUE = (0x00000001) +NV2080_CTRL_CMD_FIFO_GET_PHYSICAL_CHANNEL_COUNT = (0x20801108) +NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_FIFO_INFO_INDEX_INSTANCE_TOTAL = (0x000000000) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNEL_GROUPS = (0x000000001) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNELS_PER_GROUP = (0x000000002) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_SUBCONTEXT_PER_GROUP = (0x000000003) +NV2080_CTRL_FIFO_INFO_INDEX_BAR1_USERD_START_OFFSET = (0x000000004) +NV2080_CTRL_FIFO_INFO_INDEX_DEFAULT_CHANNEL_TIMESLICE = (0x000000005) +NV2080_CTRL_FIFO_INFO_INDEX_CHANNEL_GROUPS_IN_USE = (0x000000006) +NV2080_CTRL_FIFO_INFO_INDEX_IS_PER_RUNLIST_CHANNEL_RAM_SUPPORTED = (0x000000007) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNEL_GROUPS_PER_ENGINE = (0x000000008) +NV2080_CTRL_FIFO_INFO_INDEX_CHANNEL_GROUPS_IN_USE_PER_ENGINE = (0x000000009) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_LOWER_SUBCONTEXT = (0x00000000a) +NV2080_CTRL_FIFO_INFO_INDEX_MAX = NV2080_CTRL_FIFO_INFO_INDEX_MAX_LOWER_SUBCONTEXT +NV2080_CTRL_FIFO_GET_INFO_USERD_OFFSET_SHIFT = (12) +NV2080_CTRL_CMD_FIFO_GET_INFO = (0x20801109) +NV2080_CTRL_FIFO_GET_INFO_MAX_ENTRIES = (256) +NV2080_CTRL_FIFO_GET_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_FIFO_CHANNEL_PREEMPTIVE_REMOVAL = (0x2080110a) +NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS = (0x2080110b) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_MAX_ENTRIES = (64) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_FIFO_DISABLE_CHANNEL_FALSE = (0x00000000) +NV2080_CTRL_FIFO_DISABLE_CHANNEL_TRUE = (0x00000001) +NV2080_CTRL_FIFO_ONLY_DISABLE_SCHEDULING_FALSE = (0x00000000) +NV2080_CTRL_FIFO_ONLY_DISABLE_SCHEDULING_TRUE = (0x00000001) +NV2080_CTRL_FIFO_GET_CHANNEL_MEM_INFO_MAX_COUNT = 0x2 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO = (0x2080110c) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_INVALID = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_VIDMEM = 0x00000001 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_SYSMEM_COH = 0x00000002 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_SYSMEM_NCOH = 0x00000003 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION = (0x2080110d) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_APERTURE_VIDMEM = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_APERTURE_SYSMEM = 0x00000001 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_CACHED = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_UNCACHED = 0X00000001 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_WRITECOMBINED = 0X00000002 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_UNKNOWN = 0 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_OTHER = 1 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_BEST_EFFORT = 2 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_EQUAL_SHARE = 3 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_FIXED_SHARE = 4 +NV2080_CTRL_CMD_SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT = 3 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_DEFAULT = 0 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_DISABLE = 1 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_ENABLE = 2 +NV2080_CTRL_CMD_FIFO_OBJSCHED_SW_GET_LOG = (0x2080110e) +NV2080_CTRL_FIFO_OBJSCHED_SW_COUNT = 32 +NV2080_CTRL_FIFO_OBJSCHED_SW_NCOUNTERS = 8 +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRIES = 200 +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_FIFO_GET_DEVICE_INFO_TABLE = (0x20801112) +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_MAX_DEVICES = 256 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_MAX_ENTRIES = 32 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_DATA_TYPES = 16 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_MAX_PBDMA = 2 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_MAX_NAME_LEN = 16 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT = (0x20801113) +NV2080_CTRL_FIFO_CLEAR_FAULTED_BIT_FAULT_TYPE_ENGINE = 0x00000001 +NV2080_CTRL_FIFO_CLEAR_FAULTED_BIT_FAULT_TYPE_PBDMA = 0x00000002 +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY = (0x20801115) +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_DEFAULT = 0x0 +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_CHANNEL_INTERLEAVED = 0x1 +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_CHANNEL_INTERLEAVED_WDDM = 0x2 +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE = (0, 0) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE_FALSE = (0x00000000) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE_TRUE = (0x00000001) +NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_FIFO_UPDATE_CHANNEL_INFO = (0x20801116) +NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_CMD_FIFO_DISABLE_USERMODE_CHANNELS = (0x20801117) +NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS_MESSAGE_ID = (0x17) +NV2080_CTRL_CMD_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB = (0x20801118) +NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_FIFO_GET_ALLOCATED_CHANNELS = (0x20801119) +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_MAX_CHANNELS = 4096 +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION = (0x2080111a) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_MAX_ENTRIES = (64) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS_MESSAGE_ID = (0x1A) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2 = (0x2080111b) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS_MESSAGE_ID = (0x1B) +NV2080_CTRL_CMD_FIFO_OBJSCHED_GET_STATE = (0x20801120) +NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FIFO_OBJSCHED_SET_STATE = (0x20801121) +NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_FIFO_OBJSCHED_GET_CAPS = (0x20801122) +NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_FIFO_MAX_CHANNELS_PER_TSG = 128 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO = (0x20801123) +NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_FIFO_QUERY_CHANNEL_UNIQUE_ID = (0x20801124) +NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_FLA_RANGE = (0x20803501) +NV2080_CTRL_FLA_RANGE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_NONE = 0x00000000 +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_INITIALIZE = NVBIT(0) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_DESTROY = NVBIT(1) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_HOST_MANAGED_VAS_INITIALIZE = NVBIT(2) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_HOST_MANAGED_VAS_DESTROY = NVBIT(3) +NV2080_CTRL_CMD_FLA_SETUP_INSTANCE_MEM_BLOCK = (0x20803502) +NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_FLA_GET_RANGE = (0x20803503) +NV2080_CTRL_FLA_GET_RANGE_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_FLA_GET_FABRIC_MEM_STATS = (0x20803504) +NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_MESSAGE_ID = (0x4) +FALCON_ID_PMU = (NV2080_ENGINE_TYPE_PMU) +FALCON_ID_DPU = (NV2080_ENGINE_TYPE_DPU) +FALCON_ID_SEC2 = (NV2080_ENGINE_TYPE_SEC2) +FALCON_ID_FBFLCN = (NV2080_ENGINE_TYPE_FBFLCN) +NV2080_CTRL_CMD_FLCN_GET_DMEM_USAGE = (0x20803101) +NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_FLCN_NVOS_INST_EVT_RSVD_DO_NOT_USE = 0x00 +NV2080_CTRL_FLCN_NVOS_INST_EVT_CTXSW_END = 0x01 +NV2080_CTRL_FLCN_NVOS_INST_EVT_HW_IRQ_BEGIN = 0x02 +NV2080_CTRL_FLCN_NVOS_INST_EVT_HW_IRQ_END = 0x03 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TIMER_TICK = 0x04 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_BEGIN = 0x05 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_END = 0x06 +NV2080_CTRL_FLCN_NVOS_INST_EVT_RM_QUEUE_LATENCY = 0x07 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_SPECIAL_EVENT = 0x08 +NV2080_CTRL_FLCN_NVOS_INST_EVT_UNUSED_0 = 0x09 +NV2080_CTRL_FLCN_NVOS_INST_EVT_DMA_END = 0x0A +NV2080_CTRL_FLCN_NVOS_INST_EVT_GENERIC_BEGIN = 0x0B +NV2080_CTRL_FLCN_NVOS_INST_EVT_GENERIC_END = 0x0C +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_LATENCY = 0x0D +NV2080_CTRL_FLCN_NVOS_INST_INVALID_TASK_ID = 0xFF +NV2080_CTRL_CMD_FLCN_GET_ENGINE_ARCH = (0x20803118) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_DEFAULT = 0x0 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_FALCON = 0x1 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_RISCV = 0x2 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_RISCV_EB = 0x3 +NV2080_CTRL_FLCN_USTREAMER_EVENT_COMM_FLAG = (31, 31) +NV2080_CTRL_FLCN_USTREAMER_EVENT_COMM_HEAD = (30, 30) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_VARIABLE = (29, 29) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EXTEND = (28, 28) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTID_DRF_EXTENT = (27) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTID_DRF_BASE = (20) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTIDCOMPACT_DRF_EXTENT = (28) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTIDCOMPACT_DRF_BASE = (24) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_LENGTH = (19, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOAD = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT = (23, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_HEAD_TIME = (29, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_DATA_PAYLOAD = (30, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON = (10, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_YIELD = 0x0 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_INT0 = 0x1 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_TIMER_TICK = 0x2 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_QUEUE_BLOCK = 0x3 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_DMA_SUSPENDED = 0x4 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_ODP_MISS_COUNT = (23, 11) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TIMER_TICK_TIME_SLIP = (23, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_UNIT_ID = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_EVENT_TYPE = (23, 16) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_CALLBACK_ID = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_RPC_FUNC = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_RPC_FUNC_BOBJ_CMD_BASE = 0xF0 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_CLASS_ID = (23, 16) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_RM_QUEUE_LATENCY_SHIFT = 10 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID = (23, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID_RESERVED = 0x000000 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID_CB_ENQUEUE_FAIL = 0x000001 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_LATENCY_SHIFT = 6 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID = (11, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID_INVALID = 0x000 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID_VF_SWITCH_TOTAL = 0x001 +NV2080_CTRL_FLCN_USTREAMER_FEATURE_DEFAULT = 0 +NV2080_CTRL_FLCN_USTREAMER_FEATURE_PMUMON = 1 +NV2080_CTRL_FLCN_USTREAMER_FEATURE__COUNT = 2 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH = (0, 0) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH = (1, 1) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH = (2, 2) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_THRESHOLD = (31, 8) +NV2080_CTRL_FLCN_USTREAMER_NUM_EVT_TYPES_COMPACT = (0x20) +NV2080_CTRL_FLCN_USTREAMER_NUM_EVT_TYPES = (0x120) +NV2080_CTRL_FLCN_USTREAMER_MASK_SIZE_BYTES = (0x24) +NV2080_CTRL_CMD_FLCN_USTREAMER_QUEUE_INFO = (0x20803120) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FLCN_USTREAMER_CONTROL_GET = (0x20803122) +NV2080_CTRL_CMD_FLCN_USTREAMER_CONTROL_SET = (0x20803123) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_GET_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_SET_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_FLCN_GET_CTX_BUFFER_INFO = (0x20803124) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_FLCN_GET_CTX_BUFFER_SIZE = (0x20803125) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_INTERNAL_GPIO_PROGRAM_DIRECTION = (0x20802300) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS_MESSAGE_ID = (0x00) +NV2080_CTRL_CMD_INTERNAL_GPIO_PROGRAM_OUTPUT = (0x20802301) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS_MESSAGE_ID = (0x01) +NV2080_CTRL_CMD_INTERNAL_GPIO_READ_INPUT = (0x20802302) +NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS_MESSAGE_ID = (0x02) +NV2080_CTRL_CMD_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION = (0x20802303) +NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS_MESSAGE_ID = (0x03) +NV_GRID_LICENSE_INFO_MAX_LENGTH = (128) +NV_GRID_LICENSE_FEATURE_VPC_EDITION = "GRID-Virtual-PC,2.0;Quadro-Virtual-DWS,5.0;GRID-Virtual-WS,2.0;GRID-Virtual-WS-Ext,2.0" +NV_GRID_LICENSE_FEATURE_VAPPS_EDITION = "GRID-Virtual-Apps,3.0" +NV_GRID_LICENSE_FEATURE_VIRTUAL_WORKSTATION_EDITION = "Quadro-Virtual-DWS,5.0;GRID-Virtual-WS,2.0;GRID-Virtual-WS-Ext,2.0" +NV_GRID_LICENSE_FEATURE_GAMING_EDITION = "GRID-vGaming,8.0" +NV_GRID_LICENSE_FEATURE_COMPUTE_EDITION = "NVIDIA-vComputeServer,9.0" +NV_GRID_LICENSED_PRODUCT_VWS = "NVIDIA RTX Virtual Workstation" +NV_GRID_LICENSED_PRODUCT_GAMING = "NVIDIA Cloud Gaming" +NV_GRID_LICENSED_PRODUCT_VPC = "NVIDIA Virtual PC" +NV_GRID_LICENSED_PRODUCT_VAPPS = "NVIDIA Virtual Applications" +NV_GRID_LICENSED_PRODUCT_COMPUTE = "NVIDIA Virtual Compute Server" +NV2080_CTRL_GPU_INFO_INDEX_INDEX = (23, 0) +NV2080_CTRL_GPU_INFO_INDEX_ECID_LO32 = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_ECID_HI32 = (0x00000002) +NV2080_CTRL_GPU_INFO_INDEX_MINOR_REVISION_EXT = (0x00000004) +NV2080_CTRL_GPU_INFO_INDEX_NETLIST_REV0 = (0x00000012) +NV2080_CTRL_GPU_INFO_INDEX_NETLIST_REV1 = (0x00000013) +NV2080_CTRL_GPU_INFO_INDEX_ECID_EXTENDED = (0x0000001b) +NV2080_CTRL_GPU_INFO_INDEX_SYSMEM_ACCESS = (0x0000001f) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD = (0x00000022) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE = (0x00000025) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED = (0x00000027) +NV2080_CTRL_GPU_INFO_INDEX_NVSWITCH_PROXY_DETECTED = (0x00000028) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT = (0x00000029) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SMC_MODE = (0x0000002a) +NV2080_CTRL_GPU_INFO_INDEX_SPLIT_VAS_MGMT_SERVER_CLIENT_RM = (0x0000002b) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SM_VERSION = (0x0000002c) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY = (0x0000002d) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM = (0x0000002f) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY = (0x00000030) +NV2080_CTRL_GPU_INFO_INDEX_NVENC_STATS_REPORTING_STATE = (0x00000031) +NV2080_CTRL_GPU_INFO_INDEX_4K_PAGE_ISOLATION_REQUIRED = (0x00000033) +NV2080_CTRL_GPU_INFO_INDEX_DISPLAY_ENABLED = (0x00000034) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED = (0x00000035) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY = (0x00000036) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY = (0x00000037) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY = (0x0000003a) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY = (0x0000003b) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU = (0x0000003c) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY = (0x0000003d) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED = (0x0000003f) +NV2080_CTRL_GPU_INFO_MAX_LIST_SIZE = (0x00000041) +NV2080_CTRL_GPU_INFO_INDEX_GROUP_ID = (30, 24) +NV2080_CTRL_GPU_INFO_INDEX_RESERVED = (31, 31) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_NONE = (0x00000000) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_P = (0x00000001) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_V = (0x00000002) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_PV = (0x00000003) +NV2080_CTRL_GPU_INFO_SYSMEM_ACCESS_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_SYSMEM_ACCESS_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_NVSWITCH_PROXY_DETECTED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_NVSWITCH_PROXY_DETECTED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_UNSUPPORTED = (0x00000000) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_DISABLED = (0x00000002) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_ENABLE_PENDING = (0x00000003) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_DISABLE_PENDING = (0x00000004) +NV2080_CTRL_GPU_INFO_SPLIT_VAS_MGMT_SERVER_CLIENT_RM_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_SPLIT_VAS_MGMT_SERVER_CLIENT_RM_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_NOT_SUPPORTED = (0x00000002) +NV2080_CTRL_GPU_INFO_INDEX_4K_PAGE_ISOLATION_REQUIRED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_4K_PAGE_ISOLATION_REQUIRED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_DISPLAY_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_DISPLAY_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_PEERID = (31, 1) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_CMD_GPU_GET_INFO = (0x20800101) +NV2080_CTRL_GPU_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_GPU_GET_INFO_V2 = (0x20800102) +NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_GPU_GET_NAME_STRING = (0x20800110) +NV2080_GPU_MAX_NAME_STRING_LENGTH = (0x0000040) +NV2080_CTRL_GPU_GET_NAME_STRING_FLAGS_TYPE = (31, 0) +NV2080_CTRL_GPU_GET_NAME_STRING_FLAGS_TYPE_ASCII = (0x00000000) +NV2080_CTRL_GPU_GET_NAME_STRING_FLAGS_TYPE_UNICODE = (0x00000001) +NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_CMD_GPU_GET_SHORT_NAME_STRING = (0x20800111) +NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GPU_SET_POWER = (0x20800112) +NV2080_CTRL_GPU_SET_POWER_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_0 = (0x00000000) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_1 = (0x00000001) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_2 = (0x00000002) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_3 = (0x00000003) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_4 = (0x00000004) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_7 = (0x00000007) +NV2080_CTRL_CMD_GPU_GET_SDM = (0x20800118) +NV2080_CTRL_GPU_GET_SDM_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_GPU_SET_SDM = (0x20800120) +NV2080_CTRL_GPU_SET_SDM_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_GPU_GET_SIMULATION_INFO = (0x20800119) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_NONE = (0x00000000) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_MODS_AMODEL = (0x00000001) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_LIVE_AMODEL = (0x00000002) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_FMODEL = (0x00000003) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_RTL = (0x00000004) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_EMU = (0x00000005) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_EMU_LOW_POWER = (0x00000006) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA = (0x00000007) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA_RTL = (0x00000008) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA_FMODEL = (0x00000009) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_UNKNOWN = (0xFFFFFFFF) +NV2080_CTRL_GPU_REG_OP_READ_32 = (0x00000000) +NV2080_CTRL_GPU_REG_OP_WRITE_32 = (0x00000001) +NV2080_CTRL_GPU_REG_OP_READ_64 = (0x00000002) +NV2080_CTRL_GPU_REG_OP_WRITE_64 = (0x00000003) +NV2080_CTRL_GPU_REG_OP_READ_08 = (0x00000004) +NV2080_CTRL_GPU_REG_OP_WRITE_08 = (0x00000005) +NV2080_CTRL_GPU_REG_OP_TYPE_GLOBAL = (0x00000000) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX = (0x00000001) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_TPC = (0x00000002) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_SM = (0x00000004) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_CROP = (0x00000008) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_ZROP = (0x00000010) +NV2080_CTRL_GPU_REG_OP_TYPE_FB = (0x00000020) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_QUAD = (0x00000040) +NV2080_CTRL_GPU_REG_OP_TYPE_DEVICE = (0x00000080) +NV2080_CTRL_GPU_REG_OP_STATUS_SUCCESS = (0x00) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_OP = (0x01) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_TYPE = (0x02) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_OFFSET = (0x04) +NV2080_CTRL_GPU_REG_OP_STATUS_UNSUPPORTED_OP = (0x08) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_MASK = (0x10) +NV2080_CTRL_GPU_REG_OP_STATUS_NOACCESS = (0x20) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS = (0x20800122) +NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_GPU_GET_ENGINES = (0x20800123) +NV2080_CTRL_GPU_GET_ENGINES_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_GPU_GET_ENGINES_V2 = (0x20800170) +NV2080_GPU_MAX_ENGINES_LIST_SIZE = 0x54 +NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS_MESSAGE_ID = (0x70) +NV2080_CTRL_CMD_GPU_GET_ENGINE_CLASSLIST = (0x20800124) +NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_GPU_GET_ENGINE_FAULT_INFO = (0x20800125) +NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_GPU_QUERY_MODE = (0x20800128) +NV2080_CTRL_GPU_QUERY_MODE_UNKNOWN_MODE = (0x00000000) +NV2080_CTRL_GPU_QUERY_MODE_GRAPHICS_MODE = (0x00000001) +NV2080_CTRL_GPU_QUERY_MODE_COMPUTE_MODE = (0x00000002) +NV2080_CTRL_GPU_QUERY_MODE_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_MAIN = 0 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PM = 1 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PATCH = 2 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_BUFFER_BUNDLE_CB = 3 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PAGEPOOL = 4 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_ATTRIBUTE_CB = 5 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_RTV_CB_GLOBAL = 6 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GFXP_POOL = 7 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GFXP_CTRL_BLK = 8 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_FECS_EVENT = 9 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PRIV_ACCESS_MAP = 10 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_UNRESTRICTED_PRIV_ACCESS_MAP = 11 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GLOBAL_PRIV_ACCESS_MAP = 12 +NV2080_CTRL_GPU_PROMOTE_CONTEXT_MAX_ENTRIES = 16 +NV2080_CTRL_CMD_GPU_PROMOTE_CTX = (0x2080012b) +NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_GPU_EVICT_CTX = (0x2080012c) +NV2080_CTRL_GPU_EVICT_CTX_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_GPU_INITIALIZE_CTX = (0x2080012d) +NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE = (1, 0) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_VIDMEM = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_COH_SYS = (0x00000001) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_NCOH_SYS = (0x00000002) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE = (2, 2) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE_YES = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE_NO = (0x00000001) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX = (3, 3) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX_NO = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX_YES = (0x00000001) +NV2080_CTRL_CMD_GPU_QUERY_ECC_INTR = (0x2080012e) +NV2080_CTRL_CMD_GPU_QUERY_ECC_STATUS = (0x2080012f) +NV2080_CTRL_GPU_ECC_UNIT_GSP = (0x0000001D) +NV2080_CTRL_GPU_ECC_UNIT_COUNT = (0x00000024) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE = (0, 0) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE_FILTERED = (0x00000000) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE_RAW = (0x00000001) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_FALSE = 0 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_TRUE = 1 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_INDETERMINATE = 2 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_GPU_SET_COMPUTE_MODE_RULES = (0x20800130) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_NONE = (0x00000000) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_EXCLUSIVE_COMPUTE = (0x00000001) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_COMPUTE_PROHIBITED = (0x00000002) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_EXCLUSIVE_COMPUTE_PROCESS = (0x00000003) +NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_CMD_GPU_QUERY_COMPUTE_MODE_RULES = (0x20800131) +NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_GPU_QUERY_ECC_CONFIGURATION = (0x20800133) +NV2080_CTRL_GPU_ECC_CONFIGURATION_DISABLED = (0x00000000) +NV2080_CTRL_GPU_ECC_CONFIGURATION_ENABLED = (0x00000001) +NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_GPU_SET_ECC_CONFIGURATION = (0x20800134) +NV2080_CTRL_GPU_ECC_CONFIGURATION_DISABLE = (0x00000000) +NV2080_CTRL_GPU_ECC_CONFIGURATION_ENABLE = (0x00000001) +NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_GPU_RESET_ECC_ERROR_STATUS = (0x20800136) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_NONE = (0x00000000) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_VOLATILE = (0x00000001) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_AGGREGATE = (0x00000002) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE = (0, 0) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE_FALSE = 0 +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE_TRUE = 1 +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_GPU_GET_FERMI_GPC_INFO = (0x20800137) +NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_GPU_GET_FERMI_TPC_INFO = (0x20800138) +NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_GPU_GET_FERMI_ZCULL_INFO = (0x20800139) +NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_GPU_GET_OEM_BOARD_INFO = (0x2080013f) +NV2080_GPU_MAX_MARKETING_NAME_LENGTH = (0x00000018) +NV2080_GPU_MAX_SERIAL_NUMBER_LENGTH = (0x00000010) +NV2080_GPU_MAX_MEMORY_PART_ID_LENGTH = (0x00000014) +NV2080_GPU_MAX_MEMORY_DATE_CODE_LENGTH = (0x00000006) +NV2080_GPU_MAX_PRODUCT_PART_NUMBER_LENGTH = (0x00000014) +NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_GPU_GET_ID = (0x20800142) +NV2080_CTRL_GPU_GET_ID_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_GPU_SET_GPU_DEBUG_MODE = (0x20800143) +NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_GPU_DEBUG_MODE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_DEBUG_MODE_DISABLED = (0x00000002) +NV2080_CTRL_CMD_GPU_GET_GPU_DEBUG_MODE = (0x20800144) +NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_GPU_GET_ENGINE_PARTNERLIST = (0x20800147) +NV2080_CTRL_GPU_MAX_ENGINE_PARTNERS = (0x00000020) +NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_GPU_GET_GID_INFO = (0x2080014a) +NV2080_GPU_MAX_GID_LENGTH = (0x000000100) +NV2080_GPU_MAX_SHA1_BINARY_GID_LENGTH = (0x000000010) +NV2080_CTRL_GPU_GET_GID_INFO_PARAMS_MESSAGE_ID = (0x4A) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT = (1, 0) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT_ASCII = (0x00000000) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT_BINARY = (0x00000002) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_TYPE = (2, 2) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_TYPE_SHA1 = (0x00000000) +NV2080_CTRL_CMD_GPU_GET_INFOROM_OBJECT_VERSION = (0x2080014b) +NV2080_CTRL_GPU_INFOROM_OBJ_TYPE_LEN = 3 +NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS_MESSAGE_ID = (0x4B) +NV2080_CTRL_CMD_SET_GPU_OPTIMUS_INFO = (0x2080014c) +NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS_MESSAGE_ID = (0x4C) +NV2080_CTRL_CMD_GPU_GET_IP_VERSION = (0x2080014d) +NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS_MESSAGE_ID = (0x4D) +NV2080_CTRL_GPU_GET_IP_VERSION_DISPLAY = (0x00000001) +NV2080_CTRL_GPU_GET_IP_VERSION_HDACODEC = (0x00000002) +NV2080_CTRL_GPU_GET_IP_VERSION_PMGR = (0x00000003) +NV2080_CTRL_GPU_GET_IP_VERSION_PPWR_PMU = (0x00000004) +NV2080_CTRL_GPU_GET_IP_VERSION_DISP_FALCON = (0x00000005) +NV2080_CTRL_GPU_ILLUM_ATTRIB_LOGO_BRIGHTNESS = 0 +NV2080_CTRL_GPU_ILLUM_ATTRIB_SLI_BRIGHTNESS = 1 +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT = (0x20800153) +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_GPU_GET_ILLUM = (0x20800154) +NV2080_CTRL_GPU_GET_ILLUM_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_GPU_SET_ILLUM = (0x20800155) +NV2080_CTRL_GPU_SET_ILLUM_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_CMD_GPU_GET_INFOROM_IMAGE_VERSION = (0x20800156) +NV2080_CTRL_GPU_INFOROM_IMAGE_VERSION_LEN = 16 +NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_CMD_GPU_QUERY_INFOROM_ECC_SUPPORT = (0x20800157) +NV2080_CTRL_CMD_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO = (0x2080015a) +NV2080_CTRL_MAX_PHYSICAL_BRIDGE = (100) +NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU = (0x2080015b) +NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_GPU_QUERY_SCRUBBER_STATUS = (0x2080015f) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS_MESSAGE_ID = (0x5F) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_SCRUBBER_RUNNING = (0x00000000) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_SCRUBBER_IDLE = (0x00000001) +NV2080_CTRL_CMD_GPU_GET_VPR_CAPS = (0x20800160) +NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS_MESSAGE_ID = (0x60) +NV2080_CTRL_CMD_GPU_HANDLE_GPU_SR = (0x20800167) +NV2080_CTRL_CMD_GPU_GET_PES_INFO = (0x20800168) +NV2080_CTRL_CMD_GPU_GET_PES_INFO_MAX_TPC_PER_GPC_COUNT = 10 +NV2080_CTRL_GPU_GET_PES_INFO_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_GPU_GET_OEM_INFO = (0x20800169) +NV2080_GPU_MAX_OEM_INFO_LENGTH = (0x000001F8) +NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_CMD_GPU_GET_VPR_INFO = (0x2080016b) +NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS_MESSAGE_ID = (0x6B) +NV2080_CTRL_CMD_GPU_GET_ENCODER_CAPACITY = (0x2080016c) +NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS_MESSAGE_ID = (0x6C) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS = (0x2080016d) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS_MESSAGE_ID = (0x6D) +NV2080_CTRL_GPU_NVENC_SESSION_INFO_MAX_COPYOUT_ENTRIES = 0x200 +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS_MESSAGE_ID = (0x6E) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO = (0x2080016e) +NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS_MESSAGE_ID = (0x6F) +NV2080_CTRL_CMD_GPU_SET_FABRIC_BASE_ADDR = (0x2080016f) +NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS_MESSAGE_ID = (0x72) +NV2080_CTRL_CMD_GPU_VIRTUAL_INTERRUPT = (0x20800172) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS_MESSAGE_ID = (0x73) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS = (0x20800173) +NV_GI_UUID_LEN = 16 +NV2080_CTRL_GPU_PARTITION_ID_INVALID = 0xFFFFFFFF +NV2080_CTRL_GPU_MAX_PARTITIONS = 0x00000008 +NV2080_CTRL_GPU_MAX_PARTITION_IDS = 0x00000009 +NV2080_CTRL_GPU_MAX_SMC_IDS = 0x00000008 +NV2080_CTRL_GPU_MAX_GPC_PER_SMC = 0x0000000c +NV2080_CTRL_GPU_MAX_CE_PER_SMC = 0x00000008 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE = (1, 0) +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_FULL = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_HALF = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_QUARTER = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_EIGHTH = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE__SIZE = 4 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE = (4, 2) +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_FULL = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_HALF = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_HALF = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_QUARTER = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_QUARTER = 0x00000004 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_EIGHTH = 0x00000005 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_RESERVED_INTERNAL_06 = 0x00000006 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_RESERVED_INTERNAL_07 = 0x00000007 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE__SIZE = 8 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE = (7, 5) +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_FULL = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_HALF = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_MINI_HALF = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_QUARTER = 0x00000004 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_EIGHTH = 0x00000005 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_RESERVED_INTERNAL_06 = 0x00000006 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_RESERVED_INTERNAL_07 = 0x00000007 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_NONE = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE__SIZE = 8 +NV2080_CTRL_GPU_PARTITION_MAX_TYPES = 40 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA = (30, 30) +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA_DISABLE = 0 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA_ENABLE = 1 +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN = (31, 31) +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN_DISABLE = 0 +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN_ENABLE = 1 +NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_GPU_SET_PARTITIONS = (0x20800174) +NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS_MESSAGE_ID = (0x75) +NV2080_CTRL_CMD_GPU_GET_PARTITIONS = (0x20800175) +NV2080_CTRL_CMD_GPU_CONFIGURE_PARTITION = (0x20800176) +NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS_MESSAGE_ID = (0x76) +NV2080_CTRL_GPU_FAULT_PACKET_SIZE = 32 +NV2080_CTRL_CMD_GPU_REPORT_NON_REPLAYABLE_FAULT = (0x20800177) +NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS_MESSAGE_ID = (0x77) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS_VGPU = (0x20800178) +NV2080_CTRL_GPU_EXEC_REG_OPS_VGPU_PARAMS_MESSAGE_ID = (0x78) +NV2080_CTRL_CMD_GPU_GET_ENGINE_RUNLIST_PRI_BASE = (0x20800179) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS_MESSAGE_ID = (0x79) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_NULL = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_ERROR = (0xFFFFFFFB) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_INVALID = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_ERROR = (0xFFFFFFFB) +NV2080_CTRL_CMD_GPU_GET_HW_ENGINE_ID = (0x2080017a) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS_MESSAGE_ID = (0x7A) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_NULL = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_ERROR = (0xFFFFFFFB) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS = (0x2080017b) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS_MESSAGE_ID = (0x7B) +NV2080_CTRL_NVFBC_SESSION_FLAG_DIFFMAP_ENABLED = 0x00000001 +NV2080_CTRL_NVFBC_SESSION_FLAG_CLASSIFICATIONMAP_ENABLED = 0x00000002 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_NO_WAIT = 0x00000004 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_INFINITE = 0x00000008 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_TIMEOUT = 0x00000010 +NV2080_GPU_NVFBC_MAX_SESSION_COUNT = 256 +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS_MESSAGE_ID = (0x7C) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO = (0x2080017c) +NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS_MESSAGE_ID = (0xe6) +NV2080_CTRL_CMD_GPU_GET_FIRST_ASYNC_CE_IDX = (0x208001e6) +NV2080_CTRL_CMD_GPU_GET_VMMU_SEGMENT_SIZE = (0x2080017e) +NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS_MESSAGE_ID = (0x7E) +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_32MB = 0x02000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_64MB = 0x04000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_128MB = 0x08000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_256MB = 0x10000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_512MB = 0x20000000 +NV2080_CTRL_CMD_GPU_GET_PARTITION_CAPACITY = (0x20800181) +NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_GPU_GET_CACHED_INFO = (0x20800182) +NV2080_CTRL_GPU_GET_CACHED_INFO_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_GPU_SET_PARTITIONING_MODE = (0x20800183) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING = (1, 0) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_LEGACY = 0 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_MAX_PERF = 1 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_FAST_RECONFIG = 2 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_GPU_DESCRIBE_PARTITIONS = (0x20800185) +NV2080_CTRL_CMD_GPU_GET_MAX_SUPPORTED_PAGE_SIZE = (0x20800188) +NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS_MESSAGE_ID = (0x8A) +NV2080_CTRL_CMD_GPU_GET_NUM_MMUS_PER_GPC = (0x2080018a) +NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS_MESSAGE_ID = (0x8B) +NV2080_CTRL_CMD_GPU_GET_ACTIVE_PARTITION_IDS = (0x2080018b) +NV2080_CTRL_CMD_GPU_GET_PIDS = (0x2080018d) +NV2080_CTRL_GPU_GET_PIDS_MAX_COUNT = 950 +NV2080_CTRL_GPU_GET_PIDS_PARAMS_MESSAGE_ID = (0x8D) +NV2080_CTRL_GPU_GET_PIDS_ID_TYPE_CLASS = (0x00000000) +NV2080_CTRL_GPU_GET_PIDS_ID_TYPE_VGPU_GUEST = (0x00000001) +NV2080_CTRL_GPU_PID_INFO_INDEX_VIDEO_MEMORY_USAGE = (0x00000000) +NV2080_CTRL_GPU_PID_INFO_INDEX_MAX = NV2080_CTRL_GPU_PID_INFO_INDEX_VIDEO_MEMORY_USAGE +NV2080_CTRL_CMD_GPU_GET_PID_INFO = (0x2080018e) +NV2080_CTRL_GPU_GET_PID_INFO_MAX_COUNT = 200 +NV2080_CTRL_GPU_GET_PID_INFO_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT = (0x20800192) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_INVALID = 0 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_BAR1 = 1 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_BAR2 = 2 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_PHYSICAL = 3 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_UNBOUND_INSTANCE = 4 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_GPU_COMPUTE_POLICY_TIMESLICE = 0 +NV2080_CTRL_GPU_COMPUTE_POLICY_MAX = 1 +NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS_MESSAGE_ID = (0x94) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_POLICY_CONFIG = (0x20800195) +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_LIST_MAX = 32 +NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS_MESSAGE_ID = (0x95) +NV2080_CTRL_CMD_GPU_GET_GFID = (0x20800196) +NV2080_CTRL_GPU_GET_GFID_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY = (0x20800197) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS_MESSAGE_ID = (0x97) +NV2080_CTRL_CMD_GPU_VALIDATE_MEM_MAP_REQUEST = (0x20800198) +NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS_MESSAGE_ID = (0x98) +NV2080_CTRL_CMD_GPU_SET_EGM_GPA_FABRIC_BASE_ADDR = (0x20800199) +NV2080_CTRL_GPU_SET_EGM_GPA_FABRIC_BASE_ADDR_PARAMS_MESSAGE_ID = (0x99) +NV2080_CTRL_CMD_GPU_GET_ENGINE_LOAD_TIMES = (0x2080019b) +NV2080_CTRL_GPU_MAX_ENGINE_OBJECTS = 0xC8 +NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS_MESSAGE_ID = (0x9B) +NV2080_CTRL_CMD_GPU_GET_ID_NAME_MAPPING = (0x2080019c) +NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS_MESSAGE_ID = (0x9C) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS_NOPTRS = (0x2080019d) +NV2080_CTRL_REG_OPS_ARRAY_MAX = 100 +NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS_MESSAGE_ID = (0x9D) +NV2080_GET_P2P_CAPS_UUID_LEN = 16 +NV2080_CTRL_CMD_GET_P2P_CAPS = (0x208001a0) +NV2080_CTRL_GET_P2P_CAPS_PARAMS_MESSAGE_ID = (0xA0) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xA2) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_PROFILES = (0x208001a2) +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_UNSUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_NOT_STARTED = 1 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_IN_PROGRESS = 2 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_COMPLETE = 3 +NV2080_GPU_FABRIC_CLUSTER_UUID_LEN = 16 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW = (1, 0) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE = (3, 2) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY = (5, 4) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY = (7, 6) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_FALSE = 2 +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xA3) +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO = (0x208001a3) +NV2080_CTRL_CMD_GPU_GET_CHIP_DETAILS = (0x208001a4) +GPU_PART_NUMBER_FMT = "%4X-%s-%X%X" +NV2080_MAX_CHIP_SKU_LENGTH = 0x00000004 +NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS_MESSAGE_ID = (0xA4) +NV2080_CTRL_CMD_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP = (0x208001a5) +NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS_MESSAGE_ID = (0xA5) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS = (0x208001a6) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS_GSP = (0x208001a7) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS_VGPU = (0x208001a8) +NV2080_CTRL_MIGRATABLE_OPS_ARRAY_MAX = 50 +NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_MESSAGE_ID = (0xA6) +NV2080_CTRL_GPU_MIGRATABLE_OPS_GSP_PARAMS_MESSAGE_ID = (0xA7) +NV2080_CTRL_GPU_MIGRATABLE_OPS_VGPU_PARAMS_MESSAGE_ID = (0xA8) +NV2080_CTRL_CMD_GPU_MARK_DEVICE_FOR_RESET = (0x208001a9) +NV2080_CTRL_CMD_GPU_UNMARK_DEVICE_FOR_RESET = (0x208001aa) +NV2080_CTRL_CMD_GPU_GET_RESET_STATUS = (0x208001ab) +NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS_MESSAGE_ID = (0xAB) +NV2080_CTRL_CMD_GPU_MARK_DEVICE_FOR_DRAIN_AND_RESET = (0x208001ac) +NV2080_CTRL_CMD_GPU_UNMARK_DEVICE_FOR_DRAIN_AND_RESET = (0x208001ad) +NV2080_CTRL_CMD_GPU_GET_DRAIN_AND_RESET_STATUS = (0x208001ae) +NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS_MESSAGE_ID = (0xAE) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS_MESSAGE_ID = (0xAF) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2 = (0x208001af) +NV2080_CTRL_GPU_MAX_CONSTRUCTED_FALCONS = 0x40 +NV2080_CTRL_CMD_GPU_GET_CONSTRUCTED_FALCON_INFO = (0x208001b0) +NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS_MESSAGE_ID = (0xB0) +NV2080_CTRL_CMD_GPU_GET_VF_CAPS = (0x208001b1) +NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS_MESSAGE_ID = (0xB1) +NV2080_CTRL_CMD_GPU_GET_RECOVERY_ACTION = (0x208001b2) +NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS_MESSAGE_ID = (0xB2) +NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS_MESSAGE_ID = (0xe4) +NV2080_CTRL_GPU_GET_FIPS_STATUS = (0x208001e4) +NV2080_CTRL_GPU_RAFTS_NUM_MAX_UGPU = 0x2 +NV2080_CTRL_GPU_RAFTS_NUM_MAX_GPC_PER_UGPU = 0xC +NV2080_CTRL_GPU_RAFTS_NUM_MAX_NUM_GPC = (0x18) +NV2080_CTRL_GPU_RAFTS_NUM_MAX_FS_UNIT = (0x1a) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS_MESSAGE_ID = (0xB3) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK = (0x208001b3) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_PROFILE_CAPACITY = (0x208001e5) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS_MESSAGE_ID = (0xe5) +NV2080_CTRL_CMD_GPU_GET_TPC_RECONFIG_MASK = (0x208001e7) +NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS_MESSAGE_ID = (0xe7) +NV2080_CTRL_GPUMON_SAMPLE_TYPE_PWR_MONITOR_STATUS = 0x00000001 +NV2080_CTRL_GPUMON_SAMPLE_TYPE_PERFMON_UTIL = 0x00000002 +NV2080_GPUMON_PID_INVALID = ((NvU32)(~0)) +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE = (1, 0) +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_NONE = 0x0 +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_ENGID = 0x1 +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_CHANNEL = 0x2 +NV2080_CTRL_GR_ROUTE_INFO_DATA_CHANNEL_HANDLE = (31, 0) +NV2080_CTRL_GR_ROUTE_INFO_DATA_ENGID = (31, 0) +NV2080_CTRL_GR_INFO_INDEX_MAXCLIPS = NV0080_CTRL_GR_INFO_INDEX_MAXCLIPS +NV2080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 = NV0080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 +NV2080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK = NV0080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK +NV2080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT = NV0080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT +NV2080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT = NV0080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT +NV2080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE = NV0080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE +NV2080_CTRL_GR_INFO_INDEX_VPE_COUNT = NV0080_CTRL_GR_INFO_INDEX_VPE_COUNT +NV2080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT = NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT +NV2080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR = NV0080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR +NV2080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT = NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT = NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT = NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_VERSION = NV0080_CTRL_GR_INFO_INDEX_SM_VERSION +NV2080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM = NV0080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM +NV2080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP = NV0080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP +NV2080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES = NV0080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES +NV2080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES = NV0080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES +NV2080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY = NV0080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY +NV2080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY = NV0080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY +NV2080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM = NV0080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS +NV2080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED = NV0080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS +NV2080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP +NV2080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES +NV2080_CTRL_GR_INFO_INDEX_DUMMY = NV0080_CTRL_GR_INFO_INDEX_DUMMY +NV2080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES = NV0080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES +NV2080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES = NV0080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES +NV2080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS = NV0080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG = NV0080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET +NV2080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET = NV0080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET +NV2080_CTRL_GR_INFO_INDEX_MAX = NV0080_CTRL_GR_INFO_INDEX_MAX +NV2080_CTRL_GR_INFO_MAX_SIZE = NV0080_CTRL_GR_INFO_MAX_SIZE +NV2080_CTRL_GR_INFO_SM_VERSION_NONE = (0x00000000) +NV2080_CTRL_GR_INFO_SM_VERSION_1_05 = (0x00000105) +NV2080_CTRL_GR_INFO_SM_VERSION_1_1 = (0x00000110) +NV2080_CTRL_GR_INFO_SM_VERSION_1_2 = (0x00000120) +NV2080_CTRL_GR_INFO_SM_VERSION_1_3 = (0x00000130) +NV2080_CTRL_GR_INFO_SM_VERSION_1_4 = (0x00000140) +NV2080_CTRL_GR_INFO_SM_VERSION_1_5 = (0x00000150) +NV2080_CTRL_GR_INFO_SM_VERSION_2_0 = (0x00000200) +NV2080_CTRL_GR_INFO_SM_VERSION_2_1 = (0x00000210) +NV2080_CTRL_GR_INFO_SM_VERSION_2_2 = (0x00000220) +NV2080_CTRL_GR_INFO_SM_VERSION_3_0 = (0x00000300) +NV2080_CTRL_GR_INFO_SM_VERSION_3_1 = (0x00000310) +NV2080_CTRL_GR_INFO_SM_VERSION_3_2 = (0x00000320) +NV2080_CTRL_GR_INFO_SM_VERSION_3_3 = (0x00000330) +NV2080_CTRL_GR_INFO_SM_VERSION_3_5 = (0x00000350) +NV2080_CTRL_GR_INFO_SM_VERSION_3_6 = (0x00000360) +NV2080_CTRL_GR_INFO_SM_VERSION_3_8 = (0x00000380) +NV2080_CTRL_GR_INFO_SM_VERSION_3_9 = (0x00000390) +NV2080_CTRL_GR_INFO_SM_VERSION_4_0 = (0x00000400) +NV2080_CTRL_GR_INFO_SM_VERSION_5_0 = (0x00000500) +NV2080_CTRL_GR_INFO_SM_VERSION_5_02 = (0x00000502) +NV2080_CTRL_GR_INFO_SM_VERSION_5_03 = (0x00000503) +NV2080_CTRL_GR_INFO_SM_VERSION_6_0 = (0x00000600) +NV2080_CTRL_GR_INFO_SM_VERSION_6_01 = (0x00000601) +NV2080_CTRL_GR_INFO_SM_VERSION_6_02 = (0x00000602) +NV2080_CTRL_GR_INFO_SM_VERSION_7_0 = (0x00000700) +NV2080_CTRL_GR_INFO_SM_VERSION_7_01 = (0x00000701) +NV2080_CTRL_GR_INFO_SM_VERSION_7_02 = (0x00000702) +NV2080_CTRL_GR_INFO_SM_VERSION_7_03 = (0x00000703) +NV2080_CTRL_GR_INFO_SM_VERSION_7_05 = (0x00000705) +NV2080_CTRL_GR_INFO_SM_VERSION_8_02 = (0x00000802) +NV2080_CTRL_GR_INFO_SM_VERSION_8_06 = (0x00000806) +NV2080_CTRL_GR_INFO_SM_VERSION_8_07 = (0x00000807) +NV2080_CTRL_GR_INFO_SM_VERSION_8_08 = (0x00000808) +NV2080_CTRL_GR_INFO_SM_VERSION_8_09 = (0x00000809) +NV2080_CTRL_GR_INFO_SM_VERSION_9_00 = (0x00000900) +NV2080_CTRL_GR_INFO_SM_VERSION_10_00 = (0x00000A00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_01 = (0x00000A01) +NV2080_CTRL_GR_INFO_SM_VERSION_10_04 = (0x00000A04) +NV2080_CTRL_GR_INFO_SM_VERSION_5_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_5_02) +NV2080_CTRL_GR_INFO_SM_VERSION_5_3 = (NV2080_CTRL_GR_INFO_SM_VERSION_5_03) +NV2080_CTRL_GR_INFO_SM_VERSION_6_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_6_01) +NV2080_CTRL_GR_INFO_SM_VERSION_6_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_6_02) +NV2080_CTRL_GR_INFO_SM_VERSION_7_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_01) +NV2080_CTRL_GR_INFO_SM_VERSION_7_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_02) +NV2080_CTRL_GR_INFO_SM_VERSION_7_3 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_03) +NV2080_CTRL_GR_INFO_SM_VERSION_7_5 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_05) +NV2080_CTRL_GR_INFO_SM_VERSION_8_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_02) +NV2080_CTRL_GR_INFO_SM_VERSION_8_6 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_06) +NV2080_CTRL_GR_INFO_SM_VERSION_8_7 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_07) +NV2080_CTRL_GR_INFO_SM_VERSION_8_8 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_08) +NV2080_CTRL_GR_INFO_SM_VERSION_8_9 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_09) +NV2080_CTRL_GR_INFO_SM_VERSION_9_0 = (NV2080_CTRL_GR_INFO_SM_VERSION_9_00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_0 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_01) +NV2080_CTRL_GR_INFO_SM_VERSION_10_4 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_04) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D = (0, 0) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D = (1, 1) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE = (2, 2) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M = (3, 3) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M_TRUE = 0x1 +NV2080_CTRL_CMD_GR_GET_INFO = (0x20801201) +NV2080_CTRL_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_GR_CTXSW_ZCULL_MODE = (0x20801205) +NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CTXSW_ZCULL_MODE_GLOBAL = (0x00000000) +NV2080_CTRL_CTXSW_ZCULL_MODE_NO_CTXSW = (0x00000001) +NV2080_CTRL_CTXSW_ZCULL_MODE_SEPARATE_BUFFER = (0x00000002) +NV2080_CTRL_CMD_GR_GET_ZCULL_INFO = (0x20801206) +NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_GR_CTXSW_PM_MODE = (0x20801207) +NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CTXSW_PM_MODE_NO_CTXSW = (0x00000000) +NV2080_CTRL_CTXSW_PM_MODE_CTXSW = (0x00000001) +NV2080_CTRL_CTXSW_PM_MODE_STREAM_OUT_CTXSW = (0x00000002) +NV2080_CTRL_CMD_GR_CTXSW_ZCULL_BIND = (0x20801208) +NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_GR_CTXSW_PM_BIND = (0x20801209) +NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_GR_CTXSW_SETUP_BIND = (0x2080123a) +NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_MAX_VALUES = 128 +NV2080_CTRL_CMD_GR_SET_GPC_TILE_MAP = (0x2080120a) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_GR_CTXSW_SMPC_MODE = (0x2080120e) +NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CTXSW_SMPC_MODE_NO_CTXSW = (0x00000000) +NV2080_CTRL_CTXSW_SMPC_MODE_CTXSW = (0x00000001) +NV2080_CTRL_CMD_GR_GET_SM_TO_GPC_TPC_MAPPINGS = (0x2080120f) +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_MAX_SM_COUNT = 240 +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_GR_SET_CTXSW_PREEMPTION_MODE = (0x20801210) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP = (0, 0) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP_IGNORE = (0x00000000) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP_SET = (0x00000001) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP = (1, 1) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP_IGNORE = (0x00000000) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP_SET = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_WFI = (0x00000000) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_GFXP = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_GFXP_POOL = (0x00000002) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_WFI = (0x00000000) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_CTA = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_CILP = (0x00000002) +NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND = (0x20801211) +NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GR_PC_SAMPLING_MODE = (0x20801212) +NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_PC_SAMPLING_MODE_DISABLED = (0x00000000) +NV2080_CTRL_PC_SAMPLING_MODE_ENABLED = (0x00000001) +NV2080_CTRL_CMD_GR_GET_ROP_INFO = (0x20801213) +NV2080_CTRL_GR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_GR_GET_CTXSW_STATS = (0x20801215) +NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET = (0, 0) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET_FALSE = (0x00000000) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET_TRUE = (0x00000001) +NV2080_CTRL_CMD_GR_GET_CTX_BUFFER_SIZE = (0x20801218) +NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_GR_MAX_CTX_BUFFER_COUNT = 64 +NV2080_CTRL_CMD_GR_GET_CTX_BUFFER_INFO = (0x20801219) +NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_UNKNOWN = 0 +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_SYSMEM = 1 +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_FBMEM = 2 +NV2080_CTRL_CMD_GR_GET_GLOBAL_SM_ORDER = (0x2080121b) +NV2080_CTRL_CMD_GR_GET_GLOBAL_SM_ORDER_MAX_SM_COUNT = 512 +NV2080_CTRL_GR_DISABLED_SM_VGPC_ID = 0xFF +NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x1B) +NV2080_CTRL_CMD_GR_GET_CURRENT_RESIDENT_CHANNEL = (0x2080121c) +NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS_MESSAGE_ID = (0x1C) +NV2080_CTRL_CMD_GR_GET_VAT_ALARM_MAX_GPC_COUNT = 10 +NV2080_CTRL_CMD_GR_GET_VAT_ALARM_MAX_TPC_PER_GPC_COUNT = 10 +NV2080_CTRL_CMD_GR_GET_VAT_ALARM_DATA = (0x2080121d) +NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS_MESSAGE_ID = (0x1D) +NV2080_CTRL_CMD_GR_GET_ATTRIBUTE_BUFFER_SIZE = (0x2080121e) +NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x1E) +NV2080_CTRL_CMD_GR_GFX_POOL_QUERY_SIZE = (0x2080121f) +NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS_MESSAGE_ID = (0x1F) +NV2080_CTRL_CMD_GR_GFX_POOL_INITIALIZE = (0x20801220) +NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_GR_GFX_POOL_MAX_SLOTS = 64 +NV2080_CTRL_CMD_GR_GFX_POOL_ADD_SLOTS = (0x20801221) +NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_GR_GFX_POOL_REMOVE_SLOTS = (0x20801222) +NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_GR_GET_CAPS_V2 = (0x20801227) +NV2080_CTRL_GR_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_GR_GET_INFO_V2 = (0x20801228) +NV2080_CTRL_GR_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_GR_GET_GPC_MASK = (0x2080122a) +NV2080_CTRL_GR_GET_GPC_MASK_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_CMD_GR_GET_TPC_MASK = (0x2080122b) +NV2080_CTRL_GR_GET_TPC_MASK_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_GR_SET_TPC_PARTITION_MODE = (0x2080122c) +NV2080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_GR_GET_ENGINE_CONTEXT_PROPERTIES = (0x2080122d) +NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_CMD_GR_GET_SM_ISSUE_RATE_MODIFIER = (0x20801230) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_DP_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_DP_REDUCED_SPEED = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_CMD_GR_FECS_BIND_EVTBUF_FOR_UID = (0x20801231) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_GR_GET_PHYS_GPC_MASK = (0x20801232) +NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS_MESSAGE_ID = (0x32) +NV2080_CTRL_CMD_GR_GET_PPC_MASK = (0x20801233) +NV2080_CTRL_GR_GET_PPC_MASK_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_GR_GET_NUM_TPCS_FOR_GPC = (0x20801234) +NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_GR_GET_CTXSW_MODES = (0x20801235) +NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS_MESSAGE_ID = (0x35) +NV2080_CTRL_CMD_GR_GET_GPC_TILE_MAP = (0x20801236) +NV2080_CTRL_GR_GET_GPC_TILE_MAP_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_GR_GET_ZCULL_MASK = (0x20801237) +NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_GR_FECS_BIND_EVTBUF_FOR_UID_V2 = (0x20801238) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_GR_GET_GFX_GPC_AND_TPC_INFO = (0x20801239) +NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_GR_GET_TPC_RECONFIG_MASK = (0x2080123b) +NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS_MESSAGE_ID = (0x3b) +NV2080_CTRL_CMD_GRMGR_GET_GR_FS_INFO = (0x20803801) +NV2080_CTRL_GRMGR_GR_FS_INFO_MAX_QUERIES = 96 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_MAX_SIZE = 32 +NV2080_CTRL_GRMGR_MAX_SMC_IDS = 8 +NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_INVALID = 0 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_GPC_COUNT = 1 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_CHIPLET_GPC_MAP = 2 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_TPC_MASK = 3 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PPC_MASK = 4 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_CHIPLET_GPC_MAP = 5 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_CHIPLET_SYSPIPE_MASK = 6 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_CHIPLET_SYSPIPE_IDS = 7 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PROFILER_MON_GPC_MASK = 8 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_SYSPIPE_ID = 9 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_ROP_MASK = 10 +NV2080_CTRL_CMD_GSP_GET_FEATURES = (0x20803601) +NV2080_GSP_MAX_BUILD_VERSION_LENGTH = (0x0000040) +NV2080_CTRL_GSP_GET_FEATURES_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED = (0, 0) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED_FALSE = (0x00000000) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED_TRUE = (0x00000001) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED = (1, 1) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED_FALSE = (0x00000000) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED_TRUE = (0x00000001) +NV2080_CTRL_CMD_GSP_GET_RM_HEAP_STATS = (0x20803602) +NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS = (0x20803603) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS = (0x20803604) +NV2080_CTRL_GSP_LIBOS_POOL_COUNT_MAX = 64 +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK = (0x20804101) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE = (0x20804102) +NV2080_CTRL_I2C_VERSION_0 = 0x00 +NV2080_CTRL_I2C_MAX_ENTRIES = 256 +NV2080_CTRL_I2C_MAX_REG_LEN = 8 +NV2080_CTRL_I2C_MAX_ADDR_ENTRIES = 20 +NV2080_CTRL_I2C_FLAGS_NONSTD_SI1930UC = (0x00000001) +NV2080_CTRL_I2C_FLAGS_PRIVILEGE = (0x00000002) +NV2080_CTRL_I2C_FLAGS_DATA_ENCRYPTED = (0x00000004) +NV2080_CTRL_I2C_FLAGS_PX3540 = (0x00000010) +NV2080_CTRL_I2C_FLAGS_ADDR_AUTO_INC_NOT_SUPPORTED = (0x00000008) +NV2080_CTRL_I2C_READ_BUFFER_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_I2C_READ_BUFFER = (0x20800601) +NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_I2C_WRITE_BUFFER = (0x20800602) +NV2080_CTRL_CMD_I2C_READ_REG = (0x20800603) +NV2080_CTRL_I2C_READ_REG_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_I2C_WRITE_REG = (0x20800604) +NV2080_CTRL_I2C_WRITE_REG_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_I2C_ACCESS = (0x20800610) +NV2080_CTRL_I2C_ACCESS_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_I2C_ACCESS_CMD_ACQUIRE = 0x1 +NV2080_CTRL_I2C_ACCESS_CMD_RELEASE = 0x2 +NV2080_CTRL_I2C_ACCESS_CMD_WRITE_BYTE = 0x3 +NV2080_CTRL_I2C_ACCESS_CMD_READ_BYTE = 0x4 +NV2080_CTRL_I2C_ACCESS_CMD_NULL = 0x5 +NV2080_CTRL_I2C_ACCESS_CMD_RESET = 0x6 +NV2080_CTRL_I2C_ACCESS_CMD_TEST_PORT = 0x11 +NV2080_CTRL_I2C_ACCESS_CMD_SET_FAST_MODE = 0x12 +NV2080_CTRL_I2C_ACCESS_CMD_SET_NORMAL_MODE = 0x13 +NV2080_CTRL_I2C_ACCESS_CMD_WRITE_BUFFER = 0x14 +NV2080_CTRL_I2C_ACCESS_CMD_READ_BUFFER = 0x15 +NV2080_CTRL_I2C_ACCESS_CMD_START = 0x17 +NV2080_CTRL_I2C_ACCESS_CMD_STOP = 0x18 +NV2080_CTRL_I2C_ACCESS_CMD_SET_SLOW_MODE = 0x20 +NV2080_CTRL_I2C_ACCESS_FLAG_START = 0x1 +NV2080_CTRL_I2C_ACCESS_FLAG_STOP = 0x2 +NV2080_CTRL_I2C_ACCESS_FLAG_ACK = 0x4 +NV2080_CTRL_I2C_ACCESS_FLAG_RAB = 0x8 +NV2080_CTRL_I2C_ACCESS_FLAG_ADDR_10BITS = 0x10 +NV2080_CTRL_I2C_ACCESS_FLAG_PRIVILEGE = 0x20 +NV2080_CTRL_I2C_ACCESS_FLAG_DATA_ENCRYPTED = 0x40 +NV2080_CTRL_I2C_ACCESS_FLAG_RESTART = 0x80 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_33_33PCT = 0x100 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_33PCT = 0x200 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_10PCT = 0x400 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_3_33PCT = 0x800 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_3PCT = 0x1000 +NV2080_CTRL_I2C_ACCESS_PORT_DYNAMIC = 0x0 +NV2080_CTRL_I2C_ACCESS_PORT_PRIMARY = 0x1 +NV2080_CTRL_I2C_ACCESS_PORT_SECONDARY = 0x2 +NV2080_CTRL_I2C_ACCESS_PORT_TERTIARY = 0x3 +NV2080_CTRL_I2C_ACCESS_PORT_QUARTIARY = 0x4 +NV2080_CTRL_I2C_ACCESS_PORT_1 = 0x1 +NV2080_CTRL_I2C_ACCESS_PORT_2 = 0x2 +NV2080_CTRL_I2C_ACCESS_PORT_3 = 0x3 +NV2080_CTRL_I2C_ACCESS_PORT_4 = 0x4 +NV2080_CTRL_I2C_ACCESS_PORT_5 = 0x5 +NV2080_CTRL_I2C_ACCESS_PORT_6 = 0x6 +NV2080_CTRL_I2C_ACCESS_PORT_7 = 0x7 +NV2080_CTRL_I2C_ACCESS_PORT_8 = 0x8 +NV2080_CTRL_I2C_ACCESS_PORT_9 = 0x9 +NV2080_CTRL_I2C_ACCESS_PORT_10 = 0x10 +NV2080_CTRL_I2C_ACCESS_NUM_PORTS = NV2080_CTRL_I2C_ACCESS_PORT_10 +NV2080_CTRL_I2C_ACCESS_STATUS_SUCCESS = 0x0 +NV2080_CTRL_I2C_ACCESS_STATUS_ERROR = 0x1 +NV2080_CTRL_I2C_ACCESS_STATUS_PROTOCOL_ERROR = 0x2 +NV2080_CTRL_I2C_ACCESS_STATUS_DEVICE_BUSY = 0x3 +NV2080_CTRL_I2C_ACCESS_STATUS_NACK_AFTER_SEND = 0x4 +NV2080_CTRL_I2C_ACCESS_STATUS_DP2TMDS_DONGLE_MISSING = 0x5 +NV2080_CTRL_CMD_I2C_ENABLE_MONITOR_3D_MODE = (0x20800620) +NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_STATIC_INFO = (0x20800a01) +NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS_MESSAGE_ID = (0x1C) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_STATIC_CONFIG = (0x20800a1c) +NV2080_CTRL_CMD_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER = (0x20800a1d) +NV2080_CTRL_INTERNAL_UVM_ACCESS_CNTR_BUFFER_MAX_PAGES = 64 +NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS_MESSAGE_ID = (0x1D) +NV2080_CTRL_CMD_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER = (0x20800a1e) +NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS_MESSAGE_ID = (0x1E) +NV2080_CTRL_INTERNAL_GR_MAX_ENGINES = 8 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_CAPS = (0x20800a1f) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CAPS_PARAMS_MESSAGE_ID = (0x1F) +NV2080_CTRL_INTERNAL_GR_MAX_SM = 240 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER = (0x20800a22) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_INTERNAL_MAX_BSPS = 8 +NV2080_CTRL_CMD_INTERNAL_MAX_MSENCS = 8 +NV2080_CTRL_INTERNAL_GR_MAX_GPC = 12 +NV2080_CTRL_INTERNAL_MAX_TPC_PER_GPC_COUNT = 10 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS = (0x20800a26) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_KGR_MAX_BUFFER_PTES = 128 +NV2080_CTRL_CMD_KGR_GET_CTX_BUFFER_PTES = (0x20800a28) +NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_INFO = (0x20800a2a) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_INFO_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_ZCULL_INFO = (0x20800a2c) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_ROP_INFO = (0x20800a2e) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x2E) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_PPC_MASKS = (0x20800a30) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PPC_MASKS_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COUNT = 0x1a +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO = (0x20800a32) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO_PARAMS_MESSAGE_ID = (0x32) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x35) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER = (0x20800a34) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_CHIP_INFO = (0x20800a36) +NV2080_CTRL_INTERNAL_GET_CHIP_INFO_REG_BASE_MAX = 16 +NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE = (0x20800a37) +NV2080_CTRL_CMD_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE = (0x20800a38) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET = (0x20800a39) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET = (0x20800a3a) +NV2080_CTRL_CMD_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET = (0x20800a3b) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET_PARAMS_MESSAGE_ID = (0x3B) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE = (0x20800a3d) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS_MESSAGE_ID = (0x3C) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE_PARAMS_MESSAGE_ID = (0x3D) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS_MESSAGE_ID = (0x3E) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES = (0x20800a3f) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_INTERNAL_DEVICE_INFO_MAX_ENTRIES = 512 +NV2080_CTRL_CMD_INTERNAL_GET_DEVICE_INFO_TABLE = (0x20800a40) +NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP = (0x20800a41) +NV2080_CTRL_INTERNAL_GPU_USER_REGISTER_ACCESS_MAP_MAX_COMPRESSED_SIZE = 4096 +NV2080_CTRL_INTERNAL_GPU_USER_REGISTER_ACCESS_MAP_MAX_PROFILING_RANGES = 4096 +NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE = (0x20800a44) +NV2080_CTRL_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE = (0x20800a43) +NV2080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS_MESSAGE_ID = (0x45) +NV2080_CTRL_CMD_INTERNAL_KGR_INIT_BUG4208224_WAR = (0x20800a46) +NV2080_CTRL_INTERNAL_KGR_INIT_BUG4208224_WAR_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES = (0x20800a48) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES_PARAMS_MESSAGE_ID = (0x48) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_WRITE_INST_MEM = (0x20800a49) +NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS_MESSAGE_ID = (0x49) +NV2080_CTRL_CMD_INTERNAL_RECOVER_ALL_COMPUTE_CONTEXTS = (0x20800a4a) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_IP_VERSION = (0x20800a4b) +NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS_MESSAGE_ID = (0x4B) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_SMC_MODE = (0x20800a4c) +NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS_MESSAGE_ID = (0x4C) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR = (0x20800a4d) +NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS_MESSAGE_ID = (0x4D) +NV2080_CTRL_INTERNAL_GRMGR_PARTITION_MAX_TYPES = 60 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS_MESSAGE_ID = (0x4F) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM = (0x20800a51) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_MAX_ENGINES_MASK_SIZE = 4 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS_MESSAGE_ID = (0x52) +NV2080_CTRL_INTERNAL_FIFO_MAX_RUNLIST_BUFFERS = 2 +NV2080_CTRL_INTERNAL_FIFO_MAX_RUNLIST_ID = 64 +NV2080_CTRL_CMD_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS = (0x20800a53) +NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_SET_IMP_INIT_INFO = (0x20800a54) +NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_INTERNAL_GET_EGPU_BRIDGE_INFO = (0x20800a55) +NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_NONE = (0x00000000) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_CUSTOM = (0x00000001) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_TB2 = (0x00000002) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_TB3 = (0x00000003) +NV2080_CTRL_CMD_INTERNAL_BUS_FLUSH_WITH_SYSMEMBAR = (0x20800a70) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL = (0x20800a71) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS_MESSAGE_ID = (0x71) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE = (0x20800a72) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS_MESSAGE_ID = (0x72) +NV2080_CTRL_CMD_INTERNAL_BUS_DESTROY_P2P_MAILBOX = (0x20800a73) +NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS_MESSAGE_ID = (0x73) +NV2080_CTRL_CMD_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING = (0x20800a74) +NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING = (0x20800a75) +NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS_MESSAGE_ID = (0x75) +NV2080_CTRL_CMD_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES = (0x20800a57) +NV2080_CTRL_INTERNAL_VMMU_MAX_SPA_FOR_GPA_ENTRIES = 128 +NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS_MESSAGE_ID = (0x57) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER = (0x20800a58) +NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS_MESSAGE_ID = (0x58) +NV2080_CTRL_CMD_INTERNAL_GMMU_GET_STATIC_INFO = (0x20800a59) +NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0x59) +NV2080_CTRL_CMD_INTERNAL_GR_GET_CTXSW_MODES = (0x20800a5a) +NV2080_CTRL_INTERNAL_GR_GET_CTXSW_MODES_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE = (0x20800a5b) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_INTERNAL_INTR_GET_KERNEL_TABLE = (0x20800a5c) +NV2080_CTRL_INTERNAL_INTR_MAX_TABLE_SIZE = 128 +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS_MESSAGE_ID = (0x5C) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_GR = (0x00000000) +NV2080_CTRL_CMD_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK = (0x20800a98) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS_MESSAGE_ID = (0x98) +NV2080_CTRL_CMD_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET = (0x20800a99) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS_MESSAGE_ID = (0x99) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES = (0x20800a5d) +NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS_MESSAGE_ID = (0x5D) +NV2080_CTRL_CMD_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES = (0x20800a60) +NV2080_CTRL_INTERNAL_MAX_SWIZZ_ID = 15 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS_MESSAGE_ID = (0x60) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_NUM_CHANNELS = (0x20800a61) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS_MESSAGE_ID = (0x61) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_PROFILES = (0x20800a63) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PROFILES_PARAMS_MESSAGE_ID = (0x63) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES = (0x20800a65) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS_MESSAGE_ID = (0x65) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES = (0x20800a66) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS_MESSAGE_ID = (0x66) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG = (0x20800a68) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG = (0x20800a67) +NV2080_CTRL_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS_MESSAGE_ID = (0x67) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE = (0x20800a6b) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_SIZE = 8 +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS_MESSAGE_ID = (0x6B) +NV2080_CTRL_CMD_INTERNAL_RC_WATCHDOG_TIMEOUT = (0x20800a6a) +NV2080_CTRL_CMD_INTERNAL_PERF_CUDA_LIMIT_DISABLE = (0x20800a7a) +NV2080_CTRL_CMD_INTERNAL_PERF_OPTP_CLI_CLEAR = (0x20800a7c) +NV2080_CTRL_CMD_INTERNAL_PERF_GET_AUX_POWER_STATE = (0x20800a81) +NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_SET_2X = (0x20800a9a) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X_MESSAGE_ID = (0x9A) +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_PSTATE = 0 +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_GPCCLK = 1 +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_LAST = NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_GPCCLK +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_NUM = (0x2) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_SET_CONTROL = (0x20800a7e) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS_MESSAGE_ID = (0x7E) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS = (0x20800a7f) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_MESSAGE_ID = (0x7F) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO = (0x20800a80) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS_MESSAGE_ID = (0x80) +NV2080_CTRL_CMD_INTERNAL_GMMU_REGISTER_FAULT_BUFFER = (0x20800a9b) +NV2080_CTRL_INTERNAL_GMMU_FAULT_BUFFER_MAX_PAGES = 256 +NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9B) +NV2080_CTRL_CMD_INTERNAL_GMMU_UNREGISTER_FAULT_BUFFER = (0x20800a9c) +NV2080_CTRL_FAULT_BUFFER_NON_REPLAYABLE = (0x00000000) +NV2080_CTRL_FAULT_BUFFER_REPLAYABLE = (0x00000001) +NV2080_CTRL_CMD_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER = (0x20800a9d) +NV2080_CTRL_INTERNAL_GMMU_CLIENT_SHADOW_FAULT_BUFFER_MAX_PAGES = 3000 +NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9D) +NV2080_CTRL_CMD_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER = (0x20800a9e) +NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9E) +NV2080_CTRL_CMD_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER = (0x20800a9f) +NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS_MESSAGE_ID = (0x9F) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_SET_3X = (0x20800aa0) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X_MESSAGE_ID = (0xA0) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_CLEAR_3X = (0x20800aa1) +NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X_MESSAGE_ID = (0xA1) +NV2080_CTRL_CMD_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO = (0x20800aa2) +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO_MAX_SKYLINES = 8 +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO_MAX_NON_SINGLETON_VGPCS = 12 +NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS_MESSAGE_ID = (0xA2) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_SET_PARTITIONING_MODE = (0x20800aa3) +NV2080_CTRL_INTERNAL_MIGMGR_SET_PARTITIONING_MODE_PARAMS_MESSAGE_ID = (0xA3) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE = (0x20800aa4) +NV2080_CTRL_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA4) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_SET_GPU_INSTANCES = (0x20800aa5) +NV2080_CTRL_INTERNAL_MIGMGR_SET_GPU_INSTANCES_PARAMS_MESSAGE_ID = (0xA5) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_GET_GPU_INSTANCES = (0x20800aa6) +NV2080_CTRL_INTERNAL_MIGMGR_GET_GPU_INSTANCES_PARAMS_MESSAGE_ID = (0xA6) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED = (0x20800a69) +NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE = (0x20800aa7) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE = (0x20800aa8) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE = (0x20800aa9) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE = (0x20800aaa) +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_MAX_ENGINES_MASK_SIZE = 4 +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA7) +NV2080_CTRL_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA8) +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA9) +NV2080_CTRL_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xAA) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT = (0x20800a6c) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS_MESSAGE_ID = (0x6c) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_ALL = (0x00000001) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_FIRST = (0x00000002) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_LAST = (0x00000004) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_NORMAL = (0x00000008) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_CLEAN = (0x00000010) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_WAIT_FB_PULL = (0x00000020) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_FLUSH_L2_ALL_RAMS_AND_CACHES = (0x20800a6d) +NV2080_CTRL_CMD_INTERNAL_BIF_GET_STATIC_INFO = (0x20800aac) +NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0xac) +NV2080_CTRL_CMD_INTERNAL_HSHUB_PEER_CONN_CONFIG = (0x20800a88) +NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS = (0x20800a8a) +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_TABLE_SIZE = 32 +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS_MESSAGE_ID = (0x8a) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_NUM_UNITS = (0x20800a8b) +NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS_MESSAGE_ID = (0x8b) +NV2080_CTRL_CMD_INTERNAL_HSHUB_NEXT_HSHUB_ID = (0x20800a8c) +NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS_MESSAGE_ID = (0x8c) +NV2080_CTRL_CMD_INTERNAL_HSHUB_EGM_CONFIG = (0x20800a8d) +NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS_MESSAGE_ID = (0x8d) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_COMPUTE_PEER_ADDR = (0x20800aad) +NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS_MESSAGE_ID = (0xae) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR = (0x20800aae) +NV2080_CTRL_CMD_INTERNAL_BIF_GET_ASPM_L1_FLAGS = (0x20800ab0) +NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS_MESSAGE_ID = (0xb0) +NV2080_CTRL_CMD_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT = (0x20800ab1) +NV2080_CTRL_CMD_INTERNAL_PERF_CF_CONTROLLERS_MAX_ACTIVE_VGPU_VM_COUNT_MAX_VALUE = 32 +NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS_MESSAGE_ID = (0xB1) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_DISABLE_NVLINK_PEERS = (0x20800a6e) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE = (0x20800a6f) +NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS_MESSAGE_ID = (0x6f) +NV2080_CTRL_CMD_INTERNAL_CCU_GET_SAMPLE_INFO = (0x20800ab2) +NV2080_CTRL_CMD_INTERNAL_CCU_MAP = (0x20800ab3) +NV2080_CTRL_INTERNAL_CCU_DEV_SHRBUF_COUNT_MAX = 1 +NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS_MESSAGE_ID = (0xB3) +NV2080_CTRL_CMD_INTERNAL_CCU_UNMAP = (0x20800ab4) +NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS_MESSAGE_ID = (0xB4) +NV2080_CTRL_CMD_INTERNAL_SET_P2P_CAPS = (0x20800ab5) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB5) +NV2080_CTRL_CMD_INTERNAL_REMOVE_P2P_CAPS = (0x20800ab6) +NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB6) +NV2080_CTRL_CMD_INTERNAL_GET_PCIE_P2P_CAPS = (0x20800ab8) +NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB8) +NV2080_CTRL_CMD_INTERNAL_BIF_SET_PCIE_RO = (0x20800ab9) +NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS_MESSAGE_ID = (0xB9) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE = (0x20800a76) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS_MESSAGE_ID = (0x76) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE = (0x20800a77) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS_MESSAGE_ID = (0x77) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xBB) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES = (0x20800aba) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xBA) +NV2080_CTRL_CMD_INTERNAL_CCU_SET_STREAM_STATE = (0x20800abd) +NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS_MESSAGE_ID = (0xBD) +NV2080_CTRL_CMD_INTERNAL_GSYNC_ATTACH_AND_INIT = (0x20800abe) +NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS_MESSAGE_ID = (0xBE) +NV2080_CTRL_CMD_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS = (0x20800abf) +NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS_MESSAGE_ID = (0xBF) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_DISPLAY_IDS = (0x20800ac0) +NV2080_MAX_NUM_HEADS = 4 +NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS_MESSAGE_ID = (0xC0) +NV2080_CTRL_CMD_INTERNAL_GSYNC_SET_STREO_SYNC = (0x20800ac1) +NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS_MESSAGE_ID = (0xC1) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES = (0x20800ac4) +NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS_MESSAGE_ID = (0xC4) +NV2080_CTRL_CMD_INTERNAL_GSYNC_IS_DISPLAYID_VALID = (0x20800ac9) +NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS_MESSAGE_ID = (0xC9) +NV2080_CTRL_CMD_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC = (0x20800aca) +NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS_MESSAGE_ID = (0xCA) +NV2080_CTRL_CMD_INTERNAL_FBSR_INIT = (0x20800ac2) +NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS_MESSAGE_ID = (0xC2) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING = (0x20800ac3) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS_MESSAGE_ID = (0xC3) +NV2080_CTRL_CMD_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB = (0x20800ac5) +NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS_MESSAGE_ID = (0xC5) +NV2080_CTRL_CMD_INTERNAL_INIT_BRIGHTC_STATE_LOAD = (0x20800ac6) +NV2080_CTRL_ACPI_DSM_READ_SIZE = (0x1000) +NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS_MESSAGE_ID = (0xC6) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS_MESSAGE_ID = (0xC7) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL = (0x20800ac7) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS_MESSAGE_ID = (0xC8) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL = (0x20800ac8) +NV2080_CTRL_CMD_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE = (0x20800acb) +NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS_MESSAGE_ID = (0xCB) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_PMGR = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_THERM = 0x01 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_SMBPBI = 0x02 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_PMGR_LOAD = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_THERM_INIT = 0x01 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_SMBPBI_OP_CLEAR = 0x02 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_SMBPBI_OP_SET = 0x03 +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC = (0x20800acc) +NV2080_CTRL_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC_PARAMS_MESSAGE_ID = (0xCC) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC = (0x20800acd) +NV2080_CTRL_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC_PARAMS_MESSAGE_ID = (0xCD) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_GET_PM1_FORCED_OFF_STATUS = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_GET_PM1_STATUS = 0x01 +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE = (0x20800ace) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS_MESSAGE_ID = (0xCE) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE = (0x20800acf) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS_MESSAGE_ID = (0xCF) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT = (0x20800ad0) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS_MESSAGE_ID = (0xD0) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT = (0x20800ad1) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS_MESSAGE_ID = (0xD1) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE = (0x20800ad2) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS_MESSAGE_ID = (0xD2) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2 = (0x20800ad3) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS_MESSAGE_ID = (0xD3) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO = (0x20800ad4) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS_MESSAGE_ID = (0xD4) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING = (0x20800ad5) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS_MESSAGE_ID = (0xD5) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE = (0x20800ad6) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS_MESSAGE_ID = (0xD6) +NV2080_CTRL_CMD_INTERNAL_GCX_ENTRY_PREREQUISITE = (0x2080a7d7) +NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS_MESSAGE_ID = (0xD7) +NV2080_CTRL_CMD_INTERNAL_PMGR_UNSET_DYNAMIC_BOOST_LIMIT = (0x20800a7b) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS = (0x20800ad8) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0xD8) +NV2080_CTRL_CMD_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS = (0x20800adb) +NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS_MESSAGE_ID = (0xDB) +NV2080_CTRL_CMD_INTERNAL_DISP_PINSETS_TO_LOCKPINS = (0x20800adc) +NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS_MESSAGE_ID = (0xDC) +NV2080_CTRL_CMD_INTERNAL_DETECT_HS_VIDEO_BRIDGE = (0x20800add) +NV2080_CTRL_CMD_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL = (0x20800ade) +NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS_MESSAGE_ID = (0xDE) +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA = (0x20800adf) +MAX_EDID_SIZE_FROM_SBIOS = 512 +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS_MESSAGE_ID = (0xDF) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_ACPI_SUBSYSTEM_ACTIVATED = (0x20800af0) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_MODESET = (0x20800af1) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_MODESET = (0x20800af2) +NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF4) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_FABRIC_PROBE_INFO = (0x208001f4) +NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF5) +NV2080_CTRL_CMD_INTERNAL_GPU_START_FABRIC_PROBE = (0x208001f5) +NV2080_CTRL_CMD_INTERNAL_GPU_STOP_FABRIC_PROBE = (0x208001f6) +NV2080_CTRL_CMD_INTERNAL_GPU_SUSPEND_FABRIC_PROBE = (0x208001f7) +NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF8) +NV2080_CTRL_CMD_INTERNAL_GPU_RESUME_FABRIC_PROBE = (0x208001f8) +NV2080_CTRL_CMD_INTERNAL_GPU_INVALIDATE_FABRIC_PROBE = (0x208001f9) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO = (0x20800af3) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0xF3) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS = (0x20800ae1) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SIZE = 3 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_KERNEL = 0 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_USER = 1 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_SCRUBBER = 2 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_COUNT = 3 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_LCE_COUNT = 6 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS_MESSAGE_ID = (0xE1) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS = (0x20800ae2) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS_MESSAGE_ID = (0xE2) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_ROTATE_KEYS = (0x20800ae5) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS_MESSAGE_ID = (0xE5) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION = (0x20800ae6) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS_MESSAGE_ID = (0xE6) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE = (0x20800ae7) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS_MESSAGE_ID = (0xE7) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY = (0x20800ae8) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS_MESSAGE_ID = (0xE8) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID = (0x20800aef) +NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS_MESSAGE_ID = (0xEF) +NV2080_CTRL_CMD_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP = (0x20800afa) +CC_AES_256_GCM_AUTH_TAG_SIZE_BYTES = (0x10) +NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS_MESSAGE_ID = (0xFA) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG = (0x20800afb) +NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS_MESSAGE_ID = (0xFB) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG = (0x20800afc) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS_MESSAGE_ID = (0xFC) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO = (0x20800afd) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS_MESSAGE_ID = (0xFD) +NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS_MESSAGE_ID = (0xFE) +NV2080_CTRL_CMD_INTERNAL_INIT_USER_SHARED_DATA = (0x20800afe) +NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS_MESSAGE_ID = (0xFF) +NV2080_CTRL_CMD_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL = (0x20800aff) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS_MESSAGE_ID = (0xE3) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_START_KEEP_OLDEST = 0x00 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_START_KEEP_NEWEST = 0x01 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_STOP = 0x02 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE = (0x208001e3) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS_MESSAGE_ID = (0xAF) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES = (0x20800aaf) +NV2080_CTRL_CMD_INTERNAL_GR_CTXSW_SETUP_BIND = (0x20800ae4) +NV2080_CTRL_INTERNAL_GR_CTXSW_SETUP_BIND_PARAMS_MESSAGE_ID = (0xE4) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS_MESSAGE_ID = (0xE9) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER = (0x20800ae9) +NV2080_CTRL_CMD_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY = (0x20800aea) +NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS_MESSAGE_ID = (0xEA) +NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS_MESSAGE_ID = (0xEB) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP = (0x20800aeb) +NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS_MESSAGE_ID = (0xEC) +NV2080_CTRL_CMD_INTERNAL_GPU_SET_ILLUM = (0x20800aec) +NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS_MESSAGE_ID = (0xED) +NV2080_CTRL_CMD_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR = (0x20800aed) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM = (0x20800a79) +NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS_MESSAGE_ID = (0x79) +NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE = (0x20800a14) +NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS_MESSAGE_ID = (0xEE) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_PF_BAR1_SPA = (0x20800aee) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_NVLINK_PEER = (0x20800a21) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x21) +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_OFF = 0x00 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_HS = 0x01 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SAFE = 0x02 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_FAULT = 0x03 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RECOVERY = 0x04 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_FAIL = 0x05 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DETECT = 0x06 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RESET = 0x07 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ENABLE_PM = 0x08 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_PM = 0x09 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SLEEP = 0x0A +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SAVE_STATE = 0x0B +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RESTORE_STATE = 0x0C +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_PRE_HS = 0x0E +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_ERR_DETECT = 0x0F +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_LANE_DISABLE = 0x10 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_LANE_SHUTDOWN = 0x11 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_TRAFFIC_SETUP = 0x12 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITPHASE1 = 0x13 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITNEGOTIATE = 0x14 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_POST_INITNEGOTIATE = 0x15 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITOPTIMIZE = 0x16 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_POST_INITOPTIMIZE = 0x17 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_HEARTBEAT = 0x18 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_CONTAIN = 0x19 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITTL = 0x1A +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITPHASE5 = 0x1B +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ALI = 0x1C +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ACTIVE_PENDING = 0x1D +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INVALID = 0xFF +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_HS = 0x00 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_SINGLE_LANE = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_LOW_POWER = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_TRAIN = 0x05 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_SAFE = 0x06 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_OFF = 0x07 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_COMMON_MODE = 0x08 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_COMMON_MODE_DISABLE = 0x09 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_DATA_READY = 0x0A +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_EQ = 0x0B +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_PRBS_EN = 0x0C +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_POST_HS = 0x0D +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_HS = 0x00 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_SINGLE_LANE = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_LOW_POWER = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_TRAIN = 0x05 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_SAFE = 0x06 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_OFF = 0x07 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_RXCAL = 0x08 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_INIT_TERM = 0x09 +NV2080_CTRL_INTERNAL_NVLINK_MAX_SEED_NUM = 6 +NV2080_CTRL_INTERNAL_NVLINK_MAX_SEED_BUFFER_SIZE = (0x7) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_DL_LINK_MODE = 0x00 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_DL_LINK_MODE = 0x01 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_TL_LINK_MODE = 0x02 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_TL_LINK_MODE = 0x03 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_TX_SUBLINK_MODE = 0x04 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_TX_SUBLINK_MODE = 0x05 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_RX_SUBLINK_MODE = 0x06 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_RX_SUBLINK_MODE = 0x07 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_RX_SUBLINK_DETECT = 0x08 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_RX_SUBLINK_DETECT = 0x09 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_WRITE_DISCOVERY_TOKEN = 0x0A +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_READ_DISCOVERY_TOKEN = 0x0B +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_TRAINING_COMPLETE = 0x0C +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_UPHY_LOAD = 0x0D +NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_INTERNAL_NVLINK_CORE_CALLBACK = (0x20800a24) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID = (0x20800a25) +NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_ALI_ENABLED = (0x20800a29) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_TYPE_PROGRAM = 0x0 +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_TYPE_RESET = 0x1 +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_HSHUB_MUX = (0x20800a42) +NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x4E) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER = (0x20800a4e) +NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER = (0x20800a50) +NV2080_CTRL_CMD_INTERNAL_LOG_OOB_XID = (0x20800a56) +NV2080_INTERNAL_OOB_XID_MESSAGE_BUFFER_SIZE = (81) +NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_TYPE_SYSMEM = 0x1 +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_TYPE_PEER = 0x2 +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS_MESSAGE_ID = (0x5F) +NV2080_CTRL_CMD_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING = (0x20800a5f) +NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS_MESSAGE_ID = (0x62) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE = (0x20800a62) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_SET = (0x00000000) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_SAVE = (0x00000001) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_RESTORE = (0x00000002) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS_MESSAGE_ID = (0x64) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROGRAM_BUFFERREADY = (0x20800a64) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS_MESSAGE_ID = (0x78) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG = (0x20800a78) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS_MESSAGE_ID = (0x7D) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK = (0x20800a7d) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION = (0x20800a82) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY = (0x20800a83) +NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS_MESSAGE_ID = (0x84) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI = (0x20800a84) +NV2080_CTRL_INTERNAL_NVLINK_MAX_ARR_SIZE = 64 +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET = (0x20800a85) +NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS_MESSAGE_ID = (0x86) +NV2080_CTRL_CMD_INTERNAL_NVLINK_LINK_TRAIN_ALI = (0x20800a86) +NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO = (0x20800a87) +NV2080_CTRL_INTERNAL_NVLINK_MAX_LINKS_PER_IOCTRL_SW = 6 +NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO = (0x20800a8e) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS_MESSAGE_ID = (0x8F) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROGRAM_LINK_SPEED = (0x20800a8f) +NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS_MESSAGE_ID = (0x90) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ARE_LINKS_TRAINED = (0x20800a90) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_ASSERT = (0x00000000) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_DEASSERT = (0x00000001) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_TOGGLE = (0x00000002) +NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS_MESSAGE_ID = (0x91) +NV2080_CTRL_CMD_INTERNAL_NVLINK_RESET_LINKS = (0x20800a91) +NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_CMD_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS = (0x20800a92) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS_MESSAGE_ID = (0x93) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO = (0x20800a93) +NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS_MESSAGE_ID = (0x94) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM = (0x20800a94) +NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS_MESSAGE_ID = (0x95) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS = (0x20800a95) +NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS = (0x20800a96) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS_MESSAGE_ID = (0x97) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS = (0x20800a97) +NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS_MESSAGE_ID = (0xAB) +NV2080_CTRL_CMD_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK = (0x20800aab) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL = (0x20802801) +NV2080_CTRL_LPWR_DIFR_CTRL_DISABLE = (0x00000001) +NV2080_CTRL_LPWR_DIFR_CTRL_ENABLE = (0x00000002) +NV2080_CTRL_LPWR_DIFR_CTRL_SUPPORT_STATUS = (0x00000003) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_LPWR_DIFR_SUPPORTED = (0x00000001) +NV2080_CTRL_LPWR_DIFR_NOT_SUPPORTED = (0x00000002) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE = (0x20802802) +NV2080_CTRL_LPWR_DIFR_PREFETCH_SUCCESS = (0x00000001) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_OS_FLIPS_ENABLED = (0x00000002) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_INSUFFICIENT_L2_SIZE = (0x00000003) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_CE_HW_ERROR = (0x00000004) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_MC_GET_ARCH_INFO = (0x20801701) +NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_T23X = (0xE0000023) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_TU100 = (0x00000160) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GA100 = (0x00000170) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GH100 = (0x00000180) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_AD100 = (0x00000190) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GB100 = (0x000001A0) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GB200 = (0x000001B0) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_T234 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_T234D = (0x00000005) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU116 = (0x00000008) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU117 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA103 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA107 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA10B = (0x0000000B) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GH100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GH100_SOC = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD000 = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD101 = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD103 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD107 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD10B = (0x0000000B) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB200 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB202 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB203 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB204 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB205 = (0x00000005) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB206 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB207 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_NO_SUBREVISION = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_P = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_Q = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_R = (0x00000003) +NV2080_CTRL_CMD_MC_SERVICE_INTERRUPTS = (0x20801702) +NV2080_CTRL_MC_ENGINE_ID_GRAPHICS = 0x00000001 +NV2080_CTRL_MC_ENGINE_ID_ALL = 0xFFFFFFFF +NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_MC_GET_MANUFACTURER = (0x20801703) +NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP = (0x2080170c) +NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS = (0x2080170d) +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_MAX_ENGINES = 256 +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_MC_GET_STATIC_INTR_TABLE = (0x2080170e) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_MAX = 32 +NV2080_INTR_TYPE_NULL = (0x00000000) +NV2080_INTR_TYPE_NON_REPLAYABLE_FAULT = (0x00000001) +NV2080_INTR_TYPE_NON_REPLAYABLE_FAULT_ERROR = (0x00000002) +NV2080_INTR_TYPE_INFO_FAULT = (0x00000003) +NV2080_INTR_TYPE_REPLAYABLE_FAULT = (0x00000004) +NV2080_INTR_TYPE_REPLAYABLE_FAULT_ERROR = (0x00000005) +NV2080_INTR_TYPE_ACCESS_CNTR = (0x00000006) +NV2080_INTR_TYPE_TMR = (0x00000007) +NV2080_INTR_TYPE_CPU_DOORBELL = (0x00000008) +NV2080_INTR_TYPE_GR0_FECS_LOG = (0x00000009) +NV2080_INTR_TYPE_GR1_FECS_LOG = (0x0000000A) +NV2080_INTR_TYPE_GR2_FECS_LOG = (0x0000000B) +NV2080_INTR_TYPE_GR3_FECS_LOG = (0x0000000C) +NV2080_INTR_TYPE_GR4_FECS_LOG = (0x0000000D) +NV2080_INTR_TYPE_GR5_FECS_LOG = (0x0000000E) +NV2080_INTR_TYPE_GR6_FECS_LOG = (0x0000000F) +NV2080_INTR_TYPE_GR7_FECS_LOG = (0x00000010) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_NVD_GET_DUMP_SIZE = (0x20802401) +NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_NVD_GET_DUMP = (0x20802402) +NV2080_CTRL_NVD_GET_DUMP_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_NVD_GET_NOCAT_JOURNAL = (0x20802409) +NV2080_NOCAT_JOURNAL_MAX_DIAG_BUFFER = 1024 +NV2080_NOCAT_JOURNAL_MAX_STR_LEN = 65 +NV2080_NOCAT_JOURNAL_MAX_JOURNAL_RECORDS = 10 +NV2080_NOCAT_JOURNAL_MAX_ASSERT_RECORDS = 32 +NV2080_NOCAT_JOURNAL_REC_TYPE_UNKNOWN = 0 +NV2080_NOCAT_JOURNAL_REC_TYPE_BUGCHECK = 1 +NV2080_NOCAT_JOURNAL_REC_TYPE_ENGINE = 2 +NV2080_NOCAT_JOURNAL_REC_TYPE_TDR = 3 +NV2080_NOCAT_JOURNAL_REC_TYPE_RC = 4 +NV2080_NOCAT_JOURNAL_REC_TYPE_ASSERT = 5 +NV2080_NOCAT_JOURNAL_REC_TYPE_ANY = 6 +NV2080_NOCAT_JOURNAL_REC_TYPE_COUNT = (0x7) +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_REQ_IDX = 0 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_GRANDFATHERED_RECORD_IDX = 1 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_ALLOCATED_IDX = 2 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECTED_IDX = 3 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NOTIFICATIONS_IDX = 4 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NOTIFICATION_FAIL_IDX = 5 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_ALLOC_FAILED_IDX = 6 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_FAILED_IDX = 7 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_LOCKED_OUT_IDX = 8 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_CTRL_INSERT_RECORDS_IDX = 9 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RPC_INSERT_RECORDS_IDX = 10 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_LOCKED_IDX = 11 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_LOCK_UPDATED_IDX = 12 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_UNLOCKED_IDX = 13 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NO_RECORDS_IDX = 14 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_BUFFER_IDX = 15 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_MATCH_FOUND_IDX = 16 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NO_MATCH_IDX = 17 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_CLOSEST_FOUND_IDX = 18 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_REQUESTED_IDX = 19 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_REPORTED_IDX = 20 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_DROPPED_IDX = 21 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATE_REQ_IDX = 22 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATED_IDX = 23 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATE_FAILED_IDX = 24 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BUSY_IDX = 25 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_PARAM_IDX = 26 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_TYPE_IDX = 27 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES4_IDX = 28 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES3_IDX = 29 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES2_IDX = 30 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES1_IDX = 31 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COUNTER_COUNT = (0x20) +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY = (0, 0) +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY_YES = 1 +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY_NO = 0 +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS = (1, 1) +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS_YES = 1 +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS_NO = 0 +NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_NVD_SET_NOCAT_JOURNAL_DATA = (0x2080240b) +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_EMPTY = 0 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_TDR_REASON = 1 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_SET_TAG = 2 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_RCLOG = 3 +NV2080_CTRL_NOCAT_TDR_TYPE_NONE = 0 +NV2080_CTRL_NOCAT_TDR_TYPE_LEGACY = 1 +NV2080_CTRL_NOCAT_TDR_TYPE_FULLCHIP = 2 +NV2080_CTRL_NOCAT_TDR_TYPE_BUSRESET = 3 +NV2080_CTRL_NOCAT_TDR_TYPE_GC6_RESET = 4 +NV2080_CTRL_NOCAT_TDR_TYPE_SURPRISE_REMOVAL = 5 +NV2080_CTRL_NOCAT_TDR_TYPE_UCODE_RESET = 6 +NV2080_CTRL_NOCAT_TDR_TYPE_TEST = 7 +NV2080_CTRL_NOCAT_TAG_CLEAR = (0, 0) +NV2080_CTRL_NOCAT_TAG_CLEAR_YES = 1 +NV2080_CTRL_NOCAT_TAG_CLEAR_NO = 0 +NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD = (0x2080240c) +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR = (0, 0) +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR_YES = 1 +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR_NO = 0 +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER = (1, 1) +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER_YES = 1 +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER_NO = 0 +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_NVLINK_CAPS_TBL_SIZE = 2 +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_INVALID = (0x00000000) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_INVALID = (0x00000000) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_5_0 = (0x00000008) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS = (0x20803001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS = (31, 0) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_NONE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_PCI = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_UUID = (0x00000002) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_EBRIDGE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_NPU = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_GPU = (0x00000002) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_SWITCH = (0x00000003) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_TEGRA = (0x00000004) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_NONE = (0x000000FF) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_UUID_INVALID = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED = (0, 0) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY = (1, 1) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY_INACTIVE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY_ACTIVE = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_INIT = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_HWCFG = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_SWCFG = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_ACTIVE = (0x00000003) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_FAULT = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_SLEEP = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY_AC = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY_RX = (0x0000000a) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_INVALID = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_HIGH_SPEED_1 = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_LOW_POWER = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_TRAINING = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_SAFE_MODE = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_TEST = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_FAULT = (0x0000000e) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_HIGH_SPEED_1 = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_LOW_POWER = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_TRAINING = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_SAFE_MODE = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_TEST = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_FAULT = (0x0000000e) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_PHY_NVHS = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_PHY_GRS = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_PHY_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NVHS_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NVHS_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_GRS_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_GRS_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_CONNECTED_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_CONNECTED_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_LOOPBACK = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_LOOPOUT = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_NONE = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_REMOTE_LINK_NUMBER_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_MAX_LINKS = 32 +NV2080_CTRL_NVLINK_MAX_ARR_SIZE = 64 +NV2080_CTRL_NVLINK_REFCLK_TYPE_INVALID = (0x00) +NV2080_CTRL_NVLINK_REFCLK_TYPE_NVHS = (0x01) +NV2080_CTRL_NVLINK_REFCLK_TYPE_PEX = (0x02) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS = (0x20803002) +NV2080_CTRL_NVLINK_GET_TL_ERRLOG_BIT = lambda intr,i: (((1 << i) & (intr)) >> i) # type: ignore +NV2080_CTRL_NVLINK_GET_TL_INTEN_BIT = lambda intr,i: NV2080_CTRL_NVLINK_GET_TL_ERRLOG_BIT(intr, i) # type: ignore +NV2080_CTRL_NVLINK_TL_ERRLOG_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_TL_ERRLOG_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_TL_INTEN_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_TL_INTEN_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXDLDATAPARITYEN = 0 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXDLCTRLPARITYEN = 1 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXPROTOCOLEN = 2 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXOVERFLOWEN = 3 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRAMDATAPARITYEN = 4 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRAMHDRPARITYEN = 5 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRESPEN = 6 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXPOISONEN = 7 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXRAMDATAPARITYEN = 8 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXRAMHDRPARITYEN = 9 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_DLFLOWPARITYEN = 10 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_DLHDRPARITYEN = 12 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXCREDITEN = 13 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_MAX = 14 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXDLDATAPARITYERR = 0 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXDLCTRLPARITYERR = 1 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXPROTOCOLERR = 2 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXOVERFLOWERR = 3 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRAMDATAPARITYERR = 4 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRAMHDRPARITYERR = 5 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRESPERR = 6 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXPOISONERR = 7 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXRAMDATAPARITYERR = 8 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXRAMHDRPARITYERR = 9 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_DLFLOWPARITYERR = 10 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_DLHDRPARITYERR = 12 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXCREDITERR = 13 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_MAX = 14 +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_HS = (0x00000000) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_TRAIN = (0x00000005) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_SAFE = (0x00000006) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_HS = (0x00000000) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_TRAIN = (0x00000005) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_SAFE = (0x00000006) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_DEFAULT = (0x0) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_INTR_STATUS = (0x1) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_ALI_STATUS = (0x2) +NV2080_CTRL_NVLINK_MAX_IOCTRLS = 3 +NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_NVLINK_GET_ERR_INFO = (0x20803003) +NV2080_CTRL_NVLINK_COUNTER_INVALID = 0x00000000 +NV2080_CTRL_NVLINK_COUNTER_TL_TX0 = 0x00000001 +NV2080_CTRL_NVLINK_COUNTER_TL_TX1 = 0x00000002 +NV2080_CTRL_NVLINK_COUNTER_TL_RX0 = 0x00000004 +NV2080_CTRL_NVLINK_COUNTER_TL_RX1 = 0x00000008 +NV2080_CTRL_NVLINK_LP_COUNTERS_DL = 0x00000010 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L = lambda i: (1 << (i + 8)) # type: ignore +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE__SIZE = 4 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L0 = 0x00000100 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L1 = 0x00000200 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L2 = 0x00000400 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L3 = 0x00000800 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_FLIT = 0x00010000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L = lambda i: (1 << (i + 17)) # type: ignore +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE__SIZE = 8 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L0 = 0x00020000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L1 = 0x00040000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L2 = 0x00080000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L3 = 0x00100000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L4 = 0x00200000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L5 = 0x00400000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L6 = 0x00800000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L7 = 0x01000000 +NV2080_CTRL_NVLINK_COUNTER_DL_TX_ERR_REPLAY = 0x02000000 +NV2080_CTRL_NVLINK_COUNTER_DL_TX_ERR_RECOVERY = 0x04000000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_REPLAY = 0x08000000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_MASKED = 0x10000000 +NV2080_CTRL_NVLINK_COUNTER_MAX_TYPES = 32 +NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_NVLINK_GET_COUNTERS = (0x20803004) +NV2080_CTRL_CMD_NVLINK_CLEAR_COUNTERS = (0x20803005) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_NVLINK_COUNTER_TP_TL_TX0 = 0 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_TX1 = 1 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_RX0 = 2 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_RX1 = 3 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_SIZE = 4 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L0 = 4 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L1 = 5 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L2 = 6 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L3 = 7 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_SIZE = 8 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L0 = 8 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L1 = 9 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L2 = 10 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L3 = 11 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L4 = 12 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L5 = 13 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L6 = 14 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L7 = 15 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_TX_ERR_RECOVERY = 16 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_TX_ERR_REPLAY = 17 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_REPLAY = 18 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_MASKED = 19 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_FLIT = 20 +NV2080_CTRL_NVLINK_COUNTER_LP_DL = 21 +NV2080_CTRL_NVLINK_COUNTER_V1_MAX_COUNTER = NV2080_CTRL_NVLINK_COUNTER_LP_DL +NV2080_CTRL_NVLINK_COUNTER_XMIT_PACKETS = 22 +NV2080_CTRL_NVLINK_COUNTER_XMIT_BYTES = 23 +NV2080_CTRL_NVLINK_COUNTER_RCV_PACKETS = 24 +NV2080_CTRL_NVLINK_COUNTER_RCV_BYTES = 25 +NV2080_CTRL_NVLINK_COUNTER_LINK_ERROR_RECOVERY_COUNTER = 26 +NV2080_CTRL_NVLINK_COUNTER_LINK_DOWNED_COUNTER = 27 +NV2080_CTRL_NVLINK_COUNTER_LINK_RECOVERY_SUCCESSFUL_COUNTER = 28 +NV2080_CTRL_NVLINK_COUNTER_RCV_ERRORS = 29 +NV2080_CTRL_NVLINK_COUNTER_RCV_REMOTE_ERRORS = 30 +NV2080_CTRL_NVLINK_COUNTER_RCV_GENERAL_ERRORS = 31 +NV2080_CTRL_NVLINK_COUNTER_RCV_MALFORMED_PKT_ERROR = 32 +NV2080_CTRL_NVLINK_COUNTER_RCV_BUFFER_OVERRUN_ERROR = 33 +NV2080_CTRL_NVLINK_COUNTER_RCV_VL15DROPPED_ERROR = 34 +NV2080_CTRL_NVLINK_COUNTER_LINK_INTEGRITY_ERRORS = 35 +NV2080_CTRL_NVLINK_COUNTER_BUFFER_OVERRUN_ERRORS = 36 +NV2080_CTRL_NVLINK_COUNTER_XMIT_WAIT_TIME = 37 +NV2080_CTRL_NVLINK_COUNTER_XMIT_ERRORS = 38 +NV2080_CTRL_NVLINK_COUNTER_SINGLE_ERROR_BLOCKS = 39 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_BLOCKS = 40 +NV2080_CTRL_NVLINK_COUNTER_UNCORRECTED_BLOCKS = 41 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_LANE_0 = 42 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_LANE_1 = 43 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_TOTAL = 44 +NV2080_CTRL_NVLINK_COUNTER_RAW_ERRORS_LANE_0 = 45 +NV2080_CTRL_NVLINK_COUNTER_RAW_ERRORS_LANE_1 = 46 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_BITS = 47 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_LANE_0 = 48 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_LANE_1 = 49 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_TOTAL = 50 +NV2080_CTRL_NVLINK_COUNTER_NO_ERROR_BLOCKS = 51 +NV2080_CTRL_NVLINK_COUNTER_EFFECTIVE_ERRORS = 52 +NV2080_CTRL_NVLINK_COUNTER_EFFECTIVE_BER = 53 +NV2080_CTRL_NVLINK_COUNTER_SYMBOL_ERRORS = 54 +NV2080_CTRL_NVLINK_COUNTER_SYMBOL_BER = 55 +NV2080_CTRL_NVLINK_COUNTER_RECEIVED_BITS = 56 +NV2080_CTRL_NVLINK_COUNTER_SYNC_HEADER_ERRORS = 57 +NV2080_CTRL_NVLINK_COUNTER_TIME_SINCE_LAST_CLEAR = 58 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS = 59 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS_WITH_UNCORRECTABLE_ERRORS = 60 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS_WITH_ERRORS = 61 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_BLOCKS = 62 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_RETRY_BLOCKS = 63 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_RETRY_EVENTS = 64 +NV2080_CTRL_NVLINK_COUNTER_PLR_BW_LOSS = 65 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_GOOD = 66 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_ERROR = 67 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_AUTH = 68 +NV2080_CTRL_NVLINK_COUNTER_NVLE_TX_GOOD = 69 +NV2080_CTRL_NVLINK_COUNTER_NVLE_TX_ERROR = 70 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_0 = 71 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_1 = 72 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_2 = 73 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_3 = 74 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_4 = 75 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_5 = 76 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_6 = 77 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_7 = 78 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_8 = 79 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_9 = 80 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_10 = 81 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_11 = 82 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_12 = 83 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_13 = 84 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_14 = 85 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_15 = 86 +NV2080_CTRL_NVLINK_COUNTER_TP_RX_DATA = 87 +NV2080_CTRL_NVLINK_COUNTER_TP_TX_DATA = 88 +NV2080_CTRL_NVLINK_COUNTER_TP_RX_RAW = 89 +NV2080_CTRL_NVLINK_COUNTER_TP_TX_RAW = 90 +NV2080_CTRL_NVLINK_COUNTER_L1_ENTRY = 91 +NV2080_CTRL_NVLINK_COUNTER_L1_ENTRY_FORCE = 92 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT = 93 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT_RECAL = 94 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT_REMOTE = 95 +NV2080_CTRL_NVLINK_COUNTER_L1_LP_STEADY_STATE_TIME = 96 +NV2080_CTRL_NVLINK_COUNTER_L1_HIGH_SPEED_STEADY_STATE_TIME = 97 +NV2080_CTRL_NVLINK_COUNTER_L1_OTHER_STATE_TIME = 98 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_ENTRY_TIME = 99 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_EXIT_TIME = 100 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_FULL_BW_ENTRY_TIME = 101 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_FULL_BW_EXIT_TIME = 102 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_ENTRY_TIME = 103 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_EXIT_TIME = 104 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_FULL_BW_ENTRY_TIME = 105 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_FULL_BW_EXIT_TIME = 106 +NV2080_CTRL_NVLINK_COUNTERS_MAX = 107 +NV2080_CTRL_NVLINK_COUNTER_MAX_GROUPS = 2 +NV2080_CTRL_NVLINK_COUNTER_MAX_COUNTERS_PER_LINK_IN_REQ = 28 +NV2080_CTRL_NVLINK_COUNTER_V2_GROUP = lambda i: ((i) / 64) # type: ignore +NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_NVLINK_GET_COUNTERS_V2 = (0x20803050) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_CMD_NVLINK_CLEAR_COUNTERS_V2 = (0x20803051) +NV2080_CTRL_CMD_NVLINK_INJECT_ERROR = (0x20803006) +NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_NVLINK_UNIT_DL = 0x01 +NV2080_CTRL_NVLINK_UNIT_TL = 0x02 +NV2080_CTRL_NVLINK_UNIT_TLC_RX_0 = 0x03 +NV2080_CTRL_NVLINK_UNIT_TLC_RX_1 = 0x04 +NV2080_CTRL_NVLINK_UNIT_TLC_TX_0 = 0x05 +NV2080_CTRL_NVLINK_UNIT_MIF_RX_0 = 0x06 +NV2080_CTRL_NVLINK_UNIT_MIF_TX_0 = 0x07 +NV2080_CTRL_NVLINK_UNIT_MINION = 0x08 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE = (31, 28) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_NO_ERROR = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_RAW_BER = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_EFFECTIVE_BER = 0x00000002 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_ERR_INJECT_DURATION = (27, 12) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_BER_MANTISSA = (11, 8) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_BER_EXPONENT = (7, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_INJECT_COUNT = (15, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP = (16, 16) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON = (17, 17) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_CLEAR_COUNTERS = (18, 18) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_PIPE_INDEX = (3, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR = (4, 4) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN = (0, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN_EN = 0x00000001 +NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_NVLINK_SET_HW_ERROR_INJECT = (0x20803081) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE = (1, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_UP = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_DOWN_BY_REQUEST = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_DOWN_BY_HW_ERR = 0x00000002 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS = (0, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS_NO_ERR_INJECT = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS_PERFORMING_ERR_INJECT = 0x00000001 +NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_NVLINK_GET_HW_ERROR_INJECT = (0x20803082) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES = (0x20803007) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE = (0x20803008) +NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FATAL_ERROR_COUNTS = (0x20803009) +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_DL_DATA_PARITY = 0 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_DL_CTRL_PARITY = 1 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_PROTOCOL = 2 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_OVERFLOW = 3 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RAM_DATA_PARITY = 4 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RAM_HDR_PARITY = 5 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RESP = 6 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_POISON = 7 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_RAM_DATA_PARITY = 8 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_RAM_HDR_PARITY = 9 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_CREDIT = 10 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_DL_FLOW_CTRL_PARITY = 11 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_DL_HDR_PARITY = 12 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_RECOVERY_LONG = 13 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_RAM = 14 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_INTERFACE = 15 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_SUBLINK_CHANGE = 16 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_RX_FAULT_SUBLINK_CHANGE = 17 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_RX_FAULT_DL_PROTOCOL = 18 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT = 19 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_DATA_PARITY = 0 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_CTRL_PARITY = 1 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RAM_DATA_PARITY = 4 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RAM_HDR_PARITY = 5 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DATA_POISONED_PKT_RCVD = 7 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RAM_DATA_PARITY = 8 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RAM_HDR_PARITY = 9 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DL_FLOW_CONTROL_PARITY = 11 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_HDR_PARITY = 20 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_AE_FLIT_RCVD = 21 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_BE_FLIT_RCVD = 22 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_ADDR_ALIGN = 23 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_PKT_LEN = 24 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CMD_ENC = 25 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_DAT_LEN_ENC = 26 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_ADDR_TYPE = 27 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_RSP_STATUS = 28 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_PKT_STATUS = 29 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CACHE_ATTR_ENC_IN_PROBE_REQ = 30 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CACHE_ATTR_ENC_IN_PROBE_RESP = 31 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_GT_ATOMIC_REQ_MAX_SIZE = 32 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_GT_RMW_REQ_MAX_SIZE = 33 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_LT_ATR_RESP_MIN_SIZE = 34 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_PO_FOR_CACHE_ATTR = 35 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_COMPRESSED_RESP = 36 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RESP_STATUS_TARGET = 37 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RESP_STATUS_UNSUPPORTED_REQUEST = 38 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_HDR_OVERFLOW = 39 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DATA_OVERFLOW = 40 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_STOMPED_PKT_RCVD = 41 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_CORRECTABLE_INTERNAL = 42 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_VC_OVERFLOW = 43 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_NVLINK_CREDIT_RELEASE = 44 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_NCISOC_CREDIT_RELEASE = 45 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_HDR_CREDIT_OVERFLOW = 46 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DATA_CREDIT_OVERFLOW = 47 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DL_REPLAY_CREDIT_OVERFLOW = 48 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_UNSUPPORTED_VC_OVERFLOW = 49 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_STOMPED_PKT_SENT = 50 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DATA_POISONED_PKT_SENT = 51 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RESP_STATUS_TARGET = 52 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RESP_STATUS_UNSUPPORTED_REQUEST = 53 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_RX_RAM_DATA_PARITY = 54 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_RX_RAM_HDR_PARITY = 55 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_TX_RAM_DATA_PARITY = 56 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_TX_RAM_HDR_PARITY = 57 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_COLLAPSED_RESPONSE = 58 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_NCISOC_HDR_ECC_DBE = 59 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_NCISOC_PARITY = 60 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT_UP = 61 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT_DOWN = 62 +NV2080_CTRL_NVLINK_NUM_FATAL_ERROR_TYPES = 63 +NV2080_CTRL_NVLINK_IS_FATAL_ERROR_COUNT_VALID = lambda count,supportedCounts: ( not not ((supportedCounts) & NVBIT64(count))) # type: ignore +NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_NVLINK_GET_LINK_NONFATAL_ERROR_RATES = (0x2080300a) +NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE_ENTRIES = 5 +NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_NVLINK_SET_ERROR_INJECTION_MODE = (0x2080300b) +NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM = (0x2080300c) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_NVLINK_SET_POWER_STATE = (0x2080300d) +NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_NVLINK_POWER_STATE_L0 = (0x00) +NV2080_CTRL_NVLINK_POWER_STATE_L1 = (0x01) +NV2080_CTRL_NVLINK_POWER_STATE_L2 = (0x02) +NV2080_CTRL_NVLINK_POWER_STATE_L3 = (0x03) +NV2080_CTRL_CMD_NVLINK_GET_POWER_STATE = (0x2080300e) +NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_NVLINK_INJECT_TLC_ERROR = (0x2080300f) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES = (0x20803011) +NV2080_CTRL_NVLINK_MAX_LANES = 4 +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_NVLINK_SET_NVLINK_PEER = (0x20803012) +NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_NVLINK_READ_UPHY_PAD_LANE_REG = (0x20803013) +NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_ECC_ERRORS = (0x20803014) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_DATA_TX = 0 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_DATA_RX = 1 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_RAW_TX = 2 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_RAW_RX = 3 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_MAX = 4 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_NVLINK_READ_TP_COUNTERS = (0x20803015) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE = (0x20803016) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_NVHS = 0 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_EIGHTH = 1 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_OTHER = 2 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_NUM_TX_LP_ENTER = 3 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_NUM_TX_LP_EXIT = 4 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_SLEEP = 5 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_HS_TIME = 6 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_FULL_BW_EXIT_TIME = 7 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_LP_ENTRY_TIME = 8 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_LP_EXIT_TIME = 9 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_FULL_BW_ENTRY_TIME = 10 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_FULL_BW_EXIT_TIME = 11 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_LP_ENTRY_TIME = 12 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_LP_EXIT_TIME = 13 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_FULL_BW_ENTRY_TIME = 14 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_OTHER_STATE_TIME = 15 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_MAX_COUNTERS = 16 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_NVLINK_GET_LP_COUNTERS = (0x20803018) +NV2080_CTRL_CMD_NVLINK_CLEAR_LP_COUNTERS = (0x20803052) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_DEFAULT = (0x00000000) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEA = (0x00000001) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEDR = (0x00000002) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEDW = (0x00000003) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PHY_REMOTE = (0x00000004) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PHY_LOCAL = (0x00000005) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_EXT_LOCAL = (0x00000006) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_NVLINK_SET_LOOPBACK_MODE = (0x20803023) +NV2080_CTRL_NVLINK_MAX_LINK_COUNT = 32 +NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_NVLINK_GET_REFRESH_COUNTERS = (0x20803028) +NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_NVLINK_CLEAR_REFRESH_COUNTERS = (0x20803029) +NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_NVLINK_GET_SET_NVSWITCH_FLA_ADDR = (0x20803038) +NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO = (0x20803039) +NV2080_CTRL_CMD_NVLINK_ENABLE_LINKS = (0x2080303a) +NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS_MESSAGE_ID = (0x3b) +NV2080_CTRL_CMD_NVLINK_PROCESS_INIT_DISABLED_LINKS = (0x2080303b) +NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS_MESSAGE_ID = (0x3c) +NV2080_CTRL_CMD_NVLINK_EOM_CONTROL = (0x2080303c) +NV2080_CTRL_NVLINK_INBAND_MAX_DATA_SIZE = 5120 +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_MESSAGE_ID = (0x3d) +NV2080_CTRL_CMD_READ_NVLINK_INBAND_RESPONSE = (0x2080303d) +NV2080_CTRL_NVLINK_L1_THRESHOLD_VALUE_DEFAULT = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS_MESSAGE_ID = (0x3e) +NV2080_CTRL_CMD_NVLINK_SET_L1_THRESHOLD = (0x2080303e) +NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS_MESSAGE_ID = (0x3f) +NV2080_CTRL_CMD_NVLINK_GET_L1_THRESHOLD = (0x2080303f) +NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_NVLINK_INBAND_SEND_DATA = (0x20803040) +NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_CMD_NVLINK_IS_GPU_DEGRADED = (0x20803041) +NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_NVLINK_DIRECT_CONNECT_CHECK = (0x20803042) +NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_CMD_NVLINK_POST_FAULT_UP = (0x20803043) +NV2080_CTRL_NVLINK_PORT_EVENT_COUNT_SIZE = 64 +NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_NVLINK_GET_PORT_EVENTS = (0x20803044) +NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS_MESSAGE_ID = (0x45) +NV2080_CTRL_CMD_NVLINK_CYCLE_LINK = (0x20803045) +NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_CMD_NVLINK_IS_REDUCED_CONFIG = (0x20803046) +NV2080_CTRL_NVLINK_PRM_ACCESS_MAX_LENGTH = 496 +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PAOS = (0x20803047) +NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_NVLINK_FATAL_ERROR_RECOVERY = (0x20803048) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PLTC = (0x20803053) +NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPLM = (0x20803054) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPSLC = (0x20803055) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MCAM = (0x20803056) +NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTECR = (0x2080305c) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS_MESSAGE_ID = (0x5c) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTEWE = (0x2080305e) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS_MESSAGE_ID = (0x5e) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTSDE = (0x2080305f) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS_MESSAGE_ID = (0x5f) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTCAP = (0x20803061) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS_MESSAGE_ID = (0x61) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PMTU = (0x20803062) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS_MESSAGE_ID = (0x62) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PMLP = (0x20803064) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS_MESSAGE_ID = (0x64) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_GHPKT = (0x20803065) +NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS_MESSAGE_ID = (0x65) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PDDR = (0x20803066) +NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS_MESSAGE_ID = (0x66) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPTT = (0x20803068) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPCNT = (0x20803069) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MGIR = (0x2080306a) +NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS_MESSAGE_ID = (0x6a) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPAOS = (0x2080306b) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS_MESSAGE_ID = (0x6b) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPHCR = (0x2080306c) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS_MESSAGE_ID = (0x6c) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_SLTP = (0x2080306d) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS_MESSAGE_ID = (0x6d) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PGUID = (0x2080306e) +NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS_MESSAGE_ID = (0x6e) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPRT = (0x2080306f) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS_MESSAGE_ID = (0x6f) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PTYS = (0x20803070) +NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS_MESSAGE_ID = (0x70) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_SLRG = (0x20803071) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS_MESSAGE_ID = (0x71) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PMAOS = (0x20803072) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS_MESSAGE_ID = (0x72) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPLR = (0x20803073) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS_MESSAGE_ID = (0x73) +NV2080_CTRL_CMD_NVLINK_GET_SUPPORTED_COUNTERS = (0x20803074) +NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MORD = (0x20803075) +NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS_MESSAGE_ID = (0x75) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTRC_CAP = (0x20803076) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS_MESSAGE_ID = (0x76) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTRC_CONF = (0x20803077) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS_MESSAGE_ID = (0x77) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTRC_CTRL = (0x20803078) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS_MESSAGE_ID = (0x78) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTEIM = (0x20803079) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS_MESSAGE_ID = (0x79) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTIE = (0x2080307a) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS_MESSAGE_ID = (0x7a) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTIM = (0x2080307b) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS_MESSAGE_ID = (0x7b) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MPSCR = (0x2080307c) +NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS_MESSAGE_ID = (0x7c) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTSR = (0x2080307d) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS_MESSAGE_ID = (0x7d) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPSLS = (0x2080307e) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS_MESSAGE_ID = (0x7e) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MLPC = (0x2080307f) +NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS_MESSAGE_ID = (0x7f) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PLIB = (0x20803080) +NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS_MESSAGE_ID = (0x80) +NV2080_CTRL_CMD_NVLINK_GET_PLATFORM_INFO = (0x20803083) +NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_NVLINK_BLACKWELL_MAX_LINKS = 18 +NV2080_CTRL_CMD_NVLINK_READ_UPHY_CLN = (0x20803084) +NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS_MESSAGE_ID = (0x84) +NV2080_CTRL_NVLINK_SUPPORTED_MAX_BW_MODE_COUNT = 23 +NV2080_CTRL_CMD_NVLINK_GET_SUPPORTED_BW_MODE = (0x20803085) +NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_NVLINK_SET_BW_MODE = (0x20803086) +NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS_MESSAGE_ID = (0x86) +NV2080_CTRL_CMD_NVLINK_GET_BW_MODE = (0x20803087) +NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_NVLINK_GET_LOCAL_DEVICE_INFO = (0x20803088) +NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_CMD_NVLINK_INJECT_SW_ERROR = (0x20803089) +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS_MESSAGE_ID = (0x89) +NV2080_CTRL_CMD_NVLINK_POST_LAZY_ERROR_RECOVERY = (0x2080308a) +NV2080_CTRL_CMD_NVLINK_CONFIGURE_L1_TOGGLE = (0x2080308e) +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_NVLINK_GET_L1_TOGGLE = (0x2080308f) +NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS_MESSAGE_ID = (0x8F) +NV_SUBPROC_NAME_MAX_LENGTH = 100 +NV2080_CTRL_PERF_BOOST_FLAGS_CMD = (1, 0) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_CLEAR = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_BOOST_1LEVEL = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_BOOST_TO_MAX = (0x00000002) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA = (4, 4) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_NO = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_YES = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC = (5, 5) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC_NO = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC_YES = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY = (6, 6) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY_DEFAULT = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY_HIGH = (0x00000001) +NV2080_CTRL_PERF_BOOST_DURATION_MAX = 3600 +NV2080_CTRL_PERF_BOOST_DURATION_INFINITE = 0xffffffff +NV2080_CTRL_CMD_PERF_BOOST = (0x2080200a) +NV2080_CTRL_PERF_BOOST_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_PERF_RESERVE_PERFMON_HW = (0x20802093) +NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS_MESSAGE_ID = (0x93) +NV2080_CTRL_PERF_POWER_SOURCE_AC = (0x00000000) +NV2080_CTRL_PERF_POWER_SOURCE_BATTERY = (0x00000001) +NV2080_CTRL_CMD_PERF_SET_POWERSTATE = (0x2080205b) +NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_PERF_SET_AUX_POWER_STATE = (0x20802092) +NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_PERF_AUX_POWER_STATE_P0 = (0x00000000) +NV2080_CTRL_PERF_AUX_POWER_STATE_P1 = (0x00000001) +NV2080_CTRL_PERF_AUX_POWER_STATE_P2 = (0x00000002) +NV2080_CTRL_PERF_AUX_POWER_STATE_P3 = (0x00000003) +NV2080_CTRL_PERF_AUX_POWER_STATE_P4 = (0x00000004) +NV2080_CTRL_PERF_AUX_POWER_STATE_COUNT = (0x00000005) +NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_MESSAGE_ID = (0x6D) +NV2080_CTRL_CMD_PERF_RATED_TDP_GET_CONTROL = (0x2080206e) +NV2080_CTRL_PERF_RATED_TDP_GET_CONTROL_PARAMS_MESSAGE_ID = (0x6E) +NV2080_CTRL_CMD_PERF_RATED_TDP_SET_CONTROL = (0x2080206f) +NV2080_CTRL_PERF_RATED_TDP_SET_CONTROL_PARAMS_MESSAGE_ID = (0x6F) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_PARAM_MESSAGE_ID = (0x83) +NV2080_CTRL_PERF_GPUMON_SAMPLE_COUNT_PERFMON_UTIL = 72 +NV2080_CTRL_CMD_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2 = (0x20802096) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_PERF_GPU_IS_IDLE = (0x20802089) +NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS_MESSAGE_ID = (0x89) +NV2080_CTRL_PERF_GPU_IS_IDLE_TRUE = (0x00000001) +NV2080_CTRL_PERF_GPU_IS_IDLE_FALSE = (0x00000002) +NV2080_CTRL_CMD_PERF_AGGRESSIVE_PSTATE_NOTIFY = (0x2080208f) +NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS_MESSAGE_ID = (0x8F) +NV2080_CTRL_PERF_CLK_MAX_DOMAINS = 32 +NV2080_CTRL_CMD_PERF_GET_LEVEL_INFO = (0x20802002) +NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_PERF_GET_LEVEL_INFO_V2 = (0x2080200b) +NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE = (0, 0) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE_DEFAULT = (0x00000000) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE_OVERCLOCK = (0x00000001) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE = (2, 1) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_NONE = (0x00000000) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_DESKTOP = (0x00000001) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_MAXPERF = (0x00000002) +NV2080_CTRL_CMD_PERF_GET_VID_ENG_PERFMON_SAMPLE = (0x20802087) +NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_PERF_GET_POWERSTATE = (0x2080205a) +NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_PERF_NOTIFY_VIDEOEVENT = (0x2080205d) +NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS_MESSAGE_ID = (0x5D) +NV2080_CTRL_PERF_VIDEOEVENT_EVENT_MASK = (0x0000ffff) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_START = (0x00000001) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_STOP = (0x00000002) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_START = NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_START +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_STOP = NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_STOP +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_SD_START = (0x00000003) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_SD_STOP = (0x00000004) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_4K_START = (0x00000005) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_4K_STOP = (0x00000006) +NV2080_CTRL_PERF_VIDEOEVENT_OFA_START = (0x00000007) +NV2080_CTRL_PERF_VIDEOEVENT_OFA_STOP = (0x00000008) +NV2080_CTRL_PERF_VIDEOEVENT_FLAG_LINEAR_MODE = (0x00010000) +NV2080_CTRL_PERF_PSTATES_UNDEFINED = (0x00000000) +NV2080_CTRL_PERF_PSTATES_CLEAR_FORCED = (0x00000000) +NV2080_CTRL_PERF_PSTATES_MIN = (0x00000001) +NV2080_CTRL_PERF_PSTATES_P0 = (0x00000001) +NV2080_CTRL_PERF_PSTATES_P1 = (0x00000002) +NV2080_CTRL_PERF_PSTATES_P2 = (0x00000004) +NV2080_CTRL_PERF_PSTATES_P3 = (0x00000008) +NV2080_CTRL_PERF_PSTATES_P4 = (0x00000010) +NV2080_CTRL_PERF_PSTATES_P5 = (0x00000020) +NV2080_CTRL_PERF_PSTATES_P6 = (0x00000040) +NV2080_CTRL_PERF_PSTATES_P7 = (0x00000080) +NV2080_CTRL_PERF_PSTATES_P8 = (0x00000100) +NV2080_CTRL_PERF_PSTATES_P9 = (0x00000200) +NV2080_CTRL_PERF_PSTATES_P10 = (0x00000400) +NV2080_CTRL_PERF_PSTATES_P11 = (0x00000800) +NV2080_CTRL_PERF_PSTATES_P12 = (0x00001000) +NV2080_CTRL_PERF_PSTATES_P13 = (0x00002000) +NV2080_CTRL_PERF_PSTATES_P14 = (0x00004000) +NV2080_CTRL_PERF_PSTATES_P15 = (0x00008000) +NV2080_CTRL_PERF_PSTATES_MAX = NV2080_CTRL_PERF_PSTATES_P15 +NV2080_CTRL_PERF_PSTATES_SKIP_ENTRY = (0x10000) +NV2080_CTRL_PERF_PSTATES_ALL = (0xffff) +NV2080_CTRL_CMD_PERF_GET_CURRENT_PSTATE = (0x20802068) +NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_NOT_SUPPORTED = 0 +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_SUPPORTED = 1 +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_NOT_APPLICABLE = 2 +NV2080_CTRL_PMGR_MODULE_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_PMGR_GET_MODULE_INFO = (0x20802609) +NV2080_CTRL_CMD_GC6_ENTRY = (0x2080270d) +NV2080_CTRL_GC6_ENTRY_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_GC6_EXIT = (0x2080270e) +NV2080_CTRL_GC6_EXIT_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_RC_READ_VIRTUAL_MEM = (0x20802204) +NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_RC_GET_ERROR_COUNT = (0x20802205) +NV2080_CTRL_RC_ERROR_PARAMS_BUFFER_SIZE = (0x2000) +NV2080_CTRL_CMD_RC_GET_ERROR = (0x20802206) +NV2080_CTRL_RC_GET_ERROR_V2_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_RC_GET_ERROR_V2 = (0x20802213) +NV2080_CTRL_CMD_RC_SET_CLEAN_ERROR_HISTORY = (0x20802207) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_RC_GET_WATCHDOG_INFO = (0x20802209) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_NONE = (0x00000000) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_DISABLED = (0x00000001) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_RUNNING = (0x00000002) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_INITIALIZED = (0x00000004) +NV2080_CTRL_CMD_RC_DISABLE_WATCHDOG = (0x2080220a) +NV2080_CTRL_CMD_RC_ENABLE_WATCHDOG = (0x2080220b) +NV2080_CTRL_CMD_RC_RELEASE_WATCHDOG_REQUESTS = (0x2080220c) +NV2080_CTRL_CMD_SET_RC_RECOVERY = (0x2080220d) +NV2080_CTRL_SET_RC_RECOVERY_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_GET_RC_RECOVERY = (0x2080220e) +NV2080_CTRL_GET_RC_RECOVERY_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_RC_RECOVERY_DISABLED = (0x00000000) +NV2080_CTRL_CMD_RC_RECOVERY_ENABLED = (0x00000001) +NV2080_CTRL_CMD_TDR_SET_TIMEOUT_STATE = (0x2080220f) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_CMD_GPU_RESET_BEGIN = (0x00000000) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_CMD_GPU_RESET_END = (0x00000001) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_STATUS_SUCCESS = (0x00000000) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_STATUS_FAIL = (0x00000001) +NV2080_CTRL_CMD_RC_SOFT_DISABLE_WATCHDOG = (0x20802210) +NV2080_CTRL_CMD_SET_RC_INFO = (0x20802211) +NV2080_CTRL_SET_RC_INFO_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GET_RC_INFO = (0x20802212) +NV2080_CTRL_GET_RC_INFO_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_RC_INFO_MODE_DISABLE = (0x00000000) +NV2080_CTRL_CMD_RC_INFO_MODE_ENABLE = (0x00000001) +NV2080_CTRL_CMD_RC_INFO_BREAK_DISABLE = (0x00000000) +NV2080_CTRL_CMD_RC_INFO_BREAK_ENABLE = (0x00000001) +RM_GSP_SPDM_CMD_ID_CC_INIT = (0x1) +RM_GSP_SPDM_CMD_ID_CC_DEINIT = (0x2) +RM_GSP_SPDM_CMD_ID_CC_CTRL = (0x3) +RM_GSP_SPDM_CMD_ID_CC_INIT_RM_DATA = (0x4) +RM_GSP_SPDM_CMD_ID_CC_HEARTBEAT_CTRL = (0x5) +RM_GSP_SPDM_CMD_ID_FIPS_SELFTEST = (0x6) +RM_GSP_SPDM_CMD_ID_INVALID_COMMAND = (0xFF) +SPDM_SESSION_ESTABLISHMENT_TRANSCRIPT_BUFFER_SIZE = 0x2400 +RSVD7_SIZE = 16 +RSVD8_SIZE = 2 +CE_FIPS_SELF_TEST_DATA_SIZE = 16 +CE_FIPS_SELF_TEST_AUTH_TAG_SIZE = 16 +CE_FIPS_SELF_TEST_IV_SIZE = 12 +RM_GSP_SPDM_MSG_ID_CC_INIT = (0x1) +RM_GSP_SPDM_MSG_ID_CC_DEINIT = (0x2) +RM_GSP_SPDM_MSG_ID_CC_CTRL = (0x3) +RM_GSP_SPDM_MSG_ID_CC_INIT_RM_DATA = (0x4) +RM_GSP_SPDM_MSG_ID_CC_HEARTBEAT_CTRL = (0x5) +RM_GSP_SPDM_MSG_ID_FIPS_SELFTEST = (0x6) +RM_GSP_SPDM_MSG_ID_INVALID_COMMAND = (0xFF) +NV2080_CTRL_INTERNAL_SPDM_PARTITION = (0x20800ad9) +NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS_MESSAGE_ID = (0xD9) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT = (0x20800ada) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS_MESSAGE_ID = (0xDA) +NV2080_CTRL_CMD_TIMER_SCHEDULE = (0x20800401) +NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME = (0, 0) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME_ABS = (0x00000000) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME_REL = (0x00000001) +NV2080_CTRL_CMD_TIMER_CANCEL = (0x20800402) +NV2080_CTRL_CMD_TIMER_GET_TIME = (0x20800403) +NV2080_CTRL_TIMER_GET_TIME_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_TIMER_GET_REGISTER_OFFSET = (0x20800404) +NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO = (0x20800406) +NV2080_CTRL_TIMER_GPU_CPU_TIME_MAX_SAMPLES = 16 +NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS_MESSAGE_ID = (0x6) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_SOURCE = (3, 0) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_OSTIME = (0x00000001) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_TSC = (0x00000002) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PLATFORM_API = (0x00000003) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_GSP_OS = (0x00000004) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR = (7, 4) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR_CPU = (0x00000000) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR_GSP = (0x00000001) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ = (0x20800407) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_OS_UNIX_GC6_BLOCKER_REFCNT = (0x20803d01) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_INC = (0x00000001) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_DEC = (0x00000002) +NV2080_CTRL_CMD_OS_UNIX_ALLOW_DISALLOW_GCOFF = (0x20803d02) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_ALLOW = (0x00000001) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_DISALLOW = (0x00000002) +NV2080_CTRL_CMD_OS_UNIX_AUDIO_DYNAMIC_POWER = (0x20803d03) +NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_OS_UNIX_INSTALL_PROFILER_HOOKS = (0x20803d04) +NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_OS_UNIX_FLUSH_SNAPSHOT_BUFFER = (0x20803d05) +NV2080_CTRL_CMD_OS_UNIX_STOP_PROFILER = (0x20803d06) +NV2080_CTRL_CMD_OS_UNIX_VIDMEM_PERSISTENCE_STATUS = (0x20803d07) +NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_OS_UNIX_UPDATE_TGP_STATUS = (0x20803d08) +NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK = (0x20804001) +NV2080_CTRL_MAX_VMMU_SEGMENTS = 384 +NV2080_GPU_MAX_ENGINES = 0x54 +NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK = (0x20804002) +NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE = (0x20804003) +NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU = (0x20804004) +NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO = (0x20804005) +NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE = (0x20804006) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY = (0x20804007) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP = (0x20804008) +NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_MAX_NVU32_TO_CONVERTED_STR_LEN = 8 +NV2080_CTRL_MAX_GPC_COUNT = 32 +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING = (0x20804009) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT = (0x2080400a) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG = (0x2080400b) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_FREE_STATES = (0x2080400c) +NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_FRAME_RATE_LIMITER_STATUS = (0x2080400d) +NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE = (0x2080400e) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0xE) +NV83DE_CTRL_RESERVED = (0x00) +NV83DE_CTRL_GR = (0x01) +NV83DE_CTRL_FIFO = (0x02) +NV83DE_CTRL_DEBUG = (0x03) +NV83DE_CTRL_INTERNAL = (0x04) +NV83DE_CTRL_CMD_NULL = (0x83de0000) +NV83DE_CTRL_CMD_SM_DEBUG_MODE_ENABLE = (0x83de0301) +NV83DE_CTRL_CMD_SM_DEBUG_MODE_DISABLE = (0x83de0302) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG = (0x83de0307) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_MESSAGE_ID = (0x7) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG_DISABLE = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_RELEASE_MMU_DEBUG_REQUESTS = (0x00000003) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG = (0x83de0308) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_MESSAGE_ID = (0x8) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG_DISABLED = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_SET_EXCEPTION_MASK = (0x83de0309) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_MESSAGE_ID = (0x9) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_FATAL = (0x00000001) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_TRAP = (0x00000002) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_SINGLE_STEP = (0x00000004) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_INT = (0x00000008) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_CILP = (0x00000010) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PREEMPTION_STARTED = (0x00000020) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_NONE = (0x00000000) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_ALL = (0x0000FFFF) +NV83DE_CTRL_CMD_DEBUG_READ_SINGLE_SM_ERROR_STATE = (0x83de030b) +NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_MESSAGE_ID = (0xB) +NV83DE_CTRL_CMD_DEBUG_READ_ALL_SM_ERROR_STATES = (0x83de030c) +NV83DE_CTRL_DEBUG_MAX_SMS_PER_CALL = 100 +NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_MESSAGE_ID = (0xC) +NV83DE_CTRL_CMD_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE = (0x83de030f) +NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_MESSAGE_ID = (0xF) +NV83DE_CTRL_CMD_DEBUG_CLEAR_ALL_SM_ERROR_STATES = (0x83de0310) +NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_MESSAGE_ID = (0x10) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS_DEFINED = 1 +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_HAS_RESIDENT_CHANNEL = 1 +NV83DE_CTRL_CMD_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE = (0x83de0313) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_MESSAGE_ID = (0x13) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_SINGLE_SM = (0x00000001) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_BROADCSAT = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING = (0x83de0314) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS_MESSAGE_ID = (0x14) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_NONPAUSING = (0x00000001) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PAUSING = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_READ_MEMORY = (0x83de0315) +NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS_MESSAGE_ID = (0x15) +NV83DE_CTRL_CMD_DEBUG_WRITE_MEMORY = (0x83de0316) +NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS_MESSAGE_ID = (0x16) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT = (0x83de0317) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_MESSAGE_ID = (0x17) +NV83DE_CTRL_CMD_DEBUG_RESUME_CONTEXT = (0x83de0318) +NV83DE_CTRL_CMD_DEBUG_GET_HANDLES = (0x83de0319) +NV83DE_CTRL_CMD_READ_SURFACE = (0x83de031a) +NV83DE_CTRL_CMD_WRITE_SURFACE = (0x83de031b) +MAX_ACCESS_OPS = 64 +NV83DE_CTRL_CMD_GET_MAPPINGS = (0x83de031c) +MAX_GET_MAPPINGS_OPS = 64 +NV83DE_CTRL_CMD_DEBUG_EXEC_REG_OPS = (0x83de031d) +NV83DE_CTRL_GPU_EXEC_REG_OPS_MAX_OPS = 100 +NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0x1D) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG = (0x83de031f) +NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_MESSAGE_ID = (0x1F) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG_DISABLE = (0x00000000) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG = (0x83de0320) +NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS_MESSAGE_ID = (0x20) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG_DISABLED = (0x00000000) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_SINGLE_STEP = (0x83de0321) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_MESSAGE_ID = (0x21) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_STOP_TRIGGER = (0x83de0322) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS_MESSAGE_ID = (0x22) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_RUN_TRIGGER = (0x83de0323) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS_MESSAGE_ID = (0x23) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT = (0x83de0324) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS_MESSAGE_ID = (0x24) +NV83DE_CTRL_CMD_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS = (0x83de0325) +NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS_MESSAGE_ID = (0x25) +NV83DE_CTRL_CMD_DEBUG_READ_BATCH_MEMORY = (0x83de0326) +NV83DE_CTRL_CMD_DEBUG_WRITE_BATCH_MEMORY = (0x83de0327) +MAX_ACCESS_MEMORY_OPS = 150 +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_MAX_ENTRIES = 4 +NV83DE_CTRL_CMD_DEBUG_READ_MMU_FAULT_INFO = (0x83de0328) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS_MESSAGE_ID = (0x28) +NV83DE_CTRL_CMD_DEBUG_SET_DROP_DEFERRED_RC = (0x83de0329) +NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS_MESSAGE_ID = (0x29) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG = (0x83de032a) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_MESSAGE_ID = (0x2A) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG_DISABLE = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_RELEASE_MMU_GCC_DEBUG_REQUESTS = (0x00000003) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG = (0x83de032b) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_MESSAGE_ID = (0x2B) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG_DISABLED = (0x00000002) +NVB0CC_CTRL_RESERVED = (0x00) +NVB0CC_CTRL_PROFILER = (0x01) +NVB0CC_CTRL_INTERNAL = (0x02) +NVB0CC_CTRL_CMD_NULL = (0xb0cc0000) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM = (0xb0cc0204) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS_MESSAGE_ID = (0x0) +NVB0CC_CTRL_CMD_INTERNAL_QUIESCE_PMA_CHANNEL = (0xb0cc0201) +NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_CMD_INTERNAL_SRIOV_PROMOTE_PMA_STREAM = (0xb0cc0202) +NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x2) +NVB0CC_CTRL_CMD_INTERNAL_PERMISSIONS_INIT = (0xb0cc0203) +NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS_MESSAGE_ID = (0x3) +NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS_MESSAGE_ID = (0x4) +NVB0CC_CTRL_CMD_INTERNAL_FREE_PMA_STREAM = (0xb0cc0206) +NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x6) +NVB0CC_CTRL_CMD_INTERNAL_GET_MAX_PMAS = (0xb0cc0207) +NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS_MESSAGE_ID = (0x7) +NVB0CC_CTRL_CMD_INTERNAL_BIND_PM_RESOURCES = (0xb0cc0208) +NVB0CC_CTRL_CMD_INTERNAL_UNBIND_PM_RESOURCES = (0xb0cc0209) +NVB0CC_CTRL_CMD_INTERNAL_RESERVE_HWPM_LEGACY = (0xb0cc020a) +NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS_MESSAGE_ID = (0xa) +NVB0CC_CTRL_CMD_POWER_REQUEST_FEATURES = (0xb0cc0301) +NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG = (1, 0) +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG = (3, 2) +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG = (5, 4) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG = (7, 6) +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN = (9, 8) +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT = (11, 10) +NVB0CC_CTRL_POWER_FEATURE_IGNORE = (0x00000000) +NVB0CC_CTRL_POWER_FEATURE_DISABLE = (0x00000001) +NVB0CC_CTRL_POWER_FEATURE_ENABLE = (0x00000002) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED = (0x00000000) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED = (0x00000001) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED = (0x00000002) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED = (0x00000003) +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_CMD_POWER_RELEASE_FEATURES = (0xb0cc0302) +NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS_MESSAGE_ID = (0x2) +NVB0CC_CTRL_POWER_FEATURE_RELEASE = (0x00000003) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_CMD_RESERVE_HWPM_LEGACY = (0xb0cc0101) +NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_CMD_RELEASE_HWPM_LEGACY = (0xb0cc0102) +NVB0CC_CTRL_CMD_RESERVE_PM_AREA_SMPC = (0xb0cc0103) +NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_MESSAGE_ID = (0x3) +NVB0CC_CTRL_CMD_RELEASE_PM_AREA_SMPC = (0xb0cc0104) +NVB0CC_CTRL_CMD_ALLOC_PMA_STREAM = (0xb0cc0105) +NVB0CC_PMA_BUFFER_SIZE_MAX = (0xffe00000) +NVB0CC_PMA_BYTES_AVAILABLE_SIZE = (0x1000) +NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_MESSAGE_ID = (0x5) +NVB0CC_CTRL_CMD_FREE_PMA_STREAM = (0xb0cc0106) +NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x6) +NVB0CC_CTRL_CMD_BIND_PM_RESOURCES = (0xb0cc0107) +NVB0CC_CTRL_CMD_UNBIND_PM_RESOURCES = (0xb0cc0108) +NVB0CC_CTRL_CMD_PMA_STREAM_UPDATE_GET_PUT = (0xb0cc0109) +NVB0CC_AVAILABLE_BYTES_DEFAULT_VALUE = 0xFFFFFFFF +NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_MESSAGE_ID = (0x9) +NVB0CC_REGOPS_MAX_COUNT = (124) +NVB0CC_CTRL_CMD_EXEC_REG_OPS = (0xb0cc010a) +NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0xA) +NVB0CC_CTRL_CMD_RESERVE_PM_AREA_PC_SAMPLER = (0xb0cc010b) +NVB0CC_CTRL_CMD_RELEASE_PM_AREA_PC_SAMPLER = (0xb0cc010c) +NVB0CC_CTRL_CMD_GET_TOTAL_HS_CREDITS = (0xb0cc010d) +NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_MESSAGE_ID = (0xD) +NVB0CC_CTRL_CMD_SET_HS_CREDITS = (0xb0cc010e) +NVB0CC_MAX_CREDIT_INFO_ENTRIES = (63) +NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_MESSAGE_ID = (0xE) +NVB0CC_CTRL_CMD_GET_HS_CREDITS = (0xb0cc010f) +NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_MESSAGE_ID = (0xF) +NVB0CC_CTRL_CMD_RESERVE_HES = (0xb0cc0113) +NVB0CC_CTRL_RESERVE_HES_PARAMS_MESSAGE_ID = (0x13) +NVB0CC_CTRL_CMD_RELEASE_HES = (0xb0cc0114) +NVB0CC_CTRL_RELEASE_HES_PARAMS_MESSAGE_ID = (0x14) +NVB0CC_CREDIT_POOL_MAX_COUNT = 30 +NVB0CC_CTRL_CMD_GET_CHIPLET_HS_CREDIT_POOL = (0xb0cc0115) +NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL_MESSAGE_ID = (0x15) +NVB0CC_CTRL_CMD_GET_HS_CREDITS_MAPPING = (0xb0cc0116) +NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS_MESSAGE_ID = (0x16) +NVB0CC_CTRL_CMD_DISABLE_DYNAMIC_MMA_BOOST = (0xb0cc0117) +NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS_MESSAGE_ID = (0x17) +NVB0CC_CTRL_CMD_GET_DYNAMIC_MMA_BOOST_STATUS = (0xb0cc0118) +NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS_MESSAGE_ID = (0x18) +NVB0CC_CTRL_CMD_RESERVE_CCU_PROF = (0xb0cc0119) +NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_MESSAGE_ID = (0x19) +NVB0CC_CTRL_CMD_RELEASE_CCU_PROF = (0xb0cc011a) +NV_STATUS_LEVEL_OK = 0 +NV_STATUS_LEVEL_WARN = 1 +NV_STATUS_LEVEL_ERR = 3 +NV01_ROOT = (0x00000000) +NV1_ROOT = (0x00000000) +NV01_NULL_OBJECT = (0x00000000) +NV1_NULL_OBJECT = (0x00000000) +NV01_ROOT_NON_PRIV = (0x00000001) +NV1_ROOT_NON_PRIV = (0x00000001) +NV01_ROOT_CLIENT = (0x00000041) +FABRIC_MANAGER_SESSION = (0x0000000f) +NV0020_GPU_MANAGEMENT = (0x00000020) +NV01_DEVICE_0 = (0x00000080) +NV20_SUBDEVICE_0 = (0x00002080) +NV2081_BINAPI = (0x00002081) +NV2082_BINAPI_PRIVILEGED = (0x00002082) +NV20_SUBDEVICE_DIAG = (0x0000208f) +NV01_CONTEXT_DMA = (0x00000002) +NV01_MEMORY_SYSTEM = (0x0000003e) +NV1_MEMORY_SYSTEM = (0x0000003e) +NV01_MEMORY_LOCAL_PRIVILEGED = (0x0000003f) +NV1_MEMORY_LOCAL_PRIVILEGED = (0x0000003f) +NV01_MEMORY_PRIVILEGED = (0x0000003f) +NV1_MEMORY_PRIVILEGED = (0x0000003f) +NV01_MEMORY_LOCAL_USER = (0x00000040) +NV1_MEMORY_LOCAL_USER = (0x00000040) +NV01_MEMORY_USER = (0x00000040) +NV1_MEMORY_USER = (0x00000040) +NV_MEMORY_EXTENDED_USER = (0x00000042) +NV01_MEMORY_VIRTUAL = (0x00000070) +NV01_MEMORY_SYSTEM_DYNAMIC = (0x00000070) +NV1_MEMORY_SYSTEM_DYNAMIC = (0x00000070) +NV_MEMORY_MAPPER = (0x000000fe) +NV01_MEMORY_LOCAL_PHYSICAL = (0x000000c2) +NV01_MEMORY_SYNCPOINT = (0x000000c3) +NV01_MEMORY_SYSTEM_OS_DESCRIPTOR = (0x00000071) +NV01_MEMORY_DEVICELESS = (0x000090ce) +NV01_MEMORY_FRAMEBUFFER_CONSOLE = (0x00000076) +NV01_MEMORY_HW_RESOURCES = (0x000000b1) +NV01_MEMORY_LIST_SYSTEM = (0x00000081) +NV01_MEMORY_LIST_FBMEM = (0x00000082) +NV01_MEMORY_LIST_OBJECT = (0x00000083) +NV_IMEX_SESSION = (0x000000f1) +NV01_MEMORY_FLA = (0x000000f3) +NV_MEMORY_EXPORT = (0x000000e0) +NV_CE_UTILS = (0x00000050) +NV_MEMORY_FABRIC = (0x000000f8) +NV_MEMORY_FABRIC_IMPORT_V2 = (0x000000f9) +NV_MEMORY_FABRIC_IMPORTED_REF = (0x000000fb) +FABRIC_VASPACE_A = (0x000000fc) +NV_MEMORY_MULTICAST_FABRIC = (0x000000fd) +IO_VASPACE_A = (0x000000f2) +NV01_NULL = (0x00000030) +NV1_NULL = (0x00000030) +NV01_EVENT = (0x00000005) +NV1_EVENT = (0x00000005) +NV01_EVENT_KERNEL_CALLBACK = (0x00000078) +NV1_EVENT_KERNEL_CALLBACK = (0x00000078) +NV01_EVENT_OS_EVENT = (0x00000079) +NV1_EVENT_OS_EVENT = (0x00000079) +NV01_EVENT_WIN32_EVENT = (0x00000079) +NV1_EVENT_WIN32_EVENT = (0x00000079) +NV01_EVENT_KERNEL_CALLBACK_EX = (0x0000007e) +NV1_EVENT_KERNEL_CALLBACK_EX = (0x0000007e) +NV01_TIMER = (0x00000004) +NV1_TIMER = (0x00000004) +KERNEL_GRAPHICS_CONTEXT = (0x00000090) +LOCK_STRESS_OBJECT = (0x00000100) +NV50_CHANNEL_GPFIFO = (0x0000506f) +GF100_CHANNEL_GPFIFO = (0x0000906f) +KEPLER_CHANNEL_GPFIFO_A = (0x0000a06f) +UVM_CHANNEL_RETAINER = (0x0000c574) +KEPLER_CHANNEL_GPFIFO_B = (0x0000a16f) +MAXWELL_CHANNEL_GPFIFO_A = (0x0000b06f) +PASCAL_CHANNEL_GPFIFO_A = (0x0000c06f) +VOLTA_CHANNEL_GPFIFO_A = (0x0000c36f) +TURING_CHANNEL_GPFIFO_A = (0x0000c46f) +AMPERE_CHANNEL_GPFIFO_A = (0x0000c56f) +HOPPER_CHANNEL_GPFIFO_A = (0x0000c86f) +BLACKWELL_CHANNEL_GPFIFO_A = (0x0000c96f) +BLACKWELL_CHANNEL_GPFIFO_B = (0x0000ca6f) +NV04_SOFTWARE_TEST = (0x0000007d) +NV4_SOFTWARE_TEST = (0x0000007d) +NV30_GSYNC = (0x000030f1) +VOLTA_USERMODE_A = (0x0000c361) +TURING_USERMODE_A = (0x0000c461) +AMPERE_USERMODE_A = (0x0000c561) +HOPPER_USERMODE_A = (0x0000c661) +BLACKWELL_USERMODE_A = (0x0000c761) +NVC371_DISP_SF_USER = (0x0000c371) +NVC372_DISPLAY_SW = (0x0000c372) +NVC573_DISP_CAPABILITIES = (0x0000c573) +NVC673_DISP_CAPABILITIES = (0x0000c673) +NVC773_DISP_CAPABILITIES = (0x0000c773) +NVC973_DISP_CAPABILITIES = (0x0000c973) +NVCA73_DISP_CAPABILITIES = (0x0000ca73) +NV04_DISPLAY_COMMON = (0x00000073) +NV50_DEFERRED_API_CLASS = (0x00005080) +MPS_COMPUTE = (0x0000900e) +NVC570_DISPLAY = (0x0000c570) +NVC57A_CURSOR_IMM_CHANNEL_PIO = (0x0000c57a) +NVC57B_WINDOW_IMM_CHANNEL_DMA = (0x0000c57b) +NVC57D_CORE_CHANNEL_DMA = (0x0000c57d) +NVC57E_WINDOW_CHANNEL_DMA = (0x0000c57e) +NVC670_DISPLAY = (0x0000c670) +NVC671_DISP_SF_USER = (0x0000c671) +NVC67A_CURSOR_IMM_CHANNEL_PIO = (0x0000c67a) +NVC67B_WINDOW_IMM_CHANNEL_DMA = (0x0000c67b) +NVC67D_CORE_CHANNEL_DMA = (0x0000c67d) +NVC67E_WINDOW_CHANNEL_DMA = (0x0000c67e) +NVC77F_ANY_CHANNEL_DMA = (0x0000c77f) +NVC770_DISPLAY = (0x0000c770) +NVC771_DISP_SF_USER = (0x0000c771) +NVC77D_CORE_CHANNEL_DMA = (0x0000c77d) +NVC970_DISPLAY = (0x0000c970) +NVC971_DISP_SF_USER = (0x0000c971) +NVC97A_CURSOR_IMM_CHANNEL_PIO = (0x0000c97a) +NVC97B_WINDOW_IMM_CHANNEL_DMA = (0x0000c97b) +NVC97D_CORE_CHANNEL_DMA = (0x0000c97d) +NVC97E_WINDOW_CHANNEL_DMA = (0x0000c97e) +NVCA70_DISPLAY = (0x0000ca70) +NVCA71_DISP_SF_USER = (0x0000ca71) +NVCA7A_CURSOR_IMM_CHANNEL_PIO = (0x0000ca7a) +NVCA7B_WINDOW_IMM_CHANNEL_DMA = (0x0000ca7b) +NVCA7D_CORE_CHANNEL_DMA = (0x0000ca7d) +NVCA7E_WINDOW_CHANNEL_DMA = (0x0000ca7e) +NV9010_VBLANK_CALLBACK = (0x00009010) +GF100_PROFILER = (0x000090cc) +MAXWELL_PROFILER = (0x0000b0cc) +MAXWELL_PROFILER_CONTEXT = (0x0000b1cc) +MAXWELL_PROFILER_DEVICE = (0x0000b2cc) +GF100_SUBDEVICE_MASTER = (0x000090e6) +GF100_SUBDEVICE_INFOROM = (0x000090e7) +GF100_ZBC_CLEAR = (0x00009096) +GF100_DISP_SW = (0x00009072) +GF100_TIMED_SEMAPHORE_SW = (0x00009074) +G84_PERFBUFFER = (0x0000844c) +NV50_MEMORY_VIRTUAL = (0x000050a0) +NV50_P2P = (0x0000503b) +NV50_THIRD_PARTY_P2P = (0x0000503c) +FERMI_TWOD_A = (0x0000902d) +FERMI_VASPACE_A = (0x000090f1) +HOPPER_SEC2_WORK_LAUNCH_A = (0x0000cba2) +GF100_HDACODEC = (0x000090ec) +NVB8B0_VIDEO_DECODER = (0x0000b8b0) +NVC4B0_VIDEO_DECODER = (0x0000c4b0) +NVC6B0_VIDEO_DECODER = (0x0000c6b0) +NVC7B0_VIDEO_DECODER = (0x0000c7b0) +NVC9B0_VIDEO_DECODER = (0x0000c9b0) +NVCDB0_VIDEO_DECODER = (0x0000cdb0) +NVCFB0_VIDEO_DECODER = (0x0000cfb0) +NVC4B7_VIDEO_ENCODER = (0x0000c4b7) +NVB4B7_VIDEO_ENCODER = (0x0000b4b7) +NVC7B7_VIDEO_ENCODER = (0x0000c7b7) +NVC9B7_VIDEO_ENCODER = (0x0000c9b7) +NVCFB7_VIDEO_ENCODER = (0x0000cfb7) +NVB8D1_VIDEO_NVJPG = (0x0000b8d1) +NVC4D1_VIDEO_NVJPG = (0x0000c4d1) +NVC9D1_VIDEO_NVJPG = (0x0000c9d1) +NVCDD1_VIDEO_NVJPG = (0x0000cdd1) +NVCFD1_VIDEO_NVJPG = (0x0000cfd1) +NVB8FA_VIDEO_OFA = (0x0000b8fa) +NVC6FA_VIDEO_OFA = (0x0000c6fa) +NVC7FA_VIDEO_OFA = (0x0000c7fa) +NVC9FA_VIDEO_OFA = (0x0000c9fa) +NVCDFA_VIDEO_OFA = (0x0000cdfa) +NVCFFA_VIDEO_OFA = (0x0000cffa) +KEPLER_INLINE_TO_MEMORY_B = (0x0000a140) +FERMI_CONTEXT_SHARE_A = (0x00009067) +KEPLER_CHANNEL_GROUP_A = (0x0000a06c) +PASCAL_DMA_COPY_A = (0x0000c0b5) +TURING_DMA_COPY_A = (0x0000c5b5) +AMPERE_DMA_COPY_A = (0x0000c6b5) +AMPERE_DMA_COPY_B = (0x0000c7b5) +HOPPER_DMA_COPY_A = (0x0000c8b5) +BLACKWELL_DMA_COPY_A = (0x0000c9b5) +BLACKWELL_DMA_COPY_B = (0x0000cab5) +MAXWELL_DMA_COPY_A = (0x0000b0b5) +ACCESS_COUNTER_NOTIFY_BUFFER = (0x0000c365) +MMU_FAULT_BUFFER = (0x0000c369) +MMU_VIDMEM_ACCESS_BIT_BUFFER = (0x0000c763) +TURING_A = (0x0000c597) +TURING_COMPUTE_A = (0x0000c5c0) +AMPERE_A = (0x0000c697) +AMPERE_COMPUTE_A = (0x0000c6c0) +AMPERE_B = (0x0000c797) +AMPERE_COMPUTE_B = (0x0000c7c0) +ADA_A = (0x0000c997) +ADA_COMPUTE_A = (0x0000c9c0) +AMPERE_SMC_PARTITION_REF = (0x0000c637) +AMPERE_SMC_EXEC_PARTITION_REF = (0x0000c638) +AMPERE_SMC_CONFIG_SESSION = (0x0000c639) +NV0092_RG_LINE_CALLBACK = (0x00000092) +AMPERE_SMC_MONITOR_SESSION = (0x0000c640) +HOPPER_A = (0x0000cb97) +HOPPER_COMPUTE_A = (0x0000cbc0) +BLACKWELL_A = (0x0000cd97) +BLACKWELL_COMPUTE_A = (0x0000cdc0) +BLACKWELL_B = (0x0000ce97) +BLACKWELL_COMPUTE_B = (0x0000cec0) +BLACKWELL_INLINE_TO_MEMORY_A = (0x0000cd40) +NV40_DEBUG_BUFFER = (0x000000db) +RM_USER_SHARED_DATA = (0x000000de) +GT200_DEBUGGER = (0x000083de) +NV40_I2C = (0x0000402c) +KEPLER_DEVICE_VGPU = (0x0000a080) +NVA081_VGPU_CONFIG = (0x0000a081) +NVA084_KERNEL_HOST_VGPU_DEVICE = (0x0000a084) +NV0060_SYNC_GPU_BOOST = (0x00000060) +GP100_UVM_SW = (0x0000c076) +NVENC_SW_SESSION = (0x0000a0bc) +NV_EVENT_BUFFER = (0x000090cd) +NVFBC_SW_SESSION = (0x0000a0bd) +NV_CONFIDENTIAL_COMPUTE = (0x0000cb33) +NV_COUNTER_COLLECTION_UNIT = (0x0000cbca) +NV_SEMAPHORE_SURFACE = (0x000000da) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_580.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_580.py new file mode 100644 index 000000000..0a9f4e0c7 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_580.py @@ -0,0 +1,26002 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +_anonenum0: dict[int, str] = {(AES128_NONE:=0): 'AES128_NONE', (AES128_CTR:=1): 'AES128_CTR', (AES128_CBC:=2): 'AES128_CBC', (AES128_ECB:=3): 'AES128_ECB', (AES128_OFB:=4): 'AES128_OFB', (AES128_CTR_LSB16B:=5): 'AES128_CTR_LSB16B', (AES128_CLR_AS_ENCRYPT:=6): 'AES128_CLR_AS_ENCRYPT', (AES128_RESERVED:=7): 'AES128_RESERVED'} +_anonenum1: dict[int, str] = {(AES128_CTS_DISABLE:=0): 'AES128_CTS_DISABLE', (AES128_CTS_ENABLE:=1): 'AES128_CTS_ENABLE'} +_anonenum2: dict[int, str] = {(AES128_PADDING_NONE:=0): 'AES128_PADDING_NONE', (AES128_PADDING_CARRY_OVER:=1): 'AES128_PADDING_CARRY_OVER', (AES128_PADDING_RFC2630:=2): 'AES128_PADDING_RFC2630', (AES128_PADDING_RESERVED:=7): 'AES128_PADDING_RESERVED'} +ENCR_MODE: dict[int, str] = {(ENCR_MODE_CTR64:=0): 'ENCR_MODE_CTR64', (ENCR_MODE_CBC:=1): 'ENCR_MODE_CBC', (ENCR_MODE_ECB:=2): 'ENCR_MODE_ECB', (ENCR_MODE_ECB_PARTIAL:=3): 'ENCR_MODE_ECB_PARTIAL', (ENCR_MODE_CBC_PARTIAL:=4): 'ENCR_MODE_CBC_PARTIAL', (ENCR_MODE_CLEAR_INTO_VPR:=5): 'ENCR_MODE_CLEAR_INTO_VPR', (ENCR_MODE_FORCE_INTO_VPR:=6): 'ENCR_MODE_FORCE_INTO_VPR'} +_anonenum3: dict[int, str] = {(DRM_MS_PIFF_CTR:=17): 'DRM_MS_PIFF_CTR'} +_anonenum4: dict[int, str] = {(DRM_MS_PIFF_CBC:=2): 'DRM_MS_PIFF_CBC'} +_anonenum5: dict[int, str] = {(DRM_MARLIN_CTR:=1): 'DRM_MARLIN_CTR'} +_anonenum6: dict[int, str] = {(DRM_MARLIN_CBC:=34): 'DRM_MARLIN_CBC'} +_anonenum7: dict[int, str] = {(DRM_WIDEVINE:=10): 'DRM_WIDEVINE'} +_anonenum8: dict[int, str] = {(DRM_WIDEVINE_CTR:=17): 'DRM_WIDEVINE_CTR'} +_anonenum9: dict[int, str] = {(DRM_ULTRA_VIOLET:=5): 'DRM_ULTRA_VIOLET'} +_anonenum10: dict[int, str] = {(DRM_NONE:=0): 'DRM_NONE'} +_anonenum11: dict[int, str] = {(DRM_CLR_AS_ENCRYPT:=6): 'DRM_CLR_AS_ENCRYPT'} +@c.record +class struct__nvdec_ssm_s(c.Struct): + SIZE = 8 + bytes_of_protected_data: int + bytes_of_clear_data: int + skip_byte_blk: int + crypt_byte_blk: int + skip: int + last: int + pad: int + mode: int + entry_type: int + reserved: int +struct__nvdec_ssm_s.register_fields([('bytes_of_protected_data', ctypes.c_uint32, 0), ('bytes_of_clear_data', ctypes.c_uint32, 4, 16, 0), ('skip_byte_blk', ctypes.c_uint32, 6, 4, 0), ('crypt_byte_blk', ctypes.c_uint32, 6, 4, 4), ('skip', ctypes.c_uint32, 7, 1, 0), ('last', ctypes.c_uint32, 7, 1, 1), ('pad', ctypes.c_uint32, 7, 1, 2), ('mode', ctypes.c_uint32, 7, 1, 3), ('entry_type', ctypes.c_uint32, 7, 1, 4), ('reserved', ctypes.c_uint32, 7, 3, 5)]) +nvdec_ssm_s: TypeAlias = struct__nvdec_ssm_s +@c.record +class struct__nvdec_pass2_otf_ext_s(c.Struct): + SIZE = 12 + ssm_entry_num: int + ssm_iv_num: int + real_stream_length: int + non_slice_data: int + drm_mode: int + reserved: int +struct__nvdec_pass2_otf_ext_s.register_fields([('ssm_entry_num', ctypes.c_uint32, 0, 16, 0), ('ssm_iv_num', ctypes.c_uint32, 2, 16, 0), ('real_stream_length', ctypes.c_uint32, 4), ('non_slice_data', ctypes.c_uint32, 8, 16, 0), ('drm_mode', ctypes.c_uint32, 10, 7, 0), ('reserved', ctypes.c_uint32, 10, 9, 7)]) +nvdec_pass2_otf_ext_s: TypeAlias = struct__nvdec_pass2_otf_ext_s +@c.record +class struct__nvdec_substream_entry_s(c.Struct): + SIZE = 12 + substream_start_offset: int + substream_length: int + substream_first_tile_idx: int + substream_last_tile_idx: int + last_substream_entry_in_frame: int + reserved: int +struct__nvdec_substream_entry_s.register_fields([('substream_start_offset', ctypes.c_uint32, 0), ('substream_length', ctypes.c_uint32, 4), ('substream_first_tile_idx', ctypes.c_uint32, 8, 8, 0), ('substream_last_tile_idx', ctypes.c_uint32, 9, 8, 0), ('last_substream_entry_in_frame', ctypes.c_uint32, 10, 1, 0), ('reserved', ctypes.c_uint32, 10, 15, 1)]) +nvdec_substream_entry_s: TypeAlias = struct__nvdec_substream_entry_s +@c.record +class struct__nvdec_ecdma_config_s(c.Struct): + SIZE = 24 + ecdma_enable: int + ecdma_blk_x_src: int + ecdma_blk_y_src: int + ecdma_blk_x_dst: int + ecdma_blk_y_dst: int + ref_pic_idx: int + boundary0_top: int + boundary0_bottom: int + boundary1_left: int + boundary1_right: int + blk_copy_flag: int + ctb_size: int +struct__nvdec_ecdma_config_s.register_fields([('ecdma_enable', ctypes.c_uint32, 0), ('ecdma_blk_x_src', ctypes.c_uint16, 4), ('ecdma_blk_y_src', ctypes.c_uint16, 6), ('ecdma_blk_x_dst', ctypes.c_uint16, 8), ('ecdma_blk_y_dst', ctypes.c_uint16, 10), ('ref_pic_idx', ctypes.c_uint16, 12), ('boundary0_top', ctypes.c_uint16, 14), ('boundary0_bottom', ctypes.c_uint16, 16), ('boundary1_left', ctypes.c_uint16, 18), ('boundary1_right', ctypes.c_uint16, 20), ('blk_copy_flag', ctypes.c_ubyte, 22), ('ctb_size', ctypes.c_ubyte, 23)]) +nvdec_ecdma_config_s: TypeAlias = struct__nvdec_ecdma_config_s +@c.record +class struct__nvdec_status_hevc_s(c.Struct): + SIZE = 36 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + error_ctb_pos: int + error_slice_pos: int +struct__nvdec_status_hevc_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('error_ctb_pos', ctypes.c_uint32, 28), ('error_slice_pos', ctypes.c_uint32, 32)]) +nvdec_status_hevc_s: TypeAlias = struct__nvdec_status_hevc_s +@c.record +class struct__nvdec_status_vp9_s(c.Struct): + SIZE = 36 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + error_ctb_pos: int + error_slice_pos: int +struct__nvdec_status_vp9_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('error_ctb_pos', ctypes.c_uint32, 28), ('error_slice_pos', ctypes.c_uint32, 32)]) +nvdec_status_vp9_s: TypeAlias = struct__nvdec_status_vp9_s +@c.record +class struct__nvdec_status_s(c.Struct): + SIZE = 56 + mbs_correctly_decoded: int + mbs_in_error: int + cycle_count: int + error_status: int + hevc: struct__nvdec_status_hevc_s + vp9: struct__nvdec_status_vp9_s + slice_header_error_code: int +struct__nvdec_status_s.register_fields([('mbs_correctly_decoded', ctypes.c_uint32, 0), ('mbs_in_error', ctypes.c_uint32, 4), ('cycle_count', ctypes.c_uint32, 8), ('error_status', ctypes.c_uint32, 12), ('hevc', nvdec_status_hevc_s, 16), ('vp9', nvdec_status_vp9_s, 16), ('slice_header_error_code', ctypes.c_uint32, 52)]) +nvdec_status_s: TypeAlias = struct__nvdec_status_s +@c.record +class struct__external_mv_s(c.Struct): + SIZE = 4 + mvx: int + mvy: int + refidx: int +struct__external_mv_s.register_fields([('mvx', ctypes.c_int32, 0, 14, 0), ('mvy', ctypes.c_int32, 1, 14, 6), ('refidx', ctypes.c_uint32, 3, 4, 4)]) +external_mv_s: TypeAlias = struct__external_mv_s +@c.record +class struct__nvdec_hevc_main10_444_ext_s(c.Struct): + SIZE = 28 + transformSkipRotationEnableFlag: int + transformSkipContextEnableFlag: int + intraBlockCopyEnableFlag: int + implicitRdpcmEnableFlag: int + explicitRdpcmEnableFlag: int + extendedPrecisionProcessingFlag: int + intraSmoothingDisabledFlag: int + highPrecisionOffsetsEnableFlag: int + fastRiceAdaptationEnableFlag: int + cabacBypassAlignmentEnableFlag: int + sps_444_extension_reserved: int + log2MaxTransformSkipSize: int + crossComponentPredictionEnableFlag: int + chromaQpAdjustmentEnableFlag: int + diffCuChromaQpAdjustmentDepth: int + chromaQpAdjustmentTableSize: int + log2SaoOffsetScaleLuma: int + log2SaoOffsetScaleChroma: int + pps_444_extension_reserved: int + cb_qp_adjustment: c.Array[ctypes.c_char, Literal[6]] + cr_qp_adjustment: c.Array[ctypes.c_char, Literal[6]] + HevcFltAboveOffset: int + HevcSaoAboveOffset: int +struct__nvdec_hevc_main10_444_ext_s.register_fields([('transformSkipRotationEnableFlag', ctypes.c_uint32, 0, 1, 0), ('transformSkipContextEnableFlag', ctypes.c_uint32, 0, 1, 1), ('intraBlockCopyEnableFlag', ctypes.c_uint32, 0, 1, 2), ('implicitRdpcmEnableFlag', ctypes.c_uint32, 0, 1, 3), ('explicitRdpcmEnableFlag', ctypes.c_uint32, 0, 1, 4), ('extendedPrecisionProcessingFlag', ctypes.c_uint32, 0, 1, 5), ('intraSmoothingDisabledFlag', ctypes.c_uint32, 0, 1, 6), ('highPrecisionOffsetsEnableFlag', ctypes.c_uint32, 0, 1, 7), ('fastRiceAdaptationEnableFlag', ctypes.c_uint32, 1, 1, 0), ('cabacBypassAlignmentEnableFlag', ctypes.c_uint32, 1, 1, 1), ('sps_444_extension_reserved', ctypes.c_uint32, 1, 22, 2), ('log2MaxTransformSkipSize', ctypes.c_uint32, 4, 4, 0), ('crossComponentPredictionEnableFlag', ctypes.c_uint32, 4, 1, 4), ('chromaQpAdjustmentEnableFlag', ctypes.c_uint32, 4, 1, 5), ('diffCuChromaQpAdjustmentDepth', ctypes.c_uint32, 4, 2, 6), ('chromaQpAdjustmentTableSize', ctypes.c_uint32, 5, 3, 0), ('log2SaoOffsetScaleLuma', ctypes.c_uint32, 5, 3, 3), ('log2SaoOffsetScaleChroma', ctypes.c_uint32, 5, 3, 6), ('pps_444_extension_reserved', ctypes.c_uint32, 6, 15, 1), ('cb_qp_adjustment', c.Array[ctypes.c_char, Literal[6]], 8), ('cr_qp_adjustment', c.Array[ctypes.c_char, Literal[6]], 14), ('HevcFltAboveOffset', ctypes.c_uint32, 20), ('HevcSaoAboveOffset', ctypes.c_uint32, 24)]) +nvdec_hevc_main10_444_ext_s: TypeAlias = struct__nvdec_hevc_main10_444_ext_s +@c.record +class struct__nvdec_hevc_pic_v1_s(c.Struct): + SIZE = 32 + hevc_main10_444_ext: struct__nvdec_hevc_main10_444_ext_s + sw_skip_start_length: int + external_ref_mem_dis: int + error_recovery_start_pos: int + error_external_mv_en: int + reserved0: int +struct__nvdec_hevc_pic_v1_s.register_fields([('hevc_main10_444_ext', nvdec_hevc_main10_444_ext_s, 0), ('sw_skip_start_length', ctypes.c_uint32, 28, 14, 0), ('external_ref_mem_dis', ctypes.c_uint32, 29, 1, 6), ('error_recovery_start_pos', ctypes.c_uint32, 29, 2, 7), ('error_external_mv_en', ctypes.c_uint32, 30, 1, 1), ('reserved0', ctypes.c_uint32, 30, 14, 2)]) +nvdec_hevc_pic_v1_s: TypeAlias = struct__nvdec_hevc_pic_v1_s +@c.record +class struct__nvdec_hevc_pic_v2_s(c.Struct): + SIZE = 4 + mv_hevc_enable: int + nuh_layer_id: int + default_ref_layers_active_flag: int + NumDirectRefLayers: int + max_one_active_ref_layer_flag: int + NumActiveRefLayerPics: int + poc_lsb_not_present_flag: int + reserved0: int +struct__nvdec_hevc_pic_v2_s.register_fields([('mv_hevc_enable', ctypes.c_uint32, 0, 1, 0), ('nuh_layer_id', ctypes.c_uint32, 0, 6, 1), ('default_ref_layers_active_flag', ctypes.c_uint32, 0, 1, 7), ('NumDirectRefLayers', ctypes.c_uint32, 1, 6, 0), ('max_one_active_ref_layer_flag', ctypes.c_uint32, 1, 1, 6), ('NumActiveRefLayerPics', ctypes.c_uint32, 1, 6, 7), ('poc_lsb_not_present_flag', ctypes.c_uint32, 2, 1, 5), ('reserved0', ctypes.c_uint32, 2, 10, 6)]) +nvdec_hevc_pic_v2_s: TypeAlias = struct__nvdec_hevc_pic_v2_s +@c.record +class struct__nvdec_hevc_pic_v3_s(c.Struct): + SIZE = 8 + slice_decoding_enable: int + slice_ec_enable: int + slice_ec_mv_type: int + err_detected_sw: int + slice_ec_slice_type: int + slice_strm_recfg_en: int + reserved: int + HevcSliceEdgeOffset: int +struct__nvdec_hevc_pic_v3_s.register_fields([('slice_decoding_enable', ctypes.c_uint32, 0, 1, 0), ('slice_ec_enable', ctypes.c_uint32, 0, 1, 1), ('slice_ec_mv_type', ctypes.c_uint32, 0, 2, 2), ('err_detected_sw', ctypes.c_uint32, 0, 1, 4), ('slice_ec_slice_type', ctypes.c_uint32, 0, 2, 5), ('slice_strm_recfg_en', ctypes.c_uint32, 0, 1, 7), ('reserved', ctypes.c_uint32, 1, 24, 0), ('HevcSliceEdgeOffset', ctypes.c_uint32, 4)]) +nvdec_hevc_pic_v3_s: TypeAlias = struct__nvdec_hevc_pic_v3_s +@c.record +class struct__nvdec_hevc_pic_s(c.Struct): + SIZE = 276 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + stream_len: int + enable_encryption: int + key_increment: int + encryption_mode: int + key_slot_index: int + ssm_en: int + enable_histogram: int + enable_substream_decoding: int + reserved0: int + gptimer_timeout_value: int + tileformat: int + gob_height: int + reserverd_surface_format: int + sw_start_code_e: int + disp_output_mode: int + reserved1: int + framestride: c.Array[ctypes.c_uint32, Literal[2]] + colMvBuffersize: int + HevcSaoBufferOffset: int + HevcBsdCtrlOffset: int + pic_width_in_luma_samples: int + pic_height_in_luma_samples: int + chroma_format_idc: int + bit_depth_luma: int + bit_depth_chroma: int + log2_min_luma_coding_block_size: int + log2_max_luma_coding_block_size: int + log2_min_transform_block_size: int + log2_max_transform_block_size: int + reserved2: int + max_transform_hierarchy_depth_inter: int + max_transform_hierarchy_depth_intra: int + scalingListEnable: int + amp_enable_flag: int + sample_adaptive_offset_enabled_flag: int + pcm_enabled_flag: int + pcm_sample_bit_depth_luma: int + pcm_sample_bit_depth_chroma: int + log2_min_pcm_luma_coding_block_size: int + log2_max_pcm_luma_coding_block_size: int + pcm_loop_filter_disabled_flag: int + sps_temporal_mvp_enabled_flag: int + strong_intra_smoothing_enabled_flag: int + reserved3: int + dependent_slice_segments_enabled_flag: int + output_flag_present_flag: int + num_extra_slice_header_bits: int + sign_data_hiding_enabled_flag: int + cabac_init_present_flag: int + num_ref_idx_l0_default_active: int + num_ref_idx_l1_default_active: int + init_qp: int + constrained_intra_pred_flag: int + transform_skip_enabled_flag: int + cu_qp_delta_enabled_flag: int + diff_cu_qp_delta_depth: int + reserved4: int + pps_cb_qp_offset: bytes + pps_cr_qp_offset: bytes + pps_beta_offset: bytes + pps_tc_offset: bytes + pps_slice_chroma_qp_offsets_present_flag: int + weighted_pred_flag: int + weighted_bipred_flag: int + transquant_bypass_enabled_flag: int + tiles_enabled_flag: int + entropy_coding_sync_enabled_flag: int + num_tile_columns: int + num_tile_rows: int + loop_filter_across_tiles_enabled_flag: int + loop_filter_across_slices_enabled_flag: int + deblocking_filter_control_present_flag: int + deblocking_filter_override_enabled_flag: int + pps_deblocking_filter_disabled_flag: int + lists_modification_present_flag: int + log2_parallel_merge_level: int + slice_segment_header_extension_present_flag: int + reserved5: int + num_ref_frames: int + reserved6: int + longtermflag: int + initreflistidxl0: c.Array[ctypes.c_ubyte, Literal[16]] + initreflistidxl1: c.Array[ctypes.c_ubyte, Literal[16]] + RefDiffPicOrderCnts: c.Array[ctypes.c_int16, Literal[16]] + IDR_picture_flag: int + RAP_picture_flag: int + curr_pic_idx: int + pattern_id: int + sw_hdr_skip_length: int + reserved7: int + ecdma_cfg: struct__nvdec_ecdma_config_s + separate_colour_plane_flag: int + log2_max_pic_order_cnt_lsb_minus4: int + num_short_term_ref_pic_sets: int + num_long_term_ref_pics_sps: int + bBitParsingDisable: int + num_delta_pocs_of_rps_idx: int + long_term_ref_pics_present_flag: int + reserved_dxva: int + num_bits_short_term_ref_pics_in_slice: int + v1: struct__nvdec_hevc_pic_v1_s + v2: struct__nvdec_hevc_pic_v2_s + v3: struct__nvdec_hevc_pic_v3_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_hevc_pic_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('stream_len', ctypes.c_uint32, 48), ('enable_encryption', ctypes.c_uint32, 52), ('key_increment', ctypes.c_uint32, 56, 6, 0), ('encryption_mode', ctypes.c_uint32, 56, 4, 6), ('key_slot_index', ctypes.c_uint32, 57, 4, 2), ('ssm_en', ctypes.c_uint32, 57, 1, 6), ('enable_histogram', ctypes.c_uint32, 57, 1, 7), ('enable_substream_decoding', ctypes.c_uint32, 58, 1, 0), ('reserved0', ctypes.c_uint32, 58, 15, 1), ('gptimer_timeout_value', ctypes.c_uint32, 60), ('tileformat', ctypes.c_ubyte, 64, 2, 0), ('gob_height', ctypes.c_ubyte, 64, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 64, 3, 5), ('sw_start_code_e', ctypes.c_ubyte, 65), ('disp_output_mode', ctypes.c_ubyte, 66), ('reserved1', ctypes.c_ubyte, 67), ('framestride', c.Array[ctypes.c_uint32, Literal[2]], 68), ('colMvBuffersize', ctypes.c_uint32, 76), ('HevcSaoBufferOffset', ctypes.c_uint32, 80), ('HevcBsdCtrlOffset', ctypes.c_uint32, 84), ('pic_width_in_luma_samples', ctypes.c_uint16, 88), ('pic_height_in_luma_samples', ctypes.c_uint16, 90), ('chroma_format_idc', ctypes.c_uint32, 92, 4, 0), ('bit_depth_luma', ctypes.c_uint32, 92, 4, 4), ('bit_depth_chroma', ctypes.c_uint32, 93, 4, 0), ('log2_min_luma_coding_block_size', ctypes.c_uint32, 93, 4, 4), ('log2_max_luma_coding_block_size', ctypes.c_uint32, 94, 4, 0), ('log2_min_transform_block_size', ctypes.c_uint32, 94, 4, 4), ('log2_max_transform_block_size', ctypes.c_uint32, 95, 4, 0), ('reserved2', ctypes.c_uint32, 95, 4, 4), ('max_transform_hierarchy_depth_inter', ctypes.c_uint32, 96, 3, 0), ('max_transform_hierarchy_depth_intra', ctypes.c_uint32, 96, 3, 3), ('scalingListEnable', ctypes.c_uint32, 96, 1, 6), ('amp_enable_flag', ctypes.c_uint32, 96, 1, 7), ('sample_adaptive_offset_enabled_flag', ctypes.c_uint32, 97, 1, 0), ('pcm_enabled_flag', ctypes.c_uint32, 97, 1, 1), ('pcm_sample_bit_depth_luma', ctypes.c_uint32, 97, 4, 2), ('pcm_sample_bit_depth_chroma', ctypes.c_uint32, 97, 4, 6), ('log2_min_pcm_luma_coding_block_size', ctypes.c_uint32, 98, 4, 2), ('log2_max_pcm_luma_coding_block_size', ctypes.c_uint32, 98, 4, 6), ('pcm_loop_filter_disabled_flag', ctypes.c_uint32, 99, 1, 2), ('sps_temporal_mvp_enabled_flag', ctypes.c_uint32, 99, 1, 3), ('strong_intra_smoothing_enabled_flag', ctypes.c_uint32, 99, 1, 4), ('reserved3', ctypes.c_uint32, 99, 3, 5), ('dependent_slice_segments_enabled_flag', ctypes.c_uint32, 100, 1, 0), ('output_flag_present_flag', ctypes.c_uint32, 100, 1, 1), ('num_extra_slice_header_bits', ctypes.c_uint32, 100, 3, 2), ('sign_data_hiding_enabled_flag', ctypes.c_uint32, 100, 1, 5), ('cabac_init_present_flag', ctypes.c_uint32, 100, 1, 6), ('num_ref_idx_l0_default_active', ctypes.c_uint32, 100, 4, 7), ('num_ref_idx_l1_default_active', ctypes.c_uint32, 101, 4, 3), ('init_qp', ctypes.c_uint32, 101, 7, 7), ('constrained_intra_pred_flag', ctypes.c_uint32, 102, 1, 6), ('transform_skip_enabled_flag', ctypes.c_uint32, 102, 1, 7), ('cu_qp_delta_enabled_flag', ctypes.c_uint32, 103, 1, 0), ('diff_cu_qp_delta_depth', ctypes.c_uint32, 103, 2, 1), ('reserved4', ctypes.c_uint32, 103, 5, 3), ('pps_cb_qp_offset', ctypes.c_char, 104), ('pps_cr_qp_offset', ctypes.c_char, 105), ('pps_beta_offset', ctypes.c_char, 106), ('pps_tc_offset', ctypes.c_char, 107), ('pps_slice_chroma_qp_offsets_present_flag', ctypes.c_uint32, 108, 1, 0), ('weighted_pred_flag', ctypes.c_uint32, 108, 1, 1), ('weighted_bipred_flag', ctypes.c_uint32, 108, 1, 2), ('transquant_bypass_enabled_flag', ctypes.c_uint32, 108, 1, 3), ('tiles_enabled_flag', ctypes.c_uint32, 108, 1, 4), ('entropy_coding_sync_enabled_flag', ctypes.c_uint32, 108, 1, 5), ('num_tile_columns', ctypes.c_uint32, 108, 5, 6), ('num_tile_rows', ctypes.c_uint32, 109, 5, 3), ('loop_filter_across_tiles_enabled_flag', ctypes.c_uint32, 110, 1, 0), ('loop_filter_across_slices_enabled_flag', ctypes.c_uint32, 110, 1, 1), ('deblocking_filter_control_present_flag', ctypes.c_uint32, 110, 1, 2), ('deblocking_filter_override_enabled_flag', ctypes.c_uint32, 110, 1, 3), ('pps_deblocking_filter_disabled_flag', ctypes.c_uint32, 110, 1, 4), ('lists_modification_present_flag', ctypes.c_uint32, 110, 1, 5), ('log2_parallel_merge_level', ctypes.c_uint32, 110, 3, 6), ('slice_segment_header_extension_present_flag', ctypes.c_uint32, 111, 1, 1), ('reserved5', ctypes.c_uint32, 111, 6, 2), ('num_ref_frames', ctypes.c_ubyte, 112), ('reserved6', ctypes.c_ubyte, 113), ('longtermflag', ctypes.c_uint16, 114), ('initreflistidxl0', c.Array[ctypes.c_ubyte, Literal[16]], 116), ('initreflistidxl1', c.Array[ctypes.c_ubyte, Literal[16]], 132), ('RefDiffPicOrderCnts', c.Array[ctypes.c_int16, Literal[16]], 148), ('IDR_picture_flag', ctypes.c_ubyte, 180), ('RAP_picture_flag', ctypes.c_ubyte, 181), ('curr_pic_idx', ctypes.c_ubyte, 182), ('pattern_id', ctypes.c_ubyte, 183), ('sw_hdr_skip_length', ctypes.c_uint16, 184), ('reserved7', ctypes.c_uint16, 186), ('ecdma_cfg', nvdec_ecdma_config_s, 188), ('separate_colour_plane_flag', ctypes.c_uint32, 212, 1, 0), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_uint32, 212, 4, 1), ('num_short_term_ref_pic_sets', ctypes.c_uint32, 212, 7, 5), ('num_long_term_ref_pics_sps', ctypes.c_uint32, 213, 6, 4), ('bBitParsingDisable', ctypes.c_uint32, 214, 1, 2), ('num_delta_pocs_of_rps_idx', ctypes.c_uint32, 214, 8, 3), ('long_term_ref_pics_present_flag', ctypes.c_uint32, 215, 1, 3), ('reserved_dxva', ctypes.c_uint32, 215, 4, 4), ('num_bits_short_term_ref_pics_in_slice', ctypes.c_uint32, 216), ('v1', nvdec_hevc_pic_v1_s, 220), ('v2', nvdec_hevc_pic_v2_s, 252), ('v3', nvdec_hevc_pic_v3_s, 256), ('ssm', nvdec_pass2_otf_ext_s, 264)]) +nvdec_hevc_pic_s: TypeAlias = struct__nvdec_hevc_pic_s +@c.record +class struct__hevc_slice_info_s(c.Struct): + SIZE = 16 + first_flag: int + err_flag: int + last_flag: int + conceal_partial_slice: int + available: int + reserved0: int + ctb_count: int + bs_offset: int + bs_length: int + start_ctbx: int + start_ctby: int +struct__hevc_slice_info_s.register_fields([('first_flag', ctypes.c_uint32, 0, 1, 0), ('err_flag', ctypes.c_uint32, 0, 1, 1), ('last_flag', ctypes.c_uint32, 0, 1, 2), ('conceal_partial_slice', ctypes.c_uint32, 0, 1, 3), ('available', ctypes.c_uint32, 0, 1, 4), ('reserved0', ctypes.c_uint32, 0, 7, 5), ('ctb_count', ctypes.c_uint32, 1, 20, 4), ('bs_offset', ctypes.c_uint32, 4), ('bs_length', ctypes.c_uint32, 8), ('start_ctbx', ctypes.c_uint16, 12), ('start_ctby', ctypes.c_uint16, 14)]) +hevc_slice_info_s: TypeAlias = struct__hevc_slice_info_s +@c.record +class struct__slice_edge_ctb_pos_ctx_s(c.Struct): + SIZE = 8 + next_slice_pos_ctbxy: int + next_slice_segment_addr: int +struct__slice_edge_ctb_pos_ctx_s.register_fields([('next_slice_pos_ctbxy', ctypes.c_uint32, 0), ('next_slice_segment_addr', ctypes.c_uint32, 4)]) +slice_edge_ctb_pos_ctx_s: TypeAlias = struct__slice_edge_ctb_pos_ctx_s +@c.record +class struct__slice_edge_tile_ctx_s(c.Struct): + SIZE = 12 + tileInfo1: int + tileInfo2: int + tileInfo3: int +struct__slice_edge_tile_ctx_s.register_fields([('tileInfo1', ctypes.c_uint32, 0), ('tileInfo2', ctypes.c_uint32, 4), ('tileInfo3', ctypes.c_uint32, 8)]) +slice_edge_tile_ctx_s: TypeAlias = struct__slice_edge_tile_ctx_s +@c.record +class struct__slice_edge_stats_ctx_s(c.Struct): + SIZE = 32 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + frame_status_mv_cnt_ext: int +struct__slice_edge_stats_ctx_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('frame_status_mv_cnt_ext', ctypes.c_uint32, 28)]) +slice_edge_stats_ctx_s: TypeAlias = struct__slice_edge_stats_ctx_s +@c.record +class struct__slice_vpc_edge_ctx_s(c.Struct): + SIZE = 4 + reserved: int +struct__slice_vpc_edge_ctx_s.register_fields([('reserved', ctypes.c_uint32, 0)]) +slice_vpc_edge_ctx_s: TypeAlias = struct__slice_vpc_edge_ctx_s +@c.record +class struct__slice_vpc_main_ctx_s(c.Struct): + SIZE = 4 + reserved: int +struct__slice_vpc_main_ctx_s.register_fields([('reserved', ctypes.c_uint32, 0)]) +slice_vpc_main_ctx_s: TypeAlias = struct__slice_vpc_main_ctx_s +@c.record +class struct__slice_edge_ctx_s(c.Struct): + SIZE = 60 + slice_ctb_pos_ctx: struct__slice_edge_ctb_pos_ctx_s + slice_stats_ctx: struct__slice_edge_stats_ctx_s + slice_tile_ctx: struct__slice_edge_tile_ctx_s + slice_vpc_edge_ctx: struct__slice_vpc_edge_ctx_s + slice_vpc_main_ctx: struct__slice_vpc_main_ctx_s +struct__slice_edge_ctx_s.register_fields([('slice_ctb_pos_ctx', slice_edge_ctb_pos_ctx_s, 0), ('slice_stats_ctx', slice_edge_stats_ctx_s, 8), ('slice_tile_ctx', slice_edge_tile_ctx_s, 40), ('slice_vpc_edge_ctx', slice_vpc_edge_ctx_s, 52), ('slice_vpc_main_ctx', slice_vpc_main_ctx_s, 56)]) +slice_edge_ctx_s: TypeAlias = struct__slice_edge_ctx_s +@c.record +class struct__nvdec_vp9_pic_v1_s(c.Struct): + SIZE = 8 + Vp9FltAboveOffset: int + external_ref_mem_dis: int + bit_depth: int + error_recovery_start_pos: int + error_external_mv_en: int + Reserved0: int +struct__nvdec_vp9_pic_v1_s.register_fields([('Vp9FltAboveOffset', ctypes.c_uint32, 0), ('external_ref_mem_dis', ctypes.c_uint32, 4, 1, 0), ('bit_depth', ctypes.c_uint32, 4, 4, 1), ('error_recovery_start_pos', ctypes.c_uint32, 4, 2, 5), ('error_external_mv_en', ctypes.c_uint32, 4, 1, 7), ('Reserved0', ctypes.c_uint32, 5, 24, 0)]) +nvdec_vp9_pic_v1_s: TypeAlias = struct__nvdec_vp9_pic_v1_s +enum_VP9_FRAME_SFC_ID: dict[int, str] = {(VP9_LAST_FRAME_SFC:=0): 'VP9_LAST_FRAME_SFC', (VP9_GOLDEN_FRAME_SFC:=1): 'VP9_GOLDEN_FRAME_SFC', (VP9_ALTREF_FRAME_SFC:=2): 'VP9_ALTREF_FRAME_SFC', (VP9_CURR_FRAME_SFC:=3): 'VP9_CURR_FRAME_SFC'} +@c.record +class struct__nvdec_vp9_pic_s(c.Struct): + SIZE = 256 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + stream_len: int + enable_encryption: int + key_increment: int + encryption_mode: int + sw_hdr_skip_length: int + key_slot_index: int + ssm_en: int + enable_histogram: int + reserved0: int + gptimer_timeout_value: int + tileformat: int + gob_height: int + reserverd_surface_format: int + reserved1: c.Array[ctypes.c_ubyte, Literal[3]] + Vp9BsdCtrlOffset: int + ref0_width: int + ref0_height: int + ref0_stride: c.Array[ctypes.c_uint16, Literal[2]] + ref1_width: int + ref1_height: int + ref1_stride: c.Array[ctypes.c_uint16, Literal[2]] + ref2_width: int + ref2_height: int + ref2_stride: c.Array[ctypes.c_uint16, Literal[2]] + width: int + height: int + framestride: c.Array[ctypes.c_uint16, Literal[2]] + keyFrame: int + prevIsKeyFrame: int + resolutionChange: int + errorResilient: int + prevShowFrame: int + intraOnly: int + reserved2: int + reserved3: c.Array[ctypes.c_ubyte, Literal[3]] + refFrameSignBias: c.Array[ctypes.c_ubyte, Literal[4]] + loopFilterLevel: bytes + loopFilterSharpness: bytes + qpYAc: int + qpYDc: bytes + qpChAc: bytes + qpChDc: bytes + lossless: bytes + transform_mode: bytes + allow_high_precision_mv: bytes + mcomp_filter_type: bytes + comp_pred_mode: bytes + comp_fixed_ref: bytes + comp_var_ref: c.Array[ctypes.c_char, Literal[2]] + log2_tile_columns: bytes + log2_tile_rows: bytes + segmentEnabled: int + segmentMapUpdate: int + segmentMapTemporalUpdate: int + segmentFeatureMode: int + segmentFeatureEnable: c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[8]] + segmentFeatureData: c.Array[c.Array[ctypes.c_int16, Literal[4]], Literal[8]] + modeRefLfEnabled: bytes + mbRefLfDelta: c.Array[ctypes.c_char, Literal[4]] + mbModeLfDelta: c.Array[ctypes.c_char, Literal[2]] + reserved5: bytes + v1: struct__nvdec_vp9_pic_v1_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vp9_pic_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('stream_len', ctypes.c_uint32, 48), ('enable_encryption', ctypes.c_uint32, 52), ('key_increment', ctypes.c_uint32, 56, 6, 0), ('encryption_mode', ctypes.c_uint32, 56, 4, 6), ('sw_hdr_skip_length', ctypes.c_uint32, 57, 14, 2), ('key_slot_index', ctypes.c_uint32, 59, 4, 0), ('ssm_en', ctypes.c_uint32, 59, 1, 4), ('enable_histogram', ctypes.c_uint32, 59, 1, 5), ('reserved0', ctypes.c_uint32, 59, 2, 6), ('gptimer_timeout_value', ctypes.c_uint32, 60), ('tileformat', ctypes.c_ubyte, 64, 2, 0), ('gob_height', ctypes.c_ubyte, 64, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 64, 3, 5), ('reserved1', c.Array[ctypes.c_ubyte, Literal[3]], 65), ('Vp9BsdCtrlOffset', ctypes.c_uint32, 68), ('ref0_width', ctypes.c_uint16, 72), ('ref0_height', ctypes.c_uint16, 74), ('ref0_stride', c.Array[ctypes.c_uint16, Literal[2]], 76), ('ref1_width', ctypes.c_uint16, 80), ('ref1_height', ctypes.c_uint16, 82), ('ref1_stride', c.Array[ctypes.c_uint16, Literal[2]], 84), ('ref2_width', ctypes.c_uint16, 88), ('ref2_height', ctypes.c_uint16, 90), ('ref2_stride', c.Array[ctypes.c_uint16, Literal[2]], 92), ('width', ctypes.c_uint16, 96), ('height', ctypes.c_uint16, 98), ('framestride', c.Array[ctypes.c_uint16, Literal[2]], 100), ('keyFrame', ctypes.c_ubyte, 104, 1, 0), ('prevIsKeyFrame', ctypes.c_ubyte, 104, 1, 1), ('resolutionChange', ctypes.c_ubyte, 104, 1, 2), ('errorResilient', ctypes.c_ubyte, 104, 1, 3), ('prevShowFrame', ctypes.c_ubyte, 104, 1, 4), ('intraOnly', ctypes.c_ubyte, 104, 1, 5), ('reserved2', ctypes.c_ubyte, 104, 2, 6), ('reserved3', c.Array[ctypes.c_ubyte, Literal[3]], 105), ('refFrameSignBias', c.Array[ctypes.c_ubyte, Literal[4]], 108), ('loopFilterLevel', ctypes.c_char, 112), ('loopFilterSharpness', ctypes.c_char, 113), ('qpYAc', ctypes.c_ubyte, 114), ('qpYDc', ctypes.c_char, 115), ('qpChAc', ctypes.c_char, 116), ('qpChDc', ctypes.c_char, 117), ('lossless', ctypes.c_char, 118), ('transform_mode', ctypes.c_char, 119), ('allow_high_precision_mv', ctypes.c_char, 120), ('mcomp_filter_type', ctypes.c_char, 121), ('comp_pred_mode', ctypes.c_char, 122), ('comp_fixed_ref', ctypes.c_char, 123), ('comp_var_ref', c.Array[ctypes.c_char, Literal[2]], 124), ('log2_tile_columns', ctypes.c_char, 126), ('log2_tile_rows', ctypes.c_char, 127), ('segmentEnabled', ctypes.c_ubyte, 128), ('segmentMapUpdate', ctypes.c_ubyte, 129), ('segmentMapTemporalUpdate', ctypes.c_ubyte, 130), ('segmentFeatureMode', ctypes.c_ubyte, 131), ('segmentFeatureEnable', c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[8]], 132), ('segmentFeatureData', c.Array[c.Array[ctypes.c_int16, Literal[4]], Literal[8]], 164), ('modeRefLfEnabled', ctypes.c_char, 228), ('mbRefLfDelta', c.Array[ctypes.c_char, Literal[4]], 229), ('mbModeLfDelta', c.Array[ctypes.c_char, Literal[2]], 233), ('reserved5', ctypes.c_char, 235), ('v1', nvdec_vp9_pic_v1_s, 236), ('ssm', nvdec_pass2_otf_ext_s, 244)]) +nvdec_vp9_pic_s: TypeAlias = struct__nvdec_vp9_pic_s +@c.record +class nvdec_nmv_context(c.Struct): + SIZE = 69 + joints: c.Array[ctypes.c_ubyte, Literal[3]] + sign: c.Array[ctypes.c_ubyte, Literal[2]] + class0: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]] + fp: c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]] + class0_hp: c.Array[ctypes.c_ubyte, Literal[2]] + hp: c.Array[ctypes.c_ubyte, Literal[2]] + classes: c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]] + class0_fp: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], Literal[2]] + bits: c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]] +nvdec_nmv_context.register_fields([('joints', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('sign', c.Array[ctypes.c_ubyte, Literal[2]], 3), ('class0', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]], 5), ('fp', c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], 7), ('class0_hp', c.Array[ctypes.c_ubyte, Literal[2]], 13), ('hp', c.Array[ctypes.c_ubyte, Literal[2]], 15), ('classes', c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]], 17), ('class0_fp', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], Literal[2]], 37), ('bits', c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]], 49)]) +@c.record +class nvdec_nmv_context_counts(c.Struct): + SIZE = 424 + joints: c.Array[ctypes.c_uint32, Literal[4]] + sign: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + classes: c.Array[c.Array[ctypes.c_uint32, Literal[11]], Literal[2]] + class0: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + bits: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[10]], Literal[2]] + class0_fp: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], Literal[2]] + fp: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]] + class0_hp: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + hp: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] +nvdec_nmv_context_counts.register_fields([('joints', c.Array[ctypes.c_uint32, Literal[4]], 0), ('sign', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 16), ('classes', c.Array[c.Array[ctypes.c_uint32, Literal[11]], Literal[2]], 32), ('class0', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 120), ('bits', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[10]], Literal[2]], 136), ('class0_fp', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], Literal[2]], 296), ('fp', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], 360), ('class0_hp', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 392), ('hp', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 408)]) +@c.record +class struct_nvdec_vp9AdaptiveEntropyProbs_s(c.Struct): + SIZE = 2720 + inter_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[7]] + intra_inter_prob: c.Array[ctypes.c_ubyte, Literal[4]] + uv_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]] + tx8x8_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]] + tx16x16_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[2]] + tx32x32_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]] + sb_ymode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[4]] + sb_ymode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[4]] + partition_prob: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[16]], Literal[2]] + uv_mode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]] + switchable_interp_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[4]] + comp_inter_prob: c.Array[ctypes.c_ubyte, Literal[5]] + mbskip_probs: c.Array[ctypes.c_ubyte, Literal[3]] + pad1: c.Array[ctypes.c_ubyte, Literal[1]] + nmvc: nvdec_nmv_context + single_ref_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[5]] + comp_ref_prob: c.Array[ctypes.c_ubyte, Literal[5]] + pad2: c.Array[ctypes.c_ubyte, Literal[17]] + probCoeffs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs8x8: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs16x16: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs32x32: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] +struct_nvdec_vp9AdaptiveEntropyProbs_s.register_fields([('inter_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[7]], 0), ('intra_inter_prob', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('uv_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], 32), ('tx8x8_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]], 112), ('tx16x16_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[2]], 114), ('tx32x32_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], 118), ('sb_ymode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[4]], 124), ('sb_ymode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[4]], 128), ('partition_prob', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[16]], Literal[2]], 160), ('uv_mode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], 288), ('switchable_interp_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[4]], 298), ('comp_inter_prob', c.Array[ctypes.c_ubyte, Literal[5]], 306), ('mbskip_probs', c.Array[ctypes.c_ubyte, Literal[3]], 311), ('pad1', c.Array[ctypes.c_ubyte, Literal[1]], 314), ('nmvc', nvdec_nmv_context, 315), ('single_ref_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[5]], 384), ('comp_ref_prob', c.Array[ctypes.c_ubyte, Literal[5]], 394), ('pad2', c.Array[ctypes.c_ubyte, Literal[17]], 399), ('probCoeffs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 416), ('probCoeffs8x8', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 992), ('probCoeffs16x16', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 1568), ('probCoeffs32x32', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 2144)]) +nvdec_vp9AdaptiveEntropyProbs_t: TypeAlias = struct_nvdec_vp9AdaptiveEntropyProbs_s +@c.record +class struct_nvdec_vp9EntropyProbs_s(c.Struct): + SIZE = 3744 + kf_bmode_prob: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], Literal[10]] + kf_bmode_probB: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], Literal[10]] + ref_pred_probs: c.Array[ctypes.c_ubyte, Literal[3]] + mb_segment_tree_probs: c.Array[ctypes.c_ubyte, Literal[7]] + segment_pred_probs: c.Array[ctypes.c_ubyte, Literal[3]] + ref_scores: c.Array[ctypes.c_ubyte, Literal[4]] + prob_comppred: c.Array[ctypes.c_ubyte, Literal[2]] + pad1: c.Array[ctypes.c_ubyte, Literal[9]] + kf_uv_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]] + kf_uv_mode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]] + pad2: c.Array[ctypes.c_ubyte, Literal[6]] + a: struct_nvdec_vp9AdaptiveEntropyProbs_s +struct_nvdec_vp9EntropyProbs_s.register_fields([('kf_bmode_prob', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], Literal[10]], 0), ('kf_bmode_probB', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], Literal[10]], 800), ('ref_pred_probs', c.Array[ctypes.c_ubyte, Literal[3]], 900), ('mb_segment_tree_probs', c.Array[ctypes.c_ubyte, Literal[7]], 903), ('segment_pred_probs', c.Array[ctypes.c_ubyte, Literal[3]], 910), ('ref_scores', c.Array[ctypes.c_ubyte, Literal[4]], 913), ('prob_comppred', c.Array[ctypes.c_ubyte, Literal[2]], 917), ('pad1', c.Array[ctypes.c_ubyte, Literal[9]], 919), ('kf_uv_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], 928), ('kf_uv_mode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], 1008), ('pad2', c.Array[ctypes.c_ubyte, Literal[6]], 1018), ('a', nvdec_vp9AdaptiveEntropyProbs_t, 1024)]) +nvdec_vp9EntropyProbs_t: TypeAlias = struct_nvdec_vp9EntropyProbs_s +@c.record +class struct_nvdec_vp9EntropyCounts_s(c.Struct): + SIZE = 13264 + inter_mode_counts: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], Literal[7]] + sb_ymode_counts: c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[4]] + uv_mode_counts: c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[10]] + partition_counts: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[16]] + switchable_interp_counts: c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[4]] + intra_inter_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[4]] + comp_inter_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]] + single_ref_count: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], Literal[5]] + comp_ref_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]] + tx32x32_count: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]] + tx16x16_count: c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[2]] + tx8x8_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + mbskip_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]] + nmvcount: nvdec_nmv_context_counts + countCoeffs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs8x8: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs16x16: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs32x32: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countEobs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[6]], Literal[6]], Literal[2]], Literal[2]], Literal[4]] +struct_nvdec_vp9EntropyCounts_s.register_fields([('inter_mode_counts', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], Literal[7]], 0), ('sb_ymode_counts', c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[4]], 168), ('uv_mode_counts', c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[10]], 328), ('partition_counts', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[16]], 728), ('switchable_interp_counts', c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[4]], 984), ('intra_inter_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[4]], 1032), ('comp_inter_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]], 1064), ('single_ref_count', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], Literal[5]], 1104), ('comp_ref_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]], 1184), ('tx32x32_count', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], 1224), ('tx16x16_count', c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[2]], 1256), ('tx8x8_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 1280), ('mbskip_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], 1296), ('nmvcount', nvdec_nmv_context_counts, 1320), ('countCoeffs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 1744), ('countCoeffs8x8', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 4048), ('countCoeffs16x16', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 6352), ('countCoeffs32x32', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 8656), ('countEobs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[6]], Literal[6]], Literal[2]], Literal[2]], Literal[4]], 10960)]) +nvdec_vp9EntropyCounts_t: TypeAlias = struct_nvdec_vp9EntropyCounts_s +@c.record +class struct__nvdec_pass2_otf_s(c.Struct): + SIZE = 52 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + enable_encryption: int + key_increment: int + encryption_mode: int + key_slot_index: int + ssm_en: int + reserved1: int +struct__nvdec_pass2_otf_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('enable_encryption', ctypes.c_uint32, 48, 1, 0), ('key_increment', ctypes.c_uint32, 48, 6, 1), ('encryption_mode', ctypes.c_uint32, 48, 4, 7), ('key_slot_index', ctypes.c_uint32, 49, 4, 3), ('ssm_en', ctypes.c_uint32, 49, 1, 7), ('reserved1', ctypes.c_uint32, 50, 16, 0)]) +nvdec_pass2_otf_s: TypeAlias = struct__nvdec_pass2_otf_s +@c.record +class struct__nvdec_display_param_s(c.Struct): + SIZE = 28 + enableTFOutput: int + VC1MapYFlag: int + MapYValue: int + VC1MapUVFlag: int + MapUVValue: int + OutStride: int + TilingFormat: int + OutputStructure: int + reserved0: int + OutputTop: c.Array[ctypes.c_int32, Literal[2]] + OutputBottom: c.Array[ctypes.c_int32, Literal[2]] + enableHistogram: int + HistogramStartX: int + HistogramStartY: int + reserved1: int + HistogramEndX: int + HistogramEndY: int + reserved2: int +struct__nvdec_display_param_s.register_fields([('enableTFOutput', ctypes.c_uint32, 0, 1, 0), ('VC1MapYFlag', ctypes.c_uint32, 0, 1, 1), ('MapYValue', ctypes.c_uint32, 0, 3, 2), ('VC1MapUVFlag', ctypes.c_uint32, 0, 1, 5), ('MapUVValue', ctypes.c_uint32, 0, 3, 6), ('OutStride', ctypes.c_uint32, 1, 8, 1), ('TilingFormat', ctypes.c_uint32, 2, 3, 1), ('OutputStructure', ctypes.c_uint32, 2, 1, 4), ('reserved0', ctypes.c_uint32, 2, 11, 5), ('OutputTop', c.Array[ctypes.c_int32, Literal[2]], 4), ('OutputBottom', c.Array[ctypes.c_int32, Literal[2]], 12), ('enableHistogram', ctypes.c_uint32, 20, 1, 0), ('HistogramStartX', ctypes.c_uint32, 20, 12, 1), ('HistogramStartY', ctypes.c_uint32, 21, 12, 5), ('reserved1', ctypes.c_uint32, 23, 7, 1), ('HistogramEndX', ctypes.c_uint32, 24, 12, 0), ('HistogramEndY', ctypes.c_uint32, 25, 12, 4), ('reserved2', ctypes.c_uint32, 27, 8, 0)]) +nvdec_display_param_s: TypeAlias = struct__nvdec_display_param_s +@c.record +class struct__nvdec_dpb_entry_s(c.Struct): + SIZE = 16 + index: int + col_idx: int + state: int + is_long_term: int + not_existing: int + is_field: int + top_field_marking: int + bottom_field_marking: int + output_memory_layout: int + reserved: int + FieldOrderCnt: c.Array[ctypes.c_uint32, Literal[2]] + FrameIdx: int +struct__nvdec_dpb_entry_s.register_fields([('index', ctypes.c_uint32, 0, 7, 0), ('col_idx', ctypes.c_uint32, 0, 5, 7), ('state', ctypes.c_uint32, 1, 2, 4), ('is_long_term', ctypes.c_uint32, 1, 1, 6), ('not_existing', ctypes.c_uint32, 1, 1, 7), ('is_field', ctypes.c_uint32, 2, 1, 0), ('top_field_marking', ctypes.c_uint32, 2, 4, 1), ('bottom_field_marking', ctypes.c_uint32, 2, 4, 5), ('output_memory_layout', ctypes.c_uint32, 3, 1, 1), ('reserved', ctypes.c_uint32, 3, 6, 2), ('FieldOrderCnt', c.Array[ctypes.c_uint32, Literal[2]], 4), ('FrameIdx', ctypes.c_int32, 12)]) +nvdec_dpb_entry_s: TypeAlias = struct__nvdec_dpb_entry_s +@c.record +class struct__nvdec_h264_pic_s(c.Struct): + SIZE = 764 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + hint_dump_en: int + reserved0: c.Array[ctypes.c_ubyte, Literal[2]] + stream_len: int + slice_count: int + mbhist_buffer_size: int + gptimer_timeout_value: int + log2_max_pic_order_cnt_lsb_minus4: int + delta_pic_order_always_zero_flag: int + frame_mbs_only_flag: int + PicWidthInMbs: int + FrameHeightInMbs: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + entropy_coding_mode_flag: int + pic_order_present_flag: int + num_ref_idx_l0_active_minus1: int + num_ref_idx_l1_active_minus1: int + deblocking_filter_control_present_flag: int + redundant_pic_cnt_present_flag: int + transform_8x8_mode_flag: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + MbaffFrameFlag: int + direct_8x8_inference_flag: int + weighted_pred_flag: int + constrained_intra_pred_flag: int + ref_pic_flag: int + field_pic_flag: int + bottom_field_flag: int + second_field: int + log2_max_frame_num_minus4: int + chroma_format_idc: int + pic_order_cnt_type: int + pic_init_qp_minus26: int + chroma_qp_index_offset: int + second_chroma_qp_index_offset: int + weighted_bipred_idc: int + CurrPicIdx: int + CurrColIdx: int + frame_num: int + frame_surfaces: int + output_memory_layout: int + CurrFieldOrderCnt: c.Array[ctypes.c_int32, Literal[2]] + dpb: c.Array[struct__nvdec_dpb_entry_s, Literal[16]] + WeightScale: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]] + WeightScale8x8: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]] + num_inter_view_refs_lX: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_char, Literal[14]] + inter_view_refidx_lX: c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]] + lossless_ipred8x8_filter_enable: int + qpprime_y_zero_transform_bypass_flag: int + reserved2: int + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_h264_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('hint_dump_en', ctypes.c_ubyte, 69), ('reserved0', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('mbhist_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_int32, 88), ('delta_pic_order_always_zero_flag', ctypes.c_int32, 92), ('frame_mbs_only_flag', ctypes.c_int32, 96), ('PicWidthInMbs', ctypes.c_int32, 100), ('FrameHeightInMbs', ctypes.c_int32, 104), ('tileFormat', ctypes.c_uint32, 108, 2, 0), ('gob_height', ctypes.c_uint32, 108, 3, 2), ('reserverd_surface_format', ctypes.c_uint32, 108, 27, 5), ('entropy_coding_mode_flag', ctypes.c_int32, 112), ('pic_order_present_flag', ctypes.c_int32, 116), ('num_ref_idx_l0_active_minus1', ctypes.c_int32, 120), ('num_ref_idx_l1_active_minus1', ctypes.c_int32, 124), ('deblocking_filter_control_present_flag', ctypes.c_int32, 128), ('redundant_pic_cnt_present_flag', ctypes.c_int32, 132), ('transform_8x8_mode_flag', ctypes.c_int32, 136), ('pitch_luma', ctypes.c_uint32, 140), ('pitch_chroma', ctypes.c_uint32, 144), ('luma_top_offset', ctypes.c_uint32, 148), ('luma_bot_offset', ctypes.c_uint32, 152), ('luma_frame_offset', ctypes.c_uint32, 156), ('chroma_top_offset', ctypes.c_uint32, 160), ('chroma_bot_offset', ctypes.c_uint32, 164), ('chroma_frame_offset', ctypes.c_uint32, 168), ('HistBufferSize', ctypes.c_uint32, 172), ('MbaffFrameFlag', ctypes.c_uint32, 176, 1, 0), ('direct_8x8_inference_flag', ctypes.c_uint32, 176, 1, 1), ('weighted_pred_flag', ctypes.c_uint32, 176, 1, 2), ('constrained_intra_pred_flag', ctypes.c_uint32, 176, 1, 3), ('ref_pic_flag', ctypes.c_uint32, 176, 1, 4), ('field_pic_flag', ctypes.c_uint32, 176, 1, 5), ('bottom_field_flag', ctypes.c_uint32, 176, 1, 6), ('second_field', ctypes.c_uint32, 176, 1, 7), ('log2_max_frame_num_minus4', ctypes.c_uint32, 177, 4, 0), ('chroma_format_idc', ctypes.c_uint32, 177, 2, 4), ('pic_order_cnt_type', ctypes.c_uint32, 177, 2, 6), ('pic_init_qp_minus26', ctypes.c_int32, 178, 6, 0), ('chroma_qp_index_offset', ctypes.c_int32, 178, 5, 6), ('second_chroma_qp_index_offset', ctypes.c_int32, 179, 5, 3), ('weighted_bipred_idc', ctypes.c_uint32, 180, 2, 0), ('CurrPicIdx', ctypes.c_uint32, 180, 7, 2), ('CurrColIdx', ctypes.c_uint32, 181, 5, 1), ('frame_num', ctypes.c_uint32, 181, 16, 6), ('frame_surfaces', ctypes.c_uint32, 183, 1, 6), ('output_memory_layout', ctypes.c_uint32, 183, 1, 7), ('CurrFieldOrderCnt', c.Array[ctypes.c_int32, Literal[2]], 184), ('dpb', c.Array[nvdec_dpb_entry_s, Literal[16]], 192), ('WeightScale', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]], 448), ('WeightScale8x8', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]], 544), ('num_inter_view_refs_lX', c.Array[ctypes.c_ubyte, Literal[2]], 672), ('reserved1', c.Array[ctypes.c_char, Literal[14]], 674), ('inter_view_refidx_lX', c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]], 688), ('lossless_ipred8x8_filter_enable', ctypes.c_uint32, 720, 1, 0), ('qpprime_y_zero_transform_bypass_flag', ctypes.c_uint32, 720, 1, 1), ('reserved2', ctypes.c_uint32, 720, 30, 2), ('displayPara', nvdec_display_param_s, 724), ('ssm', nvdec_pass2_otf_ext_s, 752)]) +nvdec_h264_pic_s: TypeAlias = struct__nvdec_h264_pic_s +enum__vc1_fcm_e: dict[int, str] = {(FCM_PROGRESSIVE:=0): 'FCM_PROGRESSIVE', (FCM_FRAME_INTERLACE:=2): 'FCM_FRAME_INTERLACE', (FCM_FIELD_INTERLACE:=3): 'FCM_FIELD_INTERLACE'} +vc1_fcm_e: TypeAlias = ctypes.c_uint32 +enum__syntax_vc1_ptype_e: dict[int, str] = {(PTYPE_I:=0): 'PTYPE_I', (PTYPE_P:=1): 'PTYPE_P', (PTYPE_B:=2): 'PTYPE_B', (PTYPE_BI:=3): 'PTYPE_BI', (PTYPE_SKIPPED:=4): 'PTYPE_SKIPPED'} +syntax_vc1_ptype_e: TypeAlias = ctypes.c_uint32 +enum_vc1_mvmode_e: dict[int, str] = {(MVMODE_MIXEDMV:=0): 'MVMODE_MIXEDMV', (MVMODE_1MV:=1): 'MVMODE_1MV', (MVMODE_1MV_HALFPEL:=2): 'MVMODE_1MV_HALFPEL', (MVMODE_1MV_HALFPEL_BILINEAR:=3): 'MVMODE_1MV_HALFPEL_BILINEAR', (MVMODE_INTENSITY_COMPENSATION:=4): 'MVMODE_INTENSITY_COMPENSATION'} +enum__vc1_fptype_e: dict[int, str] = {(FPTYPE_I_I:=0): 'FPTYPE_I_I', (FPTYPE_I_P:=1): 'FPTYPE_I_P', (FPTYPE_P_I:=2): 'FPTYPE_P_I', (FPTYPE_P_P:=3): 'FPTYPE_P_P', (FPTYPE_B_B:=4): 'FPTYPE_B_B', (FPTYPE_B_BI:=5): 'FPTYPE_B_BI', (FPTYPE_BI_B:=6): 'FPTYPE_BI_B', (FPTYPE_BI_BI:=7): 'FPTYPE_BI_BI'} +vc1_fptype_e: TypeAlias = ctypes.c_uint32 +enum__vc1_dqprofile_e: dict[int, str] = {(DQPROFILE_ALL_FOUR_EDGES:=0): 'DQPROFILE_ALL_FOUR_EDGES', (DQPROFILE_DOUBLE_EDGE:=1): 'DQPROFILE_DOUBLE_EDGE', (DQPROFILE_SINGLE_EDGE:=2): 'DQPROFILE_SINGLE_EDGE', (DQPROFILE_ALL_MACROBLOCKS:=3): 'DQPROFILE_ALL_MACROBLOCKS'} +vc1_dqprofile_e: TypeAlias = ctypes.c_uint32 +@c.record +class struct__nvdec_vc1_pic_s(c.Struct): + SIZE = 404 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + prefixStartCode: c.Array[ctypes.c_ubyte, Literal[4]] + bitstream_offset: int + explicitEOSPresentFlag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + scratch_pic_buffer_size: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + profile: int + postprocflag: int + pulldown: int + interlace: int + tfcntrflag: int + finterpflag: int + psf: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + multires: int + syncmarker: int + rangered: int + maxbframes: int + dquant: int + panscan_flag: int + refdist_flag: int + quantizer: int + extended_mv: int + extended_dmv: int + overlap: int + vstransform: int + refdist: bytes + reserved1: c.Array[ctypes.c_char, Literal[3]] + fcm: int + ptype: int + tfcntr: int + rptfrm: int + tff: int + rndctrl: int + pqindex: int + halfqp: int + pquantizer: int + postproc: int + condover: int + transacfrm: int + transacfrm2: int + transdctab: int + pqdiff: int + abspq: int + dquantfrm: int + dqprofile: int + dqsbedge: int + dqdbedge: int + dqbilevel: int + mvrange: int + mvmode: int + mvmode2: int + lumscale: int + lumshift: int + mvtab: int + cbptab: int + ttmbf: int + ttfrm: int + bfraction: int + fptype: int + numref: int + reffield: int + dmvrange: int + intcompfield: int + lumscale1: int + lumshift1: int + lumscale2: int + lumshift2: int + mbmodetab: int + imvtab: int + icbptab: int + fourmvbptab: int + fourmvswitch: int + intcomp: int + twomvbptab: int + rangeredfrm: int + HistBufferSize: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + CodedWidth: int + CodedHeight: int + loopfilter: int + fastuvmc: int + output_memory_layout: int + ref_memory_layout: c.Array[ctypes.c_ubyte, Literal[2]] + reserved3: c.Array[ctypes.c_ubyte, Literal[3]] + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vc1_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('prefixStartCode', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('bitstream_offset', ctypes.c_uint32, 72), ('explicitEOSPresentFlag', ctypes.c_ubyte, 76), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 77), ('stream_len', ctypes.c_uint32, 80), ('slice_count', ctypes.c_uint32, 84), ('scratch_pic_buffer_size', ctypes.c_uint32, 88), ('gptimer_timeout_value', ctypes.c_uint32, 92), ('FrameWidth', ctypes.c_uint16, 96), ('FrameHeight', ctypes.c_uint16, 98), ('profile', ctypes.c_ubyte, 100), ('postprocflag', ctypes.c_ubyte, 101), ('pulldown', ctypes.c_ubyte, 102), ('interlace', ctypes.c_ubyte, 103), ('tfcntrflag', ctypes.c_ubyte, 104), ('finterpflag', ctypes.c_ubyte, 105), ('psf', ctypes.c_ubyte, 106), ('tileFormat', ctypes.c_ubyte, 107, 2, 0), ('gob_height', ctypes.c_ubyte, 107, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 107, 3, 5), ('multires', ctypes.c_ubyte, 108), ('syncmarker', ctypes.c_ubyte, 109), ('rangered', ctypes.c_ubyte, 110), ('maxbframes', ctypes.c_ubyte, 111), ('dquant', ctypes.c_ubyte, 112), ('panscan_flag', ctypes.c_ubyte, 113), ('refdist_flag', ctypes.c_ubyte, 114), ('quantizer', ctypes.c_ubyte, 115), ('extended_mv', ctypes.c_ubyte, 116), ('extended_dmv', ctypes.c_ubyte, 117), ('overlap', ctypes.c_ubyte, 118), ('vstransform', ctypes.c_ubyte, 119), ('refdist', ctypes.c_char, 120), ('reserved1', c.Array[ctypes.c_char, Literal[3]], 121), ('fcm', vc1_fcm_e, 124), ('ptype', syntax_vc1_ptype_e, 128), ('tfcntr', ctypes.c_int32, 132), ('rptfrm', ctypes.c_int32, 136), ('tff', ctypes.c_int32, 140), ('rndctrl', ctypes.c_int32, 144), ('pqindex', ctypes.c_int32, 148), ('halfqp', ctypes.c_int32, 152), ('pquantizer', ctypes.c_int32, 156), ('postproc', ctypes.c_int32, 160), ('condover', ctypes.c_int32, 164), ('transacfrm', ctypes.c_int32, 168), ('transacfrm2', ctypes.c_int32, 172), ('transdctab', ctypes.c_int32, 176), ('pqdiff', ctypes.c_int32, 180), ('abspq', ctypes.c_int32, 184), ('dquantfrm', ctypes.c_int32, 188), ('dqprofile', vc1_dqprofile_e, 192), ('dqsbedge', ctypes.c_int32, 196), ('dqdbedge', ctypes.c_int32, 200), ('dqbilevel', ctypes.c_int32, 204), ('mvrange', ctypes.c_int32, 208), ('mvmode', ctypes.c_uint32, 212), ('mvmode2', ctypes.c_uint32, 216), ('lumscale', ctypes.c_int32, 220), ('lumshift', ctypes.c_int32, 224), ('mvtab', ctypes.c_int32, 228), ('cbptab', ctypes.c_int32, 232), ('ttmbf', ctypes.c_int32, 236), ('ttfrm', ctypes.c_int32, 240), ('bfraction', ctypes.c_int32, 244), ('fptype', vc1_fptype_e, 248), ('numref', ctypes.c_int32, 252), ('reffield', ctypes.c_int32, 256), ('dmvrange', ctypes.c_int32, 260), ('intcompfield', ctypes.c_int32, 264), ('lumscale1', ctypes.c_int32, 268), ('lumshift1', ctypes.c_int32, 272), ('lumscale2', ctypes.c_int32, 276), ('lumshift2', ctypes.c_int32, 280), ('mbmodetab', ctypes.c_int32, 284), ('imvtab', ctypes.c_int32, 288), ('icbptab', ctypes.c_int32, 292), ('fourmvbptab', ctypes.c_int32, 296), ('fourmvswitch', ctypes.c_int32, 300), ('intcomp', ctypes.c_int32, 304), ('twomvbptab', ctypes.c_int32, 308), ('rangeredfrm', ctypes.c_int32, 312), ('HistBufferSize', ctypes.c_uint32, 316), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 320), ('luma_top_offset', ctypes.c_uint32, 328), ('luma_bot_offset', ctypes.c_uint32, 332), ('luma_frame_offset', ctypes.c_uint32, 336), ('chroma_top_offset', ctypes.c_uint32, 340), ('chroma_bot_offset', ctypes.c_uint32, 344), ('chroma_frame_offset', ctypes.c_uint32, 348), ('CodedWidth', ctypes.c_uint16, 352), ('CodedHeight', ctypes.c_uint16, 354), ('loopfilter', ctypes.c_ubyte, 356), ('fastuvmc', ctypes.c_ubyte, 357), ('output_memory_layout', ctypes.c_ubyte, 358), ('ref_memory_layout', c.Array[ctypes.c_ubyte, Literal[2]], 359), ('reserved3', c.Array[ctypes.c_ubyte, Literal[3]], 361), ('displayPara', nvdec_display_param_s, 364), ('ssm', nvdec_pass2_otf_ext_s, 392)]) +nvdec_vc1_pic_s: TypeAlias = struct__nvdec_vc1_pic_s +@c.record +class struct__nvdec_mpeg2_pic_s(c.Struct): + SIZE = 344 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + picture_structure: int + picture_coding_type: int + intra_dc_precision: int + frame_pred_frame_dct: bytes + concealment_motion_vectors: bytes + intra_vlc_format: bytes + tileFormat: int + gob_height: int + reserverd_surface_format: int + reserved1: bytes + f_code: c.Array[ctypes.c_char, Literal[4]] + PicWidthInMbs: int + FrameHeightInMbs: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + output_memory_layout: int + alternate_scan: int + secondfield: int + rounding_type: int + MbInfoSizeInBytes: int + q_scale_type: int + top_field_first: int + full_pel_fwd_vector: int + full_pel_bwd_vector: int + quant_mat_8x8intra: c.Array[ctypes.c_ubyte, Literal[64]] + quant_mat_8x8nonintra: c.Array[ctypes.c_ubyte, Literal[64]] + ref_memory_layout: c.Array[ctypes.c_uint32, Literal[2]] + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_mpeg2_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 69), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('gptimer_timeout_value', ctypes.c_uint32, 80), ('FrameWidth', ctypes.c_int16, 84), ('FrameHeight', ctypes.c_int16, 86), ('picture_structure', ctypes.c_ubyte, 88), ('picture_coding_type', ctypes.c_ubyte, 89), ('intra_dc_precision', ctypes.c_ubyte, 90), ('frame_pred_frame_dct', ctypes.c_char, 91), ('concealment_motion_vectors', ctypes.c_char, 92), ('intra_vlc_format', ctypes.c_char, 93), ('tileFormat', ctypes.c_ubyte, 94, 2, 0), ('gob_height', ctypes.c_ubyte, 94, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 94, 3, 5), ('reserved1', ctypes.c_char, 95), ('f_code', c.Array[ctypes.c_char, Literal[4]], 96), ('PicWidthInMbs', ctypes.c_uint16, 100), ('FrameHeightInMbs', ctypes.c_uint16, 102), ('pitch_luma', ctypes.c_uint32, 104), ('pitch_chroma', ctypes.c_uint32, 108), ('luma_top_offset', ctypes.c_uint32, 112), ('luma_bot_offset', ctypes.c_uint32, 116), ('luma_frame_offset', ctypes.c_uint32, 120), ('chroma_top_offset', ctypes.c_uint32, 124), ('chroma_bot_offset', ctypes.c_uint32, 128), ('chroma_frame_offset', ctypes.c_uint32, 132), ('HistBufferSize', ctypes.c_uint32, 136), ('output_memory_layout', ctypes.c_uint16, 140), ('alternate_scan', ctypes.c_uint16, 142), ('secondfield', ctypes.c_uint16, 144), ('rounding_type', ctypes.c_uint16, 146), ('MbInfoSizeInBytes', ctypes.c_uint32, 148), ('q_scale_type', ctypes.c_uint32, 152), ('top_field_first', ctypes.c_uint32, 156), ('full_pel_fwd_vector', ctypes.c_uint32, 160), ('full_pel_bwd_vector', ctypes.c_uint32, 164), ('quant_mat_8x8intra', c.Array[ctypes.c_ubyte, Literal[64]], 168), ('quant_mat_8x8nonintra', c.Array[ctypes.c_ubyte, Literal[64]], 232), ('ref_memory_layout', c.Array[ctypes.c_uint32, Literal[2]], 296), ('displayPara', nvdec_display_param_s, 304), ('ssm', nvdec_pass2_otf_ext_s, 332)]) +nvdec_mpeg2_pic_s: TypeAlias = struct__nvdec_mpeg2_pic_s +@c.record +class struct__nvdec_mpeg4_pic_s(c.Struct): + SIZE = 368 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + reserved2: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + scratch_pic_buffer_size: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + vop_time_increment_bitcount: bytes + resync_marker_disable: bytes + tileFormat: int + gob_height: int + reserverd_surface_format: int + reserved3: bytes + width: int + height: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + trd: c.Array[ctypes.c_int32, Literal[2]] + trb: c.Array[ctypes.c_int32, Literal[2]] + divx_flags: int + vop_fcode_forward: int + vop_fcode_backward: int + interlaced: int + quant_type: int + quarter_sample: int + short_video_header: int + curr_output_memory_layout: int + ptype: int + rnd: int + alternate_vertical_scan_flag: int + top_field_flag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + intra_quant_mat: c.Array[ctypes.c_ubyte, Literal[64]] + nonintra_quant_mat: c.Array[ctypes.c_ubyte, Literal[64]] + ref_memory_layout: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_ubyte, Literal[34]] + displayPara: struct__nvdec_display_param_s +struct__nvdec_mpeg4_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('reserved2', c.Array[ctypes.c_ubyte, Literal[3]], 69), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('scratch_pic_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('FrameWidth', ctypes.c_int16, 88), ('FrameHeight', ctypes.c_int16, 90), ('vop_time_increment_bitcount', ctypes.c_char, 92), ('resync_marker_disable', ctypes.c_char, 93), ('tileFormat', ctypes.c_ubyte, 94, 2, 0), ('gob_height', ctypes.c_ubyte, 94, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 94, 3, 5), ('reserved3', ctypes.c_char, 95), ('width', ctypes.c_int32, 96), ('height', ctypes.c_int32, 100), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 104), ('luma_top_offset', ctypes.c_uint32, 112), ('luma_bot_offset', ctypes.c_uint32, 116), ('luma_frame_offset', ctypes.c_uint32, 120), ('chroma_top_offset', ctypes.c_uint32, 124), ('chroma_bot_offset', ctypes.c_uint32, 128), ('chroma_frame_offset', ctypes.c_uint32, 132), ('HistBufferSize', ctypes.c_uint32, 136), ('trd', c.Array[ctypes.c_int32, Literal[2]], 140), ('trb', c.Array[ctypes.c_int32, Literal[2]], 148), ('divx_flags', ctypes.c_int32, 156), ('vop_fcode_forward', ctypes.c_int16, 160), ('vop_fcode_backward', ctypes.c_int16, 162), ('interlaced', ctypes.c_ubyte, 164), ('quant_type', ctypes.c_ubyte, 165), ('quarter_sample', ctypes.c_ubyte, 166), ('short_video_header', ctypes.c_ubyte, 167), ('curr_output_memory_layout', ctypes.c_ubyte, 168), ('ptype', ctypes.c_ubyte, 169), ('rnd', ctypes.c_ubyte, 170), ('alternate_vertical_scan_flag', ctypes.c_ubyte, 171), ('top_field_flag', ctypes.c_ubyte, 172), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 173), ('intra_quant_mat', c.Array[ctypes.c_ubyte, Literal[64]], 176), ('nonintra_quant_mat', c.Array[ctypes.c_ubyte, Literal[64]], 240), ('ref_memory_layout', c.Array[ctypes.c_ubyte, Literal[2]], 304), ('reserved1', c.Array[ctypes.c_ubyte, Literal[34]], 306), ('displayPara', nvdec_display_param_s, 340)]) +nvdec_mpeg4_pic_s: TypeAlias = struct__nvdec_mpeg4_pic_s +enum_VP8_FRAME_TYPE: dict[int, str] = {(VP8_KEYFRAME:=0): 'VP8_KEYFRAME', (VP8_INTERFRAME:=1): 'VP8_INTERFRAME'} +enum_VP8_FRAME_SFC_ID: dict[int, str] = {(VP8_GOLDEN_FRAME_SFC:=0): 'VP8_GOLDEN_FRAME_SFC', (VP8_ALTREF_FRAME_SFC:=1): 'VP8_ALTREF_FRAME_SFC', (VP8_LAST_FRAME_SFC:=2): 'VP8_LAST_FRAME_SFC', (VP8_CURR_FRAME_SFC:=3): 'VP8_CURR_FRAME_SFC'} +@c.record +class struct__nvdec_vp8_pic_s(c.Struct): + SIZE = 192 + encryption_params: struct__nvdec_pass2_otf_s + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + keyFrame: int + version: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + errorConcealOn: int + firstPartSize: int + HistBufferSize: int + VLDBufferSize: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + displayPara: struct__nvdec_display_param_s + current_output_memory_layout: bytes + output_memory_layout: c.Array[ctypes.c_char, Literal[3]] + segmentation_feature_data_update: int + reserved1: c.Array[ctypes.c_ubyte, Literal[3]] + resultValue: int + partition_offset: c.Array[ctypes.c_uint32, Literal[8]] + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vp8_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('gptimer_timeout_value', ctypes.c_uint32, 52), ('FrameWidth', ctypes.c_uint16, 56), ('FrameHeight', ctypes.c_uint16, 58), ('keyFrame', ctypes.c_ubyte, 60), ('version', ctypes.c_ubyte, 61), ('tileFormat', ctypes.c_ubyte, 62, 2, 0), ('gob_height', ctypes.c_ubyte, 62, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 62, 3, 5), ('errorConcealOn', ctypes.c_ubyte, 63), ('firstPartSize', ctypes.c_uint32, 64), ('HistBufferSize', ctypes.c_uint32, 68), ('VLDBufferSize', ctypes.c_uint32, 72), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 76), ('luma_top_offset', ctypes.c_uint32, 84), ('luma_bot_offset', ctypes.c_uint32, 88), ('luma_frame_offset', ctypes.c_uint32, 92), ('chroma_top_offset', ctypes.c_uint32, 96), ('chroma_bot_offset', ctypes.c_uint32, 100), ('chroma_frame_offset', ctypes.c_uint32, 104), ('displayPara', nvdec_display_param_s, 108), ('current_output_memory_layout', ctypes.c_char, 136), ('output_memory_layout', c.Array[ctypes.c_char, Literal[3]], 137), ('segmentation_feature_data_update', ctypes.c_ubyte, 140), ('reserved1', c.Array[ctypes.c_ubyte, Literal[3]], 141), ('resultValue', ctypes.c_uint32, 144), ('partition_offset', c.Array[ctypes.c_uint32, Literal[8]], 148), ('ssm', nvdec_pass2_otf_ext_s, 180)]) +nvdec_vp8_pic_s: TypeAlias = struct__nvdec_vp8_pic_s +@c.record +class struct__bytes_of_data_s(c.Struct): + SIZE = 8 + clear_bytes: int + encypted_bytes: int +struct__bytes_of_data_s.register_fields([('clear_bytes', ctypes.c_uint32, 0), ('encypted_bytes', ctypes.c_uint32, 4)]) +bytes_of_data_s: TypeAlias = struct__bytes_of_data_s +@c.record +class struct__nvdec_pass1_input_data_s(c.Struct): + SIZE = 836 + sample_size: c.Array[struct__bytes_of_data_s, Literal[32]] + initialization_vector: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[32]] + IvValid: c.Array[ctypes.c_ubyte, Literal[32]] + stream_len: int + clearBufferSize: int + reencryptBufferSize: int + vp8coeffPartitonBufferSize: int + PrevWidth: int + num_nals: int + drm_mode: int + key_sel: int + codec: int + TotalSizeOfClearData: int + SliceHdrOffset: int + EncryptBlkCnt: int + SkipBlkCnt: int +struct__nvdec_pass1_input_data_s.register_fields([('sample_size', c.Array[bytes_of_data_s, Literal[32]], 0), ('initialization_vector', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[32]], 256), ('IvValid', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('stream_len', ctypes.c_uint32, 800), ('clearBufferSize', ctypes.c_uint32, 804), ('reencryptBufferSize', ctypes.c_uint32, 808), ('vp8coeffPartitonBufferSize', ctypes.c_uint32, 812), ('PrevWidth', ctypes.c_uint32, 816), ('num_nals', ctypes.c_uint32, 820, 16, 0), ('drm_mode', ctypes.c_uint32, 822, 8, 0), ('key_sel', ctypes.c_uint32, 823, 4, 0), ('codec', ctypes.c_uint32, 823, 4, 4), ('TotalSizeOfClearData', ctypes.c_uint32, 824), ('SliceHdrOffset', ctypes.c_uint32, 828), ('EncryptBlkCnt', ctypes.c_uint32, 832, 16, 0), ('SkipBlkCnt', ctypes.c_uint32, 834, 16, 0)]) +nvdec_pass1_input_data_s: TypeAlias = struct__nvdec_pass1_input_data_s +@c.record +class struct__nvdec_pass1_output_data_s(c.Struct): + SIZE = 128 + clear_header_size: int + reencrypt_data_size: int + clear_token_data_size: int + key_increment: int + encryption_mode: int + bReEncrypted: int + bvp9SuperFrame: int + vp9NumFramesMinus1: int + reserved1: int + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + partition_size: c.Array[ctypes.c_uint32, Literal[8]] + vp9_frame_sizes: c.Array[ctypes.c_uint32, Literal[8]] + vp9_clear_hdr_size: c.Array[ctypes.c_uint32, Literal[8]] +struct__nvdec_pass1_output_data_s.register_fields([('clear_header_size', ctypes.c_uint32, 0), ('reencrypt_data_size', ctypes.c_uint32, 4), ('clear_token_data_size', ctypes.c_uint32, 8), ('key_increment', ctypes.c_uint32, 12, 6, 0), ('encryption_mode', ctypes.c_uint32, 12, 4, 6), ('bReEncrypted', ctypes.c_uint32, 13, 1, 2), ('bvp9SuperFrame', ctypes.c_uint32, 13, 1, 3), ('vp9NumFramesMinus1', ctypes.c_uint32, 13, 3, 4), ('reserved1', ctypes.c_uint32, 13, 17, 7), ('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 32), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 48), ('partition_size', c.Array[ctypes.c_uint32, Literal[8]], 64), ('vp9_frame_sizes', c.Array[ctypes.c_uint32, Literal[8]], 64), ('vp9_clear_hdr_size', c.Array[ctypes.c_uint32, Literal[8]], 96)]) +nvdec_pass1_output_data_s: TypeAlias = struct__nvdec_pass1_output_data_s +@c.record +class struct__scale_factors_reference_s(c.Struct): + SIZE = 4 + x_scale_fp: int + y_scale_fp: int +struct__scale_factors_reference_s.register_fields([('x_scale_fp', ctypes.c_int16, 0), ('y_scale_fp', ctypes.c_int16, 2)]) +scale_factors_reference_s: TypeAlias = struct__scale_factors_reference_s +@c.record +class struct__frame_info_t(c.Struct): + SIZE = 12 + width: int + height: int + stride: c.Array[ctypes.c_uint16, Literal[2]] + frame_buffer_idx: int +struct__frame_info_t.register_fields([('width', ctypes.c_uint16, 0), ('height', ctypes.c_uint16, 2), ('stride', c.Array[ctypes.c_uint16, Literal[2]], 4), ('frame_buffer_idx', ctypes.c_uint32, 8)]) +frame_info_t: TypeAlias = struct__frame_info_t +@c.record +class struct__ref_frame_struct_s(c.Struct): + SIZE = 24 + info: struct__frame_info_t + sf: struct__scale_factors_reference_s + sign_bias: int + wmtype: int + reserved_rf: int + frame_off: int + roffset: int +struct__ref_frame_struct_s.register_fields([('info', frame_info_t, 0), ('sf', scale_factors_reference_s, 12), ('sign_bias', ctypes.c_ubyte, 16, 1, 0), ('wmtype', ctypes.c_ubyte, 16, 2, 1), ('reserved_rf', ctypes.c_ubyte, 16, 5, 3), ('frame_off', ctypes.c_int16, 18), ('roffset', ctypes.c_int16, 20)]) +ref_frame_struct_s: TypeAlias = struct__ref_frame_struct_s +@c.record +class struct__av1_fgs_cfg_t(c.Struct): + SIZE = 12 + apply_grain: int + overlap_flag: int + clip_to_restricted_range: int + chroma_scaling_from_luma: int + num_y_points_b: int + num_cb_points_b: int + num_cr_points_b: int + scaling_shift: int + reserved_fgs: int + sw_random_seed: int + cb_offset: int + cr_offset: int + cb_mult: bytes + cb_luma_mult: bytes + cr_mult: bytes + cr_luma_mult: bytes +struct__av1_fgs_cfg_t.register_fields([('apply_grain', ctypes.c_uint16, 0, 1, 0), ('overlap_flag', ctypes.c_uint16, 0, 1, 1), ('clip_to_restricted_range', ctypes.c_uint16, 0, 1, 2), ('chroma_scaling_from_luma', ctypes.c_uint16, 0, 1, 3), ('num_y_points_b', ctypes.c_uint16, 0, 1, 4), ('num_cb_points_b', ctypes.c_uint16, 0, 1, 5), ('num_cr_points_b', ctypes.c_uint16, 0, 1, 6), ('scaling_shift', ctypes.c_uint16, 0, 4, 7), ('reserved_fgs', ctypes.c_uint16, 1, 5, 3), ('sw_random_seed', ctypes.c_uint16, 2), ('cb_offset', ctypes.c_int16, 4), ('cr_offset', ctypes.c_int16, 6), ('cb_mult', ctypes.c_char, 8), ('cb_luma_mult', ctypes.c_char, 9), ('cr_mult', ctypes.c_char, 10), ('cr_luma_mult', ctypes.c_char, 11)]) +av1_fgs_cfg_t: TypeAlias = struct__av1_fgs_cfg_t +@c.record +class struct__nvdec_av1_pic_s(c.Struct): + SIZE = 572 + encryption_params: struct__nvdec_pass2_otf_s + ssm: struct__nvdec_pass2_otf_ext_s + fgs_cfg: struct__av1_fgs_cfg_t + gptimer_timeout_value: int + stream_len: int + reserved12: int + use_128x128_superblock: int + chroma_format: int + bit_depth: int + enable_filter_intra: int + enable_intra_edge_filter: int + enable_interintra_compound: int + enable_masked_compound: int + enable_dual_filter: int + reserved10: int + reserved0: int + enable_jnt_comp: int + reserved1: int + enable_cdef: int + reserved11: int + enable_fgs: int + enable_substream_decoding: int + reserved2: int + frame_type: int + show_frame: int + reserved13: int + disable_cdf_update: int + allow_screen_content_tools: int + cur_frame_force_integer_mv: int + scale_denom_minus9: int + allow_intrabc: int + allow_high_precision_mv: int + interp_filter: int + switchable_motion_mode: int + use_ref_frame_mvs: int + refresh_frame_context: int + delta_q_present_flag: int + delta_q_res: int + delta_lf_present_flag: int + delta_lf_res: int + delta_lf_multi: int + reserved3: int + coded_lossless: int + tile_enabled: int + reserved4: int + superres_is_scaled: int + reserved_fh: int + tile_cols: int + tile_rows: int + context_update_tile_id: int + cdef_damping_minus_3: int + cdef_bits: int + frame_tx_mode: int + frame_reference_mode: int + skip_mode_flag: int + skip_ref0: int + skip_ref1: int + allow_warp: int + reduced_tx_set_used: int + ref_scaling_enable: int + reserved5: int + reserved6: int + superres_upscaled_width: int + superres_luma_step: int + superres_chroma_step: int + superres_init_luma_subpel_x: int + superres_init_chroma_subpel_x: int + base_qindex: int + y_dc_delta_q: bytes + u_dc_delta_q: bytes + v_dc_delta_q: bytes + u_ac_delta_q: bytes + v_ac_delta_q: bytes + qm_y: int + qm_u: int + qm_v: int + cdef_y_pri_strength: int + cdef_uv_pri_strength: int + cdef_y_sec_strength: int + cdef_uv_sec_strength: int + segment_enabled: int + segment_update_map: int + reserved7: int + segment_temporal_update: int + segment_feature_data: c.Array[c.Array[ctypes.c_int16, Literal[8]], Literal[8]] + last_active_segid: int + segid_preskip: int + prevsegid_flag: int + segment_quant_sign: int + filter_level: c.Array[ctypes.c_ubyte, Literal[2]] + filter_level_u: int + filter_level_v: int + lf_sharpness_level: int + lf_ref_deltas: c.Array[ctypes.c_char, Literal[8]] + lf_mode_deltas: c.Array[ctypes.c_char, Literal[2]] + lr_type: int + lr_unit_size: int + current_frame: struct__frame_info_t + ref_frame: c.Array[struct__ref_frame_struct_s, Literal[7]] + use_temporal0_mvs: int + use_temporal1_mvs: int + use_temporal2_mvs: int + mf1_type: int + mf2_type: int + mf3_type: int + reserved_mfmv: int + mfmv_offset: c.Array[c.Array[ctypes.c_int16, Literal[7]], Literal[3]] + mfmv_side: c.Array[c.Array[ctypes.c_char, Literal[7]], Literal[3]] + tileformat: int + gob_height: int + errorConcealOn: int + reserver8: int + stream_error_detection: int + mv_error_detection: int + coeff_error_detection: int + reserved_eh: int + Av1FltTopOffset: int + Av1FltVertOffset: int + Av1CdefVertOffset: int + Av1LrVertOffset: int + Av1HusVertOffset: int + Av1FgsVertOffset: int + enable_histogram: int + sw_skip_start_length: int + reserved_stat: int +struct__nvdec_av1_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('ssm', nvdec_pass2_otf_ext_s, 52), ('fgs_cfg', av1_fgs_cfg_t, 64), ('gptimer_timeout_value', ctypes.c_uint32, 76), ('stream_len', ctypes.c_uint32, 80), ('reserved12', ctypes.c_uint32, 84), ('use_128x128_superblock', ctypes.c_uint32, 88, 1, 0), ('chroma_format', ctypes.c_uint32, 88, 2, 1), ('bit_depth', ctypes.c_uint32, 88, 4, 3), ('enable_filter_intra', ctypes.c_uint32, 88, 1, 7), ('enable_intra_edge_filter', ctypes.c_uint32, 89, 1, 0), ('enable_interintra_compound', ctypes.c_uint32, 89, 1, 1), ('enable_masked_compound', ctypes.c_uint32, 89, 1, 2), ('enable_dual_filter', ctypes.c_uint32, 89, 1, 3), ('reserved10', ctypes.c_uint32, 89, 1, 4), ('reserved0', ctypes.c_uint32, 89, 3, 5), ('enable_jnt_comp', ctypes.c_uint32, 90, 1, 0), ('reserved1', ctypes.c_uint32, 90, 1, 1), ('enable_cdef', ctypes.c_uint32, 90, 1, 2), ('reserved11', ctypes.c_uint32, 90, 1, 3), ('enable_fgs', ctypes.c_uint32, 90, 1, 4), ('enable_substream_decoding', ctypes.c_uint32, 90, 1, 5), ('reserved2', ctypes.c_uint32, 90, 10, 6), ('frame_type', ctypes.c_uint32, 92, 2, 0), ('show_frame', ctypes.c_uint32, 92, 1, 2), ('reserved13', ctypes.c_uint32, 92, 1, 3), ('disable_cdf_update', ctypes.c_uint32, 92, 1, 4), ('allow_screen_content_tools', ctypes.c_uint32, 92, 1, 5), ('cur_frame_force_integer_mv', ctypes.c_uint32, 92, 1, 6), ('scale_denom_minus9', ctypes.c_uint32, 92, 3, 7), ('allow_intrabc', ctypes.c_uint32, 93, 1, 2), ('allow_high_precision_mv', ctypes.c_uint32, 93, 1, 3), ('interp_filter', ctypes.c_uint32, 93, 3, 4), ('switchable_motion_mode', ctypes.c_uint32, 93, 1, 7), ('use_ref_frame_mvs', ctypes.c_uint32, 94, 1, 0), ('refresh_frame_context', ctypes.c_uint32, 94, 1, 1), ('delta_q_present_flag', ctypes.c_uint32, 94, 1, 2), ('delta_q_res', ctypes.c_uint32, 94, 2, 3), ('delta_lf_present_flag', ctypes.c_uint32, 94, 1, 5), ('delta_lf_res', ctypes.c_uint32, 94, 2, 6), ('delta_lf_multi', ctypes.c_uint32, 95, 1, 0), ('reserved3', ctypes.c_uint32, 95, 1, 1), ('coded_lossless', ctypes.c_uint32, 95, 1, 2), ('tile_enabled', ctypes.c_uint32, 95, 1, 3), ('reserved4', ctypes.c_uint32, 95, 2, 4), ('superres_is_scaled', ctypes.c_uint32, 95, 1, 6), ('reserved_fh', ctypes.c_uint32, 95, 1, 7), ('tile_cols', ctypes.c_uint32, 96, 8, 0), ('tile_rows', ctypes.c_uint32, 97, 8, 0), ('context_update_tile_id', ctypes.c_uint32, 98, 16, 0), ('cdef_damping_minus_3', ctypes.c_uint32, 100, 2, 0), ('cdef_bits', ctypes.c_uint32, 100, 2, 2), ('frame_tx_mode', ctypes.c_uint32, 100, 3, 4), ('frame_reference_mode', ctypes.c_uint32, 100, 2, 7), ('skip_mode_flag', ctypes.c_uint32, 101, 1, 1), ('skip_ref0', ctypes.c_uint32, 101, 4, 2), ('skip_ref1', ctypes.c_uint32, 101, 4, 6), ('allow_warp', ctypes.c_uint32, 102, 1, 2), ('reduced_tx_set_used', ctypes.c_uint32, 102, 1, 3), ('ref_scaling_enable', ctypes.c_uint32, 102, 1, 4), ('reserved5', ctypes.c_uint32, 102, 1, 5), ('reserved6', ctypes.c_uint32, 102, 10, 6), ('superres_upscaled_width', ctypes.c_uint16, 104), ('superres_luma_step', ctypes.c_uint16, 106), ('superres_chroma_step', ctypes.c_uint16, 108), ('superres_init_luma_subpel_x', ctypes.c_uint16, 110), ('superres_init_chroma_subpel_x', ctypes.c_uint16, 112), ('base_qindex', ctypes.c_ubyte, 114), ('y_dc_delta_q', ctypes.c_char, 115), ('u_dc_delta_q', ctypes.c_char, 116), ('v_dc_delta_q', ctypes.c_char, 117), ('u_ac_delta_q', ctypes.c_char, 118), ('v_ac_delta_q', ctypes.c_char, 119), ('qm_y', ctypes.c_ubyte, 120), ('qm_u', ctypes.c_ubyte, 121), ('qm_v', ctypes.c_ubyte, 122), ('cdef_y_pri_strength', ctypes.c_uint32, 124), ('cdef_uv_pri_strength', ctypes.c_uint32, 128), ('cdef_y_sec_strength', ctypes.c_uint32, 132, 16, 0), ('cdef_uv_sec_strength', ctypes.c_uint32, 134, 16, 0), ('segment_enabled', ctypes.c_ubyte, 136), ('segment_update_map', ctypes.c_ubyte, 137), ('reserved7', ctypes.c_ubyte, 138), ('segment_temporal_update', ctypes.c_ubyte, 139), ('segment_feature_data', c.Array[c.Array[ctypes.c_int16, Literal[8]], Literal[8]], 140), ('last_active_segid', ctypes.c_ubyte, 268), ('segid_preskip', ctypes.c_ubyte, 269), ('prevsegid_flag', ctypes.c_ubyte, 270), ('segment_quant_sign', ctypes.c_ubyte, 271, 8, 0), ('filter_level', c.Array[ctypes.c_ubyte, Literal[2]], 272), ('filter_level_u', ctypes.c_ubyte, 274), ('filter_level_v', ctypes.c_ubyte, 275), ('lf_sharpness_level', ctypes.c_ubyte, 276), ('lf_ref_deltas', c.Array[ctypes.c_char, Literal[8]], 277), ('lf_mode_deltas', c.Array[ctypes.c_char, Literal[2]], 285), ('lr_type', ctypes.c_ubyte, 287), ('lr_unit_size', ctypes.c_ubyte, 288), ('current_frame', frame_info_t, 292), ('ref_frame', c.Array[ref_frame_struct_s, Literal[7]], 304), ('use_temporal0_mvs', ctypes.c_uint32, 472, 1, 0), ('use_temporal1_mvs', ctypes.c_uint32, 472, 1, 1), ('use_temporal2_mvs', ctypes.c_uint32, 472, 1, 2), ('mf1_type', ctypes.c_uint32, 472, 3, 3), ('mf2_type', ctypes.c_uint32, 472, 3, 6), ('mf3_type', ctypes.c_uint32, 473, 3, 1), ('reserved_mfmv', ctypes.c_uint32, 473, 20, 4), ('mfmv_offset', c.Array[c.Array[ctypes.c_int16, Literal[7]], Literal[3]], 476), ('mfmv_side', c.Array[c.Array[ctypes.c_char, Literal[7]], Literal[3]], 518), ('tileformat', ctypes.c_ubyte, 539, 2, 0), ('gob_height', ctypes.c_ubyte, 539, 3, 2), ('errorConcealOn', ctypes.c_ubyte, 539, 1, 5), ('reserver8', ctypes.c_ubyte, 539, 2, 6), ('stream_error_detection', ctypes.c_ubyte, 540, 1, 0), ('mv_error_detection', ctypes.c_ubyte, 540, 1, 1), ('coeff_error_detection', ctypes.c_ubyte, 540, 1, 2), ('reserved_eh', ctypes.c_ubyte, 540, 5, 3), ('Av1FltTopOffset', ctypes.c_uint32, 544), ('Av1FltVertOffset', ctypes.c_uint32, 548), ('Av1CdefVertOffset', ctypes.c_uint32, 552), ('Av1LrVertOffset', ctypes.c_uint32, 556), ('Av1HusVertOffset', ctypes.c_uint32, 560), ('Av1FgsVertOffset', ctypes.c_uint32, 564), ('enable_histogram', ctypes.c_uint32, 568, 1, 0), ('sw_skip_start_length', ctypes.c_uint32, 568, 14, 1), ('reserved_stat', ctypes.c_uint32, 569, 17, 7)]) +nvdec_av1_pic_s: TypeAlias = struct__nvdec_av1_pic_s +@c.record +class struct__AV1FilmGrainMemory(c.Struct): + SIZE = 13056 + scaling_lut_y: c.Array[ctypes.c_ubyte, Literal[256]] + scaling_lut_cb: c.Array[ctypes.c_ubyte, Literal[256]] + scaling_lut_cr: c.Array[ctypes.c_ubyte, Literal[256]] + cropped_luma_grain_block: c.Array[ctypes.c_int16, Literal[4096]] + cropped_cb_grain_block: c.Array[ctypes.c_int16, Literal[1024]] + cropped_cr_grain_block: c.Array[ctypes.c_int16, Literal[1024]] +struct__AV1FilmGrainMemory.register_fields([('scaling_lut_y', c.Array[ctypes.c_ubyte, Literal[256]], 0), ('scaling_lut_cb', c.Array[ctypes.c_ubyte, Literal[256]], 256), ('scaling_lut_cr', c.Array[ctypes.c_ubyte, Literal[256]], 512), ('cropped_luma_grain_block', c.Array[ctypes.c_int16, Literal[4096]], 768), ('cropped_cb_grain_block', c.Array[ctypes.c_int16, Literal[1024]], 8960), ('cropped_cr_grain_block', c.Array[ctypes.c_int16, Literal[1024]], 11008)]) +AV1FilmGrainMemory: TypeAlias = struct__AV1FilmGrainMemory +@c.record +class struct__AV1TileInfo_OLD(c.Struct): + SIZE = 16 + width_in_sb: int + height_in_sb: int + tile_start_b0: int + tile_start_b1: int + tile_start_b2: int + tile_start_b3: int + tile_end_b0: int + tile_end_b1: int + tile_end_b2: int + tile_end_b3: int + padding: c.Array[ctypes.c_ubyte, Literal[6]] +struct__AV1TileInfo_OLD.register_fields([('width_in_sb', ctypes.c_ubyte, 0), ('height_in_sb', ctypes.c_ubyte, 1), ('tile_start_b0', ctypes.c_ubyte, 2), ('tile_start_b1', ctypes.c_ubyte, 3), ('tile_start_b2', ctypes.c_ubyte, 4), ('tile_start_b3', ctypes.c_ubyte, 5), ('tile_end_b0', ctypes.c_ubyte, 6), ('tile_end_b1', ctypes.c_ubyte, 7), ('tile_end_b2', ctypes.c_ubyte, 8), ('tile_end_b3', ctypes.c_ubyte, 9), ('padding', c.Array[ctypes.c_ubyte, Literal[6]], 10)]) +AV1TileInfo_OLD: TypeAlias = struct__AV1TileInfo_OLD +@c.record +class struct__AV1TileInfo(c.Struct): + SIZE = 4 + width_in_sb: int + padding_w: int + height_in_sb: int + padding_h: int +struct__AV1TileInfo.register_fields([('width_in_sb', ctypes.c_ubyte, 0), ('padding_w', ctypes.c_ubyte, 1), ('height_in_sb', ctypes.c_ubyte, 2), ('padding_h', ctypes.c_ubyte, 3)]) +AV1TileInfo: TypeAlias = struct__AV1TileInfo +@c.record +class struct__AV1TileStreamInfo(c.Struct): + SIZE = 16 + tile_start: int + tile_end: int + padding: c.Array[ctypes.c_ubyte, Literal[8]] +struct__AV1TileStreamInfo.register_fields([('tile_start', ctypes.c_uint32, 0), ('tile_end', ctypes.c_uint32, 4), ('padding', c.Array[ctypes.c_ubyte, Literal[8]], 8)]) +AV1TileStreamInfo: TypeAlias = struct__AV1TileStreamInfo +@c.record +class struct__nvdec_new_h264_pic_s(c.Struct): + SIZE = 764 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + hint_dump_en: int + reserved0: c.Array[ctypes.c_ubyte, Literal[2]] + stream_len: int + slice_count: int + mbhist_buffer_size: int + gptimer_timeout_value: int + log2_max_pic_order_cnt_lsb_minus4: int + delta_pic_order_always_zero_flag: int + frame_mbs_only_flag: int + PicWidthInMbs: int + FrameHeightInMbs: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + entropy_coding_mode_flag: int + pic_order_present_flag: int + num_ref_idx_l0_active_minus1: int + num_ref_idx_l1_active_minus1: int + deblocking_filter_control_present_flag: int + redundant_pic_cnt_present_flag: int + transform_8x8_mode_flag: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + MbaffFrameFlag: int + direct_8x8_inference_flag: int + weighted_pred_flag: int + constrained_intra_pred_flag: int + ref_pic_flag: int + field_pic_flag: int + bottom_field_flag: int + second_field: int + log2_max_frame_num_minus4: int + chroma_format_idc: int + pic_order_cnt_type: int + pic_init_qp_minus26: int + chroma_qp_index_offset: int + second_chroma_qp_index_offset: int + weighted_bipred_idc: int + CurrPicIdx: int + CurrColIdx: int + frame_num: int + frame_surfaces: int + output_memory_layout: int + CurrFieldOrderCnt: c.Array[ctypes.c_int32, Literal[2]] + dpb: c.Array[struct__nvdec_dpb_entry_s, Literal[16]] + WeightScale: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]] + WeightScale8x8: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]] + num_inter_view_refs_lX: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_char, Literal[14]] + inter_view_refidx_lX: c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]] + lossless_ipred8x8_filter_enable: int + qpprime_y_zero_transform_bypass_flag: int + reserved2: int + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_new_h264_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('hint_dump_en', ctypes.c_ubyte, 69), ('reserved0', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('mbhist_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_int32, 88), ('delta_pic_order_always_zero_flag', ctypes.c_int32, 92), ('frame_mbs_only_flag', ctypes.c_int32, 96), ('PicWidthInMbs', ctypes.c_int32, 100), ('FrameHeightInMbs', ctypes.c_int32, 104), ('tileFormat', ctypes.c_uint32, 108, 2, 0), ('gob_height', ctypes.c_uint32, 108, 3, 2), ('reserverd_surface_format', ctypes.c_uint32, 108, 27, 5), ('entropy_coding_mode_flag', ctypes.c_int32, 112), ('pic_order_present_flag', ctypes.c_int32, 116), ('num_ref_idx_l0_active_minus1', ctypes.c_int32, 120), ('num_ref_idx_l1_active_minus1', ctypes.c_int32, 124), ('deblocking_filter_control_present_flag', ctypes.c_int32, 128), ('redundant_pic_cnt_present_flag', ctypes.c_int32, 132), ('transform_8x8_mode_flag', ctypes.c_int32, 136), ('pitch_luma', ctypes.c_uint32, 140), ('pitch_chroma', ctypes.c_uint32, 144), ('luma_top_offset', ctypes.c_uint32, 148), ('luma_bot_offset', ctypes.c_uint32, 152), ('luma_frame_offset', ctypes.c_uint32, 156), ('chroma_top_offset', ctypes.c_uint32, 160), ('chroma_bot_offset', ctypes.c_uint32, 164), ('chroma_frame_offset', ctypes.c_uint32, 168), ('HistBufferSize', ctypes.c_uint32, 172), ('MbaffFrameFlag', ctypes.c_uint32, 176, 1, 0), ('direct_8x8_inference_flag', ctypes.c_uint32, 176, 1, 1), ('weighted_pred_flag', ctypes.c_uint32, 176, 1, 2), ('constrained_intra_pred_flag', ctypes.c_uint32, 176, 1, 3), ('ref_pic_flag', ctypes.c_uint32, 176, 1, 4), ('field_pic_flag', ctypes.c_uint32, 176, 1, 5), ('bottom_field_flag', ctypes.c_uint32, 176, 1, 6), ('second_field', ctypes.c_uint32, 176, 1, 7), ('log2_max_frame_num_minus4', ctypes.c_uint32, 177, 4, 0), ('chroma_format_idc', ctypes.c_uint32, 177, 2, 4), ('pic_order_cnt_type', ctypes.c_uint32, 177, 2, 6), ('pic_init_qp_minus26', ctypes.c_int32, 178, 6, 0), ('chroma_qp_index_offset', ctypes.c_int32, 178, 5, 6), ('second_chroma_qp_index_offset', ctypes.c_int32, 179, 5, 3), ('weighted_bipred_idc', ctypes.c_uint32, 180, 2, 0), ('CurrPicIdx', ctypes.c_uint32, 180, 7, 2), ('CurrColIdx', ctypes.c_uint32, 181, 5, 1), ('frame_num', ctypes.c_uint32, 181, 16, 6), ('frame_surfaces', ctypes.c_uint32, 183, 1, 6), ('output_memory_layout', ctypes.c_uint32, 183, 1, 7), ('CurrFieldOrderCnt', c.Array[ctypes.c_int32, Literal[2]], 184), ('dpb', c.Array[nvdec_dpb_entry_s, Literal[16]], 192), ('WeightScale', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]], 448), ('WeightScale8x8', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]], 544), ('num_inter_view_refs_lX', c.Array[ctypes.c_ubyte, Literal[2]], 672), ('reserved1', c.Array[ctypes.c_char, Literal[14]], 674), ('inter_view_refidx_lX', c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]], 688), ('lossless_ipred8x8_filter_enable', ctypes.c_uint32, 720, 1, 0), ('qpprime_y_zero_transform_bypass_flag', ctypes.c_uint32, 720, 1, 1), ('reserved2', ctypes.c_uint32, 720, 30, 2), ('displayPara', nvdec_display_param_s, 724), ('ssm', nvdec_pass2_otf_ext_s, 752)]) +nvdec_new_h264_pic_s: TypeAlias = struct__nvdec_new_h264_pic_s +@c.record +class nvdec_crc_s(c.Struct): + SIZE = 128 + dbg_crc_enable_partb: int + dbg_crc_enable_partc: int + dbg_crc_enable_partd: int + dbg_crc_enable_parte: int + dbg_crc_intf_partb: int + dbg_crc_intf_partc: int + dbg_crc_intf_partd: int + dbg_crc_intf_parte: int + reserved0: int + dbg_crc_partb_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_partc_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_partd_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_parte_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_comp_partb: int + dbg_crc_comp_partc: int + dbg_crc_comp_partd: int + dbg_crc_comp_parte: int + reserved1: int + reserved2: c.Array[ctypes.c_ubyte, Literal[56]] +nvdec_crc_s.register_fields([('dbg_crc_enable_partb', ctypes.c_uint32, 0, 1, 0), ('dbg_crc_enable_partc', ctypes.c_uint32, 0, 1, 1), ('dbg_crc_enable_partd', ctypes.c_uint32, 0, 1, 2), ('dbg_crc_enable_parte', ctypes.c_uint32, 0, 1, 3), ('dbg_crc_intf_partb', ctypes.c_uint32, 0, 6, 4), ('dbg_crc_intf_partc', ctypes.c_uint32, 1, 6, 2), ('dbg_crc_intf_partd', ctypes.c_uint32, 2, 6, 0), ('dbg_crc_intf_parte', ctypes.c_uint32, 2, 6, 6), ('reserved0', ctypes.c_uint32, 3, 4, 4), ('dbg_crc_partb_golden', c.Array[ctypes.c_uint32, Literal[4]], 4), ('dbg_crc_partc_golden', c.Array[ctypes.c_uint32, Literal[4]], 20), ('dbg_crc_partd_golden', c.Array[ctypes.c_uint32, Literal[4]], 36), ('dbg_crc_parte_golden', c.Array[ctypes.c_uint32, Literal[4]], 52), ('dbg_crc_comp_partb', ctypes.c_uint32, 68, 4, 0), ('dbg_crc_comp_partc', ctypes.c_uint32, 68, 4, 4), ('dbg_crc_comp_partd', ctypes.c_uint32, 69, 4, 0), ('dbg_crc_comp_parte', ctypes.c_uint32, 69, 4, 4), ('reserved1', ctypes.c_uint32, 70, 16, 0), ('reserved2', c.Array[ctypes.c_ubyte, Literal[56]], 72)]) +@c.record +class struct_NV0000_ALLOC_PARAMETERS(c.Struct): + SIZE = 120 + hClient: int + processID: int + processName: c.Array[ctypes.c_char, Literal[100]] + pOsPidInfo: ctypes.c_void_p +NvHandle: TypeAlias = ctypes.c_uint32 +NvU32: TypeAlias = ctypes.c_uint32 +NvP64: TypeAlias = ctypes.c_void_p +struct_NV0000_ALLOC_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('processID', NvU32, 4), ('processName', c.Array[ctypes.c_char, Literal[100]], 8), ('pOsPidInfo', NvP64, 112)]) +NV0000_ALLOC_PARAMETERS: TypeAlias = struct_NV0000_ALLOC_PARAMETERS +@c.record +class struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS(c.Struct): + SIZE = 24 + offset: int + limit: int + hVASpace: int +NvU64: TypeAlias = ctypes.c_uint64 +struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS.register_fields([('offset', NvU64, 0), ('limit', NvU64, 8), ('hVASpace', NvHandle, 16)]) +NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS: TypeAlias = struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS +@c.record +class struct_NV0080_ALLOC_PARAMETERS(c.Struct): + SIZE = 56 + deviceId: int + hClientShare: int + hTargetClient: int + hTargetDevice: int + flags: int + vaSpaceSize: int + vaStartInternal: int + vaLimitInternal: int + vaMode: int +NvV32: TypeAlias = ctypes.c_uint32 +struct_NV0080_ALLOC_PARAMETERS.register_fields([('deviceId', NvU32, 0), ('hClientShare', NvHandle, 4), ('hTargetClient', NvHandle, 8), ('hTargetDevice', NvHandle, 12), ('flags', NvV32, 16), ('vaSpaceSize', NvU64, 24), ('vaStartInternal', NvU64, 32), ('vaLimitInternal', NvU64, 40), ('vaMode', NvV32, 48)]) +NV0080_ALLOC_PARAMETERS: TypeAlias = struct_NV0080_ALLOC_PARAMETERS +@c.record +class struct_NV2080_ALLOC_PARAMETERS(c.Struct): + SIZE = 4 + subDeviceId: int +struct_NV2080_ALLOC_PARAMETERS.register_fields([('subDeviceId', NvU32, 0)]) +NV2080_ALLOC_PARAMETERS: TypeAlias = struct_NV2080_ALLOC_PARAMETERS +@c.record +class struct__cl2080_tag0(c.Struct): + SIZE = 7936 + Reserved00: c.Array[ctypes.c_uint32, Literal[1984]] +struct__cl2080_tag0.register_fields([('Reserved00', c.Array[NvV32, Literal[1984]], 0)]) +@c.record +class volatile_struct__cl2080_tag0(c.Struct): + SIZE = 7936 + Reserved00: c.Array[ctypes.c_uint32, Literal[1984]] +Nv2080Typedef: TypeAlias = volatile_struct__cl2080_tag0 +volatile_struct__cl2080_tag0.register_fields([('Reserved00', c.Array[NvV32, Literal[1984]], 0)]) +Nv20Subdevice0: TypeAlias = volatile_struct__cl2080_tag0 +@c.record +class struct_Nv2080HdcpStatusChangeNotificationRec(c.Struct): + SIZE = 8 + displayId: int + hdcpStatusChangeNotif: int +struct_Nv2080HdcpStatusChangeNotificationRec.register_fields([('displayId', NvU32, 0), ('hdcpStatusChangeNotif', NvU32, 4)]) +Nv2080HdcpStatusChangeNotification: TypeAlias = struct_Nv2080HdcpStatusChangeNotificationRec +@c.record +class struct_Nv2080PStateChangeNotificationRec(c.Struct): + SIZE = 12 + timeStamp: struct_Nv2080PStateChangeNotificationRec_timeStamp + NewPstate: int +@c.record +class struct_Nv2080PStateChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080PStateChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +struct_Nv2080PStateChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080PStateChangeNotificationRec_timeStamp, 0), ('NewPstate', NvU32, 8)]) +Nv2080PStateChangeNotification: TypeAlias = struct_Nv2080PStateChangeNotificationRec +@c.record +class struct_Nv2080ClocksChangeNotificationRec(c.Struct): + SIZE = 8 + timeStamp: struct_Nv2080ClocksChangeNotificationRec_timeStamp +@c.record +class struct_Nv2080ClocksChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080ClocksChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +struct_Nv2080ClocksChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080ClocksChangeNotificationRec_timeStamp, 0)]) +Nv2080ClocksChangeNotification: TypeAlias = struct_Nv2080ClocksChangeNotificationRec +@c.record +class struct_Nv2080WorkloadModulationChangeNotificationRec(c.Struct): + SIZE = 12 + timeStamp: struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp + WorkloadModulationEnabled: int +@c.record +class struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +NvBool: TypeAlias = ctypes.c_ubyte +struct_Nv2080WorkloadModulationChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp, 0), ('WorkloadModulationEnabled', NvBool, 8)]) +Nv2080WorkloadModulationChangeNotification: TypeAlias = struct_Nv2080WorkloadModulationChangeNotificationRec +@c.record +class Nv2080HotplugNotification(c.Struct): + SIZE = 8 + plugDisplayMask: int + unplugDisplayMask: int +Nv2080HotplugNotification.register_fields([('plugDisplayMask', NvU32, 0), ('unplugDisplayMask', NvU32, 4)]) +@c.record +class Nv2080PowerEventNotification(c.Struct): + SIZE = 8 + bSwitchToAC: int + bGPUCapabilityChanged: int + displayMaskAffected: int +Nv2080PowerEventNotification.register_fields([('bSwitchToAC', NvBool, 0), ('bGPUCapabilityChanged', NvBool, 1), ('displayMaskAffected', NvU32, 4)]) +@c.record +class struct_Nv2080DpIrqNotificationRec(c.Struct): + SIZE = 4 + displayId: int +struct_Nv2080DpIrqNotificationRec.register_fields([('displayId', NvU32, 0)]) +Nv2080DpIrqNotification: TypeAlias = struct_Nv2080DpIrqNotificationRec +@c.record +class struct_Nv2080DstateXusbPpcNotificationRec(c.Struct): + SIZE = 8 + dstateXusb: int + dstatePpc: int +struct_Nv2080DstateXusbPpcNotificationRec.register_fields([('dstateXusb', NvU32, 0), ('dstatePpc', NvU32, 4)]) +Nv2080DstateXusbPpcNotification: TypeAlias = struct_Nv2080DstateXusbPpcNotificationRec +@c.record +class struct_Nv2080XusbPpcConnectStateNotificationRec(c.Struct): + SIZE = 1 + bConnected: int +struct_Nv2080XusbPpcConnectStateNotificationRec.register_fields([('bConnected', NvBool, 0)]) +Nv2080XusbPpcConnectStateNotification: TypeAlias = struct_Nv2080XusbPpcConnectStateNotificationRec +@c.record +class struct_Nv2080ACPIEvent(c.Struct): + SIZE = 4 + event: int +struct_Nv2080ACPIEvent.register_fields([('event', NvU32, 0)]) +Nv2080ACPIEvent: TypeAlias = struct_Nv2080ACPIEvent +@c.record +class struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC(c.Struct): + SIZE = 4 + currentZone: int +struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC.register_fields([('currentZone', NvU32, 0)]) +NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC: TypeAlias = struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC +@c.record +class struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC(c.Struct): + SIZE = 4 + currentZone: int +struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC.register_fields([('currentZone', NvU32, 0)]) +NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC: TypeAlias = struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC +@c.record +class struct_Nv2080AudioHdcpRequestRec(c.Struct): + SIZE = 8 + displayId: int + requestedState: int +struct_Nv2080AudioHdcpRequestRec.register_fields([('displayId', NvU32, 0), ('requestedState', NvU32, 4)]) +Nv2080AudioHdcpRequest: TypeAlias = struct_Nv2080AudioHdcpRequestRec +@c.record +class struct_Nv2080GC5GpuReadyParams(c.Struct): + SIZE = 12 + event: int + sciIntr0: int + sciIntr1: int +struct_Nv2080GC5GpuReadyParams.register_fields([('event', NvU32, 0), ('sciIntr0', NvU32, 4), ('sciIntr1', NvU32, 8)]) +Nv2080GC5GpuReadyParams: TypeAlias = struct_Nv2080GC5GpuReadyParams +@c.record +class Nv2080PrivRegAccessFaultNotification(c.Struct): + SIZE = 4 + errAddr: int +Nv2080PrivRegAccessFaultNotification.register_fields([('errAddr', NvU32, 0)]) +@c.record +class struct_Nv2080DstateHdaCodecNotificationRec(c.Struct): + SIZE = 4 + dstateHdaCodec: int +struct_Nv2080DstateHdaCodecNotificationRec.register_fields([('dstateHdaCodec', NvU32, 0)]) +Nv2080DstateHdaCodecNotification: TypeAlias = struct_Nv2080DstateHdaCodecNotificationRec +@c.record +class struct_Nv2080HdmiFrlRequestNotificationRec(c.Struct): + SIZE = 4 + displayId: int +struct_Nv2080HdmiFrlRequestNotificationRec.register_fields([('displayId', NvU32, 0)]) +Nv2080HdmiFrlRequestNotification: TypeAlias = struct_Nv2080HdmiFrlRequestNotificationRec +@c.record +class struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS(c.Struct): + SIZE = 3 + platformPowerModeIndex: int + platformPowerModeMask: int + eventReason: int +NvU8: TypeAlias = ctypes.c_ubyte +struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS.register_fields([('platformPowerModeIndex', NvU8, 0), ('platformPowerModeMask', NvU8, 1), ('eventReason', NvU8, 2)]) +NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS: TypeAlias = struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS +@c.record +class struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE(c.Struct): + SIZE = 1 + workloadType: int +struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE.register_fields([('workloadType', NvU8, 0)]) +NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE: TypeAlias = struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE +@c.record +class Nv2080QosIntrNotification(c.Struct): + SIZE = 4 + engineType: int +Nv2080QosIntrNotification.register_fields([('engineType', NvU32, 0)]) +@c.record +class Nv2080EccDbeNotification(c.Struct): + SIZE = 8 + physAddress: int +Nv2080EccDbeNotification.register_fields([('physAddress', NvU64, 0)]) +@c.record +class Nv2080LpwrDifrPrefetchNotification(c.Struct): + SIZE = 4 + l2CacheSize: int +Nv2080LpwrDifrPrefetchNotification.register_fields([('l2CacheSize', NvU32, 0)]) +@c.record +class Nv2080NvlinkLnkChangeNotification(c.Struct): + SIZE = 8 + GpuId: int + linkId: int +Nv2080NvlinkLnkChangeNotification.register_fields([('GpuId', NvU32, 0), ('linkId', NvU32, 4)]) +@c.record +class Nv2080VrrSetTimeoutNotification(c.Struct): + SIZE = 4 + head: int +Nv2080VrrSetTimeoutNotification.register_fields([('head', NvU32, 0)]) +@c.record +class struct_Nvc56fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc56fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc56fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +Nvc56fControl: TypeAlias = volatile_struct_Nvc56fControl_struct +volatile_struct_Nvc56fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +AmpereAControlGPFifo: TypeAlias = volatile_struct_Nvc56fControl_struct +@c.record +class struct_Nvc86fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc86fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc86fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +Nvc86fControl: TypeAlias = volatile_struct_Nvc86fControl_struct +volatile_struct_Nvc86fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +HopperAControlGPFifo: TypeAlias = volatile_struct_Nvc86fControl_struct +@c.record +class struct_Nvc96fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[35]] + GPPut: int + Ignored01: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc96fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[35]], 0), ('GPPut', NvU32, 140), ('Ignored01', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc96fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[35]] + GPPut: int + Ignored01: c.Array[ctypes.c_uint32, Literal[92]] +Nvc96fControl: TypeAlias = volatile_struct_Nvc96fControl_struct +volatile_struct_Nvc96fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[35]], 0), ('GPPut', NvU32, 140), ('Ignored01', c.Array[NvU32, Literal[92]], 144)]) +BlackwellAControlGPFifo: TypeAlias = volatile_struct_Nvc96fControl_struct +@c.record +class struct_NV83DE_ALLOC_PARAMETERS(c.Struct): + SIZE = 12 + hDebuggerClient_Obsolete: int + hAppClient: int + hClass3dObject: int +struct_NV83DE_ALLOC_PARAMETERS.register_fields([('hDebuggerClient_Obsolete', NvHandle, 0), ('hAppClient', NvHandle, 4), ('hClass3dObject', NvHandle, 8)]) +NV83DE_ALLOC_PARAMETERS: TypeAlias = struct_NV83DE_ALLOC_PARAMETERS +@c.record +class struct_NVB2CC_ALLOC_PARAMETERS(c.Struct): + SIZE = 8 + hClientTarget: int + hContextTarget: int +struct_NVB2CC_ALLOC_PARAMETERS.register_fields([('hClientTarget', NvHandle, 0), ('hContextTarget', NvHandle, 4)]) +NVB2CC_ALLOC_PARAMETERS: TypeAlias = struct_NVB2CC_ALLOC_PARAMETERS +@c.record +class UVM_RESERVE_VA_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +NV_STATUS: TypeAlias = ctypes.c_uint32 +UVM_RESERVE_VA_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_RELEASE_VA_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_RELEASE_VA_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGION_COMMIT_PARAMS(c.Struct): + SIZE = 48 + requestedBase: int + length: int + streamId: int + gpuUuid: struct_nv_uuid + rmStatus: int +UvmStream: TypeAlias = ctypes.c_uint64 +@c.record +class struct_nv_uuid(c.Struct): + SIZE = 16 + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +NvProcessorUuid: TypeAlias = struct_nv_uuid +struct_nv_uuid.register_fields([('uuid', c.Array[NvU8, Literal[16]], 0)]) +UVM_REGION_COMMIT_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('streamId', UvmStream, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_REGION_DECOMMIT_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_REGION_DECOMMIT_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGION_SET_STREAM_PARAMS(c.Struct): + SIZE = 48 + requestedBase: int + length: int + newStreamId: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_REGION_SET_STREAM_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('newStreamId', UvmStream, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_SET_STREAM_RUNNING_PARAMS(c.Struct): + SIZE = 16 + streamId: int + rmStatus: int +UVM_SET_STREAM_RUNNING_PARAMS.register_fields([('streamId', UvmStream, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_SET_STREAM_STOPPED_PARAMS(c.Struct): + SIZE = 272 + streamIdArray: c.Array[ctypes.c_uint64, Literal[32]] + nStreams: int + rmStatus: int +UVM_SET_STREAM_STOPPED_PARAMS.register_fields([('streamIdArray', c.Array[UvmStream, Literal[32]], 0), ('nStreams', NvU64, 256), ('rmStatus', NV_STATUS, 264)]) +@c.record +class UVM_RUN_TEST_PARAMS(c.Struct): + SIZE = 44 + gpuUuid: struct_nv_uuid + test: int + multiGpu: UVM_RUN_TEST_PARAMS_multiGpu + rmStatus: int +@c.record +class UVM_RUN_TEST_PARAMS_multiGpu(c.Struct): + SIZE = 20 + peerGpuUuid: struct_nv_uuid + peerId: int +UVM_RUN_TEST_PARAMS_multiGpu.register_fields([('peerGpuUuid', NvProcessorUuid, 0), ('peerId', NvU32, 16)]) +UVM_RUN_TEST_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('test', NvU32, 16), ('multiGpu', UVM_RUN_TEST_PARAMS_multiGpu, 20), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_ADD_SESSION_PARAMS(c.Struct): + SIZE = 24 + pidTarget: int + countersBaseAddress: ctypes.c_void_p + sessionIndex: int + rmStatus: int +NvS32: TypeAlias = ctypes.c_int32 +UVM_ADD_SESSION_PARAMS.register_fields([('pidTarget', NvU32, 0), ('countersBaseAddress', NvP64, 8), ('sessionIndex', NvS32, 16), ('rmStatus', NV_STATUS, 20)]) +@c.record +class UVM_REMOVE_SESSION_PARAMS(c.Struct): + SIZE = 8 + sessionIndex: int + rmStatus: int +UVM_REMOVE_SESSION_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_ENABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 908 + sessionIndex: int + config: c.Array[UvmCounterConfig, Literal[32]] + count: int + rmStatus: int +@c.record +class UvmCounterConfig(c.Struct): + SIZE = 28 + scope: int + name: int + gpuid: struct_nv_uuid + state: int +UvmCounterConfig.register_fields([('scope', NvU32, 0), ('name', NvU32, 4), ('gpuid', NvProcessorUuid, 8), ('state', NvU32, 24)]) +UVM_ENABLE_COUNTERS_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('config', c.Array[UvmCounterConfig, Literal[32]], 4), ('count', NvU32, 900), ('rmStatus', NV_STATUS, 904)]) +@c.record +class UVM_MAP_COUNTER_PARAMS(c.Struct): + SIZE = 48 + sessionIndex: int + scope: int + counterName: int + gpuUuid: struct_nv_uuid + addr: ctypes.c_void_p + rmStatus: int +UVM_MAP_COUNTER_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('scope', NvU32, 4), ('counterName', NvU32, 8), ('gpuUuid', NvProcessorUuid, 12), ('addr', NvP64, 32), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_CREATE_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 32 + sessionIndex: int + eventQueueIndex: int + queueSize: int + notificationCount: int + timeStampType: int + rmStatus: int +UVM_CREATE_EVENT_QUEUE_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('eventQueueIndex', NvU32, 4), ('queueSize', NvU64, 8), ('notificationCount', NvU64, 16), ('timeStampType', NvU32, 24), ('rmStatus', NV_STATUS, 28)]) +@c.record +class UVM_REMOVE_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 12 + sessionIndex: int + eventQueueIndex: int + rmStatus: int +UVM_REMOVE_EVENT_QUEUE_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('eventQueueIndex', NvU32, 4), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_MAP_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 56 + sessionIndex: int + eventQueueIndex: int + userRODataAddr: ctypes.c_void_p + userRWDataAddr: ctypes.c_void_p + readIndexAddr: ctypes.c_void_p + writeIndexAddr: ctypes.c_void_p + queueBufferAddr: ctypes.c_void_p + rmStatus: int +UVM_MAP_EVENT_QUEUE_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('eventQueueIndex', NvU32, 4), ('userRODataAddr', NvP64, 8), ('userRWDataAddr', NvP64, 16), ('readIndexAddr', NvP64, 24), ('writeIndexAddr', NvP64, 32), ('queueBufferAddr', NvP64, 40), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_EVENT_CTRL_PARAMS(c.Struct): + SIZE = 20 + sessionIndex: int + eventQueueIndex: int + eventType: int + enable: int + rmStatus: int +UVM_EVENT_CTRL_PARAMS.register_fields([('sessionIndex', NvS32, 0), ('eventQueueIndex', NvU32, 4), ('eventType', NvS32, 8), ('enable', NvU32, 12), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGISTER_MPS_SERVER_PARAMS(c.Struct): + SIZE = 536 + gpuUuidArray: c.Array[struct_nv_uuid, Literal[32]] + numGpus: int + serverId: int + rmStatus: int +UVM_REGISTER_MPS_SERVER_PARAMS.register_fields([('gpuUuidArray', c.Array[NvProcessorUuid, Literal[32]], 0), ('numGpus', NvU32, 512), ('serverId', NvU64, 520), ('rmStatus', NV_STATUS, 528)]) +@c.record +class UVM_REGISTER_MPS_CLIENT_PARAMS(c.Struct): + SIZE = 16 + serverId: int + rmStatus: int +UVM_REGISTER_MPS_CLIENT_PARAMS.register_fields([('serverId', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_GET_GPU_UUID_TABLE_PARAMS(c.Struct): + SIZE = 520 + gpuUuidArray: c.Array[struct_nv_uuid, Literal[32]] + validCount: int + rmStatus: int +UVM_GET_GPU_UUID_TABLE_PARAMS.register_fields([('gpuUuidArray', c.Array[NvProcessorUuid, Literal[32]], 0), ('validCount', NvU32, 512), ('rmStatus', NV_STATUS, 516)]) +@c.record +class UVM_CREATE_RANGE_GROUP_PARAMS(c.Struct): + SIZE = 16 + rangeGroupId: int + rmStatus: int +UVM_CREATE_RANGE_GROUP_PARAMS.register_fields([('rangeGroupId', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_DESTROY_RANGE_GROUP_PARAMS(c.Struct): + SIZE = 16 + rangeGroupId: int + rmStatus: int +UVM_DESTROY_RANGE_GROUP_PARAMS.register_fields([('rangeGroupId', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_REGISTER_GPU_VASPACE_PARAMS(c.Struct): + SIZE = 32 + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hVaSpace: int + rmStatus: int +UVM_REGISTER_GPU_VASPACE_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmCtrlFd', NvS32, 16), ('hClient', NvHandle, 20), ('hVaSpace', NvHandle, 24), ('rmStatus', NV_STATUS, 28)]) +@c.record +class UVM_UNREGISTER_GPU_VASPACE_PARAMS(c.Struct): + SIZE = 20 + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_UNREGISTER_GPU_VASPACE_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGISTER_CHANNEL_PARAMS(c.Struct): + SIZE = 56 + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hChannel: int + base: int + length: int + rmStatus: int +UVM_REGISTER_CHANNEL_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmCtrlFd', NvS32, 16), ('hClient', NvHandle, 20), ('hChannel', NvHandle, 24), ('base', NvU64, 32), ('length', NvU64, 40), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_UNREGISTER_CHANNEL_PARAMS(c.Struct): + SIZE = 28 + gpuUuid: struct_nv_uuid + hClient: int + hChannel: int + rmStatus: int +UVM_UNREGISTER_CHANNEL_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('hClient', NvHandle, 16), ('hChannel', NvHandle, 20), ('rmStatus', NV_STATUS, 24)]) +@c.record +class UVM_ENABLE_PEER_ACCESS_PARAMS(c.Struct): + SIZE = 36 + gpuUuidA: struct_nv_uuid + gpuUuidB: struct_nv_uuid + rmStatus: int +UVM_ENABLE_PEER_ACCESS_PARAMS.register_fields([('gpuUuidA', NvProcessorUuid, 0), ('gpuUuidB', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_DISABLE_PEER_ACCESS_PARAMS(c.Struct): + SIZE = 36 + gpuUuidA: struct_nv_uuid + gpuUuidB: struct_nv_uuid + rmStatus: int +UVM_DISABLE_PEER_ACCESS_PARAMS.register_fields([('gpuUuidA', NvProcessorUuid, 0), ('gpuUuidB', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_SET_RANGE_GROUP_PARAMS(c.Struct): + SIZE = 32 + rangeGroupId: int + requestedBase: int + length: int + rmStatus: int +UVM_SET_RANGE_GROUP_PARAMS.register_fields([('rangeGroupId', NvU64, 0), ('requestedBase', NvU64, 8), ('length', NvU64, 16), ('rmStatus', NV_STATUS, 24)]) +@c.record +class UVM_MAP_EXTERNAL_ALLOCATION_PARAMS(c.Struct): + SIZE = 9264 + base: int + length: int + offset: int + perGpuAttributes: c.Array[UvmGpuMappingAttributes, Literal[256]] + gpuAttributesCount: int + rmCtrlFd: int + hClient: int + hMemory: int + rmStatus: int +@c.record +class UvmGpuMappingAttributes(c.Struct): + SIZE = 36 + gpuUuid: struct_nv_uuid + gpuMappingType: int + gpuCachingType: int + gpuFormatType: int + gpuElementBits: int + gpuCompressionType: int +UvmGpuMappingAttributes.register_fields([('gpuUuid', NvProcessorUuid, 0), ('gpuMappingType', NvU32, 16), ('gpuCachingType', NvU32, 20), ('gpuFormatType', NvU32, 24), ('gpuElementBits', NvU32, 28), ('gpuCompressionType', NvU32, 32)]) +UVM_MAP_EXTERNAL_ALLOCATION_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('offset', NvU64, 16), ('perGpuAttributes', c.Array[UvmGpuMappingAttributes, Literal[256]], 24), ('gpuAttributesCount', NvU64, 9240), ('rmCtrlFd', NvS32, 9248), ('hClient', NvU32, 9252), ('hMemory', NvU32, 9256), ('rmStatus', NV_STATUS, 9260)]) +@c.record +class UVM_FREE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + rmStatus: int +UVM_FREE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_MEM_MAP_PARAMS(c.Struct): + SIZE = 24 + regionBase: ctypes.c_void_p + regionLength: int + rmStatus: int +UVM_MEM_MAP_PARAMS.register_fields([('regionBase', NvP64, 0), ('regionLength', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGISTER_GPU_PARAMS(c.Struct): + SIZE = 40 + gpu_uuid: struct_nv_uuid + numaEnabled: int + numaNodeId: int + rmCtrlFd: int + hClient: int + hSmcPartRef: int + rmStatus: int +UVM_REGISTER_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('numaEnabled', NvBool, 16), ('numaNodeId', NvS32, 20), ('rmCtrlFd', NvS32, 24), ('hClient', NvHandle, 28), ('hSmcPartRef', NvHandle, 32), ('rmStatus', NV_STATUS, 36)]) +@c.record +class UVM_UNREGISTER_GPU_PARAMS(c.Struct): + SIZE = 20 + gpu_uuid: struct_nv_uuid + rmStatus: int +UVM_UNREGISTER_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_PAGEABLE_MEM_ACCESS_PARAMS(c.Struct): + SIZE = 8 + pageableMemAccess: int + rmStatus: int +UVM_PAGEABLE_MEM_ACCESS_PARAMS.register_fields([('pageableMemAccess', NvBool, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_PREVENT_MIGRATION_RANGE_GROUPS_PARAMS(c.Struct): + SIZE = 272 + rangeGroupIds: c.Array[ctypes.c_uint64, Literal[32]] + numGroupIds: int + rmStatus: int +UVM_PREVENT_MIGRATION_RANGE_GROUPS_PARAMS.register_fields([('rangeGroupIds', c.Array[NvU64, Literal[32]], 0), ('numGroupIds', NvU64, 256), ('rmStatus', NV_STATUS, 264)]) +@c.record +class UVM_ALLOW_MIGRATION_RANGE_GROUPS_PARAMS(c.Struct): + SIZE = 272 + rangeGroupIds: c.Array[ctypes.c_uint64, Literal[32]] + numGroupIds: int + rmStatus: int +UVM_ALLOW_MIGRATION_RANGE_GROUPS_PARAMS.register_fields([('rangeGroupIds', c.Array[NvU64, Literal[32]], 0), ('numGroupIds', NvU64, 256), ('rmStatus', NV_STATUS, 264)]) +@c.record +class UVM_SET_PREFERRED_LOCATION_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + preferredLocation: struct_nv_uuid + preferredCpuNumaNode: int + rmStatus: int +UVM_SET_PREFERRED_LOCATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('preferredLocation', NvProcessorUuid, 16), ('preferredCpuNumaNode', NvS32, 32), ('rmStatus', NV_STATUS, 36)]) +@c.record +class UVM_UNSET_PREFERRED_LOCATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_UNSET_PREFERRED_LOCATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_ENABLE_READ_DUPLICATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_ENABLE_READ_DUPLICATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_DISABLE_READ_DUPLICATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_DISABLE_READ_DUPLICATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_SET_ACCESSED_BY_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + accessedByUuid: struct_nv_uuid + rmStatus: int +UVM_SET_ACCESSED_BY_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('accessedByUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_UNSET_ACCESSED_BY_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + accessedByUuid: struct_nv_uuid + rmStatus: int +UVM_UNSET_ACCESSED_BY_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('accessedByUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_MIGRATE_PARAMS(c.Struct): + SIZE = 80 + base: int + length: int + destinationUuid: struct_nv_uuid + flags: int + semaphoreAddress: int + semaphorePayload: int + cpuNumaNode: int + userSpaceStart: int + userSpaceLength: int + rmStatus: int +UVM_MIGRATE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('destinationUuid', NvProcessorUuid, 16), ('flags', NvU32, 32), ('semaphoreAddress', NvU64, 40), ('semaphorePayload', NvU32, 48), ('cpuNumaNode', NvS32, 52), ('userSpaceStart', NvU64, 56), ('userSpaceLength', NvU64, 64), ('rmStatus', NV_STATUS, 72)]) +@c.record +class UVM_MIGRATE_RANGE_GROUP_PARAMS(c.Struct): + SIZE = 32 + rangeGroupId: int + destinationUuid: struct_nv_uuid + rmStatus: int +UVM_MIGRATE_RANGE_GROUP_PARAMS.register_fields([('rangeGroupId', NvU64, 0), ('destinationUuid', NvProcessorUuid, 8), ('rmStatus', NV_STATUS, 24)]) +@c.record +class UVM_ENABLE_SYSTEM_WIDE_ATOMICS_PARAMS(c.Struct): + SIZE = 20 + gpu_uuid: struct_nv_uuid + rmStatus: int +UVM_ENABLE_SYSTEM_WIDE_ATOMICS_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_DISABLE_SYSTEM_WIDE_ATOMICS_PARAMS(c.Struct): + SIZE = 20 + gpu_uuid: struct_nv_uuid + rmStatus: int +UVM_DISABLE_SYSTEM_WIDE_ATOMICS_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS(c.Struct): + SIZE = 56 + queueBuffer: int + queueBufferSize: int + controlBuffer: int + processor: struct_nv_uuid + allProcessors: int + uvmFd: int + rmStatus: int +UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS.register_fields([('queueBuffer', NvU64, 0), ('queueBufferSize', NvU64, 8), ('controlBuffer', NvU64, 16), ('processor', NvProcessorUuid, 24), ('allProcessors', NvU32, 40), ('uvmFd', NvU32, 44), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_TOOLS_SET_NOTIFICATION_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + notificationThreshold: int + rmStatus: int +UVM_TOOLS_SET_NOTIFICATION_THRESHOLD_PARAMS.register_fields([('notificationThreshold', NvU32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS_PARAMS(c.Struct): + SIZE = 16 + eventTypeFlags: int + rmStatus: int +UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS_PARAMS.register_fields([('eventTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS_PARAMS(c.Struct): + SIZE = 16 + eventTypeFlags: int + rmStatus: int +UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS_PARAMS.register_fields([('eventTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_ENABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterTypeFlags: int + rmStatus: int +UVM_TOOLS_ENABLE_COUNTERS_PARAMS.register_fields([('counterTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_DISABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterTypeFlags: int + rmStatus: int +UVM_TOOLS_DISABLE_COUNTERS_PARAMS.register_fields([('counterTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_READ_PROCESS_MEMORY_PARAMS(c.Struct): + SIZE = 40 + buffer: int + size: int + targetVa: int + bytesRead: int + rmStatus: int +UVM_TOOLS_READ_PROCESS_MEMORY_PARAMS.register_fields([('buffer', NvU64, 0), ('size', NvU64, 8), ('targetVa', NvU64, 16), ('bytesRead', NvU64, 24), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_WRITE_PROCESS_MEMORY_PARAMS(c.Struct): + SIZE = 40 + buffer: int + size: int + targetVa: int + bytesWritten: int + rmStatus: int +UVM_TOOLS_WRITE_PROCESS_MEMORY_PARAMS.register_fields([('buffer', NvU64, 0), ('size', NvU64, 8), ('targetVa', NvU64, 16), ('bytesWritten', NvU64, 24), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS(c.Struct): + SIZE = 16 + tablePtr: int + rmStatus: int +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS.register_fields([('tablePtr', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_MAP_DYNAMIC_PARALLELISM_REGION_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_MAP_DYNAMIC_PARALLELISM_REGION_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_UNMAP_EXTERNAL_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_UNMAP_EXTERNAL_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_FLUSH_EVENTS_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_TOOLS_FLUSH_EVENTS_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_ALLOC_SEMAPHORE_POOL_PARAMS(c.Struct): + SIZE = 9248 + base: int + length: int + perGpuAttributes: c.Array[UvmGpuMappingAttributes, Literal[256]] + gpuAttributesCount: int + rmStatus: int +UVM_ALLOC_SEMAPHORE_POOL_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('perGpuAttributes', c.Array[UvmGpuMappingAttributes, Literal[256]], 16), ('gpuAttributesCount', NvU64, 9232), ('rmStatus', NV_STATUS, 9240)]) +@c.record +class UVM_CLEAN_UP_ZOMBIE_RESOURCES_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_CLEAN_UP_ZOMBIE_RESOURCES_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_PAGEABLE_MEM_ACCESS_ON_GPU_PARAMS(c.Struct): + SIZE = 24 + gpu_uuid: struct_nv_uuid + pageableMemAccess: int + rmStatus: int +UVM_PAGEABLE_MEM_ACCESS_ON_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('pageableMemAccess', NvBool, 16), ('rmStatus', NV_STATUS, 20)]) +@c.record +class UVM_POPULATE_PAGEABLE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + flags: int + rmStatus: int +UVM_POPULATE_PAGEABLE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('flags', NvU32, 16), ('rmStatus', NV_STATUS, 20)]) +@c.record +class UVM_VALIDATE_VA_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + rmStatus: int +UVM_VALIDATE_VA_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_CREATE_EXTERNAL_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + rmStatus: int +UVM_CREATE_EXTERNAL_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_MAP_EXTERNAL_SPARSE_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_MAP_EXTERNAL_SPARSE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_MM_INITIALIZE_PARAMS(c.Struct): + SIZE = 8 + uvmFd: int + rmStatus: int +UVM_MM_INITIALIZE_PARAMS.register_fields([('uvmFd', NvS32, 0), ('rmStatus', NV_STATUS, 4)]) +UVM_TOOLS_INIT_EVENT_TRACKER_V2_PARAMS: TypeAlias = UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_V2_PARAMS: TypeAlias = UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS +@c.record +class UVM_ALLOC_DEVICE_P2P_PARAMS(c.Struct): + SIZE = 56 + base: int + length: int + offset: int + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hMemory: int + rmStatus: int +UVM_ALLOC_DEVICE_P2P_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('offset', NvU64, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmCtrlFd', NvS32, 40), ('hClient', NvU32, 44), ('hMemory', NvU32, 48), ('rmStatus', NV_STATUS, 52)]) +@c.record +class UVM_CLEAR_ALL_ACCESS_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_CLEAR_ALL_ACCESS_COUNTERS_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_DISCARD_PARAMS(c.Struct): + SIZE = 32 + base: int + length: int + flags: int + rmStatus: int +UVM_DISCARD_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('flags', NvU64, 16), ('rmStatus', NV_STATUS, 24)]) +@c.record +class UVM_IS_8_SUPPORTED_PARAMS(c.Struct): + SIZE = 8 + is8Supported: int + rmStatus: int +UVM_IS_8_SUPPORTED_PARAMS.register_fields([('is8Supported', NvU32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_INITIALIZE_PARAMS(c.Struct): + SIZE = 16 + flags: int + rmStatus: int +UVM_INITIALIZE_PARAMS.register_fields([('flags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class nv_pci_info_t(c.Struct): + SIZE = 12 + domain: int + bus: int + slot: int + function: int + vendor_id: int + device_id: int +NvU16: TypeAlias = ctypes.c_uint16 +nv_pci_info_t.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('function', NvU8, 6), ('vendor_id', NvU16, 8), ('device_id', NvU16, 10)]) +@c.record +class struct_nv_ioctl_xfer(c.Struct): + SIZE = 16 + cmd: int + size: int + ptr: ctypes.c_void_p +struct_nv_ioctl_xfer.register_fields([('cmd', NvU32, 0), ('size', NvU32, 4), ('ptr', NvP64, 8)]) +nv_ioctl_xfer_t: TypeAlias = struct_nv_ioctl_xfer +@c.record +class struct_nv_ioctl_card_info(c.Struct): + SIZE = 72 + valid: int + pci_info: nv_pci_info_t + gpu_id: int + interrupt_line: int + reg_address: int + reg_size: int + fb_address: int + fb_size: int + minor_number: int + dev_name: c.Array[ctypes.c_ubyte, Literal[10]] +struct_nv_ioctl_card_info.register_fields([('valid', NvBool, 0), ('pci_info', nv_pci_info_t, 4), ('gpu_id', NvU32, 16), ('interrupt_line', NvU16, 20), ('reg_address', NvU64, 24), ('reg_size', NvU64, 32), ('fb_address', NvU64, 40), ('fb_size', NvU64, 48), ('minor_number', NvU32, 56), ('dev_name', c.Array[NvU8, Literal[10]], 60)]) +nv_ioctl_card_info_t: TypeAlias = struct_nv_ioctl_card_info +@c.record +class struct_nv_ioctl_alloc_os_event(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + fd: int + Status: int +struct_nv_ioctl_alloc_os_event.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('fd', NvU32, 8), ('Status', NvU32, 12)]) +nv_ioctl_alloc_os_event_t: TypeAlias = struct_nv_ioctl_alloc_os_event +@c.record +class struct_nv_ioctl_free_os_event(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + fd: int + Status: int +struct_nv_ioctl_free_os_event.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('fd', NvU32, 8), ('Status', NvU32, 12)]) +nv_ioctl_free_os_event_t: TypeAlias = struct_nv_ioctl_free_os_event +@c.record +class struct_nv_ioctl_status_code(c.Struct): + SIZE = 12 + domain: int + bus: int + slot: int + status: int +struct_nv_ioctl_status_code.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('status', NvU32, 8)]) +nv_ioctl_status_code_t: TypeAlias = struct_nv_ioctl_status_code +@c.record +class struct_nv_ioctl_rm_api_version(c.Struct): + SIZE = 72 + cmd: int + reply: int + versionString: c.Array[ctypes.c_char, Literal[64]] +struct_nv_ioctl_rm_api_version.register_fields([('cmd', NvU32, 0), ('reply', NvU32, 4), ('versionString', c.Array[ctypes.c_char, Literal[64]], 8)]) +nv_ioctl_rm_api_version_t: TypeAlias = struct_nv_ioctl_rm_api_version +@c.record +class struct_nv_ioctl_query_device_intr(c.Struct): + SIZE = 8 + intrStatus: int + status: int +struct_nv_ioctl_query_device_intr.register_fields([('intrStatus', NvU32, 0), ('status', NvU32, 4)]) +nv_ioctl_query_device_intr: TypeAlias = struct_nv_ioctl_query_device_intr +@c.record +class struct_nv_ioctl_sys_params(c.Struct): + SIZE = 8 + memblock_size: int +struct_nv_ioctl_sys_params.register_fields([('memblock_size', NvU64, 0)]) +nv_ioctl_sys_params_t: TypeAlias = struct_nv_ioctl_sys_params +@c.record +class struct_nv_ioctl_register_fd(c.Struct): + SIZE = 4 + ctl_fd: int +struct_nv_ioctl_register_fd.register_fields([('ctl_fd', ctypes.c_int32, 0)]) +nv_ioctl_register_fd_t: TypeAlias = struct_nv_ioctl_register_fd +@c.record +class struct_nv_ioctl_export_to_dma_buf_fd(c.Struct): + SIZE = 2608 + fd: int + hClient: int + totalObjects: int + numObjects: int + index: int + totalSize: int + mappingType: int + bAllowMmap: int + handles: c.Array[ctypes.c_uint32, Literal[128]] + offsets: c.Array[ctypes.c_uint64, Literal[128]] + sizes: c.Array[ctypes.c_uint64, Literal[128]] + status: int +struct_nv_ioctl_export_to_dma_buf_fd.register_fields([('fd', ctypes.c_int32, 0), ('hClient', NvHandle, 4), ('totalObjects', NvU32, 8), ('numObjects', NvU32, 12), ('index', NvU32, 16), ('totalSize', NvU64, 24), ('mappingType', NvU8, 32), ('bAllowMmap', NvBool, 33), ('handles', c.Array[NvHandle, Literal[128]], 36), ('offsets', c.Array[NvU64, Literal[128]], 552), ('sizes', c.Array[NvU64, Literal[128]], 1576), ('status', NvU32, 2600)]) +nv_ioctl_export_to_dma_buf_fd_t: TypeAlias = struct_nv_ioctl_export_to_dma_buf_fd +@c.record +class struct_nv_ioctl_wait_open_complete(c.Struct): + SIZE = 8 + rc: int + adapterStatus: int +struct_nv_ioctl_wait_open_complete.register_fields([('rc', ctypes.c_int32, 0), ('adapterStatus', NvU32, 4)]) +nv_ioctl_wait_open_complete_t: TypeAlias = struct_nv_ioctl_wait_open_complete +@c.record +class struct_offline_addresses(c.Struct): + SIZE = 520 + addresses: c.Array[ctypes.c_uint64, Literal[64]] + numEntries: int +uint64_t: TypeAlias = ctypes.c_uint64 +uint32_t: TypeAlias = ctypes.c_uint32 +struct_offline_addresses.register_fields([('addresses', c.Array[uint64_t, Literal[64]], 0), ('numEntries', uint32_t, 512)]) +nv_offline_addresses_t: TypeAlias = struct_offline_addresses +@c.record +class struct_nv_ioctl_numa_info(c.Struct): + SIZE = 560 + nid: int + status: int + memblock_size: int + numa_mem_addr: int + numa_mem_size: int + use_auto_online: int + offline_addresses: struct_offline_addresses +int32_t: TypeAlias = ctypes.c_int32 +uint8_t: TypeAlias = ctypes.c_ubyte +struct_nv_ioctl_numa_info.register_fields([('nid', int32_t, 0), ('status', int32_t, 4), ('memblock_size', uint64_t, 8), ('numa_mem_addr', uint64_t, 16), ('numa_mem_size', uint64_t, 24), ('use_auto_online', uint8_t, 32), ('offline_addresses', nv_offline_addresses_t, 40)]) +nv_ioctl_numa_info_t: TypeAlias = struct_nv_ioctl_numa_info +@c.record +class struct_nv_ioctl_set_numa_status(c.Struct): + SIZE = 4 + status: int +struct_nv_ioctl_set_numa_status.register_fields([('status', int32_t, 0)]) +nv_ioctl_set_numa_status_t: TypeAlias = struct_nv_ioctl_set_numa_status +@c.record +class nv_ioctl_nvos02_parameters_with_fd(c.Struct): + SIZE = 56 + params: NVOS02_PARAMETERS + fd: int +@c.record +class NVOS02_PARAMETERS(c.Struct): + SIZE = 48 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + flags: int + pMemory: ctypes.c_void_p + limit: int + status: int +NVOS02_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('flags', NvV32, 16), ('pMemory', NvP64, 24), ('limit', NvU64, 32), ('status', NvV32, 40)]) +nv_ioctl_nvos02_parameters_with_fd.register_fields([('params', NVOS02_PARAMETERS, 0), ('fd', ctypes.c_int32, 48)]) +@c.record +class nv_ioctl_nvos33_parameters_with_fd(c.Struct): + SIZE = 56 + params: NVOS33_PARAMETERS + fd: int +@c.record +class NVOS33_PARAMETERS(c.Struct): + SIZE = 48 + hClient: int + hDevice: int + hMemory: int + offset: int + length: int + pLinearAddress: ctypes.c_void_p + status: int + flags: int +NVOS33_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('offset', NvU64, 16), ('length', NvU64, 24), ('pLinearAddress', NvP64, 32), ('status', NvU32, 40), ('flags', NvU32, 44)]) +nv_ioctl_nvos33_parameters_with_fd.register_fields([('params', NVOS33_PARAMETERS, 0), ('fd', ctypes.c_int32, 48)]) +@c.record +class struct_NV_MEMORY_DESC_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + addressSpace: int + cacheAttrib: int +struct_NV_MEMORY_DESC_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('addressSpace', NvU32, 16), ('cacheAttrib', NvU32, 20)]) +NV_MEMORY_DESC_PARAMS: TypeAlias = struct_NV_MEMORY_DESC_PARAMS +@c.record +class struct_NV_CHANNEL_ALLOC_PARAMS(c.Struct): + SIZE = 368 + hObjectError: int + hObjectBuffer: int + gpFifoOffset: int + gpFifoEntries: int + flags: int + hContextShare: int + hVASpace: int + hUserdMemory: c.Array[ctypes.c_uint32, Literal[8]] + userdOffset: c.Array[ctypes.c_uint64, Literal[8]] + engineType: int + cid: int + subDeviceId: int + hObjectEccError: int + instanceMem: struct_NV_MEMORY_DESC_PARAMS + userdMem: struct_NV_MEMORY_DESC_PARAMS + ramfcMem: struct_NV_MEMORY_DESC_PARAMS + mthdbufMem: struct_NV_MEMORY_DESC_PARAMS + hPhysChannelGroup: int + internalFlags: int + errorNotifierMem: struct_NV_MEMORY_DESC_PARAMS + eccErrorNotifierMem: struct_NV_MEMORY_DESC_PARAMS + ProcessID: int + SubProcessID: int + encryptIv: c.Array[ctypes.c_uint32, Literal[3]] + decryptIv: c.Array[ctypes.c_uint32, Literal[3]] + hmacNonce: c.Array[ctypes.c_uint32, Literal[8]] + tpcConfigID: int +struct_NV_CHANNEL_ALLOC_PARAMS.register_fields([('hObjectError', NvHandle, 0), ('hObjectBuffer', NvHandle, 4), ('gpFifoOffset', NvU64, 8), ('gpFifoEntries', NvU32, 16), ('flags', NvU32, 20), ('hContextShare', NvHandle, 24), ('hVASpace', NvHandle, 28), ('hUserdMemory', c.Array[NvHandle, Literal[8]], 32), ('userdOffset', c.Array[NvU64, Literal[8]], 64), ('engineType', NvU32, 128), ('cid', NvU32, 132), ('subDeviceId', NvU32, 136), ('hObjectEccError', NvHandle, 140), ('instanceMem', NV_MEMORY_DESC_PARAMS, 144), ('userdMem', NV_MEMORY_DESC_PARAMS, 168), ('ramfcMem', NV_MEMORY_DESC_PARAMS, 192), ('mthdbufMem', NV_MEMORY_DESC_PARAMS, 216), ('hPhysChannelGroup', NvHandle, 240), ('internalFlags', NvU32, 244), ('errorNotifierMem', NV_MEMORY_DESC_PARAMS, 248), ('eccErrorNotifierMem', NV_MEMORY_DESC_PARAMS, 272), ('ProcessID', NvU32, 296), ('SubProcessID', NvU32, 300), ('encryptIv', c.Array[NvU32, Literal[3]], 304), ('decryptIv', c.Array[NvU32, Literal[3]], 316), ('hmacNonce', c.Array[NvU32, Literal[8]], 328), ('tpcConfigID', NvU32, 360)]) +NV_CHANNEL_ALLOC_PARAMS: TypeAlias = struct_NV_CHANNEL_ALLOC_PARAMS +NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS: TypeAlias = struct_NV_CHANNEL_ALLOC_PARAMS +@c.record +class NVOS00_PARAMETERS(c.Struct): + SIZE = 16 + hRoot: int + hObjectParent: int + hObjectOld: int + status: int +NVOS00_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectOld', NvHandle, 8), ('status', NvV32, 12)]) +@c.record +class NVOS05_PARAMETERS(c.Struct): + SIZE = 20 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + status: int +NVOS05_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('status', NvV32, 16)]) +Callback1ArgVoidReturn: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +Callback5ArgVoidReturn: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +@c.record +class NVOS10_EVENT_KERNEL_CALLBACK(c.Struct): + SIZE = 16 + func: c.CFUNCTYPE[None, [ctypes.c_void_p]] + arg: ctypes.c_void_p +NVOS10_EVENT_KERNEL_CALLBACK.register_fields([('func', Callback1ArgVoidReturn, 0), ('arg', ctypes.c_void_p, 8)]) +@c.record +class NVOS10_EVENT_KERNEL_CALLBACK_EX(c.Struct): + SIZE = 16 + func: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] + arg: ctypes.c_void_p +NVOS10_EVENT_KERNEL_CALLBACK_EX.register_fields([('func', Callback5ArgVoidReturn, 0), ('arg', ctypes.c_void_p, 8)]) +@c.record +class NVOS_I2C_ACCESS_PARAMS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + paramSize: int + paramStructPtr: ctypes.c_void_p + status: int +NVOS_I2C_ACCESS_PARAMS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('paramSize', NvU32, 8), ('paramStructPtr', NvP64, 16), ('status', NvV32, 24)]) +@c.record +class NVOS21_PARAMETERS(c.Struct): + SIZE = 32 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + pAllocParms: ctypes.c_void_p + paramsSize: int + status: int +NVOS21_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('pAllocParms', NvP64, 16), ('paramsSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS64_PARAMETERS(c.Struct): + SIZE = 48 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + pAllocParms: ctypes.c_void_p + pRightsRequested: ctypes.c_void_p + paramsSize: int + flags: int + status: int +NVOS64_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('pAllocParms', NvP64, 16), ('pRightsRequested', NvP64, 24), ('paramsSize', NvU32, 32), ('flags', NvU32, 36), ('status', NvV32, 40)]) +@c.record +class NVOS62_PARAMETERS(c.Struct): + SIZE = 24 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + paramSize: int + status: int +NVOS62_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('paramSize', NvU32, 16), ('status', NvV32, 20)]) +@c.record +class NVOS65_PARAMETERS(c.Struct): + SIZE = 32 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + paramSize: int + versionMagic: int + maskSize: int + status: int +NVOS65_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('paramSize', NvU32, 16), ('versionMagic', NvU32, 20), ('maskSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS30_PARAMETERS(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hChannel: int + numChannels: int + phClients: ctypes.c_void_p + phDevices: ctypes.c_void_p + phChannels: ctypes.c_void_p + flags: int + timeout: int + status: int +NVOS30_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hChannel', NvHandle, 8), ('numChannels', NvV32, 12), ('phClients', NvP64, 16), ('phDevices', NvP64, 24), ('phChannels', NvP64, 32), ('flags', NvV32, 40), ('timeout', NvV32, 44), ('status', NvV32, 48)]) +BindResultFunc: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +@c.record +class NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR_PARAMETERS(c.Struct): + SIZE = 16 + sgt: ctypes.c_void_p + gem: ctypes.c_void_p +NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR_PARAMETERS.register_fields([('sgt', NvP64, 0), ('gem', NvP64, 8)]) +@c.record +class NVOS32_PARAMETERS(c.Struct): + SIZE = 184 + hRoot: int + hObjectParent: int + function: int + hVASpace: int + ivcHeapNumber: int + status: int + total: int + free: int + data: NVOS32_PARAMETERS_data +NvS16: TypeAlias = ctypes.c_int16 +@c.record +class NVOS32_PARAMETERS_data(c.Struct): + SIZE = 144 + AllocSize: NVOS32_PARAMETERS_data_AllocSize + AllocTiledPitchHeight: NVOS32_PARAMETERS_data_AllocTiledPitchHeight + Free: NVOS32_PARAMETERS_data_Free + ReleaseCompr: NVOS32_PARAMETERS_data_ReleaseCompr + ReacquireCompr: NVOS32_PARAMETERS_data_ReacquireCompr + Info: NVOS32_PARAMETERS_data_Info + AllocSizeRange: NVOS32_PARAMETERS_data_AllocSizeRange + AllocHintAlignment: NVOS32_PARAMETERS_data_AllocHintAlignment + HwAlloc: NVOS32_PARAMETERS_data_HwAlloc + HwFree: NVOS32_PARAMETERS_data_HwFree + AllocOsDesc: NVOS32_PARAMETERS_data_AllocOsDesc +@c.record +class NVOS32_PARAMETERS_data_AllocSize(c.Struct): + SIZE = 120 + owner: int + hMemory: int + type: int + flags: int + attr: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + width: int + height: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + rangeBegin: int + rangeEnd: int + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocSize.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('attr', NvU32, 16), ('format', NvU32, 20), ('comprCovg', NvU32, 24), ('zcullCovg', NvU32, 28), ('partitionStride', NvU32, 32), ('width', NvU32, 36), ('height', NvU32, 40), ('size', NvU64, 48), ('alignment', NvU64, 56), ('offset', NvU64, 64), ('limit', NvU64, 72), ('address', NvP64, 80), ('rangeBegin', NvU64, 88), ('rangeEnd', NvU64, 96), ('attr2', NvU32, 104), ('ctagOffset', NvU32, 108), ('numaNode', NvS32, 112)]) +@c.record +class NVOS32_PARAMETERS_data_AllocTiledPitchHeight(c.Struct): + SIZE = 120 + owner: int + hMemory: int + type: int + flags: int + height: int + pitch: int + attr: int + width: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + rangeBegin: int + rangeEnd: int + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocTiledPitchHeight.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('height', NvU32, 16), ('pitch', NvS32, 20), ('attr', NvU32, 24), ('width', NvU32, 28), ('format', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('partitionStride', NvU32, 44), ('size', NvU64, 48), ('alignment', NvU64, 56), ('offset', NvU64, 64), ('limit', NvU64, 72), ('address', NvP64, 80), ('rangeBegin', NvU64, 88), ('rangeEnd', NvU64, 96), ('attr2', NvU32, 104), ('ctagOffset', NvU32, 108), ('numaNode', NvS32, 112)]) +@c.record +class NVOS32_PARAMETERS_data_Free(c.Struct): + SIZE = 12 + owner: int + hMemory: int + flags: int +NVOS32_PARAMETERS_data_Free.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('flags', NvU32, 8)]) +@c.record +class NVOS32_PARAMETERS_data_ReleaseCompr(c.Struct): + SIZE = 12 + owner: int + flags: int + hMemory: int +NVOS32_PARAMETERS_data_ReleaseCompr.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('hMemory', NvHandle, 8)]) +@c.record +class NVOS32_PARAMETERS_data_ReacquireCompr(c.Struct): + SIZE = 12 + owner: int + flags: int + hMemory: int +NVOS32_PARAMETERS_data_ReacquireCompr.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('hMemory', NvHandle, 8)]) +@c.record +class NVOS32_PARAMETERS_data_Info(c.Struct): + SIZE = 32 + attr: int + offset: int + size: int + base: int +NVOS32_PARAMETERS_data_Info.register_fields([('attr', NvU32, 0), ('offset', NvU64, 8), ('size', NvU64, 16), ('base', NvU64, 24)]) +@c.record +class NVOS32_PARAMETERS_data_AllocSizeRange(c.Struct): + SIZE = 112 + owner: int + hMemory: int + type: int + flags: int + attr: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + size: int + alignment: int + offset: int + limit: int + rangeBegin: int + rangeEnd: int + address: ctypes.c_void_p + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocSizeRange.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('attr', NvU32, 16), ('format', NvU32, 20), ('comprCovg', NvU32, 24), ('zcullCovg', NvU32, 28), ('partitionStride', NvU32, 32), ('size', NvU64, 40), ('alignment', NvU64, 48), ('offset', NvU64, 56), ('limit', NvU64, 64), ('rangeBegin', NvU64, 72), ('rangeEnd', NvU64, 80), ('address', NvP64, 88), ('attr2', NvU32, 96), ('ctagOffset', NvU32, 100), ('numaNode', NvS32, 104)]) +@c.record +class NVOS32_PARAMETERS_data_AllocHintAlignment(c.Struct): + SIZE = 56 + alignType: int + alignAttr: int + alignInputFlags: int + alignSize: int + alignHeight: int + alignWidth: int + alignPitch: int + alignPad: int + alignMask: int + alignKind: int + alignAdjust: int + alignAttr2: int +NVOS32_PARAMETERS_data_AllocHintAlignment.register_fields([('alignType', NvU32, 0), ('alignAttr', NvU32, 4), ('alignInputFlags', NvU32, 8), ('alignSize', NvU64, 16), ('alignHeight', NvU32, 24), ('alignWidth', NvU32, 28), ('alignPitch', NvU32, 32), ('alignPad', NvU32, 36), ('alignMask', NvU32, 40), ('alignKind', NvU32, 44), ('alignAdjust', NvU32, 48), ('alignAttr2', NvU32, 52)]) +@c.record +class NVOS32_PARAMETERS_data_HwAlloc(c.Struct): + SIZE = 144 + allocOwner: int + allochMemory: int + flags: int + allocType: int + allocAttr: int + allocInputFlags: int + allocSize: int + allocHeight: int + allocWidth: int + allocPitch: int + allocMask: int + allocComprCovg: int + allocZcullCovg: int + bindResultFunc: ctypes.c_void_p + pHandle: ctypes.c_void_p + hResourceHandle: int + retAttr: int + kind: int + osDeviceHandle: int + allocAttr2: int + retAttr2: int + allocAddr: int + comprInfo: NVOS32_PARAMETERS_data_HwAlloc_comprInfo + uncompressedKind: int +@c.record +class NVOS32_PARAMETERS_data_HwAlloc_comprInfo(c.Struct): + SIZE = 24 + compPageShift: int + compressedKind: int + compTagLineMin: int + compPageIndexLo: int + compPageIndexHi: int + compTagLineMultiplier: int +NVOS32_PARAMETERS_data_HwAlloc_comprInfo.register_fields([('compPageShift', NvU32, 0), ('compressedKind', NvU32, 4), ('compTagLineMin', NvU32, 8), ('compPageIndexLo', NvU32, 12), ('compPageIndexHi', NvU32, 16), ('compTagLineMultiplier', NvU32, 20)]) +NVOS32_PARAMETERS_data_HwAlloc.register_fields([('allocOwner', NvU32, 0), ('allochMemory', NvHandle, 4), ('flags', NvU32, 8), ('allocType', NvU32, 12), ('allocAttr', NvU32, 16), ('allocInputFlags', NvU32, 20), ('allocSize', NvU64, 24), ('allocHeight', NvU32, 32), ('allocWidth', NvU32, 36), ('allocPitch', NvU32, 40), ('allocMask', NvU32, 44), ('allocComprCovg', NvU32, 48), ('allocZcullCovg', NvU32, 52), ('bindResultFunc', NvP64, 56), ('pHandle', NvP64, 64), ('hResourceHandle', NvHandle, 72), ('retAttr', NvU32, 76), ('kind', NvU32, 80), ('osDeviceHandle', NvU64, 88), ('allocAttr2', NvU32, 96), ('retAttr2', NvU32, 100), ('allocAddr', NvU64, 104), ('comprInfo', NVOS32_PARAMETERS_data_HwAlloc_comprInfo, 112), ('uncompressedKind', NvU32, 136)]) +@c.record +class NVOS32_PARAMETERS_data_HwFree(c.Struct): + SIZE = 8 + hResourceHandle: int + flags: int +NVOS32_PARAMETERS_data_HwFree.register_fields([('hResourceHandle', NvHandle, 0), ('flags', NvU32, 4)]) +@c.record +class NVOS32_PARAMETERS_data_AllocOsDesc(c.Struct): + SIZE = 48 + hMemory: int + type: int + flags: int + attr: int + attr2: int + descriptor: ctypes.c_void_p + limit: int + descriptorType: int +NVOS32_PARAMETERS_data_AllocOsDesc.register_fields([('hMemory', NvHandle, 0), ('type', NvU32, 4), ('flags', NvU32, 8), ('attr', NvU32, 12), ('attr2', NvU32, 16), ('descriptor', NvP64, 24), ('limit', NvU64, 32), ('descriptorType', NvU32, 40)]) +NVOS32_PARAMETERS_data.register_fields([('AllocSize', NVOS32_PARAMETERS_data_AllocSize, 0), ('AllocTiledPitchHeight', NVOS32_PARAMETERS_data_AllocTiledPitchHeight, 0), ('Free', NVOS32_PARAMETERS_data_Free, 0), ('ReleaseCompr', NVOS32_PARAMETERS_data_ReleaseCompr, 0), ('ReacquireCompr', NVOS32_PARAMETERS_data_ReacquireCompr, 0), ('Info', NVOS32_PARAMETERS_data_Info, 0), ('AllocSizeRange', NVOS32_PARAMETERS_data_AllocSizeRange, 0), ('AllocHintAlignment', NVOS32_PARAMETERS_data_AllocHintAlignment, 0), ('HwAlloc', NVOS32_PARAMETERS_data_HwAlloc, 0), ('HwFree', NVOS32_PARAMETERS_data_HwFree, 0), ('AllocOsDesc', NVOS32_PARAMETERS_data_AllocOsDesc, 0)]) +NVOS32_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('function', NvU32, 8), ('hVASpace', NvHandle, 12), ('ivcHeapNumber', NvS16, 16), ('status', NvV32, 20), ('total', NvU64, 24), ('free', NvU64, 32), ('data', NVOS32_PARAMETERS_data, 40)]) +@c.record +class NV_CONTEXT_DMA_ALLOCATION_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + flags: int + hMemory: int + offset: int + limit: int +NV_CONTEXT_DMA_ALLOCATION_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('flags', NvV32, 4), ('hMemory', NvHandle, 8), ('offset', NvU64, 16), ('limit', NvU64, 24)]) +@c.record +class NV_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 128 + owner: int + type: int + flags: int + width: int + height: int + pitch: int + attr: int + attr2: int + format: int + comprCovg: int + zcullCovg: int + rangeLo: int + rangeHi: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + ctagOffset: int + hVASpace: int + internalflags: int + tag: int + numaNode: int +NV_MEMORY_ALLOCATION_PARAMS.register_fields([('owner', NvU32, 0), ('type', NvU32, 4), ('flags', NvU32, 8), ('width', NvU32, 12), ('height', NvU32, 16), ('pitch', NvS32, 20), ('attr', NvU32, 24), ('attr2', NvU32, 28), ('format', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('rangeLo', NvU64, 48), ('rangeHi', NvU64, 56), ('size', NvU64, 64), ('alignment', NvU64, 72), ('offset', NvU64, 80), ('limit', NvU64, 88), ('address', NvP64, 96), ('ctagOffset', NvU32, 104), ('hVASpace', NvHandle, 108), ('internalflags', NvU32, 112), ('tag', NvU32, 116), ('numaNode', NvS32, 120)]) +@c.record +class NV_OS_DESC_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 40 + type: int + flags: int + attr: int + attr2: int + descriptor: ctypes.c_void_p + limit: int + descriptorType: int + tag: int +NV_OS_DESC_MEMORY_ALLOCATION_PARAMS.register_fields([('type', NvU32, 0), ('flags', NvU32, 4), ('attr', NvU32, 8), ('attr2', NvU32, 12), ('descriptor', NvP64, 16), ('limit', NvU64, 24), ('descriptorType', NvU32, 32), ('tag', NvU32, 36)]) +@c.record +class NV_USER_LOCAL_DESC_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 32 + flags: int + physAddr: int + size: int + tag: int + bGuestAllocated: int +NV_USER_LOCAL_DESC_MEMORY_ALLOCATION_PARAMS.register_fields([('flags', NvU32, 0), ('physAddr', NvU64, 8), ('size', NvU64, 16), ('tag', NvU32, 24), ('bGuestAllocated', NvBool, 28)]) +@c.record +class NV_MEMORY_HW_RESOURCES_ALLOCATION_PARAMS(c.Struct): + SIZE = 120 + owner: int + flags: int + type: int + attr: int + attr2: int + height: int + width: int + pitch: int + alignment: int + comprCovg: int + zcullCovg: int + kind: int + bindResultFunc: ctypes.c_void_p + pHandle: ctypes.c_void_p + osDeviceHandle: int + size: int + allocAddr: int + compPageShift: int + compressedKind: int + compTagLineMin: int + compPageIndexLo: int + compPageIndexHi: int + compTagLineMultiplier: int + uncompressedKind: int + tag: int +NV_MEMORY_HW_RESOURCES_ALLOCATION_PARAMS.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('type', NvU32, 8), ('attr', NvU32, 12), ('attr2', NvU32, 16), ('height', NvU32, 20), ('width', NvU32, 24), ('pitch', NvU32, 28), ('alignment', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('kind', NvU32, 44), ('bindResultFunc', NvP64, 48), ('pHandle', NvP64, 56), ('osDeviceHandle', NvU64, 64), ('size', NvU64, 72), ('allocAddr', NvU64, 80), ('compPageShift', NvU32, 88), ('compressedKind', NvU32, 92), ('compTagLineMin', NvU32, 96), ('compPageIndexLo', NvU32, 100), ('compPageIndexHi', NvU32, 104), ('compTagLineMultiplier', NvU32, 108), ('uncompressedKind', NvU32, 112), ('tag', NvU32, 116)]) +@c.record +class NVOS34_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + hMemory: int + pLinearAddress: ctypes.c_void_p + status: int + flags: int +NVOS34_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('pLinearAddress', NvP64, 16), ('status', NvU32, 24), ('flags', NvU32, 28)]) +@c.record +class NVOS38_PARAMETERS(c.Struct): + SIZE = 72 + hClient: int + hObject: int + AccessType: int + DevNodeLength: int + pDevNode: ctypes.c_void_p + ParmStrLength: int + pParmStr: ctypes.c_void_p + BinaryDataLength: int + pBinaryData: ctypes.c_void_p + Data: int + Entry: int + status: int +NVOS38_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('AccessType', NvV32, 8), ('DevNodeLength', NvV32, 12), ('pDevNode', NvP64, 16), ('ParmStrLength', NvV32, 24), ('pParmStr', NvP64, 32), ('BinaryDataLength', NvV32, 40), ('pBinaryData', NvP64, 48), ('Data', NvV32, 56), ('Entry', NvV32, 60), ('status', NvV32, 64)]) +@c.record +class NVOS39_PARAMETERS(c.Struct): + SIZE = 56 + hObjectParent: int + hSubDevice: int + hObjectNew: int + hClass: int + flags: int + selector: int + hMemory: int + offset: int + limit: int + status: int +NVOS39_PARAMETERS.register_fields([('hObjectParent', NvHandle, 0), ('hSubDevice', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('flags', NvV32, 16), ('selector', NvU32, 20), ('hMemory', NvHandle, 24), ('offset', NvU64, 32), ('limit', NvU64, 40), ('status', NvV32, 48)]) +@c.record +class NvUnixEvent(c.Struct): + SIZE = 16 + hObject: int + NotifyIndex: int + info32: int + info16: int +NvUnixEvent.register_fields([('hObject', NvHandle, 0), ('NotifyIndex', NvV32, 4), ('info32', NvV32, 8), ('info16', NvU16, 12)]) +@c.record +class NVOS41_PARAMETERS(c.Struct): + SIZE = 16 + pEvent: ctypes.c_void_p + MoreEvents: int + status: int +NVOS41_PARAMETERS.register_fields([('pEvent', NvP64, 0), ('MoreEvents', NvV32, 8), ('status', NvV32, 12)]) +@c.record +class NVOS2C_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + offset: int + bar: int + bytes: int + write: int + data: int + status: int +NVOS2C_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('offset', NvU32, 8), ('bar', NvU32, 12), ('bytes', NvU32, 16), ('write', NvU32, 20), ('data', NvU32, 24), ('status', NvU32, 28)]) +@c.record +class NVOS46_PARAMETERS(c.Struct): + SIZE = 64 + hClient: int + hDevice: int + hDma: int + hMemory: int + offset: int + length: int + flags: int + flags2: int + kindOverride: int + dmaOffset: int + status: int +NVOS46_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hDma', NvHandle, 8), ('hMemory', NvHandle, 12), ('offset', NvU64, 16), ('length', NvU64, 24), ('flags', NvV32, 32), ('flags2', NvV32, 36), ('kindOverride', NvV32, 40), ('dmaOffset', NvU64, 48), ('status', NvV32, 56)]) +NV_MAP_MEMORY_DMA_PARAMETERS: TypeAlias = NVOS46_PARAMETERS +@c.record +class NVOS47_PARAMETERS(c.Struct): + SIZE = 48 + hClient: int + hDevice: int + hDma: int + hMemory: int + flags: int + dmaOffset: int + size: int + status: int +NVOS47_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hDma', NvHandle, 8), ('hMemory', NvHandle, 12), ('flags', NvV32, 16), ('dmaOffset', NvU64, 24), ('size', NvU64, 32), ('status', NvV32, 40)]) +NV_UNMAP_MEMORY_DMA_PARAMETERS: TypeAlias = NVOS47_PARAMETERS +@c.record +class NVOS49_PARAMETERS(c.Struct): + SIZE = 16 + hClient: int + hChannel: int + hCtxDma: int + status: int +NVOS49_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('hCtxDma', NvHandle, 8), ('status', NvV32, 12)]) +@c.record +class NVOS54_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hObject: int + cmd: int + flags: int + params: ctypes.c_void_p + paramsSize: int + status: int +NVOS54_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvV32, 8), ('flags', NvU32, 12), ('params', NvP64, 16), ('paramsSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS63_PARAMETERS(c.Struct): + SIZE = 20 + hClient: int + hObject: int + cmd: int + paramsSize: int + status: int +NVOS63_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvV32, 8), ('paramsSize', NvU32, 12), ('status', NvV32, 16)]) +@c.record +class NVOS55_PARAMETERS(c.Struct): + SIZE = 28 + hClient: int + hParent: int + hObject: int + hClientSrc: int + hObjectSrc: int + flags: int + status: int +NVOS55_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClientSrc', NvHandle, 12), ('hObjectSrc', NvHandle, 16), ('flags', NvU32, 20), ('status', NvU32, 24)]) +@c.record +class NVOS56_PARAMETERS(c.Struct): + SIZE = 40 + hClient: int + hDevice: int + hMemory: int + pOldCpuAddress: ctypes.c_void_p + pNewCpuAddress: ctypes.c_void_p + status: int +NVOS56_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('pOldCpuAddress', NvP64, 16), ('pNewCpuAddress', NvP64, 24), ('status', NvV32, 32)]) +@c.record +class NVOS57_PARAMETERS(c.Struct): + SIZE = 24 + hClient: int + hObject: int + sharePolicy: struct_RS_SHARE_POLICY + status: int +@c.record +class struct_RS_SHARE_POLICY(c.Struct): + SIZE = 12 + target: int + accessMask: struct_RS_ACCESS_MASK + type: int + action: int +RS_SHARE_POLICY: TypeAlias = struct_RS_SHARE_POLICY +@c.record +class struct_RS_ACCESS_MASK(c.Struct): + SIZE = 4 + limbs: c.Array[ctypes.c_uint32, Literal[1]] +RS_ACCESS_MASK: TypeAlias = struct_RS_ACCESS_MASK +RsAccessLimb: TypeAlias = ctypes.c_uint32 +struct_RS_ACCESS_MASK.register_fields([('limbs', c.Array[RsAccessLimb, Literal[1]], 0)]) +struct_RS_SHARE_POLICY.register_fields([('target', NvU32, 0), ('accessMask', RS_ACCESS_MASK, 4), ('type', NvU16, 8), ('action', NvU8, 10)]) +NVOS57_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('sharePolicy', RS_SHARE_POLICY, 8), ('status', NvU32, 20)]) +NVPOWERSTATE_STAGE: TypeAlias = ctypes.c_uint32 +@c.record +class NVPOWERSTATE_FAILURE_ENGINE_TRANSITION(c.Struct): + SIZE = 24 + classId: int + cumulativeTimeus: int + engineMaxTimeus: int + engineMaxTimeClassId: int +NVPOWERSTATE_FAILURE_ENGINE_TRANSITION.register_fields([('classId', NvU32, 0), ('cumulativeTimeus', NvU64, 8), ('engineMaxTimeus', NvU32, 16), ('engineMaxTimeClassId', NvU32, 20)]) +@c.record +class NVPOWERSTATE_FAILURE_WAIT_FOR_GFW_BOOT_OK(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_WAIT_FOR_GFW_BOOT_OK.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_INIT_LIBOS_LOGGING_STRUCTURES(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_INIT_LIBOS_LOGGING_STRUCTURES.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GSP_PREPARE_FOR_BOOTSTRAP(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GSP_PREPARE_FOR_BOOTSTRAP.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GSP_BOOTSTRAP(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GSP_BOOTSTRAP.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_BOOT_GSP_RM_PROXY(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_BOOT_GSP_RM_PROXY.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_VBIOS_HANDLE_SECURE_BOOT(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_VBIOS_HANDLE_SECURE_BOOT.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_RESTORE_PCIE_CONFIG_REGISTERS(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_RESTORE_PCIE_CONFIG_REGISTERS.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GCX_BOOT_TIMER_CB_SCHEDULE(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GCX_BOOT_TIMER_CB_SCHEDULE.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_PMS_EXPECTED_CHECKPOINT_DONE(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_PMS_EXPECTED_CHECKPOINT_DONE.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_POLL_FOR_NVLINK_READY(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_POLL_FOR_NVLINK_READY.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_CE_STATE_PRE_LOAD(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_CE_STATE_PRE_LOAD.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_LOAD_PROXY_UCODE_EARLY_INIT(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_LOAD_PROXY_UCODE_EARLY_INIT.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_RESTORE_NON_WPR_REGION(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_RESTORE_NON_WPR_REGION.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_PMU_20_OS_BOOTSTRAP(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_PMU_20_OS_BOOTSTRAP.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_LOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_LOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_LOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_LOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_POST_LOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_POST_LOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_POST_LOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_POST_LOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_LOAD_PHYSICAL(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_LOAD_PHYSICAL.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GSP_PREPARE_SUSPEND_RESUME_DATA(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GSP_PREPARE_SUSPEND_RESUME_DATA.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_MC_POINTER_NULL(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_MC_POINTER_NULL.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_SAVE_PCIE_CONFIG_REGISTERS(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_SAVE_PCIE_CONFIG_REGISTERS.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_UNLOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_UNLOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_UNLOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_UNLOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GSP_UNLOAD_RM(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GSP_UNLOAD_RM.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_MONITOR_STATE_0(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_MONITOR_STATE_0.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_MONITOR_STATE_1(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_MONITOR_STATE_1.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_MONITOR_STATE_HIBERNATE(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_MONITOR_STATE_HIBERNATE.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_SET_POWER_STATE_UNKNOWN(c.Struct): + SIZE = 4 + state: int +NVPOWERSTATE_FAILURE_SET_POWER_STATE_UNKNOWN.register_fields([('state', NvU32, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_DATA(c.Struct): + SIZE = 24 + waitForGfwBootOk: NVPOWERSTATE_FAILURE_WAIT_FOR_GFW_BOOT_OK + initLibosLoggingStructures: NVPOWERSTATE_FAILURE_INIT_LIBOS_LOGGING_STRUCTURES + gspPrepareForBootstrap: NVPOWERSTATE_FAILURE_GSP_PREPARE_FOR_BOOTSTRAP + gspBootstrap: NVPOWERSTATE_FAILURE_GSP_BOOTSTRAP + bootGspRmProxy: NVPOWERSTATE_FAILURE_BOOT_GSP_RM_PROXY + vbiosHandleSecureBoot: NVPOWERSTATE_FAILURE_VBIOS_HANDLE_SECURE_BOOT + restorePcieConfigRegisters: NVPOWERSTATE_FAILURE_RESTORE_PCIE_CONFIG_REGISTERS + gcxBootTimerCbSchedule: NVPOWERSTATE_FAILURE_GCX_BOOT_TIMER_CB_SCHEDULE + powerManagementResumePreLoadPhysicalUnattached: NVPOWERSTATE_FAILURE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED + pmsExpectedCheckpointDone: NVPOWERSTATE_FAILURE_PMS_EXPECTED_CHECKPOINT_DONE + pollForNvlinkReady: NVPOWERSTATE_FAILURE_POLL_FOR_NVLINK_READY + ceStatePreLoad: NVPOWERSTATE_FAILURE_CE_STATE_PRE_LOAD + loadProxyUcodeEarlyInit: NVPOWERSTATE_FAILURE_LOAD_PROXY_UCODE_EARLY_INIT + restoreNonWprRegion: NVPOWERSTATE_FAILURE_RESTORE_NON_WPR_REGION + pmu20OsBootstrap: NVPOWERSTATE_FAILURE_PMU_20_OS_BOOTSTRAP + statePreLoadEngine: NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_ENGINE + statePreLoadUnknown: NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_UNKNOWN + stateLoadEngine: NVPOWERSTATE_FAILURE_STATE_LOAD_ENGINE + stateLoadUnknown: NVPOWERSTATE_FAILURE_STATE_LOAD_UNKNOWN + statePostLoadEngine: NVPOWERSTATE_FAILURE_STATE_POST_LOAD_ENGINE + statePostLoadUnknown: NVPOWERSTATE_FAILURE_STATE_POST_LOAD_UNKNOWN + stateLoadPhysical: NVPOWERSTATE_FAILURE_STATE_LOAD_PHYSICAL + gspPrepareSuspendResumeData: NVPOWERSTATE_FAILURE_GSP_PREPARE_SUSPEND_RESUME_DATA + mcPointerNull: NVPOWERSTATE_FAILURE_MC_POINTER_NULL + savePcieConfigRegisters: NVPOWERSTATE_FAILURE_SAVE_PCIE_CONFIG_REGISTERS + statePreUnloadEngine: NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_ENGINE + statePreUnloadUnknown: NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_UNKNOWN + stateUnloadEngine: NVPOWERSTATE_FAILURE_STATE_UNLOAD_ENGINE + stateUnloadUnknown: NVPOWERSTATE_FAILURE_STATE_UNLOAD_UNKNOWN + statePostUnloadEngine: NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_ENGINE + statePostUnloadUnknown: NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_UNKNOWN + gspUnloadRm: NVPOWERSTATE_FAILURE_GSP_UNLOAD_RM + monitorState0: NVPOWERSTATE_FAILURE_MONITOR_STATE_0 + monitorState1: NVPOWERSTATE_FAILURE_MONITOR_STATE_1 + monitorStateHibernate: NVPOWERSTATE_FAILURE_MONITOR_STATE_HIBERNATE + setPowerStateUnknown: NVPOWERSTATE_FAILURE_SET_POWER_STATE_UNKNOWN +NVPOWERSTATE_FAILURE_DATA.register_fields([('waitForGfwBootOk', NVPOWERSTATE_FAILURE_WAIT_FOR_GFW_BOOT_OK, 0), ('initLibosLoggingStructures', NVPOWERSTATE_FAILURE_INIT_LIBOS_LOGGING_STRUCTURES, 0), ('gspPrepareForBootstrap', NVPOWERSTATE_FAILURE_GSP_PREPARE_FOR_BOOTSTRAP, 0), ('gspBootstrap', NVPOWERSTATE_FAILURE_GSP_BOOTSTRAP, 0), ('bootGspRmProxy', NVPOWERSTATE_FAILURE_BOOT_GSP_RM_PROXY, 0), ('vbiosHandleSecureBoot', NVPOWERSTATE_FAILURE_VBIOS_HANDLE_SECURE_BOOT, 0), ('restorePcieConfigRegisters', NVPOWERSTATE_FAILURE_RESTORE_PCIE_CONFIG_REGISTERS, 0), ('gcxBootTimerCbSchedule', NVPOWERSTATE_FAILURE_GCX_BOOT_TIMER_CB_SCHEDULE, 0), ('powerManagementResumePreLoadPhysicalUnattached', NVPOWERSTATE_FAILURE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED, 0), ('pmsExpectedCheckpointDone', NVPOWERSTATE_FAILURE_PMS_EXPECTED_CHECKPOINT_DONE, 0), ('pollForNvlinkReady', NVPOWERSTATE_FAILURE_POLL_FOR_NVLINK_READY, 0), ('ceStatePreLoad', NVPOWERSTATE_FAILURE_CE_STATE_PRE_LOAD, 0), ('loadProxyUcodeEarlyInit', NVPOWERSTATE_FAILURE_LOAD_PROXY_UCODE_EARLY_INIT, 0), ('restoreNonWprRegion', NVPOWERSTATE_FAILURE_RESTORE_NON_WPR_REGION, 0), ('pmu20OsBootstrap', NVPOWERSTATE_FAILURE_PMU_20_OS_BOOTSTRAP, 0), ('statePreLoadEngine', NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_ENGINE, 0), ('statePreLoadUnknown', NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_UNKNOWN, 0), ('stateLoadEngine', NVPOWERSTATE_FAILURE_STATE_LOAD_ENGINE, 0), ('stateLoadUnknown', NVPOWERSTATE_FAILURE_STATE_LOAD_UNKNOWN, 0), ('statePostLoadEngine', NVPOWERSTATE_FAILURE_STATE_POST_LOAD_ENGINE, 0), ('statePostLoadUnknown', NVPOWERSTATE_FAILURE_STATE_POST_LOAD_UNKNOWN, 0), ('stateLoadPhysical', NVPOWERSTATE_FAILURE_STATE_LOAD_PHYSICAL, 0), ('gspPrepareSuspendResumeData', NVPOWERSTATE_FAILURE_GSP_PREPARE_SUSPEND_RESUME_DATA, 0), ('mcPointerNull', NVPOWERSTATE_FAILURE_MC_POINTER_NULL, 0), ('savePcieConfigRegisters', NVPOWERSTATE_FAILURE_SAVE_PCIE_CONFIG_REGISTERS, 0), ('statePreUnloadEngine', NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_ENGINE, 0), ('statePreUnloadUnknown', NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_UNKNOWN, 0), ('stateUnloadEngine', NVPOWERSTATE_FAILURE_STATE_UNLOAD_ENGINE, 0), ('stateUnloadUnknown', NVPOWERSTATE_FAILURE_STATE_UNLOAD_UNKNOWN, 0), ('statePostUnloadEngine', NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_ENGINE, 0), ('statePostUnloadUnknown', NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_UNKNOWN, 0), ('gspUnloadRm', NVPOWERSTATE_FAILURE_GSP_UNLOAD_RM, 0), ('monitorState0', NVPOWERSTATE_FAILURE_MONITOR_STATE_0, 0), ('monitorState1', NVPOWERSTATE_FAILURE_MONITOR_STATE_1, 0), ('monitorStateHibernate', NVPOWERSTATE_FAILURE_MONITOR_STATE_HIBERNATE, 0), ('setPowerStateUnknown', NVPOWERSTATE_FAILURE_SET_POWER_STATE_UNKNOWN, 0)]) +@c.record +class NVPOWERSTATE_FAILURE(c.Struct): + SIZE = 32 + stage: int + status: int + data: NVPOWERSTATE_FAILURE_DATA +NVPOWERSTATE_FAILURE.register_fields([('stage', NVPOWERSTATE_STAGE, 0), ('status', NV_STATUS, 4), ('data', NVPOWERSTATE_FAILURE_DATA, 8)]) +@c.record +class NVPOWERSTATE_PARAMETERS(c.Struct): + SIZE = 64 + deviceReference: int + head: int + state: int + forceMonitorState: int + bForcePerfBiosLevel: int + bIsD3HotTransition: int + bForcePowerStateFail: int + errorStatus: int + fastBootPowerState: int + bGC8Transition: int + bGC8InputRailCutOff: int + failure: NVPOWERSTATE_FAILURE +NVPOWERSTATE_PARAMETERS.register_fields([('deviceReference', NvU32, 0), ('head', NvU32, 4), ('state', NvU32, 8), ('forceMonitorState', NvU8, 12), ('bForcePerfBiosLevel', NvU8, 13), ('bIsD3HotTransition', NvU8, 14), ('bForcePowerStateFail', NvU8, 15), ('errorStatus', NvU32, 16), ('fastBootPowerState', NvU32, 20), ('bGC8Transition', NvU8, 24), ('bGC8InputRailCutOff', NvU8, 25), ('failure', NVPOWERSTATE_FAILURE, 32)]) +PNVPOWERSTATE_PARAMETERS: TypeAlias = c.POINTER[NVPOWERSTATE_PARAMETERS] +@c.record +class NV_GR_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 16 + version: int + flags: int + size: int + caps: int +NV_GR_ALLOCATION_PARAMETERS.register_fields([('version', NvU32, 0), ('flags', NvU32, 4), ('size', NvU32, 8), ('caps', NvU32, 12)]) +ChannelPBSize: dict[int, str] = {(PB_SIZE_4KB:=0): 'PB_SIZE_4KB', (PB_SIZE_8KB:=1): 'PB_SIZE_8KB', (PB_SIZE_16KB:=2): 'PB_SIZE_16KB', (PB_SIZE_32KB:=3): 'PB_SIZE_32KB', (PB_SIZE_64KB:=4): 'PB_SIZE_64KB'} +@c.record +class NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 40 + channelInstance: int + hObjectBuffer: int + hObjectNotify: int + offset: int + pControl: ctypes.c_void_p + flags: int + channelPBSize: int + subDeviceId: int +NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS.register_fields([('channelInstance', NvV32, 0), ('hObjectBuffer', NvHandle, 4), ('hObjectNotify', NvHandle, 8), ('offset', NvU32, 12), ('pControl', NvP64, 16), ('flags', NvU32, 24), ('channelPBSize', ctypes.c_uint32, 28), ('subDeviceId', NvU32, 32)]) +@c.record +class NV50VAIO_CHANNELPIO_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 16 + channelInstance: int + hObjectNotify: int + pControl: ctypes.c_void_p +NV50VAIO_CHANNELPIO_ALLOCATION_PARAMETERS.register_fields([('channelInstance', NvV32, 0), ('hObjectNotify', NvHandle, 4), ('pControl', NvP64, 8)]) +@c.record +class NV_CHANNEL_GROUP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 20 + hObjectError: int + hObjectEccError: int + hVASpace: int + engineType: int + bIsCallingContextVgpuPlugin: int +NV_CHANNEL_GROUP_ALLOCATION_PARAMETERS.register_fields([('hObjectError', NvHandle, 0), ('hObjectEccError', NvHandle, 4), ('hVASpace', NvHandle, 8), ('engineType', NvU32, 12), ('bIsCallingContextVgpuPlugin', NvBool, 16)]) +@c.record +class NV_SWRUNLIST_ALLOCATION_PARAMS(c.Struct): + SIZE = 12 + engineId: int + maxTSGs: int + qosIntrEnableMask: int +NV_SWRUNLIST_ALLOCATION_PARAMS.register_fields([('engineId', NvU32, 0), ('maxTSGs', NvU32, 4), ('qosIntrEnableMask', NvU32, 8)]) +@c.record +class NV_ME_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + caps: int +NV_ME_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('caps', NvU32, 4)]) +@c.record +class NV_BSP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_BSP_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_VP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 80 + size: int + caps: int + flags: int + altUcode: int + rawUcode: ctypes.c_void_p + rawUcodeSize: int + numSubClasses: int + numSubSets: int + subClasses: ctypes.c_void_p + prohibitMultipleInstances: int + pControl: ctypes.c_void_p + hMemoryCmdBuffer: int + offset: int +NV_VP_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('caps', NvU32, 4), ('flags', NvU32, 8), ('altUcode', NvU32, 12), ('rawUcode', NvP64, 16), ('rawUcodeSize', NvU32, 24), ('numSubClasses', NvU32, 28), ('numSubSets', NvU32, 32), ('subClasses', NvP64, 40), ('prohibitMultipleInstances', NvU32, 48), ('pControl', NvP64, 56), ('hMemoryCmdBuffer', NvHandle, 64), ('offset', NvU64, 72)]) +@c.record +class NV_PPP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + prohibitMultipleInstances: int +NV_PPP_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4)]) +@c.record +class NV_MSENC_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_MSENC_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_SEC2_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + prohibitMultipleInstances: int +NV_SEC2_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4)]) +@c.record +class NV_NVJPG_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_NVJPG_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_OFA_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_OFA_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NVOS61_PARAMETERS(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hVblank: int + pProc: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p]] + LogicalHead: int + pParm1: ctypes.c_void_p + pParm2: ctypes.c_void_p + bAdd: int + status: int +OSVBLANKCALLBACKPROC: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p]] +NVOS61_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hVblank', NvHandle, 8), ('pProc', OSVBLANKCALLBACKPROC, 16), ('LogicalHead', NvV32, 24), ('pParm1', ctypes.c_void_p, 32), ('pParm2', ctypes.c_void_p, 40), ('bAdd', NvU32, 48), ('status', NvV32, 52)]) +@c.record +class NV_VASPACE_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 56 + index: int + flags: int + vaSize: int + vaStartInternal: int + vaLimitInternal: int + bigPageSize: int + vaBase: int + pasid: int +NV_VASPACE_ALLOCATION_PARAMETERS.register_fields([('index', NvU32, 0), ('flags', NvV32, 4), ('vaSize', NvU64, 8), ('vaStartInternal', NvU64, 16), ('vaLimitInternal', NvU64, 24), ('bigPageSize', NvU32, 32), ('vaBase', NvU64, 40), ('pasid', NvU32, 48)]) +@c.record +class NV_CTXSHARE_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + hVASpace: int + flags: int + subctxId: int +NV_CTXSHARE_ALLOCATION_PARAMETERS.register_fields([('hVASpace', NvHandle, 0), ('flags', NvU32, 4), ('subctxId', NvU32, 8)]) +@c.record +class NV_TIMEOUT_CONTROL_PARAMETERS(c.Struct): + SIZE = 12 + cmd: int + timeoutInMs: int + deviceInstance: int +NV_TIMEOUT_CONTROL_PARAMETERS.register_fields([('cmd', NvU32, 0), ('timeoutInMs', NvU32, 4), ('deviceInstance', NvU32, 8)]) +NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS_ADDR_SPACE: dict[int, str] = {(NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_DEFAULT:=0): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_DEFAULT', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_COH:=1): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_COH', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_NCOH:=2): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_NCOH', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_VID:=3): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_VID'} +@c.record +class NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS(c.Struct): + SIZE = 528 + bDirtyTracking: int + granularity: int + accessBitMask: c.Array[ctypes.c_uint64, Literal[64]] + noOfEntries: int + addrSpace: int +NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS.register_fields([('bDirtyTracking', NvBool, 0), ('granularity', NvU32, 4), ('accessBitMask', c.Array[NvU64, Literal[64]], 8), ('noOfEntries', NvU32, 520), ('addrSpace', ctypes.c_uint32, 524)]) +@c.record +class NV_HOPPER_USERMODE_A_PARAMS(c.Struct): + SIZE = 2 + bBar1Mapping: int + bPriv: int +NV_HOPPER_USERMODE_A_PARAMS.register_fields([('bBar1Mapping', NvBool, 0), ('bPriv', NvBool, 1)]) +@c.record +class struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS(c.Struct): + SIZE = 4 + workSubmitToken: int +struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS.register_fields([('workSubmitToken', NvU32, 0)]) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS: TypeAlias = struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS +@c.record +class struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS(c.Struct): + SIZE = 16 + bar2Addr: c.Array[ctypes.c_uint64, Literal[2]] +struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS.register_fields([('bar2Addr', c.Array[NvU64, Literal[2]], 0)]) +NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS: TypeAlias = struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS +@c.record +class struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS(c.Struct): + SIZE = 4 + index: int +struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS.register_fields([('index', NvU32, 0)]) +NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS: TypeAlias = struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS +NVC36F_CTRL_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS: TypeAlias = struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS(c.Struct): + SIZE = 6 + cpuCapability: int + gpusCapability: int + environment: int + ccFeature: int + devToolsMode: int + multiGpuMode: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS.register_fields([('cpuCapability', NvU8, 0), ('gpusCapability', NvU8, 1), ('environment', NvU8, 2), ('ccFeature', NvU8, 3), ('devToolsMode', NvU8, 4), ('multiGpuMode', NvU8, 5)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS(c.Struct): + SIZE = 24 + hSubDevice: int + protectedMemSizeInKb: int + unprotectedMemSizeInKb: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('protectedMemSizeInKb', NvU64, 8), ('unprotectedMemSizeInKb', NvU64, 16)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS(c.Struct): + SIZE = 24 + hSubDevice: int + protectedMemSizeInKb: int + unprotectedMemSizeInKb: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('protectedMemSizeInKb', NvU64, 8), ('unprotectedMemSizeInKb', NvU64, 16)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 12 + hSubDevice: int + numSupportedSec2CCSecureChannels: int + numSupportedCeCCSecureChannels: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('numSupportedSec2CCSecureChannels', NvU32, 4), ('numSupportedCeCCSecureChannels', NvU32, 8)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS(c.Struct): + SIZE = 9228 + hSubDevice: int + certChain: c.Array[ctypes.c_ubyte, Literal[4096]] + certChainSize: int + attestationCertChain: c.Array[ctypes.c_ubyte, Literal[5120]] + attestationCertChainSize: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('certChain', c.Array[NvU8, Literal[4096]], 4), ('certChainSize', NvU32, 4100), ('attestationCertChain', c.Array[NvU8, Literal[5120]], 4104), ('attestationCertChainSize', NvU32, 9224)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS(c.Struct): + SIZE = 12336 + hSubDevice: int + nonce: c.Array[ctypes.c_ubyte, Literal[32]] + attestationReport: c.Array[ctypes.c_ubyte, Literal[8192]] + attestationReportSize: int + isCecAttestationReportPresent: int + cecAttestationReport: c.Array[ctypes.c_ubyte, Literal[4096]] + cecAttestationReportSize: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('nonce', c.Array[NvU8, Literal[32]], 4), ('attestationReport', c.Array[NvU8, Literal[8192]], 36), ('attestationReportSize', NvU32, 8228), ('isCecAttestationReportPresent', NvBool, 8232), ('cecAttestationReport', c.Array[NvU8, Literal[4096]], 8233), ('cecAttestationReportSize', NvU32, 12332)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 12 + hSubDevice: int + maxSec2Channels: int + maxCeChannels: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('maxSec2Channels', NvU32, 4), ('maxCeChannels', NvU32, 8)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS(c.Struct): + SIZE = 8 + hSubDevice: int + keyRotationState: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('keyRotationState', NvU32, 4)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS +@c.record +class struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS(c.Struct): + SIZE = 3 + bEnable: int + bSkipSubmit: int + bSkipEnable: int +NVA06C_CTRL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS.register_fields([('bEnable', NvBool, 0), ('bSkipSubmit', NvBool, 1), ('bSkipEnable', NvBool, 2)]) +@c.record +class struct_NVA06F_CTRL_BIND_PARAMS(c.Struct): + SIZE = 4 + engineType: int +NVA06C_CTRL_BIND_PARAMS: TypeAlias = struct_NVA06F_CTRL_BIND_PARAMS +struct_NVA06F_CTRL_BIND_PARAMS.register_fields([('engineType', NvU32, 0)]) +@c.record +class struct_NVA06C_CTRL_TIMESLICE_PARAMS(c.Struct): + SIZE = 8 + timesliceUs: int +struct_NVA06C_CTRL_TIMESLICE_PARAMS.register_fields([('timesliceUs', NvU64, 0)]) +NVA06C_CTRL_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +NVA06C_CTRL_SET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +NVA06C_CTRL_GET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +@c.record +class struct_NVA06C_CTRL_PREEMPT_PARAMS(c.Struct): + SIZE = 8 + bWait: int + bManualTimeout: int + timeoutUs: int +struct_NVA06C_CTRL_PREEMPT_PARAMS.register_fields([('bWait', NvBool, 0), ('bManualTimeout', NvBool, 1), ('timeoutUs', NvU32, 4)]) +NVA06C_CTRL_PREEMPT_PARAMS: TypeAlias = struct_NVA06C_CTRL_PREEMPT_PARAMS +@c.record +class struct_NVA06C_CTRL_GET_INFO_PARAMS(c.Struct): + SIZE = 4 + tsgID: int +struct_NVA06C_CTRL_GET_INFO_PARAMS.register_fields([('tsgID', NvU32, 0)]) +NVA06C_CTRL_GET_INFO_PARAMS: TypeAlias = struct_NVA06C_CTRL_GET_INFO_PARAMS +@c.record +class struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS(c.Struct): + SIZE = 4 + tsgInterleaveLevel: int +struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS.register_fields([('tsgInterleaveLevel', NvU32, 0)]) +NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06C_CTRL_SET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06C_CTRL_GET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +enum_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE: dict[int, str] = {(NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_NONE:=0): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_NONE', (NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_64B:=1): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_64B', (NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_128B:=2): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_128B'} +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD(c.Struct): + SIZE = 4 + size: int +struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD.register_fields([('size', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE, 0)]) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD: TypeAlias = struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD +@c.record +class struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS(c.Struct): + SIZE = 8 + l1: struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD + t1: struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD +struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS.register_fields([('l1', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD, 0), ('t1', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD, 4)]) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS: TypeAlias = struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS +@c.record +class struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS(c.Struct): + SIZE = 88 + methodBufferMemdesc: c.Array[struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]] + bar2Addr: c.Array[ctypes.c_uint64, Literal[2]] + numValidEntries: int +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO(c.Struct): + SIZE = 32 + base: int + size: int + alignment: int + addressSpace: int + cpuCacheAttrib: int +NV2080_CTRL_INTERNAL_MEMDESC_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO +struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('alignment', NvU64, 16), ('addressSpace', NvU32, 24), ('cpuCacheAttrib', NvU32, 28)]) +struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS.register_fields([('methodBufferMemdesc', c.Array[NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], 0), ('bar2Addr', c.Array[NvU64, Literal[2]], 64), ('numValidEntries', NvU32, 80)]) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS +@c.record +class struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS(c.Struct): + SIZE = 1 + bRealtime: int +struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS.register_fields([('bRealtime', NvBool, 0)]) +NVA06C_CTRL_MAKE_REALTIME_PARAMS: TypeAlias = struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS +NVA06C_CTRL_INTERNAL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +NVA06C_CTRL_INTERNAL_SET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS(c.Struct): + SIZE = 16 + hSubDevice: int + subDeviceId: int + pFmt: ctypes.c_void_p +struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pFmt', NvP64, 8)]) +NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS +@c.record +class struct_NV_CTRL_VASPACE_PAGE_LEVEL(c.Struct): + SIZE = 112 + pFmt: c.POINTER[struct_MMU_FMT_LEVEL] + levelFmt: struct_MMU_FMT_LEVEL + sublevelFmt: c.Array[struct_MMU_FMT_LEVEL, Literal[2]] + physAddress: int + aperture: int + size: int + entryIndex: int +@c.record +class struct_MMU_FMT_LEVEL(c.Struct): + SIZE = 24 + virtAddrBitLo: int + virtAddrBitHi: int + entrySize: int + bPageTable: int + numSubLevels: int + pageLevelIdTag: int + subLevels: c.POINTER[struct_MMU_FMT_LEVEL] +struct_MMU_FMT_LEVEL.register_fields([('virtAddrBitLo', NvU8, 0), ('virtAddrBitHi', NvU8, 1), ('entrySize', NvU8, 2), ('bPageTable', NvBool, 3), ('numSubLevels', NvU8, 4), ('pageLevelIdTag', NvU32, 8), ('subLevels', c.POINTER[struct_MMU_FMT_LEVEL], 16)]) +MMU_FMT_LEVEL: TypeAlias = struct_MMU_FMT_LEVEL +struct_NV_CTRL_VASPACE_PAGE_LEVEL.register_fields([('pFmt', c.POINTER[struct_MMU_FMT_LEVEL], 0), ('levelFmt', MMU_FMT_LEVEL, 8), ('sublevelFmt', c.Array[MMU_FMT_LEVEL, Literal[2]], 32), ('physAddress', NvU64, 80), ('aperture', NvU32, 88), ('size', NvU64, 96), ('entryIndex', NvU32, 104)]) +NV_CTRL_VASPACE_PAGE_LEVEL: TypeAlias = struct_NV_CTRL_VASPACE_PAGE_LEVEL +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS(c.Struct): + SIZE = 712 + hSubDevice: int + subDeviceId: int + virtAddress: int + pageSize: int + flags: int + numLevels: int + levels: c.Array[struct_NV_CTRL_VASPACE_PAGE_LEVEL, Literal[6]] +struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('virtAddress', NvU64, 8), ('pageSize', NvU64, 16), ('flags', NvU64, 24), ('numLevels', NvU32, 32), ('levels', c.Array[NV_CTRL_VASPACE_PAGE_LEVEL, Literal[6]], 40)]) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int +struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24)]) +NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int +struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24)]) +NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_VERIF_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS(c.Struct): + SIZE = 184 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int + numLevelsToCopy: int + levels: c.Array[struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level, Literal[6]] +@c.record +class struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level(c.Struct): + SIZE = 24 + physAddress: int + size: int + aperture: int + pageShift: int +struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level.register_fields([('physAddress', NvU64, 0), ('size', NvU64, 8), ('aperture', NvU32, 16), ('pageShift', NvU8, 20)]) +struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24), ('numLevelsToCopy', NvU32, 32), ('levels', c.Array[struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level, Literal[6]], 40)]) +NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS(c.Struct): + SIZE = 16 + hSubDevice: int + subDeviceId: int + requiredVaRange: int +struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('requiredVaRange', NvU64, 8)]) +NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS(c.Struct): + SIZE = 56 + hSubDevice: int + subDeviceId: int + bytesFree: int + bytesTotal: int + largestFreeOffset: int + largestFreeSize: int + usableBytesFree: int + numFreeBlocks: int +struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('bytesFree', NvU64, 8), ('bytesTotal', NvU64, 16), ('largestFreeOffset', NvU64, 24), ('largestFreeSize', NvU64, 32), ('usableBytesFree', NvU64, 40), ('numFreeBlocks', NvU32, 48)]) +NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS +NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +NVA06F_CTRL_BIND_PARAMS: TypeAlias = struct_NVA06F_CTRL_BIND_PARAMS +@c.record +class struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS(c.Struct): + SIZE = 1 + bNotifyEachChannelInTSG: int +struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS.register_fields([('bNotifyEachChannelInTSG', NvBool, 0)]) +NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS: TypeAlias = struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS +@c.record +class struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS(c.Struct): + SIZE = 4 + channelInterleaveLevel: int +struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS.register_fields([('channelInterleaveLevel', NvU32, 0)]) +NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06F_CTRL_SET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06F_CTRL_GET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +@c.record +class struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS(c.Struct): + SIZE = 2 + bForceRestart: int + bBypassWait: int +struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS.register_fields([('bForceRestart', NvBool, 0), ('bBypassWait', NvBool, 1)]) +NVA06F_CTRL_RESTART_RUNLIST_PARAMS: TypeAlias = struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS +@c.record +class struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS(c.Struct): + SIZE = 1 + bImmediate: int +struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS.register_fields([('bImmediate', NvBool, 0)]) +NVA06F_CTRL_STOP_CHANNEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS +@c.record +class struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS(c.Struct): + SIZE = 4 + contextId: int +struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS.register_fields([('contextId', NvU32, 0)]) +NVA06F_CTRL_GET_CONTEXT_ID_PARAMS: TypeAlias = struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS(c.Struct): + SIZE = 12 + hObject: int + mapFlags: int + addrSpaceType: int +struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS.register_fields([('hObject', NvHandle, 0), ('mapFlags', NvU32, 4), ('addrSpaceType', NvU32, 8)]) +NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS(c.Struct): + SIZE = 16 + hObject: int + index: int + data: struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data +@c.record +class struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data(c.Struct): + SIZE = 8 + hResult: int + iResult: int +struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data.register_fields([('hResult', NvHandle, 0), ('iResult', NvU64, 0)]) +struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS.register_fields([('hObject', NvHandle, 0), ('index', NvU32, 4), ('data', struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data, 8)]) +NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS(c.Struct): + SIZE = 12 + hObject: int + hClient: int + maskResult: struct_RS_ACCESS_MASK +struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS.register_fields([('hObject', NvHandle, 0), ('hClient', NvHandle, 4), ('maskResult', RS_ACCESS_MASK, 8)]) +NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS(c.Struct): + SIZE = 12 + sharePolicy: struct_RS_SHARE_POLICY +struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS.register_fields([('sharePolicy', RS_SHARE_POLICY, 0)]) +NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS(c.Struct): + SIZE = 12 + hParent: int + classId: int + hObject: int +struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS.register_fields([('hParent', NvHandle, 0), ('classId', NvU32, 4), ('hObject', NvHandle, 8)]) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS(c.Struct): + SIZE = 16 + hObject: int + sharePolicy: struct_RS_SHARE_POLICY +struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS.register_fields([('hObject', NvHandle, 0), ('sharePolicy', RS_SHARE_POLICY, 4)]) +NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS(c.Struct): + SIZE = 12 + hObject1: int + hObject2: int + bDuplicates: int +struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS.register_fields([('hObject1', NvHandle, 0), ('hObject2', NvHandle, 4), ('bDuplicates', NvBool, 8)]) +NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS(c.Struct): + SIZE = 16 + devDescriptor: int + channel: int +struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS.register_fields([('devDescriptor', NvU64, 0), ('channel', NvU32, 8)]) +NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS(c.Struct): + SIZE = 16 + state: int + count: int + missedCount: int + bCircularBuffer: int +struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS.register_fields([('state', NvU32, 0), ('count', NvU32, 4), ('missedCount', NvU32, 8), ('bCircularBuffer', NvBool, 12)]) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS(c.Struct): + SIZE = 8 + state: int + bCircularBuffer: int +struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS.register_fields([('state', NvU32, 0), ('bCircularBuffer', NvBool, 4)]) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY(c.Struct): + SIZE = 56 + counter: int + line: int + filename: c.Array[ctypes.c_ubyte, Literal[12]] + tag: int + cpuNum: int + irql: int + threadId: int + data0: int + data1: int + data2: int +struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY.register_fields([('counter', NvU64, 0), ('line', NvU32, 8), ('filename', c.Array[NvU8, Literal[12]], 12), ('tag', NvU16, 24), ('cpuNum', NvU8, 26), ('irql', NvU8, 27), ('threadId', NvU64, 32), ('data0', NvU32, 40), ('data1', NvU32, 44), ('data2', NvU32, 48)]) +NV0000_CTRL_DIAG_LOCK_METER_ENTRY: TypeAlias = struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY +@c.record +class struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS(c.Struct): + SIZE = 3592 + entryCount: int + entries: c.Array[struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY, Literal[64]] +struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS.register_fields([('entryCount', NvU32, 0), ('entries', c.Array[NV0000_CTRL_DIAG_LOCK_METER_ENTRY, Literal[64]], 8)]) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS +@c.record +class struct_RPC_METER_ENTRY(c.Struct): + SIZE = 32 + startTimeInNs: int + endTimeInNs: int + rpcDataTag: int + rpcExtraData: int +struct_RPC_METER_ENTRY.register_fields([('startTimeInNs', NvU64, 0), ('endTimeInNs', NvU64, 8), ('rpcDataTag', NvU64, 16), ('rpcExtraData', NvU64, 24)]) +RPC_METER_ENTRY: TypeAlias = struct_RPC_METER_ENTRY +@c.record +class struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS(c.Struct): + SIZE = 4 + rpcProfileCmd: int +struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS.register_fields([('rpcProfileCmd', NvU32, 0)]) +NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS(c.Struct): + SIZE = 3224 + firstEntryOffset: int + outputEntryCount: int + remainingEntryCount: int + elapsedTimeInNs: int + rpcProfilerBuffer: c.Array[struct_RPC_METER_ENTRY, Literal[100]] +struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS.register_fields([('firstEntryOffset', NvU32, 0), ('outputEntryCount', NvU32, 4), ('remainingEntryCount', NvU32, 8), ('elapsedTimeInNs', NvU64, 16), ('rpcProfilerBuffer', c.Array[RPC_METER_ENTRY, Literal[100]], 24)]) +NV0000_CTRL_DIAG_DUMP_RPC_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS +@c.record +class struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS(c.Struct): + SIZE = 8 + event: int + action: int +struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS.register_fields([('event', NvU32, 0), ('action', NvU32, 4)]) +NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS: TypeAlias = struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE(c.Struct): + SIZE = 4 + deviceMask: int +struct_NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE.register_fields([('deviceMask', NvU32, 0)]) +NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE: TypeAlias = struct_NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE +@c.record +class struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND: TypeAlias = struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND +@c.record +class struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND: TypeAlias = struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND +@c.record +class struct_NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND(c.Struct): + SIZE = 8 + gpuId: int + bBind: int +struct_NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND.register_fields([('gpuId', NvU32, 0), ('bBind', NvBool, 4)]) +NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND: TypeAlias = struct_NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND +@c.record +class struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS(c.Struct): + SIZE = 12 + event: int + data: struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_data +@c.record +class struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_data(c.Struct): + SIZE = 8 + display: struct_NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE + vgpuUnbind: struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND + vgpuBind: struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND + gpuBindUnbind: struct_NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND +struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_data.register_fields([('display', NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE, 0), ('vgpuUnbind', NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND, 0), ('vgpuBind', NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND, 0), ('gpuBindUnbind', NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND, 0)]) +struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS.register_fields([('event', NvU32, 0), ('data', struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_data, 4)]) +NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_MASK(c.Struct): + SIZE = 16 + lenMasks: int + masks: c.Array[ctypes.c_uint64, Literal[1]] +NV0000_CTRL_NVLINK_LINK_MASK: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_NVLINK_LINK_MASK.register_fields([('lenMasks', NvU8, 0), ('masks', c.Array[NvU64, Literal[1]], 8)]) +@c.record +class struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS(c.Struct): + SIZE = 128 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0)]) +NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS(c.Struct): + SIZE = 40 + gpuId: int + gpuFlags: int + deviceInstance: int + subDeviceInstance: int + szName: ctypes.c_void_p + sliStatus: int + boardId: int + gpuInstance: int + numaId: int +struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('gpuFlags', NvU32, 4), ('deviceInstance', NvU32, 8), ('subDeviceInstance', NvU32, 12), ('szName', NvP64, 16), ('sliStatus', NvU32, 24), ('boardId', NvU32, 28), ('gpuInstance', NvU32, 32), ('numaId', NvS32, 36)]) +NV0000_CTRL_GPU_GET_ID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS(c.Struct): + SIZE = 32 + gpuId: int + gpuFlags: int + deviceInstance: int + subDeviceInstance: int + sliStatus: int + boardId: int + gpuInstance: int + numaId: int +struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS.register_fields([('gpuId', NvU32, 0), ('gpuFlags', NvU32, 4), ('deviceInstance', NvU32, 8), ('subDeviceInstance', NvU32, 12), ('sliStatus', NvU32, 16), ('boardId', NvU32, 20), ('gpuInstance', NvU32, 24), ('numaId', NvS32, 28)]) +NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + status: int +struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS.register_fields([('gpuId', NvU32, 0), ('status', NvU32, 4)]) +NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS(c.Struct): + SIZE = 4 + deviceIds: int +struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS.register_fields([('deviceIds', NvU32, 0)]) +NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS(c.Struct): + SIZE = 384 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + excludedGpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuFlags: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('excludedGpuIds', c.Array[NvU32, Literal[32]], 128), ('gpuFlags', c.Array[NvU32, Literal[32]], 256)]) +NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + domain: int + bus: int + slot: int +struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('domain', NvU32, 4), ('bus', NvU16, 8), ('slot', NvU16, 10)]) +NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS(c.Struct): + SIZE = 132 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + failedId: int +struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('failedId', NvU32, 128)]) +NV0000_CTRL_GPU_ATTACH_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS(c.Struct): + SIZE = 128 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0)]) +NV0000_CTRL_GPU_DETACH_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_VIDEO_LINKS(c.Struct): + SIZE = 36 + gpuId: int + connectedGpuIds: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV0000_CTRL_GPU_VIDEO_LINKS.register_fields([('gpuId', NvU32, 0), ('connectedGpuIds', c.Array[NvU32, Literal[8]], 4)]) +NV0000_CTRL_GPU_VIDEO_LINKS: TypeAlias = struct_NV0000_CTRL_GPU_VIDEO_LINKS +@c.record +class struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS(c.Struct): + SIZE = 1152 + links: c.Array[struct_NV0000_CTRL_GPU_VIDEO_LINKS, Literal[32]] +struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS.register_fields([('links', c.Array[NV0000_CTRL_GPU_VIDEO_LINKS, Literal[32]], 0)]) +NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + svmSize: int +struct_NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS.register_fields([('gpuId', NvU32, 0), ('svmSize', NvU32, 4)]) +NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS(c.Struct): + SIZE = 272 + gpuUuid: c.Array[ctypes.c_ubyte, Literal[256]] + flags: int + gpuId: int + deviceInstance: int + subdeviceInstance: int +struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS.register_fields([('gpuUuid', c.Array[NvU8, Literal[256]], 0), ('flags', NvU32, 256), ('gpuId', NvU32, 260), ('deviceInstance', NvU32, 264), ('subdeviceInstance', NvU32, 268)]) +NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS(c.Struct): + SIZE = 268 + gpuId: int + flags: int + gpuUuid: c.Array[ctypes.c_ubyte, Literal[256]] + uuidStrLen: int +struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS.register_fields([('gpuId', NvU32, 0), ('flags', NvU32, 4), ('gpuUuid', c.Array[NvU8, Literal[256]], 8), ('uuidStrLen', NvU32, 264)]) +NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + newState: int + flags: int +struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('newState', NvU32, 4), ('flags', NvU32, 8)]) +NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + drainState: int + flags: int +struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('drainState', NvU32, 4), ('flags', NvU32, 8)]) +NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DISCOVER_PARAMS(c.Struct): + SIZE = 8 + domain: int + bus: int + slot: int + function: int +struct_NV0000_CTRL_GPU_DISCOVER_PARAMS.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('function', NvU8, 6)]) +NV0000_CTRL_GPU_DISCOVER_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DISCOVER_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS(c.Struct): + SIZE = 4 + enableMask: int +struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS.register_fields([('enableMask', NvU32, 0)]) +NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS(c.Struct): + SIZE = 32 + gpuId: int + mask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + bSkipHwNvlinkDisable: int +struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS.register_fields([('gpuId', NvU32, 0), ('mask', NvU32, 4), ('links', NV0000_CTRL_NVLINK_LINK_MASK, 8), ('bSkipHwNvlinkDisable', NvBool, 24)]) +NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS(c.Struct): + SIZE = 396 + hContext: int + opType: int + index: int + dataType: int + data: struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data(c.Struct): + SIZE = 380 + configEx: struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configEx + reservedProperty: struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_reservedProperty +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configEx(c.Struct): + SIZE = 380 + paramData: c.Array[ctypes.c_ubyte, Literal[373]] + paramSize: int +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configEx.register_fields([('paramData', c.Array[NvU8, Literal[373]], 0), ('paramSize', NvU32, 376)]) +@c.record +class struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_reservedProperty(c.Struct): + SIZE = 48 + propertyId: int + propertyIn: c.Array[ctypes.c_uint32, Literal[6]] + propertyOut: c.Array[ctypes.c_uint32, Literal[5]] +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_reservedProperty.register_fields([('propertyId', NvU32, 0), ('propertyIn', c.Array[NvU32, Literal[6]], 4), ('propertyOut', c.Array[NvU32, Literal[5]], 28)]) +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data.register_fields([('configEx', struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_configEx, 0), ('reservedProperty', struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data_reservedProperty, 0)]) +struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS.register_fields([('hContext', NvHandle, 0), ('opType', NvU32, 4), ('index', NvV32, 8), ('dataType', NvU32, 12), ('data', struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_data, 16)]) +NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS(c.Struct): + SIZE = 48 + hDevice: int + hChannel: int + numChannels: int + phClients: ctypes.c_void_p + phDevices: ctypes.c_void_p + phChannels: ctypes.c_void_p + flags: int + timeout: int +struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS.register_fields([('hDevice', NvHandle, 0), ('hChannel', NvHandle, 4), ('numChannels', NvV32, 8), ('phClients', NvP64, 16), ('phDevices', NvP64, 24), ('phChannels', NvP64, 32), ('flags', NvV32, 40), ('timeout', NvV32, 44)]) +NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS(c.Struct): + SIZE = 24 + image: int + totalSize: int + pData: ctypes.c_void_p +struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS.register_fields([('image', NvU8, 0), ('totalSize', NvU64, 8), ('pData', NvP64, 16)]) +NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS(c.Struct): + SIZE = 1 + mode: int +struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS.register_fields([('mode', NvU8, 0)]) +NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS(c.Struct): + SIZE = 2 + mode: int + bwModeScope: int +struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS.register_fields([('mode', NvU8, 0), ('bwModeScope', NvU8, 1)]) +NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ACTIVE_DEVICE(c.Struct): + SIZE = 12 + gpuId: int + gpuInstanceId: int + computeInstanceId: int +struct_NV0000_CTRL_GPU_ACTIVE_DEVICE.register_fields([('gpuId', NvU32, 0), ('gpuInstanceId', NvU32, 4), ('computeInstanceId', NvU32, 8)]) +NV0000_CTRL_GPU_ACTIVE_DEVICE: TypeAlias = struct_NV0000_CTRL_GPU_ACTIVE_DEVICE +@c.record +class struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS(c.Struct): + SIZE = 3076 + numDevices: int + devices: c.Array[struct_NV0000_CTRL_GPU_ACTIVE_DEVICE, Literal[256]] +struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS.register_fields([('numDevices', NvU32, 0), ('devices', c.Array[NV0000_CTRL_GPU_ACTIVE_DEVICE, Literal[256]], 4)]) +NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + pid: int + newState: int +struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('newState', NvU32, 8)]) +NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + pid: int + state: int +struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('state', NvU32, 8)]) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS(c.Struct): + SIZE = 48 + gpuId: int + pid: int + subPid: int + gpuUtil: int + fbUtil: int + maxFbUsage: int + startTime: int + endTime: int +struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('subPid', NvU32, 8), ('gpuUtil', NvU32, 12), ('fbUtil', NvU32, 16), ('maxFbUsage', NvU64, 24), ('startTime', NvU64, 32), ('endTime', NvU64, 40)]) +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS(c.Struct): + SIZE = 16012 + gpuId: int + pid: int + pidTbl: c.Array[ctypes.c_uint32, Literal[4000]] + pidCount: int +struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('pidTbl', c.Array[NvU32, Literal[4000]], 8), ('pidCount', NvU32, 16008)]) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + pid: int +struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4)]) +NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS(c.Struct): + SIZE = 16 + gsyncIds: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS.register_fields([('gsyncIds', c.Array[NvU32, Literal[4]], 0)]) +NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS(c.Struct): + SIZE = 12 + gsyncId: int + gsyncFlags: int + gsyncInstance: int +struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS.register_fields([('gsyncId', NvU32, 0), ('gsyncFlags', NvU32, 4), ('gsyncInstance', NvU32, 8)]) +NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS(c.Struct): + SIZE = 8 + component: int + size: int +struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS.register_fields([('component', NvU32, 0), ('size', NvU32, 4)]) +NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS(c.Struct): + SIZE = 16 + pBuffer: ctypes.c_void_p + component: int + size: int +struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS.register_fields([('pBuffer', NvP64, 0), ('component', NvU32, 8), ('size', NvU32, 12)]) +NV0000_CTRL_NVD_GET_DUMP_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS(c.Struct): + SIZE = 16 + timestamp: int + cpuClkId: int +struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS.register_fields([('timestamp', NvU64, 0), ('cpuClkId', NvU8, 8)]) +NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS(c.Struct): + SIZE = 15404 + component: int + version: int + runtimeSizes: c.Array[ctypes.c_ubyte, Literal[16]] + printFlags: int + signature: c.Array[ctypes.c_uint32, Literal[4]] + bufferTags: c.Array[ctypes.c_uint32, Literal[3840]] +struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS.register_fields([('component', NvU32, 0), ('version', NvU32, 4), ('runtimeSizes', c.Array[NvU8, Literal[16]], 8), ('printFlags', NvU32, 24), ('signature', c.Array[NvU32, Literal[4]], 28), ('bufferTags', c.Array[NvU32, Literal[3840]], 44)]) +NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 28 + component: int + buffer: int + tag: int + size: int + flags: int + pos: int + overflow: int +struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS.register_fields([('component', NvU32, 0), ('buffer', NvU32, 4), ('tag', NvU32, 8), ('size', NvU32, 12), ('flags', NvU32, 16), ('pos', NvU32, 20), ('overflow', NvU32, 24)]) +NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS(c.Struct): + SIZE = 4016 + component: int + buffer: int + blockNum: int + size: int + data: c.Array[ctypes.c_ubyte, Literal[4000]] +struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS.register_fields([('component', NvU32, 0), ('buffer', NvU32, 4), ('blockNum', NvU32, 8), ('size', NvU32, 12), ('data', c.Array[NvU8, Literal[4000]], 16)]) +NV0000_CTRL_NVD_GET_NVLOG_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY(c.Struct): + SIZE = 12 + tag: int + value: int + attribute: int +struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY.register_fields([('tag', NvU32, 0), ('value', NvU32, 4), ('attribute', NvU32, 8)]) +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY: TypeAlias = struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY +@c.record +class struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS(c.Struct): + SIZE = 2436 + reqIdx: int + rptIdx: int + GPUTag: int + rptTime: int + startIdx: int + endIdx: int + rptType: int + flags: int + rptCount: int + owner: int + processId: int + report: c.Array[struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY, Literal[200]] +struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS.register_fields([('reqIdx', NvU16, 0), ('rptIdx', NvU16, 2), ('GPUTag', NvU32, 4), ('rptTime', NvU32, 8), ('startIdx', NvU16, 12), ('endIdx', NvU16, 14), ('rptType', NvU16, 16), ('flags', NvU32, 20), ('rptCount', NvU16, 24), ('owner', NvU32, 28), ('processId', NvU32, 32), ('report', c.Array[NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY, Literal[200]], 36)]) +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS(c.Struct): + SIZE = 16 + tsBufferSize: int + pTSBuffer: ctypes.c_void_p +struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS.register_fields([('tsBufferSize', NvU32, 0), ('pTSBuffer', NvP64, 8)]) +NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS +@c.record +class struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS(c.Struct): + SIZE = 104 + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] +struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS.register_fields([('subProcessID', NvU32, 0), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 4)]) +NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS +@c.record +class struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS(c.Struct): + SIZE = 1 + bIsSubProcessDisabled: int +struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS.register_fields([('bIsSubProcessDisabled', NvBool, 0)]) +NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS: TypeAlias = struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS(c.Struct): + SIZE = 1 + bEnabled: int +struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS.register_fields([('bEnabled', NvBool, 0)]) +NV0000_SYNC_GPU_BOOST_INFO_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG(c.Struct): + SIZE = 140 + gpuCount: int + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + boostGroupId: int + bBridgeless: int +struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG.register_fields([('gpuCount', NvU32, 0), ('gpuIds', c.Array[NvU32, Literal[32]], 4), ('boostGroupId', NvU32, 132), ('bBridgeless', NvBool, 136)]) +NV0000_SYNC_GPU_BOOST_GROUP_CONFIG: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS(c.Struct): + SIZE = 140 + boostConfig: struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG +struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS.register_fields([('boostConfig', NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, 0)]) +NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS(c.Struct): + SIZE = 4 + boostGroupId: int +struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS.register_fields([('boostGroupId', NvU32, 0)]) +NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS(c.Struct): + SIZE = 2244 + groupCount: int + pBoostGroups: c.Array[struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, Literal[16]] +struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS.register_fields([('groupCount', NvU32, 0), ('pBoostGroups', c.Array[NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, Literal[16]], 4)]) +NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS(c.Struct): + SIZE = 4 + featuresMask: int +struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS.register_fields([('featuresMask', NvU32, 0)]) +NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS(c.Struct): + SIZE = 40 + sizeOfStrings: int + pDriverVersionBuffer: ctypes.c_void_p + pVersionBuffer: ctypes.c_void_p + pTitleBuffer: ctypes.c_void_p + changelistNumber: int + officialChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS.register_fields([('sizeOfStrings', NvU32, 0), ('pDriverVersionBuffer', NvP64, 8), ('pVersionBuffer', NvP64, 16), ('pTitleBuffer', NvP64, 24), ('changelistNumber', NvU32, 32), ('officialChangelistNumber', NvU32, 36)]) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS +enum_NV0000_CTRL_SYSTEM_SH_SOC_TYPE: dict[int, str] = {(NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NA:=0): 'NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NA', (NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NV_GRACE:=1): 'NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NV_GRACE'} +NV0000_CTRL_SYSTEM_SH_SOC_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS(c.Struct): + SIZE = 108 + type: int + capabilities: int + clock: int + L1DataCacheSize: int + L2DataCacheSize: int + dataCacheLineSize: int + numLogicalCpus: int + numPhysicalCpus: int + name: c.Array[ctypes.c_ubyte, Literal[52]] + family: int + model: int + stepping: int + coresOnDie: int + bCCEnabled: int + selfHostedSocType: int +struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS.register_fields([('type', NvU32, 0), ('capabilities', NvU32, 4), ('clock', NvU32, 8), ('L1DataCacheSize', NvU32, 12), ('L2DataCacheSize', NvU32, 16), ('dataCacheLineSize', NvU32, 20), ('numLogicalCpus', NvU32, 24), ('numPhysicalCpus', NvU32, 28), ('name', c.Array[NvU8, Literal[52]], 32), ('family', NvU32, 84), ('model', NvU32, 88), ('stepping', NvU8, 92), ('coresOnDie', NvU32, 96), ('bCCEnabled', NvBool, 100), ('selfHostedSocType', NV0000_CTRL_SYSTEM_SH_SOC_TYPE, 104)]) +NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS(c.Struct): + SIZE = 152 + vendorId: int + deviceId: int + subSysVendorId: int + subSysDeviceId: int + HBvendorId: int + HBdeviceId: int + HBsubSysVendorId: int + HBsubSysDeviceId: int + sliBondId: int + vendorNameString: c.Array[ctypes.c_ubyte, Literal[32]] + subSysVendorNameString: c.Array[ctypes.c_ubyte, Literal[32]] + chipsetNameString: c.Array[ctypes.c_ubyte, Literal[32]] + sliBondNameString: c.Array[ctypes.c_ubyte, Literal[32]] + flags: int +struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS.register_fields([('vendorId', NvU16, 0), ('deviceId', NvU16, 2), ('subSysVendorId', NvU16, 4), ('subSysDeviceId', NvU16, 6), ('HBvendorId', NvU16, 8), ('HBdeviceId', NvU16, 10), ('HBsubSysVendorId', NvU16, 12), ('HBsubSysDeviceId', NvU16, 14), ('sliBondId', NvU32, 16), ('vendorNameString', c.Array[NvU8, Literal[32]], 20), ('subSysVendorNameString', c.Array[NvU8, Literal[32]], 52), ('chipsetNameString', c.Array[NvU8, Literal[32]], 84), ('sliBondNameString', c.Array[NvU8, Literal[32]], 116), ('flags', NvU32, 148)]) +NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS(c.Struct): + SIZE = 1 + bIsPresent: int +struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS.register_fields([('bIsPresent', NvBool, 0)]) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS(c.Struct): + SIZE = 40 + waitApiLock: int + holdRoApiLock: int + holdRwApiLock: int + waitGpuLock: int + holdGpuLock: int +struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS.register_fields([('waitApiLock', NvU64, 0), ('holdRoApiLock', NvU64, 8), ('holdRwApiLock', NvU64, 16), ('waitGpuLock', NvU64, 24), ('holdGpuLock', NvU64, 32)]) +NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS(c.Struct): + SIZE = 132 + numClasses: int + classes: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS.register_fields([('numClasses', NvU32, 0), ('classes', c.Array[NvU32, Literal[32]], 4)]) +NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS(c.Struct): + SIZE = 12 + eventType: int + eventData: int + bEventDataForced: int +struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS.register_fields([('eventType', NvU32, 0), ('eventData', NvU32, 4), ('bEventDataForced', NvBool, 8)]) +NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS(c.Struct): + SIZE = 4 + systemType: int +struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS.register_fields([('systemType', NvU32, 0)]) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS(c.Struct): + SIZE = 520 + cmd: int + count: int + data: c.Array[ctypes.c_ubyte, Literal[512]] +struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('count', NvU32, 4), ('data', c.Array[NvU8, Literal[512]], 8)]) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_HWBC_INFO(c.Struct): + SIZE = 16 + hwbcId: int + firmwareVersion: int + subordinateBus: int + secondaryBus: int +struct_NV0000_CTRL_SYSTEM_HWBC_INFO.register_fields([('hwbcId', NvU32, 0), ('firmwareVersion', NvU32, 4), ('subordinateBus', NvU32, 8), ('secondaryBus', NvU32, 12)]) +NV0000_CTRL_SYSTEM_HWBC_INFO: TypeAlias = struct_NV0000_CTRL_SYSTEM_HWBC_INFO +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS(c.Struct): + SIZE = 2048 + hwbcInfo: c.Array[struct_NV0000_CTRL_SYSTEM_HWBC_INFO, Literal[128]] +struct_NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS.register_fields([('hwbcInfo', c.Array[NV0000_CTRL_SYSTEM_HWBC_INFO, Literal[128]], 0)]) +NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS(c.Struct): + SIZE = 136 + cmdCount: int + succeeded: int + cmdData: c.Array[struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData, Literal[16]] +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS.register_fields([('cmdCount', NvU32, 0), ('succeeded', NvU32, 4), ('cmdData', c.Array[struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData, Literal[16]], 8)]) +NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 176 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuCount: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerIds: ctypes.c_void_p + busEgmPeerIds: ctypes.c_void_p +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('gpuCount', NvU32, 128), ('p2pCaps', NvU32, 132), ('p2pOptimalReadCEs', NvU32, 136), ('p2pOptimalWriteCEs', NvU32, 140), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 144), ('busPeerIds', NvP64, 160), ('busEgmPeerIds', NvP64, 168)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS(c.Struct): + SIZE = 8348 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuCount: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerIds: c.Array[ctypes.c_uint32, Literal[1024]] + busEgmPeerIds: c.Array[ctypes.c_uint32, Literal[1024]] +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('gpuCount', NvU32, 128), ('p2pCaps', NvU32, 132), ('p2pOptimalReadCEs', NvU32, 136), ('p2pOptimalWriteCEs', NvU32, 140), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 144), ('busPeerIds', c.Array[NvU32, Literal[1024]], 156), ('busEgmPeerIds', c.Array[NvU32, Literal[1024]], 4252)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS +NV0000_CTRL_P2P_CAPS_MATRIX_ROW: TypeAlias = c.Array[ctypes.c_uint32, Literal[8]] +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS(c.Struct): + SIZE = 1352 + grpACount: int + grpBCount: int + gpuIdGrpA: c.Array[ctypes.c_uint32, Literal[8]] + gpuIdGrpB: c.Array[ctypes.c_uint32, Literal[8]] + p2pCaps: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + a2bOptimalReadCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + a2bOptimalWriteCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + b2aOptimalReadCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + b2aOptimalWriteCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS.register_fields([('grpACount', NvU32, 0), ('grpBCount', NvU32, 4), ('gpuIdGrpA', c.Array[NvU32, Literal[8]], 8), ('gpuIdGrpB', c.Array[NvU32, Literal[8]], 40), ('p2pCaps', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 72), ('a2bOptimalReadCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 328), ('a2bOptimalWriteCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 584), ('b2aOptimalReadCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 840), ('b2aOptimalWriteCes', c.Array[NV0000_CTRL_P2P_CAPS_MATRIX_ROW, Literal[8]], 1096)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + input: c.Array[ctypes.c_int32, Literal[2]] + result: c.Array[ctypes.c_int32, Literal[4]] +struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('input', c.Array[NvS32, Literal[2]], 4), ('result', c.Array[NvS32, Literal[4]], 12)]) +NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS(c.Struct): + SIZE = 148 + objHndl: int + blockId: int + nextExpectedSampleTimems: int + countersReq: int + countersReturned: int + counterBlock: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS.register_fields([('objHndl', NvU32, 0), ('blockId', NvU32, 4), ('nextExpectedSampleTimems', NvU32, 8), ('countersReq', NvU32, 12), ('countersReturned', NvU32, 16), ('counterBlock', c.Array[NvU32, Literal[32]], 20)]) +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS(c.Struct): + SIZE = 1164 + cmd: int + input: int + resultSz: int + result: c.Array[ctypes.c_uint32, Literal[288]] +struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS.register_fields([('cmd', NvU32, 0), ('input', NvU32, 4), ('resultSz', NvU32, 8), ('result', c.Array[NvU32, Literal[288]], 12)]) +NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS(c.Struct): + SIZE = 40 + method: int + inData: ctypes.c_void_p + inDataSize: int + outStatus: int + outData: ctypes.c_void_p + outDataSize: int +struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS.register_fields([('method', NvU32, 0), ('inData', NvP64, 8), ('inDataSize', NvU16, 16), ('outStatus', NvU32, 20), ('outData', NvP64, 24), ('outDataSize', NvU16, 32)]) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS(c.Struct): + SIZE = 4 + moduleMask: int +struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS.register_fields([('moduleMask', NvU32, 0)]) +NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE(c.Struct): + SIZE = 8 + frameTime: int + renderTime: int + targetTime: int + sleepTime: int + sampleNumber: int +struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE.register_fields([('frameTime', NvU16, 0), ('renderTime', NvU16, 2), ('targetTime', NvU16, 4), ('sleepTime', NvU8, 6), ('sampleNumber', NvU8, 7)]) +NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS(c.Struct): + SIZE = 514 + samples: c.Array[struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, Literal[64]] + nextSampleNumber: int +struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS.register_fields([('samples', c.Array[NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, Literal[64]], 0), ('nextSampleNumber', NvU8, 512)]) +NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS(c.Struct): + SIZE = 8 + sampleData: struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE +struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS.register_fields([('sampleData', NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, 0)]) +NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS(c.Struct): + SIZE = 1288 + szHostDriverVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostTitleBuffer: c.Array[ctypes.c_char, Literal[256]] + szPluginTitleBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostUnameBuffer: c.Array[ctypes.c_char, Literal[256]] + iHostChangelistNumber: int + iPluginChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS.register_fields([('szHostDriverVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 0), ('szHostVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 256), ('szHostTitleBuffer', c.Array[ctypes.c_char, Literal[256]], 512), ('szPluginTitleBuffer', c.Array[ctypes.c_char, Literal[256]], 768), ('szHostUnameBuffer', c.Array[ctypes.c_char, Literal[256]], 1024), ('iHostChangelistNumber', NvU32, 1280), ('iPluginChangelistNumber', NvU32, 1284)]) +NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS(c.Struct): + SIZE = 65 + gpuCount: int + gpuBus: c.Array[ctypes.c_ubyte, Literal[32]] + gpuExternalPowerStatus: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS.register_fields([('gpuCount', NvU8, 0), ('gpuBus', c.Array[NvU8, Literal[32]], 1), ('gpuExternalPowerStatus', c.Array[NvU8, Literal[32]], 33)]) +NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS(c.Struct): + SIZE = 1 + privStatusFlags: int +struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS.register_fields([('privStatusFlags', NvU8, 0)]) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS +enum_NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS: dict[int, str] = {(NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_SKIP:=1): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_SKIP', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_UNINITIALIZED:=2): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_UNINITIALIZED', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_IN_PROGRESS:=3): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_IN_PROGRESS', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_INITIALIZED:=4): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_INITIALIZED'} +NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS(c.Struct): + SIZE = 4 + fabricStatus: int +struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS.register_fields([('fabricStatus', NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS, 0)]) +NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS(c.Struct): + SIZE = 16 + host_min_supported_version: int + host_max_supported_version: int + user_min_supported_version: int + user_max_supported_version: int +struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS.register_fields([('host_min_supported_version', NvU32, 0), ('host_max_supported_version', NvU32, 4), ('user_min_supported_version', NvU32, 8), ('user_max_supported_version', NvU32, 12)]) +NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS(c.Struct): + SIZE = 8 + min_version: int + max_version: int +struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS.register_fields([('min_version', NvU32, 0), ('max_version', NvU32, 4)]) +NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS(c.Struct): + SIZE = 8 + rm_instance_id: int +struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS.register_fields([('rm_instance_id', NvU64, 0)]) +NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT(c.Struct): + SIZE = 24 + batteryStateOfChargePercent: int + batteryCurrentLimitmA: int + restOfSytemReservedPowermW: int + minCpuTdpmW: int + maxCpuTdpmW: int + shortTimescaleBatteryCurrentLimitmA: int +struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT.register_fields([('batteryStateOfChargePercent', NvU8, 0), ('batteryCurrentLimitmA', NvU32, 4), ('restOfSytemReservedPowermW', NvU32, 8), ('minCpuTdpmW', NvU32, 12), ('maxCpuTdpmW', NvU32, 16), ('shortTimescaleBatteryCurrentLimitmA', NvU32, 20)]) +NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT +enum_QBOOST_CPU_TDP_CONTROL_TYPE: dict[int, str] = {(QBOOST_CPU_TDP_CONTROL_TYPE_DC_ONLY:=0): 'QBOOST_CPU_TDP_CONTROL_TYPE_DC_ONLY', (QBOOST_CPU_TDP_CONTROL_TYPE_DC_AC:=1): 'QBOOST_CPU_TDP_CONTROL_TYPE_DC_AC'} +QBOOST_CPU_TDP_CONTROL_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS(c.Struct): + SIZE = 876 + supportedFuncs: int + gpuId: int + tpp: int + ratedTgp: int + subFunc: int + ctgpOffsetmW: int + targetTppOffsetmW: int + maxOutputOffsetmW: int + minOutputOffsetmW: int + ctgpBattOffsetmW: int + targetTppBattOffsetmW: int + maxOutputBattOffsetmW: int + minOutputBattOffsetmW: int + dcRosReserveOverridemW: int + dcTspLongTimescaleLimitmA: int + dcTspShortTimescaleLimitmA: int + bEnableForAC: int + bEnableForDC: int + version: int + samplingPeriodmS: int + samplingMulti: int + filterType: int + filterParam: struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam + filterReserved: int + bIsBoostController: int + incRatio: int + decRatio: int + bSupportBatt: int + cpuType: int + gpuType: int + sysPwrIndex: int + sysPwrGetInfo: c.Array[struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT, Literal[32]] + bIsTspSupported: int + sysPwrLimitsTableVersion: int + type: int + cpuTdpmw: int + cpuTdpControlType: int +@c.record +class struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam(c.Struct): + SIZE = 1 + weight: int + windowSize: int +struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam.register_fields([('weight', NvU8, 0), ('windowSize', NvU8, 0)]) +struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS.register_fields([('supportedFuncs', NvU32, 0), ('gpuId', NvU32, 4), ('tpp', NvU32, 8), ('ratedTgp', NvU32, 12), ('subFunc', NvU32, 16), ('ctgpOffsetmW', NvS32, 20), ('targetTppOffsetmW', NvS32, 24), ('maxOutputOffsetmW', NvS32, 28), ('minOutputOffsetmW', NvS32, 32), ('ctgpBattOffsetmW', NvS32, 36), ('targetTppBattOffsetmW', NvS32, 40), ('maxOutputBattOffsetmW', NvS32, 44), ('minOutputBattOffsetmW', NvS32, 48), ('dcRosReserveOverridemW', NvU32, 52), ('dcTspLongTimescaleLimitmA', NvU32, 56), ('dcTspShortTimescaleLimitmA', NvU32, 60), ('bEnableForAC', NvBool, 64), ('bEnableForDC', NvBool, 65), ('version', NvU8, 66), ('samplingPeriodmS', NvU16, 68), ('samplingMulti', NvU16, 70), ('filterType', NvU8, 72), ('filterParam', struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam, 73), ('filterReserved', NvU16, 74), ('bIsBoostController', NvBool, 76), ('incRatio', NvU16, 78), ('decRatio', NvU16, 80), ('bSupportBatt', NvBool, 82), ('cpuType', NvU8, 83), ('gpuType', NvU8, 84), ('sysPwrIndex', NvU32, 88), ('sysPwrGetInfo', c.Array[NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT, Literal[32]], 92), ('bIsTspSupported', NvBool, 860), ('sysPwrLimitsTableVersion', NvU8, 861), ('type', NvU32, 864), ('cpuTdpmw', NvU32, 868), ('cpuTdpControlType', QBOOST_CPU_TDP_CONTROL_TYPE, 872)]) +NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS(c.Struct): + SIZE = 1 + bExternalFabricMgmt: int +struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS.register_fields([('bExternalFabricMgmt', NvBool, 0)]) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS(c.Struct): + SIZE = 16 + clientCount: int + resourceCount: int +struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS.register_fields([('clientCount', NvU32, 0), ('resourceCount', NvU64, 8)]) +NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS(c.Struct): + SIZE = 1032 + driverVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + versionBuffer: c.Array[ctypes.c_char, Literal[256]] + driverBranch: c.Array[ctypes.c_char, Literal[256]] + titleBuffer: c.Array[ctypes.c_char, Literal[256]] + changelistNumber: int + officialChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS.register_fields([('driverVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 0), ('versionBuffer', c.Array[ctypes.c_char, Literal[256]], 256), ('driverBranch', c.Array[ctypes.c_char, Literal[256]], 512), ('titleBuffer', c.Array[ctypes.c_char, Literal[256]], 768), ('changelistNumber', NvU32, 1024), ('officialChangelistNumber', NvU32, 1028)]) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS(c.Struct): + SIZE = 8 + cmd: int + mode: int +struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('mode', NvU32, 4)]) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS(c.Struct): + SIZE = 136 + cmdCount: int + succeeded: int + cmdData: c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData, Literal[16]] +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS.register_fields([('cmdCount', NvU32, 0), ('succeeded', NvU32, 4), ('cmdData', c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData, Literal[16]], 8)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + input: c.Array[ctypes.c_int32, Literal[2]] + result: c.Array[ctypes.c_int32, Literal[4]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('input', c.Array[NvS32, Literal[2]], 4), ('result', c.Array[NvS32, Literal[4]], 12)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS(c.Struct): + SIZE = 148 + objHndl: int + blockId: int + nextExpectedSampleTimems: int + countersReq: int + countersReturned: int + counterBlock: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS.register_fields([('objHndl', NvU32, 0), ('blockId', NvU32, 4), ('nextExpectedSampleTimems', NvU32, 8), ('countersReq', NvU32, 12), ('countersReturned', NvU32, 16), ('counterBlock', c.Array[NvU32, Literal[32]], 20)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS(c.Struct): + SIZE = 1164 + cmd: int + input: int + resultSz: int + result: c.Array[ctypes.c_uint32, Literal[288]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS.register_fields([('cmd', NvU32, 0), ('input', NvU32, 4), ('resultSz', NvU32, 8), ('result', c.Array[NvU32, Literal[288]], 12)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE(c.Struct): + SIZE = 8 + frameTime: int + renderTime: int + targetTime: int + sleepTime: int + sampleNumber: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE.register_fields([('frameTime', NvU16, 0), ('renderTime', NvU16, 2), ('targetTime', NvU16, 4), ('sleepTime', NvU8, 6), ('sampleNumber', NvU8, 7)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS(c.Struct): + SIZE = 514 + samples: c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, Literal[64]] + nextSampleNumber: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS.register_fields([('samples', c.Array[NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, Literal[64]], 0), ('nextSampleNumber', NvU8, 512)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS(c.Struct): + SIZE = 8 + sampleData: struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS.register_fields([('sampleData', NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, 0)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS(c.Struct): + SIZE = 40 + offset: int + length: int + cacheOps: int + hDevice: int + hObject: int + internalOnly: int +struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS.register_fields([('offset', NvU64, 0), ('length', NvU64, 8), ('cacheOps', NvU32, 16), ('hDevice', NvHandle, 20), ('hObject', NvHandle, 24), ('internalOnly', NvU64, 32)]) +NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS(c.Struct): + SIZE = 4 + fd: int +struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS.register_fields([('fd', NvS32, 0)]) +NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS +enum_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE: dict[int, str] = {(NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_NONE:=0): 'NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_NONE', (NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_RM:=1): 'NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_RM'} +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT(c.Struct): + SIZE = 16 + type: int + data: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data(c.Struct): + SIZE = 12 + rmObject: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject(c.Struct): + SIZE = 12 + hDevice: int + hParent: int + hObject: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject.register_fields([('hDevice', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8)]) +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data.register_fields([('rmObject', struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject, 0)]) +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT.register_fields([('type', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE, 0), ('data', struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data, 4)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS(c.Struct): + SIZE = 24 + object: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT + fd: int + flags: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS.register_fields([('object', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT, 0), ('fd', NvS32, 16), ('flags', NvU32, 20)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS(c.Struct): + SIZE = 20 + fd: int + object: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT +struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS.register_fields([('fd', NvS32, 0), ('object', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT, 4)]) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + minorNum: int +struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('minorNum', NvU32, 4)]) +NV0000_CTRL_OS_GET_GPU_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS(c.Struct): + SIZE = 80 + fd: int + deviceInstance: int + gpuInstanceId: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS.register_fields([('fd', NvS32, 0), ('deviceInstance', NvU32, 4), ('gpuInstanceId', NvU32, 8), ('maxObjects', NvU16, 12), ('metadata', c.Array[NvU8, Literal[64]], 14)]) +NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS(c.Struct): + SIZE = 76 + hDevice: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] + fd: int +struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS.register_fields([('hDevice', NvHandle, 0), ('maxObjects', NvU16, 4), ('metadata', c.Array[NvU8, Literal[64]], 6), ('fd', NvS32, 72)]) +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS(c.Struct): + SIZE = 2128 + fd: int + hDevice: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] + objects: c.Array[ctypes.c_uint32, Literal[512]] + numObjects: int + index: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS.register_fields([('fd', NvS32, 0), ('hDevice', NvHandle, 4), ('maxObjects', NvU16, 8), ('metadata', c.Array[NvU8, Literal[64]], 10), ('objects', c.Array[NvHandle, Literal[512]], 76), ('numObjects', NvU16, 2124), ('index', NvU16, 2126)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS(c.Struct): + SIZE = 652 + fd: int + hParent: int + objects: c.Array[ctypes.c_uint32, Literal[128]] + objectTypes: c.Array[ctypes.c_ubyte, Literal[128]] + numObjects: int + index: int +struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS.register_fields([('fd', NvS32, 0), ('hParent', NvHandle, 4), ('objects', c.Array[NvHandle, Literal[128]], 8), ('objectTypes', c.Array[NvU8, Literal[128]], 520), ('numObjects', NvU16, 648), ('index', NvU16, 650)]) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS(c.Struct): + SIZE = 40 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + gpuPciId: int + gpuPciBdf: int + vgpuTypeId: int + vgpuId: int + gpuInstanceId: int + placementId: int +struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('gpuPciId', NvU32, 16), ('gpuPciBdf', NvU32, 20), ('vgpuTypeId', NvU32, 24), ('vgpuId', NvU16, 28), ('gpuInstanceId', NvU32, 32), ('placementId', NvU32, 36)]) +NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS(c.Struct): + SIZE = 1036 + gpuPciId: int + gpuPciBdf: int + numVgpuTypes: int + vgpuTypeIds: c.Array[ctypes.c_uint32, Literal[128]] + availableInstances: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS.register_fields([('gpuPciId', NvU32, 0), ('gpuPciBdf', NvU32, 4), ('numVgpuTypes', NvU32, 8), ('vgpuTypeIds', c.Array[NvU32, Literal[128]], 12), ('availableInstances', c.Array[NvU32, Literal[128]], 524)]) +NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS(c.Struct): + SIZE = 18 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + vgpuId: int +struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('vgpuId', NvU16, 16)]) +NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS(c.Struct): + SIZE = 8 + returnStatus: int + gpuId: int +struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS.register_fields([('returnStatus', NvU32, 0), ('gpuId', NvU32, 4)]) +NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS(c.Struct): + SIZE = 24 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + mode: int + sysfs_val: int +struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('mode', NvU32, 16), ('sysfs_val', NvU32, 20)]) +NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS +@c.record +class struct_NV0080_CTRL_BIF_RESET_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV0080_CTRL_BIF_RESET_PARAMS.register_fields([('flags', NvU32, 0)]) +NV0080_CTRL_BIF_RESET_PARAMS: TypeAlias = struct_NV0080_CTRL_BIF_RESET_PARAMS +@c.record +class struct_NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS(c.Struct): + SIZE = 4 + aspmFeatureSupported: int +struct_NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS.register_fields([('aspmFeatureSupported', NvU32, 0)]) +NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS: TypeAlias = struct_NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS +@c.record +class struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS(c.Struct): + SIZE = 2 + bL0sEnable: int + bL1Enable: int +struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS.register_fields([('bL0sEnable', NvBool, 0), ('bL1Enable', NvBool, 1)]) +NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS: TypeAlias = struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS(c.Struct): + SIZE = 12 + pciePowerControlMask: int + pciePowerControlIdentifiedKeyOrder: int + pciePowerControlIdentifiedKeyLocation: int +struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS.register_fields([('pciePowerControlMask', NvU32, 0), ('pciePowerControlIdentifiedKeyOrder', NvU32, 4), ('pciePowerControlIdentifiedKeyLocation', NvU32, 8)]) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS +@c.record +class struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS(c.Struct): + SIZE = 24 + capsTblSize: int + capsTbl: ctypes.c_void_p + instanceId: int +struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8), ('instanceId', NvU32, 16)]) +NV0080_CTRL_BSP_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2(c.Struct): + SIZE = 12 + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] + instanceId: int +struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2.register_fields([('capsTbl', c.Array[NvU8, Literal[8]], 0), ('instanceId', NvU32, 8)]) +NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2: TypeAlias = struct_NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2 +@c.record +class struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK(c.Struct): + SIZE = 32 + pageSize: int + pteEntrySize: int + comptagLine: int + kind: int + pteFlags: int +struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK.register_fields([('pageSize', NvU64, 0), ('pteEntrySize', NvU64, 8), ('comptagLine', NvU32, 16), ('kind', NvU32, 20), ('pteFlags', NvU32, 24)]) +NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK: TypeAlias = struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK +@c.record +class struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS(c.Struct): + SIZE = 184 + gpuAddr: int + subDeviceId: int + skipVASpaceInit: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]] + hVASpace: int +struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('subDeviceId', NvU32, 8), ('skipVASpaceInit', NvU8, 12), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]], 16), ('hVASpace', NvHandle, 176)]) +NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS(c.Struct): + SIZE = 184 + gpuAddr: int + subDeviceId: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]] + hVASpace: int +struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('subDeviceId', NvU32, 8), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]], 16), ('hVASpace', NvHandle, 176)]) +NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS(c.Struct): + SIZE = 104 + pageCount: int + hwResource: struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource + comprInfo: struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo + offset: int + gpuAddr: int + pageArray: ctypes.c_void_p + pteMem: ctypes.c_void_p + pteMemPfn: int + pageSize: int + startPageIndex: int + flags: int + hSrcVASpace: int + hTgtVASpace: int + peerId: int +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + hMemory: int + subDeviceId: int +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('subDeviceId', NvU32, 12)]) +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo(c.Struct): + SIZE = 12 + fbKind: int + sysKind: int + compTagStartOffset: int +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo.register_fields([('fbKind', NvU32, 0), ('sysKind', NvU32, 4), ('compTagStartOffset', NvU32, 8)]) +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS.register_fields([('pageCount', NvU32, 0), ('hwResource', struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource, 4), ('comprInfo', struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo, 20), ('offset', NvU64, 32), ('gpuAddr', NvU64, 40), ('pageArray', NvP64, 48), ('pteMem', NvP64, 56), ('pteMemPfn', NvU32, 64), ('pageSize', NvU32, 68), ('startPageIndex', NvU32, 72), ('flags', NvU64, 80), ('hSrcVASpace', NvHandle, 88), ('hTgtVASpace', NvHandle, 92), ('peerId', NvU32, 96)]) +NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_FLUSH_PARAMS(c.Struct): + SIZE = 4 + targetUnit: int +struct_NV0080_CTRL_DMA_FLUSH_PARAMS.register_fields([('targetUnit', NvU32, 0)]) +NV0080_CTRL_DMA_FLUSH_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_FLUSH_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT(c.Struct): + SIZE = 8 + pageTableSize: int + pageTableCoverage: int +struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT.register_fields([('pageTableSize', NvU32, 0), ('pageTableCoverage', NvU32, 4)]) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT: TypeAlias = struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT +@c.record +class struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS(c.Struct): + SIZE = 192 + vaBitCount: int + pdeCoverageBitCount: int + num4KPageTableFormats: int + bigPageSize: int + compressionPageSize: int + dualPageTableSupported: int + idealVRAMPageSize: int + pageTableBigFormat: struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT + pageTable4KFormat: c.Array[struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, Literal[16]] + hVASpace: int + vaRangeLo: int + vaSpaceId: int + supportedPageSizeMask: int +struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS.register_fields([('vaBitCount', NvU32, 0), ('pdeCoverageBitCount', NvU32, 4), ('num4KPageTableFormats', NvU32, 8), ('bigPageSize', NvU32, 12), ('compressionPageSize', NvU32, 16), ('dualPageTableSupported', NvU32, 20), ('idealVRAMPageSize', NvU32, 24), ('pageTableBigFormat', NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, 28), ('pageTable4KFormat', c.Array[NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, Literal[16]], 36), ('hVASpace', NvHandle, 164), ('vaRangeLo', NvU64, 168), ('vaSpaceId', NvU32, 176), ('supportedPageSizeMask', NvU64, 184)]) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK(c.Struct): + SIZE = 32 + ptePhysAddr: int + pteCacheAttrib: int + pteEntrySize: int + pageSize: int + pteAddrSpace: int + pdeVASpaceSize: int + pdeFlags: int +struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK.register_fields([('ptePhysAddr', NvU64, 0), ('pteCacheAttrib', NvU32, 8), ('pteEntrySize', NvU32, 12), ('pageSize', NvU32, 16), ('pteAddrSpace', NvU32, 20), ('pdeVASpaceSize', NvU32, 24), ('pdeFlags', NvU32, 28)]) +NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK: TypeAlias = struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK +@c.record +class struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS(c.Struct): + SIZE = 208 + gpuAddr: int + pdeVirtAddr: int + pdeEntrySize: int + pdeAddrSpace: int + pdeSize: int + subDeviceId: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK, Literal[5]] + pdbAddr: int + hVASpace: int +struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('pdeVirtAddr', NvU64, 8), ('pdeEntrySize', NvU32, 16), ('pdeAddrSpace', NvU32, 20), ('pdeSize', NvU32, 24), ('subDeviceId', NvU32, 28), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK, Literal[5]], 32), ('pdbAddr', NvU64, 192), ('hVASpace', NvHandle, 200)]) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS(c.Struct): + SIZE = 8 + hVASpace: int + flags: int +struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS.register_fields([('hVASpace', NvHandle, 0), ('flags', NvU32, 4)]) +NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS(c.Struct): + SIZE = 12 + capsTblSize: int + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', c.Array[NvU8, Literal[8]], 4)]) +NV0080_CTRL_DMA_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS(c.Struct): + SIZE = 16 + vaSpaceSize: int + hVASpace: int +struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS.register_fields([('vaSpaceSize', NvU64, 0), ('hVASpace', NvHandle, 8)]) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS(c.Struct): + SIZE = 16 + physAddr: int + numEntries: int + aperture: int +struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS.register_fields([('physAddr', NvU64, 0), ('numEntries', NvU32, 8), ('aperture', NvU32, 12)]) +NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS(c.Struct): + SIZE = 64 + pdeIndex: int + flags: int + ptParams: c.Array[struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS, Literal[2]] + hVASpace: int + pPdeBuffer: ctypes.c_void_p + subDeviceId: int +struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS.register_fields([('pdeIndex', NvU32, 0), ('flags', NvU32, 4), ('ptParams', c.Array[NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS, Literal[2]], 8), ('hVASpace', NvHandle, 40), ('pPdeBuffer', NvP64, 48), ('subDeviceId', NvU32, 56)]) +NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS(c.Struct): + SIZE = 4 + hVASpace: int +struct_NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS.register_fields([('hVASpace', NvHandle, 0)]) +NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS(c.Struct): + SIZE = 4 + hVASpace: int +struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS.register_fields([('hVASpace', NvHandle, 0)]) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS(c.Struct): + SIZE = 32 + physAddress: int + numEntries: int + flags: int + hVASpace: int + chId: int + subDeviceId: int + pasid: int +struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS.register_fields([('physAddress', NvU64, 0), ('numEntries', NvU32, 8), ('flags', NvU32, 12), ('hVASpace', NvHandle, 16), ('chId', NvU32, 20), ('subDeviceId', NvU32, 24), ('pasid', NvU32, 28)]) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS(c.Struct): + SIZE = 8 + hVASpace: int + subDeviceId: int +struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS.register_fields([('hVASpace', NvHandle, 0), ('subDeviceId', NvU32, 4)]) +NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_FB_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_FB_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS(c.Struct): + SIZE = 80 + Size: int + Address: int + AddressSpace: int + MaxCompbitLine: int + comptagsPerCacheLine: int + cacheLineSize: int + cacheLineSizePerSlice: int + cacheLineFetchAlignment: int + backingStoreBase: int + gobsPerComptagPerSlice: int + backingStoreCbcBase: int + comptaglineAllocationPolicy: int + privRegionStartOffset: int + cbcCoveragePerSlice: int +struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS.register_fields([('Size', NvU64, 0), ('Address', NvU64, 8), ('AddressSpace', NvU32, 16), ('MaxCompbitLine', NvU32, 20), ('comptagsPerCacheLine', NvU32, 24), ('cacheLineSize', NvU32, 28), ('cacheLineSizePerSlice', NvU32, 32), ('cacheLineFetchAlignment', NvU32, 36), ('backingStoreBase', NvU64, 40), ('gobsPerComptagPerSlice', NvU32, 48), ('backingStoreCbcBase', NvU32, 52), ('comptaglineAllocationPolicy', NvU32, 56), ('privRegionStartOffset', NvU64, 64), ('cbcCoveragePerSlice', NvU32, 72)]) +NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 3 + capsTbl: c.Array[ctypes.c_ubyte, Literal[3]] +struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[3]], 0)]) +NV0080_CTRL_FB_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS.register_fields([('value', NvU32, 0)]) +NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS +enum_NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY: dict[int, str] = {(NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_DEFAULT:=0): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_DEFAULT', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_NONCONTIGUOUS:=1): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_NONCONTIGUOUS', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_CONTIGUOUS:=2): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_CONTIGUOUS', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_ALLOW_NONCONTIGUOUS:=3): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_ALLOW_NONCONTIGUOUS'} +NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_FIFO_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS(c.Struct): + SIZE = 12 + engineId: int + alignment: int + size: int +struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS.register_fields([('engineId', NvU32, 0), ('alignment', NvU32, 4), ('size', NvU32, 8)]) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS(c.Struct): + SIZE = 24 + numChannels: int + pChannelHandleList: ctypes.c_void_p + pChannelList: ctypes.c_void_p +struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS.register_fields([('numChannels', NvU32, 0), ('pChannelHandleList', NvP64, 8), ('pChannelList', NvP64, 16)]) +NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 12 + engineID: int + gpEntries: int + pbEntries: int +struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS.register_fields([('engineID', NvU32, 0), ('gpEntries', NvU32, 4), ('pbEntries', NvU32, 8)]) +NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + property: int + value: int +struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('property', NvU32, 4), ('value', NvU64, 8)]) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS(c.Struct): + SIZE = 4 + engineID: int +struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS.register_fields([('engineID', NvU32, 0)]) +NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS(c.Struct): + SIZE = 4 + engineID: int +struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS.register_fields([('engineID', NvU32, 0)]) +NV0080_CTRL_FIFO_START_RUNLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 2 + capsTbl: c.Array[ctypes.c_ubyte, Literal[2]] +struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[2]], 0)]) +NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS(c.Struct): + SIZE = 16396 + numChannels: int + hChannels: c.Array[ctypes.c_uint32, Literal[4096]] + flags: int + timeout: int +struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS.register_fields([('numChannels', NvU32, 0), ('hChannels', c.Array[NvHandle, Literal[4096]], 4), ('flags', NvU32, 16388), ('timeout', NvU32, 16392)]) +NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS(c.Struct): + SIZE = 16 + numClasses: int + classList: ctypes.c_void_p +struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS.register_fields([('numClasses', NvU32, 0), ('classList', NvP64, 8)]) +NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS(c.Struct): + SIZE = 4 + numSubDevices: int +struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS.register_fields([('numSubDevices', NvU32, 0)]) +NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS(c.Struct): + SIZE = 36 + ConnectionCount: int + Order: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS.register_fields([('ConnectionCount', NvU32, 0), ('Order', c.Array[NvU32, Literal[8]], 4)]) +NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS(c.Struct): + SIZE = 4 + subDeviceInstance: int +struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS.register_fields([('subDeviceInstance', NvU32, 0)]) +NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS(c.Struct): + SIZE = 4 + subDeviceInstance: int +struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS.register_fields([('subDeviceInstance', NvU32, 0)]) +NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS(c.Struct): + SIZE = 4 + enable: int +struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS.register_fields([('enable', NvU32, 0)]) +NV0080_CTRL_GPU_SET_VIDLINK_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS(c.Struct): + SIZE = 4 + newState: int +struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS.register_fields([('newState', NvU32, 0)]) +NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS(c.Struct): + SIZE = 4 + swStatePersistence: int +struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS.register_fields([('swStatePersistence', NvU32, 0)]) +NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS(c.Struct): + SIZE = 8 + virtualizationMode: int + isGridBuild: int +struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS.register_fields([('virtualizationMode', NvU32, 0), ('isGridBuild', NvBool, 4)]) +NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS(c.Struct): + SIZE = 12 + defaultSetting: int + currentSetting: int + pendingSetting: int +struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS.register_fields([('defaultSetting', NvU32, 0), ('currentSetting', NvU32, 4), ('pendingSetting', NvU32, 8)]) +NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS(c.Struct): + SIZE = 4 + setting: int +struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS.register_fields([('setting', NvU32, 0)]) +NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS(c.Struct): + SIZE = 1 + isVgx: int +struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS.register_fields([('isVgx', NvBool, 0)]) +NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS(c.Struct): + SIZE = 80 + totalVFs: int + firstVfOffset: int + vfFeatureMask: int + FirstVFBar0Address: int + FirstVFBar1Address: int + FirstVFBar2Address: int + bar0Size: int + bar1Size: int + bar2Size: int + b64bitBar0: int + b64bitBar1: int + b64bitBar2: int + bSriovEnabled: int + bSriovHeavyEnabled: int + bEmulateVFBar0TlbInvalidationRegister: int + bClientRmAllocatedCtxBuffer: int + bNonPowerOf2ChannelCountSupported: int + bVfResizableBAR1Supported: int +struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS.register_fields([('totalVFs', NvU32, 0), ('firstVfOffset', NvU32, 4), ('vfFeatureMask', NvU32, 8), ('FirstVFBar0Address', NvU64, 16), ('FirstVFBar1Address', NvU64, 24), ('FirstVFBar2Address', NvU64, 32), ('bar0Size', NvU64, 40), ('bar1Size', NvU64, 48), ('bar2Size', NvU64, 56), ('b64bitBar0', NvBool, 64), ('b64bitBar1', NvBool, 65), ('b64bitBar2', NvBool, 66), ('bSriovEnabled', NvBool, 67), ('bSriovHeavyEnabled', NvBool, 68), ('bEmulateVFBar0TlbInvalidationRegister', NvBool, 69), ('bClientRmAllocatedCtxBuffer', NvBool, 70), ('bNonPowerOf2ChannelCountSupported', NvBool, 71), ('bVfResizableBAR1Supported', NvBool, 72)]) +NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS(c.Struct): + SIZE = 804 + numClasses: int + classList: c.Array[ctypes.c_uint32, Literal[200]] +struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS.register_fields([('numClasses', NvU32, 0), ('classList', c.Array[NvU32, Literal[200]], 4)]) +NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM(c.Struct): + SIZE = 8 + subDeviceInst: int + hSubDevice: int +struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM.register_fields([('subDeviceInst', NvU32, 0), ('hSubDevice', NvHandle, 4)]) +NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM: TypeAlias = struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM +@c.record +class struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS(c.Struct): + SIZE = 4 + brands: int +struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS.register_fields([('brands', NvU32, 0)]) +NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS(c.Struct): + SIZE = 8 + vfBar1SizeMB: int + numVfs: int +struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS.register_fields([('vfBar1SizeMB', NvU32, 0), ('numVfs', NvU32, 4)]) +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 8 + bHeterogeneousMode: int + gpuInstanceId: int +struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0), ('gpuInstanceId', NvU32, 4)]) +NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 8 + bHeterogeneousMode: int + gpuInstanceId: int +struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0), ('gpuInstanceId', NvU32, 4)]) +NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GR_ROUTE_INFO(c.Struct): + SIZE = 16 + flags: int + route: int +struct_NV0080_CTRL_GR_ROUTE_INFO.register_fields([('flags', NvU32, 0), ('route', NvU64, 8)]) +NV0080_CTRL_GR_ROUTE_INFO: TypeAlias = struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV0080_CTRL_GR_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_GR_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_GR_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_PARAMS +@c.record +class struct_NVXXXX_CTRL_XXX_INFO(c.Struct): + SIZE = 8 + index: int + data: int +NV0080_CTRL_GR_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +struct_NVXXXX_CTRL_XXX_INFO.register_fields([('index', NvU32, 0), ('data', NvU32, 4)]) +@c.record +class struct_NV0080_CTRL_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + grInfoListSize: int + grInfoList: ctypes.c_void_p +struct_NV0080_CTRL_GR_GET_INFO_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', NvP64, 8)]) +NV0080_CTRL_GR_GET_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_PARAMS +enum_NV0080_CTRL_GR_TPC_PARTITION_MODE: dict[int, str] = {(NV0080_CTRL_GR_TPC_PARTITION_MODE_NONE:=0): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_NONE', (NV0080_CTRL_GR_TPC_PARTITION_MODE_STATIC:=1): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_STATIC', (NV0080_CTRL_GR_TPC_PARTITION_MODE_DYNAMIC:=2): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_DYNAMIC'} +NV0080_CTRL_GR_TPC_PARTITION_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS(c.Struct): + SIZE = 32 + hChannelGroup: int + mode: int + bEnableAllTpcs: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS.register_fields([('hChannelGroup', NvHandle, 0), ('mode', NV0080_CTRL_GR_TPC_PARTITION_MODE, 4), ('bEnableAllTpcs', NvBool, 8), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 16)]) +NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +NV0080_CTRL_GR_GET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +NV0080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 48 + capsTbl: c.Array[ctypes.c_ubyte, Literal[23]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + bCapsPopulated: int +struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[23]], 0), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 24), ('bCapsPopulated', NvBool, 40)]) +NV0080_CTRL_GR_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 488 + grInfoListSize: int + grInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[58]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', c.Array[NV0080_CTRL_GR_INFO, Literal[58]], 4), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 472)]) +NV0080_CTRL_GR_GET_INFO_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS +@c.record +class struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_HOST_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 3 + capsTbl: c.Array[ctypes.c_ubyte, Literal[3]] +struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[3]], 0)]) +NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS(c.Struct): + SIZE = 32 + params: struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS.register_fields([('params', NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS, 0)]) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS(c.Struct): + SIZE = 32 + params: struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS.register_fields([('params', NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS, 0)]) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS +@c.record +class struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS(c.Struct): + SIZE = 804 + numClients: int + clientHandles: c.Array[ctypes.c_uint32, Literal[200]] +struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS.register_fields([('numClients', NvU32, 0), ('clientHandles', c.Array[NvHandle, Literal[200]], 4)]) +NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS +@c.record +class struct_NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS(c.Struct): + SIZE = 8 + subdevInstance: int + bZbcSurfacesExist: int +struct_NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS.register_fields([('subdevInstance', NvU32, 0), ('bZbcSurfacesExist', NvBool, 4)]) +NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS +@c.record +class struct_NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS(c.Struct): + SIZE = 1 + bTeardown: int +struct_NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS.register_fields([('bTeardown', NvBool, 0)]) +NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS +NV0080_CTRL_INTERNAL_KGR_INIT_BUG4208224_WAR_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS +@c.record +class struct_NV0080_CTRL_MSENC_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_MSENC_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_MSENC_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_MSENC_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 12 + capsTbl: c.Array[ctypes.c_ubyte, Literal[5]] + instanceId: int +struct_NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[5]], 0), ('instanceId', NvU32, 8)]) +NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 16 + capsTbl: c.Array[ctypes.c_ubyte, Literal[9]] + instanceId: int +struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[9]], 0), ('instanceId', NvU32, 12)]) +NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bActivate: int +struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS.register_fields([('bActivate', NvBool, 0)]) +NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS: TypeAlias = struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS +@c.record +class struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bCudaLimit: int +struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS.register_fields([('bCudaLimit', NvBool, 0)]) +NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS: TypeAlias = struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS +@c.record +class struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS(c.Struct): + SIZE = 4 + cmd: int +struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS.register_fields([('cmd', NvU32, 0)]) +NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS: TypeAlias = struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS +@c.record +class struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS(c.Struct): + SIZE = 32 + subDeviceInstance: int + width: int + height: int + depth: int + pitch: int + baseAddress: int + size: int +struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS.register_fields([('subDeviceInstance', NvU32, 0), ('width', NvU16, 4), ('height', NvU16, 6), ('depth', NvU16, 8), ('pitch', NvU16, 10), ('baseAddress', NvU64, 16), ('size', NvU64, 24)]) +NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS +NV2080_CTRL_BIOS_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + biosInfoListSize: int + biosInfoList: ctypes.c_void_p +struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS.register_fields([('biosInfoListSize', NvU32, 0), ('biosInfoList', NvP64, 8)]) +NV2080_CTRL_BIOS_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 124 + biosInfoListSize: int + biosInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[15]] +struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS.register_fields([('biosInfoListSize', NvU32, 0), ('biosInfoList', c.Array[NV2080_CTRL_BIOS_INFO, Literal[15]], 4)]) +NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_NBSI_REG_STRING(c.Struct): + SIZE = 520 + size: int + type: int + value: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value +@c.record +class struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value(c.Struct): + SIZE = 512 + ascii: c.Array[ctypes.c_ubyte, Literal[256]] + unicode: c.Array[ctypes.c_uint16, Literal[256]] + hash: int +struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value.register_fields([('ascii', c.Array[NvU8, Literal[256]], 0), ('unicode', c.Array[NvU16, Literal[256]], 0), ('hash', NvU16, 0)]) +struct_NV2080_CTRL_BIOS_NBSI_REG_STRING.register_fields([('size', NvU32, 0), ('type', NvU32, 4), ('value', struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value, 8)]) +NV2080_CTRL_BIOS_NBSI_REG_STRING: TypeAlias = struct_NV2080_CTRL_BIOS_NBSI_REG_STRING +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS(c.Struct): + SIZE = 1064 + module: int + path: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + valueName: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + retBuf: ctypes.c_void_p + retSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS.register_fields([('module', NvU32, 0), ('path', NV2080_CTRL_BIOS_NBSI_REG_STRING, 4), ('valueName', NV2080_CTRL_BIOS_NBSI_REG_STRING, 524), ('retBuf', NvP64, 1048), ('retSize', NvU32, 1056), ('errorCode', NvU32, 1060)]) +NV2080_CTRL_BIOS_GET_NBSI_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS(c.Struct): + SIZE = 1308 + module: int + path: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + valueName: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + retBuf: c.Array[ctypes.c_ubyte, Literal[256]] + retSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS.register_fields([('module', NvU32, 0), ('path', NV2080_CTRL_BIOS_NBSI_REG_STRING, 4), ('valueName', NV2080_CTRL_BIOS_NBSI_REG_STRING, 524), ('retBuf', c.Array[NvU8, Literal[256]], 1044), ('retSize', NvU32, 1300), ('errorCode', NvU32, 1304)]) +NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS(c.Struct): + SIZE = 40 + globType: int + globIndex: int + globSource: int + retBufOffset: int + retBuf: ctypes.c_void_p + retSize: int + totalObjSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS.register_fields([('globType', NvU16, 0), ('globIndex', NvU8, 2), ('globSource', NvU16, 4), ('retBufOffset', NvU32, 8), ('retBuf', NvP64, 16), ('retSize', NvU32, 24), ('totalObjSize', NvU32, 28), ('errorCode', NvU32, 32)]) +NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS(c.Struct): + SIZE = 48 + BoardID: int + chipSKU: c.Array[ctypes.c_char, Literal[9]] + chipSKUMod: c.Array[ctypes.c_char, Literal[5]] + skuConfigVersion: int + project: c.Array[ctypes.c_char, Literal[5]] + projectSKU: c.Array[ctypes.c_char, Literal[5]] + CDP: c.Array[ctypes.c_char, Literal[6]] + projectSKUMod: c.Array[ctypes.c_char, Literal[2]] + businessCycle: int +struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS.register_fields([('BoardID', NvU32, 0), ('chipSKU', c.Array[ctypes.c_char, Literal[9]], 4), ('chipSKUMod', c.Array[ctypes.c_char, Literal[5]], 13), ('skuConfigVersion', NvU32, 20), ('project', c.Array[ctypes.c_char, Literal[5]], 24), ('projectSKU', c.Array[ctypes.c_char, Literal[5]], 29), ('CDP', c.Array[ctypes.c_char, Literal[6]], 34), ('projectSKUMod', c.Array[ctypes.c_char, Literal[2]], 40), ('businessCycle', NvU32, 44)]) +NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS(c.Struct): + SIZE = 8 + vbiosPostTime: int +struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS.register_fields([('vbiosPostTime', NvU64, 0)]) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS(c.Struct): + SIZE = 8 + version: int + flags: int +struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS.register_fields([('version', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS +NvBoardObjIdx: TypeAlias = ctypes.c_uint16 +NvBoardObjMaskIdx: TypeAlias = ctypes.c_uint16 +NV2080_CTRL_BOARDOBJGRP_MASK_PRIMITIVE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK(c.Struct): + SIZE = 4 + pData: c.Array[ctypes.c_uint32, Literal[1]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK.register_fields([('pData', c.Array[NvU32, Literal[1]], 0)]) +NV2080_CTRL_BOARDOBJGRP_MASK: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK +PNV2080_CTRL_BOARDOBJGRP_MASK: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32(c.Struct): + SIZE = 4 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +PNV2080_CTRL_BOARDOBJGRP_MASK_E32: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255(c.Struct): + SIZE = 32 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE255: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE255', c.Array[NvU32, Literal[7]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +PNV2080_CTRL_BOARDOBJGRP_MASK_E255: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512(c.Struct): + SIZE = 64 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE512: c.Array[ctypes.c_uint32, Literal[15]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE512', c.Array[NvU32, Literal[15]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +PNV2080_CTRL_BOARDOBJGRP_MASK_E512: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024(c.Struct): + SIZE = 128 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE1024: c.Array[ctypes.c_uint32, Literal[31]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE1024', c.Array[NvU32, Literal[31]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +PNV2080_CTRL_BOARDOBJGRP_MASK_E1024: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048(c.Struct): + SIZE = 256 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE2048: c.Array[ctypes.c_uint32, Literal[63]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE2048', c.Array[NvU32, Literal[63]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +PNV2080_CTRL_BOARDOBJGRP_MASK_E2048: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048] +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO(c.Struct): + SIZE = 1 + type: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO.register_fields([('type', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS(c.Struct): + SIZE = 1 + type: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS.register_fields([('type', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL(c.Struct): + SIZE = 1 + type: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL.register_fields([('type', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS(c.Struct): + SIZE = 1 + type: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS.register_fields([('type', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO(c.Struct): + SIZE = 1 + classType: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO.register_fields([('classType', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_SUPER_ALIAS(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_SUPER_ALIAS.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_SUPER_ALIAS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_SUPER_ALIAS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS(c.Struct): + SIZE = 1 + classType: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS.register_fields([('classType', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_SUPER_ALIAS(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_SUPER_ALIAS.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_SUPER_ALIAS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_SUPER_ALIAS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL(c.Struct): + SIZE = 1 + classType: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL.register_fields([('classType', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_SUPER_ALIAS(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_SUPER_ALIAS.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_SUPER_ALIAS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_SUPER_ALIAS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS(c.Struct): + SIZE = 2 + classType: int + bInitialized: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS.register_fields([('classType', NvU8, 0), ('bInitialized', NvBool, 1)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_SUPER_ALIAS(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_SUPER_ALIAS.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_SUPER_ALIAS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_SUPER_ALIAS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E32(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E32.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E32, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E32 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E32(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E32.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E32, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E32 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E32(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E32.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E32, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E32 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E32(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E32.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E32, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E32 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E255(c.Struct): + SIZE = 36 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E255.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E255, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E255 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E255(c.Struct): + SIZE = 36 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E255.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E255, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E255 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E255(c.Struct): + SIZE = 36 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E255.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E255, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E255 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E255(c.Struct): + SIZE = 36 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E255.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E255, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E255 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E512(c.Struct): + SIZE = 68 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E512.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E512, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E512 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E512(c.Struct): + SIZE = 68 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E512.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E512, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E512 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E512(c.Struct): + SIZE = 68 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E512.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E512, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E512 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E512(c.Struct): + SIZE = 68 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E512.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E512, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E512 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E1024(c.Struct): + SIZE = 132 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E1024, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E1024 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E1024(c.Struct): + SIZE = 132 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E1024, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E1024 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E1024(c.Struct): + SIZE = 132 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E1024, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E1024 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E1024(c.Struct): + SIZE = 132 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E1024, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E1024 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E2048(c.Struct): + SIZE = 260 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E2048, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E2048 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E2048(c.Struct): + SIZE = 260 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E2048, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E2048 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E2048(c.Struct): + SIZE = 260 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E2048, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E2048 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E2048(c.Struct): + SIZE = 260 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E2048, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E2048 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS(c.Struct): + SIZE = 16 + pciDeviceId: int + pciSubSystemId: int + pciRevisionId: int + pciExtDeviceId: int +struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS.register_fields([('pciDeviceId', NvU32, 0), ('pciSubSystemId', NvU32, 4), ('pciRevisionId', NvU32, 8), ('pciExtDeviceId', NvU32, 12)]) +NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS +NV2080_CTRL_BUS_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_BUS_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + busInfoListSize: int + busInfoList: ctypes.c_void_p +struct_NV2080_CTRL_BUS_GET_INFO_PARAMS.register_fields([('busInfoListSize', NvU32, 0), ('busInfoList', NvP64, 8)]) +NV2080_CTRL_BUS_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 420 + busInfoListSize: int + busInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[52]] +struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS.register_fields([('busInfoListSize', NvU32, 0), ('busInfoList', c.Array[NV2080_CTRL_BUS_INFO, Literal[52]], 4)]) +NV2080_CTRL_BUS_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_PCI_BAR_INFO(c.Struct): + SIZE = 24 + flags: int + barSize: int + barSizeBytes: int + barOffset: int +struct_NV2080_CTRL_BUS_PCI_BAR_INFO.register_fields([('flags', NvU32, 0), ('barSize', NvU32, 4), ('barSizeBytes', NvU64, 8), ('barOffset', NvU64, 16)]) +NV2080_CTRL_BUS_PCI_BAR_INFO: TypeAlias = struct_NV2080_CTRL_BUS_PCI_BAR_INFO +@c.record +class struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS(c.Struct): + SIZE = 200 + pciBarCount: int + pciBarInfo: c.Array[struct_NV2080_CTRL_BUS_PCI_BAR_INFO, Literal[8]] +struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS.register_fields([('pciBarCount', NvU32, 0), ('pciBarInfo', c.Array[NV2080_CTRL_BUS_PCI_BAR_INFO, Literal[8]], 8)]) +NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS(c.Struct): + SIZE = 8 + pcieLinkWidth: int + failingReason: int +struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS.register_fields([('pcieLinkWidth', NvU32, 0), ('failingReason', NvU32, 4)]) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS(c.Struct): + SIZE = 4 + busSpeed: int +struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS.register_fields([('busSpeed', NvU32, 0)]) +NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_BUS_MAP_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS(c.Struct): + SIZE = 12 + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0), ('offset', NvU32, 4), ('size', NvU32, 8)]) +NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS(c.Struct): + SIZE = 8 + command: int + deviceState: int +struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS.register_fields([('command', NvU8, 0), ('deviceState', NvU32, 4)]) +NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 76 + pexCounterMask: int + pexTotalCorrectableErrors: int + pexCorrectableErrors: int + pexTotalNonFatalErrors: int + pexTotalFatalErrors: int + pexTotalUnsupportedReqs: int + pexCounters: c.Array[ctypes.c_uint16, Literal[31]] +struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('pexTotalCorrectableErrors', NvU32, 4), ('pexCorrectableErrors', NvU16, 8), ('pexTotalNonFatalErrors', NvU8, 10), ('pexTotalFatalErrors', NvU8, 11), ('pexTotalUnsupportedReqs', NvU8, 12), ('pexCounters', c.Array[NvU16, Literal[31]], 14)]) +NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + pexCounterMask: int +struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0)]) +NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 8 + pexCounterMask: int + bFreezeRmCounter: int +struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('bFreezeRmCounter', NvBool, 4)]) +NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS(c.Struct): + SIZE = 18 + pexLaneErrorStatus: int + pexLaneCounter: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS.register_fields([('pexLaneErrorStatus', NvU16, 0), ('pexLaneCounter', c.Array[NvU8, Literal[16]], 2)]) +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS(c.Struct): + SIZE = 12 + bPexLtrRegkeyOverride: int + bPexRootPortLtrSupported: int + bPexGpuLtrSupported: int + pexLtrSnoopLatencyValue: int + pexLtrSnoopLatencyScale: int + pexLtrNoSnoopLatencyValue: int + pexLtrNoSnoopLatencyScale: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS.register_fields([('bPexLtrRegkeyOverride', NvBool, 0), ('bPexRootPortLtrSupported', NvBool, 1), ('bPexGpuLtrSupported', NvBool, 2), ('pexLtrSnoopLatencyValue', NvU16, 4), ('pexLtrSnoopLatencyScale', NvU8, 6), ('pexLtrNoSnoopLatencyValue', NvU16, 8), ('pexLtrNoSnoopLatencyScale', NvU8, 10)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS(c.Struct): + SIZE = 8 + pexLtrSnoopLatencyValue: int + pexLtrSnoopLatencyScale: int + pexLtrNoSnoopLatencyValue: int + pexLtrNoSnoopLatencyScale: int +struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS.register_fields([('pexLtrSnoopLatencyValue', NvU16, 0), ('pexLtrSnoopLatencyScale', NvU8, 2), ('pexLtrNoSnoopLatencyValue', NvU16, 4), ('pexLtrNoSnoopLatencyScale', NvU8, 6)]) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS(c.Struct): + SIZE = 32 + pexCounterMask: int + pexCounters: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('pexCounters', c.Array[NvU32, Literal[7]], 4)]) +NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + pexCounterMask: int +struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0)]) +NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_BFD_PARAMS(c.Struct): + SIZE = 20 + valid: int + deviceID: int + vendorID: int + domain: int + bus: int + device: int + function: int +struct_NV2080_CTRL_BUS_GET_BFD_PARAMS.register_fields([('valid', NvBool, 0), ('deviceID', NvU16, 2), ('vendorID', NvU16, 4), ('domain', NvU32, 8), ('bus', NvU16, 12), ('device', NvU16, 14), ('function', NvU8, 16)]) +NV2080_CTRL_BUS_GET_BFD_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_BFD_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_BFD_PARAMSARR(c.Struct): + SIZE = 640 + params: c.Array[struct_NV2080_CTRL_BUS_GET_BFD_PARAMS, Literal[32]] +struct_NV2080_CTRL_BUS_GET_BFD_PARAMSARR.register_fields([('params', c.Array[NV2080_CTRL_BUS_GET_BFD_PARAMS, Literal[32]], 0)]) +NV2080_CTRL_BUS_GET_BFD_PARAMSARR: TypeAlias = struct_NV2080_CTRL_BUS_GET_BFD_PARAMSARR +@c.record +class struct_NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS(c.Struct): + SIZE = 9 + aspmDisableFlags: c.Array[ctypes.c_ubyte, Literal[9]] +struct_NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS.register_fields([('aspmDisableFlags', c.Array[NvBool, Literal[9]], 0)]) +NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS(c.Struct): + SIZE = 128 + nvlinkPeerIdMask: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS.register_fields([('nvlinkPeerIdMask', c.Array[NvU32, Literal[32]], 0)]) +NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS(c.Struct): + SIZE = 3 + eomMode: int + eomNblks: int + eomNerrs: int +struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS.register_fields([('eomMode', NvU8, 0), ('eomNblks', NvU8, 1), ('eomNerrs', NvU8, 2)]) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS(c.Struct): + SIZE = 12 + regAddress: int + laneSelectMask: int + regValue: int +struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS.register_fields([('regAddress', NvU32, 0), ('laneSelectMask', NvU32, 4), ('regValue', NvU16, 8)]) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS(c.Struct): + SIZE = 76 + eomMode: int + eomNblks: int + eomNerrs: int + eomBerEyeSel: int + eomPamEyeSel: int + laneMask: int + eomStatus: c.Array[ctypes.c_uint16, Literal[32]] +struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS.register_fields([('eomMode', NvU8, 0), ('eomNblks', NvU8, 1), ('eomNerrs', NvU8, 2), ('eomBerEyeSel', NvU8, 3), ('eomPamEyeSel', NvU8, 4), ('laneMask', NvU32, 8), ('eomStatus', c.Array[NvU16, Literal[32]], 12)]) +NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS(c.Struct): + SIZE = 12 + capType: int + dbdf: int + atomicsCaps: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS.register_fields([('capType', NvU32, 0), ('dbdf', NvU32, 4), ('atomicsCaps', NvU32, 8)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO(c.Struct): + SIZE = 8 + bSupported: int + attributes: int +struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO.register_fields([('bSupported', NvBool, 0), ('attributes', NvU32, 4)]) +NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO: TypeAlias = struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS(c.Struct): + SIZE = 112 + capType: int + dbdf: int + atomicOp: c.Array[struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO, Literal[13]] +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS.register_fields([('capType', NvU32, 0), ('dbdf', NvU32, 4), ('atomicOp', c.Array[NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO, Literal[13]], 8)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS(c.Struct): + SIZE = 28 + bIsLinkUp: int + bLinkInHS: int + nrLinks: int + maxNrLinks: int + linkMask: int + perLinkBwMBps: int + perLinkLaneWidth: int + remoteType: int +struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS.register_fields([('bIsLinkUp', NvBool, 0), ('bLinkInHS', NvBool, 1), ('nrLinks', NvU32, 4), ('maxNrLinks', NvU32, 8), ('linkMask', NvU32, 12), ('perLinkBwMBps', NvU32, 16), ('perLinkLaneWidth', NvU32, 20), ('remoteType', NvU32, 24)]) +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS(c.Struct): + SIZE = 168 + errCnts: c.Array[struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_errCnt, Literal[14]] +@c.record +class struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_errCnt(c.Struct): + SIZE = 12 + nrCrcErrIntr: int + nrReplayErrIntr: int + nrReplayB2bErrIntr: int +struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_errCnt.register_fields([('nrCrcErrIntr', NvU32, 0), ('nrReplayErrIntr', NvU32, 4), ('nrReplayB2bErrIntr', NvU32, 8)]) +struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS.register_fields([('errCnts', c.Array[struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_errCnt, Literal[14]], 0)]) +NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS(c.Struct): + SIZE = 32 + connectionType: int + peerId: int + bEgmPeer: int + bSpaAccessOnly: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bEgmPeer', NvBool, 8), ('bSpaAccessOnly', NvBool, 9), ('bUseUuid', NvBool, 10), ('remoteGpuId', NvU32, 12), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 16)]) +NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS(c.Struct): + SIZE = 32 + connectionType: int + peerId: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bUseUuid', NvBool, 8), ('remoteGpuId', NvU32, 12), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 16)]) +NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS(c.Struct): + SIZE = 4 + atomicsCaps: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS.register_fields([('atomicsCaps', NvU32, 0)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS(c.Struct): + SIZE = 80 + c2cStateSupportMask: int + bCl3Support: int + cl3EntryCount: int + cl3ExitCount: int + cl3ResidentTimeUs: int + cl3AvgEntryLatencyUs: int + cl3AvgExitLatencyUs: int + cl3PstateSupportMask: int + cl3DisallowReasonMask: int + bCl4Support: int + cl4EntryCount: int + cl4ExitCount: int + cl4ResidentTimeUs: int + cl4AvgEntryLatencyUs: int + cl4AvgExitLatencyUs: int + cl4PstateSupportMask: int + cl4DisallowReasonMask: int + c2cLpwrStateAllowedMask: int + localPowerState: int + remotePowerState: int +struct_NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS.register_fields([('c2cStateSupportMask', NvU32, 0), ('bCl3Support', NvBool, 4), ('cl3EntryCount', NvU32, 8), ('cl3ExitCount', NvU32, 12), ('cl3ResidentTimeUs', NvU32, 16), ('cl3AvgEntryLatencyUs', NvU32, 20), ('cl3AvgExitLatencyUs', NvU32, 24), ('cl3PstateSupportMask', NvU32, 28), ('cl3DisallowReasonMask', NvU32, 32), ('bCl4Support', NvBool, 36), ('cl4EntryCount', NvU32, 40), ('cl4ExitCount', NvU32, 44), ('cl4ResidentTimeUs', NvU32, 48), ('cl4AvgEntryLatencyUs', NvU32, 52), ('cl4AvgExitLatencyUs', NvU32, 56), ('cl4PstateSupportMask', NvU32, 60), ('cl4DisallowReasonMask', NvU32, 64), ('c2cLpwrStateAllowedMask', NvU32, 68), ('localPowerState', NvU32, 72), ('remotePowerState', NvU32, 76)]) +NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS(c.Struct): + SIZE = 8 + c2cLpwrStateId: int + bAllowed: int +struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS.register_fields([('c2cLpwrStateId', NvU32, 0), ('bAllowed', NvBool, 4)]) +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + ceEngineType: int + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV2080_CTRL_CE_GET_CAPS_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('capsTblSize', NvU32, 4), ('capsTbl', NvP64, 8)]) +NV2080_CTRL_CE_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 8 + ceEngineType: int + capsTbl: c.Array[ctypes.c_ubyte, Literal[2]] +struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('capsTbl', c.Array[NvU8, Literal[2]], 4)]) +NV2080_CTRL_CE_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS(c.Struct): + SIZE = 8 + ceEngineType: int + pceMask: int +struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('pceMask', NvU32, 4)]) +NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS(c.Struct): + SIZE = 148 + ceEngineType: int + pceLceMap: c.Array[ctypes.c_uint32, Literal[32]] + grceSharedLceMap: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('pceLceMap', c.Array[NvU32, Literal[32]], 4), ('grceSharedLceMap', c.Array[NvU32, Literal[4]], 132)]) +NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS(c.Struct): + SIZE = 152 + pceLceMap: c.Array[ctypes.c_uint32, Literal[32]] + grceConfig: c.Array[ctypes.c_uint32, Literal[4]] + exposeCeMask: int + bUpdateNvlinkPceLce: int +struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS.register_fields([('pceLceMap', c.Array[NvU32, Literal[32]], 0), ('grceConfig', c.Array[NvU32, Literal[4]], 128), ('exposeCeMask', NvU32, 144), ('bUpdateNvlinkPceLce', NvBool, 148)]) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS(c.Struct): + SIZE = 4 + stubbedCeMask: int +struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS.register_fields([('stubbedCeMask', NvU32, 0)]) +NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS +NV2080_CTRL_CE_GET_PHYSICAL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 4 + size: int +struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS.register_fields([('size', NvU32, 0)]) +NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS(c.Struct): + SIZE = 132 + hshubPceMasks: c.Array[ctypes.c_uint32, Literal[32]] + fbhubPceMask: int +struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS.register_fields([('hshubPceMasks', c.Array[NvU32, Literal[32]], 0), ('fbhubPceMask', NvU32, 128)]) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS(c.Struct): + SIZE = 136 + capsTbl: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[64]] + present: int +struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS.register_fields([('capsTbl', c.Array[c.Array[NvU8, Literal[2]], Literal[64]], 0), ('present', NvU64, 128)]) +NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS +NV2080_CTRL_CE_GET_ALL_PHYSICAL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS(c.Struct): + SIZE = 12 + ceEngineType: int + shimInstance: int + shimLocalLceIdx: int +struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('shimInstance', NvU32, 4), ('shimLocalLceIdx', NvU32, 8)]) +NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS(c.Struct): + SIZE = 156 + pceLceMap: c.Array[ctypes.c_uint32, Literal[32]] + grceConfig: c.Array[ctypes.c_uint32, Literal[4]] + exposeCeMask: int + bUpdateNvlinkPceLce: int + shimInstance: int +struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS.register_fields([('pceLceMap', c.Array[NvU32, Literal[32]], 0), ('grceConfig', c.Array[NvU32, Literal[4]], 128), ('exposeCeMask', NvU32, 144), ('bUpdateNvlinkPceLce', NvBool, 148), ('shimInstance', NvU32, 152)]) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS(c.Struct): + SIZE = 136 + connectingHubPceMasks: c.Array[ctypes.c_uint32, Literal[32]] + fbhubPceMask: int + shimInstance: int +struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS.register_fields([('connectingHubPceMasks', c.Array[NvU32, Literal[32]], 0), ('fbhubPceMask', NvU32, 128), ('shimInstance', NvU32, 132)]) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS +enum_NV2080_CTRL_CE_LCE_TYPE: dict[int, str] = {(NV2080_CTRL_CE_LCE_TYPE_PCIE:=1): 'NV2080_CTRL_CE_LCE_TYPE_PCIE', (NV2080_CTRL_CE_LCE_TYPE_DECOMP:=2): 'NV2080_CTRL_CE_LCE_TYPE_DECOMP', (NV2080_CTRL_CE_LCE_TYPE_SCRUB:=3): 'NV2080_CTRL_CE_LCE_TYPE_SCRUB', (NV2080_CTRL_CE_LCE_TYPE_NVLINK_PEER:=4): 'NV2080_CTRL_CE_LCE_TYPE_NVLINK_PEER', (NV2080_CTRL_CE_LCE_TYPE_C2C:=5): 'NV2080_CTRL_CE_LCE_TYPE_C2C', (NV2080_CTRL_CE_LCE_TYPE_PCIE_RD:=6): 'NV2080_CTRL_CE_LCE_TYPE_PCIE_RD', (NV2080_CTRL_CE_LCE_TYPE_PCIE_WR:=7): 'NV2080_CTRL_CE_LCE_TYPE_PCIE_WR', (NV2080_CTRL_CE_LCE_TYPE_C2C_H2D:=8): 'NV2080_CTRL_CE_LCE_TYPE_C2C_H2D', (NV2080_CTRL_CE_LCE_TYPE_C2C_D2H:=9): 'NV2080_CTRL_CE_LCE_TYPE_C2C_D2H'} +NV2080_CTRL_CE_LCE_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS(c.Struct): + SIZE = 28 + lceType: int + metadataForLceType: int + numPces: int + numLces: int + supportedPceMask: int + supportedLceMask: int + pcePerHshub: int +struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS.register_fields([('lceType', NV2080_CTRL_CE_LCE_TYPE, 0), ('metadataForLceType', NvU32, 4), ('numPces', NvU32, 8), ('numLces', NvU32, 12), ('supportedPceMask', NvU32, 16), ('supportedLceMask', NvU32, 20), ('pcePerHshub', NvU32, 24)]) +NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS(c.Struct): + SIZE = 16 + decompLceMask: int + shimInstance: int +struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS.register_fields([('decompLceMask', NvU64, 0), ('shimInstance', NvU32, 8)]) +NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS(c.Struct): + SIZE = 8 + lceIndex: int + bDecompEnabled: int +struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS.register_fields([('lceIndex', NvU32, 0), ('bDecompEnabled', NvBool, 4)]) +NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS +@c.record +class struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + engine: int + hVASpace: int +struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('engine', NvU32, 8), ('hVASpace', NvHandle, 12)]) +NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS: TypeAlias = struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS +NV2080_CTRL_DMA_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_DMA_GET_INFO_PARAMS(c.Struct): + SIZE = 2052 + dmaInfoTblSize: int + dmaInfoTbl: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[256]] +struct_NV2080_CTRL_DMA_GET_INFO_PARAMS.register_fields([('dmaInfoTblSize', NvU32, 0), ('dmaInfoTbl', c.Array[NV2080_CTRL_DMA_INFO, Literal[256]], 4)]) +NV2080_CTRL_DMA_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_DMA_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO(c.Struct): + SIZE = 12 + srcAddr: int + dstAddr: int + relComptagIndex: int +struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO.register_fields([('srcAddr', NvU32, 0), ('dstAddr', NvU32, 4), ('relComptagIndex', NvU16, 8)]) +NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO: TypeAlias = struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO +@c.record +class struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO(c.Struct): + SIZE = 24 + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO.register_fields([('hMemory', NvHandle, 0), ('offset', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_DMABUF_MEM_HANDLE_INFO: TypeAlias = struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO +@c.record +class struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS(c.Struct): + SIZE = 3104 + fd: int + totalObjects: int + numObjects: int + index: int + totalSize: int + mappingType: int + bAllowMmap: int + handles: c.Array[struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO, Literal[128]] +struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS.register_fields([('fd', NvS32, 0), ('totalObjects', NvU32, 4), ('numObjects', NvU32, 8), ('index', NvU32, 12), ('totalSize', NvU64, 16), ('mappingType', NvU8, 24), ('bAllowMmap', NvBool, 25), ('handles', c.Array[NV2080_CTRL_DMABUF_MEM_HANDLE_INFO, Literal[128]], 32)]) +NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS(c.Struct): + SIZE = 96 + sramParityUncorrectedUnique: int + sramSecDedUncorrectedUnique: int + sramCorrectedUnique: int + dramUncorrectedTotal: int + dramCorrectedTotal: int + lastClearedTimestamp: int + sramBucketL2: int + sramBucketSM: int + sramBucketPcie: int + sramBucketFirmware: int + sramBucketOther: int + sramErrorThresholdExceeded: int +struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS.register_fields([('sramParityUncorrectedUnique', NvU64, 0), ('sramSecDedUncorrectedUnique', NvU64, 8), ('sramCorrectedUnique', NvU64, 16), ('dramUncorrectedTotal', NvU64, 24), ('dramCorrectedTotal', NvU64, 32), ('lastClearedTimestamp', NvU32, 40), ('sramBucketL2', NvU64, 48), ('sramBucketSM', NvU64, 56), ('sramBucketPcie', NvU64, 64), ('sramBucketFirmware', NvU64, 72), ('sramBucketOther', NvU64, 80), ('sramErrorThresholdExceeded', NvBool, 88)]) +NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS(c.Struct): + SIZE = 40 + sramCorUni: int + sramUncParityUni: int + sramUncSecDedUni: int + dramCorTot: int + dramUncTot: int +struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS.register_fields([('sramCorUni', NvU64, 0), ('sramUncParityUni', NvU64, 8), ('sramUncSecDedUni', NvU64, 16), ('dramCorTot', NvU64, 24), ('dramUncTot', NvU64, 32)]) +NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS +@c.record +class struct_eccLocation(c.Struct): + SIZE = 12 + location: int + sublocation: int + extlocation: int +struct_eccLocation.register_fields([('location', NvU32, 0), ('sublocation', NvU32, 4), ('extlocation', NvU32, 8)]) +eccLocation: TypeAlias = struct_eccLocation +@c.record +class struct_NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY(c.Struct): + SIZE = 28 + unit: int + location: struct_eccLocation + address: int + bIsParity: int + count: int +struct_NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY.register_fields([('unit', NvU32, 0), ('location', eccLocation, 4), ('address', NvU32, 16), ('bIsParity', NvBool, 20), ('count', NvU32, 24)]) +NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY: TypeAlias = struct_NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY +@c.record +class struct_NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS(c.Struct): + SIZE = 16804 + entryCount: int + entries: c.Array[struct_NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY, Literal[600]] +struct_NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS.register_fields([('entryCount', NvU32, 0), ('entries', c.Array[NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY, Literal[600]], 4)]) +NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_INJECT_ERROR_PARAMS(c.Struct): + SIZE = 32 + unit: int + errorType: int + location: struct_eccLocation + flags: int + address: int +struct_NV2080_CTRL_ECC_INJECT_ERROR_PARAMS.register_fields([('unit', NvU32, 0), ('errorType', NvU8, 4), ('location', eccLocation, 8), ('flags', NvU32, 20), ('address', NvU64, 24)]) +NV2080_CTRL_ECC_INJECT_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_INJECT_ERROR_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS(c.Struct): + SIZE = 2 + bTpcRepairPending: int + bChannelRepairPending: int +struct_NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS.register_fields([('bTpcRepairPending', NvBool, 0), ('bChannelRepairPending', NvBool, 1)]) +NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS(c.Struct): + SIZE = 20 + event: int + action: int + bNotifyState: int + info32: int + info16: int +struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS.register_fields([('event', NvU32, 0), ('action', NvU32, 4), ('bNotifyState', NvBool, 8), ('info32', NvU32, 12), ('info16', NvU16, 16)]) +NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS +enum_NV2080_EVENT_HDACODEC_DSTATE: dict[int, str] = {(NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D0:=0): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D0', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D1:=1): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D1', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D2:=2): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D2', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_HOT:=3): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_HOT', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_COLD:=4): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_COLD', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_DSTATE_MAX:=5): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_DSTATE_MAX'} +NV2080_EVENT_HDACODEC_DSTATE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS(c.Struct): + SIZE = 8 + hSemMemory: int + semOffset: int +struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS.register_fields([('hSemMemory', NvHandle, 0), ('semOffset', NvU32, 4)]) +NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS(c.Struct): + SIZE = 48 + guestMSIAddr: int + guestMSIData: int + hSemMemory: int + isReset: int + vgpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] + domainId: int +struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS.register_fields([('guestMSIAddr', NvU64, 0), ('guestMSIData', NvU32, 8), ('hSemMemory', NvHandle, 12), ('isReset', NvBool, 16), ('vgpuUuid', c.Array[NvU8, Literal[16]], 17), ('domainId', NvU64, 40)]) +NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS(c.Struct): + SIZE = 8 + hSemMemory: int + isSemaMemValidationEnabled: int +struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS.register_fields([('hSemMemory', NvHandle, 0), ('isSemaMemValidationEnabled', NvBool, 4)]) +NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS(c.Struct): + SIZE = 4 + hEvent: int +struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS.register_fields([('hEvent', NvHandle, 0)]) +NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS +enum_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD: dict[int, str] = {(NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_FULL:=0): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_FULL', (NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_SIMPLE:=1): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_SIMPLE', (NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_CUSTOM:=2): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_CUSTOM'} +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS(c.Struct): + SIZE = 20 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int +struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16)]) +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS(c.Struct): + SIZE = 24 + hEventBuffer: int + tracepointMask: int + gspLoggingBufferSize: int + gspLoggingBufferWatermark: int +struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('tracepointMask', NvU64, 8), ('gspLoggingBufferSize', NvU32, 16), ('gspLoggingBufferWatermark', NvU32, 20)]) +NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS +NV2080_CTRL_FB_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_FB_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + fbInfoListSize: int + fbInfoList: ctypes.c_void_p +struct_NV2080_CTRL_FB_GET_INFO_PARAMS.register_fields([('fbInfoListSize', NvU32, 0), ('fbInfoList', NvP64, 8)]) +NV2080_CTRL_FB_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 1028 + fbInfoListSize: int + fbInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[128]] +struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS.register_fields([('fbInfoListSize', NvU32, 0), ('fbInfoList', c.Array[NV2080_CTRL_FB_INFO, Literal[128]], 4)]) +NV2080_CTRL_FB_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS(c.Struct): + SIZE = 16 + cpuVirtAddress: ctypes.c_void_p + gpuVirtAddress: int +struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS.register_fields([('cpuVirtAddress', NvP64, 0), ('gpuVirtAddress', NvU64, 8)]) +NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS(c.Struct): + SIZE = 24 + flags: int + driveStrengthRiseCount: int + driveStrengthFallCount: int + driveStrengthTermCount: int + slewStrengthRiseCount: int + slewStrengthFallCount: int +struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS.register_fields([('flags', NvU32, 0), ('driveStrengthRiseCount', NvU32, 4), ('driveStrengthFallCount', NvU32, 8), ('driveStrengthTermCount', NvU32, 12), ('slewStrengthRiseCount', NvU32, 16), ('slewStrengthFallCount', NvU32, 20)]) +NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS(c.Struct): + SIZE = 4024 + addressArray: c.Array[ctypes.c_uint64, Literal[500]] + addressArraySize: int + addressAlign: int + memBlockSizeBytes: int + flags: int +struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS.register_fields([('addressArray', c.Array[NvU64, Literal[500]], 0), ('addressArraySize', NvU32, 4000), ('addressAlign', NvU32, 4004), ('memBlockSizeBytes', NvU64, 4008), ('flags', NvU32, 4016)]) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS +@c.record +class struct_NV2080_CTRL_FB_IS_KIND_PARAMS(c.Struct): + SIZE = 12 + operation: int + kind: int + result: int +struct_NV2080_CTRL_FB_IS_KIND_PARAMS.register_fields([('operation', NvU32, 0), ('kind', NvU32, 4), ('result', NvBool, 8)]) +NV2080_CTRL_FB_IS_KIND_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_IS_KIND_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS(c.Struct): + SIZE = 16 + powerState: int + writeMode: int + bypassMode: int + rcmState: int +struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS.register_fields([('powerState', NvU32, 0), ('writeMode', NvU32, 4), ('bypassMode', NvU32, 8), ('rcmState', NvU32, 12)]) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS +NV2080_CTRL_CMD_FB_GET_FB_REGION_SURFACE_MEM_TYPE_FLAG: TypeAlias = c.Array[ctypes.c_ubyte, Literal[18]] +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO(c.Struct): + SIZE = 56 + base: int + limit: int + reserved: int + performance: int + supportCompressed: int + supportISO: int + bProtected: int + blackList: c.Array[ctypes.c_ubyte, Literal[18]] +struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO.register_fields([('base', NvU64, 0), ('limit', NvU64, 8), ('reserved', NvU64, 16), ('performance', NvU32, 24), ('supportCompressed', NvBool, 28), ('supportISO', NvBool, 29), ('bProtected', NvBool, 30), ('blackList', NV2080_CTRL_CMD_FB_GET_FB_REGION_SURFACE_MEM_TYPE_FLAG, 31)]) +NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS(c.Struct): + SIZE = 904 + numFBRegions: int + fbRegion: c.Array[struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO, Literal[16]] +struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS.register_fields([('numFBRegions', NvU32, 0), ('fbRegion', c.Array[NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO, Literal[16]], 8)]) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO(c.Struct): + SIZE = 32 + pageAddressWithEccOn: int + pageAddressWithEccOff: int + rbcAddress: int + source: int + status: int + timestamp: int +struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO.register_fields([('pageAddressWithEccOn', NvU64, 0), ('pageAddressWithEccOff', NvU64, 8), ('rbcAddress', NvU32, 16), ('source', NvU32, 20), ('status', NvU32, 24), ('timestamp', NvU32, 28)]) +NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO: TypeAlias = struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO +@c.record +class struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS(c.Struct): + SIZE = 2064 + offlined: c.Array[struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]] + pageSize: int + validEntries: int + numPagesAdded: int +struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('pageSize', NvU32, 2048), ('validEntries', NvU32, 2052), ('numPagesAdded', NvU32, 2056)]) +NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 2056 + offlined: c.Array[struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]] + validEntries: int + bRetirementPending: int + retirementPending: int +struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('validEntries', NvU32, 2048), ('bRetirementPending', NvBool, 2052), ('retirementPending', NvU8, 2053)]) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS +enum_NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_CMD_FB_ACR_QUERY_GET_CLIENT_REGION_STATUS:=0): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_CLIENT_REGION_STATUS', (NV2080_CTRL_CMD_FB_ACR_QUERY_GET_REGION_PROPERTY:=1): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_REGION_PROPERTY', (NV2080_CTRL_CMD_FB_ACR_QUERY_GET_FALCON_STATUS:=2): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_FALCON_STATUS'} +NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE: dict[int, str] = {(NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_NONE:=0): 'NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_NONE', (NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_INVALID_CLIENT_REQUEST:=1): 'NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_INVALID_CLIENT_REQUEST'} +NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_ACR_REQUEST_PARAMS(c.Struct): + SIZE = 16 + clientId: int + reqReadMask: int + reqWriteMask: int + regionSize: int +struct_ACR_REQUEST_PARAMS.register_fields([('clientId', NvU32, 0), ('reqReadMask', NvU32, 4), ('reqWriteMask', NvU32, 8), ('regionSize', NvU32, 12)]) +ACR_REQUEST_PARAMS: TypeAlias = struct_ACR_REQUEST_PARAMS +@c.record +class struct_ACR_REGION_ID_PROP(c.Struct): + SIZE = 32 + regionId: int + readMask: int + writeMask: int + regionSize: int + clientMask: int + physicalAddress: int +struct_ACR_REGION_ID_PROP.register_fields([('regionId', NvU32, 0), ('readMask', NvU32, 4), ('writeMask', NvU32, 8), ('regionSize', NvU32, 12), ('clientMask', NvU32, 16), ('physicalAddress', NvU64, 24)]) +ACR_REGION_ID_PROP: TypeAlias = struct_ACR_REGION_ID_PROP +@c.record +class struct_ACR_STATUS_PARAMS(c.Struct): + SIZE = 16 + allocStatus: int + regionId: int + physicalAddress: int +struct_ACR_STATUS_PARAMS.register_fields([('allocStatus', NvU32, 0), ('regionId', NvU32, 4), ('physicalAddress', NvU64, 8)]) +ACR_STATUS_PARAMS: TypeAlias = struct_ACR_STATUS_PARAMS +@c.record +class struct_ACR_REGION_HANDLE(c.Struct): + SIZE = 20 + hClient: int + hParent: int + hMemory: int + hClass: int + hDevice: int +struct_ACR_REGION_HANDLE.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hMemory', NvHandle, 8), ('hClass', NvU32, 12), ('hDevice', NvHandle, 16)]) +ACR_REGION_HANDLE: TypeAlias = struct_ACR_REGION_HANDLE +@c.record +class struct_ACR_FALCON_LS_STATUS(c.Struct): + SIZE = 4 + falconId: int + bIsInLs: int +struct_ACR_FALCON_LS_STATUS.register_fields([('falconId', NvU16, 0), ('bIsInLs', NvBool, 2)]) +ACR_FALCON_LS_STATUS: TypeAlias = struct_ACR_FALCON_LS_STATUS +@c.record +class struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS(c.Struct): + SIZE = 96 + queryType: int + errorCode: int + acrRegionIdProp: struct_ACR_REGION_ID_PROP + clientReq: struct_ACR_REQUEST_PARAMS + clientReqStatus: struct_ACR_STATUS_PARAMS + handle: struct_ACR_REGION_HANDLE + falconStatus: struct_ACR_FALCON_LS_STATUS +struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS.register_fields([('queryType', NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE, 0), ('errorCode', NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE, 4), ('acrRegionIdProp', ACR_REGION_ID_PROP, 8), ('clientReq', ACR_REQUEST_PARAMS, 40), ('clientReqStatus', ACR_STATUS_PARAMS, 56), ('handle', ACR_REGION_HANDLE, 72), ('falconStatus', ACR_FALCON_LS_STATUS, 92)]) +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 4 + sourceMask: int +struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS.register_fields([('sourceMask', NvU32, 0)]) +NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS(c.Struct): + SIZE = 16 + pCompBitCopyObj: ctypes.c_void_p + pSwizzleParams: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS.register_fields([('pCompBitCopyObj', NvP64, 0), ('pSwizzleParams', NvP64, 8)]) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS(c.Struct): + SIZE = 20 + fbpIndex: int + ltcMask: int + ltcCount: int + ltsMask: int + ltsCount: int +struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS.register_fields([('fbpIndex', NvU8, 0), ('ltcMask', NvU32, 4), ('ltcCount', NvU32, 8), ('ltsMask', NvU32, 12), ('ltsCount', NvU32, 16)]) +NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS(c.Struct): + SIZE = 72 + CBCBaseAddress: int + backingStorePA: int + backingStoreVA: c.POINTER[ctypes.c_ubyte] + backingStoreChunkPA: int + backingStoreChunkVA: c.POINTER[ctypes.c_ubyte] + backingStoreChunkSize: int + cacheWriteBitMap: c.POINTER[ctypes.c_ubyte] + backingStoreChunkOverfetch: int + PageSizeSrc: int + PageSizeDest: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS.register_fields([('CBCBaseAddress', NvU32, 0), ('backingStorePA', NvU64, 8), ('backingStoreVA', c.POINTER[NvU8], 16), ('backingStoreChunkPA', NvU64, 24), ('backingStoreChunkVA', c.POINTER[NvU8], 32), ('backingStoreChunkSize', NvU32, 40), ('cacheWriteBitMap', c.POINTER[NvU8], 48), ('backingStoreChunkOverfetch', NvBool, 56), ('PageSizeSrc', NvU32, 60), ('PageSizeDest', NvU32, 64)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS(c.Struct): + SIZE = 40 + fcbits: c.POINTER[ctypes.c_uint32] + compbits: c.POINTER[ctypes.c_uint32] + dataPhysicalStart: int + surfaceOffset: int + comptagLine: int + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS.register_fields([('fcbits', c.POINTER[NvU32], 0), ('compbits', c.POINTER[NvU32], 8), ('dataPhysicalStart', NvU64, 16), ('surfaceOffset', NvU64, 24), ('comptagLine', NvU32, 32), ('upper64KBCompbitSel', NvBool, 36)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS(c.Struct): + SIZE = 40 + fcbits: int + compbits: int + writeFc: int + dataPhysicalStart: int + surfaceOffset: int + comptagLine: int + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS.register_fields([('fcbits', NvU32, 0), ('compbits', NvU32, 4), ('writeFc', NvBool, 8), ('dataPhysicalStart', NvU64, 16), ('surfaceOffset', NvU64, 24), ('comptagLine', NvU32, 32), ('upper64KBCompbitSel', NvBool, 36)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS(c.Struct): + SIZE = 32 + SrcDataPhysicalStart: int + SrcComptagLine: int + page64KB: int + compbitBuffer: c.POINTER[ctypes.c_uint32] + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS.register_fields([('SrcDataPhysicalStart', NvU64, 0), ('SrcComptagLine', NvU32, 8), ('page64KB', NvU32, 12), ('compbitBuffer', c.POINTER[NvU32], 16), ('upper64KBCompbitSel', NvBool, 24)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS(c.Struct): + SIZE = 32 + DstDataPhysicalStart: int + DstComptagLine: int + page64KB: int + compbitBuffer: c.POINTER[ctypes.c_uint32] + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS.register_fields([('DstDataPhysicalStart', NvU64, 0), ('DstComptagLine', NvU32, 8), ('page64KB', NvU32, 12), ('compbitBuffer', c.POINTER[NvU32], 16), ('upper64KBCompbitSel', NvBool, 24)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS(c.Struct): + SIZE = 1 + bForceBar1: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS.register_fields([('bForceBar1', NvBool, 0)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS(c.Struct): + SIZE = 16 + pAmapConfParams: ctypes.c_void_p + pCbcSwizzleParams: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS.register_fields([('pAmapConfParams', NvP64, 0), ('pCbcSwizzleParams', NvP64, 8)]) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS +enum_CTRL_CMD_FB_CBC_OP: dict[int, str] = {(CTRL_CMD_FB_CBC_OP_CLEAN:=0): 'CTRL_CMD_FB_CBC_OP_CLEAN', (CTRL_CMD_FB_CBC_OP_INVALIDATE:=1): 'CTRL_CMD_FB_CBC_OP_INVALIDATE'} +CTRL_CMD_FB_CBC_OP: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS(c.Struct): + SIZE = 4 + fbCBCOp: int +struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS.register_fields([('fbCBCOp', CTRL_CMD_FB_CBC_OP, 0)]) +NV2080_CTRL_CMD_FB_CBC_OP_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS(c.Struct): + SIZE = 512 + pCompTags: c.Array[ctypes.c_uint32, Literal[127]] + numCompTags: int +struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS.register_fields([('pCompTags', c.Array[NvU32, Literal[127]], 0), ('numCompTags', NvU32, 508)]) +NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS(c.Struct): + SIZE = 28 + attr: int + attr2: int + size: int + ctagOffset: int + hwResId: int + retCompTagLineMin: int + retCompTagLineMax: int +struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS.register_fields([('attr', NvU32, 0), ('attr2', NvU32, 4), ('size', NvU32, 8), ('ctagOffset', NvU32, 12), ('hwResId', NvU32, 16), ('retCompTagLineMin', NvU32, 20), ('retCompTagLineMax', NvU32, 24)]) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS(c.Struct): + SIZE = 4 + hwResId: int +struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS.register_fields([('hwResId', NvU32, 0)]) +NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS +enum_NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE: dict[int, str] = {(NV2080_CTRL_CMD_FB_SET_VPR:=0): 'NV2080_CTRL_CMD_FB_SET_VPR'} +NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_CMD_FB_VPR_ERROR_CODE: dict[int, str] = {(NV2080_CTRL_CMD_FB_VPR_ERROR_GENERIC:=0): 'NV2080_CTRL_CMD_FB_VPR_ERROR_GENERIC', (NV2080_CTRL_CMD_FB_VPR_ERROR_INVALID_CLIENT_REQUEST:=1): 'NV2080_CTRL_CMD_FB_VPR_ERROR_INVALID_CLIENT_REQUEST'} +NV2080_CTRL_CMD_FB_VPR_ERROR_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_VPR_REQUEST_PARAMS(c.Struct): + SIZE = 8 + startAddr: int + size: int +struct_VPR_REQUEST_PARAMS.register_fields([('startAddr', NvU32, 0), ('size', NvU32, 4)]) +VPR_REQUEST_PARAMS: TypeAlias = struct_VPR_REQUEST_PARAMS +@c.record +class struct_VPR_STATUS_PARAMS(c.Struct): + SIZE = 4 + status: int +struct_VPR_STATUS_PARAMS.register_fields([('status', NvU32, 0)]) +VPR_STATUS_PARAMS: TypeAlias = struct_VPR_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS(c.Struct): + SIZE = 16 + requestType: int + requestParams: struct_VPR_REQUEST_PARAMS + statusParams: struct_VPR_STATUS_PARAMS +struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS.register_fields([('requestType', NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE, 0), ('requestParams', VPR_REQUEST_PARAMS, 4), ('statusParams', VPR_STATUS_PARAMS, 12)]) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS +PNV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS] +@c.record +class struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 264 + offlinedPages: c.Array[ctypes.c_uint32, Literal[64]] + pageSize: int + validEntries: int +struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS.register_fields([('offlinedPages', c.Array[NvU32, Literal[64]], 0), ('pageSize', NvU32, 256), ('validEntries', NvU32, 260)]) +NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS(c.Struct): + SIZE = 56 + defaultPageSize: int + comptagsPerCacheLine: int + unpackedComptagLinesPerCacheLine: int + compCacheLineSizePerLTC: int + unpackedCompCacheLineSizePerLTC: int + slicesPerLTC: int + numActiveLTCs: int + familyName: int + chipName: int + bitsPerRAMEntry: int + ramBankWidth: int + bitsPerComptagLine: int + ramEntriesPerCompCacheLine: int + comptagLineSize: int +struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS.register_fields([('defaultPageSize', NvU32, 0), ('comptagsPerCacheLine', NvU32, 4), ('unpackedComptagLinesPerCacheLine', NvU32, 8), ('compCacheLineSizePerLTC', NvU32, 12), ('unpackedCompCacheLineSizePerLTC', NvU32, 16), ('slicesPerLTC', NvU32, 20), ('numActiveLTCs', NvU32, 24), ('familyName', NvU32, 28), ('chipName', NvU32, 32), ('bitsPerRAMEntry', NvU32, 36), ('ramBankWidth', NvU32, 40), ('bitsPerComptagLine', NvU32, 44), ('ramEntriesPerCompCacheLine', NvU32, 48), ('comptagLineSize', NvU32, 52)]) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_RRD_PARAMS(c.Struct): + SIZE = 4 + rrd: int +struct_NV2080_CTRL_FB_SET_RRD_PARAMS.register_fields([('rrd', NvU32, 0)]) +NV2080_CTRL_FB_SET_RRD_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_RRD_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS(c.Struct): + SIZE = 1 + limit: int +struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS.register_fields([('limit', NvU8, 0)]) +NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +NV2080_CTRL_FB_SET_READ_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +NV2080_CTRL_FB_SET_WRITE_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS(c.Struct): + SIZE = 56 + alignType: int + alignAttr: int + alignInputFlags: int + alignHead: int + alignSize: int + alignHeight: int + alignWidth: int + alignPitch: int + alignPad: int + alignMask: int + alignKind: int + alignAdjust: int + alignAttr2: int +struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS.register_fields([('alignType', NvU32, 0), ('alignAttr', NvU32, 4), ('alignInputFlags', NvU32, 8), ('alignHead', NvU32, 12), ('alignSize', NvU64, 16), ('alignHeight', NvU32, 24), ('alignWidth', NvU32, 28), ('alignPitch', NvU32, 32), ('alignPad', NvU32, 36), ('alignMask', NvU32, 40), ('alignKind', NvU32, 44), ('alignAdjust', NvU32, 48), ('alignAttr2', NvU32, 52)]) +NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS(c.Struct): + SIZE = 32 + cbcBaseAddress: int + compCacheLineSize: int + backingStoreStartPA: int + backingStoreAllocPA: int + backingStoreChunkOverfetch: int +struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS.register_fields([('cbcBaseAddress', NvU32, 0), ('compCacheLineSize', NvU32, 4), ('backingStoreStartPA', NvU64, 8), ('backingStoreAllocPA', NvU64, 16), ('backingStoreChunkOverfetch', NvU32, 24)]) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_FB_REMAP_ENTRY(c.Struct): + SIZE = 12 + remapRegVal: int + timestamp: int + fbpa: int + sublocation: int + source: int + flags: int +struct_NV2080_CTRL_FB_REMAP_ENTRY.register_fields([('remapRegVal', NvU32, 0), ('timestamp', NvU32, 4), ('fbpa', NvU8, 8), ('sublocation', NvU8, 9), ('source', NvU8, 10), ('flags', NvU8, 11)]) +NV2080_CTRL_FB_REMAP_ENTRY: TypeAlias = struct_NV2080_CTRL_FB_REMAP_ENTRY +@c.record +class struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS(c.Struct): + SIZE = 6152 + entryCount: int + flags: int + entries: c.Array[struct_NV2080_CTRL_FB_REMAP_ENTRY, Literal[512]] +struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS.register_fields([('entryCount', NvU32, 0), ('flags', NvU8, 4), ('entries', c.Array[NV2080_CTRL_FB_REMAP_ENTRY, Literal[512]], 8)]) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS(c.Struct): + SIZE = 24 + data: c.Array[ctypes.c_ubyte, Literal[24]] +struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS.register_fields([('data', c.Array[NvU8, Literal[24]], 0)]) +NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS(c.Struct): + SIZE = 16 + swizzId: int + fbpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('fbpEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ltcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ltcEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ltsEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ltsEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpaEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpaEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpaSubpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpaSubpEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpLogicalIndex: int +struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpLogicalIndex', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ropEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ropEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS(c.Struct): + SIZE = 16 + swizzId: int + sysEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('sysEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ltcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ltcEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ltsEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ltsEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + fbpaEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('fbpaEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ropEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ropEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + swizzId: int + fbpaSubpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('fbpaSubpEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS(c.Struct): + SIZE = 8 + sysIdx: int + sysl2LtcEnMask: int +struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS.register_fields([('sysIdx', NvU32, 0), ('sysl2LtcEnMask', NvU32, 4)]) +NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS(c.Struct): + SIZE = 16 + sysIdx: int + sysl2LtsEnMask: int +struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS.register_fields([('sysIdx', NvU32, 0), ('sysl2LtsEnMask', NvU64, 8)]) +NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + pacEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('pacEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + logicalLtcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('logicalLtcEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + swizzId: int + logicalLtcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('logicalLtcEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_QUERY(c.Struct): + SIZE = 32 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryParams: struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams(c.Struct): + SIZE = 24 + inv: struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS + fbp: struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS + ltc: struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS + lts: struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS + fbpa: struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS + rop: struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS + dmLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS + dmLts: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS + dmFbpa: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS + dmRop: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS + dmFbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS + fbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS + fbpLogicalMap: struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS + sysl2Ltc: struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS + pac: struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS + logicalLtc: struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS + dmLogicalLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS + sysl2Lts: struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS + sys: struct_NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS +struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams.register_fields([('inv', NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS, 0), ('fbp', NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS, 0), ('ltc', NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS, 0), ('lts', NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS, 0), ('fbpa', NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS, 0), ('rop', NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS, 0), ('dmLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS, 0), ('dmLts', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS, 0), ('dmFbpa', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS, 0), ('dmRop', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS, 0), ('dmFbpaSubp', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS, 0), ('fbpaSubp', NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS, 0), ('fbpLogicalMap', NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS, 0), ('sysl2Ltc', NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS, 0), ('pac', NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS, 0), ('logicalLtc', NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS, 0), ('dmLogicalLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS, 0), ('sysl2Lts', NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS, 0), ('sys', NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS, 0)]) +struct_NV2080_CTRL_FB_FS_INFO_QUERY.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryParams', struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams, 8)]) +NV2080_CTRL_FB_FS_INFO_QUERY: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_QUERY +@c.record +class struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS(c.Struct): + SIZE = 3848 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_FB_FS_INFO_QUERY, Literal[120]] +struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_FB_FS_INFO_QUERY, Literal[120]], 8)]) +NV2080_CTRL_FB_GET_FS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS(c.Struct): + SIZE = 20 + histogram: c.Array[ctypes.c_uint32, Literal[5]] +struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS.register_fields([('histogram', c.Array[NvU32, Literal[5]], 0)]) +NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS +@c.record +class struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO(c.Struct): + SIZE = 16 + pageNumber: int + source: int +struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO.register_fields([('pageNumber', NvU64, 0), ('source', NvU8, 8)]) +NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO: TypeAlias = struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO +@c.record +class struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 1040 + offlined: c.Array[struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO, Literal[64]] + validEntries: int + baseIndex: int + bMore: int +struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('validEntries', NvU32, 1024), ('baseIndex', NvU32, 1028), ('bMore', NvBool, 1032)]) +NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO(c.Struct): + SIZE = 24 + client: int + flags: int + beginAddr: int + size: int +struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO.register_fields([('client', NvU32, 0), ('flags', NvU32, 4), ('beginAddr', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_CMD_FB_ALLOCATION_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_CLIENT_INFO(c.Struct): + SIZE = 112 + handle: int + pid: int + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] +struct_NV2080_CTRL_CMD_FB_CLIENT_INFO.register_fields([('handle', NvHandle, 0), ('pid', NvU32, 4), ('subProcessID', NvU32, 8), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 12)]) +NV2080_CTRL_CMD_FB_CLIENT_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_CLIENT_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS(c.Struct): + SIZE = 32 + allocCount: int + pAllocInfo: ctypes.c_void_p + clientCount: int + pClientInfo: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS.register_fields([('allocCount', NvU64, 0), ('pAllocInfo', NvP64, 8), ('clientCount', NvU64, 16), ('pClientInfo', NvP64, 24)]) +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS(c.Struct): + SIZE = 1 + bOnline: int +struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS.register_fields([('bOnline', NvBool, 0)]) +NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS(c.Struct): + SIZE = 544 + numaNodeId: int + numaMemAddr: int + numaMemSize: int + numaOfflineAddressesCount: int + numaOfflineAddresses: c.Array[ctypes.c_uint64, Literal[64]] +struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS.register_fields([('numaNodeId', NvS32, 0), ('numaMemAddr', NvU64, 8), ('numaMemSize', NvU64, 16), ('numaOfflineAddressesCount', NvU32, 24), ('numaOfflineAddresses', c.Array[NvU64, Literal[64]], 32)]) +NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS(c.Struct): + SIZE = 32 + maxSubmittedSemaphoreValueOffset: int + monitoredFenceThresholdOffset: int + size: int + caps: int +struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS.register_fields([('maxSubmittedSemaphoreValueOffset', NvU64, 0), ('monitoredFenceThresholdOffset', NvU64, 8), ('size', NvU64, 16), ('caps', NvU32, 24)]) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_STATS_ENTRY(c.Struct): + SIZE = 48 + totalSize: int + rsvdSize: int + osSize: int + r1Size: int + r2Size: int + freeSize: int +struct_NV2080_CTRL_CMD_FB_STATS_ENTRY.register_fields([('totalSize', NvU64, 0), ('rsvdSize', NvU64, 8), ('osSize', NvU64, 16), ('r1Size', NvU64, 24), ('r2Size', NvU64, 32), ('freeSize', NvU64, 40)]) +NV2080_CTRL_CMD_FB_STATS_ENTRY: TypeAlias = struct_NV2080_CTRL_CMD_FB_STATS_ENTRY +@c.record +class struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS(c.Struct): + SIZE = 8 + gfid: int + invalidateAll: int +struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS.register_fields([('gfid', NvU32, 0), ('invalidateAll', NvBool, 4)]) +NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS: TypeAlias = struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO(c.Struct): + SIZE = 24 + allocSize: int + numBlocks: int + rsvdSize: int +struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO.register_fields([('allocSize', NvU64, 0), ('numBlocks', NvU32, 8), ('rsvdSize', NvU64, 16)]) +NV2080_CTRL_CMD_FB_STATS_OWNER_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS(c.Struct): + SIZE = 4856 + version: int + fbSizeInfo: struct_NV2080_CTRL_CMD_FB_STATS_ENTRY + fbBlockInfo: c.Array[struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO, Literal[200]] +struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS.register_fields([('version', NvU64, 0), ('fbSizeInfo', NV2080_CTRL_CMD_FB_STATS_ENTRY, 8), ('fbBlockInfo', c.Array[NV2080_CTRL_CMD_FB_STATS_OWNER_INFO, Literal[200]], 56)]) +NV2080_CTRL_CMD_FB_STATS_GET_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS(c.Struct): + SIZE = 24 + bStaticBar1Enabled: int + bStaticBar1WriteCombined: int + staticBar1StartOffset: int + staticBar1Size: int +struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS.register_fields([('bStaticBar1Enabled', NvBool, 0), ('bStaticBar1WriteCombined', NvBool, 1), ('staticBar1StartOffset', NvU64, 8), ('staticBar1Size', NvU64, 16)]) +NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + currentConfiguration: int +struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS.register_fields([('currentConfiguration', NvU32, 0)]) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + newConfiguration: int +struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS.register_fields([('newConfiguration', NvU32, 0)]) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS(c.Struct): + SIZE = 4 + isSupported: int +struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS.register_fields([('isSupported', NvU32, 0)]) +NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS(c.Struct): + SIZE = 4 + currentStatus: int +struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS.register_fields([('currentStatus', NvU32, 0)]) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS(c.Struct): + SIZE = 6 + flagCollectSchmooData: int + flagWrTrHybridVrefEn: int + flagWrTrHybridNonVrefEn: int + flagRdTrHybridVrefEn: int + flagRdTrHybridNonVrefEn: int + skipBootTraining: int +struct_NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS.register_fields([('flagCollectSchmooData', NvBool, 0), ('flagWrTrHybridVrefEn', NvBool, 1), ('flagWrTrHybridNonVrefEn', NvBool, 2), ('flagRdTrHybridVrefEn', NvBool, 3), ('flagRdTrHybridNonVrefEn', NvBool, 4), ('skipBootTraining', NvBool, 5)]) +NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS +enum_NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE: dict[int, str] = {(NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_DISPLAY_FRM:=0): 'NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_DISPLAY_FRM', (NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_DISPLAY_FRM_RESERVED:=1): 'NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_DISPLAY_FRM_RESERVED', (NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_UEFI:=2): 'NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_UEFI'} +NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO(c.Struct): + SIZE = 24 + base: int + size: int + carveoutType: int +struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('carveoutType', NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE, 16)]) +NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO: TypeAlias = struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO +@c.record +class struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS(c.Struct): + SIZE = 200 + numCarveoutRegions: int + carveoutRegion: c.Array[struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO, Literal[8]] +struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS.register_fields([('numCarveoutRegions', NvU32, 0), ('carveoutRegion', c.Array[NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO, Literal[8]], 8)]) +NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + base: int + numEntries: int +struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS.register_fields([('hChannel', NvHandle, 0), ('base', NvU64, 8), ('numEntries', NvU32, 16)]) +NV2080_CTRL_CMD_SET_GPFIFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_BIND_CHANNEL(c.Struct): + SIZE = 8 + hClient: int + hChannel: int +struct_NV2080_CTRL_FIFO_BIND_CHANNEL.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4)]) +NV2080_CTRL_FIFO_BIND_CHANNEL: TypeAlias = struct_NV2080_CTRL_FIFO_BIND_CHANNEL +@c.record +class struct_NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS(c.Struct): + SIZE = 132 + bindChannelCount: int + bindChannels: c.Array[struct_NV2080_CTRL_FIFO_BIND_CHANNEL, Literal[16]] +struct_NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS.register_fields([('bindChannelCount', NvU32, 0), ('bindChannels', c.Array[NV2080_CTRL_FIFO_BIND_CHANNEL, Literal[16]], 4)]) +NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS(c.Struct): + SIZE = 8 + physChannelCount: int + physChannelCountInUse: int +struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS.register_fields([('physChannelCount', NvU32, 0), ('physChannelCountInUse', NvU32, 4)]) +NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS +NV2080_CTRL_FIFO_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS(c.Struct): + SIZE = 2056 + fifoInfoTblSize: int + fifoInfoTbl: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[256]] + engineType: int +struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS.register_fields([('fifoInfoTblSize', NvU32, 0), ('fifoInfoTbl', c.Array[NV2080_CTRL_FIFO_INFO, Literal[256]], 4), ('engineType', NvU32, 2052)]) +NV2080_CTRL_FIFO_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS(c.Struct): + SIZE = 4 + hChannel: int +struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS.register_fields([('hChannel', NvHandle, 0)]) +NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS(c.Struct): + SIZE = 536 + bDisable: int + numChannels: int + bOnlyDisableScheduling: int + bRewindGpPut: int + pRunlistPreemptEvent: ctypes.c_void_p + hClientList: c.Array[ctypes.c_uint32, Literal[64]] + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS.register_fields([('bDisable', NvBool, 0), ('numChannels', NvU32, 4), ('bOnlyDisableScheduling', NvBool, 8), ('bRewindGpPut', NvBool, 9), ('pRunlistPreemptEvent', NvP64, 16), ('hClientList', c.Array[NvHandle, Literal[64]], 24), ('hChannelList', c.Array[NvHandle, Literal[64]], 280)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_MEM_INFO(c.Struct): + SIZE = 24 + aperture: int + base: int + size: int +struct_NV2080_CTRL_FIFO_MEM_INFO.register_fields([('aperture', NvU32, 0), ('base', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_FIFO_MEM_INFO: TypeAlias = struct_NV2080_CTRL_FIFO_MEM_INFO +@c.record +class struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO(c.Struct): + SIZE = 104 + inst: struct_NV2080_CTRL_FIFO_MEM_INFO + ramfc: struct_NV2080_CTRL_FIFO_MEM_INFO + methodBuf: c.Array[struct_NV2080_CTRL_FIFO_MEM_INFO, Literal[2]] + methodBufCount: int +struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO.register_fields([('inst', NV2080_CTRL_FIFO_MEM_INFO, 0), ('ramfc', NV2080_CTRL_FIFO_MEM_INFO, 24), ('methodBuf', c.Array[NV2080_CTRL_FIFO_MEM_INFO, Literal[2]], 48), ('methodBufCount', NvU32, 96)]) +NV2080_CTRL_FIFO_CHANNEL_MEM_INFO: TypeAlias = struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO +@c.record +class struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS(c.Struct): + SIZE = 112 + hChannel: int + chMemInfo: struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO +struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS.register_fields([('hChannel', NvHandle, 0), ('chMemInfo', NV2080_CTRL_FIFO_CHANNEL_MEM_INFO, 8)]) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS(c.Struct): + SIZE = 8 + aperture: int + attribute: int +struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS.register_fields([('aperture', NvU32, 0), ('attribute', NvU32, 4)]) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY(c.Struct): + SIZE = 112 + timestampNs: int + timeRunTotalNs: int + timeRunNs: int + swrlId: int + targetTimeSlice: int + cumulativePreemptionTime: int + cumulativeIdleTime: int + counters: c.Array[ctypes.c_uint64, Literal[8]] +NvS64: TypeAlias = ctypes.c_int64 +struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY.register_fields([('timestampNs', NvU64, 0), ('timeRunTotalNs', NvS64, 8), ('timeRunNs', NvU32, 16), ('swrlId', NvU32, 20), ('targetTimeSlice', NvU32, 24), ('cumulativePreemptionTime', NvU64, 32), ('cumulativeIdleTime', NvU64, 40), ('counters', c.Array[NvU64, Literal[8]], 48)]) +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS(c.Struct): + SIZE = 22424 + engineId: int + count: int + entry: c.Array[struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY, Literal[200]] + schedPolicy: int + arrEnabled: int + arrAvgFactor: int + targetTimesliceNs: int +struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS.register_fields([('engineId', NvU32, 0), ('count', NvU32, 4), ('entry', c.Array[NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY, Literal[200]], 8), ('schedPolicy', NvU32, 22408), ('arrEnabled', NvU32, 22412), ('arrAvgFactor', NvU32, 22416), ('targetTimesliceNs', NvU32, 22420)]) +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS(c.Struct): + SIZE = 8 + timeout: int + bEnable: int +struct_NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS.register_fields([('timeout', NvU32, 0), ('bEnable', NvBool, 4)]) +NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DEVICE_ENTRY(c.Struct): + SIZE = 100 + engineData: c.Array[ctypes.c_uint32, Literal[16]] + pbdmaIds: c.Array[ctypes.c_uint32, Literal[2]] + pbdmaFaultIds: c.Array[ctypes.c_uint32, Literal[2]] + numPbdmas: int + engineName: c.Array[ctypes.c_char, Literal[16]] +struct_NV2080_CTRL_FIFO_DEVICE_ENTRY.register_fields([('engineData', c.Array[NvU32, Literal[16]], 0), ('pbdmaIds', c.Array[NvU32, Literal[2]], 64), ('pbdmaFaultIds', c.Array[NvU32, Literal[2]], 72), ('numPbdmas', NvU32, 80), ('engineName', c.Array[ctypes.c_char, Literal[16]], 84)]) +NV2080_CTRL_FIFO_DEVICE_ENTRY: TypeAlias = struct_NV2080_CTRL_FIFO_DEVICE_ENTRY +@c.record +class struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS(c.Struct): + SIZE = 3212 + baseIndex: int + numEntries: int + bMore: int + entries: c.Array[struct_NV2080_CTRL_FIFO_DEVICE_ENTRY, Literal[32]] +struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS.register_fields([('baseIndex', NvU32, 0), ('numEntries', NvU32, 4), ('bMore', NvBool, 8), ('entries', c.Array[NV2080_CTRL_FIFO_DEVICE_ENTRY, Literal[32]], 12)]) +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS(c.Struct): + SIZE = 12 + engineType: int + vChid: int + faultType: int +struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS.register_fields([('engineType', NvU32, 0), ('vChid', NvU32, 4), ('faultType', NvU32, 8)]) +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS(c.Struct): + SIZE = 8 + flags: int + schedPolicy: int +struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS.register_fields([('flags', NvU32, 0), ('schedPolicy', NvU32, 4)]) +NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS(c.Struct): + SIZE = 32 + hClient: int + hChannel: int + hUserdMemory: int + gpFifoEntries: int + gpFifoOffset: int + userdOffset: int +struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('hUserdMemory', NvHandle, 8), ('gpFifoEntries', NvU32, 12), ('gpFifoOffset', NvU64, 16), ('userdOffset', NvU64, 24)]) +NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + addressSpace: int + cacheAttrib: int +struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('addressSpace', NvU32, 16), ('cacheAttrib', NvU32, 20)]) +NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS(c.Struct): + SIZE = 516 + runlistId: int + bitMask: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS.register_fields([('runlistId', NvU32, 0), ('bitMask', c.Array[NvU32, Literal[128]], 4)]) +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS(c.Struct): + SIZE = 520 + numChannels: int + hClientList: c.Array[ctypes.c_uint32, Literal[64]] + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] + bEnableAfterKeyRotation: int +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS.register_fields([('numChannels', NvU32, 0), ('hClientList', c.Array[NvHandle, Literal[64]], 4), ('hChannelList', c.Array[NvHandle, Literal[64]], 260), ('bEnableAfterKeyRotation', NvBool, 516)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS(c.Struct): + SIZE = 264 + numChannels: int + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] + bEnableAfterKeyRotation: int +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS.register_fields([('numChannels', NvU32, 0), ('hChannelList', c.Array[NvHandle, Literal[64]], 4), ('bEnableAfterKeyRotation', NvBool, 260)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS(c.Struct): + SIZE = 20 + engineId: int + schedPolicy: int + arrEnabled: int + targetTimesliceNs: int + arrAvgFactor: int +struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS.register_fields([('engineId', NvU32, 0), ('schedPolicy', NvU32, 4), ('arrEnabled', NvU32, 8), ('targetTimesliceNs', NvU32, 12), ('arrAvgFactor', NvU32, 16)]) +NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS(c.Struct): + SIZE = 24 + engineId: int + schedPolicy: int + enableArr: int + timesliceTargetNs: int + frequencyForARR: int + avgFactorForARR: int +struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS.register_fields([('engineId', NvU32, 0), ('schedPolicy', NvU32, 4), ('enableArr', NvU32, 8), ('timesliceTargetNs', NvU32, 12), ('frequencyForARR', NvU32, 16), ('avgFactorForARR', NvU32, 20)]) +NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS(c.Struct): + SIZE = 44 + engineId: int + supportedSchedulers: c.Array[ctypes.c_uint32, Literal[3]] + bIsArrModeSupported: int + maxTimesliceNs: int + minTimesliceNs: int + maxFrequencyForARR: int + minFrequencyForARR: int + maxAvgFactorForARR: int + minAvgFactorForARR: int +struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS.register_fields([('engineId', NvU32, 0), ('supportedSchedulers', c.Array[NvU32, Literal[3]], 4), ('bIsArrModeSupported', NvBool, 16), ('maxTimesliceNs', NvU32, 20), ('minTimesliceNs', NvU32, 24), ('maxFrequencyForARR', NvU32, 28), ('minFrequencyForARR', NvU32, 32), ('maxAvgFactorForARR', NvU32, 36), ('minAvgFactorForARR', NvU32, 40)]) +NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS(c.Struct): + SIZE = 1552 + hClient: int + hChannelOrTsg: int + tsgId: int + numChannels: int + channelUniqueID: c.Array[ctypes.c_uint32, Literal[128]] + vasUniqueID: c.Array[ctypes.c_uint32, Literal[128]] + veid: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannelOrTsg', NvHandle, 4), ('tsgId', NvU32, 8), ('numChannels', NvU32, 12), ('channelUniqueID', c.Array[NvU32, Literal[128]], 16), ('vasUniqueID', c.Array[NvU32, Literal[128]], 528), ('veid', c.Array[NvU32, Literal[128]], 1040)]) +NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS(c.Struct): + SIZE = 1540 + hClients: c.Array[ctypes.c_uint32, Literal[128]] + hChannels: c.Array[ctypes.c_uint32, Literal[128]] + numChannels: int + channelUniqueIDs: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS.register_fields([('hClients', c.Array[NvHandle, Literal[128]], 0), ('hChannels', c.Array[NvHandle, Literal[128]], 512), ('numChannels', NvU32, 1024), ('channelUniqueIDs', c.Array[NvU32, Literal[128]], 1028)]) +NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + mode: int + hVASpace: int +struct_NV2080_CTRL_FLA_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('mode', NvU32, 16), ('hVASpace', NvHandle, 20)]) +NV2080_CTRL_FLA_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_RANGE_PARAMS +enum_NV2080_CTRL_FLA_ADDRSPACE: dict[int, str] = {(NV2080_CTRL_FLA_ADDRSPACE_SYSMEM:=0): 'NV2080_CTRL_FLA_ADDRSPACE_SYSMEM', (NV2080_CTRL_FLA_ADDRSPACE_FBMEM:=1): 'NV2080_CTRL_FLA_ADDRSPACE_FBMEM'} +NV2080_CTRL_FLA_ADDRSPACE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_FLA_ACTION: dict[int, str] = {(NV2080_CTRL_FLA_ACTION_BIND:=0): 'NV2080_CTRL_FLA_ACTION_BIND', (NV2080_CTRL_FLA_ACTION_UNBIND:=1): 'NV2080_CTRL_FLA_ACTION_UNBIND'} +NV2080_CTRL_FLA_ACTION: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS(c.Struct): + SIZE = 16 + imbPhysAddr: int + addrSpace: int + flaAction: int +struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS.register_fields([('imbPhysAddr', NvU64, 0), ('addrSpace', NV2080_CTRL_FLA_ADDRSPACE, 8), ('flaAction', NV2080_CTRL_FLA_ACTION, 12)]) +NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS(c.Struct): + SIZE = 16 + base: int + size: int +struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8)]) +NV2080_CTRL_FLA_GET_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS(c.Struct): + SIZE = 16 + totalSize: int + freeSize: int +struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS.register_fields([('totalSize', NvU64, 0), ('freeSize', NvU64, 8)]) +NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS(c.Struct): + SIZE = 12 + flcnID: int + heapSize: int + heapFree: int +struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS.register_fields([('flcnID', NvU32, 0), ('heapSize', NvU32, 4), ('heapFree', NvU32, 8)]) +NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS(c.Struct): + SIZE = 8 + engine: int + engineArch: int +struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS.register_fields([('engine', NvU32, 0), ('engineArch', NvU32, 4)]) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER(c.Struct): + SIZE = 36 + mask: c.Array[ctypes.c_ubyte, Literal[36]] +struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER.register_fields([('mask', c.Array[NvU8, Literal[36]], 0)]) +NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS(c.Struct): + SIZE = 24 + engine: int + pageSize: int + offset: int + size: int + queueFeatureId: int +NvUPtr: TypeAlias = ctypes.c_uint64 +struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS.register_fields([('engine', NvU32, 0), ('pageSize', NvU32, 4), ('offset', NvUPtr, 8), ('size', NvU32, 16), ('queueFeatureId', NvU8, 20)]) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS(c.Struct): + SIZE = 44 + engine: int + eventFilter: struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER + queueId: int +struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS.register_fields([('engine', NvU32, 0), ('eventFilter', NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER, 4), ('queueId', NvU8, 40)]) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +NV2080_CTRL_FLCN_USTREAMER_CONTROL_GET_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +NV2080_CTRL_FLCN_USTREAMER_CONTROL_SET_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 80 + hUserClient: int + hChannel: int + alignment: int + size: int + bufferHandle: ctypes.c_void_p + pageCount: int + physAddr: int + aperture: int + kind: int + pageSize: int + bIsContigous: int + bDeviceDescendant: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('alignment', NvU64, 8), ('size', NvU64, 16), ('bufferHandle', NvP64, 24), ('pageCount', NvU64, 32), ('physAddr', NvU64, 40), ('aperture', NvU32, 48), ('kind', NvU32, 52), ('pageSize', NvU32, 56), ('bIsContigous', NvBool, 60), ('bDeviceDescendant', NvBool, 61), ('uuid', c.Array[NvU8, Literal[16]], 62)]) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + totalBufferSize: int +struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('totalBufferSize', NvU64, 8)]) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + bInput: int +struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS.register_fields([('gpioPin', NvU32, 0), ('bInput', NvBool, 4)]) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + value: int +struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS.register_fields([('gpioPin', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + value: int +struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS.register_fields([('gpioPin', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS(c.Struct): + SIZE = 8 + function: int + pin: int +struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS.register_fields([('function', NvU32, 0), ('pin', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS +NV2080_CTRL_GPU_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + gpuInfoListSize: int + gpuInfoList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_INFO_PARAMS.register_fields([('gpuInfoListSize', NvU32, 0), ('gpuInfoList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 564 + gpuInfoListSize: int + gpuInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[70]] +struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS.register_fields([('gpuInfoListSize', NvU32, 0), ('gpuInfoList', c.Array[NV2080_CTRL_GPU_INFO, Literal[70]], 4)]) +NV2080_CTRL_GPU_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS(c.Struct): + SIZE = 132 + gpuNameStringFlags: int + gpuNameString: struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString +@c.record +class struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString(c.Struct): + SIZE = 128 + ascii: c.Array[ctypes.c_ubyte, Literal[64]] + unicode: c.Array[ctypes.c_uint16, Literal[64]] +struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString.register_fields([('ascii', c.Array[NvU8, Literal[64]], 0), ('unicode', c.Array[NvU16, Literal[64]], 0)]) +struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS.register_fields([('gpuNameStringFlags', NvU32, 0), ('gpuNameString', struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString, 4)]) +NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS(c.Struct): + SIZE = 64 + gpuShortNameString: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS.register_fields([('gpuShortNameString', c.Array[NvU8, Literal[64]], 0)]) +NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_POWER_PARAMS(c.Struct): + SIZE = 12 + target: int + newLevel: int + oldLevel: int +struct_NV2080_CTRL_GPU_SET_POWER_PARAMS.register_fields([('target', NvU32, 0), ('newLevel', NvU32, 4), ('oldLevel', NvU32, 8)]) +NV2080_CTRL_GPU_SET_POWER_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_POWER_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SDM_PARAMS(c.Struct): + SIZE = 4 + subdeviceMask: int +struct_NV2080_CTRL_GPU_GET_SDM_PARAMS.register_fields([('subdeviceMask', NvU32, 0)]) +NV2080_CTRL_GPU_GET_SDM_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SDM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_SDM_PARAMS(c.Struct): + SIZE = 4 + subdeviceMask: int +struct_NV2080_CTRL_GPU_SET_SDM_PARAMS.register_fields([('subdeviceMask', NvU32, 0)]) +NV2080_CTRL_GPU_SET_SDM_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_SDM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS(c.Struct): + SIZE = 4 + type: int +struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS.register_fields([('type', NvU32, 0)]) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_REG_OP(c.Struct): + SIZE = 32 + regOp: int + regType: int + regStatus: int + regQuad: int + regGroupMask: int + regSubGroupMask: int + regOffset: int + regValueHi: int + regValueLo: int + regAndNMaskHi: int + regAndNMaskLo: int +struct_NV2080_CTRL_GPU_REG_OP.register_fields([('regOp', NvU8, 0), ('regType', NvU8, 1), ('regStatus', NvU8, 2), ('regQuad', NvU8, 3), ('regGroupMask', NvU32, 4), ('regSubGroupMask', NvU32, 8), ('regOffset', NvU32, 12), ('regValueHi', NvU32, 16), ('regValueLo', NvU32, 20), ('regAndNMaskHi', NvU32, 24), ('regAndNMaskLo', NvU32, 28)]) +NV2080_CTRL_GPU_REG_OP: TypeAlias = struct_NV2080_CTRL_GPU_REG_OP +@c.record +class struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 48 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + reserved00: c.Array[ctypes.c_uint32, Literal[2]] + regOpCount: int + regOps: ctypes.c_void_p + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +NV2080_CTRL_GR_ROUTE_INFO: TypeAlias = struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('reserved00', c.Array[NvU32, Literal[2]], 12), ('regOpCount', NvU32, 20), ('regOps', NvP64, 24), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 32)]) +NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS(c.Struct): + SIZE = 16 + engineCount: int + engineList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS(c.Struct): + SIZE = 340 + engineCount: int + engineList: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', c.Array[NvU32, Literal[84]], 4)]) +NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS(c.Struct): + SIZE = 16 + engineType: int + numClasses: int + classList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS.register_fields([('engineType', NvU32, 0), ('numClasses', NvU32, 4), ('classList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS(c.Struct): + SIZE = 12 + engineType: int + mmuFaultId: int + bSubcontextSupported: int +struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS.register_fields([('engineType', NvU32, 0), ('mmuFaultId', NvU32, 4), ('bSubcontextSupported', NvBool, 8)]) +NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_GPU_QUERY_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_GPU_QUERY_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY(c.Struct): + SIZE = 32 + gpuPhysAddr: int + gpuVirtAddr: int + size: int + physAttr: int + bufferId: int + bInitialize: int + bNonmapped: int +struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY.register_fields([('gpuPhysAddr', NvU64, 0), ('gpuVirtAddr', NvU64, 8), ('size', NvU64, 16), ('physAttr', NvU32, 24), ('bufferId', NvU16, 28), ('bInitialize', NvU8, 30), ('bNonmapped', NvU8, 31)]) +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY: TypeAlias = struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY +@c.record +class struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS(c.Struct): + SIZE = 560 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int + hVirtMemory: int + virtAddress: int + size: int + entryCount: int + promoteEntry: c.Array[struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY, Literal[16]] +struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16), ('hVirtMemory', NvHandle, 20), ('virtAddress', NvU64, 24), ('size', NvU64, 32), ('entryCount', NvU32, 40), ('promoteEntry', c.Array[NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY, Literal[16]], 48)]) +NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS +PNV2080_CTRL_GPU_PROMOTE_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS(c.Struct): + SIZE = 20 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int +struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16)]) +NV2080_CTRL_GPU_EVICT_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS +PNV2080_CTRL_GPU_EVICT_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS(c.Struct): + SIZE = 56 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int + hVirtMemory: int + physAddress: int + physAttr: int + hDmaHandle: int + index: int + size: int +struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16), ('hVirtMemory', NvHandle, 20), ('physAddress', NvU64, 24), ('physAttr', NvU32, 32), ('hDmaHandle', NvHandle, 36), ('index', NvU32, 40), ('size', NvU64, 48)]) +NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS +PNV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS(c.Struct): + SIZE = 4 + eccIntrStatus: int +struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS.register_fields([('eccIntrStatus', NvU32, 0)]) +NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS(c.Struct): + SIZE = 8 + count: int +struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS.register_fields([('count', NvU64, 0)]) +NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS(c.Struct): + SIZE = 40 + enabled: int + scrubComplete: int + supported: int + dbe: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + dbeNonResettable: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + sbe: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + sbeNonResettable: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS +struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS.register_fields([('enabled', NvBool, 0), ('scrubComplete', NvBool, 1), ('supported', NvBool, 2), ('dbe', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 8), ('dbeNonResettable', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 16), ('sbe', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 24), ('sbeNonResettable', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 32)]) +NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS(c.Struct): + SIZE = 1464 + units: c.Array[struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS, Literal[36]] + bFatalPoisonError: int + uncorrectableError: int + flags: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS.register_fields([('units', c.Array[NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS, Literal[36]], 0), ('bFatalPoisonError', NvBool, 1440), ('uncorrectableError', NvU8, 1441), ('flags', NvU32, 1444), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 1448)]) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS(c.Struct): + SIZE = 8 + rules: int + flags: int +struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS.register_fields([('rules', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS(c.Struct): + SIZE = 4 + rules: int +struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS.register_fields([('rules', NvU32, 0)]) +NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS(c.Struct): + SIZE = 8 + currentConfiguration: int + defaultConfiguration: int +struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS.register_fields([('currentConfiguration', NvU32, 0), ('defaultConfiguration', NvU32, 4)]) +NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + newConfiguration: int +struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS.register_fields([('newConfiguration', NvU32, 0)]) +NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS(c.Struct): + SIZE = 8 + statuses: int + flags: int +struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS.register_fields([('statuses', NvU32, 0), ('flags', NvU8, 4)]) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS(c.Struct): + SIZE = 4 + gpcMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS.register_fields([('gpcMask', NvU32, 0)]) +NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('tpcMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + zcullMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('zcullMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS(c.Struct): + SIZE = 136 + buildDate: int + marketingName: c.Array[ctypes.c_ubyte, Literal[24]] + serialNumber: c.Array[ctypes.c_ubyte, Literal[16]] + memoryManufacturer: int + memoryPartID: c.Array[ctypes.c_ubyte, Literal[20]] + memoryDateCode: c.Array[ctypes.c_ubyte, Literal[6]] + productPartNumber: c.Array[ctypes.c_ubyte, Literal[20]] + boardRevision: c.Array[ctypes.c_ubyte, Literal[3]] + boardType: int + board699PartNumber: c.Array[ctypes.c_ubyte, Literal[20]] + board965PartNumber: c.Array[ctypes.c_ubyte, Literal[20]] +struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS.register_fields([('buildDate', NvU32, 0), ('marketingName', c.Array[NvU8, Literal[24]], 4), ('serialNumber', c.Array[NvU8, Literal[16]], 28), ('memoryManufacturer', NvU8, 44), ('memoryPartID', c.Array[NvU8, Literal[20]], 45), ('memoryDateCode', c.Array[NvU8, Literal[6]], 65), ('productPartNumber', c.Array[NvU8, Literal[20]], 71), ('boardRevision', c.Array[NvU8, Literal[3]], 91), ('boardType', NvU8, 94), ('board699PartNumber', c.Array[NvU8, Literal[20]], 95), ('board965PartNumber', c.Array[NvU8, Literal[20]], 115)]) +NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV2080_CTRL_GPU_GET_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV2080_CTRL_GPU_GET_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS(c.Struct): + SIZE = 4 + currentMode: int +struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS.register_fields([('currentMode', NvU32, 0)]) +NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS(c.Struct): + SIZE = 144 + engineType: int + partnershipClassId: int + runqueue: int + numPartners: int + partnerList: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS.register_fields([('engineType', NvU32, 0), ('partnershipClassId', NvU32, 4), ('runqueue', NvU32, 8), ('numPartners', NvU32, 12), ('partnerList', c.Array[NvU32, Literal[32]], 16)]) +NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS(c.Struct): + SIZE = 268 + index: int + flags: int + length: int + data: c.Array[ctypes.c_ubyte, Literal[256]] +struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS.register_fields([('index', NvU32, 0), ('flags', NvU32, 4), ('length', NvU32, 8), ('data', c.Array[NvU8, Literal[256]], 12)]) +NV2080_CTRL_GPU_GET_GID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS(c.Struct): + SIZE = 5 + objectType: c.Array[ctypes.c_char, Literal[3]] + version: int + subversion: int +struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS.register_fields([('objectType', c.Array[ctypes.c_char, Literal[3]], 0), ('version', NvU8, 3), ('subversion', NvU8, 4)]) +NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS(c.Struct): + SIZE = 1 + isOptimusEnabled: int +struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS.register_fields([('isOptimusEnabled', NvBool, 0)]) +NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS(c.Struct): + SIZE = 8 + targetEngine: int + ipVersion: int +struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS.register_fields([('targetEngine', NvU32, 0), ('ipVersion', NvU32, 4)]) +NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS(c.Struct): + SIZE = 8 + attribute: int + bSupported: int +struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS.register_fields([('attribute', NvU32, 0), ('bSupported', NvBool, 4)]) +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS(c.Struct): + SIZE = 8 + attribute: int + value: int +struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS.register_fields([('attribute', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_CMD_GPU_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +NV2080_CTRL_GPU_GET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +NV2080_CTRL_GPU_SET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS(c.Struct): + SIZE = 16 + version: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS.register_fields([('version', c.Array[NvU8, Literal[16]], 0)]) +NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS(c.Struct): + SIZE = 8 + fwVersion: int + oemVersion: int + siliconRevision: int + hwbcResourceType: int +struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS.register_fields([('fwVersion', NvU32, 0), ('oemVersion', NvU8, 4), ('siliconRevision', NvU8, 5), ('hwbcResourceType', NvU8, 6)]) +NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS(c.Struct): + SIZE = 1204 + bridgeCount: int + hPhysicalBridges: c.Array[ctypes.c_uint32, Literal[100]] + bridgeList: c.Array[struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS, Literal[100]] +struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS.register_fields([('bridgeCount', NvU8, 0), ('hPhysicalBridges', c.Array[NvHandle, Literal[100]], 4), ('bridgeList', c.Array[NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS, Literal[100]], 404)]) +NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS(c.Struct): + SIZE = 16 + bus: int + device: int + func: int + oemVersion: int + siliconRevision: int + hwbcResourceType: int + domain: int + fwVersion: int +struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS.register_fields([('bus', NvU8, 0), ('device', NvU8, 1), ('func', NvU8, 2), ('oemVersion', NvU8, 3), ('siliconRevision', NvU8, 4), ('hwbcResourceType', NvU8, 5), ('domain', NvU32, 8), ('fwVersion', NvU32, 12)]) +NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS(c.Struct): + SIZE = 2004 + bridgeCount: int + physicalBridgeIds: c.Array[ctypes.c_uint32, Literal[100]] + bridgeList: c.Array[struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS, Literal[100]] +struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS.register_fields([('bridgeCount', NvU8, 0), ('physicalBridgeIds', c.Array[NvU32, Literal[100]], 4), ('bridgeList', c.Array[NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS, Literal[100]], 404)]) +NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS(c.Struct): + SIZE = 24 + scrubberStatus: int + remainingTimeMs: int + scrubStartAddr: int + scrubEndAddr: int +struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS.register_fields([('scrubberStatus', NvU32, 0), ('remainingTimeMs', NvU32, 4), ('scrubStartAddr', NvU64, 8), ('scrubEndAddr', NvU64, 16)]) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS(c.Struct): + SIZE = 16 + minStartAddr: int + maxEndAddr: int +struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS.register_fields([('minStartAddr', NvU64, 0), ('maxEndAddr', NvU64, 8)]) +NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS(c.Struct): + SIZE = 56 + gpcId: int + numPesInGpc: int + activePesMask: int + maxTpcPerGpcCount: int + tpcToPesMap: c.Array[ctypes.c_uint32, Literal[10]] +struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('numPesInGpc', NvU32, 4), ('activePesMask', NvU32, 8), ('maxTpcPerGpcCount', NvU32, 12), ('tpcToPesMap', c.Array[NvU32, Literal[10]], 16)]) +NV2080_CTRL_GPU_GET_PES_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS(c.Struct): + SIZE = 504 + oemInfo: c.Array[ctypes.c_ubyte, Literal[504]] +struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS.register_fields([('oemInfo', c.Array[NvU8, Literal[504]], 0)]) +NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS +enum_NV2080_CTRL_VPR_INFO_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_VPR_CAPS:=0): 'NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_VPR_CAPS', (NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_CUR_VPR_RANGE:=1): 'NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_CUR_VPR_RANGE'} +NV2080_CTRL_VPR_INFO_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS(c.Struct): + SIZE = 24 + queryType: int + bIsVprEnabled: int + vprStartAddressInBytes: int + vprEndAddressInBytes: int +struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS.register_fields([('queryType', NV2080_CTRL_VPR_INFO_QUERY_TYPE, 0), ('bIsVprEnabled', NvBool, 4), ('vprStartAddressInBytes', NvU64, 8), ('vprEndAddressInBytes', NvU64, 16)]) +NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS +enum_NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_H264:=0): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_H264', (NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_HEVC:=1): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_HEVC', (NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_AV1:=2): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_AV1'} +NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS(c.Struct): + SIZE = 8 + queryType: int + encoderCapacity: int +struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS.register_fields([('queryType', NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE, 0), ('encoderCapacity', NvU32, 4)]) +NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS(c.Struct): + SIZE = 12 + encoderSessionCount: int + averageEncodeFps: int + averageEncodeLatency: int +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS.register_fields([('encoderSessionCount', NvU32, 0), ('averageEncodeFps', NvU32, 4), ('averageEncodeLatency', NvU32, 8)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_NVENC_SW_SESSION_INFO(c.Struct): + SIZE = 32 + processId: int + subProcessId: int + sessionId: int + codecType: int + hResolution: int + vResolution: int + averageEncodeFps: int + averageEncodeLatency: int +struct_NV2080_CTRL_NVENC_SW_SESSION_INFO.register_fields([('processId', NvU32, 0), ('subProcessId', NvU32, 4), ('sessionId', NvU32, 8), ('codecType', NvU32, 12), ('hResolution', NvU32, 16), ('vResolution', NvU32, 20), ('averageEncodeFps', NvU32, 24), ('averageEncodeLatency', NvU32, 28)]) +NV2080_CTRL_NVENC_SW_SESSION_INFO: TypeAlias = struct_NV2080_CTRL_NVENC_SW_SESSION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS(c.Struct): + SIZE = 16 + sessionInfoTblEntry: int + sessionInfoTbl: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS.register_fields([('sessionInfoTblEntry', NvU32, 0), ('sessionInfoTbl', NvP64, 8)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS(c.Struct): + SIZE = 8 + fabricBaseAddr: int +struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS.register_fields([('fabricBaseAddr', NvU64, 0)]) +NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS(c.Struct): + SIZE = 4 + handle: int +struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS.register_fields([('handle', NvU32, 0)]) +NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS(c.Struct): + SIZE = 12 + statusMask: int + xusbData: int + ppcData: int +struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS.register_fields([('statusMask', NvU32, 0), ('xusbData', NvU32, 4), ('ppcData', NvU32, 8)]) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PARTITION_SPAN(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_GPU_PARTITION_SPAN.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_GPU_PARTITION_SPAN: TypeAlias = struct_NV2080_CTRL_GPU_PARTITION_SPAN +@c.record +class struct_NV2080_CTRL_EXEC_PARTITION_SPAN(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_EXEC_PARTITION_SPAN.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_EXEC_PARTITION_SPAN: TypeAlias = struct_NV2080_CTRL_EXEC_PARTITION_SPAN +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITION_INFO(c.Struct): + SIZE = 48 + swizzId: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] + partitionFlag: int + bValid: int + placement: struct_NV2080_CTRL_GPU_PARTITION_SPAN +struct_NV2080_CTRL_GPU_SET_PARTITION_INFO.register_fields([('swizzId', NvU32, 0), ('uuid', c.Array[NvU8, Literal[16]], 4), ('partitionFlag', NvU32, 20), ('bValid', NvBool, 24), ('placement', NV2080_CTRL_GPU_PARTITION_SPAN, 32)]) +NV2080_CTRL_GPU_SET_PARTITION_INFO: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITION_INFO +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS(c.Struct): + SIZE = 392 + partitionCount: int + partitionInfo: c.Array[struct_NV2080_CTRL_GPU_SET_PARTITION_INFO, Literal[8]] +struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS.register_fields([('partitionCount', NvU32, 0), ('partitionInfo', c.Array[NV2080_CTRL_GPU_SET_PARTITION_INFO, Literal[8]], 8)]) +NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITION_INFO(c.Struct): + SIZE = 232 + swizzId: int + partitionFlag: int + grEngCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + gpcsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + virtualGpcsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + gfxGpcPerGr: c.Array[ctypes.c_uint32, Literal[8]] + veidsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + memSize: int + span: struct_NV2080_CTRL_GPU_PARTITION_SPAN + bValid: int + bPartitionError: int + validCTSIdMask: int + validGfxCTSIdMask: int +struct_NV2080_CTRL_GPU_GET_PARTITION_INFO.register_fields([('swizzId', NvU32, 0), ('partitionFlag', NvU32, 4), ('grEngCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16), ('ceCount', NvU32, 20), ('nvEncCount', NvU32, 24), ('nvDecCount', NvU32, 28), ('nvJpgCount', NvU32, 32), ('nvOfaCount', NvU32, 36), ('gpcCount', NvU32, 40), ('virtualGpcCount', NvU32, 44), ('gfxGpcCount', NvU32, 48), ('gpcsPerGr', c.Array[NvU32, Literal[8]], 52), ('virtualGpcsPerGr', c.Array[NvU32, Literal[8]], 84), ('gfxGpcPerGr', c.Array[NvU32, Literal[8]], 116), ('veidsPerGr', c.Array[NvU32, Literal[8]], 148), ('memSize', NvU64, 184), ('span', NV2080_CTRL_GPU_PARTITION_SPAN, 192), ('bValid', NvBool, 208), ('bPartitionError', NvBool, 209), ('validCTSIdMask', NvU64, 216), ('validGfxCTSIdMask', NvU64, 224)]) +NV2080_CTRL_GPU_GET_PARTITION_INFO: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS(c.Struct): + SIZE = 1864 + queryPartitionInfo: c.Array[struct_NV2080_CTRL_GPU_GET_PARTITION_INFO, Literal[8]] + validPartitionCount: int + bGetAllPartitionInfo: int +struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS.register_fields([('queryPartitionInfo', c.Array[NV2080_CTRL_GPU_GET_PARTITION_INFO, Literal[8]], 0), ('validPartitionCount', NvU32, 1856), ('bGetAllPartitionInfo', NvBool, 1860)]) +NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS(c.Struct): + SIZE = 44 + swizzId: int + gpcCountPerSmcEng: c.Array[ctypes.c_uint32, Literal[8]] + updateSmcEngMask: int + bUseAllGPCs: int +struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS.register_fields([('swizzId', NvU32, 0), ('gpcCountPerSmcEng', c.Array[NvU32, Literal[8]], 4), ('updateSmcEngMask', NvU32, 36), ('bUseAllGPCs', NvBool, 40)]) +NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_FAULT_PACKET(c.Struct): + SIZE = 32 + data: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV2080_CTRL_GPU_FAULT_PACKET.register_fields([('data', c.Array[NvU8, Literal[32]], 0)]) +NV2080_CTRL_GPU_FAULT_PACKET: TypeAlias = struct_NV2080_CTRL_GPU_FAULT_PACKET +@c.record +class struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS(c.Struct): + SIZE = 32 + faultPacket: struct_NV2080_CTRL_GPU_FAULT_PACKET +struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS.register_fields([('faultPacket', NV2080_CTRL_GPU_FAULT_PACKET, 0)]) +NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS +NV2080_CTRL_GPU_EXEC_REG_OPS_VGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS(c.Struct): + SIZE = 1008 + engineList: c.Array[ctypes.c_uint32, Literal[84]] + runlistPriBase: c.Array[ctypes.c_uint32, Literal[84]] + runlistId: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS.register_fields([('engineList', c.Array[NvU32, Literal[84]], 0), ('runlistPriBase', c.Array[NvU32, Literal[84]], 336), ('runlistId', c.Array[NvU32, Literal[84]], 672)]) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS(c.Struct): + SIZE = 672 + engineList: c.Array[ctypes.c_uint32, Literal[84]] + hwEngineID: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS.register_fields([('engineList', c.Array[NvU32, Literal[84]], 0), ('hwEngineID', c.Array[NvU32, Literal[84]], 336)]) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS(c.Struct): + SIZE = 12 + sessionCount: int + averageFPS: int + averageLatency: int +struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS.register_fields([('sessionCount', NvU32, 0), ('averageFPS', NvU32, 4), ('averageLatency', NvU32, 8)]) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO(c.Struct): + SIZE = 52 + processId: int + subProcessId: int + vgpuInstanceId: int + sessionId: int + sessionType: int + displayOrdinal: int + sessionFlags: int + hMaxResolution: int + vMaxResolution: int + hResolution: int + vResolution: int + averageFPS: int + averageLatency: int +struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO.register_fields([('processId', NvU32, 0), ('subProcessId', NvU32, 4), ('vgpuInstanceId', NvU32, 8), ('sessionId', NvU32, 12), ('sessionType', NvU32, 16), ('displayOrdinal', NvU32, 20), ('sessionFlags', NvU32, 24), ('hMaxResolution', NvU32, 28), ('vMaxResolution', NvU32, 32), ('hResolution', NvU32, 36), ('vResolution', NvU32, 40), ('averageFPS', NvU32, 44), ('averageLatency', NvU32, 48)]) +NV2080_CTRL_NVFBC_SW_SESSION_INFO: TypeAlias = struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS(c.Struct): + SIZE = 13316 + sessionInfoCount: int + sessionInfoTbl: c.Array[struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO, Literal[256]] +struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS.register_fields([('sessionInfoCount', NvU32, 0), ('sessionInfoTbl', c.Array[NV2080_CTRL_NVFBC_SW_SESSION_INFO, Literal[256]], 4)]) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS(c.Struct): + SIZE = 4 + firstAsyncCEIdx: int +struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS.register_fields([('firstAsyncCEIdx', NvU32, 0)]) +NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS(c.Struct): + SIZE = 8 + vmmuSegmentSize: int +struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS.register_fields([('vmmuSegmentSize', NvU64, 0)]) +NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS(c.Struct): + SIZE = 280 + partitionFlag: int + partitionCount: int + availableSpans: c.Array[struct_NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]] + availableSpansCount: int + totalPartitionCount: int + totalSpans: c.Array[struct_NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]] + totalSpansCount: int + bStaticInfo: int +struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('partitionCount', NvU32, 4), ('availableSpans', c.Array[NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]], 8), ('availableSpansCount', NvU32, 136), ('totalPartitionCount', NvU32, 140), ('totalSpans', c.Array[NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]], 144), ('totalSpansCount', NvU32, 272), ('bStaticInfo', NvBool, 276)]) +NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS +NV2080_CTRL_GPU_GET_CACHED_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS(c.Struct): + SIZE = 4 + partitioningMode: int +struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS.register_fields([('partitioningMode', NvU32, 0)]) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO(c.Struct): + SIZE = 64 + partitionFlag: int + grCount: int + gfxGrCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + memorySize: int +struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO.register_fields([('partitionFlag', NvU32, 0), ('grCount', NvU32, 4), ('gfxGrCount', NvU32, 8), ('gpcCount', NvU32, 12), ('virtualGpcCount', NvU32, 16), ('gfxGpcCount', NvU32, 20), ('veidCount', NvU32, 24), ('smCount', NvU32, 28), ('ceCount', NvU32, 32), ('nvEncCount', NvU32, 36), ('nvDecCount', NvU32, 40), ('nvJpgCount', NvU32, 44), ('nvOfaCount', NvU32, 48), ('memorySize', NvU64, 56)]) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO: TypeAlias = struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO +@c.record +class struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS(c.Struct): + SIZE = 5768 + descCount: int + partitionDescs: c.Array[struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO, Literal[90]] +struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS.register_fields([('descCount', NvU32, 0), ('partitionDescs', c.Array[NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO, Literal[90]], 8)]) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS(c.Struct): + SIZE = 8 + maxSupportedPageSize: int +struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS.register_fields([('maxSupportedPageSize', NvU64, 0)]) +NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS(c.Struct): + SIZE = 24 + gpcId: int + count: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS.register_fields([('gpcId', NvU32, 0), ('count', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS(c.Struct): + SIZE = 40 + swizzId: c.Array[ctypes.c_uint32, Literal[9]] + partitionCount: int +struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS.register_fields([('swizzId', c.Array[NvU32, Literal[9]], 0), ('partitionCount', NvU32, 36)]) +NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS(c.Struct): + SIZE = 3812 + idType: int + id: int + pidTblCount: int + pidTbl: c.Array[ctypes.c_uint32, Literal[950]] +struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS.register_fields([('idType', NvU32, 0), ('id', NvU32, 4), ('pidTblCount', NvU32, 8), ('pidTbl', c.Array[NvU32, Literal[950]], 12)]) +NV2080_CTRL_GPU_GET_PIDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS +@c.record +class struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO(c.Struct): + SIZE = 8 + computeInstanceId: int + gpuInstanceId: int +struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO.register_fields([('computeInstanceId', NvU32, 0), ('gpuInstanceId', NvU32, 4)]) +NV2080_CTRL_SMC_SUBSCRIPTION_INFO: TypeAlias = struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO +@c.record +class struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA(c.Struct): + SIZE = 48 + memPrivate: int + memSharedOwned: int + memSharedDuped: int + protectedMemPrivate: int + protectedMemSharedOwned: int + protectedMemSharedDuped: int +struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA.register_fields([('memPrivate', NvU64, 0), ('memSharedOwned', NvU64, 8), ('memSharedDuped', NvU64, 16), ('protectedMemPrivate', NvU64, 24), ('protectedMemSharedOwned', NvU64, 32), ('protectedMemSharedDuped', NvU64, 40)]) +NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA: TypeAlias = struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA +@c.record +class union_NV2080_CTRL_GPU_PID_INFO_DATA(c.Struct): + SIZE = 48 + vidMemUsage: struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA +union_NV2080_CTRL_GPU_PID_INFO_DATA.register_fields([('vidMemUsage', NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA, 0)]) +NV2080_CTRL_GPU_PID_INFO_DATA: TypeAlias = union_NV2080_CTRL_GPU_PID_INFO_DATA +@c.record +class struct_NV2080_CTRL_GPU_PID_INFO(c.Struct): + SIZE = 72 + pid: int + index: int + result: int + data: union_NV2080_CTRL_GPU_PID_INFO_DATA + smcSubscription: struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO +struct_NV2080_CTRL_GPU_PID_INFO.register_fields([('pid', NvU32, 0), ('index', NvU32, 4), ('result', NvU32, 8), ('data', NV2080_CTRL_GPU_PID_INFO_DATA, 16), ('smcSubscription', NV2080_CTRL_SMC_SUBSCRIPTION_INFO, 64)]) +NV2080_CTRL_GPU_PID_INFO: TypeAlias = struct_NV2080_CTRL_GPU_PID_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS(c.Struct): + SIZE = 14408 + pidInfoListCount: int + pidInfoList: c.Array[struct_NV2080_CTRL_GPU_PID_INFO, Literal[200]] +struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS.register_fields([('pidInfoListCount', NvU32, 0), ('pidInfoList', c.Array[NV2080_CTRL_GPU_PID_INFO, Literal[200]], 8)]) +NV2080_CTRL_GPU_GET_PID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS(c.Struct): + SIZE = 4 + faultType: int +struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS.register_fields([('faultType', NvU32, 0)]) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS +enum_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE: dict[int, str] = {(NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_DEFAULT:=0): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_DEFAULT', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_SHORT:=1): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_SHORT', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MEDIUM:=2): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MEDIUM', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_LONG:=3): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_LONG', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MAX:=4): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MAX'} +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG(c.Struct): + SIZE = 8 + type: int + data: struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data(c.Struct): + SIZE = 4 + timeslice: int +struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data.register_fields([('timeslice', NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE, 0)]) +struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG.register_fields([('type', NvU32, 0), ('data', struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data, 4)]) +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG: TypeAlias = struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG +@c.record +class struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS(c.Struct): + SIZE = 8 + config: struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG +struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS.register_fields([('config', NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, 0)]) +NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS(c.Struct): + SIZE = 260 + numConfigs: int + configList: c.Array[struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, Literal[32]] +struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS.register_fields([('numConfigs', NvU32, 0), ('configList', c.Array[NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, Literal[32]], 4)]) +NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GFID_PARAMS(c.Struct): + SIZE = 16 + domain: int + bus: int + device: int + func: int + gfid: int + gfidMask: int +struct_NV2080_CTRL_GPU_GET_GFID_PARAMS.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('device', NvU8, 5), ('func', NvU8, 6), ('gfid', NvU32, 8), ('gfidMask', NvU32, 12)]) +NV2080_CTRL_GPU_GET_GFID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GFID_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS(c.Struct): + SIZE = 12 + gfid: int + bEnable: int + fabricPartitionId: int +struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS.register_fields([('gfid', NvU32, 0), ('bEnable', NvBool, 4), ('fabricPartitionId', NvU32, 8)]) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS(c.Struct): + SIZE = 24 + addressStart: int + addressLength: int + protection: int +struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS.register_fields([('addressStart', NvU64, 0), ('addressLength', NvU64, 8), ('protection', NvU32, 16)]) +NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS(c.Struct): + SIZE = 2608 + engineCount: int + engineList: c.Array[ctypes.c_uint32, Literal[200]] + engineStateLoadTime: c.Array[ctypes.c_uint64, Literal[200]] + engineIsInit: c.Array[ctypes.c_ubyte, Literal[200]] +struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', c.Array[NvU32, Literal[200]], 4), ('engineStateLoadTime', c.Array[NvU64, Literal[200]], 808), ('engineIsInit', c.Array[NvBool, Literal[200]], 2408)]) +NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS(c.Struct): + SIZE = 20804 + engineCount: int + engineID: c.Array[ctypes.c_uint32, Literal[200]] + engineName: c.Array[c.Array[ctypes.c_char, Literal[100]], Literal[200]] +struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineID', c.Array[NvU32, Literal[200]], 4), ('engineName', c.Array[c.Array[ctypes.c_char, Literal[100]], Literal[200]], 804)]) +NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS(c.Struct): + SIZE = 3240 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + reserved00: c.Array[ctypes.c_uint32, Literal[2]] + regOpCount: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[100]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('reserved00', c.Array[NvU32, Literal[2]], 12), ('regOpCount', NvU32, 20), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[100]], 24), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 3224)]) +NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SKYLINE_INFO(c.Struct): + SIZE = 24 + skylineVgpcSize: c.Array[ctypes.c_ubyte, Literal[12]] + singletonVgpcMask: int + maxInstances: int + computeSizeFlag: int +struct_NV2080_CTRL_GPU_SKYLINE_INFO.register_fields([('skylineVgpcSize', c.Array[NvU8, Literal[12]], 0), ('singletonVgpcMask', NvU32, 12), ('maxInstances', NvU32, 16), ('computeSizeFlag', NvU32, 20)]) +NV2080_CTRL_GPU_SKYLINE_INFO: TypeAlias = struct_NV2080_CTRL_GPU_SKYLINE_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS(c.Struct): + SIZE = 220 + skylineTable: c.Array[struct_NV2080_CTRL_GPU_SKYLINE_INFO, Literal[9]] + validEntries: int +struct_NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS.register_fields([('skylineTable', c.Array[NV2080_CTRL_GPU_SKYLINE_INFO, Literal[9]], 0), ('validEntries', NvU32, 216)]) +NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO(c.Struct): + SIZE = 52 + gpuId: int + gpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerId: int + busEgmPeerId: int +struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO.register_fields([('gpuId', NvU32, 0), ('gpuUuid', c.Array[NvU8, Literal[16]], 4), ('p2pCaps', NvU32, 20), ('p2pOptimalReadCEs', NvU32, 24), ('p2pOptimalWriteCEs', NvU32, 28), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 32), ('busPeerId', NvU32, 44), ('busEgmPeerId', NvU32, 48)]) +NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO: TypeAlias = struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO +@c.record +class struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 1672 + bAllCaps: int + bUseUuid: int + peerGpuCount: int + peerGpuCaps: c.Array[struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO, Literal[32]] +struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS.register_fields([('bAllCaps', NvBool, 0), ('bUseUuid', NvBool, 1), ('peerGpuCount', NvU32, 4), ('peerGpuCaps', c.Array[NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO, Literal[32]], 8)]) +NV2080_CTRL_GET_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_PROFILE(c.Struct): + SIZE = 20 + computeSize: int + gfxGpcCount: int + gpcCount: int + veidCount: int + smCount: int +struct_NV2080_CTRL_GPU_COMPUTE_PROFILE.register_fields([('computeSize', NvU8, 0), ('gfxGpcCount', NvU32, 4), ('gpcCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16)]) +NV2080_CTRL_GPU_COMPUTE_PROFILE: TypeAlias = struct_NV2080_CTRL_GPU_COMPUTE_PROFILE +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS(c.Struct): + SIZE = 168 + partitionFlag: int + profileCount: int + profiles: c.Array[struct_NV2080_CTRL_GPU_COMPUTE_PROFILE, Literal[8]] +struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('profileCount', NvU32, 4), ('profiles', c.Array[NV2080_CTRL_GPU_COMPUTE_PROFILE, Literal[8]], 8)]) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 56 + state: int + status: int + clusterUuid: c.Array[ctypes.c_ubyte, Literal[16]] + fabricPartitionId: int + fabricCaps: int + fabricCliqueId: int + fabricHealthMask: int + fabricHealthSummary: int +struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('state', NvU8, 0), ('status', NV_STATUS, 4), ('clusterUuid', c.Array[NvU8, Literal[16]], 8), ('fabricPartitionId', NvU16, 24), ('fabricCaps', NvU64, 32), ('fabricCliqueId', NvU32, 40), ('fabricHealthMask', NvU32, 44), ('fabricHealthSummary', NvU8, 48)]) +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS(c.Struct): + SIZE = 16 + pciDevId: int + chipSku: c.Array[ctypes.c_ubyte, Literal[4]] + chipMajor: int + chipMinor: int +struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS.register_fields([('pciDevId', NvU32, 0), ('chipSku', c.Array[NvU8, Literal[4]], 4), ('chipMajor', NvU32, 8), ('chipMinor', NvU32, 12)]) +NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS(c.Struct): + SIZE = 4 + swizzId: int +struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS.register_fields([('swizzId', NvU32, 0)]) +NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS(c.Struct): + SIZE = 1832 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + regOpCount: int + smIds: c.Array[ctypes.c_uint32, Literal[50]] + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[50]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('regOpCount', NvU32, 12), ('smIds', c.Array[NvU32, Literal[50]], 16), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[50]], 216), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 1816)]) +NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_GSP_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_VGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS(c.Struct): + SIZE = 1 + bResetRequired: int +struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS.register_fields([('bResetRequired', NvBool, 0)]) +NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS(c.Struct): + SIZE = 1 + bDrainRecommended: int +struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS.register_fields([('bDrainRecommended', NvBool, 0)]) +NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS(c.Struct): + SIZE = 16388 + sessionInfoTblEntry: int + sessionInfoTbl: c.Array[struct_NV2080_CTRL_NVENC_SW_SESSION_INFO, Literal[512]] +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS.register_fields([('sessionInfoTblEntry', NvU32, 0), ('sessionInfoTbl', c.Array[NV2080_CTRL_NVENC_SW_SESSION_INFO, Literal[512]], 4)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO(c.Struct): + SIZE = 20 + engDesc: int + ctxAttr: int + ctxBufferSize: int + addrSpaceList: int + registerBase: int +struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO.register_fields([('engDesc', NvU32, 0), ('ctxAttr', NvU32, 4), ('ctxBufferSize', NvU32, 8), ('addrSpaceList', NvU32, 12), ('registerBase', NvU32, 16)]) +NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO: TypeAlias = struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS(c.Struct): + SIZE = 1284 + numConstructedFalcons: int + constructedFalconsTable: c.Array[struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO, Literal[64]] +struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS.register_fields([('numConstructedFalcons', NvU32, 0), ('constructedFalconsTable', c.Array[NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO, Literal[64]], 4)]) +NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS +@c.record +class struct_NV2080_VF_MSIX_CAPS(c.Struct): + SIZE = 12 + msix_header: int + msix_table: int + msix_pba: int +struct_NV2080_VF_MSIX_CAPS.register_fields([('msix_header', NvU32, 0), ('msix_table', NvU32, 4), ('msix_pba', NvU32, 8)]) +NV2080_VF_MSIX_CAPS: TypeAlias = struct_NV2080_VF_MSIX_CAPS +@c.record +class struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS(c.Struct): + SIZE = 16 + gfid: int + vfMsixCap: struct_NV2080_VF_MSIX_CAPS +struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS.register_fields([('gfid', NvU32, 0), ('vfMsixCap', NV2080_VF_MSIX_CAPS, 4)]) +NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS +enum_NV2080_CTRL_GPU_RECOVERY_ACTION: dict[int, str] = {(NV2080_CTRL_GPU_RECOVERY_ACTION_NONE:=0): 'NV2080_CTRL_GPU_RECOVERY_ACTION_NONE', (NV2080_CTRL_GPU_RECOVERY_ACTION_GPU_RESET:=1): 'NV2080_CTRL_GPU_RECOVERY_ACTION_GPU_RESET', (NV2080_CTRL_GPU_RECOVERY_ACTION_NODE_REBOOT:=2): 'NV2080_CTRL_GPU_RECOVERY_ACTION_NODE_REBOOT', (NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_P2P:=3): 'NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_P2P', (NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_AND_RESET:=4): 'NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_AND_RESET'} +NV2080_CTRL_GPU_RECOVERY_ACTION: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS.register_fields([('action', NV2080_CTRL_GPU_RECOVERY_ACTION, 0)]) +NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS(c.Struct): + SIZE = 1 + bFipsEnabled: int +struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS.register_fields([('bFipsEnabled', NvBool, 0)]) +NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS +enum_NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE: dict[int, str] = {(NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_INVALID:=0): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_INVALID', (NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_TPC:=1): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_TPC', (NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_GPC:=2): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_GPC'} +NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_RAFTS_FLOORSWEEP_INFO(c.Struct): + SIZE = 12 + unitType: int + parentId: int + mask: int +struct_NV2080_RAFTS_FLOORSWEEP_INFO.register_fields([('unitType', NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE, 0), ('parentId', NvU32, 4), ('mask', NvU32, 8)]) +NV2080_RAFTS_FLOORSWEEP_INFO: TypeAlias = struct_NV2080_RAFTS_FLOORSWEEP_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS(c.Struct): + SIZE = 344 + tpcCountMatrix: c.Array[c.Array[ctypes.c_ubyte, Literal[12]], Literal[2]] + bValid: int + floorSweepConfig: c.Array[struct_NV2080_RAFTS_FLOORSWEEP_INFO, Literal[26]] + gfxGpcCount: int + gfxTpcPerGpcCount: int + maxUgpuTpcDiff: int +struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS.register_fields([('tpcCountMatrix', c.Array[c.Array[NvU8, Literal[12]], Literal[2]], 0), ('bValid', NvBool, 24), ('floorSweepConfig', c.Array[NV2080_RAFTS_FLOORSWEEP_INFO, Literal[26]], 28), ('gfxGpcCount', NvU8, 340), ('gfxTpcPerGpcCount', NvU8, 341), ('maxUgpuTpcDiff', NvU8, 342)]) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS(c.Struct): + SIZE = 152 + partitionFlag: int + computeSize: int + totalProfileCount: int + totalSpans: c.Array[struct_NV2080_CTRL_EXEC_PARTITION_SPAN, Literal[8]] + totalSpansCount: int +struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('computeSize', NvU32, 4), ('totalProfileCount', NvU32, 8), ('totalSpans', c.Array[NV2080_CTRL_EXEC_PARTITION_SPAN, Literal[8]], 16), ('totalSpansCount', NvU32, 144)]) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS(c.Struct): + SIZE = 8 + gpc: int + tpcReconfigMask: int +struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS.register_fields([('gpc', NvU32, 0), ('tpcReconfigMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS(c.Struct): + SIZE = 32 + test: int + dataSize: int + startTimestamp: int + stopTimestamp: int + data: ctypes.c_void_p +struct_NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS.register_fields([('test', NvU8, 0), ('dataSize', NvU32, 4), ('startTimestamp', NvU64, 8), ('stopTimestamp', NvU64, 16), ('data', NvP64, 24)]) +NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS(c.Struct): + SIZE = 24 + maxRpcSize: int + finnRmapiSize: int + rpcGspControlSize: int + rpcMessageHeaderSize: int + timestampFreq: int +struct_NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS.register_fields([('maxRpcSize', NvU32, 0), ('finnRmapiSize', NvU32, 4), ('rpcGspControlSize', NvU32, 8), ('rpcMessageHeaderSize', NvU32, 12), ('timestampFreq', NvU64, 16)]) +NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS +@c.record +class struct_NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS(c.Struct): + SIZE = 4 + supportedFeatures: int +struct_NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS.register_fields([('supportedFeatures', NvU32, 0)]) +NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS: TypeAlias = struct_NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS +@c.record +class struct_NV2080_CTRL_GPUMON_SAMPLE(c.Struct): + SIZE = 8 + timeStamp: int +struct_NV2080_CTRL_GPUMON_SAMPLE.register_fields([('timeStamp', NvU64, 0)]) +NV2080_CTRL_GPUMON_SAMPLE: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLE +@c.record +class struct_NV2080_CTRL_GPUMON_SAMPLES(c.Struct): + SIZE = 24 + type: int + bufSize: int + count: int + tracker: int + pSamples: ctypes.c_void_p +struct_NV2080_CTRL_GPUMON_SAMPLES.register_fields([('type', NvU8, 0), ('bufSize', NvU32, 4), ('count', NvU32, 8), ('tracker', NvU32, 12), ('pSamples', NvP64, 16)]) +NV2080_CTRL_GPUMON_SAMPLES: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLES +NV2080_CTRL_GR_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 32 + grInfoListSize: int + grInfoList: ctypes.c_void_p + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_INFO_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', NvP64, 8), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 16)]) +NV2080_CTRL_GR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + hShareClient: int + hShareChannel: int + zcullMode: int +struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('hShareClient', NvHandle, 4), ('hShareChannel', NvHandle, 8), ('zcullMode', NvU32, 12)]) +NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 40 + widthAlignPixels: int + heightAlignPixels: int + pixelSquaresByAliquots: int + aliquotTotal: int + zcullRegionByteMultiplier: int + zcullRegionHeaderSize: int + zcullSubregionHeaderSize: int + subregionCount: int + subregionWidthAlignPixels: int + subregionHeightAlignPixels: int +struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS.register_fields([('widthAlignPixels', NvU32, 0), ('heightAlignPixels', NvU32, 4), ('pixelSquaresByAliquots', NvU32, 8), ('aliquotTotal', NvU32, 12), ('zcullRegionByteMultiplier', NvU32, 16), ('zcullRegionHeaderSize', NvU32, 20), ('zcullSubregionHeaderSize', NvU32, 24), ('subregionCount', NvU32, 28), ('subregionWidthAlignPixels', NvU32, 32), ('subregionHeightAlignPixels', NvU32, 36)]) +NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + pmMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('pmMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS(c.Struct): + SIZE = 24 + hClient: int + hChannel: int + vMemPtr: int + zcullMode: int +struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8), ('zcullMode', NvU32, 16)]) +NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS(c.Struct): + SIZE = 40 + hClient: int + hChannel: int + vMemPtr: int + pmMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8), ('pmMode', NvU32, 16), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 24)]) +NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS(c.Struct): + SIZE = 16 + hClient: int + hChannel: int + vMemPtr: int +struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8)]) +NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS(c.Struct): + SIZE = 152 + mapValueCount: int + mapValues: c.Array[ctypes.c_ubyte, Literal[128]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS.register_fields([('mapValueCount', NvU32, 0), ('mapValues', c.Array[NvU8, Literal[128]], 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 136)]) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + smpcMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('smpcMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS(c.Struct): + SIZE = 1944 + smId: c.Array[struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId, Literal[240]] + smCount: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId(c.Struct): + SIZE = 8 + gpcId: int + tpcId: int +struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId.register_fields([('gpcId', NvU32, 0), ('tpcId', NvU32, 4)]) +struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS.register_fields([('smId', c.Array[struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId, Literal[240]], 0), ('smCount', NvU32, 1920), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 1928)]) +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS(c.Struct): + SIZE = 32 + flags: int + hChannel: int + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS.register_fields([('flags', NvU32, 0), ('hChannel', NvHandle, 4), ('gfxpPreemptMode', NvU32, 8), ('cilpPreemptMode', NvU32, 12), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 16)]) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS +enum_NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS: dict[int, str] = {(NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_MAIN:=0): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_MAIN', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SPILL:=1): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SPILL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_PAGEPOOL:=2): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_PAGEPOOL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_BETACB:=3): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_BETACB', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_RTV:=4): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_RTV', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL:=5): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL:=6): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL_CPU:=7): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL_CPU', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SETUP:=8): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SETUP', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_END:=9): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_END'} +NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS(c.Struct): + SIZE = 112 + flags: int + hClient: int + hChannel: int + vMemPtrs: c.Array[ctypes.c_uint64, Literal[9]] + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS.register_fields([('flags', NvU32, 0), ('hClient', NvHandle, 4), ('hChannel', NvHandle, 8), ('vMemPtrs', c.Array[NvU64, Literal[9]], 16), ('gfxpPreemptMode', NvU32, 88), ('cilpPreemptMode', NvU32, 92), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 96)]) +NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + samplingMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('samplingMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS(c.Struct): + SIZE = 12 + ropUnitCount: int + ropOperationsFactor: int + ropOperationsCount: int +struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS.register_fields([('ropUnitCount', NvU32, 0), ('ropOperationsFactor', NvU32, 4), ('ropOperationsCount', NvU32, 8)]) +NV2080_CTRL_GR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS(c.Struct): + SIZE = 32 + hChannel: int + flags: int + saveCnt: int + restoreCnt: int + wfiSaveCnt: int + ctaSaveCnt: int + cilpSaveCnt: int + gfxpSaveCnt: int +struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS.register_fields([('hChannel', NvHandle, 0), ('flags', NvU32, 4), ('saveCnt', NvU32, 8), ('restoreCnt', NvU32, 12), ('wfiSaveCnt', NvU32, 16), ('ctaSaveCnt', NvU32, 20), ('cilpSaveCnt', NvU32, 24), ('gfxpSaveCnt', NvU32, 28)]) +NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + totalBufferSize: int +struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('totalBufferSize', NvU64, 8)]) +NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTX_BUFFER_INFO(c.Struct): + SIZE = 80 + alignment: int + size: int + bufferHandle: ctypes.c_void_p + pageCount: int + physAddr: int + bufferType: int + aperture: int + kind: int + pageSize: int + bIsContigous: int + bGlobalBuffer: int + bLocalBuffer: int + bDeviceDescendant: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_GR_CTX_BUFFER_INFO.register_fields([('alignment', NvU64, 0), ('size', NvU64, 8), ('bufferHandle', NvP64, 16), ('pageCount', NvU64, 24), ('physAddr', NvU64, 32), ('bufferType', NvU32, 40), ('aperture', NvU32, 44), ('kind', NvU32, 48), ('pageSize', NvU32, 52), ('bIsContigous', NvBool, 56), ('bGlobalBuffer', NvBool, 57), ('bLocalBuffer', NvBool, 58), ('bDeviceDescendant', NvBool, 59), ('uuid', c.Array[NvU8, Literal[16]], 60)]) +NV2080_CTRL_GR_CTX_BUFFER_INFO: TypeAlias = struct_NV2080_CTRL_GR_CTX_BUFFER_INFO +PNV2080_CTRL_GR_CTX_BUFFER_INFO: TypeAlias = c.POINTER[struct_NV2080_CTRL_GR_CTX_BUFFER_INFO] +@c.record +class struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 5136 + hUserClient: int + hChannel: int + bufferCount: int + ctxBufferInfo: c.Array[struct_NV2080_CTRL_GR_CTX_BUFFER_INFO, Literal[64]] +struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('bufferCount', NvU32, 8), ('ctxBufferInfo', c.Array[NV2080_CTRL_GR_CTX_BUFFER_INFO, Literal[64]], 16)]) +NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS(c.Struct): + SIZE = 9240 + globalSmId: c.Array[struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId, Literal[512]] + numSm: int + numTpc: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId(c.Struct): + SIZE = 18 + gpcId: int + localTpcId: int + localSmId: int + globalTpcId: int + virtualGpcId: int + migratableTpcId: int + ugpuId: int + physicalCpcId: int + virtualTpcId: int +struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId.register_fields([('gpcId', NvU16, 0), ('localTpcId', NvU16, 2), ('localSmId', NvU16, 4), ('globalTpcId', NvU16, 6), ('virtualGpcId', NvU16, 8), ('migratableTpcId', NvU16, 10), ('ugpuId', NvU16, 12), ('physicalCpcId', NvU16, 14), ('virtualTpcId', NvU16, 16)]) +struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS.register_fields([('globalSmId', c.Array[struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId, Literal[512]], 0), ('numSm', NvU16, 9216), ('numTpc', NvU16, 9218), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 9224)]) +NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS(c.Struct): + SIZE = 24 + chID: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS.register_fields([('chID', NvU32, 0), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS +@c.record +class struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC(c.Struct): + SIZE = 32 + errorCounter: int + errorTimestamp: int + warningCounter: int + warningTimestamp: int +struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC.register_fields([('errorCounter', NvU64, 0), ('errorTimestamp', NvU64, 8), ('warningCounter', NvU64, 16), ('warningTimestamp', NvU64, 24)]) +NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC: TypeAlias = struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC +@c.record +class struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC(c.Struct): + SIZE = 320 + tpc: c.Array[struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC, Literal[10]] +struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC.register_fields([('tpc', c.Array[NV2080_CTRL_GR_VAT_ALARM_DATA_PER_TPC, Literal[10]], 0)]) +NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC: TypeAlias = struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC +@c.record +class struct_NV2080_CTRL_GR_VAT_ALARM_DATA(c.Struct): + SIZE = 3200 + gpc: c.Array[struct_NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC, Literal[10]] +struct_NV2080_CTRL_GR_VAT_ALARM_DATA.register_fields([('gpc', c.Array[NV2080_CTRL_GR_VAT_ALARM_DATA_PER_GPC, Literal[10]], 0)]) +NV2080_CTRL_GR_VAT_ALARM_DATA: TypeAlias = struct_NV2080_CTRL_GR_VAT_ALARM_DATA +@c.record +class struct_NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS(c.Struct): + SIZE = 3208 + smVatAlarm: struct_NV2080_CTRL_GR_VAT_ALARM_DATA + maxGpcCount: int + maxTpcPerGpcCount: int +struct_NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS.register_fields([('smVatAlarm', NV2080_CTRL_GR_VAT_ALARM_DATA, 0), ('maxGpcCount', NvU32, 3200), ('maxTpcPerGpcCount', NvU32, 3204)]) +NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS +PNV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS] +@c.record +class struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 4 + attribBufferSize: int +struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS.register_fields([('attribBufferSize', NvU32, 0)]) +NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS(c.Struct): + SIZE = 40 + maxSlots: int + slotStride: int + ctrlStructSize: int + ctrlStructAlign: int + poolSize: int + poolAlign: int +struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS.register_fields([('maxSlots', NvU32, 0), ('slotStride', NvU32, 4), ('ctrlStructSize', NvU64, 8), ('ctrlStructAlign', NvU64, 16), ('poolSize', NvU64, 24), ('poolAlign', NvU64, 32)]) +NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS(c.Struct): + SIZE = 16 + maxSlots: int + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS.register_fields([('maxSlots', NvU32, 0), ('hMemory', NvHandle, 4), ('offset', NvU32, 8), ('size', NvU32, 12)]) +NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS(c.Struct): + SIZE = 272 + numSlots: int + slots: c.Array[ctypes.c_uint32, Literal[64]] + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS.register_fields([('numSlots', NvU32, 0), ('slots', c.Array[NvU32, Literal[64]], 4), ('hMemory', NvHandle, 260), ('offset', NvU32, 264), ('size', NvU32, 268)]) +NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS(c.Struct): + SIZE = 276 + numSlots: int + slots: c.Array[ctypes.c_uint32, Literal[64]] + bRemoveSpecificSlots: int + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS.register_fields([('numSlots', NvU32, 0), ('slots', c.Array[NvU32, Literal[64]], 4), ('bRemoveSpecificSlots', NvBool, 260), ('hMemory', NvHandle, 264), ('offset', NvU32, 268), ('size', NvU32, 272)]) +NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS +NV2080_CTRL_GR_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS +NV2080_CTRL_GR_GET_INFO_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcMask: int +struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcMask', NvU32, 16)]) +NV2080_CTRL_GR_GET_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcId', NvU32, 16), ('tpcMask', NvU32, 20)]) +NV2080_CTRL_GR_GET_TPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS +NV2080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS(c.Struct): + SIZE = 32 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + engineId: int + alignment: int + size: int + bInfoPopulated: int +struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('engineId', NvU32, 16), ('alignment', NvU32, 20), ('size', NvU32, 24), ('bInfoPopulated', NvBool, 28)]) +NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS(c.Struct): + SIZE = 32 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + imla0: int + fmla16: int + dp: int + fmla32: int + ffma: int + imla1: int + imla2: int + imla3: int + imla4: int +struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('imla0', NvU8, 16), ('fmla16', NvU8, 17), ('dp', NvU8, 18), ('fmla32', NvU8, 19), ('ffma', NvU8, 20), ('imla1', NvU8, 21), ('imla2', NvU8, 22), ('imla3', NvU8, 23), ('imla4', NvU8, 24)]) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS(c.Struct): + SIZE = 2044 + smIssueRateModifierListSize: int + smIssueRateModifierList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[255]] +struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS.register_fields([('smIssueRateModifierListSize', NvU32, 0), ('smIssueRateModifierList', c.Array[NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2, Literal[255]], 4)]) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS +NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS(c.Struct): + SIZE = 2044 + smIssueThrottleCtrlListSize: int + smIssueThrottleCtrlList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[255]] +struct_NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS.register_fields([('smIssueThrottleCtrlListSize', NvU32, 0), ('smIssueThrottleCtrlList', c.Array[NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL, Literal[255]], 4)]) +NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS +enum_NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD: dict[int, str] = {(NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_FULL:=0): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_FULL', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_SIMPLE:=1): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_SIMPLE', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_COMPAT:=2): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_COMPAT', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_CUSTOM:=3): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_CUSTOM'} +NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS(c.Struct): + SIZE = 20 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int +struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16)]) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS(c.Struct): + SIZE = 8 + physSyspipeId: int + gpcMask: int +struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS.register_fields([('physSyspipeId', NvU32, 0), ('gpcMask', NvU32, 4)]) +NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcId: int + ppcMask: int +struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcId', NvU32, 16), ('ppcMask', NvU32, 20)]) +NV2080_CTRL_GR_GET_PPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + numTpcs: int +struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS.register_fields([('gpcId', NvU32, 0), ('numTpcs', NvU32, 4)]) +NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + zcullMode: int + pmMode: int + smpcMode: int + cilpPreemptMode: int + gfxpPreemptMode: int +struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('zcullMode', NvU32, 4), ('pmMode', NvU32, 8), ('smpcMode', NvU32, 12), ('cilpPreemptMode', NvU32, 16), ('gfxpPreemptMode', NvU32, 20)]) +NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS +NV2080_CTRL_GR_GET_GPC_TILE_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + zcullMask: int +struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('zcullMask', NvU32, 4)]) +NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS +enum_NV2080_CTRL_GR_FECS_BIND_EVTBUF_REASON_CODE: dict[int, str] = {(NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NONE:=0): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NONE', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_GPU_TOO_OLD:=1): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_GPU_TOO_OLD', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED_GPU:=2): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED_GPU', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED:=3): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_ADMIN:=4): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_ADMIN', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_CAPABILITY:=5): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_CAPABILITY'} +NV2080_CTRL_GR_FECS_BIND_EVTBUF_REASON_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS(c.Struct): + SIZE = 24 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int + reasonCode: int +struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16), ('reasonCode', NvU32, 20)]) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + physGfxGpcMask: int + numGfxTpc: int +struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('physGfxGpcMask', NvU32, 16), ('numGfxTpc', NvU32, 20)]) +NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS(c.Struct): + SIZE = 24 + gpc: int + tpcReconfigMask: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS.register_fields([('gpc', NvU32, 0), ('tpcReconfigMask', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS(c.Struct): + SIZE = 4 + gpcCount: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS.register_fields([('gpcCount', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + chipletGpcMap: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS.register_fields([('gpcId', NvU32, 0), ('chipletGpcMap', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('tpcMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + ppcMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('ppcMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + gpcId: int + chipletGpcMap: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS.register_fields([('swizzId', NvU32, 0), ('gpcId', NvU32, 4), ('chipletGpcMap', NvU32, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + ropMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('ropMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS(c.Struct): + SIZE = 4 + chipletSyspipeMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS.register_fields([('chipletSyspipeMask', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + physSyspipeIdCount: int + physSyspipeId: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS.register_fields([('swizzId', NvU16, 0), ('physSyspipeIdCount', NvU16, 2), ('physSyspipeId', c.Array[NvU8, Literal[8]], 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + grIdx: int + gpcEnMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('grIdx', NvU32, 4), ('gpcEnMask', NvU32, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS(c.Struct): + SIZE = 4 + syspipeId: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS.register_fields([('syspipeId', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS(c.Struct): + SIZE = 4 + chipletSyspipeMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS.register_fields([('chipletSyspipeMask', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + grIdx: int + gpcEnMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('grIdx', NvU32, 4), ('gpcEnMask', NvU32, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS(c.Struct): + SIZE = 20 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData(c.Struct): + SIZE = 12 + gpcCountData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS + chipletGpcMapData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS + tpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS + ppcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS + partitionGpcMapData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS + syspipeMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS + partitionChipletSyspipeData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS + dmGpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS + partitionSyspipeIdData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS + ropMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS + gfxSyspipeMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS + gfxGpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData.register_fields([('gpcCountData', NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS, 0), ('chipletGpcMapData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS, 0), ('tpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS, 0), ('ppcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS, 0), ('partitionGpcMapData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS, 0), ('syspipeMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS, 0), ('partitionChipletSyspipeData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS, 0), ('dmGpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS, 0), ('partitionSyspipeIdData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS, 0), ('ropMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS, 0), ('gfxSyspipeMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS, 0), ('gfxGpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS, 0)]) +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryData', struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS(c.Struct): + SIZE = 1928 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS, Literal[96]] +struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS, Literal[96]], 8)]) +NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS(c.Struct): + SIZE = 72 + gspFeatures: int + bValid: int + bDefaultGspRmGpu: int + firmwareVersion: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS.register_fields([('gspFeatures', NvU32, 0), ('bValid', NvBool, 4), ('bDefaultGspRmGpu', NvBool, 5), ('firmwareVersion', c.Array[NvU8, Literal[64]], 6)]) +NV2080_CTRL_GSP_GET_FEATURES_PARAMS: TypeAlias = struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT(c.Struct): + SIZE = 32 + allocatedSize: int + usableSize: int + memTrackOverhead: int + allocationCount: int +struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT.register_fields([('allocatedSize', NvU64, 0), ('usableSize', NvU64, 8), ('memTrackOverhead', NvU64, 16), ('allocationCount', NvU32, 24)]) +NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT: TypeAlias = struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT +@c.record +class struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS(c.Struct): + SIZE = 88 + gfid: int + managedSize: int + largestFreeChunkSize: int + current: struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT + peak: struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT +struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS.register_fields([('gfid', NvU32, 0), ('managedSize', NvU64, 8), ('largestFreeChunkSize', NvU64, 16), ('current', NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT, 24), ('peak', NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT, 56)]) +NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS(c.Struct): + SIZE = 40 + allocatedSize: int + peakAllocatedSize: int + managedSize: int + allocationCount: int + peakAllocationCount: int + largestFreeChunkSize: int +struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS.register_fields([('allocatedSize', NvU64, 0), ('peakAllocatedSize', NvU64, 8), ('managedSize', NvU64, 16), ('allocationCount', NvU32, 24), ('peakAllocationCount', NvU32, 28), ('largestFreeChunkSize', NvU64, 32)]) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS(c.Struct): + SIZE = 16 + allocations: int + peakAllocations: int + objectSize: int +struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS.register_fields([('allocations', NvU32, 0), ('peakAllocations', NvU32, 4), ('objectSize', NvU64, 8)]) +NV2080_CTRL_GSP_LIBOS_POOL_STATS: TypeAlias = struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS(c.Struct): + SIZE = 1040 + poolStats: c.Array[struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS, Literal[64]] + totalHeapSize: int + poolCount: int +struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS.register_fields([('poolStats', c.Array[NV2080_CTRL_GSP_LIBOS_POOL_STATS, Literal[64]], 0), ('totalHeapSize', NvU64, 1024), ('poolCount', NvU8, 1032)]) +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS(c.Struct): + SIZE = 8 + hshubNcisocMask: int + hshubNvlMask: int +struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS.register_fields([('hshubNcisocMask', NvU32, 0), ('hshubNvlMask', NvU32, 4)]) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS(c.Struct): + SIZE = 8 + ecMode: int + status: int +struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS.register_fields([('ecMode', NvU32, 0), ('status', NvU32, 4)]) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS(c.Struct): + SIZE = 532 + version: int + port: int + flags: int + inputCount: int + inputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] + outputCount: int + outputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] +struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('inputCount', NvU32, 12), ('inputBuffer', c.Array[NvU8, Literal[256]], 16), ('outputCount', NvU32, 272), ('outputBuffer', c.Array[NvU8, Literal[256]], 276)]) +NV2080_CTRL_I2C_READ_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS(c.Struct): + SIZE = 276 + version: int + port: int + flags: int + inputCount: int + inputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] + encrClientID: int +struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('inputCount', NvU32, 12), ('inputBuffer', c.Array[NvU8, Literal[256]], 16), ('encrClientID', NvU32, 272)]) +NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_RW_REG_PARAMS(c.Struct): + SIZE = 276 + version: int + port: int + flags: int + addr: int + reg: int + bufsize: int + buffer: c.Array[ctypes.c_ubyte, Literal[255]] +struct_NV2080_CTRL_I2C_RW_REG_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('addr', NvU32, 12), ('reg', NvU8, 16), ('bufsize', NvU8, 17), ('buffer', c.Array[NvU8, Literal[255]], 18)]) +NV2080_CTRL_I2C_RW_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +NV2080_CTRL_I2C_READ_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +NV2080_CTRL_I2C_WRITE_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_ACCESS_PARAMS(c.Struct): + SIZE = 40 + token: int + cmd: int + port: int + flags: int + data: ctypes.c_void_p + status: int + dataBuffSize: int + speed: int + encrClientID: int +struct_NV2080_CTRL_I2C_ACCESS_PARAMS.register_fields([('token', NvU32, 0), ('cmd', NvU32, 4), ('port', NvU32, 8), ('flags', NvU32, 12), ('data', NvP64, 16), ('status', NvU32, 24), ('dataBuffSize', NvU32, 28), ('speed', NvU32, 32), ('encrClientID', NvU32, 36)]) +NV2080_CTRL_I2C_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS(c.Struct): + SIZE = 12 + head: int + authType: int + status: int +struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS.register_fields([('head', NvU32, 0), ('authType', NvU32, 4), ('status', NvU32, 8)]) +NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 36 + feHwSysCap: int + windowPresentMask: int + bFbRemapperEnabled: int + numHeads: int + i2cPort: int + internalDispActiveMask: int + embeddedDisplayPortMask: int + bExternalMuxSupported: int + bInternalMuxSupported: int + numDispChannels: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS.register_fields([('feHwSysCap', NvU32, 0), ('windowPresentMask', NvU32, 4), ('bFbRemapperEnabled', NvBool, 8), ('numHeads', NvU32, 12), ('i2cPort', NvU32, 16), ('internalDispActiveMask', NvU32, 20), ('embeddedDisplayPortMask', NvU32, 24), ('bExternalMuxSupported', NvBool, 28), ('bInternalMuxSupported', NvBool, 29), ('numDispChannels', NvU32, 32)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS(c.Struct): + SIZE = 40 + bOneToOneComptagLineAllocation: int + bUseOneToFourComptagLineAllocation: int + bUseRawModeComptaglineAllocation: int + bDisableCompbitBacking: int + bDisablePostL2Compression: int + bEnabledEccFBPA: int + bL2PreFill: int + l2CacheSize: int + bFbpaPresent: int + comprPageSize: int + comprPageShift: int + ramType: int + ltcCount: int + ltsPerLtcCount: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS.register_fields([('bOneToOneComptagLineAllocation', NvBool, 0), ('bUseOneToFourComptagLineAllocation', NvBool, 1), ('bUseRawModeComptaglineAllocation', NvBool, 2), ('bDisableCompbitBacking', NvBool, 3), ('bDisablePostL2Compression', NvBool, 4), ('bEnabledEccFBPA', NvBool, 5), ('bL2PreFill', NvBool, 6), ('l2CacheSize', NvU64, 8), ('bFbpaPresent', NvBool, 16), ('comprPageSize', NvU32, 20), ('comprPageShift', NvU32, 24), ('ramType', NvU32, 28), ('ltcCount', NvU32, 32), ('ltsPerLtcCount', NvU32, 36)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS(c.Struct): + SIZE = 520 + accessCounterIndex: int + bufferSize: int + bufferPteArray: c.Array[ctypes.c_uint64, Literal[64]] +struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS.register_fields([('accessCounterIndex', NvU32, 0), ('bufferSize', NvU32, 4), ('bufferPteArray', c.Array[NvU64, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS(c.Struct): + SIZE = 4 + accessCounterIndex: int +struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS.register_fields([('accessCounterIndex', NvU32, 0)]) +NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS(c.Struct): + SIZE = 23 + capsTbl: c.Array[ctypes.c_ubyte, Literal[23]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[23]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS(c.Struct): + SIZE = 184 + engineCaps: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS.register_fields([('engineCaps', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_CAPS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER(c.Struct): + SIZE = 4324 + globalSmId: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId, Literal[240]] + numSm: int + numTpc: int +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId(c.Struct): + SIZE = 18 + gpcId: int + localTpcId: int + localSmId: int + globalTpcId: int + virtualGpcId: int + migratableTpcId: int + ugpuId: int + physicalCpcId: int + virtualTpcId: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId.register_fields([('gpcId', NvU16, 0), ('localTpcId', NvU16, 2), ('localSmId', NvU16, 4), ('globalTpcId', NvU16, 6), ('virtualGpcId', NvU16, 8), ('migratableTpcId', NvU16, 10), ('ugpuId', NvU16, 12), ('physicalCpcId', NvU16, 14), ('virtualTpcId', NvU16, 16)]) +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER.register_fields([('globalSmId', c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId, Literal[240]], 0), ('numSm', NvU16, 4320), ('numTpc', NvU16, 4322)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS(c.Struct): + SIZE = 34592 + globalSmOrder: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS.register_fields([('globalSmOrder', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BSP_CAPS(c.Struct): + SIZE = 8 + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_BSP_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_BSP_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BSP_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS(c.Struct): + SIZE = 72 + caps: c.Array[struct_NV2080_CTRL_INTERNAL_BSP_CAPS, Literal[8]] + valid: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS.register_fields([('caps', c.Array[NV2080_CTRL_INTERNAL_BSP_CAPS, Literal[8]], 0), ('valid', c.Array[NvBool, Literal[8]], 64)]) +NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MSENC_CAPS(c.Struct): + SIZE = 5 + capsTbl: c.Array[ctypes.c_ubyte, Literal[5]] +struct_NV2080_CTRL_INTERNAL_MSENC_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[5]], 0)]) +NV2080_CTRL_INTERNAL_MSENC_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MSENC_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS(c.Struct): + SIZE = 48 + caps: c.Array[struct_NV2080_CTRL_INTERNAL_MSENC_CAPS, Literal[8]] + valid: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS.register_fields([('caps', c.Array[NV2080_CTRL_INTERNAL_MSENC_CAPS, Literal[8]], 0), ('valid', c.Array[NvBool, Literal[8]], 40)]) +NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS(c.Struct): + SIZE = 376 + gpcMask: int + tpcMask: c.Array[ctypes.c_uint32, Literal[16]] + tpcCount: c.Array[ctypes.c_uint32, Literal[16]] + physGpcMask: int + mmuPerGpc: c.Array[ctypes.c_uint32, Literal[16]] + tpcToPesMap: c.Array[ctypes.c_uint32, Literal[10]] + numPesPerGpc: c.Array[ctypes.c_uint32, Literal[16]] + zcullMask: c.Array[ctypes.c_uint32, Literal[16]] + physGfxGpcMask: int + numGfxTpc: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS.register_fields([('gpcMask', NvU32, 0), ('tpcMask', c.Array[NvU32, Literal[16]], 4), ('tpcCount', c.Array[NvU32, Literal[16]], 68), ('physGpcMask', NvU32, 132), ('mmuPerGpc', c.Array[NvU32, Literal[16]], 136), ('tpcToPesMap', c.Array[NvU32, Literal[10]], 200), ('numPesPerGpc', c.Array[NvU32, Literal[16]], 240), ('zcullMask', c.Array[NvU32, Literal[16]], 304), ('physGfxGpcMask', NvU32, 368), ('numGfxTpc', NvU32, 372)]) +NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS(c.Struct): + SIZE = 3008 + floorsweepingMasks: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS.register_fields([('floorsweepingMasks', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS +@c.record +class struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS(c.Struct): + SIZE = 1056 + hUserClient: int + hChannel: int + bufferType: int + firstPage: int + numPages: int + physAddrs: c.Array[ctypes.c_uint64, Literal[128]] + bNoMorePages: int +struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('bufferType', NvU32, 8), ('firstPage', NvU32, 12), ('numPages', NvU32, 16), ('physAddrs', c.Array[NvU64, Literal[128]], 24), ('bNoMorePages', NvBool, 1048)]) +NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS: TypeAlias = struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_INFO(c.Struct): + SIZE = 8 + index: int + data: int +struct_NV2080_CTRL_INTERNAL_GR_INFO.register_fields([('index', NvU32, 0), ('data', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GR_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO(c.Struct): + SIZE = 464 + infoList: c.Array[struct_NV2080_CTRL_INTERNAL_GR_INFO, Literal[58]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO.register_fields([('infoList', c.Array[NV2080_CTRL_INTERNAL_GR_INFO, Literal[58]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 3712 + engineInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS.register_fields([('engineInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO(c.Struct): + SIZE = 40 + widthAlignPixels: int + heightAlignPixels: int + pixelSquaresByAliquots: int + aliquotTotal: int + zcullRegionByteMultiplier: int + zcullRegionHeaderSize: int + zcullSubregionHeaderSize: int + subregionCount: int + subregionWidthAlignPixels: int + subregionHeightAlignPixels: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO.register_fields([('widthAlignPixels', NvU32, 0), ('heightAlignPixels', NvU32, 4), ('pixelSquaresByAliquots', NvU32, 8), ('aliquotTotal', NvU32, 12), ('zcullRegionByteMultiplier', NvU32, 16), ('zcullRegionHeaderSize', NvU32, 20), ('zcullSubregionHeaderSize', NvU32, 24), ('subregionCount', NvU32, 28), ('subregionWidthAlignPixels', NvU32, 32), ('subregionHeightAlignPixels', NvU32, 36)]) +NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 320 + engineZcullInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS.register_fields([('engineZcullInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO(c.Struct): + SIZE = 12 + ropUnitCount: int + ropOperationsFactor: int + ropOperationsCount: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO.register_fields([('ropUnitCount', NvU32, 0), ('ropOperationsFactor', NvU32, 4), ('ropOperationsCount', NvU32, 8)]) +NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS(c.Struct): + SIZE = 96 + engineRopInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS.register_fields([('engineRopInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS(c.Struct): + SIZE = 64 + mask: c.Array[ctypes.c_uint32, Literal[16]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS.register_fields([('mask', c.Array[NvU32, Literal[16]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS(c.Struct): + SIZE = 512 + enginePpcMasks: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS.register_fields([('enginePpcMasks', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PPC_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO(c.Struct): + SIZE = 8 + size: int + alignment: int +struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO.register_fields([('size', NvU32, 0), ('alignment', NvU32, 4)]) +NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO(c.Struct): + SIZE = 208 + engine: c.Array[struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO, Literal[26]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO.register_fields([('engine', c.Array[NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO, Literal[26]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS(c.Struct): + SIZE = 1664 + engineContextBuffersInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS.register_fields([('engineContextBuffersInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER(c.Struct): + SIZE = 9 + imla0: int + fmla16: int + dp: int + fmla32: int + ffma: int + imla1: int + imla2: int + imla3: int + imla4: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER.register_fields([('imla0', NvU8, 0), ('fmla16', NvU8, 1), ('dp', NvU8, 2), ('fmla32', NvU8, 3), ('ffma', NvU8, 4), ('imla1', NvU8, 5), ('imla2', NvU8, 6), ('imla3', NvU8, 7), ('imla4', NvU8, 8)]) +NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS(c.Struct): + SIZE = 72 + smIssueRateModifier: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS.register_fields([('smIssueRateModifier', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS(c.Struct): + SIZE = 88 + chipSubRev: int + emulationRev1: int + isCmpSku: int + pciDeviceId: int + pciSubDeviceId: int + pciRevisionId: int + regBases: c.Array[ctypes.c_uint32, Literal[16]] +struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS.register_fields([('chipSubRev', NvU8, 0), ('emulationRev1', NvU32, 4), ('isCmpSku', NvBool, 8), ('pciDeviceId', NvU32, 12), ('pciSubDeviceId', NvU32, 16), ('pciRevisionId', NvU32, 20), ('regBases', c.Array[NvU32, Literal[16]], 24)]) +NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + bEnable: int +struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('bEnable', NvBool, 16)]) +NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + offset: int +struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('offset', NvU32, 16)]) +NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE(c.Struct): + SIZE = 4 + fecsRecordSize: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE.register_fields([('fecsRecordSize', NvU32, 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS(c.Struct): + SIZE = 32 + fecsRecordSize: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS.register_fields([('fecsRecordSize', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES(c.Struct): + SIZE = 32 + fecsRecordSize: int + timestampHiTagMask: int + timestampHiTagShift: int + timestampVMask: int + numLowerBitsZeroShift: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES.register_fields([('fecsRecordSize', NvU32, 0), ('timestampHiTagMask', NvU32, 4), ('timestampHiTagShift', NvU8, 8), ('timestampVMask', NvU64, 16), ('numLowerBitsZeroShift', NvU8, 24)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS(c.Struct): + SIZE = 256 + fecsTraceDefines: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS.register_fields([('fecsTraceDefines', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DEVICE_INFO(c.Struct): + SIZE = 48 + faultId: int + instanceId: int + typeEnum: int + resetId: int + devicePriBase: int + isEngine: int + rlEngId: int + runlistPriBase: int + groupId: int + ginTargetId: int + deviceBroadcastPriBase: int + groupLocalInstanceId: int +struct_NV2080_CTRL_INTERNAL_DEVICE_INFO.register_fields([('faultId', NvU32, 0), ('instanceId', NvU32, 4), ('typeEnum', NvU32, 8), ('resetId', NvU32, 12), ('devicePriBase', NvU32, 16), ('isEngine', NvU32, 20), ('rlEngId', NvU32, 24), ('runlistPriBase', NvU32, 28), ('groupId', NvU32, 32), ('ginTargetId', NvU32, 36), ('deviceBroadcastPriBase', NvU32, 40), ('groupLocalInstanceId', NvU32, 44)]) +NV2080_CTRL_INTERNAL_DEVICE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_DEVICE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS(c.Struct): + SIZE = 24580 + numEntries: int + deviceInfoTable: c.Array[struct_NV2080_CTRL_INTERNAL_DEVICE_INFO, Literal[512]] +struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS.register_fields([('numEntries', NvU32, 0), ('deviceInfoTable', c.Array[NV2080_CTRL_INTERNAL_DEVICE_INFO, Literal[512]], 4)]) +NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS(c.Struct): + SIZE = 8204 + userRegisterAccessMapSize: int + compressedSize: int + compressedData: c.Array[ctypes.c_ubyte, Literal[4096]] + profilingRangesSize: int + profilingRanges: c.Array[ctypes.c_ubyte, Literal[4096]] +struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS.register_fields([('userRegisterAccessMapSize', NvU32, 0), ('compressedSize', NvU32, 4), ('compressedData', c.Array[NvU8, Literal[4096]], 8), ('profilingRangesSize', NvU32, 4104), ('profilingRanges', c.Array[NvU8, Literal[4096]], 4108)]) +NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NV_RANGE(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_INTERNAL_NV_RANGE.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NV_RANGE: TypeAlias = struct_NV2080_CTRL_INTERNAL_NV_RANGE +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS(c.Struct): + SIZE = 24 + swizzId: int + memAddrRange: struct_NV2080_CTRL_INTERNAL_NV_RANGE +struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS.register_fields([('swizzId', NvU32, 0), ('memAddrRange', NV2080_CTRL_INTERNAL_NV_RANGE, 8)]) +NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES(c.Struct): + SIZE = 1 + bPerSubCtxheaderSupported: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES.register_fields([('bPerSubCtxheaderSupported', NvBool, 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS(c.Struct): + SIZE = 16 + ctsId: int + bCheckClientGI: int + giComputeSize: int + bCtsIdValid: int +struct_NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS.register_fields([('ctsId', NvU32, 0), ('bCheckClientGI', NvBool, 4), ('giComputeSize', NvU32, 8), ('bCtsIdValid', NvBool, 12)]) +NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS(c.Struct): + SIZE = 8 + pdbTable: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS.register_fields([('pdbTable', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS(c.Struct): + SIZE = 24 + instMemPhysAddr: int + instMemSize: int + instMemAddrSpace: int + instMemCpuCacheAttr: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS.register_fields([('instMemPhysAddr', NvU64, 0), ('instMemSize', NvU64, 8), ('instMemAddrSpace', NvU32, 16), ('instMemCpuCacheAttr', NvU32, 20)]) +NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS(c.Struct): + SIZE = 4 + ipVersion: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS.register_fields([('ipVersion', NvU32, 0)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS(c.Struct): + SIZE = 4 + smcMode: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS.register_fields([('smcMode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS(c.Struct): + SIZE = 16 + head: int + rgLineNum: int + intrLine: int + bEnable: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS.register_fields([('head', NvU32, 0), ('rgLineNum', NvU32, 4), ('intrLine', NvU32, 8), ('bEnable', NvBool, 12)]) +NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO(c.Struct): + SIZE = 72 + partitionFlag: int + grCount: int + gfxGrCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + validCTSIdMask: int + validGfxCTSIdMask: int +struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO.register_fields([('partitionFlag', NvU32, 0), ('grCount', NvU32, 4), ('gfxGrCount', NvU32, 8), ('gpcCount', NvU32, 12), ('virtualGpcCount', NvU32, 16), ('gfxGpcCount', NvU32, 20), ('veidCount', NvU32, 24), ('smCount', NvU32, 28), ('ceCount', NvU32, 32), ('nvEncCount', NvU32, 36), ('nvDecCount', NvU32, 40), ('nvJpgCount', NvU32, 44), ('nvOfaCount', NvU32, 48), ('validCTSIdMask', NvU64, 56), ('validGfxCTSIdMask', NvU64, 64)]) +NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS(c.Struct): + SIZE = 6488 + count: int + table: c.Array[struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO, Literal[90]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS.register_fields([('count', NvU32, 0), ('table', c.Array[NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO, Literal[90]], 8)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS(c.Struct): + SIZE = 40 + partitionableMemSize: int + bottomRsvdSize: int + topRsvdSize: int + partitionableStartAddr: int + partitionableEndAddr: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS.register_fields([('partitionableMemSize', NvU64, 0), ('bottomRsvdSize', NvU64, 8), ('topRsvdSize', NvU64, 16), ('partitionableStartAddr', NvU64, 24), ('partitionableEndAddr', NvU64, 32)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS(c.Struct): + SIZE = 32 + engineMask: c.Array[ctypes.c_uint64, Literal[4]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS.register_fields([('engineMask', c.Array[NvU64, Literal[4]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS(c.Struct): + SIZE = 4112 + rlBuffers: c.Array[c.Array[struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], Literal[64]] + runlistIdMask: int + swizzId: int +struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS.register_fields([('rlBuffers', c.Array[c.Array[NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], Literal[64]], 0), ('runlistIdMask', NvU64, 4096), ('swizzId', NvU32, 4104)]) +NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS(c.Struct): + SIZE = 492 + tegraImpImportData: struct_TEGRA_IMP_IMPORT_DATA +@c.record +class struct_TEGRA_IMP_IMPORT_DATA(c.Struct): + SIZE = 492 + max_iso_bw_kbps: int + num_dram_channels: int + num_dram_clk_entries: int + dram_clk_instance: c.Array[struct_DRAM_CLK_INSTANCE, Literal[24]] +TEGRA_IMP_IMPORT_DATA: TypeAlias = struct_TEGRA_IMP_IMPORT_DATA +@c.record +class struct_DRAM_CLK_INSTANCE(c.Struct): + SIZE = 20 + dram_clk_freq_khz: int + mchub_clk_khz: int + mc_clk_khz: int + max_iso_bw_kbps: int + switch_latency_ns: int +DRAM_CLK_INSTANCE: TypeAlias = struct_DRAM_CLK_INSTANCE +struct_DRAM_CLK_INSTANCE.register_fields([('dram_clk_freq_khz', NvU32, 0), ('mchub_clk_khz', NvU32, 4), ('mc_clk_khz', NvU32, 8), ('max_iso_bw_kbps', NvU32, 12), ('switch_latency_ns', NvU32, 16)]) +struct_TEGRA_IMP_IMPORT_DATA.register_fields([('max_iso_bw_kbps', NvU32, 0), ('num_dram_channels', NvU32, 4), ('num_dram_clk_entries', NvU32, 8), ('dram_clk_instance', c.Array[DRAM_CLK_INSTANCE, Literal[24]], 12)]) +struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS.register_fields([('tegraImpImportData', TEGRA_IMP_IMPORT_DATA, 0)]) +NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS(c.Struct): + SIZE = 6 + pciDeviceId: int + pciSubDeviceId: int + iseGPUBridge: int + approvedBusType: int +struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS.register_fields([('pciDeviceId', NvU16, 0), ('pciSubDeviceId', NvU16, 2), ('iseGPUBridge', NvBool, 4), ('approvedBusType', NvU8, 5)]) +NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS(c.Struct): + SIZE = 48 + local2Remote: int + remote2Local: int + localP2PDomainRemoteAddr: int + remoteP2PDomainLocalAddr: int + remoteWMBoxLocalAddr: int + p2pWmbTag: int + bNeedWarBug999673: int +struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS.register_fields([('local2Remote', NvU32, 0), ('remote2Local', NvU32, 4), ('localP2PDomainRemoteAddr', NvU64, 8), ('remoteP2PDomainLocalAddr', NvU64, 16), ('remoteWMBoxLocalAddr', NvU64, 24), ('p2pWmbTag', NvU64, 32), ('bNeedWarBug999673', NvBool, 40)]) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS(c.Struct): + SIZE = 40 + local2Remote: int + remote2Local: int + localP2PDomainRemoteAddr: int + remoteP2PDomainLocalAddr: int + remoteWMBoxAddrU64: int + p2pWmbTag: int +struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS.register_fields([('local2Remote', NvU32, 0), ('remote2Local', NvU32, 4), ('localP2PDomainRemoteAddr', NvU64, 8), ('remoteP2PDomainLocalAddr', NvU64, 16), ('remoteWMBoxAddrU64', NvU64, 24), ('p2pWmbTag', NvU64, 32)]) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS(c.Struct): + SIZE = 8 + peerIdx: int + bNeedWarBug999673: int +struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS.register_fields([('peerIdx', NvU32, 0), ('bNeedWarBug999673', NvBool, 4)]) +NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS(c.Struct): + SIZE = 4 + peerId: int +struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS.register_fields([('peerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS(c.Struct): + SIZE = 4 + peerId: int +struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS.register_fields([('peerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS(c.Struct): + SIZE = 2056 + gfid: int + numEntries: int + gpaEntries: c.Array[ctypes.c_uint64, Literal[128]] + spaEntries: c.Array[ctypes.c_uint64, Literal[128]] +struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS.register_fields([('gfid', NvU32, 0), ('numEntries', NvU32, 4), ('gpaEntries', c.Array[NvU64, Literal[128]], 8), ('spaEntries', c.Array[NvU64, Literal[128]], 1032)]) +NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS(c.Struct): + SIZE = 56 + addressSpace: int + physicalAddr: int + limit: int + cacheSnoop: int + hclass: int + channelInstance: int + valid: int + pbTargetAperture: int + channelPBSize: int + subDeviceId: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS.register_fields([('addressSpace', NvU32, 0), ('physicalAddr', NvU64, 8), ('limit', NvU64, 16), ('cacheSnoop', NvU32, 24), ('hclass', NvU32, 28), ('channelInstance', NvU32, 32), ('valid', NvBool, 36), ('pbTargetAperture', NvU32, 40), ('channelPBSize', NvU32, 44), ('subDeviceId', NvU32, 48)]) +NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 16 + replayableFaultBufferSize: int + replayableShadowFaultBufferMetadataSize: int + nonReplayableFaultBufferSize: int + nonReplayableShadowFaultBufferMetadataSize: int +struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS.register_fields([('replayableFaultBufferSize', NvU32, 0), ('replayableShadowFaultBufferMetadataSize', NvU32, 4), ('nonReplayableFaultBufferSize', NvU32, 8), ('nonReplayableShadowFaultBufferMetadataSize', NvU32, 12)]) +NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_CTXSW_MODES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS(c.Struct): + SIZE = 8 + moduleIndex: int + size: int +struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS.register_fields([('moduleIndex', NvU32, 0), ('size', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY(c.Struct): + SIZE = 16 + engineIdx: int + pmcIntrMask: int + vectorStall: int + vectorNonStall: int +struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY.register_fields([('engineIdx', NvU16, 0), ('pmcIntrMask', NvU32, 4), ('vectorStall', NvU32, 8), ('vectorNonStall', NvU32, 12)]) +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY: TypeAlias = struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY +@c.record +class struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS(c.Struct): + SIZE = 2112 + tableLen: int + table: c.Array[struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY, Literal[128]] + subtreeMap: c.Array[struct_NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]] +@c.record +class struct_NV2080_INTR_CATEGORY_SUBTREE_MAP(c.Struct): + SIZE = 8 + subtreeMask: int +NV2080_INTR_CATEGORY_SUBTREE_MAP: TypeAlias = struct_NV2080_INTR_CATEGORY_SUBTREE_MAP +struct_NV2080_INTR_CATEGORY_SUBTREE_MAP.register_fields([('subtreeMask', NvU64, 0)]) +struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS.register_fields([('tableLen', NvU32, 0), ('table', c.Array[NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY, Literal[128]], 4), ('subtreeMap', c.Array[NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]], 2056)]) +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS(c.Struct): + SIZE = 1 + bReservation: int +struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS.register_fields([('bReservation', NvBool, 0)]) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS(c.Struct): + SIZE = 3 + bReservation: int + bClientHandlesGrGating: int + bRmHandlesIdleSlow: int +struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS.register_fields([('bReservation', NvBool, 0), ('bClientHandlesGrGating', NvBool, 1), ('bRmHandlesIdleSlow', NvBool, 2)]) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS(c.Struct): + SIZE = 8 + displayMask: int + numHeads: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS.register_fields([('displayMask', NvU32, 0), ('numHeads', NvU32, 4)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS(c.Struct): + SIZE = 240 + fbMemPageRanges: c.Array[struct_NV2080_CTRL_INTERNAL_NV_RANGE, Literal[15]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS.register_fields([('fbMemPageRanges', c.Array[NV2080_CTRL_INTERNAL_NV_RANGE, Literal[15]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS(c.Struct): + SIZE = 8 + runlistId: int + numChannels: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS.register_fields([('runlistId', NvU32, 0), ('numChannels', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS(c.Struct): + SIZE = 32 + memBoundaryCfgA: int + memBoundaryCfgB: int + memBoundaryCfgC: int + memBoundaryCfg: int + memBoundaryCfgValInit: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS.register_fields([('memBoundaryCfgA', NvU64, 0), ('memBoundaryCfgB', NvU64, 8), ('memBoundaryCfgC', NvU32, 16), ('memBoundaryCfg', NvU32, 20), ('memBoundaryCfgValInit', NvU32, 24)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS +NV2080_CTRL_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS(c.Struct): + SIZE = 32 + data: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS.register_fields([('data', c.Array[NvU32, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X(c.Struct): + SIZE = 8 + flags: int + duration: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X.register_fields([('flags', NvBool, 0), ('duration', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bActivate: int +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS.register_fields([('bActivate', NvBool, 0)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS(c.Struct): + SIZE = 16 + flags: int + bBridgeless: int + currLimits: c.Array[ctypes.c_uint32, Literal[2]] +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS.register_fields([('flags', NvU32, 0), ('bBridgeless', NvBool, 4), ('currLimits', c.Array[NvU32, Literal[2]], 8)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + hysteresisus: int + bHystersisEnable: int + bSliGpuBoostSyncEnable: int +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS.register_fields([('hysteresisus', NvU64, 0), ('bHystersisEnable', NvBool, 8), ('bSliGpuBoostSyncEnable', NvBool, 9)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 2064 + hClient: int + hObject: int + faultBufferSize: int + faultBufferPteArray: c.Array[ctypes.c_uint64, Literal[256]] +struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('faultBufferSize', NvU32, 8), ('faultBufferPteArray', c.Array[NvU64, Literal[256]], 16)]) +NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 24032 + shadowFaultBufferQueuePhysAddr: int + shadowFaultBufferSize: int + shadowFaultBufferMetadataSize: int + shadowFaultBufferPteArray: c.Array[ctypes.c_uint64, Literal[3000]] + shadowFaultBufferType: int + faultBufferSharedMemoryPhysAddr: int +struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS.register_fields([('shadowFaultBufferQueuePhysAddr', NvU64, 0), ('shadowFaultBufferSize', NvU32, 8), ('shadowFaultBufferMetadataSize', NvU32, 12), ('shadowFaultBufferPteArray', c.Array[NvU64, Literal[3000]], 16), ('shadowFaultBufferType', NvU32, 24016), ('faultBufferSharedMemoryPhysAddr', NvU64, 24024)]) +NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 4 + shadowFaultBufferType: int +struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS.register_fields([('shadowFaultBufferType', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS(c.Struct): + SIZE = 184 + PdeCopyParams: struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS +struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS.register_fields([('PdeCopyParams', NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS, 0)]) +NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X(c.Struct): + SIZE = 16 + flags: int + boostDuration: int + gfId: int + bOverrideInfinite: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X.register_fields([('flags', NvU32, 0), ('boostDuration', NvU32, 4), ('gfId', NvU32, 8), ('bOverrideInfinite', NvBool, 12)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X(c.Struct): + SIZE = 8 + bIsCudaClient: int + gfId: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X.register_fields([('bIsCudaClient', NvBool, 0), ('gfId', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X +@c.record +class struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO(c.Struct): + SIZE = 28 + skylineVgpcSize: c.Array[ctypes.c_ubyte, Literal[12]] + singletonVgpcMask: int + maxInstances: int + computeSizeFlag: int + numNonSingletonVgpcs: int +struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO.register_fields([('skylineVgpcSize', c.Array[NvU8, Literal[12]], 0), ('singletonVgpcMask', NvU32, 12), ('maxInstances', NvU32, 16), ('computeSizeFlag', NvU32, 20), ('numNonSingletonVgpcs', NvU32, 24)]) +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS(c.Struct): + SIZE = 228 + skylineTable: c.Array[struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO, Literal[8]] + validEntries: int +struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS.register_fields([('skylineTable', c.Array[NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO, Literal[8]], 0), ('validEntries', NvU32, 224)]) +NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_SET_PARTITIONING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_SET_GPU_INSTANCES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_GET_GPU_INSTANCES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS(c.Struct): + SIZE = 1 + bZbcSurfacesExist: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS.register_fields([('bZbcSurfacesExist', NvBool, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO(c.Struct): + SIZE = 56 + enginesMask: c.Array[ctypes.c_uint64, Literal[4]] + partitionFlags: int + gpcMask: int + virtualGpcCount: int + veidOffset: int + veidCount: int +struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO.register_fields([('enginesMask', c.Array[NvU64, Literal[4]], 0), ('partitionFlags', NvU32, 32), ('gpcMask', NvU32, 36), ('virtualGpcCount', NvU32, 40), ('veidOffset', NvU32, 44), ('veidCount', NvU32, 48)]) +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS(c.Struct): + SIZE = 80 + swizzId: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] + info: struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO +struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS.register_fields([('swizzId', NvU32, 0), ('uuid', c.Array[NvU8, Literal[16]], 4), ('info', NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO, 24)]) +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 4 + bPcieGen4Capable: int + bIsC2CLinkUp: int + bIsDeviceMultiFunction: int + bGcxPmuCfgSpaceRestore: int +struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS.register_fields([('bPcieGen4Capable', NvBool, 0), ('bIsC2CLinkUp', NvBool, 1), ('bIsDeviceMultiFunction', NvBool, 2), ('bGcxPmuCfgSpaceRestore', NvBool, 3)]) +NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS(c.Struct): + SIZE = 12 + programPeerMask: int + invalidatePeerMask: int + programPciePeerMask: int +struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS.register_fields([('programPeerMask', NvU32, 0), ('invalidatePeerMask', NvU32, 4), ('programPciePeerMask', NvU32, 8)]) +NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS(c.Struct): + SIZE = 36 + linkMask: int + hshubIds: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS.register_fields([('linkMask', NvU32, 0), ('hshubIds', c.Array[NvU8, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS(c.Struct): + SIZE = 4 + numHshubs: int +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS.register_fields([('numHshubs', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS(c.Struct): + SIZE = 1 + hshubId: int +struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS.register_fields([('hshubId', NvU8, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS(c.Struct): + SIZE = 4 + egmPeerId: int +struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS.register_fields([('egmPeerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS(c.Struct): + SIZE = 16 + bGet: int + addr: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS.register_fields([('bGet', NvBool, 0), ('addr', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS(c.Struct): + SIZE = 2 + bCyaMaskL1: int + bEnableAspmDtL1: int +struct_NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS.register_fields([('bCyaMaskL1', NvBool, 0), ('bEnableAspmDtL1', NvBool, 1)]) +NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS(c.Struct): + SIZE = 1 + maxActiveVGpuVMCount: int +struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS.register_fields([('maxActiveVGpuVMCount', NvU8, 0)]) +NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS(c.Struct): + SIZE = 1 + bRawMode: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS.register_fields([('bRawMode', NvBool, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS(c.Struct): + SIZE = 4 + ccuSampleSize: int +struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS.register_fields([('ccuSampleSize', NvU32, 0)]) +NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO(c.Struct): + SIZE = 16 + phyAddr: int + shrBufSize: int + cntBlkSize: int +struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO.register_fields([('phyAddr', NvU64, 0), ('shrBufSize', NvU32, 8), ('cntBlkSize', NvU32, 12)]) +NV2080_CTRL_INTERNAL_CCU_MAP_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS(c.Struct): + SIZE = 144 + mapInfo: c.Array[struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO, Literal[9]] +struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS.register_fields([('mapInfo', c.Array[NV2080_CTRL_INTERNAL_CCU_MAP_INFO, Literal[9]], 0)]) +NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS(c.Struct): + SIZE = 2 + bDevShrBuf: int + bMigShrBuf: int +struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS.register_fields([('bDevShrBuf', NvBool, 0), ('bMigShrBuf', NvBool, 1)]) +NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO(c.Struct): + SIZE = 40 + gpuId: int + gpuInstance: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerId: int + busEgmPeerId: int +struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO.register_fields([('gpuId', NvU32, 0), ('gpuInstance', NvU32, 4), ('p2pCaps', NvU32, 8), ('p2pOptimalReadCEs', NvU32, 12), ('p2pOptimalWriteCEs', NvU32, 16), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 20), ('busPeerId', NvU32, 32), ('busEgmPeerId', NvU32, 36)]) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 1284 + peerGpuCount: int + peerGpuInfos: c.Array[struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO, Literal[32]] +struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS.register_fields([('peerGpuCount', NvU32, 0), ('peerGpuInfos', c.Array[NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS(c.Struct): + SIZE = 132 + peerGpuIdCount: int + peerGpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS.register_fields([('peerGpuIdCount', NvU32, 0), ('peerGpuIds', c.Array[NvU32, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS(c.Struct): + SIZE = 3 + bCommonPciSwitchFound: int + p2pReadCapsStatus: int + p2pWriteCapsStatus: int +struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS.register_fields([('bCommonPciSwitchFound', NvBool, 0), ('p2pReadCapsStatus', NvU8, 1), ('p2pWriteCapsStatus', NvU8, 2)]) +NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS(c.Struct): + SIZE = 1 + enableRo: int +struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS.register_fields([('enableRo', NvBool, 0)]) +NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS(c.Struct): + SIZE = 3 + bSave: int + bUseVbios: int + bReturnEarly: int +struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS.register_fields([('bSave', NvBool, 0), ('bUseVbios', NvBool, 1), ('bReturnEarly', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS(c.Struct): + SIZE = 3 + bSave: int + bUseVbios: int + bVbiosCallSuccessful: int +struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS.register_fields([('bSave', NvBool, 0), ('bUseVbios', NvBool, 1), ('bVbiosCallSuccessful', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE(c.Struct): + SIZE = 24 + computeSize: int + gfxGpcCount: int + gpcCount: int + veidCount: int + smCount: int + physicalSlots: int +struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE.register_fields([('computeSize', NvU8, 0), ('gfxGpcCount', NvU32, 4), ('gpcCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16), ('physicalSlots', NvU32, 20)]) +NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS(c.Struct): + SIZE = 196 + profileCount: int + profiles: c.Array[struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS.register_fields([('profileCount', NvU32, 0), ('profiles', c.Array[NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE, Literal[8]], 4)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS(c.Struct): + SIZE = 1 + bStreamState: int +struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS.register_fields([('bStreamState', NvBool, 0)]) +NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS(c.Struct): + SIZE = 1 + bExtDevFound: int +struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS.register_fields([('bExtDevFound', NvBool, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS(c.Struct): + SIZE = 96 + timingParameters: struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS +@c.record +class struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS(c.Struct): + SIZE = 96 + gpuId: int + output: int + protocol: int + structure: int + adjust: int + hDeltaStep: int + hDeltaMax: int + vDeltaStep: int + vDeltaMax: int + hSyncEnd: int + hBlankEnd: int + hBlankStart: int + hTotal: int + vSyncEnd: int + vBlankEnd: int + vBlankStart: int + vInterlacedBlankEnd: int + vInterlacedBlankStart: int + vTotal: int + refreshX10K: int + pixelClockHz: int + bOptimized: int +NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS: TypeAlias = struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS +struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS.register_fields([('gpuId', NvU32, 0), ('output', NvU32, 4), ('protocol', NvU32, 8), ('structure', NvU32, 12), ('adjust', NvU32, 16), ('hDeltaStep', NvU32, 20), ('hDeltaMax', NvU32, 24), ('vDeltaStep', NvU32, 28), ('vDeltaMax', NvU32, 32), ('hSyncEnd', NvU32, 36), ('hBlankEnd', NvU32, 40), ('hBlankStart', NvU32, 44), ('hTotal', NvU32, 48), ('vSyncEnd', NvU32, 52), ('vBlankEnd', NvU32, 56), ('vBlankStart', NvU32, 60), ('vInterlacedBlankEnd', NvU32, 64), ('vInterlacedBlankStart', NvU32, 68), ('vTotal', NvU32, 72), ('refreshX10K', NvU32, 76), ('pixelClockHz', NvU64, 80), ('bOptimized', NvBool, 88)]) +struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS.register_fields([('timingParameters', NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS(c.Struct): + SIZE = 16 + displayIds: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS.register_fields([('displayIds', c.Array[NvU32, Literal[4]], 0)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS(c.Struct): + SIZE = 52 + slave: c.Array[ctypes.c_uint32, Literal[4]] + localSlave: c.Array[ctypes.c_uint32, Literal[4]] + master: c.Array[ctypes.c_uint32, Literal[4]] + regStatus: int +struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS.register_fields([('slave', c.Array[NvU32, Literal[4]], 0), ('localSlave', c.Array[NvU32, Literal[4]], 16), ('master', c.Array[NvU32, Literal[4]], 32), ('regStatus', NvU32, 48)]) +NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS(c.Struct): + SIZE = 8 + headIdx: int + vActiveLines: int +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS.register_fields([('headIdx', NvU32, 0), ('vActiveLines', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS(c.Struct): + SIZE = 8 + displays: int + displayId: int +struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS.register_fields([('displays', NvU32, 0), ('displayId', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS(c.Struct): + SIZE = 8 + bEnableMaster: int + bRasterSyncGpioSaved: int + bRasterSyncGpioDirection: int +struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS.register_fields([('bEnableMaster', NvBool, 0), ('bRasterSyncGpioSaved', NvBool, 1), ('bRasterSyncGpioDirection', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS(c.Struct): + SIZE = 24 + hClient: int + hSysMem: int + bEnteringGcoffState: int + sysmemAddrOfSuspendResumeData: int +struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS.register_fields([('hClient', NvHandle, 0), ('hSysMem', NvHandle, 4), ('bEnteringGcoffState', NvBool, 8), ('sysmemAddrOfSuspendResumeData', NvU64, 16)]) +NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS(c.Struct): + SIZE = 1 + bDisableActiveChannels: int +struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS.register_fields([('bDisableActiveChannels', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS(c.Struct): + SIZE = 16 + hostReservedFb: int + vgpuTypeId: int +struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS.register_fields([('hostReservedFb', NvU64, 0), ('vgpuTypeId', NvU32, 8)]) +NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS(c.Struct): + SIZE = 4104 + status: int + backLightDataSize: int + backLightData: c.Array[ctypes.c_ubyte, Literal[4096]] +struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS.register_fields([('status', NvU32, 0), ('backLightDataSize', NvU16, 4), ('backLightData', c.Array[NvU8, Literal[4096]], 6)]) +NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS(c.Struct): + SIZE = 4 + numActiveLinksPerIoctrl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS.register_fields([('numActiveLinksPerIoctrl', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS(c.Struct): + SIZE = 4 + numLinksPerIoctrl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS.register_fields([('numLinksPerIoctrl', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS(c.Struct): + SIZE = 2 + bIsSysCtrlSupported: int + bIsPlatformLegacy: int +struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS.register_fields([('bIsSysCtrlSupported', NvBool, 0), ('bIsPlatformLegacy', NvBool, 1)]) +NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI(c.Struct): + SIZE = 8 + sensorId: int + limit: int +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI.register_fields([('sensorId', NvU32, 0), ('limit', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA(c.Struct): + SIZE = 12 + type: int + data: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data(c.Struct): + SIZE = 8 + smbpbi: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data.register_fields([('smbpbi', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI, 0)]) +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA.register_fields([('type', NvU8, 0), ('data', struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS(c.Struct): + SIZE = 16 + flags: int + syncData: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS.register_fields([('flags', NvU8, 0), ('syncData', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +NV2080_CTRL_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +NV2080_CTRL_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS(c.Struct): + SIZE = 2 + flag: int + bStatus: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS.register_fields([('flag', NvU8, 0), ('bStatus', NvBool, 1)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS(c.Struct): + SIZE = 8 + bEnable: int + clientLimit: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS.register_fields([('bEnable', NvBool, 0), ('clientLimit', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS(c.Struct): + SIZE = 4 + targetTemp: int +struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS.register_fields([('targetTemp', NvS32, 0)]) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS(c.Struct): + SIZE = 4 + ctgpOffsetmW: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS.register_fields([('ctgpOffsetmW', NvU32, 0)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS(c.Struct): + SIZE = 8 + bVpsPs20Supported: int + vPstateIdxHighest: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS.register_fields([('bVpsPs20Supported', NvBool, 0), ('vPstateIdxHighest', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS(c.Struct): + SIZE = 8 + pStateIdx: int + vPstateIdxMapping: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS.register_fields([('pStateIdx', NvU32, 0), ('vPstateIdxMapping', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS(c.Struct): + SIZE = 4 + vPstateIdx: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS.register_fields([('vPstateIdx', NvU32, 0)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS(c.Struct): + SIZE = 2 + bIsGC6Satisfied: int + bIsGCOFFSatisfied: int +struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS.register_fields([('bIsGC6Satisfied', NvBool, 0), ('bIsGCOFFSatisfied', NvBool, 1)]) +NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 8 + maxSec2SecureChannels: int + maxCeSecureChannels: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS.register_fields([('maxSec2SecureChannels', NvU32, 0), ('maxCeSecureChannels', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS(c.Struct): + SIZE = 24 + pinSetIn: int + pinSetOut: int + bMasterScanLock: int + masterScanLockPin: int + bSlaveScanLock: int + slaveScanLockPin: int +struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS.register_fields([('pinSetIn', NvU32, 0), ('pinSetOut', NvU32, 4), ('bMasterScanLock', NvBool, 8), ('masterScanLockPin', NvU32, 12), ('bSlaveScanLock', NvBool, 16), ('slaveScanLockPin', NvU32, 20)]) +NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS(c.Struct): + SIZE = 16 + pinSet: int + gpioFunction: int + gpioPin: int + gpioDirection: int +struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS.register_fields([('pinSet', NvU32, 0), ('gpioFunction', NvU32, 4), ('gpioPin', NvU32, 8), ('gpioDirection', NvBool, 12)]) +NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_EDID_DATA(c.Struct): + SIZE = 524 + status: int + acpiId: int + bufferSize: int + edidBuffer: c.Array[ctypes.c_ubyte, Literal[512]] +struct_NV2080_CTRL_INTERNAL_EDID_DATA.register_fields([('status', NvU32, 0), ('acpiId', NvU32, 4), ('bufferSize', NvU32, 8), ('edidBuffer', c.Array[NvU8, Literal[512]], 12)]) +NV2080_CTRL_INTERNAL_EDID_DATA: TypeAlias = struct_NV2080_CTRL_INTERNAL_EDID_DATA +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS(c.Struct): + SIZE = 8388 + tableLen: int + edidTable: c.Array[struct_NV2080_CTRL_INTERNAL_EDID_DATA, Literal[16]] +struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS.register_fields([('tableLen', NvU32, 0), ('edidTable', c.Array[NV2080_CTRL_INTERNAL_EDID_DATA, Literal[16]], 4)]) +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 8 + numProbes: int +struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('numProbes', NvU64, 0)]) +NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 2 + bwMode: int + bLocalEgmEnabled: int +struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('bwMode', NvU8, 0), ('bLocalEgmEnabled', NvBool, 1)]) +NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 1 + bwMode: int +struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('bwMode', NvU8, 0)]) +NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 2 + bIsBar1Trusted: int + bIsPcieTrusted: int +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS.register_fields([('bIsBar1Trusted', NvBool, 0), ('bIsPcieTrusted', NvBool, 1)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK(c.Struct): + SIZE = 12 + ivMask: c.Array[ctypes.c_uint32, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK.register_fields([('ivMask', c.Array[NvU32, Literal[3]], 0)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS(c.Struct): + SIZE = 40 + engineId: int + ivMaskSet: c.Array[struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS.register_fields([('engineId', NvU32, 0), ('ivMaskSet', c.Array[NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[3]], 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS(c.Struct): + SIZE = 76 + engineId: int + ivMaskSet: c.Array[struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[6]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS.register_fields([('engineId', NvU32, 0), ('ivMaskSet', c.Array[NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[6]], 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS(c.Struct): + SIZE = 28 + globalH2DKey: int + updatedEncryptIVMask: c.Array[ctypes.c_uint32, Literal[3]] + updatedDecryptIVMask: c.Array[ctypes.c_uint32, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS.register_fields([('globalH2DKey', NvU32, 0), ('updatedEncryptIVMask', c.Array[NvU32, Literal[3]], 4), ('updatedDecryptIVMask', c.Array[NvU32, Literal[3]], 16)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS(c.Struct): + SIZE = 8 + exceptionType: int + globalH2DKey: int +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS.register_fields([('exceptionType', NvU32, 0), ('globalH2DKey', NvU32, 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS(c.Struct): + SIZE = 8 + attackerAdvantage: int +struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS.register_fields([('attackerAdvantage', NvU64, 0)]) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS(c.Struct): + SIZE = 1 + logicalUprocId: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS.register_fields([('logicalUprocId', NvU8, 0)]) +NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS +enum_NV2080_CTRL_MEMMGR_MEMORY_OP: dict[int, str] = {(NV2080_CTRL_MEMMGR_MEMORY_OP_MEMCPY:=0): 'NV2080_CTRL_MEMMGR_MEMORY_OP_MEMCPY', (NV2080_CTRL_MEMMGR_MEMORY_OP_MEMSET:=1): 'NV2080_CTRL_MEMMGR_MEMORY_OP_MEMSET'} +NV2080_CTRL_MEMMGR_MEMORY_OP: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO(c.Struct): + SIZE = 32 + baseAddr: int + size: int + offset: int + aperture: int + cpuCacheAttrib: int +struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO.register_fields([('baseAddr', NvU64, 0), ('size', NvU64, 8), ('offset', NvU64, 16), ('aperture', NvU32, 24), ('cpuCacheAttrib', NvU32, 28)]) +NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS(c.Struct): + SIZE = 96 + src: struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO + authTag: c.Array[ctypes.c_ubyte, Literal[16]] + dst: struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO + transferSize: int + value: int + memop: int +struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS.register_fields([('src', NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO, 0), ('authTag', c.Array[NvU8, Literal[16]], 32), ('dst', NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO, 48), ('transferSize', NvU64, 80), ('value', NvU32, 88), ('memop', NV2080_CTRL_MEMMGR_MEMORY_OP, 92)]) +NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS(c.Struct): + SIZE = 24 + addrSysPhys: int + addrWidth: int + mask: int + maskWidth: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS.register_fields([('addrSysPhys', NvU64, 0), ('addrWidth', NvU32, 8), ('mask', NvU32, 12), ('maskWidth', NvU32, 16)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS(c.Struct): + SIZE = 32 + peerId: int + addrSysPhys: int + addrWidth: int + mask: int + maskWidth: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS.register_fields([('peerId', NvU32, 0), ('addrSysPhys', NvU64, 8), ('addrWidth', NvU32, 16), ('mask', NvU32, 20), ('maskWidth', NvU32, 24)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS(c.Struct): + SIZE = 24 + limitMin: int + limitRated: int + limitMax: int + limitCurr: int + limitBattRated: int + limitBattMax: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS.register_fields([('limitMin', NvU32, 0), ('limitRated', NvU32, 4), ('limitMax', NvU32, 8), ('limitCurr', NvU32, 12), ('limitBattRated', NvU32, 16), ('limitBattMax', NvU32, 20)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS(c.Struct): + SIZE = 16 + bInit: int + physAddr: int +struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS.register_fields([('bInit', NvBool, 0), ('physAddr', NvU64, 8)]) +NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS(c.Struct): + SIZE = 16 + polledDataMask: int + pollFrequencyMs: int +struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS.register_fields([('polledDataMask', NvU64, 0), ('pollFrequencyMs', NvU32, 8)]) +NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS(c.Struct): + SIZE = 32 + tracepointMask: int + bufferAddr: int + bufferSize: int + bufferWatermark: int + flag: int +struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS.register_fields([('tracepointMask', NvU64, 0), ('bufferAddr', NvU64, 8), ('bufferSize', NvU32, 16), ('bufferWatermark', NvU32, 20), ('flag', NvU8, 24)]) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS(c.Struct): + SIZE = 3 + bMaxwellSec2Enabled: int + bNv95A1TsecEnabled: int + bHopperSec2WorkLaunchAEnabled: int +struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS.register_fields([('bMaxwellSec2Enabled', NvBool, 0), ('bNv95A1TsecEnabled', NvBool, 1), ('bHopperSec2WorkLaunchAEnabled', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS +NV2080_CTRL_INTERNAL_GR_CTXSW_SETUP_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS(c.Struct): + SIZE = 8 + bInPMTransition: int + newPMLevel: int +struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS.register_fields([('bInPMTransition', NvBool, 0), ('newPMLevel', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS(c.Struct): + SIZE = 1 + bSuccessful: int +struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS.register_fields([('bSuccessful', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS(c.Struct): + SIZE = 8 + freeHeapSize: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS.register_fields([('freeHeapSize', NvU64, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS(c.Struct): + SIZE = 8 + attribute: int + value: int +struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS.register_fields([('attribute', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS(c.Struct): + SIZE = 1 + bApplyStereoPinAlwaysHiWar: int +struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS.register_fields([('bApplyStereoPinAlwaysHiWar', NvBool, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS(c.Struct): + SIZE = 4 + maxHshubs: int +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS.register_fields([('maxHshubs', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS(c.Struct): + SIZE = 4 + rasterSyncDecodeMode: int +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS.register_fields([('rasterSyncDecodeMode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS(c.Struct): + SIZE = 8 + spaValue: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS.register_fields([('spaValue', NvU64, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 8 + peerMask: int + bEnable: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0), ('bEnable', NvBool, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS(c.Struct): + SIZE = 28 + seedData: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS.register_fields([('seedData', c.Array[NvU32, Literal[7]], 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS(c.Struct): + SIZE = 8 + remoteDeviceType: int + ipVerDlPl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS.register_fields([('remoteDeviceType', NvU32, 0), ('ipVerDlPl', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS(c.Struct): + SIZE = 28 + seedData: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS.register_fields([('seedData', c.Array[NvU32, Literal[7]], 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO(c.Struct): + SIZE = 24 + remoteSid: int + remoteDeviceType: int + remoteLinkId: int + localSid: int +struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO.register_fields([('remoteSid', NvU64, 0), ('remoteDeviceType', NvU32, 8), ('remoteLinkId', NvU32, 12), ('localSid', NvU64, 16)]) +NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS(c.Struct): + SIZE = 32 + bInitnegotiateConfigGood: int + remoteLocalSidInfo: struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS.register_fields([('bInitnegotiateConfigGood', NvBool, 0), ('remoteLocalSidInfo', NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS(c.Struct): + SIZE = 1 + bPollDone: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS.register_fields([('bPollDone', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS(c.Struct): + SIZE = 48 + mode: int + bSync: int + linkMode: int + linkModeParams: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams(c.Struct): + SIZE = 32 + linkModeOffParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS + linkModePreHsParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS + linkModeInitPhase1Params: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS + linkModePostInitNegotiateParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS + linkModePostInitOptimizeParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams.register_fields([('linkModeOffParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS, 0), ('linkModePreHsParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS, 0), ('linkModeInitPhase1Params', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS, 0), ('linkModePostInitNegotiateParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS, 0), ('linkModePostInitOptimizeParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS, 0)]) +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8), ('linkMode', NvU32, 12), ('linkModeParams', struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams, 16)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 8 + sublinkMode: int + sublinkSubMode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS.register_fields([('sublinkMode', NvU32, 0), ('sublinkSubMode', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS(c.Struct): + SIZE = 4 + laneRxdetStatusMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS.register_fields([('laneRxdetStatusMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS(c.Struct): + SIZE = 1 + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS.register_fields([('bSync', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS(c.Struct): + SIZE = 16 + ipVerDlPl: int + token: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS.register_fields([('ipVerDlPl', NvU32, 0), ('token', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS(c.Struct): + SIZE = 1 + bUnlocked: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS.register_fields([('bUnlocked', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE(c.Struct): + SIZE = 56 + type: int + callbackParams: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams(c.Struct): + SIZE = 48 + getDlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS + setDlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS + getTlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS + setTlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS + getTxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS + setTxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS + getRxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS + setRxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS + getRxSublinkDetect: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS + setRxSublinkDetect: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS + writeDiscoveryToken: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS + readDiscoveryToken: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS + getUphyLoad: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams.register_fields([('getDlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS, 0), ('setDlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS, 0), ('getTlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS, 0), ('setTlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS, 0), ('getTxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS, 0), ('setTxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS, 0), ('getRxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS, 0), ('setRxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS, 0), ('getRxSublinkDetect', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS, 0), ('setRxSublinkDetect', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS, 0), ('writeDiscoveryToken', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS, 0), ('readDiscoveryToken', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS, 0), ('getUphyLoad', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS, 0)]) +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE.register_fields([('type', NvU8, 0), ('callbackParams', struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS(c.Struct): + SIZE = 64 + linkId: int + callbackType: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE +struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS.register_fields([('linkId', NvU32, 0), ('callbackType', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS(c.Struct): + SIZE = 32 + linkId: int + remoteLocalSidInfo: struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS.register_fields([('linkId', NvU32, 0), ('remoteLocalSidInfo', NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS(c.Struct): + SIZE = 1 + bEnableAli: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS.register_fields([('bEnableAli', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS(c.Struct): + SIZE = 8 + updateType: int + bSysMem: int + peerMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS.register_fields([('updateType', NvBool, 0), ('bSysMem', NvBool, 1), ('peerMask', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 24 + peerId: int + peerLinkMask: int + bEgmPeer: int + bNvswitchConn: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS.register_fields([('peerId', NvU32, 0), ('peerLinkMask', NvU64, 8), ('bEgmPeer', NvBool, 16), ('bNvswitchConn', NvBool, 17)]) +NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 4 + peerMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS(c.Struct): + SIZE = 92 + xid: int + message: c.Array[ctypes.c_ubyte, Literal[81]] + len: int +struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS.register_fields([('xid', NvU32, 0), ('message', c.Array[NvU8, Literal[81]], 4), ('len', NvU32, 88)]) +NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS(c.Struct): + SIZE = 12 + mapTypeMask: int + peerMask: int + bL2Entry: int +struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS.register_fields([('mapTypeMask', NvU32, 0), ('peerMask', NvU32, 4), ('bL2Entry', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS(c.Struct): + SIZE = 8 + bSave: int + linkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS.register_fields([('bSave', NvBool, 0), ('linkMask', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS(c.Struct): + SIZE = 16 + flags: int + bSysmem: int + peerLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS.register_fields([('flags', NvU32, 0), ('bSysmem', NvBool, 4), ('peerLinkMask', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bNvlinkSysmemEnabled: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS.register_fields([('bNvlinkSysmemEnabled', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS(c.Struct): + SIZE = 16 + gpuInst: int + peerLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS.register_fields([('gpuInst', NvU32, 0), ('peerLinkMask', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS(c.Struct): + SIZE = 40 + remoteDeviceType: int + remoteChipSid: int + linkId: int + laneRxdetStatusMask: int + remoteLinkNumber: int + remotePciDeviceId: int + remoteDomain: int + remoteBus: int + remoteDevice: int + remoteFunction: int + bConnected: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS.register_fields([('remoteDeviceType', NvU64, 0), ('remoteChipSid', NvU64, 8), ('linkId', NvU32, 16), ('laneRxdetStatusMask', NvU32, 20), ('remoteLinkNumber', NvU32, 24), ('remotePciDeviceId', NvU32, 28), ('remoteDomain', NvU32, 32), ('remoteBus', NvU8, 36), ('remoteDevice', NvU8, 37), ('remoteFunction', NvU8, 38), ('bConnected', NvBool, 39)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + initializedLinks: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS.register_fields([('linkMask', NvU32, 0), ('initializedLinks', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS.register_fields([('linkMask', NvU32, 0), ('bSync', NvBool, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS(c.Struct): + SIZE = 264 + postRxDetLinkMask: int + laneRxdetStatusMask: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS.register_fields([('postRxDetLinkMask', NvU64, 0), ('laneRxdetStatusMask', c.Array[NvU32, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS.register_fields([('linkMask', NvU32, 0), ('bSync', NvBool, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES(c.Struct): + SIZE = 16 + bValid: int + linkId: int + ioctrlId: int + pllMasterLinkId: int + pllSlaveLinkId: int + ipVerDlPl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES.register_fields([('bValid', NvBool, 0), ('linkId', NvU8, 1), ('ioctrlId', NvU32, 4), ('pllMasterLinkId', NvU8, 8), ('pllSlaveLinkId', NvU8, 9), ('ipVerDlPl', NvU32, 12)]) +NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 1056 + ioctrlMask: int + ioctrlNumEntries: int + ioctrlSize: int + discoveredLinks: int + ipVerNvlink: int + maxSupportedLinks: int + linkInfo: c.Array[struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS.register_fields([('ioctrlMask', NvU32, 0), ('ioctrlNumEntries', NvU8, 4), ('ioctrlSize', NvU32, 8), ('discoveredLinks', NvU64, 16), ('ipVerNvlink', NvU32, 24), ('maxSupportedLinks', NvU32, 28), ('linkInfo', c.Array[NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES, Literal[64]], 32)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES(c.Struct): + SIZE = 8 + ipVerIoctrl: int + ipVerMinion: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES.register_fields([('ipVerIoctrl', NvU32, 0), ('ipVerMinion', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 32 + ioctrlIdx: int + PublicId: int + localDiscoveredLinks: int + localGlobalLinkOffset: int + ioctrlDiscoverySize: int + numDevices: int + ipRevisions: struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS.register_fields([('ioctrlIdx', NvU32, 0), ('PublicId', NvU32, 4), ('localDiscoveredLinks', NvU32, 8), ('localGlobalLinkOffset', NvU32, 12), ('ioctrlDiscoverySize', NvU32, 16), ('numDevices', NvU8, 20), ('ipRevisions', NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES, 24)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS(c.Struct): + SIZE = 12 + bPlatformLinerateDefined: int + platformLineRate: int + nvlinkLinkSpeed: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS.register_fields([('bPlatformLinerateDefined', NvBool, 0), ('platformLineRate', NvU32, 4), ('nvlinkLinkSpeed', NvU32, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS(c.Struct): + SIZE = 72 + linkMask: int + bActiveOnly: int + bIsLinkActive: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS.register_fields([('linkMask', NvU32, 0), ('bActiveOnly', NvBool, 4), ('bIsLinkActive', c.Array[NvBool, Literal[64]], 5)]) +NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + flags: int +struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS.register_fields([('linkMask', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS(c.Struct): + SIZE = 4 + linkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS.register_fields([('linkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES(c.Struct): + SIZE = 56 + bLinkConnectedToSystem: int + bLinkConnectedToPeer: int + bLinkReset: int + subLinkWidth: int + linkState: int + txSublinkState: int + rxSublinkState: int + bLaneReversal: int + nvlinkLinkClockKHz: int + nvlinkLineRateMbps: int + nvlinkLinkClockMhz: int + nvlinkLinkDataRateKiBps: int + nvlinkRefClkType: int + nvlinkReqLinkClockMhz: int + nvlinkMinL1Threshold: int + nvlinkMaxL1Threshold: int + nvlinkL1ThresholdUnits: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES.register_fields([('bLinkConnectedToSystem', NvBool, 0), ('bLinkConnectedToPeer', NvBool, 1), ('bLinkReset', NvBool, 2), ('subLinkWidth', NvU8, 3), ('linkState', NvU32, 4), ('txSublinkState', NvU32, 8), ('rxSublinkState', NvU32, 12), ('bLaneReversal', NvBool, 16), ('nvlinkLinkClockKHz', NvU32, 20), ('nvlinkLineRateMbps', NvU32, 24), ('nvlinkLinkClockMhz', NvU32, 28), ('nvlinkLinkDataRateKiBps', NvU32, 32), ('nvlinkRefClkType', NvU8, 36), ('nvlinkReqLinkClockMhz', NvU32, 40), ('nvlinkMinL1Threshold', NvU32, 44), ('nvlinkMaxL1Threshold', NvU32, 48), ('nvlinkL1ThresholdUnits', NvU32, 52)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS(c.Struct): + SIZE = 3616 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + nvlinkRefClkSpeedKHz: int + bSublinkStateInst: int + linkInfo: c.Array[struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES, Literal[64]] +NV2080_CTRL_NVLINK_LINK_MASK: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('nvlinkRefClkSpeedKHz', NvU32, 24), ('bSublinkStateInst', NvBool, 28), ('linkInfo', c.Array[NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES, Literal[64]], 32)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS(c.Struct): + SIZE = 4 + sysmemLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS.register_fields([('sysmemLinkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS(c.Struct): + SIZE = 264 + bLegacyForcedConfig: int + bOverrideComputePeerMode: int + phase: int + linkConnection: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS.register_fields([('bLegacyForcedConfig', NvBool, 0), ('bOverrideComputePeerMode', NvBool, 1), ('phase', NvU32, 4), ('linkConnection', c.Array[NvU32, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS(c.Struct): + SIZE = 1 + bLaneShutdownOnUnload: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS.register_fields([('bLaneShutdownOnUnload', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS(c.Struct): + SIZE = 4 + notUsed: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS.register_fields([('notUsed', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS(c.Struct): + SIZE = 4 + sysmemLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS.register_fields([('sysmemLinkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 24 + PublicId: int + logBufferSize: int + logBufferAddr: int +struct_NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS.register_fields([('PublicId', NvU32, 0), ('logBufferSize', NvU64, 8), ('logBufferAddr', NvU64, 16)]) +NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS(c.Struct): + SIZE = 40 + hfrpPrivBase: c.Array[ctypes.c_uint32, Literal[5]] + hfrpIntrCtrlReg: c.Array[ctypes.c_uint32, Literal[5]] +struct_NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS.register_fields([('hfrpPrivBase', c.Array[NvU32, Literal[5]], 0), ('hfrpIntrCtrlReg', c.Array[NvU32, Literal[5]], 20)]) +NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS(c.Struct): + SIZE = 56 + opType: int + ringBufferSize: int + ringBufferOffset: int + userdPa: int + userdVa: int + instBlkAddr: int + instBlkAperture: int + userdAperture: int + workSubmitToken: int + cmcHandle: int +struct_NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS.register_fields([('opType', NvU32, 0), ('ringBufferSize', NvU32, 4), ('ringBufferOffset', NvU64, 8), ('userdPa', NvU64, 16), ('userdVa', NvU64, 24), ('instBlkAddr', NvU64, 32), ('instBlkAperture', NvU8, 40), ('userdAperture', NvU8, 41), ('workSubmitToken', NvU32, 44), ('cmcHandle', NvU32, 48)]) +NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2(c.Struct): + SIZE = 2044 + smIssueRateModifierListSize: int + smIssueRateModifierList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[255]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2.register_fields([('smIssueRateModifierListSize', NvU32, 0), ('smIssueRateModifierList', c.Array[NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2, Literal[255]], 4)]) +NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2 +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS(c.Struct): + SIZE = 16352 + smIssueRateModifierV2: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS.register_fields([('smIssueRateModifierV2', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL(c.Struct): + SIZE = 2044 + smIssueThrottleCtrlListSize: int + smIssueThrottleCtrlList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[255]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL.register_fields([('smIssueThrottleCtrlListSize', NvU32, 0), ('smIssueThrottleCtrlList', c.Array[NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL, Literal[255]], 4)]) +NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS(c.Struct): + SIZE = 16352 + smIssueThrottleCtrl: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS.register_fields([('smIssueThrottleCtrl', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS(c.Struct): + SIZE = 4 + ctrlParamVal: int +struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS.register_fields([('ctrlParamVal', NvU32, 0)]) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS(c.Struct): + SIZE = 4 + responseVal: int +struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS.register_fields([('responseVal', NvU32, 0)]) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS +@c.record +class struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS(c.Struct): + SIZE = 16 + architecture: int + implementation: int + revision: int + subRevision: int +struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS.register_fields([('architecture', NvU32, 0), ('implementation', NvU32, 4), ('revision', NvU32, 8), ('subRevision', NvU8, 12)]) +NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS(c.Struct): + SIZE = 4 + engines: int +struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS.register_fields([('engines', NvU32, 0)]) +NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS +@c.record +class struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS(c.Struct): + SIZE = 4 + manufacturer: int +struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS.register_fields([('manufacturer', NvU32, 0)]) +NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS +@c.record +class struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS(c.Struct): + SIZE = 1 + bOwnedByRm: int +struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS.register_fields([('bOwnedByRm', NvBool, 0)]) +NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS +@c.record +class struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY(c.Struct): + SIZE = 8 + nv2080EngineType: int + notificationIntrVector: int +struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY.register_fields([('nv2080EngineType', NvU32, 0), ('notificationIntrVector', NvU32, 4)]) +NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY: TypeAlias = struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY +@c.record +class struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS(c.Struct): + SIZE = 2052 + numEntries: int + entries: c.Array[struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY, Literal[256]] +struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS.register_fields([('numEntries', NvU32, 0), ('entries', c.Array[NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY, Literal[256]], 4)]) +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS +@c.record +class struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY(c.Struct): + SIZE = 16 + nv2080IntrType: int + pmcIntrMask: int + intrVectorStall: int + intrVectorNonStall: int +struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY.register_fields([('nv2080IntrType', NvU32, 0), ('pmcIntrMask', NvU32, 4), ('intrVectorStall', NvU32, 8), ('intrVectorNonStall', NvU32, 12)]) +NV2080_CTRL_MC_STATIC_INTR_ENTRY: TypeAlias = struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY +@c.record +class struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS(c.Struct): + SIZE = 516 + numEntries: int + entries: c.Array[struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY, Literal[32]] +struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS.register_fields([('numEntries', NvU32, 0), ('entries', c.Array[NV2080_CTRL_MC_STATIC_INTR_ENTRY, Literal[32]], 4)]) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS +enum_NV2080_INTR_CATEGORY: dict[int, str] = {(NV2080_INTR_CATEGORY_DEFAULT:=0): 'NV2080_INTR_CATEGORY_DEFAULT', (NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE:=1): 'NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE', (NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE_NOTIFICATION:=2): 'NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE_NOTIFICATION', (NV2080_INTR_CATEGORY_RUNLIST:=3): 'NV2080_INTR_CATEGORY_RUNLIST', (NV2080_INTR_CATEGORY_RUNLIST_NOTIFICATION:=4): 'NV2080_INTR_CATEGORY_RUNLIST_NOTIFICATION', (NV2080_INTR_CATEGORY_UVM_OWNED:=5): 'NV2080_INTR_CATEGORY_UVM_OWNED', (NV2080_INTR_CATEGORY_UVM_SHARED:=6): 'NV2080_INTR_CATEGORY_UVM_SHARED', (NV2080_INTR_CATEGORY_ENUM_COUNT:=7): 'NV2080_INTR_CATEGORY_ENUM_COUNT'} +NV2080_INTR_CATEGORY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS(c.Struct): + SIZE = 56 + subtreeMap: c.Array[struct_NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]] +struct_NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS.register_fields([('subtreeMap', c.Array[NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]], 0)]) +NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS(c.Struct): + SIZE = 8 + component: int + size: int +struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS.register_fields([('component', NvU32, 0), ('size', NvU32, 4)]) +NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS(c.Struct): + SIZE = 16 + pBuffer: ctypes.c_void_p + component: int + size: int +struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS.register_fields([('pBuffer', NvP64, 0), ('component', NvU32, 8), ('size', NvU32, 12)]) +NV2080_CTRL_NVD_GET_DUMP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS +@c.record +class struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS(c.Struct): + SIZE = 32 + userMinOffset: int + userMaxOffset: int + factoryMinOffset: int + factoryMaxOffset: int + lastActiveClock: int + lastActiveVolt: int + lastActivePoint: int + kappa: int +struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS.register_fields([('userMinOffset', NvS32, 0), ('userMaxOffset', NvS32, 4), ('factoryMinOffset', NvU32, 8), ('factoryMaxOffset', NvU32, 12), ('lastActiveClock', NvU32, 16), ('lastActiveVolt', NvU32, 20), ('lastActivePoint', NvU32, 24), ('kappa', NvU32, 28)]) +NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS: TypeAlias = struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS +@c.record +class struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG(c.Struct): + SIZE = 72 + pstateVer: int + gpcOverclock: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS + mclkOverclock: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS + bUserOverclocked: int + bFactoryOverclocked: int +struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG.register_fields([('pstateVer', NvU32, 0), ('gpcOverclock', NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS, 4), ('mclkOverclock', NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS, 36), ('bUserOverclocked', NvBool, 68), ('bFactoryOverclocked', NvBool, 69)]) +NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG: TypeAlias = struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG +@c.record +class struct_NV2080_NOCAT_JOURNAL_GPU_STATE(c.Struct): + SIZE = 240 + bValid: int + strap: int + deviceId: int + vendorId: int + subsystemVendor: int + subsystemId: int + revision: int + type: int + vbiosVersion: int + bOptimus: int + bMsHybrid: int + bFullPower: int + vbiosOemVersion: int + memoryType: int + tag: c.Array[ctypes.c_ubyte, Literal[65]] + vbiosProject: c.Array[ctypes.c_ubyte, Literal[65]] + bInFullchipReset: int + bInSecBusReset: int + bInGc6Reset: int + overclockCfg: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG +struct_NV2080_NOCAT_JOURNAL_GPU_STATE.register_fields([('bValid', NvBool, 0), ('strap', NvU32, 4), ('deviceId', NvU16, 8), ('vendorId', NvU16, 10), ('subsystemVendor', NvU16, 12), ('subsystemId', NvU16, 14), ('revision', NvU16, 16), ('type', NvU16, 18), ('vbiosVersion', NvU32, 20), ('bOptimus', NvBool, 24), ('bMsHybrid', NvBool, 25), ('bFullPower', NvBool, 26), ('vbiosOemVersion', NvU32, 28), ('memoryType', NvU16, 32), ('tag', c.Array[NvU8, Literal[65]], 34), ('vbiosProject', c.Array[NvU8, Literal[65]], 99), ('bInFullchipReset', NvBool, 164), ('bInSecBusReset', NvBool, 165), ('bInGc6Reset', NvBool, 166), ('overclockCfg', NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG, 168)]) +NV2080_NOCAT_JOURNAL_GPU_STATE: TypeAlias = struct_NV2080_NOCAT_JOURNAL_GPU_STATE +@c.record +class struct_NV2080_NOCAT_JOURNAL_ENTRY(c.Struct): + SIZE = 1272 + recType: int + bugcheck: int + tdrBucketId: int + source: c.Array[ctypes.c_ubyte, Literal[65]] + subsystem: int + errorCode: int + diagBufferLen: int + diagBuffer: c.Array[ctypes.c_ubyte, Literal[1024]] + faultingEngine: c.Array[ctypes.c_ubyte, Literal[65]] + mmuFaultType: int + mmuErrorSrc: int + tdrReason: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080_NOCAT_JOURNAL_ENTRY.register_fields([('recType', NvU8, 0), ('bugcheck', NvU32, 4), ('tdrBucketId', NvU32, 8), ('source', c.Array[NvU8, Literal[65]], 12), ('subsystem', NvU32, 80), ('errorCode', NvU64, 88), ('diagBufferLen', NvU32, 96), ('diagBuffer', c.Array[NvU8, Literal[1024]], 100), ('faultingEngine', c.Array[NvU8, Literal[65]], 1124), ('mmuFaultType', NvU32, 1192), ('mmuErrorSrc', NvU32, 1196), ('tdrReason', c.Array[NvU8, Literal[65]], 1200)]) +NV2080_NOCAT_JOURNAL_ENTRY: TypeAlias = struct_NV2080_NOCAT_JOURNAL_ENTRY +@c.record +class struct_NV2080_NOCAT_JOURNAL_RECORD(c.Struct): + SIZE = 1544 + GPUTag: int + loadAddress: int + timeStamp: int + stateMask: int + nocatGpuState: struct_NV2080_NOCAT_JOURNAL_GPU_STATE + nocatJournalEntry: struct_NV2080_NOCAT_JOURNAL_ENTRY +struct_NV2080_NOCAT_JOURNAL_RECORD.register_fields([('GPUTag', NvU32, 0), ('loadAddress', NvU64, 8), ('timeStamp', NvU64, 16), ('stateMask', NvU64, 24), ('nocatGpuState', NV2080_NOCAT_JOURNAL_GPU_STATE, 32), ('nocatJournalEntry', NV2080_NOCAT_JOURNAL_ENTRY, 272)]) +NV2080_NOCAT_JOURNAL_RECORD: TypeAlias = struct_NV2080_NOCAT_JOURNAL_RECORD +@c.record +class struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS(c.Struct): + SIZE = 15656 + flags: int + nocatRecordCount: int + nocatOutstandingRecordCount: int + journalRecords: c.Array[struct_NV2080_NOCAT_JOURNAL_RECORD, Literal[10]] + activityCounters: c.Array[ctypes.c_uint32, Literal[32]] + reserved: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS.register_fields([('flags', NvU32, 0), ('nocatRecordCount', NvU32, 4), ('nocatOutstandingRecordCount', NvU32, 8), ('journalRecords', c.Array[NV2080_NOCAT_JOURNAL_RECORD, Literal[10]], 16), ('activityCounters', c.Array[NvU32, Literal[32]], 15456), ('reserved', c.Array[NvU8, Literal[65]], 15584)]) +NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS +@c.record +class struct_NV2080CtrlNocatJournalDataTdrReason(c.Struct): + SIZE = 96 + flags: int + source: c.Array[ctypes.c_ubyte, Literal[65]] + subsystem: int + errorCode: int + reasonCode: int +struct_NV2080CtrlNocatJournalDataTdrReason.register_fields([('flags', NvU32, 0), ('source', c.Array[NvU8, Literal[65]], 4), ('subsystem', NvU32, 72), ('errorCode', NvU64, 80), ('reasonCode', NvU32, 88)]) +NV2080CtrlNocatJournalDataTdrReason: TypeAlias = struct_NV2080CtrlNocatJournalDataTdrReason +@c.record +class struct_NV2080CtrlNocatJournalSetTag(c.Struct): + SIZE = 72 + flags: int + tag: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080CtrlNocatJournalSetTag.register_fields([('flags', NvU32, 0), ('tag', c.Array[NvU8, Literal[65]], 4)]) +NV2080CtrlNocatJournalSetTag: TypeAlias = struct_NV2080CtrlNocatJournalSetTag +@c.record +class struct_NV2080CtrlNocatJournalRclog(c.Struct): + SIZE = 92 + flags: int + rclogSize: int + rmGpuId: int + APIType: int + contextType: int + exceptType: int + processImageName: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080CtrlNocatJournalRclog.register_fields([('flags', NvU32, 0), ('rclogSize', NvU32, 4), ('rmGpuId', NvU32, 8), ('APIType', NvU32, 12), ('contextType', NvU32, 16), ('exceptType', NvU32, 20), ('processImageName', c.Array[NvU8, Literal[65]], 24)]) +NV2080CtrlNocatJournalRclog: TypeAlias = struct_NV2080CtrlNocatJournalRclog +@c.record +class struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS(c.Struct): + SIZE = 104 + dataType: int + targetRecordType: int + nocatJournalData: struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData +@c.record +class struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData(c.Struct): + SIZE = 96 + tdrReason: struct_NV2080CtrlNocatJournalDataTdrReason + tagData: struct_NV2080CtrlNocatJournalSetTag + rclog: struct_NV2080CtrlNocatJournalRclog +struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData.register_fields([('tdrReason', NV2080CtrlNocatJournalDataTdrReason, 0), ('tagData', NV2080CtrlNocatJournalSetTag, 0), ('rclog', NV2080CtrlNocatJournalRclog, 0)]) +struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS.register_fields([('dataType', NvU32, 0), ('targetRecordType', NvU32, 4), ('nocatJournalData', struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData, 8)]) +NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS +@c.record +class struct_NV2080CtrlNocatJournalInsertRecord(c.Struct): + SIZE = 1208 + flags: int + timestamp: int + recType: int + bugcheck: int + source: c.Array[ctypes.c_char, Literal[65]] + subsystem: int + errorCode: int + faultingEngine: c.Array[ctypes.c_char, Literal[65]] + tdrReason: int + diagBufferLen: int + diagBuffer: c.Array[ctypes.c_ubyte, Literal[1024]] +struct_NV2080CtrlNocatJournalInsertRecord.register_fields([('flags', NvU32, 0), ('timestamp', NvU64, 8), ('recType', NvU8, 16), ('bugcheck', NvU32, 20), ('source', c.Array[ctypes.c_char, Literal[65]], 24), ('subsystem', NvU32, 92), ('errorCode', NvU64, 96), ('faultingEngine', c.Array[ctypes.c_char, Literal[65]], 104), ('tdrReason', NvU32, 172), ('diagBufferLen', NvU32, 176), ('diagBuffer', c.Array[NvU8, Literal[1024]], 180)]) +NV2080CtrlNocatJournalInsertRecord: TypeAlias = struct_NV2080CtrlNocatJournalInsertRecord +@c.record +class struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS(c.Struct): + SIZE = 1208 + nocatJournalRecord: struct_NV2080CtrlNocatJournalInsertRecord +struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS.register_fields([('nocatJournalRecord', NV2080CtrlNocatJournalInsertRecord, 0)]) +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS(c.Struct): + SIZE = 48 + capsTbl: int + lowestNvlinkVersion: int + highestNvlinkVersion: int + lowestNciVersion: int + highestNciVersion: int + discoveredLinkMask: int + enabledLinkMask: int + discoveredLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + enabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS.register_fields([('capsTbl', NvU32, 0), ('lowestNvlinkVersion', NvU8, 4), ('highestNvlinkVersion', NvU8, 5), ('lowestNciVersion', NvU8, 6), ('highestNciVersion', NvU8, 7), ('discoveredLinkMask', NvU32, 8), ('enabledLinkMask', NvU32, 12), ('discoveredLinks', NV2080_CTRL_NVLINK_LINK_MASK, 16), ('enabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 32)]) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_DEVICE_INFO(c.Struct): + SIZE = 56 + deviceIdFlags: int + domain: int + bus: int + device: int + function: int + pciDeviceId: int + deviceType: int + deviceUUID: c.Array[ctypes.c_ubyte, Literal[16]] + fabricRecoveryStatusMask: int +struct_NV2080_CTRL_NVLINK_DEVICE_INFO.register_fields([('deviceIdFlags', NvU32, 0), ('domain', NvU32, 4), ('bus', NvU16, 8), ('device', NvU16, 10), ('function', NvU16, 12), ('pciDeviceId', NvU32, 16), ('deviceType', NvU64, 24), ('deviceUUID', c.Array[NvU8, Literal[16]], 32), ('fabricRecoveryStatusMask', NvU32, 48)]) +NV2080_CTRL_NVLINK_DEVICE_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_DEVICE_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO(c.Struct): + SIZE = 208 + capsTbl: int + phyType: int + subLinkWidth: int + linkState: int + rxSublinkStatus: int + txSublinkStatus: int + bLaneReversal: int + nvlinkVersion: int + nciVersion: int + phyVersion: int + nvlinkLinkClockKHz: int + nvlinkCommonClockSpeedKHz: int + nvlinkRefClkSpeedKHz: int + nvlinkCommonClockSpeedMhz: int + nvlinkLineRateMbps: int + nvlinkLinkClockMhz: int + nvlinkRefClkType: int + nvlinkLinkDataRateKiBps: int + nvlinkRefClkSpeedMhz: int + connected: int + loopProperty: int + remoteDeviceLinkNumber: int + localDeviceLinkNumber: int + remoteLinkSid: int + localLinkSid: int + laneRxdetStatusMask: int + nvlinkMinL1Threshold: int + nvlinkMaxL1Threshold: int + nvlinkL1ThresholdUnits: int + remoteDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO + localDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO +struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO.register_fields([('capsTbl', NvU32, 0), ('phyType', NvU8, 4), ('subLinkWidth', NvU8, 5), ('linkState', NvU32, 8), ('rxSublinkStatus', NvU8, 12), ('txSublinkStatus', NvU8, 13), ('bLaneReversal', NvBool, 14), ('nvlinkVersion', NvU8, 15), ('nciVersion', NvU8, 16), ('phyVersion', NvU8, 17), ('nvlinkLinkClockKHz', NvU32, 20), ('nvlinkCommonClockSpeedKHz', NvU32, 24), ('nvlinkRefClkSpeedKHz', NvU32, 28), ('nvlinkCommonClockSpeedMhz', NvU32, 32), ('nvlinkLineRateMbps', NvU32, 36), ('nvlinkLinkClockMhz', NvU32, 40), ('nvlinkRefClkType', NvU8, 44), ('nvlinkLinkDataRateKiBps', NvU32, 48), ('nvlinkRefClkSpeedMhz', NvU32, 52), ('connected', NvBool, 56), ('loopProperty', NvU8, 57), ('remoteDeviceLinkNumber', NvU8, 58), ('localDeviceLinkNumber', NvU8, 59), ('remoteLinkSid', NvU64, 64), ('localLinkSid', NvU64, 72), ('laneRxdetStatusMask', NvU32, 80), ('nvlinkMinL1Threshold', NvU32, 84), ('nvlinkMaxL1Threshold', NvU32, 88), ('nvlinkL1ThresholdUnits', NvU32, 92), ('remoteDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 96), ('localDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 152)]) +NV2080_CTRL_NVLINK_LINK_STATUS_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO +enum_NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT: dict[int, str] = {(NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_100US:=0): 'NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_100US', (NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_50US:=1): 'NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_50US'} +NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS(c.Struct): + SIZE = 13344 + enabledLinkMask: int + enabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bSublinkStateInst: int + bNvleModeEnabled: int + linkInfo: c.Array[struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO, Literal[64]] +struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS.register_fields([('enabledLinkMask', NvU32, 0), ('enabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('bSublinkStateInst', NvBool, 24), ('bNvleModeEnabled', NvBool, 25), ('linkInfo', c.Array[NV2080_CTRL_NVLINK_LINK_STATUS_INFO, Literal[64]], 32)]) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_ERR_INFO(c.Struct): + SIZE = 112 + TLErrlog: int + TLIntrEn: int + TLCTxErrStatus0: int + TLCTxErrStatus1: int + TLCTxSysErrStatus0: int + TLCRxErrStatus0: int + TLCRxErrStatus1: int + TLCRxSysErrStatus0: int + TLCTxErrLogEn0: int + TLCTxErrLogEn1: int + TLCTxSysErrLogEn0: int + TLCRxErrLogEn0: int + TLCRxErrLogEn1: int + TLCRxSysErrLogEn0: int + MIFTxErrStatus0: int + MIFRxErrStatus0: int + NVLIPTLnkErrStatus0: int + NVLIPTLnkErrLogEn0: int + NVLIPTLnkCtrlLinkStateRequest: int + DLSpeedStatusTx: int + DLSpeedStatusRx: int + NVLDLRxSlsmErrCntl: int + NVLDLTopLinkState: int + NVLDLTopIntr: int + DLStatMN00: int + DLStatUC01: int + MinionNvlinkLinkIntr: int + bExcessErrorDL: int +struct_NV2080_CTRL_NVLINK_ERR_INFO.register_fields([('TLErrlog', NvU32, 0), ('TLIntrEn', NvU32, 4), ('TLCTxErrStatus0', NvU32, 8), ('TLCTxErrStatus1', NvU32, 12), ('TLCTxSysErrStatus0', NvU32, 16), ('TLCRxErrStatus0', NvU32, 20), ('TLCRxErrStatus1', NvU32, 24), ('TLCRxSysErrStatus0', NvU32, 28), ('TLCTxErrLogEn0', NvU32, 32), ('TLCTxErrLogEn1', NvU32, 36), ('TLCTxSysErrLogEn0', NvU32, 40), ('TLCRxErrLogEn0', NvU32, 44), ('TLCRxErrLogEn1', NvU32, 48), ('TLCRxSysErrLogEn0', NvU32, 52), ('MIFTxErrStatus0', NvU32, 56), ('MIFRxErrStatus0', NvU32, 60), ('NVLIPTLnkErrStatus0', NvU32, 64), ('NVLIPTLnkErrLogEn0', NvU32, 68), ('NVLIPTLnkCtrlLinkStateRequest', NvU32, 72), ('DLSpeedStatusTx', NvU32, 76), ('DLSpeedStatusRx', NvU32, 80), ('NVLDLRxSlsmErrCntl', NvU32, 84), ('NVLDLTopLinkState', NvU32, 88), ('NVLDLTopIntr', NvU32, 92), ('DLStatMN00', NvU32, 96), ('DLStatUC01', NvU32, 100), ('MinionNvlinkLinkIntr', NvU32, 104), ('bExcessErrorDL', NvBool, 108)]) +NV2080_CTRL_NVLINK_ERR_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_ERR_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO(c.Struct): + SIZE = 8 + NVLIPTErrStatus0: int + NVLIPTErrLogEn0: int +struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO.register_fields([('NVLIPTErrStatus0', NvU32, 0), ('NVLIPTErrLogEn0', NvU32, 4)]) +NV2080_CTRL_NVLINK_COMMON_ERR_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS(c.Struct): + SIZE = 7224 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + linkErrInfo: c.Array[struct_NV2080_CTRL_NVLINK_ERR_INFO, Literal[64]] + ioctrlMask: int + commonErrInfo: c.Array[struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO, Literal[3]] + ErrInfoFlags: int +struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('linkErrInfo', c.Array[NV2080_CTRL_NVLINK_ERR_INFO, Literal[64]], 24), ('ioctrlMask', NvU32, 7192), ('commonErrInfo', c.Array[NV2080_CTRL_NVLINK_COMMON_ERR_INFO, Literal[3]], 7196), ('ErrInfoFlags', NvU8, 7220)]) +NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES(c.Struct): + SIZE = 264 + bTx0TlCounterOverflow: int + bTx1TlCounterOverflow: int + bRx0TlCounterOverflow: int + bRx1TlCounterOverflow: int + value: c.Array[ctypes.c_uint64, Literal[32]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES.register_fields([('bTx0TlCounterOverflow', NvBool, 0), ('bTx1TlCounterOverflow', NvBool, 1), ('bRx0TlCounterOverflow', NvBool, 2), ('bRx1TlCounterOverflow', NvBool, 3), ('value', c.Array[NvU64, Literal[32]], 8)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS(c.Struct): + SIZE = 16928 + counterMask: int + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + counters: c.Array[struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS.register_fields([('counterMask', NvU32, 0), ('linkMask', NvU64, 8), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 16), ('counters', c.Array[NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES, Literal[64]], 32)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS(c.Struct): + SIZE = 32 + counterMask: int + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS.register_fields([('counterMask', NvU32, 0), ('linkMask', NvU64, 8), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 16)]) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES(c.Struct): + SIZE = 16 + overFlow: int + value: int +struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES.register_fields([('overFlow', NvBool, 0), ('value', NvU64, 8)]) +NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS(c.Struct): + SIZE = 28712 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + counterMask: c.Array[ctypes.c_uint64, Literal[2]] + counter: c.Array[c.Array[struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES, Literal[28]], Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('counterMask', c.Array[NvU64, Literal[2]], 24), ('counter', c.Array[c.Array[NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES, Literal[28]], Literal[64]], 40)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS(c.Struct): + SIZE = 40 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + counterMask: c.Array[ctypes.c_uint64, Literal[2]] +struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('counterMask', c.Array[NvU64, Literal[2]], 24)]) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + bFatalError: int +struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('bFatalError', NvBool, 24)]) +NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS +enum_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE: dict[int, str] = {(NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_TX_ERR:=1): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_TX_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_PKT_ERR:=2): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_PKT_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_AUTH_TAG_ERR:=3): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_AUTH_TAG_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_LINK_ERR:=4): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_LINK_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_MAX:=5): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_MAX'} +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG(c.Struct): + SIZE = 16 + errType: int + errSettings: int +struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG.register_fields([('errType', NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE, 0), ('errSettings', NvU64, 8)]) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG: TypeAlias = struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG +@c.record +class struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS(c.Struct): + SIZE = 1048 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + errCfg: c.Array[struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG, Literal[64]] +struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('errCfg', c.Array[NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO(c.Struct): + SIZE = 20 + txErrInfo: int + packetErrInfo: int + authErrInfo: int + linkStatus: int + errInjectStatus: int +struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO.register_fields([('txErrInfo', NvU32, 0), ('packetErrInfo', NvU32, 4), ('authErrInfo', NvU32, 8), ('linkStatus', NvU32, 12), ('errInjectStatus', NvU32, 16)]) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS(c.Struct): + SIZE = 1304 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + errInfo: c.Array[struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('errInfo', c.Array[NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS(c.Struct): + SIZE = 280 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + numRecoveries: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('numRecoveries', c.Array[NvU32, Literal[64]], 24)]) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + remoteType: int +struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS.register_fields([('linkId', NvU32, 0), ('remoteType', NvU32, 4)]) +NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS(c.Struct): + SIZE = 80 + linkId: int + supportedCounts: int + fatalErrorCounts: c.Array[ctypes.c_ubyte, Literal[63]] +struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS.register_fields([('linkId', NvU32, 0), ('supportedCounts', NvU64, 8), ('fatalErrorCounts', c.Array[NvU8, Literal[63]], 16)]) +NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE(c.Struct): + SIZE = 8 + errorsPerMinute: int + timestamp: int +struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE.register_fields([('errorsPerMinute', NvU32, 0), ('timestamp', NvU32, 4)]) +NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE: TypeAlias = struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS(c.Struct): + SIZE = 92 + linkId: int + numDailyMaxNonfatalErrorRates: int + dailyMaxNonfatalErrorRates: c.Array[struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]] + numMonthlyMaxNonfatalErrorRates: int + monthlyMaxNonfatalErrorRates: c.Array[struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]] +struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS.register_fields([('linkId', NvU32, 0), ('numDailyMaxNonfatalErrorRates', NvU32, 4), ('dailyMaxNonfatalErrorRates', c.Array[NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]], 8), ('numMonthlyMaxNonfatalErrorRates', NvU32, 48), ('monthlyMaxNonfatalErrorRates', c.Array[NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]], 52)]) +NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS(c.Struct): + SIZE = 1 + bEnabled: int +struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS.register_fields([('bEnabled', NvBool, 0)]) +NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS(c.Struct): + SIZE = 8 + linkId: int + params: int +struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS.register_fields([('linkId', NvU8, 0), ('params', NvU32, 4)]) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + powerState: int +struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('powerState', NvU32, 24)]) +NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + powerState: int +struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS.register_fields([('linkId', NvU32, 0), ('powerState', NvU32, 4)]) +NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS +enum_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE: dict[int, str] = {(TLC_RX_LNK:=0): 'TLC_RX_LNK', (TLC_TX_SYS:=1): 'TLC_TX_SYS'} +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE: dict[int, str] = {(TX_SYS_TX_RSP_STATUS_HW_ERR:=0): 'TX_SYS_TX_RSP_STATUS_HW_ERR', (TX_SYS_TX_RSP_STATUS_UR_ERR:=1): 'TX_SYS_TX_RSP_STATUS_UR_ERR', (TX_SYS_TX_RSP_STATUS_PRIV_ERR:=2): 'TX_SYS_TX_RSP_STATUS_PRIV_ERR'} +NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE: dict[int, str] = {(RX_LNK_RX_RSP_STATUS_HW_ERR:=0): 'RX_LNK_RX_RSP_STATUS_HW_ERR', (RX_LNK_RX_RSP_STATUS_UR_ERR:=1): 'RX_LNK_RX_RSP_STATUS_UR_ERR', (RX_LNK_RX_RSP_STATUS_PRIV_ERR:=2): 'RX_LNK_RX_RSP_STATUS_PRIV_ERR'} +NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE(c.Struct): + SIZE = 4 + txSysErrorType: int + rxLnkErrorType: int +union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE.register_fields([('txSysErrorType', NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE, 0), ('rxLnkErrorType', NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE, 0)]) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE: TypeAlias = union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS(c.Struct): + SIZE = 16 + linkId: int + device: int + bBroadcast: int + errorType: union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE +struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS.register_fields([('linkId', NvU32, 0), ('device', NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE, 4), ('bBroadcast', NvBool, 8), ('errorType', NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE, 12)]) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS(c.Struct): + SIZE = 16 + linkId: int + numLanes: int + figureOfMeritValues: c.Array[ctypes.c_uint16, Literal[4]] +struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS.register_fields([('linkId', NvU32, 0), ('numLanes', NvU8, 4), ('figureOfMeritValues', c.Array[NvU16, Literal[4]], 6)]) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 8 + peerMask: int + bEnable: int +struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0), ('bEnable', NvBool, 4)]) +NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS(c.Struct): + SIZE = 8 + linkId: int + lane: int + addr: int + phyConfigData: int +struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS.register_fields([('linkId', NvU8, 0), ('lane', NvU8, 1), ('addr', NvU16, 2), ('phyConfigData', NvU32, 4)]) +NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_LANE_ERROR(c.Struct): + SIZE = 12 + bValid: int + eccErrorValue: int + overflowed: int +struct_NV2080_CTRL_NVLINK_LANE_ERROR.register_fields([('bValid', NvBool, 0), ('eccErrorValue', NvU32, 4), ('overflowed', NvBool, 8)]) +NV2080_CTRL_NVLINK_LANE_ERROR: TypeAlias = struct_NV2080_CTRL_NVLINK_LANE_ERROR +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR(c.Struct): + SIZE = 56 + errorLane: c.Array[struct_NV2080_CTRL_NVLINK_LANE_ERROR, Literal[4]] + eccDecFailed: int + eccDecFailedOverflowed: int +struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR.register_fields([('errorLane', c.Array[NV2080_CTRL_NVLINK_LANE_ERROR, Literal[4]], 0), ('eccDecFailed', NvU32, 48), ('eccDecFailedOverflowed', NvBool, 52)]) +NV2080_CTRL_NVLINK_LINK_ECC_ERROR: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR +@c.record +class struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS(c.Struct): + SIZE = 3608 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + errorLink: c.Array[struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('errorLink', c.Array[NV2080_CTRL_NVLINK_LINK_ECC_ERROR, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES(c.Struct): + SIZE = 32 + value: c.Array[ctypes.c_uint64, Literal[4]] +struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES.register_fields([('value', c.Array[NvU64, Literal[4]], 0)]) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS(c.Struct): + SIZE = 2080 + counterMask: int + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + counters: c.Array[struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES, Literal[64]] +struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS.register_fields([('counterMask', NvU16, 0), ('linkMask', NvU64, 8), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 16), ('counters', c.Array[NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES, Literal[64]], 32)]) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS(c.Struct): + SIZE = 1 + bLockPowerMode: int +struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS.register_fields([('bLockPowerMode', NvBool, 0)]) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS(c.Struct): + SIZE = 72 + linkId: int + counterValidMask: int + counterValues: c.Array[ctypes.c_uint32, Literal[16]] +struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS.register_fields([('linkId', NvU32, 0), ('counterValidMask', NvU32, 4), ('counterValues', c.Array[NvU32, Literal[16]], 8)]) +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + loopbackMode: int +struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS.register_fields([('linkId', NvU32, 0), ('loopbackMode', NvU8, 4)]) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO(c.Struct): + SIZE = 6 + bValid: int + passCount: int + failCount: int +struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO.register_fields([('bValid', NvBool, 0), ('passCount', NvU16, 2), ('failCount', NvU16, 4)]) +NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS(c.Struct): + SIZE = 216 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + refreshCount: c.Array[struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO, Literal[32]] +struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('refreshCount', c.Array[NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO, Literal[32]], 24)]) +NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS(c.Struct): + SIZE = 24 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8)]) +NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS(c.Struct): + SIZE = 16 + bGet: int + addr: int +struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS.register_fields([('bGet', NvBool, 0), ('addr', NvU64, 8)]) +NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS(c.Struct): + SIZE = 176 + discoveredLinks: int + discoveredLinkMasks: struct_NV2080_CTRL_NVLINK_LINK_MASK + connectedLinksMask: int + connectedLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bridgeSensableLinks: int + bridgeSensableLinkMasks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bridgedLinks: int + bridgedLinkMasks: struct_NV2080_CTRL_NVLINK_LINK_MASK + initDisabledLinksMask: int + initDisabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + vbiosDisabledLinkMask: int + vbiosDisabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + initializedLinks: int + initializedLinkMasks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bEnableTrainingAtLoad: int + bEnableSafeModeAtLoad: int +struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS.register_fields([('discoveredLinks', NvU64, 0), ('discoveredLinkMasks', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('connectedLinksMask', NvU32, 24), ('connectedLinks', NV2080_CTRL_NVLINK_LINK_MASK, 32), ('bridgeSensableLinks', NvU64, 48), ('bridgeSensableLinkMasks', NV2080_CTRL_NVLINK_LINK_MASK, 56), ('bridgedLinks', NvU32, 72), ('bridgedLinkMasks', NV2080_CTRL_NVLINK_LINK_MASK, 80), ('initDisabledLinksMask', NvU32, 96), ('initDisabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 104), ('vbiosDisabledLinkMask', NvU64, 120), ('vbiosDisabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 128), ('initializedLinks', NvU32, 144), ('initializedLinkMasks', NV2080_CTRL_NVLINK_LINK_MASK, 152), ('bEnableTrainingAtLoad', NvBool, 168), ('bEnableSafeModeAtLoad', NvBool, 169)]) +NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS(c.Struct): + SIZE = 32 + initDisabledLinksMask: int + initDisabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bSkipHwNvlinkDisable: int +struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS.register_fields([('initDisabledLinksMask', NvU32, 0), ('initDisabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('bSkipHwNvlinkDisable', NvBool, 24)]) +NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS +enum_NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND: dict[int, str] = {(NVLINK_EOM_CONTROL_START_EOM:=0): 'NVLINK_EOM_CONTROL_START_EOM', (NVLINK_EOM_CONTROL_END_EOM:=1): 'NVLINK_EOM_CONTROL_END_EOM', (NVLINK_EOM_CONTROL_CONFIG_EOM:=2): 'NVLINK_EOM_CONTROL_CONFIG_EOM', (NVLINK_EOM_CONTROL_FULL_EOM_SEQUENCE:=3): 'NVLINK_EOM_CONTROL_FULL_EOM_SEQUENCE'} +NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT(c.Struct): + SIZE = 4 + upper: int + middle: int + lower: int + composite: int +struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT.register_fields([('upper', NvU8, 0), ('middle', NvU8, 1), ('lower', NvU8, 2), ('composite', NvU8, 3)]) +NV2080_CTRL_NVLINK_EOM_MEASUREMENT: TypeAlias = struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT +@c.record +class struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + linkId: int + params: int + measurements: c.Array[struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT, Literal[4]] +struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS.register_fields([('cmd', NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND, 0), ('linkId', NvU32, 4), ('params', NvU32, 8), ('measurements', c.Array[NV2080_CTRL_NVLINK_EOM_MEASUREMENT, Literal[4]], 12)]) +NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS(c.Struct): + SIZE = 5124 + data: c.Array[ctypes.c_ubyte, Literal[5120]] + dataSize: int +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS.register_fields([('data', c.Array[NvU8, Literal[5120]], 0), ('dataSize', NvU32, 5120)]) +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + l1Threshold: int + l1ExitThreshold: int +struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS.register_fields([('l1Threshold', NvU32, 0), ('l1ExitThreshold', NvU32, 4)]) +NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + l1Threshold: int + l1ExitThreshold: int +struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS.register_fields([('l1Threshold', NvU32, 0), ('l1ExitThreshold', NvU32, 4)]) +NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS(c.Struct): + SIZE = 5124 + buffer: c.Array[ctypes.c_ubyte, Literal[5120]] + dataSize: int +struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS.register_fields([('buffer', c.Array[NvU8, Literal[5120]], 0), ('dataSize', NvU32, 5120)]) +NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS(c.Struct): + SIZE = 8 + linkId: int + bIsGpuDegraded: int +struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS.register_fields([('linkId', NvU32, 0), ('bIsGpuDegraded', NvBool, 4)]) +NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS(c.Struct): + SIZE = 12 + bIsEnoughNvLink: int + numBridge: int + bridgePresenceMask: int +struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS.register_fields([('bIsEnoughNvLink', NvBool, 0), ('numBridge', NvU32, 4), ('bridgePresenceMask', NvU32, 8)]) +NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS(c.Struct): + SIZE = 4 + linkId: int +struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS.register_fields([('linkId', NvU32, 0)]) +NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PORT_EVENT(c.Struct): + SIZE = 24 + portEventType: int + gpuId: int + linkId: int + time: int +struct_NV2080_CTRL_NVLINK_PORT_EVENT.register_fields([('portEventType', NvU32, 0), ('gpuId', NvU32, 4), ('linkId', NvU32, 8), ('time', NvU64, 16)]) +NV2080_CTRL_NVLINK_PORT_EVENT: TypeAlias = struct_NV2080_CTRL_NVLINK_PORT_EVENT +@c.record +class struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS(c.Struct): + SIZE = 1560 + portEventIndex: int + nextPortEventIndex: int + portEventCount: int + bOverflow: int + portEvent: c.Array[struct_NV2080_CTRL_NVLINK_PORT_EVENT, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS.register_fields([('portEventIndex', NvU64, 0), ('nextPortEventIndex', NvU64, 8), ('portEventCount', NvU32, 16), ('bOverflow', NvBool, 20), ('portEvent', c.Array[NV2080_CTRL_NVLINK_PORT_EVENT, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS(c.Struct): + SIZE = 4 + linkId: int +struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS.register_fields([('linkId', NvU32, 0)]) +NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bReducedNvlinkConfig: int +struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS.register_fields([('bReducedNvlinkConfig', NvBool, 0)]) +NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_DATA(c.Struct): + SIZE = 496 + data: c.Array[ctypes.c_ubyte, Literal[496]] +struct_NV2080_CTRL_NVLINK_PRM_DATA.register_fields([('data', c.Array[NvU8, Literal[496]], 0)]) +NV2080_CTRL_NVLINK_PRM_DATA: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_DATA +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS(c.Struct): + SIZE = 513 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + plane_ind: int + admin_status: int + lp_msb: int + local_port: int + swid: int + e: int + fd: int + ps_e: int + ls_e: int + ee_ps: int + ee_ls: int + ee: int + ase: int + ee_nmxas: int + nmxas_e: int + ps_e_ext: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('plane_ind', NvU8, 497), ('admin_status', NvU8, 498), ('lp_msb', NvU8, 499), ('local_port', NvU8, 500), ('swid', NvU8, 501), ('e', NvU8, 502), ('fd', NvU8, 503), ('ps_e', NvU8, 504), ('ls_e', NvU8, 505), ('ee_ps', NvU8, 506), ('ee_ls', NvU8, 507), ('ee', NvU8, 508), ('ase', NvU8, 509), ('ee_nmxas', NvBool, 510), ('nmxas_e', NvU8, 511), ('ps_e_ext', NvU8, 512)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS(c.Struct): + SIZE = 503 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lane_mask: int + lp_msb: int + pnat: int + local_port: int + local_tx_precoding_admin: int + local_rx_precoding_admin: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lane_mask', NvU8, 497), ('lp_msb', NvU8, 498), ('pnat', NvU8, 499), ('local_port', NvU8, 500), ('local_tx_precoding_admin', NvU8, 501), ('local_rx_precoding_admin', NvU8, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS(c.Struct): + SIZE = 546 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + test_mode: int + plr_vld: int + plane_ind: int + port_type: int + lp_msb: int + pnat: int + local_port: int + plr_reject_mode_vld: int + plr_margin_th_override_to_default: int + plr_reject_mode: int + tx_crc_plr: int + plr_margin_th: int + fec_override_admin_10g_40g: int + fec_override_admin_25g: int + fec_override_admin_50g: int + fec_override_admin_100g: int + fec_override_admin_56g: int + rs_fec_correction_bypass_admin: int + fec_override_admin_200g_4x: int + fec_override_admin_400g_8x: int + fec_override_admin_50g_1x: int + fec_override_admin_100g_2x: int + fec_override_admin_400g_4x: int + fec_override_admin_800g_8x: int + fec_override_admin_100g_1x: int + fec_override_admin_200g_2x: int + tx_crc_plr_vld: int + tx_crc_plr_override_to_default: int + plr_reject_mode_override_to_default: int + nvlink_fec_override_admin_nvl_phy6: int + fec_override_admin_800g_4x: int + fec_override_admin_1600g_8x: int + fec_override_admin_200g_1x: int + fec_override_admin_400g_2x: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('test_mode', NvBool, 497), ('plr_vld', NvBool, 498), ('plane_ind', NvU8, 499), ('port_type', NvU8, 500), ('lp_msb', NvU8, 501), ('pnat', NvU8, 502), ('local_port', NvU8, 503), ('plr_reject_mode_vld', NvBool, 504), ('plr_margin_th_override_to_default', NvBool, 505), ('plr_reject_mode', NvU8, 506), ('tx_crc_plr', NvU8, 507), ('plr_margin_th', NvU8, 508), ('fec_override_admin_10g_40g', NvU8, 509), ('fec_override_admin_25g', NvU8, 510), ('fec_override_admin_50g', NvU8, 511), ('fec_override_admin_100g', NvU8, 512), ('fec_override_admin_56g', NvU8, 513), ('rs_fec_correction_bypass_admin', NvU8, 514), ('fec_override_admin_200g_4x', NvU16, 516), ('fec_override_admin_400g_8x', NvU16, 518), ('fec_override_admin_50g_1x', NvU16, 520), ('fec_override_admin_100g_2x', NvU16, 522), ('fec_override_admin_400g_4x', NvU16, 524), ('fec_override_admin_800g_8x', NvU16, 526), ('fec_override_admin_100g_1x', NvU16, 528), ('fec_override_admin_200g_2x', NvU16, 530), ('tx_crc_plr_vld', NvBool, 532), ('tx_crc_plr_override_to_default', NvBool, 533), ('plr_reject_mode_override_to_default', NvBool, 534), ('nvlink_fec_override_admin_nvl_phy6', NvU16, 536), ('fec_override_admin_800g_4x', NvU16, 538), ('fec_override_admin_1600g_8x', NvU16, 540), ('fec_override_admin_200g_1x', NvU16, 542), ('fec_override_admin_400g_2x', NvU16, 544)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS(c.Struct): + SIZE = 528 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + local_port: int + l1_req_en: int + l1_fw_req_en: int + l1_cap_adv: int + l1_fw_cap_adv: int + hp_queues_bitmap: int + l1_hw_active_time: int + l1_hw_inactive_time: int + qem: c.Array[ctypes.c_ubyte, Literal[8]] + l0_rx_cap_adv: int + l0_rx_req_en: int + l0_tx_cap_adv: int + l0_tx_req_en: int + l0_all_queues_are_import: int + l0_hw_inactive_time: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('local_port', NvU8, 498), ('l1_req_en', NvBool, 499), ('l1_fw_req_en', NvBool, 500), ('l1_cap_adv', NvBool, 501), ('l1_fw_cap_adv', NvBool, 502), ('hp_queues_bitmap', NvU32, 504), ('l1_hw_active_time', NvU16, 508), ('l1_hw_inactive_time', NvU16, 510), ('qem', c.Array[NvU8, Literal[8]], 512), ('l0_rx_cap_adv', NvBool, 520), ('l0_rx_req_en', NvBool, 521), ('l0_tx_cap_adv', NvBool, 522), ('l0_tx_req_en', NvBool, 523), ('l0_all_queues_are_import', NvBool, 524), ('l0_hw_inactive_time', NvU16, 526)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS(c.Struct): + SIZE = 499 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + access_reg_group: int + feature_group: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('access_reg_group', NvU8, 497), ('feature_group', NvU8, 498)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + slot_index: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('slot_index', NvU8, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + slot_index: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('slot_index', NvU8, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + slot_index: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('slot_index', NvU8, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + slot_index: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('slot_index', NvU8, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + itre: int + i_e: int + lp_msb: int + local_port: int + protocol: int + admin_mtu: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('itre', NvBool, 497), ('i_e', NvU8, 498), ('lp_msb', NvU8, 499), ('local_port', NvU8, 500), ('protocol', NvU8, 501), ('admin_mtu', NvU16, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + width: int + plane_ind: int + lp_msb: int + local_port: int + m_lane_m: int + rxtx: int + mod_lab_map: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('width', NvU8, 497), ('plane_ind', NvU8, 498), ('lp_msb', NvU8, 499), ('local_port', NvU8, 500), ('m_lane_m', NvBool, 501), ('rxtx', NvBool, 502), ('mod_lab_map', NvBool, 503)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS(c.Struct): + SIZE = 502 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + trap_id: int + action: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('trap_id', NvU16, 498), ('action', NvU8, 500)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS(c.Struct): + SIZE = 505 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + port_type: int + plane_ind: int + lp_msb: int + pnat: int + local_port: int + page_select: int + module_info_ext: int + module_ind_type: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('port_type', NvU8, 497), ('plane_ind', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501), ('page_select', NvU8, 502), ('module_info_ext', NvU8, 503), ('module_ind_type', NvU8, 504)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS(c.Struct): + SIZE = 512 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + le: int + port_type: int + lane: int + lp_msb: int + pnat: int + local_port: int + sw: int + dm_ig: int + p: int + e: int + modulation: int + prbs_mode_admin: int + prbs_fec_admin: int + lane_rate_admin: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('le', NvBool, 497), ('port_type', NvU8, 498), ('lane', NvU8, 499), ('lp_msb', NvU8, 500), ('pnat', NvU8, 501), ('local_port', NvU8, 502), ('sw', NvBool, 503), ('dm_ig', NvBool, 504), ('p', NvBool, 505), ('e', NvBool, 506), ('modulation', NvU8, 507), ('prbs_mode_admin', NvU8, 508), ('prbs_fec_admin', NvBool, 509), ('lane_rate_admin', NvU16, 510)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS(c.Struct): + SIZE = 509 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + grp: int + port_type: int + lp_msb: int + pnat: int + local_port: int + swid: int + prio_tc: int + grp_profile: int + plane_ind: int + counters_cap: int + lp_gl: int + clr: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('grp', NvU8, 497), ('port_type', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501), ('swid', NvU8, 502), ('prio_tc', NvU8, 503), ('grp_profile', NvU8, 504), ('plane_ind', NvU8, 505), ('counters_cap', NvBool, 506), ('lp_gl', NvBool, 507), ('clr', NvBool, 508)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS(c.Struct): + SIZE = 497 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS(c.Struct): + SIZE = 507 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + port_type: int + phy_test_mode_admin: int + lp_msb: int + local_port: int + swid: int + plane_ind: int + phy_status_admin: int + ee_nmxas: int + nmxas_e: int + ps_e_ext: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('port_type', NvU8, 497), ('phy_test_mode_admin', NvU8, 498), ('lp_msb', NvU8, 499), ('local_port', NvU8, 500), ('swid', NvU8, 501), ('plane_ind', NvU8, 502), ('phy_status_admin', NvU8, 503), ('ee_nmxas', NvBool, 504), ('nmxas_e', NvU8, 505), ('ps_e_ext', NvU8, 506)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS(c.Struct): + SIZE = 503 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + plane_ind: int + port_type: int + lp_msb: int + pnat: int + local_port: int + hist_type: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('plane_ind', NvU8, 497), ('port_type', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501), ('hist_type', NvU8, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS(c.Struct): + SIZE = 506 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + c_db: int + port_type: int + lane_speed: int + lane: int + tx_policy: int + pnat: int + local_port: int + lp_msb: int + conf_mod: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('c_db', NvBool, 497), ('port_type', NvU8, 498), ('lane_speed', NvU8, 499), ('lane', NvU8, 500), ('tx_policy', NvBool, 501), ('pnat', NvU8, 502), ('local_port', NvU8, 503), ('lp_msb', NvU8, 504), ('conf_mod', NvBool, 505)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS(c.Struct): + SIZE = 500 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + pnat: int + local_port: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('pnat', NvU8, 498), ('local_port', NvU8, 499)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS(c.Struct): + SIZE = 512 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + le: int + port_type: int + lane: int + lp_msb: int + pnat: int + local_port: int + sw: int + dm_ig: int + p: int + s: int + e: int + modulation: int + prbs_mode_admin: int + lane_rate_oper: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('le', NvBool, 497), ('port_type', NvU8, 498), ('lane', NvU8, 499), ('lp_msb', NvU8, 500), ('pnat', NvU8, 501), ('local_port', NvU8, 502), ('sw', NvBool, 503), ('dm_ig', NvBool, 504), ('p', NvBool, 505), ('s', NvBool, 506), ('e', NvBool, 507), ('modulation', NvU8, 508), ('prbs_mode_admin', NvU8, 509), ('lane_rate_oper', NvU16, 510)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS(c.Struct): + SIZE = 524 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + proto_mask: int + transmit_allowed: int + plane_ind: int + port_type: int + lp_msb: int + local_port: int + tx_ready_e: int + ee_tx_ready: int + an_disable_admin: int + ext_eth_proto_admin: int + eth_proto_admin: int + ib_proto_admin: int + ib_link_width_admin: int + xdr_2x_slow_admin: int + force_lt_frames_admin: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('proto_mask', NvU8, 497), ('transmit_allowed', NvBool, 498), ('plane_ind', NvU8, 499), ('port_type', NvU8, 500), ('lp_msb', NvU8, 501), ('local_port', NvU8, 502), ('tx_ready_e', NvU8, 503), ('ee_tx_ready', NvBool, 504), ('an_disable_admin', NvBool, 505), ('ext_eth_proto_admin', NvU32, 508), ('eth_proto_admin', NvU32, 512), ('ib_proto_admin', NvU16, 516), ('ib_link_width_admin', NvU16, 518), ('xdr_2x_slow_admin', NvBool, 520), ('force_lt_frames_admin', NvU8, 521)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS(c.Struct): + SIZE = 502 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + port_type: int + lane: int + lp_msb: int + pnat: int + local_port: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('port_type', NvU8, 497), ('lane', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + admin_status: int + module: int + slot_index: int + rst: int + e: int + ee: int + ase: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('admin_status', NvU8, 497), ('module', NvU8, 498), ('slot_index', NvU8, 499), ('rst', NvBool, 500), ('e', NvU8, 501), ('ee', NvBool, 502), ('ase', NvBool, 503)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS(c.Struct): + SIZE = 508 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + plane_ind: int + port_type: int + op_mod: int + apply_im: int + lp_msb: int + local_port: int + lb_en: int + lb_cap_mode_idx: int + lb_link_mode_idx: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('plane_ind', NvU8, 497), ('port_type', NvU8, 498), ('op_mod', NvBool, 499), ('apply_im', NvBool, 500), ('lp_msb', NvU8, 501), ('local_port', NvU8, 502), ('lb_en', NvU16, 504), ('lb_cap_mode_idx', NvBool, 506), ('lb_link_mode_idx', NvBool, 507)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterMask: c.Array[ctypes.c_uint64, Literal[2]] +struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS.register_fields([('counterMask', c.Array[NvU64, Literal[2]], 0)]) +NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS(c.Struct): + SIZE = 544 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + segment_type: int + seq_num: int + vhca_id_valid: int + inline_dump: int + vhca_id: int + index1: int + index2: int + num_of_obj2: int + num_of_obj1: int + device_opaque: int + mkey: int + address: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('segment_type', NvU16, 498), ('seq_num', NvU8, 500), ('vhca_id_valid', NvBool, 501), ('inline_dump', NvBool, 502), ('vhca_id', NvU16, 504), ('index1', NvU32, 508), ('index2', NvU32, 512), ('num_of_obj2', NvU16, 516), ('num_of_obj1', NvU16, 518), ('device_opaque', NvU64, 520), ('mkey', NvU32, 528), ('address', NvU64, 536)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS(c.Struct): + SIZE = 498 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + trace_owner: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('trace_owner', NvBool, 497)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS(c.Struct): + SIZE = 500 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + trace_mode: int + log_trace_buffer_size: int + trace_mkey: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('trace_mode', NvU8, 497), ('log_trace_buffer_size', NvU8, 498), ('trace_mkey', NvU8, 499)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS(c.Struct): + SIZE = 502 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + modify_field_select: int + arm_event: int + trace_status: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('modify_field_select', NvU16, 498), ('arm_event', NvBool, 500), ('trace_status', NvU8, 501)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS(c.Struct): + SIZE = 497 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS(c.Struct): + SIZE = 532 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + enable_all: int + log_delay: int + source_id_bitmask: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('enable_all', NvU8, 497), ('log_delay', NvU8, 498), ('source_id_bitmask', c.Array[NvU32, Literal[8]], 500)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + log_level: int + log_bit_mask: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('log_level', NvU8, 497), ('log_bit_mask', NvU32, 500)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + warning_inactive_time: int + warning_active_time: int + critical_inactive_time: int + critical_active_time: int + cc: int + l0_all_queues_are_import: int + ge: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('warning_inactive_time', NvU8, 497), ('warning_active_time', NvU8, 498), ('critical_inactive_time', NvU8, 499), ('critical_active_time', NvU8, 500), ('cc', NvBool, 501), ('l0_all_queues_are_import', NvBool, 502), ('ge', NvBool, 503)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS(c.Struct): + SIZE = 497 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS(c.Struct): + SIZE = 499 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + local_port: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('local_port', NvU8, 498)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS(c.Struct): + SIZE = 520 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + local_port: int + cnt_64bit: int + stop_at_ff: int + counter_rst: int + counter_en: int + force_count_mask: int + cnt_type: c.Array[ctypes.c_ubyte, Literal[8]] + cnt_val: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('local_port', NvU8, 498), ('cnt_64bit', NvU8, 499), ('stop_at_ff', NvBool, 500), ('counter_rst', NvBool, 501), ('counter_en', NvBool, 502), ('force_count_mask', NvU8, 503), ('cnt_type', c.Array[NvU8, Literal[8]], 504), ('cnt_val', c.Array[NvU8, Literal[8]], 512)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS(c.Struct): + SIZE = 504 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + ib_port: int + lp_msb: int + local_port: int + split_num: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('ib_port', NvU16, 498), ('lp_msb', NvU8, 500), ('local_port', NvU8, 501), ('split_num', NvU8, 502)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS(c.Struct): + SIZE = 39 + ibGuid: c.Array[ctypes.c_ubyte, Literal[16]] + rackGuid: c.Array[ctypes.c_ubyte, Literal[16]] + chassisPhysicalSlotNumber: int + computeSlotIndex: int + nodeIndex: int + peerType: int + moduleId: int + nvlinkSignalingProtocol: int + lanesPerLink: int +struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS.register_fields([('ibGuid', c.Array[NvU8, Literal[16]], 0), ('rackGuid', c.Array[NvU8, Literal[16]], 16), ('chassisPhysicalSlotNumber', NvU8, 32), ('computeSlotIndex', NvU8, 33), ('nodeIndex', NvU8, 34), ('peerType', NvU8, 35), ('moduleId', NvU8, 36), ('nvlinkSignalingProtocol', NvU8, 37), ('lanesPerLink', NvU8, 38)]) +NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD(c.Struct): + SIZE = 4 + pllIndex: int + address: int +struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD.register_fields([('pllIndex', NvU8, 0), ('address', NvU16, 2)]) +NV2080_CTRL_NVLINK_UPHY_CLN_CMD: TypeAlias = struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD +@c.record +class struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS(c.Struct): + SIZE = 536 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + uphyCmd: c.Array[struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD, Literal[64]] + data: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('uphyCmd', c.Array[NV2080_CTRL_NVLINK_UPHY_CLN_CMD, Literal[64]], 24), ('data', c.Array[NvU32, Literal[64]], 280)]) +NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS(c.Struct): + SIZE = 24 + rbmModesList: c.Array[ctypes.c_ubyte, Literal[23]] + rbmTotalModes: int +struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS.register_fields([('rbmModesList', c.Array[NvU8, Literal[23]], 0), ('rbmTotalModes', NvU8, 23)]) +NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS(c.Struct): + SIZE = 1 + rbmMode: int +struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS.register_fields([('rbmMode', NvU8, 0)]) +NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS(c.Struct): + SIZE = 1 + rbmMode: int +struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS.register_fields([('rbmMode', NvU8, 0)]) +NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 56 + localDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO +struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS.register_fields([('localDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 0)]) +NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS +enum_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY: dict[int, str] = {(NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_NONFATAL:=0): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_NONFATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_APP_FATAL:=1): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_APP_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_FATAL:=2): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_DEGRADATION:=3): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_DEGRADATION', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_WATCHDOG_TIMEOUT:=4): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_WATCHDOG_TIMEOUT', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_NON_FATAL:=5): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MSE:=6): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MSE', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_NON_FATAL:=7): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_FATAL:=8): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_PRIV_ERR:=9): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_PRIV_ERR', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_NON_FATAL:=10): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_FATAL:=11): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TREX_NON_FATAL:=12): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TREX_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_NON_FATAL:=13): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_FATAL:=14): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_NON_FATAL:=15): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_FATAL:=16): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_NON_FATAL:=17): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_FATAL:=18): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_NON_FATAL:=19): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_FATAL:=20): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_FATAL:=21): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MAX:=22): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MAX'} +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + severity: int +struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('severity', NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY, 24)]) +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS(c.Struct): + SIZE = 16 + localGpuAlid: int + localGpuClid: int + remoteGpuAlid: int + remoteGpuClid: int +struct_NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS.register_fields([('localGpuAlid', NvU32, 0), ('localGpuClid', NvU32, 4), ('remoteGpuAlid', NvU32, 8), ('remoteGpuClid', NvU32, 12)]) +NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_NVLE_LIDS_PARAMS(c.Struct): + SIZE = 12 + probeClid: int + clid: int + alid: int +struct_NV2080_CTRL_NVLINK_GET_NVLE_LIDS_PARAMS.register_fields([('probeClid', NvU32, 0), ('clid', NvU32, 4), ('alid', NvU32, 8)]) +NV2080_CTRL_NVLINK_GET_NVLE_LIDS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_NVLE_LIDS_PARAMS +enum_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE: dict[int, str] = {(NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DISABLED:=0): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DISABLED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_TRIGGER_ONCE:=1): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_TRIGGER_ONCE', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_EXITED:=2): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_EXITED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_ENTERED:=3): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_ENTERED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DUTY_CYCLE:=4): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DUTY_CYCLE'} +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG(c.Struct): + SIZE = 8 + mode: int + toggleActiveTime: int + toggleInactiveTime: int + bTrigger: int +struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG.register_fields([('mode', NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE, 0), ('toggleActiveTime', NvU8, 4), ('toggleInactiveTime', NvU8, 5), ('bTrigger', NvBool, 6)]) +NV2080_CTRL_NVLINK_L1_FORCE_CONFIG: TypeAlias = struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG +@c.record +class struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + config: struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG +struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('config', NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, 24)]) +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS(c.Struct): + SIZE = 536 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + config: c.Array[struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('config', c.Array[NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS(c.Struct): + SIZE = 1 + bEncryptEnSet: int +struct_NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS.register_fields([('bEncryptEnSet', NvBool, 0)]) +NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCSR_PARAMS(c.Struct): + SIZE = 572 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + base_address: int + num_addresses: int + data: c.Array[ctypes.c_uint32, Literal[16]] +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCSR_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('base_address', NvU32, 500), ('num_addresses', NvU16, 504), ('data', c.Array[NvU32, Literal[16]], 508)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_MCSR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_MCSR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SEMANTIC_VERSION(c.Struct): + SIZE = 16 + ucodeType: int + major: int + minor: int + subMinor: int +struct_NV2080_CTRL_NVLINK_SEMANTIC_VERSION.register_fields([('ucodeType', NvU8, 0), ('major', NvU32, 4), ('minor', NvU32, 8), ('subMinor', NvU32, 12)]) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION: TypeAlias = struct_NV2080_CTRL_NVLINK_SEMANTIC_VERSION +@c.record +class struct_NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS(c.Struct): + SIZE = 264 + firmwareVersion: c.Array[struct_NV2080_CTRL_NVLINK_SEMANTIC_VERSION, Literal[16]] + chipTypeArch: int + numValidEntries: int +struct_NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS.register_fields([('firmwareVersion', c.Array[NV2080_CTRL_NVLINK_SEMANTIC_VERSION, Literal[16]], 0), ('chipTypeArch', NvU8, 256), ('numValidEntries', NvU32, 260)]) +NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS(c.Struct): + SIZE = 1 + bIsNvleEnabled: int +struct_NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS.register_fields([('bIsNvleEnabled', NvBool, 0)]) +NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTASV2_PARAMS(c.Struct): + SIZE = 512 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + lp_msb: int + pnat: int + local_port: int + xdr_lt_c2c_en: int + xdr_lt_c2m_en: int + kr_ext_req: int + lt_ext_neg_type: int + lt_ext_timeout_admin: int + prbs_type_admin: int + ber_cnt_mlsd_dis: int + num_of_iter_admin: int + iter_time_admin: int + ber_target_coef_admin: int + ber_target_magnitude_admin: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTASV2_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('lp_msb', NvU8, 497), ('pnat', NvU8, 498), ('local_port', NvU8, 499), ('xdr_lt_c2c_en', NvU8, 500), ('xdr_lt_c2m_en', NvU8, 501), ('kr_ext_req', NvU8, 502), ('lt_ext_neg_type', NvU8, 503), ('lt_ext_timeout_admin', NvU8, 504), ('prbs_type_admin', NvU8, 505), ('ber_cnt_mlsd_dis', NvBool, 506), ('num_of_iter_admin', NvU8, 507), ('iter_time_admin', NvU16, 508), ('ber_target_coef_admin', NvU8, 510), ('ber_target_magnitude_admin', NvU8, 511)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PTASV2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PTASV2_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLLM_5NM_PARAMS(c.Struct): + SIZE = 508 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + c_db: int + br_lanes: int + port_type: int + lane: int + lp_msb: int + pnat: int + local_port: int + peq_cap: int + peq_interval_period: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLLM_5NM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('c_db', NvBool, 497), ('br_lanes', NvBool, 498), ('port_type', NvU8, 499), ('lane', NvU8, 500), ('lp_msb', NvU8, 501), ('pnat', NvU8, 502), ('local_port', NvU8, 503), ('peq_cap', NvBool, 504), ('peq_interval_period', NvU16, 506)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLLM_5NM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_SLLM_5NM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS(c.Struct): + SIZE = 496 + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS.register_fields([('prm', NV2080_CTRL_NVLINK_PRM_DATA, 0)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRM_PARAMS(c.Struct): + SIZE = 516 + bWrite: int + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA + ovrd_no_neg_bhvr: int + plane_ind: int + lp_msb: int + pnat: int + local_port: int + no_neg_bhvr: int + wd_logic_re_lock_res: int + module_datapath_full_toggle: int + module_tx_disable: int + host_serdes_feq: int + host_logic_re_lock: int + link_down_timeout: int + draining_timeout: int + wd_module_full_toggle: int + wd_module_tx_disable: int + wd_host_serdes_feq: int + wd_host_logic_re_lock: int +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRM_PARAMS.register_fields([('bWrite', NvBool, 0), ('prm', NV2080_CTRL_NVLINK_PRM_DATA, 1), ('ovrd_no_neg_bhvr', NvU8, 497), ('plane_ind', NvU8, 498), ('lp_msb', NvU8, 499), ('pnat', NvU8, 500), ('local_port', NvU8, 501), ('no_neg_bhvr', NvU8, 502), ('wd_logic_re_lock_res', NvU8, 503), ('module_datapath_full_toggle', NvU8, 504), ('module_tx_disable', NvU8, 505), ('host_serdes_feq', NvU8, 506), ('host_logic_re_lock', NvU8, 507), ('link_down_timeout', NvU16, 508), ('draining_timeout', NvU8, 510), ('wd_module_full_toggle', NvU8, 511), ('wd_module_tx_disable', NvU8, 512), ('wd_host_serdes_feq', NvU8, 513), ('wd_host_logic_re_lock', NvU8, 514)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPRM_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PPRM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME(c.Struct): + SIZE = 64 + name: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME.register_fields([('name', c.Array[NvU8, Literal[64]], 0)]) +NV2080_CTRL_NVLINK_NODE_HOSTNAME: TypeAlias = struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME +@c.record +class struct_NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS(c.Struct): + SIZE = 64 + hostname: struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME +struct_NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS.register_fields([('hostname', NV2080_CTRL_NVLINK_NODE_HOSTNAME, 0)]) +NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS(c.Struct): + SIZE = 64 + hostname: struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME +struct_NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS.register_fields([('hostname', NV2080_CTRL_NVLINK_NODE_HOSTNAME, 0)]) +NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_BOOST_PARAMS(c.Struct): + SIZE = 8 + flags: int + duration: int +struct_NV2080_CTRL_PERF_BOOST_PARAMS.register_fields([('flags', NvU32, 0), ('duration', NvU32, 4)]) +NV2080_CTRL_PERF_BOOST_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_BOOST_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS(c.Struct): + SIZE = 1 + bAcquire: int +struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS.register_fields([('bAcquire', NvBool, 0)]) +NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_PERF_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerStateInfo: struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS.register_fields([('powerStateInfo', NV2080_CTRL_PERF_POWERSTATE_PARAMS, 0)]) +NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS +enum_NV2080_CTRL_PERF_RATED_TDP_CLIENT: dict[int, str] = {(NV2080_CTRL_PERF_RATED_TDP_CLIENT_RM:=0): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_RM', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_WAR_BUG_1785342:=1): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_WAR_BUG_1785342', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_GLOBAL:=2): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_GLOBAL', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_OS:=3): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_OS', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_PROFILE:=4): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_PROFILE', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_NUM_CLIENTS:=5): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_NUM_CLIENTS'} +NV2080_CTRL_PERF_RATED_TDP_CLIENT: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_PERF_RATED_TDP_ACTION: dict[int, str] = {(NV2080_CTRL_PERF_RATED_TDP_ACTION_DEFAULT:=0): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_DEFAULT', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_EXCEED:=1): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_EXCEED', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LIMIT:=2): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LIMIT', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LOCK:=3): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LOCK', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_FLOOR:=4): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_FLOOR'} +NV2080_CTRL_PERF_RATED_TDP_ACTION: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE: dict[int, str] = {(NV2080_CTRL_PERF_VPSTATE_RATED_TDP:=0): 'NV2080_CTRL_PERF_VPSTATE_RATED_TDP', (NV2080_CTRL_PERF_VPSTATE_TURBO_BOOST:=1): 'NV2080_CTRL_PERF_VPSTATE_TURBO_BOOST', (NV2080_CTRL_PERF_VPSTATE_NUM_VPSTATES:=2): 'NV2080_CTRL_PERF_VPSTATE_NUM_VPSTATES'} +NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST(c.Struct): + SIZE = 8 + action: int + vPstateType: int +struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST.register_fields([('action', NV2080_CTRL_PERF_RATED_TDP_ACTION, 0), ('vPstateType', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 4)]) +NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS(c.Struct): + SIZE = 56 + rm: struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm + output: int + outputVPstate: int + inputs: c.Array[ctypes.c_uint32, Literal[5]] + vPstateTypes: c.Array[ctypes.c_uint32, Literal[5]] +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm(c.Struct): + SIZE = 8 + clientActiveMask: int + bRegkeyLimitRatedTdp: int +struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm.register_fields([('clientActiveMask', NvU32, 0), ('bRegkeyLimitRatedTdp', NvU8, 4)]) +struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS.register_fields([('rm', struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm, 0), ('output', NV2080_CTRL_PERF_RATED_TDP_ACTION, 8), ('outputVPstate', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 12), ('inputs', c.Array[NV2080_CTRL_PERF_RATED_TDP_ACTION, Literal[5]], 16), ('vPstateTypes', c.Array[NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, Literal[5]], 36)]) +NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS(c.Struct): + SIZE = 12 + client: int + input: int + vPstateType: int +struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS.register_fields([('client', NV2080_CTRL_PERF_RATED_TDP_CLIENT, 0), ('input', NV2080_CTRL_PERF_RATED_TDP_ACTION, 4), ('vPstateType', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 8)]) +NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +NV2080_CTRL_PERF_RATED_TDP_GET_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +NV2080_CTRL_PERF_RATED_TDP_SET_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE(c.Struct): + SIZE = 128 + util: int + vgpuScale: int + procId: int + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] + pOsPidInfo: int +struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE.register_fields([('util', NvU32, 0), ('vgpuScale', NvU32, 4), ('procId', NvU32, 8), ('subProcessID', NvU32, 12), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 16), ('pOsPidInfo', NvU64, 120)]) +NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE: TypeAlias = struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE +@c.record +class struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE(c.Struct): + SIZE = 776 + base: struct_NV2080_CTRL_GPUMON_SAMPLE + fb: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + gr: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvenc: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvdec: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvjpg: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvofa: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE +struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE.register_fields([('base', NV2080_CTRL_GPUMON_SAMPLE, 0), ('fb', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 8), ('gr', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 136), ('nvenc', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 264), ('nvdec', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 392), ('nvjpg', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 520), ('nvofa', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 648)]) +NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE: TypeAlias = struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_PARAM: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLES +@c.record +class struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS(c.Struct): + SIZE = 55888 + type: int + bufSize: int + count: int + tracker: int + samples: c.Array[struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE, Literal[72]] +struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS.register_fields([('type', NvU8, 0), ('bufSize', NvU32, 4), ('count', NvU32, 8), ('tracker', NvU32, 12), ('samples', c.Array[NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE, Literal[72]], 16)]) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS(c.Struct): + SIZE = 8 + prevPstate: int + action: int +struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS.register_fields([('prevPstate', NvU32, 0), ('action', NvU32, 4)]) +NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS(c.Struct): + SIZE = 24 + bGpuIsIdle: int + bRestoreToMax: int + idleTimeUs: int + busyTimeUs: int +struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS.register_fields([('bGpuIsIdle', NvBool, 0), ('bRestoreToMax', NvBool, 1), ('idleTimeUs', NvU64, 8), ('busyTimeUs', NvU64, 16)]) +NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_CLK_INFO(c.Struct): + SIZE = 24 + flags: int + domain: int + currentFreq: int + defaultFreq: int + minFreq: int + maxFreq: int +struct_NV2080_CTRL_PERF_GET_CLK_INFO.register_fields([('flags', NvU32, 0), ('domain', NvU32, 4), ('currentFreq', NvU32, 8), ('defaultFreq', NvU32, 12), ('minFreq', NvU32, 16), ('maxFreq', NvU32, 20)]) +NV2080_CTRL_PERF_GET_CLK_INFO: TypeAlias = struct_NV2080_CTRL_PERF_GET_CLK_INFO +@c.record +class struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS(c.Struct): + SIZE = 24 + level: int + flags: int + perfGetClkInfoList: ctypes.c_void_p + perfGetClkInfoListSize: int +struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS.register_fields([('level', NvU32, 0), ('flags', NvU32, 4), ('perfGetClkInfoList', NvP64, 8), ('perfGetClkInfoListSize', NvU32, 16)]) +NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS(c.Struct): + SIZE = 780 + level: int + flags: int + perfGetClkInfoList: c.Array[struct_NV2080_CTRL_PERF_GET_CLK_INFO, Literal[32]] + perfGetClkInfoListSize: int +struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS.register_fields([('level', NvU32, 0), ('flags', NvU32, 4), ('perfGetClkInfoList', c.Array[NV2080_CTRL_PERF_GET_CLK_INFO, Literal[32]], 8), ('perfGetClkInfoListSize', NvU32, 776)]) +NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS +enum_NV2080_CTRL_CMD_PERF_VID_ENG: dict[int, str] = {(NV2080_CTRL_CMD_PERF_VID_ENG_NVENC:=1): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVENC', (NV2080_CTRL_CMD_PERF_VID_ENG_NVDEC:=2): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVDEC', (NV2080_CTRL_CMD_PERF_VID_ENG_NVJPG:=3): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVJPG', (NV2080_CTRL_CMD_PERF_VID_ENG_NVOFA:=4): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVOFA'} +NV2080_CTRL_CMD_PERF_VID_ENG: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS(c.Struct): + SIZE = 12 + engineType: int + clkPercentBusy: int + samplingPeriodUs: int +struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS.register_fields([('engineType', NV2080_CTRL_CMD_PERF_VID_ENG, 0), ('clkPercentBusy', NvU32, 4), ('samplingPeriodUs', NvU32, 8)]) +NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerStateInfo: struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS.register_fields([('powerStateInfo', NV2080_CTRL_PERF_POWERSTATE_PARAMS, 0)]) +NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS(c.Struct): + SIZE = 4 + videoEvent: int +struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS.register_fields([('videoEvent', NvU32, 0)]) +NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS +NV2080_CTRL_PERF_PSTATES_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS(c.Struct): + SIZE = 4 + currPstate: int +struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS.register_fields([('currPstate', NvU32, 0)]) +NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS +NV2080_CTRL_CLK_DOMAIN_TEGRA: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS(c.Struct): + SIZE = 8 + clkDomain: int + clkPercentBusy: int +struct_NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS.register_fields([('clkDomain', NV2080_CTRL_CLK_DOMAIN_TEGRA, 0), ('clkPercentBusy', NvU32, 4)]) +NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS +@c.record +class struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS(c.Struct): + SIZE = 8 + moduleId: int + nvswitchSupport: int +struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS.register_fields([('moduleId', NvU32, 0), ('nvswitchSupport', NvU8, 4)]) +NV2080_CTRL_PMGR_MODULE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS +enum_NV2080_CTRL_GC6_FLAVOR_ID: dict[int, str] = {(NV2080_CTRL_GC6_FLAVOR_ID_MSHYBRID:=0): 'NV2080_CTRL_GC6_FLAVOR_ID_MSHYBRID', (NV2080_CTRL_GC6_FLAVOR_ID_OPTIMUS:=1): 'NV2080_CTRL_GC6_FLAVOR_ID_OPTIMUS', (NV2080_CTRL_GC6_FLAVOR_ID_MAX:=4): 'NV2080_CTRL_GC6_FLAVOR_ID_MAX'} +NV2080_CTRL_GC6_FLAVOR_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GC6_ENTRY_PARAMS(c.Struct): + SIZE = 12 + flavorId: int + stepMask: int + params: struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params +@c.record +class struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params(c.Struct): + SIZE = 3 + bIsRTD3Transition: int + bIsRTD3CoreRailPowerCut: int + bSkipPstateSanity: int +struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params.register_fields([('bIsRTD3Transition', NvBool, 0), ('bIsRTD3CoreRailPowerCut', NvBool, 1), ('bSkipPstateSanity', NvBool, 2)]) +struct_NV2080_CTRL_GC6_ENTRY_PARAMS.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('stepMask', NvU32, 4), ('params', struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params, 8)]) +NV2080_CTRL_GC6_ENTRY_PARAMS: TypeAlias = struct_NV2080_CTRL_GC6_ENTRY_PARAMS +@c.record +class struct_NV2080_CTRL_GC6_EXIT_PARAMS(c.Struct): + SIZE = 8 + flavorId: int + params: struct_NV2080_CTRL_GC6_EXIT_PARAMS_params +@c.record +class struct_NV2080_CTRL_GC6_EXIT_PARAMS_params(c.Struct): + SIZE = 3 + bIsGpuSelfWake: int + bIsRTD3Transition: int + bIsRTD3HotTransition: int +struct_NV2080_CTRL_GC6_EXIT_PARAMS_params.register_fields([('bIsGpuSelfWake', NvBool, 0), ('bIsRTD3Transition', NvBool, 1), ('bIsRTD3HotTransition', NvBool, 2)]) +struct_NV2080_CTRL_GC6_EXIT_PARAMS.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('params', struct_NV2080_CTRL_GC6_EXIT_PARAMS_params, 4)]) +NV2080_CTRL_GC6_EXIT_PARAMS: TypeAlias = struct_NV2080_CTRL_GC6_EXIT_PARAMS +enum_NV2080_CTRL_GC6_STEP_ID: dict[int, str] = {(NV2080_CTRL_GC6_STEP_ID_SR_ENTRY:=0): 'NV2080_CTRL_GC6_STEP_ID_SR_ENTRY', (NV2080_CTRL_GC6_STEP_ID_GPU_OFF:=1): 'NV2080_CTRL_GC6_STEP_ID_GPU_OFF', (NV2080_CTRL_GC6_STEP_ID_MAX:=2): 'NV2080_CTRL_GC6_STEP_ID_MAX'} +NV2080_CTRL_GC6_STEP_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GC6_FLAVOR_INFO(c.Struct): + SIZE = 8 + flavorId: int + stepMask: int +struct_NV2080_CTRL_GC6_FLAVOR_INFO.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('stepMask', NvU32, 4)]) +NV2080_CTRL_GC6_FLAVOR_INFO: TypeAlias = struct_NV2080_CTRL_GC6_FLAVOR_INFO +@c.record +class struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS(c.Struct): + SIZE = 32 + hChannel: int + virtAddress: int + bufferPtr: ctypes.c_void_p + bufferSize: int +struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS.register_fields([('hChannel', NvHandle, 0), ('virtAddress', NvU64, 8), ('bufferPtr', NvP64, 16), ('bufferSize', NvU32, 24)]) +NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS(c.Struct): + SIZE = 4 + errorCount: int +struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS.register_fields([('errorCount', NvU32, 0)]) +NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS(c.Struct): + SIZE = 8200 + whichBuffer: int + outputRecordSize: int + recordBuffer: c.Array[ctypes.c_ubyte, Literal[8192]] +struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS.register_fields([('whichBuffer', NvU32, 0), ('outputRecordSize', NvU32, 4), ('recordBuffer', c.Array[NvU8, Literal[8192]], 8)]) +NV2080_CTRL_RC_GET_ERROR_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS(c.Struct): + SIZE = 4 + watchdogStatusFlags: int +struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS.register_fields([('watchdogStatusFlags', NvU32, 0)]) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS(c.Struct): + SIZE = 4 + rcEnable: int +struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS.register_fields([('rcEnable', NvU32, 0)]) +NV2080_CTRL_CMD_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +NV2080_CTRL_SET_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +NV2080_CTRL_GET_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +@c.record +class struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS(c.Struct): + SIZE = 8 + cmd: int + status: int +struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS.register_fields([('cmd', NvU32, 0), ('status', NvS32, 4)]) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_RC_INFO_PARAMS(c.Struct): + SIZE = 8 + rcMode: int + rcBreak: int +struct_NV2080_CTRL_CMD_RC_INFO_PARAMS.register_fields([('rcMode', NvU32, 0), ('rcBreak', NvU32, 4)]) +NV2080_CTRL_CMD_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +NV2080_CTRL_SET_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +NV2080_CTRL_GET_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +@c.record +class struct_RM_GSP_SPDM_CMD_CC_INIT(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_INIT.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_INIT: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_INIT +PRM_GSP_SPDM_CMD_CC_INIT: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_INIT] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_DEINIT(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_DEINIT.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_DEINIT: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_DEINIT +PRM_GSP_SPDM_CMD_CC_DEINIT: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_DEINIT] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_CTRL(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_CTRL.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_CTRL: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_CTRL +PRM_GSP_SPDM_CMD_CC_CTRL: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_CTRL] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA(c.Struct): + SIZE = 68 + cmdType: int + rsvd0: c.Array[ctypes.c_uint32, Literal[2]] + rsvd1: int + rsvd2: c.Array[ctypes.c_char, Literal[9]] + rsvd3: c.Array[ctypes.c_char, Literal[5]] + rsvd4: c.Array[ctypes.c_char, Literal[5]] + rsvd5: c.Array[ctypes.c_char, Literal[5]] + rsvd6: c.Array[ctypes.c_char, Literal[2]] + rsvd7: c.Array[ctypes.c_char, Literal[16]] + rsvd8: c.Array[ctypes.c_uint32, Literal[2]] +struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA.register_fields([('cmdType', NvU8, 0), ('rsvd0', c.Array[NvU32, Literal[2]], 4), ('rsvd1', NvU32, 12), ('rsvd2', c.Array[ctypes.c_char, Literal[9]], 16), ('rsvd3', c.Array[ctypes.c_char, Literal[5]], 25), ('rsvd4', c.Array[ctypes.c_char, Literal[5]], 30), ('rsvd5', c.Array[ctypes.c_char, Literal[5]], 35), ('rsvd6', c.Array[ctypes.c_char, Literal[2]], 40), ('rsvd7', c.Array[ctypes.c_char, Literal[16]], 42), ('rsvd8', c.Array[NvU32, Literal[2]], 60)]) +RM_GSP_SPDM_CMD_CC_INIT_RM_DATA: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA +PRM_GSP_SPDM_CMD_CC_INIT_RM_DATA: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL(c.Struct): + SIZE = 2 + cmdType: int + bEnable: int +struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL.register_fields([('cmdType', NvU8, 0), ('bEnable', NvBool, 1)]) +RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL +PRM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL] +@c.record +class struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST(c.Struct): + SIZE = 160 + cmdType: int + isEnc: int + kmb: struct_CC_KMB + text: c.Array[ctypes.c_ubyte, Literal[16]] + authTag: c.Array[ctypes.c_ubyte, Literal[16]] +@c.record +class struct_CC_KMB(c.Struct): + SIZE = 124 + encryptBundle: struct_CC_AES_CRYPTOBUNDLE + hmacBundle: struct_CC_HMAC_CRYPTOBUNDLE + decryptBundle: struct_CC_AES_CRYPTOBUNDLE + bIsWorkLaunch: int +CC_KMB: TypeAlias = struct_CC_KMB +@c.record +class struct_CC_AES_CRYPTOBUNDLE(c.Struct): + SIZE = 56 + iv: c.Array[ctypes.c_uint32, Literal[3]] + key: c.Array[ctypes.c_uint32, Literal[8]] + ivMask: c.Array[ctypes.c_uint32, Literal[3]] +CC_AES_CRYPTOBUNDLE: TypeAlias = struct_CC_AES_CRYPTOBUNDLE +struct_CC_AES_CRYPTOBUNDLE.register_fields([('iv', c.Array[NvU32, Literal[3]], 0), ('key', c.Array[NvU32, Literal[8]], 12), ('ivMask', c.Array[NvU32, Literal[3]], 44)]) +@c.record +class struct_CC_HMAC_CRYPTOBUNDLE(c.Struct): + SIZE = 64 + nonce: c.Array[ctypes.c_uint32, Literal[8]] + key: c.Array[ctypes.c_uint32, Literal[8]] +CC_HMAC_CRYPTOBUNDLE: TypeAlias = struct_CC_HMAC_CRYPTOBUNDLE +struct_CC_HMAC_CRYPTOBUNDLE.register_fields([('nonce', c.Array[NvU32, Literal[8]], 0), ('key', c.Array[NvU32, Literal[8]], 32)]) +struct_CC_KMB.register_fields([('encryptBundle', CC_AES_CRYPTOBUNDLE, 0), ('hmacBundle', CC_HMAC_CRYPTOBUNDLE, 56), ('decryptBundle', CC_AES_CRYPTOBUNDLE, 56), ('bIsWorkLaunch', NvBool, 120)]) +struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST.register_fields([('cmdType', NvU8, 0), ('isEnc', NvU8, 1), ('kmb', CC_KMB, 4), ('text', c.Array[NvU8, Literal[16]], 128), ('authTag', c.Array[NvU8, Literal[16]], 144)]) +RM_GSP_SPDM_CMD_FIPS_SELFTEST: TypeAlias = struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST +PRM_GSP_SPDM_CMD_FIPS_SELFTEST: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST] +@c.record +class union_RM_GSP_SPDM_CMD(c.Struct): + SIZE = 160 + cmdType: int + ccInit: struct_RM_GSP_SPDM_CMD_CC_INIT + ccDeinit: struct_RM_GSP_SPDM_CMD_CC_DEINIT + ccCtrl: struct_RM_GSP_SPDM_CMD_CC_CTRL + rmDataInitCmd: struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA + ccHeartbeatCtrl: struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL + ccFipsTest: struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST +union_RM_GSP_SPDM_CMD.register_fields([('cmdType', NvU8, 0), ('ccInit', RM_GSP_SPDM_CMD_CC_INIT, 0), ('ccDeinit', RM_GSP_SPDM_CMD_CC_DEINIT, 0), ('ccCtrl', RM_GSP_SPDM_CMD_CC_CTRL, 0), ('rmDataInitCmd', RM_GSP_SPDM_CMD_CC_INIT_RM_DATA, 0), ('ccHeartbeatCtrl', RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL, 0), ('ccFipsTest', RM_GSP_SPDM_CMD_FIPS_SELFTEST, 0)]) +RM_GSP_SPDM_CMD: TypeAlias = union_RM_GSP_SPDM_CMD +PRM_GSP_SPDM_CMD: TypeAlias = c.POINTER[union_RM_GSP_SPDM_CMD] +@c.record +class struct_RM_GSP_SPDM_MSG(c.Struct): + SIZE = 28 + msgType: int + status: int + rsvd1: int + rsvd2: int + rsvd3: int + rsvd4: int + rsvd5: int +struct_RM_GSP_SPDM_MSG.register_fields([('msgType', NvU8, 0), ('status', NvU32, 4), ('rsvd1', NvU32, 8), ('rsvd2', NvU32, 12), ('rsvd3', NvU32, 16), ('rsvd4', NvU32, 20), ('rsvd5', NvU32, 24)]) +RM_GSP_SPDM_MSG: TypeAlias = struct_RM_GSP_SPDM_MSG +PRM_GSP_SPDM_MSG: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_MSG] +@c.record +class struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS(c.Struct): + SIZE = 192 + index: int + cmd: union_RM_GSP_SPDM_CMD + msg: struct_RM_GSP_SPDM_MSG +struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS.register_fields([('index', NvU8, 0), ('cmd', RM_GSP_SPDM_CMD, 4), ('msg', RM_GSP_SPDM_MSG, 164)]) +NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS(c.Struct): + SIZE = 9220 + transcript: c.Array[ctypes.c_ubyte, Literal[9216]] + transcriptSize: int +struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS.register_fields([('transcript', c.Array[NvU8, Literal[9216]], 0), ('transcriptSize', NvU32, 9216)]) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS(c.Struct): + SIZE = 4 + availableTargets: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS.register_fields([('availableTargets', NvU32, 0)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS(c.Struct): + SIZE = 8 + targetIndex: int + type: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS.register_fields([('targetIndex', NvU32, 0), ('type', NvU32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS(c.Struct): + SIZE = 8 + providerIndex: int + type: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS.register_fields([('providerIndex', NvU32, 0), ('type', NvU32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS(c.Struct): + SIZE = 4 + availableSensors: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS.register_fields([('availableSensors', NvU32, 0)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS(c.Struct): + SIZE = 8 + sensorIndex: int + providerIndex: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS.register_fields([('sensorIndex', NvU32, 0), ('providerIndex', NvU32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS(c.Struct): + SIZE = 8 + sensorIndex: int + value: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS.register_fields([('sensorIndex', NvU32, 0), ('value', NvS32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS(c.Struct): + SIZE = 8 + sensorIndex: int + targetIndex: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS.register_fields([('sensorIndex', NvU32, 0), ('targetIndex', NvU32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS(c.Struct): + SIZE = 12 + sensorIndex: int + minimum: int + maximum: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS.register_fields([('sensorIndex', NvU32, 0), ('minimum', NvS32, 4), ('maximum', NvS32, 8)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS +@c.record +class union_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS(c.Struct): + SIZE = 32 + getInfoTargetsAvailable: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS + getInfoTargetType: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS + getInfoProviderType: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS + getInfoSensorsAvailable: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS + getInfoSensorProvider: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS + getInfoSensorTarget: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS + getInfoSensorReadingRange: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS + getStatusSensorReading: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS + space: c.Array[ctypes.c_uint32, Literal[8]] +union_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS.register_fields([('getInfoTargetsAvailable', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS, 0), ('getInfoTargetType', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS, 0), ('getInfoProviderType', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS, 0), ('getInfoSensorsAvailable', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS, 0), ('getInfoSensorProvider', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS, 0), ('getInfoSensorTarget', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS, 0), ('getInfoSensorReadingRange', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS, 0), ('getStatusSensorReading', NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS, 0), ('space', c.Array[NvU32, Literal[8]], 0)]) +NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS: TypeAlias = union_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION(c.Struct): + SIZE = 44 + result: int + executed: int + opcode: int + operands: union_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS +struct_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION.register_fields([('result', NvU32, 0), ('executed', NvU32, 4), ('opcode', NvU32, 8), ('operands', NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS, 12)]) +NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS(c.Struct): + SIZE = 1432 + clientAPIVersion: int + clientAPIRevision: int + clientInstructionSizeOf: int + executeFlags: int + successfulInstructions: int + instructionListSize: int + instructionList: c.Array[struct_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION, Literal[32]] +struct_NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS.register_fields([('clientAPIVersion', NvU32, 0), ('clientAPIRevision', NvU32, 4), ('clientInstructionSizeOf', NvU32, 8), ('executeFlags', NvU32, 12), ('successfulInstructions', NvU32, 16), ('instructionListSize', NvU32, 20), ('instructionList', c.Array[NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION, Literal[32]], 24)]) +NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS(c.Struct): + SIZE = 16 + time_nsec: int + flags: int +struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS.register_fields([('time_nsec', NvU64, 0), ('flags', NvU32, 8)]) +NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS(c.Struct): + SIZE = 8 + time_nsec: int +struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS.register_fields([('time_nsec', NvU64, 0)]) +NV2080_CTRL_TIMER_GET_TIME_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS(c.Struct): + SIZE = 4 + tmr_offset: int +struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS.register_fields([('tmr_offset', NvU32, 0)]) +NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE(c.Struct): + SIZE = 16 + cpuTime: int + gpuTime: int +struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE.register_fields([('cpuTime', NvU64, 0), ('gpuTime', NvU64, 8)]) +NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE: TypeAlias = struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE +@c.record +class struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS(c.Struct): + SIZE = 264 + cpuClkId: int + sampleCount: int + samples: c.Array[struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE, Literal[16]] +struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS.register_fields([('cpuClkId', NvU8, 0), ('sampleCount', NvU8, 1), ('samples', c.Array[NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE, Literal[16]], 8)]) +NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS(c.Struct): + SIZE = 1 + bSetMaxFreq: int +struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS.register_fields([('bSetMaxFreq', NvBool, 0)]) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS.register_fields([('action', NvU32, 0)]) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS.register_fields([('action', NvU32, 0)]) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS(c.Struct): + SIZE = 1 + bEnter: int +struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS.register_fields([('bEnter', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS(c.Struct): + SIZE = 24 + hNotifierResource: int + notifyDataSize: int + hNotifyDataMemory: int + perfmonIdCount: int + snapshotBufferSize: int + hSnapshotMemory: int +struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS.register_fields([('hNotifierResource', NvHandle, 0), ('notifyDataSize', NvU32, 4), ('hNotifyDataMemory', NvHandle, 8), ('perfmonIdCount', NvU32, 12), ('snapshotBufferSize', NvU32, 16), ('hSnapshotMemory', NvHandle, 20)]) +NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS(c.Struct): + SIZE = 1 + bVidmemPersistent: int +struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS.register_fields([('bVidmemPersistent', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS(c.Struct): + SIZE = 1 + bUpdateTGP: int +struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS.register_fields([('bUpdateTGP', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS(c.Struct): + SIZE = 6616 + dbdf: int + gfid: int + vgpuType: int + vmPid: int + swizzId: int + numChannels: int + numPluginChannels: int + chidOffset: c.Array[ctypes.c_uint32, Literal[84]] + bDisableDefaultSmcExecPartRestore: int + numGuestFbSegments: int + guestFbPhysAddrList: c.Array[ctypes.c_uint64, Literal[384]] + guestFbLengthList: c.Array[ctypes.c_uint64, Literal[384]] + pluginHeapMemoryPhysAddr: int + pluginHeapMemoryLength: int + ctrlBuffOffset: int + initTaskLogBuffOffset: int + initTaskLogBuffSize: int + vgpuTaskLogBuffOffset: int + vgpuTaskLogBuffSize: int + kernelLogBuffOffset: int + kernelLogBuffSize: int + migRmHeapMemoryPhysAddr: int + migRmHeapMemoryLength: int + bDeviceProfilingEnabled: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS.register_fields([('dbdf', NvU32, 0), ('gfid', NvU32, 4), ('vgpuType', NvU32, 8), ('vmPid', NvU32, 12), ('swizzId', NvU32, 16), ('numChannels', NvU32, 20), ('numPluginChannels', NvU32, 24), ('chidOffset', c.Array[NvU32, Literal[84]], 28), ('bDisableDefaultSmcExecPartRestore', NvBool, 364), ('numGuestFbSegments', NvU32, 368), ('guestFbPhysAddrList', c.Array[NvU64, Literal[384]], 376), ('guestFbLengthList', c.Array[NvU64, Literal[384]], 3448), ('pluginHeapMemoryPhysAddr', NvU64, 6520), ('pluginHeapMemoryLength', NvU64, 6528), ('ctrlBuffOffset', NvU64, 6536), ('initTaskLogBuffOffset', NvU64, 6544), ('initTaskLogBuffSize', NvU64, 6552), ('vgpuTaskLogBuffOffset', NvU64, 6560), ('vgpuTaskLogBuffSize', NvU64, 6568), ('kernelLogBuffOffset', NvU64, 6576), ('kernelLogBuffSize', NvU64, 6584), ('migRmHeapMemoryPhysAddr', NvU64, 6592), ('migRmHeapMemoryLength', NvU64, 6600), ('bDeviceProfilingEnabled', NvBool, 6608)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS(c.Struct): + SIZE = 694280 + discardVgpuTypes: int + vgpuInfoCount: int + vgpuInfo: c.Array[struct_NVA081_CTRL_VGPU_INFO, Literal[128]] +@c.record +class struct_NVA081_CTRL_VGPU_INFO(c.Struct): + SIZE = 5424 + vgpuType: int + vgpuName: c.Array[ctypes.c_ubyte, Literal[64]] + vgpuClass: c.Array[ctypes.c_ubyte, Literal[64]] + vgpuSignature: c.Array[ctypes.c_ubyte, Literal[128]] + license: c.Array[ctypes.c_ubyte, Literal[128]] + maxInstance: int + numHeads: int + maxResolutionX: int + maxResolutionY: int + maxPixels: int + frlConfig: int + cudaEnabled: int + eccSupported: int + gpuInstanceSize: int + multiVgpuSupported: int + vdevId: int + pdevId: int + profileSize: int + fbLength: int + gspHeapSize: int + fbReservation: int + mappableVideoSize: int + encoderCapacity: int + bar1Length: int + frlEnable: int + vgpuSsvid: int + adapterName: c.Array[ctypes.c_ubyte, Literal[64]] + adapterName_Unicode: c.Array[ctypes.c_uint16, Literal[64]] + shortGpuNameString: c.Array[ctypes.c_ubyte, Literal[64]] + licensedProductName: c.Array[ctypes.c_ubyte, Literal[128]] + vgpuExtraParams: c.Array[ctypes.c_uint32, Literal[1024]] + ftraceEnable: int + gpuDirectSupported: int + nvlinkP2PSupported: int + maxInstancePerGI: int + multiVgpuExclusive: int + exclusiveType: int + exclusiveSize: int + gpuInstanceProfileId: int + placementSize: int + homogeneousPlacementCount: int + homogeneousPlacementIds: c.Array[ctypes.c_uint32, Literal[48]] + heterogeneousPlacementCount: int + heterogeneousPlacementIds: c.Array[ctypes.c_uint32, Literal[48]] +NVA081_CTRL_VGPU_INFO: TypeAlias = struct_NVA081_CTRL_VGPU_INFO +struct_NVA081_CTRL_VGPU_INFO.register_fields([('vgpuType', NvU32, 0), ('vgpuName', c.Array[NvU8, Literal[64]], 4), ('vgpuClass', c.Array[NvU8, Literal[64]], 68), ('vgpuSignature', c.Array[NvU8, Literal[128]], 132), ('license', c.Array[NvU8, Literal[128]], 260), ('maxInstance', NvU32, 388), ('numHeads', NvU32, 392), ('maxResolutionX', NvU32, 396), ('maxResolutionY', NvU32, 400), ('maxPixels', NvU32, 404), ('frlConfig', NvU32, 408), ('cudaEnabled', NvU32, 412), ('eccSupported', NvU32, 416), ('gpuInstanceSize', NvU32, 420), ('multiVgpuSupported', NvU32, 424), ('vdevId', NvU64, 432), ('pdevId', NvU64, 440), ('profileSize', NvU64, 448), ('fbLength', NvU64, 456), ('gspHeapSize', NvU64, 464), ('fbReservation', NvU64, 472), ('mappableVideoSize', NvU64, 480), ('encoderCapacity', NvU32, 488), ('bar1Length', NvU64, 496), ('frlEnable', NvU32, 504), ('vgpuSsvid', NvU16, 508), ('adapterName', c.Array[NvU8, Literal[64]], 510), ('adapterName_Unicode', c.Array[NvU16, Literal[64]], 574), ('shortGpuNameString', c.Array[NvU8, Literal[64]], 702), ('licensedProductName', c.Array[NvU8, Literal[128]], 766), ('vgpuExtraParams', c.Array[NvU32, Literal[1024]], 896), ('ftraceEnable', NvU32, 4992), ('gpuDirectSupported', NvU32, 4996), ('nvlinkP2PSupported', NvU32, 5000), ('maxInstancePerGI', NvU32, 5004), ('multiVgpuExclusive', NvU32, 5008), ('exclusiveType', NvU32, 5012), ('exclusiveSize', NvU32, 5016), ('gpuInstanceProfileId', NvU32, 5020), ('placementSize', NvU32, 5024), ('homogeneousPlacementCount', NvU32, 5028), ('homogeneousPlacementIds', c.Array[NvU32, Literal[48]], 5032), ('heterogeneousPlacementCount', NvU32, 5224), ('heterogeneousPlacementIds', c.Array[NvU32, Literal[48]], 5228)]) +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS.register_fields([('discardVgpuTypes', NvBool, 0), ('vgpuInfoCount', NvU32, 4), ('vgpuInfo', c.Array[NVA081_CTRL_VGPU_INFO, Literal[128]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS +@c.record +class struct_NV2080_GUEST_VM_INFO(c.Struct): + SIZE = 168 + vmPid: int + guestOs: int + migrationProhibited: int + guestNegotiatedVgpuVersion: int + frameRateLimit: int + licensed: int + licenseState: int + licenseExpiryTimestamp: int + licenseExpiryStatus: int + guestDriverVersion: c.Array[ctypes.c_ubyte, Literal[64]] + guestDriverBranch: c.Array[ctypes.c_ubyte, Literal[64]] + guestVmInfoState: int +enum_GUEST_VM_INFO_STATE: dict[int, str] = {(GUEST_VM_INFO_STATE_UNINITIALIZED:=0): 'GUEST_VM_INFO_STATE_UNINITIALIZED', (GUEST_VM_INFO_STATE_INITIALIZED:=1): 'GUEST_VM_INFO_STATE_INITIALIZED'} +GUEST_VM_INFO_STATE: TypeAlias = ctypes.c_uint32 +struct_NV2080_GUEST_VM_INFO.register_fields([('vmPid', NvU32, 0), ('guestOs', NvU32, 4), ('migrationProhibited', NvU32, 8), ('guestNegotiatedVgpuVersion', NvU32, 12), ('frameRateLimit', NvU32, 16), ('licensed', NvBool, 20), ('licenseState', NvU32, 24), ('licenseExpiryTimestamp', NvU32, 28), ('licenseExpiryStatus', NvU8, 32), ('guestDriverVersion', c.Array[NvU8, Literal[64]], 33), ('guestDriverBranch', c.Array[NvU8, Literal[64]], 97), ('guestVmInfoState', GUEST_VM_INFO_STATE, 164)]) +NV2080_GUEST_VM_INFO: TypeAlias = struct_NV2080_GUEST_VM_INFO +@c.record +class struct_NV2080_HOST_VGPU_DEVICE(c.Struct): + SIZE = 48 + gfid: int + vgpuPciId: int + vgpuDeviceInstanceId: int + accountingPid: int + fbUsed: int + encoderCapacity: int + eccState: int + bDriverLoaded: int +struct_NV2080_HOST_VGPU_DEVICE.register_fields([('gfid', NvU32, 0), ('vgpuPciId', NvU64, 8), ('vgpuDeviceInstanceId', NvU32, 16), ('accountingPid', NvU32, 20), ('fbUsed', NvU64, 24), ('encoderCapacity', NvU32, 32), ('eccState', NvU32, 36), ('bDriverLoaded', NvBool, 40)]) +NV2080_HOST_VGPU_DEVICE: TypeAlias = struct_NV2080_HOST_VGPU_DEVICE +@c.record +class struct_NV2080_VGPU_GUEST(c.Struct): + SIZE = 216 + guestVmInfo: struct_NV2080_GUEST_VM_INFO + vgpuDevice: struct_NV2080_HOST_VGPU_DEVICE +struct_NV2080_VGPU_GUEST.register_fields([('guestVmInfo', NV2080_GUEST_VM_INFO, 0), ('vgpuDevice', NV2080_HOST_VGPU_DEVICE, 168)]) +NV2080_VGPU_GUEST: TypeAlias = struct_NV2080_VGPU_GUEST +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS(c.Struct): + SIZE = 10376 + numVgpu: int + vgpuGuest: c.Array[struct_NV2080_VGPU_GUEST, Literal[48]] +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS.register_fields([('numVgpu', NvU32, 0), ('vgpuGuest', c.Array[NV2080_VGPU_GUEST, Literal[48]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS +@c.record +class struct_NV2080_VGPU_FB_USAGE(c.Struct): + SIZE = 16 + gfid: int + fbUsed: int +struct_NV2080_VGPU_FB_USAGE.register_fields([('gfid', NvU32, 0), ('fbUsed', NvU64, 8)]) +NV2080_VGPU_FB_USAGE: TypeAlias = struct_NV2080_VGPU_FB_USAGE +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS(c.Struct): + SIZE = 776 + vgpuCount: int + vgpuFbUsage: c.Array[struct_NV2080_VGPU_FB_USAGE, Literal[48]] +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS.register_fields([('vgpuCount', NvU32, 0), ('vgpuFbUsage', c.Array[NV2080_VGPU_FB_USAGE, Literal[48]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS(c.Struct): + SIZE = 8 + gfid: int + encoderCapacity: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS.register_fields([('gfid', NvU32, 0), ('encoderCapacity', NvU32, 4)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS(c.Struct): + SIZE = 260 + pgpuString: c.Array[ctypes.c_ubyte, Literal[256]] + pgpuStringSize: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS.register_fields([('pgpuString', c.Array[NvU8, Literal[256]], 0), ('pgpuStringSize', NvU32, 256)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS(c.Struct): + SIZE = 1 + bIsMigrationSupported: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS.register_fields([('bIsMigrationSupported', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bSupportHeterogeneousTimeSlicedVgpuTypes: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS.register_fields([('bSupportHeterogeneousTimeSlicedVgpuTypes', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS(c.Struct): + SIZE = 8 + gfid: int + flags: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS.register_fields([('gfid', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS(c.Struct): + SIZE = 1 + bFlrDisabled: int +struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS.register_fields([('bFlrDisabled', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 1 + bHeterogeneousMode: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS(c.Struct): + SIZE = 1 + bMigTimeslicingModeEnabled: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS.register_fields([('bMigTimeslicingModeEnabled', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS(c.Struct): + SIZE = 4 + state: int +struct_NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS.register_fields([('state', NvU32, 0)]) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS(c.Struct): + SIZE = 4 + exceptionMask: int +struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS.register_fields([('exceptionMask', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS +@c.record +class struct_NV83DE_SM_ERROR_STATE_REGISTERS(c.Struct): + SIZE = 48 + hwwGlobalEsr: int + hwwWarpEsr: int + hwwWarpEsrPc: int + hwwGlobalEsrReportMask: int + hwwWarpEsrReportMask: int + hwwEsrAddr: int + hwwWarpEsrPc64: int + hwwCgaEsr: int + hwwCgaEsrReportMask: int +struct_NV83DE_SM_ERROR_STATE_REGISTERS.register_fields([('hwwGlobalEsr', NvU32, 0), ('hwwWarpEsr', NvU32, 4), ('hwwWarpEsrPc', NvU32, 8), ('hwwGlobalEsrReportMask', NvU32, 12), ('hwwWarpEsrReportMask', NvU32, 16), ('hwwEsrAddr', NvU64, 24), ('hwwWarpEsrPc64', NvU64, 32), ('hwwCgaEsr', NvU32, 40), ('hwwCgaEsrReportMask', NvU32, 44)]) +NV83DE_SM_ERROR_STATE_REGISTERS: TypeAlias = struct_NV83DE_SM_ERROR_STATE_REGISTERS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS(c.Struct): + SIZE = 56 + hTargetChannel: int + smID: int + smErrorState: struct_NV83DE_SM_ERROR_STATE_REGISTERS +struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('smID', NvU32, 4), ('smErrorState', NV83DE_SM_ERROR_STATE_REGISTERS, 8)]) +NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS +@c.record +class struct_NV83DE_MMU_FAULT_INFO(c.Struct): + SIZE = 8 + valid: int + faultInfo: int +struct_NV83DE_MMU_FAULT_INFO.register_fields([('valid', NvBool, 0), ('faultInfo', NvU32, 4)]) +NV83DE_MMU_FAULT_INFO: TypeAlias = struct_NV83DE_MMU_FAULT_INFO +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS(c.Struct): + SIZE = 4824 + hTargetChannel: int + numSMsToRead: int + smErrorStateArray: c.Array[struct_NV83DE_SM_ERROR_STATE_REGISTERS, Literal[100]] + mmuFaultInfo: int + mmuFault: struct_NV83DE_MMU_FAULT_INFO + startingSM: int +struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('numSMsToRead', NvU32, 4), ('smErrorStateArray', c.Array[NV83DE_SM_ERROR_STATE_REGISTERS, Literal[100]], 8), ('mmuFaultInfo', NvU32, 4808), ('mmuFault', NV83DE_MMU_FAULT_INFO, 4812), ('startingSM', NvU32, 4820)]) +NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS(c.Struct): + SIZE = 8 + hTargetChannel: int + smID: int +struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('smID', NvU32, 4)]) +NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS(c.Struct): + SIZE = 8 + hTargetChannel: int + numSMsToClear: int +struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('numSMsToClear', NvU32, 4)]) +NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS +@c.record +class struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS(c.Struct): + SIZE = 8 + waitForEvent: int + hResidentChannel: int +struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS.register_fields([('waitForEvent', NvU32, 0), ('hResidentChannel', NvHandle, 4)]) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS: TypeAlias = struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS(c.Struct): + SIZE = 4 + stopTriggerType: int +struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS.register_fields([('stopTriggerType', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS(c.Struct): + SIZE = 4 + singleStepHandling: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS.register_fields([('singleStepHandling', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS(c.Struct): + SIZE = 24 + hMemory: int + length: int + offset: int + buffer: ctypes.c_void_p +struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS.register_fields([('hMemory', NvU32, 0), ('length', NvU32, 4), ('offset', NvU64, 8), ('buffer', NvP64, 16)]) +NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS(c.Struct): + SIZE = 24 + hMemory: int + length: int + offset: int + buffer: ctypes.c_void_p +struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS.register_fields([('hMemory', NvU32, 0), ('length', NvU32, 4), ('offset', NvU64, 8), ('buffer', NvP64, 16)]) +NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS: TypeAlias = struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS(c.Struct): + SIZE = 8 + hChannel: int + hSubdevice: int +struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('hSubdevice', NvHandle, 4)]) +NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_OP(c.Struct): + SIZE = 24 + gpuVA: int + pCpuVA: ctypes.c_void_p + size: int + valid: int +struct_NV83DE_CTRL_DEBUG_ACCESS_OP.register_fields([('gpuVA', NvU64, 0), ('pCpuVA', NvP64, 8), ('size', NvU32, 16), ('valid', NvU32, 20)]) +NV83DE_CTRL_DEBUG_ACCESS_OP: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_OP +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS(c.Struct): + SIZE = 1544 + count: int + opsBuffer: c.Array[struct_NV83DE_CTRL_DEBUG_ACCESS_OP, Literal[64]] +struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS.register_fields([('count', NvU32, 0), ('opsBuffer', c.Array[NV83DE_CTRL_DEBUG_ACCESS_OP, Literal[64]], 8)]) +NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP(c.Struct): + SIZE = 16 + gpuVA: int + size: int +struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP.register_fields([('gpuVA', NvU64, 0), ('size', NvU32, 8)]) +NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS(c.Struct): + SIZE = 1048 + vaLo: int + vaHi: int + count: int + hasMore: int + opsBuffer: c.Array[struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP, Literal[64]] +struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS.register_fields([('vaLo', NvU64, 0), ('vaHi', NvU64, 8), ('count', NvU32, 16), ('hasMore', NvU32, 20), ('opsBuffer', c.Array[NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP, Literal[64]], 24)]) +NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS +@c.record +class struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 3208 + bNonTransactional: int + regOpCount: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[100]] +struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS.register_fields([('bNonTransactional', NvBool, 0), ('regOpCount', NvU32, 4), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[100]], 8)]) +NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS(c.Struct): + SIZE = 8 + smID: int + bSingleStep: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS.register_fields([('smID', NvU32, 0), ('bSingleStep', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS(c.Struct): + SIZE = 8 + smID: int + bStopTrigger: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS.register_fields([('smID', NvU32, 0), ('bStopTrigger', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS(c.Struct): + SIZE = 8 + smID: int + bRunTrigger: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS.register_fields([('smID', NvU32, 0), ('bRunTrigger', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS(c.Struct): + SIZE = 8 + smID: int + bSkipIdleWarpDetect: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS.register_fields([('smID', NvU32, 0), ('bSkipIdleWarpDetect', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS(c.Struct): + SIZE = 5 + bInTrapMode: int + bCrsFlushDone: int + bRunTriggerInProgress: int + bComputeContext: int + bLockedDown: int +struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS.register_fields([('bInTrapMode', NvBool, 0), ('bCrsFlushDone', NvBool, 1), ('bRunTriggerInProgress', NvBool, 2), ('bComputeContext', NvBool, 3), ('bLockedDown', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS(c.Struct): + SIZE = 12 + smID: int + smDebuggerStatus: struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS +struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS.register_fields([('smID', NvU32, 0), ('smDebuggerStatus', NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS, 4)]) +NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY(c.Struct): + SIZE = 24 + hMemory: int + length: int + memOffset: int + dataOffset: int + status: int +struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY.register_fields([('hMemory', NvHandle, 0), ('length', NvU32, 4), ('memOffset', NvU64, 8), ('dataOffset', NvU32, 16), ('status', NV_STATUS, 20)]) +NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS(c.Struct): + SIZE = 3616 + pData: ctypes.c_void_p + dataLength: int + count: int + entries: c.Array[struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY, Literal[150]] +struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS.register_fields([('pData', NvP64, 0), ('dataLength', NvU32, 8), ('count', NvU32, 12), ('entries', c.Array[NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY, Literal[150]], 16)]) +NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY(c.Struct): + SIZE = 16 + faultAddress: int + faultType: int + accessType: int +struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY.register_fields([('faultAddress', NvU64, 0), ('faultType', NvU32, 8), ('accessType', NvU32, 12)]) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS(c.Struct): + SIZE = 72 + mmuFaultInfoList: c.Array[struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY, Literal[4]] + count: int +struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS.register_fields([('mmuFaultInfoList', c.Array[NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY, Literal[4]], 0), ('count', NvU32, 64)]) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS(c.Struct): + SIZE = 1 + bDropDeferredRc: int +struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS.register_fields([('bDropDeferredRc', NvBool, 0)]) +NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS +@c.record +class struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS(c.Struct): + SIZE = 56 + params: struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS(c.Struct): + SIZE = 56 + hMemPmaBuffer: int + pmaBufferOffset: int + pmaBufferSize: int + hMemPmaBytesAvailable: int + pmaBytesAvailableOffset: int + ctxsw: int + pmaChannelIdx: int + pmaBufferVA: int +NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS +struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS.register_fields([('hMemPmaBuffer', NvHandle, 0), ('pmaBufferOffset', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('hMemPmaBytesAvailable', NvHandle, 24), ('pmaBytesAvailableOffset', NvU64, 32), ('ctxsw', NvBool, 40), ('pmaChannelIdx', NvU32, 44), ('pmaBufferVA', NvU64, 48)]) +struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS.register_fields([('params', NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS, 0)]) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS: TypeAlias = struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS(c.Struct): + SIZE = 8 + pmaChannelIdx: int + bMembytesPollingRequired: int +struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0), ('bMembytesPollingRequired', NvBool, 4)]) +NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 48 + pmaChannelIdx: int + pmaBufferVA: int + pmaBufferSize: int + membytesVA: int + hwpmIBPA: int + hwpmIBAperture: int +struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0), ('pmaBufferVA', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('membytesVA', NvU64, 24), ('hwpmIBPA', NvU64, 32), ('hwpmIBAperture', NvU8, 40)]) +NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS(c.Struct): + SIZE = 5 + bAdminProfilingPermitted: int + bDevProfilingPermitted: int + bCtxProfilingPermitted: int + bVideoMemoryProfilingPermitted: int + bSysMemoryProfilingPermitted: int +struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS.register_fields([('bAdminProfilingPermitted', NvBool, 0), ('bDevProfilingPermitted', NvBool, 1), ('bCtxProfilingPermitted', NvBool, 2), ('bVideoMemoryProfilingPermitted', NvBool, 3), ('bSysMemoryProfilingPermitted', NvBool, 4)]) +NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS(c.Struct): + SIZE = 64 + hMemPmaBuffer: int + pmaBufferOffset: int + pmaBufferSize: int + hMemPmaBytesAvailable: int + pmaBytesAvailableOffset: int + ctxsw: int + pmaChannelIdx: int + pmaBufferVA: int + bInputPmaChIdx: int +struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS.register_fields([('hMemPmaBuffer', NvHandle, 0), ('pmaBufferOffset', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('hMemPmaBytesAvailable', NvHandle, 24), ('pmaBytesAvailableOffset', NvU64, 32), ('ctxsw', NvBool, 40), ('pmaChannelIdx', NvU32, 44), ('pmaBufferVA', NvU64, 48), ('bInputPmaChIdx', NvBool, 56)]) +NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 4 + pmaChannelIdx: int +struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0)]) +NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS(c.Struct): + SIZE = 4 + maxPmaChannels: int +struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS.register_fields([('maxPmaChannels', NvU32, 0)]) +NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS +@c.record +class struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS(c.Struct): + SIZE = 12 + globalStatus: int + controlMask: int + statusMask: int +struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS.register_fields([('globalStatus', NvU32, 0), ('controlMask', NvU32, 4), ('statusMask', NvU32, 8)]) +NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS +@c.record +class struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS(c.Struct): + SIZE = 4 + controlMask: int +struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS.register_fields([('controlMask', NvU32, 0)]) +NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS +@c.record +class struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 4 + pmaChannelIdx: int +struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0)]) +NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS(c.Struct): + SIZE = 48 + bytesConsumed: int + bUpdateAvailableBytes: int + bWait: int + bytesAvailable: int + bReturnPut: int + putPtr: int + pmaChannelIdx: int + bOverflowStatus: int +struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS.register_fields([('bytesConsumed', NvU64, 0), ('bUpdateAvailableBytes', NvBool, 8), ('bWait', NvBool, 9), ('bytesAvailable', NvU64, 16), ('bReturnPut', NvBool, 24), ('putPtr', NvU64, 32), ('pmaChannelIdx', NvU32, 40), ('bOverflowStatus', NvBool, 44)]) +NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS +NVB0CC_GPU_REG_OP: TypeAlias = struct_NV2080_CTRL_GPU_REG_OP +enum_NVB0CC_REGOPS_MODE: dict[int, str] = {(NVB0CC_REGOPS_MODE_ALL_OR_NONE:=0): 'NVB0CC_REGOPS_MODE_ALL_OR_NONE', (NVB0CC_REGOPS_MODE_CONTINUE_ON_ERROR:=1): 'NVB0CC_REGOPS_MODE_CONTINUE_ON_ERROR'} +NVB0CC_REGOPS_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 3980 + regOpCount: int + mode: int + bPassed: int + bDirect: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[124]] +struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS.register_fields([('regOpCount', NvU32, 0), ('mode', NVB0CC_REGOPS_MODE, 4), ('bPassed', NvBool, 8), ('bDirect', NvBool, 9), ('regOps', c.Array[NVB0CC_GPU_REG_OP, Literal[124]], 12)]) +NVB0CC_CTRL_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS +@c.record +class struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS(c.Struct): + SIZE = 4 + numCredits: int +struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS.register_fields([('numCredits', NvU32, 0)]) +NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS +enum_NVB0CC_CHIPLET_TYPE: dict[int, str] = {(NVB0CC_CHIPLET_TYPE_INVALID:=0): 'NVB0CC_CHIPLET_TYPE_INVALID', (NVB0CC_CHIPLET_TYPE_FBP:=1): 'NVB0CC_CHIPLET_TYPE_FBP', (NVB0CC_CHIPLET_TYPE_GPC:=2): 'NVB0CC_CHIPLET_TYPE_GPC', (NVB0CC_CHIPLET_TYPE_SYS:=3): 'NVB0CC_CHIPLET_TYPE_SYS'} +NVB0CC_CHIPLET_TYPE: TypeAlias = ctypes.c_uint32 +enum_NVB0CC_HS_CREDITS_CMD_STATUS: dict[int, str] = {(NVB0CC_HS_CREDITS_CMD_STATUS_OK:=0): 'NVB0CC_HS_CREDITS_CMD_STATUS_OK', (NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CREDITS:=1): 'NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CREDITS', (NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CHIPLET:=2): 'NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CHIPLET'} +NVB0CC_HS_CREDITS_CMD_STATUS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO(c.Struct): + SIZE = 4 + chipletType: int + chipletIndex: int + numCredits: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO.register_fields([('chipletType', NvU8, 0), ('chipletIndex', NvU8, 1), ('numCredits', NvU16, 2)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS(c.Struct): + SIZE = 2 + status: int + entryIndex: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS.register_fields([('status', NvU8, 0), ('entryIndex', NvU8, 1)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS +@c.record +class struct_NVB0CC_CTRL_HS_CREDITS_PARAMS(c.Struct): + SIZE = 256 + pmaChannelIdx: int + numEntries: int + statusInfo: struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS + creditInfo: c.Array[struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO, Literal[63]] +struct_NVB0CC_CTRL_HS_CREDITS_PARAMS.register_fields([('pmaChannelIdx', NvU8, 0), ('numEntries', NvU8, 1), ('statusInfo', NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS, 2), ('creditInfo', c.Array[NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO, Literal[63]], 4)]) +NVB0CC_CTRL_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +NVB0CC_CTRL_SET_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +NVB0CC_CTRL_GET_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +enum_NVB0CC_CTRL_HES_TYPE: dict[int, str] = {(NVB0CC_CTRL_HES_INVALID:=0): 'NVB0CC_CTRL_HES_INVALID', (NVB0CC_CTRL_HES_CWD:=1): 'NVB0CC_CTRL_HES_CWD'} +NVB0CC_CTRL_HES_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS +@c.record +class union_NVB0CC_CTRL_HES_RESERVATION_UNION(c.Struct): + SIZE = 1 + cwd: struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS +union_NVB0CC_CTRL_HES_RESERVATION_UNION.register_fields([('cwd', NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS, 0)]) +NVB0CC_CTRL_HES_RESERVATION_UNION: TypeAlias = union_NVB0CC_CTRL_HES_RESERVATION_UNION +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_PARAMS(c.Struct): + SIZE = 8 + type: int + reserveParams: union_NVB0CC_CTRL_HES_RESERVATION_UNION +struct_NVB0CC_CTRL_RESERVE_HES_PARAMS.register_fields([('type', NvU32, 0), ('reserveParams', NVB0CC_CTRL_HES_RESERVATION_UNION, 4)]) +NVB0CC_CTRL_RESERVE_HES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_PARAMS +@c.record +class struct_NVB0CC_CTRL_RELEASE_HES_PARAMS(c.Struct): + SIZE = 4 + type: int +struct_NVB0CC_CTRL_RELEASE_HES_PARAMS.register_fields([('type', NVB0CC_CTRL_HES_TYPE, 0)]) +NVB0CC_CTRL_RELEASE_HES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RELEASE_HES_PARAMS +@c.record +class struct_NVB0CC_CTRL_CREDIT_POOL_INFO(c.Struct): + SIZE = 4 + numCredits: int + poolIndex: int + chipletType: int +struct_NVB0CC_CTRL_CREDIT_POOL_INFO.register_fields([('numCredits', NvU16, 0), ('poolIndex', NvU8, 2), ('chipletType', NvU8, 3)]) +NVB0CC_CTRL_CREDIT_POOL_INFO: TypeAlias = struct_NVB0CC_CTRL_CREDIT_POOL_INFO +@c.record +class struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL(c.Struct): + SIZE = 124 + poolInfos: c.Array[struct_NVB0CC_CTRL_CREDIT_POOL_INFO, Literal[30]] + poolInfosCount: int +struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL.register_fields([('poolInfos', c.Array[NVB0CC_CTRL_CREDIT_POOL_INFO, Literal[30]], 0), ('poolInfosCount', NvU32, 120)]) +NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL: TypeAlias = struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO(c.Struct): + SIZE = 3 + chipletType: int + chipletIndex: int + poolIndex: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO.register_fields([('chipletType', NvU8, 0), ('chipletIndex', NvU8, 1), ('poolIndex', NvU8, 2)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO +@c.record +class struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS(c.Struct): + SIZE = 194 + numQueries: int + statusInfo: struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS + queries: c.Array[struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO, Literal[63]] +struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS.register_fields([('numQueries', NvU16, 0), ('statusInfo', NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS, 2), ('queries', c.Array[NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO, Literal[63]], 4)]) +NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS +@c.record +class struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS(c.Struct): + SIZE = 1 + disable: int +struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS.register_fields([('disable', NvBool, 0)]) +NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS: TypeAlias = struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS +@c.record +class struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS(c.Struct): + SIZE = 1 + enabled: int +struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS.register_fields([('enabled', NvBool, 0)]) +NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS +nv_status_codes: dict[int, str] = {(NV_OK:=0): 'NV_OK', (NV_ERR_GENERIC:=65535): 'NV_ERR_GENERIC', (NV_ERR_BROKEN_FB:=1): 'NV_ERR_BROKEN_FB', (NV_ERR_BUFFER_TOO_SMALL:=2): 'NV_ERR_BUFFER_TOO_SMALL', (NV_ERR_BUSY_RETRY:=3): 'NV_ERR_BUSY_RETRY', (NV_ERR_CALLBACK_NOT_SCHEDULED:=4): 'NV_ERR_CALLBACK_NOT_SCHEDULED', (NV_ERR_CARD_NOT_PRESENT:=5): 'NV_ERR_CARD_NOT_PRESENT', (NV_ERR_CYCLE_DETECTED:=6): 'NV_ERR_CYCLE_DETECTED', (NV_ERR_DMA_IN_USE:=7): 'NV_ERR_DMA_IN_USE', (NV_ERR_DMA_MEM_NOT_LOCKED:=8): 'NV_ERR_DMA_MEM_NOT_LOCKED', (NV_ERR_DMA_MEM_NOT_UNLOCKED:=9): 'NV_ERR_DMA_MEM_NOT_UNLOCKED', (NV_ERR_DUAL_LINK_INUSE:=10): 'NV_ERR_DUAL_LINK_INUSE', (NV_ERR_ECC_ERROR:=11): 'NV_ERR_ECC_ERROR', (NV_ERR_FIFO_BAD_ACCESS:=12): 'NV_ERR_FIFO_BAD_ACCESS', (NV_ERR_FREQ_NOT_SUPPORTED:=13): 'NV_ERR_FREQ_NOT_SUPPORTED', (NV_ERR_GPU_DMA_NOT_INITIALIZED:=14): 'NV_ERR_GPU_DMA_NOT_INITIALIZED', (NV_ERR_GPU_IS_LOST:=15): 'NV_ERR_GPU_IS_LOST', (NV_ERR_GPU_IN_FULLCHIP_RESET:=16): 'NV_ERR_GPU_IN_FULLCHIP_RESET', (NV_ERR_GPU_NOT_FULL_POWER:=17): 'NV_ERR_GPU_NOT_FULL_POWER', (NV_ERR_GPU_UUID_NOT_FOUND:=18): 'NV_ERR_GPU_UUID_NOT_FOUND', (NV_ERR_HOT_SWITCH:=19): 'NV_ERR_HOT_SWITCH', (NV_ERR_I2C_ERROR:=20): 'NV_ERR_I2C_ERROR', (NV_ERR_I2C_SPEED_TOO_HIGH:=21): 'NV_ERR_I2C_SPEED_TOO_HIGH', (NV_ERR_ILLEGAL_ACTION:=22): 'NV_ERR_ILLEGAL_ACTION', (NV_ERR_IN_USE:=23): 'NV_ERR_IN_USE', (NV_ERR_INFLATE_COMPRESSED_DATA_FAILED:=24): 'NV_ERR_INFLATE_COMPRESSED_DATA_FAILED', (NV_ERR_INSERT_DUPLICATE_NAME:=25): 'NV_ERR_INSERT_DUPLICATE_NAME', (NV_ERR_INSUFFICIENT_RESOURCES:=26): 'NV_ERR_INSUFFICIENT_RESOURCES', (NV_ERR_INSUFFICIENT_PERMISSIONS:=27): 'NV_ERR_INSUFFICIENT_PERMISSIONS', (NV_ERR_INSUFFICIENT_POWER:=28): 'NV_ERR_INSUFFICIENT_POWER', (NV_ERR_INVALID_ACCESS_TYPE:=29): 'NV_ERR_INVALID_ACCESS_TYPE', (NV_ERR_INVALID_ADDRESS:=30): 'NV_ERR_INVALID_ADDRESS', (NV_ERR_INVALID_ARGUMENT:=31): 'NV_ERR_INVALID_ARGUMENT', (NV_ERR_INVALID_BASE:=32): 'NV_ERR_INVALID_BASE', (NV_ERR_INVALID_CHANNEL:=33): 'NV_ERR_INVALID_CHANNEL', (NV_ERR_INVALID_CLASS:=34): 'NV_ERR_INVALID_CLASS', (NV_ERR_INVALID_CLIENT:=35): 'NV_ERR_INVALID_CLIENT', (NV_ERR_INVALID_COMMAND:=36): 'NV_ERR_INVALID_COMMAND', (NV_ERR_INVALID_DATA:=37): 'NV_ERR_INVALID_DATA', (NV_ERR_INVALID_DEVICE:=38): 'NV_ERR_INVALID_DEVICE', (NV_ERR_INVALID_DMA_SPECIFIER:=39): 'NV_ERR_INVALID_DMA_SPECIFIER', (NV_ERR_INVALID_EVENT:=40): 'NV_ERR_INVALID_EVENT', (NV_ERR_INVALID_FLAGS:=41): 'NV_ERR_INVALID_FLAGS', (NV_ERR_INVALID_FUNCTION:=42): 'NV_ERR_INVALID_FUNCTION', (NV_ERR_INVALID_HEAP:=43): 'NV_ERR_INVALID_HEAP', (NV_ERR_INVALID_INDEX:=44): 'NV_ERR_INVALID_INDEX', (NV_ERR_INVALID_IRQ_LEVEL:=45): 'NV_ERR_INVALID_IRQ_LEVEL', (NV_ERR_INVALID_LIMIT:=46): 'NV_ERR_INVALID_LIMIT', (NV_ERR_INVALID_LOCK_STATE:=47): 'NV_ERR_INVALID_LOCK_STATE', (NV_ERR_INVALID_METHOD:=48): 'NV_ERR_INVALID_METHOD', (NV_ERR_INVALID_OBJECT:=49): 'NV_ERR_INVALID_OBJECT', (NV_ERR_INVALID_OBJECT_BUFFER:=50): 'NV_ERR_INVALID_OBJECT_BUFFER', (NV_ERR_INVALID_OBJECT_HANDLE:=51): 'NV_ERR_INVALID_OBJECT_HANDLE', (NV_ERR_INVALID_OBJECT_NEW:=52): 'NV_ERR_INVALID_OBJECT_NEW', (NV_ERR_INVALID_OBJECT_OLD:=53): 'NV_ERR_INVALID_OBJECT_OLD', (NV_ERR_INVALID_OBJECT_PARENT:=54): 'NV_ERR_INVALID_OBJECT_PARENT', (NV_ERR_INVALID_OFFSET:=55): 'NV_ERR_INVALID_OFFSET', (NV_ERR_INVALID_OPERATION:=56): 'NV_ERR_INVALID_OPERATION', (NV_ERR_INVALID_OWNER:=57): 'NV_ERR_INVALID_OWNER', (NV_ERR_INVALID_PARAM_STRUCT:=58): 'NV_ERR_INVALID_PARAM_STRUCT', (NV_ERR_INVALID_PARAMETER:=59): 'NV_ERR_INVALID_PARAMETER', (NV_ERR_INVALID_PATH:=60): 'NV_ERR_INVALID_PATH', (NV_ERR_INVALID_POINTER:=61): 'NV_ERR_INVALID_POINTER', (NV_ERR_INVALID_REGISTRY_KEY:=62): 'NV_ERR_INVALID_REGISTRY_KEY', (NV_ERR_INVALID_REQUEST:=63): 'NV_ERR_INVALID_REQUEST', (NV_ERR_INVALID_STATE:=64): 'NV_ERR_INVALID_STATE', (NV_ERR_INVALID_STRING_LENGTH:=65): 'NV_ERR_INVALID_STRING_LENGTH', (NV_ERR_INVALID_READ:=66): 'NV_ERR_INVALID_READ', (NV_ERR_INVALID_WRITE:=67): 'NV_ERR_INVALID_WRITE', (NV_ERR_INVALID_XLATE:=68): 'NV_ERR_INVALID_XLATE', (NV_ERR_IRQ_NOT_FIRING:=69): 'NV_ERR_IRQ_NOT_FIRING', (NV_ERR_IRQ_EDGE_TRIGGERED:=70): 'NV_ERR_IRQ_EDGE_TRIGGERED', (NV_ERR_MEMORY_TRAINING_FAILED:=71): 'NV_ERR_MEMORY_TRAINING_FAILED', (NV_ERR_MISMATCHED_SLAVE:=72): 'NV_ERR_MISMATCHED_SLAVE', (NV_ERR_MISMATCHED_TARGET:=73): 'NV_ERR_MISMATCHED_TARGET', (NV_ERR_MISSING_TABLE_ENTRY:=74): 'NV_ERR_MISSING_TABLE_ENTRY', (NV_ERR_MODULE_LOAD_FAILED:=75): 'NV_ERR_MODULE_LOAD_FAILED', (NV_ERR_MORE_DATA_AVAILABLE:=76): 'NV_ERR_MORE_DATA_AVAILABLE', (NV_ERR_MORE_PROCESSING_REQUIRED:=77): 'NV_ERR_MORE_PROCESSING_REQUIRED', (NV_ERR_MULTIPLE_MEMORY_TYPES:=78): 'NV_ERR_MULTIPLE_MEMORY_TYPES', (NV_ERR_NO_FREE_FIFOS:=79): 'NV_ERR_NO_FREE_FIFOS', (NV_ERR_NO_INTR_PENDING:=80): 'NV_ERR_NO_INTR_PENDING', (NV_ERR_NO_MEMORY:=81): 'NV_ERR_NO_MEMORY', (NV_ERR_NO_SUCH_DOMAIN:=82): 'NV_ERR_NO_SUCH_DOMAIN', (NV_ERR_NO_VALID_PATH:=83): 'NV_ERR_NO_VALID_PATH', (NV_ERR_NOT_COMPATIBLE:=84): 'NV_ERR_NOT_COMPATIBLE', (NV_ERR_NOT_READY:=85): 'NV_ERR_NOT_READY', (NV_ERR_NOT_SUPPORTED:=86): 'NV_ERR_NOT_SUPPORTED', (NV_ERR_OBJECT_NOT_FOUND:=87): 'NV_ERR_OBJECT_NOT_FOUND', (NV_ERR_OBJECT_TYPE_MISMATCH:=88): 'NV_ERR_OBJECT_TYPE_MISMATCH', (NV_ERR_OPERATING_SYSTEM:=89): 'NV_ERR_OPERATING_SYSTEM', (NV_ERR_OTHER_DEVICE_FOUND:=90): 'NV_ERR_OTHER_DEVICE_FOUND', (NV_ERR_OUT_OF_RANGE:=91): 'NV_ERR_OUT_OF_RANGE', (NV_ERR_OVERLAPPING_UVM_COMMIT:=92): 'NV_ERR_OVERLAPPING_UVM_COMMIT', (NV_ERR_PAGE_TABLE_NOT_AVAIL:=93): 'NV_ERR_PAGE_TABLE_NOT_AVAIL', (NV_ERR_PID_NOT_FOUND:=94): 'NV_ERR_PID_NOT_FOUND', (NV_ERR_PROTECTION_FAULT:=95): 'NV_ERR_PROTECTION_FAULT', (NV_ERR_RC_ERROR:=96): 'NV_ERR_RC_ERROR', (NV_ERR_REJECTED_VBIOS:=97): 'NV_ERR_REJECTED_VBIOS', (NV_ERR_RESET_REQUIRED:=98): 'NV_ERR_RESET_REQUIRED', (NV_ERR_STATE_IN_USE:=99): 'NV_ERR_STATE_IN_USE', (NV_ERR_SIGNAL_PENDING:=100): 'NV_ERR_SIGNAL_PENDING', (NV_ERR_TIMEOUT:=101): 'NV_ERR_TIMEOUT', (NV_ERR_TIMEOUT_RETRY:=102): 'NV_ERR_TIMEOUT_RETRY', (NV_ERR_TOO_MANY_PRIMARIES:=103): 'NV_ERR_TOO_MANY_PRIMARIES', (NV_ERR_UVM_ADDRESS_IN_USE:=104): 'NV_ERR_UVM_ADDRESS_IN_USE', (NV_ERR_MAX_SESSION_LIMIT_REACHED:=105): 'NV_ERR_MAX_SESSION_LIMIT_REACHED', (NV_ERR_LIB_RM_VERSION_MISMATCH:=106): 'NV_ERR_LIB_RM_VERSION_MISMATCH', (NV_ERR_PRIV_SEC_VIOLATION:=107): 'NV_ERR_PRIV_SEC_VIOLATION', (NV_ERR_GPU_IN_DEBUG_MODE:=108): 'NV_ERR_GPU_IN_DEBUG_MODE', (NV_ERR_FEATURE_NOT_ENABLED:=109): 'NV_ERR_FEATURE_NOT_ENABLED', (NV_ERR_RESOURCE_LOST:=110): 'NV_ERR_RESOURCE_LOST', (NV_ERR_PMU_NOT_READY:=111): 'NV_ERR_PMU_NOT_READY', (NV_ERR_FLCN_ERROR:=112): 'NV_ERR_FLCN_ERROR', (NV_ERR_FATAL_ERROR:=113): 'NV_ERR_FATAL_ERROR', (NV_ERR_MEMORY_ERROR:=114): 'NV_ERR_MEMORY_ERROR', (NV_ERR_INVALID_LICENSE:=115): 'NV_ERR_INVALID_LICENSE', (NV_ERR_NVLINK_INIT_ERROR:=116): 'NV_ERR_NVLINK_INIT_ERROR', (NV_ERR_NVLINK_MINION_ERROR:=117): 'NV_ERR_NVLINK_MINION_ERROR', (NV_ERR_NVLINK_CLOCK_ERROR:=118): 'NV_ERR_NVLINK_CLOCK_ERROR', (NV_ERR_NVLINK_TRAINING_ERROR:=119): 'NV_ERR_NVLINK_TRAINING_ERROR', (NV_ERR_NVLINK_CONFIGURATION_ERROR:=120): 'NV_ERR_NVLINK_CONFIGURATION_ERROR', (NV_ERR_RISCV_ERROR:=121): 'NV_ERR_RISCV_ERROR', (NV_ERR_FABRIC_MANAGER_NOT_PRESENT:=122): 'NV_ERR_FABRIC_MANAGER_NOT_PRESENT', (NV_ERR_ALREADY_SIGNALLED:=123): 'NV_ERR_ALREADY_SIGNALLED', (NV_ERR_QUEUE_TASK_SLOT_NOT_AVAILABLE:=124): 'NV_ERR_QUEUE_TASK_SLOT_NOT_AVAILABLE', (NV_ERR_KEY_ROTATION_IN_PROGRESS:=125): 'NV_ERR_KEY_ROTATION_IN_PROGRESS', (NV_ERR_TEST_ONLY_CODE_NOT_ENABLED:=126): 'NV_ERR_TEST_ONLY_CODE_NOT_ENABLED', (NV_ERR_SECURE_BOOT_FAILED:=127): 'NV_ERR_SECURE_BOOT_FAILED', (NV_ERR_INSUFFICIENT_ZBC_ENTRY:=128): 'NV_ERR_INSUFFICIENT_ZBC_ENTRY', (NV_ERR_NVLINK_FABRIC_NOT_READY:=129): 'NV_ERR_NVLINK_FABRIC_NOT_READY', (NV_ERR_NVLINK_FABRIC_FAILURE:=130): 'NV_ERR_NVLINK_FABRIC_FAILURE', (NV_ERR_GPU_MEMORY_ONLINING_FAILURE:=131): 'NV_ERR_GPU_MEMORY_ONLINING_FAILURE', (NV_ERR_REDUCTION_MANAGER_NOT_AVAILABLE:=132): 'NV_ERR_REDUCTION_MANAGER_NOT_AVAILABLE', (NV_ERR_THRESHOLD_CROSSED:=133): 'NV_ERR_THRESHOLD_CROSSED', (NV_ERR_RESOURCE_RETIREMENT_ERROR:=134): 'NV_ERR_RESOURCE_RETIREMENT_ERROR', (NV_ERR_FABRIC_STATE_OUT_OF_SYNC:=135): 'NV_ERR_FABRIC_STATE_OUT_OF_SYNC', (NV_ERR_BUFFER_FULL:=136): 'NV_ERR_BUFFER_FULL', (NV_ERR_BUFFER_EMPTY:=137): 'NV_ERR_BUFFER_EMPTY', (NV_ERR_MC_FLA_OFFSET_TABLE_FULL:=138): 'NV_ERR_MC_FLA_OFFSET_TABLE_FULL', (NV_ERR_DMA_XFER_FAILED:=139): 'NV_ERR_DMA_XFER_FAILED', (NV_WARN_HOT_SWITCH:=65537): 'NV_WARN_HOT_SWITCH', (NV_WARN_INCORRECT_PERFMON_DATA:=65538): 'NV_WARN_INCORRECT_PERFMON_DATA', (NV_WARN_MISMATCHED_SLAVE:=65539): 'NV_WARN_MISMATCHED_SLAVE', (NV_WARN_MISMATCHED_TARGET:=65540): 'NV_WARN_MISMATCHED_TARGET', (NV_WARN_MORE_PROCESSING_REQUIRED:=65541): 'NV_WARN_MORE_PROCESSING_REQUIRED', (NV_WARN_NOTHING_TO_DO:=65542): 'NV_WARN_NOTHING_TO_DO', (NV_WARN_NULL_OBJECT:=65543): 'NV_WARN_NULL_OBJECT', (NV_WARN_OUT_OF_RANGE:=65544): 'NV_WARN_OUT_OF_RANGE', (NV_WARN_THRESHOLD_CROSSED:=65545): 'NV_WARN_THRESHOLD_CROSSED'} +NVC9B0_VIDEO_DECODER = (0x0000C9B0) +NVC9B0_NOP = (0x00000100) +NVC9B0_NOP_PARAMETER = (31, 0) +NVC9B0_PM_TRIGGER = (0x00000140) +NVC9B0_PM_TRIGGER_V = (31, 0) +NVC9B0_SET_APPLICATION_ID = (0x00000200) +NVC9B0_SET_APPLICATION_ID_ID = (31, 0) +NVC9B0_SET_APPLICATION_ID_ID_MPEG12 = (0x00000001) +NVC9B0_SET_APPLICATION_ID_ID_VC1 = (0x00000002) +NVC9B0_SET_APPLICATION_ID_ID_H264 = (0x00000003) +NVC9B0_SET_APPLICATION_ID_ID_MPEG4 = (0x00000004) +NVC9B0_SET_APPLICATION_ID_ID_VP8 = (0x00000005) +NVC9B0_SET_APPLICATION_ID_ID_CTR64 = (0x00000006) +NVC9B0_SET_APPLICATION_ID_ID_HEVC = (0x00000007) +NVC9B0_SET_APPLICATION_ID_ID_NEW_H264 = (0x00000008) +NVC9B0_SET_APPLICATION_ID_ID_VP9 = (0x00000009) +NVC9B0_SET_APPLICATION_ID_ID_PASS1 = (0x0000000A) +NVC9B0_SET_APPLICATION_ID_ID_HEVC_PARSER = (0x0000000C) +NVC9B0_SET_APPLICATION_ID_ID_UCODE_TEST = (0x0000000D) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_DECRYPTAUDIO = (0x0000000E) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_DECRYPTAUDIOMULTIPLE = (0x0000000F) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_PREPROCESSENCRYPTEDDATA = (0x00000010) +NVC9B0_SET_APPLICATION_ID_ID_VP9_WITH_PARSER = (0x00000011) +NVC9B0_SET_APPLICATION_ID_ID_AVD = (0x00000012) +NVC9B0_SET_APPLICATION_ID_ID_HW_DRM_PR4_DECRYPTCONTENTMULTIPLE = (0x00000013) +NVC9B0_SET_APPLICATION_ID_ID_DHKE = (0x00000020) +NVC9B0_SET_WATCHDOG_TIMER = (0x00000204) +NVC9B0_SET_WATCHDOG_TIMER_TIMER = (31, 0) +NVC9B0_SEMAPHORE_A = (0x00000240) +NVC9B0_SEMAPHORE_A_UPPER = (7, 0) +NVC9B0_SEMAPHORE_B = (0x00000244) +NVC9B0_SEMAPHORE_B_LOWER = (31, 0) +NVC9B0_SEMAPHORE_C = (0x00000248) +NVC9B0_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC9B0_CTX_SAVE_AREA = (0x0000024C) +NVC9B0_CTX_SAVE_AREA_OFFSET = (31, 0) +NVC9B0_CTX_SWITCH = (0x00000250) +NVC9B0_CTX_SWITCH_OP = (1, 0) +NVC9B0_CTX_SWITCH_OP_CTX_UPDATE = (0x00000000) +NVC9B0_CTX_SWITCH_OP_CTX_SAVE = (0x00000001) +NVC9B0_CTX_SWITCH_OP_CTX_RESTORE = (0x00000002) +NVC9B0_CTX_SWITCH_OP_CTX_FORCERESTORE = (0x00000003) +NVC9B0_CTX_SWITCH_CTXID_VALID = (2, 2) +NVC9B0_CTX_SWITCH_CTXID_VALID_FALSE = (0x00000000) +NVC9B0_CTX_SWITCH_CTXID_VALID_TRUE = (0x00000001) +NVC9B0_CTX_SWITCH_RESERVED0 = (7, 3) +NVC9B0_CTX_SWITCH_CTX_ID = (23, 8) +NVC9B0_CTX_SWITCH_RESERVED1 = (31, 24) +NVC9B0_SET_SEMAPHORE_PAYLOAD_LOWER = (0x00000254) +NVC9B0_SET_SEMAPHORE_PAYLOAD_LOWER_PAYLOAD_LOWER = (31, 0) +NVC9B0_SET_SEMAPHORE_PAYLOAD_UPPER = (0x00000258) +NVC9B0_SET_SEMAPHORE_PAYLOAD_UPPER_PAYLOAD_UPPER = (31, 0) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_A = (0x0000025C) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_A_LOWER = (31, 0) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_B = (0x00000260) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_B_UPPER = (31, 0) +NVC9B0_EXECUTE = (0x00000300) +NVC9B0_EXECUTE_NOTIFY = (0, 0) +NVC9B0_EXECUTE_NOTIFY_DISABLE = (0x00000000) +NVC9B0_EXECUTE_NOTIFY_ENABLE = (0x00000001) +NVC9B0_EXECUTE_NOTIFY_ON = (1, 1) +NVC9B0_EXECUTE_NOTIFY_ON_END = (0x00000000) +NVC9B0_EXECUTE_NOTIFY_ON_BEGIN = (0x00000001) +NVC9B0_EXECUTE_PREDICATION = (2, 2) +NVC9B0_EXECUTE_PREDICATION_DISABLE = (0x00000000) +NVC9B0_EXECUTE_PREDICATION_ENABLE = (0x00000001) +NVC9B0_EXECUTE_PREDICATION_OP = (3, 3) +NVC9B0_EXECUTE_PREDICATION_OP_EQUAL_ZERO = (0x00000000) +NVC9B0_EXECUTE_PREDICATION_OP_NOT_EQUAL_ZERO = (0x00000001) +NVC9B0_EXECUTE_AWAKEN = (8, 8) +NVC9B0_EXECUTE_AWAKEN_DISABLE = (0x00000000) +NVC9B0_EXECUTE_AWAKEN_ENABLE = (0x00000001) +NVC9B0_SEMAPHORE_D = (0x00000304) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE = (1, 0) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_ONE = (0x00000000) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_FOUR = (0x00000001) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_TWO = (0x00000002) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE = (8, 8) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE_FALSE = (0x00000000) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE_TRUE = (0x00000001) +NVC9B0_SEMAPHORE_D_OPERATION = (17, 16) +NVC9B0_SEMAPHORE_D_OPERATION_RELEASE = (0x00000000) +NVC9B0_SEMAPHORE_D_OPERATION_RESERVED_0 = (0x00000001) +NVC9B0_SEMAPHORE_D_OPERATION_RESERVED_1 = (0x00000002) +NVC9B0_SEMAPHORE_D_OPERATION_TRAP = (0x00000003) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE = (21, 21) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE_FALSE = (0x00000000) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE_TRUE = (0x00000001) +NVC9B0_SEMAPHORE_D_TRAP_TYPE = (23, 22) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_UNCONDITIONAL = (0x00000000) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_CONDITIONAL = (0x00000001) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_CONDITIONAL_EXT = (0x00000002) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE = (24, 24) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE_32BIT = (0x00000000) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE_64BIT = (0x00000001) +NVC9B0_SET_PREDICATION_OFFSET_UPPER = (0x00000308) +NVC9B0_SET_PREDICATION_OFFSET_UPPER_OFFSET = (7, 0) +NVC9B0_SET_PREDICATION_OFFSET_LOWER = (0x0000030C) +NVC9B0_SET_PREDICATION_OFFSET_LOWER_OFFSET = (31, 0) +NVC9B0_SET_AUXILIARY_DATA_BUFFER = (0x00000310) +NVC9B0_SET_AUXILIARY_DATA_BUFFER_OFFSET = (31, 0) +NVC9B0_SET_CONTROL_PARAMS = (0x00000400) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE = (3, 0) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG1 = (0x00000000) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG2 = (0x00000001) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VC1 = (0x00000002) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_H264 = (0x00000003) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG4 = (0x00000004) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_DIVX3 = (0x00000004) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VP8 = (0x00000005) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_HEVC = (0x00000007) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VP9 = (0x00000009) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_AV1 = (0x0000000A) +NVC9B0_SET_CONTROL_PARAMS_GPTIMER_ON = (4, 4) +NVC9B0_SET_CONTROL_PARAMS_RET_ERROR = (5, 5) +NVC9B0_SET_CONTROL_PARAMS_ERR_CONCEAL_ON = (6, 6) +NVC9B0_SET_CONTROL_PARAMS_ERROR_FRM_IDX = (12, 7) +NVC9B0_SET_CONTROL_PARAMS_MBTIMER_ON = (13, 13) +NVC9B0_SET_CONTROL_PARAMS_EC_INTRA_FRAME_USING_PSLC = (14, 14) +NVC9B0_SET_CONTROL_PARAMS_IGNORE_SOME_FIELDS_CRC_CHECK = (15, 15) +NVC9B0_SET_CONTROL_PARAMS_EVENT_TRACE_LOGGING_ON = (16, 16) +NVC9B0_SET_CONTROL_PARAMS_ALL_INTRA_FRAME = (17, 17) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV = (19, 18) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV_TRACE3D_RUN = (0x00000000) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV_PROD_RUN = (0x00000001) +NVC9B0_SET_CONTROL_PARAMS_HINT_DUMP_EN = (20, 20) +NVC9B0_SET_CONTROL_PARAMS_RESERVED = (25, 21) +NVC9B0_SET_CONTROL_PARAMS_NVDECSIM_SKIP_SCP = (26, 26) +NVC9B0_SET_CONTROL_PARAMS_ENABLE_ENCRYPT = (27, 27) +NVC9B0_SET_CONTROL_PARAMS_ENCRYPTMODE = (31, 28) +NVC9B0_SET_DRV_PIC_SETUP_OFFSET = (0x00000404) +NVC9B0_SET_DRV_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_IN_BUF_BASE_OFFSET = (0x00000408) +NVC9B0_SET_IN_BUF_BASE_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_INDEX = (0x0000040C) +NVC9B0_SET_PICTURE_INDEX_INDEX = (31, 0) +NVC9B0_SET_SLICE_OFFSETS_BUF_OFFSET = (0x00000410) +NVC9B0_SET_SLICE_OFFSETS_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_COLOC_DATA_OFFSET = (0x00000414) +NVC9B0_SET_COLOC_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_HISTORY_OFFSET = (0x00000418) +NVC9B0_SET_HISTORY_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_SIZE = (0x0000041C) +NVC9B0_SET_DISPLAY_BUF_SIZE_SIZE = (31, 0) +NVC9B0_SET_HISTOGRAM_OFFSET = (0x00000420) +NVC9B0_SET_HISTOGRAM_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_NVDEC_STATUS_OFFSET = (0x00000424) +NVC9B0_SET_NVDEC_STATUS_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_LUMA_OFFSET = (0x00000428) +NVC9B0_SET_DISPLAY_BUF_LUMA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_CHROMA_OFFSET = (0x0000042C) +NVC9B0_SET_DISPLAY_BUF_CHROMA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET0 = (0x00000430) +NVC9B0_SET_PICTURE_LUMA_OFFSET0_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET1 = (0x00000434) +NVC9B0_SET_PICTURE_LUMA_OFFSET1_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET2 = (0x00000438) +NVC9B0_SET_PICTURE_LUMA_OFFSET2_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET3 = (0x0000043C) +NVC9B0_SET_PICTURE_LUMA_OFFSET3_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET4 = (0x00000440) +NVC9B0_SET_PICTURE_LUMA_OFFSET4_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET5 = (0x00000444) +NVC9B0_SET_PICTURE_LUMA_OFFSET5_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET6 = (0x00000448) +NVC9B0_SET_PICTURE_LUMA_OFFSET6_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET7 = (0x0000044C) +NVC9B0_SET_PICTURE_LUMA_OFFSET7_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET8 = (0x00000450) +NVC9B0_SET_PICTURE_LUMA_OFFSET8_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET9 = (0x00000454) +NVC9B0_SET_PICTURE_LUMA_OFFSET9_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET10 = (0x00000458) +NVC9B0_SET_PICTURE_LUMA_OFFSET10_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET11 = (0x0000045C) +NVC9B0_SET_PICTURE_LUMA_OFFSET11_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET12 = (0x00000460) +NVC9B0_SET_PICTURE_LUMA_OFFSET12_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET13 = (0x00000464) +NVC9B0_SET_PICTURE_LUMA_OFFSET13_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET14 = (0x00000468) +NVC9B0_SET_PICTURE_LUMA_OFFSET14_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET15 = (0x0000046C) +NVC9B0_SET_PICTURE_LUMA_OFFSET15_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET16 = (0x00000470) +NVC9B0_SET_PICTURE_LUMA_OFFSET16_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET0 = (0x00000474) +NVC9B0_SET_PICTURE_CHROMA_OFFSET0_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET1 = (0x00000478) +NVC9B0_SET_PICTURE_CHROMA_OFFSET1_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET2 = (0x0000047C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET2_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET3 = (0x00000480) +NVC9B0_SET_PICTURE_CHROMA_OFFSET3_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET4 = (0x00000484) +NVC9B0_SET_PICTURE_CHROMA_OFFSET4_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET5 = (0x00000488) +NVC9B0_SET_PICTURE_CHROMA_OFFSET5_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET6 = (0x0000048C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET6_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET7 = (0x00000490) +NVC9B0_SET_PICTURE_CHROMA_OFFSET7_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET8 = (0x00000494) +NVC9B0_SET_PICTURE_CHROMA_OFFSET8_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET9 = (0x00000498) +NVC9B0_SET_PICTURE_CHROMA_OFFSET9_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET10 = (0x0000049C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET10_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET11 = (0x000004A0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET11_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET12 = (0x000004A4) +NVC9B0_SET_PICTURE_CHROMA_OFFSET12_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET13 = (0x000004A8) +NVC9B0_SET_PICTURE_CHROMA_OFFSET13_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET14 = (0x000004AC) +NVC9B0_SET_PICTURE_CHROMA_OFFSET14_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET15 = (0x000004B0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET15_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET16 = (0x000004B4) +NVC9B0_SET_PICTURE_CHROMA_OFFSET16_OFFSET = (31, 0) +NVC9B0_SET_PIC_SCRATCH_BUF_OFFSET = (0x000004B8) +NVC9B0_SET_PIC_SCRATCH_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_EXTERNAL_MVBUFFER_OFFSET = (0x000004BC) +NVC9B0_SET_EXTERNAL_MVBUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SUB_SAMPLE_MAP_OFFSET = (0x000004C0) +NVC9B0_SET_SUB_SAMPLE_MAP_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SUB_SAMPLE_MAP_IV_OFFSET = (0x000004C4) +NVC9B0_SET_SUB_SAMPLE_MAP_IV_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_INTRA_TOP_BUF_OFFSET = (0x000004C8) +NVC9B0_SET_INTRA_TOP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_TILE_SIZE_BUF_OFFSET = (0x000004CC) +NVC9B0_SET_TILE_SIZE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_FILTER_BUFFER_OFFSET = (0x000004D0) +NVC9B0_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_CRC_STRUCT_OFFSET = (0x000004D4) +NVC9B0_SET_CRC_STRUCT_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PR_SSM_CONTENT_INFO_BUF_OFFSET = (0x000004D8) +NVC9B0_SET_PR_SSM_CONTENT_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_MBHIST_BUF_OFFSET = (0x00000500) +NVC9B0_H264_SET_MBHIST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP8_SET_PROB_DATA_OFFSET = (0x00000540) +NVC9B0_VP8_SET_PROB_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_VP8_SET_HEADER_PARTITION_BUF_BASE_OFFSET = (0x00000544) +NVC9B0_VP8_SET_HEADER_PARTITION_BUF_BASE_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SCALING_LIST_OFFSET = (0x00000580) +NVC9B0_HEVC_SET_SCALING_LIST_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_TILE_SIZES_OFFSET = (0x00000584) +NVC9B0_HEVC_SET_TILE_SIZES_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_FILTER_BUFFER_OFFSET = (0x00000588) +NVC9B0_HEVC_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SAO_BUFFER_OFFSET = (0x0000058C) +NVC9B0_HEVC_SET_SAO_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SLICE_INFO_BUFFER_OFFSET = (0x00000590) +NVC9B0_HEVC_SET_SLICE_INFO_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SLICE_GROUP_INDEX = (0x00000594) +NVC9B0_HEVC_SET_SLICE_GROUP_INDEX_OFFSET = (31, 0) +NVC9B0_VP9_SET_PROB_TAB_BUF_OFFSET = (0x000005C0) +NVC9B0_VP9_SET_PROB_TAB_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_CTX_COUNTER_BUF_OFFSET = (0x000005C4) +NVC9B0_VP9_SET_CTX_COUNTER_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_SEGMENT_READ_BUF_OFFSET = (0x000005C8) +NVC9B0_VP9_SET_SEGMENT_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_SEGMENT_WRITE_BUF_OFFSET = (0x000005CC) +NVC9B0_VP9_SET_SEGMENT_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_TILE_SIZE_BUF_OFFSET = (0x000005D0) +NVC9B0_VP9_SET_TILE_SIZE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_COL_MVWRITE_BUF_OFFSET = (0x000005D4) +NVC9B0_VP9_SET_COL_MVWRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_COL_MVREAD_BUF_OFFSET = (0x000005D8) +NVC9B0_VP9_SET_COL_MVREAD_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_FILTER_BUFFER_OFFSET = (0x000005DC) +NVC9B0_VP9_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PIC_SETUP_OFFSET = (0x000005E0) +NVC9B0_VP9_PARSER_SET_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PREV_PIC_SETUP_OFFSET = (0x000005E4) +NVC9B0_VP9_PARSER_SET_PREV_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PROB_TAB_BUF_OFFSET = (0x000005E8) +NVC9B0_VP9_PARSER_SET_PROB_TAB_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_HINT_DUMP_BUF_OFFSET = (0x000005EC) +NVC9B0_VP9_SET_HINT_DUMP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_CLEAR_HEADER_OFFSET = (0x00000600) +NVC9B0_PASS1_SET_CLEAR_HEADER_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_RE_ENCRYPT_OFFSET = (0x00000604) +NVC9B0_PASS1_SET_RE_ENCRYPT_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_VP8_TOKEN_OFFSET = (0x00000608) +NVC9B0_PASS1_SET_VP8_TOKEN_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_INPUT_DATA_OFFSET = (0x0000060C) +NVC9B0_PASS1_SET_INPUT_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_OUTPUT_DATA_SIZE_OFFSET = (0x00000610) +NVC9B0_PASS1_SET_OUTPUT_DATA_SIZE_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_PROB_TAB_READ_BUF_OFFSET = (0x00000640) +NVC9B0_AV1_SET_PROB_TAB_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_PROB_TAB_WRITE_BUF_OFFSET = (0x00000644) +NVC9B0_AV1_SET_PROB_TAB_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SEGMENT_READ_BUF_OFFSET = (0x00000648) +NVC9B0_AV1_SET_SEGMENT_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SEGMENT_WRITE_BUF_OFFSET = (0x0000064C) +NVC9B0_AV1_SET_SEGMENT_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV0_READ_BUF_OFFSET = (0x00000650) +NVC9B0_AV1_SET_COL_MV0_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV1_READ_BUF_OFFSET = (0x00000654) +NVC9B0_AV1_SET_COL_MV1_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV2_READ_BUF_OFFSET = (0x00000658) +NVC9B0_AV1_SET_COL_MV2_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MVWRITE_BUF_OFFSET = (0x0000065C) +NVC9B0_AV1_SET_COL_MVWRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_GLOBAL_MODEL_BUF_OFFSET = (0x00000660) +NVC9B0_AV1_SET_GLOBAL_MODEL_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_FILM_GRAIN_BUF_OFFSET = (0x00000664) +NVC9B0_AV1_SET_FILM_GRAIN_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_TILE_STREAM_INFO_BUF_OFFSET = (0x00000668) +NVC9B0_AV1_SET_TILE_STREAM_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SUB_STREAM_ENTRY_BUF_OFFSET = (0x0000066C) +NVC9B0_AV1_SET_SUB_STREAM_ENTRY_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_HINT_DUMP_BUF_OFFSET = (0x00000670) +NVC9B0_AV1_SET_HINT_DUMP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_SCALING_LIST_OFFSET = (0x00000680) +NVC9B0_H264_SET_SCALING_LIST_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_VLDHIST_BUF_OFFSET = (0x00000684) +NVC9B0_H264_SET_VLDHIST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET0 = (0x00000688) +NVC9B0_H264_SET_EDOBOFFSET0_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET1 = (0x0000068C) +NVC9B0_H264_SET_EDOBOFFSET1_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET2 = (0x00000690) +NVC9B0_H264_SET_EDOBOFFSET2_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET3 = (0x00000694) +NVC9B0_H264_SET_EDOBOFFSET3_OFFSET = (31, 0) +NVC9B0_SET_CONTENT_INITIAL_VECTOR = lambda b: (0x00000C00 + (b)*0x00000004) # type: ignore +NVC9B0_SET_CONTENT_INITIAL_VECTOR_VALUE = (31, 0) +NVC9B0_SET_CTL_COUNT = (0x00000C10) +NVC9B0_SET_CTL_COUNT_VALUE = (31, 0) +NVC9B0_SET_UPPER_SRC = (0x00000C14) +NVC9B0_SET_UPPER_SRC_OFFSET = (7, 0) +NVC9B0_SET_LOWER_SRC = (0x00000C18) +NVC9B0_SET_LOWER_SRC_OFFSET = (31, 0) +NVC9B0_SET_UPPER_DST = (0x00000C1C) +NVC9B0_SET_UPPER_DST_OFFSET = (7, 0) +NVC9B0_SET_LOWER_DST = (0x00000C20) +NVC9B0_SET_LOWER_DST_OFFSET = (31, 0) +NVC9B0_SET_BLOCK_COUNT = (0x00000C24) +NVC9B0_SET_BLOCK_COUNT_VALUE = (31, 0) +NVC9B0_PR_SET_REQUEST_BUF_OFFSET = (0x00000D00) +NVC9B0_PR_SET_REQUEST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_REQUEST_BUF_SIZE = (0x00000D04) +NVC9B0_PR_SET_REQUEST_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_RESPONSE_BUF_OFFSET = (0x00000D08) +NVC9B0_PR_SET_RESPONSE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_RESPONSE_BUF_SIZE = (0x00000D0C) +NVC9B0_PR_SET_RESPONSE_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_REQUEST_MESSAGE_BUF_OFFSET = (0x00000D10) +NVC9B0_PR_SET_REQUEST_MESSAGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_RESPONSE_MESSAGE_BUF_OFFSET = (0x00000D14) +NVC9B0_PR_SET_RESPONSE_MESSAGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_OFFSET = (0x00000D18) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_SIZE = (0x00000D1C) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_CONTENT_DECRYPT_INFO_BUF_OFFSET = (0x00000D20) +NVC9B0_PR_SET_CONTENT_DECRYPT_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_REENCRYPTED_BITSTREAM_BUF_OFFSET = (0x00000D24) +NVC9B0_PR_SET_REENCRYPTED_BITSTREAM_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_DH_KE_SET_CHALLENGE_BUF_OFFSET = (0x00000E00) +NVC9B0_DH_KE_SET_CHALLENGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_DH_KE_SET_RESPONSE_BUF_OFFSET = (0x00000E04) +NVC9B0_DH_KE_SET_RESPONSE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SESSION_KEY = lambda b: (0x00000F00 + (b)*0x00000004) # type: ignore +NVC9B0_SET_SESSION_KEY_VALUE = (31, 0) +NVC9B0_SET_CONTENT_KEY = lambda b: (0x00000F10 + (b)*0x00000004) # type: ignore +NVC9B0_SET_CONTENT_KEY_VALUE = (31, 0) +NVC9B0_PM_TRIGGER_END = (0x00001114) +NVC9B0_PM_TRIGGER_END_V = (31, 0) +NVC9B0_ERROR_NONE = (0x00000000) +NVC9B0_OS_ERROR_EXECUTE_INSUFFICIENT_DATA = (0x00000001) +NVC9B0_OS_ERROR_SEMAPHORE_INSUFFICIENT_DATA = (0x00000002) +NVC9B0_OS_ERROR_INVALID_METHOD = (0x00000003) +NVC9B0_OS_ERROR_INVALID_DMA_PAGE = (0x00000004) +NVC9B0_OS_ERROR_UNHANDLED_INTERRUPT = (0x00000005) +NVC9B0_OS_ERROR_EXCEPTION = (0x00000006) +NVC9B0_OS_ERROR_INVALID_CTXSW_REQUEST = (0x00000007) +NVC9B0_OS_ERROR_APPLICATION = (0x00000008) +NVC9B0_OS_ERROR_SW_BREAKPT = (0x00000009) +NVC9B0_OS_INTERRUPT_EXECUTE_AWAKEN = (0x00000100) +NVC9B0_OS_INTERRUPT_BACKEND_SEMAPHORE_AWAKEN = (0x00000200) +NVC9B0_OS_INTERRUPT_CTX_ERROR_FBIF = (0x00000300) +NVC9B0_OS_INTERRUPT_LIMIT_VIOLATION = (0x00000400) +NVC9B0_OS_INTERRUPT_LIMIT_AND_FBIF_CTX_ERROR = (0x00000500) +NVC9B0_OS_INTERRUPT_HALT_ENGINE = (0x00000600) +NVC9B0_OS_INTERRUPT_TRAP_NONSTALL = (0x00000700) +NVC9B0_H264_VLD_ERR_SEQ_DATA_INCONSISTENT = (0x00004001) +NVC9B0_H264_VLD_ERR_PIC_DATA_INCONSISTENT = (0x00004002) +NVC9B0_H264_VLD_ERR_SLC_DATA_BUF_ADDR_OUT_OF_BOUNDS = (0x00004100) +NVC9B0_H264_VLD_ERR_BITSTREAM_ERROR = (0x00004101) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x000041F8) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_SIZE_NOT_MULT256 = (0x00004200) +NVC9B0_H264_VLD_ERR_SLC_DATA_OUT_SIZE_NOT_MULT256 = (0x00004201) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00004203) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_SLC_HDR_OUT_INVALID = (0x00004204) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00004205) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_BUF_ALREADY_VALID = (0x00004206) +NVC9B0_H264_VLD_ERR_SLC_DATA_OUT_BUF_TOO_SMALL = (0x00004207) +NVC9B0_H264_VLD_ERR_DATA_BUF_CNT_TOO_SMALL = (0x00004208) +NVC9B0_H264_VLD_ERR_BITSTREAM_EMPTY = (0x00004209) +NVC9B0_H264_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000420A) +NVC9B0_H264_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000420B) +NVC9B0_H264_VLD_ERR_HIST_BUF_TOO_SMALL = (0x00004300) +NVC9B0_VC1_VLD_ERR_PIC_DATA_BUF_ADDR_OUT_OF_BOUND = (0x00005100) +NVC9B0_VC1_VLD_ERR_BITSTREAM_ERROR = (0x00005101) +NVC9B0_VC1_VLD_ERR_PIC_HDR_OUT_SIZE_NOT_MULT256 = (0x00005200) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_SIZE_NOT_MULT256 = (0x00005201) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00005202) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00005203) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_PIC_HDR_OUT_INVALID = (0x00005204) +NVC9B0_VC1_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00005205) +NVC9B0_VC1_VLD_ERR_PIC_HDR_OUT_BUF_ALREADY_VALID = (0x00005206) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_BUF_TOO_SMALL = (0x00005207) +NVC9B0_VC1_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00005208) +NVC9B0_VC1_VLD_ERR_BITSTREAM_EMPTY = (0x00005209) +NVC9B0_VC1_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000520A) +NVC9B0_VC1_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000520B) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00005300) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_BUF_ADDR_OUT_OF_BOUNDS = (0x00006100) +NVC9B0_MPEG12_VLD_ERR_BITSTREAM_ERROR = (0x00006101) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_SIZE_NOT_MULT256 = (0x00006200) +NVC9B0_MPEG12_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00006201) +NVC9B0_MPEG12_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00006202) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_BUF_TOO_SMALL = (0x00006203) +NVC9B0_MPEG12_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00006204) +NVC9B0_MPEG12_VLD_ERR_BITSTREAM_EMPTY = (0x00006205) +NVC9B0_MPEG12_VLD_ERR_INVALID_PIC_STRUCTURE = (0x00006206) +NVC9B0_MPEG12_VLD_ERR_INVALID_PIC_CODING_TYPE = (0x00006207) +NVC9B0_MPEG12_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x00006208) +NVC9B0_MPEG12_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x00006209) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00006300) +NVC9B0_CMN_VLD_ERR_PDEC_RETURNED_ERROR = (0x00007101) +NVC9B0_CMN_VLD_ERR_EDOB_FLUSH_TIME_OUT = (0x00007102) +NVC9B0_CMN_VLD_ERR_EDOB_REWIND_TIME_OUT = (0x00007103) +NVC9B0_CMN_VLD_ERR_VLD_WD_TIME_OUT = (0x00007104) +NVC9B0_CMN_VLD_ERR_NUM_SLICES_ZERO = (0x00007105) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_BUF_ADDR_OUT_OF_BOUND = (0x00008100) +NVC9B0_MPEG4_VLD_ERR_BITSTREAM_ERROR = (0x00008101) +NVC9B0_MPEG4_VLD_ERR_PIC_HDR_OUT_SIZE_NOT_MULT256 = (0x00008200) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_SIZE_NOT_MULT256 = (0x00008201) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00008202) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00008203) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_PIC_HDR_OUT_INVALID = (0x00008204) +NVC9B0_MPEG4_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00008205) +NVC9B0_MPEG4_VLD_ERR_PIC_HDR_OUT_BUF_ALREADY_VALID = (0x00008206) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_BUF_TOO_SMALL = (0x00008207) +NVC9B0_MPEG4_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00008208) +NVC9B0_MPEG4_VLD_ERR_BITSTREAM_EMPTY = (0x00008209) +NVC9B0_MPEG4_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000820A) +NVC9B0_MPEG4_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000820B) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00051E01) +NVC9B0_DEC_ERROR_MPEG12_APPTIMER_EXPIRED = (0xDEC10001) +NVC9B0_DEC_ERROR_MPEG12_MVTIMER_EXPIRED = (0xDEC10002) +NVC9B0_DEC_ERROR_MPEG12_INVALID_TOKEN = (0xDEC10003) +NVC9B0_DEC_ERROR_MPEG12_SLICEDATA_MISSING = (0xDEC10004) +NVC9B0_DEC_ERROR_MPEG12_HWERR_INTERRUPT = (0xDEC10005) +NVC9B0_DEC_ERROR_MPEG12_DETECTED_VLD_FAILURE = (0xDEC10006) +NVC9B0_DEC_ERROR_MPEG12_PICTURE_INIT = (0xDEC10100) +NVC9B0_DEC_ERROR_MPEG12_STATEMACHINE_FAILURE = (0xDEC10101) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_PIC = (0xDEC10901) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_UCODE = (0xDEC10902) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_FC = (0xDEC10903) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_SLH = (0xDEC10904) +NVC9B0_DEC_ERROR_MPEG12_INVALID_UCODE_SIZE = (0xDEC10905) +NVC9B0_DEC_ERROR_MPEG12_INVALID_SLICE_COUNT = (0xDEC10906) +NVC9B0_DEC_ERROR_VC1_APPTIMER_EXPIRED = (0xDEC20001) +NVC9B0_DEC_ERROR_VC1_MVTIMER_EXPIRED = (0xDEC20002) +NVC9B0_DEC_ERROR_VC1_INVALID_TOKEN = (0xDEC20003) +NVC9B0_DEC_ERROR_VC1_SLICEDATA_MISSING = (0xDEC20004) +NVC9B0_DEC_ERROR_VC1_HWERR_INTERRUPT = (0xDEC20005) +NVC9B0_DEC_ERROR_VC1_DETECTED_VLD_FAILURE = (0xDEC20006) +NVC9B0_DEC_ERROR_VC1_TIMEOUT_POLLING_FOR_DATA = (0xDEC20007) +NVC9B0_DEC_ERROR_VC1_PDEC_PIC_END_UNALIGNED = (0xDEC20008) +NVC9B0_DEC_ERROR_VC1_WDTIMER_EXPIRED = (0xDEC20009) +NVC9B0_DEC_ERROR_VC1_ERRINTSTART = (0xDEC20010) +NVC9B0_DEC_ERROR_VC1_IQT_ERRINT = (0xDEC20011) +NVC9B0_DEC_ERROR_VC1_MC_ERRINT = (0xDEC20012) +NVC9B0_DEC_ERROR_VC1_MC_IQT_ERRINT = (0xDEC20013) +NVC9B0_DEC_ERROR_VC1_REC_ERRINT = (0xDEC20014) +NVC9B0_DEC_ERROR_VC1_REC_IQT_ERRINT = (0xDEC20015) +NVC9B0_DEC_ERROR_VC1_REC_MC_ERRINT = (0xDEC20016) +NVC9B0_DEC_ERROR_VC1_REC_MC_IQT_ERRINT = (0xDEC20017) +NVC9B0_DEC_ERROR_VC1_DBF_ERRINT = (0xDEC20018) +NVC9B0_DEC_ERROR_VC1_DBF_IQT_ERRINT = (0xDEC20019) +NVC9B0_DEC_ERROR_VC1_DBF_MC_ERRINT = (0xDEC2001A) +NVC9B0_DEC_ERROR_VC1_DBF_MC_IQT_ERRINT = (0xDEC2001B) +NVC9B0_DEC_ERROR_VC1_DBF_REC_ERRINT = (0xDEC2001C) +NVC9B0_DEC_ERROR_VC1_DBF_REC_IQT_ERRINT = (0xDEC2001D) +NVC9B0_DEC_ERROR_VC1_DBF_REC_MC_ERRINT = (0xDEC2001E) +NVC9B0_DEC_ERROR_VC1_DBF_REC_MC_IQT_ERRINT = (0xDEC2001F) +NVC9B0_DEC_ERROR_VC1_PICTURE_INIT = (0xDEC20100) +NVC9B0_DEC_ERROR_VC1_STATEMACHINE_FAILURE = (0xDEC20101) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_PIC = (0xDEC20901) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_UCODE = (0xDEC20902) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_FC = (0xDEC20903) +NVC9B0_DEC_ERROR_VC1_INVAILD_CTXID_SLH = (0xDEC20904) +NVC9B0_DEC_ERROR_VC1_INVALID_UCODE_SIZE = (0xDEC20905) +NVC9B0_DEC_ERROR_VC1_INVALID_SLICE_COUNT = (0xDEC20906) +NVC9B0_DEC_ERROR_H264_APPTIMER_EXPIRED = (0xDEC30001) +NVC9B0_DEC_ERROR_H264_MVTIMER_EXPIRED = (0xDEC30002) +NVC9B0_DEC_ERROR_H264_INVALID_TOKEN = (0xDEC30003) +NVC9B0_DEC_ERROR_H264_SLICEDATA_MISSING = (0xDEC30004) +NVC9B0_DEC_ERROR_H264_HWERR_INTERRUPT = (0xDEC30005) +NVC9B0_DEC_ERROR_H264_DETECTED_VLD_FAILURE = (0xDEC30006) +NVC9B0_DEC_ERROR_H264_ERRINTSTART = (0xDEC30010) +NVC9B0_DEC_ERROR_H264_IQT_ERRINT = (0xDEC30011) +NVC9B0_DEC_ERROR_H264_MC_ERRINT = (0xDEC30012) +NVC9B0_DEC_ERROR_H264_MC_IQT_ERRINT = (0xDEC30013) +NVC9B0_DEC_ERROR_H264_REC_ERRINT = (0xDEC30014) +NVC9B0_DEC_ERROR_H264_REC_IQT_ERRINT = (0xDEC30015) +NVC9B0_DEC_ERROR_H264_REC_MC_ERRINT = (0xDEC30016) +NVC9B0_DEC_ERROR_H264_REC_MC_IQT_ERRINT = (0xDEC30017) +NVC9B0_DEC_ERROR_H264_DBF_ERRINT = (0xDEC30018) +NVC9B0_DEC_ERROR_H264_DBF_IQT_ERRINT = (0xDEC30019) +NVC9B0_DEC_ERROR_H264_DBF_MC_ERRINT = (0xDEC3001A) +NVC9B0_DEC_ERROR_H264_DBF_MC_IQT_ERRINT = (0xDEC3001B) +NVC9B0_DEC_ERROR_H264_DBF_REC_ERRINT = (0xDEC3001C) +NVC9B0_DEC_ERROR_H264_DBF_REC_IQT_ERRINT = (0xDEC3001D) +NVC9B0_DEC_ERROR_H264_DBF_REC_MC_ERRINT = (0xDEC3001E) +NVC9B0_DEC_ERROR_H264_DBF_REC_MC_IQT_ERRINT = (0xDEC3001F) +NVC9B0_DEC_ERROR_H264_PICTURE_INIT = (0xDEC30100) +NVC9B0_DEC_ERROR_H264_STATEMACHINE_FAILURE = (0xDEC30101) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_PIC = (0xDEC30901) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_UCODE = (0xDEC30902) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_FC = (0xDEC30903) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_SLH = (0xDEC30904) +NVC9B0_DEC_ERROR_H264_INVALID_UCODE_SIZE = (0xDEC30905) +NVC9B0_DEC_ERROR_H264_INVALID_SLICE_COUNT = (0xDEC30906) +NVC9B0_DEC_ERROR_MPEG4_APPTIMER_EXPIRED = (0xDEC40001) +NVC9B0_DEC_ERROR_MPEG4_MVTIMER_EXPIRED = (0xDEC40002) +NVC9B0_DEC_ERROR_MPEG4_INVALID_TOKEN = (0xDEC40003) +NVC9B0_DEC_ERROR_MPEG4_SLICEDATA_MISSING = (0xDEC40004) +NVC9B0_DEC_ERROR_MPEG4_HWERR_INTERRUPT = (0xDEC40005) +NVC9B0_DEC_ERROR_MPEG4_DETECTED_VLD_FAILURE = (0xDEC40006) +NVC9B0_DEC_ERROR_MPEG4_TIMEOUT_POLLING_FOR_DATA = (0xDEC40007) +NVC9B0_DEC_ERROR_MPEG4_PDEC_PIC_END_UNALIGNED = (0xDEC40008) +NVC9B0_DEC_ERROR_MPEG4_WDTIMER_EXPIRED = (0xDEC40009) +NVC9B0_DEC_ERROR_MPEG4_ERRINTSTART = (0xDEC40010) +NVC9B0_DEC_ERROR_MPEG4_IQT_ERRINT = (0xDEC40011) +NVC9B0_DEC_ERROR_MPEG4_MC_ERRINT = (0xDEC40012) +NVC9B0_DEC_ERROR_MPEG4_MC_IQT_ERRINT = (0xDEC40013) +NVC9B0_DEC_ERROR_MPEG4_REC_ERRINT = (0xDEC40014) +NVC9B0_DEC_ERROR_MPEG4_REC_IQT_ERRINT = (0xDEC40015) +NVC9B0_DEC_ERROR_MPEG4_REC_MC_ERRINT = (0xDEC40016) +NVC9B0_DEC_ERROR_MPEG4_REC_MC_IQT_ERRINT = (0xDEC40017) +NVC9B0_DEC_ERROR_MPEG4_DBF_ERRINT = (0xDEC40018) +NVC9B0_DEC_ERROR_MPEG4_DBF_IQT_ERRINT = (0xDEC40019) +NVC9B0_DEC_ERROR_MPEG4_DBF_MC_ERRINT = (0xDEC4001A) +NVC9B0_DEC_ERROR_MPEG4_DBF_MC_IQT_ERRINT = (0xDEC4001B) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_ERRINT = (0xDEC4001C) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_IQT_ERRINT = (0xDEC4001D) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_MC_ERRINT = (0xDEC4001E) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_MC_IQT_ERRINT = (0xDEC4001F) +NVC9B0_DEC_ERROR_MPEG4_PICTURE_INIT = (0xDEC40100) +NVC9B0_DEC_ERROR_MPEG4_STATEMACHINE_FAILURE = (0xDEC40101) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_PIC = (0xDEC40901) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_UCODE = (0xDEC40902) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_FC = (0xDEC40903) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_SLH = (0xDEC40904) +NVC9B0_DEC_ERROR_MPEG4_INVALID_UCODE_SIZE = (0xDEC40905) +NVC9B0_DEC_ERROR_MPEG4_INVALID_SLICE_COUNT = (0xDEC40906) +NVC6C0_QMDV02_03_OUTER_PUT = (30, 0) +NVC6C0_QMDV02_03_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV02_03_OUTER_GET = (62, 32) +NVC6C0_QMDV02_03_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV02_03_INNER_GET = (94, 64) +NVC6C0_QMDV02_03_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV02_03_INNER_PUT = (126, 96) +NVC6C0_QMDV02_03_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV02_03_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV02_03_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV02_03_IS_QUEUE = (136, 136) +NVC6C0_QMDV02_03_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0 = (138, 138) +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0_TRUE = 0x00000001 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1 = (139, 139) +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1_TRUE = 0x00000001 +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE = (141, 141) +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE = (142, 142) +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE_QUEUE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE_GRID = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY = (143, 143) +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY_FALSE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY_TRUE = 0x00000001 +NVC6C0_QMDV02_03_QMD_RESERVED_B = (159, 144) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV02_03_QMD_RESERVED_C = (185, 185) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV02_03_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV02_03_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV02_03_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE = (366, 366) +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV02_03_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV02_03_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV02_03_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV02_03_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV02_03_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV02_03_QMD_RESERVED13A = (447, 432) +NVC6C0_QMDV02_03_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV02_03_QMD_RESERVED14A = (479, 464) +NVC6C0_QMDV02_03_DEPENDENT_QMD_POINTER = (511, 480) +NVC6C0_QMDV02_03_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV02_03_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV02_03_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV02_03_MIN_SM_CONFIG_SHARED_MEM_SIZE = (568, 562) +NVC6C0_QMDV02_03_MAX_SM_CONFIG_SHARED_MEM_SIZE = (575, 569) +NVC6C0_QMDV02_03_QMD_VERSION = (579, 576) +NVC6C0_QMDV02_03_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV02_03_QMD_RESERVED_H = (591, 584) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_03_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV02_03_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (663, 657) +NVC6C0_QMDV02_03_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV02_03_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV02_03_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV02_03_RELEASE0_ADDRESS_LOWER = (767, 736) +NVC6C0_QMDV02_03_RELEASE0_ADDRESS_UPPER = (775, 768) +NVC6C0_QMDV02_03_QMD_RESERVED_J = (783, 776) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP = (790, 788) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_03_QMD_RESERVED_K = (791, 791) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT = (793, 792) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE = (794, 794) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE = (799, 799) +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_PAYLOAD = (831, 800) +NVC6C0_QMDV02_03_RELEASE1_ADDRESS_LOWER = (863, 832) +NVC6C0_QMDV02_03_RELEASE1_ADDRESS_UPPER = (871, 864) +NVC6C0_QMDV02_03_QMD_RESERVED_L = (879, 872) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP = (886, 884) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_03_QMD_RESERVED_M = (887, 887) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT = (889, 888) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE = (890, 890) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE = (895, 895) +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_PAYLOAD = (927, 896) +NVC6C0_QMDV02_03_SHADER_LOCAL_MEMORY_LOW_SIZE = (951, 928) +NVC6C0_QMDV02_03_QMD_RESERVED_N = (954, 952) +NVC6C0_QMDV02_03_BARRIER_COUNT = (959, 955) +NVC6C0_QMDV02_03_SHADER_LOCAL_MEMORY_HIGH_SIZE = (983, 960) +NVC6C0_QMDV02_03_REGISTER_COUNT = (991, 984) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1000, 992) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_SIZE = (1009, 1001) +NVC6C0_QMDV02_03_QMD_RESERVED_A = (1015, 1010) +NVC6C0_QMDV02_03_SASS_VERSION = (1023, 1016) +NVC6C0_QMDV02_03_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV02_03_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV02_03_QMD_RESERVED_S = (1599, 1585) +NVC6C0_QMDV02_03_HW_ONLY_INNER_GET = (1630, 1600) +NVC6C0_QMDV02_03_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1631, 1631) +NVC6C0_QMDV02_03_HW_ONLY_INNER_PUT = (1662, 1632) +NVC6C0_QMDV02_03_HW_ONLY_SCG_TYPE = (1663, 1663) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1693, 1664) +NVC6C0_QMDV02_03_QMD_RESERVED_Q = (1694, 1694) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1695, 1695) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_03_HW_ONLY_SKED_NEXT_QMD_POINTER = (1727, 1696) +NVC6C0_QMDV02_03_QMD_SPARE_G = (1759, 1728) +NVC6C0_QMDV02_03_QMD_SPARE_H = (1791, 1760) +NVC6C0_QMDV02_03_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV02_03_QMD_SPARE_J = (1855, 1824) +NVC6C0_QMDV02_03_QMD_SPARE_K = (1887, 1856) +NVC6C0_QMDV02_03_QMD_SPARE_L = (1919, 1888) +NVC6C0_QMDV02_03_QMD_SPARE_M = (1951, 1920) +NVC6C0_QMDV02_03_QMD_SPARE_N = (1983, 1952) +NVC6C0_QMDV02_03_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV02_03_DEBUG_ID_LOWER = (2047, 2016) +NVC6C0_QMDV02_04_OUTER_PUT = (30, 0) +NVC6C0_QMDV02_04_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV02_04_OUTER_GET = (62, 32) +NVC6C0_QMDV02_04_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV02_04_INNER_GET = (94, 64) +NVC6C0_QMDV02_04_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV02_04_INNER_PUT = (126, 96) +NVC6C0_QMDV02_04_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV02_04_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV02_04_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV02_04_IS_QUEUE = (136, 136) +NVC6C0_QMDV02_04_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0 = (138, 138) +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0_TRUE = 0x00000001 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1 = (139, 139) +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1_TRUE = 0x00000001 +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE = (141, 141) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION = (144, 142) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH = (145, 145) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE = (146, 146) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION = (149, 147) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH = (150, 150) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENCE_COUNTER = (157, 151) +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION = (158, 158) +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVC6C0_QMDV02_04_QMD_RESERVED_B = (159, 159) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV02_04_DEMOTE_L2_EVICT_LAST = (185, 185) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV02_04_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV02_04_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV02_04_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE = (366, 366) +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV02_04_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV02_04_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV02_04_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE = (383, 383) +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV02_04_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV02_04_QMD_RESERVED13A = (447, 432) +NVC6C0_QMDV02_04_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV02_04_QMD_RESERVED14A = (479, 464) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_POINTER = (511, 480) +NVC6C0_QMDV02_04_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV02_04_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV02_04_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV02_04_MIN_SM_CONFIG_SHARED_MEM_SIZE = (568, 562) +NVC6C0_QMDV02_04_MAX_SM_CONFIG_SHARED_MEM_SIZE = (575, 569) +NVC6C0_QMDV02_04_QMD_VERSION = (579, 576) +NVC6C0_QMDV02_04_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV02_04_QMD_RESERVED_H = (591, 584) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_04_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV02_04_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (663, 657) +NVC6C0_QMDV02_04_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV02_04_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV02_04_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV02_04_RELEASE0_ADDRESS_LOWER = (767, 736) +NVC6C0_QMDV02_04_RELEASE0_ADDRESS_UPPER = (775, 768) +NVC6C0_QMDV02_04_QMD_RESERVED_J = (783, 776) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP = (790, 788) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_04_QMD_RESERVED_K = (791, 791) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT = (793, 792) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE = (794, 794) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE = (799, 799) +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_PAYLOAD = (831, 800) +NVC6C0_QMDV02_04_RELEASE1_ADDRESS_LOWER = (863, 832) +NVC6C0_QMDV02_04_RELEASE1_ADDRESS_UPPER = (871, 864) +NVC6C0_QMDV02_04_QMD_RESERVED_L = (879, 872) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP = (886, 884) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_04_QMD_RESERVED_M = (887, 887) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT = (889, 888) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE = (890, 890) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE = (895, 895) +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_PAYLOAD = (927, 896) +NVC6C0_QMDV02_04_SHADER_LOCAL_MEMORY_LOW_SIZE = (951, 928) +NVC6C0_QMDV02_04_QMD_RESERVED_N = (954, 952) +NVC6C0_QMDV02_04_BARRIER_COUNT = (959, 955) +NVC6C0_QMDV02_04_SHADER_LOCAL_MEMORY_HIGH_SIZE = (983, 960) +NVC6C0_QMDV02_04_QMD_RESERVED_G = (991, 984) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1000, 992) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_SIZE = (1009, 1001) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE = (1011, 1010) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVC6C0_QMDV02_04_QMD_RESERVED_A = (1015, 1012) +NVC6C0_QMDV02_04_SASS_VERSION = (1023, 1016) +NVC6C0_QMDV02_04_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV02_04_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV02_04_QMD_RESERVED_S = (1599, 1585) +NVC6C0_QMDV02_04_HW_ONLY_INNER_GET = (1630, 1600) +NVC6C0_QMDV02_04_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1631, 1631) +NVC6C0_QMDV02_04_HW_ONLY_INNER_PUT = (1662, 1632) +NVC6C0_QMDV02_04_HW_ONLY_SCG_TYPE = (1663, 1663) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1693, 1664) +NVC6C0_QMDV02_04_QMD_RESERVED_Q = (1694, 1694) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1695, 1695) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_04_HW_ONLY_SKED_NEXT_QMD_POINTER = (1727, 1696) +NVC6C0_QMDV02_04_HW_ONLY_DEPENDENCE_COUNTER = (1734, 1728) +NVC6C0_QMDV02_04_QMD_RESERVED_I = (1759, 1735) +NVC6C0_QMDV02_04_QMD_SPARE_H = (1791, 1760) +NVC6C0_QMDV02_04_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV02_04_QMD_SPARE_J = (1855, 1824) +NVC6C0_QMDV02_04_QMD_SPARE_K = (1887, 1856) +NVC6C0_QMDV02_04_QMD_SPARE_L = (1919, 1888) +NVC6C0_QMDV02_04_QMD_SPARE_M = (1951, 1920) +NVC6C0_QMDV02_04_QMD_SPARE_N = (1983, 1952) +NVC6C0_QMDV02_04_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV02_04_DEBUG_ID_LOWER = (2047, 2016) +NVC6C0_QMDV03_00_OUTER_PUT = (30, 0) +NVC6C0_QMDV03_00_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV03_00_OUTER_GET = (62, 32) +NVC6C0_QMDV03_00_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV03_00_INNER_GET = (94, 64) +NVC6C0_QMDV03_00_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV03_00_INNER_PUT = (126, 96) +NVC6C0_QMDV03_00_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV03_00_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV03_00_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV03_00_IS_QUEUE = (136, 136) +NVC6C0_QMDV03_00_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04A = (139, 138) +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04B = (141, 141) +NVC6C0_QMDV03_00_DEPENDENCE_COUNTER = (157, 142) +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION = (158, 158) +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04C = (159, 159) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV03_00_DEMOTE_L2_EVICT_LAST = (185, 185) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV03_00_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV03_00_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV03_00_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV03_00_QMD_RESERVED11A = (366, 366) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED11B = (377, 372) +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED11C = (381, 379) +NVC6C0_QMDV03_00_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV03_00_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV03_00_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE = (383, 383) +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV03_00_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV03_00_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_POINTER = (511, 480) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE = (512, 512) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION = (515, 513) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH = (516, 516) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE = (517, 517) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION = (520, 518) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH = (521, 521) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV03_00_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV03_00_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV03_00_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV03_00_MIN_SM_CONFIG_SHARED_MEM_SIZE = (567, 562) +NVC6C0_QMDV03_00_QMD_RESERVED17A = (568, 568) +NVC6C0_QMDV03_00_MAX_SM_CONFIG_SHARED_MEM_SIZE = (574, 569) +NVC6C0_QMDV03_00_QMD_RESERVED17B = (575, 575) +NVC6C0_QMDV03_00_QMD_VERSION = (579, 576) +NVC6C0_QMDV03_00_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV03_00_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV03_00_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (662, 657) +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE = (663, 663) +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV03_00_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV03_00_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV03_00_SHADER_LOCAL_MEMORY_LOW_SIZE = (759, 736) +NVC6C0_QMDV03_00_BARRIER_COUNT = (767, 763) +NVC6C0_QMDV03_00_RELEASE0_ADDRESS_LOWER = (799, 768) +NVC6C0_QMDV03_00_RELEASE0_ADDRESS_UPPER = (807, 800) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED25A = (818, 808) +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE = (819, 819) +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP = (822, 820) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE0_ENABLE = (823, 823) +NVC6C0_QMDV03_00_RELEASE0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT = (825, 824) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE = (826, 826) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE = (828, 827) +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B = (829, 829) +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE = (831, 830) +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD_LOWER = (863, 832) +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD_UPPER = (895, 864) +NVC6C0_QMDV03_00_RELEASE1_ADDRESS_LOWER = (927, 896) +NVC6C0_QMDV03_00_RELEASE1_ADDRESS_UPPER = (935, 928) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED29A = (946, 936) +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE = (947, 947) +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP = (950, 948) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE1_ENABLE = (951, 951) +NVC6C0_QMDV03_00_RELEASE1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT = (953, 952) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE = (954, 954) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE = (956, 955) +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B = (957, 957) +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE = (959, 958) +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD_LOWER = (991, 960) +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD_UPPER = (1023, 992) +NVC6C0_QMDV03_00_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV03_00_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV03_00_SHADER_LOCAL_MEMORY_HIGH_SIZE = (1623, 1600) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1640, 1632) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_SIZE = (1649, 1641) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE = (1651, 1650) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVC6C0_QMDV03_00_SASS_VERSION = (1663, 1656) +NVC6C0_QMDV03_00_RELEASE2_ADDRESS_LOWER = (1695, 1664) +NVC6C0_QMDV03_00_RELEASE2_ADDRESS_UPPER = (1703, 1696) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED53A = (1714, 1704) +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE = (1715, 1715) +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP = (1718, 1716) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE2_ENABLE = (1719, 1719) +NVC6C0_QMDV03_00_RELEASE2_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT = (1721, 1720) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE = (1722, 1722) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE = (1724, 1723) +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B = (1725, 1725) +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE = (1727, 1726) +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD_LOWER = (1759, 1728) +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD_UPPER = (1791, 1760) +NVC6C0_QMDV03_00_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV03_00_HW_ONLY_INNER_GET = (1854, 1824) +NVC6C0_QMDV03_00_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1855, 1855) +NVC6C0_QMDV03_00_HW_ONLY_INNER_PUT = (1886, 1856) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1917, 1888) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1919, 1919) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV03_00_HW_ONLY_SKED_NEXT_QMD_POINTER = (1951, 1920) +NVC6C0_QMDV03_00_HW_ONLY_DEPENDENCE_COUNTER = (1958, 1952) +NVC6C0_QMDV03_00_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV03_00_DEBUG_ID_LOWER = (2047, 2016) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX = (29, 0) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (30, 30) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (31, 31) +NVCEC0_QMDV05_00_HW_ONLY_SKED_NEXT_QMD_POINTER = (63, 32) +NVCEC0_QMDV05_00_INNER_GET = (94, 64) +NVCEC0_QMDV05_00_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV05_00_INNER_PUT = (126, 96) +NVCEC0_QMDV05_00_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV05_00_DEPENDENCE_COUNTER = (143, 128) +NVCEC0_QMDV05_00_QMD_GROUP_ID = (149, 144) +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (150, 150) +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV05_00_QMD_TYPE = (153, 151) +NVCEC0_QMDV05_00_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV05_00_NUM_SUB_TASKS_PER_TASK = (157, 154) +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS = (158, 158) +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID = (159, 159) +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CIRCULAR_QUEUE_SIZE = (184, 160) +NVCEC0_QMDV05_00_HW_ONLY_DEPENDENCE_COUNTER = (207, 192) +NVCEC0_QMDV05_00_RESUME_SUB_TASK_ID = (210, 208) +NVCEC0_QMDV05_00_COMPLETED_SUB_TASK_MASK = (218, 211) +NVCEC0_QMDV05_00_GRID_WIDTH_RESUME = (255, 224) +NVCEC0_QMDV05_00_GRID_HEIGHT_RESUME = (271, 256) +NVCEC0_QMDV05_00_GRID_DEPTH_RESUME = (287, 272) +NVCEC0_QMDV05_00_RELEASE_ENABLE = lambda i: ((288+(i)*16), (288+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE0_ENABLE = NVCEC0_QMDV05_00_RELEASE_ENABLE(0) +NVCEC0_QMDV05_00_RELEASE1_ENABLE = NVCEC0_QMDV05_00_RELEASE_ENABLE(1) +NVCEC0_QMDV05_00_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE = lambda i: ((290+(i)*16), (289+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE = lambda i: ((291+(i)*16), (291+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE = lambda i: ((292+(i)*16), (292+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP = lambda i: ((295+(i)*16), (293+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT = lambda i: ((297+(i)*16), (296+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE = lambda i: ((299+(i)*16), (298+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B = lambda i: ((300+(i)*16), (300+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_RESERVED_INFO = lambda i: ((303+(i)*16), (301+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE = (336, 336) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION = (339, 337) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH = (340, 340) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION = (341, 341) +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST = (342, 342) +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE = (343, 343) +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE = (344, 344) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION = (347, 345) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH = (348, 348) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL = (349, 349) +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE = (350, 350) +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE = (351, 351) +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CORRELATION_ID = (383, 352) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_POINTER = (415, 384) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_POINTER = (447, 416) +NVCEC0_QMDV05_00_SASS_VERSION = (455, 448) +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT = (456, 456) +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV05_00_SAMPLER_INDEX = (457, 457) +NVCEC0_QMDV05_00_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV05_00_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BANK_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (463, 458) +NVCEC0_QMDV05_00_QMD_MINOR_VERSION = (467, 464) +NVCEC0_QMDV05_00_QMD_MAJOR_VERSION = (471, 468) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE = (472, 472) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE = (473, 473) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE = (474, 474) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE = (475, 475) +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE = (476, 476) +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE = (477, 477) +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (478, 478) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (479, 479) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_ADDR_LOWER = (511, 480) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_ADDR_UPPER = (536, 512) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (575, 544) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (607, 576) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (615, 608) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_ID = (621, 616) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE = (622, 622) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE = (623, 623) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE = (625, 624) +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE = (626, 626) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CTA_LAUNCH_QUEUE = (627, 627) +NVCEC0_QMDV05_00_FREE_CTA_SLOTS_EMPTY_SM = (635, 628) +NVCEC0_QMDV05_00_SYNC_DOMAIN_ID = (637, 636) +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH = (638, 638) +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT = (639, 639) +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_ID = (671, 640) +NVCEC0_QMDV05_00_WAIT_ON_LATCH_ID = (703, 672) +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_SHARED_MEM = (721, 714) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_SHARED_MEM = (729, 722) +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID = (730, 730) +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID = (731, 731) +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE = (732, 732) +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE = (733, 733) +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE = (734, 734) +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE = (735, 735) +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_WARP = (743, 736) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_WARP = (751, 744) +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_REGISTER = (759, 752) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_REGISTER = (767, 760) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_ADDR_LOWER = (799, 768) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_ADDR_UPPER = (824, 800) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_PAYLOAD_LOWER = (863, 832) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_PAYLOAD_UPPER = (895, 864) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_ADDR_LOWER = (927, 896) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_ADDR_UPPER = (952, 928) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_PAYLOAD_LOWER = (991, 960) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_PAYLOAD_UPPER = (1023, 992) +NVCEC0_QMDV05_00_PROGRAM_ADDRESS_LOWER_SHIFTED4 = (1055, 1024) +NVCEC0_QMDV05_00_PROGRAM_ADDRESS_UPPER_SHIFTED4 = (1076, 1056) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_SIZE = (1085, 1077) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE = (1087, 1086) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION0 = (1103, 1088) +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION1 = (1119, 1104) +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION2 = (1127, 1120) +NVCEC0_QMDV05_00_REGISTER_COUNT = (1136, 1128) +NVCEC0_QMDV05_00_BARRIER_COUNT = (1141, 1137) +NVCEC0_QMDV05_00_ICC_PREFETCH_SIZE = (1147, 1142) +NVCEC0_QMDV05_00_SHARED_MEMORY_SIZE_SHIFTED7 = (1162, 1152) +NVCEC0_QMDV05_00_MIN_SM_CONFIG_SHARED_MEM_SIZE = (1168, 1163) +NVCEC0_QMDV05_00_MAX_SM_CONFIG_SHARED_MEM_SIZE = (1174, 1169) +NVCEC0_QMDV05_00_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (1180, 1175) +NVCEC0_QMDV05_00_SHARED_MEM_BARRIER_INIT_ENABLE = (1181, 1181) +NVCEC0_QMDV05_00_SHADER_LOCAL_MEMORY_LOW_SIZE_SHIFTED4 = (1199, 1184) +NVCEC0_QMDV05_00_SHADER_LOCAL_MEMORY_HIGH_SIZE_SHIFTED4 = (1215, 1200) +NVCEC0_QMDV05_00_VIRTUAL_RESOURCE_COUNT = (1223, 1216) +NVCEC0_QMDV05_00_GRID_WIDTH = (1279, 1248) +NVCEC0_QMDV05_00_GRID_HEIGHT = (1295, 1280) +NVCEC0_QMDV05_00_GRID_DEPTH = (1327, 1312) +NVCEC0_QMDV05_00_CONSTANT_BUFFER_ADDR_LOWER_SHIFTED6 = lambda i: ((1375+(i)*64), (1344+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_ADDR_UPPER_SHIFTED6 = lambda i: ((1394+(i)*64), (1376+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1407+(i)*64), (1395+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID = lambda i: ((1856+(i)*4), (1856+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH = lambda i: ((1858+(i)*4), (1857+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1859+(i)*4), (1859+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (1919, 1888) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1936, 1920) +NVCEC0_QMDV05_00_GPC_CGA_WIDTH = (2053, 2048) +NVCEC0_QMDV05_00_GPC_CGA_HEIGHT = (2061, 2056) +NVCEC0_QMDV05_00_GPC_CGA_DEPTH = (2069, 2064) +NVCEC0_QMDV05_00_LARGE_GPC_CGA_WIDTH_MINUS_ONE = (2075, 2072) +NVCEC0_QMDV05_00_LARGE_GPC_CGA_HEIGHT_MINUS_ONE = (2079, 2076) +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE = (2111, 2111) +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE_LOAD_BALANCING = 0x00000000 +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE_MULTI_CAST = 0x00000001 +NVCEC0_QMDV05_00_GPU_CGA_WIDTH = (2127, 2112) +NVCEC0_QMDV05_00_GPU_CGA_HEIGHT = (2143, 2128) +NVCEC0_QMDV05_00_GPU_CGA_DEPTH = (2159, 2144) +NVCEC0_QMDV05_00_DEBUG_ID_LOWER = (2207, 2176) +NVCEC0_QMDV05_00_DEBUG_ID_UPPER = (2239, 2208) +NVCEC0_QMDV05_00_TPC_DISABLE_MASK = lambda i: ((2271+(i)*32), (2240+(i)*32)) # type: ignore +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_WIDTH_RESUME = (2527, 2496) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_HEIGHT_RESUME = (2543, 2528) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_DEPTH_RESUME = (2559, 2544) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_OFFSET_WIDTH_RESUME = (2563, 2560) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_OFFSET_HEIGHT_RESUME = (2567, 2564) +NVCEC0_QMDV05_00_QUEUE_ENTRIES_PER_CTA_LOG2 = (2596, 2592) +NVCEC0_QMDV05_00_HW_ONLY_INNER_GET = (2654, 2624) +NVCEC0_QMDV05_00_HW_ONLY_INNER_PUT = (2686, 2656) +NVCEC0_QMDV05_00_OUTER_PUT = (3038, 3008) +NVCEC0_QMDV05_00_OUTER_OVERFLOW = (3039, 3039) +NVCEC0_QMDV05_00_OUTER_GET = (3070, 3040) +NVCEC0_QMDV05_00_OUTER_STICKY_OVERFLOW = (3071, 3071) +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE = lambda i: ((336+(i)*8), (336+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION = lambda i: ((339+(i)*8), (337+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH = lambda i: ((340+(i)*8), (340+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_POINTER = lambda i: ((415+(i)*32), (384+(i)*32)) # type: ignore +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX = (29, 0) +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (30, 30) +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (31, 31) +NVCEC0_QMDV05_01_HW_ONLY_SKED_NEXT_QMD_POINTER = (63, 32) +NVCEC0_QMDV05_01_INNER_GET = (94, 64) +NVCEC0_QMDV05_01_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV05_01_INNER_PUT = (126, 96) +NVCEC0_QMDV05_01_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV05_01_DEPENDENCE_COUNTER = (143, 128) +NVCEC0_QMDV05_01_QMD_GROUP_ID = (149, 144) +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (150, 150) +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV05_01_QMD_TYPE = (153, 151) +NVCEC0_QMDV05_01_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV05_01_NUM_SUB_TASKS_PER_TASK = (157, 154) +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS = (158, 158) +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID = (159, 159) +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CIRCULAR_QUEUE_SIZE = (184, 160) +NVCEC0_QMDV05_01_HW_ONLY_DEPENDENCE_COUNTER = (207, 192) +NVCEC0_QMDV05_01_RESUME_SUB_TASK_ID = (210, 208) +NVCEC0_QMDV05_01_COMPLETED_SUB_TASK_MASK = (218, 211) +NVCEC0_QMDV05_01_GRID_WIDTH_RESUME = (255, 224) +NVCEC0_QMDV05_01_GRID_HEIGHT_RESUME = (271, 256) +NVCEC0_QMDV05_01_GRID_DEPTH_RESUME = (287, 272) +NVCEC0_QMDV05_01_RELEASE_ENABLE = lambda i: ((288+(i)*16), (288+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE = lambda i: ((290+(i)*16), (289+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE = lambda i: ((291+(i)*16), (291+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE = lambda i: ((292+(i)*16), (292+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP = lambda i: ((295+(i)*16), (293+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT = lambda i: ((297+(i)*16), (296+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE = lambda i: ((299+(i)*16), (298+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B = lambda i: ((300+(i)*16), (300+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_RESERVED_INFO = lambda i: ((303+(i)*16), (301+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE = (336, 336) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION = (339, 337) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH = (340, 340) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION = (341, 341) +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST = (342, 342) +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE = (343, 343) +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE = (344, 344) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION = (347, 345) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH = (348, 348) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL = (349, 349) +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE = (350, 350) +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE = (351, 351) +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CORRELATION_ID = (383, 352) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_POINTER = (415, 384) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_POINTER = (447, 416) +NVCEC0_QMDV05_01_SASS_VERSION = (455, 448) +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT = (456, 456) +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV05_01_SAMPLER_INDEX = (457, 457) +NVCEC0_QMDV05_01_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV05_01_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV05_01_CONSTANT_BANK_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (463, 458) +NVCEC0_QMDV05_01_QMD_MINOR_VERSION = (467, 464) +NVCEC0_QMDV05_01_QMD_MAJOR_VERSION = (471, 468) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE = (472, 472) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE = (473, 473) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE = (474, 474) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE = (475, 475) +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE = (476, 476) +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE = (477, 477) +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (478, 478) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (479, 479) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_ADDR_LOWER = (511, 480) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_ADDR_UPPER = (536, 512) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (575, 544) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (607, 576) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (615, 608) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_ID = (621, 616) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE = (622, 622) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE = (623, 623) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE = (625, 624) +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE = (626, 626) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CTA_LAUNCH_QUEUE = (627, 627) +NVCEC0_QMDV05_01_FREE_CTA_SLOTS_EMPTY_SM = (635, 628) +NVCEC0_QMDV05_01_SYNC_DOMAIN_ID = (637, 636) +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH = (638, 638) +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT = (639, 639) +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_ID = (671, 640) +NVCEC0_QMDV05_01_WAIT_ON_LATCH_ID = (703, 672) +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_SHARED_MEM = (721, 714) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_SHARED_MEM = (729, 722) +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID = (730, 730) +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID = (731, 731) +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE = (732, 732) +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE = (733, 733) +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE = (734, 734) +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE = (735, 735) +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_WARP = (743, 736) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_WARP = (751, 744) +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_REGISTER = (759, 752) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_REGISTER = (767, 760) +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_ADDRESS_LOWER_SHIFTED4 = lambda i: ((799+(i)*416), (768+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_ADDRESS_UPPER_SHIFTED4 = lambda i: ((820+(i)*416), (800+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_SIZE = lambda i: ((829+(i)*416), (821+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE = lambda i: ((831+(i)*416), (830+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION0 = lambda i: ((847+(i)*416), (832+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION1 = lambda i: ((863+(i)*416), (848+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION2 = lambda i: ((871+(i)*416), (864+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_REGISTER_COUNT = lambda i: ((880+(i)*416), (872+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_BARRIER_COUNT = lambda i: ((885+(i)*416), (881+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID = lambda i: ((886+(i)*416), (886+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH = lambda i: ((888+(i)*416), (887+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE = lambda i: ((889+(i)*416), (889+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_ICC_PREFETCH_SIZE = lambda i: ((895+(i)*416), (890+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHARED_MEMORY_SIZE_SHIFTED7 = lambda i: ((906+(i)*416), (896+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_MIN_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((912+(i)*416), (907+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_MAX_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((918+(i)*416), (913+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_TARGET_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((924+(i)*416), (919+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHARED_MEM_BARRIER_INIT_ENABLE = lambda i: ((925+(i)*416), (925+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHADER_LOCAL_MEMORY_LOW_SIZE_SHIFTED4 = lambda i: ((943+(i)*416), (928+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHADER_LOCAL_MEMORY_HIGH_SIZE_SHIFTED4 = lambda i: ((959+(i)*416), (944+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_ADDR_LOWER_SHIFTED6 = lambda i: ((991+(i)*416), (960+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_ADDR_UPPER_SHIFTED6 = lambda i: ((1010+(i)*416), (992+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_SIZE_SHIFTED4 = lambda i: ((1023+(i)*416), (1011+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_ADDR_LOWER_SHIFTED6 = lambda i: ((1055+(i)*416), (1024+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_ADDR_UPPER_SHIFTED6 = lambda i: ((1074+(i)*416), (1056+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_SIZE_SHIFTED4 = lambda i: ((1087+(i)*416), (1075+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID = lambda i: ((1088+(i)*416), (1088+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH = lambda i: ((1090+(i)*416), (1089+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE = lambda i: ((1091+(i)*416), (1091+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_VIRTUAL_RESOURCE_COUNT = lambda i: ((1099+(i)*416), (1092+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_WIDTH = lambda i: ((1151+(i)*416), (1120+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_HEIGHT = lambda i: ((1167+(i)*416), (1152+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_DEPTH = lambda i: ((1183+(i)*416), (1168+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE = lambda i: ((336+(i)*8), (336+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION = lambda i: ((339+(i)*8), (337+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH = lambda i: ((340+(i)*8), (340+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_POINTER = lambda i: ((415+(i)*32), (384+(i)*32)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID = lambda i,j: ((886+(i)*416+(j)*202), (886+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH = lambda i,j: ((888+(i)*416+(j)*202), (887+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE = lambda i,j: ((889+(i)*416+(j)*202), (889+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_ADDR_LOWER_SHIFTED6 = lambda i,j: ((991+(i)*416+(j)*64), (960+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_ADDR_UPPER_SHIFTED6 = lambda i,j: ((1010+(i)*416+(j)*64), (992+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_SIZE_SHIFTED4 = lambda i,j: ((1023+(i)*416+(j)*64), (1011+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENCE_COUNTER = (15, 0) +NVCEC0_QMDV04_01_QMD_GROUP_ID = (21, 16) +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (22, 22) +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV04_01_QMD_TYPE = (25, 23) +NVCEC0_QMDV04_01_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV04_01_ARRIVE_AT_LATCH_VALID = (28, 28) +NVCEC0_QMDV04_01_WAIT_ON_LATCH_VALID = (29, 29) +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS = (30, 30) +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID = (31, 31) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CIRCULAR_QUEUE_SIZE = (56, 32) +NVCEC0_QMDV04_01_INNER_GET = (94, 64) +NVCEC0_QMDV04_01_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV04_01_INNER_PUT = (126, 96) +NVCEC0_QMDV04_01_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV04_01_HW_ONLY_INNER_GET = (190, 160) +NVCEC0_QMDV04_01_HW_ONLY_INNER_PUT = (222, 192) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX = (253, 224) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (254, 254) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_HW_ONLY_SKED_NEXT_QMD_POINTER = (287, 256) +NVCEC0_QMDV04_01_HW_ONLY_DEPENDENCE_COUNTER = (303, 288) +NVCEC0_QMDV04_01_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (304, 304) +NVCEC0_QMDV04_01_RELEASE_ENABLE = lambda i: ((320+(i)*16), (320+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE = lambda i: ((322+(i)*16), (321+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE = lambda i: ((323+(i)*16), (323+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE = lambda i: ((324+(i)*16), (324+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP = lambda i: ((327+(i)*16), (325+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT = lambda i: ((329+(i)*16), (328+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE = lambda i: ((331+(i)*16), (330+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B = lambda i: ((332+(i)*16), (332+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_RESERVED_INFO = lambda i: ((335+(i)*16), (333+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE = lambda i: ((368+(i)*5), (368+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION = lambda i: ((371+(i)*5), (369+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH = lambda i: ((372+(i)*5), (372+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION = (378, 378) +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST = (379, 379) +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE = (380, 380) +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL = (381, 381) +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE = (382, 382) +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CORRELATION_ID = (415, 384) +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID = lambda i: ((416+(i)*4), (416+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH = lambda i: ((418+(i)*4), (417+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE = lambda i: ((419+(i)*4), (419+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD0_POINTER = (479, 448) +NVCEC0_QMDV04_01_DEPENDENT_QMD1_POINTER = (511, 480) +NVCEC0_QMDV04_01_SHADER_LOCAL_MEMORY_LOW_SIZE = (535, 512) +NVCEC0_QMDV04_01_SASS_VERSION = (543, 536) +NVCEC0_QMDV04_01_SHADER_LOCAL_MEMORY_HIGH_SIZE = (567, 544) +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT = (568, 568) +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV04_01_SAMPLER_INDEX = (569, 569) +NVCEC0_QMDV04_01_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV04_01_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (575, 570) +NVCEC0_QMDV04_01_QMD_MINOR_VERSION = (579, 576) +NVCEC0_QMDV04_01_QMD_MAJOR_VERSION = (583, 580) +NVCEC0_QMDV04_01_SHARED_MEMORY_SIZE = (601, 584) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE = (602, 602) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE = (603, 603) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE = (604, 604) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE = (605, 605) +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE = (606, 606) +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE = (607, 607) +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_MIN_SM_CONFIG_SHARED_MEM_SIZE = (613, 608) +NVCEC0_QMDV04_01_MAX_SM_CONFIG_SHARED_MEM_SIZE = (619, 614) +NVCEC0_QMDV04_01_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (625, 620) +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE = (626, 626) +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_ADDR_LOWER = (671, 640) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_ADDR_UPPER = (696, 672) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (735, 704) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (767, 736) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_ADDR_LOWER = (799, 768) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_ADDR_UPPER = (824, 800) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_PAYLOAD_LOWER = (863, 832) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_PAYLOAD_UPPER = (895, 864) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_ADDR_LOWER = (927, 896) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_ADDR_UPPER = (952, 928) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_PAYLOAD_LOWER = (991, 960) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_PAYLOAD_UPPER = (1023, 992) +NVCEC0_QMDV04_01_GRID_WIDTH = (1055, 1024) +NVCEC0_QMDV04_01_GRID_HEIGHT = (1071, 1056) +NVCEC0_QMDV04_01_GRID_DEPTH = (1103, 1088) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (1127, 1120) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_ID = (1133, 1128) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE = (1134, 1134) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE = (1135, 1135) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE = (1137, 1136) +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS = (1138, 1138) +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CTA_LAUNCH_QUEUE = (1139, 1139) +NVCEC0_QMDV04_01_FREE_CTA_SLOTS_EMPTY_SM = (1147, 1140) +NVCEC0_QMDV04_01_SYNC_DOMAIN_ID = (1149, 1148) +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH = (1150, 1150) +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT = (1151, 1151) +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION0 = (1167, 1152) +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION1 = (1183, 1168) +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION2 = (1191, 1184) +NVCEC0_QMDV04_01_VIRTUAL_RESOURCE_COUNT = (1199, 1192) +NVCEC0_QMDV04_01_REGISTER_COUNT = (1208, 1200) +NVCEC0_QMDV04_01_SHARED_MEM_BARRIER_INIT_ENABLE = (1210, 1210) +NVCEC0_QMDV04_01_BARRIER_COUNT = (1215, 1211) +NVCEC0_QMDV04_01_PROGRAM_ADDRESS_LOWER = (1247, 1216) +NVCEC0_QMDV04_01_PROGRAM_ADDRESS_UPPER = (1272, 1248) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_WARP = (1287, 1280) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_WARP = (1295, 1288) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_REGISTER = (1303, 1296) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_REGISTER = (1311, 1304) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_SHARED_MEM = (1319, 1312) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_SHARED_MEM = (1327, 1320) +NVCEC0_QMDV04_01_ICC_PREFETCH_SIZE = (1333, 1328) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (1375, 1344) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1392, 1376) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_SIZE = (1401, 1393) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE = (1403, 1402) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (1406, 1406) +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (1407, 1407) +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_GRID_WIDTH_RESUME = (1439, 1408) +NVCEC0_QMDV04_01_GRID_HEIGHT_RESUME = (1455, 1440) +NVCEC0_QMDV04_01_GRID_DEPTH_RESUME = (1471, 1456) +NVCEC0_QMDV04_01_ARRIVE_AT_LATCH_ID = (1503, 1472) +NVCEC0_QMDV04_01_WAIT_ON_LATCH_ID = (1535, 1504) +NVCEC0_QMDV04_01_CONSTANT_BUFFER_ADDR_LOWER_SHIFTED6 = lambda i: ((1567+(i)*64), (1536+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_ADDR_UPPER_SHIFTED6 = lambda i: ((1586+(i)*64), (1568+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1599+(i)*64), (1587+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_COALESCE_WAITING_PERIOD = (2135, 2128) +NVCEC0_QMDV04_01_QUEUE_ENTRIES_PER_CTA_LOG2 = (2140, 2136) +NVCEC0_QMDV04_01_GPC_CGA_WIDTH = (2149, 2144) +NVCEC0_QMDV04_01_GPC_CGA_HEIGHT = (2157, 2152) +NVCEC0_QMDV04_01_GPC_CGA_DEPTH = (2165, 2160) +NVCEC0_QMDV04_01_LARGE_GPC_CGA_WIDTH_MINUS_ONE = (2171, 2168) +NVCEC0_QMDV04_01_LARGE_GPC_CGA_HEIGHT_MINUS_ONE = (2175, 2172) +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE = (2207, 2207) +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE_LOAD_BALANCING = 0x00000000 +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE_MULTI_CAST = 0x00000001 +NVCEC0_QMDV04_01_GPU_CGA_WIDTH = (2223, 2208) +NVCEC0_QMDV04_01_GPU_CGA_HEIGHT = (2239, 2224) +NVCEC0_QMDV04_01_GPU_CGA_DEPTH = (2255, 2240) +NVCEC0_QMDV04_01_DEBUG_ID_LOWER = (2399, 2368) +NVCEC0_QMDV04_01_DEBUG_ID_UPPER = (2431, 2400) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK = lambda i: ((2463+(i)*32), (2432+(i)*32)) # type: ignore +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_WIDTH_RESUME = (2591, 2560) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_HEIGHT_RESUME = (2607, 2592) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_DEPTH_RESUME = (2623, 2608) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_OFFSET_WIDTH_RESUME = (2627, 2624) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_OFFSET_HEIGHT_RESUME = (2631, 2628) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_UPPER = lambda i: ((2719+(i)*32), (2688+(i)*32)) # type: ignore +NVCEC0_QMDV04_01_OUTER_PUT = (3038, 3008) +NVCEC0_QMDV04_01_OUTER_OVERFLOW = (3039, 3039) +NVCEC0_QMDV04_01_OUTER_GET = (3070, 3040) +NVCEC0_QMDV04_01_OUTER_STICKY_OVERFLOW = (3071, 3071) +ALIGN_UP = lambda v,n: (((v) + ((n)-1)) &~ ((n)-1)) # type: ignore +NVDEC_ALIGN = lambda value: ALIGN_UP(value,256) # type: ignore +NVDEC_MAX_MPEG2_SLICE = 65536 +NVDEC_CODEC_MPEG1 = 0 +NVDEC_CODEC_MPEG2 = 1 +NVDEC_CODEC_VC1 = 2 +NVDEC_CODEC_H264 = 3 +NVDEC_CODEC_MPEG4 = 4 +NVDEC_CODEC_DIVX = NVDEC_CODEC_MPEG4 +NVDEC_CODEC_VP8 = 5 +NVDEC_CODEC_HEVC = 7 +NVDEC_CODEC_VP9 = 9 +NVDEC_CODEC_HEVC_PARSER = 12 +NVDEC_CODEC_AV1 = 10 +AES_MODE_MASK = 0x7 +AES_CTS_MASK = 0x1 +AES_PADDING_TYPE_MASK = 0x7 +AES_UNWRAP_KEY_MASK = 0x1 +AES_MODE_SHIFT = 0 +AES_CTS_SHIFT = 3 +AES_PADDING_TYPE_SHIFT = 4 +AES_UNWRAP_KEY_SHIFT = 7 +AES_SET_FLAG = lambda M,C,P: ((M & AES_MODE_MASK) << AES_MODE_SHIFT) | ((C & AES_CTS_MASK) << AES_CTS_SHIFT) | ((P & AES_PADDING_TYPE_MASK) << AES_PADDING_TYPE_SHIFT) # type: ignore +DRM_MODE_MASK = 0x7f +AES_GET_DRM_MODE = lambda V: (V & DRM_MODE_MASK) # type: ignore +GIP_ASIC_VERT_FILTER_RAM_SIZE = 16 +GIP_ASIC_BSD_CTRL_RAM_SIZE = 4 +GIP_ASIC_SCALING_LIST_SIZE = (16*64) +GIP_ASIC_VERT_SAO_RAM_SIZE = 16 +GIP_ASIC_TILE_SIZE = ((20*22*2*2+16+15) & ~0xF) +GIP_ASIC_VP9_CTB_SEG_SIZE = 32 +HEVC_DBLK_TOP_SIZE_IN_SB16 = ALIGN_UP(632, 128) +HEVC_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,16)/16 + 2) * HEVC_DBLK_TOP_SIZE_IN_SB16) # type: ignore +HEVC_DBLK_LEFT_SIZE_IN_SB16 = ALIGN_UP(506, 128) +HEVC_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,16)/16 + 2) * HEVC_DBLK_LEFT_SIZE_IN_SB16) # type: ignore +HEVC_SAO_LEFT_SIZE_IN_SB16 = ALIGN_UP(713, 128) +HEVC_SAO_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,16)/16 + 2) * HEVC_SAO_LEFT_SIZE_IN_SB16) # type: ignore +VP9_DBLK_TOP_SIZE_IN_SB64 = ALIGN_UP(2000, 128) +VP9_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,64)/64 + 2) * VP9_DBLK_TOP_SIZE_IN_SB64) # type: ignore +VP9_DBLK_LEFT_SIZE_IN_SB64 = ALIGN_UP(1600, 128) +VP9_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * VP9_DBLK_LEFT_SIZE_IN_SB64) # type: ignore +VP9_HINT_DUMP_SIZE_IN_SB64 = ((64*64)/(4*4)*8) +VP9_HINT_DUMP_SIZE = lambda w,h: NVDEC_ALIGN(VP9_HINT_DUMP_SIZE_IN_SB64*((w+63)/64)*((h+63)/64)) # type: ignore +NUM_SUBSAMPLES = 32 +VP8_MAX_TOKEN_PARTITIONS = 8 +VP9_MAX_FRAMES_IN_SUPERFRAME = 8 +AV1_MAX_TILES = 256 +MAX_SUBSTREAM_ENTRY_SIZE = 32 +AV1_TEMPORAL_MV_SIZE_IN_64x64 = 256 +AV1_TEMPORAL_MV_BUF_SIZE = lambda w,h: ALIGN_UP( ALIGN_UP(w,128) * ALIGN_UP(h,128) / (64*64) * AV1_TEMPORAL_MV_SIZE_IN_64x64, 4096) # type: ignore +AV1_SEGMENT_ID_SIZE_IN_64x64 = 128 +AV1_SEGMENT_ID_BUF_SIZE = lambda w,h: ALIGN_UP( ALIGN_UP(w,128) * ALIGN_UP(h,128) / (64*64) * AV1_SEGMENT_ID_SIZE_IN_64x64, 4096) # type: ignore +AV1_GLOBAL_MOTION_BUF_SIZE = NVDEC_ALIGN(7*32) +AV1_INTRA_TOP_BUF_SIZE = NVDEC_ALIGN(8*8192) +AV1_HISTOGRAM_BUF_SIZE = NVDEC_ALIGN(1024) +AV1_DBLK_TOP_SIZE_IN_SB64 = ALIGN_UP(1920, 128) +AV1_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,64)/64 + 2) * AV1_DBLK_TOP_SIZE_IN_SB64) # type: ignore +AV1_DBLK_LEFT_SIZE_IN_SB64 = ALIGN_UP(1536, 128) +AV1_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_DBLK_LEFT_SIZE_IN_SB64) # type: ignore +AV1_CDEF_LEFT_SIZE_IN_SB64 = ALIGN_UP(1792, 128) +AV1_CDEF_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_CDEF_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HUS_LEFT_SIZE_IN_SB64 = ALIGN_UP(12544, 128) +AV1_ASIC_HUS_LEFT_BUFFER_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_HUS_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HUS_LEFT_BUF_SIZE = lambda h: 2*AV1_ASIC_HUS_LEFT_BUFFER_SIZE(h) # type: ignore +AV1_LR_LEFT_SIZE_IN_SB64 = ALIGN_UP(1920, 128) +AV1_LR_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_LR_LEFT_SIZE_IN_SB64) # type: ignore +AV1_FGS_LEFT_SIZE_IN_SB64 = ALIGN_UP(320, 128) +AV1_FGS_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_FGS_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HINT_DUMP_SIZE_IN_SB64 = ((64*64)/(4*4)*8) +AV1_HINT_DUMP_SIZE_IN_SB128 = ((128*128)/(4*4)*8) +AV1_HINT_DUMP_SIZE = lambda w,h: NVDEC_ALIGN(AV1_HINT_DUMP_SIZE_IN_SB128*((w+127)/128)*((h+127)/128)) # type: ignore +NVBIT = lambda b: (1<<(b)) # type: ignore +NVBIT32 = lambda b: NVBIT_TYPE(b, NvU32) # type: ignore +NVBIT64 = lambda b: NVBIT_TYPE(b, NvU64) # type: ignore +NV_BITMASK32_IDX = lambda chId: (((chId) & ~(0x1F)) >> 5) # type: ignore +NV_BITMASK32_OFFSET = lambda chId: ((chId) & (0x1F)) # type: ignore +NV_BITMASK32_GET = lambda pChannelMask,chId: ((pChannelMask)[NV_BITMASK32_IDX(chId)] & NVBIT(NV_BITMASK32_OFFSET(chId))) # type: ignore +DRF_SHIFT = lambda drf: ((DRF_ISBIT(0,drf)) % 32) # type: ignore +DRF_SHIFT_RT = lambda drf: ((DRF_ISBIT(1,drf)) % 32) # type: ignore +DRF_SIZE = lambda drf: (DRF_EXTENT(drf)-DRF_BASE(drf)+1) # type: ignore +DRF_MASK = lambda drf: (0xFFFFFFFF>>(31-((DRF_ISBIT(1,drf)) % 32)+((DRF_ISBIT(0,drf)) % 32))) # type: ignore +DRF_SHIFTMASK = lambda drf: (DRF_MASK(drf)<<(DRF_SHIFT(drf))) # type: ignore +DRF_SHIFT64 = lambda drf: ((DRF_ISBIT(0,drf)) % 64) # type: ignore +DRF_MASK64 = lambda drf: (NV_U64_MAX>>(63-((DRF_ISBIT(1,drf)) % 64)+((DRF_ISBIT(0,drf)) % 64))) # type: ignore +DRF_SHIFTMASK64 = lambda drf: (DRF_MASK64(drf)<<(DRF_SHIFT64(drf))) # type: ignore +FLD_TEST_DRF_NUM64 = lambda d,r,f,n,v: (DRF_VAL64(d, r, f, (v)) == (n)) # type: ignore +REF_VAL64 = lambda drf,v: (((NvU64)(v)>>DRF_SHIFT64(drf))&DRF_MASK64(drf)) # type: ignore +REF_NUM64 = lambda drf,n: (((NvU64)(n)&DRF_MASK64(drf))<>DRF_SHIFT(drf))&DRF_MASK(drf)) # type: ignore +REF_NUM = lambda drf,n: (((n)&DRF_MASK(drf))<>((31-(DRF_EXTENT_MW(drf))+(DRF_BASE_MW(drf)))%32)) # type: ignore +DRF_SHIFTMASK_MW = lambda drf: ((DRF_MASK_MW(drf))<<(DRF_SHIFT_MW(drf))) # type: ignore +DRF_SIZE_MW = lambda drf: (DRF_EXTENT_MW(drf)-DRF_BASE_MW(drf)+1) # type: ignore +DRF_WORD_MW_LOW = lambda drf: (DRF_PICK_MW(drf,0)/32) # type: ignore +DRF_WORD_MW_HIGH = lambda drf: (DRF_PICK_MW(drf,1)/32) # type: ignore +DRF_MASK_MW_LOW = lambda drf: (0xFFFFFFFF) # type: ignore +DRF_MASK_MW_HIGH = lambda drf: (0xFFFFFFFF>>(31-(DRF_EXTENT_MW(drf)))) # type: ignore +DRF_SHIFT_MW_LOW = lambda drf: (DRF_PICK_MW(drf,0)%32) # type: ignore +DRF_SHIFT_MW_HIGH = lambda drf: (0) # type: ignore +DRF_MERGE_SHIFT = lambda drf: ((32-((DRF_PICK_MW(drf,0)%32)))%32) # type: ignore +FLD_MERGE_MW = lambda drf,n,v: (((v)[DRF_WORD_MW(drf)] & ~DRF_SHIFTMASK_MW(drf)) | n) # type: ignore +FLD_IDX_MERGE_MW = lambda drf,i,n,v: (((v)[DRF_WORD_MW(drf(i))] & ~DRF_SHIFTMASK_MW(drf(i))) | n) # type: ignore +FLD_TEST_DRF_NUM_MW = lambda d,r,f,n,v: ((DRF_VAL_MW(d, r, f, (v)) == n)) # type: ignore +NV_TWO_N_MINUS_ONE = lambda n: (((1<<(n/2))<<((n+1)/2))-1) # type: ignore +LOWESTBIT = lambda x: ( (x) & (((x) - 1) ^ (x)) ) # type: ignore +NV_ANYSIZE_ARRAY = 1 +NV_CEIL = lambda a,b: (((a)+(b)-1)/(b)) # type: ignore +NV_DIV_AND_CEIL = lambda a,b: NV_CEIL(a,b) # type: ignore +NV_SIGN = lambda s: ((NvS8)(((s) > 0) - ((s) < 0))) # type: ignore +NV_ZERO_SIGN = lambda s: ((NvS8)((((s) >= 0) * 2) - 1)) # type: ignore +NV_UNSIGNED_ROUNDED_DIV = lambda a,b: (((a) + ((b) / 2)) / (b)) # type: ignore +NV_UNSIGNED_DIV_CEIL = lambda a,b: (((a) + (b - 1)) / (b)) # type: ignore +NV_ALIGN_DOWN = lambda v,gran: ((v) & ~((v) - (v) + (gran) - 1)) # type: ignore +NV_ALIGN_UP = lambda v,gran: (((v) + ((gran) - 1)) & ~((v) - (v) + (gran) - 1)) # type: ignore +NV_IS_ALIGNED = lambda v,gran: (0 == ((v) & ((gran) - 1))) # type: ignore +NV_BIT_GET = lambda k,x: (((x) >> (k)) & 1) # type: ignore +NV_ARRAY_ELEMENTS = lambda x: ((sizeof(x)/sizeof((x)[0]))) # type: ignore +BIT = lambda b: (1<<(b)) # type: ignore +NV01_NULL_OBJECT = (0x0) +NV1_NULL_OBJECT = NV01_NULL_OBJECT +NV01_ROOT = (0x0) +NV0000_ALLOC_PARAMETERS_MESSAGE_ID = (0x0000) +NV01_MEMORY_VIRTUAL = (0x70) +NV01_MEMORY_SYSTEM_DYNAMIC = (0x70) +NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_MESSAGE_ID = (0x0070) +NV_MEMORY_VIRTUAL_SYSMEM_DYNAMIC_HVASPACE = 0xffffffff +NV01_DEVICE_0 = (0x80) +NV0080_ALLOC_PARAMETERS_MESSAGE_ID = (0x0080) +NV20_SUBDEVICE_0 = (0x2080) +NV2080_ALLOC_PARAMETERS_MESSAGE_ID = (0x2080) +NV2080_NOTIFIERS_SW = (0) +NV2080_NOTIFIERS_HOTPLUG = (1) +NV2080_NOTIFIERS_POWER_CONNECTOR = (2) +NV2080_NOTIFIERS_THERMAL_SW = (3) +NV2080_NOTIFIERS_THERMAL_HW = (4) +NV2080_NOTIFIERS_FULL_SCREEN_CHANGE = (5) +NV2080_NOTIFIERS_EVENTBUFFER = (6) +NV2080_NOTIFIERS_DP_IRQ = (7) +NV2080_NOTIFIERS_GR_DEBUG_INTR = (8) +NV2080_NOTIFIERS_PMU_EVENT = (9) +NV2080_NOTIFIERS_PMU_COMMAND = (10) +NV2080_NOTIFIERS_TIMER = (11) +NV2080_NOTIFIERS_GRAPHICS = (12) +NV2080_NOTIFIERS_PPP = (13) +NV2080_NOTIFIERS_VLD = (14) +NV2080_NOTIFIERS_NVDEC0 = NV2080_NOTIFIERS_VLD +NV2080_NOTIFIERS_NVDEC1 = (15) +NV2080_NOTIFIERS_NVDEC2 = (16) +NV2080_NOTIFIERS_NVDEC3 = (17) +NV2080_NOTIFIERS_NVDEC4 = (18) +NV2080_NOTIFIERS_NVDEC5 = (19) +NV2080_NOTIFIERS_NVDEC6 = (20) +NV2080_NOTIFIERS_NVDEC7 = (21) +NV2080_NOTIFIERS_PDEC = (22) +NV2080_NOTIFIERS_CE0 = (23) +NV2080_NOTIFIERS_CE1 = (24) +NV2080_NOTIFIERS_CE2 = (25) +NV2080_NOTIFIERS_CE3 = (26) +NV2080_NOTIFIERS_CE4 = (27) +NV2080_NOTIFIERS_CE5 = (28) +NV2080_NOTIFIERS_CE6 = (29) +NV2080_NOTIFIERS_CE7 = (30) +NV2080_NOTIFIERS_CE8 = (31) +NV2080_NOTIFIERS_CE9 = (32) +NV2080_NOTIFIERS_PSTATE_CHANGE = (33) +NV2080_NOTIFIERS_HDCP_STATUS_CHANGE = (34) +NV2080_NOTIFIERS_FIFO_EVENT_MTHD = (35) +NV2080_NOTIFIERS_PRIV_RING_HANG = (36) +NV2080_NOTIFIERS_RC_ERROR = (37) +NV2080_NOTIFIERS_MSENC = (38) +NV2080_NOTIFIERS_NVENC0 = NV2080_NOTIFIERS_MSENC +NV2080_NOTIFIERS_NVENC1 = (39) +NV2080_NOTIFIERS_NVENC2 = (40) +NV2080_NOTIFIERS_UNUSED_0 = (41) +NV2080_NOTIFIERS_ACPI_NOTIFY = (42) +NV2080_NOTIFIERS_COOLER_DIAG_ZONE = (43) +NV2080_NOTIFIERS_THERMAL_DIAG_ZONE = (44) +NV2080_NOTIFIERS_AUDIO_HDCP_REQUEST = (45) +NV2080_NOTIFIERS_WORKLOAD_MODULATION_CHANGE = (46) +NV2080_NOTIFIERS_GPIO_0_RISING_INTERRUPT = (47) +NV2080_NOTIFIERS_GPIO_1_RISING_INTERRUPT = (48) +NV2080_NOTIFIERS_GPIO_2_RISING_INTERRUPT = (49) +NV2080_NOTIFIERS_GPIO_3_RISING_INTERRUPT = (50) +NV2080_NOTIFIERS_GPIO_4_RISING_INTERRUPT = (51) +NV2080_NOTIFIERS_GPIO_5_RISING_INTERRUPT = (52) +NV2080_NOTIFIERS_GPIO_6_RISING_INTERRUPT = (53) +NV2080_NOTIFIERS_GPIO_7_RISING_INTERRUPT = (54) +NV2080_NOTIFIERS_GPIO_8_RISING_INTERRUPT = (55) +NV2080_NOTIFIERS_GPIO_9_RISING_INTERRUPT = (56) +NV2080_NOTIFIERS_GPIO_10_RISING_INTERRUPT = (57) +NV2080_NOTIFIERS_GPIO_11_RISING_INTERRUPT = (58) +NV2080_NOTIFIERS_GPIO_12_RISING_INTERRUPT = (59) +NV2080_NOTIFIERS_GPIO_13_RISING_INTERRUPT = (60) +NV2080_NOTIFIERS_GPIO_14_RISING_INTERRUPT = (61) +NV2080_NOTIFIERS_GPIO_15_RISING_INTERRUPT = (62) +NV2080_NOTIFIERS_GPIO_16_RISING_INTERRUPT = (63) +NV2080_NOTIFIERS_GPIO_17_RISING_INTERRUPT = (64) +NV2080_NOTIFIERS_GPIO_18_RISING_INTERRUPT = (65) +NV2080_NOTIFIERS_GPIO_19_RISING_INTERRUPT = (66) +NV2080_NOTIFIERS_GPIO_20_RISING_INTERRUPT = (67) +NV2080_NOTIFIERS_GPIO_21_RISING_INTERRUPT = (68) +NV2080_NOTIFIERS_GPIO_22_RISING_INTERRUPT = (69) +NV2080_NOTIFIERS_GPIO_23_RISING_INTERRUPT = (70) +NV2080_NOTIFIERS_GPIO_24_RISING_INTERRUPT = (71) +NV2080_NOTIFIERS_GPIO_25_RISING_INTERRUPT = (72) +NV2080_NOTIFIERS_GPIO_26_RISING_INTERRUPT = (73) +NV2080_NOTIFIERS_GPIO_27_RISING_INTERRUPT = (74) +NV2080_NOTIFIERS_GPIO_28_RISING_INTERRUPT = (75) +NV2080_NOTIFIERS_GPIO_29_RISING_INTERRUPT = (76) +NV2080_NOTIFIERS_GPIO_30_RISING_INTERRUPT = (77) +NV2080_NOTIFIERS_GPIO_31_RISING_INTERRUPT = (78) +NV2080_NOTIFIERS_GPIO_0_FALLING_INTERRUPT = (79) +NV2080_NOTIFIERS_GPIO_1_FALLING_INTERRUPT = (80) +NV2080_NOTIFIERS_GPIO_2_FALLING_INTERRUPT = (81) +NV2080_NOTIFIERS_GPIO_3_FALLING_INTERRUPT = (82) +NV2080_NOTIFIERS_GPIO_4_FALLING_INTERRUPT = (83) +NV2080_NOTIFIERS_GPIO_5_FALLING_INTERRUPT = (84) +NV2080_NOTIFIERS_GPIO_6_FALLING_INTERRUPT = (85) +NV2080_NOTIFIERS_GPIO_7_FALLING_INTERRUPT = (86) +NV2080_NOTIFIERS_GPIO_8_FALLING_INTERRUPT = (87) +NV2080_NOTIFIERS_GPIO_9_FALLING_INTERRUPT = (88) +NV2080_NOTIFIERS_GPIO_10_FALLING_INTERRUPT = (89) +NV2080_NOTIFIERS_GPIO_11_FALLING_INTERRUPT = (90) +NV2080_NOTIFIERS_GPIO_12_FALLING_INTERRUPT = (91) +NV2080_NOTIFIERS_GPIO_13_FALLING_INTERRUPT = (92) +NV2080_NOTIFIERS_GPIO_14_FALLING_INTERRUPT = (93) +NV2080_NOTIFIERS_GPIO_15_FALLING_INTERRUPT = (94) +NV2080_NOTIFIERS_GPIO_16_FALLING_INTERRUPT = (95) +NV2080_NOTIFIERS_GPIO_17_FALLING_INTERRUPT = (96) +NV2080_NOTIFIERS_GPIO_18_FALLING_INTERRUPT = (97) +NV2080_NOTIFIERS_GPIO_19_FALLING_INTERRUPT = (98) +NV2080_NOTIFIERS_GPIO_20_FALLING_INTERRUPT = (99) +NV2080_NOTIFIERS_GPIO_21_FALLING_INTERRUPT = (100) +NV2080_NOTIFIERS_GPIO_22_FALLING_INTERRUPT = (101) +NV2080_NOTIFIERS_GPIO_23_FALLING_INTERRUPT = (102) +NV2080_NOTIFIERS_GPIO_24_FALLING_INTERRUPT = (103) +NV2080_NOTIFIERS_GPIO_25_FALLING_INTERRUPT = (104) +NV2080_NOTIFIERS_GPIO_26_FALLING_INTERRUPT = (105) +NV2080_NOTIFIERS_GPIO_27_FALLING_INTERRUPT = (106) +NV2080_NOTIFIERS_GPIO_28_FALLING_INTERRUPT = (107) +NV2080_NOTIFIERS_GPIO_29_FALLING_INTERRUPT = (108) +NV2080_NOTIFIERS_GPIO_30_FALLING_INTERRUPT = (109) +NV2080_NOTIFIERS_GPIO_31_FALLING_INTERRUPT = (110) +NV2080_NOTIFIERS_ECC_SBE = (111) +NV2080_NOTIFIERS_ECC_DBE = (112) +NV2080_NOTIFIERS_STEREO_EMITTER_DETECTION = (113) +NV2080_NOTIFIERS_GC5_GPU_READY = (114) +NV2080_NOTIFIERS_SEC2 = (115) +NV2080_NOTIFIERS_GC6_REFCOUNT_INC = (116) +NV2080_NOTIFIERS_GC6_REFCOUNT_DEC = (117) +NV2080_NOTIFIERS_POWER_EVENT = (118) +NV2080_NOTIFIERS_CLOCKS_CHANGE = (119) +NV2080_NOTIFIERS_HOTPLUG_PROCESSING_COMPLETE = (120) +NV2080_NOTIFIERS_PHYSICAL_PAGE_FAULT = (121) +NV2080_NOTIFIERS_RESERVED122 = (122) +NV2080_NOTIFIERS_NVLINK_ERROR_FATAL = (123) +NV2080_NOTIFIERS_PRIV_REG_ACCESS_FAULT = (124) +NV2080_NOTIFIERS_NVLINK_ERROR_RECOVERY_REQUIRED = (125) +NV2080_NOTIFIERS_NVJPG = (126) +NV2080_NOTIFIERS_NVJPEG0 = NV2080_NOTIFIERS_NVJPG +NV2080_NOTIFIERS_NVJPEG1 = (127) +NV2080_NOTIFIERS_NVJPEG2 = (128) +NV2080_NOTIFIERS_NVJPEG3 = (129) +NV2080_NOTIFIERS_NVJPEG4 = (130) +NV2080_NOTIFIERS_NVJPEG5 = (131) +NV2080_NOTIFIERS_NVJPEG6 = (132) +NV2080_NOTIFIERS_NVJPEG7 = (133) +NV2080_NOTIFIERS_RUNLIST_AND_ENG_IDLE = (134) +NV2080_NOTIFIERS_RUNLIST_ACQUIRE = (135) +NV2080_NOTIFIERS_RUNLIST_ACQUIRE_AND_ENG_IDLE = (136) +NV2080_NOTIFIERS_RUNLIST_IDLE = (137) +NV2080_NOTIFIERS_TSG_PREEMPT_COMPLETE = (138) +NV2080_NOTIFIERS_RUNLIST_PREEMPT_COMPLETE = (139) +NV2080_NOTIFIERS_CTXSW_TIMEOUT = (140) +NV2080_NOTIFIERS_INFOROM_ECC_OBJECT_UPDATED = (141) +NV2080_NOTIFIERS_NVTELEMETRY_REPORT_EVENT = (142) +NV2080_NOTIFIERS_DSTATE_XUSB_PPC = (143) +NV2080_NOTIFIERS_FECS_CTX_SWITCH = (144) +NV2080_NOTIFIERS_XUSB_PPC_CONNECTED = (145) +NV2080_NOTIFIERS_GR0 = NV2080_NOTIFIERS_GRAPHICS +NV2080_NOTIFIERS_GR1 = (146) +NV2080_NOTIFIERS_GR2 = (147) +NV2080_NOTIFIERS_GR3 = (148) +NV2080_NOTIFIERS_GR4 = (149) +NV2080_NOTIFIERS_GR5 = (150) +NV2080_NOTIFIERS_GR6 = (151) +NV2080_NOTIFIERS_GR7 = (152) +NV2080_NOTIFIERS_OFA = (153) +NV2080_NOTIFIERS_OFA0 = NV2080_NOTIFIERS_OFA +NV2080_NOTIFIERS_DSTATE_HDA = (154) +NV2080_NOTIFIERS_POISON_ERROR_NON_FATAL = (155) +NV2080_NOTIFIERS_POISON_ERROR_FATAL = (156) +NV2080_NOTIFIERS_UCODE_RESET = (157) +NV2080_NOTIFIERS_PLATFORM_POWER_MODE_CHANGE = (158) +NV2080_NOTIFIERS_SMC_CONFIG_UPDATE = (159) +NV2080_NOTIFIERS_INFOROM_RRL_OBJECT_UPDATED = (160) +NV2080_NOTIFIERS_INFOROM_PBL_OBJECT_UPDATED = (161) +NV2080_NOTIFIERS_LPWR_DIFR_PREFETCH_REQUEST = (162) +NV2080_NOTIFIERS_SEC_FAULT_ERROR = (163) +NV2080_NOTIFIERS_UNUSED_1 = (164) +NV2080_NOTIFIERS_NVLINK_INFO_LINK_UP = (165) +NV2080_NOTIFIERS_CE10 = (166) +NV2080_NOTIFIERS_CE11 = (167) +NV2080_NOTIFIERS_CE12 = (168) +NV2080_NOTIFIERS_CE13 = (169) +NV2080_NOTIFIERS_CE14 = (170) +NV2080_NOTIFIERS_CE15 = (171) +NV2080_NOTIFIERS_CE16 = (172) +NV2080_NOTIFIERS_CE17 = (173) +NV2080_NOTIFIERS_CE18 = (174) +NV2080_NOTIFIERS_CE19 = (175) +NV2080_NOTIFIERS_NVLINK_INFO_LINK_DOWN = (176) +NV2080_NOTIFIERS_NVPCF_EVENTS = (177) +NV2080_NOTIFIERS_HDMI_FRL_RETRAINING_REQUEST = (178) +NV2080_NOTIFIERS_VRR_SET_TIMEOUT = (179) +NV2080_NOTIFIERS_OFA1 = (180) +NV2080_NOTIFIERS_AUX_POWER_EVENT = (181) +NV2080_NOTIFIERS_AUX_POWER_STATE_CHANGE = (182) +NV2080_NOTIFIERS_NVENC3 = (183) +NV2080_NOTIFIERS_GSP_PERF_TRACE = (184) +NV2080_NOTIFIERS_INBAND_RESPONSE = (185) +NV2080_NOTIFIERS_RESERVED_186 = (186) +NV2080_NOTIFIERS_ECC_SBE_STORM = (187) +NV2080_NOTIFIERS_DRAM_RETIREMENT_EVENT = (188) +NV2080_NOTIFIERS_DRAM_RETIREMENT_FAILURE = (189) +NV2080_NOTIFIERS_NVLINK_UNCONTAINED_ERROR = (190) +NV2080_NOTIFIERS_GPU_UNAVAILABLE = (191) +NV2080_NOTIFIERS_GPU_RECOVERY_ACTION = (192) +NV2080_NOTIFIERS_POWER_SUSPEND = (193) +NV2080_NOTIFIERS_POWER_RESUME = (194) +NV2080_NOTIFIERS_CTXSW_UCODE_ERROR = (195) +NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD = (196) +NV2080_NOTIFIERS_GPU_RC_RESET = (197) +NV2080_NOTIFIERS_MAXCOUNT = (198) +NV2080_NOTIFIERS_GR_IDX = lambda x: ((x) - NV2080_NOTIFIERS_GR0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_GR = lambda x: (((x) == NV2080_NOTIFIERS_GR0) or (((x) >= NV2080_NOTIFIERS_GR1) and ((x) <= NV2080_NOTIFIERS_GR7))) # type: ignore +NV2080_NOTIFIER_TYPE_IS_CE = lambda x: ((((x) >= NV2080_NOTIFIERS_CE0) and ((x) <= NV2080_NOTIFIERS_CE9)) or (((x) >= NV2080_NOTIFIERS_CE10) and ((x) <= NV2080_NOTIFIERS_CE19))) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVENC = lambda x: ((((x) >= NV2080_NOTIFIERS_NVENC0) and ((x) <= NV2080_NOTIFIERS_NVENC2)) or (((x) == NV2080_NOTIFIERS_NVENC3))) # type: ignore +NV2080_NOTIFIERS_NVDEC = lambda x: (NV2080_NOTIFIERS_NVDEC0 + (x)) # type: ignore +NV2080_NOTIFIERS_NVDEC_IDX = lambda x: ((x) - NV2080_NOTIFIERS_NVDEC0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVDEC = lambda x: (((x) >= NV2080_NOTIFIERS_NVDEC0) and ((x) <= NV2080_NOTIFIERS_NVDEC7)) # type: ignore +NV2080_NOTIFIERS_NVJPEG = lambda x: (NV2080_NOTIFIERS_NVJPEG0 + (x)) # type: ignore +NV2080_NOTIFIERS_NVJPEG_IDX = lambda x: ((x) - NV2080_NOTIFIERS_NVJPEG0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVJPEG = lambda x: (((x) >= NV2080_NOTIFIERS_NVJPEG0) and ((x) <= NV2080_NOTIFIERS_NVJPEG7)) # type: ignore +NV2080_NOTIFIER_TYPE_IS_OFA = lambda x: (((x) == NV2080_NOTIFIERS_OFA0) or ((x) == NV2080_NOTIFIERS_OFA1)) # type: ignore +NV2080_NOTIFIERS_GPIO_RISING_INTERRUPT = lambda pin: (NV2080_NOTIFIERS_GPIO_0_RISING_INTERRUPT + (pin)) # type: ignore +NV2080_NOTIFIERS_GPIO_FALLING_INTERRUPT = lambda pin: (NV2080_NOTIFIERS_GPIO_0_FALLING_INTERRUPT + (pin)) # type: ignore +NV2080_SUBDEVICE_NOTIFICATION_STATUS_IN_PROGRESS = (0x8000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_BAD_ARGUMENT = (0x4000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_ERROR_INVALID_STATE = (0x2000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_ERROR_STATE_IN_USE = (0x1000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_DONE_SUCCESS = (0x0000) +NV2080_ENGINE_TYPE_NULL = (0x00000000) +NV2080_ENGINE_TYPE_GRAPHICS = (0x00000001) +NV2080_ENGINE_TYPE_GR0 = NV2080_ENGINE_TYPE_GRAPHICS +NV2080_ENGINE_TYPE_GR1 = (0x00000002) +NV2080_ENGINE_TYPE_GR2 = (0x00000003) +NV2080_ENGINE_TYPE_GR3 = (0x00000004) +NV2080_ENGINE_TYPE_GR4 = (0x00000005) +NV2080_ENGINE_TYPE_GR5 = (0x00000006) +NV2080_ENGINE_TYPE_GR6 = (0x00000007) +NV2080_ENGINE_TYPE_GR7 = (0x00000008) +NV2080_ENGINE_TYPE_COPY0 = (0x00000009) +NV2080_ENGINE_TYPE_COPY1 = (0x0000000a) +NV2080_ENGINE_TYPE_COPY2 = (0x0000000b) +NV2080_ENGINE_TYPE_COPY3 = (0x0000000c) +NV2080_ENGINE_TYPE_COPY4 = (0x0000000d) +NV2080_ENGINE_TYPE_COPY5 = (0x0000000e) +NV2080_ENGINE_TYPE_COPY6 = (0x0000000f) +NV2080_ENGINE_TYPE_COPY7 = (0x00000010) +NV2080_ENGINE_TYPE_COPY8 = (0x00000011) +NV2080_ENGINE_TYPE_COPY9 = (0x00000012) +NV2080_ENGINE_TYPE_BSP = (0x00000013) +NV2080_ENGINE_TYPE_NVDEC0 = NV2080_ENGINE_TYPE_BSP +NV2080_ENGINE_TYPE_NVDEC1 = (0x00000014) +NV2080_ENGINE_TYPE_NVDEC2 = (0x00000015) +NV2080_ENGINE_TYPE_NVDEC3 = (0x00000016) +NV2080_ENGINE_TYPE_NVDEC4 = (0x00000017) +NV2080_ENGINE_TYPE_NVDEC5 = (0x00000018) +NV2080_ENGINE_TYPE_NVDEC6 = (0x00000019) +NV2080_ENGINE_TYPE_NVDEC7 = (0x0000001a) +NV2080_ENGINE_TYPE_MSENC = (0x0000001b) +NV2080_ENGINE_TYPE_NVENC0 = NV2080_ENGINE_TYPE_MSENC +NV2080_ENGINE_TYPE_NVENC1 = (0x0000001c) +NV2080_ENGINE_TYPE_NVENC2 = (0x0000001d) +NV2080_ENGINE_TYPE_VP = (0x0000001e) +NV2080_ENGINE_TYPE_ME = (0x0000001f) +NV2080_ENGINE_TYPE_PPP = (0x00000020) +NV2080_ENGINE_TYPE_MPEG = (0x00000021) +NV2080_ENGINE_TYPE_SW = (0x00000022) +NV2080_ENGINE_TYPE_CIPHER = (0x00000023) +NV2080_ENGINE_TYPE_TSEC = NV2080_ENGINE_TYPE_CIPHER +NV2080_ENGINE_TYPE_VIC = (0x00000024) +NV2080_ENGINE_TYPE_MP = (0x00000025) +NV2080_ENGINE_TYPE_SEC2 = (0x00000026) +NV2080_ENGINE_TYPE_HOST = (0x00000027) +NV2080_ENGINE_TYPE_DPU = (0x00000028) +NV2080_ENGINE_TYPE_PMU = (0x00000029) +NV2080_ENGINE_TYPE_FBFLCN = (0x0000002a) +NV2080_ENGINE_TYPE_NVJPG = (0x0000002b) +NV2080_ENGINE_TYPE_NVJPEG0 = NV2080_ENGINE_TYPE_NVJPG +NV2080_ENGINE_TYPE_NVJPEG1 = (0x0000002c) +NV2080_ENGINE_TYPE_NVJPEG2 = (0x0000002d) +NV2080_ENGINE_TYPE_NVJPEG3 = (0x0000002e) +NV2080_ENGINE_TYPE_NVJPEG4 = (0x0000002f) +NV2080_ENGINE_TYPE_NVJPEG5 = (0x00000030) +NV2080_ENGINE_TYPE_NVJPEG6 = (0x00000031) +NV2080_ENGINE_TYPE_NVJPEG7 = (0x00000032) +NV2080_ENGINE_TYPE_OFA = (0x00000033) +NV2080_ENGINE_TYPE_OFA0 = NV2080_ENGINE_TYPE_OFA +NV2080_ENGINE_TYPE_COPY10 = (0x00000034) +NV2080_ENGINE_TYPE_COPY11 = (0x00000035) +NV2080_ENGINE_TYPE_COPY12 = (0x00000036) +NV2080_ENGINE_TYPE_COPY13 = (0x00000037) +NV2080_ENGINE_TYPE_COPY14 = (0x00000038) +NV2080_ENGINE_TYPE_COPY15 = (0x00000039) +NV2080_ENGINE_TYPE_COPY16 = (0x0000003a) +NV2080_ENGINE_TYPE_COPY17 = (0x0000003b) +NV2080_ENGINE_TYPE_COPY18 = (0x0000003c) +NV2080_ENGINE_TYPE_COPY19 = (0x0000003d) +NV2080_ENGINE_TYPE_OFA1 = (0x0000003e) +NV2080_ENGINE_TYPE_NVENC3 = (0x0000003f) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0 = (0x00000040) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY1 = (0x00000041) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY2 = (0x00000042) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY3 = (0x00000043) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY4 = (0x00000044) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY5 = (0x00000045) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY6 = (0x00000046) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY7 = (0x00000047) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY8 = (0x00000048) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY9 = (0x00000049) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY10 = (0x0000004a) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY11 = (0x0000004b) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY12 = (0x0000004c) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY13 = (0x0000004d) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY14 = (0x0000004e) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY15 = (0x0000004f) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY16 = (0x00000050) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY17 = (0x00000051) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY18 = (0x00000052) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY19 = (0x00000053) +NV2080_ENGINE_TYPE_LAST = (0x00000054) +NV2080_ENGINE_TYPE_ALLENGINES = (0xffffffff) +NV2080_ENGINE_TYPE_COPY_SIZE = 64 +NV2080_ENGINE_TYPE_NVENC_SIZE = 4 +NV2080_ENGINE_TYPE_NVJPEG_SIZE = 8 +NV2080_ENGINE_TYPE_NVDEC_SIZE = 8 +NV2080_ENGINE_TYPE_GR_SIZE = 8 +NV2080_ENGINE_TYPE_OFA_SIZE = 2 +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY = lambda i: (NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0 + (i)) # type: ignore +NV2080_ENGINE_TYPE_IS_COMP_DECOMP_COPY = lambda i: (((i) >= NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0) and ((i) <= NV2080_ENGINE_TYPE_COMP_DECOMP_COPY19)) # type: ignore +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0) # type: ignore +NV2080_ENGINE_TYPE_IS_COPY = lambda i: ((((i) >= NV2080_ENGINE_TYPE_COPY0) and ((i) <= NV2080_ENGINE_TYPE_COPY9)) or (((i) >= NV2080_ENGINE_TYPE_COPY10) and ((i) <= NV2080_ENGINE_TYPE_COPY19))) # type: ignore +NV2080_ENGINE_TYPE_IS_NVENC = lambda i: ((((i) >= NV2080_ENGINE_TYPE_NVENC0) and ((i) <= NV2080_ENGINE_TYPE_NVENC2)) or (((i) == NV2080_ENGINE_TYPE_NVENC3))) # type: ignore +NV2080_ENGINE_TYPE_NVDEC = lambda i: (NV2080_ENGINE_TYPE_NVDEC0+(i)) # type: ignore +NV2080_ENGINE_TYPE_IS_NVDEC = lambda i: (((i) >= NV2080_ENGINE_TYPE_NVDEC0) and ((i) < NV2080_ENGINE_TYPE_NVDEC(NV2080_ENGINE_TYPE_NVDEC_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_NVDEC_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_NVDEC0) # type: ignore +NV2080_ENGINE_TYPE_NVJPEG = lambda i: (NV2080_ENGINE_TYPE_NVJPEG0+(i)) # type: ignore +NV2080_ENGINE_TYPE_IS_NVJPEG = lambda i: (((i) >= NV2080_ENGINE_TYPE_NVJPEG0) and ((i) < NV2080_ENGINE_TYPE_NVJPEG(NV2080_ENGINE_TYPE_NVJPEG_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_NVJPEG_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_NVJPEG0) # type: ignore +NV2080_ENGINE_TYPE_GR = lambda i: (NV2080_ENGINE_TYPE_GR0 + (i)) # type: ignore +NV2080_ENGINE_TYPE_IS_GR = lambda i: (((i) >= NV2080_ENGINE_TYPE_GR0) and ((i) < NV2080_ENGINE_TYPE_GR(NV2080_ENGINE_TYPE_GR_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_GR_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_GR0) # type: ignore +NV2080_ENGINE_TYPE_IS_OFA = lambda i: (((i) == NV2080_ENGINE_TYPE_OFA0) or ((i) == NV2080_ENGINE_TYPE_OFA1)) # type: ignore +NV2080_ENGINE_TYPE_IS_VALID = lambda i: (((i) > (NV2080_ENGINE_TYPE_NULL)) and ((i) < (NV2080_ENGINE_TYPE_LAST))) # type: ignore +NV2080_CLIENT_TYPE_TEX = (0x00000001) +NV2080_CLIENT_TYPE_COLOR = (0x00000002) +NV2080_CLIENT_TYPE_DEPTH = (0x00000003) +NV2080_CLIENT_TYPE_DA = (0x00000004) +NV2080_CLIENT_TYPE_FE = (0x00000005) +NV2080_CLIENT_TYPE_SCC = (0x00000006) +NV2080_CLIENT_TYPE_WID = (0x00000007) +NV2080_CLIENT_TYPE_MSVLD = (0x00000008) +NV2080_CLIENT_TYPE_MSPDEC = (0x00000009) +NV2080_CLIENT_TYPE_MSPPP = (0x0000000a) +NV2080_CLIENT_TYPE_VIC = (0x0000000b) +NV2080_CLIENT_TYPE_ALLCLIENTS = (0xffffffff) +NV2080_GC5_EXIT_COMPLETE = (0x00000001) +NV2080_GC5_ENTRY_ABORTED = (0x00000002) +NV2080_PLATFORM_POWER_MODE_CHANGE_COMPLETION = (0x00000000) +NV2080_PLATFORM_POWER_MODE_CHANGE_ACPI_NOTIFICATION = (0x00000001) +NV2080_NOTIFICATION_STATUS_ERROR_PROTECTION_FAULT = (0x4000) +NV2080_TYPEDEF = Nv20Subdevice0 +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_INDEX = (7, 0) +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_MASK = (15, 8) +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_REASON = (23, 16) +AMPERE_CHANNEL_GPFIFO_A = (0x0000C56F) +NVC56F_NUMBER_OF_SUBCHANNELS = (8) +NVC56F_SET_OBJECT = (0x00000000) +NVC56F_SET_OBJECT_NVCLASS = (15, 0) +NVC56F_SET_OBJECT_ENGINE = (20, 16) +NVC56F_SET_OBJECT_ENGINE_SW = 0x0000001f +NVC56F_ILLEGAL = (0x00000004) +NVC56F_ILLEGAL_HANDLE = (31, 0) +NVC56F_NOP = (0x00000008) +NVC56F_NOP_HANDLE = (31, 0) +NVC56F_SEMAPHOREA = (0x00000010) +NVC56F_SEMAPHOREA_OFFSET_UPPER = (7, 0) +NVC56F_SEMAPHOREB = (0x00000014) +NVC56F_SEMAPHOREB_OFFSET_LOWER = (31, 2) +NVC56F_SEMAPHOREC = (0x00000018) +NVC56F_SEMAPHOREC_PAYLOAD = (31, 0) +NVC56F_SEMAPHORED = (0x0000001C) +NVC56F_SEMAPHORED_OPERATION = (4, 0) +NVC56F_SEMAPHORED_OPERATION_ACQUIRE = 0x00000001 +NVC56F_SEMAPHORED_OPERATION_RELEASE = 0x00000002 +NVC56F_SEMAPHORED_OPERATION_ACQ_GEQ = 0x00000004 +NVC56F_SEMAPHORED_OPERATION_ACQ_AND = 0x00000008 +NVC56F_SEMAPHORED_OPERATION_REDUCTION = 0x00000010 +NVC56F_SEMAPHORED_ACQUIRE_SWITCH = (12, 12) +NVC56F_SEMAPHORED_ACQUIRE_SWITCH_DISABLED = 0x00000000 +NVC56F_SEMAPHORED_ACQUIRE_SWITCH_ENABLED = 0x00000001 +NVC56F_SEMAPHORED_RELEASE_WFI = (20, 20) +NVC56F_SEMAPHORED_RELEASE_WFI_EN = 0x00000000 +NVC56F_SEMAPHORED_RELEASE_WFI_DIS = 0x00000001 +NVC56F_SEMAPHORED_RELEASE_SIZE = (24, 24) +NVC56F_SEMAPHORED_RELEASE_SIZE_16BYTE = 0x00000000 +NVC56F_SEMAPHORED_RELEASE_SIZE_4BYTE = 0x00000001 +NVC56F_SEMAPHORED_REDUCTION = (30, 27) +NVC56F_SEMAPHORED_REDUCTION_MIN = 0x00000000 +NVC56F_SEMAPHORED_REDUCTION_MAX = 0x00000001 +NVC56F_SEMAPHORED_REDUCTION_XOR = 0x00000002 +NVC56F_SEMAPHORED_REDUCTION_AND = 0x00000003 +NVC56F_SEMAPHORED_REDUCTION_OR = 0x00000004 +NVC56F_SEMAPHORED_REDUCTION_ADD = 0x00000005 +NVC56F_SEMAPHORED_REDUCTION_INC = 0x00000006 +NVC56F_SEMAPHORED_REDUCTION_DEC = 0x00000007 +NVC56F_SEMAPHORED_FORMAT = (31, 31) +NVC56F_SEMAPHORED_FORMAT_SIGNED = 0x00000000 +NVC56F_SEMAPHORED_FORMAT_UNSIGNED = 0x00000001 +NVC56F_NON_STALL_INTERRUPT = (0x00000020) +NVC56F_NON_STALL_INTERRUPT_HANDLE = (31, 0) +NVC56F_FB_FLUSH = (0x00000024) +NVC56F_FB_FLUSH_HANDLE = (31, 0) +NVC56F_MEM_OP_A = (0x00000028) +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_CLIENT_UNIT_ID = (5, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE = (5, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_GPC_ID = (10, 6) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE = (7, 6) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_ALL_TLBS = 0 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_LINK_TLBS = 1 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_NON_LINK_TLBS = 2 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_RSVRVD = 3 +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_MMU_ENGINE_ID = (6, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR = (11, 11) +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN = 0x00000001 +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS = 0x00000000 +NVC56F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO = (31, 12) +NVC56F_MEM_OP_B = (0x0000002c) +NVC56F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI = (31, 0) +NVC56F_MEM_OP_C = (0x00000030) +NVC56F_MEM_OP_C_MEMBAR_TYPE = (2, 0) +NVC56F_MEM_OP_C_MEMBAR_TYPE_SYS_MEMBAR = 0x00000000 +NVC56F_MEM_OP_C_MEMBAR_TYPE_MEMBAR = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB = (0, 0) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC = (1, 1) +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY = (4, 2) +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START_ACK_ALL = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_TARGETED = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_GLOBAL = 0x00000004 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_VA_GLOBAL = 0x00000005 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE = (6, 5) +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_INTRANODE = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE = (9, 7) +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_READ = 0 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE = 1 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 2 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_RSVRVD = 3 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 4 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_ALL = 5 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE_AND_ATOMIC = 6 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ALL = 7 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL = (9, 7) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE0 = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE1 = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE2 = 0x00000004 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE3 = 0x00000005 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 = 0x00000006 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE5 = 0x00000007 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE = (11, 10) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_NONCOHERENT = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO = (31, 12) +NVC56F_MEM_OP_C_ACCESS_COUNTER_CLR_TARGETED_NOTIFY_TAG = (19, 0) +NVC56F_MEM_OP_D = (0x00000034) +NVC56F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI = (26, 0) +NVC56F_MEM_OP_D_OPERATION = (31, 27) +NVC56F_MEM_OP_D_OPERATION_MEMBAR = 0x00000005 +NVC56F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE = 0x00000009 +NVC56F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED = 0x0000000a +NVC56F_MEM_OP_D_OPERATION_L2_PEERMEM_INVALIDATE = 0x0000000d +NVC56F_MEM_OP_D_OPERATION_L2_SYSMEM_INVALIDATE = 0x0000000e +NVC56F_MEM_OP_B_OPERATION_L2_INVALIDATE_CLEAN_LINES = 0x0000000e +NVC56F_MEM_OP_D_OPERATION_L2_CLEAN_COMPTAGS = 0x0000000f +NVC56F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY = 0x00000010 +NVC56F_MEM_OP_D_OPERATION_L2_WAIT_FOR_SYS_PENDING_READS = 0x00000015 +NVC56F_MEM_OP_D_OPERATION_ACCESS_COUNTER_CLR = 0x00000016 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE = (1, 0) +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MIMC = 0x00000000 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MOMC = 0x00000001 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_ALL = 0x00000002 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_TARGETED = 0x00000003 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE = (2, 2) +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MIMC = 0x00000000 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MOMC = 0x00000001 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_BANK = (6, 3) +NVC56F_SET_REFERENCE = (0x00000050) +NVC56F_SET_REFERENCE_COUNT = (31, 0) +NVC56F_SEM_ADDR_LO = (0x0000005c) +NVC56F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC56F_SEM_ADDR_HI = (0x00000060) +NVC56F_SEM_ADDR_HI_OFFSET = (7, 0) +NVC56F_SEM_PAYLOAD_LO = (0x00000064) +NVC56F_SEM_PAYLOAD_LO_PAYLOAD = (31, 0) +NVC56F_SEM_PAYLOAD_HI = (0x00000068) +NVC56F_SEM_PAYLOAD_HI_PAYLOAD = (31, 0) +NVC56F_SEM_EXECUTE = (0x0000006c) +NVC56F_SEM_EXECUTE_OPERATION = (2, 0) +NVC56F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC56F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_STRICT_GEQ = 0x00000002 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_CIRC_GEQ = 0x00000003 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_AND = 0x00000004 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_NOR = 0x00000005 +NVC56F_SEM_EXECUTE_OPERATION_REDUCTION = 0x00000006 +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG = (12, 12) +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG_EN = 0x00000001 +NVC56F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC56F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_RELEASE_WFI_EN = 0x00000001 +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE_64BIT = 0x00000001 +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP = (25, 25) +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP_EN = 0x00000001 +NVC56F_SEM_EXECUTE_REDUCTION = (30, 27) +NVC56F_SEM_EXECUTE_REDUCTION_IMIN = 0x00000000 +NVC56F_SEM_EXECUTE_REDUCTION_IMAX = 0x00000001 +NVC56F_SEM_EXECUTE_REDUCTION_IXOR = 0x00000002 +NVC56F_SEM_EXECUTE_REDUCTION_IAND = 0x00000003 +NVC56F_SEM_EXECUTE_REDUCTION_IOR = 0x00000004 +NVC56F_SEM_EXECUTE_REDUCTION_IADD = 0x00000005 +NVC56F_SEM_EXECUTE_REDUCTION_INC = 0x00000006 +NVC56F_SEM_EXECUTE_REDUCTION_DEC = 0x00000007 +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT = (31, 31) +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT_SIGNED = 0x00000000 +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT_UNSIGNED = 0x00000001 +NVC56F_WFI = (0x00000078) +NVC56F_WFI_SCOPE = (0, 0) +NVC56F_WFI_SCOPE_CURRENT_SCG_TYPE = 0x00000000 +NVC56F_WFI_SCOPE_CURRENT_VEID = 0x00000000 +NVC56F_WFI_SCOPE_ALL = 0x00000001 +NVC56F_YIELD = (0x00000080) +NVC56F_YIELD_OP = (1, 0) +NVC56F_YIELD_OP_NOP = 0x00000000 +NVC56F_YIELD_OP_TSG = 0x00000003 +NVC56F_CLEAR_FAULTED = (0x00000084) +NVC56F_CLEAR_FAULTED_HANDLE = (30, 0) +NVC56F_CLEAR_FAULTED_TYPE = (31, 31) +NVC56F_CLEAR_FAULTED_TYPE_PBDMA_FAULTED = 0x00000000 +NVC56F_CLEAR_FAULTED_TYPE_ENG_FAULTED = 0x00000001 +NVC56F_GP_ENTRY__SIZE = 8 +NVC56F_GP_ENTRY0_FETCH = (0, 0) +NVC56F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC56F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC56F_GP_ENTRY0_GET = (31, 2) +NVC56F_GP_ENTRY0_OPERAND = (31, 0) +NVC56F_GP_ENTRY1_GET_HI = (7, 0) +NVC56F_GP_ENTRY1_LEVEL = (9, 9) +NVC56F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC56F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC56F_GP_ENTRY1_LENGTH = (30, 10) +NVC56F_GP_ENTRY1_SYNC = (31, 31) +NVC56F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC56F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC56F_GP_ENTRY1_OPCODE = (7, 0) +NVC56F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC56F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC56F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC56F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC56F_DMA_METHOD_ADDRESS_OLD = (12, 2) +NVC56F_DMA_METHOD_ADDRESS = (11, 0) +NVC56F_DMA_SUBDEVICE_MASK = (15, 4) +NVC56F_DMA_METHOD_SUBCHANNEL = (15, 13) +NVC56F_DMA_TERT_OP = (17, 16) +NVC56F_DMA_TERT_OP_GRP0_INC_METHOD = (0x00000000) +NVC56F_DMA_TERT_OP_GRP0_SET_SUB_DEV_MASK = (0x00000001) +NVC56F_DMA_TERT_OP_GRP0_STORE_SUB_DEV_MASK = (0x00000002) +NVC56F_DMA_TERT_OP_GRP0_USE_SUB_DEV_MASK = (0x00000003) +NVC56F_DMA_TERT_OP_GRP2_NON_INC_METHOD = (0x00000000) +NVC56F_DMA_METHOD_COUNT_OLD = (28, 18) +NVC56F_DMA_METHOD_COUNT = (28, 16) +NVC56F_DMA_IMMD_DATA = (28, 16) +NVC56F_DMA_SEC_OP = (31, 29) +NVC56F_DMA_SEC_OP_GRP0_USE_TERT = (0x00000000) +NVC56F_DMA_SEC_OP_INC_METHOD = (0x00000001) +NVC56F_DMA_SEC_OP_GRP2_USE_TERT = (0x00000002) +NVC56F_DMA_SEC_OP_NON_INC_METHOD = (0x00000003) +NVC56F_DMA_SEC_OP_IMMD_DATA_METHOD = (0x00000004) +NVC56F_DMA_SEC_OP_ONE_INC = (0x00000005) +NVC56F_DMA_SEC_OP_RESERVED6 = (0x00000006) +NVC56F_DMA_SEC_OP_END_PB_SEGMENT = (0x00000007) +NVC56F_DMA_INCR_ADDRESS = (11, 0) +NVC56F_DMA_INCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_INCR_COUNT = (28, 16) +NVC56F_DMA_INCR_OPCODE = (31, 29) +NVC56F_DMA_INCR_OPCODE_VALUE = (0x00000001) +NVC56F_DMA_INCR_DATA = (31, 0) +NVC56F_DMA_NONINCR_ADDRESS = (11, 0) +NVC56F_DMA_NONINCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_NONINCR_COUNT = (28, 16) +NVC56F_DMA_NONINCR_OPCODE = (31, 29) +NVC56F_DMA_NONINCR_OPCODE_VALUE = (0x00000003) +NVC56F_DMA_NONINCR_DATA = (31, 0) +NVC56F_DMA_ONEINCR_ADDRESS = (11, 0) +NVC56F_DMA_ONEINCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_ONEINCR_COUNT = (28, 16) +NVC56F_DMA_ONEINCR_OPCODE = (31, 29) +NVC56F_DMA_ONEINCR_OPCODE_VALUE = (0x00000005) +NVC56F_DMA_ONEINCR_DATA = (31, 0) +NVC56F_DMA_NOP = (0x00000000) +NVC56F_DMA_IMMD_ADDRESS = (11, 0) +NVC56F_DMA_IMMD_SUBCHANNEL = (15, 13) +NVC56F_DMA_IMMD_DATA = (28, 16) +NVC56F_DMA_IMMD_OPCODE = (31, 29) +NVC56F_DMA_IMMD_OPCODE_VALUE = (0x00000004) +NVC56F_DMA_SET_SUBDEVICE_MASK_VALUE = (15, 4) +NVC56F_DMA_SET_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_SET_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000001) +NVC56F_DMA_STORE_SUBDEVICE_MASK_VALUE = (15, 4) +NVC56F_DMA_STORE_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_STORE_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000002) +NVC56F_DMA_USE_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_USE_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000003) +NVC56F_DMA_ENDSEG_OPCODE = (31, 29) +NVC56F_DMA_ENDSEG_OPCODE_VALUE = (0x00000007) +NVC56F_DMA_ADDRESS = (12, 2) +NVC56F_DMA_SUBCH = (15, 13) +NVC56F_DMA_OPCODE3 = (17, 16) +NVC56F_DMA_OPCODE3_NONE = (0x00000000) +NVC56F_DMA_COUNT = (28, 18) +NVC56F_DMA_OPCODE = (31, 29) +NVC56F_DMA_OPCODE_METHOD = (0x00000000) +NVC56F_DMA_OPCODE_NONINC_METHOD = (0x00000002) +NVC56F_DMA_DATA = (31, 0) +HOPPER_CHANNEL_GPFIFO_A = (0x0000C86F) +NVC86F_SET_OBJECT = (0x00000000) +NVC86F_MEM_OP_A = (0x00000028) +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_CLIENT_UNIT_ID = (5, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE = (5, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_GPC_ID = (10, 6) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE = (7, 6) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_ALL_TLBS = 0 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_LINK_TLBS = 1 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_NON_LINK_TLBS = 2 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_RSVRVD = 3 +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_MMU_ENGINE_ID = (8, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR = (11, 11) +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN = 0x00000001 +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS = 0x00000000 +NVC86F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO = (31, 12) +NVC86F_MEM_OP_B = (0x0000002c) +NVC86F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI = (31, 0) +NVC86F_MEM_OP_C = (0x00000030) +NVC86F_MEM_OP_C_MEMBAR_TYPE = (2, 0) +NVC86F_MEM_OP_C_MEMBAR_TYPE_SYS_MEMBAR = 0x00000000 +NVC86F_MEM_OP_C_MEMBAR_TYPE_MEMBAR = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB = (0, 0) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC = (1, 1) +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY = (4, 2) +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START_ACK_ALL = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_TARGETED = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_GLOBAL = 0x00000004 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_VA_GLOBAL = 0x00000005 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE = (6, 5) +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_INTRANODE = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE = (9, 7) +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_READ = 0 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE = 1 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 2 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_RSVRVD = 3 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 4 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_ALL = 5 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE_AND_ATOMIC = 6 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ALL = 7 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL = (9, 7) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE0 = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE1 = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE2 = 0x00000004 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE3 = 0x00000005 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 = 0x00000006 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE5 = 0x00000007 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE = (11, 10) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_NONCOHERENT = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO = (31, 12) +NVC86F_MEM_OP_C_ACCESS_COUNTER_CLR_TARGETED_NOTIFY_TAG = (19, 0) +NVC86F_MEM_OP_D = (0x00000034) +NVC86F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI = (26, 0) +NVC86F_MEM_OP_D_OPERATION = (31, 27) +NVC86F_MEM_OP_D_OPERATION_MEMBAR = 0x00000005 +NVC86F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE = 0x00000009 +NVC86F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED = 0x0000000a +NVC86F_MEM_OP_D_OPERATION_MMU_OPERATION = 0x0000000b +NVC86F_MEM_OP_D_OPERATION_L2_PEERMEM_INVALIDATE = 0x0000000d +NVC86F_MEM_OP_D_OPERATION_L2_SYSMEM_INVALIDATE = 0x0000000e +NVC86F_MEM_OP_B_OPERATION_L2_INVALIDATE_CLEAN_LINES = 0x0000000e +NVC86F_MEM_OP_D_OPERATION_L2_CLEAN_COMPTAGS = 0x0000000f +NVC86F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY = 0x00000010 +NVC86F_MEM_OP_D_OPERATION_L2_WAIT_FOR_SYS_PENDING_READS = 0x00000015 +NVC86F_MEM_OP_D_OPERATION_ACCESS_COUNTER_CLR = 0x00000016 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE = (1, 0) +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MIMC = 0x00000000 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MOMC = 0x00000001 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_ALL = 0x00000002 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_TARGETED = 0x00000003 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE = (2, 2) +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MIMC = 0x00000000 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MOMC = 0x00000001 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_BANK = (6, 3) +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE = (23, 20) +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE_RESERVED = 0x00000000 +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE_VIDMEM_ACCESS_BIT_DUMP = 0x00000001 +NVC86F_SEM_ADDR_LO = (0x0000005c) +NVC86F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC86F_SEM_ADDR_HI = (0x00000060) +NVC86F_SEM_ADDR_HI_OFFSET = (24, 0) +NVC86F_SEM_PAYLOAD_LO = (0x00000064) +NVC86F_SEM_PAYLOAD_HI = (0x00000068) +NVC86F_SEM_EXECUTE = (0x0000006c) +NVC86F_SEM_EXECUTE_OPERATION = (2, 0) +NVC86F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC86F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC86F_SEM_EXECUTE_OPERATION_ACQ_CIRC_GEQ = 0x00000003 +NVC86F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG = (12, 12) +NVC86F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG_EN = 0x00000001 +NVC86F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC86F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC86F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC86F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC86F_SEM_EXECUTE_RELEASE_TIMESTAMP = (25, 25) +NVC86F_SEM_EXECUTE_RELEASE_TIMESTAMP_DIS = 0x00000000 +NVC86F_SEM_EXECUTE_RELEASE_TIMESTAMP_EN = 0x00000001 +NVC86F_WFI = (0x00000078) +NVC86F_WFI_SCOPE = (0, 0) +NVC86F_WFI_SCOPE_CURRENT_SCG_TYPE = 0x00000000 +NVC86F_WFI_SCOPE_CURRENT_VEID = 0x00000000 +NVC86F_WFI_SCOPE_ALL = 0x00000001 +NVC86F_GP_ENTRY__SIZE = 8 +NVC86F_GP_ENTRY0_FETCH = (0, 0) +NVC86F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC86F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC86F_GP_ENTRY0_GET = (31, 2) +NVC86F_GP_ENTRY0_OPERAND = (31, 0) +NVC86F_GP_ENTRY0_PB_EXTENDED_BASE_OPERAND = (24, 8) +NVC86F_GP_ENTRY1_GET_HI = (7, 0) +NVC86F_GP_ENTRY1_LEVEL = (9, 9) +NVC86F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC86F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC86F_GP_ENTRY1_LENGTH = (30, 10) +NVC86F_GP_ENTRY1_SYNC = (31, 31) +NVC86F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC86F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC86F_GP_ENTRY1_OPCODE = (7, 0) +NVC86F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC86F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC86F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC86F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC86F_GP_ENTRY1_OPCODE_SET_PB_SEGMENT_EXTENDED_BASE = 0x00000004 +BLACKWELL_CHANNEL_GPFIFO_A = (0x0000C96F) +NVC96F_SET_OBJECT = (0x00000000) +NVC96F_MEM_OP_A = (0x00000028) +NVC96F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE = (5, 0) +NVC96F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE = (7, 6) +NVC96F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_NON_LINK_TLBS = 2 +NVC96F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR = (11, 11) +NVC96F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN = 0x00000001 +NVC96F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS = 0x00000000 +NVC96F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO = (31, 12) +NVC96F_MEM_OP_B = (0x0000002c) +NVC96F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI = (31, 0) +NVC96F_MEM_OP_C = (0x00000030) +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB = (0, 0) +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL = 0x00000001 +NVC96F_MEM_OP_C_TLB_INVALIDATE_GPC = (1, 1) +NVC96F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE = 0x00000001 +NVC96F_MEM_OP_C_TLB_INVALIDATE_REPLAY = (4, 2) +NVC96F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE = (6, 5) +NVC96F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY = 0x00000001 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL = (9, 7) +NVC96F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY = 0x00000001 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 = 0x00000006 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE = (11, 10) +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT = 0x00000002 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO = (31, 12) +NVC96F_MEM_OP_D = (0x00000034) +NVC96F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI = (26, 0) +NVC96F_MEM_OP_D_OPERATION = (31, 27) +NVC96F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE = 0x00000009 +NVC96F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED = 0x0000000a +NVC96F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY = 0x00000010 +NVC96F_MEM_OP_D_OPERATION_L2_SYSMEM_NCOH_INVALIDATE = 0x00000011 +NVC96F_SEM_ADDR_LO = (0x0000005c) +NVC96F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC96F_SEM_ADDR_HI = (0x00000060) +NVC96F_SEM_ADDR_HI_OFFSET = (24, 0) +NVC96F_SEM_PAYLOAD_LO = (0x00000064) +NVC96F_SEM_PAYLOAD_HI = (0x00000068) +NVC96F_SEM_EXECUTE = (0x0000006c) +NVC96F_SEM_EXECUTE_OPERATION = (2, 0) +NVC96F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC96F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC96F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC96F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC96F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC96F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC96F_GP_ENTRY__SIZE = 8 +NVC96F_GP_ENTRY0_FETCH = (0, 0) +NVC96F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC96F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC96F_GP_ENTRY0_GET = (31, 2) +NVC96F_GP_ENTRY0_OPERAND = (31, 0) +NVC96F_GP_ENTRY0_PB_EXTENDED_BASE_OPERAND = (24, 8) +NVC96F_GP_ENTRY1_GET_HI = (7, 0) +NVC96F_GP_ENTRY1_LEVEL = (9, 9) +NVC96F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC96F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC96F_GP_ENTRY1_LENGTH = (30, 10) +NVC96F_GP_ENTRY1_SYNC = (31, 31) +NVC96F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC96F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC96F_GP_ENTRY1_OPCODE = (7, 0) +NVC96F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC96F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC96F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC96F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC96F_GP_ENTRY1_OPCODE_SET_PB_SEGMENT_EXTENDED_BASE = 0x00000004 +BLACKWELL_USERMODE_A = (0xc761) +GT200_DEBUGGER = (0x83de) +NV83DE_ALLOC_PARAMETERS_MESSAGE_ID = (0x83de) +MAXWELL_PROFILER_DEVICE = (0xb2cc) +NVB2CC_ALLOC_PARAMETERS_MESSAGE_ID = (0xb2cc) +AMPERE_COMPUTE_A = 0xC6C0 +NVC6C0_SET_OBJECT = 0x0000 +NVC6C0_SET_OBJECT_CLASS_ID = (15, 0) +NVC6C0_SET_OBJECT_ENGINE_ID = (20, 16) +NVC6C0_NO_OPERATION = 0x0100 +NVC6C0_NO_OPERATION_V = (31, 0) +NVC6C0_SET_NOTIFY_A = 0x0104 +NVC6C0_SET_NOTIFY_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_NOTIFY_B = 0x0108 +NVC6C0_SET_NOTIFY_B_ADDRESS_LOWER = (31, 0) +NVC6C0_NOTIFY = 0x010c +NVC6C0_NOTIFY_TYPE = (31, 0) +NVC6C0_NOTIFY_TYPE_WRITE_ONLY = 0x00000000 +NVC6C0_NOTIFY_TYPE_WRITE_THEN_AWAKEN = 0x00000001 +NVC6C0_WAIT_FOR_IDLE = 0x0110 +NVC6C0_WAIT_FOR_IDLE_V = (31, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_A = 0x0130 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_B = 0x0134 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C = 0x0138 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE = (2, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_FALSE = 0x00000000 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_TRUE = 0x00000001 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_CONDITIONAL = 0x00000002 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = 0x00000003 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = 0x00000004 +NVC6C0_SEND_GO_IDLE = 0x013c +NVC6C0_SEND_GO_IDLE_V = (31, 0) +NVC6C0_PM_TRIGGER = 0x0140 +NVC6C0_PM_TRIGGER_V = (31, 0) +NVC6C0_PM_TRIGGER_WFI = 0x0144 +NVC6C0_PM_TRIGGER_WFI_V = (31, 0) +NVC6C0_FE_ATOMIC_SEQUENCE_BEGIN = 0x0148 +NVC6C0_FE_ATOMIC_SEQUENCE_BEGIN_V = (31, 0) +NVC6C0_FE_ATOMIC_SEQUENCE_END = 0x014c +NVC6C0_FE_ATOMIC_SEQUENCE_END_V = (31, 0) +NVC6C0_SET_INSTRUMENTATION_METHOD_HEADER = 0x0150 +NVC6C0_SET_INSTRUMENTATION_METHOD_HEADER_V = (31, 0) +NVC6C0_SET_INSTRUMENTATION_METHOD_DATA = 0x0154 +NVC6C0_SET_INSTRUMENTATION_METHOD_DATA_V = (31, 0) +NVC6C0_LINE_LENGTH_IN = 0x0180 +NVC6C0_LINE_LENGTH_IN_VALUE = (31, 0) +NVC6C0_LINE_COUNT = 0x0184 +NVC6C0_LINE_COUNT_VALUE = (31, 0) +NVC6C0_OFFSET_OUT_UPPER = 0x0188 +NVC6C0_OFFSET_OUT_UPPER_VALUE = (16, 0) +NVC6C0_OFFSET_OUT = 0x018c +NVC6C0_OFFSET_OUT_VALUE = (31, 0) +NVC6C0_PITCH_OUT = 0x0190 +NVC6C0_PITCH_OUT_VALUE = (31, 0) +NVC6C0_SET_DST_BLOCK_SIZE = 0x0194 +NVC6C0_SET_DST_BLOCK_SIZE_WIDTH = (3, 0) +NVC6C0_SET_DST_BLOCK_SIZE_WIDTH_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_TWO_GOBS = 0x00000001 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_FOUR_GOBS = 0x00000002 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = 0x00000003 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = 0x00000004 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = 0x00000005 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH = (11, 8) +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_TWO_GOBS = 0x00000001 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_FOUR_GOBS = 0x00000002 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_EIGHT_GOBS = 0x00000003 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = 0x00000004 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = 0x00000005 +NVC6C0_SET_DST_WIDTH = 0x0198 +NVC6C0_SET_DST_WIDTH_V = (31, 0) +NVC6C0_SET_DST_HEIGHT = 0x019c +NVC6C0_SET_DST_HEIGHT_V = (31, 0) +NVC6C0_SET_DST_DEPTH = 0x01a0 +NVC6C0_SET_DST_DEPTH_V = (31, 0) +NVC6C0_SET_DST_LAYER = 0x01a4 +NVC6C0_SET_DST_LAYER_V = (31, 0) +NVC6C0_SET_DST_ORIGIN_BYTES_X = 0x01a8 +NVC6C0_SET_DST_ORIGIN_BYTES_X_V = (20, 0) +NVC6C0_SET_DST_ORIGIN_SAMPLES_Y = 0x01ac +NVC6C0_SET_DST_ORIGIN_SAMPLES_Y_V = (16, 0) +NVC6C0_LAUNCH_DMA = 0x01b0 +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT = (0, 0) +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT_BLOCKLINEAR = 0x00000000 +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT_PITCH = 0x00000001 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE = (5, 4) +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_FLUSH_DISABLE = 0x00000000 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_FLUSH_ONLY = 0x00000001 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_RELEASE_SEMAPHORE = 0x00000002 +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE = (9, 8) +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE_NONE = 0x00000000 +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE_INTERRUPT = 0x00000001 +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE = (12, 12) +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE_ONE_WORD = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE = (1, 1) +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_OP = (15, 13) +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT = (3, 2) +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE = (6, 6) +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE_FALSE = 0x00000000 +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE_TRUE = 0x00000001 +NVC6C0_LOAD_INLINE_DATA = 0x01b4 +NVC6C0_LOAD_INLINE_DATA_V = (31, 0) +NVC6C0_SET_I2M_SEMAPHORE_A = 0x01dc +NVC6C0_SET_I2M_SEMAPHORE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_I2M_SEMAPHORE_B = 0x01e0 +NVC6C0_SET_I2M_SEMAPHORE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_I2M_SEMAPHORE_C = 0x01e4 +NVC6C0_SET_I2M_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC6C0_SET_SM_SCG_CONTROL = 0x01e8 +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS = (0, 0) +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS_FALSE = 0x00000000 +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS_TRUE = 0x00000001 +NVC6C0_SET_I2M_SPARE_NOOP00 = 0x01f0 +NVC6C0_SET_I2M_SPARE_NOOP00_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP01 = 0x01f4 +NVC6C0_SET_I2M_SPARE_NOOP01_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP02 = 0x01f8 +NVC6C0_SET_I2M_SPARE_NOOP02_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP03 = 0x01fc +NVC6C0_SET_I2M_SPARE_NOOP03_V = (31, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_A = 0x0200 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_B = 0x0204 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_C = 0x0208 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_C_SIZE = (31, 0) +NVC6C0_PERFMON_TRANSFER = 0x0210 +NVC6C0_PERFMON_TRANSFER_V = (31, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_A = 0x0214 +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_B = 0x0218 +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_B_ADDRESS_LOWER = (31, 0) +NVC6C0_INVALIDATE_SHADER_CACHES = 0x021c +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION = (0, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_DATA = (4, 4) +NVC6C0_INVALIDATE_SHADER_CACHES_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_DATA_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT = (12, 12) +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS = (1, 1) +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA = (2, 2) +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA_TRUE = 0x00000001 +NVC6C0_SET_RESERVED_SW_METHOD00 = 0x0220 +NVC6C0_SET_RESERVED_SW_METHOD00_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD01 = 0x0224 +NVC6C0_SET_RESERVED_SW_METHOD01_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD02 = 0x0228 +NVC6C0_SET_RESERVED_SW_METHOD02_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD03 = 0x022c +NVC6C0_SET_RESERVED_SW_METHOD03_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD04 = 0x0230 +NVC6C0_SET_RESERVED_SW_METHOD04_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD05 = 0x0234 +NVC6C0_SET_RESERVED_SW_METHOD05_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD06 = 0x0238 +NVC6C0_SET_RESERVED_SW_METHOD06_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD07 = 0x023c +NVC6C0_SET_RESERVED_SW_METHOD07_V = (31, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI = 0x0244 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_SET_CWD_REF_COUNTER = 0x0248 +NVC6C0_SET_CWD_REF_COUNTER_SELECT = (5, 0) +NVC6C0_SET_CWD_REF_COUNTER_VALUE = (23, 8) +NVC6C0_SET_RESERVED_SW_METHOD08 = 0x024c +NVC6C0_SET_RESERVED_SW_METHOD08_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD09 = 0x0250 +NVC6C0_SET_RESERVED_SW_METHOD09_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD10 = 0x0254 +NVC6C0_SET_RESERVED_SW_METHOD10_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD11 = 0x0258 +NVC6C0_SET_RESERVED_SW_METHOD11_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD12 = 0x025c +NVC6C0_SET_RESERVED_SW_METHOD12_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD13 = 0x0260 +NVC6C0_SET_RESERVED_SW_METHOD13_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD14 = 0x0264 +NVC6C0_SET_RESERVED_SW_METHOD14_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD15 = 0x0268 +NVC6C0_SET_RESERVED_SW_METHOD15_V = (31, 0) +NVC6C0_SET_SCG_CONTROL = 0x0270 +NVC6C0_SET_SCG_CONTROL_COMPUTE1_MAX_SM_COUNT = (8, 0) +NVC6C0_SET_SCG_CONTROL_COMPUTE1_MIN_SM_COUNT = (20, 12) +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE = (24, 24) +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE_FALSE = 0x00000000 +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE_TRUE = 0x00000001 +NVC6C0_SET_COMPUTE_CLASS_VERSION = 0x0280 +NVC6C0_SET_COMPUTE_CLASS_VERSION_CURRENT = (15, 0) +NVC6C0_SET_COMPUTE_CLASS_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_CHECK_COMPUTE_CLASS_VERSION = 0x0284 +NVC6C0_CHECK_COMPUTE_CLASS_VERSION_CURRENT = (15, 0) +NVC6C0_CHECK_COMPUTE_CLASS_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_SET_QMD_VERSION = 0x0288 +NVC6C0_SET_QMD_VERSION_CURRENT = (15, 0) +NVC6C0_SET_QMD_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_CHECK_QMD_VERSION = 0x0290 +NVC6C0_CHECK_QMD_VERSION_CURRENT = (15, 0) +NVC6C0_CHECK_QMD_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_INVALIDATE_SKED_CACHES = 0x0298 +NVC6C0_INVALIDATE_SKED_CACHES_V = (0, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL = 0x029c +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_CONSTANT_BUFFER_MASK = (7, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE = (8, 8) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE = (12, 12) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE = (16, 16) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE = (20, 20) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE = (24, 24) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_A = 0x02a0 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_A_BASE_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_B = 0x02a4 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_B_BASE_ADDRESS = (31, 0) +NVC6C0_SCG_HYSTERESIS_CONTROL = 0x02a8 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE = (0, 0) +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE_FALSE = 0x00000000 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE_TRUE = 0x00000001 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE = (1, 1) +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE_FALSE = 0x00000000 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE_TRUE = 0x00000001 +NVC6C0_SET_CWD_SLOT_COUNT = 0x02b0 +NVC6C0_SET_CWD_SLOT_COUNT_V = (7, 0) +NVC6C0_SEND_PCAS_A = 0x02b4 +NVC6C0_SEND_PCAS_A_QMD_ADDRESS_SHIFTED8 = (31, 0) +NVC6C0_SEND_PCAS_B = 0x02b8 +NVC6C0_SEND_PCAS_B_FROM = (23, 0) +NVC6C0_SEND_PCAS_B_DELTA = (31, 24) +NVC6C0_SEND_SIGNALING_PCAS_B = 0x02bc +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE = (0, 0) +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE_FALSE = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE_TRUE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE = (1, 1) +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE_FALSE = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE_TRUE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS2_B = 0x02c0 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION = (3, 0) +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_NOP = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_SCHEDULE = 0x00000002 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INCREMENT_PUT = 0x00000006 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_DECREMENT_DEPENDENCE = 0x00000007 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_PREFETCH = 0x00000008 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_PREFETCH_SCHEDULE = 0x00000009 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_PREFETCH_COPY_SCHEDULE = 0x0000000A +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_PREFETCH_COPY_FORCE_REQUIRE_SCHEDULING = 0x0000000B +NVC6C0_SET_SKED_CACHE_CONTROL = 0x02cc +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID = (0, 0) +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID_FALSE = 0x00000000 +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID_TRUE = 0x00000001 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A = 0x02e4 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A_SIZE_UPPER = (7, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_B = 0x02e8 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_B_SIZE_LOWER = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C = 0x02ec +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C_MAX_SM_COUNT = (8, 0) +NVC6C0_SET_SPA_VERSION = 0x0310 +NVC6C0_SET_SPA_VERSION_MINOR = (7, 0) +NVC6C0_SET_SPA_VERSION_MAJOR = (15, 8) +NVC6C0_SET_INLINE_QMD_ADDRESS_A = 0x0318 +NVC6C0_SET_INLINE_QMD_ADDRESS_A_QMD_ADDRESS_SHIFTED8_UPPER = (31, 0) +NVC6C0_SET_INLINE_QMD_ADDRESS_B = 0x031c +NVC6C0_SET_INLINE_QMD_ADDRESS_B_QMD_ADDRESS_SHIFTED8_LOWER = (31, 0) +NVC6C0_LOAD_INLINE_QMD_DATA = lambda i: (0x0320+(i)*4) # type: ignore +NVC6C0_LOAD_INLINE_QMD_DATA_V = (31, 0) +NVC6C0_SET_FALCON00 = 0x0500 +NVC6C0_SET_FALCON00_V = (31, 0) +NVC6C0_SET_FALCON01 = 0x0504 +NVC6C0_SET_FALCON01_V = (31, 0) +NVC6C0_SET_FALCON02 = 0x0508 +NVC6C0_SET_FALCON02_V = (31, 0) +NVC6C0_SET_FALCON03 = 0x050c +NVC6C0_SET_FALCON03_V = (31, 0) +NVC6C0_SET_FALCON04 = 0x0510 +NVC6C0_SET_FALCON04_V = (31, 0) +NVC6C0_SET_FALCON05 = 0x0514 +NVC6C0_SET_FALCON05_V = (31, 0) +NVC6C0_SET_FALCON06 = 0x0518 +NVC6C0_SET_FALCON06_V = (31, 0) +NVC6C0_SET_FALCON07 = 0x051c +NVC6C0_SET_FALCON07_V = (31, 0) +NVC6C0_SET_FALCON08 = 0x0520 +NVC6C0_SET_FALCON08_V = (31, 0) +NVC6C0_SET_FALCON09 = 0x0524 +NVC6C0_SET_FALCON09_V = (31, 0) +NVC6C0_SET_FALCON10 = 0x0528 +NVC6C0_SET_FALCON10_V = (31, 0) +NVC6C0_SET_FALCON11 = 0x052c +NVC6C0_SET_FALCON11_V = (31, 0) +NVC6C0_SET_FALCON12 = 0x0530 +NVC6C0_SET_FALCON12_V = (31, 0) +NVC6C0_SET_FALCON13 = 0x0534 +NVC6C0_SET_FALCON13_V = (31, 0) +NVC6C0_SET_FALCON14 = 0x0538 +NVC6C0_SET_FALCON14_V = (31, 0) +NVC6C0_SET_FALCON15 = 0x053c +NVC6C0_SET_FALCON15_V = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_A = 0x0790 +NVC6C0_SET_SHADER_LOCAL_MEMORY_A_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_B = 0x0794 +NVC6C0_SET_SHADER_LOCAL_MEMORY_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_A = 0x07b0 +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_A_BASE_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_B = 0x07b4 +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_B_BASE_ADDRESS = (31, 0) +NVC6C0_SET_SHADER_CACHE_CONTROL = 0x0d94 +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE = (0, 0) +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_SCG_COMPUTE_SCHEDULING_PARAMETERS = lambda i: (0x0da0+(i)*4) # type: ignore +NVC6C0_SET_SCG_COMPUTE_SCHEDULING_PARAMETERS_V = (31, 0) +NVC6C0_SET_SM_TIMEOUT_INTERVAL = 0x0de4 +NVC6C0_SET_SM_TIMEOUT_INTERVAL_COUNTER_BIT = (5, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI = 0x1288 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT = 0x12a8 +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL = (0, 0) +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL_FALSE = 0x00000000 +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE = 0x1330 +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE = 0x1334 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE = 0x1338 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI = 0x1424 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_SET_SHADER_EXCEPTIONS = 0x1528 +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE = (0, 0) +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_A = 0x1550 +NVC6C0_SET_RENDER_ENABLE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_RENDER_ENABLE_B = 0x1554 +NVC6C0_SET_RENDER_ENABLE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_RENDER_ENABLE_C = 0x1558 +NVC6C0_SET_RENDER_ENABLE_C_MODE = (2, 0) +NVC6C0_SET_RENDER_ENABLE_C_MODE_FALSE = 0x00000000 +NVC6C0_SET_RENDER_ENABLE_C_MODE_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_C_MODE_CONDITIONAL = 0x00000002 +NVC6C0_SET_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = 0x00000003 +NVC6C0_SET_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = 0x00000004 +NVC6C0_SET_TEX_SAMPLER_POOL_A = 0x155c +NVC6C0_SET_TEX_SAMPLER_POOL_A_OFFSET_UPPER = (16, 0) +NVC6C0_SET_TEX_SAMPLER_POOL_B = 0x1560 +NVC6C0_SET_TEX_SAMPLER_POOL_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_TEX_SAMPLER_POOL_C = 0x1564 +NVC6C0_SET_TEX_SAMPLER_POOL_C_MAXIMUM_INDEX = (19, 0) +NVC6C0_SET_TEX_HEADER_POOL_A = 0x1574 +NVC6C0_SET_TEX_HEADER_POOL_A_OFFSET_UPPER = (16, 0) +NVC6C0_SET_TEX_HEADER_POOL_B = 0x1578 +NVC6C0_SET_TEX_HEADER_POOL_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_TEX_HEADER_POOL_C = 0x157c +NVC6C0_SET_TEX_HEADER_POOL_C_MAXIMUM_INDEX = (21, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI = 0x1698 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION = (0, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA = (4, 4) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT = (12, 12) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE = 0x1944 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE = (1, 0) +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_USE_RENDER_ENABLE = 0x00000000 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_ALWAYS_RENDER = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_NEVER_RENDER = 0x00000002 +NVC6C0_PIPE_NOP = 0x1a2c +NVC6C0_PIPE_NOP_V = (31, 0) +NVC6C0_SET_SPARE00 = 0x1a30 +NVC6C0_SET_SPARE00_V = (31, 0) +NVC6C0_SET_SPARE01 = 0x1a34 +NVC6C0_SET_SPARE01_V = (31, 0) +NVC6C0_SET_SPARE02 = 0x1a38 +NVC6C0_SET_SPARE02_V = (31, 0) +NVC6C0_SET_SPARE03 = 0x1a3c +NVC6C0_SET_SPARE03_V = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_A = 0x1b00 +NVC6C0_SET_REPORT_SEMAPHORE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_REPORT_SEMAPHORE_B = 0x1b04 +NVC6C0_SET_REPORT_SEMAPHORE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_C = 0x1b08 +NVC6C0_SET_REPORT_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_D = 0x1b0c +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION = (1, 0) +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION_RELEASE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION_TRAP = 0x00000003 +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE = (20, 20) +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE = (28, 28) +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE = (2, 2) +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE = (3, 3) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP = (11, 9) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT = (18, 17) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP = (19, 19) +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP_TRUE = 0x00000001 +NVC6C0_SET_TRAP_HANDLER_A = 0x25f8 +NVC6C0_SET_TRAP_HANDLER_A_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_TRAP_HANDLER_B = 0x25fc +NVC6C0_SET_TRAP_HANDLER_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_BINDLESS_TEXTURE = 0x2608 +NVC6C0_SET_BINDLESS_TEXTURE_CONSTANT_BUFFER_SLOT_SELECT = (2, 0) +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE = lambda i: (0x32f4+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_UPPER = lambda i: (0x3314+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_UPPER_V = (31, 0) +NVC6C0_ENABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER = 0x3334 +NVC6C0_ENABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_V = (0, 0) +NVC6C0_DISABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER = 0x3338 +NVC6C0_DISABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_V = (0, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_UPPER = lambda i: (0x333c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_UPPER_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE = lambda i: (0x335c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_EVENT = lambda i: (0x337c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_EVENT_EVENT = (7, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A = lambda i: (0x339c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT0 = (1, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT0 = (4, 2) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT1 = (6, 5) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT1 = (9, 7) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT2 = (11, 10) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT2 = (14, 12) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT3 = (16, 15) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT3 = (19, 17) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT4 = (21, 20) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT4 = (24, 22) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT5 = (26, 25) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT5 = (29, 27) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_SPARE = (31, 30) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B = lambda i: (0x33bc+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_EDGE = (0, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_MODE = (2, 1) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_WINDOWED = (3, 3) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_FUNC = (19, 4) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_TRAP_CONTROL = 0x33dc +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_TRAP_CONTROL_MASK = (7, 0) +NVC6C0_START_SHADER_PERFORMANCE_COUNTER = 0x33e0 +NVC6C0_START_SHADER_PERFORMANCE_COUNTER_COUNTER_MASK = (7, 0) +NVC6C0_STOP_SHADER_PERFORMANCE_COUNTER = 0x33e4 +NVC6C0_STOP_SHADER_PERFORMANCE_COUNTER_COUNTER_MASK = (7, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_SCTL_FILTER = 0x33e8 +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_SCTL_FILTER_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CORE_MIO_FILTER = 0x33ec +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CORE_MIO_FILTER_V = (31, 0) +NVC6C0_SET_MME_SHADOW_SCRATCH = lambda i: (0x3400+(i)*4) # type: ignore +NVC6C0_SET_MME_SHADOW_SCRATCH_V = (31, 0) +BLACKWELL_COMPUTE_A = 0xCDC0 +AMPERE_DMA_COPY_A = (0x0000C6B5) +NVC6B5_NOP = (0x00000100) +NVC6B5_NOP_PARAMETER = (31, 0) +NVC6B5_PM_TRIGGER = (0x00000140) +NVC6B5_PM_TRIGGER_V = (31, 0) +NVC6B5_SET_SEMAPHORE_A = (0x00000240) +NVC6B5_SET_SEMAPHORE_A_UPPER = (16, 0) +NVC6B5_SET_SEMAPHORE_B = (0x00000244) +NVC6B5_SET_SEMAPHORE_B_LOWER = (31, 0) +NVC6B5_SET_SEMAPHORE_PAYLOAD = (0x00000248) +NVC6B5_SET_SEMAPHORE_PAYLOAD_PAYLOAD = (31, 0) +NVC6B5_SET_RENDER_ENABLE_A = (0x00000254) +NVC6B5_SET_RENDER_ENABLE_A_UPPER = (7, 0) +NVC6B5_SET_RENDER_ENABLE_B = (0x00000258) +NVC6B5_SET_RENDER_ENABLE_B_LOWER = (31, 0) +NVC6B5_SET_RENDER_ENABLE_C = (0x0000025C) +NVC6B5_SET_RENDER_ENABLE_C_MODE = (2, 0) +NVC6B5_SET_RENDER_ENABLE_C_MODE_FALSE = (0x00000000) +NVC6B5_SET_RENDER_ENABLE_C_MODE_TRUE = (0x00000001) +NVC6B5_SET_RENDER_ENABLE_C_MODE_CONDITIONAL = (0x00000002) +NVC6B5_SET_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = (0x00000003) +NVC6B5_SET_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = (0x00000004) +NVC6B5_SET_SRC_PHYS_MODE = (0x00000260) +NVC6B5_SET_SRC_PHYS_MODE_TARGET = (1, 0) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_LOCAL_FB = (0x00000000) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_PEERMEM = (0x00000003) +NVC6B5_SET_SRC_PHYS_MODE_BASIC_KIND = (5, 2) +NVC6B5_SET_SRC_PHYS_MODE_PEER_ID = (8, 6) +NVC6B5_SET_SRC_PHYS_MODE_FLA = (9, 9) +NVC6B5_SET_DST_PHYS_MODE = (0x00000264) +NVC6B5_SET_DST_PHYS_MODE_TARGET = (1, 0) +NVC6B5_SET_DST_PHYS_MODE_TARGET_LOCAL_FB = (0x00000000) +NVC6B5_SET_DST_PHYS_MODE_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC6B5_SET_DST_PHYS_MODE_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC6B5_SET_DST_PHYS_MODE_TARGET_PEERMEM = (0x00000003) +NVC6B5_SET_DST_PHYS_MODE_BASIC_KIND = (5, 2) +NVC6B5_SET_DST_PHYS_MODE_PEER_ID = (8, 6) +NVC6B5_SET_DST_PHYS_MODE_FLA = (9, 9) +NVC6B5_LAUNCH_DMA = (0x00000300) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE = (1, 0) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_PIPELINED = (0x00000001) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_NON_PIPELINED = (0x00000002) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE = (2, 2) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE = (25, 25) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE_SYS = (0x00000000) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE_GL = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE = (4, 3) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_ONE_WORD_SEMAPHORE = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_FOUR_WORD_SEMAPHORE = (0x00000002) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_CONDITIONAL_INTR_SEMAPHORE = (0x00000003) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE = (6, 5) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_BLOCKING = (0x00000001) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_NON_BLOCKING = (0x00000002) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT = (7, 7) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT_BLOCKLINEAR = (0x00000000) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT_PITCH = (0x00000001) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT = (8, 8) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT_BLOCKLINEAR = (0x00000000) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT_PITCH = (0x00000001) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE = (9, 9) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE = (10, 10) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE = (11, 11) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_SRC_TYPE = (12, 12) +NVC6B5_LAUNCH_DMA_SRC_TYPE_VIRTUAL = (0x00000000) +NVC6B5_LAUNCH_DMA_SRC_TYPE_PHYSICAL = (0x00000001) +NVC6B5_LAUNCH_DMA_DST_TYPE = (13, 13) +NVC6B5_LAUNCH_DMA_DST_TYPE_VIRTUAL = (0x00000000) +NVC6B5_LAUNCH_DMA_DST_TYPE_PHYSICAL = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION = (17, 14) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IMIN = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IMAX = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IXOR = (0x00000002) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IAND = (0x00000003) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IOR = (0x00000004) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IADD = (0x00000005) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INC = (0x00000006) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_DEC = (0x00000007) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_FADD = (0x0000000A) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN = (18, 18) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN_SIGNED = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN_UNSIGNED = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE = (19, 19) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_VPRMODE = (23, 22) +NVC6B5_LAUNCH_DMA_VPRMODE_VPR_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_VPRMODE_VPR_VID2VID = (0x00000001) +NVC6B5_LAUNCH_DMA_RESERVED_START_OF_COPY = (24, 24) +NVC6B5_LAUNCH_DMA_DISABLE_PLC = (26, 26) +NVC6B5_LAUNCH_DMA_DISABLE_PLC_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_DISABLE_PLC_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_RESERVED_ERR_CODE = (31, 28) +NVC6B5_OFFSET_IN_UPPER = (0x00000400) +NVC6B5_OFFSET_IN_UPPER_UPPER = (16, 0) +NVC6B5_OFFSET_IN_LOWER = (0x00000404) +NVC6B5_OFFSET_IN_LOWER_VALUE = (31, 0) +NVC6B5_OFFSET_OUT_UPPER = (0x00000408) +NVC6B5_OFFSET_OUT_UPPER_UPPER = (16, 0) +NVC6B5_OFFSET_OUT_LOWER = (0x0000040C) +NVC6B5_OFFSET_OUT_LOWER_VALUE = (31, 0) +NVC6B5_PITCH_IN = (0x00000410) +NVC6B5_PITCH_IN_VALUE = (31, 0) +NVC6B5_PITCH_OUT = (0x00000414) +NVC6B5_PITCH_OUT_VALUE = (31, 0) +NVC6B5_LINE_LENGTH_IN = (0x00000418) +NVC6B5_LINE_LENGTH_IN_VALUE = (31, 0) +NVC6B5_LINE_COUNT = (0x0000041C) +NVC6B5_LINE_COUNT_VALUE = (31, 0) +NVC6B5_SET_REMAP_CONST_A = (0x00000700) +NVC6B5_SET_REMAP_CONST_A_V = (31, 0) +NVC6B5_SET_REMAP_CONST_B = (0x00000704) +NVC6B5_SET_REMAP_CONST_B_V = (31, 0) +NVC6B5_SET_REMAP_COMPONENTS = (0x00000708) +NVC6B5_SET_REMAP_COMPONENTS_DST_X = (2, 0) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y = (6, 4) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z = (10, 8) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_W = (14, 12) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE = (17, 16) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_FOUR = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS = (21, 20) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_FOUR = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS = (25, 24) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_FOUR = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE = (0x0000070C) +NVC6B5_SET_DST_BLOCK_SIZE_WIDTH = (3, 0) +NVC6B5_SET_DST_BLOCK_SIZE_WIDTH_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_TWO_GOBS = (0x00000001) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_FOUR_GOBS = (0x00000002) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH = (11, 8) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_TWO_GOBS = (0x00000001) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_FOUR_GOBS = (0x00000002) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_DST_BLOCK_SIZE_GOB_HEIGHT = (15, 12) +NVC6B5_SET_DST_BLOCK_SIZE_GOB_HEIGHT_GOB_HEIGHT_FERMI_8 = (0x00000001) +NVC6B5_SET_DST_WIDTH = (0x00000710) +NVC6B5_SET_DST_WIDTH_V = (31, 0) +NVC6B5_SET_DST_HEIGHT = (0x00000714) +NVC6B5_SET_DST_HEIGHT_V = (31, 0) +NVC6B5_SET_DST_DEPTH = (0x00000718) +NVC6B5_SET_DST_DEPTH_V = (31, 0) +NVC6B5_SET_DST_LAYER = (0x0000071C) +NVC6B5_SET_DST_LAYER_V = (31, 0) +NVC6B5_SET_DST_ORIGIN = (0x00000720) +NVC6B5_SET_DST_ORIGIN_X = (15, 0) +NVC6B5_SET_DST_ORIGIN_Y = (31, 16) +NVC6B5_SET_SRC_BLOCK_SIZE = (0x00000728) +NVC6B5_SET_SRC_BLOCK_SIZE_WIDTH = (3, 0) +NVC6B5_SET_SRC_BLOCK_SIZE_WIDTH_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_TWO_GOBS = (0x00000001) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_FOUR_GOBS = (0x00000002) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH = (11, 8) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_TWO_GOBS = (0x00000001) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_FOUR_GOBS = (0x00000002) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_SRC_BLOCK_SIZE_GOB_HEIGHT = (15, 12) +NVC6B5_SET_SRC_BLOCK_SIZE_GOB_HEIGHT_GOB_HEIGHT_FERMI_8 = (0x00000001) +NVC6B5_SET_SRC_WIDTH = (0x0000072C) +NVC6B5_SET_SRC_WIDTH_V = (31, 0) +NVC6B5_SET_SRC_HEIGHT = (0x00000730) +NVC6B5_SET_SRC_HEIGHT_V = (31, 0) +NVC6B5_SET_SRC_DEPTH = (0x00000734) +NVC6B5_SET_SRC_DEPTH_V = (31, 0) +NVC6B5_SET_SRC_LAYER = (0x00000738) +NVC6B5_SET_SRC_LAYER_V = (31, 0) +NVC6B5_SET_SRC_ORIGIN = (0x0000073C) +NVC6B5_SET_SRC_ORIGIN_X = (15, 0) +NVC6B5_SET_SRC_ORIGIN_Y = (31, 16) +NVC6B5_SRC_ORIGIN_X = (0x00000744) +NVC6B5_SRC_ORIGIN_X_VALUE = (31, 0) +NVC6B5_SRC_ORIGIN_Y = (0x00000748) +NVC6B5_SRC_ORIGIN_Y_VALUE = (31, 0) +NVC6B5_DST_ORIGIN_X = (0x0000074C) +NVC6B5_DST_ORIGIN_X_VALUE = (31, 0) +NVC6B5_DST_ORIGIN_Y = (0x00000750) +NVC6B5_DST_ORIGIN_Y_VALUE = (31, 0) +NVC6B5_PM_TRIGGER_END = (0x00001114) +NVC6B5_PM_TRIGGER_END_V = (31, 0) +BLACKWELL_DMA_COPY_A = (0x0000C9B5) +UVM_IOCTL_BASE = lambda i: i # type: ignore +UVM_RESERVE_VA = UVM_IOCTL_BASE(1) +UVM_RELEASE_VA = UVM_IOCTL_BASE(2) +UVM_REGION_COMMIT = UVM_IOCTL_BASE(3) +UVM_REGION_DECOMMIT = UVM_IOCTL_BASE(4) +UVM_REGION_SET_STREAM = UVM_IOCTL_BASE(5) +UVM_SET_STREAM_RUNNING = UVM_IOCTL_BASE(6) +UVM_MAX_STREAMS_PER_IOCTL_CALL = 32 +UVM_SET_STREAM_STOPPED = UVM_IOCTL_BASE(7) +UVM_RUN_TEST = UVM_IOCTL_BASE(9) +UVM_EVENTS_OFFSET_BASE = (1 << 63) +UVM_COUNTERS_OFFSET_BASE = (1 << 62) +UVM_ADD_SESSION = UVM_IOCTL_BASE(10) +UVM_REMOVE_SESSION = UVM_IOCTL_BASE(11) +UVM_MAX_COUNTERS_PER_IOCTL_CALL = 32 +UVM_ENABLE_COUNTERS = UVM_IOCTL_BASE(12) +UVM_MAP_COUNTER = UVM_IOCTL_BASE(13) +UVM_CREATE_EVENT_QUEUE = UVM_IOCTL_BASE(14) +UVM_REMOVE_EVENT_QUEUE = UVM_IOCTL_BASE(15) +UVM_MAP_EVENT_QUEUE = UVM_IOCTL_BASE(16) +UVM_EVENT_CTRL = UVM_IOCTL_BASE(17) +UVM_REGISTER_MPS_SERVER = UVM_IOCTL_BASE(18) +UVM_REGISTER_MPS_CLIENT = UVM_IOCTL_BASE(19) +UVM_GET_GPU_UUID_TABLE = UVM_IOCTL_BASE(20) +UVM_CREATE_RANGE_GROUP = UVM_IOCTL_BASE(23) +UVM_DESTROY_RANGE_GROUP = UVM_IOCTL_BASE(24) +UVM_REGISTER_GPU_VASPACE = UVM_IOCTL_BASE(25) +UVM_UNREGISTER_GPU_VASPACE = UVM_IOCTL_BASE(26) +UVM_REGISTER_CHANNEL = UVM_IOCTL_BASE(27) +UVM_UNREGISTER_CHANNEL = UVM_IOCTL_BASE(28) +UVM_ENABLE_PEER_ACCESS = UVM_IOCTL_BASE(29) +UVM_DISABLE_PEER_ACCESS = UVM_IOCTL_BASE(30) +UVM_SET_RANGE_GROUP = UVM_IOCTL_BASE(31) +UVM_MAP_EXTERNAL_ALLOCATION = UVM_IOCTL_BASE(33) +UVM_FREE = UVM_IOCTL_BASE(34) +UVM_MEM_MAP = UVM_IOCTL_BASE(35) +UVM_REGISTER_GPU = UVM_IOCTL_BASE(37) +UVM_UNREGISTER_GPU = UVM_IOCTL_BASE(38) +UVM_PAGEABLE_MEM_ACCESS = UVM_IOCTL_BASE(39) +UVM_MAX_RANGE_GROUPS_PER_IOCTL_CALL = 32 +UVM_PREVENT_MIGRATION_RANGE_GROUPS = UVM_IOCTL_BASE(40) +UVM_ALLOW_MIGRATION_RANGE_GROUPS = UVM_IOCTL_BASE(41) +UVM_SET_PREFERRED_LOCATION = UVM_IOCTL_BASE(42) +UVM_UNSET_PREFERRED_LOCATION = UVM_IOCTL_BASE(43) +UVM_ENABLE_READ_DUPLICATION = UVM_IOCTL_BASE(44) +UVM_DISABLE_READ_DUPLICATION = UVM_IOCTL_BASE(45) +UVM_SET_ACCESSED_BY = UVM_IOCTL_BASE(46) +UVM_UNSET_ACCESSED_BY = UVM_IOCTL_BASE(47) +UVM_MIGRATE_FLAG_ASYNC = 0x00000001 +UVM_MIGRATE_FLAG_SKIP_CPU_MAP = 0x00000002 +UVM_MIGRATE_FLAG_NO_GPU_VA_SPACE = 0x00000004 +UVM_MIGRATE_FLAGS_TEST_ALL = (UVM_MIGRATE_FLAG_SKIP_CPU_MAP | UVM_MIGRATE_FLAG_NO_GPU_VA_SPACE) +UVM_MIGRATE_FLAGS_ALL = (UVM_MIGRATE_FLAG_ASYNC | UVM_MIGRATE_FLAGS_TEST_ALL) +UVM_MIGRATE = UVM_IOCTL_BASE(51) +UVM_MIGRATE_RANGE_GROUP = UVM_IOCTL_BASE(53) +UVM_ENABLE_SYSTEM_WIDE_ATOMICS = UVM_IOCTL_BASE(54) +UVM_DISABLE_SYSTEM_WIDE_ATOMICS = UVM_IOCTL_BASE(55) +UVM_TOOLS_INIT_EVENT_TRACKER = UVM_IOCTL_BASE(56) +UVM_TOOLS_SET_NOTIFICATION_THRESHOLD = UVM_IOCTL_BASE(57) +UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS = UVM_IOCTL_BASE(58) +UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS = UVM_IOCTL_BASE(59) +UVM_TOOLS_ENABLE_COUNTERS = UVM_IOCTL_BASE(60) +UVM_TOOLS_DISABLE_COUNTERS = UVM_IOCTL_BASE(61) +UVM_TOOLS_READ_PROCESS_MEMORY = UVM_IOCTL_BASE(62) +UVM_TOOLS_WRITE_PROCESS_MEMORY = UVM_IOCTL_BASE(63) +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE = UVM_IOCTL_BASE(64) +UVM_MAP_DYNAMIC_PARALLELISM_REGION = UVM_IOCTL_BASE(65) +UVM_UNMAP_EXTERNAL = UVM_IOCTL_BASE(66) +UVM_TOOLS_FLUSH_EVENTS = UVM_IOCTL_BASE(67) +UVM_ALLOC_SEMAPHORE_POOL = UVM_IOCTL_BASE(68) +UVM_CLEAN_UP_ZOMBIE_RESOURCES = UVM_IOCTL_BASE(69) +UVM_PAGEABLE_MEM_ACCESS_ON_GPU = UVM_IOCTL_BASE(70) +UVM_POPULATE_PAGEABLE = UVM_IOCTL_BASE(71) +UVM_POPULATE_PAGEABLE_FLAG_ALLOW_MANAGED = 0x00000001 +UVM_POPULATE_PAGEABLE_FLAG_SKIP_PROT_CHECK = 0x00000002 +UVM_POPULATE_PAGEABLE_FLAG_ALLOW_SPECIAL = 0x00000004 +UVM_POPULATE_PAGEABLE_FLAGS_INTERNAL = UVM_POPULATE_PAGEABLE_FLAG_ALLOW_SPECIAL +UVM_POPULATE_PAGEABLE_FLAGS_TEST = (UVM_POPULATE_PAGEABLE_FLAG_ALLOW_MANAGED | UVM_POPULATE_PAGEABLE_FLAG_SKIP_PROT_CHECK) +UVM_POPULATE_PAGEABLE_FLAGS_ALL = (UVM_POPULATE_PAGEABLE_FLAGS_INTERNAL | UVM_POPULATE_PAGEABLE_FLAGS_TEST) +UVM_VALIDATE_VA_RANGE = UVM_IOCTL_BASE(72) +UVM_CREATE_EXTERNAL_RANGE = UVM_IOCTL_BASE(73) +UVM_MAP_EXTERNAL_SPARSE = UVM_IOCTL_BASE(74) +UVM_MM_INITIALIZE = UVM_IOCTL_BASE(75) +UVM_TOOLS_INIT_EVENT_TRACKER_V2 = UVM_IOCTL_BASE(76) +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_V2 = UVM_IOCTL_BASE(77) +UVM_ALLOC_DEVICE_P2P = UVM_IOCTL_BASE(78) +UVM_CLEAR_ALL_ACCESS_COUNTERS = UVM_IOCTL_BASE(79) +UVM_DISCARD = UVM_IOCTL_BASE(80) +UVM_IS_8_SUPPORTED = UVM_IOCTL_BASE(2047) +UVM_INITIALIZE = 0x30000001 +UVM_DEINITIALIZE = 0x30000002 +NV_PFAULT_MMU_ENG_ID_GRAPHICS = 64 +NV_PFAULT_MMU_ENG_ID_DISPLAY = 1 +NV_PFAULT_MMU_ENG_ID_GSP = 2 +NV_PFAULT_MMU_ENG_ID_IFB = 9 +NV_PFAULT_MMU_ENG_ID_FLA = 4 +NV_PFAULT_MMU_ENG_ID_BAR1 = 128 +NV_PFAULT_MMU_ENG_ID_BAR2 = 192 +NV_PFAULT_MMU_ENG_ID_SEC = 14 +NV_PFAULT_MMU_ENG_ID_PERF = 8 +NV_PFAULT_MMU_ENG_ID_NVDEC = 25 +NV_PFAULT_MMU_ENG_ID_NVDEC0 = 25 +NV_PFAULT_MMU_ENG_ID_NVDEC1 = 26 +NV_PFAULT_MMU_ENG_ID_NVDEC2 = 27 +NV_PFAULT_MMU_ENG_ID_NVDEC3 = 28 +NV_PFAULT_MMU_ENG_ID_NVDEC4 = 29 +NV_PFAULT_MMU_ENG_ID_NVJPG0 = 30 +NV_PFAULT_MMU_ENG_ID_GRCOPY = 15 +NV_PFAULT_MMU_ENG_ID_CE0 = 15 +NV_PFAULT_MMU_ENG_ID_CE1 = 16 +NV_PFAULT_MMU_ENG_ID_CE2 = 17 +NV_PFAULT_MMU_ENG_ID_CE3 = 18 +NV_PFAULT_MMU_ENG_ID_CE4 = 19 +NV_PFAULT_MMU_ENG_ID_CE5 = 20 +NV_PFAULT_MMU_ENG_ID_CE6 = 21 +NV_PFAULT_MMU_ENG_ID_CE7 = 22 +NV_PFAULT_MMU_ENG_ID_CE8 = 23 +NV_PFAULT_MMU_ENG_ID_CE9 = 24 +NV_PFAULT_MMU_ENG_ID_PWR_PMU = 6 +NV_PFAULT_MMU_ENG_ID_PTP = 3 +NV_PFAULT_MMU_ENG_ID_NVENC0 = 11 +NV_PFAULT_MMU_ENG_ID_NVENC1 = 12 +NV_PFAULT_MMU_ENG_ID_NVENC2 = 13 +NV_PFAULT_MMU_ENG_ID_OFA0 = 10 +NV_PFAULT_MMU_ENG_ID_PHYSICAL = 31 +NV_PFAULT_MMU_ENG_ID_HOST0 = 32 +NV_PFAULT_MMU_ENG_ID_HOST1 = 33 +NV_PFAULT_MMU_ENG_ID_HOST2 = 34 +NV_PFAULT_MMU_ENG_ID_HOST3 = 35 +NV_PFAULT_MMU_ENG_ID_HOST4 = 36 +NV_PFAULT_MMU_ENG_ID_HOST5 = 37 +NV_PFAULT_MMU_ENG_ID_HOST6 = 38 +NV_PFAULT_MMU_ENG_ID_HOST7 = 39 +NV_PFAULT_MMU_ENG_ID_HOST8 = 40 +NV_PFAULT_MMU_ENG_ID_HOST9 = 41 +NV_PFAULT_MMU_ENG_ID_HOST10 = 42 +NV_PFAULT_MMU_ENG_ID_HOST11 = 43 +NV_PFAULT_MMU_ENG_ID_HOST12 = 44 +NV_PFAULT_MMU_ENG_ID_HOST13 = 45 +NV_PFAULT_MMU_ENG_ID_HOST14 = 46 +NV_PFAULT_MMU_ENG_ID_HOST15 = 47 +NV_PFAULT_MMU_ENG_ID_HOST16 = 48 +NV_PFAULT_MMU_ENG_ID_HOST17 = 49 +NV_PFAULT_MMU_ENG_ID_HOST18 = 50 +NV_PFAULT_MMU_ENG_ID_HOST19 = 51 +NV_PFAULT_MMU_ENG_ID_HOST20 = 52 +NV_PFAULT_MMU_ENG_ID_HOST21 = 53 +NV_PFAULT_MMU_ENG_ID_HOST22 = 54 +NV_PFAULT_MMU_ENG_ID_HOST23 = 55 +NV_PFAULT_MMU_ENG_ID_HOST24 = 56 +NV_PFAULT_MMU_ENG_ID_HOST25 = 57 +NV_PFAULT_MMU_ENG_ID_HOST26 = 58 +NV_PFAULT_MMU_ENG_ID_HOST27 = 59 +NV_PFAULT_MMU_ENG_ID_HOST28 = 60 +NV_PFAULT_MMU_ENG_ID_HOST29 = 61 +NV_PFAULT_MMU_ENG_ID_HOST30 = 62 +NV_PFAULT_MMU_ENG_ID_HOST31 = 63 +NV_PFAULT_MMU_ENG_ID_BAR1_FN0 = 128 +NV_PFAULT_MMU_ENG_ID_BAR1_FN1 = 129 +NV_PFAULT_MMU_ENG_ID_BAR1_FN2 = 130 +NV_PFAULT_MMU_ENG_ID_BAR1_FN3 = 131 +NV_PFAULT_MMU_ENG_ID_BAR1_FN4 = 132 +NV_PFAULT_MMU_ENG_ID_BAR1_FN5 = 133 +NV_PFAULT_MMU_ENG_ID_BAR1_FN6 = 134 +NV_PFAULT_MMU_ENG_ID_BAR1_FN7 = 135 +NV_PFAULT_MMU_ENG_ID_BAR1_FN8 = 136 +NV_PFAULT_MMU_ENG_ID_BAR1_FN9 = 137 +NV_PFAULT_MMU_ENG_ID_BAR1_FN10 = 138 +NV_PFAULT_MMU_ENG_ID_BAR1_FN11 = 139 +NV_PFAULT_MMU_ENG_ID_BAR1_FN12 = 140 +NV_PFAULT_MMU_ENG_ID_BAR1_FN13 = 141 +NV_PFAULT_MMU_ENG_ID_BAR1_FN14 = 142 +NV_PFAULT_MMU_ENG_ID_BAR1_FN15 = 143 +NV_PFAULT_MMU_ENG_ID_BAR1_FN16 = 144 +NV_PFAULT_MMU_ENG_ID_BAR1_FN17 = 145 +NV_PFAULT_MMU_ENG_ID_BAR1_FN18 = 146 +NV_PFAULT_MMU_ENG_ID_BAR1_FN19 = 147 +NV_PFAULT_MMU_ENG_ID_BAR1_FN20 = 148 +NV_PFAULT_MMU_ENG_ID_BAR1_FN21 = 149 +NV_PFAULT_MMU_ENG_ID_BAR1_FN22 = 150 +NV_PFAULT_MMU_ENG_ID_BAR1_FN23 = 151 +NV_PFAULT_MMU_ENG_ID_BAR1_FN24 = 152 +NV_PFAULT_MMU_ENG_ID_BAR1_FN25 = 153 +NV_PFAULT_MMU_ENG_ID_BAR1_FN26 = 154 +NV_PFAULT_MMU_ENG_ID_BAR1_FN27 = 155 +NV_PFAULT_MMU_ENG_ID_BAR1_FN28 = 156 +NV_PFAULT_MMU_ENG_ID_BAR1_FN29 = 157 +NV_PFAULT_MMU_ENG_ID_BAR1_FN30 = 158 +NV_PFAULT_MMU_ENG_ID_BAR1_FN31 = 159 +NV_PFAULT_MMU_ENG_ID_BAR1_FN32 = 160 +NV_PFAULT_MMU_ENG_ID_BAR1_FN33 = 161 +NV_PFAULT_MMU_ENG_ID_BAR1_FN34 = 162 +NV_PFAULT_MMU_ENG_ID_BAR1_FN35 = 163 +NV_PFAULT_MMU_ENG_ID_BAR1_FN36 = 164 +NV_PFAULT_MMU_ENG_ID_BAR1_FN37 = 165 +NV_PFAULT_MMU_ENG_ID_BAR1_FN38 = 166 +NV_PFAULT_MMU_ENG_ID_BAR1_FN39 = 167 +NV_PFAULT_MMU_ENG_ID_BAR1_FN40 = 168 +NV_PFAULT_MMU_ENG_ID_BAR1_FN41 = 169 +NV_PFAULT_MMU_ENG_ID_BAR1_FN42 = 170 +NV_PFAULT_MMU_ENG_ID_BAR1_FN43 = 171 +NV_PFAULT_MMU_ENG_ID_BAR1_FN44 = 172 +NV_PFAULT_MMU_ENG_ID_BAR1_FN45 = 173 +NV_PFAULT_MMU_ENG_ID_BAR1_FN46 = 174 +NV_PFAULT_MMU_ENG_ID_BAR1_FN47 = 175 +NV_PFAULT_MMU_ENG_ID_BAR1_FN48 = 176 +NV_PFAULT_MMU_ENG_ID_BAR1_FN49 = 177 +NV_PFAULT_MMU_ENG_ID_BAR1_FN50 = 178 +NV_PFAULT_MMU_ENG_ID_BAR1_FN51 = 179 +NV_PFAULT_MMU_ENG_ID_BAR1_FN52 = 180 +NV_PFAULT_MMU_ENG_ID_BAR1_FN53 = 181 +NV_PFAULT_MMU_ENG_ID_BAR1_FN54 = 182 +NV_PFAULT_MMU_ENG_ID_BAR1_FN55 = 183 +NV_PFAULT_MMU_ENG_ID_BAR1_FN56 = 184 +NV_PFAULT_MMU_ENG_ID_BAR1_FN57 = 185 +NV_PFAULT_MMU_ENG_ID_BAR1_FN58 = 186 +NV_PFAULT_MMU_ENG_ID_BAR1_FN59 = 187 +NV_PFAULT_MMU_ENG_ID_BAR1_FN60 = 188 +NV_PFAULT_MMU_ENG_ID_BAR1_FN61 = 189 +NV_PFAULT_MMU_ENG_ID_BAR1_FN62 = 190 +NV_PFAULT_MMU_ENG_ID_BAR1_FN63 = 191 +NV_PFAULT_MMU_ENG_ID_BAR2_FN0 = 192 +NV_PFAULT_MMU_ENG_ID_BAR2_FN1 = 193 +NV_PFAULT_MMU_ENG_ID_BAR2_FN2 = 194 +NV_PFAULT_MMU_ENG_ID_BAR2_FN3 = 195 +NV_PFAULT_MMU_ENG_ID_BAR2_FN4 = 196 +NV_PFAULT_MMU_ENG_ID_BAR2_FN5 = 197 +NV_PFAULT_MMU_ENG_ID_BAR2_FN6 = 198 +NV_PFAULT_MMU_ENG_ID_BAR2_FN7 = 199 +NV_PFAULT_MMU_ENG_ID_BAR2_FN8 = 200 +NV_PFAULT_MMU_ENG_ID_BAR2_FN9 = 201 +NV_PFAULT_MMU_ENG_ID_BAR2_FN10 = 202 +NV_PFAULT_MMU_ENG_ID_BAR2_FN11 = 203 +NV_PFAULT_MMU_ENG_ID_BAR2_FN12 = 204 +NV_PFAULT_MMU_ENG_ID_BAR2_FN13 = 205 +NV_PFAULT_MMU_ENG_ID_BAR2_FN14 = 206 +NV_PFAULT_MMU_ENG_ID_BAR2_FN15 = 207 +NV_PFAULT_MMU_ENG_ID_BAR2_FN16 = 208 +NV_PFAULT_MMU_ENG_ID_BAR2_FN17 = 209 +NV_PFAULT_MMU_ENG_ID_BAR2_FN18 = 210 +NV_PFAULT_MMU_ENG_ID_BAR2_FN19 = 211 +NV_PFAULT_MMU_ENG_ID_BAR2_FN20 = 212 +NV_PFAULT_MMU_ENG_ID_BAR2_FN21 = 213 +NV_PFAULT_MMU_ENG_ID_BAR2_FN22 = 214 +NV_PFAULT_MMU_ENG_ID_BAR2_FN23 = 215 +NV_PFAULT_MMU_ENG_ID_BAR2_FN24 = 216 +NV_PFAULT_MMU_ENG_ID_BAR2_FN25 = 217 +NV_PFAULT_MMU_ENG_ID_BAR2_FN26 = 218 +NV_PFAULT_MMU_ENG_ID_BAR2_FN27 = 219 +NV_PFAULT_MMU_ENG_ID_BAR2_FN28 = 220 +NV_PFAULT_MMU_ENG_ID_BAR2_FN29 = 221 +NV_PFAULT_MMU_ENG_ID_BAR2_FN30 = 222 +NV_PFAULT_MMU_ENG_ID_BAR2_FN31 = 223 +NV_PFAULT_MMU_ENG_ID_BAR2_FN32 = 224 +NV_PFAULT_MMU_ENG_ID_BAR2_FN33 = 225 +NV_PFAULT_MMU_ENG_ID_BAR2_FN34 = 226 +NV_PFAULT_MMU_ENG_ID_BAR2_FN35 = 227 +NV_PFAULT_MMU_ENG_ID_BAR2_FN36 = 228 +NV_PFAULT_MMU_ENG_ID_BAR2_FN37 = 229 +NV_PFAULT_MMU_ENG_ID_BAR2_FN38 = 230 +NV_PFAULT_MMU_ENG_ID_BAR2_FN39 = 231 +NV_PFAULT_MMU_ENG_ID_BAR2_FN40 = 232 +NV_PFAULT_MMU_ENG_ID_BAR2_FN41 = 233 +NV_PFAULT_MMU_ENG_ID_BAR2_FN42 = 234 +NV_PFAULT_MMU_ENG_ID_BAR2_FN43 = 235 +NV_PFAULT_MMU_ENG_ID_BAR2_FN44 = 236 +NV_PFAULT_MMU_ENG_ID_BAR2_FN45 = 237 +NV_PFAULT_MMU_ENG_ID_BAR2_FN46 = 238 +NV_PFAULT_MMU_ENG_ID_BAR2_FN47 = 239 +NV_PFAULT_MMU_ENG_ID_BAR2_FN48 = 240 +NV_PFAULT_MMU_ENG_ID_BAR2_FN49 = 241 +NV_PFAULT_MMU_ENG_ID_BAR2_FN50 = 242 +NV_PFAULT_MMU_ENG_ID_BAR2_FN51 = 243 +NV_PFAULT_MMU_ENG_ID_BAR2_FN52 = 244 +NV_PFAULT_MMU_ENG_ID_BAR2_FN53 = 245 +NV_PFAULT_MMU_ENG_ID_BAR2_FN54 = 246 +NV_PFAULT_MMU_ENG_ID_BAR2_FN55 = 247 +NV_PFAULT_MMU_ENG_ID_BAR2_FN56 = 248 +NV_PFAULT_MMU_ENG_ID_BAR2_FN57 = 249 +NV_PFAULT_MMU_ENG_ID_BAR2_FN58 = 250 +NV_PFAULT_MMU_ENG_ID_BAR2_FN59 = 251 +NV_PFAULT_MMU_ENG_ID_BAR2_FN60 = 252 +NV_PFAULT_MMU_ENG_ID_BAR2_FN61 = 253 +NV_PFAULT_MMU_ENG_ID_BAR2_FN62 = 254 +NV_PFAULT_MMU_ENG_ID_BAR2_FN63 = 255 +NV_PFAULT_FAULT_TYPE = (4, 0) +NV_PFAULT_FAULT_TYPE_PDE = 0x00000000 +NV_PFAULT_FAULT_TYPE_PDE_SIZE = 0x00000001 +NV_PFAULT_FAULT_TYPE_PTE = 0x00000002 +NV_PFAULT_FAULT_TYPE_VA_LIMIT_VIOLATION = 0x00000003 +NV_PFAULT_FAULT_TYPE_UNBOUND_INST_BLOCK = 0x00000004 +NV_PFAULT_FAULT_TYPE_PRIV_VIOLATION = 0x00000005 +NV_PFAULT_FAULT_TYPE_RO_VIOLATION = 0x00000006 +NV_PFAULT_FAULT_TYPE_WO_VIOLATION = 0x00000007 +NV_PFAULT_FAULT_TYPE_PITCH_MASK_VIOLATION = 0x00000008 +NV_PFAULT_FAULT_TYPE_WORK_CREATION = 0x00000009 +NV_PFAULT_FAULT_TYPE_UNSUPPORTED_APERTURE = 0x0000000a +NV_PFAULT_FAULT_TYPE_COMPRESSION_FAILURE = 0x0000000b +NV_PFAULT_FAULT_TYPE_UNSUPPORTED_KIND = 0x0000000c +NV_PFAULT_FAULT_TYPE_REGION_VIOLATION = 0x0000000d +NV_PFAULT_FAULT_TYPE_POISONED = 0x0000000e +NV_PFAULT_FAULT_TYPE_ATOMIC_VIOLATION = 0x0000000f +NV_PFAULT_CLIENT = (14, 8) +NV_PFAULT_CLIENT_GPC_T1_0 = 0x00000000 +NV_PFAULT_CLIENT_GPC_T1_1 = 0x00000001 +NV_PFAULT_CLIENT_GPC_T1_2 = 0x00000002 +NV_PFAULT_CLIENT_GPC_T1_3 = 0x00000003 +NV_PFAULT_CLIENT_GPC_T1_4 = 0x00000004 +NV_PFAULT_CLIENT_GPC_T1_5 = 0x00000005 +NV_PFAULT_CLIENT_GPC_T1_6 = 0x00000006 +NV_PFAULT_CLIENT_GPC_T1_7 = 0x00000007 +NV_PFAULT_CLIENT_GPC_PE_0 = 0x00000008 +NV_PFAULT_CLIENT_GPC_PE_1 = 0x00000009 +NV_PFAULT_CLIENT_GPC_PE_2 = 0x0000000A +NV_PFAULT_CLIENT_GPC_PE_3 = 0x0000000B +NV_PFAULT_CLIENT_GPC_PE_4 = 0x0000000C +NV_PFAULT_CLIENT_GPC_PE_5 = 0x0000000D +NV_PFAULT_CLIENT_GPC_PE_6 = 0x0000000E +NV_PFAULT_CLIENT_GPC_PE_7 = 0x0000000F +NV_PFAULT_CLIENT_GPC_RAST = 0x00000010 +NV_PFAULT_CLIENT_GPC_GCC = 0x00000011 +NV_PFAULT_CLIENT_GPC_GPCCS = 0x00000012 +NV_PFAULT_CLIENT_GPC_PROP_0 = 0x00000013 +NV_PFAULT_CLIENT_GPC_PROP_1 = 0x00000014 +NV_PFAULT_CLIENT_GPC_PROP_2 = 0x00000015 +NV_PFAULT_CLIENT_GPC_PROP_3 = 0x00000016 +NV_PFAULT_CLIENT_GPC_T1_8 = 0x00000021 +NV_PFAULT_CLIENT_GPC_T1_9 = 0x00000022 +NV_PFAULT_CLIENT_GPC_T1_10 = 0x00000023 +NV_PFAULT_CLIENT_GPC_T1_11 = 0x00000024 +NV_PFAULT_CLIENT_GPC_T1_12 = 0x00000025 +NV_PFAULT_CLIENT_GPC_T1_13 = 0x00000026 +NV_PFAULT_CLIENT_GPC_T1_14 = 0x00000027 +NV_PFAULT_CLIENT_GPC_T1_15 = 0x00000028 +NV_PFAULT_CLIENT_GPC_TPCCS_0 = 0x00000029 +NV_PFAULT_CLIENT_GPC_TPCCS_1 = 0x0000002A +NV_PFAULT_CLIENT_GPC_TPCCS_2 = 0x0000002B +NV_PFAULT_CLIENT_GPC_TPCCS_3 = 0x0000002C +NV_PFAULT_CLIENT_GPC_TPCCS_4 = 0x0000002D +NV_PFAULT_CLIENT_GPC_TPCCS_5 = 0x0000002E +NV_PFAULT_CLIENT_GPC_TPCCS_6 = 0x0000002F +NV_PFAULT_CLIENT_GPC_TPCCS_7 = 0x00000030 +NV_PFAULT_CLIENT_GPC_PE_8 = 0x00000031 +NV_PFAULT_CLIENT_GPC_PE_9 = 0x00000032 +NV_PFAULT_CLIENT_GPC_TPCCS_8 = 0x00000033 +NV_PFAULT_CLIENT_GPC_TPCCS_9 = 0x00000034 +NV_PFAULT_CLIENT_GPC_T1_16 = 0x00000035 +NV_PFAULT_CLIENT_GPC_T1_17 = 0x00000036 +NV_PFAULT_CLIENT_GPC_T1_18 = 0x00000037 +NV_PFAULT_CLIENT_GPC_T1_19 = 0x00000038 +NV_PFAULT_CLIENT_GPC_PE_10 = 0x00000039 +NV_PFAULT_CLIENT_GPC_PE_11 = 0x0000003A +NV_PFAULT_CLIENT_GPC_TPCCS_10 = 0x0000003B +NV_PFAULT_CLIENT_GPC_TPCCS_11 = 0x0000003C +NV_PFAULT_CLIENT_GPC_T1_20 = 0x0000003D +NV_PFAULT_CLIENT_GPC_T1_21 = 0x0000003E +NV_PFAULT_CLIENT_GPC_T1_22 = 0x0000003F +NV_PFAULT_CLIENT_GPC_T1_23 = 0x00000040 +NV_PFAULT_CLIENT_GPC_PE_12 = 0x00000041 +NV_PFAULT_CLIENT_GPC_PE_13 = 0x00000042 +NV_PFAULT_CLIENT_GPC_TPCCS_12 = 0x00000043 +NV_PFAULT_CLIENT_GPC_TPCCS_13 = 0x00000044 +NV_PFAULT_CLIENT_GPC_T1_24 = 0x00000045 +NV_PFAULT_CLIENT_GPC_T1_25 = 0x00000046 +NV_PFAULT_CLIENT_GPC_T1_26 = 0x00000047 +NV_PFAULT_CLIENT_GPC_T1_27 = 0x00000048 +NV_PFAULT_CLIENT_GPC_PE_14 = 0x00000049 +NV_PFAULT_CLIENT_GPC_PE_15 = 0x0000004A +NV_PFAULT_CLIENT_GPC_TPCCS_14 = 0x0000004B +NV_PFAULT_CLIENT_GPC_TPCCS_15 = 0x0000004C +NV_PFAULT_CLIENT_GPC_T1_28 = 0x0000004D +NV_PFAULT_CLIENT_GPC_T1_29 = 0x0000004E +NV_PFAULT_CLIENT_GPC_T1_30 = 0x0000004F +NV_PFAULT_CLIENT_GPC_T1_31 = 0x00000050 +NV_PFAULT_CLIENT_GPC_PE_16 = 0x00000051 +NV_PFAULT_CLIENT_GPC_PE_17 = 0x00000052 +NV_PFAULT_CLIENT_GPC_TPCCS_16 = 0x00000053 +NV_PFAULT_CLIENT_GPC_TPCCS_17 = 0x00000054 +NV_PFAULT_CLIENT_GPC_T1_32 = 0x00000055 +NV_PFAULT_CLIENT_GPC_T1_33 = 0x00000056 +NV_PFAULT_CLIENT_GPC_T1_34 = 0x00000057 +NV_PFAULT_CLIENT_GPC_T1_35 = 0x00000058 +NV_PFAULT_CLIENT_GPC_PE_18 = 0x00000059 +NV_PFAULT_CLIENT_GPC_PE_19 = 0x0000005A +NV_PFAULT_CLIENT_GPC_TPCCS_18 = 0x0000005B +NV_PFAULT_CLIENT_GPC_TPCCS_19 = 0x0000005C +NV_PFAULT_CLIENT_GPC_T1_36 = 0x0000005D +NV_PFAULT_CLIENT_GPC_T1_37 = 0x0000005E +NV_PFAULT_CLIENT_GPC_T1_38 = 0x0000005F +NV_PFAULT_CLIENT_GPC_T1_39 = 0x00000060 +NV_PFAULT_CLIENT_GPC_ROP_0 = 0x00000070 +NV_PFAULT_CLIENT_GPC_ROP_1 = 0x00000071 +NV_PFAULT_CLIENT_GPC_ROP_2 = 0x00000072 +NV_PFAULT_CLIENT_GPC_ROP_3 = 0x00000073 +NV_PFAULT_CLIENT_GPC_GPM = 0x00000017 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_0 = 0x00000018 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_1 = 0x00000019 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_2 = 0x0000001A +NV_PFAULT_CLIENT_GPC_LTP_UTLB_3 = 0x0000001B +NV_PFAULT_CLIENT_GPC_LTP_UTLB_4 = 0x0000001C +NV_PFAULT_CLIENT_GPC_LTP_UTLB_5 = 0x0000001D +NV_PFAULT_CLIENT_GPC_LTP_UTLB_6 = 0x0000001E +NV_PFAULT_CLIENT_GPC_LTP_UTLB_7 = 0x0000001F +NV_PFAULT_CLIENT_GPC_RGG_UTLB = 0x00000020 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_8 = 0x00000031 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_9 = 0x00000032 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_10 = 0x00000033 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_11 = 0x00000034 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_12 = 0x00000035 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_13 = 0x00000036 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_14 = 0x00000037 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_15 = 0x00000038 +NV_PFAULT_CLIENT_HUB_VIP = 0x00000000 +NV_PFAULT_CLIENT_HUB_CE0 = 0x00000001 +NV_PFAULT_CLIENT_HUB_CE1 = 0x00000002 +NV_PFAULT_CLIENT_HUB_DNISO = 0x00000003 +NV_PFAULT_CLIENT_HUB_DISPNISO = 0x00000003 +NV_PFAULT_CLIENT_HUB_FE0 = 0x00000004 +NV_PFAULT_CLIENT_HUB_FE = 0x00000004 +NV_PFAULT_CLIENT_HUB_FECS0 = 0x00000005 +NV_PFAULT_CLIENT_HUB_FECS = 0x00000005 +NV_PFAULT_CLIENT_HUB_HOST = 0x00000006 +NV_PFAULT_CLIENT_HUB_HOST_CPU = 0x00000007 +NV_PFAULT_CLIENT_HUB_HOST_CPU_NB = 0x00000008 +NV_PFAULT_CLIENT_HUB_ISO = 0x00000009 +NV_PFAULT_CLIENT_HUB_MMU = 0x0000000A +NV_PFAULT_CLIENT_HUB_NVDEC0 = 0x0000000B +NV_PFAULT_CLIENT_HUB_NVDEC = 0x0000000B +NV_PFAULT_CLIENT_HUB_NVENC1 = 0x0000000D +NV_PFAULT_CLIENT_HUB_NISO = 0x0000000E +NV_PFAULT_CLIENT_HUB_ACTRS = 0x0000000E +NV_PFAULT_CLIENT_HUB_P2P = 0x0000000F +NV_PFAULT_CLIENT_HUB_PD = 0x00000010 +NV_PFAULT_CLIENT_HUB_PERF0 = 0x00000011 +NV_PFAULT_CLIENT_HUB_PERF = 0x00000011 +NV_PFAULT_CLIENT_HUB_PMU = 0x00000012 +NV_PFAULT_CLIENT_HUB_RASTERTWOD = 0x00000013 +NV_PFAULT_CLIENT_HUB_SCC = 0x00000014 +NV_PFAULT_CLIENT_HUB_SCC_NB = 0x00000015 +NV_PFAULT_CLIENT_HUB_SEC = 0x00000016 +NV_PFAULT_CLIENT_HUB_SSYNC = 0x00000017 +NV_PFAULT_CLIENT_HUB_GRCOPY = 0x00000018 +NV_PFAULT_CLIENT_HUB_CE2 = 0x00000018 +NV_PFAULT_CLIENT_HUB_XV = 0x00000019 +NV_PFAULT_CLIENT_HUB_MMU_NB = 0x0000001A +NV_PFAULT_CLIENT_HUB_NVENC0 = 0x0000001B +NV_PFAULT_CLIENT_HUB_NVENC = 0x0000001B +NV_PFAULT_CLIENT_HUB_DFALCON = 0x0000001C +NV_PFAULT_CLIENT_HUB_SKED0 = 0x0000001D +NV_PFAULT_CLIENT_HUB_SKED = 0x0000001D +NV_PFAULT_CLIENT_HUB_AFALCON = 0x0000001E +NV_PFAULT_CLIENT_HUB_DONT_CARE = 0x0000001F +NV_PFAULT_CLIENT_HUB_HSCE0 = 0x00000020 +NV_PFAULT_CLIENT_HUB_HSCE1 = 0x00000021 +NV_PFAULT_CLIENT_HUB_HSCE2 = 0x00000022 +NV_PFAULT_CLIENT_HUB_HSCE3 = 0x00000023 +NV_PFAULT_CLIENT_HUB_HSCE4 = 0x00000024 +NV_PFAULT_CLIENT_HUB_HSCE5 = 0x00000025 +NV_PFAULT_CLIENT_HUB_HSCE6 = 0x00000026 +NV_PFAULT_CLIENT_HUB_HSCE7 = 0x00000027 +NV_PFAULT_CLIENT_HUB_HSCE8 = 0x00000028 +NV_PFAULT_CLIENT_HUB_HSCE9 = 0x00000029 +NV_PFAULT_CLIENT_HUB_HSHUB = 0x0000002A +NV_PFAULT_CLIENT_HUB_PTP_X0 = 0x0000002B +NV_PFAULT_CLIENT_HUB_PTP_X1 = 0x0000002C +NV_PFAULT_CLIENT_HUB_PTP_X2 = 0x0000002D +NV_PFAULT_CLIENT_HUB_PTP_X3 = 0x0000002E +NV_PFAULT_CLIENT_HUB_PTP_X4 = 0x0000002F +NV_PFAULT_CLIENT_HUB_PTP_X5 = 0x00000030 +NV_PFAULT_CLIENT_HUB_PTP_X6 = 0x00000031 +NV_PFAULT_CLIENT_HUB_PTP_X7 = 0x00000032 +NV_PFAULT_CLIENT_HUB_NVENC2 = 0x00000033 +NV_PFAULT_CLIENT_HUB_VPR_SCRUBBER0 = 0x00000034 +NV_PFAULT_CLIENT_HUB_VPR_SCRUBBER1 = 0x00000035 +NV_PFAULT_CLIENT_HUB_DWBIF = 0x00000036 +NV_PFAULT_CLIENT_HUB_FBFALCON = 0x00000037 +NV_PFAULT_CLIENT_HUB_CE_SHIM = 0x00000038 +NV_PFAULT_CLIENT_HUB_GSP = 0x00000039 +NV_PFAULT_CLIENT_HUB_NVDEC1 = 0x0000003A +NV_PFAULT_CLIENT_HUB_NVDEC2 = 0x0000003B +NV_PFAULT_CLIENT_HUB_NVJPG0 = 0x0000003C +NV_PFAULT_CLIENT_HUB_NVDEC3 = 0x0000003D +NV_PFAULT_CLIENT_HUB_NVDEC4 = 0x0000003E +NV_PFAULT_CLIENT_HUB_OFA0 = 0x0000003F +NV_PFAULT_CLIENT_HUB_HSCE10 = 0x00000040 +NV_PFAULT_CLIENT_HUB_HSCE11 = 0x00000041 +NV_PFAULT_CLIENT_HUB_HSCE12 = 0x00000042 +NV_PFAULT_CLIENT_HUB_HSCE13 = 0x00000043 +NV_PFAULT_CLIENT_HUB_HSCE14 = 0x00000044 +NV_PFAULT_CLIENT_HUB_HSCE15 = 0x00000045 +NV_PFAULT_CLIENT_HUB_PTP_X8 = 0x00000046 +NV_PFAULT_CLIENT_HUB_PTP_X9 = 0x00000047 +NV_PFAULT_CLIENT_HUB_PTP_X10 = 0x00000048 +NV_PFAULT_CLIENT_HUB_PTP_X11 = 0x00000049 +NV_PFAULT_CLIENT_HUB_PTP_X12 = 0x0000004A +NV_PFAULT_CLIENT_HUB_PTP_X13 = 0x0000004B +NV_PFAULT_CLIENT_HUB_PTP_X14 = 0x0000004C +NV_PFAULT_CLIENT_HUB_PTP_X15 = 0x0000004D +NV_PFAULT_CLIENT_HUB_FE1 = 0x0000004E +NV_PFAULT_CLIENT_HUB_FE2 = 0x0000004F +NV_PFAULT_CLIENT_HUB_FE3 = 0x00000050 +NV_PFAULT_CLIENT_HUB_FE4 = 0x00000051 +NV_PFAULT_CLIENT_HUB_FE5 = 0x00000052 +NV_PFAULT_CLIENT_HUB_FE6 = 0x00000053 +NV_PFAULT_CLIENT_HUB_FE7 = 0x00000054 +NV_PFAULT_CLIENT_HUB_FECS1 = 0x00000055 +NV_PFAULT_CLIENT_HUB_FECS2 = 0x00000056 +NV_PFAULT_CLIENT_HUB_FECS3 = 0x00000057 +NV_PFAULT_CLIENT_HUB_FECS4 = 0x00000058 +NV_PFAULT_CLIENT_HUB_FECS5 = 0x00000059 +NV_PFAULT_CLIENT_HUB_FECS6 = 0x0000005A +NV_PFAULT_CLIENT_HUB_FECS7 = 0x0000005B +NV_PFAULT_CLIENT_HUB_SKED1 = 0x0000005C +NV_PFAULT_CLIENT_HUB_SKED2 = 0x0000005D +NV_PFAULT_CLIENT_HUB_SKED3 = 0x0000005E +NV_PFAULT_CLIENT_HUB_SKED4 = 0x0000005F +NV_PFAULT_CLIENT_HUB_SKED5 = 0x00000060 +NV_PFAULT_CLIENT_HUB_SKED6 = 0x00000061 +NV_PFAULT_CLIENT_HUB_SKED7 = 0x00000062 +NV_PFAULT_CLIENT_HUB_ESC = 0x00000063 +NV_PFAULT_ACCESS_TYPE = (19, 16) +NV_PFAULT_ACCESS_TYPE_READ = 0x00000000 +NV_PFAULT_ACCESS_TYPE_WRITE = 0x00000001 +NV_PFAULT_ACCESS_TYPE_ATOMIC = 0x00000002 +NV_PFAULT_ACCESS_TYPE_PREFETCH = 0x00000003 +NV_PFAULT_ACCESS_TYPE_VIRT_READ = 0x00000000 +NV_PFAULT_ACCESS_TYPE_VIRT_WRITE = 0x00000001 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC = 0x00000002 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 0x00000002 +NV_PFAULT_ACCESS_TYPE_VIRT_PREFETCH = 0x00000003 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 0x00000004 +NV_PFAULT_ACCESS_TYPE_PHYS_READ = 0x00000008 +NV_PFAULT_ACCESS_TYPE_PHYS_WRITE = 0x00000009 +NV_PFAULT_ACCESS_TYPE_PHYS_ATOMIC = 0x0000000a +NV_PFAULT_ACCESS_TYPE_PHYS_PREFETCH = 0x0000000b +NV_PFAULT_MMU_CLIENT_TYPE = (20, 20) +NV_PFAULT_MMU_CLIENT_TYPE_GPC = 0x00000000 +NV_PFAULT_MMU_CLIENT_TYPE_HUB = 0x00000001 +NV_PFAULT_GPC_ID = (28, 24) +NV_PFAULT_PROTECTED_MODE = (29, 29) +NV_PFAULT_REPLAYABLE_FAULT_EN = (30, 30) +NV_PFAULT_VALID = (31, 31) +NV_ESC_RM_ALLOC_MEMORY = 0x27 +NV_ESC_RM_ALLOC_OBJECT = 0x28 +NV_ESC_RM_FREE = 0x29 +NV_ESC_RM_CONTROL = 0x2A +NV_ESC_RM_ALLOC = 0x2B +NV_ESC_RM_CONFIG_GET = 0x32 +NV_ESC_RM_CONFIG_SET = 0x33 +NV_ESC_RM_DUP_OBJECT = 0x34 +NV_ESC_RM_SHARE = 0x35 +NV_ESC_RM_CONFIG_GET_EX = 0x37 +NV_ESC_RM_CONFIG_SET_EX = 0x38 +NV_ESC_RM_I2C_ACCESS = 0x39 +NV_ESC_RM_IDLE_CHANNELS = 0x41 +NV_ESC_RM_VID_HEAP_CONTROL = 0x4A +NV_ESC_RM_ACCESS_REGISTRY = 0x4D +NV_ESC_RM_MAP_MEMORY = 0x4E +NV_ESC_RM_UNMAP_MEMORY = 0x4F +NV_ESC_RM_GET_EVENT_DATA = 0x52 +NV_ESC_RM_ALLOC_CONTEXT_DMA2 = 0x54 +NV_ESC_RM_ADD_VBLANK_CALLBACK = 0x56 +NV_ESC_RM_MAP_MEMORY_DMA = 0x57 +NV_ESC_RM_UNMAP_MEMORY_DMA = 0x58 +NV_ESC_RM_BIND_CONTEXT_DMA = 0x59 +NV_ESC_RM_EXPORT_OBJECT_TO_FD = 0x5C +NV_ESC_RM_IMPORT_OBJECT_FROM_FD = 0x5D +NV_ESC_RM_UPDATE_DEVICE_MAPPING_INFO = 0x5E +NV_ESC_RM_LOCKLESS_DIAGNOSTIC = 0x5F +NV_RM_API_VERSION_STRING_LENGTH = 64 +NV_RM_API_VERSION_CMD_STRICT = 0 +NV_RM_API_VERSION_CMD_RELAXED = '1' +NV_RM_API_VERSION_CMD_QUERY = '2' +NV_RM_API_VERSION_REPLY_UNRECOGNIZED = 0 +NV_RM_API_VERSION_REPLY_RECOGNIZED = 1 +NV_DMABUF_EXPORT_MAX_HANDLES = 128 +NV_DMABUF_EXPORT_MAPPING_TYPE_DEFAULT = 0 +NV_DMABUF_EXPORT_MAPPING_TYPE_FORCE_PCIE = 1 +NV_IOCTL_MAGIC = 'F' +NV_IOCTL_BASE = 200 +NV_ESC_CARD_INFO = (NV_IOCTL_BASE + 0) +NV_ESC_REGISTER_FD = (NV_IOCTL_BASE + 1) +NV_ESC_ALLOC_OS_EVENT = (NV_IOCTL_BASE + 6) +NV_ESC_FREE_OS_EVENT = (NV_IOCTL_BASE + 7) +NV_ESC_STATUS_CODE = (NV_IOCTL_BASE + 9) +NV_ESC_CHECK_VERSION_STR = (NV_IOCTL_BASE + 10) +NV_ESC_IOCTL_XFER_CMD = (NV_IOCTL_BASE + 11) +NV_ESC_ATTACH_GPUS_TO_FD = (NV_IOCTL_BASE + 12) +NV_ESC_QUERY_DEVICE_INTR = (NV_IOCTL_BASE + 13) +NV_ESC_SYS_PARAMS = (NV_IOCTL_BASE + 14) +NV_ESC_EXPORT_TO_DMABUF_FD = (NV_IOCTL_BASE + 17) +NV_ESC_WAIT_OPEN_COMPLETE = (NV_IOCTL_BASE + 18) +__aligned = lambda n: __attribute__((aligned(n))) # type: ignore +NV_ESC_NUMA_INFO = (NV_IOCTL_BASE + 15) +NV_ESC_SET_NUMA_STATUS = (NV_IOCTL_BASE + 16) +NV_IOCTL_NUMA_INFO_MAX_OFFLINE_ADDRESSES = 64 +NV_IOCTL_NUMA_STATUS_DISABLED = 0 +NV_IOCTL_NUMA_STATUS_OFFLINE = 1 +NV_IOCTL_NUMA_STATUS_ONLINE_IN_PROGRESS = 2 +NV_IOCTL_NUMA_STATUS_ONLINE = 3 +NV_IOCTL_NUMA_STATUS_ONLINE_FAILED = 4 +NV_IOCTL_NUMA_STATUS_OFFLINE_IN_PROGRESS = 5 +NV_IOCTL_NUMA_STATUS_OFFLINE_FAILED = 6 +NVOS04_FLAGS_CHANNEL_TYPE = (1, 0) +NVOS04_FLAGS_CHANNEL_TYPE_PHYSICAL = 0x00000000 +NVOS04_FLAGS_CHANNEL_TYPE_VIRTUAL = 0x00000001 +NVOS04_FLAGS_CHANNEL_TYPE_PHYSICAL_FOR_VIRTUAL = 0x00000002 +NVOS04_FLAGS_VPR = (2, 2) +NVOS04_FLAGS_VPR_FALSE = 0x00000000 +NVOS04_FLAGS_VPR_TRUE = 0x00000001 +NVOS04_FLAGS_CC_SECURE = (2, 2) +NVOS04_FLAGS_CC_SECURE_FALSE = 0x00000000 +NVOS04_FLAGS_CC_SECURE_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING = (3, 3) +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING_TRUE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE = (4, 4) +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE_DEFAULT = 0x00000000 +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE_ONE = 0x00000001 +NVOS04_FLAGS_PRIVILEGED_CHANNEL = (5, 5) +NVOS04_FLAGS_PRIVILEGED_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_PRIVILEGED_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING = (6, 6) +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING_FALSE = 0x00000000 +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE = (7, 7) +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_VALUE = (10, 8) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED = (11, 11) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_VALUE = (20, 12) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED = (21, 21) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV = (22, 22) +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER = (23, 23) +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO = (24, 24) +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO_TRUE = 0x00000001 +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL = (25, 25) +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT = (26, 26) +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT = (27, 27) +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT_TRUE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD = (29, 28) +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_DEFAULT = 0x00000000 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_ONE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_TWO = 0x00000002 +NVOS04_FLAGS_MAP_CHANNEL = (30, 30) +NVOS04_FLAGS_MAP_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_MAP_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC = (31, 31) +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC_FALSE = 0x00000000 +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC_TRUE = 0x00000001 +CC_CHAN_ALLOC_IV_SIZE_DWORD = 3 +CC_CHAN_ALLOC_NONCE_SIZE_DWORD = 8 +NV_CHANNEL_ALLOC_PARAMS_MESSAGE_ID = (0x906f) +FILE_DEVICE_NV = 0x00008000 +NV_IOCTL_FCT_BASE = 0x00000800 +NVOS_MAX_SUBDEVICES = 8 +UNIFIED_NV_STATUS = 1 +NVOS_STATUS = NV_STATUS +NVOS_STATUS_SUCCESS = NV_OK +NVOS_STATUS_ERROR_CARD_NOT_PRESENT = NV_ERR_CARD_NOT_PRESENT +NVOS_STATUS_ERROR_DUAL_LINK_INUSE = NV_ERR_DUAL_LINK_INUSE +NVOS_STATUS_ERROR_GENERIC = NV_ERR_GENERIC +NVOS_STATUS_ERROR_GPU_NOT_FULL_POWER = NV_ERR_GPU_NOT_FULL_POWER +NVOS_STATUS_ERROR_ILLEGAL_ACTION = NV_ERR_ILLEGAL_ACTION +NVOS_STATUS_ERROR_IN_USE = NV_ERR_STATE_IN_USE +NVOS_STATUS_ERROR_INSUFFICIENT_RESOURCES = NV_ERR_INSUFFICIENT_RESOURCES +NVOS_STATUS_ERROR_INSUFFICIENT_ZBC_ENTRY = NV_ERR_INSUFFICIENT_ZBC_ENTRY +NVOS_STATUS_ERROR_INVALID_ACCESS_TYPE = NV_ERR_INVALID_ACCESS_TYPE +NVOS_STATUS_ERROR_INVALID_ARGUMENT = NV_ERR_INVALID_ARGUMENT +NVOS_STATUS_ERROR_INVALID_BASE = NV_ERR_INVALID_BASE +NVOS_STATUS_ERROR_INVALID_CHANNEL = NV_ERR_INVALID_CHANNEL +NVOS_STATUS_ERROR_INVALID_CLASS = NV_ERR_INVALID_CLASS +NVOS_STATUS_ERROR_INVALID_CLIENT = NV_ERR_INVALID_CLIENT +NVOS_STATUS_ERROR_INVALID_COMMAND = NV_ERR_INVALID_COMMAND +NVOS_STATUS_ERROR_INVALID_DATA = NV_ERR_INVALID_DATA +NVOS_STATUS_ERROR_INVALID_DEVICE = NV_ERR_INVALID_DEVICE +NVOS_STATUS_ERROR_INVALID_DMA_SPECIFIER = NV_ERR_INVALID_DMA_SPECIFIER +NVOS_STATUS_ERROR_INVALID_EVENT = NV_ERR_INVALID_EVENT +NVOS_STATUS_ERROR_INVALID_FLAGS = NV_ERR_INVALID_FLAGS +NVOS_STATUS_ERROR_INVALID_FUNCTION = NV_ERR_INVALID_FUNCTION +NVOS_STATUS_ERROR_INVALID_HEAP = NV_ERR_INVALID_HEAP +NVOS_STATUS_ERROR_INVALID_INDEX = NV_ERR_INVALID_INDEX +NVOS_STATUS_ERROR_INVALID_LIMIT = NV_ERR_INVALID_LIMIT +NVOS_STATUS_ERROR_INVALID_METHOD = NV_ERR_INVALID_METHOD +NVOS_STATUS_ERROR_INVALID_OBJECT_BUFFER = NV_ERR_BUFFER_TOO_SMALL +NVOS_STATUS_ERROR_INVALID_OBJECT_ERROR = NV_ERR_INVALID_OBJECT +NVOS_STATUS_ERROR_INVALID_OBJECT_HANDLE = NV_ERR_INVALID_OBJECT_HANDLE +NVOS_STATUS_ERROR_INVALID_OBJECT_NEW = NV_ERR_INVALID_OBJECT_NEW +NVOS_STATUS_ERROR_INVALID_OBJECT_OLD = NV_ERR_INVALID_OBJECT_OLD +NVOS_STATUS_ERROR_INVALID_OBJECT_PARENT = NV_ERR_INVALID_OBJECT_PARENT +NVOS_STATUS_ERROR_INVALID_OFFSET = NV_ERR_INVALID_OFFSET +NVOS_STATUS_ERROR_INVALID_OWNER = NV_ERR_INVALID_OWNER +NVOS_STATUS_ERROR_INVALID_PARAM_STRUCT = NV_ERR_INVALID_PARAM_STRUCT +NVOS_STATUS_ERROR_INVALID_PARAMETER = NV_ERR_INVALID_PARAMETER +NVOS_STATUS_ERROR_INVALID_POINTER = NV_ERR_INVALID_POINTER +NVOS_STATUS_ERROR_INVALID_REGISTRY_KEY = NV_ERR_INVALID_REGISTRY_KEY +NVOS_STATUS_ERROR_INVALID_STATE = NV_ERR_INVALID_STATE +NVOS_STATUS_ERROR_INVALID_STRING_LENGTH = NV_ERR_INVALID_STRING_LENGTH +NVOS_STATUS_ERROR_INVALID_XLATE = NV_ERR_INVALID_XLATE +NVOS_STATUS_ERROR_IRQ_NOT_FIRING = NV_ERR_IRQ_NOT_FIRING +NVOS_STATUS_ERROR_MULTIPLE_MEMORY_TYPES = NV_ERR_MULTIPLE_MEMORY_TYPES +NVOS_STATUS_ERROR_NOT_SUPPORTED = NV_ERR_NOT_SUPPORTED +NVOS_STATUS_ERROR_OPERATING_SYSTEM = NV_ERR_OPERATING_SYSTEM +NVOS_STATUS_ERROR_LIB_RM_VERSION_MISMATCH = NV_ERR_LIB_RM_VERSION_MISMATCH +NVOS_STATUS_ERROR_PROTECTION_FAULT = NV_ERR_PROTECTION_FAULT +NVOS_STATUS_ERROR_TIMEOUT = NV_ERR_TIMEOUT +NVOS_STATUS_ERROR_TOO_MANY_PRIMARIES = NV_ERR_TOO_MANY_PRIMARIES +NVOS_STATUS_ERROR_IRQ_EDGE_TRIGGERED = NV_ERR_IRQ_EDGE_TRIGGERED +NVOS_STATUS_ERROR_INVALID_OPERATION = NV_ERR_INVALID_OPERATION +NVOS_STATUS_ERROR_NOT_COMPATIBLE = NV_ERR_NOT_COMPATIBLE +NVOS_STATUS_ERROR_MORE_PROCESSING_REQUIRED = NV_WARN_MORE_PROCESSING_REQUIRED +NVOS_STATUS_ERROR_INSUFFICIENT_PERMISSIONS = NV_ERR_INSUFFICIENT_PERMISSIONS +NVOS_STATUS_ERROR_TIMEOUT_RETRY = NV_ERR_TIMEOUT_RETRY +NVOS_STATUS_ERROR_NOT_READY = NV_ERR_NOT_READY +NVOS_STATUS_ERROR_GPU_IS_LOST = NV_ERR_GPU_IS_LOST +NVOS_STATUS_ERROR_IN_FULLCHIP_RESET = NV_ERR_GPU_IN_FULLCHIP_RESET +NVOS_STATUS_ERROR_INVALID_LOCK_STATE = NV_ERR_INVALID_LOCK_STATE +NVOS_STATUS_ERROR_INVALID_ADDRESS = NV_ERR_INVALID_ADDRESS +NVOS_STATUS_ERROR_INVALID_IRQ_LEVEL = NV_ERR_INVALID_IRQ_LEVEL +NVOS_STATUS_ERROR_MEMORY_TRAINING_FAILED = NV_ERR_MEMORY_TRAINING_FAILED +NVOS_STATUS_ERROR_BUSY_RETRY = NV_ERR_BUSY_RETRY +NVOS_STATUS_ERROR_INSUFFICIENT_POWER = NV_ERR_INSUFFICIENT_POWER +NVOS_STATUS_ERROR_OBJECT_NOT_FOUND = NV_ERR_OBJECT_NOT_FOUND +NVOS_STATUS_ERROR_RESOURCE_LOST = NV_ERR_RESOURCE_LOST +NVOS_STATUS_ERROR_BUFFER_TOO_SMALL = NV_ERR_BUFFER_TOO_SMALL +NVOS_STATUS_ERROR_RESET_REQUIRED = NV_ERR_RESET_REQUIRED +NVOS_STATUS_ERROR_INVALID_REQUEST = NV_ERR_INVALID_REQUEST +NVOS_STATUS_ERROR_PRIV_SEC_VIOLATION = NV_ERR_PRIV_SEC_VIOLATION +NVOS_STATUS_ERROR_GPU_IN_DEBUG_MODE = NV_ERR_GPU_IN_DEBUG_MODE +NVOS_STATUS_ERROR_ALREADY_SIGNALLED = NV_ERR_ALREADY_SIGNALLED +NV01_FREE = (0x00000000) +NV01_ROOT = (0x0) +NV01_ROOT_NON_PRIV = (0x00000001) +NV01_ROOT_CLIENT = (0x00000041) +NV01_ALLOC_MEMORY = (0x00000002) +NVOS02_FLAGS_PHYSICALITY = (7, 4) +NVOS02_FLAGS_PHYSICALITY_CONTIGUOUS = (0x00000000) +NVOS02_FLAGS_PHYSICALITY_NONCONTIGUOUS = (0x00000001) +NVOS02_FLAGS_LOCATION = (11, 8) +NVOS02_FLAGS_LOCATION_PCI = (0x00000000) +NVOS02_FLAGS_LOCATION_VIDMEM = (0x00000002) +NVOS02_FLAGS_COHERENCY = (15, 12) +NVOS02_FLAGS_COHERENCY_UNCACHED = (0x00000000) +NVOS02_FLAGS_COHERENCY_CACHED = (0x00000001) +NVOS02_FLAGS_COHERENCY_WRITE_COMBINE = (0x00000002) +NVOS02_FLAGS_COHERENCY_WRITE_THROUGH = (0x00000003) +NVOS02_FLAGS_COHERENCY_WRITE_PROTECT = (0x00000004) +NVOS02_FLAGS_COHERENCY_WRITE_BACK = (0x00000005) +NVOS02_FLAGS_ALLOC = (17, 16) +NVOS02_FLAGS_ALLOC_NONE = (0x00000001) +NVOS02_FLAGS_GPU_CACHEABLE = (18, 18) +NVOS02_FLAGS_GPU_CACHEABLE_NO = (0x00000000) +NVOS02_FLAGS_GPU_CACHEABLE_YES = (0x00000001) +NVOS02_FLAGS_KERNEL_MAPPING = (19, 19) +NVOS02_FLAGS_KERNEL_MAPPING_NO_MAP = (0x00000000) +NVOS02_FLAGS_KERNEL_MAPPING_MAP = (0x00000001) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY = (20, 20) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY_YES = (0x00000001) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY = (21, 21) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY_YES = (0x00000001) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY = (22, 22) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY_YES = (0x00000001) +NVOS02_FLAGS_PEER_MAP_OVERRIDE = (23, 23) +NVOS02_FLAGS_PEER_MAP_OVERRIDE_DEFAULT = (0x00000000) +NVOS02_FLAGS_PEER_MAP_OVERRIDE_REQUIRED = (0x00000001) +NVOS02_FLAGS_ALLOC_TYPE_SYNCPOINT = (24, 24) +NVOS02_FLAGS_ALLOC_TYPE_SYNCPOINT_APERTURE = (0x00000001) +NVOS02_FLAGS_MEMORY_PROTECTION = (26, 25) +NVOS02_FLAGS_MEMORY_PROTECTION_DEFAULT = (0x00000000) +NVOS02_FLAGS_MEMORY_PROTECTION_PROTECTED = (0x00000001) +NVOS02_FLAGS_MEMORY_PROTECTION_UNPROTECTED = (0x00000002) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM = (27, 27) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM_FALSE = (0x00000000) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM_TRUE = (0x00000001) +NVOS02_FLAGS_MAPPING = (31, 30) +NVOS02_FLAGS_MAPPING_DEFAULT = (0x00000000) +NVOS02_FLAGS_MAPPING_NO_MAP = (0x00000001) +NVOS02_FLAGS_MAPPING_NEVER_MAP = (0x00000002) +NVOS03_FLAGS_ACCESS = (1, 0) +NVOS03_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS03_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS03_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS03_FLAGS_PREALLOCATE = (2, 2) +NVOS03_FLAGS_PREALLOCATE_DISABLE = (0x00000000) +NVOS03_FLAGS_PREALLOCATE_ENABLE = (0x00000001) +NVOS03_FLAGS_GPU_MAPPABLE = (15, 15) +NVOS03_FLAGS_GPU_MAPPABLE_DISABLE = (0x00000000) +NVOS03_FLAGS_GPU_MAPPABLE_ENABLE = (0x00000001) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE = (16, 16) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE_FALSE = (0x00000000) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE_TRUE = (0x00000001) +NVOS03_FLAGS_PTE_KIND = (17, 16) +NVOS03_FLAGS_PTE_KIND_NONE = (0x00000000) +NVOS03_FLAGS_PTE_KIND_BL = (0x00000001) +NVOS03_FLAGS_PTE_KIND_PITCH = (0x00000002) +NVOS03_FLAGS_TYPE = (23, 20) +NVOS03_FLAGS_TYPE_NOTIFIER = (0x00000001) +NVOS03_FLAGS_MAPPING = (20, 20) +NVOS03_FLAGS_MAPPING_NONE = (0x00000000) +NVOS03_FLAGS_MAPPING_KERNEL = (0x00000001) +NVOS03_FLAGS_CACHE_SNOOP = (28, 28) +NVOS03_FLAGS_CACHE_SNOOP_ENABLE = (0x00000000) +NVOS03_FLAGS_CACHE_SNOOP_DISABLE = (0x00000001) +NVOS03_FLAGS_HASH_TABLE = (29, 29) +NVOS03_FLAGS_HASH_TABLE_ENABLE = (0x00000000) +NVOS03_FLAGS_HASH_TABLE_DISABLE = (0x00000001) +NV01_ALLOC_OBJECT = (0x00000005) +NV01_EVENT_KERNEL_CALLBACK = (0x00000078) +NV01_EVENT_OS_EVENT = (0x00000079) +NV01_EVENT_WIN32_EVENT = NV01_EVENT_OS_EVENT +NV01_EVENT_KERNEL_CALLBACK_EX = (0x0000007E) +NV01_EVENT_BROADCAST = (0x80000000) +NV01_EVENT_PERMIT_NON_ROOT_EVENT_KERNEL_CALLBACK_CREATION = (0x40000000) +NV01_EVENT_SUBDEVICE_SPECIFIC = (0x20000000) +NV01_EVENT_WITHOUT_EVENT_DATA = (0x10000000) +NV01_EVENT_NONSTALL_INTR = (0x08000000) +NV01_EVENT_CLIENT_RM = (0x04000000) +NV04_I2C_ACCESS = (0x00000013) +NVOS_I2C_ACCESS_MAX_BUFFER_SIZE = 2048 +NVOS20_COMMAND_unused0001 = 0x0001 +NVOS20_COMMAND_unused0002 = 0x0002 +NVOS20_COMMAND_STRING_PRINT = 0x0003 +NV04_ALLOC = (0x00000015) +NVOS64_FLAGS_NONE = (0x00000000) +NVOS64_FLAGS_FINN_SERIALIZED = (0x00000001) +NVOS65_PARAMETERS_VERSION_MAGIC = 0x77FEF81E +NV04_IDLE_CHANNELS = (0x0000001E) +NVOS30_FLAGS_BEHAVIOR = (3, 0) +NVOS30_FLAGS_BEHAVIOR_SPIN = (0x00000000) +NVOS30_FLAGS_BEHAVIOR_SLEEP = (0x00000001) +NVOS30_FLAGS_BEHAVIOR_QUERY = (0x00000002) +NVOS30_FLAGS_BEHAVIOR_FORCE_BUSY_CHECK = (0x00000003) +NVOS30_FLAGS_CHANNEL = (7, 4) +NVOS30_FLAGS_CHANNEL_LIST = (0x00000000) +NVOS30_FLAGS_CHANNEL_SINGLE = (0x00000001) +NVOS30_FLAGS_IDLE = (30, 8) +NVOS30_FLAGS_IDLE_PUSH_BUFFER = (0x00000001) +NVOS30_FLAGS_IDLE_CACHE1 = (0x00000002) +NVOS30_FLAGS_IDLE_GRAPHICS = (0x00000004) +NVOS30_FLAGS_IDLE_MPEG = (0x00000008) +NVOS30_FLAGS_IDLE_MOTION_ESTIMATION = (0x00000010) +NVOS30_FLAGS_IDLE_VIDEO_PROCESSOR = (0x00000020) +NVOS30_FLAGS_IDLE_MSPDEC = (0x00000020) +NVOS30_FLAGS_IDLE_BITSTREAM_PROCESSOR = (0x00000040) +NVOS30_FLAGS_IDLE_MSVLD = (0x00000040) +NVOS30_FLAGS_IDLE_NVDEC0 = NVOS30_FLAGS_IDLE_MSVLD +NVOS30_FLAGS_IDLE_CIPHER_DMA = (0x00000080) +NVOS30_FLAGS_IDLE_SEC = (0x00000080) +NVOS30_FLAGS_IDLE_CALLBACKS = (0x00000100) +NVOS30_FLAGS_IDLE_MSPPP = (0x00000200) +NVOS30_FLAGS_IDLE_CE0 = (0x00000400) +NVOS30_FLAGS_IDLE_CE1 = (0x00000800) +NVOS30_FLAGS_IDLE_CE2 = (0x00001000) +NVOS30_FLAGS_IDLE_CE3 = (0x00002000) +NVOS30_FLAGS_IDLE_CE4 = (0x00004000) +NVOS30_FLAGS_IDLE_CE5 = (0x00008000) +NVOS30_FLAGS_IDLE_VIC = (0x00010000) +NVOS30_FLAGS_IDLE_MSENC = (0x00020000) +NVOS30_FLAGS_IDLE_NVENC0 = NVOS30_FLAGS_IDLE_MSENC +NVOS30_FLAGS_IDLE_NVENC1 = (0x00040000) +NVOS30_FLAGS_IDLE_NVENC2 = (0x00080000) +NVOS30_FLAGS_IDLE_NVJPG = (0x00100000) +NVOS30_FLAGS_IDLE_NVDEC1 = (0x00200000) +NVOS30_FLAGS_IDLE_NVDEC2 = (0x00400000) +NVOS30_FLAGS_IDLE_ACTIVECHANNELS = (0x00800000) +NVOS30_FLAGS_IDLE_ALL_ENGINES = (NVOS30_FLAGS_IDLE_GRAPHICS | NVOS30_FLAGS_IDLE_MPEG | NVOS30_FLAGS_IDLE_MOTION_ESTIMATION | NVOS30_FLAGS_IDLE_VIDEO_PROCESSOR | NVOS30_FLAGS_IDLE_BITSTREAM_PROCESSOR | NVOS30_FLAGS_IDLE_CIPHER_DMA | NVOS30_FLAGS_IDLE_MSPDEC | NVOS30_FLAGS_IDLE_NVDEC0 | NVOS30_FLAGS_IDLE_SEC | NVOS30_FLAGS_IDLE_MSPPP | NVOS30_FLAGS_IDLE_CE0 | NVOS30_FLAGS_IDLE_CE1 | NVOS30_FLAGS_IDLE_CE2 | NVOS30_FLAGS_IDLE_CE3 | NVOS30_FLAGS_IDLE_CE4 | NVOS30_FLAGS_IDLE_CE5 | NVOS30_FLAGS_IDLE_NVENC0 | NVOS30_FLAGS_IDLE_NVENC1 | NVOS30_FLAGS_IDLE_NVENC2 | NVOS30_FLAGS_IDLE_VIC | NVOS30_FLAGS_IDLE_NVJPG | NVOS30_FLAGS_IDLE_NVDEC1 | NVOS30_FLAGS_IDLE_NVDEC2) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON = (31, 31) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON_NO = (0x00000000) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON_YES = (0x00000001) +NV04_VID_HEAP_CONTROL = (0x00000020) +NVOS32_DESCRIPTOR_TYPE_VIRTUAL_ADDRESS = 0 +NVOS32_DESCRIPTOR_TYPE_OS_PAGE_ARRAY = 1 +NVOS32_DESCRIPTOR_TYPE_OS_IO_MEMORY = 2 +NVOS32_DESCRIPTOR_TYPE_OS_PHYS_ADDR = 3 +NVOS32_DESCRIPTOR_TYPE_OS_FILE_HANDLE = 4 +NVOS32_DESCRIPTOR_TYPE_OS_DMA_BUF_PTR = 5 +NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR = 6 +NVOS32_DESCRIPTOR_TYPE_KERNEL_VIRTUAL_ADDRESS = 7 +NVOS32_FUNCTION_ALLOC_SIZE = 2 +NVOS32_FUNCTION_FREE = 3 +NVOS32_FUNCTION_INFO = 5 +NVOS32_FUNCTION_ALLOC_TILED_PITCH_HEIGHT = 6 +NVOS32_FUNCTION_ALLOC_SIZE_RANGE = 14 +NVOS32_FUNCTION_REACQUIRE_COMPR = 15 +NVOS32_FUNCTION_RELEASE_COMPR = 16 +NVOS32_FUNCTION_GET_MEM_ALIGNMENT = 18 +NVOS32_FUNCTION_HW_ALLOC = 19 +NVOS32_FUNCTION_HW_FREE = 20 +NVOS32_FUNCTION_ALLOC_OS_DESCRIPTOR = 27 +NVOS32_IVC_HEAP_NUMBER_DONT_ALLOCATE_ON_IVC_HEAP = 0 +NV_RM_OS32_ALLOC_OS_DESCRIPTOR_WITH_OS32_ATTR = 1 +NVOS32_DELETE_RESOURCES_ALL = 0 +NVOS32_TYPE_IMAGE = 0 +NVOS32_TYPE_DEPTH = 1 +NVOS32_TYPE_TEXTURE = 2 +NVOS32_TYPE_VIDEO = 3 +NVOS32_TYPE_FONT = 4 +NVOS32_TYPE_CURSOR = 5 +NVOS32_TYPE_DMA = 6 +NVOS32_TYPE_INSTANCE = 7 +NVOS32_TYPE_PRIMARY = 8 +NVOS32_TYPE_ZCULL = 9 +NVOS32_TYPE_UNUSED = 10 +NVOS32_TYPE_SHADER_PROGRAM = 11 +NVOS32_TYPE_OWNER_RM = 12 +NVOS32_TYPE_NOTIFIER = 13 +NVOS32_TYPE_RESERVED = 14 +NVOS32_TYPE_PMA = 15 +NVOS32_TYPE_STENCIL = 16 +NVOS32_TYPE_SYNCPOINT = 17 +NVOS32_NUM_MEM_TYPES = 18 +NVOS32_ATTR_NONE = 0x00000000 +NVOS32_ATTR_DEPTH = (2, 0) +NVOS32_ATTR_DEPTH_UNKNOWN = 0x00000000 +NVOS32_ATTR_DEPTH_8 = 0x00000001 +NVOS32_ATTR_DEPTH_16 = 0x00000002 +NVOS32_ATTR_DEPTH_24 = 0x00000003 +NVOS32_ATTR_DEPTH_32 = 0x00000004 +NVOS32_ATTR_DEPTH_64 = 0x00000005 +NVOS32_ATTR_DEPTH_128 = 0x00000006 +NVOS32_ATTR_COMPR_COVG = (3, 3) +NVOS32_ATTR_COMPR_COVG_DEFAULT = 0x00000000 +NVOS32_ATTR_COMPR_COVG_PROVIDED = 0x00000001 +NVOS32_ATTR_AA_SAMPLES = (7, 4) +NVOS32_ATTR_AA_SAMPLES_1 = 0x00000000 +NVOS32_ATTR_AA_SAMPLES_2 = 0x00000001 +NVOS32_ATTR_AA_SAMPLES_4 = 0x00000002 +NVOS32_ATTR_AA_SAMPLES_4_ROTATED = 0x00000003 +NVOS32_ATTR_AA_SAMPLES_6 = 0x00000004 +NVOS32_ATTR_AA_SAMPLES_8 = 0x00000005 +NVOS32_ATTR_AA_SAMPLES_16 = 0x00000006 +NVOS32_ATTR_AA_SAMPLES_4_VIRTUAL_8 = 0x00000007 +NVOS32_ATTR_AA_SAMPLES_4_VIRTUAL_16 = 0x00000008 +NVOS32_ATTR_AA_SAMPLES_8_VIRTUAL_16 = 0x00000009 +NVOS32_ATTR_AA_SAMPLES_8_VIRTUAL_32 = 0x0000000A +NVOS32_ATTR_GPU_CACHE_SNOOPABLE = (9, 8) +NVOS32_ATTR_GPU_CACHE_SNOOPABLE_MAPPING = 0x00000000 +NVOS32_ATTR_GPU_CACHE_SNOOPABLE_OFF = 0x00000001 +NVOS32_ATTR_GPU_CACHE_SNOOPABLE_ON = 0x00000002 +NVOS32_ATTR_GPU_CACHE_SNOOPABLE_INVALID = 0x00000003 +NVOS32_ATTR_ZCULL = (11, 10) +NVOS32_ATTR_ZCULL_NONE = 0x00000000 +NVOS32_ATTR_ZCULL_REQUIRED = 0x00000001 +NVOS32_ATTR_ZCULL_ANY = 0x00000002 +NVOS32_ATTR_ZCULL_SHARED = 0x00000003 +NVOS32_ATTR_COMPR = (13, 12) +NVOS32_ATTR_COMPR_NONE = 0x00000000 +NVOS32_ATTR_COMPR_REQUIRED = 0x00000001 +NVOS32_ATTR_COMPR_ANY = 0x00000002 +NVOS32_ATTR_COMPR_PLC_REQUIRED = NVOS32_ATTR_COMPR_REQUIRED +NVOS32_ATTR_COMPR_PLC_ANY = NVOS32_ATTR_COMPR_ANY +NVOS32_ATTR_COMPR_DISABLE_PLC_ANY = 0x00000003 +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP = (14, 14) +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP_NO = 0x00000000 +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP_YES = 0x00000001 +NVOS32_ATTR_FORMAT = (17, 16) +NVOS32_ATTR_FORMAT_LOW_FIELD = 16 +NVOS32_ATTR_FORMAT_HIGH_FIELD = 17 +NVOS32_ATTR_FORMAT_PITCH = 0x00000000 +NVOS32_ATTR_FORMAT_SWIZZLED = 0x00000001 +NVOS32_ATTR_FORMAT_BLOCK_LINEAR = 0x00000002 +NVOS32_ATTR_Z_TYPE = (18, 18) +NVOS32_ATTR_Z_TYPE_FIXED = 0x00000000 +NVOS32_ATTR_Z_TYPE_FLOAT = 0x00000001 +NVOS32_ATTR_ZS_PACKING = (21, 19) +NVOS32_ATTR_ZS_PACKING_S8 = 0x00000000 +NVOS32_ATTR_ZS_PACKING_Z24S8 = 0x00000000 +NVOS32_ATTR_ZS_PACKING_S8Z24 = 0x00000001 +NVOS32_ATTR_ZS_PACKING_Z32 = 0x00000002 +NVOS32_ATTR_ZS_PACKING_Z24X8 = 0x00000003 +NVOS32_ATTR_ZS_PACKING_X8Z24 = 0x00000004 +NVOS32_ATTR_ZS_PACKING_Z32_X24S8 = 0x00000005 +NVOS32_ATTR_ZS_PACKING_X8Z24_X24S8 = 0x00000006 +NVOS32_ATTR_ZS_PACKING_Z16 = 0x00000007 +NVOS32_ATTR_COLOR_PACKING = NVOS32_ATTR_ZS_PACKING +NVOS32_ATTR_COLOR_PACKING_A8R8G8B8 = 0x00000000 +NVOS32_ATTR_COLOR_PACKING_X8R8G8B8 = 0x00000001 +NVOS32_ATTR_PAGE_SIZE = (24, 23) +NVOS32_ATTR_PAGE_SIZE_DEFAULT = 0x00000000 +NVOS32_ATTR_PAGE_SIZE_4KB = 0x00000001 +NVOS32_ATTR_PAGE_SIZE_BIG = 0x00000002 +NVOS32_ATTR_PAGE_SIZE_HUGE = 0x00000003 +NVOS32_ATTR_LOCATION = (26, 25) +NVOS32_ATTR_LOCATION_VIDMEM = 0x00000000 +NVOS32_ATTR_LOCATION_PCI = 0x00000001 +NVOS32_ATTR_LOCATION_ANY = 0x00000003 +NVOS32_ATTR_PHYSICALITY = (28, 27) +NVOS32_ATTR_PHYSICALITY_DEFAULT = 0x00000000 +NVOS32_ATTR_PHYSICALITY_NONCONTIGUOUS = 0x00000001 +NVOS32_ATTR_PHYSICALITY_CONTIGUOUS = 0x00000002 +NVOS32_ATTR_PHYSICALITY_ALLOW_NONCONTIGUOUS = 0x00000003 +NVOS32_ATTR_COHERENCY = (31, 29) +NVOS32_ATTR_COHERENCY_UNCACHED = 0x00000000 +NVOS32_ATTR_COHERENCY_CACHED = 0x00000001 +NVOS32_ATTR_COHERENCY_WRITE_COMBINE = 0x00000002 +NVOS32_ATTR_COHERENCY_WRITE_THROUGH = 0x00000003 +NVOS32_ATTR_COHERENCY_WRITE_PROTECT = 0x00000004 +NVOS32_ATTR_COHERENCY_WRITE_BACK = 0x00000005 +NVOS32_ATTR2_NONE = 0x00000000 +NVOS32_ATTR2_ZBC = (1, 0) +NVOS32_ATTR2_ZBC_DEFAULT = 0x00000000 +NVOS32_ATTR2_ZBC_PREFER_NO_ZBC = 0x00000001 +NVOS32_ATTR2_ZBC_PREFER_ZBC = 0x00000002 +NVOS32_ATTR2_ZBC_REQUIRE_ONLY_ZBC = 0x00000003 +NVOS32_ATTR2_ZBC_INVALID = 0x00000003 +NVOS32_ATTR2_GPU_CACHEABLE = (3, 2) +NVOS32_ATTR2_GPU_CACHEABLE_DEFAULT = 0x00000000 +NVOS32_ATTR2_GPU_CACHEABLE_YES = 0x00000001 +NVOS32_ATTR2_GPU_CACHEABLE_NO = 0x00000002 +NVOS32_ATTR2_GPU_CACHEABLE_INVALID = 0x00000003 +NVOS32_ATTR2_P2P_GPU_CACHEABLE = (5, 4) +NVOS32_ATTR2_P2P_GPU_CACHEABLE_DEFAULT = 0x00000000 +NVOS32_ATTR2_P2P_GPU_CACHEABLE_YES = 0x00000001 +NVOS32_ATTR2_P2P_GPU_CACHEABLE_NO = 0x00000002 +NVOS32_ATTR2_32BIT_POINTER = (6, 6) +NVOS32_ATTR2_32BIT_POINTER_DISABLE = 0x00000000 +NVOS32_ATTR2_32BIT_POINTER_ENABLE = 0x00000001 +NVOS32_ATTR2_FIXED_NUMA_NODE_ID = (7, 7) +NVOS32_ATTR2_FIXED_NUMA_NODE_ID_NO = 0x00000000 +NVOS32_ATTR2_FIXED_NUMA_NODE_ID_YES = 0x00000001 +NVOS32_ATTR2_SMMU_ON_GPU = (9, 8) +NVOS32_ATTR2_SMMU_ON_GPU_DEFAULT = 0x00000000 +NVOS32_ATTR2_SMMU_ON_GPU_DISABLE = 0x00000001 +NVOS32_ATTR2_SMMU_ON_GPU_ENABLE = 0x00000002 +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT = (10, 10) +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT_FALSE = 0x00000000 +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT_TRUE = 0x00000001 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN = (11, 11) +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_OFF = 0x0 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_ON = 0x1 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_DEFAULT = NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_OFF +NVOS32_ATTR2_PRIORITY = (13, 12) +NVOS32_ATTR2_PRIORITY_DEFAULT = 0x0 +NVOS32_ATTR2_PRIORITY_HIGH = 0x1 +NVOS32_ATTR2_PRIORITY_LOW = 0x2 +NVOS32_ATTR2_INTERNAL = (14, 14) +NVOS32_ATTR2_INTERNAL_NO = 0x0 +NVOS32_ATTR2_INTERNAL_YES = 0x1 +NVOS32_ATTR2_PREFER_2C = (15, 15) +NVOS32_ATTR2_PREFER_2C_NO = 0x00000000 +NVOS32_ATTR2_PREFER_2C_YES = 0x00000001 +NVOS32_ATTR2_NISO_DISPLAY = (16, 16) +NVOS32_ATTR2_NISO_DISPLAY_NO = 0x00000000 +NVOS32_ATTR2_NISO_DISPLAY_YES = 0x00000001 +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT = (17, 17) +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT_NO = 0x00000000 +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT_YES = 0x00000001 +NVOS32_ATTR2_ISO = (18, 18) +NVOS32_ATTR2_ISO_NO = 0x00000000 +NVOS32_ATTR2_ISO_YES = 0x00000001 +NVOS32_ATTR2_BLACKLIST = (19, 19) +NVOS32_ATTR2_BLACKLIST_ON = 0x00000000 +NVOS32_ATTR2_BLACKLIST_OFF = 0x00000001 +NVOS32_ATTR2_PAGE_OFFLINING = (19, 19) +NVOS32_ATTR2_PAGE_OFFLINING_ON = 0x00000000 +NVOS32_ATTR2_PAGE_OFFLINING_OFF = 0x00000001 +NVOS32_ATTR2_PAGE_SIZE_HUGE = (21, 20) +NVOS32_ATTR2_PAGE_SIZE_HUGE_DEFAULT = 0x00000000 +NVOS32_ATTR2_PAGE_SIZE_HUGE_2MB = 0x00000001 +NVOS32_ATTR2_PAGE_SIZE_HUGE_512MB = 0x00000002 +NVOS32_ATTR2_PAGE_SIZE_HUGE_256GB = 0x00000003 +NVOS32_ATTR2_PROTECTION_USER = (22, 22) +NVOS32_ATTR2_PROTECTION_USER_READ_WRITE = 0x00000000 +NVOS32_ATTR2_PROTECTION_USER_READ_ONLY = 0x00000001 +NVOS32_ATTR2_PROTECTION_DEVICE = (23, 23) +NVOS32_ATTR2_PROTECTION_DEVICE_READ_WRITE = 0x00000000 +NVOS32_ATTR2_PROTECTION_DEVICE_READ_ONLY = 0x00000001 +NVOS32_ATTR2_USE_EGM = (24, 24) +NVOS32_ATTR2_USE_EGM_FALSE = 0x00000000 +NVOS32_ATTR2_USE_EGM_TRUE = 0x00000001 +NVOS32_ATTR2_MEMORY_PROTECTION = (26, 25) +NVOS32_ATTR2_MEMORY_PROTECTION_DEFAULT = 0x00000000 +NVOS32_ATTR2_MEMORY_PROTECTION_PROTECTED = 0x00000001 +NVOS32_ATTR2_MEMORY_PROTECTION_UNPROTECTED = 0x00000002 +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP = (27, 27) +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP_NO = 0x00000000 +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP_YES = 0x00000001 +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY = (30, 29) +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY_DEFAULT = 0x00000000 +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY_UGPU0 = 0x00000001 +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY_UGPU1 = 0x00000002 +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM = (31, 31) +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM_FALSE = 0x00000000 +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM_TRUE = 0x00000001 +NVOS32_ALLOC_FLAGS_IGNORE_BANK_PLACEMENT = 0x00000001 +NVOS32_ALLOC_FLAGS_FORCE_MEM_GROWS_UP = 0x00000002 +NVOS32_ALLOC_FLAGS_FORCE_MEM_GROWS_DOWN = 0x00000004 +NVOS32_ALLOC_FLAGS_FORCE_ALIGN_HOST_PAGE = 0x00000008 +NVOS32_ALLOC_FLAGS_FIXED_ADDRESS_ALLOCATE = 0x00000010 +NVOS32_ALLOC_FLAGS_BANK_HINT = 0x00000020 +NVOS32_ALLOC_FLAGS_BANK_FORCE = 0x00000040 +NVOS32_ALLOC_FLAGS_ALIGNMENT_HINT = 0x00000080 +NVOS32_ALLOC_FLAGS_ALIGNMENT_FORCE = 0x00000100 +NVOS32_ALLOC_FLAGS_BANK_GROW_UP = 0x00000000 +NVOS32_ALLOC_FLAGS_BANK_GROW_DOWN = 0x00000200 +NVOS32_ALLOC_FLAGS_LAZY = 0x00000400 +NVOS32_ALLOC_FLAGS_FORCE_REVERSE_ALLOC = 0x00000800 +NVOS32_ALLOC_FLAGS_NO_SCANOUT = 0x00001000 +NVOS32_ALLOC_FLAGS_PITCH_FORCE = 0x00002000 +NVOS32_ALLOC_FLAGS_MEMORY_HANDLE_PROVIDED = 0x00004000 +NVOS32_ALLOC_FLAGS_MAP_NOT_REQUIRED = 0x00008000 +NVOS32_ALLOC_FLAGS_PERSISTENT_VIDMEM = 0x00010000 +NVOS32_ALLOC_FLAGS_USE_BEGIN_END = 0x00020000 +NVOS32_ALLOC_FLAGS_TURBO_CIPHER_ENCRYPTED = 0x00040000 +NVOS32_ALLOC_FLAGS_VIRTUAL = 0x00080000 +NVOS32_ALLOC_FLAGS_FORCE_INTERNAL_INDEX = 0x00100000 +NVOS32_ALLOC_FLAGS_ZCULL_COVG_SPECIFIED = 0x00200000 +NVOS32_ALLOC_FLAGS_EXTERNALLY_MANAGED = 0x00400000 +NVOS32_ALLOC_FLAGS_FORCE_DEDICATED_PDE = 0x00800000 +NVOS32_ALLOC_FLAGS_PROTECTED = 0x01000000 +NVOS32_ALLOC_FLAGS_KERNEL_MAPPING_MAP = 0x02000000 +NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE = 0x02000000 +NVOS32_ALLOC_FLAGS_SPARSE = 0x04000000 +NVOS32_ALLOC_FLAGS_USER_READ_ONLY = 0x04000000 +NVOS32_ALLOC_FLAGS_DEVICE_READ_ONLY = 0x08000000 +NVOS32_ALLOC_FLAGS_ALLOCATE_KERNEL_PRIVILEGED = 0x08000000 +NVOS32_ALLOC_FLAGS_SKIP_RESOURCE_ALLOC = 0x10000000 +NVOS32_ALLOC_FLAGS_PREFER_PTES_IN_SYSMEMORY = 0x20000000 +NVOS32_ALLOC_FLAGS_SKIP_ALIGN_PAD = 0x40000000 +NVOS32_ALLOC_FLAGS_WPR1 = 0x40000000 +NVOS32_ALLOC_FLAGS_ZCULL_DONT_ALLOCATE_SHARED_1X = 0x80000000 +NVOS32_ALLOC_FLAGS_WPR2 = 0x80000000 +NVOS32_ALLOC_INTERNAL_FLAGS_CLIENTALLOC = 0x00000001 +NVOS32_ALLOC_INTERNAL_FLAGS_SKIP_SCRUB = 0x00000004 +NVOS32_ALLOC_FLAGS_MAXIMIZE_4GB_ADDRESS_SPACE = NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE +NVOS32_ALLOC_FLAGS_VIRTUAL_ONLY = ( NVOS32_ALLOC_FLAGS_VIRTUAL | NVOS32_ALLOC_FLAGS_LAZY | NVOS32_ALLOC_FLAGS_EXTERNALLY_MANAGED | NVOS32_ALLOC_FLAGS_SPARSE | NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE | NVOS32_ALLOC_FLAGS_PREFER_PTES_IN_SYSMEMORY ) +NVOS32_ALLOC_COMPR_COVG_SCALE = 10 +NVOS32_ALLOC_COMPR_COVG_BITS = (1, 0) +NVOS32_ALLOC_COMPR_COVG_BITS_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPR_COVG_BITS_1 = 0x00000001 +NVOS32_ALLOC_COMPR_COVG_BITS_2 = 0x00000002 +NVOS32_ALLOC_COMPR_COVG_BITS_4 = 0x00000003 +NVOS32_ALLOC_COMPR_COVG_MAX = (11, 2) +NVOS32_ALLOC_COMPR_COVG_MIN = (21, 12) +NVOS32_ALLOC_COMPR_COVG_START = (31, 22) +NVOS32_ALLOC_ZCULL_COVG_FORMAT = (3, 0) +NVOS32_ALLOC_ZCULL_COVG_FORMAT_LOW_RES_Z = 0x00000000 +NVOS32_ALLOC_ZCULL_COVG_FORMAT_HIGH_RES_Z = 0x00000002 +NVOS32_ALLOC_ZCULL_COVG_FORMAT_LOW_RES_ZS = 0x00000003 +NVOS32_ALLOC_ZCULL_COVG_FALLBACK = (4, 4) +NVOS32_ALLOC_ZCULL_COVG_FALLBACK_DISALLOW = 0x00000000 +NVOS32_ALLOC_ZCULL_COVG_FALLBACK_ALLOW = 0x00000001 +NVOS32_ALLOC_COMPTAG_OFFSET_START = (19, 0) +NVOS32_ALLOC_COMPTAG_OFFSET_START_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE = (31, 30) +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_OFF = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_FIXED = 0x00000001 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_MIN = 0x00000002 +NVOS32_REALLOC_FLAGS_GROW_ALLOCATION = 0x00000000 +NVOS32_REALLOC_FLAGS_SHRINK_ALLOCATION = 0x00000001 +NVOS32_REALLOC_FLAGS_REALLOC_UP = 0x00000000 +NVOS32_REALLOC_FLAGS_REALLOC_DOWN = 0x00000002 +NVOS32_RELEASE_COMPR_FLAGS_MEMORY_HANDLE_PROVIDED = 0x000000001 +NVOS32_REACQUIRE_COMPR_FLAGS_MEMORY_HANDLE_PROVIDED = 0x000000001 +NVOS32_FREE_FLAGS_MEMORY_HANDLE_PROVIDED = 0x00000001 +NVOS32_DUMP_FLAGS_TYPE = (1, 0) +NVOS32_DUMP_FLAGS_TYPE_FB = 0x00000000 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_PD = 0x00000001 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_VA = 0x00000002 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_VAPTE = 0x00000003 +NVOS32_BLOCK_TYPE_FREE = 0xFFFFFFFF +NVOS32_INVALID_BLOCK_FREE_OFFSET = 0xFFFFFFFF +NVOS32_MEM_TAG_NONE = 0x00000000 +NV04_MAP_MEMORY = (0x00000021) +NV04_MAP_MEMORY_FLAGS_NONE = (0x00000000) +NV04_MAP_MEMORY_FLAGS_USER = (0x00004000) +NVOS33_FLAGS_ACCESS = (1, 0) +NVOS33_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS33_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS33_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS33_FLAGS_PERSISTENT = (4, 4) +NVOS33_FLAGS_PERSISTENT_DISABLE = (0x00000000) +NVOS33_FLAGS_PERSISTENT_ENABLE = (0x00000001) +NVOS33_FLAGS_SKIP_SIZE_CHECK = (8, 8) +NVOS33_FLAGS_SKIP_SIZE_CHECK_DISABLE = (0x00000000) +NVOS33_FLAGS_SKIP_SIZE_CHECK_ENABLE = (0x00000001) +NVOS33_FLAGS_MEM_SPACE = (14, 14) +NVOS33_FLAGS_MEM_SPACE_CLIENT = (0x00000000) +NVOS33_FLAGS_MEM_SPACE_USER = (0x00000001) +NVOS33_FLAGS_MAPPING = (16, 15) +NVOS33_FLAGS_MAPPING_DEFAULT = (0x00000000) +NVOS33_FLAGS_MAPPING_DIRECT = (0x00000001) +NVOS33_FLAGS_MAPPING_REFLECTED = (0x00000002) +NVOS33_FLAGS_FIFO_MAPPING = (17, 17) +NVOS33_FLAGS_FIFO_MAPPING_DEFAULT = (0x00000000) +NVOS33_FLAGS_FIFO_MAPPING_ENABLE = (0x00000001) +NVOS33_FLAGS_MAP_FIXED = (18, 18) +NVOS33_FLAGS_MAP_FIXED_DISABLE = (0x00000000) +NVOS33_FLAGS_MAP_FIXED_ENABLE = (0x00000001) +NVOS33_FLAGS_RESERVE_ON_UNMAP = (19, 19) +NVOS33_FLAGS_RESERVE_ON_UNMAP_DISABLE = (0x00000000) +NVOS33_FLAGS_RESERVE_ON_UNMAP_ENABLE = (0x00000001) +NVOS33_FLAGS_OS_DESCRIPTOR = (22, 22) +NVOS33_FLAGS_OS_DESCRIPTOR_DISABLE = (0x00000000) +NVOS33_FLAGS_OS_DESCRIPTOR_ENABLE = (0x00000001) +NVOS33_FLAGS_CACHING_TYPE = (25, 23) +NVOS33_FLAGS_CACHING_TYPE_CACHED = 0 +NVOS33_FLAGS_CACHING_TYPE_UNCACHED = 1 +NVOS33_FLAGS_CACHING_TYPE_WRITECOMBINED = 2 +NVOS33_FLAGS_CACHING_TYPE_WRITEBACK = 5 +NVOS33_FLAGS_CACHING_TYPE_DEFAULT = 6 +NVOS33_FLAGS_CACHING_TYPE_UNCACHED_WEAK = 7 +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC = (26, 26) +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC_NO = (0x00000000) +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC_YES = (0x00000001) +NV04_UNMAP_MEMORY = (0x00000022) +NV04_ACCESS_REGISTRY = (0x00000026) +NVOS38_ACCESS_TYPE_READ_DWORD = 1 +NVOS38_ACCESS_TYPE_WRITE_DWORD = 2 +NVOS38_ACCESS_TYPE_READ_BINARY = 6 +NVOS38_ACCESS_TYPE_WRITE_BINARY = 7 +NVOS38_MAX_REGISTRY_STRING_LENGTH = 256 +NVOS38_MAX_REGISTRY_BINARY_LENGTH = 256 +NV04_ALLOC_CONTEXT_DMA = (0x00000027) +NV04_GET_EVENT_DATA = (0x00000028) +NVSIM01_BUS_XACT = (0x0000002C) +NV04_MAP_MEMORY_DMA = (0x0000002E) +NVOS46_FLAGS_ACCESS = (1, 0) +NVOS46_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS46_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS46_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS46_FLAGS_32BIT_POINTER = (2, 2) +NVOS46_FLAGS_32BIT_POINTER_DISABLE = (0x00000000) +NVOS46_FLAGS_32BIT_POINTER_ENABLE = (0x00000001) +NVOS46_FLAGS_PAGE_KIND = (3, 3) +NVOS46_FLAGS_PAGE_KIND_PHYSICAL = (0x00000000) +NVOS46_FLAGS_PAGE_KIND_VIRTUAL = (0x00000001) +NVOS46_FLAGS_CACHE_SNOOP = (4, 4) +NVOS46_FLAGS_CACHE_SNOOP_DISABLE = (0x00000000) +NVOS46_FLAGS_CACHE_SNOOP_ENABLE = (0x00000001) +NVOS46_FLAGS_KERNEL_MAPPING = (5, 5) +NVOS46_FLAGS_KERNEL_MAPPING_NONE = (0x00000000) +NVOS46_FLAGS_KERNEL_MAPPING_ENABLE = (0x00000001) +NVOS46_FLAGS_SHADER_ACCESS = (7, 6) +NVOS46_FLAGS_SHADER_ACCESS_DEFAULT = (0x00000000) +NVOS46_FLAGS_SHADER_ACCESS_READ_ONLY = (0x00000001) +NVOS46_FLAGS_SHADER_ACCESS_WRITE_ONLY = (0x00000002) +NVOS46_FLAGS_SHADER_ACCESS_READ_WRITE = (0x00000003) +NVOS46_FLAGS_PAGE_SIZE = (11, 8) +NVOS46_FLAGS_PAGE_SIZE_DEFAULT = (0x00000000) +NVOS46_FLAGS_PAGE_SIZE_4KB = (0x00000001) +NVOS46_FLAGS_PAGE_SIZE_BIG = (0x00000002) +NVOS46_FLAGS_PAGE_SIZE_BOTH = (0x00000003) +NVOS46_FLAGS_PAGE_SIZE_HUGE = (0x00000004) +NVOS46_FLAGS_PAGE_SIZE_512M = (0x00000005) +NVOS46_FLAGS_SYSTEM_L3_ALLOC = (13, 13) +NVOS46_FLAGS_SYSTEM_L3_ALLOC_DEFAULT = (0x00000000) +NVOS46_FLAGS_SYSTEM_L3_ALLOC_ENABLE_HINT = (0x00000001) +NVOS46_FLAGS_DMA_OFFSET_GROWS = (14, 14) +NVOS46_FLAGS_DMA_OFFSET_GROWS_UP = (0x00000000) +NVOS46_FLAGS_DMA_OFFSET_GROWS_DOWN = (0x00000001) +NVOS46_FLAGS_DMA_OFFSET_FIXED = (15, 15) +NVOS46_FLAGS_DMA_OFFSET_FIXED_FALSE = (0x00000000) +NVOS46_FLAGS_DMA_OFFSET_FIXED_TRUE = (0x00000001) +NVOS46_FLAGS_DISABLE_ENCRYPTION = (16, 16) +NVOS46_FLAGS_DISABLE_ENCRYPTION_FALSE = (0x00000000) +NVOS46_FLAGS_DISABLE_ENCRYPTION_TRUE = (0x00000001) +NVOS46_FLAGS_GPU_CACHEABLE = (18, 17) +NVOS46_FLAGS_GPU_CACHEABLE_DEFAULT = (0x00000000) +NVOS46_FLAGS_GPU_CACHEABLE_YES = (0x00000001) +NVOS46_FLAGS_GPU_CACHEABLE_NO = (0x00000002) +NVOS46_FLAGS_GPU_CACHEABLE_INVALID = (0x00000003) +NVOS46_FLAGS_PAGE_KIND_OVERRIDE = (19, 19) +NVOS46_FLAGS_PAGE_KIND_OVERRIDE_NO = (0x00000000) +NVOS46_FLAGS_PAGE_KIND_OVERRIDE_YES = (0x00000001) +NVOS46_FLAGS_P2P = (27, 20) +NVOS46_FLAGS_P2P_ENABLE = (21, 20) +NVOS46_FLAGS_P2P_ENABLE_NO = (0x00000000) +NVOS46_FLAGS_P2P_ENABLE_YES = (0x00000001) +NVOS46_FLAGS_P2P_ENABLE_NONE = NVOS46_FLAGS_P2P_ENABLE_NO +NVOS46_FLAGS_P2P_ENABLE_SLI = NVOS46_FLAGS_P2P_ENABLE_YES +NVOS46_FLAGS_P2P_ENABLE_NOSLI = (0x00000002) +NVOS46_FLAGS_P2P_SUBDEVICE_ID = (24, 22) +NVOS46_FLAGS_P2P_SUBDEV_ID_SRC = NVOS46_FLAGS_P2P_SUBDEVICE_ID +NVOS46_FLAGS_P2P_SUBDEV_ID_TGT = (27, 25) +NVOS46_FLAGS_TLB_LOCK = (28, 28) +NVOS46_FLAGS_TLB_LOCK_DISABLE = (0x00000000) +NVOS46_FLAGS_TLB_LOCK_ENABLE = (0x00000001) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC = (29, 29) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC_FALSE = (0x00000000) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC_TRUE = (0x00000001) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP = (30, 30) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP_FALSE = (0x00000000) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP_TRUE = (0x00000001) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION = (31, 31) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION_FALSE = (0x00000000) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION_TRUE = (0x00000001) +NVOS46_FLAGS2_GPU_CACHE_SNOOP = (1, 0) +NVOS46_FLAGS2_GPU_CACHE_SNOOP_DEFAULT = (0x00000000) +NVOS46_FLAGS2_GPU_CACHE_SNOOP_ENABLE = (0x00000001) +NVOS46_FLAGS2_GPU_CACHE_SNOOP_DISABLE = (0x00000002) +NV04_UNMAP_MEMORY_DMA = (0x0000002F) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION = (0, 0) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION_FALSE = (0x00000000) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION_TRUE = (0x00000001) +NV04_BIND_CONTEXT_DMA = (0x00000031) +NV04_CONTROL = (0x00000036) +NVOS54_FLAGS_NONE = (0x00000000) +NVOS54_FLAGS_IRQL_RAISED = (0x00000001) +NVOS54_FLAGS_LOCK_BYPASS = (0x00000002) +NVOS54_FLAGS_FINN_SERIALIZED = (0x00000004) +NV04_DUP_OBJECT = (0x00000037) +NV04_DUP_HANDLE_FLAGS_NONE = (0x00000000) +NV04_DUP_HANDLE_FLAGS_REJECT_KERNEL_DUP_PRIVILEGE = (0x00000001) +NV04_UPDATE_DEVICE_MAPPING_INFO = (0x00000038) +NV04_SHARE = (0x0000003E) +NVPOWERSTATE_STAGE_NONE = 0 +NVPOWERSTATE_STAGE_WAIT_FOR_GFW_BOOT_OK = 1 +NVPOWERSTATE_STAGE_INIT_LIBOS_LOGGING_STRUCTURES = 2 +NVPOWERSTATE_STAGE_GSP_PREPARE_FOR_BOOTSTRAP = 3 +NVPOWERSTATE_STAGE_GSP_BOOTSTRAP = 4 +NVPOWERSTATE_STAGE_BOOT_GSP_RM_PROXY = 5 +NVPOWERSTATE_STAGE_VBIOS_HANDLE_SECURE_BOOT = 6 +NVPOWERSTATE_STAGE_RESTORE_PCIE_CONFIG_REGISTERS = 7 +NVPOWERSTATE_STAGE_GCX_BOOT_TIMER_CB_SCHEDULE = 8 +NVPOWERSTATE_STAGE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED = 9 +NVPOWERSTATE_STAGE_PMS_EXPECTED_CHECKPOINT_DONE = 10 +NVPOWERSTATE_STAGE_POLL_FOR_NVLINK_READY = 11 +NVPOWERSTATE_STAGE_CE_STATE_PRE_LOAD = 12 +NVPOWERSTATE_STAGE_LOAD_PROXY_UCODE_EARLY_INIT = 13 +NVPOWERSTATE_STAGE_RESTORE_NON_WPR_REGION = 14 +NVPOWERSTATE_STAGE_PMU_20_OS_BOOTSTRAP = 15 +NVPOWERSTATE_STAGE_STATE_PRE_LOAD_ENGINE = 16 +NVPOWERSTATE_STAGE_STATE_PRE_LOAD_UNKNOWN = 17 +NVPOWERSTATE_STAGE_STATE_LOAD_ENGINE = 18 +NVPOWERSTATE_STAGE_STATE_LOAD_UNKNOWN = 19 +NVPOWERSTATE_STAGE_STATE_LOAD_PHYSICAL = 20 +NVPOWERSTATE_STAGE_STATE_POST_LOAD_ENGINE = 21 +NVPOWERSTATE_STAGE_STATE_POST_LOAD_UNKNOWN = 22 +NVPOWERSTATE_STAGE_GSP_PREPARE_SUSPEND_RESUME_DATA = 23 +NVPOWERSTATE_STAGE_MC_POINTER_NULL = 24 +NVPOWERSTATE_STAGE_SAVE_PCIE_CONFIG_REGISTERS = 25 +NVPOWERSTATE_STAGE_STATE_PRE_UNLOAD_ENGINE = 26 +NVPOWERSTATE_STAGE_STATE_PRE_UNLOAD_UNKNOWN = 27 +NVPOWERSTATE_STAGE_STATE_UNLOAD_ENGINE = 28 +NVPOWERSTATE_STAGE_STATE_UNLOAD_UNKNOWN = 29 +NVPOWERSTATE_STAGE_STATE_POST_UNLOAD_ENGINE = 30 +NVPOWERSTATE_STAGE_STATE_POST_UNLOAD_UNKNOWN = 31 +NVPOWERSTATE_STAGE_GSP_UNLOAD_RM = 32 +NVPOWERSTATE_STAGE_MONITOR_STATE_0 = 33 +NVPOWERSTATE_STAGE_MONITOR_STATE_1 = 34 +NVPOWERSTATE_STAGE_MONITOR_STATE_HIBERNATE = 35 +NVPOWERSTATE_STAGE_SET_POWER_STATE_UNKNOWN = 36 +NVPOWERSTATE_STAGE__COUNT = 37 +NV_DEVICE_ALLOCATION_SZNAME_MAXLEN = 128 +NV_DEVICE_ALLOCATION_FLAGS_NONE = (0x00000000) +NV_DEVICE_ALLOCATION_FLAGS_MAP_PTE_GLOBALLY = (0x00000001) +NV_DEVICE_ALLOCATION_FLAGS_MINIMIZE_PTETABLE_SIZE = (0x00000002) +NV_DEVICE_ALLOCATION_FLAGS_RETRY_PTE_ALLOC_IN_SYS = (0x00000004) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_SIZE = (0x00000008) +NV_DEVICE_ALLOCATION_FLAGS_MAP_PTE = (0x00000010) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_IS_TARGET = (0x00000020) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_SHARED_MANAGEMENT = (0x00000100) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_BIG_PAGE_SIZE_64k = (0x00000200) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_BIG_PAGE_SIZE_128k = (0x00000400) +NV_DEVICE_ALLOCATION_FLAGS_RESTRICT_RESERVED_VALIMITS = (0x00000800) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_IS_MIRRORED = (0x00000040) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_PTABLE_PMA_MANAGED = (0x00001000) +NV_DEVICE_ALLOCATION_FLAGS_HOST_VGPU_DEVICE = (0x00002000) +NV_DEVICE_ALLOCATION_FLAGS_PLUGIN_CONTEXT = (0x00004000) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_REQUIRE_FIXED_OFFSET = (0x00008000) +NV_DEVICE_ALLOCATION_VAMODE_OPTIONAL_MULTIPLE_VASPACES = (0x00000000) +NV_DEVICE_ALLOCATION_VAMODE_SINGLE_VASPACE = (0x00000001) +NV_DEVICE_ALLOCATION_VAMODE_MULTIPLE_VASPACES = (0x00000002) +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_ERROR = 0x00000000 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_WORK_SUBMIT_TOKEN = 0x00000001 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_KEY_ROTATION_STATUS = 0x00000002 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE__SIZE_1 = 3 +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_VALUE = (14, 0) +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS = (15, 15) +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS_TRUE = 0x1 +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS_FALSE = 0x0 +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB = (1, 1) +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB_YES = 0x00000000 +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB_NO = 0x00000001 +NV_SWRUNLIST_QOS_INTR_NONE = 0x00000000 +NV_VP_ALLOCATION_FLAGS_STANDARD_UCODE = (0x00000000) +NV_VP_ALLOCATION_FLAGS_STATIC_UCODE = (0x00000001) +NV_VP_ALLOCATION_FLAGS_DYNAMIC_UCODE = (0x00000002) +NV_VP_ALLOCATION_FLAGS_AVP_CLIENT_VIDEO = (0x00000000) +NV_VP_ALLOCATION_FLAGS_AVP_CLIENT_AUDIO = (0x00000001) +NV04_ADD_VBLANK_CALLBACK = (0x0000003D) +NV_VASPACE_ALLOCATION_FLAGS_NONE = (0x00000000) +NV_VASPACE_ALLOCATION_FLAGS_MINIMIZE_PTETABLE_SIZE = BIT(0) +NV_VASPACE_ALLOCATION_FLAGS_RETRY_PTE_ALLOC_IN_SYS = BIT(1) +NV_VASPACE_ALLOCATION_FLAGS_SHARED_MANAGEMENT = BIT(2) +NV_VASPACE_ALLOCATION_FLAGS_IS_EXTERNALLY_OWNED = BIT(3) +NV_VASPACE_ALLOCATION_FLAGS_ENABLE_NVLINK_ATS = BIT(4) +NV_VASPACE_ALLOCATION_FLAGS_IS_MIRRORED = BIT(5) +NV_VASPACE_ALLOCATION_FLAGS_ENABLE_PAGE_FAULTING = BIT(6) +NV_VASPACE_ALLOCATION_FLAGS_VA_INTERNAL_LIMIT = BIT(7) +NV_VASPACE_ALLOCATION_FLAGS_ALLOW_ZERO_ADDRESS = BIT(8) +NV_VASPACE_ALLOCATION_FLAGS_IS_FLA = BIT(9) +NV_VASPACE_ALLOCATION_FLAGS_SKIP_SCRUB_MEMPOOL = BIT(10) +NV_VASPACE_ALLOCATION_FLAGS_OPTIMIZE_PTETABLE_MEMPOOL_USAGE = BIT(11) +NV_VASPACE_ALLOCATION_FLAGS_REQUIRE_FIXED_OFFSET = BIT(12) +NV_VASPACE_ALLOCATION_FLAGS_PTETABLE_HEAP_MANAGED = BIT(13) +NV_VASPACE_ALLOCATION_FLAGS_ENABLE_NVLINK_ATS_TEST = BIT(14) +NV_VASPACE_ALLOCATION_INDEX_GPU_NEW = 0x00 +NV_VASPACE_ALLOCATION_INDEX_GPU_HOST = 0x01 +NV_VASPACE_ALLOCATION_INDEX_GPU_GLOBAL = 0x02 +NV_VASPACE_ALLOCATION_INDEX_GPU_DEVICE = 0x03 +NV_VASPACE_ALLOCATION_INDEX_GPU_FLA = 0x04 +NV_VASPACE_ALLOCATION_INDEX_GPU_MAX = 0x05 +NV_VASPACE_BIG_PAGE_SIZE_64K = (64 * 1024) +NV_VASPACE_BIG_PAGE_SIZE_128K = (128 * 1024) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT = (1, 0) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_SYNC = (0x00000000) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_ASYNC = (0x00000001) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_SPECIFIED = (0x00000002) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_ASYNC_PREFER_LOWER = (0x00000003) +NV_CTXSHARE_ALLOCATION_SUBCTXID_SUBCTXID = (30, 0) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION = (31, 31) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION_SUCCESS = (0x00000001) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION_FAIL = (0x00000000) +NV_TIMEOUT_CONTROL_CMD_SET_DEVICE_TIMEOUT = (0x00000002) +NV_TIMEOUT_CONTROL_CMD_RESET_DEVICE_TIMEOUT = (0x00000003) +NVC36F_CTRL_RESERVED = (0x00) +NVC36F_CTRL_GPFIFO = (0x01) +NVC36F_CTRL_INTERNAL = (0x03) +NVC36F_CTRL_CMD_NULL = (0xc36f0000) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN = (0xc36f0108) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_MESSAGE_ID = (0x8) +NVC36F_CTRL_CMD_GPFIFO_FAULT_METHOD_BUFFER_MAX_RUNQUEUES = 0x2 +NVC36F_CTRL_CMD_GPFIFO_UPDATE_FAULT_METHOD_BUFFER = (0xc36f0109) +NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS_MESSAGE_ID = (0x9) +NVC36F_CTRL_CMD_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX = (0xc36f010a) +NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_MESSAGE_ID = (0xA) +NVC36F_CTRL_CMD_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN = (0xc36f0301) +NVC36F_CTRL_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_MESSAGE_ID = (0x1) +NVCB33_CTRL_RESERVED = (0x00) +NVCB33_CTRL_CONF_COMPUTE = (0x01) +NV_CONF_COMPUTE_CTRL_CMD_NULL = (0xcb330000) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES = (0xcb330101) +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SEV = 1 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_INTEL_TDX = 2 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SEV_SNP = 3 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SNP_VTOM = 4 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_APM = 1 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_HCC = 2 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_UNAVAILABLE = 0 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_SIM = 1 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_PROD = 2 +NV_CONF_COMPUTE_SYSTEM_FEATURE_DISABLED = 0 +NV_CONF_COMPUTE_SYSTEM_FEATURE_APM_ENABLED = 1 +NV_CONF_COMPUTE_SYSTEM_FEATURE_HCC_ENABLED = 2 +NV_CONF_COMPUTE_SYSTEM_DEVTOOLS_MODE_DISABLED = 0 +NV_CONF_COMPUTE_SYSTEM_DEVTOOLS_MODE_ENABLED = 1 +NV_CONF_COMPUTE_SYSTEM_MULTI_GPU_MODE_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_MULTI_GPU_MODE_PROTECTED_PCIE = 1 +NV_CONF_COMPUTE_SYSTEM_MULTI_GPU_MODE_NVLE = 2 +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE = (0xcb330104) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE = (0xcb330105) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE = (0xcb330106) +NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE = (0xcb330107) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS = (0xcb330108) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0x8) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE = (0xcb330109) +NV_CONF_COMPUTE_CERT_CHAIN_MAX_SIZE = 0x1000 +NV_CONF_COMPUTE_ATTESTATION_CERT_CHAIN_MAX_SIZE = 0x1400 +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS_MESSAGE_ID = (0x9) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT = (0xcb33010a) +NV_CONF_COMPUTE_GPU_ATTESTATION_REPORT_MAX_SIZE = 0x2000 +NV_CONF_COMPUTE_GPU_CEC_ATTESTATION_REPORT_MAX_SIZE = 0x1000 +NV_CONF_COMPUTE_NONCE_SIZE = 0x20 +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS_MESSAGE_ID = (0xA) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS = (0xcb33010b) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0xB) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE = (0xcb33010c) +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_DISABLED = 0 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_KERN_ENABLED = 1 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_USER_ENABLED = 2 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_BOTH_ENABLED = 3 +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS_MESSAGE_ID = (0xC) +NVA06C_CTRL_RESERVED = (0x00) +NVA06C_CTRL_GPFIFO = (0x01) +NVA06C_CTRL_INTERNAL = (0x02) +NVA06C_CTRL_CMD_NULL = (0xa06c0000) +NVA06C_CTRL_CMD_GPFIFO_SCHEDULE = (0xa06c0101) +NVA06C_CTRL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NVA06C_CTRL_CMD_BIND = (0xa06c0102) +NVA06C_CTRL_BIND_PARAMS_MESSAGE_ID = (0x2) +NVA06C_CTRL_CMD_SET_TIMESLICE = (0xa06c0103) +NVA06C_CTRL_SET_TIMESLICE_PARAMS_MESSAGE_ID = (0x3) +NVA06C_CTRL_CMD_GET_TIMESLICE = (0xa06c0104) +NVA06C_CTRL_GET_TIMESLICE_PARAMS_MESSAGE_ID = (0x4) +NVA06C_CTRL_CMD_PREEMPT = (0xa06c0105) +NVA06C_CTRL_PREEMPT_PARAMS_MESSAGE_ID = (0x5) +NVA06C_CTRL_CMD_PREEMPT_MAX_MANUAL_TIMEOUT_US = (1000000) +NVA06C_CTRL_CMD_GET_INFO = (0xa06c0106) +NVA06C_CTRL_GET_INFO_PARAMS_MESSAGE_ID = (0x6) +NVA06C_CTRL_CMD_SET_INTERLEAVE_LEVEL = (0xa06c0107) +NVA06C_CTRL_INTERLEAVE_LEVEL_LOW = (0x00000000) +NVA06C_CTRL_INTERLEAVE_LEVEL_MEDIUM = (0x00000001) +NVA06C_CTRL_INTERLEAVE_LEVEL_HIGH = (0x00000002) +NVA06C_CTRL_SET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x7) +NVA06C_CTRL_CMD_GET_INTERLEAVE_LEVEL = (0xa06c0108) +NVA06C_CTRL_GET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x8) +NVA06C_CTRL_CMD_PROGRAM_VIDMEM_PROMOTE = (0xa06c0109) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS_MESSAGE_ID = (0x9) +NVA06C_CTRL_CMD_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS = (0xa06c010a) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_MAX_RUNQUEUES = (NVC36F_CTRL_CMD_GPFIFO_FAULT_METHOD_BUFFER_MAX_RUNQUEUES) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_MESSAGE_ID = (0xa) +NVA06C_CTRL_CMD_MAKE_REALTIME = (0xa06c0110) +NVA06C_CTRL_MAKE_REALTIME_PARAMS_MESSAGE_ID = (0x10) +NVA06C_CTRL_CMD_INTERNAL_GPFIFO_SCHEDULE = (0xa06c0201) +NVA06C_CTRL_INTERNAL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NVA06C_CTRL_CMD_INTERNAL_SET_TIMESLICE = (0xa06c0202) +NVA06C_CTRL_INTERNAL_SET_TIMESLICE_PARAMS_MESSAGE_ID = (0x2) +GMMU_FMT_MAX_LEVELS = 6 +NV90F1_CTRL_RESERVED = (0x00) +NV90F1_CTRL_VASPACE = (0x01) +NV90F1_CTRL_CMD_NULL = (0x90f10000) +NV90F1_CTRL_CMD_VASPACE_GET_GMMU_FORMAT = (0x90f10101) +NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS_MESSAGE_ID = (0x1) +NV90F1_CTRL_CMD_VASPACE_GET_PAGE_LEVEL_INFO = (0x90f10102) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS_MESSAGE_ID = (0x2) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_FLAG_NONE = 0x0 +NV90F1_CTRL_CMD_VASPACE_RESERVE_ENTRIES = (0x90f10103) +NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS_MESSAGE_ID = (0x3) +NV90F1_CTRL_CMD_VASPACE_RELEASE_ENTRIES = (0x90f10104) +NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS_MESSAGE_ID = (0x4) +NV90F1_CTRL_CMD_VASPACE_GET_PAGE_LEVEL_INFO_VERIF = (0x90f10105) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_VERIF_PARAMS_MESSAGE_ID = (0x5) +NV90F1_CTRL_CMD_VASPACE_COPY_SERVER_RESERVED_PDES = (0x90f10106) +NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_MESSAGE_ID = (0x6) +NV90F1_CTRL_CMD_VASPACE_GET_HOST_RM_MANAGED_SIZE = (0x90f10107) +NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS_MESSAGE_ID = (0x7) +NV90F1_CTRL_CMD_VASPACE_GET_VAS_HEAP_INFO = (0x90f10108) +NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS_MESSAGE_ID = (0x8) +NVA06F_CTRL_CMD_GPFIFO_SCHEDULE = (0xa06f0103) +NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x3) +NVA06F_CTRL_CMD_BIND = (0xa06f0104) +NVA06F_CTRL_BIND_PARAMS_MESSAGE_ID = (0x4) +NVA06F_CTRL_CMD_SET_ERROR_NOTIFIER = (0xa06f0108) +NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS_MESSAGE_ID = (0x8) +NVA06F_CTRL_CMD_SET_INTERLEAVE_LEVEL = (0xa06f0109) +NVA06F_CTRL_SET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x9) +NVA06F_CTRL_CMD_GET_INTERLEAVE_LEVEL = (0xa06f0110) +NVA06F_CTRL_GET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x10) +NVA06F_CTRL_CMD_RESTART_RUNLIST = (0xa06f0111) +NVA06F_CTRL_RESTART_RUNLIST_PARAMS_MESSAGE_ID = (0x11) +NVA06F_CTRL_CMD_STOP_CHANNEL = (0xa06f0112) +NVA06F_CTRL_STOP_CHANNEL_PARAMS_MESSAGE_ID = (0x12) +NVA06F_CTRL_CMD_GET_CONTEXT_ID = (0xa06f0113) +NVA06F_CTRL_GET_CONTEXT_ID_PARAMS_MESSAGE_ID = (0x13) +NV0000_CTRL_RESERVED = (0x00) +NV0000_CTRL_SYSTEM = (0x01) +NV0000_CTRL_GPU = (0x02) +NV0000_CTRL_GSYNC = (0x03) +NV0000_CTRL_DIAG = (0x04) +NV0000_CTRL_EVENT = (0x05) +NV0000_CTRL_NVD = (0x06) +NV0000_CTRL_SWINSTR = (0x07) +NV0000_CTRL_PROC = (0x09) +NV0000_CTRL_SYNC_GPU_BOOST = (0x0A) +NV0000_CTRL_GPUACCT = (0x0B) +NV0000_CTRL_VGPU = (0x0C) +NV0000_CTRL_CLIENT = (0x0D) +NV0000_CTRL_OS_WINDOWS = (0x3F) +NV0000_CTRL_OS_MACOS = (0x3E) +NV0000_CTRL_OS_UNIX = (0x3D) +NV0000_CTRL_CMD_NULL = (0x0) +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE = (0xd01) +NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_INVALID = 0x00000000 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_SYSMEM = 0x00000001 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_VIDMEM = 0x00000002 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_REGMEM = 0x00000003 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_FABRIC = 0x00000004 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_FABRIC_MC = 0x00000005 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO = (0xd02) +NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_INVALID = 0x00000000 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_PARENT = 0x00000001 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_CLASSID = 0x00000002 +NV0000_CTRL_CMD_CLIENT_GET_ACCESS_RIGHTS = (0xd03) +NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_CLIENT_SET_INHERITED_SHARE_POLICY = (0xd04) +NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE = (0xd05) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_CLIENT_SHARE_OBJECT = (0xd06) +NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_CLIENT_OBJECTS_ARE_DUPLICATES = (0xd07) +NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL = (0xd08) +NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_DIAG_GET_LOCK_METER_STATE = (0x480) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS_MESSAGE_ID = (0x80) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_DISABLED = (0x00000000) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_ENABLED = (0x00000001) +NV0000_CTRL_DIAG_LOCK_METER_MAX_TABLE_ENTRIES = (0x20000) +NV0000_CTRL_CMD_DIAG_SET_LOCK_METER_STATE = (0x481) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS_MESSAGE_ID = (0x81) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_DISABLE = (0x00000000) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_ENABLE = (0x00000001) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_RESET = (0x00000002) +NV0000_CTRL_DIAG_LOCK_METER_ENTRY_FILENAME_LENGTH = (0xc) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA = (0x00000001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA_FORCED = (0x00000002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA_COND = (0x00000003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_SEMA = (0x00000004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_API = (0x00000010) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_API = (0x00000011) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_GPUS = (0x00000020) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_GPUS = (0x00000021) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DATA = (0x00000100) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RMCTRL = (0x00001000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_CFG_GETEX = (0x00002002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_CFG_SETEX = (0x00002003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_VIDHEAP = (0x00003000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_MAPMEM = (0x00003001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_UNMAPMEM = (0x00003002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_MAPMEM_DMA = (0x00003003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_UNMAPMEM_DMA = (0x00003004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC = (0x00004000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC_MEM = (0x00004001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DUP_OBJECT = (0x00004010) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CLIENT = (0x00005000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DEVICE = (0x00005001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_SUBDEVICE = (0x00005002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_SUBDEVICE_DIAG = (0x00005003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DISP = (0x00005004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DISP_CMN = (0x00005005) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL = (0x00005006) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL_MPEG = (0x00005007) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL_DISP = (0x00005008) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_MEMORY = (0x00005009) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_FBMEM = (0x0000500A) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_OBJECT = (0x0000500B) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_EVENT = (0x0000500C) +NV0000_CTRL_DIAG_LOCK_METER_TAG_IDLE_CHANNELS = (0x00006000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_BIND_CTXDMA = (0x00007000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC_CTXDMA = (0x00007001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ISR = (0x0000F000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DPC = (0x0000F00F) +NV0000_CTRL_CMD_DIAG_GET_LOCK_METER_ENTRIES = (0x485) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_MAX = (0x40) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS_MESSAGE_ID = (0x85) +NV0000_CTRL_CMD_DIAG_PROFILE_RPC = (0x488) +NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS_MESSAGE_ID = (0x88) +NV0000_CTRL_PROFILE_RPC_CMD_DISABLE = (0x00000000) +NV0000_CTRL_PROFILE_RPC_CMD_ENABLE = (0x00000001) +NV0000_CTRL_PROFILE_RPC_CMD_RESET = (0x00000002) +NV0000_CTRL_CMD_DIAG_DUMP_RPC = (0x489) +NV0000_CTRL_DIAG_RPC_MAX_ENTRIES = (100) +NV0000_CTRL_DIAG_DUMP_RPC_PARAMS_MESSAGE_ID = (0x89) +NV0000_NOTIFIERS_DISPLAY_CHANGE = (0) +NV0000_NOTIFIERS_VGPU_UNBIND_EVENT = (1) +NV0000_NOTIFIERS_VGPU_BIND_EVENT = (2) +NV0000_NOTIFIERS_GPU_BIND_UNBIND_EVENT = (3) +NV0000_NOTIFIERS_MAXCOUNT = (4) +NV0000_CTRL_CMD_EVENT_SET_NOTIFICATION = (0x501) +NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_DISABLE = (0x00000000) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_SINGLE = (0x00000001) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_REPEAT = (0x00000002) +NV0000_CTRL_CMD_GET_SYSTEM_EVENT_DATA = (0x502) +NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_GPU_GET_ATTACHED_IDS = (0x201) +NV0000_CTRL_GPU_MAX_ATTACHED_GPUS = 32 +NV0000_CTRL_GPU_INVALID_ID = (0xffffffff) +NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_GPU_GET_ID_INFO = (0x202) +NV0000_CTRL_GPU_MAX_SZNAME = 128 +NV0000_CTRL_NO_NUMA_NODE = (-1) +NV0000_CTRL_GPU_GET_ID_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_SLI_STATUS_OK = (0x00000000) +NV0000_CTRL_SLI_STATUS_OS_NOT_SUPPORTED = (0x00000002) +NV0000_CTRL_SLI_STATUS_GPU_NOT_SUPPORTED = (0x00000040) +NV0000_CTRL_SLI_STATUS_INVALID_GPU_COUNT = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_ID_INFO_V2 = (0x205) +NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_GPU_ID_INFO_IN_USE = (0, 0) +NV0000_CTRL_GPU_ID_INFO_IN_USE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_IN_USE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE = (1, 1) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_MOBILE = (2, 2) +NV0000_CTRL_GPU_ID_INFO_MOBILE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_MOBILE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER = (3, 3) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_SOC = (5, 5) +NV0000_CTRL_GPU_ID_INFO_SOC_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_SOC_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED = (6, 6) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE = (8, 7) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE_NONE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE_DISPLAY = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE_IGPU = (0x00000002) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE_DISPLAY_AND_IGPU = (0x00000003) +NV0000_CTRL_CMD_GPU_GET_INIT_STATUS = (0x203) +NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_GPU_GET_DEVICE_IDS = (0x204) +NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_GPU_GET_PROBED_IDS = (0x214) +NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS_MESSAGE_ID = (0x14) +NV0000_CTRL_GPU_PROBED_ID_FLAGS_SOC_DISPLAY = (0, 0) +NV0000_CTRL_GPU_PROBED_ID_FLAGS_SOC_DISPLAY_FALSE = (0x00000000) +NV0000_CTRL_GPU_PROBED_ID_FLAGS_SOC_DISPLAY_TRUE = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_PCI_INFO = (0x21b) +NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS_MESSAGE_ID = (0x1B) +NV0000_CTRL_CMD_GPU_ATTACH_IDS = (0x215) +NV0000_CTRL_GPU_ATTACH_ALL_PROBED_IDS = (0x0000ffff) +NV0000_CTRL_GPU_ATTACH_IDS_PARAMS_MESSAGE_ID = (0x15) +NV0000_CTRL_CMD_GPU_DETACH_IDS = (0x216) +NV0000_CTRL_GPU_DETACH_ALL_ATTACHED_IDS = (0x0000ffff) +NV0000_CTRL_GPU_DETACH_IDS_PARAMS_MESSAGE_ID = (0x16) +NV0000_CTRL_CMD_GPU_GET_VIDEO_LINKS = (0x219) +NV0000_CTRL_GPU_MAX_VIDEO_LINKS = 8 +NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS_MESSAGE_ID = (0x19) +NV0000_CTRL_CMD_GPU_GET_SVM_SIZE = (0x240) +NV0000_CTRL_GPU_GET_SVM_SIZE_PARAMS_MESSAGE_ID = (0x40) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO = (0x274) +NV0000_GPU_MAX_GID_LENGTH = (0x00000100) +NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS_MESSAGE_ID = (0x74) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT = (1, 0) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT_ASCII = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT_BINARY = (0x00000002) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE = (2, 2) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE_SHA1 = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE_SHA256 = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID = (0x275) +NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS_MESSAGE_ID = (0x75) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT = (1, 0) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT_ASCII = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT_BINARY = (0x00000002) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE = (2, 2) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE_SHA1 = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE_SHA256 = (0x00000001) +NV0000_CTRL_CMD_GPU_MODIFY_DRAIN_STATE = (0x278) +NV0000_CTRL_GPU_DRAIN_STATE_DISABLED = (0x00000000) +NV0000_CTRL_GPU_DRAIN_STATE_ENABLED = (0x00000001) +NV0000_CTRL_GPU_DRAIN_STATE_FLAG_REMOVE_DEVICE = (0x00000001) +NV0000_CTRL_GPU_DRAIN_STATE_FLAG_LINK_DISABLE = (0x00000002) +NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS_MESSAGE_ID = (0x78) +NV0000_CTRL_CMD_GPU_QUERY_DRAIN_STATE = (0x279) +NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS_MESSAGE_ID = (0x79) +NV0000_CTRL_CMD_GPU_DISCOVER = (0x27a) +NV0000_CTRL_CMD_GPU_GET_MEMOP_ENABLE = (0x27b) +NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS_MESSAGE_ID = (0x7B) +NV0000_CTRL_GPU_FLAGS_MEMOP_ENABLE = (0x00000001) +NV0000_CTRL_CMD_GPU_DISABLE_NVLINK_INIT = (0x281) +NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS_MESSAGE_ID = (0x81) +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PARAM_DATA = 0x00000175 +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PROPERTIES_IN = 6 +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PROPERTIES_OUT = 5 +NV0000_CTRL_CMD_GPU_LEGACY_CONFIG = (0x282) +NV0000_CTRL_GPU_LEGACY_CONFIG_PARAMS_MESSAGE_ID = (0x82) +NV0000_CTRL_GPU_LEGACY_CONFIG_OP_TYPE_GET_EX = (0x00000002) +NV0000_CTRL_GPU_LEGACY_CONFIG_OP_TYPE_SET_EX = (0x00000003) +NV0000_CTRL_GPU_LEGACY_CONFIG_OP_TYPE_RESERVED = (0x00000004) +NV0000_CTRL_CMD_IDLE_CHANNELS = (0x283) +NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS_MESSAGE_ID = (0x83) +NV0000_CTRL_GPU_IMAGE_TYPE_GSP = (0x00000001) +NV0000_CTRL_GPU_IMAGE_TYPE_GSP_LOG = (0x00000002) +NV0000_CTRL_GPU_IMAGE_TYPE_BINDATA_IMAGE = (0x00000003) +NV0000_CTRL_CMD_PUSH_UCODE_IMAGE = (0x285) +NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS_MESSAGE_ID = (0x85) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SETTING_LEGACY = (2, 0) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SETTING_LINK_COUNT = (7, 3) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_FULL = (0x00) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_OFF = (0x01) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_MIN = (0x02) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_HALF = (0x03) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_3QUARTER = (0x04) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_LINK_COUNT = (0x05) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_UNSET = (0x00) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_PER_NODE = (0x01) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_PER_GPU = (0x02) +NV0000_CTRL_CMD_GPU_SET_NVLINK_BW_MODE = (0x286) +NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS_MESSAGE_ID = (0x86) +NV0000_CTRL_CMD_GPU_GET_NVLINK_BW_MODE = (0x287) +NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS_MESSAGE_ID = (0x87) +NV0000_CTRL_CMD_GPU_GET_ACTIVE_DEVICE_IDS = (0x288) +NV0000_CTRL_GPU_MAX_ACTIVE_DEVICES = 256 +NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS_MESSAGE_ID = (0x88) +NV0000_CTRL_CMD_GPU_ASYNC_ATTACH_ID = (0x289) +NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS_MESSAGE_ID = (0x89) +NV0000_CTRL_CMD_GPU_WAIT_ATTACH_ID = (0x290) +NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS_MESSAGE_ID = (0x90) +NV0000_CTRL_CMD_GPUACCT_SET_ACCOUNTING_STATE = (0xb01) +NV0000_CTRL_GPU_ACCOUNTING_STATE_ENABLED = (0x00000000) +NV0000_CTRL_GPU_ACCOUNTING_STATE_DISABLED = (0x00000001) +NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_GPUACCT_GET_ACCOUNTING_STATE = (0xb02) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_GPUACCT_GET_PROC_ACCOUNTING_INFO = (0xb03) +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_GPUACCT_GET_ACCOUNTING_PIDS = (0xb04) +NV0000_GPUACCT_PID_MAX_COUNT = 4000 +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_GPUACCT_CLEAR_ACCOUNTING_DATA = (0xb05) +NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_GSYNC_GET_ATTACHED_IDS = (0x301) +NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_GSYNC_INVALID_ID = (0xffffffff) +NV0000_CTRL_CMD_GSYNC_GET_ID_INFO = (0x302) +NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_NVD_DUMP_COMPONENT_SYS = (0x400) +NV0000_CTRL_NVD_DUMP_COMPONENT_NVLOG = (0x800) +NV0000_CTRL_NVD_DUMP_COMPONENT_RESERVED = (0xB00) +NV0000_CTRL_CMD_NVD_GET_DUMP_SIZE = (0x601) +NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_NVD_MAX_DUMP_SIZE = (1000000) +NV0000_CTRL_CMD_NVD_GET_DUMP = (0x602) +NV0000_CTRL_NVD_GET_DUMP_PARAMS_MESSAGE_ID = (0x2) +NV0000_NVD_CPU_TIME_CLK_ID_DEFAULT = (0x00000000) +NV0000_NVD_CPU_TIME_CLK_ID_OSTIME = (0x00000001) +NV0000_NVD_CPU_TIME_CLK_ID_TSC = (0x00000002) +NV0000_NVD_CPU_TIME_CLK_ID_PLATFORM_API = (0x00000003) +NV0000_CTRL_CMD_NVD_GET_TIMESTAMP = (0x603) +NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_NVD_GET_NVLOG_INFO = (0x604) +NV0000_CTRL_NVD_MAX_RUNTIME_SIZES = (16) +NV0000_CTRL_NVD_SIGNATURE_SIZE = (4) +NV0000_CTRL_NVD_MAX_BUFFERS = (3840) +NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_NVD_RUNTIME_SIZE_UNUSED = (0) +NV0000_CTRL_NVD_RUNTIME_SIZE_INT = (1) +NV0000_CTRL_NVD_RUNTIME_SIZE_LONG_LONG = (2) +NV0000_CTRL_NVD_RUNTIME_SIZE_STRING = (3) +NV0000_CTRL_NVD_RUNTIME_SIZE_PTR = (4) +NV0000_CTRL_NVD_RUNTIME_SIZE_CHAR = (5) +NV0000_CTRL_NVD_RUNTIME_SIZE_FLOAT = (6) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_INFO = (7, 0) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE = (23, 8) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE_DISABLE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE_DEFAULT = (0x00000004) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_RUNTIME_LEVEL = (28, 25) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP = (30, 29) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_NONE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_32 = (0x00000001) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_64 = (0x00000002) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_32_DIFF = (0x00000003) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED = (31, 31) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED_YES = (0x00000001) +NV0000_CTRL_CMD_NVD_GET_NVLOG_BUFFER_INFO = (0x605) +NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE = (0, 0) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED = (0, 0) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE = (1, 1) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE_RING = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE_NOWRAP = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE = (2, 2) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED = (3, 3) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING = (5, 4) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_NONE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_STATE = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_FULL = (0x00000002) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA = (6, 6) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA_YES = (0x00000001) +NV0000_CTRL_CMD_NVD_GET_NVLOG = (0x606) +NV0000_CTRL_NVLOG_MAX_BLOCK_SIZE = (4000) +NV0000_CTRL_NVD_GET_NVLOG_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT = (0x607) +NV0000_CTRL_CMD_NVD_RCERR_RPT_MAX_ENTRIES = 200 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_TEST = 0 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_GRSTATUS = 1 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_GPCSTATUS = 2 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_MMU_FAULT_STATUS = 3 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_RC_ERROR = 4 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_EMPTY = 0x00000000 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_OVERFLOWED = 0x00000001 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_MAX_PSEDO_REG = 0x0000000f +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_POS_FIRST = 0x00000001 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_POS_LAST = 0x00000002 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_RANGE_VALID = 0x00000004 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_DATA_VALID = 0x00000008 +TPC_REG_ATTR = lambda gpcId,tpcId: ((gpcId << 8) | (tpcId)) # type: ignore +ROP_REG_ATTR = lambda gpcId,ropId: ((gpcId << 8) | (ropId)) # type: ignore +SM_REG_ATTR = lambda gpcId,tpcId,smId: ((((gpcId) << 16) | ((tpcId) << 8)) | (smId)) # type: ignore +NV0000_CTRL_CMD_NVD_RCERR_RPT_ANY_PROCESS_ID = 0x00000000 +NV0000_CTRL_CMD_NVD_RCERR_RPT_ANY_OWNER_ID = 0xFFFFFFFF +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_NVD_GET_DPC_ISR_TS = (0x608) +NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_SET_SUB_PROCESS_ID = (0x901) +NV0000_CTRL_CMD_DISABLE_SUB_PROCESS_USERD_ISOLATION = (0x902) +NV0000_SYNC_GPU_BOOST_MAX_GROUPS = (0x10) +NV0000_SYNC_GPU_BOOST_INVALID_GROUP_ID = 0xFFFFFFFF +NV0000_CTRL_CMD_SYNC_GPU_BOOST_INFO = (0xa01) +NV0000_SYNC_GPU_BOOST_INFO_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_CREATE = (0xa02) +NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_DESTROY = (0xa03) +NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_INFO = (0xa04) +NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_SYSTEM_GET_FEATURES = (0x1f0) +NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS_MESSAGE_ID = (0xF0) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI = (0, 0) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING = (3, 3) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED = (4, 4) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED_TRUE = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION = (0x101) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_SYSTEM_GET_CPU_INFO = (0x102) +NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_SYSTEM_CPU_FAMILY = (3, 0) +NV0000_CTRL_SYSTEM_CPU_EXTENDED_FAMILY = (11, 4) +NV0000_CTRL_SYSTEM_CPU_MODEL = (3, 0) +NV0000_CTRL_SYSTEM_CPU_EXTENDED_MODEL = (7, 4) +NV0000_CTRL_SYSTEM_CPU_ID_AMD_FAMILY = 0xF +NV0000_CTRL_SYSTEM_CPU_ID_AMD_EXTENDED_FAMILY = 0xA +NV0000_CTRL_SYSTEM_CPU_ID_AMD_MODEL = 0x0 +NV0000_CTRL_SYSTEM_CPU_ID_AMD_EXTENDED_MODEL = 0x4 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_FAMILY = 0x6 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_EXTENDED_FAMILY = 0x0 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_CORE_S_MODEL = 0x7 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_CORE_P_MODEL = 0xA +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_EXTENDED_MODEL = 0x9 +NV0000_CTRL_SYSTEM_CPU_TYPE_UNKNOWN = (0x00000000) +NV0000_CTRL_SYSTEM_CPU_TYPE_P5 = (0x00000001) +NV0000_CTRL_SYSTEM_CPU_TYPE_P55 = (0x00000002) +NV0000_CTRL_SYSTEM_CPU_TYPE_P6 = (0x00000003) +NV0000_CTRL_SYSTEM_CPU_TYPE_P2 = (0x00000004) +NV0000_CTRL_SYSTEM_CPU_TYPE_P2XC = (0x00000005) +NV0000_CTRL_SYSTEM_CPU_TYPE_CELA = (0x00000006) +NV0000_CTRL_SYSTEM_CPU_TYPE_P3 = (0x00000007) +NV0000_CTRL_SYSTEM_CPU_TYPE_P3_INTL2 = (0x00000008) +NV0000_CTRL_SYSTEM_CPU_TYPE_P4 = (0x00000009) +NV0000_CTRL_SYSTEM_CPU_TYPE_CORE2 = (0x00000010) +NV0000_CTRL_SYSTEM_CPU_TYPE_CELN_M16H = (0x00000011) +NV0000_CTRL_SYSTEM_CPU_TYPE_CORE2_EXTRM = (0x00000012) +NV0000_CTRL_SYSTEM_CPU_TYPE_ATOM = (0x00000013) +NV0000_CTRL_SYSTEM_CPU_TYPE_XEON_SPR = (0x00000014) +NV0000_CTRL_SYSTEM_CPU_TYPE_K5 = (0x00000030) +NV0000_CTRL_SYSTEM_CPU_TYPE_K6 = (0x00000031) +NV0000_CTRL_SYSTEM_CPU_TYPE_K62 = (0x00000032) +NV0000_CTRL_SYSTEM_CPU_TYPE_K63 = (0x00000033) +NV0000_CTRL_SYSTEM_CPU_TYPE_K7 = (0x00000034) +NV0000_CTRL_SYSTEM_CPU_TYPE_K8 = (0x00000035) +NV0000_CTRL_SYSTEM_CPU_TYPE_K10 = (0x00000036) +NV0000_CTRL_SYSTEM_CPU_TYPE_K11 = (0x00000037) +NV0000_CTRL_SYSTEM_CPU_TYPE_RYZEN = (0x00000038) +NV0000_CTRL_SYSTEM_CPU_TYPE_C6 = (0x00000060) +NV0000_CTRL_SYSTEM_CPU_TYPE_C62 = (0x00000061) +NV0000_CTRL_SYSTEM_CPU_TYPE_GX = (0x00000070) +NV0000_CTRL_SYSTEM_CPU_TYPE_M1 = (0x00000071) +NV0000_CTRL_SYSTEM_CPU_TYPE_M2 = (0x00000072) +NV0000_CTRL_SYSTEM_CPU_TYPE_MGX = (0x00000073) +NV0000_CTRL_SYSTEM_CPU_TYPE_TM_CRUSOE = (0x00000080) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC603 = (0x00000090) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC604 = (0x00000091) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC750 = (0x00000092) +NV0000_CTRL_SYSTEM_CPU_TYPE_POWERN = (0x00000093) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_UNKNOWN = (0xA0000000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_A9 = (0xA0000009) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_A15 = (0xA000000F) +NV0000_CTRL_SYSTEM_CPU_TYPE_NV_DENVER_1_0 = (0xA0001000) +NV0000_CTRL_SYSTEM_CPU_TYPE_NV_DENVER_2_0 = (0xA0002000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARMV8A_GENERIC = (0xA00FF000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARMV9A_GENERIC = (0xA00FF001) +NV0000_CTRL_SYSTEM_CPU_CAP_MMX = (0x00000001) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE = (0x00000002) +NV0000_CTRL_SYSTEM_CPU_CAP_3DNOW = (0x00000004) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE2 = (0x00000008) +NV0000_CTRL_SYSTEM_CPU_CAP_SFENCE = (0x00000010) +NV0000_CTRL_SYSTEM_CPU_CAP_WRITE_COMBINING = (0x00000020) +NV0000_CTRL_SYSTEM_CPU_CAP_ALTIVEC = (0x00000040) +NV0000_CTRL_SYSTEM_CPU_CAP_PUT_NEEDS_IO = (0x00000080) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WC_WORKAROUND = (0x00000100) +NV0000_CTRL_SYSTEM_CPU_CAP_3DNOW_EXT = (0x00000200) +NV0000_CTRL_SYSTEM_CPU_CAP_MMX_EXT = (0x00000400) +NV0000_CTRL_SYSTEM_CPU_CAP_CMOV = (0x00000800) +NV0000_CTRL_SYSTEM_CPU_CAP_CLFLUSH = (0x00001000) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WAR_190854 = (0x00002000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE3 = (0x00004000) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WAR_124888 = (0x00008000) +NV0000_CTRL_SYSTEM_CPU_CAP_HT_CAPABLE = (0x00010000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE41 = (0x00020000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE42 = (0x00040000) +NV0000_CTRL_SYSTEM_CPU_CAP_AVX = (0x00080000) +NV0000_CTRL_SYSTEM_CPU_CAP_ERMS = (0x00100000) +NV0000_CTRL_CMD_SYSTEM_GET_CHIPSET_INFO = (0x104) +NV0000_SYSTEM_MAX_CHIPSET_STRING_LENGTH = (0x0000020) +NV0000_SYSTEM_CHIPSET_INVALID_ID = (0xffff) +NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE = (0, 0) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE_NO = (0x00000000) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE_YES = (0x00000001) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT = (0x107) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_SYSTEM_GET_LOCK_TIMES = (0x109) +NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS_MESSAGE_ID = (0x9) +NV0000_CTRL_CMD_SYSTEM_GET_CLASSLIST = (0x108) +NV0000_CTRL_SYSTEM_MAX_CLASSLIST_SIZE = (32) +NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_SYSTEM_NOTIFY_EVENT = (0x110) +NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS_MESSAGE_ID = (0x10) +NV0000_CTRL_SYSTEM_EVENT_TYPE_LID_STATE = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_TYPE_POWER_SOURCE = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_TYPE_DOCK_STATE = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_TYPE_TRUST_LID = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_TYPE_TRUST_DOCK = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_LID_OPEN = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_LID_CLOSED = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_POWER_BATTERY = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_POWER_AC = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_UNDOCKED = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_DOCKED = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_DSM = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_DCS = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_NVIF = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_ACPI = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_POLL = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_COUNT = (0x5) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_DSM = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_DCS = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_NVIF = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_ACPI = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_POLL = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_COUNT = (0x5) +NV0000_CTRL_SYSTEM_EVENT_DATA_FORCED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_FORCED_TRUE = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE = (0x111) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS_MESSAGE_ID = (0x11) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_DESKTOP = (0x000000) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_MOBILE_GENERIC = (0x000001) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_MOBILE_TOSHIBA = (0x000002) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_SOC = (0x000003) +NV0000_CTRL_CMD_SYSTEM_DEBUG_RMMSG_CTRL = (0x121) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_SIZE = 512 +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_CMD_GET = (0x00000000) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_CMD_SET = (0x00000001) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS_MESSAGE_ID = (0x21) +NV0000_CTRL_SYSTEM_HWBC_INVALID_ID = (0xFFFFFFFF) +NV0000_CTRL_CMD_SYSTEM_GET_HWBC_INFO = (0x124) +NV0000_CTRL_SYSTEM_MAX_HWBCS = (0x00000080) +NV0000_CTRL_SYSTEM_GET_HWBC_INFO_PARAMS_MESSAGE_ID = (0x24) +NV0000_CTRL_CMD_SYSTEM_GPS_CONTROL = (0x122) +NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS_MESSAGE_ID = (0x22) +NV0000_CTRL_CMD_SYSTEM_GPS_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_INIT = (0x0000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_EXEC = (0x0001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_EXEC = (0x0002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_ACTIONS = (0x0003) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_ACTIONS = (0x0004) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_LOGIC = (0x0005) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_LOGIC = (0x0006) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_PREFERENCE = (0x0007) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_PREFERENCE = (0x0008) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_GPU2CPU_LIMIT = (0x0009) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_GPU2CPU_LIMIT = (0x000A) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_PMU_GPS_STATE = (0x000B) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_PMU_GPS_STATE = (0x000C) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_MAX_POWER = (0x0100) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_MAX_POWER = (0x0101) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_COOLING_BUDGET = (0x0102) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_COOLING_BUDGET = (0x0103) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_INTEGRAL_PERIOD = (0x0104) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_INTEGRAL_PERIOD = (0x0105) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_RULESET = (0x0106) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_RULESET = (0x0107) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_RULE_COUNT = (0x0108) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_APP_BOOST = (0x0109) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_APP_BOOST = (0x010A) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_PWR_SUPPLY_MODE = (0x010B) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_PWR_SUPPLY_MODE = (0x010C) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_VCT_SUPPORT_INFO = (0x010D) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_SUPPORTED_FUNCTIONS = (0x010E) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER = (0x0200) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_DELTA = (0x0201) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_FUTURE = (0x0202) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_LTMAVG = (0x0203) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_INTEGRAL = (0x0204) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_BURDEN = (0x0205) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_INTERMEDIATE = (0x0206) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_SENSOR_PARAMETERS = (0x0210) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP = (0x0220) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP_DELTA = (0x0221) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP_FUTURE = (0x0222) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE = (0x0240) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_CAP = (0x0241) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_MIN = (0x0242) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_MAX = (0x0243) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_ACTION = (0x0244) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_SLFM_PRESENT = (0x0245) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_SET_POWER_SIM_STATE = (0x0250) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_SIM_STATE = (0x0251) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_SET_POWER_SIM_DATA = (0x0252) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_SIM_DATA = (0x0253) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_INIT_USING_SBIOS_AND_ACK = (0x0320) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_PING_SBIOS_FOR_EVENT = (0x0321) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_SYSTEM = (0x0000) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_CPU = lambda i: (0x0100+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_GPU = lambda i: (0x0200+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INVALID = (0x80000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INIT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INIT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_EXEC_STOP = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_EXEC_START = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_ACTIONS_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_ACTIONS_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_FUZZY = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_DETERMINISTIC = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_CPU = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_GPU = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_BOTH = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_NO_MAP_OVERRIDE = (0xFFFFFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PMU_GPS_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PMU_GPS_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_REAL = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_FAKE_AC = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_FAKE_BATT = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SUPPORT = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_VENTURASTATUS = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_GETPSS = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SETPPC = (0x00000008) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_GETPPC = (0x00000010) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_VENTURACB = (0x00000020) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SYSPARAMS = (0x00000040) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DEC_TO_P0 = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DEC_BY_1 = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DO_NOTHING = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_SET_CURRENT = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_BY_1 = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_BY_2 = (0x00000005) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_TO_LFM = (0x00000006) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_TO_SLFM = (0x00000007) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_SLFM_PRESENT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_SLFM_PRESENT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_POWER_SIM_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_POWER_SIM_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_BATCH_CONTROL = (0x123) +NV0000_CTRL_CMD_SYSTEM_GPS_BATCH_COMMAND_MAX = (16) +NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_MESSAGE_ID = (0x23) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS = (0x127) +NV0000_CTRL_SYSTEM_MAX_ATTACHED_GPUS = 32 +NV0000_CTRL_SYSTEM_MAX_ATTACHED_GPUS_SQUARED = 1024 +NV0000_CTRL_SYSTEM_MAX_P2P_GROUP_GPUS = 8 +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INVALID_PEER = 0xffffffff +NV0000_CTRL_P2P_CAPS_INDEX_READ = 0 +NV0000_CTRL_P2P_CAPS_INDEX_WRITE = 1 +NV0000_CTRL_P2P_CAPS_INDEX_NVLINK = 2 +NV0000_CTRL_P2P_CAPS_INDEX_ATOMICS = 3 +NV0000_CTRL_P2P_CAPS_INDEX_PROP = 4 +NV0000_CTRL_P2P_CAPS_INDEX_LOOPBACK = 5 +NV0000_CTRL_P2P_CAPS_INDEX_PCI = 6 +NV0000_CTRL_P2P_CAPS_INDEX_C2C = 7 +NV0000_CTRL_P2P_CAPS_INDEX_PCI_BAR1 = 8 +NV0000_CTRL_P2P_CAPS_INDEX_TABLE_SIZE = 9 +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_MESSAGE_ID = (0x27) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED = (0, 0) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED = (1, 1) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED = (2, 2) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED = (3, 3) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED = (4, 4) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED = (5, 5) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED = (6, 6) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED = (7, 7) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED = (8, 8) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED = (9, 9) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED = (10, 10) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED = (12, 12) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED = (13, 13) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED_TRUE = (0x00000001) +NV0000_P2P_CAPS_STATUS_OK = (0x00) +NV0000_P2P_CAPS_STATUS_CHIPSET_NOT_SUPPORTED = (0x01) +NV0000_P2P_CAPS_STATUS_GPU_NOT_SUPPORTED = (0x02) +NV0000_P2P_CAPS_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED = (0x03) +NV0000_P2P_CAPS_STATUS_DISABLED_BY_REGKEY = (0x04) +NV0000_P2P_CAPS_STATUS_NOT_SUPPORTED = (0x05) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS_V2 = (0x12b) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS_MESSAGE_ID = (0x2B) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS_MATRIX = (0x13a) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_MESSAGE_ID = (0x3A) +NV0000_CTRL_CMD_SYSTEM_GPS_CTRL = (0x12a) +NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS_MESSAGE_ID = (0x2A) +NV0000_CTRL_GPS_PSHARE_PARAMS_PSP_CURRENT_VERSION = (0x00010000) +NV0000_CTRL_GPS_CMD_TYPE_GET_THERM_LIMIT = (0x00000002) +NV0000_CTRL_GPS_INPUT_SENSOR_INDEX = (0x00000000) +NV0000_CTRL_GPS_RESULT_THERMAL_LIMIT = (0x00000000) +NV0000_CTRL_GPS_RESULT_MIN_LIMIT = (0x00000001) +NV0000_CTRL_GPS_RESULT_MAX_LIMIT = (0x00000002) +NV0000_CTRL_GPS_RESULT_LIMIT_SOURCE = (0x00000003) +NV0000_CTRL_GPS_CMD_TYPE_SET_THERM_LIMIT = (0x00000003) +NV0000_CTRL_GPS_INPUT_THERMAL_LIMIT = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_DOWN_N_DELTA = (0x00000004) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_DOWN_N_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_DOWN_N_DELTA = (0x00000005) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_DOWN_N_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_HOLD_DELTA = (0x00000006) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_HOLD_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_HOLD_DELTA = (0x00000007) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_HOLD_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_UP_DELTA = (0x00000008) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_UP_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_UP_DELTA = (0x00000009) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_UP_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000A) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_ENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000B) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_ENGAGE_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000C) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000D) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_STATUS = (0x00000016) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_STATUS = (0x00000017) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_GET_UTIL_AVG_NUM = (0x00000018) +NV0000_CTRL_GPS_RESULT_CPU_SET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_SET_UTIL_AVG_NUM = (0x00000019) +NV0000_CTRL_GPS_INPUT_CPU_GET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_PERF_SENSOR = (0x0000001A) +NV0000_CTRL_GPS_INPUT_NEXT_EXPECTED_POLL = (0x00000001) +NV0000_CTRL_GPS_RESULT_PERF_SENSOR_VALUE = (0x00000000) +NV0000_CTRL_GPS_RESULT_PERF_SENSOR_AVAILABLE = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_CALL_ACPI = (0x0000001B) +NV0000_CTRL_GPS_INPUT_ACPI_CMD = (0x00000000) +NV0000_CTRL_GPS_INPUT_ACPI_PARAM_IN = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_RESULT_1 = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_RESULT_2 = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_STATUS = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_VERSION = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_SZ = (0x00000002) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSS_SZ = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSS_COUNT = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_IGPU_TURBO = (0x0000001C) +NV0000_CTRL_GPS_INPUT_SET_IGPU_TURBO = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_PERIOD = (0x00000026) +NV0000_CTRL_GPS_INPUT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_PERIOD = (0x00000027) +NV0000_CTRL_GPS_RESULT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_NUDGE_FACTOR = (0x00000028) +NV0000_CTRL_GPS_INPUT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_NUDGE_FACTOR = (0x00000029) +NV0000_CTRL_GPS_RESULT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_THRESHOLD_SAMPLES = (0x0000002A) +NV0000_CTRL_GPS_INPUT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_THRESHOLD_SAMPLES = (0x0000002B) +NV0000_CTRL_GPS_RESULT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_PERF_LIMITS = (0x0000002C) +NV0000_CTRL_GPS_INPUT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_PERF_LIMITS = (0x0000002D) +NV0000_CTRL_GPS_RESULT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_PM1_AVAILABLE = (0x0000002E) +NV0000_CTRL_GPS_INPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_PM1_AVAILABLE = (0x0000002F) +NV0000_CTRL_GPS_OUTPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS = (0x00000044) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL2 = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_PACKAGE_LIMITS = (0x00000045) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_FREQ_LIMIT = (0x00000046) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_FREQ_LIMIT = (0x00000047) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM = (0x00000048) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM_INDEX = (0) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM_AVAILABLE_MASK = (1) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM = (0x00000049) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM_INDEX = (0) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM_INDEX_MAX = (2) +NV0000_CTRL_GPS_PPM_INDEX = (7, 0) +NV0000_CTRL_GPS_PPM_INDEX_MAXPERF = (0) +NV0000_CTRL_GPS_PPM_INDEX_BALANCED = (1) +NV0000_CTRL_GPS_PPM_INDEX_QUIET = (2) +NV0000_CTRL_GPS_PPM_INDEX_INVALID = (0xFF) +NV0000_CTRL_GPS_PPM_MASK = (15, 8) +NV0000_CTRL_GPS_PPM_MASK_INVALID = (0) +NV0000_CTRL_GPS_CMD_PS_STATUS_OFF = (0) +NV0000_CTRL_GPS_CMD_PS_STATUS_ON = (1) +GPS_MAX_COUNTERS_PER_BLOCK = 32 +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS_MESSAGE_ID = (0x29) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_PERF_SENSORS = (0x12c) +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x2C) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS = (0x12e) +NV0000_CTRL_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x2E) +GPS_MAX_ACPI_OUTPUT_BUFFER_SIZE = 288 +NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS_MESSAGE_ID = (0x2D) +NV0000_CTRL_CMD_SYSTEM_GPS_CALL_ACPI = (0x12d) +NV0000_CTRL_SYSTEM_PARAM_TGPU = (0x00000000) +NV0000_CTRL_SYSTEM_PARAM_PDTS = (0x00000001) +NV0000_CTRL_SYSTEM_PARAM_SFAN = (0x00000002) +NV0000_CTRL_SYSTEM_PARAM_SKNT = (0x00000003) +NV0000_CTRL_SYSTEM_PARAM_CPUE = (0x00000004) +NV0000_CTRL_SYSTEM_PARAM_TMP1 = (0x00000005) +NV0000_CTRL_SYSTEM_PARAM_TMP2 = (0x00000006) +NV0000_CTRL_SYSTEM_PARAM_CTGP = (0x00000007) +NV0000_CTRL_SYSTEM_PARAM_PPMD = (0x00000008) +NV0000_CTRL_SYSTEM_PARAM_COUNT = (0x00000009) +NV0000_CTRL_CMD_SYSTEM_EXECUTE_ACPI_METHOD = (0x130) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS_MESSAGE_ID = (0x30) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_NVOP_OPTIMUSCAPS = (0x00000000) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_NVOP_OPTIMUSFLAG = (0x00000001) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_JT_CAPS = (0x00000002) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_JT_PLATPOLICY = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_ENABLE_ETW_EVENTS = (0x131) +NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS_MESSAGE_ID = (0x31) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_ALL = (0x00000001) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NOFREQ = (0x00000002) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_FLUSH = (0x00000004) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PERF = (0x00000010) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_ELPG = (0x00000020) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NVDPS = (0x00000040) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_POWER = (0x00000080) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_DISP = (0x00000100) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_RMAPI = (0x00000200) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_INTR = (0x00000400) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_LOCK = (0x00000800) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_RCJOURNAL = (0x00001000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_GENERIC = (0x00002000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_THERM = (0x00004000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_GPS = (0x00008000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PCIE = (0x00010000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NVTELEMETRY = (0x00020000) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_FRM_DATA = (0x12f) +NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE_SIZE = 64 +NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS_MESSAGE_ID = (0x2F) +NV0000_CTRL_CMD_SYSTEM_GPS_SET_FRM_DATA = (0x132) +NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS_MESSAGE_ID = (0x32) +NV0000_CTRL_CMD_SYSTEM_GET_VGX_SYSTEM_INFO_BUFFER_SIZE = 256 +NV0000_CTRL_CMD_SYSTEM_GET_VGX_SYSTEM_INFO = (0x133) +NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS_MESSAGE_ID = (0x33) +NV0000_CTRL_CMD_SYSTEM_GET_GPUS_POWER_STATUS = (0x134) +NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS_MESSAGE_ID = (0x34) +NV0000_CTRL_SYSTEM_GPU_EXTERNAL_POWER_STATUS_CONNECTED = 0 +NV0000_CTRL_SYSTEM_GPU_EXTERNAL_POWER_STATUS_NOT_CONNECTED = 1 +NV0000_CTRL_CMD_SYSTEM_GET_PRIVILEGED_STATUS = (0x135) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS_MESSAGE_ID = (0x35) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PRIV_USER_FLAG = (0x00000001) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_KERNEL_HANDLE_FLAG = (0x00000002) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PRIV_HANDLE_FLAG = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GET_FABRIC_STATUS = (0x136) +NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS_MESSAGE_ID = (0x36) +NV0000_CTRL_VGPU_GET_VGPU_VERSION = (0x137) +NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS_MESSAGE_ID = (0x37) +NV0000_CTRL_VGPU_SET_VGPU_VERSION = (0x138) +NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS_MESSAGE_ID = (0x38) +NV0000_CTRL_CMD_SYSTEM_GET_RM_INSTANCE_ID = (0x139) +NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS_MESSAGE_ID = (0x39) +NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO = (0x13b) +NVPCF_CTRL_SYSPWRLIMIT_TYPE_BASE = 1 +NV0000_CTRL_SYSTEM_POWER_INFO_INDEX_MAX_SIZE = 32 +NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT_MESSAGE_ID = (0x48) +NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_MESSAGE_ID = (0x3B) +CONTROLLER_FILTER_TYPE_EMWA = 0 +CONTROLLER_FILTER_TYPE_MOVING_MAX = 1 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_SUPPORTED_CASE = 2 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DYNAMIC_CASE = 3 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_STATIC_CASE = 4 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DC_SYSTEM_POWER_LIMITS_CASE = 5 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_CPU_TDP_LIMIT_CONTROL_CASE = 6 +NVPCF0100_CTRL_CONFIG_DSM_1X_FUNC_GET_SUPPORTED = (0x00000000) +NVPCF0100_CTRL_CONFIG_DSM_1X_FUNC_GET_DYNAMIC_PARAMS = (0x00000002) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED = (0, 0) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED_YES = 1 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED_NO = 0 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_DC_SYSTEM_POWER_LIMITS_IS_SUPPORTED = (8, 8) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_DC_SYSTEM_POWER_LIMITS_IS_SUPPORTED_YES = 1 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_DC_SYSTEM_POWER_LIMITS_IS_SUPPORTED_NO = 0 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_CPU_TDP_LIMIT_CONTROL_IS_SUPPORTED = (9, 9) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_CPU_TDP_LIMIT_CONTROL_IS_SUPPORTED_YES = 1 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_CPU_TDP_LIMIT_CONTROL_IS_SUPPORTED_NO = 0 +NVPCF0100_CTRL_CONFIG_DSM_2X_VERSION = (0x00000200) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_SUPPORTED = (0x00000000) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_STATIC_CONFIG_TABLES = (0x00000001) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DYNAMIC_PARAMS = (0x00000002) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DC_SYSTEM_POWER_LIMITS_TABLE = (0x00000008) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_CPU_TDP_LIMIT_CONTROL = (0x00000009) +NVPCF0100_CTRL_CONFIG_2X_BUFF_SIZE_MAX = (255) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT = (0x13c) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS_MESSAGE_ID = (0x3C) +NV0000_CTRL_CMD_SYSTEM_GET_CLIENT_DATABASE_INFO = (0x13d) +NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS_MESSAGE_ID = (0x3D) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_MAX_STRING_SIZE = 256 +NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION_V2 = (0x13e) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS_MESSAGE_ID = (0x3E) +NV0000_CTRL_CMD_SYSTEM_RMCTRL_CACHE_MODE_CTRL = (0x13f) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS_MESSAGE_ID = (0x3F) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_CMD_GET = (0x00000000) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_CMD_SET = (0x00000001) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_DISABLE = (0x00000000) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_ENABLE = (0x00000001) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_VERIFY_ONLY = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CONTROL = (0x140) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS_MESSAGE_ID = (0x40) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_INIT = (0x0000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_EXEC = (0x0001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_EXEC = (0x0002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_ACTIONS = (0x0003) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_ACTIONS = (0x0004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_LOGIC = (0x0005) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_LOGIC = (0x0006) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_PREFERENCE = (0x0007) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_PREFERENCE = (0x0008) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_GPU2CPU_LIMIT = (0x0009) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_GPU2CPU_LIMIT = (0x000A) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_PMU_PFM_REQ_HNDLR_STATE = (0x000B) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_PMU_PFM_REQ_HNDLR_STATE = (0x000C) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_MAX_POWER = (0x0100) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_MAX_POWER = (0x0101) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_COOLING_BUDGET = (0x0102) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_COOLING_BUDGET = (0x0103) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_INTEGRAL_PERIOD = (0x0104) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_INTEGRAL_PERIOD = (0x0105) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_RULESET = (0x0106) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_RULESET = (0x0107) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_RULE_COUNT = (0x0108) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_APP_BOOST = (0x0109) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_APP_BOOST = (0x010A) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_PWR_SUPPLY_MODE = (0x010B) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_PWR_SUPPLY_MODE = (0x010C) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_VCT_SUPPORT_INFO = (0x010D) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_SUPPORTED_FUNCTIONS = (0x010E) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER = (0x0200) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_DELTA = (0x0201) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_FUTURE = (0x0202) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_LTMAVG = (0x0203) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_INTEGRAL = (0x0204) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_BURDEN = (0x0205) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_INTERMEDIATE = (0x0206) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_SENSOR_PARAMETERS = (0x0210) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP = (0x0220) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP_DELTA = (0x0221) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP_FUTURE = (0x0222) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE = (0x0240) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_CAP = (0x0241) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_MIN = (0x0242) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_MAX = (0x0243) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_ACTION = (0x0244) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_SLFM_PRESENT = (0x0245) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_SET_POWER_SIM_STATE = (0x0250) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_SIM_STATE = (0x0251) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_SET_POWER_SIM_DATA = (0x0252) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_SIM_DATA = (0x0253) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_INIT_USING_SBIOS_AND_ACK = (0x0320) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_PING_SBIOS_FOR_EVENT = (0x0321) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_SYSTEM = (0x0000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_CPU = lambda i: (0x0100+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_GPU = lambda i: (0x0200+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INVALID = (0x80000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INIT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INIT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_EXEC_STOP = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_EXEC_START = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_ACTIONS_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_ACTIONS_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_FUZZY = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_DETERMINISTIC = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_CPU = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_GPU = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_BOTH = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_NO_MAP_OVERRIDE = (0xFFFFFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PMU_PFM_REQ_HNDLR_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PMU_PFM_REQ_HNDLR_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_REAL = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_FAKE_AC = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_FAKE_BATT = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SUPPORT = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_VENTURASTATUS = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_GETPSS = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SETPPC = (0x00000008) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_GETPPC = (0x00000010) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_VENTURACB = (0x00000020) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SYSPARAMS = (0x00000040) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DEC_TO_P0 = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DEC_BY_1 = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DO_NOTHING = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_SET_CURRENT = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_BY_1 = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_BY_2 = (0x00000005) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_TO_LFM = (0x00000006) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_TO_SLFM = (0x00000007) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_SLFM_PRESENT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_SLFM_PRESENT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_POWER_SIM_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_POWER_SIM_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL = (0x141) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_BATCH_COMMAND_MAX = (16) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_MESSAGE_ID = (0x41) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CTRL = (0x142) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS_MESSAGE_ID = (0x42) +NV0000_CTRL_PFM_REQ_HNDLR_PSHARE_PARAMS_PSP_CURRENT_VERSION = (0x00010000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_THERM_LIMIT = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_SENSOR_INDEX = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_THERMAL_LIMIT = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_MIN_LIMIT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_MAX_LIMIT = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_LIMIT_SOURCE = (0x00000003) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_THERM_LIMIT = (0x00000003) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_THERMAL_LIMIT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_DOWN_N_DELTA = (0x00000004) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_DOWN_N_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_DOWN_N_DELTA = (0x00000005) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_DOWN_N_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_HOLD_DELTA = (0x00000006) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_HOLD_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_HOLD_DELTA = (0x00000007) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_HOLD_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_UP_DELTA = (0x00000008) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_UP_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_UP_DELTA = (0x00000009) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_UP_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000A) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_ENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000B) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_ENGAGE_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000C) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000D) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_STATUS = (0x00000016) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_STATUS = (0x00000017) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_GET_UTIL_AVG_NUM = (0x00000018) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_CPU_SET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_SET_UTIL_AVG_NUM = (0x00000019) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_CPU_GET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PERF_SENSOR = (0x0000001A) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_NEXT_EXPECTED_POLL = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_PERF_SENSOR_VALUE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_PERF_SENSOR_AVAILABLE = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_CALL_ACPI = (0x0000001B) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_ACPI_CMD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_ACPI_PARAM_IN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_RESULT_1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_RESULT_2 = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_VERSION = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_SZ = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSS_SZ = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSS_COUNT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_IGPU_TURBO = (0x0000001C) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_SET_IGPU_TURBO = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_PERIOD = (0x00000026) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_PERIOD = (0x00000027) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_NUDGE_FACTOR = (0x00000028) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_NUDGE_FACTOR = (0x00000029) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_THRESHOLD_SAMPLES = (0x0000002A) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_THRESHOLD_SAMPLES = (0x0000002B) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_PERF_LIMITS = (0x0000002C) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_PERF_LIMITS = (0x0000002D) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PM1_AVAILABLE = (0x0000002E) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PM1_AVAILABLE = (0x0000002F) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS = (0x00000044) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL2 = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_PACKAGE_LIMITS = (0x00000045) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_FREQ_LIMIT = (0x00000046) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_FREQ_LIMIT = (0x00000047) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM = (0x00000048) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM_INDEX = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM_AVAILABLE_MASK = (1) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM = (0x00000049) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM_INDEX = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM_INDEX_MAX = (2) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX = (7, 0) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_MAXPERF = (0) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_BALANCED = (1) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_QUIET = (2) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_INVALID = (0xFF) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_MASK = (15, 8) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_MASK_INVALID = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_PS_STATUS_OFF = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_PS_STATUS_ON = (1) +PFM_REQ_HNDLR_MAX_COUNTERS_PER_BLOCK = 32 +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS = (0x146) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x46) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS = (0x147) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x47) +PFM_REQ_HNDLR_MAX_ACPI_OUTPUT_BUFFER_SIZE = 288 +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS_MESSAGE_ID = (0x43) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI = (0x143) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PFM_REQ_HNDLR = (0x00008000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA = (0x144) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE_SIZE = 64 +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS_MESSAGE_ID = (0x44) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA = (0x145) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS_MESSAGE_ID = (0x45) +NV0000_CTRL_CMD_OS_UNIX_FLUSH_USER_CACHE = (0x3d02) +NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_FLUSH = (0x00000001) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_INVALIDATE = (0x00000002) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_FLUSH_INVALIDATE = (0x00000003) +NV0000_CTRL_CMD_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR = (0x3d04) +NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECT_TO_FD = (0x3d05) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD = (0, 0) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD_FALSE = (0x00000000) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD_TRUE = (0x00000001) +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_FROM_FD = (0x3d06) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_OS_GET_GPU_INFO = (0x3d07) +NV0000_CTRL_CMD_OS_UNIX_GET_EXPORT_OBJECT_INFO = (0x3d08) +NV0000_OS_UNIX_EXPORT_OBJECT_FD_BUFFER_SIZE = 64 +NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_OS_UNIX_REFRESH_RMAPI_DEVICE_LIST = (0x3d09) +NV0000_CTRL_CMD_OS_UNIX_CREATE_EXPORT_OBJECT_FD = (0x3d0a) +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_BUFFER_SIZE = NV0000_OS_UNIX_EXPORT_OBJECT_FD_BUFFER_SIZE +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS_MESSAGE_ID = (0xA) +NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECTS_TO_FD = (0x3d0b) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_MAX_OBJECTS = 512 +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS_MESSAGE_ID = (0xB) +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECTS_FROM_FD = (0x3d0c) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_TO_FD_MAX_OBJECTS = 128 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_NONE = 0 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_VIDMEM = 1 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_SYSMEM = 2 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_FABRIC = 3 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_FABRIC_MC = 4 +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS_MESSAGE_ID = (0xC) +NV0000_BUSDEVICE_DOMAIN = (31, 16) +NV0000_BUSDEVICE_BUS = (15, 8) +NV0000_BUSDEVICE_DEVICE = (7, 0) +NV0000_CTRL_CMD_VGPU_CREATE_DEVICE = (0xc02) +NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_VGPU_GET_INSTANCES = (0xc03) +NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_VGPU_DELETE_DEVICE = (0xc04) +NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_VGPU_VFIO_NOTIFY_RM_STATUS = (0xc05) +NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_GPU_UPDATE_SYSFS_NODE = (0x206) +NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_RESERVED = (0x00) +NV0080_CTRL_BIF = (0x01) +NV0080_CTRL_GPU = (0x02) +NV0080_CTRL_CLK = (0x10) +NV0080_CTRL_GR = (0x11) +NV0080_CTRL_CIPHER = (0x12) +NV0080_CTRL_FB = (0x13) +NV0080_CTRL_HOST = (0x14) +NV0080_CTRL_VIDEO = (0x15) +NV0080_CTRL_FIFO = (0x17) +NV0080_CTRL_DMA = (0x18) +NV0080_CTRL_PERF = (0x19) +NV0080_CTRL_PERF_LEGACY_NON_PRIVILEGED = (0x99) +NV0080_CTRL_MSENC = (0x1B) +NV0080_CTRL_BSP = (0x1C) +NV0080_CTRL_RC = (0x1D) +NV0080_CTRL_OS_UNIX = (0x1E) +NV0080_CTRL_NVJPG = (0x1F) +NV0080_CTRL_INTERNAL = (0x20) +NV0080_CTRL_NVLINK = (0x21) +NV0080_CTRL_CMD_NULL = (0x800000) +NV0080_CTRL_CMD_BIF_RESET = (0x800102) +NV0080_CTRL_BIF_RESET_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_BIF_RESET_FLAGS_TYPE = (4, 0) +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_SW_RESET = 0x1 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_SBR = 0x2 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_FUNDAMENTAL = 0x3 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BOOT_DEVICE_FUSE = 0x4 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BOOT_DEVICE = 0x5 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_PEX = 0x6 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_OOBHUB_TRIGGER = 0x7 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BASE = 0x8 +NV0080_CTRL_CMD_BIF_SET_ASPM_FEATURE = (0x800104) +NV0080_CTRL_BIF_SET_ASPM_FEATURE_PARAMS_MESSAGE_ID = (0x4) +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L0S = (0, 0) +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L0S_ENABLED = 0x000000001 +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L0S_DISABLED = 0x000000000 +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L1 = (1, 1) +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L1_ENABLED = 0x000000001 +NV0080_CTRL_BIF_ASPM_FEATURE_DT_L1_DISABLED = 0x000000000 +NV0080_CTRL_CMD_BIF_ASPM_CYA_UPDATE = (0x800105) +NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS_MESSAGE_ID = (0x5) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK = (0x800106) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_CMD_BSP_GET_CAPS = (0x801c01) +NV0080_CTRL_BSP_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_BSP_CAPS_TBL_SIZE = 8 +NV0080_CTRL_CMD_BSP_GET_CAPS_V2 = (0x801c02) +NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2_MESSAGE_ID = (0x2) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID = (0, 0) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED = (2, 1) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_NOT_SUPPORTED = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE = (6, 3) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_PEER_MEMORY = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_SYSTEM_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_SYSTEM_NON_COHERENT_MEMORY = (0x00000003) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS = (10, 7) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_NONE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_1 = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_2 = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_4 = (0x00000004) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED = (12, 11) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_NOT_SUPPORTED = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS = (14, 13) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_READ_WRITE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_READ_ONLY = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_WRITE_ONLY = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_NOT_SUPPORTED = (0x00000003) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY = (15, 15) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC = (16, 16) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC_DISABLE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC_ENABLE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING = (17, 17) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING_DISABLE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING_ENABLE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED = (18, 18) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_GET_PTE_INFO = (0x801801) +NV0080_CTRL_DMA_GET_PTE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_CMD_DMA_SET_PTE_INFO = (0x80180a) +NV0080_CTRL_DMA_SET_PTE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS_MESSAGE_ID = (0xA) +NV0080_CTRL_CMD_DMA_FILL_PTE_MEM = (0x801802) +NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_DMA_FLUSH = (0x801805) +NV0080_CTRL_DMA_FLUSH_PARAMS_MESSAGE_ID = (0x5) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2 = (0, 0) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG = (1, 1) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB = (2, 2) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE = (4, 3) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE_SYSMEM = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE_PEERMEM = (0x00000002) +NV0080_CTRL_CMD_DMA_ADV_SCHED_GET_VA_CAPS = (0x801806) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_MAX_NUM_PAGE_TABLE_FORMATS = (16) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_CMD_DMA_ADV_SCHED_GET_VA_CAPS_WITH_VA_RANGE_LO = 0x1 +NV0080_CTRL_CMD_DMA_GET_PDE_INFO = (0x801809) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_SYSTEM_COHERENT_MEMORY = (0x00000001) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_SYSTEM_NON_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_SYSTEM_COHERENT_MEMORY = (0x00000001) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_SYSTEM_NON_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_FULL = 1 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_HALF = 2 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_QUARTER = 3 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_EIGHTH = 4 +NV0080_CTRL_CMD_DMA_INVALIDATE_TLB = (0x80180c) +NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS_MESSAGE_ID = (0xC) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL = (0, 0) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL_FALSE = (0x00000000) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_GET_CAPS = (0x80180d) +NV0080_CTRL_DMA_CAPS_TBL_SIZE = 8 +NV0080_CTRL_DMA_GET_CAPS_PARAMS_MESSAGE_ID = (0xD) +NV0080_CTRL_CMD_DMA_SET_VA_SPACE_SIZE = (0x80180e) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS_MESSAGE_ID = (0xE) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_MAX = (0xFFFFFFFFFFFFFFFF) +NV0080_CTRL_CMD_DMA_UPDATE_PDE_2 = (0x80180f) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_INVALID = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_VIDEO_MEMORY = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_SYSTEM_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_SYSTEM_NON_COHERENT_MEMORY = (0x00000003) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX_SMALL = 0 +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX_BIG = 1 +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX__SIZE = 2 +NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS_MESSAGE_ID = (0xF) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE = (0, 0) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE_TRUE = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE = (1, 1) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE_TRUE = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE = (3, 2) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_FULL = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_HALF = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_QUARTER = (0x00000002) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_EIGHTH = (0x00000003) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE = (4, 4) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE_TRUE = (0x00000001) +NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE = (0x801810) +NV0080_CTRL_DMA_ENABLE_PRIVILEGED_RANGE_PARAMS_MESSAGE_ID = (0x10) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE = (0x801812) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_MESSAGE_ID = (0x12) +NV0080_CTRL_CMD_DMA_SET_PAGE_DIRECTORY = (0x801813) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_MESSAGE_ID = (0x13) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE = (1, 0) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_VIDMEM = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_SYSMEM_COH = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_SYSMEM_NONCOH = (0x00000002) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES = (2, 2) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS = (3, 3) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY = (4, 4) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE = (5, 5) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_UNSET_PAGE_DIRECTORY = (0x801814) +NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_MESSAGE_ID = (0x14) +NV0080_CTRL_CMD_FB_GET_CAPS = (0x801301) +NV0080_CTRL_FB_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_FB_CAPS_TBL_SIZE = 3 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO = (0x801306) +NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_UNKNOWN = 0 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_SYSMEM = 1 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_FBMEM = 2 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_LEGACY = 0 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_1TO1 = 1 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_1TO4 = 2 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_RAWMODE = 3 +NV0080_CTRL_CMD_FB_GET_CAPS_V2 = (0x801307) +NV0080_CTRL_FB_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_CMD_FB_SET_DEFAULT_VIDMEM_PHYSICALITY = (0x801308) +NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS_MESSAGE_ID = (0x8) +NV0080_CTRL_CMD_FIFO_GET_CAPS = (0x801701) +NV0080_CTRL_FIFO_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_FIFO_CAPS_TBL_SIZE = 2 +NV0080_CTRL_CMD_FIFO_GET_ENGINE_CONTEXT_PROPERTIES = (0x801707) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID = (4, 0) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS = (0x00000000) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_VLD = (0x00000001) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_VIDEO = (0x00000002) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_MPEG = (0x00000003) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_CAPTURE = (0x00000004) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_DISPLAY = (0x00000005) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_ENCRYPTION = (0x00000006) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_POSTPROCESS = (0x00000007) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_ZCULL = (0x00000008) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PM = (0x00000009) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COMPUTE_PREEMPT = (0x0000000a) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PREEMPT = (0x0000000b) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_SPILL = (0x0000000c) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PAGEPOOL = (0x0000000d) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_BETACB = (0x0000000e) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_RTV = (0x0000000f) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PATCH = (0x00000010) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_BUNDLE_CB = (0x00000011) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PAGEPOOL_GLOBAL = (0x00000012) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_ATTRIBUTE_CB = (0x00000013) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_RTV_CB_GLOBAL = (0x00000014) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_GFXP_POOL = (0x00000015) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_GFXP_CTRL_BLK = (0x00000016) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_FECS_EVENT = (0x00000017) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PRIV_ACCESS_MAP = (0x00000018) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_SETUP = (0x00000019) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COUNT = (0x0000001a) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_CMD_FIFO_GET_CHANNELLIST = (0x80170d) +NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS_MESSAGE_ID = (0xD) +NV0080_CTRL_CMD_FIFO_GET_LATENCY_BUFFER_SIZE = (0x80170e) +NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0xE) +NV0080_CTRL_FIFO_GET_CHANNELLIST_INVALID_CHANNEL = (0xffffffff) +NV0080_CTRL_CMD_FIFO_SET_CHANNEL_PROPERTIES = (0x80170f) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_MESSAGE_ID = (0xF) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_ENGINETIMESLICEINMICROSECONDS = (0x00000000) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PBDMATIMESLICEINMICROSECONDS = (0x00000001) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_ENGINETIMESLICEDISABLE = (0x00000002) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PBDMATIMESLICEDISABLE = (0x00000003) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_INVALIDATE_PDB_TARGET = (0x00000004) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_RESETENGINECONTEXT = (0x00000005) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_NOOP = (0x00000007) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_RESETENGINECONTEXT_NOPREEMPT = (0x00000008) +NV0080_CTRL_CMD_FIFO_STOP_RUNLIST = (0x801711) +NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS_MESSAGE_ID = (0x11) +NV0080_CTRL_CMD_FIFO_START_RUNLIST = (0x801712) +NV0080_CTRL_FIFO_START_RUNLIST_PARAMS_MESSAGE_ID = (0x12) +NV0080_CTRL_CMD_FIFO_GET_CAPS_V2 = (0x801713) +NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x13) +NV0080_CTRL_CMD_FIFO_IDLE_CHANNELS = (0x801714) +NV0080_CTRL_CMD_FIFO_IDLE_CHANNELS_MAX_CHANNELS = 4096 +NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS_MESSAGE_ID = (0x14) +NV0080_CTRL_CMD_GPU_GET_CLASSLIST = (0x800201) +NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_CMD_GPU_GET_NUM_SUBDEVICES = (0x800280) +NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS_MESSAGE_ID = (0x80) +NV0080_CTRL_CMD_GPU_GET_VIDLINK_ORDER = (0x800281) +NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS_MESSAGE_ID = (0x81) +NV0080_CTRL_CMD_GPU_SET_DISPLAY_OWNER = (0x800282) +NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS_MESSAGE_ID = (0x82) +NV0080_CTRL_CMD_GPU_GET_DISPLAY_OWNER = (0x800283) +NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS_MESSAGE_ID = (0x83) +NV0080_CTRL_CMD_GPU_SET_VIDLINK = (0x800285) +NV0080_CTRL_GPU_SET_VIDLINK_PARAMS_MESSAGE_ID = (0x85) +NV0080_CTRL_GPU_SET_VIDLINK_ENABLE_FALSE = (0x00000000) +NV0080_CTRL_GPU_SET_VIDLINK_ENABLE_TRUE = (0x00000001) +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_GET_STATUS = 0 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_POWERDOWN = 1 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_POWERUP = 2 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWER_ON = 0 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWERING_DOWN = 1 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_GATED = 2 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWERING_UP = 3 +NV0080_CTRL_CMD_GPU_MODIFY_SW_STATE_PERSISTENCE = (0x800287) +NV0080_CTRL_GPU_SW_STATE_PERSISTENCE_ENABLED = (0x00000000) +NV0080_CTRL_GPU_SW_STATE_PERSISTENCE_DISABLED = (0x00000001) +NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS_MESSAGE_ID = (0x87) +NV0080_CTRL_CMD_GPU_QUERY_SW_STATE_PERSISTENCE = (0x800288) +NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS_MESSAGE_ID = (0x88) +NV0080_CTRL_CMD_GPU_GET_VIRTUALIZATION_MODE = (0x800289) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_NONE = (0x00000000) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_NMOS = (0x00000001) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_VGX = (0x00000002) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST = (0x00000003) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST_VGPU = NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST_VSGA = (0x00000004) +NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS_MESSAGE_ID = (0x89) +NV0080_CTRL_CMD_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE = (0x80028c) +NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS_MESSAGE_ID = (0x8C) +NV0080_CTRL_CMD_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE = (0x80028d) +NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS_MESSAGE_ID = (0x8D) +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_DEFAULT = 0 +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_OPTIMIZE_COMPUTE = 1 +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_OPTIMIZE_SPARSE_TEXTURE = 2 +NV0080_CTRL_CMD_GPU_GET_VGX_CAPS = (0x80028e) +NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS_MESSAGE_ID = (0x8E) +NV0080_CTRL_CMD_GPU_GET_SRIOV_CAPS = (0x800291) +NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS_MESSAGE_ID = (0x91) +NV0080_CTRL_GPU_CLASSLIST_MAX_SIZE = 200 +NV0080_CTRL_CMD_GPU_GET_CLASSLIST_V2 = (0x800292) +NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS_MESSAGE_ID = (0x92) +NV0080_CTRL_CMD_GPU_FIND_SUBDEVICE_HANDLE = (0x800293) +NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM_MESSAGE_ID = (0x93) +NV0080_CTRL_GPU_GET_BRAND_CAPS_QUADRO = NVBIT(0) +NV0080_CTRL_GPU_GET_BRAND_CAPS_NVS = NVBIT(1) +NV0080_CTRL_GPU_GET_BRAND_CAPS_TITAN = NVBIT(2) +NV0080_CTRL_CMD_GPU_GET_BRAND_CAPS = (0x800294) +NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS_MESSAGE_ID = (0x94) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64M = (1 << 6) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_128M = (1 << 7) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256M = (1 << 8) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_512M = (1 << 9) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_1G = (1 << 10) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_2G = (1 << 11) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_4G = (1 << 12) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_8G = (1 << 13) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_16G = (1 << 14) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_32G = (1 << 15) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64G = (1 << 16) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_128G = (1 << 17) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256G = (1 << 18) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_MIN = NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64M +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_MAX = NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256G +NV0080_CTRL_GPU_VGPU_NUM_VFS_INVALID = 0x0 +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE = (0x800296) +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS_MESSAGE_ID = (0x96) +NV0080_CTRL_CMD_GPU_SET_VGPU_HETEROGENEOUS_MODE = (0x800297) +NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0x97) +NV0080_CTRL_CMD_GPU_GET_VGPU_HETEROGENEOUS_MODE = (0x800298) +NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0x98) +NV0080_CTRL_CMD_GR_GET_CAPS = (0x801102) +NV0080_CTRL_GR_GET_CAPS_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_GR_CAPS_TBL_SIZE = 23 +NV0080_CTRL_GR_INFO_INDEX_MAXCLIPS = (0x00000000) +NV0080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 = (0x00000001) +NV0080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK = (0x00000002) +NV0080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT = (0x00000003) +NV0080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT = (0x00000004) +NV0080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE = (0x00000005) +NV0080_CTRL_GR_INFO_INDEX_VPE_COUNT = (0x00000006) +NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT = (0x00000007) +NV0080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR = (0x00000008) +NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT = (0x00000009) +NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT = (0x0000000A) +NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT = (0x0000000B) +NV0080_CTRL_GR_INFO_INDEX_SM_VERSION = (0x0000000C) +NV0080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM = (0x0000000D) +NV0080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP = (0x0000000E) +NV0080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES = (0x0000000F) +NV0080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES = (0x00000010) +NV0080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY = (0x00000011) +NV0080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY = (0x00000012) +NV0080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM = (0x00000013) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS = (0x00000014) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS = (0x00000015) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS = (0x00000016) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC = (0x00000017) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS = (0x00000018) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS = (0x00000019) +NV0080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED = (0x0000001A) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS = (0x0000001B) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC = (0x0000001C) +NV0080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT = (0x0000001D) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES = (0x0000001E) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS = (0x0000001F) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC = (0x00000020) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS = (0x00000021) +NV0080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT = (0x00000022) +NV0080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT = (0x00000023) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS = (0x00000024) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS = (0x00000025) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES = (0x00000026) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC = (0x00000027) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP = (0x00000028) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC = (0x00000029) +NV0080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC = (0x0000002A) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP = (0x0000002B) +NV0080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT = (0x0000002C) +NV0080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT = (0x0000002D) +NV0080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT = (0x0000002E) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC = (0x00000032) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES = (0x00000033) +NV0080_CTRL_GR_INFO_INDEX_DUMMY = (0x00000033) +NV0080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES = (0x00000034) +NV0080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES = (0x00000035) +NV0080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS = (0x00000036) +NV0080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG = (0x00000037) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET = (0x00000038) +NV0080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET = (0x00000039) +NV0080_CTRL_GR_INFO_INDEX_MAX = (0x00000039) +NV0080_CTRL_GR_INFO_MAX_SIZE = (0x3a) +NV0080_CTRL_CMD_GR_GET_INFO = (0x801104) +NV0080_CTRL_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0080_CTRL_CMD_GR_GET_TPC_PARTITION_MODE = (0x801107) +NV0080_CTRL_CMD_GR_SET_TPC_PARTITION_MODE = (0x801108) +NV0080_CTRL_GR_GET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x8) +NV0080_CTRL_CMD_GR_GET_CAPS_V2 = (0x801109) +NV0080_CTRL_GR_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_CMD_GR_GET_INFO_V2 = (0x801110) +NV0080_CTRL_GR_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x10) +NV0080_CTRL_CMD_HOST_GET_CAPS = (0x801401) +NV0080_CTRL_HOST_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_HOST_CAPS_TBL_SIZE = 3 +NV0080_CTRL_CMD_HOST_GET_CAPS_V2 = (0x801402) +NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE = (0x802002) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE = (0x802003) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS_MESSAGE_ID = (0x3) +NV0080_CTRL_CMD_INTERNAL_PERF_CUDA_LIMIT_SET_CONTROL = (0x802009) +NV0080_CTRL_CMD_INTERNAL_PERF_CUDA_LIMIT_DISABLE = (0x802004) +NV0080_CTRL_CMD_INTERNAL_PERF_SLI_GPU_BOOST_SYNC_SET_CONTROL = (0x802007) +NV0080_CTRL_CMD_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS = (0x802008) +NV_FIFO_PERMANENTLY_DISABLE_CHANNELS_MAX_CLIENTS = 200 +NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS_MESSAGE_ID = (0x08) +NV0080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED = (0x80200a) +NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS_MESSAGE_ID = (0x0A) +NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS_MESSAGE_ID = (0x45) +NV0080_CTRL_CMD_INTERNAL_KGR_INIT_BUG4208224_WAR = (0x802046) +NV0080_CTRL_INTERNAL_KGR_INIT_BUG4208224_WAR_PARAMS_MESSAGE_ID = (0x46) +NV0080_CTRL_CMD_MSENC_GET_CAPS = (0x801b01) +NV0080_CTRL_MSENC_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_MSENC_CAPS_TBL_SIZE = 5 +NV0080_CTRL_CMD_MSENC_GET_CAPS_V2 = (0x801b02) +NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_NVJPG_CAPS_TBL_SIZE = 9 +NV0080_CTRL_CMD_NVJPG_GET_CAPS_V2 = (0x801f02) +NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_CMD_PERF_CUDA_LIMIT_SET_CONTROL = (0x801909) +NV0080_CTRL_CMD_OS_UNIX_VT_SWITCH = (0x801e01) +NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_SAVE_VT_STATE = (0x00000001) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_RESTORE_VT_STATE = (0x00000002) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_CONSOLE_RESTORED = (0x00000003) +NV0080_CTRL_CMD_OS_UNIX_VT_GET_FB_INFO = (0x801e02) +NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_RESERVED = (0x00) +NV2080_CTRL_GPU = (0x01) +NV2080_CTRL_GPU_LEGACY_NON_PRIVILEGED = (0x81) +NV2080_CTRL_FUSE = (0x02) +NV2080_CTRL_FUSE_LEGACY_NON_PRIVILEGED = (0x82) +NV2080_CTRL_EVENT = (0x03) +NV2080_CTRL_TIMER = (0x04) +NV2080_CTRL_THERMAL = (0x05) +NV2080_CTRL_THERMAL_LEGACY_PRIVILEGED = (0xc5) +NV2080_CTRL_THERMAL_LEGACY_NON_PRIVILEGED = (0x85) +NV2080_CTRL_I2C = (0x06) +NV2080_CTRL_EXTI2C = (0x07) +NV2080_CTRL_BIOS = (0x08) +NV2080_CTRL_CIPHER = (0x09) +NV2080_CTRL_INTERNAL = (0x0A) +NV2080_CTRL_CLK_LEGACY_PRIVILEGED = (0xd0) +NV2080_CTRL_CLK_LEGACY_NON_PRIVILEGED = (0x90) +NV2080_CTRL_CLK = (0x10) +NV2080_CTRL_FIFO = (0x11) +NV2080_CTRL_GR = (0x12) +NV2080_CTRL_FB = (0x13) +NV2080_CTRL_MC = (0x17) +NV2080_CTRL_BUS = (0x18) +NV2080_CTRL_PERF_LEGACY_PRIVILEGED = (0xe0) +NV2080_CTRL_PERF_LEGACY_NON_PRIVILEGED = (0xa0) +NV2080_CTRL_PERF = (0x20) +NV2080_CTRL_NVIF = (0x21) +NV2080_CTRL_RC = (0x22) +NV2080_CTRL_GPIO = (0x23) +NV2080_CTRL_GPIO_LEGACY_NON_PRIVILEGED = (0xa3) +NV2080_CTRL_NVD = (0x24) +NV2080_CTRL_DMA = (0x25) +NV2080_CTRL_PMGR = (0x26) +NV2080_CTRL_PMGR_LEGACY_PRIVILEGED = (0xe6) +NV2080_CTRL_PMGR_LEGACY_NON_PRIVILEGED = (0xa6) +NV2080_CTRL_POWER = (0x27) +NV2080_CTRL_POWER_LEGACY_NON_PRIVILEGED = (0xa7) +NV2080_CTRL_LPWR = (0x28) +NV2080_CTRL_LPWR_LEGACY_NON_PRIVILEGED = (0xa8) +NV2080_CTRL_LPWR_LEGACY_PRIVILEGED = (0xe8) +NV2080_CTRL_ACR = (0x29) +NV2080_CTRL_CE = (0x2A) +NV2080_CTRL_SPI = (0x2B) +NV2080_CTRL_NVLINK = (0x30) +NV2080_CTRL_FLCN = (0x31) +NV2080_CTRL_VOLT = (0x32) +NV2080_CTRL_VOLT_LEGACY_PRIVILEGED = (0xf2) +NV2080_CTRL_VOLT_LEGACY_NON_PRIVILEGED = (0xb2) +NV2080_CTRL_FAS = (0x33) +NV2080_CTRL_ECC = (0x34) +NV2080_CTRL_ECC_NON_PRIVILEGED = (0xb4) +NV2080_CTRL_FLA = (0x35) +NV2080_CTRL_GSP = (0x36) +NV2080_CTRL_NNE = (0x37) +NV2080_CTRL_NNE_LEGACY_NON_PRIVILEGED = (0xb7) +NV2080_CTRL_GRMGR = (0x38) +NV2080_CTRL_UCODE_FUZZER = (0x39) +NV2080_CTRL_DMABUF = (0x3A) +NV2080_CTRL_BIF = (0x3B) +NV2080_CTRL_OS_WINDOWS = (0x3F) +NV2080_CTRL_OS_MACOS = (0x3E) +NV2080_CTRL_OS_UNIX = (0x3D) +NV2080_CTRL_CMD_NULL = (0x20800000) +NV2080_CTRL_BIOS_INFO_MAX_SIZE = (0x0000000F) +NV2080_CTRL_BIOS_INFO_INDEX_REVISION = (0x00000000) +NV2080_CTRL_BIOS_INFO_INDEX_OEM_REVISION = (0x00000001) +NV2080_CTRL_CMD_BIOS_GET_INFO = (0x20800802) +NV2080_CTRL_CMD_BIOS_GET_INFO_V2 = (0x20800810) +NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_BIOS_NBSI_MAX_REG_STRING_LENGTH = (0x00000100) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_ASCII = (0x00000000) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_UNICODE = (0x00000001) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_HASH = (0x00000002) +NV2080_CTRL_BIOS_NBSI_MODULE_ROOT = (0x00000000) +NV2080_CTRL_BIOS_NBSI_MODULE_RM = (0x00000001) +NV2080_CTRL_BIOS_NBSI_MODULE_DISPLAYDRIVER = (0x00000002) +NV2080_CTRL_BIOS_NBSI_MODULE_VIDEO = (0x00000003) +NV2080_CTRL_BIOS_NBSI_MODULE_CPL = (0x00000004) +NV2080_CTRL_BIOS_NBSI_MODULE_D3D = (0x00000005) +NV2080_CTRL_BIOS_NBSI_MODULE_OGL = (0x00000006) +NV2080_CTRL_BIOS_NBSI_MODULE_PMU = (0x00000007) +NV2080_CTRL_BIOS_NBSI_MODULE_MODE = (0x00000008) +NV2080_CTRL_BIOS_NBSI_NUM_MODULES = (0x00000009) +NV2080_CTRL_BIOS_NBSI_MODULE_UNKNOWN = (0x80000000) +NV2080_CTRL_BIOS_GET_NBSI_SUCCESS = (0x00000000) +NV2080_CTRL_BIOS_GET_NBSI_OVERRIDE = (0x00000001) +NV2080_CTRL_BIOS_GET_NBSI_BAD_HASH = (0xFFFFFFFA) +NV2080_CTRL_BIOS_GET_NBSI_APITEST_SUCCESS = (0xFFFFFFFB) +NV2080_CTRL_BIOS_GET_NBSI_BAD_TABLE = (0xFFFFFFFC) +NV2080_CTRL_BIOS_GET_NBSI_NO_TABLE = (0xFFFFFFFD) +NV2080_CTRL_BIOS_GET_NBSI_INCOMPLETE = (0xFFFFFFFE) +NV2080_CTRL_BIOS_GET_NBSI_NOT_FOUND = (0xFFFFFFFF) +NV2080_CTRL_CMD_BIOS_GET_NBSI = (0x20800803) +NV2080_CTRL_BIOS_GET_NBSI_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_BIOS_GET_NBSI_V2 = (0x2080080e) +NV2080_BIOS_GET_NBSI_MAX_RET_SIZE = (0x100) +NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_BIOS_GET_NBSI_OBJ = (0x20800806) +NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS_MESSAGE_ID = (0x6) +GLOB_TYPE_GET_NBSI_DIR = 0xfffe +GLOB_TYPE_APITEST = 0xffff +GLOB_TYPE_GET_NBSI_ACPI_RAW = 0xfffd +NV2080_CTRL_CMD_BIOS_GET_SKU_INFO = (0x20800808) +NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME = (0x20800809) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_BIOS_GET_UEFI_SUPPORT = (0x2080080b) +NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE = (1, 0) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_NO = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_YES = (0x00000001) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_PLACEHOLDER = (0x00000002) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_HIDDEN = (0x00000003) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING = (2, 2) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING_FALSE = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING_TRUE = (0x00000001) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT = (3, 3) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT_FALSE = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT_TRUE = (0x00000001) +NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_BIT_SIZE = 32 +NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_INDEX = lambda _bit: ((_bit) / NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_BIT_SIZE) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_OFFSET = lambda _bit: ((_bit) % NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_BIT_SIZE) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_DATA_SIZE = lambda _bits: (NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_INDEX((_bits) - 1) + 1) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_ARRAY_START_SIZE = 1 +NV2080_CTRL_BOARDOBJGRP_MASK_ARRAY_EXTENSION_SIZE = lambda _bits: (NV2080_CTRL_BOARDOBJGRP_MASK_DATA_SIZE(_bits) - (NV2080_CTRL_BOARDOBJGRP_MASK_ARRAY_START_SIZE)) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E32_FOR_EACH_INDEX = lambda _index,_pMask: NV2080_CTRL_BOARDOBJGRP_MASK_FOR_EACH_INDEX( NV2080_CTRL_BOARDOBJGRP_E32_MAX_OBJECTS,_index,_pMask) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E255_FOR_EACH_INDEX = lambda _index,_pMask: NV2080_CTRL_BOARDOBJGRP_MASK_FOR_EACH_INDEX( NV2080_CTRL_BOARDOBJGRP_E255_MAX_OBJECTS,_index,_pMask) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E512_FOR_EACH_INDEX = lambda _index,_pMask: NV2080_CTRL_BOARDOBJGRP_MASK_FOR_EACH_INDEX( NV2080_CTRL_BOARDOBJGRP_E512_MAX_OBJECTS,_index,_pMask) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E1024_FOR_EACH_INDEX = lambda _index,_pMask: NV2080_CTRL_BOARDOBJGRP_MASK_FOR_EACH_INDEX( NV2080_CTRL_BOARDOBJGRP_E1024_MAX_OBJECTS,_index,_pMask) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E2048_FOR_EACH_INDEX = lambda _index,_pMask: NV2080_CTRL_BOARDOBJGRP_MASK_FOR_EACH_INDEX( NV2080_CTRL_BOARDOBJGRP_E2048_MAX_OBJECTS,_index,_pMask) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E32_INIT = lambda _pMask: NV2080_CTRL_BOARDOBJGRP_MASK_INIT(_pMask, NV2080_CTRL_BOARDOBJGRP_E32_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E255_INIT = lambda _pMask: NV2080_CTRL_BOARDOBJGRP_MASK_INIT(_pMask, NV2080_CTRL_BOARDOBJGRP_E255_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E512_INIT = lambda _pMask: NV2080_CTRL_BOARDOBJGRP_MASK_INIT(_pMask, NV2080_CTRL_BOARDOBJGRP_E512_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E1024_INIT = lambda _pMask: NV2080_CTRL_BOARDOBJGRP_MASK_INIT(_pMask, NV2080_CTRL_BOARDOBJGRP_E1024_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E2048_INIT = lambda _pMask: NV2080_CTRL_BOARDOBJGRP_MASK_INIT(_pMask, NV2080_CTRL_BOARDOBJGRP_E2048_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E32_AND = lambda _pMaskOut,_pMask1,_pMask2: NV2080_CTRL_BOARDOBJGRP_MASK_AND(_pMaskOut, _pMask1, _pMask2, NV2080_CTRL_BOARDOBJGRP_E32_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E255_AND = lambda _pMaskOut,_pMask1,_pMask2: NV2080_CTRL_BOARDOBJGRP_MASK_AND(_pMaskOut, _pMask1, _pMask2, NV2080_CTRL_BOARDOBJGRP_E255_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E512_AND = lambda _pMaskOut,_pMask1,_pMask2: NV2080_CTRL_BOARDOBJGRP_MASK_AND(_pMaskOut, _pMask1, _pMask2, NV2080_CTRL_BOARDOBJGRP_E512_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E1024_AND = lambda _pMaskOut,_pMask1,_pMask2: NV2080_CTRL_BOARDOBJGRP_MASK_AND(_pMaskOut, _pMask1, _pMask2, NV2080_CTRL_BOARDOBJGRP_E1024_MAX_OBJECTS) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E2048_AND = lambda _pMaskOut,_pMask1,_pMask2: NV2080_CTRL_BOARDOBJGRP_MASK_AND(_pMaskOut, _pMask1, _pMask2, NV2080_CTRL_BOARDOBJGRP_E2048_MAX_OBJECTS) # type: ignore +NV2080_CTRL_CMD_BUS_GET_PCI_INFO = (0x20801801) +NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_BUS_INFO_INDEX_TYPE = (0x00000000) +NV2080_CTRL_BUS_INFO_INDEX_INTLINE = (0x00000001) +NV2080_CTRL_BUS_INFO_INDEX_CAPS = (0x00000002) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CAPS = (0x00000003) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_CAPS = (0x00000004) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_LINK_CAPS = (0x00000005) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_DOWNSTREAM_LINK_CAPS = (0x00000006) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CTRL_STATUS = (0x00000007) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_CTRL_STATUS = (0x00000008) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_LINK_CTRL_STATUS = (0x00000009) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_DOWNSTREAM_LINK_CTRL_STATUS = (0x0000000A) +NV2080_CTRL_BUS_INFO_INDEX_COHERENT_DMA_FLAGS = (0x0000000B) +NV2080_CTRL_BUS_INFO_INDEX_NONCOHERENT_DMA_FLAGS = (0x0000000C) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_SIZE = (0x0000000D) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_FLAGS = (0x0000000E) +NV2080_CTRL_BUS_INFO_INDEX_BUS_NUMBER = (0x0000000F) +NV2080_CTRL_BUS_INFO_INDEX_DEVICE_NUMBER = (0x00000010) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_ERRORS = (0x00000011) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_ERRORS = (0x00000012) +NV2080_CTRL_BUS_INFO_INDEX_INTERFACE_TYPE = (0x00000013) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GEN2_INFO = (0x00000014) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_AER = (0x00000015) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_LINK_CAPS = (0x00000016) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_LINK_CTRL_STATUS = (0x00000017) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ASLM_STATUS = (0x00000018) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_LINK_WIDTH_SWITCH_ERROR_COUNT = (0x00000019) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_LINK_SPEED_SWITCH_ERROR_COUNT = (0x0000001A) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_CYA_ASPM = (0x0000001B) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_LINECODE_ERRORS = (0x0000001C) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CRC_ERRORS = (0x0000001D) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NAKS_RECEIVED = (0x0000001E) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FAILED_L0S_EXITS = (0x0000001F) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_LINECODE_ERRORS_CLEAR = (0x00000020) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CRC_ERRORS_CLEAR = (0x00000021) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NAKS_RECEIVED_CLEAR = (0x00000022) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FAILED_L0S_EXITS_CLEAR = (0x00000023) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CORRECTABLE_ERRORS = (0x00000024) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NONFATAL_ERRORS = (0x00000025) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FATAL_ERRORS = (0x00000026) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_UNSUPPORTED_REQUESTS = (0x00000027) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CORRECTABLE_ERRORS_CLEAR = (0x00000028) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NONFATAL_ERRORS_CLEAR = (0x00000029) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FATAL_ERRORS_CLEAR = (0x0000002A) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_UNSUPPORTED_REQUESTS_CLEAR = (0x0000002B) +NV2080_CTRL_BUS_INFO_INDEX_DOMAIN_NUMBER = (0x0000002C) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GEN_INFO = (0x0000002D) +NV2080_CTRL_BUS_INFO_INDEX_GPU_INTERFACE_TYPE = (0x0000002E) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_GEN_INFO = (0x0000002F) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_GEN_INFO = (0x00000030) +NV2080_CTRL_BUS_INFO_INDEX_MSI_INFO = (0x00000031) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_SIZE_HI = (0x00000032) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE = (0x00000033) +NV2080_CTRL_BUS_INFO_INDEX_MAX = NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE +NV2080_CTRL_BUS_INFO_MAX_LIST_SIZE = (0x00000034) +NV2080_CTRL_BUS_INFO_TYPE_PCI = (0x00000001) +NV2080_CTRL_BUS_INFO_TYPE_PCI_EXPRESS = (0x00000003) +NV2080_CTRL_BUS_INFO_TYPE_FPCI = (0x00000004) +NV2080_CTRL_BUS_INFO_TYPE_AXI = (0x00000008) +NV2080_CTRL_BUS_INFO_CAPS_NEED_IO_FLUSH = (0x00000001) +NV2080_CTRL_BUS_INFO_CAPS_CHIP_INTEGRATED = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED = (3, 0) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_WIDTH = (9, 4) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM = (11, 10) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_NONE = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN = (15, 12) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL = (19, 16) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN = (23, 20) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES = (24, 24) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES_ENABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES_DISABLED = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM = (1, 0) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L1 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED = (19, 16) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH = (25, 20) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_UNDEFINED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X1 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X2 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X4 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X8 = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X12 = (0x0000000C) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X16 = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X32 = (0x00000020) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA = (0, 0) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART = (2, 2) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA = (0, 0) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART = (2, 2) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE = (3, 3) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH = (0, 0) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED = (1, 1) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_CORR_ERROR = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_NON_FATAL_ERROR = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_FATAL_ERROR = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_UNSUPP_REQUEST = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_ENTERED_RECOVERY = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_TRAINING_ERR = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_DLINK_PROTO_ERR = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_POISONED_TLP = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_FC_PROTO_ERR = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_CPL_TIMEOUT = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_CPL_ABORT = (0x00000020) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNEXP_CPL = (0x00000040) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_RCVR_OVERFLOW = (0x00000080) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_MALFORMED_TLP = (0x00000100) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_ECRC_ERROR = (0x00000200) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNSUPPORTED_REQ = (0x00000400) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RCV_ERR = (0x00010000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_TLP = (0x00020000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_DLLP = (0x00040000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_ROLLOVER = (0x00080000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_TIMEOUT = (0x00100000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_ADVISORY_NONFATAL = (0x00200000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE_ERROR = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE_PRESENT = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04 = (4, 4) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04_MISSING = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04_PRESENT = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM = (2, 1) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L1 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_MSI_STATUS = (0, 0) +NV2080_CTRL_BUS_INFO_MSI_STATUS_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_MSI_STATUS_ENABLED = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED = (4, 4) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_RESERVED = (7, 5) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PORT_RESTORE_TIME = (15, 8) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_T_POWER_ON_SCALE = (17, 16) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_T_POWER_ON_VALUE = (23, 19) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_COMMON_MODE_RESTORE_TIME = (15, 8) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_LTR_L1_2_THRESHOLD_VALUE = (25, 16) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_LTR_L1_2_THRESHOLD_SCALE = (31, 29) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL2_T_POWER_ON_SCALE = (1, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL2_T_POWER_ON_VALUE = (7, 3) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_PCIE = (0x00000000) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_NVLINK = (0x00000001) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_C2C = (0x00000002) +NV2080_CTRL_CMD_BUS_GET_INFO = (0x20801802) +NV2080_CTRL_BUS_GET_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_BUS_GET_INFO_V2 = (0x20801823) +NV2080_CTRL_BUS_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_BUS_GET_PCI_BAR_INFO = (0x20801803) +NV2080_CTRL_BUS_MAX_PCI_BARS = (8) +NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_BUS_SET_PCIE_LINK_WIDTH = (0x20801804) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_PSTATE = (0x00000001) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_PCIE_CFG_ACCESS = (0x00000002) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_TRAINING = (0x00000004) +NV2080_CTRL_CMD_BUS_SET_PCIE_SPEED = (0x20801805) +NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_BUS_SET_PCIE_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_SET_PCIE_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_SET_PCIE_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_SET_PCIE_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_SET_PCIE_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_SET_PCIE_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_CMD_BUS_MAP_BAR2 = (0x20801809) +NV2080_CTRL_BUS_MAP_BAR2_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_BUS_UNMAP_BAR2 = (0x2080180a) +NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_BUS_VERIFY_BAR2 = (0x2080180b) +NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_BUS_SERVICE_GPU_MULTIFUNC_STATE = (0x20801812) +NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_BUS_ENABLE_GPU_MULTIFUNC_STATE = (0x00000000) +NV2080_CTRL_BUS_DISABLE_GPU_MULTIFUNC_STATE = (0x00000001) +NV2080_CTRL_BUS_GET_GPU_MULTIFUNC_STATE = (0x00000002) +NV2080_CTRL_CMD_BUS_GET_PEX_COUNTERS = (0x20801813) +NV2080_CTRL_PEX_MAX_COUNTER_TYPES = 31 +NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_BUS_PEX_COUNTER_TYPE = 0x00000000 +NV2080_CTRL_BUS_PEX_COUNTER_RECEIVER_ERRORS = 0x00000001 +NV2080_CTRL_BUS_PEX_COUNTER_REPLAY_COUNT = 0x00000002 +NV2080_CTRL_BUS_PEX_COUNTER_REPLAY_ROLLOVER_COUNT = 0x00000004 +NV2080_CTRL_BUS_PEX_COUNTER_BAD_DLLP_COUNT = 0x00000008 +NV2080_CTRL_BUS_PEX_COUNTER_BAD_TLP_COUNT = 0x00000010 +NV2080_CTRL_BUS_PEX_COUNTER_8B10B_ERRORS_COUNT = 0x00000020 +NV2080_CTRL_BUS_PEX_COUNTER_SYNC_HEADER_ERRORS_COUNT = 0x00000040 +NV2080_CTRL_BUS_PEX_COUNTER_LCRC_ERRORS_COUNT = 0x00000080 +NV2080_CTRL_BUS_PEX_COUNTER_FAILED_L0S_EXITS_COUNT = 0x00000100 +NV2080_CTRL_BUS_PEX_COUNTER_NAKS_SENT_COUNT = 0x00000200 +NV2080_CTRL_BUS_PEX_COUNTER_NAKS_RCVD_COUNT = 0x00000400 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_ERRORS = 0x00000800 +NV2080_CTRL_BUS_PEX_COUNTER_L1_TO_RECOVERY_COUNT = 0x00001000 +NV2080_CTRL_BUS_PEX_COUNTER_L0_TO_RECOVERY_COUNT = 0x00002000 +NV2080_CTRL_BUS_PEX_COUNTER_RECOVERY_COUNT = 0x00004000 +NV2080_CTRL_BUS_PEX_COUNTER_CHIPSET_XMIT_L0S_ENTRY_COUNT = 0x00008000 +NV2080_CTRL_BUS_PEX_COUNTER_GPU_XMIT_L0S_ENTRY_COUNT = 0x00010000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_ENTRY_COUNT = 0x00020000 +NV2080_CTRL_BUS_PEX_COUNTER_L1P_ENTRY_COUNT = 0x00040000 +NV2080_CTRL_BUS_PEX_COUNTER_DEEP_L1_ENTRY_COUNT = 0x00080000 +NV2080_CTRL_BUS_PEX_COUNTER_ASLM_COUNT = 0x00100000 +NV2080_CTRL_BUS_PEX_COUNTER_TOTAL_CORR_ERROR_COUNT = 0x00200000 +NV2080_CTRL_BUS_PEX_COUNTER_CORR_ERROR_COUNT = 0x00400000 +NV2080_CTRL_BUS_PEX_COUNTER_NON_FATAL_ERROR_COUNT = 0x00800000 +NV2080_CTRL_BUS_PEX_COUNTER_FATAL_ERROR_COUNT = 0x01000000 +NV2080_CTRL_BUS_PEX_COUNTER_UNSUPP_REQ_COUNT = 0x02000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_1_ENTRY_COUNT = 0x04000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_2_ENTRY_COUNT = 0x08000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_2_ABORT_COUNT = 0x10000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1SS_TO_DEEP_L1_TIMEOUT_COUNT = 0x20000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_SHORT_DURATION_COUNT = 0x40000000 +NV2080_CTRL_CMD_BUS_CLEAR_PEX_COUNTERS = (0x20801814) +NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_BUS_FREEZE_PEX_COUNTERS = (0x20801815) +NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS = (0x20801816) +NV2080_CTRL_PEX_MAX_LANES = 16 +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_BUS_PEX_COUNTER_LANE_TYPE = 0x00000000 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SYNC_HDR_CODING_ERR = 0x00000001 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SYNC_HDR_ORDER_ERR = 0x00000002 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_OS_DATA_SEQ_ERR = 0x00000004 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_TSX_DATA_SEQ_ERR = 0x00000008 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SKPOS_LFSR_ERR = 0x00000010 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RX_CLK_FIFO_OVERFLOW = 0x00000020 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_ELASTIC_FIFO_OVERFLOW = 0x00000040 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RCVD_LINK_NUM_ERR = 0x00000080 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RCVD_LANE_NUM_ERR = 0x00000100 +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY = (0x20801817) +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS_MESSAGE_ID = (0x17) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY = (0x20801818) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_BYTES = 0x00000001 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_BYTES = 0x00000002 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_L0 = 0x00000004 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_L0 = 0x00000008 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_L0S = 0x00000010 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_L0S = 0x00000020 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_NON_L0_L0S = 0x00000040 +NV2080_CTRL_PEX_UTIL_MAX_COUNTER_TYPES = 7 +NV2080_CTRL_CMD_BUS_GET_PEX_UTIL_COUNTERS = (0x20801819) +NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_CMD_BUS_CLEAR_PEX_UTIL_COUNTERS = (0x20801820) +NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_BUS_GET_BFD = (0x20801821) +NV2080_CTRL_BUS_GET_BFD_PARAMSARR_MESSAGE_ID = (0x21) +NV2080_CTRL_ASPM_DISABLE_FLAGS_L1_MASK_REGKEY_OVERRIDE = 0x00000000 +NV2080_CTRL_ASPM_DISABLE_FLAGS_OS_RM_MAKES_POLICY_DECISIONS = 0x00000001 +NV2080_CTRL_ASPM_DISABLE_FLAGS_GPU_BEHIND_BRIDGE = 0x00000002 +NV2080_CTRL_ASPM_DISABLE_FLAGS_GPU_UPSTREAM_PORT_L1_UNSUPPORTED = 0x00000003 +NV2080_CTRL_ASPM_DISABLE_FLAGS_GPU_UPSTREAM_PORT_L1_POR_SUPPORTED = 0x00000004 +NV2080_CTRL_ASPM_DISABLE_FLAGS_GPU_UPSTREAM_PORT_L1_POR_MOBILE_ONLY = 0x00000005 +NV2080_CTRL_ASPM_DISABLE_FLAGS_CL_ASPM_L1_CHIPSET_DISABLED = 0x00000006 +NV2080_CTRL_ASPM_DISABLE_FLAGS_CL_ASPM_L1_CHIPSET_ENABLED_MOBILE_ONLY = 0x00000007 +NV2080_CTRL_ASPM_DISABLE_FLAGS_BIF_ENABLE_ASPM_DT_L1 = 0x00000008 +NV2080_CTRL_ASPM_DISABLE_FLAGS_MAX_FLAGS = 9 +NV2080_CTRL_CMD_BUS_GET_ASPM_DISABLE_FLAGS = (0x20801822) +NV2080_CTRL_BUS_GET_ASPM_DISABLE_FLAGS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS = (0x20801824) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_BUS_GET_NVLINK_PEER_ID_MASK = (0x20801825) +NV2080_CTRL_BUS_MAX_NUM_GPUS = 32 +NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS = (0x20801826) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE = (0x20801827) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_BUS_GET_EOM_STATUS = (0x20801828) +NV2080_CTRL_BUS_MAX_NUM_LANES = 32 +NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS = (0x20801829) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_SYSMEM = 0x0 +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_GPU = 0x1 +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_P2P = 0x2 +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32 = (0, 0) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64 = (1, 1) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32 = (2, 2) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64 = (3, 3) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32 = (4, 4) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64 = (5, 5) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128 = (6, 6) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS = (0x2080182a) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IADD = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IMIN = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IMAX = 2 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_INC = 3 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_DEC = 4 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IAND = 5 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IOR = 6 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IXOR = 7 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_EXCH = 8 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_CAS = 9 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FADD = 10 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FMIN = 11 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FMAX = 12 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_COUNT = 13 +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR = (0, 0) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR = (1, 1) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION = (2, 2) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32 = (3, 3) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64 = (4, 4) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128 = (5, 5) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED = (6, 6) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED = (7, 7) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED_NO = 0 +NV2080_CTRL_CMD_BUS_GET_C2C_INFO = (0x2080182b) +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_BUS_GET_C2C_INFO_REMOTE_TYPE_CPU = 1 +NV2080_CTRL_BUS_GET_C2C_INFO_REMOTE_TYPE_GPU = 2 +NV2080_CTRL_CMD_BUS_SYSMEM_ACCESS = (0x2080182c) +NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_BUS_GET_C2C_ERR_INFO = (0x2080182d) +NV2080_CTRL_BUS_GET_C2C_ERR_INFO_MAX_NUM_C2C_INSTANCES = 2 +NV2080_CTRL_BUS_GET_C2C_ERR_INFO_MAX_C2C_LINKS_PER_INSTANCE = 7 +NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING = (0x2080182e) +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_INVALID = 0 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_NVLINK = 1 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_PCIE = 2 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_PCIE_BAR1 = 3 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_C2C = 4 +NV2080_SET_P2P_MAPPING_UUID_LEN = 16 +NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_MESSAGE_ID = (0x2E) +NV2080_CTRL_CMD_BUS_UNSET_P2P_MAPPING = (0x2080182f) +NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS = (0x20801830) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32 = (0, 0) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64 = (1, 1) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32 = (2, 2) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64 = (3, 3) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32 = (4, 4) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64 = (5, 5) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128 = (6, 6) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS = (0x20801831) +NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_BUS_GET_C2C_STATE_FULL_POWER = 0x0 +NV2080_CTRL_CMD_BUS_GET_C2C_STATE_CL3 = 0x1 +NV2080_CTRL_CMD_BUS_GET_C2C_STATE_CL4 = 0x2 +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE = (0x20801832) +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS_MESSAGE_ID = (0x32) +NV2080_CTRL_CMD_CE_GET_CAPS = (0x20802a01) +NV2080_CTRL_CE_CAPS_TBL_SIZE = 2 +NV2080_CTRL_CE_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_CE_GET_CAPS_V2 = (0x20802a03) +NV2080_CTRL_CE_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_CE_GET_CE_PCE_MASK = (0x20802a02) +NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_CE_SET_PCE_LCE_CONFIG = (0x20802a04) +NV2080_CTRL_MAX_PCES = 32 +NV2080_CTRL_MAX_GRCES = 4 +NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_CE_UPDATE_PCE_LCE_MAPPINGS = (0x20802a05) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_INVALID_LCE = 0xf +NV2080_CTRL_CMD_CE_UPDATE_CLASS_DB = (0x20802a06) +NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_CE_GET_PHYSICAL_CAPS = (0x20802a07) +NV2080_CTRL_CE_GET_PHYSICAL_CAPS_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_CE_GET_FAULT_METHOD_BUFFER_SIZE = (0x20802a08) +NV2080_CTRL_CMD_CE_GET_HUB_PCE_MASK = (0x20802a09) +NV2080_CTRL_CE_MAX_HSHUBS = 32 +NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_CE_GET_ALL_CAPS = (0x20802a0a) +NV2080_CTRL_MAX_CES = 64 +NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS_MESSAGE_ID = (0xa) +NV2080_CTRL_CMD_CE_GET_ALL_PHYSICAL_CAPS = (0x20802a0b) +NV2080_CTRL_CE_GET_ALL_PHYSICAL_CAPS_PARAMS_MESSAGE_ID = (0xb) +NV2080_CTRL_CMD_CE_GET_LCE_SHIM_INFO = (0x20802a0c) +NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS_MESSAGE_ID = (0xc) +NV2080_CTRL_CMD_CE_UPDATE_PCE_LCE_MAPPINGS_V2 = (0x20802a0d) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS_MESSAGE_ID = (0xd) +NV2080_CTRL_CMD_CE_GET_HUB_PCE_MASK_V2 = (0x20802a0e) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS_MESSAGE_ID = (0xe) +NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE = (0x20802a0f) +NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS_MESSAGE_ID = (0xf) +NV2080_CTRL_CMD_CE_GET_DECOMP_LCE_MASK = (0x20802a11) +NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_CE_IS_DECOMP_LCE_ENABLED = (0x20802a12) +NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CLK_DOMAIN_TEGRA_UNDEFINED = (0x00000000) +NV2080_CTRL_CLK_DOMAIN_TEGRA_GPCCLK = (0x00000001) +NV2080_CTRL_CLK_DOMAIN_TEGRA_NVDCLK = (0x00000002) +NV2080_CTRL_CMD_DMA_INVALIDATE_TLB = (0x20802502) +NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS = (0, 0) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO = (1, 1) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY = (2, 2) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE = (3, 3) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB = (4, 4) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV = (5, 5) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG = (6, 6) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD = (7, 7) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION = (8, 8) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON = (9, 9) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS = (10, 10) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR = (11, 11) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR_TRUE = (0x00000001) +NV2080_CTRL_DMA_INFO_INDEX_SYSTEM_ADDRESS_SIZE = (0x000000000) +NV2080_CTRL_DMA_INFO_INDEX_MAX = NV2080_CTRL_DMA_INFO_INDEX_SYSTEM_ADDRESS_SIZE +NV2080_CTRL_CMD_DMA_GET_INFO = (0x20802503) +NV2080_CTRL_DMA_GET_INFO_MAX_ENTRIES = (256) +NV2080_CTRL_DMA_GET_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_DMABUF_EXPORT_OBJECTS_TO_FD = (0x20803a01) +NV2080_CTRL_DMABUF_MAX_HANDLES = 128 +NV2080_CTRL_DMABUF_EXPORT_MAPPING_TYPE_DEFAULT = (0x00000000) +NV2080_CTRL_DMABUF_EXPORT_MAPPING_TYPE_FORCE_PCIE = (0x00000001) +NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_ECC_GET_CLIENT_EXPOSED_COUNTERS = (0x20803400) +NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS_MESSAGE_ID = (0x0) +NV2080_CTRL_CMD_ECC_GET_VOLATILE_COUNTS = (0x20803401) +NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_MAX_COUNT = 600 +NV2080_CTRL_CMD_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS = (0x20803402) +NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_ECC_ERROR_TYPE_CORRECTED = 0 +NV2080_CTRL_ECC_ERROR_TYPE_UNCORRECTED = 1 +NV2080_CTRL_CMD_ECC_INJECT_ERROR = (0x20803403) +NV2080_CTRL_ECC_INJECT_ERROR_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_ECC_GET_REPAIR_STATUS = (0x20803404) +NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_EVENT_SET_NOTIFICATION = (0x20800301) +NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_DISABLE = (0x00000000) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_SINGLE = (0x00000001) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_REPEAT = (0x00000002) +NV2080_EVENT_DSTATE_XUSB_D0 = (0x00000000) +NV2080_EVENT_DSTATE_XUSB_D3 = (0x00000003) +NV2080_EVENT_DSTATE_XUSB_INVALID = (0xFFFFFFFF) +NV2080_EVENT_DSTATE_PPC_D0 = (0x00000000) +NV2080_EVENT_DSTATE_PPC_D3 = (0x00000003) +NV2080_EVENT_DSTATE_PPC_INVALID = (0xFFFFFFFF) +NV2080_CTRL_CMD_EVENT_SET_TRIGGER = (0x20800302) +NV2080_CTRL_CMD_EVENT_SET_MEMORY_NOTIFIES = (0x20800303) +NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS_MESSAGE_ID = (0x3) +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_NOTIFIED = 0 +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_PENDING = 1 +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_ERROR = 2 +NV2080_CTRL_CMD_EVENT_SET_SEMAPHORE_MEMORY = (0x20800304) +NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_EVENT_SET_GUEST_MSI = (0x20800305) +NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_EVENT_SET_SEMA_MEM_VALIDATION = (0x20800306) +NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_EVENT_SET_TRIGGER_FIFO = (0x20800308) +NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_EVENT_VIDEO_BIND_EVTBUF = (0x20800309) +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_EVENT_RATS_GSP_TRACE_BIND_EVTBUF = (0x2080030a) +NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_FB_INFO_INDEX_TILE_REGION_COUNT = (0x00000000) +NV2080_CTRL_FB_INFO_INDEX_COMPRESSION_SIZE = (0x00000001) +NV2080_CTRL_FB_INFO_INDEX_DRAM_PAGE_STRIDE = (0x00000002) +NV2080_CTRL_FB_INFO_INDEX_TILE_REGION_FREE_COUNT = (0x00000003) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_COUNT = (0x00000004) +NV2080_CTRL_FB_INFO_INDEX_BAR1_SIZE = (0x00000005) +NV2080_CTRL_FB_INFO_INDEX_BANK_SWIZZLE_ALIGNMENT = (0x00000006) +NV2080_CTRL_FB_INFO_INDEX_RAM_SIZE = (0x00000007) +NV2080_CTRL_FB_INFO_INDEX_TOTAL_RAM_SIZE = (0x00000008) +NV2080_CTRL_FB_INFO_INDEX_HEAP_SIZE = (0x00000009) +NV2080_CTRL_FB_INFO_INDEX_MAPPABLE_HEAP_SIZE = (0x0000000A) +NV2080_CTRL_FB_INFO_INDEX_BUS_WIDTH = (0x0000000B) +NV2080_CTRL_FB_INFO_INDEX_RAM_CFG = (0x0000000C) +NV2080_CTRL_FB_INFO_INDEX_RAM_TYPE = (0x0000000D) +NV2080_CTRL_FB_INFO_INDEX_BANK_COUNT = (0x0000000E) +NV2080_CTRL_FB_INFO_INDEX_OVERLAY_OFFSET_ADJUSTMENT = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_SPACE_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_HEAP_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_MAPPBLE_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_EFFECTIVE_BW = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_FB_TAX_SIZE_KB = (0x00000010) +NV2080_CTRL_FB_INFO_INDEX_HEAP_BASE_KB = (0x00000011) +NV2080_CTRL_FB_INFO_INDEX_LARGEST_FREE_REGION_SIZE_KB = (0x00000012) +NV2080_CTRL_FB_INFO_INDEX_LARGEST_FREE_REGION_BASE_KB = (0x00000013) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK = (0x00000014) +NV2080_CTRL_FB_INFO_INDEX_VISTA_RESERVED_HEAP_SIZE = (0x00000015) +NV2080_CTRL_FB_INFO_INDEX_HEAP_FREE = (0x00000016) +NV2080_CTRL_FB_INFO_INDEX_RAM_LOCATION = (0x00000017) +NV2080_CTRL_FB_INFO_INDEX_FB_IS_BROKEN = (0x00000018) +NV2080_CTRL_FB_INFO_INDEX_FBP_COUNT = (0x00000019) +NV2080_CTRL_FB_INFO_INDEX_FBP_MASK = (0x0000001A) +NV2080_CTRL_FB_INFO_INDEX_L2CACHE_SIZE = (0x0000001B) +NV2080_CTRL_FB_INFO_INDEX_MEMORYINFO_VENDOR_ID = (0x0000001C) +NV2080_CTRL_FB_INFO_INDEX_BAR1_AVAIL_SIZE = (0x0000001D) +NV2080_CTRL_FB_INFO_INDEX_HEAP_START = (0x0000001E) +NV2080_CTRL_FB_INFO_INDEX_BAR1_MAX_CONTIGUOUS_AVAIL_SIZE = (0x0000001F) +NV2080_CTRL_FB_INFO_INDEX_USABLE_RAM_SIZE = (0x00000020) +NV2080_CTRL_FB_INFO_INDEX_TRAINIG_2T = (0x00000021) +NV2080_CTRL_FB_INFO_INDEX_LTC_COUNT = (0x00000022) +NV2080_CTRL_FB_INFO_INDEX_LTS_COUNT = (0x00000023) +NV2080_CTRL_FB_INFO_INDEX_L2CACHE_ONLY_MODE = (0x00000024) +NV2080_CTRL_FB_INFO_INDEX_PSEUDO_CHANNEL_MODE = (0x00000025) +NV2080_CTRL_FB_INFO_INDEX_SMOOTHDISP_RSVD_BAR1_SIZE = (0x00000026) +NV2080_CTRL_FB_INFO_INDEX_HEAP_OFFLINE_SIZE = (0x00000027) +NV2080_CTRL_FB_INFO_INDEX_1TO1_COMPTAG_ENABLED = (0x00000028) +NV2080_CTRL_FB_INFO_INDEX_SUSPEND_RESUME_RSVD_SIZE = (0x00000029) +NV2080_CTRL_FB_INFO_INDEX_ALLOW_PAGE_RETIREMENT = (0x0000002A) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK = (0x0000002B) +NV2080_CTRL_FB_INFO_POISON_FUSE_ENABLED = (0x0000002C) +NV2080_CTRL_FB_INFO_FBPA_ECC_ENABLED = (0x0000002D) +NV2080_CTRL_FB_INFO_DYNAMIC_PAGE_OFFLINING_ENABLED = (0x0000002E) +NV2080_CTRL_FB_INFO_INDEX_FORCED_BAR1_64KB_MAPPING_ENABLED = (0x0000002F) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_SIZE = (0x00000030) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_ALIGNMENT = (0x00000031) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_BAR1_MAX_OFFSET_64KB = (0x00000032) +NV2080_CTRL_FB_INFO_INDEX_PROTECTED_MEM_SIZE_TOTAL_KB = (0x00000033) +NV2080_CTRL_FB_INFO_INDEX_PROTECTED_MEM_SIZE_FREE_KB = (0x00000034) +NV2080_CTRL_FB_INFO_INDEX_ECC_STATUS_SIZE = (0x00000035) +NV2080_CTRL_FB_INFO_INDEX_IS_ZERO_FB = (0x00000036) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK_0 = (NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK_1 = (0x00000037) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_0 = (NV2080_CTRL_FB_INFO_INDEX_LTC_MASK) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_1 = (0x00000038) +NV2080_CTRL_FB_INFO_INDEX_ACCESS_COUNTER_BUFFER_COUNT = (0x00000039) +NV2080_CTRL_FB_INFO_INDEX_COHERENCE_INFO = (0x0000003A) +NV2080_CTRL_FB_INFO_INDEX_NUMA_NODE_ID = (0x0000003B) +NV2080_CTRL_FB_INFO_INDEX_MAX = NV2080_CTRL_FB_INFO_INDEX_NUMA_NODE_ID +NV2080_CTRL_FB_INFO_MAX_LIST_SIZE = (0x00000080) +NV2080_CTRL_FB_INFO_RAM_TYPE_UNKNOWN = (0x00000000) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDRAM = (0x00000001) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR1 = (0x00000002) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR2 = (0x00000003) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR2 = NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR2 +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR2 = (0x00000004) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR3 = (0x00000005) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR4 = (0x00000006) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR3 = (0x00000007) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR3 = NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR3 +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR5 = (0x00000008) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR2 = (0x00000009) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR4 = (0x0000000C) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR4 = (0x0000000D) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM1 = (0x0000000E) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM2 = (0x0000000F) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR5X = (0x00000010) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR6 = (0x00000011) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR6X = (0x00000012) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR5 = (0x00000013) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM3 = (0x00000014) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR7 = (0x00000015) +NV2080_CTRL_FB_INFO_RAM_LOCATION_GPU_DEDICATED = (0x00000000) +NV2080_CTRL_FB_INFO_RAM_LOCATION_SYS_SHARED = (0x00000001) +NV2080_CTRL_FB_INFO_RAM_LOCATION_SYS_DEDICATED = (0x00000002) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_SAMSUNG = (0x00000001) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_QIMONDA = (0x00000002) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ELPIDA = (0x00000003) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ETRON = (0x00000004) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_NANYA = (0x00000005) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_HYNIX = (0x00000006) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_MOSEL = (0x00000007) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_WINBOND = (0x00000008) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ESMT = (0x00000009) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_MICRON = (0x0000000F) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_UNKNOWN = (0xFFFFFFFF) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_UNSUPPORTED = (0x00000000) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_DISABLED = (0x00000001) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_ENABLED = (0x00000002) +NV2080_CTRL_FB_INFO_INDEX_COHERENCE_INFO_NON_FULLY_COHERENT = (0x00000000) +NV2080_CTRL_FB_INFO_INDEX_COHERENCE_INFO_FULLY_COHERENT = (0x00000001) +NV2080_CTRL_CMD_FB_GET_INFO = (0x20801301) +NV2080_CTRL_FB_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_FB_GET_INFO_V2 = (0x20801303) +NV2080_CTRL_FB_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_FB_GET_BAR1_OFFSET = (0x20801310) +NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_CMD_FB_GET_CALIBRATION_LOCK_FAILED = (0x2080130c) +NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_FB_GET_CAL_FLAG_NONE = (0x00000000) +NV2080_CTRL_CMD_FB_GET_CAL_FLAG_RESET = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL = (0x2080130d) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK = (0, 0) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE = (1, 1) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH = (2, 2) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE = (0x2080130e) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_MAX_ADDRESSES = 500 +NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE = (1, 0) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_VIDEO_MEMORY = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_SYSTEM_MEMORY = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_PEER_MEMORY = (0x00000002) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK = (2, 2) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK_YES = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE = (3, 3) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE_YES = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE = (4, 4) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE_ADDRESS_ARRAY = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE_FULL_CACHE = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH = (5, 5) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH_YES = (0x00000001) +NV2080_CTRL_CMD_FB_IS_KIND = (0x20801313) +NV2080_CTRL_FB_IS_KIND_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_FB_IS_KIND_OPERATION_SUPPORTED = (0x00000000) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE = (0x00000001) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_1 = (0x00000002) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_2 = (0x00000003) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_4 = (0x00000004) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC = (0x00000005) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_1 = (0x00000006) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_2 = (0x00000007) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_4 = (0x00000008) +NV2080_CTRL_CMD_FB_GET_GPU_CACHE_INFO = (0x20801315) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_POWER_STATE_ENABLED = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_POWER_STATE_DISABLED = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_WRITE_MODE_WRITETHROUGH = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_WRITE_MODE_WRITEBACK = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_BYPASS_MODE_DISABLED = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_BYPASS_MODE_ENABLED = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_FULL = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_TRANSITIONING = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_REDUCED = (0x00000002) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_ZERO_CACHE = (0x00000003) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO = (0x20801320) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_MEM_TYPES = 18 +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_MAX_ENTRIES = 16 +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FB_OFFLINE_PAGES = (0x20801321) +NV2080_CTRL_FB_OFFLINED_PAGES_MAX_PAGES = (0x00000040) +NV2080_CTRL_FB_OFFLINED_PAGES_INVALID_ADDRESS = (0xffffffffffffffff) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_4K = (0x00000000) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_64K = (0x00000001) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_128K = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_MULTIPLE_SBE = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_DBE = (0x00000004) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_OK = (0x00000000) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_PENDING_RETIREMENT = (0x00000001) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_BLACKLISTING_FAILED = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_TABLE_FULL = (0x00000003) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_INTERNAL_ERROR = (0x00000004) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_MULTIPLE_SBE = NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_MULTIPLE_SBE +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DBE = NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_DBE +NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_FB_GET_OFFLINED_PAGES = (0x20801322) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE = (0, 0) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE_FALSE = 0 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE_TRUE = 1 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE = (1, 1) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE_FALSE = 0 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE_TRUE = 1 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION = (0x20801325) +NV2080_CTRL_CMD_FB_ACR_CLIENT_ID = 2 +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_FB_CLEAR_OFFLINED_PAGES = (0x20801326) +NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO = (0x20801327) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_FB_GET_LTC_INFO_FOR_FBP = (0x20801328) +NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT = (0x20801329) +NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS = (0x2080132a) +NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS = (0x2080132b) +NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB = (0x2080132c) +NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB = (0x2080132d) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1 = (0x20801335) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF = (0x20801336) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_FB_CBC_OP = (0x20801337) +NV2080_CTRL_CMD_FB_CBC_OP_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_FB_GET_CTAGS_FOR_CBC_EVICTION = (0x20801338) +NV2080_MAX_CTAGS_FOR_CBC_EVICTION = 0x7F +NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE = (0x20801339) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_FB_FREE_TILE = (0x2080133a) +NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION = (0x2080133b) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS_MESSAGE_ID = (0x3B) +NV2080_CTRL_CMD_FB_GET_CLI_MANAGED_OFFLINED_PAGES = (0x2080133c) +NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x3C) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO = (0x2080133d) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS_MESSAGE_ID = (0x3D) +NV2080_CTRL_CMD_FB_SET_RRD = (0x2080133e) +NV2080_CTRL_FB_SET_RRD_PARAMS_MESSAGE_ID = (0x3E) +NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE = (0xff) +NV2080_CTRL_CMD_FB_SET_READ_LIMIT = (0x2080133f) +NV2080_CTRL_FB_SET_READ_LIMIT_RESET_VALUE = NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE +NV2080_CTRL_FB_SET_READ_LIMIT_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_FB_SET_WRITE_LIMIT = (0x20801340) +NV2080_CTRL_FB_SET_WRITE_LIMIT_RESET_VALUE = NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE +NV2080_CTRL_FB_SET_WRITE_LIMIT_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_FB_PATCH_PBR_FOR_MINING = (0x20801341) +NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_CMD_FB_GET_MEM_ALIGNMENT = (0x20801342) +NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR = (0x20801343) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING = (0, 0) +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_FALSE = 0 +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_TRUE = 1 +NV2080_CTRL_FB_REMAPPED_ROW_SOURCE_SBE_FIELD = (0x00000002) +NV2080_CTRL_FB_REMAPPED_ROW_SOURCE_DBE_FIELD = (0x00000003) +NV2080_CTRL_FB_REMAPPED_ROWS_MAX_ROWS = (0x00000200) +NV2080_CTRL_CMD_FB_GET_REMAPPED_ROWS = (0x20801344) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING_FALSE = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_FALSE +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING_TRUE = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_TRUE +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE = (1, 1) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE_FALSE = 0 +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE_TRUE = 1 +NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_FB_FS_INFO_MAX_QUERY_SIZE = 24 +NV2080_CTRL_FB_FS_INFO_INVALID_QUERY = 0x0 +NV2080_CTRL_FB_FS_INFO_FBP_MASK = 0x1 +NV2080_CTRL_FB_FS_INFO_LTC_MASK = 0x2 +NV2080_CTRL_FB_FS_INFO_LTS_MASK = 0x3 +NV2080_CTRL_FB_FS_INFO_FBPA_MASK = 0x4 +NV2080_CTRL_FB_FS_INFO_ROP_MASK = 0x5 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK = 0x6 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK = 0x7 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK = 0x8 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK = 0x9 +NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK = 0xA +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK = 0xB +NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP = 0xC +NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK = 0xD +NV2080_CTRL_FB_FS_INFO_PAC_MASK = 0xE +NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK = 0xF +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK = 0x10 +NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK = 0x11 +NV2080_CTRL_FB_FS_INFO_SYS_MASK = 0x12 +NV2080_CTRL_FB_FS_INFO_MAX_QUERIES = 120 +NV2080_CTRL_FB_GET_FS_INFO_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_CMD_FB_GET_FS_INFO = (0x20801346) +NV2080_CTRL_FB_HISTOGRAM_IDX_NO_REMAPPED_ROWS = (0x0) +NV2080_CTRL_FB_HISTOGRAM_IDX_SINGLE_REMAPPED_ROW = (0x1) +NV2080_CTRL_FB_HISTOGRAM_IDX_MIXED_REMAPPED_REMAINING_ROWS = (0x2) +NV2080_CTRL_FB_HISTOGRAM_IDX_SINGLE_REMAINING_ROW = (0x3) +NV2080_CTRL_FB_HISTOGRAM_IDX_MAX_REMAPPED_ROWS = (0x4) +NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_FB_GET_ROW_REMAPPER_HISTOGRAM = (0x20801347) +NV2080_CTRL_CMD_FB_GET_DYNAMIC_OFFLINED_PAGES = (0x20801348) +NV2080_CTRL_FB_DYNAMIC_BLACKLIST_MAX_PAGES = 512 +NV2080_CTRL_FB_DYNAMIC_BLACKLIST_MAX_ENTRIES = 64 +NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x48) +NV2080_CTRL_FB_DYNAMIC_BLACKLISTED_PAGES_SOURCE_INVALID = (0x00000000) +NV2080_CTRL_FB_DYNAMIC_BLACKLISTED_PAGES_SOURCE_DPR_DBE = (0x00000001) +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO = (0x20801349) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE = (4, 0) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE_SYSMEM = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE_VIDMEM = 1 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED = (5, 5) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED_FALSE = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED_TRUE = 1 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER = (6, 6) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER_FALSE = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER_TRUE = 1 +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS_MESSAGE_ID = (0x49) +NV2080_CTRL_CMD_FB_UPDATE_NUMA_STATUS = (0x20801350) +NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_FB_GET_NUMA_INFO = (0x20801351) +NV2080_CTRL_FB_NUMA_INFO_MAX_OFFLINE_ADDRESSES = 64 +NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_CMD_FB_GET_SEMAPHORE_SURFACE_LAYOUT = (0x20801352) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_CAPS_MONITORED_FENCE_SUPPORTED = (0x00000001) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_CAPS_64BIT_SEMAPHORES_SUPPORTED = (0x00000002) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS_MESSAGE_ID = (0x52) +NV2080_CTRL_CMD_GMMU_COMMIT_TLB_INVALIDATE = (0x20801353) +NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_FB_STATS_MAX_OWNER = 200 +NV2080_CTRL_CMD_FB_STATS_GET = (0x2080132a) +NV2080_CTRL_CMD_FB_STATS_GET_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_CMD_FB_GET_STATIC_BAR1_INFO = (0x20801354) +NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION = (0x20801355) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_DISABLED = (0x00000000) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_ENABLED = (0x00000001) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_CMD_FB_SET_DRAM_ENCRYPTION_CONFIGURATION = (0x20801356) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_DISABLE = (0x00000000) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_ENABLE = (0x00000001) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT = (0x20801357) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT_DISABLED = (0x00000000) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT_ENABLED = (0x00000001) +NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS_MESSAGE_ID = (0x57) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS = (0x20801358) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS_DISABLED = (0x00000000) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS_ENABLED = (0x00000001) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS_MESSAGE_ID = (0x58) +NV2080_CTRL_CMD_FB_GET_MEMORY_BOOT_TRAINING_FLAGS = (0x20801359) +NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS_MESSAGE_ID = (0x59) +NV2080_CTRL_CMD_FB_GET_CARVEOUT_REGION_INFO = (0x20801360) +NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_MAX_ENTRIES = 8 +NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS_MESSAGE_ID = (0x60) +NV2080_CTRL_CMD_SET_GPFIFO = (0x20801102) +NV2080_CTRL_CMD_SET_GPFIFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_FIFO_BIND_ENGINES_MAX_CHANNELS = (16) +NV2080_CTRL_FIFO_BIND_ENGINES_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_FIFO_BIND_ENGINES = (0x20801103) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES = (0x20801104) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_FLAGS_ERROR_ON_STUCK_SEMAPHORE = (0, 0) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_FLAGS_ERROR_ON_STUCK_SEMAPHORE_FALSE = (0x00000000) +NV2080_CTRL_CMD_SET_OPERATIONAL_PROPERTIES_FLAGS_ERROR_ON_STUCK_SEMAPHORE_TRUE = (0x00000001) +NV2080_CTRL_CMD_FIFO_GET_PHYSICAL_CHANNEL_COUNT = (0x20801108) +NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_FIFO_INFO_INDEX_INSTANCE_TOTAL = (0x000000000) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNEL_GROUPS = (0x000000001) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNELS_PER_GROUP = (0x000000002) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_SUBCONTEXT_PER_GROUP = (0x000000003) +NV2080_CTRL_FIFO_INFO_INDEX_BAR1_USERD_START_OFFSET = (0x000000004) +NV2080_CTRL_FIFO_INFO_INDEX_DEFAULT_CHANNEL_TIMESLICE = (0x000000005) +NV2080_CTRL_FIFO_INFO_INDEX_CHANNEL_GROUPS_IN_USE = (0x000000006) +NV2080_CTRL_FIFO_INFO_INDEX_IS_PER_RUNLIST_CHANNEL_RAM_SUPPORTED = (0x000000007) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNEL_GROUPS_PER_ENGINE = (0x000000008) +NV2080_CTRL_FIFO_INFO_INDEX_CHANNEL_GROUPS_IN_USE_PER_ENGINE = (0x000000009) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_LOWER_SUBCONTEXT = (0x00000000a) +NV2080_CTRL_FIFO_INFO_INDEX_MAX = NV2080_CTRL_FIFO_INFO_INDEX_MAX_LOWER_SUBCONTEXT +NV2080_CTRL_FIFO_GET_INFO_USERD_OFFSET_SHIFT = (12) +NV2080_CTRL_CMD_FIFO_GET_INFO = (0x20801109) +NV2080_CTRL_FIFO_GET_INFO_MAX_ENTRIES = (256) +NV2080_CTRL_FIFO_GET_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_FIFO_CHANNEL_PREEMPTIVE_REMOVAL = (0x2080110a) +NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS = (0x2080110b) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_MAX_ENTRIES = (64) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_FIFO_DISABLE_CHANNEL_FALSE = (0x00000000) +NV2080_CTRL_FIFO_DISABLE_CHANNEL_TRUE = (0x00000001) +NV2080_CTRL_FIFO_ONLY_DISABLE_SCHEDULING_FALSE = (0x00000000) +NV2080_CTRL_FIFO_ONLY_DISABLE_SCHEDULING_TRUE = (0x00000001) +NV2080_CTRL_FIFO_GET_CHANNEL_MEM_INFO_MAX_COUNT = 0x2 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO = (0x2080110c) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_INVALID = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_VIDMEM = 0x00000001 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_SYSMEM_COH = 0x00000002 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_SYSMEM_NCOH = 0x00000003 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION = (0x2080110d) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_APERTURE_VIDMEM = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_APERTURE_SYSMEM = 0x00000001 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_CACHED = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_UNCACHED = 0X00000001 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_WRITECOMBINED = 0X00000002 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_UNKNOWN = 0 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_OTHER = 1 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_BEST_EFFORT = 2 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_EQUAL_SHARE = 3 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_FIXED_SHARE = 4 +NV2080_CTRL_CMD_SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT = 3 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_DEFAULT = 0 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_DISABLE = 1 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_ENABLE = 2 +NV2080_CTRL_CMD_FIFO_OBJSCHED_SW_GET_LOG = (0x2080110e) +NV2080_CTRL_FIFO_OBJSCHED_SW_COUNT = 32 +NV2080_CTRL_FIFO_OBJSCHED_SW_NCOUNTERS = 8 +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRIES = 200 +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_FIFO_CONFIG_CTXSW_TIMEOUT = (0x20801110) +NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_CMD_FIFO_GET_DEVICE_INFO_TABLE = (0x20801112) +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_MAX_DEVICES = 256 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_MAX_ENTRIES = 32 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_DATA_TYPES = 16 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_MAX_PBDMA = 2 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_MAX_NAME_LEN = 16 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT = (0x20801113) +NV2080_CTRL_FIFO_CLEAR_FAULTED_BIT_FAULT_TYPE_ENGINE = 0x00000001 +NV2080_CTRL_FIFO_CLEAR_FAULTED_BIT_FAULT_TYPE_PBDMA = 0x00000002 +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY = (0x20801115) +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_DEFAULT = 0x0 +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_CHANNEL_INTERLEAVED = 0x1 +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_CHANNEL_INTERLEAVED_WDDM = 0x2 +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE = (0, 0) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE_FALSE = (0x00000000) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE_TRUE = (0x00000001) +NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_FIFO_UPDATE_CHANNEL_INFO = (0x20801116) +NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_CMD_FIFO_DISABLE_USERMODE_CHANNELS = (0x20801117) +NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS_MESSAGE_ID = (0x17) +NV2080_CTRL_CMD_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB = (0x20801118) +NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_FIFO_GET_ALLOCATED_CHANNELS = (0x20801119) +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_MAX_CHANNELS = 4096 +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION = (0x2080111a) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_MAX_ENTRIES = (64) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS_MESSAGE_ID = (0x1A) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2 = (0x2080111b) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS_MESSAGE_ID = (0x1B) +NV2080_CTRL_CMD_FIFO_OBJSCHED_GET_STATE = (0x20801120) +NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FIFO_OBJSCHED_SET_STATE = (0x20801121) +NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_FIFO_OBJSCHED_GET_CAPS = (0x20801122) +NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_FIFO_MAX_CHANNELS_PER_TSG = 128 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO = (0x20801123) +NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_FIFO_QUERY_CHANNEL_UNIQUE_ID = (0x20801124) +NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_FLA_RANGE = (0x20803501) +NV2080_CTRL_FLA_RANGE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_NONE = 0x00000000 +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_INITIALIZE = NVBIT(0) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_DESTROY = NVBIT(1) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_HOST_MANAGED_VAS_INITIALIZE = NVBIT(2) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_HOST_MANAGED_VAS_DESTROY = NVBIT(3) +NV2080_CTRL_CMD_FLA_SETUP_INSTANCE_MEM_BLOCK = (0x20803502) +NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_FLA_GET_RANGE = (0x20803503) +NV2080_CTRL_FLA_GET_RANGE_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_FLA_GET_FABRIC_MEM_STATS = (0x20803504) +NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_MESSAGE_ID = (0x4) +FALCON_ID_PMU = (NV2080_ENGINE_TYPE_PMU) +FALCON_ID_DPU = (NV2080_ENGINE_TYPE_DPU) +FALCON_ID_SEC2 = (NV2080_ENGINE_TYPE_SEC2) +FALCON_ID_FBFLCN = (NV2080_ENGINE_TYPE_FBFLCN) +NV2080_CTRL_CMD_FLCN_GET_DMEM_USAGE = (0x20803101) +NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_FLCN_NVOS_INST_EVT_RSVD_DO_NOT_USE = 0x00 +NV2080_CTRL_FLCN_NVOS_INST_EVT_CTXSW_END = 0x01 +NV2080_CTRL_FLCN_NVOS_INST_EVT_HW_IRQ_BEGIN = 0x02 +NV2080_CTRL_FLCN_NVOS_INST_EVT_HW_IRQ_END = 0x03 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TIMER_TICK = 0x04 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_BEGIN = 0x05 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_END = 0x06 +NV2080_CTRL_FLCN_NVOS_INST_EVT_RM_QUEUE_LATENCY = 0x07 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_SPECIAL_EVENT = 0x08 +NV2080_CTRL_FLCN_NVOS_INST_EVT_UNUSED_0 = 0x09 +NV2080_CTRL_FLCN_NVOS_INST_EVT_DMA_END = 0x0A +NV2080_CTRL_FLCN_NVOS_INST_EVT_GENERIC_BEGIN = 0x0B +NV2080_CTRL_FLCN_NVOS_INST_EVT_GENERIC_END = 0x0C +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_LATENCY = 0x0D +NV2080_CTRL_FLCN_NVOS_INST_INVALID_TASK_ID = 0xFF +NV2080_CTRL_CMD_FLCN_GET_ENGINE_ARCH = (0x20803118) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_DEFAULT = 0x0 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_FALCON = 0x1 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_RISCV = 0x2 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_RISCV_EB = 0x3 +NV2080_CTRL_FLCN_USTREAMER_EVENT_COMM_FLAG = (31, 31) +NV2080_CTRL_FLCN_USTREAMER_EVENT_COMM_HEAD = (30, 30) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_VARIABLE = (29, 29) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EXTEND = (28, 28) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTID_DRF_EXTENT = (27) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTID_DRF_BASE = (20) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTIDCOMPACT_DRF_EXTENT = (28) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTIDCOMPACT_DRF_BASE = (24) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_LENGTH = (19, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOAD = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT = (23, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_HEAD_TIME = (29, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_DATA_PAYLOAD = (30, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON = (10, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_YIELD = 0x0 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_INT0 = 0x1 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_TIMER_TICK = 0x2 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_QUEUE_BLOCK = 0x3 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_DMA_SUSPENDED = 0x4 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_ODP_MISS_COUNT = (23, 11) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TIMER_TICK_TIME_SLIP = (23, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_UNIT_ID = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_EVENT_TYPE = (23, 16) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_CALLBACK_ID = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_RPC_FUNC = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_RPC_FUNC_BOBJ_CMD_BASE = 0xF0 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_CLASS_ID = (23, 16) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_RM_QUEUE_LATENCY_SHIFT = 10 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID = (23, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID_RESERVED = 0x000000 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID_CB_ENQUEUE_FAIL = 0x000001 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_LATENCY_SHIFT = 6 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID = (11, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID_INVALID = 0x000 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID_VF_SWITCH_TOTAL = 0x001 +NV2080_CTRL_FLCN_USTREAMER_FEATURE_DEFAULT = 0 +NV2080_CTRL_FLCN_USTREAMER_FEATURE__COUNT = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH = (0, 0) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH = (1, 1) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH = (2, 2) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_THRESHOLD = (31, 8) +NV2080_CTRL_FLCN_USTREAMER_NUM_EVT_TYPES_COMPACT = (0x20) +NV2080_CTRL_FLCN_USTREAMER_NUM_EVT_TYPES = (0x120) +NV2080_CTRL_FLCN_USTREAMER_MASK_SIZE_BYTES = (0x24) +NV2080_CTRL_CMD_FLCN_USTREAMER_QUEUE_INFO = (0x20803120) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FLCN_USTREAMER_CONTROL_GET = (0x20803122) +NV2080_CTRL_CMD_FLCN_USTREAMER_CONTROL_SET = (0x20803123) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_GET_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_SET_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_FLCN_GET_CTX_BUFFER_INFO = (0x20803124) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_FLCN_GET_CTX_BUFFER_SIZE = (0x20803125) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_INTERNAL_GPIO_PROGRAM_DIRECTION = (0x20802300) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS_MESSAGE_ID = (0x00) +NV2080_CTRL_CMD_INTERNAL_GPIO_PROGRAM_OUTPUT = (0x20802301) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS_MESSAGE_ID = (0x01) +NV2080_CTRL_CMD_INTERNAL_GPIO_READ_INPUT = (0x20802302) +NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS_MESSAGE_ID = (0x02) +NV2080_CTRL_CMD_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION = (0x20802303) +NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS_MESSAGE_ID = (0x03) +NV_GRID_LICENSE_INFO_MAX_LENGTH = (128) +NV_GRID_LICENSE_FEATURE_VPC_EDITION = "GRID-Virtual-PC,2.0;Quadro-Virtual-DWS,5.0;GRID-Virtual-WS,2.0;GRID-Virtual-WS-Ext,2.0" +NV_GRID_LICENSE_FEATURE_VAPPS_EDITION = "GRID-Virtual-Apps,3.0" +NV_GRID_LICENSE_FEATURE_VIRTUAL_WORKSTATION_EDITION = "Quadro-Virtual-DWS,5.0;GRID-Virtual-WS,2.0;GRID-Virtual-WS-Ext,2.0" +NV_GRID_LICENSE_FEATURE_GAMING_EDITION = "GRID-vGaming,8.0" +NV_GRID_LICENSE_FEATURE_COMPUTE_EDITION = "NVIDIA-vComputeServer,9.0" +NV_GRID_LICENSED_PRODUCT_VWS = "NVIDIA RTX Virtual Workstation" +NV_GRID_LICENSED_PRODUCT_GAMING = "NVIDIA Cloud Gaming" +NV_GRID_LICENSED_PRODUCT_VPC = "NVIDIA Virtual PC" +NV_GRID_LICENSED_PRODUCT_VAPPS = "NVIDIA Virtual Applications" +NV_GRID_LICENSED_PRODUCT_COMPUTE = "NVIDIA Virtual Compute Server" +NV2080_CTRL_GPU_INFO_INDEX_INDEX = (23, 0) +NV2080_CTRL_GPU_INFO_INDEX_ECID_LO32 = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_ECID_HI32 = (0x00000002) +NV2080_CTRL_GPU_INFO_INDEX_MINOR_REVISION_EXT = (0x00000004) +NV2080_CTRL_GPU_INFO_INDEX_NETLIST_REV0 = (0x00000012) +NV2080_CTRL_GPU_INFO_INDEX_NETLIST_REV1 = (0x00000013) +NV2080_CTRL_GPU_INFO_INDEX_ECID_EXTENDED = (0x0000001b) +NV2080_CTRL_GPU_INFO_INDEX_SYSMEM_ACCESS = (0x0000001f) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD = (0x00000022) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE = (0x00000025) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED = (0x00000027) +NV2080_CTRL_GPU_INFO_INDEX_NVSWITCH_PROXY_DETECTED = (0x00000028) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT = (0x00000029) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SMC_MODE = (0x0000002a) +NV2080_CTRL_GPU_INFO_INDEX_SPLIT_VAS_MGMT_SERVER_CLIENT_RM = (0x0000002b) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SM_VERSION = (0x0000002c) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY = (0x0000002d) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM = (0x0000002f) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY = (0x00000030) +NV2080_CTRL_GPU_INFO_INDEX_NVENC_STATS_REPORTING_STATE = (0x00000031) +NV2080_CTRL_GPU_INFO_INDEX_4K_PAGE_ISOLATION_REQUIRED = (0x00000033) +NV2080_CTRL_GPU_INFO_INDEX_DISPLAY_ENABLED = (0x00000034) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED = (0x00000035) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY = (0x00000036) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY = (0x00000037) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY = (0x0000003a) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY = (0x0000003b) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU = (0x0000003c) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY = (0x0000003d) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED = (0x0000003f) +NV2080_CTRL_GPU_INFO_INDEX_IS_LOCALIZATION_SUPPORTED = (0x00000041) +NV2080_CTRL_GPU_INFO_INDEX_GPU_NON_PASID_ATS_CAPABILITY = (0x00000042) +NV2080_CTRL_GPU_INFO_INDEX_COHERENT_GPU_MEMORY_MODE = (0x00000044) +NV2080_CTRL_GPU_INFO_INDEX_COMPR_BIT_BACKING_COPY_TYPE = (0x00000045) +NV2080_CTRL_GPU_INFO_MAX_LIST_SIZE = (0x00000046) +NV2080_CTRL_GPU_INFO_INDEX_GROUP_ID = (30, 24) +NV2080_CTRL_GPU_INFO_INDEX_RESERVED = (31, 31) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_NONE = (0x00000000) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_P = (0x00000001) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_V = (0x00000002) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_PV = (0x00000003) +NV2080_CTRL_GPU_INFO_SYSMEM_ACCESS_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_SYSMEM_ACCESS_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_NVSWITCH_PROXY_DETECTED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_NVSWITCH_PROXY_DETECTED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_UNSUPPORTED = (0x00000000) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_DISABLED = (0x00000002) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_ENABLE_PENDING = (0x00000003) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_DISABLE_PENDING = (0x00000004) +NV2080_CTRL_GPU_INFO_SPLIT_VAS_MGMT_SERVER_CLIENT_RM_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_SPLIT_VAS_MGMT_SERVER_CLIENT_RM_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_NOT_SUPPORTED = (0x00000002) +NV2080_CTRL_GPU_INFO_INDEX_4K_PAGE_ISOLATION_REQUIRED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_4K_PAGE_ISOLATION_REQUIRED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_DISPLAY_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_DISPLAY_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_PEERID = (31, 1) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_IS_LOCALIZATION_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_IS_LOCALIZATION_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_NON_PASID_ATS_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_NON_PASID_ATS_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_COHERENT_GPU_MEMORY_MODE_NONE = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_COHERENT_GPU_MEMORY_MODE_NUMA = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_COHERENT_GPU_MEMORY_MODE_DRIVER = (0x00000002) +NV2080_CTRL_GPU_INFO_INDEX_COMP_BIT_BACKING_COPY_TYPE_PHYSICAL = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_COMP_BIT_BACKING_COPY_TYPE_VIRTUAL = (0x00000001) +NV2080_CTRL_CMD_GPU_GET_INFO = (0x20800101) +NV2080_CTRL_GPU_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_GPU_GET_INFO_V2 = (0x20800102) +NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_GPU_GET_NAME_STRING = (0x20800110) +NV2080_GPU_MAX_NAME_STRING_LENGTH = (0x0000040) +NV2080_CTRL_GPU_GET_NAME_STRING_FLAGS_TYPE = (31, 0) +NV2080_CTRL_GPU_GET_NAME_STRING_FLAGS_TYPE_ASCII = (0x00000000) +NV2080_CTRL_GPU_GET_NAME_STRING_FLAGS_TYPE_UNICODE = (0x00000001) +NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_CMD_GPU_GET_SHORT_NAME_STRING = (0x20800111) +NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GPU_SET_POWER = (0x20800112) +NV2080_CTRL_GPU_SET_POWER_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_0 = (0x00000000) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_1 = (0x00000001) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_2 = (0x00000002) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_3 = (0x00000003) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_4 = (0x00000004) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_7 = (0x00000007) +NV2080_CTRL_CMD_GPU_GET_SDM = (0x20800118) +NV2080_CTRL_GPU_GET_SDM_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_GPU_SET_SDM = (0x20800120) +NV2080_CTRL_GPU_SET_SDM_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_GPU_GET_SIMULATION_INFO = (0x20800119) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_NONE = (0x00000000) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_MODS_AMODEL = (0x00000001) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_LIVE_AMODEL = (0x00000002) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_FMODEL = (0x00000003) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_RTL = (0x00000004) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_EMU = (0x00000005) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_EMU_LOW_POWER = (0x00000006) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA = (0x00000007) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA_RTL = (0x00000008) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA_FMODEL = (0x00000009) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_UNKNOWN = (0xFFFFFFFF) +NV2080_CTRL_GPU_REG_OP_READ_32 = (0x00000000) +NV2080_CTRL_GPU_REG_OP_WRITE_32 = (0x00000001) +NV2080_CTRL_GPU_REG_OP_READ_64 = (0x00000002) +NV2080_CTRL_GPU_REG_OP_WRITE_64 = (0x00000003) +NV2080_CTRL_GPU_REG_OP_READ_08 = (0x00000004) +NV2080_CTRL_GPU_REG_OP_WRITE_08 = (0x00000005) +NV2080_CTRL_GPU_REG_OP_TYPE_GLOBAL = (0x00000000) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX = (0x00000001) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_TPC = (0x00000002) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_SM = (0x00000004) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_CROP = (0x00000008) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_ZROP = (0x00000010) +NV2080_CTRL_GPU_REG_OP_TYPE_FB = (0x00000020) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_QUAD = (0x00000040) +NV2080_CTRL_GPU_REG_OP_TYPE_DEVICE = (0x00000080) +NV2080_CTRL_GPU_REG_OP_STATUS_SUCCESS = (0x00) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_OP = (0x01) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_TYPE = (0x02) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_OFFSET = (0x04) +NV2080_CTRL_GPU_REG_OP_STATUS_UNSUPPORTED_OP = (0x08) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_MASK = (0x10) +NV2080_CTRL_GPU_REG_OP_STATUS_NOACCESS = (0x20) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS = (0x20800122) +NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_GPU_GET_ENGINES = (0x20800123) +NV2080_CTRL_GPU_GET_ENGINES_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_GPU_GET_ENGINES_V2 = (0x20800170) +NV2080_GPU_MAX_ENGINES_LIST_SIZE = 0x54 +NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS_MESSAGE_ID = (0x70) +NV2080_CTRL_CMD_GPU_GET_ENGINE_CLASSLIST = (0x20800124) +NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_GPU_GET_ENGINE_FAULT_INFO = (0x20800125) +NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_GPU_QUERY_MODE = (0x20800128) +NV2080_CTRL_GPU_QUERY_MODE_UNKNOWN_MODE = (0x00000000) +NV2080_CTRL_GPU_QUERY_MODE_GRAPHICS_MODE = (0x00000001) +NV2080_CTRL_GPU_QUERY_MODE_COMPUTE_MODE = (0x00000002) +NV2080_CTRL_GPU_QUERY_MODE_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_MAIN = 0 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PM = 1 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PATCH = 2 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_BUFFER_BUNDLE_CB = 3 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PAGEPOOL = 4 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_ATTRIBUTE_CB = 5 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_RTV_CB_GLOBAL = 6 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GFXP_POOL = 7 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GFXP_CTRL_BLK = 8 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_FECS_EVENT = 9 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PRIV_ACCESS_MAP = 10 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_UNRESTRICTED_PRIV_ACCESS_MAP = 11 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GLOBAL_PRIV_ACCESS_MAP = 12 +NV2080_CTRL_GPU_PROMOTE_CONTEXT_MAX_ENTRIES = 16 +NV2080_CTRL_CMD_GPU_PROMOTE_CTX = (0x2080012b) +NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_GPU_EVICT_CTX = (0x2080012c) +NV2080_CTRL_GPU_EVICT_CTX_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_GPU_INITIALIZE_CTX = (0x2080012d) +NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE = (1, 0) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_VIDMEM = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_COH_SYS = (0x00000001) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_NCOH_SYS = (0x00000002) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE = (2, 2) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE_YES = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE_NO = (0x00000001) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX = (3, 3) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX_NO = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX_YES = (0x00000001) +NV2080_CTRL_CMD_GPU_QUERY_ECC_INTR = (0x2080012e) +NV2080_CTRL_CMD_GPU_QUERY_ECC_STATUS = (0x2080012f) +NV2080_CTRL_GPU_ECC_UNIT_GSP = (0x0000001D) +NV2080_CTRL_GPU_ECC_UNIT_COUNT = (0x00000024) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE = (0, 0) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE_FILTERED = (0x00000000) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE_RAW = (0x00000001) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_FALSE = 0 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_TRUE = 1 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_INDETERMINATE = 2 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_GPU_SET_COMPUTE_MODE_RULES = (0x20800130) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_NONE = (0x00000000) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_EXCLUSIVE_COMPUTE = (0x00000001) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_COMPUTE_PROHIBITED = (0x00000002) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_EXCLUSIVE_COMPUTE_PROCESS = (0x00000003) +NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_CMD_GPU_QUERY_COMPUTE_MODE_RULES = (0x20800131) +NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_GPU_QUERY_ECC_CONFIGURATION = (0x20800133) +NV2080_CTRL_GPU_ECC_CONFIGURATION_DISABLED = (0x00000000) +NV2080_CTRL_GPU_ECC_CONFIGURATION_ENABLED = (0x00000001) +NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_GPU_SET_ECC_CONFIGURATION = (0x20800134) +NV2080_CTRL_GPU_ECC_CONFIGURATION_DISABLE = (0x00000000) +NV2080_CTRL_GPU_ECC_CONFIGURATION_ENABLE = (0x00000001) +NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_GPU_RESET_ECC_ERROR_STATUS = (0x20800136) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_NONE = (0x00000000) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_VOLATILE = (0x00000001) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_AGGREGATE = (0x00000002) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE = (0, 0) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE_FALSE = 0 +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE_TRUE = 1 +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_GPU_GET_FERMI_GPC_INFO = (0x20800137) +NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_GPU_GET_FERMI_TPC_INFO = (0x20800138) +NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_GPU_GET_FERMI_ZCULL_INFO = (0x20800139) +NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_GPU_GET_OEM_BOARD_INFO = (0x2080013f) +NV2080_GPU_MAX_MARKETING_NAME_LENGTH = (0x00000018) +NV2080_GPU_MAX_SERIAL_NUMBER_LENGTH = (0x00000010) +NV2080_GPU_MAX_MEMORY_PART_ID_LENGTH = (0x00000014) +NV2080_GPU_MAX_MEMORY_DATE_CODE_LENGTH = (0x00000006) +NV2080_GPU_MAX_PRODUCT_PART_NUMBER_LENGTH = (0x00000014) +NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_GPU_GET_ID = (0x20800142) +NV2080_CTRL_GPU_GET_ID_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_GPU_SET_GPU_DEBUG_MODE = (0x20800143) +NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_GPU_DEBUG_MODE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_DEBUG_MODE_DISABLED = (0x00000002) +NV2080_CTRL_CMD_GPU_GET_GPU_DEBUG_MODE = (0x20800144) +NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_GPU_GET_ENGINE_PARTNERLIST = (0x20800147) +NV2080_CTRL_GPU_MAX_ENGINE_PARTNERS = (0x00000020) +NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_GPU_GET_GID_INFO = (0x2080014a) +NV2080_GPU_MAX_GID_LENGTH = (0x000000100) +NV2080_GPU_MAX_SHA1_BINARY_GID_LENGTH = (0x000000010) +NV2080_CTRL_GPU_GET_GID_INFO_PARAMS_MESSAGE_ID = (0x4A) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT = (1, 0) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT_ASCII = (0x00000000) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT_BINARY = (0x00000002) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_TYPE = (2, 2) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_TYPE_SHA1 = (0x00000000) +NV2080_CTRL_CMD_GPU_GET_INFOROM_OBJECT_VERSION = (0x2080014b) +NV2080_CTRL_GPU_INFOROM_OBJ_TYPE_LEN = 3 +NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS_MESSAGE_ID = (0x4B) +NV2080_CTRL_CMD_SET_GPU_OPTIMUS_INFO = (0x2080014c) +NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS_MESSAGE_ID = (0x4C) +NV2080_CTRL_CMD_GPU_GET_IP_VERSION = (0x2080014d) +NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS_MESSAGE_ID = (0x4D) +NV2080_CTRL_GPU_GET_IP_VERSION_DISPLAY = (0x00000001) +NV2080_CTRL_GPU_GET_IP_VERSION_HDACODEC = (0x00000002) +NV2080_CTRL_GPU_GET_IP_VERSION_PMGR = (0x00000003) +NV2080_CTRL_GPU_GET_IP_VERSION_PPWR_PMU = (0x00000004) +NV2080_CTRL_GPU_GET_IP_VERSION_DISP_FALCON = (0x00000005) +NV2080_CTRL_GPU_ILLUM_ATTRIB_LOGO_BRIGHTNESS = 0 +NV2080_CTRL_GPU_ILLUM_ATTRIB_SLI_BRIGHTNESS = 1 +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT = (0x20800153) +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_GPU_GET_ILLUM = (0x20800154) +NV2080_CTRL_GPU_GET_ILLUM_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_GPU_SET_ILLUM = (0x20800155) +NV2080_CTRL_GPU_SET_ILLUM_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_CMD_GPU_GET_INFOROM_IMAGE_VERSION = (0x20800156) +NV2080_CTRL_GPU_INFOROM_IMAGE_VERSION_LEN = 16 +NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_CMD_GPU_QUERY_INFOROM_ECC_SUPPORT = (0x20800157) +NV2080_CTRL_CMD_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO = (0x2080015a) +NV2080_CTRL_MAX_PHYSICAL_BRIDGE = (100) +NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU = (0x2080015b) +NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_GPU_QUERY_SCRUBBER_STATUS = (0x2080015f) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS_MESSAGE_ID = (0x5F) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_SCRUBBER_RUNNING = (0x00000000) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_SCRUBBER_IDLE = (0x00000001) +NV2080_CTRL_CMD_GPU_GET_VPR_CAPS = (0x20800160) +NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS_MESSAGE_ID = (0x60) +NV2080_CTRL_CMD_GPU_HANDLE_GPU_SR = (0x20800167) +NV2080_CTRL_CMD_GPU_GET_PES_INFO = (0x20800168) +NV2080_CTRL_CMD_GPU_GET_PES_INFO_MAX_TPC_PER_GPC_COUNT = 10 +NV2080_CTRL_GPU_GET_PES_INFO_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_GPU_GET_OEM_INFO = (0x20800169) +NV2080_GPU_MAX_OEM_INFO_LENGTH = (0x000001F8) +NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_CMD_GPU_GET_VPR_INFO = (0x2080016b) +NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS_MESSAGE_ID = (0x6B) +NV2080_CTRL_CMD_GPU_GET_ENCODER_CAPACITY = (0x2080016c) +NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS_MESSAGE_ID = (0x6C) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS = (0x2080016d) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS_MESSAGE_ID = (0x6D) +NV2080_CTRL_GPU_NVENC_SESSION_INFO_MAX_COPYOUT_ENTRIES = 0x200 +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS_MESSAGE_ID = (0x6E) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO = (0x2080016e) +NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS_MESSAGE_ID = (0x6F) +NV2080_CTRL_CMD_GPU_SET_FABRIC_BASE_ADDR = (0x2080016f) +NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS_MESSAGE_ID = (0x72) +NV2080_CTRL_CMD_GPU_VIRTUAL_INTERRUPT = (0x20800172) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS_MESSAGE_ID = (0x73) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS = (0x20800173) +NV_GI_UUID_LEN = 16 +NV2080_CTRL_GPU_PARTITION_ID_INVALID = 0xFFFFFFFF +NV2080_CTRL_GPU_MAX_PARTITIONS = 0x00000008 +NV2080_CTRL_GPU_MAX_PARTITION_IDS = 0x00000009 +NV2080_CTRL_GPU_MAX_SMC_IDS = 0x00000008 +NV2080_CTRL_GPU_MAX_GPC_PER_SMC = 0x00000010 +NV2080_CTRL_GPU_MAX_CE_PER_SMC = 0x00000008 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE = (1, 0) +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_FULL = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_HALF = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_QUARTER = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_EIGHTH = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE__SIZE = 4 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE = (4, 2) +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_FULL = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_HALF = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_HALF = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_QUARTER = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_QUARTER = 0x00000004 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_EIGHTH = 0x00000005 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_RESERVED_INTERNAL_06 = 0x00000006 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_RESERVED_INTERNAL_07 = 0x00000007 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE__SIZE = 8 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE = (7, 5) +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_FULL = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_HALF = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_MINI_HALF = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_QUARTER = 0x00000004 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_EIGHTH = 0x00000005 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_RESERVED_INTERNAL_06 = 0x00000006 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_RESERVED_INTERNAL_07 = 0x00000007 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_NONE = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE__SIZE = 8 +NV2080_CTRL_GPU_PARTITION_MAX_TYPES = 90 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_ALL_MEDIA = (29, 28) +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_ALL_MEDIA_DEFAULT = 0 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_ALL_MEDIA_DISABLE = 1 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_ALL_MEDIA_ENABLE = 2 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA = (30, 30) +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA_DISABLE = 0 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA_ENABLE = 1 +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN = (31, 31) +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN_DISABLE = 0 +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN_ENABLE = 1 +NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_GPU_SET_PARTITIONS = (0x20800174) +NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS_MESSAGE_ID = (0x75) +NV2080_CTRL_CMD_GPU_GET_PARTITIONS = (0x20800175) +NV2080_CTRL_CMD_GPU_CONFIGURE_PARTITION = (0x20800176) +NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS_MESSAGE_ID = (0x76) +NV2080_CTRL_GPU_FAULT_PACKET_SIZE = 32 +NV2080_CTRL_CMD_GPU_REPORT_NON_REPLAYABLE_FAULT = (0x20800177) +NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS_MESSAGE_ID = (0x77) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS_VGPU = (0x20800178) +NV2080_CTRL_GPU_EXEC_REG_OPS_VGPU_PARAMS_MESSAGE_ID = (0x78) +NV2080_CTRL_CMD_GPU_GET_ENGINE_RUNLIST_PRI_BASE = (0x20800179) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS_MESSAGE_ID = (0x79) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_NULL = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_ERROR = (0xFFFFFFFB) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_INVALID = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_ERROR = (0xFFFFFFFB) +NV2080_CTRL_CMD_GPU_GET_HW_ENGINE_ID = (0x2080017a) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS_MESSAGE_ID = (0x7A) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_NULL = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_ERROR = (0xFFFFFFFB) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS = (0x2080017b) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS_MESSAGE_ID = (0x7B) +NV2080_CTRL_NVFBC_SESSION_FLAG_DIFFMAP_ENABLED = 0x00000001 +NV2080_CTRL_NVFBC_SESSION_FLAG_CLASSIFICATIONMAP_ENABLED = 0x00000002 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_NO_WAIT = 0x00000004 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_INFINITE = 0x00000008 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_TIMEOUT = 0x00000010 +NV2080_GPU_NVFBC_MAX_SESSION_COUNT = 256 +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS_MESSAGE_ID = (0x7C) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO = (0x2080017c) +NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS_MESSAGE_ID = (0xe6) +NV2080_CTRL_CMD_GPU_GET_FIRST_ASYNC_CE_IDX = (0x208001e6) +NV2080_CTRL_CMD_GPU_GET_VMMU_SEGMENT_SIZE = (0x2080017e) +NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS_MESSAGE_ID = (0x7E) +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_32MB = 0x02000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_64MB = 0x04000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_128MB = 0x08000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_256MB = 0x10000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_512MB = 0x20000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_1024MB = 0x40000000 +NV2080_CTRL_CMD_GPU_GET_PARTITION_CAPACITY = (0x20800181) +NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_GPU_GET_CACHED_INFO = (0x20800182) +NV2080_CTRL_GPU_GET_CACHED_INFO_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_GPU_SET_PARTITIONING_MODE = (0x20800183) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING = (1, 0) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_LEGACY = 0 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_MAX_PERF = 1 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_FAST_RECONFIG = 2 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_GPU_DESCRIBE_PARTITIONS = (0x20800185) +NV2080_CTRL_CMD_GPU_GET_MAX_SUPPORTED_PAGE_SIZE = (0x20800188) +NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS_MESSAGE_ID = (0x8A) +NV2080_CTRL_CMD_GPU_GET_NUM_MMUS_PER_GPC = (0x2080018a) +NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS_MESSAGE_ID = (0x8B) +NV2080_CTRL_CMD_GPU_GET_ACTIVE_PARTITION_IDS = (0x2080018b) +NV2080_CTRL_CMD_GPU_GET_PIDS = (0x2080018d) +NV2080_CTRL_GPU_GET_PIDS_MAX_COUNT = 950 +NV2080_CTRL_GPU_GET_PIDS_PARAMS_MESSAGE_ID = (0x8D) +NV2080_CTRL_GPU_GET_PIDS_ID_TYPE_CLASS = (0x00000000) +NV2080_CTRL_GPU_GET_PIDS_ID_TYPE_VGPU_GUEST = (0x00000001) +NV2080_CTRL_GPU_PID_INFO_INDEX_VIDEO_MEMORY_USAGE = (0x00000000) +NV2080_CTRL_GPU_PID_INFO_INDEX_MAX = NV2080_CTRL_GPU_PID_INFO_INDEX_VIDEO_MEMORY_USAGE +NV2080_CTRL_CMD_GPU_GET_PID_INFO = (0x2080018e) +NV2080_CTRL_GPU_GET_PID_INFO_MAX_COUNT = 200 +NV2080_CTRL_GPU_GET_PID_INFO_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT = (0x20800192) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_INVALID = 0 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_BAR1 = 1 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_BAR2 = 2 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_PHYSICAL = 3 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_UNBOUND_INSTANCE = 4 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_GPU_COMPUTE_POLICY_TIMESLICE = 0 +NV2080_CTRL_GPU_COMPUTE_POLICY_MAX = 1 +NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS_MESSAGE_ID = (0x94) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_POLICY_CONFIG = (0x20800195) +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_LIST_MAX = 32 +NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS_MESSAGE_ID = (0x95) +NV2080_CTRL_CMD_GPU_GET_GFID = (0x20800196) +NV2080_CTRL_GPU_GET_GFID_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY = (0x20800197) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS_MESSAGE_ID = (0x97) +NV2080_CTRL_CMD_GPU_VALIDATE_MEM_MAP_REQUEST = (0x20800198) +NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS_MESSAGE_ID = (0x98) +NV2080_CTRL_CMD_GPU_GET_ENGINE_LOAD_TIMES = (0x2080019b) +NV2080_CTRL_GPU_MAX_ENGINE_OBJECTS = 0xC8 +NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS_MESSAGE_ID = (0x9B) +NV2080_CTRL_CMD_GPU_GET_ID_NAME_MAPPING = (0x2080019c) +NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS_MESSAGE_ID = (0x9C) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS_NOPTRS = (0x2080019d) +NV2080_CTRL_REG_OPS_ARRAY_MAX = 100 +NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS_MESSAGE_ID = (0x9D) +NV2080_CTRL_GPU_SKYLINE_INFO_MAX_SKYLINES = 9 +NV2080_CTRL_GPU_SKYLINE_INFO_MAX_NON_SINGLETON_VGPCS = 12 +NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS_MESSAGE_ID = (0x9F) +NV2080_CTRL_CMD_GPU_GET_SKYLINE_INFO = (0x2080019f) +NV2080_GET_P2P_CAPS_UUID_LEN = 16 +NV2080_CTRL_CMD_GET_P2P_CAPS = (0x208001a0) +NV2080_CTRL_GET_P2P_CAPS_PARAMS_MESSAGE_ID = (0xA0) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xA2) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_PROFILES = (0x208001a2) +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_UNSUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_NOT_STARTED = 1 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_IN_PROGRESS = 2 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_COMPLETE = 3 +NV2080_GPU_FABRIC_CLUSTER_UUID_LEN = 16 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW = (1, 0) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE = (3, 2) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY = (5, 4) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY = (7, 6) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION = (11, 8) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NONE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_SYSGUID = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_CHASSIS_SN = 3 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NO_PARTITION = 4 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INSUFFICIENT_NVLINKS = 5 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCOMPATIBLE_GPU_FW = 6 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INVALID_LOCATION = 7 +NV2080_CTRL_GPU_FABRIC_HEALTH_SUMMARY_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_SUMMARY_HEALTHY = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_SUMMARY_UNHEALTHY = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_SUMMARY_LIMITED_CAPACITY = 3 +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xA3) +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO = (0x208001a3) +NV2080_CTRL_CMD_GPU_GET_CHIP_DETAILS = (0x208001a4) +GPU_PART_NUMBER_FMT = "%4X-%s-%X%X" +NV2080_MAX_CHIP_SKU_LENGTH = 0x00000004 +NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS_MESSAGE_ID = (0xA4) +NV2080_CTRL_CMD_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP = (0x208001a5) +NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS_MESSAGE_ID = (0xA5) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS = (0x208001a6) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS_GSP = (0x208001a7) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS_VGPU = (0x208001a8) +NV2080_CTRL_MIGRATABLE_OPS_ARRAY_MAX = 50 +NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_MESSAGE_ID = (0xA6) +NV2080_CTRL_GPU_MIGRATABLE_OPS_GSP_PARAMS_MESSAGE_ID = (0xA7) +NV2080_CTRL_GPU_MIGRATABLE_OPS_VGPU_PARAMS_MESSAGE_ID = (0xA8) +NV2080_CTRL_CMD_GPU_MARK_DEVICE_FOR_RESET = (0x208001a9) +NV2080_CTRL_CMD_GPU_UNMARK_DEVICE_FOR_RESET = (0x208001aa) +NV2080_CTRL_CMD_GPU_GET_RESET_STATUS = (0x208001ab) +NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS_MESSAGE_ID = (0xAB) +NV2080_CTRL_CMD_GPU_MARK_DEVICE_FOR_DRAIN_AND_RESET = (0x208001ac) +NV2080_CTRL_CMD_GPU_UNMARK_DEVICE_FOR_DRAIN_AND_RESET = (0x208001ad) +NV2080_CTRL_CMD_GPU_GET_DRAIN_AND_RESET_STATUS = (0x208001ae) +NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS_MESSAGE_ID = (0xAE) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS_MESSAGE_ID = (0xAF) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2 = (0x208001af) +NV2080_CTRL_GPU_MAX_CONSTRUCTED_FALCONS = 0x40 +NV2080_CTRL_CMD_GPU_GET_CONSTRUCTED_FALCON_INFO = (0x208001b0) +NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS_MESSAGE_ID = (0xB0) +NV2080_CTRL_CMD_GPU_GET_VF_CAPS = (0x208001b1) +NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS_MESSAGE_ID = (0xB1) +NV2080_CTRL_CMD_GPU_GET_RECOVERY_ACTION = (0x208001b2) +NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS_MESSAGE_ID = (0xB2) +NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS_MESSAGE_ID = (0xe4) +NV2080_CTRL_GPU_GET_FIPS_STATUS = (0x208001e4) +NV2080_CTRL_GPU_RAFTS_NUM_MAX_UGPU = 0x2 +NV2080_CTRL_GPU_RAFTS_NUM_MAX_GPC_PER_UGPU = 0xC +NV2080_CTRL_GPU_RAFTS_NUM_MAX_NUM_GPC = (0x18) +NV2080_CTRL_GPU_RAFTS_NUM_MAX_FS_UNIT = (0x1a) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS_MESSAGE_ID = (0xB3) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK = (0x208001b3) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_PROFILE_CAPACITY = (0x208001e5) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS_MESSAGE_ID = (0xe5) +NV2080_CTRL_CMD_GPU_GET_TPC_RECONFIG_MASK = (0x208001e7) +NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS_MESSAGE_ID = (0xe7) +NV2080_CTRL_CMD_GPU_RPC_GSP_TEST = (0x208001e8) +NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS_MESSAGE_ID = (0xe8) +NV2080_CTRL_GPU_RPC_GSP_TEST_SERIALIZED_INTEGRITY = 0x1 +NV2080_CTRL_GPU_RPC_GSP_TEST_UNSERIALIZED = 0x2 +NV2080_CTRL_CMD_GPU_RPC_GSP_QUERY_SIZES = (0x208001e9) +NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS_MESSAGE_ID = (0xe9) +RUSD_FEATURE_NON_POLLING = 0x1 +RUSD_FEATURE_POLLING = 0x2 +NV2080_CTRL_CMD_RUSD_GET_SUPPORTED_FEATURES = (0x208081ea) +NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS_MESSAGE_ID = (0xea) +NV2080_CTRL_CMD_GPU_FORCE_GSP_UNLOAD = (0x208001eb) +NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS_MESSAGE_ID = (0xeb) +NV2080_CTRL_GPUMON_SAMPLE_TYPE_PWR_MONITOR_STATUS = 0x00000001 +NV2080_CTRL_GPUMON_SAMPLE_TYPE_PERFMON_UTIL = 0x00000002 +NV2080_GPUMON_PID_INVALID = ((NvU32)(~0)) +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE = (1, 0) +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_NONE = 0x0 +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_ENGID = 0x1 +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_CHANNEL = 0x2 +NV2080_CTRL_GR_ROUTE_INFO_DATA_CHANNEL_HANDLE = (31, 0) +NV2080_CTRL_GR_ROUTE_INFO_DATA_ENGID = (31, 0) +NV2080_CTRL_GR_INFO_INDEX_MAXCLIPS = NV0080_CTRL_GR_INFO_INDEX_MAXCLIPS +NV2080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 = NV0080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 +NV2080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK = NV0080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK +NV2080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT = NV0080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT +NV2080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT = NV0080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT +NV2080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE = NV0080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE +NV2080_CTRL_GR_INFO_INDEX_VPE_COUNT = NV0080_CTRL_GR_INFO_INDEX_VPE_COUNT +NV2080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT = NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT +NV2080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR = NV0080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR +NV2080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT = NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT = NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT = NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_VERSION = NV0080_CTRL_GR_INFO_INDEX_SM_VERSION +NV2080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM = NV0080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM +NV2080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP = NV0080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP +NV2080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES = NV0080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES +NV2080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES = NV0080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES +NV2080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY = NV0080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY +NV2080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY = NV0080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY +NV2080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM = NV0080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS +NV2080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED = NV0080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS +NV2080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP +NV2080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES +NV2080_CTRL_GR_INFO_INDEX_DUMMY = NV0080_CTRL_GR_INFO_INDEX_DUMMY +NV2080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES = NV0080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES +NV2080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES = NV0080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES +NV2080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS = NV0080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG = NV0080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET +NV2080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET = NV0080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET +NV2080_CTRL_GR_INFO_INDEX_MAX = NV0080_CTRL_GR_INFO_INDEX_MAX +NV2080_CTRL_GR_INFO_MAX_SIZE = NV0080_CTRL_GR_INFO_MAX_SIZE +NV2080_CTRL_GR_INFO_SM_VERSION_NONE = (0x00000000) +NV2080_CTRL_GR_INFO_SM_VERSION_1_05 = (0x00000105) +NV2080_CTRL_GR_INFO_SM_VERSION_1_1 = (0x00000110) +NV2080_CTRL_GR_INFO_SM_VERSION_1_2 = (0x00000120) +NV2080_CTRL_GR_INFO_SM_VERSION_1_3 = (0x00000130) +NV2080_CTRL_GR_INFO_SM_VERSION_1_4 = (0x00000140) +NV2080_CTRL_GR_INFO_SM_VERSION_1_5 = (0x00000150) +NV2080_CTRL_GR_INFO_SM_VERSION_2_0 = (0x00000200) +NV2080_CTRL_GR_INFO_SM_VERSION_2_1 = (0x00000210) +NV2080_CTRL_GR_INFO_SM_VERSION_2_2 = (0x00000220) +NV2080_CTRL_GR_INFO_SM_VERSION_3_0 = (0x00000300) +NV2080_CTRL_GR_INFO_SM_VERSION_3_1 = (0x00000310) +NV2080_CTRL_GR_INFO_SM_VERSION_3_2 = (0x00000320) +NV2080_CTRL_GR_INFO_SM_VERSION_3_3 = (0x00000330) +NV2080_CTRL_GR_INFO_SM_VERSION_3_5 = (0x00000350) +NV2080_CTRL_GR_INFO_SM_VERSION_3_6 = (0x00000360) +NV2080_CTRL_GR_INFO_SM_VERSION_3_8 = (0x00000380) +NV2080_CTRL_GR_INFO_SM_VERSION_3_9 = (0x00000390) +NV2080_CTRL_GR_INFO_SM_VERSION_4_0 = (0x00000400) +NV2080_CTRL_GR_INFO_SM_VERSION_5_0 = (0x00000500) +NV2080_CTRL_GR_INFO_SM_VERSION_5_02 = (0x00000502) +NV2080_CTRL_GR_INFO_SM_VERSION_5_03 = (0x00000503) +NV2080_CTRL_GR_INFO_SM_VERSION_6_0 = (0x00000600) +NV2080_CTRL_GR_INFO_SM_VERSION_6_01 = (0x00000601) +NV2080_CTRL_GR_INFO_SM_VERSION_6_02 = (0x00000602) +NV2080_CTRL_GR_INFO_SM_VERSION_7_0 = (0x00000700) +NV2080_CTRL_GR_INFO_SM_VERSION_7_01 = (0x00000701) +NV2080_CTRL_GR_INFO_SM_VERSION_7_02 = (0x00000702) +NV2080_CTRL_GR_INFO_SM_VERSION_7_03 = (0x00000703) +NV2080_CTRL_GR_INFO_SM_VERSION_7_05 = (0x00000705) +NV2080_CTRL_GR_INFO_SM_VERSION_8_02 = (0x00000802) +NV2080_CTRL_GR_INFO_SM_VERSION_8_06 = (0x00000806) +NV2080_CTRL_GR_INFO_SM_VERSION_8_07 = (0x00000807) +NV2080_CTRL_GR_INFO_SM_VERSION_8_08 = (0x00000808) +NV2080_CTRL_GR_INFO_SM_VERSION_8_09 = (0x00000809) +NV2080_CTRL_GR_INFO_SM_VERSION_9_00 = (0x00000900) +NV2080_CTRL_GR_INFO_SM_VERSION_10_00 = (0x00000A00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_01 = (0x00000A01) +NV2080_CTRL_GR_INFO_SM_VERSION_10_03 = (0x00000A03) +NV2080_CTRL_GR_INFO_SM_VERSION_10_04 = (0x00000A04) +NV2080_CTRL_GR_INFO_SM_VERSION_12_00 = (0x00000C00) +NV2080_CTRL_GR_INFO_SM_VERSION_12_01 = (0x00000C01) +NV2080_CTRL_GR_INFO_SM_VERSION_5_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_5_02) +NV2080_CTRL_GR_INFO_SM_VERSION_5_3 = (NV2080_CTRL_GR_INFO_SM_VERSION_5_03) +NV2080_CTRL_GR_INFO_SM_VERSION_6_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_6_01) +NV2080_CTRL_GR_INFO_SM_VERSION_6_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_6_02) +NV2080_CTRL_GR_INFO_SM_VERSION_7_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_01) +NV2080_CTRL_GR_INFO_SM_VERSION_7_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_02) +NV2080_CTRL_GR_INFO_SM_VERSION_7_3 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_03) +NV2080_CTRL_GR_INFO_SM_VERSION_7_5 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_05) +NV2080_CTRL_GR_INFO_SM_VERSION_8_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_02) +NV2080_CTRL_GR_INFO_SM_VERSION_8_6 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_06) +NV2080_CTRL_GR_INFO_SM_VERSION_8_7 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_07) +NV2080_CTRL_GR_INFO_SM_VERSION_8_8 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_08) +NV2080_CTRL_GR_INFO_SM_VERSION_8_9 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_09) +NV2080_CTRL_GR_INFO_SM_VERSION_9_0 = (NV2080_CTRL_GR_INFO_SM_VERSION_9_00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_0 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_01) +NV2080_CTRL_GR_INFO_SM_VERSION_10_3 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_03) +NV2080_CTRL_GR_INFO_SM_VERSION_10_4 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_04) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D = (0, 0) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D = (1, 1) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE = (2, 2) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M = (3, 3) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M_TRUE = 0x1 +NV2080_CTRL_CMD_GR_GET_INFO = (0x20801201) +NV2080_CTRL_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_GR_CTXSW_ZCULL_MODE = (0x20801205) +NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CTXSW_ZCULL_MODE_GLOBAL = (0x00000000) +NV2080_CTRL_CTXSW_ZCULL_MODE_NO_CTXSW = (0x00000001) +NV2080_CTRL_CTXSW_ZCULL_MODE_SEPARATE_BUFFER = (0x00000002) +NV2080_CTRL_CMD_GR_GET_ZCULL_INFO = (0x20801206) +NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_GR_CTXSW_PM_MODE = (0x20801207) +NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CTXSW_PM_MODE_NO_CTXSW = (0x00000000) +NV2080_CTRL_CTXSW_PM_MODE_CTXSW = (0x00000001) +NV2080_CTRL_CTXSW_PM_MODE_STREAM_OUT_CTXSW = (0x00000002) +NV2080_CTRL_CMD_GR_CTXSW_ZCULL_BIND = (0x20801208) +NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_GR_CTXSW_PM_BIND = (0x20801209) +NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_GR_CTXSW_SETUP_BIND = (0x2080123a) +NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_MAX_VALUES = 128 +NV2080_CTRL_CMD_GR_SET_GPC_TILE_MAP = (0x2080120a) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_GR_CTXSW_SMPC_MODE = (0x2080120e) +NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CTXSW_SMPC_MODE_NO_CTXSW = (0x00000000) +NV2080_CTRL_CTXSW_SMPC_MODE_CTXSW = (0x00000001) +NV2080_CTRL_CMD_GR_GET_SM_TO_GPC_TPC_MAPPINGS = (0x2080120f) +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_MAX_SM_COUNT = 240 +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_GR_SET_CTXSW_PREEMPTION_MODE = (0x20801210) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP = (0, 0) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP_IGNORE = (0x00000000) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP_SET = (0x00000001) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP = (1, 1) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP_IGNORE = (0x00000000) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP_SET = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_WFI = (0x00000000) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_GFXP = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_GFXP_POOL = (0x00000002) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_WFI = (0x00000000) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_CTA = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_CILP = (0x00000002) +NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND = (0x20801211) +NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GR_PC_SAMPLING_MODE = (0x20801212) +NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_PC_SAMPLING_MODE_DISABLED = (0x00000000) +NV2080_CTRL_PC_SAMPLING_MODE_ENABLED = (0x00000001) +NV2080_CTRL_CMD_GR_GET_ROP_INFO = (0x20801213) +NV2080_CTRL_GR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_GR_GET_CTXSW_STATS = (0x20801215) +NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET = (0, 0) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET_FALSE = (0x00000000) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET_TRUE = (0x00000001) +NV2080_CTRL_CMD_GR_GET_CTX_BUFFER_SIZE = (0x20801218) +NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_GR_MAX_CTX_BUFFER_COUNT = 64 +NV2080_CTRL_CMD_GR_GET_CTX_BUFFER_INFO = (0x20801219) +NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_UNKNOWN = 0 +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_SYSMEM = 1 +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_FBMEM = 2 +NV2080_CTRL_CMD_GR_GET_GLOBAL_SM_ORDER = (0x2080121b) +NV2080_CTRL_CMD_GR_GET_GLOBAL_SM_ORDER_MAX_SM_COUNT = 512 +NV2080_CTRL_GR_DISABLED_SM_VGPC_ID = 0xFF +NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x1B) +NV2080_CTRL_CMD_GR_GET_CURRENT_RESIDENT_CHANNEL = (0x2080121c) +NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS_MESSAGE_ID = (0x1C) +NV2080_CTRL_CMD_GR_GET_VAT_ALARM_MAX_GPC_COUNT = 10 +NV2080_CTRL_CMD_GR_GET_VAT_ALARM_MAX_TPC_PER_GPC_COUNT = 10 +NV2080_CTRL_CMD_GR_GET_VAT_ALARM_DATA = (0x2080121d) +NV2080_CTRL_GR_GET_VAT_ALARM_DATA_PARAMS_MESSAGE_ID = (0x1D) +NV2080_CTRL_CMD_GR_GET_ATTRIBUTE_BUFFER_SIZE = (0x2080121e) +NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x1E) +NV2080_CTRL_CMD_GR_GFX_POOL_QUERY_SIZE = (0x2080121f) +NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS_MESSAGE_ID = (0x1F) +NV2080_CTRL_CMD_GR_GFX_POOL_INITIALIZE = (0x20801220) +NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_GR_GFX_POOL_MAX_SLOTS = 64 +NV2080_CTRL_CMD_GR_GFX_POOL_ADD_SLOTS = (0x20801221) +NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_GR_GFX_POOL_REMOVE_SLOTS = (0x20801222) +NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_GR_GET_CAPS_V2 = (0x20801227) +NV2080_CTRL_GR_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_GR_GET_INFO_V2 = (0x20801228) +NV2080_CTRL_GR_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_GR_GET_GPC_MASK = (0x2080122a) +NV2080_CTRL_GR_GET_GPC_MASK_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_CMD_GR_GET_TPC_MASK = (0x2080122b) +NV2080_CTRL_GR_GET_TPC_MASK_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_GR_SET_TPC_PARTITION_MODE = (0x2080122c) +NV2080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_GR_GET_ENGINE_CONTEXT_PROPERTIES = (0x2080122d) +NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_CMD_GR_GET_SM_ISSUE_RATE_MODIFIER = (0x20801230) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_DP_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_DP_REDUCED_SPEED = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_MAX_LIST_SIZE = (0xFF) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FMLA16 = (0x0) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_DP = (0x1) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FMLA32 = (0x2) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FFMA = (0x3) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA0 = (0x4) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA1 = (0x5) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA2 = (0x6) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA3 = (0x7) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA4 = (0x8) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FP16 = (0x9) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FP32 = (0xA) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_DFMA = (0xB) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_DMLA = (0xC) +NV2080_CTRL_CMD_GR_GET_SM_ISSUE_RATE_MODIFIER_V2 = (0x2080123c) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS_MESSAGE_ID = (0x3C) +NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL_MAX_LIST_SIZE = (0xFF) +NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL_MASK = (0x0) +NV2080_CTRL_CMD_GR_GET_SM_ISSUE_THROTTLE_CTRL = (0x2080123d) +NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS_MESSAGE_ID = (0x3D) +NV2080_CTRL_CMD_GR_FECS_BIND_EVTBUF_FOR_UID = (0x20801231) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_GR_GET_PHYS_GPC_MASK = (0x20801232) +NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS_MESSAGE_ID = (0x32) +NV2080_CTRL_CMD_GR_GET_PPC_MASK = (0x20801233) +NV2080_CTRL_GR_GET_PPC_MASK_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_GR_GET_NUM_TPCS_FOR_GPC = (0x20801234) +NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_GR_GET_CTXSW_MODES = (0x20801235) +NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS_MESSAGE_ID = (0x35) +NV2080_CTRL_CMD_GR_GET_GPC_TILE_MAP = (0x20801236) +NV2080_CTRL_GR_GET_GPC_TILE_MAP_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_GR_GET_ZCULL_MASK = (0x20801237) +NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_GR_FECS_BIND_EVTBUF_FOR_UID_V2 = (0x20801238) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_GR_GET_GFX_GPC_AND_TPC_INFO = (0x20801239) +NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_GR_GET_TPC_RECONFIG_MASK = (0x2080123b) +NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS_MESSAGE_ID = (0x3b) +NV2080_CTRL_CMD_GRMGR_GET_GR_FS_INFO = (0x20803801) +NV2080_CTRL_GRMGR_GR_FS_INFO_MAX_QUERIES = 96 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_MAX_SIZE = 32 +NV2080_CTRL_GRMGR_MAX_SMC_IDS = 8 +NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_INVALID = 0 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_GPC_COUNT = 1 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_CHIPLET_GPC_MAP = 2 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_TPC_MASK = 3 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PPC_MASK = 4 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_CHIPLET_GPC_MAP = 5 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_CHIPLET_SYSPIPE_MASK = 6 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_CHIPLET_SYSPIPE_IDS = 7 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PROFILER_MON_GPC_MASK = 8 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_SYSPIPE_ID = 9 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_ROP_MASK = 10 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_CHIPLET_GRAPHICS_SYSPIPE_MASK = 11 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_GFX_CAPABLE_GPC_MASK = 12 +NV2080_CTRL_CMD_GSP_GET_FEATURES = (0x20803601) +NV2080_GSP_MAX_BUILD_VERSION_LENGTH = (0x0000040) +NV2080_CTRL_GSP_GET_FEATURES_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED = (0, 0) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED_FALSE = (0x00000000) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED_TRUE = (0x00000001) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED = (1, 1) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED_FALSE = (0x00000000) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED_TRUE = (0x00000001) +NV2080_CTRL_CMD_GSP_GET_RM_HEAP_STATS = (0x20803602) +NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS = (0x20803603) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS = (0x20803604) +NV2080_CTRL_GSP_LIBOS_POOL_COUNT_MAX = 64 +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK = (0x20804101) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE = (0x20804102) +NV2080_CTRL_I2C_VERSION_0 = 0x00 +NV2080_CTRL_I2C_MAX_ENTRIES = 256 +NV2080_CTRL_I2C_MAX_REG_LEN = 8 +NV2080_CTRL_I2C_MAX_ADDR_ENTRIES = 20 +NV2080_CTRL_I2C_FLAGS_NONSTD_SI1930UC = (0x00000001) +NV2080_CTRL_I2C_FLAGS_PRIVILEGE = (0x00000002) +NV2080_CTRL_I2C_FLAGS_DATA_ENCRYPTED = (0x00000004) +NV2080_CTRL_I2C_FLAGS_PX3540 = (0x00000010) +NV2080_CTRL_I2C_FLAGS_ADDR_AUTO_INC_NOT_SUPPORTED = (0x00000008) +NV2080_CTRL_I2C_READ_BUFFER_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_I2C_READ_BUFFER = (0x20800601) +NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_I2C_WRITE_BUFFER = (0x20800602) +NV2080_CTRL_CMD_I2C_READ_REG = (0x20800603) +NV2080_CTRL_I2C_READ_REG_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_I2C_WRITE_REG = (0x20800604) +NV2080_CTRL_I2C_WRITE_REG_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_I2C_ACCESS = (0x20800610) +NV2080_CTRL_I2C_ACCESS_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_I2C_ACCESS_CMD_ACQUIRE = 0x1 +NV2080_CTRL_I2C_ACCESS_CMD_RELEASE = 0x2 +NV2080_CTRL_I2C_ACCESS_CMD_WRITE_BYTE = 0x3 +NV2080_CTRL_I2C_ACCESS_CMD_READ_BYTE = 0x4 +NV2080_CTRL_I2C_ACCESS_CMD_NULL = 0x5 +NV2080_CTRL_I2C_ACCESS_CMD_RESET = 0x6 +NV2080_CTRL_I2C_ACCESS_CMD_TEST_PORT = 0x11 +NV2080_CTRL_I2C_ACCESS_CMD_SET_FAST_MODE = 0x12 +NV2080_CTRL_I2C_ACCESS_CMD_SET_NORMAL_MODE = 0x13 +NV2080_CTRL_I2C_ACCESS_CMD_WRITE_BUFFER = 0x14 +NV2080_CTRL_I2C_ACCESS_CMD_READ_BUFFER = 0x15 +NV2080_CTRL_I2C_ACCESS_CMD_START = 0x17 +NV2080_CTRL_I2C_ACCESS_CMD_STOP = 0x18 +NV2080_CTRL_I2C_ACCESS_CMD_SET_SLOW_MODE = 0x20 +NV2080_CTRL_I2C_ACCESS_FLAG_START = 0x1 +NV2080_CTRL_I2C_ACCESS_FLAG_STOP = 0x2 +NV2080_CTRL_I2C_ACCESS_FLAG_ACK = 0x4 +NV2080_CTRL_I2C_ACCESS_FLAG_RAB = 0x8 +NV2080_CTRL_I2C_ACCESS_FLAG_ADDR_10BITS = 0x10 +NV2080_CTRL_I2C_ACCESS_FLAG_PRIVILEGE = 0x20 +NV2080_CTRL_I2C_ACCESS_FLAG_DATA_ENCRYPTED = 0x40 +NV2080_CTRL_I2C_ACCESS_FLAG_RESTART = 0x80 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_33_33PCT = 0x100 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_33PCT = 0x200 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_10PCT = 0x400 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_3_33PCT = 0x800 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_3PCT = 0x1000 +NV2080_CTRL_I2C_ACCESS_PORT_DYNAMIC = 0x0 +NV2080_CTRL_I2C_ACCESS_PORT_PRIMARY = 0x1 +NV2080_CTRL_I2C_ACCESS_PORT_SECONDARY = 0x2 +NV2080_CTRL_I2C_ACCESS_PORT_TERTIARY = 0x3 +NV2080_CTRL_I2C_ACCESS_PORT_QUARTIARY = 0x4 +NV2080_CTRL_I2C_ACCESS_PORT_1 = 0x1 +NV2080_CTRL_I2C_ACCESS_PORT_2 = 0x2 +NV2080_CTRL_I2C_ACCESS_PORT_3 = 0x3 +NV2080_CTRL_I2C_ACCESS_PORT_4 = 0x4 +NV2080_CTRL_I2C_ACCESS_PORT_5 = 0x5 +NV2080_CTRL_I2C_ACCESS_PORT_6 = 0x6 +NV2080_CTRL_I2C_ACCESS_PORT_7 = 0x7 +NV2080_CTRL_I2C_ACCESS_PORT_8 = 0x8 +NV2080_CTRL_I2C_ACCESS_PORT_9 = 0x9 +NV2080_CTRL_I2C_ACCESS_PORT_10 = 0x10 +NV2080_CTRL_I2C_ACCESS_NUM_PORTS = NV2080_CTRL_I2C_ACCESS_PORT_10 +NV2080_CTRL_I2C_ACCESS_STATUS_SUCCESS = 0x0 +NV2080_CTRL_I2C_ACCESS_STATUS_ERROR = 0x1 +NV2080_CTRL_I2C_ACCESS_STATUS_PROTOCOL_ERROR = 0x2 +NV2080_CTRL_I2C_ACCESS_STATUS_DEVICE_BUSY = 0x3 +NV2080_CTRL_I2C_ACCESS_STATUS_NACK_AFTER_SEND = 0x4 +NV2080_CTRL_I2C_ACCESS_STATUS_DP2TMDS_DONGLE_MISSING = 0x5 +NV2080_CTRL_CMD_I2C_ENABLE_MONITOR_3D_MODE = (0x20800620) +NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_STATIC_INFO = (0x20800a01) +NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS_MESSAGE_ID = (0x1C) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_STATIC_CONFIG = (0x20800a1c) +NV2080_CTRL_CMD_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER = (0x20800a1d) +NV2080_CTRL_INTERNAL_UVM_ACCESS_CNTR_BUFFER_MAX_PAGES = 64 +NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS_MESSAGE_ID = (0x1D) +NV2080_CTRL_CMD_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER = (0x20800a1e) +NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS_MESSAGE_ID = (0x1E) +NV2080_CTRL_INTERNAL_GR_MAX_ENGINES = 8 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_CAPS = (0x20800a1f) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CAPS_PARAMS_MESSAGE_ID = (0x1F) +NV2080_CTRL_INTERNAL_GR_MAX_SM = 240 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER = (0x20800a22) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_INTERNAL_MAX_BSPS = 8 +NV2080_CTRL_CMD_INTERNAL_MAX_MSENCS = 8 +NV2080_CTRL_INTERNAL_GR_MAX_GPC = 16 +NV2080_CTRL_INTERNAL_MAX_TPC_PER_GPC_COUNT = 10 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS = (0x20800a26) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_KGR_MAX_BUFFER_PTES = 128 +NV2080_CTRL_CMD_KGR_GET_CTX_BUFFER_PTES = (0x20800a28) +NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_INFO = (0x20800a2a) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_INFO_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_ZCULL_INFO = (0x20800a2c) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_ROP_INFO = (0x20800a2e) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x2E) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_PPC_MASKS = (0x20800a30) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PPC_MASKS_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COUNT = 0x1a +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO = (0x20800a32) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO_PARAMS_MESSAGE_ID = (0x32) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x35) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER = (0x20800a34) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_CHIP_INFO = (0x20800a36) +NV2080_CTRL_INTERNAL_GET_CHIP_INFO_REG_BASE_MAX = 16 +NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE = (0x20800a37) +NV2080_CTRL_CMD_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE = (0x20800a38) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET = (0x20800a39) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET = (0x20800a3a) +NV2080_CTRL_CMD_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET = (0x20800a3b) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET_PARAMS_MESSAGE_ID = (0x3B) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE = (0x20800a3d) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS_MESSAGE_ID = (0x3C) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE_PARAMS_MESSAGE_ID = (0x3D) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS_MESSAGE_ID = (0x3E) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES = (0x20800a3f) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_INTERNAL_DEVICE_INFO_MAX_ENTRIES = 512 +NV2080_CTRL_CMD_INTERNAL_GET_DEVICE_INFO_TABLE = (0x20800a40) +NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP = (0x20800a41) +NV2080_CTRL_INTERNAL_GPU_USER_REGISTER_ACCESS_MAP_MAX_COMPRESSED_SIZE = 4096 +NV2080_CTRL_INTERNAL_GPU_USER_REGISTER_ACCESS_MAP_MAX_PROFILING_RANGES = 4096 +NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE = (0x20800a44) +NV2080_CTRL_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE = (0x20800a43) +NV2080_CTRL_CMD_INTERNAL_GPU_CHECK_CTS_ID_VALID = (0x20800a46) +NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES = (0x20800a48) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES_PARAMS_MESSAGE_ID = (0x48) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_WRITE_INST_MEM = (0x20800a49) +NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS_MESSAGE_ID = (0x49) +NV2080_CTRL_CMD_INTERNAL_RECOVER_ALL_COMPUTE_CONTEXTS = (0x20800a4a) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_IP_VERSION = (0x20800a4b) +NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS_MESSAGE_ID = (0x4B) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_SMC_MODE = (0x20800a4c) +NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS_MESSAGE_ID = (0x4C) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR = (0x20800a4d) +NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS_MESSAGE_ID = (0x4D) +NV2080_CTRL_INTERNAL_GRMGR_PARTITION_MAX_TYPES = 90 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS_MESSAGE_ID = (0x4F) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM = (0x20800a51) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_MAX_ENGINES_MASK_SIZE = 4 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS_MESSAGE_ID = (0x52) +NV2080_CTRL_INTERNAL_FIFO_MAX_RUNLIST_BUFFERS = 2 +NV2080_CTRL_INTERNAL_FIFO_MAX_RUNLIST_ID = 64 +NV2080_CTRL_CMD_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS = (0x20800a53) +NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_SET_IMP_INIT_INFO = (0x20800a54) +NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_INTERNAL_GET_EGPU_BRIDGE_INFO = (0x20800a55) +NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_NONE = (0x00000000) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_CUSTOM = (0x00000001) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_TB2 = (0x00000002) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_TB3 = (0x00000003) +NV2080_CTRL_CMD_INTERNAL_BUS_FLUSH_WITH_SYSMEMBAR = (0x20800a70) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL = (0x20800a71) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS_MESSAGE_ID = (0x71) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE = (0x20800a72) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS_MESSAGE_ID = (0x72) +NV2080_CTRL_CMD_INTERNAL_BUS_DESTROY_P2P_MAILBOX = (0x20800a73) +NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS_MESSAGE_ID = (0x73) +NV2080_CTRL_CMD_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING = (0x20800a74) +NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING = (0x20800a75) +NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS_MESSAGE_ID = (0x75) +NV2080_CTRL_CMD_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES = (0x20800a57) +NV2080_CTRL_INTERNAL_VMMU_MAX_SPA_FOR_GPA_ENTRIES = 128 +NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS_MESSAGE_ID = (0x57) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER = (0x20800a58) +NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS_MESSAGE_ID = (0x58) +NV2080_CTRL_CMD_INTERNAL_GMMU_GET_STATIC_INFO = (0x20800a59) +NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0x59) +NV2080_CTRL_CMD_INTERNAL_GR_GET_CTXSW_MODES = (0x20800a5a) +NV2080_CTRL_INTERNAL_GR_GET_CTXSW_MODES_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE = (0x20800a5b) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_INTERNAL_INTR_GET_KERNEL_TABLE = (0x20800a5c) +NV2080_CTRL_INTERNAL_INTR_MAX_TABLE_SIZE = 128 +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS_MESSAGE_ID = (0x5C) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_GR = (0x00000000) +NV2080_CTRL_CMD_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK = (0x20800a98) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS_MESSAGE_ID = (0x98) +NV2080_CTRL_CMD_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET = (0x20800a99) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS_MESSAGE_ID = (0x99) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES = (0x20800a5d) +NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS_MESSAGE_ID = (0x5D) +NV2080_CTRL_CMD_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES = (0x20800a60) +NV2080_CTRL_INTERNAL_MAX_SWIZZ_ID = 15 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS_MESSAGE_ID = (0x60) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_NUM_CHANNELS = (0x20800a61) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS_MESSAGE_ID = (0x61) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_PROFILES = (0x20800a63) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PROFILES_PARAMS_MESSAGE_ID = (0x63) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES = (0x20800a65) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS_MESSAGE_ID = (0x65) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES = (0x20800a66) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS_MESSAGE_ID = (0x66) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG = (0x20800a68) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG = (0x20800a67) +NV2080_CTRL_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS_MESSAGE_ID = (0x67) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE = (0x20800a6b) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_SIZE = 8 +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS_MESSAGE_ID = (0x6B) +NV2080_CTRL_CMD_INTERNAL_RC_WATCHDOG_TIMEOUT = (0x20800a6a) +NV2080_CTRL_CMD_INTERNAL_PERF_GET_AUX_POWER_STATE = (0x20800a81) +NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_SET_2X = (0x20800a9a) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X_MESSAGE_ID = (0x9A) +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_PSTATE = 0 +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_GPCCLK = 1 +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_LAST = NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_GPCCLK +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_NUM = (0x2) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_SET_CONTROL = (0x20800a7e) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS_MESSAGE_ID = (0x7E) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS = (0x20800a7f) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_MESSAGE_ID = (0x7F) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO = (0x20800a80) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS_MESSAGE_ID = (0x80) +NV2080_CTRL_CMD_INTERNAL_GMMU_REGISTER_FAULT_BUFFER = (0x20800a9b) +NV2080_CTRL_INTERNAL_GMMU_FAULT_BUFFER_MAX_PAGES = 256 +NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9B) +NV2080_CTRL_CMD_INTERNAL_GMMU_UNREGISTER_FAULT_BUFFER = (0x20800a9c) +NV2080_CTRL_FAULT_BUFFER_NON_REPLAYABLE = (0x00000000) +NV2080_CTRL_FAULT_BUFFER_REPLAYABLE = (0x00000001) +NV2080_CTRL_CMD_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER = (0x20800a9d) +NV2080_CTRL_INTERNAL_GMMU_CLIENT_SHADOW_FAULT_BUFFER_MAX_PAGES = 3000 +NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9D) +NV2080_CTRL_CMD_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER = (0x20800a9e) +NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9E) +NV2080_CTRL_CMD_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER = (0x20800a9f) +NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS_MESSAGE_ID = (0x9F) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_SET_3X = (0x20800aa0) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X_MESSAGE_ID = (0xA0) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_CLEAR_3X = (0x20800aa1) +NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X_MESSAGE_ID = (0xA1) +NV2080_CTRL_CMD_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO = (0x20800aa2) +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO_MAX_SKYLINES = 8 +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO_MAX_NON_SINGLETON_VGPCS = 12 +NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS_MESSAGE_ID = (0xA2) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_SET_PARTITIONING_MODE = (0x20800aa3) +NV2080_CTRL_INTERNAL_MIGMGR_SET_PARTITIONING_MODE_PARAMS_MESSAGE_ID = (0xA3) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE = (0x20800aa4) +NV2080_CTRL_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA4) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_SET_GPU_INSTANCES = (0x20800aa5) +NV2080_CTRL_INTERNAL_MIGMGR_SET_GPU_INSTANCES_PARAMS_MESSAGE_ID = (0xA5) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_GET_GPU_INSTANCES = (0x20800aa6) +NV2080_CTRL_INTERNAL_MIGMGR_GET_GPU_INSTANCES_PARAMS_MESSAGE_ID = (0xA6) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED = (0x20800a69) +NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE = (0x20800aa7) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE = (0x20800aa8) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE = (0x20800aa9) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE = (0x20800aaa) +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_MAX_ENGINES_MASK_SIZE = 4 +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA7) +NV2080_CTRL_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA8) +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA9) +NV2080_CTRL_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xAA) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT = (0x20800a6c) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS_MESSAGE_ID = (0x6c) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_ALL = (0x00000001) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_FIRST = (0x00000002) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_LAST = (0x00000004) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_NORMAL = (0x00000008) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_CLEAN = (0x00000010) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_WAIT_FB_PULL = (0x00000020) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_FLUSH_L2_ALL_RAMS_AND_CACHES = (0x20800a6d) +NV2080_CTRL_CMD_INTERNAL_BIF_GET_STATIC_INFO = (0x20800aac) +NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0xac) +NV2080_CTRL_CMD_INTERNAL_HSHUB_PEER_CONN_CONFIG = (0x20800a88) +NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS = (0x20800a8a) +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_TABLE_SIZE = 32 +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS_MESSAGE_ID = (0x8a) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_NUM_UNITS = (0x20800a8b) +NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS_MESSAGE_ID = (0x8b) +NV2080_CTRL_CMD_INTERNAL_HSHUB_NEXT_HSHUB_ID = (0x20800a8c) +NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS_MESSAGE_ID = (0x8c) +NV2080_CTRL_CMD_INTERNAL_HSHUB_EGM_CONFIG = (0x20800a8d) +NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS_MESSAGE_ID = (0x8d) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_COMPUTE_PEER_ADDR = (0x20800aad) +NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS_MESSAGE_ID = (0xae) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR = (0x20800aae) +NV2080_CTRL_CMD_INTERNAL_BIF_GET_ASPM_L1_FLAGS = (0x20800ab0) +NV2080_CTRL_INTERNAL_BIF_GET_ASPM_L1_FLAGS_PARAMS_MESSAGE_ID = (0xb0) +NV2080_CTRL_CMD_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT = (0x20800ab1) +NV2080_CTRL_CMD_INTERNAL_PERF_CF_CONTROLLERS_MAX_ACTIVE_VGPU_VM_COUNT_MAX_VALUE = 32 +NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS_MESSAGE_ID = (0xB1) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_DISABLE_NVLINK_PEERS = (0x20800a6e) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE = (0x20800a6f) +NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS_MESSAGE_ID = (0x6f) +NV2080_CTRL_CMD_INTERNAL_CCU_GET_SAMPLE_INFO = (0x20800ab2) +NV2080_CTRL_CMD_INTERNAL_CCU_MAP = (0x20800ab3) +NV2080_CTRL_INTERNAL_CCU_DEV_SHRBUF_COUNT_MAX = 1 +NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS_MESSAGE_ID = (0xB3) +NV2080_CTRL_CMD_INTERNAL_CCU_UNMAP = (0x20800ab4) +NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS_MESSAGE_ID = (0xB4) +NV2080_CTRL_CMD_INTERNAL_SET_P2P_CAPS = (0x20800ab5) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB5) +NV2080_CTRL_CMD_INTERNAL_REMOVE_P2P_CAPS = (0x20800ab6) +NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB6) +NV2080_CTRL_CMD_INTERNAL_GET_PCIE_P2P_CAPS = (0x20800ab8) +NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB8) +NV2080_CTRL_CMD_INTERNAL_BIF_SET_PCIE_RO = (0x20800ab9) +NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS_MESSAGE_ID = (0xB9) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE = (0x20800a76) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS_MESSAGE_ID = (0x76) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE = (0x20800a77) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS_MESSAGE_ID = (0x77) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xBB) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES = (0x20800aba) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xBA) +NV2080_CTRL_CMD_INTERNAL_CCU_SET_STREAM_STATE = (0x20800abd) +NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS_MESSAGE_ID = (0xBD) +NV2080_CTRL_CMD_INTERNAL_GSYNC_ATTACH_AND_INIT = (0x20800abe) +NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS_MESSAGE_ID = (0xBE) +NV2080_CTRL_CMD_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS = (0x20800abf) +NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS_MESSAGE_ID = (0xBF) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_DISPLAY_IDS = (0x20800ac0) +NV2080_MAX_NUM_HEADS = 4 +NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS_MESSAGE_ID = (0xC0) +NV2080_CTRL_CMD_INTERNAL_GSYNC_SET_STREO_SYNC = (0x20800ac1) +NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS_MESSAGE_ID = (0xC1) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES = (0x20800ac4) +NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS_MESSAGE_ID = (0xC4) +NV2080_CTRL_CMD_INTERNAL_GSYNC_IS_DISPLAYID_VALID = (0x20800ac9) +NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS_MESSAGE_ID = (0xC9) +NV2080_CTRL_CMD_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC = (0x20800aca) +NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS_MESSAGE_ID = (0xCA) +NV2080_CTRL_CMD_INTERNAL_FBSR_INIT = (0x20800ac2) +NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS_MESSAGE_ID = (0xC2) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING = (0x20800ac3) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS_MESSAGE_ID = (0xC3) +NV2080_CTRL_CMD_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB = (0x20800ac5) +NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS_MESSAGE_ID = (0xC5) +NV2080_CTRL_CMD_INTERNAL_INIT_BRIGHTC_STATE_LOAD = (0x20800ac6) +NV2080_CTRL_ACPI_DSM_READ_SIZE = (0x1000) +NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS_MESSAGE_ID = (0xC6) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS_MESSAGE_ID = (0xC7) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL = (0x20800ac7) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS_MESSAGE_ID = (0xC8) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL = (0x20800ac8) +NV2080_CTRL_CMD_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE = (0x20800acb) +NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS_MESSAGE_ID = (0xCB) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_PMGR = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_THERM = 0x01 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_SMBPBI = 0x02 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_PMGR_LOAD = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_THERM_INIT = 0x01 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_SMBPBI_OP_CLEAR = 0x02 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_SMBPBI_OP_SET = 0x03 +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC = (0x20800acc) +NV2080_CTRL_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC_PARAMS_MESSAGE_ID = (0xCC) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC = (0x20800acd) +NV2080_CTRL_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC_PARAMS_MESSAGE_ID = (0xCD) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_GET_PM1_FORCED_OFF_STATUS = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_GET_PM1_STATUS = 0x01 +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE = (0x20800ace) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS_MESSAGE_ID = (0xCE) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE = (0x20800acf) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS_MESSAGE_ID = (0xCF) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT = (0x20800ad0) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS_MESSAGE_ID = (0xD0) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT = (0x20800ad1) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS_MESSAGE_ID = (0xD1) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE = (0x20800ad2) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS_MESSAGE_ID = (0xD2) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2 = (0x20800ad3) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS_MESSAGE_ID = (0xD3) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO = (0x20800ad4) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS_MESSAGE_ID = (0xD4) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING = (0x20800ad5) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS_MESSAGE_ID = (0xD5) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE = (0x20800ad6) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS_MESSAGE_ID = (0xD6) +NV2080_CTRL_CMD_INTERNAL_GCX_ENTRY_PREREQUISITE = (0x2080a7d7) +NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS_MESSAGE_ID = (0xD7) +NV2080_CTRL_CMD_INTERNAL_PMGR_UNSET_DYNAMIC_BOOST_LIMIT = (0x20800a7b) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS = (0x20800ad8) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0xD8) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_DEPENDENCY_CHECK = (0x20800a45) +NV2080_CTRL_CMD_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS = (0x20800adb) +NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS_MESSAGE_ID = (0xDB) +NV2080_CTRL_CMD_INTERNAL_DISP_PINSETS_TO_LOCKPINS = (0x20800adc) +NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS_MESSAGE_ID = (0xDC) +NV2080_CTRL_CMD_INTERNAL_DETECT_HS_VIDEO_BRIDGE = (0x20800add) +NV2080_CTRL_CMD_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL = (0x20800ade) +NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS_MESSAGE_ID = (0xDE) +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA = (0x20800adf) +MAX_EDID_SIZE_FROM_SBIOS = 512 +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS_MESSAGE_ID = (0xDF) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_ACPI_SUBSYSTEM_ACTIVATED = (0x20800af0) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_MODESET = (0x20800af1) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_MODESET = (0x20800af2) +NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF4) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_FABRIC_PROBE_INFO = (0x208001f4) +NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF5) +NV2080_CTRL_CMD_INTERNAL_GPU_START_FABRIC_PROBE = (0x208001f5) +NV2080_CTRL_CMD_INTERNAL_GPU_STOP_FABRIC_PROBE = (0x208001f6) +NV2080_CTRL_CMD_INTERNAL_GPU_SUSPEND_FABRIC_PROBE = (0x208001f7) +NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF8) +NV2080_CTRL_CMD_INTERNAL_GPU_RESUME_FABRIC_PROBE = (0x208001f8) +NV2080_CTRL_CMD_INTERNAL_GPU_INVALIDATE_FABRIC_PROBE = (0x208001f9) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO = (0x20800af3) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0xF3) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS = (0x20800ae1) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SIZE = 3 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_KERNEL = 0 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_USER = 1 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_SCRUBBER = 2 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_COUNT = 3 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_LCE_COUNT = 6 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS_MESSAGE_ID = (0xE1) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS = (0x20800ae2) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS_MESSAGE_ID = (0xE2) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_ROTATE_KEYS = (0x20800ae5) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS_MESSAGE_ID = (0xE5) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION = (0x20800ae6) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS_MESSAGE_ID = (0xE6) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE = (0x20800ae7) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS_MESSAGE_ID = (0xE7) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY = (0x20800ae8) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS_MESSAGE_ID = (0xE8) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID = (0x20800aef) +NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS_MESSAGE_ID = (0xEF) +NV2080_CTRL_CMD_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP = (0x20800afa) +CC_AES_256_GCM_AUTH_TAG_SIZE_BYTES = (0x10) +NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS_MESSAGE_ID = (0xFA) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG = (0x20800afb) +NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS_MESSAGE_ID = (0xFB) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG = (0x20800afc) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS_MESSAGE_ID = (0xFC) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO = (0x20800afd) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS_MESSAGE_ID = (0xFD) +NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS_MESSAGE_ID = (0xFE) +NV2080_CTRL_CMD_INTERNAL_INIT_USER_SHARED_DATA = (0x20800afe) +NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS_MESSAGE_ID = (0xFF) +NV2080_CTRL_CMD_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL = (0x20800aff) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS_MESSAGE_ID = (0xE3) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_START_KEEP_OLDEST = 0x00 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_START_KEEP_NEWEST = 0x01 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_STOP = 0x02 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE = (0x208001e3) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS_MESSAGE_ID = (0xAF) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES = (0x20800aaf) +NV2080_CTRL_CMD_INTERNAL_GR_CTXSW_SETUP_BIND = (0x20800ae4) +NV2080_CTRL_INTERNAL_GR_CTXSW_SETUP_BIND_PARAMS_MESSAGE_ID = (0xE4) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS_MESSAGE_ID = (0xE9) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER = (0x20800ae9) +NV2080_CTRL_CMD_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY = (0x20800aea) +NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS_MESSAGE_ID = (0xEA) +NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS_MESSAGE_ID = (0xEB) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP = (0x20800aeb) +NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS_MESSAGE_ID = (0xEC) +NV2080_CTRL_CMD_INTERNAL_GPU_SET_ILLUM = (0x20800aec) +NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS_MESSAGE_ID = (0xED) +NV2080_CTRL_CMD_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR = (0x20800aed) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM = (0x20800a79) +NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS_MESSAGE_ID = (0x79) +NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE = (0x20800a14) +NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS_MESSAGE_ID = (0xEE) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_PF_BAR1_SPA = (0x20800aee) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_NVLINK_PEER = (0x20800a21) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x21) +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_OFF = 0x00 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_HS = 0x01 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SAFE = 0x02 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_FAULT = 0x03 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RECOVERY = 0x04 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_FAIL = 0x05 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DETECT = 0x06 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RESET = 0x07 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ENABLE_PM = 0x08 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_PM = 0x09 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SLEEP = 0x0A +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SAVE_STATE = 0x0B +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RESTORE_STATE = 0x0C +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_PRE_HS = 0x0E +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_ERR_DETECT = 0x0F +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_LANE_DISABLE = 0x10 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_LANE_SHUTDOWN = 0x11 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_TRAFFIC_SETUP = 0x12 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITPHASE1 = 0x13 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITNEGOTIATE = 0x14 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_POST_INITNEGOTIATE = 0x15 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITOPTIMIZE = 0x16 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_POST_INITOPTIMIZE = 0x17 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_HEARTBEAT = 0x18 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_CONTAIN = 0x19 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITTL = 0x1A +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITPHASE5 = 0x1B +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ALI = 0x1C +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ACTIVE_PENDING = 0x1D +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INVALID = 0xFF +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_HS = 0x00 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_SINGLE_LANE = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_LOW_POWER = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_TRAIN = 0x05 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_SAFE = 0x06 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_OFF = 0x07 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_COMMON_MODE = 0x08 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_COMMON_MODE_DISABLE = 0x09 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_DATA_READY = 0x0A +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_EQ = 0x0B +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_PRBS_EN = 0x0C +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_POST_HS = 0x0D +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_HS = 0x00 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_SINGLE_LANE = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_LOW_POWER = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_TRAIN = 0x05 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_SAFE = 0x06 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_OFF = 0x07 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_RXCAL = 0x08 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_INIT_TERM = 0x09 +NV2080_CTRL_INTERNAL_NVLINK_MAX_SEED_NUM = 6 +NV2080_CTRL_INTERNAL_NVLINK_MAX_SEED_BUFFER_SIZE = (0x7) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_DL_LINK_MODE = 0x00 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_DL_LINK_MODE = 0x01 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_TL_LINK_MODE = 0x02 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_TL_LINK_MODE = 0x03 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_TX_SUBLINK_MODE = 0x04 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_TX_SUBLINK_MODE = 0x05 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_RX_SUBLINK_MODE = 0x06 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_RX_SUBLINK_MODE = 0x07 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_RX_SUBLINK_DETECT = 0x08 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_RX_SUBLINK_DETECT = 0x09 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_WRITE_DISCOVERY_TOKEN = 0x0A +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_READ_DISCOVERY_TOKEN = 0x0B +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_TRAINING_COMPLETE = 0x0C +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_UPHY_LOAD = 0x0D +NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_INTERNAL_NVLINK_CORE_CALLBACK = (0x20800a24) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID = (0x20800a25) +NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_ALI_ENABLED = (0x20800a29) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_TYPE_PROGRAM = 0x0 +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_TYPE_RESET = 0x1 +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_HSHUB_MUX = (0x20800a42) +NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x4E) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER = (0x20800a4e) +NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER = (0x20800a50) +NV2080_CTRL_CMD_INTERNAL_LOG_OOB_XID = (0x20800a56) +NV2080_INTERNAL_OOB_XID_MESSAGE_BUFFER_SIZE = (81) +NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_TYPE_SYSMEM = 0x1 +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_TYPE_PEER = 0x2 +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS_MESSAGE_ID = (0x5F) +NV2080_CTRL_CMD_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING = (0x20800a5f) +NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS_MESSAGE_ID = (0x62) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE = (0x20800a62) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_SET = (0x00000000) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_SAVE = (0x00000001) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_RESTORE = (0x00000002) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS_MESSAGE_ID = (0x64) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROGRAM_BUFFERREADY = (0x20800a64) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS_MESSAGE_ID = (0x78) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG = (0x20800a78) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS_MESSAGE_ID = (0x7D) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK = (0x20800a7d) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION = (0x20800a82) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY = (0x20800a83) +NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS_MESSAGE_ID = (0x84) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI = (0x20800a84) +NV2080_CTRL_INTERNAL_NVLINK_MAX_ARR_SIZE = 64 +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET = (0x20800a85) +NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS_MESSAGE_ID = (0x86) +NV2080_CTRL_CMD_INTERNAL_NVLINK_LINK_TRAIN_ALI = (0x20800a86) +NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO = (0x20800a87) +NV2080_CTRL_INTERNAL_NVLINK_MAX_LINKS_PER_IOCTRL_SW = 6 +NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO = (0x20800a8e) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS_MESSAGE_ID = (0x8F) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROGRAM_LINK_SPEED = (0x20800a8f) +NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS_MESSAGE_ID = (0x90) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ARE_LINKS_TRAINED = (0x20800a90) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_ASSERT = (0x00000000) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_DEASSERT = (0x00000001) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_TOGGLE = (0x00000002) +NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS_MESSAGE_ID = (0x91) +NV2080_CTRL_CMD_INTERNAL_NVLINK_RESET_LINKS = (0x20800a91) +NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_CMD_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS = (0x20800a92) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS_MESSAGE_ID = (0x93) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO = (0x20800a93) +NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS_MESSAGE_ID = (0x94) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM = (0x20800a94) +NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS_MESSAGE_ID = (0x95) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS = (0x20800a95) +NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS = (0x20800a96) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS_MESSAGE_ID = (0x97) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS = (0x20800a97) +NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS_MESSAGE_ID = (0xAB) +NV2080_CTRL_CMD_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK = (0x20800aab) +NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x89) +NV2080_CTRL_CMD_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO = (0x20800a89) +NV2080_CTRL_INTERNAL_HFRP_INSTANCE_SIZE = 5 +NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS_MESSAGE_ID = (0x7A) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_HFRP_INFO = (0x20800a7a) +NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS_MESSAGE_ID = (0x7C) +NV2080_INTERNAL_CMC_UMD_API_TASK_CONSTRUCT = 0x0 +NV2080_INTERNAL_CMC_UMD_API_TASK_DESTROY = 0x1 +NV2080_CTRL_CMD_INTERNAL_SEND_CMC_UMD_API_OP = (0x20800a7c) +NV2080_CTRL_CMD_INTERNAL_NVLINK_REPLAY_SUPPRESSED_ERRORS = (0x20800b01) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS_MESSAGE_ID = (0x02) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_V2 = (0x20800b03) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS_MESSAGE_ID = (0x03) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS_MESSAGE_ID = (0x04) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_SM_ISSUE_THROTTLE_CTRL = (0x20800b05) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS_MESSAGE_ID = (0x05) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL = (0x20802801) +NV2080_CTRL_LPWR_DIFR_CTRL_DISABLE = (0x00000001) +NV2080_CTRL_LPWR_DIFR_CTRL_ENABLE = (0x00000002) +NV2080_CTRL_LPWR_DIFR_CTRL_SUPPORT_STATUS = (0x00000003) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_LPWR_DIFR_SUPPORTED = (0x00000001) +NV2080_CTRL_LPWR_DIFR_NOT_SUPPORTED = (0x00000002) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE = (0x20802802) +NV2080_CTRL_LPWR_DIFR_PREFETCH_SUCCESS = (0x00000001) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_OS_FLIPS_ENABLED = (0x00000002) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_INSUFFICIENT_L2_SIZE = (0x00000003) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_CE_HW_ERROR = (0x00000004) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_MC_GET_ARCH_INFO = (0x20801701) +NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_T23X = (0xE0000023) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_TU100 = (0x00000160) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GA100 = (0x00000170) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GH100 = (0x00000180) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_AD100 = (0x00000190) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GB100 = (0x000001A0) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GB200 = (0x000001B0) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_T234 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_T234D = (0x00000005) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU116 = (0x00000008) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU117 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA103 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA107 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA10B = (0x0000000B) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GH100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GH100_SOC = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD000 = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD101 = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD103 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD107 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD10B = (0x0000000B) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB110 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB112 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB200 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB202 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB203 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB205 = (0x00000005) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB206 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB207 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB20B = (0x0000000B) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB20C = (0x0000000C) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_NO_SUBREVISION = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_P = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_Q = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_R = (0x00000003) +NV2080_CTRL_CMD_MC_SERVICE_INTERRUPTS = (0x20801702) +NV2080_CTRL_MC_ENGINE_ID_GRAPHICS = 0x00000001 +NV2080_CTRL_MC_ENGINE_ID_ALL = 0xFFFFFFFF +NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_MC_GET_MANUFACTURER = (0x20801703) +NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP = (0x2080170c) +NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS = (0x2080170d) +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_MAX_ENGINES = 256 +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_MC_GET_STATIC_INTR_TABLE = (0x2080170e) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_MAX = 32 +NV2080_INTR_TYPE_NULL = (0x00000000) +NV2080_INTR_TYPE_NON_REPLAYABLE_FAULT = (0x00000001) +NV2080_INTR_TYPE_NON_REPLAYABLE_FAULT_ERROR = (0x00000002) +NV2080_INTR_TYPE_INFO_FAULT = (0x00000003) +NV2080_INTR_TYPE_REPLAYABLE_FAULT = (0x00000004) +NV2080_INTR_TYPE_REPLAYABLE_FAULT_ERROR = (0x00000005) +NV2080_INTR_TYPE_ACCESS_CNTR = (0x00000006) +NV2080_INTR_TYPE_TMR = (0x00000007) +NV2080_INTR_TYPE_CPU_DOORBELL = (0x00000008) +NV2080_INTR_TYPE_GR0_FECS_LOG = (0x00000009) +NV2080_INTR_TYPE_GR1_FECS_LOG = (0x0000000A) +NV2080_INTR_TYPE_GR2_FECS_LOG = (0x0000000B) +NV2080_INTR_TYPE_GR3_FECS_LOG = (0x0000000C) +NV2080_INTR_TYPE_GR4_FECS_LOG = (0x0000000D) +NV2080_INTR_TYPE_GR5_FECS_LOG = (0x0000000E) +NV2080_INTR_TYPE_GR6_FECS_LOG = (0x0000000F) +NV2080_INTR_TYPE_GR7_FECS_LOG = (0x00000010) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_MC_GET_INTR_CATEGORY_SUBTREE_MAP = (0x2080170f) +NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_NVD_GET_DUMP_SIZE = (0x20802401) +NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_NVD_GET_DUMP = (0x20802402) +NV2080_CTRL_NVD_GET_DUMP_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_NVD_GET_NOCAT_JOURNAL = (0x20802409) +NV2080_NOCAT_JOURNAL_MAX_DIAG_BUFFER = 1024 +NV2080_NOCAT_JOURNAL_MAX_STR_LEN = 65 +NV2080_NOCAT_JOURNAL_MAX_JOURNAL_RECORDS = 10 +NV2080_NOCAT_JOURNAL_MAX_ASSERT_RECORDS = 32 +NV2080_NOCAT_JOURNAL_REC_TYPE_UNKNOWN = 0 +NV2080_NOCAT_JOURNAL_REC_TYPE_BUGCHECK = 1 +NV2080_NOCAT_JOURNAL_REC_TYPE_ENGINE = 2 +NV2080_NOCAT_JOURNAL_REC_TYPE_TDR = 3 +NV2080_NOCAT_JOURNAL_REC_TYPE_RC = 4 +NV2080_NOCAT_JOURNAL_REC_TYPE_ASSERT = 5 +NV2080_NOCAT_JOURNAL_REC_TYPE_ANY = 6 +NV2080_NOCAT_JOURNAL_REC_TYPE_COUNT = (0x7) +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_REQ_IDX = 0 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_GRANDFATHERED_RECORD_IDX = 1 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_ALLOCATED_IDX = 2 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECTED_IDX = 3 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NOTIFICATIONS_IDX = 4 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NOTIFICATION_FAIL_IDX = 5 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_ALLOC_FAILED_IDX = 6 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_FAILED_IDX = 7 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_LOCKED_OUT_IDX = 8 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_CTRL_INSERT_RECORDS_IDX = 9 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RPC_INSERT_RECORDS_IDX = 10 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_LOCKED_IDX = 11 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_LOCK_UPDATED_IDX = 12 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_UNLOCKED_IDX = 13 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NO_RECORDS_IDX = 14 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_BUFFER_IDX = 15 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_MATCH_FOUND_IDX = 16 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NO_MATCH_IDX = 17 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_CLOSEST_FOUND_IDX = 18 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_REQUESTED_IDX = 19 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_REPORTED_IDX = 20 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_DROPPED_IDX = 21 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATE_REQ_IDX = 22 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATED_IDX = 23 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATE_FAILED_IDX = 24 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BUSY_IDX = 25 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_PARAM_IDX = 26 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_TYPE_IDX = 27 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES4_IDX = 28 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES3_IDX = 29 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES2_IDX = 30 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES1_IDX = 31 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COUNTER_COUNT = (0x20) +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY = (0, 0) +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY_YES = 1 +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY_NO = 0 +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS = (1, 1) +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS_YES = 1 +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS_NO = 0 +NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_NVD_SET_NOCAT_JOURNAL_DATA = (0x2080240b) +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_EMPTY = 0 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_TDR_REASON = 1 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_SET_TAG = 2 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_RCLOG = 3 +NV2080_CTRL_NOCAT_TDR_TYPE_NONE = 0 +NV2080_CTRL_NOCAT_TDR_TYPE_LEGACY = 1 +NV2080_CTRL_NOCAT_TDR_TYPE_FULLCHIP = 2 +NV2080_CTRL_NOCAT_TDR_TYPE_BUSRESET = 3 +NV2080_CTRL_NOCAT_TDR_TYPE_GC6_RESET = 4 +NV2080_CTRL_NOCAT_TDR_TYPE_SURPRISE_REMOVAL = 5 +NV2080_CTRL_NOCAT_TDR_TYPE_UCODE_RESET = 6 +NV2080_CTRL_NOCAT_TDR_TYPE_GPU_RC_RESET = 7 +NV2080_CTRL_NOCAT_TDR_TYPE_TEST = 8 +NV2080_CTRL_NOCAT_TAG_CLEAR = (0, 0) +NV2080_CTRL_NOCAT_TAG_CLEAR_YES = 1 +NV2080_CTRL_NOCAT_TAG_CLEAR_NO = 0 +NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD = (0x2080240c) +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR = (0, 0) +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR_YES = 1 +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR_NO = 0 +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER = (1, 1) +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER_YES = 1 +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER_NO = 0 +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_NVLINK_CAPS_TBL_SIZE = 2 +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_INVALID = (0x00000000) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_INVALID = (0x00000000) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_5_0 = (0x00000008) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS = (0x20803001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS = (31, 0) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_NONE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_PCI = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_UUID = (0x00000002) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_EBRIDGE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_NPU = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_GPU = (0x00000002) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_SWITCH = (0x00000003) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_TEGRA = (0x00000004) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_NONE = (0x000000FF) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_UUID_INVALID = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED = (0, 0) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY = (1, 1) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY_INACTIVE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY_ACTIVE = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_INIT = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_HWCFG = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_SWCFG = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_ACTIVE = (0x00000003) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_FAULT = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_SLEEP = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY_AC = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY_RX = (0x0000000a) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_INVALID = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_HIGH_SPEED_1 = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_LOW_POWER = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_TRAINING = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_SAFE_MODE = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_TEST = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_FAULT = (0x0000000e) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_HIGH_SPEED_1 = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_LOW_POWER = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_TRAINING = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_SAFE_MODE = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_TEST = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_FAULT = (0x0000000e) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_PHY_NVHS = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_PHY_GRS = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_PHY_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NVHS_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NVHS_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_GRS_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_GRS_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_CONNECTED_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_CONNECTED_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_LOOPBACK = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_LOOPOUT = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_NONE = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_REMOTE_LINK_NUMBER_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_REFCLK_TYPE_INVALID = (0x00) +NV2080_CTRL_NVLINK_REFCLK_TYPE_NVHS = (0x01) +NV2080_CTRL_NVLINK_REFCLK_TYPE_PEX = (0x02) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS = (0x20803002) +NV2080_CTRL_NVLINK_GET_TL_ERRLOG_BIT = lambda intr,i: (((1 << i) & (intr)) >> i) # type: ignore +NV2080_CTRL_NVLINK_GET_TL_INTEN_BIT = lambda intr,i: NV2080_CTRL_NVLINK_GET_TL_ERRLOG_BIT(intr, i) # type: ignore +NV2080_CTRL_NVLINK_TL_ERRLOG_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_TL_ERRLOG_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_TL_INTEN_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_TL_INTEN_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXDLDATAPARITYEN = 0 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXDLCTRLPARITYEN = 1 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXPROTOCOLEN = 2 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXOVERFLOWEN = 3 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRAMDATAPARITYEN = 4 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRAMHDRPARITYEN = 5 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRESPEN = 6 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXPOISONEN = 7 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXRAMDATAPARITYEN = 8 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXRAMHDRPARITYEN = 9 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_DLFLOWPARITYEN = 10 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_DLHDRPARITYEN = 12 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXCREDITEN = 13 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_MAX = 14 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXDLDATAPARITYERR = 0 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXDLCTRLPARITYERR = 1 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXPROTOCOLERR = 2 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXOVERFLOWERR = 3 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRAMDATAPARITYERR = 4 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRAMHDRPARITYERR = 5 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRESPERR = 6 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXPOISONERR = 7 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXRAMDATAPARITYERR = 8 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXRAMHDRPARITYERR = 9 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_DLFLOWPARITYERR = 10 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_DLHDRPARITYERR = 12 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXCREDITERR = 13 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_MAX = 14 +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_HS = (0x00000000) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_TRAIN = (0x00000005) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_SAFE = (0x00000006) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_HS = (0x00000000) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_TRAIN = (0x00000005) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_SAFE = (0x00000006) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_DEFAULT = (0x0) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_INTR_STATUS = (0x1) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_ALI_STATUS = (0x2) +NV2080_CTRL_NVLINK_MAX_IOCTRLS = 3 +NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_NVLINK_GET_ERR_INFO = (0x20803003) +NV2080_CTRL_NVLINK_COUNTER_INVALID = 0x00000000 +NV2080_CTRL_NVLINK_COUNTER_TL_TX0 = 0x00000001 +NV2080_CTRL_NVLINK_COUNTER_TL_TX1 = 0x00000002 +NV2080_CTRL_NVLINK_COUNTER_TL_RX0 = 0x00000004 +NV2080_CTRL_NVLINK_COUNTER_TL_RX1 = 0x00000008 +NV2080_CTRL_NVLINK_LP_COUNTERS_DL = 0x00000010 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L = lambda i: (1 << (i + 8)) # type: ignore +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE__SIZE = 4 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L0 = 0x00000100 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L1 = 0x00000200 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L2 = 0x00000400 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L3 = 0x00000800 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_FLIT = 0x00010000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L = lambda i: (1 << (i + 17)) # type: ignore +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE__SIZE = 8 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L0 = 0x00020000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L1 = 0x00040000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L2 = 0x00080000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L3 = 0x00100000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L4 = 0x00200000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L5 = 0x00400000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L6 = 0x00800000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L7 = 0x01000000 +NV2080_CTRL_NVLINK_COUNTER_DL_TX_ERR_REPLAY = 0x02000000 +NV2080_CTRL_NVLINK_COUNTER_DL_TX_ERR_RECOVERY = 0x04000000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_REPLAY = 0x08000000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_MASKED = 0x10000000 +NV2080_CTRL_NVLINK_COUNTER_MAX_TYPES = 32 +NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_NVLINK_GET_COUNTERS = (0x20803004) +NV2080_CTRL_CMD_NVLINK_CLEAR_COUNTERS = (0x20803005) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_NVLINK_COUNTER_TP_TL_TX0 = 0 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_TX1 = 1 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_RX0 = 2 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_RX1 = 3 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_SIZE = 4 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L0 = 4 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L1 = 5 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L2 = 6 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L3 = 7 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_SIZE = 8 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L0 = 8 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L1 = 9 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L2 = 10 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L3 = 11 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L4 = 12 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L5 = 13 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L6 = 14 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L7 = 15 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_TX_ERR_RECOVERY = 16 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_TX_ERR_REPLAY = 17 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_REPLAY = 18 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_MASKED = 19 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_FLIT = 20 +NV2080_CTRL_NVLINK_COUNTER_LP_DL = 21 +NV2080_CTRL_NVLINK_COUNTER_V1_MAX_COUNTER = NV2080_CTRL_NVLINK_COUNTER_LP_DL +NV2080_CTRL_NVLINK_COUNTER_XMIT_PACKETS = 22 +NV2080_CTRL_NVLINK_COUNTER_XMIT_BYTES = 23 +NV2080_CTRL_NVLINK_COUNTER_RCV_PACKETS = 24 +NV2080_CTRL_NVLINK_COUNTER_RCV_BYTES = 25 +NV2080_CTRL_NVLINK_COUNTER_LINK_ERROR_RECOVERY_COUNTER = 26 +NV2080_CTRL_NVLINK_COUNTER_LINK_DOWNED_COUNTER = 27 +NV2080_CTRL_NVLINK_COUNTER_LINK_RECOVERY_SUCCESSFUL_COUNTER = 28 +NV2080_CTRL_NVLINK_COUNTER_RCV_ERRORS = 29 +NV2080_CTRL_NVLINK_COUNTER_RCV_REMOTE_ERRORS = 30 +NV2080_CTRL_NVLINK_COUNTER_RCV_GENERAL_ERRORS = 31 +NV2080_CTRL_NVLINK_COUNTER_RCV_MALFORMED_PKT_ERROR = 32 +NV2080_CTRL_NVLINK_COUNTER_RCV_BUFFER_OVERRUN_ERROR = 33 +NV2080_CTRL_NVLINK_COUNTER_RCV_VL15DROPPED_ERROR = 34 +NV2080_CTRL_NVLINK_COUNTER_LINK_INTEGRITY_ERRORS = 35 +NV2080_CTRL_NVLINK_COUNTER_BUFFER_OVERRUN_ERRORS = 36 +NV2080_CTRL_NVLINK_COUNTER_XMIT_WAIT_TIME = 37 +NV2080_CTRL_NVLINK_COUNTER_XMIT_ERRORS = 38 +NV2080_CTRL_NVLINK_COUNTER_SINGLE_ERROR_BLOCKS = 39 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_BLOCKS = 40 +NV2080_CTRL_NVLINK_COUNTER_UNCORRECTED_BLOCKS = 41 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_LANE_0 = 42 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_LANE_1 = 43 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_TOTAL = 44 +NV2080_CTRL_NVLINK_COUNTER_RAW_ERRORS_LANE_0 = 45 +NV2080_CTRL_NVLINK_COUNTER_RAW_ERRORS_LANE_1 = 46 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_BITS = 47 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_LANE_0 = 48 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_LANE_1 = 49 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_TOTAL = 50 +NV2080_CTRL_NVLINK_COUNTER_NO_ERROR_BLOCKS = 51 +NV2080_CTRL_NVLINK_COUNTER_EFFECTIVE_ERRORS = 52 +NV2080_CTRL_NVLINK_COUNTER_EFFECTIVE_BER = 53 +NV2080_CTRL_NVLINK_COUNTER_SYMBOL_ERRORS = 54 +NV2080_CTRL_NVLINK_COUNTER_SYMBOL_BER = 55 +NV2080_CTRL_NVLINK_COUNTER_RECEIVED_BITS = 56 +NV2080_CTRL_NVLINK_COUNTER_SYNC_HEADER_ERRORS = 57 +NV2080_CTRL_NVLINK_COUNTER_TIME_SINCE_LAST_CLEAR = 58 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS = 59 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS_WITH_UNCORRECTABLE_ERRORS = 60 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS_WITH_ERRORS = 61 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_BLOCKS = 62 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_RETRY_BLOCKS = 63 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_RETRY_EVENTS = 64 +NV2080_CTRL_NVLINK_COUNTER_PLR_BW_LOSS = 65 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_GOOD = 66 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_ERROR = 67 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_AUTH = 68 +NV2080_CTRL_NVLINK_COUNTER_NVLE_TX_GOOD = 69 +NV2080_CTRL_NVLINK_COUNTER_NVLE_TX_ERROR = 70 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_0 = 71 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_1 = 72 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_2 = 73 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_3 = 74 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_4 = 75 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_5 = 76 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_6 = 77 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_7 = 78 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_8 = 79 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_9 = 80 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_10 = 81 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_11 = 82 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_12 = 83 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_13 = 84 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_14 = 85 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_15 = 86 +NV2080_CTRL_NVLINK_COUNTER_TP_RX_DATA = 87 +NV2080_CTRL_NVLINK_COUNTER_TP_TX_DATA = 88 +NV2080_CTRL_NVLINK_COUNTER_TP_RX_RAW = 89 +NV2080_CTRL_NVLINK_COUNTER_TP_TX_RAW = 90 +NV2080_CTRL_NVLINK_COUNTER_L1_ENTRY = 91 +NV2080_CTRL_NVLINK_COUNTER_L1_ENTRY_FORCE = 92 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT = 93 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT_RECAL = 94 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT_REMOTE = 95 +NV2080_CTRL_NVLINK_COUNTER_L1_LP_STEADY_STATE_TIME = 96 +NV2080_CTRL_NVLINK_COUNTER_L1_HIGH_SPEED_STEADY_STATE_TIME = 97 +NV2080_CTRL_NVLINK_COUNTER_L1_OTHER_STATE_TIME = 98 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_ENTRY_TIME = 99 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_EXIT_TIME = 100 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_FULL_BW_ENTRY_TIME = 101 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_FULL_BW_EXIT_TIME = 102 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_ENTRY_TIME = 103 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_EXIT_TIME = 104 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_FULL_BW_ENTRY_TIME = 105 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_FULL_BW_EXIT_TIME = 106 +NV2080_CTRL_NVLINK_COUNTERS_MAX = 107 +NV2080_CTRL_NVLINK_COUNTER_MAX_GROUPS = 2 +NV2080_CTRL_NVLINK_COUNTER_MAX_COUNTERS_PER_LINK_IN_REQ = 28 +NV2080_CTRL_NVLINK_COUNTER_V2_GROUP = lambda i: ((i) / 64) # type: ignore +NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_NVLINK_GET_COUNTERS_V2 = (0x20803050) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_CMD_NVLINK_CLEAR_COUNTERS_V2 = (0x20803051) +NV2080_CTRL_CMD_NVLINK_INJECT_ERROR = (0x20803006) +NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_NVLINK_UNIT_DL = 0x01 +NV2080_CTRL_NVLINK_UNIT_TL = 0x02 +NV2080_CTRL_NVLINK_UNIT_TLC_RX_0 = 0x03 +NV2080_CTRL_NVLINK_UNIT_TLC_RX_1 = 0x04 +NV2080_CTRL_NVLINK_UNIT_TLC_TX_0 = 0x05 +NV2080_CTRL_NVLINK_UNIT_MIF_RX_0 = 0x06 +NV2080_CTRL_NVLINK_UNIT_MIF_TX_0 = 0x07 +NV2080_CTRL_NVLINK_UNIT_MINION = 0x08 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE = (31, 28) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_NO_ERROR = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_RAW_BER = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_EFFECTIVE_BER = 0x00000002 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_ERR_INJECT_DURATION = (27, 12) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_BER_MANTISSA = (11, 8) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_BER_EXPONENT = (7, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_INJECT_COUNT = (15, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP = (16, 16) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON = (17, 17) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_CLEAR_COUNTERS = (18, 18) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_PIPE_INDEX = (3, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR = (4, 4) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN = (0, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN_EN = 0x00000001 +NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_NVLINK_SET_HW_ERROR_INJECT = (0x20803081) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE = (1, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_UP = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_DOWN_BY_REQUEST = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_DOWN_BY_HW_ERR = 0x00000002 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS = (0, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS_NO_ERR_INJECT = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS_PERFORMING_ERR_INJECT = 0x00000001 +NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_NVLINK_GET_HW_ERROR_INJECT = (0x20803082) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES = (0x20803007) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE = (0x20803008) +NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FATAL_ERROR_COUNTS = (0x20803009) +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_DL_DATA_PARITY = 0 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_DL_CTRL_PARITY = 1 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_PROTOCOL = 2 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_OVERFLOW = 3 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RAM_DATA_PARITY = 4 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RAM_HDR_PARITY = 5 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RESP = 6 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_POISON = 7 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_RAM_DATA_PARITY = 8 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_RAM_HDR_PARITY = 9 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_CREDIT = 10 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_DL_FLOW_CTRL_PARITY = 11 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_DL_HDR_PARITY = 12 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_RECOVERY_LONG = 13 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_RAM = 14 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_INTERFACE = 15 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_SUBLINK_CHANGE = 16 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_RX_FAULT_SUBLINK_CHANGE = 17 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_RX_FAULT_DL_PROTOCOL = 18 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT = 19 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_DATA_PARITY = 0 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_CTRL_PARITY = 1 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RAM_DATA_PARITY = 4 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RAM_HDR_PARITY = 5 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DATA_POISONED_PKT_RCVD = 7 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RAM_DATA_PARITY = 8 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RAM_HDR_PARITY = 9 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DL_FLOW_CONTROL_PARITY = 11 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_HDR_PARITY = 20 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_AE_FLIT_RCVD = 21 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_BE_FLIT_RCVD = 22 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_ADDR_ALIGN = 23 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_PKT_LEN = 24 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CMD_ENC = 25 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_DAT_LEN_ENC = 26 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_ADDR_TYPE = 27 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_RSP_STATUS = 28 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_PKT_STATUS = 29 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CACHE_ATTR_ENC_IN_PROBE_REQ = 30 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CACHE_ATTR_ENC_IN_PROBE_RESP = 31 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_GT_ATOMIC_REQ_MAX_SIZE = 32 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_GT_RMW_REQ_MAX_SIZE = 33 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_LT_ATR_RESP_MIN_SIZE = 34 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_PO_FOR_CACHE_ATTR = 35 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_COMPRESSED_RESP = 36 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RESP_STATUS_TARGET = 37 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RESP_STATUS_UNSUPPORTED_REQUEST = 38 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_HDR_OVERFLOW = 39 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DATA_OVERFLOW = 40 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_STOMPED_PKT_RCVD = 41 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_CORRECTABLE_INTERNAL = 42 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_VC_OVERFLOW = 43 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_NVLINK_CREDIT_RELEASE = 44 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_NCISOC_CREDIT_RELEASE = 45 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_HDR_CREDIT_OVERFLOW = 46 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DATA_CREDIT_OVERFLOW = 47 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DL_REPLAY_CREDIT_OVERFLOW = 48 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_UNSUPPORTED_VC_OVERFLOW = 49 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_STOMPED_PKT_SENT = 50 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DATA_POISONED_PKT_SENT = 51 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RESP_STATUS_TARGET = 52 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RESP_STATUS_UNSUPPORTED_REQUEST = 53 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_RX_RAM_DATA_PARITY = 54 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_RX_RAM_HDR_PARITY = 55 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_TX_RAM_DATA_PARITY = 56 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_TX_RAM_HDR_PARITY = 57 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_COLLAPSED_RESPONSE = 58 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_NCISOC_HDR_ECC_DBE = 59 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_NCISOC_PARITY = 60 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT_UP = 61 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT_DOWN = 62 +NV2080_CTRL_NVLINK_NUM_FATAL_ERROR_TYPES = 63 +NV2080_CTRL_NVLINK_IS_FATAL_ERROR_COUNT_VALID = lambda count,supportedCounts: ( not not ((supportedCounts) & NVBIT64(count))) # type: ignore +NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_NVLINK_GET_LINK_NONFATAL_ERROR_RATES = (0x2080300a) +NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE_ENTRIES = 5 +NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_NVLINK_SET_ERROR_INJECTION_MODE = (0x2080300b) +NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM = (0x2080300c) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_NVLINK_SET_POWER_STATE = (0x2080300d) +NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_NVLINK_POWER_STATE_L0 = (0x00) +NV2080_CTRL_NVLINK_POWER_STATE_L1 = (0x01) +NV2080_CTRL_NVLINK_POWER_STATE_L2 = (0x02) +NV2080_CTRL_NVLINK_POWER_STATE_L3 = (0x03) +NV2080_CTRL_CMD_NVLINK_GET_POWER_STATE = (0x2080300e) +NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_NVLINK_INJECT_TLC_ERROR = (0x2080300f) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES = (0x20803011) +NV2080_CTRL_NVLINK_MAX_LANES = 4 +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_NVLINK_SET_NVLINK_PEER = (0x20803012) +NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_NVLINK_READ_UPHY_PAD_LANE_REG = (0x20803013) +NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_ECC_ERRORS = (0x20803014) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_DATA_TX = 0 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_DATA_RX = 1 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_RAW_TX = 2 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_RAW_RX = 3 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_MAX = 4 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_NVLINK_READ_TP_COUNTERS = (0x20803015) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE = (0x20803016) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_NVHS = 0 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_EIGHTH = 1 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_OTHER = 2 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_NUM_TX_LP_ENTER = 3 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_NUM_TX_LP_EXIT = 4 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_SLEEP = 5 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_HS_TIME = 6 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_FULL_BW_EXIT_TIME = 7 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_LP_ENTRY_TIME = 8 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_LP_EXIT_TIME = 9 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_FULL_BW_ENTRY_TIME = 10 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_FULL_BW_EXIT_TIME = 11 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_LP_ENTRY_TIME = 12 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_LP_EXIT_TIME = 13 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_FULL_BW_ENTRY_TIME = 14 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_OTHER_STATE_TIME = 15 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_MAX_COUNTERS = 16 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_NVLINK_GET_LP_COUNTERS = (0x20803018) +NV2080_CTRL_CMD_NVLINK_CLEAR_LP_COUNTERS = (0x20803052) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_DEFAULT = (0x00000000) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEA = (0x00000001) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEDR = (0x00000002) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEDW = (0x00000003) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PHY_REMOTE = (0x00000004) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PHY_LOCAL = (0x00000005) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_EXT_LOCAL = (0x00000006) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_NVLINK_SET_LOOPBACK_MODE = (0x20803023) +NV2080_CTRL_NVLINK_MAX_LINK_COUNT = 32 +NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_NVLINK_GET_REFRESH_COUNTERS = (0x20803028) +NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_NVLINK_CLEAR_REFRESH_COUNTERS = (0x20803029) +NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_NVLINK_GET_SET_NVSWITCH_FLA_ADDR = (0x20803038) +NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO = (0x20803039) +NV2080_CTRL_CMD_NVLINK_ENABLE_LINKS = (0x2080303a) +NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS_MESSAGE_ID = (0x3b) +NV2080_CTRL_CMD_NVLINK_PROCESS_INIT_DISABLED_LINKS = (0x2080303b) +NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS_MESSAGE_ID = (0x3c) +NV2080_CTRL_CMD_NVLINK_EOM_CONTROL = (0x2080303c) +NV2080_CTRL_NVLINK_INBAND_MAX_DATA_SIZE = 5120 +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_MESSAGE_ID = (0x3d) +NV2080_CTRL_CMD_READ_NVLINK_INBAND_RESPONSE = (0x2080303d) +NV2080_CTRL_NVLINK_L1_THRESHOLD_VALUE_DEFAULT = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS_MESSAGE_ID = (0x3e) +NV2080_CTRL_CMD_NVLINK_SET_L1_THRESHOLD = (0x2080303e) +NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS_MESSAGE_ID = (0x3f) +NV2080_CTRL_CMD_NVLINK_GET_L1_THRESHOLD = (0x2080303f) +NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_NVLINK_INBAND_SEND_DATA = (0x20803040) +NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_CMD_NVLINK_IS_GPU_DEGRADED = (0x20803041) +NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_NVLINK_DIRECT_CONNECT_CHECK = (0x20803042) +NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_CMD_NVLINK_POST_FAULT_UP = (0x20803043) +NV2080_CTRL_NVLINK_PORT_EVENT_COUNT_SIZE = 64 +NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_NVLINK_GET_PORT_EVENTS = (0x20803044) +NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS_MESSAGE_ID = (0x45) +NV2080_CTRL_CMD_NVLINK_CYCLE_LINK = (0x20803045) +NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_CMD_NVLINK_IS_REDUCED_CONFIG = (0x20803046) +NV2080_CTRL_NVLINK_PRM_ACCESS_MAX_LENGTH = 496 +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PAOS = (0x20803047) +NV2080_CTRL_NVLINK_PRM_ACCESS_PAOS_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PLTC = (0x20803053) +NV2080_CTRL_NVLINK_PRM_ACCESS_PLTC_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPLM = (0x20803054) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPLM_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPSLC = (0x20803055) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLC_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MCAM = (0x20803056) +NV2080_CTRL_NVLINK_PRM_ACCESS_MCAM_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTECR = (0x2080305c) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTECR_PARAMS_MESSAGE_ID = (0x5c) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTEWE = (0x2080305e) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTEWE_PARAMS_MESSAGE_ID = (0x5e) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTSDE = (0x2080305f) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTSDE_PARAMS_MESSAGE_ID = (0x5f) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTCAP = (0x20803061) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTCAP_PARAMS_MESSAGE_ID = (0x61) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PMTU = (0x20803062) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMTU_PARAMS_MESSAGE_ID = (0x62) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PMLP = (0x20803064) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMLP_PARAMS_MESSAGE_ID = (0x64) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_GHPKT = (0x20803065) +NV2080_CTRL_NVLINK_PRM_ACCESS_GHPKT_PARAMS_MESSAGE_ID = (0x65) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PDDR = (0x20803066) +NV2080_CTRL_NVLINK_PRM_ACCESS_PDDR_PARAMS_MESSAGE_ID = (0x66) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPTT = (0x20803068) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPTT_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPCNT = (0x20803069) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPCNT_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MGIR = (0x2080306a) +NV2080_CTRL_NVLINK_PRM_ACCESS_MGIR_PARAMS_MESSAGE_ID = (0x6a) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPAOS = (0x2080306b) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPAOS_PARAMS_MESSAGE_ID = (0x6b) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPHCR = (0x2080306c) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPHCR_PARAMS_MESSAGE_ID = (0x6c) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_SLTP = (0x2080306d) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLTP_PARAMS_MESSAGE_ID = (0x6d) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PGUID = (0x2080306e) +NV2080_CTRL_NVLINK_PRM_ACCESS_PGUID_PARAMS_MESSAGE_ID = (0x6e) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPRT = (0x2080306f) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPRT_PARAMS_MESSAGE_ID = (0x6f) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PTYS = (0x20803070) +NV2080_CTRL_NVLINK_PRM_ACCESS_PTYS_PARAMS_MESSAGE_ID = (0x70) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_SLRG = (0x20803071) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLRG_PARAMS_MESSAGE_ID = (0x71) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PMAOS = (0x20803072) +NV2080_CTRL_NVLINK_PRM_ACCESS_PMAOS_PARAMS_MESSAGE_ID = (0x72) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPLR = (0x20803073) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPLR_PARAMS_MESSAGE_ID = (0x73) +NV2080_CTRL_CMD_NVLINK_GET_SUPPORTED_COUNTERS = (0x20803074) +NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MORD = (0x20803075) +NV2080_CTRL_NVLINK_PRM_ACCESS_MORD_PARAMS_MESSAGE_ID = (0x75) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTRC_CAP = (0x20803076) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CAP_PARAMS_MESSAGE_ID = (0x76) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTRC_CONF = (0x20803077) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CONF_PARAMS_MESSAGE_ID = (0x77) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTRC_CTRL = (0x20803078) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTRC_CTRL_PARAMS_MESSAGE_ID = (0x78) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTEIM = (0x20803079) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTEIM_PARAMS_MESSAGE_ID = (0x79) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTIE = (0x2080307a) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTIE_PARAMS_MESSAGE_ID = (0x7a) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTIM = (0x2080307b) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTIM_PARAMS_MESSAGE_ID = (0x7b) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MPSCR = (0x2080307c) +NV2080_CTRL_NVLINK_PRM_ACCESS_MPSCR_PARAMS_MESSAGE_ID = (0x7c) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MTSR = (0x2080307d) +NV2080_CTRL_NVLINK_PRM_ACCESS_MTSR_PARAMS_MESSAGE_ID = (0x7d) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPSLS = (0x2080307e) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPSLS_PARAMS_MESSAGE_ID = (0x7e) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MLPC = (0x2080307f) +NV2080_CTRL_NVLINK_PRM_ACCESS_MLPC_PARAMS_MESSAGE_ID = (0x7f) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PLIB = (0x20803080) +NV2080_CTRL_NVLINK_PRM_ACCESS_PLIB_PARAMS_MESSAGE_ID = (0x80) +NV2080_CTRL_CMD_NVLINK_GET_PLATFORM_INFO = (0x20803083) +NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_CMD_NVLINK_READ_UPHY_CLN = (0x20803084) +NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS_MESSAGE_ID = (0x84) +NV2080_CTRL_NVLINK_SUPPORTED_MAX_BW_MODE_COUNT = 23 +NV2080_CTRL_CMD_NVLINK_GET_SUPPORTED_BW_MODE = (0x20803085) +NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_NVLINK_SET_BW_MODE = (0x20803086) +NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS_MESSAGE_ID = (0x86) +NV2080_CTRL_CMD_NVLINK_GET_BW_MODE = (0x20803087) +NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_NVLINK_GET_LOCAL_DEVICE_INFO = (0x20803088) +NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_CMD_NVLINK_INJECT_SW_ERROR = (0x20803089) +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS_MESSAGE_ID = (0x89) +NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY = (0x2080308c) +NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS_MESSAGE_ID = (0x8c) +NV2080_CTRL_NVLINK_GET_NVLE_LIDS = (0x2080308d) +NV2080_CTRL_NVLINK_GET_NVLE_LIDS_PARAMS_MESSAGE_ID = (0x8d) +NV2080_CTRL_CMD_NVLINK_POST_LAZY_ERROR_RECOVERY = (0x2080308a) +NV2080_CTRL_CMD_NVLINK_CONFIGURE_L1_TOGGLE = (0x2080308e) +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_NVLINK_GET_L1_TOGGLE = (0x2080308f) +NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS_MESSAGE_ID = (0x8F) +NV2080_CTRL_CMD_NVLINK_GET_NVLE_ENCRYPT_EN_INFO = (0x2080308b) +NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS_MESSAGE_ID = (0x8b) +NV2080_CTRL_NVLINK_PRM_ACCESS_MCSR_DATA_SIZE = (0x10) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_MCSR = (0x20803090) +NV2080_CTRL_NVLINK_PRM_ACCESS_MCSR_PARAMS_MESSAGE_ID = (0x90) +NV2080_CTRL_NVLINK_FIRMWARE_VERSION_LENGTH = (0x10) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_MSE = (0x01) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_NETIR = (0x02) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_NETIR_UPHY = (0x03) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_NETIR_CLN = (0x04) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_NETIR_DLN = (0x05) +NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO = (0x20803091) +NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS_MESSAGE_ID = (0x91) +NV2080_CTRL_CMD_NVLINK_SET_NVLE_ENABLED_STATE = (0x20803092) +NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PTASV2 = (0x20803093) +NV2080_CTRL_NVLINK_PRM_ACCESS_PTASV2_PARAMS_MESSAGE_ID = (0x93) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_SLLM_5NM = (0x20803094) +NV2080_CTRL_NVLINK_PRM_ACCESS_SLLM_5NM_PARAMS_MESSAGE_ID = (0x94) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS = (0x20803095) +NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS_MESSAGE_ID = (0x95) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS_PPRM = (0x20803096) +NV2080_CTRL_NVLINK_PRM_ACCESS_PPRM_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS_MESSAGE_ID = (0x9A) +NV2080_CTRL_CMD_NVLINK_SAVE_NODE_HOSTNAME = (0x2080309a) +NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS_MESSAGE_ID = (0x9B) +NV2080_CTRL_CMD_NVLINK_GET_SAVED_NODE_HOSTNAME = (0x2080309b) +NV2080_CTRL_NVLINK_MAX_LINKS = 64 +NV2080_CTRL_NVLINK_MAX_ARR_SIZE = 64 +NV2080_CTRL_NVLINK_MAX_MASK_SIZE = (0x1) +NV_SUBPROC_NAME_MAX_LENGTH = 100 +NV2080_CTRL_PERF_BOOST_FLAGS_CMD = (1, 0) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_CLEAR = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_BOOST_1LEVEL = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_BOOST_TO_MAX = (0x00000002) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA = (4, 4) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_NO = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_YES = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC = (5, 5) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC_NO = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC_YES = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY = (6, 6) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY_DEFAULT = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY_HIGH = (0x00000001) +NV2080_CTRL_PERF_BOOST_DURATION_MAX = 3600 +NV2080_CTRL_PERF_BOOST_DURATION_INFINITE = 0xffffffff +NV2080_CTRL_CMD_PERF_BOOST = (0x2080200a) +NV2080_CTRL_PERF_BOOST_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_PERF_RESERVE_PERFMON_HW = (0x20802093) +NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS_MESSAGE_ID = (0x93) +NV2080_CTRL_PERF_POWER_SOURCE_AC = (0x00000000) +NV2080_CTRL_PERF_POWER_SOURCE_BATTERY = (0x00000001) +NV2080_CTRL_CMD_PERF_SET_POWERSTATE = (0x2080205b) +NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_PERF_SET_AUX_POWER_STATE = (0x20802092) +NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_PERF_AUX_POWER_STATE_P0 = (0x00000000) +NV2080_CTRL_PERF_AUX_POWER_STATE_P1 = (0x00000001) +NV2080_CTRL_PERF_AUX_POWER_STATE_P2 = (0x00000002) +NV2080_CTRL_PERF_AUX_POWER_STATE_P3 = (0x00000003) +NV2080_CTRL_PERF_AUX_POWER_STATE_P4 = (0x00000004) +NV2080_CTRL_PERF_AUX_POWER_STATE_COUNT = (0x00000005) +NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_MESSAGE_ID = (0x6D) +NV2080_CTRL_CMD_PERF_RATED_TDP_GET_CONTROL = (0x2080206e) +NV2080_CTRL_PERF_RATED_TDP_GET_CONTROL_PARAMS_MESSAGE_ID = (0x6E) +NV2080_CTRL_CMD_PERF_RATED_TDP_SET_CONTROL = (0x2080206f) +NV2080_CTRL_PERF_RATED_TDP_SET_CONTROL_PARAMS_MESSAGE_ID = (0x6F) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_PARAM_MESSAGE_ID = (0x83) +NV2080_CTRL_PERF_GPUMON_SAMPLE_COUNT_PERFMON_UTIL = 72 +NV2080_CTRL_CMD_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2 = (0x20802096) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_PERF_GPU_IS_IDLE = (0x20802089) +NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS_MESSAGE_ID = (0x89) +NV2080_CTRL_PERF_GPU_IS_IDLE_TRUE = (0x00000001) +NV2080_CTRL_PERF_GPU_IS_IDLE_FALSE = (0x00000002) +NV2080_CTRL_CMD_PERF_AGGRESSIVE_PSTATE_NOTIFY = (0x2080208f) +NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS_MESSAGE_ID = (0x8F) +NV2080_CTRL_PERF_CLK_MAX_DOMAINS = 32 +NV2080_CTRL_CMD_PERF_GET_LEVEL_INFO = (0x20802002) +NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_PERF_GET_LEVEL_INFO_V2 = (0x2080200b) +NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE = (0, 0) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE_DEFAULT = (0x00000000) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE_OVERCLOCK = (0x00000001) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE = (2, 1) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_NONE = (0x00000000) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_DESKTOP = (0x00000001) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_MAXPERF = (0x00000002) +NV2080_CTRL_CMD_PERF_GET_VID_ENG_PERFMON_SAMPLE = (0x20802087) +NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_PERF_GET_POWERSTATE = (0x2080205a) +NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_PERF_NOTIFY_VIDEOEVENT = (0x2080205d) +NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS_MESSAGE_ID = (0x5D) +NV2080_CTRL_PERF_VIDEOEVENT_EVENT_MASK = (0x0000ffff) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_START = (0x00000001) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_STOP = (0x00000002) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_START = NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_START +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_STOP = NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_STOP +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_SD_START = (0x00000003) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_SD_STOP = (0x00000004) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_4K_START = (0x00000005) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_4K_STOP = (0x00000006) +NV2080_CTRL_PERF_VIDEOEVENT_OFA_START = (0x00000007) +NV2080_CTRL_PERF_VIDEOEVENT_OFA_STOP = (0x00000008) +NV2080_CTRL_PERF_VIDEOEVENT_FLAG_LINEAR_MODE = (0x00010000) +NV2080_CTRL_PERF_PSTATES_UNDEFINED = (0x00000000) +NV2080_CTRL_PERF_PSTATES_CLEAR_FORCED = (0x00000000) +NV2080_CTRL_PERF_PSTATES_MIN = (0x00000001) +NV2080_CTRL_PERF_PSTATES_P0 = (0x00000001) +NV2080_CTRL_PERF_PSTATES_P1 = (0x00000002) +NV2080_CTRL_PERF_PSTATES_P2 = (0x00000004) +NV2080_CTRL_PERF_PSTATES_P3 = (0x00000008) +NV2080_CTRL_PERF_PSTATES_P4 = (0x00000010) +NV2080_CTRL_PERF_PSTATES_P5 = (0x00000020) +NV2080_CTRL_PERF_PSTATES_P6 = (0x00000040) +NV2080_CTRL_PERF_PSTATES_P7 = (0x00000080) +NV2080_CTRL_PERF_PSTATES_P8 = (0x00000100) +NV2080_CTRL_PERF_PSTATES_P9 = (0x00000200) +NV2080_CTRL_PERF_PSTATES_P10 = (0x00000400) +NV2080_CTRL_PERF_PSTATES_P11 = (0x00000800) +NV2080_CTRL_PERF_PSTATES_P12 = (0x00001000) +NV2080_CTRL_PERF_PSTATES_P13 = (0x00002000) +NV2080_CTRL_PERF_PSTATES_P14 = (0x00004000) +NV2080_CTRL_PERF_PSTATES_P15 = (0x00008000) +NV2080_CTRL_PERF_PSTATES_MAX = NV2080_CTRL_PERF_PSTATES_P15 +NV2080_CTRL_PERF_PSTATES_SKIP_ENTRY = (0x10000) +NV2080_CTRL_PERF_PSTATES_ALL = (0xffff) +NV2080_CTRL_CMD_PERF_GET_CURRENT_PSTATE = (0x20802068) +NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_PERF_GET_TEGRA_PERFMON_SAMPLE = (0x20802069) +NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_NOT_SUPPORTED = 0 +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_SUPPORTED = 1 +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_NOT_APPLICABLE = 2 +NV2080_CTRL_PMGR_MODULE_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_PMGR_GET_MODULE_INFO = (0x20802609) +NV2080_CTRL_CMD_GC6_ENTRY = (0x2080270d) +NV2080_CTRL_GC6_ENTRY_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_GC6_EXIT = (0x2080270e) +NV2080_CTRL_GC6_EXIT_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_RC_READ_VIRTUAL_MEM = (0x20802204) +NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_RC_GET_ERROR_COUNT = (0x20802205) +NV2080_CTRL_RC_ERROR_PARAMS_BUFFER_SIZE = (0x2000) +NV2080_CTRL_CMD_RC_GET_ERROR = (0x20802206) +NV2080_CTRL_RC_GET_ERROR_V2_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_RC_GET_ERROR_V2 = (0x20802213) +NV2080_CTRL_CMD_RC_SET_CLEAN_ERROR_HISTORY = (0x20802207) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_RC_GET_WATCHDOG_INFO = (0x20802209) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_NONE = (0x00000000) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_DISABLED = (0x00000001) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_RUNNING = (0x00000002) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_INITIALIZED = (0x00000004) +NV2080_CTRL_CMD_RC_DISABLE_WATCHDOG = (0x2080220a) +NV2080_CTRL_CMD_RC_ENABLE_WATCHDOG = (0x2080220b) +NV2080_CTRL_CMD_RC_RELEASE_WATCHDOG_REQUESTS = (0x2080220c) +NV2080_CTRL_CMD_SET_RC_RECOVERY = (0x2080220d) +NV2080_CTRL_SET_RC_RECOVERY_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_GET_RC_RECOVERY = (0x2080220e) +NV2080_CTRL_GET_RC_RECOVERY_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_RC_RECOVERY_DISABLED = (0x00000000) +NV2080_CTRL_CMD_RC_RECOVERY_ENABLED = (0x00000001) +NV2080_CTRL_CMD_TDR_SET_TIMEOUT_STATE = (0x2080220f) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_CMD_GPU_RESET_BEGIN = (0x00000000) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_CMD_GPU_RESET_END = (0x00000001) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_STATUS_SUCCESS = (0x00000000) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_STATUS_FAIL = (0x00000001) +NV2080_CTRL_CMD_RC_SOFT_DISABLE_WATCHDOG = (0x20802210) +NV2080_CTRL_CMD_SET_RC_INFO = (0x20802211) +NV2080_CTRL_SET_RC_INFO_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GET_RC_INFO = (0x20802212) +NV2080_CTRL_GET_RC_INFO_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_RC_INFO_MODE_DISABLE = (0x00000000) +NV2080_CTRL_CMD_RC_INFO_MODE_ENABLE = (0x00000001) +NV2080_CTRL_CMD_RC_INFO_BREAK_DISABLE = (0x00000000) +NV2080_CTRL_CMD_RC_INFO_BREAK_ENABLE = (0x00000001) +RM_GSP_SPDM_CMD_ID_CC_INIT = (0x1) +RM_GSP_SPDM_CMD_ID_CC_DEINIT = (0x2) +RM_GSP_SPDM_CMD_ID_CC_CTRL = (0x3) +RM_GSP_SPDM_CMD_ID_CC_INIT_RM_DATA = (0x4) +RM_GSP_SPDM_CMD_ID_CC_HEARTBEAT_CTRL = (0x5) +RM_GSP_SPDM_CMD_ID_FIPS_SELFTEST = (0x6) +RM_GSP_SPDM_CMD_ID_INVALID_COMMAND = (0xFF) +SPDM_SESSION_ESTABLISHMENT_TRANSCRIPT_BUFFER_SIZE = 0x2400 +RSVD7_SIZE = 16 +RSVD8_SIZE = 2 +CE_FIPS_SELF_TEST_DATA_SIZE = 16 +CE_FIPS_SELF_TEST_AUTH_TAG_SIZE = 16 +CE_FIPS_SELF_TEST_IV_SIZE = 12 +RM_GSP_SPDM_MSG_ID_CC_INIT = (0x1) +RM_GSP_SPDM_MSG_ID_CC_DEINIT = (0x2) +RM_GSP_SPDM_MSG_ID_CC_CTRL = (0x3) +RM_GSP_SPDM_MSG_ID_CC_INIT_RM_DATA = (0x4) +RM_GSP_SPDM_MSG_ID_CC_HEARTBEAT_CTRL = (0x5) +RM_GSP_SPDM_MSG_ID_FIPS_SELFTEST = (0x6) +RM_GSP_SPDM_MSG_ID_INVALID_COMMAND = (0xFF) +NV2080_CTRL_INTERNAL_SPDM_PARTITION = (0x20800ad9) +NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS_MESSAGE_ID = (0xD9) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT = (0x20800ada) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS_MESSAGE_ID = (0xDA) +THERMAL_SYSTEM_API_VER = 1 +THERMAL_SYSTEM_API_REV = 0 +NV2080_CTRL_THERMAL_SYSTEM_TARGET_NONE = (0x00000000) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_GPU = (0x00000001) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_MEMORY = (0x00000002) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_POWER_SUPPLY = (0x00000004) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_BOARD = (0x00000008) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_UNKNOWN = (0xFFFFFFFF) +NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_FLAGS_DEFAULT = (0x00000000) +NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_FLAGS_IGNORE_FAIL = (0x00000001) +NV2080_CTRL_CMD_THERMAL_SYSTEM_EXECUTE_V2 = (0x20800513) +NV2080_CTRL_CMD_THERMAL_SYSTEM_EXECUTE_V2_PHYSICAL = (0x20808513) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPCODE = (0x00000100) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPCODE = (0x00000101) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPCODE = (0x00000301) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPCODE = (0x00000500) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPCODE = (0x00000510) +NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPCODE = (0x00001500) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPCODE = (0x00000520) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPCODE = (0x00000540) +NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_MAX_COUNT = 0x20 +NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_TIMER_SCHEDULE = (0x20800401) +NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME = (0, 0) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME_ABS = (0x00000000) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME_REL = (0x00000001) +NV2080_CTRL_CMD_TIMER_CANCEL = (0x20800402) +NV2080_CTRL_CMD_TIMER_GET_TIME = (0x20800403) +NV2080_CTRL_TIMER_GET_TIME_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_TIMER_GET_REGISTER_OFFSET = (0x20800404) +NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO = (0x20800406) +NV2080_CTRL_TIMER_GPU_CPU_TIME_MAX_SAMPLES = 16 +NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS_MESSAGE_ID = (0x6) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_SOURCE = (3, 0) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_OSTIME = (0x00000001) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_TSC = (0x00000002) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PLATFORM_API = (0x00000003) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_GSP_OS = (0x00000004) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR = (7, 4) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR_CPU = (0x00000000) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR_GSP = (0x00000001) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ = (0x20800407) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_OS_UNIX_GC6_BLOCKER_REFCNT = (0x20803d01) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_INC = (0x00000001) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_DEC = (0x00000002) +NV2080_CTRL_CMD_OS_UNIX_ALLOW_DISALLOW_GCOFF = (0x20803d02) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_ALLOW = (0x00000001) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_DISALLOW = (0x00000002) +NV2080_CTRL_CMD_OS_UNIX_AUDIO_DYNAMIC_POWER = (0x20803d03) +NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_OS_UNIX_INSTALL_PROFILER_HOOKS = (0x20803d04) +NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_OS_UNIX_FLUSH_SNAPSHOT_BUFFER = (0x20803d05) +NV2080_CTRL_CMD_OS_UNIX_STOP_PROFILER = (0x20803d06) +NV2080_CTRL_CMD_OS_UNIX_VIDMEM_PERSISTENCE_STATUS = (0x20803d07) +NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_OS_UNIX_UPDATE_TGP_STATUS = (0x20803d08) +NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK = (0x20804001) +NV2080_CTRL_MAX_VMMU_SEGMENTS = 384 +NV2080_GPU_MAX_ENGINES = 0x54 +NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK = (0x20804002) +NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE = (0x20804003) +NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU = (0x20804004) +NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO = (0x20804005) +NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE = (0x20804006) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY = (0x20804007) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP = (0x20804008) +NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_MAX_NVU32_TO_CONVERTED_STR_LEN = 8 +NV2080_CTRL_MAX_GPC_COUNT = 32 +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING = (0x20804009) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT = (0x2080400a) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG = (0x2080400b) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_FREE_STATES = (0x2080400c) +NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_FRAME_RATE_LIMITER_STATUS = (0x2080400d) +NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE = (0x2080400e) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE = (0x2080400f) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE = (0x20804010) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS_MESSAGE_ID = (0x10) +NV83DE_CTRL_RESERVED = (0x00) +NV83DE_CTRL_GR = (0x01) +NV83DE_CTRL_FIFO = (0x02) +NV83DE_CTRL_DEBUG = (0x03) +NV83DE_CTRL_INTERNAL = (0x04) +NV83DE_CTRL_CMD_NULL = (0x83de0000) +NV83DE_CTRL_CMD_SM_DEBUG_MODE_ENABLE = (0x83de0301) +NV83DE_CTRL_CMD_SM_DEBUG_MODE_DISABLE = (0x83de0302) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG = (0x83de0307) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_MESSAGE_ID = (0x7) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG_DISABLE = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_RELEASE_MMU_DEBUG_REQUESTS = (0x00000003) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG = (0x83de0308) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_MESSAGE_ID = (0x8) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG_DISABLED = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_SET_EXCEPTION_MASK = (0x83de0309) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_MESSAGE_ID = (0x9) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_FATAL = (0x00000001) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_TRAP = (0x00000002) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_SINGLE_STEP = (0x00000004) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_INT = (0x00000008) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_CILP = (0x00000010) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PREEMPTION_STARTED = (0x00000020) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_NONE = (0x00000000) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_ALL = (0x0000FFFF) +NV83DE_CTRL_CMD_DEBUG_READ_SINGLE_SM_ERROR_STATE = (0x83de030b) +NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_MESSAGE_ID = (0xB) +NV83DE_CTRL_CMD_DEBUG_READ_ALL_SM_ERROR_STATES = (0x83de030c) +NV83DE_CTRL_DEBUG_MAX_SMS_PER_CALL = 100 +NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_MESSAGE_ID = (0xC) +NV83DE_CTRL_CMD_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE = (0x83de030f) +NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_MESSAGE_ID = (0xF) +NV83DE_CTRL_CMD_DEBUG_CLEAR_ALL_SM_ERROR_STATES = (0x83de0310) +NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_MESSAGE_ID = (0x10) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS_DEFINED = 1 +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_HAS_RESIDENT_CHANNEL = 1 +NV83DE_CTRL_CMD_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE = (0x83de0313) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_MESSAGE_ID = (0x13) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_SINGLE_SM = (0x00000001) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_BROADCSAT = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING = (0x83de0314) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS_MESSAGE_ID = (0x14) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_NONPAUSING = (0x00000001) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PAUSING = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_READ_MEMORY = (0x83de0315) +NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS_MESSAGE_ID = (0x15) +NV83DE_CTRL_CMD_DEBUG_WRITE_MEMORY = (0x83de0316) +NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS_MESSAGE_ID = (0x16) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT = (0x83de0317) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_MESSAGE_ID = (0x17) +NV83DE_CTRL_CMD_DEBUG_RESUME_CONTEXT = (0x83de0318) +NV83DE_CTRL_CMD_DEBUG_GET_HANDLES = (0x83de0319) +NV83DE_CTRL_CMD_READ_SURFACE = (0x83de031a) +NV83DE_CTRL_CMD_WRITE_SURFACE = (0x83de031b) +MAX_ACCESS_OPS = 64 +NV83DE_CTRL_CMD_GET_MAPPINGS = (0x83de031c) +MAX_GET_MAPPINGS_OPS = 64 +NV83DE_CTRL_CMD_DEBUG_EXEC_REG_OPS = (0x83de031d) +NV83DE_CTRL_GPU_EXEC_REG_OPS_MAX_OPS = 100 +NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0x1D) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG = (0x83de031f) +NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_MESSAGE_ID = (0x1F) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG_DISABLE = (0x00000000) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG = (0x83de0320) +NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS_MESSAGE_ID = (0x20) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG_DISABLED = (0x00000000) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_SINGLE_STEP = (0x83de0321) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_MESSAGE_ID = (0x21) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_STOP_TRIGGER = (0x83de0322) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS_MESSAGE_ID = (0x22) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_RUN_TRIGGER = (0x83de0323) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS_MESSAGE_ID = (0x23) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT = (0x83de0324) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS_MESSAGE_ID = (0x24) +NV83DE_CTRL_CMD_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS = (0x83de0325) +NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS_MESSAGE_ID = (0x25) +NV83DE_CTRL_CMD_DEBUG_READ_BATCH_MEMORY = (0x83de0326) +NV83DE_CTRL_CMD_DEBUG_WRITE_BATCH_MEMORY = (0x83de0327) +MAX_ACCESS_MEMORY_OPS = 150 +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_MAX_ENTRIES = 4 +NV83DE_CTRL_CMD_DEBUG_READ_MMU_FAULT_INFO = (0x83de0328) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS_MESSAGE_ID = (0x28) +NV83DE_CTRL_CMD_DEBUG_SET_DROP_DEFERRED_RC = (0x83de0329) +NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS_MESSAGE_ID = (0x29) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG = (0x83de032a) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_MESSAGE_ID = (0x2A) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG_DISABLE = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_RELEASE_MMU_GCC_DEBUG_REQUESTS = (0x00000003) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG = (0x83de032b) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_MESSAGE_ID = (0x2B) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG_DISABLED = (0x00000002) +NVB0CC_CTRL_RESERVED = (0x00) +NVB0CC_CTRL_PROFILER = (0x01) +NVB0CC_CTRL_INTERNAL = (0x02) +NVB0CC_CTRL_CMD_NULL = (0xb0cc0000) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM = (0xb0cc0204) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS_MESSAGE_ID = (0x0) +NVB0CC_CTRL_CMD_INTERNAL_QUIESCE_PMA_CHANNEL = (0xb0cc0201) +NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_CMD_INTERNAL_SRIOV_PROMOTE_PMA_STREAM = (0xb0cc0202) +NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x2) +NVB0CC_CTRL_CMD_INTERNAL_PERMISSIONS_INIT = (0xb0cc0203) +NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS_MESSAGE_ID = (0x3) +NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS_MESSAGE_ID = (0x4) +NVB0CC_CTRL_CMD_INTERNAL_FREE_PMA_STREAM = (0xb0cc0206) +NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x6) +NVB0CC_CTRL_CMD_INTERNAL_GET_MAX_PMAS = (0xb0cc0207) +NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS_MESSAGE_ID = (0x7) +NVB0CC_CTRL_CMD_INTERNAL_BIND_PM_RESOURCES = (0xb0cc0208) +NVB0CC_CTRL_CMD_INTERNAL_UNBIND_PM_RESOURCES = (0xb0cc0209) +NVB0CC_CTRL_CMD_INTERNAL_RESERVE_HWPM_LEGACY = (0xb0cc020a) +NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS_MESSAGE_ID = (0xa) +NVB0CC_CTRL_CMD_POWER_REQUEST_FEATURES = (0xb0cc0301) +NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG = (1, 0) +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG = (3, 2) +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG = (5, 4) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG = (7, 6) +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN = (9, 8) +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT = (11, 10) +NVB0CC_CTRL_POWER_FEATURE_IGNORE = (0x00000000) +NVB0CC_CTRL_POWER_FEATURE_DISABLE = (0x00000001) +NVB0CC_CTRL_POWER_FEATURE_ENABLE = (0x00000002) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED = (0x00000000) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED = (0x00000001) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED = (0x00000002) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED = (0x00000003) +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_CMD_POWER_RELEASE_FEATURES = (0xb0cc0302) +NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS_MESSAGE_ID = (0x2) +NVB0CC_CTRL_POWER_FEATURE_RELEASE = (0x00000003) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_CMD_RESERVE_HWPM_LEGACY = (0xb0cc0101) +NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_CMD_RELEASE_HWPM_LEGACY = (0xb0cc0102) +NVB0CC_CTRL_CMD_RESERVE_PM_AREA_SMPC = (0xb0cc0103) +NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_MESSAGE_ID = (0x3) +NVB0CC_CTRL_CMD_RELEASE_PM_AREA_SMPC = (0xb0cc0104) +NVB0CC_CTRL_CMD_ALLOC_PMA_STREAM = (0xb0cc0105) +NVB0CC_PMA_BUFFER_SIZE_MAX = (0xffe00000) +NVB0CC_PMA_BYTES_AVAILABLE_SIZE = (0x1000) +NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_MESSAGE_ID = (0x5) +NVB0CC_CTRL_CMD_FREE_PMA_STREAM = (0xb0cc0106) +NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x6) +NVB0CC_CTRL_CMD_BIND_PM_RESOURCES = (0xb0cc0107) +NVB0CC_CTRL_CMD_UNBIND_PM_RESOURCES = (0xb0cc0108) +NVB0CC_CTRL_CMD_PMA_STREAM_UPDATE_GET_PUT = (0xb0cc0109) +NVB0CC_AVAILABLE_BYTES_DEFAULT_VALUE = 0xFFFFFFFF +NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_MESSAGE_ID = (0x9) +NVB0CC_REGOPS_MAX_COUNT = (124) +NVB0CC_CTRL_CMD_EXEC_REG_OPS = (0xb0cc010a) +NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0xA) +NVB0CC_CTRL_CMD_RESERVE_PM_AREA_PC_SAMPLER = (0xb0cc010b) +NVB0CC_CTRL_CMD_RELEASE_PM_AREA_PC_SAMPLER = (0xb0cc010c) +NVB0CC_CTRL_CMD_GET_TOTAL_HS_CREDITS = (0xb0cc010d) +NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_MESSAGE_ID = (0xD) +NVB0CC_CTRL_CMD_SET_HS_CREDITS = (0xb0cc010e) +NVB0CC_MAX_CREDIT_INFO_ENTRIES = (63) +NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_MESSAGE_ID = (0xE) +NVB0CC_CTRL_CMD_GET_HS_CREDITS = (0xb0cc010f) +NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_MESSAGE_ID = (0xF) +NVB0CC_CTRL_CMD_RESERVE_HES = (0xb0cc0113) +NVB0CC_CTRL_RESERVE_HES_PARAMS_MESSAGE_ID = (0x13) +NVB0CC_CTRL_CMD_RELEASE_HES = (0xb0cc0114) +NVB0CC_CTRL_RELEASE_HES_PARAMS_MESSAGE_ID = (0x14) +NVB0CC_CREDIT_POOL_MAX_COUNT = 30 +NVB0CC_CTRL_CMD_GET_CHIPLET_HS_CREDIT_POOL = (0xb0cc0115) +NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL_MESSAGE_ID = (0x15) +NVB0CC_CTRL_CMD_GET_HS_CREDITS_MAPPING = (0xb0cc0116) +NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS_MESSAGE_ID = (0x16) +NVB0CC_CTRL_CMD_DISABLE_DYNAMIC_MMA_BOOST = (0xb0cc0117) +NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS_MESSAGE_ID = (0x17) +NVB0CC_CTRL_CMD_GET_DYNAMIC_MMA_BOOST_STATUS = (0xb0cc0118) +NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS_MESSAGE_ID = (0x18) +NVB0CC_CTRL_CMD_RESERVE_CCU_PROF = (0xb0cc0119) +NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_MESSAGE_ID = (0x19) +NVB0CC_CTRL_CMD_RELEASE_CCU_PROF = (0xb0cc011a) +NV_STATUS_LEVEL_OK = 0 +NV_STATUS_LEVEL_WARN = 1 +NV_STATUS_LEVEL_ERR = 3 +NV01_ROOT = (0x00000000) +NV1_ROOT = (0x00000000) +NV01_NULL_OBJECT = (0x00000000) +NV1_NULL_OBJECT = (0x00000000) +NV01_ROOT_NON_PRIV = (0x00000001) +NV1_ROOT_NON_PRIV = (0x00000001) +NV01_ROOT_CLIENT = (0x00000041) +FABRIC_MANAGER_SESSION = (0x0000000f) +NV0020_GPU_MANAGEMENT = (0x00000020) +NV01_DEVICE_0 = (0x00000080) +NV20_SUBDEVICE_0 = (0x00002080) +NV2081_BINAPI = (0x00002081) +NV2082_BINAPI_PRIVILEGED = (0x00002082) +NV20_SUBDEVICE_DIAG = (0x0000208f) +NV01_CONTEXT_DMA = (0x00000002) +NV01_MEMORY_SYSTEM = (0x0000003e) +NV1_MEMORY_SYSTEM = (0x0000003e) +NV01_MEMORY_LOCAL_PRIVILEGED = (0x0000003f) +NV1_MEMORY_LOCAL_PRIVILEGED = (0x0000003f) +NV01_MEMORY_PRIVILEGED = (0x0000003f) +NV1_MEMORY_PRIVILEGED = (0x0000003f) +NV01_MEMORY_LOCAL_USER = (0x00000040) +NV1_MEMORY_LOCAL_USER = (0x00000040) +NV01_MEMORY_USER = (0x00000040) +NV1_MEMORY_USER = (0x00000040) +NV_MEMORY_EXTENDED_USER = (0x00000042) +NV01_MEMORY_VIRTUAL = (0x00000070) +NV01_MEMORY_SYSTEM_DYNAMIC = (0x00000070) +NV1_MEMORY_SYSTEM_DYNAMIC = (0x00000070) +NV_MEMORY_MAPPER = (0x000000fe) +NV01_MEMORY_LOCAL_PHYSICAL = (0x000000c2) +NV01_MEMORY_SYNCPOINT = (0x000000c3) +NV01_MEMORY_SYSTEM_OS_DESCRIPTOR = (0x00000071) +NV01_MEMORY_DEVICELESS = (0x000090ce) +NV01_MEMORY_FRAMEBUFFER_CONSOLE = (0x00000076) +NV01_MEMORY_HW_RESOURCES = (0x000000b1) +NV01_MEMORY_LIST_SYSTEM = (0x00000081) +NV01_MEMORY_LIST_FBMEM = (0x00000082) +NV01_MEMORY_LIST_OBJECT = (0x00000083) +NV_IMEX_SESSION = (0x000000f1) +NV01_MEMORY_FLA = (0x000000f3) +NV_MEMORY_EXPORT = (0x000000e0) +NV_CE_UTILS = (0x00000050) +NV_MEMORY_FABRIC = (0x000000f8) +NV_MEMORY_FABRIC_IMPORT_V2 = (0x000000f9) +NV_MEMORY_FABRIC_IMPORTED_REF = (0x000000fb) +FABRIC_VASPACE_A = (0x000000fc) +NV_MEMORY_MULTICAST_FABRIC = (0x000000fd) +IO_VASPACE_A = (0x000000f2) +NV01_NULL = (0x00000030) +NV1_NULL = (0x00000030) +NV01_EVENT = (0x00000005) +NV1_EVENT = (0x00000005) +NV01_EVENT_KERNEL_CALLBACK = (0x00000078) +NV1_EVENT_KERNEL_CALLBACK = (0x00000078) +NV01_EVENT_OS_EVENT = (0x00000079) +NV1_EVENT_OS_EVENT = (0x00000079) +NV01_EVENT_WIN32_EVENT = (0x00000079) +NV1_EVENT_WIN32_EVENT = (0x00000079) +NV01_EVENT_KERNEL_CALLBACK_EX = (0x0000007e) +NV1_EVENT_KERNEL_CALLBACK_EX = (0x0000007e) +NV01_TIMER = (0x00000004) +NV1_TIMER = (0x00000004) +KERNEL_GRAPHICS_CONTEXT = (0x00000090) +LOCK_STRESS_OBJECT = (0x00000100) +LOCK_TEST_RELAXED_DUP_OBJECT = (0x00000101) +NV50_CHANNEL_GPFIFO = (0x0000506f) +GF100_CHANNEL_GPFIFO = (0x0000906f) +KEPLER_CHANNEL_GPFIFO_A = (0x0000a06f) +UVM_CHANNEL_RETAINER = (0x0000c574) +KEPLER_CHANNEL_GPFIFO_B = (0x0000a16f) +MAXWELL_CHANNEL_GPFIFO_A = (0x0000b06f) +PASCAL_CHANNEL_GPFIFO_A = (0x0000c06f) +VOLTA_CHANNEL_GPFIFO_A = (0x0000c36f) +TURING_CHANNEL_GPFIFO_A = (0x0000c46f) +AMPERE_CHANNEL_GPFIFO_A = (0x0000c56f) +HOPPER_CHANNEL_GPFIFO_A = (0x0000c86f) +BLACKWELL_CHANNEL_GPFIFO_A = (0x0000c96f) +BLACKWELL_CHANNEL_GPFIFO_B = (0x0000ca6f) +NV04_SOFTWARE_TEST = (0x0000007d) +NV4_SOFTWARE_TEST = (0x0000007d) +NV30_GSYNC = (0x000030f1) +VOLTA_USERMODE_A = (0x0000c361) +TURING_USERMODE_A = (0x0000c461) +AMPERE_USERMODE_A = (0x0000c561) +HOPPER_USERMODE_A = (0x0000c661) +BLACKWELL_USERMODE_A = (0x0000c761) +NVC371_DISP_SF_USER = (0x0000c371) +NVC372_DISPLAY_SW = (0x0000c372) +NVC573_DISP_CAPABILITIES = (0x0000c573) +NVC673_DISP_CAPABILITIES = (0x0000c673) +NVC773_DISP_CAPABILITIES = (0x0000c773) +NVC973_DISP_CAPABILITIES = (0x0000c973) +NVCA73_DISP_CAPABILITIES = (0x0000ca73) +NVCB73_DISP_CAPABILITIES = (0x0000cb73) +NVCC73_DISP_CAPABILITIES = (0x0000cc73) +NV04_DISPLAY_COMMON = (0x00000073) +NV50_DEFERRED_API_CLASS = (0x00005080) +MPS_COMPUTE = (0x0000900e) +NVC570_DISPLAY = (0x0000c570) +NVC57A_CURSOR_IMM_CHANNEL_PIO = (0x0000c57a) +NVC57B_WINDOW_IMM_CHANNEL_DMA = (0x0000c57b) +NVC57D_CORE_CHANNEL_DMA = (0x0000c57d) +NVC57E_WINDOW_CHANNEL_DMA = (0x0000c57e) +NVC670_DISPLAY = (0x0000c670) +NVC671_DISP_SF_USER = (0x0000c671) +NVC67A_CURSOR_IMM_CHANNEL_PIO = (0x0000c67a) +NVC67B_WINDOW_IMM_CHANNEL_DMA = (0x0000c67b) +NVC67D_CORE_CHANNEL_DMA = (0x0000c67d) +NVC67E_WINDOW_CHANNEL_DMA = (0x0000c67e) +NVC77F_ANY_CHANNEL_DMA = (0x0000c77f) +NVC770_DISPLAY = (0x0000c770) +NVC771_DISP_SF_USER = (0x0000c771) +NVC77D_CORE_CHANNEL_DMA = (0x0000c77d) +NVC970_DISPLAY = (0x0000c970) +NVC971_DISP_SF_USER = (0x0000c971) +NVC97A_CURSOR_IMM_CHANNEL_PIO = (0x0000c97a) +NVC97B_WINDOW_IMM_CHANNEL_DMA = (0x0000c97b) +NVC97D_CORE_CHANNEL_DMA = (0x0000c97d) +NVC97E_WINDOW_CHANNEL_DMA = (0x0000c97e) +NVCA70_DISPLAY = (0x0000ca70) +NVCA71_DISP_SF_USER = (0x0000ca71) +NVCA7A_CURSOR_IMM_CHANNEL_PIO = (0x0000ca7a) +NVCA7B_WINDOW_IMM_CHANNEL_DMA = (0x0000ca7b) +NVCA7D_CORE_CHANNEL_DMA = (0x0000ca7d) +NVCA7E_WINDOW_CHANNEL_DMA = (0x0000ca7e) +NVCB70_DISPLAY = (0x0000cb70) +NVCB71_DISP_SF_USER = (0x0000cb71) +NVCB7A_CURSOR_IMM_CHANNEL_PIO = (0x0000cb7a) +NVCB7B_WINDOW_IMM_CHANNEL_DMA = (0x0000cb7b) +NVCB7D_CORE_CHANNEL_DMA = (0x0000cb7d) +NVCB7E_WINDOW_CHANNEL_DMA = (0x0000cb7e) +NVCC70_DISPLAY = (0x0000cc70) +NVCC71_DISP_SF_USER = (0x0000cc71) +NVCC7A_CURSOR_IMM_CHANNEL_PIO = (0x0000cc7a) +NVCC7B_WINDOW_IMM_CHANNEL_DMA = (0x0000cc7b) +NVCC7D_CORE_CHANNEL_DMA = (0x0000cc7d) +NVCC7E_WINDOW_CHANNEL_DMA = (0x0000cc7e) +NV9010_VBLANK_CALLBACK = (0x00009010) +GF100_PROFILER = (0x000090cc) +MAXWELL_PROFILER = (0x0000b0cc) +MAXWELL_PROFILER_CONTEXT = (0x0000b1cc) +MAXWELL_PROFILER_DEVICE = (0x0000b2cc) +GF100_SUBDEVICE_MASTER = (0x000090e6) +GF100_SUBDEVICE_INFOROM = (0x000090e7) +GF100_ZBC_CLEAR = (0x00009096) +GF100_DISP_SW = (0x00009072) +GF100_TIMED_SEMAPHORE_SW = (0x00009074) +G84_PERFBUFFER = (0x0000844c) +NV50_MEMORY_VIRTUAL = (0x000050a0) +NV50_P2P = (0x0000503b) +NV50_THIRD_PARTY_P2P = (0x0000503c) +FERMI_TWOD_A = (0x0000902d) +FERMI_VASPACE_A = (0x000090f1) +HOPPER_SEC2_WORK_LAUNCH_A = (0x0000cba2) +GF100_HDACODEC = (0x000090ec) +NVB8B0_VIDEO_DECODER = (0x0000b8b0) +NVC4B0_VIDEO_DECODER = (0x0000c4b0) +NVC6B0_VIDEO_DECODER = (0x0000c6b0) +NVC7B0_VIDEO_DECODER = (0x0000c7b0) +NVC9B0_VIDEO_DECODER = (0x0000c9b0) +NVCDB0_VIDEO_DECODER = (0x0000cdb0) +NVCEB0_VIDEO_DECODER = (0x0000ceb0) +NVCFB0_VIDEO_DECODER = (0x0000cfb0) +NVD1B0_VIDEO_DECODER = (0x0000d1b0) +NVC4B7_VIDEO_ENCODER = (0x0000c4b7) +NVB4B7_VIDEO_ENCODER = (0x0000b4b7) +NVC7B7_VIDEO_ENCODER = (0x0000c7b7) +NVC9B7_VIDEO_ENCODER = (0x0000c9b7) +NVCEB7_VIDEO_ENCODER = (0x0000ceb7) +NVCFB7_VIDEO_ENCODER = (0x0000cfb7) +NVD1B7_VIDEO_ENCODER = (0x0000d1b7) +NVB8D1_VIDEO_NVJPG = (0x0000b8d1) +NVC4D1_VIDEO_NVJPG = (0x0000c4d1) +NVC9D1_VIDEO_NVJPG = (0x0000c9d1) +NVCED0_VIDEO_NVJPG = (0x0000ced0) +NVCDD1_VIDEO_NVJPG = (0x0000cdd1) +NVCFD1_VIDEO_NVJPG = (0x0000cfd1) +NVB8FA_VIDEO_OFA = (0x0000b8fa) +NVC6FA_VIDEO_OFA = (0x0000c6fa) +NVC7FA_VIDEO_OFA = (0x0000c7fa) +NVC9FA_VIDEO_OFA = (0x0000c9fa) +NVCDFA_VIDEO_OFA = (0x0000cdfa) +NVCEFA_VIDEO_OFA = (0x0000cefa) +NVCFFA_VIDEO_OFA = (0x0000cffa) +NVD1FA_VIDEO_OFA = (0x0000d1fa) +KEPLER_INLINE_TO_MEMORY_B = (0x0000a140) +FERMI_CONTEXT_SHARE_A = (0x00009067) +KEPLER_CHANNEL_GROUP_A = (0x0000a06c) +PASCAL_DMA_COPY_A = (0x0000c0b5) +TURING_DMA_COPY_A = (0x0000c5b5) +AMPERE_DMA_COPY_A = (0x0000c6b5) +AMPERE_DMA_COPY_B = (0x0000c7b5) +HOPPER_DMA_COPY_A = (0x0000c8b5) +BLACKWELL_DMA_COPY_A = (0x0000c9b5) +BLACKWELL_DMA_COPY_B = (0x0000cab5) +MAXWELL_DMA_COPY_A = (0x0000b0b5) +ACCESS_COUNTER_NOTIFY_BUFFER = (0x0000c365) +MMU_FAULT_BUFFER = (0x0000c369) +MMU_VIDMEM_ACCESS_BIT_BUFFER = (0x0000c763) +HOPPER_MMU_VIDMEM_ACCESS_BIT_BUFFER = (0x0000c863) +TURING_A = (0x0000c597) +TURING_COMPUTE_A = (0x0000c5c0) +AMPERE_A = (0x0000c697) +AMPERE_COMPUTE_A = (0x0000c6c0) +AMPERE_B = (0x0000c797) +AMPERE_COMPUTE_B = (0x0000c7c0) +ADA_A = (0x0000c997) +ADA_COMPUTE_A = (0x0000c9c0) +AMPERE_SMC_PARTITION_REF = (0x0000c637) +AMPERE_SMC_EXEC_PARTITION_REF = (0x0000c638) +AMPERE_SMC_CONFIG_SESSION = (0x0000c639) +NV0092_RG_LINE_CALLBACK = (0x00000092) +AMPERE_SMC_MONITOR_SESSION = (0x0000c640) +HOPPER_A = (0x0000cb97) +HOPPER_COMPUTE_A = (0x0000cbc0) +BLACKWELL_A = (0x0000cd97) +BLACKWELL_COMPUTE_A = (0x0000cdc0) +BLACKWELL_B = (0x0000ce97) +BLACKWELL_COMPUTE_B = (0x0000cec0) +BLACKWELL_INLINE_TO_MEMORY_A = (0x0000cd40) +NV40_DEBUG_BUFFER = (0x000000db) +RM_USER_SHARED_DATA = (0x000000de) +GT200_DEBUGGER = (0x000083de) +NV40_I2C = (0x0000402c) +KEPLER_DEVICE_VGPU = (0x0000a080) +NVA081_VGPU_CONFIG = (0x0000a081) +NVA084_KERNEL_HOST_VGPU_DEVICE = (0x0000a084) +NV0060_SYNC_GPU_BOOST = (0x00000060) +GP100_UVM_SW = (0x0000c076) +NVENC_SW_SESSION = (0x0000a0bc) +NV_EVENT_BUFFER = (0x000090cd) +NVFBC_SW_SESSION = (0x0000a0bd) +NV_CONFIDENTIAL_COMPUTE = (0x0000cb33) +NV_COUNTER_COLLECTION_UNIT = (0x0000cbca) +NV_SEMAPHORE_SURFACE = (0x000000da) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_610.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_610.py new file mode 100644 index 000000000..d5064b9b1 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_610.py @@ -0,0 +1,26569 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +_anonenum0: dict[int, str] = {(AES128_NONE:=0): 'AES128_NONE', (AES128_CTR:=1): 'AES128_CTR', (AES128_CBC:=2): 'AES128_CBC', (AES128_ECB:=3): 'AES128_ECB', (AES128_OFB:=4): 'AES128_OFB', (AES128_CTR_LSB16B:=5): 'AES128_CTR_LSB16B', (AES128_CLR_AS_ENCRYPT:=6): 'AES128_CLR_AS_ENCRYPT', (AES128_RESERVED:=7): 'AES128_RESERVED'} +_anonenum1: dict[int, str] = {(AES128_CTS_DISABLE:=0): 'AES128_CTS_DISABLE', (AES128_CTS_ENABLE:=1): 'AES128_CTS_ENABLE'} +_anonenum2: dict[int, str] = {(AES128_PADDING_NONE:=0): 'AES128_PADDING_NONE', (AES128_PADDING_CARRY_OVER:=1): 'AES128_PADDING_CARRY_OVER', (AES128_PADDING_RFC2630:=2): 'AES128_PADDING_RFC2630', (AES128_PADDING_RESERVED:=7): 'AES128_PADDING_RESERVED'} +ENCR_MODE: dict[int, str] = {(ENCR_MODE_CTR64:=0): 'ENCR_MODE_CTR64', (ENCR_MODE_CBC:=1): 'ENCR_MODE_CBC', (ENCR_MODE_ECB:=2): 'ENCR_MODE_ECB', (ENCR_MODE_ECB_PARTIAL:=3): 'ENCR_MODE_ECB_PARTIAL', (ENCR_MODE_CBC_PARTIAL:=4): 'ENCR_MODE_CBC_PARTIAL', (ENCR_MODE_CLEAR_INTO_VPR:=5): 'ENCR_MODE_CLEAR_INTO_VPR', (ENCR_MODE_FORCE_INTO_VPR:=6): 'ENCR_MODE_FORCE_INTO_VPR'} +_anonenum3: dict[int, str] = {(DRM_MS_PIFF_CTR:=17): 'DRM_MS_PIFF_CTR'} +_anonenum4: dict[int, str] = {(DRM_MS_PIFF_CBC:=2): 'DRM_MS_PIFF_CBC'} +_anonenum5: dict[int, str] = {(DRM_MARLIN_CTR:=1): 'DRM_MARLIN_CTR'} +_anonenum6: dict[int, str] = {(DRM_MARLIN_CBC:=34): 'DRM_MARLIN_CBC'} +_anonenum7: dict[int, str] = {(DRM_WIDEVINE:=10): 'DRM_WIDEVINE'} +_anonenum8: dict[int, str] = {(DRM_WIDEVINE_CTR:=17): 'DRM_WIDEVINE_CTR'} +_anonenum9: dict[int, str] = {(DRM_ULTRA_VIOLET:=5): 'DRM_ULTRA_VIOLET'} +_anonenum10: dict[int, str] = {(DRM_NONE:=0): 'DRM_NONE'} +_anonenum11: dict[int, str] = {(DRM_CLR_AS_ENCRYPT:=6): 'DRM_CLR_AS_ENCRYPT'} +@c.record +class struct__nvdec_ssm_s(c.Struct): + SIZE = 8 + bytes_of_protected_data: int + bytes_of_clear_data: int + skip_byte_blk: int + crypt_byte_blk: int + skip: int + last: int + pad: int + mode: int + entry_type: int + reserved: int +struct__nvdec_ssm_s.register_fields([('bytes_of_protected_data', ctypes.c_uint32, 0), ('bytes_of_clear_data', ctypes.c_uint32, 4, 16, 0), ('skip_byte_blk', ctypes.c_uint32, 6, 4, 0), ('crypt_byte_blk', ctypes.c_uint32, 6, 4, 4), ('skip', ctypes.c_uint32, 7, 1, 0), ('last', ctypes.c_uint32, 7, 1, 1), ('pad', ctypes.c_uint32, 7, 1, 2), ('mode', ctypes.c_uint32, 7, 1, 3), ('entry_type', ctypes.c_uint32, 7, 1, 4), ('reserved', ctypes.c_uint32, 7, 3, 5)]) +nvdec_ssm_s: TypeAlias = struct__nvdec_ssm_s +@c.record +class struct__nvdec_pass2_otf_ext_s(c.Struct): + SIZE = 12 + ssm_entry_num: int + ssm_iv_num: int + real_stream_length: int + non_slice_data: int + drm_mode: int + reserved: int +struct__nvdec_pass2_otf_ext_s.register_fields([('ssm_entry_num', ctypes.c_uint32, 0, 16, 0), ('ssm_iv_num', ctypes.c_uint32, 2, 16, 0), ('real_stream_length', ctypes.c_uint32, 4), ('non_slice_data', ctypes.c_uint32, 8, 16, 0), ('drm_mode', ctypes.c_uint32, 10, 7, 0), ('reserved', ctypes.c_uint32, 10, 9, 7)]) +nvdec_pass2_otf_ext_s: TypeAlias = struct__nvdec_pass2_otf_ext_s +@c.record +class struct__nvdec_substream_entry_s(c.Struct): + SIZE = 12 + substream_start_offset: int + substream_length: int + substream_first_tile_idx: int + substream_last_tile_idx: int + last_substream_entry_in_frame: int + reserved: int +struct__nvdec_substream_entry_s.register_fields([('substream_start_offset', ctypes.c_uint32, 0), ('substream_length', ctypes.c_uint32, 4), ('substream_first_tile_idx', ctypes.c_uint32, 8, 8, 0), ('substream_last_tile_idx', ctypes.c_uint32, 9, 8, 0), ('last_substream_entry_in_frame', ctypes.c_uint32, 10, 1, 0), ('reserved', ctypes.c_uint32, 10, 15, 1)]) +nvdec_substream_entry_s: TypeAlias = struct__nvdec_substream_entry_s +@c.record +class struct__nvdec_ecdma_config_s(c.Struct): + SIZE = 24 + ecdma_enable: int + ecdma_blk_x_src: int + ecdma_blk_y_src: int + ecdma_blk_x_dst: int + ecdma_blk_y_dst: int + ref_pic_idx: int + boundary0_top: int + boundary0_bottom: int + boundary1_left: int + boundary1_right: int + blk_copy_flag: int + ctb_size: int +struct__nvdec_ecdma_config_s.register_fields([('ecdma_enable', ctypes.c_uint32, 0), ('ecdma_blk_x_src', ctypes.c_uint16, 4), ('ecdma_blk_y_src', ctypes.c_uint16, 6), ('ecdma_blk_x_dst', ctypes.c_uint16, 8), ('ecdma_blk_y_dst', ctypes.c_uint16, 10), ('ref_pic_idx', ctypes.c_uint16, 12), ('boundary0_top', ctypes.c_uint16, 14), ('boundary0_bottom', ctypes.c_uint16, 16), ('boundary1_left', ctypes.c_uint16, 18), ('boundary1_right', ctypes.c_uint16, 20), ('blk_copy_flag', ctypes.c_ubyte, 22), ('ctb_size', ctypes.c_ubyte, 23)]) +nvdec_ecdma_config_s: TypeAlias = struct__nvdec_ecdma_config_s +@c.record +class struct__nvdec_status_hevc_s(c.Struct): + SIZE = 36 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + error_ctb_pos: int + error_slice_pos: int +struct__nvdec_status_hevc_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('error_ctb_pos', ctypes.c_uint32, 28), ('error_slice_pos', ctypes.c_uint32, 32)]) +nvdec_status_hevc_s: TypeAlias = struct__nvdec_status_hevc_s +@c.record +class struct__nvdec_status_vp9_s(c.Struct): + SIZE = 36 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + error_ctb_pos: int + error_slice_pos: int +struct__nvdec_status_vp9_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('error_ctb_pos', ctypes.c_uint32, 28), ('error_slice_pos', ctypes.c_uint32, 32)]) +nvdec_status_vp9_s: TypeAlias = struct__nvdec_status_vp9_s +@c.record +class struct__nvdec_status_s(c.Struct): + SIZE = 56 + mbs_correctly_decoded: int + mbs_in_error: int + cycle_count: int + error_status: int + hevc: struct__nvdec_status_hevc_s + vp9: struct__nvdec_status_vp9_s + slice_header_error_code: int +struct__nvdec_status_s.register_fields([('mbs_correctly_decoded', ctypes.c_uint32, 0), ('mbs_in_error', ctypes.c_uint32, 4), ('cycle_count', ctypes.c_uint32, 8), ('error_status', ctypes.c_uint32, 12), ('hevc', nvdec_status_hevc_s, 16), ('vp9', nvdec_status_vp9_s, 16), ('slice_header_error_code', ctypes.c_uint32, 52)]) +nvdec_status_s: TypeAlias = struct__nvdec_status_s +@c.record +class struct__external_mv_s(c.Struct): + SIZE = 4 + mvx: int + mvy: int + refidx: int +struct__external_mv_s.register_fields([('mvx', ctypes.c_int32, 0, 14, 0), ('mvy', ctypes.c_int32, 1, 14, 6), ('refidx', ctypes.c_uint32, 3, 4, 4)]) +external_mv_s: TypeAlias = struct__external_mv_s +@c.record +class struct__nvdec_hevc_main10_444_ext_s(c.Struct): + SIZE = 28 + transformSkipRotationEnableFlag: int + transformSkipContextEnableFlag: int + intraBlockCopyEnableFlag: int + implicitRdpcmEnableFlag: int + explicitRdpcmEnableFlag: int + extendedPrecisionProcessingFlag: int + intraSmoothingDisabledFlag: int + highPrecisionOffsetsEnableFlag: int + fastRiceAdaptationEnableFlag: int + cabacBypassAlignmentEnableFlag: int + sps_444_extension_reserved: int + log2MaxTransformSkipSize: int + crossComponentPredictionEnableFlag: int + chromaQpAdjustmentEnableFlag: int + diffCuChromaQpAdjustmentDepth: int + chromaQpAdjustmentTableSize: int + log2SaoOffsetScaleLuma: int + log2SaoOffsetScaleChroma: int + pps_444_extension_reserved: int + cb_qp_adjustment: c.Array[ctypes.c_char, Literal[6]] + cr_qp_adjustment: c.Array[ctypes.c_char, Literal[6]] + HevcFltAboveOffset: int + HevcSaoAboveOffset: int +struct__nvdec_hevc_main10_444_ext_s.register_fields([('transformSkipRotationEnableFlag', ctypes.c_uint32, 0, 1, 0), ('transformSkipContextEnableFlag', ctypes.c_uint32, 0, 1, 1), ('intraBlockCopyEnableFlag', ctypes.c_uint32, 0, 1, 2), ('implicitRdpcmEnableFlag', ctypes.c_uint32, 0, 1, 3), ('explicitRdpcmEnableFlag', ctypes.c_uint32, 0, 1, 4), ('extendedPrecisionProcessingFlag', ctypes.c_uint32, 0, 1, 5), ('intraSmoothingDisabledFlag', ctypes.c_uint32, 0, 1, 6), ('highPrecisionOffsetsEnableFlag', ctypes.c_uint32, 0, 1, 7), ('fastRiceAdaptationEnableFlag', ctypes.c_uint32, 1, 1, 0), ('cabacBypassAlignmentEnableFlag', ctypes.c_uint32, 1, 1, 1), ('sps_444_extension_reserved', ctypes.c_uint32, 1, 22, 2), ('log2MaxTransformSkipSize', ctypes.c_uint32, 4, 4, 0), ('crossComponentPredictionEnableFlag', ctypes.c_uint32, 4, 1, 4), ('chromaQpAdjustmentEnableFlag', ctypes.c_uint32, 4, 1, 5), ('diffCuChromaQpAdjustmentDepth', ctypes.c_uint32, 4, 2, 6), ('chromaQpAdjustmentTableSize', ctypes.c_uint32, 5, 3, 0), ('log2SaoOffsetScaleLuma', ctypes.c_uint32, 5, 3, 3), ('log2SaoOffsetScaleChroma', ctypes.c_uint32, 5, 3, 6), ('pps_444_extension_reserved', ctypes.c_uint32, 6, 15, 1), ('cb_qp_adjustment', c.Array[ctypes.c_char, Literal[6]], 8), ('cr_qp_adjustment', c.Array[ctypes.c_char, Literal[6]], 14), ('HevcFltAboveOffset', ctypes.c_uint32, 20), ('HevcSaoAboveOffset', ctypes.c_uint32, 24)]) +nvdec_hevc_main10_444_ext_s: TypeAlias = struct__nvdec_hevc_main10_444_ext_s +@c.record +class struct__nvdec_hevc_pic_v1_s(c.Struct): + SIZE = 32 + hevc_main10_444_ext: struct__nvdec_hevc_main10_444_ext_s + sw_skip_start_length: int + external_ref_mem_dis: int + error_recovery_start_pos: int + error_external_mv_en: int + reserved0: int +struct__nvdec_hevc_pic_v1_s.register_fields([('hevc_main10_444_ext', nvdec_hevc_main10_444_ext_s, 0), ('sw_skip_start_length', ctypes.c_uint32, 28, 14, 0), ('external_ref_mem_dis', ctypes.c_uint32, 29, 1, 6), ('error_recovery_start_pos', ctypes.c_uint32, 29, 2, 7), ('error_external_mv_en', ctypes.c_uint32, 30, 1, 1), ('reserved0', ctypes.c_uint32, 30, 14, 2)]) +nvdec_hevc_pic_v1_s: TypeAlias = struct__nvdec_hevc_pic_v1_s +@c.record +class struct__nvdec_hevc_pic_v2_s(c.Struct): + SIZE = 4 + mv_hevc_enable: int + nuh_layer_id: int + default_ref_layers_active_flag: int + NumDirectRefLayers: int + max_one_active_ref_layer_flag: int + NumActiveRefLayerPics: int + poc_lsb_not_present_flag: int + reserved0: int +struct__nvdec_hevc_pic_v2_s.register_fields([('mv_hevc_enable', ctypes.c_uint32, 0, 1, 0), ('nuh_layer_id', ctypes.c_uint32, 0, 6, 1), ('default_ref_layers_active_flag', ctypes.c_uint32, 0, 1, 7), ('NumDirectRefLayers', ctypes.c_uint32, 1, 6, 0), ('max_one_active_ref_layer_flag', ctypes.c_uint32, 1, 1, 6), ('NumActiveRefLayerPics', ctypes.c_uint32, 1, 6, 7), ('poc_lsb_not_present_flag', ctypes.c_uint32, 2, 1, 5), ('reserved0', ctypes.c_uint32, 2, 10, 6)]) +nvdec_hevc_pic_v2_s: TypeAlias = struct__nvdec_hevc_pic_v2_s +@c.record +class struct__nvdec_hevc_pic_v3_s(c.Struct): + SIZE = 8 + slice_decoding_enable: int + slice_ec_enable: int + slice_ec_mv_type: int + err_detected_sw: int + slice_ec_slice_type: int + slice_strm_recfg_en: int + reserved: int + HevcSliceEdgeOffset: int +struct__nvdec_hevc_pic_v3_s.register_fields([('slice_decoding_enable', ctypes.c_uint32, 0, 1, 0), ('slice_ec_enable', ctypes.c_uint32, 0, 1, 1), ('slice_ec_mv_type', ctypes.c_uint32, 0, 2, 2), ('err_detected_sw', ctypes.c_uint32, 0, 1, 4), ('slice_ec_slice_type', ctypes.c_uint32, 0, 2, 5), ('slice_strm_recfg_en', ctypes.c_uint32, 0, 1, 7), ('reserved', ctypes.c_uint32, 1, 24, 0), ('HevcSliceEdgeOffset', ctypes.c_uint32, 4)]) +nvdec_hevc_pic_v3_s: TypeAlias = struct__nvdec_hevc_pic_v3_s +@c.record +class struct__nvdec_hevc_pic_s(c.Struct): + SIZE = 276 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + stream_len: int + enable_encryption: int + key_increment: int + encryption_mode: int + key_slot_index: int + ssm_en: int + enable_histogram: int + enable_substream_decoding: int + reserved0: int + gptimer_timeout_value: int + tileformat: int + gob_height: int + reserverd_surface_format: int + sw_start_code_e: int + disp_output_mode: int + reserved1: int + framestride: c.Array[ctypes.c_uint32, Literal[2]] + colMvBuffersize: int + HevcSaoBufferOffset: int + HevcBsdCtrlOffset: int + pic_width_in_luma_samples: int + pic_height_in_luma_samples: int + chroma_format_idc: int + bit_depth_luma: int + bit_depth_chroma: int + log2_min_luma_coding_block_size: int + log2_max_luma_coding_block_size: int + log2_min_transform_block_size: int + log2_max_transform_block_size: int + reserved2: int + max_transform_hierarchy_depth_inter: int + max_transform_hierarchy_depth_intra: int + scalingListEnable: int + amp_enable_flag: int + sample_adaptive_offset_enabled_flag: int + pcm_enabled_flag: int + pcm_sample_bit_depth_luma: int + pcm_sample_bit_depth_chroma: int + log2_min_pcm_luma_coding_block_size: int + log2_max_pcm_luma_coding_block_size: int + pcm_loop_filter_disabled_flag: int + sps_temporal_mvp_enabled_flag: int + strong_intra_smoothing_enabled_flag: int + reserved3: int + dependent_slice_segments_enabled_flag: int + output_flag_present_flag: int + num_extra_slice_header_bits: int + sign_data_hiding_enabled_flag: int + cabac_init_present_flag: int + num_ref_idx_l0_default_active: int + num_ref_idx_l1_default_active: int + init_qp: int + constrained_intra_pred_flag: int + transform_skip_enabled_flag: int + cu_qp_delta_enabled_flag: int + diff_cu_qp_delta_depth: int + reserved4: int + pps_cb_qp_offset: bytes + pps_cr_qp_offset: bytes + pps_beta_offset: bytes + pps_tc_offset: bytes + pps_slice_chroma_qp_offsets_present_flag: int + weighted_pred_flag: int + weighted_bipred_flag: int + transquant_bypass_enabled_flag: int + tiles_enabled_flag: int + entropy_coding_sync_enabled_flag: int + num_tile_columns: int + num_tile_rows: int + loop_filter_across_tiles_enabled_flag: int + loop_filter_across_slices_enabled_flag: int + deblocking_filter_control_present_flag: int + deblocking_filter_override_enabled_flag: int + pps_deblocking_filter_disabled_flag: int + lists_modification_present_flag: int + log2_parallel_merge_level: int + slice_segment_header_extension_present_flag: int + reserved5: int + num_ref_frames: int + reserved6: int + longtermflag: int + initreflistidxl0: c.Array[ctypes.c_ubyte, Literal[16]] + initreflistidxl1: c.Array[ctypes.c_ubyte, Literal[16]] + RefDiffPicOrderCnts: c.Array[ctypes.c_int16, Literal[16]] + IDR_picture_flag: int + RAP_picture_flag: int + curr_pic_idx: int + pattern_id: int + sw_hdr_skip_length: int + reserved7: int + ecdma_cfg: struct__nvdec_ecdma_config_s + separate_colour_plane_flag: int + log2_max_pic_order_cnt_lsb_minus4: int + num_short_term_ref_pic_sets: int + num_long_term_ref_pics_sps: int + bBitParsingDisable: int + num_delta_pocs_of_rps_idx: int + long_term_ref_pics_present_flag: int + reserved_dxva: int + num_bits_short_term_ref_pics_in_slice: int + v1: struct__nvdec_hevc_pic_v1_s + v2: struct__nvdec_hevc_pic_v2_s + v3: struct__nvdec_hevc_pic_v3_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_hevc_pic_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('stream_len', ctypes.c_uint32, 48), ('enable_encryption', ctypes.c_uint32, 52), ('key_increment', ctypes.c_uint32, 56, 6, 0), ('encryption_mode', ctypes.c_uint32, 56, 4, 6), ('key_slot_index', ctypes.c_uint32, 57, 4, 2), ('ssm_en', ctypes.c_uint32, 57, 1, 6), ('enable_histogram', ctypes.c_uint32, 57, 1, 7), ('enable_substream_decoding', ctypes.c_uint32, 58, 1, 0), ('reserved0', ctypes.c_uint32, 58, 15, 1), ('gptimer_timeout_value', ctypes.c_uint32, 60), ('tileformat', ctypes.c_ubyte, 64, 2, 0), ('gob_height', ctypes.c_ubyte, 64, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 64, 3, 5), ('sw_start_code_e', ctypes.c_ubyte, 65), ('disp_output_mode', ctypes.c_ubyte, 66), ('reserved1', ctypes.c_ubyte, 67), ('framestride', c.Array[ctypes.c_uint32, Literal[2]], 68), ('colMvBuffersize', ctypes.c_uint32, 76), ('HevcSaoBufferOffset', ctypes.c_uint32, 80), ('HevcBsdCtrlOffset', ctypes.c_uint32, 84), ('pic_width_in_luma_samples', ctypes.c_uint16, 88), ('pic_height_in_luma_samples', ctypes.c_uint16, 90), ('chroma_format_idc', ctypes.c_uint32, 92, 4, 0), ('bit_depth_luma', ctypes.c_uint32, 92, 4, 4), ('bit_depth_chroma', ctypes.c_uint32, 93, 4, 0), ('log2_min_luma_coding_block_size', ctypes.c_uint32, 93, 4, 4), ('log2_max_luma_coding_block_size', ctypes.c_uint32, 94, 4, 0), ('log2_min_transform_block_size', ctypes.c_uint32, 94, 4, 4), ('log2_max_transform_block_size', ctypes.c_uint32, 95, 4, 0), ('reserved2', ctypes.c_uint32, 95, 4, 4), ('max_transform_hierarchy_depth_inter', ctypes.c_uint32, 96, 3, 0), ('max_transform_hierarchy_depth_intra', ctypes.c_uint32, 96, 3, 3), ('scalingListEnable', ctypes.c_uint32, 96, 1, 6), ('amp_enable_flag', ctypes.c_uint32, 96, 1, 7), ('sample_adaptive_offset_enabled_flag', ctypes.c_uint32, 97, 1, 0), ('pcm_enabled_flag', ctypes.c_uint32, 97, 1, 1), ('pcm_sample_bit_depth_luma', ctypes.c_uint32, 97, 4, 2), ('pcm_sample_bit_depth_chroma', ctypes.c_uint32, 97, 4, 6), ('log2_min_pcm_luma_coding_block_size', ctypes.c_uint32, 98, 4, 2), ('log2_max_pcm_luma_coding_block_size', ctypes.c_uint32, 98, 4, 6), ('pcm_loop_filter_disabled_flag', ctypes.c_uint32, 99, 1, 2), ('sps_temporal_mvp_enabled_flag', ctypes.c_uint32, 99, 1, 3), ('strong_intra_smoothing_enabled_flag', ctypes.c_uint32, 99, 1, 4), ('reserved3', ctypes.c_uint32, 99, 3, 5), ('dependent_slice_segments_enabled_flag', ctypes.c_uint32, 100, 1, 0), ('output_flag_present_flag', ctypes.c_uint32, 100, 1, 1), ('num_extra_slice_header_bits', ctypes.c_uint32, 100, 3, 2), ('sign_data_hiding_enabled_flag', ctypes.c_uint32, 100, 1, 5), ('cabac_init_present_flag', ctypes.c_uint32, 100, 1, 6), ('num_ref_idx_l0_default_active', ctypes.c_uint32, 100, 4, 7), ('num_ref_idx_l1_default_active', ctypes.c_uint32, 101, 4, 3), ('init_qp', ctypes.c_uint32, 101, 7, 7), ('constrained_intra_pred_flag', ctypes.c_uint32, 102, 1, 6), ('transform_skip_enabled_flag', ctypes.c_uint32, 102, 1, 7), ('cu_qp_delta_enabled_flag', ctypes.c_uint32, 103, 1, 0), ('diff_cu_qp_delta_depth', ctypes.c_uint32, 103, 2, 1), ('reserved4', ctypes.c_uint32, 103, 5, 3), ('pps_cb_qp_offset', ctypes.c_char, 104), ('pps_cr_qp_offset', ctypes.c_char, 105), ('pps_beta_offset', ctypes.c_char, 106), ('pps_tc_offset', ctypes.c_char, 107), ('pps_slice_chroma_qp_offsets_present_flag', ctypes.c_uint32, 108, 1, 0), ('weighted_pred_flag', ctypes.c_uint32, 108, 1, 1), ('weighted_bipred_flag', ctypes.c_uint32, 108, 1, 2), ('transquant_bypass_enabled_flag', ctypes.c_uint32, 108, 1, 3), ('tiles_enabled_flag', ctypes.c_uint32, 108, 1, 4), ('entropy_coding_sync_enabled_flag', ctypes.c_uint32, 108, 1, 5), ('num_tile_columns', ctypes.c_uint32, 108, 5, 6), ('num_tile_rows', ctypes.c_uint32, 109, 5, 3), ('loop_filter_across_tiles_enabled_flag', ctypes.c_uint32, 110, 1, 0), ('loop_filter_across_slices_enabled_flag', ctypes.c_uint32, 110, 1, 1), ('deblocking_filter_control_present_flag', ctypes.c_uint32, 110, 1, 2), ('deblocking_filter_override_enabled_flag', ctypes.c_uint32, 110, 1, 3), ('pps_deblocking_filter_disabled_flag', ctypes.c_uint32, 110, 1, 4), ('lists_modification_present_flag', ctypes.c_uint32, 110, 1, 5), ('log2_parallel_merge_level', ctypes.c_uint32, 110, 3, 6), ('slice_segment_header_extension_present_flag', ctypes.c_uint32, 111, 1, 1), ('reserved5', ctypes.c_uint32, 111, 6, 2), ('num_ref_frames', ctypes.c_ubyte, 112), ('reserved6', ctypes.c_ubyte, 113), ('longtermflag', ctypes.c_uint16, 114), ('initreflistidxl0', c.Array[ctypes.c_ubyte, Literal[16]], 116), ('initreflistidxl1', c.Array[ctypes.c_ubyte, Literal[16]], 132), ('RefDiffPicOrderCnts', c.Array[ctypes.c_int16, Literal[16]], 148), ('IDR_picture_flag', ctypes.c_ubyte, 180), ('RAP_picture_flag', ctypes.c_ubyte, 181), ('curr_pic_idx', ctypes.c_ubyte, 182), ('pattern_id', ctypes.c_ubyte, 183), ('sw_hdr_skip_length', ctypes.c_uint16, 184), ('reserved7', ctypes.c_uint16, 186), ('ecdma_cfg', nvdec_ecdma_config_s, 188), ('separate_colour_plane_flag', ctypes.c_uint32, 212, 1, 0), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_uint32, 212, 4, 1), ('num_short_term_ref_pic_sets', ctypes.c_uint32, 212, 7, 5), ('num_long_term_ref_pics_sps', ctypes.c_uint32, 213, 6, 4), ('bBitParsingDisable', ctypes.c_uint32, 214, 1, 2), ('num_delta_pocs_of_rps_idx', ctypes.c_uint32, 214, 8, 3), ('long_term_ref_pics_present_flag', ctypes.c_uint32, 215, 1, 3), ('reserved_dxva', ctypes.c_uint32, 215, 4, 4), ('num_bits_short_term_ref_pics_in_slice', ctypes.c_uint32, 216), ('v1', nvdec_hevc_pic_v1_s, 220), ('v2', nvdec_hevc_pic_v2_s, 252), ('v3', nvdec_hevc_pic_v3_s, 256), ('ssm', nvdec_pass2_otf_ext_s, 264)]) +nvdec_hevc_pic_s: TypeAlias = struct__nvdec_hevc_pic_s +@c.record +class struct__hevc_slice_info_s(c.Struct): + SIZE = 16 + first_flag: int + err_flag: int + last_flag: int + conceal_partial_slice: int + available: int + reserved0: int + ctb_count: int + bs_offset: int + bs_length: int + start_ctbx: int + start_ctby: int +struct__hevc_slice_info_s.register_fields([('first_flag', ctypes.c_uint32, 0, 1, 0), ('err_flag', ctypes.c_uint32, 0, 1, 1), ('last_flag', ctypes.c_uint32, 0, 1, 2), ('conceal_partial_slice', ctypes.c_uint32, 0, 1, 3), ('available', ctypes.c_uint32, 0, 1, 4), ('reserved0', ctypes.c_uint32, 0, 7, 5), ('ctb_count', ctypes.c_uint32, 1, 20, 4), ('bs_offset', ctypes.c_uint32, 4), ('bs_length', ctypes.c_uint32, 8), ('start_ctbx', ctypes.c_uint16, 12), ('start_ctby', ctypes.c_uint16, 14)]) +hevc_slice_info_s: TypeAlias = struct__hevc_slice_info_s +@c.record +class struct__slice_edge_ctb_pos_ctx_s(c.Struct): + SIZE = 8 + next_slice_pos_ctbxy: int + next_slice_segment_addr: int +struct__slice_edge_ctb_pos_ctx_s.register_fields([('next_slice_pos_ctbxy', ctypes.c_uint32, 0), ('next_slice_segment_addr', ctypes.c_uint32, 4)]) +slice_edge_ctb_pos_ctx_s: TypeAlias = struct__slice_edge_ctb_pos_ctx_s +@c.record +class struct__slice_edge_tile_ctx_s(c.Struct): + SIZE = 12 + tileInfo1: int + tileInfo2: int + tileInfo3: int +struct__slice_edge_tile_ctx_s.register_fields([('tileInfo1', ctypes.c_uint32, 0), ('tileInfo2', ctypes.c_uint32, 4), ('tileInfo3', ctypes.c_uint32, 8)]) +slice_edge_tile_ctx_s: TypeAlias = struct__slice_edge_tile_ctx_s +@c.record +class struct__slice_edge_stats_ctx_s(c.Struct): + SIZE = 32 + frame_status_intra_cnt: int + frame_status_inter_cnt: int + frame_status_skip_cnt: int + frame_status_fwd_mvx_cnt: int + frame_status_fwd_mvy_cnt: int + frame_status_bwd_mvx_cnt: int + frame_status_bwd_mvy_cnt: int + frame_status_mv_cnt_ext: int +struct__slice_edge_stats_ctx_s.register_fields([('frame_status_intra_cnt', ctypes.c_uint32, 0), ('frame_status_inter_cnt', ctypes.c_uint32, 4), ('frame_status_skip_cnt', ctypes.c_uint32, 8), ('frame_status_fwd_mvx_cnt', ctypes.c_uint32, 12), ('frame_status_fwd_mvy_cnt', ctypes.c_uint32, 16), ('frame_status_bwd_mvx_cnt', ctypes.c_uint32, 20), ('frame_status_bwd_mvy_cnt', ctypes.c_uint32, 24), ('frame_status_mv_cnt_ext', ctypes.c_uint32, 28)]) +slice_edge_stats_ctx_s: TypeAlias = struct__slice_edge_stats_ctx_s +@c.record +class struct__slice_vpc_edge_ctx_s(c.Struct): + SIZE = 4 + reserved: int +struct__slice_vpc_edge_ctx_s.register_fields([('reserved', ctypes.c_uint32, 0)]) +slice_vpc_edge_ctx_s: TypeAlias = struct__slice_vpc_edge_ctx_s +@c.record +class struct__slice_vpc_main_ctx_s(c.Struct): + SIZE = 4 + reserved: int +struct__slice_vpc_main_ctx_s.register_fields([('reserved', ctypes.c_uint32, 0)]) +slice_vpc_main_ctx_s: TypeAlias = struct__slice_vpc_main_ctx_s +@c.record +class struct__slice_edge_ctx_s(c.Struct): + SIZE = 60 + slice_ctb_pos_ctx: struct__slice_edge_ctb_pos_ctx_s + slice_stats_ctx: struct__slice_edge_stats_ctx_s + slice_tile_ctx: struct__slice_edge_tile_ctx_s + slice_vpc_edge_ctx: struct__slice_vpc_edge_ctx_s + slice_vpc_main_ctx: struct__slice_vpc_main_ctx_s +struct__slice_edge_ctx_s.register_fields([('slice_ctb_pos_ctx', slice_edge_ctb_pos_ctx_s, 0), ('slice_stats_ctx', slice_edge_stats_ctx_s, 8), ('slice_tile_ctx', slice_edge_tile_ctx_s, 40), ('slice_vpc_edge_ctx', slice_vpc_edge_ctx_s, 52), ('slice_vpc_main_ctx', slice_vpc_main_ctx_s, 56)]) +slice_edge_ctx_s: TypeAlias = struct__slice_edge_ctx_s +@c.record +class struct__nvdec_vp9_pic_v1_s(c.Struct): + SIZE = 8 + Vp9FltAboveOffset: int + external_ref_mem_dis: int + bit_depth: int + error_recovery_start_pos: int + error_external_mv_en: int + Reserved0: int +struct__nvdec_vp9_pic_v1_s.register_fields([('Vp9FltAboveOffset', ctypes.c_uint32, 0), ('external_ref_mem_dis', ctypes.c_uint32, 4, 1, 0), ('bit_depth', ctypes.c_uint32, 4, 4, 1), ('error_recovery_start_pos', ctypes.c_uint32, 4, 2, 5), ('error_external_mv_en', ctypes.c_uint32, 4, 1, 7), ('Reserved0', ctypes.c_uint32, 5, 24, 0)]) +nvdec_vp9_pic_v1_s: TypeAlias = struct__nvdec_vp9_pic_v1_s +enum_VP9_FRAME_SFC_ID: dict[int, str] = {(VP9_LAST_FRAME_SFC:=0): 'VP9_LAST_FRAME_SFC', (VP9_GOLDEN_FRAME_SFC:=1): 'VP9_GOLDEN_FRAME_SFC', (VP9_ALTREF_FRAME_SFC:=2): 'VP9_ALTREF_FRAME_SFC', (VP9_CURR_FRAME_SFC:=3): 'VP9_CURR_FRAME_SFC'} +@c.record +class struct__nvdec_vp9_pic_s(c.Struct): + SIZE = 256 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + stream_len: int + enable_encryption: int + key_increment: int + encryption_mode: int + sw_hdr_skip_length: int + key_slot_index: int + ssm_en: int + enable_histogram: int + reserved0: int + gptimer_timeout_value: int + tileformat: int + gob_height: int + reserverd_surface_format: int + reserved1: c.Array[ctypes.c_ubyte, Literal[3]] + Vp9BsdCtrlOffset: int + ref0_width: int + ref0_height: int + ref0_stride: c.Array[ctypes.c_uint16, Literal[2]] + ref1_width: int + ref1_height: int + ref1_stride: c.Array[ctypes.c_uint16, Literal[2]] + ref2_width: int + ref2_height: int + ref2_stride: c.Array[ctypes.c_uint16, Literal[2]] + width: int + height: int + framestride: c.Array[ctypes.c_uint16, Literal[2]] + keyFrame: int + prevIsKeyFrame: int + resolutionChange: int + errorResilient: int + prevShowFrame: int + intraOnly: int + reserved2: int + reserved3: c.Array[ctypes.c_ubyte, Literal[3]] + refFrameSignBias: c.Array[ctypes.c_ubyte, Literal[4]] + loopFilterLevel: bytes + loopFilterSharpness: bytes + qpYAc: int + qpYDc: bytes + qpChAc: bytes + qpChDc: bytes + lossless: bytes + transform_mode: bytes + allow_high_precision_mv: bytes + mcomp_filter_type: bytes + comp_pred_mode: bytes + comp_fixed_ref: bytes + comp_var_ref: c.Array[ctypes.c_char, Literal[2]] + log2_tile_columns: bytes + log2_tile_rows: bytes + segmentEnabled: int + segmentMapUpdate: int + segmentMapTemporalUpdate: int + segmentFeatureMode: int + segmentFeatureEnable: c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[8]] + segmentFeatureData: c.Array[c.Array[ctypes.c_int16, Literal[4]], Literal[8]] + modeRefLfEnabled: bytes + mbRefLfDelta: c.Array[ctypes.c_char, Literal[4]] + mbModeLfDelta: c.Array[ctypes.c_char, Literal[2]] + reserved5: bytes + v1: struct__nvdec_vp9_pic_v1_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vp9_pic_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('stream_len', ctypes.c_uint32, 48), ('enable_encryption', ctypes.c_uint32, 52), ('key_increment', ctypes.c_uint32, 56, 6, 0), ('encryption_mode', ctypes.c_uint32, 56, 4, 6), ('sw_hdr_skip_length', ctypes.c_uint32, 57, 14, 2), ('key_slot_index', ctypes.c_uint32, 59, 4, 0), ('ssm_en', ctypes.c_uint32, 59, 1, 4), ('enable_histogram', ctypes.c_uint32, 59, 1, 5), ('reserved0', ctypes.c_uint32, 59, 2, 6), ('gptimer_timeout_value', ctypes.c_uint32, 60), ('tileformat', ctypes.c_ubyte, 64, 2, 0), ('gob_height', ctypes.c_ubyte, 64, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 64, 3, 5), ('reserved1', c.Array[ctypes.c_ubyte, Literal[3]], 65), ('Vp9BsdCtrlOffset', ctypes.c_uint32, 68), ('ref0_width', ctypes.c_uint16, 72), ('ref0_height', ctypes.c_uint16, 74), ('ref0_stride', c.Array[ctypes.c_uint16, Literal[2]], 76), ('ref1_width', ctypes.c_uint16, 80), ('ref1_height', ctypes.c_uint16, 82), ('ref1_stride', c.Array[ctypes.c_uint16, Literal[2]], 84), ('ref2_width', ctypes.c_uint16, 88), ('ref2_height', ctypes.c_uint16, 90), ('ref2_stride', c.Array[ctypes.c_uint16, Literal[2]], 92), ('width', ctypes.c_uint16, 96), ('height', ctypes.c_uint16, 98), ('framestride', c.Array[ctypes.c_uint16, Literal[2]], 100), ('keyFrame', ctypes.c_ubyte, 104, 1, 0), ('prevIsKeyFrame', ctypes.c_ubyte, 104, 1, 1), ('resolutionChange', ctypes.c_ubyte, 104, 1, 2), ('errorResilient', ctypes.c_ubyte, 104, 1, 3), ('prevShowFrame', ctypes.c_ubyte, 104, 1, 4), ('intraOnly', ctypes.c_ubyte, 104, 1, 5), ('reserved2', ctypes.c_ubyte, 104, 2, 6), ('reserved3', c.Array[ctypes.c_ubyte, Literal[3]], 105), ('refFrameSignBias', c.Array[ctypes.c_ubyte, Literal[4]], 108), ('loopFilterLevel', ctypes.c_char, 112), ('loopFilterSharpness', ctypes.c_char, 113), ('qpYAc', ctypes.c_ubyte, 114), ('qpYDc', ctypes.c_char, 115), ('qpChAc', ctypes.c_char, 116), ('qpChDc', ctypes.c_char, 117), ('lossless', ctypes.c_char, 118), ('transform_mode', ctypes.c_char, 119), ('allow_high_precision_mv', ctypes.c_char, 120), ('mcomp_filter_type', ctypes.c_char, 121), ('comp_pred_mode', ctypes.c_char, 122), ('comp_fixed_ref', ctypes.c_char, 123), ('comp_var_ref', c.Array[ctypes.c_char, Literal[2]], 124), ('log2_tile_columns', ctypes.c_char, 126), ('log2_tile_rows', ctypes.c_char, 127), ('segmentEnabled', ctypes.c_ubyte, 128), ('segmentMapUpdate', ctypes.c_ubyte, 129), ('segmentMapTemporalUpdate', ctypes.c_ubyte, 130), ('segmentFeatureMode', ctypes.c_ubyte, 131), ('segmentFeatureEnable', c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[8]], 132), ('segmentFeatureData', c.Array[c.Array[ctypes.c_int16, Literal[4]], Literal[8]], 164), ('modeRefLfEnabled', ctypes.c_char, 228), ('mbRefLfDelta', c.Array[ctypes.c_char, Literal[4]], 229), ('mbModeLfDelta', c.Array[ctypes.c_char, Literal[2]], 233), ('reserved5', ctypes.c_char, 235), ('v1', nvdec_vp9_pic_v1_s, 236), ('ssm', nvdec_pass2_otf_ext_s, 244)]) +nvdec_vp9_pic_s: TypeAlias = struct__nvdec_vp9_pic_s +@c.record +class nvdec_nmv_context(c.Struct): + SIZE = 69 + joints: c.Array[ctypes.c_ubyte, Literal[3]] + sign: c.Array[ctypes.c_ubyte, Literal[2]] + class0: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]] + fp: c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]] + class0_hp: c.Array[ctypes.c_ubyte, Literal[2]] + hp: c.Array[ctypes.c_ubyte, Literal[2]] + classes: c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]] + class0_fp: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], Literal[2]] + bits: c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]] +nvdec_nmv_context.register_fields([('joints', c.Array[ctypes.c_ubyte, Literal[3]], 0), ('sign', c.Array[ctypes.c_ubyte, Literal[2]], 3), ('class0', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]], 5), ('fp', c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], 7), ('class0_hp', c.Array[ctypes.c_ubyte, Literal[2]], 13), ('hp', c.Array[ctypes.c_ubyte, Literal[2]], 15), ('classes', c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]], 17), ('class0_fp', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], Literal[2]], 37), ('bits', c.Array[c.Array[ctypes.c_ubyte, Literal[10]], Literal[2]], 49)]) +@c.record +class nvdec_nmv_context_counts(c.Struct): + SIZE = 424 + joints: c.Array[ctypes.c_uint32, Literal[4]] + sign: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + classes: c.Array[c.Array[ctypes.c_uint32, Literal[11]], Literal[2]] + class0: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + bits: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[10]], Literal[2]] + class0_fp: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], Literal[2]] + fp: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]] + class0_hp: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + hp: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] +nvdec_nmv_context_counts.register_fields([('joints', c.Array[ctypes.c_uint32, Literal[4]], 0), ('sign', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 16), ('classes', c.Array[c.Array[ctypes.c_uint32, Literal[11]], Literal[2]], 32), ('class0', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 120), ('bits', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[10]], Literal[2]], 136), ('class0_fp', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], Literal[2]], 296), ('fp', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], 360), ('class0_hp', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 392), ('hp', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 408)]) +@c.record +class struct_nvdec_vp9AdaptiveEntropyProbs_s(c.Struct): + SIZE = 2720 + inter_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[7]] + intra_inter_prob: c.Array[ctypes.c_ubyte, Literal[4]] + uv_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]] + tx8x8_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]] + tx16x16_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[2]] + tx32x32_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]] + sb_ymode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[4]] + sb_ymode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[4]] + partition_prob: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[16]], Literal[2]] + uv_mode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]] + switchable_interp_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[4]] + comp_inter_prob: c.Array[ctypes.c_ubyte, Literal[5]] + mbskip_probs: c.Array[ctypes.c_ubyte, Literal[3]] + pad1: c.Array[ctypes.c_ubyte, Literal[1]] + nmvc: nvdec_nmv_context + single_ref_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[5]] + comp_ref_prob: c.Array[ctypes.c_ubyte, Literal[5]] + pad2: c.Array[ctypes.c_ubyte, Literal[17]] + probCoeffs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs8x8: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs16x16: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + probCoeffs32x32: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] +struct_nvdec_vp9AdaptiveEntropyProbs_s.register_fields([('inter_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[7]], 0), ('intra_inter_prob', c.Array[ctypes.c_ubyte, Literal[4]], 28), ('uv_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], 32), ('tx8x8_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[2]], 112), ('tx16x16_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[2]], 114), ('tx32x32_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[3]], Literal[2]], 118), ('sb_ymode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[4]], 124), ('sb_ymode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[4]], 128), ('partition_prob', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[16]], Literal[2]], 160), ('uv_mode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], 288), ('switchable_interp_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[4]], 298), ('comp_inter_prob', c.Array[ctypes.c_ubyte, Literal[5]], 306), ('mbskip_probs', c.Array[ctypes.c_ubyte, Literal[3]], 311), ('pad1', c.Array[ctypes.c_ubyte, Literal[1]], 314), ('nmvc', nvdec_nmv_context, 315), ('single_ref_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[5]], 384), ('comp_ref_prob', c.Array[ctypes.c_ubyte, Literal[5]], 394), ('pad2', c.Array[ctypes.c_ubyte, Literal[17]], 399), ('probCoeffs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 416), ('probCoeffs8x8', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 992), ('probCoeffs16x16', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 1568), ('probCoeffs32x32', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 2144)]) +nvdec_vp9AdaptiveEntropyProbs_t: TypeAlias = struct_nvdec_vp9AdaptiveEntropyProbs_s +@c.record +class struct_nvdec_vp9EntropyProbs_s(c.Struct): + SIZE = 3744 + kf_bmode_prob: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], Literal[10]] + kf_bmode_probB: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], Literal[10]] + ref_pred_probs: c.Array[ctypes.c_ubyte, Literal[3]] + mb_segment_tree_probs: c.Array[ctypes.c_ubyte, Literal[7]] + segment_pred_probs: c.Array[ctypes.c_ubyte, Literal[3]] + ref_scores: c.Array[ctypes.c_ubyte, Literal[4]] + prob_comppred: c.Array[ctypes.c_ubyte, Literal[2]] + pad1: c.Array[ctypes.c_ubyte, Literal[9]] + kf_uv_mode_prob: c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]] + kf_uv_mode_probB: c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]] + pad2: c.Array[ctypes.c_ubyte, Literal[6]] + a: struct_nvdec_vp9AdaptiveEntropyProbs_s +struct_nvdec_vp9EntropyProbs_s.register_fields([('kf_bmode_prob', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], Literal[10]], 0), ('kf_bmode_probB', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], Literal[10]], 800), ('ref_pred_probs', c.Array[ctypes.c_ubyte, Literal[3]], 900), ('mb_segment_tree_probs', c.Array[ctypes.c_ubyte, Literal[7]], 903), ('segment_pred_probs', c.Array[ctypes.c_ubyte, Literal[3]], 910), ('ref_scores', c.Array[ctypes.c_ubyte, Literal[4]], 913), ('prob_comppred', c.Array[ctypes.c_ubyte, Literal[2]], 917), ('pad1', c.Array[ctypes.c_ubyte, Literal[9]], 919), ('kf_uv_mode_prob', c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[10]], 928), ('kf_uv_mode_probB', c.Array[c.Array[ctypes.c_ubyte, Literal[1]], Literal[10]], 1008), ('pad2', c.Array[ctypes.c_ubyte, Literal[6]], 1018), ('a', nvdec_vp9AdaptiveEntropyProbs_t, 1024)]) +nvdec_vp9EntropyProbs_t: TypeAlias = struct_nvdec_vp9EntropyProbs_s +@c.record +class struct_nvdec_vp9EntropyCounts_s(c.Struct): + SIZE = 13264 + inter_mode_counts: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], Literal[7]] + sb_ymode_counts: c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[4]] + uv_mode_counts: c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[10]] + partition_counts: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[16]] + switchable_interp_counts: c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[4]] + intra_inter_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[4]] + comp_inter_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]] + single_ref_count: c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], Literal[5]] + comp_ref_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]] + tx32x32_count: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]] + tx16x16_count: c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[2]] + tx8x8_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]] + mbskip_count: c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]] + nmvcount: nvdec_nmv_context_counts + countCoeffs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs8x8: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs16x16: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countCoeffs32x32: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]] + countEobs: c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[6]], Literal[6]], Literal[2]], Literal[2]], Literal[4]] +struct_nvdec_vp9EntropyCounts_s.register_fields([('inter_mode_counts', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], Literal[7]], 0), ('sb_ymode_counts', c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[4]], 168), ('uv_mode_counts', c.Array[c.Array[ctypes.c_uint32, Literal[10]], Literal[10]], 328), ('partition_counts', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[16]], 728), ('switchable_interp_counts', c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[4]], 984), ('intra_inter_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[4]], 1032), ('comp_inter_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]], 1064), ('single_ref_count', c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], Literal[5]], 1104), ('comp_ref_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[5]], 1184), ('tx32x32_count', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[2]], 1224), ('tx16x16_count', c.Array[c.Array[ctypes.c_uint32, Literal[3]], Literal[2]], 1256), ('tx8x8_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[2]], 1280), ('mbskip_count', c.Array[c.Array[ctypes.c_uint32, Literal[2]], Literal[3]], 1296), ('nmvcount', nvdec_nmv_context_counts, 1320), ('countCoeffs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 1744), ('countCoeffs8x8', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 4048), ('countCoeffs16x16', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 6352), ('countCoeffs32x32', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[6]], Literal[6]], Literal[2]], Literal[2]], 8656), ('countEobs', c.Array[c.Array[c.Array[c.Array[c.Array[ctypes.c_uint32, Literal[6]], Literal[6]], Literal[2]], Literal[2]], Literal[4]], 10960)]) +nvdec_vp9EntropyCounts_t: TypeAlias = struct_nvdec_vp9EntropyCounts_s +@c.record +class struct__nvdec_pass2_otf_s(c.Struct): + SIZE = 52 + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + enable_encryption: int + key_increment: int + encryption_mode: int + key_slot_index: int + ssm_en: int + reserved1: int +struct__nvdec_pass2_otf_s.register_fields([('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 0), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 32), ('enable_encryption', ctypes.c_uint32, 48, 1, 0), ('key_increment', ctypes.c_uint32, 48, 6, 1), ('encryption_mode', ctypes.c_uint32, 48, 4, 7), ('key_slot_index', ctypes.c_uint32, 49, 4, 3), ('ssm_en', ctypes.c_uint32, 49, 1, 7), ('reserved1', ctypes.c_uint32, 50, 16, 0)]) +nvdec_pass2_otf_s: TypeAlias = struct__nvdec_pass2_otf_s +@c.record +class struct__nvdec_display_param_s(c.Struct): + SIZE = 28 + enableTFOutput: int + VC1MapYFlag: int + MapYValue: int + VC1MapUVFlag: int + MapUVValue: int + OutStride: int + TilingFormat: int + OutputStructure: int + reserved0: int + OutputTop: c.Array[ctypes.c_int32, Literal[2]] + OutputBottom: c.Array[ctypes.c_int32, Literal[2]] + enableHistogram: int + HistogramStartX: int + HistogramStartY: int + reserved1: int + HistogramEndX: int + HistogramEndY: int + reserved2: int +struct__nvdec_display_param_s.register_fields([('enableTFOutput', ctypes.c_uint32, 0, 1, 0), ('VC1MapYFlag', ctypes.c_uint32, 0, 1, 1), ('MapYValue', ctypes.c_uint32, 0, 3, 2), ('VC1MapUVFlag', ctypes.c_uint32, 0, 1, 5), ('MapUVValue', ctypes.c_uint32, 0, 3, 6), ('OutStride', ctypes.c_uint32, 1, 8, 1), ('TilingFormat', ctypes.c_uint32, 2, 3, 1), ('OutputStructure', ctypes.c_uint32, 2, 1, 4), ('reserved0', ctypes.c_uint32, 2, 11, 5), ('OutputTop', c.Array[ctypes.c_int32, Literal[2]], 4), ('OutputBottom', c.Array[ctypes.c_int32, Literal[2]], 12), ('enableHistogram', ctypes.c_uint32, 20, 1, 0), ('HistogramStartX', ctypes.c_uint32, 20, 12, 1), ('HistogramStartY', ctypes.c_uint32, 21, 12, 5), ('reserved1', ctypes.c_uint32, 23, 7, 1), ('HistogramEndX', ctypes.c_uint32, 24, 12, 0), ('HistogramEndY', ctypes.c_uint32, 25, 12, 4), ('reserved2', ctypes.c_uint32, 27, 8, 0)]) +nvdec_display_param_s: TypeAlias = struct__nvdec_display_param_s +@c.record +class struct__nvdec_dpb_entry_s(c.Struct): + SIZE = 16 + index: int + col_idx: int + state: int + is_long_term: int + not_existing: int + is_field: int + top_field_marking: int + bottom_field_marking: int + output_memory_layout: int + reserved: int + FieldOrderCnt: c.Array[ctypes.c_uint32, Literal[2]] + FrameIdx: int +struct__nvdec_dpb_entry_s.register_fields([('index', ctypes.c_uint32, 0, 7, 0), ('col_idx', ctypes.c_uint32, 0, 5, 7), ('state', ctypes.c_uint32, 1, 2, 4), ('is_long_term', ctypes.c_uint32, 1, 1, 6), ('not_existing', ctypes.c_uint32, 1, 1, 7), ('is_field', ctypes.c_uint32, 2, 1, 0), ('top_field_marking', ctypes.c_uint32, 2, 4, 1), ('bottom_field_marking', ctypes.c_uint32, 2, 4, 5), ('output_memory_layout', ctypes.c_uint32, 3, 1, 1), ('reserved', ctypes.c_uint32, 3, 6, 2), ('FieldOrderCnt', c.Array[ctypes.c_uint32, Literal[2]], 4), ('FrameIdx', ctypes.c_int32, 12)]) +nvdec_dpb_entry_s: TypeAlias = struct__nvdec_dpb_entry_s +@c.record +class struct__nvdec_h264_pic_s(c.Struct): + SIZE = 764 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + hint_dump_en: int + reserved0: c.Array[ctypes.c_ubyte, Literal[2]] + stream_len: int + slice_count: int + mbhist_buffer_size: int + gptimer_timeout_value: int + log2_max_pic_order_cnt_lsb_minus4: int + delta_pic_order_always_zero_flag: int + frame_mbs_only_flag: int + PicWidthInMbs: int + FrameHeightInMbs: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + entropy_coding_mode_flag: int + pic_order_present_flag: int + num_ref_idx_l0_active_minus1: int + num_ref_idx_l1_active_minus1: int + deblocking_filter_control_present_flag: int + redundant_pic_cnt_present_flag: int + transform_8x8_mode_flag: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + MbaffFrameFlag: int + direct_8x8_inference_flag: int + weighted_pred_flag: int + constrained_intra_pred_flag: int + ref_pic_flag: int + field_pic_flag: int + bottom_field_flag: int + second_field: int + log2_max_frame_num_minus4: int + chroma_format_idc: int + pic_order_cnt_type: int + pic_init_qp_minus26: int + chroma_qp_index_offset: int + second_chroma_qp_index_offset: int + weighted_bipred_idc: int + CurrPicIdx: int + CurrColIdx: int + frame_num: int + frame_surfaces: int + output_memory_layout: int + CurrFieldOrderCnt: c.Array[ctypes.c_int32, Literal[2]] + dpb: c.Array[struct__nvdec_dpb_entry_s, Literal[16]] + WeightScale: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]] + WeightScale8x8: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]] + num_inter_view_refs_lX: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_char, Literal[14]] + inter_view_refidx_lX: c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]] + lossless_ipred8x8_filter_enable: int + qpprime_y_zero_transform_bypass_flag: int + reserved2: int + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_h264_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('hint_dump_en', ctypes.c_ubyte, 69), ('reserved0', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('mbhist_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_int32, 88), ('delta_pic_order_always_zero_flag', ctypes.c_int32, 92), ('frame_mbs_only_flag', ctypes.c_int32, 96), ('PicWidthInMbs', ctypes.c_int32, 100), ('FrameHeightInMbs', ctypes.c_int32, 104), ('tileFormat', ctypes.c_uint32, 108, 2, 0), ('gob_height', ctypes.c_uint32, 108, 3, 2), ('reserverd_surface_format', ctypes.c_uint32, 108, 27, 5), ('entropy_coding_mode_flag', ctypes.c_int32, 112), ('pic_order_present_flag', ctypes.c_int32, 116), ('num_ref_idx_l0_active_minus1', ctypes.c_int32, 120), ('num_ref_idx_l1_active_minus1', ctypes.c_int32, 124), ('deblocking_filter_control_present_flag', ctypes.c_int32, 128), ('redundant_pic_cnt_present_flag', ctypes.c_int32, 132), ('transform_8x8_mode_flag', ctypes.c_int32, 136), ('pitch_luma', ctypes.c_uint32, 140), ('pitch_chroma', ctypes.c_uint32, 144), ('luma_top_offset', ctypes.c_uint32, 148), ('luma_bot_offset', ctypes.c_uint32, 152), ('luma_frame_offset', ctypes.c_uint32, 156), ('chroma_top_offset', ctypes.c_uint32, 160), ('chroma_bot_offset', ctypes.c_uint32, 164), ('chroma_frame_offset', ctypes.c_uint32, 168), ('HistBufferSize', ctypes.c_uint32, 172), ('MbaffFrameFlag', ctypes.c_uint32, 176, 1, 0), ('direct_8x8_inference_flag', ctypes.c_uint32, 176, 1, 1), ('weighted_pred_flag', ctypes.c_uint32, 176, 1, 2), ('constrained_intra_pred_flag', ctypes.c_uint32, 176, 1, 3), ('ref_pic_flag', ctypes.c_uint32, 176, 1, 4), ('field_pic_flag', ctypes.c_uint32, 176, 1, 5), ('bottom_field_flag', ctypes.c_uint32, 176, 1, 6), ('second_field', ctypes.c_uint32, 176, 1, 7), ('log2_max_frame_num_minus4', ctypes.c_uint32, 177, 4, 0), ('chroma_format_idc', ctypes.c_uint32, 177, 2, 4), ('pic_order_cnt_type', ctypes.c_uint32, 177, 2, 6), ('pic_init_qp_minus26', ctypes.c_int32, 178, 6, 0), ('chroma_qp_index_offset', ctypes.c_int32, 178, 5, 6), ('second_chroma_qp_index_offset', ctypes.c_int32, 179, 5, 3), ('weighted_bipred_idc', ctypes.c_uint32, 180, 2, 0), ('CurrPicIdx', ctypes.c_uint32, 180, 7, 2), ('CurrColIdx', ctypes.c_uint32, 181, 5, 1), ('frame_num', ctypes.c_uint32, 181, 16, 6), ('frame_surfaces', ctypes.c_uint32, 183, 1, 6), ('output_memory_layout', ctypes.c_uint32, 183, 1, 7), ('CurrFieldOrderCnt', c.Array[ctypes.c_int32, Literal[2]], 184), ('dpb', c.Array[nvdec_dpb_entry_s, Literal[16]], 192), ('WeightScale', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]], 448), ('WeightScale8x8', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]], 544), ('num_inter_view_refs_lX', c.Array[ctypes.c_ubyte, Literal[2]], 672), ('reserved1', c.Array[ctypes.c_char, Literal[14]], 674), ('inter_view_refidx_lX', c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]], 688), ('lossless_ipred8x8_filter_enable', ctypes.c_uint32, 720, 1, 0), ('qpprime_y_zero_transform_bypass_flag', ctypes.c_uint32, 720, 1, 1), ('reserved2', ctypes.c_uint32, 720, 30, 2), ('displayPara', nvdec_display_param_s, 724), ('ssm', nvdec_pass2_otf_ext_s, 752)]) +nvdec_h264_pic_s: TypeAlias = struct__nvdec_h264_pic_s +enum__vc1_fcm_e: dict[int, str] = {(FCM_PROGRESSIVE:=0): 'FCM_PROGRESSIVE', (FCM_FRAME_INTERLACE:=2): 'FCM_FRAME_INTERLACE', (FCM_FIELD_INTERLACE:=3): 'FCM_FIELD_INTERLACE'} +vc1_fcm_e: TypeAlias = ctypes.c_uint32 +enum__syntax_vc1_ptype_e: dict[int, str] = {(PTYPE_I:=0): 'PTYPE_I', (PTYPE_P:=1): 'PTYPE_P', (PTYPE_B:=2): 'PTYPE_B', (PTYPE_BI:=3): 'PTYPE_BI', (PTYPE_SKIPPED:=4): 'PTYPE_SKIPPED'} +syntax_vc1_ptype_e: TypeAlias = ctypes.c_uint32 +enum_vc1_mvmode_e: dict[int, str] = {(MVMODE_MIXEDMV:=0): 'MVMODE_MIXEDMV', (MVMODE_1MV:=1): 'MVMODE_1MV', (MVMODE_1MV_HALFPEL:=2): 'MVMODE_1MV_HALFPEL', (MVMODE_1MV_HALFPEL_BILINEAR:=3): 'MVMODE_1MV_HALFPEL_BILINEAR', (MVMODE_INTENSITY_COMPENSATION:=4): 'MVMODE_INTENSITY_COMPENSATION'} +enum__vc1_fptype_e: dict[int, str] = {(FPTYPE_I_I:=0): 'FPTYPE_I_I', (FPTYPE_I_P:=1): 'FPTYPE_I_P', (FPTYPE_P_I:=2): 'FPTYPE_P_I', (FPTYPE_P_P:=3): 'FPTYPE_P_P', (FPTYPE_B_B:=4): 'FPTYPE_B_B', (FPTYPE_B_BI:=5): 'FPTYPE_B_BI', (FPTYPE_BI_B:=6): 'FPTYPE_BI_B', (FPTYPE_BI_BI:=7): 'FPTYPE_BI_BI'} +vc1_fptype_e: TypeAlias = ctypes.c_uint32 +enum__vc1_dqprofile_e: dict[int, str] = {(DQPROFILE_ALL_FOUR_EDGES:=0): 'DQPROFILE_ALL_FOUR_EDGES', (DQPROFILE_DOUBLE_EDGE:=1): 'DQPROFILE_DOUBLE_EDGE', (DQPROFILE_SINGLE_EDGE:=2): 'DQPROFILE_SINGLE_EDGE', (DQPROFILE_ALL_MACROBLOCKS:=3): 'DQPROFILE_ALL_MACROBLOCKS'} +vc1_dqprofile_e: TypeAlias = ctypes.c_uint32 +@c.record +class struct__nvdec_vc1_pic_s(c.Struct): + SIZE = 404 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + prefixStartCode: c.Array[ctypes.c_ubyte, Literal[4]] + bitstream_offset: int + explicitEOSPresentFlag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + scratch_pic_buffer_size: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + profile: int + postprocflag: int + pulldown: int + interlace: int + tfcntrflag: int + finterpflag: int + psf: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + multires: int + syncmarker: int + rangered: int + maxbframes: int + dquant: int + panscan_flag: int + refdist_flag: int + quantizer: int + extended_mv: int + extended_dmv: int + overlap: int + vstransform: int + refdist: bytes + reserved1: c.Array[ctypes.c_char, Literal[3]] + fcm: int + ptype: int + tfcntr: int + rptfrm: int + tff: int + rndctrl: int + pqindex: int + halfqp: int + pquantizer: int + postproc: int + condover: int + transacfrm: int + transacfrm2: int + transdctab: int + pqdiff: int + abspq: int + dquantfrm: int + dqprofile: int + dqsbedge: int + dqdbedge: int + dqbilevel: int + mvrange: int + mvmode: int + mvmode2: int + lumscale: int + lumshift: int + mvtab: int + cbptab: int + ttmbf: int + ttfrm: int + bfraction: int + fptype: int + numref: int + reffield: int + dmvrange: int + intcompfield: int + lumscale1: int + lumshift1: int + lumscale2: int + lumshift2: int + mbmodetab: int + imvtab: int + icbptab: int + fourmvbptab: int + fourmvswitch: int + intcomp: int + twomvbptab: int + rangeredfrm: int + HistBufferSize: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + CodedWidth: int + CodedHeight: int + loopfilter: int + fastuvmc: int + output_memory_layout: int + ref_memory_layout: c.Array[ctypes.c_ubyte, Literal[2]] + reserved3: c.Array[ctypes.c_ubyte, Literal[3]] + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vc1_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('prefixStartCode', c.Array[ctypes.c_ubyte, Literal[4]], 68), ('bitstream_offset', ctypes.c_uint32, 72), ('explicitEOSPresentFlag', ctypes.c_ubyte, 76), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 77), ('stream_len', ctypes.c_uint32, 80), ('slice_count', ctypes.c_uint32, 84), ('scratch_pic_buffer_size', ctypes.c_uint32, 88), ('gptimer_timeout_value', ctypes.c_uint32, 92), ('FrameWidth', ctypes.c_uint16, 96), ('FrameHeight', ctypes.c_uint16, 98), ('profile', ctypes.c_ubyte, 100), ('postprocflag', ctypes.c_ubyte, 101), ('pulldown', ctypes.c_ubyte, 102), ('interlace', ctypes.c_ubyte, 103), ('tfcntrflag', ctypes.c_ubyte, 104), ('finterpflag', ctypes.c_ubyte, 105), ('psf', ctypes.c_ubyte, 106), ('tileFormat', ctypes.c_ubyte, 107, 2, 0), ('gob_height', ctypes.c_ubyte, 107, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 107, 3, 5), ('multires', ctypes.c_ubyte, 108), ('syncmarker', ctypes.c_ubyte, 109), ('rangered', ctypes.c_ubyte, 110), ('maxbframes', ctypes.c_ubyte, 111), ('dquant', ctypes.c_ubyte, 112), ('panscan_flag', ctypes.c_ubyte, 113), ('refdist_flag', ctypes.c_ubyte, 114), ('quantizer', ctypes.c_ubyte, 115), ('extended_mv', ctypes.c_ubyte, 116), ('extended_dmv', ctypes.c_ubyte, 117), ('overlap', ctypes.c_ubyte, 118), ('vstransform', ctypes.c_ubyte, 119), ('refdist', ctypes.c_char, 120), ('reserved1', c.Array[ctypes.c_char, Literal[3]], 121), ('fcm', vc1_fcm_e, 124), ('ptype', syntax_vc1_ptype_e, 128), ('tfcntr', ctypes.c_int32, 132), ('rptfrm', ctypes.c_int32, 136), ('tff', ctypes.c_int32, 140), ('rndctrl', ctypes.c_int32, 144), ('pqindex', ctypes.c_int32, 148), ('halfqp', ctypes.c_int32, 152), ('pquantizer', ctypes.c_int32, 156), ('postproc', ctypes.c_int32, 160), ('condover', ctypes.c_int32, 164), ('transacfrm', ctypes.c_int32, 168), ('transacfrm2', ctypes.c_int32, 172), ('transdctab', ctypes.c_int32, 176), ('pqdiff', ctypes.c_int32, 180), ('abspq', ctypes.c_int32, 184), ('dquantfrm', ctypes.c_int32, 188), ('dqprofile', vc1_dqprofile_e, 192), ('dqsbedge', ctypes.c_int32, 196), ('dqdbedge', ctypes.c_int32, 200), ('dqbilevel', ctypes.c_int32, 204), ('mvrange', ctypes.c_int32, 208), ('mvmode', ctypes.c_uint32, 212), ('mvmode2', ctypes.c_uint32, 216), ('lumscale', ctypes.c_int32, 220), ('lumshift', ctypes.c_int32, 224), ('mvtab', ctypes.c_int32, 228), ('cbptab', ctypes.c_int32, 232), ('ttmbf', ctypes.c_int32, 236), ('ttfrm', ctypes.c_int32, 240), ('bfraction', ctypes.c_int32, 244), ('fptype', vc1_fptype_e, 248), ('numref', ctypes.c_int32, 252), ('reffield', ctypes.c_int32, 256), ('dmvrange', ctypes.c_int32, 260), ('intcompfield', ctypes.c_int32, 264), ('lumscale1', ctypes.c_int32, 268), ('lumshift1', ctypes.c_int32, 272), ('lumscale2', ctypes.c_int32, 276), ('lumshift2', ctypes.c_int32, 280), ('mbmodetab', ctypes.c_int32, 284), ('imvtab', ctypes.c_int32, 288), ('icbptab', ctypes.c_int32, 292), ('fourmvbptab', ctypes.c_int32, 296), ('fourmvswitch', ctypes.c_int32, 300), ('intcomp', ctypes.c_int32, 304), ('twomvbptab', ctypes.c_int32, 308), ('rangeredfrm', ctypes.c_int32, 312), ('HistBufferSize', ctypes.c_uint32, 316), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 320), ('luma_top_offset', ctypes.c_uint32, 328), ('luma_bot_offset', ctypes.c_uint32, 332), ('luma_frame_offset', ctypes.c_uint32, 336), ('chroma_top_offset', ctypes.c_uint32, 340), ('chroma_bot_offset', ctypes.c_uint32, 344), ('chroma_frame_offset', ctypes.c_uint32, 348), ('CodedWidth', ctypes.c_uint16, 352), ('CodedHeight', ctypes.c_uint16, 354), ('loopfilter', ctypes.c_ubyte, 356), ('fastuvmc', ctypes.c_ubyte, 357), ('output_memory_layout', ctypes.c_ubyte, 358), ('ref_memory_layout', c.Array[ctypes.c_ubyte, Literal[2]], 359), ('reserved3', c.Array[ctypes.c_ubyte, Literal[3]], 361), ('displayPara', nvdec_display_param_s, 364), ('ssm', nvdec_pass2_otf_ext_s, 392)]) +nvdec_vc1_pic_s: TypeAlias = struct__nvdec_vc1_pic_s +@c.record +class struct__nvdec_mpeg2_pic_s(c.Struct): + SIZE = 344 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + picture_structure: int + picture_coding_type: int + intra_dc_precision: int + frame_pred_frame_dct: bytes + concealment_motion_vectors: bytes + intra_vlc_format: bytes + tileFormat: int + gob_height: int + reserverd_surface_format: int + reserved1: bytes + f_code: c.Array[ctypes.c_char, Literal[4]] + PicWidthInMbs: int + FrameHeightInMbs: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + output_memory_layout: int + alternate_scan: int + secondfield: int + rounding_type: int + MbInfoSizeInBytes: int + q_scale_type: int + top_field_first: int + full_pel_fwd_vector: int + full_pel_bwd_vector: int + quant_mat_8x8intra: c.Array[ctypes.c_ubyte, Literal[64]] + quant_mat_8x8nonintra: c.Array[ctypes.c_ubyte, Literal[64]] + ref_memory_layout: c.Array[ctypes.c_uint32, Literal[2]] + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_mpeg2_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 69), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('gptimer_timeout_value', ctypes.c_uint32, 80), ('FrameWidth', ctypes.c_int16, 84), ('FrameHeight', ctypes.c_int16, 86), ('picture_structure', ctypes.c_ubyte, 88), ('picture_coding_type', ctypes.c_ubyte, 89), ('intra_dc_precision', ctypes.c_ubyte, 90), ('frame_pred_frame_dct', ctypes.c_char, 91), ('concealment_motion_vectors', ctypes.c_char, 92), ('intra_vlc_format', ctypes.c_char, 93), ('tileFormat', ctypes.c_ubyte, 94, 2, 0), ('gob_height', ctypes.c_ubyte, 94, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 94, 3, 5), ('reserved1', ctypes.c_char, 95), ('f_code', c.Array[ctypes.c_char, Literal[4]], 96), ('PicWidthInMbs', ctypes.c_uint16, 100), ('FrameHeightInMbs', ctypes.c_uint16, 102), ('pitch_luma', ctypes.c_uint32, 104), ('pitch_chroma', ctypes.c_uint32, 108), ('luma_top_offset', ctypes.c_uint32, 112), ('luma_bot_offset', ctypes.c_uint32, 116), ('luma_frame_offset', ctypes.c_uint32, 120), ('chroma_top_offset', ctypes.c_uint32, 124), ('chroma_bot_offset', ctypes.c_uint32, 128), ('chroma_frame_offset', ctypes.c_uint32, 132), ('HistBufferSize', ctypes.c_uint32, 136), ('output_memory_layout', ctypes.c_uint16, 140), ('alternate_scan', ctypes.c_uint16, 142), ('secondfield', ctypes.c_uint16, 144), ('rounding_type', ctypes.c_uint16, 146), ('MbInfoSizeInBytes', ctypes.c_uint32, 148), ('q_scale_type', ctypes.c_uint32, 152), ('top_field_first', ctypes.c_uint32, 156), ('full_pel_fwd_vector', ctypes.c_uint32, 160), ('full_pel_bwd_vector', ctypes.c_uint32, 164), ('quant_mat_8x8intra', c.Array[ctypes.c_ubyte, Literal[64]], 168), ('quant_mat_8x8nonintra', c.Array[ctypes.c_ubyte, Literal[64]], 232), ('ref_memory_layout', c.Array[ctypes.c_uint32, Literal[2]], 296), ('displayPara', nvdec_display_param_s, 304), ('ssm', nvdec_pass2_otf_ext_s, 332)]) +nvdec_mpeg2_pic_s: TypeAlias = struct__nvdec_mpeg2_pic_s +@c.record +class struct__nvdec_mpeg4_pic_s(c.Struct): + SIZE = 368 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + reserved2: c.Array[ctypes.c_ubyte, Literal[3]] + stream_len: int + slice_count: int + scratch_pic_buffer_size: int + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + vop_time_increment_bitcount: bytes + resync_marker_disable: bytes + tileFormat: int + gob_height: int + reserverd_surface_format: int + reserved3: bytes + width: int + height: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + trd: c.Array[ctypes.c_int32, Literal[2]] + trb: c.Array[ctypes.c_int32, Literal[2]] + divx_flags: int + vop_fcode_forward: int + vop_fcode_backward: int + interlaced: int + quant_type: int + quarter_sample: int + short_video_header: int + curr_output_memory_layout: int + ptype: int + rnd: int + alternate_vertical_scan_flag: int + top_field_flag: int + reserved0: c.Array[ctypes.c_ubyte, Literal[3]] + intra_quant_mat: c.Array[ctypes.c_ubyte, Literal[64]] + nonintra_quant_mat: c.Array[ctypes.c_ubyte, Literal[64]] + ref_memory_layout: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_ubyte, Literal[34]] + displayPara: struct__nvdec_display_param_s +struct__nvdec_mpeg4_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('reserved2', c.Array[ctypes.c_ubyte, Literal[3]], 69), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('scratch_pic_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('FrameWidth', ctypes.c_int16, 88), ('FrameHeight', ctypes.c_int16, 90), ('vop_time_increment_bitcount', ctypes.c_char, 92), ('resync_marker_disable', ctypes.c_char, 93), ('tileFormat', ctypes.c_ubyte, 94, 2, 0), ('gob_height', ctypes.c_ubyte, 94, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 94, 3, 5), ('reserved3', ctypes.c_char, 95), ('width', ctypes.c_int32, 96), ('height', ctypes.c_int32, 100), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 104), ('luma_top_offset', ctypes.c_uint32, 112), ('luma_bot_offset', ctypes.c_uint32, 116), ('luma_frame_offset', ctypes.c_uint32, 120), ('chroma_top_offset', ctypes.c_uint32, 124), ('chroma_bot_offset', ctypes.c_uint32, 128), ('chroma_frame_offset', ctypes.c_uint32, 132), ('HistBufferSize', ctypes.c_uint32, 136), ('trd', c.Array[ctypes.c_int32, Literal[2]], 140), ('trb', c.Array[ctypes.c_int32, Literal[2]], 148), ('divx_flags', ctypes.c_int32, 156), ('vop_fcode_forward', ctypes.c_int16, 160), ('vop_fcode_backward', ctypes.c_int16, 162), ('interlaced', ctypes.c_ubyte, 164), ('quant_type', ctypes.c_ubyte, 165), ('quarter_sample', ctypes.c_ubyte, 166), ('short_video_header', ctypes.c_ubyte, 167), ('curr_output_memory_layout', ctypes.c_ubyte, 168), ('ptype', ctypes.c_ubyte, 169), ('rnd', ctypes.c_ubyte, 170), ('alternate_vertical_scan_flag', ctypes.c_ubyte, 171), ('top_field_flag', ctypes.c_ubyte, 172), ('reserved0', c.Array[ctypes.c_ubyte, Literal[3]], 173), ('intra_quant_mat', c.Array[ctypes.c_ubyte, Literal[64]], 176), ('nonintra_quant_mat', c.Array[ctypes.c_ubyte, Literal[64]], 240), ('ref_memory_layout', c.Array[ctypes.c_ubyte, Literal[2]], 304), ('reserved1', c.Array[ctypes.c_ubyte, Literal[34]], 306), ('displayPara', nvdec_display_param_s, 340)]) +nvdec_mpeg4_pic_s: TypeAlias = struct__nvdec_mpeg4_pic_s +enum_VP8_FRAME_TYPE: dict[int, str] = {(VP8_KEYFRAME:=0): 'VP8_KEYFRAME', (VP8_INTERFRAME:=1): 'VP8_INTERFRAME'} +enum_VP8_FRAME_SFC_ID: dict[int, str] = {(VP8_GOLDEN_FRAME_SFC:=0): 'VP8_GOLDEN_FRAME_SFC', (VP8_ALTREF_FRAME_SFC:=1): 'VP8_ALTREF_FRAME_SFC', (VP8_LAST_FRAME_SFC:=2): 'VP8_LAST_FRAME_SFC', (VP8_CURR_FRAME_SFC:=3): 'VP8_CURR_FRAME_SFC'} +@c.record +class struct__nvdec_vp8_pic_s(c.Struct): + SIZE = 192 + encryption_params: struct__nvdec_pass2_otf_s + gptimer_timeout_value: int + FrameWidth: int + FrameHeight: int + keyFrame: int + version: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + errorConcealOn: int + firstPartSize: int + HistBufferSize: int + VLDBufferSize: int + FrameStride: c.Array[ctypes.c_uint32, Literal[2]] + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + displayPara: struct__nvdec_display_param_s + current_output_memory_layout: bytes + output_memory_layout: c.Array[ctypes.c_char, Literal[3]] + segmentation_feature_data_update: int + reserved1: c.Array[ctypes.c_ubyte, Literal[3]] + resultValue: int + partition_offset: c.Array[ctypes.c_uint32, Literal[8]] + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_vp8_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('gptimer_timeout_value', ctypes.c_uint32, 52), ('FrameWidth', ctypes.c_uint16, 56), ('FrameHeight', ctypes.c_uint16, 58), ('keyFrame', ctypes.c_ubyte, 60), ('version', ctypes.c_ubyte, 61), ('tileFormat', ctypes.c_ubyte, 62, 2, 0), ('gob_height', ctypes.c_ubyte, 62, 3, 2), ('reserverd_surface_format', ctypes.c_ubyte, 62, 3, 5), ('errorConcealOn', ctypes.c_ubyte, 63), ('firstPartSize', ctypes.c_uint32, 64), ('HistBufferSize', ctypes.c_uint32, 68), ('VLDBufferSize', ctypes.c_uint32, 72), ('FrameStride', c.Array[ctypes.c_uint32, Literal[2]], 76), ('luma_top_offset', ctypes.c_uint32, 84), ('luma_bot_offset', ctypes.c_uint32, 88), ('luma_frame_offset', ctypes.c_uint32, 92), ('chroma_top_offset', ctypes.c_uint32, 96), ('chroma_bot_offset', ctypes.c_uint32, 100), ('chroma_frame_offset', ctypes.c_uint32, 104), ('displayPara', nvdec_display_param_s, 108), ('current_output_memory_layout', ctypes.c_char, 136), ('output_memory_layout', c.Array[ctypes.c_char, Literal[3]], 137), ('segmentation_feature_data_update', ctypes.c_ubyte, 140), ('reserved1', c.Array[ctypes.c_ubyte, Literal[3]], 141), ('resultValue', ctypes.c_uint32, 144), ('partition_offset', c.Array[ctypes.c_uint32, Literal[8]], 148), ('ssm', nvdec_pass2_otf_ext_s, 180)]) +nvdec_vp8_pic_s: TypeAlias = struct__nvdec_vp8_pic_s +@c.record +class struct__bytes_of_data_s(c.Struct): + SIZE = 8 + clear_bytes: int + encypted_bytes: int +struct__bytes_of_data_s.register_fields([('clear_bytes', ctypes.c_uint32, 0), ('encypted_bytes', ctypes.c_uint32, 4)]) +bytes_of_data_s: TypeAlias = struct__bytes_of_data_s +@c.record +class struct__nvdec_pass1_input_data_s(c.Struct): + SIZE = 836 + sample_size: c.Array[struct__bytes_of_data_s, Literal[32]] + initialization_vector: c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[32]] + IvValid: c.Array[ctypes.c_ubyte, Literal[32]] + stream_len: int + clearBufferSize: int + reencryptBufferSize: int + vp8coeffPartitonBufferSize: int + PrevWidth: int + num_nals: int + drm_mode: int + key_sel: int + codec: int + TotalSizeOfClearData: int + SliceHdrOffset: int + EncryptBlkCnt: int + SkipBlkCnt: int +struct__nvdec_pass1_input_data_s.register_fields([('sample_size', c.Array[bytes_of_data_s, Literal[32]], 0), ('initialization_vector', c.Array[c.Array[ctypes.c_uint32, Literal[4]], Literal[32]], 256), ('IvValid', c.Array[ctypes.c_ubyte, Literal[32]], 768), ('stream_len', ctypes.c_uint32, 800), ('clearBufferSize', ctypes.c_uint32, 804), ('reencryptBufferSize', ctypes.c_uint32, 808), ('vp8coeffPartitonBufferSize', ctypes.c_uint32, 812), ('PrevWidth', ctypes.c_uint32, 816), ('num_nals', ctypes.c_uint32, 820, 16, 0), ('drm_mode', ctypes.c_uint32, 822, 8, 0), ('key_sel', ctypes.c_uint32, 823, 4, 0), ('codec', ctypes.c_uint32, 823, 4, 4), ('TotalSizeOfClearData', ctypes.c_uint32, 824), ('SliceHdrOffset', ctypes.c_uint32, 828), ('EncryptBlkCnt', ctypes.c_uint32, 832, 16, 0), ('SkipBlkCnt', ctypes.c_uint32, 834, 16, 0)]) +nvdec_pass1_input_data_s: TypeAlias = struct__nvdec_pass1_input_data_s +@c.record +class struct__nvdec_pass1_output_data_s(c.Struct): + SIZE = 128 + clear_header_size: int + reencrypt_data_size: int + clear_token_data_size: int + key_increment: int + encryption_mode: int + bReEncrypted: int + bvp9SuperFrame: int + vp9NumFramesMinus1: int + reserved1: int + wrapped_session_key: c.Array[ctypes.c_uint32, Literal[4]] + wrapped_content_key: c.Array[ctypes.c_uint32, Literal[4]] + initialization_vector: c.Array[ctypes.c_uint32, Literal[4]] + partition_size: c.Array[ctypes.c_uint32, Literal[8]] + vp9_frame_sizes: c.Array[ctypes.c_uint32, Literal[8]] + vp9_clear_hdr_size: c.Array[ctypes.c_uint32, Literal[8]] +struct__nvdec_pass1_output_data_s.register_fields([('clear_header_size', ctypes.c_uint32, 0), ('reencrypt_data_size', ctypes.c_uint32, 4), ('clear_token_data_size', ctypes.c_uint32, 8), ('key_increment', ctypes.c_uint32, 12, 6, 0), ('encryption_mode', ctypes.c_uint32, 12, 4, 6), ('bReEncrypted', ctypes.c_uint32, 13, 1, 2), ('bvp9SuperFrame', ctypes.c_uint32, 13, 1, 3), ('vp9NumFramesMinus1', ctypes.c_uint32, 13, 3, 4), ('reserved1', ctypes.c_uint32, 13, 17, 7), ('wrapped_session_key', c.Array[ctypes.c_uint32, Literal[4]], 16), ('wrapped_content_key', c.Array[ctypes.c_uint32, Literal[4]], 32), ('initialization_vector', c.Array[ctypes.c_uint32, Literal[4]], 48), ('partition_size', c.Array[ctypes.c_uint32, Literal[8]], 64), ('vp9_frame_sizes', c.Array[ctypes.c_uint32, Literal[8]], 64), ('vp9_clear_hdr_size', c.Array[ctypes.c_uint32, Literal[8]], 96)]) +nvdec_pass1_output_data_s: TypeAlias = struct__nvdec_pass1_output_data_s +@c.record +class struct__scale_factors_reference_s(c.Struct): + SIZE = 4 + x_scale_fp: int + y_scale_fp: int +struct__scale_factors_reference_s.register_fields([('x_scale_fp', ctypes.c_int16, 0), ('y_scale_fp', ctypes.c_int16, 2)]) +scale_factors_reference_s: TypeAlias = struct__scale_factors_reference_s +@c.record +class struct__frame_info_t(c.Struct): + SIZE = 12 + width: int + height: int + stride: c.Array[ctypes.c_uint16, Literal[2]] + frame_buffer_idx: int +struct__frame_info_t.register_fields([('width', ctypes.c_uint16, 0), ('height', ctypes.c_uint16, 2), ('stride', c.Array[ctypes.c_uint16, Literal[2]], 4), ('frame_buffer_idx', ctypes.c_uint32, 8)]) +frame_info_t: TypeAlias = struct__frame_info_t +@c.record +class struct__ref_frame_struct_s(c.Struct): + SIZE = 24 + info: struct__frame_info_t + sf: struct__scale_factors_reference_s + sign_bias: int + wmtype: int + reserved_rf: int + frame_off: int + roffset: int +struct__ref_frame_struct_s.register_fields([('info', frame_info_t, 0), ('sf', scale_factors_reference_s, 12), ('sign_bias', ctypes.c_ubyte, 16, 1, 0), ('wmtype', ctypes.c_ubyte, 16, 2, 1), ('reserved_rf', ctypes.c_ubyte, 16, 5, 3), ('frame_off', ctypes.c_int16, 18), ('roffset', ctypes.c_int16, 20)]) +ref_frame_struct_s: TypeAlias = struct__ref_frame_struct_s +@c.record +class struct__av1_fgs_cfg_t(c.Struct): + SIZE = 12 + apply_grain: int + overlap_flag: int + clip_to_restricted_range: int + chroma_scaling_from_luma: int + num_y_points_b: int + num_cb_points_b: int + num_cr_points_b: int + scaling_shift: int + reserved_fgs: int + sw_random_seed: int + cb_offset: int + cr_offset: int + cb_mult: bytes + cb_luma_mult: bytes + cr_mult: bytes + cr_luma_mult: bytes +struct__av1_fgs_cfg_t.register_fields([('apply_grain', ctypes.c_uint16, 0, 1, 0), ('overlap_flag', ctypes.c_uint16, 0, 1, 1), ('clip_to_restricted_range', ctypes.c_uint16, 0, 1, 2), ('chroma_scaling_from_luma', ctypes.c_uint16, 0, 1, 3), ('num_y_points_b', ctypes.c_uint16, 0, 1, 4), ('num_cb_points_b', ctypes.c_uint16, 0, 1, 5), ('num_cr_points_b', ctypes.c_uint16, 0, 1, 6), ('scaling_shift', ctypes.c_uint16, 0, 4, 7), ('reserved_fgs', ctypes.c_uint16, 1, 5, 3), ('sw_random_seed', ctypes.c_uint16, 2), ('cb_offset', ctypes.c_int16, 4), ('cr_offset', ctypes.c_int16, 6), ('cb_mult', ctypes.c_char, 8), ('cb_luma_mult', ctypes.c_char, 9), ('cr_mult', ctypes.c_char, 10), ('cr_luma_mult', ctypes.c_char, 11)]) +av1_fgs_cfg_t: TypeAlias = struct__av1_fgs_cfg_t +@c.record +class struct__nvdec_av1_pic_s(c.Struct): + SIZE = 572 + encryption_params: struct__nvdec_pass2_otf_s + ssm: struct__nvdec_pass2_otf_ext_s + fgs_cfg: struct__av1_fgs_cfg_t + gptimer_timeout_value: int + stream_len: int + reserved12: int + use_128x128_superblock: int + chroma_format: int + bit_depth: int + enable_filter_intra: int + enable_intra_edge_filter: int + enable_interintra_compound: int + enable_masked_compound: int + enable_dual_filter: int + reserved10: int + reserved0: int + enable_jnt_comp: int + reserved1: int + enable_cdef: int + reserved11: int + enable_fgs: int + enable_substream_decoding: int + reserved2: int + frame_type: int + show_frame: int + reserved13: int + disable_cdf_update: int + allow_screen_content_tools: int + cur_frame_force_integer_mv: int + scale_denom_minus9: int + allow_intrabc: int + allow_high_precision_mv: int + interp_filter: int + switchable_motion_mode: int + use_ref_frame_mvs: int + refresh_frame_context: int + delta_q_present_flag: int + delta_q_res: int + delta_lf_present_flag: int + delta_lf_res: int + delta_lf_multi: int + reserved3: int + coded_lossless: int + tile_enabled: int + reserved4: int + superres_is_scaled: int + reserved_fh: int + tile_cols: int + tile_rows: int + context_update_tile_id: int + cdef_damping_minus_3: int + cdef_bits: int + frame_tx_mode: int + frame_reference_mode: int + skip_mode_flag: int + skip_ref0: int + skip_ref1: int + allow_warp: int + reduced_tx_set_used: int + ref_scaling_enable: int + reserved5: int + reserved6: int + superres_upscaled_width: int + superres_luma_step: int + superres_chroma_step: int + superres_init_luma_subpel_x: int + superres_init_chroma_subpel_x: int + base_qindex: int + y_dc_delta_q: bytes + u_dc_delta_q: bytes + v_dc_delta_q: bytes + u_ac_delta_q: bytes + v_ac_delta_q: bytes + qm_y: int + qm_u: int + qm_v: int + cdef_y_pri_strength: int + cdef_uv_pri_strength: int + cdef_y_sec_strength: int + cdef_uv_sec_strength: int + segment_enabled: int + segment_update_map: int + reserved7: int + segment_temporal_update: int + segment_feature_data: c.Array[c.Array[ctypes.c_int16, Literal[8]], Literal[8]] + last_active_segid: int + segid_preskip: int + prevsegid_flag: int + segment_quant_sign: int + filter_level: c.Array[ctypes.c_ubyte, Literal[2]] + filter_level_u: int + filter_level_v: int + lf_sharpness_level: int + lf_ref_deltas: c.Array[ctypes.c_char, Literal[8]] + lf_mode_deltas: c.Array[ctypes.c_char, Literal[2]] + lr_type: int + lr_unit_size: int + current_frame: struct__frame_info_t + ref_frame: c.Array[struct__ref_frame_struct_s, Literal[7]] + use_temporal0_mvs: int + use_temporal1_mvs: int + use_temporal2_mvs: int + mf1_type: int + mf2_type: int + mf3_type: int + reserved_mfmv: int + mfmv_offset: c.Array[c.Array[ctypes.c_int16, Literal[7]], Literal[3]] + mfmv_side: c.Array[c.Array[ctypes.c_char, Literal[7]], Literal[3]] + tileformat: int + gob_height: int + errorConcealOn: int + reserver8: int + stream_error_detection: int + mv_error_detection: int + coeff_error_detection: int + reserved_eh: int + Av1FltTopOffset: int + Av1FltVertOffset: int + Av1CdefVertOffset: int + Av1LrVertOffset: int + Av1HusVertOffset: int + Av1FgsVertOffset: int + enable_histogram: int + sw_skip_start_length: int + reserved_stat: int +struct__nvdec_av1_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('ssm', nvdec_pass2_otf_ext_s, 52), ('fgs_cfg', av1_fgs_cfg_t, 64), ('gptimer_timeout_value', ctypes.c_uint32, 76), ('stream_len', ctypes.c_uint32, 80), ('reserved12', ctypes.c_uint32, 84), ('use_128x128_superblock', ctypes.c_uint32, 88, 1, 0), ('chroma_format', ctypes.c_uint32, 88, 2, 1), ('bit_depth', ctypes.c_uint32, 88, 4, 3), ('enable_filter_intra', ctypes.c_uint32, 88, 1, 7), ('enable_intra_edge_filter', ctypes.c_uint32, 89, 1, 0), ('enable_interintra_compound', ctypes.c_uint32, 89, 1, 1), ('enable_masked_compound', ctypes.c_uint32, 89, 1, 2), ('enable_dual_filter', ctypes.c_uint32, 89, 1, 3), ('reserved10', ctypes.c_uint32, 89, 1, 4), ('reserved0', ctypes.c_uint32, 89, 3, 5), ('enable_jnt_comp', ctypes.c_uint32, 90, 1, 0), ('reserved1', ctypes.c_uint32, 90, 1, 1), ('enable_cdef', ctypes.c_uint32, 90, 1, 2), ('reserved11', ctypes.c_uint32, 90, 1, 3), ('enable_fgs', ctypes.c_uint32, 90, 1, 4), ('enable_substream_decoding', ctypes.c_uint32, 90, 1, 5), ('reserved2', ctypes.c_uint32, 90, 10, 6), ('frame_type', ctypes.c_uint32, 92, 2, 0), ('show_frame', ctypes.c_uint32, 92, 1, 2), ('reserved13', ctypes.c_uint32, 92, 1, 3), ('disable_cdf_update', ctypes.c_uint32, 92, 1, 4), ('allow_screen_content_tools', ctypes.c_uint32, 92, 1, 5), ('cur_frame_force_integer_mv', ctypes.c_uint32, 92, 1, 6), ('scale_denom_minus9', ctypes.c_uint32, 92, 3, 7), ('allow_intrabc', ctypes.c_uint32, 93, 1, 2), ('allow_high_precision_mv', ctypes.c_uint32, 93, 1, 3), ('interp_filter', ctypes.c_uint32, 93, 3, 4), ('switchable_motion_mode', ctypes.c_uint32, 93, 1, 7), ('use_ref_frame_mvs', ctypes.c_uint32, 94, 1, 0), ('refresh_frame_context', ctypes.c_uint32, 94, 1, 1), ('delta_q_present_flag', ctypes.c_uint32, 94, 1, 2), ('delta_q_res', ctypes.c_uint32, 94, 2, 3), ('delta_lf_present_flag', ctypes.c_uint32, 94, 1, 5), ('delta_lf_res', ctypes.c_uint32, 94, 2, 6), ('delta_lf_multi', ctypes.c_uint32, 95, 1, 0), ('reserved3', ctypes.c_uint32, 95, 1, 1), ('coded_lossless', ctypes.c_uint32, 95, 1, 2), ('tile_enabled', ctypes.c_uint32, 95, 1, 3), ('reserved4', ctypes.c_uint32, 95, 2, 4), ('superres_is_scaled', ctypes.c_uint32, 95, 1, 6), ('reserved_fh', ctypes.c_uint32, 95, 1, 7), ('tile_cols', ctypes.c_uint32, 96, 8, 0), ('tile_rows', ctypes.c_uint32, 97, 8, 0), ('context_update_tile_id', ctypes.c_uint32, 98, 16, 0), ('cdef_damping_minus_3', ctypes.c_uint32, 100, 2, 0), ('cdef_bits', ctypes.c_uint32, 100, 2, 2), ('frame_tx_mode', ctypes.c_uint32, 100, 3, 4), ('frame_reference_mode', ctypes.c_uint32, 100, 2, 7), ('skip_mode_flag', ctypes.c_uint32, 101, 1, 1), ('skip_ref0', ctypes.c_uint32, 101, 4, 2), ('skip_ref1', ctypes.c_uint32, 101, 4, 6), ('allow_warp', ctypes.c_uint32, 102, 1, 2), ('reduced_tx_set_used', ctypes.c_uint32, 102, 1, 3), ('ref_scaling_enable', ctypes.c_uint32, 102, 1, 4), ('reserved5', ctypes.c_uint32, 102, 1, 5), ('reserved6', ctypes.c_uint32, 102, 10, 6), ('superres_upscaled_width', ctypes.c_uint16, 104), ('superres_luma_step', ctypes.c_uint16, 106), ('superres_chroma_step', ctypes.c_uint16, 108), ('superres_init_luma_subpel_x', ctypes.c_uint16, 110), ('superres_init_chroma_subpel_x', ctypes.c_uint16, 112), ('base_qindex', ctypes.c_ubyte, 114), ('y_dc_delta_q', ctypes.c_char, 115), ('u_dc_delta_q', ctypes.c_char, 116), ('v_dc_delta_q', ctypes.c_char, 117), ('u_ac_delta_q', ctypes.c_char, 118), ('v_ac_delta_q', ctypes.c_char, 119), ('qm_y', ctypes.c_ubyte, 120), ('qm_u', ctypes.c_ubyte, 121), ('qm_v', ctypes.c_ubyte, 122), ('cdef_y_pri_strength', ctypes.c_uint32, 124), ('cdef_uv_pri_strength', ctypes.c_uint32, 128), ('cdef_y_sec_strength', ctypes.c_uint32, 132, 16, 0), ('cdef_uv_sec_strength', ctypes.c_uint32, 134, 16, 0), ('segment_enabled', ctypes.c_ubyte, 136), ('segment_update_map', ctypes.c_ubyte, 137), ('reserved7', ctypes.c_ubyte, 138), ('segment_temporal_update', ctypes.c_ubyte, 139), ('segment_feature_data', c.Array[c.Array[ctypes.c_int16, Literal[8]], Literal[8]], 140), ('last_active_segid', ctypes.c_ubyte, 268), ('segid_preskip', ctypes.c_ubyte, 269), ('prevsegid_flag', ctypes.c_ubyte, 270), ('segment_quant_sign', ctypes.c_ubyte, 271, 8, 0), ('filter_level', c.Array[ctypes.c_ubyte, Literal[2]], 272), ('filter_level_u', ctypes.c_ubyte, 274), ('filter_level_v', ctypes.c_ubyte, 275), ('lf_sharpness_level', ctypes.c_ubyte, 276), ('lf_ref_deltas', c.Array[ctypes.c_char, Literal[8]], 277), ('lf_mode_deltas', c.Array[ctypes.c_char, Literal[2]], 285), ('lr_type', ctypes.c_ubyte, 287), ('lr_unit_size', ctypes.c_ubyte, 288), ('current_frame', frame_info_t, 292), ('ref_frame', c.Array[ref_frame_struct_s, Literal[7]], 304), ('use_temporal0_mvs', ctypes.c_uint32, 472, 1, 0), ('use_temporal1_mvs', ctypes.c_uint32, 472, 1, 1), ('use_temporal2_mvs', ctypes.c_uint32, 472, 1, 2), ('mf1_type', ctypes.c_uint32, 472, 3, 3), ('mf2_type', ctypes.c_uint32, 472, 3, 6), ('mf3_type', ctypes.c_uint32, 473, 3, 1), ('reserved_mfmv', ctypes.c_uint32, 473, 20, 4), ('mfmv_offset', c.Array[c.Array[ctypes.c_int16, Literal[7]], Literal[3]], 476), ('mfmv_side', c.Array[c.Array[ctypes.c_char, Literal[7]], Literal[3]], 518), ('tileformat', ctypes.c_ubyte, 539, 2, 0), ('gob_height', ctypes.c_ubyte, 539, 3, 2), ('errorConcealOn', ctypes.c_ubyte, 539, 1, 5), ('reserver8', ctypes.c_ubyte, 539, 2, 6), ('stream_error_detection', ctypes.c_ubyte, 540, 1, 0), ('mv_error_detection', ctypes.c_ubyte, 540, 1, 1), ('coeff_error_detection', ctypes.c_ubyte, 540, 1, 2), ('reserved_eh', ctypes.c_ubyte, 540, 5, 3), ('Av1FltTopOffset', ctypes.c_uint32, 544), ('Av1FltVertOffset', ctypes.c_uint32, 548), ('Av1CdefVertOffset', ctypes.c_uint32, 552), ('Av1LrVertOffset', ctypes.c_uint32, 556), ('Av1HusVertOffset', ctypes.c_uint32, 560), ('Av1FgsVertOffset', ctypes.c_uint32, 564), ('enable_histogram', ctypes.c_uint32, 568, 1, 0), ('sw_skip_start_length', ctypes.c_uint32, 568, 14, 1), ('reserved_stat', ctypes.c_uint32, 569, 17, 7)]) +nvdec_av1_pic_s: TypeAlias = struct__nvdec_av1_pic_s +@c.record +class struct__AV1FilmGrainMemory(c.Struct): + SIZE = 13056 + scaling_lut_y: c.Array[ctypes.c_ubyte, Literal[256]] + scaling_lut_cb: c.Array[ctypes.c_ubyte, Literal[256]] + scaling_lut_cr: c.Array[ctypes.c_ubyte, Literal[256]] + cropped_luma_grain_block: c.Array[ctypes.c_int16, Literal[4096]] + cropped_cb_grain_block: c.Array[ctypes.c_int16, Literal[1024]] + cropped_cr_grain_block: c.Array[ctypes.c_int16, Literal[1024]] +struct__AV1FilmGrainMemory.register_fields([('scaling_lut_y', c.Array[ctypes.c_ubyte, Literal[256]], 0), ('scaling_lut_cb', c.Array[ctypes.c_ubyte, Literal[256]], 256), ('scaling_lut_cr', c.Array[ctypes.c_ubyte, Literal[256]], 512), ('cropped_luma_grain_block', c.Array[ctypes.c_int16, Literal[4096]], 768), ('cropped_cb_grain_block', c.Array[ctypes.c_int16, Literal[1024]], 8960), ('cropped_cr_grain_block', c.Array[ctypes.c_int16, Literal[1024]], 11008)]) +AV1FilmGrainMemory: TypeAlias = struct__AV1FilmGrainMemory +@c.record +class struct__AV1TileInfo_OLD(c.Struct): + SIZE = 16 + width_in_sb: int + height_in_sb: int + tile_start_b0: int + tile_start_b1: int + tile_start_b2: int + tile_start_b3: int + tile_end_b0: int + tile_end_b1: int + tile_end_b2: int + tile_end_b3: int + padding: c.Array[ctypes.c_ubyte, Literal[6]] +struct__AV1TileInfo_OLD.register_fields([('width_in_sb', ctypes.c_ubyte, 0), ('height_in_sb', ctypes.c_ubyte, 1), ('tile_start_b0', ctypes.c_ubyte, 2), ('tile_start_b1', ctypes.c_ubyte, 3), ('tile_start_b2', ctypes.c_ubyte, 4), ('tile_start_b3', ctypes.c_ubyte, 5), ('tile_end_b0', ctypes.c_ubyte, 6), ('tile_end_b1', ctypes.c_ubyte, 7), ('tile_end_b2', ctypes.c_ubyte, 8), ('tile_end_b3', ctypes.c_ubyte, 9), ('padding', c.Array[ctypes.c_ubyte, Literal[6]], 10)]) +AV1TileInfo_OLD: TypeAlias = struct__AV1TileInfo_OLD +@c.record +class struct__AV1TileInfo(c.Struct): + SIZE = 4 + width_in_sb: int + padding_w: int + height_in_sb: int + padding_h: int +struct__AV1TileInfo.register_fields([('width_in_sb', ctypes.c_ubyte, 0), ('padding_w', ctypes.c_ubyte, 1), ('height_in_sb', ctypes.c_ubyte, 2), ('padding_h', ctypes.c_ubyte, 3)]) +AV1TileInfo: TypeAlias = struct__AV1TileInfo +@c.record +class struct__AV1TileStreamInfo(c.Struct): + SIZE = 16 + tile_start: int + tile_end: int + padding: c.Array[ctypes.c_ubyte, Literal[8]] +struct__AV1TileStreamInfo.register_fields([('tile_start', ctypes.c_uint32, 0), ('tile_end', ctypes.c_uint32, 4), ('padding', c.Array[ctypes.c_ubyte, Literal[8]], 8)]) +AV1TileStreamInfo: TypeAlias = struct__AV1TileStreamInfo +@c.record +class struct__nvdec_new_h264_pic_s(c.Struct): + SIZE = 764 + encryption_params: struct__nvdec_pass2_otf_s + eos: c.Array[ctypes.c_ubyte, Literal[16]] + explicitEOSPresentFlag: int + hint_dump_en: int + reserved0: c.Array[ctypes.c_ubyte, Literal[2]] + stream_len: int + slice_count: int + mbhist_buffer_size: int + gptimer_timeout_value: int + log2_max_pic_order_cnt_lsb_minus4: int + delta_pic_order_always_zero_flag: int + frame_mbs_only_flag: int + PicWidthInMbs: int + FrameHeightInMbs: int + tileFormat: int + gob_height: int + reserverd_surface_format: int + entropy_coding_mode_flag: int + pic_order_present_flag: int + num_ref_idx_l0_active_minus1: int + num_ref_idx_l1_active_minus1: int + deblocking_filter_control_present_flag: int + redundant_pic_cnt_present_flag: int + transform_8x8_mode_flag: int + pitch_luma: int + pitch_chroma: int + luma_top_offset: int + luma_bot_offset: int + luma_frame_offset: int + chroma_top_offset: int + chroma_bot_offset: int + chroma_frame_offset: int + HistBufferSize: int + MbaffFrameFlag: int + direct_8x8_inference_flag: int + weighted_pred_flag: int + constrained_intra_pred_flag: int + ref_pic_flag: int + field_pic_flag: int + bottom_field_flag: int + second_field: int + log2_max_frame_num_minus4: int + chroma_format_idc: int + pic_order_cnt_type: int + pic_init_qp_minus26: int + chroma_qp_index_offset: int + second_chroma_qp_index_offset: int + weighted_bipred_idc: int + CurrPicIdx: int + CurrColIdx: int + frame_num: int + frame_surfaces: int + output_memory_layout: int + CurrFieldOrderCnt: c.Array[ctypes.c_int32, Literal[2]] + dpb: c.Array[struct__nvdec_dpb_entry_s, Literal[16]] + WeightScale: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]] + WeightScale8x8: c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]] + num_inter_view_refs_lX: c.Array[ctypes.c_ubyte, Literal[2]] + reserved1: c.Array[ctypes.c_char, Literal[14]] + inter_view_refidx_lX: c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]] + lossless_ipred8x8_filter_enable: int + qpprime_y_zero_transform_bypass_flag: int + reserved2: int + displayPara: struct__nvdec_display_param_s + ssm: struct__nvdec_pass2_otf_ext_s +struct__nvdec_new_h264_pic_s.register_fields([('encryption_params', nvdec_pass2_otf_s, 0), ('eos', c.Array[ctypes.c_ubyte, Literal[16]], 52), ('explicitEOSPresentFlag', ctypes.c_ubyte, 68), ('hint_dump_en', ctypes.c_ubyte, 69), ('reserved0', c.Array[ctypes.c_ubyte, Literal[2]], 70), ('stream_len', ctypes.c_uint32, 72), ('slice_count', ctypes.c_uint32, 76), ('mbhist_buffer_size', ctypes.c_uint32, 80), ('gptimer_timeout_value', ctypes.c_uint32, 84), ('log2_max_pic_order_cnt_lsb_minus4', ctypes.c_int32, 88), ('delta_pic_order_always_zero_flag', ctypes.c_int32, 92), ('frame_mbs_only_flag', ctypes.c_int32, 96), ('PicWidthInMbs', ctypes.c_int32, 100), ('FrameHeightInMbs', ctypes.c_int32, 104), ('tileFormat', ctypes.c_uint32, 108, 2, 0), ('gob_height', ctypes.c_uint32, 108, 3, 2), ('reserverd_surface_format', ctypes.c_uint32, 108, 27, 5), ('entropy_coding_mode_flag', ctypes.c_int32, 112), ('pic_order_present_flag', ctypes.c_int32, 116), ('num_ref_idx_l0_active_minus1', ctypes.c_int32, 120), ('num_ref_idx_l1_active_minus1', ctypes.c_int32, 124), ('deblocking_filter_control_present_flag', ctypes.c_int32, 128), ('redundant_pic_cnt_present_flag', ctypes.c_int32, 132), ('transform_8x8_mode_flag', ctypes.c_int32, 136), ('pitch_luma', ctypes.c_uint32, 140), ('pitch_chroma', ctypes.c_uint32, 144), ('luma_top_offset', ctypes.c_uint32, 148), ('luma_bot_offset', ctypes.c_uint32, 152), ('luma_frame_offset', ctypes.c_uint32, 156), ('chroma_top_offset', ctypes.c_uint32, 160), ('chroma_bot_offset', ctypes.c_uint32, 164), ('chroma_frame_offset', ctypes.c_uint32, 168), ('HistBufferSize', ctypes.c_uint32, 172), ('MbaffFrameFlag', ctypes.c_uint32, 176, 1, 0), ('direct_8x8_inference_flag', ctypes.c_uint32, 176, 1, 1), ('weighted_pred_flag', ctypes.c_uint32, 176, 1, 2), ('constrained_intra_pred_flag', ctypes.c_uint32, 176, 1, 3), ('ref_pic_flag', ctypes.c_uint32, 176, 1, 4), ('field_pic_flag', ctypes.c_uint32, 176, 1, 5), ('bottom_field_flag', ctypes.c_uint32, 176, 1, 6), ('second_field', ctypes.c_uint32, 176, 1, 7), ('log2_max_frame_num_minus4', ctypes.c_uint32, 177, 4, 0), ('chroma_format_idc', ctypes.c_uint32, 177, 2, 4), ('pic_order_cnt_type', ctypes.c_uint32, 177, 2, 6), ('pic_init_qp_minus26', ctypes.c_int32, 178, 6, 0), ('chroma_qp_index_offset', ctypes.c_int32, 178, 5, 6), ('second_chroma_qp_index_offset', ctypes.c_int32, 179, 5, 3), ('weighted_bipred_idc', ctypes.c_uint32, 180, 2, 0), ('CurrPicIdx', ctypes.c_uint32, 180, 7, 2), ('CurrColIdx', ctypes.c_uint32, 181, 5, 1), ('frame_num', ctypes.c_uint32, 181, 16, 6), ('frame_surfaces', ctypes.c_uint32, 183, 1, 6), ('output_memory_layout', ctypes.c_uint32, 183, 1, 7), ('CurrFieldOrderCnt', c.Array[ctypes.c_int32, Literal[2]], 184), ('dpb', c.Array[nvdec_dpb_entry_s, Literal[16]], 192), ('WeightScale', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[4]], Literal[4]], Literal[6]], 448), ('WeightScale8x8', c.Array[c.Array[c.Array[ctypes.c_ubyte, Literal[8]], Literal[8]], Literal[2]], 544), ('num_inter_view_refs_lX', c.Array[ctypes.c_ubyte, Literal[2]], 672), ('reserved1', c.Array[ctypes.c_char, Literal[14]], 674), ('inter_view_refidx_lX', c.Array[c.Array[ctypes.c_byte, Literal[16]], Literal[2]], 688), ('lossless_ipred8x8_filter_enable', ctypes.c_uint32, 720, 1, 0), ('qpprime_y_zero_transform_bypass_flag', ctypes.c_uint32, 720, 1, 1), ('reserved2', ctypes.c_uint32, 720, 30, 2), ('displayPara', nvdec_display_param_s, 724), ('ssm', nvdec_pass2_otf_ext_s, 752)]) +nvdec_new_h264_pic_s: TypeAlias = struct__nvdec_new_h264_pic_s +@c.record +class nvdec_crc_s(c.Struct): + SIZE = 128 + dbg_crc_enable_partb: int + dbg_crc_enable_partc: int + dbg_crc_enable_partd: int + dbg_crc_enable_parte: int + dbg_crc_intf_partb: int + dbg_crc_intf_partc: int + dbg_crc_intf_partd: int + dbg_crc_intf_parte: int + reserved0: int + dbg_crc_partb_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_partc_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_partd_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_parte_golden: c.Array[ctypes.c_uint32, Literal[4]] + dbg_crc_comp_partb: int + dbg_crc_comp_partc: int + dbg_crc_comp_partd: int + dbg_crc_comp_parte: int + reserved1: int + reserved2: c.Array[ctypes.c_ubyte, Literal[56]] +nvdec_crc_s.register_fields([('dbg_crc_enable_partb', ctypes.c_uint32, 0, 1, 0), ('dbg_crc_enable_partc', ctypes.c_uint32, 0, 1, 1), ('dbg_crc_enable_partd', ctypes.c_uint32, 0, 1, 2), ('dbg_crc_enable_parte', ctypes.c_uint32, 0, 1, 3), ('dbg_crc_intf_partb', ctypes.c_uint32, 0, 6, 4), ('dbg_crc_intf_partc', ctypes.c_uint32, 1, 6, 2), ('dbg_crc_intf_partd', ctypes.c_uint32, 2, 6, 0), ('dbg_crc_intf_parte', ctypes.c_uint32, 2, 6, 6), ('reserved0', ctypes.c_uint32, 3, 4, 4), ('dbg_crc_partb_golden', c.Array[ctypes.c_uint32, Literal[4]], 4), ('dbg_crc_partc_golden', c.Array[ctypes.c_uint32, Literal[4]], 20), ('dbg_crc_partd_golden', c.Array[ctypes.c_uint32, Literal[4]], 36), ('dbg_crc_parte_golden', c.Array[ctypes.c_uint32, Literal[4]], 52), ('dbg_crc_comp_partb', ctypes.c_uint32, 68, 4, 0), ('dbg_crc_comp_partc', ctypes.c_uint32, 68, 4, 4), ('dbg_crc_comp_partd', ctypes.c_uint32, 69, 4, 0), ('dbg_crc_comp_parte', ctypes.c_uint32, 69, 4, 4), ('reserved1', ctypes.c_uint32, 70, 16, 0), ('reserved2', c.Array[ctypes.c_ubyte, Literal[56]], 72)]) +@c.record +class struct_NV0000_ALLOC_PARAMETERS(c.Struct): + SIZE = 120 + hClient: int + processID: int + processName: c.Array[ctypes.c_char, Literal[100]] + pOsPidInfo: ctypes.c_void_p +NvHandle: TypeAlias = ctypes.c_uint32 +NvU32: TypeAlias = ctypes.c_uint32 +NvP64: TypeAlias = ctypes.c_void_p +struct_NV0000_ALLOC_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('processID', NvU32, 4), ('processName', c.Array[ctypes.c_char, Literal[100]], 8), ('pOsPidInfo', NvP64, 112)]) +NV0000_ALLOC_PARAMETERS: TypeAlias = struct_NV0000_ALLOC_PARAMETERS +@c.record +class struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS(c.Struct): + SIZE = 24 + offset: int + limit: int + hVASpace: int +NvU64: TypeAlias = ctypes.c_uint64 +struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS.register_fields([('offset', NvU64, 0), ('limit', NvU64, 8), ('hVASpace', NvHandle, 16)]) +NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS: TypeAlias = struct_NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS +@c.record +class struct_NV0080_ALLOC_PARAMETERS(c.Struct): + SIZE = 56 + deviceId: int + hClientShare: int + hTargetClient: int + hTargetDevice: int + flags: int + vaSpaceSize: int + vaStartInternal: int + vaLimitInternal: int + vaMode: int +NvV32: TypeAlias = ctypes.c_uint32 +struct_NV0080_ALLOC_PARAMETERS.register_fields([('deviceId', NvU32, 0), ('hClientShare', NvHandle, 4), ('hTargetClient', NvHandle, 8), ('hTargetDevice', NvHandle, 12), ('flags', NvV32, 16), ('vaSpaceSize', NvU64, 24), ('vaStartInternal', NvU64, 32), ('vaLimitInternal', NvU64, 40), ('vaMode', NvV32, 48)]) +NV0080_ALLOC_PARAMETERS: TypeAlias = struct_NV0080_ALLOC_PARAMETERS +@c.record +class struct_NV2080_ALLOC_PARAMETERS(c.Struct): + SIZE = 4 + subDeviceId: int +struct_NV2080_ALLOC_PARAMETERS.register_fields([('subDeviceId', NvU32, 0)]) +NV2080_ALLOC_PARAMETERS: TypeAlias = struct_NV2080_ALLOC_PARAMETERS +@c.record +class struct__cl2080_tag0(c.Struct): + SIZE = 7936 + Reserved00: c.Array[ctypes.c_uint32, Literal[1984]] +struct__cl2080_tag0.register_fields([('Reserved00', c.Array[NvV32, Literal[1984]], 0)]) +@c.record +class volatile_struct__cl2080_tag0(c.Struct): + SIZE = 7936 + Reserved00: c.Array[ctypes.c_uint32, Literal[1984]] +Nv2080Typedef: TypeAlias = volatile_struct__cl2080_tag0 +volatile_struct__cl2080_tag0.register_fields([('Reserved00', c.Array[NvV32, Literal[1984]], 0)]) +Nv20Subdevice0: TypeAlias = volatile_struct__cl2080_tag0 +@c.record +class struct_Nv2080HdcpStatusChangeNotificationRec(c.Struct): + SIZE = 8 + displayId: int + hdcpStatusChangeNotif: int +struct_Nv2080HdcpStatusChangeNotificationRec.register_fields([('displayId', NvU32, 0), ('hdcpStatusChangeNotif', NvU32, 4)]) +Nv2080HdcpStatusChangeNotification: TypeAlias = struct_Nv2080HdcpStatusChangeNotificationRec +@c.record +class struct_Nv2080PStateChangeNotificationRec(c.Struct): + SIZE = 12 + timeStamp: struct_Nv2080PStateChangeNotificationRec_timeStamp + NewPstate: int +@c.record +class struct_Nv2080PStateChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080PStateChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +struct_Nv2080PStateChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080PStateChangeNotificationRec_timeStamp, 0), ('NewPstate', NvU32, 8)]) +Nv2080PStateChangeNotification: TypeAlias = struct_Nv2080PStateChangeNotificationRec +@c.record +class struct_Nv2080ClocksChangeNotificationRec(c.Struct): + SIZE = 8 + timeStamp: struct_Nv2080ClocksChangeNotificationRec_timeStamp +@c.record +class struct_Nv2080ClocksChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080ClocksChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +struct_Nv2080ClocksChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080ClocksChangeNotificationRec_timeStamp, 0)]) +Nv2080ClocksChangeNotification: TypeAlias = struct_Nv2080ClocksChangeNotificationRec +@c.record +class struct_Nv2080WorkloadModulationChangeNotificationRec(c.Struct): + SIZE = 12 + timeStamp: struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp + WorkloadModulationEnabled: int +@c.record +class struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp(c.Struct): + SIZE = 8 + nanoseconds: c.Array[ctypes.c_uint32, Literal[2]] +struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp.register_fields([('nanoseconds', c.Array[NvU32, Literal[2]], 0)]) +NvBool: TypeAlias = ctypes.c_ubyte +struct_Nv2080WorkloadModulationChangeNotificationRec.register_fields([('timeStamp', struct_Nv2080WorkloadModulationChangeNotificationRec_timeStamp, 0), ('WorkloadModulationEnabled', NvBool, 8)]) +Nv2080WorkloadModulationChangeNotification: TypeAlias = struct_Nv2080WorkloadModulationChangeNotificationRec +@c.record +class Nv2080HotplugNotification(c.Struct): + SIZE = 8 + plugDisplayMask: int + unplugDisplayMask: int +Nv2080HotplugNotification.register_fields([('plugDisplayMask', NvU32, 0), ('unplugDisplayMask', NvU32, 4)]) +@c.record +class Nv2080PowerEventNotification(c.Struct): + SIZE = 8 + bSwitchToAC: int + bGPUCapabilityChanged: int + displayMaskAffected: int +Nv2080PowerEventNotification.register_fields([('bSwitchToAC', NvBool, 0), ('bGPUCapabilityChanged', NvBool, 1), ('displayMaskAffected', NvU32, 4)]) +@c.record +class struct_Nv2080DpIrqNotificationRec(c.Struct): + SIZE = 4 + displayId: int +struct_Nv2080DpIrqNotificationRec.register_fields([('displayId', NvU32, 0)]) +Nv2080DpIrqNotification: TypeAlias = struct_Nv2080DpIrqNotificationRec +@c.record +class struct_Nv2080DstateXusbPpcNotificationRec(c.Struct): + SIZE = 8 + dstateXusb: int + dstatePpc: int +struct_Nv2080DstateXusbPpcNotificationRec.register_fields([('dstateXusb', NvU32, 0), ('dstatePpc', NvU32, 4)]) +Nv2080DstateXusbPpcNotification: TypeAlias = struct_Nv2080DstateXusbPpcNotificationRec +@c.record +class struct_Nv2080XusbPpcConnectStateNotificationRec(c.Struct): + SIZE = 1 + bConnected: int +struct_Nv2080XusbPpcConnectStateNotificationRec.register_fields([('bConnected', NvBool, 0)]) +Nv2080XusbPpcConnectStateNotification: TypeAlias = struct_Nv2080XusbPpcConnectStateNotificationRec +@c.record +class struct_Nv2080ACPIEvent(c.Struct): + SIZE = 4 + event: int +struct_Nv2080ACPIEvent.register_fields([('event', NvU32, 0)]) +Nv2080ACPIEvent: TypeAlias = struct_Nv2080ACPIEvent +@c.record +class struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC(c.Struct): + SIZE = 4 + currentZone: int +struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC.register_fields([('currentZone', NvU32, 0)]) +NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC: TypeAlias = struct__NV2080_COOLER_DIAG_ZONE_NOTIFICATION_REC +@c.record +class struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC(c.Struct): + SIZE = 4 + currentZone: int +struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC.register_fields([('currentZone', NvU32, 0)]) +NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC: TypeAlias = struct__NV2080_THERM_DIAG_ZONE_NOTIFICATION_REC +@c.record +class struct_Nv2080AudioHdcpRequestRec(c.Struct): + SIZE = 8 + displayId: int + requestedState: int +struct_Nv2080AudioHdcpRequestRec.register_fields([('displayId', NvU32, 0), ('requestedState', NvU32, 4)]) +Nv2080AudioHdcpRequest: TypeAlias = struct_Nv2080AudioHdcpRequestRec +@c.record +class struct_Nv2080GC5GpuReadyParams(c.Struct): + SIZE = 12 + event: int + sciIntr0: int + sciIntr1: int +struct_Nv2080GC5GpuReadyParams.register_fields([('event', NvU32, 0), ('sciIntr0', NvU32, 4), ('sciIntr1', NvU32, 8)]) +Nv2080GC5GpuReadyParams: TypeAlias = struct_Nv2080GC5GpuReadyParams +@c.record +class Nv2080PrivRegAccessFaultNotification(c.Struct): + SIZE = 4 + errAddr: int +Nv2080PrivRegAccessFaultNotification.register_fields([('errAddr', NvU32, 0)]) +@c.record +class struct_Nv2080DstateHdaCodecNotificationRec(c.Struct): + SIZE = 4 + dstateHdaCodec: int +struct_Nv2080DstateHdaCodecNotificationRec.register_fields([('dstateHdaCodec', NvU32, 0)]) +Nv2080DstateHdaCodecNotification: TypeAlias = struct_Nv2080DstateHdaCodecNotificationRec +@c.record +class struct_Nv2080HdmiFrlRequestNotificationRec(c.Struct): + SIZE = 4 + displayId: int +struct_Nv2080HdmiFrlRequestNotificationRec.register_fields([('displayId', NvU32, 0)]) +Nv2080HdmiFrlRequestNotification: TypeAlias = struct_Nv2080HdmiFrlRequestNotificationRec +@c.record +class struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS(c.Struct): + SIZE = 3 + platformPowerModeIndex: int + platformPowerModeMask: int + eventReason: int +NvU8: TypeAlias = ctypes.c_ubyte +struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS.register_fields([('platformPowerModeIndex', NvU8, 0), ('platformPowerModeMask', NvU8, 1), ('eventReason', NvU8, 2)]) +NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS: TypeAlias = struct__NV2080_PLATFORM_POWER_MODE_CHANGE_STATUS +@c.record +class struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE(c.Struct): + SIZE = 1 + workloadType: int +struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE.register_fields([('workloadType', NvU8, 0)]) +NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE: TypeAlias = struct__NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD_UPDATE +@c.record +class Nv2080QosIntrNotification(c.Struct): + SIZE = 4 + engineType: int +Nv2080QosIntrNotification.register_fields([('engineType', NvU32, 0)]) +@c.record +class Nv2080EccDbeNotification(c.Struct): + SIZE = 8 + physAddress: int +Nv2080EccDbeNotification.register_fields([('physAddress', NvU64, 0)]) +@c.record +class Nv2080LpwrDifrPrefetchNotification(c.Struct): + SIZE = 4 + l2CacheSize: int +Nv2080LpwrDifrPrefetchNotification.register_fields([('l2CacheSize', NvU32, 0)]) +@c.record +class Nv2080NvlinkLnkChangeNotification(c.Struct): + SIZE = 8 + GpuId: int + linkId: int +Nv2080NvlinkLnkChangeNotification.register_fields([('GpuId', NvU32, 0), ('linkId', NvU32, 4)]) +@c.record +class struct_Nvc56fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc56fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc56fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +Nvc56fControl: TypeAlias = volatile_struct_Nvc56fControl_struct +volatile_struct_Nvc56fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +AmpereAControlGPFifo: TypeAlias = volatile_struct_Nvc56fControl_struct +@c.record +class struct_Nvc86fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc86fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc86fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[16]] + Put: int + Get: int + Reference: int + PutHi: int + Ignored01: c.Array[ctypes.c_uint32, Literal[2]] + TopLevelGet: int + TopLevelGetHi: int + GetHi: int + Ignored02: c.Array[ctypes.c_uint32, Literal[7]] + Ignored03: int + Ignored04: c.Array[ctypes.c_uint32, Literal[1]] + GPGet: int + GPPut: int + Ignored05: c.Array[ctypes.c_uint32, Literal[92]] +Nvc86fControl: TypeAlias = volatile_struct_Nvc86fControl_struct +volatile_struct_Nvc86fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[16]], 0), ('Put', NvU32, 64), ('Get', NvU32, 68), ('Reference', NvU32, 72), ('PutHi', NvU32, 76), ('Ignored01', c.Array[NvU32, Literal[2]], 80), ('TopLevelGet', NvU32, 88), ('TopLevelGetHi', NvU32, 92), ('GetHi', NvU32, 96), ('Ignored02', c.Array[NvU32, Literal[7]], 100), ('Ignored03', NvU32, 128), ('Ignored04', c.Array[NvU32, Literal[1]], 132), ('GPGet', NvU32, 136), ('GPPut', NvU32, 140), ('Ignored05', c.Array[NvU32, Literal[92]], 144)]) +HopperAControlGPFifo: TypeAlias = volatile_struct_Nvc86fControl_struct +@c.record +class struct_Nvc96fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[35]] + GPPut: int + Ignored01: c.Array[ctypes.c_uint32, Literal[92]] +struct_Nvc96fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[35]], 0), ('GPPut', NvU32, 140), ('Ignored01', c.Array[NvU32, Literal[92]], 144)]) +@c.record +class volatile_struct_Nvc96fControl_struct(c.Struct): + SIZE = 512 + Ignored00: c.Array[ctypes.c_uint32, Literal[35]] + GPPut: int + Ignored01: c.Array[ctypes.c_uint32, Literal[92]] +Nvc96fControl: TypeAlias = volatile_struct_Nvc96fControl_struct +volatile_struct_Nvc96fControl_struct.register_fields([('Ignored00', c.Array[NvU32, Literal[35]], 0), ('GPPut', NvU32, 140), ('Ignored01', c.Array[NvU32, Literal[92]], 144)]) +BlackwellAControlGPFifo: TypeAlias = volatile_struct_Nvc96fControl_struct +@c.record +class struct_NV83DE_ALLOC_PARAMETERS(c.Struct): + SIZE = 12 + hDebuggerClient_Obsolete: int + hAppClient: int + hClass3dObject: int +struct_NV83DE_ALLOC_PARAMETERS.register_fields([('hDebuggerClient_Obsolete', NvHandle, 0), ('hAppClient', NvHandle, 4), ('hClass3dObject', NvHandle, 8)]) +NV83DE_ALLOC_PARAMETERS: TypeAlias = struct_NV83DE_ALLOC_PARAMETERS +@c.record +class struct_NVB2CC_ALLOC_PARAMETERS(c.Struct): + SIZE = 8 + hClientTarget: int + hContextTarget: int +struct_NVB2CC_ALLOC_PARAMETERS.register_fields([('hClientTarget', NvHandle, 0), ('hContextTarget', NvHandle, 4)]) +NVB2CC_ALLOC_PARAMETERS: TypeAlias = struct_NVB2CC_ALLOC_PARAMETERS +@c.record +class UVM_RESERVE_VA_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +NV_STATUS: TypeAlias = ctypes.c_uint32 +UVM_RESERVE_VA_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_RELEASE_VA_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_RELEASE_VA_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGION_COMMIT_PARAMS(c.Struct): + SIZE = 48 + requestedBase: int + length: int + streamId: int + gpuUuid: struct_nv_uuid + rmStatus: int +UvmStream: TypeAlias = ctypes.c_uint64 +@c.record +class struct_nv_uuid(c.Struct): + SIZE = 16 + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +NvProcessorUuid: TypeAlias = struct_nv_uuid +struct_nv_uuid.register_fields([('uuid', c.Array[NvU8, Literal[16]], 0)]) +UVM_REGION_COMMIT_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('streamId', UvmStream, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_REGION_DECOMMIT_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_REGION_DECOMMIT_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGION_SET_STREAM_PARAMS(c.Struct): + SIZE = 48 + requestedBase: int + length: int + newStreamId: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_REGION_SET_STREAM_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('newStreamId', UvmStream, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmStatus', NV_STATUS, 40)]) +@c.record +class UVM_SET_STREAM_RUNNING_PARAMS(c.Struct): + SIZE = 16 + streamId: int + rmStatus: int +UVM_SET_STREAM_RUNNING_PARAMS.register_fields([('streamId', UvmStream, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_SET_STREAM_STOPPED_PARAMS(c.Struct): + SIZE = 272 + streamIdArray: c.Array[ctypes.c_uint64, Literal[32]] + nStreams: int + rmStatus: int +UVM_SET_STREAM_STOPPED_PARAMS.register_fields([('streamIdArray', c.Array[UvmStream, Literal[32]], 0), ('nStreams', NvU64, 256), ('rmStatus', NV_STATUS, 264)]) +@c.record +class UVM_ADD_SESSION_PARAMS(c.Struct): + SIZE = 8 + pidTarget: int + rmStatus: int +UVM_ADD_SESSION_PARAMS.register_fields([('pidTarget', NvU32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_ENABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 904 + config: c.Array[UvmCounterConfig, Literal[32]] + count: int + rmStatus: int +@c.record +class UvmCounterConfig(c.Struct): + SIZE = 28 + scope: int + name: int + gpuid: struct_nv_uuid + state: int +UvmCounterConfig.register_fields([('scope', NvU32, 0), ('name', NvU32, 4), ('gpuid', NvProcessorUuid, 8), ('state', NvU32, 24)]) +UVM_ENABLE_COUNTERS_PARAMS.register_fields([('config', c.Array[UvmCounterConfig, Literal[32]], 0), ('count', NvU32, 896), ('rmStatus', NV_STATUS, 900)]) +@c.record +class UVM_MAP_COUNTER_PARAMS(c.Struct): + SIZE = 40 + scope: int + counterName: int + gpuUuid: struct_nv_uuid + addr: ctypes.c_void_p + rmStatus: int +UVM_MAP_COUNTER_PARAMS.register_fields([('scope', NvU32, 0), ('counterName', NvU32, 4), ('gpuUuid', NvProcessorUuid, 8), ('addr', NvP64, 24), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_CREATE_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 40 + eventQueueIndex: int + queueSize: int + notificationCount: int + notificationHandle: int + timeStampType: int + rmStatus: int +UVM_CREATE_EVENT_QUEUE_PARAMS.register_fields([('eventQueueIndex', NvU32, 0), ('queueSize', NvU64, 8), ('notificationCount', NvU64, 16), ('notificationHandle', NvU64, 24), ('timeStampType', NvU32, 32), ('rmStatus', NV_STATUS, 36)]) +@c.record +class UVM_REMOVE_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 8 + eventQueueIndex: int + rmStatus: int +UVM_REMOVE_EVENT_QUEUE_PARAMS.register_fields([('eventQueueIndex', NvU32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_MAP_EVENT_QUEUE_PARAMS(c.Struct): + SIZE = 56 + eventQueueIndex: int + userRODataAddr: ctypes.c_void_p + userRWDataAddr: ctypes.c_void_p + readIndexAddr: ctypes.c_void_p + writeIndexAddr: ctypes.c_void_p + queueBufferAddr: ctypes.c_void_p + rmStatus: int +UVM_MAP_EVENT_QUEUE_PARAMS.register_fields([('eventQueueIndex', NvU32, 0), ('userRODataAddr', NvP64, 8), ('userRWDataAddr', NvP64, 16), ('readIndexAddr', NvP64, 24), ('writeIndexAddr', NvP64, 32), ('queueBufferAddr', NvP64, 40), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_EVENT_CTRL_PARAMS(c.Struct): + SIZE = 16 + eventQueueIndex: int + eventType: int + enable: int + rmStatus: int +NvS32: TypeAlias = ctypes.c_int32 +UVM_EVENT_CTRL_PARAMS.register_fields([('eventQueueIndex', NvU32, 0), ('eventType', NvS32, 4), ('enable', NvU32, 8), ('rmStatus', NV_STATUS, 12)]) +@c.record +class UVM_GET_GPU_UUID_TABLE_PARAMS(c.Struct): + SIZE = 520 + gpuUuidArray: c.Array[struct_nv_uuid, Literal[32]] + validCount: int + rmStatus: int +UVM_GET_GPU_UUID_TABLE_PARAMS.register_fields([('gpuUuidArray', c.Array[NvProcessorUuid, Literal[32]], 0), ('validCount', NvU32, 512), ('rmStatus', NV_STATUS, 516)]) +@c.record +class UVM_REGISTER_GPU_VASPACE_PARAMS(c.Struct): + SIZE = 32 + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hVaSpace: int + rmStatus: int +UVM_REGISTER_GPU_VASPACE_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmCtrlFd', NvS32, 16), ('hClient', NvHandle, 20), ('hVaSpace', NvHandle, 24), ('rmStatus', NV_STATUS, 28)]) +@c.record +class UVM_UNREGISTER_GPU_VASPACE_PARAMS(c.Struct): + SIZE = 20 + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_UNREGISTER_GPU_VASPACE_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGISTER_CHANNEL_PARAMS(c.Struct): + SIZE = 56 + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hChannel: int + base: int + length: int + rmStatus: int +UVM_REGISTER_CHANNEL_PARAMS.register_fields([('gpuUuid', NvProcessorUuid, 0), ('rmCtrlFd', NvS32, 16), ('hClient', NvHandle, 20), ('hChannel', NvHandle, 24), ('base', NvU64, 32), ('length', NvU64, 40), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_UNREGISTER_CHANNEL_PARAMS(c.Struct): + SIZE = 12 + hClient: int + hChannel: int + rmStatus: int +UVM_UNREGISTER_CHANNEL_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_ENABLE_PEER_ACCESS_PARAMS(c.Struct): + SIZE = 36 + gpuUuidA: struct_nv_uuid + gpuUuidB: struct_nv_uuid + rmStatus: int +UVM_ENABLE_PEER_ACCESS_PARAMS.register_fields([('gpuUuidA', NvProcessorUuid, 0), ('gpuUuidB', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_DISABLE_PEER_ACCESS_PARAMS(c.Struct): + SIZE = 36 + gpuUuidA: struct_nv_uuid + gpuUuidB: struct_nv_uuid + rmStatus: int +UVM_DISABLE_PEER_ACCESS_PARAMS.register_fields([('gpuUuidA', NvProcessorUuid, 0), ('gpuUuidB', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_MAP_EXTERNAL_ALLOCATION_PARAMS(c.Struct): + SIZE = 9264 + base: int + length: int + offset: int + perGpuAttributes: c.Array[UvmGpuMappingAttributes, Literal[256]] + gpuAttributesCount: int + rmCtrlFd: int + hClient: int + hMemory: int + rmStatus: int +@c.record +class UvmGpuMappingAttributes(c.Struct): + SIZE = 36 + gpuUuid: struct_nv_uuid + gpuMappingType: int + gpuCachingType: int + gpuFormatType: int + gpuElementBits: int + gpuCompressionType: int +UvmGpuMappingAttributes.register_fields([('gpuUuid', NvProcessorUuid, 0), ('gpuMappingType', NvU32, 16), ('gpuCachingType', NvU32, 20), ('gpuFormatType', NvU32, 24), ('gpuElementBits', NvU32, 28), ('gpuCompressionType', NvU32, 32)]) +UVM_MAP_EXTERNAL_ALLOCATION_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('offset', NvU64, 16), ('perGpuAttributes', c.Array[UvmGpuMappingAttributes, Literal[256]], 24), ('gpuAttributesCount', NvU64, 9240), ('rmCtrlFd', NvS32, 9248), ('hClient', NvU32, 9252), ('hMemory', NvU32, 9256), ('rmStatus', NV_STATUS, 9260)]) +@c.record +class UVM_FREE_PARAMS(c.Struct): + SIZE = 16 + base: int + rmStatus: int +UVM_FREE_PARAMS.register_fields([('base', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_MEM_MAP_PARAMS(c.Struct): + SIZE = 24 + regionBase: ctypes.c_void_p + regionLength: int + rmStatus: int +UVM_MEM_MAP_PARAMS.register_fields([('regionBase', NvP64, 0), ('regionLength', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_REGISTER_GPU_PARAMS(c.Struct): + SIZE = 40 + gpu_uuid: struct_nv_uuid + numaEnabled: int + numaNodeId: int + rmCtrlFd: int + hClient: int + hSmcPartRef: int + rmStatus: int +UVM_REGISTER_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('numaEnabled', NvBool, 16), ('numaNodeId', NvS32, 20), ('rmCtrlFd', NvS32, 24), ('hClient', NvHandle, 28), ('hSmcPartRef', NvHandle, 32), ('rmStatus', NV_STATUS, 36)]) +@c.record +class UVM_UNREGISTER_GPU_PARAMS(c.Struct): + SIZE = 20 + gpu_uuid: struct_nv_uuid + rmStatus: int +UVM_UNREGISTER_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_PAGEABLE_MEM_ACCESS_PARAMS(c.Struct): + SIZE = 8 + pageableMemAccess: int + rmStatus: int +UVM_PAGEABLE_MEM_ACCESS_PARAMS.register_fields([('pageableMemAccess', NvBool, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_SET_PREFERRED_LOCATION_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + preferredLocation: struct_nv_uuid + preferredCpuNumaNode: int + rmStatus: int +UVM_SET_PREFERRED_LOCATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('preferredLocation', NvProcessorUuid, 16), ('preferredCpuNumaNode', NvS32, 32), ('rmStatus', NV_STATUS, 36)]) +@c.record +class UVM_UNSET_PREFERRED_LOCATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_UNSET_PREFERRED_LOCATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_ENABLE_READ_DUPLICATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_ENABLE_READ_DUPLICATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_DISABLE_READ_DUPLICATION_PARAMS(c.Struct): + SIZE = 24 + requestedBase: int + length: int + rmStatus: int +UVM_DISABLE_READ_DUPLICATION_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_SET_ACCESSED_BY_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + accessedByUuid: struct_nv_uuid + rmStatus: int +UVM_SET_ACCESSED_BY_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('accessedByUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_UNSET_ACCESSED_BY_PARAMS(c.Struct): + SIZE = 40 + requestedBase: int + length: int + accessedByUuid: struct_nv_uuid + rmStatus: int +UVM_UNSET_ACCESSED_BY_PARAMS.register_fields([('requestedBase', NvU64, 0), ('length', NvU64, 8), ('accessedByUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_MIGRATE_PARAMS(c.Struct): + SIZE = 80 + base: int + length: int + destinationUuid: struct_nv_uuid + flags: int + semaphoreAddress: int + semaphorePayload: int + cpuNumaNode: int + userSpaceStart: int + userSpaceLength: int + rmStatus: int +UVM_MIGRATE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('destinationUuid', NvProcessorUuid, 16), ('flags', NvU32, 32), ('semaphoreAddress', NvU64, 40), ('semaphorePayload', NvU32, 48), ('cpuNumaNode', NvS32, 52), ('userSpaceStart', NvU64, 56), ('userSpaceLength', NvU64, 64), ('rmStatus', NV_STATUS, 72)]) +@c.record +class UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS(c.Struct): + SIZE = 56 + queueBuffer: int + queueBufferSize: int + controlBuffer: int + processor: struct_nv_uuid + allProcessors: int + uvmFd: int + rmStatus: int +UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS.register_fields([('queueBuffer', NvU64, 0), ('queueBufferSize', NvU64, 8), ('controlBuffer', NvU64, 16), ('processor', NvProcessorUuid, 24), ('allProcessors', NvU32, 40), ('uvmFd', NvU32, 44), ('rmStatus', NV_STATUS, 48)]) +@c.record +class UVM_TOOLS_SET_NOTIFICATION_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + notificationThreshold: int + rmStatus: int +UVM_TOOLS_SET_NOTIFICATION_THRESHOLD_PARAMS.register_fields([('notificationThreshold', NvU32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS_PARAMS(c.Struct): + SIZE = 16 + eventTypeFlags: int + rmStatus: int +UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS_PARAMS.register_fields([('eventTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS_PARAMS(c.Struct): + SIZE = 16 + eventTypeFlags: int + rmStatus: int +UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS_PARAMS.register_fields([('eventTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_ENABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterTypeFlags: int + rmStatus: int +UVM_TOOLS_ENABLE_COUNTERS_PARAMS.register_fields([('counterTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_DISABLE_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterTypeFlags: int + rmStatus: int +UVM_TOOLS_DISABLE_COUNTERS_PARAMS.register_fields([('counterTypeFlags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_TOOLS_READ_PROCESS_MEMORY_PARAMS(c.Struct): + SIZE = 40 + buffer: int + size: int + targetVa: int + bytesRead: int + rmStatus: int +UVM_TOOLS_READ_PROCESS_MEMORY_PARAMS.register_fields([('buffer', NvU64, 0), ('size', NvU64, 8), ('targetVa', NvU64, 16), ('bytesRead', NvU64, 24), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_WRITE_PROCESS_MEMORY_PARAMS(c.Struct): + SIZE = 40 + buffer: int + size: int + targetVa: int + bytesWritten: int + rmStatus: int +UVM_TOOLS_WRITE_PROCESS_MEMORY_PARAMS.register_fields([('buffer', NvU64, 0), ('size', NvU64, 8), ('targetVa', NvU64, 16), ('bytesWritten', NvU64, 24), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS(c.Struct): + SIZE = 16 + tablePtr: int + rmStatus: int +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS.register_fields([('tablePtr', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class UVM_MAP_DYNAMIC_PARALLELISM_REGION_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_MAP_DYNAMIC_PARALLELISM_REGION_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_UNMAP_EXTERNAL_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_UNMAP_EXTERNAL_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_TOOLS_FLUSH_EVENTS_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_TOOLS_FLUSH_EVENTS_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_ALLOC_SEMAPHORE_POOL_PARAMS(c.Struct): + SIZE = 9248 + base: int + length: int + perGpuAttributes: c.Array[UvmGpuMappingAttributes, Literal[256]] + gpuAttributesCount: int + rmStatus: int +UVM_ALLOC_SEMAPHORE_POOL_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('perGpuAttributes', c.Array[UvmGpuMappingAttributes, Literal[256]], 16), ('gpuAttributesCount', NvU64, 9232), ('rmStatus', NV_STATUS, 9240)]) +@c.record +class UVM_CLEAN_UP_ZOMBIE_RESOURCES_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_CLEAN_UP_ZOMBIE_RESOURCES_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_PAGEABLE_MEM_ACCESS_ON_GPU_PARAMS(c.Struct): + SIZE = 24 + gpu_uuid: struct_nv_uuid + pageableMemAccess: int + rmStatus: int +UVM_PAGEABLE_MEM_ACCESS_ON_GPU_PARAMS.register_fields([('gpu_uuid', NvProcessorUuid, 0), ('pageableMemAccess', NvBool, 16), ('rmStatus', NV_STATUS, 20)]) +@c.record +class UVM_POPULATE_PAGEABLE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + flags: int + rmStatus: int +UVM_POPULATE_PAGEABLE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('flags', NvU32, 16), ('rmStatus', NV_STATUS, 20)]) +@c.record +class UVM_VALIDATE_VA_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + rmStatus: int +UVM_VALIDATE_VA_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_CREATE_EXTERNAL_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + length: int + rmStatus: int +UVM_CREATE_EXTERNAL_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('rmStatus', NV_STATUS, 16)]) +@c.record +class UVM_MAP_EXTERNAL_SPARSE_PARAMS(c.Struct): + SIZE = 40 + base: int + length: int + gpuUuid: struct_nv_uuid + rmStatus: int +UVM_MAP_EXTERNAL_SPARSE_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('gpuUuid', NvProcessorUuid, 16), ('rmStatus', NV_STATUS, 32)]) +@c.record +class UVM_MM_INITIALIZE_PARAMS(c.Struct): + SIZE = 8 + uvmFd: int + rmStatus: int +UVM_MM_INITIALIZE_PARAMS.register_fields([('uvmFd', NvS32, 0), ('rmStatus', NV_STATUS, 4)]) +UVM_TOOLS_INIT_EVENT_TRACKER_V2_PARAMS: TypeAlias = UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_V2_PARAMS: TypeAlias = UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_PARAMS +@c.record +class UVM_ALLOC_DEVICE_P2P_PARAMS(c.Struct): + SIZE = 56 + base: int + length: int + offset: int + gpuUuid: struct_nv_uuid + rmCtrlFd: int + hClient: int + hMemory: int + rmStatus: int +UVM_ALLOC_DEVICE_P2P_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('offset', NvU64, 16), ('gpuUuid', NvProcessorUuid, 24), ('rmCtrlFd', NvS32, 40), ('hClient', NvU32, 44), ('hMemory', NvU32, 48), ('rmStatus', NV_STATUS, 52)]) +@c.record +class UVM_CLEAR_ALL_ACCESS_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + rmStatus: int +UVM_CLEAR_ALL_ACCESS_COUNTERS_PARAMS.register_fields([('rmStatus', NV_STATUS, 0)]) +@c.record +class UVM_DISCARD_PARAMS(c.Struct): + SIZE = 32 + base: int + length: int + flags: int + rmStatus: int +UVM_DISCARD_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('flags', NvU64, 16), ('rmStatus', NV_STATUS, 24)]) +@c.record +class UVM_QUERY_RESIDENCY_PARAMS(c.Struct): + SIZE = 80 + base: int + length: int + samplingStride: int + isManagedMemory: int + numSamples: int + pageAddresses: int + pageStatus: int + residency: struct_nv_uuid + resident_nid: int + rmStatus: int +UVM_QUERY_RESIDENCY_PARAMS.register_fields([('base', NvU64, 0), ('length', NvU64, 8), ('samplingStride', NvU64, 16), ('isManagedMemory', NvBool, 24), ('numSamples', NvU64, 32), ('pageAddresses', NvU64, 40), ('pageStatus', NvU64, 48), ('residency', NvProcessorUuid, 56), ('resident_nid', NvS32, 72), ('rmStatus', NV_STATUS, 76)]) +@c.record +class UVM_IS_8_SUPPORTED_PARAMS(c.Struct): + SIZE = 8 + is8Supported: int + rmStatus: int +UVM_IS_8_SUPPORTED_PARAMS.register_fields([('is8Supported', NvU32, 0), ('rmStatus', NV_STATUS, 4)]) +@c.record +class UVM_INITIALIZE_PARAMS(c.Struct): + SIZE = 16 + flags: int + rmStatus: int +UVM_INITIALIZE_PARAMS.register_fields([('flags', NvU64, 0), ('rmStatus', NV_STATUS, 8)]) +@c.record +class nv_pci_info_t(c.Struct): + SIZE = 12 + domain: int + bus: int + slot: int + function: int + vendor_id: int + device_id: int +NvU16: TypeAlias = ctypes.c_uint16 +nv_pci_info_t.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('function', NvU8, 6), ('vendor_id', NvU16, 8), ('device_id', NvU16, 10)]) +@c.record +class struct_nv_ioctl_xfer(c.Struct): + SIZE = 16 + cmd: int + size: int + ptr: ctypes.c_void_p +struct_nv_ioctl_xfer.register_fields([('cmd', NvU32, 0), ('size', NvU32, 4), ('ptr', NvP64, 8)]) +nv_ioctl_xfer_t: TypeAlias = struct_nv_ioctl_xfer +@c.record +class struct_nv_ioctl_card_info(c.Struct): + SIZE = 72 + valid: int + pci_info: nv_pci_info_t + gpu_id: int + interrupt_line: int + reg_address: int + reg_size: int + fb_address: int + fb_size: int + minor_number: int + dev_name: c.Array[ctypes.c_ubyte, Literal[10]] +struct_nv_ioctl_card_info.register_fields([('valid', NvBool, 0), ('pci_info', nv_pci_info_t, 4), ('gpu_id', NvU32, 16), ('interrupt_line', NvU16, 20), ('reg_address', NvU64, 24), ('reg_size', NvU64, 32), ('fb_address', NvU64, 40), ('fb_size', NvU64, 48), ('minor_number', NvU32, 56), ('dev_name', c.Array[NvU8, Literal[10]], 60)]) +nv_ioctl_card_info_t: TypeAlias = struct_nv_ioctl_card_info +@c.record +class struct_nv_ioctl_alloc_os_event(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + fd: int + Status: int +struct_nv_ioctl_alloc_os_event.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('fd', NvU32, 8), ('Status', NvU32, 12)]) +nv_ioctl_alloc_os_event_t: TypeAlias = struct_nv_ioctl_alloc_os_event +@c.record +class struct_nv_ioctl_free_os_event(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + fd: int + Status: int +struct_nv_ioctl_free_os_event.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('fd', NvU32, 8), ('Status', NvU32, 12)]) +nv_ioctl_free_os_event_t: TypeAlias = struct_nv_ioctl_free_os_event +@c.record +class struct_nv_ioctl_status_code(c.Struct): + SIZE = 12 + domain: int + bus: int + slot: int + status: int +struct_nv_ioctl_status_code.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('status', NvU32, 8)]) +nv_ioctl_status_code_t: TypeAlias = struct_nv_ioctl_status_code +@c.record +class struct_nv_ioctl_rm_api_version(c.Struct): + SIZE = 72 + cmd: int + reply: int + versionString: c.Array[ctypes.c_char, Literal[64]] +struct_nv_ioctl_rm_api_version.register_fields([('cmd', NvU32, 0), ('reply', NvU32, 4), ('versionString', c.Array[ctypes.c_char, Literal[64]], 8)]) +nv_ioctl_rm_api_version_t: TypeAlias = struct_nv_ioctl_rm_api_version +@c.record +class struct_nv_ioctl_query_device_intr(c.Struct): + SIZE = 8 + intrStatus: int + status: int +struct_nv_ioctl_query_device_intr.register_fields([('intrStatus', NvU32, 0), ('status', NvU32, 4)]) +nv_ioctl_query_device_intr_t: TypeAlias = struct_nv_ioctl_query_device_intr +@c.record +class struct_nv_ioctl_sys_params(c.Struct): + SIZE = 8 + memblock_size: int +struct_nv_ioctl_sys_params.register_fields([('memblock_size', NvU64, 0)]) +nv_ioctl_sys_params_t: TypeAlias = struct_nv_ioctl_sys_params +@c.record +class struct_nv_ioctl_register_fd(c.Struct): + SIZE = 4 + ctl_fd: int +struct_nv_ioctl_register_fd.register_fields([('ctl_fd', ctypes.c_int32, 0)]) +nv_ioctl_register_fd_t: TypeAlias = struct_nv_ioctl_register_fd +@c.record +class struct_nv_ioctl_export_to_dma_buf_fd(c.Struct): + SIZE = 2608 + fd: int + hClient: int + totalObjects: int + numObjects: int + index: int + totalSize: int + mappingType: int + bAllowMmap: int + handles: c.Array[ctypes.c_uint32, Literal[128]] + offsets: c.Array[ctypes.c_uint64, Literal[128]] + sizes: c.Array[ctypes.c_uint64, Literal[128]] + status: int +struct_nv_ioctl_export_to_dma_buf_fd.register_fields([('fd', ctypes.c_int32, 0), ('hClient', NvHandle, 4), ('totalObjects', NvU32, 8), ('numObjects', NvU32, 12), ('index', NvU32, 16), ('totalSize', NvU64, 24), ('mappingType', NvU8, 32), ('bAllowMmap', NvBool, 33), ('handles', c.Array[NvHandle, Literal[128]], 36), ('offsets', c.Array[NvU64, Literal[128]], 552), ('sizes', c.Array[NvU64, Literal[128]], 1576), ('status', NvU32, 2600)]) +nv_ioctl_export_to_dma_buf_fd_t: TypeAlias = struct_nv_ioctl_export_to_dma_buf_fd +@c.record +class struct_nv_ioctl_wait_open_complete(c.Struct): + SIZE = 8 + rc: int + adapterStatus: int +struct_nv_ioctl_wait_open_complete.register_fields([('rc', ctypes.c_int32, 0), ('adapterStatus', NvU32, 4)]) +nv_ioctl_wait_open_complete_t: TypeAlias = struct_nv_ioctl_wait_open_complete +@c.record +class struct_offline_addresses(c.Struct): + SIZE = 520 + addresses: c.Array[ctypes.c_uint64, Literal[64]] + numEntries: int +uint64_t: TypeAlias = ctypes.c_uint64 +uint32_t: TypeAlias = ctypes.c_uint32 +struct_offline_addresses.register_fields([('addresses', c.Array[uint64_t, Literal[64]], 0), ('numEntries', uint32_t, 512)]) +nv_offline_addresses_t: TypeAlias = struct_offline_addresses +@c.record +class struct_nv_ioctl_numa_info(c.Struct): + SIZE = 560 + nid: int + status: int + memblock_size: int + numa_mem_addr: int + numa_mem_size: int + use_auto_online: int + offline_addresses: struct_offline_addresses +int32_t: TypeAlias = ctypes.c_int32 +uint8_t: TypeAlias = ctypes.c_ubyte +struct_nv_ioctl_numa_info.register_fields([('nid', int32_t, 0), ('status', int32_t, 4), ('memblock_size', uint64_t, 8), ('numa_mem_addr', uint64_t, 16), ('numa_mem_size', uint64_t, 24), ('use_auto_online', uint8_t, 32), ('offline_addresses', nv_offline_addresses_t, 40)]) +nv_ioctl_numa_info_t: TypeAlias = struct_nv_ioctl_numa_info +@c.record +class struct_nv_ioctl_set_numa_status(c.Struct): + SIZE = 4 + status: int +struct_nv_ioctl_set_numa_status.register_fields([('status', int32_t, 0)]) +nv_ioctl_set_numa_status_t: TypeAlias = struct_nv_ioctl_set_numa_status +@c.record +class nv_ioctl_nvos02_parameters_with_fd(c.Struct): + SIZE = 56 + params: NVOS02_PARAMETERS + fd: int +@c.record +class NVOS02_PARAMETERS(c.Struct): + SIZE = 48 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + flags: int + pMemory: ctypes.c_void_p + limit: int + status: int +NVOS02_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('flags', NvV32, 16), ('pMemory', NvP64, 24), ('limit', NvU64, 32), ('status', NvV32, 40)]) +nv_ioctl_nvos02_parameters_with_fd.register_fields([('params', NVOS02_PARAMETERS, 0), ('fd', ctypes.c_int32, 48)]) +@c.record +class nv_ioctl_nvos33_parameters_with_fd(c.Struct): + SIZE = 56 + params: NVOS33_PARAMETERS + fd: int +@c.record +class NVOS33_PARAMETERS(c.Struct): + SIZE = 48 + hClient: int + hDevice: int + hMemory: int + offset: int + length: int + pLinearAddress: ctypes.c_void_p + status: int + flags: int +NVOS33_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('offset', NvU64, 16), ('length', NvU64, 24), ('pLinearAddress', NvP64, 32), ('status', NvU32, 40), ('flags', NvU32, 44)]) +nv_ioctl_nvos33_parameters_with_fd.register_fields([('params', NVOS33_PARAMETERS, 0), ('fd', ctypes.c_int32, 48)]) +@c.record +class struct_NV_MEMORY_DESC_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + addressSpace: int + cacheAttrib: int +struct_NV_MEMORY_DESC_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('addressSpace', NvU32, 16), ('cacheAttrib', NvU32, 20)]) +NV_MEMORY_DESC_PARAMS: TypeAlias = struct_NV_MEMORY_DESC_PARAMS +@c.record +class struct_NV_CHANNEL_ALLOC_PARAMS(c.Struct): + SIZE = 376 + hObjectError: int + hObjectBuffer: int + gpFifoOffset: int + gpFifoEntries: int + flags: int + hContextShare: int + hVASpace: int + hHandleVASpace: int + hUserdMemory: c.Array[ctypes.c_uint32, Literal[8]] + userdOffset: c.Array[ctypes.c_uint64, Literal[8]] + engineType: int + cid: int + subDeviceId: int + hObjectEccError: int + instanceMem: struct_NV_MEMORY_DESC_PARAMS + userdMem: struct_NV_MEMORY_DESC_PARAMS + ramfcMem: struct_NV_MEMORY_DESC_PARAMS + mthdbufMem: struct_NV_MEMORY_DESC_PARAMS + hPhysChannelGroup: int + internalFlags: int + errorNotifierMem: struct_NV_MEMORY_DESC_PARAMS + eccErrorNotifierMem: struct_NV_MEMORY_DESC_PARAMS + ProcessID: int + SubProcessID: int + encryptIv: c.Array[ctypes.c_uint32, Literal[3]] + decryptIv: c.Array[ctypes.c_uint32, Literal[3]] + hmacNonce: c.Array[ctypes.c_uint32, Literal[8]] + tpcConfigID: int +struct_NV_CHANNEL_ALLOC_PARAMS.register_fields([('hObjectError', NvHandle, 0), ('hObjectBuffer', NvHandle, 4), ('gpFifoOffset', NvU64, 8), ('gpFifoEntries', NvU32, 16), ('flags', NvU32, 20), ('hContextShare', NvHandle, 24), ('hVASpace', NvHandle, 28), ('hHandleVASpace', NvHandle, 32), ('hUserdMemory', c.Array[NvHandle, Literal[8]], 36), ('userdOffset', c.Array[NvU64, Literal[8]], 72), ('engineType', NvU32, 136), ('cid', NvU32, 140), ('subDeviceId', NvU32, 144), ('hObjectEccError', NvHandle, 148), ('instanceMem', NV_MEMORY_DESC_PARAMS, 152), ('userdMem', NV_MEMORY_DESC_PARAMS, 176), ('ramfcMem', NV_MEMORY_DESC_PARAMS, 200), ('mthdbufMem', NV_MEMORY_DESC_PARAMS, 224), ('hPhysChannelGroup', NvHandle, 248), ('internalFlags', NvU32, 252), ('errorNotifierMem', NV_MEMORY_DESC_PARAMS, 256), ('eccErrorNotifierMem', NV_MEMORY_DESC_PARAMS, 280), ('ProcessID', NvU32, 304), ('SubProcessID', NvU32, 308), ('encryptIv', c.Array[NvU32, Literal[3]], 312), ('decryptIv', c.Array[NvU32, Literal[3]], 324), ('hmacNonce', c.Array[NvU32, Literal[8]], 336), ('tpcConfigID', NvU32, 368)]) +NV_CHANNEL_ALLOC_PARAMS: TypeAlias = struct_NV_CHANNEL_ALLOC_PARAMS +NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS: TypeAlias = struct_NV_CHANNEL_ALLOC_PARAMS +@c.record +class NVOS00_PARAMETERS(c.Struct): + SIZE = 16 + hRoot: int + hObjectParent: int + hObjectOld: int + status: int +NVOS00_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectOld', NvHandle, 8), ('status', NvV32, 12)]) +@c.record +class NVOS05_PARAMETERS(c.Struct): + SIZE = 20 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + status: int +NVOS05_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('status', NvV32, 16)]) +Callback1ArgVoidReturn: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +Callback5ArgVoidReturn: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +@c.record +class NVOS10_EVENT_KERNEL_CALLBACK(c.Struct): + SIZE = 16 + func: c.CFUNCTYPE[None, [ctypes.c_void_p]] + arg: ctypes.c_void_p +NVOS10_EVENT_KERNEL_CALLBACK.register_fields([('func', Callback1ArgVoidReturn, 0), ('arg', ctypes.c_void_p, 8)]) +@c.record +class NVOS10_EVENT_KERNEL_CALLBACK_EX(c.Struct): + SIZE = 16 + func: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] + arg: ctypes.c_void_p +NVOS10_EVENT_KERNEL_CALLBACK_EX.register_fields([('func', Callback5ArgVoidReturn, 0), ('arg', ctypes.c_void_p, 8)]) +@c.record +class NVOS_I2C_ACCESS_PARAMS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + paramSize: int + paramStructPtr: ctypes.c_void_p + status: int +NVOS_I2C_ACCESS_PARAMS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('paramSize', NvU32, 8), ('paramStructPtr', NvP64, 16), ('status', NvV32, 24)]) +@c.record +class NVOS21_PARAMETERS(c.Struct): + SIZE = 32 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + pAllocParms: ctypes.c_void_p + paramsSize: int + status: int +NVOS21_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('pAllocParms', NvP64, 16), ('paramsSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS64_PARAMETERS(c.Struct): + SIZE = 48 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + pAllocParms: ctypes.c_void_p + pRightsRequested: ctypes.c_void_p + paramsSize: int + flags: int + status: int +NVOS64_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('pAllocParms', NvP64, 16), ('pRightsRequested', NvP64, 24), ('paramsSize', NvU32, 32), ('flags', NvU32, 36), ('status', NvV32, 40)]) +@c.record +class NVOS62_PARAMETERS(c.Struct): + SIZE = 24 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + paramSize: int + status: int +NVOS62_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('paramSize', NvU32, 16), ('status', NvV32, 20)]) +@c.record +class NVOS65_PARAMETERS(c.Struct): + SIZE = 32 + hRoot: int + hObjectParent: int + hObjectNew: int + hClass: int + paramSize: int + versionMagic: int + maskSize: int + status: int +NVOS65_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('paramSize', NvU32, 16), ('versionMagic', NvU32, 20), ('maskSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS30_PARAMETERS(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hChannel: int + numChannels: int + phClients: ctypes.c_void_p + phDevices: ctypes.c_void_p + phChannels: ctypes.c_void_p + flags: int + timeout: int + status: int +NVOS30_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hChannel', NvHandle, 8), ('numChannels', NvV32, 12), ('phClients', NvP64, 16), ('phDevices', NvP64, 24), ('phChannels', NvP64, 32), ('flags', NvV32, 40), ('timeout', NvV32, 44), ('status', NvV32, 48)]) +BindResultFunc: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +@c.record +class NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR_PARAMETERS(c.Struct): + SIZE = 16 + sgt: ctypes.c_void_p + gem: ctypes.c_void_p +NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR_PARAMETERS.register_fields([('sgt', NvP64, 0), ('gem', NvP64, 8)]) +@c.record +class NVOS32_PARAMETERS(c.Struct): + SIZE = 184 + hRoot: int + hObjectParent: int + function: int + hVASpace: int + ivcHeapNumber: int + status: int + total: int + free: int + data: NVOS32_PARAMETERS_data +NvS16: TypeAlias = ctypes.c_int16 +@c.record +class NVOS32_PARAMETERS_data(c.Struct): + SIZE = 144 + AllocSize: NVOS32_PARAMETERS_data_AllocSize + AllocTiledPitchHeight: NVOS32_PARAMETERS_data_AllocTiledPitchHeight + Free: NVOS32_PARAMETERS_data_Free + ReleaseCompr: NVOS32_PARAMETERS_data_ReleaseCompr + ReacquireCompr: NVOS32_PARAMETERS_data_ReacquireCompr + Info: NVOS32_PARAMETERS_data_Info + AllocSizeRange: NVOS32_PARAMETERS_data_AllocSizeRange + AllocHintAlignment: NVOS32_PARAMETERS_data_AllocHintAlignment + HwAlloc: NVOS32_PARAMETERS_data_HwAlloc + HwFree: NVOS32_PARAMETERS_data_HwFree + AllocOsDesc: NVOS32_PARAMETERS_data_AllocOsDesc +@c.record +class NVOS32_PARAMETERS_data_AllocSize(c.Struct): + SIZE = 120 + owner: int + hMemory: int + type: int + flags: int + attr: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + width: int + height: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + rangeBegin: int + rangeEnd: int + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocSize.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('attr', NvU32, 16), ('format', NvU32, 20), ('comprCovg', NvU32, 24), ('zcullCovg', NvU32, 28), ('partitionStride', NvU32, 32), ('width', NvU32, 36), ('height', NvU32, 40), ('size', NvU64, 48), ('alignment', NvU64, 56), ('offset', NvU64, 64), ('limit', NvU64, 72), ('address', NvP64, 80), ('rangeBegin', NvU64, 88), ('rangeEnd', NvU64, 96), ('attr2', NvU32, 104), ('ctagOffset', NvU32, 108), ('numaNode', NvS32, 112)]) +@c.record +class NVOS32_PARAMETERS_data_AllocTiledPitchHeight(c.Struct): + SIZE = 120 + owner: int + hMemory: int + type: int + flags: int + height: int + pitch: int + attr: int + width: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + rangeBegin: int + rangeEnd: int + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocTiledPitchHeight.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('height', NvU32, 16), ('pitch', NvS32, 20), ('attr', NvU32, 24), ('width', NvU32, 28), ('format', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('partitionStride', NvU32, 44), ('size', NvU64, 48), ('alignment', NvU64, 56), ('offset', NvU64, 64), ('limit', NvU64, 72), ('address', NvP64, 80), ('rangeBegin', NvU64, 88), ('rangeEnd', NvU64, 96), ('attr2', NvU32, 104), ('ctagOffset', NvU32, 108), ('numaNode', NvS32, 112)]) +@c.record +class NVOS32_PARAMETERS_data_Free(c.Struct): + SIZE = 12 + owner: int + hMemory: int + flags: int +NVOS32_PARAMETERS_data_Free.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('flags', NvU32, 8)]) +@c.record +class NVOS32_PARAMETERS_data_ReleaseCompr(c.Struct): + SIZE = 12 + owner: int + flags: int + hMemory: int +NVOS32_PARAMETERS_data_ReleaseCompr.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('hMemory', NvHandle, 8)]) +@c.record +class NVOS32_PARAMETERS_data_ReacquireCompr(c.Struct): + SIZE = 12 + owner: int + flags: int + hMemory: int +NVOS32_PARAMETERS_data_ReacquireCompr.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('hMemory', NvHandle, 8)]) +@c.record +class NVOS32_PARAMETERS_data_Info(c.Struct): + SIZE = 32 + attr: int + offset: int + size: int + base: int +NVOS32_PARAMETERS_data_Info.register_fields([('attr', NvU32, 0), ('offset', NvU64, 8), ('size', NvU64, 16), ('base', NvU64, 24)]) +@c.record +class NVOS32_PARAMETERS_data_AllocSizeRange(c.Struct): + SIZE = 112 + owner: int + hMemory: int + type: int + flags: int + attr: int + format: int + comprCovg: int + zcullCovg: int + partitionStride: int + size: int + alignment: int + offset: int + limit: int + rangeBegin: int + rangeEnd: int + address: ctypes.c_void_p + attr2: int + ctagOffset: int + numaNode: int +NVOS32_PARAMETERS_data_AllocSizeRange.register_fields([('owner', NvU32, 0), ('hMemory', NvHandle, 4), ('type', NvU32, 8), ('flags', NvU32, 12), ('attr', NvU32, 16), ('format', NvU32, 20), ('comprCovg', NvU32, 24), ('zcullCovg', NvU32, 28), ('partitionStride', NvU32, 32), ('size', NvU64, 40), ('alignment', NvU64, 48), ('offset', NvU64, 56), ('limit', NvU64, 64), ('rangeBegin', NvU64, 72), ('rangeEnd', NvU64, 80), ('address', NvP64, 88), ('attr2', NvU32, 96), ('ctagOffset', NvU32, 100), ('numaNode', NvS32, 104)]) +@c.record +class NVOS32_PARAMETERS_data_AllocHintAlignment(c.Struct): + SIZE = 56 + alignType: int + alignAttr: int + alignInputFlags: int + alignSize: int + alignHeight: int + alignWidth: int + alignPitch: int + alignPad: int + alignMask: int + alignKind: int + alignAdjust: int + alignAttr2: int +NVOS32_PARAMETERS_data_AllocHintAlignment.register_fields([('alignType', NvU32, 0), ('alignAttr', NvU32, 4), ('alignInputFlags', NvU32, 8), ('alignSize', NvU64, 16), ('alignHeight', NvU32, 24), ('alignWidth', NvU32, 28), ('alignPitch', NvU32, 32), ('alignPad', NvU32, 36), ('alignMask', NvU32, 40), ('alignKind', NvU32, 44), ('alignAdjust', NvU32, 48), ('alignAttr2', NvU32, 52)]) +@c.record +class NVOS32_PARAMETERS_data_HwAlloc(c.Struct): + SIZE = 144 + allocOwner: int + allochMemory: int + flags: int + allocType: int + allocAttr: int + allocInputFlags: int + allocSize: int + allocHeight: int + allocWidth: int + allocPitch: int + allocMask: int + allocComprCovg: int + allocZcullCovg: int + bindResultFunc: ctypes.c_void_p + pHandle: ctypes.c_void_p + hResourceHandle: int + retAttr: int + kind: int + osDeviceHandle: int + allocAttr2: int + retAttr2: int + allocAddr: int + comprInfo: NVOS32_PARAMETERS_data_HwAlloc_comprInfo + uncompressedKind: int +@c.record +class NVOS32_PARAMETERS_data_HwAlloc_comprInfo(c.Struct): + SIZE = 24 + compPageShift: int + compressedKind: int + compTagLineMin: int + compPageIndexLo: int + compPageIndexHi: int + compTagLineMultiplier: int +NVOS32_PARAMETERS_data_HwAlloc_comprInfo.register_fields([('compPageShift', NvU32, 0), ('compressedKind', NvU32, 4), ('compTagLineMin', NvU32, 8), ('compPageIndexLo', NvU32, 12), ('compPageIndexHi', NvU32, 16), ('compTagLineMultiplier', NvU32, 20)]) +NVOS32_PARAMETERS_data_HwAlloc.register_fields([('allocOwner', NvU32, 0), ('allochMemory', NvHandle, 4), ('flags', NvU32, 8), ('allocType', NvU32, 12), ('allocAttr', NvU32, 16), ('allocInputFlags', NvU32, 20), ('allocSize', NvU64, 24), ('allocHeight', NvU32, 32), ('allocWidth', NvU32, 36), ('allocPitch', NvU32, 40), ('allocMask', NvU32, 44), ('allocComprCovg', NvU32, 48), ('allocZcullCovg', NvU32, 52), ('bindResultFunc', NvP64, 56), ('pHandle', NvP64, 64), ('hResourceHandle', NvHandle, 72), ('retAttr', NvU32, 76), ('kind', NvU32, 80), ('osDeviceHandle', NvU64, 88), ('allocAttr2', NvU32, 96), ('retAttr2', NvU32, 100), ('allocAddr', NvU64, 104), ('comprInfo', NVOS32_PARAMETERS_data_HwAlloc_comprInfo, 112), ('uncompressedKind', NvU32, 136)]) +@c.record +class NVOS32_PARAMETERS_data_HwFree(c.Struct): + SIZE = 8 + hResourceHandle: int + flags: int +NVOS32_PARAMETERS_data_HwFree.register_fields([('hResourceHandle', NvHandle, 0), ('flags', NvU32, 4)]) +@c.record +class NVOS32_PARAMETERS_data_AllocOsDesc(c.Struct): + SIZE = 48 + hMemory: int + type: int + flags: int + attr: int + attr2: int + descriptor: ctypes.c_void_p + limit: int + descriptorType: int +NVOS32_PARAMETERS_data_AllocOsDesc.register_fields([('hMemory', NvHandle, 0), ('type', NvU32, 4), ('flags', NvU32, 8), ('attr', NvU32, 12), ('attr2', NvU32, 16), ('descriptor', NvP64, 24), ('limit', NvU64, 32), ('descriptorType', NvU32, 40)]) +NVOS32_PARAMETERS_data.register_fields([('AllocSize', NVOS32_PARAMETERS_data_AllocSize, 0), ('AllocTiledPitchHeight', NVOS32_PARAMETERS_data_AllocTiledPitchHeight, 0), ('Free', NVOS32_PARAMETERS_data_Free, 0), ('ReleaseCompr', NVOS32_PARAMETERS_data_ReleaseCompr, 0), ('ReacquireCompr', NVOS32_PARAMETERS_data_ReacquireCompr, 0), ('Info', NVOS32_PARAMETERS_data_Info, 0), ('AllocSizeRange', NVOS32_PARAMETERS_data_AllocSizeRange, 0), ('AllocHintAlignment', NVOS32_PARAMETERS_data_AllocHintAlignment, 0), ('HwAlloc', NVOS32_PARAMETERS_data_HwAlloc, 0), ('HwFree', NVOS32_PARAMETERS_data_HwFree, 0), ('AllocOsDesc', NVOS32_PARAMETERS_data_AllocOsDesc, 0)]) +NVOS32_PARAMETERS.register_fields([('hRoot', NvHandle, 0), ('hObjectParent', NvHandle, 4), ('function', NvU32, 8), ('hVASpace', NvHandle, 12), ('ivcHeapNumber', NvS16, 16), ('status', NvV32, 20), ('total', NvU64, 24), ('free', NvU64, 32), ('data', NVOS32_PARAMETERS_data, 40)]) +@c.record +class NV_CONTEXT_DMA_ALLOCATION_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + flags: int + hMemory: int + offset: int + limit: int +NV_CONTEXT_DMA_ALLOCATION_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('flags', NvV32, 4), ('hMemory', NvHandle, 8), ('offset', NvU64, 16), ('limit', NvU64, 24)]) +@c.record +class NV_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 128 + owner: int + type: int + flags: int + width: int + height: int + pitch: int + attr: int + attr2: int + format: int + comprCovg: int + zcullCovg: int + rangeLo: int + rangeHi: int + size: int + alignment: int + offset: int + limit: int + address: ctypes.c_void_p + ctagOffset: int + hVASpace: int + internalflags: int + tag: int + numaNode: int +NV_MEMORY_ALLOCATION_PARAMS.register_fields([('owner', NvU32, 0), ('type', NvU32, 4), ('flags', NvU32, 8), ('width', NvU32, 12), ('height', NvU32, 16), ('pitch', NvS32, 20), ('attr', NvU32, 24), ('attr2', NvU32, 28), ('format', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('rangeLo', NvU64, 48), ('rangeHi', NvU64, 56), ('size', NvU64, 64), ('alignment', NvU64, 72), ('offset', NvU64, 80), ('limit', NvU64, 88), ('address', NvP64, 96), ('ctagOffset', NvU32, 104), ('hVASpace', NvHandle, 108), ('internalflags', NvU32, 112), ('tag', NvU32, 116), ('numaNode', NvS32, 120)]) +@c.record +class NV_OS_DESC_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 40 + type: int + flags: int + attr: int + attr2: int + descriptor: ctypes.c_void_p + limit: int + descriptorType: int + tag: int +NV_OS_DESC_MEMORY_ALLOCATION_PARAMS.register_fields([('type', NvU32, 0), ('flags', NvU32, 4), ('attr', NvU32, 8), ('attr2', NvU32, 12), ('descriptor', NvP64, 16), ('limit', NvU64, 24), ('descriptorType', NvU32, 32), ('tag', NvU32, 36)]) +@c.record +class NV_USER_LOCAL_DESC_MEMORY_ALLOCATION_PARAMS(c.Struct): + SIZE = 32 + flags: int + physAddr: int + size: int + tag: int + bGuestAllocated: int +NV_USER_LOCAL_DESC_MEMORY_ALLOCATION_PARAMS.register_fields([('flags', NvU32, 0), ('physAddr', NvU64, 8), ('size', NvU64, 16), ('tag', NvU32, 24), ('bGuestAllocated', NvBool, 28)]) +@c.record +class NV_MEMORY_HW_RESOURCES_ALLOCATION_PARAMS(c.Struct): + SIZE = 120 + owner: int + flags: int + type: int + attr: int + attr2: int + height: int + width: int + pitch: int + alignment: int + comprCovg: int + zcullCovg: int + kind: int + bindResultFunc: ctypes.c_void_p + pHandle: ctypes.c_void_p + osDeviceHandle: int + size: int + allocAddr: int + compPageShift: int + compressedKind: int + compTagLineMin: int + compPageIndexLo: int + compPageIndexHi: int + compTagLineMultiplier: int + uncompressedKind: int + tag: int +NV_MEMORY_HW_RESOURCES_ALLOCATION_PARAMS.register_fields([('owner', NvU32, 0), ('flags', NvU32, 4), ('type', NvU32, 8), ('attr', NvU32, 12), ('attr2', NvU32, 16), ('height', NvU32, 20), ('width', NvU32, 24), ('pitch', NvU32, 28), ('alignment', NvU32, 32), ('comprCovg', NvU32, 36), ('zcullCovg', NvU32, 40), ('kind', NvU32, 44), ('bindResultFunc', NvP64, 48), ('pHandle', NvP64, 56), ('osDeviceHandle', NvU64, 64), ('size', NvU64, 72), ('allocAddr', NvU64, 80), ('compPageShift', NvU32, 88), ('compressedKind', NvU32, 92), ('compTagLineMin', NvU32, 96), ('compPageIndexLo', NvU32, 100), ('compPageIndexHi', NvU32, 104), ('compTagLineMultiplier', NvU32, 108), ('uncompressedKind', NvU32, 112), ('tag', NvU32, 116)]) +@c.record +class NVOS34_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + hMemory: int + pLinearAddress: ctypes.c_void_p + status: int + flags: int +NVOS34_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('pLinearAddress', NvP64, 16), ('status', NvU32, 24), ('flags', NvU32, 28)]) +@c.record +class NVOS38_PARAMETERS(c.Struct): + SIZE = 72 + hClient: int + hObject: int + AccessType: int + DevNodeLength: int + pDevNode: ctypes.c_void_p + ParmStrLength: int + pParmStr: ctypes.c_void_p + BinaryDataLength: int + pBinaryData: ctypes.c_void_p + Data: int + Entry: int + status: int +NVOS38_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('AccessType', NvV32, 8), ('DevNodeLength', NvV32, 12), ('pDevNode', NvP64, 16), ('ParmStrLength', NvV32, 24), ('pParmStr', NvP64, 32), ('BinaryDataLength', NvV32, 40), ('pBinaryData', NvP64, 48), ('Data', NvV32, 56), ('Entry', NvV32, 60), ('status', NvV32, 64)]) +@c.record +class NVOS39_PARAMETERS(c.Struct): + SIZE = 56 + hObjectParent: int + hSubDevice: int + hObjectNew: int + hClass: int + flags: int + selector: int + hMemory: int + offset: int + limit: int + status: int +NVOS39_PARAMETERS.register_fields([('hObjectParent', NvHandle, 0), ('hSubDevice', NvHandle, 4), ('hObjectNew', NvHandle, 8), ('hClass', NvV32, 12), ('flags', NvV32, 16), ('selector', NvU32, 20), ('hMemory', NvHandle, 24), ('offset', NvU64, 32), ('limit', NvU64, 40), ('status', NvV32, 48)]) +@c.record +class NvUnixEvent(c.Struct): + SIZE = 16 + hObject: int + NotifyIndex: int + info32: int + info16: int +NvUnixEvent.register_fields([('hObject', NvHandle, 0), ('NotifyIndex', NvV32, 4), ('info32', NvV32, 8), ('info16', NvU16, 12)]) +@c.record +class NVOS41_PARAMETERS(c.Struct): + SIZE = 16 + pEvent: ctypes.c_void_p + MoreEvents: int + status: int +NVOS41_PARAMETERS.register_fields([('pEvent', NvP64, 0), ('MoreEvents', NvV32, 8), ('status', NvV32, 12)]) +@c.record +class NVOS2C_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hDevice: int + offset: int + bar: int + bytes: int + write: int + data: int + status: int +NVOS2C_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('offset', NvU32, 8), ('bar', NvU32, 12), ('bytes', NvU32, 16), ('write', NvU32, 20), ('data', NvU32, 24), ('status', NvU32, 28)]) +@c.record +class NVOS46_PARAMETERS(c.Struct): + SIZE = 64 + hClient: int + hDevice: int + hDma: int + hMemory: int + offset: int + length: int + flags: int + flags2: int + kindOverride: int + dmaOffset: int + status: int +NVOS46_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hDma', NvHandle, 8), ('hMemory', NvHandle, 12), ('offset', NvU64, 16), ('length', NvU64, 24), ('flags', NvV32, 32), ('flags2', NvV32, 36), ('kindOverride', NvV32, 40), ('dmaOffset', NvU64, 48), ('status', NvV32, 56)]) +NV_MAP_MEMORY_DMA_PARAMETERS: TypeAlias = NVOS46_PARAMETERS +@c.record +class NVOS47_PARAMETERS(c.Struct): + SIZE = 48 + hClient: int + hDevice: int + hDma: int + hMemory: int + flags: int + dmaOffset: int + size: int + status: int +NVOS47_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hDma', NvHandle, 8), ('hMemory', NvHandle, 12), ('flags', NvV32, 16), ('dmaOffset', NvU64, 24), ('size', NvU64, 32), ('status', NvV32, 40)]) +NV_UNMAP_MEMORY_DMA_PARAMETERS: TypeAlias = NVOS47_PARAMETERS +@c.record +class NVOS49_PARAMETERS(c.Struct): + SIZE = 16 + hClient: int + hChannel: int + hCtxDma: int + status: int +NVOS49_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('hCtxDma', NvHandle, 8), ('status', NvV32, 12)]) +@c.record +class NVOS54_PARAMETERS(c.Struct): + SIZE = 32 + hClient: int + hObject: int + cmd: int + flags: int + params: ctypes.c_void_p + paramsSize: int + status: int +NVOS54_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvV32, 8), ('flags', NvU32, 12), ('params', NvP64, 16), ('paramsSize', NvU32, 24), ('status', NvV32, 28)]) +@c.record +class NVOS63_PARAMETERS(c.Struct): + SIZE = 20 + hClient: int + hObject: int + cmd: int + paramsSize: int + status: int +NVOS63_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('cmd', NvV32, 8), ('paramsSize', NvU32, 12), ('status', NvV32, 16)]) +@c.record +class NVOS55_PARAMETERS(c.Struct): + SIZE = 28 + hClient: int + hParent: int + hObject: int + hClientSrc: int + hObjectSrc: int + flags: int + status: int +NVOS55_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8), ('hClientSrc', NvHandle, 12), ('hObjectSrc', NvHandle, 16), ('flags', NvU32, 20), ('status', NvU32, 24)]) +@c.record +class NVOS56_PARAMETERS(c.Struct): + SIZE = 40 + hClient: int + hDevice: int + hMemory: int + pOldCpuAddress: ctypes.c_void_p + pNewCpuAddress: ctypes.c_void_p + status: int +NVOS56_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('pOldCpuAddress', NvP64, 16), ('pNewCpuAddress', NvP64, 24), ('status', NvV32, 32)]) +@c.record +class NVOS57_PARAMETERS(c.Struct): + SIZE = 24 + hClient: int + hObject: int + sharePolicy: struct_RS_SHARE_POLICY + status: int +@c.record +class struct_RS_SHARE_POLICY(c.Struct): + SIZE = 12 + target: int + accessMask: struct_RS_ACCESS_MASK + type: int + action: int +RS_SHARE_POLICY: TypeAlias = struct_RS_SHARE_POLICY +@c.record +class struct_RS_ACCESS_MASK(c.Struct): + SIZE = 4 + limbs: c.Array[ctypes.c_uint32, Literal[1]] +RS_ACCESS_MASK: TypeAlias = struct_RS_ACCESS_MASK +RsAccessLimb: TypeAlias = ctypes.c_uint32 +struct_RS_ACCESS_MASK.register_fields([('limbs', c.Array[RsAccessLimb, Literal[1]], 0)]) +struct_RS_SHARE_POLICY.register_fields([('target', NvU32, 0), ('accessMask', RS_ACCESS_MASK, 4), ('type', NvU16, 8), ('action', NvU8, 10)]) +NVOS57_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('sharePolicy', RS_SHARE_POLICY, 8), ('status', NvU32, 20)]) +NVPOWERSTATE_STAGE: TypeAlias = ctypes.c_uint32 +@c.record +class NVPOWERSTATE_FAILURE_ENGINE_TRANSITION(c.Struct): + SIZE = 24 + classId: int + cumulativeTimeus: int + engineMaxTimeus: int + engineMaxTimeClassId: int +NVPOWERSTATE_FAILURE_ENGINE_TRANSITION.register_fields([('classId', NvU32, 0), ('cumulativeTimeus', NvU64, 8), ('engineMaxTimeus', NvU32, 16), ('engineMaxTimeClassId', NvU32, 20)]) +@c.record +class NVPOWERSTATE_FAILURE_WAIT_FOR_GFW_BOOT_OK(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_WAIT_FOR_GFW_BOOT_OK.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_INIT_LIBOS_LOGGING_STRUCTURES(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_INIT_LIBOS_LOGGING_STRUCTURES.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GSP_PREPARE_FOR_BOOTSTRAP(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GSP_PREPARE_FOR_BOOTSTRAP.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GSP_BOOTSTRAP(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GSP_BOOTSTRAP.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_BOOT_GSP_RM_PROXY(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_BOOT_GSP_RM_PROXY.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_VBIOS_HANDLE_SECURE_BOOT(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_VBIOS_HANDLE_SECURE_BOOT.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_RESTORE_PCIE_CONFIG_REGISTERS(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_RESTORE_PCIE_CONFIG_REGISTERS.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GCX_BOOT_TIMER_CB_SCHEDULE(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GCX_BOOT_TIMER_CB_SCHEDULE.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_PMS_EXPECTED_CHECKPOINT_DONE(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_PMS_EXPECTED_CHECKPOINT_DONE.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_POLL_FOR_NVLINK_READY(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_POLL_FOR_NVLINK_READY.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_CE_STATE_PRE_LOAD(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_CE_STATE_PRE_LOAD.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_LOAD_PROXY_UCODE_EARLY_INIT(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_LOAD_PROXY_UCODE_EARLY_INIT.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_RESTORE_NON_WPR_REGION(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_RESTORE_NON_WPR_REGION.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_PMU_20_OS_BOOTSTRAP(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_PMU_20_OS_BOOTSTRAP.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_LOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_LOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_LOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_LOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_POST_LOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_POST_LOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_POST_LOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_POST_LOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_LOAD_PHYSICAL(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_LOAD_PHYSICAL.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GSP_PREPARE_SUSPEND_RESUME_DATA(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GSP_PREPARE_SUSPEND_RESUME_DATA.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_MC_POINTER_NULL(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_MC_POINTER_NULL.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_SAVE_PCIE_CONFIG_REGISTERS(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_SAVE_PCIE_CONFIG_REGISTERS.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_UNLOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_UNLOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_UNLOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_UNLOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_ENGINE(c.Struct): + SIZE = 24 + engineTransition: NVPOWERSTATE_FAILURE_ENGINE_TRANSITION +NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_ENGINE.register_fields([('engineTransition', NVPOWERSTATE_FAILURE_ENGINE_TRANSITION, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_UNKNOWN(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_UNKNOWN.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_GSP_UNLOAD_RM(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_GSP_UNLOAD_RM.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_MONITOR_STATE_0(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_MONITOR_STATE_0.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_MONITOR_STATE_1(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_MONITOR_STATE_1.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_MONITOR_STATE_HIBERNATE(c.Struct): + SIZE = 1 + rsvd: int +NVPOWERSTATE_FAILURE_MONITOR_STATE_HIBERNATE.register_fields([('rsvd', NvU8, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_SET_POWER_STATE_UNKNOWN(c.Struct): + SIZE = 4 + state: int +NVPOWERSTATE_FAILURE_SET_POWER_STATE_UNKNOWN.register_fields([('state', NvU32, 0)]) +@c.record +class NVPOWERSTATE_FAILURE_DATA(c.Struct): + SIZE = 24 + waitForGfwBootOk: NVPOWERSTATE_FAILURE_WAIT_FOR_GFW_BOOT_OK + initLibosLoggingStructures: NVPOWERSTATE_FAILURE_INIT_LIBOS_LOGGING_STRUCTURES + gspPrepareForBootstrap: NVPOWERSTATE_FAILURE_GSP_PREPARE_FOR_BOOTSTRAP + gspBootstrap: NVPOWERSTATE_FAILURE_GSP_BOOTSTRAP + bootGspRmProxy: NVPOWERSTATE_FAILURE_BOOT_GSP_RM_PROXY + vbiosHandleSecureBoot: NVPOWERSTATE_FAILURE_VBIOS_HANDLE_SECURE_BOOT + restorePcieConfigRegisters: NVPOWERSTATE_FAILURE_RESTORE_PCIE_CONFIG_REGISTERS + gcxBootTimerCbSchedule: NVPOWERSTATE_FAILURE_GCX_BOOT_TIMER_CB_SCHEDULE + powerManagementResumePreLoadPhysicalUnattached: NVPOWERSTATE_FAILURE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED + pmsExpectedCheckpointDone: NVPOWERSTATE_FAILURE_PMS_EXPECTED_CHECKPOINT_DONE + pollForNvlinkReady: NVPOWERSTATE_FAILURE_POLL_FOR_NVLINK_READY + ceStatePreLoad: NVPOWERSTATE_FAILURE_CE_STATE_PRE_LOAD + loadProxyUcodeEarlyInit: NVPOWERSTATE_FAILURE_LOAD_PROXY_UCODE_EARLY_INIT + restoreNonWprRegion: NVPOWERSTATE_FAILURE_RESTORE_NON_WPR_REGION + pmu20OsBootstrap: NVPOWERSTATE_FAILURE_PMU_20_OS_BOOTSTRAP + statePreLoadEngine: NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_ENGINE + statePreLoadUnknown: NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_UNKNOWN + stateLoadEngine: NVPOWERSTATE_FAILURE_STATE_LOAD_ENGINE + stateLoadUnknown: NVPOWERSTATE_FAILURE_STATE_LOAD_UNKNOWN + statePostLoadEngine: NVPOWERSTATE_FAILURE_STATE_POST_LOAD_ENGINE + statePostLoadUnknown: NVPOWERSTATE_FAILURE_STATE_POST_LOAD_UNKNOWN + stateLoadPhysical: NVPOWERSTATE_FAILURE_STATE_LOAD_PHYSICAL + gspPrepareSuspendResumeData: NVPOWERSTATE_FAILURE_GSP_PREPARE_SUSPEND_RESUME_DATA + mcPointerNull: NVPOWERSTATE_FAILURE_MC_POINTER_NULL + savePcieConfigRegisters: NVPOWERSTATE_FAILURE_SAVE_PCIE_CONFIG_REGISTERS + statePreUnloadEngine: NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_ENGINE + statePreUnloadUnknown: NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_UNKNOWN + stateUnloadEngine: NVPOWERSTATE_FAILURE_STATE_UNLOAD_ENGINE + stateUnloadUnknown: NVPOWERSTATE_FAILURE_STATE_UNLOAD_UNKNOWN + statePostUnloadEngine: NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_ENGINE + statePostUnloadUnknown: NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_UNKNOWN + gspUnloadRm: NVPOWERSTATE_FAILURE_GSP_UNLOAD_RM + monitorState0: NVPOWERSTATE_FAILURE_MONITOR_STATE_0 + monitorState1: NVPOWERSTATE_FAILURE_MONITOR_STATE_1 + monitorStateHibernate: NVPOWERSTATE_FAILURE_MONITOR_STATE_HIBERNATE + setPowerStateUnknown: NVPOWERSTATE_FAILURE_SET_POWER_STATE_UNKNOWN +NVPOWERSTATE_FAILURE_DATA.register_fields([('waitForGfwBootOk', NVPOWERSTATE_FAILURE_WAIT_FOR_GFW_BOOT_OK, 0), ('initLibosLoggingStructures', NVPOWERSTATE_FAILURE_INIT_LIBOS_LOGGING_STRUCTURES, 0), ('gspPrepareForBootstrap', NVPOWERSTATE_FAILURE_GSP_PREPARE_FOR_BOOTSTRAP, 0), ('gspBootstrap', NVPOWERSTATE_FAILURE_GSP_BOOTSTRAP, 0), ('bootGspRmProxy', NVPOWERSTATE_FAILURE_BOOT_GSP_RM_PROXY, 0), ('vbiosHandleSecureBoot', NVPOWERSTATE_FAILURE_VBIOS_HANDLE_SECURE_BOOT, 0), ('restorePcieConfigRegisters', NVPOWERSTATE_FAILURE_RESTORE_PCIE_CONFIG_REGISTERS, 0), ('gcxBootTimerCbSchedule', NVPOWERSTATE_FAILURE_GCX_BOOT_TIMER_CB_SCHEDULE, 0), ('powerManagementResumePreLoadPhysicalUnattached', NVPOWERSTATE_FAILURE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED, 0), ('pmsExpectedCheckpointDone', NVPOWERSTATE_FAILURE_PMS_EXPECTED_CHECKPOINT_DONE, 0), ('pollForNvlinkReady', NVPOWERSTATE_FAILURE_POLL_FOR_NVLINK_READY, 0), ('ceStatePreLoad', NVPOWERSTATE_FAILURE_CE_STATE_PRE_LOAD, 0), ('loadProxyUcodeEarlyInit', NVPOWERSTATE_FAILURE_LOAD_PROXY_UCODE_EARLY_INIT, 0), ('restoreNonWprRegion', NVPOWERSTATE_FAILURE_RESTORE_NON_WPR_REGION, 0), ('pmu20OsBootstrap', NVPOWERSTATE_FAILURE_PMU_20_OS_BOOTSTRAP, 0), ('statePreLoadEngine', NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_ENGINE, 0), ('statePreLoadUnknown', NVPOWERSTATE_FAILURE_STATE_PRE_LOAD_UNKNOWN, 0), ('stateLoadEngine', NVPOWERSTATE_FAILURE_STATE_LOAD_ENGINE, 0), ('stateLoadUnknown', NVPOWERSTATE_FAILURE_STATE_LOAD_UNKNOWN, 0), ('statePostLoadEngine', NVPOWERSTATE_FAILURE_STATE_POST_LOAD_ENGINE, 0), ('statePostLoadUnknown', NVPOWERSTATE_FAILURE_STATE_POST_LOAD_UNKNOWN, 0), ('stateLoadPhysical', NVPOWERSTATE_FAILURE_STATE_LOAD_PHYSICAL, 0), ('gspPrepareSuspendResumeData', NVPOWERSTATE_FAILURE_GSP_PREPARE_SUSPEND_RESUME_DATA, 0), ('mcPointerNull', NVPOWERSTATE_FAILURE_MC_POINTER_NULL, 0), ('savePcieConfigRegisters', NVPOWERSTATE_FAILURE_SAVE_PCIE_CONFIG_REGISTERS, 0), ('statePreUnloadEngine', NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_ENGINE, 0), ('statePreUnloadUnknown', NVPOWERSTATE_FAILURE_STATE_PRE_UNLOAD_UNKNOWN, 0), ('stateUnloadEngine', NVPOWERSTATE_FAILURE_STATE_UNLOAD_ENGINE, 0), ('stateUnloadUnknown', NVPOWERSTATE_FAILURE_STATE_UNLOAD_UNKNOWN, 0), ('statePostUnloadEngine', NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_ENGINE, 0), ('statePostUnloadUnknown', NVPOWERSTATE_FAILURE_STATE_POST_UNLOAD_UNKNOWN, 0), ('gspUnloadRm', NVPOWERSTATE_FAILURE_GSP_UNLOAD_RM, 0), ('monitorState0', NVPOWERSTATE_FAILURE_MONITOR_STATE_0, 0), ('monitorState1', NVPOWERSTATE_FAILURE_MONITOR_STATE_1, 0), ('monitorStateHibernate', NVPOWERSTATE_FAILURE_MONITOR_STATE_HIBERNATE, 0), ('setPowerStateUnknown', NVPOWERSTATE_FAILURE_SET_POWER_STATE_UNKNOWN, 0)]) +@c.record +class NVPOWERSTATE_FAILURE(c.Struct): + SIZE = 32 + stage: int + status: int + data: NVPOWERSTATE_FAILURE_DATA +NVPOWERSTATE_FAILURE.register_fields([('stage', NVPOWERSTATE_STAGE, 0), ('status', NV_STATUS, 4), ('data', NVPOWERSTATE_FAILURE_DATA, 8)]) +@c.record +class NVPOWERSTATE_PARAMETERS(c.Struct): + SIZE = 64 + deviceReference: int + head: int + state: int + forceMonitorState: int + bForcePerfBiosLevel: int + bIsD3HotTransition: int + bForcePowerStateFail: int + errorStatus: int + fastBootPowerState: int + bGC8Transition: int + bGC8InputRailCutOff: int + failure: NVPOWERSTATE_FAILURE +NVPOWERSTATE_PARAMETERS.register_fields([('deviceReference', NvU32, 0), ('head', NvU32, 4), ('state', NvU32, 8), ('forceMonitorState', NvU8, 12), ('bForcePerfBiosLevel', NvU8, 13), ('bIsD3HotTransition', NvU8, 14), ('bForcePowerStateFail', NvU8, 15), ('errorStatus', NvU32, 16), ('fastBootPowerState', NvU32, 20), ('bGC8Transition', NvU8, 24), ('bGC8InputRailCutOff', NvU8, 25), ('failure', NVPOWERSTATE_FAILURE, 32)]) +PNVPOWERSTATE_PARAMETERS: TypeAlias = c.POINTER[NVPOWERSTATE_PARAMETERS] +@c.record +class NV_GR_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 16 + version: int + flags: int + size: int + caps: int +NV_GR_ALLOCATION_PARAMETERS.register_fields([('version', NvU32, 0), ('flags', NvU32, 4), ('size', NvU32, 8), ('caps', NvU32, 12)]) +ChannelPBSize: dict[int, str] = {(PB_SIZE_4KB:=0): 'PB_SIZE_4KB', (PB_SIZE_8KB:=1): 'PB_SIZE_8KB', (PB_SIZE_16KB:=2): 'PB_SIZE_16KB', (PB_SIZE_32KB:=3): 'PB_SIZE_32KB', (PB_SIZE_64KB:=4): 'PB_SIZE_64KB'} +@c.record +class NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 40 + channelInstance: int + hObjectBuffer: int + hObjectNotify: int + offset: int + pControl: ctypes.c_void_p + flags: int + channelPBSize: int + subDeviceId: int +NV50VAIO_CHANNELDMA_ALLOCATION_PARAMETERS.register_fields([('channelInstance', NvV32, 0), ('hObjectBuffer', NvHandle, 4), ('hObjectNotify', NvHandle, 8), ('offset', NvU32, 12), ('pControl', NvP64, 16), ('flags', NvU32, 24), ('channelPBSize', ctypes.c_uint32, 28), ('subDeviceId', NvU32, 32)]) +@c.record +class NV50VAIO_CHANNELPIO_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 16 + channelInstance: int + hObjectNotify: int + pControl: ctypes.c_void_p +NV50VAIO_CHANNELPIO_ALLOCATION_PARAMETERS.register_fields([('channelInstance', NvV32, 0), ('hObjectNotify', NvHandle, 4), ('pControl', NvP64, 8)]) +@c.record +class NV_CHANNEL_GROUP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 20 + hObjectError: int + hObjectEccError: int + hVASpace: int + engineType: int + bIsCallingContextVgpuPlugin: int +NV_CHANNEL_GROUP_ALLOCATION_PARAMETERS.register_fields([('hObjectError', NvHandle, 0), ('hObjectEccError', NvHandle, 4), ('hVASpace', NvHandle, 8), ('engineType', NvU32, 12), ('bIsCallingContextVgpuPlugin', NvBool, 16)]) +@c.record +class NV_SWRUNLIST_ALLOCATION_PARAMS(c.Struct): + SIZE = 12 + engineId: int + maxTSGs: int + qosIntrEnableMask: int +NV_SWRUNLIST_ALLOCATION_PARAMS.register_fields([('engineId', NvU32, 0), ('maxTSGs', NvU32, 4), ('qosIntrEnableMask', NvU32, 8)]) +@c.record +class NV_ME_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + caps: int +NV_ME_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('caps', NvU32, 4)]) +@c.record +class NV_NVDEC_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_NVDEC_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_VP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 80 + size: int + caps: int + flags: int + altUcode: int + rawUcode: ctypes.c_void_p + rawUcodeSize: int + numSubClasses: int + numSubSets: int + subClasses: ctypes.c_void_p + prohibitMultipleInstances: int + pControl: ctypes.c_void_p + hMemoryCmdBuffer: int + offset: int +NV_VP_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('caps', NvU32, 4), ('flags', NvU32, 8), ('altUcode', NvU32, 12), ('rawUcode', NvP64, 16), ('rawUcodeSize', NvU32, 24), ('numSubClasses', NvU32, 28), ('numSubSets', NvU32, 32), ('subClasses', NvP64, 40), ('prohibitMultipleInstances', NvU32, 48), ('pControl', NvP64, 56), ('hMemoryCmdBuffer', NvHandle, 64), ('offset', NvU64, 72)]) +@c.record +class NV_PPP_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + prohibitMultipleInstances: int +NV_PPP_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4)]) +@c.record +class NV_NVENC_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_NVENC_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_SEC2_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 8 + size: int + prohibitMultipleInstances: int +NV_SEC2_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4)]) +@c.record +class NV_NVJPG_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_NVJPG_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NV_OFA_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + size: int + prohibitMultipleInstances: int + engineInstance: int +NV_OFA_ALLOCATION_PARAMETERS.register_fields([('size', NvU32, 0), ('prohibitMultipleInstances', NvU32, 4), ('engineInstance', NvU32, 8)]) +@c.record +class NVOS61_PARAMETERS(c.Struct): + SIZE = 56 + hClient: int + hDevice: int + hVblank: int + pProc: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p]] + LogicalHead: int + pParm1: ctypes.c_void_p + pParm2: ctypes.c_void_p + bAdd: int + status: int +OSVBLANKCALLBACKPROC: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_void_p]] +NVOS61_PARAMETERS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hVblank', NvHandle, 8), ('pProc', OSVBLANKCALLBACKPROC, 16), ('LogicalHead', NvV32, 24), ('pParm1', ctypes.c_void_p, 32), ('pParm2', ctypes.c_void_p, 40), ('bAdd', NvU32, 48), ('status', NvV32, 52)]) +@c.record +class NV_VASPACE_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 56 + index: int + flags: int + vaSize: int + vaStartInternal: int + vaLimitInternal: int + bigPageSize: int + vaBase: int + pasid: int +NV_VASPACE_ALLOCATION_PARAMETERS.register_fields([('index', NvU32, 0), ('flags', NvV32, 4), ('vaSize', NvU64, 8), ('vaStartInternal', NvU64, 16), ('vaLimitInternal', NvU64, 24), ('bigPageSize', NvU32, 32), ('vaBase', NvU64, 40), ('pasid', NvU32, 48)]) +@c.record +class NV_CTXSHARE_ALLOCATION_PARAMETERS(c.Struct): + SIZE = 12 + hVASpace: int + flags: int + subctxId: int +NV_CTXSHARE_ALLOCATION_PARAMETERS.register_fields([('hVASpace', NvHandle, 0), ('flags', NvU32, 4), ('subctxId', NvU32, 8)]) +@c.record +class NV_TIMEOUT_CONTROL_PARAMETERS(c.Struct): + SIZE = 12 + cmd: int + timeoutInMs: int + deviceInstance: int +NV_TIMEOUT_CONTROL_PARAMETERS.register_fields([('cmd', NvU32, 0), ('timeoutInMs', NvU32, 4), ('deviceInstance', NvU32, 8)]) +NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS_ADDR_SPACE: dict[int, str] = {(NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_DEFAULT:=0): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_DEFAULT', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_COH:=1): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_COH', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_NCOH:=2): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_NCOH', (NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_VID:=3): 'NV_VIDMEM_ACCESS_BIT_BUFFER_ADDR_SPACE_VID'} +@c.record +class NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS(c.Struct): + SIZE = 528 + bDirtyTracking: int + granularity: int + accessBitMask: c.Array[ctypes.c_uint64, Literal[64]] + noOfEntries: int + addrSpace: int +NV_VIDMEM_ACCESS_BIT_ALLOCATION_PARAMS.register_fields([('bDirtyTracking', NvBool, 0), ('granularity', NvU32, 4), ('accessBitMask', c.Array[NvU64, Literal[64]], 8), ('noOfEntries', NvU32, 520), ('addrSpace', ctypes.c_uint32, 524)]) +@c.record +class NV_HOPPER_USERMODE_A_PARAMS(c.Struct): + SIZE = 2 + bBar1Mapping: int + bPriv: int +NV_HOPPER_USERMODE_A_PARAMS.register_fields([('bBar1Mapping', NvBool, 0), ('bPriv', NvBool, 1)]) +@c.record +class struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS(c.Struct): + SIZE = 4 + workSubmitToken: int +struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS.register_fields([('workSubmitToken', NvU32, 0)]) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS: TypeAlias = struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS +@c.record +class struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS(c.Struct): + SIZE = 16 + bar2Addr: c.Array[ctypes.c_uint64, Literal[2]] +struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS.register_fields([('bar2Addr', c.Array[NvU64, Literal[2]], 0)]) +NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS: TypeAlias = struct_NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS +@c.record +class struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS(c.Struct): + SIZE = 4 + index: int +struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS.register_fields([('index', NvU32, 0)]) +NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS: TypeAlias = struct_NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS +NVC36F_CTRL_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS: TypeAlias = struct_NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS(c.Struct): + SIZE = 6 + cpuCapability: int + gpusCapability: int + environment: int + ccFeature: int + devToolsMode: int + multiGpuMode: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS.register_fields([('cpuCapability', NvU8, 0), ('gpusCapability', NvU8, 1), ('environment', NvU8, 2), ('ccFeature', NvU8, 3), ('devToolsMode', NvU8, 4), ('multiGpuMode', NvU8, 5)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS(c.Struct): + SIZE = 24 + hSubDevice: int + protectedMemSizeInKb: int + unprotectedMemSizeInKb: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('protectedMemSizeInKb', NvU64, 8), ('unprotectedMemSizeInKb', NvU64, 16)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS(c.Struct): + SIZE = 24 + hSubDevice: int + protectedMemSizeInKb: int + unprotectedMemSizeInKb: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('protectedMemSizeInKb', NvU64, 8), ('unprotectedMemSizeInKb', NvU64, 16)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 12 + hSubDevice: int + numSupportedSec2CCSecureChannels: int + numSupportedCeCCSecureChannels: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('numSupportedSec2CCSecureChannels', NvU32, 4), ('numSupportedCeCCSecureChannels', NvU32, 8)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS(c.Struct): + SIZE = 9228 + hSubDevice: int + certChain: c.Array[ctypes.c_ubyte, Literal[4096]] + certChainSize: int + attestationCertChain: c.Array[ctypes.c_ubyte, Literal[5120]] + attestationCertChainSize: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('certChain', c.Array[NvU8, Literal[4096]], 4), ('certChainSize', NvU32, 4100), ('attestationCertChain', c.Array[NvU8, Literal[5120]], 4104), ('attestationCertChainSize', NvU32, 9224)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS(c.Struct): + SIZE = 12336 + hSubDevice: int + nonce: c.Array[ctypes.c_ubyte, Literal[32]] + attestationReport: c.Array[ctypes.c_ubyte, Literal[8192]] + attestationReportSize: int + isCecAttestationReportPresent: int + cecAttestationReport: c.Array[ctypes.c_ubyte, Literal[4096]] + cecAttestationReportSize: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('nonce', c.Array[NvU8, Literal[32]], 4), ('attestationReport', c.Array[NvU8, Literal[8192]], 36), ('attestationReportSize', NvU32, 8228), ('isCecAttestationReportPresent', NvBool, 8232), ('cecAttestationReport', c.Array[NvU8, Literal[4096]], 8233), ('cecAttestationReportSize', NvU32, 12332)]) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 12 + hSubDevice: int + maxSec2Channels: int + maxCeChannels: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('maxSec2Channels', NvU32, 4), ('maxCeChannels', NvU32, 8)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS(c.Struct): + SIZE = 8 + hSubDevice: int + keyRotationState: int +struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('keyRotationState', NvU32, 4)]) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS: TypeAlias = struct_NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS +@c.record +class struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS(c.Struct): + SIZE = 3 + bEnable: int + bSkipSubmit: int + bSkipEnable: int +NVA06C_CTRL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS.register_fields([('bEnable', NvBool, 0), ('bSkipSubmit', NvBool, 1), ('bSkipEnable', NvBool, 2)]) +@c.record +class struct_NVA06F_CTRL_BIND_PARAMS(c.Struct): + SIZE = 4 + engineType: int +NVA06C_CTRL_BIND_PARAMS: TypeAlias = struct_NVA06F_CTRL_BIND_PARAMS +struct_NVA06F_CTRL_BIND_PARAMS.register_fields([('engineType', NvU32, 0)]) +@c.record +class struct_NVA06C_CTRL_TIMESLICE_PARAMS(c.Struct): + SIZE = 8 + timesliceUs: int +struct_NVA06C_CTRL_TIMESLICE_PARAMS.register_fields([('timesliceUs', NvU64, 0)]) +NVA06C_CTRL_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +NVA06C_CTRL_SET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +NVA06C_CTRL_GET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +@c.record +class struct_NVA06C_CTRL_PREEMPT_PARAMS(c.Struct): + SIZE = 8 + bWait: int + bManualTimeout: int + timeoutUs: int +struct_NVA06C_CTRL_PREEMPT_PARAMS.register_fields([('bWait', NvBool, 0), ('bManualTimeout', NvBool, 1), ('timeoutUs', NvU32, 4)]) +NVA06C_CTRL_PREEMPT_PARAMS: TypeAlias = struct_NVA06C_CTRL_PREEMPT_PARAMS +@c.record +class struct_NVA06C_CTRL_GET_INFO_PARAMS(c.Struct): + SIZE = 4 + tsgID: int +struct_NVA06C_CTRL_GET_INFO_PARAMS.register_fields([('tsgID', NvU32, 0)]) +NVA06C_CTRL_GET_INFO_PARAMS: TypeAlias = struct_NVA06C_CTRL_GET_INFO_PARAMS +@c.record +class struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS(c.Struct): + SIZE = 4 + tsgInterleaveLevel: int +struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS.register_fields([('tsgInterleaveLevel', NvU32, 0)]) +NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06C_CTRL_SET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06C_CTRL_GET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERLEAVE_LEVEL_PARAMS +enum_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE: dict[int, str] = {(NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_NONE:=0): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_NONE', (NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_64B:=1): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_64B', (NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_128B:=2): 'NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE_128B'} +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD(c.Struct): + SIZE = 4 + size: int +struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD.register_fields([('size', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_SIZE, 0)]) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD: TypeAlias = struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD +@c.record +class struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS(c.Struct): + SIZE = 8 + l1: struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD + t1: struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD +struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS.register_fields([('l1', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD, 0), ('t1', NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_FIELD, 4)]) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS: TypeAlias = struct_NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS +@c.record +class struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS(c.Struct): + SIZE = 88 + methodBufferMemdesc: c.Array[struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]] + bar2Addr: c.Array[ctypes.c_uint64, Literal[2]] + numValidEntries: int +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO(c.Struct): + SIZE = 32 + base: int + size: int + alignment: int + addressSpace: int + cpuCacheAttrib: int +NV2080_CTRL_INTERNAL_MEMDESC_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO +struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('alignment', NvU64, 16), ('addressSpace', NvU32, 24), ('cpuCacheAttrib', NvU32, 28)]) +struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS.register_fields([('methodBufferMemdesc', c.Array[NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], 0), ('bar2Addr', c.Array[NvU64, Literal[2]], 64), ('numValidEntries', NvU32, 80)]) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS: TypeAlias = struct_NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS +@c.record +class struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS(c.Struct): + SIZE = 1 + bRealtime: int +struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS.register_fields([('bRealtime', NvBool, 0)]) +NVA06C_CTRL_MAKE_REALTIME_PARAMS: TypeAlias = struct_NVA06C_CTRL_MAKE_REALTIME_PARAMS +NVA06C_CTRL_INTERNAL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +NVA06C_CTRL_INTERNAL_SET_TIMESLICE_PARAMS: TypeAlias = struct_NVA06C_CTRL_TIMESLICE_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS(c.Struct): + SIZE = 16 + hSubDevice: int + subDeviceId: int + pFmt: ctypes.c_void_p +struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pFmt', NvP64, 8)]) +NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS +@c.record +class struct_NV_CTRL_VASPACE_PAGE_LEVEL(c.Struct): + SIZE = 112 + pFmt: c.POINTER[struct_MMU_FMT_LEVEL] + levelFmt: struct_MMU_FMT_LEVEL + sublevelFmt: c.Array[struct_MMU_FMT_LEVEL, Literal[2]] + physAddress: int + aperture: int + size: int + entryIndex: int +@c.record +class struct_MMU_FMT_LEVEL(c.Struct): + SIZE = 24 + virtAddrBitLo: int + virtAddrBitHi: int + entrySize: int + bPageTable: int + numSubLevels: int + pageLevelIdTag: int + subLevels: c.POINTER[struct_MMU_FMT_LEVEL] +struct_MMU_FMT_LEVEL.register_fields([('virtAddrBitLo', NvU8, 0), ('virtAddrBitHi', NvU8, 1), ('entrySize', NvU8, 2), ('bPageTable', NvBool, 3), ('numSubLevels', NvU8, 4), ('pageLevelIdTag', NvU32, 8), ('subLevels', c.POINTER[struct_MMU_FMT_LEVEL], 16)]) +MMU_FMT_LEVEL: TypeAlias = struct_MMU_FMT_LEVEL +struct_NV_CTRL_VASPACE_PAGE_LEVEL.register_fields([('pFmt', c.POINTER[struct_MMU_FMT_LEVEL], 0), ('levelFmt', MMU_FMT_LEVEL, 8), ('sublevelFmt', c.Array[MMU_FMT_LEVEL, Literal[2]], 32), ('physAddress', NvU64, 80), ('aperture', NvU32, 88), ('size', NvU64, 96), ('entryIndex', NvU32, 104)]) +NV_CTRL_VASPACE_PAGE_LEVEL: TypeAlias = struct_NV_CTRL_VASPACE_PAGE_LEVEL +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS(c.Struct): + SIZE = 712 + hSubDevice: int + subDeviceId: int + virtAddress: int + pageSize: int + flags: int + numLevels: int + levels: c.Array[struct_NV_CTRL_VASPACE_PAGE_LEVEL, Literal[6]] +struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('virtAddress', NvU64, 8), ('pageSize', NvU64, 16), ('flags', NvU64, 24), ('numLevels', NvU32, 32), ('levels', c.Array[NV_CTRL_VASPACE_PAGE_LEVEL, Literal[6]], 40)]) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int +struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24)]) +NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS(c.Struct): + SIZE = 32 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int +struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24)]) +NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_VERIF_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS(c.Struct): + SIZE = 184 + hSubDevice: int + subDeviceId: int + pageSize: int + virtAddrLo: int + virtAddrHi: int + numLevelsToCopy: int + levels: c.Array[struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level, Literal[6]] +@c.record +class struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level(c.Struct): + SIZE = 24 + physAddress: int + size: int + aperture: int + pageShift: int +struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level.register_fields([('physAddress', NvU64, 0), ('size', NvU64, 8), ('aperture', NvU32, 16), ('pageShift', NvU8, 20)]) +struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('pageSize', NvU64, 8), ('virtAddrLo', NvU64, 16), ('virtAddrHi', NvU64, 24), ('numLevelsToCopy', NvU32, 32), ('levels', c.Array[struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level, Literal[6]], 40)]) +NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS(c.Struct): + SIZE = 16 + hSubDevice: int + subDeviceId: int + requiredVaRange: int +struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('requiredVaRange', NvU64, 8)]) +NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS +@c.record +class struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS(c.Struct): + SIZE = 56 + hSubDevice: int + subDeviceId: int + bytesFree: int + bytesTotal: int + largestFreeOffset: int + largestFreeSize: int + usableBytesFree: int + numFreeBlocks: int +struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS.register_fields([('hSubDevice', NvHandle, 0), ('subDeviceId', NvU32, 4), ('bytesFree', NvU64, 8), ('bytesTotal', NvU64, 16), ('largestFreeOffset', NvU64, 24), ('largestFreeSize', NvU64, 32), ('usableBytesFree', NvU64, 40), ('numFreeBlocks', NvU32, 48)]) +NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS: TypeAlias = struct_NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS +NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS: TypeAlias = struct_NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS +NVA06F_CTRL_BIND_PARAMS: TypeAlias = struct_NVA06F_CTRL_BIND_PARAMS +@c.record +class struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS(c.Struct): + SIZE = 1 + bNotifyEachChannelInTSG: int +struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS.register_fields([('bNotifyEachChannelInTSG', NvBool, 0)]) +NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS: TypeAlias = struct_NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS +@c.record +class struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS(c.Struct): + SIZE = 4 + channelInterleaveLevel: int +struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS.register_fields([('channelInterleaveLevel', NvU32, 0)]) +NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06F_CTRL_SET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +NVA06F_CTRL_GET_INTERLEAVE_LEVEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_INTERLEAVE_LEVEL_PARAMS +@c.record +class struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS(c.Struct): + SIZE = 2 + bForceRestart: int + bBypassWait: int +struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS.register_fields([('bForceRestart', NvBool, 0), ('bBypassWait', NvBool, 1)]) +NVA06F_CTRL_RESTART_RUNLIST_PARAMS: TypeAlias = struct_NVA06F_CTRL_RESTART_RUNLIST_PARAMS +@c.record +class struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS(c.Struct): + SIZE = 1 + bImmediate: int +struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS.register_fields([('bImmediate', NvBool, 0)]) +NVA06F_CTRL_STOP_CHANNEL_PARAMS: TypeAlias = struct_NVA06F_CTRL_STOP_CHANNEL_PARAMS +@c.record +class struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS(c.Struct): + SIZE = 4 + contextId: int +struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS.register_fields([('contextId', NvU32, 0)]) +NVA06F_CTRL_GET_CONTEXT_ID_PARAMS: TypeAlias = struct_NVA06F_CTRL_GET_CONTEXT_ID_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS(c.Struct): + SIZE = 12 + hObject: int + mapFlags: int + addrSpaceType: int +struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS.register_fields([('hObject', NvHandle, 0), ('mapFlags', NvU32, 4), ('addrSpaceType', NvU32, 8)]) +NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS(c.Struct): + SIZE = 16 + hObject: int + index: int + data: struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data +@c.record +class struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data(c.Struct): + SIZE = 8 + hResult: int + iResult: int +struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data.register_fields([('hResult', NvHandle, 0), ('iResult', NvU64, 0)]) +struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS.register_fields([('hObject', NvHandle, 0), ('index', NvU32, 4), ('data', struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_data, 8)]) +NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS(c.Struct): + SIZE = 12 + hObject: int + hClient: int + maskResult: struct_RS_ACCESS_MASK +struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS.register_fields([('hObject', NvHandle, 0), ('hClient', NvHandle, 4), ('maskResult', RS_ACCESS_MASK, 8)]) +NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS(c.Struct): + SIZE = 12 + sharePolicy: struct_RS_SHARE_POLICY +struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS.register_fields([('sharePolicy', RS_SHARE_POLICY, 0)]) +NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS(c.Struct): + SIZE = 12 + hParent: int + classId: int + hObject: int +struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS.register_fields([('hParent', NvHandle, 0), ('classId', NvU32, 4), ('hObject', NvHandle, 8)]) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS(c.Struct): + SIZE = 16 + hObject: int + sharePolicy: struct_RS_SHARE_POLICY +struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS.register_fields([('hObject', NvHandle, 0), ('sharePolicy', RS_SHARE_POLICY, 4)]) +NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS(c.Struct): + SIZE = 12 + hObject1: int + hObject2: int + bDuplicates: int +struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS.register_fields([('hObject1', NvHandle, 0), ('hObject2', NvHandle, 4), ('bDuplicates', NvBool, 8)]) +NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS +@c.record +class struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS(c.Struct): + SIZE = 16 + devDescriptor: int + channel: int +struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS.register_fields([('devDescriptor', NvU64, 0), ('channel', NvU32, 8)]) +NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS: TypeAlias = struct_NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS(c.Struct): + SIZE = 16 + state: int + count: int + missedCount: int + bCircularBuffer: int +struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS.register_fields([('state', NvU32, 0), ('count', NvU32, 4), ('missedCount', NvU32, 8), ('bCircularBuffer', NvBool, 12)]) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS(c.Struct): + SIZE = 8 + state: int + bCircularBuffer: int +struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS.register_fields([('state', NvU32, 0), ('bCircularBuffer', NvBool, 4)]) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY(c.Struct): + SIZE = 56 + counter: int + line: int + filename: c.Array[ctypes.c_ubyte, Literal[12]] + tag: int + cpuNum: int + irql: int + threadId: int + data0: int + data1: int + data2: int +struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY.register_fields([('counter', NvU64, 0), ('line', NvU32, 8), ('filename', c.Array[NvU8, Literal[12]], 12), ('tag', NvU16, 24), ('cpuNum', NvU8, 26), ('irql', NvU8, 27), ('threadId', NvU64, 32), ('data0', NvU32, 40), ('data1', NvU32, 44), ('data2', NvU32, 48)]) +NV0000_CTRL_DIAG_LOCK_METER_ENTRY: TypeAlias = struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY +@c.record +class struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS(c.Struct): + SIZE = 3592 + entryCount: int + entries: c.Array[struct_NV0000_CTRL_DIAG_LOCK_METER_ENTRY, Literal[64]] +struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS.register_fields([('entryCount', NvU32, 0), ('entries', c.Array[NV0000_CTRL_DIAG_LOCK_METER_ENTRY, Literal[64]], 8)]) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS +@c.record +class struct_RPC_METER_ENTRY(c.Struct): + SIZE = 32 + startTimeInNs: int + endTimeInNs: int + rpcDataTag: int + rpcExtraData: int +struct_RPC_METER_ENTRY.register_fields([('startTimeInNs', NvU64, 0), ('endTimeInNs', NvU64, 8), ('rpcDataTag', NvU64, 16), ('rpcExtraData', NvU64, 24)]) +RPC_METER_ENTRY: TypeAlias = struct_RPC_METER_ENTRY +@c.record +class struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS(c.Struct): + SIZE = 4 + rpcProfileCmd: int +struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS.register_fields([('rpcProfileCmd', NvU32, 0)]) +NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS +@c.record +class struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS(c.Struct): + SIZE = 3224 + firstEntryOffset: int + outputEntryCount: int + remainingEntryCount: int + elapsedTimeInNs: int + rpcProfilerBuffer: c.Array[struct_RPC_METER_ENTRY, Literal[100]] +struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS.register_fields([('firstEntryOffset', NvU32, 0), ('outputEntryCount', NvU32, 4), ('remainingEntryCount', NvU32, 8), ('elapsedTimeInNs', NvU64, 16), ('rpcProfilerBuffer', c.Array[RPC_METER_ENTRY, Literal[100]], 24)]) +NV0000_CTRL_DIAG_DUMP_RPC_PARAMS: TypeAlias = struct_NV0000_CTRL_DIAG_DUMP_RPC_PARAMS +@c.record +class struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS(c.Struct): + SIZE = 8 + event: int + action: int +struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS.register_fields([('event', NvU32, 0), ('action', NvU32, 4)]) +NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS: TypeAlias = struct_NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE(c.Struct): + SIZE = 4 + deviceMask: int +struct_NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE.register_fields([('deviceMask', NvU32, 0)]) +NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE: TypeAlias = struct_NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE +@c.record +class struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND: TypeAlias = struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND +@c.record +class struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND: TypeAlias = struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND +@c.record +class struct_NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND(c.Struct): + SIZE = 8 + gpuId: int + bBind: int +struct_NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND.register_fields([('gpuId', NvU32, 0), ('bBind', NvBool, 4)]) +NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND: TypeAlias = struct_NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND +@c.record +class struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS(c.Struct): + SIZE = 12 + event: int + data: struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_data +@c.record +class struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_data(c.Struct): + SIZE = 8 + display: struct_NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE + vgpuUnbind: struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND + vgpuBind: struct_NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND + gpuBindUnbind: struct_NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND +struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_data.register_fields([('display', NV0000_CTRL_SYSTEM_EVENT_DATA_DISPLAY_CHANGE, 0), ('vgpuUnbind', NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_UNBIND, 0), ('vgpuBind', NV0000_CTRL_SYSTEM_EVENT_DATA_VGPU_BIND, 0), ('gpuBindUnbind', NV0000_CTRL_SYSTEM_EVENT_DATA_GPU_BIND_UNBIND, 0)]) +struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS.register_fields([('event', NvU32, 0), ('data', struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_data, 4)]) +NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_MASK(c.Struct): + SIZE = 16 + lenMasks: int + masks: c.Array[ctypes.c_uint64, Literal[1]] +NV0000_CTRL_NVLINK_LINK_MASK: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_NVLINK_LINK_MASK.register_fields([('lenMasks', NvU8, 0), ('masks', c.Array[NvU64, Literal[1]], 8)]) +@c.record +class struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS(c.Struct): + SIZE = 128 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0)]) +NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS(c.Struct): + SIZE = 40 + gpuId: int + gpuFlags: int + deviceInstance: int + subDeviceInstance: int + szName: ctypes.c_void_p + sliStatus: int + boardId: int + gpuInstance: int + numaId: int +struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('gpuFlags', NvU32, 4), ('deviceInstance', NvU32, 8), ('subDeviceInstance', NvU32, 12), ('szName', NvP64, 16), ('sliStatus', NvU32, 24), ('boardId', NvU32, 28), ('gpuInstance', NvU32, 32), ('numaId', NvS32, 36)]) +NV0000_CTRL_GPU_GET_ID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS(c.Struct): + SIZE = 32 + gpuId: int + gpuFlags: int + deviceInstance: int + subDeviceInstance: int + sliStatus: int + boardId: int + gpuInstance: int + numaId: int +struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS.register_fields([('gpuId', NvU32, 0), ('gpuFlags', NvU32, 4), ('deviceInstance', NvU32, 8), ('subDeviceInstance', NvU32, 12), ('sliStatus', NvU32, 16), ('boardId', NvU32, 20), ('gpuInstance', NvU32, 24), ('numaId', NvS32, 28)]) +NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + status: int +struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS.register_fields([('gpuId', NvU32, 0), ('status', NvU32, 4)]) +NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS(c.Struct): + SIZE = 4 + deviceIds: int +struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS.register_fields([('deviceIds', NvU32, 0)]) +NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS(c.Struct): + SIZE = 384 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + excludedGpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuFlags: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('excludedGpuIds', c.Array[NvU32, Literal[32]], 128), ('gpuFlags', c.Array[NvU32, Literal[32]], 256)]) +NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + domain: int + bus: int + slot: int +struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('domain', NvU32, 4), ('bus', NvU16, 8), ('slot', NvU16, 10)]) +NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS(c.Struct): + SIZE = 132 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + failedId: int +struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('failedId', NvU32, 128)]) +NV0000_CTRL_GPU_ATTACH_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_ATTACH_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS(c.Struct): + SIZE = 128 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0)]) +NV0000_CTRL_GPU_DETACH_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DETACH_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_VIDEO_LINKS(c.Struct): + SIZE = 36 + gpuId: int + connectedGpuIds: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV0000_CTRL_GPU_VIDEO_LINKS.register_fields([('gpuId', NvU32, 0), ('connectedGpuIds', c.Array[NvU32, Literal[8]], 4)]) +NV0000_CTRL_GPU_VIDEO_LINKS: TypeAlias = struct_NV0000_CTRL_GPU_VIDEO_LINKS +@c.record +class struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS(c.Struct): + SIZE = 1152 + links: c.Array[struct_NV0000_CTRL_GPU_VIDEO_LINKS, Literal[32]] +struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS.register_fields([('links', c.Array[NV0000_CTRL_GPU_VIDEO_LINKS, Literal[32]], 0)]) +NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS(c.Struct): + SIZE = 272 + gpuUuid: c.Array[ctypes.c_ubyte, Literal[256]] + flags: int + gpuId: int + deviceInstance: int + subdeviceInstance: int +struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS.register_fields([('gpuUuid', c.Array[NvU8, Literal[256]], 0), ('flags', NvU32, 256), ('gpuId', NvU32, 260), ('deviceInstance', NvU32, 264), ('subdeviceInstance', NvU32, 268)]) +NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS(c.Struct): + SIZE = 268 + gpuId: int + flags: int + gpuUuid: c.Array[ctypes.c_ubyte, Literal[256]] + uuidStrLen: int +struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS.register_fields([('gpuId', NvU32, 0), ('flags', NvU32, 4), ('gpuUuid', c.Array[NvU8, Literal[256]], 8), ('uuidStrLen', NvU32, 264)]) +NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + newState: int + flags: int +struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('newState', NvU32, 4), ('flags', NvU32, 8)]) +NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + drainState: int + flags: int +struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('drainState', NvU32, 4), ('flags', NvU32, 8)]) +NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DISCOVER_PARAMS(c.Struct): + SIZE = 8 + domain: int + bus: int + slot: int + function: int +struct_NV0000_CTRL_GPU_DISCOVER_PARAMS.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('slot', NvU8, 5), ('function', NvU8, 6)]) +NV0000_CTRL_GPU_DISCOVER_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DISCOVER_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS(c.Struct): + SIZE = 4 + enableMask: int +struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS.register_fields([('enableMask', NvU32, 0)]) +NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS(c.Struct): + SIZE = 32 + gpuId: int + mask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + bSkipHwNvlinkDisable: int +struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS.register_fields([('gpuId', NvU32, 0), ('mask', NvU32, 4), ('links', NV0000_CTRL_NVLINK_LINK_MASK, 8), ('bSkipHwNvlinkDisable', NvBool, 24)]) +NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS(c.Struct): + SIZE = 48 + hDevice: int + hChannel: int + numChannels: int + phClients: ctypes.c_void_p + phDevices: ctypes.c_void_p + phChannels: ctypes.c_void_p + flags: int + timeout: int +struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS.register_fields([('hDevice', NvHandle, 0), ('hChannel', NvHandle, 4), ('numChannels', NvV32, 8), ('phClients', NvP64, 16), ('phDevices', NvP64, 24), ('phChannels', NvP64, 32), ('flags', NvV32, 40), ('timeout', NvV32, 44)]) +NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS(c.Struct): + SIZE = 24 + image: int + totalSize: int + pData: ctypes.c_void_p +struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS.register_fields([('image', NvU8, 0), ('totalSize', NvU64, 8), ('pData', NvP64, 16)]) +NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS(c.Struct): + SIZE = 2 + mode: int +struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS.register_fields([('mode', NvU16, 0)]) +NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS(c.Struct): + SIZE = 2 + mode: int + bwModeScope: int +struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS.register_fields([('mode', NvU8, 0), ('bwModeScope', NvU8, 1)]) +NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ACTIVE_DEVICE(c.Struct): + SIZE = 12 + gpuId: int + gpuInstanceId: int + computeInstanceId: int +struct_NV0000_CTRL_GPU_ACTIVE_DEVICE.register_fields([('gpuId', NvU32, 0), ('gpuInstanceId', NvU32, 4), ('computeInstanceId', NvU32, 8)]) +NV0000_CTRL_GPU_ACTIVE_DEVICE: TypeAlias = struct_NV0000_CTRL_GPU_ACTIVE_DEVICE +@c.record +class struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS(c.Struct): + SIZE = 3076 + numDevices: int + devices: c.Array[struct_NV0000_CTRL_GPU_ACTIVE_DEVICE, Literal[256]] +struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS.register_fields([('numDevices', NvU32, 0), ('devices', c.Array[NV0000_CTRL_GPU_ACTIVE_DEVICE, Literal[256]], 4)]) +NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_PCI_READ_WRITE_PARAMS(c.Struct): + SIZE = 16 + bWrite: int + pciDomain: int + pciBus: int + pciDevice: int + pciFunction: int + pciOffset: int + dataSize: int + data: int +struct_NV0000_CTRL_GPU_PCI_READ_WRITE_PARAMS.register_fields([('bWrite', NvBool, 0), ('pciDomain', NvU16, 2), ('pciBus', NvU8, 4), ('pciDevice', NvU8, 5), ('pciFunction', NvU8, 6), ('pciOffset', NvU8, 7), ('dataSize', NvU32, 8), ('data', NvU32, 12)]) +NV0000_CTRL_GPU_PCI_READ_WRITE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_PCI_READ_WRITE_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + pid: int + newState: int +struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('newState', NvU32, 8)]) +NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS(c.Struct): + SIZE = 12 + gpuId: int + pid: int + state: int +struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('state', NvU32, 8)]) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS(c.Struct): + SIZE = 48 + gpuId: int + pid: int + subPid: int + gpuUtil: int + fbUtil: int + maxFbUsage: int + startTime: int + endTime: int +struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('subPid', NvU32, 8), ('gpuUtil', NvU32, 12), ('fbUtil', NvU32, 16), ('maxFbUsage', NvU64, 24), ('startTime', NvU64, 32), ('endTime', NvU64, 40)]) +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS(c.Struct): + SIZE = 16012 + gpuId: int + pid: int + pidTbl: c.Array[ctypes.c_uint32, Literal[4000]] + pidCount: int +struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('pidTbl', c.Array[NvU32, Literal[4000]], 8), ('pidCount', NvU32, 16008)]) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + pid: int +struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4)]) +NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_V2_PARAMS(c.Struct): + SIZE = 64 + gpuId: int + pid: int + subPid: int + gpuUtil: int + fbUtil: int + sampleCount: int + maxFbUsage: int + startTime: int + endTime: int + sumGpuUtil: int + sumFbUtil: int +struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_V2_PARAMS.register_fields([('gpuId', NvU32, 0), ('pid', NvU32, 4), ('subPid', NvU32, 8), ('gpuUtil', NvU32, 12), ('fbUtil', NvU32, 16), ('sampleCount', NvU32, 20), ('maxFbUsage', NvU64, 24), ('startTime', NvU64, 32), ('endTime', NvU64, 40), ('sumGpuUtil', NvU64, 48), ('sumFbUtil', NvU64, 56)]) +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_V2_PARAMS +@c.record +class struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS(c.Struct): + SIZE = 16 + gsyncIds: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS.register_fields([('gsyncIds', c.Array[NvU32, Literal[4]], 0)]) +NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS: TypeAlias = struct_NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS +@c.record +class struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS(c.Struct): + SIZE = 12 + gsyncId: int + gsyncFlags: int + gsyncInstance: int +struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS.register_fields([('gsyncId', NvU32, 0), ('gsyncFlags', NvU32, 4), ('gsyncInstance', NvU32, 8)]) +NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS(c.Struct): + SIZE = 8 + component: int + size: int +struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS.register_fields([('component', NvU32, 0), ('size', NvU32, 4)]) +NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS(c.Struct): + SIZE = 16 + pBuffer: ctypes.c_void_p + component: int + size: int +struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS.register_fields([('pBuffer', NvP64, 0), ('component', NvU32, 8), ('size', NvU32, 12)]) +NV0000_CTRL_NVD_GET_DUMP_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DUMP_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS(c.Struct): + SIZE = 16 + timestamp: int + cpuClkId: int +struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS.register_fields([('timestamp', NvU64, 0), ('cpuClkId', NvU8, 8)]) +NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS(c.Struct): + SIZE = 15404 + component: int + version: int + runtimeSizes: c.Array[ctypes.c_ubyte, Literal[16]] + printFlags: int + signature: c.Array[ctypes.c_uint32, Literal[4]] + bufferTags: c.Array[ctypes.c_uint32, Literal[3840]] +struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS.register_fields([('component', NvU32, 0), ('version', NvU32, 4), ('runtimeSizes', c.Array[NvU8, Literal[16]], 8), ('printFlags', NvU32, 24), ('signature', c.Array[NvU32, Literal[4]], 28), ('bufferTags', c.Array[NvU32, Literal[3840]], 44)]) +NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 28 + component: int + buffer: int + tag: int + size: int + flags: int + pos: int + overflow: int +struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS.register_fields([('component', NvU32, 0), ('buffer', NvU32, 4), ('tag', NvU32, 8), ('size', NvU32, 12), ('flags', NvU32, 16), ('pos', NvU32, 20), ('overflow', NvU32, 24)]) +NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS(c.Struct): + SIZE = 4016 + component: int + buffer: int + blockNum: int + size: int + data: c.Array[ctypes.c_ubyte, Literal[4000]] +struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS.register_fields([('component', NvU32, 0), ('buffer', NvU32, 4), ('blockNum', NvU32, 8), ('size', NvU32, 12), ('data', c.Array[NvU8, Literal[4000]], 16)]) +NV0000_CTRL_NVD_GET_NVLOG_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_NVLOG_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY(c.Struct): + SIZE = 12 + tag: int + value: int + attribute: int +struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY.register_fields([('tag', NvU32, 0), ('value', NvU32, 4), ('attribute', NvU32, 8)]) +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY: TypeAlias = struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY +@c.record +class struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS(c.Struct): + SIZE = 2436 + reqIdx: int + rptIdx: int + GPUTag: int + rptTime: int + startIdx: int + endIdx: int + rptType: int + flags: int + rptCount: int + owner: int + processId: int + report: c.Array[struct_NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY, Literal[200]] +struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS.register_fields([('reqIdx', NvU16, 0), ('rptIdx', NvU16, 2), ('GPUTag', NvU32, 4), ('rptTime', NvU32, 8), ('startIdx', NvU16, 12), ('endIdx', NvU16, 14), ('rptType', NvU16, 16), ('flags', NvU32, 20), ('rptCount', NvU16, 24), ('owner', NvU32, 28), ('processId', NvU32, 32), ('report', c.Array[NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_ENTRY, Literal[200]], 36)]) +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS +@c.record +class struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS(c.Struct): + SIZE = 16 + tsBufferSize: int + pTSBuffer: ctypes.c_void_p +struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS.register_fields([('tsBufferSize', NvU32, 0), ('pTSBuffer', NvP64, 8)]) +NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS: TypeAlias = struct_NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS +@c.record +class struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS(c.Struct): + SIZE = 104 + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] +struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS.register_fields([('subProcessID', NvU32, 0), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 4)]) +NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS +@c.record +class struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS(c.Struct): + SIZE = 1 + bIsSubProcessDisabled: int +struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS.register_fields([('bIsSubProcessDisabled', NvBool, 0)]) +NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS: TypeAlias = struct_NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS(c.Struct): + SIZE = 1 + bEnabled: int +struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS.register_fields([('bEnabled', NvBool, 0)]) +NV0000_SYNC_GPU_BOOST_INFO_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_INFO_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG(c.Struct): + SIZE = 140 + gpuCount: int + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + boostGroupId: int + bBridgeless: int +struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG.register_fields([('gpuCount', NvU32, 0), ('gpuIds', c.Array[NvU32, Literal[32]], 4), ('boostGroupId', NvU32, 132), ('bBridgeless', NvBool, 136)]) +NV0000_SYNC_GPU_BOOST_GROUP_CONFIG: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS(c.Struct): + SIZE = 140 + boostConfig: struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG +struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS.register_fields([('boostConfig', NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, 0)]) +NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS(c.Struct): + SIZE = 4 + boostGroupId: int +struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS.register_fields([('boostGroupId', NvU32, 0)]) +NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS +@c.record +class struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS(c.Struct): + SIZE = 2244 + groupCount: int + pBoostGroups: c.Array[struct_NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, Literal[16]] +struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS.register_fields([('groupCount', NvU32, 0), ('pBoostGroups', c.Array[NV0000_SYNC_GPU_BOOST_GROUP_CONFIG, Literal[16]], 4)]) +NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS: TypeAlias = struct_NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS(c.Struct): + SIZE = 4 + featuresMask: int +struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS.register_fields([('featuresMask', NvU32, 0)]) +NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS(c.Struct): + SIZE = 40 + sizeOfStrings: int + pDriverVersionBuffer: ctypes.c_void_p + pVersionBuffer: ctypes.c_void_p + pTitleBuffer: ctypes.c_void_p + changelistNumber: int + officialChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS.register_fields([('sizeOfStrings', NvU32, 0), ('pDriverVersionBuffer', NvP64, 8), ('pVersionBuffer', NvP64, 16), ('pTitleBuffer', NvP64, 24), ('changelistNumber', NvU32, 32), ('officialChangelistNumber', NvU32, 36)]) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS +enum_NV0000_CTRL_SYSTEM_SH_SOC_TYPE: dict[int, str] = {(NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NA:=0): 'NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NA', (NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NV_GRACE:=1): 'NV0000_CTRL_SYSTEM_SH_SOC_TYPE_NV_GRACE'} +NV0000_CTRL_SYSTEM_SH_SOC_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS(c.Struct): + SIZE = 108 + type: int + capabilities: int + clock: int + L1DataCacheSize: int + L2DataCacheSize: int + dataCacheLineSize: int + numLogicalCpus: int + numPhysicalCpus: int + name: c.Array[ctypes.c_ubyte, Literal[52]] + family: int + model: int + stepping: int + coresOnDie: int + bCCEnabled: int + selfHostedSocType: int +struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS.register_fields([('type', NvU32, 0), ('capabilities', NvU32, 4), ('clock', NvU32, 8), ('L1DataCacheSize', NvU32, 12), ('L2DataCacheSize', NvU32, 16), ('dataCacheLineSize', NvU32, 20), ('numLogicalCpus', NvU32, 24), ('numPhysicalCpus', NvU32, 28), ('name', c.Array[NvU8, Literal[52]], 32), ('family', NvU32, 84), ('model', NvU32, 88), ('stepping', NvU8, 92), ('coresOnDie', NvU32, 96), ('bCCEnabled', NvBool, 100), ('selfHostedSocType', NV0000_CTRL_SYSTEM_SH_SOC_TYPE, 104)]) +NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS(c.Struct): + SIZE = 156 + vendorId: int + deviceId: int + subSysVendorId: int + subSysDeviceId: int + HBvendorId: int + HBdeviceId: int + HBsubSysVendorId: int + HBsubSysDeviceId: int + sliBondId: int + vendorNameString: c.Array[ctypes.c_ubyte, Literal[32]] + subSysVendorNameString: c.Array[ctypes.c_ubyte, Literal[32]] + chipsetNameString: c.Array[ctypes.c_ubyte, Literal[32]] + sliBondNameString: c.Array[ctypes.c_ubyte, Literal[32]] + flags: int + chipsetId: int +struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS.register_fields([('vendorId', NvU16, 0), ('deviceId', NvU16, 2), ('subSysVendorId', NvU16, 4), ('subSysDeviceId', NvU16, 6), ('HBvendorId', NvU16, 8), ('HBdeviceId', NvU16, 10), ('HBsubSysVendorId', NvU16, 12), ('HBsubSysDeviceId', NvU16, 14), ('sliBondId', NvU32, 16), ('vendorNameString', c.Array[NvU8, Literal[32]], 20), ('subSysVendorNameString', c.Array[NvU8, Literal[32]], 52), ('chipsetNameString', c.Array[NvU8, Literal[32]], 84), ('sliBondNameString', c.Array[NvU8, Literal[32]], 116), ('flags', NvU32, 148), ('chipsetId', NvU32, 152)]) +NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS(c.Struct): + SIZE = 1 + bIsPresent: int +struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS.register_fields([('bIsPresent', NvBool, 0)]) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS(c.Struct): + SIZE = 40 + waitApiLock: int + holdRoApiLock: int + holdRwApiLock: int + waitGpuLock: int + holdGpuLock: int +struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS.register_fields([('waitApiLock', NvU64, 0), ('holdRoApiLock', NvU64, 8), ('holdRwApiLock', NvU64, 16), ('waitGpuLock', NvU64, 24), ('holdGpuLock', NvU64, 32)]) +NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS(c.Struct): + SIZE = 132 + numClasses: int + classes: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS.register_fields([('numClasses', NvU32, 0), ('classes', c.Array[NvU32, Literal[32]], 4)]) +NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS(c.Struct): + SIZE = 12 + eventType: int + eventData: int + bEventDataForced: int +struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS.register_fields([('eventType', NvU32, 0), ('eventData', NvU32, 4), ('bEventDataForced', NvBool, 8)]) +NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS(c.Struct): + SIZE = 4 + systemType: int +struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS.register_fields([('systemType', NvU32, 0)]) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS(c.Struct): + SIZE = 520 + cmd: int + count: int + data: c.Array[ctypes.c_ubyte, Literal[512]] +struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('count', NvU32, 4), ('data', c.Array[NvU8, Literal[512]], 8)]) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS(c.Struct): + SIZE = 136 + cmdCount: int + succeeded: int + cmdData: c.Array[struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData, Literal[16]] +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS.register_fields([('cmdCount', NvU32, 0), ('succeeded', NvU32, 4), ('cmdData', c.Array[struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_cmdData, Literal[16]], 8)]) +NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 176 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuCount: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerIds: ctypes.c_void_p + busEgmPeerIds: ctypes.c_void_p +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('gpuCount', NvU32, 128), ('p2pCaps', NvU32, 132), ('p2pOptimalReadCEs', NvU32, 136), ('p2pOptimalWriteCEs', NvU32, 140), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 144), ('busPeerIds', NvP64, 160), ('busEgmPeerIds', NvP64, 168)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS(c.Struct): + SIZE = 8348 + gpuIds: c.Array[ctypes.c_uint32, Literal[32]] + gpuCount: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerIds: c.Array[ctypes.c_uint32, Literal[1024]] + busEgmPeerIds: c.Array[ctypes.c_uint32, Literal[1024]] +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS.register_fields([('gpuIds', c.Array[NvU32, Literal[32]], 0), ('gpuCount', NvU32, 128), ('p2pCaps', NvU32, 132), ('p2pOptimalReadCEs', NvU32, 136), ('p2pOptimalWriteCEs', NvU32, 140), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 144), ('busPeerIds', c.Array[NvU32, Literal[1024]], 156), ('busEgmPeerIds', c.Array[NvU32, Literal[1024]], 4252)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS(c.Struct): + SIZE = 1352 + grpACount: int + grpBCount: int + gpuIdGrpA: c.Array[ctypes.c_uint32, Literal[8]] + gpuIdGrpB: c.Array[ctypes.c_uint32, Literal[8]] + p2pCaps: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + a2bOptimalReadCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + a2bOptimalWriteCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + b2aOptimalReadCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] + b2aOptimalWriteCes: c.Array[c.Array[ctypes.c_uint32, Literal[8]], Literal[8]] +struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS.register_fields([('grpACount', NvU32, 0), ('grpBCount', NvU32, 4), ('gpuIdGrpA', c.Array[NvU32, Literal[8]], 8), ('gpuIdGrpB', c.Array[NvU32, Literal[8]], 40), ('p2pCaps', c.Array[c.Array[NvU32, Literal[8]], Literal[8]], 72), ('a2bOptimalReadCes', c.Array[c.Array[NvU32, Literal[8]], Literal[8]], 328), ('a2bOptimalWriteCes', c.Array[c.Array[NvU32, Literal[8]], Literal[8]], 584), ('b2aOptimalReadCes', c.Array[c.Array[NvU32, Literal[8]], Literal[8]], 840), ('b2aOptimalWriteCes', c.Array[c.Array[NvU32, Literal[8]], Literal[8]], 1096)]) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + input: c.Array[ctypes.c_int32, Literal[2]] + result: c.Array[ctypes.c_int32, Literal[4]] +struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('input', c.Array[NvS32, Literal[2]], 4), ('result', c.Array[NvS32, Literal[4]], 12)]) +NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS(c.Struct): + SIZE = 148 + objHndl: int + blockId: int + nextExpectedSampleTimems: int + countersReq: int + countersReturned: int + counterBlock: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS.register_fields([('objHndl', NvU32, 0), ('blockId', NvU32, 4), ('nextExpectedSampleTimems', NvU32, 8), ('countersReq', NvU32, 12), ('countersReturned', NvU32, 16), ('counterBlock', c.Array[NvU32, Literal[32]], 20)]) +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS(c.Struct): + SIZE = 1164 + cmd: int + input: int + resultSz: int + result: c.Array[ctypes.c_uint32, Literal[288]] +struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS.register_fields([('cmd', NvU32, 0), ('input', NvU32, 4), ('resultSz', NvU32, 8), ('result', c.Array[NvU32, Literal[288]], 12)]) +NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS(c.Struct): + SIZE = 40 + method: int + inData: ctypes.c_void_p + inDataSize: int + outStatus: int + outData: ctypes.c_void_p + outDataSize: int +struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS.register_fields([('method', NvU32, 0), ('inData', NvP64, 8), ('inDataSize', NvU16, 16), ('outStatus', NvU32, 20), ('outData', NvP64, 24), ('outDataSize', NvU16, 32)]) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS(c.Struct): + SIZE = 4 + moduleMask: int +struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS.register_fields([('moduleMask', NvU32, 0)]) +NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE(c.Struct): + SIZE = 8 + frameTime: int + renderTime: int + targetTime: int + sleepTime: int + sampleNumber: int +struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE.register_fields([('frameTime', NvU16, 0), ('renderTime', NvU16, 2), ('targetTime', NvU16, 4), ('sleepTime', NvU8, 6), ('sampleNumber', NvU8, 7)]) +NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS(c.Struct): + SIZE = 514 + samples: c.Array[struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, Literal[64]] + nextSampleNumber: int +struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS.register_fields([('samples', c.Array[NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, Literal[64]], 0), ('nextSampleNumber', NvU8, 512)]) +NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS(c.Struct): + SIZE = 8 + sampleData: struct_NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE +struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS.register_fields([('sampleData', NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE, 0)]) +NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS(c.Struct): + SIZE = 1288 + szHostDriverVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostTitleBuffer: c.Array[ctypes.c_char, Literal[256]] + szPluginTitleBuffer: c.Array[ctypes.c_char, Literal[256]] + szHostUnameBuffer: c.Array[ctypes.c_char, Literal[256]] + iHostChangelistNumber: int + iPluginChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS.register_fields([('szHostDriverVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 0), ('szHostVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 256), ('szHostTitleBuffer', c.Array[ctypes.c_char, Literal[256]], 512), ('szPluginTitleBuffer', c.Array[ctypes.c_char, Literal[256]], 768), ('szHostUnameBuffer', c.Array[ctypes.c_char, Literal[256]], 1024), ('iHostChangelistNumber', NvU32, 1280), ('iPluginChangelistNumber', NvU32, 1284)]) +NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS(c.Struct): + SIZE = 65 + gpuCount: int + gpuBus: c.Array[ctypes.c_ubyte, Literal[32]] + gpuExternalPowerStatus: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS.register_fields([('gpuCount', NvU8, 0), ('gpuBus', c.Array[NvU8, Literal[32]], 1), ('gpuExternalPowerStatus', c.Array[NvU8, Literal[32]], 33)]) +NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS(c.Struct): + SIZE = 1 + privStatusFlags: int +struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS.register_fields([('privStatusFlags', NvU8, 0)]) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS +enum_NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS: dict[int, str] = {(NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_SKIP:=1): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_SKIP', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_UNINITIALIZED:=2): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_UNINITIALIZED', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_IN_PROGRESS:=3): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_IN_PROGRESS', (NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_INITIALIZED:=4): 'NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS_INITIALIZED'} +NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS(c.Struct): + SIZE = 4 + fabricStatus: int +struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS.register_fields([('fabricStatus', NV0000_CTRL_GET_SYSTEM_FABRIC_STATUS, 0)]) +NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS(c.Struct): + SIZE = 16 + host_min_supported_version: int + host_max_supported_version: int + user_min_supported_version: int + user_max_supported_version: int +struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS.register_fields([('host_min_supported_version', NvU32, 0), ('host_max_supported_version', NvU32, 4), ('user_min_supported_version', NvU32, 8), ('user_max_supported_version', NvU32, 12)]) +NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS(c.Struct): + SIZE = 8 + min_version: int + max_version: int +struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS.register_fields([('min_version', NvU32, 0), ('max_version', NvU32, 4)]) +NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS(c.Struct): + SIZE = 8 + rm_instance_id: int +struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS.register_fields([('rm_instance_id', NvU64, 0)]) +NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT(c.Struct): + SIZE = 24 + batteryStateOfChargePercent: int + batteryCurrentLimitmA: int + restOfSytemReservedPowermW: int + minCpuTdpmW: int + maxCpuTdpmW: int + shortTimescaleBatteryCurrentLimitmA: int +struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT.register_fields([('batteryStateOfChargePercent', NvU8, 0), ('batteryCurrentLimitmA', NvU32, 4), ('restOfSytemReservedPowermW', NvU32, 8), ('minCpuTdpmW', NvU32, 12), ('maxCpuTdpmW', NvU32, 16), ('shortTimescaleBatteryCurrentLimitmA', NvU32, 20)]) +NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT +enum_QBOOST_CPU_TDP_CONTROL_TYPE: dict[int, str] = {(QBOOST_CPU_TDP_CONTROL_TYPE_DC_ONLY:=0): 'QBOOST_CPU_TDP_CONTROL_TYPE_DC_ONLY', (QBOOST_CPU_TDP_CONTROL_TYPE_DC_AC:=1): 'QBOOST_CPU_TDP_CONTROL_TYPE_DC_AC'} +QBOOST_CPU_TDP_CONTROL_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS(c.Struct): + SIZE = 884 + supportedFuncs: int + gpuId: int + tpp: int + ratedTgp: int + subFunc: int + ctgpOffsetmW: int + targetTppOffsetmW: int + maxOutputOffsetmW: int + minOutputOffsetmW: int + ctgpBattOffsetmW: int + targetTppBattOffsetmW: int + maxOutputBattOffsetmW: int + minOutputBattOffsetmW: int + dcRosReserveOverridemW: int + dcTspLongTimescaleLimitmA: int + dcTspLongTimescaleLimitOverridemA: int + dcTspShortTimescaleLimitmA: int + dcTspShortTimescaleLimitOverridemA: int + bEnableForAC: int + bEnableForDC: int + version: int + samplingPeriodmS: int + samplingMulti: int + filterType: int + filterParam: struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam + filterReserved: int + bIsBoostController: int + incRatio: int + decRatio: int + bSupportBatt: int + cpuType: int + gpuType: int + sysPwrIndex: int + sysPwrGetInfo: c.Array[struct_NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT, Literal[32]] + bIsTspSupported: int + sysPwrLimitsTableVersion: int + type: int + cpuTdpmw: int + cpuTdpControlType: int +@c.record +class struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam(c.Struct): + SIZE = 1 + weight: int + windowSize: int +struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam.register_fields([('weight', NvU8, 0), ('windowSize', NvU8, 0)]) +struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS.register_fields([('supportedFuncs', NvU32, 0), ('gpuId', NvU32, 4), ('tpp', NvU32, 8), ('ratedTgp', NvU32, 12), ('subFunc', NvU32, 16), ('ctgpOffsetmW', NvS32, 20), ('targetTppOffsetmW', NvS32, 24), ('maxOutputOffsetmW', NvS32, 28), ('minOutputOffsetmW', NvS32, 32), ('ctgpBattOffsetmW', NvS32, 36), ('targetTppBattOffsetmW', NvS32, 40), ('maxOutputBattOffsetmW', NvS32, 44), ('minOutputBattOffsetmW', NvS32, 48), ('dcRosReserveOverridemW', NvU32, 52), ('dcTspLongTimescaleLimitmA', NvU32, 56), ('dcTspLongTimescaleLimitOverridemA', NvU32, 60), ('dcTspShortTimescaleLimitmA', NvU32, 64), ('dcTspShortTimescaleLimitOverridemA', NvU32, 68), ('bEnableForAC', NvBool, 72), ('bEnableForDC', NvBool, 73), ('version', NvU8, 74), ('samplingPeriodmS', NvU16, 76), ('samplingMulti', NvU16, 78), ('filterType', NvU8, 80), ('filterParam', struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_filterParam, 81), ('filterReserved', NvU16, 82), ('bIsBoostController', NvBool, 84), ('incRatio', NvU16, 86), ('decRatio', NvU16, 88), ('bSupportBatt', NvBool, 90), ('cpuType', NvU8, 91), ('gpuType', NvU8, 92), ('sysPwrIndex', NvU32, 96), ('sysPwrGetInfo', c.Array[NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT, Literal[32]], 100), ('bIsTspSupported', NvBool, 868), ('sysPwrLimitsTableVersion', NvU8, 869), ('type', NvU32, 872), ('cpuTdpmw', NvU32, 876), ('cpuTdpControlType', QBOOST_CPU_TDP_CONTROL_TYPE, 880)]) +NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS(c.Struct): + SIZE = 1 + bExternalFabricMgmt: int +struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS.register_fields([('bExternalFabricMgmt', NvBool, 0)]) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS: TypeAlias = struct_NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS(c.Struct): + SIZE = 16 + clientCount: int + resourceCount: int +struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS.register_fields([('clientCount', NvU32, 0), ('resourceCount', NvU64, 8)]) +NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS(c.Struct): + SIZE = 1032 + driverVersionBuffer: c.Array[ctypes.c_char, Literal[256]] + versionBuffer: c.Array[ctypes.c_char, Literal[256]] + driverBranch: c.Array[ctypes.c_char, Literal[256]] + titleBuffer: c.Array[ctypes.c_char, Literal[256]] + changelistNumber: int + officialChangelistNumber: int +struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS.register_fields([('driverVersionBuffer', c.Array[ctypes.c_char, Literal[256]], 0), ('versionBuffer', c.Array[ctypes.c_char, Literal[256]], 256), ('driverBranch', c.Array[ctypes.c_char, Literal[256]], 512), ('titleBuffer', c.Array[ctypes.c_char, Literal[256]], 768), ('changelistNumber', NvU32, 1024), ('officialChangelistNumber', NvU32, 1028)]) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS(c.Struct): + SIZE = 8 + cmd: int + mode: int +struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('mode', NvU32, 4)]) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS(c.Struct): + SIZE = 136 + cmdCount: int + succeeded: int + cmdData: c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData, Literal[16]] +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData(c.Struct): + SIZE = 8 + command: int + locale: int + data: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData.register_fields([('command', NvU16, 0), ('locale', NvU16, 2), ('data', NvU32, 4)]) +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS.register_fields([('cmdCount', NvU32, 0), ('succeeded', NvU32, 4), ('cmdData', c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_cmdData, Literal[16]], 8)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + input: c.Array[ctypes.c_int32, Literal[2]] + result: c.Array[ctypes.c_int32, Literal[4]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS.register_fields([('cmd', NvU32, 0), ('input', c.Array[NvS32, Literal[2]], 4), ('result', c.Array[NvS32, Literal[4]], 12)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS(c.Struct): + SIZE = 148 + objHndl: int + blockId: int + nextExpectedSampleTimems: int + countersReq: int + countersReturned: int + counterBlock: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS.register_fields([('objHndl', NvU32, 0), ('blockId', NvU32, 4), ('nextExpectedSampleTimems', NvU32, 8), ('countersReq', NvU32, 12), ('countersReturned', NvU32, 16), ('counterBlock', c.Array[NvU32, Literal[32]], 20)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSOR_COUNTERS_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS(c.Struct): + SIZE = 1164 + cmd: int + input: int + resultSz: int + result: c.Array[ctypes.c_uint32, Literal[288]] +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS.register_fields([('cmd', NvU32, 0), ('input', NvU32, 4), ('resultSz', NvU32, 8), ('result', c.Array[NvU32, Literal[288]], 12)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE(c.Struct): + SIZE = 8 + frameTime: int + renderTime: int + targetTime: int + sleepTime: int + sampleNumber: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE.register_fields([('frameTime', NvU16, 0), ('renderTime', NvU16, 2), ('targetTime', NvU16, 4), ('sleepTime', NvU8, 6), ('sampleNumber', NvU8, 7)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS(c.Struct): + SIZE = 514 + samples: c.Array[struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, Literal[64]] + nextSampleNumber: int +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS.register_fields([('samples', c.Array[NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, Literal[64]], 0), ('nextSampleNumber', NvU8, 512)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS(c.Struct): + SIZE = 8 + sampleData: struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE +struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS.register_fields([('sampleData', NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE, 0)]) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_READ_CPER_PARAMS(c.Struct): + SIZE = 1056 + cperTypeMask: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] + cperCursor: int + buffer: c.Array[ctypes.c_ubyte, Literal[1024]] + bufferSize: int +struct_NV0000_CTRL_SYSTEM_READ_CPER_PARAMS.register_fields([('cperTypeMask', NvU64, 0), ('uuid', c.Array[NvU8, Literal[16]], 8), ('cperCursor', NvU32, 24), ('buffer', c.Array[NvU8, Literal[1024]], 28), ('bufferSize', NvU32, 1052)]) +NV0000_CTRL_SYSTEM_READ_CPER_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_READ_CPER_PARAMS +@c.record +class struct_NV0000_CTRL_SYSTEM_SOC_PERF_LIMIT(c.Struct): + SIZE = 12 + minLevelOrFreqKHz: int + maxLevelOrFreqKHz: int + clientUsageId: int + bwResource: int +struct_NV0000_CTRL_SYSTEM_SOC_PERF_LIMIT.register_fields([('minLevelOrFreqKHz', NvU32, 0), ('maxLevelOrFreqKHz', NvU32, 4), ('clientUsageId', NvU8, 8), ('bwResource', NvU8, 9)]) +NV0000_CTRL_SYSTEM_SOC_PERF_LIMIT: TypeAlias = struct_NV0000_CTRL_SYSTEM_SOC_PERF_LIMIT +@c.record +class struct_NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMITS_PARAMS(c.Struct): + SIZE = 200 + numLimits: int + limits: c.Array[struct_NV0000_CTRL_SYSTEM_SOC_PERF_LIMIT, Literal[16]] + bWaitForCompletion: int +struct_NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMITS_PARAMS.register_fields([('numLimits', NvU32, 0), ('limits', c.Array[NV0000_CTRL_SYSTEM_SOC_PERF_LIMIT, Literal[16]], 4), ('bWaitForCompletion', NvBool, 196)]) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMITS_PARAMS: TypeAlias = struct_NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMITS_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS(c.Struct): + SIZE = 40 + offset: int + length: int + cacheOps: int + hDevice: int + hObject: int + internalOnly: int +struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS.register_fields([('offset', NvU64, 0), ('length', NvU64, 8), ('cacheOps', NvU32, 16), ('hDevice', NvHandle, 20), ('hObject', NvHandle, 24), ('internalOnly', NvU64, 32)]) +NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS(c.Struct): + SIZE = 4 + fd: int +struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS.register_fields([('fd', NvS32, 0)]) +NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR_PARAMS +enum_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE: dict[int, str] = {(NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_NONE:=0): 'NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_NONE', (NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_RM:=1): 'NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE_RM'} +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT(c.Struct): + SIZE = 16 + type: int + data: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data(c.Struct): + SIZE = 12 + rmObject: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject(c.Struct): + SIZE = 12 + hDevice: int + hParent: int + hObject: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject.register_fields([('hDevice', NvHandle, 0), ('hParent', NvHandle, 4), ('hObject', NvHandle, 8)]) +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data.register_fields([('rmObject', struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data_rmObject, 0)]) +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT.register_fields([('type', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TYPE, 0), ('data', struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_data, 4)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS(c.Struct): + SIZE = 24 + object: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT + fd: int + flags: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS.register_fields([('object', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT, 0), ('fd', NvS32, 16), ('flags', NvU32, 20)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS(c.Struct): + SIZE = 20 + fd: int + object: struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECT +struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS.register_fields([('fd', NvS32, 0), ('object', NV0000_CTRL_OS_UNIX_EXPORT_OBJECT, 4)]) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS(c.Struct): + SIZE = 8 + gpuId: int + minorNum: int +struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS.register_fields([('gpuId', NvU32, 0), ('minorNum', NvU32, 4)]) +NV0000_CTRL_OS_GET_GPU_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_GET_GPU_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS(c.Struct): + SIZE = 80 + fd: int + deviceInstance: int + gpuInstanceId: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS.register_fields([('fd', NvS32, 0), ('deviceInstance', NvU32, 4), ('gpuInstanceId', NvU32, 8), ('maxObjects', NvU16, 12), ('metadata', c.Array[NvU8, Literal[64]], 14)]) +NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS(c.Struct): + SIZE = 76 + hDevice: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] + fd: int +struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS.register_fields([('hDevice', NvHandle, 0), ('maxObjects', NvU16, 4), ('metadata', c.Array[NvU8, Literal[64]], 6), ('fd', NvS32, 72)]) +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS(c.Struct): + SIZE = 2128 + fd: int + hDevice: int + maxObjects: int + metadata: c.Array[ctypes.c_ubyte, Literal[64]] + objects: c.Array[ctypes.c_uint32, Literal[512]] + numObjects: int + index: int +struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS.register_fields([('fd', NvS32, 0), ('hDevice', NvHandle, 4), ('maxObjects', NvU16, 8), ('metadata', c.Array[NvU8, Literal[64]], 10), ('objects', c.Array[NvHandle, Literal[512]], 76), ('numObjects', NvU16, 2124), ('index', NvU16, 2126)]) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS(c.Struct): + SIZE = 652 + fd: int + hParent: int + objects: c.Array[ctypes.c_uint32, Literal[128]] + objectTypes: c.Array[ctypes.c_ubyte, Literal[128]] + numObjects: int + index: int +struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS.register_fields([('fd', NvS32, 0), ('hParent', NvHandle, 4), ('objects', c.Array[NvHandle, Literal[128]], 8), ('objectTypes', c.Array[NvU8, Literal[128]], 520), ('numObjects', NvU16, 648), ('index', NvU16, 650)]) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_MEMACCT_SET_LIMITS_PARAMS(c.Struct): + SIZE = 24 + cgroupFd: int + gpuId: int + softLimit: int + hardLimit: int +struct_NV0000_CTRL_OS_UNIX_MEMACCT_SET_LIMITS_PARAMS.register_fields([('cgroupFd', NvS32, 0), ('gpuId', NvU32, 4), ('softLimit', NvU64, 8), ('hardLimit', NvU64, 16)]) +NV0000_CTRL_OS_UNIX_MEMACCT_SET_LIMITS_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_MEMACCT_SET_LIMITS_PARAMS +@c.record +class struct_NV0000_CTRL_OS_UNIX_MEMACCT_LIMITS(c.Struct): + SIZE = 32 + gpuId: int + soft: int + hard: int + current: int +struct_NV0000_CTRL_OS_UNIX_MEMACCT_LIMITS.register_fields([('gpuId', NvU32, 0), ('soft', NvU64, 8), ('hard', NvU64, 16), ('current', NvU64, 24)]) +NV0000_CTRL_OS_UNIX_MEMACCT_LIMITS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_MEMACCT_LIMITS +@c.record +class struct_NV0000_CTRL_OS_UNIX_MEMACCT_GET_LIMITS_PARAMS(c.Struct): + SIZE = 1032 + cgroupFd: int + count: int + limits: c.Array[struct_NV0000_CTRL_OS_UNIX_MEMACCT_LIMITS, Literal[32]] +struct_NV0000_CTRL_OS_UNIX_MEMACCT_GET_LIMITS_PARAMS.register_fields([('cgroupFd', NvS32, 0), ('count', NvU32, 4), ('limits', c.Array[NV0000_CTRL_OS_UNIX_MEMACCT_LIMITS, Literal[32]], 8)]) +NV0000_CTRL_OS_UNIX_MEMACCT_GET_LIMITS_PARAMS: TypeAlias = struct_NV0000_CTRL_OS_UNIX_MEMACCT_GET_LIMITS_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS(c.Struct): + SIZE = 40 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + gpuPciId: int + gpuPciBdf: int + vgpuTypeId: int + vgpuId: int + gpuInstanceId: int + placementId: int +struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('gpuPciId', NvU32, 16), ('gpuPciBdf', NvU32, 20), ('vgpuTypeId', NvU32, 24), ('vgpuId', NvU16, 28), ('gpuInstanceId', NvU32, 32), ('placementId', NvU32, 36)]) +NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS(c.Struct): + SIZE = 1036 + gpuPciId: int + gpuPciBdf: int + numVgpuTypes: int + vgpuTypeIds: c.Array[ctypes.c_uint32, Literal[128]] + availableInstances: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS.register_fields([('gpuPciId', NvU32, 0), ('gpuPciBdf', NvU32, 4), ('numVgpuTypes', NvU32, 8), ('vgpuTypeIds', c.Array[NvU32, Literal[128]], 12), ('availableInstances', c.Array[NvU32, Literal[128]], 524)]) +NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS(c.Struct): + SIZE = 18 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + vgpuId: int +struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('vgpuId', NvU16, 16)]) +NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS +@c.record +class struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS(c.Struct): + SIZE = 8 + returnStatus: int + gpuId: int +struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS.register_fields([('returnStatus', NvU32, 0), ('gpuId', NvU32, 4)]) +NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS: TypeAlias = struct_NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS +@c.record +class struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS(c.Struct): + SIZE = 24 + vgpuName: c.Array[ctypes.c_ubyte, Literal[16]] + mode: int + sysfs_val: int +struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS.register_fields([('vgpuName', c.Array[NvU8, Literal[16]], 0), ('mode', NvU32, 16), ('sysfs_val', NvU32, 20)]) +NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS: TypeAlias = struct_NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS +@c.record +class struct_NV0080_CTRL_BIF_RESET_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV0080_CTRL_BIF_RESET_PARAMS.register_fields([('flags', NvU32, 0)]) +NV0080_CTRL_BIF_RESET_PARAMS: TypeAlias = struct_NV0080_CTRL_BIF_RESET_PARAMS +@c.record +class struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS(c.Struct): + SIZE = 2 + bL0sEnable: int + bL1Enable: int +struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS.register_fields([('bL0sEnable', NvBool, 0), ('bL1Enable', NvBool, 1)]) +NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS: TypeAlias = struct_NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS(c.Struct): + SIZE = 12 + pciePowerControlMask: int + pciePowerControlIdentifiedKeyOrder: int + pciePowerControlIdentifiedKeyLocation: int +struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS.register_fields([('pciePowerControlMask', NvU32, 0), ('pciePowerControlIdentifiedKeyOrder', NvU32, 4), ('pciePowerControlIdentifiedKeyLocation', NvU32, 8)]) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK(c.Struct): + SIZE = 32 + pageSize: int + pteEntrySize: int + comptagLine: int + kind: int + pteFlags: int +struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK.register_fields([('pageSize', NvU64, 0), ('pteEntrySize', NvU64, 8), ('comptagLine', NvU32, 16), ('kind', NvU32, 20), ('pteFlags', NvU32, 24)]) +NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK: TypeAlias = struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK +@c.record +class struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS(c.Struct): + SIZE = 184 + gpuAddr: int + subDeviceId: int + skipVASpaceInit: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]] + hVASpace: int +struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('subDeviceId', NvU32, 8), ('skipVASpaceInit', NvU8, 12), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]], 16), ('hVASpace', NvHandle, 176)]) +NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS(c.Struct): + SIZE = 184 + gpuAddr: int + subDeviceId: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]] + hVASpace: int +struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('subDeviceId', NvU32, 8), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PTE_INFO_PTE_BLOCK, Literal[5]], 16), ('hVASpace', NvHandle, 176)]) +NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS(c.Struct): + SIZE = 104 + pageCount: int + hwResource: struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource + comprInfo: struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo + offset: int + gpuAddr: int + pageArray: ctypes.c_void_p + pteMem: ctypes.c_void_p + pteMemPfn: int + pageSize: int + startPageIndex: int + flags: int + hSrcVASpace: int + hTgtVASpace: int + peerId: int +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + hMemory: int + subDeviceId: int +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('hMemory', NvHandle, 8), ('subDeviceId', NvU32, 12)]) +@c.record +class struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo(c.Struct): + SIZE = 12 + fbKind: int + sysKind: int + compTagStartOffset: int +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo.register_fields([('fbKind', NvU32, 0), ('sysKind', NvU32, 4), ('compTagStartOffset', NvU32, 8)]) +struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS.register_fields([('pageCount', NvU32, 0), ('hwResource', struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_hwResource, 4), ('comprInfo', struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_comprInfo, 20), ('offset', NvU64, 32), ('gpuAddr', NvU64, 40), ('pageArray', NvP64, 48), ('pteMem', NvP64, 56), ('pteMemPfn', NvU32, 64), ('pageSize', NvU32, 68), ('startPageIndex', NvU32, 72), ('flags', NvU64, 80), ('hSrcVASpace', NvHandle, 88), ('hTgtVASpace', NvHandle, 92), ('peerId', NvU32, 96)]) +NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_FLUSH_PARAMS(c.Struct): + SIZE = 4 + targetUnit: int +struct_NV0080_CTRL_DMA_FLUSH_PARAMS.register_fields([('targetUnit', NvU32, 0)]) +NV0080_CTRL_DMA_FLUSH_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_FLUSH_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT(c.Struct): + SIZE = 8 + pageTableSize: int + pageTableCoverage: int +struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT.register_fields([('pageTableSize', NvU32, 0), ('pageTableCoverage', NvU32, 4)]) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT: TypeAlias = struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT +@c.record +class struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS(c.Struct): + SIZE = 192 + vaBitCount: int + pdeCoverageBitCount: int + num4KPageTableFormats: int + bigPageSize: int + compressionPageSize: int + dualPageTableSupported: int + idealVRAMPageSize: int + pageTableBigFormat: struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT + pageTable4KFormat: c.Array[struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, Literal[16]] + hVASpace: int + vaRangeLo: int + vaSpaceId: int + supportedPageSizeMask: int +struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS.register_fields([('vaBitCount', NvU32, 0), ('pdeCoverageBitCount', NvU32, 4), ('num4KPageTableFormats', NvU32, 8), ('bigPageSize', NvU32, 12), ('compressionPageSize', NvU32, 16), ('dualPageTableSupported', NvU32, 20), ('idealVRAMPageSize', NvU32, 24), ('pageTableBigFormat', NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, 28), ('pageTable4KFormat', c.Array[NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PAGE_TABLE_FORMAT, Literal[16]], 36), ('hVASpace', NvHandle, 164), ('vaRangeLo', NvU64, 168), ('vaSpaceId', NvU32, 176), ('supportedPageSizeMask', NvU64, 184)]) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK(c.Struct): + SIZE = 32 + ptePhysAddr: int + pteCacheAttrib: int + pteEntrySize: int + pageSize: int + pteAddrSpace: int + pdeVASpaceSize: int + pdeFlags: int +struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK.register_fields([('ptePhysAddr', NvU64, 0), ('pteCacheAttrib', NvU32, 8), ('pteEntrySize', NvU32, 12), ('pageSize', NvU32, 16), ('pteAddrSpace', NvU32, 20), ('pdeVASpaceSize', NvU32, 24), ('pdeFlags', NvU32, 28)]) +NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK: TypeAlias = struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK +@c.record +class struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS(c.Struct): + SIZE = 208 + gpuAddr: int + pdeVirtAddr: int + pdeEntrySize: int + pdeAddrSpace: int + pdeSize: int + subDeviceId: int + pteBlocks: c.Array[struct_NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK, Literal[5]] + pdbAddr: int + hVASpace: int +struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS.register_fields([('gpuAddr', NvU64, 0), ('pdeVirtAddr', NvU64, 8), ('pdeEntrySize', NvU32, 16), ('pdeAddrSpace', NvU32, 20), ('pdeSize', NvU32, 24), ('subDeviceId', NvU32, 28), ('pteBlocks', c.Array[NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCK, Literal[5]], 32), ('pdbAddr', NvU64, 192), ('hVASpace', NvHandle, 200)]) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS(c.Struct): + SIZE = 8 + hVASpace: int + flags: int +struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS.register_fields([('hVASpace', NvHandle, 0), ('flags', NvU32, 4)]) +NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS(c.Struct): + SIZE = 12 + capsTblSize: int + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', c.Array[NvU8, Literal[8]], 4)]) +NV0080_CTRL_DMA_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS(c.Struct): + SIZE = 16 + vaSpaceSize: int + hVASpace: int +struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS.register_fields([('vaSpaceSize', NvU64, 0), ('hVASpace', NvHandle, 8)]) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS(c.Struct): + SIZE = 16 + physAddr: int + numEntries: int + aperture: int +struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS.register_fields([('physAddr', NvU64, 0), ('numEntries', NvU32, 8), ('aperture', NvU32, 12)]) +NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS(c.Struct): + SIZE = 64 + pdeIndex: int + flags: int + ptParams: c.Array[struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS, Literal[2]] + hVASpace: int + pPdeBuffer: ctypes.c_void_p + subDeviceId: int +struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS.register_fields([('pdeIndex', NvU32, 0), ('flags', NvU32, 4), ('ptParams', c.Array[NV0080_CTRL_DMA_UPDATE_PDE_2_PAGE_TABLE_PARAMS, Literal[2]], 8), ('hVASpace', NvHandle, 40), ('pPdeBuffer', NvP64, 48), ('subDeviceId', NvU32, 56)]) +NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS(c.Struct): + SIZE = 4 + hVASpace: int +struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS.register_fields([('hVASpace', NvHandle, 0)]) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS(c.Struct): + SIZE = 32 + physAddress: int + numEntries: int + flags: int + hVASpace: int + chId: int + subDeviceId: int + pasid: int +struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS.register_fields([('physAddress', NvU64, 0), ('numEntries', NvU32, 8), ('flags', NvU32, 12), ('hVASpace', NvHandle, 16), ('chId', NvU32, 20), ('subDeviceId', NvU32, 24), ('pasid', NvU32, 28)]) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS +@c.record +class struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS(c.Struct): + SIZE = 8 + hVASpace: int + subDeviceId: int +struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS.register_fields([('hVASpace', NvHandle, 0), ('subDeviceId', NvU32, 4)]) +NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS: TypeAlias = struct_NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_FB_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_FB_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS(c.Struct): + SIZE = 80 + Size: int + Address: int + AddressSpace: int + MaxCompbitLine: int + comptagsPerCacheLine: int + cacheLineSize: int + cacheLineSizePerSlice: int + cacheLineFetchAlignment: int + backingStoreBase: int + gobsPerComptagPerSlice: int + backingStoreCbcBase: int + comptaglineAllocationPolicy: int + privRegionStartOffset: int + cbcCoveragePerSlice: int +struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS.register_fields([('Size', NvU64, 0), ('Address', NvU64, 8), ('AddressSpace', NvU32, 16), ('MaxCompbitLine', NvU32, 20), ('comptagsPerCacheLine', NvU32, 24), ('cacheLineSize', NvU32, 28), ('cacheLineSizePerSlice', NvU32, 32), ('cacheLineFetchAlignment', NvU32, 36), ('backingStoreBase', NvU64, 40), ('gobsPerComptagPerSlice', NvU32, 48), ('backingStoreCbcBase', NvU32, 52), ('comptaglineAllocationPolicy', NvU32, 56), ('privRegionStartOffset', NvU64, 64), ('cbcCoveragePerSlice', NvU32, 72)]) +NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS +@c.record +class struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 3 + capsTbl: c.Array[ctypes.c_ubyte, Literal[3]] +struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[3]], 0)]) +NV0080_CTRL_FB_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS.register_fields([('value', NvU32, 0)]) +NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS: TypeAlias = struct_NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS +enum_NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY: dict[int, str] = {(NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_DEFAULT:=0): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_DEFAULT', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_NONCONTIGUOUS:=1): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_NONCONTIGUOUS', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_CONTIGUOUS:=2): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_CONTIGUOUS', (NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_ALLOW_NONCONTIGUOUS:=3): 'NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY_ALLOW_NONCONTIGUOUS'} +NV0080_CTRL_FB_DEFAULT_VIDMEM_PHYSICALITY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_FIFO_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS(c.Struct): + SIZE = 12 + engineId: int + alignment: int + size: int +struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS.register_fields([('engineId', NvU32, 0), ('alignment', NvU32, 4), ('size', NvU32, 8)]) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS(c.Struct): + SIZE = 24 + numChannels: int + pChannelHandleList: ctypes.c_void_p + pChannelList: ctypes.c_void_p +struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS.register_fields([('numChannels', NvU32, 0), ('pChannelHandleList', NvP64, 8), ('pChannelList', NvP64, 16)]) +NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 12 + engineID: int + gpEntries: int + pbEntries: int +struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS.register_fields([('engineID', NvU32, 0), ('gpEntries', NvU32, 4), ('pbEntries', NvU32, 8)]) +NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + property: int + value: int +struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('property', NvU32, 4), ('value', NvU64, 8)]) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS(c.Struct): + SIZE = 4 + engineID: int +struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS.register_fields([('engineID', NvU32, 0)]) +NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS(c.Struct): + SIZE = 4 + engineID: int +struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS.register_fields([('engineID', NvU32, 0)]) +NV0080_CTRL_FIFO_START_RUNLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_START_RUNLIST_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 2 + capsTbl: c.Array[ctypes.c_ubyte, Literal[2]] +struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[2]], 0)]) +NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS(c.Struct): + SIZE = 16396 + numChannels: int + hChannels: c.Array[ctypes.c_uint32, Literal[4096]] + flags: int + timeout: int +struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS.register_fields([('numChannels', NvU32, 0), ('hChannels', c.Array[NvHandle, Literal[4096]], 4), ('flags', NvU32, 16388), ('timeout', NvU32, 16392)]) +NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS: TypeAlias = struct_NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS(c.Struct): + SIZE = 16 + numClasses: int + classList: ctypes.c_void_p +struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS.register_fields([('numClasses', NvU32, 0), ('classList', NvP64, 8)]) +NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS(c.Struct): + SIZE = 4 + numSubDevices: int +struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS.register_fields([('numSubDevices', NvU32, 0)]) +NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS(c.Struct): + SIZE = 36 + ConnectionCount: int + Order: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS.register_fields([('ConnectionCount', NvU32, 0), ('Order', c.Array[NvU32, Literal[8]], 4)]) +NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS(c.Struct): + SIZE = 4 + subDeviceInstance: int +struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS.register_fields([('subDeviceInstance', NvU32, 0)]) +NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS(c.Struct): + SIZE = 4 + subDeviceInstance: int +struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS.register_fields([('subDeviceInstance', NvU32, 0)]) +NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS(c.Struct): + SIZE = 4 + enable: int +struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS.register_fields([('enable', NvU32, 0)]) +NV0080_CTRL_GPU_SET_VIDLINK_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VIDLINK_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS(c.Struct): + SIZE = 4 + newState: int +struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS.register_fields([('newState', NvU32, 0)]) +NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS(c.Struct): + SIZE = 4 + swStatePersistence: int +struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS.register_fields([('swStatePersistence', NvU32, 0)]) +NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS(c.Struct): + SIZE = 8 + virtualizationMode: int + isGridBuild: int +struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS.register_fields([('virtualizationMode', NvU32, 0), ('isGridBuild', NvBool, 4)]) +NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS(c.Struct): + SIZE = 12 + defaultSetting: int + currentSetting: int + pendingSetting: int +struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS.register_fields([('defaultSetting', NvU32, 0), ('currentSetting', NvU32, 4), ('pendingSetting', NvU32, 8)]) +NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS(c.Struct): + SIZE = 4 + setting: int +struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS.register_fields([('setting', NvU32, 0)]) +NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS(c.Struct): + SIZE = 1 + isVgx: int +struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS.register_fields([('isVgx', NvBool, 0)]) +NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS(c.Struct): + SIZE = 80 + totalVFs: int + firstVfOffset: int + vfFeatureMask: int + FirstVFBar0Address: int + FirstVFBar1Address: int + FirstVFBar2Address: int + bar0Size: int + bar1Size: int + bar2Size: int + b64bitBar0: int + b64bitBar1: int + b64bitBar2: int + bSriovEnabled: int + bSriovHeavyEnabled: int + bEmulateVFBar0TlbInvalidationRegister: int + bClientRmAllocatedCtxBuffer: int + bNonPowerOf2ChannelCountSupported: int + bVfResizableBAR1Supported: int +struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS.register_fields([('totalVFs', NvU32, 0), ('firstVfOffset', NvU32, 4), ('vfFeatureMask', NvU32, 8), ('FirstVFBar0Address', NvU64, 16), ('FirstVFBar1Address', NvU64, 24), ('FirstVFBar2Address', NvU64, 32), ('bar0Size', NvU64, 40), ('bar1Size', NvU64, 48), ('bar2Size', NvU64, 56), ('b64bitBar0', NvBool, 64), ('b64bitBar1', NvBool, 65), ('b64bitBar2', NvBool, 66), ('bSriovEnabled', NvBool, 67), ('bSriovHeavyEnabled', NvBool, 68), ('bEmulateVFBar0TlbInvalidationRegister', NvBool, 69), ('bClientRmAllocatedCtxBuffer', NvBool, 70), ('bNonPowerOf2ChannelCountSupported', NvBool, 71), ('bVfResizableBAR1Supported', NvBool, 72)]) +NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS(c.Struct): + SIZE = 804 + numClasses: int + classList: c.Array[ctypes.c_uint32, Literal[200]] +struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS.register_fields([('numClasses', NvU32, 0), ('classList', c.Array[NvU32, Literal[200]], 4)]) +NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM(c.Struct): + SIZE = 8 + subDeviceInst: int + hSubDevice: int +struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM.register_fields([('subDeviceInst', NvU32, 0), ('hSubDevice', NvHandle, 4)]) +NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM: TypeAlias = struct_NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM +@c.record +class struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS(c.Struct): + SIZE = 4 + brands: int +struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS.register_fields([('brands', NvU32, 0)]) +NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS(c.Struct): + SIZE = 8 + vfBar1SizeMB: int + numVfs: int +struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS.register_fields([('vfBar1SizeMB', NvU32, 0), ('numVfs', NvU32, 4)]) +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 8 + bHeterogeneousMode: int + gpuInstanceId: int +struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0), ('gpuInstanceId', NvU32, 4)]) +NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 8 + bHeterogeneousMode: int + gpuInstanceId: int +struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0), ('gpuInstanceId', NvU32, 4)]) +NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GR_ROUTE_INFO(c.Struct): + SIZE = 16 + flags: int + route: int +struct_NV0080_CTRL_GR_ROUTE_INFO.register_fields([('flags', NvU32, 0), ('route', NvU64, 8)]) +NV0080_CTRL_GR_ROUTE_INFO: TypeAlias = struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV0080_CTRL_GR_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_GR_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_GR_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_PARAMS +@c.record +class struct_NVXXXX_CTRL_XXX_INFO(c.Struct): + SIZE = 8 + index: int + data: int +NV0080_CTRL_GR_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +struct_NVXXXX_CTRL_XXX_INFO.register_fields([('index', NvU32, 0), ('data', NvU32, 4)]) +@c.record +class struct_NV0080_CTRL_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + grInfoListSize: int + grInfoList: ctypes.c_void_p +struct_NV0080_CTRL_GR_GET_INFO_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', NvP64, 8)]) +NV0080_CTRL_GR_GET_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_PARAMS +enum_NV0080_CTRL_GR_TPC_PARTITION_MODE: dict[int, str] = {(NV0080_CTRL_GR_TPC_PARTITION_MODE_NONE:=0): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_NONE', (NV0080_CTRL_GR_TPC_PARTITION_MODE_STATIC:=1): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_STATIC', (NV0080_CTRL_GR_TPC_PARTITION_MODE_DYNAMIC:=2): 'NV0080_CTRL_GR_TPC_PARTITION_MODE_DYNAMIC'} +NV0080_CTRL_GR_TPC_PARTITION_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS(c.Struct): + SIZE = 32 + hChannelGroup: int + mode: int + bEnableAllTpcs: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS.register_fields([('hChannelGroup', NvHandle, 0), ('mode', NV0080_CTRL_GR_TPC_PARTITION_MODE, 4), ('bEnableAllTpcs', NvBool, 8), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 16)]) +NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +NV0080_CTRL_GR_GET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +NV0080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +@c.record +class struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 48 + capsTbl: c.Array[ctypes.c_ubyte, Literal[23]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + bCapsPopulated: int +struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[23]], 0), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 24), ('bCapsPopulated', NvBool, 40)]) +NV0080_CTRL_GR_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 528 + grInfoListSize: int + grInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[63]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', c.Array[NV0080_CTRL_GR_INFO, Literal[63]], 4), ('grRouteInfo', NV0080_CTRL_GR_ROUTE_INFO, 512)]) +NV0080_CTRL_GR_GET_INFO_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS +@c.record +class struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_HOST_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_HOST_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 3 + capsTbl: c.Array[ctypes.c_ubyte, Literal[3]] +struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[3]], 0)]) +NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS(c.Struct): + SIZE = 32 + params: struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS.register_fields([('params', NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS, 0)]) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS +@c.record +class struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS(c.Struct): + SIZE = 32 + params: struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS.register_fields([('params', NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS, 0)]) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS: TypeAlias = struct_NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS +@c.record +class struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS(c.Struct): + SIZE = 804 + numClients: int + clientHandles: c.Array[ctypes.c_uint32, Literal[200]] +struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS.register_fields([('numClients', NvU32, 0), ('clientHandles', c.Array[NvHandle, Literal[200]], 4)]) +NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS +@c.record +class struct_NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS(c.Struct): + SIZE = 1 + bZbcSurfacesExist: int +struct_NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS.register_fields([('bZbcSurfacesExist', NvBool, 0)]) +NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS +@c.record +class struct_NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS(c.Struct): + SIZE = 1 + bTeardown: int +struct_NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS.register_fields([('bTeardown', NvBool, 0)]) +NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS +NV0080_CTRL_INTERNAL_KGR_INIT_BUG4208224_WAR_PARAMS: TypeAlias = struct_NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS +@c.record +class struct_NV0080_CTRL_NVDEC_GET_CAPS_PARAMS(c.Struct): + SIZE = 24 + capsTblSize: int + capsTbl: ctypes.c_void_p + instanceId: int +struct_NV0080_CTRL_NVDEC_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8), ('instanceId', NvU32, 16)]) +NV0080_CTRL_NVDEC_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_NVDEC_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_NVDEC_GET_CAPS_PARAMS_V2(c.Struct): + SIZE = 12 + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] + instanceId: int +struct_NV0080_CTRL_NVDEC_GET_CAPS_PARAMS_V2.register_fields([('capsTbl', c.Array[NvU8, Literal[8]], 0), ('instanceId', NvU32, 8)]) +NV0080_CTRL_NVDEC_GET_CAPS_PARAMS_V2: TypeAlias = struct_NV0080_CTRL_NVDEC_GET_CAPS_PARAMS_V2 +@c.record +class struct_NV0080_CTRL_NVENC_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV0080_CTRL_NVENC_GET_CAPS_PARAMS.register_fields([('capsTblSize', NvU32, 0), ('capsTbl', NvP64, 8)]) +NV0080_CTRL_NVENC_GET_CAPS_PARAMS: TypeAlias = struct_NV0080_CTRL_NVENC_GET_CAPS_PARAMS +@c.record +class struct_NV0080_CTRL_NVENC_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 12 + capsTbl: c.Array[ctypes.c_ubyte, Literal[6]] + instanceId: int +struct_NV0080_CTRL_NVENC_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[6]], 0), ('instanceId', NvU32, 8)]) +NV0080_CTRL_NVENC_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_NVENC_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 16 + capsTbl: c.Array[ctypes.c_ubyte, Literal[9]] + instanceId: int +struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS.register_fields([('capsTbl', c.Array[NvU8, Literal[9]], 0), ('instanceId', NvU32, 12)]) +NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS +@c.record +class struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bActivate: int +struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS.register_fields([('bActivate', NvBool, 0)]) +NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS: TypeAlias = struct_NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS +@c.record +class struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bCudaLimit: int +struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS.register_fields([('bCudaLimit', NvBool, 0)]) +NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS: TypeAlias = struct_NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS +@c.record +class struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS(c.Struct): + SIZE = 4 + cmd: int +struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS.register_fields([('cmd', NvU32, 0)]) +NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS: TypeAlias = struct_NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS +@c.record +class struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS(c.Struct): + SIZE = 32 + subDeviceInstance: int + width: int + height: int + depth: int + pitch: int + baseAddress: int + size: int +struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS.register_fields([('subDeviceInstance', NvU32, 0), ('width', NvU16, 4), ('height', NvU16, 6), ('depth', NvU16, 8), ('pitch', NvU16, 10), ('baseAddress', NvU64, 16), ('size', NvU64, 24)]) +NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS: TypeAlias = struct_NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS +enum_NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG: dict[int, str] = {(NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_INVALID:=0): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_INVALID', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_DEVICE_CTRL_STATUS:=1): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_DEVICE_CTRL_STATUS', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_LINK_CTRL_STATUS:=2): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_LINK_CTRL_STATUS', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_DEVICE_CTRL_STATUS_2:=3): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_DEVICE_CTRL_STATUS_2', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_LINK_CAP:=4): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_LINK_CAP', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_L1_PM_SUBSTATES_CTRL1:=5): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_L1_PM_SUBSTATES_CTRL1', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_CHECK_FAILED_STATUS:=6): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_CHECK_FAILED_STATUS', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_MISROUTED_TLP_STATUS:=7): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_MISROUTED_TLP_STATUS', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_PCRC_CHECK_FAILED_STATUS:=8): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_PCRC_CHECK_FAILED_STATUS', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_CHECK_FAILED_MASK:=9): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_CHECK_FAILED_MASK', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_MISROUTED_TLP_MASK:=10): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_MISROUTED_TLP_MASK', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_PCRC_CHECK_FAILED_MASK:=11): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_PCRC_CHECK_FAILED_MASK', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_CHECK_FAILED_SEVERITY:=12): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_CHECK_FAILED_SEVERITY', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_MISROUTED_TLP_SEVERITY:=13): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_MISROUTED_TLP_SEVERITY', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_PCRC_CHECK_FAILED_SEVERITY:=14): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_PCRC_CHECK_FAILED_SEVERITY', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_TLP_ENCRYPTION_STATUS:=15): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_TLP_ENCRYPTION_STATUS', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_TYPE_LINK_STREAM_ENABLED:=16): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_TYPE_LINK_STREAM_ENABLED', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_TYPE_SELECTIVE_STREAM_ENABLED:=17): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_TYPE_SELECTIVE_STREAM_ENABLED', (NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_TYPE_FLOW_THROUGH_STREAM_ENABLED:=18): 'NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG_FN0_IDE_TYPE_FLOW_THROUGH_STREAM_ENABLED'} +NV2080_CTRL_BIF_PARAM_ID_CONFIG_REG: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_BIF_GET_DATA_PARAMS(c.Struct): + SIZE = 268 + featureId: int + paramId: c.Array[ctypes.c_uint32, Literal[32]] + paramVal: c.Array[ctypes.c_uint32, Literal[32]] + flags: int + paramSize: int +struct_NV2080_CTRL_BIF_GET_DATA_PARAMS.register_fields([('featureId', NvU32, 0), ('paramId', c.Array[NvU32, Literal[32]], 4), ('paramVal', c.Array[NvU32, Literal[32]], 132), ('flags', NvU32, 260), ('paramSize', NvU32, 264)]) +NV2080_CTRL_BIF_GET_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_BIF_GET_DATA_PARAMS +enum_NV2080_CTRL_BIF_FEATURE_ID: dict[int, str] = {(NV2080_CTRL_BIF_FEATURE_ID_INVALID:=0): 'NV2080_CTRL_BIF_FEATURE_ID_INVALID', (NV2080_CTRL_BIF_FEATURE_ID_CONFIG_REG:=1): 'NV2080_CTRL_BIF_FEATURE_ID_CONFIG_REG'} +NV2080_CTRL_BIF_FEATURE_ID: TypeAlias = ctypes.c_uint32 +NV2080_CTRL_BIOS_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + biosInfoListSize: int + biosInfoList: ctypes.c_void_p +struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS.register_fields([('biosInfoListSize', NvU32, 0), ('biosInfoList', NvP64, 8)]) +NV2080_CTRL_BIOS_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 124 + biosInfoListSize: int + biosInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[15]] +struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS.register_fields([('biosInfoListSize', NvU32, 0), ('biosInfoList', c.Array[NV2080_CTRL_BIOS_INFO, Literal[15]], 4)]) +NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_NBSI_REG_STRING(c.Struct): + SIZE = 520 + size: int + type: int + value: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value +@c.record +class struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value(c.Struct): + SIZE = 512 + ascii: c.Array[ctypes.c_ubyte, Literal[256]] + unicode: c.Array[ctypes.c_uint16, Literal[256]] + hash: int +struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value.register_fields([('ascii', c.Array[NvU8, Literal[256]], 0), ('unicode', c.Array[NvU16, Literal[256]], 0), ('hash', NvU16, 0)]) +struct_NV2080_CTRL_BIOS_NBSI_REG_STRING.register_fields([('size', NvU32, 0), ('type', NvU32, 4), ('value', struct_NV2080_CTRL_BIOS_NBSI_REG_STRING_value, 8)]) +NV2080_CTRL_BIOS_NBSI_REG_STRING: TypeAlias = struct_NV2080_CTRL_BIOS_NBSI_REG_STRING +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS(c.Struct): + SIZE = 1064 + module: int + path: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + valueName: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + retBuf: ctypes.c_void_p + retSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS.register_fields([('module', NvU32, 0), ('path', NV2080_CTRL_BIOS_NBSI_REG_STRING, 4), ('valueName', NV2080_CTRL_BIOS_NBSI_REG_STRING, 524), ('retBuf', NvP64, 1048), ('retSize', NvU32, 1056), ('errorCode', NvU32, 1060)]) +NV2080_CTRL_BIOS_GET_NBSI_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS(c.Struct): + SIZE = 1308 + module: int + path: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + valueName: struct_NV2080_CTRL_BIOS_NBSI_REG_STRING + retBuf: c.Array[ctypes.c_ubyte, Literal[256]] + retSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS.register_fields([('module', NvU32, 0), ('path', NV2080_CTRL_BIOS_NBSI_REG_STRING, 4), ('valueName', NV2080_CTRL_BIOS_NBSI_REG_STRING, 524), ('retBuf', c.Array[NvU8, Literal[256]], 1044), ('retSize', NvU32, 1300), ('errorCode', NvU32, 1304)]) +NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS(c.Struct): + SIZE = 40 + globType: int + globIndex: int + globSource: int + retBufOffset: int + retBuf: ctypes.c_void_p + retSize: int + totalObjSize: int + errorCode: int +struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS.register_fields([('globType', NvU16, 0), ('globIndex', NvU8, 2), ('globSource', NvU16, 4), ('retBufOffset', NvU32, 8), ('retBuf', NvP64, 16), ('retSize', NvU32, 24), ('totalObjSize', NvU32, 28), ('errorCode', NvU32, 32)]) +NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS(c.Struct): + SIZE = 48 + BoardID: int + chipSKU: c.Array[ctypes.c_char, Literal[9]] + chipSKUMod: c.Array[ctypes.c_char, Literal[5]] + skuConfigVersion: int + project: c.Array[ctypes.c_char, Literal[5]] + projectSKU: c.Array[ctypes.c_char, Literal[5]] + CDP: c.Array[ctypes.c_char, Literal[6]] + projectSKUMod: c.Array[ctypes.c_char, Literal[2]] + businessCycle: int +struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS.register_fields([('BoardID', NvU32, 0), ('chipSKU', c.Array[ctypes.c_char, Literal[9]], 4), ('chipSKUMod', c.Array[ctypes.c_char, Literal[5]], 13), ('skuConfigVersion', NvU32, 20), ('project', c.Array[ctypes.c_char, Literal[5]], 24), ('projectSKU', c.Array[ctypes.c_char, Literal[5]], 29), ('CDP', c.Array[ctypes.c_char, Literal[6]], 34), ('projectSKUMod', c.Array[ctypes.c_char, Literal[2]], 40), ('businessCycle', NvU32, 44)]) +NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS(c.Struct): + SIZE = 8 + vbiosPostTime: int +struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS.register_fields([('vbiosPostTime', NvU64, 0)]) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS +@c.record +class struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS(c.Struct): + SIZE = 8 + version: int + flags: int +struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS.register_fields([('version', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS +NvBoardObjIdx: TypeAlias = ctypes.c_uint16 +NvBoardObjMaskIdx: TypeAlias = ctypes.c_uint16 +NV2080_CTRL_BOARDOBJGRP_MASK_PRIMITIVE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK(c.Struct): + SIZE = 4 + pData: c.Array[ctypes.c_uint32, Literal[1]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK.register_fields([('pData', c.Array[NvU32, Literal[1]], 0)]) +NV2080_CTRL_BOARDOBJGRP_MASK: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK +PNV2080_CTRL_BOARDOBJGRP_MASK: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32(c.Struct): + SIZE = 4 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +PNV2080_CTRL_BOARDOBJGRP_MASK_E32: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255(c.Struct): + SIZE = 32 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE255: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE255', c.Array[NvU32, Literal[7]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +PNV2080_CTRL_BOARDOBJGRP_MASK_E255: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512(c.Struct): + SIZE = 64 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE512: c.Array[ctypes.c_uint32, Literal[15]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE512', c.Array[NvU32, Literal[15]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +PNV2080_CTRL_BOARDOBJGRP_MASK_E512: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024(c.Struct): + SIZE = 128 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE1024: c.Array[ctypes.c_uint32, Literal[31]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE1024', c.Array[NvU32, Literal[31]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +PNV2080_CTRL_BOARDOBJGRP_MASK_E1024: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048(c.Struct): + SIZE = 256 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE2048: c.Array[ctypes.c_uint32, Literal[63]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE2048', c.Array[NvU32, Literal[63]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +PNV2080_CTRL_BOARDOBJGRP_MASK_E2048: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048] +@c.record +class struct_NV2080_CTRL_BOARDOBJGRP_MASK_E8192(c.Struct): + SIZE = 1024 + super: struct_NV2080_CTRL_BOARDOBJGRP_MASK + pDataE8192: c.Array[ctypes.c_uint32, Literal[255]] +struct_NV2080_CTRL_BOARDOBJGRP_MASK_E8192.register_fields([('super', NV2080_CTRL_BOARDOBJGRP_MASK, 0), ('pDataE8192', c.Array[NvU32, Literal[255]], 4)]) +NV2080_CTRL_BOARDOBJGRP_MASK_E8192: TypeAlias = struct_NV2080_CTRL_BOARDOBJGRP_MASK_E8192 +PNV2080_CTRL_BOARDOBJGRP_MASK_E8192: TypeAlias = c.POINTER[struct_NV2080_CTRL_BOARDOBJGRP_MASK_E8192] +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO(c.Struct): + SIZE = 1 + type: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO.register_fields([('type', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS(c.Struct): + SIZE = 1 + type: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS.register_fields([('type', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL(c.Struct): + SIZE = 1 + type: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL.register_fields([('type', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS(c.Struct): + SIZE = 1 + type: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS.register_fields([('type', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJ_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO(c.Struct): + SIZE = 1 + classType: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO.register_fields([('classType', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_SUPER_ALIAS(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_SUPER_ALIAS.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_SUPER_ALIAS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_SUPER_ALIAS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS(c.Struct): + SIZE = 1 + classType: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS.register_fields([('classType', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_SUPER_ALIAS(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_SUPER_ALIAS.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_SUPER_ALIAS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_SUPER_ALIAS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL(c.Struct): + SIZE = 1 + classType: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL.register_fields([('classType', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_SUPER_ALIAS(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_SUPER_ALIAS.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_SUPER_ALIAS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_SUPER_ALIAS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS(c.Struct): + SIZE = 2 + classType: int + bInitialized: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS.register_fields([('classType', NvU8, 0), ('bInitialized', NvBool, 1)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_SUPER_ALIAS(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_SUPER_ALIAS.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_SUPER_ALIAS: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_SUPER_ALIAS +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E32(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E32.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E32, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E32 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E32(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E32.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E32, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E32 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E32(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E32.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E32, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E32 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E32(c.Struct): + SIZE = 8 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E32 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E32.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E32, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E32: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E32 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E255(c.Struct): + SIZE = 36 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E255.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E255, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E255 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E255(c.Struct): + SIZE = 36 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E255.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E255, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E255 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E255(c.Struct): + SIZE = 36 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E255.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E255, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E255 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E255(c.Struct): + SIZE = 36 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E255 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E255.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E255, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E255: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E255 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E512(c.Struct): + SIZE = 68 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E512.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E512, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E512 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E512(c.Struct): + SIZE = 68 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E512.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E512, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E512 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E512(c.Struct): + SIZE = 68 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E512.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E512, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E512 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E512(c.Struct): + SIZE = 68 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E512 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E512.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E512, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E512: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E512 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E1024(c.Struct): + SIZE = 132 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E1024, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E1024 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E1024(c.Struct): + SIZE = 132 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E1024, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E1024 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E1024(c.Struct): + SIZE = 132 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E1024, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E1024 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E1024(c.Struct): + SIZE = 132 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E1024 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E1024.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E1024, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E1024: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E1024 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E2048(c.Struct): + SIZE = 260 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E2048, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E2048 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E2048(c.Struct): + SIZE = 260 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E2048, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E2048 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E2048(c.Struct): + SIZE = 260 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E2048, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E2048 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E2048(c.Struct): + SIZE = 260 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E2048 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E2048.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E2048, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E2048: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E2048 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E8192(c.Struct): + SIZE = 1028 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E8192 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E8192.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E8192, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E8192: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_E8192 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E8192(c.Struct): + SIZE = 1028 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E8192 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E8192.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E8192, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E8192: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_E8192 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E8192(c.Struct): + SIZE = 1028 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E8192 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E8192.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E8192, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E8192: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_E8192 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E8192(c.Struct): + SIZE = 1028 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS + objMask: struct_NV2080_CTRL_BOARDOBJGRP_MASK_E8192 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E8192.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS, 0), ('objMask', NV2080_CTRL_BOARDOBJGRP_MASK_E8192, 4)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E8192: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_E8192 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_INFO_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_STATUS_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_CONTROL_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE(c.Struct): + SIZE = 1 + rsvd: int +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE.register_fields([('rsvd', NvU8, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_INTERFACE, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20 +@c.record +class struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X(c.Struct): + SIZE = 1 + super: struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20 +struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X.register_fields([('super', NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_20, 0)]) +NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X: TypeAlias = struct_NV2080_CTRL_BOARDOBJ_BOARDOBJGRP_CLIENT_READINGS_IFACE_MODEL_PMU_INIT_1X +@c.record +class struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS(c.Struct): + SIZE = 16 + pciDeviceId: int + pciSubSystemId: int + pciRevisionId: int + pciExtDeviceId: int +struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS.register_fields([('pciDeviceId', NvU32, 0), ('pciSubSystemId', NvU32, 4), ('pciRevisionId', NvU32, 8), ('pciExtDeviceId', NvU32, 12)]) +NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS +NV2080_CTRL_BUS_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_BUS_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + busInfoListSize: int + busInfoList: ctypes.c_void_p +struct_NV2080_CTRL_BUS_GET_INFO_PARAMS.register_fields([('busInfoListSize', NvU32, 0), ('busInfoList', NvP64, 8)]) +NV2080_CTRL_BUS_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 420 + busInfoListSize: int + busInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[52]] +struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS.register_fields([('busInfoListSize', NvU32, 0), ('busInfoList', c.Array[NV2080_CTRL_BUS_INFO, Literal[52]], 4)]) +NV2080_CTRL_BUS_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_PCI_BAR_INFO(c.Struct): + SIZE = 24 + flags: int + barSize: int + barSizeBytes: int + barOffset: int +struct_NV2080_CTRL_BUS_PCI_BAR_INFO.register_fields([('flags', NvU32, 0), ('barSize', NvU32, 4), ('barSizeBytes', NvU64, 8), ('barOffset', NvU64, 16)]) +NV2080_CTRL_BUS_PCI_BAR_INFO: TypeAlias = struct_NV2080_CTRL_BUS_PCI_BAR_INFO +@c.record +class struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS(c.Struct): + SIZE = 200 + pciBarCount: int + pciBarInfo: c.Array[struct_NV2080_CTRL_BUS_PCI_BAR_INFO, Literal[8]] +struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS.register_fields([('pciBarCount', NvU32, 0), ('pciBarInfo', c.Array[NV2080_CTRL_BUS_PCI_BAR_INFO, Literal[8]], 8)]) +NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS(c.Struct): + SIZE = 8 + pcieLinkWidth: int + failingReason: int +struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS.register_fields([('pcieLinkWidth', NvU32, 0), ('failingReason', NvU32, 4)]) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS(c.Struct): + SIZE = 4 + busSpeed: int +struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS.register_fields([('busSpeed', NvU32, 0)]) +NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_BUS_MAP_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_MAP_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS(c.Struct): + SIZE = 12 + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS.register_fields([('hMemory', NvHandle, 0), ('offset', NvU32, 4), ('size', NvU32, 8)]) +NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS(c.Struct): + SIZE = 8 + command: int + deviceState: int +struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS.register_fields([('command', NvU8, 0), ('deviceState', NvU32, 4)]) +NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 76 + pexCounterMask: int + pexTotalCorrectableErrors: int + pexCorrectableErrors: int + pexTotalNonFatalErrors: int + pexTotalFatalErrors: int + pexTotalUnsupportedReqs: int + pexCounters: c.Array[ctypes.c_uint16, Literal[31]] +struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('pexTotalCorrectableErrors', NvU32, 4), ('pexCorrectableErrors', NvU16, 8), ('pexTotalNonFatalErrors', NvU8, 10), ('pexTotalFatalErrors', NvU8, 11), ('pexTotalUnsupportedReqs', NvU8, 12), ('pexCounters', c.Array[NvU16, Literal[31]], 14)]) +NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + pexCounterMask: int +struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0)]) +NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS(c.Struct): + SIZE = 8 + pexCounterMask: int + bFreezeRmCounter: int +struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('bFreezeRmCounter', NvBool, 4)]) +NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS(c.Struct): + SIZE = 18 + pexLaneErrorStatus: int + pexLaneCounter: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS.register_fields([('pexLaneErrorStatus', NvU16, 0), ('pexLaneCounter', c.Array[NvU8, Literal[16]], 2)]) +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS(c.Struct): + SIZE = 12 + bPexLtrRegkeyOverride: int + bPexRootPortLtrSupported: int + bPexGpuLtrSupported: int + pexLtrSnoopLatencyValue: int + pexLtrSnoopLatencyScale: int + pexLtrNoSnoopLatencyValue: int + pexLtrNoSnoopLatencyScale: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS.register_fields([('bPexLtrRegkeyOverride', NvBool, 0), ('bPexRootPortLtrSupported', NvBool, 1), ('bPexGpuLtrSupported', NvBool, 2), ('pexLtrSnoopLatencyValue', NvU16, 4), ('pexLtrSnoopLatencyScale', NvU8, 6), ('pexLtrNoSnoopLatencyValue', NvU16, 8), ('pexLtrNoSnoopLatencyScale', NvU8, 10)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS(c.Struct): + SIZE = 8 + pexLtrSnoopLatencyValue: int + pexLtrSnoopLatencyScale: int + pexLtrNoSnoopLatencyValue: int + pexLtrNoSnoopLatencyScale: int +struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS.register_fields([('pexLtrSnoopLatencyValue', NvU16, 0), ('pexLtrSnoopLatencyScale', NvU8, 2), ('pexLtrNoSnoopLatencyValue', NvU16, 4), ('pexLtrNoSnoopLatencyScale', NvU8, 6)]) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS(c.Struct): + SIZE = 32 + pexCounterMask: int + pexCounters: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0), ('pexCounters', c.Array[NvU32, Literal[7]], 4)]) +NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS(c.Struct): + SIZE = 4 + pexCounterMask: int +struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS.register_fields([('pexCounterMask', NvU32, 0)]) +NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS(c.Struct): + SIZE = 128 + nvlinkPeerIdMask: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS.register_fields([('nvlinkPeerIdMask', c.Array[NvU32, Literal[32]], 0)]) +NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS(c.Struct): + SIZE = 3 + eomMode: int + eomNblks: int + eomNerrs: int +struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS.register_fields([('eomMode', NvU8, 0), ('eomNblks', NvU8, 1), ('eomNerrs', NvU8, 2)]) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS(c.Struct): + SIZE = 12 + regAddress: int + laneSelectMask: int + regValue: int +struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS.register_fields([('regAddress', NvU32, 0), ('laneSelectMask', NvU32, 4), ('regValue', NvU16, 8)]) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS(c.Struct): + SIZE = 76 + eomMode: int + eomNblks: int + eomNerrs: int + eomBerEyeSel: int + eomPamEyeSel: int + laneMask: int + eomStatus: c.Array[ctypes.c_uint16, Literal[32]] +struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS.register_fields([('eomMode', NvU8, 0), ('eomNblks', NvU8, 1), ('eomNerrs', NvU8, 2), ('eomBerEyeSel', NvU8, 3), ('eomPamEyeSel', NvU8, 4), ('laneMask', NvU32, 8), ('eomStatus', c.Array[NvU16, Literal[32]], 12)]) +NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS(c.Struct): + SIZE = 12 + capType: int + dbdf: int + atomicsCaps: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS.register_fields([('capType', NvU32, 0), ('dbdf', NvU32, 4), ('atomicsCaps', NvU32, 8)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO(c.Struct): + SIZE = 8 + bSupported: int + attributes: int +struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO.register_fields([('bSupported', NvBool, 0), ('attributes', NvU32, 4)]) +NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO: TypeAlias = struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS(c.Struct): + SIZE = 112 + capType: int + dbdf: int + atomicOp: c.Array[struct_NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO, Literal[13]] +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS.register_fields([('capType', NvU32, 0), ('dbdf', NvU32, 4), ('atomicOp', c.Array[NV2080_CTRL_BUS_PCIE_GPU_ATOMIC_OP_INFO, Literal[13]], 8)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS(c.Struct): + SIZE = 28 + bIsLinkUp: int + bLinkInHS: int + bEncryptionEnabled: int + nrLinks: int + maxNrLinks: int + linkMask: int + perLinkBwMBps: int + perLinkLaneWidth: int + remoteType: int +struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS.register_fields([('bIsLinkUp', NvBool, 0), ('bLinkInHS', NvBool, 1), ('bEncryptionEnabled', NvBool, 2), ('nrLinks', NvU32, 4), ('maxNrLinks', NvU32, 8), ('linkMask', NvU32, 12), ('perLinkBwMBps', NvU32, 16), ('perLinkLaneWidth', NvU32, 20), ('remoteType', NvU32, 24)]) +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS(c.Struct): + SIZE = 168 + errCnts: c.Array[struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_errCnt, Literal[14]] +@c.record +class struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_errCnt(c.Struct): + SIZE = 12 + nrCrcErrIntr: int + nrReplayErrIntr: int + nrReplayB2bErrIntr: int +struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_errCnt.register_fields([('nrCrcErrIntr', NvU32, 0), ('nrReplayErrIntr', NvU32, 4), ('nrReplayB2bErrIntr', NvU32, 8)]) +struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS.register_fields([('errCnts', c.Array[struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_errCnt, Literal[14]], 0)]) +NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS(c.Struct): + SIZE = 32 + connectionType: int + peerId: int + bEgmPeer: int + bSpaAccessOnly: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bEgmPeer', NvBool, 8), ('bSpaAccessOnly', NvBool, 9), ('bUseUuid', NvBool, 10), ('remoteGpuId', NvU32, 12), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 16)]) +NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS(c.Struct): + SIZE = 32 + connectionType: int + peerId: int + bUseUuid: int + remoteGpuId: int + remoteGpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS.register_fields([('connectionType', NvU32, 0), ('peerId', NvU32, 4), ('bUseUuid', NvBool, 8), ('remoteGpuId', NvU32, 12), ('remoteGpuUuid', c.Array[NvU8, Literal[16]], 16)]) +NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS(c.Struct): + SIZE = 4 + atomicsCaps: int +struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS.register_fields([('atomicsCaps', NvU32, 0)]) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS(c.Struct): + SIZE = 88 + c2cStateSupportMask: int + bCl3Support: int + cl3EntryCount: int + cl3ExitCount: int + cl3ResidentTimeUs: int + cl3AvgEntryLatencyUs: int + cl3AvgExitLatencyUs: int + cl3PstateSupportMask: int + cl3DisallowReasonMask: int + bCl4Support: int + cl4EntryCount: int + cl4ExitCount: int + cl4ResidentTimeUs: int + cl4AvgEntryLatencyUs: int + cl4AvgExitLatencyUs: int + cl4PstateSupportMask: int + cl4DisallowReasonMask: int + c2cLpwrStateAllowedMask: int + localPowerState: int + remotePowerState: int + cl3IdleThresholdUs: int + cl4IdleThresholdUs: int +struct_NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS.register_fields([('c2cStateSupportMask', NvU32, 0), ('bCl3Support', NvBool, 4), ('cl3EntryCount', NvU32, 8), ('cl3ExitCount', NvU32, 12), ('cl3ResidentTimeUs', NvU32, 16), ('cl3AvgEntryLatencyUs', NvU32, 20), ('cl3AvgExitLatencyUs', NvU32, 24), ('cl3PstateSupportMask', NvU32, 28), ('cl3DisallowReasonMask', NvU32, 32), ('bCl4Support', NvBool, 36), ('cl4EntryCount', NvU32, 40), ('cl4ExitCount', NvU32, 44), ('cl4ResidentTimeUs', NvU32, 48), ('cl4AvgEntryLatencyUs', NvU32, 52), ('cl4AvgExitLatencyUs', NvU32, 56), ('cl4PstateSupportMask', NvU32, 60), ('cl4DisallowReasonMask', NvU32, 64), ('c2cLpwrStateAllowedMask', NvU32, 68), ('localPowerState', NvU32, 72), ('remotePowerState', NvU32, 76), ('cl3IdleThresholdUs', NvU32, 80), ('cl4IdleThresholdUs', NvU32, 84)]) +NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS(c.Struct): + SIZE = 8 + c2cLpwrStateId: int + bAllowed: int +struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS.register_fields([('c2cLpwrStateId', NvU32, 0), ('bAllowed', NvBool, 4)]) +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_IDLE_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + c2cLpwrStateId: int + idleThresholdUs: int +struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_IDLE_THRESHOLD_PARAMS.register_fields([('c2cLpwrStateId', NvU32, 0), ('idleThresholdUs', NvU32, 4)]) +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_IDLE_THRESHOLD_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_IDLE_THRESHOLD_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_BUS_GET_C2C_PACKET_COUNTERS_PARAMS(c.Struct): + SIZE = 56 + packetCounters: c.Array[ctypes.c_uint32, Literal[14]] +struct_NV2080_CTRL_CMD_BUS_GET_C2C_PACKET_COUNTERS_PARAMS.register_fields([('packetCounters', c.Array[NvU32, Literal[14]], 0)]) +NV2080_CTRL_CMD_BUS_GET_C2C_PACKET_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_BUS_GET_C2C_PACKET_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CAPS_PARAMS(c.Struct): + SIZE = 16 + ceEngineType: int + capsTblSize: int + capsTbl: ctypes.c_void_p +struct_NV2080_CTRL_CE_GET_CAPS_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('capsTblSize', NvU32, 4), ('capsTbl', NvP64, 8)]) +NV2080_CTRL_CE_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS(c.Struct): + SIZE = 8 + ceEngineType: int + capsTbl: c.Array[ctypes.c_ubyte, Literal[2]] +struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('capsTbl', c.Array[NvU8, Literal[2]], 4)]) +NV2080_CTRL_CE_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS(c.Struct): + SIZE = 8 + ceEngineType: int + pceMask: int +struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('pceMask', NvU32, 4)]) +NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS(c.Struct): + SIZE = 276 + ceEngineType: int + pceLceMap: c.Array[ctypes.c_uint32, Literal[64]] + grceSharedLceMap: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('pceLceMap', c.Array[NvU32, Literal[64]], 4), ('grceSharedLceMap', c.Array[NvU32, Literal[4]], 260)]) +NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS(c.Struct): + SIZE = 280 + pceLceMap: c.Array[ctypes.c_uint32, Literal[64]] + grceConfig: c.Array[ctypes.c_uint32, Literal[4]] + exposeCeMask: int + bUpdateNvlinkPceLce: int +struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS.register_fields([('pceLceMap', c.Array[NvU32, Literal[64]], 0), ('grceConfig', c.Array[NvU32, Literal[4]], 256), ('exposeCeMask', NvU32, 272), ('bUpdateNvlinkPceLce', NvBool, 276)]) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS(c.Struct): + SIZE = 4 + stubbedCeMask: int +struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS.register_fields([('stubbedCeMask', NvU32, 0)]) +NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS +NV2080_CTRL_CE_GET_PHYSICAL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_CAPS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 4 + size: int +struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS.register_fields([('size', NvU32, 0)]) +NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS(c.Struct): + SIZE = 132 + hshubPceMasks: c.Array[ctypes.c_uint32, Literal[32]] + fbhubPceMask: int +struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS.register_fields([('hshubPceMasks', c.Array[NvU32, Literal[32]], 0), ('fbhubPceMask', NvU32, 128)]) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS(c.Struct): + SIZE = 136 + capsTbl: c.Array[c.Array[ctypes.c_ubyte, Literal[2]], Literal[64]] + present: int +struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS.register_fields([('capsTbl', c.Array[c.Array[NvU8, Literal[2]], Literal[64]], 0), ('present', NvU64, 128)]) +NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS +NV2080_CTRL_CE_GET_ALL_PHYSICAL_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS(c.Struct): + SIZE = 12 + ceEngineType: int + shimInstance: int + shimLocalLceIdx: int +struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS.register_fields([('ceEngineType', NvU32, 0), ('shimInstance', NvU32, 4), ('shimLocalLceIdx', NvU32, 8)]) +NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS(c.Struct): + SIZE = 284 + pceLceMap: c.Array[ctypes.c_uint32, Literal[64]] + grceConfig: c.Array[ctypes.c_uint32, Literal[4]] + exposeCeMask: int + bUpdateNvlinkPceLce: int + shimInstance: int +struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS.register_fields([('pceLceMap', c.Array[NvU32, Literal[64]], 0), ('grceConfig', c.Array[NvU32, Literal[4]], 256), ('exposeCeMask', NvU32, 272), ('bUpdateNvlinkPceLce', NvBool, 276), ('shimInstance', NvU32, 280)]) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS(c.Struct): + SIZE = 136 + connectingHubPceMasks: c.Array[ctypes.c_uint32, Literal[32]] + fbhubPceMask: int + shimInstance: int +struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS.register_fields([('connectingHubPceMasks', c.Array[NvU32, Literal[32]], 0), ('fbhubPceMask', NvU32, 128), ('shimInstance', NvU32, 132)]) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS +enum_NV2080_CTRL_CE_LCE_TYPE: dict[int, str] = {(NV2080_CTRL_CE_LCE_TYPE_PCIE:=1): 'NV2080_CTRL_CE_LCE_TYPE_PCIE', (NV2080_CTRL_CE_LCE_TYPE_DECOMP:=2): 'NV2080_CTRL_CE_LCE_TYPE_DECOMP', (NV2080_CTRL_CE_LCE_TYPE_SCRUB:=3): 'NV2080_CTRL_CE_LCE_TYPE_SCRUB', (NV2080_CTRL_CE_LCE_TYPE_NVLINK_PEER:=4): 'NV2080_CTRL_CE_LCE_TYPE_NVLINK_PEER', (NV2080_CTRL_CE_LCE_TYPE_C2C:=5): 'NV2080_CTRL_CE_LCE_TYPE_C2C', (NV2080_CTRL_CE_LCE_TYPE_PCIE_RD:=6): 'NV2080_CTRL_CE_LCE_TYPE_PCIE_RD', (NV2080_CTRL_CE_LCE_TYPE_PCIE_WR:=7): 'NV2080_CTRL_CE_LCE_TYPE_PCIE_WR', (NV2080_CTRL_CE_LCE_TYPE_C2C_H2D:=8): 'NV2080_CTRL_CE_LCE_TYPE_C2C_H2D', (NV2080_CTRL_CE_LCE_TYPE_C2C_D2H:=9): 'NV2080_CTRL_CE_LCE_TYPE_C2C_D2H', (NV2080_CTRL_CE_LCE_TYPE_CC_WORK_SUBMIT:=10): 'NV2080_CTRL_CE_LCE_TYPE_CC_WORK_SUBMIT'} +NV2080_CTRL_CE_LCE_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_CE_SHIM_PREFERENCE: dict[int, str] = {(NV2080_CTRL_CE_SHIM_PREFERENCE_SAME_SHIM:=1): 'NV2080_CTRL_CE_SHIM_PREFERENCE_SAME_SHIM', (NV2080_CTRL_CE_SHIM_PREFERENCE_DIFFERENT_SHIM:=2): 'NV2080_CTRL_CE_SHIM_PREFERENCE_DIFFERENT_SHIM'} +NV2080_CTRL_CE_SHIM_PREFERENCE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS(c.Struct): + SIZE = 32 + lceType: int + metadataForLceType: int + numPces: int + numLces: int + supportedPceMask: int + supportedLceMask: int + pcePerHshub: int + multipleLceShimPreference: int +struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS.register_fields([('lceType', NV2080_CTRL_CE_LCE_TYPE, 0), ('metadataForLceType', NvU32, 4), ('numPces', NvU32, 8), ('numLces', NvU32, 12), ('supportedPceMask', NvU32, 16), ('supportedLceMask', NvU32, 20), ('pcePerHshub', NvU32, 24), ('multipleLceShimPreference', NV2080_CTRL_CE_SHIM_PREFERENCE, 28)]) +NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS +@c.record +class struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS(c.Struct): + SIZE = 16 + decompLceMask: int + shimInstance: int +struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS.register_fields([('decompLceMask', NvU64, 0), ('shimInstance', NvU32, 8)]) +NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS(c.Struct): + SIZE = 8 + lceIndex: int + bDecompEnabled: int +struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS.register_fields([('lceIndex', NvU32, 0), ('bDecompEnabled', NvBool, 4)]) +NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_MIG_GPU_INSTANCE_PARAMS(c.Struct): + SIZE = 24 + lceMask: int + numLces: int + pceAvailableMask: int + numLcesToMap: int + lceAvailableMask: int + numMinPcesPerLce: int +struct_NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_MIG_GPU_INSTANCE_PARAMS.register_fields([('lceMask', NvU32, 0), ('numLces', NvU32, 4), ('pceAvailableMask', NvU32, 8), ('numLcesToMap', NvU32, 12), ('lceAvailableMask', NvU32, 16), ('numMinPcesPerLce', NvU32, 20)]) +NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_MIG_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_MIG_GPU_INSTANCE_PARAMS +@c.record +class struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MIG_MAPPINGS_PARAMS(c.Struct): + SIZE = 264 + pceLceMap: c.Array[ctypes.c_uint32, Literal[64]] + lceAvailableMask: int + shimInstance: int +struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MIG_MAPPINGS_PARAMS.register_fields([('pceLceMap', c.Array[NvU32, Literal[64]], 0), ('lceAvailableMask', NvU32, 256), ('shimInstance', NvU32, 260)]) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MIG_MAPPINGS_PARAMS: TypeAlias = struct_NV2080_CTRL_CE_UPDATE_PCE_LCE_MIG_MAPPINGS_PARAMS +@c.record +class struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE(c.Struct): + SIZE = 24 + super: struct_NV2080_CTRL_PMUMON_SAMPLE + gpcClkFreqKHz: int + dramClkFreqKHz: int + nvdClkFreqKHz: int + activeGpcClkFreqKHz: int +@c.record +class struct_NV2080_CTRL_PMUMON_SAMPLE(c.Struct): + SIZE = 8 + timestamp: int +NV2080_CTRL_PMUMON_SAMPLE: TypeAlias = struct_NV2080_CTRL_PMUMON_SAMPLE +struct_NV2080_CTRL_PMUMON_SAMPLE.register_fields([('timestamp', NvU64, 0)]) +struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE.register_fields([('super', NV2080_CTRL_PMUMON_SAMPLE, 0), ('gpcClkFreqKHz', NvU32, 8), ('dramClkFreqKHz', NvU32, 12), ('nvdClkFreqKHz', NvU32, 16), ('activeGpcClkFreqKHz', NvU32, 20)]) +NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE: TypeAlias = struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE +PNV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE: TypeAlias = c.POINTER[struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE] +@c.record +class struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_GET_SAMPLES_PARAMS(c.Struct): + SIZE = 6024 + super: struct_NV2080_CTRL_PMUMON_GET_SAMPLES_SUPER + samples: c.Array[struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE, Literal[250]] +@c.record +class struct_NV2080_CTRL_PMUMON_GET_SAMPLES_SUPER(c.Struct): + SIZE = 24 + tailIndex: int + sequenceId: int + headIndex: int + numSamples: int + resetCount: int + retrievalMode: int +NV2080_CTRL_PMUMON_GET_SAMPLES_SUPER: TypeAlias = struct_NV2080_CTRL_PMUMON_GET_SAMPLES_SUPER +enum_NV2080_CTRL_PMUMON_RETRIEVAL_MODE: dict[int, str] = {(NV2080_CTRL_PMUMON_RETRIEVAL_MODE_ALL_SAMPLES:=0): 'NV2080_CTRL_PMUMON_RETRIEVAL_MODE_ALL_SAMPLES', (NV2080_CTRL_PMUMON_RETRIEVAL_MODE_LATEST_SAMPLE_ONLY:=1): 'NV2080_CTRL_PMUMON_RETRIEVAL_MODE_LATEST_SAMPLE_ONLY'} +NV2080_CTRL_PMUMON_RETRIEVAL_MODE: TypeAlias = ctypes.c_uint32 +struct_NV2080_CTRL_PMUMON_GET_SAMPLES_SUPER.register_fields([('tailIndex', NvU32, 0), ('sequenceId', NvU32, 4), ('headIndex', NvU32, 8), ('numSamples', NvU32, 12), ('resetCount', NvU32, 16), ('retrievalMode', NV2080_CTRL_PMUMON_RETRIEVAL_MODE, 20)]) +struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_GET_SAMPLES_PARAMS.register_fields([('super', NV2080_CTRL_PMUMON_GET_SAMPLES_SUPER, 0), ('samples', c.Array[NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE, Literal[250]], 24)]) +NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_GET_SAMPLES_PARAMS: TypeAlias = struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_GET_SAMPLES_PARAMS +PNV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_GET_SAMPLES_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_GET_SAMPLES_PARAMS] +@c.record +class struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS(c.Struct): + SIZE = 16 + hClient: int + hDevice: int + engine: int + hVASpace: int +struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS.register_fields([('hClient', NvHandle, 0), ('hDevice', NvHandle, 4), ('engine', NvU32, 8), ('hVASpace', NvHandle, 12)]) +NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS: TypeAlias = struct_NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS +NV2080_CTRL_DMA_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_DMA_GET_INFO_PARAMS(c.Struct): + SIZE = 2052 + dmaInfoTblSize: int + dmaInfoTbl: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[256]] +struct_NV2080_CTRL_DMA_GET_INFO_PARAMS.register_fields([('dmaInfoTblSize', NvU32, 0), ('dmaInfoTbl', c.Array[NV2080_CTRL_DMA_INFO, Literal[256]], 4)]) +NV2080_CTRL_DMA_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_DMA_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO(c.Struct): + SIZE = 12 + srcAddr: int + dstAddr: int + relComptagIndex: int +struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO.register_fields([('srcAddr', NvU32, 0), ('dstAddr', NvU32, 4), ('relComptagIndex', NvU16, 8)]) +NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO: TypeAlias = struct_NV2080_CTRL_DMA_UPDATE_COMPTAG_INFO_TILE_INFO +@c.record +class struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO(c.Struct): + SIZE = 24 + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO.register_fields([('hMemory', NvHandle, 0), ('offset', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_DMABUF_MEM_HANDLE_INFO: TypeAlias = struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO +@c.record +class struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS(c.Struct): + SIZE = 3104 + fd: int + totalObjects: int + numObjects: int + index: int + totalSize: int + mappingType: int + bAllowMmap: int + handles: c.Array[struct_NV2080_CTRL_DMABUF_MEM_HANDLE_INFO, Literal[128]] +struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS.register_fields([('fd', NvS32, 0), ('totalObjects', NvU32, 4), ('numObjects', NvU32, 8), ('index', NvU32, 12), ('totalSize', NvU64, 16), ('mappingType', NvU8, 24), ('bAllowMmap', NvBool, 25), ('handles', c.Array[NV2080_CTRL_DMABUF_MEM_HANDLE_INFO, Literal[128]], 32)]) +NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS(c.Struct): + SIZE = 96 + sramParityUncorrectedUnique: int + sramSecDedUncorrectedUnique: int + sramCorrectedUnique: int + dramUncorrectedTotal: int + dramCorrectedTotal: int + lastClearedTimestamp: int + sramBucketL2: int + sramBucketSM: int + sramBucketPcie: int + sramBucketFirmware: int + sramBucketOther: int + sramErrorThresholdExceeded: int +struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS.register_fields([('sramParityUncorrectedUnique', NvU64, 0), ('sramSecDedUncorrectedUnique', NvU64, 8), ('sramCorrectedUnique', NvU64, 16), ('dramUncorrectedTotal', NvU64, 24), ('dramCorrectedTotal', NvU64, 32), ('lastClearedTimestamp', NvU32, 40), ('sramBucketL2', NvU64, 48), ('sramBucketSM', NvU64, 56), ('sramBucketPcie', NvU64, 64), ('sramBucketFirmware', NvU64, 72), ('sramBucketOther', NvU64, 80), ('sramErrorThresholdExceeded', NvBool, 88)]) +NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS(c.Struct): + SIZE = 40 + sramCorUni: int + sramUncParityUni: int + sramUncSecDedUni: int + dramCorTot: int + dramUncTot: int +struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS.register_fields([('sramCorUni', NvU64, 0), ('sramUncParityUni', NvU64, 8), ('sramUncSecDedUni', NvU64, 16), ('dramCorTot', NvU64, 24), ('dramUncTot', NvU64, 32)]) +NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS +@c.record +class struct_eccLocation(c.Struct): + SIZE = 12 + location: int + sublocation: int + extlocation: int +struct_eccLocation.register_fields([('location', NvU32, 0), ('sublocation', NvU32, 4), ('extlocation', NvU32, 8)]) +eccLocation: TypeAlias = struct_eccLocation +@c.record +class struct_NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY(c.Struct): + SIZE = 28 + unit: int + location: struct_eccLocation + address: int + bIsParity: int + count: int +struct_NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY.register_fields([('unit', NvU32, 0), ('location', eccLocation, 4), ('address', NvU32, 16), ('bIsParity', NvBool, 20), ('count', NvU32, 24)]) +NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY: TypeAlias = struct_NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY +@c.record +class struct_NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS(c.Struct): + SIZE = 16804 + entryCount: int + entries: c.Array[struct_NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY, Literal[600]] +struct_NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS.register_fields([('entryCount', NvU32, 0), ('entries', c.Array[NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_ENTRY, Literal[600]], 4)]) +NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_INJECT_ERROR_PARAMS(c.Struct): + SIZE = 32 + unit: int + errorType: int + location: struct_eccLocation + flags: int + address: int +struct_NV2080_CTRL_ECC_INJECT_ERROR_PARAMS.register_fields([('unit', NvU32, 0), ('errorType', NvU8, 4), ('location', eccLocation, 8), ('flags', NvU32, 20), ('address', NvU64, 24)]) +NV2080_CTRL_ECC_INJECT_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_INJECT_ERROR_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS(c.Struct): + SIZE = 2 + bTpcRepairPending: int + bChannelRepairPending: int +struct_NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS.register_fields([('bTpcRepairPending', NvBool, 0), ('bChannelRepairPending', NvBool, 1)]) +NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_INJECTION_SUPPORTED_PARAMS(c.Struct): + SIZE = 20 + unit: int + location: struct_eccLocation + bCorrectableSupported: int + bUncorrectableSupported: int +struct_NV2080_CTRL_ECC_INJECTION_SUPPORTED_PARAMS.register_fields([('unit', NvU32, 0), ('location', eccLocation, 4), ('bCorrectableSupported', NvBool, 16), ('bUncorrectableSupported', NvBool, 17)]) +NV2080_CTRL_ECC_INJECTION_SUPPORTED_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_INJECTION_SUPPORTED_PARAMS +@c.record +class struct_NV2080_CTRL_ECC_GET_UNREPAIRABLE_MEMORY_FLAG_PARAMS(c.Struct): + SIZE = 1 + bUnrepairableMemory: int +struct_NV2080_CTRL_ECC_GET_UNREPAIRABLE_MEMORY_FLAG_PARAMS.register_fields([('bUnrepairableMemory', NvBool, 0)]) +NV2080_CTRL_ECC_GET_UNREPAIRABLE_MEMORY_FLAG_PARAMS: TypeAlias = struct_NV2080_CTRL_ECC_GET_UNREPAIRABLE_MEMORY_FLAG_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS(c.Struct): + SIZE = 20 + event: int + action: int + bNotifyState: int + info32: int + info16: int +struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS.register_fields([('event', NvU32, 0), ('action', NvU32, 4), ('bNotifyState', NvBool, 8), ('info32', NvU32, 12), ('info16', NvU16, 16)]) +NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS +enum_NV2080_EVENT_HDACODEC_DSTATE: dict[int, str] = {(NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D0:=0): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D0', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D1:=1): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D1', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D2:=2): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D2', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_HOT:=3): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_HOT', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_COLD:=4): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_D3_COLD', (NV2080_EVENT_HDACODEC_DEVICE_DSTATE_DSTATE_MAX:=5): 'NV2080_EVENT_HDACODEC_DEVICE_DSTATE_DSTATE_MAX'} +NV2080_EVENT_HDACODEC_DSTATE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS(c.Struct): + SIZE = 4 + hMemory: int +struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS.register_fields([('hMemory', NvHandle, 0)]) +NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS(c.Struct): + SIZE = 8 + hSemMemory: int + semOffset: int +struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS.register_fields([('hSemMemory', NvHandle, 0), ('semOffset', NvU32, 4)]) +NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS(c.Struct): + SIZE = 48 + guestMSIAddr: int + guestMSIData: int + hSemMemory: int + isReset: int + vgpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] + domainId: int +struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS.register_fields([('guestMSIAddr', NvU64, 0), ('guestMSIData', NvU32, 8), ('hSemMemory', NvHandle, 12), ('isReset', NvBool, 16), ('vgpuUuid', c.Array[NvU8, Literal[16]], 17), ('domainId', NvU64, 40)]) +NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS(c.Struct): + SIZE = 8 + hSemMemory: int + isSemaMemValidationEnabled: int +struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS.register_fields([('hSemMemory', NvHandle, 0), ('isSemaMemValidationEnabled', NvBool, 4)]) +NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS(c.Struct): + SIZE = 4 + hEvent: int +struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS.register_fields([('hEvent', NvHandle, 0)]) +NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS +enum_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD: dict[int, str] = {(NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_FULL:=0): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_FULL', (NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_SIMPLE:=1): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_SIMPLE', (NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_CUSTOM:=2): 'NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD_CUSTOM'} +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS(c.Struct): + SIZE = 20 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int +struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16)]) +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS(c.Struct): + SIZE = 24 + hEventBuffer: int + tracepointMask: int + gspLoggingBufferSize: int + gspLoggingBufferWatermark: int +struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('tracepointMask', NvU64, 8), ('gspLoggingBufferSize', NvU32, 16), ('gspLoggingBufferWatermark', NvU32, 20)]) +NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS +@c.record +class struct_NV2080_CTRL_EVENT_NOCAT_BIND_EVTBUF_PARAMS(c.Struct): + SIZE = 4 + hEventBuffer: int +struct_NV2080_CTRL_EVENT_NOCAT_BIND_EVTBUF_PARAMS.register_fields([('hEventBuffer', NvHandle, 0)]) +NV2080_CTRL_EVENT_NOCAT_BIND_EVTBUF_PARAMS: TypeAlias = struct_NV2080_CTRL_EVENT_NOCAT_BIND_EVTBUF_PARAMS +NV2080_CTRL_FB_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_FB_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + fbInfoListSize: int + fbInfoList: ctypes.c_void_p +struct_NV2080_CTRL_FB_GET_INFO_PARAMS.register_fields([('fbInfoListSize', NvU32, 0), ('fbInfoList', NvP64, 8)]) +NV2080_CTRL_FB_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 1028 + fbInfoListSize: int + fbInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[128]] +struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS.register_fields([('fbInfoListSize', NvU32, 0), ('fbInfoList', c.Array[NV2080_CTRL_FB_INFO, Literal[128]], 4)]) +NV2080_CTRL_FB_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS(c.Struct): + SIZE = 16 + cpuVirtAddress: ctypes.c_void_p + gpuVirtAddress: int +struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS.register_fields([('cpuVirtAddress', NvP64, 0), ('gpuVirtAddress', NvU64, 8)]) +NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS(c.Struct): + SIZE = 24 + flags: int + driveStrengthRiseCount: int + driveStrengthFallCount: int + driveStrengthTermCount: int + slewStrengthRiseCount: int + slewStrengthFallCount: int +struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS.register_fields([('flags', NvU32, 0), ('driveStrengthRiseCount', NvU32, 4), ('driveStrengthFallCount', NvU32, 8), ('driveStrengthTermCount', NvU32, 12), ('slewStrengthRiseCount', NvU32, 16), ('slewStrengthFallCount', NvU32, 20)]) +NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS(c.Struct): + SIZE = 4024 + addressArray: c.Array[ctypes.c_uint64, Literal[500]] + addressArraySize: int + addressAlign: int + memBlockSizeBytes: int + flags: int +struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS.register_fields([('addressArray', c.Array[NvU64, Literal[500]], 0), ('addressArraySize', NvU32, 4000), ('addressAlign', NvU32, 4004), ('memBlockSizeBytes', NvU64, 4008), ('flags', NvU32, 4016)]) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS +@c.record +class struct_NV2080_CTRL_FB_IS_KIND_PARAMS(c.Struct): + SIZE = 12 + operation: int + kind: int + result: int +struct_NV2080_CTRL_FB_IS_KIND_PARAMS.register_fields([('operation', NvU32, 0), ('kind', NvU32, 4), ('result', NvBool, 8)]) +NV2080_CTRL_FB_IS_KIND_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_IS_KIND_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS(c.Struct): + SIZE = 16 + powerState: int + writeMode: int + bypassMode: int + rcmState: int +struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS.register_fields([('powerState', NvU32, 0), ('writeMode', NvU32, 4), ('bypassMode', NvU32, 8), ('rcmState', NvU32, 12)]) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS +enum_NV2080_FB_REGION_TAG: dict[int, str] = {(NV2080_FB_REGION_TAG_NONE:=0): 'NV2080_FB_REGION_TAG_NONE', (NV2080_FB_REGION_TAG_GSP_CARVEOUT:=1): 'NV2080_FB_REGION_TAG_GSP_CARVEOUT', (NV2080_FB_REGION_TAG_CPU_RM_RESERVED:=2): 'NV2080_FB_REGION_TAG_CPU_RM_RESERVED', (NV2080_FB_REGION_TAG_CPU_RM_RESERVED_HEAP:=3): 'NV2080_FB_REGION_TAG_CPU_RM_RESERVED_HEAP', (NV2080_FB_REGION_TAG_GSP_RM_RESERVED:=4): 'NV2080_FB_REGION_TAG_GSP_RM_RESERVED', (NV2080_FB_REGION_TAG_GSP_RM_RESERVED_HEAP:=5): 'NV2080_FB_REGION_TAG_GSP_RM_RESERVED_HEAP'} +NV2080_FB_REGION_TAG: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO(c.Struct): + SIZE = 56 + base: int + limit: int + reserved: int + performance: int + supportCompressed: int + supportISO: int + bProtected: int + blackList: c.Array[ctypes.c_ubyte, Literal[18]] + regionTag: int +struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO.register_fields([('base', NvU64, 0), ('limit', NvU64, 8), ('reserved', NvU64, 16), ('performance', NvU32, 24), ('supportCompressed', NvBool, 28), ('supportISO', NvBool, 29), ('bProtected', NvBool, 30), ('blackList', c.Array[NvBool, Literal[18]], 31), ('regionTag', NV2080_FB_REGION_TAG, 52)]) +NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS(c.Struct): + SIZE = 904 + numFBRegions: int + fbRegion: c.Array[struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO, Literal[16]] +struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS.register_fields([('numFBRegions', NvU32, 0), ('fbRegion', c.Array[NV2080_CTRL_CMD_FB_GET_FB_REGION_FB_REGION_INFO, Literal[16]], 8)]) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO(c.Struct): + SIZE = 32 + pageAddressWithEccOn: int + pageAddressWithEccOff: int + rbcAddress: int + source: int + status: int + timestamp: int +struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO.register_fields([('pageAddressWithEccOn', NvU64, 0), ('pageAddressWithEccOff', NvU64, 8), ('rbcAddress', NvU32, 16), ('source', NvU32, 20), ('status', NvU32, 24), ('timestamp', NvU32, 28)]) +NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO: TypeAlias = struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO +@c.record +class struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS(c.Struct): + SIZE = 2064 + offlined: c.Array[struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]] + pageSize: int + validEntries: int + numPagesAdded: int +struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('pageSize', NvU32, 2048), ('validEntries', NvU32, 2052), ('numPagesAdded', NvU32, 2056)]) +NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 2056 + offlined: c.Array[struct_NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]] + validEntries: int + bRetirementPending: int + retirementPending: int +struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('validEntries', NvU32, 2048), ('bRetirementPending', NvBool, 2052), ('retirementPending', NvU8, 2053)]) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS +enum_NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_CMD_FB_ACR_QUERY_GET_CLIENT_REGION_STATUS:=0): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_CLIENT_REGION_STATUS', (NV2080_CTRL_CMD_FB_ACR_QUERY_GET_REGION_PROPERTY:=1): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_REGION_PROPERTY', (NV2080_CTRL_CMD_FB_ACR_QUERY_GET_FALCON_STATUS:=2): 'NV2080_CTRL_CMD_FB_ACR_QUERY_GET_FALCON_STATUS'} +NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE: dict[int, str] = {(NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_NONE:=0): 'NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_NONE', (NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_INVALID_CLIENT_REQUEST:=1): 'NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_INVALID_CLIENT_REQUEST'} +NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_ACR_REQUEST_PARAMS(c.Struct): + SIZE = 16 + clientId: int + reqReadMask: int + reqWriteMask: int + regionSize: int +struct_ACR_REQUEST_PARAMS.register_fields([('clientId', NvU32, 0), ('reqReadMask', NvU32, 4), ('reqWriteMask', NvU32, 8), ('regionSize', NvU32, 12)]) +ACR_REQUEST_PARAMS: TypeAlias = struct_ACR_REQUEST_PARAMS +@c.record +class struct_ACR_REGION_ID_PROP(c.Struct): + SIZE = 32 + regionId: int + readMask: int + writeMask: int + regionSize: int + clientMask: int + physicalAddress: int +struct_ACR_REGION_ID_PROP.register_fields([('regionId', NvU32, 0), ('readMask', NvU32, 4), ('writeMask', NvU32, 8), ('regionSize', NvU32, 12), ('clientMask', NvU32, 16), ('physicalAddress', NvU64, 24)]) +ACR_REGION_ID_PROP: TypeAlias = struct_ACR_REGION_ID_PROP +@c.record +class struct_ACR_STATUS_PARAMS(c.Struct): + SIZE = 16 + allocStatus: int + regionId: int + physicalAddress: int +struct_ACR_STATUS_PARAMS.register_fields([('allocStatus', NvU32, 0), ('regionId', NvU32, 4), ('physicalAddress', NvU64, 8)]) +ACR_STATUS_PARAMS: TypeAlias = struct_ACR_STATUS_PARAMS +@c.record +class struct_ACR_REGION_HANDLE(c.Struct): + SIZE = 20 + hClient: int + hParent: int + hMemory: int + hClass: int + hDevice: int +struct_ACR_REGION_HANDLE.register_fields([('hClient', NvHandle, 0), ('hParent', NvHandle, 4), ('hMemory', NvHandle, 8), ('hClass', NvU32, 12), ('hDevice', NvHandle, 16)]) +ACR_REGION_HANDLE: TypeAlias = struct_ACR_REGION_HANDLE +@c.record +class struct_ACR_FALCON_LS_STATUS(c.Struct): + SIZE = 4 + falconId: int + bIsInLs: int +struct_ACR_FALCON_LS_STATUS.register_fields([('falconId', NvU16, 0), ('bIsInLs', NvBool, 2)]) +ACR_FALCON_LS_STATUS: TypeAlias = struct_ACR_FALCON_LS_STATUS +@c.record +class struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS(c.Struct): + SIZE = 96 + queryType: int + errorCode: int + acrRegionIdProp: struct_ACR_REGION_ID_PROP + clientReq: struct_ACR_REQUEST_PARAMS + clientReqStatus: struct_ACR_STATUS_PARAMS + handle: struct_ACR_REGION_HANDLE + falconStatus: struct_ACR_FALCON_LS_STATUS +struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS.register_fields([('queryType', NV2080_CTRL_CMD_FB_ACR_QUERY_TYPE, 0), ('errorCode', NV2080_CTRL_CMD_FB_ACR_QUERY_ERROR_CODE, 4), ('acrRegionIdProp', ACR_REGION_ID_PROP, 8), ('clientReq', ACR_REQUEST_PARAMS, 40), ('clientReqStatus', ACR_STATUS_PARAMS, 56), ('handle', ACR_REGION_HANDLE, 72), ('falconStatus', ACR_FALCON_LS_STATUS, 92)]) +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 4 + sourceMask: int +struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS.register_fields([('sourceMask', NvU32, 0)]) +NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS(c.Struct): + SIZE = 16 + pCompBitCopyObj: ctypes.c_void_p + pSwizzleParams: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS.register_fields([('pCompBitCopyObj', NvP64, 0), ('pSwizzleParams', NvP64, 8)]) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS(c.Struct): + SIZE = 20 + fbpIndex: int + ltcMask: int + ltcCount: int + ltsMask: int + ltsCount: int +struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS.register_fields([('fbpIndex', NvU8, 0), ('ltcMask', NvU32, 4), ('ltcCount', NvU32, 8), ('ltsMask', NvU32, 12), ('ltsCount', NvU32, 16)]) +NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS(c.Struct): + SIZE = 72 + CBCBaseAddress: int + backingStorePA: int + backingStoreVA: c.POINTER[ctypes.c_ubyte] + backingStoreChunkPA: int + backingStoreChunkVA: c.POINTER[ctypes.c_ubyte] + backingStoreChunkSize: int + cacheWriteBitMap: c.POINTER[ctypes.c_ubyte] + backingStoreChunkOverfetch: int + PageSizeSrc: int + PageSizeDest: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS.register_fields([('CBCBaseAddress', NvU32, 0), ('backingStorePA', NvU64, 8), ('backingStoreVA', c.POINTER[NvU8], 16), ('backingStoreChunkPA', NvU64, 24), ('backingStoreChunkVA', c.POINTER[NvU8], 32), ('backingStoreChunkSize', NvU32, 40), ('cacheWriteBitMap', c.POINTER[NvU8], 48), ('backingStoreChunkOverfetch', NvBool, 56), ('PageSizeSrc', NvU32, 60), ('PageSizeDest', NvU32, 64)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS(c.Struct): + SIZE = 40 + fcbits: c.POINTER[ctypes.c_uint32] + compbits: c.POINTER[ctypes.c_uint32] + dataPhysicalStart: int + surfaceOffset: int + comptagLine: int + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS.register_fields([('fcbits', c.POINTER[NvU32], 0), ('compbits', c.POINTER[NvU32], 8), ('dataPhysicalStart', NvU64, 16), ('surfaceOffset', NvU64, 24), ('comptagLine', NvU32, 32), ('upper64KBCompbitSel', NvBool, 36)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS(c.Struct): + SIZE = 40 + fcbits: int + compbits: int + writeFc: int + dataPhysicalStart: int + surfaceOffset: int + comptagLine: int + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS.register_fields([('fcbits', NvU32, 0), ('compbits', NvU32, 4), ('writeFc', NvBool, 8), ('dataPhysicalStart', NvU64, 16), ('surfaceOffset', NvU64, 24), ('comptagLine', NvU32, 32), ('upper64KBCompbitSel', NvBool, 36)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS(c.Struct): + SIZE = 32 + SrcDataPhysicalStart: int + SrcComptagLine: int + page64KB: int + compbitBuffer: c.POINTER[ctypes.c_uint32] + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS.register_fields([('SrcDataPhysicalStart', NvU64, 0), ('SrcComptagLine', NvU32, 8), ('page64KB', NvU32, 12), ('compbitBuffer', c.POINTER[NvU32], 16), ('upper64KBCompbitSel', NvBool, 24)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS(c.Struct): + SIZE = 32 + DstDataPhysicalStart: int + DstComptagLine: int + page64KB: int + compbitBuffer: c.POINTER[ctypes.c_uint32] + upper64KBCompbitSel: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS.register_fields([('DstDataPhysicalStart', NvU64, 0), ('DstComptagLine', NvU32, 8), ('page64KB', NvU32, 12), ('compbitBuffer', c.POINTER[NvU32], 16), ('upper64KBCompbitSel', NvBool, 24)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS(c.Struct): + SIZE = 1 + bForceBar1: int +struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS.register_fields([('bForceBar1', NvBool, 0)]) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS(c.Struct): + SIZE = 16 + pAmapConfParams: ctypes.c_void_p + pCbcSwizzleParams: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS.register_fields([('pAmapConfParams', NvP64, 0), ('pCbcSwizzleParams', NvP64, 8)]) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS +enum_CTRL_CMD_FB_CBC_OP: dict[int, str] = {(CTRL_CMD_FB_CBC_OP_CLEAN:=0): 'CTRL_CMD_FB_CBC_OP_CLEAN', (CTRL_CMD_FB_CBC_OP_INVALIDATE:=1): 'CTRL_CMD_FB_CBC_OP_INVALIDATE'} +CTRL_CMD_FB_CBC_OP: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS(c.Struct): + SIZE = 4 + fbCBCOp: int +struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS.register_fields([('fbCBCOp', CTRL_CMD_FB_CBC_OP, 0)]) +NV2080_CTRL_CMD_FB_CBC_OP_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_CBC_OP_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS(c.Struct): + SIZE = 512 + pCompTags: c.Array[ctypes.c_uint32, Literal[127]] + numCompTags: int +struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS.register_fields([('pCompTags', c.Array[NvU32, Literal[127]], 0), ('numCompTags', NvU32, 508)]) +NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS(c.Struct): + SIZE = 28 + attr: int + attr2: int + size: int + ctagOffset: int + hwResId: int + retCompTagLineMin: int + retCompTagLineMax: int +struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS.register_fields([('attr', NvU32, 0), ('attr2', NvU32, 4), ('size', NvU32, 8), ('ctagOffset', NvU32, 12), ('hwResId', NvU32, 16), ('retCompTagLineMin', NvU32, 20), ('retCompTagLineMax', NvU32, 24)]) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS(c.Struct): + SIZE = 4 + hwResId: int +struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS.register_fields([('hwResId', NvU32, 0)]) +NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS +enum_NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE: dict[int, str] = {(NV2080_CTRL_CMD_FB_SET_VPR:=0): 'NV2080_CTRL_CMD_FB_SET_VPR'} +NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_CMD_FB_VPR_ERROR_CODE: dict[int, str] = {(NV2080_CTRL_CMD_FB_VPR_ERROR_GENERIC:=0): 'NV2080_CTRL_CMD_FB_VPR_ERROR_GENERIC', (NV2080_CTRL_CMD_FB_VPR_ERROR_INVALID_CLIENT_REQUEST:=1): 'NV2080_CTRL_CMD_FB_VPR_ERROR_INVALID_CLIENT_REQUEST'} +NV2080_CTRL_CMD_FB_VPR_ERROR_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_VPR_REQUEST_PARAMS(c.Struct): + SIZE = 8 + startAddr: int + size: int +struct_VPR_REQUEST_PARAMS.register_fields([('startAddr', NvU32, 0), ('size', NvU32, 4)]) +VPR_REQUEST_PARAMS: TypeAlias = struct_VPR_REQUEST_PARAMS +@c.record +class struct_VPR_STATUS_PARAMS(c.Struct): + SIZE = 4 + status: int +struct_VPR_STATUS_PARAMS.register_fields([('status', NvU32, 0)]) +VPR_STATUS_PARAMS: TypeAlias = struct_VPR_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS(c.Struct): + SIZE = 16 + requestType: int + requestParams: struct_VPR_REQUEST_PARAMS + statusParams: struct_VPR_STATUS_PARAMS +struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS.register_fields([('requestType', NV2080_CTRL_CMD_FB_VPR_REQUEST_TYPE, 0), ('requestParams', VPR_REQUEST_PARAMS, 4), ('statusParams', VPR_STATUS_PARAMS, 12)]) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS +PNV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS] +@c.record +class struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 264 + offlinedPages: c.Array[ctypes.c_uint32, Literal[64]] + pageSize: int + validEntries: int +struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS.register_fields([('offlinedPages', c.Array[NvU32, Literal[64]], 0), ('pageSize', NvU32, 256), ('validEntries', NvU32, 260)]) +NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS(c.Struct): + SIZE = 56 + defaultPageSize: int + comptagsPerCacheLine: int + unpackedComptagLinesPerCacheLine: int + compCacheLineSizePerLTC: int + unpackedCompCacheLineSizePerLTC: int + slicesPerLTC: int + numActiveLTCs: int + familyName: int + chipName: int + bitsPerRAMEntry: int + ramBankWidth: int + bitsPerComptagLine: int + ramEntriesPerCompCacheLine: int + comptagLineSize: int +struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS.register_fields([('defaultPageSize', NvU32, 0), ('comptagsPerCacheLine', NvU32, 4), ('unpackedComptagLinesPerCacheLine', NvU32, 8), ('compCacheLineSizePerLTC', NvU32, 12), ('unpackedCompCacheLineSizePerLTC', NvU32, 16), ('slicesPerLTC', NvU32, 20), ('numActiveLTCs', NvU32, 24), ('familyName', NvU32, 28), ('chipName', NvU32, 32), ('bitsPerRAMEntry', NvU32, 36), ('ramBankWidth', NvU32, 40), ('bitsPerComptagLine', NvU32, 44), ('ramEntriesPerCompCacheLine', NvU32, 48), ('comptagLineSize', NvU32, 52)]) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_RRD_PARAMS(c.Struct): + SIZE = 4 + rrd: int +struct_NV2080_CTRL_FB_SET_RRD_PARAMS.register_fields([('rrd', NvU32, 0)]) +NV2080_CTRL_FB_SET_RRD_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_RRD_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS(c.Struct): + SIZE = 1 + limit: int +struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS.register_fields([('limit', NvU8, 0)]) +NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +NV2080_CTRL_FB_SET_READ_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +NV2080_CTRL_FB_SET_WRITE_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS(c.Struct): + SIZE = 56 + alignType: int + alignAttr: int + alignInputFlags: int + alignHead: int + alignSize: int + alignHeight: int + alignWidth: int + alignPitch: int + alignPad: int + alignMask: int + alignKind: int + alignAdjust: int + alignAttr2: int +struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS.register_fields([('alignType', NvU32, 0), ('alignAttr', NvU32, 4), ('alignInputFlags', NvU32, 8), ('alignHead', NvU32, 12), ('alignSize', NvU64, 16), ('alignHeight', NvU32, 24), ('alignWidth', NvU32, 28), ('alignPitch', NvU32, 32), ('alignPad', NvU32, 36), ('alignMask', NvU32, 40), ('alignKind', NvU32, 44), ('alignAdjust', NvU32, 48), ('alignAttr2', NvU32, 52)]) +NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS(c.Struct): + SIZE = 32 + cbcBaseAddress: int + compCacheLineSize: int + backingStoreStartPA: int + backingStoreAllocPA: int + backingStoreChunkOverfetch: int +struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS.register_fields([('cbcBaseAddress', NvU32, 0), ('compCacheLineSize', NvU32, 4), ('backingStoreStartPA', NvU64, 8), ('backingStoreAllocPA', NvU64, 16), ('backingStoreChunkOverfetch', NvU32, 24)]) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_FB_ROW_REMAP_ENTRY(c.Struct): + SIZE = 12 + remapRegVal: int + timestamp: int + fbpa: int + sublocation: int + source: int + flags: int +struct_NV2080_CTRL_FB_ROW_REMAP_ENTRY.register_fields([('remapRegVal', NvU32, 0), ('timestamp', NvU32, 4), ('fbpa', NvU8, 8), ('sublocation', NvU8, 9), ('source', NvU8, 10), ('flags', NvU8, 11)]) +NV2080_CTRL_FB_ROW_REMAP_ENTRY: TypeAlias = struct_NV2080_CTRL_FB_ROW_REMAP_ENTRY +@c.record +class struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS(c.Struct): + SIZE = 6152 + entryCount: int + flags: int + entries: c.Array[struct_NV2080_CTRL_FB_ROW_REMAP_ENTRY, Literal[512]] +struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS.register_fields([('entryCount', NvU32, 0), ('flags', NvU8, 4), ('entries', c.Array[NV2080_CTRL_FB_ROW_REMAP_ENTRY, Literal[512]], 8)]) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS(c.Struct): + SIZE = 24 + data: c.Array[ctypes.c_ubyte, Literal[24]] +struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS.register_fields([('data', c.Array[NvU8, Literal[24]], 0)]) +NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS(c.Struct): + SIZE = 16 + swizzId: int + fbpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('fbpEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ltcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ltcEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ltsEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ltsEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpaEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpaEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpaSubpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpaSubpEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + fbpLogicalIndex: int +struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('fbpLogicalIndex', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + ropEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('ropEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS(c.Struct): + SIZE = 16 + swizzId: int + sysEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('sysEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ltcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ltcEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ltsEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ltsEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + fbpaEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('fbpaEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS(c.Struct): + SIZE = 12 + fbpIndex: int + swizzId: int + ropEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('ropEnMask', NvU32, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + swizzId: int + fbpaSubpEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('fbpaSubpEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS(c.Struct): + SIZE = 8 + sysIdx: int + sysl2LtcEnMask: int +struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS.register_fields([('sysIdx', NvU32, 0), ('sysl2LtcEnMask', NvU32, 4)]) +NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS(c.Struct): + SIZE = 16 + sysIdx: int + sysl2LtsEnMask: int +struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS.register_fields([('sysIdx', NvU32, 0), ('sysl2LtsEnMask', NvU64, 8)]) +NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS(c.Struct): + SIZE = 8 + fbpIndex: int + pacEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('pacEnMask', NvU32, 4)]) +NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + logicalLtcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('logicalLtcEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS(c.Struct): + SIZE = 16 + fbpIndex: int + swizzId: int + logicalLtcEnMask: int +struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS.register_fields([('fbpIndex', NvU32, 0), ('swizzId', NvU32, 4), ('logicalLtcEnMask', NvU64, 8)]) +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_QUERY(c.Struct): + SIZE = 32 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryParams: struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams +@c.record +class struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams(c.Struct): + SIZE = 24 + inv: struct_NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS + fbp: struct_NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS + ltc: struct_NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS + lts: struct_NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS + fbpa: struct_NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS + rop: struct_NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS + dmLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS + dmLts: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS + dmFbpa: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS + dmRop: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS + dmFbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS + fbpaSubp: struct_NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS + fbpLogicalMap: struct_NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS + sysl2Ltc: struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS + pac: struct_NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS + logicalLtc: struct_NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS + dmLogicalLtc: struct_NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS + sysl2Lts: struct_NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS + sys: struct_NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS +struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams.register_fields([('inv', NV2080_CTRL_FB_FS_INFO_INVALID_QUERY_PARAMS, 0), ('fbp', NV2080_CTRL_FB_FS_INFO_FBP_MASK_PARAMS, 0), ('ltc', NV2080_CTRL_FB_FS_INFO_LTC_MASK_PARAMS, 0), ('lts', NV2080_CTRL_FB_FS_INFO_LTS_MASK_PARAMS, 0), ('fbpa', NV2080_CTRL_FB_FS_INFO_FBPA_MASK_PARAMS, 0), ('rop', NV2080_CTRL_FB_FS_INFO_ROP_MASK_PARAMS, 0), ('dmLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK_PARAMS, 0), ('dmLts', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK_PARAMS, 0), ('dmFbpa', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK_PARAMS, 0), ('dmRop', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK_PARAMS, 0), ('dmFbpaSubp', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK_PARAMS, 0), ('fbpaSubp', NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK_PARAMS, 0), ('fbpLogicalMap', NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP_PARAMS, 0), ('sysl2Ltc', NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK_PARAMS, 0), ('pac', NV2080_CTRL_FB_FS_INFO_PAC_MASK_PARAMS, 0), ('logicalLtc', NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK_PARAMS, 0), ('dmLogicalLtc', NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK_PARAMS, 0), ('sysl2Lts', NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK_PARAMS, 0), ('sys', NV2080_CTRL_FB_FS_INFO_SYS_MASK_PARAMS, 0)]) +struct_NV2080_CTRL_FB_FS_INFO_QUERY.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryParams', struct_NV2080_CTRL_FB_FS_INFO_QUERY_queryParams, 8)]) +NV2080_CTRL_FB_FS_INFO_QUERY: TypeAlias = struct_NV2080_CTRL_FB_FS_INFO_QUERY +@c.record +class struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS(c.Struct): + SIZE = 3848 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_FB_FS_INFO_QUERY, Literal[120]] +struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_FB_FS_INFO_QUERY, Literal[120]], 8)]) +NV2080_CTRL_FB_GET_FS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_FS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS(c.Struct): + SIZE = 20 + histogram: c.Array[ctypes.c_uint32, Literal[5]] +struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS.register_fields([('histogram', c.Array[NvU32, Literal[5]], 0)]) +NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS +@c.record +class struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO(c.Struct): + SIZE = 16 + pageNumber: int + source: int +struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO.register_fields([('pageNumber', NvU64, 0), ('source', NvU8, 8)]) +NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO: TypeAlias = struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO +@c.record +class struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS(c.Struct): + SIZE = 1040 + offlined: c.Array[struct_NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO, Literal[64]] + validEntries: int + baseIndex: int + bMore: int +struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS.register_fields([('offlined', c.Array[NV2080_CTRL_FB_DYNAMIC_OFFLINED_ADDRESS_INFO, Literal[64]], 0), ('validEntries', NvU32, 1024), ('baseIndex', NvU32, 1028), ('bMore', NvBool, 1032)]) +NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO(c.Struct): + SIZE = 24 + client: int + flags: int + beginAddr: int + size: int +struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO.register_fields([('client', NvU32, 0), ('flags', NvU32, 4), ('beginAddr', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_CMD_FB_ALLOCATION_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_ALLOCATION_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_CLIENT_INFO(c.Struct): + SIZE = 112 + handle: int + pid: int + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] +struct_NV2080_CTRL_CMD_FB_CLIENT_INFO.register_fields([('handle', NvHandle, 0), ('pid', NvU32, 4), ('subProcessID', NvU32, 8), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 12)]) +NV2080_CTRL_CMD_FB_CLIENT_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_CLIENT_INFO +@c.record +class struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS(c.Struct): + SIZE = 32 + allocCount: int + pAllocInfo: ctypes.c_void_p + clientCount: int + pClientInfo: ctypes.c_void_p +struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS.register_fields([('allocCount', NvU64, 0), ('pAllocInfo', NvP64, 8), ('clientCount', NvU64, 16), ('pClientInfo', NvP64, 24)]) +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS(c.Struct): + SIZE = 1 + bOnline: int +struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS.register_fields([('bOnline', NvBool, 0)]) +NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS(c.Struct): + SIZE = 544 + numaNodeId: int + numaMemAddr: int + numaMemSize: int + numaOfflineAddressesCount: int + numaOfflineAddresses: c.Array[ctypes.c_uint64, Literal[64]] +struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS.register_fields([('numaNodeId', NvS32, 0), ('numaMemAddr', NvU64, 8), ('numaMemSize', NvU64, 16), ('numaOfflineAddressesCount', NvU32, 24), ('numaOfflineAddresses', c.Array[NvU64, Literal[64]], 32)]) +NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS(c.Struct): + SIZE = 32 + maxSubmittedSemaphoreValueOffset: int + monitoredFenceThresholdOffset: int + size: int + caps: int +struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS.register_fields([('maxSubmittedSemaphoreValueOffset', NvU64, 0), ('monitoredFenceThresholdOffset', NvU64, 8), ('size', NvU64, 16), ('caps', NvU32, 24)]) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS +@c.record +class struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS(c.Struct): + SIZE = 8 + gfid: int + invalidateAll: int +struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS.register_fields([('gfid', NvU32, 0), ('invalidateAll', NvBool, 4)]) +NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS: TypeAlias = struct_NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO(c.Struct): + SIZE = 24 + allocSize: int + numBlocks: int + rsvdSize: int +struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO.register_fields([('allocSize', NvU64, 0), ('numBlocks', NvU32, 8), ('rsvdSize', NvU64, 16)]) +NV2080_CTRL_CMD_FB_STATS_OWNER_INFO: TypeAlias = struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO +@c.record +class struct_NV2080_CTRL_CMD_RM_FB_STATS_ENTRY(c.Struct): + SIZE = 4848 + reservedHeap: int + reservedHeapFree: int + reserved: int + fbBlockInfo: c.Array[struct_NV2080_CTRL_CMD_FB_STATS_OWNER_INFO, Literal[201]] +struct_NV2080_CTRL_CMD_RM_FB_STATS_ENTRY.register_fields([('reservedHeap', NvU64, 0), ('reservedHeapFree', NvU64, 8), ('reserved', NvU64, 16), ('fbBlockInfo', c.Array[NV2080_CTRL_CMD_FB_STATS_OWNER_INFO, Literal[201]], 24)]) +NV2080_CTRL_CMD_RM_FB_STATS_ENTRY: TypeAlias = struct_NV2080_CTRL_CMD_RM_FB_STATS_ENTRY +@c.record +class struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS(c.Struct): + SIZE = 9728 + total: int + os: int + gspCarveout: int + miscReserved: int + cpuFbInfo: struct_NV2080_CTRL_CMD_RM_FB_STATS_ENTRY + gspFbInfo: struct_NV2080_CTRL_CMD_RM_FB_STATS_ENTRY +struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS.register_fields([('total', NvU64, 0), ('os', NvU64, 8), ('gspCarveout', NvU64, 16), ('miscReserved', NvU64, 24), ('cpuFbInfo', NV2080_CTRL_CMD_RM_FB_STATS_ENTRY, 32), ('gspFbInfo', NV2080_CTRL_CMD_RM_FB_STATS_ENTRY, 4880)]) +NV2080_CTRL_CMD_FB_STATS_GET_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FB_STATS_GET_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS(c.Struct): + SIZE = 24 + bStaticBar1Enabled: int + bStaticBar1WriteCombined: int + staticBar1StartOffset: int + staticBar1Size: int +struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS.register_fields([('bStaticBar1Enabled', NvBool, 0), ('bStaticBar1WriteCombined', NvBool, 1), ('staticBar1StartOffset', NvU64, 8), ('staticBar1Size', NvU64, 16)]) +NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + currentConfiguration: int +struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS.register_fields([('currentConfiguration', NvU32, 0)]) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + newConfiguration: int +struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS.register_fields([('newConfiguration', NvU32, 0)]) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS(c.Struct): + SIZE = 4 + isSupported: int +struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS.register_fields([('isSupported', NvU32, 0)]) +NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS(c.Struct): + SIZE = 4 + currentStatus: int +struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS.register_fields([('currentStatus', NvU32, 0)]) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS(c.Struct): + SIZE = 6 + flagCollectSchmooData: int + flagWrTrHybridVrefEn: int + flagWrTrHybridNonVrefEn: int + flagRdTrHybridVrefEn: int + flagRdTrHybridNonVrefEn: int + skipBootTraining: int +struct_NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS.register_fields([('flagCollectSchmooData', NvBool, 0), ('flagWrTrHybridVrefEn', NvBool, 1), ('flagWrTrHybridNonVrefEn', NvBool, 2), ('flagRdTrHybridVrefEn', NvBool, 3), ('flagRdTrHybridNonVrefEn', NvBool, 4), ('skipBootTraining', NvBool, 5)]) +NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS +enum_NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE: dict[int, str] = {(NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_DISPLAY_FRM:=0): 'NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_DISPLAY_FRM', (NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_DISPLAY_FRM_RESERVED:=1): 'NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_DISPLAY_FRM_RESERVED', (NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_UEFI:=2): 'NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE_UEFI'} +NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO(c.Struct): + SIZE = 24 + base: int + size: int + carveoutType: int +struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('carveoutType', NV2080_CTRL_FB_GET_CARVEOUT_REGION_CARVEOUT_TYPE, 16)]) +NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO: TypeAlias = struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO +@c.record +class struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS(c.Struct): + SIZE = 200 + numCarveoutRegions: int + carveoutRegion: c.Array[struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO, Literal[8]] +struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS.register_fields([('numCarveoutRegions', NvU32, 0), ('carveoutRegion', c.Array[NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO, Literal[8]], 8)]) +NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_BANK_REMAP_HISTOGRAM(c.Struct): + SIZE = 8 + maxGroupCount: int + noSpareGroupCount: int +struct_NV2080_CTRL_FB_BANK_REMAP_HISTOGRAM.register_fields([('maxGroupCount', NvU32, 0), ('noSpareGroupCount', NvU32, 4)]) +NV2080_CTRL_FB_BANK_REMAP_HISTOGRAM: TypeAlias = struct_NV2080_CTRL_FB_BANK_REMAP_HISTOGRAM +@c.record +class struct_NV2080_CTRL_FB_BANK_REMAP_ENTRY(c.Struct): + SIZE = 16 + remapRegVal: int + timestamp: int + fbpa: int + channel: int + pseudoChannel: int + group: int + source: int + flags: int +struct_NV2080_CTRL_FB_BANK_REMAP_ENTRY.register_fields([('remapRegVal', NvU32, 0), ('timestamp', NvU32, 4), ('fbpa', NvU8, 8), ('channel', NvU8, 9), ('pseudoChannel', NvU8, 10), ('group', NvU8, 11), ('source', NvU8, 12), ('flags', NvU8, 13)]) +NV2080_CTRL_FB_BANK_REMAP_ENTRY: TypeAlias = struct_NV2080_CTRL_FB_BANK_REMAP_ENTRY +@c.record +class struct_NV2080_CTRL_FB_GET_REMAPPED_BANKS_PARAMS(c.Struct): + SIZE = 8208 + entryCount: int + flags: int + histogram: struct_NV2080_CTRL_FB_BANK_REMAP_HISTOGRAM + entries: c.Array[struct_NV2080_CTRL_FB_BANK_REMAP_ENTRY, Literal[512]] +struct_NV2080_CTRL_FB_GET_REMAPPED_BANKS_PARAMS.register_fields([('entryCount', NvU32, 0), ('flags', NvU8, 4), ('histogram', NV2080_CTRL_FB_BANK_REMAP_HISTOGRAM, 8), ('entries', c.Array[NV2080_CTRL_FB_BANK_REMAP_ENTRY, Literal[512]], 16)]) +NV2080_CTRL_FB_GET_REMAPPED_BANKS_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_REMAPPED_BANKS_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_UGPU_MEMORY_INFO_PARAMS(c.Struct): + SIZE = 48 + totalMemory: int + freeMemory: int + ugpuTotalMemory: c.Array[ctypes.c_uint64, Literal[2]] + ugpuFreeMemory: c.Array[ctypes.c_uint64, Literal[2]] +struct_NV2080_CTRL_FB_GET_UGPU_MEMORY_INFO_PARAMS.register_fields([('totalMemory', NvU64, 0), ('freeMemory', NvU64, 8), ('ugpuTotalMemory', c.Array[NvU64, Literal[2]], 16), ('ugpuFreeMemory', c.Array[NvU64, Literal[2]], 32)]) +NV2080_CTRL_FB_GET_UGPU_MEMORY_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_UGPU_MEMORY_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_CPU_COHERENT_RANGE_PARAMS(c.Struct): + SIZE = 16 + coherentCpuFbBase: int + coherentCpuFbEnd: int +struct_NV2080_CTRL_FB_GET_CPU_COHERENT_RANGE_PARAMS.register_fields([('coherentCpuFbBase', NvU64, 0), ('coherentCpuFbEnd', NvU64, 8)]) +NV2080_CTRL_FB_GET_CPU_COHERENT_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_CPU_COHERENT_RANGE_PARAMS +@c.record +class struct_NV2080_CTRL_FB_GET_WPR_REGION_INFO_PARAMS(c.Struct): + SIZE = 40 + wpr1Start: int + wpr1End: int + wpr2Start: int + wpr2End: int + fbRegionOfWpr2Start: int +struct_NV2080_CTRL_FB_GET_WPR_REGION_INFO_PARAMS.register_fields([('wpr1Start', NvU64, 0), ('wpr1End', NvU64, 8), ('wpr2Start', NvU64, 16), ('wpr2End', NvU64, 24), ('fbRegionOfWpr2Start', NvU64, 32)]) +NV2080_CTRL_FB_GET_WPR_REGION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FB_GET_WPR_REGION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + base: int + numEntries: int +struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS.register_fields([('hChannel', NvHandle, 0), ('base', NvU64, 8), ('numEntries', NvU32, 16)]) +NV2080_CTRL_CMD_SET_GPFIFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_SET_GPFIFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS(c.Struct): + SIZE = 8 + physChannelCount: int + physChannelCountInUse: int +struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS.register_fields([('physChannelCount', NvU32, 0), ('physChannelCountInUse', NvU32, 4)]) +NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS +NV2080_CTRL_FIFO_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS(c.Struct): + SIZE = 2056 + fifoInfoTblSize: int + fifoInfoTbl: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[256]] + engineType: int +struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS.register_fields([('fifoInfoTblSize', NvU32, 0), ('fifoInfoTbl', c.Array[NV2080_CTRL_FIFO_INFO, Literal[256]], 4), ('engineType', NvU32, 2052)]) +NV2080_CTRL_FIFO_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS(c.Struct): + SIZE = 4 + hChannel: int +struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS.register_fields([('hChannel', NvHandle, 0)]) +NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS(c.Struct): + SIZE = 536 + bDisable: int + numChannels: int + bOnlyDisableScheduling: int + bRewindGpPut: int + pRunlistPreemptEvent: ctypes.c_void_p + hClientList: c.Array[ctypes.c_uint32, Literal[64]] + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS.register_fields([('bDisable', NvBool, 0), ('numChannels', NvU32, 4), ('bOnlyDisableScheduling', NvBool, 8), ('bRewindGpPut', NvBool, 9), ('pRunlistPreemptEvent', NvP64, 16), ('hClientList', c.Array[NvHandle, Literal[64]], 24), ('hChannelList', c.Array[NvHandle, Literal[64]], 280)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_MEM_INFO(c.Struct): + SIZE = 24 + aperture: int + base: int + size: int +struct_NV2080_CTRL_FIFO_MEM_INFO.register_fields([('aperture', NvU32, 0), ('base', NvU64, 8), ('size', NvU64, 16)]) +NV2080_CTRL_FIFO_MEM_INFO: TypeAlias = struct_NV2080_CTRL_FIFO_MEM_INFO +@c.record +class struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO(c.Struct): + SIZE = 104 + inst: struct_NV2080_CTRL_FIFO_MEM_INFO + ramfc: struct_NV2080_CTRL_FIFO_MEM_INFO + methodBuf: c.Array[struct_NV2080_CTRL_FIFO_MEM_INFO, Literal[2]] + methodBufCount: int +struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO.register_fields([('inst', NV2080_CTRL_FIFO_MEM_INFO, 0), ('ramfc', NV2080_CTRL_FIFO_MEM_INFO, 24), ('methodBuf', c.Array[NV2080_CTRL_FIFO_MEM_INFO, Literal[2]], 48), ('methodBufCount', NvU32, 96)]) +NV2080_CTRL_FIFO_CHANNEL_MEM_INFO: TypeAlias = struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO +@c.record +class struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS(c.Struct): + SIZE = 112 + hChannel: int + chMemInfo: struct_NV2080_CTRL_FIFO_CHANNEL_MEM_INFO +struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS.register_fields([('hChannel', NvHandle, 0), ('chMemInfo', NV2080_CTRL_FIFO_CHANNEL_MEM_INFO, 8)]) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS(c.Struct): + SIZE = 8 + aperture: int + attribute: int +struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS.register_fields([('aperture', NvU32, 0), ('attribute', NvU32, 4)]) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY(c.Struct): + SIZE = 120 + timestampNs: int + timeRunTotalNs: int + timeRunNs: int + swrlId: int + targetTimeSlice: int + cumulativePreemptionTime: int + cumulativeIdleTime: int + weight: int + counters: c.Array[ctypes.c_uint64, Literal[8]] +NvS64: TypeAlias = ctypes.c_int64 +struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY.register_fields([('timestampNs', NvU64, 0), ('timeRunTotalNs', NvS64, 8), ('timeRunNs', NvU32, 16), ('swrlId', NvU32, 20), ('targetTimeSlice', NvU32, 24), ('cumulativePreemptionTime', NvU64, 32), ('cumulativeIdleTime', NvU64, 40), ('weight', NvU32, 48), ('counters', c.Array[NvU64, Literal[8]], 56)]) +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS(c.Struct): + SIZE = 24024 + engineId: int + count: int + entry: c.Array[struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY, Literal[200]] + schedPolicy: int + arrEnabled: int + arrAvgFactor: int + targetTimesliceNs: int +struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS.register_fields([('engineId', NvU32, 0), ('count', NvU32, 4), ('entry', c.Array[NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRY, Literal[200]], 8), ('schedPolicy', NvU32, 24008), ('arrEnabled', NvU32, 24012), ('arrAvgFactor', NvU32, 24016), ('targetTimesliceNs', NvU32, 24020)]) +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS(c.Struct): + SIZE = 8 + timeout: int + bEnable: int +struct_NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS.register_fields([('timeout', NvU32, 0), ('bEnable', NvBool, 4)]) +NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DEVICE_ENTRY(c.Struct): + SIZE = 100 + engineData: c.Array[ctypes.c_uint32, Literal[16]] + pbdmaIds: c.Array[ctypes.c_uint32, Literal[2]] + pbdmaFaultIds: c.Array[ctypes.c_uint32, Literal[2]] + numPbdmas: int + engineName: c.Array[ctypes.c_char, Literal[16]] +struct_NV2080_CTRL_FIFO_DEVICE_ENTRY.register_fields([('engineData', c.Array[NvU32, Literal[16]], 0), ('pbdmaIds', c.Array[NvU32, Literal[2]], 64), ('pbdmaFaultIds', c.Array[NvU32, Literal[2]], 72), ('numPbdmas', NvU32, 80), ('engineName', c.Array[ctypes.c_char, Literal[16]], 84)]) +NV2080_CTRL_FIFO_DEVICE_ENTRY: TypeAlias = struct_NV2080_CTRL_FIFO_DEVICE_ENTRY +@c.record +class struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS(c.Struct): + SIZE = 3212 + baseIndex: int + numEntries: int + bMore: int + entries: c.Array[struct_NV2080_CTRL_FIFO_DEVICE_ENTRY, Literal[32]] +struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS.register_fields([('baseIndex', NvU32, 0), ('numEntries', NvU32, 4), ('bMore', NvBool, 8), ('entries', c.Array[NV2080_CTRL_FIFO_DEVICE_ENTRY, Literal[32]], 12)]) +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS(c.Struct): + SIZE = 12 + engineType: int + vChid: int + faultType: int +struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS.register_fields([('engineType', NvU32, 0), ('vChid', NvU32, 4), ('faultType', NvU32, 8)]) +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS(c.Struct): + SIZE = 8 + flags: int + schedPolicy: int +struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS.register_fields([('flags', NvU32, 0), ('schedPolicy', NvU32, 4)]) +NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS(c.Struct): + SIZE = 32 + hClient: int + hChannel: int + hUserdMemory: int + gpFifoEntries: int + gpFifoOffset: int + userdOffset: int +struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('hUserdMemory', NvHandle, 8), ('gpFifoEntries', NvU32, 12), ('gpFifoOffset', NvU64, 16), ('userdOffset', NvU64, 24)]) +NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + addressSpace: int + cacheAttrib: int +struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('addressSpace', NvU32, 16), ('cacheAttrib', NvU32, 20)]) +NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS(c.Struct): + SIZE = 516 + runlistId: int + bitMask: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS.register_fields([('runlistId', NvU32, 0), ('bitMask', c.Array[NvU32, Literal[128]], 4)]) +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS(c.Struct): + SIZE = 520 + numChannels: int + hClientList: c.Array[ctypes.c_uint32, Literal[64]] + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] + bEnableAfterKeyRotation: int +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS.register_fields([('numChannels', NvU32, 0), ('hClientList', c.Array[NvHandle, Literal[64]], 4), ('hChannelList', c.Array[NvHandle, Literal[64]], 260), ('bEnableAfterKeyRotation', NvBool, 516)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS(c.Struct): + SIZE = 264 + numChannels: int + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] + bEnableAfterKeyRotation: int +struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS.register_fields([('numChannels', NvU32, 0), ('hChannelList', c.Array[NvHandle, Literal[64]], 4), ('bEnableAfterKeyRotation', NvBool, 260)]) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_FIFO_ROTATE_KEYS_PARAMS(c.Struct): + SIZE = 520 + numChannels: int + hClientList: c.Array[ctypes.c_uint32, Literal[64]] + hChannelList: c.Array[ctypes.c_uint32, Literal[64]] + bEnableAfterKeyRotation: int +struct_NV2080_CTRL_CMD_FIFO_ROTATE_KEYS_PARAMS.register_fields([('numChannels', NvU32, 0), ('hClientList', c.Array[NvHandle, Literal[64]], 4), ('hChannelList', c.Array[NvHandle, Literal[64]], 260), ('bEnableAfterKeyRotation', NvBool, 516)]) +NV2080_CTRL_CMD_FIFO_ROTATE_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_ROTATE_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS(c.Struct): + SIZE = 20 + engineId: int + schedPolicy: int + arrEnabled: int + targetTimesliceNs: int + arrAvgFactor: int +struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS.register_fields([('engineId', NvU32, 0), ('schedPolicy', NvU32, 4), ('arrEnabled', NvU32, 8), ('targetTimesliceNs', NvU32, 12), ('arrAvgFactor', NvU32, 16)]) +NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS(c.Struct): + SIZE = 24 + engineId: int + schedPolicy: int + enableArr: int + timesliceTargetNs: int + frequencyForARR: int + avgFactorForARR: int +struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS.register_fields([('engineId', NvU32, 0), ('schedPolicy', NvU32, 4), ('enableArr', NvU32, 8), ('timesliceTargetNs', NvU32, 12), ('frequencyForARR', NvU32, 16), ('avgFactorForARR', NvU32, 20)]) +NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS(c.Struct): + SIZE = 44 + engineId: int + supportedSchedulers: c.Array[ctypes.c_uint32, Literal[3]] + bIsArrModeSupported: int + maxTimesliceNs: int + minTimesliceNs: int + maxFrequencyForARR: int + minFrequencyForARR: int + maxAvgFactorForARR: int + minAvgFactorForARR: int +struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS.register_fields([('engineId', NvU32, 0), ('supportedSchedulers', c.Array[NvU32, Literal[3]], 4), ('bIsArrModeSupported', NvBool, 16), ('maxTimesliceNs', NvU32, 20), ('minTimesliceNs', NvU32, 24), ('maxFrequencyForARR', NvU32, 28), ('minFrequencyForARR', NvU32, 32), ('maxAvgFactorForARR', NvU32, 36), ('minAvgFactorForARR', NvU32, 40)]) +NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS(c.Struct): + SIZE = 1552 + hClient: int + hChannelOrTsg: int + tsgId: int + numChannels: int + channelUniqueID: c.Array[ctypes.c_uint32, Literal[128]] + vasUniqueID: c.Array[ctypes.c_uint32, Literal[128]] + veid: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannelOrTsg', NvHandle, 4), ('tsgId', NvU32, 8), ('numChannels', NvU32, 12), ('channelUniqueID', c.Array[NvU32, Literal[128]], 16), ('vasUniqueID', c.Array[NvU32, Literal[128]], 528), ('veid', c.Array[NvU32, Literal[128]], 1040)]) +NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS(c.Struct): + SIZE = 1540 + hClients: c.Array[ctypes.c_uint32, Literal[128]] + hChannels: c.Array[ctypes.c_uint32, Literal[128]] + numChannels: int + channelUniqueIDs: c.Array[ctypes.c_uint32, Literal[128]] +struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS.register_fields([('hClients', c.Array[NvHandle, Literal[128]], 0), ('hChannels', c.Array[NvHandle, Literal[128]], 512), ('numChannels', NvU32, 1024), ('channelUniqueIDs', c.Array[NvU32, Literal[128]], 1028)]) +NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_RANGE_PARAMS(c.Struct): + SIZE = 24 + base: int + size: int + mode: int + hVASpace: int +struct_NV2080_CTRL_FLA_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8), ('mode', NvU32, 16), ('hVASpace', NvHandle, 20)]) +NV2080_CTRL_FLA_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_RANGE_PARAMS +enum_NV2080_CTRL_FLA_ADDRSPACE: dict[int, str] = {(NV2080_CTRL_FLA_ADDRSPACE_SYSMEM:=0): 'NV2080_CTRL_FLA_ADDRSPACE_SYSMEM', (NV2080_CTRL_FLA_ADDRSPACE_FBMEM:=1): 'NV2080_CTRL_FLA_ADDRSPACE_FBMEM'} +NV2080_CTRL_FLA_ADDRSPACE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_FLA_ACTION: dict[int, str] = {(NV2080_CTRL_FLA_ACTION_BIND:=0): 'NV2080_CTRL_FLA_ACTION_BIND', (NV2080_CTRL_FLA_ACTION_UNBIND:=1): 'NV2080_CTRL_FLA_ACTION_UNBIND'} +NV2080_CTRL_FLA_ACTION: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS(c.Struct): + SIZE = 16 + imbPhysAddr: int + addrSpace: int + flaAction: int +struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS.register_fields([('imbPhysAddr', NvU64, 0), ('addrSpace', NV2080_CTRL_FLA_ADDRSPACE, 8), ('flaAction', NV2080_CTRL_FLA_ACTION, 12)]) +NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS(c.Struct): + SIZE = 16 + base: int + size: int +struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS.register_fields([('base', NvU64, 0), ('size', NvU64, 8)]) +NV2080_CTRL_FLA_GET_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_GET_RANGE_PARAMS +@c.record +class struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS(c.Struct): + SIZE = 16 + totalSize: int + freeSize: int +struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS.register_fields([('totalSize', NvU64, 0), ('freeSize', NvU64, 8)]) +NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS(c.Struct): + SIZE = 12 + flcnID: int + heapSize: int + heapFree: int +struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS.register_fields([('flcnID', NvU32, 0), ('heapSize', NvU32, 4), ('heapFree', NvU32, 8)]) +NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS(c.Struct): + SIZE = 8 + engine: int + engineArch: int +struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS.register_fields([('engine', NvU32, 0), ('engineArch', NvU32, 4)]) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER(c.Struct): + SIZE = 36 + mask: c.Array[ctypes.c_ubyte, Literal[36]] +struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER.register_fields([('mask', c.Array[NvU8, Literal[36]], 0)]) +NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS(c.Struct): + SIZE = 24 + engine: int + pageSize: int + offset: int + size: int + queueFeatureId: int +NvUPtr: TypeAlias = ctypes.c_uint64 +struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS.register_fields([('engine', NvU32, 0), ('pageSize', NvU32, 4), ('offset', NvUPtr, 8), ('size', NvU32, 16), ('queueFeatureId', NvU8, 20)]) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS(c.Struct): + SIZE = 44 + engine: int + eventFilter: struct_NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER + queueId: int +struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS.register_fields([('engine', NvU32, 0), ('eventFilter', NV2080_CTRL_FLCN_USTREAMER_EVENT_FILTER, 4), ('queueId', NvU8, 40)]) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +NV2080_CTRL_FLCN_USTREAMER_CONTROL_GET_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +NV2080_CTRL_FLCN_USTREAMER_CONTROL_SET_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_USTREAMER_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 80 + hUserClient: int + hChannel: int + alignment: int + size: int + bufferHandle: ctypes.c_void_p + pageCount: int + physAddr: int + aperture: int + kind: int + pageSize: int + bIsContigous: int + bDeviceDescendant: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('alignment', NvU64, 8), ('size', NvU64, 16), ('bufferHandle', NvP64, 24), ('pageCount', NvU64, 32), ('physAddr', NvU64, 40), ('aperture', NvU32, 48), ('kind', NvU32, 52), ('pageSize', NvU32, 56), ('bIsContigous', NvBool, 60), ('bDeviceDescendant', NvBool, 61), ('uuid', c.Array[NvU8, Literal[16]], 62)]) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + totalBufferSize: int +struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('totalBufferSize', NvU64, 8)]) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + bInput: int +struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS.register_fields([('gpioPin', NvU32, 0), ('bInput', NvBool, 4)]) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + value: int +struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS.register_fields([('gpioPin', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS(c.Struct): + SIZE = 8 + gpioPin: int + value: int +struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS.register_fields([('gpioPin', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS(c.Struct): + SIZE = 8 + function: int + pin: int +struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS.register_fields([('function', NvU32, 0), ('pin', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS +NV2080_CTRL_GPU_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + gpuInfoListSize: int + gpuInfoList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_INFO_PARAMS.register_fields([('gpuInfoListSize', NvU32, 0), ('gpuInfoList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS(c.Struct): + SIZE = 580 + gpuInfoListSize: int + gpuInfoList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[72]] +struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS.register_fields([('gpuInfoListSize', NvU32, 0), ('gpuInfoList', c.Array[NV2080_CTRL_GPU_INFO, Literal[72]], 4)]) +NV2080_CTRL_GPU_GET_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS(c.Struct): + SIZE = 68 + gpuNameStringFlags: int + gpuNameString: struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString +@c.record +class struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString(c.Struct): + SIZE = 64 + ascii: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString.register_fields([('ascii', c.Array[NvU8, Literal[64]], 0)]) +struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS.register_fields([('gpuNameStringFlags', NvU32, 0), ('gpuNameString', struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_gpuNameString, 4)]) +NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS(c.Struct): + SIZE = 64 + gpuShortNameString: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS.register_fields([('gpuShortNameString', c.Array[NvU8, Literal[64]], 0)]) +NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_POWER_PARAMS(c.Struct): + SIZE = 12 + target: int + newLevel: int + oldLevel: int +struct_NV2080_CTRL_GPU_SET_POWER_PARAMS.register_fields([('target', NvU32, 0), ('newLevel', NvU32, 4), ('oldLevel', NvU32, 8)]) +NV2080_CTRL_GPU_SET_POWER_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_POWER_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SDM_PARAMS(c.Struct): + SIZE = 4 + subdeviceMask: int +struct_NV2080_CTRL_GPU_GET_SDM_PARAMS.register_fields([('subdeviceMask', NvU32, 0)]) +NV2080_CTRL_GPU_GET_SDM_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SDM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_SDM_PARAMS(c.Struct): + SIZE = 4 + subdeviceMask: int +struct_NV2080_CTRL_GPU_SET_SDM_PARAMS.register_fields([('subdeviceMask', NvU32, 0)]) +NV2080_CTRL_GPU_SET_SDM_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_SDM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS(c.Struct): + SIZE = 4 + type: int +struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS.register_fields([('type', NvU32, 0)]) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_REG_OP(c.Struct): + SIZE = 32 + regOp: int + regType: int + regStatus: int + regQuad: int + regGroupMask: int + regSubGroupMask: int + regOffset: int + regValueHi: int + regValueLo: int + regAndNMaskHi: int + regAndNMaskLo: int +struct_NV2080_CTRL_GPU_REG_OP.register_fields([('regOp', NvU8, 0), ('regType', NvU8, 1), ('regStatus', NvU8, 2), ('regQuad', NvU8, 3), ('regGroupMask', NvU32, 4), ('regSubGroupMask', NvU32, 8), ('regOffset', NvU32, 12), ('regValueHi', NvU32, 16), ('regValueLo', NvU32, 20), ('regAndNMaskHi', NvU32, 24), ('regAndNMaskLo', NvU32, 28)]) +NV2080_CTRL_GPU_REG_OP: TypeAlias = struct_NV2080_CTRL_GPU_REG_OP +@c.record +class struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 48 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + reserved00: c.Array[ctypes.c_uint32, Literal[2]] + regOpCount: int + regOps: ctypes.c_void_p + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +NV2080_CTRL_GR_ROUTE_INFO: TypeAlias = struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('reserved00', c.Array[NvU32, Literal[2]], 12), ('regOpCount', NvU32, 20), ('regOps', NvP64, 24), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 32)]) +NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS(c.Struct): + SIZE = 16 + engineCount: int + engineList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS(c.Struct): + SIZE = 340 + engineCount: int + engineList: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', c.Array[NvU32, Literal[84]], 4)]) +NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS(c.Struct): + SIZE = 16 + engineType: int + numClasses: int + classList: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS.register_fields([('engineType', NvU32, 0), ('numClasses', NvU32, 4), ('classList', NvP64, 8)]) +NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS(c.Struct): + SIZE = 12 + engineType: int + mmuFaultId: int + bSubcontextSupported: int +struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS.register_fields([('engineType', NvU32, 0), ('mmuFaultId', NvU32, 4), ('bSubcontextSupported', NvBool, 8)]) +NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY(c.Struct): + SIZE = 32 + gpuPhysAddr: int + gpuVirtAddr: int + size: int + physAttr: int + bufferId: int + bInitialize: int + bNonmapped: int +struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY.register_fields([('gpuPhysAddr', NvU64, 0), ('gpuVirtAddr', NvU64, 8), ('size', NvU64, 16), ('physAttr', NvU32, 24), ('bufferId', NvU16, 28), ('bInitialize', NvU8, 30), ('bNonmapped', NvU8, 31)]) +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY: TypeAlias = struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY +@c.record +class struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS(c.Struct): + SIZE = 560 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int + hVirtMemory: int + virtAddress: int + size: int + entryCount: int + promoteEntry: c.Array[struct_NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY, Literal[16]] +struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16), ('hVirtMemory', NvHandle, 20), ('virtAddress', NvU64, 24), ('size', NvU64, 32), ('entryCount', NvU32, 40), ('promoteEntry', c.Array[NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY, Literal[16]], 48)]) +NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS +PNV2080_CTRL_GPU_PROMOTE_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS(c.Struct): + SIZE = 20 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int +struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16)]) +NV2080_CTRL_GPU_EVICT_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS +PNV2080_CTRL_GPU_EVICT_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_EVICT_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS(c.Struct): + SIZE = 56 + engineType: int + hClient: int + ChID: int + hChanClient: int + hObject: int + hVirtMemory: int + physAddress: int + physAttr: int + hDmaHandle: int + index: int + size: int +struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS.register_fields([('engineType', NvU32, 0), ('hClient', NvHandle, 4), ('ChID', NvU32, 8), ('hChanClient', NvHandle, 12), ('hObject', NvHandle, 16), ('hVirtMemory', NvHandle, 20), ('physAddress', NvU64, 24), ('physAttr', NvU32, 32), ('hDmaHandle', NvHandle, 36), ('index', NvU32, 40), ('size', NvU64, 48)]) +NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS +PNV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS: TypeAlias = c.POINTER[struct_NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS] +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS(c.Struct): + SIZE = 4 + eccIntrStatus: int +struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS.register_fields([('eccIntrStatus', NvU32, 0)]) +NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_INTR_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS(c.Struct): + SIZE = 8 + count: int +struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS.register_fields([('count', NvU64, 0)]) +NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS(c.Struct): + SIZE = 40 + enabled: int + scrubComplete: int + supported: int + dbe: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + dbeNonResettable: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + sbe: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS + sbeNonResettable: struct_NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS +struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS.register_fields([('enabled', NvBool, 0), ('scrubComplete', NvBool, 1), ('supported', NvBool, 2), ('dbe', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 8), ('dbeNonResettable', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 16), ('sbe', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 24), ('sbeNonResettable', NV2080_CTRL_GPU_QUERY_ECC_EXCEPTION_STATUS, 32)]) +NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS(c.Struct): + SIZE = 1664 + units: c.Array[struct_NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS, Literal[41]] + bFatalPoisonError: int + uncorrectableError: int + flags: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS.register_fields([('units', c.Array[NV2080_CTRL_GPU_QUERY_ECC_UNIT_STATUS, Literal[41]], 0), ('bFatalPoisonError', NvBool, 1640), ('uncorrectableError', NvU8, 1641), ('flags', NvU32, 1644), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 1648)]) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS(c.Struct): + SIZE = 8 + rules: int + flags: int +struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS.register_fields([('rules', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS(c.Struct): + SIZE = 4 + rules: int +struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS.register_fields([('rules', NvU32, 0)]) +NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS(c.Struct): + SIZE = 8 + currentConfiguration: int + defaultConfiguration: int +struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS.register_fields([('currentConfiguration', NvU32, 0), ('defaultConfiguration', NvU32, 4)]) +NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS(c.Struct): + SIZE = 4 + newConfiguration: int +struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS.register_fields([('newConfiguration', NvU32, 0)]) +NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS(c.Struct): + SIZE = 8 + statuses: int + flags: int +struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS.register_fields([('statuses', NvU32, 0), ('flags', NvU8, 4)]) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS(c.Struct): + SIZE = 4 + gpcMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS.register_fields([('gpcMask', NvU32, 0)]) +NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('tpcMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + zcullMask: int +struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('zcullMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS(c.Struct): + SIZE = 136 + buildDate: int + marketingName: c.Array[ctypes.c_ubyte, Literal[24]] + serialNumber: c.Array[ctypes.c_ubyte, Literal[16]] + memoryManufacturer: int + memoryPartID: c.Array[ctypes.c_ubyte, Literal[20]] + memoryDateCode: c.Array[ctypes.c_ubyte, Literal[6]] + productPartNumber: c.Array[ctypes.c_ubyte, Literal[20]] + boardRevision: c.Array[ctypes.c_ubyte, Literal[3]] + boardType: int + board699PartNumber: c.Array[ctypes.c_ubyte, Literal[20]] + board965PartNumber: c.Array[ctypes.c_ubyte, Literal[20]] +struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS.register_fields([('buildDate', NvU32, 0), ('marketingName', c.Array[NvU8, Literal[24]], 4), ('serialNumber', c.Array[NvU8, Literal[16]], 28), ('memoryManufacturer', NvU8, 44), ('memoryPartID', c.Array[NvU8, Literal[20]], 45), ('memoryDateCode', c.Array[NvU8, Literal[6]], 65), ('productPartNumber', c.Array[NvU8, Literal[20]], 71), ('boardRevision', c.Array[NvU8, Literal[3]], 91), ('boardType', NvU8, 94), ('board699PartNumber', c.Array[NvU8, Literal[20]], 95), ('board965PartNumber', c.Array[NvU8, Literal[20]], 115)]) +NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ID_PARAMS(c.Struct): + SIZE = 4 + gpuId: int +struct_NV2080_CTRL_GPU_GET_ID_PARAMS.register_fields([('gpuId', NvU32, 0)]) +NV2080_CTRL_GPU_GET_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS(c.Struct): + SIZE = 4 + currentMode: int +struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS.register_fields([('currentMode', NvU32, 0)]) +NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS(c.Struct): + SIZE = 144 + engineType: int + partnershipClassId: int + runqueue: int + numPartners: int + partnerList: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS.register_fields([('engineType', NvU32, 0), ('partnershipClassId', NvU32, 4), ('runqueue', NvU32, 8), ('numPartners', NvU32, 12), ('partnerList', c.Array[NvU32, Literal[32]], 16)]) +NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS(c.Struct): + SIZE = 268 + index: int + flags: int + length: int + data: c.Array[ctypes.c_ubyte, Literal[256]] +struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS.register_fields([('index', NvU32, 0), ('flags', NvU32, 4), ('length', NvU32, 8), ('data', c.Array[NvU8, Literal[256]], 12)]) +NV2080_CTRL_GPU_GET_GID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS(c.Struct): + SIZE = 5 + objectType: c.Array[ctypes.c_char, Literal[3]] + version: int + subversion: int +struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS.register_fields([('objectType', c.Array[ctypes.c_char, Literal[3]], 0), ('version', NvU8, 3), ('subversion', NvU8, 4)]) +NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS(c.Struct): + SIZE = 1 + isOptimusEnabled: int +struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS.register_fields([('isOptimusEnabled', NvBool, 0)]) +NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS(c.Struct): + SIZE = 8 + targetEngine: int + ipVersion: int +struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS.register_fields([('targetEngine', NvU32, 0), ('ipVersion', NvU32, 4)]) +NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS(c.Struct): + SIZE = 8 + attribute: int + bSupported: int +struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS.register_fields([('attribute', NvU32, 0), ('bSupported', NvBool, 4)]) +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS(c.Struct): + SIZE = 8 + attribute: int + value: int +struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS.register_fields([('attribute', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_CMD_GPU_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +NV2080_CTRL_GPU_GET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +NV2080_CTRL_GPU_SET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_ILLUM_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS(c.Struct): + SIZE = 16 + version: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS.register_fields([('version', c.Array[NvU8, Literal[16]], 0)]) +NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS(c.Struct): + SIZE = 8 + fwVersion: int + oemVersion: int + siliconRevision: int + hwbcResourceType: int +struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS.register_fields([('fwVersion', NvU32, 0), ('oemVersion', NvU8, 4), ('siliconRevision', NvU8, 5), ('hwbcResourceType', NvU8, 6)]) +NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS(c.Struct): + SIZE = 1204 + bridgeCount: int + hPhysicalBridges: c.Array[ctypes.c_uint32, Literal[100]] + bridgeList: c.Array[struct_NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS, Literal[100]] +struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS.register_fields([('bridgeCount', NvU8, 0), ('hPhysicalBridges', c.Array[NvHandle, Literal[100]], 4), ('bridgeList', c.Array[NV2080_CTRL_GPU_PHYSICAL_BRIDGE_VERSION_PARAMS, Literal[100]], 404)]) +NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS(c.Struct): + SIZE = 16 + bus: int + device: int + func: int + oemVersion: int + siliconRevision: int + hwbcResourceType: int + domain: int + fwVersion: int +struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS.register_fields([('bus', NvU8, 0), ('device', NvU8, 1), ('func', NvU8, 2), ('oemVersion', NvU8, 3), ('siliconRevision', NvU8, 4), ('hwbcResourceType', NvU8, 5), ('domain', NvU32, 8), ('fwVersion', NvU32, 12)]) +NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS(c.Struct): + SIZE = 2004 + bridgeCount: int + physicalBridgeIds: c.Array[ctypes.c_uint32, Literal[100]] + bridgeList: c.Array[struct_NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS, Literal[100]] +struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS.register_fields([('bridgeCount', NvU8, 0), ('physicalBridgeIds', c.Array[NvU32, Literal[100]], 4), ('bridgeList', c.Array[NV2080_CTRL_GPU_BRIDGE_VERSION_PARAMS, Literal[100]], 404)]) +NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS(c.Struct): + SIZE = 24 + scrubberStatus: int + remainingTimeMs: int + scrubStartAddr: int + scrubEndAddr: int +struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS.register_fields([('scrubberStatus', NvU32, 0), ('remainingTimeMs', NvU32, 4), ('scrubStartAddr', NvU64, 8), ('scrubEndAddr', NvU64, 16)]) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS(c.Struct): + SIZE = 16 + minStartAddr: int + maxEndAddr: int +struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS.register_fields([('minStartAddr', NvU64, 0), ('maxEndAddr', NvU64, 8)]) +NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS(c.Struct): + SIZE = 56 + gpcId: int + numPesInGpc: int + activePesMask: int + maxTpcPerGpcCount: int + tpcToPesMap: c.Array[ctypes.c_uint32, Literal[10]] +struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS.register_fields([('gpcId', NvU32, 0), ('numPesInGpc', NvU32, 4), ('activePesMask', NvU32, 8), ('maxTpcPerGpcCount', NvU32, 12), ('tpcToPesMap', c.Array[NvU32, Literal[10]], 16)]) +NV2080_CTRL_GPU_GET_PES_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PES_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS(c.Struct): + SIZE = 504 + oemInfo: c.Array[ctypes.c_ubyte, Literal[504]] +struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS.register_fields([('oemInfo', c.Array[NvU8, Literal[504]], 0)]) +NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS +enum_NV2080_CTRL_VPR_INFO_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_VPR_CAPS:=0): 'NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_VPR_CAPS', (NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_CUR_VPR_RANGE:=1): 'NV2080_CTRL_GPU_GET_VPR_INFO_QUERY_CUR_VPR_RANGE'} +NV2080_CTRL_VPR_INFO_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS(c.Struct): + SIZE = 24 + queryType: int + bIsVprEnabled: int + vprStartAddressInBytes: int + vprEndAddressInBytes: int +struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS.register_fields([('queryType', NV2080_CTRL_VPR_INFO_QUERY_TYPE, 0), ('bIsVprEnabled', NvBool, 4), ('vprStartAddressInBytes', NvU64, 8), ('vprEndAddressInBytes', NvU64, 16)]) +NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS +enum_NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_H264:=0): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_H264', (NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_HEVC:=1): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_HEVC', (NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_AV1:=2): 'NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_AV1'} +NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS(c.Struct): + SIZE = 8 + queryType: int + encoderCapacity: int +struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS.register_fields([('queryType', NV2080_CTRL_ENCODER_CAPACITY_QUERY_TYPE, 0), ('encoderCapacity', NvU32, 4)]) +NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS(c.Struct): + SIZE = 12 + encoderSessionCount: int + averageEncodeFps: int + averageEncodeLatency: int +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS.register_fields([('encoderSessionCount', NvU32, 0), ('averageEncodeFps', NvU32, 4), ('averageEncodeLatency', NvU32, 8)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_NVENC_SW_SESSION_INFO(c.Struct): + SIZE = 32 + processId: int + subProcessId: int + sessionId: int + codecType: int + hResolution: int + vResolution: int + averageEncodeFps: int + averageEncodeLatency: int +struct_NV2080_CTRL_NVENC_SW_SESSION_INFO.register_fields([('processId', NvU32, 0), ('subProcessId', NvU32, 4), ('sessionId', NvU32, 8), ('codecType', NvU32, 12), ('hResolution', NvU32, 16), ('vResolution', NvU32, 20), ('averageEncodeFps', NvU32, 24), ('averageEncodeLatency', NvU32, 28)]) +NV2080_CTRL_NVENC_SW_SESSION_INFO: TypeAlias = struct_NV2080_CTRL_NVENC_SW_SESSION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS(c.Struct): + SIZE = 16 + sessionInfoTblEntry: int + sessionInfoTbl: ctypes.c_void_p +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS.register_fields([('sessionInfoTblEntry', NvU32, 0), ('sessionInfoTbl', NvP64, 8)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS(c.Struct): + SIZE = 8 + fabricBaseAddr: int +struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS.register_fields([('fabricBaseAddr', NvU64, 0)]) +NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS(c.Struct): + SIZE = 4 + handle: int +struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS.register_fields([('handle', NvU32, 0)]) +NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS(c.Struct): + SIZE = 12 + statusMask: int + xusbData: int + ppcData: int +struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS.register_fields([('statusMask', NvU32, 0), ('xusbData', NvU32, 4), ('ppcData', NvU32, 8)]) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_PARTITION_SPAN(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_GPU_PARTITION_SPAN.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_GPU_PARTITION_SPAN: TypeAlias = struct_NV2080_CTRL_GPU_PARTITION_SPAN +@c.record +class struct_NV2080_CTRL_EXEC_PARTITION_SPAN(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_EXEC_PARTITION_SPAN.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_EXEC_PARTITION_SPAN: TypeAlias = struct_NV2080_CTRL_EXEC_PARTITION_SPAN +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITION_INFO(c.Struct): + SIZE = 48 + swizzId: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] + partitionFlag: int + bValid: int + placement: struct_NV2080_CTRL_GPU_PARTITION_SPAN +struct_NV2080_CTRL_GPU_SET_PARTITION_INFO.register_fields([('swizzId', NvU32, 0), ('uuid', c.Array[NvU8, Literal[16]], 4), ('partitionFlag', NvU32, 20), ('bValid', NvBool, 24), ('placement', NV2080_CTRL_GPU_PARTITION_SPAN, 32)]) +NV2080_CTRL_GPU_SET_PARTITION_INFO: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITION_INFO +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS(c.Struct): + SIZE = 392 + partitionCount: int + partitionInfo: c.Array[struct_NV2080_CTRL_GPU_SET_PARTITION_INFO, Literal[8]] +struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS.register_fields([('partitionCount', NvU32, 0), ('partitionInfo', c.Array[NV2080_CTRL_GPU_SET_PARTITION_INFO, Literal[8]], 8)]) +NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITION_INFO(c.Struct): + SIZE = 232 + swizzId: int + partitionFlag: int + grEngCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + gpcsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + virtualGpcsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + gfxGpcPerGr: c.Array[ctypes.c_uint32, Literal[8]] + veidsPerGr: c.Array[ctypes.c_uint32, Literal[8]] + memSize: int + span: struct_NV2080_CTRL_GPU_PARTITION_SPAN + bValid: int + bPartitionError: int + validCTSIdMask: int + validGfxCTSIdMask: int +struct_NV2080_CTRL_GPU_GET_PARTITION_INFO.register_fields([('swizzId', NvU32, 0), ('partitionFlag', NvU32, 4), ('grEngCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16), ('ceCount', NvU32, 20), ('nvEncCount', NvU32, 24), ('nvDecCount', NvU32, 28), ('nvJpgCount', NvU32, 32), ('nvOfaCount', NvU32, 36), ('gpcCount', NvU32, 40), ('virtualGpcCount', NvU32, 44), ('gfxGpcCount', NvU32, 48), ('gpcsPerGr', c.Array[NvU32, Literal[8]], 52), ('virtualGpcsPerGr', c.Array[NvU32, Literal[8]], 84), ('gfxGpcPerGr', c.Array[NvU32, Literal[8]], 116), ('veidsPerGr', c.Array[NvU32, Literal[8]], 148), ('memSize', NvU64, 184), ('span', NV2080_CTRL_GPU_PARTITION_SPAN, 192), ('bValid', NvBool, 208), ('bPartitionError', NvBool, 209), ('validCTSIdMask', NvU64, 216), ('validGfxCTSIdMask', NvU64, 224)]) +NV2080_CTRL_GPU_GET_PARTITION_INFO: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS(c.Struct): + SIZE = 1864 + queryPartitionInfo: c.Array[struct_NV2080_CTRL_GPU_GET_PARTITION_INFO, Literal[8]] + validPartitionCount: int + bGetAllPartitionInfo: int +struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS.register_fields([('queryPartitionInfo', c.Array[NV2080_CTRL_GPU_GET_PARTITION_INFO, Literal[8]], 0), ('validPartitionCount', NvU32, 1856), ('bGetAllPartitionInfo', NvBool, 1860)]) +NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS(c.Struct): + SIZE = 44 + swizzId: int + gpcCountPerSmcEng: c.Array[ctypes.c_uint32, Literal[8]] + updateSmcEngMask: int + bUseAllGPCs: int +struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS.register_fields([('swizzId', NvU32, 0), ('gpcCountPerSmcEng', c.Array[NvU32, Literal[8]], 4), ('updateSmcEngMask', NvU32, 36), ('bUseAllGPCs', NvBool, 40)]) +NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_FAULT_PACKET(c.Struct): + SIZE = 32 + data: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV2080_CTRL_GPU_FAULT_PACKET.register_fields([('data', c.Array[NvU8, Literal[32]], 0)]) +NV2080_CTRL_GPU_FAULT_PACKET: TypeAlias = struct_NV2080_CTRL_GPU_FAULT_PACKET +@c.record +class struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS(c.Struct): + SIZE = 32 + faultPacket: struct_NV2080_CTRL_GPU_FAULT_PACKET +struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS.register_fields([('faultPacket', NV2080_CTRL_GPU_FAULT_PACKET, 0)]) +NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS +NV2080_CTRL_GPU_EXEC_REG_OPS_VGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS(c.Struct): + SIZE = 1008 + engineList: c.Array[ctypes.c_uint32, Literal[84]] + runlistPriBase: c.Array[ctypes.c_uint32, Literal[84]] + runlistId: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS.register_fields([('engineList', c.Array[NvU32, Literal[84]], 0), ('runlistPriBase', c.Array[NvU32, Literal[84]], 336), ('runlistId', c.Array[NvU32, Literal[84]], 672)]) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS(c.Struct): + SIZE = 672 + engineList: c.Array[ctypes.c_uint32, Literal[84]] + hwEngineID: c.Array[ctypes.c_uint32, Literal[84]] +struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS.register_fields([('engineList', c.Array[NvU32, Literal[84]], 0), ('hwEngineID', c.Array[NvU32, Literal[84]], 336)]) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS(c.Struct): + SIZE = 12 + sessionCount: int + averageFPS: int + averageLatency: int +struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS.register_fields([('sessionCount', NvU32, 0), ('averageFPS', NvU32, 4), ('averageLatency', NvU32, 8)]) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO(c.Struct): + SIZE = 52 + processId: int + subProcessId: int + vgpuInstanceId: int + sessionId: int + sessionType: int + displayOrdinal: int + sessionFlags: int + hMaxResolution: int + vMaxResolution: int + hResolution: int + vResolution: int + averageFPS: int + averageLatency: int +struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO.register_fields([('processId', NvU32, 0), ('subProcessId', NvU32, 4), ('vgpuInstanceId', NvU32, 8), ('sessionId', NvU32, 12), ('sessionType', NvU32, 16), ('displayOrdinal', NvU32, 20), ('sessionFlags', NvU32, 24), ('hMaxResolution', NvU32, 28), ('vMaxResolution', NvU32, 32), ('hResolution', NvU32, 36), ('vResolution', NvU32, 40), ('averageFPS', NvU32, 44), ('averageLatency', NvU32, 48)]) +NV2080_CTRL_NVFBC_SW_SESSION_INFO: TypeAlias = struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS(c.Struct): + SIZE = 13316 + sessionInfoCount: int + sessionInfoTbl: c.Array[struct_NV2080_CTRL_NVFBC_SW_SESSION_INFO, Literal[256]] +struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS.register_fields([('sessionInfoCount', NvU32, 0), ('sessionInfoTbl', c.Array[NV2080_CTRL_NVFBC_SW_SESSION_INFO, Literal[256]], 4)]) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS(c.Struct): + SIZE = 4 + firstAsyncCEIdx: int +struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS.register_fields([('firstAsyncCEIdx', NvU32, 0)]) +NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS(c.Struct): + SIZE = 8 + vmmuSegmentSize: int +struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS.register_fields([('vmmuSegmentSize', NvU64, 0)]) +NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS(c.Struct): + SIZE = 280 + partitionFlag: int + partitionCount: int + availableSpans: c.Array[struct_NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]] + availableSpansCount: int + totalPartitionCount: int + totalSpans: c.Array[struct_NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]] + totalSpansCount: int + bStaticInfo: int +struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('partitionCount', NvU32, 4), ('availableSpans', c.Array[NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]], 8), ('availableSpansCount', NvU32, 136), ('totalPartitionCount', NvU32, 140), ('totalSpans', c.Array[NV2080_CTRL_GPU_PARTITION_SPAN, Literal[8]], 144), ('totalSpansCount', NvU32, 272), ('bStaticInfo', NvBool, 276)]) +NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS +NV2080_CTRL_GPU_GET_CACHED_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS(c.Struct): + SIZE = 4 + partitioningMode: int +struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS.register_fields([('partitioningMode', NvU32, 0)]) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO(c.Struct): + SIZE = 64 + partitionFlag: int + grCount: int + gfxGrCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + memorySize: int +struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO.register_fields([('partitionFlag', NvU32, 0), ('grCount', NvU32, 4), ('gfxGrCount', NvU32, 8), ('gpcCount', NvU32, 12), ('virtualGpcCount', NvU32, 16), ('gfxGpcCount', NvU32, 20), ('veidCount', NvU32, 24), ('smCount', NvU32, 28), ('ceCount', NvU32, 32), ('nvEncCount', NvU32, 36), ('nvDecCount', NvU32, 40), ('nvJpgCount', NvU32, 44), ('nvOfaCount', NvU32, 48), ('memorySize', NvU64, 56)]) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO: TypeAlias = struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO +@c.record +class struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS(c.Struct): + SIZE = 5768 + descCount: int + partitionDescs: c.Array[struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO, Literal[90]] +struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS.register_fields([('descCount', NvU32, 0), ('partitionDescs', c.Array[NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_INFO, Literal[90]], 8)]) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS(c.Struct): + SIZE = 8 + maxSupportedPageSize: int +struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS.register_fields([('maxSupportedPageSize', NvU64, 0)]) +NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS(c.Struct): + SIZE = 24 + gpcId: int + count: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS.register_fields([('gpcId', NvU32, 0), ('count', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS(c.Struct): + SIZE = 40 + swizzId: c.Array[ctypes.c_uint32, Literal[9]] + partitionCount: int +struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS.register_fields([('swizzId', c.Array[NvU32, Literal[9]], 0), ('partitionCount', NvU32, 36)]) +NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS(c.Struct): + SIZE = 3812 + idType: int + id: int + pidTblCount: int + pidTbl: c.Array[ctypes.c_uint32, Literal[950]] +struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS.register_fields([('idType', NvU32, 0), ('id', NvU32, 4), ('pidTblCount', NvU32, 8), ('pidTbl', c.Array[NvU32, Literal[950]], 12)]) +NV2080_CTRL_GPU_GET_PIDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PIDS_PARAMS +@c.record +class struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO(c.Struct): + SIZE = 8 + computeInstanceId: int + gpuInstanceId: int +struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO.register_fields([('computeInstanceId', NvU32, 0), ('gpuInstanceId', NvU32, 4)]) +NV2080_CTRL_SMC_SUBSCRIPTION_INFO: TypeAlias = struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO +@c.record +class struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA(c.Struct): + SIZE = 48 + memPrivate: int + memSharedOwned: int + memSharedDuped: int + protectedMemPrivate: int + protectedMemSharedOwned: int + protectedMemSharedDuped: int +struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA.register_fields([('memPrivate', NvU64, 0), ('memSharedOwned', NvU64, 8), ('memSharedDuped', NvU64, 16), ('protectedMemPrivate', NvU64, 24), ('protectedMemSharedOwned', NvU64, 32), ('protectedMemSharedDuped', NvU64, 40)]) +NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA: TypeAlias = struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA +@c.record +class union_NV2080_CTRL_GPU_PID_INFO_DATA(c.Struct): + SIZE = 48 + vidMemUsage: struct_NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA +union_NV2080_CTRL_GPU_PID_INFO_DATA.register_fields([('vidMemUsage', NV2080_CTRL_GPU_PID_INFO_VIDEO_MEMORY_USAGE_DATA, 0)]) +NV2080_CTRL_GPU_PID_INFO_DATA: TypeAlias = union_NV2080_CTRL_GPU_PID_INFO_DATA +@c.record +class struct_NV2080_CTRL_GPU_PID_INFO(c.Struct): + SIZE = 72 + pid: int + index: int + result: int + data: union_NV2080_CTRL_GPU_PID_INFO_DATA + smcSubscription: struct_NV2080_CTRL_SMC_SUBSCRIPTION_INFO +struct_NV2080_CTRL_GPU_PID_INFO.register_fields([('pid', NvU32, 0), ('index', NvU32, 4), ('result', NvU32, 8), ('data', NV2080_CTRL_GPU_PID_INFO_DATA, 16), ('smcSubscription', NV2080_CTRL_SMC_SUBSCRIPTION_INFO, 64)]) +NV2080_CTRL_GPU_PID_INFO: TypeAlias = struct_NV2080_CTRL_GPU_PID_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS(c.Struct): + SIZE = 14408 + pidInfoListCount: int + pidInfoList: c.Array[struct_NV2080_CTRL_GPU_PID_INFO, Literal[200]] +struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS.register_fields([('pidInfoListCount', NvU32, 0), ('pidInfoList', c.Array[NV2080_CTRL_GPU_PID_INFO, Literal[200]], 8)]) +NV2080_CTRL_GPU_GET_PID_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PID_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS(c.Struct): + SIZE = 4 + faultType: int +struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS.register_fields([('faultType', NvU32, 0)]) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS +enum_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE: dict[int, str] = {(NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_DEFAULT:=0): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_DEFAULT', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_SHORT:=1): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_SHORT', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MEDIUM:=2): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MEDIUM', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_LONG:=3): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_LONG', (NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MAX:=4): 'NV2080_CTRL_CMD_GPU_COMPUTE_TIMESLICE_MAX'} +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG(c.Struct): + SIZE = 8 + type: int + data: struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data(c.Struct): + SIZE = 4 + timeslice: int +struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data.register_fields([('timeslice', NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_DATA_TIMESLICE, 0)]) +struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG.register_fields([('type', NvU32, 0), ('data', struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_data, 4)]) +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG: TypeAlias = struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG +@c.record +class struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS(c.Struct): + SIZE = 8 + config: struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG +struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS.register_fields([('config', NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, 0)]) +NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS(c.Struct): + SIZE = 260 + numConfigs: int + configList: c.Array[struct_NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, Literal[32]] +struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS.register_fields([('numConfigs', NvU32, 0), ('configList', c.Array[NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG, Literal[32]], 4)]) +NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_GFID_PARAMS(c.Struct): + SIZE = 16 + domain: int + bus: int + device: int + func: int + gfid: int + gfidMask: int +struct_NV2080_CTRL_GPU_GET_GFID_PARAMS.register_fields([('domain', NvU32, 0), ('bus', NvU8, 4), ('device', NvU8, 5), ('func', NvU8, 6), ('gfid', NvU32, 8), ('gfidMask', NvU32, 12)]) +NV2080_CTRL_GPU_GET_GFID_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_GFID_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS(c.Struct): + SIZE = 12 + gfid: int + bEnable: int + fabricPartitionId: int +struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS.register_fields([('gfid', NvU32, 0), ('bEnable', NvBool, 4), ('fabricPartitionId', NvU32, 8)]) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS(c.Struct): + SIZE = 24 + addressStart: int + addressLength: int + protection: int +struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS.register_fields([('addressStart', NvU64, 0), ('addressLength', NvU64, 8), ('protection', NvU32, 16)]) +NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS(c.Struct): + SIZE = 2608 + engineCount: int + engineList: c.Array[ctypes.c_uint32, Literal[200]] + engineStateLoadTime: c.Array[ctypes.c_uint64, Literal[200]] + engineIsInit: c.Array[ctypes.c_ubyte, Literal[200]] +struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineList', c.Array[NvU32, Literal[200]], 4), ('engineStateLoadTime', c.Array[NvU64, Literal[200]], 808), ('engineIsInit', c.Array[NvBool, Literal[200]], 2408)]) +NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS(c.Struct): + SIZE = 20804 + engineCount: int + engineID: c.Array[ctypes.c_uint32, Literal[200]] + engineName: c.Array[c.Array[ctypes.c_char, Literal[100]], Literal[200]] +struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS.register_fields([('engineCount', NvU32, 0), ('engineID', c.Array[NvU32, Literal[200]], 4), ('engineName', c.Array[c.Array[ctypes.c_char, Literal[100]], Literal[200]], 804)]) +NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS(c.Struct): + SIZE = 3240 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + reserved00: c.Array[ctypes.c_uint32, Literal[2]] + regOpCount: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[100]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('reserved00', c.Array[NvU32, Literal[2]], 12), ('regOpCount', NvU32, 20), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[100]], 24), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 3224)]) +NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SKYLINE_INFO(c.Struct): + SIZE = 76 + skylineVgpcSize: c.Array[ctypes.c_ubyte, Literal[64]] + singletonVgpcMask: int + maxInstances: int + computeSizeFlag: int +struct_NV2080_CTRL_GPU_SKYLINE_INFO.register_fields([('skylineVgpcSize', c.Array[NvU8, Literal[64]], 0), ('singletonVgpcMask', NvU32, 64), ('maxInstances', NvU32, 68), ('computeSizeFlag', NvU32, 72)]) +NV2080_CTRL_GPU_SKYLINE_INFO: TypeAlias = struct_NV2080_CTRL_GPU_SKYLINE_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS(c.Struct): + SIZE = 688 + skylineTable: c.Array[struct_NV2080_CTRL_GPU_SKYLINE_INFO, Literal[9]] + validEntries: int +struct_NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS.register_fields([('skylineTable', c.Array[NV2080_CTRL_GPU_SKYLINE_INFO, Literal[9]], 0), ('validEntries', NvU32, 684)]) +NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO(c.Struct): + SIZE = 52 + gpuId: int + gpuUuid: c.Array[ctypes.c_ubyte, Literal[16]] + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerId: int + busEgmPeerId: int +struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO.register_fields([('gpuId', NvU32, 0), ('gpuUuid', c.Array[NvU8, Literal[16]], 4), ('p2pCaps', NvU32, 20), ('p2pOptimalReadCEs', NvU32, 24), ('p2pOptimalWriteCEs', NvU32, 28), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 32), ('busPeerId', NvU32, 44), ('busEgmPeerId', NvU32, 48)]) +NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO: TypeAlias = struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO +@c.record +class struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 1672 + bAllCaps: int + bUseUuid: int + peerGpuCount: int + peerGpuCaps: c.Array[struct_NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO, Literal[32]] +struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS.register_fields([('bAllCaps', NvBool, 0), ('bUseUuid', NvBool, 1), ('peerGpuCount', NvU32, 4), ('peerGpuCaps', c.Array[NV2080_CTRL_GPU_P2P_PEER_CAPS_PEER_INFO, Literal[32]], 8)]) +NV2080_CTRL_GET_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GET_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_COMPUTE_PROFILE(c.Struct): + SIZE = 20 + computeSize: int + flags: int + gfxGpcCount: int + gpcCount: int + veidCount: int + smCount: int +struct_NV2080_CTRL_GPU_COMPUTE_PROFILE.register_fields([('computeSize', NvU8, 0), ('flags', NvU16, 2), ('gfxGpcCount', NvU32, 4), ('gpcCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16)]) +NV2080_CTRL_GPU_COMPUTE_PROFILE: TypeAlias = struct_NV2080_CTRL_GPU_COMPUTE_PROFILE +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS(c.Struct): + SIZE = 168 + partitionFlag: int + profileCount: int + profiles: c.Array[struct_NV2080_CTRL_GPU_COMPUTE_PROFILE, Literal[8]] +struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('profileCount', NvU32, 4), ('profiles', c.Array[NV2080_CTRL_GPU_COMPUTE_PROFILE, Literal[8]], 8)]) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 56 + state: int + status: int + clusterUuid: c.Array[ctypes.c_ubyte, Literal[16]] + fabricPartitionId: int + fabricCaps: int + fabricCliqueId: int + fabricHealthMask: int + fabricHealthSummary: int +struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('state', NvU8, 0), ('status', NV_STATUS, 4), ('clusterUuid', c.Array[NvU8, Literal[16]], 8), ('fabricPartitionId', NvU16, 24), ('fabricCaps', NvU64, 32), ('fabricCliqueId', NvU32, 40), ('fabricHealthMask', NvU32, 44), ('fabricHealthSummary', NvU8, 48)]) +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS(c.Struct): + SIZE = 16 + pciDevId: int + chipSku: c.Array[ctypes.c_ubyte, Literal[4]] + chipMajor: int + chipMinor: int +struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS.register_fields([('pciDevId', NvU32, 0), ('chipSku', c.Array[NvU8, Literal[4]], 4), ('chipMajor', NvU32, 8), ('chipMinor', NvU32, 12)]) +NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS(c.Struct): + SIZE = 4 + swizzId: int +struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS.register_fields([('swizzId', NvU32, 0)]) +NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS(c.Struct): + SIZE = 1832 + hClientTarget: int + hChannelTarget: int + bNonTransactional: int + regOpCount: int + smIds: c.Array[ctypes.c_uint32, Literal[50]] + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[50]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS.register_fields([('hClientTarget', NvHandle, 0), ('hChannelTarget', NvHandle, 4), ('bNonTransactional', NvU32, 8), ('regOpCount', NvU32, 12), ('smIds', c.Array[NvU32, Literal[50]], 16), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[50]], 216), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 1816)]) +NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_GSP_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +NV2080_CTRL_GPU_MIGRATABLE_OPS_VGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_MIGRATABLE_OPS_CMN_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS(c.Struct): + SIZE = 1 + bResetRequired: int +struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS.register_fields([('bResetRequired', NvBool, 0)]) +NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS(c.Struct): + SIZE = 1 + bDrainRecommended: int +struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS.register_fields([('bDrainRecommended', NvBool, 0)]) +NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS(c.Struct): + SIZE = 16388 + sessionInfoTblEntry: int + sessionInfoTbl: c.Array[struct_NV2080_CTRL_NVENC_SW_SESSION_INFO, Literal[512]] +struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS.register_fields([('sessionInfoTblEntry', NvU32, 0), ('sessionInfoTbl', c.Array[NV2080_CTRL_NVENC_SW_SESSION_INFO, Literal[512]], 4)]) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO(c.Struct): + SIZE = 20 + engDesc: int + ctxAttr: int + ctxBufferSize: int + addrSpaceList: int + registerBase: int +struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO.register_fields([('engDesc', NvU32, 0), ('ctxAttr', NvU32, 4), ('ctxBufferSize', NvU32, 8), ('addrSpaceList', NvU32, 12), ('registerBase', NvU32, 16)]) +NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO: TypeAlias = struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS(c.Struct): + SIZE = 1284 + numConstructedFalcons: int + constructedFalconsTable: c.Array[struct_NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO, Literal[64]] +struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS.register_fields([('numConstructedFalcons', NvU32, 0), ('constructedFalconsTable', c.Array[NV2080_CTRL_GPU_CONSTRUCTED_FALCON_INFO, Literal[64]], 4)]) +NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS +@c.record +class struct_NV2080_VF_MSIX_CAPS(c.Struct): + SIZE = 12 + msix_header: int + msix_table: int + msix_pba: int +struct_NV2080_VF_MSIX_CAPS.register_fields([('msix_header', NvU32, 0), ('msix_table', NvU32, 4), ('msix_pba', NvU32, 8)]) +NV2080_VF_MSIX_CAPS: TypeAlias = struct_NV2080_VF_MSIX_CAPS +@c.record +class struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS(c.Struct): + SIZE = 16 + gfid: int + vfMsixCap: struct_NV2080_VF_MSIX_CAPS +struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS.register_fields([('gfid', NvU32, 0), ('vfMsixCap', NV2080_VF_MSIX_CAPS, 4)]) +NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS +enum_NV2080_CTRL_GPU_RECOVERY_ACTION: dict[int, str] = {(NV2080_CTRL_GPU_RECOVERY_ACTION_NONE:=0): 'NV2080_CTRL_GPU_RECOVERY_ACTION_NONE', (NV2080_CTRL_GPU_RECOVERY_ACTION_GPU_PF_FLR:=1): 'NV2080_CTRL_GPU_RECOVERY_ACTION_GPU_PF_FLR', (NV2080_CTRL_GPU_RECOVERY_ACTION_OS_REBOOT:=2): 'NV2080_CTRL_GPU_RECOVERY_ACTION_OS_REBOOT', (NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_P2P:=3): 'NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_P2P', (NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_AND_RESET:=4): 'NV2080_CTRL_GPU_RECOVERY_ACTION_DRAIN_AND_RESET', (NV2080_CTRL_GPU_RECOVERY_ACTION_RECOVER_IMEX_DOMAIN:=5): 'NV2080_CTRL_GPU_RECOVERY_ACTION_RECOVER_IMEX_DOMAIN', (NV2080_CTRL_GPU_RECOVERY_ACTION_BUS_RESET:=6): 'NV2080_CTRL_GPU_RECOVERY_ACTION_BUS_RESET', (NV2080_CTRL_GPU_RECOVERY_ACTION_SYSTEM_REBOOT:=7): 'NV2080_CTRL_GPU_RECOVERY_ACTION_SYSTEM_REBOOT'} +NV2080_CTRL_GPU_RECOVERY_ACTION: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS.register_fields([('action', NV2080_CTRL_GPU_RECOVERY_ACTION, 0)]) +NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS(c.Struct): + SIZE = 1 + bFipsEnabled: int +struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS.register_fields([('bFipsEnabled', NvBool, 0)]) +NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS +enum_NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE: dict[int, str] = {(NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_INVALID:=0): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_INVALID', (NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_TPC:=1): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_TPC', (NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_GPC:=2): 'NV2080_RAFTS_FLOORSWEEP_UNIT_TYPE_GPC'} +NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_RAFTS_FLOORSWEEP_INFO(c.Struct): + SIZE = 12 + unitType: int + parentId: int + mask: int +struct_NV2080_RAFTS_FLOORSWEEP_INFO.register_fields([('unitType', NV2080_RAFTS_FLOORSWEEP_UNIT_MASK_TYPE, 0), ('parentId', NvU32, 4), ('mask', NvU32, 8)]) +NV2080_RAFTS_FLOORSWEEP_INFO: TypeAlias = struct_NV2080_RAFTS_FLOORSWEEP_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS(c.Struct): + SIZE = 344 + tpcCountMatrix: c.Array[c.Array[ctypes.c_ubyte, Literal[12]], Literal[2]] + bValid: int + floorSweepConfig: c.Array[struct_NV2080_RAFTS_FLOORSWEEP_INFO, Literal[26]] + gfxGpcCount: int + gfxTpcPerGpcCount: int + maxUgpuTpcDiff: int +struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS.register_fields([('tpcCountMatrix', c.Array[c.Array[NvU8, Literal[12]], Literal[2]], 0), ('bValid', NvBool, 24), ('floorSweepConfig', c.Array[NV2080_RAFTS_FLOORSWEEP_INFO, Literal[26]], 28), ('gfxGpcCount', NvU8, 340), ('gfxTpcPerGpcCount', NvU8, 341), ('maxUgpuTpcDiff', NvU8, 342)]) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS(c.Struct): + SIZE = 152 + partitionFlag: int + computeSize: int + totalProfileCount: int + totalSpans: c.Array[struct_NV2080_CTRL_EXEC_PARTITION_SPAN, Literal[8]] + totalSpansCount: int +struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS.register_fields([('partitionFlag', NvU32, 0), ('computeSize', NvU32, 4), ('totalProfileCount', NvU32, 8), ('totalSpans', c.Array[NV2080_CTRL_EXEC_PARTITION_SPAN, Literal[8]], 16), ('totalSpansCount', NvU32, 144)]) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS(c.Struct): + SIZE = 8 + gpc: int + tpcReconfigMask: int +struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS.register_fields([('gpc', NvU32, 0), ('tpcReconfigMask', NvU32, 4)]) +NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS(c.Struct): + SIZE = 32 + test: int + dataSize: int + startTimestamp: int + stopTimestamp: int + data: ctypes.c_void_p +struct_NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS.register_fields([('test', NvU8, 0), ('dataSize', NvU32, 4), ('startTimestamp', NvU64, 8), ('stopTimestamp', NvU64, 16), ('data', NvP64, 24)]) +NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS(c.Struct): + SIZE = 24 + maxRpcSize: int + finnRmapiSize: int + rpcGspControlSize: int + rpcMessageHeaderSize: int + timestampFreq: int +struct_NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS.register_fields([('maxRpcSize', NvU32, 0), ('finnRmapiSize', NvU32, 4), ('rpcGspControlSize', NvU32, 8), ('rpcMessageHeaderSize', NvU32, 12), ('timestampFreq', NvU64, 16)]) +NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS +@c.record +class struct_NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS(c.Struct): + SIZE = 4 + supportedFeatures: int +struct_NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS.register_fields([('supportedFeatures', NvU32, 0)]) +NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS: TypeAlias = struct_NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_RUSD_SET_FEATURES_PARAMS(c.Struct): + SIZE = 8 + permanentPolledDataMask: int +struct_NV2080_CTRL_GPU_RUSD_SET_FEATURES_PARAMS.register_fields([('permanentPolledDataMask', NvU64, 0)]) +NV2080_CTRL_GPU_RUSD_SET_FEATURES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_RUSD_SET_FEATURES_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_VGA_SR_READ_WRITE_PARAMS(c.Struct): + SIZE = 12 + bWrite: int + head: int + index: int + data: int +struct_NV2080_CTRL_GPU_VGA_SR_READ_WRITE_PARAMS.register_fields([('bWrite', NvBool, 0), ('head', NvU32, 4), ('index', NvU8, 8), ('data', NvU8, 9)]) +NV2080_CTRL_GPU_VGA_SR_READ_WRITE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_VGA_SR_READ_WRITE_PARAMS +enum_NV2080_CTRL_GPU_INJECT_ERROR_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_INJECT_ERROR_MESSAGE_QUEUE:=0): 'NV2080_CTRL_GPU_INJECT_ERROR_MESSAGE_QUEUE', (NV2080_CTRL_GPU_INJECT_ERROR__COUNT:=1): 'NV2080_CTRL_GPU_INJECT_ERROR__COUNT'} +NV2080_CTRL_GPU_INJECT_ERROR_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_ERROR_INJECTION_CONTROL_PARAMS(c.Struct): + SIZE = 4 + errorType: int +struct_NV2080_CTRL_GPU_ERROR_INJECTION_CONTROL_PARAMS.register_fields([('errorType', NvU32, 0)]) +NV2080_CTRL_GPU_ERROR_INJECTION_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_ERROR_INJECTION_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_CHECK_MEM_SUBSYS_ERROR_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_GPU_CHECK_MEM_SUBSYS_ERROR_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_GPU_CHECK_MEM_SUBSYS_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_CHECK_MEM_SUBSYS_ERROR_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_GET_DEFAULT_TIMEOUT_PARAMS(c.Struct): + SIZE = 4 + defaultTimeout: int +struct_NV2080_CTRL_GPU_GET_DEFAULT_TIMEOUT_PARAMS.register_fields([('defaultTimeout', NvU32, 0)]) +NV2080_CTRL_GPU_GET_DEFAULT_TIMEOUT_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_DEFAULT_TIMEOUT_PARAMS +enum_NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_TYPE: dict[int, str] = {(NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_RSA_DECRYPTION:=0): 'NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_RSA_DECRYPTION', (NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_ECDSA:=1): 'NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_ECDSA', (NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_RNG:=2): 'NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_RNG', (NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_SHA:=3): 'NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_SHA'} +NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GSP_CRYPTO_CONTROL_PARAMS(c.Struct): + SIZE = 120 + opcode: int + inputMessageSize: int + inputMessage: ctypes.c_void_p + outputMessageSize: int + outputMessage: ctypes.c_void_p + modulusSize: int + modulus: ctypes.c_void_p + exponent: c.Array[ctypes.c_ubyte, Literal[4]] + usePresetKey: int + keySize: int + key: ctypes.c_void_p + nonce: c.Array[ctypes.c_ubyte, Literal[48]] +struct_NV2080_CTRL_GSP_CRYPTO_CONTROL_PARAMS.register_fields([('opcode', NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_TYPE, 0), ('inputMessageSize', NvU32, 4), ('inputMessage', NvP64, 8), ('outputMessageSize', NvU32, 16), ('outputMessage', NvP64, 24), ('modulusSize', NvU32, 32), ('modulus', NvP64, 40), ('exponent', c.Array[NvU8, Literal[4]], 48), ('usePresetKey', NvBool, 52), ('keySize', NvU32, 56), ('key', NvP64, 64), ('nonce', c.Array[NvU8, Literal[48]], 72)]) +NV2080_CTRL_GSP_CRYPTO_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_GSP_CRYPTO_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GPU_IS_RESET_COUPLED_PARAMS(c.Struct): + SIZE = 1 + isResetCoupled: int +struct_NV2080_CTRL_CMD_GPU_IS_RESET_COUPLED_PARAMS.register_fields([('isResetCoupled', NvBool, 0)]) +NV2080_CTRL_CMD_GPU_IS_RESET_COUPLED_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GPU_IS_RESET_COUPLED_PARAMS +enum_NV2080_CTRL_GPU_DIELET_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_DIELET_TYPE_UGD:=0): 'NV2080_CTRL_GPU_DIELET_TYPE_UGD', (NV2080_CTRL_GPU_DIELET_TYPE_IODN:=1): 'NV2080_CTRL_GPU_DIELET_TYPE_IODN', (NV2080_CTRL_GPU_DIELET_TYPE_IODS:=2): 'NV2080_CTRL_GPU_DIELET_TYPE_IODS', (NV2080_CTRL_GPU_DIELET_TYPE_LAST:=3): 'NV2080_CTRL_GPU_DIELET_TYPE_LAST'} +NV2080_CTRL_GPU_DIELET_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_DIELET_INFO(c.Struct): + SIZE = 8 + dieletType: int + typeSpecificId: int +struct_NV2080_CTRL_GPU_GET_DIELET_INFO.register_fields([('dieletType', NV2080_CTRL_GPU_DIELET_TYPE, 0), ('typeSpecificId', NvU32, 4)]) +NV2080_CTRL_GPU_GET_DIELET_INFO: TypeAlias = struct_NV2080_CTRL_GPU_GET_DIELET_INFO +@c.record +class struct_NV2080_CTRL_GPU_GET_DIELET_INFO_PARAMS(c.Struct): + SIZE = 2052 + dieletListSize: int + dielets: c.Array[struct_NV2080_CTRL_GPU_GET_DIELET_INFO, Literal[256]] +struct_NV2080_CTRL_GPU_GET_DIELET_INFO_PARAMS.register_fields([('dieletListSize', NvU32, 0), ('dielets', c.Array[NV2080_CTRL_GPU_GET_DIELET_INFO, Literal[256]], 4)]) +NV2080_CTRL_GPU_GET_DIELET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_DIELET_INFO_PARAMS +enum_NV2080_CTRL_GPU_UNIT_TYPE: dict[int, str] = {(NV2080_CTRL_GPU_UNIT_TYPE_SYSLTC:=0): 'NV2080_CTRL_GPU_UNIT_TYPE_SYSLTC', (NV2080_CTRL_GPU_UNIT_TYPE_SYSLTS:=1): 'NV2080_CTRL_GPU_UNIT_TYPE_SYSLTS', (NV2080_CTRL_GPU_UNIT_TYPE_HSHUBCHI:=2): 'NV2080_CTRL_GPU_UNIT_TYPE_HSHUBCHI', (NV2080_CTRL_GPU_UNIT_TYPE_HSHUBNVL:=3): 'NV2080_CTRL_GPU_UNIT_TYPE_HSHUBNVL', (NV2080_CTRL_GPU_UNIT_TYPE_LAST:=4): 'NV2080_CTRL_GPU_UNIT_TYPE_LAST'} +NV2080_CTRL_GPU_UNIT_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GPU_GET_UNIT_FS_INFO_FROM_DIELET_PARAMS(c.Struct): + SIZE = 16 + dieletType: int + dieletTypeSpecificId: int + unitType: int + unitMask: int +struct_NV2080_CTRL_GPU_GET_UNIT_FS_INFO_FROM_DIELET_PARAMS.register_fields([('dieletType', NV2080_CTRL_GPU_DIELET_TYPE, 0), ('dieletTypeSpecificId', NvU32, 4), ('unitType', NV2080_CTRL_GPU_UNIT_TYPE, 8), ('unitMask', NvU32, 12)]) +NV2080_CTRL_GPU_GET_UNIT_FS_INFO_FROM_DIELET_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_UNIT_FS_INFO_FROM_DIELET_PARAMS +@c.record +class struct_NV2080_CTRL_GPU_SET_MIGRATION_BLOCK_PARAMS(c.Struct): + SIZE = 1 + bIsDevtoolInUse: int +struct_NV2080_CTRL_GPU_SET_MIGRATION_BLOCK_PARAMS.register_fields([('bIsDevtoolInUse', NvBool, 0)]) +NV2080_CTRL_GPU_SET_MIGRATION_BLOCK_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_MIGRATION_BLOCK_PARAMS +@c.record +class struct_NV2080_CTRL_GPUMON_SAMPLE(c.Struct): + SIZE = 8 + timeStamp: int +struct_NV2080_CTRL_GPUMON_SAMPLE.register_fields([('timeStamp', NvU64, 0)]) +NV2080_CTRL_GPUMON_SAMPLE: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLE +@c.record +class struct_NV2080_CTRL_GPUMON_SAMPLES(c.Struct): + SIZE = 24 + type: int + bufSize: int + count: int + tracker: int + pSamples: ctypes.c_void_p +struct_NV2080_CTRL_GPUMON_SAMPLES.register_fields([('type', NvU8, 0), ('bufSize', NvU32, 4), ('count', NvU32, 8), ('tracker', NvU32, 12), ('pSamples', NvP64, 16)]) +NV2080_CTRL_GPUMON_SAMPLES: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLES +NV2080_CTRL_GR_INFO: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 32 + grInfoListSize: int + grInfoList: ctypes.c_void_p + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_INFO_PARAMS.register_fields([('grInfoListSize', NvU32, 0), ('grInfoList', NvP64, 8), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 16)]) +NV2080_CTRL_GR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + hShareClient: int + hShareChannel: int + zcullMode: int +struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('hShareClient', NvHandle, 4), ('hShareChannel', NvHandle, 8), ('zcullMode', NvU32, 12)]) +NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 40 + widthAlignPixels: int + heightAlignPixels: int + pixelSquaresByAliquots: int + aliquotTotal: int + zcullRegionByteMultiplier: int + zcullRegionHeaderSize: int + zcullSubregionHeaderSize: int + subregionCount: int + subregionWidthAlignPixels: int + subregionHeightAlignPixels: int +struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS.register_fields([('widthAlignPixels', NvU32, 0), ('heightAlignPixels', NvU32, 4), ('pixelSquaresByAliquots', NvU32, 8), ('aliquotTotal', NvU32, 12), ('zcullRegionByteMultiplier', NvU32, 16), ('zcullRegionHeaderSize', NvU32, 20), ('zcullSubregionHeaderSize', NvU32, 24), ('subregionCount', NvU32, 28), ('subregionWidthAlignPixels', NvU32, 32), ('subregionHeightAlignPixels', NvU32, 36)]) +NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + pmMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('pmMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS(c.Struct): + SIZE = 24 + hClient: int + hChannel: int + vMemPtr: int + zcullMode: int +struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8), ('zcullMode', NvU32, 16)]) +NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS(c.Struct): + SIZE = 40 + hClient: int + hChannel: int + vMemPtr: int + pmMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8), ('pmMode', NvU32, 16), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 24)]) +NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS(c.Struct): + SIZE = 16 + hClient: int + hChannel: int + vMemPtr: int +struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS.register_fields([('hClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('vMemPtr', NvU64, 8)]) +NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS(c.Struct): + SIZE = 152 + mapValueCount: int + mapValues: c.Array[ctypes.c_ubyte, Literal[128]] + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS.register_fields([('mapValueCount', NvU32, 0), ('mapValues', c.Array[NvU8, Literal[128]], 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 136)]) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + smpcMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('smpcMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS(c.Struct): + SIZE = 4120 + smId: c.Array[struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId, Literal[512]] + smCount: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId(c.Struct): + SIZE = 8 + gpcId: int + tpcId: int +struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId.register_fields([('gpcId', NvU32, 0), ('tpcId', NvU32, 4)]) +struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS.register_fields([('smId', c.Array[struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_smId, Literal[512]], 0), ('smCount', NvU32, 4096), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 4104)]) +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS(c.Struct): + SIZE = 32 + flags: int + hChannel: int + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS.register_fields([('flags', NvU32, 0), ('hChannel', NvHandle, 4), ('gfxpPreemptMode', NvU32, 8), ('cilpPreemptMode', NvU32, 12), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 16)]) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS +enum_NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS: dict[int, str] = {(NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_MAIN:=0): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_MAIN', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SPILL:=1): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SPILL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_PAGEPOOL:=2): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_PAGEPOOL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_BETACB:=3): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_BETACB', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_RTV:=4): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_RTV', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL:=5): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL:=6): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL_CPU:=7): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_CONTEXT_POOL_CONTROL_CPU', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SETUP:=8): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_SETUP', (NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_END:=9): 'NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS_END'} +NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND_BUFFERS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS(c.Struct): + SIZE = 112 + flags: int + hClient: int + hChannel: int + vMemPtrs: c.Array[ctypes.c_uint64, Literal[9]] + gfxpPreemptMode: int + cilpPreemptMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS.register_fields([('flags', NvU32, 0), ('hClient', NvHandle, 4), ('hChannel', NvHandle, 8), ('vMemPtrs', c.Array[NvU64, Literal[9]], 16), ('gfxpPreemptMode', NvU32, 88), ('cilpPreemptMode', NvU32, 92), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 96)]) +NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + samplingMode: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('samplingMode', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS(c.Struct): + SIZE = 12 + ropUnitCount: int + ropOperationsFactor: int + ropOperationsCount: int +struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS.register_fields([('ropUnitCount', NvU32, 0), ('ropOperationsFactor', NvU32, 4), ('ropOperationsCount', NvU32, 8)]) +NV2080_CTRL_GR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ROP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS(c.Struct): + SIZE = 32 + hChannel: int + flags: int + saveCnt: int + restoreCnt: int + wfiSaveCnt: int + ctaSaveCnt: int + cilpSaveCnt: int + gfxpSaveCnt: int +struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS.register_fields([('hChannel', NvHandle, 0), ('flags', NvU32, 4), ('saveCnt', NvU32, 8), ('restoreCnt', NvU32, 12), ('wfiSaveCnt', NvU32, 16), ('ctaSaveCnt', NvU32, 20), ('cilpSaveCnt', NvU32, 24), ('gfxpSaveCnt', NvU32, 28)]) +NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 16 + hChannel: int + totalBufferSize: int +struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS.register_fields([('hChannel', NvHandle, 0), ('totalBufferSize', NvU64, 8)]) +NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_CTX_BUFFER_INFO(c.Struct): + SIZE = 80 + alignment: int + size: int + bufferHandle: ctypes.c_void_p + pageCount: int + physAddr: int + bufferType: int + aperture: int + kind: int + pageSize: int + bIsContigous: int + bGlobalBuffer: int + bLocalBuffer: int + bDeviceDescendant: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] +struct_NV2080_CTRL_GR_CTX_BUFFER_INFO.register_fields([('alignment', NvU64, 0), ('size', NvU64, 8), ('bufferHandle', NvP64, 16), ('pageCount', NvU64, 24), ('physAddr', NvU64, 32), ('bufferType', NvU32, 40), ('aperture', NvU32, 44), ('kind', NvU32, 48), ('pageSize', NvU32, 52), ('bIsContigous', NvBool, 56), ('bGlobalBuffer', NvBool, 57), ('bLocalBuffer', NvBool, 58), ('bDeviceDescendant', NvBool, 59), ('uuid', c.Array[NvU8, Literal[16]], 60)]) +NV2080_CTRL_GR_CTX_BUFFER_INFO: TypeAlias = struct_NV2080_CTRL_GR_CTX_BUFFER_INFO +PNV2080_CTRL_GR_CTX_BUFFER_INFO: TypeAlias = c.POINTER[struct_NV2080_CTRL_GR_CTX_BUFFER_INFO] +@c.record +class struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 5136 + hUserClient: int + hChannel: int + bufferCount: int + ctxBufferInfo: c.Array[struct_NV2080_CTRL_GR_CTX_BUFFER_INFO, Literal[64]] +struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('bufferCount', NvU32, 8), ('ctxBufferInfo', c.Array[NV2080_CTRL_GR_CTX_BUFFER_INFO, Literal[64]], 16)]) +NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS(c.Struct): + SIZE = 9240 + globalSmId: c.Array[struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId, Literal[512]] + numSm: int + numTpc: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId(c.Struct): + SIZE = 18 + gpcId: int + localTpcId: int + localSmId: int + globalTpcId: int + virtualGpcId: int + migratableTpcId: int + ugpuId: int + physicalCpcId: int + virtualTpcId: int +struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId.register_fields([('gpcId', NvU16, 0), ('localTpcId', NvU16, 2), ('localSmId', NvU16, 4), ('globalTpcId', NvU16, 6), ('virtualGpcId', NvU16, 8), ('migratableTpcId', NvU16, 10), ('ugpuId', NvU16, 12), ('physicalCpcId', NvU16, 14), ('virtualTpcId', NvU16, 16)]) +struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS.register_fields([('globalSmId', c.Array[struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_globalSmId, Literal[512]], 0), ('numSm', NvU16, 9216), ('numTpc', NvU16, 9218), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 9224)]) +NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS(c.Struct): + SIZE = 24 + chID: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS.register_fields([('chID', NvU32, 0), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS(c.Struct): + SIZE = 4 + attribBufferSize: int +struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS.register_fields([('attribBufferSize', NvU32, 0)]) +NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS(c.Struct): + SIZE = 40 + maxSlots: int + slotStride: int + ctrlStructSize: int + ctrlStructAlign: int + poolSize: int + poolAlign: int +struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS.register_fields([('maxSlots', NvU32, 0), ('slotStride', NvU32, 4), ('ctrlStructSize', NvU64, 8), ('ctrlStructAlign', NvU64, 16), ('poolSize', NvU64, 24), ('poolAlign', NvU64, 32)]) +NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS(c.Struct): + SIZE = 16 + maxSlots: int + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS.register_fields([('maxSlots', NvU32, 0), ('hMemory', NvHandle, 4), ('offset', NvU32, 8), ('size', NvU32, 12)]) +NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS(c.Struct): + SIZE = 272 + numSlots: int + slots: c.Array[ctypes.c_uint32, Literal[64]] + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS.register_fields([('numSlots', NvU32, 0), ('slots', c.Array[NvU32, Literal[64]], 4), ('hMemory', NvHandle, 260), ('offset', NvU32, 264), ('size', NvU32, 268)]) +NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS(c.Struct): + SIZE = 276 + numSlots: int + slots: c.Array[ctypes.c_uint32, Literal[64]] + bRemoveSpecificSlots: int + hMemory: int + offset: int + size: int +struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS.register_fields([('numSlots', NvU32, 0), ('slots', c.Array[NvU32, Literal[64]], 4), ('bRemoveSpecificSlots', NvBool, 260), ('hMemory', NvHandle, 264), ('offset', NvU32, 268), ('size', NvU32, 272)]) +NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS +NV2080_CTRL_GR_GET_CAPS_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_CAPS_V2_PARAMS +NV2080_CTRL_GR_GET_INFO_V2_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_GET_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcMask: int +struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcMask', NvU32, 16)]) +NV2080_CTRL_GR_GET_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcId', NvU32, 16), ('tpcMask', NvU32, 20)]) +NV2080_CTRL_GR_GET_TPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_TPC_MASK_PARAMS +NV2080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS: TypeAlias = struct_NV0080_CTRL_GR_TPC_PARTITION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS(c.Struct): + SIZE = 32 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + engineId: int + alignment: int + size: int + bInfoPopulated: int +struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('engineId', NvU32, 16), ('alignment', NvU32, 20), ('size', NvU32, 24), ('bInfoPopulated', NvBool, 28)]) +NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS(c.Struct): + SIZE = 32 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + imla0: int + fmla16: int + dp: int + fmla32: int + ffma: int + imla1: int + imla2: int + imla3: int + imla4: int +struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('imla0', NvU8, 16), ('fmla16', NvU8, 17), ('dp', NvU8, 18), ('fmla32', NvU8, 19), ('ffma', NvU8, 20), ('imla1', NvU8, 21), ('imla2', NvU8, 22), ('imla3', NvU8, 23), ('imla4', NvU8, 24)]) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS(c.Struct): + SIZE = 2044 + smIssueRateModifierListSize: int + smIssueRateModifierList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[255]] +struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS.register_fields([('smIssueRateModifierListSize', NvU32, 0), ('smIssueRateModifierList', c.Array[NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2, Literal[255]], 4)]) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS +NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL: TypeAlias = struct_NVXXXX_CTRL_XXX_INFO +@c.record +class struct_NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS(c.Struct): + SIZE = 2044 + smIssueThrottleCtrlListSize: int + smIssueThrottleCtrlList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[255]] +struct_NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS.register_fields([('smIssueThrottleCtrlListSize', NvU32, 0), ('smIssueThrottleCtrlList', c.Array[NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL, Literal[255]], 4)]) +NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS +enum_NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD: dict[int, str] = {(NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_FULL:=0): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_FULL', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_SIMPLE:=1): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_SIMPLE', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_COMPAT:=2): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_COMPAT', (NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_CUSTOM:=3): 'NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD_CUSTOM'} +NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS(c.Struct): + SIZE = 20 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int +struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16)]) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS(c.Struct): + SIZE = 8 + physSyspipeId: int + gpcMask: int +struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS.register_fields([('physSyspipeId', NvU32, 0), ('gpcMask', NvU32, 4)]) +NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + gpcId: int + ppcMask: int +struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('gpcId', NvU32, 16), ('ppcMask', NvU32, 20)]) +NV2080_CTRL_GR_GET_PPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_PPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + numTpcs: int +struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS.register_fields([('gpcId', NvU32, 0), ('numTpcs', NvU32, 4)]) +NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS(c.Struct): + SIZE = 24 + hChannel: int + zcullMode: int + pmMode: int + smpcMode: int + cilpPreemptMode: int + gfxpPreemptMode: int +struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('zcullMode', NvU32, 4), ('pmMode', NvU32, 8), ('smpcMode', NvU32, 12), ('cilpPreemptMode', NvU32, 16), ('gfxpPreemptMode', NvU32, 20)]) +NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS +NV2080_CTRL_GR_GET_GPC_TILE_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + zcullMask: int +struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('zcullMask', NvU32, 4)]) +NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS +enum_NV2080_CTRL_GR_FECS_BIND_EVTBUF_REASON_CODE: dict[int, str] = {(NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NONE:=0): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NONE', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_GPU_TOO_OLD:=1): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_GPU_TOO_OLD', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED_GPU:=2): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED_GPU', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED:=3): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NOT_ENABLED', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_ADMIN:=4): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_ADMIN', (NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_CAPABILITY:=5): 'NV2080_CTRL_GR_FECS_BIND_REASON_CODE_NEED_CAPABILITY'} +NV2080_CTRL_GR_FECS_BIND_EVTBUF_REASON_CODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS(c.Struct): + SIZE = 24 + hEventBuffer: int + recordSize: int + levelOfDetail: int + eventFilter: int + bAllUsers: int + reasonCode: int +struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS.register_fields([('hEventBuffer', NvHandle, 0), ('recordSize', NvU32, 4), ('levelOfDetail', NV2080_CTRL_GR_FECS_BIND_EVTBUF_LOD, 8), ('eventFilter', NvU32, 12), ('bAllUsers', NvBool, 16), ('reasonCode', NvU32, 20)]) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + physGfxGpcMask: int + numGfxTpc: int +struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('physGfxGpcMask', NvU32, 16), ('numGfxTpc', NvU32, 20)]) +NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS(c.Struct): + SIZE = 24 + gpc: int + tpcReconfigMask: int + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO +struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS.register_fields([('gpc', NvU32, 0), ('tpcReconfigMask', NvU32, 4), ('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 8)]) +NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GR_TEST_CTXSW_ERROR_LOGS_PARAMS(c.Struct): + SIZE = 8 + expectedCharCount: int + bUseInterrupt: int +struct_NV2080_CTRL_GR_TEST_CTXSW_ERROR_LOGS_PARAMS.register_fields([('expectedCharCount', NvU32, 0), ('bUseInterrupt', NvBool, 4)]) +NV2080_CTRL_GR_TEST_CTXSW_ERROR_LOGS_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_TEST_CTXSW_ERROR_LOGS_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS(c.Struct): + SIZE = 4 + gpcCount: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS.register_fields([('gpcCount', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + chipletGpcMap: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS.register_fields([('gpcId', NvU32, 0), ('chipletGpcMap', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + tpcMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('tpcMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + ppcMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('ppcMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + gpcId: int + chipletGpcMap: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS.register_fields([('swizzId', NvU32, 0), ('gpcId', NvU32, 4), ('chipletGpcMap', NvU32, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS(c.Struct): + SIZE = 8 + gpcId: int + ropMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS.register_fields([('gpcId', NvU32, 0), ('ropMask', NvU32, 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS(c.Struct): + SIZE = 4 + chipletSyspipeMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS.register_fields([('chipletSyspipeMask', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + physSyspipeIdCount: int + physSyspipeId: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS.register_fields([('swizzId', NvU16, 0), ('physSyspipeIdCount', NvU16, 2), ('physSyspipeId', c.Array[NvU8, Literal[8]], 4)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + grIdx: int + gpcEnMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('grIdx', NvU32, 4), ('gpcEnMask', NvU32, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS(c.Struct): + SIZE = 4 + syspipeId: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS.register_fields([('syspipeId', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS(c.Struct): + SIZE = 4 + chipletSyspipeMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS.register_fields([('chipletSyspipeMask', NvU32, 0)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS(c.Struct): + SIZE = 12 + swizzId: int + grIdx: int + gpcEnMask: int +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS.register_fields([('swizzId', NvU32, 0), ('grIdx', NvU32, 4), ('gpcEnMask', NvU32, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS(c.Struct): + SIZE = 20 + queryType: int + reserved: c.Array[ctypes.c_ubyte, Literal[2]] + status: int + queryData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData +@c.record +class struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData(c.Struct): + SIZE = 12 + gpcCountData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS + chipletGpcMapData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS + tpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS + ppcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS + partitionGpcMapData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS + syspipeMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS + partitionChipletSyspipeData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS + dmGpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS + partitionSyspipeIdData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS + ropMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS + gfxSyspipeMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS + gfxGpcMaskData: struct_NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData.register_fields([('gpcCountData', NV2080_CTRL_GRMGR_GR_FS_INFO_GPC_COUNT_PARAMS, 0), ('chipletGpcMapData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GPC_MAP_PARAMS, 0), ('tpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_TPC_MASK_PARAMS, 0), ('ppcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_PPC_MASK_PARAMS, 0), ('partitionGpcMapData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_GPC_MAP_PARAMS, 0), ('syspipeMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_SYSPIPE_MASK_PARAMS, 0), ('partitionChipletSyspipeData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_CHIPLET_SYSPIPE_IDS_PARAMS, 0), ('dmGpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_PROFILER_MON_GPC_MASK_PARAMS, 0), ('partitionSyspipeIdData', NV2080_CTRL_GRMGR_GR_FS_INFO_PARTITION_SYSPIPE_ID_PARAMS, 0), ('ropMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_ROP_MASK_PARAMS, 0), ('gfxSyspipeMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_CHIPLET_GRAPHICS_SYSPIPE_MASK_PARAMS, 0), ('gfxGpcMaskData', NV2080_CTRL_GRMGR_GR_FS_INFO_GFX_CAPABLE_GPC_MASK_PARAMS, 0)]) +struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS.register_fields([('queryType', NvU16, 0), ('reserved', c.Array[NvU8, Literal[2]], 2), ('status', NvU32, 4), ('queryData', struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS_queryData, 8)]) +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS +@c.record +class struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS(c.Struct): + SIZE = 1928 + numQueries: int + reserved: c.Array[ctypes.c_ubyte, Literal[6]] + queries: c.Array[struct_NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS, Literal[96]] +struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS.register_fields([('numQueries', NvU16, 0), ('reserved', c.Array[NvU8, Literal[6]], 2), ('queries', c.Array[NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARAMS, Literal[96]], 8)]) +NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS(c.Struct): + SIZE = 72 + gspFeatures: int + bValid: int + bDefaultGspRmGpu: int + firmwareVersion: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS.register_fields([('gspFeatures', NvU32, 0), ('bValid', NvBool, 4), ('bDefaultGspRmGpu', NvBool, 5), ('firmwareVersion', c.Array[NvU8, Literal[64]], 6)]) +NV2080_CTRL_GSP_GET_FEATURES_PARAMS: TypeAlias = struct_NV2080_CTRL_GSP_GET_FEATURES_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT(c.Struct): + SIZE = 32 + allocatedSize: int + usableSize: int + memTrackOverhead: int + allocationCount: int +struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT.register_fields([('allocatedSize', NvU64, 0), ('usableSize', NvU64, 8), ('memTrackOverhead', NvU64, 16), ('allocationCount', NvU32, 24)]) +NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT: TypeAlias = struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT +@c.record +class struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS(c.Struct): + SIZE = 88 + gfid: int + managedSize: int + largestFreeChunkSize: int + current: struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT + peak: struct_NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT +struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS.register_fields([('gfid', NvU32, 0), ('managedSize', NvU64, 8), ('largestFreeChunkSize', NvU64, 16), ('current', NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT, 24), ('peak', NV2080_CTRL_GSP_RM_HEAP_STATS_SNAPSHOT, 56)]) +NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS(c.Struct): + SIZE = 40 + allocatedSize: int + peakAllocatedSize: int + managedSize: int + allocationCount: int + peakAllocationCount: int + largestFreeChunkSize: int +struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS.register_fields([('allocatedSize', NvU64, 0), ('peakAllocatedSize', NvU64, 8), ('managedSize', NvU64, 16), ('allocationCount', NvU32, 24), ('peakAllocationCount', NvU32, 28), ('largestFreeChunkSize', NvU64, 32)]) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS(c.Struct): + SIZE = 16 + allocations: int + peakAllocations: int + objectSize: int +struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS.register_fields([('allocations', NvU32, 0), ('peakAllocations', NvU32, 4), ('objectSize', NvU64, 8)]) +NV2080_CTRL_GSP_LIBOS_POOL_STATS: TypeAlias = struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS +@c.record +class struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS(c.Struct): + SIZE = 1040 + poolStats: c.Array[struct_NV2080_CTRL_GSP_LIBOS_POOL_STATS, Literal[64]] + totalHeapSize: int + poolCount: int +struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS.register_fields([('poolStats', c.Array[NV2080_CTRL_GSP_LIBOS_POOL_STATS, Literal[64]], 0), ('totalHeapSize', NvU64, 1024), ('poolCount', NvU8, 1032)]) +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_GSP_GDMA_FUZZ_TEST_PARAMS(c.Struct): + SIZE = 16 + iters: int + pSysmemPA: int +struct_NV2080_CTRL_CMD_GSP_GDMA_FUZZ_TEST_PARAMS.register_fields([('iters', NvU64, 0), ('pSysmemPA', NvU64, 8)]) +NV2080_CTRL_CMD_GSP_GDMA_FUZZ_TEST_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GSP_GDMA_FUZZ_TEST_PARAMS +enum_NV2080_CTRL_GSP_CORE_TEST_OP: dict[int, str] = {(NV2080_CTRL_GSP_CORE_TEST_OP_WRITE_LATENCY:=0): 'NV2080_CTRL_GSP_CORE_TEST_OP_WRITE_LATENCY', (NV2080_CTRL_GSP_CORE_TEST_OP_READ_LATENCY:=1): 'NV2080_CTRL_GSP_CORE_TEST_OP_READ_LATENCY', (NV2080_CTRL_GSP_CORE_TEST_OP_WRITE_BLOCK:=2): 'NV2080_CTRL_GSP_CORE_TEST_OP_WRITE_BLOCK', (NV2080_CTRL_GSP_CORE_TEST_OP_READ_BLOCK:=3): 'NV2080_CTRL_GSP_CORE_TEST_OP_READ_BLOCK', (NV2080_CTRL_GSP_CORE_TEST_SYSMEM_TO_FB_OP_COPY_NAIVE:=4): 'NV2080_CTRL_GSP_CORE_TEST_SYSMEM_TO_FB_OP_COPY_NAIVE', (NV2080_CTRL_GSP_CORE_TEST_FB_TO_FB_OP_COPY_NAIVE:=5): 'NV2080_CTRL_GSP_CORE_TEST_FB_TO_FB_OP_COPY_NAIVE', (NV2080_CTRL_GSP_CORE_TEST_DMEM_TO_FB_OP_PORT_MEM_COPY:=6): 'NV2080_CTRL_GSP_CORE_TEST_DMEM_TO_FB_OP_PORT_MEM_COPY', (NV2080_CTRL_GSP_CORE_TEST_FB_TO_DMEM_OP_PORT_MEM_COPY:=7): 'NV2080_CTRL_GSP_CORE_TEST_FB_TO_DMEM_OP_PORT_MEM_COPY', (NV2080_CTRL_GSP_CORE_TEST_FB_TO_FB_OP_PORT_MEM_COPY:=8): 'NV2080_CTRL_GSP_CORE_TEST_FB_TO_FB_OP_PORT_MEM_COPY', (NV2080_CTRL_GSP_CORE_TEST_DMEM_TO_FB_OP_DMA:=9): 'NV2080_CTRL_GSP_CORE_TEST_DMEM_TO_FB_OP_DMA', (NV2080_CTRL_GSP_CORE_TEST_FB_TO_DMEM_OP_DMA:=10): 'NV2080_CTRL_GSP_CORE_TEST_FB_TO_DMEM_OP_DMA', (NV2080_CTRL_GSP_CORE_TEST_FB_TO_FB_OP_DMA:=11): 'NV2080_CTRL_GSP_CORE_TEST_FB_TO_FB_OP_DMA', (NV2080_CTRL_GSP_CORE_TEST_L1D_INVAL_TIME:=12): 'NV2080_CTRL_GSP_CORE_TEST_L1D_INVAL_TIME'} +NV2080_CTRL_GSP_CORE_TEST_OP: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_GSP_CORE_TEST_MEM: dict[int, str] = {(NV2080_CTRL_GSP_CORE_TEST_MEM_DMEM:=0): 'NV2080_CTRL_GSP_CORE_TEST_MEM_DMEM', (NV2080_CTRL_GSP_CORE_TEST_MEM_FB:=1): 'NV2080_CTRL_GSP_CORE_TEST_MEM_FB', (NV2080_CTRL_GSP_CORE_TEST_MEM_SYSMEM:=2): 'NV2080_CTRL_GSP_CORE_TEST_MEM_SYSMEM'} +NV2080_CTRL_GSP_CORE_TEST_MEM: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_CMD_GSP_CORE_TEST_PARAMS(c.Struct): + SIZE = 48 + op: int + mem: int + flags: int + size: int + iters: int + timeNs: int + cycles: int +struct_NV2080_CTRL_CMD_GSP_CORE_TEST_PARAMS.register_fields([('op', NV2080_CTRL_GSP_CORE_TEST_OP, 0), ('mem', NV2080_CTRL_GSP_CORE_TEST_MEM, 4), ('flags', NvU64, 8), ('size', NvU64, 16), ('iters', NvU64, 24), ('timeNs', NvU64, 32), ('cycles', NvU64, 40)]) +NV2080_CTRL_CMD_GSP_CORE_TEST_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_GSP_CORE_TEST_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS(c.Struct): + SIZE = 8 + hshubNcisocMask: int + hshubNvlMask: int +struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS.register_fields([('hshubNcisocMask', NvU32, 0), ('hshubNvlMask', NvU32, 4)]) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS(c.Struct): + SIZE = 8 + ecMode: int + status: int +struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS.register_fields([('ecMode', NvU32, 0), ('status', NvU32, 4)]) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS(c.Struct): + SIZE = 532 + version: int + port: int + flags: int + inputCount: int + inputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] + outputCount: int + outputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] +struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('inputCount', NvU32, 12), ('inputBuffer', c.Array[NvU8, Literal[256]], 16), ('outputCount', NvU32, 272), ('outputBuffer', c.Array[NvU8, Literal[256]], 276)]) +NV2080_CTRL_I2C_READ_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_READ_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS(c.Struct): + SIZE = 276 + version: int + port: int + flags: int + inputCount: int + inputBuffer: c.Array[ctypes.c_ubyte, Literal[256]] + encrClientID: int +struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('inputCount', NvU32, 12), ('inputBuffer', c.Array[NvU8, Literal[256]], 16), ('encrClientID', NvU32, 272)]) +NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_RW_REG_PARAMS(c.Struct): + SIZE = 276 + version: int + port: int + flags: int + addr: int + reg: int + bufsize: int + buffer: c.Array[ctypes.c_ubyte, Literal[255]] +struct_NV2080_CTRL_I2C_RW_REG_PARAMS.register_fields([('version', NvU32, 0), ('port', NvU32, 4), ('flags', NvU32, 8), ('addr', NvU32, 12), ('reg', NvU8, 16), ('bufsize', NvU8, 17), ('buffer', c.Array[NvU8, Literal[255]], 18)]) +NV2080_CTRL_I2C_RW_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +NV2080_CTRL_I2C_READ_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +NV2080_CTRL_I2C_WRITE_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_RW_REG_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_ACCESS_PARAMS(c.Struct): + SIZE = 40 + token: int + cmd: int + port: int + flags: int + data: ctypes.c_void_p + status: int + dataBuffSize: int + speed: int + encrClientID: int +struct_NV2080_CTRL_I2C_ACCESS_PARAMS.register_fields([('token', NvU32, 0), ('cmd', NvU32, 4), ('port', NvU32, 8), ('flags', NvU32, 12), ('data', NvP64, 16), ('status', NvU32, 24), ('dataBuffSize', NvU32, 28), ('speed', NvU32, 32), ('encrClientID', NvU32, 36)]) +NV2080_CTRL_I2C_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS(c.Struct): + SIZE = 12 + head: int + authType: int + status: int +struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS.register_fields([('head', NvU32, 0), ('authType', NvU32, 4), ('status', NvU32, 8)]) +NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 32 + feHwSysCap: int + windowPresentMask: int + numHeads: int + i2cPort: int + internalDispActiveMask: int + embeddedDisplayPortMask: int + bExternalMuxSupported: int + bInternalMuxSupported: int + numDispChannels: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS.register_fields([('feHwSysCap', NvU32, 0), ('windowPresentMask', NvU32, 4), ('numHeads', NvU32, 8), ('i2cPort', NvU32, 12), ('internalDispActiveMask', NvU32, 16), ('embeddedDisplayPortMask', NvU32, 20), ('bExternalMuxSupported', NvBool, 24), ('bInternalMuxSupported', NvBool, 25), ('numDispChannels', NvU32, 28)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS(c.Struct): + SIZE = 40 + bOneToOneComptagLineAllocation: int + bUseOneToFourComptagLineAllocation: int + bUseRawModeComptaglineAllocation: int + bDisableCompbitBacking: int + bDisablePostL2Compression: int + bEnabledEccFBPA: int + bL2PreFill: int + l2CacheSize: int + bFbpaPresent: int + comprPageSize: int + comprPageShift: int + ramType: int + ltcCount: int + ltsPerLtcCount: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS.register_fields([('bOneToOneComptagLineAllocation', NvBool, 0), ('bUseOneToFourComptagLineAllocation', NvBool, 1), ('bUseRawModeComptaglineAllocation', NvBool, 2), ('bDisableCompbitBacking', NvBool, 3), ('bDisablePostL2Compression', NvBool, 4), ('bEnabledEccFBPA', NvBool, 5), ('bL2PreFill', NvBool, 6), ('l2CacheSize', NvU64, 8), ('bFbpaPresent', NvBool, 16), ('comprPageSize', NvU32, 20), ('comprPageShift', NvU32, 24), ('ramType', NvU32, 28), ('ltcCount', NvU32, 32), ('ltsPerLtcCount', NvU32, 36)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS(c.Struct): + SIZE = 520 + accessCounterIndex: int + bufferSize: int + bufferPteArray: c.Array[ctypes.c_uint64, Literal[64]] +struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS.register_fields([('accessCounterIndex', NvU32, 0), ('bufferSize', NvU32, 4), ('bufferPteArray', c.Array[NvU64, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS(c.Struct): + SIZE = 4 + accessCounterIndex: int +struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS.register_fields([('accessCounterIndex', NvU32, 0)]) +NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS(c.Struct): + SIZE = 23 + capsTbl: c.Array[ctypes.c_ubyte, Literal[23]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[23]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS(c.Struct): + SIZE = 184 + engineCaps: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_CAPS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS.register_fields([('engineCaps', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_CAPS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER(c.Struct): + SIZE = 9220 + globalSmId: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId, Literal[512]] + numSm: int + numTpc: int +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId(c.Struct): + SIZE = 18 + gpcId: int + localTpcId: int + localSmId: int + globalTpcId: int + virtualGpcId: int + migratableTpcId: int + ugpuId: int + physicalCpcId: int + virtualTpcId: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId.register_fields([('gpcId', NvU16, 0), ('localTpcId', NvU16, 2), ('localSmId', NvU16, 4), ('globalTpcId', NvU16, 6), ('virtualGpcId', NvU16, 8), ('migratableTpcId', NvU16, 10), ('ugpuId', NvU16, 12), ('physicalCpcId', NvU16, 14), ('virtualTpcId', NvU16, 16)]) +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER.register_fields([('globalSmId', c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER_globalSmId, Literal[512]], 0), ('numSm', NvU16, 9216), ('numTpc', NvU16, 9218)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS(c.Struct): + SIZE = 73760 + globalSmOrder: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS.register_fields([('globalSmOrder', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GLOBAL_SM_ORDER, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVDEC_CAPS(c.Struct): + SIZE = 8 + capsTbl: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_NVDEC_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_NVDEC_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVDEC_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVDEC_GET_CAPS_PARAMS(c.Struct): + SIZE = 72 + caps: c.Array[struct_NV2080_CTRL_INTERNAL_NVDEC_CAPS, Literal[8]] + valid: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_NVDEC_GET_CAPS_PARAMS.register_fields([('caps', c.Array[NV2080_CTRL_INTERNAL_NVDEC_CAPS, Literal[8]], 0), ('valid', c.Array[NvBool, Literal[8]], 64)]) +NV2080_CTRL_INTERNAL_NVDEC_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVDEC_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVENC_CAPS(c.Struct): + SIZE = 6 + capsTbl: c.Array[ctypes.c_ubyte, Literal[6]] +struct_NV2080_CTRL_INTERNAL_NVENC_CAPS.register_fields([('capsTbl', c.Array[NvU8, Literal[6]], 0)]) +NV2080_CTRL_INTERNAL_NVENC_CAPS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVENC_CAPS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVENC_GET_CAPS_PARAMS(c.Struct): + SIZE = 56 + caps: c.Array[struct_NV2080_CTRL_INTERNAL_NVENC_CAPS, Literal[8]] + valid: c.Array[ctypes.c_ubyte, Literal[8]] +struct_NV2080_CTRL_INTERNAL_NVENC_GET_CAPS_PARAMS.register_fields([('caps', c.Array[NV2080_CTRL_INTERNAL_NVENC_CAPS, Literal[8]], 0), ('valid', c.Array[NvBool, Literal[8]], 48)]) +NV2080_CTRL_INTERNAL_NVENC_GET_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVENC_GET_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS(c.Struct): + SIZE = 1336 + gpcMask: int + tpcMask: c.Array[ctypes.c_uint32, Literal[64]] + tpcCount: c.Array[ctypes.c_uint32, Literal[64]] + physGpcMask: int + mmuPerGpc: c.Array[ctypes.c_uint32, Literal[64]] + tpcToPesMap: c.Array[ctypes.c_uint32, Literal[10]] + numPesPerGpc: c.Array[ctypes.c_uint32, Literal[64]] + zcullMask: c.Array[ctypes.c_uint32, Literal[64]] + physGfxGpcMask: int + numGfxTpc: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS.register_fields([('gpcMask', NvU32, 0), ('tpcMask', c.Array[NvU32, Literal[64]], 4), ('tpcCount', c.Array[NvU32, Literal[64]], 260), ('physGpcMask', NvU32, 516), ('mmuPerGpc', c.Array[NvU32, Literal[64]], 520), ('tpcToPesMap', c.Array[NvU32, Literal[10]], 776), ('numPesPerGpc', c.Array[NvU32, Literal[64]], 816), ('zcullMask', c.Array[NvU32, Literal[64]], 1072), ('physGfxGpcMask', NvU32, 1328), ('numGfxTpc', NvU32, 1332)]) +NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS(c.Struct): + SIZE = 10688 + floorsweepingMasks: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS.register_fields([('floorsweepingMasks', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_FLOORSWEEPING_MASKS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS +@c.record +class struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS(c.Struct): + SIZE = 1056 + hUserClient: int + hChannel: int + bufferType: int + firstPage: int + numPages: int + physAddrs: c.Array[ctypes.c_uint64, Literal[128]] + bNoMorePages: int +struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS.register_fields([('hUserClient', NvHandle, 0), ('hChannel', NvHandle, 4), ('bufferType', NvU32, 8), ('firstPage', NvU32, 12), ('numPages', NvU32, 16), ('physAddrs', c.Array[NvU64, Literal[128]], 24), ('bNoMorePages', NvBool, 1048)]) +NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS: TypeAlias = struct_NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_INFO(c.Struct): + SIZE = 8 + index: int + data: int +struct_NV2080_CTRL_INTERNAL_GR_INFO.register_fields([('index', NvU32, 0), ('data', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GR_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO(c.Struct): + SIZE = 504 + infoList: c.Array[struct_NV2080_CTRL_INTERNAL_GR_INFO, Literal[63]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO.register_fields([('infoList', c.Array[NV2080_CTRL_INTERNAL_GR_INFO, Literal[63]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS(c.Struct): + SIZE = 4032 + engineInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS.register_fields([('engineInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO(c.Struct): + SIZE = 40 + widthAlignPixels: int + heightAlignPixels: int + pixelSquaresByAliquots: int + aliquotTotal: int + zcullRegionByteMultiplier: int + zcullRegionHeaderSize: int + zcullSubregionHeaderSize: int + subregionCount: int + subregionWidthAlignPixels: int + subregionHeightAlignPixels: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO.register_fields([('widthAlignPixels', NvU32, 0), ('heightAlignPixels', NvU32, 4), ('pixelSquaresByAliquots', NvU32, 8), ('aliquotTotal', NvU32, 12), ('zcullRegionByteMultiplier', NvU32, 16), ('zcullRegionHeaderSize', NvU32, 20), ('zcullSubregionHeaderSize', NvU32, 24), ('subregionCount', NvU32, 28), ('subregionWidthAlignPixels', NvU32, 32), ('subregionHeightAlignPixels', NvU32, 36)]) +NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS(c.Struct): + SIZE = 320 + engineZcullInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS.register_fields([('engineZcullInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_ZCULL_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ZCULL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO(c.Struct): + SIZE = 12 + ropUnitCount: int + ropOperationsFactor: int + ropOperationsCount: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO.register_fields([('ropUnitCount', NvU32, 0), ('ropOperationsFactor', NvU32, 4), ('ropOperationsCount', NvU32, 8)]) +NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS(c.Struct): + SIZE = 96 + engineRopInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS.register_fields([('engineRopInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_ROP_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ROP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS(c.Struct): + SIZE = 256 + mask: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS.register_fields([('mask', c.Array[NvU32, Literal[64]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS(c.Struct): + SIZE = 2048 + enginePpcMasks: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS.register_fields([('enginePpcMasks', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_PPC_MASKS, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PPC_MASKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO(c.Struct): + SIZE = 8 + size: int + alignment: int +struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO.register_fields([('size', NvU32, 0), ('alignment', NvU32, 4)]) +NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO(c.Struct): + SIZE = 208 + engine: c.Array[struct_NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO, Literal[26]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO.register_fields([('engine', c.Array[NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_BUFFER_INFO, Literal[26]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS(c.Struct): + SIZE = 1664 + engineContextBuffersInfo: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS.register_fields([('engineContextBuffersInfo', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_CONTEXT_BUFFERS_INFO, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER(c.Struct): + SIZE = 9 + imla0: int + fmla16: int + dp: int + fmla32: int + ffma: int + imla1: int + imla2: int + imla3: int + imla4: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER.register_fields([('imla0', NvU8, 0), ('fmla16', NvU8, 1), ('dp', NvU8, 2), ('fmla32', NvU8, 3), ('ffma', NvU8, 4), ('imla1', NvU8, 5), ('imla2', NvU8, 6), ('imla3', NvU8, 7), ('imla4', NvU8, 8)]) +NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS(c.Struct): + SIZE = 72 + smIssueRateModifier: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS.register_fields([('smIssueRateModifier', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS(c.Struct): + SIZE = 88 + chipSubRev: int + emulationRev1: int + isCmpSku: int + pciDeviceId: int + pciSubDeviceId: int + pciRevisionId: int + regBases: c.Array[ctypes.c_uint32, Literal[16]] +struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS.register_fields([('chipSubRev', NvU8, 0), ('emulationRev1', NvU32, 4), ('isCmpSku', NvBool, 8), ('pciDeviceId', NvU32, 12), ('pciSubDeviceId', NvU32, 16), ('pciRevisionId', NvU32, 20), ('regBases', c.Array[NvU32, Literal[16]], 24)]) +NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + bEnable: int +struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('bEnable', NvBool, 16)]) +NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_HW_ENABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS(c.Struct): + SIZE = 24 + grRouteInfo: struct_NV0080_CTRL_GR_ROUTE_INFO + offset: int +struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS.register_fields([('grRouteInfo', NV2080_CTRL_GR_ROUTE_INFO, 0), ('offset', NvU32, 16)]) +NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GR_FECS_TRACE_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE(c.Struct): + SIZE = 4 + fecsRecordSize: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE.register_fields([('fecsRecordSize', NvU32, 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS(c.Struct): + SIZE = 32 + fecsRecordSize: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS.register_fields([('fecsRecordSize', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES(c.Struct): + SIZE = 32 + fecsRecordSize: int + timestampHiTagMask: int + timestampHiTagShift: int + timestampVMask: int + numLowerBitsZeroShift: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES.register_fields([('fecsRecordSize', NvU32, 0), ('timestampHiTagMask', NvU32, 4), ('timestampHiTagShift', NvU8, 8), ('timestampVMask', NvU64, 16), ('numLowerBitsZeroShift', NvU8, 24)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS(c.Struct): + SIZE = 256 + fecsTraceDefines: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS.register_fields([('fecsTraceDefines', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DEVICE_INFO(c.Struct): + SIZE = 48 + faultId: int + instanceId: int + typeEnum: int + resetId: int + devicePriBase: int + isEngine: int + rlEngId: int + runlistPriBase: int + groupId: int + ginTargetId: int + deviceBroadcastPriBase: int + groupLocalInstanceId: int +struct_NV2080_CTRL_INTERNAL_DEVICE_INFO.register_fields([('faultId', NvU32, 0), ('instanceId', NvU32, 4), ('typeEnum', NvU32, 8), ('resetId', NvU32, 12), ('devicePriBase', NvU32, 16), ('isEngine', NvU32, 20), ('rlEngId', NvU32, 24), ('runlistPriBase', NvU32, 28), ('groupId', NvU32, 32), ('ginTargetId', NvU32, 36), ('deviceBroadcastPriBase', NvU32, 40), ('groupLocalInstanceId', NvU32, 44)]) +NV2080_CTRL_INTERNAL_DEVICE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_DEVICE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS(c.Struct): + SIZE = 24580 + numEntries: int + deviceInfoTable: c.Array[struct_NV2080_CTRL_INTERNAL_DEVICE_INFO, Literal[512]] +struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS.register_fields([('numEntries', NvU32, 0), ('deviceInfoTable', c.Array[NV2080_CTRL_INTERNAL_DEVICE_INFO, Literal[512]], 4)]) +NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS(c.Struct): + SIZE = 20492 + userRegisterAccessMapSize: int + compressedSize: int + compressedData: c.Array[ctypes.c_ubyte, Literal[16384]] + profilingRangesSize: int + profilingRanges: c.Array[ctypes.c_ubyte, Literal[4096]] +struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS.register_fields([('userRegisterAccessMapSize', NvU32, 0), ('compressedSize', NvU32, 4), ('compressedData', c.Array[NvU8, Literal[16384]], 8), ('profilingRangesSize', NvU32, 16392), ('profilingRanges', c.Array[NvU8, Literal[4096]], 16396)]) +NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NV_RANGE(c.Struct): + SIZE = 16 + lo: int + hi: int +struct_NV2080_CTRL_INTERNAL_NV_RANGE.register_fields([('lo', NvU64, 0), ('hi', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NV_RANGE: TypeAlias = struct_NV2080_CTRL_INTERNAL_NV_RANGE +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS(c.Struct): + SIZE = 24 + swizzId: int + memAddrRange: struct_NV2080_CTRL_INTERNAL_NV_RANGE +struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS.register_fields([('swizzId', NvU32, 0), ('memAddrRange', NV2080_CTRL_INTERNAL_NV_RANGE, 8)]) +NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES(c.Struct): + SIZE = 1 + bPerSubCtxheaderSupported: int +struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES.register_fields([('bPerSubCtxheaderSupported', NvBool, 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS(c.Struct): + SIZE = 16 + ctsId: int + bCheckClientGI: int + giComputeSize: int + bCtsIdValid: int +struct_NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS.register_fields([('ctsId', NvU32, 0), ('bCheckClientGI', NvBool, 4), ('giComputeSize', NvU32, 8), ('bCtsIdValid', NvBool, 12)]) +NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS(c.Struct): + SIZE = 8 + pdbTable: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS.register_fields([('pdbTable', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_PDB_PROPERTIES, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS(c.Struct): + SIZE = 24 + instMemPhysAddr: int + instMemSize: int + instMemAddrSpace: int + instMemCpuCacheAttr: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS.register_fields([('instMemPhysAddr', NvU64, 0), ('instMemSize', NvU64, 8), ('instMemAddrSpace', NvU32, 16), ('instMemCpuCacheAttr', NvU32, 20)]) +NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS(c.Struct): + SIZE = 4 + ipVersion: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS.register_fields([('ipVersion', NvU32, 0)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS(c.Struct): + SIZE = 4 + smcMode: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS.register_fields([('smcMode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS(c.Struct): + SIZE = 16 + head: int + rgLineNum: int + intrLine: int + bEnable: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS.register_fields([('head', NvU32, 0), ('rgLineNum', NvU32, 4), ('intrLine', NvU32, 8), ('bEnable', NvBool, 12)]) +NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO(c.Struct): + SIZE = 72 + partitionFlag: int + grCount: int + gfxGrCount: int + gpcCount: int + virtualGpcCount: int + gfxGpcCount: int + veidCount: int + smCount: int + ceCount: int + nvEncCount: int + nvDecCount: int + nvJpgCount: int + nvOfaCount: int + validCTSIdMask: int + validGfxCTSIdMask: int +struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO.register_fields([('partitionFlag', NvU32, 0), ('grCount', NvU32, 4), ('gfxGrCount', NvU32, 8), ('gpcCount', NvU32, 12), ('virtualGpcCount', NvU32, 16), ('gfxGpcCount', NvU32, 20), ('veidCount', NvU32, 24), ('smCount', NvU32, 28), ('ceCount', NvU32, 32), ('nvEncCount', NvU32, 36), ('nvDecCount', NvU32, 40), ('nvJpgCount', NvU32, 44), ('nvOfaCount', NvU32, 48), ('validCTSIdMask', NvU64, 56), ('validGfxCTSIdMask', NvU64, 64)]) +NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS(c.Struct): + SIZE = 6488 + count: int + table: c.Array[struct_NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO, Literal[90]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS.register_fields([('count', NvU32, 0), ('table', c.Array[NV2080_CTRL_INTERNAL_MIGMGR_PROFILE_INFO, Literal[90]], 8)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS(c.Struct): + SIZE = 40 + partitionableMemSize: int + bottomRsvdSize: int + topRsvdSize: int + partitionableStartAddr: int + partitionableEndAddr: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS.register_fields([('partitionableMemSize', NvU64, 0), ('bottomRsvdSize', NvU64, 8), ('topRsvdSize', NvU64, 16), ('partitionableStartAddr', NvU64, 24), ('partitionableEndAddr', NvU64, 32)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS(c.Struct): + SIZE = 32 + engineMask: c.Array[ctypes.c_uint64, Literal[4]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS.register_fields([('engineMask', c.Array[NvU64, Literal[4]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS(c.Struct): + SIZE = 4112 + rlBuffers: c.Array[c.Array[struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], Literal[64]] + runlistIdMask: int + swizzId: int +struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS.register_fields([('rlBuffers', c.Array[c.Array[NV2080_CTRL_INTERNAL_MEMDESC_INFO, Literal[2]], Literal[64]], 0), ('runlistIdMask', NvU64, 4096), ('swizzId', NvU32, 4104)]) +NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS(c.Struct): + SIZE = 492 + tegraImpImportData: struct_TEGRA_IMP_IMPORT_DATA +@c.record +class struct_TEGRA_IMP_IMPORT_DATA(c.Struct): + SIZE = 492 + max_iso_bw_kbps: int + num_dram_channels: int + num_dram_clk_entries: int + dram_clk_instance: c.Array[struct_DRAM_CLK_INSTANCE, Literal[24]] +TEGRA_IMP_IMPORT_DATA: TypeAlias = struct_TEGRA_IMP_IMPORT_DATA +@c.record +class struct_DRAM_CLK_INSTANCE(c.Struct): + SIZE = 20 + dram_clk_freq_khz: int + mchub_clk_khz: int + mc_clk_khz: int + max_iso_bw_kbps: int + switch_latency_ns: int +DRAM_CLK_INSTANCE: TypeAlias = struct_DRAM_CLK_INSTANCE +struct_DRAM_CLK_INSTANCE.register_fields([('dram_clk_freq_khz', NvU32, 0), ('mchub_clk_khz', NvU32, 4), ('mc_clk_khz', NvU32, 8), ('max_iso_bw_kbps', NvU32, 12), ('switch_latency_ns', NvU32, 16)]) +struct_TEGRA_IMP_IMPORT_DATA.register_fields([('max_iso_bw_kbps', NvU32, 0), ('num_dram_channels', NvU32, 4), ('num_dram_clk_entries', NvU32, 8), ('dram_clk_instance', c.Array[DRAM_CLK_INSTANCE, Literal[24]], 12)]) +struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS.register_fields([('tegraImpImportData', TEGRA_IMP_IMPORT_DATA, 0)]) +NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS(c.Struct): + SIZE = 6 + pciDeviceId: int + pciSubDeviceId: int + iseGPUBridge: int + approvedBusType: int +struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS.register_fields([('pciDeviceId', NvU16, 0), ('pciSubDeviceId', NvU16, 2), ('iseGPUBridge', NvBool, 4), ('approvedBusType', NvU8, 5)]) +NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS(c.Struct): + SIZE = 48 + local2Remote: int + remote2Local: int + localP2PDomainRemoteAddr: int + remoteP2PDomainLocalAddr: int + remoteWMBoxLocalAddr: int + p2pWmbTag: int + bNeedWarBug999673: int +struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS.register_fields([('local2Remote', NvU32, 0), ('remote2Local', NvU32, 4), ('localP2PDomainRemoteAddr', NvU64, 8), ('remoteP2PDomainLocalAddr', NvU64, 16), ('remoteWMBoxLocalAddr', NvU64, 24), ('p2pWmbTag', NvU64, 32), ('bNeedWarBug999673', NvBool, 40)]) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS(c.Struct): + SIZE = 40 + local2Remote: int + remote2Local: int + localP2PDomainRemoteAddr: int + remoteP2PDomainLocalAddr: int + remoteWMBoxAddrU64: int + p2pWmbTag: int +struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS.register_fields([('local2Remote', NvU32, 0), ('remote2Local', NvU32, 4), ('localP2PDomainRemoteAddr', NvU64, 8), ('remoteP2PDomainLocalAddr', NvU64, 16), ('remoteWMBoxAddrU64', NvU64, 24), ('p2pWmbTag', NvU64, 32)]) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS(c.Struct): + SIZE = 8 + peerIdx: int + bNeedWarBug999673: int +struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS.register_fields([('peerIdx', NvU32, 0), ('bNeedWarBug999673', NvBool, 4)]) +NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS(c.Struct): + SIZE = 4 + peerId: int +struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS.register_fields([('peerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS(c.Struct): + SIZE = 4 + peerId: int +struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS.register_fields([('peerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS(c.Struct): + SIZE = 2056 + gfid: int + numEntries: int + gpaEntries: c.Array[ctypes.c_uint64, Literal[128]] + spaEntries: c.Array[ctypes.c_uint64, Literal[128]] +struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS.register_fields([('gfid', NvU32, 0), ('numEntries', NvU32, 4), ('gpaEntries', c.Array[NvU64, Literal[128]], 8), ('spaEntries', c.Array[NvU64, Literal[128]], 1032)]) +NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS(c.Struct): + SIZE = 56 + addressSpace: int + physicalAddr: int + limit: int + cacheSnoop: int + hclass: int + channelInstance: int + valid: int + pbTargetAperture: int + channelPBSize: int + subDeviceId: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS.register_fields([('addressSpace', NvU32, 0), ('physicalAddr', NvU64, 8), ('limit', NvU64, 16), ('cacheSnoop', NvU32, 24), ('hclass', NvU32, 28), ('channelInstance', NvU32, 32), ('valid', NvBool, 36), ('pbTargetAperture', NvU32, 40), ('channelPBSize', NvU32, 44), ('subDeviceId', NvU32, 48)]) +NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 16 + replayableFaultBufferSize: int + replayableShadowFaultBufferMetadataSize: int + nonReplayableFaultBufferSize: int + nonReplayableShadowFaultBufferMetadataSize: int +struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS.register_fields([('replayableFaultBufferSize', NvU32, 0), ('replayableShadowFaultBufferMetadataSize', NvU32, 4), ('nonReplayableFaultBufferSize', NvU32, 8), ('nonReplayableShadowFaultBufferMetadataSize', NvU32, 12)]) +NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS +NV2080_CTRL_INTERNAL_GR_GET_CTXSW_MODES_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS(c.Struct): + SIZE = 8 + moduleIndex: int + size: int +struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS.register_fields([('moduleIndex', NvU32, 0), ('size', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY(c.Struct): + SIZE = 16 + engineIdx: int + pmcIntrMask: int + vectorStall: int + vectorNonStall: int +struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY.register_fields([('engineIdx', NvU16, 0), ('pmcIntrMask', NvU32, 4), ('vectorStall', NvU32, 8), ('vectorNonStall', NvU32, 12)]) +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY: TypeAlias = struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY +@c.record +class struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS(c.Struct): + SIZE = 2112 + tableLen: int + table: c.Array[struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY, Literal[128]] + subtreeMap: c.Array[struct_NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]] +@c.record +class struct_NV2080_INTR_CATEGORY_SUBTREE_MAP(c.Struct): + SIZE = 8 + subtreeMask: int +NV2080_INTR_CATEGORY_SUBTREE_MAP: TypeAlias = struct_NV2080_INTR_CATEGORY_SUBTREE_MAP +struct_NV2080_INTR_CATEGORY_SUBTREE_MAP.register_fields([('subtreeMask', NvU64, 0)]) +struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS.register_fields([('tableLen', NvU32, 0), ('table', c.Array[NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_ENTRY, Literal[128]], 4), ('subtreeMap', c.Array[NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]], 2056)]) +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS(c.Struct): + SIZE = 1 + bReservation: int +struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS.register_fields([('bReservation', NvBool, 0)]) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS(c.Struct): + SIZE = 3 + bReservation: int + bClientHandlesGrGating: int + bRmHandlesIdleSlow: int +struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS.register_fields([('bReservation', NvBool, 0), ('bClientHandlesGrGating', NvBool, 1), ('bRmHandlesIdleSlow', NvBool, 2)]) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS(c.Struct): + SIZE = 8 + displayMask: int + numHeads: int +struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS.register_fields([('displayMask', NvU32, 0), ('numHeads', NvU32, 4)]) +NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS(c.Struct): + SIZE = 240 + fbMemPageRanges: c.Array[struct_NV2080_CTRL_INTERNAL_NV_RANGE, Literal[15]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS.register_fields([('fbMemPageRanges', c.Array[NV2080_CTRL_INTERNAL_NV_RANGE, Literal[15]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS(c.Struct): + SIZE = 8 + runlistId: int + numChannels: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS.register_fields([('runlistId', NvU32, 0), ('numChannels', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS(c.Struct): + SIZE = 32 + memBoundaryCfgA: int + memBoundaryCfgB: int + memBoundaryCfgC: int + memBoundaryCfg: int + memBoundaryCfgValInit: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS.register_fields([('memBoundaryCfgA', NvU64, 0), ('memBoundaryCfgB', NvU64, 8), ('memBoundaryCfgC', NvU32, 16), ('memBoundaryCfg', NvU32, 20), ('memBoundaryCfgValInit', NvU32, 24)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS +NV2080_CTRL_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS(c.Struct): + SIZE = 32 + data: c.Array[ctypes.c_uint32, Literal[8]] +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS.register_fields([('data', c.Array[NvU32, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X(c.Struct): + SIZE = 8 + flags: int + duration: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X.register_fields([('flags', NvBool, 0), ('duration', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS(c.Struct): + SIZE = 1 + bActivate: int +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS.register_fields([('bActivate', NvBool, 0)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS(c.Struct): + SIZE = 16 + flags: int + bBridgeless: int + currLimits: c.Array[ctypes.c_uint32, Literal[2]] +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS.register_fields([('flags', NvU32, 0), ('bBridgeless', NvBool, 4), ('currLimits', c.Array[NvU32, Literal[2]], 8)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS(c.Struct): + SIZE = 16 + hysteresisus: int + bHystersisEnable: int + bSliGpuBoostSyncEnable: int +struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS.register_fields([('hysteresisus', NvU64, 0), ('bHystersisEnable', NvBool, 8), ('bSliGpuBoostSyncEnable', NvBool, 9)]) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 2064 + hClient: int + hObject: int + faultBufferSize: int + faultBufferPteArray: c.Array[ctypes.c_uint64, Literal[256]] +struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS.register_fields([('hClient', NvHandle, 0), ('hObject', NvHandle, 4), ('faultBufferSize', NvU32, 8), ('faultBufferPteArray', c.Array[NvU64, Literal[256]], 16)]) +NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 24032 + shadowFaultBufferQueuePhysAddr: int + shadowFaultBufferSize: int + shadowFaultBufferMetadataSize: int + shadowFaultBufferPteArray: c.Array[ctypes.c_uint64, Literal[3000]] + shadowFaultBufferType: int + faultBufferSharedMemoryPhysAddr: int +struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS.register_fields([('shadowFaultBufferQueuePhysAddr', NvU64, 0), ('shadowFaultBufferSize', NvU32, 8), ('shadowFaultBufferMetadataSize', NvU32, 12), ('shadowFaultBufferPteArray', c.Array[NvU64, Literal[3000]], 16), ('shadowFaultBufferType', NvU32, 24016), ('faultBufferSharedMemoryPhysAddr', NvU64, 24024)]) +NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS(c.Struct): + SIZE = 4 + shadowFaultBufferType: int +struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS.register_fields([('shadowFaultBufferType', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS(c.Struct): + SIZE = 184 + PdeCopyParams: struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS +struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS.register_fields([('PdeCopyParams', NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS, 0)]) +NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X(c.Struct): + SIZE = 16 + flags: int + boostDuration: int + gfId: int + bOverrideInfinite: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X.register_fields([('flags', NvU32, 0), ('boostDuration', NvU32, 4), ('gfId', NvU32, 8), ('bOverrideInfinite', NvBool, 12)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X(c.Struct): + SIZE = 8 + bIsCudaClient: int + gfId: int +struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X.register_fields([('bIsCudaClient', NvBool, 0), ('gfId', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X +@c.record +class struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO(c.Struct): + SIZE = 80 + skylineVgpcSize: c.Array[ctypes.c_ubyte, Literal[64]] + singletonVgpcMask: int + maxInstances: int + computeSizeFlag: int + numNonSingletonVgpcs: int +struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO.register_fields([('skylineVgpcSize', c.Array[NvU8, Literal[64]], 0), ('singletonVgpcMask', NvU32, 64), ('maxInstances', NvU32, 68), ('computeSizeFlag', NvU32, 72), ('numNonSingletonVgpcs', NvU32, 76)]) +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS(c.Struct): + SIZE = 724 + skylineTable: c.Array[struct_NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO, Literal[9]] + validEntries: int +struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS.register_fields([('skylineTable', c.Array[NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO, Literal[9]], 0), ('validEntries', NvU32, 720)]) +NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_SET_PARTITIONING_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_SET_GPU_INSTANCES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_GET_GPU_INSTANCES_PARAMS: TypeAlias = struct_NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS(c.Struct): + SIZE = 1 + bZbcSurfacesExist: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS.register_fields([('bZbcSurfacesExist', NvBool, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO(c.Struct): + SIZE = 56 + enginesMask: c.Array[ctypes.c_uint64, Literal[4]] + partitionFlags: int + gpcMask: int + virtualGpcCount: int + veidOffset: int + veidCount: int +struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO.register_fields([('enginesMask', c.Array[NvU64, Literal[4]], 0), ('partitionFlags', NvU32, 32), ('gpcMask', NvU32, 36), ('virtualGpcCount', NvU32, 40), ('veidOffset', NvU32, 44), ('veidCount', NvU32, 48)]) +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS(c.Struct): + SIZE = 80 + swizzId: int + uuid: c.Array[ctypes.c_ubyte, Literal[16]] + info: struct_NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO +struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS.register_fields([('swizzId', NvU32, 0), ('uuid', c.Array[NvU8, Literal[16]], 4), ('info', NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_INFO, 24)]) +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +NV2080_CTRL_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_EXPORT_GPU_INSTANCE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS(c.Struct): + SIZE = 4 + flags: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS.register_fields([('flags', NvU32, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 4 + bPcieGen4Capable: int + bIsC2CLinkUp: int + bIsDeviceMultiFunction: int + bGcxPmuCfgSpaceRestore: int +struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS.register_fields([('bPcieGen4Capable', NvBool, 0), ('bIsC2CLinkUp', NvBool, 1), ('bIsDeviceMultiFunction', NvBool, 2), ('bGcxPmuCfgSpaceRestore', NvBool, 3)]) +NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS(c.Struct): + SIZE = 12 + programPeerMask: int + invalidatePeerMask: int + programPciePeerMask: int +struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS.register_fields([('programPeerMask', NvU32, 0), ('invalidatePeerMask', NvU32, 4), ('programPciePeerMask', NvU32, 8)]) +NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS(c.Struct): + SIZE = 36 + linkMask: int + hshubIds: c.Array[ctypes.c_ubyte, Literal[32]] +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS.register_fields([('linkMask', NvU32, 0), ('hshubIds', c.Array[NvU8, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS(c.Struct): + SIZE = 4 + numHshubs: int +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS.register_fields([('numHshubs', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS(c.Struct): + SIZE = 1 + hshubId: int +struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS.register_fields([('hshubId', NvU8, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS(c.Struct): + SIZE = 4 + egmPeerId: int +struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS.register_fields([('egmPeerId', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS(c.Struct): + SIZE = 16 + bGet: int + addr: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS.register_fields([('bGet', NvBool, 0), ('addr', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS(c.Struct): + SIZE = 1 + maxActiveVGpuVMCount: int +struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS.register_fields([('maxActiveVGpuVMCount', NvU8, 0)]) +NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS(c.Struct): + SIZE = 1 + bRawMode: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS.register_fields([('bRawMode', NvBool, 0)]) +NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS(c.Struct): + SIZE = 4 + ccuSampleSize: int +struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS.register_fields([('ccuSampleSize', NvU32, 0)]) +NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_SAMPLE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO(c.Struct): + SIZE = 16 + phyAddr: int + shrBufSize: int + cntBlkSize: int +struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO.register_fields([('phyAddr', NvU64, 0), ('shrBufSize', NvU32, 8), ('cntBlkSize', NvU32, 12)]) +NV2080_CTRL_INTERNAL_CCU_MAP_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS(c.Struct): + SIZE = 144 + mapInfo: c.Array[struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO, Literal[9]] +struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS.register_fields([('mapInfo', c.Array[NV2080_CTRL_INTERNAL_CCU_MAP_INFO, Literal[9]], 0)]) +NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS(c.Struct): + SIZE = 2 + bDevShrBuf: int + bMigShrBuf: int +struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS.register_fields([('bDevShrBuf', NvBool, 0), ('bMigShrBuf', NvBool, 1)]) +NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO(c.Struct): + SIZE = 40 + gpuId: int + gpuInstance: int + p2pCaps: int + p2pOptimalReadCEs: int + p2pOptimalWriteCEs: int + p2pCapsStatus: c.Array[ctypes.c_ubyte, Literal[9]] + busPeerId: int + busEgmPeerId: int +struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO.register_fields([('gpuId', NvU32, 0), ('gpuInstance', NvU32, 4), ('p2pCaps', NvU32, 8), ('p2pOptimalReadCEs', NvU32, 12), ('p2pOptimalWriteCEs', NvU32, 16), ('p2pCapsStatus', c.Array[NvU8, Literal[9]], 20), ('busPeerId', NvU32, 32), ('busEgmPeerId', NvU32, 36)]) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS(c.Struct): + SIZE = 1284 + peerGpuCount: int + peerGpuInfos: c.Array[struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO, Literal[32]] +struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS.register_fields([('peerGpuCount', NvU32, 0), ('peerGpuInfos', c.Array[NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PEER_INFO, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS(c.Struct): + SIZE = 132 + peerGpuIdCount: int + peerGpuIds: c.Array[ctypes.c_uint32, Literal[32]] +struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS.register_fields([('peerGpuIdCount', NvU32, 0), ('peerGpuIds', c.Array[NvU32, Literal[32]], 4)]) +NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS(c.Struct): + SIZE = 3 + bCommonPciSwitchFound: int + p2pReadCapsStatus: int + p2pWriteCapsStatus: int +struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS.register_fields([('bCommonPciSwitchFound', NvBool, 0), ('p2pReadCapsStatus', NvU8, 1), ('p2pWriteCapsStatus', NvU8, 2)]) +NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS(c.Struct): + SIZE = 1 + enableRo: int +struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS.register_fields([('enableRo', NvBool, 0)]) +NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS(c.Struct): + SIZE = 3 + bSave: int + bUseVbios: int + bReturnEarly: int +struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS.register_fields([('bSave', NvBool, 0), ('bUseVbios', NvBool, 1), ('bReturnEarly', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS(c.Struct): + SIZE = 3 + bSave: int + bUseVbios: int + bVbiosCallSuccessful: int +struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS.register_fields([('bSave', NvBool, 0), ('bUseVbios', NvBool, 1), ('bVbiosCallSuccessful', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE(c.Struct): + SIZE = 24 + computeSize: int + flags: int + gfxGpcCount: int + gpcCount: int + veidCount: int + smCount: int + physicalSlots: int +struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE.register_fields([('computeSize', NvU8, 0), ('flags', NvU16, 2), ('gfxGpcCount', NvU32, 4), ('gpcCount', NvU32, 8), ('veidCount', NvU32, 12), ('smCount', NvU32, 16), ('physicalSlots', NvU32, 20)]) +NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE: TypeAlias = struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS(c.Struct): + SIZE = 196 + profileCount: int + profiles: c.Array[struct_NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS.register_fields([('profileCount', NvU32, 0), ('profiles', c.Array[NV2080_CTRL_INTERNAL_MIGMGR_COMPUTE_PROFILE, Literal[8]], 4)]) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS(c.Struct): + SIZE = 1 + bStreamState: int +struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS.register_fields([('bStreamState', NvBool, 0)]) +NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS(c.Struct): + SIZE = 1 + bExtDevFound: int +struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS.register_fields([('bExtDevFound', NvBool, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS(c.Struct): + SIZE = 96 + timingParameters: struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS +@c.record +class struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS(c.Struct): + SIZE = 96 + gpuId: int + output: int + protocol: int + structure: int + adjust: int + hDeltaStep: int + hDeltaMax: int + vDeltaStep: int + vDeltaMax: int + hSyncEnd: int + hBlankEnd: int + hBlankStart: int + hTotal: int + vSyncEnd: int + vBlankEnd: int + vBlankStart: int + vInterlacedBlankEnd: int + vInterlacedBlankStart: int + vTotal: int + refreshX10K: int + pixelClockHz: int + bOptimized: int +NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS: TypeAlias = struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS +struct_NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS.register_fields([('gpuId', NvU32, 0), ('output', NvU32, 4), ('protocol', NvU32, 8), ('structure', NvU32, 12), ('adjust', NvU32, 16), ('hDeltaStep', NvU32, 20), ('hDeltaMax', NvU32, 24), ('vDeltaStep', NvU32, 28), ('vDeltaMax', NvU32, 32), ('hSyncEnd', NvU32, 36), ('hBlankEnd', NvU32, 40), ('hBlankStart', NvU32, 44), ('hTotal', NvU32, 48), ('vSyncEnd', NvU32, 52), ('vBlankEnd', NvU32, 56), ('vBlankStart', NvU32, 60), ('vInterlacedBlankEnd', NvU32, 64), ('vInterlacedBlankStart', NvU32, 68), ('vTotal', NvU32, 72), ('refreshX10K', NvU32, 76), ('pixelClockHz', NvU64, 80), ('bOptimized', NvBool, 88)]) +struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS.register_fields([('timingParameters', NV30F1_CTRL_GSYNC_GET_OPTIMIZED_TIMING_PARAMS, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS(c.Struct): + SIZE = 16 + displayIds: c.Array[ctypes.c_uint32, Literal[4]] +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS.register_fields([('displayIds', c.Array[NvU32, Literal[4]], 0)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS(c.Struct): + SIZE = 52 + slave: c.Array[ctypes.c_uint32, Literal[4]] + localSlave: c.Array[ctypes.c_uint32, Literal[4]] + master: c.Array[ctypes.c_uint32, Literal[4]] + regStatus: int +struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS.register_fields([('slave', c.Array[NvU32, Literal[4]], 0), ('localSlave', c.Array[NvU32, Literal[4]], 16), ('master', c.Array[NvU32, Literal[4]], 32), ('regStatus', NvU32, 48)]) +NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS(c.Struct): + SIZE = 8 + headIdx: int + vActiveLines: int +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS.register_fields([('headIdx', NvU32, 0), ('vActiveLines', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS(c.Struct): + SIZE = 8 + displays: int + displayId: int +struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS.register_fields([('displays', NvU32, 0), ('displayId', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS(c.Struct): + SIZE = 8 + bEnableMaster: int + bRasterSyncGpioSaved: int + bRasterSyncGpioDirection: int +struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS.register_fields([('bEnableMaster', NvBool, 0), ('bRasterSyncGpioSaved', NvBool, 1), ('bRasterSyncGpioDirection', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS(c.Struct): + SIZE = 24 + hClient: int + hSysMem: int + bEnteringGcoffState: int + sysmemAddrOfSuspendResumeData: int +struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS.register_fields([('hClient', NvHandle, 0), ('hSysMem', NvHandle, 4), ('bEnteringGcoffState', NvBool, 8), ('sysmemAddrOfSuspendResumeData', NvU64, 16)]) +NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS(c.Struct): + SIZE = 1 + bDisableActiveChannels: int +struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS.register_fields([('bDisableActiveChannels', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS(c.Struct): + SIZE = 16 + hostReservedFb: int + vgpuTypeId: int +struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS.register_fields([('hostReservedFb', NvU64, 0), ('vgpuTypeId', NvU32, 8)]) +NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS(c.Struct): + SIZE = 4104 + status: int + backLightDataSize: int + backLightData: c.Array[ctypes.c_ubyte, Literal[4096]] +struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS.register_fields([('status', NvU32, 0), ('backLightDataSize', NvU16, 4), ('backLightData', c.Array[NvU8, Literal[4096]], 6)]) +NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS(c.Struct): + SIZE = 4 + numActiveLinksPerIoctrl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS.register_fields([('numActiveLinksPerIoctrl', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS(c.Struct): + SIZE = 4 + numLinksPerIoctrl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS.register_fields([('numLinksPerIoctrl', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS(c.Struct): + SIZE = 2 + bIsSysCtrlSupported: int + bIsPlatformLegacy: int +struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS.register_fields([('bIsSysCtrlSupported', NvBool, 0), ('bIsPlatformLegacy', NvBool, 1)]) +NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI(c.Struct): + SIZE = 8 + sensorId: int + limit: int +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI.register_fields([('sensorId', NvU32, 0), ('limit', NvU32, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA(c.Struct): + SIZE = 12 + type: int + data: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data(c.Struct): + SIZE = 8 + smbpbi: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data.register_fields([('smbpbi', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_SMBPBI, 0)]) +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA.register_fields([('type', NvU8, 0), ('data', struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_data, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA +@c.record +class struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS(c.Struct): + SIZE = 16 + flags: int + syncData: struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA +struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS.register_fields([('flags', NvU8, 0), ('syncData', NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA, 4)]) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +NV2080_CTRL_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +NV2080_CTRL_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS(c.Struct): + SIZE = 2 + flag: int + bStatus: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS.register_fields([('flag', NvU8, 0), ('bStatus', NvBool, 1)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS(c.Struct): + SIZE = 8 + bEnable: int + clientLimit: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS.register_fields([('bEnable', NvBool, 0), ('clientLimit', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS(c.Struct): + SIZE = 4 + targetTemp: int +struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS.register_fields([('targetTemp', NvS32, 0)]) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS(c.Struct): + SIZE = 1 + bEnable: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS.register_fields([('bEnable', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS(c.Struct): + SIZE = 4 + ctgpOffsetmW: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS.register_fields([('ctgpOffsetmW', NvU32, 0)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS(c.Struct): + SIZE = 8 + bVpsPs20Supported: int + vPstateIdxHighest: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS.register_fields([('bVpsPs20Supported', NvBool, 0), ('vPstateIdxHighest', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS(c.Struct): + SIZE = 8 + pStateIdx: int + vPstateIdxMapping: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS.register_fields([('pStateIdx', NvU32, 0), ('vPstateIdxMapping', NvU32, 4)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS(c.Struct): + SIZE = 4 + vPstateIdx: int +struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS.register_fields([('vPstateIdx', NvU32, 0)]) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS(c.Struct): + SIZE = 2 + bIsGC6Satisfied: int + bIsGCOFFSatisfied: int +struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS.register_fields([('bIsGC6Satisfied', NvBool, 0), ('bIsGCOFFSatisfied', NvBool, 1)]) +NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS(c.Struct): + SIZE = 8 + maxSec2SecureChannels: int + maxCeSecureChannels: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS.register_fields([('maxSec2SecureChannels', NvU32, 0), ('maxCeSecureChannels', NvU32, 4)]) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS(c.Struct): + SIZE = 1 + bDisable: int +struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS.register_fields([('bDisable', NvBool, 0)]) +NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS(c.Struct): + SIZE = 24 + pinSetIn: int + pinSetOut: int + bMasterScanLock: int + masterScanLockPin: int + bSlaveScanLock: int + slaveScanLockPin: int +struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS.register_fields([('pinSetIn', NvU32, 0), ('pinSetOut', NvU32, 4), ('bMasterScanLock', NvBool, 8), ('masterScanLockPin', NvU32, 12), ('bSlaveScanLock', NvBool, 16), ('slaveScanLockPin', NvU32, 20)]) +NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS(c.Struct): + SIZE = 16 + pinSet: int + gpioFunction: int + gpioPin: int + gpioDirection: int +struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS.register_fields([('pinSet', NvU32, 0), ('gpioFunction', NvU32, 4), ('gpioPin', NvU32, 8), ('gpioDirection', NvBool, 12)]) +NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_EDID_DATA(c.Struct): + SIZE = 524 + status: int + acpiId: int + bufferSize: int + edidBuffer: c.Array[ctypes.c_ubyte, Literal[512]] +struct_NV2080_CTRL_INTERNAL_EDID_DATA.register_fields([('status', NvU32, 0), ('acpiId', NvU32, 4), ('bufferSize', NvU32, 8), ('edidBuffer', c.Array[NvU8, Literal[512]], 12)]) +NV2080_CTRL_INTERNAL_EDID_DATA: TypeAlias = struct_NV2080_CTRL_INTERNAL_EDID_DATA +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS(c.Struct): + SIZE = 8388 + tableLen: int + edidTable: c.Array[struct_NV2080_CTRL_INTERNAL_EDID_DATA, Literal[16]] +struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS.register_fields([('tableLen', NvU32, 0), ('edidTable', c.Array[NV2080_CTRL_INTERNAL_EDID_DATA, Literal[16]], 4)]) +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 8 + numProbes: int +struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('numProbes', NvU64, 0)]) +NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 4 + bwMode: int + bLocalEgmEnabled: int +struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('bwMode', NvU16, 0), ('bLocalEgmEnabled', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS(c.Struct): + SIZE = 2 + bwMode: int +struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS.register_fields([('bwMode', NvU16, 0)]) +NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS(c.Struct): + SIZE = 2 + bIsBar1Trusted: int + bIsPcieTrusted: int +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS.register_fields([('bIsBar1Trusted', NvBool, 0), ('bIsPcieTrusted', NvBool, 1)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK(c.Struct): + SIZE = 12 + ivMask: c.Array[ctypes.c_uint32, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK.register_fields([('ivMask', c.Array[NvU32, Literal[3]], 0)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS(c.Struct): + SIZE = 40 + engineId: int + ivMaskSet: c.Array[struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS.register_fields([('engineId', NvU32, 0), ('ivMaskSet', c.Array[NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[3]], 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS(c.Struct): + SIZE = 76 + engineId: int + ivMaskSet: c.Array[struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[6]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS.register_fields([('engineId', NvU32, 0), ('ivMaskSet', c.Array[NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK, Literal[6]], 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS(c.Struct): + SIZE = 28 + globalH2DKey: int + updatedEncryptIVMask: c.Array[ctypes.c_uint32, Literal[3]] + updatedDecryptIVMask: c.Array[ctypes.c_uint32, Literal[3]] +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS.register_fields([('globalH2DKey', NvU32, 0), ('updatedEncryptIVMask', c.Array[NvU32, Literal[3]], 4), ('updatedDecryptIVMask', c.Array[NvU32, Literal[3]], 16)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS(c.Struct): + SIZE = 8 + exceptionType: int + globalH2DKey: int +struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS.register_fields([('exceptionType', NvU32, 0), ('globalH2DKey', NvU32, 4)]) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS(c.Struct): + SIZE = 1 + bAcceptClientRequest: int +struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS.register_fields([('bAcceptClientRequest', NvBool, 0)]) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS(c.Struct): + SIZE = 8 + attackerAdvantage: int +struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS.register_fields([('attackerAdvantage', NvU64, 0)]) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS(c.Struct): + SIZE = 1 + logicalUprocId: int +struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS.register_fields([('logicalUprocId', NvU8, 0)]) +NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS +enum_NV2080_CTRL_MEMMGR_MEMORY_OP: dict[int, str] = {(NV2080_CTRL_MEMMGR_MEMORY_OP_MEMCPY:=0): 'NV2080_CTRL_MEMMGR_MEMORY_OP_MEMCPY', (NV2080_CTRL_MEMMGR_MEMORY_OP_MEMSET:=1): 'NV2080_CTRL_MEMMGR_MEMORY_OP_MEMSET'} +NV2080_CTRL_MEMMGR_MEMORY_OP: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO(c.Struct): + SIZE = 32 + baseAddr: int + size: int + offset: int + aperture: int + cpuCacheAttrib: int +struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO.register_fields([('baseAddr', NvU64, 0), ('size', NvU64, 8), ('offset', NvU64, 16), ('aperture', NvU32, 24), ('cpuCacheAttrib', NvU32, 28)]) +NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS(c.Struct): + SIZE = 96 + src: struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO + authTag: c.Array[ctypes.c_ubyte, Literal[16]] + dst: struct_NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO + transferSize: int + value: int + memop: int +struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS.register_fields([('src', NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO, 0), ('authTag', c.Array[NvU8, Literal[16]], 32), ('dst', NV2080_CTRL_INTERNAL_TRANSFER_SURFACE_INFO, 48), ('transferSize', NvU64, 80), ('value', NvU32, 88), ('memop', NV2080_CTRL_MEMMGR_MEMORY_OP, 92)]) +NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS(c.Struct): + SIZE = 24 + addrSysPhys: int + addrWidth: int + mask: int + maskWidth: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS.register_fields([('addrSysPhys', NvU64, 0), ('addrWidth', NvU32, 8), ('mask', NvU32, 12), ('maskWidth', NvU32, 16)]) +NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS(c.Struct): + SIZE = 32 + peerId: int + addrSysPhys: int + addrWidth: int + mask: int + maskWidth: int +struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS.register_fields([('peerId', NvU32, 0), ('addrSysPhys', NvU64, 8), ('addrWidth', NvU32, 16), ('mask', NvU32, 20), ('maskWidth', NvU32, 24)]) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS(c.Struct): + SIZE = 24 + limitMin: int + limitRated: int + limitMax: int + limitCurr: int + limitBattRated: int + limitBattMax: int +struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS.register_fields([('limitMin', NvU32, 0), ('limitRated', NvU32, 4), ('limitMax', NvU32, 8), ('limitCurr', NvU32, 12), ('limitBattRated', NvU32, 16), ('limitBattMax', NvU32, 20)]) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS(c.Struct): + SIZE = 16 + bInit: int + physAddr: int +struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS.register_fields([('bInit', NvBool, 0), ('physAddr', NvU64, 8)]) +NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS(c.Struct): + SIZE = 16 + polledDataMask: int + pollIntervalMs: int +struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS.register_fields([('polledDataMask', NvU64, 0), ('pollIntervalMs', NvU32, 8)]) +NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS(c.Struct): + SIZE = 32 + tracepointMask: int + bufferAddr: int + bufferSize: int + bufferWatermark: int + flag: int +struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS.register_fields([('tracepointMask', NvU64, 0), ('bufferAddr', NvU64, 8), ('bufferSize', NvU32, 16), ('bufferWatermark', NvU32, 20), ('flag', NvU8, 24)]) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS(c.Struct): + SIZE = 3 + bMaxwellSec2Enabled: int + bNv95A1TsecEnabled: int + bHopperSec2WorkLaunchAEnabled: int +struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS.register_fields([('bMaxwellSec2Enabled', NvBool, 0), ('bNv95A1TsecEnabled', NvBool, 1), ('bHopperSec2WorkLaunchAEnabled', NvBool, 2)]) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS +NV2080_CTRL_INTERNAL_GR_CTXSW_SETUP_BIND_PARAMS: TypeAlias = struct_NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS(c.Struct): + SIZE = 8 + bInPMTransition: int + newPMLevel: int +struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS.register_fields([('bInPMTransition', NvBool, 0), ('newPMLevel', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS(c.Struct): + SIZE = 1 + bSuccessful: int +struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS.register_fields([('bSuccessful', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS(c.Struct): + SIZE = 8 + freeHeapSize: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS.register_fields([('freeHeapSize', NvU64, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS(c.Struct): + SIZE = 8 + attribute: int + value: int +struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS.register_fields([('attribute', NvU32, 0), ('value', NvU32, 4)]) +NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS(c.Struct): + SIZE = 1 + bApplyStereoPinAlwaysHiWar: int +struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS.register_fields([('bApplyStereoPinAlwaysHiWar', NvBool, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS(c.Struct): + SIZE = 4 + maxHshubs: int +struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS.register_fields([('maxHshubs', NvU32, 0)]) +NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS(c.Struct): + SIZE = 4 + rasterSyncDecodeMode: int +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS.register_fields([('rasterSyncDecodeMode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS(c.Struct): + SIZE = 8 + spaValue: int +struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS.register_fields([('spaValue', NvU64, 0)]) +NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 8 + peerMask: int + bEnable: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0), ('bEnable', NvBool, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS(c.Struct): + SIZE = 28 + seedData: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS.register_fields([('seedData', c.Array[NvU32, Literal[7]], 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS(c.Struct): + SIZE = 8 + remoteDeviceType: int + ipVerDlPl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS.register_fields([('remoteDeviceType', NvU32, 0), ('ipVerDlPl', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS(c.Struct): + SIZE = 28 + seedData: c.Array[ctypes.c_uint32, Literal[7]] +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS.register_fields([('seedData', c.Array[NvU32, Literal[7]], 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO(c.Struct): + SIZE = 24 + remoteSid: int + remoteDeviceType: int + remoteLinkId: int + localSid: int +struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO.register_fields([('remoteSid', NvU64, 0), ('remoteDeviceType', NvU32, 8), ('remoteLinkId', NvU32, 12), ('localSid', NvU64, 16)]) +NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS(c.Struct): + SIZE = 32 + bInitnegotiateConfigGood: int + remoteLocalSidInfo: struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS.register_fields([('bInitnegotiateConfigGood', NvBool, 0), ('remoteLocalSidInfo', NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS(c.Struct): + SIZE = 1 + bPollDone: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS.register_fields([('bPollDone', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS(c.Struct): + SIZE = 48 + mode: int + bSync: int + linkMode: int + linkModeParams: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams(c.Struct): + SIZE = 32 + linkModeOffParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS + linkModePreHsParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS + linkModeInitPhase1Params: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS + linkModePostInitNegotiateParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS + linkModePostInitOptimizeParams: struct_NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams.register_fields([('linkModeOffParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_OFF_PARAMS, 0), ('linkModePreHsParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_PRE_HS_PARAMS, 0), ('linkModeInitPhase1Params', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_INIT_PHASE1_PARAMS, 0), ('linkModePostInitNegotiateParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITNEGOTIATE_PARAMS, 0), ('linkModePostInitOptimizeParams', NV2080_CTRL_INTERNAL_NVLINK_SET_DL_LINK_MODE_POST_INITOPTIMIZE_PARAMS, 0)]) +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8), ('linkMode', NvU32, 12), ('linkModeParams', struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS_linkModeParams, 16)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS(c.Struct): + SIZE = 4 + mode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS.register_fields([('mode', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 8 + sublinkMode: int + sublinkSubMode: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS.register_fields([('sublinkMode', NvU32, 0), ('sublinkSubMode', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS(c.Struct): + SIZE = 16 + mode: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS.register_fields([('mode', NvU64, 0), ('bSync', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS(c.Struct): + SIZE = 4 + laneRxdetStatusMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS.register_fields([('laneRxdetStatusMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS(c.Struct): + SIZE = 1 + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS.register_fields([('bSync', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS(c.Struct): + SIZE = 16 + ipVerDlPl: int + token: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS.register_fields([('ipVerDlPl', NvU32, 0), ('token', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS(c.Struct): + SIZE = 1 + bUnlocked: int +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS.register_fields([('bUnlocked', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE(c.Struct): + SIZE = 56 + type: int + callbackParams: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams(c.Struct): + SIZE = 48 + getDlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS + setDlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS + getTlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS + setTlLinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS + getTxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS + setTxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS + getRxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS + setRxSublinkMode: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS + getRxSublinkDetect: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS + setRxSublinkDetect: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS + writeDiscoveryToken: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS + readDiscoveryToken: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS + getUphyLoad: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams.register_fields([('getDlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_DL_LINK_MODE_PARAMS, 0), ('setDlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_DL_LINK_MODE_PARAMS, 0), ('getTlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_TL_LINK_MODE_PARAMS, 0), ('setTlLinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TL_LINK_MODE_PARAMS, 0), ('getTxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS, 0), ('setTxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_TX_SUBLINK_MODE_PARAMS, 0), ('getRxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_SUBLINK_MODE_PARAMS, 0), ('setRxSublinkMode', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_SUBLINK_MODE_PARAMS, 0), ('getRxSublinkDetect', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_RX_DETECT_PARAMS, 0), ('setRxSublinkDetect', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_SET_RX_DETECT_PARAMS, 0), ('writeDiscoveryToken', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS, 0), ('readDiscoveryToken', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_RD_WR_DISCOVERY_TOKEN_PARAMS, 0), ('getUphyLoad', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_GET_UPHY_LOAD_PARAMS, 0)]) +struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE.register_fields([('type', NvU8, 0), ('callbackParams', struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_callbackParams, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS(c.Struct): + SIZE = 64 + linkId: int + callbackType: struct_NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE +struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS.register_fields([('linkId', NvU32, 0), ('callbackType', NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS(c.Struct): + SIZE = 32 + linkId: int + remoteLocalSidInfo: struct_NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS.register_fields([('linkId', NvU32, 0), ('remoteLocalSidInfo', NV2080_CTRL_INTERNAL_NVLINK_REMOTE_LOCAL_SID_INFO, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS(c.Struct): + SIZE = 1 + bEnableAli: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS.register_fields([('bEnableAli', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS(c.Struct): + SIZE = 8 + updateType: int + bSysMem: int + peerMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS.register_fields([('updateType', NvBool, 0), ('bSysMem', NvBool, 1), ('peerMask', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 24 + peerId: int + peerLinkMask: int + bEgmPeer: int + bNvswitchConn: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS.register_fields([('peerId', NvU32, 0), ('peerLinkMask', NvU64, 8), ('bEgmPeer', NvBool, 16), ('bNvswitchConn', NvBool, 17)]) +NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 4 + peerMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS(c.Struct): + SIZE = 92 + xid: int + message: c.Array[ctypes.c_ubyte, Literal[81]] + len: int +struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS.register_fields([('xid', NvU32, 0), ('message', c.Array[NvU8, Literal[81]], 4), ('len', NvU32, 88)]) +NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS(c.Struct): + SIZE = 12 + mapTypeMask: int + peerMask: int + bL2Entry: int +struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS.register_fields([('mapTypeMask', NvU32, 0), ('peerMask', NvU32, 4), ('bL2Entry', NvBool, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS(c.Struct): + SIZE = 24 + bSave: int + linkMask: struct_NV2080_CTRL_NVLINK_LINK_MASK +NV2080_CTRL_NVLINK_LINK_MASK: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS.register_fields([('bSave', NvBool, 0), ('linkMask', NV2080_CTRL_NVLINK_LINK_MASK, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS(c.Struct): + SIZE = 16 + flags: int + bSysmem: int + peerLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS.register_fields([('flags', NvU32, 0), ('bSysmem', NvBool, 4), ('peerLinkMask', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bNvlinkSysmemEnabled: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS.register_fields([('bNvlinkSysmemEnabled', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS(c.Struct): + SIZE = 16 + gpuInst: int + peerLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS.register_fields([('gpuInst', NvU32, 0), ('peerLinkMask', NvU64, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS(c.Struct): + SIZE = 40 + remoteDeviceType: int + remoteChipSid: int + linkId: int + laneRxdetStatusMask: int + remoteLinkNumber: int + remotePciDeviceId: int + remoteDomain: int + remoteBus: int + remoteDevice: int + remoteFunction: int + bConnected: int +struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS.register_fields([('remoteDeviceType', NvU64, 0), ('remoteChipSid', NvU64, 8), ('linkId', NvU32, 16), ('laneRxdetStatusMask', NvU32, 20), ('remoteLinkNumber', NvU32, 24), ('remotePciDeviceId', NvU32, 28), ('remoteDomain', NvU32, 32), ('remoteBus', NvU8, 36), ('remoteDevice', NvU8, 37), ('remoteFunction', NvU8, 38), ('bConnected', NvBool, 39)]) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + initializedLinks: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS.register_fields([('linkMask', NvU32, 0), ('initializedLinks', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS.register_fields([('linkMask', NvU32, 0), ('bSync', NvBool, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS(c.Struct): + SIZE = 264 + postRxDetLinkMask: int + laneRxdetStatusMask: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS.register_fields([('postRxDetLinkMask', NvU64, 0), ('laneRxdetStatusMask', c.Array[NvU32, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + bSync: int +struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('bSync', NvBool, 24)]) +NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES(c.Struct): + SIZE = 16 + bValid: int + linkId: int + ioctrlId: int + pllMasterLinkId: int + pllSlaveLinkId: int + ipVerDlPl: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES.register_fields([('bValid', NvBool, 0), ('linkId', NvU8, 1), ('ioctrlId', NvU32, 4), ('pllMasterLinkId', NvU8, 8), ('pllSlaveLinkId', NvU8, 9), ('ipVerDlPl', NvU32, 12)]) +NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 1088 + ioctrlMask: int + ioctrlNumEntries: int + ioctrlSize: int + discoveredLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + ipVerNvlink: int + maxSupportedLinks: int + probeRequestTimeMs: int + linkStateChangeTimeMs: int + linkInfo: c.Array[struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES, Literal[64]] + supportedCounterMask: struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS(c.Struct): + SIZE = 16 + counterMask: c.Array[ctypes.c_uint64, Literal[2]] +NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS +struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS.register_fields([('counterMask', c.Array[NvU64, Literal[2]], 0)]) +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS.register_fields([('ioctrlMask', NvU32, 0), ('ioctrlNumEntries', NvU8, 4), ('ioctrlSize', NvU32, 8), ('discoveredLinks', NV2080_CTRL_NVLINK_LINK_MASK, 16), ('ipVerNvlink', NvU32, 32), ('maxSupportedLinks', NvU32, 36), ('probeRequestTimeMs', NvU32, 40), ('linkStateChangeTimeMs', NvU32, 44), ('linkInfo', c.Array[NV2080_CTRL_INTERNAL_NVLINK_DEVICE_LINK_VALUES, Literal[64]], 48), ('supportedCounterMask', NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS, 1072)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES(c.Struct): + SIZE = 8 + ipVerIoctrl: int + ipVerMinion: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES.register_fields([('ipVerIoctrl', NvU32, 0), ('ipVerMinion', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 32 + ioctrlIdx: int + PublicId: int + localDiscoveredLinks: int + localGlobalLinkOffset: int + ioctrlDiscoverySize: int + numDevices: int + ipRevisions: struct_NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS.register_fields([('ioctrlIdx', NvU32, 0), ('PublicId', NvU32, 4), ('localDiscoveredLinks', NvU32, 8), ('localGlobalLinkOffset', NvU32, 12), ('ioctrlDiscoverySize', NvU32, 16), ('numDevices', NvU8, 20), ('ipRevisions', NV2080_CTRL_INTERNAL_NVLINK_DEVICE_IP_REVISION_VALUES, 24)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS(c.Struct): + SIZE = 12 + bPlatformLinerateDefined: int + platformLineRate: int + nvlinkLinkSpeed: int +struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS.register_fields([('bPlatformLinerateDefined', NvBool, 0), ('platformLineRate', NvU32, 4), ('nvlinkLinkSpeed', NvU32, 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS(c.Struct): + SIZE = 88 + linkMask: struct_NV2080_CTRL_NVLINK_LINK_MASK + bActiveOnly: int + bIsLinkActive: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS.register_fields([('linkMask', NV2080_CTRL_NVLINK_LINK_MASK, 0), ('bActiveOnly', NvBool, 16), ('bIsLinkActive', c.Array[NvBool, Literal[64]], 17)]) +NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS(c.Struct): + SIZE = 8 + linkMask: int + flags: int +struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS.register_fields([('linkMask', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS(c.Struct): + SIZE = 4 + linkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS.register_fields([('linkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES(c.Struct): + SIZE = 60 + bLinkConnectedToSystem: int + bLinkConnectedToPeer: int + bLinkReset: int + subLinkWidth: int + linkState: int + txSublinkState: int + rxSublinkState: int + bLaneReversal: int + nvlinkLinkClockKHz: int + nvlinkLineRateMbps: int + nvlinkLinkClockMhz: int + nvlinkLinkDataRateKiBps: int + nvlinkRefClkType: int + nvlinkReqLinkClockMhz: int + nvlinkMinL1Threshold: int + nvlinkMaxL1Threshold: int + nvlinkL1ThresholdUnits: int + nvlpwIdx: int +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES.register_fields([('bLinkConnectedToSystem', NvBool, 0), ('bLinkConnectedToPeer', NvBool, 1), ('bLinkReset', NvBool, 2), ('subLinkWidth', NvU8, 3), ('linkState', NvU32, 4), ('txSublinkState', NvU32, 8), ('rxSublinkState', NvU32, 12), ('bLaneReversal', NvBool, 16), ('nvlinkLinkClockKHz', NvU32, 20), ('nvlinkLineRateMbps', NvU32, 24), ('nvlinkLinkClockMhz', NvU32, 28), ('nvlinkLinkDataRateKiBps', NvU32, 32), ('nvlinkRefClkType', NvU8, 36), ('nvlinkReqLinkClockMhz', NvU32, 40), ('nvlinkMinL1Threshold', NvU32, 44), ('nvlinkMaxL1Threshold', NvU32, 48), ('nvlinkL1ThresholdUnits', NvU32, 52), ('nvlpwIdx', NvU32, 56)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS(c.Struct): + SIZE = 3880 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + enabledNvlpwMask: int + nvlinkRefClkSpeedKHz: int + bSublinkStateInst: int + linkInfo: c.Array[struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('enabledNvlpwMask', NvU64, 24), ('nvlinkRefClkSpeedKHz', NvU32, 32), ('bSublinkStateInst', NvBool, 36), ('linkInfo', c.Array[NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_VALUES, Literal[64]], 40)]) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS(c.Struct): + SIZE = 4 + sysmemLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS.register_fields([('sysmemLinkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS(c.Struct): + SIZE = 264 + bLegacyForcedConfig: int + bOverrideComputePeerMode: int + phase: int + linkConnection: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS.register_fields([('bLegacyForcedConfig', NvBool, 0), ('bOverrideComputePeerMode', NvBool, 1), ('phase', NvU32, 4), ('linkConnection', c.Array[NvU32, Literal[64]], 8)]) +NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS(c.Struct): + SIZE = 1 + bLaneShutdownOnUnload: int +struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS.register_fields([('bLaneShutdownOnUnload', NvBool, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS(c.Struct): + SIZE = 4 + notUsed: int +struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS.register_fields([('notUsed', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS(c.Struct): + SIZE = 4 + sysmemLinkMask: int +struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS.register_fields([('sysmemLinkMask', NvU32, 0)]) +NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS(c.Struct): + SIZE = 24 + PublicId: int + logBufferSize: int + logBufferAddr: int +struct_NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS.register_fields([('PublicId', NvU32, 0), ('logBufferSize', NvU64, 8), ('logBufferAddr', NvU64, 16)]) +NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS(c.Struct): + SIZE = 40 + hfrpPrivBase: c.Array[ctypes.c_uint32, Literal[5]] + hfrpIntrCtrlReg: c.Array[ctypes.c_uint32, Literal[5]] +struct_NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS.register_fields([('hfrpPrivBase', c.Array[NvU32, Literal[5]], 0), ('hfrpIntrCtrlReg', c.Array[NvU32, Literal[5]], 20)]) +NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS(c.Struct): + SIZE = 72 + opType: int + flags: int + ringBufferSize: int + ringBufferOffset: int + userdPa: int + userdVa: int + usermodeGpuVa: int + instBlkAddr: int + instBlkAperture: int + userdAperture: int + inputWorkSubmitToken: int + cmcWorkSubmitToken: int + cmcHandle: int +struct_NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS.register_fields([('opType', NvU32, 0), ('flags', NvU32, 4), ('ringBufferSize', NvU32, 8), ('ringBufferOffset', NvU64, 16), ('userdPa', NvU64, 24), ('userdVa', NvU64, 32), ('usermodeGpuVa', NvU64, 40), ('instBlkAddr', NvU64, 48), ('instBlkAperture', NvU8, 56), ('userdAperture', NvU8, 57), ('inputWorkSubmitToken', NvU32, 60), ('cmcWorkSubmitToken', NvU32, 64), ('cmcHandle', NvU32, 68)]) +NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2(c.Struct): + SIZE = 2044 + smIssueRateModifierListSize: int + smIssueRateModifierList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[255]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2.register_fields([('smIssueRateModifierListSize', NvU32, 0), ('smIssueRateModifierList', c.Array[NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2, Literal[255]], 4)]) +NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2 +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS(c.Struct): + SIZE = 16352 + smIssueRateModifierV2: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS.register_fields([('smIssueRateModifierV2', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_RATE_MODIFIER_V2, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL(c.Struct): + SIZE = 2044 + smIssueThrottleCtrlListSize: int + smIssueThrottleCtrlList: c.Array[struct_NVXXXX_CTRL_XXX_INFO, Literal[255]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL.register_fields([('smIssueThrottleCtrlListSize', NvU32, 0), ('smIssueThrottleCtrlList', c.Array[NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL, Literal[255]], 4)]) +NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL +@c.record +class struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS(c.Struct): + SIZE = 16352 + smIssueThrottleCtrl: c.Array[struct_NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL, Literal[8]] +struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS.register_fields([('smIssueThrottleCtrl', c.Array[NV2080_CTRL_INTERNAL_STATIC_GR_SM_ISSUE_THROTTLE_CTRL, Literal[8]], 0)]) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_FLCN_SET_VIDEO_EVENT_BUFFER_MEMORY_PARAMS(c.Struct): + SIZE = 40 + memDescInfo: struct_NV2080_CTRL_INTERNAL_MEMDESC_INFO + engDesc: int + bEngineFound: int +struct_NV2080_CTRL_INTERNAL_FLCN_SET_VIDEO_EVENT_BUFFER_MEMORY_PARAMS.register_fields([('memDescInfo', NV2080_CTRL_INTERNAL_MEMDESC_INFO, 0), ('engDesc', NvU32, 32), ('bEngineFound', NvBool, 36)]) +NV2080_CTRL_INTERNAL_FLCN_SET_VIDEO_EVENT_BUFFER_MEMORY_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_FLCN_SET_VIDEO_EVENT_BUFFER_MEMORY_PARAMS +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_ROTATE_PER_CHANNEL_KEYS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_FIFO_ROTATE_KEYS_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS(c.Struct): + SIZE = 80024 + params: struct_NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS +@c.record +class struct_NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS(c.Struct): + SIZE = 80024 + gpuId: int + hTotal: int + vTotal: int + minRefreshRatex10000: int + maxRefreshRatex10000: int + numFractions: int + fractions: c.Array[struct_NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS_fraction, Literal[5000]] +NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS: TypeAlias = struct_NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS +@c.record +class struct_NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS_fraction(c.Struct): + SIZE = 16 + numerator: int + denominator: int +struct_NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS_fraction.register_fields([('numerator', NvU64, 0), ('denominator', NvU64, 8)]) +struct_NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS.register_fields([('gpuId', NvU32, 0), ('hTotal', NvU32, 4), ('vTotal', NvU32, 8), ('minRefreshRatex10000', NvU32, 12), ('maxRefreshRatex10000', NvU32, 16), ('numFractions', NvU32, 20), ('fractions', c.Array[struct_NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS_fraction, Literal[5000]], 24)]) +struct_NV2080_CTRL_INTERNAL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS.register_fields([('params', NV30F1_CTRL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS, 0)]) +NV2080_CTRL_INTERNAL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_STATE_PARAMS(c.Struct): + SIZE = 16 + ucode: int + gfid: int + bEnabled: int + bClear: int + instrumentationType: int +struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_STATE_PARAMS.register_fields([('ucode', NvU32, 0), ('gfid', NvU32, 4), ('bEnabled', NvBool, 8), ('bClear', NvBool, 9), ('instrumentationType', NvU32, 12)]) +NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_SET_STATE_PARAMS(c.Struct): + SIZE = 16 + ucode: int + gfid: int + bEnabled: int + bClear: int + instrumentationType: int +struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_SET_STATE_PARAMS.register_fields([('ucode', NvU32, 0), ('gfid', NvU32, 4), ('bEnabled', NvBool, 8), ('bClear', NvBool, 9), ('instrumentationType', NvU32, 12)]) +NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_SET_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_SET_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_DATA_PARAMS(c.Struct): + SIZE = 65560 + ucode: int + gfid: int + offset: int + instrumentationType: int + data: c.Array[ctypes.c_ubyte, Literal[65536]] + dataSize: int + bComplete: int +struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_DATA_PARAMS.register_fields([('ucode', NvU32, 0), ('gfid', NvU32, 4), ('offset', NvU32, 8), ('instrumentationType', NvU32, 12), ('data', c.Array[NvU8, Literal[65536]], 16), ('dataSize', NvU32, 65552), ('bComplete', NvBool, 65556)]) +NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS(c.Struct): + SIZE = 4 + ctrlParamVal: int +struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS.register_fields([('ctrlParamVal', NvU32, 0)]) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS(c.Struct): + SIZE = 4 + responseVal: int +struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS.register_fields([('responseVal', NvU32, 0)]) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS +@c.record +class struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS(c.Struct): + SIZE = 16 + architecture: int + implementation: int + revision: int + subRevision: int +struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS.register_fields([('architecture', NvU32, 0), ('implementation', NvU32, 4), ('revision', NvU32, 8), ('subRevision', NvU8, 12)]) +NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS(c.Struct): + SIZE = 4 + engines: int +struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS.register_fields([('engines', NvU32, 0)]) +NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS +@c.record +class struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS(c.Struct): + SIZE = 4 + manufacturer: int +struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS.register_fields([('manufacturer', NvU32, 0)]) +NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS +@c.record +class struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS(c.Struct): + SIZE = 1 + bOwnedByRm: int +struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS.register_fields([('bOwnedByRm', NvBool, 0)]) +NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS +@c.record +class struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY(c.Struct): + SIZE = 8 + nv2080EngineType: int + notificationIntrVector: int +struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY.register_fields([('nv2080EngineType', NvU32, 0), ('notificationIntrVector', NvU32, 4)]) +NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY: TypeAlias = struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY +@c.record +class struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS(c.Struct): + SIZE = 2052 + numEntries: int + entries: c.Array[struct_NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY, Literal[256]] +struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS.register_fields([('numEntries', NvU32, 0), ('entries', c.Array[NV2080_CTRL_MC_ENGINE_NOTIFICATION_INTR_VECTOR_ENTRY, Literal[256]], 4)]) +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS +@c.record +class struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY(c.Struct): + SIZE = 16 + nv2080IntrType: int + pmcIntrMask: int + intrVectorStall: int + intrVectorNonStall: int +struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY.register_fields([('nv2080IntrType', NvU32, 0), ('pmcIntrMask', NvU32, 4), ('intrVectorStall', NvU32, 8), ('intrVectorNonStall', NvU32, 12)]) +NV2080_CTRL_MC_STATIC_INTR_ENTRY: TypeAlias = struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY +@c.record +class struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS(c.Struct): + SIZE = 516 + numEntries: int + entries: c.Array[struct_NV2080_CTRL_MC_STATIC_INTR_ENTRY, Literal[32]] +struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS.register_fields([('numEntries', NvU32, 0), ('entries', c.Array[NV2080_CTRL_MC_STATIC_INTR_ENTRY, Literal[32]], 4)]) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS +enum_NV2080_INTR_CATEGORY: dict[int, str] = {(NV2080_INTR_CATEGORY_DEFAULT:=0): 'NV2080_INTR_CATEGORY_DEFAULT', (NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE:=1): 'NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE', (NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE_NOTIFICATION:=2): 'NV2080_INTR_CATEGORY_ESCHED_DRIVEN_ENGINE_NOTIFICATION', (NV2080_INTR_CATEGORY_RUNLIST:=3): 'NV2080_INTR_CATEGORY_RUNLIST', (NV2080_INTR_CATEGORY_RUNLIST_NOTIFICATION:=4): 'NV2080_INTR_CATEGORY_RUNLIST_NOTIFICATION', (NV2080_INTR_CATEGORY_UVM_OWNED:=5): 'NV2080_INTR_CATEGORY_UVM_OWNED', (NV2080_INTR_CATEGORY_UVM_SHARED:=6): 'NV2080_INTR_CATEGORY_UVM_SHARED', (NV2080_INTR_CATEGORY_ENUM_COUNT:=7): 'NV2080_INTR_CATEGORY_ENUM_COUNT'} +NV2080_INTR_CATEGORY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS(c.Struct): + SIZE = 56 + subtreeMap: c.Array[struct_NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]] +struct_NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS.register_fields([('subtreeMap', c.Array[NV2080_INTR_CATEGORY_SUBTREE_MAP, Literal[7]], 0)]) +NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS: TypeAlias = struct_NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS +@c.record +class struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS(c.Struct): + SIZE = 8 + component: int + size: int +struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS.register_fields([('component', NvU32, 0), ('size', NvU32, 4)]) +NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS +@c.record +class struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS(c.Struct): + SIZE = 16 + pBuffer: ctypes.c_void_p + component: int + size: int +struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS.register_fields([('pBuffer', NvP64, 0), ('component', NvU32, 8), ('size', NvU32, 12)]) +NV2080_CTRL_NVD_GET_DUMP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_DUMP_PARAMS +@c.record +class struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS(c.Struct): + SIZE = 32 + userMinOffset: int + userMaxOffset: int + factoryMinOffset: int + factoryMaxOffset: int + lastActiveClock: int + lastActiveVolt: int + lastActivePoint: int + kappa: int +struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS.register_fields([('userMinOffset', NvS32, 0), ('userMaxOffset', NvS32, 4), ('factoryMinOffset', NvU32, 8), ('factoryMaxOffset', NvU32, 12), ('lastActiveClock', NvU32, 16), ('lastActiveVolt', NvU32, 20), ('lastActivePoint', NvU32, 24), ('kappa', NvU32, 28)]) +NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS: TypeAlias = struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS +@c.record +class struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG(c.Struct): + SIZE = 72 + pstateVer: int + gpcOverclock: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS + mclkOverclock: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS + bUserOverclocked: int + bFactoryOverclocked: int +struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG.register_fields([('pstateVer', NvU32, 0), ('gpcOverclock', NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS, 4), ('mclkOverclock', NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS, 36), ('bUserOverclocked', NvBool, 68), ('bFactoryOverclocked', NvBool, 69)]) +NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG: TypeAlias = struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG +@c.record +class struct_NV2080_NOCAT_JOURNAL_GPU_STATE(c.Struct): + SIZE = 240 + bValid: int + strap: int + deviceId: int + vendorId: int + subsystemVendor: int + subsystemId: int + revision: int + type: int + vbiosVersion: int + bOptimus: int + bMsHybrid: int + bFullPower: int + vbiosOemVersion: int + memoryType: int + tag: c.Array[ctypes.c_ubyte, Literal[65]] + vbiosProject: c.Array[ctypes.c_ubyte, Literal[65]] + bInFullchipReset: int + bInSecBusReset: int + bInGc6Reset: int + overclockCfg: struct_NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG +struct_NV2080_NOCAT_JOURNAL_GPU_STATE.register_fields([('bValid', NvBool, 0), ('strap', NvU32, 4), ('deviceId', NvU16, 8), ('vendorId', NvU16, 10), ('subsystemVendor', NvU16, 12), ('subsystemId', NvU16, 14), ('revision', NvU16, 16), ('type', NvU16, 18), ('vbiosVersion', NvU32, 20), ('bOptimus', NvBool, 24), ('bMsHybrid', NvBool, 25), ('bFullPower', NvBool, 26), ('vbiosOemVersion', NvU32, 28), ('memoryType', NvU16, 32), ('tag', c.Array[NvU8, Literal[65]], 34), ('vbiosProject', c.Array[NvU8, Literal[65]], 99), ('bInFullchipReset', NvBool, 164), ('bInSecBusReset', NvBool, 165), ('bInGc6Reset', NvBool, 166), ('overclockCfg', NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG, 168)]) +NV2080_NOCAT_JOURNAL_GPU_STATE: TypeAlias = struct_NV2080_NOCAT_JOURNAL_GPU_STATE +@c.record +class struct_NV2080_NOCAT_JOURNAL_ENTRY(c.Struct): + SIZE = 1272 + recType: int + bugcheck: int + tdrBucketId: int + source: c.Array[ctypes.c_ubyte, Literal[65]] + subsystem: int + errorCode: int + diagBufferLen: int + diagBuffer: c.Array[ctypes.c_ubyte, Literal[1024]] + faultingEngine: c.Array[ctypes.c_ubyte, Literal[65]] + mmuFaultType: int + mmuErrorSrc: int + tdrReason: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080_NOCAT_JOURNAL_ENTRY.register_fields([('recType', NvU8, 0), ('bugcheck', NvU32, 4), ('tdrBucketId', NvU32, 8), ('source', c.Array[NvU8, Literal[65]], 12), ('subsystem', NvU32, 80), ('errorCode', NvU64, 88), ('diagBufferLen', NvU32, 96), ('diagBuffer', c.Array[NvU8, Literal[1024]], 100), ('faultingEngine', c.Array[NvU8, Literal[65]], 1124), ('mmuFaultType', NvU32, 1192), ('mmuErrorSrc', NvU32, 1196), ('tdrReason', c.Array[NvU8, Literal[65]], 1200)]) +NV2080_NOCAT_JOURNAL_ENTRY: TypeAlias = struct_NV2080_NOCAT_JOURNAL_ENTRY +@c.record +class struct_NV2080_NOCAT_JOURNAL_RECORD(c.Struct): + SIZE = 1544 + GPUTag: int + loadAddress: int + timeStamp: int + stateMask: int + nocatGpuState: struct_NV2080_NOCAT_JOURNAL_GPU_STATE + nocatJournalEntry: struct_NV2080_NOCAT_JOURNAL_ENTRY +struct_NV2080_NOCAT_JOURNAL_RECORD.register_fields([('GPUTag', NvU32, 0), ('loadAddress', NvU64, 8), ('timeStamp', NvU64, 16), ('stateMask', NvU64, 24), ('nocatGpuState', NV2080_NOCAT_JOURNAL_GPU_STATE, 32), ('nocatJournalEntry', NV2080_NOCAT_JOURNAL_ENTRY, 272)]) +NV2080_NOCAT_JOURNAL_RECORD: TypeAlias = struct_NV2080_NOCAT_JOURNAL_RECORD +@c.record +class struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS(c.Struct): + SIZE = 15656 + flags: int + nocatRecordCount: int + nocatOutstandingRecordCount: int + journalRecords: c.Array[struct_NV2080_NOCAT_JOURNAL_RECORD, Literal[10]] + activityCounters: c.Array[ctypes.c_uint32, Literal[32]] + reserved: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS.register_fields([('flags', NvU32, 0), ('nocatRecordCount', NvU32, 4), ('nocatOutstandingRecordCount', NvU32, 8), ('journalRecords', c.Array[NV2080_NOCAT_JOURNAL_RECORD, Literal[10]], 16), ('activityCounters', c.Array[NvU32, Literal[32]], 15456), ('reserved', c.Array[NvU8, Literal[65]], 15584)]) +NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS +@c.record +class struct_NV2080CtrlNocatJournalDataTdrReason(c.Struct): + SIZE = 96 + flags: int + source: c.Array[ctypes.c_ubyte, Literal[65]] + subsystem: int + errorCode: int + reasonCode: int +struct_NV2080CtrlNocatJournalDataTdrReason.register_fields([('flags', NvU32, 0), ('source', c.Array[NvU8, Literal[65]], 4), ('subsystem', NvU32, 72), ('errorCode', NvU64, 80), ('reasonCode', NvU32, 88)]) +NV2080CtrlNocatJournalDataTdrReason: TypeAlias = struct_NV2080CtrlNocatJournalDataTdrReason +@c.record +class struct_NV2080CtrlNocatJournalSetTag(c.Struct): + SIZE = 72 + flags: int + tag: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080CtrlNocatJournalSetTag.register_fields([('flags', NvU32, 0), ('tag', c.Array[NvU8, Literal[65]], 4)]) +NV2080CtrlNocatJournalSetTag: TypeAlias = struct_NV2080CtrlNocatJournalSetTag +@c.record +class struct_NV2080CtrlNocatJournalRclog(c.Struct): + SIZE = 92 + flags: int + rclogSize: int + rmGpuId: int + APIType: int + contextType: int + exceptType: int + processImageName: c.Array[ctypes.c_ubyte, Literal[65]] +struct_NV2080CtrlNocatJournalRclog.register_fields([('flags', NvU32, 0), ('rclogSize', NvU32, 4), ('rmGpuId', NvU32, 8), ('APIType', NvU32, 12), ('contextType', NvU32, 16), ('exceptType', NvU32, 20), ('processImageName', c.Array[NvU8, Literal[65]], 24)]) +NV2080CtrlNocatJournalRclog: TypeAlias = struct_NV2080CtrlNocatJournalRclog +@c.record +class struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS(c.Struct): + SIZE = 104 + dataType: int + targetRecordType: int + nocatJournalData: struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData +@c.record +class struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData(c.Struct): + SIZE = 96 + tdrReason: struct_NV2080CtrlNocatJournalDataTdrReason + tagData: struct_NV2080CtrlNocatJournalSetTag + rclog: struct_NV2080CtrlNocatJournalRclog +struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData.register_fields([('tdrReason', NV2080CtrlNocatJournalDataTdrReason, 0), ('tagData', NV2080CtrlNocatJournalSetTag, 0), ('rclog', NV2080CtrlNocatJournalRclog, 0)]) +struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS.register_fields([('dataType', NvU32, 0), ('targetRecordType', NvU32, 4), ('nocatJournalData', struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_nocatJournalData, 8)]) +NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS +@c.record +class struct_NV2080CtrlNocatJournalInsertRecord(c.Struct): + SIZE = 1208 + flags: int + timestamp: int + recType: int + bugcheck: int + source: c.Array[ctypes.c_char, Literal[65]] + subsystem: int + errorCode: int + faultingEngine: c.Array[ctypes.c_char, Literal[65]] + tdrReason: int + diagBufferLen: int + diagBuffer: c.Array[ctypes.c_ubyte, Literal[1024]] +struct_NV2080CtrlNocatJournalInsertRecord.register_fields([('flags', NvU32, 0), ('timestamp', NvU64, 8), ('recType', NvU8, 16), ('bugcheck', NvU32, 20), ('source', c.Array[ctypes.c_char, Literal[65]], 24), ('subsystem', NvU32, 92), ('errorCode', NvU64, 96), ('faultingEngine', c.Array[ctypes.c_char, Literal[65]], 104), ('tdrReason', NvU32, 172), ('diagBufferLen', NvU32, 176), ('diagBuffer', c.Array[NvU8, Literal[1024]], 180)]) +NV2080CtrlNocatJournalInsertRecord: TypeAlias = struct_NV2080CtrlNocatJournalInsertRecord +@c.record +class struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS(c.Struct): + SIZE = 1208 + nocatJournalRecord: struct_NV2080CtrlNocatJournalInsertRecord +struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS.register_fields([('nocatJournalRecord', NV2080CtrlNocatJournalInsertRecord, 0)]) +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS(c.Struct): + SIZE = 48 + capsTbl: int + lowestNvlinkVersion: int + highestNvlinkVersion: int + lowestNciVersion: int + highestNciVersion: int + discoveredLinkMask: int + enabledLinkMask: int + discoveredLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + enabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS.register_fields([('capsTbl', NvU32, 0), ('lowestNvlinkVersion', NvU8, 4), ('highestNvlinkVersion', NvU8, 5), ('lowestNciVersion', NvU8, 6), ('highestNciVersion', NvU8, 7), ('discoveredLinkMask', NvU32, 8), ('enabledLinkMask', NvU32, 12), ('discoveredLinks', NV2080_CTRL_NVLINK_LINK_MASK, 16), ('enabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 32)]) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_DEVICE_INFO(c.Struct): + SIZE = 56 + deviceIdFlags: int + domain: int + bus: int + device: int + function: int + pciDeviceId: int + deviceType: int + deviceUUID: c.Array[ctypes.c_ubyte, Literal[16]] + fabricRecoveryStatusMask: int +struct_NV2080_CTRL_NVLINK_DEVICE_INFO.register_fields([('deviceIdFlags', NvU32, 0), ('domain', NvU32, 4), ('bus', NvU16, 8), ('device', NvU16, 10), ('function', NvU16, 12), ('pciDeviceId', NvU32, 16), ('deviceType', NvU64, 24), ('deviceUUID', c.Array[NvU8, Literal[16]], 32), ('fabricRecoveryStatusMask', NvU32, 48)]) +NV2080_CTRL_NVLINK_DEVICE_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_DEVICE_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO(c.Struct): + SIZE = 216 + capsTbl: int + phyType: int + subLinkWidth: int + linkState: int + rxSublinkStatus: int + txSublinkStatus: int + bLaneReversal: int + nvlinkVersion: int + nciVersion: int + phyVersion: int + nvlinkLinkClockKHz: int + nvlinkCommonClockSpeedKHz: int + nvlinkRefClkSpeedKHz: int + nvlinkCommonClockSpeedMhz: int + nvlinkLineRateMbps: int + nvlinkLinkClockMhz: int + nvlinkRefClkType: int + nvlinkLinkDataRateKiBps: int + nvlinkRefClkSpeedMhz: int + connected: int + loopProperty: int + remoteDeviceLinkNumber: int + localDeviceLinkNumber: int + remoteLinkSid: int + localLinkSid: int + laneRxdetStatusMask: int + nvlinkMinL1Threshold: int + nvlinkMaxL1Threshold: int + nvlinkL1ThresholdUnits: int + remoteDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO + localDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO + nvlpwIdx: int +struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO.register_fields([('capsTbl', NvU32, 0), ('phyType', NvU8, 4), ('subLinkWidth', NvU8, 5), ('linkState', NvU32, 8), ('rxSublinkStatus', NvU8, 12), ('txSublinkStatus', NvU8, 13), ('bLaneReversal', NvBool, 14), ('nvlinkVersion', NvU8, 15), ('nciVersion', NvU8, 16), ('phyVersion', NvU8, 17), ('nvlinkLinkClockKHz', NvU32, 20), ('nvlinkCommonClockSpeedKHz', NvU32, 24), ('nvlinkRefClkSpeedKHz', NvU32, 28), ('nvlinkCommonClockSpeedMhz', NvU32, 32), ('nvlinkLineRateMbps', NvU32, 36), ('nvlinkLinkClockMhz', NvU32, 40), ('nvlinkRefClkType', NvU8, 44), ('nvlinkLinkDataRateKiBps', NvU32, 48), ('nvlinkRefClkSpeedMhz', NvU32, 52), ('connected', NvBool, 56), ('loopProperty', NvU8, 57), ('remoteDeviceLinkNumber', NvU8, 58), ('localDeviceLinkNumber', NvU8, 59), ('remoteLinkSid', NvU64, 64), ('localLinkSid', NvU64, 72), ('laneRxdetStatusMask', NvU32, 80), ('nvlinkMinL1Threshold', NvU32, 84), ('nvlinkMaxL1Threshold', NvU32, 88), ('nvlinkL1ThresholdUnits', NvU32, 92), ('remoteDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 96), ('localDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 152), ('nvlpwIdx', NvU32, 208)]) +NV2080_CTRL_NVLINK_LINK_STATUS_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO +enum_NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT: dict[int, str] = {(NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_100US:=0): 'NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_100US', (NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_50US:=1): 'NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT_50US'} +NV2080_CTRL_NVLINK_STATUS_L1_THRESHOLD_UNIT: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS(c.Struct): + SIZE = 13864 + enabledLinkMask: int + enabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bSublinkStateInst: int + bNvleModeEnabled: int + linkInfo: c.Array[struct_NV2080_CTRL_NVLINK_LINK_STATUS_INFO, Literal[64]] + enabledNvlpwMask: int +struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS.register_fields([('enabledLinkMask', NvU32, 0), ('enabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('bSublinkStateInst', NvBool, 24), ('bNvleModeEnabled', NvBool, 25), ('linkInfo', c.Array[NV2080_CTRL_NVLINK_LINK_STATUS_INFO, Literal[64]], 32), ('enabledNvlpwMask', NvU64, 13856)]) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_ERR_INFO(c.Struct): + SIZE = 112 + TLErrlog: int + TLIntrEn: int + TLCTxErrStatus0: int + TLCTxErrStatus1: int + TLCTxSysErrStatus0: int + TLCRxErrStatus0: int + TLCRxErrStatus1: int + TLCRxSysErrStatus0: int + TLCTxErrLogEn0: int + TLCTxErrLogEn1: int + TLCTxSysErrLogEn0: int + TLCRxErrLogEn0: int + TLCRxErrLogEn1: int + TLCRxSysErrLogEn0: int + MIFTxErrStatus0: int + MIFRxErrStatus0: int + NVLIPTLnkErrStatus0: int + NVLIPTLnkErrLogEn0: int + NVLIPTLnkCtrlLinkStateRequest: int + DLSpeedStatusTx: int + DLSpeedStatusRx: int + NVLDLRxSlsmErrCntl: int + NVLDLTopLinkState: int + NVLDLTopIntr: int + DLStatMN00: int + DLStatUC01: int + MinionNvlinkLinkIntr: int + bExcessErrorDL: int +struct_NV2080_CTRL_NVLINK_ERR_INFO.register_fields([('TLErrlog', NvU32, 0), ('TLIntrEn', NvU32, 4), ('TLCTxErrStatus0', NvU32, 8), ('TLCTxErrStatus1', NvU32, 12), ('TLCTxSysErrStatus0', NvU32, 16), ('TLCRxErrStatus0', NvU32, 20), ('TLCRxErrStatus1', NvU32, 24), ('TLCRxSysErrStatus0', NvU32, 28), ('TLCTxErrLogEn0', NvU32, 32), ('TLCTxErrLogEn1', NvU32, 36), ('TLCTxSysErrLogEn0', NvU32, 40), ('TLCRxErrLogEn0', NvU32, 44), ('TLCRxErrLogEn1', NvU32, 48), ('TLCRxSysErrLogEn0', NvU32, 52), ('MIFTxErrStatus0', NvU32, 56), ('MIFRxErrStatus0', NvU32, 60), ('NVLIPTLnkErrStatus0', NvU32, 64), ('NVLIPTLnkErrLogEn0', NvU32, 68), ('NVLIPTLnkCtrlLinkStateRequest', NvU32, 72), ('DLSpeedStatusTx', NvU32, 76), ('DLSpeedStatusRx', NvU32, 80), ('NVLDLRxSlsmErrCntl', NvU32, 84), ('NVLDLTopLinkState', NvU32, 88), ('NVLDLTopIntr', NvU32, 92), ('DLStatMN00', NvU32, 96), ('DLStatUC01', NvU32, 100), ('MinionNvlinkLinkIntr', NvU32, 104), ('bExcessErrorDL', NvBool, 108)]) +NV2080_CTRL_NVLINK_ERR_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_ERR_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO(c.Struct): + SIZE = 8 + NVLIPTErrStatus0: int + NVLIPTErrLogEn0: int +struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO.register_fields([('NVLIPTErrStatus0', NvU32, 0), ('NVLIPTErrLogEn0', NvU32, 4)]) +NV2080_CTRL_NVLINK_COMMON_ERR_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS(c.Struct): + SIZE = 7224 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + linkErrInfo: c.Array[struct_NV2080_CTRL_NVLINK_ERR_INFO, Literal[64]] + ioctrlMask: int + commonErrInfo: c.Array[struct_NV2080_CTRL_NVLINK_COMMON_ERR_INFO, Literal[3]] + ErrInfoFlags: int +struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('linkErrInfo', c.Array[NV2080_CTRL_NVLINK_ERR_INFO, Literal[64]], 24), ('ioctrlMask', NvU32, 7192), ('commonErrInfo', c.Array[NV2080_CTRL_NVLINK_COMMON_ERR_INFO, Literal[3]], 7196), ('ErrInfoFlags', NvU8, 7220)]) +NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES(c.Struct): + SIZE = 264 + bTx0TlCounterOverflow: int + bTx1TlCounterOverflow: int + bRx0TlCounterOverflow: int + bRx1TlCounterOverflow: int + value: c.Array[ctypes.c_uint64, Literal[32]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES.register_fields([('bTx0TlCounterOverflow', NvBool, 0), ('bTx1TlCounterOverflow', NvBool, 1), ('bRx0TlCounterOverflow', NvBool, 2), ('bRx1TlCounterOverflow', NvBool, 3), ('value', c.Array[NvU64, Literal[32]], 8)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS(c.Struct): + SIZE = 16928 + counterMask: int + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + counters: c.Array[struct_NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS.register_fields([('counterMask', NvU32, 0), ('linkMask', NvU64, 8), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 16), ('counters', c.Array[NV2080_CTRL_NVLINK_GET_COUNTERS_VALUES, Literal[64]], 32)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS(c.Struct): + SIZE = 32 + counterMask: int + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS.register_fields([('counterMask', NvU32, 0), ('linkMask', NvU64, 8), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 16)]) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES(c.Struct): + SIZE = 16 + overFlow: int + value: int +struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES.register_fields([('overFlow', NvBool, 0), ('value', NvU64, 8)]) +NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS(c.Struct): + SIZE = 28712 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + counterMask: c.Array[ctypes.c_uint64, Literal[2]] + counter: c.Array[c.Array[struct_NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES, Literal[28]], Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('counterMask', c.Array[NvU64, Literal[2]], 24), ('counter', c.Array[c.Array[NV2080_CTRL_NVLINK_COUNTERS_V2_VALUES, Literal[28]], Literal[64]], 40)]) +NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS(c.Struct): + SIZE = 40 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + counterMask: c.Array[ctypes.c_uint64, Literal[2]] +struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('counterMask', c.Array[NvU64, Literal[2]], 24)]) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + bFatalError: int +struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('bFatalError', NvBool, 24)]) +NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS +enum_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE: dict[int, str] = {(NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_TX_ERR:=1): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_TX_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_PKT_ERR:=2): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_PKT_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_AUTH_TAG_ERR:=3): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_AUTH_TAG_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_LINK_ERR:=4): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_LINK_ERR', (NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_MAX:=5): 'NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE_MAX'} +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG(c.Struct): + SIZE = 16 + errType: int + errSettings: int +struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG.register_fields([('errType', NV2080_CTRL_NVLINK_HW_ERROR_INJECT_ERR_TYPE, 0), ('errSettings', NvU64, 8)]) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG: TypeAlias = struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG +@c.record +class struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS(c.Struct): + SIZE = 1048 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + errCfg: c.Array[struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG, Literal[64]] +struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('errCfg', c.Array[NV2080_CTRL_NVLINK_HW_ERROR_INJECT_CFG, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO(c.Struct): + SIZE = 20 + txErrInfo: int + packetErrInfo: int + authErrInfo: int + linkStatus: int + errInjectStatus: int +struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO.register_fields([('txErrInfo', NvU32, 0), ('packetErrInfo', NvU32, 4), ('authErrInfo', NvU32, 8), ('linkStatus', NvU32, 12), ('errInjectStatus', NvU32, 16)]) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS(c.Struct): + SIZE = 1304 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + errInfo: c.Array[struct_NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS.register_fields([('linkMask', NvU64, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('errInfo', c.Array[NV2080_CTRL_NVLINK_HW_ERROR_INJECT_INFO, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS(c.Struct): + SIZE = 280 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + numRecoveries: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('numRecoveries', c.Array[NvU32, Literal[64]], 24)]) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + remoteType: int +struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS.register_fields([('linkId', NvU32, 0), ('remoteType', NvU32, 4)]) +NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS(c.Struct): + SIZE = 80 + linkId: int + supportedCounts: int + fatalErrorCounts: c.Array[ctypes.c_ubyte, Literal[63]] +struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS.register_fields([('linkId', NvU32, 0), ('supportedCounts', NvU64, 8), ('fatalErrorCounts', c.Array[NvU8, Literal[63]], 16)]) +NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE(c.Struct): + SIZE = 8 + errorsPerMinute: int + timestamp: int +struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE.register_fields([('errorsPerMinute', NvU32, 0), ('timestamp', NvU32, 4)]) +NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE: TypeAlias = struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS(c.Struct): + SIZE = 92 + linkId: int + numDailyMaxNonfatalErrorRates: int + dailyMaxNonfatalErrorRates: c.Array[struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]] + numMonthlyMaxNonfatalErrorRates: int + monthlyMaxNonfatalErrorRates: c.Array[struct_NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]] +struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS.register_fields([('linkId', NvU32, 0), ('numDailyMaxNonfatalErrorRates', NvU32, 4), ('dailyMaxNonfatalErrorRates', c.Array[NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]], 8), ('numMonthlyMaxNonfatalErrorRates', NvU32, 48), ('monthlyMaxNonfatalErrorRates', c.Array[NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE, Literal[5]], 52)]) +NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS(c.Struct): + SIZE = 1 + bEnabled: int +struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS.register_fields([('bEnabled', NvBool, 0)]) +NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS(c.Struct): + SIZE = 8 + linkId: int + params: int +struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS.register_fields([('linkId', NvU8, 0), ('params', NvU32, 4)]) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + powerState: int +struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('powerState', NvU32, 24)]) +NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + powerState: int +struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS.register_fields([('linkId', NvU32, 0), ('powerState', NvU32, 4)]) +NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS +enum_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE: dict[int, str] = {(TLC_RX_LNK:=0): 'TLC_RX_LNK', (TLC_TX_SYS:=1): 'TLC_TX_SYS'} +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE: dict[int, str] = {(TX_SYS_TX_RSP_STATUS_HW_ERR:=0): 'TX_SYS_TX_RSP_STATUS_HW_ERR', (TX_SYS_TX_RSP_STATUS_UR_ERR:=1): 'TX_SYS_TX_RSP_STATUS_UR_ERR', (TX_SYS_TX_RSP_STATUS_PRIV_ERR:=2): 'TX_SYS_TX_RSP_STATUS_PRIV_ERR'} +NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE: dict[int, str] = {(RX_LNK_RX_RSP_STATUS_HW_ERR:=0): 'RX_LNK_RX_RSP_STATUS_HW_ERR', (RX_LNK_RX_RSP_STATUS_UR_ERR:=1): 'RX_LNK_RX_RSP_STATUS_UR_ERR', (RX_LNK_RX_RSP_STATUS_PRIV_ERR:=2): 'RX_LNK_RX_RSP_STATUS_PRIV_ERR'} +NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE(c.Struct): + SIZE = 4 + txSysErrorType: int + rxLnkErrorType: int +union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE.register_fields([('txSysErrorType', NV2080_CTRL_NVLINK_INJECT_TLC_TX_SYS_REPORT_ERROR_TYPE, 0), ('rxLnkErrorType', NV2080_CTRL_NVLINK_INJECT_TLC_RX_LNK_REPORT_ERROR_TYPE, 0)]) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE: TypeAlias = union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS(c.Struct): + SIZE = 16 + linkId: int + device: int + bBroadcast: int + errorType: union_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE +struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS.register_fields([('linkId', NvU32, 0), ('device', NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_DEVICE, 4), ('bBroadcast', NvBool, 8), ('errorType', NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_TYPE, 12)]) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS(c.Struct): + SIZE = 16 + linkId: int + numLanes: int + figureOfMeritValues: c.Array[ctypes.c_uint16, Literal[4]] +struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS.register_fields([('linkId', NvU32, 0), ('numLanes', NvU8, 4), ('figureOfMeritValues', c.Array[NvU16, Literal[4]], 6)]) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS(c.Struct): + SIZE = 8 + peerMask: int + bEnable: int +struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS.register_fields([('peerMask', NvU32, 0), ('bEnable', NvBool, 4)]) +NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS(c.Struct): + SIZE = 8 + linkId: int + lane: int + addr: int + phyConfigData: int +struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS.register_fields([('linkId', NvU8, 0), ('lane', NvU8, 1), ('addr', NvU16, 2), ('phyConfigData', NvU32, 4)]) +NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_LANE_ERROR(c.Struct): + SIZE = 12 + bValid: int + eccErrorValue: int + overflowed: int +struct_NV2080_CTRL_NVLINK_LANE_ERROR.register_fields([('bValid', NvBool, 0), ('eccErrorValue', NvU32, 4), ('overflowed', NvBool, 8)]) +NV2080_CTRL_NVLINK_LANE_ERROR: TypeAlias = struct_NV2080_CTRL_NVLINK_LANE_ERROR +@c.record +class struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR(c.Struct): + SIZE = 56 + errorLane: c.Array[struct_NV2080_CTRL_NVLINK_LANE_ERROR, Literal[4]] + eccDecFailed: int + eccDecFailedOverflowed: int +struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR.register_fields([('errorLane', c.Array[NV2080_CTRL_NVLINK_LANE_ERROR, Literal[4]], 0), ('eccDecFailed', NvU32, 48), ('eccDecFailedOverflowed', NvBool, 52)]) +NV2080_CTRL_NVLINK_LINK_ECC_ERROR: TypeAlias = struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR +@c.record +class struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS(c.Struct): + SIZE = 3608 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + errorLink: c.Array[struct_NV2080_CTRL_NVLINK_LINK_ECC_ERROR, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('errorLink', c.Array[NV2080_CTRL_NVLINK_LINK_ECC_ERROR, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES(c.Struct): + SIZE = 32 + value: c.Array[ctypes.c_uint64, Literal[4]] +struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES.register_fields([('value', c.Array[NvU64, Literal[4]], 0)]) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES +@c.record +class struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS(c.Struct): + SIZE = 2080 + counterMask: int + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + counters: c.Array[struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES, Literal[64]] +struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS.register_fields([('counterMask', NvU16, 0), ('linkMask', NvU64, 8), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 16), ('counters', c.Array[NV2080_CTRL_NVLINK_READ_TP_COUNTERS_VALUES, Literal[64]], 32)]) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS(c.Struct): + SIZE = 1 + bLockPowerMode: int +struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS.register_fields([('bLockPowerMode', NvBool, 0)]) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS(c.Struct): + SIZE = 72 + linkId: int + counterValidMask: int + counterValues: c.Array[ctypes.c_uint32, Literal[16]] +struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS.register_fields([('linkId', NvU32, 0), ('counterValidMask', NvU32, 4), ('counterValues', c.Array[NvU32, Literal[16]], 8)]) +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS(c.Struct): + SIZE = 8 + linkId: int + loopbackMode: int +struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS.register_fields([('linkId', NvU32, 0), ('loopbackMode', NvU8, 4)]) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO(c.Struct): + SIZE = 6 + bValid: int + passCount: int + failCount: int +struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO.register_fields([('bValid', NvBool, 0), ('passCount', NvU16, 2), ('failCount', NvU16, 4)]) +NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO: TypeAlias = struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO +@c.record +class struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS(c.Struct): + SIZE = 216 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + refreshCount: c.Array[struct_NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO, Literal[32]] +struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('refreshCount', c.Array[NV2080_CTRL_NVLINK_PHY_REFRESH_STATUS_INFO, Literal[32]], 24)]) +NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS(c.Struct): + SIZE = 24 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK +struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8)]) +NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS(c.Struct): + SIZE = 16 + bGet: int + addr: int +struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS.register_fields([('bGet', NvBool, 0), ('addr', NvU64, 8)]) +NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS(c.Struct): + SIZE = 176 + discoveredLinks: int + discoveredLinkMasks: struct_NV2080_CTRL_NVLINK_LINK_MASK + connectedLinksMask: int + connectedLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bridgeSensableLinks: int + bridgeSensableLinkMasks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bridgedLinks: int + bridgedLinkMasks: struct_NV2080_CTRL_NVLINK_LINK_MASK + initDisabledLinksMask: int + initDisabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + vbiosDisabledLinkMask: int + vbiosDisabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + initializedLinks: int + initializedLinkMasks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bEnableTrainingAtLoad: int + bEnableSafeModeAtLoad: int +struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS.register_fields([('discoveredLinks', NvU64, 0), ('discoveredLinkMasks', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('connectedLinksMask', NvU32, 24), ('connectedLinks', NV2080_CTRL_NVLINK_LINK_MASK, 32), ('bridgeSensableLinks', NvU64, 48), ('bridgeSensableLinkMasks', NV2080_CTRL_NVLINK_LINK_MASK, 56), ('bridgedLinks', NvU32, 72), ('bridgedLinkMasks', NV2080_CTRL_NVLINK_LINK_MASK, 80), ('initDisabledLinksMask', NvU32, 96), ('initDisabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 104), ('vbiosDisabledLinkMask', NvU64, 120), ('vbiosDisabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 128), ('initializedLinks', NvU32, 144), ('initializedLinkMasks', NV2080_CTRL_NVLINK_LINK_MASK, 152), ('bEnableTrainingAtLoad', NvBool, 168), ('bEnableSafeModeAtLoad', NvBool, 169)]) +NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS(c.Struct): + SIZE = 32 + initDisabledLinksMask: int + initDisabledLinks: struct_NV2080_CTRL_NVLINK_LINK_MASK + bSkipHwNvlinkDisable: int +struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS.register_fields([('initDisabledLinksMask', NvU32, 0), ('initDisabledLinks', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('bSkipHwNvlinkDisable', NvBool, 24)]) +NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS +enum_NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND: dict[int, str] = {(NVLINK_EOM_CONTROL_START_EOM:=0): 'NVLINK_EOM_CONTROL_START_EOM', (NVLINK_EOM_CONTROL_END_EOM:=1): 'NVLINK_EOM_CONTROL_END_EOM', (NVLINK_EOM_CONTROL_CONFIG_EOM:=2): 'NVLINK_EOM_CONTROL_CONFIG_EOM', (NVLINK_EOM_CONTROL_FULL_EOM_SEQUENCE:=3): 'NVLINK_EOM_CONTROL_FULL_EOM_SEQUENCE'} +NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT(c.Struct): + SIZE = 4 + upper: int + middle: int + lower: int + composite: int +struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT.register_fields([('upper', NvU8, 0), ('middle', NvU8, 1), ('lower', NvU8, 2), ('composite', NvU8, 3)]) +NV2080_CTRL_NVLINK_EOM_MEASUREMENT: TypeAlias = struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT +@c.record +class struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS(c.Struct): + SIZE = 28 + cmd: int + linkId: int + params: int + measurements: c.Array[struct_NV2080_CTRL_NVLINK_EOM_MEASUREMENT, Literal[4]] +struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS.register_fields([('cmd', NV2080_CTRL_CMD_NVLINK_EOM_CONTROL_PARAMS_COMMAND, 0), ('linkId', NvU32, 4), ('params', NvU32, 8), ('measurements', c.Array[NV2080_CTRL_NVLINK_EOM_MEASUREMENT, Literal[4]], 12)]) +NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS(c.Struct): + SIZE = 5124 + data: c.Array[ctypes.c_ubyte, Literal[5120]] + dataSize: int +struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS.register_fields([('data', c.Array[NvU8, Literal[5120]], 0), ('dataSize', NvU32, 5120)]) +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS(c.Struct): + SIZE = 8 + l1Threshold: int + l1ExitThreshold: int +struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS.register_fields([('l1Threshold', NvU32, 0), ('l1ExitThreshold', NvU32, 4)]) +NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS(c.Struct): + SIZE = 12 + l1Threshold: int + l1ExitThreshold: int + bL1Enabled: int + bL1ThermThrottlingEnabled: int +struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS.register_fields([('l1Threshold', NvU32, 0), ('l1ExitThreshold', NvU32, 4), ('bL1Enabled', NvBool, 8), ('bL1ThermThrottlingEnabled', NvBool, 9)]) +NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS(c.Struct): + SIZE = 5124 + buffer: c.Array[ctypes.c_ubyte, Literal[5120]] + dataSize: int +struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS.register_fields([('buffer', c.Array[NvU8, Literal[5120]], 0), ('dataSize', NvU32, 5120)]) +NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS(c.Struct): + SIZE = 8 + linkId: int + bIsGpuDegraded: int +struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS.register_fields([('linkId', NvU32, 0), ('bIsGpuDegraded', NvBool, 4)]) +NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS(c.Struct): + SIZE = 12 + bIsEnoughNvLink: int + numBridge: int + bridgePresenceMask: int +struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS.register_fields([('bIsEnoughNvLink', NvBool, 0), ('numBridge', NvU32, 4), ('bridgePresenceMask', NvU32, 8)]) +NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS(c.Struct): + SIZE = 4 + linkId: int +struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS.register_fields([('linkId', NvU32, 0)]) +NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PORT_EVENT(c.Struct): + SIZE = 24 + portEventType: int + gpuId: int + linkId: int + time: int +struct_NV2080_CTRL_NVLINK_PORT_EVENT.register_fields([('portEventType', NvU32, 0), ('gpuId', NvU32, 4), ('linkId', NvU32, 8), ('time', NvU64, 16)]) +NV2080_CTRL_NVLINK_PORT_EVENT: TypeAlias = struct_NV2080_CTRL_NVLINK_PORT_EVENT +@c.record +class struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS(c.Struct): + SIZE = 1560 + portEventIndex: int + nextPortEventIndex: int + portEventCount: int + bOverflow: int + portEvent: c.Array[struct_NV2080_CTRL_NVLINK_PORT_EVENT, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS.register_fields([('portEventIndex', NvU64, 0), ('nextPortEventIndex', NvU64, 8), ('portEventCount', NvU32, 16), ('bOverflow', NvBool, 20), ('portEvent', c.Array[NV2080_CTRL_NVLINK_PORT_EVENT, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS(c.Struct): + SIZE = 4 + linkId: int +struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS.register_fields([('linkId', NvU32, 0)]) +NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bReducedNvlinkConfig: int +struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS.register_fields([('bReducedNvlinkConfig', NvBool, 0)]) +NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_DATA(c.Struct): + SIZE = 496 + data: c.Array[ctypes.c_ubyte, Literal[496]] +struct_NV2080_CTRL_NVLINK_PRM_DATA.register_fields([('data', c.Array[NvU8, Literal[496]], 0)]) +NV2080_CTRL_NVLINK_PRM_DATA: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_DATA +@c.record +class struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS(c.Struct): + SIZE = 39 + ibGuid: c.Array[ctypes.c_ubyte, Literal[16]] + rackGuid: c.Array[ctypes.c_ubyte, Literal[16]] + chassisPhysicalSlotNumber: int + computeSlotIndex: int + nodeIndex: int + peerType: int + moduleId: int + nvlinkSignalingProtocol: int + linksPerSpigot: int +struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS.register_fields([('ibGuid', c.Array[NvU8, Literal[16]], 0), ('rackGuid', c.Array[NvU8, Literal[16]], 16), ('chassisPhysicalSlotNumber', NvU8, 32), ('computeSlotIndex', NvU8, 33), ('nodeIndex', NvU8, 34), ('peerType', NvU8, 35), ('moduleId', NvU8, 36), ('nvlinkSignalingProtocol', NvU8, 37), ('linksPerSpigot', NvU8, 38)]) +NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD(c.Struct): + SIZE = 4 + pllIndex: int + address: int +struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD.register_fields([('pllIndex', NvU8, 0), ('address', NvU16, 2)]) +NV2080_CTRL_NVLINK_UPHY_CLN_CMD: TypeAlias = struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD +@c.record +class struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS(c.Struct): + SIZE = 536 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + uphyCmd: c.Array[struct_NV2080_CTRL_NVLINK_UPHY_CLN_CMD, Literal[64]] + data: c.Array[ctypes.c_uint32, Literal[64]] +struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('uphyCmd', c.Array[NV2080_CTRL_NVLINK_UPHY_CLN_CMD, Literal[64]], 24), ('data', c.Array[NvU32, Literal[64]], 280)]) +NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS(c.Struct): + SIZE = 48 + rbmModesList: c.Array[ctypes.c_uint16, Literal[23]] + rbmTotalModes: int +struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS.register_fields([('rbmModesList', c.Array[NvU16, Literal[23]], 0), ('rbmTotalModes', NvU8, 46)]) +NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS(c.Struct): + SIZE = 8 + rbmMode: int + bForceSync: int + rbmSetPollTimeoutMs: int +struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS.register_fields([('rbmMode', NvU16, 0), ('bForceSync', NvBool, 2), ('rbmSetPollTimeoutMs', NvU32, 4)]) +NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS(c.Struct): + SIZE = 2 + rbmMode: int +struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS.register_fields([('rbmMode', NvU16, 0)]) +NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS(c.Struct): + SIZE = 56 + localDeviceInfo: struct_NV2080_CTRL_NVLINK_DEVICE_INFO +struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS.register_fields([('localDeviceInfo', NV2080_CTRL_NVLINK_DEVICE_INFO, 0)]) +NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS +enum_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY: dict[int, str] = {(NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_NONFATAL:=0): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_NONFATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_APP_FATAL:=1): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_APP_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_FATAL:=2): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_DEGRADATION:=3): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_DEGRADATION', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_WATCHDOG_TIMEOUT:=4): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_WATCHDOG_TIMEOUT', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_NON_FATAL:=5): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MSE:=6): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MSE', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_NON_FATAL:=7): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_FATAL:=8): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_PRIV_ERR:=9): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_RLW_PRIV_ERR', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_NON_FATAL:=10): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_FATAL:=11): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TREX_NON_FATAL:=12): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_TREX_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_NON_FATAL:=13): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_FATAL:=14): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_NETIR_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_NON_FATAL:=15): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_FATAL:=16): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_SAW_MVB_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_NON_FATAL:=17): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_FATAL:=18): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_RLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_NON_FATAL:=19): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_FATAL:=20): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_TLW_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_FATAL:=21): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_SAW_MVB_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MAX:=22): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MAX', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_MVB_NON_FATAL:=23): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_MVB_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_MVB_FATAL:=24): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_GIN_MVB_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_MVB_NON_FATAL:=25): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_MVB_NON_FATAL', (NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_MVB_FATAL:=26): 'NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY_MSE_ECC_INJECT_MVB_FATAL'} +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + severity: int +struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('severity', NV2080_CTRL_NVLINK_INJECT_SW_ERROR_SEVERITY, 24)]) +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS(c.Struct): + SIZE = 96 + localGpuAlid: int + localGpuClid: int + remoteGpuAlid: int + remoteGpuClid: int + bNvleQualMode: int + localGpuPlatformInfo: struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS + remoteGpuPlatformInfo: struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS +struct_NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS.register_fields([('localGpuAlid', NvU32, 0), ('localGpuClid', NvU32, 4), ('remoteGpuAlid', NvU32, 8), ('remoteGpuClid', NvU32, 12), ('bNvleQualMode', NvBool, 16), ('localGpuPlatformInfo', NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS, 17), ('remoteGpuPlatformInfo', NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS, 56)]) +NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_MAP(c.Struct): + SIZE = 8 + alid: int + clid: int +struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_MAP.register_fields([('alid', NvU32, 0), ('clid', NvU32, 4)]) +NV2080_CTRL_NVLINK_NVLE_ALID_CLID_MAP: TypeAlias = struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_MAP +@c.record +class struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE(c.Struct): + SIZE = 260 + alidClidMap: c.Array[struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_MAP, Literal[32]] + numEntries: int +struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE.register_fields([('alidClidMap', c.Array[NV2080_CTRL_NVLINK_NVLE_ALID_CLID_MAP, Literal[32]], 0), ('numEntries', NvU32, 256)]) +NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE: TypeAlias = struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE +@c.record +class struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE_V2(c.Struct): + SIZE = 1028 + alidClidMap: c.Array[struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_MAP, Literal[128]] + numEntries: int +struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE_V2.register_fields([('alidClidMap', c.Array[NV2080_CTRL_NVLINK_NVLE_ALID_CLID_MAP, Literal[128]], 0), ('numEntries', NvU32, 1024)]) +NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE_V2: TypeAlias = struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE_V2 +@c.record +class struct_NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_PARAMS(c.Struct): + SIZE = 276 + bGet: int + alid: int + clid: int + alidClidTable: struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE + bClidUpdated: int +struct_NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_PARAMS.register_fields([('bGet', NvBool, 0), ('alid', NvU32, 4), ('clid', NvU32, 8), ('alidClidTable', NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE, 12), ('bClidUpdated', NvBool, 272)]) +NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_PARAMS +enum_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE: dict[int, str] = {(NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DISABLED:=0): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DISABLED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_TRIGGER_ONCE:=1): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_TRIGGER_ONCE', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_EXITED:=2): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_EXITED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_ENTERED:=3): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_FORCE_ENTERED', (NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DUTY_CYCLE:=4): 'NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE_DUTY_CYCLE'} +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG(c.Struct): + SIZE = 8 + mode: int + toggleActiveTime: int + toggleInactiveTime: int + bTrigger: int +struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG.register_fields([('mode', NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_MODE, 0), ('toggleActiveTime', NvU8, 4), ('toggleInactiveTime', NvU8, 5), ('bTrigger', NvBool, 6)]) +NV2080_CTRL_NVLINK_L1_FORCE_CONFIG: TypeAlias = struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG +@c.record +class struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS(c.Struct): + SIZE = 32 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + config: struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG +struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('config', NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, 24)]) +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS(c.Struct): + SIZE = 536 + linkMask: int + links: struct_NV2080_CTRL_NVLINK_LINK_MASK + config: c.Array[struct_NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS.register_fields([('linkMask', NvU32, 0), ('links', NV2080_CTRL_NVLINK_LINK_MASK, 8), ('config', c.Array[NV2080_CTRL_NVLINK_L1_FORCE_CONFIG, Literal[64]], 24)]) +NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS(c.Struct): + SIZE = 2 + bMmuNvlinkEncryptEn: int + bNvlinkTlwEncryptEn: int +struct_NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS.register_fields([('bMmuNvlinkEncryptEn', NvBool, 0), ('bNvlinkTlwEncryptEn', NvBool, 1)]) +NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SEMANTIC_VERSION(c.Struct): + SIZE = 16 + ucodeType: int + major: int + minor: int + subMinor: int +struct_NV2080_CTRL_NVLINK_SEMANTIC_VERSION.register_fields([('ucodeType', NvU8, 0), ('major', NvU32, 4), ('minor', NvU32, 8), ('subMinor', NvU32, 12)]) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION: TypeAlias = struct_NV2080_CTRL_NVLINK_SEMANTIC_VERSION +@c.record +class struct_NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS(c.Struct): + SIZE = 264 + firmwareVersion: c.Array[struct_NV2080_CTRL_NVLINK_SEMANTIC_VERSION, Literal[16]] + chipTypeArch: int + numValidEntries: int +struct_NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS.register_fields([('firmwareVersion', c.Array[NV2080_CTRL_NVLINK_SEMANTIC_VERSION, Literal[16]], 0), ('chipTypeArch', NvU8, 256), ('numValidEntries', NvU32, 260)]) +NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS(c.Struct): + SIZE = 1 + bIsNvleEnabled: int +struct_NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS.register_fields([('bIsNvleEnabled', NvBool, 0)]) +NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS(c.Struct): + SIZE = 496 + prm: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS.register_fields([('prm', NV2080_CTRL_NVLINK_PRM_DATA, 0)]) +NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM(c.Struct): + SIZE = 36 + data: c.Array[ctypes.c_ubyte, Literal[32]] + size: int +NvUFXP0_8: TypeAlias = ctypes.c_ubyte +struct_NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM.register_fields([('data', c.Array[NvUFXP0_8, Literal[32]], 0), ('size', NvU32, 32)]) +NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM: TypeAlias = struct_NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM +@c.record +class struct_NV2080_CTRL_NVLINK_PLR_TX_BW_LOSS_LOW_FREQUENCY(c.Struct): + SIZE = 12 + lastPlrTxBwLossLf: int + meanPlrTxBwLossLf: int + maxPlrTxBwLossLf: int + consBelowPlrTxBwLossLfThreshold: int + numOfPlrTxBwLossLfWarnings: int + numOfPlrTxBwLossLfAlarms: int +struct_NV2080_CTRL_NVLINK_PLR_TX_BW_LOSS_LOW_FREQUENCY.register_fields([('lastPlrTxBwLossLf', NvU16, 0), ('meanPlrTxBwLossLf', NvU16, 2), ('maxPlrTxBwLossLf', NvU16, 4), ('consBelowPlrTxBwLossLfThreshold', NvU16, 6), ('numOfPlrTxBwLossLfWarnings', NvU16, 8), ('numOfPlrTxBwLossLfAlarms', NvU16, 10)]) +NV2080_CTRL_NVLINK_PLR_TX_BW_LOSS_LOW_FREQUENCY: TypeAlias = struct_NV2080_CTRL_NVLINK_PLR_TX_BW_LOSS_LOW_FREQUENCY +@c.record +class struct_NV2080_CTRL_NVLINK_RECOVERY_BW_LOSS_LOW_FREQUENCY(c.Struct): + SIZE = 12 + lastRecoveryBwLossLf: int + meanRecoveryBwLossLf: int + maxRecoveryBwLossLf: int + consBelowRecoveryBwLossLfThreshold: int + numOfRecoveryBwLossLfWarnings: int + numOfRecoveryBwLossLfAlarms: int +struct_NV2080_CTRL_NVLINK_RECOVERY_BW_LOSS_LOW_FREQUENCY.register_fields([('lastRecoveryBwLossLf', NvU16, 0), ('meanRecoveryBwLossLf', NvU16, 2), ('maxRecoveryBwLossLf', NvU16, 4), ('consBelowRecoveryBwLossLfThreshold', NvU16, 6), ('numOfRecoveryBwLossLfWarnings', NvU16, 8), ('numOfRecoveryBwLossLfAlarms', NvU16, 10)]) +NV2080_CTRL_NVLINK_RECOVERY_BW_LOSS_LOW_FREQUENCY: TypeAlias = struct_NV2080_CTRL_NVLINK_RECOVERY_BW_LOSS_LOW_FREQUENCY +@c.record +class struct_NV2080_CTRL_NVLINK_EFFECTIVE_BER_LOW_FREQUENCY(c.Struct): + SIZE = 10 + consBelowEffBerLfThreshold: int + numOfEffBerLfWarnings: int + numOfEffBerLfAlarms: int + meanEffBerLfMagnitude: int + lastEffBerLfMagnitude: int + maxEffBerLfMagnitude: int + maxEffBerLfCoef: int +struct_NV2080_CTRL_NVLINK_EFFECTIVE_BER_LOW_FREQUENCY.register_fields([('consBelowEffBerLfThreshold', NvU16, 0), ('numOfEffBerLfWarnings', NvU16, 2), ('numOfEffBerLfAlarms', NvU16, 4), ('meanEffBerLfMagnitude', NvU8, 6), ('lastEffBerLfMagnitude', NvU8, 7), ('maxEffBerLfMagnitude', NvU8, 8), ('maxEffBerLfCoef', NvU8, 9)]) +NV2080_CTRL_NVLINK_EFFECTIVE_BER_LOW_FREQUENCY: TypeAlias = struct_NV2080_CTRL_NVLINK_EFFECTIVE_BER_LOW_FREQUENCY +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_ACCUMULATIVE_METRIC_DATA_PARAMS(c.Struct): + SIZE = 84 + linkId: int + globalMaxRawBERExp: int + globalMaxEffBERExp: int + linkDownCount: int + downReasonHistogram: struct_NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM + linkXidHistogram: struct_NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM +struct_NV2080_CTRL_NVLINK_GET_LINK_ACCUMULATIVE_METRIC_DATA_PARAMS.register_fields([('linkId', NvU32, 0), ('globalMaxRawBERExp', NvU8, 4), ('globalMaxEffBERExp', NvU8, 5), ('linkDownCount', NvU32, 8), ('downReasonHistogram', NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM, 12), ('linkXidHistogram', NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM, 48)]) +NV2080_CTRL_NVLINK_GET_LINK_ACCUMULATIVE_METRIC_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_ACCUMULATIVE_METRIC_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_LINK_RECORD_METRIC_DATA_PARAMS(c.Struct): + SIZE = 60 + linkId: int + initialRawBERExp: int + initialEffBERExp: int + lastDownReason: int + uptime: int + localMaxRawBERExp: int + localMaxEffBERExp: int + currEffBERMonitor: int + plrXmitRetryWithinTSecMaxLo: int + totalSuccessfulRecoveryEvents: int + plrTxBwLossLf: struct_NV2080_CTRL_NVLINK_PLR_TX_BW_LOSS_LOW_FREQUENCY + recoveryBwLossLf: struct_NV2080_CTRL_NVLINK_RECOVERY_BW_LOSS_LOW_FREQUENCY + effBerLf: struct_NV2080_CTRL_NVLINK_EFFECTIVE_BER_LOW_FREQUENCY + lastDownAdvancedReason: int +struct_NV2080_CTRL_NVLINK_GET_LINK_RECORD_METRIC_DATA_PARAMS.register_fields([('linkId', NvU32, 0), ('initialRawBERExp', NvU8, 4), ('initialEffBERExp', NvU8, 5), ('lastDownReason', NvU8, 6), ('uptime', NvU32, 8), ('localMaxRawBERExp', NvU8, 12), ('localMaxEffBERExp', NvU8, 13), ('currEffBERMonitor', NvU16, 14), ('plrXmitRetryWithinTSecMaxLo', NvU32, 16), ('totalSuccessfulRecoveryEvents', NvU32, 20), ('plrTxBwLossLf', NV2080_CTRL_NVLINK_PLR_TX_BW_LOSS_LOW_FREQUENCY, 24), ('recoveryBwLossLf', NV2080_CTRL_NVLINK_RECOVERY_BW_LOSS_LOW_FREQUENCY, 36), ('effBerLf', NV2080_CTRL_NVLINK_EFFECTIVE_BER_LOW_FREQUENCY, 48), ('lastDownAdvancedReason', NvU16, 58)]) +NV2080_CTRL_NVLINK_GET_LINK_RECORD_METRIC_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_LINK_RECORD_METRIC_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_DEVICE_RECORD_METRIC_DATA_PARAMS(c.Struct): + SIZE = 496 + MFDE: struct_NV2080_CTRL_NVLINK_PRM_DATA +struct_NV2080_CTRL_NVLINK_GET_DEVICE_RECORD_METRIC_DATA_PARAMS.register_fields([('MFDE', NV2080_CTRL_NVLINK_PRM_DATA, 0)]) +NV2080_CTRL_NVLINK_GET_DEVICE_RECORD_METRIC_DATA_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_DEVICE_RECORD_METRIC_DATA_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME(c.Struct): + SIZE = 64 + name: c.Array[ctypes.c_ubyte, Literal[64]] +struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME.register_fields([('name', c.Array[NvU8, Literal[64]], 0)]) +NV2080_CTRL_NVLINK_NODE_HOSTNAME: TypeAlias = struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME +@c.record +class struct_NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS(c.Struct): + SIZE = 64 + hostname: struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME +struct_NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS.register_fields([('hostname', NV2080_CTRL_NVLINK_NODE_HOSTNAME, 0)]) +NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS(c.Struct): + SIZE = 64 + hostname: struct_NV2080_CTRL_NVLINK_NODE_HOSTNAME +struct_NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS.register_fields([('hostname', NV2080_CTRL_NVLINK_NODE_HOSTNAME, 0)]) +NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_UPDATE_CLID_PARAMS(c.Struct): + SIZE = 4 + clid: int +struct_NV2080_CTRL_NVLINK_UPDATE_CLID_PARAMS.register_fields([('clid', NvU32, 0)]) +NV2080_CTRL_NVLINK_UPDATE_CLID_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_UPDATE_CLID_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_LOCK_REMAP_TABLE_AND_MSE_PARAMS(c.Struct): + SIZE = 16 + linkMask: int + bRemapTableMseLocked: int + bRemapTableLockDisabled: int +struct_NV2080_CTRL_NVLINK_LOCK_REMAP_TABLE_AND_MSE_PARAMS.register_fields([('linkMask', NvU64, 0), ('bRemapTableMseLocked', NvBool, 8), ('bRemapTableLockDisabled', NvBool, 9)]) +NV2080_CTRL_NVLINK_LOCK_REMAP_TABLE_AND_MSE_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_LOCK_REMAP_TABLE_AND_MSE_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_PARAMS(c.Struct): + SIZE = 260 + flaRemapTabAddr: c.Array[ctypes.c_uint32, Literal[32]] + gpaRemapTabAddr: c.Array[ctypes.c_uint32, Literal[32]] + remapTabSize: int +struct_NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_PARAMS.register_fields([('flaRemapTabAddr', c.Array[NvU32, Literal[32]], 0), ('gpaRemapTabAddr', c.Array[NvU32, Literal[32]], 128), ('remapTabSize', NvU32, 256)]) +NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_NVLE_PKT_CNTRS(c.Struct): + SIZE = 32 + txPipe0Cntr: int + txPipe1Cntr: int + rxPipe0Cntr: int + rxPipe1Cntr: int +struct_NV2080_CTRL_NVLINK_NVLE_PKT_CNTRS.register_fields([('txPipe0Cntr', NvU64, 0), ('txPipe1Cntr', NvU64, 8), ('rxPipe0Cntr', NvU64, 16), ('rxPipe1Cntr', NvU64, 24)]) +NV2080_CTRL_NVLINK_NVLE_PKT_CNTRS: TypeAlias = struct_NV2080_CTRL_NVLINK_NVLE_PKT_CNTRS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_NVLE_PKT_COUNTERS_PARAMS(c.Struct): + SIZE = 2064 + linkMask: struct_NV2080_CTRL_NVLINK_LINK_MASK + nvleCounters: c.Array[struct_NV2080_CTRL_NVLINK_NVLE_PKT_CNTRS, Literal[64]] +struct_NV2080_CTRL_NVLINK_GET_NVLE_PKT_COUNTERS_PARAMS.register_fields([('linkMask', NV2080_CTRL_NVLINK_LINK_MASK, 0), ('nvleCounters', c.Array[NV2080_CTRL_NVLINK_NVLE_PKT_CNTRS, Literal[64]], 16)]) +NV2080_CTRL_NVLINK_GET_NVLE_PKT_COUNTERS_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_NVLE_PKT_COUNTERS_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_SETUP_NVLE_ENCRYPTION_KEY_PARAMS(c.Struct): + SIZE = 120 + nvleKey: c.Array[ctypes.c_ubyte, Literal[32]] + localGpuAlid: int + remoteGpuAlid: int + localGpuPlatformInfo: struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS + remoteGpuPlatformInfo: struct_NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS +struct_NV2080_CTRL_NVLINK_SETUP_NVLE_ENCRYPTION_KEY_PARAMS.register_fields([('nvleKey', c.Array[NvU8, Literal[32]], 0), ('localGpuAlid', NvU32, 32), ('remoteGpuAlid', NvU32, 36), ('localGpuPlatformInfo', NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS, 40), ('remoteGpuPlatformInfo', NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS, 79)]) +NV2080_CTRL_NVLINK_SETUP_NVLE_ENCRYPTION_KEY_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_SETUP_NVLE_ENCRYPTION_KEY_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_V2_PARAMS(c.Struct): + SIZE = 1036 + flaRemapTabAddr: c.Array[ctypes.c_uint32, Literal[128]] + gpaRemapTabAddr: c.Array[ctypes.c_uint32, Literal[128]] + remapTabSize: int + remapEntryStart: int + remapEntryEnd: int +struct_NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_V2_PARAMS.register_fields([('flaRemapTabAddr', c.Array[NvU32, Literal[128]], 0), ('gpaRemapTabAddr', c.Array[NvU32, Literal[128]], 512), ('remapTabSize', NvU32, 1024), ('remapEntryStart', NvU32, 1028), ('remapEntryEnd', NvU32, 1032)]) +NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_V2_PARAMS +@c.record +class struct_NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_V2_PARAMS(c.Struct): + SIZE = 1044 + bGet: int + alid: int + clid: int + alidClidTable: struct_NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE_V2 + bClidUpdated: int +struct_NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_V2_PARAMS.register_fields([('bGet', NvBool, 0), ('alid', NvU32, 4), ('clid', NvU32, 8), ('alidClidTable', NV2080_CTRL_NVLINK_NVLE_ALID_CLID_TABLE_V2, 12), ('bClidUpdated', NvBool, 1040)]) +NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_V2_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_BOOST_PARAMS(c.Struct): + SIZE = 8 + flags: int + duration: int +struct_NV2080_CTRL_PERF_BOOST_PARAMS.register_fields([('flags', NvU32, 0), ('duration', NvU32, 4)]) +NV2080_CTRL_PERF_BOOST_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_BOOST_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS(c.Struct): + SIZE = 1 + bAcquire: int +struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS.register_fields([('bAcquire', NvBool, 0)]) +NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_PERF_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerStateInfo: struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS.register_fields([('powerStateInfo', NV2080_CTRL_PERF_POWERSTATE_PARAMS, 0)]) +NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS(c.Struct): + SIZE = 4 + powerState: int +struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS.register_fields([('powerState', NvU32, 0)]) +NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS +enum_NV2080_CTRL_PERF_RATED_TDP_CLIENT: dict[int, str] = {(NV2080_CTRL_PERF_RATED_TDP_CLIENT_RM:=0): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_RM', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_WAR_BUG_1785342:=1): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_WAR_BUG_1785342', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_GLOBAL:=2): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_GLOBAL', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_OS:=3): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_OS', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_PROFILE:=4): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_PROFILE', (NV2080_CTRL_PERF_RATED_TDP_CLIENT_NUM_CLIENTS:=5): 'NV2080_CTRL_PERF_RATED_TDP_CLIENT_NUM_CLIENTS'} +NV2080_CTRL_PERF_RATED_TDP_CLIENT: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_PERF_RATED_TDP_ACTION: dict[int, str] = {(NV2080_CTRL_PERF_RATED_TDP_ACTION_DEFAULT:=0): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_DEFAULT', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_EXCEED:=1): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_EXCEED', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LIMIT:=2): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LIMIT', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LOCK:=3): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_LOCK', (NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_FLOOR:=4): 'NV2080_CTRL_PERF_RATED_TDP_ACTION_FORCE_FLOOR'} +NV2080_CTRL_PERF_RATED_TDP_ACTION: TypeAlias = ctypes.c_uint32 +enum_NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE: dict[int, str] = {(NV2080_CTRL_PERF_VPSTATE_RATED_TDP:=0): 'NV2080_CTRL_PERF_VPSTATE_RATED_TDP', (NV2080_CTRL_PERF_VPSTATE_TURBO_BOOST:=1): 'NV2080_CTRL_PERF_VPSTATE_TURBO_BOOST', (NV2080_CTRL_PERF_VPSTATE_NUM_VPSTATES:=2): 'NV2080_CTRL_PERF_VPSTATE_NUM_VPSTATES'} +NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST(c.Struct): + SIZE = 8 + action: int + vPstateType: int +struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST.register_fields([('action', NV2080_CTRL_PERF_RATED_TDP_ACTION, 0), ('vPstateType', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 4)]) +NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CLIENT_REQUEST +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS(c.Struct): + SIZE = 56 + rm: struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm + output: int + outputVPstate: int + inputs: c.Array[ctypes.c_uint32, Literal[5]] + vPstateTypes: c.Array[ctypes.c_uint32, Literal[5]] +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm(c.Struct): + SIZE = 8 + clientActiveMask: int + bRegkeyLimitRatedTdp: int +struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm.register_fields([('clientActiveMask', NvU32, 0), ('bRegkeyLimitRatedTdp', NvU8, 4)]) +struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS.register_fields([('rm', struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_rm, 0), ('output', NV2080_CTRL_PERF_RATED_TDP_ACTION, 8), ('outputVPstate', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 12), ('inputs', c.Array[NV2080_CTRL_PERF_RATED_TDP_ACTION, Literal[5]], 16), ('vPstateTypes', c.Array[NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, Literal[5]], 36)]) +NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS(c.Struct): + SIZE = 12 + client: int + input: int + vPstateType: int +struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS.register_fields([('client', NV2080_CTRL_PERF_RATED_TDP_CLIENT, 0), ('input', NV2080_CTRL_PERF_RATED_TDP_ACTION, 4), ('vPstateType', NV2080_CTRL_PERF_RATED_TDP_VPSTATE_TYPE, 8)]) +NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +NV2080_CTRL_PERF_RATED_TDP_GET_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +NV2080_CTRL_PERF_RATED_TDP_SET_CONTROL_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_RATED_TDP_CONTROL_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE(c.Struct): + SIZE = 128 + util: int + vgpuScale: int + procId: int + subProcessID: int + subProcessName: c.Array[ctypes.c_char, Literal[100]] + pOsPidInfo: int +struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE.register_fields([('util', NvU32, 0), ('vgpuScale', NvU32, 4), ('procId', NvU32, 8), ('subProcessID', NvU32, 12), ('subProcessName', c.Array[ctypes.c_char, Literal[100]], 16), ('pOsPidInfo', NvU64, 120)]) +NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE: TypeAlias = struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE +@c.record +class struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE(c.Struct): + SIZE = 776 + base: struct_NV2080_CTRL_GPUMON_SAMPLE + fb: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + gr: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvenc: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvdec: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvjpg: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE + nvofa: struct_NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE +struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE.register_fields([('base', NV2080_CTRL_GPUMON_SAMPLE, 0), ('fb', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 8), ('gr', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 136), ('nvenc', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 264), ('nvdec', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 392), ('nvjpg', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 520), ('nvofa', NV2080_CTRL_PERF_GPUMON_ENGINE_UTIL_SAMPLE, 648)]) +NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE: TypeAlias = struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_PARAM: TypeAlias = struct_NV2080_CTRL_GPUMON_SAMPLES +@c.record +class struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS(c.Struct): + SIZE = 55888 + type: int + bufSize: int + count: int + tracker: int + samples: c.Array[struct_NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE, Literal[72]] +struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS.register_fields([('type', NvU8, 0), ('bufSize', NvU32, 4), ('count', NvU32, 8), ('tracker', NvU32, 12), ('samples', c.Array[NV2080_CTRL_PERF_GPUMON_PERFMON_UTIL_SAMPLE, Literal[72]], 16)]) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS(c.Struct): + SIZE = 8 + prevPstate: int + action: int +struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS.register_fields([('prevPstate', NvU32, 0), ('action', NvU32, 4)]) +NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS(c.Struct): + SIZE = 24 + bGpuIsIdle: int + bRestoreToMax: int + idleTimeUs: int + busyTimeUs: int +struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS.register_fields([('bGpuIsIdle', NvBool, 0), ('bRestoreToMax', NvBool, 1), ('idleTimeUs', NvU64, 8), ('busyTimeUs', NvU64, 16)]) +NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_CLK_INFO(c.Struct): + SIZE = 24 + flags: int + domain: int + currentFreq: int + defaultFreq: int + minFreq: int + maxFreq: int +struct_NV2080_CTRL_PERF_GET_CLK_INFO.register_fields([('flags', NvU32, 0), ('domain', NvU32, 4), ('currentFreq', NvU32, 8), ('defaultFreq', NvU32, 12), ('minFreq', NvU32, 16), ('maxFreq', NvU32, 20)]) +NV2080_CTRL_PERF_GET_CLK_INFO: TypeAlias = struct_NV2080_CTRL_PERF_GET_CLK_INFO +@c.record +class struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS(c.Struct): + SIZE = 24 + level: int + flags: int + perfGetClkInfoList: ctypes.c_void_p + perfGetClkInfoListSize: int +struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS.register_fields([('level', NvU32, 0), ('flags', NvU32, 4), ('perfGetClkInfoList', NvP64, 8), ('perfGetClkInfoListSize', NvU32, 16)]) +NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS(c.Struct): + SIZE = 780 + level: int + flags: int + perfGetClkInfoList: c.Array[struct_NV2080_CTRL_PERF_GET_CLK_INFO, Literal[32]] + perfGetClkInfoListSize: int +struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS.register_fields([('level', NvU32, 0), ('flags', NvU32, 4), ('perfGetClkInfoList', c.Array[NV2080_CTRL_PERF_GET_CLK_INFO, Literal[32]], 8), ('perfGetClkInfoListSize', NvU32, 776)]) +NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS +enum_NV2080_CTRL_CMD_PERF_VID_ENG: dict[int, str] = {(NV2080_CTRL_CMD_PERF_VID_ENG_NVENC:=1): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVENC', (NV2080_CTRL_CMD_PERF_VID_ENG_NVDEC:=2): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVDEC', (NV2080_CTRL_CMD_PERF_VID_ENG_NVJPG:=3): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVJPG', (NV2080_CTRL_CMD_PERF_VID_ENG_NVOFA:=4): 'NV2080_CTRL_CMD_PERF_VID_ENG_NVOFA'} +NV2080_CTRL_CMD_PERF_VID_ENG: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS(c.Struct): + SIZE = 12 + engineType: int + clkPercentBusy: int + samplingPeriodUs: int +struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS.register_fields([('engineType', NV2080_CTRL_CMD_PERF_VID_ENG, 0), ('clkPercentBusy', NvU32, 4), ('samplingPeriodUs', NvU32, 8)]) +NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS(c.Struct): + SIZE = 4 + powerStateInfo: struct_NV2080_CTRL_PERF_POWERSTATE_PARAMS +struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS.register_fields([('powerStateInfo', NV2080_CTRL_PERF_POWERSTATE_PARAMS, 0)]) +NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS +@c.record +class struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS(c.Struct): + SIZE = 4 + videoEvent: int +struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS.register_fields([('videoEvent', NvU32, 0)]) +NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS +NV2080_CTRL_PERF_PSTATES_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS(c.Struct): + SIZE = 4 + currPstate: int +struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS.register_fields([('currPstate', NvU32, 0)]) +NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS +NV2080_CTRL_CLK_DOMAIN_TEGRA: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS(c.Struct): + SIZE = 8 + clkDomain: int + clkPercentBusy: int +struct_NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS.register_fields([('clkDomain', NV2080_CTRL_CLK_DOMAIN_TEGRA, 0), ('clkPercentBusy', NvU32, 4)]) +NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS: TypeAlias = struct_NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS +@c.record +class struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS(c.Struct): + SIZE = 8 + moduleId: int + nvswitchSupport: int +struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS.register_fields([('moduleId', NvU32, 0), ('nvswitchSupport', NvU8, 4)]) +NV2080_CTRL_PMGR_MODULE_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_PMGR_MODULE_INFO_PARAMS +enum_NV2080_CTRL_GC6_FLAVOR_ID: dict[int, str] = {(NV2080_CTRL_GC6_FLAVOR_ID_MSHYBRID:=0): 'NV2080_CTRL_GC6_FLAVOR_ID_MSHYBRID', (NV2080_CTRL_GC6_FLAVOR_ID_OPTIMUS:=1): 'NV2080_CTRL_GC6_FLAVOR_ID_OPTIMUS', (NV2080_CTRL_GC6_FLAVOR_ID_MAX:=4): 'NV2080_CTRL_GC6_FLAVOR_ID_MAX'} +NV2080_CTRL_GC6_FLAVOR_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GC6_ENTRY_PARAMS(c.Struct): + SIZE = 12 + flavorId: int + stepMask: int + params: struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params +@c.record +class struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params(c.Struct): + SIZE = 3 + bIsRTD3Transition: int + bIsRTD3CoreRailPowerCut: int + bSkipPstateSanity: int +struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params.register_fields([('bIsRTD3Transition', NvBool, 0), ('bIsRTD3CoreRailPowerCut', NvBool, 1), ('bSkipPstateSanity', NvBool, 2)]) +struct_NV2080_CTRL_GC6_ENTRY_PARAMS.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('stepMask', NvU32, 4), ('params', struct_NV2080_CTRL_GC6_ENTRY_PARAMS_params, 8)]) +NV2080_CTRL_GC6_ENTRY_PARAMS: TypeAlias = struct_NV2080_CTRL_GC6_ENTRY_PARAMS +@c.record +class struct_NV2080_CTRL_GC6_EXIT_PARAMS(c.Struct): + SIZE = 8 + flavorId: int + params: struct_NV2080_CTRL_GC6_EXIT_PARAMS_params +@c.record +class struct_NV2080_CTRL_GC6_EXIT_PARAMS_params(c.Struct): + SIZE = 3 + bIsGpuSelfWake: int + bIsRTD3Transition: int + bIsRTD3HotTransition: int +struct_NV2080_CTRL_GC6_EXIT_PARAMS_params.register_fields([('bIsGpuSelfWake', NvBool, 0), ('bIsRTD3Transition', NvBool, 1), ('bIsRTD3HotTransition', NvBool, 2)]) +struct_NV2080_CTRL_GC6_EXIT_PARAMS.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('params', struct_NV2080_CTRL_GC6_EXIT_PARAMS_params, 4)]) +NV2080_CTRL_GC6_EXIT_PARAMS: TypeAlias = struct_NV2080_CTRL_GC6_EXIT_PARAMS +enum_NV2080_CTRL_GC6_STEP_ID: dict[int, str] = {(NV2080_CTRL_GC6_STEP_ID_SR_ENTRY:=0): 'NV2080_CTRL_GC6_STEP_ID_SR_ENTRY', (NV2080_CTRL_GC6_STEP_ID_GPU_OFF:=1): 'NV2080_CTRL_GC6_STEP_ID_GPU_OFF', (NV2080_CTRL_GC6_STEP_ID_MAX:=2): 'NV2080_CTRL_GC6_STEP_ID_MAX'} +NV2080_CTRL_GC6_STEP_ID: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NV2080_CTRL_GC6_FLAVOR_INFO(c.Struct): + SIZE = 8 + flavorId: int + stepMask: int +struct_NV2080_CTRL_GC6_FLAVOR_INFO.register_fields([('flavorId', NV2080_CTRL_GC6_FLAVOR_ID, 0), ('stepMask', NvU32, 4)]) +NV2080_CTRL_GC6_FLAVOR_INFO: TypeAlias = struct_NV2080_CTRL_GC6_FLAVOR_INFO +@c.record +class struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS(c.Struct): + SIZE = 32 + hChannel: int + virtAddress: int + bufferPtr: ctypes.c_void_p + bufferSize: int +struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS.register_fields([('hChannel', NvHandle, 0), ('virtAddress', NvU64, 8), ('bufferPtr', NvP64, 16), ('bufferSize', NvU32, 24)]) +NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS(c.Struct): + SIZE = 4 + errorCount: int +struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS.register_fields([('errorCount', NvU32, 0)]) +NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS(c.Struct): + SIZE = 8200 + whichBuffer: int + outputRecordSize: int + recordBuffer: c.Array[ctypes.c_ubyte, Literal[8192]] +struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS.register_fields([('whichBuffer', NvU32, 0), ('outputRecordSize', NvU32, 4), ('recordBuffer', c.Array[NvU8, Literal[8192]], 8)]) +NV2080_CTRL_RC_GET_ERROR_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_ERROR_V2_PARAMS +@c.record +class struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS(c.Struct): + SIZE = 4 + watchdogStatusFlags: int +struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS.register_fields([('watchdogStatusFlags', NvU32, 0)]) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS(c.Struct): + SIZE = 4 + rcEnable: int +struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS.register_fields([('rcEnable', NvU32, 0)]) +NV2080_CTRL_CMD_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +NV2080_CTRL_SET_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +NV2080_CTRL_GET_RC_RECOVERY_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_RECOVERY_PARAMS +@c.record +class struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS(c.Struct): + SIZE = 8 + cmd: int + status: int +struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS.register_fields([('cmd', NvU32, 0), ('status', NvS32, 4)]) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_RC_INFO_PARAMS(c.Struct): + SIZE = 8 + rcMode: int + rcBreak: int +struct_NV2080_CTRL_CMD_RC_INFO_PARAMS.register_fields([('rcMode', NvU32, 0), ('rcBreak', NvU32, 4)]) +NV2080_CTRL_CMD_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +NV2080_CTRL_SET_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +NV2080_CTRL_GET_RC_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_RC_WATCHDOG_INFO_PARAMS(c.Struct): + SIZE = 24 + channelTestInterval: int + thwapChannelMask: int + stompChannelMask: int + thwapRepeatMask: int + stompRepeatMask: int + allocFailMask: int +struct_NV2080_CTRL_CMD_RC_WATCHDOG_INFO_PARAMS.register_fields([('channelTestInterval', NvU32, 0), ('thwapChannelMask', NvU32, 4), ('stompChannelMask', NvU32, 8), ('thwapRepeatMask', NvU32, 12), ('stompRepeatMask', NvU32, 16), ('allocFailMask', NvU32, 20)]) +NV2080_CTRL_CMD_RC_WATCHDOG_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_WATCHDOG_INFO_PARAMS +NV2080_CTRL_SET_RC_WATCHDOG_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_WATCHDOG_INFO_PARAMS +NV2080_CTRL_GET_RC_WATCHDOG_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_RC_WATCHDOG_INFO_PARAMS +@c.record +class struct_RM_GSP_SPDM_CMD_CC_INIT(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_INIT.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_INIT: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_INIT +PRM_GSP_SPDM_CMD_CC_INIT: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_INIT] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_DEINIT(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_DEINIT.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_DEINIT: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_DEINIT +PRM_GSP_SPDM_CMD_CC_DEINIT: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_DEINIT] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_CTRL(c.Struct): + SIZE = 1 + cmdType: int +struct_RM_GSP_SPDM_CMD_CC_CTRL.register_fields([('cmdType', NvU8, 0)]) +RM_GSP_SPDM_CMD_CC_CTRL: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_CTRL +PRM_GSP_SPDM_CMD_CC_CTRL: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_CTRL] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA(c.Struct): + SIZE = 68 + cmdType: int + rsvd0: c.Array[ctypes.c_uint32, Literal[2]] + rsvd1: int + rsvd2: c.Array[ctypes.c_char, Literal[9]] + rsvd3: c.Array[ctypes.c_char, Literal[5]] + rsvd4: c.Array[ctypes.c_char, Literal[5]] + rsvd5: c.Array[ctypes.c_char, Literal[5]] + rsvd6: c.Array[ctypes.c_char, Literal[2]] + rsvd7: c.Array[ctypes.c_char, Literal[16]] + rsvd8: c.Array[ctypes.c_uint32, Literal[2]] +struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA.register_fields([('cmdType', NvU8, 0), ('rsvd0', c.Array[NvU32, Literal[2]], 4), ('rsvd1', NvU32, 12), ('rsvd2', c.Array[ctypes.c_char, Literal[9]], 16), ('rsvd3', c.Array[ctypes.c_char, Literal[5]], 25), ('rsvd4', c.Array[ctypes.c_char, Literal[5]], 30), ('rsvd5', c.Array[ctypes.c_char, Literal[5]], 35), ('rsvd6', c.Array[ctypes.c_char, Literal[2]], 40), ('rsvd7', c.Array[ctypes.c_char, Literal[16]], 42), ('rsvd8', c.Array[NvU32, Literal[2]], 60)]) +RM_GSP_SPDM_CMD_CC_INIT_RM_DATA: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA +PRM_GSP_SPDM_CMD_CC_INIT_RM_DATA: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA] +@c.record +class struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL(c.Struct): + SIZE = 2 + cmdType: int + bEnable: int +struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL.register_fields([('cmdType', NvU8, 0), ('bEnable', NvBool, 1)]) +RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL: TypeAlias = struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL +PRM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL] +@c.record +class struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST(c.Struct): + SIZE = 160 + cmdType: int + isEnc: int + kmb: struct_CC_KMB + text: c.Array[ctypes.c_ubyte, Literal[16]] + authTag: c.Array[ctypes.c_ubyte, Literal[16]] +@c.record +class struct_CC_KMB(c.Struct): + SIZE = 124 + encryptBundle: struct_CC_AES_CRYPTOBUNDLE + hmacBundle: struct_CC_HMAC_CRYPTOBUNDLE + decryptBundle: struct_CC_AES_CRYPTOBUNDLE + bIsWorkLaunch: int +CC_KMB: TypeAlias = struct_CC_KMB +@c.record +class struct_CC_AES_CRYPTOBUNDLE(c.Struct): + SIZE = 56 + iv: c.Array[ctypes.c_uint32, Literal[3]] + key: c.Array[ctypes.c_uint32, Literal[8]] + ivMask: c.Array[ctypes.c_uint32, Literal[3]] +CC_AES_CRYPTOBUNDLE: TypeAlias = struct_CC_AES_CRYPTOBUNDLE +struct_CC_AES_CRYPTOBUNDLE.register_fields([('iv', c.Array[NvU32, Literal[3]], 0), ('key', c.Array[NvU32, Literal[8]], 12), ('ivMask', c.Array[NvU32, Literal[3]], 44)]) +@c.record +class struct_CC_HMAC_CRYPTOBUNDLE(c.Struct): + SIZE = 64 + nonce: c.Array[ctypes.c_uint32, Literal[8]] + key: c.Array[ctypes.c_uint32, Literal[8]] +CC_HMAC_CRYPTOBUNDLE: TypeAlias = struct_CC_HMAC_CRYPTOBUNDLE +struct_CC_HMAC_CRYPTOBUNDLE.register_fields([('nonce', c.Array[NvU32, Literal[8]], 0), ('key', c.Array[NvU32, Literal[8]], 32)]) +struct_CC_KMB.register_fields([('encryptBundle', CC_AES_CRYPTOBUNDLE, 0), ('hmacBundle', CC_HMAC_CRYPTOBUNDLE, 56), ('decryptBundle', CC_AES_CRYPTOBUNDLE, 56), ('bIsWorkLaunch', NvBool, 120)]) +struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST.register_fields([('cmdType', NvU8, 0), ('isEnc', NvU8, 1), ('kmb', CC_KMB, 4), ('text', c.Array[NvU8, Literal[16]], 128), ('authTag', c.Array[NvU8, Literal[16]], 144)]) +RM_GSP_SPDM_CMD_FIPS_SELFTEST: TypeAlias = struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST +PRM_GSP_SPDM_CMD_FIPS_SELFTEST: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST] +@c.record +class union_RM_GSP_SPDM_CMD(c.Struct): + SIZE = 160 + cmdType: int + ccInit: struct_RM_GSP_SPDM_CMD_CC_INIT + ccDeinit: struct_RM_GSP_SPDM_CMD_CC_DEINIT + ccCtrl: struct_RM_GSP_SPDM_CMD_CC_CTRL + rmDataInitCmd: struct_RM_GSP_SPDM_CMD_CC_INIT_RM_DATA + ccHeartbeatCtrl: struct_RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL + ccFipsTest: struct_RM_GSP_SPDM_CMD_FIPS_SELFTEST +union_RM_GSP_SPDM_CMD.register_fields([('cmdType', NvU8, 0), ('ccInit', RM_GSP_SPDM_CMD_CC_INIT, 0), ('ccDeinit', RM_GSP_SPDM_CMD_CC_DEINIT, 0), ('ccCtrl', RM_GSP_SPDM_CMD_CC_CTRL, 0), ('rmDataInitCmd', RM_GSP_SPDM_CMD_CC_INIT_RM_DATA, 0), ('ccHeartbeatCtrl', RM_GSP_SPDM_CMD_CC_HEARTBEAT_CTRL, 0), ('ccFipsTest', RM_GSP_SPDM_CMD_FIPS_SELFTEST, 0)]) +RM_GSP_SPDM_CMD: TypeAlias = union_RM_GSP_SPDM_CMD +PRM_GSP_SPDM_CMD: TypeAlias = c.POINTER[union_RM_GSP_SPDM_CMD] +@c.record +class struct_RM_GSP_SPDM_MSG(c.Struct): + SIZE = 28 + msgType: int + status: int + rsvd1: int + rsvd2: int + rsvd3: int + rsvd4: int + rsvd5: int +struct_RM_GSP_SPDM_MSG.register_fields([('msgType', NvU8, 0), ('status', NvU32, 4), ('rsvd1', NvU32, 8), ('rsvd2', NvU32, 12), ('rsvd3', NvU32, 16), ('rsvd4', NvU32, 20), ('rsvd5', NvU32, 24)]) +RM_GSP_SPDM_MSG: TypeAlias = struct_RM_GSP_SPDM_MSG +PRM_GSP_SPDM_MSG: TypeAlias = c.POINTER[struct_RM_GSP_SPDM_MSG] +@c.record +class struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS(c.Struct): + SIZE = 192 + index: int + cmd: union_RM_GSP_SPDM_CMD + msg: struct_RM_GSP_SPDM_MSG +struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS.register_fields([('index', NvU8, 0), ('cmd', RM_GSP_SPDM_CMD, 4), ('msg', RM_GSP_SPDM_MSG, 164)]) +NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS +@c.record +class struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS(c.Struct): + SIZE = 9220 + transcript: c.Array[ctypes.c_ubyte, Literal[9216]] + transcriptSize: int +struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS.register_fields([('transcript', c.Array[NvU8, Literal[9216]], 0), ('transcriptSize', NvU32, 9216)]) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS: TypeAlias = struct_NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS(c.Struct): + SIZE = 4 + availableTargets: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS.register_fields([('availableTargets', NvU32, 0)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS(c.Struct): + SIZE = 8 + targetIndex: int + type: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS.register_fields([('targetIndex', NvU32, 0), ('type', NvU32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS(c.Struct): + SIZE = 8 + providerIndex: int + type: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS.register_fields([('providerIndex', NvU32, 0), ('type', NvU32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS(c.Struct): + SIZE = 4 + availableSensors: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS.register_fields([('availableSensors', NvU32, 0)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS(c.Struct): + SIZE = 8 + sensorIndex: int + providerIndex: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS.register_fields([('sensorIndex', NvU32, 0), ('providerIndex', NvU32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS(c.Struct): + SIZE = 8 + sensorIndex: int + value: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS.register_fields([('sensorIndex', NvU32, 0), ('value', NvS32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS(c.Struct): + SIZE = 8 + sensorIndex: int + targetIndex: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS.register_fields([('sensorIndex', NvU32, 0), ('targetIndex', NvU32, 4)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS(c.Struct): + SIZE = 12 + sensorIndex: int + minimum: int + maximum: int +struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS.register_fields([('sensorIndex', NvU32, 0), ('minimum', NvS32, 4), ('maximum', NvS32, 8)]) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS +@c.record +class union_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS(c.Struct): + SIZE = 32 + getInfoTargetsAvailable: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS + getInfoTargetType: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS + getInfoProviderType: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS + getInfoSensorsAvailable: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS + getInfoSensorProvider: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS + getInfoSensorTarget: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS + getInfoSensorReadingRange: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS + getStatusSensorReading: struct_NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS + space: c.Array[ctypes.c_uint32, Literal[8]] +union_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS.register_fields([('getInfoTargetsAvailable', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPERANDS, 0), ('getInfoTargetType', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPERANDS, 0), ('getInfoProviderType', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPERANDS, 0), ('getInfoSensorsAvailable', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPERANDS, 0), ('getInfoSensorProvider', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPERANDS, 0), ('getInfoSensorTarget', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPERANDS, 0), ('getInfoSensorReadingRange', NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPERANDS, 0), ('getStatusSensorReading', NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPERANDS, 0), ('space', c.Array[NvU32, Literal[8]], 0)]) +NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS: TypeAlias = union_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION(c.Struct): + SIZE = 44 + result: int + executed: int + opcode: int + operands: union_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS +struct_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION.register_fields([('result', NvU32, 0), ('executed', NvU32, 4), ('opcode', NvU32, 8), ('operands', NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_OPERANDS, 12)]) +NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION +@c.record +class struct_NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS(c.Struct): + SIZE = 1432 + clientAPIVersion: int + clientAPIRevision: int + clientInstructionSizeOf: int + executeFlags: int + successfulInstructions: int + instructionListSize: int + instructionList: c.Array[struct_NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION, Literal[32]] +struct_NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS.register_fields([('clientAPIVersion', NvU32, 0), ('clientAPIRevision', NvU32, 4), ('clientInstructionSizeOf', NvU32, 8), ('executeFlags', NvU32, 12), ('successfulInstructions', NvU32, 16), ('instructionListSize', NvU32, 20), ('instructionList', c.Array[NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION, Literal[32]], 24)]) +NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS: TypeAlias = struct_NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS(c.Struct): + SIZE = 16 + time_nsec: int + flags: int +struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS.register_fields([('time_nsec', NvU64, 0), ('flags', NvU32, 8)]) +NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS(c.Struct): + SIZE = 8 + time_nsec: int +struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS.register_fields([('time_nsec', NvU64, 0)]) +NV2080_CTRL_TIMER_GET_TIME_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_TIME_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS(c.Struct): + SIZE = 4 + tmr_offset: int +struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS.register_fields([('tmr_offset', NvU32, 0)]) +NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS +@c.record +class struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE(c.Struct): + SIZE = 16 + cpuTime: int + gpuTime: int +struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE.register_fields([('cpuTime', NvU64, 0), ('gpuTime', NvU64, 8)]) +NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE: TypeAlias = struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE +@c.record +class struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS(c.Struct): + SIZE = 264 + cpuClkId: int + sampleCount: int + samples: c.Array[struct_NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE, Literal[16]] +struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS.register_fields([('cpuClkId', NvU8, 0), ('sampleCount', NvU8, 1), ('samples', c.Array[NV2080_CTRL_TIMER_GPU_CPU_TIME_SAMPLE, Literal[16]], 8)]) +NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS(c.Struct): + SIZE = 1 + bSetMaxFreq: int +struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS.register_fields([('bSetMaxFreq', NvBool, 0)]) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS.register_fields([('action', NvU32, 0)]) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS.register_fields([('action', NvU32, 0)]) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS(c.Struct): + SIZE = 1 + bEnter: int +struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS.register_fields([('bEnter', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS(c.Struct): + SIZE = 24 + hNotifierResource: int + notifyDataSize: int + hNotifyDataMemory: int + perfmonIdCount: int + snapshotBufferSize: int + hSnapshotMemory: int +struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS.register_fields([('hNotifierResource', NvHandle, 0), ('notifyDataSize', NvU32, 4), ('hNotifyDataMemory', NvHandle, 8), ('perfmonIdCount', NvU32, 12), ('snapshotBufferSize', NvU32, 16), ('hSnapshotMemory', NvHandle, 20)]) +NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS(c.Struct): + SIZE = 1 + bVidmemPersistent: int +struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS.register_fields([('bVidmemPersistent', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS(c.Struct): + SIZE = 1 + bUpdateTGP: int +struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS.register_fields([('bUpdateTGP', NvBool, 0)]) +NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS(c.Struct): + SIZE = 6616 + dbdf: int + gfid: int + vgpuType: int + vmPid: int + swizzId: int + numChannels: int + numPluginChannels: int + chidOffset: c.Array[ctypes.c_uint32, Literal[84]] + bDisableDefaultSmcExecPartRestore: int + numGuestFbSegments: int + guestFbPhysAddrList: c.Array[ctypes.c_uint64, Literal[384]] + guestFbLengthList: c.Array[ctypes.c_uint64, Literal[384]] + pluginHeapMemoryPhysAddr: int + pluginHeapMemoryLength: int + ctrlBuffOffset: int + initTaskLogBuffOffset: int + initTaskLogBuffSize: int + vgpuTaskLogBuffOffset: int + vgpuTaskLogBuffSize: int + kernelLogBuffOffset: int + kernelLogBuffSize: int + migRmHeapMemoryPhysAddr: int + migRmHeapMemoryLength: int + bDeviceProfilingEnabled: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS.register_fields([('dbdf', NvU32, 0), ('gfid', NvU32, 4), ('vgpuType', NvU32, 8), ('vmPid', NvU32, 12), ('swizzId', NvU32, 16), ('numChannels', NvU32, 20), ('numPluginChannels', NvU32, 24), ('chidOffset', c.Array[NvU32, Literal[84]], 28), ('bDisableDefaultSmcExecPartRestore', NvBool, 364), ('numGuestFbSegments', NvU32, 368), ('guestFbPhysAddrList', c.Array[NvU64, Literal[384]], 376), ('guestFbLengthList', c.Array[NvU64, Literal[384]], 3448), ('pluginHeapMemoryPhysAddr', NvU64, 6520), ('pluginHeapMemoryLength', NvU64, 6528), ('ctrlBuffOffset', NvU64, 6536), ('initTaskLogBuffOffset', NvU64, 6544), ('initTaskLogBuffSize', NvU64, 6552), ('vgpuTaskLogBuffOffset', NvU64, 6560), ('vgpuTaskLogBuffSize', NvU64, 6568), ('kernelLogBuffOffset', NvU64, 6576), ('kernelLogBuffSize', NvU64, 6584), ('migRmHeapMemoryPhysAddr', NvU64, 6592), ('migRmHeapMemoryLength', NvU64, 6600), ('bDeviceProfilingEnabled', NvBool, 6608)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS(c.Struct): + SIZE = 694280 + discardVgpuTypes: int + vgpuInfoCount: int + vgpuInfo: c.Array[struct_NVA081_CTRL_VGPU_INFO, Literal[128]] +@c.record +class struct_NVA081_CTRL_VGPU_INFO(c.Struct): + SIZE = 5424 + vgpuType: int + vgpuName: c.Array[ctypes.c_ubyte, Literal[64]] + vgpuClass: c.Array[ctypes.c_ubyte, Literal[64]] + vgpuSignature: c.Array[ctypes.c_ubyte, Literal[128]] + license: c.Array[ctypes.c_ubyte, Literal[128]] + maxInstance: int + numHeads: int + maxResolutionX: int + maxResolutionY: int + maxPixels: int + frlConfig: int + cudaEnabled: int + eccSupported: int + gpuInstanceSize: int + nominalFbRegionSize: int + multiVgpuSupported: int + vdevId: int + pdevId: int + profileSize: int + fbLength: int + gspHeapSize: int + fbReservation: int + mappableVideoSize: int + encoderCapacity: int + bar1Length: int + frlEnable: int + vgpuSsvid: int + adapterName: c.Array[ctypes.c_ubyte, Literal[64]] + adapterName_Unicode: c.Array[ctypes.c_uint16, Literal[64]] + shortGpuNameString: c.Array[ctypes.c_ubyte, Literal[64]] + licensedProductName: c.Array[ctypes.c_ubyte, Literal[128]] + vgpuExtraParams: c.Array[ctypes.c_uint32, Literal[1024]] + ftraceEnable: int + gpuDirectSupported: int + nvlinkP2PSupported: int + maxInstancePerGI: int + multiVgpuExclusive: int + exclusiveType: int + exclusiveSize: int + gpuInstanceProfileId: int + placementSize: int + homogeneousPlacementCount: int + homogeneousPlacementIds: c.Array[ctypes.c_uint32, Literal[48]] + heterogeneousPlacementCount: int + heterogeneousPlacementIds: c.Array[ctypes.c_uint32, Literal[48]] +NVA081_CTRL_VGPU_INFO: TypeAlias = struct_NVA081_CTRL_VGPU_INFO +struct_NVA081_CTRL_VGPU_INFO.register_fields([('vgpuType', NvU32, 0), ('vgpuName', c.Array[NvU8, Literal[64]], 4), ('vgpuClass', c.Array[NvU8, Literal[64]], 68), ('vgpuSignature', c.Array[NvU8, Literal[128]], 132), ('license', c.Array[NvU8, Literal[128]], 260), ('maxInstance', NvU32, 388), ('numHeads', NvU32, 392), ('maxResolutionX', NvU32, 396), ('maxResolutionY', NvU32, 400), ('maxPixels', NvU32, 404), ('frlConfig', NvU32, 408), ('cudaEnabled', NvU32, 412), ('eccSupported', NvU32, 416), ('gpuInstanceSize', NvU32, 420), ('nominalFbRegionSize', NvU32, 424), ('multiVgpuSupported', NvU32, 428), ('vdevId', NvU64, 432), ('pdevId', NvU64, 440), ('profileSize', NvU64, 448), ('fbLength', NvU64, 456), ('gspHeapSize', NvU64, 464), ('fbReservation', NvU64, 472), ('mappableVideoSize', NvU64, 480), ('encoderCapacity', NvU32, 488), ('bar1Length', NvU64, 496), ('frlEnable', NvU32, 504), ('vgpuSsvid', NvU16, 508), ('adapterName', c.Array[NvU8, Literal[64]], 510), ('adapterName_Unicode', c.Array[NvU16, Literal[64]], 574), ('shortGpuNameString', c.Array[NvU8, Literal[64]], 702), ('licensedProductName', c.Array[NvU8, Literal[128]], 766), ('vgpuExtraParams', c.Array[NvU32, Literal[1024]], 896), ('ftraceEnable', NvU32, 4992), ('gpuDirectSupported', NvU32, 4996), ('nvlinkP2PSupported', NvU32, 5000), ('maxInstancePerGI', NvU32, 5004), ('multiVgpuExclusive', NvU32, 5008), ('exclusiveType', NvU32, 5012), ('exclusiveSize', NvU32, 5016), ('gpuInstanceProfileId', NvU32, 5020), ('placementSize', NvU32, 5024), ('homogeneousPlacementCount', NvU32, 5028), ('homogeneousPlacementIds', c.Array[NvU32, Literal[48]], 5032), ('heterogeneousPlacementCount', NvU32, 5224), ('heterogeneousPlacementIds', c.Array[NvU32, Literal[48]], 5228)]) +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS.register_fields([('discardVgpuTypes', NvBool, 0), ('vgpuInfoCount', NvU32, 4), ('vgpuInfo', c.Array[NVA081_CTRL_VGPU_INFO, Literal[128]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS +@c.record +class struct_NV2080_GUEST_VM_INFO(c.Struct): + SIZE = 168 + vmPid: int + guestOs: int + migrationProhibited: int + guestNegotiatedVgpuVersion: int + frameRateLimit: int + licensed: int + licenseState: int + licenseExpiryTimestamp: int + licenseExpiryStatus: int + guestDriverVersion: c.Array[ctypes.c_ubyte, Literal[64]] + guestDriverBranch: c.Array[ctypes.c_ubyte, Literal[64]] + guestVmInfoState: int +enum_GUEST_VM_INFO_STATE: dict[int, str] = {(GUEST_VM_INFO_STATE_UNINITIALIZED:=0): 'GUEST_VM_INFO_STATE_UNINITIALIZED', (GUEST_VM_INFO_STATE_INITIALIZED:=1): 'GUEST_VM_INFO_STATE_INITIALIZED'} +GUEST_VM_INFO_STATE: TypeAlias = ctypes.c_uint32 +struct_NV2080_GUEST_VM_INFO.register_fields([('vmPid', NvU32, 0), ('guestOs', NvU32, 4), ('migrationProhibited', NvU32, 8), ('guestNegotiatedVgpuVersion', NvU32, 12), ('frameRateLimit', NvU32, 16), ('licensed', NvBool, 20), ('licenseState', NvU32, 24), ('licenseExpiryTimestamp', NvU32, 28), ('licenseExpiryStatus', NvU8, 32), ('guestDriverVersion', c.Array[NvU8, Literal[64]], 33), ('guestDriverBranch', c.Array[NvU8, Literal[64]], 97), ('guestVmInfoState', GUEST_VM_INFO_STATE, 164)]) +NV2080_GUEST_VM_INFO: TypeAlias = struct_NV2080_GUEST_VM_INFO +@c.record +class struct_NV2080_HOST_VGPU_DEVICE(c.Struct): + SIZE = 48 + gfid: int + vgpuPciId: int + vgpuDeviceInstanceId: int + accountingPid: int + fbUsed: int + encoderCapacity: int + eccState: int + bDriverLoaded: int +struct_NV2080_HOST_VGPU_DEVICE.register_fields([('gfid', NvU32, 0), ('vgpuPciId', NvU64, 8), ('vgpuDeviceInstanceId', NvU32, 16), ('accountingPid', NvU32, 20), ('fbUsed', NvU64, 24), ('encoderCapacity', NvU32, 32), ('eccState', NvU32, 36), ('bDriverLoaded', NvBool, 40)]) +NV2080_HOST_VGPU_DEVICE: TypeAlias = struct_NV2080_HOST_VGPU_DEVICE +@c.record +class struct_NV2080_VGPU_GUEST(c.Struct): + SIZE = 216 + guestVmInfo: struct_NV2080_GUEST_VM_INFO + vgpuDevice: struct_NV2080_HOST_VGPU_DEVICE +struct_NV2080_VGPU_GUEST.register_fields([('guestVmInfo', NV2080_GUEST_VM_INFO, 0), ('vgpuDevice', NV2080_HOST_VGPU_DEVICE, 168)]) +NV2080_VGPU_GUEST: TypeAlias = struct_NV2080_VGPU_GUEST +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS(c.Struct): + SIZE = 10376 + numVgpu: int + vgpuGuest: c.Array[struct_NV2080_VGPU_GUEST, Literal[48]] +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS.register_fields([('numVgpu', NvU32, 0), ('vgpuGuest', c.Array[NV2080_VGPU_GUEST, Literal[48]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS +@c.record +class struct_NV2080_VGPU_FB_USAGE(c.Struct): + SIZE = 16 + gfid: int + fbUsed: int +struct_NV2080_VGPU_FB_USAGE.register_fields([('gfid', NvU32, 0), ('fbUsed', NvU64, 8)]) +NV2080_VGPU_FB_USAGE: TypeAlias = struct_NV2080_VGPU_FB_USAGE +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS(c.Struct): + SIZE = 776 + vgpuCount: int + vgpuFbUsage: c.Array[struct_NV2080_VGPU_FB_USAGE, Literal[48]] +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS.register_fields([('vgpuCount', NvU32, 0), ('vgpuFbUsage', c.Array[NV2080_VGPU_FB_USAGE, Literal[48]], 8)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS(c.Struct): + SIZE = 8 + gfid: int + encoderCapacity: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS.register_fields([('gfid', NvU32, 0), ('encoderCapacity', NvU32, 4)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS(c.Struct): + SIZE = 4 + gfid: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS.register_fields([('gfid', NvU32, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS(c.Struct): + SIZE = 260 + pgpuString: c.Array[ctypes.c_ubyte, Literal[256]] + pgpuStringSize: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS.register_fields([('pgpuString', c.Array[NvU8, Literal[256]], 0), ('pgpuStringSize', NvU32, 256)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS(c.Struct): + SIZE = 1 + bIsMigrationSupported: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS.register_fields([('bIsMigrationSupported', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS(c.Struct): + SIZE = 1 + bSupportHeterogeneousTimeSlicedVgpuTypes: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS.register_fields([('bSupportHeterogeneousTimeSlicedVgpuTypes', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS(c.Struct): + SIZE = 8 + gfid: int + flags: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS.register_fields([('gfid', NvU32, 0), ('flags', NvU32, 4)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS(c.Struct): + SIZE = 1 + bFlrDisabled: int +struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS.register_fields([('bFlrDisabled', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS(c.Struct): + SIZE = 1 + bHeterogeneousMode: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS.register_fields([('bHeterogeneousMode', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS(c.Struct): + SIZE = 1 + bMigTimeslicingModeEnabled: int +struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS.register_fields([('bMigTimeslicingModeEnabled', NvBool, 0)]) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS: TypeAlias = struct_NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS +@c.record +class struct_NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS(c.Struct): + SIZE = 4 + state: int +struct_NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS.register_fields([('state', NvU32, 0)]) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS: TypeAlias = struct_NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS(c.Struct): + SIZE = 4 + exceptionMask: int +struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS.register_fields([('exceptionMask', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS +@c.record +class struct_NV83DE_SM_ERROR_STATE_REGISTERS(c.Struct): + SIZE = 48 + hwwGlobalEsr: int + hwwWarpEsr: int + hwwWarpEsrPc: int + hwwGlobalEsrReportMask: int + hwwWarpEsrReportMask: int + hwwEsrAddr: int + hwwWarpEsrPc64: int + hwwCgaEsr: int + hwwCgaEsrReportMask: int +struct_NV83DE_SM_ERROR_STATE_REGISTERS.register_fields([('hwwGlobalEsr', NvU32, 0), ('hwwWarpEsr', NvU32, 4), ('hwwWarpEsrPc', NvU32, 8), ('hwwGlobalEsrReportMask', NvU32, 12), ('hwwWarpEsrReportMask', NvU32, 16), ('hwwEsrAddr', NvU64, 24), ('hwwWarpEsrPc64', NvU64, 32), ('hwwCgaEsr', NvU32, 40), ('hwwCgaEsrReportMask', NvU32, 44)]) +NV83DE_SM_ERROR_STATE_REGISTERS: TypeAlias = struct_NV83DE_SM_ERROR_STATE_REGISTERS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS(c.Struct): + SIZE = 56 + hTargetChannel: int + smID: int + smErrorState: struct_NV83DE_SM_ERROR_STATE_REGISTERS +struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('smID', NvU32, 4), ('smErrorState', NV83DE_SM_ERROR_STATE_REGISTERS, 8)]) +NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS +@c.record +class struct_NV83DE_MMU_FAULT_INFO(c.Struct): + SIZE = 8 + valid: int + faultInfo: int +struct_NV83DE_MMU_FAULT_INFO.register_fields([('valid', NvBool, 0), ('faultInfo', NvU32, 4)]) +NV83DE_MMU_FAULT_INFO: TypeAlias = struct_NV83DE_MMU_FAULT_INFO +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS(c.Struct): + SIZE = 4824 + hTargetChannel: int + numSMsToRead: int + smErrorStateArray: c.Array[struct_NV83DE_SM_ERROR_STATE_REGISTERS, Literal[100]] + mmuFaultInfo: int + mmuFault: struct_NV83DE_MMU_FAULT_INFO + startingSM: int +struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('numSMsToRead', NvU32, 4), ('smErrorStateArray', c.Array[NV83DE_SM_ERROR_STATE_REGISTERS, Literal[100]], 8), ('mmuFaultInfo', NvU32, 4808), ('mmuFault', NV83DE_MMU_FAULT_INFO, 4812), ('startingSM', NvU32, 4820)]) +NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS(c.Struct): + SIZE = 8 + hTargetChannel: int + smID: int +struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('smID', NvU32, 4)]) +NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS(c.Struct): + SIZE = 8 + hTargetChannel: int + numSMsToClear: int +struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS.register_fields([('hTargetChannel', NvHandle, 0), ('numSMsToClear', NvU32, 4)]) +NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS +@c.record +class struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS(c.Struct): + SIZE = 8 + waitForEvent: int + hResidentChannel: int +struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS.register_fields([('waitForEvent', NvU32, 0), ('hResidentChannel', NvHandle, 4)]) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS: TypeAlias = struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS(c.Struct): + SIZE = 4 + stopTriggerType: int +struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS.register_fields([('stopTriggerType', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS(c.Struct): + SIZE = 4 + singleStepHandling: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS.register_fields([('singleStepHandling', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS(c.Struct): + SIZE = 24 + hMemory: int + length: int + offset: int + buffer: ctypes.c_void_p +struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS.register_fields([('hMemory', NvU32, 0), ('length', NvU32, 4), ('offset', NvU64, 8), ('buffer', NvP64, 16)]) +NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS(c.Struct): + SIZE = 24 + hMemory: int + length: int + offset: int + buffer: ctypes.c_void_p +struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS.register_fields([('hMemory', NvU32, 0), ('length', NvU32, 4), ('offset', NvU64, 8), ('buffer', NvP64, 16)]) +NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS: TypeAlias = struct_NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS(c.Struct): + SIZE = 8 + hChannel: int + hSubdevice: int +struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS.register_fields([('hChannel', NvHandle, 0), ('hSubdevice', NvHandle, 4)]) +NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_HANDLES_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_OP(c.Struct): + SIZE = 24 + gpuVA: int + pCpuVA: ctypes.c_void_p + size: int + valid: int +struct_NV83DE_CTRL_DEBUG_ACCESS_OP.register_fields([('gpuVA', NvU64, 0), ('pCpuVA', NvP64, 8), ('size', NvU32, 16), ('valid', NvU32, 20)]) +NV83DE_CTRL_DEBUG_ACCESS_OP: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_OP +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS(c.Struct): + SIZE = 1544 + count: int + opsBuffer: c.Array[struct_NV83DE_CTRL_DEBUG_ACCESS_OP, Literal[64]] +struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS.register_fields([('count', NvU32, 0), ('opsBuffer', c.Array[NV83DE_CTRL_DEBUG_ACCESS_OP, Literal[64]], 8)]) +NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_SURFACE_PARAMETERS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP(c.Struct): + SIZE = 16 + gpuVA: int + size: int +struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP.register_fields([('gpuVA', NvU64, 0), ('size', NvU32, 8)]) +NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS(c.Struct): + SIZE = 1048 + vaLo: int + vaHi: int + count: int + hasMore: int + opsBuffer: c.Array[struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP, Literal[64]] +struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS.register_fields([('vaLo', NvU64, 0), ('vaHi', NvU64, 8), ('count', NvU32, 16), ('hasMore', NvU32, 20), ('opsBuffer', c.Array[NV83DE_CTRL_DEBUG_GET_MAPPINGS_OP, Literal[64]], 24)]) +NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MAPPINGS_PARAMETERS +@c.record +class struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 3208 + bNonTransactional: int + regOpCount: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[100]] +struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS.register_fields([('bNonTransactional', NvBool, 0), ('regOpCount', NvU32, 4), ('regOps', c.Array[NV2080_CTRL_GPU_REG_OP, Literal[100]], 8)]) +NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS(c.Struct): + SIZE = 8 + smID: int + bSingleStep: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS.register_fields([('smID', NvU32, 0), ('bSingleStep', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS(c.Struct): + SIZE = 8 + smID: int + bStopTrigger: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS.register_fields([('smID', NvU32, 0), ('bStopTrigger', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS(c.Struct): + SIZE = 8 + smID: int + bRunTrigger: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS.register_fields([('smID', NvU32, 0), ('bRunTrigger', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS(c.Struct): + SIZE = 8 + smID: int + bSkipIdleWarpDetect: int +struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS.register_fields([('smID', NvU32, 0), ('bSkipIdleWarpDetect', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS(c.Struct): + SIZE = 5 + bInTrapMode: int + bCrsFlushDone: int + bRunTriggerInProgress: int + bComputeContext: int + bLockedDown: int +struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS.register_fields([('bInTrapMode', NvBool, 0), ('bCrsFlushDone', NvBool, 1), ('bRunTriggerInProgress', NvBool, 2), ('bComputeContext', NvBool, 3), ('bLockedDown', NvBool, 4)]) +NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS(c.Struct): + SIZE = 12 + smID: int + smDebuggerStatus: struct_NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS +struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS.register_fields([('smID', NvU32, 0), ('smDebuggerStatus', NV83DE_CTRL_DEBUG_SINGLE_SM_DEBUGGER_STATUS, 4)]) +NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY(c.Struct): + SIZE = 24 + hMemory: int + length: int + memOffset: int + dataOffset: int + status: int +struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY.register_fields([('hMemory', NvHandle, 0), ('length', NvU32, 4), ('memOffset', NvU64, 8), ('dataOffset', NvU32, 16), ('status', NV_STATUS, 20)]) +NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY +@c.record +class struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS(c.Struct): + SIZE = 3616 + pData: ctypes.c_void_p + dataLength: int + count: int + entries: c.Array[struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY, Literal[150]] +struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS.register_fields([('pData', NvP64, 0), ('dataLength', NvU32, 8), ('count', NvU32, 12), ('entries', c.Array[NV83DE_CTRL_DEBUG_ACCESS_MEMORY_ENTRY, Literal[150]], 16)]) +NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_ACCESS_MEMORY_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY(c.Struct): + SIZE = 16 + faultAddress: int + faultType: int + accessType: int +struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY.register_fields([('faultAddress', NvU64, 0), ('faultType', NvU32, 8), ('accessType', NvU32, 12)]) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY +@c.record +class struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS(c.Struct): + SIZE = 72 + mmuFaultInfoList: c.Array[struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY, Literal[4]] + count: int +struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS.register_fields([('mmuFaultInfoList', c.Array[NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_ENTRY, Literal[4]], 0), ('count', NvU32, 64)]) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS(c.Struct): + SIZE = 1 + bDropDeferredRc: int +struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS.register_fields([('bDropDeferredRc', NvBool, 0)]) +NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS(c.Struct): + SIZE = 4 + action: int +struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS.register_fields([('action', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS(c.Struct): + SIZE = 4 + value: int +struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS.register_fields([('value', NvU32, 0)]) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_NON_PREEMPTABLE_DEBUGGER_CONTEXT_PARAMS(c.Struct): + SIZE = 1 + state: int +struct_NV83DE_CTRL_DEBUG_SET_NON_PREEMPTABLE_DEBUGGER_CONTEXT_PARAMS.register_fields([('state', NvBool, 0)]) +NV83DE_CTRL_DEBUG_SET_NON_PREEMPTABLE_DEBUGGER_CONTEXT_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_NON_PREEMPTABLE_DEBUGGER_CONTEXT_PARAMS +@c.record +class struct_NV83DE_CTRL_DEBUG_SET_RECOVERY_SUPPRESSION_TIMEOUT_PARAMS(c.Struct): + SIZE = 4 + timeoutSec: int +struct_NV83DE_CTRL_DEBUG_SET_RECOVERY_SUPPRESSION_TIMEOUT_PARAMS.register_fields([('timeoutSec', NvU32, 0)]) +NV83DE_CTRL_DEBUG_SET_RECOVERY_SUPPRESSION_TIMEOUT_PARAMS: TypeAlias = struct_NV83DE_CTRL_DEBUG_SET_RECOVERY_SUPPRESSION_TIMEOUT_PARAMS +@c.record +class struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS(c.Struct): + SIZE = 56 + params: struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS(c.Struct): + SIZE = 56 + hMemPmaBuffer: int + pmaBufferOffset: int + pmaBufferSize: int + hMemPmaBytesAvailable: int + pmaBytesAvailableOffset: int + ctxsw: int + pmaChannelIdx: int + pmaBufferVA: int +NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS +struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS.register_fields([('hMemPmaBuffer', NvHandle, 0), ('pmaBufferOffset', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('hMemPmaBytesAvailable', NvHandle, 24), ('pmaBytesAvailableOffset', NvU64, 32), ('ctxsw', NvBool, 40), ('pmaChannelIdx', NvU32, 44), ('pmaBufferVA', NvU64, 48)]) +struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS.register_fields([('params', NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS, 0)]) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS: TypeAlias = struct_NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS(c.Struct): + SIZE = 8 + pmaChannelIdx: int + bMembytesPollingRequired: int +struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0), ('bMembytesPollingRequired', NvBool, 4)]) +NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 48 + pmaChannelIdx: int + pmaBufferVA: int + pmaBufferSize: int + membytesVA: int + hwpmIBPA: int + hwpmIBAperture: int +struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0), ('pmaBufferVA', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('membytesVA', NvU64, 24), ('hwpmIBPA', NvU64, 32), ('hwpmIBAperture', NvU8, 40)]) +NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS(c.Struct): + SIZE = 7 + bAdminProfilingPermitted: int + bDevProfilingPermitted: int + bDevTracePermitted: int + bCtxProfilingPermitted: int + bVideoMemoryProfilingPermitted: int + bSysMemoryProfilingPermitted: int + bAsyncCeProfilingPermitted: int +struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS.register_fields([('bAdminProfilingPermitted', NvBool, 0), ('bDevProfilingPermitted', NvBool, 1), ('bDevTracePermitted', NvBool, 2), ('bCtxProfilingPermitted', NvBool, 3), ('bVideoMemoryProfilingPermitted', NvBool, 4), ('bSysMemoryProfilingPermitted', NvBool, 5), ('bAsyncCeProfilingPermitted', NvBool, 6)]) +NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS(c.Struct): + SIZE = 64 + hMemPmaBuffer: int + pmaBufferOffset: int + pmaBufferSize: int + hMemPmaBytesAvailable: int + pmaBytesAvailableOffset: int + ctxsw: int + pmaChannelIdx: int + pmaBufferVA: int + bInputPmaChIdx: int +struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS.register_fields([('hMemPmaBuffer', NvHandle, 0), ('pmaBufferOffset', NvU64, 8), ('pmaBufferSize', NvU64, 16), ('hMemPmaBytesAvailable', NvHandle, 24), ('pmaBytesAvailableOffset', NvU64, 32), ('ctxsw', NvBool, 40), ('pmaChannelIdx', NvU32, 44), ('pmaBufferVA', NvU64, 48), ('bInputPmaChIdx', NvBool, 56)]) +NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 4 + pmaChannelIdx: int +struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0)]) +NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS(c.Struct): + SIZE = 4 + maxPmaChannels: int +struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS.register_fields([('maxPmaChannels', NvU32, 0)]) +NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS +@c.record +class struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS: TypeAlias = struct_NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS +@c.record +class struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS(c.Struct): + SIZE = 12 + globalStatus: int + controlMask: int + statusMask: int +struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS.register_fields([('globalStatus', NvU32, 0), ('controlMask', NvU32, 4), ('statusMask', NvU32, 8)]) +NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS +@c.record +class struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS(c.Struct): + SIZE = 4 + controlMask: int +struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS.register_fields([('controlMask', NvU32, 0)]) +NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS +@c.record +class struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS(c.Struct): + SIZE = 4 + pmaChannelIdx: int +struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS.register_fields([('pmaChannelIdx', NvU32, 0)]) +NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS: TypeAlias = struct_NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS(c.Struct): + SIZE = 48 + bytesConsumed: int + bUpdateAvailableBytes: int + bWait: int + bytesAvailable: int + bReturnPut: int + putPtr: int + pmaChannelIdx: int + bOverflowStatus: int +struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS.register_fields([('bytesConsumed', NvU64, 0), ('bUpdateAvailableBytes', NvBool, 8), ('bWait', NvBool, 9), ('bytesAvailable', NvU64, 16), ('bReturnPut', NvBool, 24), ('putPtr', NvU64, 32), ('pmaChannelIdx', NvU32, 40), ('bOverflowStatus', NvBool, 44)]) +NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS +NVB0CC_GPU_REG_OP: TypeAlias = struct_NV2080_CTRL_GPU_REG_OP +enum_NVB0CC_REGOPS_MODE: dict[int, str] = {(NVB0CC_REGOPS_MODE_ALL_OR_NONE:=0): 'NVB0CC_REGOPS_MODE_ALL_OR_NONE', (NVB0CC_REGOPS_MODE_CONTINUE_ON_ERROR:=1): 'NVB0CC_REGOPS_MODE_CONTINUE_ON_ERROR'} +NVB0CC_REGOPS_MODE: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS(c.Struct): + SIZE = 3980 + regOpCount: int + mode: int + bPassed: int + bDirect: int + regOps: c.Array[struct_NV2080_CTRL_GPU_REG_OP, Literal[124]] +struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS.register_fields([('regOpCount', NvU32, 0), ('mode', NVB0CC_REGOPS_MODE, 4), ('bPassed', NvBool, 8), ('bDirect', NvBool, 9), ('regOps', c.Array[NVB0CC_GPU_REG_OP, Literal[124]], 12)]) +NVB0CC_CTRL_EXEC_REG_OPS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS +@c.record +class struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS(c.Struct): + SIZE = 4 + numCredits: int +struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS.register_fields([('numCredits', NvU32, 0)]) +NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS +enum_NVB0CC_CHIPLET_TYPE: dict[int, str] = {(NVB0CC_CHIPLET_TYPE_INVALID:=0): 'NVB0CC_CHIPLET_TYPE_INVALID', (NVB0CC_CHIPLET_TYPE_FBP:=1): 'NVB0CC_CHIPLET_TYPE_FBP', (NVB0CC_CHIPLET_TYPE_GPC:=2): 'NVB0CC_CHIPLET_TYPE_GPC', (NVB0CC_CHIPLET_TYPE_SYS:=3): 'NVB0CC_CHIPLET_TYPE_SYS', (NVB0CC_CHIPLET_TYPE_IODN:=4): 'NVB0CC_CHIPLET_TYPE_IODN', (NVB0CC_CHIPLET_TYPE_IODS:=5): 'NVB0CC_CHIPLET_TYPE_IODS'} +NVB0CC_CHIPLET_TYPE: TypeAlias = ctypes.c_uint32 +enum_NVB0CC_HS_CREDITS_CMD_STATUS: dict[int, str] = {(NVB0CC_HS_CREDITS_CMD_STATUS_OK:=0): 'NVB0CC_HS_CREDITS_CMD_STATUS_OK', (NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CREDITS:=1): 'NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CREDITS', (NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CHIPLET:=2): 'NVB0CC_HS_CREDITS_CMD_STATUS_INVALID_CHIPLET'} +NVB0CC_HS_CREDITS_CMD_STATUS: TypeAlias = ctypes.c_uint32 +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO(c.Struct): + SIZE = 4 + chipletType: int + chipletIndex: int + numCredits: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO.register_fields([('chipletType', NvU8, 0), ('chipletIndex', NvU8, 1), ('numCredits', NvU16, 2)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS(c.Struct): + SIZE = 2 + status: int + entryIndex: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS.register_fields([('status', NvU8, 0), ('entryIndex', NvU8, 1)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS +@c.record +class struct_NVB0CC_CTRL_HS_CREDITS_PARAMS(c.Struct): + SIZE = 256 + pmaChannelIdx: int + numEntries: int + statusInfo: struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS + creditInfo: c.Array[struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO, Literal[63]] +struct_NVB0CC_CTRL_HS_CREDITS_PARAMS.register_fields([('pmaChannelIdx', NvU8, 0), ('numEntries', NvU8, 1), ('statusInfo', NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS, 2), ('creditInfo', c.Array[NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO, Literal[63]], 4)]) +NVB0CC_CTRL_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +NVB0CC_CTRL_SET_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +NVB0CC_CTRL_GET_HS_CREDITS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_HS_CREDITS_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_TPC_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_HES_TPC_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_HES_TPC_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_TPC_PARAMS +@c.record +class union_NVB0CC_CTRL_HES_RESERVATION_UNION(c.Struct): + SIZE = 1 + cwd: struct_NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS + tpc: struct_NVB0CC_CTRL_RESERVE_HES_TPC_PARAMS +union_NVB0CC_CTRL_HES_RESERVATION_UNION.register_fields([('cwd', NVB0CC_CTRL_RESERVE_HES_CWD_PARAMS, 0), ('tpc', NVB0CC_CTRL_RESERVE_HES_TPC_PARAMS, 0)]) +NVB0CC_CTRL_HES_RESERVATION_UNION: TypeAlias = union_NVB0CC_CTRL_HES_RESERVATION_UNION +@c.record +class struct_NVB0CC_CTRL_RESERVE_HES_PARAMS(c.Struct): + SIZE = 8 + type: int + reserveParams: union_NVB0CC_CTRL_HES_RESERVATION_UNION +struct_NVB0CC_CTRL_RESERVE_HES_PARAMS.register_fields([('type', NvU32, 0), ('reserveParams', NVB0CC_CTRL_HES_RESERVATION_UNION, 4)]) +NVB0CC_CTRL_RESERVE_HES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_HES_PARAMS +@c.record +class struct_NVB0CC_CTRL_RELEASE_HES_PARAMS(c.Struct): + SIZE = 4 + type: int +struct_NVB0CC_CTRL_RELEASE_HES_PARAMS.register_fields([('type', NvU32, 0)]) +NVB0CC_CTRL_RELEASE_HES_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RELEASE_HES_PARAMS +@c.record +class struct_NVB0CC_CTRL_CREDIT_POOL_INFO(c.Struct): + SIZE = 4 + numCredits: int + poolIndex: int + chipletType: int +struct_NVB0CC_CTRL_CREDIT_POOL_INFO.register_fields([('numCredits', NvU16, 0), ('poolIndex', NvU8, 2), ('chipletType', NvU8, 3)]) +NVB0CC_CTRL_CREDIT_POOL_INFO: TypeAlias = struct_NVB0CC_CTRL_CREDIT_POOL_INFO +@c.record +class struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL(c.Struct): + SIZE = 124 + poolInfos: c.Array[struct_NVB0CC_CTRL_CREDIT_POOL_INFO, Literal[30]] + poolInfosCount: int +struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL.register_fields([('poolInfos', c.Array[NVB0CC_CTRL_CREDIT_POOL_INFO, Literal[30]], 0), ('poolInfosCount', NvU32, 120)]) +NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL: TypeAlias = struct_NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL +@c.record +class struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO(c.Struct): + SIZE = 3 + chipletType: int + chipletIndex: int + poolIndex: int +struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO.register_fields([('chipletType', NvU8, 0), ('chipletIndex', NvU8, 1), ('poolIndex', NvU8, 2)]) +NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO: TypeAlias = struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO +@c.record +class struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS(c.Struct): + SIZE = 194 + numQueries: int + statusInfo: struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS + queries: c.Array[struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO, Literal[63]] +struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS.register_fields([('numQueries', NvU16, 0), ('statusInfo', NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_STATUS, 2), ('queries', c.Array[NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_MAPPING_INFO, Literal[63]], 4)]) +NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS +@c.record +class struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS(c.Struct): + SIZE = 1 + disable: int +struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS.register_fields([('disable', NvBool, 0)]) +NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS: TypeAlias = struct_NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS +@c.record +class struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS(c.Struct): + SIZE = 1 + enabled: int +struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS.register_fields([('enabled', NvBool, 0)]) +NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS: TypeAlias = struct_NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS +@c.record +class struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS(c.Struct): + SIZE = 1 + ctxsw: int +struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS.register_fields([('ctxsw', NvBool, 0)]) +NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS: TypeAlias = struct_NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS +nv_status_codes: dict[int, str] = {(NV_OK:=0): 'NV_OK', (NV_ERR_GENERIC:=65535): 'NV_ERR_GENERIC', (NV_ERR_BROKEN_FB:=1): 'NV_ERR_BROKEN_FB', (NV_ERR_BUFFER_TOO_SMALL:=2): 'NV_ERR_BUFFER_TOO_SMALL', (NV_ERR_BUSY_RETRY:=3): 'NV_ERR_BUSY_RETRY', (NV_ERR_CALLBACK_NOT_SCHEDULED:=4): 'NV_ERR_CALLBACK_NOT_SCHEDULED', (NV_ERR_CARD_NOT_PRESENT:=5): 'NV_ERR_CARD_NOT_PRESENT', (NV_ERR_CYCLE_DETECTED:=6): 'NV_ERR_CYCLE_DETECTED', (NV_ERR_DMA_IN_USE:=7): 'NV_ERR_DMA_IN_USE', (NV_ERR_DMA_MEM_NOT_LOCKED:=8): 'NV_ERR_DMA_MEM_NOT_LOCKED', (NV_ERR_DMA_MEM_NOT_UNLOCKED:=9): 'NV_ERR_DMA_MEM_NOT_UNLOCKED', (NV_ERR_DUAL_LINK_INUSE:=10): 'NV_ERR_DUAL_LINK_INUSE', (NV_ERR_ECC_ERROR:=11): 'NV_ERR_ECC_ERROR', (NV_ERR_FIFO_BAD_ACCESS:=12): 'NV_ERR_FIFO_BAD_ACCESS', (NV_ERR_FREQ_NOT_SUPPORTED:=13): 'NV_ERR_FREQ_NOT_SUPPORTED', (NV_ERR_GPU_DMA_NOT_INITIALIZED:=14): 'NV_ERR_GPU_DMA_NOT_INITIALIZED', (NV_ERR_GPU_IS_LOST:=15): 'NV_ERR_GPU_IS_LOST', (NV_ERR_GPU_IN_FULLCHIP_RESET:=16): 'NV_ERR_GPU_IN_FULLCHIP_RESET', (NV_ERR_GPU_NOT_FULL_POWER:=17): 'NV_ERR_GPU_NOT_FULL_POWER', (NV_ERR_GPU_UUID_NOT_FOUND:=18): 'NV_ERR_GPU_UUID_NOT_FOUND', (NV_ERR_HOT_SWITCH:=19): 'NV_ERR_HOT_SWITCH', (NV_ERR_I2C_ERROR:=20): 'NV_ERR_I2C_ERROR', (NV_ERR_I2C_SPEED_TOO_HIGH:=21): 'NV_ERR_I2C_SPEED_TOO_HIGH', (NV_ERR_ILLEGAL_ACTION:=22): 'NV_ERR_ILLEGAL_ACTION', (NV_ERR_IN_USE:=23): 'NV_ERR_IN_USE', (NV_ERR_INFLATE_COMPRESSED_DATA_FAILED:=24): 'NV_ERR_INFLATE_COMPRESSED_DATA_FAILED', (NV_ERR_INSERT_DUPLICATE_NAME:=25): 'NV_ERR_INSERT_DUPLICATE_NAME', (NV_ERR_INSUFFICIENT_RESOURCES:=26): 'NV_ERR_INSUFFICIENT_RESOURCES', (NV_ERR_INSUFFICIENT_PERMISSIONS:=27): 'NV_ERR_INSUFFICIENT_PERMISSIONS', (NV_ERR_INSUFFICIENT_POWER:=28): 'NV_ERR_INSUFFICIENT_POWER', (NV_ERR_INVALID_ACCESS_TYPE:=29): 'NV_ERR_INVALID_ACCESS_TYPE', (NV_ERR_INVALID_ADDRESS:=30): 'NV_ERR_INVALID_ADDRESS', (NV_ERR_INVALID_ARGUMENT:=31): 'NV_ERR_INVALID_ARGUMENT', (NV_ERR_INVALID_BASE:=32): 'NV_ERR_INVALID_BASE', (NV_ERR_INVALID_CHANNEL:=33): 'NV_ERR_INVALID_CHANNEL', (NV_ERR_INVALID_CLASS:=34): 'NV_ERR_INVALID_CLASS', (NV_ERR_INVALID_CLIENT:=35): 'NV_ERR_INVALID_CLIENT', (NV_ERR_INVALID_COMMAND:=36): 'NV_ERR_INVALID_COMMAND', (NV_ERR_INVALID_DATA:=37): 'NV_ERR_INVALID_DATA', (NV_ERR_INVALID_DEVICE:=38): 'NV_ERR_INVALID_DEVICE', (NV_ERR_INVALID_DMA_SPECIFIER:=39): 'NV_ERR_INVALID_DMA_SPECIFIER', (NV_ERR_INVALID_EVENT:=40): 'NV_ERR_INVALID_EVENT', (NV_ERR_INVALID_FLAGS:=41): 'NV_ERR_INVALID_FLAGS', (NV_ERR_INVALID_FUNCTION:=42): 'NV_ERR_INVALID_FUNCTION', (NV_ERR_INVALID_HEAP:=43): 'NV_ERR_INVALID_HEAP', (NV_ERR_INVALID_INDEX:=44): 'NV_ERR_INVALID_INDEX', (NV_ERR_INVALID_IRQ_LEVEL:=45): 'NV_ERR_INVALID_IRQ_LEVEL', (NV_ERR_INVALID_LIMIT:=46): 'NV_ERR_INVALID_LIMIT', (NV_ERR_INVALID_LOCK_STATE:=47): 'NV_ERR_INVALID_LOCK_STATE', (NV_ERR_INVALID_METHOD:=48): 'NV_ERR_INVALID_METHOD', (NV_ERR_INVALID_OBJECT:=49): 'NV_ERR_INVALID_OBJECT', (NV_ERR_INVALID_OBJECT_BUFFER:=50): 'NV_ERR_INVALID_OBJECT_BUFFER', (NV_ERR_INVALID_OBJECT_HANDLE:=51): 'NV_ERR_INVALID_OBJECT_HANDLE', (NV_ERR_INVALID_OBJECT_NEW:=52): 'NV_ERR_INVALID_OBJECT_NEW', (NV_ERR_INVALID_OBJECT_OLD:=53): 'NV_ERR_INVALID_OBJECT_OLD', (NV_ERR_INVALID_OBJECT_PARENT:=54): 'NV_ERR_INVALID_OBJECT_PARENT', (NV_ERR_INVALID_OFFSET:=55): 'NV_ERR_INVALID_OFFSET', (NV_ERR_INVALID_OPERATION:=56): 'NV_ERR_INVALID_OPERATION', (NV_ERR_INVALID_OWNER:=57): 'NV_ERR_INVALID_OWNER', (NV_ERR_INVALID_PARAM_STRUCT:=58): 'NV_ERR_INVALID_PARAM_STRUCT', (NV_ERR_INVALID_PARAMETER:=59): 'NV_ERR_INVALID_PARAMETER', (NV_ERR_INVALID_PATH:=60): 'NV_ERR_INVALID_PATH', (NV_ERR_INVALID_POINTER:=61): 'NV_ERR_INVALID_POINTER', (NV_ERR_INVALID_REGISTRY_KEY:=62): 'NV_ERR_INVALID_REGISTRY_KEY', (NV_ERR_INVALID_REQUEST:=63): 'NV_ERR_INVALID_REQUEST', (NV_ERR_INVALID_STATE:=64): 'NV_ERR_INVALID_STATE', (NV_ERR_INVALID_STRING_LENGTH:=65): 'NV_ERR_INVALID_STRING_LENGTH', (NV_ERR_INVALID_READ:=66): 'NV_ERR_INVALID_READ', (NV_ERR_INVALID_WRITE:=67): 'NV_ERR_INVALID_WRITE', (NV_ERR_INVALID_XLATE:=68): 'NV_ERR_INVALID_XLATE', (NV_ERR_IRQ_NOT_FIRING:=69): 'NV_ERR_IRQ_NOT_FIRING', (NV_ERR_IRQ_EDGE_TRIGGERED:=70): 'NV_ERR_IRQ_EDGE_TRIGGERED', (NV_ERR_MEMORY_TRAINING_FAILED:=71): 'NV_ERR_MEMORY_TRAINING_FAILED', (NV_ERR_MISMATCHED_SLAVE:=72): 'NV_ERR_MISMATCHED_SLAVE', (NV_ERR_MISMATCHED_TARGET:=73): 'NV_ERR_MISMATCHED_TARGET', (NV_ERR_MISSING_TABLE_ENTRY:=74): 'NV_ERR_MISSING_TABLE_ENTRY', (NV_ERR_MODULE_LOAD_FAILED:=75): 'NV_ERR_MODULE_LOAD_FAILED', (NV_ERR_MORE_DATA_AVAILABLE:=76): 'NV_ERR_MORE_DATA_AVAILABLE', (NV_ERR_MORE_PROCESSING_REQUIRED:=77): 'NV_ERR_MORE_PROCESSING_REQUIRED', (NV_ERR_MULTIPLE_MEMORY_TYPES:=78): 'NV_ERR_MULTIPLE_MEMORY_TYPES', (NV_ERR_NO_FREE_FIFOS:=79): 'NV_ERR_NO_FREE_FIFOS', (NV_ERR_NO_INTR_PENDING:=80): 'NV_ERR_NO_INTR_PENDING', (NV_ERR_NO_MEMORY:=81): 'NV_ERR_NO_MEMORY', (NV_ERR_NO_SUCH_DOMAIN:=82): 'NV_ERR_NO_SUCH_DOMAIN', (NV_ERR_NO_VALID_PATH:=83): 'NV_ERR_NO_VALID_PATH', (NV_ERR_NOT_COMPATIBLE:=84): 'NV_ERR_NOT_COMPATIBLE', (NV_ERR_NOT_READY:=85): 'NV_ERR_NOT_READY', (NV_ERR_NOT_SUPPORTED:=86): 'NV_ERR_NOT_SUPPORTED', (NV_ERR_OBJECT_NOT_FOUND:=87): 'NV_ERR_OBJECT_NOT_FOUND', (NV_ERR_OBJECT_TYPE_MISMATCH:=88): 'NV_ERR_OBJECT_TYPE_MISMATCH', (NV_ERR_OPERATING_SYSTEM:=89): 'NV_ERR_OPERATING_SYSTEM', (NV_ERR_OTHER_DEVICE_FOUND:=90): 'NV_ERR_OTHER_DEVICE_FOUND', (NV_ERR_OUT_OF_RANGE:=91): 'NV_ERR_OUT_OF_RANGE', (NV_ERR_OVERLAPPING_UVM_COMMIT:=92): 'NV_ERR_OVERLAPPING_UVM_COMMIT', (NV_ERR_PAGE_TABLE_NOT_AVAIL:=93): 'NV_ERR_PAGE_TABLE_NOT_AVAIL', (NV_ERR_PID_NOT_FOUND:=94): 'NV_ERR_PID_NOT_FOUND', (NV_ERR_PROTECTION_FAULT:=95): 'NV_ERR_PROTECTION_FAULT', (NV_ERR_RC_ERROR:=96): 'NV_ERR_RC_ERROR', (NV_ERR_REJECTED_VBIOS:=97): 'NV_ERR_REJECTED_VBIOS', (NV_ERR_RESET_REQUIRED:=98): 'NV_ERR_RESET_REQUIRED', (NV_ERR_STATE_IN_USE:=99): 'NV_ERR_STATE_IN_USE', (NV_ERR_SIGNAL_PENDING:=100): 'NV_ERR_SIGNAL_PENDING', (NV_ERR_TIMEOUT:=101): 'NV_ERR_TIMEOUT', (NV_ERR_TIMEOUT_RETRY:=102): 'NV_ERR_TIMEOUT_RETRY', (NV_ERR_TOO_MANY_PRIMARIES:=103): 'NV_ERR_TOO_MANY_PRIMARIES', (NV_ERR_UVM_ADDRESS_IN_USE:=104): 'NV_ERR_UVM_ADDRESS_IN_USE', (NV_ERR_MAX_SESSION_LIMIT_REACHED:=105): 'NV_ERR_MAX_SESSION_LIMIT_REACHED', (NV_ERR_LIB_RM_VERSION_MISMATCH:=106): 'NV_ERR_LIB_RM_VERSION_MISMATCH', (NV_ERR_PRIV_SEC_VIOLATION:=107): 'NV_ERR_PRIV_SEC_VIOLATION', (NV_ERR_GPU_IN_DEBUG_MODE:=108): 'NV_ERR_GPU_IN_DEBUG_MODE', (NV_ERR_FEATURE_NOT_ENABLED:=109): 'NV_ERR_FEATURE_NOT_ENABLED', (NV_ERR_RESOURCE_LOST:=110): 'NV_ERR_RESOURCE_LOST', (NV_ERR_PMU_NOT_READY:=111): 'NV_ERR_PMU_NOT_READY', (NV_ERR_FLCN_ERROR:=112): 'NV_ERR_FLCN_ERROR', (NV_ERR_FATAL_ERROR:=113): 'NV_ERR_FATAL_ERROR', (NV_ERR_MEMORY_ERROR:=114): 'NV_ERR_MEMORY_ERROR', (NV_ERR_INVALID_LICENSE:=115): 'NV_ERR_INVALID_LICENSE', (NV_ERR_NVLINK_INIT_ERROR:=116): 'NV_ERR_NVLINK_INIT_ERROR', (NV_ERR_NVLINK_MINION_ERROR:=117): 'NV_ERR_NVLINK_MINION_ERROR', (NV_ERR_NVLINK_CLOCK_ERROR:=118): 'NV_ERR_NVLINK_CLOCK_ERROR', (NV_ERR_NVLINK_TRAINING_ERROR:=119): 'NV_ERR_NVLINK_TRAINING_ERROR', (NV_ERR_NVLINK_CONFIGURATION_ERROR:=120): 'NV_ERR_NVLINK_CONFIGURATION_ERROR', (NV_ERR_RISCV_ERROR:=121): 'NV_ERR_RISCV_ERROR', (NV_ERR_FABRIC_MANAGER_NOT_PRESENT:=122): 'NV_ERR_FABRIC_MANAGER_NOT_PRESENT', (NV_ERR_ALREADY_SIGNALLED:=123): 'NV_ERR_ALREADY_SIGNALLED', (NV_ERR_QUEUE_TASK_SLOT_NOT_AVAILABLE:=124): 'NV_ERR_QUEUE_TASK_SLOT_NOT_AVAILABLE', (NV_ERR_KEY_ROTATION_IN_PROGRESS:=125): 'NV_ERR_KEY_ROTATION_IN_PROGRESS', (NV_ERR_TEST_ONLY_CODE_NOT_ENABLED:=126): 'NV_ERR_TEST_ONLY_CODE_NOT_ENABLED', (NV_ERR_SECURE_BOOT_FAILED:=127): 'NV_ERR_SECURE_BOOT_FAILED', (NV_ERR_INSUFFICIENT_ZBC_ENTRY:=128): 'NV_ERR_INSUFFICIENT_ZBC_ENTRY', (NV_ERR_NVLINK_FABRIC_NOT_READY:=129): 'NV_ERR_NVLINK_FABRIC_NOT_READY', (NV_ERR_NVLINK_FABRIC_FAILURE:=130): 'NV_ERR_NVLINK_FABRIC_FAILURE', (NV_ERR_GPU_MEMORY_ONLINING_FAILURE:=131): 'NV_ERR_GPU_MEMORY_ONLINING_FAILURE', (NV_ERR_REDUCTION_MANAGER_NOT_AVAILABLE:=132): 'NV_ERR_REDUCTION_MANAGER_NOT_AVAILABLE', (NV_ERR_THRESHOLD_CROSSED:=133): 'NV_ERR_THRESHOLD_CROSSED', (NV_ERR_RESOURCE_RETIREMENT_ERROR:=134): 'NV_ERR_RESOURCE_RETIREMENT_ERROR', (NV_ERR_FABRIC_STATE_OUT_OF_SYNC:=135): 'NV_ERR_FABRIC_STATE_OUT_OF_SYNC', (NV_ERR_BUFFER_FULL:=136): 'NV_ERR_BUFFER_FULL', (NV_ERR_BUFFER_EMPTY:=137): 'NV_ERR_BUFFER_EMPTY', (NV_ERR_MC_FLA_OFFSET_TABLE_FULL:=138): 'NV_ERR_MC_FLA_OFFSET_TABLE_FULL', (NV_ERR_OPERATION_ABORTED:=139): 'NV_ERR_OPERATION_ABORTED', (NV_ERR_DMA_XFER_FAILED:=140): 'NV_ERR_DMA_XFER_FAILED', (NV_ERR_RESOURCE_ACCOUNTING_HARD_LIMIT_EXCEEDED:=141): 'NV_ERR_RESOURCE_ACCOUNTING_HARD_LIMIT_EXCEEDED', (NV_WARN_HOT_SWITCH:=65537): 'NV_WARN_HOT_SWITCH', (NV_WARN_INCORRECT_PERFMON_DATA:=65538): 'NV_WARN_INCORRECT_PERFMON_DATA', (NV_WARN_MISMATCHED_SLAVE:=65539): 'NV_WARN_MISMATCHED_SLAVE', (NV_WARN_MISMATCHED_TARGET:=65540): 'NV_WARN_MISMATCHED_TARGET', (NV_WARN_MORE_PROCESSING_REQUIRED:=65541): 'NV_WARN_MORE_PROCESSING_REQUIRED', (NV_WARN_NOTHING_TO_DO:=65542): 'NV_WARN_NOTHING_TO_DO', (NV_WARN_NULL_OBJECT:=65543): 'NV_WARN_NULL_OBJECT', (NV_WARN_OUT_OF_RANGE:=65544): 'NV_WARN_OUT_OF_RANGE', (NV_WARN_THRESHOLD_CROSSED:=65545): 'NV_WARN_THRESHOLD_CROSSED', (NV_WARN_RESOURCE_ACCOUNTING_SOFT_LIMIT_EXCEEDED:=65546): 'NV_WARN_RESOURCE_ACCOUNTING_SOFT_LIMIT_EXCEEDED'} +NVC9B0_VIDEO_DECODER = (0x0000C9B0) +NVC9B0_NOP = (0x00000100) +NVC9B0_NOP_PARAMETER = (31, 0) +NVC9B0_PM_TRIGGER = (0x00000140) +NVC9B0_PM_TRIGGER_V = (31, 0) +NVC9B0_SET_APPLICATION_ID = (0x00000200) +NVC9B0_SET_APPLICATION_ID_ID = (31, 0) +NVC9B0_SET_APPLICATION_ID_ID_MPEG12 = (0x00000001) +NVC9B0_SET_APPLICATION_ID_ID_VC1 = (0x00000002) +NVC9B0_SET_APPLICATION_ID_ID_H264 = (0x00000003) +NVC9B0_SET_APPLICATION_ID_ID_MPEG4 = (0x00000004) +NVC9B0_SET_APPLICATION_ID_ID_VP8 = (0x00000005) +NVC9B0_SET_APPLICATION_ID_ID_CTR64 = (0x00000006) +NVC9B0_SET_APPLICATION_ID_ID_HEVC = (0x00000007) +NVC9B0_SET_APPLICATION_ID_ID_NEW_H264 = (0x00000008) +NVC9B0_SET_APPLICATION_ID_ID_VP9 = (0x00000009) +NVC9B0_SET_APPLICATION_ID_ID_PASS1 = (0x0000000A) +NVC9B0_SET_APPLICATION_ID_ID_HEVC_PARSER = (0x0000000C) +NVC9B0_SET_APPLICATION_ID_ID_UCODE_TEST = (0x0000000D) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_DECRYPTAUDIO = (0x0000000E) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_DECRYPTAUDIOMULTIPLE = (0x0000000F) +NVC9B0_SET_APPLICATION_ID_ID_HWDRM_PR_PREPROCESSENCRYPTEDDATA = (0x00000010) +NVC9B0_SET_APPLICATION_ID_ID_VP9_WITH_PARSER = (0x00000011) +NVC9B0_SET_APPLICATION_ID_ID_AVD = (0x00000012) +NVC9B0_SET_APPLICATION_ID_ID_HW_DRM_PR4_DECRYPTCONTENTMULTIPLE = (0x00000013) +NVC9B0_SET_APPLICATION_ID_ID_DHKE = (0x00000020) +NVC9B0_SET_WATCHDOG_TIMER = (0x00000204) +NVC9B0_SET_WATCHDOG_TIMER_TIMER = (31, 0) +NVC9B0_SEMAPHORE_A = (0x00000240) +NVC9B0_SEMAPHORE_A_UPPER = (7, 0) +NVC9B0_SEMAPHORE_B = (0x00000244) +NVC9B0_SEMAPHORE_B_LOWER = (31, 0) +NVC9B0_SEMAPHORE_C = (0x00000248) +NVC9B0_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC9B0_CTX_SAVE_AREA = (0x0000024C) +NVC9B0_CTX_SAVE_AREA_OFFSET = (31, 0) +NVC9B0_CTX_SWITCH = (0x00000250) +NVC9B0_CTX_SWITCH_OP = (1, 0) +NVC9B0_CTX_SWITCH_OP_CTX_UPDATE = (0x00000000) +NVC9B0_CTX_SWITCH_OP_CTX_SAVE = (0x00000001) +NVC9B0_CTX_SWITCH_OP_CTX_RESTORE = (0x00000002) +NVC9B0_CTX_SWITCH_OP_CTX_FORCERESTORE = (0x00000003) +NVC9B0_CTX_SWITCH_CTXID_VALID = (2, 2) +NVC9B0_CTX_SWITCH_CTXID_VALID_FALSE = (0x00000000) +NVC9B0_CTX_SWITCH_CTXID_VALID_TRUE = (0x00000001) +NVC9B0_CTX_SWITCH_RESERVED0 = (7, 3) +NVC9B0_CTX_SWITCH_CTX_ID = (23, 8) +NVC9B0_CTX_SWITCH_RESERVED1 = (31, 24) +NVC9B0_SET_SEMAPHORE_PAYLOAD_LOWER = (0x00000254) +NVC9B0_SET_SEMAPHORE_PAYLOAD_LOWER_PAYLOAD_LOWER = (31, 0) +NVC9B0_SET_SEMAPHORE_PAYLOAD_UPPER = (0x00000258) +NVC9B0_SET_SEMAPHORE_PAYLOAD_UPPER_PAYLOAD_UPPER = (31, 0) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_A = (0x0000025C) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_A_LOWER = (31, 0) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_B = (0x00000260) +NVC9B0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_B_UPPER = (31, 0) +NVC9B0_EXECUTE = (0x00000300) +NVC9B0_EXECUTE_NOTIFY = (0, 0) +NVC9B0_EXECUTE_NOTIFY_DISABLE = (0x00000000) +NVC9B0_EXECUTE_NOTIFY_ENABLE = (0x00000001) +NVC9B0_EXECUTE_NOTIFY_ON = (1, 1) +NVC9B0_EXECUTE_NOTIFY_ON_END = (0x00000000) +NVC9B0_EXECUTE_NOTIFY_ON_BEGIN = (0x00000001) +NVC9B0_EXECUTE_PREDICATION = (2, 2) +NVC9B0_EXECUTE_PREDICATION_DISABLE = (0x00000000) +NVC9B0_EXECUTE_PREDICATION_ENABLE = (0x00000001) +NVC9B0_EXECUTE_PREDICATION_OP = (3, 3) +NVC9B0_EXECUTE_PREDICATION_OP_EQUAL_ZERO = (0x00000000) +NVC9B0_EXECUTE_PREDICATION_OP_NOT_EQUAL_ZERO = (0x00000001) +NVC9B0_EXECUTE_AWAKEN = (8, 8) +NVC9B0_EXECUTE_AWAKEN_DISABLE = (0x00000000) +NVC9B0_EXECUTE_AWAKEN_ENABLE = (0x00000001) +NVC9B0_SEMAPHORE_D = (0x00000304) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE = (1, 0) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_ONE = (0x00000000) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_FOUR = (0x00000001) +NVC9B0_SEMAPHORE_D_STRUCTURE_SIZE_TWO = (0x00000002) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE = (8, 8) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE_FALSE = (0x00000000) +NVC9B0_SEMAPHORE_D_AWAKEN_ENABLE_TRUE = (0x00000001) +NVC9B0_SEMAPHORE_D_OPERATION = (17, 16) +NVC9B0_SEMAPHORE_D_OPERATION_RELEASE = (0x00000000) +NVC9B0_SEMAPHORE_D_OPERATION_RESERVED_0 = (0x00000001) +NVC9B0_SEMAPHORE_D_OPERATION_RESERVED_1 = (0x00000002) +NVC9B0_SEMAPHORE_D_OPERATION_TRAP = (0x00000003) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE = (21, 21) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE_FALSE = (0x00000000) +NVC9B0_SEMAPHORE_D_FLUSH_DISABLE_TRUE = (0x00000001) +NVC9B0_SEMAPHORE_D_TRAP_TYPE = (23, 22) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_UNCONDITIONAL = (0x00000000) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_CONDITIONAL = (0x00000001) +NVC9B0_SEMAPHORE_D_TRAP_TYPE_CONDITIONAL_EXT = (0x00000002) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE = (24, 24) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE_32BIT = (0x00000000) +NVC9B0_SEMAPHORE_D_PAYLOAD_SIZE_64BIT = (0x00000001) +NVC9B0_SET_PREDICATION_OFFSET_UPPER = (0x00000308) +NVC9B0_SET_PREDICATION_OFFSET_UPPER_OFFSET = (7, 0) +NVC9B0_SET_PREDICATION_OFFSET_LOWER = (0x0000030C) +NVC9B0_SET_PREDICATION_OFFSET_LOWER_OFFSET = (31, 0) +NVC9B0_SET_AUXILIARY_DATA_BUFFER = (0x00000310) +NVC9B0_SET_AUXILIARY_DATA_BUFFER_OFFSET = (31, 0) +NVC9B0_SET_CONTROL_PARAMS = (0x00000400) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE = (3, 0) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG1 = (0x00000000) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG2 = (0x00000001) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VC1 = (0x00000002) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_H264 = (0x00000003) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_MPEG4 = (0x00000004) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_DIVX3 = (0x00000004) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VP8 = (0x00000005) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_HEVC = (0x00000007) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_VP9 = (0x00000009) +NVC9B0_SET_CONTROL_PARAMS_CODEC_TYPE_AV1 = (0x0000000A) +NVC9B0_SET_CONTROL_PARAMS_GPTIMER_ON = (4, 4) +NVC9B0_SET_CONTROL_PARAMS_RET_ERROR = (5, 5) +NVC9B0_SET_CONTROL_PARAMS_ERR_CONCEAL_ON = (6, 6) +NVC9B0_SET_CONTROL_PARAMS_ERROR_FRM_IDX = (12, 7) +NVC9B0_SET_CONTROL_PARAMS_MBTIMER_ON = (13, 13) +NVC9B0_SET_CONTROL_PARAMS_EC_INTRA_FRAME_USING_PSLC = (14, 14) +NVC9B0_SET_CONTROL_PARAMS_IGNORE_SOME_FIELDS_CRC_CHECK = (15, 15) +NVC9B0_SET_CONTROL_PARAMS_EVENT_TRACE_LOGGING_ON = (16, 16) +NVC9B0_SET_CONTROL_PARAMS_ALL_INTRA_FRAME = (17, 17) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV = (19, 18) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV_TRACE3D_RUN = (0x00000000) +NVC9B0_SET_CONTROL_PARAMS_TESTRUN_ENV_PROD_RUN = (0x00000001) +NVC9B0_SET_CONTROL_PARAMS_HINT_DUMP_EN = (20, 20) +NVC9B0_SET_CONTROL_PARAMS_RESERVED = (25, 21) +NVC9B0_SET_CONTROL_PARAMS_NVDECSIM_SKIP_SCP = (26, 26) +NVC9B0_SET_CONTROL_PARAMS_ENABLE_ENCRYPT = (27, 27) +NVC9B0_SET_CONTROL_PARAMS_ENCRYPTMODE = (31, 28) +NVC9B0_SET_DRV_PIC_SETUP_OFFSET = (0x00000404) +NVC9B0_SET_DRV_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_IN_BUF_BASE_OFFSET = (0x00000408) +NVC9B0_SET_IN_BUF_BASE_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_INDEX = (0x0000040C) +NVC9B0_SET_PICTURE_INDEX_INDEX = (31, 0) +NVC9B0_SET_SLICE_OFFSETS_BUF_OFFSET = (0x00000410) +NVC9B0_SET_SLICE_OFFSETS_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_COLOC_DATA_OFFSET = (0x00000414) +NVC9B0_SET_COLOC_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_HISTORY_OFFSET = (0x00000418) +NVC9B0_SET_HISTORY_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_SIZE = (0x0000041C) +NVC9B0_SET_DISPLAY_BUF_SIZE_SIZE = (31, 0) +NVC9B0_SET_HISTOGRAM_OFFSET = (0x00000420) +NVC9B0_SET_HISTOGRAM_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_NVDEC_STATUS_OFFSET = (0x00000424) +NVC9B0_SET_NVDEC_STATUS_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_LUMA_OFFSET = (0x00000428) +NVC9B0_SET_DISPLAY_BUF_LUMA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_DISPLAY_BUF_CHROMA_OFFSET = (0x0000042C) +NVC9B0_SET_DISPLAY_BUF_CHROMA_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET0 = (0x00000430) +NVC9B0_SET_PICTURE_LUMA_OFFSET0_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET1 = (0x00000434) +NVC9B0_SET_PICTURE_LUMA_OFFSET1_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET2 = (0x00000438) +NVC9B0_SET_PICTURE_LUMA_OFFSET2_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET3 = (0x0000043C) +NVC9B0_SET_PICTURE_LUMA_OFFSET3_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET4 = (0x00000440) +NVC9B0_SET_PICTURE_LUMA_OFFSET4_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET5 = (0x00000444) +NVC9B0_SET_PICTURE_LUMA_OFFSET5_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET6 = (0x00000448) +NVC9B0_SET_PICTURE_LUMA_OFFSET6_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET7 = (0x0000044C) +NVC9B0_SET_PICTURE_LUMA_OFFSET7_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET8 = (0x00000450) +NVC9B0_SET_PICTURE_LUMA_OFFSET8_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET9 = (0x00000454) +NVC9B0_SET_PICTURE_LUMA_OFFSET9_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET10 = (0x00000458) +NVC9B0_SET_PICTURE_LUMA_OFFSET10_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET11 = (0x0000045C) +NVC9B0_SET_PICTURE_LUMA_OFFSET11_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET12 = (0x00000460) +NVC9B0_SET_PICTURE_LUMA_OFFSET12_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET13 = (0x00000464) +NVC9B0_SET_PICTURE_LUMA_OFFSET13_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET14 = (0x00000468) +NVC9B0_SET_PICTURE_LUMA_OFFSET14_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET15 = (0x0000046C) +NVC9B0_SET_PICTURE_LUMA_OFFSET15_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_LUMA_OFFSET16 = (0x00000470) +NVC9B0_SET_PICTURE_LUMA_OFFSET16_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET0 = (0x00000474) +NVC9B0_SET_PICTURE_CHROMA_OFFSET0_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET1 = (0x00000478) +NVC9B0_SET_PICTURE_CHROMA_OFFSET1_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET2 = (0x0000047C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET2_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET3 = (0x00000480) +NVC9B0_SET_PICTURE_CHROMA_OFFSET3_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET4 = (0x00000484) +NVC9B0_SET_PICTURE_CHROMA_OFFSET4_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET5 = (0x00000488) +NVC9B0_SET_PICTURE_CHROMA_OFFSET5_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET6 = (0x0000048C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET6_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET7 = (0x00000490) +NVC9B0_SET_PICTURE_CHROMA_OFFSET7_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET8 = (0x00000494) +NVC9B0_SET_PICTURE_CHROMA_OFFSET8_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET9 = (0x00000498) +NVC9B0_SET_PICTURE_CHROMA_OFFSET9_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET10 = (0x0000049C) +NVC9B0_SET_PICTURE_CHROMA_OFFSET10_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET11 = (0x000004A0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET11_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET12 = (0x000004A4) +NVC9B0_SET_PICTURE_CHROMA_OFFSET12_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET13 = (0x000004A8) +NVC9B0_SET_PICTURE_CHROMA_OFFSET13_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET14 = (0x000004AC) +NVC9B0_SET_PICTURE_CHROMA_OFFSET14_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET15 = (0x000004B0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET15_OFFSET = (31, 0) +NVC9B0_SET_PICTURE_CHROMA_OFFSET16 = (0x000004B4) +NVC9B0_SET_PICTURE_CHROMA_OFFSET16_OFFSET = (31, 0) +NVC9B0_SET_PIC_SCRATCH_BUF_OFFSET = (0x000004B8) +NVC9B0_SET_PIC_SCRATCH_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_EXTERNAL_MVBUFFER_OFFSET = (0x000004BC) +NVC9B0_SET_EXTERNAL_MVBUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SUB_SAMPLE_MAP_OFFSET = (0x000004C0) +NVC9B0_SET_SUB_SAMPLE_MAP_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SUB_SAMPLE_MAP_IV_OFFSET = (0x000004C4) +NVC9B0_SET_SUB_SAMPLE_MAP_IV_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_INTRA_TOP_BUF_OFFSET = (0x000004C8) +NVC9B0_SET_INTRA_TOP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_TILE_SIZE_BUF_OFFSET = (0x000004CC) +NVC9B0_SET_TILE_SIZE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_FILTER_BUFFER_OFFSET = (0x000004D0) +NVC9B0_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_CRC_STRUCT_OFFSET = (0x000004D4) +NVC9B0_SET_CRC_STRUCT_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_PR_SSM_CONTENT_INFO_BUF_OFFSET = (0x000004D8) +NVC9B0_SET_PR_SSM_CONTENT_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_MBHIST_BUF_OFFSET = (0x00000500) +NVC9B0_H264_SET_MBHIST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP8_SET_PROB_DATA_OFFSET = (0x00000540) +NVC9B0_VP8_SET_PROB_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_VP8_SET_HEADER_PARTITION_BUF_BASE_OFFSET = (0x00000544) +NVC9B0_VP8_SET_HEADER_PARTITION_BUF_BASE_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SCALING_LIST_OFFSET = (0x00000580) +NVC9B0_HEVC_SET_SCALING_LIST_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_TILE_SIZES_OFFSET = (0x00000584) +NVC9B0_HEVC_SET_TILE_SIZES_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_FILTER_BUFFER_OFFSET = (0x00000588) +NVC9B0_HEVC_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SAO_BUFFER_OFFSET = (0x0000058C) +NVC9B0_HEVC_SET_SAO_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SLICE_INFO_BUFFER_OFFSET = (0x00000590) +NVC9B0_HEVC_SET_SLICE_INFO_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_HEVC_SET_SLICE_GROUP_INDEX = (0x00000594) +NVC9B0_HEVC_SET_SLICE_GROUP_INDEX_OFFSET = (31, 0) +NVC9B0_VP9_SET_PROB_TAB_BUF_OFFSET = (0x000005C0) +NVC9B0_VP9_SET_PROB_TAB_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_CTX_COUNTER_BUF_OFFSET = (0x000005C4) +NVC9B0_VP9_SET_CTX_COUNTER_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_SEGMENT_READ_BUF_OFFSET = (0x000005C8) +NVC9B0_VP9_SET_SEGMENT_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_SEGMENT_WRITE_BUF_OFFSET = (0x000005CC) +NVC9B0_VP9_SET_SEGMENT_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_TILE_SIZE_BUF_OFFSET = (0x000005D0) +NVC9B0_VP9_SET_TILE_SIZE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_COL_MVWRITE_BUF_OFFSET = (0x000005D4) +NVC9B0_VP9_SET_COL_MVWRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_COL_MVREAD_BUF_OFFSET = (0x000005D8) +NVC9B0_VP9_SET_COL_MVREAD_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_FILTER_BUFFER_OFFSET = (0x000005DC) +NVC9B0_VP9_SET_FILTER_BUFFER_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PIC_SETUP_OFFSET = (0x000005E0) +NVC9B0_VP9_PARSER_SET_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PREV_PIC_SETUP_OFFSET = (0x000005E4) +NVC9B0_VP9_PARSER_SET_PREV_PIC_SETUP_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_PARSER_SET_PROB_TAB_BUF_OFFSET = (0x000005E8) +NVC9B0_VP9_PARSER_SET_PROB_TAB_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_VP9_SET_HINT_DUMP_BUF_OFFSET = (0x000005EC) +NVC9B0_VP9_SET_HINT_DUMP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_CLEAR_HEADER_OFFSET = (0x00000600) +NVC9B0_PASS1_SET_CLEAR_HEADER_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_RE_ENCRYPT_OFFSET = (0x00000604) +NVC9B0_PASS1_SET_RE_ENCRYPT_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_VP8_TOKEN_OFFSET = (0x00000608) +NVC9B0_PASS1_SET_VP8_TOKEN_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_INPUT_DATA_OFFSET = (0x0000060C) +NVC9B0_PASS1_SET_INPUT_DATA_OFFSET_OFFSET = (31, 0) +NVC9B0_PASS1_SET_OUTPUT_DATA_SIZE_OFFSET = (0x00000610) +NVC9B0_PASS1_SET_OUTPUT_DATA_SIZE_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_PROB_TAB_READ_BUF_OFFSET = (0x00000640) +NVC9B0_AV1_SET_PROB_TAB_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_PROB_TAB_WRITE_BUF_OFFSET = (0x00000644) +NVC9B0_AV1_SET_PROB_TAB_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SEGMENT_READ_BUF_OFFSET = (0x00000648) +NVC9B0_AV1_SET_SEGMENT_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SEGMENT_WRITE_BUF_OFFSET = (0x0000064C) +NVC9B0_AV1_SET_SEGMENT_WRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV0_READ_BUF_OFFSET = (0x00000650) +NVC9B0_AV1_SET_COL_MV0_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV1_READ_BUF_OFFSET = (0x00000654) +NVC9B0_AV1_SET_COL_MV1_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MV2_READ_BUF_OFFSET = (0x00000658) +NVC9B0_AV1_SET_COL_MV2_READ_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_COL_MVWRITE_BUF_OFFSET = (0x0000065C) +NVC9B0_AV1_SET_COL_MVWRITE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_GLOBAL_MODEL_BUF_OFFSET = (0x00000660) +NVC9B0_AV1_SET_GLOBAL_MODEL_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_FILM_GRAIN_BUF_OFFSET = (0x00000664) +NVC9B0_AV1_SET_FILM_GRAIN_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_TILE_STREAM_INFO_BUF_OFFSET = (0x00000668) +NVC9B0_AV1_SET_TILE_STREAM_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_SUB_STREAM_ENTRY_BUF_OFFSET = (0x0000066C) +NVC9B0_AV1_SET_SUB_STREAM_ENTRY_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_AV1_SET_HINT_DUMP_BUF_OFFSET = (0x00000670) +NVC9B0_AV1_SET_HINT_DUMP_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_SCALING_LIST_OFFSET = (0x00000680) +NVC9B0_H264_SET_SCALING_LIST_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_VLDHIST_BUF_OFFSET = (0x00000684) +NVC9B0_H264_SET_VLDHIST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET0 = (0x00000688) +NVC9B0_H264_SET_EDOBOFFSET0_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET1 = (0x0000068C) +NVC9B0_H264_SET_EDOBOFFSET1_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET2 = (0x00000690) +NVC9B0_H264_SET_EDOBOFFSET2_OFFSET = (31, 0) +NVC9B0_H264_SET_EDOBOFFSET3 = (0x00000694) +NVC9B0_H264_SET_EDOBOFFSET3_OFFSET = (31, 0) +NVC9B0_SET_CONTENT_INITIAL_VECTOR = lambda b: (0x00000C00 + (b)*0x00000004) # type: ignore +NVC9B0_SET_CONTENT_INITIAL_VECTOR_VALUE = (31, 0) +NVC9B0_SET_CTL_COUNT = (0x00000C10) +NVC9B0_SET_CTL_COUNT_VALUE = (31, 0) +NVC9B0_SET_UPPER_SRC = (0x00000C14) +NVC9B0_SET_UPPER_SRC_OFFSET = (7, 0) +NVC9B0_SET_LOWER_SRC = (0x00000C18) +NVC9B0_SET_LOWER_SRC_OFFSET = (31, 0) +NVC9B0_SET_UPPER_DST = (0x00000C1C) +NVC9B0_SET_UPPER_DST_OFFSET = (7, 0) +NVC9B0_SET_LOWER_DST = (0x00000C20) +NVC9B0_SET_LOWER_DST_OFFSET = (31, 0) +NVC9B0_SET_BLOCK_COUNT = (0x00000C24) +NVC9B0_SET_BLOCK_COUNT_VALUE = (31, 0) +NVC9B0_PR_SET_REQUEST_BUF_OFFSET = (0x00000D00) +NVC9B0_PR_SET_REQUEST_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_REQUEST_BUF_SIZE = (0x00000D04) +NVC9B0_PR_SET_REQUEST_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_RESPONSE_BUF_OFFSET = (0x00000D08) +NVC9B0_PR_SET_RESPONSE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_RESPONSE_BUF_SIZE = (0x00000D0C) +NVC9B0_PR_SET_RESPONSE_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_REQUEST_MESSAGE_BUF_OFFSET = (0x00000D10) +NVC9B0_PR_SET_REQUEST_MESSAGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_RESPONSE_MESSAGE_BUF_OFFSET = (0x00000D14) +NVC9B0_PR_SET_RESPONSE_MESSAGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_OFFSET = (0x00000D18) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_SIZE = (0x00000D1C) +NVC9B0_PR_SET_LOCAL_DECRYPT_BUF_SIZE_SIZE = (31, 0) +NVC9B0_PR_SET_CONTENT_DECRYPT_INFO_BUF_OFFSET = (0x00000D20) +NVC9B0_PR_SET_CONTENT_DECRYPT_INFO_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_PR_SET_REENCRYPTED_BITSTREAM_BUF_OFFSET = (0x00000D24) +NVC9B0_PR_SET_REENCRYPTED_BITSTREAM_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_DH_KE_SET_CHALLENGE_BUF_OFFSET = (0x00000E00) +NVC9B0_DH_KE_SET_CHALLENGE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_DH_KE_SET_RESPONSE_BUF_OFFSET = (0x00000E04) +NVC9B0_DH_KE_SET_RESPONSE_BUF_OFFSET_OFFSET = (31, 0) +NVC9B0_SET_SESSION_KEY = lambda b: (0x00000F00 + (b)*0x00000004) # type: ignore +NVC9B0_SET_SESSION_KEY_VALUE = (31, 0) +NVC9B0_SET_CONTENT_KEY = lambda b: (0x00000F10 + (b)*0x00000004) # type: ignore +NVC9B0_SET_CONTENT_KEY_VALUE = (31, 0) +NVC9B0_PM_TRIGGER_END = (0x00001114) +NVC9B0_PM_TRIGGER_END_V = (31, 0) +NVC9B0_ERROR_NONE = (0x00000000) +NVC9B0_OS_ERROR_EXECUTE_INSUFFICIENT_DATA = (0x00000001) +NVC9B0_OS_ERROR_SEMAPHORE_INSUFFICIENT_DATA = (0x00000002) +NVC9B0_OS_ERROR_INVALID_METHOD = (0x00000003) +NVC9B0_OS_ERROR_INVALID_DMA_PAGE = (0x00000004) +NVC9B0_OS_ERROR_UNHANDLED_INTERRUPT = (0x00000005) +NVC9B0_OS_ERROR_EXCEPTION = (0x00000006) +NVC9B0_OS_ERROR_INVALID_CTXSW_REQUEST = (0x00000007) +NVC9B0_OS_ERROR_APPLICATION = (0x00000008) +NVC9B0_OS_ERROR_SW_BREAKPT = (0x00000009) +NVC9B0_OS_INTERRUPT_EXECUTE_AWAKEN = (0x00000100) +NVC9B0_OS_INTERRUPT_BACKEND_SEMAPHORE_AWAKEN = (0x00000200) +NVC9B0_OS_INTERRUPT_CTX_ERROR_FBIF = (0x00000300) +NVC9B0_OS_INTERRUPT_LIMIT_VIOLATION = (0x00000400) +NVC9B0_OS_INTERRUPT_LIMIT_AND_FBIF_CTX_ERROR = (0x00000500) +NVC9B0_OS_INTERRUPT_HALT_ENGINE = (0x00000600) +NVC9B0_OS_INTERRUPT_TRAP_NONSTALL = (0x00000700) +NVC9B0_H264_VLD_ERR_SEQ_DATA_INCONSISTENT = (0x00004001) +NVC9B0_H264_VLD_ERR_PIC_DATA_INCONSISTENT = (0x00004002) +NVC9B0_H264_VLD_ERR_SLC_DATA_BUF_ADDR_OUT_OF_BOUNDS = (0x00004100) +NVC9B0_H264_VLD_ERR_BITSTREAM_ERROR = (0x00004101) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x000041F8) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_SIZE_NOT_MULT256 = (0x00004200) +NVC9B0_H264_VLD_ERR_SLC_DATA_OUT_SIZE_NOT_MULT256 = (0x00004201) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00004203) +NVC9B0_H264_VLD_ERR_CTX_DMA_ID_SLC_HDR_OUT_INVALID = (0x00004204) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00004205) +NVC9B0_H264_VLD_ERR_SLC_HDR_OUT_BUF_ALREADY_VALID = (0x00004206) +NVC9B0_H264_VLD_ERR_SLC_DATA_OUT_BUF_TOO_SMALL = (0x00004207) +NVC9B0_H264_VLD_ERR_DATA_BUF_CNT_TOO_SMALL = (0x00004208) +NVC9B0_H264_VLD_ERR_BITSTREAM_EMPTY = (0x00004209) +NVC9B0_H264_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000420A) +NVC9B0_H264_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000420B) +NVC9B0_H264_VLD_ERR_HIST_BUF_TOO_SMALL = (0x00004300) +NVC9B0_VC1_VLD_ERR_PIC_DATA_BUF_ADDR_OUT_OF_BOUND = (0x00005100) +NVC9B0_VC1_VLD_ERR_BITSTREAM_ERROR = (0x00005101) +NVC9B0_VC1_VLD_ERR_PIC_HDR_OUT_SIZE_NOT_MULT256 = (0x00005200) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_SIZE_NOT_MULT256 = (0x00005201) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00005202) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00005203) +NVC9B0_VC1_VLD_ERR_CTX_DMA_ID_PIC_HDR_OUT_INVALID = (0x00005204) +NVC9B0_VC1_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00005205) +NVC9B0_VC1_VLD_ERR_PIC_HDR_OUT_BUF_ALREADY_VALID = (0x00005206) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_BUF_TOO_SMALL = (0x00005207) +NVC9B0_VC1_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00005208) +NVC9B0_VC1_VLD_ERR_BITSTREAM_EMPTY = (0x00005209) +NVC9B0_VC1_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000520A) +NVC9B0_VC1_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000520B) +NVC9B0_VC1_VLD_ERR_PIC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00005300) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_BUF_ADDR_OUT_OF_BOUNDS = (0x00006100) +NVC9B0_MPEG12_VLD_ERR_BITSTREAM_ERROR = (0x00006101) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_SIZE_NOT_MULT256 = (0x00006200) +NVC9B0_MPEG12_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00006201) +NVC9B0_MPEG12_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00006202) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_BUF_TOO_SMALL = (0x00006203) +NVC9B0_MPEG12_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00006204) +NVC9B0_MPEG12_VLD_ERR_BITSTREAM_EMPTY = (0x00006205) +NVC9B0_MPEG12_VLD_ERR_INVALID_PIC_STRUCTURE = (0x00006206) +NVC9B0_MPEG12_VLD_ERR_INVALID_PIC_CODING_TYPE = (0x00006207) +NVC9B0_MPEG12_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x00006208) +NVC9B0_MPEG12_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x00006209) +NVC9B0_MPEG12_VLD_ERR_SLC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00006300) +NVC9B0_CMN_VLD_ERR_PDEC_RETURNED_ERROR = (0x00007101) +NVC9B0_CMN_VLD_ERR_EDOB_FLUSH_TIME_OUT = (0x00007102) +NVC9B0_CMN_VLD_ERR_EDOB_REWIND_TIME_OUT = (0x00007103) +NVC9B0_CMN_VLD_ERR_VLD_WD_TIME_OUT = (0x00007104) +NVC9B0_CMN_VLD_ERR_NUM_SLICES_ZERO = (0x00007105) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_BUF_ADDR_OUT_OF_BOUND = (0x00008100) +NVC9B0_MPEG4_VLD_ERR_BITSTREAM_ERROR = (0x00008101) +NVC9B0_MPEG4_VLD_ERR_PIC_HDR_OUT_SIZE_NOT_MULT256 = (0x00008200) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_SIZE_NOT_MULT256 = (0x00008201) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_CTRL_IN_INVALID = (0x00008202) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_FLOW_CTRL_INVALID = (0x00008203) +NVC9B0_MPEG4_VLD_ERR_CTX_DMA_ID_PIC_HDR_OUT_INVALID = (0x00008204) +NVC9B0_MPEG4_VLD_ERR_SLC_HDR_OUT_BUF_TOO_SMALL = (0x00008205) +NVC9B0_MPEG4_VLD_ERR_PIC_HDR_OUT_BUF_ALREADY_VALID = (0x00008206) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_BUF_TOO_SMALL = (0x00008207) +NVC9B0_MPEG4_VLD_ERR_DATA_INFO_IN_BUF_TOO_SMALL = (0x00008208) +NVC9B0_MPEG4_VLD_ERR_BITSTREAM_EMPTY = (0x00008209) +NVC9B0_MPEG4_VLD_ERR_FRAME_WIDTH_TOO_LARGE = (0x0000820A) +NVC9B0_MPEG4_VLD_ERR_FRAME_HEIGHT_TOO_LARGE = (0x0000820B) +NVC9B0_MPEG4_VLD_ERR_PIC_DATA_OUT_BUF_FULL_TIME_OUT = (0x00051E01) +NVC9B0_DEC_ERROR_MPEG12_APPTIMER_EXPIRED = (0xDEC10001) +NVC9B0_DEC_ERROR_MPEG12_MVTIMER_EXPIRED = (0xDEC10002) +NVC9B0_DEC_ERROR_MPEG12_INVALID_TOKEN = (0xDEC10003) +NVC9B0_DEC_ERROR_MPEG12_SLICEDATA_MISSING = (0xDEC10004) +NVC9B0_DEC_ERROR_MPEG12_HWERR_INTERRUPT = (0xDEC10005) +NVC9B0_DEC_ERROR_MPEG12_DETECTED_VLD_FAILURE = (0xDEC10006) +NVC9B0_DEC_ERROR_MPEG12_PICTURE_INIT = (0xDEC10100) +NVC9B0_DEC_ERROR_MPEG12_STATEMACHINE_FAILURE = (0xDEC10101) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_PIC = (0xDEC10901) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_UCODE = (0xDEC10902) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_FC = (0xDEC10903) +NVC9B0_DEC_ERROR_MPEG12_INVALID_CTXID_SLH = (0xDEC10904) +NVC9B0_DEC_ERROR_MPEG12_INVALID_UCODE_SIZE = (0xDEC10905) +NVC9B0_DEC_ERROR_MPEG12_INVALID_SLICE_COUNT = (0xDEC10906) +NVC9B0_DEC_ERROR_VC1_APPTIMER_EXPIRED = (0xDEC20001) +NVC9B0_DEC_ERROR_VC1_MVTIMER_EXPIRED = (0xDEC20002) +NVC9B0_DEC_ERROR_VC1_INVALID_TOKEN = (0xDEC20003) +NVC9B0_DEC_ERROR_VC1_SLICEDATA_MISSING = (0xDEC20004) +NVC9B0_DEC_ERROR_VC1_HWERR_INTERRUPT = (0xDEC20005) +NVC9B0_DEC_ERROR_VC1_DETECTED_VLD_FAILURE = (0xDEC20006) +NVC9B0_DEC_ERROR_VC1_TIMEOUT_POLLING_FOR_DATA = (0xDEC20007) +NVC9B0_DEC_ERROR_VC1_PDEC_PIC_END_UNALIGNED = (0xDEC20008) +NVC9B0_DEC_ERROR_VC1_WDTIMER_EXPIRED = (0xDEC20009) +NVC9B0_DEC_ERROR_VC1_ERRINTSTART = (0xDEC20010) +NVC9B0_DEC_ERROR_VC1_IQT_ERRINT = (0xDEC20011) +NVC9B0_DEC_ERROR_VC1_MC_ERRINT = (0xDEC20012) +NVC9B0_DEC_ERROR_VC1_MC_IQT_ERRINT = (0xDEC20013) +NVC9B0_DEC_ERROR_VC1_REC_ERRINT = (0xDEC20014) +NVC9B0_DEC_ERROR_VC1_REC_IQT_ERRINT = (0xDEC20015) +NVC9B0_DEC_ERROR_VC1_REC_MC_ERRINT = (0xDEC20016) +NVC9B0_DEC_ERROR_VC1_REC_MC_IQT_ERRINT = (0xDEC20017) +NVC9B0_DEC_ERROR_VC1_DBF_ERRINT = (0xDEC20018) +NVC9B0_DEC_ERROR_VC1_DBF_IQT_ERRINT = (0xDEC20019) +NVC9B0_DEC_ERROR_VC1_DBF_MC_ERRINT = (0xDEC2001A) +NVC9B0_DEC_ERROR_VC1_DBF_MC_IQT_ERRINT = (0xDEC2001B) +NVC9B0_DEC_ERROR_VC1_DBF_REC_ERRINT = (0xDEC2001C) +NVC9B0_DEC_ERROR_VC1_DBF_REC_IQT_ERRINT = (0xDEC2001D) +NVC9B0_DEC_ERROR_VC1_DBF_REC_MC_ERRINT = (0xDEC2001E) +NVC9B0_DEC_ERROR_VC1_DBF_REC_MC_IQT_ERRINT = (0xDEC2001F) +NVC9B0_DEC_ERROR_VC1_PICTURE_INIT = (0xDEC20100) +NVC9B0_DEC_ERROR_VC1_STATEMACHINE_FAILURE = (0xDEC20101) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_PIC = (0xDEC20901) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_UCODE = (0xDEC20902) +NVC9B0_DEC_ERROR_VC1_INVALID_CTXID_FC = (0xDEC20903) +NVC9B0_DEC_ERROR_VC1_INVAILD_CTXID_SLH = (0xDEC20904) +NVC9B0_DEC_ERROR_VC1_INVALID_UCODE_SIZE = (0xDEC20905) +NVC9B0_DEC_ERROR_VC1_INVALID_SLICE_COUNT = (0xDEC20906) +NVC9B0_DEC_ERROR_H264_APPTIMER_EXPIRED = (0xDEC30001) +NVC9B0_DEC_ERROR_H264_MVTIMER_EXPIRED = (0xDEC30002) +NVC9B0_DEC_ERROR_H264_INVALID_TOKEN = (0xDEC30003) +NVC9B0_DEC_ERROR_H264_SLICEDATA_MISSING = (0xDEC30004) +NVC9B0_DEC_ERROR_H264_HWERR_INTERRUPT = (0xDEC30005) +NVC9B0_DEC_ERROR_H264_DETECTED_VLD_FAILURE = (0xDEC30006) +NVC9B0_DEC_ERROR_H264_ERRINTSTART = (0xDEC30010) +NVC9B0_DEC_ERROR_H264_IQT_ERRINT = (0xDEC30011) +NVC9B0_DEC_ERROR_H264_MC_ERRINT = (0xDEC30012) +NVC9B0_DEC_ERROR_H264_MC_IQT_ERRINT = (0xDEC30013) +NVC9B0_DEC_ERROR_H264_REC_ERRINT = (0xDEC30014) +NVC9B0_DEC_ERROR_H264_REC_IQT_ERRINT = (0xDEC30015) +NVC9B0_DEC_ERROR_H264_REC_MC_ERRINT = (0xDEC30016) +NVC9B0_DEC_ERROR_H264_REC_MC_IQT_ERRINT = (0xDEC30017) +NVC9B0_DEC_ERROR_H264_DBF_ERRINT = (0xDEC30018) +NVC9B0_DEC_ERROR_H264_DBF_IQT_ERRINT = (0xDEC30019) +NVC9B0_DEC_ERROR_H264_DBF_MC_ERRINT = (0xDEC3001A) +NVC9B0_DEC_ERROR_H264_DBF_MC_IQT_ERRINT = (0xDEC3001B) +NVC9B0_DEC_ERROR_H264_DBF_REC_ERRINT = (0xDEC3001C) +NVC9B0_DEC_ERROR_H264_DBF_REC_IQT_ERRINT = (0xDEC3001D) +NVC9B0_DEC_ERROR_H264_DBF_REC_MC_ERRINT = (0xDEC3001E) +NVC9B0_DEC_ERROR_H264_DBF_REC_MC_IQT_ERRINT = (0xDEC3001F) +NVC9B0_DEC_ERROR_H264_PICTURE_INIT = (0xDEC30100) +NVC9B0_DEC_ERROR_H264_STATEMACHINE_FAILURE = (0xDEC30101) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_PIC = (0xDEC30901) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_UCODE = (0xDEC30902) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_FC = (0xDEC30903) +NVC9B0_DEC_ERROR_H264_INVALID_CTXID_SLH = (0xDEC30904) +NVC9B0_DEC_ERROR_H264_INVALID_UCODE_SIZE = (0xDEC30905) +NVC9B0_DEC_ERROR_H264_INVALID_SLICE_COUNT = (0xDEC30906) +NVC9B0_DEC_ERROR_MPEG4_APPTIMER_EXPIRED = (0xDEC40001) +NVC9B0_DEC_ERROR_MPEG4_MVTIMER_EXPIRED = (0xDEC40002) +NVC9B0_DEC_ERROR_MPEG4_INVALID_TOKEN = (0xDEC40003) +NVC9B0_DEC_ERROR_MPEG4_SLICEDATA_MISSING = (0xDEC40004) +NVC9B0_DEC_ERROR_MPEG4_HWERR_INTERRUPT = (0xDEC40005) +NVC9B0_DEC_ERROR_MPEG4_DETECTED_VLD_FAILURE = (0xDEC40006) +NVC9B0_DEC_ERROR_MPEG4_TIMEOUT_POLLING_FOR_DATA = (0xDEC40007) +NVC9B0_DEC_ERROR_MPEG4_PDEC_PIC_END_UNALIGNED = (0xDEC40008) +NVC9B0_DEC_ERROR_MPEG4_WDTIMER_EXPIRED = (0xDEC40009) +NVC9B0_DEC_ERROR_MPEG4_ERRINTSTART = (0xDEC40010) +NVC9B0_DEC_ERROR_MPEG4_IQT_ERRINT = (0xDEC40011) +NVC9B0_DEC_ERROR_MPEG4_MC_ERRINT = (0xDEC40012) +NVC9B0_DEC_ERROR_MPEG4_MC_IQT_ERRINT = (0xDEC40013) +NVC9B0_DEC_ERROR_MPEG4_REC_ERRINT = (0xDEC40014) +NVC9B0_DEC_ERROR_MPEG4_REC_IQT_ERRINT = (0xDEC40015) +NVC9B0_DEC_ERROR_MPEG4_REC_MC_ERRINT = (0xDEC40016) +NVC9B0_DEC_ERROR_MPEG4_REC_MC_IQT_ERRINT = (0xDEC40017) +NVC9B0_DEC_ERROR_MPEG4_DBF_ERRINT = (0xDEC40018) +NVC9B0_DEC_ERROR_MPEG4_DBF_IQT_ERRINT = (0xDEC40019) +NVC9B0_DEC_ERROR_MPEG4_DBF_MC_ERRINT = (0xDEC4001A) +NVC9B0_DEC_ERROR_MPEG4_DBF_MC_IQT_ERRINT = (0xDEC4001B) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_ERRINT = (0xDEC4001C) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_IQT_ERRINT = (0xDEC4001D) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_MC_ERRINT = (0xDEC4001E) +NVC9B0_DEC_ERROR_MPEG4_DBF_REC_MC_IQT_ERRINT = (0xDEC4001F) +NVC9B0_DEC_ERROR_MPEG4_PICTURE_INIT = (0xDEC40100) +NVC9B0_DEC_ERROR_MPEG4_STATEMACHINE_FAILURE = (0xDEC40101) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_PIC = (0xDEC40901) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_UCODE = (0xDEC40902) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_FC = (0xDEC40903) +NVC9B0_DEC_ERROR_MPEG4_INVALID_CTXID_SLH = (0xDEC40904) +NVC9B0_DEC_ERROR_MPEG4_INVALID_UCODE_SIZE = (0xDEC40905) +NVC9B0_DEC_ERROR_MPEG4_INVALID_SLICE_COUNT = (0xDEC40906) +NVC6C0_QMDV02_03_OUTER_PUT = (30, 0) +NVC6C0_QMDV02_03_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV02_03_OUTER_GET = (62, 32) +NVC6C0_QMDV02_03_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV02_03_INNER_GET = (94, 64) +NVC6C0_QMDV02_03_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV02_03_INNER_PUT = (126, 96) +NVC6C0_QMDV02_03_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV02_03_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV02_03_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV02_03_IS_QUEUE = (136, 136) +NVC6C0_QMDV02_03_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV02_03_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0 = (138, 138) +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE0_TRUE = 0x00000001 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1 = (139, 139) +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEMAPHORE_RELEASE_ENABLE1_TRUE = 0x00000001 +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV02_03_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE = (141, 141) +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_SCHEDULE_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE = (142, 142) +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE_QUEUE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_TYPE_GRID = 0x00000001 +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY = (143, 143) +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY_FALSE = 0x00000000 +NVC6C0_QMDV02_03_DEPENDENT_QMD_FIELD_COPY_TRUE = 0x00000001 +NVC6C0_QMDV02_03_QMD_RESERVED_B = (159, 144) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV02_03_QMD_RESERVED_C = (185, 185) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV02_03_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV02_03_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV02_03_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV02_03_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE = (366, 366) +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_03_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV02_03_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV02_03_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV02_03_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV02_03_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV02_03_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV02_03_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV02_03_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV02_03_QMD_RESERVED13A = (447, 432) +NVC6C0_QMDV02_03_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV02_03_QMD_RESERVED14A = (479, 464) +NVC6C0_QMDV02_03_DEPENDENT_QMD_POINTER = (511, 480) +NVC6C0_QMDV02_03_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV02_03_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV02_03_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV02_03_MIN_SM_CONFIG_SHARED_MEM_SIZE = (568, 562) +NVC6C0_QMDV02_03_MAX_SM_CONFIG_SHARED_MEM_SIZE = (575, 569) +NVC6C0_QMDV02_03_QMD_VERSION = (579, 576) +NVC6C0_QMDV02_03_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV02_03_QMD_RESERVED_H = (591, 584) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV02_03_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_03_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV02_03_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (663, 657) +NVC6C0_QMDV02_03_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV02_03_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV02_03_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV02_03_RELEASE0_ADDRESS_LOWER = (767, 736) +NVC6C0_QMDV02_03_RELEASE0_ADDRESS_UPPER = (775, 768) +NVC6C0_QMDV02_03_QMD_RESERVED_J = (783, 776) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP = (790, 788) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_03_QMD_RESERVED_K = (791, 791) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT = (793, 792) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE = (794, 794) +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE = (799, 799) +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_03_RELEASE0_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_03_RELEASE0_PAYLOAD = (831, 800) +NVC6C0_QMDV02_03_RELEASE1_ADDRESS_LOWER = (863, 832) +NVC6C0_QMDV02_03_RELEASE1_ADDRESS_UPPER = (871, 864) +NVC6C0_QMDV02_03_QMD_RESERVED_L = (879, 872) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP = (886, 884) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_03_QMD_RESERVED_M = (887, 887) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT = (889, 888) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE = (890, 890) +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE = (895, 895) +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_03_RELEASE1_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_03_RELEASE1_PAYLOAD = (927, 896) +NVC6C0_QMDV02_03_SHADER_LOCAL_MEMORY_LOW_SIZE = (951, 928) +NVC6C0_QMDV02_03_QMD_RESERVED_N = (954, 952) +NVC6C0_QMDV02_03_BARRIER_COUNT = (959, 955) +NVC6C0_QMDV02_03_SHADER_LOCAL_MEMORY_HIGH_SIZE = (983, 960) +NVC6C0_QMDV02_03_REGISTER_COUNT = (991, 984) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1000, 992) +NVC6C0_QMDV02_03_PROGRAM_PREFETCH_SIZE = (1009, 1001) +NVC6C0_QMDV02_03_QMD_RESERVED_A = (1015, 1010) +NVC6C0_QMDV02_03_SASS_VERSION = (1023, 1016) +NVC6C0_QMDV02_03_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_03_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV02_03_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV02_03_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV02_03_QMD_RESERVED_S = (1599, 1585) +NVC6C0_QMDV02_03_HW_ONLY_INNER_GET = (1630, 1600) +NVC6C0_QMDV02_03_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1631, 1631) +NVC6C0_QMDV02_03_HW_ONLY_INNER_PUT = (1662, 1632) +NVC6C0_QMDV02_03_HW_ONLY_SCG_TYPE = (1663, 1663) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1693, 1664) +NVC6C0_QMDV02_03_QMD_RESERVED_Q = (1694, 1694) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1695, 1695) +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_03_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_03_HW_ONLY_SKED_NEXT_QMD_POINTER = (1727, 1696) +NVC6C0_QMDV02_03_QMD_SPARE_G = (1759, 1728) +NVC6C0_QMDV02_03_QMD_SPARE_H = (1791, 1760) +NVC6C0_QMDV02_03_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV02_03_QMD_SPARE_J = (1855, 1824) +NVC6C0_QMDV02_03_QMD_SPARE_K = (1887, 1856) +NVC6C0_QMDV02_03_QMD_SPARE_L = (1919, 1888) +NVC6C0_QMDV02_03_QMD_SPARE_M = (1951, 1920) +NVC6C0_QMDV02_03_QMD_SPARE_N = (1983, 1952) +NVC6C0_QMDV02_03_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV02_03_DEBUG_ID_LOWER = (2047, 2016) +NVC6C0_QMDV02_04_OUTER_PUT = (30, 0) +NVC6C0_QMDV02_04_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV02_04_OUTER_GET = (62, 32) +NVC6C0_QMDV02_04_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV02_04_INNER_GET = (94, 64) +NVC6C0_QMDV02_04_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV02_04_INNER_PUT = (126, 96) +NVC6C0_QMDV02_04_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV02_04_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV02_04_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV02_04_IS_QUEUE = (136, 136) +NVC6C0_QMDV02_04_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV02_04_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0 = (138, 138) +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE0_TRUE = 0x00000001 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1 = (139, 139) +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEMAPHORE_RELEASE_ENABLE1_TRUE = 0x00000001 +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV02_04_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE = (141, 141) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION = (144, 142) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH = (145, 145) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE = (146, 146) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION = (149, 147) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH = (150, 150) +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV02_04_DEPENDENCE_COUNTER = (157, 151) +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION = (158, 158) +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVC6C0_QMDV02_04_QMD_RESERVED_B = (159, 159) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV02_04_DEMOTE_L2_EVICT_LAST = (185, 185) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV02_04_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV02_04_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV02_04_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV02_04_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE = (366, 366) +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV02_04_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV02_04_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV02_04_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV02_04_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV02_04_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV02_04_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE = (383, 383) +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV02_04_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV02_04_QMD_RESERVED13A = (447, 432) +NVC6C0_QMDV02_04_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV02_04_QMD_RESERVED14A = (479, 464) +NVC6C0_QMDV02_04_DEPENDENT_QMD0_POINTER = (511, 480) +NVC6C0_QMDV02_04_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV02_04_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV02_04_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV02_04_MIN_SM_CONFIG_SHARED_MEM_SIZE = (568, 562) +NVC6C0_QMDV02_04_MAX_SM_CONFIG_SHARED_MEM_SIZE = (575, 569) +NVC6C0_QMDV02_04_QMD_VERSION = (579, 576) +NVC6C0_QMDV02_04_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV02_04_QMD_RESERVED_H = (591, 584) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV02_04_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_04_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV02_04_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (663, 657) +NVC6C0_QMDV02_04_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV02_04_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV02_04_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV02_04_RELEASE0_ADDRESS_LOWER = (767, 736) +NVC6C0_QMDV02_04_RELEASE0_ADDRESS_UPPER = (775, 768) +NVC6C0_QMDV02_04_QMD_RESERVED_J = (783, 776) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP = (790, 788) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_04_QMD_RESERVED_K = (791, 791) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT = (793, 792) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE = (794, 794) +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE = (799, 799) +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_04_RELEASE0_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_04_RELEASE0_PAYLOAD = (831, 800) +NVC6C0_QMDV02_04_RELEASE1_ADDRESS_LOWER = (863, 832) +NVC6C0_QMDV02_04_RELEASE1_ADDRESS_UPPER = (871, 864) +NVC6C0_QMDV02_04_QMD_RESERVED_L = (879, 872) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP = (886, 884) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV02_04_QMD_RESERVED_M = (887, 887) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT = (889, 888) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE = (890, 890) +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE = (895, 895) +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV02_04_RELEASE1_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_QMDV02_04_RELEASE1_PAYLOAD = (927, 896) +NVC6C0_QMDV02_04_SHADER_LOCAL_MEMORY_LOW_SIZE = (951, 928) +NVC6C0_QMDV02_04_QMD_RESERVED_N = (954, 952) +NVC6C0_QMDV02_04_BARRIER_COUNT = (959, 955) +NVC6C0_QMDV02_04_SHADER_LOCAL_MEMORY_HIGH_SIZE = (983, 960) +NVC6C0_QMDV02_04_QMD_RESERVED_G = (991, 984) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1000, 992) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_SIZE = (1009, 1001) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE = (1011, 1010) +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVC6C0_QMDV02_04_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVC6C0_QMDV02_04_QMD_RESERVED_A = (1015, 1012) +NVC6C0_QMDV02_04_SASS_VERSION = (1023, 1016) +NVC6C0_QMDV02_04_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV02_04_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV02_04_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV02_04_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV02_04_QMD_RESERVED_S = (1599, 1585) +NVC6C0_QMDV02_04_HW_ONLY_INNER_GET = (1630, 1600) +NVC6C0_QMDV02_04_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1631, 1631) +NVC6C0_QMDV02_04_HW_ONLY_INNER_PUT = (1662, 1632) +NVC6C0_QMDV02_04_HW_ONLY_SCG_TYPE = (1663, 1663) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1693, 1664) +NVC6C0_QMDV02_04_QMD_RESERVED_Q = (1694, 1694) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1695, 1695) +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV02_04_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV02_04_HW_ONLY_SKED_NEXT_QMD_POINTER = (1727, 1696) +NVC6C0_QMDV02_04_HW_ONLY_DEPENDENCE_COUNTER = (1734, 1728) +NVC6C0_QMDV02_04_QMD_RESERVED_I = (1759, 1735) +NVC6C0_QMDV02_04_QMD_SPARE_H = (1791, 1760) +NVC6C0_QMDV02_04_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV02_04_QMD_SPARE_J = (1855, 1824) +NVC6C0_QMDV02_04_QMD_SPARE_K = (1887, 1856) +NVC6C0_QMDV02_04_QMD_SPARE_L = (1919, 1888) +NVC6C0_QMDV02_04_QMD_SPARE_M = (1951, 1920) +NVC6C0_QMDV02_04_QMD_SPARE_N = (1983, 1952) +NVC6C0_QMDV02_04_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV02_04_DEBUG_ID_LOWER = (2047, 2016) +NVC6C0_QMDV03_00_OUTER_PUT = (30, 0) +NVC6C0_QMDV03_00_OUTER_OVERFLOW = (31, 31) +NVC6C0_QMDV03_00_OUTER_GET = (62, 32) +NVC6C0_QMDV03_00_OUTER_STICKY_OVERFLOW = (63, 63) +NVC6C0_QMDV03_00_INNER_GET = (94, 64) +NVC6C0_QMDV03_00_INNER_OVERFLOW = (95, 95) +NVC6C0_QMDV03_00_INNER_PUT = (126, 96) +NVC6C0_QMDV03_00_INNER_STICKY_OVERFLOW = (127, 127) +NVC6C0_QMDV03_00_QMD_GROUP_ID = (133, 128) +NVC6C0_QMDV03_00_SM_GLOBAL_CACHING_ENABLE = (134, 134) +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION = (135, 135) +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RUN_CTA_IN_ONE_SM_PARTITION_TRUE = 0x00000001 +NVC6C0_QMDV03_00_IS_QUEUE = (136, 136) +NVC6C0_QMDV03_00_IS_QUEUE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_IS_QUEUE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (137, 137) +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVC6C0_QMDV03_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04A = (139, 138) +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS = (140, 140) +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVC6C0_QMDV03_00_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04B = (141, 141) +NVC6C0_QMDV03_00_DEPENDENCE_COUNTER = (157, 142) +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION = (158, 158) +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED04C = (159, 159) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_SIZE = (184, 160) +NVC6C0_QMDV03_00_DEMOTE_L2_EVICT_LAST = (185, 185) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE = (186, 186) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE = (187, 187) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE = (188, 188) +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE = (189, 189) +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE = (190, 190) +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE = (191, 191) +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CTA_RASTER_WIDTH_RESUME = (223, 192) +NVC6C0_QMDV03_00_CTA_RASTER_HEIGHT_RESUME = (239, 224) +NVC6C0_QMDV03_00_CTA_RASTER_DEPTH_RESUME = (255, 240) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (287, 256) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ADDR_LOWER = (319, 288) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ADDR_UPPER = (327, 320) +NVC6C0_QMDV03_00_QMD_RESERVED_D = (335, 328) +NVC6C0_QMDV03_00_CIRCULAR_QUEUE_ENTRY_SIZE = (351, 336) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_ID = (357, 352) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (365, 358) +NVC6C0_QMDV03_00_QMD_RESERVED11A = (366, 366) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE = (367, 367) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE = (369, 368) +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS = (370, 370) +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE = (371, 371) +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED11B = (377, 372) +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT = (378, 378) +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVC6C0_QMDV03_00_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVC6C0_QMDV03_00_QMD_RESERVED11C = (381, 379) +NVC6C0_QMDV03_00_SAMPLER_INDEX = (382, 382) +NVC6C0_QMDV03_00_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVC6C0_QMDV03_00_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE = (383, 383) +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CTA_RASTER_WIDTH = (415, 384) +NVC6C0_QMDV03_00_CTA_RASTER_HEIGHT = (431, 416) +NVC6C0_QMDV03_00_CTA_RASTER_DEPTH = (463, 448) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_POINTER = (511, 480) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE = (512, 512) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION = (515, 513) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH = (516, 516) +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE = (517, 517) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION = (520, 518) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH = (521, 521) +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVC6C0_QMDV03_00_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVC6C0_QMDV03_00_COALESCE_WAITING_PERIOD = (529, 522) +NVC6C0_QMDV03_00_QUEUE_ENTRIES_PER_CTA_LOG2 = (534, 530) +NVC6C0_QMDV03_00_SHARED_MEMORY_SIZE = (561, 544) +NVC6C0_QMDV03_00_MIN_SM_CONFIG_SHARED_MEM_SIZE = (567, 562) +NVC6C0_QMDV03_00_QMD_RESERVED17A = (568, 568) +NVC6C0_QMDV03_00_MAX_SM_CONFIG_SHARED_MEM_SIZE = (574, 569) +NVC6C0_QMDV03_00_QMD_RESERVED17B = (575, 575) +NVC6C0_QMDV03_00_QMD_VERSION = (579, 576) +NVC6C0_QMDV03_00_QMD_MAJOR_VERSION = (583, 580) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION0 = (607, 592) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION1 = (623, 608) +NVC6C0_QMDV03_00_CTA_THREAD_DIMENSION2 = (639, 624) +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID = lambda i: ((640+(i)*1), (640+(i)*1)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVC6C0_QMDV03_00_REGISTER_COUNT_V = (656, 648) +NVC6C0_QMDV03_00_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (662, 657) +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE = (663, 663) +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_FREE_CTA_SLOTS_EMPTY_SM = (671, 664) +NVC6C0_QMDV03_00_SM_DISABLE_MASK_LOWER = (703, 672) +NVC6C0_QMDV03_00_SM_DISABLE_MASK_UPPER = (735, 704) +NVC6C0_QMDV03_00_SHADER_LOCAL_MEMORY_LOW_SIZE = (759, 736) +NVC6C0_QMDV03_00_BARRIER_COUNT = (767, 763) +NVC6C0_QMDV03_00_RELEASE0_ADDRESS_LOWER = (799, 768) +NVC6C0_QMDV03_00_RELEASE0_ADDRESS_UPPER = (807, 800) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED25A = (818, 808) +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE = (819, 819) +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP = (822, 820) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE0_ENABLE = (823, 823) +NVC6C0_QMDV03_00_RELEASE0_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT = (825, 824) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE = (826, 826) +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE = (828, 827) +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B = (829, 829) +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE = (831, 830) +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE0_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD_LOWER = (863, 832) +NVC6C0_QMDV03_00_RELEASE0_PAYLOAD_UPPER = (895, 864) +NVC6C0_QMDV03_00_RELEASE1_ADDRESS_LOWER = (927, 896) +NVC6C0_QMDV03_00_RELEASE1_ADDRESS_UPPER = (935, 928) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED29A = (946, 936) +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE = (947, 947) +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP = (950, 948) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE1_ENABLE = (951, 951) +NVC6C0_QMDV03_00_RELEASE1_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT = (953, 952) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE = (954, 954) +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE = (956, 955) +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B = (957, 957) +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE = (959, 958) +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE1_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD_LOWER = (991, 960) +NVC6C0_QMDV03_00_RELEASE1_PAYLOAD_UPPER = (1023, 992) +NVC6C0_QMDV03_00_CONSTANT_BUFFER_ADDR_LOWER = lambda i: ((1055+(i)*64), (1024+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_ADDR_UPPER = lambda i: ((1072+(i)*64), (1056+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST = lambda i: ((1073+(i)*64), (1073+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_PREFETCH_POST_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1074+(i)*64), (1074+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1087+(i)*64), (1075+(i)*64)) # type: ignore +NVC6C0_QMDV03_00_PROGRAM_ADDRESS_LOWER = (1567, 1536) +NVC6C0_QMDV03_00_PROGRAM_ADDRESS_UPPER = (1584, 1568) +NVC6C0_QMDV03_00_SHADER_LOCAL_MEMORY_HIGH_SIZE = (1623, 1600) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1640, 1632) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_SIZE = (1649, 1641) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE = (1651, 1650) +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVC6C0_QMDV03_00_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVC6C0_QMDV03_00_SASS_VERSION = (1663, 1656) +NVC6C0_QMDV03_00_RELEASE2_ADDRESS_LOWER = (1695, 1664) +NVC6C0_QMDV03_00_RELEASE2_ADDRESS_UPPER = (1703, 1696) +NVC6C0_QMDV03_00_SEMAPHORE_RESERVED53A = (1714, 1704) +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE = (1715, 1715) +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP = (1718, 1716) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_QMDV03_00_RELEASE2_ENABLE = (1719, 1719) +NVC6C0_QMDV03_00_RELEASE2_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT = (1721, 1720) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE = (1722, 1722) +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE = (1724, 1723) +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_NONE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_TRAP = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_NON_BLOCKING_INTR_TYPE_CONDITIONAL_TRAP = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B = (1725, 1725) +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B_FALSE = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD64B_TRUE = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE = (1727, 1726) +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVC6C0_QMDV03_00_RELEASE2_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD_LOWER = (1759, 1728) +NVC6C0_QMDV03_00_RELEASE2_PAYLOAD_UPPER = (1791, 1760) +NVC6C0_QMDV03_00_QMD_SPARE_I = (1823, 1792) +NVC6C0_QMDV03_00_HW_ONLY_INNER_GET = (1854, 1824) +NVC6C0_QMDV03_00_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (1855, 1855) +NVC6C0_QMDV03_00_HW_ONLY_INNER_PUT = (1886, 1856) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX = (1917, 1888) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (1919, 1919) +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVC6C0_QMDV03_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVC6C0_QMDV03_00_HW_ONLY_SKED_NEXT_QMD_POINTER = (1951, 1920) +NVC6C0_QMDV03_00_HW_ONLY_DEPENDENCE_COUNTER = (1958, 1952) +NVC6C0_QMDV03_00_DEBUG_ID_UPPER = (2015, 1984) +NVC6C0_QMDV03_00_DEBUG_ID_LOWER = (2047, 2016) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX = (29, 0) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (30, 30) +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (31, 31) +NVCEC0_QMDV05_00_HW_ONLY_SKED_NEXT_QMD_POINTER = (63, 32) +NVCEC0_QMDV05_00_INNER_GET = (94, 64) +NVCEC0_QMDV05_00_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV05_00_INNER_PUT = (126, 96) +NVCEC0_QMDV05_00_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV05_00_DEPENDENCE_COUNTER = (143, 128) +NVCEC0_QMDV05_00_QMD_GROUP_ID = (149, 144) +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (150, 150) +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV05_00_QMD_TYPE = (153, 151) +NVCEC0_QMDV05_00_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV05_00_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV05_00_NUM_SUB_TASKS_PER_TASK = (157, 154) +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS = (158, 158) +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV05_00_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID = (159, 159) +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CIRCULAR_QUEUE_SIZE = (184, 160) +NVCEC0_QMDV05_00_HW_ONLY_DEPENDENCE_COUNTER = (207, 192) +NVCEC0_QMDV05_00_RESUME_SUB_TASK_ID = (210, 208) +NVCEC0_QMDV05_00_COMPLETED_SUB_TASK_MASK = (218, 211) +NVCEC0_QMDV05_00_GRID_WIDTH_RESUME = (255, 224) +NVCEC0_QMDV05_00_GRID_HEIGHT_RESUME = (271, 256) +NVCEC0_QMDV05_00_GRID_DEPTH_RESUME = (287, 272) +NVCEC0_QMDV05_00_RELEASE_ENABLE = lambda i: ((288+(i)*16), (288+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE0_ENABLE = NVCEC0_QMDV05_00_RELEASE_ENABLE(0) +NVCEC0_QMDV05_00_RELEASE1_ENABLE = NVCEC0_QMDV05_00_RELEASE_ENABLE(1) +NVCEC0_QMDV05_00_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE = lambda i: ((290+(i)*16), (289+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE = lambda i: ((291+(i)*16), (291+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE = lambda i: ((292+(i)*16), (292+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP = lambda i: ((295+(i)*16), (293+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT = lambda i: ((297+(i)*16), (296+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE = lambda i: ((299+(i)*16), (298+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV05_00_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B = lambda i: ((300+(i)*16), (300+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV05_00_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_RESERVED_INFO = lambda i: ((303+(i)*16), (301+(i)*16)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE = (336, 336) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION = (339, 337) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH = (340, 340) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION = (341, 341) +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV05_00_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST = (342, 342) +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE = (343, 343) +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE = (344, 344) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION = (347, 345) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH = (348, 348) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL = (349, 349) +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE = (350, 350) +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE = (351, 351) +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CORRELATION_ID = (383, 352) +NVCEC0_QMDV05_00_DEPENDENT_QMD0_POINTER = (415, 384) +NVCEC0_QMDV05_00_DEPENDENT_QMD1_POINTER = (447, 416) +NVCEC0_QMDV05_00_SASS_VERSION = (455, 448) +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT = (456, 456) +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV05_00_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV05_00_SAMPLER_INDEX = (457, 457) +NVCEC0_QMDV05_00_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV05_00_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BANK_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (463, 458) +NVCEC0_QMDV05_00_QMD_MINOR_VERSION = (467, 464) +NVCEC0_QMDV05_00_QMD_MAJOR_VERSION = (471, 468) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE = (472, 472) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE = (473, 473) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE = (474, 474) +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE = (475, 475) +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE = (476, 476) +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE = (477, 477) +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (478, 478) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (479, 479) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_ADDR_LOWER = (511, 480) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_ADDR_UPPER = (536, 512) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (575, 544) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (607, 576) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (615, 608) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_ID = (621, 616) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE = (622, 622) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE = (623, 623) +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE = (625, 624) +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_00_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE = (626, 626) +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CTA_LAUNCH_QUEUE = (627, 627) +NVCEC0_QMDV05_00_FREE_CTA_SLOTS_EMPTY_SM = (635, 628) +NVCEC0_QMDV05_00_SYNC_DOMAIN_ID = (637, 636) +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH = (638, 638) +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT = (639, 639) +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_ID = (671, 640) +NVCEC0_QMDV05_00_WAIT_ON_LATCH_ID = (703, 672) +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_SHARED_MEM = (721, 714) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_SHARED_MEM = (729, 722) +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID = (730, 730) +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_ARRIVE_AT_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID = (731, 731) +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_WAIT_ON_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE = (732, 732) +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_LATCH_RELEASE_INVALIDATE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE = (733, 733) +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE = (734, 734) +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE = (735, 735) +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_WARP = (743, 736) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_WARP = (751, 744) +NVCEC0_QMDV05_00_OCCUPANCY_THRESHOLD_REGISTER = (759, 752) +NVCEC0_QMDV05_00_OCCUPANCY_MAX_REGISTER = (767, 760) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_ADDR_LOWER = (799, 768) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_ADDR_UPPER = (824, 800) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_PAYLOAD_LOWER = (863, 832) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE1_PAYLOAD_UPPER = (895, 864) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_ADDR_LOWER = (927, 896) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_ADDR_UPPER = (952, 928) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_PAYLOAD_LOWER = (991, 960) +NVCEC0_QMDV05_00_RELEASE_SEMAPHORE2_PAYLOAD_UPPER = (1023, 992) +NVCEC0_QMDV05_00_PROGRAM_ADDRESS_LOWER_SHIFTED4 = (1055, 1024) +NVCEC0_QMDV05_00_PROGRAM_ADDRESS_UPPER_SHIFTED4 = (1076, 1056) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_SIZE = (1085, 1077) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE = (1087, 1086) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION0 = (1103, 1088) +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION1 = (1119, 1104) +NVCEC0_QMDV05_00_CTA_THREAD_DIMENSION2 = (1127, 1120) +NVCEC0_QMDV05_00_REGISTER_COUNT = (1136, 1128) +NVCEC0_QMDV05_00_BARRIER_COUNT = (1141, 1137) +NVCEC0_QMDV05_00_ICC_PREFETCH_SIZE = (1147, 1142) +NVCEC0_QMDV05_00_SHARED_MEMORY_SIZE_SHIFTED7 = (1162, 1152) +NVCEC0_QMDV05_00_MIN_SM_CONFIG_SHARED_MEM_SIZE = (1168, 1163) +NVCEC0_QMDV05_00_MAX_SM_CONFIG_SHARED_MEM_SIZE = (1174, 1169) +NVCEC0_QMDV05_00_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (1180, 1175) +NVCEC0_QMDV05_00_SHARED_MEM_BARRIER_INIT_ENABLE = (1181, 1181) +NVCEC0_QMDV05_00_SHADER_LOCAL_MEMORY_LOW_SIZE_SHIFTED4 = (1199, 1184) +NVCEC0_QMDV05_00_SHADER_LOCAL_MEMORY_HIGH_SIZE_SHIFTED4 = (1215, 1200) +NVCEC0_QMDV05_00_VIRTUAL_RESOURCE_COUNT = (1223, 1216) +NVCEC0_QMDV05_00_GRID_WIDTH = (1279, 1248) +NVCEC0_QMDV05_00_GRID_HEIGHT = (1295, 1280) +NVCEC0_QMDV05_00_GRID_DEPTH = (1327, 1312) +NVCEC0_QMDV05_00_CONSTANT_BUFFER_ADDR_LOWER_SHIFTED6 = lambda i: ((1375+(i)*64), (1344+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_ADDR_UPPER_SHIFTED6 = lambda i: ((1394+(i)*64), (1376+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1407+(i)*64), (1395+(i)*64)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID = lambda i: ((1856+(i)*4), (1856+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH = lambda i: ((1858+(i)*4), (1857+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE = lambda i: ((1859+(i)*4), (1859+(i)*4)) # type: ignore +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (1919, 1888) +NVCEC0_QMDV05_00_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1936, 1920) +NVCEC0_QMDV05_00_GPC_CGA_WIDTH = (2053, 2048) +NVCEC0_QMDV05_00_GPC_CGA_HEIGHT = (2061, 2056) +NVCEC0_QMDV05_00_GPC_CGA_DEPTH = (2069, 2064) +NVCEC0_QMDV05_00_LARGE_GPC_CGA_WIDTH_MINUS_ONE = (2075, 2072) +NVCEC0_QMDV05_00_LARGE_GPC_CGA_HEIGHT_MINUS_ONE = (2079, 2076) +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE = (2111, 2111) +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE_LOAD_BALANCING = 0x00000000 +NVCEC0_QMDV05_00_CGA_CTA_DISTRIBUTION_MODE_MULTI_CAST = 0x00000001 +NVCEC0_QMDV05_00_GPU_CGA_WIDTH = (2127, 2112) +NVCEC0_QMDV05_00_GPU_CGA_HEIGHT = (2143, 2128) +NVCEC0_QMDV05_00_GPU_CGA_DEPTH = (2159, 2144) +NVCEC0_QMDV05_00_DEBUG_ID_LOWER = (2207, 2176) +NVCEC0_QMDV05_00_DEBUG_ID_UPPER = (2239, 2208) +NVCEC0_QMDV05_00_TPC_DISABLE_MASK = lambda i: ((2271+(i)*32), (2240+(i)*32)) # type: ignore +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_WIDTH_RESUME = (2527, 2496) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_HEIGHT_RESUME = (2543, 2528) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_BASE_DEPTH_RESUME = (2559, 2544) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_OFFSET_WIDTH_RESUME = (2563, 2560) +NVCEC0_QMDV05_00_INCOMPLETE_BOX_OFFSET_HEIGHT_RESUME = (2567, 2564) +NVCEC0_QMDV05_00_QUEUE_ENTRIES_PER_CTA_LOG2 = (2596, 2592) +NVCEC0_QMDV05_00_HW_ONLY_INNER_GET = (2654, 2624) +NVCEC0_QMDV05_00_HW_ONLY_INNER_PUT = (2686, 2656) +NVCEC0_QMDV05_00_OUTER_PUT = (3038, 3008) +NVCEC0_QMDV05_00_OUTER_OVERFLOW = (3039, 3039) +NVCEC0_QMDV05_00_OUTER_GET = (3070, 3040) +NVCEC0_QMDV05_00_OUTER_STICKY_OVERFLOW = (3071, 3071) +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE = lambda i: ((336+(i)*8), (336+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION = lambda i: ((339+(i)*8), (337+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_00_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH = lambda i: ((340+(i)*8), (340+(i)*8)) # type: ignore +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_00_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_00_DEPENDENT_QMD_POINTER = lambda i: ((415+(i)*32), (384+(i)*32)) # type: ignore +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX = (29, 0) +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (30, 30) +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (31, 31) +NVCEC0_QMDV05_01_HW_ONLY_SKED_NEXT_QMD_POINTER = (63, 32) +NVCEC0_QMDV05_01_INNER_GET = (94, 64) +NVCEC0_QMDV05_01_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV05_01_INNER_PUT = (126, 96) +NVCEC0_QMDV05_01_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV05_01_DEPENDENCE_COUNTER = (143, 128) +NVCEC0_QMDV05_01_QMD_GROUP_ID = (149, 144) +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (150, 150) +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV05_01_QMD_TYPE = (153, 151) +NVCEC0_QMDV05_01_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV05_01_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV05_01_NUM_SUB_TASKS_PER_TASK = (157, 154) +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS = (158, 158) +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV05_01_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID = (159, 159) +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CIRCULAR_QUEUE_SIZE = (184, 160) +NVCEC0_QMDV05_01_HW_ONLY_DEPENDENCE_COUNTER = (207, 192) +NVCEC0_QMDV05_01_RESUME_SUB_TASK_ID = (210, 208) +NVCEC0_QMDV05_01_COMPLETED_SUB_TASK_MASK = (218, 211) +NVCEC0_QMDV05_01_GRID_WIDTH_RESUME = (255, 224) +NVCEC0_QMDV05_01_GRID_HEIGHT_RESUME = (271, 256) +NVCEC0_QMDV05_01_GRID_DEPTH_RESUME = (287, 272) +NVCEC0_QMDV05_01_RELEASE_ENABLE = lambda i: ((288+(i)*16), (288+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE = lambda i: ((290+(i)*16), (289+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE = lambda i: ((291+(i)*16), (291+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE = lambda i: ((292+(i)*16), (292+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP = lambda i: ((295+(i)*16), (293+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT = lambda i: ((297+(i)*16), (296+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE = lambda i: ((299+(i)*16), (298+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV05_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B = lambda i: ((300+(i)*16), (300+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV05_01_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_RESERVED_INFO = lambda i: ((303+(i)*16), (301+(i)*16)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE = (336, 336) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION = (339, 337) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH = (340, 340) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD0_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION = (341, 341) +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST = (342, 342) +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE = (343, 343) +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE = (344, 344) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION = (347, 345) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH = (348, 348) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD1_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL = (349, 349) +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE = (350, 350) +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE = (351, 351) +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CORRELATION_ID = (383, 352) +NVCEC0_QMDV05_01_DEPENDENT_QMD0_POINTER = (415, 384) +NVCEC0_QMDV05_01_DEPENDENT_QMD1_POINTER = (447, 416) +NVCEC0_QMDV05_01_SASS_VERSION = (455, 448) +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT = (456, 456) +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV05_01_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV05_01_SAMPLER_INDEX = (457, 457) +NVCEC0_QMDV05_01_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV05_01_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV05_01_CONSTANT_BANK_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (463, 458) +NVCEC0_QMDV05_01_QMD_MINOR_VERSION = (467, 464) +NVCEC0_QMDV05_01_QMD_MAJOR_VERSION = (471, 468) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE = (472, 472) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE = (473, 473) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE = (474, 474) +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE = (475, 475) +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE = (476, 476) +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE = (477, 477) +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (478, 478) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (479, 479) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_ADDR_LOWER = (511, 480) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_ADDR_UPPER = (536, 512) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (575, 544) +NVCEC0_QMDV05_01_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (607, 576) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (615, 608) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_ID = (621, 616) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE = (622, 622) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE = (623, 623) +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE = (625, 624) +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV05_01_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE = (626, 626) +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_ACQUIRE_INVALIDATE_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_CTA_LAUNCH_QUEUE = (627, 627) +NVCEC0_QMDV05_01_FREE_CTA_SLOTS_EMPTY_SM = (635, 628) +NVCEC0_QMDV05_01_SYNC_DOMAIN_ID = (637, 636) +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH = (638, 638) +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT = (639, 639) +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_ID = (671, 640) +NVCEC0_QMDV05_01_WAIT_ON_LATCH_ID = (703, 672) +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_SHARED_MEM = (721, 714) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_SHARED_MEM = (729, 722) +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID = (730, 730) +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_ARRIVE_AT_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID = (731, 731) +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_WAIT_ON_LATCH_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE = (732, 732) +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_LATCH_RELEASE_INVALIDATE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE = (733, 733) +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HOLD_CTA_LAUNCH_UNTIL_PARENT_LATCH_ACQUIRE_AND_CTA_COMPLETE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE = (734, 734) +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_HOLD_MEMBAR_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE = (735, 735) +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_PRIORITY_DEMOTE_UNTIL_LATCH_ACQUIRE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_WARP = (743, 736) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_WARP = (751, 744) +NVCEC0_QMDV05_01_OCCUPANCY_THRESHOLD_REGISTER = (759, 752) +NVCEC0_QMDV05_01_OCCUPANCY_MAX_REGISTER = (767, 760) +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_ADDRESS_LOWER_SHIFTED4 = lambda i: ((799+(i)*416), (768+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_ADDRESS_UPPER_SHIFTED4 = lambda i: ((820+(i)*416), (800+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_SIZE = lambda i: ((829+(i)*416), (821+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE = lambda i: ((831+(i)*416), (830+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION0 = lambda i: ((847+(i)*416), (832+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION1 = lambda i: ((863+(i)*416), (848+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CTA_THREAD_DIMENSION2 = lambda i: ((871+(i)*416), (864+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_REGISTER_COUNT = lambda i: ((880+(i)*416), (872+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_BARRIER_COUNT = lambda i: ((885+(i)*416), (881+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID = lambda i: ((886+(i)*416), (886+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH = lambda i: ((888+(i)*416), (887+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE = lambda i: ((889+(i)*416), (889+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_ICC_PREFETCH_SIZE = lambda i: ((895+(i)*416), (890+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHARED_MEMORY_SIZE_SHIFTED7 = lambda i: ((906+(i)*416), (896+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_MIN_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((912+(i)*416), (907+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_MAX_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((918+(i)*416), (913+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_TARGET_SM_CONFIG_SHARED_MEM_SIZE = lambda i: ((924+(i)*416), (919+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHARED_MEM_BARRIER_INIT_ENABLE = lambda i: ((925+(i)*416), (925+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHADER_LOCAL_MEMORY_LOW_SIZE_SHIFTED4 = lambda i: ((943+(i)*416), (928+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_SHADER_LOCAL_MEMORY_HIGH_SIZE_SHIFTED4 = lambda i: ((959+(i)*416), (944+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_ADDR_LOWER_SHIFTED6 = lambda i: ((991+(i)*416), (960+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_ADDR_UPPER_SHIFTED6 = lambda i: ((1010+(i)*416), (992+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK0_SIZE_SHIFTED4 = lambda i: ((1023+(i)*416), (1011+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_ADDR_LOWER_SHIFTED6 = lambda i: ((1055+(i)*416), (1024+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_ADDR_UPPER_SHIFTED6 = lambda i: ((1074+(i)*416), (1056+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_SIZE_SHIFTED4 = lambda i: ((1087+(i)*416), (1075+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID = lambda i: ((1088+(i)*416), (1088+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH = lambda i: ((1090+(i)*416), (1089+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE = lambda i: ((1091+(i)*416), (1091+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK1_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_VIRTUAL_RESOURCE_COUNT = lambda i: ((1099+(i)*416), (1092+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_WIDTH = lambda i: ((1151+(i)*416), (1120+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_HEIGHT = lambda i: ((1167+(i)*416), (1152+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_GRID_DEPTH = lambda i: ((1183+(i)*416), (1168+(i)*416)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE = lambda i: ((336+(i)*8), (336+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION = lambda i: ((339+(i)*8), (337+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV05_01_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH = lambda i: ((340+(i)*8), (340+(i)*8)) # type: ignore +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV05_01_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV05_01_DEPENDENT_QMD_POINTER = lambda i: ((415+(i)*32), (384+(i)*32)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID = lambda i,j: ((886+(i)*416+(j)*202), (886+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH = lambda i,j: ((888+(i)*416+(j)*202), (887+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE = lambda i,j: ((889+(i)*416+(j)*202), (889+(i)*416+(j)*202)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_ADDR_LOWER_SHIFTED6 = lambda i,j: ((991+(i)*416+(j)*64), (960+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_ADDR_UPPER_SHIFTED6 = lambda i,j: ((1010+(i)*416+(j)*64), (992+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV05_01_SUB_TASK_CONSTANT_BANK_SIZE_SHIFTED4 = lambda i,j: ((1023+(i)*416+(j)*64), (1011+(i)*416+(j)*64)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENCE_COUNTER = (15, 0) +NVCEC0_QMDV04_01_QMD_GROUP_ID = (21, 16) +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST = (22, 22) +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_FALSE = 0x00000000 +NVCEC0_QMDV04_01_ADD_TO_HEAD_OF_QMD_GROUP_LINKED_LIST_TRUE = 0x00000001 +NVCEC0_QMDV04_01_QMD_TYPE = (25, 23) +NVCEC0_QMDV04_01_QMD_TYPE_QUEUE = 0x00000000 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_NULL = 0x00000001 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_CTA = 0x00000002 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPC_CGA = 0x00000003 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPU_CGA = 0x00000004 +NVCEC0_QMDV04_01_QMD_TYPE_GRID_GPU_GPC_CGA = 0x00000005 +NVCEC0_QMDV04_01_ARRIVE_AT_LATCH_VALID = (28, 28) +NVCEC0_QMDV04_01_WAIT_ON_LATCH_VALID = (29, 29) +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS = (30, 30) +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS_FALSE = 0x00000000 +NVCEC0_QMDV04_01_REQUIRE_SCHEDULING_PCAS_TRUE = 0x00000001 +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID = (31, 31) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CIRCULAR_QUEUE_SIZE = (56, 32) +NVCEC0_QMDV04_01_INNER_GET = (94, 64) +NVCEC0_QMDV04_01_INNER_OVERFLOW = (95, 95) +NVCEC0_QMDV04_01_INNER_PUT = (126, 96) +NVCEC0_QMDV04_01_INNER_STICKY_OVERFLOW = (127, 127) +NVCEC0_QMDV04_01_HW_ONLY_INNER_GET = (190, 160) +NVCEC0_QMDV04_01_HW_ONLY_INNER_PUT = (222, 192) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX = (253, 224) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID = (254, 254) +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_HW_ONLY_SPAN_LIST_HEAD_INDEX_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_HW_ONLY_SKED_NEXT_QMD_POINTER = (287, 256) +NVCEC0_QMDV04_01_HW_ONLY_DEPENDENCE_COUNTER = (303, 288) +NVCEC0_QMDV04_01_HW_ONLY_REQUIRE_SCHEDULING_PCAS = (304, 304) +NVCEC0_QMDV04_01_RELEASE_ENABLE = lambda i: ((320+(i)*16), (320+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE = lambda i: ((322+(i)*16), (321+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE = lambda i: ((323+(i)*16), (323+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE_FE_NONE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_MEMBAR_TYPE_FE_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE = lambda i: ((324+(i)*16), (324+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP = lambda i: ((327+(i)*16), (325+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_INC = 0x00000003 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_AND = 0x00000005 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_OR = 0x00000006 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT = lambda i: ((329+(i)*16), (328+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE = lambda i: ((331+(i)*16), (330+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCEC0_QMDV04_01_RELEASE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B = lambda i: ((332+(i)*16), (332+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B_FALSE = 0x00000000 +NVCEC0_QMDV04_01_RELEASE_PAYLOAD64B_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_RESERVED_INFO = lambda i: ((335+(i)*16), (333+(i)*16)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE = lambda i: ((368+(i)*5), (368+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION = lambda i: ((371+(i)*5), (369+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_INCREMENT_PUT = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_SCHEDULE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCEC0_QMDV04_01_DEPENDENT_QMD_ACTION_QMD_DECREMENT_DEPENDENCE = 0x00000004 +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH = lambda i: ((372+(i)*5), (372+(i)*5)) # type: ignore +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEPENDENT_QMD_PREFETCH_TRUE = 0x00000001 +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION = (378, 378) +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SELF_COPY_ON_COMPLETION_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST = (379, 379) +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DEMOTE_L2_EVICT_LAST_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE = (380, 380) +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_DISABLE_AUTO_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL = (381, 381) +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CORRELATION_ID_INTERNAL_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE = (382, 382) +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_MEMBAR_TASK_CHASING_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CORRELATION_ID = (415, 384) +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID = lambda i: ((416+(i)*4), (416+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_VALID_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH = lambda i: ((418+(i)*4), (417+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_NONE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_PRE = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PREFETCH_POST = 0x00000002 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE = lambda i: ((419+(i)*4), (419+(i)*4)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_INVALIDATE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_DEPENDENT_QMD0_POINTER = (479, 448) +NVCEC0_QMDV04_01_DEPENDENT_QMD1_POINTER = (511, 480) +NVCEC0_QMDV04_01_SHADER_LOCAL_MEMORY_LOW_SIZE = (535, 512) +NVCEC0_QMDV04_01_SASS_VERSION = (543, 536) +NVCEC0_QMDV04_01_SHADER_LOCAL_MEMORY_HIGH_SIZE = (567, 544) +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT = (568, 568) +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT__32 = 0x00000000 +NVCEC0_QMDV04_01_API_VISIBLE_CALL_LIMIT_NO_CHECK = 0x00000001 +NVCEC0_QMDV04_01_SAMPLER_INDEX = (569, 569) +NVCEC0_QMDV04_01_SAMPLER_INDEX_INDEPENDENTLY = 0x00000000 +NVCEC0_QMDV04_01_SAMPLER_INDEX_VIA_HEADER_INDEX = 0x00000001 +NVCEC0_QMDV04_01_CONSTANT_BUFFER_PREFETCH_PRE_MAX_SIZE_SHIFTED8 = (575, 570) +NVCEC0_QMDV04_01_QMD_MINOR_VERSION = (579, 576) +NVCEC0_QMDV04_01_QMD_MAJOR_VERSION = (583, 580) +NVCEC0_QMDV04_01_SHARED_MEMORY_SIZE = (601, 584) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE = (602, 602) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_HEADER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE = (603, 603) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_SAMPLER_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE = (604, 604) +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE = (605, 605) +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE = (606, 606) +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_INSTRUCTION_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE = (607, 607) +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_INVALIDATE_SHADER_CONSTANT_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_MIN_SM_CONFIG_SHARED_MEM_SIZE = (613, 608) +NVCEC0_QMDV04_01_MAX_SM_CONFIG_SHARED_MEM_SIZE = (619, 614) +NVCEC0_QMDV04_01_TARGET_SM_CONFIG_SHARED_MEM_SIZE = (625, 620) +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE = (626, 626) +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SHARED_ALLOCATION_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_ADDR_LOWER = (671, 640) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_ADDR_UPPER = (696, 672) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_PAYLOAD_LOWER = (735, 704) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE0_PAYLOAD_UPPER = (767, 736) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_ADDR_LOWER = (799, 768) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_ADDR_UPPER = (824, 800) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_PAYLOAD_LOWER = (863, 832) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE1_PAYLOAD_UPPER = (895, 864) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_ADDR_LOWER = (927, 896) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_ADDR_UPPER = (952, 928) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_PAYLOAD_LOWER = (991, 960) +NVCEC0_QMDV04_01_RELEASE_SEMAPHORE2_PAYLOAD_UPPER = (1023, 992) +NVCEC0_QMDV04_01_GRID_WIDTH = (1055, 1024) +NVCEC0_QMDV04_01_GRID_HEIGHT = (1071, 1056) +NVCEC0_QMDV04_01_GRID_DEPTH = (1103, 1088) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DELTA_MINUS_ONE = (1127, 1120) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_ID = (1133, 1128) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE = (1134, 1134) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_INCR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE = (1135, 1135) +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_CWD_REFERENCE_COUNT_DECR_ENABLE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE = (1137, 1136) +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_NONE = 0x00000000 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_SYSMEMBAR = 0x00000001 +NVCEC0_QMDV04_01_CWD_MEMBAR_TYPE_L1_MEMBAR = 0x00000003 +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS = (1138, 1138) +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS_FALSE = 0x00000000 +NVCEC0_QMDV04_01_SEQUENTIALLY_RUN_CTAS_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CTA_LAUNCH_QUEUE = (1139, 1139) +NVCEC0_QMDV04_01_FREE_CTA_SLOTS_EMPTY_SM = (1147, 1140) +NVCEC0_QMDV04_01_SYNC_DOMAIN_ID = (1149, 1148) +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH = (1150, 1150) +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_FALSE = 0x00000000 +NVCEC0_QMDV04_01_PRE_EXIT_AT_LAST_CTA_LAUNCH_TRUE = 0x00000001 +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT = (1151, 1151) +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT_FALSE = 0x00000000 +NVCEC0_QMDV04_01_ENABLE_PROGRAM_PRE_EXIT_TRUE = 0x00000001 +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION0 = (1167, 1152) +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION1 = (1183, 1168) +NVCEC0_QMDV04_01_CTA_THREAD_DIMENSION2 = (1191, 1184) +NVCEC0_QMDV04_01_VIRTUAL_RESOURCE_COUNT = (1199, 1192) +NVCEC0_QMDV04_01_REGISTER_COUNT = (1208, 1200) +NVCEC0_QMDV04_01_SHARED_MEM_BARRIER_INIT_ENABLE = (1210, 1210) +NVCEC0_QMDV04_01_BARRIER_COUNT = (1215, 1211) +NVCEC0_QMDV04_01_PROGRAM_ADDRESS_LOWER = (1247, 1216) +NVCEC0_QMDV04_01_PROGRAM_ADDRESS_UPPER = (1272, 1248) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_WARP = (1287, 1280) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_WARP = (1295, 1288) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_REGISTER = (1303, 1296) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_REGISTER = (1311, 1304) +NVCEC0_QMDV04_01_OCCUPANCY_THRESHOLD_SHARED_MEM = (1319, 1312) +NVCEC0_QMDV04_01_OCCUPANCY_MAX_SHARED_MEM = (1327, 1320) +NVCEC0_QMDV04_01_ICC_PREFETCH_SIZE = (1333, 1328) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_ADDR_LOWER_SHIFTED = (1375, 1344) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_ADDR_UPPER_SHIFTED = (1392, 1376) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_SIZE = (1401, 1393) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE = (1403, 1402) +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE_PREFETCH_LAUNCH = 0x00000000 +NVCEC0_QMDV04_01_PROGRAM_PREFETCH_TYPE_PREFTECH_POST = 0x00000001 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE = (1406, 1406) +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_SHADER_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE = (1407, 1407) +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_FALSE = 0x00000000 +NVCEC0_QMDV04_01_LATCH_ACQUIRE_INVALIDATE_TEXTURE_DATA_CACHE_TRUE = 0x00000001 +NVCEC0_QMDV04_01_GRID_WIDTH_RESUME = (1439, 1408) +NVCEC0_QMDV04_01_GRID_HEIGHT_RESUME = (1455, 1440) +NVCEC0_QMDV04_01_GRID_DEPTH_RESUME = (1471, 1456) +NVCEC0_QMDV04_01_ARRIVE_AT_LATCH_ID = (1503, 1472) +NVCEC0_QMDV04_01_WAIT_ON_LATCH_ID = (1535, 1504) +NVCEC0_QMDV04_01_CONSTANT_BUFFER_ADDR_LOWER_SHIFTED6 = lambda i: ((1567+(i)*64), (1536+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_ADDR_UPPER_SHIFTED6 = lambda i: ((1586+(i)*64), (1568+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_CONSTANT_BUFFER_SIZE_SHIFTED4 = lambda i: ((1599+(i)*64), (1587+(i)*64)) # type: ignore +NVCEC0_QMDV04_01_COALESCE_WAITING_PERIOD = (2135, 2128) +NVCEC0_QMDV04_01_QUEUE_ENTRIES_PER_CTA_LOG2 = (2140, 2136) +NVCEC0_QMDV04_01_GPC_CGA_WIDTH = (2149, 2144) +NVCEC0_QMDV04_01_GPC_CGA_HEIGHT = (2157, 2152) +NVCEC0_QMDV04_01_GPC_CGA_DEPTH = (2165, 2160) +NVCEC0_QMDV04_01_LARGE_GPC_CGA_WIDTH_MINUS_ONE = (2171, 2168) +NVCEC0_QMDV04_01_LARGE_GPC_CGA_HEIGHT_MINUS_ONE = (2175, 2172) +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE = (2207, 2207) +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE_LOAD_BALANCING = 0x00000000 +NVCEC0_QMDV04_01_CGA_CTA_DISTRIBUTION_MODE_MULTI_CAST = 0x00000001 +NVCEC0_QMDV04_01_GPU_CGA_WIDTH = (2223, 2208) +NVCEC0_QMDV04_01_GPU_CGA_HEIGHT = (2239, 2224) +NVCEC0_QMDV04_01_GPU_CGA_DEPTH = (2255, 2240) +NVCEC0_QMDV04_01_DEBUG_ID_LOWER = (2399, 2368) +NVCEC0_QMDV04_01_DEBUG_ID_UPPER = (2431, 2400) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK = lambda i: ((2463+(i)*32), (2432+(i)*32)) # type: ignore +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_WIDTH_RESUME = (2591, 2560) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_HEIGHT_RESUME = (2607, 2592) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_BASE_DEPTH_RESUME = (2623, 2608) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_OFFSET_WIDTH_RESUME = (2627, 2624) +NVCEC0_QMDV04_01_INCOMPLETE_BOX_OFFSET_HEIGHT_RESUME = (2631, 2628) +NVCEC0_QMDV04_01_TPC_DISABLE_MASK_UPPER = lambda i: ((2719+(i)*32), (2688+(i)*32)) # type: ignore +NVCEC0_QMDV04_01_OUTER_PUT = (3038, 3008) +NVCEC0_QMDV04_01_OUTER_OVERFLOW = (3039, 3039) +NVCEC0_QMDV04_01_OUTER_GET = (3070, 3040) +NVCEC0_QMDV04_01_OUTER_STICKY_OVERFLOW = (3071, 3071) +ALIGN_UP = lambda v,n: (((v) + ((n)-1)) &~ ((n)-1)) # type: ignore +NVDEC_ALIGN = lambda value: ALIGN_UP(value,256) # type: ignore +NVDEC_MAX_MPEG2_SLICE = 65536 +NVDEC_CODEC_MPEG1 = 0 +NVDEC_CODEC_MPEG2 = 1 +NVDEC_CODEC_VC1 = 2 +NVDEC_CODEC_H264 = 3 +NVDEC_CODEC_MPEG4 = 4 +NVDEC_CODEC_DIVX = NVDEC_CODEC_MPEG4 +NVDEC_CODEC_VP8 = 5 +NVDEC_CODEC_HEVC = 7 +NVDEC_CODEC_VP9 = 9 +NVDEC_CODEC_HEVC_PARSER = 12 +NVDEC_CODEC_AV1 = 10 +AES_MODE_MASK = 0x7 +AES_CTS_MASK = 0x1 +AES_PADDING_TYPE_MASK = 0x7 +AES_UNWRAP_KEY_MASK = 0x1 +AES_MODE_SHIFT = 0 +AES_CTS_SHIFT = 3 +AES_PADDING_TYPE_SHIFT = 4 +AES_UNWRAP_KEY_SHIFT = 7 +AES_SET_FLAG = lambda M,C,P: ((M & AES_MODE_MASK) << AES_MODE_SHIFT) | ((C & AES_CTS_MASK) << AES_CTS_SHIFT) | ((P & AES_PADDING_TYPE_MASK) << AES_PADDING_TYPE_SHIFT) # type: ignore +DRM_MODE_MASK = 0x7f +AES_GET_DRM_MODE = lambda V: (V & DRM_MODE_MASK) # type: ignore +GIP_ASIC_VERT_FILTER_RAM_SIZE = 16 +GIP_ASIC_BSD_CTRL_RAM_SIZE = 4 +GIP_ASIC_SCALING_LIST_SIZE = (16*64) +GIP_ASIC_VERT_SAO_RAM_SIZE = 16 +GIP_ASIC_TILE_SIZE = ((20*22*2*2+16+15) & ~0xF) +GIP_ASIC_VP9_CTB_SEG_SIZE = 32 +HEVC_DBLK_TOP_SIZE_IN_SB16 = ALIGN_UP(632, 128) +HEVC_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,16)/16 + 2) * HEVC_DBLK_TOP_SIZE_IN_SB16) # type: ignore +HEVC_DBLK_LEFT_SIZE_IN_SB16 = ALIGN_UP(506, 128) +HEVC_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,16)/16 + 2) * HEVC_DBLK_LEFT_SIZE_IN_SB16) # type: ignore +HEVC_SAO_LEFT_SIZE_IN_SB16 = ALIGN_UP(713, 128) +HEVC_SAO_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,16)/16 + 2) * HEVC_SAO_LEFT_SIZE_IN_SB16) # type: ignore +VP9_DBLK_TOP_SIZE_IN_SB64 = ALIGN_UP(2000, 128) +VP9_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,64)/64 + 2) * VP9_DBLK_TOP_SIZE_IN_SB64) # type: ignore +VP9_DBLK_LEFT_SIZE_IN_SB64 = ALIGN_UP(1600, 128) +VP9_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * VP9_DBLK_LEFT_SIZE_IN_SB64) # type: ignore +VP9_HINT_DUMP_SIZE_IN_SB64 = ((64*64)/(4*4)*8) +VP9_HINT_DUMP_SIZE = lambda w,h: NVDEC_ALIGN(VP9_HINT_DUMP_SIZE_IN_SB64*((w+63)/64)*((h+63)/64)) # type: ignore +NUM_SUBSAMPLES = 32 +VP8_MAX_TOKEN_PARTITIONS = 8 +VP9_MAX_FRAMES_IN_SUPERFRAME = 8 +AV1_MAX_TILES = 256 +MAX_SUBSTREAM_ENTRY_SIZE = 32 +AV1_TEMPORAL_MV_SIZE_IN_64x64 = 256 +AV1_TEMPORAL_MV_BUF_SIZE = lambda w,h: ALIGN_UP( ALIGN_UP(w,128) * ALIGN_UP(h,128) / (64*64) * AV1_TEMPORAL_MV_SIZE_IN_64x64, 4096) # type: ignore +AV1_SEGMENT_ID_SIZE_IN_64x64 = 128 +AV1_SEGMENT_ID_BUF_SIZE = lambda w,h: ALIGN_UP( ALIGN_UP(w,128) * ALIGN_UP(h,128) / (64*64) * AV1_SEGMENT_ID_SIZE_IN_64x64, 4096) # type: ignore +AV1_GLOBAL_MOTION_BUF_SIZE = NVDEC_ALIGN(7*32) +AV1_INTRA_TOP_BUF_SIZE = NVDEC_ALIGN(8*8192) +AV1_HISTOGRAM_BUF_SIZE = NVDEC_ALIGN(1024) +AV1_DBLK_TOP_SIZE_IN_SB64 = ALIGN_UP(1920, 128) +AV1_DBLK_TOP_BUF_SIZE = lambda w: NVDEC_ALIGN( (ALIGN_UP(w,64)/64 + 2) * AV1_DBLK_TOP_SIZE_IN_SB64) # type: ignore +AV1_DBLK_LEFT_SIZE_IN_SB64 = ALIGN_UP(1536, 128) +AV1_DBLK_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_DBLK_LEFT_SIZE_IN_SB64) # type: ignore +AV1_CDEF_LEFT_SIZE_IN_SB64 = ALIGN_UP(1792, 128) +AV1_CDEF_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_CDEF_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HUS_LEFT_SIZE_IN_SB64 = ALIGN_UP(12544, 128) +AV1_ASIC_HUS_LEFT_BUFFER_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_HUS_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HUS_LEFT_BUF_SIZE = lambda h: 2*AV1_ASIC_HUS_LEFT_BUFFER_SIZE(h) # type: ignore +AV1_LR_LEFT_SIZE_IN_SB64 = ALIGN_UP(1920, 128) +AV1_LR_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_LR_LEFT_SIZE_IN_SB64) # type: ignore +AV1_FGS_LEFT_SIZE_IN_SB64 = ALIGN_UP(320, 128) +AV1_FGS_LEFT_BUF_SIZE = lambda h: NVDEC_ALIGN( (ALIGN_UP(h,64)/64 + 2) * AV1_FGS_LEFT_SIZE_IN_SB64) # type: ignore +AV1_HINT_DUMP_SIZE_IN_SB64 = ((64*64)/(4*4)*8) +AV1_HINT_DUMP_SIZE_IN_SB128 = ((128*128)/(4*4)*8) +AV1_HINT_DUMP_SIZE = lambda w,h: NVDEC_ALIGN(AV1_HINT_DUMP_SIZE_IN_SB128*((w+127)/128)*((h+127)/128)) # type: ignore +NVBIT = lambda b: (1<<(b)) # type: ignore +NVBIT32 = lambda b: NVBIT_TYPE(b, NvU32) # type: ignore +NVBIT64 = lambda b: NVBIT_TYPE(b, NvU64) # type: ignore +NV_BITMASK32_IDX = lambda chId: (((chId) & ~(0x1F)) >> 5) # type: ignore +NV_BITMASK32_OFFSET = lambda chId: ((chId) & (0x1F)) # type: ignore +NV_BITMASK32_GET = lambda pChannelMask,chId: ((pChannelMask)[NV_BITMASK32_IDX(chId)] & NVBIT(NV_BITMASK32_OFFSET(chId))) # type: ignore +DRF_SHIFT = lambda drf: ((DRF_ISBIT(0,drf)) % 32) # type: ignore +DRF_SHIFT_RT = lambda drf: ((DRF_ISBIT(1,drf)) % 32) # type: ignore +DRF_SIZE = lambda drf: (DRF_EXTENT(drf)-DRF_BASE(drf)+1) # type: ignore +DRF_MASK = lambda drf: (0xFFFFFFFF>>(31-((DRF_ISBIT(1,drf)) % 32)+((DRF_ISBIT(0,drf)) % 32))) # type: ignore +DRF_SHIFTMASK = lambda drf: (DRF_MASK(drf)<<(DRF_SHIFT(drf))) # type: ignore +DRF_SHIFT64 = lambda drf: ((DRF_ISBIT(0,drf)) % 64) # type: ignore +DRF_MASK64 = lambda drf: (NV_U64_MAX>>(63-((DRF_ISBIT(1,drf)) % 64)+((DRF_ISBIT(0,drf)) % 64))) # type: ignore +DRF_SHIFTMASK64 = lambda drf: (DRF_MASK64(drf)<<(DRF_SHIFT64(drf))) # type: ignore +FLD_TEST_DRF_NUM64 = lambda d,r,f,n,v: (DRF_VAL64(d, r, f, (v)) == (n)) # type: ignore +REF_VAL64 = lambda drf,v: (((NvU64)(v)>>DRF_SHIFT64(drf))&DRF_MASK64(drf)) # type: ignore +REF_NUM64 = lambda drf,n: (((NvU64)(n)&DRF_MASK64(drf))<>DRF_SHIFT(drf))&DRF_MASK(drf)) # type: ignore +REF_NUM = lambda drf,n: (((n)&DRF_MASK(drf))<>((31-(DRF_EXTENT_MW(drf))+(DRF_BASE_MW(drf)))%32)) # type: ignore +DRF_SHIFTMASK_MW = lambda drf: ((DRF_MASK_MW(drf))<<(DRF_SHIFT_MW(drf))) # type: ignore +DRF_SIZE_MW = lambda drf: (DRF_EXTENT_MW(drf)-DRF_BASE_MW(drf)+1) # type: ignore +DRF_WORD_MW_LOW = lambda drf: (DRF_PICK_MW(drf,0)/32) # type: ignore +DRF_WORD_MW_HIGH = lambda drf: (DRF_PICK_MW(drf,1)/32) # type: ignore +DRF_MASK_MW_LOW = lambda drf: (0xFFFFFFFF) # type: ignore +DRF_MASK_MW_HIGH = lambda drf: (0xFFFFFFFF>>(31-(DRF_EXTENT_MW(drf)))) # type: ignore +DRF_SHIFT_MW_LOW = lambda drf: (DRF_PICK_MW(drf,0)%32) # type: ignore +DRF_SHIFT_MW_HIGH = lambda drf: (0) # type: ignore +DRF_MERGE_SHIFT = lambda drf: ((32-((DRF_PICK_MW(drf,0)%32)))%32) # type: ignore +FLD_MERGE_MW = lambda drf,n,v: (((v)[DRF_WORD_MW(drf)] & ~DRF_SHIFTMASK_MW(drf)) | n) # type: ignore +FLD_IDX_MERGE_MW = lambda drf,i,n,v: (((v)[DRF_WORD_MW(drf(i))] & ~DRF_SHIFTMASK_MW(drf(i))) | n) # type: ignore +FLD_TEST_DRF_NUM_MW = lambda d,r,f,n,v: ((DRF_VAL_MW(d, r, f, (v)) == n)) # type: ignore +NV_TWO_N_MINUS_ONE = lambda n: (((1<<(n/2))<<((n+1)/2))-1) # type: ignore +LOWESTBIT = lambda x: ( (x) & (((x) - 1) ^ (x)) ) # type: ignore +NV_ANYSIZE_ARRAY = 1 +NV_CEIL = lambda a,b: (((a)+(b)-1)/(b)) # type: ignore +NV_DIV_AND_CEIL = lambda a,b: NV_CEIL(a,b) # type: ignore +NV_SIGN = lambda s: ((NvS8)(((s) > 0) - ((s) < 0))) # type: ignore +NV_ZERO_SIGN = lambda s: ((NvS8)((((s) >= 0) * 2) - 1)) # type: ignore +NV_UNSIGNED_ROUNDED_DIV = lambda a,b: (((a) + ((b) / 2)) / (b)) # type: ignore +NV_UNSIGNED_DIV_CEIL = lambda a,b: (((a) + (b - 1)) / (b)) # type: ignore +NV_ALIGN_DOWN = lambda v,gran: ((v) & ~((v) - (v) + (gran) - 1)) # type: ignore +NV_ALIGN_UP = lambda v,gran: (((v) + ((gran) - 1)) & ~((v) - (v) + (gran) - 1)) # type: ignore +NV_IS_ALIGNED = lambda v,gran: (0 == ((v) & ((gran) - 1))) # type: ignore +NV_BIT_GET = lambda k,x: (((x) >> (k)) & 1) # type: ignore +NV_ARRAY_ELEMENTS = lambda x: ((sizeof(x)/sizeof((x)[0]))) # type: ignore +BIT = lambda b: (1<<(b)) # type: ignore +NV01_NULL_OBJECT = (0x0) +NV1_NULL_OBJECT = NV01_NULL_OBJECT +NV01_ROOT = (0x0) +NV0000_ALLOC_PARAMETERS_MESSAGE_ID = (0x0000) +NV01_MEMORY_VIRTUAL = (0x70) +NV01_MEMORY_SYSTEM_DYNAMIC = (0x70) +NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS_MESSAGE_ID = (0x0070) +NV_MEMORY_VIRTUAL_SYSMEM_DYNAMIC_HVASPACE = 0xffffffff +NV01_DEVICE_0 = (0x80) +NV0080_ALLOC_PARAMETERS_MESSAGE_ID = (0x0080) +NV20_SUBDEVICE_0 = (0x2080) +NV2080_ALLOC_PARAMETERS_MESSAGE_ID = (0x2080) +NV2080_NOTIFIERS_SW = (0) +NV2080_NOTIFIERS_HOTPLUG = (1) +NV2080_NOTIFIERS_POWER_CONNECTOR = (2) +NV2080_NOTIFIERS_THERMAL_SW = (3) +NV2080_NOTIFIERS_THERMAL_HW = (4) +NV2080_NOTIFIERS_FULL_SCREEN_CHANGE = (5) +NV2080_NOTIFIERS_EVENTBUFFER = (6) +NV2080_NOTIFIERS_DP_IRQ = (7) +NV2080_NOTIFIERS_GR_DEBUG_INTR = (8) +NV2080_NOTIFIERS_PMU_EVENT = (9) +NV2080_NOTIFIERS_PMU_COMMAND = (10) +NV2080_NOTIFIERS_TIMER = (11) +NV2080_NOTIFIERS_GRAPHICS = (12) +NV2080_NOTIFIERS_PPP = (13) +NV2080_NOTIFIERS_VLD = (14) +NV2080_NOTIFIERS_NVDEC0 = NV2080_NOTIFIERS_VLD +NV2080_NOTIFIERS_NVDEC1 = (15) +NV2080_NOTIFIERS_NVDEC2 = (16) +NV2080_NOTIFIERS_NVDEC3 = (17) +NV2080_NOTIFIERS_NVDEC4 = (18) +NV2080_NOTIFIERS_NVDEC5 = (19) +NV2080_NOTIFIERS_NVDEC6 = (20) +NV2080_NOTIFIERS_NVDEC7 = (21) +NV2080_NOTIFIERS_PDEC = (22) +NV2080_NOTIFIERS_CE0 = (23) +NV2080_NOTIFIERS_CE1 = (24) +NV2080_NOTIFIERS_CE2 = (25) +NV2080_NOTIFIERS_CE3 = (26) +NV2080_NOTIFIERS_CE4 = (27) +NV2080_NOTIFIERS_CE5 = (28) +NV2080_NOTIFIERS_CE6 = (29) +NV2080_NOTIFIERS_CE7 = (30) +NV2080_NOTIFIERS_CE8 = (31) +NV2080_NOTIFIERS_CE9 = (32) +NV2080_NOTIFIERS_PSTATE_CHANGE = (33) +NV2080_NOTIFIERS_HDCP_STATUS_CHANGE = (34) +NV2080_NOTIFIERS_FIFO_EVENT_MTHD = (35) +NV2080_NOTIFIERS_PRIV_RING_HANG = (36) +NV2080_NOTIFIERS_RC_ERROR = (37) +NV2080_NOTIFIERS_MSENC = (38) +NV2080_NOTIFIERS_NVENC0 = NV2080_NOTIFIERS_MSENC +NV2080_NOTIFIERS_NVENC1 = (39) +NV2080_NOTIFIERS_NVENC2 = (40) +NV2080_NOTIFIERS_UNUSED_0 = (41) +NV2080_NOTIFIERS_ACPI_NOTIFY = (42) +NV2080_NOTIFIERS_COOLER_DIAG_ZONE = (43) +NV2080_NOTIFIERS_THERMAL_DIAG_ZONE = (44) +NV2080_NOTIFIERS_AUDIO_HDCP_REQUEST = (45) +NV2080_NOTIFIERS_WORKLOAD_MODULATION_CHANGE = (46) +NV2080_NOTIFIERS_GPIO_0_RISING_INTERRUPT = (47) +NV2080_NOTIFIERS_GPIO_1_RISING_INTERRUPT = (48) +NV2080_NOTIFIERS_GPIO_2_RISING_INTERRUPT = (49) +NV2080_NOTIFIERS_GPIO_3_RISING_INTERRUPT = (50) +NV2080_NOTIFIERS_GPIO_4_RISING_INTERRUPT = (51) +NV2080_NOTIFIERS_GPIO_5_RISING_INTERRUPT = (52) +NV2080_NOTIFIERS_GPIO_6_RISING_INTERRUPT = (53) +NV2080_NOTIFIERS_GPIO_7_RISING_INTERRUPT = (54) +NV2080_NOTIFIERS_GPIO_8_RISING_INTERRUPT = (55) +NV2080_NOTIFIERS_GPIO_9_RISING_INTERRUPT = (56) +NV2080_NOTIFIERS_GPIO_10_RISING_INTERRUPT = (57) +NV2080_NOTIFIERS_GPIO_11_RISING_INTERRUPT = (58) +NV2080_NOTIFIERS_GPIO_12_RISING_INTERRUPT = (59) +NV2080_NOTIFIERS_GPIO_13_RISING_INTERRUPT = (60) +NV2080_NOTIFIERS_GPIO_14_RISING_INTERRUPT = (61) +NV2080_NOTIFIERS_GPIO_15_RISING_INTERRUPT = (62) +NV2080_NOTIFIERS_GPIO_16_RISING_INTERRUPT = (63) +NV2080_NOTIFIERS_GPIO_17_RISING_INTERRUPT = (64) +NV2080_NOTIFIERS_GPIO_18_RISING_INTERRUPT = (65) +NV2080_NOTIFIERS_GPIO_19_RISING_INTERRUPT = (66) +NV2080_NOTIFIERS_GPIO_20_RISING_INTERRUPT = (67) +NV2080_NOTIFIERS_GPIO_21_RISING_INTERRUPT = (68) +NV2080_NOTIFIERS_GPIO_22_RISING_INTERRUPT = (69) +NV2080_NOTIFIERS_GPIO_23_RISING_INTERRUPT = (70) +NV2080_NOTIFIERS_GPIO_24_RISING_INTERRUPT = (71) +NV2080_NOTIFIERS_GPIO_25_RISING_INTERRUPT = (72) +NV2080_NOTIFIERS_GPIO_26_RISING_INTERRUPT = (73) +NV2080_NOTIFIERS_GPIO_27_RISING_INTERRUPT = (74) +NV2080_NOTIFIERS_GPIO_28_RISING_INTERRUPT = (75) +NV2080_NOTIFIERS_GPIO_29_RISING_INTERRUPT = (76) +NV2080_NOTIFIERS_GPIO_30_RISING_INTERRUPT = (77) +NV2080_NOTIFIERS_GPIO_31_RISING_INTERRUPT = (78) +NV2080_NOTIFIERS_GPIO_0_FALLING_INTERRUPT = (79) +NV2080_NOTIFIERS_GPIO_1_FALLING_INTERRUPT = (80) +NV2080_NOTIFIERS_GPIO_2_FALLING_INTERRUPT = (81) +NV2080_NOTIFIERS_GPIO_3_FALLING_INTERRUPT = (82) +NV2080_NOTIFIERS_GPIO_4_FALLING_INTERRUPT = (83) +NV2080_NOTIFIERS_GPIO_5_FALLING_INTERRUPT = (84) +NV2080_NOTIFIERS_GPIO_6_FALLING_INTERRUPT = (85) +NV2080_NOTIFIERS_GPIO_7_FALLING_INTERRUPT = (86) +NV2080_NOTIFIERS_GPIO_8_FALLING_INTERRUPT = (87) +NV2080_NOTIFIERS_GPIO_9_FALLING_INTERRUPT = (88) +NV2080_NOTIFIERS_GPIO_10_FALLING_INTERRUPT = (89) +NV2080_NOTIFIERS_GPIO_11_FALLING_INTERRUPT = (90) +NV2080_NOTIFIERS_GPIO_12_FALLING_INTERRUPT = (91) +NV2080_NOTIFIERS_GPIO_13_FALLING_INTERRUPT = (92) +NV2080_NOTIFIERS_GPIO_14_FALLING_INTERRUPT = (93) +NV2080_NOTIFIERS_GPIO_15_FALLING_INTERRUPT = (94) +NV2080_NOTIFIERS_GPIO_16_FALLING_INTERRUPT = (95) +NV2080_NOTIFIERS_GPIO_17_FALLING_INTERRUPT = (96) +NV2080_NOTIFIERS_GPIO_18_FALLING_INTERRUPT = (97) +NV2080_NOTIFIERS_GPIO_19_FALLING_INTERRUPT = (98) +NV2080_NOTIFIERS_GPIO_20_FALLING_INTERRUPT = (99) +NV2080_NOTIFIERS_GPIO_21_FALLING_INTERRUPT = (100) +NV2080_NOTIFIERS_GPIO_22_FALLING_INTERRUPT = (101) +NV2080_NOTIFIERS_GPIO_23_FALLING_INTERRUPT = (102) +NV2080_NOTIFIERS_GPIO_24_FALLING_INTERRUPT = (103) +NV2080_NOTIFIERS_GPIO_25_FALLING_INTERRUPT = (104) +NV2080_NOTIFIERS_GPIO_26_FALLING_INTERRUPT = (105) +NV2080_NOTIFIERS_GPIO_27_FALLING_INTERRUPT = (106) +NV2080_NOTIFIERS_GPIO_28_FALLING_INTERRUPT = (107) +NV2080_NOTIFIERS_GPIO_29_FALLING_INTERRUPT = (108) +NV2080_NOTIFIERS_GPIO_30_FALLING_INTERRUPT = (109) +NV2080_NOTIFIERS_GPIO_31_FALLING_INTERRUPT = (110) +NV2080_NOTIFIERS_ECC_SBE = (111) +NV2080_NOTIFIERS_ECC_DBE = (112) +NV2080_NOTIFIERS_STEREO_EMITTER_DETECTION = (113) +NV2080_NOTIFIERS_GC5_GPU_READY = (114) +NV2080_NOTIFIERS_SEC2 = (115) +NV2080_NOTIFIERS_GC6_REFCOUNT_INC = (116) +NV2080_NOTIFIERS_GC6_REFCOUNT_DEC = (117) +NV2080_NOTIFIERS_POWER_EVENT = (118) +NV2080_NOTIFIERS_CLOCKS_CHANGE = (119) +NV2080_NOTIFIERS_HOTPLUG_PROCESSING_COMPLETE = (120) +NV2080_NOTIFIERS_PHYSICAL_PAGE_FAULT = (121) +NV2080_NOTIFIERS_RESERVED122 = (122) +NV2080_NOTIFIERS_NVLINK_ERROR_FATAL = (123) +NV2080_NOTIFIERS_PRIV_REG_ACCESS_FAULT = (124) +NV2080_NOTIFIERS_NVLINK_ERROR_RECOVERY_REQUIRED = (125) +NV2080_NOTIFIERS_NVJPG = (126) +NV2080_NOTIFIERS_NVJPEG0 = NV2080_NOTIFIERS_NVJPG +NV2080_NOTIFIERS_NVJPEG1 = (127) +NV2080_NOTIFIERS_NVJPEG2 = (128) +NV2080_NOTIFIERS_NVJPEG3 = (129) +NV2080_NOTIFIERS_NVJPEG4 = (130) +NV2080_NOTIFIERS_NVJPEG5 = (131) +NV2080_NOTIFIERS_NVJPEG6 = (132) +NV2080_NOTIFIERS_NVJPEG7 = (133) +NV2080_NOTIFIERS_RUNLIST_AND_ENG_IDLE = (134) +NV2080_NOTIFIERS_RUNLIST_ACQUIRE = (135) +NV2080_NOTIFIERS_RUNLIST_ACQUIRE_AND_ENG_IDLE = (136) +NV2080_NOTIFIERS_RUNLIST_IDLE = (137) +NV2080_NOTIFIERS_TSG_PREEMPT_COMPLETE = (138) +NV2080_NOTIFIERS_RUNLIST_PREEMPT_COMPLETE = (139) +NV2080_NOTIFIERS_CTXSW_TIMEOUT = (140) +NV2080_NOTIFIERS_INFOROM_ECC_OBJECT_UPDATED = (141) +NV2080_NOTIFIERS_NVTELEMETRY_REPORT_EVENT = (142) +NV2080_NOTIFIERS_DSTATE_XUSB_PPC = (143) +NV2080_NOTIFIERS_FECS_CTX_SWITCH = (144) +NV2080_NOTIFIERS_XUSB_PPC_CONNECTED = (145) +NV2080_NOTIFIERS_GR0 = NV2080_NOTIFIERS_GRAPHICS +NV2080_NOTIFIERS_GR1 = (146) +NV2080_NOTIFIERS_GR2 = (147) +NV2080_NOTIFIERS_GR3 = (148) +NV2080_NOTIFIERS_GR4 = (149) +NV2080_NOTIFIERS_GR5 = (150) +NV2080_NOTIFIERS_GR6 = (151) +NV2080_NOTIFIERS_GR7 = (152) +NV2080_NOTIFIERS_OFA = (153) +NV2080_NOTIFIERS_OFA0 = NV2080_NOTIFIERS_OFA +NV2080_NOTIFIERS_DSTATE_HDA = (154) +NV2080_NOTIFIERS_POISON_ERROR_NON_FATAL = (155) +NV2080_NOTIFIERS_POISON_ERROR_FATAL = (156) +NV2080_NOTIFIERS_UCODE_RESET = (157) +NV2080_NOTIFIERS_PLATFORM_POWER_MODE_CHANGE = (158) +NV2080_NOTIFIERS_SMC_CONFIG_UPDATE = (159) +NV2080_NOTIFIERS_INFOROM_RRL_OBJECT_UPDATED = (160) +NV2080_NOTIFIERS_INFOROM_PBL_OBJECT_UPDATED = (161) +NV2080_NOTIFIERS_LPWR_DIFR_PREFETCH_REQUEST = (162) +NV2080_NOTIFIERS_SEC_FAULT_ERROR = (163) +NV2080_NOTIFIERS_UNUSED_1 = (164) +NV2080_NOTIFIERS_NVLINK_INFO_LINK_UP = (165) +NV2080_NOTIFIERS_CE10 = (166) +NV2080_NOTIFIERS_CE11 = (167) +NV2080_NOTIFIERS_CE12 = (168) +NV2080_NOTIFIERS_CE13 = (169) +NV2080_NOTIFIERS_CE14 = (170) +NV2080_NOTIFIERS_CE15 = (171) +NV2080_NOTIFIERS_CE16 = (172) +NV2080_NOTIFIERS_CE17 = (173) +NV2080_NOTIFIERS_CE18 = (174) +NV2080_NOTIFIERS_CE19 = (175) +NV2080_NOTIFIERS_NVLINK_INFO_LINK_DOWN = (176) +NV2080_NOTIFIERS_NVPCF_EVENTS = (177) +NV2080_NOTIFIERS_HDMI_FRL_RETRAINING_REQUEST = (178) +NV2080_NOTIFIERS_OFA1 = (180) +NV2080_NOTIFIERS_AUX_POWER_EVENT = (181) +NV2080_NOTIFIERS_AUX_POWER_STATE_CHANGE = (182) +NV2080_NOTIFIERS_NVENC3 = (183) +NV2080_NOTIFIERS_GSP_PERF_TRACE = (184) +NV2080_NOTIFIERS_INBAND_RESPONSE = (185) +NV2080_NOTIFIERS_RESERVED_186 = (186) +NV2080_NOTIFIERS_ECC_SBE_STORM = (187) +NV2080_NOTIFIERS_DRAM_RETIREMENT_EVENT = (188) +NV2080_NOTIFIERS_DRAM_RETIREMENT_FAILURE = (189) +NV2080_NOTIFIERS_NVLINK_UNCONTAINED_ERROR = (190) +NV2080_NOTIFIERS_GPU_UNAVAILABLE = (191) +NV2080_NOTIFIERS_GPU_RECOVERY_ACTION = (192) +NV2080_NOTIFIERS_POWER_SUSPEND = (193) +NV2080_NOTIFIERS_POWER_RESUME = (194) +NV2080_NOTIFIERS_CTXSW_UCODE_ERROR = (195) +NV2080_NOTIFIERS_USE_GC6_REDUCED_THRESHOLD = (196) +NV2080_NOTIFIERS_GPU_RC_RESET = (197) +NV2080_NOTIFIERS_RESERVED_198 = (198) +NV2080_NOTIFIERS_INFOROM_BRL_OBJECT_UPDATED = (199) +NV2080_NOTIFIERS_MAXCOUNT = (200) +NV2080_NOTIFIERS_GR_IDX = lambda x: ((x) - NV2080_NOTIFIERS_GR0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_GR = lambda x: (((x) == NV2080_NOTIFIERS_GR0) or (((x) >= NV2080_NOTIFIERS_GR1) and ((x) <= NV2080_NOTIFIERS_GR7))) # type: ignore +NV2080_NOTIFIER_TYPE_IS_CE = lambda x: ((((x) >= NV2080_NOTIFIERS_CE0) and ((x) <= NV2080_NOTIFIERS_CE9)) or (((x) >= NV2080_NOTIFIERS_CE10) and ((x) <= NV2080_NOTIFIERS_CE19))) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVENC = lambda x: ((((x) >= NV2080_NOTIFIERS_NVENC0) and ((x) <= NV2080_NOTIFIERS_NVENC2)) or (((x) == NV2080_NOTIFIERS_NVENC3))) # type: ignore +NV2080_NOTIFIERS_NVDEC = lambda x: (NV2080_NOTIFIERS_NVDEC0 + (x)) # type: ignore +NV2080_NOTIFIERS_NVDEC_IDX = lambda x: ((x) - NV2080_NOTIFIERS_NVDEC0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVDEC = lambda x: (((x) >= NV2080_NOTIFIERS_NVDEC0) and ((x) <= NV2080_NOTIFIERS_NVDEC7)) # type: ignore +NV2080_NOTIFIERS_NVJPEG = lambda x: (NV2080_NOTIFIERS_NVJPEG0 + (x)) # type: ignore +NV2080_NOTIFIERS_NVJPEG_IDX = lambda x: ((x) - NV2080_NOTIFIERS_NVJPEG0) # type: ignore +NV2080_NOTIFIER_TYPE_IS_NVJPEG = lambda x: (((x) >= NV2080_NOTIFIERS_NVJPEG0) and ((x) <= NV2080_NOTIFIERS_NVJPEG7)) # type: ignore +NV2080_NOTIFIER_TYPE_IS_OFA = lambda x: (((x) == NV2080_NOTIFIERS_OFA0) or ((x) == NV2080_NOTIFIERS_OFA1)) # type: ignore +NV2080_NOTIFIERS_GPIO_RISING_INTERRUPT = lambda pin: (NV2080_NOTIFIERS_GPIO_0_RISING_INTERRUPT + (pin)) # type: ignore +NV2080_NOTIFIERS_GPIO_FALLING_INTERRUPT = lambda pin: (NV2080_NOTIFIERS_GPIO_0_FALLING_INTERRUPT + (pin)) # type: ignore +NV2080_SUBDEVICE_NOTIFICATION_STATUS_IN_PROGRESS = (0x8000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_BAD_ARGUMENT = (0x4000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_ERROR_INVALID_STATE = (0x2000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_ERROR_STATE_IN_USE = (0x1000) +NV2080_SUBDEVICE_NOTIFICATION_STATUS_DONE_SUCCESS = (0x0000) +NV2080_ENGINE_TYPE_NULL = (0x00000000) +NV2080_ENGINE_TYPE_GRAPHICS = (0x00000001) +NV2080_ENGINE_TYPE_GR0 = NV2080_ENGINE_TYPE_GRAPHICS +NV2080_ENGINE_TYPE_GR1 = (0x00000002) +NV2080_ENGINE_TYPE_GR2 = (0x00000003) +NV2080_ENGINE_TYPE_GR3 = (0x00000004) +NV2080_ENGINE_TYPE_GR4 = (0x00000005) +NV2080_ENGINE_TYPE_GR5 = (0x00000006) +NV2080_ENGINE_TYPE_GR6 = (0x00000007) +NV2080_ENGINE_TYPE_GR7 = (0x00000008) +NV2080_ENGINE_TYPE_COPY0 = (0x00000009) +NV2080_ENGINE_TYPE_COPY1 = (0x0000000a) +NV2080_ENGINE_TYPE_COPY2 = (0x0000000b) +NV2080_ENGINE_TYPE_COPY3 = (0x0000000c) +NV2080_ENGINE_TYPE_COPY4 = (0x0000000d) +NV2080_ENGINE_TYPE_COPY5 = (0x0000000e) +NV2080_ENGINE_TYPE_COPY6 = (0x0000000f) +NV2080_ENGINE_TYPE_COPY7 = (0x00000010) +NV2080_ENGINE_TYPE_COPY8 = (0x00000011) +NV2080_ENGINE_TYPE_COPY9 = (0x00000012) +NV2080_ENGINE_TYPE_BSP = (0x00000013) +NV2080_ENGINE_TYPE_NVDEC0 = NV2080_ENGINE_TYPE_BSP +NV2080_ENGINE_TYPE_NVDEC1 = (0x00000014) +NV2080_ENGINE_TYPE_NVDEC2 = (0x00000015) +NV2080_ENGINE_TYPE_NVDEC3 = (0x00000016) +NV2080_ENGINE_TYPE_NVDEC4 = (0x00000017) +NV2080_ENGINE_TYPE_NVDEC5 = (0x00000018) +NV2080_ENGINE_TYPE_NVDEC6 = (0x00000019) +NV2080_ENGINE_TYPE_NVDEC7 = (0x0000001a) +NV2080_ENGINE_TYPE_MSENC = (0x0000001b) +NV2080_ENGINE_TYPE_NVENC0 = NV2080_ENGINE_TYPE_MSENC +NV2080_ENGINE_TYPE_NVENC1 = (0x0000001c) +NV2080_ENGINE_TYPE_NVENC2 = (0x0000001d) +NV2080_ENGINE_TYPE_VP = (0x0000001e) +NV2080_ENGINE_TYPE_ME = (0x0000001f) +NV2080_ENGINE_TYPE_PPP = (0x00000020) +NV2080_ENGINE_TYPE_MPEG = (0x00000021) +NV2080_ENGINE_TYPE_SW = (0x00000022) +NV2080_ENGINE_TYPE_CIPHER = (0x00000023) +NV2080_ENGINE_TYPE_TSEC = NV2080_ENGINE_TYPE_CIPHER +NV2080_ENGINE_TYPE_VIC = (0x00000024) +NV2080_ENGINE_TYPE_MP = (0x00000025) +NV2080_ENGINE_TYPE_SEC2 = (0x00000026) +NV2080_ENGINE_TYPE_HOST = (0x00000027) +NV2080_ENGINE_TYPE_DPU = (0x00000028) +NV2080_ENGINE_TYPE_PMU = (0x00000029) +NV2080_ENGINE_TYPE_FBFLCN = (0x0000002a) +NV2080_ENGINE_TYPE_NVJPG = (0x0000002b) +NV2080_ENGINE_TYPE_NVJPEG0 = NV2080_ENGINE_TYPE_NVJPG +NV2080_ENGINE_TYPE_NVJPEG1 = (0x0000002c) +NV2080_ENGINE_TYPE_NVJPEG2 = (0x0000002d) +NV2080_ENGINE_TYPE_NVJPEG3 = (0x0000002e) +NV2080_ENGINE_TYPE_NVJPEG4 = (0x0000002f) +NV2080_ENGINE_TYPE_NVJPEG5 = (0x00000030) +NV2080_ENGINE_TYPE_NVJPEG6 = (0x00000031) +NV2080_ENGINE_TYPE_NVJPEG7 = (0x00000032) +NV2080_ENGINE_TYPE_OFA = (0x00000033) +NV2080_ENGINE_TYPE_OFA0 = NV2080_ENGINE_TYPE_OFA +NV2080_ENGINE_TYPE_COPY10 = (0x00000034) +NV2080_ENGINE_TYPE_COPY11 = (0x00000035) +NV2080_ENGINE_TYPE_COPY12 = (0x00000036) +NV2080_ENGINE_TYPE_COPY13 = (0x00000037) +NV2080_ENGINE_TYPE_COPY14 = (0x00000038) +NV2080_ENGINE_TYPE_COPY15 = (0x00000039) +NV2080_ENGINE_TYPE_COPY16 = (0x0000003a) +NV2080_ENGINE_TYPE_COPY17 = (0x0000003b) +NV2080_ENGINE_TYPE_COPY18 = (0x0000003c) +NV2080_ENGINE_TYPE_COPY19 = (0x0000003d) +NV2080_ENGINE_TYPE_OFA1 = (0x0000003e) +NV2080_ENGINE_TYPE_NVENC3 = (0x0000003f) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0 = (0x00000040) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY1 = (0x00000041) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY2 = (0x00000042) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY3 = (0x00000043) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY4 = (0x00000044) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY5 = (0x00000045) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY6 = (0x00000046) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY7 = (0x00000047) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY8 = (0x00000048) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY9 = (0x00000049) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY10 = (0x0000004a) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY11 = (0x0000004b) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY12 = (0x0000004c) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY13 = (0x0000004d) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY14 = (0x0000004e) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY15 = (0x0000004f) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY16 = (0x00000050) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY17 = (0x00000051) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY18 = (0x00000052) +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY19 = (0x00000053) +NV2080_ENGINE_TYPE_LAST = (0x00000054) +NV2080_ENGINE_TYPE_ALLENGINES = (0xffffffff) +NV2080_ENGINE_TYPE_COPY_SIZE = 64 +NV2080_ENGINE_TYPE_NVENC_SIZE = 4 +NV2080_ENGINE_TYPE_NVJPEG_SIZE = 8 +NV2080_ENGINE_TYPE_NVDEC_SIZE = 8 +NV2080_ENGINE_TYPE_GR_SIZE = 8 +NV2080_ENGINE_TYPE_OFA_SIZE = 2 +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY = lambda i: (NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0 + (i)) # type: ignore +NV2080_ENGINE_TYPE_IS_COMP_DECOMP_COPY = lambda i: (((i) >= NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0) and ((i) <= NV2080_ENGINE_TYPE_COMP_DECOMP_COPY19)) # type: ignore +NV2080_ENGINE_TYPE_COMP_DECOMP_COPY_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_COMP_DECOMP_COPY0) # type: ignore +NV2080_ENGINE_TYPE_IS_COPY = lambda i: ((((i) >= NV2080_ENGINE_TYPE_COPY0) and ((i) <= NV2080_ENGINE_TYPE_COPY9)) or (((i) >= NV2080_ENGINE_TYPE_COPY10) and ((i) <= NV2080_ENGINE_TYPE_COPY19))) # type: ignore +NV2080_ENGINE_TYPE_IS_NVENC = lambda i: ((((i) >= NV2080_ENGINE_TYPE_NVENC0) and ((i) <= NV2080_ENGINE_TYPE_NVENC2)) or (((i) == NV2080_ENGINE_TYPE_NVENC3))) # type: ignore +NV2080_ENGINE_TYPE_NVDEC = lambda i: (NV2080_ENGINE_TYPE_NVDEC0+(i)) # type: ignore +NV2080_ENGINE_TYPE_IS_NVDEC = lambda i: (((i) >= NV2080_ENGINE_TYPE_NVDEC0) and ((i) < NV2080_ENGINE_TYPE_NVDEC(NV2080_ENGINE_TYPE_NVDEC_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_NVDEC_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_NVDEC0) # type: ignore +NV2080_ENGINE_TYPE_NVJPEG = lambda i: (NV2080_ENGINE_TYPE_NVJPEG0+(i)) # type: ignore +NV2080_ENGINE_TYPE_IS_NVJPEG = lambda i: (((i) >= NV2080_ENGINE_TYPE_NVJPEG0) and ((i) < NV2080_ENGINE_TYPE_NVJPEG(NV2080_ENGINE_TYPE_NVJPEG_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_NVJPEG_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_NVJPEG0) # type: ignore +NV2080_ENGINE_TYPE_GR = lambda i: (NV2080_ENGINE_TYPE_GR0 + (i)) # type: ignore +NV2080_ENGINE_TYPE_IS_GR = lambda i: (((i) >= NV2080_ENGINE_TYPE_GR0) and ((i) < NV2080_ENGINE_TYPE_GR(NV2080_ENGINE_TYPE_GR_SIZE))) # type: ignore +NV2080_ENGINE_TYPE_GR_IDX = lambda i: ((i) - NV2080_ENGINE_TYPE_GR0) # type: ignore +NV2080_ENGINE_TYPE_IS_OFA = lambda i: (((i) == NV2080_ENGINE_TYPE_OFA0) or ((i) == NV2080_ENGINE_TYPE_OFA1)) # type: ignore +NV2080_ENGINE_TYPE_IS_VALID = lambda i: (((i) > (NV2080_ENGINE_TYPE_NULL)) and ((i) < (NV2080_ENGINE_TYPE_LAST))) # type: ignore +NV2080_CLIENT_TYPE_TEX = (0x00000001) +NV2080_CLIENT_TYPE_COLOR = (0x00000002) +NV2080_CLIENT_TYPE_DEPTH = (0x00000003) +NV2080_CLIENT_TYPE_DA = (0x00000004) +NV2080_CLIENT_TYPE_FE = (0x00000005) +NV2080_CLIENT_TYPE_SCC = (0x00000006) +NV2080_CLIENT_TYPE_WID = (0x00000007) +NV2080_CLIENT_TYPE_MSVLD = (0x00000008) +NV2080_CLIENT_TYPE_MSPDEC = (0x00000009) +NV2080_CLIENT_TYPE_MSPPP = (0x0000000a) +NV2080_CLIENT_TYPE_VIC = (0x0000000b) +NV2080_CLIENT_TYPE_ALLCLIENTS = (0xffffffff) +NV2080_GC5_EXIT_COMPLETE = (0x00000001) +NV2080_GC5_ENTRY_ABORTED = (0x00000002) +NV2080_PLATFORM_POWER_MODE_CHANGE_COMPLETION = (0x00000000) +NV2080_PLATFORM_POWER_MODE_CHANGE_ACPI_NOTIFICATION = (0x00000001) +NV2080_NOTIFICATION_STATUS_ERROR_PROTECTION_FAULT = (0x4000) +NV2080_TYPEDEF = Nv20Subdevice0 +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_INDEX = (7, 0) +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_MASK = (15, 8) +NV2080_PLATFORM_POWER_MODE_CHANGE_INFO_REASON = (23, 16) +AMPERE_CHANNEL_GPFIFO_A = (0x0000C56F) +NVC56F_NUMBER_OF_SUBCHANNELS = (8) +NVC56F_SET_OBJECT = (0x00000000) +NVC56F_SET_OBJECT_NVCLASS = (15, 0) +NVC56F_SET_OBJECT_ENGINE = (20, 16) +NVC56F_SET_OBJECT_ENGINE_SW = 0x0000001f +NVC56F_ILLEGAL = (0x00000004) +NVC56F_ILLEGAL_HANDLE = (31, 0) +NVC56F_NOP = (0x00000008) +NVC56F_NOP_HANDLE = (31, 0) +NVC56F_SEMAPHOREA = (0x00000010) +NVC56F_SEMAPHOREA_OFFSET_UPPER = (7, 0) +NVC56F_SEMAPHOREB = (0x00000014) +NVC56F_SEMAPHOREB_OFFSET_LOWER = (31, 2) +NVC56F_SEMAPHOREC = (0x00000018) +NVC56F_SEMAPHOREC_PAYLOAD = (31, 0) +NVC56F_SEMAPHORED = (0x0000001C) +NVC56F_SEMAPHORED_OPERATION = (4, 0) +NVC56F_SEMAPHORED_OPERATION_ACQUIRE = 0x00000001 +NVC56F_SEMAPHORED_OPERATION_RELEASE = 0x00000002 +NVC56F_SEMAPHORED_OPERATION_ACQ_GEQ = 0x00000004 +NVC56F_SEMAPHORED_OPERATION_ACQ_AND = 0x00000008 +NVC56F_SEMAPHORED_OPERATION_REDUCTION = 0x00000010 +NVC56F_SEMAPHORED_ACQUIRE_SWITCH = (12, 12) +NVC56F_SEMAPHORED_ACQUIRE_SWITCH_DISABLED = 0x00000000 +NVC56F_SEMAPHORED_ACQUIRE_SWITCH_ENABLED = 0x00000001 +NVC56F_SEMAPHORED_RELEASE_WFI = (20, 20) +NVC56F_SEMAPHORED_RELEASE_WFI_EN = 0x00000000 +NVC56F_SEMAPHORED_RELEASE_WFI_DIS = 0x00000001 +NVC56F_SEMAPHORED_RELEASE_SIZE = (24, 24) +NVC56F_SEMAPHORED_RELEASE_SIZE_16BYTE = 0x00000000 +NVC56F_SEMAPHORED_RELEASE_SIZE_4BYTE = 0x00000001 +NVC56F_SEMAPHORED_REDUCTION = (30, 27) +NVC56F_SEMAPHORED_REDUCTION_MIN = 0x00000000 +NVC56F_SEMAPHORED_REDUCTION_MAX = 0x00000001 +NVC56F_SEMAPHORED_REDUCTION_XOR = 0x00000002 +NVC56F_SEMAPHORED_REDUCTION_AND = 0x00000003 +NVC56F_SEMAPHORED_REDUCTION_OR = 0x00000004 +NVC56F_SEMAPHORED_REDUCTION_ADD = 0x00000005 +NVC56F_SEMAPHORED_REDUCTION_INC = 0x00000006 +NVC56F_SEMAPHORED_REDUCTION_DEC = 0x00000007 +NVC56F_SEMAPHORED_FORMAT = (31, 31) +NVC56F_SEMAPHORED_FORMAT_SIGNED = 0x00000000 +NVC56F_SEMAPHORED_FORMAT_UNSIGNED = 0x00000001 +NVC56F_NON_STALL_INTERRUPT = (0x00000020) +NVC56F_NON_STALL_INTERRUPT_HANDLE = (31, 0) +NVC56F_FB_FLUSH = (0x00000024) +NVC56F_FB_FLUSH_HANDLE = (31, 0) +NVC56F_MEM_OP_A = (0x00000028) +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_CLIENT_UNIT_ID = (5, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE = (5, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_GPC_ID = (10, 6) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE = (7, 6) +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_ALL_TLBS = 0 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_LINK_TLBS = 1 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_NON_LINK_TLBS = 2 +NVC56F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_RSVRVD = 3 +NVC56F_MEM_OP_A_TLB_INVALIDATE_CANCEL_MMU_ENGINE_ID = (6, 0) +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR = (11, 11) +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN = 0x00000001 +NVC56F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS = 0x00000000 +NVC56F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO = (31, 12) +NVC56F_MEM_OP_B = (0x0000002c) +NVC56F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI = (31, 0) +NVC56F_MEM_OP_C = (0x00000030) +NVC56F_MEM_OP_C_MEMBAR_TYPE = (2, 0) +NVC56F_MEM_OP_C_MEMBAR_TYPE_SYS_MEMBAR = 0x00000000 +NVC56F_MEM_OP_C_MEMBAR_TYPE_MEMBAR = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB = (0, 0) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC = (1, 1) +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY = (4, 2) +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START_ACK_ALL = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_TARGETED = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_GLOBAL = 0x00000004 +NVC56F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_VA_GLOBAL = 0x00000005 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE = (6, 5) +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_INTRANODE = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE = (9, 7) +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_READ = 0 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE = 1 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 2 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_RSVRVD = 3 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 4 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_ALL = 5 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE_AND_ATOMIC = 6 +NVC56F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ALL = 7 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL = (9, 7) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY = 0x00000001 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE0 = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE1 = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE2 = 0x00000004 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE3 = 0x00000005 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 = 0x00000006 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE5 = 0x00000007 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE = (11, 10) +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM = 0x00000000 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT = 0x00000002 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_NONCOHERENT = 0x00000003 +NVC56F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO = (31, 12) +NVC56F_MEM_OP_C_ACCESS_COUNTER_CLR_TARGETED_NOTIFY_TAG = (19, 0) +NVC56F_MEM_OP_D = (0x00000034) +NVC56F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI = (26, 0) +NVC56F_MEM_OP_D_OPERATION = (31, 27) +NVC56F_MEM_OP_D_OPERATION_MEMBAR = 0x00000005 +NVC56F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE = 0x00000009 +NVC56F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED = 0x0000000a +NVC56F_MEM_OP_D_OPERATION_L2_PEERMEM_INVALIDATE = 0x0000000d +NVC56F_MEM_OP_D_OPERATION_L2_SYSMEM_INVALIDATE = 0x0000000e +NVC56F_MEM_OP_B_OPERATION_L2_INVALIDATE_CLEAN_LINES = 0x0000000e +NVC56F_MEM_OP_D_OPERATION_L2_CLEAN_COMPTAGS = 0x0000000f +NVC56F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY = 0x00000010 +NVC56F_MEM_OP_D_OPERATION_L2_WAIT_FOR_SYS_PENDING_READS = 0x00000015 +NVC56F_MEM_OP_D_OPERATION_ACCESS_COUNTER_CLR = 0x00000016 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE = (1, 0) +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MIMC = 0x00000000 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MOMC = 0x00000001 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_ALL = 0x00000002 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_TARGETED = 0x00000003 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE = (2, 2) +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MIMC = 0x00000000 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MOMC = 0x00000001 +NVC56F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_BANK = (6, 3) +NVC56F_SET_REFERENCE = (0x00000050) +NVC56F_SET_REFERENCE_COUNT = (31, 0) +NVC56F_SEM_ADDR_LO = (0x0000005c) +NVC56F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC56F_SEM_ADDR_HI = (0x00000060) +NVC56F_SEM_ADDR_HI_OFFSET = (7, 0) +NVC56F_SEM_PAYLOAD_LO = (0x00000064) +NVC56F_SEM_PAYLOAD_LO_PAYLOAD = (31, 0) +NVC56F_SEM_PAYLOAD_HI = (0x00000068) +NVC56F_SEM_PAYLOAD_HI_PAYLOAD = (31, 0) +NVC56F_SEM_EXECUTE = (0x0000006c) +NVC56F_SEM_EXECUTE_OPERATION = (2, 0) +NVC56F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC56F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_STRICT_GEQ = 0x00000002 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_CIRC_GEQ = 0x00000003 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_AND = 0x00000004 +NVC56F_SEM_EXECUTE_OPERATION_ACQ_NOR = 0x00000005 +NVC56F_SEM_EXECUTE_OPERATION_REDUCTION = 0x00000006 +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG = (12, 12) +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG_EN = 0x00000001 +NVC56F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC56F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_RELEASE_WFI_EN = 0x00000001 +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC56F_SEM_EXECUTE_PAYLOAD_SIZE_64BIT = 0x00000001 +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP = (25, 25) +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP_DIS = 0x00000000 +NVC56F_SEM_EXECUTE_RELEASE_TIMESTAMP_EN = 0x00000001 +NVC56F_SEM_EXECUTE_REDUCTION = (30, 27) +NVC56F_SEM_EXECUTE_REDUCTION_IMIN = 0x00000000 +NVC56F_SEM_EXECUTE_REDUCTION_IMAX = 0x00000001 +NVC56F_SEM_EXECUTE_REDUCTION_IXOR = 0x00000002 +NVC56F_SEM_EXECUTE_REDUCTION_IAND = 0x00000003 +NVC56F_SEM_EXECUTE_REDUCTION_IOR = 0x00000004 +NVC56F_SEM_EXECUTE_REDUCTION_IADD = 0x00000005 +NVC56F_SEM_EXECUTE_REDUCTION_INC = 0x00000006 +NVC56F_SEM_EXECUTE_REDUCTION_DEC = 0x00000007 +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT = (31, 31) +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT_SIGNED = 0x00000000 +NVC56F_SEM_EXECUTE_REDUCTION_FORMAT_UNSIGNED = 0x00000001 +NVC56F_WFI = (0x00000078) +NVC56F_WFI_SCOPE = (0, 0) +NVC56F_WFI_SCOPE_CURRENT_SCG_TYPE = 0x00000000 +NVC56F_WFI_SCOPE_CURRENT_VEID = 0x00000000 +NVC56F_WFI_SCOPE_ALL = 0x00000001 +NVC56F_YIELD = (0x00000080) +NVC56F_YIELD_OP = (1, 0) +NVC56F_YIELD_OP_NOP = 0x00000000 +NVC56F_YIELD_OP_TSG = 0x00000003 +NVC56F_CLEAR_FAULTED = (0x00000084) +NVC56F_CLEAR_FAULTED_HANDLE = (30, 0) +NVC56F_CLEAR_FAULTED_TYPE = (31, 31) +NVC56F_CLEAR_FAULTED_TYPE_PBDMA_FAULTED = 0x00000000 +NVC56F_CLEAR_FAULTED_TYPE_ENG_FAULTED = 0x00000001 +NVC56F_GP_ENTRY__SIZE = 8 +NVC56F_GP_ENTRY0_FETCH = (0, 0) +NVC56F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC56F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC56F_GP_ENTRY0_GET = (31, 2) +NVC56F_GP_ENTRY0_OPERAND = (31, 0) +NVC56F_GP_ENTRY1_GET_HI = (7, 0) +NVC56F_GP_ENTRY1_LEVEL = (9, 9) +NVC56F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC56F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC56F_GP_ENTRY1_LENGTH = (30, 10) +NVC56F_GP_ENTRY1_SYNC = (31, 31) +NVC56F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC56F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC56F_GP_ENTRY1_OPCODE = (7, 0) +NVC56F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC56F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC56F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC56F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC56F_DMA_METHOD_ADDRESS_OLD = (12, 2) +NVC56F_DMA_METHOD_ADDRESS = (11, 0) +NVC56F_DMA_SUBDEVICE_MASK = (15, 4) +NVC56F_DMA_METHOD_SUBCHANNEL = (15, 13) +NVC56F_DMA_TERT_OP = (17, 16) +NVC56F_DMA_TERT_OP_GRP0_INC_METHOD = (0x00000000) +NVC56F_DMA_TERT_OP_GRP0_SET_SUB_DEV_MASK = (0x00000001) +NVC56F_DMA_TERT_OP_GRP0_STORE_SUB_DEV_MASK = (0x00000002) +NVC56F_DMA_TERT_OP_GRP0_USE_SUB_DEV_MASK = (0x00000003) +NVC56F_DMA_TERT_OP_GRP2_NON_INC_METHOD = (0x00000000) +NVC56F_DMA_METHOD_COUNT_OLD = (28, 18) +NVC56F_DMA_METHOD_COUNT = (28, 16) +NVC56F_DMA_IMMD_DATA = (28, 16) +NVC56F_DMA_SEC_OP = (31, 29) +NVC56F_DMA_SEC_OP_GRP0_USE_TERT = (0x00000000) +NVC56F_DMA_SEC_OP_INC_METHOD = (0x00000001) +NVC56F_DMA_SEC_OP_GRP2_USE_TERT = (0x00000002) +NVC56F_DMA_SEC_OP_NON_INC_METHOD = (0x00000003) +NVC56F_DMA_SEC_OP_IMMD_DATA_METHOD = (0x00000004) +NVC56F_DMA_SEC_OP_ONE_INC = (0x00000005) +NVC56F_DMA_SEC_OP_RESERVED6 = (0x00000006) +NVC56F_DMA_SEC_OP_END_PB_SEGMENT = (0x00000007) +NVC56F_DMA_INCR_ADDRESS = (11, 0) +NVC56F_DMA_INCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_INCR_COUNT = (28, 16) +NVC56F_DMA_INCR_OPCODE = (31, 29) +NVC56F_DMA_INCR_OPCODE_VALUE = (0x00000001) +NVC56F_DMA_INCR_DATA = (31, 0) +NVC56F_DMA_NONINCR_ADDRESS = (11, 0) +NVC56F_DMA_NONINCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_NONINCR_COUNT = (28, 16) +NVC56F_DMA_NONINCR_OPCODE = (31, 29) +NVC56F_DMA_NONINCR_OPCODE_VALUE = (0x00000003) +NVC56F_DMA_NONINCR_DATA = (31, 0) +NVC56F_DMA_ONEINCR_ADDRESS = (11, 0) +NVC56F_DMA_ONEINCR_SUBCHANNEL = (15, 13) +NVC56F_DMA_ONEINCR_COUNT = (28, 16) +NVC56F_DMA_ONEINCR_OPCODE = (31, 29) +NVC56F_DMA_ONEINCR_OPCODE_VALUE = (0x00000005) +NVC56F_DMA_ONEINCR_DATA = (31, 0) +NVC56F_DMA_NOP = (0x00000000) +NVC56F_DMA_IMMD_ADDRESS = (11, 0) +NVC56F_DMA_IMMD_SUBCHANNEL = (15, 13) +NVC56F_DMA_IMMD_DATA = (28, 16) +NVC56F_DMA_IMMD_OPCODE = (31, 29) +NVC56F_DMA_IMMD_OPCODE_VALUE = (0x00000004) +NVC56F_DMA_SET_SUBDEVICE_MASK_VALUE = (15, 4) +NVC56F_DMA_SET_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_SET_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000001) +NVC56F_DMA_STORE_SUBDEVICE_MASK_VALUE = (15, 4) +NVC56F_DMA_STORE_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_STORE_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000002) +NVC56F_DMA_USE_SUBDEVICE_MASK_OPCODE = (31, 16) +NVC56F_DMA_USE_SUBDEVICE_MASK_OPCODE_VALUE = (0x00000003) +NVC56F_DMA_ENDSEG_OPCODE = (31, 29) +NVC56F_DMA_ENDSEG_OPCODE_VALUE = (0x00000007) +NVC56F_DMA_ADDRESS = (12, 2) +NVC56F_DMA_SUBCH = (15, 13) +NVC56F_DMA_OPCODE3 = (17, 16) +NVC56F_DMA_OPCODE3_NONE = (0x00000000) +NVC56F_DMA_COUNT = (28, 18) +NVC56F_DMA_OPCODE = (31, 29) +NVC56F_DMA_OPCODE_METHOD = (0x00000000) +NVC56F_DMA_OPCODE_NONINC_METHOD = (0x00000002) +NVC56F_DMA_DATA = (31, 0) +HOPPER_CHANNEL_GPFIFO_A = (0x0000C86F) +NVC86F_SET_OBJECT = (0x00000000) +NVC86F_MEM_OP_A = (0x00000028) +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_CLIENT_UNIT_ID = (5, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE = (5, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_GPC_ID = (10, 6) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE = (7, 6) +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_ALL_TLBS = 0 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_LINK_TLBS = 1 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_NON_LINK_TLBS = 2 +NVC86F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_RSVRVD = 3 +NVC86F_MEM_OP_A_TLB_INVALIDATE_CANCEL_MMU_ENGINE_ID = (8, 0) +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR = (11, 11) +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN = 0x00000001 +NVC86F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS = 0x00000000 +NVC86F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO = (31, 12) +NVC86F_MEM_OP_B = (0x0000002c) +NVC86F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI = (31, 0) +NVC86F_MEM_OP_C = (0x00000030) +NVC86F_MEM_OP_C_MEMBAR_TYPE = (2, 0) +NVC86F_MEM_OP_C_MEMBAR_TYPE_SYS_MEMBAR = 0x00000000 +NVC86F_MEM_OP_C_MEMBAR_TYPE_MEMBAR = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB = (0, 0) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC = (1, 1) +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY = (4, 2) +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START_ACK_ALL = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_TARGETED = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_GLOBAL = 0x00000004 +NVC86F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_VA_GLOBAL = 0x00000005 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE = (6, 5) +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_INTRANODE = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE = (9, 7) +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_READ = 0 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE = 1 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 2 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_RSVRVD = 3 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 4 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_ALL = 5 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE_AND_ATOMIC = 6 +NVC86F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ALL = 7 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL = (9, 7) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY = 0x00000001 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE0 = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE1 = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE2 = 0x00000004 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE3 = 0x00000005 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 = 0x00000006 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE5 = 0x00000007 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE = (11, 10) +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM = 0x00000000 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT = 0x00000002 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_NONCOHERENT = 0x00000003 +NVC86F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO = (31, 12) +NVC86F_MEM_OP_C_ACCESS_COUNTER_CLR_TARGETED_NOTIFY_TAG = (19, 0) +NVC86F_MEM_OP_D = (0x00000034) +NVC86F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI = (26, 0) +NVC86F_MEM_OP_D_OPERATION = (31, 27) +NVC86F_MEM_OP_D_OPERATION_MEMBAR = 0x00000005 +NVC86F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE = 0x00000009 +NVC86F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED = 0x0000000a +NVC86F_MEM_OP_D_OPERATION_MMU_OPERATION = 0x0000000b +NVC86F_MEM_OP_D_OPERATION_L2_PEERMEM_INVALIDATE = 0x0000000d +NVC86F_MEM_OP_D_OPERATION_L2_SYSMEM_INVALIDATE = 0x0000000e +NVC86F_MEM_OP_B_OPERATION_L2_INVALIDATE_CLEAN_LINES = 0x0000000e +NVC86F_MEM_OP_D_OPERATION_L2_CLEAN_COMPTAGS = 0x0000000f +NVC86F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY = 0x00000010 +NVC86F_MEM_OP_D_OPERATION_L2_WAIT_FOR_SYS_PENDING_READS = 0x00000015 +NVC86F_MEM_OP_D_OPERATION_ACCESS_COUNTER_CLR = 0x00000016 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE = (1, 0) +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MIMC = 0x00000000 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MOMC = 0x00000001 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_ALL = 0x00000002 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_TARGETED = 0x00000003 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE = (2, 2) +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MIMC = 0x00000000 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MOMC = 0x00000001 +NVC86F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_BANK = (6, 3) +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE = (23, 20) +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE_RESERVED = 0x00000000 +NVC86F_MEM_OP_D_MMU_OPERATION_TYPE_VIDMEM_ACCESS_BIT_DUMP = 0x00000001 +NVC86F_SEM_ADDR_LO = (0x0000005c) +NVC86F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC86F_SEM_ADDR_HI = (0x00000060) +NVC86F_SEM_ADDR_HI_OFFSET = (24, 0) +NVC86F_SEM_PAYLOAD_LO = (0x00000064) +NVC86F_SEM_PAYLOAD_HI = (0x00000068) +NVC86F_SEM_EXECUTE = (0x0000006c) +NVC86F_SEM_EXECUTE_OPERATION = (2, 0) +NVC86F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC86F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC86F_SEM_EXECUTE_OPERATION_ACQ_CIRC_GEQ = 0x00000003 +NVC86F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG = (12, 12) +NVC86F_SEM_EXECUTE_ACQUIRE_SWITCH_TSG_EN = 0x00000001 +NVC86F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC86F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC86F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC86F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC86F_SEM_EXECUTE_RELEASE_TIMESTAMP = (25, 25) +NVC86F_SEM_EXECUTE_RELEASE_TIMESTAMP_DIS = 0x00000000 +NVC86F_SEM_EXECUTE_RELEASE_TIMESTAMP_EN = 0x00000001 +NVC86F_WFI = (0x00000078) +NVC86F_WFI_SCOPE = (0, 0) +NVC86F_WFI_SCOPE_CURRENT_SCG_TYPE = 0x00000000 +NVC86F_WFI_SCOPE_CURRENT_VEID = 0x00000000 +NVC86F_WFI_SCOPE_ALL = 0x00000001 +NVC86F_GP_ENTRY__SIZE = 8 +NVC86F_GP_ENTRY0_FETCH = (0, 0) +NVC86F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC86F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC86F_GP_ENTRY0_GET = (31, 2) +NVC86F_GP_ENTRY0_OPERAND = (31, 0) +NVC86F_GP_ENTRY0_PB_EXTENDED_BASE_OPERAND = (24, 8) +NVC86F_GP_ENTRY1_GET_HI = (7, 0) +NVC86F_GP_ENTRY1_LEVEL = (9, 9) +NVC86F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC86F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC86F_GP_ENTRY1_LENGTH = (30, 10) +NVC86F_GP_ENTRY1_SYNC = (31, 31) +NVC86F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC86F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC86F_GP_ENTRY1_OPCODE = (7, 0) +NVC86F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC86F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC86F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC86F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC86F_GP_ENTRY1_OPCODE_SET_PB_SEGMENT_EXTENDED_BASE = 0x00000004 +BLACKWELL_CHANNEL_GPFIFO_A = (0x0000C96F) +NVC96F_SET_OBJECT = (0x00000000) +NVC96F_MEM_OP_A = (0x00000028) +NVC96F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE = (5, 0) +NVC96F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE = (7, 6) +NVC96F_MEM_OP_A_TLB_INVALIDATE_INVAL_SCOPE_NON_LINK_TLBS = 2 +NVC96F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR = (11, 11) +NVC96F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN = 0x00000001 +NVC96F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS = 0x00000000 +NVC96F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO = (31, 12) +NVC96F_MEM_OP_B = (0x0000002c) +NVC96F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI = (31, 0) +NVC96F_MEM_OP_C = (0x00000030) +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB = (0, 0) +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL = 0x00000001 +NVC96F_MEM_OP_C_TLB_INVALIDATE_GPC = (1, 1) +NVC96F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE = 0x00000001 +NVC96F_MEM_OP_C_TLB_INVALIDATE_REPLAY = (4, 2) +NVC96F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE = (6, 5) +NVC96F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY = 0x00000001 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL = (9, 7) +NVC96F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY = 0x00000001 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 = 0x00000006 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE = (11, 10) +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM = 0x00000000 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT = 0x00000002 +NVC96F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO = (31, 12) +NVC96F_MEM_OP_D = (0x00000034) +NVC96F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI = (26, 0) +NVC96F_MEM_OP_D_OPERATION = (31, 27) +NVC96F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE = 0x00000009 +NVC96F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED = 0x0000000a +NVC96F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY = 0x00000010 +NVC96F_MEM_OP_D_OPERATION_L2_SYSMEM_NCOH_INVALIDATE = 0x00000011 +NVC96F_SEM_ADDR_LO = (0x0000005c) +NVC96F_SEM_ADDR_LO_OFFSET = (31, 2) +NVC96F_SEM_ADDR_HI = (0x00000060) +NVC96F_SEM_ADDR_HI_OFFSET = (24, 0) +NVC96F_SEM_PAYLOAD_LO = (0x00000064) +NVC96F_SEM_PAYLOAD_HI = (0x00000068) +NVC96F_SEM_EXECUTE = (0x0000006c) +NVC96F_SEM_EXECUTE_OPERATION = (2, 0) +NVC96F_SEM_EXECUTE_OPERATION_ACQUIRE = 0x00000000 +NVC96F_SEM_EXECUTE_OPERATION_RELEASE = 0x00000001 +NVC96F_SEM_EXECUTE_RELEASE_WFI = (20, 20) +NVC96F_SEM_EXECUTE_RELEASE_WFI_DIS = 0x00000000 +NVC96F_SEM_EXECUTE_PAYLOAD_SIZE = (24, 24) +NVC96F_SEM_EXECUTE_PAYLOAD_SIZE_32BIT = 0x00000000 +NVC96F_GP_ENTRY__SIZE = 8 +NVC96F_GP_ENTRY0_FETCH = (0, 0) +NVC96F_GP_ENTRY0_FETCH_UNCONDITIONAL = 0x00000000 +NVC96F_GP_ENTRY0_FETCH_CONDITIONAL = 0x00000001 +NVC96F_GP_ENTRY0_GET = (31, 2) +NVC96F_GP_ENTRY0_OPERAND = (31, 0) +NVC96F_GP_ENTRY0_PB_EXTENDED_BASE_OPERAND = (24, 8) +NVC96F_GP_ENTRY1_GET_HI = (7, 0) +NVC96F_GP_ENTRY1_LEVEL = (9, 9) +NVC96F_GP_ENTRY1_LEVEL_MAIN = 0x00000000 +NVC96F_GP_ENTRY1_LEVEL_SUBROUTINE = 0x00000001 +NVC96F_GP_ENTRY1_LENGTH = (30, 10) +NVC96F_GP_ENTRY1_SYNC = (31, 31) +NVC96F_GP_ENTRY1_SYNC_PROCEED = 0x00000000 +NVC96F_GP_ENTRY1_SYNC_WAIT = 0x00000001 +NVC96F_GP_ENTRY1_OPCODE = (7, 0) +NVC96F_GP_ENTRY1_OPCODE_NOP = 0x00000000 +NVC96F_GP_ENTRY1_OPCODE_ILLEGAL = 0x00000001 +NVC96F_GP_ENTRY1_OPCODE_GP_CRC = 0x00000002 +NVC96F_GP_ENTRY1_OPCODE_PB_CRC = 0x00000003 +NVC96F_GP_ENTRY1_OPCODE_SET_PB_SEGMENT_EXTENDED_BASE = 0x00000004 +BLACKWELL_USERMODE_A = (0xc761) +GT200_DEBUGGER = (0x83de) +NV83DE_ALLOC_PARAMETERS_MESSAGE_ID = (0x83de) +MAXWELL_PROFILER_DEVICE = (0xb2cc) +NVB2CC_ALLOC_PARAMETERS_MESSAGE_ID = (0xb2cc) +AMPERE_COMPUTE_A = 0xC6C0 +NVC6C0_SET_OBJECT = 0x0000 +NVC6C0_SET_OBJECT_CLASS_ID = (15, 0) +NVC6C0_SET_OBJECT_ENGINE_ID = (20, 16) +NVC6C0_NO_OPERATION = 0x0100 +NVC6C0_NO_OPERATION_V = (31, 0) +NVC6C0_SET_NOTIFY_A = 0x0104 +NVC6C0_SET_NOTIFY_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_NOTIFY_B = 0x0108 +NVC6C0_SET_NOTIFY_B_ADDRESS_LOWER = (31, 0) +NVC6C0_NOTIFY = 0x010c +NVC6C0_NOTIFY_TYPE = (31, 0) +NVC6C0_NOTIFY_TYPE_WRITE_ONLY = 0x00000000 +NVC6C0_NOTIFY_TYPE_WRITE_THEN_AWAKEN = 0x00000001 +NVC6C0_WAIT_FOR_IDLE = 0x0110 +NVC6C0_WAIT_FOR_IDLE_V = (31, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_A = 0x0130 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_B = 0x0134 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C = 0x0138 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE = (2, 0) +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_FALSE = 0x00000000 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_TRUE = 0x00000001 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_CONDITIONAL = 0x00000002 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = 0x00000003 +NVC6C0_SET_GLOBAL_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = 0x00000004 +NVC6C0_SEND_GO_IDLE = 0x013c +NVC6C0_SEND_GO_IDLE_V = (31, 0) +NVC6C0_PM_TRIGGER = 0x0140 +NVC6C0_PM_TRIGGER_V = (31, 0) +NVC6C0_PM_TRIGGER_WFI = 0x0144 +NVC6C0_PM_TRIGGER_WFI_V = (31, 0) +NVC6C0_FE_ATOMIC_SEQUENCE_BEGIN = 0x0148 +NVC6C0_FE_ATOMIC_SEQUENCE_BEGIN_V = (31, 0) +NVC6C0_FE_ATOMIC_SEQUENCE_END = 0x014c +NVC6C0_FE_ATOMIC_SEQUENCE_END_V = (31, 0) +NVC6C0_SET_INSTRUMENTATION_METHOD_HEADER = 0x0150 +NVC6C0_SET_INSTRUMENTATION_METHOD_HEADER_V = (31, 0) +NVC6C0_SET_INSTRUMENTATION_METHOD_DATA = 0x0154 +NVC6C0_SET_INSTRUMENTATION_METHOD_DATA_V = (31, 0) +NVC6C0_LINE_LENGTH_IN = 0x0180 +NVC6C0_LINE_LENGTH_IN_VALUE = (31, 0) +NVC6C0_LINE_COUNT = 0x0184 +NVC6C0_LINE_COUNT_VALUE = (31, 0) +NVC6C0_OFFSET_OUT_UPPER = 0x0188 +NVC6C0_OFFSET_OUT_UPPER_VALUE = (16, 0) +NVC6C0_OFFSET_OUT = 0x018c +NVC6C0_OFFSET_OUT_VALUE = (31, 0) +NVC6C0_PITCH_OUT = 0x0190 +NVC6C0_PITCH_OUT_VALUE = (31, 0) +NVC6C0_SET_DST_BLOCK_SIZE = 0x0194 +NVC6C0_SET_DST_BLOCK_SIZE_WIDTH = (3, 0) +NVC6C0_SET_DST_BLOCK_SIZE_WIDTH_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_TWO_GOBS = 0x00000001 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_FOUR_GOBS = 0x00000002 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = 0x00000003 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = 0x00000004 +NVC6C0_SET_DST_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = 0x00000005 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH = (11, 8) +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_ONE_GOB = 0x00000000 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_TWO_GOBS = 0x00000001 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_FOUR_GOBS = 0x00000002 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_EIGHT_GOBS = 0x00000003 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = 0x00000004 +NVC6C0_SET_DST_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = 0x00000005 +NVC6C0_SET_DST_WIDTH = 0x0198 +NVC6C0_SET_DST_WIDTH_V = (31, 0) +NVC6C0_SET_DST_HEIGHT = 0x019c +NVC6C0_SET_DST_HEIGHT_V = (31, 0) +NVC6C0_SET_DST_DEPTH = 0x01a0 +NVC6C0_SET_DST_DEPTH_V = (31, 0) +NVC6C0_SET_DST_LAYER = 0x01a4 +NVC6C0_SET_DST_LAYER_V = (31, 0) +NVC6C0_SET_DST_ORIGIN_BYTES_X = 0x01a8 +NVC6C0_SET_DST_ORIGIN_BYTES_X_V = (20, 0) +NVC6C0_SET_DST_ORIGIN_SAMPLES_Y = 0x01ac +NVC6C0_SET_DST_ORIGIN_SAMPLES_Y_V = (16, 0) +NVC6C0_LAUNCH_DMA = 0x01b0 +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT = (0, 0) +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT_BLOCKLINEAR = 0x00000000 +NVC6C0_LAUNCH_DMA_DST_MEMORY_LAYOUT_PITCH = 0x00000001 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE = (5, 4) +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_FLUSH_DISABLE = 0x00000000 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_FLUSH_ONLY = 0x00000001 +NVC6C0_LAUNCH_DMA_COMPLETION_TYPE_RELEASE_SEMAPHORE = 0x00000002 +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE = (9, 8) +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE_NONE = 0x00000000 +NVC6C0_LAUNCH_DMA_INTERRUPT_TYPE_INTERRUPT = 0x00000001 +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE = (12, 12) +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE_ONE_WORD = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE = (1, 1) +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_OP = (15, 13) +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_LAUNCH_DMA_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT = (3, 2) +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_LAUNCH_DMA_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE = (6, 6) +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE_FALSE = 0x00000000 +NVC6C0_LAUNCH_DMA_SYSMEMBAR_DISABLE_TRUE = 0x00000001 +NVC6C0_LOAD_INLINE_DATA = 0x01b4 +NVC6C0_LOAD_INLINE_DATA_V = (31, 0) +NVC6C0_SET_I2M_SEMAPHORE_A = 0x01dc +NVC6C0_SET_I2M_SEMAPHORE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_I2M_SEMAPHORE_B = 0x01e0 +NVC6C0_SET_I2M_SEMAPHORE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_I2M_SEMAPHORE_C = 0x01e4 +NVC6C0_SET_I2M_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC6C0_SET_SM_SCG_CONTROL = 0x01e8 +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS = (0, 0) +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS_FALSE = 0x00000000 +NVC6C0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS_TRUE = 0x00000001 +NVC6C0_SET_I2M_SPARE_NOOP00 = 0x01f0 +NVC6C0_SET_I2M_SPARE_NOOP00_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP01 = 0x01f4 +NVC6C0_SET_I2M_SPARE_NOOP01_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP02 = 0x01f8 +NVC6C0_SET_I2M_SPARE_NOOP02_V = (31, 0) +NVC6C0_SET_I2M_SPARE_NOOP03 = 0x01fc +NVC6C0_SET_I2M_SPARE_NOOP03_V = (31, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_A = 0x0200 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_B = 0x0204 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_C = 0x0208 +NVC6C0_SET_VALID_SPAN_OVERFLOW_AREA_C_SIZE = (31, 0) +NVC6C0_PERFMON_TRANSFER = 0x0210 +NVC6C0_PERFMON_TRANSFER_V = (31, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_A = 0x0214 +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_A_ADDRESS_UPPER = (7, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_B = 0x0218 +NVC6C0_SET_QMD_VIRTUALIZATION_BASE_B_ADDRESS_LOWER = (31, 0) +NVC6C0_INVALIDATE_SHADER_CACHES = 0x021c +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION = (0, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_INSTRUCTION_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_DATA = (4, 4) +NVC6C0_INVALIDATE_SHADER_CACHES_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_DATA_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT = (12, 12) +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_CONSTANT_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS = (1, 1) +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_LOCKS_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA = (2, 2) +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_FLUSH_DATA_TRUE = 0x00000001 +NVC6C0_SET_RESERVED_SW_METHOD00 = 0x0220 +NVC6C0_SET_RESERVED_SW_METHOD00_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD01 = 0x0224 +NVC6C0_SET_RESERVED_SW_METHOD01_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD02 = 0x0228 +NVC6C0_SET_RESERVED_SW_METHOD02_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD03 = 0x022c +NVC6C0_SET_RESERVED_SW_METHOD03_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD04 = 0x0230 +NVC6C0_SET_RESERVED_SW_METHOD04_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD05 = 0x0234 +NVC6C0_SET_RESERVED_SW_METHOD05_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD06 = 0x0238 +NVC6C0_SET_RESERVED_SW_METHOD06_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD07 = 0x023c +NVC6C0_SET_RESERVED_SW_METHOD07_V = (31, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI = 0x0244 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_SET_CWD_REF_COUNTER = 0x0248 +NVC6C0_SET_CWD_REF_COUNTER_SELECT = (5, 0) +NVC6C0_SET_CWD_REF_COUNTER_VALUE = (23, 8) +NVC6C0_SET_RESERVED_SW_METHOD08 = 0x024c +NVC6C0_SET_RESERVED_SW_METHOD08_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD09 = 0x0250 +NVC6C0_SET_RESERVED_SW_METHOD09_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD10 = 0x0254 +NVC6C0_SET_RESERVED_SW_METHOD10_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD11 = 0x0258 +NVC6C0_SET_RESERVED_SW_METHOD11_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD12 = 0x025c +NVC6C0_SET_RESERVED_SW_METHOD12_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD13 = 0x0260 +NVC6C0_SET_RESERVED_SW_METHOD13_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD14 = 0x0264 +NVC6C0_SET_RESERVED_SW_METHOD14_V = (31, 0) +NVC6C0_SET_RESERVED_SW_METHOD15 = 0x0268 +NVC6C0_SET_RESERVED_SW_METHOD15_V = (31, 0) +NVC6C0_SET_SCG_CONTROL = 0x0270 +NVC6C0_SET_SCG_CONTROL_COMPUTE1_MAX_SM_COUNT = (8, 0) +NVC6C0_SET_SCG_CONTROL_COMPUTE1_MIN_SM_COUNT = (20, 12) +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE = (24, 24) +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE_FALSE = 0x00000000 +NVC6C0_SET_SCG_CONTROL_DISABLE_COMPUTE1_LIMIT_IN_ALL_COMPUTE_TRUE = 0x00000001 +NVC6C0_SET_COMPUTE_CLASS_VERSION = 0x0280 +NVC6C0_SET_COMPUTE_CLASS_VERSION_CURRENT = (15, 0) +NVC6C0_SET_COMPUTE_CLASS_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_CHECK_COMPUTE_CLASS_VERSION = 0x0284 +NVC6C0_CHECK_COMPUTE_CLASS_VERSION_CURRENT = (15, 0) +NVC6C0_CHECK_COMPUTE_CLASS_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_SET_QMD_VERSION = 0x0288 +NVC6C0_SET_QMD_VERSION_CURRENT = (15, 0) +NVC6C0_SET_QMD_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_CHECK_QMD_VERSION = 0x0290 +NVC6C0_CHECK_QMD_VERSION_CURRENT = (15, 0) +NVC6C0_CHECK_QMD_VERSION_OLDEST_SUPPORTED = (31, 16) +NVC6C0_INVALIDATE_SKED_CACHES = 0x0298 +NVC6C0_INVALIDATE_SKED_CACHES_V = (0, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL = 0x029c +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_CONSTANT_BUFFER_MASK = (7, 0) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE = (8, 8) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_ADDR_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE = (12, 12) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_I2M_CONSTANT_BUFFER_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE = (16, 16) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_ADDR_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE = (20, 20) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_IQ2M_CONSTANT_BUFFER_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE = (24, 24) +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_QMD_VIRTUALIZATION_CONTROL_SEND_PCAS_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_A = 0x02a0 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_A_BASE_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_B = 0x02a4 +NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_B_BASE_ADDRESS = (31, 0) +NVC6C0_SCG_HYSTERESIS_CONTROL = 0x02a8 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE = (0, 0) +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE_FALSE = 0x00000000 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_TIMEOUT_ONCE_TRUE = 0x00000001 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE = (1, 1) +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE_FALSE = 0x00000000 +NVC6C0_SCG_HYSTERESIS_CONTROL_USE_NULL_TIMEOUT_ONCE_TRUE = 0x00000001 +NVC6C0_SET_CWD_SLOT_COUNT = 0x02b0 +NVC6C0_SET_CWD_SLOT_COUNT_V = (7, 0) +NVC6C0_SEND_PCAS_A = 0x02b4 +NVC6C0_SEND_PCAS_A_QMD_ADDRESS_SHIFTED8 = (31, 0) +NVC6C0_SEND_PCAS_B = 0x02b8 +NVC6C0_SEND_PCAS_B_FROM = (23, 0) +NVC6C0_SEND_PCAS_B_DELTA = (31, 24) +NVC6C0_SEND_SIGNALING_PCAS_B = 0x02bc +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE = (0, 0) +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE_FALSE = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS_B_INVALIDATE_TRUE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE = (1, 1) +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE_FALSE = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS_B_SCHEDULE_TRUE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS2_B = 0x02c0 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION = (3, 0) +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_NOP = 0x00000000 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE = 0x00000001 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_SCHEDULE = 0x00000002 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INCREMENT_PUT = 0x00000006 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_DECREMENT_DEPENDENCE = 0x00000007 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_PREFETCH = 0x00000008 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_PREFETCH_SCHEDULE = 0x00000009 +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_PREFETCH_COPY_SCHEDULE = 0x0000000A +NVC6C0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_PREFETCH_COPY_FORCE_REQUIRE_SCHEDULING = 0x0000000B +NVC6C0_SET_SKED_CACHE_CONTROL = 0x02cc +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID = (0, 0) +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID_FALSE = 0x00000000 +NVC6C0_SET_SKED_CACHE_CONTROL_IGNORE_VEID_TRUE = 0x00000001 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A = 0x02e4 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A_SIZE_UPPER = (7, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_B = 0x02e8 +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_B_SIZE_LOWER = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C = 0x02ec +NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C_MAX_SM_COUNT = (8, 0) +NVC6C0_SET_SPA_VERSION = 0x0310 +NVC6C0_SET_SPA_VERSION_MINOR = (7, 0) +NVC6C0_SET_SPA_VERSION_MAJOR = (15, 8) +NVC6C0_SET_INLINE_QMD_ADDRESS_A = 0x0318 +NVC6C0_SET_INLINE_QMD_ADDRESS_A_QMD_ADDRESS_SHIFTED8_UPPER = (31, 0) +NVC6C0_SET_INLINE_QMD_ADDRESS_B = 0x031c +NVC6C0_SET_INLINE_QMD_ADDRESS_B_QMD_ADDRESS_SHIFTED8_LOWER = (31, 0) +NVC6C0_LOAD_INLINE_QMD_DATA = lambda i: (0x0320+(i)*4) # type: ignore +NVC6C0_LOAD_INLINE_QMD_DATA_V = (31, 0) +NVC6C0_SET_FALCON00 = 0x0500 +NVC6C0_SET_FALCON00_V = (31, 0) +NVC6C0_SET_FALCON01 = 0x0504 +NVC6C0_SET_FALCON01_V = (31, 0) +NVC6C0_SET_FALCON02 = 0x0508 +NVC6C0_SET_FALCON02_V = (31, 0) +NVC6C0_SET_FALCON03 = 0x050c +NVC6C0_SET_FALCON03_V = (31, 0) +NVC6C0_SET_FALCON04 = 0x0510 +NVC6C0_SET_FALCON04_V = (31, 0) +NVC6C0_SET_FALCON05 = 0x0514 +NVC6C0_SET_FALCON05_V = (31, 0) +NVC6C0_SET_FALCON06 = 0x0518 +NVC6C0_SET_FALCON06_V = (31, 0) +NVC6C0_SET_FALCON07 = 0x051c +NVC6C0_SET_FALCON07_V = (31, 0) +NVC6C0_SET_FALCON08 = 0x0520 +NVC6C0_SET_FALCON08_V = (31, 0) +NVC6C0_SET_FALCON09 = 0x0524 +NVC6C0_SET_FALCON09_V = (31, 0) +NVC6C0_SET_FALCON10 = 0x0528 +NVC6C0_SET_FALCON10_V = (31, 0) +NVC6C0_SET_FALCON11 = 0x052c +NVC6C0_SET_FALCON11_V = (31, 0) +NVC6C0_SET_FALCON12 = 0x0530 +NVC6C0_SET_FALCON12_V = (31, 0) +NVC6C0_SET_FALCON13 = 0x0534 +NVC6C0_SET_FALCON13_V = (31, 0) +NVC6C0_SET_FALCON14 = 0x0538 +NVC6C0_SET_FALCON14_V = (31, 0) +NVC6C0_SET_FALCON15 = 0x053c +NVC6C0_SET_FALCON15_V = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_A = 0x0790 +NVC6C0_SET_SHADER_LOCAL_MEMORY_A_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_B = 0x0794 +NVC6C0_SET_SHADER_LOCAL_MEMORY_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_A = 0x07b0 +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_A_BASE_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_B = 0x07b4 +NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_B_BASE_ADDRESS = (31, 0) +NVC6C0_SET_SHADER_CACHE_CONTROL = 0x0d94 +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE = (0, 0) +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_SCG_COMPUTE_SCHEDULING_PARAMETERS = lambda i: (0x0da0+(i)*4) # type: ignore +NVC6C0_SET_SCG_COMPUTE_SCHEDULING_PARAMETERS_V = (31, 0) +NVC6C0_SET_SM_TIMEOUT_INTERVAL = 0x0de4 +NVC6C0_SET_SM_TIMEOUT_INTERVAL_COUNTER_BIT = (5, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI = 0x1288 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT = 0x12a8 +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL = (0, 0) +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL_FALSE = 0x00000000 +NVC6C0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE = 0x1330 +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_SAMPLER_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE = 0x1334 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_HEADER_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE = 0x1338 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES = (0, 0) +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_TEXTURE_DATA_CACHE_TAG = (25, 4) +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI = 0x1424 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES = (0, 0) +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVC6C0_INVALIDATE_SAMPLER_CACHE_NO_WFI_TAG = (25, 4) +NVC6C0_SET_SHADER_EXCEPTIONS = 0x1528 +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE = (0, 0) +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_SHADER_EXCEPTIONS_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_A = 0x1550 +NVC6C0_SET_RENDER_ENABLE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_RENDER_ENABLE_B = 0x1554 +NVC6C0_SET_RENDER_ENABLE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_RENDER_ENABLE_C = 0x1558 +NVC6C0_SET_RENDER_ENABLE_C_MODE = (2, 0) +NVC6C0_SET_RENDER_ENABLE_C_MODE_FALSE = 0x00000000 +NVC6C0_SET_RENDER_ENABLE_C_MODE_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_C_MODE_CONDITIONAL = 0x00000002 +NVC6C0_SET_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = 0x00000003 +NVC6C0_SET_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = 0x00000004 +NVC6C0_SET_TEX_SAMPLER_POOL_A = 0x155c +NVC6C0_SET_TEX_SAMPLER_POOL_A_OFFSET_UPPER = (16, 0) +NVC6C0_SET_TEX_SAMPLER_POOL_B = 0x1560 +NVC6C0_SET_TEX_SAMPLER_POOL_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_TEX_SAMPLER_POOL_C = 0x1564 +NVC6C0_SET_TEX_SAMPLER_POOL_C_MAXIMUM_INDEX = (19, 0) +NVC6C0_SET_TEX_HEADER_POOL_A = 0x1574 +NVC6C0_SET_TEX_HEADER_POOL_A_OFFSET_UPPER = (16, 0) +NVC6C0_SET_TEX_HEADER_POOL_B = 0x1578 +NVC6C0_SET_TEX_HEADER_POOL_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_TEX_HEADER_POOL_C = 0x157c +NVC6C0_SET_TEX_HEADER_POOL_C_MAXIMUM_INDEX = (21, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI = 0x1698 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION = (0, 0) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA = (4, 4) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA_TRUE = 0x00000001 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT = (12, 12) +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT_FALSE = 0x00000000 +NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT_TRUE = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE = 0x1944 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE = (1, 0) +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_USE_RENDER_ENABLE = 0x00000000 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_ALWAYS_RENDER = 0x00000001 +NVC6C0_SET_RENDER_ENABLE_OVERRIDE_MODE_NEVER_RENDER = 0x00000002 +NVC6C0_PIPE_NOP = 0x1a2c +NVC6C0_PIPE_NOP_V = (31, 0) +NVC6C0_SET_SPARE00 = 0x1a30 +NVC6C0_SET_SPARE00_V = (31, 0) +NVC6C0_SET_SPARE01 = 0x1a34 +NVC6C0_SET_SPARE01_V = (31, 0) +NVC6C0_SET_SPARE02 = 0x1a38 +NVC6C0_SET_SPARE02_V = (31, 0) +NVC6C0_SET_SPARE03 = 0x1a3c +NVC6C0_SET_SPARE03_V = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_A = 0x1b00 +NVC6C0_SET_REPORT_SEMAPHORE_A_OFFSET_UPPER = (7, 0) +NVC6C0_SET_REPORT_SEMAPHORE_B = 0x1b04 +NVC6C0_SET_REPORT_SEMAPHORE_B_OFFSET_LOWER = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_C = 0x1b08 +NVC6C0_SET_REPORT_SEMAPHORE_C_PAYLOAD = (31, 0) +NVC6C0_SET_REPORT_SEMAPHORE_D = 0x1b0c +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION = (1, 0) +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION_RELEASE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_OPERATION_TRAP = 0x00000003 +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE = (20, 20) +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE = (28, 28) +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE = (2, 2) +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE = (3, 3) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE_TRUE = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP = (11, 9) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_ADD = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_MIN = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_MAX = 0x00000002 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_INC = 0x00000003 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_DEC = 0x00000004 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_AND = 0x00000005 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_OR = 0x00000006 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_XOR = 0x00000007 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT = (18, 17) +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP = (19, 19) +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP_FALSE = 0x00000000 +NVC6C0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP_TRUE = 0x00000001 +NVC6C0_SET_TRAP_HANDLER_A = 0x25f8 +NVC6C0_SET_TRAP_HANDLER_A_ADDRESS_UPPER = (16, 0) +NVC6C0_SET_TRAP_HANDLER_B = 0x25fc +NVC6C0_SET_TRAP_HANDLER_B_ADDRESS_LOWER = (31, 0) +NVC6C0_SET_BINDLESS_TEXTURE = 0x2608 +NVC6C0_SET_BINDLESS_TEXTURE_CONSTANT_BUFFER_SLOT_SELECT = (2, 0) +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE = lambda i: (0x32f4+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_UPPER = lambda i: (0x3314+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_UPPER_V = (31, 0) +NVC6C0_ENABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER = 0x3334 +NVC6C0_ENABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_V = (0, 0) +NVC6C0_DISABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER = 0x3338 +NVC6C0_DISABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_V = (0, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_UPPER = lambda i: (0x333c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_UPPER_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE = lambda i: (0x335c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_EVENT = lambda i: (0x337c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_EVENT_EVENT = (7, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A = lambda i: (0x339c+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT0 = (1, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT0 = (4, 2) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT1 = (6, 5) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT1 = (9, 7) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT2 = (11, 10) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT2 = (14, 12) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT3 = (16, 15) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT3 = (19, 17) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT4 = (21, 20) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT4 = (24, 22) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT5 = (26, 25) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT5 = (29, 27) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_SPARE = (31, 30) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B = lambda i: (0x33bc+(i)*4) # type: ignore +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_EDGE = (0, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_MODE = (2, 1) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_WINDOWED = (3, 3) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_FUNC = (19, 4) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_TRAP_CONTROL = 0x33dc +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_TRAP_CONTROL_MASK = (7, 0) +NVC6C0_START_SHADER_PERFORMANCE_COUNTER = 0x33e0 +NVC6C0_START_SHADER_PERFORMANCE_COUNTER_COUNTER_MASK = (7, 0) +NVC6C0_STOP_SHADER_PERFORMANCE_COUNTER = 0x33e4 +NVC6C0_STOP_SHADER_PERFORMANCE_COUNTER_COUNTER_MASK = (7, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_SCTL_FILTER = 0x33e8 +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_SCTL_FILTER_V = (31, 0) +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CORE_MIO_FILTER = 0x33ec +NVC6C0_SET_SHADER_PERFORMANCE_COUNTER_CORE_MIO_FILTER_V = (31, 0) +NVC6C0_SET_MME_SHADOW_SCRATCH = lambda i: (0x3400+(i)*4) # type: ignore +NVC6C0_SET_MME_SHADOW_SCRATCH_V = (31, 0) +BLACKWELL_COMPUTE_A = 0xCDC0 +NVCDC0_SET_OBJECT = 0x0000 +NVCDC0_SET_OBJECT_CLASS_ID = (15, 0) +NVCDC0_SET_OBJECT_ENGINE_ID = (20, 16) +NVCDC0_NO_OPERATION = 0x0100 +NVCDC0_NO_OPERATION_V = (31, 0) +NVCDC0_SET_NOTIFY_A = 0x0104 +NVCDC0_SET_NOTIFY_A_ADDRESS_UPPER = (24, 0) +NVCDC0_SET_NOTIFY_B = 0x0108 +NVCDC0_SET_NOTIFY_B_ADDRESS_LOWER = (31, 0) +NVCDC0_NOTIFY = 0x010c +NVCDC0_NOTIFY_TYPE = (31, 0) +NVCDC0_NOTIFY_TYPE_WRITE_ONLY = 0x00000000 +NVCDC0_NOTIFY_TYPE_WRITE_THEN_AWAKEN = 0x00000001 +NVCDC0_WAIT_FOR_IDLE = 0x0110 +NVCDC0_WAIT_FOR_IDLE_V = (31, 0) +NVCDC0_LOAD_MME_INSTRUCTION_RAM_POINTER = 0x0114 +NVCDC0_LOAD_MME_INSTRUCTION_RAM_POINTER_V = (31, 0) +NVCDC0_LOAD_MME_INSTRUCTION_RAM = 0x0118 +NVCDC0_LOAD_MME_INSTRUCTION_RAM_V = (31, 0) +NVCDC0_LOAD_MME_START_ADDRESS_RAM_POINTER = 0x011c +NVCDC0_LOAD_MME_START_ADDRESS_RAM_POINTER_V = (31, 0) +NVCDC0_LOAD_MME_START_ADDRESS_RAM = 0x0120 +NVCDC0_LOAD_MME_START_ADDRESS_RAM_V = (31, 0) +NVCDC0_SET_MME_SHADOW_RAM_CONTROL = 0x0124 +NVCDC0_SET_MME_SHADOW_RAM_CONTROL_MODE = (1, 0) +NVCDC0_SET_MME_SHADOW_RAM_CONTROL_MODE_METHOD_TRACK = 0x00000000 +NVCDC0_SET_MME_SHADOW_RAM_CONTROL_MODE_METHOD_TRACK_WITH_FILTER = 0x00000001 +NVCDC0_SET_MME_SHADOW_RAM_CONTROL_MODE_METHOD_PASSTHROUGH = 0x00000002 +NVCDC0_SET_MME_SHADOW_RAM_CONTROL_MODE_METHOD_REPLAY = 0x00000003 +NVCDC0_SET_GLOBAL_RENDER_ENABLE_A = 0x0130 +NVCDC0_SET_GLOBAL_RENDER_ENABLE_A_OFFSET_UPPER = (7, 0) +NVCDC0_SET_GLOBAL_RENDER_ENABLE_B = 0x0134 +NVCDC0_SET_GLOBAL_RENDER_ENABLE_B_OFFSET_LOWER = (31, 0) +NVCDC0_SET_GLOBAL_RENDER_ENABLE_C = 0x0138 +NVCDC0_SET_GLOBAL_RENDER_ENABLE_C_MODE = (2, 0) +NVCDC0_SET_GLOBAL_RENDER_ENABLE_C_MODE_FALSE = 0x00000000 +NVCDC0_SET_GLOBAL_RENDER_ENABLE_C_MODE_TRUE = 0x00000001 +NVCDC0_SET_GLOBAL_RENDER_ENABLE_C_MODE_CONDITIONAL = 0x00000002 +NVCDC0_SET_GLOBAL_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = 0x00000003 +NVCDC0_SET_GLOBAL_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = 0x00000004 +NVCDC0_SEND_GO_IDLE = 0x013c +NVCDC0_SEND_GO_IDLE_V = (31, 0) +NVCDC0_PM_TRIGGER = 0x0140 +NVCDC0_PM_TRIGGER_V = (31, 0) +NVCDC0_PM_TRIGGER_WFI = 0x0144 +NVCDC0_PM_TRIGGER_WFI_V = (31, 0) +NVCDC0_FE_ATOMIC_SEQUENCE_BEGIN = 0x0148 +NVCDC0_FE_ATOMIC_SEQUENCE_BEGIN_V = (31, 0) +NVCDC0_FE_ATOMIC_SEQUENCE_END = 0x014c +NVCDC0_FE_ATOMIC_SEQUENCE_END_V = (31, 0) +NVCDC0_SET_INSTRUMENTATION_METHOD_HEADER = 0x0150 +NVCDC0_SET_INSTRUMENTATION_METHOD_HEADER_V = (31, 0) +NVCDC0_SET_INSTRUMENTATION_METHOD_DATA = 0x0154 +NVCDC0_SET_INSTRUMENTATION_METHOD_DATA_V = (31, 0) +NVCDC0_SET_REPORT_SEMAPHORE_PAYLOAD_LOWER = 0x0158 +NVCDC0_SET_REPORT_SEMAPHORE_PAYLOAD_LOWER_PAYLOAD_LOWER = (31, 0) +NVCDC0_SET_REPORT_SEMAPHORE_PAYLOAD_UPPER = 0x015c +NVCDC0_SET_REPORT_SEMAPHORE_PAYLOAD_UPPER_PAYLOAD_UPPER = (31, 0) +NVCDC0_SET_REPORT_SEMAPHORE_ADDRESS_LOWER = 0x0160 +NVCDC0_SET_REPORT_SEMAPHORE_ADDRESS_LOWER_LOWER = (31, 0) +NVCDC0_SET_REPORT_SEMAPHORE_ADDRESS_UPPER = 0x0164 +NVCDC0_SET_REPORT_SEMAPHORE_ADDRESS_UPPER_UPPER = (24, 0) +NVCDC0_REPORT_SEMAPHORE_EXECUTE = 0x0168 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_OPERATION = (1, 0) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_OPERATION_RELEASE = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_OPERATION_ACQUIRE = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_OPERATION_REPORT_ONLY = 0x00000002 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_OPERATION_TRAP = 0x00000003 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_AWAKEN_ENABLE = (2, 2) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_AWAKEN_ENABLE_FALSE = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_AWAKEN_ENABLE_TRUE = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_STRUCTURE_SIZE = (4, 3) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_STRUCTURE_SIZE_SEMAPHORE_FOUR_WORDS = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_STRUCTURE_SIZE_SEMAPHORE_ONE_WORD = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_STRUCTURE_SIZE_SEMAPHORE_TWO_WORDS = 0x00000002 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_FLUSH_DISABLE = (5, 5) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_FLUSH_DISABLE_FALSE = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_FLUSH_DISABLE_TRUE = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_ENABLE = (6, 6) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP = (9, 7) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP_RED_ADD = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP_RED_MIN = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP_RED_MAX = 0x00000002 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP_RED_INC = 0x00000003 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP_RED_DEC = 0x00000004 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP_RED_AND = 0x00000005 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP_RED_OR = 0x00000006 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_OP_RED_XOR = 0x00000007 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_FORMAT = (11, 10) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_PAYLOAD_SIZE64 = (12, 12) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_PAYLOAD_SIZE64_FALSE = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_PAYLOAD_SIZE64_TRUE = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_TRAP_TYPE = (14, 13) +NVCDC0_REPORT_SEMAPHORE_EXECUTE_TRAP_TYPE_TRAP_NONE = 0x00000000 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_TRAP_TYPE_TRAP_UNCONDITIONAL = 0x00000001 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_TRAP_TYPE_TRAP_CONDITIONAL = 0x00000002 +NVCDC0_REPORT_SEMAPHORE_EXECUTE_TRAP_TYPE_TRAP_CONDITIONAL_EXT = 0x00000003 +NVCDC0_LINE_LENGTH_IN = 0x0180 +NVCDC0_LINE_LENGTH_IN_VALUE = (31, 0) +NVCDC0_LINE_COUNT = 0x0184 +NVCDC0_LINE_COUNT_VALUE = (31, 0) +NVCDC0_OFFSET_OUT_UPPER = 0x0188 +NVCDC0_OFFSET_OUT_UPPER_VALUE = (24, 0) +NVCDC0_OFFSET_OUT = 0x018c +NVCDC0_OFFSET_OUT_VALUE = (31, 0) +NVCDC0_PITCH_OUT = 0x0190 +NVCDC0_PITCH_OUT_VALUE = (31, 0) +NVCDC0_LAUNCH_DMA = 0x01b0 +NVCDC0_LAUNCH_DMA_DST_MEMORY_LAYOUT = (0, 0) +NVCDC0_LAUNCH_DMA_DST_MEMORY_LAYOUT_BLOCKLINEAR = 0x00000000 +NVCDC0_LAUNCH_DMA_DST_MEMORY_LAYOUT_PITCH = 0x00000001 +NVCDC0_LAUNCH_DMA_COMPLETION_TYPE = (5, 4) +NVCDC0_LAUNCH_DMA_COMPLETION_TYPE_FLUSH_DISABLE = 0x00000000 +NVCDC0_LAUNCH_DMA_COMPLETION_TYPE_FLUSH_ONLY = 0x00000001 +NVCDC0_LAUNCH_DMA_COMPLETION_TYPE_RELEASE_SEMAPHORE = 0x00000002 +NVCDC0_LAUNCH_DMA_INTERRUPT_TYPE = (9, 8) +NVCDC0_LAUNCH_DMA_INTERRUPT_TYPE_NONE = 0x00000000 +NVCDC0_LAUNCH_DMA_INTERRUPT_TYPE_INTERRUPT = 0x00000001 +NVCDC0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE = (12, 12) +NVCDC0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE_FOUR_WORDS = 0x00000000 +NVCDC0_LAUNCH_DMA_SEMAPHORE_STRUCT_SIZE_ONE_WORD = 0x00000001 +NVCDC0_LAUNCH_DMA_REDUCTION_ENABLE = (1, 1) +NVCDC0_LAUNCH_DMA_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCDC0_LAUNCH_DMA_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCDC0_LAUNCH_DMA_REDUCTION_OP = (15, 13) +NVCDC0_LAUNCH_DMA_REDUCTION_OP_RED_ADD = 0x00000000 +NVCDC0_LAUNCH_DMA_REDUCTION_OP_RED_MIN = 0x00000001 +NVCDC0_LAUNCH_DMA_REDUCTION_OP_RED_MAX = 0x00000002 +NVCDC0_LAUNCH_DMA_REDUCTION_OP_RED_INC = 0x00000003 +NVCDC0_LAUNCH_DMA_REDUCTION_OP_RED_DEC = 0x00000004 +NVCDC0_LAUNCH_DMA_REDUCTION_OP_RED_AND = 0x00000005 +NVCDC0_LAUNCH_DMA_REDUCTION_OP_RED_OR = 0x00000006 +NVCDC0_LAUNCH_DMA_REDUCTION_OP_RED_XOR = 0x00000007 +NVCDC0_LAUNCH_DMA_REDUCTION_FORMAT = (3, 2) +NVCDC0_LAUNCH_DMA_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVCDC0_LAUNCH_DMA_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVCDC0_LAUNCH_DMA_SYSMEMBAR_DISABLE = (6, 6) +NVCDC0_LAUNCH_DMA_SYSMEMBAR_DISABLE_FALSE = 0x00000000 +NVCDC0_LAUNCH_DMA_SYSMEMBAR_DISABLE_TRUE = 0x00000001 +NVCDC0_LOAD_INLINE_DATA = 0x01b4 +NVCDC0_LOAD_INLINE_DATA_V = (31, 0) +NVCDC0_SET_I2M_SEMAPHORE_A = 0x01dc +NVCDC0_SET_I2M_SEMAPHORE_A_OFFSET_UPPER = (24, 0) +NVCDC0_SET_I2M_SEMAPHORE_B = 0x01e0 +NVCDC0_SET_I2M_SEMAPHORE_B_OFFSET_LOWER = (31, 0) +NVCDC0_SET_I2M_SEMAPHORE_C = 0x01e4 +NVCDC0_SET_I2M_SEMAPHORE_C_PAYLOAD = (31, 0) +NVCDC0_SET_SM_SCG_CONTROL = 0x01e8 +NVCDC0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS = (0, 0) +NVCDC0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS_FALSE = 0x00000000 +NVCDC0_SET_SM_SCG_CONTROL_COMPUTE_IN_GRAPHICS_TRUE = 0x00000001 +NVCDC0_SET_MME_SWITCH_STATE = 0x01ec +NVCDC0_SET_MME_SWITCH_STATE_VALID = (0, 0) +NVCDC0_SET_MME_SWITCH_STATE_VALID_FALSE = 0x00000000 +NVCDC0_SET_MME_SWITCH_STATE_VALID_TRUE = 0x00000001 +NVCDC0_SET_MME_SWITCH_STATE_SAVE_MACRO = (11, 4) +NVCDC0_SET_MME_SWITCH_STATE_RESTORE_MACRO = (19, 12) +NVCDC0_SET_I2M_SPARE_NOOP00 = 0x01f0 +NVCDC0_SET_I2M_SPARE_NOOP00_V = (31, 0) +NVCDC0_SET_I2M_SPARE_NOOP01 = 0x01f4 +NVCDC0_SET_I2M_SPARE_NOOP01_V = (31, 0) +NVCDC0_SET_I2M_SPARE_NOOP02 = 0x01f8 +NVCDC0_SET_I2M_SPARE_NOOP02_V = (31, 0) +NVCDC0_SET_I2M_SPARE_NOOP03 = 0x01fc +NVCDC0_SET_I2M_SPARE_NOOP03_V = (31, 0) +NVCDC0_SET_VALID_SPAN_OVERFLOW_AREA_A = 0x0200 +NVCDC0_SET_VALID_SPAN_OVERFLOW_AREA_A_ADDRESS_UPPER = (7, 0) +NVCDC0_SET_VALID_SPAN_OVERFLOW_AREA_B = 0x0204 +NVCDC0_SET_VALID_SPAN_OVERFLOW_AREA_B_ADDRESS_LOWER = (31, 0) +NVCDC0_SET_VALID_SPAN_OVERFLOW_AREA_C = 0x0208 +NVCDC0_SET_VALID_SPAN_OVERFLOW_AREA_C_SIZE = (31, 0) +NVCDC0_PERFMON_TRANSFER = 0x0210 +NVCDC0_PERFMON_TRANSFER_V = (31, 0) +NVCDC0_INVALIDATE_SHADER_CACHES = 0x021c +NVCDC0_INVALIDATE_SHADER_CACHES_INSTRUCTION = (0, 0) +NVCDC0_INVALIDATE_SHADER_CACHES_INSTRUCTION_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SHADER_CACHES_INSTRUCTION_TRUE = 0x00000001 +NVCDC0_INVALIDATE_SHADER_CACHES_DATA = (4, 4) +NVCDC0_INVALIDATE_SHADER_CACHES_DATA_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SHADER_CACHES_DATA_TRUE = 0x00000001 +NVCDC0_INVALIDATE_SHADER_CACHES_CONSTANT = (12, 12) +NVCDC0_INVALIDATE_SHADER_CACHES_CONSTANT_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SHADER_CACHES_CONSTANT_TRUE = 0x00000001 +NVCDC0_INVALIDATE_SHADER_CACHES_LOCKS = (1, 1) +NVCDC0_INVALIDATE_SHADER_CACHES_LOCKS_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SHADER_CACHES_LOCKS_TRUE = 0x00000001 +NVCDC0_INVALIDATE_SHADER_CACHES_FLUSH_DATA = (2, 2) +NVCDC0_INVALIDATE_SHADER_CACHES_FLUSH_DATA_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SHADER_CACHES_FLUSH_DATA_TRUE = 0x00000001 +NVCDC0_SET_RESERVED_SW_METHOD00 = 0x0220 +NVCDC0_SET_RESERVED_SW_METHOD00_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD01 = 0x0224 +NVCDC0_SET_RESERVED_SW_METHOD01_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD02 = 0x0228 +NVCDC0_SET_RESERVED_SW_METHOD02_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD03 = 0x022c +NVCDC0_SET_RESERVED_SW_METHOD03_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD04 = 0x0230 +NVCDC0_SET_RESERVED_SW_METHOD04_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD05 = 0x0234 +NVCDC0_SET_RESERVED_SW_METHOD05_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD06 = 0x0238 +NVCDC0_SET_RESERVED_SW_METHOD06_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD07 = 0x023c +NVCDC0_SET_RESERVED_SW_METHOD07_V = (31, 0) +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI = 0x0244 +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES = (0, 0) +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_NO_WFI_TAG = (25, 4) +NVCDC0_SET_CWD_REF_COUNTER = 0x0248 +NVCDC0_SET_CWD_REF_COUNTER_SELECT = (5, 0) +NVCDC0_SET_CWD_REF_COUNTER_VALUE = (23, 8) +NVCDC0_SET_RESERVED_SW_METHOD08 = 0x024c +NVCDC0_SET_RESERVED_SW_METHOD08_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD09 = 0x0250 +NVCDC0_SET_RESERVED_SW_METHOD09_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD10 = 0x0254 +NVCDC0_SET_RESERVED_SW_METHOD10_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD11 = 0x0258 +NVCDC0_SET_RESERVED_SW_METHOD11_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD12 = 0x025c +NVCDC0_SET_RESERVED_SW_METHOD12_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD13 = 0x0260 +NVCDC0_SET_RESERVED_SW_METHOD13_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD14 = 0x0264 +NVCDC0_SET_RESERVED_SW_METHOD14_V = (31, 0) +NVCDC0_SET_RESERVED_SW_METHOD15 = 0x0268 +NVCDC0_SET_RESERVED_SW_METHOD15_V = (31, 0) +NVCDC0_SET_COMPUTE_CLASS_VERSION = 0x0280 +NVCDC0_SET_COMPUTE_CLASS_VERSION_CURRENT = (15, 0) +NVCDC0_SET_COMPUTE_CLASS_VERSION_OLDEST_SUPPORTED = (31, 16) +NVCDC0_CHECK_COMPUTE_CLASS_VERSION = 0x0284 +NVCDC0_CHECK_COMPUTE_CLASS_VERSION_CURRENT = (15, 0) +NVCDC0_CHECK_COMPUTE_CLASS_VERSION_OLDEST_SUPPORTED = (31, 16) +NVCDC0_SET_QMD_VERSION = 0x0288 +NVCDC0_SET_QMD_VERSION_CURRENT = (15, 0) +NVCDC0_SET_QMD_VERSION_OLDEST_SUPPORTED = (31, 16) +NVCDC0_INVALIDATE_SKED_CACHES = 0x0298 +NVCDC0_INVALIDATE_SKED_CACHES_FORCE_IGNORE_VEID = (0, 0) +NVCDC0_INVALIDATE_SKED_CACHES_FORCE_IGNORE_VEID_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SKED_CACHES_FORCE_IGNORE_VEID_TRUE = 0x00000001 +NVCDC0_SET_SHADER_SHARED_MEMORY_WINDOW_A = 0x02a0 +NVCDC0_SET_SHADER_SHARED_MEMORY_WINDOW_A_BASE_ADDRESS_UPPER = (16, 0) +NVCDC0_SET_SHADER_SHARED_MEMORY_WINDOW_B = 0x02a4 +NVCDC0_SET_SHADER_SHARED_MEMORY_WINDOW_B_BASE_ADDRESS = (31, 0) +NVCDC0_SET_CWD_SLOT_COUNT = 0x02b0 +NVCDC0_SET_CWD_SLOT_COUNT_V = (7, 0) +NVCDC0_SEND_PCAS_A = 0x02b4 +NVCDC0_SEND_PCAS_A_QMD_ADDRESS_SHIFTED8 = (31, 0) +NVCDC0_SEND_PCAS_B = 0x02b8 +NVCDC0_SEND_PCAS_B_FROM = (23, 0) +NVCDC0_SEND_PCAS_B_DELTA = (31, 24) +NVCDC0_SEND_SIGNALING_PCAS_B = 0x02bc +NVCDC0_SEND_SIGNALING_PCAS_B_INVALIDATE = (0, 0) +NVCDC0_SEND_SIGNALING_PCAS_B_INVALIDATE_FALSE = 0x00000000 +NVCDC0_SEND_SIGNALING_PCAS_B_INVALIDATE_TRUE = 0x00000001 +NVCDC0_SEND_SIGNALING_PCAS_B_SCHEDULE = (1, 1) +NVCDC0_SEND_SIGNALING_PCAS_B_SCHEDULE_FALSE = 0x00000000 +NVCDC0_SEND_SIGNALING_PCAS_B_SCHEDULE_TRUE = 0x00000001 +NVCDC0_SEND_SIGNALING_PCAS2_B = 0x02c0 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION = (3, 0) +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_NOP = 0x00000000 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE = 0x00000001 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_SCHEDULE = 0x00000002 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_COPY_SCHEDULE = 0x00000003 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INCREMENT_PUT = 0x00000006 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_DECREMENT_DEPENDENCE = 0x00000007 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_PREFETCH = 0x00000008 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_PREFETCH_SCHEDULE = 0x00000009 +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_PREFETCH_COPY_SCHEDULE = 0x0000000A +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INVALIDATE_PREFETCH_COPY_FORCE_REQUIRE_SCHEDULING = 0x0000000B +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INCREMENT_DEPENDENCE = 0x0000000C +NVCDC0_SEND_SIGNALING_PCAS2_B_PCAS_ACTION_INCREMENT_CWD_REF_COUNTER = 0x0000000D +NVCDC0_SEND_SIGNALING_PCAS2_B_SELECT = (13, 8) +NVCDC0_SEND_SIGNALING_PCAS2_B_OFFSET_MINUS_ONE = (23, 14) +NVCDC0_SET_SKED_CACHE_CONTROL = 0x02cc +NVCDC0_SET_SKED_CACHE_CONTROL_IGNORE_VEID = (0, 0) +NVCDC0_SET_SKED_CACHE_CONTROL_IGNORE_VEID_FALSE = 0x00000000 +NVCDC0_SET_SKED_CACHE_CONTROL_IGNORE_VEID_TRUE = 0x00000001 +NVCDC0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A = 0x02e4 +NVCDC0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A_SIZE_UPPER = (7, 0) +NVCDC0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_B = 0x02e8 +NVCDC0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_B_SIZE_LOWER = (31, 0) +NVCDC0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C = 0x02ec +NVCDC0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C_MAX_SM_COUNT = (8, 0) +NVCDC0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C_MAX_PLURAL_TPC_GPC_COUNT = (23, 16) +NVCDC0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_C_MAX_SINGLETON_TPC_GPC_COUNT = (31, 24) +NVCDC0_SET_SPA_VERSION = 0x0310 +NVCDC0_SET_SPA_VERSION_MINOR = (7, 0) +NVCDC0_SET_SPA_VERSION_MAJOR = (15, 8) +NVCDC0_SET_INLINE_QMD_ADDRESS_A = 0x0318 +NVCDC0_SET_INLINE_QMD_ADDRESS_A_QMD_ADDRESS_SHIFTED8_UPPER = (8, 0) +NVCDC0_SET_INLINE_QMD_ADDRESS_A_INLINE_SIZE = (30, 30) +NVCDC0_SET_INLINE_QMD_ADDRESS_A_INLINE_SIZE_INLINE_256 = 0x00000000 +NVCDC0_SET_INLINE_QMD_ADDRESS_A_INLINE_SIZE_INLINE_384 = 0x00000001 +NVCDC0_SET_INLINE_QMD_ADDRESS_B = 0x031c +NVCDC0_SET_INLINE_QMD_ADDRESS_B_QMD_ADDRESS_SHIFTED8_LOWER = (31, 0) +NVCDC0_LOAD_INLINE_QMD_DATA = lambda i: (0x0320+(i)*4) # type: ignore +NVCDC0_LOAD_INLINE_QMD_DATA_V = (31, 0) +NVCDC0_SET_FALCON00 = 0x0500 +NVCDC0_SET_FALCON00_V = (31, 0) +NVCDC0_SET_FALCON01 = 0x0504 +NVCDC0_SET_FALCON01_V = (31, 0) +NVCDC0_SET_FALCON02 = 0x0508 +NVCDC0_SET_FALCON02_V = (31, 0) +NVCDC0_SET_FALCON03 = 0x050c +NVCDC0_SET_FALCON03_V = (31, 0) +NVCDC0_SET_FALCON04 = 0x0510 +NVCDC0_SET_FALCON04_V = (31, 0) +NVCDC0_SET_FALCON05 = 0x0514 +NVCDC0_SET_FALCON05_V = (31, 0) +NVCDC0_SET_FALCON06 = 0x0518 +NVCDC0_SET_FALCON06_V = (31, 0) +NVCDC0_SET_FALCON07 = 0x051c +NVCDC0_SET_FALCON07_V = (31, 0) +NVCDC0_SET_FALCON08 = 0x0520 +NVCDC0_SET_FALCON08_V = (31, 0) +NVCDC0_SET_FALCON09 = 0x0524 +NVCDC0_SET_FALCON09_V = (31, 0) +NVCDC0_SET_FALCON10 = 0x0528 +NVCDC0_SET_FALCON10_V = (31, 0) +NVCDC0_SET_FALCON11 = 0x052c +NVCDC0_SET_FALCON11_V = (31, 0) +NVCDC0_SET_FALCON12 = 0x0530 +NVCDC0_SET_FALCON12_V = (31, 0) +NVCDC0_SET_FALCON13 = 0x0534 +NVCDC0_SET_FALCON13_V = (31, 0) +NVCDC0_SET_FALCON14 = 0x0538 +NVCDC0_SET_FALCON14_V = (31, 0) +NVCDC0_SET_FALCON15 = 0x053c +NVCDC0_SET_FALCON15_V = (31, 0) +NVCDC0_SET_MME_MEM_ADDRESS_A = 0x0550 +NVCDC0_SET_MME_MEM_ADDRESS_A_UPPER = (24, 0) +NVCDC0_SET_MME_MEM_ADDRESS_B = 0x0554 +NVCDC0_SET_MME_MEM_ADDRESS_B_LOWER = (31, 0) +NVCDC0_SET_MME_DATA_RAM_ADDRESS = 0x0558 +NVCDC0_SET_MME_DATA_RAM_ADDRESS_WORD = (31, 0) +NVCDC0_MME_DMA_READ = 0x055c +NVCDC0_MME_DMA_READ_LENGTH = (31, 0) +NVCDC0_MME_DMA_READ_FIFOED = 0x0560 +NVCDC0_MME_DMA_READ_FIFOED_LENGTH = (31, 0) +NVCDC0_MME_DMA_WRITE = 0x0564 +NVCDC0_MME_DMA_WRITE_LENGTH = (31, 0) +NVCDC0_MME_DMA_REDUCTION = 0x0568 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP = (2, 0) +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP_RED_ADD = 0x00000000 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP_RED_MIN = 0x00000001 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP_RED_MAX = 0x00000002 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP_RED_INC = 0x00000003 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP_RED_DEC = 0x00000004 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP_RED_AND = 0x00000005 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP_RED_OR = 0x00000006 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_OP_RED_XOR = 0x00000007 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_FORMAT = (5, 4) +NVCDC0_MME_DMA_REDUCTION_REDUCTION_FORMAT_UNSIGNED = 0x00000000 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_FORMAT_SIGNED = 0x00000001 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_SIZE = (8, 8) +NVCDC0_MME_DMA_REDUCTION_REDUCTION_SIZE_FOUR_BYTES = 0x00000000 +NVCDC0_MME_DMA_REDUCTION_REDUCTION_SIZE_EIGHT_BYTES = 0x00000001 +NVCDC0_MME_DMA_SYSMEMBAR = 0x056c +NVCDC0_MME_DMA_SYSMEMBAR_V = (0, 0) +NVCDC0_MME_DMA_SYNC = 0x0570 +NVCDC0_MME_DMA_SYNC_VALUE = (31, 0) +NVCDC0_EVENT_START_TRIGGER = 0x074c +NVCDC0_EVENT_START_TRIGGER_V = (31, 0) +NVCDC0_EVENT_STOP_TRIGGER = 0x075c +NVCDC0_EVENT_STOP_TRIGGER_V = (31, 0) +NVCDC0_SET_SHADER_LOCAL_MEMORY_A = 0x0790 +NVCDC0_SET_SHADER_LOCAL_MEMORY_A_ADDRESS_UPPER = (24, 0) +NVCDC0_SET_SHADER_LOCAL_MEMORY_B = 0x0794 +NVCDC0_SET_SHADER_LOCAL_MEMORY_B_ADDRESS_LOWER = (31, 0) +NVCDC0_SET_TEXTURE_HEADER_VERSION = 0x07ac +NVCDC0_SET_TEXTURE_HEADER_VERSION_MAJOR = (7, 0) +NVCDC0_SET_SHADER_LOCAL_MEMORY_WINDOW_A = 0x07b0 +NVCDC0_SET_SHADER_LOCAL_MEMORY_WINDOW_A_BASE_ADDRESS_UPPER = (16, 0) +NVCDC0_SET_SHADER_LOCAL_MEMORY_WINDOW_B = 0x07b4 +NVCDC0_SET_SHADER_LOCAL_MEMORY_WINDOW_B_BASE_ADDRESS = (31, 0) +NVCDC0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_A = 0x07b8 +NVCDC0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_A_LOWER = (31, 0) +NVCDC0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_B = 0x07bc +NVCDC0_SET_MONITORED_FENCE_SIGNAL_ADDRESS_BASE_B_UPPER = (24, 0) +NVCDC0_THROTTLE_SM = 0x07fc +NVCDC0_THROTTLE_SM_MULTIPLY_ADD = (0, 0) +NVCDC0_THROTTLE_SM_MULTIPLY_ADD_FALSE = 0x00000000 +NVCDC0_THROTTLE_SM_MULTIPLY_ADD_TRUE = 0x00000001 +NVCDC0_SET_SHADER_CACHE_CONTROL = 0x0d94 +NVCDC0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE = (0, 0) +NVCDC0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE_FALSE = 0x00000000 +NVCDC0_SET_SHADER_CACHE_CONTROL_ICACHE_PREFETCH_ENABLE_TRUE = 0x00000001 +NVCDC0_SET_SCG_COMPUTE_SCHEDULING_PARAMETERS = lambda i: (0x0da0+(i)*4) # type: ignore +NVCDC0_SET_SCG_COMPUTE_SCHEDULING_PARAMETERS_V = (31, 0) +NVCDC0_SET_SM_TIMEOUT_INTERVAL = 0x0de4 +NVCDC0_SET_SM_TIMEOUT_INTERVAL_COUNTER_BIT = (5, 0) +NVCDC0_MME_DMA_WRITE_METHOD_BARRIER = 0x0dec +NVCDC0_MME_DMA_WRITE_METHOD_BARRIER_V = (0, 0) +NVCDC0_EVENT_STOP_TRIGGER_WFI = 0x0ffc +NVCDC0_EVENT_STOP_TRIGGER_WFI_V = (31, 0) +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI = 0x1288 +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES = (0, 0) +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_NO_WFI_TAG = (25, 4) +NVCDC0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT = 0x12a8 +NVCDC0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL = (0, 0) +NVCDC0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL_FALSE = 0x00000000 +NVCDC0_ACTIVATE_PERF_SETTINGS_FOR_COMPUTE_CONTEXT_ALL_TRUE = 0x00000001 +NVCDC0_INVALIDATE_SAMPLER_CACHE = 0x1330 +NVCDC0_INVALIDATE_SAMPLER_CACHE_LINES = (0, 0) +NVCDC0_INVALIDATE_SAMPLER_CACHE_LINES_ALL = 0x00000000 +NVCDC0_INVALIDATE_SAMPLER_CACHE_LINES_ONE = 0x00000001 +NVCDC0_INVALIDATE_SAMPLER_CACHE_TAG = (25, 4) +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE = 0x1334 +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES = (0, 0) +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES_ALL = 0x00000000 +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_LINES_ONE = 0x00000001 +NVCDC0_INVALIDATE_TEXTURE_HEADER_CACHE_TAG = (25, 4) +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE = 0x1338 +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_LINES = (0, 0) +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_LINES_ALL = 0x00000000 +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_LINES_ONE = 0x00000001 +NVCDC0_INVALIDATE_TEXTURE_DATA_CACHE_TAG = (25, 4) +NVCDC0_INVALIDATE_SAMPLER_CACHE_NO_WFI = 0x1424 +NVCDC0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES = (0, 0) +NVCDC0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES_ALL = 0x00000000 +NVCDC0_INVALIDATE_SAMPLER_CACHE_NO_WFI_LINES_ONE = 0x00000001 +NVCDC0_INVALIDATE_SAMPLER_CACHE_NO_WFI_TAG = (25, 4) +NVCDC0_SET_SHADER_EXCEPTIONS = 0x1528 +NVCDC0_SET_SHADER_EXCEPTIONS_ENABLE = (0, 0) +NVCDC0_SET_SHADER_EXCEPTIONS_ENABLE_FALSE = 0x00000000 +NVCDC0_SET_SHADER_EXCEPTIONS_ENABLE_TRUE = 0x00000001 +NVCDC0_SET_RENDER_ENABLE_A = 0x1550 +NVCDC0_SET_RENDER_ENABLE_A_OFFSET_UPPER = (7, 0) +NVCDC0_SET_RENDER_ENABLE_B = 0x1554 +NVCDC0_SET_RENDER_ENABLE_B_OFFSET_LOWER = (31, 0) +NVCDC0_SET_RENDER_ENABLE_C = 0x1558 +NVCDC0_SET_RENDER_ENABLE_C_MODE = (2, 0) +NVCDC0_SET_RENDER_ENABLE_C_MODE_FALSE = 0x00000000 +NVCDC0_SET_RENDER_ENABLE_C_MODE_TRUE = 0x00000001 +NVCDC0_SET_RENDER_ENABLE_C_MODE_CONDITIONAL = 0x00000002 +NVCDC0_SET_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = 0x00000003 +NVCDC0_SET_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = 0x00000004 +NVCDC0_SET_TEX_SAMPLER_POOL_A = 0x155c +NVCDC0_SET_TEX_SAMPLER_POOL_A_OFFSET_UPPER = (24, 0) +NVCDC0_SET_TEX_SAMPLER_POOL_B = 0x1560 +NVCDC0_SET_TEX_SAMPLER_POOL_B_OFFSET_LOWER = (31, 0) +NVCDC0_SET_TEX_SAMPLER_POOL_C = 0x1564 +NVCDC0_SET_TEX_SAMPLER_POOL_C_MAXIMUM_INDEX = (31, 0) +NVCDC0_SET_TEX_HEADER_POOL_A = 0x1574 +NVCDC0_SET_TEX_HEADER_POOL_A_OFFSET_UPPER = (24, 0) +NVCDC0_SET_TEX_HEADER_POOL_B = 0x1578 +NVCDC0_SET_TEX_HEADER_POOL_B_OFFSET_LOWER = (31, 0) +NVCDC0_SET_TEX_HEADER_POOL_C = 0x157c +NVCDC0_SET_TEX_HEADER_POOL_C_MAXIMUM_INDEX = (31, 0) +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI = 0x1698 +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION = (0, 0) +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_INSTRUCTION_TRUE = 0x00000001 +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA = (4, 4) +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_GLOBAL_DATA_TRUE = 0x00000001 +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT = (12, 12) +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT_FALSE = 0x00000000 +NVCDC0_INVALIDATE_SHADER_CACHES_NO_WFI_CONSTANT_TRUE = 0x00000001 +NVCDC0_SET_RENDER_ENABLE_OVERRIDE = 0x1944 +NVCDC0_SET_RENDER_ENABLE_OVERRIDE_MODE = (1, 0) +NVCDC0_SET_RENDER_ENABLE_OVERRIDE_MODE_USE_RENDER_ENABLE = 0x00000000 +NVCDC0_SET_RENDER_ENABLE_OVERRIDE_MODE_ALWAYS_RENDER = 0x00000001 +NVCDC0_SET_RENDER_ENABLE_OVERRIDE_MODE_NEVER_RENDER = 0x00000002 +NVCDC0_PIPE_NOP = 0x1a2c +NVCDC0_PIPE_NOP_V = (31, 0) +NVCDC0_SET_SPARE00 = 0x1a30 +NVCDC0_SET_SPARE00_V = (31, 0) +NVCDC0_SET_SPARE01 = 0x1a34 +NVCDC0_SET_SPARE01_V = (31, 0) +NVCDC0_SET_SPARE02 = 0x1a38 +NVCDC0_SET_SPARE02_V = (31, 0) +NVCDC0_SET_SPARE03 = 0x1a3c +NVCDC0_SET_SPARE03_V = (31, 0) +NVCDC0_SET_REPORT_SEMAPHORE_A = 0x1b00 +NVCDC0_SET_REPORT_SEMAPHORE_A_OFFSET_UPPER = (24, 0) +NVCDC0_SET_REPORT_SEMAPHORE_B = 0x1b04 +NVCDC0_SET_REPORT_SEMAPHORE_B_OFFSET_LOWER = (31, 0) +NVCDC0_SET_REPORT_SEMAPHORE_C = 0x1b08 +NVCDC0_SET_REPORT_SEMAPHORE_C_PAYLOAD = (31, 0) +NVCDC0_SET_REPORT_SEMAPHORE_D = 0x1b0c +NVCDC0_SET_REPORT_SEMAPHORE_D_OPERATION = (1, 0) +NVCDC0_SET_REPORT_SEMAPHORE_D_OPERATION_RELEASE = 0x00000000 +NVCDC0_SET_REPORT_SEMAPHORE_D_OPERATION_TRAP = 0x00000003 +NVCDC0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE = (20, 20) +NVCDC0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE_FALSE = 0x00000000 +NVCDC0_SET_REPORT_SEMAPHORE_D_AWAKEN_ENABLE_TRUE = 0x00000001 +NVCDC0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE = (28, 28) +NVCDC0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE_FOUR_WORDS = 0x00000000 +NVCDC0_SET_REPORT_SEMAPHORE_D_STRUCTURE_SIZE_ONE_WORD = 0x00000001 +NVCDC0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE = (2, 2) +NVCDC0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE_FALSE = 0x00000000 +NVCDC0_SET_REPORT_SEMAPHORE_D_FLUSH_DISABLE_TRUE = 0x00000001 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE = (3, 3) +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE_FALSE = 0x00000000 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_ENABLE_TRUE = 0x00000001 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP = (11, 9) +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_ADD = 0x00000000 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_MIN = 0x00000001 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_MAX = 0x00000002 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_INC = 0x00000003 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_DEC = 0x00000004 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_AND = 0x00000005 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_OR = 0x00000006 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_OP_RED_XOR = 0x00000007 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT = (18, 17) +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT_UNSIGNED_32 = 0x00000000 +NVCDC0_SET_REPORT_SEMAPHORE_D_REDUCTION_FORMAT_SIGNED_32 = 0x00000001 +NVCDC0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP = (19, 19) +NVCDC0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP_FALSE = 0x00000000 +NVCDC0_SET_REPORT_SEMAPHORE_D_CONDITIONAL_TRAP_TRUE = 0x00000001 +NVCDC0_SET_TRAP_HANDLER_A = 0x25f8 +NVCDC0_SET_TRAP_HANDLER_A_ADDRESS_UPPER = (24, 0) +NVCDC0_SET_TRAP_HANDLER_B = 0x25fc +NVCDC0_SET_TRAP_HANDLER_B_ADDRESS_LOWER = (31, 0) +NVCDC0_SET_BINDLESS_TEXTURE = 0x2608 +NVCDC0_SET_BINDLESS_TEXTURE_CONSTANT_BUFFER_SLOT_SELECT = (2, 0) +NVCDC0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE = lambda i: (0x32f4+(i)*4) # type: ignore +NVCDC0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_V = (31, 0) +NVCDC0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_UPPER = lambda i: (0x3314+(i)*4) # type: ignore +NVCDC0_SET_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_VALUE_UPPER_V = (31, 0) +NVCDC0_ENABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER = 0x3334 +NVCDC0_ENABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_V = (0, 0) +NVCDC0_DISABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER = 0x3338 +NVCDC0_DISABLE_SHADER_PERFORMANCE_SNAPSHOT_COUNTER_V = (0, 0) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_UPPER = lambda i: (0x333c+(i)*4) # type: ignore +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_UPPER_V = (31, 0) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_VALUE = lambda i: (0x335c+(i)*4) # type: ignore +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_VALUE_V = (31, 0) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_EVENT = lambda i: (0x337c+(i)*4) # type: ignore +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_EVENT_EVENT = (7, 0) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A = lambda i: (0x339c+(i)*4) # type: ignore +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT0 = (1, 0) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT0 = (4, 2) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT1 = (6, 5) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT1 = (9, 7) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT2 = (11, 10) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT2 = (14, 12) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT3 = (16, 15) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT3 = (19, 17) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT4 = (21, 20) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT4 = (24, 22) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_EVENT5 = (26, 25) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_BIT_SELECT5 = (29, 27) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_A_SPARE = (31, 30) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B = lambda i: (0x33bc+(i)*4) # type: ignore +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_EDGE = (0, 0) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_MODE = (2, 1) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_WINDOWED = (3, 3) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CONTROL_B_FUNC = (19, 4) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_TRAP_CONTROL = 0x33dc +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_TRAP_CONTROL_MASK = (7, 0) +NVCDC0_START_SHADER_PERFORMANCE_COUNTER = 0x33e0 +NVCDC0_START_SHADER_PERFORMANCE_COUNTER_COUNTER_MASK = (7, 0) +NVCDC0_STOP_SHADER_PERFORMANCE_COUNTER = 0x33e4 +NVCDC0_STOP_SHADER_PERFORMANCE_COUNTER_COUNTER_MASK = (7, 0) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_SCTL_FILTER = 0x33e8 +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_SCTL_FILTER_V = (31, 0) +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CORE_MIO_FILTER = 0x33ec +NVCDC0_SET_SHADER_PERFORMANCE_COUNTER_CORE_MIO_FILTER_V = (31, 0) +NVCDC0_SET_MME_SHADOW_SCRATCH = lambda i: (0x3400+(i)*4) # type: ignore +NVCDC0_SET_MME_SHADOW_SCRATCH_V = (31, 0) +NVCDC0_CALL_MME_MACRO = lambda j: (0x3800+(j)*8) # type: ignore +NVCDC0_CALL_MME_MACRO_V = (31, 0) +NVCDC0_CALL_MME_DATA = lambda j: (0x3804+(j)*8) # type: ignore +NVCDC0_CALL_MME_DATA_V = (31, 0) +AMPERE_DMA_COPY_A = (0x0000C6B5) +NVC6B5_NOP = (0x00000100) +NVC6B5_NOP_PARAMETER = (31, 0) +NVC6B5_PM_TRIGGER = (0x00000140) +NVC6B5_PM_TRIGGER_V = (31, 0) +NVC6B5_SET_SEMAPHORE_A = (0x00000240) +NVC6B5_SET_SEMAPHORE_A_UPPER = (16, 0) +NVC6B5_SET_SEMAPHORE_B = (0x00000244) +NVC6B5_SET_SEMAPHORE_B_LOWER = (31, 0) +NVC6B5_SET_SEMAPHORE_PAYLOAD = (0x00000248) +NVC6B5_SET_SEMAPHORE_PAYLOAD_PAYLOAD = (31, 0) +NVC6B5_SET_RENDER_ENABLE_A = (0x00000254) +NVC6B5_SET_RENDER_ENABLE_A_UPPER = (7, 0) +NVC6B5_SET_RENDER_ENABLE_B = (0x00000258) +NVC6B5_SET_RENDER_ENABLE_B_LOWER = (31, 0) +NVC6B5_SET_RENDER_ENABLE_C = (0x0000025C) +NVC6B5_SET_RENDER_ENABLE_C_MODE = (2, 0) +NVC6B5_SET_RENDER_ENABLE_C_MODE_FALSE = (0x00000000) +NVC6B5_SET_RENDER_ENABLE_C_MODE_TRUE = (0x00000001) +NVC6B5_SET_RENDER_ENABLE_C_MODE_CONDITIONAL = (0x00000002) +NVC6B5_SET_RENDER_ENABLE_C_MODE_RENDER_IF_EQUAL = (0x00000003) +NVC6B5_SET_RENDER_ENABLE_C_MODE_RENDER_IF_NOT_EQUAL = (0x00000004) +NVC6B5_SET_SRC_PHYS_MODE = (0x00000260) +NVC6B5_SET_SRC_PHYS_MODE_TARGET = (1, 0) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_LOCAL_FB = (0x00000000) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC6B5_SET_SRC_PHYS_MODE_TARGET_PEERMEM = (0x00000003) +NVC6B5_SET_SRC_PHYS_MODE_BASIC_KIND = (5, 2) +NVC6B5_SET_SRC_PHYS_MODE_PEER_ID = (8, 6) +NVC6B5_SET_SRC_PHYS_MODE_FLA = (9, 9) +NVC6B5_SET_DST_PHYS_MODE = (0x00000264) +NVC6B5_SET_DST_PHYS_MODE_TARGET = (1, 0) +NVC6B5_SET_DST_PHYS_MODE_TARGET_LOCAL_FB = (0x00000000) +NVC6B5_SET_DST_PHYS_MODE_TARGET_COHERENT_SYSMEM = (0x00000001) +NVC6B5_SET_DST_PHYS_MODE_TARGET_NONCOHERENT_SYSMEM = (0x00000002) +NVC6B5_SET_DST_PHYS_MODE_TARGET_PEERMEM = (0x00000003) +NVC6B5_SET_DST_PHYS_MODE_BASIC_KIND = (5, 2) +NVC6B5_SET_DST_PHYS_MODE_PEER_ID = (8, 6) +NVC6B5_SET_DST_PHYS_MODE_FLA = (9, 9) +NVC6B5_LAUNCH_DMA = (0x00000300) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE = (1, 0) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_PIPELINED = (0x00000001) +NVC6B5_LAUNCH_DMA_DATA_TRANSFER_TYPE_NON_PIPELINED = (0x00000002) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE = (2, 2) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_FLUSH_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE = (25, 25) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE_SYS = (0x00000000) +NVC6B5_LAUNCH_DMA_FLUSH_TYPE_GL = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE = (4, 3) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_ONE_WORD_SEMAPHORE = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_FOUR_WORD_SEMAPHORE = (0x00000002) +NVC6B5_LAUNCH_DMA_SEMAPHORE_TYPE_RELEASE_CONDITIONAL_INTR_SEMAPHORE = (0x00000003) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE = (6, 5) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_BLOCKING = (0x00000001) +NVC6B5_LAUNCH_DMA_INTERRUPT_TYPE_NON_BLOCKING = (0x00000002) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT = (7, 7) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT_BLOCKLINEAR = (0x00000000) +NVC6B5_LAUNCH_DMA_SRC_MEMORY_LAYOUT_PITCH = (0x00000001) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT = (8, 8) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT_BLOCKLINEAR = (0x00000000) +NVC6B5_LAUNCH_DMA_DST_MEMORY_LAYOUT_PITCH = (0x00000001) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE = (9, 9) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_MULTI_LINE_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE = (10, 10) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_REMAP_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE = (11, 11) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_FORCE_RMWDISABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_SRC_TYPE = (12, 12) +NVC6B5_LAUNCH_DMA_SRC_TYPE_VIRTUAL = (0x00000000) +NVC6B5_LAUNCH_DMA_SRC_TYPE_PHYSICAL = (0x00000001) +NVC6B5_LAUNCH_DMA_DST_TYPE = (13, 13) +NVC6B5_LAUNCH_DMA_DST_TYPE_VIRTUAL = (0x00000000) +NVC6B5_LAUNCH_DMA_DST_TYPE_PHYSICAL = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION = (17, 14) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IMIN = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IMAX = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IXOR = (0x00000002) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IAND = (0x00000003) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IOR = (0x00000004) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_IADD = (0x00000005) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_INC = (0x00000006) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_DEC = (0x00000007) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_FADD = (0x0000000A) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN = (18, 18) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN_SIGNED = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_SIGN_UNSIGNED = (0x00000001) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE = (19, 19) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_SEMAPHORE_REDUCTION_ENABLE_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_VPRMODE = (23, 22) +NVC6B5_LAUNCH_DMA_VPRMODE_VPR_NONE = (0x00000000) +NVC6B5_LAUNCH_DMA_VPRMODE_VPR_VID2VID = (0x00000001) +NVC6B5_LAUNCH_DMA_RESERVED_START_OF_COPY = (24, 24) +NVC6B5_LAUNCH_DMA_DISABLE_PLC = (26, 26) +NVC6B5_LAUNCH_DMA_DISABLE_PLC_FALSE = (0x00000000) +NVC6B5_LAUNCH_DMA_DISABLE_PLC_TRUE = (0x00000001) +NVC6B5_LAUNCH_DMA_RESERVED_ERR_CODE = (31, 28) +NVC6B5_OFFSET_IN_UPPER = (0x00000400) +NVC6B5_OFFSET_IN_UPPER_UPPER = (16, 0) +NVC6B5_OFFSET_IN_LOWER = (0x00000404) +NVC6B5_OFFSET_IN_LOWER_VALUE = (31, 0) +NVC6B5_OFFSET_OUT_UPPER = (0x00000408) +NVC6B5_OFFSET_OUT_UPPER_UPPER = (16, 0) +NVC6B5_OFFSET_OUT_LOWER = (0x0000040C) +NVC6B5_OFFSET_OUT_LOWER_VALUE = (31, 0) +NVC6B5_PITCH_IN = (0x00000410) +NVC6B5_PITCH_IN_VALUE = (31, 0) +NVC6B5_PITCH_OUT = (0x00000414) +NVC6B5_PITCH_OUT_VALUE = (31, 0) +NVC6B5_LINE_LENGTH_IN = (0x00000418) +NVC6B5_LINE_LENGTH_IN_VALUE = (31, 0) +NVC6B5_LINE_COUNT = (0x0000041C) +NVC6B5_LINE_COUNT_VALUE = (31, 0) +NVC6B5_SET_REMAP_CONST_A = (0x00000700) +NVC6B5_SET_REMAP_CONST_A_V = (31, 0) +NVC6B5_SET_REMAP_CONST_B = (0x00000704) +NVC6B5_SET_REMAP_CONST_B_V = (31, 0) +NVC6B5_SET_REMAP_COMPONENTS = (0x00000708) +NVC6B5_SET_REMAP_COMPONENTS_DST_X = (2, 0) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_X_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y = (6, 4) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z = (10, 8) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_DST_W = (14, 12) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_X = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_Y = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_Z = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_SRC_W = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_CONST_A = (0x00000004) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_CONST_B = (0x00000005) +NVC6B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE = (0x00000006) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE = (17, 16) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_COMPONENT_SIZE_FOUR = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS = (21, 20) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_NUM_SRC_COMPONENTS_FOUR = (0x00000003) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS = (25, 24) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_ONE = (0x00000000) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_TWO = (0x00000001) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_THREE = (0x00000002) +NVC6B5_SET_REMAP_COMPONENTS_NUM_DST_COMPONENTS_FOUR = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE = (0x0000070C) +NVC6B5_SET_DST_BLOCK_SIZE_WIDTH = (3, 0) +NVC6B5_SET_DST_BLOCK_SIZE_WIDTH_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_TWO_GOBS = (0x00000001) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_FOUR_GOBS = (0x00000002) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_DST_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH = (11, 8) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_ONE_GOB = (0x00000000) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_TWO_GOBS = (0x00000001) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_FOUR_GOBS = (0x00000002) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_DST_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_DST_BLOCK_SIZE_GOB_HEIGHT = (15, 12) +NVC6B5_SET_DST_BLOCK_SIZE_GOB_HEIGHT_GOB_HEIGHT_FERMI_8 = (0x00000001) +NVC6B5_SET_DST_WIDTH = (0x00000710) +NVC6B5_SET_DST_WIDTH_V = (31, 0) +NVC6B5_SET_DST_HEIGHT = (0x00000714) +NVC6B5_SET_DST_HEIGHT_V = (31, 0) +NVC6B5_SET_DST_DEPTH = (0x00000718) +NVC6B5_SET_DST_DEPTH_V = (31, 0) +NVC6B5_SET_DST_LAYER = (0x0000071C) +NVC6B5_SET_DST_LAYER_V = (31, 0) +NVC6B5_SET_DST_ORIGIN = (0x00000720) +NVC6B5_SET_DST_ORIGIN_X = (15, 0) +NVC6B5_SET_DST_ORIGIN_Y = (31, 16) +NVC6B5_SET_SRC_BLOCK_SIZE = (0x00000728) +NVC6B5_SET_SRC_BLOCK_SIZE_WIDTH = (3, 0) +NVC6B5_SET_SRC_BLOCK_SIZE_WIDTH_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT = (7, 4) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_TWO_GOBS = (0x00000001) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_FOUR_GOBS = (0x00000002) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_SRC_BLOCK_SIZE_HEIGHT_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH = (11, 8) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_ONE_GOB = (0x00000000) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_TWO_GOBS = (0x00000001) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_FOUR_GOBS = (0x00000002) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_EIGHT_GOBS = (0x00000003) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_SIXTEEN_GOBS = (0x00000004) +NVC6B5_SET_SRC_BLOCK_SIZE_DEPTH_THIRTYTWO_GOBS = (0x00000005) +NVC6B5_SET_SRC_BLOCK_SIZE_GOB_HEIGHT = (15, 12) +NVC6B5_SET_SRC_BLOCK_SIZE_GOB_HEIGHT_GOB_HEIGHT_FERMI_8 = (0x00000001) +NVC6B5_SET_SRC_WIDTH = (0x0000072C) +NVC6B5_SET_SRC_WIDTH_V = (31, 0) +NVC6B5_SET_SRC_HEIGHT = (0x00000730) +NVC6B5_SET_SRC_HEIGHT_V = (31, 0) +NVC6B5_SET_SRC_DEPTH = (0x00000734) +NVC6B5_SET_SRC_DEPTH_V = (31, 0) +NVC6B5_SET_SRC_LAYER = (0x00000738) +NVC6B5_SET_SRC_LAYER_V = (31, 0) +NVC6B5_SET_SRC_ORIGIN = (0x0000073C) +NVC6B5_SET_SRC_ORIGIN_X = (15, 0) +NVC6B5_SET_SRC_ORIGIN_Y = (31, 16) +NVC6B5_SRC_ORIGIN_X = (0x00000744) +NVC6B5_SRC_ORIGIN_X_VALUE = (31, 0) +NVC6B5_SRC_ORIGIN_Y = (0x00000748) +NVC6B5_SRC_ORIGIN_Y_VALUE = (31, 0) +NVC6B5_DST_ORIGIN_X = (0x0000074C) +NVC6B5_DST_ORIGIN_X_VALUE = (31, 0) +NVC6B5_DST_ORIGIN_Y = (0x00000750) +NVC6B5_DST_ORIGIN_Y_VALUE = (31, 0) +NVC6B5_PM_TRIGGER_END = (0x00001114) +NVC6B5_PM_TRIGGER_END_V = (31, 0) +BLACKWELL_DMA_COPY_A = (0x0000C9B5) +UVM_IOCTL_BASE = lambda i: i # type: ignore +UVM_RESERVE_VA = UVM_IOCTL_BASE(1) +UVM_RELEASE_VA = UVM_IOCTL_BASE(2) +UVM_REGION_COMMIT = UVM_IOCTL_BASE(3) +UVM_REGION_DECOMMIT = UVM_IOCTL_BASE(4) +UVM_REGION_SET_STREAM = UVM_IOCTL_BASE(5) +UVM_SET_STREAM_RUNNING = UVM_IOCTL_BASE(6) +UVM_MAX_STREAMS_PER_IOCTL_CALL = 32 +UVM_SET_STREAM_STOPPED = UVM_IOCTL_BASE(7) +UVM_ADD_SESSION = UVM_IOCTL_BASE(10) +UVM_MAX_COUNTERS_PER_IOCTL_CALL = 32 +UVM_ENABLE_COUNTERS = UVM_IOCTL_BASE(12) +UVM_MAP_COUNTER = UVM_IOCTL_BASE(13) +UVM_CREATE_EVENT_QUEUE = UVM_IOCTL_BASE(14) +UVM_REMOVE_EVENT_QUEUE = UVM_IOCTL_BASE(15) +UVM_MAP_EVENT_QUEUE = UVM_IOCTL_BASE(16) +UVM_EVENT_CTRL = UVM_IOCTL_BASE(17) +UVM_GET_GPU_UUID_TABLE = UVM_IOCTL_BASE(20) +UVM_REGISTER_GPU_VASPACE = UVM_IOCTL_BASE(25) +UVM_UNREGISTER_GPU_VASPACE = UVM_IOCTL_BASE(26) +UVM_REGISTER_CHANNEL = UVM_IOCTL_BASE(27) +UVM_UNREGISTER_CHANNEL = UVM_IOCTL_BASE(28) +UVM_ENABLE_PEER_ACCESS = UVM_IOCTL_BASE(29) +UVM_DISABLE_PEER_ACCESS = UVM_IOCTL_BASE(30) +UVM_MAP_EXTERNAL_ALLOCATION = UVM_IOCTL_BASE(33) +UVM_FREE = UVM_IOCTL_BASE(34) +UVM_MEM_MAP = UVM_IOCTL_BASE(35) +UVM_REGISTER_GPU = UVM_IOCTL_BASE(37) +UVM_UNREGISTER_GPU = UVM_IOCTL_BASE(38) +UVM_PAGEABLE_MEM_ACCESS = UVM_IOCTL_BASE(39) +UVM_SET_PREFERRED_LOCATION = UVM_IOCTL_BASE(42) +UVM_UNSET_PREFERRED_LOCATION = UVM_IOCTL_BASE(43) +UVM_ENABLE_READ_DUPLICATION = UVM_IOCTL_BASE(44) +UVM_DISABLE_READ_DUPLICATION = UVM_IOCTL_BASE(45) +UVM_SET_ACCESSED_BY = UVM_IOCTL_BASE(46) +UVM_UNSET_ACCESSED_BY = UVM_IOCTL_BASE(47) +UVM_MIGRATE_FLAG_ASYNC = 0x00000001 +UVM_MIGRATE_FLAG_SKIP_CPU_MAP = 0x00000002 +UVM_MIGRATE_FLAG_NO_GPU_VA_SPACE = 0x00000004 +UVM_MIGRATE_FLAGS_TEST_ALL = (UVM_MIGRATE_FLAG_SKIP_CPU_MAP | UVM_MIGRATE_FLAG_NO_GPU_VA_SPACE) +UVM_MIGRATE_FLAGS_ALL = (UVM_MIGRATE_FLAG_ASYNC | UVM_MIGRATE_FLAGS_TEST_ALL) +UVM_MIGRATE = UVM_IOCTL_BASE(51) +UVM_TOOLS_INIT_EVENT_TRACKER = UVM_IOCTL_BASE(56) +UVM_TOOLS_SET_NOTIFICATION_THRESHOLD = UVM_IOCTL_BASE(57) +UVM_TOOLS_EVENT_QUEUE_ENABLE_EVENTS = UVM_IOCTL_BASE(58) +UVM_TOOLS_EVENT_QUEUE_DISABLE_EVENTS = UVM_IOCTL_BASE(59) +UVM_TOOLS_ENABLE_COUNTERS = UVM_IOCTL_BASE(60) +UVM_TOOLS_DISABLE_COUNTERS = UVM_IOCTL_BASE(61) +UVM_TOOLS_READ_PROCESS_MEMORY = UVM_IOCTL_BASE(62) +UVM_TOOLS_WRITE_PROCESS_MEMORY = UVM_IOCTL_BASE(63) +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE = UVM_IOCTL_BASE(64) +UVM_MAP_DYNAMIC_PARALLELISM_REGION = UVM_IOCTL_BASE(65) +UVM_UNMAP_EXTERNAL = UVM_IOCTL_BASE(66) +UVM_TOOLS_FLUSH_EVENTS = UVM_IOCTL_BASE(67) +UVM_ALLOC_SEMAPHORE_POOL = UVM_IOCTL_BASE(68) +UVM_CLEAN_UP_ZOMBIE_RESOURCES = UVM_IOCTL_BASE(69) +UVM_PAGEABLE_MEM_ACCESS_ON_GPU = UVM_IOCTL_BASE(70) +UVM_POPULATE_PAGEABLE = UVM_IOCTL_BASE(71) +UVM_POPULATE_PAGEABLE_FLAG_ALLOW_MANAGED = 0x00000001 +UVM_POPULATE_PAGEABLE_FLAG_SKIP_PROT_CHECK = 0x00000002 +UVM_POPULATE_PAGEABLE_FLAG_ALLOW_SPECIAL = 0x00000004 +UVM_POPULATE_PAGEABLE_FLAGS_INTERNAL = UVM_POPULATE_PAGEABLE_FLAG_ALLOW_SPECIAL +UVM_POPULATE_PAGEABLE_FLAGS_TEST = (UVM_POPULATE_PAGEABLE_FLAG_ALLOW_MANAGED | UVM_POPULATE_PAGEABLE_FLAG_SKIP_PROT_CHECK) +UVM_POPULATE_PAGEABLE_FLAGS_ALL = (UVM_POPULATE_PAGEABLE_FLAGS_INTERNAL | UVM_POPULATE_PAGEABLE_FLAGS_TEST) +UVM_VALIDATE_VA_RANGE = UVM_IOCTL_BASE(72) +UVM_CREATE_EXTERNAL_RANGE = UVM_IOCTL_BASE(73) +UVM_MAP_EXTERNAL_SPARSE = UVM_IOCTL_BASE(74) +UVM_MM_INITIALIZE = UVM_IOCTL_BASE(75) +UVM_TOOLS_INIT_EVENT_TRACKER_V2 = UVM_IOCTL_BASE(76) +UVM_TOOLS_GET_PROCESSOR_UUID_TABLE_V2 = UVM_IOCTL_BASE(77) +UVM_ALLOC_DEVICE_P2P = UVM_IOCTL_BASE(78) +UVM_CLEAR_ALL_ACCESS_COUNTERS = UVM_IOCTL_BASE(79) +UVM_DISCARD = UVM_IOCTL_BASE(80) +UVM_QUERY_RESIDENCY = UVM_IOCTL_BASE(81) +UVM_IS_8_SUPPORTED = UVM_IOCTL_BASE(2047) +UVM_INITIALIZE = 0x30000001 +UVM_DEINITIALIZE = 0x30000002 +NV_PFAULT_MMU_ENG_ID_GRAPHICS = 64 +NV_PFAULT_MMU_ENG_ID_DISPLAY = 1 +NV_PFAULT_MMU_ENG_ID_GSP = 2 +NV_PFAULT_MMU_ENG_ID_IFB = 9 +NV_PFAULT_MMU_ENG_ID_FLA = 4 +NV_PFAULT_MMU_ENG_ID_BAR1 = 128 +NV_PFAULT_MMU_ENG_ID_BAR2 = 192 +NV_PFAULT_MMU_ENG_ID_SEC = 14 +NV_PFAULT_MMU_ENG_ID_PERF = 8 +NV_PFAULT_MMU_ENG_ID_NVDEC = 25 +NV_PFAULT_MMU_ENG_ID_NVDEC0 = 25 +NV_PFAULT_MMU_ENG_ID_NVDEC1 = 26 +NV_PFAULT_MMU_ENG_ID_NVDEC2 = 27 +NV_PFAULT_MMU_ENG_ID_NVDEC3 = 28 +NV_PFAULT_MMU_ENG_ID_NVDEC4 = 29 +NV_PFAULT_MMU_ENG_ID_NVJPG0 = 30 +NV_PFAULT_MMU_ENG_ID_GRCOPY = 15 +NV_PFAULT_MMU_ENG_ID_CE0 = 15 +NV_PFAULT_MMU_ENG_ID_CE1 = 16 +NV_PFAULT_MMU_ENG_ID_CE2 = 17 +NV_PFAULT_MMU_ENG_ID_CE3 = 18 +NV_PFAULT_MMU_ENG_ID_CE4 = 19 +NV_PFAULT_MMU_ENG_ID_CE5 = 20 +NV_PFAULT_MMU_ENG_ID_CE6 = 21 +NV_PFAULT_MMU_ENG_ID_CE7 = 22 +NV_PFAULT_MMU_ENG_ID_CE8 = 23 +NV_PFAULT_MMU_ENG_ID_CE9 = 24 +NV_PFAULT_MMU_ENG_ID_PWR_PMU = 6 +NV_PFAULT_MMU_ENG_ID_PTP = 3 +NV_PFAULT_MMU_ENG_ID_NVENC0 = 11 +NV_PFAULT_MMU_ENG_ID_NVENC1 = 12 +NV_PFAULT_MMU_ENG_ID_NVENC2 = 13 +NV_PFAULT_MMU_ENG_ID_OFA0 = 10 +NV_PFAULT_MMU_ENG_ID_PHYSICAL = 31 +NV_PFAULT_MMU_ENG_ID_HOST0 = 32 +NV_PFAULT_MMU_ENG_ID_HOST1 = 33 +NV_PFAULT_MMU_ENG_ID_HOST2 = 34 +NV_PFAULT_MMU_ENG_ID_HOST3 = 35 +NV_PFAULT_MMU_ENG_ID_HOST4 = 36 +NV_PFAULT_MMU_ENG_ID_HOST5 = 37 +NV_PFAULT_MMU_ENG_ID_HOST6 = 38 +NV_PFAULT_MMU_ENG_ID_HOST7 = 39 +NV_PFAULT_MMU_ENG_ID_HOST8 = 40 +NV_PFAULT_MMU_ENG_ID_HOST9 = 41 +NV_PFAULT_MMU_ENG_ID_HOST10 = 42 +NV_PFAULT_MMU_ENG_ID_HOST11 = 43 +NV_PFAULT_MMU_ENG_ID_HOST12 = 44 +NV_PFAULT_MMU_ENG_ID_HOST13 = 45 +NV_PFAULT_MMU_ENG_ID_HOST14 = 46 +NV_PFAULT_MMU_ENG_ID_HOST15 = 47 +NV_PFAULT_MMU_ENG_ID_HOST16 = 48 +NV_PFAULT_MMU_ENG_ID_HOST17 = 49 +NV_PFAULT_MMU_ENG_ID_HOST18 = 50 +NV_PFAULT_MMU_ENG_ID_HOST19 = 51 +NV_PFAULT_MMU_ENG_ID_HOST20 = 52 +NV_PFAULT_MMU_ENG_ID_HOST21 = 53 +NV_PFAULT_MMU_ENG_ID_HOST22 = 54 +NV_PFAULT_MMU_ENG_ID_HOST23 = 55 +NV_PFAULT_MMU_ENG_ID_HOST24 = 56 +NV_PFAULT_MMU_ENG_ID_HOST25 = 57 +NV_PFAULT_MMU_ENG_ID_HOST26 = 58 +NV_PFAULT_MMU_ENG_ID_HOST27 = 59 +NV_PFAULT_MMU_ENG_ID_HOST28 = 60 +NV_PFAULT_MMU_ENG_ID_HOST29 = 61 +NV_PFAULT_MMU_ENG_ID_HOST30 = 62 +NV_PFAULT_MMU_ENG_ID_HOST31 = 63 +NV_PFAULT_MMU_ENG_ID_BAR1_FN0 = 128 +NV_PFAULT_MMU_ENG_ID_BAR1_FN1 = 129 +NV_PFAULT_MMU_ENG_ID_BAR1_FN2 = 130 +NV_PFAULT_MMU_ENG_ID_BAR1_FN3 = 131 +NV_PFAULT_MMU_ENG_ID_BAR1_FN4 = 132 +NV_PFAULT_MMU_ENG_ID_BAR1_FN5 = 133 +NV_PFAULT_MMU_ENG_ID_BAR1_FN6 = 134 +NV_PFAULT_MMU_ENG_ID_BAR1_FN7 = 135 +NV_PFAULT_MMU_ENG_ID_BAR1_FN8 = 136 +NV_PFAULT_MMU_ENG_ID_BAR1_FN9 = 137 +NV_PFAULT_MMU_ENG_ID_BAR1_FN10 = 138 +NV_PFAULT_MMU_ENG_ID_BAR1_FN11 = 139 +NV_PFAULT_MMU_ENG_ID_BAR1_FN12 = 140 +NV_PFAULT_MMU_ENG_ID_BAR1_FN13 = 141 +NV_PFAULT_MMU_ENG_ID_BAR1_FN14 = 142 +NV_PFAULT_MMU_ENG_ID_BAR1_FN15 = 143 +NV_PFAULT_MMU_ENG_ID_BAR1_FN16 = 144 +NV_PFAULT_MMU_ENG_ID_BAR1_FN17 = 145 +NV_PFAULT_MMU_ENG_ID_BAR1_FN18 = 146 +NV_PFAULT_MMU_ENG_ID_BAR1_FN19 = 147 +NV_PFAULT_MMU_ENG_ID_BAR1_FN20 = 148 +NV_PFAULT_MMU_ENG_ID_BAR1_FN21 = 149 +NV_PFAULT_MMU_ENG_ID_BAR1_FN22 = 150 +NV_PFAULT_MMU_ENG_ID_BAR1_FN23 = 151 +NV_PFAULT_MMU_ENG_ID_BAR1_FN24 = 152 +NV_PFAULT_MMU_ENG_ID_BAR1_FN25 = 153 +NV_PFAULT_MMU_ENG_ID_BAR1_FN26 = 154 +NV_PFAULT_MMU_ENG_ID_BAR1_FN27 = 155 +NV_PFAULT_MMU_ENG_ID_BAR1_FN28 = 156 +NV_PFAULT_MMU_ENG_ID_BAR1_FN29 = 157 +NV_PFAULT_MMU_ENG_ID_BAR1_FN30 = 158 +NV_PFAULT_MMU_ENG_ID_BAR1_FN31 = 159 +NV_PFAULT_MMU_ENG_ID_BAR1_FN32 = 160 +NV_PFAULT_MMU_ENG_ID_BAR1_FN33 = 161 +NV_PFAULT_MMU_ENG_ID_BAR1_FN34 = 162 +NV_PFAULT_MMU_ENG_ID_BAR1_FN35 = 163 +NV_PFAULT_MMU_ENG_ID_BAR1_FN36 = 164 +NV_PFAULT_MMU_ENG_ID_BAR1_FN37 = 165 +NV_PFAULT_MMU_ENG_ID_BAR1_FN38 = 166 +NV_PFAULT_MMU_ENG_ID_BAR1_FN39 = 167 +NV_PFAULT_MMU_ENG_ID_BAR1_FN40 = 168 +NV_PFAULT_MMU_ENG_ID_BAR1_FN41 = 169 +NV_PFAULT_MMU_ENG_ID_BAR1_FN42 = 170 +NV_PFAULT_MMU_ENG_ID_BAR1_FN43 = 171 +NV_PFAULT_MMU_ENG_ID_BAR1_FN44 = 172 +NV_PFAULT_MMU_ENG_ID_BAR1_FN45 = 173 +NV_PFAULT_MMU_ENG_ID_BAR1_FN46 = 174 +NV_PFAULT_MMU_ENG_ID_BAR1_FN47 = 175 +NV_PFAULT_MMU_ENG_ID_BAR1_FN48 = 176 +NV_PFAULT_MMU_ENG_ID_BAR1_FN49 = 177 +NV_PFAULT_MMU_ENG_ID_BAR1_FN50 = 178 +NV_PFAULT_MMU_ENG_ID_BAR1_FN51 = 179 +NV_PFAULT_MMU_ENG_ID_BAR1_FN52 = 180 +NV_PFAULT_MMU_ENG_ID_BAR1_FN53 = 181 +NV_PFAULT_MMU_ENG_ID_BAR1_FN54 = 182 +NV_PFAULT_MMU_ENG_ID_BAR1_FN55 = 183 +NV_PFAULT_MMU_ENG_ID_BAR1_FN56 = 184 +NV_PFAULT_MMU_ENG_ID_BAR1_FN57 = 185 +NV_PFAULT_MMU_ENG_ID_BAR1_FN58 = 186 +NV_PFAULT_MMU_ENG_ID_BAR1_FN59 = 187 +NV_PFAULT_MMU_ENG_ID_BAR1_FN60 = 188 +NV_PFAULT_MMU_ENG_ID_BAR1_FN61 = 189 +NV_PFAULT_MMU_ENG_ID_BAR1_FN62 = 190 +NV_PFAULT_MMU_ENG_ID_BAR1_FN63 = 191 +NV_PFAULT_MMU_ENG_ID_BAR2_FN0 = 192 +NV_PFAULT_MMU_ENG_ID_BAR2_FN1 = 193 +NV_PFAULT_MMU_ENG_ID_BAR2_FN2 = 194 +NV_PFAULT_MMU_ENG_ID_BAR2_FN3 = 195 +NV_PFAULT_MMU_ENG_ID_BAR2_FN4 = 196 +NV_PFAULT_MMU_ENG_ID_BAR2_FN5 = 197 +NV_PFAULT_MMU_ENG_ID_BAR2_FN6 = 198 +NV_PFAULT_MMU_ENG_ID_BAR2_FN7 = 199 +NV_PFAULT_MMU_ENG_ID_BAR2_FN8 = 200 +NV_PFAULT_MMU_ENG_ID_BAR2_FN9 = 201 +NV_PFAULT_MMU_ENG_ID_BAR2_FN10 = 202 +NV_PFAULT_MMU_ENG_ID_BAR2_FN11 = 203 +NV_PFAULT_MMU_ENG_ID_BAR2_FN12 = 204 +NV_PFAULT_MMU_ENG_ID_BAR2_FN13 = 205 +NV_PFAULT_MMU_ENG_ID_BAR2_FN14 = 206 +NV_PFAULT_MMU_ENG_ID_BAR2_FN15 = 207 +NV_PFAULT_MMU_ENG_ID_BAR2_FN16 = 208 +NV_PFAULT_MMU_ENG_ID_BAR2_FN17 = 209 +NV_PFAULT_MMU_ENG_ID_BAR2_FN18 = 210 +NV_PFAULT_MMU_ENG_ID_BAR2_FN19 = 211 +NV_PFAULT_MMU_ENG_ID_BAR2_FN20 = 212 +NV_PFAULT_MMU_ENG_ID_BAR2_FN21 = 213 +NV_PFAULT_MMU_ENG_ID_BAR2_FN22 = 214 +NV_PFAULT_MMU_ENG_ID_BAR2_FN23 = 215 +NV_PFAULT_MMU_ENG_ID_BAR2_FN24 = 216 +NV_PFAULT_MMU_ENG_ID_BAR2_FN25 = 217 +NV_PFAULT_MMU_ENG_ID_BAR2_FN26 = 218 +NV_PFAULT_MMU_ENG_ID_BAR2_FN27 = 219 +NV_PFAULT_MMU_ENG_ID_BAR2_FN28 = 220 +NV_PFAULT_MMU_ENG_ID_BAR2_FN29 = 221 +NV_PFAULT_MMU_ENG_ID_BAR2_FN30 = 222 +NV_PFAULT_MMU_ENG_ID_BAR2_FN31 = 223 +NV_PFAULT_MMU_ENG_ID_BAR2_FN32 = 224 +NV_PFAULT_MMU_ENG_ID_BAR2_FN33 = 225 +NV_PFAULT_MMU_ENG_ID_BAR2_FN34 = 226 +NV_PFAULT_MMU_ENG_ID_BAR2_FN35 = 227 +NV_PFAULT_MMU_ENG_ID_BAR2_FN36 = 228 +NV_PFAULT_MMU_ENG_ID_BAR2_FN37 = 229 +NV_PFAULT_MMU_ENG_ID_BAR2_FN38 = 230 +NV_PFAULT_MMU_ENG_ID_BAR2_FN39 = 231 +NV_PFAULT_MMU_ENG_ID_BAR2_FN40 = 232 +NV_PFAULT_MMU_ENG_ID_BAR2_FN41 = 233 +NV_PFAULT_MMU_ENG_ID_BAR2_FN42 = 234 +NV_PFAULT_MMU_ENG_ID_BAR2_FN43 = 235 +NV_PFAULT_MMU_ENG_ID_BAR2_FN44 = 236 +NV_PFAULT_MMU_ENG_ID_BAR2_FN45 = 237 +NV_PFAULT_MMU_ENG_ID_BAR2_FN46 = 238 +NV_PFAULT_MMU_ENG_ID_BAR2_FN47 = 239 +NV_PFAULT_MMU_ENG_ID_BAR2_FN48 = 240 +NV_PFAULT_MMU_ENG_ID_BAR2_FN49 = 241 +NV_PFAULT_MMU_ENG_ID_BAR2_FN50 = 242 +NV_PFAULT_MMU_ENG_ID_BAR2_FN51 = 243 +NV_PFAULT_MMU_ENG_ID_BAR2_FN52 = 244 +NV_PFAULT_MMU_ENG_ID_BAR2_FN53 = 245 +NV_PFAULT_MMU_ENG_ID_BAR2_FN54 = 246 +NV_PFAULT_MMU_ENG_ID_BAR2_FN55 = 247 +NV_PFAULT_MMU_ENG_ID_BAR2_FN56 = 248 +NV_PFAULT_MMU_ENG_ID_BAR2_FN57 = 249 +NV_PFAULT_MMU_ENG_ID_BAR2_FN58 = 250 +NV_PFAULT_MMU_ENG_ID_BAR2_FN59 = 251 +NV_PFAULT_MMU_ENG_ID_BAR2_FN60 = 252 +NV_PFAULT_MMU_ENG_ID_BAR2_FN61 = 253 +NV_PFAULT_MMU_ENG_ID_BAR2_FN62 = 254 +NV_PFAULT_MMU_ENG_ID_BAR2_FN63 = 255 +NV_PFAULT_FAULT_TYPE = (4, 0) +NV_PFAULT_FAULT_TYPE_PDE = 0x00000000 +NV_PFAULT_FAULT_TYPE_PDE_SIZE = 0x00000001 +NV_PFAULT_FAULT_TYPE_PTE = 0x00000002 +NV_PFAULT_FAULT_TYPE_VA_LIMIT_VIOLATION = 0x00000003 +NV_PFAULT_FAULT_TYPE_UNBOUND_INST_BLOCK = 0x00000004 +NV_PFAULT_FAULT_TYPE_PRIV_VIOLATION = 0x00000005 +NV_PFAULT_FAULT_TYPE_RO_VIOLATION = 0x00000006 +NV_PFAULT_FAULT_TYPE_WO_VIOLATION = 0x00000007 +NV_PFAULT_FAULT_TYPE_PITCH_MASK_VIOLATION = 0x00000008 +NV_PFAULT_FAULT_TYPE_WORK_CREATION = 0x00000009 +NV_PFAULT_FAULT_TYPE_UNSUPPORTED_APERTURE = 0x0000000a +NV_PFAULT_FAULT_TYPE_COMPRESSION_FAILURE = 0x0000000b +NV_PFAULT_FAULT_TYPE_UNSUPPORTED_KIND = 0x0000000c +NV_PFAULT_FAULT_TYPE_REGION_VIOLATION = 0x0000000d +NV_PFAULT_FAULT_TYPE_POISONED = 0x0000000e +NV_PFAULT_FAULT_TYPE_ATOMIC_VIOLATION = 0x0000000f +NV_PFAULT_CLIENT = (14, 8) +NV_PFAULT_CLIENT_GPC_T1_0 = 0x00000000 +NV_PFAULT_CLIENT_GPC_T1_1 = 0x00000001 +NV_PFAULT_CLIENT_GPC_T1_2 = 0x00000002 +NV_PFAULT_CLIENT_GPC_T1_3 = 0x00000003 +NV_PFAULT_CLIENT_GPC_T1_4 = 0x00000004 +NV_PFAULT_CLIENT_GPC_T1_5 = 0x00000005 +NV_PFAULT_CLIENT_GPC_T1_6 = 0x00000006 +NV_PFAULT_CLIENT_GPC_T1_7 = 0x00000007 +NV_PFAULT_CLIENT_GPC_PE_0 = 0x00000008 +NV_PFAULT_CLIENT_GPC_PE_1 = 0x00000009 +NV_PFAULT_CLIENT_GPC_PE_2 = 0x0000000A +NV_PFAULT_CLIENT_GPC_PE_3 = 0x0000000B +NV_PFAULT_CLIENT_GPC_PE_4 = 0x0000000C +NV_PFAULT_CLIENT_GPC_PE_5 = 0x0000000D +NV_PFAULT_CLIENT_GPC_PE_6 = 0x0000000E +NV_PFAULT_CLIENT_GPC_PE_7 = 0x0000000F +NV_PFAULT_CLIENT_GPC_RAST = 0x00000010 +NV_PFAULT_CLIENT_GPC_GCC = 0x00000011 +NV_PFAULT_CLIENT_GPC_GPCCS = 0x00000012 +NV_PFAULT_CLIENT_GPC_PROP_0 = 0x00000013 +NV_PFAULT_CLIENT_GPC_PROP_1 = 0x00000014 +NV_PFAULT_CLIENT_GPC_PROP_2 = 0x00000015 +NV_PFAULT_CLIENT_GPC_PROP_3 = 0x00000016 +NV_PFAULT_CLIENT_GPC_T1_8 = 0x00000021 +NV_PFAULT_CLIENT_GPC_T1_9 = 0x00000022 +NV_PFAULT_CLIENT_GPC_T1_10 = 0x00000023 +NV_PFAULT_CLIENT_GPC_T1_11 = 0x00000024 +NV_PFAULT_CLIENT_GPC_T1_12 = 0x00000025 +NV_PFAULT_CLIENT_GPC_T1_13 = 0x00000026 +NV_PFAULT_CLIENT_GPC_T1_14 = 0x00000027 +NV_PFAULT_CLIENT_GPC_T1_15 = 0x00000028 +NV_PFAULT_CLIENT_GPC_TPCCS_0 = 0x00000029 +NV_PFAULT_CLIENT_GPC_TPCCS_1 = 0x0000002A +NV_PFAULT_CLIENT_GPC_TPCCS_2 = 0x0000002B +NV_PFAULT_CLIENT_GPC_TPCCS_3 = 0x0000002C +NV_PFAULT_CLIENT_GPC_TPCCS_4 = 0x0000002D +NV_PFAULT_CLIENT_GPC_TPCCS_5 = 0x0000002E +NV_PFAULT_CLIENT_GPC_TPCCS_6 = 0x0000002F +NV_PFAULT_CLIENT_GPC_TPCCS_7 = 0x00000030 +NV_PFAULT_CLIENT_GPC_PE_8 = 0x00000031 +NV_PFAULT_CLIENT_GPC_PE_9 = 0x00000032 +NV_PFAULT_CLIENT_GPC_TPCCS_8 = 0x00000033 +NV_PFAULT_CLIENT_GPC_TPCCS_9 = 0x00000034 +NV_PFAULT_CLIENT_GPC_T1_16 = 0x00000035 +NV_PFAULT_CLIENT_GPC_T1_17 = 0x00000036 +NV_PFAULT_CLIENT_GPC_T1_18 = 0x00000037 +NV_PFAULT_CLIENT_GPC_T1_19 = 0x00000038 +NV_PFAULT_CLIENT_GPC_PE_10 = 0x00000039 +NV_PFAULT_CLIENT_GPC_PE_11 = 0x0000003A +NV_PFAULT_CLIENT_GPC_TPCCS_10 = 0x0000003B +NV_PFAULT_CLIENT_GPC_TPCCS_11 = 0x0000003C +NV_PFAULT_CLIENT_GPC_T1_20 = 0x0000003D +NV_PFAULT_CLIENT_GPC_T1_21 = 0x0000003E +NV_PFAULT_CLIENT_GPC_T1_22 = 0x0000003F +NV_PFAULT_CLIENT_GPC_T1_23 = 0x00000040 +NV_PFAULT_CLIENT_GPC_PE_12 = 0x00000041 +NV_PFAULT_CLIENT_GPC_PE_13 = 0x00000042 +NV_PFAULT_CLIENT_GPC_TPCCS_12 = 0x00000043 +NV_PFAULT_CLIENT_GPC_TPCCS_13 = 0x00000044 +NV_PFAULT_CLIENT_GPC_T1_24 = 0x00000045 +NV_PFAULT_CLIENT_GPC_T1_25 = 0x00000046 +NV_PFAULT_CLIENT_GPC_T1_26 = 0x00000047 +NV_PFAULT_CLIENT_GPC_T1_27 = 0x00000048 +NV_PFAULT_CLIENT_GPC_PE_14 = 0x00000049 +NV_PFAULT_CLIENT_GPC_PE_15 = 0x0000004A +NV_PFAULT_CLIENT_GPC_TPCCS_14 = 0x0000004B +NV_PFAULT_CLIENT_GPC_TPCCS_15 = 0x0000004C +NV_PFAULT_CLIENT_GPC_T1_28 = 0x0000004D +NV_PFAULT_CLIENT_GPC_T1_29 = 0x0000004E +NV_PFAULT_CLIENT_GPC_T1_30 = 0x0000004F +NV_PFAULT_CLIENT_GPC_T1_31 = 0x00000050 +NV_PFAULT_CLIENT_GPC_PE_16 = 0x00000051 +NV_PFAULT_CLIENT_GPC_PE_17 = 0x00000052 +NV_PFAULT_CLIENT_GPC_TPCCS_16 = 0x00000053 +NV_PFAULT_CLIENT_GPC_TPCCS_17 = 0x00000054 +NV_PFAULT_CLIENT_GPC_T1_32 = 0x00000055 +NV_PFAULT_CLIENT_GPC_T1_33 = 0x00000056 +NV_PFAULT_CLIENT_GPC_T1_34 = 0x00000057 +NV_PFAULT_CLIENT_GPC_T1_35 = 0x00000058 +NV_PFAULT_CLIENT_GPC_PE_18 = 0x00000059 +NV_PFAULT_CLIENT_GPC_PE_19 = 0x0000005A +NV_PFAULT_CLIENT_GPC_TPCCS_18 = 0x0000005B +NV_PFAULT_CLIENT_GPC_TPCCS_19 = 0x0000005C +NV_PFAULT_CLIENT_GPC_T1_36 = 0x0000005D +NV_PFAULT_CLIENT_GPC_T1_37 = 0x0000005E +NV_PFAULT_CLIENT_GPC_T1_38 = 0x0000005F +NV_PFAULT_CLIENT_GPC_T1_39 = 0x00000060 +NV_PFAULT_CLIENT_GPC_ROP_0 = 0x00000070 +NV_PFAULT_CLIENT_GPC_ROP_1 = 0x00000071 +NV_PFAULT_CLIENT_GPC_ROP_2 = 0x00000072 +NV_PFAULT_CLIENT_GPC_ROP_3 = 0x00000073 +NV_PFAULT_CLIENT_GPC_GPM = 0x00000017 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_0 = 0x00000018 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_1 = 0x00000019 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_2 = 0x0000001A +NV_PFAULT_CLIENT_GPC_LTP_UTLB_3 = 0x0000001B +NV_PFAULT_CLIENT_GPC_LTP_UTLB_4 = 0x0000001C +NV_PFAULT_CLIENT_GPC_LTP_UTLB_5 = 0x0000001D +NV_PFAULT_CLIENT_GPC_LTP_UTLB_6 = 0x0000001E +NV_PFAULT_CLIENT_GPC_LTP_UTLB_7 = 0x0000001F +NV_PFAULT_CLIENT_GPC_RGG_UTLB = 0x00000020 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_8 = 0x00000031 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_9 = 0x00000032 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_10 = 0x00000033 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_11 = 0x00000034 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_12 = 0x00000035 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_13 = 0x00000036 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_14 = 0x00000037 +NV_PFAULT_CLIENT_GPC_LTP_UTLB_15 = 0x00000038 +NV_PFAULT_CLIENT_HUB_VIP = 0x00000000 +NV_PFAULT_CLIENT_HUB_CE0 = 0x00000001 +NV_PFAULT_CLIENT_HUB_CE1 = 0x00000002 +NV_PFAULT_CLIENT_HUB_DNISO = 0x00000003 +NV_PFAULT_CLIENT_HUB_DISPNISO = 0x00000003 +NV_PFAULT_CLIENT_HUB_FE0 = 0x00000004 +NV_PFAULT_CLIENT_HUB_FE = 0x00000004 +NV_PFAULT_CLIENT_HUB_FECS0 = 0x00000005 +NV_PFAULT_CLIENT_HUB_FECS = 0x00000005 +NV_PFAULT_CLIENT_HUB_HOST = 0x00000006 +NV_PFAULT_CLIENT_HUB_HOST_CPU = 0x00000007 +NV_PFAULT_CLIENT_HUB_HOST_CPU_NB = 0x00000008 +NV_PFAULT_CLIENT_HUB_ISO = 0x00000009 +NV_PFAULT_CLIENT_HUB_MMU = 0x0000000A +NV_PFAULT_CLIENT_HUB_NVDEC0 = 0x0000000B +NV_PFAULT_CLIENT_HUB_NVDEC = 0x0000000B +NV_PFAULT_CLIENT_HUB_NVENC1 = 0x0000000D +NV_PFAULT_CLIENT_HUB_NISO = 0x0000000E +NV_PFAULT_CLIENT_HUB_ACTRS = 0x0000000E +NV_PFAULT_CLIENT_HUB_P2P = 0x0000000F +NV_PFAULT_CLIENT_HUB_PD = 0x00000010 +NV_PFAULT_CLIENT_HUB_PERF0 = 0x00000011 +NV_PFAULT_CLIENT_HUB_PERF = 0x00000011 +NV_PFAULT_CLIENT_HUB_PMU = 0x00000012 +NV_PFAULT_CLIENT_HUB_RASTERTWOD = 0x00000013 +NV_PFAULT_CLIENT_HUB_SCC = 0x00000014 +NV_PFAULT_CLIENT_HUB_SCC_NB = 0x00000015 +NV_PFAULT_CLIENT_HUB_SEC = 0x00000016 +NV_PFAULT_CLIENT_HUB_SSYNC = 0x00000017 +NV_PFAULT_CLIENT_HUB_GRCOPY = 0x00000018 +NV_PFAULT_CLIENT_HUB_CE2 = 0x00000018 +NV_PFAULT_CLIENT_HUB_XV = 0x00000019 +NV_PFAULT_CLIENT_HUB_MMU_NB = 0x0000001A +NV_PFAULT_CLIENT_HUB_NVENC0 = 0x0000001B +NV_PFAULT_CLIENT_HUB_NVENC = 0x0000001B +NV_PFAULT_CLIENT_HUB_DFALCON = 0x0000001C +NV_PFAULT_CLIENT_HUB_SKED0 = 0x0000001D +NV_PFAULT_CLIENT_HUB_SKED = 0x0000001D +NV_PFAULT_CLIENT_HUB_AFALCON = 0x0000001E +NV_PFAULT_CLIENT_HUB_DONT_CARE = 0x0000001F +NV_PFAULT_CLIENT_HUB_HSCE0 = 0x00000020 +NV_PFAULT_CLIENT_HUB_HSCE1 = 0x00000021 +NV_PFAULT_CLIENT_HUB_HSCE2 = 0x00000022 +NV_PFAULT_CLIENT_HUB_HSCE3 = 0x00000023 +NV_PFAULT_CLIENT_HUB_HSCE4 = 0x00000024 +NV_PFAULT_CLIENT_HUB_HSCE5 = 0x00000025 +NV_PFAULT_CLIENT_HUB_HSCE6 = 0x00000026 +NV_PFAULT_CLIENT_HUB_HSCE7 = 0x00000027 +NV_PFAULT_CLIENT_HUB_HSCE8 = 0x00000028 +NV_PFAULT_CLIENT_HUB_HSCE9 = 0x00000029 +NV_PFAULT_CLIENT_HUB_HSHUB = 0x0000002A +NV_PFAULT_CLIENT_HUB_PTP_X0 = 0x0000002B +NV_PFAULT_CLIENT_HUB_PTP_X1 = 0x0000002C +NV_PFAULT_CLIENT_HUB_PTP_X2 = 0x0000002D +NV_PFAULT_CLIENT_HUB_PTP_X3 = 0x0000002E +NV_PFAULT_CLIENT_HUB_PTP_X4 = 0x0000002F +NV_PFAULT_CLIENT_HUB_PTP_X5 = 0x00000030 +NV_PFAULT_CLIENT_HUB_PTP_X6 = 0x00000031 +NV_PFAULT_CLIENT_HUB_PTP_X7 = 0x00000032 +NV_PFAULT_CLIENT_HUB_NVENC2 = 0x00000033 +NV_PFAULT_CLIENT_HUB_VPR_SCRUBBER0 = 0x00000034 +NV_PFAULT_CLIENT_HUB_VPR_SCRUBBER1 = 0x00000035 +NV_PFAULT_CLIENT_HUB_DWBIF = 0x00000036 +NV_PFAULT_CLIENT_HUB_FBFALCON = 0x00000037 +NV_PFAULT_CLIENT_HUB_CE_SHIM = 0x00000038 +NV_PFAULT_CLIENT_HUB_GSP = 0x00000039 +NV_PFAULT_CLIENT_HUB_NVDEC1 = 0x0000003A +NV_PFAULT_CLIENT_HUB_NVDEC2 = 0x0000003B +NV_PFAULT_CLIENT_HUB_NVJPG0 = 0x0000003C +NV_PFAULT_CLIENT_HUB_NVDEC3 = 0x0000003D +NV_PFAULT_CLIENT_HUB_NVDEC4 = 0x0000003E +NV_PFAULT_CLIENT_HUB_OFA0 = 0x0000003F +NV_PFAULT_CLIENT_HUB_HSCE10 = 0x00000040 +NV_PFAULT_CLIENT_HUB_HSCE11 = 0x00000041 +NV_PFAULT_CLIENT_HUB_HSCE12 = 0x00000042 +NV_PFAULT_CLIENT_HUB_HSCE13 = 0x00000043 +NV_PFAULT_CLIENT_HUB_HSCE14 = 0x00000044 +NV_PFAULT_CLIENT_HUB_HSCE15 = 0x00000045 +NV_PFAULT_CLIENT_HUB_PTP_X8 = 0x00000046 +NV_PFAULT_CLIENT_HUB_PTP_X9 = 0x00000047 +NV_PFAULT_CLIENT_HUB_PTP_X10 = 0x00000048 +NV_PFAULT_CLIENT_HUB_PTP_X11 = 0x00000049 +NV_PFAULT_CLIENT_HUB_PTP_X12 = 0x0000004A +NV_PFAULT_CLIENT_HUB_PTP_X13 = 0x0000004B +NV_PFAULT_CLIENT_HUB_PTP_X14 = 0x0000004C +NV_PFAULT_CLIENT_HUB_PTP_X15 = 0x0000004D +NV_PFAULT_CLIENT_HUB_FE1 = 0x0000004E +NV_PFAULT_CLIENT_HUB_FE2 = 0x0000004F +NV_PFAULT_CLIENT_HUB_FE3 = 0x00000050 +NV_PFAULT_CLIENT_HUB_FE4 = 0x00000051 +NV_PFAULT_CLIENT_HUB_FE5 = 0x00000052 +NV_PFAULT_CLIENT_HUB_FE6 = 0x00000053 +NV_PFAULT_CLIENT_HUB_FE7 = 0x00000054 +NV_PFAULT_CLIENT_HUB_FECS1 = 0x00000055 +NV_PFAULT_CLIENT_HUB_FECS2 = 0x00000056 +NV_PFAULT_CLIENT_HUB_FECS3 = 0x00000057 +NV_PFAULT_CLIENT_HUB_FECS4 = 0x00000058 +NV_PFAULT_CLIENT_HUB_FECS5 = 0x00000059 +NV_PFAULT_CLIENT_HUB_FECS6 = 0x0000005A +NV_PFAULT_CLIENT_HUB_FECS7 = 0x0000005B +NV_PFAULT_CLIENT_HUB_SKED1 = 0x0000005C +NV_PFAULT_CLIENT_HUB_SKED2 = 0x0000005D +NV_PFAULT_CLIENT_HUB_SKED3 = 0x0000005E +NV_PFAULT_CLIENT_HUB_SKED4 = 0x0000005F +NV_PFAULT_CLIENT_HUB_SKED5 = 0x00000060 +NV_PFAULT_CLIENT_HUB_SKED6 = 0x00000061 +NV_PFAULT_CLIENT_HUB_SKED7 = 0x00000062 +NV_PFAULT_CLIENT_HUB_ESC = 0x00000063 +NV_PFAULT_ACCESS_TYPE = (19, 16) +NV_PFAULT_ACCESS_TYPE_READ = 0x00000000 +NV_PFAULT_ACCESS_TYPE_WRITE = 0x00000001 +NV_PFAULT_ACCESS_TYPE_ATOMIC = 0x00000002 +NV_PFAULT_ACCESS_TYPE_PREFETCH = 0x00000003 +NV_PFAULT_ACCESS_TYPE_VIRT_READ = 0x00000000 +NV_PFAULT_ACCESS_TYPE_VIRT_WRITE = 0x00000001 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC = 0x00000002 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC_STRONG = 0x00000002 +NV_PFAULT_ACCESS_TYPE_VIRT_PREFETCH = 0x00000003 +NV_PFAULT_ACCESS_TYPE_VIRT_ATOMIC_WEAK = 0x00000004 +NV_PFAULT_ACCESS_TYPE_PHYS_READ = 0x00000008 +NV_PFAULT_ACCESS_TYPE_PHYS_WRITE = 0x00000009 +NV_PFAULT_ACCESS_TYPE_PHYS_ATOMIC = 0x0000000a +NV_PFAULT_ACCESS_TYPE_PHYS_PREFETCH = 0x0000000b +NV_PFAULT_MMU_CLIENT_TYPE = (20, 20) +NV_PFAULT_MMU_CLIENT_TYPE_GPC = 0x00000000 +NV_PFAULT_MMU_CLIENT_TYPE_HUB = 0x00000001 +NV_PFAULT_GPC_ID = (28, 24) +NV_PFAULT_PROTECTED_MODE = (29, 29) +NV_PFAULT_REPLAYABLE_FAULT_EN = (30, 30) +NV_PFAULT_VALID = (31, 31) +NV_ESC_RM_ALLOC_MEMORY = 0x27 +NV_ESC_RM_ALLOC_OBJECT = 0x28 +NV_ESC_RM_FREE = 0x29 +NV_ESC_RM_CONTROL = 0x2A +NV_ESC_RM_ALLOC = 0x2B +NV_ESC_RM_DUP_OBJECT = 0x34 +NV_ESC_RM_SHARE = 0x35 +NV_ESC_RM_I2C_ACCESS = 0x39 +NV_ESC_RM_IDLE_CHANNELS = 0x41 +NV_ESC_RM_VID_HEAP_CONTROL = 0x4A +NV_ESC_RM_ACCESS_REGISTRY = 0x4D +NV_ESC_RM_MAP_MEMORY = 0x4E +NV_ESC_RM_UNMAP_MEMORY = 0x4F +NV_ESC_RM_GET_EVENT_DATA = 0x52 +NV_ESC_RM_ALLOC_CONTEXT_DMA2 = 0x54 +NV_ESC_RM_ADD_VBLANK_CALLBACK = 0x56 +NV_ESC_RM_MAP_MEMORY_DMA = 0x57 +NV_ESC_RM_UNMAP_MEMORY_DMA = 0x58 +NV_ESC_RM_BIND_CONTEXT_DMA = 0x59 +NV_ESC_RM_EXPORT_OBJECT_TO_FD = 0x5C +NV_ESC_RM_IMPORT_OBJECT_FROM_FD = 0x5D +NV_ESC_RM_UPDATE_DEVICE_MAPPING_INFO = 0x5E +NV_ESC_RM_LOCKLESS_DIAGNOSTIC = 0x5F +NV_RM_API_VERSION_STRING_LENGTH = 64 +NV_RM_API_VERSION_CMD_STRICT = 0 +NV_RM_API_VERSION_CMD_RELAXED = '1' +NV_RM_API_VERSION_CMD_QUERY = '2' +NV_RM_API_VERSION_REPLY_UNRECOGNIZED = 0 +NV_RM_API_VERSION_REPLY_RECOGNIZED = 1 +NV_DMABUF_EXPORT_MAX_HANDLES = 128 +NV_DMABUF_EXPORT_MAPPING_TYPE_DEFAULT = 0 +NV_DMABUF_EXPORT_MAPPING_TYPE_FORCE_PCIE = 1 +NV_IOCTL_MAGIC = 'F' +NV_IOCTL_BASE = 200 +NV_ESC_CARD_INFO = (NV_IOCTL_BASE + 0) +NV_ESC_REGISTER_FD = (NV_IOCTL_BASE + 1) +NV_ESC_ALLOC_OS_EVENT = (NV_IOCTL_BASE + 6) +NV_ESC_FREE_OS_EVENT = (NV_IOCTL_BASE + 7) +NV_ESC_STATUS_CODE = (NV_IOCTL_BASE + 9) +NV_ESC_CHECK_VERSION_STR = (NV_IOCTL_BASE + 10) +NV_ESC_IOCTL_XFER_CMD = (NV_IOCTL_BASE + 11) +NV_ESC_ATTACH_GPUS_TO_FD = (NV_IOCTL_BASE + 12) +NV_ESC_QUERY_DEVICE_INTR = (NV_IOCTL_BASE + 13) +NV_ESC_SYS_PARAMS = (NV_IOCTL_BASE + 14) +NV_ESC_EXPORT_TO_DMABUF_FD = (NV_IOCTL_BASE + 17) +NV_ESC_WAIT_OPEN_COMPLETE = (NV_IOCTL_BASE + 18) +__aligned = lambda n: __attribute__((aligned(n))) # type: ignore +NV_ESC_NUMA_INFO = (NV_IOCTL_BASE + 15) +NV_ESC_SET_NUMA_STATUS = (NV_IOCTL_BASE + 16) +NV_IOCTL_NUMA_INFO_MAX_OFFLINE_ADDRESSES = 64 +NV_IOCTL_NUMA_STATUS_DISABLED = 0 +NV_IOCTL_NUMA_STATUS_OFFLINE = 1 +NV_IOCTL_NUMA_STATUS_ONLINE_IN_PROGRESS = 2 +NV_IOCTL_NUMA_STATUS_ONLINE = 3 +NV_IOCTL_NUMA_STATUS_ONLINE_FAILED = 4 +NV_IOCTL_NUMA_STATUS_OFFLINE_IN_PROGRESS = 5 +NV_IOCTL_NUMA_STATUS_OFFLINE_FAILED = 6 +NVOS04_FLAGS_CHANNEL_TYPE = (1, 0) +NVOS04_FLAGS_CHANNEL_TYPE_PHYSICAL = 0x00000000 +NVOS04_FLAGS_CHANNEL_TYPE_VIRTUAL = 0x00000001 +NVOS04_FLAGS_CHANNEL_TYPE_PHYSICAL_FOR_VIRTUAL = 0x00000002 +NVOS04_FLAGS_VPR = (2, 2) +NVOS04_FLAGS_VPR_FALSE = 0x00000000 +NVOS04_FLAGS_VPR_TRUE = 0x00000001 +NVOS04_FLAGS_CC_SECURE = (2, 2) +NVOS04_FLAGS_CC_SECURE_FALSE = 0x00000000 +NVOS04_FLAGS_CC_SECURE_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING = (3, 3) +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_SKIP_MAP_REFCOUNTING_TRUE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE = (4, 4) +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE_DEFAULT = 0x00000000 +NVOS04_FLAGS_GROUP_CHANNEL_RUNQUEUE_ONE = 0x00000001 +NVOS04_FLAGS_PRIVILEGED_CHANNEL = (5, 5) +NVOS04_FLAGS_PRIVILEGED_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_PRIVILEGED_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING = (6, 6) +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING_FALSE = 0x00000000 +NVOS04_FLAGS_DELAY_CHANNEL_SCHEDULING_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE = (7, 7) +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_DENY_PHYSICAL_MODE_CE_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_VALUE = (10, 8) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED = (11, 11) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_FIXED_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_VALUE = (20, 12) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED = (21, 21) +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_USERD_INDEX_PAGE_FIXED_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV = (22, 22) +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_DENY_AUTH_LEVEL_PRIV_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER = (23, 23) +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_SKIP_SCRUBBER_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO = (24, 24) +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_CLIENT_MAP_FIFO_TRUE = 0x00000001 +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL = (25, 25) +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_SET_EVICT_LAST_CE_PREFETCH_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT = (26, 26) +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_VGPU_PLUGIN_CONTEXT_TRUE = 0x00000001 +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT = (27, 27) +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT_FALSE = 0x00000000 +NVOS04_FLAGS_CHANNEL_PBDMA_ACQUIRE_TIMEOUT_TRUE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD = (29, 28) +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_DEFAULT = 0x00000000 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_ONE = 0x00000001 +NVOS04_FLAGS_GROUP_CHANNEL_THREAD_TWO = 0x00000002 +NVOS04_FLAGS_MAP_CHANNEL = (30, 30) +NVOS04_FLAGS_MAP_CHANNEL_FALSE = 0x00000000 +NVOS04_FLAGS_MAP_CHANNEL_TRUE = 0x00000001 +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC = (31, 31) +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC_FALSE = 0x00000000 +NVOS04_FLAGS_SKIP_CTXBUFFER_ALLOC_TRUE = 0x00000001 +CC_CHAN_ALLOC_IV_SIZE_DWORD = 3 +CC_CHAN_ALLOC_NONCE_SIZE_DWORD = 8 +NV_CHANNEL_ALLOC_PARAMS_MESSAGE_ID = (0x906f) +FILE_DEVICE_NV = 0x00008000 +NV_IOCTL_FCT_BASE = 0x00000800 +NVOS_MAX_SUBDEVICES = 8 +UNIFIED_NV_STATUS = 1 +NVOS_STATUS = NV_STATUS +NVOS_STATUS_SUCCESS = NV_OK +NVOS_STATUS_ERROR_CARD_NOT_PRESENT = NV_ERR_CARD_NOT_PRESENT +NVOS_STATUS_ERROR_DUAL_LINK_INUSE = NV_ERR_DUAL_LINK_INUSE +NVOS_STATUS_ERROR_GENERIC = NV_ERR_GENERIC +NVOS_STATUS_ERROR_GPU_NOT_FULL_POWER = NV_ERR_GPU_NOT_FULL_POWER +NVOS_STATUS_ERROR_ILLEGAL_ACTION = NV_ERR_ILLEGAL_ACTION +NVOS_STATUS_ERROR_IN_USE = NV_ERR_STATE_IN_USE +NVOS_STATUS_ERROR_INSUFFICIENT_RESOURCES = NV_ERR_INSUFFICIENT_RESOURCES +NVOS_STATUS_ERROR_INSUFFICIENT_ZBC_ENTRY = NV_ERR_INSUFFICIENT_ZBC_ENTRY +NVOS_STATUS_ERROR_INVALID_ACCESS_TYPE = NV_ERR_INVALID_ACCESS_TYPE +NVOS_STATUS_ERROR_INVALID_ARGUMENT = NV_ERR_INVALID_ARGUMENT +NVOS_STATUS_ERROR_INVALID_BASE = NV_ERR_INVALID_BASE +NVOS_STATUS_ERROR_INVALID_CHANNEL = NV_ERR_INVALID_CHANNEL +NVOS_STATUS_ERROR_INVALID_CLASS = NV_ERR_INVALID_CLASS +NVOS_STATUS_ERROR_INVALID_CLIENT = NV_ERR_INVALID_CLIENT +NVOS_STATUS_ERROR_INVALID_COMMAND = NV_ERR_INVALID_COMMAND +NVOS_STATUS_ERROR_INVALID_DATA = NV_ERR_INVALID_DATA +NVOS_STATUS_ERROR_INVALID_DEVICE = NV_ERR_INVALID_DEVICE +NVOS_STATUS_ERROR_INVALID_DMA_SPECIFIER = NV_ERR_INVALID_DMA_SPECIFIER +NVOS_STATUS_ERROR_INVALID_EVENT = NV_ERR_INVALID_EVENT +NVOS_STATUS_ERROR_INVALID_FLAGS = NV_ERR_INVALID_FLAGS +NVOS_STATUS_ERROR_INVALID_FUNCTION = NV_ERR_INVALID_FUNCTION +NVOS_STATUS_ERROR_INVALID_HEAP = NV_ERR_INVALID_HEAP +NVOS_STATUS_ERROR_INVALID_INDEX = NV_ERR_INVALID_INDEX +NVOS_STATUS_ERROR_INVALID_LIMIT = NV_ERR_INVALID_LIMIT +NVOS_STATUS_ERROR_INVALID_METHOD = NV_ERR_INVALID_METHOD +NVOS_STATUS_ERROR_INVALID_OBJECT_BUFFER = NV_ERR_BUFFER_TOO_SMALL +NVOS_STATUS_ERROR_INVALID_OBJECT_ERROR = NV_ERR_INVALID_OBJECT +NVOS_STATUS_ERROR_INVALID_OBJECT_HANDLE = NV_ERR_INVALID_OBJECT_HANDLE +NVOS_STATUS_ERROR_INVALID_OBJECT_NEW = NV_ERR_INVALID_OBJECT_NEW +NVOS_STATUS_ERROR_INVALID_OBJECT_OLD = NV_ERR_INVALID_OBJECT_OLD +NVOS_STATUS_ERROR_INVALID_OBJECT_PARENT = NV_ERR_INVALID_OBJECT_PARENT +NVOS_STATUS_ERROR_INVALID_OFFSET = NV_ERR_INVALID_OFFSET +NVOS_STATUS_ERROR_INVALID_OWNER = NV_ERR_INVALID_OWNER +NVOS_STATUS_ERROR_INVALID_PARAM_STRUCT = NV_ERR_INVALID_PARAM_STRUCT +NVOS_STATUS_ERROR_INVALID_PARAMETER = NV_ERR_INVALID_PARAMETER +NVOS_STATUS_ERROR_INVALID_POINTER = NV_ERR_INVALID_POINTER +NVOS_STATUS_ERROR_INVALID_REGISTRY_KEY = NV_ERR_INVALID_REGISTRY_KEY +NVOS_STATUS_ERROR_INVALID_STATE = NV_ERR_INVALID_STATE +NVOS_STATUS_ERROR_INVALID_STRING_LENGTH = NV_ERR_INVALID_STRING_LENGTH +NVOS_STATUS_ERROR_INVALID_XLATE = NV_ERR_INVALID_XLATE +NVOS_STATUS_ERROR_IRQ_NOT_FIRING = NV_ERR_IRQ_NOT_FIRING +NVOS_STATUS_ERROR_MULTIPLE_MEMORY_TYPES = NV_ERR_MULTIPLE_MEMORY_TYPES +NVOS_STATUS_ERROR_NOT_SUPPORTED = NV_ERR_NOT_SUPPORTED +NVOS_STATUS_ERROR_OPERATING_SYSTEM = NV_ERR_OPERATING_SYSTEM +NVOS_STATUS_ERROR_LIB_RM_VERSION_MISMATCH = NV_ERR_LIB_RM_VERSION_MISMATCH +NVOS_STATUS_ERROR_PROTECTION_FAULT = NV_ERR_PROTECTION_FAULT +NVOS_STATUS_ERROR_TIMEOUT = NV_ERR_TIMEOUT +NVOS_STATUS_ERROR_TOO_MANY_PRIMARIES = NV_ERR_TOO_MANY_PRIMARIES +NVOS_STATUS_ERROR_IRQ_EDGE_TRIGGERED = NV_ERR_IRQ_EDGE_TRIGGERED +NVOS_STATUS_ERROR_INVALID_OPERATION = NV_ERR_INVALID_OPERATION +NVOS_STATUS_ERROR_NOT_COMPATIBLE = NV_ERR_NOT_COMPATIBLE +NVOS_STATUS_ERROR_MORE_PROCESSING_REQUIRED = NV_WARN_MORE_PROCESSING_REQUIRED +NVOS_STATUS_ERROR_INSUFFICIENT_PERMISSIONS = NV_ERR_INSUFFICIENT_PERMISSIONS +NVOS_STATUS_ERROR_TIMEOUT_RETRY = NV_ERR_TIMEOUT_RETRY +NVOS_STATUS_ERROR_NOT_READY = NV_ERR_NOT_READY +NVOS_STATUS_ERROR_GPU_IS_LOST = NV_ERR_GPU_IS_LOST +NVOS_STATUS_ERROR_IN_FULLCHIP_RESET = NV_ERR_GPU_IN_FULLCHIP_RESET +NVOS_STATUS_ERROR_INVALID_LOCK_STATE = NV_ERR_INVALID_LOCK_STATE +NVOS_STATUS_ERROR_INVALID_ADDRESS = NV_ERR_INVALID_ADDRESS +NVOS_STATUS_ERROR_INVALID_IRQ_LEVEL = NV_ERR_INVALID_IRQ_LEVEL +NVOS_STATUS_ERROR_MEMORY_TRAINING_FAILED = NV_ERR_MEMORY_TRAINING_FAILED +NVOS_STATUS_ERROR_BUSY_RETRY = NV_ERR_BUSY_RETRY +NVOS_STATUS_ERROR_INSUFFICIENT_POWER = NV_ERR_INSUFFICIENT_POWER +NVOS_STATUS_ERROR_OBJECT_NOT_FOUND = NV_ERR_OBJECT_NOT_FOUND +NVOS_STATUS_ERROR_RESOURCE_LOST = NV_ERR_RESOURCE_LOST +NVOS_STATUS_ERROR_BUFFER_TOO_SMALL = NV_ERR_BUFFER_TOO_SMALL +NVOS_STATUS_ERROR_RESET_REQUIRED = NV_ERR_RESET_REQUIRED +NVOS_STATUS_ERROR_INVALID_REQUEST = NV_ERR_INVALID_REQUEST +NVOS_STATUS_ERROR_PRIV_SEC_VIOLATION = NV_ERR_PRIV_SEC_VIOLATION +NVOS_STATUS_ERROR_GPU_IN_DEBUG_MODE = NV_ERR_GPU_IN_DEBUG_MODE +NVOS_STATUS_ERROR_ALREADY_SIGNALLED = NV_ERR_ALREADY_SIGNALLED +NV01_FREE = (0x00000000) +NV01_ROOT = (0x0) +NV01_ROOT_NON_PRIV = (0x00000001) +NV01_ROOT_CLIENT = (0x00000041) +NV01_ALLOC_MEMORY = (0x00000002) +NVOS02_FLAGS_PHYSICALITY = (7, 4) +NVOS02_FLAGS_PHYSICALITY_CONTIGUOUS = (0x00000000) +NVOS02_FLAGS_PHYSICALITY_NONCONTIGUOUS = (0x00000001) +NVOS02_FLAGS_LOCATION = (11, 8) +NVOS02_FLAGS_LOCATION_PCI = (0x00000000) +NVOS02_FLAGS_LOCATION_VIDMEM = (0x00000002) +NVOS02_FLAGS_COHERENCY = (15, 12) +NVOS02_FLAGS_COHERENCY_UNCACHED = (0x00000000) +NVOS02_FLAGS_COHERENCY_CACHED = (0x00000001) +NVOS02_FLAGS_COHERENCY_WRITE_COMBINE = (0x00000002) +NVOS02_FLAGS_COHERENCY_WRITE_THROUGH = (0x00000003) +NVOS02_FLAGS_COHERENCY_WRITE_PROTECT = (0x00000004) +NVOS02_FLAGS_COHERENCY_WRITE_BACK = (0x00000005) +NVOS02_FLAGS_ALLOC = (17, 16) +NVOS02_FLAGS_ALLOC_NONE = (0x00000001) +NVOS02_FLAGS_GPU_CACHEABLE = (18, 18) +NVOS02_FLAGS_GPU_CACHEABLE_NO = (0x00000000) +NVOS02_FLAGS_GPU_CACHEABLE_YES = (0x00000001) +NVOS02_FLAGS_KERNEL_MAPPING = (19, 19) +NVOS02_FLAGS_KERNEL_MAPPING_NO_MAP = (0x00000000) +NVOS02_FLAGS_KERNEL_MAPPING_MAP = (0x00000001) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY = (20, 20) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_NISO_DISPLAY_YES = (0x00000001) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY = (21, 21) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_USER_READ_ONLY_YES = (0x00000001) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY = (22, 22) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY_NO = (0x00000000) +NVOS02_FLAGS_ALLOC_DEVICE_READ_ONLY_YES = (0x00000001) +NVOS02_FLAGS_PEER_MAP_OVERRIDE = (23, 23) +NVOS02_FLAGS_PEER_MAP_OVERRIDE_DEFAULT = (0x00000000) +NVOS02_FLAGS_PEER_MAP_OVERRIDE_REQUIRED = (0x00000001) +NVOS02_FLAGS_ALLOC_TYPE_SYNCPOINT = (24, 24) +NVOS02_FLAGS_ALLOC_TYPE_SYNCPOINT_APERTURE = (0x00000001) +NVOS02_FLAGS_MEMORY_PROTECTION = (26, 25) +NVOS02_FLAGS_MEMORY_PROTECTION_DEFAULT = (0x00000000) +NVOS02_FLAGS_MEMORY_PROTECTION_PROTECTED = (0x00000001) +NVOS02_FLAGS_MEMORY_PROTECTION_UNPROTECTED = (0x00000002) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM = (27, 27) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM_FALSE = (0x00000000) +NVOS02_FLAGS_REGISTER_MEMDESC_TO_PHYS_RM_TRUE = (0x00000001) +NVOS02_FLAGS_MAPPING = (31, 30) +NVOS02_FLAGS_MAPPING_DEFAULT = (0x00000000) +NVOS02_FLAGS_MAPPING_NO_MAP = (0x00000001) +NVOS02_FLAGS_MAPPING_NEVER_MAP = (0x00000002) +NVOS03_FLAGS_ACCESS = (1, 0) +NVOS03_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS03_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS03_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS03_FLAGS_PREALLOCATE = (2, 2) +NVOS03_FLAGS_PREALLOCATE_DISABLE = (0x00000000) +NVOS03_FLAGS_PREALLOCATE_ENABLE = (0x00000001) +NVOS03_FLAGS_GPU_MAPPABLE = (15, 15) +NVOS03_FLAGS_GPU_MAPPABLE_DISABLE = (0x00000000) +NVOS03_FLAGS_GPU_MAPPABLE_ENABLE = (0x00000001) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE = (16, 16) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE_FALSE = (0x00000000) +NVOS03_FLAGS_PTE_KIND_BL_OVERRIDE_TRUE = (0x00000001) +NVOS03_FLAGS_PTE_KIND = (17, 16) +NVOS03_FLAGS_PTE_KIND_NONE = (0x00000000) +NVOS03_FLAGS_PTE_KIND_BL = (0x00000001) +NVOS03_FLAGS_PTE_KIND_PITCH = (0x00000002) +NVOS03_FLAGS_TYPE = (23, 20) +NVOS03_FLAGS_TYPE_NOTIFIER = (0x00000001) +NVOS03_FLAGS_MAPPING = (20, 20) +NVOS03_FLAGS_MAPPING_NONE = (0x00000000) +NVOS03_FLAGS_MAPPING_KERNEL = (0x00000001) +NVOS03_FLAGS_CACHE_SNOOP = (28, 28) +NVOS03_FLAGS_CACHE_SNOOP_ENABLE = (0x00000000) +NVOS03_FLAGS_CACHE_SNOOP_DISABLE = (0x00000001) +NVOS03_FLAGS_HASH_TABLE = (29, 29) +NVOS03_FLAGS_HASH_TABLE_ENABLE = (0x00000000) +NVOS03_FLAGS_HASH_TABLE_DISABLE = (0x00000001) +NV01_ALLOC_OBJECT = (0x00000005) +NV01_EVENT_KERNEL_CALLBACK = (0x00000078) +NV01_EVENT_OS_EVENT = (0x00000079) +NV01_EVENT_WIN32_EVENT = NV01_EVENT_OS_EVENT +NV01_EVENT_KERNEL_CALLBACK_EX = (0x0000007E) +NV01_EVENT_BROADCAST = (0x80000000) +NV01_EVENT_PERMIT_NON_ROOT_EVENT_KERNEL_CALLBACK_CREATION = (0x40000000) +NV01_EVENT_SUBDEVICE_SPECIFIC = (0x20000000) +NV01_EVENT_WITHOUT_EVENT_DATA = (0x10000000) +NV01_EVENT_NONSTALL_INTR = (0x08000000) +NV01_EVENT_CLIENT_RM = (0x04000000) +NV04_I2C_ACCESS = (0x00000013) +NVOS_I2C_ACCESS_MAX_BUFFER_SIZE = 2048 +NVOS20_COMMAND_unused0001 = 0x0001 +NVOS20_COMMAND_unused0002 = 0x0002 +NVOS20_COMMAND_STRING_PRINT = 0x0003 +NV04_ALLOC = (0x00000015) +NVOS64_FLAGS_NONE = (0x00000000) +NVOS64_FLAGS_FINN_SERIALIZED = (0x00000001) +NVOS65_PARAMETERS_VERSION_MAGIC = 0x77FEF81E +NV04_IDLE_CHANNELS = (0x0000001E) +NVOS30_FLAGS_BEHAVIOR = (3, 0) +NVOS30_FLAGS_BEHAVIOR_SPIN = (0x00000000) +NVOS30_FLAGS_BEHAVIOR_SLEEP = (0x00000001) +NVOS30_FLAGS_BEHAVIOR_QUERY = (0x00000002) +NVOS30_FLAGS_BEHAVIOR_FORCE_BUSY_CHECK = (0x00000003) +NVOS30_FLAGS_CHANNEL = (7, 4) +NVOS30_FLAGS_CHANNEL_LIST = (0x00000000) +NVOS30_FLAGS_CHANNEL_SINGLE = (0x00000001) +NVOS30_FLAGS_IDLE = (30, 8) +NVOS30_FLAGS_IDLE_PUSH_BUFFER = (0x00000001) +NVOS30_FLAGS_IDLE_CACHE1 = (0x00000002) +NVOS30_FLAGS_IDLE_GRAPHICS = (0x00000004) +NVOS30_FLAGS_IDLE_MPEG = (0x00000008) +NVOS30_FLAGS_IDLE_MOTION_ESTIMATION = (0x00000010) +NVOS30_FLAGS_IDLE_VIDEO_PROCESSOR = (0x00000020) +NVOS30_FLAGS_IDLE_MSPDEC = (0x00000020) +NVOS30_FLAGS_IDLE_BITSTREAM_PROCESSOR = (0x00000040) +NVOS30_FLAGS_IDLE_MSVLD = (0x00000040) +NVOS30_FLAGS_IDLE_NVDEC0 = NVOS30_FLAGS_IDLE_MSVLD +NVOS30_FLAGS_IDLE_CIPHER_DMA = (0x00000080) +NVOS30_FLAGS_IDLE_SEC = (0x00000080) +NVOS30_FLAGS_IDLE_CALLBACKS = (0x00000100) +NVOS30_FLAGS_IDLE_MSPPP = (0x00000200) +NVOS30_FLAGS_IDLE_CE0 = (0x00000400) +NVOS30_FLAGS_IDLE_CE1 = (0x00000800) +NVOS30_FLAGS_IDLE_CE2 = (0x00001000) +NVOS30_FLAGS_IDLE_CE3 = (0x00002000) +NVOS30_FLAGS_IDLE_CE4 = (0x00004000) +NVOS30_FLAGS_IDLE_CE5 = (0x00008000) +NVOS30_FLAGS_IDLE_VIC = (0x00010000) +NVOS30_FLAGS_IDLE_MSENC = (0x00020000) +NVOS30_FLAGS_IDLE_NVENC0 = NVOS30_FLAGS_IDLE_MSENC +NVOS30_FLAGS_IDLE_NVENC1 = (0x00040000) +NVOS30_FLAGS_IDLE_NVENC2 = (0x00080000) +NVOS30_FLAGS_IDLE_NVJPG = (0x00100000) +NVOS30_FLAGS_IDLE_NVDEC1 = (0x00200000) +NVOS30_FLAGS_IDLE_NVDEC2 = (0x00400000) +NVOS30_FLAGS_IDLE_ACTIVECHANNELS = (0x00800000) +NVOS30_FLAGS_IDLE_ALL_ENGINES = (NVOS30_FLAGS_IDLE_GRAPHICS | NVOS30_FLAGS_IDLE_MPEG | NVOS30_FLAGS_IDLE_MOTION_ESTIMATION | NVOS30_FLAGS_IDLE_VIDEO_PROCESSOR | NVOS30_FLAGS_IDLE_BITSTREAM_PROCESSOR | NVOS30_FLAGS_IDLE_CIPHER_DMA | NVOS30_FLAGS_IDLE_MSPDEC | NVOS30_FLAGS_IDLE_NVDEC0 | NVOS30_FLAGS_IDLE_SEC | NVOS30_FLAGS_IDLE_MSPPP | NVOS30_FLAGS_IDLE_CE0 | NVOS30_FLAGS_IDLE_CE1 | NVOS30_FLAGS_IDLE_CE2 | NVOS30_FLAGS_IDLE_CE3 | NVOS30_FLAGS_IDLE_CE4 | NVOS30_FLAGS_IDLE_CE5 | NVOS30_FLAGS_IDLE_NVENC0 | NVOS30_FLAGS_IDLE_NVENC1 | NVOS30_FLAGS_IDLE_NVENC2 | NVOS30_FLAGS_IDLE_VIC | NVOS30_FLAGS_IDLE_NVJPG | NVOS30_FLAGS_IDLE_NVDEC1 | NVOS30_FLAGS_IDLE_NVDEC2) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON = (31, 31) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON_NO = (0x00000000) +NVOS30_FLAGS_WAIT_FOR_ELPG_ON_YES = (0x00000001) +NV04_VID_HEAP_CONTROL = (0x00000020) +NVOS32_DESCRIPTOR_TYPE_VIRTUAL_ADDRESS = 0 +NVOS32_DESCRIPTOR_TYPE_OS_PAGE_ARRAY = 1 +NVOS32_DESCRIPTOR_TYPE_OS_IO_MEMORY = 2 +NVOS32_DESCRIPTOR_TYPE_OS_PHYS_ADDR = 3 +NVOS32_DESCRIPTOR_TYPE_OS_FILE_HANDLE = 4 +NVOS32_DESCRIPTOR_TYPE_OS_DMA_BUF_PTR = 5 +NVOS32_DESCRIPTOR_TYPE_OS_SGT_PTR = 6 +NVOS32_DESCRIPTOR_TYPE_KERNEL_VIRTUAL_ADDRESS = 7 +NVOS32_FUNCTION_ALLOC_SIZE = 2 +NVOS32_FUNCTION_FREE = 3 +NVOS32_FUNCTION_INFO = 5 +NVOS32_FUNCTION_ALLOC_TILED_PITCH_HEIGHT = 6 +NVOS32_FUNCTION_ALLOC_SIZE_RANGE = 14 +NVOS32_FUNCTION_REACQUIRE_COMPR = 15 +NVOS32_FUNCTION_RELEASE_COMPR = 16 +NVOS32_FUNCTION_GET_MEM_ALIGNMENT = 18 +NVOS32_FUNCTION_HW_ALLOC = 19 +NVOS32_FUNCTION_HW_FREE = 20 +NVOS32_FUNCTION_ALLOC_OS_DESCRIPTOR = 27 +NVOS32_IVC_HEAP_NUMBER_DONT_ALLOCATE_ON_IVC_HEAP = 0 +NV_RM_OS32_ALLOC_OS_DESCRIPTOR_WITH_OS32_ATTR = 1 +NVOS32_DELETE_RESOURCES_ALL = 0 +NVOS32_TYPE_IMAGE = 0 +NVOS32_TYPE_DEPTH = 1 +NVOS32_TYPE_TEXTURE = 2 +NVOS32_TYPE_VIDEO = 3 +NVOS32_TYPE_FONT = 4 +NVOS32_TYPE_CURSOR = 5 +NVOS32_TYPE_DMA = 6 +NVOS32_TYPE_INSTANCE = 7 +NVOS32_TYPE_PRIMARY = 8 +NVOS32_TYPE_ZCULL = 9 +NVOS32_TYPE_UNUSED = 10 +NVOS32_TYPE_SHADER_PROGRAM = 11 +NVOS32_TYPE_OWNER_RM = 12 +NVOS32_TYPE_NOTIFIER = 13 +NVOS32_TYPE_RESERVED = 14 +NVOS32_TYPE_PMA = 15 +NVOS32_TYPE_STENCIL = 16 +NVOS32_TYPE_SYNCPOINT = 17 +NVOS32_NUM_MEM_TYPES = 18 +NVOS32_ATTR_NONE = 0x00000000 +NVOS32_ATTR_DEPTH = (2, 0) +NVOS32_ATTR_DEPTH_UNKNOWN = 0x00000000 +NVOS32_ATTR_DEPTH_8 = 0x00000001 +NVOS32_ATTR_DEPTH_16 = 0x00000002 +NVOS32_ATTR_DEPTH_24 = 0x00000003 +NVOS32_ATTR_DEPTH_32 = 0x00000004 +NVOS32_ATTR_DEPTH_64 = 0x00000005 +NVOS32_ATTR_DEPTH_128 = 0x00000006 +NVOS32_ATTR_COMPR_COVG = (3, 3) +NVOS32_ATTR_COMPR_COVG_DEFAULT = 0x00000000 +NVOS32_ATTR_COMPR_COVG_PROVIDED = 0x00000001 +NVOS32_ATTR_AA_SAMPLES = (7, 4) +NVOS32_ATTR_AA_SAMPLES_1 = 0x00000000 +NVOS32_ATTR_AA_SAMPLES_2 = 0x00000001 +NVOS32_ATTR_AA_SAMPLES_4 = 0x00000002 +NVOS32_ATTR_AA_SAMPLES_4_ROTATED = 0x00000003 +NVOS32_ATTR_AA_SAMPLES_6 = 0x00000004 +NVOS32_ATTR_AA_SAMPLES_8 = 0x00000005 +NVOS32_ATTR_AA_SAMPLES_16 = 0x00000006 +NVOS32_ATTR_AA_SAMPLES_4_VIRTUAL_8 = 0x00000007 +NVOS32_ATTR_AA_SAMPLES_4_VIRTUAL_16 = 0x00000008 +NVOS32_ATTR_AA_SAMPLES_8_VIRTUAL_16 = 0x00000009 +NVOS32_ATTR_AA_SAMPLES_8_VIRTUAL_32 = 0x0000000A +NVOS32_ATTR_GPU_CACHE_SNOOPABLE = (9, 8) +NVOS32_ATTR_GPU_CACHE_SNOOPABLE_MAPPING = 0x00000000 +NVOS32_ATTR_GPU_CACHE_SNOOPABLE_OFF = 0x00000001 +NVOS32_ATTR_GPU_CACHE_SNOOPABLE_ON = 0x00000002 +NVOS32_ATTR_GPU_CACHE_SNOOPABLE_INVALID = 0x00000003 +NVOS32_ATTR_ZCULL = (11, 10) +NVOS32_ATTR_ZCULL_NONE = 0x00000000 +NVOS32_ATTR_ZCULL_REQUIRED = 0x00000001 +NVOS32_ATTR_ZCULL_ANY = 0x00000002 +NVOS32_ATTR_ZCULL_SHARED = 0x00000003 +NVOS32_ATTR_COMPR = (13, 12) +NVOS32_ATTR_COMPR_NONE = 0x00000000 +NVOS32_ATTR_COMPR_REQUIRED = 0x00000001 +NVOS32_ATTR_COMPR_ANY = 0x00000002 +NVOS32_ATTR_COMPR_PLC_REQUIRED = NVOS32_ATTR_COMPR_REQUIRED +NVOS32_ATTR_COMPR_PLC_ANY = NVOS32_ATTR_COMPR_ANY +NVOS32_ATTR_COMPR_DISABLE_PLC_ANY = 0x00000003 +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP = (14, 14) +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP_NO = 0x00000000 +NVOS32_ATTR_ALLOCATE_FROM_RESERVED_HEAP_YES = 0x00000001 +NVOS32_ATTR_FORMAT = (17, 16) +NVOS32_ATTR_FORMAT_LOW_FIELD = 16 +NVOS32_ATTR_FORMAT_HIGH_FIELD = 17 +NVOS32_ATTR_FORMAT_PITCH = 0x00000000 +NVOS32_ATTR_FORMAT_SWIZZLED = 0x00000001 +NVOS32_ATTR_FORMAT_BLOCK_LINEAR = 0x00000002 +NVOS32_ATTR_Z_TYPE = (18, 18) +NVOS32_ATTR_Z_TYPE_FIXED = 0x00000000 +NVOS32_ATTR_Z_TYPE_FLOAT = 0x00000001 +NVOS32_ATTR_ZS_PACKING = (21, 19) +NVOS32_ATTR_ZS_PACKING_S8 = 0x00000000 +NVOS32_ATTR_ZS_PACKING_Z24S8 = 0x00000000 +NVOS32_ATTR_ZS_PACKING_S8Z24 = 0x00000001 +NVOS32_ATTR_ZS_PACKING_Z32 = 0x00000002 +NVOS32_ATTR_ZS_PACKING_Z24X8 = 0x00000003 +NVOS32_ATTR_ZS_PACKING_X8Z24 = 0x00000004 +NVOS32_ATTR_ZS_PACKING_Z32_X24S8 = 0x00000005 +NVOS32_ATTR_ZS_PACKING_X8Z24_X24S8 = 0x00000006 +NVOS32_ATTR_ZS_PACKING_Z16 = 0x00000007 +NVOS32_ATTR_COLOR_PACKING = NVOS32_ATTR_ZS_PACKING +NVOS32_ATTR_COLOR_PACKING_A8R8G8B8 = 0x00000000 +NVOS32_ATTR_COLOR_PACKING_X8R8G8B8 = 0x00000001 +NVOS32_ATTR_PAGE_SIZE = (24, 23) +NVOS32_ATTR_PAGE_SIZE_DEFAULT = 0x00000000 +NVOS32_ATTR_PAGE_SIZE_4KB = 0x00000001 +NVOS32_ATTR_PAGE_SIZE_BIG = 0x00000002 +NVOS32_ATTR_PAGE_SIZE_HUGE = 0x00000003 +NVOS32_ATTR_LOCATION = (26, 25) +NVOS32_ATTR_LOCATION_VIDMEM = 0x00000000 +NVOS32_ATTR_LOCATION_PCI = 0x00000001 +NVOS32_ATTR_LOCATION_ANY = 0x00000003 +NVOS32_ATTR_PHYSICALITY = (28, 27) +NVOS32_ATTR_PHYSICALITY_DEFAULT = 0x00000000 +NVOS32_ATTR_PHYSICALITY_NONCONTIGUOUS = 0x00000001 +NVOS32_ATTR_PHYSICALITY_CONTIGUOUS = 0x00000002 +NVOS32_ATTR_PHYSICALITY_ALLOW_NONCONTIGUOUS = 0x00000003 +NVOS32_ATTR_COHERENCY = (31, 29) +NVOS32_ATTR_COHERENCY_UNCACHED = 0x00000000 +NVOS32_ATTR_COHERENCY_CACHED = 0x00000001 +NVOS32_ATTR_COHERENCY_WRITE_COMBINE = 0x00000002 +NVOS32_ATTR_COHERENCY_WRITE_THROUGH = 0x00000003 +NVOS32_ATTR_COHERENCY_WRITE_PROTECT = 0x00000004 +NVOS32_ATTR_COHERENCY_WRITE_BACK = 0x00000005 +NVOS32_ATTR2_NONE = 0x00000000 +NVOS32_ATTR2_ZBC = (1, 0) +NVOS32_ATTR2_ZBC_DEFAULT = 0x00000000 +NVOS32_ATTR2_ZBC_PREFER_NO_ZBC = 0x00000001 +NVOS32_ATTR2_ZBC_PREFER_ZBC = 0x00000002 +NVOS32_ATTR2_ZBC_REQUIRE_ONLY_ZBC = 0x00000003 +NVOS32_ATTR2_ZBC_INVALID = 0x00000003 +NVOS32_ATTR2_GPU_CACHEABLE = (3, 2) +NVOS32_ATTR2_GPU_CACHEABLE_DEFAULT = 0x00000000 +NVOS32_ATTR2_GPU_CACHEABLE_YES = 0x00000001 +NVOS32_ATTR2_GPU_CACHEABLE_NO = 0x00000002 +NVOS32_ATTR2_GPU_CACHEABLE_INVALID = 0x00000003 +NVOS32_ATTR2_P2P_GPU_CACHEABLE = (5, 4) +NVOS32_ATTR2_P2P_GPU_CACHEABLE_DEFAULT = 0x00000000 +NVOS32_ATTR2_P2P_GPU_CACHEABLE_YES = 0x00000001 +NVOS32_ATTR2_P2P_GPU_CACHEABLE_NO = 0x00000002 +NVOS32_ATTR2_32BIT_POINTER = (6, 6) +NVOS32_ATTR2_32BIT_POINTER_DISABLE = 0x00000000 +NVOS32_ATTR2_32BIT_POINTER_ENABLE = 0x00000001 +NVOS32_ATTR2_FIXED_NUMA_NODE_ID = (7, 7) +NVOS32_ATTR2_FIXED_NUMA_NODE_ID_NO = 0x00000000 +NVOS32_ATTR2_FIXED_NUMA_NODE_ID_YES = 0x00000001 +NVOS32_ATTR2_SMMU_ON_GPU = (9, 8) +NVOS32_ATTR2_SMMU_ON_GPU_DEFAULT = 0x00000000 +NVOS32_ATTR2_SMMU_ON_GPU_DISABLE = 0x00000001 +NVOS32_ATTR2_SMMU_ON_GPU_ENABLE = 0x00000002 +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT = (10, 10) +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT_FALSE = 0x00000000 +NVOS32_ATTR2_USE_SCANOUT_CARVEOUT_TRUE = 0x00000001 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN = (11, 11) +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_OFF = 0x0 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_ON = 0x1 +NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_DEFAULT = NVOS32_ATTR2_ALLOC_COMPCACHELINE_ALIGN_OFF +NVOS32_ATTR2_PRIORITY = (13, 12) +NVOS32_ATTR2_PRIORITY_DEFAULT = 0x0 +NVOS32_ATTR2_PRIORITY_HIGH = 0x1 +NVOS32_ATTR2_PRIORITY_LOW = 0x2 +NVOS32_ATTR2_INTERNAL = (14, 14) +NVOS32_ATTR2_INTERNAL_NO = 0x0 +NVOS32_ATTR2_INTERNAL_YES = 0x1 +NVOS32_ATTR2_PREFER_2C = (15, 15) +NVOS32_ATTR2_PREFER_2C_NO = 0x00000000 +NVOS32_ATTR2_PREFER_2C_YES = 0x00000001 +NVOS32_ATTR2_NISO_DISPLAY = (16, 16) +NVOS32_ATTR2_NISO_DISPLAY_NO = 0x00000000 +NVOS32_ATTR2_NISO_DISPLAY_YES = 0x00000001 +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT = (17, 17) +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT_NO = 0x00000000 +NVOS32_ATTR2_ZBC_SKIP_ZBCREFCOUNT_YES = 0x00000001 +NVOS32_ATTR2_ISO = (18, 18) +NVOS32_ATTR2_ISO_NO = 0x00000000 +NVOS32_ATTR2_ISO_YES = 0x00000001 +NVOS32_ATTR2_BLACKLIST = (19, 19) +NVOS32_ATTR2_BLACKLIST_ON = 0x00000000 +NVOS32_ATTR2_BLACKLIST_OFF = 0x00000001 +NVOS32_ATTR2_PAGE_OFFLINING = (19, 19) +NVOS32_ATTR2_PAGE_OFFLINING_ON = 0x00000000 +NVOS32_ATTR2_PAGE_OFFLINING_OFF = 0x00000001 +NVOS32_ATTR2_PAGE_SIZE_HUGE = (21, 20) +NVOS32_ATTR2_PAGE_SIZE_HUGE_DEFAULT = 0x00000000 +NVOS32_ATTR2_PAGE_SIZE_HUGE_2MB = 0x00000001 +NVOS32_ATTR2_PAGE_SIZE_HUGE_512MB = 0x00000002 +NVOS32_ATTR2_PAGE_SIZE_HUGE_256GB = 0x00000003 +NVOS32_ATTR2_PROTECTION_USER = (22, 22) +NVOS32_ATTR2_PROTECTION_USER_READ_WRITE = 0x00000000 +NVOS32_ATTR2_PROTECTION_USER_READ_ONLY = 0x00000001 +NVOS32_ATTR2_PROTECTION_DEVICE = (23, 23) +NVOS32_ATTR2_PROTECTION_DEVICE_READ_WRITE = 0x00000000 +NVOS32_ATTR2_PROTECTION_DEVICE_READ_ONLY = 0x00000001 +NVOS32_ATTR2_MEMORY_PROTECTION = (26, 25) +NVOS32_ATTR2_MEMORY_PROTECTION_DEFAULT = 0x00000000 +NVOS32_ATTR2_MEMORY_PROTECTION_PROTECTED = 0x00000001 +NVOS32_ATTR2_MEMORY_PROTECTION_UNPROTECTED = 0x00000002 +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP = (27, 27) +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP_NO = 0x00000000 +NVOS32_ATTR2_ALLOCATE_FROM_SUBHEAP_YES = 0x00000001 +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY = (30, 29) +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY_DEFAULT = 0x00000000 +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY_UGPU0 = 0x00000001 +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY_UGPU1 = 0x00000002 +NVOS32_ATTR2_ENABLE_LOCALIZED_MEMORY_UGPU_COUNT = 2 +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM = (31, 31) +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM_FALSE = 0x00000000 +NVOS32_ATTR2_REGISTER_MEMDESC_TO_PHYS_RM_TRUE = 0x00000001 +NVOS32_ALLOC_FLAGS_IGNORE_BANK_PLACEMENT = 0x00000001 +NVOS32_ALLOC_FLAGS_FORCE_MEM_GROWS_UP = 0x00000002 +NVOS32_ALLOC_FLAGS_FORCE_MEM_GROWS_DOWN = 0x00000004 +NVOS32_ALLOC_FLAGS_FORCE_ALIGN_HOST_PAGE = 0x00000008 +NVOS32_ALLOC_FLAGS_FIXED_ADDRESS_ALLOCATE = 0x00000010 +NVOS32_ALLOC_FLAGS_BANK_HINT = 0x00000020 +NVOS32_ALLOC_FLAGS_BANK_FORCE = 0x00000040 +NVOS32_ALLOC_FLAGS_ALIGNMENT_HINT = 0x00000080 +NVOS32_ALLOC_FLAGS_ALIGNMENT_FORCE = 0x00000100 +NVOS32_ALLOC_FLAGS_BANK_GROW_UP = 0x00000000 +NVOS32_ALLOC_FLAGS_BANK_GROW_DOWN = 0x00000200 +NVOS32_ALLOC_FLAGS_LAZY = 0x00000400 +NVOS32_ALLOC_FLAGS_FORCE_REVERSE_ALLOC = 0x00000800 +NVOS32_ALLOC_FLAGS_NO_SCANOUT = 0x00001000 +NVOS32_ALLOC_FLAGS_PITCH_FORCE = 0x00002000 +NVOS32_ALLOC_FLAGS_MEMORY_HANDLE_PROVIDED = 0x00004000 +NVOS32_ALLOC_FLAGS_MAP_NOT_REQUIRED = 0x00008000 +NVOS32_ALLOC_FLAGS_PERSISTENT_VIDMEM = 0x00010000 +NVOS32_ALLOC_FLAGS_USE_BEGIN_END = 0x00020000 +NVOS32_ALLOC_FLAGS_TURBO_CIPHER_ENCRYPTED = 0x00040000 +NVOS32_ALLOC_FLAGS_VIRTUAL = 0x00080000 +NVOS32_ALLOC_FLAGS_FORCE_INTERNAL_INDEX = 0x00100000 +NVOS32_ALLOC_FLAGS_ZCULL_COVG_SPECIFIED = 0x00200000 +NVOS32_ALLOC_FLAGS_EXTERNALLY_MANAGED = 0x00400000 +NVOS32_ALLOC_FLAGS_FORCE_DEDICATED_PDE = 0x00800000 +NVOS32_ALLOC_FLAGS_PROTECTED = 0x01000000 +NVOS32_ALLOC_FLAGS_KERNEL_MAPPING_MAP = 0x02000000 +NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE = 0x02000000 +NVOS32_ALLOC_FLAGS_SPARSE = 0x04000000 +NVOS32_ALLOC_FLAGS_USER_READ_ONLY = 0x04000000 +NVOS32_ALLOC_FLAGS_DEVICE_READ_ONLY = 0x08000000 +NVOS32_ALLOC_FLAGS_SKIP_RESOURCE_ALLOC = 0x10000000 +NVOS32_ALLOC_FLAGS_PREFER_PTES_IN_SYSMEMORY = 0x20000000 +NVOS32_ALLOC_FLAGS_SKIP_ALIGN_PAD = 0x40000000 +NVOS32_ALLOC_FLAGS_WPR1 = 0x40000000 +NVOS32_ALLOC_FLAGS_ZCULL_DONT_ALLOCATE_SHARED_1X = 0x80000000 +NVOS32_ALLOC_FLAGS_WPR2 = 0x80000000 +NVOS32_ALLOC_INTERNAL_FLAGS_CLIENTALLOC = 0x00000001 +NVOS32_ALLOC_INTERNAL_FLAGS_SKIP_SCRUB = 0x00000004 +NVOS32_ALLOC_FLAGS_MAXIMIZE_4GB_ADDRESS_SPACE = NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE +NVOS32_ALLOC_FLAGS_VIRTUAL_ONLY = ( NVOS32_ALLOC_FLAGS_VIRTUAL | NVOS32_ALLOC_FLAGS_LAZY | NVOS32_ALLOC_FLAGS_EXTERNALLY_MANAGED | NVOS32_ALLOC_FLAGS_SPARSE | NVOS32_ALLOC_FLAGS_MAXIMIZE_ADDRESS_SPACE | NVOS32_ALLOC_FLAGS_PREFER_PTES_IN_SYSMEMORY ) +NVOS32_ALLOC_COMPR_COVG_SCALE = 10 +NVOS32_ALLOC_COMPR_COVG_BITS = (1, 0) +NVOS32_ALLOC_COMPR_COVG_BITS_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPR_COVG_BITS_1 = 0x00000001 +NVOS32_ALLOC_COMPR_COVG_BITS_2 = 0x00000002 +NVOS32_ALLOC_COMPR_COVG_BITS_4 = 0x00000003 +NVOS32_ALLOC_COMPR_COVG_MAX = (11, 2) +NVOS32_ALLOC_COMPR_COVG_MIN = (21, 12) +NVOS32_ALLOC_COMPR_COVG_START = (31, 22) +NVOS32_ALLOC_ZCULL_COVG_FORMAT = (3, 0) +NVOS32_ALLOC_ZCULL_COVG_FORMAT_LOW_RES_Z = 0x00000000 +NVOS32_ALLOC_ZCULL_COVG_FORMAT_HIGH_RES_Z = 0x00000002 +NVOS32_ALLOC_ZCULL_COVG_FORMAT_LOW_RES_ZS = 0x00000003 +NVOS32_ALLOC_ZCULL_COVG_FALLBACK = (4, 4) +NVOS32_ALLOC_ZCULL_COVG_FALLBACK_DISALLOW = 0x00000000 +NVOS32_ALLOC_ZCULL_COVG_FALLBACK_ALLOW = 0x00000001 +NVOS32_ALLOC_COMPTAG_OFFSET_START = (19, 0) +NVOS32_ALLOC_COMPTAG_OFFSET_START_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE = (31, 30) +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_DEFAULT = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_OFF = 0x00000000 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_FIXED = 0x00000001 +NVOS32_ALLOC_COMPTAG_OFFSET_USAGE_MIN = 0x00000002 +NVOS32_REALLOC_FLAGS_GROW_ALLOCATION = 0x00000000 +NVOS32_REALLOC_FLAGS_SHRINK_ALLOCATION = 0x00000001 +NVOS32_REALLOC_FLAGS_REALLOC_UP = 0x00000000 +NVOS32_REALLOC_FLAGS_REALLOC_DOWN = 0x00000002 +NVOS32_RELEASE_COMPR_FLAGS_MEMORY_HANDLE_PROVIDED = 0x000000001 +NVOS32_REACQUIRE_COMPR_FLAGS_MEMORY_HANDLE_PROVIDED = 0x000000001 +NVOS32_FREE_FLAGS_MEMORY_HANDLE_PROVIDED = 0x00000001 +NVOS32_DUMP_FLAGS_TYPE = (1, 0) +NVOS32_DUMP_FLAGS_TYPE_FB = 0x00000000 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_PD = 0x00000001 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_VA = 0x00000002 +NVOS32_DUMP_FLAGS_TYPE_CLIENT_VAPTE = 0x00000003 +NVOS32_BLOCK_TYPE_FREE = 0xFFFFFFFF +NVOS32_INVALID_BLOCK_FREE_OFFSET = 0xFFFFFFFF +NVOS32_MEM_TAG_NONE = 0x00000000 +NV04_MAP_MEMORY = (0x00000021) +NV04_MAP_MEMORY_FLAGS_NONE = (0x00000000) +NV04_MAP_MEMORY_FLAGS_USER = (0x00004000) +NVOS33_FLAGS_ACCESS = (1, 0) +NVOS33_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS33_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS33_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS33_FLAGS_PERSISTENT = (4, 4) +NVOS33_FLAGS_PERSISTENT_DISABLE = (0x00000000) +NVOS33_FLAGS_PERSISTENT_ENABLE = (0x00000001) +NVOS33_FLAGS_SKIP_SIZE_CHECK = (8, 8) +NVOS33_FLAGS_SKIP_SIZE_CHECK_DISABLE = (0x00000000) +NVOS33_FLAGS_SKIP_SIZE_CHECK_ENABLE = (0x00000001) +NVOS33_FLAGS_MEM_SPACE = (14, 14) +NVOS33_FLAGS_MEM_SPACE_CLIENT = (0x00000000) +NVOS33_FLAGS_MEM_SPACE_USER = (0x00000001) +NVOS33_FLAGS_MAPPING = (16, 15) +NVOS33_FLAGS_MAPPING_DEFAULT = (0x00000000) +NVOS33_FLAGS_MAPPING_DIRECT = (0x00000001) +NVOS33_FLAGS_MAPPING_REFLECTED = (0x00000002) +NVOS33_FLAGS_FIFO_MAPPING = (17, 17) +NVOS33_FLAGS_FIFO_MAPPING_DEFAULT = (0x00000000) +NVOS33_FLAGS_FIFO_MAPPING_ENABLE = (0x00000001) +NVOS33_FLAGS_MAP_FIXED = (18, 18) +NVOS33_FLAGS_MAP_FIXED_DISABLE = (0x00000000) +NVOS33_FLAGS_MAP_FIXED_ENABLE = (0x00000001) +NVOS33_FLAGS_RESERVE_ON_UNMAP = (19, 19) +NVOS33_FLAGS_RESERVE_ON_UNMAP_DISABLE = (0x00000000) +NVOS33_FLAGS_RESERVE_ON_UNMAP_ENABLE = (0x00000001) +NVOS33_FLAGS_BUS = (21, 20) +NVOS33_FLAGS_BUS_DEFAULT = 0 +NVOS33_FLAGS_BUS_COHERENT_LINK = 1 +NVOS33_FLAGS_BUS_PCIE = 2 +NVOS33_FLAGS_OS_DESCRIPTOR = (22, 22) +NVOS33_FLAGS_OS_DESCRIPTOR_DISABLE = (0x00000000) +NVOS33_FLAGS_OS_DESCRIPTOR_ENABLE = (0x00000001) +NVOS33_FLAGS_CACHING_TYPE = (25, 23) +NVOS33_FLAGS_CACHING_TYPE_CACHED = 0 +NVOS33_FLAGS_CACHING_TYPE_UNCACHED = 1 +NVOS33_FLAGS_CACHING_TYPE_WRITECOMBINED = 2 +NVOS33_FLAGS_CACHING_TYPE_WRITEBACK = 5 +NVOS33_FLAGS_CACHING_TYPE_DEFAULT = 6 +NVOS33_FLAGS_CACHING_TYPE_UNCACHED_WEAK = 7 +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC = (26, 26) +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC_NO = (0x00000000) +NVOS33_FLAGS_ALLOW_MAPPING_ON_HCC_YES = (0x00000001) +NV04_UNMAP_MEMORY = (0x00000022) +NV04_ACCESS_REGISTRY = (0x00000026) +NVOS38_ACCESS_TYPE_READ_DWORD = 1 +NVOS38_ACCESS_TYPE_WRITE_DWORD = 2 +NVOS38_ACCESS_TYPE_READ_BINARY = 6 +NVOS38_ACCESS_TYPE_WRITE_BINARY = 7 +NVOS38_MAX_REGISTRY_STRING_LENGTH = 256 +NVOS38_MAX_REGISTRY_BINARY_LENGTH = 256 +NV04_ALLOC_CONTEXT_DMA = (0x00000027) +NV04_GET_EVENT_DATA = (0x00000028) +NVSIM01_BUS_XACT = (0x0000002C) +NV04_MAP_MEMORY_DMA = (0x0000002E) +NVOS46_FLAGS_ACCESS = (1, 0) +NVOS46_FLAGS_ACCESS_READ_WRITE = (0x00000000) +NVOS46_FLAGS_ACCESS_READ_ONLY = (0x00000001) +NVOS46_FLAGS_ACCESS_WRITE_ONLY = (0x00000002) +NVOS46_FLAGS_32BIT_POINTER = (2, 2) +NVOS46_FLAGS_32BIT_POINTER_DISABLE = (0x00000000) +NVOS46_FLAGS_32BIT_POINTER_ENABLE = (0x00000001) +NVOS46_FLAGS_PAGE_KIND = (3, 3) +NVOS46_FLAGS_PAGE_KIND_PHYSICAL = (0x00000000) +NVOS46_FLAGS_PAGE_KIND_VIRTUAL = (0x00000001) +NVOS46_FLAGS_CACHE_SNOOP = (4, 4) +NVOS46_FLAGS_CACHE_SNOOP_DISABLE = (0x00000000) +NVOS46_FLAGS_CACHE_SNOOP_ENABLE = (0x00000001) +NVOS46_FLAGS_KERNEL_MAPPING = (5, 5) +NVOS46_FLAGS_KERNEL_MAPPING_NONE = (0x00000000) +NVOS46_FLAGS_KERNEL_MAPPING_ENABLE = (0x00000001) +NVOS46_FLAGS_SHADER_ACCESS = (7, 6) +NVOS46_FLAGS_SHADER_ACCESS_DEFAULT = (0x00000000) +NVOS46_FLAGS_SHADER_ACCESS_READ_ONLY = (0x00000001) +NVOS46_FLAGS_SHADER_ACCESS_WRITE_ONLY = (0x00000002) +NVOS46_FLAGS_SHADER_ACCESS_READ_WRITE = (0x00000003) +NVOS46_FLAGS_PAGE_SIZE = (11, 8) +NVOS46_FLAGS_PAGE_SIZE_DEFAULT = (0x00000000) +NVOS46_FLAGS_PAGE_SIZE_4KB = (0x00000001) +NVOS46_FLAGS_PAGE_SIZE_BIG = (0x00000002) +NVOS46_FLAGS_PAGE_SIZE_BOTH = (0x00000003) +NVOS46_FLAGS_PAGE_SIZE_HUGE = (0x00000004) +NVOS46_FLAGS_PAGE_SIZE_512M = (0x00000005) +NVOS46_FLAGS_SYSTEM_L3_ALLOC = (13, 13) +NVOS46_FLAGS_SYSTEM_L3_ALLOC_DEFAULT = (0x00000000) +NVOS46_FLAGS_SYSTEM_L3_ALLOC_ENABLE_HINT = (0x00000001) +NVOS46_FLAGS_DMA_OFFSET_GROWS = (14, 14) +NVOS46_FLAGS_DMA_OFFSET_GROWS_UP = (0x00000000) +NVOS46_FLAGS_DMA_OFFSET_GROWS_DOWN = (0x00000001) +NVOS46_FLAGS_DMA_OFFSET_FIXED = (15, 15) +NVOS46_FLAGS_DMA_OFFSET_FIXED_FALSE = (0x00000000) +NVOS46_FLAGS_DMA_OFFSET_FIXED_TRUE = (0x00000001) +NVOS46_FLAGS_DISABLE_ENCRYPTION = (16, 16) +NVOS46_FLAGS_DISABLE_ENCRYPTION_FALSE = (0x00000000) +NVOS46_FLAGS_DISABLE_ENCRYPTION_TRUE = (0x00000001) +NVOS46_FLAGS_GPU_CACHEABLE = (18, 17) +NVOS46_FLAGS_GPU_CACHEABLE_DEFAULT = (0x00000000) +NVOS46_FLAGS_GPU_CACHEABLE_YES = (0x00000001) +NVOS46_FLAGS_GPU_CACHEABLE_NO = (0x00000002) +NVOS46_FLAGS_GPU_CACHEABLE_INVALID = (0x00000003) +NVOS46_FLAGS_PAGE_KIND_OVERRIDE = (19, 19) +NVOS46_FLAGS_PAGE_KIND_OVERRIDE_NO = (0x00000000) +NVOS46_FLAGS_PAGE_KIND_OVERRIDE_YES = (0x00000001) +NVOS46_FLAGS_P2P = (27, 20) +NVOS46_FLAGS_P2P_ENABLE = (21, 20) +NVOS46_FLAGS_P2P_ENABLE_NO = (0x00000000) +NVOS46_FLAGS_P2P_ENABLE_YES = (0x00000001) +NVOS46_FLAGS_P2P_ENABLE_NONE = NVOS46_FLAGS_P2P_ENABLE_NO +NVOS46_FLAGS_P2P_ENABLE_SLI = NVOS46_FLAGS_P2P_ENABLE_YES +NVOS46_FLAGS_P2P_ENABLE_NOSLI = (0x00000002) +NVOS46_FLAGS_P2P_SUBDEVICE_ID = (24, 22) +NVOS46_FLAGS_P2P_SUBDEV_ID_SRC = NVOS46_FLAGS_P2P_SUBDEVICE_ID +NVOS46_FLAGS_P2P_SUBDEV_ID_TGT = (27, 25) +NVOS46_FLAGS_TLB_LOCK = (28, 28) +NVOS46_FLAGS_TLB_LOCK_DISABLE = (0x00000000) +NVOS46_FLAGS_TLB_LOCK_ENABLE = (0x00000001) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC = (29, 29) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC_FALSE = (0x00000000) +NVOS46_FLAGS_DMA_UNICAST_REUSE_ALLOC_TRUE = (0x00000001) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP = (30, 30) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP_FALSE = (0x00000000) +NVOS46_FLAGS_ENABLE_FORCE_COMPRESSED_MAP_TRUE = (0x00000001) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION = (31, 31) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION_FALSE = (0x00000000) +NVOS46_FLAGS_DEFER_TLB_INVALIDATION_TRUE = (0x00000001) +NVOS46_FLAGS2_GPU_CACHE_SNOOP = (1, 0) +NVOS46_FLAGS2_GPU_CACHE_SNOOP_DEFAULT = (0x00000000) +NVOS46_FLAGS2_GPU_CACHE_SNOOP_ENABLE = (0x00000001) +NVOS46_FLAGS2_GPU_CACHE_SNOOP_DISABLE = (0x00000002) +NV04_UNMAP_MEMORY_DMA = (0x0000002F) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION = (0, 0) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION_FALSE = (0x00000000) +NVOS47_FLAGS_DEFER_TLB_INVALIDATION_TRUE = (0x00000001) +NV04_BIND_CONTEXT_DMA = (0x00000031) +NV04_CONTROL = (0x00000036) +NVOS54_FLAGS_NONE = (0x00000000) +NVOS54_FLAGS_IRQL_RAISED = (0x00000001) +NVOS54_FLAGS_LOCK_BYPASS = (0x00000002) +NVOS54_FLAGS_FINN_SERIALIZED = (0x00000004) +NV04_DUP_OBJECT = (0x00000037) +NV04_DUP_HANDLE_FLAGS_NONE = (0x00000000) +NV04_DUP_HANDLE_FLAGS_REJECT_KERNEL_DUP_PRIVILEGE = (0x00000001) +NV04_UPDATE_DEVICE_MAPPING_INFO = (0x00000038) +NV04_SHARE = (0x0000003E) +NVPOWERSTATE_STAGE_NONE = 0 +NVPOWERSTATE_STAGE_WAIT_FOR_GFW_BOOT_OK = 1 +NVPOWERSTATE_STAGE_INIT_LIBOS_LOGGING_STRUCTURES = 2 +NVPOWERSTATE_STAGE_GSP_PREPARE_FOR_BOOTSTRAP = 3 +NVPOWERSTATE_STAGE_GSP_BOOTSTRAP = 4 +NVPOWERSTATE_STAGE_BOOT_GSP_RM_PROXY = 5 +NVPOWERSTATE_STAGE_VBIOS_HANDLE_SECURE_BOOT = 6 +NVPOWERSTATE_STAGE_RESTORE_PCIE_CONFIG_REGISTERS = 7 +NVPOWERSTATE_STAGE_GCX_BOOT_TIMER_CB_SCHEDULE = 8 +NVPOWERSTATE_STAGE_POWER_MANAGEMENT_RESUME_PRE_LOAD_PHYSICAL_UNATTACHED = 9 +NVPOWERSTATE_STAGE_PMS_EXPECTED_CHECKPOINT_DONE = 10 +NVPOWERSTATE_STAGE_POLL_FOR_NVLINK_READY = 11 +NVPOWERSTATE_STAGE_CE_STATE_PRE_LOAD = 12 +NVPOWERSTATE_STAGE_LOAD_PROXY_UCODE_EARLY_INIT = 13 +NVPOWERSTATE_STAGE_RESTORE_NON_WPR_REGION = 14 +NVPOWERSTATE_STAGE_PMU_20_OS_BOOTSTRAP = 15 +NVPOWERSTATE_STAGE_STATE_PRE_LOAD_ENGINE = 16 +NVPOWERSTATE_STAGE_STATE_PRE_LOAD_UNKNOWN = 17 +NVPOWERSTATE_STAGE_STATE_LOAD_ENGINE = 18 +NVPOWERSTATE_STAGE_STATE_LOAD_UNKNOWN = 19 +NVPOWERSTATE_STAGE_STATE_LOAD_PHYSICAL = 20 +NVPOWERSTATE_STAGE_STATE_POST_LOAD_ENGINE = 21 +NVPOWERSTATE_STAGE_STATE_POST_LOAD_UNKNOWN = 22 +NVPOWERSTATE_STAGE_GSP_PREPARE_SUSPEND_RESUME_DATA = 23 +NVPOWERSTATE_STAGE_MC_POINTER_NULL = 24 +NVPOWERSTATE_STAGE_SAVE_PCIE_CONFIG_REGISTERS = 25 +NVPOWERSTATE_STAGE_STATE_PRE_UNLOAD_ENGINE = 26 +NVPOWERSTATE_STAGE_STATE_PRE_UNLOAD_UNKNOWN = 27 +NVPOWERSTATE_STAGE_STATE_UNLOAD_ENGINE = 28 +NVPOWERSTATE_STAGE_STATE_UNLOAD_UNKNOWN = 29 +NVPOWERSTATE_STAGE_STATE_POST_UNLOAD_ENGINE = 30 +NVPOWERSTATE_STAGE_STATE_POST_UNLOAD_UNKNOWN = 31 +NVPOWERSTATE_STAGE_GSP_UNLOAD_RM = 32 +NVPOWERSTATE_STAGE_MONITOR_STATE_0 = 33 +NVPOWERSTATE_STAGE_MONITOR_STATE_1 = 34 +NVPOWERSTATE_STAGE_MONITOR_STATE_HIBERNATE = 35 +NVPOWERSTATE_STAGE_SET_POWER_STATE_UNKNOWN = 36 +NVPOWERSTATE_STAGE__COUNT = 37 +NV_DEVICE_ALLOCATION_SZNAME_MAXLEN = 128 +NV_DEVICE_ALLOCATION_FLAGS_NONE = (0x00000000) +NV_DEVICE_ALLOCATION_FLAGS_MAP_PTE_GLOBALLY = (0x00000001) +NV_DEVICE_ALLOCATION_FLAGS_MINIMIZE_PTETABLE_SIZE = (0x00000002) +NV_DEVICE_ALLOCATION_FLAGS_RETRY_PTE_ALLOC_IN_SYS = (0x00000004) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_SIZE = (0x00000008) +NV_DEVICE_ALLOCATION_FLAGS_MAP_PTE = (0x00000010) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_IS_TARGET = (0x00000020) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_SHARED_MANAGEMENT = (0x00000100) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_BIG_PAGE_SIZE_64k = (0x00000200) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_BIG_PAGE_SIZE_128k = (0x00000400) +NV_DEVICE_ALLOCATION_FLAGS_RESTRICT_RESERVED_VALIMITS = (0x00000800) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_PTABLE_PMA_MANAGED = (0x00001000) +NV_DEVICE_ALLOCATION_FLAGS_HOST_VGPU_DEVICE = (0x00002000) +NV_DEVICE_ALLOCATION_FLAGS_PLUGIN_CONTEXT = (0x00004000) +NV_DEVICE_ALLOCATION_FLAGS_VASPACE_REQUIRE_FIXED_OFFSET = (0x00008000) +NV_DEVICE_ALLOCATION_VAMODE_OPTIONAL_MULTIPLE_VASPACES = (0x00000000) +NV_DEVICE_ALLOCATION_VAMODE_SINGLE_VASPACE = (0x00000001) +NV_DEVICE_ALLOCATION_VAMODE_MULTIPLE_VASPACES = (0x00000002) +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_ERROR = 0x00000000 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_WORK_SUBMIT_TOKEN = 0x00000001 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE_KEY_ROTATION_STATUS = 0x00000002 +NV_CHANNELGPFIFO_NOTIFICATION_TYPE__SIZE_1 = 3 +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_VALUE = (14, 0) +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS = (15, 15) +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS_TRUE = 0x1 +NV_CHANNELGPFIFO_NOTIFICATION_STATUS_IN_PROGRESS_FALSE = 0x0 +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB = (1, 1) +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB_YES = 0x00000000 +NV50VAIO_CHANNELDMA_ALLOCATION_FLAGS_CONNECT_PB_AT_GRAB_NO = 0x00000001 +NV_SWRUNLIST_QOS_INTR_NONE = 0x00000000 +NV_BSP_ALLOCATION_PARAMETERS = NV_NVDEC_ALLOCATION_PARAMETERS +NV_VP_ALLOCATION_FLAGS_STANDARD_UCODE = (0x00000000) +NV_VP_ALLOCATION_FLAGS_STATIC_UCODE = (0x00000001) +NV_VP_ALLOCATION_FLAGS_DYNAMIC_UCODE = (0x00000002) +NV_VP_ALLOCATION_FLAGS_AVP_CLIENT_VIDEO = (0x00000000) +NV_VP_ALLOCATION_FLAGS_AVP_CLIENT_AUDIO = (0x00000001) +NV_MSENC_ALLOCATION_PARAMETERS = NV_NVENC_ALLOCATION_PARAMETERS +NV04_ADD_VBLANK_CALLBACK = (0x0000003D) +NV_VASPACE_ALLOCATION_FLAGS_NONE = (0x00000000) +NV_VASPACE_ALLOCATION_FLAGS_MINIMIZE_PTETABLE_SIZE = BIT(0) +NV_VASPACE_ALLOCATION_FLAGS_RETRY_PTE_ALLOC_IN_SYS = BIT(1) +NV_VASPACE_ALLOCATION_FLAGS_SHARED_MANAGEMENT = BIT(2) +NV_VASPACE_ALLOCATION_FLAGS_IS_EXTERNALLY_OWNED = BIT(3) +NV_VASPACE_ALLOCATION_FLAGS_ENABLE_NVLINK_ATS = BIT(4) +NV_VASPACE_ALLOCATION_FLAGS_ENABLE_PAGE_FAULTING = BIT(6) +NV_VASPACE_ALLOCATION_FLAGS_VA_INTERNAL_LIMIT = BIT(7) +NV_VASPACE_ALLOCATION_FLAGS_ALLOW_ZERO_ADDRESS = BIT(8) +NV_VASPACE_ALLOCATION_FLAGS_IS_FLA = BIT(9) +NV_VASPACE_ALLOCATION_FLAGS_SKIP_SCRUB_MEMPOOL = BIT(10) +NV_VASPACE_ALLOCATION_FLAGS_OPTIMIZE_PTETABLE_MEMPOOL_USAGE = BIT(11) +NV_VASPACE_ALLOCATION_FLAGS_REQUIRE_FIXED_OFFSET = BIT(12) +NV_VASPACE_ALLOCATION_FLAGS_PTETABLE_HEAP_MANAGED = BIT(13) +NV_VASPACE_ALLOCATION_FLAGS_ENABLE_NVLINK_ATS_TEST = BIT(14) +NV_VASPACE_ALLOCATION_INDEX_GPU_NEW = 0x00 +NV_VASPACE_ALLOCATION_INDEX_GPU_HOST = 0x01 +NV_VASPACE_ALLOCATION_INDEX_GPU_GLOBAL = 0x02 +NV_VASPACE_ALLOCATION_INDEX_GPU_DEVICE = 0x03 +NV_VASPACE_ALLOCATION_INDEX_GPU_FLA = 0x04 +NV_VASPACE_ALLOCATION_INDEX_GPU_MAX = 0x05 +NV_VASPACE_BIG_PAGE_SIZE_64K = (64 * 1024) +NV_VASPACE_BIG_PAGE_SIZE_128K = (128 * 1024) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT = (1, 0) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_SYNC = (0x00000000) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_ASYNC = (0x00000001) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_SPECIFIED = (0x00000002) +NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_ASYNC_PREFER_LOWER = (0x00000003) +NV_CTXSHARE_ALLOCATION_SUBCTXID_SUBCTXID = (30, 0) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION = (31, 31) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION_SUCCESS = (0x00000001) +NV_CTXSHARE_ALLOCATION_SUBCTXID_ASYNC_PREFER_LOWER_ALLOCATION_FAIL = (0x00000000) +NV_TIMEOUT_CONTROL_CMD_SET_DEVICE_TIMEOUT = (0x00000002) +NV_TIMEOUT_CONTROL_CMD_RESET_DEVICE_TIMEOUT = (0x00000003) +NVC36F_CTRL_RESERVED = (0x00) +NVC36F_CTRL_GPFIFO = (0x01) +NVC36F_CTRL_INTERNAL = (0x03) +NVC36F_CTRL_CMD_NULL = (0xc36f0000) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN = (0xc36f0108) +NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_MESSAGE_ID = (0x8) +NVC36F_CTRL_CMD_GPFIFO_FAULT_METHOD_BUFFER_MAX_RUNQUEUES = 0x2 +NVC36F_CTRL_CMD_GPFIFO_UPDATE_FAULT_METHOD_BUFFER = (0xc36f0109) +NVC36F_CTRL_GPFIFO_UPDATE_FAULT_METHOD_BUFFER_PARAMS_MESSAGE_ID = (0x9) +NVC36F_CTRL_CMD_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX = (0xc36f010a) +NVC36F_CTRL_GPFIFO_SET_WORK_SUBMIT_TOKEN_NOTIF_INDEX_PARAMS_MESSAGE_ID = (0xA) +NVC36F_CTRL_CMD_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN = (0xc36f0301) +NVC36F_CTRL_INTERNAL_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS_MESSAGE_ID = (0x1) +NVCB33_CTRL_RESERVED = (0x00) +NVCB33_CTRL_CONF_COMPUTE = (0x01) +NV_CONF_COMPUTE_CTRL_CMD_NULL = (0xcb330000) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_CAPABILITIES = (0xcb330101) +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SEV = 1 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_INTEL_TDX = 2 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SEV_SNP = 3 +NV_CONF_COMPUTE_SYSTEM_CPU_CAPABILITY_AMD_SNP_VTOM = 4 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_APM = 1 +NV_CONF_COMPUTE_SYSTEM_GPUS_CAPABILITY_HCC = 2 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_UNAVAILABLE = 0 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_SIM = 1 +NV_CONF_COMPUTE_SYSTEM_ENVIRONMENT_PROD = 2 +NV_CONF_COMPUTE_SYSTEM_FEATURE_DISABLED = 0 +NV_CONF_COMPUTE_SYSTEM_FEATURE_APM_ENABLED = 1 +NV_CONF_COMPUTE_SYSTEM_FEATURE_HCC_ENABLED = 2 +NV_CONF_COMPUTE_SYSTEM_DEVTOOLS_MODE_DISABLED = 0 +NV_CONF_COMPUTE_SYSTEM_DEVTOOLS_MODE_ENABLED = 1 +NV_CONF_COMPUTE_SYSTEM_MULTI_GPU_MODE_NONE = 0 +NV_CONF_COMPUTE_SYSTEM_MULTI_GPU_MODE_PROTECTED_PCIE = 1 +NV_CONF_COMPUTE_SYSTEM_MULTI_GPU_MODE_NVLE = 2 +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_GET_GPUS_STATE = (0xcb330104) +NV_CONF_COMPUTE_CTRL_CMD_SYSTEM_SET_GPUS_STATE = (0xcb330105) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_VIDMEM_SIZE = (0xcb330106) +NV_CONF_COMPUTE_CTRL_CMD_GPU_SET_VIDMEM_SIZE = (0xcb330107) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS = (0xcb330108) +NV_CONF_COMPUTE_CTRL_CMD_GET_NUM_SUPPORTED_CC_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0x8) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE = (0xcb330109) +NV_CONF_COMPUTE_CERT_CHAIN_MAX_SIZE = 0x1000 +NV_CONF_COMPUTE_ATTESTATION_CERT_CHAIN_MAX_SIZE = 0x1400 +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_CERTIFICATE_PARAMS_MESSAGE_ID = (0x9) +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT = (0xcb33010a) +NV_CONF_COMPUTE_GPU_ATTESTATION_REPORT_MAX_SIZE = 0x2000 +NV_CONF_COMPUTE_GPU_CEC_ATTESTATION_REPORT_MAX_SIZE = 0x1000 +NV_CONF_COMPUTE_NONCE_SIZE = 0x20 +NV_CONF_COMPUTE_CTRL_CMD_GET_GPU_ATTESTATION_REPORT_PARAMS_MESSAGE_ID = (0xA) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS = (0xcb33010b) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_NUM_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0xB) +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE = (0xcb33010c) +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_DISABLED = 0 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_KERN_ENABLED = 1 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_USER_ENABLED = 2 +NV_CONF_COMPUTE_CTRL_CMD_GPU_KEY_ROTATION_BOTH_ENABLED = 3 +NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE_PARAMS_MESSAGE_ID = (0xC) +NVA06C_CTRL_RESERVED = (0x00) +NVA06C_CTRL_GPFIFO = (0x01) +NVA06C_CTRL_INTERNAL = (0x02) +NVA06C_CTRL_CMD_NULL = (0xa06c0000) +NVA06C_CTRL_CMD_GPFIFO_SCHEDULE = (0xa06c0101) +NVA06C_CTRL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NVA06C_CTRL_CMD_BIND = (0xa06c0102) +NVA06C_CTRL_BIND_PARAMS_MESSAGE_ID = (0x2) +NVA06C_CTRL_CMD_SET_TIMESLICE = (0xa06c0103) +NVA06C_CTRL_SET_TIMESLICE_PARAMS_MESSAGE_ID = (0x3) +NVA06C_CTRL_CMD_GET_TIMESLICE = (0xa06c0104) +NVA06C_CTRL_GET_TIMESLICE_PARAMS_MESSAGE_ID = (0x4) +NVA06C_CTRL_CMD_PREEMPT = (0xa06c0105) +NVA06C_CTRL_PREEMPT_PARAMS_MESSAGE_ID = (0x5) +NVA06C_CTRL_CMD_PREEMPT_MAX_MANUAL_TIMEOUT_US = (1000000) +NVA06C_CTRL_CMD_GET_INFO = (0xa06c0106) +NVA06C_CTRL_GET_INFO_PARAMS_MESSAGE_ID = (0x6) +NVA06C_CTRL_CMD_SET_INTERLEAVE_LEVEL = (0xa06c0107) +NVA06C_CTRL_INTERLEAVE_LEVEL_LOW = (0x00000000) +NVA06C_CTRL_INTERLEAVE_LEVEL_MEDIUM = (0x00000001) +NVA06C_CTRL_INTERLEAVE_LEVEL_HIGH = (0x00000002) +NVA06C_CTRL_SET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x7) +NVA06C_CTRL_CMD_GET_INTERLEAVE_LEVEL = (0xa06c0108) +NVA06C_CTRL_GET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x8) +NVA06C_CTRL_CMD_PROGRAM_VIDMEM_PROMOTE = (0xa06c0109) +NVA06C_CTRL_PROGRAM_VIDMEM_PROMOTE_PARAMS_MESSAGE_ID = (0x9) +NVA06C_CTRL_CMD_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS = (0xa06c010a) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_MAX_RUNQUEUES = (NVC36F_CTRL_CMD_GPFIFO_FAULT_METHOD_BUFFER_MAX_RUNQUEUES) +NVA06C_CTRL_INTERNAL_PROMOTE_FAULT_METHOD_BUFFERS_PARAMS_MESSAGE_ID = (0xa) +NVA06C_CTRL_CMD_MAKE_REALTIME = (0xa06c0110) +NVA06C_CTRL_MAKE_REALTIME_PARAMS_MESSAGE_ID = (0x10) +NVA06C_CTRL_CMD_INTERNAL_GPFIFO_SCHEDULE = (0xa06c0201) +NVA06C_CTRL_INTERNAL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NVA06C_CTRL_CMD_INTERNAL_SET_TIMESLICE = (0xa06c0202) +NVA06C_CTRL_INTERNAL_SET_TIMESLICE_PARAMS_MESSAGE_ID = (0x2) +GMMU_FMT_MAX_LEVELS = 6 +NV90F1_CTRL_RESERVED = (0x00) +NV90F1_CTRL_VASPACE = (0x01) +NV90F1_CTRL_CMD_NULL = (0x90f10000) +NV90F1_CTRL_CMD_VASPACE_GET_GMMU_FORMAT = (0x90f10101) +NV90F1_CTRL_VASPACE_GET_GMMU_FORMAT_PARAMS_MESSAGE_ID = (0x1) +NV90F1_CTRL_CMD_VASPACE_GET_PAGE_LEVEL_INFO = (0x90f10102) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_PARAMS_MESSAGE_ID = (0x2) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_FLAG_NONE = 0x0 +NV90F1_CTRL_CMD_VASPACE_RESERVE_ENTRIES = (0x90f10103) +NV90F1_CTRL_VASPACE_RESERVE_ENTRIES_PARAMS_MESSAGE_ID = (0x3) +NV90F1_CTRL_CMD_VASPACE_RELEASE_ENTRIES = (0x90f10104) +NV90F1_CTRL_VASPACE_RELEASE_ENTRIES_PARAMS_MESSAGE_ID = (0x4) +NV90F1_CTRL_CMD_VASPACE_GET_PAGE_LEVEL_INFO_VERIF = (0x90f10105) +NV90F1_CTRL_VASPACE_GET_PAGE_LEVEL_INFO_VERIF_PARAMS_MESSAGE_ID = (0x5) +NV90F1_CTRL_CMD_VASPACE_COPY_SERVER_RESERVED_PDES = (0x90f10106) +NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_MESSAGE_ID = (0x6) +NV90F1_CTRL_CMD_VASPACE_GET_HOST_RM_MANAGED_SIZE = (0x90f10107) +NV90F1_CTRL_VASPACE_GET_HOST_RM_MANAGED_SIZE_PARAMS_MESSAGE_ID = (0x7) +NV90F1_CTRL_CMD_VASPACE_GET_VAS_HEAP_INFO = (0x90f10108) +NV90F1_CTRL_VASPACE_GET_VAS_HEAP_INFO_PARAMS_MESSAGE_ID = (0x8) +NVA06F_CTRL_CMD_GPFIFO_SCHEDULE = (0xa06f0103) +NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS_MESSAGE_ID = (0x3) +NVA06F_CTRL_CMD_BIND = (0xa06f0104) +NVA06F_CTRL_BIND_PARAMS_MESSAGE_ID = (0x4) +NVA06F_CTRL_CMD_SET_ERROR_NOTIFIER = (0xa06f0108) +NVA06F_CTRL_SET_ERROR_NOTIFIER_PARAMS_MESSAGE_ID = (0x8) +NVA06F_CTRL_CMD_SET_INTERLEAVE_LEVEL = (0xa06f0109) +NVA06F_CTRL_SET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x9) +NVA06F_CTRL_CMD_GET_INTERLEAVE_LEVEL = (0xa06f0110) +NVA06F_CTRL_GET_INTERLEAVE_LEVEL_PARAMS_MESSAGE_ID = (0x10) +NVA06F_CTRL_CMD_RESTART_RUNLIST = (0xa06f0111) +NVA06F_CTRL_RESTART_RUNLIST_PARAMS_MESSAGE_ID = (0x11) +NVA06F_CTRL_CMD_STOP_CHANNEL = (0xa06f0112) +NVA06F_CTRL_STOP_CHANNEL_PARAMS_MESSAGE_ID = (0x12) +NVA06F_CTRL_CMD_GET_CONTEXT_ID = (0xa06f0113) +NVA06F_CTRL_GET_CONTEXT_ID_PARAMS_MESSAGE_ID = (0x13) +NV0000_CTRL_RESERVED = (0x00) +NV0000_CTRL_SYSTEM = (0x01) +NV0000_CTRL_GPU = (0x02) +NV0000_CTRL_GSYNC = (0x03) +NV0000_CTRL_DIAG = (0x04) +NV0000_CTRL_EVENT = (0x05) +NV0000_CTRL_NVD = (0x06) +NV0000_CTRL_SWINSTR = (0x07) +NV0000_CTRL_PROC = (0x09) +NV0000_CTRL_SYNC_GPU_BOOST = (0x0A) +NV0000_CTRL_GPUACCT = (0x0B) +NV0000_CTRL_VGPU = (0x0C) +NV0000_CTRL_CLIENT = (0x0D) +NV0000_CTRL_OS_WINDOWS = (0x3F) +NV0000_CTRL_OS_MACOS = (0x3E) +NV0000_CTRL_OS_UNIX = (0x3D) +NV0000_CTRL_CMD_NULL = (0x0) +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE = (0xd01) +NV0000_CTRL_CLIENT_GET_ADDR_SPACE_TYPE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_INVALID = 0x00000000 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_SYSMEM = 0x00000001 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_VIDMEM = 0x00000002 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_REGMEM = 0x00000003 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_FABRIC = 0x00000004 +NV0000_CTRL_CMD_CLIENT_GET_ADDR_SPACE_TYPE_FABRIC_MC = 0x00000005 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO = (0xd02) +NV0000_CTRL_CLIENT_GET_HANDLE_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_INVALID = 0x00000000 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_PARENT = 0x00000001 +NV0000_CTRL_CMD_CLIENT_GET_HANDLE_INFO_INDEX_CLASSID = 0x00000002 +NV0000_CTRL_CMD_CLIENT_GET_ACCESS_RIGHTS = (0xd03) +NV0000_CTRL_CLIENT_GET_ACCESS_RIGHTS_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_CLIENT_SET_INHERITED_SHARE_POLICY = (0xd04) +NV0000_CTRL_CLIENT_SET_INHERITED_SHARE_POLICY_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE = (0xd05) +NV0000_CTRL_CMD_CLIENT_GET_CHILD_HANDLE_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_CLIENT_SHARE_OBJECT = (0xd06) +NV0000_CTRL_CLIENT_SHARE_OBJECT_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_CLIENT_OBJECTS_ARE_DUPLICATES = (0xd07) +NV0000_CTRL_CLIENT_OBJECTS_ARE_DUPLICATES_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL = (0xd08) +NV0000_CTRL_CLIENT_SUBSCRIBE_TO_IMEX_CHANNEL_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_DIAG_GET_LOCK_METER_STATE = (0x480) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_PARAMS_MESSAGE_ID = (0x80) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_DISABLED = (0x00000000) +NV0000_CTRL_DIAG_GET_LOCK_METER_STATE_ENABLED = (0x00000001) +NV0000_CTRL_DIAG_LOCK_METER_MAX_TABLE_ENTRIES = (0x20000) +NV0000_CTRL_CMD_DIAG_SET_LOCK_METER_STATE = (0x481) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_PARAMS_MESSAGE_ID = (0x81) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_DISABLE = (0x00000000) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_ENABLE = (0x00000001) +NV0000_CTRL_DIAG_SET_LOCK_METER_STATE_RESET = (0x00000002) +NV0000_CTRL_DIAG_LOCK_METER_ENTRY_FILENAME_LENGTH = (0xc) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA = (0x00000001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA_FORCED = (0x00000002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_SEMA_COND = (0x00000003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_SEMA = (0x00000004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_API = (0x00000010) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_API = (0x00000011) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ACQUIRE_GPUS = (0x00000020) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RELEASE_GPUS = (0x00000021) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DATA = (0x00000100) +NV0000_CTRL_DIAG_LOCK_METER_TAG_RMCTRL = (0x00001000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_CFG_GETEX = (0x00002002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_CFG_SETEX = (0x00002003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_VIDHEAP = (0x00003000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_MAPMEM = (0x00003001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_UNMAPMEM = (0x00003002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_MAPMEM_DMA = (0x00003003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_UNMAPMEM_DMA = (0x00003004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC = (0x00004000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC_MEM = (0x00004001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DUP_OBJECT = (0x00004010) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CLIENT = (0x00005000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DEVICE = (0x00005001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_SUBDEVICE = (0x00005002) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_SUBDEVICE_DIAG = (0x00005003) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DISP = (0x00005004) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_DISP_CMN = (0x00005005) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL = (0x00005006) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL_MPEG = (0x00005007) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_CHANNEL_DISP = (0x00005008) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_MEMORY = (0x00005009) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_FBMEM = (0x0000500A) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_OBJECT = (0x0000500B) +NV0000_CTRL_DIAG_LOCK_METER_TAG_FREE_EVENT = (0x0000500C) +NV0000_CTRL_DIAG_LOCK_METER_TAG_IDLE_CHANNELS = (0x00006000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_BIND_CTXDMA = (0x00007000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ALLOC_CTXDMA = (0x00007001) +NV0000_CTRL_DIAG_LOCK_METER_TAG_ISR = (0x0000F000) +NV0000_CTRL_DIAG_LOCK_METER_TAG_DPC = (0x0000F00F) +NV0000_CTRL_CMD_DIAG_GET_LOCK_METER_ENTRIES = (0x485) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_MAX = (0x40) +NV0000_CTRL_DIAG_GET_LOCK_METER_ENTRIES_PARAMS_MESSAGE_ID = (0x85) +NV0000_CTRL_CMD_DIAG_PROFILE_RPC = (0x488) +NV0000_CTRL_DIAG_PROFILE_RPC_PARAMS_MESSAGE_ID = (0x88) +NV0000_CTRL_PROFILE_RPC_CMD_DISABLE = (0x00000000) +NV0000_CTRL_PROFILE_RPC_CMD_ENABLE = (0x00000001) +NV0000_CTRL_PROFILE_RPC_CMD_RESET = (0x00000002) +NV0000_CTRL_CMD_DIAG_DUMP_RPC = (0x489) +NV0000_CTRL_DIAG_RPC_MAX_ENTRIES = (100) +NV0000_CTRL_DIAG_DUMP_RPC_PARAMS_MESSAGE_ID = (0x89) +NV0000_NOTIFIERS_DISPLAY_CHANGE = (0) +NV0000_NOTIFIERS_VGPU_UNBIND_EVENT = (1) +NV0000_NOTIFIERS_VGPU_BIND_EVENT = (2) +NV0000_NOTIFIERS_GPU_BIND_UNBIND_EVENT = (3) +NV0000_NOTIFIERS_MAXCOUNT = (4) +NV0000_CTRL_CMD_EVENT_SET_NOTIFICATION = (0x501) +NV0000_CTRL_EVENT_SET_NOTIFICATION_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_DISABLE = (0x00000000) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_SINGLE = (0x00000001) +NV0000_CTRL_EVENT_SET_NOTIFICATION_ACTION_REPEAT = (0x00000002) +NV0000_CTRL_CMD_GET_SYSTEM_EVENT_DATA = (0x502) +NV0000_CTRL_GET_SYSTEM_EVENT_DATA_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_GPU_GET_ATTACHED_IDS = (0x201) +NV0000_CTRL_GPU_MAX_ATTACHED_GPUS = 32 +NV0000_CTRL_GPU_INVALID_ID = (0xffffffff) +NV0000_CTRL_GPU_GET_ATTACHED_IDS_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_GPU_GET_ID_INFO = (0x202) +NV0000_CTRL_GPU_MAX_SZNAME = 128 +NV0000_CTRL_NO_NUMA_NODE = (-1) +NV0000_CTRL_GPU_GET_ID_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_SLI_STATUS_OK = (0x00000000) +NV0000_CTRL_SLI_STATUS_OS_NOT_SUPPORTED = (0x00000002) +NV0000_CTRL_SLI_STATUS_GPU_NOT_SUPPORTED = (0x00000040) +NV0000_CTRL_SLI_STATUS_INVALID_GPU_COUNT = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_ID_INFO_V2 = (0x205) +NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_GPU_ID_INFO_IN_USE = (0, 0) +NV0000_CTRL_GPU_ID_INFO_IN_USE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_IN_USE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE = (1, 1) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_LINKED_INTO_SLI_DEVICE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_MOBILE = (2, 2) +NV0000_CTRL_GPU_ID_INFO_MOBILE_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_MOBILE_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER = (3, 3) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_BOOT_MASTER_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_SOC = (5, 5) +NV0000_CTRL_GPU_ID_INFO_SOC_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_SOC_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED = (6, 6) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED_FALSE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_ATS_ENABLED_TRUE = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE = (8, 7) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE_NONE = (0x00000000) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE_DISPLAY = (0x00000001) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE_IGPU = (0x00000002) +NV0000_CTRL_GPU_ID_INFO_SOC_TYPE_DISPLAY_AND_IGPU = (0x00000003) +NV0000_CTRL_CMD_GPU_GET_INIT_STATUS = (0x203) +NV0000_CTRL_GPU_GET_INIT_STATUS_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_GPU_GET_DEVICE_IDS = (0x204) +NV0000_CTRL_GPU_GET_DEVICE_IDS_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_GPU_GET_PROBED_IDS = (0x214) +NV0000_CTRL_GPU_GET_PROBED_IDS_PARAMS_MESSAGE_ID = (0x14) +NV0000_CTRL_GPU_PROBED_ID_FLAGS_SOC_DISPLAY = (0, 0) +NV0000_CTRL_GPU_PROBED_ID_FLAGS_SOC_DISPLAY_FALSE = (0x00000000) +NV0000_CTRL_GPU_PROBED_ID_FLAGS_SOC_DISPLAY_TRUE = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_PCI_INFO = (0x21b) +NV0000_CTRL_GPU_GET_PCI_INFO_PARAMS_MESSAGE_ID = (0x1B) +NV0000_CTRL_CMD_GPU_ATTACH_IDS = (0x215) +NV0000_CTRL_GPU_ATTACH_ALL_PROBED_IDS = (0x0000ffff) +NV0000_CTRL_GPU_ATTACH_IDS_PARAMS_MESSAGE_ID = (0x15) +NV0000_CTRL_CMD_GPU_DETACH_IDS = (0x216) +NV0000_CTRL_GPU_DETACH_ALL_ATTACHED_IDS = (0x0000ffff) +NV0000_CTRL_GPU_DETACH_IDS_PARAMS_MESSAGE_ID = (0x16) +NV0000_CTRL_CMD_GPU_GET_VIDEO_LINKS = (0x219) +NV0000_CTRL_GPU_MAX_VIDEO_LINKS = 8 +NV0000_CTRL_GPU_GET_VIDEO_LINKS_PARAMS_MESSAGE_ID = (0x19) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO = (0x274) +NV0000_GPU_MAX_GID_LENGTH = (0x00000100) +NV0000_CTRL_GPU_GET_UUID_INFO_PARAMS_MESSAGE_ID = (0x74) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT = (1, 0) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT_ASCII = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_FORMAT_BINARY = (0x00000002) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE = (2, 2) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE_SHA1 = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_INFO_FLAGS_TYPE_SHA256 = (0x00000001) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID = (0x275) +NV0000_CTRL_GPU_GET_UUID_FROM_GPU_ID_PARAMS_MESSAGE_ID = (0x75) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT = (1, 0) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT_ASCII = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_FORMAT_BINARY = (0x00000002) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE = (2, 2) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE_SHA1 = (0x00000000) +NV0000_CTRL_CMD_GPU_GET_UUID_FROM_GPU_ID_FLAGS_TYPE_SHA256 = (0x00000001) +NV0000_CTRL_CMD_GPU_MODIFY_DRAIN_STATE = (0x278) +NV0000_CTRL_GPU_DRAIN_STATE_DISABLED = (0x00000000) +NV0000_CTRL_GPU_DRAIN_STATE_ENABLED = (0x00000001) +NV0000_CTRL_GPU_DRAIN_STATE_FLAG_REMOVE_DEVICE = (0x00000001) +NV0000_CTRL_GPU_DRAIN_STATE_FLAG_LINK_DISABLE = (0x00000002) +NV0000_CTRL_GPU_MODIFY_DRAIN_STATE_PARAMS_MESSAGE_ID = (0x78) +NV0000_CTRL_CMD_GPU_QUERY_DRAIN_STATE = (0x279) +NV0000_CTRL_GPU_QUERY_DRAIN_STATE_PARAMS_MESSAGE_ID = (0x79) +NV0000_CTRL_CMD_GPU_DISCOVER = (0x27a) +NV0000_CTRL_CMD_GPU_GET_MEMOP_ENABLE = (0x27b) +NV0000_CTRL_GPU_GET_MEMOP_ENABLE_PARAMS_MESSAGE_ID = (0x7B) +NV0000_CTRL_GPU_FLAGS_MEMOP_ENABLE = (0x00000001) +NV0000_CTRL_CMD_GPU_DISABLE_NVLINK_INIT = (0x281) +NV0000_CTRL_GPU_DISABLE_NVLINK_INIT_PARAMS_MESSAGE_ID = (0x81) +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PARAM_DATA = 0x00000175 +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PROPERTIES_IN = 6 +NV0000_CTRL_GPU_LEGACY_CONFIG_MAX_PROPERTIES_OUT = 5 +NV0000_CTRL_CMD_IDLE_CHANNELS = (0x283) +NV0000_CTRL_GPU_IDLE_CHANNELS_PARAMS_MESSAGE_ID = (0x83) +NV0000_CTRL_GPU_IMAGE_TYPE_GSP = (0x00000001) +NV0000_CTRL_GPU_IMAGE_TYPE_GSP_LOG = (0x00000002) +NV0000_CTRL_GPU_IMAGE_TYPE_BINDATA_IMAGE = (0x00000003) +NV0000_CTRL_CMD_PUSH_UCODE_IMAGE = (0x285) +NV0000_CTRL_GPU_PUSH_UCODE_IMAGE_PARAMS_MESSAGE_ID = (0x85) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SETTING_LEGACY = (2, 0) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SETTING_LINK_COUNT = (7, 3) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_FULL = (0x00) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_OFF = (0x01) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_MIN = (0x02) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_HALF = (0x03) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_3QUARTER = (0x04) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_LINK_COUNT = (0x05) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_UNSET = (0x00) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_PER_NODE = (0x01) +NV0000_CTRL_CMD_GPU_NVLINK_BW_MODE_SCOPE_PER_GPU = (0x02) +NV0000_CTRL_CMD_GPU_SET_NVLINK_BW_MODE = (0x286) +NV0000_CTRL_GPU_SET_NVLINK_BW_MODE_PARAMS_MESSAGE_ID = (0x86) +NV0000_CTRL_CMD_GPU_GET_NVLINK_BW_MODE = (0x287) +NV0000_CTRL_GPU_GET_NVLINK_BW_MODE_PARAMS_MESSAGE_ID = (0x87) +NV0000_CTRL_CMD_GPU_GET_ACTIVE_DEVICE_IDS = (0x288) +NV0000_CTRL_GPU_MAX_ACTIVE_DEVICES = 256 +NV0000_CTRL_GPU_GET_ACTIVE_DEVICE_IDS_PARAMS_MESSAGE_ID = (0x88) +NV0000_CTRL_CMD_GPU_ASYNC_ATTACH_ID = (0x289) +NV0000_CTRL_GPU_ASYNC_ATTACH_ID_PARAMS_MESSAGE_ID = (0x89) +NV0000_CTRL_CMD_GPU_WAIT_ATTACH_ID = (0x290) +NV0000_CTRL_GPU_WAIT_ATTACH_ID_PARAMS_MESSAGE_ID = (0x90) +NV0000_CTRL_CMD_GPU_PCI_READ_WRITE_DATA_SIZE_08 = 0 +NV0000_CTRL_CMD_GPU_PCI_READ_WRITE_DATA_SIZE_16 = 1 +NV0000_CTRL_CMD_GPU_PCI_READ_WRITE_DATA_SIZE_32 = 2 +NV0000_CTRL_CMD_GPU_PCI_READ_WRITE = (0x291) +NV0000_CTRL_GPU_PCI_READ_WRITE_PARAMS_MESSAGE_ID = (0x91) +NV0000_CTRL_CMD_GPUACCT_SET_ACCOUNTING_STATE = (0xb01) +NV0000_CTRL_GPU_ACCOUNTING_STATE_ENABLED = (0x00000000) +NV0000_CTRL_GPU_ACCOUNTING_STATE_DISABLED = (0x00000001) +NV0000_CTRL_GPUACCT_SET_ACCOUNTING_STATE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_GPUACCT_GET_ACCOUNTING_STATE = (0xb02) +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_STATE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_GPUACCT_GET_PROC_ACCOUNTING_INFO = (0xb03) +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_GPUACCT_GET_ACCOUNTING_PIDS = (0xb04) +NV0000_GPUACCT_PID_MAX_COUNT = 4000 +NV0000_CTRL_GPUACCT_GET_ACCOUNTING_PIDS_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_GPUACCT_CLEAR_ACCOUNTING_DATA = (0xb05) +NV0000_CTRL_GPUACCT_CLEAR_ACCOUNTING_DATA_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_GPUACCT_GET_PROC_ACCOUNTING_INFO_V2 = (0xb06) +NV0000_CTRL_GPUACCT_GET_PROC_ACCOUNTING_INFO_V2_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_GSYNC_GET_ATTACHED_IDS = (0x301) +NV0000_CTRL_GSYNC_GET_ATTACHED_IDS_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_GSYNC_INVALID_ID = (0xffffffff) +NV0000_CTRL_CMD_GSYNC_GET_ID_INFO = (0x302) +NV0000_CTRL_GSYNC_GET_ID_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_NVD_DUMP_COMPONENT_SYS = (0x400) +NV0000_CTRL_NVD_DUMP_COMPONENT_NVLOG = (0x800) +NV0000_CTRL_NVD_DUMP_COMPONENT_RESERVED = (0xB00) +NV0000_CTRL_CMD_NVD_GET_DUMP_SIZE = (0x601) +NV0000_CTRL_NVD_GET_DUMP_SIZE_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_NVD_MAX_DUMP_SIZE = (1000000) +NV0000_CTRL_CMD_NVD_GET_DUMP = (0x602) +NV0000_CTRL_NVD_GET_DUMP_PARAMS_MESSAGE_ID = (0x2) +NV0000_NVD_CPU_TIME_CLK_ID_DEFAULT = (0x00000000) +NV0000_NVD_CPU_TIME_CLK_ID_OSTIME = (0x00000001) +NV0000_NVD_CPU_TIME_CLK_ID_TSC = (0x00000002) +NV0000_NVD_CPU_TIME_CLK_ID_PLATFORM_API = (0x00000003) +NV0000_CTRL_CMD_NVD_GET_TIMESTAMP = (0x603) +NV0000_CTRL_NVD_GET_TIMESTAMP_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_NVD_GET_NVLOG_INFO = (0x604) +NV0000_CTRL_NVD_MAX_RUNTIME_SIZES = (16) +NV0000_CTRL_NVD_SIGNATURE_SIZE = (4) +NV0000_CTRL_NVD_MAX_BUFFERS = (3840) +NV0000_CTRL_NVD_GET_NVLOG_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_NVD_RUNTIME_SIZE_UNUSED = (0) +NV0000_CTRL_NVD_RUNTIME_SIZE_INT = (1) +NV0000_CTRL_NVD_RUNTIME_SIZE_LONG_LONG = (2) +NV0000_CTRL_NVD_RUNTIME_SIZE_STRING = (3) +NV0000_CTRL_NVD_RUNTIME_SIZE_PTR = (4) +NV0000_CTRL_NVD_RUNTIME_SIZE_CHAR = (5) +NV0000_CTRL_NVD_RUNTIME_SIZE_FLOAT = (6) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_INFO = (7, 0) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE = (23, 8) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE_DISABLE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_BUFFER_SIZE_DEFAULT = (0x00000004) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_RUNTIME_LEVEL = (28, 25) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP = (30, 29) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_NONE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_32 = (0x00000001) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_64 = (0x00000002) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_TIMESTAMP_32_DIFF = (0x00000003) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED = (31, 31) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_INFO_PRINTFLAGS_INITED_YES = (0x00000001) +NV0000_CTRL_CMD_NVD_GET_NVLOG_BUFFER_INFO = (0x605) +NV0000_CTRL_NVD_GET_NVLOG_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE = (0, 0) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_PAUSE_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED = (0, 0) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_DISABLED_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE = (1, 1) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE_RING = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_TYPE_NOWRAP = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE = (2, 2) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_EXPANDABLE_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED = (3, 3) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_NONPAGED_YES = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING = (5, 4) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_NONE = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_STATE = (0x00000001) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_LOCKING_FULL = (0x00000002) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA = (6, 6) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA_NO = (0x00000000) +NV0000_CTRL_NVD_NVLOG_BUFFER_INFO_FLAGS_OCA_YES = (0x00000001) +NV0000_CTRL_CMD_NVD_GET_NVLOG = (0x606) +NV0000_CTRL_NVLOG_MAX_BLOCK_SIZE = (4000) +NV0000_CTRL_NVD_GET_NVLOG_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT = (0x607) +NV0000_CTRL_CMD_NVD_RCERR_RPT_MAX_ENTRIES = 200 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_TEST = 0 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_GRSTATUS = 1 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_GPCSTATUS = 2 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_MMU_FAULT_STATUS = 3 +NV0000_CTRL_CMD_NVD_RCERR_RPT_TYPE_RC_ERROR = 4 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_EMPTY = 0x00000000 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_OVERFLOWED = 0x00000001 +NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_MAX_PSEDO_REG = 0x0000000f +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_POS_FIRST = 0x00000001 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_POS_LAST = 0x00000002 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_RANGE_VALID = 0x00000004 +NV0000_CTRL_CMD_NVD_RCERR_RPT_FLAGS_DATA_VALID = 0x00000008 +TPC_REG_ATTR = lambda gpcId,tpcId: ((gpcId << 8) | (tpcId)) # type: ignore +ROP_REG_ATTR = lambda gpcId,ropId: ((gpcId << 8) | (ropId)) # type: ignore +SM_REG_ATTR = lambda gpcId,tpcId,smId: ((((gpcId) << 16) | ((tpcId) << 8)) | (smId)) # type: ignore +NV0000_CTRL_CMD_NVD_RCERR_RPT_ANY_PROCESS_ID = 0x00000000 +NV0000_CTRL_CMD_NVD_RCERR_RPT_ANY_OWNER_ID = 0xFFFFFFFF +NV0000_CTRL_CMD_NVD_GET_RCERR_RPT_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_NVD_GET_DPC_ISR_TS = (0x608) +NV0000_CTRL_NVD_GET_DPC_ISR_TS_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_SET_SUB_PROCESS_ID_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_DISABLE_SUB_PROCESS_USERD_ISOLATION_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_SET_SUB_PROCESS_ID = (0x901) +NV0000_CTRL_CMD_DISABLE_SUB_PROCESS_USERD_ISOLATION = (0x902) +NV0000_SYNC_GPU_BOOST_MAX_GROUPS = (0x10) +NV0000_SYNC_GPU_BOOST_INVALID_GROUP_ID = 0xFFFFFFFF +NV0000_CTRL_CMD_SYNC_GPU_BOOST_INFO = (0xa01) +NV0000_SYNC_GPU_BOOST_INFO_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_CREATE = (0xa02) +NV0000_SYNC_GPU_BOOST_GROUP_CREATE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_DESTROY = (0xa03) +NV0000_SYNC_GPU_BOOST_GROUP_DESTROY_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_SYNC_GPU_BOOST_GROUP_INFO = (0xa04) +NV0000_SYNC_GPU_BOOST_GROUP_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_SYSTEM_GET_FEATURES = (0x1f0) +NV0000_CTRL_SYSTEM_GET_FEATURES_PARAMS_MESSAGE_ID = (0xF0) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI = (0, 0) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_SLI_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING = (3, 3) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_UUID_BASED_MEM_SHARING_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED = (4, 4) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_FEATURES_RM_TEST_ONLY_CODE_ENABLED_TRUE = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION = (0x101) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_PARAMS_MESSAGE_ID = (0x1) +NV0000_CTRL_CMD_SYSTEM_GET_CPU_INFO = (0x102) +NV0000_CTRL_SYSTEM_GET_CPU_INFO_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_SYSTEM_CPU_FAMILY = (3, 0) +NV0000_CTRL_SYSTEM_CPU_EXTENDED_FAMILY = (11, 4) +NV0000_CTRL_SYSTEM_CPU_MODEL = (3, 0) +NV0000_CTRL_SYSTEM_CPU_EXTENDED_MODEL = (7, 4) +NV0000_CTRL_SYSTEM_CPU_ID_AMD_FAMILY = 0xF +NV0000_CTRL_SYSTEM_CPU_ID_AMD_EXTENDED_FAMILY = 0xA +NV0000_CTRL_SYSTEM_CPU_ID_AMD_MODEL = 0x0 +NV0000_CTRL_SYSTEM_CPU_ID_AMD_EXTENDED_MODEL = 0x4 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_FAMILY = 0x6 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_EXTENDED_FAMILY = 0x0 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_CORE_S_MODEL = 0x7 +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_CORE_P_MODEL = 0xA +NV0000_CTRL_SYSTEM_CPU_ID_INTEL_EXTENDED_MODEL = 0x9 +NV0000_CTRL_SYSTEM_CPU_TYPE_UNKNOWN = (0x00000000) +NV0000_CTRL_SYSTEM_CPU_TYPE_P5 = (0x00000001) +NV0000_CTRL_SYSTEM_CPU_TYPE_P55 = (0x00000002) +NV0000_CTRL_SYSTEM_CPU_TYPE_P6 = (0x00000003) +NV0000_CTRL_SYSTEM_CPU_TYPE_P2 = (0x00000004) +NV0000_CTRL_SYSTEM_CPU_TYPE_P2XC = (0x00000005) +NV0000_CTRL_SYSTEM_CPU_TYPE_CELA = (0x00000006) +NV0000_CTRL_SYSTEM_CPU_TYPE_P3 = (0x00000007) +NV0000_CTRL_SYSTEM_CPU_TYPE_P3_INTL2 = (0x00000008) +NV0000_CTRL_SYSTEM_CPU_TYPE_P4 = (0x00000009) +NV0000_CTRL_SYSTEM_CPU_TYPE_CORE2 = (0x00000010) +NV0000_CTRL_SYSTEM_CPU_TYPE_CELN_M16H = (0x00000011) +NV0000_CTRL_SYSTEM_CPU_TYPE_CORE2_EXTRM = (0x00000012) +NV0000_CTRL_SYSTEM_CPU_TYPE_ATOM = (0x00000013) +NV0000_CTRL_SYSTEM_CPU_TYPE_XEON_SPR = (0x00000014) +NV0000_CTRL_SYSTEM_CPU_TYPE_K5 = (0x00000030) +NV0000_CTRL_SYSTEM_CPU_TYPE_K6 = (0x00000031) +NV0000_CTRL_SYSTEM_CPU_TYPE_K62 = (0x00000032) +NV0000_CTRL_SYSTEM_CPU_TYPE_K63 = (0x00000033) +NV0000_CTRL_SYSTEM_CPU_TYPE_K7 = (0x00000034) +NV0000_CTRL_SYSTEM_CPU_TYPE_K8 = (0x00000035) +NV0000_CTRL_SYSTEM_CPU_TYPE_K10 = (0x00000036) +NV0000_CTRL_SYSTEM_CPU_TYPE_K11 = (0x00000037) +NV0000_CTRL_SYSTEM_CPU_TYPE_RYZEN = (0x00000038) +NV0000_CTRL_SYSTEM_CPU_TYPE_C6 = (0x00000060) +NV0000_CTRL_SYSTEM_CPU_TYPE_C62 = (0x00000061) +NV0000_CTRL_SYSTEM_CPU_TYPE_GX = (0x00000070) +NV0000_CTRL_SYSTEM_CPU_TYPE_M1 = (0x00000071) +NV0000_CTRL_SYSTEM_CPU_TYPE_M2 = (0x00000072) +NV0000_CTRL_SYSTEM_CPU_TYPE_MGX = (0x00000073) +NV0000_CTRL_SYSTEM_CPU_TYPE_TM_CRUSOE = (0x00000080) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC603 = (0x00000090) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC604 = (0x00000091) +NV0000_CTRL_SYSTEM_CPU_TYPE_PPC750 = (0x00000092) +NV0000_CTRL_SYSTEM_CPU_TYPE_POWERN = (0x00000093) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_UNKNOWN = (0xA0000000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_A9 = (0xA0000009) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARM_A15 = (0xA000000F) +NV0000_CTRL_SYSTEM_CPU_TYPE_NV_DENVER_1_0 = (0xA0001000) +NV0000_CTRL_SYSTEM_CPU_TYPE_NV_DENVER_2_0 = (0xA0002000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARMV8A_GENERIC = (0xA00FF000) +NV0000_CTRL_SYSTEM_CPU_TYPE_ARMV9A_GENERIC = (0xA00FF001) +NV0000_CTRL_SYSTEM_CPU_CAP_MMX = (0x00000001) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE = (0x00000002) +NV0000_CTRL_SYSTEM_CPU_CAP_3DNOW = (0x00000004) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE2 = (0x00000008) +NV0000_CTRL_SYSTEM_CPU_CAP_SFENCE = (0x00000010) +NV0000_CTRL_SYSTEM_CPU_CAP_WRITE_COMBINING = (0x00000020) +NV0000_CTRL_SYSTEM_CPU_CAP_ALTIVEC = (0x00000040) +NV0000_CTRL_SYSTEM_CPU_CAP_PUT_NEEDS_IO = (0x00000080) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WC_WORKAROUND = (0x00000100) +NV0000_CTRL_SYSTEM_CPU_CAP_3DNOW_EXT = (0x00000200) +NV0000_CTRL_SYSTEM_CPU_CAP_MMX_EXT = (0x00000400) +NV0000_CTRL_SYSTEM_CPU_CAP_CMOV = (0x00000800) +NV0000_CTRL_SYSTEM_CPU_CAP_CLFLUSH = (0x00001000) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WAR_190854 = (0x00002000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE3 = (0x00004000) +NV0000_CTRL_SYSTEM_CPU_CAP_NEEDS_WAR_124888 = (0x00008000) +NV0000_CTRL_SYSTEM_CPU_CAP_HT_CAPABLE = (0x00010000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE41 = (0x00020000) +NV0000_CTRL_SYSTEM_CPU_CAP_SSE42 = (0x00040000) +NV0000_CTRL_SYSTEM_CPU_CAP_AVX = (0x00080000) +NV0000_CTRL_SYSTEM_CPU_CAP_ERMS = (0x00100000) +NV0000_CTRL_CMD_SYSTEM_GET_CHIPSET_INFO = (0x104) +NV0000_SYSTEM_MAX_CHIPSET_STRING_LENGTH = (0x0000020) +NV0000_SYSTEM_CHIPSET_INVALID_ID = (0xffff) +NV0000_CTRL_SYSTEM_GET_CHIPSET_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE = (0, 0) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE_NO = (0x00000000) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_HAS_RESIZABLE_BAR_ISSUE_YES = (0x00000001) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_BAR1_UNALIGNED_ACCESS = (1, 1) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_BAR1_UNALIGNED_ACCESS_NO = (0x00000000) +NV0000_CTRL_SYSTEM_CHIPSET_FLAG_BAR1_UNALIGNED_ACCESS_YES = (0x00000001) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT = (0x107) +NV0000_CTRL_SYSTEM_GET_VRR_COOKIE_PRESENT_PARAMS_MESSAGE_ID = (0x7) +NV0000_CTRL_CMD_SYSTEM_GET_LOCK_TIMES = (0x109) +NV0000_CTRL_SYSTEM_GET_LOCK_TIMES_PARAMS_MESSAGE_ID = (0x9) +NV0000_CTRL_CMD_SYSTEM_GET_CLASSLIST = (0x108) +NV0000_CTRL_SYSTEM_MAX_CLASSLIST_SIZE = (32) +NV0000_CTRL_SYSTEM_GET_CLASSLIST_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_SYSTEM_NOTIFY_EVENT = (0x110) +NV0000_CTRL_SYSTEM_NOTIFY_EVENT_PARAMS_MESSAGE_ID = (0x10) +NV0000_CTRL_SYSTEM_EVENT_TYPE_LID_STATE = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_TYPE_POWER_SOURCE = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_TYPE_DOCK_STATE = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_TYPE_TRUST_LID = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_TYPE_TRUST_DOCK = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_LID_OPEN = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_LID_CLOSED = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_POWER_BATTERY = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_POWER_AC = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_UNDOCKED = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_DOCKED = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_DSM = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_DCS = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_NVIF = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_ACPI = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_POLL = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_LID_COUNT = (0x5) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_DSM = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_DCS = (0x00000001) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_NVIF = (0x00000002) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_ACPI = (0x00000003) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_POLL = (0x00000004) +NV0000_CTRL_SYSTEM_EVENT_DATA_TRUST_DOCK_COUNT = (0x5) +NV0000_CTRL_SYSTEM_EVENT_DATA_FORCED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_EVENT_DATA_FORCED_TRUE = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE = (0x111) +NV0000_CTRL_CMD_SYSTEM_GET_PLATFORM_TYPE_PARAMS_MESSAGE_ID = (0x11) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_DESKTOP = (0x000000) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_MOBILE_GENERIC = (0x000001) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_MOBILE_TOSHIBA = (0x000002) +NV0000_CTRL_SYSTEM_GET_PLATFORM_TYPE_SOC = (0x000003) +NV0000_CTRL_CMD_SYSTEM_DEBUG_RMMSG_CTRL = (0x121) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_SIZE = 512 +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_CMD_GET = (0x00000000) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_CMD_SET = (0x00000001) +NV0000_CTRL_SYSTEM_DEBUG_RMMSG_CTRL_PARAMS_MESSAGE_ID = (0x21) +NV0000_CTRL_CMD_SYSTEM_GPS_CONTROL = (0x122) +NV0000_CTRL_SYSTEM_GPS_CONTROL_PARAMS_MESSAGE_ID = (0x22) +NV0000_CTRL_CMD_SYSTEM_GPS_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_INIT = (0x0000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_EXEC = (0x0001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_EXEC = (0x0002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_ACTIONS = (0x0003) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_ACTIONS = (0x0004) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_LOGIC = (0x0005) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_LOGIC = (0x0006) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_PREFERENCE = (0x0007) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_PREFERENCE = (0x0008) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_GPU2CPU_LIMIT = (0x0009) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_GPU2CPU_LIMIT = (0x000A) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_SET_PMU_GPS_STATE = (0x000B) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_GET_PMU_GPS_STATE = (0x000C) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_MAX_POWER = (0x0100) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_MAX_POWER = (0x0101) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_COOLING_BUDGET = (0x0102) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_COOLING_BUDGET = (0x0103) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_INTEGRAL_PERIOD = (0x0104) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_INTEGRAL_PERIOD = (0x0105) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_RULESET = (0x0106) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_RULESET = (0x0107) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_RULE_COUNT = (0x0108) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_APP_BOOST = (0x0109) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_APP_BOOST = (0x010A) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_SET_PWR_SUPPLY_MODE = (0x010B) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_PWR_SUPPLY_MODE = (0x010C) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_VCT_SUPPORT_INFO = (0x010D) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_GET_SUPPORTED_FUNCTIONS = (0x010E) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER = (0x0200) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_DELTA = (0x0201) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_FUTURE = (0x0202) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_LTMAVG = (0x0203) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_INTEGRAL = (0x0204) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_BURDEN = (0x0205) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_INTERMEDIATE = (0x0206) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_SENSOR_PARAMETERS = (0x0210) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP = (0x0220) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP_DELTA = (0x0221) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_TEMP_FUTURE = (0x0222) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE = (0x0240) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_CAP = (0x0241) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_MIN = (0x0242) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_MAX = (0x0243) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_ACTION = (0x0244) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_PSTATE_SLFM_PRESENT = (0x0245) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_SET_POWER_SIM_STATE = (0x0250) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_SIM_STATE = (0x0251) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_SET_POWER_SIM_DATA = (0x0252) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_GET_POWER_SIM_DATA = (0x0253) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_INIT_USING_SBIOS_AND_ACK = (0x0320) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_PING_SBIOS_FOR_EVENT = (0x0321) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_SYSTEM = (0x0000) +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_CPU = lambda i: (0x0100+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_GPS_LOCALE_GPU = lambda i: (0x0200+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INVALID = (0x80000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INIT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_INIT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_EXEC_STOP = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_EXEC_START = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_ACTIONS_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_ACTIONS_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_FUZZY = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_LOGIC_DETERMINISTIC = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_CPU = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_GPU = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PREFERENCE_BOTH = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_NO_MAP_OVERRIDE = (0xFFFFFFFF) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PMU_GPS_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_CMD_DEF_PMU_GPS_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_REAL = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_FAKE_AC = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_PWR_SUPPLY_FAKE_BATT = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SUPPORT = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_VENTURASTATUS = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_GETPSS = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SETPPC = (0x00000008) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_GETPPC = (0x00000010) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_VENTURACB = (0x00000020) +NV0000_CTRL_CMD_SYSTEM_GPS_SYS_DEF_FUNC_SYSPARAMS = (0x00000040) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DEC_TO_P0 = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DEC_BY_1 = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_DO_NOTHING = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_SET_CURRENT = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_BY_1 = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_BY_2 = (0x00000005) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_TO_LFM = (0x00000006) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_ACTION_INC_TO_SLFM = (0x00000007) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_SLFM_PRESENT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_SLFM_PRESENT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_POWER_SIM_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_GPS_DATA_DEF_POWER_SIM_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_GPS_BATCH_CONTROL = (0x123) +NV0000_CTRL_CMD_SYSTEM_GPS_BATCH_COMMAND_MAX = (16) +NV0000_CTRL_SYSTEM_GPS_BATCH_CONTROL_PARAMS_MESSAGE_ID = (0x23) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS = (0x127) +NV0000_CTRL_SYSTEM_MAX_ATTACHED_GPUS = 32 +NV0000_CTRL_SYSTEM_MAX_ATTACHED_GPUS_SQUARED = 1024 +NV0000_CTRL_SYSTEM_MAX_P2P_GROUP_GPUS = 8 +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INVALID_PEER = 0xffffffff +NV0000_CTRL_P2P_CAPS_INDEX_READ = 0 +NV0000_CTRL_P2P_CAPS_INDEX_WRITE = 1 +NV0000_CTRL_P2P_CAPS_INDEX_NVLINK = 2 +NV0000_CTRL_P2P_CAPS_INDEX_ATOMICS = 3 +NV0000_CTRL_P2P_CAPS_INDEX_PROP = 4 +NV0000_CTRL_P2P_CAPS_INDEX_LOOPBACK = 5 +NV0000_CTRL_P2P_CAPS_INDEX_PCI = 6 +NV0000_CTRL_P2P_CAPS_INDEX_C2C = 7 +NV0000_CTRL_P2P_CAPS_INDEX_PCI_BAR1 = 8 +NV0000_CTRL_P2P_CAPS_INDEX_TABLE_SIZE = 9 +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PARAMS_MESSAGE_ID = (0x27) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED = (0, 0) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_WRITES_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED = (1, 1) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_READS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED = (2, 2) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PROP_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED = (3, 3) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_NVLINK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED = (4, 4) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_ATOMICS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED = (5, 5) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_LOOPBACK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED = (6, 6) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED = (7, 7) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_WRITES_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED = (8, 8) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_READS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED = (9, 9) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_ATOMICS_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED = (10, 10) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_INDIRECT_NVLINK_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED = (12, 12) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_C2C_SUPPORTED_TRUE = (0x00000001) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED = (13, 13) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED_FALSE = (0x00000000) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_PCI_BAR1_SUPPORTED_TRUE = (0x00000001) +NV0000_P2P_CAPS_STATUS_OK = (0x00) +NV0000_P2P_CAPS_STATUS_CHIPSET_NOT_SUPPORTED = (0x01) +NV0000_P2P_CAPS_STATUS_GPU_NOT_SUPPORTED = (0x02) +NV0000_P2P_CAPS_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED = (0x03) +NV0000_P2P_CAPS_STATUS_DISABLED_BY_REGKEY = (0x04) +NV0000_P2P_CAPS_STATUS_NOT_SUPPORTED = (0x05) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS_V2 = (0x12b) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_V2_PARAMS_MESSAGE_ID = (0x2B) +NV0000_CTRL_CMD_SYSTEM_GET_P2P_CAPS_MATRIX = (0x13a) +NV0000_CTRL_SYSTEM_GET_P2P_CAPS_MATRIX_PARAMS_MESSAGE_ID = (0x3A) +NV0000_CTRL_CMD_SYSTEM_GPS_CTRL = (0x12a) +NV0000_CTRL_SYSTEM_GPS_CTRL_PARAMS_MESSAGE_ID = (0x2A) +NV0000_CTRL_GPS_PSHARE_PARAMS_PSP_CURRENT_VERSION = (0x00010000) +NV0000_CTRL_GPS_CMD_TYPE_GET_THERM_LIMIT = (0x00000002) +NV0000_CTRL_GPS_INPUT_SENSOR_INDEX = (0x00000000) +NV0000_CTRL_GPS_RESULT_THERMAL_LIMIT = (0x00000000) +NV0000_CTRL_GPS_RESULT_MIN_LIMIT = (0x00000001) +NV0000_CTRL_GPS_RESULT_MAX_LIMIT = (0x00000002) +NV0000_CTRL_GPS_RESULT_LIMIT_SOURCE = (0x00000003) +NV0000_CTRL_GPS_CMD_TYPE_SET_THERM_LIMIT = (0x00000003) +NV0000_CTRL_GPS_INPUT_THERMAL_LIMIT = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_DOWN_N_DELTA = (0x00000004) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_DOWN_N_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_DOWN_N_DELTA = (0x00000005) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_DOWN_N_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_HOLD_DELTA = (0x00000006) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_HOLD_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_HOLD_DELTA = (0x00000007) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_HOLD_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_UP_DELTA = (0x00000008) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_UP_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_UP_DELTA = (0x00000009) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_UP_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000A) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_ENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000B) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_ENGAGE_DELTA = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000C) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000D) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_CTRL_STATUS = (0x00000016) +NV0000_CTRL_GPS_RESULT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_CTRL_STATUS = (0x00000017) +NV0000_CTRL_GPS_INPUT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_GET_UTIL_AVG_NUM = (0x00000018) +NV0000_CTRL_GPS_RESULT_CPU_SET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_SET_UTIL_AVG_NUM = (0x00000019) +NV0000_CTRL_GPS_INPUT_CPU_GET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_PERF_SENSOR = (0x0000001A) +NV0000_CTRL_GPS_INPUT_NEXT_EXPECTED_POLL = (0x00000001) +NV0000_CTRL_GPS_RESULT_PERF_SENSOR_VALUE = (0x00000000) +NV0000_CTRL_GPS_RESULT_PERF_SENSOR_AVAILABLE = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_CALL_ACPI = (0x0000001B) +NV0000_CTRL_GPS_INPUT_ACPI_CMD = (0x00000000) +NV0000_CTRL_GPS_INPUT_ACPI_PARAM_IN = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_RESULT_1 = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_RESULT_2 = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_STATUS = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_VERSION = (0x00000001) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSHAREPARAM_SZ = (0x00000002) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSS_SZ = (0x00000000) +NV0000_CTRL_GPS_OUTPUT_ACPI_PSS_COUNT = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_IGPU_TURBO = (0x0000001C) +NV0000_CTRL_GPS_INPUT_SET_IGPU_TURBO = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_PERIOD = (0x00000026) +NV0000_CTRL_GPS_INPUT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_PERIOD = (0x00000027) +NV0000_CTRL_GPS_RESULT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_NUDGE_FACTOR = (0x00000028) +NV0000_CTRL_GPS_INPUT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_NUDGE_FACTOR = (0x00000029) +NV0000_CTRL_GPS_RESULT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_THRESHOLD_SAMPLES = (0x0000002A) +NV0000_CTRL_GPS_INPUT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_THRESHOLD_SAMPLES = (0x0000002B) +NV0000_CTRL_GPS_RESULT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_TEMP_PERF_LIMITS = (0x0000002C) +NV0000_CTRL_GPS_INPUT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_GPS_INPUT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_GET_TEMP_PERF_LIMITS = (0x0000002D) +NV0000_CTRL_GPS_RESULT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_GPS_RESULT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_PM1_AVAILABLE = (0x0000002E) +NV0000_CTRL_GPS_INPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_PM1_AVAILABLE = (0x0000002F) +NV0000_CTRL_GPS_OUTPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS = (0x00000044) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL2 = (0x00000001) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_PACKAGE_LIMITS = (0x00000045) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_FREQ_LIMIT = (0x00000046) +NV0000_CTRL_GPS_CMD_TYPE_GET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_FREQ_LIMIT = (0x00000047) +NV0000_CTRL_GPS_CMD_TYPE_SET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM = (0x00000048) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM_INDEX = (0) +NV0000_CTRL_GPS_CMD_TYPE_GET_PPM_AVAILABLE_MASK = (1) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM = (0x00000049) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM_INDEX = (0) +NV0000_CTRL_GPS_CMD_TYPE_SET_PPM_INDEX_MAX = (2) +NV0000_CTRL_GPS_PPM_INDEX = (7, 0) +NV0000_CTRL_GPS_PPM_INDEX_MAXPERF = (0) +NV0000_CTRL_GPS_PPM_INDEX_BALANCED = (1) +NV0000_CTRL_GPS_PPM_INDEX_QUIET = (2) +NV0000_CTRL_GPS_PPM_INDEX_INVALID = (0xFF) +NV0000_CTRL_GPS_PPM_MASK = (15, 8) +NV0000_CTRL_GPS_PPM_MASK_INVALID = (0) +NV0000_CTRL_GPS_CMD_PS_STATUS_OFF = (0) +NV0000_CTRL_GPS_CMD_PS_STATUS_ON = (1) +GPS_MAX_COUNTERS_PER_BLOCK = 32 +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSOR_COUNTERS_PARAMS_MESSAGE_ID = (0x29) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_PERF_SENSORS = (0x12c) +NV0000_CTRL_SYSTEM_GPS_GET_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x2C) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS = (0x12e) +NV0000_CTRL_SYSTEM_GPS_GET_EXTENDED_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x2E) +GPS_MAX_ACPI_OUTPUT_BUFFER_SIZE = 288 +NV0000_CTRL_SYSTEM_GPS_CALL_ACPI_PARAMS_MESSAGE_ID = (0x2D) +NV0000_CTRL_CMD_SYSTEM_GPS_CALL_ACPI = (0x12d) +NV0000_CTRL_SYSTEM_PARAM_TGPU = (0x00000000) +NV0000_CTRL_SYSTEM_PARAM_PDTS = (0x00000001) +NV0000_CTRL_SYSTEM_PARAM_SFAN = (0x00000002) +NV0000_CTRL_SYSTEM_PARAM_SKNT = (0x00000003) +NV0000_CTRL_SYSTEM_PARAM_CPUE = (0x00000004) +NV0000_CTRL_SYSTEM_PARAM_TMP1 = (0x00000005) +NV0000_CTRL_SYSTEM_PARAM_TMP2 = (0x00000006) +NV0000_CTRL_SYSTEM_PARAM_CTGP = (0x00000007) +NV0000_CTRL_SYSTEM_PARAM_PPMD = (0x00000008) +NV0000_CTRL_SYSTEM_PARAM_COUNT = (0x00000009) +NV0000_CTRL_CMD_SYSTEM_EXECUTE_ACPI_METHOD = (0x130) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_PARAMS_MESSAGE_ID = (0x30) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_NVOP_OPTIMUSCAPS = (0x00000000) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_NVOP_OPTIMUSFLAG = (0x00000001) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_JT_CAPS = (0x00000002) +NV0000_CTRL_SYSTEM_EXECUTE_ACPI_METHOD_DSM_JT_PLATPOLICY = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_ENABLE_ETW_EVENTS = (0x131) +NV0000_CTRL_SYSTEM_ENABLE_ETW_EVENTS_PARAMS_MESSAGE_ID = (0x31) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_ALL = (0x00000001) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NOFREQ = (0x00000002) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_FLUSH = (0x00000004) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PERF = (0x00000010) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_ELPG = (0x00000020) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NVDPS = (0x00000040) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_POWER = (0x00000080) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_DISP = (0x00000100) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_RMAPI = (0x00000200) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_INTR = (0x00000400) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_LOCK = (0x00000800) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_RCJOURNAL = (0x00001000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_GENERIC = (0x00002000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_THERM = (0x00004000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_GPS = (0x00008000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PCIE = (0x00010000) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_NVTELEMETRY = (0x00020000) +NV0000_CTRL_CMD_SYSTEM_GPS_GET_FRM_DATA = (0x12f) +NV0000_CTRL_SYSTEM_GPS_FRM_DATA_SAMPLE_SIZE = 64 +NV0000_CTRL_SYSTEM_GPS_GET_FRM_DATA_PARAMS_MESSAGE_ID = (0x2F) +NV0000_CTRL_CMD_SYSTEM_GPS_SET_FRM_DATA = (0x132) +NV0000_CTRL_SYSTEM_GPS_SET_FRM_DATA_PARAMS_MESSAGE_ID = (0x32) +NV0000_CTRL_CMD_SYSTEM_GET_VGX_SYSTEM_INFO_BUFFER_SIZE = 256 +NV0000_CTRL_CMD_SYSTEM_GET_VGX_SYSTEM_INFO = (0x133) +NV0000_CTRL_SYSTEM_GET_VGX_SYSTEM_INFO_PARAMS_MESSAGE_ID = (0x33) +NV0000_CTRL_CMD_SYSTEM_GET_GPUS_POWER_STATUS = (0x134) +NV0000_CTRL_SYSTEM_GET_GPUS_POWER_STATUS_PARAMS_MESSAGE_ID = (0x34) +NV0000_CTRL_SYSTEM_GPU_EXTERNAL_POWER_STATUS_CONNECTED = 0 +NV0000_CTRL_SYSTEM_GPU_EXTERNAL_POWER_STATUS_NOT_CONNECTED = 1 +NV0000_CTRL_CMD_SYSTEM_GET_PRIVILEGED_STATUS = (0x135) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PARAMS_MESSAGE_ID = (0x35) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PRIV_USER_FLAG = (0x00000001) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_KERNEL_HANDLE_FLAG = (0x00000002) +NV0000_CTRL_SYSTEM_GET_PRIVILEGED_STATUS_PRIV_HANDLE_FLAG = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_GET_FABRIC_STATUS = (0x136) +NV0000_CTRL_SYSTEM_GET_FABRIC_STATUS_PARAMS_MESSAGE_ID = (0x36) +NV0000_CTRL_VGPU_GET_VGPU_VERSION = (0x137) +NV0000_CTRL_VGPU_GET_VGPU_VERSION_PARAMS_MESSAGE_ID = (0x37) +NV0000_CTRL_VGPU_SET_VGPU_VERSION = (0x138) +NV0000_CTRL_VGPU_SET_VGPU_VERSION_PARAMS_MESSAGE_ID = (0x38) +NV0000_CTRL_CMD_SYSTEM_GET_RM_INSTANCE_ID = (0x139) +NV0000_CTRL_SYSTEM_GET_RM_INSTANCE_ID_PARAMS_MESSAGE_ID = (0x39) +NV0000_CTRL_CMD_SYSTEM_NVPCF_GET_POWER_MODE_INFO = (0x13b) +NVPCF_CTRL_SYSPWRLIMIT_TYPE_BASE = 1 +NV0000_CTRL_SYSTEM_POWER_INFO_INDEX_MAX_SIZE = 32 +NV0000_CTRL_CMD_SYSTEM_GET_SYSTEM_POWER_LIMIT_MESSAGE_ID = (0x48) +NV0000_CTRL_SYSTEM_NVPCF_GET_POWER_MODE_INFO_PARAMS_MESSAGE_ID = (0x3B) +CONTROLLER_FILTER_TYPE_EMWA = 0 +CONTROLLER_FILTER_TYPE_MOVING_MAX = 1 +NVPCF0100_CTRL_CONFIG_DSM_1X_FUNC_GET_SUPPORTED_CASE = 0 +NVPCF0100_CTRL_CONFIG_DSM_1X_FUNC_GET_DYNAMIC_CASE = 1 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_SUPPORTED_CASE = 2 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DYNAMIC_CASE = 3 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_STATIC_CASE = 4 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DC_SYSTEM_POWER_LIMITS_CASE = 5 +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_CPU_TDP_LIMIT_CONTROL_CASE = 6 +NVPCF0100_CTRL_CONFIG_DSM_1X_FUNC_GET_SUPPORTED = (0x00000000) +NVPCF0100_CTRL_CONFIG_DSM_1X_FUNC_GET_DYNAMIC_PARAMS = (0x00000002) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED = (0, 0) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED_YES = 1 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_SUPPORTED_IS_SUPPORTED_NO = 0 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_DC_SYSTEM_POWER_LIMITS_IS_SUPPORTED = (8, 8) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_DC_SYSTEM_POWER_LIMITS_IS_SUPPORTED_YES = 1 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_GET_DC_SYSTEM_POWER_LIMITS_IS_SUPPORTED_NO = 0 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_CPU_TDP_LIMIT_CONTROL_IS_SUPPORTED = (9, 9) +NVPCF0100_CTRL_CONFIG_DSM_FUNC_CPU_TDP_LIMIT_CONTROL_IS_SUPPORTED_YES = 1 +NVPCF0100_CTRL_CONFIG_DSM_FUNC_CPU_TDP_LIMIT_CONTROL_IS_SUPPORTED_NO = 0 +NVPCF0100_CTRL_CONFIG_DSM_2X_VERSION = (0x00000200) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_SUPPORTED = (0x00000000) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_STATIC_CONFIG_TABLES = (0x00000001) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DYNAMIC_PARAMS = (0x00000002) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_GET_DC_SYSTEM_POWER_LIMITS_TABLE = (0x00000008) +NVPCF0100_CTRL_CONFIG_DSM_2X_FUNC_CPU_TDP_LIMIT_CONTROL = (0x00000009) +NVPCF0100_CTRL_CONFIG_2X_BUFF_SIZE_MAX = (255) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT = (0x13c) +NV0000_CTRL_CMD_SYSTEM_SYNC_EXTERNAL_FABRIC_MGMT_PARAMS_MESSAGE_ID = (0x3C) +NV0000_CTRL_CMD_SYSTEM_GET_CLIENT_DATABASE_INFO = (0x13d) +NV0000_CTRL_SYSTEM_GET_CLIENT_DATABASE_INFO_PARAMS_MESSAGE_ID = (0x3D) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_MAX_STRING_SIZE = 256 +NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION_V2 = (0x13e) +NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS_MESSAGE_ID = (0x3E) +NV0000_CTRL_CMD_SYSTEM_RMCTRL_CACHE_MODE_CTRL = (0x13f) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_PARAMS_MESSAGE_ID = (0x3F) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_CMD_GET = (0x00000000) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_CMD_SET = (0x00000001) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_DISABLE = (0x00000000) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_ENABLE = (0x00000001) +NV0000_CTRL_SYSTEM_RMCTRL_CACHE_MODE_CTRL_MODE_VERIFY_ONLY = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CONTROL = (0x140) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CONTROL_PARAMS_MESSAGE_ID = (0x40) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_INIT = (0x0000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_EXEC = (0x0001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_EXEC = (0x0002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_ACTIONS = (0x0003) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_ACTIONS = (0x0004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_LOGIC = (0x0005) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_LOGIC = (0x0006) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_PREFERENCE = (0x0007) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_PREFERENCE = (0x0008) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_GPU2CPU_LIMIT = (0x0009) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_GPU2CPU_LIMIT = (0x000A) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_SET_PMU_PFM_REQ_HNDLR_STATE = (0x000B) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_GET_PMU_PFM_REQ_HNDLR_STATE = (0x000C) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_MAX_POWER = (0x0100) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_MAX_POWER = (0x0101) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_COOLING_BUDGET = (0x0102) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_COOLING_BUDGET = (0x0103) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_INTEGRAL_PERIOD = (0x0104) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_INTEGRAL_PERIOD = (0x0105) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_RULESET = (0x0106) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_RULESET = (0x0107) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_RULE_COUNT = (0x0108) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_APP_BOOST = (0x0109) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_APP_BOOST = (0x010A) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_SET_PWR_SUPPLY_MODE = (0x010B) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_PWR_SUPPLY_MODE = (0x010C) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_VCT_SUPPORT_INFO = (0x010D) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_GET_SUPPORTED_FUNCTIONS = (0x010E) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER = (0x0200) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_DELTA = (0x0201) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_FUTURE = (0x0202) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_LTMAVG = (0x0203) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_INTEGRAL = (0x0204) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_BURDEN = (0x0205) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_INTERMEDIATE = (0x0206) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_SENSOR_PARAMETERS = (0x0210) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP = (0x0220) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP_DELTA = (0x0221) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_TEMP_FUTURE = (0x0222) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE = (0x0240) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_CAP = (0x0241) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_MIN = (0x0242) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_MAX = (0x0243) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_ACTION = (0x0244) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_PSTATE_SLFM_PRESENT = (0x0245) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_SET_POWER_SIM_STATE = (0x0250) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_SIM_STATE = (0x0251) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_SET_POWER_SIM_DATA = (0x0252) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_GET_POWER_SIM_DATA = (0x0253) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_INIT_USING_SBIOS_AND_ACK = (0x0320) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_PING_SBIOS_FOR_EVENT = (0x0321) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_INVALID = (0xFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_SYSTEM = (0x0000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_CPU = lambda i: (0x0100+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_LOCALE_GPU = lambda i: (0x0200+((i)%0x100)) # type: ignore +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INVALID = (0x80000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INIT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_INIT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_EXEC_STOP = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_EXEC_START = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_ACTIONS_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_ACTIONS_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_FUZZY = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_LOGIC_DETERMINISTIC = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_CPU = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_GPU = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PREFERENCE_BOTH = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_NO_MAP_OVERRIDE = (0xFFFFFFFF) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PMU_PFM_REQ_HNDLR_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CMD_DEF_PMU_PFM_REQ_HNDLR_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_REAL = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_FAKE_AC = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_PWR_SUPPLY_FAKE_BATT = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SUPPORT = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_VENTURASTATUS = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_GETPSS = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SETPPC = (0x00000008) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_GETPPC = (0x00000010) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_VENTURACB = (0x00000020) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SYS_DEF_FUNC_SYSPARAMS = (0x00000040) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DEC_TO_P0 = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DEC_BY_1 = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_DO_NOTHING = (0x00000002) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_SET_CURRENT = (0x00000003) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_BY_1 = (0x00000004) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_BY_2 = (0x00000005) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_TO_LFM = (0x00000006) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_ACTION_INC_TO_SLFM = (0x00000007) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_SLFM_PRESENT_NO = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_SLFM_PRESENT_YES = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_POWER_SIM_STATE_OFF = (0x00000000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_DATA_DEF_POWER_SIM_STATE_ON = (0x00000001) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL = (0x141) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_BATCH_COMMAND_MAX = (16) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_BATCH_CONTROL_PARAMS_MESSAGE_ID = (0x41) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CTRL = (0x142) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CTRL_PARAMS_MESSAGE_ID = (0x42) +NV0000_CTRL_PFM_REQ_HNDLR_PSHARE_PARAMS_PSP_CURRENT_VERSION = (0x00010000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_THERM_LIMIT = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_SENSOR_INDEX = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_THERMAL_LIMIT = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_MIN_LIMIT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_MAX_LIMIT = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_LIMIT_SOURCE = (0x00000003) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_THERM_LIMIT = (0x00000003) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_THERMAL_LIMIT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_DOWN_N_DELTA = (0x00000004) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_DOWN_N_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_DOWN_N_DELTA = (0x00000005) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_DOWN_N_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_HOLD_DELTA = (0x00000006) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_HOLD_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_HOLD_DELTA = (0x00000007) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_HOLD_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_UP_DELTA = (0x00000008) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_UP_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_UP_DELTA = (0x00000009) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_UP_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000A) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_ENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_ENGAGE_DELTA = (0x0000000B) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_ENGAGE_DELTA = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000C) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_DISENGAGE_DELTA = (0x0000000D) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_DISENGAGE_DELTA = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_CTRL_STATUS = (0x00000016) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_CTRL_STATUS = (0x00000017) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_CTRL_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_GET_UTIL_AVG_NUM = (0x00000018) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_CPU_SET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_SET_UTIL_AVG_NUM = (0x00000019) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_CPU_GET_UTIL_AVG_NUM = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PERF_SENSOR = (0x0000001A) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_NEXT_EXPECTED_POLL = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_PERF_SENSOR_VALUE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_PERF_SENSOR_AVAILABLE = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_CALL_ACPI = (0x0000001B) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_ACPI_CMD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_ACPI_PARAM_IN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_RESULT_1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_RESULT_2 = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_STATUS = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_VERSION = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSHAREPARAM_SZ = (0x00000002) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSS_SZ = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_ACPI_PSS_COUNT = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_IGPU_TURBO = (0x0000001C) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_SET_IGPU_TURBO = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_PERIOD = (0x00000026) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_PERIOD = (0x00000027) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERIOD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_NUDGE_FACTOR = (0x00000028) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_NUDGE_FACTOR = (0x00000029) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_NUDGE_UP = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_NUDGE_DOWN = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_THRESHOLD_SAMPLES = (0x0000002A) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_THRESHOLD_SAMPLES = (0x0000002B) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_THRESHOLD_SAMPLE_HOLD = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_THRESHOLD_SAMPLE_STEP = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_TEMP_PERF_LIMITS = (0x0000002C) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_TEMP_PERF_LIMITS = (0x0000002D) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERF_LIMIT_UPPER = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_RESULT_TEMP_PERF_LIMIT_LOWER = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PM1_AVAILABLE = (0x0000002E) +NV0000_CTRL_PFM_REQ_HNDLR_INPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PM1_AVAILABLE = (0x0000002F) +NV0000_CTRL_PFM_REQ_HNDLR_OUTPUT_PM1_AVAILABLE = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS = (0x00000044) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_PACKAGE_LIMITS_PL2 = (0x00000001) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_PACKAGE_LIMITS = (0x00000045) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_PACKAGE_LIMITS_PL1 = (0x00000000) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_FREQ_LIMIT = (0x00000046) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_FREQ_LIMIT = (0x00000047) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_CPU_FREQ_LIMIT_MHZ = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM = (0x00000048) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM_INDEX = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_GET_PPM_AVAILABLE_MASK = (1) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM = (0x00000049) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM_INDEX = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_TYPE_SET_PPM_INDEX_MAX = (2) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX = (7, 0) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_MAXPERF = (0) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_BALANCED = (1) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_QUIET = (2) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_INDEX_INVALID = (0xFF) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_MASK = (15, 8) +NV0000_CTRL_PFM_REQ_HNDLR_PPM_MASK_INVALID = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_PS_STATUS_OFF = (0) +NV0000_CTRL_PFM_REQ_HNDLR_CMD_PS_STATUS_ON = (1) +PFM_REQ_HNDLR_MAX_COUNTERS_PER_BLOCK = 32 +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS = (0x146) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x46) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS = (0x147) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_EXTENDED_PERF_SENSORS_PARAMS_MESSAGE_ID = (0x47) +PFM_REQ_HNDLR_MAX_ACPI_OUTPUT_BUFFER_SIZE = 288 +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI_PARAMS_MESSAGE_ID = (0x43) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_CALL_ACPI = (0x143) +NV0000_CTRL_SYSTEM_RMTRACE_MODULE_PFM_REQ_HNDLR = (0x00008000) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA = (0x144) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_FRM_DATA_SAMPLE_SIZE = 64 +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_GET_FRM_DATA_PARAMS_MESSAGE_ID = (0x44) +NV0000_CTRL_CMD_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA = (0x145) +NV0000_CTRL_SYSTEM_PFM_REQ_HNDLR_SET_FRM_DATA_PARAMS_MESSAGE_ID = (0x45) +NV0000_CTRL_CMD_SYSTEM_READ_CPER = (0x149) +NV0000_CTRL_SYSTEM_READ_CPER_ACCESS_TYPE_GPU = (1) +READ_CPER_BUFFER_SIZE = 1024 +NV0000_CTRL_SYSTEM_READ_CPER_PARAMS_MESSAGE_ID = (0x49) +NV0000_CTRL_CMD_SYSTEM_SOC_SET_PERF_LIMITS = (0x150) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMIT_ID_TEST_PERF_LEVELS = (0) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMIT_ID_ISMODEPOSSIBLE = (1) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMIT_ID_MCLK_SWITCH = (2) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMIT_ID_MODS = (3) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMIT_BW_RESOURCE_PERF_LEVEL = (0) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMIT_BW_RESOURCE_DISPCLK = (1) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMIT_BW_RESOURCE_HUBCLK = (2) +NV0000_CTRL_SYSTEM_SOC_PERF_MAX_LIMITS = (16) +NV0000_CTRL_SYSTEM_SOC_SET_PERF_LIMITS_PARAMS_MESSAGE_ID = (0x150) +NV0000_CTRL_CMD_OS_UNIX_FLUSH_USER_CACHE = (0x3d02) +NV0000_CTRL_OS_UNIX_FLUSH_USER_CACHE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_FLUSH = (0x00000001) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_INVALIDATE = (0x00000002) +NV0000_CTRL_OS_UNIX_FLAGS_USER_CACHE_FLUSH_INVALIDATE = (0x00000003) +NV0000_CTRL_CMD_OS_UNIX_GET_CONTROL_FILE_DESCRIPTOR = (0x3d04) +NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECT_TO_FD = (0x3d05) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD = (0, 0) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD_FALSE = (0x00000000) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECT_TO_FD_FLAGS_EMPTY_FD_TRUE = (0x00000001) +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_FROM_FD = (0x3d06) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECT_FROM_FD_PARAMS_MESSAGE_ID = (0x6) +NV0000_CTRL_CMD_OS_GET_GPU_INFO = (0x3d07) +NV0000_CTRL_CMD_OS_UNIX_GET_EXPORT_OBJECT_INFO = (0x3d08) +NV0000_OS_UNIX_EXPORT_OBJECT_FD_BUFFER_SIZE = 64 +NV0000_CTRL_OS_UNIX_GET_EXPORT_OBJECT_INFO_PARAMS_MESSAGE_ID = (0x8) +NV0000_CTRL_CMD_OS_UNIX_REFRESH_RMAPI_DEVICE_LIST = (0x3d09) +NV0000_CTRL_CMD_OS_UNIX_CREATE_EXPORT_OBJECT_FD = (0x3d0a) +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_BUFFER_SIZE = NV0000_OS_UNIX_EXPORT_OBJECT_FD_BUFFER_SIZE +NV0000_CTRL_OS_UNIX_CREATE_EXPORT_OBJECT_FD_PARAMS_MESSAGE_ID = (0xA) +NV0000_CTRL_CMD_OS_UNIX_EXPORT_OBJECTS_TO_FD = (0x3d0b) +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_MAX_OBJECTS = 512 +NV0000_CTRL_OS_UNIX_EXPORT_OBJECTS_TO_FD_PARAMS_MESSAGE_ID = (0xB) +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECTS_FROM_FD = (0x3d0c) +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_TO_FD_MAX_OBJECTS = 128 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_NONE = 0 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_VIDMEM = 1 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_SYSMEM = 2 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_FABRIC = 3 +NV0000_CTRL_CMD_OS_UNIX_IMPORT_OBJECT_TYPE_FABRIC_MC = 4 +NV0000_CTRL_OS_UNIX_IMPORT_OBJECTS_FROM_FD_PARAMS_MESSAGE_ID = (0xC) +NV0000_CTRL_OS_UNIX_MEMACCT_SET_LIMITS_PARAMS_MESSAGE_ID = (0xD) +NV0000_CTRL_OS_UNIX_CMD_MEMACCT_SET_LIMITS = (0x3d0d) +NV0000_CTRL_OS_UNIX_MEMACCT_GET_LIMITS_PARAMS_MESSAGE_ID = (0xE) +NV0000_CTRL_OS_UNIX_CMD_MEMACCT_GET_LIMITS = (0x3d0e) +NV0000_BUSDEVICE_DOMAIN = (31, 16) +NV0000_BUSDEVICE_BUS = (15, 8) +NV0000_BUSDEVICE_DEVICE = (7, 0) +NV0000_CTRL_CMD_VGPU_CREATE_DEVICE = (0xc02) +NV0000_CTRL_VGPU_CREATE_DEVICE_PARAMS_MESSAGE_ID = (0x2) +NV0000_CTRL_CMD_VGPU_GET_INSTANCES = (0xc03) +NV0000_CTRL_VGPU_GET_INSTANCES_PARAMS_MESSAGE_ID = (0x3) +NV0000_CTRL_CMD_VGPU_DELETE_DEVICE = (0xc04) +NV0000_CTRL_VGPU_DELETE_DEVICE_PARAMS_MESSAGE_ID = (0x4) +NV0000_CTRL_CMD_VGPU_VFIO_NOTIFY_RM_STATUS = (0xc05) +NV0000_CTRL_VGPU_VFIO_NOTIFY_RM_STATUS_PARAMS_MESSAGE_ID = (0x5) +NV0000_CTRL_CMD_GPU_UPDATE_SYSFS_NODE = (0x206) +NV0000_CTRL_GPU_UPDATE_SYSFS_NODE_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_RESERVED = (0x00) +NV0080_CTRL_BIF = (0x01) +NV0080_CTRL_GPU = (0x02) +NV0080_CTRL_CLK = (0x10) +NV0080_CTRL_GR = (0x11) +NV0080_CTRL_CIPHER = (0x12) +NV0080_CTRL_FB = (0x13) +NV0080_CTRL_HOST = (0x14) +NV0080_CTRL_VIDEO = (0x15) +NV0080_CTRL_FIFO = (0x17) +NV0080_CTRL_DMA = (0x18) +NV0080_CTRL_PERF = (0x19) +NV0080_CTRL_PERF_LEGACY_NON_PRIVILEGED = (0x99) +NV0080_CTRL_NVENC = (0x1B) +NV0080_CTRL_NVDEC = (0x1C) +NV0080_CTRL_RC = (0x1D) +NV0080_CTRL_OS_UNIX = (0x1E) +NV0080_CTRL_NVJPG = (0x1F) +NV0080_CTRL_INTERNAL = (0x20) +NV0080_CTRL_NVLINK = (0x21) +NV0080_CTRL_CMD_NULL = (0x800000) +NV0080_CTRL_CMD_BIF_RESET = (0x800102) +NV0080_CTRL_BIF_RESET_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_BIF_RESET_FLAGS_TYPE = (4, 0) +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_SW_RESET = 0x1 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_SBR = 0x2 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_FUNDAMENTAL = 0x3 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BOOT_DEVICE_FUSE = 0x4 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BOOT_DEVICE = 0x5 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_PEX = 0x6 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_OOBHUB_TRIGGER = 0x7 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_BASE = 0x8 +NV0080_CTRL_BIF_RESET_FLAGS_TYPE_CXL_RESET = 0x9 +NV0080_CTRL_CMD_BIF_ASPM_CYA_UPDATE = (0x800105) +NV0080_CTRL_BIF_ASPM_CYA_UPDATE_PARAMS_MESSAGE_ID = (0x5) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK = (0x800106) +NV0080_CTRL_CMD_BIF_GET_PCIE_POWER_CONTROL_MASK_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID = (0, 0) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_VALID_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED = (2, 1) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ENCRYPTED_NOT_SUPPORTED = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE = (6, 3) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_PEER_MEMORY = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_SYSTEM_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_APERTURE_SYSTEM_NON_COHERENT_MEMORY = (0x00000003) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS = (10, 7) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_NONE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_1 = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_2 = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_COMPTAGS_4 = (0x00000004) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED = (12, 11) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_GPU_CACHED_NOT_SUPPORTED = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS = (14, 13) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_READ_WRITE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_READ_ONLY = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_WRITE_ONLY = (0x00000002) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_SHADER_ACCESS_NOT_SUPPORTED = (0x00000003) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY = (15, 15) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_READ_ONLY_TRUE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC = (16, 16) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC_DISABLE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ATOMIC_ENABLE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING = (17, 17) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING_DISABLE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_ACCESS_COUNTING_ENABLE = (0x00000001) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED = (18, 18) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED_FALSE = (0x00000000) +NV0080_CTRL_DMA_PTE_INFO_PARAMS_FLAGS_PRIVILEGED_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_GET_PTE_INFO = (0x801801) +NV0080_CTRL_DMA_GET_PTE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_GET_PTE_INFO_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_CMD_DMA_SET_PTE_INFO = (0x80180a) +NV0080_CTRL_DMA_SET_PTE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_SET_PTE_INFO_PARAMS_MESSAGE_ID = (0xA) +NV0080_CTRL_CMD_DMA_FILL_PTE_MEM = (0x801802) +NV0080_CTRL_DMA_FILL_PTE_MEM_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_DMA_FLUSH = (0x801805) +NV0080_CTRL_DMA_FLUSH_PARAMS_MESSAGE_ID = (0x5) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2 = (0, 0) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG = (1, 1) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_COMPTAG_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB = (2, 2) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB_DISABLE = (0x00000000) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_FB_ENABLE = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE = (4, 3) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE_SYSMEM = (0x00000001) +NV0080_CTRL_DMA_FLUSH_TARGET_UNIT_L2_INVALIDATE_PEERMEM = (0x00000002) +NV0080_CTRL_CMD_DMA_ADV_SCHED_GET_VA_CAPS = (0x801806) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_MAX_NUM_PAGE_TABLE_FORMATS = (16) +NV0080_CTRL_DMA_ADV_SCHED_GET_VA_CAPS_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_CMD_DMA_ADV_SCHED_GET_VA_CAPS_WITH_VA_RANGE_LO = 0x1 +NV0080_CTRL_CMD_DMA_GET_PDE_INFO = (0x801809) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_SYSTEM_COHERENT_MEMORY = (0x00000001) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PTE_ADDR_SPACE_SYSTEM_NON_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_PDE_INFO_PTE_BLOCKS = 5 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_VIDEO_MEMORY = (0x00000000) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_SYSTEM_COHERENT_MEMORY = (0x00000001) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_ADDR_SPACE_SYSTEM_NON_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_FULL = 1 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_HALF = 2 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_QUARTER = 3 +NV0080_CTRL_DMA_GET_PDE_INFO_PARAMS_PDE_SIZE_EIGHTH = 4 +NV0080_CTRL_CMD_DMA_INVALIDATE_TLB = (0x80180c) +NV0080_CTRL_DMA_INVALIDATE_TLB_PARAMS_MESSAGE_ID = (0xC) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL = (0, 0) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL_FALSE = (0x00000000) +NV0080_CTRL_DMA_INVALIDATE_TLB_ALL_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_GET_CAPS = (0x80180d) +NV0080_CTRL_DMA_CAPS_TBL_SIZE = 8 +NV0080_CTRL_DMA_GET_CAPS_PARAMS_MESSAGE_ID = (0xD) +NV0080_CTRL_CMD_DMA_SET_VA_SPACE_SIZE = (0x80180e) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_PARAMS_MESSAGE_ID = (0xE) +NV0080_CTRL_DMA_SET_VA_SPACE_SIZE_MAX = (0xFFFFFFFFFFFFFFFF) +NV0080_CTRL_CMD_DMA_UPDATE_PDE_2 = (0x80180f) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_INVALID = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_VIDEO_MEMORY = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_SYSTEM_COHERENT_MEMORY = (0x00000002) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_APERTURE_SYSTEM_NON_COHERENT_MEMORY = (0x00000003) +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX_SMALL = 0 +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX_BIG = 1 +NV0080_CTRL_DMA_UPDATE_PDE_2_PT_IDX__SIZE = 2 +NV0080_CTRL_DMA_UPDATE_PDE_2_PARAMS_MESSAGE_ID = (0xF) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE = (0, 0) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FLUSH_PDE_CACHE_TRUE = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE = (1, 1) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_FORCE_OVERRIDE_TRUE = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE = (3, 2) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_FULL = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_HALF = (0x00000001) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_QUARTER = (0x00000002) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_PDE_SIZE_EIGHTH = (0x00000003) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE = (4, 4) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE_FALSE = (0x00000000) +NV0080_CTRL_DMA_UPDATE_PDE_2_FLAGS_SPARSE_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE = (0x801812) +NV0080_CTRL_DMA_SET_DEFAULT_VASPACE_PARAMS_MESSAGE_ID = (0x12) +NV0080_CTRL_CMD_DMA_SET_PAGE_DIRECTORY = (0x801813) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_MESSAGE_ID = (0x13) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE = (1, 0) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_VIDMEM = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_SYSMEM_COH = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_APERTURE_SYSMEM_NONCOH = (0x00000002) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES = (2, 2) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_PRESERVE_PDES_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS = (3, 3) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_ALL_CHANNELS_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY = (4, 4) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_IGNORE_CHANNEL_BUSY_TRUE = (0x00000001) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE = (5, 5) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE_FALSE = (0x00000000) +NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_FLAGS_EXTEND_VASPACE_TRUE = (0x00000001) +NV0080_CTRL_CMD_DMA_UNSET_PAGE_DIRECTORY = (0x801814) +NV0080_CTRL_DMA_UNSET_PAGE_DIRECTORY_PARAMS_MESSAGE_ID = (0x14) +NV0080_CTRL_CMD_FB_GET_CAPS = (0x801301) +NV0080_CTRL_FB_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_FB_CAPS_TBL_SIZE = 3 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO = (0x801306) +NV0080_CTRL_FB_GET_COMPBIT_STORE_INFO_PARAMS_MESSAGE_ID = (0x6) +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_UNKNOWN = 0 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_SYSMEM = 1 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_ADDRESS_SPACE_FBMEM = 2 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_LEGACY = 0 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_1TO1 = 1 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_1TO4 = 2 +NV0080_CTRL_CMD_FB_GET_COMPBIT_STORE_INFO_POLICY_RAWMODE = 3 +NV0080_CTRL_CMD_FB_GET_CAPS_V2 = (0x801307) +NV0080_CTRL_FB_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_CMD_FB_SET_DEFAULT_VIDMEM_PHYSICALITY = (0x801308) +NV0080_CTRL_FB_SET_DEFAULT_VIDMEM_PHYSICALITY_PARAMS_MESSAGE_ID = (0x8) +NV0080_CTRL_CMD_FIFO_GET_CAPS = (0x801701) +NV0080_CTRL_FIFO_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_FIFO_CAPS_TBL_SIZE = 2 +NV0080_CTRL_CMD_FIFO_GET_ENGINE_CONTEXT_PROPERTIES = (0x801707) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID = (4, 0) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS = (0x00000000) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_VLD = (0x00000001) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_VIDEO = (0x00000002) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_MPEG = (0x00000003) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_CAPTURE = (0x00000004) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_DISPLAY = (0x00000005) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_ENCRYPTION = (0x00000006) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_POSTPROCESS = (0x00000007) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_ZCULL = (0x00000008) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PM = (0x00000009) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COMPUTE_PREEMPT = (0x0000000a) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PREEMPT = (0x0000000b) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_SPILL = (0x0000000c) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PAGEPOOL = (0x0000000d) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_BETACB = (0x0000000e) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_RTV = (0x0000000f) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PATCH = (0x00000010) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_BUNDLE_CB = (0x00000011) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PAGEPOOL_GLOBAL = (0x00000012) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_ATTRIBUTE_CB = (0x00000013) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_RTV_CB_GLOBAL = (0x00000014) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_GFXP_POOL = (0x00000015) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_GFXP_CTRL_BLK = (0x00000016) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_FECS_EVENT = (0x00000017) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PRIV_ACCESS_MAP = (0x00000018) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_SETUP = (0x00000019) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COUNT = (0x0000001a) +NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_CMD_FIFO_GET_CHANNELLIST = (0x80170d) +NV0080_CTRL_FIFO_GET_CHANNELLIST_PARAMS_MESSAGE_ID = (0xD) +NV0080_CTRL_CMD_FIFO_GET_LATENCY_BUFFER_SIZE = (0x80170e) +NV0080_CTRL_FIFO_GET_LATENCY_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0xE) +NV0080_CTRL_FIFO_GET_CHANNELLIST_INVALID_CHANNEL = (0xffffffff) +NV0080_CTRL_CMD_FIFO_SET_CHANNEL_PROPERTIES = (0x80170f) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_PARAMS_MESSAGE_ID = (0xF) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_INVALIDATE_PDB_TARGET = (0x00000004) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_RESETENGINECONTEXT = (0x00000005) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_NOOP = (0x00000007) +NV0080_CTRL_FIFO_SET_CHANNEL_PROPERTIES_RESETENGINECONTEXT_NOPREEMPT = (0x00000008) +NV0080_CTRL_CMD_FIFO_STOP_RUNLIST = (0x801711) +NV0080_CTRL_FIFO_STOP_RUNLIST_PARAMS_MESSAGE_ID = (0x11) +NV0080_CTRL_CMD_FIFO_START_RUNLIST = (0x801712) +NV0080_CTRL_FIFO_START_RUNLIST_PARAMS_MESSAGE_ID = (0x12) +NV0080_CTRL_CMD_FIFO_GET_CAPS_V2 = (0x801713) +NV0080_CTRL_FIFO_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x13) +NV0080_CTRL_CMD_FIFO_IDLE_CHANNELS = (0x801714) +NV0080_CTRL_CMD_FIFO_IDLE_CHANNELS_MAX_CHANNELS = 4096 +NV0080_CTRL_FIFO_IDLE_CHANNELS_PARAMS_MESSAGE_ID = (0x14) +NV0080_CTRL_CMD_GPU_GET_CLASSLIST = (0x800201) +NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_CMD_GPU_GET_NUM_SUBDEVICES = (0x800280) +NV0080_CTRL_GPU_GET_NUM_SUBDEVICES_PARAMS_MESSAGE_ID = (0x80) +NV0080_CTRL_CMD_GPU_GET_VIDLINK_ORDER = (0x800281) +NV0080_CTRL_GPU_GET_VIDLINK_ORDER_PARAMS_MESSAGE_ID = (0x81) +NV0080_CTRL_CMD_GPU_SET_DISPLAY_OWNER = (0x800282) +NV0080_CTRL_GPU_SET_DISPLAY_OWNER_PARAMS_MESSAGE_ID = (0x82) +NV0080_CTRL_CMD_GPU_GET_DISPLAY_OWNER = (0x800283) +NV0080_CTRL_GPU_GET_DISPLAY_OWNER_PARAMS_MESSAGE_ID = (0x83) +NV0080_CTRL_CMD_GPU_SET_VIDLINK = (0x800285) +NV0080_CTRL_GPU_SET_VIDLINK_PARAMS_MESSAGE_ID = (0x85) +NV0080_CTRL_GPU_SET_VIDLINK_ENABLE_FALSE = (0x00000000) +NV0080_CTRL_GPU_SET_VIDLINK_ENABLE_TRUE = (0x00000001) +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_GET_STATUS = 0 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_POWERDOWN = 1 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_POWERUP = 2 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWER_ON = 0 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWERING_DOWN = 1 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_GATED = 2 +NV0080_CTRL_CMD_GPU_VIDEO_POWERGATE_STATUS_POWERING_UP = 3 +NV0080_CTRL_CMD_GPU_MODIFY_SW_STATE_PERSISTENCE = (0x800287) +NV0080_CTRL_GPU_SW_STATE_PERSISTENCE_ENABLED = (0x00000000) +NV0080_CTRL_GPU_SW_STATE_PERSISTENCE_DISABLED = (0x00000001) +NV0080_CTRL_GPU_MODIFY_SW_STATE_PERSISTENCE_PARAMS_MESSAGE_ID = (0x87) +NV0080_CTRL_CMD_GPU_QUERY_SW_STATE_PERSISTENCE = (0x800288) +NV0080_CTRL_GPU_QUERY_SW_STATE_PERSISTENCE_PARAMS_MESSAGE_ID = (0x88) +NV0080_CTRL_CMD_GPU_GET_VIRTUALIZATION_MODE = (0x800289) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_NONE = (0x00000000) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_NMOS = (0x00000001) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_VGX = (0x00000002) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST = (0x00000003) +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST_VGPU = NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST +NV0080_CTRL_GPU_VIRTUALIZATION_MODE_HOST_VSGA = (0x00000004) +NV0080_CTRL_GPU_GET_VIRTUALIZATION_MODE_PARAMS_MESSAGE_ID = (0x89) +NV0080_CTRL_CMD_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE = (0x80028c) +NV0080_CTRL_GPU_GET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS_MESSAGE_ID = (0x8C) +NV0080_CTRL_CMD_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE = (0x80028d) +NV0080_CTRL_GPU_SET_SPARSE_TEXTURE_COMPUTE_MODE_PARAMS_MESSAGE_ID = (0x8D) +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_DEFAULT = 0 +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_OPTIMIZE_COMPUTE = 1 +NV0080_CTRL_GPU_SPARSE_TEXTURE_COMPUTE_MODE_OPTIMIZE_SPARSE_TEXTURE = 2 +NV0080_CTRL_CMD_GPU_GET_VGX_CAPS = (0x80028e) +NV0080_CTRL_GPU_GET_VGX_CAPS_PARAMS_MESSAGE_ID = (0x8E) +NV0080_CTRL_CMD_GPU_GET_SRIOV_CAPS = (0x800291) +NV0080_CTRL_GPU_GET_SRIOV_CAPS_PARAMS_MESSAGE_ID = (0x91) +NV0080_CTRL_GPU_CLASSLIST_MAX_SIZE = 200 +NV0080_CTRL_CMD_GPU_GET_CLASSLIST_V2 = (0x800292) +NV0080_CTRL_GPU_GET_CLASSLIST_V2_PARAMS_MESSAGE_ID = (0x92) +NV0080_CTRL_CMD_GPU_FIND_SUBDEVICE_HANDLE = (0x800293) +NV0080_CTRL_GPU_FIND_SUBDEVICE_HANDLE_PARAM_MESSAGE_ID = (0x93) +NV0080_CTRL_GPU_GET_BRAND_CAPS_QUADRO = NVBIT(0) +NV0080_CTRL_GPU_GET_BRAND_CAPS_NVS = NVBIT(1) +NV0080_CTRL_GPU_GET_BRAND_CAPS_TITAN = NVBIT(2) +NV0080_CTRL_CMD_GPU_GET_BRAND_CAPS = (0x800294) +NV0080_CTRL_GPU_GET_BRAND_CAPS_PARAMS_MESSAGE_ID = (0x94) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64M = (1 << 6) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_128M = (1 << 7) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256M = (1 << 8) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_512M = (1 << 9) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_1G = (1 << 10) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_2G = (1 << 11) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_4G = (1 << 12) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_8G = (1 << 13) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_16G = (1 << 14) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_32G = (1 << 15) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64G = (1 << 16) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_128G = (1 << 17) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256G = (1 << 18) +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_MIN = NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_64M +NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_MAX = NV0080_CTRL_GPU_VGPU_VF_BAR1_SIZE_256G +NV0080_CTRL_GPU_VGPU_NUM_VFS_INVALID = 0x0 +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE = (0x800296) +NV0080_CTRL_GPU_SET_VGPU_VF_BAR1_SIZE_PARAMS_MESSAGE_ID = (0x96) +NV0080_CTRL_CMD_GPU_SET_VGPU_HETEROGENEOUS_MODE = (0x800297) +NV0080_CTRL_GPU_SET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0x97) +NV0080_CTRL_CMD_GPU_GET_VGPU_HETEROGENEOUS_MODE = (0x800298) +NV0080_CTRL_GPU_GET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0x98) +NV0080_CTRL_CMD_GR_GET_CAPS = (0x801102) +NV0080_CTRL_GR_GET_CAPS_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_GR_CAPS_TBL_SIZE = 23 +NV0080_CTRL_GR_INFO_INDEX_MAXCLIPS = (0x00000000) +NV0080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 = (0x00000001) +NV0080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK = (0x00000002) +NV0080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT = (0x00000003) +NV0080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT = (0x00000004) +NV0080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE = (0x00000005) +NV0080_CTRL_GR_INFO_INDEX_VPE_COUNT = (0x00000006) +NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT = (0x00000007) +NV0080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR = (0x00000008) +NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT = (0x00000009) +NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT = (0x0000000A) +NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT = (0x0000000B) +NV0080_CTRL_GR_INFO_INDEX_SM_VERSION = (0x0000000C) +NV0080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM = (0x0000000D) +NV0080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP = (0x0000000E) +NV0080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES = (0x0000000F) +NV0080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES = (0x00000010) +NV0080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY = (0x00000011) +NV0080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY = (0x00000012) +NV0080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM = (0x00000013) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS = (0x00000014) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS = (0x00000015) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS = (0x00000016) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC = (0x00000017) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS = (0x00000018) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS = (0x00000019) +NV0080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED = (0x0000001A) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS = (0x0000001B) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC = (0x0000001C) +NV0080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT = (0x0000001D) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES = (0x0000001E) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS = (0x0000001F) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC = (0x00000020) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS = (0x00000021) +NV0080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT = (0x00000022) +NV0080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT = (0x00000023) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS = (0x00000024) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS = (0x00000025) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES = (0x00000026) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC = (0x00000027) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP = (0x00000028) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC = (0x00000029) +NV0080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC = (0x0000002A) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP = (0x0000002B) +NV0080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT = (0x0000002C) +NV0080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT = (0x0000002D) +NV0080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT = (0x0000002E) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC = (0x00000032) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES = (0x00000033) +NV0080_CTRL_GR_INFO_INDEX_RESERVED = (0x00000033) +NV0080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES = (0x00000034) +NV0080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES = (0x00000035) +NV0080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS = (0x00000036) +NV0080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG = (0x00000037) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET = (0x00000038) +NV0080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET = (0x00000039) +NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_CPC_PER_GPC = (0x0000003A) +NV0080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_NVLINK_MASK = (0x0000003B) +NV0080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_C2C_MASK = (0x0000003C) +NV0080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_PCIE_MASK = (0x0000003D) +NV0080_CTRL_GR_INFO_INDEX_RESERVED1 = (0x0000003E) +NV0080_CTRL_GR_INFO_INDEX_MAX = (0x0000003E) +NV0080_CTRL_GR_INFO_MAX_SIZE = (0x3f) +NV0080_CTRL_CMD_GR_GET_INFO = (0x801104) +NV0080_CTRL_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x4) +NV0080_CTRL_CMD_GR_GET_TPC_PARTITION_MODE = (0x801107) +NV0080_CTRL_CMD_GR_SET_TPC_PARTITION_MODE = (0x801108) +NV0080_CTRL_GR_GET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x8) +NV0080_CTRL_CMD_GR_GET_CAPS_V2 = (0x801109) +NV0080_CTRL_GR_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_CMD_GR_GET_INFO_V2 = (0x801110) +NV0080_CTRL_GR_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x10) +NV0080_CTRL_CMD_HOST_GET_CAPS = (0x801401) +NV0080_CTRL_HOST_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_HOST_CAPS_TBL_SIZE = 3 +NV0080_CTRL_CMD_HOST_GET_CAPS_V2 = (0x801402) +NV0080_CTRL_HOST_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE = (0x802002) +NV0080_CTRL_CMD_INTERNAL_GR_GET_TPC_PARTITION_MODE_FINN_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE = (0x802003) +NV0080_CTRL_CMD_INTERNAL_GR_SET_TPC_PARTITION_MODE_FINN_PARAMS_MESSAGE_ID = (0x3) +NV0080_CTRL_CMD_INTERNAL_PERF_CUDA_LIMIT_SET_CONTROL = (0x802009) +NV0080_CTRL_CMD_INTERNAL_PERF_CUDA_LIMIT_DISABLE = (0x802004) +NV0080_CTRL_CMD_INTERNAL_PERF_SLI_GPU_BOOST_SYNC_SET_CONTROL = (0x802007) +NV0080_CTRL_CMD_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS = (0x802008) +NV_FIFO_PERMANENTLY_DISABLE_CHANNELS_MAX_CLIENTS = 200 +NV0080_CTRL_INTERNAL_FIFO_RC_AND_PERMANENTLY_DISABLE_CHANNELS_PARAMS_MESSAGE_ID = (0x08) +NV0080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED = (0x80200a) +NV0080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS_MESSAGE_ID = (0x0A) +NV0080_CTRL_INTERNAL_GR_INIT_BUG4208224_WAR_PARAMS_MESSAGE_ID = (0x45) +NV0080_CTRL_CMD_INTERNAL_KGR_INIT_BUG4208224_WAR = (0x802046) +NV0080_CTRL_INTERNAL_KGR_INIT_BUG4208224_WAR_PARAMS_MESSAGE_ID = (0x46) +NV0080_CTRL_CMD_NVDEC_GET_CAPS = (0x801c01) +NV0080_CTRL_CMD_BSP_GET_CAPS = NV0080_CTRL_CMD_NVDEC_GET_CAPS +NV0080_CTRL_NVDEC_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_BSP_GET_CAPS_PARAMS = NV0080_CTRL_NVDEC_GET_CAPS_PARAMS +NV0080_CTRL_NVDEC_CAPS_TBL_SIZE = 8 +NV0080_CTRL_BSP_CAPS_TBL_SIZE = NV0080_CTRL_NVDEC_CAPS_TBL_SIZE +NV0080_CTRL_CMD_NVDEC_GET_CAPS_V2 = (0x801c02) +NV0080_CTRL_CMD_BSP_GET_CAPS_V2 = NV0080_CTRL_CMD_NVDEC_GET_CAPS_V2 +NV0080_CTRL_NVDEC_GET_CAPS_PARAMS_V2_MESSAGE_ID = (0x2) +NV0080_CTRL_BSP_GET_CAPS_PARAMS_V2 = NV0080_CTRL_NVDEC_GET_CAPS_PARAMS_V2 +NV0080_CTRL_CMD_NVENC_GET_CAPS = (0x801b01) +NV0080_CTRL_CMD_MSENC_GET_CAPS = NV0080_CTRL_CMD_NVENC_GET_CAPS +NV0080_CTRL_NVENC_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_MSENC_GET_CAPS_PARAMS = NV0080_CTRL_NVENC_GET_CAPS_PARAMS +NV0080_CTRL_NVENC_CAPS_TBL_SIZE = 6 +NV0080_CTRL_MSENC_CAPS_TBL_SIZE = NV0080_CTRL_NVENC_CAPS_TBL_SIZE +NV0080_CTRL_CMD_NVENC_GET_CAPS_V2 = (0x801b02) +NV0080_CTRL_CMD_MSENC_GET_CAPS_V2 = NV0080_CTRL_CMD_NVENC_GET_CAPS_V2 +NV0080_CTRL_NVENC_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_MSENC_GET_CAPS_V2_PARAMS = NV0080_CTRL_NVENC_GET_CAPS_V2_PARAMS +NV0080_CTRL_NVJPG_CAPS_TBL_SIZE = 9 +NV0080_CTRL_CMD_NVJPG_GET_CAPS_V2 = (0x801f02) +NV0080_CTRL_NVJPG_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x2) +NV0080_CTRL_PERF_SLI_GPU_BOOST_SYNC_CONTROL_PARAMS_MESSAGE_ID = (0x7) +NV0080_CTRL_PERF_CUDA_LIMIT_CONTROL_PARAMS_MESSAGE_ID = (0x9) +NV0080_CTRL_CMD_PERF_CUDA_LIMIT_SET_CONTROL = (0x801909) +NV0080_CTRL_CMD_OS_UNIX_VT_SWITCH = (0x801e01) +NV0080_CTRL_OS_UNIX_VT_SWITCH_PARAMS_MESSAGE_ID = (0x1) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_SAVE_VT_STATE = (0x00000001) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_RESTORE_VT_STATE = (0x00000002) +NV0080_CTRL_OS_UNIX_VT_SWITCH_CMD_CONSOLE_RESTORED = (0x00000003) +NV0080_CTRL_CMD_OS_UNIX_VT_GET_FB_INFO = (0x801e02) +NV0080_CTRL_OS_UNIX_VT_GET_FB_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_RESERVED = (0x00) +NV2080_CTRL_GPU = (0x01) +NV2080_CTRL_GPU_LEGACY_NON_PRIVILEGED = (0x81) +NV2080_CTRL_FUSE = (0x02) +NV2080_CTRL_FUSE_LEGACY_NON_PRIVILEGED = (0x82) +NV2080_CTRL_EVENT = (0x03) +NV2080_CTRL_TIMER = (0x04) +NV2080_CTRL_THERMAL = (0x05) +NV2080_CTRL_THERMAL_LEGACY_PRIVILEGED = (0xc5) +NV2080_CTRL_THERMAL_LEGACY_NON_PRIVILEGED = (0x85) +NV2080_CTRL_I2C = (0x06) +NV2080_CTRL_EXTI2C = (0x07) +NV2080_CTRL_BIOS = (0x08) +NV2080_CTRL_CIPHER = (0x09) +NV2080_CTRL_INTERNAL = (0x0A) +NV2080_CTRL_CLK_LEGACY_PRIVILEGED = (0xd0) +NV2080_CTRL_CLK_LEGACY_NON_PRIVILEGED = (0x90) +NV2080_CTRL_CLK = (0x10) +NV2080_CTRL_FIFO = (0x11) +NV2080_CTRL_GR = (0x12) +NV2080_CTRL_FB = (0x13) +NV2080_CTRL_NOISE = (0x15) +NV2080_CTRL_MC = (0x17) +NV2080_CTRL_BUS = (0x18) +NV2080_CTRL_PERF_LEGACY_PRIVILEGED = (0xe0) +NV2080_CTRL_PERF_LEGACY_NON_PRIVILEGED = (0xa0) +NV2080_CTRL_PERF = (0x20) +NV2080_CTRL_NVIF = (0x21) +NV2080_CTRL_RC = (0x22) +NV2080_CTRL_GPIO = (0x23) +NV2080_CTRL_GPIO_LEGACY_NON_PRIVILEGED = (0xa3) +NV2080_CTRL_NVD = (0x24) +NV2080_CTRL_DMA = (0x25) +NV2080_CTRL_PMGR = (0x26) +NV2080_CTRL_PMGR_LEGACY_PRIVILEGED = (0xe6) +NV2080_CTRL_PMGR_LEGACY_NON_PRIVILEGED = (0xa6) +NV2080_CTRL_POWER = (0x27) +NV2080_CTRL_POWER_LEGACY_NON_PRIVILEGED = (0xa7) +NV2080_CTRL_LPWR = (0x28) +NV2080_CTRL_LPWR_LEGACY_NON_PRIVILEGED = (0xa8) +NV2080_CTRL_LPWR_LEGACY_PRIVILEGED = (0xe8) +NV2080_CTRL_ACR = (0x29) +NV2080_CTRL_CE = (0x2A) +NV2080_CTRL_SPI = (0x2B) +NV2080_CTRL_NVLINK = (0x30) +NV2080_CTRL_FLCN = (0x31) +NV2080_CTRL_VOLT = (0x32) +NV2080_CTRL_VOLT_LEGACY_PRIVILEGED = (0xf2) +NV2080_CTRL_VOLT_LEGACY_NON_PRIVILEGED = (0xb2) +NV2080_CTRL_RIST = (0x33) +NV2080_CTRL_RIST_LEGACY_PRIVILEGED = (0xf3) +NV2080_CTRL_RIST_LEGACY_NON_PRIVILEGED = (0xb3) +NV2080_CTRL_ECC = (0x34) +NV2080_CTRL_ECC_NON_PRIVILEGED = (0xb4) +NV2080_CTRL_FLA = (0x35) +NV2080_CTRL_GSP = (0x36) +NV2080_CTRL_NNE = (0x37) +NV2080_CTRL_NNE_LEGACY_NON_PRIVILEGED = (0xb7) +NV2080_CTRL_GRMGR = (0x38) +NV2080_CTRL_UCODE_FUZZER = (0x39) +NV2080_CTRL_DMABUF = (0x3A) +NV2080_CTRL_BIF = (0x3B) +NV2080_CTRL_OS_WINDOWS = (0x3F) +NV2080_CTRL_OS_MACOS = (0x3E) +NV2080_CTRL_OS_UNIX = (0x3D) +NV2080_CTRL_CMD_NULL = (0x20800000) +NV2080_CTRL_CMD_BIF_DATA_PARAMS_MAX = 32 +NV2080_CTRL_CMD_BIF_GET_DATA = (0x20803b01) +NV2080_CTRL_BIF_GET_DATA_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_BIOS_INFO_MAX_SIZE = (0x0000000F) +NV2080_CTRL_BIOS_INFO_INDEX_REVISION = (0x00000000) +NV2080_CTRL_BIOS_INFO_INDEX_OEM_REVISION = (0x00000001) +NV2080_CTRL_CMD_BIOS_GET_INFO = (0x20800802) +NV2080_CTRL_CMD_BIOS_GET_INFO_V2 = (0x20800810) +NV2080_CTRL_BIOS_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_BIOS_NBSI_MAX_REG_STRING_LENGTH = (0x00000100) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_ASCII = (0x00000000) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_UNICODE = (0x00000001) +NV2080_CTRL_BIOS_NBSI_STRING_TYPE_HASH = (0x00000002) +NV2080_CTRL_BIOS_NBSI_MODULE_ROOT = (0x00000000) +NV2080_CTRL_BIOS_NBSI_MODULE_RM = (0x00000001) +NV2080_CTRL_BIOS_NBSI_MODULE_DISPLAYDRIVER = (0x00000002) +NV2080_CTRL_BIOS_NBSI_MODULE_VIDEO = (0x00000003) +NV2080_CTRL_BIOS_NBSI_MODULE_CPL = (0x00000004) +NV2080_CTRL_BIOS_NBSI_MODULE_D3D = (0x00000005) +NV2080_CTRL_BIOS_NBSI_MODULE_OGL = (0x00000006) +NV2080_CTRL_BIOS_NBSI_MODULE_PMU = (0x00000007) +NV2080_CTRL_BIOS_NBSI_MODULE_MODE = (0x00000008) +NV2080_CTRL_BIOS_NBSI_NUM_MODULES = (0x00000009) +NV2080_CTRL_BIOS_NBSI_MODULE_UNKNOWN = (0x80000000) +NV2080_CTRL_BIOS_GET_NBSI_SUCCESS = (0x00000000) +NV2080_CTRL_BIOS_GET_NBSI_OVERRIDE = (0x00000001) +NV2080_CTRL_BIOS_GET_NBSI_BAD_HASH = (0xFFFFFFFA) +NV2080_CTRL_BIOS_GET_NBSI_APITEST_SUCCESS = (0xFFFFFFFB) +NV2080_CTRL_BIOS_GET_NBSI_BAD_TABLE = (0xFFFFFFFC) +NV2080_CTRL_BIOS_GET_NBSI_NO_TABLE = (0xFFFFFFFD) +NV2080_CTRL_BIOS_GET_NBSI_INCOMPLETE = (0xFFFFFFFE) +NV2080_CTRL_BIOS_GET_NBSI_NOT_FOUND = (0xFFFFFFFF) +NV2080_CTRL_CMD_BIOS_GET_NBSI = (0x20800803) +NV2080_CTRL_BIOS_GET_NBSI_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_BIOS_GET_NBSI_V2 = (0x2080080e) +NV2080_BIOS_GET_NBSI_MAX_RET_SIZE = (0x100) +NV2080_CTRL_BIOS_GET_NBSI_V2_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_BIOS_GET_NBSI_OBJ = (0x20800806) +NV2080_CTRL_BIOS_GET_NBSI_OBJ_PARAMS_MESSAGE_ID = (0x6) +GLOB_TYPE_GET_NBSI_DIR = 0xfffe +GLOB_TYPE_APITEST = 0xffff +GLOB_TYPE_GET_NBSI_ACPI_RAW = 0xfffd +NV2080_CTRL_CMD_BIOS_GET_SKU_INFO = (0x20800808) +NV2080_CTRL_BIOS_GET_SKU_INFO_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME = (0x20800809) +NV2080_CTRL_CMD_BIOS_GET_POST_TIME_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_BIOS_GET_UEFI_SUPPORT = (0x2080080b) +NV2080_CTRL_BIOS_GET_UEFI_SUPPORT_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE = (1, 0) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_NO = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_YES = (0x00000001) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_PLACEHOLDER = (0x00000002) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_PRESENCE_HIDDEN = (0x00000003) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING = (2, 2) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING_FALSE = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_RUNNING_TRUE = (0x00000001) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT = (3, 3) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT_FALSE = (0x00000000) +NV2080_CTRL_BIOS_UEFI_SUPPORT_FLAGS_IS_EFI_INIT_TRUE = (0x00000001) +NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_BIT_SIZE = 32 +NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_INDEX = lambda _bit: ((_bit) / NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_BIT_SIZE) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_OFFSET = lambda _bit: ((_bit) % NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_BIT_SIZE) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_DATA_SIZE = lambda _bits: (NV2080_CTRL_BOARDOBJGRP_MASK_MASK_ELEMENT_INDEX((_bits) - 1) + 1) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_ARRAY_START_SIZE = 1 +NV2080_CTRL_BOARDOBJGRP_MASK_ARRAY_EXTENSION_SIZE = lambda _bits: (NV2080_CTRL_BOARDOBJGRP_MASK_DATA_SIZE(_bits) - (NV2080_CTRL_BOARDOBJGRP_MASK_ARRAY_START_SIZE)) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E32_FOR_EACH_INDEX__DEPRECATED = lambda _index,_pMask: NV2080_CTRL_BOARDOBJGRP_MASK_FOR_EACH_INDEX__DEPRECATED_DO_NOT_USE( NV2080_CTRL_BOARDOBJGRP_E32_MAX_OBJECTS,_index,_pMask) # type: ignore +NV2080_CTRL_BOARDOBJGRP_MASK_E255_FOR_EACH_INDEX__DEPRECATED = lambda _index,_pMask: NV2080_CTRL_BOARDOBJGRP_MASK_FOR_EACH_INDEX__DEPRECATED_DO_NOT_USE( NV2080_CTRL_BOARDOBJGRP_E255_MAX_OBJECTS,_index,_pMask) # type: ignore +NV2080_CTRL_CMD_BUS_GET_PCI_INFO = (0x20801801) +NV2080_CTRL_BUS_GET_PCI_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_BUS_INFO_INDEX_TYPE = (0x00000000) +NV2080_CTRL_BUS_INFO_INDEX_INTLINE = (0x00000001) +NV2080_CTRL_BUS_INFO_INDEX_CAPS = (0x00000002) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CAPS = (0x00000003) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_CAPS = (0x00000004) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_LINK_CAPS = (0x00000005) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_DOWNSTREAM_LINK_CAPS = (0x00000006) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CTRL_STATUS = (0x00000007) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_CTRL_STATUS = (0x00000008) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_LINK_CTRL_STATUS = (0x00000009) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_DOWNSTREAM_LINK_CTRL_STATUS = (0x0000000A) +NV2080_CTRL_BUS_INFO_INDEX_COHERENT_DMA_FLAGS = (0x0000000B) +NV2080_CTRL_BUS_INFO_INDEX_NONCOHERENT_DMA_FLAGS = (0x0000000C) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_SIZE = (0x0000000D) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_FLAGS = (0x0000000E) +NV2080_CTRL_BUS_INFO_INDEX_BUS_NUMBER = (0x0000000F) +NV2080_CTRL_BUS_INFO_INDEX_DEVICE_NUMBER = (0x00000010) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_ERRORS = (0x00000011) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ROOT_LINK_ERRORS = (0x00000012) +NV2080_CTRL_BUS_INFO_INDEX_INTERFACE_TYPE = (0x00000013) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GEN2_INFO = (0x00000014) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_AER = (0x00000015) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_LINK_CAPS = (0x00000016) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_LINK_CTRL_STATUS = (0x00000017) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_ASLM_STATUS = (0x00000018) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_LINK_WIDTH_SWITCH_ERROR_COUNT = (0x00000019) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_LINK_SPEED_SWITCH_ERROR_COUNT = (0x0000001A) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_CYA_ASPM = (0x0000001B) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_LINECODE_ERRORS = (0x0000001C) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CRC_ERRORS = (0x0000001D) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NAKS_RECEIVED = (0x0000001E) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FAILED_L0S_EXITS = (0x0000001F) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_LINECODE_ERRORS_CLEAR = (0x00000020) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CRC_ERRORS_CLEAR = (0x00000021) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NAKS_RECEIVED_CLEAR = (0x00000022) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FAILED_L0S_EXITS_CLEAR = (0x00000023) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CORRECTABLE_ERRORS = (0x00000024) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NONFATAL_ERRORS = (0x00000025) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FATAL_ERRORS = (0x00000026) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_UNSUPPORTED_REQUESTS = (0x00000027) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_CORRECTABLE_ERRORS_CLEAR = (0x00000028) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_NONFATAL_ERRORS_CLEAR = (0x00000029) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_FATAL_ERRORS_CLEAR = (0x0000002A) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GPU_LINK_UNSUPPORTED_REQUESTS_CLEAR = (0x0000002B) +NV2080_CTRL_BUS_INFO_INDEX_DOMAIN_NUMBER = (0x0000002C) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_GEN_INFO = (0x0000002D) +NV2080_CTRL_BUS_INFO_INDEX_GPU_INTERFACE_TYPE = (0x0000002E) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_UPSTREAM_GEN_INFO = (0x0000002F) +NV2080_CTRL_BUS_INFO_INDEX_PCIE_BOARD_GEN_INFO = (0x00000030) +NV2080_CTRL_BUS_INFO_INDEX_MSI_INFO = (0x00000031) +NV2080_CTRL_BUS_INFO_INDEX_GPU_GART_SIZE_HI = (0x00000032) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE = (0x00000033) +NV2080_CTRL_BUS_INFO_INDEX_MAX = NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE +NV2080_CTRL_BUS_INFO_MAX_LIST_SIZE = (0x00000034) +NV2080_CTRL_BUS_INFO_TYPE_PCI = (0x00000001) +NV2080_CTRL_BUS_INFO_TYPE_PCI_EXPRESS = (0x00000003) +NV2080_CTRL_BUS_INFO_TYPE_FPCI = (0x00000004) +NV2080_CTRL_BUS_INFO_TYPE_AXI = (0x00000008) +NV2080_CTRL_BUS_INFO_CAPS_NEED_IO_FLUSH = (0x00000001) +NV2080_CTRL_BUS_INFO_CAPS_CHIP_INTEGRATED = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED = (3, 0) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_MAX_WIDTH = (9, 4) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM = (11, 10) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_NONE = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN = (15, 12) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GEN_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL = (19, 16) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_CURR_LEVEL_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN = (23, 20) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN3 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN4 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN5 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_GPU_GEN_GEN6 = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES = (24, 24) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES_ENABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CAP_SPEED_CHANGES_DISABLED = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM = (1, 0) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L1 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED = (19, 16) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH = (25, 20) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_UNDEFINED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X1 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X2 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X4 = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X8 = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X12 = (0x0000000C) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X16 = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_LINK_CTRL_STATUS_LINK_WIDTH_X32 = (0x00000020) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA = (0, 0) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_CTXDMA_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART = (2, 2) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_COHERENT_DMA_FLAGS_GPUGART_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA = (0, 0) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_CTXDMA_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART = (2, 2) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_GPUGART_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE = (3, 3) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_NONCOHERENT_DMA_FLAGS_COH_MODE_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH = (0, 0) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_REQFLUSH_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED = (1, 1) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_GPU_GART_FLAGS_UNIFIED_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_CORR_ERROR = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_NON_FATAL_ERROR = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_FATAL_ERROR = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_UNSUPP_REQUEST = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_ENTERED_RECOVERY = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP_FALSE = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CAP_TRUE = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL_GEN1 = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GEN2_INFO_CURR_LEVEL_GEN2 = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_TRAINING_ERR = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_DLINK_PROTO_ERR = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_POISONED_TLP = (0x00000004) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_FC_PROTO_ERR = (0x00000008) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_CPL_TIMEOUT = (0x00000010) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_CPL_ABORT = (0x00000020) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNEXP_CPL = (0x00000040) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_RCVR_OVERFLOW = (0x00000080) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_MALFORMED_TLP = (0x00000100) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_ECRC_ERROR = (0x00000200) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNSUPPORTED_REQ = (0x00000400) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RCV_ERR = (0x00010000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_TLP = (0x00020000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_DLLP = (0x00040000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_ROLLOVER = (0x00080000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_TIMEOUT = (0x00100000) +NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_ADVISORY_NONFATAL = (0x00200000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE_ERROR = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_PCIE_PRESENT = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_CL_CAPABLE_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_OS_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04 = (4, 4) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04_MISSING = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_ASLM_STATUS_BR04_PRESENT = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_VALID_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM = (2, 1) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L0S = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L1 = (0x00000002) +NV2080_CTRL_BUS_INFO_PCIE_GPU_CYA_ASPM_L0S_L1 = (0x00000003) +NV2080_CTRL_BUS_INFO_MSI_STATUS = (0, 0) +NV2080_CTRL_BUS_INFO_MSI_STATUS_DISABLED = (0x00000000) +NV2080_CTRL_BUS_INFO_MSI_STATUS_ENABLED = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_2_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PCIPM_L1_1_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_2_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_ASPM_L1_1_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED = (4, 4) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_L1PM_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_RESERVED = (7, 5) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_PORT_RESTORE_TIME = (15, 8) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_T_POWER_ON_SCALE = (17, 16) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CAP_T_POWER_ON_VALUE = (23, 19) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED = (0, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_2_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED = (1, 1) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_PCIPM_L1_1_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED = (2, 2) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_2_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED = (3, 3) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED_YES = (0x00000001) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_ASPM_L1_1_ENABLED_NO = (0x00000000) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_COMMON_MODE_RESTORE_TIME = (15, 8) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_LTR_L1_2_THRESHOLD_VALUE = (25, 16) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL1_LTR_L1_2_THRESHOLD_SCALE = (31, 29) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL2_T_POWER_ON_SCALE = (1, 0) +NV2080_CTRL_BUS_INFO_PCIE_L1_SS_CTRL2_T_POWER_ON_VALUE = (7, 3) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_PCIE = (0x00000000) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_NVLINK = (0x00000001) +NV2080_CTRL_BUS_INFO_INDEX_SYSMEM_CONNECTION_TYPE_C2C = (0x00000002) +NV2080_CTRL_CMD_BUS_GET_INFO = (0x20801802) +NV2080_CTRL_BUS_GET_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_BUS_GET_INFO_V2 = (0x20801823) +NV2080_CTRL_BUS_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_BUS_GET_PCI_BAR_INFO = (0x20801803) +NV2080_CTRL_BUS_MAX_PCI_BARS = (8) +NV2080_CTRL_BUS_GET_PCI_BAR_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_BUS_SET_PCIE_LINK_WIDTH = (0x20801804) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_PSTATE = (0x00000001) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_PCIE_CFG_ACCESS = (0x00000002) +NV2080_CTRL_BUS_SET_PCIE_LINK_WIDTH_ERROR_TRAINING = (0x00000004) +NV2080_CTRL_CMD_BUS_SET_PCIE_SPEED = (0x20801805) +NV2080_CTRL_BUS_SET_PCIE_SPEED_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_BUS_SET_PCIE_SPEED_2500MBPS = (0x00000001) +NV2080_CTRL_BUS_SET_PCIE_SPEED_5000MBPS = (0x00000002) +NV2080_CTRL_BUS_SET_PCIE_SPEED_8000MBPS = (0x00000003) +NV2080_CTRL_BUS_SET_PCIE_SPEED_16000MBPS = (0x00000004) +NV2080_CTRL_BUS_SET_PCIE_SPEED_32000MBPS = (0x00000005) +NV2080_CTRL_BUS_SET_PCIE_SPEED_64000MBPS = (0x00000006) +NV2080_CTRL_CMD_BUS_MAP_BAR2 = (0x20801809) +NV2080_CTRL_BUS_MAP_BAR2_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_BUS_UNMAP_BAR2 = (0x2080180a) +NV2080_CTRL_BUS_UNMAP_BAR2_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_BUS_VERIFY_BAR2 = (0x2080180b) +NV2080_CTRL_BUS_VERIFY_BAR2_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_BUS_SERVICE_GPU_MULTIFUNC_STATE = (0x20801812) +NV2080_CTRL_BUS_SERVICE_GPU_MULTIFUNC_STATE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_BUS_ENABLE_GPU_MULTIFUNC_STATE = (0x00000000) +NV2080_CTRL_BUS_DISABLE_GPU_MULTIFUNC_STATE = (0x00000001) +NV2080_CTRL_BUS_GET_GPU_MULTIFUNC_STATE = (0x00000002) +NV2080_CTRL_CMD_BUS_GET_PEX_COUNTERS = (0x20801813) +NV2080_CTRL_PEX_MAX_COUNTER_TYPES = 31 +NV2080_CTRL_BUS_GET_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_BUS_PEX_COUNTER_TYPE = 0x00000000 +NV2080_CTRL_BUS_PEX_COUNTER_RECEIVER_ERRORS = 0x00000001 +NV2080_CTRL_BUS_PEX_COUNTER_REPLAY_COUNT = 0x00000002 +NV2080_CTRL_BUS_PEX_COUNTER_REPLAY_ROLLOVER_COUNT = 0x00000004 +NV2080_CTRL_BUS_PEX_COUNTER_BAD_DLLP_COUNT = 0x00000008 +NV2080_CTRL_BUS_PEX_COUNTER_BAD_TLP_COUNT = 0x00000010 +NV2080_CTRL_BUS_PEX_COUNTER_8B10B_ERRORS_COUNT = 0x00000020 +NV2080_CTRL_BUS_PEX_COUNTER_SYNC_HEADER_ERRORS_COUNT = 0x00000040 +NV2080_CTRL_BUS_PEX_COUNTER_LCRC_ERRORS_COUNT = 0x00000080 +NV2080_CTRL_BUS_PEX_COUNTER_FAILED_L0S_EXITS_COUNT = 0x00000100 +NV2080_CTRL_BUS_PEX_COUNTER_NAKS_SENT_COUNT = 0x00000200 +NV2080_CTRL_BUS_PEX_COUNTER_NAKS_RCVD_COUNT = 0x00000400 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_ERRORS = 0x00000800 +NV2080_CTRL_BUS_PEX_COUNTER_L1_TO_RECOVERY_COUNT = 0x00001000 +NV2080_CTRL_BUS_PEX_COUNTER_L0_TO_RECOVERY_COUNT = 0x00002000 +NV2080_CTRL_BUS_PEX_COUNTER_RECOVERY_COUNT = 0x00004000 +NV2080_CTRL_BUS_PEX_COUNTER_CHIPSET_XMIT_L0S_ENTRY_COUNT = 0x00008000 +NV2080_CTRL_BUS_PEX_COUNTER_GPU_XMIT_L0S_ENTRY_COUNT = 0x00010000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_ENTRY_COUNT = 0x00020000 +NV2080_CTRL_BUS_PEX_COUNTER_L1P_ENTRY_COUNT = 0x00040000 +NV2080_CTRL_BUS_PEX_COUNTER_DEEP_L1_ENTRY_COUNT = 0x00080000 +NV2080_CTRL_BUS_PEX_COUNTER_ASLM_COUNT = 0x00100000 +NV2080_CTRL_BUS_PEX_COUNTER_TOTAL_CORR_ERROR_COUNT = 0x00200000 +NV2080_CTRL_BUS_PEX_COUNTER_CORR_ERROR_COUNT = 0x00400000 +NV2080_CTRL_BUS_PEX_COUNTER_NON_FATAL_ERROR_COUNT = 0x00800000 +NV2080_CTRL_BUS_PEX_COUNTER_FATAL_ERROR_COUNT = 0x01000000 +NV2080_CTRL_BUS_PEX_COUNTER_UNSUPP_REQ_COUNT = 0x02000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_1_ENTRY_COUNT = 0x04000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_2_ENTRY_COUNT = 0x08000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_2_ABORT_COUNT = 0x10000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1SS_TO_DEEP_L1_TIMEOUT_COUNT = 0x20000000 +NV2080_CTRL_BUS_PEX_COUNTER_L1_SHORT_DURATION_COUNT = 0x40000000 +NV2080_CTRL_CMD_BUS_CLEAR_PEX_COUNTERS = (0x20801814) +NV2080_CTRL_BUS_CLEAR_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_BUS_FREEZE_PEX_COUNTERS = (0x20801815) +NV2080_CTRL_BUS_FREEZE_PEX_COUNTERS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS = (0x20801816) +NV2080_CTRL_PEX_MAX_LANES = 16 +NV2080_CTRL_CMD_BUS_GET_PEX_LANE_COUNTERS_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_BUS_PEX_COUNTER_LANE_TYPE = 0x00000000 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SYNC_HDR_CODING_ERR = 0x00000001 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SYNC_HDR_ORDER_ERR = 0x00000002 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_OS_DATA_SEQ_ERR = 0x00000004 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_TSX_DATA_SEQ_ERR = 0x00000008 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_SKPOS_LFSR_ERR = 0x00000010 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RX_CLK_FIFO_OVERFLOW = 0x00000020 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_ELASTIC_FIFO_OVERFLOW = 0x00000040 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RCVD_LINK_NUM_ERR = 0x00000080 +NV2080_CTRL_BUS_PEX_COUNTER_LANE_RCVD_LANE_NUM_ERR = 0x00000100 +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY = (0x20801817) +NV2080_CTRL_CMD_BUS_GET_PCIE_LTR_LATENCY_PARAMS_MESSAGE_ID = (0x17) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY = (0x20801818) +NV2080_CTRL_CMD_BUS_SET_PCIE_LTR_LATENCY_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_BYTES = 0x00000001 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_BYTES = 0x00000002 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_L0 = 0x00000004 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_L0 = 0x00000008 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_TX_L0S = 0x00000010 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_RX_L0S = 0x00000020 +NV2080_CTRL_BUS_PEX_UTIL_COUNTER_NON_L0_L0S = 0x00000040 +NV2080_CTRL_PEX_UTIL_MAX_COUNTER_TYPES = 7 +NV2080_CTRL_CMD_BUS_GET_PEX_UTIL_COUNTERS = (0x20801819) +NV2080_CTRL_BUS_GET_PEX_UTIL_COUNTERS_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_CMD_BUS_CLEAR_PEX_UTIL_COUNTERS = (0x20801820) +NV2080_CTRL_BUS_CLEAR_PEX_UTIL_COUNTERS_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS = (0x20801824) +NV2080_CTRL_CMD_BUS_CONTROL_PUBLIC_ASPM_BITS_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_BUS_GET_NVLINK_PEER_ID_MASK = (0x20801825) +NV2080_CTRL_BUS_MAX_NUM_GPUS = 32 +NV2080_CTRL_BUS_GET_NVLINK_PEER_ID_MASK_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS = (0x20801826) +NV2080_CTRL_CMD_BUS_SET_EOM_PARAMETERS_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE = (0x20801827) +NV2080_CTRL_CMD_BUS_GET_UPHY_DLN_CFG_SPACE_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_BUS_GET_EOM_STATUS = (0x20801828) +NV2080_CTRL_BUS_MAX_NUM_LANES = 32 +NV2080_CTRL_BUS_GET_EOM_STATUS_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS = (0x20801829) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_SYSMEM = 0x0 +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_GPU = 0x1 +NV2080_CTRL_CMD_BUS_PCIE_ATOMICS_CAPTYPE_P2P = 0x2 +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32 = (0, 0) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64 = (1, 1) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_FETCHADD_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32 = (2, 2) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64 = (3, 3) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_SWAP_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32 = (4, 4) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64 = (5, 5) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128 = (6, 6) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_REQ_ATOMICS_CAPS_CAS_128_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS = (0x2080182a) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IADD = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IMIN = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IMAX = 2 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_INC = 3 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_DEC = 4 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IAND = 5 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IOR = 6 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_IXOR = 7 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_EXCH = 8 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_CAS = 9 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FADD = 10 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FMIN = 11 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_FMAX = 12 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_OP_TYPE_COUNT = 13 +NV2080_CTRL_CMD_BUS_GET_PCIE_SUPPORTED_GPU_ATOMICS_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR = (0, 0) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SCALAR_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR = (1, 1) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_VECTOR_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION = (2, 2) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_REDUCTION_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32 = (3, 3) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_32_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64 = (4, 4) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_64_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128 = (5, 5) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIZE_128_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED = (6, 6) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_SIGNED_NO = 0 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED = (7, 7) +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED_YES = 1 +NV2080_CTRL_PCIE_SUPPORTED_GPU_ATOMICS_ATTRIB_UNSIGNED_NO = 0 +NV2080_CTRL_CMD_BUS_GET_C2C_INFO = (0x2080182b) +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_MAX_C2C_INSTANCES = 2 +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_MAX_C2C_LINKS_PER_INSTANCE = 7 +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_MAX_C2C_LINKS = (0xe) +NV2080_CTRL_CMD_BUS_GET_C2C_INFO_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_BUS_GET_C2C_INFO_REMOTE_TYPE_CPU = 1 +NV2080_CTRL_BUS_GET_C2C_INFO_REMOTE_TYPE_GPU = 2 +NV2080_CTRL_CMD_BUS_SYSMEM_ACCESS = (0x2080182c) +NV2080_CTRL_BUS_SYSMEM_ACCESS_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_BUS_GET_C2C_ERR_INFO = (0x2080182d) +NV2080_CTRL_BUS_GET_C2C_ERR_INFO_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING = (0x2080182e) +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_INVALID = 0 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_NVLINK = 1 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_PCIE = 2 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_PCIE_BAR1 = 3 +NV2080_CTRL_CMD_BUS_SET_P2P_MAPPING_CONNECTION_TYPE_C2C = 4 +NV2080_SET_P2P_MAPPING_UUID_LEN = 16 +NV2080_CTRL_BUS_SET_P2P_MAPPING_PARAMS_MESSAGE_ID = (0x2E) +NV2080_CTRL_CMD_BUS_UNSET_P2P_MAPPING = (0x2080182f) +NV2080_CTRL_BUS_UNSET_P2P_MAPPING_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS = (0x20801830) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32 = (0, 0) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64 = (1, 1) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_FETCHADD_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32 = (2, 2) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64 = (3, 3) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_SWAP_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32 = (4, 4) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_32_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64 = (5, 5) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_64_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128 = (6, 6) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128_YES = (0x00000001) +NV2080_CTRL_CMD_BUS_GET_PCIE_CPL_ATOMICS_CAPS_CAS_128_NO = (0x00000000) +NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS = (0x20801831) +NV2080_CTRL_CMD_BUS_GET_C2C_LPWR_STATS_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_BUS_GET_C2C_STATE_FULL_POWER = 0x0 +NV2080_CTRL_CMD_BUS_GET_C2C_STATE_CL3 = 0x1 +NV2080_CTRL_CMD_BUS_GET_C2C_STATE_CL4 = 0x2 +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE = (0x20801832) +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_STATE_VOTE_PARAMS_MESSAGE_ID = (0x32) +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_IDLE_THRESHOLD = (0x20801836) +NV2080_CTRL_CMD_BUS_SET_C2C_LPWR_IDLE_THRESHOLD_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_BUS_GET_C2C_PACKET_COUNTERS = (0x20801837) +NV2080_CTRL_CMD_BUS_GET_C2C_PACKET_COUNTERS_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_CE_GET_CAPS = (0x20802a01) +NV2080_CTRL_CE_CAPS_TBL_SIZE = 2 +NV2080_CTRL_CE_GET_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_CE_GET_CAPS_V2 = (0x20802a03) +NV2080_CTRL_CE_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_CE_GET_CE_PCE_MASK = (0x20802a02) +NV2080_CTRL_CE_GET_CE_PCE_MASK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_CE_SET_PCE_LCE_CONFIG = (0x20802a04) +NV2080_CTRL_MAX_PCES = 64 +NV2080_CTRL_MAX_GRCES = 4 +NV2080_CTRL_CE_SET_PCE_LCE_CONFIG_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_CE_UPDATE_PCE_LCE_MAPPINGS = (0x20802a05) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_INVALID_LCE = 0xf +NV2080_CTRL_CMD_CE_UPDATE_CLASS_DB = (0x20802a06) +NV2080_CTRL_CE_UPDATE_CLASS_DB_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_CE_GET_PHYSICAL_CAPS = (0x20802a07) +NV2080_CTRL_CE_GET_PHYSICAL_CAPS_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CE_GET_FAULT_METHOD_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_CE_GET_FAULT_METHOD_BUFFER_SIZE = (0x20802a08) +NV2080_CTRL_CMD_CE_GET_HUB_PCE_MASK = (0x20802a09) +NV2080_CTRL_CE_MAX_HSHUBS = 32 +NV2080_CTRL_CE_GET_HUB_PCE_MASK_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_CE_GET_ALL_CAPS = (0x20802a0a) +NV2080_CTRL_MAX_CES = 64 +NV2080_CTRL_CE_GET_ALL_CAPS_PARAMS_MESSAGE_ID = (0xa) +NV2080_CTRL_CMD_CE_GET_ALL_PHYSICAL_CAPS = (0x20802a0b) +NV2080_CTRL_CE_GET_ALL_PHYSICAL_CAPS_PARAMS_MESSAGE_ID = (0xb) +NV2080_CTRL_CMD_CE_GET_LCE_SHIM_INFO = (0x20802a0c) +NV2080_CTRL_CE_GET_LCE_SHIM_INFO_PARAMS_MESSAGE_ID = (0xc) +NV2080_CTRL_CMD_CE_UPDATE_PCE_LCE_MAPPINGS_V2 = (0x20802a0d) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MAPPINGS_V2_PARAMS_MESSAGE_ID = (0xd) +NV2080_CTRL_CMD_CE_GET_HUB_PCE_MASK_V2 = (0x20802a0e) +NV2080_CTRL_CE_GET_HUB_PCE_MASK_V2_PARAMS_MESSAGE_ID = (0xe) +NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE = (0x20802a0f) +NV2080_CTRL_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_TYPE_PARAMS_MESSAGE_ID = (0xf) +NV2080_CTRL_CMD_CE_GET_DECOMP_LCE_MASK = (0x20802a11) +NV2080_CTRL_CE_GET_DECOMP_LCE_MASK_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_CE_IS_DECOMP_LCE_ENABLED = (0x20802a12) +NV2080_CTRL_CE_IS_DECOMP_LCE_ENABLED_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_MIG_GPU_INSTANCE = (0x20802a13) +NV2080_CTRL_CMD_INTERNAL_CE_GET_PCE_CONFIG_FOR_LCE_MIG_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MIG_MAPPINGS = (0x20802a14) +NV2080_CTRL_CE_UPDATE_PCE_LCE_MIG_MAPPINGS_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CLK_DOMAIN_TEGRA_UNDEFINED = (0x00000000) +NV2080_CTRL_CLK_DOMAIN_TEGRA_GPCCLK = (0x00000001) +NV2080_CTRL_CLK_DOMAIN_TEGRA_NVDCLK = (0x00000002) +NV2080_CTRL_CMD_CLK_PMUMON_CLK_DOMAINS_GET_SAMPLES = (0x20801037) +NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_SAMPLE_COUNT = (250) +NV2080_CTRL_CLK_PMUMON_CLK_DOMAINS_GET_SAMPLES_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_DMA_INVALIDATE_TLB = (0x20802502) +NV2080_CTRL_DMA_INVALIDATE_TLB_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS = (0, 0) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_GRAPHICS_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO = (1, 1) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VIDEO_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY = (2, 2) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_DISPLAY_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE = (3, 3) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_CAPTURE_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB = (4, 4) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_IFB_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV = (5, 5) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MV_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG = (6, 6) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_MPEG_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD = (7, 7) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_VLD_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION = (8, 8) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_ENCRYPTION_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON = (9, 9) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_PERFMON_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS = (10, 10) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_POSTPROCESS_TRUE = (0x00000001) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR = (11, 11) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR_FALSE = (0x00000000) +NV2080_CTRL_DMA_INVALIDATE_TLB_ENGINE_BAR_TRUE = (0x00000001) +NV2080_CTRL_DMA_INFO_INDEX_SYSTEM_ADDRESS_SIZE = (0x000000000) +NV2080_CTRL_DMA_INFO_INDEX_MAX = NV2080_CTRL_DMA_INFO_INDEX_SYSTEM_ADDRESS_SIZE +NV2080_CTRL_CMD_DMA_GET_INFO = (0x20802503) +NV2080_CTRL_DMA_GET_INFO_MAX_ENTRIES = (256) +NV2080_CTRL_DMA_GET_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_DMABUF_EXPORT_OBJECTS_TO_FD = (0x20803a01) +NV2080_CTRL_DMABUF_MAX_HANDLES = 128 +NV2080_CTRL_DMABUF_EXPORT_MAPPING_TYPE_DEFAULT = (0x00000000) +NV2080_CTRL_DMABUF_EXPORT_MAPPING_TYPE_FORCE_PCIE = (0x00000001) +NV2080_CTRL_DMABUF_EXPORT_MEM_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_ECC_GET_CLIENT_EXPOSED_COUNTERS = (0x20803400) +NV2080_CTRL_ECC_GET_CLIENT_EXPOSED_COUNTERS_PARAMS_MESSAGE_ID = (0x0) +NV2080_CTRL_CMD_ECC_GET_VOLATILE_COUNTS = (0x20803401) +NV2080_CTRL_ECC_GET_VOLATILE_COUNTS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_ECC_SRAM_UNIQUE_UNCORR_COUNTS_MAX_COUNT = 600 +NV2080_CTRL_CMD_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS = (0x20803402) +NV2080_CTRL_ECC_GET_SRAM_UNIQUE_UNCORR_COUNTS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_ECC_ERROR_TYPE_CORRECTED = 0 +NV2080_CTRL_ECC_ERROR_TYPE_UNCORRECTED = 1 +NV2080_CTRL_CMD_ECC_INJECT_ERROR = (0x20803403) +NV2080_CTRL_ECC_INJECT_ERROR_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_ECC_GET_REPAIR_STATUS = (0x20803404) +NV2080_CTRL_ECC_GET_REPAIR_STATUS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_ECC_INJECTION_SUPPORTED = (0x20803405) +NV2080_CTRL_ECC_INJECTION_SUPPORTED_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_ECC_GET_UNREPAIRABLE_MEMORY_FLAG = (0x20803406) +NV2080_CTRL_ECC_GET_UNREPAIRABLE_MEMORY_FLAG_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_EVENT_SET_NOTIFICATION = (0x20800301) +NV2080_CTRL_EVENT_SET_NOTIFICATION_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_DISABLE = (0x00000000) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_SINGLE = (0x00000001) +NV2080_CTRL_EVENT_SET_NOTIFICATION_ACTION_REPEAT = (0x00000002) +NV2080_EVENT_DSTATE_XUSB_D0 = (0x00000000) +NV2080_EVENT_DSTATE_XUSB_D3 = (0x00000003) +NV2080_EVENT_DSTATE_XUSB_INVALID = (0xFFFFFFFF) +NV2080_EVENT_DSTATE_PPC_D0 = (0x00000000) +NV2080_EVENT_DSTATE_PPC_D3 = (0x00000003) +NV2080_EVENT_DSTATE_PPC_INVALID = (0xFFFFFFFF) +NV2080_CTRL_CMD_EVENT_SET_TRIGGER = (0x20800302) +NV2080_CTRL_CMD_EVENT_SET_MEMORY_NOTIFIES = (0x20800303) +NV2080_CTRL_EVENT_SET_MEMORY_NOTIFIES_PARAMS_MESSAGE_ID = (0x3) +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_NOTIFIED = 0 +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_PENDING = 1 +NV2080_EVENT_MEMORY_NOTIFIES_STATUS_ERROR = 2 +NV2080_CTRL_CMD_EVENT_SET_SEMAPHORE_MEMORY = (0x20800304) +NV2080_CTRL_EVENT_SET_SEMAPHORE_MEMORY_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_EVENT_SET_GUEST_MSI = (0x20800305) +NV2080_CTRL_EVENT_SET_GUEST_MSI_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_EVENT_SET_SEMA_MEM_VALIDATION = (0x20800306) +NV2080_CTRL_EVENT_SET_SEMA_MEM_VALIDATION_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_EVENT_SET_TRIGGER_FIFO = (0x20800308) +NV2080_CTRL_EVENT_SET_TRIGGER_FIFO_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_EVENT_VIDEO_BIND_EVTBUF = (0x20800309) +NV2080_CTRL_EVENT_VIDEO_BIND_EVTBUF_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_EVENT_RATS_GSP_TRACE_BIND_EVTBUF = (0x2080030a) +NV2080_CTRL_EVENT_RATS_GSP_TRACE_BIND_EVTBUF_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_EVENT_NOCAT_BIND_EVTBUF = (0x2080030b) +NV2080_CTRL_EVENT_NOCAT_BIND_EVTBUF_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_FB_INFO_INDEX_TILE_REGION_COUNT = (0x00000000) +NV2080_CTRL_FB_INFO_INDEX_COMPRESSION_SIZE = (0x00000001) +NV2080_CTRL_FB_INFO_INDEX_DRAM_PAGE_STRIDE = (0x00000002) +NV2080_CTRL_FB_INFO_INDEX_TILE_REGION_FREE_COUNT = (0x00000003) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_COUNT = (0x00000004) +NV2080_CTRL_FB_INFO_INDEX_BAR1_SIZE = (0x00000005) +NV2080_CTRL_FB_INFO_INDEX_BANK_SWIZZLE_ALIGNMENT = (0x00000006) +NV2080_CTRL_FB_INFO_INDEX_RAM_SIZE = (0x00000007) +NV2080_CTRL_FB_INFO_INDEX_TOTAL_RAM_SIZE = (0x00000008) +NV2080_CTRL_FB_INFO_INDEX_HEAP_SIZE = (0x00000009) +NV2080_CTRL_FB_INFO_INDEX_MAPPABLE_HEAP_SIZE = (0x0000000A) +NV2080_CTRL_FB_INFO_INDEX_BUS_WIDTH = (0x0000000B) +NV2080_CTRL_FB_INFO_INDEX_RAM_CFG = (0x0000000C) +NV2080_CTRL_FB_INFO_INDEX_RAM_TYPE = (0x0000000D) +NV2080_CTRL_FB_INFO_INDEX_BANK_COUNT = (0x0000000E) +NV2080_CTRL_FB_INFO_INDEX_OVERLAY_OFFSET_ADJUSTMENT = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_SPACE_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_HEAP_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_GPU_VADDR_MAPPBLE_SIZE_KB = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_EFFECTIVE_BW = (0x0000000F) +NV2080_CTRL_FB_INFO_INDEX_FB_TAX_SIZE_KB = (0x00000010) +NV2080_CTRL_FB_INFO_INDEX_HEAP_BASE_KB = (0x00000011) +NV2080_CTRL_FB_INFO_INDEX_LARGEST_FREE_REGION_SIZE_KB = (0x00000012) +NV2080_CTRL_FB_INFO_INDEX_LARGEST_FREE_REGION_BASE_KB = (0x00000013) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK = (0x00000014) +NV2080_CTRL_FB_INFO_INDEX_VISTA_RESERVED_HEAP_SIZE = (0x00000015) +NV2080_CTRL_FB_INFO_INDEX_HEAP_FREE = (0x00000016) +NV2080_CTRL_FB_INFO_INDEX_RAM_LOCATION = (0x00000017) +NV2080_CTRL_FB_INFO_INDEX_FB_IS_BROKEN = (0x00000018) +NV2080_CTRL_FB_INFO_INDEX_FBP_COUNT = (0x00000019) +NV2080_CTRL_FB_INFO_INDEX_FBP_MASK = (0x0000001A) +NV2080_CTRL_FB_INFO_INDEX_L2CACHE_SIZE = (0x0000001B) +NV2080_CTRL_FB_INFO_INDEX_MEMORYINFO_VENDOR_ID = (0x0000001C) +NV2080_CTRL_FB_INFO_INDEX_BAR1_AVAIL_SIZE = (0x0000001D) +NV2080_CTRL_FB_INFO_INDEX_HEAP_START = (0x0000001E) +NV2080_CTRL_FB_INFO_INDEX_BAR1_MAX_CONTIGUOUS_AVAIL_SIZE = (0x0000001F) +NV2080_CTRL_FB_INFO_INDEX_USABLE_RAM_SIZE = (0x00000020) +NV2080_CTRL_FB_INFO_INDEX_TRAINIG_2T = (0x00000021) +NV2080_CTRL_FB_INFO_INDEX_LTC_COUNT = (0x00000022) +NV2080_CTRL_FB_INFO_INDEX_LTS_COUNT = (0x00000023) +NV2080_CTRL_FB_INFO_INDEX_L2CACHE_ONLY_MODE = (0x00000024) +NV2080_CTRL_FB_INFO_INDEX_PSEUDO_CHANNEL_MODE = (0x00000025) +NV2080_CTRL_FB_INFO_INDEX_SMOOTHDISP_RSVD_BAR1_SIZE = (0x00000026) +NV2080_CTRL_FB_INFO_INDEX_HEAP_OFFLINE_SIZE = (0x00000027) +NV2080_CTRL_FB_INFO_INDEX_1TO1_COMPTAG_ENABLED = (0x00000028) +NV2080_CTRL_FB_INFO_INDEX_SUSPEND_RESUME_RSVD_SIZE = (0x00000029) +NV2080_CTRL_FB_INFO_INDEX_ALLOW_PAGE_RETIREMENT = (0x0000002A) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK = (0x0000002B) +NV2080_CTRL_FB_INFO_POISON_FUSE_ENABLED = (0x0000002C) +NV2080_CTRL_FB_INFO_FBPA_ECC_ENABLED = (0x0000002D) +NV2080_CTRL_FB_INFO_DYNAMIC_PAGE_OFFLINING_ENABLED = (0x0000002E) +NV2080_CTRL_FB_INFO_INDEX_FORCED_BAR1_64KB_MAPPING_ENABLED = (0x0000002F) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_SIZE = (0x00000030) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_ALIGNMENT = (0x00000031) +NV2080_CTRL_FB_INFO_INDEX_P2P_MAILBOX_BAR1_MAX_OFFSET_64KB = (0x00000032) +NV2080_CTRL_FB_INFO_INDEX_PROTECTED_MEM_SIZE_TOTAL_KB = (0x00000033) +NV2080_CTRL_FB_INFO_INDEX_PROTECTED_MEM_SIZE_FREE_KB = (0x00000034) +NV2080_CTRL_FB_INFO_INDEX_ECC_STATUS_SIZE = (0x00000035) +NV2080_CTRL_FB_INFO_INDEX_IS_ZERO_FB = (0x00000036) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK_0 = (NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK_1 = (0x00000037) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_0 = (NV2080_CTRL_FB_INFO_INDEX_LTC_MASK) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_1 = (0x00000038) +NV2080_CTRL_FB_INFO_INDEX_ACCESS_COUNTER_BUFFER_COUNT = (0x00000039) +NV2080_CTRL_FB_INFO_INDEX_COHERENCE_INFO = (0x0000003A) +NV2080_CTRL_FB_INFO_INDEX_NUMA_NODE_ID = (0x0000003B) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK_2 = (0x0000003C) +NV2080_CTRL_FB_INFO_INDEX_PARTITION_MASK_3 = (0x0000003D) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_2 = (0x0000003E) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_3 = (0x0000003F) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_4 = (0x00000040) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_5 = (0x00000041) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_6 = (0x00000042) +NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_7 = (0x00000043) +NV2080_CTRL_FB_INFO_INDEX_MAX = NV2080_CTRL_FB_INFO_INDEX_LTC_MASK_7 +NV2080_CTRL_FB_INFO_MAX_LIST_SIZE = (0x00000080) +NV2080_CTRL_FB_INFO_RAM_TYPE_UNKNOWN = (0x00000000) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDRAM = (0x00000001) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR1 = (0x00000002) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR2 = (0x00000003) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR2 = NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR2 +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR2 = (0x00000004) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR3 = (0x00000005) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR4 = (0x00000006) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR3 = (0x00000007) +NV2080_CTRL_FB_INFO_RAM_TYPE_DDR3 = NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR3 +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR5 = (0x00000008) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR2 = (0x00000009) +NV2080_CTRL_FB_INFO_RAM_TYPE_SDDR4 = (0x0000000C) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR4 = (0x0000000D) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM1 = (0x0000000E) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM2 = (0x0000000F) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR5X = (0x00000010) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR6 = (0x00000011) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR6X = (0x00000012) +NV2080_CTRL_FB_INFO_RAM_TYPE_LPDDR5 = (0x00000013) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM3 = (0x00000014) +NV2080_CTRL_FB_INFO_RAM_TYPE_GDDR7 = (0x00000015) +NV2080_CTRL_FB_INFO_RAM_TYPE_HBM4 = (0x00000016) +NV2080_CTRL_FB_INFO_RAM_LOCATION_GPU_DEDICATED = (0x00000000) +NV2080_CTRL_FB_INFO_RAM_LOCATION_SYS_SHARED = (0x00000001) +NV2080_CTRL_FB_INFO_RAM_LOCATION_SYS_DEDICATED = (0x00000002) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_SAMSUNG = (0x00000001) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_QIMONDA = (0x00000002) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ELPIDA = (0x00000003) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ETRON = (0x00000004) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_NANYA = (0x00000005) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_HYNIX = (0x00000006) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_MOSEL = (0x00000007) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_WINBOND = (0x00000008) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_ESMT = (0x00000009) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_MICRON = (0x0000000F) +NV2080_CTRL_FB_INFO_MEMORYINFO_VENDOR_ID_UNKNOWN = (0xFFFFFFFF) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_UNSUPPORTED = (0x00000000) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_DISABLED = (0x00000001) +NV2080_CTRL_FB_INFO_PSEUDO_CHANNEL_MODE_ENABLED = (0x00000002) +NV2080_CTRL_FB_INFO_INDEX_COHERENCE_INFO_NON_FULLY_COHERENT = (0x00000000) +NV2080_CTRL_FB_INFO_INDEX_COHERENCE_INFO_FULLY_COHERENT = (0x00000001) +NV2080_CTRL_CMD_FB_GET_INFO = (0x20801301) +NV2080_CTRL_FB_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_FB_GET_INFO_V2 = (0x20801303) +NV2080_CTRL_FB_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_FB_GET_BAR1_OFFSET = (0x20801310) +NV2080_CTRL_FB_GET_BAR1_OFFSET_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_CMD_FB_GET_CALIBRATION_LOCK_FAILED = (0x2080130c) +NV2080_CTRL_FB_GET_CALIBRATION_LOCK_FAILED_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_FB_GET_CAL_FLAG_NONE = (0x00000000) +NV2080_CTRL_CMD_FB_GET_CAL_FLAG_RESET = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL = (0x2080130d) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK = (0, 0) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_WRITE_BACK_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE = (1, 1) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_INVALIDATE_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH = (2, 2) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH_NO = (0x00000000) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE_IRQL_FLAGS_FB_FLUSH_YES = (0x00000001) +NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE = (0x2080130e) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_MAX_ADDRESSES = 500 +NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE = (1, 0) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_VIDEO_MEMORY = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_SYSTEM_MEMORY = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_APERTURE_PEER_MEMORY = (0x00000002) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK = (2, 2) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK_YES = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE = (3, 3) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE_YES = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE = (4, 4) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE_ADDRESS_ARRAY = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE_FULL_CACHE = (0x00000001) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH = (5, 5) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH_NO = (0x00000000) +NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FB_FLUSH_YES = (0x00000001) +NV2080_CTRL_CMD_FB_IS_KIND = (0x20801313) +NV2080_CTRL_FB_IS_KIND_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_FB_IS_KIND_OPERATION_SUPPORTED = (0x00000000) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE = (0x00000001) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_1 = (0x00000002) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_2 = (0x00000003) +NV2080_CTRL_FB_IS_KIND_OPERATION_COMPRESSIBLE_4 = (0x00000004) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC = (0x00000005) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_1 = (0x00000006) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_2 = (0x00000007) +NV2080_CTRL_FB_IS_KIND_OPERATION_ZBC_ALLOWS_4 = (0x00000008) +NV2080_CTRL_CMD_FB_GET_GPU_CACHE_INFO = (0x20801315) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_POWER_STATE_ENABLED = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_POWER_STATE_DISABLED = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_WRITE_MODE_WRITETHROUGH = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_WRITE_MODE_WRITEBACK = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_BYPASS_MODE_DISABLED = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_BYPASS_MODE_ENABLED = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_FULL = (0x00000000) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_TRANSITIONING = (0x00000001) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_REDUCED = (0x00000002) +NV2080_CTRL_FB_GET_GPU_CACHE_INFO_RCM_STATE_ZERO_CACHE = (0x00000003) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO = (0x20801320) +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_MEM_TYPES = 18 +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_MAX_ENTRIES = 16 +NV2080_CTRL_CMD_FB_GET_FB_REGION_INFO_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FB_OFFLINE_PAGES = (0x20801321) +NV2080_CTRL_FB_OFFLINED_PAGES_MAX_PAGES = (0x00000040) +NV2080_CTRL_FB_OFFLINED_PAGES_INVALID_ADDRESS = (0xffffffffffffffff) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_4K = (0x00000000) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_64K = (0x00000001) +NV2080_CTRL_FB_OFFLINED_PAGES_PAGE_SIZE_128K = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_MULTIPLE_SBE = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_DBE = (0x00000004) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_OK = (0x00000000) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_PENDING_RETIREMENT = (0x00000001) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_BLACKLISTING_FAILED = (0x00000002) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_TABLE_FULL = (0x00000003) +NV2080_CTRL_FB_OFFLINED_PAGES_STATUS_INTERNAL_ERROR = (0x00000004) +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_MULTIPLE_SBE = NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_MULTIPLE_SBE +NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DBE = NV2080_CTRL_FB_OFFLINED_PAGES_SOURCE_DPR_DBE +NV2080_CTRL_FB_OFFLINE_PAGES_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_FB_GET_OFFLINED_PAGES = (0x20801322) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE = (0, 0) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE_FALSE = 0 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_SBE_TRUE = 1 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE = (1, 1) +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE_FALSE = 0 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_RETIREMENT_PENDING_DBE_TRUE = 1 +NV2080_CTRL_FB_GET_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION = (0x20801325) +NV2080_CTRL_CMD_FB_ACR_CLIENT_ID = 2 +NV2080_CTRL_CMD_FB_QUERY_ACR_REGION_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_FB_CLEAR_OFFLINED_PAGES = (0x20801326) +NV2080_CTRL_FB_CLEAR_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO = (0x20801327) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_INFO_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_FB_GET_LTC_INFO_FOR_FBP = (0x20801328) +NV2080_CTRL_FB_GET_LTC_INFO_FOR_FBP_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_CONTEXT = (0x20801329) +NV2080_CTRL_CMD_FB_COMPBITCOPY_GET_COMPBITS = (0x2080132a) +NV2080_CTRL_CMD_FB_COMPBITCOPY_PUT_COMPBITS = (0x2080132b) +NV2080_CTRL_CMD_FB_COMPBITCOPY_READ_COMPBITS64KB = (0x2080132c) +NV2080_CTRL_CMD_FB_COMPBITCOPY_WRITE_COMPBITS64KB = (0x2080132d) +NV2080_CTRL_CMD_FB_COMPBITCOPY_SET_FORCE_BAR1 = (0x20801335) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF = (0x20801336) +NV2080_CTRL_CMD_FB_GET_AMAP_CONF_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_FB_CBC_OP = (0x20801337) +NV2080_CTRL_CMD_FB_CBC_OP_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_FB_GET_CTAGS_FOR_CBC_EVICTION = (0x20801338) +NV2080_MAX_CTAGS_FOR_CBC_EVICTION = 0x7F +NV2080_CTRL_FB_GET_CTAGS_FOR_CBC_EVICTION_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE = (0x20801339) +NV2080_CTRL_CMD_FB_ALLOC_COMP_RESOURCE_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_FB_FREE_TILE = (0x2080133a) +NV2080_CTRL_CMD_FB_FREE_TILE_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION = (0x2080133b) +NV2080_CTRL_CMD_FB_SETUP_VPR_REGION_PARAMS_MESSAGE_ID = (0x3B) +NV2080_CTRL_CMD_FB_GET_CLI_MANAGED_OFFLINED_PAGES = (0x2080133c) +NV2080_CTRL_FB_GET_CLI_MANAGED_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x3C) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO = (0x2080133d) +NV2080_CTRL_CMD_FB_GET_COMPBITCOPY_CONSTRUCT_INFO_PARAMS_MESSAGE_ID = (0x3D) +NV2080_CTRL_CMD_FB_SET_RRD = (0x2080133e) +NV2080_CTRL_FB_SET_RRD_PARAMS_MESSAGE_ID = (0x3E) +NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE = (0xff) +NV2080_CTRL_CMD_FB_SET_READ_LIMIT = (0x2080133f) +NV2080_CTRL_FB_SET_READ_LIMIT_RESET_VALUE = NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE +NV2080_CTRL_FB_SET_READ_LIMIT_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_FB_SET_WRITE_LIMIT = (0x20801340) +NV2080_CTRL_FB_SET_WRITE_LIMIT_RESET_VALUE = NV2080_CTRL_FB_SET_READ_WRITE_LIMIT_RESET_VALUE +NV2080_CTRL_FB_SET_WRITE_LIMIT_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_FB_PATCH_PBR_FOR_MINING = (0x20801341) +NV2080_CTRL_FB_PATCH_PBR_FOR_MINING_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_CMD_FB_GET_MEM_ALIGNMENT = (0x20801342) +NV2080_CTRL_FB_GET_MEM_ALIGNMENT_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR = (0x20801343) +NV2080_CTRL_CMD_FB_GET_CBC_BASE_ADDR_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING = (0, 0) +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_FALSE = 0 +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_TRUE = 1 +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_ACTIVE = (1, 1) +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_ACTIVE_FALSE = 0 +NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_ACTIVE_TRUE = 1 +NV2080_CTRL_FB_REMAPPED_ROW_SOURCE_SBE_FIELD = (0x00000002) +NV2080_CTRL_FB_REMAPPED_ROW_SOURCE_DBE_FIELD = (0x00000003) +NV2080_CTRL_FB_REMAPPED_ROWS_MAX_ROWS = (0x00000200) +NV2080_CTRL_CMD_FB_GET_REMAPPED_ROWS = (0x20801344) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING_FALSE = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_FALSE +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_PENDING_TRUE = NV2080_CTRL_FB_REMAP_ENTRY_FLAGS_PENDING_TRUE +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE = (1, 1) +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE_FALSE = 0 +NV2080_CTRL_FB_GET_REMAPPED_ROWS_FLAGS_FAILURE_TRUE = 1 +NV2080_CTRL_FB_GET_REMAPPED_ROWS_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_FB_FS_INFO_MAX_QUERY_SIZE = 24 +NV2080_CTRL_FB_FS_INFO_INVALID_QUERY = 0x0 +NV2080_CTRL_FB_FS_INFO_FBP_MASK = 0x1 +NV2080_CTRL_FB_FS_INFO_LTC_MASK = 0x2 +NV2080_CTRL_FB_FS_INFO_LTS_MASK = 0x3 +NV2080_CTRL_FB_FS_INFO_FBPA_MASK = 0x4 +NV2080_CTRL_FB_FS_INFO_ROP_MASK = 0x5 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTC_MASK = 0x6 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LTS_MASK = 0x7 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_MASK = 0x8 +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_ROP_MASK = 0x9 +NV2080_CTRL_FB_FS_INFO_FBPA_SUBP_MASK = 0xA +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_FBPA_SUBP_MASK = 0xB +NV2080_CTRL_FB_FS_INFO_FBP_LOGICAL_MAP = 0xC +NV2080_CTRL_SYSL2_FS_INFO_SYSLTC_MASK = 0xD +NV2080_CTRL_FB_FS_INFO_PAC_MASK = 0xE +NV2080_CTRL_FB_FS_INFO_LOGICAL_LTC_MASK = 0xF +NV2080_CTRL_FB_FS_INFO_PROFILER_MON_LOGICAL_LTC_MASK = 0x10 +NV2080_CTRL_SYSL2_FS_INFO_SYSLTS_MASK = 0x11 +NV2080_CTRL_FB_FS_INFO_SYS_MASK = 0x12 +NV2080_CTRL_FB_FS_INFO_MAX_QUERIES = 120 +NV2080_CTRL_FB_GET_FS_INFO_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_CMD_FB_GET_FS_INFO = (0x20801346) +NV2080_CTRL_FB_HISTOGRAM_IDX_NO_REMAPPED_ROWS = (0x0) +NV2080_CTRL_FB_HISTOGRAM_IDX_SINGLE_REMAPPED_ROW = (0x1) +NV2080_CTRL_FB_HISTOGRAM_IDX_MIXED_REMAPPED_REMAINING_ROWS = (0x2) +NV2080_CTRL_FB_HISTOGRAM_IDX_SINGLE_REMAINING_ROW = (0x3) +NV2080_CTRL_FB_HISTOGRAM_IDX_MAX_REMAPPED_ROWS = (0x4) +NV2080_CTRL_FB_GET_ROW_REMAPPER_HISTOGRAM_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_FB_GET_ROW_REMAPPER_HISTOGRAM = (0x20801347) +NV2080_CTRL_CMD_FB_GET_DYNAMIC_OFFLINED_PAGES = (0x20801348) +NV2080_CTRL_FB_DYNAMIC_BLACKLIST_MAX_PAGES = 512 +NV2080_CTRL_FB_DYNAMIC_BLACKLIST_MAX_ENTRIES = 64 +NV2080_CTRL_FB_GET_DYNAMIC_OFFLINED_PAGES_PARAMS_MESSAGE_ID = (0x48) +NV2080_CTRL_FB_DYNAMIC_BLACKLISTED_PAGES_SOURCE_INVALID = (0x00000000) +NV2080_CTRL_FB_DYNAMIC_BLACKLISTED_PAGES_SOURCE_DPR_DBE = (0x00000001) +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO = (0x20801349) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE = (4, 0) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE_SYSMEM = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_TYPE_VIDMEM = 1 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED = (5, 5) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED_FALSE = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_SHARED_TRUE = 1 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER = (6, 6) +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER_FALSE = 0 +NV2080_CTRL_CMD_FB_ALLOCATION_FLAGS_OWNER_TRUE = 1 +NV2080_CTRL_CMD_FB_GET_CLIENT_ALLOCATION_INFO_PARAMS_MESSAGE_ID = (0x49) +NV2080_CTRL_CMD_FB_UPDATE_NUMA_STATUS = (0x20801350) +NV2080_CTRL_FB_UPDATE_NUMA_STATUS_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_FB_GET_NUMA_INFO = (0x20801351) +NV2080_CTRL_FB_NUMA_INFO_MAX_OFFLINE_ADDRESSES = 64 +NV2080_CTRL_FB_GET_NUMA_INFO_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_CMD_FB_GET_SEMAPHORE_SURFACE_LAYOUT = (0x20801352) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_CAPS_MONITORED_FENCE_SUPPORTED = (0x00000001) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_CAPS_64BIT_SEMAPHORES_SUPPORTED = (0x00000002) +NV2080_CTRL_FB_GET_SEMAPHORE_SURFACE_LAYOUT_PARAMS_MESSAGE_ID = (0x52) +NV2080_CTRL_CMD_GMMU_COMMIT_TLB_INVALIDATE = (0x20801353) +NV2080_CTRL_GMMU_COMMIT_TLB_INVALIDATE_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_FB_STATS_MAX_OWNER = 201 +NV2080_CTRL_CMD_RM_FB_STATS_ENTRY_MESSAGE_ID = (0x2A) +NV2080_CTRL_CMD_FB_STATS_GET = (0x2080132f) +NV2080_CTRL_CMD_FB_STATS_GET_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_GSP_FB_STATS_GET = (0x2080132a) +NV2080_CTRL_CMD_FB_GET_STATIC_BAR1_INFO = (0x20801354) +NV2080_CTRL_FB_GET_STATIC_BAR1_INFO_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION = (0x20801355) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_DISABLED = (0x00000000) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_ENABLED = (0x00000001) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_PENDING_CONFIGURATION_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_CMD_FB_SET_DRAM_ENCRYPTION_CONFIGURATION = (0x20801356) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_DISABLE = (0x00000000) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_ENABLE = (0x00000001) +NV2080_CTRL_FB_SET_DRAM_ENCRYPTION_CONFIGURATION_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT = (0x20801357) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT_DISABLED = (0x00000000) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT_ENABLED = (0x00000001) +NV2080_CTRL_FB_DRAM_ENCRYPTION_INFOROM_SUPPORT_PARAMS_MESSAGE_ID = (0x57) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS = (0x20801358) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS_DISABLED = (0x00000000) +NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_STATUS_ENABLED = (0x00000001) +NV2080_CTRL_FB_QUERY_DRAM_ENCRYPTION_STATUS_PARAMS_MESSAGE_ID = (0x58) +NV2080_CTRL_CMD_FB_GET_MEMORY_BOOT_TRAINING_FLAGS = (0x20801359) +NV2080_CTRL_FB_GET_MEMORY_BOOT_TRAINING_FLAGS_PARAMS_MESSAGE_ID = (0x59) +NV2080_CTRL_CMD_FB_GET_CARVEOUT_REGION_INFO = (0x20801360) +NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_MAX_ENTRIES = 8 +NV2080_CTRL_FB_GET_CARVEOUT_REGION_INFO_PARAMS_MESSAGE_ID = (0x60) +NV2080_CTRL_FB_REMAPPED_BANK_SOURCE_FIELD = (0x00000002) +NV2080_CTRL_FB_REMAPPED_BANKS_MAX_BANKS = (0x00000200) +NV2080_CTRL_CMD_FB_GET_REMAPPED_BANKS = (0x20801361) +NV2080_CTRL_FB_GET_REMAPPED_BANKS_FLAGS_PENDING = (0, 0) +NV2080_CTRL_FB_GET_REMAPPED_BANKS_FLAGS_PENDING_FALSE = 0 +NV2080_CTRL_FB_GET_REMAPPED_BANKS_FLAGS_PENDING_TRUE = 1 +NV2080_CTRL_FB_GET_REMAPPED_BANKS_PARAMS_MESSAGE_ID = (0x61) +NV2080_CTRL_CMD_FB_GET_UGPU_MEMORY_INFO = (0x20801362) +NV2080_CTRL_FB_GET_UGPU_MEMORY_INFO_MAX_UGPUS = 2 +NV2080_CTRL_FB_GET_UGPU_MEMORY_INFO_PARAMS_MESSAGE_ID = (0x62) +NV2080_CTRL_CMD_FB_GET_CPU_COHERENT_RANGE = (0x20801363) +NV2080_CTRL_FB_GET_CPU_COHERENT_RANGE_PARAMS_MESSAGE_ID = (0x63) +NV2080_CTRL_CMD_FB_GET_WPR_REGION_INFO = (0x20801364) +NV2080_CTRL_FB_GET_WPR_REGION_INFO_PARAMS_MESSAGE_ID = (0x64) +NV2080_CTRL_CMD_SET_GPFIFO = (0x20801102) +NV2080_CTRL_CMD_SET_GPFIFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_FIFO_GET_PHYSICAL_CHANNEL_COUNT = (0x20801108) +NV2080_CTRL_FIFO_GET_PHYSICAL_CHANNEL_COUNT_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_FIFO_INFO_INDEX_INSTANCE_TOTAL = (0x000000000) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNEL_GROUPS = (0x000000001) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNELS_PER_GROUP = (0x000000002) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_SUBCONTEXT_PER_GROUP = (0x000000003) +NV2080_CTRL_FIFO_INFO_INDEX_BAR1_USERD_START_OFFSET = (0x000000004) +NV2080_CTRL_FIFO_INFO_INDEX_DEFAULT_CHANNEL_TIMESLICE = (0x000000005) +NV2080_CTRL_FIFO_INFO_INDEX_CHANNEL_GROUPS_IN_USE = (0x000000006) +NV2080_CTRL_FIFO_INFO_INDEX_IS_PER_RUNLIST_CHANNEL_RAM_SUPPORTED = (0x000000007) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_CHANNEL_GROUPS_PER_ENGINE = (0x000000008) +NV2080_CTRL_FIFO_INFO_INDEX_CHANNEL_GROUPS_IN_USE_PER_ENGINE = (0x000000009) +NV2080_CTRL_FIFO_INFO_INDEX_MAX_LOWER_SUBCONTEXT = (0x00000000a) +NV2080_CTRL_FIFO_INFO_INDEX_MAX = NV2080_CTRL_FIFO_INFO_INDEX_MAX_LOWER_SUBCONTEXT +NV2080_CTRL_FIFO_GET_INFO_USERD_OFFSET_SHIFT = (12) +NV2080_CTRL_CMD_FIFO_GET_INFO = (0x20801109) +NV2080_CTRL_FIFO_GET_INFO_MAX_ENTRIES = (256) +NV2080_CTRL_FIFO_GET_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_FIFO_CHANNEL_PREEMPTIVE_REMOVAL = (0x2080110a) +NV2080_CTRL_FIFO_CHANNEL_PREEMPTIVE_REMOVAL_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS = (0x2080110b) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_MAX_ENTRIES = (64) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_FIFO_DISABLE_CHANNEL_FALSE = (0x00000000) +NV2080_CTRL_FIFO_DISABLE_CHANNEL_TRUE = (0x00000001) +NV2080_CTRL_FIFO_ONLY_DISABLE_SCHEDULING_FALSE = (0x00000000) +NV2080_CTRL_FIFO_ONLY_DISABLE_SCHEDULING_TRUE = (0x00000001) +NV2080_CTRL_FIFO_GET_CHANNEL_MEM_INFO_MAX_COUNT = 0x2 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO = (0x2080110c) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_INFO_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_INVALID = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_VIDMEM = 0x00000001 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_SYSMEM_COH = 0x00000002 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_MEM_APERTURE_SYSMEM_NCOH = 0x00000003 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION = (0x2080110d) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_APERTURE_VIDMEM = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_APERTURE_SYSMEM = 0x00000001 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_CACHED = 0x00000000 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_UNCACHED = 0X00000001 +NV2080_CTRL_CMD_FIFO_GET_USERD_LOCATION_ATTRIBUTE_WRITECOMBINED = 0X00000002 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_UNKNOWN = 0 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_OTHER = 1 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_BEST_EFFORT = 2 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_EQUAL_SHARE = 3 +NV2080_CTRL_CMD_VGPU_SCHEDULER_POLICY_FIXED_SHARE = 4 +NV2080_CTRL_CMD_SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT = 3 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_DEFAULT = 0 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_DISABLE = 1 +NV2080_CTRL_CMD_VGPU_SCHEDULER_ARR_ENABLE = 2 +NV2080_CTRL_CMD_FIFO_OBJSCHED_SW_GET_LOG = (0x2080110e) +NV2080_CTRL_FIFO_OBJSCHED_SW_COUNT = 32 +NV2080_CTRL_FIFO_OBJSCHED_SW_NCOUNTERS = 8 +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_ENTRIES = 200 +NV2080_CTRL_FIFO_OBJSCHED_SW_GET_LOG_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_FIFO_CONFIG_CTXSW_TIMEOUT = (0x20801110) +NV2080_CTRL_FIFO_CONFIG_CTXSW_TIMEOUT_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_CMD_FIFO_GET_DEVICE_INFO_TABLE = (0x20801112) +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_MAX_DEVICES = 256 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_MAX_ENTRIES = 32 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_DATA_TYPES = 16 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_MAX_PBDMA = 2 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_ENGINE_MAX_NAME_LEN = 16 +NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT = (0x20801113) +NV2080_CTRL_FIFO_CLEAR_FAULTED_BIT_FAULT_TYPE_ENGINE = 0x00000001 +NV2080_CTRL_FIFO_CLEAR_FAULTED_BIT_FAULT_TYPE_PBDMA = 0x00000002 +NV2080_CTRL_CMD_FIFO_CLEAR_FAULTED_BIT_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY = (0x20801115) +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_DEFAULT = 0x0 +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_CHANNEL_INTERLEAVED = 0x1 +NV2080_CTRL_FIFO_RUNLIST_SCHED_POLICY_CHANNEL_INTERLEAVED_WDDM = 0x2 +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE = (0, 0) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE_FALSE = (0x00000000) +NV2080_CTRL_CMD_FIFO_RUNLIST_SET_SCHED_POLICY_FLAGS_RESTORE_TRUE = (0x00000001) +NV2080_CTRL_FIFO_RUNLIST_SET_SCHED_POLICY_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_FIFO_UPDATE_CHANNEL_INFO = (0x20801116) +NV2080_CTRL_FIFO_UPDATE_CHANNEL_INFO_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_CMD_FIFO_DISABLE_USERMODE_CHANNELS = (0x20801117) +NV2080_CTRL_FIFO_DISABLE_USERMODE_CHANNELS_PARAMS_MESSAGE_ID = (0x17) +NV2080_CTRL_CMD_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB = (0x20801118) +NV2080_CTRL_FIFO_SETUP_VF_ZOMBIE_SUBCTX_PDB_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_FIFO_GET_ALLOCATED_CHANNELS = (0x20801119) +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_MAX_CHANNELS = 4096 +NV2080_CTRL_FIFO_GET_ALLOCATED_CHANNELS_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION = (0x2080111a) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_MAX_ENTRIES = (64) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_PARAMS_MESSAGE_ID = (0x1A) +NV2080_CTRL_CMD_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2 = (0x2080111b) +NV2080_CTRL_FIFO_DISABLE_CHANNELS_FOR_KEY_ROTATION_V2_PARAMS_MESSAGE_ID = (0x1B) +NV2080_CTRL_CMD_FIFO_ROTATE_KEYS = (0x2080111c) +NV2080_CTRL_CMD_FIFO_ROTATE_KEYS_PARAMS_MESSAGE_ID = (0x1C) +NV2080_CTRL_CMD_FIFO_OBJSCHED_GET_STATE = (0x20801120) +NV2080_CTRL_FIFO_OBJSCHED_GET_STATE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FIFO_OBJSCHED_SET_STATE = (0x20801121) +NV2080_CTRL_FIFO_OBJSCHED_SET_STATE_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_FIFO_OBJSCHED_GET_CAPS = (0x20801122) +NV2080_CTRL_FIFO_OBJSCHED_GET_CAPS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_FIFO_MAX_CHANNELS_PER_TSG = 128 +NV2080_CTRL_CMD_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO = (0x20801123) +NV2080_CTRL_FIFO_GET_CHANNEL_GROUP_UNIQUE_ID_INFO_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_FIFO_QUERY_CHANNEL_UNIQUE_ID = (0x20801124) +NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_FLA_RANGE = (0x20803501) +NV2080_CTRL_FLA_RANGE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_NONE = 0x00000000 +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_INITIALIZE = NVBIT(0) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_DESTROY = NVBIT(1) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_HOST_MANAGED_VAS_INITIALIZE = NVBIT(2) +NV2080_CTRL_FLA_RANGE_PARAMS_MODE_HOST_MANAGED_VAS_DESTROY = NVBIT(3) +NV2080_CTRL_CMD_FLA_SETUP_INSTANCE_MEM_BLOCK = (0x20803502) +NV2080_CTRL_FLA_SETUP_INSTANCE_MEM_BLOCK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_FLA_GET_RANGE = (0x20803503) +NV2080_CTRL_FLA_GET_RANGE_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_FLA_GET_FABRIC_MEM_STATS = (0x20803504) +NV2080_CTRL_FLA_GET_FABRIC_MEM_STATS_PARAMS_MESSAGE_ID = (0x4) +FALCON_ID_PMU = (NV2080_ENGINE_TYPE_PMU) +FALCON_ID_DPU = (NV2080_ENGINE_TYPE_DPU) +FALCON_ID_SEC2 = (NV2080_ENGINE_TYPE_SEC2) +FALCON_ID_FBFLCN = (NV2080_ENGINE_TYPE_FBFLCN) +NV2080_CTRL_CMD_FLCN_GET_DMEM_USAGE = (0x20803101) +NV2080_CTRL_FLCN_GET_DMEM_USAGE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_FLCN_NVOS_INST_EVT_RSVD_DO_NOT_USE = 0x00 +NV2080_CTRL_FLCN_NVOS_INST_EVT_CTXSW_END = 0x01 +NV2080_CTRL_FLCN_NVOS_INST_EVT_HW_IRQ_BEGIN = 0x02 +NV2080_CTRL_FLCN_NVOS_INST_EVT_HW_IRQ_END = 0x03 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TIMER_TICK = 0x04 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_BEGIN = 0x05 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_END = 0x06 +NV2080_CTRL_FLCN_NVOS_INST_EVT_RM_QUEUE_LATENCY = 0x07 +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_SPECIAL_EVENT = 0x08 +NV2080_CTRL_FLCN_NVOS_INST_EVT_UNUSED_0 = 0x09 +NV2080_CTRL_FLCN_NVOS_INST_EVT_DMA_END = 0x0A +NV2080_CTRL_FLCN_NVOS_INST_EVT_GENERIC_BEGIN = 0x0B +NV2080_CTRL_FLCN_NVOS_INST_EVT_GENERIC_END = 0x0C +NV2080_CTRL_FLCN_NVOS_INST_EVT_TASK_EVENT_LATENCY = 0x0D +NV2080_CTRL_FLCN_NVOS_INST_INVALID_TASK_ID = 0xFF +NV2080_CTRL_CMD_FLCN_GET_ENGINE_ARCH = (0x20803118) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_DEFAULT = 0x0 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_FALCON = 0x1 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_RISCV = 0x2 +NV2080_CTRL_FLCN_GET_ENGINE_ARCH_RISCV_EB = 0x3 +NV2080_CTRL_FLCN_USTREAMER_EVENT_COMM_FLAG = (31, 31) +NV2080_CTRL_FLCN_USTREAMER_EVENT_COMM_HEAD = (30, 30) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_VARIABLE = (29, 29) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EXTEND = (28, 28) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTID_DRF_EXTENT = (27) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTID_DRF_BASE = (20) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTIDCOMPACT_DRF_EXTENT = (28) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_EVENTIDCOMPACT_DRF_BASE = (24) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_LENGTH = (19, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOAD = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT = (23, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_HEAD_TIME = (29, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_DATA_PAYLOAD = (30, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON = (10, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_YIELD = 0x0 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_INT0 = 0x1 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_TIMER_TICK = 0x2 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_QUEUE_BLOCK = 0x3 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_REASON_DMA_SUSPENDED = 0x4 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_CTXSW_END_ODP_MISS_COUNT = (23, 11) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TIMER_TICK_TIME_SLIP = (23, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_UNIT_ID = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_BEGIN_EVENT_TYPE = (23, 16) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_CALLBACK_ID = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_RPC_FUNC = (15, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_RPC_FUNC_BOBJ_CMD_BASE = 0xF0 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_END_CLASS_ID = (23, 16) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_RM_QUEUE_LATENCY_SHIFT = 10 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_TASK_ID = (7, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID = (23, 8) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID_RESERVED = 0x000000 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_SPECIAL_EVENT_ID_CB_ENQUEUE_FAIL = 0x000001 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_TASK_EVENT_LATENCY_SHIFT = 6 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID = (11, 0) +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID_INVALID = 0x000 +NV2080_CTRL_FLCN_USTREAMER_EVENT_TAIL_PAYLOADCOMPACT_GENERIC_ID_VF_SWITCH_TOTAL = 0x001 +NV2080_CTRL_FLCN_USTREAMER_FEATURE_DEFAULT = 0 +NV2080_CTRL_FLCN_USTREAMER_FEATURE__COUNT = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH = (0, 0) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH = (1, 1) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_FULL_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH = (2, 2) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH_DISABLED = 0 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IMMEDIATE_FLUSH_ENABLED = 1 +NV2080_CTRL_FLCN_USTREAMER_QUEUE_POLICY_IDLE_THRESHOLD = (31, 8) +NV2080_CTRL_FLCN_USTREAMER_NUM_EVT_TYPES_COMPACT = (0x20) +NV2080_CTRL_FLCN_USTREAMER_NUM_EVT_TYPES = (0x120) +NV2080_CTRL_FLCN_USTREAMER_MASK_SIZE_BYTES = (0x24) +NV2080_CTRL_CMD_FLCN_USTREAMER_QUEUE_INFO = (0x20803120) +NV2080_CTRL_FLCN_USTREAMER_QUEUE_INFO_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_FLCN_USTREAMER_CONTROL_GET = (0x20803122) +NV2080_CTRL_CMD_FLCN_USTREAMER_CONTROL_SET = (0x20803123) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_GET_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_FLCN_USTREAMER_CONTROL_SET_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_FLCN_GET_CTX_BUFFER_INFO = (0x20803124) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_FLCN_GET_CTX_BUFFER_SIZE = (0x20803125) +NV2080_CTRL_FLCN_GET_CTX_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_INTERNAL_GPIO_PROGRAM_DIRECTION = (0x20802300) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_DIRECTION_PARAMS_MESSAGE_ID = (0x00) +NV2080_CTRL_CMD_INTERNAL_GPIO_PROGRAM_OUTPUT = (0x20802301) +NV2080_CTRL_INTERNAL_GPIO_PROGRAM_OUTPUT_PARAMS_MESSAGE_ID = (0x01) +NV2080_CTRL_CMD_INTERNAL_GPIO_READ_INPUT = (0x20802302) +NV2080_CTRL_INTERNAL_GPIO_READ_INPUT_PARAMS_MESSAGE_ID = (0x02) +NV2080_CTRL_CMD_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION = (0x20802303) +NV2080_CTRL_INTERNAL_GPIO_ACTIVATE_HW_FUNCTION_PARAMS_MESSAGE_ID = (0x03) +NV_GRID_LICENSE_INFO_MAX_LENGTH = (128) +NV_GRID_LICENSE_FEATURE_VPC_EDITION = "GRID-Virtual-PC,2.0;Quadro-Virtual-DWS,5.0;GRID-Virtual-WS,2.0;GRID-Virtual-WS-Ext,2.0" +NV_GRID_LICENSE_FEATURE_VAPPS_EDITION = "GRID-Virtual-Apps,3.0" +NV_GRID_LICENSE_FEATURE_VIRTUAL_WORKSTATION_EDITION = "Quadro-Virtual-DWS,5.0;GRID-Virtual-WS,2.0;GRID-Virtual-WS-Ext,2.0" +NV_GRID_LICENSE_FEATURE_GAMING_EDITION = "GRID-vGaming,8.0" +NV_GRID_LICENSE_FEATURE_COMPUTE_EDITION = "NVIDIA-vComputeServer,9.0" +NV_GRID_LICENSED_PRODUCT_VWS = "NVIDIA RTX Virtual Workstation" +NV_GRID_LICENSED_PRODUCT_GAMING = "NVIDIA Cloud Gaming" +NV_GRID_LICENSED_PRODUCT_VPC = "NVIDIA Virtual PC" +NV_GRID_LICENSED_PRODUCT_VAPPS = "NVIDIA Virtual Applications" +NV_GRID_LICENSED_PRODUCT_COMPUTE = "NVIDIA Virtual Compute Server" +NV_GRID_LICENSED_PRODUCT_VGPU_FOR_COMPUTE = "NVIDIA vGPU for Compute" +NV2080_CTRL_GPU_INFO_INDEX_INDEX = (23, 0) +NV2080_CTRL_GPU_INFO_INDEX_ECID_LO32 = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_ECID_HI32 = (0x00000002) +NV2080_CTRL_GPU_INFO_INDEX_MINOR_REVISION_EXT = (0x00000004) +NV2080_CTRL_GPU_INFO_INDEX_NETLIST_REV0 = (0x00000012) +NV2080_CTRL_GPU_INFO_INDEX_NETLIST_REV1 = (0x00000013) +NV2080_CTRL_GPU_INFO_INDEX_ECID_EXTENDED = (0x0000001b) +NV2080_CTRL_GPU_INFO_INDEX_SYSMEM_ACCESS = (0x0000001f) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD = (0x00000022) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE = (0x00000025) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED = (0x00000027) +NV2080_CTRL_GPU_INFO_INDEX_NVSWITCH_PROXY_DETECTED = (0x00000028) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT = (0x00000029) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SMC_MODE = (0x0000002a) +NV2080_CTRL_GPU_INFO_INDEX_SPLIT_VAS_MGMT_SERVER_CLIENT_RM = (0x0000002b) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SM_VERSION = (0x0000002c) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY = (0x0000002d) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM = (0x0000002f) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY = (0x00000030) +NV2080_CTRL_GPU_INFO_INDEX_NVENC_STATS_REPORTING_STATE = (0x00000031) +NV2080_CTRL_GPU_INFO_INDEX_DISPLAY_ENABLED = (0x00000034) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED = (0x00000035) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY = (0x00000036) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY = (0x00000037) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY = (0x0000003a) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY = (0x0000003b) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU = (0x0000003c) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY = (0x0000003d) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED = (0x0000003f) +NV2080_CTRL_GPU_INFO_INDEX_IS_LOCALIZATION_SUPPORTED = (0x00000041) +NV2080_CTRL_GPU_INFO_INDEX_GPU_NON_PASID_ATS_CAPABILITY = (0x00000042) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_SYSMEM_CAPABILITY = (0x00000043) +NV2080_CTRL_GPU_INFO_INDEX_COHERENT_GPU_MEMORY_MODE = (0x00000044) +NV2080_CTRL_GPU_INFO_INDEX_COMPR_BIT_BACKING_COPY_TYPE = (0x00000045) +NV2080_CTRL_GPU_INFO_INDEX_CPU_COHERENT_CACHING_GPU_MEMORY_CAPABILITY = (0x00000046) +NV2080_CTRL_GPU_INFO_INDEX_GPU_COHERENT_CACHING_CPU_MEMORY_CAPABILITY = (0x00000047) +NV2080_CTRL_GPU_INFO_MAX_LIST_SIZE = (0x00000048) +NV2080_CTRL_GPU_INFO_INDEX_TYPE = (30, 28) +NV2080_CTRL_GPU_INFO_INDEX_TYPE_SPECIFIC_ID = (27, 24) +NV2080_CTRL_GPU_INFO_INDEX_RESERVED = (31, 31) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_NONE = (0x00000000) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_P = (0x00000001) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_V = (0x00000002) +NV2080_CTRL_GPU_INFO_MINOR_REVISION_EXT_PV = (0x00000003) +NV2080_CTRL_GPU_INFO_SYSMEM_ACCESS_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_SYSMEM_ACCESS_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GEMINI_BOARD_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_SURPRISE_REMOVAL_POSSIBLE_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GLOBAL_POISON_FUSE_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_NVSWITCH_PROXY_DETECTED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_NVSWITCH_PROXY_DETECTED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SR_SUPPORT_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_UNSUPPORTED = (0x00000000) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_DISABLED = (0x00000002) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_ENABLE_PENDING = (0x00000003) +NV2080_CTRL_GPU_INFO_GPU_SMC_MODE_DISABLE_PENDING = (0x00000004) +NV2080_CTRL_GPU_INFO_SPLIT_VAS_MGMT_SERVER_CLIENT_RM_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_SPLIT_VAS_MGMT_SERVER_CLIENT_RM_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_PER_RUNLIST_CHANNEL_RAM_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_ATS_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_NVENC_STATS_REPORTING_STATE_NOT_SUPPORTED = (0x00000002) +NV2080_CTRL_GPU_INFO_DISPLAY_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_DISPLAY_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_MOBILE_CONFIG_ENABLED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_PROFILING_CAPABILITY_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY_DISABLED = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_DEBUGGING_CAPABILITY_ENABLED = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_LOCAL_EGM_PEERID = (31, 1) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_SELF_HOSTED_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_CMP_SKU_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_DMABUF_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_IS_RESETLESS_MIG_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_IS_LOCALIZATION_SUPPORTED_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_IS_LOCALIZATION_SUPPORTED_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_NON_PASID_ATS_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_NON_PASID_ATS_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_SYSMEM_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_FLA_SYSMEM_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_COHERENT_GPU_MEMORY_MODE_NONE = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_COHERENT_GPU_MEMORY_MODE_NUMA = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_COHERENT_GPU_MEMORY_MODE_DRIVER = (0x00000002) +NV2080_CTRL_GPU_INFO_INDEX_COMP_BIT_BACKING_COPY_TYPE_PHYSICAL = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_COMP_BIT_BACKING_COPY_TYPE_VIRTUAL = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_CPU_COHERENT_CACHING_GPU_MEMORY_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_CPU_COHERENT_CACHING_GPU_MEMORY_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_GPU_INFO_INDEX_GPU_COHERENT_CACHING_CPU_MEMORY_CAPABILITY_NO = (0x00000000) +NV2080_CTRL_GPU_INFO_INDEX_GPU_COHERENT_CACHING_CPU_MEMORY_CAPABILITY_YES = (0x00000001) +NV2080_CTRL_CMD_GPU_GET_INFO = (0x20800101) +NV2080_CTRL_GPU_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_GPU_GET_INFO_V2 = (0x20800102) +NV2080_CTRL_GPU_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_GPU_GET_NAME_STRING = (0x20800110) +NV2080_GPU_MAX_NAME_STRING_LENGTH = (0x0000040) +NV2080_CTRL_GPU_GET_NAME_STRING_FLAGS_TYPE = (31, 0) +NV2080_CTRL_GPU_GET_NAME_STRING_FLAGS_TYPE_ASCII = (0x00000000) +NV2080_CTRL_GPU_GET_NAME_STRING_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_CMD_GPU_GET_SHORT_NAME_STRING = (0x20800111) +NV2080_CTRL_GPU_GET_SHORT_NAME_STRING_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GPU_SET_POWER = (0x20800112) +NV2080_CTRL_GPU_SET_POWER_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_0 = (0x00000000) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_1 = (0x00000001) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_2 = (0x00000002) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_3 = (0x00000003) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_4 = (0x00000004) +NV2080_CTRL_GPU_SET_POWER_STATE_GPU_LEVEL_7 = (0x00000007) +NV2080_CTRL_CMD_GPU_GET_SDM = (0x20800118) +NV2080_CTRL_GPU_GET_SDM_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_GPU_SET_SDM = (0x20800120) +NV2080_CTRL_GPU_SET_SDM_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_GPU_GET_SIMULATION_INFO = (0x20800119) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_NONE = (0x00000000) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_MODS_AMODEL = (0x00000001) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_LIVE_AMODEL = (0x00000002) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_FMODEL = (0x00000003) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_RTL = (0x00000004) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_EMU = (0x00000005) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_EMU_LOW_POWER = (0x00000006) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA = (0x00000007) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA_RTL = (0x00000008) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_DFPGA_FMODEL = (0x00000009) +NV2080_CTRL_GPU_GET_SIMULATION_INFO_TYPE_UNKNOWN = (0xFFFFFFFF) +NV2080_CTRL_GPU_REG_OP_READ_32 = (0x00000000) +NV2080_CTRL_GPU_REG_OP_WRITE_32 = (0x00000001) +NV2080_CTRL_GPU_REG_OP_READ_64 = (0x00000002) +NV2080_CTRL_GPU_REG_OP_WRITE_64 = (0x00000003) +NV2080_CTRL_GPU_REG_OP_READ_08 = (0x00000004) +NV2080_CTRL_GPU_REG_OP_WRITE_08 = (0x00000005) +NV2080_CTRL_GPU_REG_OP_TYPE_GLOBAL = (0x00000000) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX = (0x00000001) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_TPC = (0x00000002) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_SM = (0x00000004) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_CROP = (0x00000008) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_ZROP = (0x00000010) +NV2080_CTRL_GPU_REG_OP_TYPE_FB = (0x00000020) +NV2080_CTRL_GPU_REG_OP_TYPE_GR_CTX_QUAD = (0x00000040) +NV2080_CTRL_GPU_REG_OP_TYPE_DEVICE = (0x00000080) +NV2080_CTRL_GPU_REG_OP_STATUS_SUCCESS = (0x00) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_OP = (0x01) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_TYPE = (0x02) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_OFFSET = (0x04) +NV2080_CTRL_GPU_REG_OP_STATUS_UNSUPPORTED_OP = (0x08) +NV2080_CTRL_GPU_REG_OP_STATUS_INVALID_MASK = (0x10) +NV2080_CTRL_GPU_REG_OP_STATUS_NOACCESS = (0x20) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS = (0x20800122) +NV2080_CTRL_GPU_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_GPU_GET_ENGINES = (0x20800123) +NV2080_CTRL_GPU_GET_ENGINES_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_GPU_GET_ENGINES_V2 = (0x20800170) +NV2080_GPU_MAX_ENGINES_LIST_SIZE = 0x54 +NV2080_CTRL_GPU_GET_ENGINES_V2_PARAMS_MESSAGE_ID = (0x70) +NV2080_CTRL_CMD_GPU_GET_ENGINE_CLASSLIST = (0x20800124) +NV2080_CTRL_GPU_GET_ENGINE_CLASSLIST_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_GPU_GET_ENGINE_FAULT_INFO = (0x20800125) +NV2080_CTRL_GPU_GET_ENGINE_FAULT_INFO_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_MAIN = 0 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PM = 1 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PATCH = 2 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_BUFFER_BUNDLE_CB = 3 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PAGEPOOL = 4 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_ATTRIBUTE_CB = 5 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_RTV_CB_GLOBAL = 6 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GFXP_POOL = 7 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GFXP_CTRL_BLK = 8 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_FECS_EVENT = 9 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_PRIV_ACCESS_MAP = 10 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_UNRESTRICTED_PRIV_ACCESS_MAP = 11 +NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ID_GLOBAL_PRIV_ACCESS_MAP = 12 +NV2080_CTRL_GPU_PROMOTE_CONTEXT_MAX_ENTRIES = 16 +NV2080_CTRL_CMD_GPU_PROMOTE_CTX = (0x2080012b) +NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_GPU_EVICT_CTX = (0x2080012c) +NV2080_CTRL_GPU_EVICT_CTX_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_GPU_INITIALIZE_CTX = (0x2080012d) +NV2080_CTRL_GPU_INITIALIZE_CTX_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE = (1, 0) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_VIDMEM = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_COH_SYS = (0x00000001) +NV2080_CTRL_GPU_INITIALIZE_CTX_APERTURE_NCOH_SYS = (0x00000002) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE = (2, 2) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE_YES = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_GPU_CACHEABLE_NO = (0x00000001) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX = (3, 3) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX_NO = (0x00000000) +NV2080_CTRL_GPU_INITIALIZE_CTX_PRESERVE_CTX_YES = (0x00000001) +NV2080_CTRL_CMD_GPU_QUERY_ECC_INTR = (0x2080012e) +NV2080_CTRL_CMD_GPU_QUERY_ECC_STATUS = (0x2080012f) +NV2080_CTRL_GPU_ECC_UNIT_GSP = (0x0000001D) +NV2080_CTRL_GPU_ECC_UNIT_COUNT = (0x00000029) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE = (0, 0) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE_FILTERED = (0x00000000) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_FLAGS_TYPE_RAW = (0x00000001) +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_FALSE = 0 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_TRUE = 1 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_UNC_ERR_INDETERMINATE = 2 +NV2080_CTRL_GPU_QUERY_ECC_STATUS_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_GPU_SET_COMPUTE_MODE_RULES = (0x20800130) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_NONE = (0x00000000) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_EXCLUSIVE_COMPUTE = (0x00000001) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_COMPUTE_PROHIBITED = (0x00000002) +NV2080_CTRL_GPU_COMPUTE_MODE_RULES_EXCLUSIVE_COMPUTE_PROCESS = (0x00000003) +NV2080_CTRL_GPU_SET_COMPUTE_MODE_RULES_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_CMD_GPU_QUERY_COMPUTE_MODE_RULES = (0x20800131) +NV2080_CTRL_GPU_QUERY_COMPUTE_MODE_RULES_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_GPU_QUERY_ECC_CONFIGURATION = (0x20800133) +NV2080_CTRL_GPU_ECC_CONFIGURATION_DISABLED = (0x00000000) +NV2080_CTRL_GPU_ECC_CONFIGURATION_ENABLED = (0x00000001) +NV2080_CTRL_GPU_QUERY_ECC_CONFIGURATION_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_GPU_SET_ECC_CONFIGURATION = (0x20800134) +NV2080_CTRL_GPU_ECC_CONFIGURATION_DISABLE = (0x00000000) +NV2080_CTRL_GPU_ECC_CONFIGURATION_ENABLE = (0x00000001) +NV2080_CTRL_GPU_SET_ECC_CONFIGURATION_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_GPU_RESET_ECC_ERROR_STATUS = (0x20800136) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_NONE = (0x00000000) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_VOLATILE = (0x00000001) +NV2080_CTRL_GPU_ECC_ERROR_STATUS_AGGREGATE = (0x00000002) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE = (0, 0) +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE_FALSE = 0 +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_FLAGS_FORCE_PURGE_TRUE = 1 +NV2080_CTRL_GPU_RESET_ECC_ERROR_STATUS_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_GPU_GET_FERMI_GPC_INFO = (0x20800137) +NV2080_CTRL_GPU_GET_FERMI_GPC_INFO_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_GPU_GET_FERMI_TPC_INFO = (0x20800138) +NV2080_CTRL_GPU_GET_FERMI_TPC_INFO_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_GPU_GET_FERMI_ZCULL_INFO = (0x20800139) +NV2080_CTRL_GPU_GET_FERMI_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_GPU_GET_OEM_BOARD_INFO = (0x2080013f) +NV2080_GPU_MAX_MARKETING_NAME_LENGTH = (0x00000018) +NV2080_GPU_MAX_SERIAL_NUMBER_LENGTH = (0x00000010) +NV2080_GPU_MAX_MEMORY_PART_ID_LENGTH = (0x00000014) +NV2080_GPU_MAX_MEMORY_DATE_CODE_LENGTH = (0x00000006) +NV2080_GPU_MAX_PRODUCT_PART_NUMBER_LENGTH = (0x00000014) +NV2080_CTRL_GPU_GET_OEM_BOARD_INFO_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_GPU_GET_ID = (0x20800142) +NV2080_CTRL_GPU_GET_ID_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_GPU_SET_GPU_DEBUG_MODE = (0x20800143) +NV2080_CTRL_GPU_SET_GPU_DEBUG_MODE_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_GPU_DEBUG_MODE_ENABLED = (0x00000001) +NV2080_CTRL_GPU_DEBUG_MODE_DISABLED = (0x00000002) +NV2080_CTRL_CMD_GPU_GET_GPU_DEBUG_MODE = (0x20800144) +NV2080_CTRL_GPU_GET_GPU_DEBUG_MODE_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_GPU_GET_ENGINE_PARTNERLIST = (0x20800147) +NV2080_CTRL_GPU_MAX_ENGINE_PARTNERS = (0x00000020) +NV2080_CTRL_GPU_GET_ENGINE_PARTNERLIST_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_GPU_GET_GID_INFO = (0x2080014a) +NV2080_GPU_MAX_GID_LENGTH = (0x000000100) +NV2080_GPU_MAX_SHA1_BINARY_GID_LENGTH = (0x000000010) +NV2080_CTRL_GPU_GET_GID_INFO_PARAMS_MESSAGE_ID = (0x4A) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT = (1, 0) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT_ASCII = (0x00000000) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT_BINARY = (0x00000002) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_TYPE = (2, 2) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_TYPE_SHA1 = (0x00000000) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_MODE = (5, 3) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_MODE_GPU = (0x00000000) +NV2080_GPU_CMD_GPU_GET_GID_FLAGS_MODE_UGPU = (0x00000001) +NV2080_CTRL_CMD_GPU_GET_INFOROM_OBJECT_VERSION = (0x2080014b) +NV2080_CTRL_GPU_INFOROM_OBJ_TYPE_LEN = 3 +NV2080_CTRL_GPU_GET_INFOROM_OBJECT_VERSION_PARAMS_MESSAGE_ID = (0x4B) +NV2080_CTRL_CMD_SET_GPU_OPTIMUS_INFO = (0x2080014c) +NV2080_CTRL_GPU_OPTIMUS_INFO_PARAMS_MESSAGE_ID = (0x4C) +NV2080_CTRL_CMD_GPU_GET_IP_VERSION = (0x2080014d) +NV2080_CTRL_GPU_GET_IP_VERSION_PARAMS_MESSAGE_ID = (0x4D) +NV2080_CTRL_GPU_GET_IP_VERSION_DISPLAY = (0x00000001) +NV2080_CTRL_GPU_GET_IP_VERSION_HDACODEC = (0x00000002) +NV2080_CTRL_GPU_GET_IP_VERSION_PMGR = (0x00000003) +NV2080_CTRL_GPU_GET_IP_VERSION_PPWR_PMU = (0x00000004) +NV2080_CTRL_GPU_GET_IP_VERSION_DISP_FALCON = (0x00000005) +NV2080_CTRL_GPU_ILLUM_ATTRIB_LOGO_BRIGHTNESS = 0 +NV2080_CTRL_GPU_ILLUM_ATTRIB_SLI_BRIGHTNESS = 1 +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT = (0x20800153) +NV2080_CTRL_CMD_GPU_QUERY_ILLUM_SUPPORT_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_GPU_GET_ILLUM = (0x20800154) +NV2080_CTRL_GPU_GET_ILLUM_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_GPU_SET_ILLUM = (0x20800155) +NV2080_CTRL_GPU_SET_ILLUM_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_CMD_GPU_GET_INFOROM_IMAGE_VERSION = (0x20800156) +NV2080_CTRL_GPU_INFOROM_IMAGE_VERSION_LEN = 16 +NV2080_CTRL_GPU_GET_INFOROM_IMAGE_VERSION_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_CMD_GPU_QUERY_INFOROM_ECC_SUPPORT = (0x20800157) +NV2080_CTRL_CMD_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO = (0x2080015a) +NV2080_CTRL_MAX_PHYSICAL_BRIDGE = (100) +NV2080_CTRL_GPU_GET_PHYSICAL_BRIDGE_VERSION_INFO_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU = (0x2080015b) +NV2080_CTRL_GPU_GET_ALL_BRIDGES_UPSTREAM_OF_GPU_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_GPU_QUERY_SCRUBBER_STATUS = (0x2080015f) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_PARAMS_MESSAGE_ID = (0x5F) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_SCRUBBER_RUNNING = (0x00000000) +NV2080_CTRL_GPU_QUERY_SCRUBBER_STATUS_SCRUBBER_IDLE = (0x00000001) +NV2080_CTRL_CMD_GPU_GET_VPR_CAPS = (0x20800160) +NV2080_CTRL_GPU_GET_VPR_CAPS_PARAMS_MESSAGE_ID = (0x60) +NV2080_CTRL_CMD_GPU_HANDLE_GPU_SR = (0x20800167) +NV2080_CTRL_CMD_GPU_GET_PES_INFO = (0x20800168) +NV2080_CTRL_CMD_GPU_GET_PES_INFO_MAX_TPC_PER_GPC_COUNT = 10 +NV2080_CTRL_GPU_GET_PES_INFO_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_GPU_GET_OEM_INFO = (0x20800169) +NV2080_GPU_MAX_OEM_INFO_LENGTH = (0x000001F8) +NV2080_CTRL_GPU_GET_OEM_INFO_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_CMD_GPU_GET_VPR_INFO = (0x2080016b) +NV2080_CTRL_GPU_GET_VPR_INFO_PARAMS_MESSAGE_ID = (0x6B) +NV2080_CTRL_CMD_GPU_GET_ENCODER_CAPACITY = (0x2080016c) +NV2080_CTRL_GPU_GET_ENCODER_CAPACITY_PARAMS_MESSAGE_ID = (0x6C) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS = (0x2080016d) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_STATS_PARAMS_MESSAGE_ID = (0x6D) +NV2080_CTRL_GPU_NVENC_SESSION_INFO_MAX_COPYOUT_ENTRIES = 0x200 +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_PARAMS_MESSAGE_ID = (0x6E) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO = (0x2080016e) +NV2080_CTRL_GPU_SET_FABRIC_BASE_ADDR_PARAMS_MESSAGE_ID = (0x6F) +NV2080_CTRL_CMD_GPU_SET_FABRIC_BASE_ADDR = (0x2080016f) +NV2080_CTRL_GPU_VIRTUAL_INTERRUPT_PARAMS_MESSAGE_ID = (0x72) +NV2080_CTRL_CMD_GPU_VIRTUAL_INTERRUPT = (0x20800172) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS_PARAMS_MESSAGE_ID = (0x73) +NV2080_CTRL_CMD_GPU_QUERY_FUNCTION_STATUS = (0x20800173) +NV_GI_UUID_LEN = 16 +NV2080_CTRL_GPU_PARTITION_ID_INVALID = 0xFFFFFFFF +NV2080_CTRL_GPU_MAX_PARTITIONS = 0x00000008 +NV2080_CTRL_GPU_MAX_PARTITION_IDS = 0x00000009 +NV2080_CTRL_GPU_MAX_SMC_IDS = 0x00000008 +NV2080_CTRL_GPU_MAX_GPC_PER_SMC = 0x00000040 +NV2080_CTRL_GPU_MAX_CE_PER_SMC = 0x00000008 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE = (1, 0) +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_FULL = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_HALF = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_QUARTER = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_EIGHTH = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE__SIZE = 4 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE = (4, 2) +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_FULL = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_HALF = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_HALF = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_QUARTER = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_QUARTER = 0x00000004 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_EIGHTH = 0x00000005 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_RESERVED_INTERNAL_06 = 0x00000006 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_RESERVED_INTERNAL_07 = 0x00000007 +NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE__SIZE = 8 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE = (7, 5) +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_FULL = 0x00000001 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_HALF = 0x00000002 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_MINI_HALF = 0x00000003 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_QUARTER = 0x00000004 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_EIGHTH = 0x00000005 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_RESERVED_INTERNAL_06 = 0x00000006 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_RESERVED_INTERNAL_07 = 0x00000007 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE_NONE = 0x00000000 +NV2080_CTRL_GPU_PARTITION_FLAG_GFX_SIZE__SIZE = 8 +NV2080_CTRL_GPU_PARTITION_MAX_TYPES = 90 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_ALL_MEDIA = (29, 28) +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_ALL_MEDIA_DEFAULT = 0 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_ALL_MEDIA_DISABLE = 1 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_ALL_MEDIA_ENABLE = 2 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA = (30, 30) +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA_DISABLE = 0 +NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA_ENABLE = 1 +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN = (31, 31) +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN_DISABLE = 0 +NV2080_CTRL_GPU_PARTITION_FLAG_PLACE_AT_SPAN_ENABLE = 1 +NV2080_CTRL_GPU_SET_PARTITIONS_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_GPU_SET_PARTITIONS = (0x20800174) +NV2080_CTRL_GPU_GET_PARTITIONS_PARAMS_MESSAGE_ID = (0x75) +NV2080_CTRL_CMD_GPU_GET_PARTITIONS = (0x20800175) +NV2080_CTRL_CMD_GPU_CONFIGURE_PARTITION = (0x20800176) +NV2080_CTRL_GPU_CONFIGURE_PARTITION_PARAMS_MESSAGE_ID = (0x76) +NV2080_CTRL_GPU_FAULT_PACKET_SIZE = 32 +NV2080_CTRL_CMD_GPU_REPORT_NON_REPLAYABLE_FAULT = (0x20800177) +NV2080_CTRL_GPU_REPORT_NON_REPLAYABLE_FAULT_PARAMS_MESSAGE_ID = (0x77) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS_VGPU = (0x20800178) +NV2080_CTRL_GPU_EXEC_REG_OPS_VGPU_PARAMS_MESSAGE_ID = (0x78) +NV2080_CTRL_CMD_GPU_GET_ENGINE_RUNLIST_PRI_BASE = (0x20800179) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_PARAMS_MESSAGE_ID = (0x79) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_NULL = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_PRI_BASE_ERROR = (0xFFFFFFFB) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_INVALID = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_ENGINE_RUNLIST_ERROR = (0xFFFFFFFB) +NV2080_CTRL_CMD_GPU_GET_HW_ENGINE_ID = (0x2080017a) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_PARAMS_MESSAGE_ID = (0x7A) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_NULL = (0xFFFFFFFF) +NV2080_CTRL_GPU_GET_HW_ENGINE_ID_ERROR = (0xFFFFFFFB) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS = (0x2080017b) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_STATS_PARAMS_MESSAGE_ID = (0x7B) +NV2080_CTRL_NVFBC_SESSION_FLAG_DIFFMAP_ENABLED = 0x00000001 +NV2080_CTRL_NVFBC_SESSION_FLAG_CLASSIFICATIONMAP_ENABLED = 0x00000002 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_NO_WAIT = 0x00000004 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_INFINITE = 0x00000008 +NV2080_CTRL_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_TIMEOUT = 0x00000010 +NV2080_GPU_NVFBC_MAX_SESSION_COUNT = 256 +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO_PARAMS_MESSAGE_ID = (0x7C) +NV2080_CTRL_GPU_GET_NVFBC_SW_SESSION_INFO = (0x2080017c) +NV2080_CTRL_GPU_GET_FIRST_ASYNC_CE_IDX_PARAMS_MESSAGE_ID = (0xe6) +NV2080_CTRL_CMD_GPU_GET_FIRST_ASYNC_CE_IDX = (0x208001e6) +NV2080_CTRL_CMD_GPU_GET_VMMU_SEGMENT_SIZE = (0x2080017e) +NV2080_CTRL_GPU_GET_VMMU_SEGMENT_SIZE_PARAMS_MESSAGE_ID = (0x7E) +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_32MB = 0x02000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_64MB = 0x04000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_128MB = 0x08000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_256MB = 0x10000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_512MB = 0x20000000 +NV2080_CTRL_GPU_VMMU_SEGMENT_SIZE_1024MB = 0x40000000 +NV2080_CTRL_CMD_GPU_GET_PARTITION_CAPACITY = (0x20800181) +NV2080_CTRL_GPU_GET_PARTITION_CAPACITY_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_GPU_GET_CACHED_INFO = (0x20800182) +NV2080_CTRL_GPU_GET_CACHED_INFO_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_GPU_SET_PARTITIONING_MODE = (0x20800183) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING = (1, 0) +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_LEGACY = 0 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_MAX_PERF = 1 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_REPARTITIONING_FAST_RECONFIG = 2 +NV2080_CTRL_GPU_SET_PARTITIONING_MODE_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_GPU_DESCRIBE_PARTITIONS_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_GPU_DESCRIBE_PARTITIONS = (0x20800185) +NV2080_CTRL_CMD_GPU_GET_MAX_SUPPORTED_PAGE_SIZE = (0x20800188) +NV2080_CTRL_GPU_GET_MAX_SUPPORTED_PAGE_SIZE_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_GPU_GET_NUM_MMUS_PER_GPC_PARAMS_MESSAGE_ID = (0x8A) +NV2080_CTRL_CMD_GPU_GET_NUM_MMUS_PER_GPC = (0x2080018a) +NV2080_CTRL_GPU_GET_ACTIVE_PARTITION_IDS_PARAMS_MESSAGE_ID = (0x8B) +NV2080_CTRL_CMD_GPU_GET_ACTIVE_PARTITION_IDS = (0x2080018b) +NV2080_CTRL_CMD_GPU_GET_PIDS = (0x2080018d) +NV2080_CTRL_GPU_GET_PIDS_MAX_COUNT = 950 +NV2080_CTRL_GPU_GET_PIDS_PARAMS_MESSAGE_ID = (0x8D) +NV2080_CTRL_GPU_GET_PIDS_ID_TYPE_CLASS = (0x00000000) +NV2080_CTRL_GPU_GET_PIDS_ID_TYPE_VGPU_GUEST = (0x00000001) +NV2080_CTRL_GPU_PID_INFO_INDEX_VIDEO_MEMORY_USAGE = (0x00000000) +NV2080_CTRL_GPU_PID_INFO_INDEX_MAX = NV2080_CTRL_GPU_PID_INFO_INDEX_VIDEO_MEMORY_USAGE +NV2080_CTRL_CMD_GPU_GET_PID_INFO = (0x2080018e) +NV2080_CTRL_GPU_GET_PID_INFO_MAX_COUNT = 200 +NV2080_CTRL_GPU_GET_PID_INFO_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT = (0x20800192) +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_INVALID = 0 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_BAR1 = 1 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_BAR2 = 2 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_PHYSICAL = 3 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_TYPE_UNBOUND_INSTANCE = 4 +NV2080_CTRL_CMD_GPU_HANDLE_VF_PRI_FAULT_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_GPU_COMPUTE_POLICY_TIMESLICE = 0 +NV2080_CTRL_GPU_COMPUTE_POLICY_MAX = 1 +NV2080_CTRL_GPU_SET_COMPUTE_POLICY_CONFIG_PARAMS_MESSAGE_ID = (0x94) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_POLICY_CONFIG = (0x20800195) +NV2080_CTRL_GPU_COMPUTE_POLICY_CONFIG_LIST_MAX = 32 +NV2080_CTRL_GPU_GET_COMPUTE_POLICY_CONFIG_PARAMS_MESSAGE_ID = (0x95) +NV2080_CTRL_CMD_GPU_GET_GFID = (0x20800196) +NV2080_CTRL_GPU_GET_GFID_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY = (0x20800197) +NV2080_CTRL_CMD_GPU_UPDATE_GFID_P2P_CAPABILITY_PARAMS_MESSAGE_ID = (0x97) +NV2080_CTRL_CMD_GPU_VALIDATE_MEM_MAP_REQUEST = (0x20800198) +NV2080_CTRL_GPU_VALIDATE_MEM_MAP_REQUEST_PARAMS_MESSAGE_ID = (0x98) +NV2080_CTRL_CMD_GPU_GET_ENGINE_LOAD_TIMES = (0x2080019b) +NV2080_CTRL_GPU_MAX_ENGINE_OBJECTS = 0xC8 +NV2080_CTRL_GPU_GET_ENGINE_LOAD_TIMES_PARAMS_MESSAGE_ID = (0x9B) +NV2080_CTRL_CMD_GPU_GET_ID_NAME_MAPPING = (0x2080019c) +NV2080_CTRL_GPU_GET_ID_NAME_MAPPING_PARAMS_MESSAGE_ID = (0x9C) +NV2080_CTRL_CMD_GPU_EXEC_REG_OPS_NOPTRS = (0x2080019d) +NV2080_CTRL_REG_OPS_ARRAY_MAX = 100 +NV2080_CTRL_GPU_EXEC_REG_OPS_NOPTRS_PARAMS_MESSAGE_ID = (0x9D) +NV2080_CTRL_GPU_SKYLINE_INFO_MAX_SKYLINES = 9 +NV2080_CTRL_GPU_SKYLINE_INFO_MAX_NON_SINGLETON_VGPCS = 64 +NV2080_CTRL_GPU_GET_SKYLINE_INFO_PARAMS_MESSAGE_ID = (0x9F) +NV2080_CTRL_CMD_GPU_GET_SKYLINE_INFO = (0x2080019f) +NV2080_GET_P2P_CAPS_UUID_LEN = 16 +NV2080_CTRL_CMD_GET_P2P_CAPS = (0x208001a0) +NV2080_CTRL_GET_P2P_CAPS_PARAMS_MESSAGE_ID = (0xA0) +NV2080_CTRL_GPU_COMPUTE_PROFILE_FLAG_MULTIDIE = (0, 0) +NV2080_CTRL_GPU_COMPUTE_PROFILE_FLAG_MULTIDIE_FALSE = 0 +NV2080_CTRL_GPU_COMPUTE_PROFILE_FLAG_MULTIDIE_TRUE = 1 +NV2080_CTRL_GPU_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xA2) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_PROFILES = (0x208001a2) +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_UNSUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_NOT_STARTED = 1 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_IN_PROGRESS = 2 +NV2080_CTRL_GPU_FABRIC_PROBE_STATE_COMPLETE = 3 +NV2080_GPU_FABRIC_CLUSTER_UUID_LEN = 16 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW = (1, 0) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE = (3, 2) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ROUTE_UPDATE_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY = (5, 4) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_CONNECTION_UNHEALTHY_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY = (7, 6) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION = (11, 8) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NONE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_SYSGUID = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_CHASSIS_SN = 3 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NO_PARTITION = 4 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INSUFFICIENT_NVLINKS = 5 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCOMPATIBLE_GPU_FW = 6 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INVALID_LOCATION = 7 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_GPU_STATE_INVALID = 8 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_PARTITION_ASSIGNED = (13, 12) +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_PARTITION_ASSIGNED_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_PARTITION_ASSIGNED_TRUE = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_MASK_PARTITION_ASSIGNED_FALSE = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_SUMMARY_NOT_SUPPORTED = 0 +NV2080_CTRL_GPU_FABRIC_HEALTH_SUMMARY_HEALTHY = 1 +NV2080_CTRL_GPU_FABRIC_HEALTH_SUMMARY_UNHEALTHY = 2 +NV2080_CTRL_GPU_FABRIC_HEALTH_SUMMARY_LIMITED_CAPACITY = 3 +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xA3) +NV2080_CTRL_CMD_GET_GPU_FABRIC_PROBE_INFO = (0x208001a3) +NV2080_CTRL_CMD_GPU_GET_CHIP_DETAILS = (0x208001a4) +GPU_PART_NUMBER_FMT = "%4X-%s-%X%X" +NV2080_MAX_CHIP_SKU_LENGTH = 0x00000004 +NV2080_CTRL_GPU_GET_CHIP_DETAILS_PARAMS_MESSAGE_ID = (0xA4) +NV2080_CTRL_CMD_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP = (0x208001a5) +NV2080_CTRL_GPU_MOVE_RUNLISTS_ALLOCATION_TO_SUBHEAP_PARAMS_MESSAGE_ID = (0xA5) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS = (0x208001a6) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS_GSP = (0x208001a7) +NV2080_CTRL_CMD_GPU_MIGRATABLE_OPS_VGPU = (0x208001a8) +NV2080_CTRL_MIGRATABLE_OPS_ARRAY_MAX = 50 +NV2080_CTRL_GPU_MIGRATABLE_OPS_PARAMS_MESSAGE_ID = (0xA6) +NV2080_CTRL_GPU_MIGRATABLE_OPS_GSP_PARAMS_MESSAGE_ID = (0xA7) +NV2080_CTRL_GPU_MIGRATABLE_OPS_VGPU_PARAMS_MESSAGE_ID = (0xA8) +NV2080_CTRL_CMD_GPU_MARK_DEVICE_FOR_RESET = (0x208001a9) +NV2080_CTRL_CMD_GPU_UNMARK_DEVICE_FOR_RESET = (0x208001aa) +NV2080_CTRL_CMD_GPU_GET_RESET_STATUS = (0x208001ab) +NV2080_CTRL_GPU_GET_RESET_STATUS_PARAMS_MESSAGE_ID = (0xAB) +NV2080_CTRL_CMD_GPU_MARK_DEVICE_FOR_DRAIN_AND_RESET = (0x208001ac) +NV2080_CTRL_CMD_GPU_UNMARK_DEVICE_FOR_DRAIN_AND_RESET = (0x208001ad) +NV2080_CTRL_CMD_GPU_GET_DRAIN_AND_RESET_STATUS = (0x208001ae) +NV2080_CTRL_GPU_GET_DRAIN_AND_RESET_STATUS_PARAMS_MESSAGE_ID = (0xAE) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2_PARAMS_MESSAGE_ID = (0xAF) +NV2080_CTRL_GPU_GET_NVENC_SW_SESSION_INFO_V2 = (0x208001af) +NV2080_CTRL_GPU_MAX_CONSTRUCTED_FALCONS = 0x40 +NV2080_CTRL_CMD_GPU_GET_CONSTRUCTED_FALCON_INFO = (0x208001b0) +NV2080_CTRL_GPU_GET_CONSTRUCTED_FALCON_INFO_PARAMS_MESSAGE_ID = (0xB0) +NV2080_CTRL_CMD_GPU_GET_VF_CAPS = (0x208001b1) +NV2080_CTRL_GPU_GET_VF_CAPS_PARAMS_MESSAGE_ID = (0xB1) +NV2080_CTRL_CMD_GPU_GET_RECOVERY_ACTION = (0x208001b2) +NV2080_CTRL_GPU_RECOVERY_ACTION_GPU_RESET = NV2080_CTRL_GPU_RECOVERY_ACTION_GPU_PF_FLR +NV2080_CTRL_GPU_RECOVERY_ACTION_NODE_REBOOT = NV2080_CTRL_GPU_RECOVERY_ACTION_OS_REBOOT +NV2080_CTRL_GPU_GET_RECOVERY_ACTION_PARAMS_MESSAGE_ID = (0xB2) +NV2080_CTRL_GPU_GET_FIPS_STATUS_PARAMS_MESSAGE_ID = (0xe4) +NV2080_CTRL_GPU_GET_FIPS_STATUS = (0x208001e4) +NV2080_CTRL_GPU_RAFTS_NUM_MAX_UGPU = 0x2 +NV2080_CTRL_GPU_RAFTS_NUM_MAX_GPC_PER_UGPU = 0xC +NV2080_CTRL_GPU_RAFTS_NUM_MAX_NUM_GPC = (0x18) +NV2080_CTRL_GPU_RAFTS_NUM_MAX_FS_UNIT = (0x1a) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK_PARAMS_MESSAGE_ID = (0xB3) +NV2080_CTRL_GPU_GET_RAFTS_FS_MASK = (0x208001b3) +NV2080_CTRL_CMD_GPU_GET_COMPUTE_PROFILE_CAPACITY = (0x208001e5) +NV2080_CTRL_GPU_GET_COMPUTE_PROFILE_CAPACITY_PARAMS_MESSAGE_ID = (0xe5) +NV2080_CTRL_CMD_GPU_GET_TPC_RECONFIG_MASK = (0x208001e7) +NV2080_CTRL_GPU_GET_TPC_RECONFIG_MASK_PARAMS_MESSAGE_ID = (0xe7) +NV2080_CTRL_CMD_GPU_RPC_GSP_TEST = (0x208001e8) +NV2080_CTRL_GPU_RPC_GSP_TEST_PARAMS_MESSAGE_ID = (0xe8) +NV2080_CTRL_GPU_RPC_GSP_TEST_SERIALIZED_INTEGRITY = 0x1 +NV2080_CTRL_GPU_RPC_GSP_TEST_UNSERIALIZED = 0x2 +NV2080_CTRL_GPU_RPC_GSP_TEST_SERIALIZED_NOP = 0x3 +NV2080_CTRL_GPU_RPC_GSP_TEST_TIMEOUT = 0x4 +NV2080_CTRL_CMD_GPU_RPC_GSP_QUERY_SIZES = (0x208001e9) +NV2080_CTRL_GPU_RPC_GSP_QUERY_SIZES_PARAMS_MESSAGE_ID = (0xe9) +RUSD_FEATURE_NON_POLLING = 0x1 +RUSD_FEATURE_POLLING = 0x2 +NV2080_CTRL_CMD_RUSD_GET_SUPPORTED_FEATURES = (0x208001ea) +NV2080_CTRL_RUSD_GET_SUPPORTED_FEATURES_PARAMS_MESSAGE_ID = (0xea) +NV2080_CTRL_CMD_GPU_RUSD_SET_FEATURES = (0x208001eb) +NV2080_CTRL_GPU_RUSD_SET_FEATURES_PARAMS_MESSAGE_ID = (0xeb) +NV2080_CTRL_CMD_GPU_FORCE_GSP_UNLOAD = (0x208001ec) +NV2080_CTRL_GPU_FORCE_GSP_UNLOAD_PARAMS_MESSAGE_ID = (0xec) +NV2080_CTRL_CMD_GPU_VGA_SR_READ_WRITE = (0x208001ed) +NV2080_CTRL_GPU_VGA_SR_READ_WRITE_PARAMS_MESSAGE_ID = (0xed) +NV2080_CTRL_CMD_GPU_ERROR_INJECTION_CONTROL = (0x208001ef) +NV2080_CTRL_GPU_ERROR_INJECTION_CONTROL_PARAMS_MESSAGE_ID = (0xef) +NV2080_CTRL_CMD_GPU_CHECK_MEM_SUBSYS_ERROR = (0x208001f0) +NV2080_CTRL_GPU_CHECK_MEM_SUBSYS_ERROR_PARAMS_MESSAGE_ID = (0xf0) +NV2080_CTRL_CMD_GPU_GET_DEFAULT_TIMEOUT = (0x208001f1) +NV2080_CTRL_GPU_GET_DEFAULT_TIMEOUT_PARAMS_MESSAGE_ID = (0xf1) +NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL = (0x208001f2) +NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_RSA_EXPONENT_SIZE = 4 +NV2080_CTRL_CMD_GSP_CRYPTO_CONTROL_NONCE_SIZE = 48 +NV2080_CTRL_GSP_CRYPTO_CONTROL_PARAMS_MESSAGE_ID = (0xf2) +NV2080_CTRL_CMD_GPU_IS_RESET_COUPLED = (0x208081f3) +NV2080_CTRL_CMD_GPU_IS_RESET_COUPLED_PARAMS_MESSAGE_ID = (0xf3) +NV2080_CTRL_GPU_GET_DIELET_INFO_MAX_SIZE = (256) +NV2080_CTRL_CMD_GPU_GET_DIELET_INFO = (0x208081f4) +NV2080_CTRL_GPU_GET_DIELET_INFO_PARAMS_MESSAGE_ID = (0xf4) +NV2080_CTRL_CMD_GPU_GET_UNIT_FS_INFO_FROM_DIELET = (0x208081f5) +NV2080_CTRL_GPU_GET_UNIT_FS_INFO_FROM_DIELET_PARAMS_MESSAGE_ID = (0xf5) +NV2080_CTRL_CMD_GPU_SET_MIGRATION_BLOCK = (0x208001fa) +NV2080_CTRL_GPU_SET_MIGRATION_BLOCK_PARAMS_MESSAGE_ID = (0xfa) +NV2080_CTRL_GPUMON_SAMPLE_TYPE_PWR_MONITOR_STATUS = 0x00000001 +NV2080_CTRL_GPUMON_SAMPLE_TYPE_PERFMON_UTIL = 0x00000002 +NV2080_GPUMON_PID_INVALID = ((NvU32)(~0)) +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE = (1, 0) +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_NONE = 0x0 +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_ENGID = 0x1 +NV2080_CTRL_GR_ROUTE_INFO_FLAGS_TYPE_CHANNEL = 0x2 +NV2080_CTRL_GR_ROUTE_INFO_DATA_CHANNEL_HANDLE = (31, 0) +NV2080_CTRL_GR_ROUTE_INFO_DATA_ENGID = (31, 0) +NV2080_CTRL_GR_INFO_INDEX_MAXCLIPS = NV0080_CTRL_GR_INFO_INDEX_MAXCLIPS +NV2080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 = NV0080_CTRL_GR_INFO_INDEX_MIN_ATTRS_BUG_261894 +NV2080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK = NV0080_CTRL_GR_INFO_XBUF_MAX_PSETS_PER_BANK +NV2080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT = NV0080_CTRL_GR_INFO_INDEX_BUFFER_ALIGNMENT +NV2080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT = NV0080_CTRL_GR_INFO_INDEX_SWIZZLE_ALIGNMENT +NV2080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE = NV0080_CTRL_GR_INFO_INDEX_VERTEX_CACHE_SIZE +NV2080_CTRL_GR_INFO_INDEX_VPE_COUNT = NV0080_CTRL_GR_INFO_INDEX_VPE_COUNT +NV2080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT = NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_COUNT +NV2080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR = NV0080_CTRL_GR_INFO_INDEX_THREAD_STACK_SCALING_FACTOR +NV2080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT = NV0080_CTRL_GR_INFO_INDEX_SHADER_PIPE_SUB_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT = NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT = NV0080_CTRL_GR_INFO_INDEX_SM_REG_BANK_REG_COUNT +NV2080_CTRL_GR_INFO_INDEX_SM_VERSION = NV0080_CTRL_GR_INFO_INDEX_SM_VERSION +NV2080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM = NV0080_CTRL_GR_INFO_INDEX_MAX_WARPS_PER_SM +NV2080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP = NV0080_CTRL_GR_INFO_INDEX_MAX_THREADS_PER_WARP +NV2080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES = NV0080_CTRL_GR_INFO_INDEX_GEOM_GS_OBUF_ENTRIES +NV2080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES = NV0080_CTRL_GR_INFO_INDEX_GEOM_XBUF_ENTRIES +NV2080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY = NV0080_CTRL_GR_INFO_INDEX_FB_MEMORY_REQUEST_GRANULARITY +NV2080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY = NV0080_CTRL_GR_INFO_INDEX_HOST_MEMORY_REQUEST_GRANULARITY +NV2080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM = NV0080_CTRL_GR_INFO_INDEX_MAX_SP_PER_SM +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ZCULL_BANKS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPC_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MIN_FBPS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_FBP_PORTS +NV2080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED = NV0080_CTRL_GR_INFO_INDEX_TIMESLICE_ENABLED +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPAS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_PES_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_GPU_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_TPCS_PER_PES +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_MXBAR_HUB_PORTS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SM_PER_TPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_HSHUB_FBP_PORTS +NV2080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_RT_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT = NV0080_CTRL_GR_INFO_INDEX_TENSOR_CORE_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GRS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_SLICES +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCMMU_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_LTC_PER_FBP +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_ROP_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_FAMILY_MAX_TPC_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_FBPA_PER_FBP +NV2080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_LEGACY_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT = NV0080_CTRL_GR_INFO_INDEX_MAX_PER_ENGINE_SUBCONTEXT_COUNT +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_SLICES_PER_LTC +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GFXC_SMC_ENGINES +NV2080_CTRL_GR_INFO_INDEX_RESERVED = NV0080_CTRL_GR_INFO_INDEX_RESERVED +NV2080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES = NV0080_CTRL_GR_INFO_INDEX_GFX_CAPABILITIES +NV2080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES = NV0080_CTRL_GR_INFO_INDEX_MAX_MIG_ENGINES +NV2080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS = NV0080_CTRL_GR_INFO_INDEX_MAX_PARTITIONABLE_GPCS +NV2080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG = NV0080_CTRL_GR_INFO_INDEX_LITTER_MIN_SUBCTX_PER_SMC_ENG +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_GPCS_PER_DIELET +NV2080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET = NV0080_CTRL_GR_INFO_INDEX_LITTER_MAX_NUM_SMC_ENGINES_PER_DIELET +NV2080_CTRL_GR_INFO_INDEX_LITTER_NUM_CPC_PER_GPC = NV0080_CTRL_GR_INFO_INDEX_LITTER_NUM_CPC_PER_GPC +NV2080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_NVLINK_MASK = NV0080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_NVLINK_MASK +NV2080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_C2C_MASK = NV0080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_C2C_MASK +NV2080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_PCIE_MASK = NV0080_CTRL_GR_INFO_INDEX_LITTER_HSHUB_PCIE_MASK +NV2080_CTRL_GR_INFO_INDEX_RESERVED1 = NV0080_CTRL_GR_INFO_INDEX_RESERVED1 +NV2080_CTRL_GR_INFO_INDEX_MAX = NV0080_CTRL_GR_INFO_INDEX_MAX +NV2080_CTRL_GR_INFO_MAX_SIZE = NV0080_CTRL_GR_INFO_MAX_SIZE +NV2080_CTRL_GR_INFO_SM_VERSION_NONE = (0x00000000) +NV2080_CTRL_GR_INFO_SM_VERSION_1_05 = (0x00000105) +NV2080_CTRL_GR_INFO_SM_VERSION_1_1 = (0x00000110) +NV2080_CTRL_GR_INFO_SM_VERSION_1_2 = (0x00000120) +NV2080_CTRL_GR_INFO_SM_VERSION_1_3 = (0x00000130) +NV2080_CTRL_GR_INFO_SM_VERSION_1_4 = (0x00000140) +NV2080_CTRL_GR_INFO_SM_VERSION_1_5 = (0x00000150) +NV2080_CTRL_GR_INFO_SM_VERSION_2_0 = (0x00000200) +NV2080_CTRL_GR_INFO_SM_VERSION_2_1 = (0x00000210) +NV2080_CTRL_GR_INFO_SM_VERSION_2_2 = (0x00000220) +NV2080_CTRL_GR_INFO_SM_VERSION_3_0 = (0x00000300) +NV2080_CTRL_GR_INFO_SM_VERSION_3_1 = (0x00000310) +NV2080_CTRL_GR_INFO_SM_VERSION_3_2 = (0x00000320) +NV2080_CTRL_GR_INFO_SM_VERSION_3_3 = (0x00000330) +NV2080_CTRL_GR_INFO_SM_VERSION_3_5 = (0x00000350) +NV2080_CTRL_GR_INFO_SM_VERSION_3_6 = (0x00000360) +NV2080_CTRL_GR_INFO_SM_VERSION_3_8 = (0x00000380) +NV2080_CTRL_GR_INFO_SM_VERSION_3_9 = (0x00000390) +NV2080_CTRL_GR_INFO_SM_VERSION_4_0 = (0x00000400) +NV2080_CTRL_GR_INFO_SM_VERSION_5_0 = (0x00000500) +NV2080_CTRL_GR_INFO_SM_VERSION_5_02 = (0x00000502) +NV2080_CTRL_GR_INFO_SM_VERSION_5_03 = (0x00000503) +NV2080_CTRL_GR_INFO_SM_VERSION_6_0 = (0x00000600) +NV2080_CTRL_GR_INFO_SM_VERSION_6_01 = (0x00000601) +NV2080_CTRL_GR_INFO_SM_VERSION_6_02 = (0x00000602) +NV2080_CTRL_GR_INFO_SM_VERSION_7_0 = (0x00000700) +NV2080_CTRL_GR_INFO_SM_VERSION_7_01 = (0x00000701) +NV2080_CTRL_GR_INFO_SM_VERSION_7_02 = (0x00000702) +NV2080_CTRL_GR_INFO_SM_VERSION_7_03 = (0x00000703) +NV2080_CTRL_GR_INFO_SM_VERSION_7_05 = (0x00000705) +NV2080_CTRL_GR_INFO_SM_VERSION_8_02 = (0x00000802) +NV2080_CTRL_GR_INFO_SM_VERSION_8_06 = (0x00000806) +NV2080_CTRL_GR_INFO_SM_VERSION_8_07 = (0x00000807) +NV2080_CTRL_GR_INFO_SM_VERSION_8_08 = (0x00000808) +NV2080_CTRL_GR_INFO_SM_VERSION_8_09 = (0x00000809) +NV2080_CTRL_GR_INFO_SM_VERSION_9_00 = (0x00000900) +NV2080_CTRL_GR_INFO_SM_VERSION_10_00 = (0x00000A00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_01 = (0x00000A01) +NV2080_CTRL_GR_INFO_SM_VERSION_10_03 = (0x00000A03) +NV2080_CTRL_GR_INFO_SM_VERSION_10_04 = (0x00000A04) +NV2080_CTRL_GR_INFO_SM_VERSION_12_00 = (0x00000C00) +NV2080_CTRL_GR_INFO_SM_VERSION_12_01 = (0x00000C01) +NV2080_CTRL_GR_INFO_SM_VERSION_10_05 = (0x00000A05) +NV2080_CTRL_GR_INFO_SM_VERSION_13_00 = (0x00000D00) +NV2080_CTRL_GR_INFO_SM_VERSION_5_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_5_02) +NV2080_CTRL_GR_INFO_SM_VERSION_5_3 = (NV2080_CTRL_GR_INFO_SM_VERSION_5_03) +NV2080_CTRL_GR_INFO_SM_VERSION_6_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_6_01) +NV2080_CTRL_GR_INFO_SM_VERSION_6_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_6_02) +NV2080_CTRL_GR_INFO_SM_VERSION_7_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_01) +NV2080_CTRL_GR_INFO_SM_VERSION_7_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_02) +NV2080_CTRL_GR_INFO_SM_VERSION_7_3 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_03) +NV2080_CTRL_GR_INFO_SM_VERSION_7_5 = (NV2080_CTRL_GR_INFO_SM_VERSION_7_05) +NV2080_CTRL_GR_INFO_SM_VERSION_8_2 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_02) +NV2080_CTRL_GR_INFO_SM_VERSION_8_6 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_06) +NV2080_CTRL_GR_INFO_SM_VERSION_8_7 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_07) +NV2080_CTRL_GR_INFO_SM_VERSION_8_8 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_08) +NV2080_CTRL_GR_INFO_SM_VERSION_8_9 = (NV2080_CTRL_GR_INFO_SM_VERSION_8_09) +NV2080_CTRL_GR_INFO_SM_VERSION_9_0 = (NV2080_CTRL_GR_INFO_SM_VERSION_9_00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_0 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_00) +NV2080_CTRL_GR_INFO_SM_VERSION_10_1 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_01) +NV2080_CTRL_GR_INFO_SM_VERSION_10_3 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_03) +NV2080_CTRL_GR_INFO_SM_VERSION_10_4 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_04) +NV2080_CTRL_GR_INFO_SM_VERSION_10_5 = (NV2080_CTRL_GR_INFO_SM_VERSION_10_05) +NV2080_CTRL_GR_INFO_SM_VERSION_13_0 = (NV2080_CTRL_GR_INFO_SM_VERSION_13_00) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D = (0, 0) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_2D_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D = (1, 1) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_3D_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE = (2, 2) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_COMPUTE_TRUE = 0x1 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M = (3, 3) +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M_FALSE = 0x0 +NV2080_CTRL_GR_INFO_GFX_CAPABILITIES_I2M_TRUE = 0x1 +NV2080_CTRL_CMD_GR_GET_INFO = (0x20801201) +NV2080_CTRL_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_GR_CTXSW_ZCULL_MODE = (0x20801205) +NV2080_CTRL_GR_CTXSW_ZCULL_MODE_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CTXSW_ZCULL_MODE_GLOBAL = (0x00000000) +NV2080_CTRL_CTXSW_ZCULL_MODE_NO_CTXSW = (0x00000001) +NV2080_CTRL_CTXSW_ZCULL_MODE_SEPARATE_BUFFER = (0x00000002) +NV2080_CTRL_CMD_GR_GET_ZCULL_INFO = (0x20801206) +NV2080_CTRL_GR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_GR_CTXSW_PM_MODE = (0x20801207) +NV2080_CTRL_GR_CTXSW_PM_MODE_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CTXSW_PM_MODE_NO_CTXSW = (0x00000000) +NV2080_CTRL_CTXSW_PM_MODE_CTXSW = (0x00000001) +NV2080_CTRL_CTXSW_PM_MODE_STREAM_OUT_CTXSW = (0x00000002) +NV2080_CTRL_CMD_GR_CTXSW_ZCULL_BIND = (0x20801208) +NV2080_CTRL_GR_CTXSW_ZCULL_BIND_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_GR_CTXSW_PM_BIND = (0x20801209) +NV2080_CTRL_GR_CTXSW_PM_BIND_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_GR_CTXSW_SETUP_BIND = (0x2080123a) +NV2080_CTRL_GR_CTXSW_SETUP_BIND_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_MAX_VALUES = 128 +NV2080_CTRL_CMD_GR_SET_GPC_TILE_MAP = (0x2080120a) +NV2080_CTRL_GR_SET_GPC_TILE_MAP_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_GR_CTXSW_SMPC_MODE = (0x2080120e) +NV2080_CTRL_GR_CTXSW_SMPC_MODE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CTXSW_SMPC_MODE_NO_CTXSW = (0x00000000) +NV2080_CTRL_CTXSW_SMPC_MODE_CTXSW = (0x00000001) +NV2080_CTRL_CMD_GR_GET_SM_TO_GPC_TPC_MAPPINGS = (0x2080120f) +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_MAX_SM_COUNT = 512 +NV2080_CTRL_GR_GET_SM_TO_GPC_TPC_MAPPINGS_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_GR_SET_CTXSW_PREEMPTION_MODE = (0x20801210) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP = (0, 0) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP_IGNORE = (0x00000000) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_CILP_SET = (0x00000001) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP = (1, 1) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP_IGNORE = (0x00000000) +NV2080_CTRL_GR_SET_CTXSW_PREEMPTION_MODE_FLAGS_GFXP_SET = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_WFI = (0x00000000) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_GFXP = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_GFX_GFXP_POOL = (0x00000002) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_WFI = (0x00000000) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_CTA = (0x00000001) +NV2080_CTRL_SET_CTXSW_PREEMPTION_MODE_COMPUTE_CILP = (0x00000002) +NV2080_CTRL_CMD_GR_CTXSW_PREEMPTION_BIND = (0x20801211) +NV2080_CTRL_GR_CTXSW_PREEMPTION_BIND_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GR_PC_SAMPLING_MODE = (0x20801212) +NV2080_CTRL_GR_PC_SAMPLING_MODE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_PC_SAMPLING_MODE_DISABLED = (0x00000000) +NV2080_CTRL_PC_SAMPLING_MODE_ENABLED = (0x00000001) +NV2080_CTRL_CMD_GR_GET_ROP_INFO = (0x20801213) +NV2080_CTRL_GR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_GR_GET_CTXSW_STATS = (0x20801215) +NV2080_CTRL_GR_GET_CTXSW_STATS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET = (0, 0) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET_FALSE = (0x00000000) +NV2080_CTRL_GR_GET_CTXSW_STATS_FLAGS_RESET_TRUE = (0x00000001) +NV2080_CTRL_CMD_GR_GET_CTX_BUFFER_SIZE = (0x20801218) +NV2080_CTRL_GR_GET_CTX_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_GR_MAX_CTX_BUFFER_COUNT = 64 +NV2080_CTRL_CMD_GR_GET_CTX_BUFFER_INFO = (0x20801219) +NV2080_CTRL_GR_GET_CTX_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x19) +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_UNKNOWN = 0 +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_SYSMEM = 1 +NV2080_CTRL_GR_CTX_BUFFER_INFO_APERTURE_FBMEM = 2 +NV2080_CTRL_CMD_GR_GET_GLOBAL_SM_ORDER = (0x2080121b) +NV2080_CTRL_CMD_GR_GET_GLOBAL_SM_ORDER_MAX_SM_COUNT = 512 +NV2080_CTRL_GR_DISABLED_SM_VGPC_ID = 0xFF +NV2080_CTRL_GR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x1B) +NV2080_CTRL_CMD_GR_GET_CURRENT_RESIDENT_CHANNEL = (0x2080121c) +NV2080_CTRL_GR_GET_CURRENT_RESIDENT_CHANNEL_PARAMS_MESSAGE_ID = (0x1C) +NV2080_CTRL_CMD_GR_GET_ATTRIBUTE_BUFFER_SIZE = (0x2080121e) +NV2080_CTRL_GR_GET_ATTRIBUTE_BUFFER_SIZE_PARAMS_MESSAGE_ID = (0x1E) +NV2080_CTRL_CMD_GR_GFX_POOL_QUERY_SIZE = (0x2080121f) +NV2080_CTRL_GR_GFX_POOL_QUERY_SIZE_PARAMS_MESSAGE_ID = (0x1F) +NV2080_CTRL_CMD_GR_GFX_POOL_INITIALIZE = (0x20801220) +NV2080_CTRL_GR_GFX_POOL_INITIALIZE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_GR_GFX_POOL_MAX_SLOTS = 64 +NV2080_CTRL_CMD_GR_GFX_POOL_ADD_SLOTS = (0x20801221) +NV2080_CTRL_GR_GFX_POOL_ADD_SLOTS_PARAMS_MESSAGE_ID = (0x21) +NV2080_CTRL_CMD_GR_GFX_POOL_REMOVE_SLOTS = (0x20801222) +NV2080_CTRL_GR_GFX_POOL_REMOVE_SLOTS_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_GR_GET_CAPS_V2 = (0x20801227) +NV2080_CTRL_GR_GET_CAPS_V2_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_GR_GET_INFO_V2 = (0x20801228) +NV2080_CTRL_GR_GET_INFO_V2_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_GR_GET_GPC_MASK = (0x2080122a) +NV2080_CTRL_GR_GET_GPC_MASK_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_CMD_GR_GET_TPC_MASK = (0x2080122b) +NV2080_CTRL_GR_GET_TPC_MASK_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_GR_SET_TPC_PARTITION_MODE = (0x2080122c) +NV2080_CTRL_GR_SET_TPC_PARTITION_MODE_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_CMD_GR_GET_ENGINE_CONTEXT_PROPERTIES = (0x2080122d) +NV2080_CTRL_GR_GET_ENGINE_CONTEXT_PROPERTIES_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_CMD_GR_GET_SM_ISSUE_RATE_MODIFIER = (0x20801230) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA0_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA16_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_DP_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_DP_REDUCED_SPEED = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FMLA32_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_FFMA_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA1_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA2_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA3_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_FULL_SPEED = (0x0) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_2 = (0x1) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_4 = (0x2) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_8 = (0x3) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_16 = (0x4) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_32 = (0x5) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_IMLA4_REDUCED_SPEED_1_64 = (0x6) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_MAX_LIST_SIZE = (0xFF) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FMLA16 = (0x0) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_DP = (0x1) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FMLA32 = (0x2) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FFMA = (0x3) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA0 = (0x4) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA1 = (0x5) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA2 = (0x6) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA3 = (0x7) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_IMLA4 = (0x8) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FP16 = (0x9) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_FP32 = (0xA) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_DFMA = (0xB) +NV2080_CTRL_GR_SM_ISSUE_RATE_MODIFIER_V2_DMLA = (0xC) +NV2080_CTRL_CMD_GR_GET_SM_ISSUE_RATE_MODIFIER_V2 = (0x2080123c) +NV2080_CTRL_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS_MESSAGE_ID = (0x3C) +NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL_MAX_LIST_SIZE = (0xFF) +NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL_MASK = (0x0) +NV2080_CTRL_GR_SM_ISSUE_THROTTLE_CTRL_CREDIT = (0x1) +NV2080_CTRL_CMD_GR_GET_SM_ISSUE_THROTTLE_CTRL = (0x2080123d) +NV2080_CTRL_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS_MESSAGE_ID = (0x3D) +NV2080_CTRL_CMD_GR_FECS_BIND_EVTBUF_FOR_UID = (0x20801231) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_GR_GET_PHYS_GPC_MASK = (0x20801232) +NV2080_CTRL_GR_GET_PHYS_GPC_MASK_PARAMS_MESSAGE_ID = (0x32) +NV2080_CTRL_CMD_GR_GET_PPC_MASK = (0x20801233) +NV2080_CTRL_GR_GET_PPC_MASK_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_GR_GET_NUM_TPCS_FOR_GPC = (0x20801234) +NV2080_CTRL_GR_GET_NUM_TPCS_FOR_GPC_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_GR_GET_CTXSW_MODES = (0x20801235) +NV2080_CTRL_GR_GET_CTXSW_MODES_PARAMS_MESSAGE_ID = (0x35) +NV2080_CTRL_CMD_GR_GET_GPC_TILE_MAP = (0x20801236) +NV2080_CTRL_GR_GET_GPC_TILE_MAP_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_GR_GET_ZCULL_MASK = (0x20801237) +NV2080_CTRL_GR_GET_ZCULL_MASK_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_CMD_GR_FECS_BIND_EVTBUF_FOR_UID_V2 = (0x20801238) +NV2080_CTRL_GR_FECS_BIND_EVTBUF_FOR_UID_V2_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_GR_GET_GFX_GPC_AND_TPC_INFO = (0x20801239) +NV2080_CTRL_GR_GET_GFX_GPC_AND_TPC_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_GR_GET_TPC_RECONFIG_MASK = (0x2080123b) +NV2080_CTRL_GR_GET_TPC_RECONFIG_MASK_PARAMS_MESSAGE_ID = (0x3b) +NV2080_CTRL_CMD_GR_TEST_CTXSW_ERROR_LOGS = (0x2080123e) +NV2080_CTRL_GR_TEST_CTXSW_ERROR_LOGS_PARAMS_MESSAGE_ID = (0x3E) +NV2080_CTRL_CMD_GRMGR_GET_GR_FS_INFO = (0x20803801) +NV2080_CTRL_GRMGR_GR_FS_INFO_MAX_QUERIES = 96 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_MAX_SIZE = 32 +NV2080_CTRL_GRMGR_MAX_SMC_IDS = 8 +NV2080_CTRL_GRMGR_GET_GR_FS_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_INVALID = 0 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_GPC_COUNT = 1 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_CHIPLET_GPC_MAP = 2 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_TPC_MASK = 3 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PPC_MASK = 4 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_CHIPLET_GPC_MAP = 5 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_CHIPLET_SYSPIPE_MASK = 6 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_CHIPLET_SYSPIPE_IDS = 7 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PROFILER_MON_GPC_MASK = 8 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_PARTITION_SYSPIPE_ID = 9 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_ROP_MASK = 10 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_CHIPLET_GRAPHICS_SYSPIPE_MASK = 11 +NV2080_CTRL_GRMGR_GR_FS_INFO_QUERY_GFX_CAPABLE_GPC_MASK = 12 +NV2080_CTRL_CMD_GSP_GET_FEATURES = (0x20803601) +NV2080_GSP_MAX_BUILD_VERSION_LENGTH = (0x0000040) +NV2080_CTRL_GSP_GET_FEATURES_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED = (0, 0) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED_FALSE = (0x00000000) +NV2080_CTRL_GSP_GET_FEATURES_UVM_ENABLED_TRUE = (0x00000001) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED = (1, 1) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED_FALSE = (0x00000000) +NV2080_CTRL_GSP_GET_FEATURES_VGPU_GSP_MIG_REFACTORING_ENABLED_TRUE = (0x00000001) +NV2080_CTRL_CMD_GSP_GET_RM_HEAP_STATS = (0x20803602) +NV2080_CTRL_GSP_GET_RM_HEAP_STATS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS = (0x20803603) +NV2080_CTRL_CMD_GSP_GET_VGPU_HEAP_STATS_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS = (0x20803604) +NV2080_CTRL_GSP_LIBOS_POOL_COUNT_MAX = 64 +NV2080_CTRL_CMD_GSP_GET_LIBOS_HEAP_STATS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_GSP_GDMA_FUZZ_TEST = (0x20803605) +NV2080_CTRL_CMD_GSP_GDMA_FUZZ_TEST_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_GSP_CORE_TEST = (0x20803606) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_INVAL_L1_LIBOS = (0, 0) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_INVAL_L1_LIBOS_YES = (0x00000001) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_INVAL_L1_LIBOS_NO = (0x00000000) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_EVICT_L2 = (1, 1) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_EVICT_L2_YES = (0x00000001) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_EVICT_L2_NO = (0x00000000) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_INVAL_L2 = (2, 2) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_INVAL_L2_YES = (0x00000001) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_INVAL_L2_NO = (0x00000000) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_UNCACHED = (3, 3) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_UNCACHED_YES = (0x00000001) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_UNCACHED_NO = (0x00000000) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_FENCE = (4, 4) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_FENCE_YES = (0x00000001) +NV2080_CTRL_GSP_CORE_TEST_FLAGS_FENCE_NO = (0x00000000) +NV2080_CTRL_GSP_CORE_TEST_SIZE_MAX = (0x400000) +NV2080_CTRL_GSP_CORE_TEST_ITERS_MAX = (10000) +NV2080_CTRL_CMD_GSP_CORE_TEST_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_HSHUB_GET_AVAILABLE_MASK = (0x20804101) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_HSHUB_SET_EC_THROTTLE_MODE = (0x20804102) +NV2080_CTRL_I2C_VERSION_0 = 0x00 +NV2080_CTRL_I2C_MAX_ENTRIES = 256 +NV2080_CTRL_I2C_MAX_REG_LEN = 8 +NV2080_CTRL_I2C_MAX_ADDR_ENTRIES = 20 +NV2080_CTRL_I2C_FLAGS_NONSTD_SI1930UC = (0x00000001) +NV2080_CTRL_I2C_FLAGS_PRIVILEGE = (0x00000002) +NV2080_CTRL_I2C_FLAGS_DATA_ENCRYPTED = (0x00000004) +NV2080_CTRL_I2C_FLAGS_PX3540 = (0x00000010) +NV2080_CTRL_I2C_FLAGS_ADDR_AUTO_INC_NOT_SUPPORTED = (0x00000008) +NV2080_CTRL_I2C_READ_BUFFER_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_I2C_READ_BUFFER = (0x20800601) +NV2080_CTRL_I2C_WRITE_BUFFER_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_I2C_WRITE_BUFFER = (0x20800602) +NV2080_CTRL_CMD_I2C_READ_REG = (0x20800603) +NV2080_CTRL_I2C_READ_REG_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_I2C_WRITE_REG = (0x20800604) +NV2080_CTRL_I2C_WRITE_REG_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_I2C_ACCESS = (0x20800610) +NV2080_CTRL_I2C_ACCESS_PARAMS_MESSAGE_ID = (0x10) +NV2080_CTRL_I2C_ACCESS_CMD_ACQUIRE = 0x1 +NV2080_CTRL_I2C_ACCESS_CMD_RELEASE = 0x2 +NV2080_CTRL_I2C_ACCESS_CMD_WRITE_BYTE = 0x3 +NV2080_CTRL_I2C_ACCESS_CMD_READ_BYTE = 0x4 +NV2080_CTRL_I2C_ACCESS_CMD_NULL = 0x5 +NV2080_CTRL_I2C_ACCESS_CMD_RESET = 0x6 +NV2080_CTRL_I2C_ACCESS_CMD_TEST_PORT = 0x11 +NV2080_CTRL_I2C_ACCESS_CMD_SET_FAST_MODE = 0x12 +NV2080_CTRL_I2C_ACCESS_CMD_SET_NORMAL_MODE = 0x13 +NV2080_CTRL_I2C_ACCESS_CMD_WRITE_BUFFER = 0x14 +NV2080_CTRL_I2C_ACCESS_CMD_READ_BUFFER = 0x15 +NV2080_CTRL_I2C_ACCESS_CMD_START = 0x17 +NV2080_CTRL_I2C_ACCESS_CMD_STOP = 0x18 +NV2080_CTRL_I2C_ACCESS_CMD_SET_SLOW_MODE = 0x20 +NV2080_CTRL_I2C_ACCESS_FLAG_START = 0x1 +NV2080_CTRL_I2C_ACCESS_FLAG_STOP = 0x2 +NV2080_CTRL_I2C_ACCESS_FLAG_ACK = 0x4 +NV2080_CTRL_I2C_ACCESS_FLAG_RAB = 0x8 +NV2080_CTRL_I2C_ACCESS_FLAG_ADDR_10BITS = 0x10 +NV2080_CTRL_I2C_ACCESS_FLAG_PRIVILEGE = 0x20 +NV2080_CTRL_I2C_ACCESS_FLAG_DATA_ENCRYPTED = 0x40 +NV2080_CTRL_I2C_ACCESS_FLAG_RESTART = 0x80 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_33_33PCT = 0x100 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_33PCT = 0x200 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_10PCT = 0x400 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_3_33PCT = 0x800 +NV2080_CTRL_I2C_ACCESS_FLAG_SLOW_MODE_3PCT = 0x1000 +NV2080_CTRL_I2C_ACCESS_PORT_DYNAMIC = 0x0 +NV2080_CTRL_I2C_ACCESS_PORT_PRIMARY = 0x1 +NV2080_CTRL_I2C_ACCESS_PORT_SECONDARY = 0x2 +NV2080_CTRL_I2C_ACCESS_PORT_TERTIARY = 0x3 +NV2080_CTRL_I2C_ACCESS_PORT_QUARTIARY = 0x4 +NV2080_CTRL_I2C_ACCESS_PORT_1 = 0x1 +NV2080_CTRL_I2C_ACCESS_PORT_2 = 0x2 +NV2080_CTRL_I2C_ACCESS_PORT_3 = 0x3 +NV2080_CTRL_I2C_ACCESS_PORT_4 = 0x4 +NV2080_CTRL_I2C_ACCESS_PORT_5 = 0x5 +NV2080_CTRL_I2C_ACCESS_PORT_6 = 0x6 +NV2080_CTRL_I2C_ACCESS_PORT_7 = 0x7 +NV2080_CTRL_I2C_ACCESS_PORT_8 = 0x8 +NV2080_CTRL_I2C_ACCESS_PORT_9 = 0x9 +NV2080_CTRL_I2C_ACCESS_PORT_10 = 0x10 +NV2080_CTRL_I2C_ACCESS_NUM_PORTS = NV2080_CTRL_I2C_ACCESS_PORT_10 +NV2080_CTRL_I2C_ACCESS_STATUS_SUCCESS = 0x0 +NV2080_CTRL_I2C_ACCESS_STATUS_ERROR = 0x1 +NV2080_CTRL_I2C_ACCESS_STATUS_PROTOCOL_ERROR = 0x2 +NV2080_CTRL_I2C_ACCESS_STATUS_DEVICE_BUSY = 0x3 +NV2080_CTRL_I2C_ACCESS_STATUS_NACK_AFTER_SEND = 0x4 +NV2080_CTRL_I2C_ACCESS_STATUS_DP2TMDS_DONGLE_MISSING = 0x5 +NV2080_CTRL_CMD_I2C_ENABLE_MONITOR_3D_MODE = (0x20800620) +NV2080_CTRL_I2C_ENABLE_MONITOR_3D_MODE_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_STATIC_INFO = (0x20800a01) +NV2080_CTRL_INTERNAL_DISPLAY_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_INTERNAL_MEMSYS_GET_STATIC_CONFIG_PARAMS_MESSAGE_ID = (0x1C) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_STATIC_CONFIG = (0x20800a1c) +NV2080_CTRL_CMD_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER = (0x20800a1d) +NV2080_CTRL_INTERNAL_UVM_ACCESS_CNTR_BUFFER_MAX_PAGES = 64 +NV2080_CTRL_INTERNAL_UVM_REGISTER_ACCESS_CNTR_BUFFER_PARAMS_MESSAGE_ID = (0x1D) +NV2080_CTRL_CMD_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER = (0x20800a1e) +NV2080_CTRL_INTERNAL_UVM_UNREGISTER_ACCESS_CNTR_BUFFER_PARAMS_MESSAGE_ID = (0x1E) +NV2080_CTRL_INTERNAL_GR_MAX_ENGINES = 8 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CAPS_PARAMS_MESSAGE_ID = (0x20) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_CAPS = (0x20800a1f) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CAPS_PARAMS_MESSAGE_ID = (0x1F) +NV2080_CTRL_INTERNAL_GR_MAX_SM = 512 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER = (0x20800a22) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_GLOBAL_SM_ORDER_PARAMS_MESSAGE_ID = (0x22) +NV2080_CTRL_CMD_INTERNAL_MAX_NVDECS = 8 +NV2080_CTRL_CMD_INTERNAL_MAX_BSPS = NV2080_CTRL_CMD_INTERNAL_MAX_NVDECS +NV2080_CTRL_INTERNAL_BSP_CAPS = NV2080_CTRL_INTERNAL_NVDEC_CAPS +NV2080_CTRL_INTERNAL_BSP_GET_CAPS_PARAMS = NV2080_CTRL_INTERNAL_NVDEC_GET_CAPS_PARAMS +NV2080_CTRL_CMD_INTERNAL_MAX_NVENCS = 8 +NV2080_CTRL_CMD_INTERNAL_MAX_MSENCS = NV2080_CTRL_CMD_INTERNAL_MAX_NVENCS +NV2080_CTRL_INTERNAL_MSENC_CAPS = NV2080_CTRL_INTERNAL_NVENC_CAPS +NV2080_CTRL_INTERNAL_MSENC_GET_CAPS_PARAMS = NV2080_CTRL_INTERNAL_NVENC_GET_CAPS_PARAMS +NV2080_CTRL_INTERNAL_GR_MAX_GPC = 64 +NV2080_CTRL_INTERNAL_MAX_TPC_PER_GPC_COUNT = 10 +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FLOORSWEEPING_MASKS_PARAMS_MESSAGE_ID = (0x27) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS = (0x20800a26) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FLOORSWEEPING_MASKS_PARAMS_MESSAGE_ID = (0x26) +NV2080_CTRL_KGR_MAX_BUFFER_PTES = 128 +NV2080_CTRL_CMD_KGR_GET_CTX_BUFFER_PTES = (0x20800a28) +NV2080_CTRL_KGR_GET_CTX_BUFFER_PTES_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS_MESSAGE_ID = (0x2B) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_INFO = (0x20800a2a) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_INFO_PARAMS_MESSAGE_ID = (0x2A) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x2D) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_ZCULL_INFO = (0x20800a2c) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ZCULL_INFO_PARAMS_MESSAGE_ID = (0x2C) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x2F) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_ROP_INFO = (0x20800a2e) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_ROP_INFO_PARAMS_MESSAGE_ID = (0x2E) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PPC_MASKS_PARAMS_MESSAGE_ID = (0x31) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_PPC_MASKS = (0x20800a30) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PPC_MASKS_PARAMS_MESSAGE_ID = (0x30) +NV2080_CTRL_INTERNAL_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_COUNT = 0x1a +NV2080_CTRL_INTERNAL_STATIC_GR_GET_CONTEXT_BUFFERS_INFO_PARAMS_MESSAGE_ID = (0x33) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO = (0x20800a32) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO_PARAMS_MESSAGE_ID = (0x32) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x35) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER = (0x20800a34) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_PARAMS_MESSAGE_ID = (0x34) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_CHIP_INFO = (0x20800a36) +NV2080_CTRL_INTERNAL_GET_CHIP_INFO_REG_BASE_MAX = 16 +NV2080_CTRL_INTERNAL_GPU_GET_CHIP_INFO_PARAMS_MESSAGE_ID = (0x36) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE = (0x20800a37) +NV2080_CTRL_CMD_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE = (0x20800a38) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_HW_ENABLE_PARAMS_MESSAGE_ID = (0x37) +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_HW_ENABLE_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET = (0x20800a39) +NV2080_CTRL_CMD_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET = (0x20800a3a) +NV2080_CTRL_CMD_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET = (0x20800a3b) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_RD_OFFSET_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_INTERNAL_GR_SET_FECS_TRACE_WR_OFFSET_PARAMS_MESSAGE_ID = (0x3A) +NV2080_CTRL_INTERNAL_GR_GET_FECS_TRACE_RD_OFFSET_PARAMS_MESSAGE_ID = (0x3B) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE = (0x20800a3d) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_RECORD_SIZE_PARAMS_MESSAGE_ID = (0x3C) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_RECORD_SIZE_PARAMS_MESSAGE_ID = (0x3D) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_FECS_TRACE_DEFINES_PARAMS_MESSAGE_ID = (0x3E) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES = (0x20800a3f) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_FECS_TRACE_DEFINES_PARAMS_MESSAGE_ID = (0x3F) +NV2080_CTRL_CMD_INTERNAL_DEVICE_INFO_MAX_ENTRIES = 512 +NV2080_CTRL_CMD_INTERNAL_GET_DEVICE_INFO_TABLE = (0x20800a40) +NV2080_CTRL_INTERNAL_GET_DEVICE_INFO_TABLE_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP = (0x20800a41) +NV2080_CTRL_INTERNAL_GPU_USER_REGISTER_ACCESS_MAP_MAX_COMPRESSED_SIZE = 16384 +NV2080_CTRL_INTERNAL_GPU_USER_REGISTER_ACCESS_MAP_MAX_PROFILING_RANGES = 4096 +NV2080_CTRL_INTERNAL_GPU_GET_USER_REGISTER_ACCESS_MAP_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE = (0x20800a44) +NV2080_CTRL_INTERNAL_KMIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_PROMOTE_GPU_INSTANCE_MEM_RANGE = (0x20800a43) +NV2080_CTRL_CMD_INTERNAL_GPU_CHECK_CTS_ID_VALID = (0x20800a46) +NV2080_CTRL_INTERNAL_GPU_CHECK_CTS_ID_VALID_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_PDB_PROPERTIES_PARAMS_MESSAGE_ID = (0x47) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES = (0x20800a48) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_PDB_PROPERTIES_PARAMS_MESSAGE_ID = (0x48) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_WRITE_INST_MEM = (0x20800a49) +NV2080_CTRL_INTERNAL_DISPLAY_WRITE_INST_MEM_PARAMS_MESSAGE_ID = (0x49) +NV2080_CTRL_CMD_INTERNAL_RECOVER_ALL_COMPUTE_CONTEXTS = (0x20800a4a) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_IP_VERSION = (0x20800a4b) +NV2080_CTRL_INTERNAL_DISPLAY_GET_IP_VERSION_PARAMS_MESSAGE_ID = (0x4B) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_SMC_MODE = (0x20800a4c) +NV2080_CTRL_INTERNAL_GPU_GET_SMC_MODE_PARAMS_MESSAGE_ID = (0x4C) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR = (0x20800a4d) +NV2080_CTRL_INTERNAL_DISPLAY_SETUP_RG_LINE_INTR_PARAMS_MESSAGE_ID = (0x4D) +NV2080_CTRL_INTERNAL_GRMGR_PARTITION_MAX_TYPES = 90 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PROFILES_PARAMS_MESSAGE_ID = (0x4F) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM = (0x20800a51) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PARTITIONABLE_MEM_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_MAX_ENGINES_MASK_SIZE = 4 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS_MESSAGE_ID = (0x52) +NV2080_CTRL_INTERNAL_FIFO_MAX_RUNLIST_BUFFERS = 2 +NV2080_CTRL_INTERNAL_FIFO_MAX_RUNLIST_ID = 64 +NV2080_CTRL_CMD_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS = (0x20800a53) +NV2080_CTRL_INTERNAL_FIFO_PROMOTE_RUNLIST_BUFFERS_PARAMS_MESSAGE_ID = (0x53) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_SET_IMP_INIT_INFO = (0x20800a54) +NV2080_CTRL_INTERNAL_DISPLAY_SET_IMP_INIT_INFO_PARAMS_MESSAGE_ID = (0x54) +NV2080_CTRL_CMD_INTERNAL_GET_EGPU_BRIDGE_INFO = (0x20800a55) +NV2080_CTRL_INTERNAL_GET_EGPU_BRIDGE_INFO_PARAMS_MESSAGE_ID = (0x55) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_NONE = (0x00000000) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_CUSTOM = (0x00000001) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_TB2 = (0x00000002) +NV2080_CTRL_INTERNAL_EGPU_BUS_TYPE_TB3 = (0x00000003) +NV2080_CTRL_CMD_INTERNAL_BUS_FLUSH_WITH_SYSMEMBAR = (0x20800a70) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL = (0x20800a71) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_LOCAL_PARAMS_MESSAGE_ID = (0x71) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE = (0x20800a72) +NV2080_CTRL_CMD_INTERNAL_BUS_SETUP_P2P_MAILBOX_REMOTE_PARAMS_MESSAGE_ID = (0x72) +NV2080_CTRL_CMD_INTERNAL_BUS_DESTROY_P2P_MAILBOX = (0x20800a73) +NV2080_CTRL_INTERNAL_BUS_DESTROY_P2P_MAILBOX_PARAMS_MESSAGE_ID = (0x73) +NV2080_CTRL_CMD_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING = (0x20800a74) +NV2080_CTRL_INTERNAL_BUS_CREATE_C2C_PEER_MAPPING_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING = (0x20800a75) +NV2080_CTRL_INTERNAL_BUS_REMOVE_C2C_PEER_MAPPING_PARAMS_MESSAGE_ID = (0x75) +NV2080_CTRL_CMD_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES = (0x20800a57) +NV2080_CTRL_INTERNAL_VMMU_MAX_SPA_FOR_GPA_ENTRIES = 128 +NV2080_CTRL_INTERNAL_VMMU_GET_SPA_FOR_GPA_ENTRIES_PARAMS_MESSAGE_ID = (0x57) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER = (0x20800a58) +NV2080_CTRL_INTERNAL_DISPLAY_CHANNEL_PUSHBUFFER_PARAMS_MESSAGE_ID = (0x58) +NV2080_CTRL_CMD_INTERNAL_GMMU_GET_STATIC_INFO = (0x20800a59) +NV2080_CTRL_INTERNAL_GMMU_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0x59) +NV2080_CTRL_CMD_INTERNAL_GR_GET_CTXSW_MODES = (0x20800a5a) +NV2080_CTRL_INTERNAL_GR_GET_CTXSW_MODES_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE = (0x20800a5b) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_INTERNAL_INTR_GET_KERNEL_TABLE = (0x20800a5c) +NV2080_CTRL_INTERNAL_INTR_MAX_TABLE_SIZE = 128 +NV2080_CTRL_INTERNAL_INTR_GET_KERNEL_TABLE_PARAMS_MESSAGE_ID = (0x5C) +NV2080_CTRL_INTERNAL_FB_GET_HEAP_RESERVATION_SIZE_GR = (0x00000000) +NV2080_CTRL_CMD_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK = (0x20800a98) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_CHECK_PARAMS_MESSAGE_ID = (0x98) +NV2080_CTRL_CMD_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET = (0x20800a99) +NV2080_CTRL_INTERNAL_PERF_PERFMON_CLIENT_RESERVATION_SET_PARAMS_MESSAGE_ID = (0x99) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES = (0x20800a5d) +NV2080_CTRL_INTERNAL_DISPLAY_GET_ACTIVE_DISPLAY_DEVICES_PARAMS_MESSAGE_ID = (0x5D) +NV2080_CTRL_CMD_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES = (0x20800a60) +NV2080_CTRL_INTERNAL_MAX_SWIZZ_ID = 15 +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS_MESSAGE_ID = (0x60) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_NUM_CHANNELS = (0x20800a61) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_CHANNELS_PARAMS_MESSAGE_ID = (0x61) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_PROFILES = (0x20800a63) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PROFILES_PARAMS_MESSAGE_ID = (0x63) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES = (0x20800a65) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_PARTITIONABLE_ENGINES_PARAMS_MESSAGE_ID = (0x65) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES = (0x20800a66) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_SWIZZ_ID_FB_MEM_PAGE_RANGES_PARAMS_MESSAGE_ID = (0x66) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG = (0x20800a68) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG = (0x20800a67) +NV2080_CTRL_INTERNAL_KMEMSYS_GET_MIG_MEMORY_CONFIG_PARAMS_MESSAGE_ID = (0x67) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE = (0x20800a6b) +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_SIZE = 8 +NV2080_CTRL_INTERNAL_MEMSYS_GET_MIG_MEMORY_PARTITION_TABLE_PARAMS_MESSAGE_ID = (0x6B) +NV2080_CTRL_CMD_INTERNAL_RC_WATCHDOG_TIMEOUT = (0x20800a6a) +NV2080_CTRL_CMD_INTERNAL_PERF_GET_AUX_POWER_STATE = (0x20800a81) +NV2080_CTRL_INTERNAL_PERF_GET_AUX_POWER_STATE_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_SET_2X = (0x20800a9a) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_2X_MESSAGE_ID = (0x9A) +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_PSTATE = 0 +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_GPCCLK = 1 +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_LAST = NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_GPCCLK +NV2080_CTRL_INTERNAL_PERF_SYNC_GPU_BOOST_LIMITS_NUM = (0x2) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_SET_CONTROL = (0x20800a7e) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_CONTROL_PARAMS_MESSAGE_ID = (0x7E) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS = (0x20800a7f) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_SET_LIMITS_PARAMS_MESSAGE_ID = (0x7F) +NV2080_CTRL_CMD_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO = (0x20800a80) +NV2080_CTRL_INTERNAL_PERF_GPU_BOOST_SYNC_GET_INFO_PARAMS_MESSAGE_ID = (0x80) +NV2080_CTRL_CMD_INTERNAL_GMMU_REGISTER_FAULT_BUFFER = (0x20800a9b) +NV2080_CTRL_INTERNAL_GMMU_FAULT_BUFFER_MAX_PAGES = 256 +NV2080_CTRL_INTERNAL_GMMU_REGISTER_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9B) +NV2080_CTRL_CMD_INTERNAL_GMMU_UNREGISTER_FAULT_BUFFER = (0x20800a9c) +NV2080_CTRL_FAULT_BUFFER_NON_REPLAYABLE = (0x00000000) +NV2080_CTRL_FAULT_BUFFER_REPLAYABLE = (0x00000001) +NV2080_CTRL_CMD_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER = (0x20800a9d) +NV2080_CTRL_INTERNAL_GMMU_CLIENT_SHADOW_FAULT_BUFFER_MAX_PAGES = 3000 +NV2080_CTRL_INTERNAL_GMMU_REGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9D) +NV2080_CTRL_CMD_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER = (0x20800a9e) +NV2080_CTRL_INTERNAL_GMMU_UNREGISTER_CLIENT_SHADOW_FAULT_BUFFER_PARAMS_MESSAGE_ID = (0x9E) +NV2080_CTRL_CMD_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER = (0x20800a9f) +NV2080_CTRL_INTERNAL_GMMU_COPY_RESERVED_SPLIT_GVASPACE_PDES_TO_SERVER_PARAMS_MESSAGE_ID = (0x9F) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_SET_3X = (0x20800aa0) +NV2080_CTRL_INTERNAL_PERF_BOOST_SET_PARAMS_3X_MESSAGE_ID = (0xA0) +NV2080_CTRL_CMD_INTERNAL_PERF_BOOST_CLEAR_3X = (0x20800aa1) +NV2080_CTRL_INTERNAL_PERF_BOOST_CLEAR_PARAMS_3X_MESSAGE_ID = (0xA1) +NV2080_CTRL_CMD_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO = (0x20800aa2) +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO_MAX_SKYLINES = 9 +NV2080_CTRL_INTERNAL_GRMGR_SKYLINE_INFO_MAX_NON_SINGLETON_VGPCS = 64 +NV2080_CTRL_INTERNAL_STATIC_GRMGR_GET_SKYLINE_INFO_PARAMS_MESSAGE_ID = (0xA2) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_SET_PARTITIONING_MODE = (0x20800aa3) +NV2080_CTRL_INTERNAL_MIGMGR_SET_PARTITIONING_MODE_PARAMS_MESSAGE_ID = (0xA3) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE = (0x20800aa4) +NV2080_CTRL_INTERNAL_MIGMGR_CONFIGURE_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA4) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_SET_GPU_INSTANCES = (0x20800aa5) +NV2080_CTRL_INTERNAL_MIGMGR_SET_GPU_INSTANCES_PARAMS_MESSAGE_ID = (0xA5) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_GET_GPU_INSTANCES = (0x20800aa6) +NV2080_CTRL_INTERNAL_MIGMGR_GET_GPU_INSTANCES_PARAMS_MESSAGE_ID = (0xA6) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_ZBC_REFERENCED = (0x20800a69) +NV2080_CTRL_INTERNAL_MEMSYS_SET_ZBC_REFERENCED_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE = (0x20800aa7) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE = (0x20800aa8) +NV2080_CTRL_CMD_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE = (0x20800aa9) +NV2080_CTRL_CMD_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE = (0x20800aaa) +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORTED_GPU_INSTANCE_MAX_ENGINES_MASK_SIZE = 4 +NV2080_CTRL_INTERNAL_KMIGMGR_EXPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA7) +NV2080_CTRL_INTERNAL_MIGMGR_EXPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA8) +NV2080_CTRL_INTERNAL_KMIGMGR_IMPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xA9) +NV2080_CTRL_INTERNAL_MIGMGR_IMPORT_GPU_INSTANCE_PARAMS_MESSAGE_ID = (0xAA) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT = (0x20800a6c) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_PARAMS_MESSAGE_ID = (0x6c) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_ALL = (0x00000001) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_FIRST = (0x00000002) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_LAST = (0x00000004) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_NORMAL = (0x00000008) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_CLEAN = (0x00000010) +NV2080_CTRL_INTERNAL_MEMSYS_L2_INVALIDATE_EVICT_FLAGS_WAIT_FB_PULL = (0x00000020) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_FLUSH_L2_ALL_RAMS_AND_CACHES = (0x20800a6d) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_CLEAN_LTC_PROBE_FILTER = (0x20800ab0) +NV2080_CTRL_CMD_INTERNAL_BIF_GET_STATIC_INFO = (0x20800aac) +NV2080_CTRL_INTERNAL_BIF_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0xac) +NV2080_CTRL_CMD_INTERNAL_BIF_GET_DATA = (0x20800a00) +NV2080_CTRL_CMD_INTERNAL_HSHUB_PEER_CONN_CONFIG = (0x20800a88) +NV2080_CTRL_INTERNAL_HSHUB_PEER_CONN_CONFIG_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS = (0x20800a8a) +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_TABLE_SIZE = 32 +NV2080_CTRL_INTERNAL_HSHUB_GET_HSHUB_ID_FOR_LINKS_PARAMS_MESSAGE_ID = (0x8a) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_NUM_UNITS = (0x20800a8b) +NV2080_CTRL_INTERNAL_HSHUB_GET_NUM_UNITS_PARAMS_MESSAGE_ID = (0x8b) +NV2080_CTRL_CMD_INTERNAL_HSHUB_NEXT_HSHUB_ID = (0x20800a8c) +NV2080_CTRL_INTERNAL_HSHUB_NEXT_HSHUB_ID_PARAMS_MESSAGE_ID = (0x8c) +NV2080_CTRL_CMD_INTERNAL_HSHUB_EGM_CONFIG = (0x20800a8d) +NV2080_CTRL_INTERNAL_HSHUB_EGM_CONFIG_PARAMS_MESSAGE_ID = (0x8d) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_COMPUTE_PEER_ADDR = (0x20800aad) +NV2080_CTRL_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR_PARAMS_MESSAGE_ID = (0xae) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_SET_NVSWITCH_FABRIC_ADDR = (0x20800aae) +NV2080_CTRL_CMD_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT = (0x20800ab1) +NV2080_CTRL_CMD_INTERNAL_PERF_CF_CONTROLLERS_MAX_ACTIVE_VGPU_VM_COUNT_MAX_VALUE = 32 +NV2080_CTRL_INTERNAL_PERF_CF_CONTROLLERS_SET_MAX_VGPU_VM_COUNT_PARAMS_MESSAGE_ID = (0xB1) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_DISABLE_NVLINK_PEERS = (0x20800a6e) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE = (0x20800a6f) +NV2080_CTRL_INTERNAL_MEMSYS_PROGRAM_RAW_COMPRESSION_MODE_PARAMS_MESSAGE_ID = (0x6f) +NV2080_CTRL_CMD_INTERNAL_CCU_GET_SAMPLE_INFO = (0x20800ab2) +NV2080_CTRL_CMD_INTERNAL_CCU_MAP = (0x20800ab3) +NV2080_CTRL_INTERNAL_CCU_DEV_SHRBUF_COUNT_MAX = 1 +NV2080_CTRL_INTERNAL_CCU_MAP_INFO_PARAMS_MESSAGE_ID = (0xB3) +NV2080_CTRL_CMD_INTERNAL_CCU_UNMAP = (0x20800ab4) +NV2080_CTRL_INTERNAL_CCU_UNMAP_INFO_PARAMS_MESSAGE_ID = (0xB4) +NV2080_CTRL_CMD_INTERNAL_SET_P2P_CAPS = (0x20800ab5) +NV2080_CTRL_INTERNAL_SET_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB5) +NV2080_CTRL_CMD_INTERNAL_REMOVE_P2P_CAPS = (0x20800ab6) +NV2080_CTRL_INTERNAL_REMOVE_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB6) +NV2080_CTRL_CMD_INTERNAL_GET_PCIE_P2P_CAPS = (0x20800ab8) +NV2080_CTRL_INTERNAL_GET_PCIE_P2P_CAPS_PARAMS_MESSAGE_ID = (0xB8) +NV2080_CTRL_CMD_INTERNAL_BIF_SET_PCIE_RO = (0x20800ab9) +NV2080_CTRL_INTERNAL_BIF_SET_PCIE_RO_PARAMS_MESSAGE_ID = (0xB9) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE = (0x20800a76) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_UNIX_CONSOLE_PARAMS_MESSAGE_ID = (0x76) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE = (0x20800a77) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_UNIX_CONSOLE_PARAMS_MESSAGE_ID = (0x77) +NV2080_CTRL_INTERNAL_STATIC_MIGMGR_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xBB) +NV2080_CTRL_CMD_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES = (0x20800aba) +NV2080_CTRL_INTERNAL_STATIC_KMIGMGR_GET_COMPUTE_PROFILES_PARAMS_MESSAGE_ID = (0xBA) +NV2080_CTRL_CMD_INTERNAL_CCU_SET_STREAM_STATE = (0x20800abd) +NV2080_CTRL_INTERNAL_CCU_STREAM_STATE_PARAMS_MESSAGE_ID = (0xBD) +NV2080_CTRL_CMD_INTERNAL_GSYNC_ATTACH_AND_INIT = (0x20800abe) +NV2080_CTRL_INTERNAL_GSYNC_ATTACH_AND_INIT_PARAMS_MESSAGE_ID = (0xBE) +NV2080_CTRL_CMD_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS = (0x20800abf) +NV2080_CTRL_INTERNAL_GSYNC_OPTIMIZE_TIMING_PARAMETERS_PARAMS_MESSAGE_ID = (0xBF) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_DISPLAY_IDS = (0x20800ac0) +NV2080_MAX_NUM_HEADS = 4 +NV2080_CTRL_INTERNAL_GSYNC_GET_DISPLAY_IDS_PARAMS_MESSAGE_ID = (0xC0) +NV2080_CTRL_CMD_INTERNAL_GSYNC_SET_STREO_SYNC = (0x20800ac1) +NV2080_CTRL_INTERNAL_GSYNC_SET_STREO_SYNC_PARAMS_MESSAGE_ID = (0xC1) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES = (0x20800ac4) +NV2080_CTRL_INTERNAL_GSYNC_GET_VERTICAL_ACTIVE_LINES_PARAMS_MESSAGE_ID = (0xC4) +NV2080_CTRL_CMD_INTERNAL_GSYNC_IS_DISPLAYID_VALID = (0x20800ac9) +NV2080_CTRL_INTERNAL_GSYNC_IS_DISPLAYID_VALID_PARAMS_MESSAGE_ID = (0xC9) +NV2080_CTRL_CMD_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC = (0x20800aca) +NV2080_CTRL_INTERNAL_GSYNC_SET_OR_RESTORE_RASTER_SYNC_PARAMS_MESSAGE_ID = (0xCA) +NV2080_CTRL_CMD_INTERNAL_FBSR_INIT = (0x20800ac2) +NV2080_CTRL_INTERNAL_FBSR_INIT_PARAMS_MESSAGE_ID = (0xC2) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING = (0x20800ac3) +NV2080_CTRL_CMD_INTERNAL_FIFO_TOGGLE_ACTIVE_CHANNEL_SCHEDULING_PARAMS_MESSAGE_ID = (0xC3) +NV2080_CTRL_CMD_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB = (0x20800ac5) +NV2080_CTRL_INTERNAL_MEMMGR_GET_VGPU_CONFIG_HOST_RESERVED_FB_PARAMS_MESSAGE_ID = (0xC5) +NV2080_CTRL_CMD_INTERNAL_INIT_BRIGHTC_STATE_LOAD = (0x20800ac6) +NV2080_CTRL_ACPI_DSM_READ_SIZE = (0x1000) +NV2080_CTRL_INTERNAL_INIT_BRIGHTC_STATE_LOAD_PARAMS_MESSAGE_ID = (0xC6) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL_PARAMS_MESSAGE_ID = (0xC7) +NV2080_CTRL_INTERNAL_NVLINK_GET_NUM_ACTIVE_LINK_PER_IOCTRL = (0x20800ac7) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL_PARAMS_MESSAGE_ID = (0xC8) +NV2080_CTRL_INTERNAL_NVLINK_GET_TOTAL_NUM_LINK_PER_IOCTRL = (0x20800ac8) +NV2080_CTRL_CMD_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE = (0x20800acb) +NV2080_CTRL_INTERNAL_SMBPBI_PFM_REQ_HNDLR_CAP_UPDATE_PARAMS_MESSAGE_ID = (0xCB) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_PMGR = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_THERM = 0x01 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_DATA_TYPE_SMBPBI = 0x02 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_PMGR_LOAD = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_THERM_INIT = 0x01 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_SMBPBI_OP_CLEAR = 0x02 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_STATE_SYNC_FLAGS_SMBPBI_OP_SET = 0x03 +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC = (0x20800acc) +NV2080_CTRL_INTERNAL_PMGR_PFM_REQ_HNDLR_STATE_LOAD_SYNC_PARAMS_MESSAGE_ID = (0xCC) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC = (0x20800acd) +NV2080_CTRL_INTERNAL_THERM_PFM_REQ_HNDLR_STATE_INIT_SYNC_PARAMS_MESSAGE_ID = (0xCD) +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_GET_PM1_FORCED_OFF_STATUS = 0x00 +NV2080_CTRL_INTERNAL_PFM_REQ_HNDLR_GET_PM1_STATUS = 0x01 +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE = (0x20800ace) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_PM1_STATE_PARAMS_MESSAGE_ID = (0xCE) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE = (0x20800acf) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_PM1_STATE_PARAMS_MESSAGE_ID = (0xCF) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT = (0x20800ad0) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_UPDATE_EDPP_LIMIT_PARAMS_MESSAGE_ID = (0xD0) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT = (0x20800ad1) +NV2080_CTRL_CMD_INTERNAL_THERM_PFM_REQ_HNDLR_UPDATE_TGPU_LIMIT_PARAMS_MESSAGE_ID = (0xD1) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE = (0x20800ad2) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TGP_MODE_PARAMS_MESSAGE_ID = (0xD2) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2 = (0x20800ad3) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_CONFIGURE_TURBO_V2_PARAMS_MESSAGE_ID = (0xD3) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO = (0x20800ad4) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_INFO_PARAMS_MESSAGE_ID = (0xD4) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING = (0x20800ad5) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_GET_VPSTATE_MAPPING_PARAMS_MESSAGE_ID = (0xD5) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE = (0x20800ad6) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_SET_VPSTATE_PARAMS_MESSAGE_ID = (0xD6) +NV2080_CTRL_CMD_INTERNAL_GCX_ENTRY_PREREQUISITE = (0x2080a7d7) +NV2080_CTRL_INTERNAL_GCX_ENTRY_PREREQUISITE_PARAMS_MESSAGE_ID = (0xD7) +NV2080_CTRL_CMD_INTERNAL_PMGR_UNSET_DYNAMIC_BOOST_LIMIT = (0x20800a7b) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS = (0x20800ad8) +NV2080_CTRL_INTERNAL_FIFO_GET_NUM_SECURE_CHANNELS_PARAMS_MESSAGE_ID = (0xD8) +NV2080_CTRL_CMD_INTERNAL_PERF_PFM_REQ_HNDLR_DEPENDENCY_CHECK = (0x20800a45) +NV2080_CTRL_CMD_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS = (0x20800adb) +NV2080_CTRL_INTERNAL_BIF_DISABLE_SYSTEM_MEMORY_ACCESS_PARAMS_MESSAGE_ID = (0xDB) +NV2080_CTRL_CMD_INTERNAL_DISP_PINSETS_TO_LOCKPINS = (0x20800adc) +NV2080_CTRL_INTERNAL_DISP_PINSETS_TO_LOCKPINS_PARAMS_MESSAGE_ID = (0xDC) +NV2080_CTRL_CMD_INTERNAL_DETECT_HS_VIDEO_BRIDGE = (0x20800add) +NV2080_CTRL_CMD_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL = (0x20800ade) +NV2080_CTRL_INTERNAL_DISP_SET_SLI_LINK_GPIO_SW_CONTROL_PARAMS_MESSAGE_ID = (0xDE) +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA = (0x20800adf) +MAX_EDID_SIZE_FROM_SBIOS = 512 +NV2080_CTRL_CMD_INTERNAL_SET_STATIC_EDID_DATA_PARAMS_MESSAGE_ID = (0xDF) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_ACPI_SUBSYSTEM_ACTIVATED = (0x20800af0) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_PRE_MODESET = (0x20800af1) +NV2080_CTRL_CMD_INTERNAL_DISPLAY_POST_MODESET = (0x20800af2) +NV2080_CTRL_CMD_INTERNAL_GET_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF4) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_FABRIC_PROBE_INFO = (0x208001f4) +NV2080_CTRL_CMD_INTERNAL_START_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF5) +NV2080_CTRL_CMD_INTERNAL_GPU_START_FABRIC_PROBE = (0x208001f5) +NV2080_CTRL_CMD_INTERNAL_GPU_STOP_FABRIC_PROBE = (0x208001f6) +NV2080_CTRL_CMD_INTERNAL_GPU_SUSPEND_FABRIC_PROBE = (0x208001f7) +NV2080_CTRL_CMD_INTERNAL_RESUME_GPU_FABRIC_PROBE_INFO_PARAMS_MESSAGE_ID = (0xF8) +NV2080_CTRL_CMD_INTERNAL_GPU_RESUME_FABRIC_PROBE = (0x208001f8) +NV2080_CTRL_CMD_INTERNAL_GPU_INVALIDATE_FABRIC_PROBE = (0x208001f9) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO = (0x20800af3) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_GET_STATIC_INFO_PARAMS_MESSAGE_ID = (0xF3) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS = (0x20800ae1) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SIZE = 3 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_KERNEL = 0 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_USER = 1 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_SCRUBBER = 2 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_SWL_COUNT = 3 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_IVMASK_LCE_COUNT = 6 +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_SWL_KEYS_PARAMS_MESSAGE_ID = (0xE1) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS = (0x20800ae2) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_DERIVE_LCE_KEYS_PARAMS_MESSAGE_ID = (0xE2) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_ROTATE_KEYS = (0x20800ae5) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_ROTATE_KEYS_PARAMS_MESSAGE_ID = (0xE5) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION = (0x20800ae6) +NV2080_CTRL_INTERNAL_CONF_COMPUTE_RC_CHANNELS_FOR_KEY_ROTATION_PARAMS_MESSAGE_ID = (0xE6) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE = (0x20800ae7) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_GPU_STATE_PARAMS_MESSAGE_ID = (0xE7) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY = (0x20800ae8) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_SET_SECURITY_POLICY_PARAMS_MESSAGE_ID = (0xE8) +NV2080_CTRL_CMD_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID = (0x20800aef) +NV2080_CTRL_INTERNAL_FIFO_GET_LOGICAL_UPROC_ID_PARAMS_MESSAGE_ID = (0xEF) +NV2080_CTRL_CMD_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP = (0x20800afa) +CC_AES_256_GCM_AUTH_TAG_SIZE_BYTES = (0x10) +NV2080_CTRL_INTERNAL_MEMMGR_MEMORY_TRANSFER_WITH_GSP_PARAMS_MESSAGE_ID = (0xFA) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG = (0x20800afb) +NV2080_CTRL_INTERNAL_MEMSYS_GET_LOCAL_ATS_CONFIG_PARAMS_MESSAGE_ID = (0xFB) +NV2080_CTRL_CMD_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG = (0x20800afc) +NV2080_CTRL_INTERNAL_MEMSYS_SET_PEER_ATS_CONFIG_PARAMS_MESSAGE_ID = (0xFC) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO = (0x20800afd) +NV2080_CTRL_CMD_INTERNAL_PMGR_PFM_REQ_HNDLR_GET_EDPP_LIMIT_INFO_PARAMS_MESSAGE_ID = (0xFD) +NV2080_CTRL_INTERNAL_INIT_USER_SHARED_DATA_PARAMS_MESSAGE_ID = (0xFE) +NV2080_CTRL_CMD_INTERNAL_INIT_USER_SHARED_DATA = (0x20800afe) +NV2080_CTRL_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL_PARAMS_MESSAGE_ID = (0xFF) +NV2080_CTRL_CMD_INTERNAL_USER_SHARED_DATA_SET_DATA_POLL = (0x20800aff) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_PARAMS_MESSAGE_ID = (0xE3) +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_START_KEEP_OLDEST = 0x00 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_START_KEEP_NEWEST = 0x01 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE_FLAG_STOP = 0x02 +NV2080_CTRL_CMD_INTERNAL_CONTROL_GSP_TRACE = (0x208001e3) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES_PARAMS_MESSAGE_ID = (0xAF) +NV2080_CTRL_CMD_INTERNAL_GET_ENABLED_SEC2_CLASSES = (0x20800aaf) +NV2080_CTRL_CMD_INTERNAL_GR_CTXSW_SETUP_BIND = (0x20800ae4) +NV2080_CTRL_INTERNAL_GR_CTXSW_SETUP_BIND_PARAMS_MESSAGE_ID = (0xE4) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER_PARAMS_MESSAGE_ID = (0xE9) +NV2080_CTRL_INTERNAL_GPU_CLIENT_LOW_POWER_MODE_ENTER = (0x20800ae9) +NV2080_CTRL_CMD_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY = (0x20800aea) +NV2080_CTRL_INTERNAL_NVLINK_POST_FATAL_ERROR_RECOVERY_PARAMS_MESSAGE_ID = (0xEA) +NV2080_CTRL_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP_PARAMS_MESSAGE_ID = (0xEB) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_GSP_RM_FREE_HEAP = (0x20800aeb) +NV2080_CTRL_INTERNAL_GPU_SET_ILLUM_PARAMS_MESSAGE_ID = (0xEC) +NV2080_CTRL_CMD_INTERNAL_GPU_SET_ILLUM = (0x20800aec) +NV2080_CTRL_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR_PARAMS_MESSAGE_ID = (0xED) +NV2080_CTRL_CMD_INTERNAL_GSYNC_APPLY_STEREO_PIN_ALWAYS_HI_WAR = (0x20800aed) +NV2080_CTRL_CMD_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM = (0x20800a79) +NV2080_CTRL_INTERNAL_HSHUB_GET_MAX_HSHUBS_PER_SHIM_PARAMS_MESSAGE_ID = (0x79) +NV2080_CTRL_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_RASTER_SYNC_DECODE_MODE = (0x20800a14) +NV2080_CTRL_INTERNAL_GPU_GET_PF_BAR1_SPA_PARAMS_MESSAGE_ID = (0xEE) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_PF_BAR1_SPA = (0x20800aee) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_NVLINK_PEER = (0x20800a21) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x21) +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_OFF = 0x00 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_HS = 0x01 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SAFE = 0x02 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_FAULT = 0x03 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RECOVERY = 0x04 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_FAIL = 0x05 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DETECT = 0x06 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RESET = 0x07 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ENABLE_PM = 0x08 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_PM = 0x09 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SLEEP = 0x0A +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_SAVE_STATE = 0x0B +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_RESTORE_STATE = 0x0C +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_PRE_HS = 0x0E +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_ERR_DETECT = 0x0F +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_LANE_DISABLE = 0x10 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_LANE_SHUTDOWN = 0x11 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_TRAFFIC_SETUP = 0x12 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITPHASE1 = 0x13 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITNEGOTIATE = 0x14 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_POST_INITNEGOTIATE = 0x15 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITOPTIMIZE = 0x16 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_POST_INITOPTIMIZE = 0x17 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_DISABLE_HEARTBEAT = 0x18 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_CONTAIN = 0x19 +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITTL = 0x1A +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INITPHASE5 = 0x1B +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ALI = 0x1C +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_ACTIVE_PENDING = 0x1D +NV2080_INTERNAL_NVLINK_CORE_LINK_STATE_INVALID = 0xFF +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_HS = 0x00 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_SINGLE_LANE = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_LOW_POWER = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_TRAIN = 0x05 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_SAFE = 0x06 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_OFF = 0x07 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_COMMON_MODE = 0x08 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_COMMON_MODE_DISABLE = 0x09 +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_DATA_READY = 0x0A +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_EQ = 0x0B +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_PRBS_EN = 0x0C +NV2080_NVLINK_CORE_SUBLINK_STATE_TX_POST_HS = 0x0D +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_HS = 0x00 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_SINGLE_LANE = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_LOW_POWER = 0x04 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_TRAIN = 0x05 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_SAFE = 0x06 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_OFF = 0x07 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_RXCAL = 0x08 +NV2080_NVLINK_CORE_SUBLINK_STATE_RX_INIT_TERM = 0x09 +NV2080_CTRL_INTERNAL_NVLINK_MAX_SEED_NUM = 6 +NV2080_CTRL_INTERNAL_NVLINK_MAX_SEED_BUFFER_SIZE = (0x7) +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_DL_LINK_MODE = 0x00 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_DL_LINK_MODE = 0x01 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_TL_LINK_MODE = 0x02 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_TL_LINK_MODE = 0x03 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_TX_SUBLINK_MODE = 0x04 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_TX_SUBLINK_MODE = 0x05 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_RX_SUBLINK_MODE = 0x06 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_RX_SUBLINK_MODE = 0x07 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_RX_SUBLINK_DETECT = 0x08 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_SET_RX_SUBLINK_DETECT = 0x09 +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_WRITE_DISCOVERY_TOKEN = 0x0A +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_READ_DISCOVERY_TOKEN = 0x0B +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_TRAINING_COMPLETE = 0x0C +NV2080_CTRL_INTERNAL_NVLINK_CALLBACK_TYPE_GET_UPHY_LOAD = 0x0D +NV2080_CTRL_INTERNAL_NVLINK_CORE_CALLBACK_PARAMS_MESSAGE_ID = (0x24) +NV2080_CTRL_CMD_INTERNAL_NVLINK_CORE_CALLBACK = (0x20800a24) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID_PARAMS_MESSAGE_ID = (0x25) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_REMOTE_LOCAL_SID = (0x20800a25) +NV2080_CTRL_INTERNAL_NVLINK_GET_ALI_ENABLED_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_ALI_ENABLED = (0x20800a29) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_TYPE_PROGRAM = 0x0 +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_TYPE_RESET = 0x1 +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_HSHUB_MUX_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_HSHUB_MUX = (0x20800a42) +NV2080_CTRL_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x4E) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PRE_SETUP_NVLINK_PEER = (0x20800a4e) +NV2080_CTRL_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_INTERNAL_NVLINK_POST_SETUP_NVLINK_PEER = (0x20800a50) +NV2080_CTRL_CMD_INTERNAL_LOG_OOB_XID = (0x20800a56) +NV2080_INTERNAL_OOB_XID_MESSAGE_BUFFER_SIZE = (81) +NV2080_CTRL_INTERNAL_LOG_OOB_XID_PARAMS_MESSAGE_ID = (0x56) +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_TYPE_SYSMEM = 0x1 +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_TYPE_PEER = 0x2 +NV2080_CTRL_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING_PARAMS_MESSAGE_ID = (0x5F) +NV2080_CTRL_CMD_INTERNAL_NVLINK_REMOVE_NVLINK_MAPPING = (0x20800a5f) +NV2080_CTRL_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE_PARAMS_MESSAGE_ID = (0x62) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SAVE_RESTORE_HSHUB_STATE = (0x20800a62) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_SET = (0x00000000) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_SAVE = (0x00000001) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_FLAGS_RESTORE = (0x00000002) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_BUFFERREADY_PARAMS_MESSAGE_ID = (0x64) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROGRAM_BUFFERREADY = (0x20800a64) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG_PARAMS_MESSAGE_ID = (0x78) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_CURRENT_CONFIG = (0x20800a78) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK_PARAMS_MESSAGE_ID = (0x7D) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_PEER_LINK_MASK = (0x20800a7d) +NV2080_CTRL_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_INTERNAL_NVLINK_UPDATE_LINK_CONNECTION = (0x20800a82) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_LINKS_POST_TOPOLOGY = (0x20800a83) +NV2080_CTRL_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI_PARAMS_MESSAGE_ID = (0x84) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PRE_LINK_TRAIN_ALI = (0x20800a84) +NV2080_CTRL_INTERNAL_NVLINK_MAX_ARR_SIZE = 64 +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_LINK_MASK_POST_RX_DET = (0x20800a85) +NV2080_CTRL_INTERNAL_NVLINK_LINK_TRAIN_ALI_PARAMS_MESSAGE_ID = (0x86) +NV2080_CTRL_CMD_INTERNAL_NVLINK_LINK_TRAIN_ALI = (0x20800a86) +NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_INVALID_TIME_MS = 0 +NV2080_CTRL_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_NVLINK_DEVICE_INFO = (0x20800a87) +NV2080_CTRL_INTERNAL_NVLINK_MAX_LINKS_PER_IOCTRL_SW = 6 +NV2080_CTRL_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_IOCTRL_DEVICE_INFO = (0x20800a8e) +NV2080_CTRL_INTERNAL_NVLINK_PROGRAM_LINK_SPEED_PARAMS_MESSAGE_ID = (0x8F) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROGRAM_LINK_SPEED = (0x20800a8f) +NV2080_CTRL_INTERNAL_NVLINK_ARE_LINKS_TRAINED_PARAMS_MESSAGE_ID = (0x90) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ARE_LINKS_TRAINED = (0x20800a90) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_ASSERT = (0x00000000) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_DEASSERT = (0x00000001) +NV2080_CTRL_INTERNAL_NVLINK_RESET_FLAGS_TOGGLE = (0x00000002) +NV2080_CTRL_INTERNAL_NVLINK_RESET_LINKS_PARAMS_MESSAGE_ID = (0x91) +NV2080_CTRL_CMD_INTERNAL_NVLINK_RESET_LINKS = (0x20800a91) +NV2080_CTRL_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_CMD_INTERNAL_NVLINK_DISABLE_DL_INTERRUPTS = (0x20800a92) +NV2080_CTRL_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO_PARAMS_MESSAGE_ID = (0x93) +NV2080_CTRL_CMD_INTERNAL_NVLINK_GET_LINK_AND_CLOCK_INFO = (0x20800a93) +NV2080_CTRL_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM_PARAMS_MESSAGE_ID = (0x94) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SETUP_NVLINK_SYSMEM = (0x20800a94) +NV2080_CTRL_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS_PARAMS_MESSAGE_ID = (0x95) +NV2080_CTRL_CMD_INTERNAL_NVLINK_PROCESS_FORCED_CONFIGS = (0x20800a95) +NV2080_CTRL_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_INTERNAL_NVLINK_SYNC_NVLINK_SHUTDOWN_PROPS = (0x20800a96) +NV2080_CTRL_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS_PARAMS_MESSAGE_ID = (0x97) +NV2080_CTRL_CMD_INTERNAL_NVLINK_ENABLE_SYSMEM_NVLINK_ATS = (0x20800a97) +NV2080_CTRL_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK_PARAMS_MESSAGE_ID = (0xAB) +NV2080_CTRL_CMD_INTERNAL_NVLINK_HSHUB_GET_SYSMEM_NVLINK_MASK = (0x20800aab) +NV2080_CTRL_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO_PARAMS_MESSAGE_ID = (0x89) +NV2080_CTRL_CMD_INTERNAL_SEND_CMC_LIBOS_BUFFER_INFO = (0x20800a89) +NV2080_CTRL_INTERNAL_HFRP_INSTANCE_SIZE = 5 +NV2080_CTRL_INTERNAL_GPU_GET_HFRP_INFO_PARAMS_MESSAGE_ID = (0x7A) +NV2080_CTRL_CMD_INTERNAL_GPU_GET_HFRP_INFO = (0x20800a7a) +NV2080_CTRL_INTERNAL_SEND_CMC_UMD_API_OP_PARAMS_MESSAGE_ID = (0x7C) +NV2080_INTERNAL_CMC_UMD_API_TASK_CONSTRUCT = 0x0 +NV2080_INTERNAL_CMC_UMD_API_TASK_DESTROY = 0x1 +NV2080_INTERNAL_CMC_UMD_API_TASK_ADD_QUEUE = 0x2 +NV2080_CTRL_CMD_INTERNAL_SEND_CMC_UMD_API_OP = (0x20800a7c) +NV2080_CTRL_CMD_INTERNAL_NVLINK_REPLAY_SUPPRESSED_ERRORS = (0x20800b01) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS_MESSAGE_ID = (0x02) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_V2 = (0x20800b03) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_RATE_MODIFIER_V2_PARAMS_MESSAGE_ID = (0x03) +NV2080_CTRL_INTERNAL_STATIC_GR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS_MESSAGE_ID = (0x04) +NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_SM_ISSUE_THROTTLE_CTRL = (0x20800b05) +NV2080_CTRL_INTERNAL_STATIC_KGR_GET_SM_ISSUE_THROTTLE_CTRL_PARAMS_MESSAGE_ID = (0x05) +NV2080_CTRL_CMD_INTERNAL_FLCN_SET_VIDEO_EVENT_BUFFER_MEMORY = (0x20800b11) +NV2080_CTRL_INTERNAL_FLCN_SET_VIDEO_EVENT_BUFFER_MEMORY_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_ROTATE_PER_CHANNEL_KEYS = (0x20800b07) +NV2080_CTRL_CMD_INTERNAL_CONF_COMPUTE_ROTATE_PER_CHANNEL_KEYS_PARAMS_MESSAGE_ID = (0x07) +NV2080_CTRL_CMD_INTERNAL_NVLINK_RC_USER_MODE_CHANNELS = (0x20800b08) +NV2080_CTRL_CMD_INTERNAL_GSYNC_GET_POSSIBLE_REFRESH_RATES = (0x20800b06) +NV2080_CTRL_INTERNAL_GSYNC_GET_POSSIBLE_REFRESH_RATES_PARAMS_MESSAGE_ID = (0x06) +NV2080_CTRL_CMD_INTERNAL_UCODE_INSTRUMENTATION_GET_STATE = (0x20800b12) +NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_STATE_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_INTERNAL_UCODE_INSTRUMENTATION_SET_STATE = (0x20800b13) +NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_SET_STATE_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_MAX_DATA_SIZE = 65536 +NV2080_CTRL_CMD_INTERNAL_UCODE_INSTRUMENTATION_GET_DATA = (0x20800b14) +NV2080_CTRL_INTERNAL_UCODE_INSTRUMENTATION_GET_DATA_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL = (0x20802801) +NV2080_CTRL_LPWR_DIFR_CTRL_DISABLE = (0x00000001) +NV2080_CTRL_LPWR_DIFR_CTRL_ENABLE = (0x00000002) +NV2080_CTRL_LPWR_DIFR_CTRL_SUPPORT_STATUS = (0x00000003) +NV2080_CTRL_CMD_LPWR_DIFR_CTRL_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_LPWR_DIFR_SUPPORTED = (0x00000001) +NV2080_CTRL_LPWR_DIFR_NOT_SUPPORTED = (0x00000002) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE = (0x20802802) +NV2080_CTRL_LPWR_DIFR_PREFETCH_SUCCESS = (0x00000001) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_OS_FLIPS_ENABLED = (0x00000002) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_INSUFFICIENT_L2_SIZE = (0x00000003) +NV2080_CTRL_LPWR_DIFR_PREFETCH_FAIL_CE_HW_ERROR = (0x00000004) +NV2080_CTRL_CMD_LPWR_DIFR_PREFETCH_RESPONSE_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_MC_GET_ARCH_INFO = (0x20801701) +NV2080_CTRL_MC_GET_ARCH_INFO_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_T23X = (0xE0000023) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_TU100 = (0x00000160) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GA100 = (0x00000170) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GH100 = (0x00000180) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_AD100 = (0x00000190) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GB100 = (0x000001A0) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GB200 = (0x000001B0) +NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_GR100 = (0x000001C0) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_T234 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_T234D = (0x00000005) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU116 = (0x00000008) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_TU117 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA103 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA107 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GA10B = (0x0000000B) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GH100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GH100_SOC = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD000 = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD101 = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD103 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD104 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD106 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_AD107 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB110 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB112 = (0x00000004) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB200 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB202 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB203 = (0x00000003) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB205 = (0x00000005) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB206 = (0x00000006) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB207 = (0x00000007) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB20B = (0x0000000B) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GB20C = (0x0000000C) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GR100 = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_GR102 = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_NO_SUBREVISION = (0x00000000) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_P = (0x00000001) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_Q = (0x00000002) +NV2080_CTRL_MC_ARCH_INFO_SUBREVISION_R = (0x00000003) +NV2080_CTRL_CMD_MC_SERVICE_INTERRUPTS = (0x20801702) +NV2080_CTRL_MC_ENGINE_ID_GRAPHICS = 0x00000001 +NV2080_CTRL_MC_ENGINE_ID_ALL = 0xFFFFFFFF +NV2080_CTRL_MC_SERVICE_INTERRUPTS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_MC_GET_MANUFACTURER = (0x20801703) +NV2080_CTRL_MC_GET_MANUFACTURER_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP = (0x2080170c) +NV2080_CTRL_MC_CHANGE_REPLAYABLE_FAULT_OWNERSHIP_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS = (0x2080170d) +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_MAX_ENGINES = 256 +NV2080_CTRL_MC_GET_ENGINE_NOTIFICATION_INTR_VECTORS_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_MC_GET_STATIC_INTR_TABLE = (0x2080170e) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_MAX = 32 +NV2080_INTR_TYPE_NULL = (0x00000000) +NV2080_INTR_TYPE_NON_REPLAYABLE_FAULT = (0x00000001) +NV2080_INTR_TYPE_NON_REPLAYABLE_FAULT_ERROR = (0x00000002) +NV2080_INTR_TYPE_INFO_FAULT = (0x00000003) +NV2080_INTR_TYPE_REPLAYABLE_FAULT = (0x00000004) +NV2080_INTR_TYPE_REPLAYABLE_FAULT_ERROR = (0x00000005) +NV2080_INTR_TYPE_ACCESS_CNTR = (0x00000006) +NV2080_INTR_TYPE_TMR = (0x00000007) +NV2080_INTR_TYPE_CPU_DOORBELL = (0x00000008) +NV2080_INTR_TYPE_GR0_FECS_LOG = (0x00000009) +NV2080_INTR_TYPE_GR1_FECS_LOG = (0x0000000A) +NV2080_INTR_TYPE_GR2_FECS_LOG = (0x0000000B) +NV2080_INTR_TYPE_GR3_FECS_LOG = (0x0000000C) +NV2080_INTR_TYPE_GR4_FECS_LOG = (0x0000000D) +NV2080_INTR_TYPE_GR5_FECS_LOG = (0x0000000E) +NV2080_INTR_TYPE_GR6_FECS_LOG = (0x0000000F) +NV2080_INTR_TYPE_GR7_FECS_LOG = (0x00000010) +NV2080_CTRL_MC_GET_STATIC_INTR_TABLE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_MC_GET_INTR_CATEGORY_SUBTREE_MAP = (0x2080170f) +NV2080_CTRL_MC_GET_INTR_CATEGORY_SUBTREE_MAP_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_NVD_GET_DUMP_SIZE = (0x20802401) +NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_NVD_GET_DUMP = (0x20802402) +NV2080_CTRL_NVD_GET_DUMP_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_NVD_GET_NOCAT_JOURNAL = (0x20802409) +NV2080_NOCAT_JOURNAL_MAX_DIAG_BUFFER = 1024 +NV2080_NOCAT_JOURNAL_MAX_STR_LEN = 65 +NV2080_NOCAT_JOURNAL_MAX_JOURNAL_RECORDS = 10 +NV2080_NOCAT_JOURNAL_MAX_ASSERT_RECORDS = 32 +NV2080_NOCAT_JOURNAL_REC_TYPE_UNKNOWN = 0 +NV2080_NOCAT_JOURNAL_REC_TYPE_BUGCHECK = 1 +NV2080_NOCAT_JOURNAL_REC_TYPE_ENGINE = 2 +NV2080_NOCAT_JOURNAL_REC_TYPE_TDR = 3 +NV2080_NOCAT_JOURNAL_REC_TYPE_RC = 4 +NV2080_NOCAT_JOURNAL_REC_TYPE_ASSERT = 5 +NV2080_NOCAT_JOURNAL_REC_TYPE_ANY = 6 +NV2080_NOCAT_JOURNAL_REC_TYPE_COUNT = (0x7) +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_REQ_IDX = 0 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_GRANDFATHERED_RECORD_IDX = 1 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_ALLOCATED_IDX = 2 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECTED_IDX = 3 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NOTIFICATIONS_IDX = 4 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NOTIFICATION_FAIL_IDX = 5 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_ALLOC_FAILED_IDX = 6 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_FAILED_IDX = 7 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_LOCKED_OUT_IDX = 8 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_CTRL_INSERT_RECORDS_IDX = 9 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RPC_INSERT_RECORDS_IDX = 10 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_LOCKED_IDX = 11 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_LOCK_UPDATED_IDX = 12 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_UNLOCKED_IDX = 13 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NO_RECORDS_IDX = 14 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_BUFFER_IDX = 15 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_MATCH_FOUND_IDX = 16 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NO_MATCH_IDX = 17 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_CLOSEST_FOUND_IDX = 18 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_REQUESTED_IDX = 19 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_REPORTED_IDX = 20 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_DROPPED_IDX = 21 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATE_REQ_IDX = 22 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATED_IDX = 23 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATE_FAILED_IDX = 24 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BUSY_IDX = 25 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_PARAM_IDX = 26 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_TYPE_IDX = 27 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES4_IDX = 28 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES3_IDX = 29 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES2_IDX = 30 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES1_IDX = 31 +NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COUNTER_COUNT = (0x20) +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY = (0, 0) +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY_YES = 1 +NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY_NO = 0 +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS = (1, 1) +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS_YES = 1 +NV2080_CTRL_NOCAT_GET_RESET_COUNTERS_NO = 0 +NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_NVD_SET_NOCAT_JOURNAL_DATA = (0x2080240b) +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_EMPTY = 0 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_TDR_REASON = 1 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_SET_TAG = 2 +NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_RCLOG = 3 +NV2080_CTRL_NOCAT_TDR_TYPE_NONE = 0 +NV2080_CTRL_NOCAT_TDR_TYPE_LEGACY = 1 +NV2080_CTRL_NOCAT_TDR_TYPE_FULLCHIP = 2 +NV2080_CTRL_NOCAT_TDR_TYPE_BUSRESET = 3 +NV2080_CTRL_NOCAT_TDR_TYPE_GC6_RESET = 4 +NV2080_CTRL_NOCAT_TDR_TYPE_SURPRISE_REMOVAL = 5 +NV2080_CTRL_NOCAT_TDR_TYPE_UCODE_RESET = 6 +NV2080_CTRL_NOCAT_TDR_TYPE_GPU_RC_RESET = 7 +NV2080_CTRL_NOCAT_TDR_TYPE_TEST = 8 +NV2080_CTRL_NOCAT_TAG_CLEAR = (0, 0) +NV2080_CTRL_NOCAT_TAG_CLEAR_YES = 1 +NV2080_CTRL_NOCAT_TAG_CLEAR_NO = 0 +NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD = (0x2080240c) +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR = (0, 0) +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR_YES = 1 +NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR_NO = 0 +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER = (1, 1) +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER_YES = 1 +NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER_NO = 0 +NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_NVLINK_CAPS_TBL_SIZE = 2 +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_INVALID = (0x00000000) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_CAPS_NVLINK_VERSION_6_0 = (0x00000009) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_INVALID = (0x00000000) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_CAPS_NCI_VERSION_6_0 = (0x00000009) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_CAPS = (0x20803001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS = (31, 0) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_NONE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_PCI = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_ID_FLAGS_UUID = (0x00000002) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_EBRIDGE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_NPU = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_GPU = (0x00000002) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_SWITCH = (0x00000003) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_TEGRA = (0x00000004) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_TYPE_NONE = (0x000000FF) +NV2080_CTRL_NVLINK_DEVICE_INFO_DEVICE_UUID_INVALID = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED = (0, 0) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_GPU_DEGRADED_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY = (1, 1) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY_INACTIVE = (0x00000000) +NV2080_CTRL_NVLINK_DEVICE_INFO_FABRIC_RECOVERY_STATUS_MASK_UNCONTAINED_ERROR_RECOVERY_ACTIVE = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_INIT = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_HWCFG = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_SWCFG = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_ACTIVE = (0x00000003) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_FAULT = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_SLEEP = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY_AC = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_RECOVERY_RX = (0x0000000a) +NV2080_CTRL_NVLINK_STATUS_LINK_STATE_INVALID = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_HIGH_SPEED_1 = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_LOW_POWER = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_TRAINING = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_SAFE_MODE = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_TEST = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_FAULT = (0x0000000e) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_RX_STATE_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_HIGH_SPEED_1 = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_LOW_POWER = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_TRAINING = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_SAFE_MODE = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_TEST = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_FAULT = (0x0000000e) +NV2080_CTRL_NVLINK_STATUS_SUBLINK_TX_STATE_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_PHY_NVHS = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_PHY_GRS = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_PHY_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_6_0 = (0x00000009) +NV2080_CTRL_NVLINK_STATUS_NVLINK_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_2_0 = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_2_2 = (0x00000004) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_3_0 = (0x00000005) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_3_1 = (0x00000006) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_4_0 = (0x00000007) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_5_0 = (0x00000008) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_6_0 = (0x00000009) +NV2080_CTRL_NVLINK_STATUS_NCI_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_NVHS_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_NVHS_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_GRS_VERSION_1_0 = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_GRS_VERSION_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_STATUS_CONNECTED_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_CONNECTED_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_LOOPBACK = (0x00000001) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_LOOPOUT = (0x00000002) +NV2080_CTRL_NVLINK_STATUS_LOOP_PROPERTY_NONE = (0x00000000) +NV2080_CTRL_NVLINK_STATUS_REMOTE_LINK_NUMBER_INVALID = (0x000000FF) +NV2080_CTRL_NVLINK_REFCLK_TYPE_INVALID = (0x00) +NV2080_CTRL_NVLINK_REFCLK_TYPE_NVHS = (0x01) +NV2080_CTRL_NVLINK_REFCLK_TYPE_PEX = (0x02) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_STATUS = (0x20803002) +NV2080_CTRL_NVLINK_GET_TL_ERRLOG_BIT = lambda intr,i: (((1 << i) & (intr)) >> i) # type: ignore +NV2080_CTRL_NVLINK_GET_TL_INTEN_BIT = lambda intr,i: NV2080_CTRL_NVLINK_GET_TL_ERRLOG_BIT(intr, i) # type: ignore +NV2080_CTRL_NVLINK_TL_ERRLOG_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_TL_ERRLOG_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_TL_INTEN_TRUE = (0x00000001) +NV2080_CTRL_NVLINK_TL_INTEN_FALSE = (0x00000000) +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXDLDATAPARITYEN = 0 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXDLCTRLPARITYEN = 1 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXPROTOCOLEN = 2 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXOVERFLOWEN = 3 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRAMDATAPARITYEN = 4 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRAMHDRPARITYEN = 5 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXRESPEN = 6 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_RXPOISONEN = 7 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXRAMDATAPARITYEN = 8 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXRAMHDRPARITYEN = 9 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_DLFLOWPARITYEN = 10 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_DLHDRPARITYEN = 12 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_TXCREDITEN = 13 +NV2080_CTRL_NVLINK_TL_INTEN_IDX_MAX = 14 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXDLDATAPARITYERR = 0 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXDLCTRLPARITYERR = 1 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXPROTOCOLERR = 2 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXOVERFLOWERR = 3 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRAMDATAPARITYERR = 4 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRAMHDRPARITYERR = 5 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXRESPERR = 6 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_RXPOISONERR = 7 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXRAMDATAPARITYERR = 8 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXRAMHDRPARITYERR = 9 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_DLFLOWPARITYERR = 10 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_DLHDRPARITYERR = 12 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_TXCREDITERR = 13 +NV2080_CTRL_NVLINK_TL_ERRLOG_IDX_MAX = 14 +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_HS = (0x00000000) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_TRAIN = (0x00000005) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_SAFE = (0x00000006) +NV2080_CTRL_NVLINK_SL0_SLSM_STATUS_TX_PRIMARY_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_HS = (0x00000000) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_SINGLE_LANE = (0x00000004) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_TRAIN = (0x00000005) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_SAFE = (0x00000006) +NV2080_CTRL_NVLINK_SL1_SLSM_STATUS_RX_PRIMARY_STATE_OFF = (0x00000007) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_DEFAULT = (0x0) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_INTR_STATUS = (0x1) +NV2080_CTRL_NVLINK_ERR_INFO_FLAGS_ALI_STATUS = (0x2) +NV2080_CTRL_NVLINK_MAX_IOCTRLS = 3 +NV2080_CTRL_NVLINK_GET_ERR_INFO_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_NVLINK_GET_ERR_INFO = (0x20803003) +NV2080_CTRL_NVLINK_COUNTER_INVALID = 0x00000000 +NV2080_CTRL_NVLINK_COUNTER_TL_TX0 = 0x00000001 +NV2080_CTRL_NVLINK_COUNTER_TL_TX1 = 0x00000002 +NV2080_CTRL_NVLINK_COUNTER_TL_RX0 = 0x00000004 +NV2080_CTRL_NVLINK_COUNTER_TL_RX1 = 0x00000008 +NV2080_CTRL_NVLINK_LP_COUNTERS_DL = 0x00000010 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L = lambda i: (1 << (i + 8)) # type: ignore +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE__SIZE = 4 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L0 = 0x00000100 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L1 = 0x00000200 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L2 = 0x00000400 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_ECC_LANE_L3 = 0x00000800 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_FLIT = 0x00010000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L = lambda i: (1 << (i + 17)) # type: ignore +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE__SIZE = 8 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L0 = 0x00020000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L1 = 0x00040000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L2 = 0x00080000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L3 = 0x00100000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L4 = 0x00200000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L5 = 0x00400000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L6 = 0x00800000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_LANE_L7 = 0x01000000 +NV2080_CTRL_NVLINK_COUNTER_DL_TX_ERR_REPLAY = 0x02000000 +NV2080_CTRL_NVLINK_COUNTER_DL_TX_ERR_RECOVERY = 0x04000000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_REPLAY = 0x08000000 +NV2080_CTRL_NVLINK_COUNTER_DL_RX_ERR_CRC_MASKED = 0x10000000 +NV2080_CTRL_NVLINK_COUNTER_MAX_TYPES = 32 +NV2080_CTRL_NVLINK_GET_COUNTERS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_NVLINK_GET_COUNTERS = (0x20803004) +NV2080_CTRL_CMD_NVLINK_CLEAR_COUNTERS = (0x20803005) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_NVLINK_COUNTER_TP_TL_TX0 = 0 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_TX1 = 1 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_RX0 = 2 +NV2080_CTRL_NVLINK_COUNTER_TP_TL_RX1 = 3 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_SIZE = 4 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L0 = 4 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L1 = 5 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L2 = 6 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_ECC_LANE_L3 = 7 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_SIZE = 8 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L0 = 8 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L1 = 9 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L2 = 10 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L3 = 11 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L4 = 12 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L5 = 13 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L6 = 14 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_LANE_L7 = 15 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_TX_ERR_RECOVERY = 16 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_TX_ERR_REPLAY = 17 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_REPLAY = 18 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_MASKED = 19 +NV2080_CTRL_NVLINK_COUNTER_ERR_DL_RX_ERR_CRC_FLIT = 20 +NV2080_CTRL_NVLINK_COUNTER_LP_DL = 21 +NV2080_CTRL_NVLINK_COUNTER_V1_MAX_COUNTER = NV2080_CTRL_NVLINK_COUNTER_LP_DL +NV2080_CTRL_NVLINK_COUNTER_XMIT_PACKETS = 22 +NV2080_CTRL_NVLINK_COUNTER_XMIT_BYTES = 23 +NV2080_CTRL_NVLINK_COUNTER_RCV_PACKETS = 24 +NV2080_CTRL_NVLINK_COUNTER_RCV_BYTES = 25 +NV2080_CTRL_NVLINK_COUNTER_LINK_ERROR_RECOVERY_COUNTER = 26 +NV2080_CTRL_NVLINK_COUNTER_LINK_DOWNED_COUNTER = 27 +NV2080_CTRL_NVLINK_COUNTER_LINK_RECOVERY_SUCCESSFUL_COUNTER = 28 +NV2080_CTRL_NVLINK_COUNTER_RCV_ERRORS = 29 +NV2080_CTRL_NVLINK_COUNTER_RCV_REMOTE_ERRORS = 30 +NV2080_CTRL_NVLINK_COUNTER_RCV_GENERAL_ERRORS = 31 +NV2080_CTRL_NVLINK_COUNTER_RCV_MALFORMED_PKT_ERROR = 32 +NV2080_CTRL_NVLINK_COUNTER_RCV_BUFFER_OVERRUN_ERROR = 33 +NV2080_CTRL_NVLINK_COUNTER_RCV_VL15DROPPED_ERROR = 34 +NV2080_CTRL_NVLINK_COUNTER_LINK_INTEGRITY_ERRORS = 35 +NV2080_CTRL_NVLINK_COUNTER_BUFFER_OVERRUN_ERRORS = 36 +NV2080_CTRL_NVLINK_COUNTER_XMIT_WAIT_TIME = 37 +NV2080_CTRL_NVLINK_COUNTER_XMIT_ERRORS = 38 +NV2080_CTRL_NVLINK_COUNTER_SINGLE_ERROR_BLOCKS = 39 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_BLOCKS = 40 +NV2080_CTRL_NVLINK_COUNTER_UNCORRECTED_BLOCKS = 41 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_LANE_0 = 42 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_LANE_1 = 43 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_SYMBOLS_TOTAL = 44 +NV2080_CTRL_NVLINK_COUNTER_RAW_ERRORS_LANE_0 = 45 +NV2080_CTRL_NVLINK_COUNTER_RAW_ERRORS_LANE_1 = 46 +NV2080_CTRL_NVLINK_COUNTER_CORRECTED_BITS = 47 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_LANE_0 = 48 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_LANE_1 = 49 +NV2080_CTRL_NVLINK_COUNTER_RAW_BER_TOTAL = 50 +NV2080_CTRL_NVLINK_COUNTER_NO_ERROR_BLOCKS = 51 +NV2080_CTRL_NVLINK_COUNTER_EFFECTIVE_ERRORS = 52 +NV2080_CTRL_NVLINK_COUNTER_EFFECTIVE_BER = 53 +NV2080_CTRL_NVLINK_COUNTER_SYMBOL_ERRORS = 54 +NV2080_CTRL_NVLINK_COUNTER_SYMBOL_BER = 55 +NV2080_CTRL_NVLINK_COUNTER_RECEIVED_BITS = 56 +NV2080_CTRL_NVLINK_COUNTER_SYNC_HEADER_ERRORS = 57 +NV2080_CTRL_NVLINK_COUNTER_TIME_SINCE_LAST_CLEAR = 58 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS = 59 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS_WITH_UNCORRECTABLE_ERRORS = 60 +NV2080_CTRL_NVLINK_COUNTER_PLR_RCV_BLOCKS_WITH_ERRORS = 61 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_BLOCKS = 62 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_RETRY_BLOCKS = 63 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_RETRY_EVENTS = 64 +NV2080_CTRL_NVLINK_COUNTER_PLR_BW_LOSS = 65 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_GOOD = 66 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_ERROR = 67 +NV2080_CTRL_NVLINK_COUNTER_NVLE_RX_AUTH = 68 +NV2080_CTRL_NVLINK_COUNTER_NVLE_TX_GOOD = 69 +NV2080_CTRL_NVLINK_COUNTER_NVLE_TX_ERROR = 70 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_0 = 71 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_1 = 72 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_2 = 73 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_3 = 74 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_4 = 75 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_5 = 76 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_6 = 77 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_7 = 78 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_8 = 79 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_9 = 80 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_10 = 81 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_11 = 82 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_12 = 83 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_13 = 84 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_14 = 85 +NV2080_CTRL_NVLINK_COUNTER_HISTORY_15 = 86 +NV2080_CTRL_NVLINK_COUNTER_TP_RX_DATA = 87 +NV2080_CTRL_NVLINK_COUNTER_TP_TX_DATA = 88 +NV2080_CTRL_NVLINK_COUNTER_TP_RX_RAW = 89 +NV2080_CTRL_NVLINK_COUNTER_TP_TX_RAW = 90 +NV2080_CTRL_NVLINK_COUNTER_L1_ENTRY = 91 +NV2080_CTRL_NVLINK_COUNTER_L1_ENTRY_FORCE = 92 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT = 93 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT_RECAL = 94 +NV2080_CTRL_NVLINK_COUNTER_L1_EXIT_REMOTE = 95 +NV2080_CTRL_NVLINK_COUNTER_L1_LP_STEADY_STATE_TIME = 96 +NV2080_CTRL_NVLINK_COUNTER_L1_HIGH_SPEED_STEADY_STATE_TIME = 97 +NV2080_CTRL_NVLINK_COUNTER_L1_OTHER_STATE_TIME = 98 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_ENTRY_TIME = 99 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_EXIT_TIME = 100 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_FULL_BW_ENTRY_TIME = 101 +NV2080_CTRL_NVLINK_COUNTER_LP_LOCAL_FULL_BW_EXIT_TIME = 102 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_ENTRY_TIME = 103 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_EXIT_TIME = 104 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_FULL_BW_ENTRY_TIME = 105 +NV2080_CTRL_NVLINK_COUNTER_LP_REMOTE_FULL_BW_EXIT_TIME = 106 +NV2080_CTRL_NVLINK_COUNTER_PLR_LAST_RAW_BER = 107 +NV2080_CTRL_NVLINK_COUNTER_PLR_XMIT_RETRY_EVENTS_WITHIN_T_SEC_MAX_LOW = 108 +NV2080_CTRL_NVLINK_COUNTER_L0_TX_IDLE_ENTRY = 109 +NV2080_CTRL_NVLINK_COUNTER_L0_TX_IDLE_ENTRY_DUE_TO_L1 = 110 +NV2080_CTRL_NVLINK_COUNTER_L0_TX_IDLE_REQ_NOT_YET_ACTIVE = 111 +NV2080_CTRL_NVLINK_COUNTER_L0_TX_IDLE_ACTIVE_DUE_TO_L1_REQ = 112 +NV2080_CTRL_NVLINK_COUNTER_L0_TX_IDLE_ACTIVE = 113 +NV2080_CTRL_NVLINK_COUNTERS_MAX = 114 +NV2080_CTRL_NVLINK_COUNTER_MAX_GROUPS = 2 +NV2080_CTRL_NVLINK_COUNTER_MAX_COUNTERS_PER_LINK_IN_REQ = 28 +NV2080_CTRL_NVLINK_COUNTER_V2_GROUP = lambda i: ((i) / 64) # type: ignore +NV2080_CTRL_NVLINK_GET_COUNTERS_V2_PARAMS_MESSAGE_ID = (0x50) +NV2080_CTRL_CMD_NVLINK_GET_COUNTERS_V2 = (0x20803050) +NV2080_CTRL_NVLINK_CLEAR_COUNTERS_V2_PARAMS_MESSAGE_ID = (0x51) +NV2080_CTRL_CMD_NVLINK_CLEAR_COUNTERS_V2 = (0x20803051) +NV2080_CTRL_CMD_NVLINK_INJECT_ERROR = (0x20803006) +NV2080_CTRL_NVLINK_INJECT_ERROR_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_NVLINK_UNIT_DL = 0x01 +NV2080_CTRL_NVLINK_UNIT_TL = 0x02 +NV2080_CTRL_NVLINK_UNIT_TLC_RX_0 = 0x03 +NV2080_CTRL_NVLINK_UNIT_TLC_RX_1 = 0x04 +NV2080_CTRL_NVLINK_UNIT_TLC_TX_0 = 0x05 +NV2080_CTRL_NVLINK_UNIT_MIF_RX_0 = 0x06 +NV2080_CTRL_NVLINK_UNIT_MIF_TX_0 = 0x07 +NV2080_CTRL_NVLINK_UNIT_MINION = 0x08 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE = (31, 28) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_NO_ERROR = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_RAW_BER = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_TYPE_EFFECTIVE_BER = 0x00000002 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_ERR_INJECT_DURATION = (27, 12) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_BER_MANTISSA = (11, 8) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_TX_ERR_BER_EXPONENT = (7, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_INJECT_COUNT = (15, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP = (16, 16) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_STOMP_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON = (17, 17) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_POISON_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_PKT_ERR_CLEAR_COUNTERS = (18, 18) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_PIPE_INDEX = (3, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR = (4, 4) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_AUTH_TAG_ERR_AUTH_ERR_EN = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN = (0, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN_DIS = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_LINK_ERR_FORCE_LINK_DOWN_EN = 0x00000001 +NV2080_CTRL_NVLINK_SET_HW_ERROR_INJECT_PARAMS_MESSAGE_ID = (0x81) +NV2080_CTRL_CMD_NVLINK_SET_HW_ERROR_INJECT = (0x20803081) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE = (1, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_UP = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_DOWN_BY_REQUEST = 0x00000001 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_LINK_STATE_DOWN_BY_HW_ERR = 0x00000002 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS = (0, 0) +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS_NO_ERR_INJECT = 0x00000000 +NV2080_CTRL_NVLINK_HW_ERROR_INJECT_STS_OPER_STS_PERFORMING_ERR_INJECT = 0x00000001 +NV2080_CTRL_NVLINK_GET_HW_ERROR_INJECT_PARAMS_MESSAGE_ID = (0x82) +NV2080_CTRL_CMD_NVLINK_GET_HW_ERROR_INJECT = (0x20803082) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES = (0x20803007) +NV2080_CTRL_CMD_NVLINK_GET_ERROR_RECOVERIES_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE = (0x20803008) +NV2080_CTRL_NVLINK_GET_LINK_LAST_ERROR_REMOTE_TYPE_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FATAL_ERROR_COUNTS = (0x20803009) +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_DL_DATA_PARITY = 0 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_DL_CTRL_PARITY = 1 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_PROTOCOL = 2 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_OVERFLOW = 3 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RAM_DATA_PARITY = 4 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RAM_HDR_PARITY = 5 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_RESP = 6 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_RX_POISON = 7 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_RAM_DATA_PARITY = 8 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_RAM_HDR_PARITY = 9 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_TX_CREDIT = 10 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_DL_FLOW_CTRL_PARITY = 11 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TL_DL_HDR_PARITY = 12 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_RECOVERY_LONG = 13 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_RAM = 14 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_INTERFACE = 15 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_TX_FAULT_SUBLINK_CHANGE = 16 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_RX_FAULT_SUBLINK_CHANGE = 17 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_RX_FAULT_DL_PROTOCOL = 18 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT = 19 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_DATA_PARITY = 0 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_CTRL_PARITY = 1 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RAM_DATA_PARITY = 4 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RAM_HDR_PARITY = 5 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DATA_POISONED_PKT_RCVD = 7 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RAM_DATA_PARITY = 8 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RAM_HDR_PARITY = 9 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DL_FLOW_CONTROL_PARITY = 11 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DL_HDR_PARITY = 20 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_AE_FLIT_RCVD = 21 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_BE_FLIT_RCVD = 22 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_ADDR_ALIGN = 23 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_PKT_LEN = 24 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CMD_ENC = 25 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_DAT_LEN_ENC = 26 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_ADDR_TYPE = 27 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_RSP_STATUS = 28 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_PKT_STATUS = 29 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CACHE_ATTR_ENC_IN_PROBE_REQ = 30 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RSVD_CACHE_ATTR_ENC_IN_PROBE_RESP = 31 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_GT_ATOMIC_REQ_MAX_SIZE = 32 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_GT_RMW_REQ_MAX_SIZE = 33 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DAT_LEN_LT_ATR_RESP_MIN_SIZE = 34 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_PO_FOR_CACHE_ATTR = 35 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_COMPRESSED_RESP = 36 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RESP_STATUS_TARGET = 37 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_RESP_STATUS_UNSUPPORTED_REQUEST = 38 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_HDR_OVERFLOW = 39 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_DATA_OVERFLOW = 40 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_STOMPED_PKT_RCVD = 41 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_CORRECTABLE_INTERNAL = 42 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_VC_OVERFLOW = 43 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_NVLINK_CREDIT_RELEASE = 44 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_UNSUPPORTED_NCISOC_CREDIT_RELEASE = 45 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_HDR_CREDIT_OVERFLOW = 46 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DATA_CREDIT_OVERFLOW = 47 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DL_REPLAY_CREDIT_OVERFLOW = 48 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_UNSUPPORTED_VC_OVERFLOW = 49 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_STOMPED_PKT_SENT = 50 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_DATA_POISONED_PKT_SENT = 51 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RESP_STATUS_TARGET = 52 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_RESP_STATUS_UNSUPPORTED_REQUEST = 53 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_RX_RAM_DATA_PARITY = 54 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_RX_RAM_HDR_PARITY = 55 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_TX_RAM_DATA_PARITY = 56 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_MIF_TX_RAM_HDR_PARITY = 57 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_RX_INVALID_COLLAPSED_RESPONSE = 58 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_NCISOC_HDR_ECC_DBE = 59 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_TLC_TX_NCISOC_PARITY = 60 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT_UP = 61 +NV2080_CTRL_NVLINK_FATAL_ERROR_TYPE_DL_LTSSM_FAULT_DOWN = 62 +NV2080_CTRL_NVLINK_NUM_FATAL_ERROR_TYPES = 63 +NV2080_CTRL_NVLINK_IS_FATAL_ERROR_COUNT_VALID = lambda count,supportedCounts: ( not not ((supportedCounts) & NVBIT64(count))) # type: ignore +NV2080_CTRL_NVLINK_GET_LINK_FATAL_ERROR_COUNTS_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_NVLINK_GET_LINK_NONFATAL_ERROR_RATES = (0x2080300a) +NV2080_CTRL_NVLINK_NONFATAL_ERROR_RATE_ENTRIES = 5 +NV2080_CTRL_NVLINK_GET_LINK_NONFATAL_ERROR_RATES_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_NVLINK_SET_ERROR_INJECTION_MODE = (0x2080300b) +NV2080_CTRL_NVLINK_SET_ERROR_INJECTION_MODE_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM = (0x2080300c) +NV2080_CTRL_CMD_NVLINK_SETUP_EOM_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_NVLINK_SET_POWER_STATE = (0x2080300d) +NV2080_CTRL_NVLINK_SET_POWER_STATE_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_NVLINK_POWER_STATE_L0 = (0x00) +NV2080_CTRL_NVLINK_POWER_STATE_L1 = (0x01) +NV2080_CTRL_NVLINK_POWER_STATE_L2 = (0x02) +NV2080_CTRL_NVLINK_POWER_STATE_L3 = (0x03) +NV2080_CTRL_CMD_NVLINK_GET_POWER_STATE = (0x2080300e) +NV2080_CTRL_NVLINK_GET_POWER_STATE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_NVLINK_INJECT_TLC_ERROR = (0x2080300f) +NV2080_CTRL_NVLINK_INJECT_TLC_ERROR_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES = (0x20803011) +NV2080_CTRL_NVLINK_MAX_LANES = 4 +NV2080_CTRL_CMD_NVLINK_GET_LINK_FOM_VALUES_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_NVLINK_SET_NVLINK_PEER = (0x20803012) +NV2080_CTRL_NVLINK_SET_NVLINK_PEER_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_NVLINK_READ_UPHY_PAD_LANE_REG = (0x20803013) +NV2080_CTRL_NVLINK_READ_UPHY_PAD_LANE_REG_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_NVLINK_GET_NVLINK_ECC_ERRORS_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_NVLINK_GET_NVLINK_ECC_ERRORS = (0x20803014) +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_DATA_TX = 0 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_DATA_RX = 1 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_RAW_TX = 2 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_RAW_RX = 3 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_TYPE_MAX = 4 +NV2080_CTRL_NVLINK_READ_TP_COUNTERS_PARAMS_MESSAGE_ID = (0x15) +NV2080_CTRL_CMD_NVLINK_READ_TP_COUNTERS = (0x20803015) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE = (0x20803016) +NV2080_CTRL_CMD_NVLINK_LOCK_LINK_POWER_STATE_PARAMS_MESSAGE_ID = (0x16) +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_NVHS = 0 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_EIGHTH = 1 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_OTHER = 2 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_NUM_TX_LP_ENTER = 3 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_NUM_TX_LP_EXIT = 4 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_COUNT_TX_SLEEP = 5 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_HS_TIME = 6 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_FULL_BW_EXIT_TIME = 7 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_LP_ENTRY_TIME = 8 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_LP_EXIT_TIME = 9 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_LOCAL_FULL_BW_ENTRY_TIME = 10 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_FULL_BW_EXIT_TIME = 11 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_LP_ENTRY_TIME = 12 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_LP_EXIT_TIME = 13 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_REMOTE_FULL_BW_ENTRY_TIME = 14 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_OTHER_STATE_TIME = 15 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_MAX_COUNTERS = 16 +NV2080_CTRL_NVLINK_GET_LP_COUNTERS_PARAMS_MESSAGE_ID = (0x18) +NV2080_CTRL_CMD_NVLINK_GET_LP_COUNTERS = (0x20803018) +NV2080_CTRL_CMD_NVLINK_CLEAR_LP_COUNTERS = (0x20803052) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_DEFAULT = (0x00000000) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEA = (0x00000001) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEDR = (0x00000002) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_NEDW = (0x00000003) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PHY_REMOTE = (0x00000004) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PHY_LOCAL = (0x00000005) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_EXT_LOCAL = (0x00000006) +NV2080_CTRL_NVLINK_SET_LOOPBACK_MODE_PARAMS_MESSAGE_ID = (0x23) +NV2080_CTRL_CMD_NVLINK_SET_LOOPBACK_MODE = (0x20803023) +NV2080_CTRL_NVLINK_MAX_LINK_COUNT = 32 +NV2080_CTRL_NVLINK_GET_REFRESH_COUNTERS_PARAMS_MESSAGE_ID = (0x28) +NV2080_CTRL_CMD_NVLINK_GET_REFRESH_COUNTERS = (0x20803028) +NV2080_CTRL_NVLINK_CLEAR_REFRESH_COUNTERS_PARAMS_MESSAGE_ID = (0x29) +NV2080_CTRL_CMD_NVLINK_CLEAR_REFRESH_COUNTERS = (0x20803029) +NV2080_CTRL_NVLINK_GET_SET_NVSWITCH_FLA_ADDR_PARAMS_MESSAGE_ID = (0x38) +NV2080_CTRL_CMD_NVLINK_GET_SET_NVSWITCH_FLA_ADDR = (0x20803038) +NV2080_CTRL_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO_PARAMS_MESSAGE_ID = (0x39) +NV2080_CTRL_CMD_NVLINK_SYNC_LINK_MASKS_AND_VBIOS_INFO = (0x20803039) +NV2080_CTRL_CMD_NVLINK_ENABLE_LINKS = (0x2080303a) +NV2080_CTRL_NVLINK_PROCESS_INIT_DISABLED_LINKS_PARAMS_MESSAGE_ID = (0x3b) +NV2080_CTRL_CMD_NVLINK_PROCESS_INIT_DISABLED_LINKS = (0x2080303b) +NV2080_CTRL_NVLINK_EOM_CONTROL_PARAMS_MESSAGE_ID = (0x3c) +NV2080_CTRL_CMD_NVLINK_EOM_CONTROL = (0x2080303c) +NV2080_CTRL_NVLINK_INBAND_MAX_DATA_SIZE = 5120 +NV2080_CTRL_NVLINK_INBAND_RECEIVED_DATA_PARAMS_MESSAGE_ID = (0x3d) +NV2080_CTRL_CMD_READ_NVLINK_INBAND_RESPONSE = (0x2080303d) +NV2080_CTRL_NVLINK_L1_THRESHOLD_VALUE_DEFAULT = (0xFFFFFFFF) +NV2080_CTRL_NVLINK_SET_L1_THRESHOLD_PARAMS_MESSAGE_ID = (0x3e) +NV2080_CTRL_CMD_NVLINK_SET_L1_THRESHOLD = (0x2080303e) +NV2080_CTRL_NVLINK_GET_L1_THRESHOLD_PARAMS_MESSAGE_ID = (0x3f) +NV2080_CTRL_CMD_NVLINK_GET_L1_THRESHOLD = (0x2080303f) +NV2080_CTRL_NVLINK_INBAND_SEND_DATA_PARAMS_MESSAGE_ID = (0x40) +NV2080_CTRL_CMD_NVLINK_INBAND_SEND_DATA = (0x20803040) +NV2080_CTRL_NVLINK_IS_GPU_DEGRADED_PARAMS_MESSAGE_ID = (0x41) +NV2080_CTRL_CMD_NVLINK_IS_GPU_DEGRADED = (0x20803041) +NV2080_CTRL_NVLINK_DIRECT_CONNECT_CHECK_PARAMS_MESSAGE_ID = (0x42) +NV2080_CTRL_CMD_NVLINK_DIRECT_CONNECT_CHECK = (0x20803042) +NV2080_CTRL_NVLINK_POST_FAULT_UP_PARAMS_MESSAGE_ID = (0x43) +NV2080_CTRL_CMD_NVLINK_POST_FAULT_UP = (0x20803043) +NV2080_CTRL_NVLINK_PORT_EVENT_COUNT_SIZE = 64 +NV2080_CTRL_NVLINK_GET_PORT_EVENTS_PARAMS_MESSAGE_ID = (0x44) +NV2080_CTRL_CMD_NVLINK_GET_PORT_EVENTS = (0x20803044) +NV2080_CTRL_NVLINK_CYCLE_LINK_PARAMS_MESSAGE_ID = (0x45) +NV2080_CTRL_CMD_NVLINK_CYCLE_LINK = (0x20803045) +NV2080_CTRL_NVLINK_IS_REDUCED_CONFIG_PARAMS_MESSAGE_ID = (0x46) +NV2080_CTRL_CMD_NVLINK_IS_REDUCED_CONFIG = (0x20803046) +NV2080_CTRL_NVLINK_PRM_ACCESS_MAX_LENGTH = 496 +NV2080_CTRL_CMD_NVLINK_GET_SUPPORTED_COUNTERS = (0x20803074) +NV2080_CTRL_NVLINK_GET_SUPPORTED_COUNTERS_PARAMS_MESSAGE_ID = (0x74) +NV2080_CTRL_CMD_NVLINK_GET_PLATFORM_INFO = (0x20803083) +NV2080_CTRL_NVLINK_GET_PLATFORM_INFO_PARAMS_MESSAGE_ID = (0x83) +NV2080_CTRL_CMD_NVLINK_READ_UPHY_CLN = (0x20803084) +NV2080_CTRL_NVLINK_READ_UPHY_CLN_REG_PARAMS_MESSAGE_ID = (0x84) +NV2080_CTRL_NVLINK_SUPPORTED_MAX_BW_MODE_COUNT = 23 +NV2080_CTRL_CMD_NVLINK_GET_SUPPORTED_BW_MODE = (0x20803085) +NV2080_CTRL_NVLINK_GET_SUPPORTED_BW_MODE_PARAMS_MESSAGE_ID = (0x85) +NV2080_CTRL_CMD_NVLINK_SET_BW_MODE_POLL_TIMEOUT_MS_INVALID = 0 +NV2080_CTRL_CMD_NVLINK_SET_BW_MODE = (0x20803086) +NV2080_CTRL_NVLINK_SET_BW_MODE_PARAMS_MESSAGE_ID = (0x86) +NV2080_CTRL_CMD_NVLINK_GET_BW_MODE = (0x20803087) +NV2080_CTRL_NVLINK_GET_BW_MODE_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_NVLINK_GET_LOCAL_DEVICE_INFO = (0x20803088) +NV2080_CTRL_NVLINK_GET_LOCAL_DEVICE_INFO_PARAMS_MESSAGE_ID = (0x88) +NV2080_CTRL_CMD_NVLINK_INJECT_SW_ERROR = (0x20803089) +NV2080_CTRL_NVLINK_INJECT_SW_ERROR_PARAMS_MESSAGE_ID = (0x89) +NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY = (0x2080308c) +NV2080_CTRL_NVLINK_UPDATE_NVLE_TOPOLOGY_PARAMS_MESSAGE_ID = (0x8c) +NV2080_CTRL_NVLINK_MAX_REMAP_TABLE_ENTRIES = 32 +NV2080_CTRL_NVLINK_MAX_REMAP_TABLE_ENTRIES_V2 = 4096 +NV2080_CTRL_NVLINK_REMAP_TABLE_ENTRIES_CHUNK = 128 +NV2080_CTRL_NVLINK_MAX_ALID_CLID_TABLE_ENTRIES = 128 +NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS = (0x2080308d) +NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_PARAMS_MESSAGE_ID = (0x8d) +NV2080_CTRL_CMD_NVLINK_POST_LAZY_ERROR_RECOVERY = (0x2080308a) +NV2080_CTRL_CMD_NVLINK_CONFIGURE_L1_TOGGLE = (0x2080308e) +NV2080_CTRL_NVLINK_CONFIGURE_L1_TOGGLE_PARAMS_MESSAGE_ID = (0x8E) +NV2080_CTRL_CMD_NVLINK_GET_L1_TOGGLE = (0x2080308f) +NV2080_CTRL_NVLINK_GET_L1_TOGGLE_PARAMS_MESSAGE_ID = (0x8F) +NV2080_CTRL_CMD_NVLINK_GET_NVLE_ENCRYPT_EN_INFO = (0x2080308b) +NV2080_CTRL_NVLINK_GET_NVLE_ENCRYPT_EN_INFO_PARAMS_MESSAGE_ID = (0x8b) +NV2080_CTRL_NVLINK_FIRMWARE_VERSION_LENGTH = (0x10) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_MSE = (0x01) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_NETIR = (0x02) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_NETIR_UPHY = (0x03) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_NETIR_CLN = (0x04) +NV2080_CTRL_NVLINK_SEMANTIC_VERSION_UCODE_TYPE_NETIR_DLN = (0x05) +NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO = (0x20803091) +NV2080_CTRL_NVLINK_GET_FIRMWARE_VERSION_INFO_PARAMS_MESSAGE_ID = (0x91) +NV2080_CTRL_CMD_NVLINK_SET_NVLE_ENABLED_STATE = (0x20803092) +NV2080_CTRL_NVLINK_SET_NVLE_ENABLED_STATE_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_CMD_NVLINK_PRM_ACCESS = (0x20803095) +NV2080_CTRL_NVLINK_PRM_ACCESS_PARAMS_MESSAGE_ID = (0x95) +NV2080_CTRL_NVLINK_FIXED_POINT_HISTOGRAM_MAX_SIZE = 32 +NV2080_CTRL_CMD_NVLINK_GET_LINK_ACCUMULATIVE_METRIC_DATA = (0x20803097) +NV2080_CTRL_NVLINK_GET_LINK_ACCUMULATIVE_METRIC_DATA_PARAMS_MESSAGE_ID = (0x97) +NV2080_CTRL_CMD_NVLINK_GET_LINK_RECORD_METRIC_DATA = (0x20803098) +NV2080_CTRL_NVLINK_GET_LINK_RECORD_METRIC_DATA_PARAMS_MESSAGE_ID = (0x98) +NV2080_CTRL_CMD_NVLINK_GET_DEVICE_RECORD_METRIC_DATA = (0x20803099) +NV2080_CTRL_NVLINK_GET_DEVICE_RECORD_METRIC_DATA_PARAMS_MESSAGE_ID = (0x99) +NV2080_CTRL_NVLINK_SAVE_NODE_HOSTNAME_PARAMS_MESSAGE_ID = (0x9A) +NV2080_CTRL_CMD_NVLINK_SAVE_NODE_HOSTNAME = (0x2080309a) +NV2080_CTRL_NVLINK_GET_SAVED_NODE_HOSTNAME_PARAMS_MESSAGE_ID = (0x9B) +NV2080_CTRL_CMD_NVLINK_GET_SAVED_NODE_HOSTNAME = (0x2080309b) +NV2080_CTRL_NVLINK_UPDATE_CLID_PARAMS_MESSAGE_ID = (0x9C) +NV2080_CTRL_CMD_NVLINK_UPDATE_CLID = (0x2080309c) +NV2080_CTRL_NVLINK_LOCK_REMAP_TABLE_AND_MSE_PARAMS_MESSAGE_ID = (0x9D) +NV2080_CTRL_CMD_NVLINK_LOCK_REMAP_TABLE_AND_MSE = (0x2080309d) +NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_PARAMS_MESSAGE_ID = (0x9E) +NV2080_CTRL_CMD_NVLINK_GET_REMAP_TABLE_INFO = (0x2080309e) +NV2080_CTRL_NVLINK_GET_NVLE_PKT_COUNTERS_PARAMS_MESSAGE_ID = (0x9F) +NV2080_CTRL_CMD_NVLINK_GET_NVLE_PKT_COUNTERS = (0x2080309f) +NV2080_CTRL_NVLINK_NVLE_AES_256_GCM_KEY_SIZE_BYTES = 32 +NV2080_CTRL_NVLINK_SETUP_NVLE_ENCRYPTION_KEY_PARAMS_MESSAGE_ID = (0xA0) +NV2080_CTRL_CMD_NVLINK_SETUP_NVLE_ENCRYPTION_KEY = (0x208030a0) +NV2080_CTRL_NVLINK_GET_REMAP_TABLE_INFO_V2_PARAMS_MESSAGE_ID = (0xA1) +NV2080_CTRL_CMD_NVLINK_GET_REMAP_TABLE_INFO_V2 = (0x208030a1) +NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_V2_PARAMS_MESSAGE_ID = (0xA2) +NV2080_CTRL_NVLINK_GET_UPDATE_NVLE_LIDS_V2 = (0x208030a2) +NV2080_CTRL_NVLINK_MAX_LINKS = 64 +NV2080_CTRL_NVLINK_MAX_ARR_SIZE = 64 +NV2080_CTRL_LINKS_PER_MASK_INDEX = 64 +NV2080_CTRL_NVLINK_MAX_MASK_SIZE = (0x1) +NV_SUBPROC_NAME_MAX_LENGTH = 100 +NV2080_CTRL_PERF_BOOST_FLAGS_CMD = (1, 0) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_CLEAR = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_BOOST_1LEVEL = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_CMD_BOOST_TO_MAX = (0x00000002) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA = (4, 4) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_NO = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_YES = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC = (5, 5) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC_NO = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_ASYNC_YES = (0x00000001) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY = (6, 6) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY_DEFAULT = (0x00000000) +NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY_HIGH = (0x00000001) +NV2080_CTRL_PERF_BOOST_DURATION_MAX = 3600 +NV2080_CTRL_PERF_BOOST_DURATION_INFINITE = 0xffffffff +NV2080_CTRL_CMD_PERF_BOOST = (0x2080200a) +NV2080_CTRL_PERF_BOOST_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_PERF_RESERVE_PERFMON_HW = (0x20802093) +NV2080_CTRL_PERF_RESERVE_PERFMON_HW_PARAMS_MESSAGE_ID = (0x93) +NV2080_CTRL_PERF_POWER_SOURCE_AC = (0x00000000) +NV2080_CTRL_PERF_POWER_SOURCE_BATTERY = (0x00000001) +NV2080_CTRL_CMD_PERF_SET_POWERSTATE = (0x2080205b) +NV2080_CTRL_PERF_SET_POWERSTATE_PARAMS_MESSAGE_ID = (0x5B) +NV2080_CTRL_CMD_PERF_SET_AUX_POWER_STATE = (0x20802092) +NV2080_CTRL_PERF_SET_AUX_POWER_STATE_PARAMS_MESSAGE_ID = (0x92) +NV2080_CTRL_PERF_AUX_POWER_STATE_P0 = (0x00000000) +NV2080_CTRL_PERF_AUX_POWER_STATE_P1 = (0x00000001) +NV2080_CTRL_PERF_AUX_POWER_STATE_P2 = (0x00000002) +NV2080_CTRL_PERF_AUX_POWER_STATE_P3 = (0x00000003) +NV2080_CTRL_PERF_AUX_POWER_STATE_P4 = (0x00000004) +NV2080_CTRL_PERF_AUX_POWER_STATE_COUNT = (0x00000005) +NV2080_CTRL_PERF_RATED_TDP_STATUS_PARAMS_MESSAGE_ID = (0x6D) +NV2080_CTRL_CMD_PERF_RATED_TDP_GET_CONTROL = (0x2080206e) +NV2080_CTRL_PERF_RATED_TDP_GET_CONTROL_PARAMS_MESSAGE_ID = (0x6E) +NV2080_CTRL_CMD_PERF_RATED_TDP_SET_CONTROL = (0x2080206f) +NV2080_CTRL_PERF_RATED_TDP_SET_CONTROL_PARAMS_MESSAGE_ID = (0x6F) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_PARAM_MESSAGE_ID = (0x83) +NV2080_CTRL_PERF_GPUMON_SAMPLE_COUNT_PERFMON_UTIL = 72 +NV2080_CTRL_CMD_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2 = (0x20802096) +NV2080_CTRL_PERF_GET_GPUMON_PERFMON_UTIL_SAMPLES_V2_PARAMS_MESSAGE_ID = (0x96) +NV2080_CTRL_CMD_PERF_GPU_IS_IDLE = (0x20802089) +NV2080_CTRL_PERF_GPU_IS_IDLE_PARAMS_MESSAGE_ID = (0x89) +NV2080_CTRL_PERF_GPU_IS_IDLE_TRUE = (0x00000001) +NV2080_CTRL_PERF_GPU_IS_IDLE_FALSE = (0x00000002) +NV2080_CTRL_CMD_PERF_AGGRESSIVE_PSTATE_NOTIFY = (0x2080208f) +NV2080_CTRL_PERF_AGGRESSIVE_PSTATE_NOTIFY_PARAMS_MESSAGE_ID = (0x8F) +NV2080_CTRL_PERF_CLK_MAX_DOMAINS = 32 +NV2080_CTRL_CMD_PERF_GET_LEVEL_INFO = (0x20802002) +NV2080_CTRL_PERF_GET_LEVEL_INFO_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_PERF_GET_LEVEL_INFO_V2 = (0x2080200b) +NV2080_CTRL_PERF_GET_LEVEL_INFO_V2_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_PERF_GET_LEVEL_INFO_LEVEL_STANDARD = 0 +NV2080_CTRL_PERF_GET_LEVEL_INFO_LEVEL_CONSERVATIVE = 1 +NV2080_CTRL_PERF_GET_LEVEL_INFO_LEVEL_AGGRESSIVE = 2 +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE = (0, 0) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE_DEFAULT = (0x00000000) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_TYPE_OVERCLOCK = (0x00000001) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE = (2, 1) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_NONE = (0x00000000) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_DESKTOP = (0x00000001) +NV2080_CTRL_PERF_GET_LEVEL_INFO_FLAGS_MODE_MAXPERF = (0x00000002) +NV2080_CTRL_CMD_PERF_GET_VID_ENG_PERFMON_SAMPLE = (0x20802087) +NV2080_CTRL_PERF_GET_VID_ENG_PERFMON_SAMPLE_PARAMS_MESSAGE_ID = (0x87) +NV2080_CTRL_CMD_PERF_GET_POWERSTATE = (0x2080205a) +NV2080_CTRL_PERF_GET_POWERSTATE_PARAMS_MESSAGE_ID = (0x5A) +NV2080_CTRL_CMD_PERF_NOTIFY_VIDEOEVENT = (0x2080205d) +NV2080_CTRL_PERF_NOTIFY_VIDEOEVENT_PARAMS_MESSAGE_ID = (0x5D) +NV2080_CTRL_PERF_VIDEOEVENT_EVENT_MASK = (0x0000ffff) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_START = (0x00000001) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_STOP = (0x00000002) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_START = NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_START +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_STOP = NV2080_CTRL_PERF_VIDEOEVENT_STREAM_HD_STOP +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_SD_START = (0x00000003) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_SD_STOP = (0x00000004) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_4K_START = (0x00000005) +NV2080_CTRL_PERF_VIDEOEVENT_STREAM_4K_STOP = (0x00000006) +NV2080_CTRL_PERF_VIDEOEVENT_OFA_START = (0x00000007) +NV2080_CTRL_PERF_VIDEOEVENT_OFA_STOP = (0x00000008) +NV2080_CTRL_PERF_VIDEOEVENT_FLAG_LINEAR_MODE = (0x00010000) +NV2080_CTRL_PERF_PSTATES_UNDEFINED = (0x00000000) +NV2080_CTRL_PERF_PSTATES_CLEAR_FORCED = (0x00000000) +NV2080_CTRL_PERF_PSTATES_MIN = (0x00000001) +NV2080_CTRL_PERF_PSTATES_P0 = (0x00000001) +NV2080_CTRL_PERF_PSTATES_P1 = (0x00000002) +NV2080_CTRL_PERF_PSTATES_P2 = (0x00000004) +NV2080_CTRL_PERF_PSTATES_P3 = (0x00000008) +NV2080_CTRL_PERF_PSTATES_P4 = (0x00000010) +NV2080_CTRL_PERF_PSTATES_P5 = (0x00000020) +NV2080_CTRL_PERF_PSTATES_P6 = (0x00000040) +NV2080_CTRL_PERF_PSTATES_P7 = (0x00000080) +NV2080_CTRL_PERF_PSTATES_P8 = (0x00000100) +NV2080_CTRL_PERF_PSTATES_P9 = (0x00000200) +NV2080_CTRL_PERF_PSTATES_P10 = (0x00000400) +NV2080_CTRL_PERF_PSTATES_P11 = (0x00000800) +NV2080_CTRL_PERF_PSTATES_P12 = (0x00001000) +NV2080_CTRL_PERF_PSTATES_P13 = (0x00002000) +NV2080_CTRL_PERF_PSTATES_P14 = (0x00004000) +NV2080_CTRL_PERF_PSTATES_P15 = (0x00008000) +NV2080_CTRL_PERF_PSTATES_MAX = NV2080_CTRL_PERF_PSTATES_P15 +NV2080_CTRL_PERF_PSTATES_SKIP_ENTRY = (0x10000) +NV2080_CTRL_PERF_PSTATES_ALL = (0xffff) +NV2080_CTRL_CMD_PERF_GET_CURRENT_PSTATE = (0x20802068) +NV2080_CTRL_PERF_GET_CURRENT_PSTATE_PARAMS_MESSAGE_ID = (0x68) +NV2080_CTRL_CMD_PERF_GET_TEGRA_PERFMON_SAMPLE = (0x20802069) +NV2080_CTRL_PERF_GET_TEGRA_PERFMON_SAMPLE_PARAMS_MESSAGE_ID = (0x69) +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_NOT_SUPPORTED = 0 +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_SUPPORTED = 1 +NV2080_CTRL_PMGR_MODULE_INFO_NVSWITCH_NOT_APPLICABLE = 2 +NV2080_CTRL_PMGR_MODULE_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_PMGR_GET_MODULE_INFO = (0x20802609) +NV2080_CTRL_CMD_GC6_ENTRY = (0x2080270d) +NV2080_CTRL_GC6_ENTRY_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_GC6_EXIT = (0x2080270e) +NV2080_CTRL_GC6_EXIT_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_RC_READ_VIRTUAL_MEM_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_RC_READ_VIRTUAL_MEM = (0x20802204) +NV2080_CTRL_RC_GET_ERROR_COUNT_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_RC_GET_ERROR_COUNT = (0x20802205) +NV2080_CTRL_RC_ERROR_PARAMS_BUFFER_SIZE = (0x2000) +NV2080_CTRL_CMD_RC_GET_ERROR = (0x20802206) +NV2080_CTRL_RC_GET_ERROR_V2_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_RC_GET_ERROR_V2 = (0x20802213) +NV2080_CTRL_CMD_RC_SET_CLEAN_ERROR_HISTORY = (0x20802207) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_RC_GET_WATCHDOG_INFO = (0x20802209) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_NONE = (0x00000000) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_DISABLED = (0x00000001) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_RUNNING = (0x00000002) +NV2080_CTRL_RC_GET_WATCHDOG_INFO_FLAGS_INITIALIZED = (0x00000004) +NV2080_CTRL_CMD_RC_DISABLE_WATCHDOG = (0x2080220a) +NV2080_CTRL_CMD_RC_ENABLE_WATCHDOG = (0x2080220b) +NV2080_CTRL_CMD_RC_RELEASE_WATCHDOG_REQUESTS = (0x2080220c) +NV2080_CTRL_CMD_SET_RC_RECOVERY = (0x2080220d) +NV2080_CTRL_SET_RC_RECOVERY_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_GET_RC_RECOVERY = (0x2080220e) +NV2080_CTRL_GET_RC_RECOVERY_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_RC_RECOVERY_DISABLED = (0x00000000) +NV2080_CTRL_CMD_RC_RECOVERY_ENABLED = (0x00000001) +NV2080_CTRL_CMD_TDR_SET_TIMEOUT_STATE = (0x2080220f) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_CMD_GPU_RESET_BEGIN = (0x00000000) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_CMD_GPU_RESET_END = (0x00000001) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_STATUS_SUCCESS = (0x00000000) +NV2080_CTRL_TDR_SET_TIMEOUT_STATE_STATUS_FAIL = (0x00000001) +NV2080_CTRL_CMD_RC_SOFT_DISABLE_WATCHDOG = (0x20802210) +NV2080_CTRL_CMD_SET_RC_INFO = (0x20802211) +NV2080_CTRL_SET_RC_INFO_PARAMS_MESSAGE_ID = (0x11) +NV2080_CTRL_CMD_GET_RC_INFO = (0x20802212) +NV2080_CTRL_GET_RC_INFO_PARAMS_MESSAGE_ID = (0x12) +NV2080_CTRL_CMD_RC_INFO_MODE_DISABLE = (0x00000000) +NV2080_CTRL_CMD_RC_INFO_MODE_ENABLE = (0x00000001) +NV2080_CTRL_CMD_RC_INFO_BREAK_DISABLE = (0x00000000) +NV2080_CTRL_CMD_RC_INFO_BREAK_ENABLE = (0x00000001) +NV2080_CTRL_CMD_SET_RC_WATCHDOG_INFO = (0x20802214) +NV2080_CTRL_SET_RC_WATCHDOG_INFO_PARAMS_MESSAGE_ID = (0x14) +NV2080_CTRL_CMD_GET_RC_WATCHDOG_INFO = (0x20802215) +NV2080_CTRL_GET_RC_WATCHDOG_INFO_PARAMS_MESSAGE_ID = (0x15) +RM_GSP_SPDM_CMD_ID_CC_INIT = (0x1) +RM_GSP_SPDM_CMD_ID_CC_DEINIT = (0x2) +RM_GSP_SPDM_CMD_ID_CC_CTRL = (0x3) +RM_GSP_SPDM_CMD_ID_CC_INIT_RM_DATA = (0x4) +RM_GSP_SPDM_CMD_ID_CC_HEARTBEAT_CTRL = (0x5) +RM_GSP_SPDM_CMD_ID_FIPS_SELFTEST = (0x6) +RM_GSP_SPDM_CMD_ID_INVALID_COMMAND = (0xFF) +SPDM_SESSION_ESTABLISHMENT_TRANSCRIPT_BUFFER_SIZE = 0x2400 +RSVD7_SIZE = 16 +RSVD8_SIZE = 2 +CE_FIPS_SELF_TEST_DATA_SIZE = 16 +CE_FIPS_SELF_TEST_AUTH_TAG_SIZE = 16 +CE_FIPS_SELF_TEST_IV_SIZE = 12 +RM_GSP_SPDM_MSG_ID_CC_INIT = (0x1) +RM_GSP_SPDM_MSG_ID_CC_DEINIT = (0x2) +RM_GSP_SPDM_MSG_ID_CC_CTRL = (0x3) +RM_GSP_SPDM_MSG_ID_CC_INIT_RM_DATA = (0x4) +RM_GSP_SPDM_MSG_ID_CC_HEARTBEAT_CTRL = (0x5) +RM_GSP_SPDM_MSG_ID_FIPS_SELFTEST = (0x6) +RM_GSP_SPDM_MSG_ID_INVALID_COMMAND = (0xFF) +NV2080_CTRL_INTERNAL_SPDM_PARTITION = (0x20800ad9) +NV2080_CTRL_INTERNAL_SPDM_PARTITION_PARAMS_MESSAGE_ID = (0xD9) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT = (0x20800ada) +NV2080_CTRL_INTERNAL_SPDM_RETRIEVE_TRANSCRIPT_PARAMS_MESSAGE_ID = (0xDA) +THERMAL_SYSTEM_API_VER = 1 +THERMAL_SYSTEM_API_REV = 0 +NV2080_CTRL_THERMAL_SYSTEM_TARGET_NONE = (0x00000000) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_GPU = (0x00000001) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_MEMORY = (0x00000002) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_POWER_SUPPLY = (0x00000004) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_BOARD = (0x00000008) +NV2080_CTRL_THERMAL_SYSTEM_TARGET_UNKNOWN = (0xFFFFFFFF) +NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_FLAGS_DEFAULT = (0x00000000) +NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_FLAGS_IGNORE_FAIL = (0x00000001) +NV2080_CTRL_CMD_THERMAL_SYSTEM_EXECUTE_V2 = (0x20800513) +NV2080_CTRL_CMD_THERMAL_SYSTEM_EXECUTE_V2_PHYSICAL = (0x20808513) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGETS_AVAILABLE_OPCODE = (0x00000100) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_TARGET_TYPE_OPCODE = (0x00000101) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_PROVIDER_TYPE_OPCODE = (0x00000301) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSORS_AVAILABLE_OPCODE = (0x00000500) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_PROVIDER_OPCODE = (0x00000510) +NV2080_CTRL_THERMAL_SYSTEM_GET_STATUS_SENSOR_READING_OPCODE = (0x00001500) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_TARGET_OPCODE = (0x00000520) +NV2080_CTRL_THERMAL_SYSTEM_GET_INFO_SENSOR_READING_RANGE_OPCODE = (0x00000540) +NV2080_CTRL_THERMAL_SYSTEM_INSTRUCTION_MAX_COUNT = 0x20 +NV2080_CTRL_THERMAL_SYSTEM_EXECUTE_V2_PARAMS_MESSAGE_ID = (0x13) +NV2080_CTRL_CMD_TIMER_SCHEDULE = (0x20800401) +NV2080_CTRL_CMD_TIMER_SCHEDULE_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME = (0, 0) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME_ABS = (0x00000000) +NV2080_CTRL_TIMER_SCHEDULE_FLAGS_TIME_REL = (0x00000001) +NV2080_CTRL_CMD_TIMER_CANCEL = (0x20800402) +NV2080_CTRL_CMD_TIMER_GET_TIME = (0x20800403) +NV2080_CTRL_TIMER_GET_TIME_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_TIMER_GET_REGISTER_OFFSET = (0x20800404) +NV2080_CTRL_TIMER_GET_REGISTER_OFFSET_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO = (0x20800406) +NV2080_CTRL_TIMER_GPU_CPU_TIME_MAX_SAMPLES = 16 +NV2080_CTRL_TIMER_GET_GPU_CPU_TIME_CORRELATION_INFO_PARAMS_MESSAGE_ID = (0x6) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_SOURCE = (3, 0) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_OSTIME = (0x00000001) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_TSC = (0x00000002) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PLATFORM_API = (0x00000003) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_GSP_OS = (0x00000004) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR = (7, 4) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR_CPU = (0x00000000) +NV2080_TIMER_GPU_CPU_TIME_CPU_CLK_ID_PROCESSOR_GSP = (0x00000001) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ = (0x20800407) +NV2080_CTRL_CMD_TIMER_SET_GR_TICK_FREQ_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_OS_UNIX_GC6_BLOCKER_REFCNT = (0x20803d01) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_INC = (0x00000001) +NV2080_CTRL_OS_UNIX_GC6_BLOCKER_REFCNT_DEC = (0x00000002) +NV2080_CTRL_CMD_OS_UNIX_ALLOW_DISALLOW_GCOFF = (0x20803d02) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_ALLOW = (0x00000001) +NV2080_CTRL_OS_UNIX_ALLOW_DISALLOW_GCOFF_DISALLOW = (0x00000002) +NV2080_CTRL_CMD_OS_UNIX_AUDIO_DYNAMIC_POWER = (0x20803d03) +NV2080_CTRL_OS_UNIX_AUDIO_DYNAMIC_POWER_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_OS_UNIX_INSTALL_PROFILER_HOOKS = (0x20803d04) +NV2080_CTRL_OS_UNIX_INSTALL_PROFILER_HOOKS_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_OS_UNIX_FLUSH_SNAPSHOT_BUFFER = (0x20803d05) +NV2080_CTRL_CMD_OS_UNIX_STOP_PROFILER = (0x20803d06) +NV2080_CTRL_CMD_OS_UNIX_VIDMEM_PERSISTENCE_STATUS = (0x20803d07) +NV2080_CTRL_OS_UNIX_VIDMEM_PERSISTENCE_STATUS_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_OS_UNIX_UPDATE_TGP_STATUS = (0x20803d08) +NV2080_CTRL_OS_UNIX_UPDATE_TGP_STATUS_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK = (0x20804001) +NV2080_CTRL_MAX_VMMU_SEGMENTS = 384 +NV2080_GPU_MAX_ENGINES = 0x54 +NV2080_CTRL_VGPU_MGR_INTERNAL_BOOTLOAD_GSP_VGPU_PLUGIN_TASK_PARAMS_MESSAGE_ID = (0x1) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK = (0x20804002) +NV2080_CTRL_VGPU_MGR_INTERNAL_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_PARAMS_MESSAGE_ID = (0x2) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE = (0x20804003) +NV2080_CTRL_VGPU_MGR_INTERNAL_PGPU_ADD_VGPU_TYPE_PARAMS_MESSAGE_ID = (0x3) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU = (0x20804004) +NV2080_CTRL_VGPU_MGR_INTERNAL_ENUMERATE_VGPU_PER_PGPU_PARAMS_MESSAGE_ID = (0x4) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO = (0x20804005) +NV2080_CTRL_VGPU_MGR_INTERNAL_CLEAR_GUEST_VM_INFO_PARAMS_MESSAGE_ID = (0x5) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE = (0x20804006) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_VGPU_FB_USAGE_PARAMS_MESSAGE_ID = (0x6) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY = (0x20804007) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_ENCODER_CAPACITY_PARAMS_MESSAGE_ID = (0x7) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP = (0x20804008) +NV2080_CTRL_VGPU_MGR_INTERNAL_VGPU_PLUGIN_CLEANUP_PARAMS_MESSAGE_ID = (0x8) +NV2080_CTRL_MAX_NVU32_TO_CONVERTED_STR_LEN = 8 +NV2080_CTRL_MAX_GPC_COUNT = 32 +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING = (0x20804009) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_FS_ENCODING_PARAMS_MESSAGE_ID = (0x9) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT = (0x2080400a) +NV2080_CTRL_VGPU_MGR_INTERNAL_GET_PGPU_MIGRATION_SUPPORT_PARAMS_MESSAGE_ID = (0xA) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG = (0x2080400b) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MGR_CONFIG_PARAMS_MESSAGE_ID = (0xB) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_FREE_STATES = (0x2080400c) +NV2080_CTRL_VGPU_MGR_INTERNAL_FREE_STATES_PARAMS_MESSAGE_ID = (0xC) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_GET_FRAME_RATE_LIMITER_STATUS = (0x2080400d) +NV2080_CTRL_VGPU_MGR_GET_FRAME_RATE_LIMITER_STATUS_PARAMS_MESSAGE_ID = (0xD) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE = (0x2080400e) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_HETEROGENEOUS_MODE_PARAMS_MESSAGE_ID = (0xE) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE = (0x2080400f) +NV2080_CTRL_VGPU_MGR_INTERNAL_SET_VGPU_MIG_TIMESLICE_MODE_PARAMS_MESSAGE_ID = (0xF) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE = (0x20804010) +NV2080_CTRL_CMD_VGPU_MGR_INTERNAL_SET_POWER_STATE_PARAMS_MESSAGE_ID = (0x10) +NV83DE_CTRL_RESERVED = (0x00) +NV83DE_CTRL_GR = (0x01) +NV83DE_CTRL_FIFO = (0x02) +NV83DE_CTRL_DEBUG = (0x03) +NV83DE_CTRL_INTERNAL = (0x04) +NV83DE_CTRL_CMD_NULL = (0x83de0000) +NV83DE_CTRL_CMD_SM_DEBUG_MODE_ENABLE = (0x83de0301) +NV83DE_CTRL_CMD_SM_DEBUG_MODE_DISABLE = (0x83de0302) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG = (0x83de0307) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_DEBUG_PARAMS_MESSAGE_ID = (0x7) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_DEBUG_DISABLE = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_RELEASE_MMU_DEBUG_REQUESTS = (0x00000003) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG = (0x83de0308) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_DEBUG_PARAMS_MESSAGE_ID = (0x8) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_DEBUG_DISABLED = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_SET_EXCEPTION_MASK = (0x83de0309) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PARAMS_MESSAGE_ID = (0x9) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_FATAL = (0x00000001) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_TRAP = (0x00000002) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_SINGLE_STEP = (0x00000004) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_INT = (0x00000008) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_CILP = (0x00000010) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_PREEMPTION_STARTED = (0x00000020) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_NONE = (0x00000000) +NV83DE_CTRL_DEBUG_SET_EXCEPTION_MASK_ALL = (0x0000FFFF) +NV83DE_CTRL_CMD_DEBUG_READ_SINGLE_SM_ERROR_STATE = (0x83de030b) +NV83DE_CTRL_DEBUG_READ_SINGLE_SM_ERROR_STATE_PARAMS_MESSAGE_ID = (0xB) +NV83DE_CTRL_CMD_DEBUG_READ_ALL_SM_ERROR_STATES = (0x83de030c) +NV83DE_CTRL_DEBUG_MAX_SMS_PER_CALL = 100 +NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS_MESSAGE_ID = (0xC) +NV83DE_CTRL_CMD_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE = (0x83de030f) +NV83DE_CTRL_DEBUG_CLEAR_SINGLE_SM_ERROR_STATE_PARAMS_MESSAGE_ID = (0xF) +NV83DE_CTRL_CMD_DEBUG_CLEAR_ALL_SM_ERROR_STATES = (0x83de0310) +NV83DE_CTRL_DEBUG_CLEAR_ALL_SM_ERROR_STATES_PARAMS_MESSAGE_ID = (0x10) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_PARAMS_DEFINED = 1 +NV83DE_CTRL_CMD_DEBUG_SUSPEND_ALL_CONTEXTS_FOR_CLIENT_HAS_RESIDENT_CHANNEL = 1 +NV83DE_CTRL_CMD_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE = (0x83de0313) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_PARAMS_MESSAGE_ID = (0x13) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_SINGLE_SM = (0x00000001) +NV83DE_CTRL_DEBUG_SET_NEXT_STOP_TRIGGER_TYPE_BROADCSAT = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING = (0x83de0314) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PARAMS_MESSAGE_ID = (0x14) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_NONPAUSING = (0x00000001) +NV83DE_CTRL_DEBUG_SET_SINGLE_STEP_INTERRUPT_HANDLING_PAUSING = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_READ_MEMORY = (0x83de0315) +NV83DE_CTRL_DEBUG_READ_MEMORY_PARAMS_MESSAGE_ID = (0x15) +NV83DE_CTRL_CMD_DEBUG_WRITE_MEMORY = (0x83de0316) +NV83DE_CTRL_DEBUG_WRITE_MEMORY_PARAMS_MESSAGE_ID = (0x16) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT = (0x83de0317) +NV83DE_CTRL_CMD_DEBUG_SUSPEND_CONTEXT_PARAMS_MESSAGE_ID = (0x17) +NV83DE_CTRL_CMD_DEBUG_RESUME_CONTEXT = (0x83de0318) +NV83DE_CTRL_CMD_DEBUG_GET_HANDLES = (0x83de0319) +NV83DE_CTRL_CMD_READ_SURFACE = (0x83de031a) +NV83DE_CTRL_CMD_WRITE_SURFACE = (0x83de031b) +MAX_ACCESS_OPS = 64 +NV83DE_CTRL_CMD_GET_MAPPINGS = (0x83de031c) +MAX_GET_MAPPINGS_OPS = 64 +NV83DE_CTRL_CMD_DEBUG_EXEC_REG_OPS = (0x83de031d) +NV83DE_CTRL_GPU_EXEC_REG_OPS_MAX_OPS = 100 +NV83DE_CTRL_DEBUG_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0x1D) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG = (0x83de031f) +NV83DE_CTRL_DEBUG_SET_MODE_ERRBAR_DEBUG_PARAMS_MESSAGE_ID = (0x1F) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG_DISABLE = (0x00000000) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_ERRBAR_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG = (0x83de0320) +NV83DE_CTRL_DEBUG_GET_MODE_ERRBAR_DEBUG_PARAMS_MESSAGE_ID = (0x20) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG_DISABLED = (0x00000000) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_ERRBAR_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_SINGLE_STEP = (0x83de0321) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SINGLE_STEP_PARAMS_MESSAGE_ID = (0x21) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_STOP_TRIGGER = (0x83de0322) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_STOP_TRIGGER_PARAMS_MESSAGE_ID = (0x22) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_RUN_TRIGGER = (0x83de0323) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_RUN_TRIGGER_PARAMS_MESSAGE_ID = (0x23) +NV83DE_CTRL_CMD_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT = (0x83de0324) +NV83DE_CTRL_DEBUG_SET_SINGLE_SM_SKIP_IDLE_WARP_DETECT_PARAMS_MESSAGE_ID = (0x24) +NV83DE_CTRL_CMD_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS = (0x83de0325) +NV83DE_CTRL_DEBUG_GET_SINGLE_SM_DEBUGGER_STATUS_PARAMS_MESSAGE_ID = (0x25) +NV83DE_CTRL_CMD_DEBUG_READ_BATCH_MEMORY = (0x83de0326) +NV83DE_CTRL_CMD_DEBUG_WRITE_BATCH_MEMORY = (0x83de0327) +MAX_ACCESS_MEMORY_OPS = 150 +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_MAX_ENTRIES = 4 +NV83DE_CTRL_CMD_DEBUG_READ_MMU_FAULT_INFO = (0x83de0328) +NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS_MESSAGE_ID = (0x28) +NV83DE_CTRL_CMD_DEBUG_SET_DROP_DEFERRED_RC = (0x83de0329) +NV83DE_CTRL_DEBUG_SET_DROP_DEFERRED_RC_PARAMS_MESSAGE_ID = (0x29) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG = (0x83de032a) +NV83DE_CTRL_DEBUG_SET_MODE_MMU_GCC_DEBUG_PARAMS_MESSAGE_ID = (0x2A) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG_ENABLE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_MODE_MMU_GCC_DEBUG_DISABLE = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_RELEASE_MMU_GCC_DEBUG_REQUESTS = (0x00000003) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG = (0x83de032b) +NV83DE_CTRL_DEBUG_GET_MODE_MMU_GCC_DEBUG_PARAMS_MESSAGE_ID = (0x2B) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG_ENABLED = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_GET_MODE_MMU_GCC_DEBUG_DISABLED = (0x00000002) +NV83DE_CTRL_CMD_DEBUG_SET_NON_PREEMPTABLE_DEBUGGER_CONTEXT = (0x83de022d) +NV83DE_CTRL_DEBUG_SET_NON_PREEMPTABLE_DEBUGGER_CONTEXT_PARAMS_MESSAGE_ID = (0x2D) +NV83DE_CTRL_CMD_DEBUG_SET_NON_PREEMPTABLE_DEBUGGER_CONTEXT_ACTIVE = (0x00000001) +NV83DE_CTRL_CMD_DEBUG_SET_NON_PREEMPTABLE_DEBUGGER_CONTEXT_INACTIVE = (0x00000000) +NV83DE_CTRL_CMD_DEBUG_SET_RECOVERY_SUPPRESSION_TIMEOUT = (0x83de022e) +NV83DE_CTRL_DEBUG_SET_RECOVERY_SUPPRESSION_TIMEOUT_PARAMS_MESSAGE_ID = (0x2E) +NVB0CC_CTRL_RESERVED = (0x00) +NVB0CC_CTRL_PROFILER = (0x01) +NVB0CC_CTRL_INTERNAL = (0x02) +NVB0CC_CTRL_CMD_NULL = (0xb0cc0000) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM = (0xb0cc0204) +NVB0CC_CTRL_CMD_INTERNAL_ALLOC_PMA_STREAM_FINN_PARAMS_MESSAGE_ID = (0x0) +NVB0CC_CTRL_CMD_INTERNAL_QUIESCE_PMA_CHANNEL = (0xb0cc0201) +NVB0CC_CTRL_INTERNAL_QUIESCE_PMA_CHANNEL_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_CMD_INTERNAL_SRIOV_PROMOTE_PMA_STREAM = (0xb0cc0202) +NVB0CC_CTRL_INTERNAL_SRIOV_PROMOTE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x2) +NVB0CC_CTRL_CMD_INTERNAL_PERMISSIONS_INIT = (0xb0cc0203) +NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS_MESSAGE_ID = (0x3) +NVB0CC_CTRL_INTERNAL_ALLOC_PMA_STREAM_PARAMS_MESSAGE_ID = (0x4) +NVB0CC_CTRL_CMD_INTERNAL_FREE_PMA_STREAM = (0xb0cc0206) +NVB0CC_CTRL_INTERNAL_FREE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x6) +NVB0CC_CTRL_CMD_INTERNAL_GET_MAX_PMAS = (0xb0cc0207) +NVB0CC_CTRL_INTERNAL_GET_MAX_PMAS_PARAMS_MESSAGE_ID = (0x7) +NVB0CC_CTRL_CMD_INTERNAL_BIND_PM_RESOURCES = (0xb0cc0208) +NVB0CC_CTRL_CMD_INTERNAL_UNBIND_PM_RESOURCES = (0xb0cc0209) +NVB0CC_CTRL_CMD_INTERNAL_RESERVE_HWPM_LEGACY = (0xb0cc020a) +NVB0CC_CTRL_INTERNAL_RESERVE_HWPM_LEGACY_PARAMS_MESSAGE_ID = (0xa) +NVB0CC_CTRL_CMD_POWER_REQUEST_FEATURES = (0xb0cc0301) +NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG = (1, 0) +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG = (3, 2) +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG = (5, 4) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG = (7, 6) +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN = (9, 8) +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT = (11, 10) +NVB0CC_CTRL_POWER_FEATURE_IGNORE = (0x00000000) +NVB0CC_CTRL_POWER_FEATURE_DISABLE = (0x00000001) +NVB0CC_CTRL_POWER_FEATURE_ENABLE = (0x00000002) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_IGNORE = NVB0CC_CTRL_POWER_FEATURE_IGNORE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_DISABLE = NVB0CC_CTRL_POWER_FEATURE_DISABLE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_ENABLE = NVB0CC_CTRL_POWER_FEATURE_ENABLE +NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED = (0x00000000) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED = (0x00000001) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED = (0x00000002) +NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED = (0x00000003) +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_FULFILLED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FULFILLED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_REJECTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_REJECTED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_NOT_SUPPORTED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_NOT_SUPPORTED +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_REQUEST_FAILED = NVB0CC_CTRL_POWER_FEATURE_REQUEST_FAILED +NVB0CC_CTRL_CMD_POWER_RELEASE_FEATURES = (0xb0cc0302) +NVB0CC_CTRL_POWER_RELEASE_FEATURES_PARAMS_MESSAGE_ID = (0x2) +NVB0CC_CTRL_POWER_FEATURE_RELEASE = (0x00000003) +NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_SLCG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_RELEASE = NVB0CC_CTRL_POWER_FEATURE_RELEASE +NVB0CC_CTRL_CMD_RESERVE_HWPM_LEGACY = (0xb0cc0101) +NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS_MESSAGE_ID = (0x1) +NVB0CC_CTRL_CMD_RELEASE_HWPM_LEGACY = (0xb0cc0102) +NVB0CC_CTRL_CMD_RESERVE_PM_AREA_SMPC = (0xb0cc0103) +NVB0CC_CTRL_RESERVE_PM_AREA_SMPC_PARAMS_MESSAGE_ID = (0x3) +NVB0CC_CTRL_CMD_RELEASE_PM_AREA_SMPC = (0xb0cc0104) +NVB0CC_CTRL_CMD_ALLOC_PMA_STREAM = (0xb0cc0105) +NVB0CC_PMA_BUFFER_SIZE_MAX = (0xffe00000) +NVB0CC_PMA_BYTES_AVAILABLE_SIZE = (0x1000) +NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS_MESSAGE_ID = (0x5) +NVB0CC_CTRL_CMD_FREE_PMA_STREAM = (0xb0cc0106) +NVB0CC_CTRL_FREE_PMA_STREAM_PARAMS_MESSAGE_ID = (0x6) +NVB0CC_CTRL_CMD_BIND_PM_RESOURCES = (0xb0cc0107) +NVB0CC_CTRL_CMD_UNBIND_PM_RESOURCES = (0xb0cc0108) +NVB0CC_CTRL_CMD_PMA_STREAM_UPDATE_GET_PUT = (0xb0cc0109) +NVB0CC_AVAILABLE_BYTES_DEFAULT_VALUE = 0xFFFFFFFF +NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS_MESSAGE_ID = (0x9) +NVB0CC_REGOPS_MAX_COUNT = (124) +NVB0CC_CTRL_CMD_EXEC_REG_OPS = (0xb0cc010a) +NVB0CC_CTRL_EXEC_REG_OPS_PARAMS_MESSAGE_ID = (0xA) +NVB0CC_CTRL_CMD_RESERVE_PM_AREA_PC_SAMPLER = (0xb0cc010b) +NVB0CC_CTRL_CMD_RELEASE_PM_AREA_PC_SAMPLER = (0xb0cc010c) +NVB0CC_CTRL_CMD_GET_TOTAL_HS_CREDITS = (0xb0cc010d) +NVB0CC_CTRL_GET_TOTAL_HS_CREDITS_PARAMS_MESSAGE_ID = (0xD) +NVB0CC_CTRL_CMD_SET_HS_CREDITS = (0xb0cc010e) +NVB0CC_MAX_CREDIT_INFO_ENTRIES = (63) +NVB0CC_CTRL_SET_HS_CREDITS_PARAMS_MESSAGE_ID = (0xE) +NVB0CC_CTRL_CMD_GET_HS_CREDITS = (0xb0cc010f) +NVB0CC_CTRL_GET_HS_CREDITS_PARAMS_MESSAGE_ID = (0xF) +NVB0CC_CTRL_HES_INVALID = (0x00000000) +NVB0CC_CTRL_HES_CWD = (0x00000001) +NVB0CC_CTRL_HES_TPC = (0x00000002) +NVB0CC_CTRL_CMD_RESERVE_HES = (0xb0cc0113) +NVB0CC_CTRL_RESERVE_HES_PARAMS_MESSAGE_ID = (0x13) +NVB0CC_CTRL_CMD_RELEASE_HES = (0xb0cc0114) +NVB0CC_CTRL_RELEASE_HES_PARAMS_MESSAGE_ID = (0x14) +NVB0CC_CREDIT_POOL_MAX_COUNT = 30 +NVB0CC_CTRL_CMD_GET_CHIPLET_HS_CREDIT_POOL = (0xb0cc0115) +NVB0CC_CTRL_GET_CHIPLET_HS_CREDIT_POOL_MESSAGE_ID = (0x15) +NVB0CC_CTRL_CMD_GET_HS_CREDITS_MAPPING = (0xb0cc0116) +NVB0CC_CTRL_GET_HS_CREDITS_POOL_MAPPING_PARAMS_MESSAGE_ID = (0x16) +NVB0CC_CTRL_CMD_DISABLE_DYNAMIC_MMA_BOOST = (0xb0cc0117) +NVB0CC_CTRL_DISABLE_DYNAMIC_MMA_BOOST_PARAMS_MESSAGE_ID = (0x17) +NVB0CC_CTRL_CMD_GET_DYNAMIC_MMA_BOOST_STATUS = (0xb0cc0118) +NVB0CC_CTRL_GET_DYNAMIC_MMA_BOOST_STATUS_PARAMS_MESSAGE_ID = (0x18) +NVB0CC_CTRL_CMD_RESERVE_CCU_PROF = (0xb0cc0119) +NVB0CC_CTRL_RESERVE_CCUPROF_PARAMS_MESSAGE_ID = (0x19) +NVB0CC_CTRL_CMD_RELEASE_CCU_PROF = (0xb0cc011a) +NV_STATUS_LEVEL_OK = 0 +NV_STATUS_LEVEL_WARN = 1 +NV_STATUS_LEVEL_ERR = 3 +NV01_ROOT = (0x00000000) +NV1_ROOT = (0x00000000) +NV01_NULL_OBJECT = (0x00000000) +NV1_NULL_OBJECT = (0x00000000) +NV01_ROOT_NON_PRIV = (0x00000001) +NV1_ROOT_NON_PRIV = (0x00000001) +NV01_ROOT_CLIENT = (0x00000041) +FABRIC_MANAGER_SESSION = (0x0000000f) +NV0020_GPU_MANAGEMENT = (0x00000020) +NV01_DEVICE_0 = (0x00000080) +NV20_SUBDEVICE_0 = (0x00002080) +NV2081_BINAPI = (0x00002081) +NV2082_BINAPI_PRIVILEGED = (0x00002082) +NV20_SUBDEVICE_DIAG = (0x0000208f) +NV01_CONTEXT_DMA = (0x00000002) +NV01_MEMORY_SYSTEM = (0x0000003e) +NV1_MEMORY_SYSTEM = (0x0000003e) +NV01_MEMORY_LOCAL_PRIVILEGED = (0x0000003f) +NV1_MEMORY_LOCAL_PRIVILEGED = (0x0000003f) +NV01_MEMORY_PRIVILEGED = (0x0000003f) +NV1_MEMORY_PRIVILEGED = (0x0000003f) +NV01_MEMORY_LOCAL_USER = (0x00000040) +NV1_MEMORY_LOCAL_USER = (0x00000040) +NV01_MEMORY_USER = (0x00000040) +NV1_MEMORY_USER = (0x00000040) +NV01_MEMORY_VIRTUAL = (0x00000070) +NV01_MEMORY_SYSTEM_DYNAMIC = (0x00000070) +NV1_MEMORY_SYSTEM_DYNAMIC = (0x00000070) +NV_MEMORY_MAPPER = (0x000000fe) +NV01_MEMORY_LOCAL_PHYSICAL = (0x000000c2) +NV01_MEMORY_SYNCPOINT = (0x000000c3) +NV01_MEMORY_SYSTEM_OS_DESCRIPTOR = (0x00000071) +NV01_MEMORY_DEVICELESS = (0x000090ce) +NV01_MEMORY_FRAMEBUFFER_CONSOLE = (0x00000076) +NV01_MEMORY_HW_RESOURCES = (0x000000b1) +NV01_MEMORY_LIST_SYSTEM = (0x00000081) +NV01_MEMORY_LIST_FBMEM = (0x00000082) +NV01_MEMORY_LIST_OBJECT = (0x00000083) +NV_IMEX_SESSION = (0x000000f1) +PROFILER_DEVICE_EVENT = (0x0000b0cd) +PROFILER_CONTEXT_EVENT = (0x0000b0ce) +TRACE_DEVICE_EVENT = (0x0000cdcd) +NV_MEMORY_EXPORT = (0x000000e0) +NV_CE_UTILS = (0x00000050) +NV_MEMORY_FABRIC = (0x000000f8) +NV_MEMORY_FABRIC_IMPORT_V2 = (0x000000f9) +NV_MEMORY_FABRIC_IMPORTED_REF = (0x000000fb) +FABRIC_VASPACE_A = (0x000000fc) +NV_MEMORY_MULTICAST_FABRIC = (0x000000fd) +IO_VASPACE_A = (0x000000f2) +NV01_NULL = (0x00000030) +NV1_NULL = (0x00000030) +NV01_EVENT = (0x00000005) +NV1_EVENT = (0x00000005) +NV01_EVENT_KERNEL_CALLBACK = (0x00000078) +NV1_EVENT_KERNEL_CALLBACK = (0x00000078) +NV01_EVENT_OS_EVENT = (0x00000079) +NV1_EVENT_OS_EVENT = (0x00000079) +NV01_EVENT_WIN32_EVENT = (0x00000079) +NV1_EVENT_WIN32_EVENT = (0x00000079) +NV01_EVENT_KERNEL_CALLBACK_EX = (0x0000007e) +NV1_EVENT_KERNEL_CALLBACK_EX = (0x0000007e) +NV01_TIMER = (0x00000004) +NV1_TIMER = (0x00000004) +KERNEL_GRAPHICS_CONTEXT = (0x00000090) +KERNEL_WATCHDOG = (0x0000008f) +LOCK_STRESS_OBJECT = (0x00000100) +LOCK_TEST_RELAXED_DUP_OBJECT = (0x00000101) +NV50_CHANNEL_GPFIFO = (0x0000506f) +GF100_CHANNEL_GPFIFO = (0x0000906f) +KEPLER_CHANNEL_GPFIFO_A = (0x0000a06f) +UVM_CHANNEL_RETAINER = (0x0000c574) +KEPLER_CHANNEL_GPFIFO_B = (0x0000a16f) +MAXWELL_CHANNEL_GPFIFO_A = (0x0000b06f) +PASCAL_CHANNEL_GPFIFO_A = (0x0000c06f) +VOLTA_CHANNEL_GPFIFO_A = (0x0000c36f) +TURING_CHANNEL_GPFIFO_A = (0x0000c46f) +AMPERE_CHANNEL_GPFIFO_A = (0x0000c56f) +HOPPER_CHANNEL_GPFIFO_A = (0x0000c86f) +BLACKWELL_CHANNEL_GPFIFO_A = (0x0000c96f) +BLACKWELL_CHANNEL_GPFIFO_B = (0x0000ca6f) +NV04_SOFTWARE_TEST = (0x0000007d) +NV4_SOFTWARE_TEST = (0x0000007d) +NV30_GSYNC = (0x000030f1) +VOLTA_USERMODE_A = (0x0000c361) +TURING_USERMODE_A = (0x0000c461) +AMPERE_USERMODE_A = (0x0000c561) +HOPPER_USERMODE_A = (0x0000c661) +BLACKWELL_USERMODE_A = (0x0000c761) +NVC371_DISP_SF_USER = (0x0000c371) +NVC372_DISPLAY_SW = (0x0000c372) +NVC573_DISP_CAPABILITIES = (0x0000c573) +NVC673_DISP_CAPABILITIES = (0x0000c673) +NVC773_DISP_CAPABILITIES = (0x0000c773) +NVC873_DISP_CAPABILITIES = (0x0000c873) +NVC973_DISP_CAPABILITIES = (0x0000c973) +NVCA73_DISP_CAPABILITIES = (0x0000ca73) +NVCB73_DISP_CAPABILITIES = (0x0000cb73) +NVCC73_DISP_CAPABILITIES = (0x0000cc73) +NV04_DISPLAY_COMMON = (0x00000073) +NV50_DEFERRED_API_CLASS = (0x00005080) +MPS_COMPUTE = (0x0000900e) +NVC570_DISPLAY = (0x0000c570) +NVC57A_CURSOR_IMM_CHANNEL_PIO = (0x0000c57a) +NVC57B_WINDOW_IMM_CHANNEL_DMA = (0x0000c57b) +NVC57D_CORE_CHANNEL_DMA = (0x0000c57d) +NVC57E_WINDOW_CHANNEL_DMA = (0x0000c57e) +NVC670_DISPLAY = (0x0000c670) +NVC671_DISP_SF_USER = (0x0000c671) +NVC67A_CURSOR_IMM_CHANNEL_PIO = (0x0000c67a) +NVC67B_WINDOW_IMM_CHANNEL_DMA = (0x0000c67b) +NVC67D_CORE_CHANNEL_DMA = (0x0000c67d) +NVC67E_WINDOW_CHANNEL_DMA = (0x0000c67e) +NVC77F_ANY_CHANNEL_DMA = (0x0000c77f) +NVC770_DISPLAY = (0x0000c770) +NVC771_DISP_SF_USER = (0x0000c771) +NVC77D_CORE_CHANNEL_DMA = (0x0000c77d) +NVC870_DISPLAY = (0x0000c870) +NVC871_DISP_SF_USER = (0x0000c871) +NVC87A_CURSOR_IMM_CHANNEL_PIO = (0x0000c87a) +NVC87B_WINDOW_IMM_CHANNEL_DMA = (0x0000c87b) +NVC87D_CORE_CHANNEL_DMA = (0x0000c87d) +NVC87E_WINDOW_CHANNEL_DMA = (0x0000c87e) +NVC970_DISPLAY = (0x0000c970) +NVC971_DISP_SF_USER = (0x0000c971) +NVC97A_CURSOR_IMM_CHANNEL_PIO = (0x0000c97a) +NVC97B_WINDOW_IMM_CHANNEL_DMA = (0x0000c97b) +NVC97D_CORE_CHANNEL_DMA = (0x0000c97d) +NVC97E_WINDOW_CHANNEL_DMA = (0x0000c97e) +NVCA70_DISPLAY = (0x0000ca70) +NVCA71_DISP_SF_USER = (0x0000ca71) +NVCA7A_CURSOR_IMM_CHANNEL_PIO = (0x0000ca7a) +NVCA7B_WINDOW_IMM_CHANNEL_DMA = (0x0000ca7b) +NVCA7D_CORE_CHANNEL_DMA = (0x0000ca7d) +NVCA7E_WINDOW_CHANNEL_DMA = (0x0000ca7e) +NVCB70_DISPLAY = (0x0000cb70) +NVCB71_DISP_SF_USER = (0x0000cb71) +NVCB7A_CURSOR_IMM_CHANNEL_PIO = (0x0000cb7a) +NVCB7B_WINDOW_IMM_CHANNEL_DMA = (0x0000cb7b) +NVCB7D_CORE_CHANNEL_DMA = (0x0000cb7d) +NVCB7E_WINDOW_CHANNEL_DMA = (0x0000cb7e) +NVCC70_DISPLAY = (0x0000cc70) +NVCC71_DISP_SF_USER = (0x0000cc71) +NVCC7A_CURSOR_IMM_CHANNEL_PIO = (0x0000cc7a) +NVCC7B_WINDOW_IMM_CHANNEL_DMA = (0x0000cc7b) +NVCC7D_CORE_CHANNEL_DMA = (0x0000cc7d) +NVCC7E_WINDOW_CHANNEL_DMA = (0x0000cc7e) +NV9010_VBLANK_CALLBACK = (0x00009010) +GF100_PROFILER = (0x000090cc) +MAXWELL_PROFILER = (0x0000b0cc) +MAXWELL_PROFILER_CONTEXT = (0x0000b1cc) +MAXWELL_PROFILER_DEVICE = (0x0000b2cc) +GF100_SUBDEVICE_MASTER = (0x000090e6) +GF100_SUBDEVICE_INFOROM = (0x000090e7) +GF100_ZBC_CLEAR = (0x00009096) +GF100_DISP_SW = (0x00009072) +GF100_TIMED_SEMAPHORE_SW = (0x00009074) +G84_PERFBUFFER = (0x0000844c) +NV50_MEMORY_VIRTUAL = (0x000050a0) +NV50_P2P = (0x0000503b) +NV50_THIRD_PARTY_P2P = (0x0000503c) +FERMI_TWOD_A = (0x0000902d) +FERMI_VASPACE_A = (0x000090f1) +HOPPER_SEC2_WORK_LAUNCH_A = (0x0000cba2) +GF100_HDACODEC = (0x000090ec) +NVB8B0_VIDEO_DECODER = (0x0000b8b0) +NVC4B0_VIDEO_DECODER = (0x0000c4b0) +NVC6B0_VIDEO_DECODER = (0x0000c6b0) +NVC7B0_VIDEO_DECODER = (0x0000c7b0) +NVC9B0_VIDEO_DECODER = (0x0000c9b0) +NVCDB0_VIDEO_DECODER = (0x0000cdb0) +NVCEB0_VIDEO_DECODER = (0x0000ceb0) +NVCFB0_VIDEO_DECODER = (0x0000cfb0) +NVD1B0_VIDEO_DECODER = (0x0000d1b0) +NVD2B0_VIDEO_DECODER = (0x0000d2b0) +NVC4B7_VIDEO_ENCODER = (0x0000c4b7) +NVB4B7_VIDEO_ENCODER = (0x0000b4b7) +NVC7B7_VIDEO_ENCODER = (0x0000c7b7) +NVC9B7_VIDEO_ENCODER = (0x0000c9b7) +NVCEB7_VIDEO_ENCODER = (0x0000ceb7) +NVCFB7_VIDEO_ENCODER = (0x0000cfb7) +NVD1B7_VIDEO_ENCODER = (0x0000d1b7) +NVB8D1_VIDEO_NVJPG = (0x0000b8d1) +NVC4D1_VIDEO_NVJPG = (0x0000c4d1) +NVC9D1_VIDEO_NVJPG = (0x0000c9d1) +NVCED0_VIDEO_NVJPG = (0x0000ced0) +NVCDD1_VIDEO_NVJPG = (0x0000cdd1) +NVCFD1_VIDEO_NVJPG = (0x0000cfd1) +NVD2D1_VIDEO_NVJPG = (0x0000d2d1) +NVB8FA_VIDEO_OFA = (0x0000b8fa) +NVC6FA_VIDEO_OFA = (0x0000c6fa) +NVC7FA_VIDEO_OFA = (0x0000c7fa) +NVC9FA_VIDEO_OFA = (0x0000c9fa) +NVCDFA_VIDEO_OFA = (0x0000cdfa) +NVCEFA_VIDEO_OFA = (0x0000cefa) +NVCFFA_VIDEO_OFA = (0x0000cffa) +NVD1FA_VIDEO_OFA = (0x0000d1fa) +NVD2FA_VIDEO_OFA = (0x0000d2fa) +KEPLER_INLINE_TO_MEMORY_B = (0x0000a140) +FERMI_CONTEXT_SHARE_A = (0x00009067) +KEPLER_CHANNEL_GROUP_A = (0x0000a06c) +PASCAL_DMA_COPY_A = (0x0000c0b5) +TURING_DMA_COPY_A = (0x0000c5b5) +AMPERE_DMA_COPY_A = (0x0000c6b5) +AMPERE_DMA_COPY_B = (0x0000c7b5) +HOPPER_DMA_COPY_A = (0x0000c8b5) +BLACKWELL_DMA_COPY_A = (0x0000c9b5) +BLACKWELL_DMA_COPY_B = (0x0000cab5) +MAXWELL_DMA_COPY_A = (0x0000b0b5) +ACCESS_COUNTER_NOTIFY_BUFFER = (0x0000c365) +MMU_FAULT_BUFFER = (0x0000c369) +MMU_VIDMEM_ACCESS_BIT_BUFFER = (0x0000c763) +HOPPER_MMU_VIDMEM_ACCESS_BIT_BUFFER = (0x0000c863) +TURING_A = (0x0000c597) +TURING_COMPUTE_A = (0x0000c5c0) +AMPERE_A = (0x0000c697) +AMPERE_COMPUTE_A = (0x0000c6c0) +AMPERE_B = (0x0000c797) +AMPERE_COMPUTE_B = (0x0000c7c0) +ADA_A = (0x0000c997) +ADA_COMPUTE_A = (0x0000c9c0) +AMPERE_SMC_PARTITION_REF = (0x0000c637) +AMPERE_SMC_EXEC_PARTITION_REF = (0x0000c638) +AMPERE_SMC_CONFIG_SESSION = (0x0000c639) +NV0092_RG_LINE_CALLBACK = (0x00000092) +AMPERE_SMC_MONITOR_SESSION = (0x0000c640) +HOPPER_A = (0x0000cb97) +HOPPER_COMPUTE_A = (0x0000cbc0) +BLACKWELL_A = (0x0000cd97) +BLACKWELL_COMPUTE_A = (0x0000cdc0) +BLACKWELL_B = (0x0000ce97) +BLACKWELL_COMPUTE_B = (0x0000cec0) +BLACKWELL_INLINE_TO_MEMORY_A = (0x0000cd40) +NV40_DEBUG_BUFFER = (0x000000db) +RM_USER_SHARED_DATA = (0x000000de) +GT200_DEBUGGER = (0x000083de) +NV40_I2C = (0x0000402c) +KEPLER_DEVICE_VGPU = (0x0000a080) +NVA081_VGPU_CONFIG = (0x0000a081) +NVA084_KERNEL_HOST_VGPU_DEVICE = (0x0000a084) +NVA083_GRID_DISPLAYLESS = (0x0000a083) +NV0060_SYNC_GPU_BOOST = (0x00000060) +GP100_UVM_SW = (0x0000c076) +NVENC_SW_SESSION = (0x0000a0bc) +NV_EVENT_BUFFER = (0x000090cd) +NVFBC_SW_SESSION = (0x0000a0bd) +NV_CONFIDENTIAL_COMPUTE = (0x0000cb33) +NV_COUNTER_COLLECTION_UNIT = (0x0000cbca) +NV_SEMAPHORE_SURFACE = (0x000000da) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/__init__.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/__init__.py new file mode 100644 index 000000000..751b4745c --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/__init__.py @@ -0,0 +1,43 @@ +import re, pathlib +from tinygrad.runtime.autogen import load, nv_src + +swref_path, hwref_path = "{}/src/common/inc/swref/published", "{}/kernel-open/nvidia-uvm/hwref" +swref = { + "dev_therm": ["gb202"], "dev_vm": ["tu102", "gh100"], **{k:["tu102"] for k in ["dev_fb", "dev_bus"]}, + **{k:["ga102"] for k in ["dev_gc6_island", "dev_gsp", "dev_riscv_pri", "dev_fbif_v4", "dev_falcon_second_pri", "dev_sec_pri"]}, + "dev_falcon_v4": ["ga102", "gh100"], "dev_fsp_pri": ["gh100"] +} +hwref = {"dev_mmu": ["tu102", "gh100"]} +__all__ = ["nv_ref", *swref.keys(), *hwref.keys()] +has_addendum = (("ga102", "dev_gc6_island"), ("ga102", "dev_falcon_v4")) + +def __getattr__(nm): + arch_map = {"tu102":"turing", "ga102":"ampere", "gh100":"hopper", "gb202":"blackwell"} + regs_off = {'NV_PFALCON_FALCON': 0x0, 'NV_PGSP_FALCON': 0x0, 'NV_PSEC_FALCON': 0x0, 'NV_PRISCV_RISCV': 0x1000, 'NV_PGC6_AON': 0x0, 'NV_PFSP': 0x0, + 'NV_PGC6_BSI': 0x0, 'NV_PFALCON_FBIF': 0x600, 'NV_PFALCON2_FALCON': 0x1000, 'NV_PBUS': 0x0, 'NV_PFB': 0x0, 'NV_PMC': 0x0, 'NV_PGSP_QUEUE': 0x0, + 'NV_VIRTUAL_FUNCTION':0xb80000, "NV_THERM": 0x0} + + def genreg(_, files, **kwargs): + out = [] + for (file, arch) in [(file, "" if (a:=file.split('/')[-2]) == "published" else a) for file in files]: + lines = ((p:=pathlib.Path(file)).read_text() + ((p.parent/f"{nm}_addendum.h").read_text() if (arch, nm) in has_addendum else "")).splitlines() + def extract(pat): return (m.groups() for l in lines if (m:=re.match(pat, l))) + bitfields = {k:f"({lo}, {hi})" for k,hi,lo in extract(r'#define\s+(\w+)\s+([0-9\+\-\*\(\)]+):([0-9\+\-\*\(\)]+)')} + regs = {} + for l in lines: + def off(name): return next((o for p,o in regs_off.items() if name.startswith(p)), None) + def fields(name): return "{" + ", ".join(f"{k[len(name)+1:].lower()!r}: {v}" for k, v in bitfields.items() if k.startswith(name+"_")) + "}" + if (m:=re.match(r'#define\s+(\w+)\s*\(\s*(\w+)\s*\)\s*(.+)', l)) and off(m.group(1)) is not None: + regs[m.group(1)] = f"(0x{off(m.group(1)):X}, lambda {m.group(2)}: " + re.sub(r' */\*.*\*/', '', m.group(3)) + f", {fields(m.group(1))})" + elif (m:=re.match(r'#define\s+(\w+)\s+([0-9A-Fa-fx]+)(?![^\n]*:)', l)): + if off(m.group(1)) is None or any(m.group(1).startswith(r+'_') for r in regs): regs[m.group(1)] = m.group(2) + else: regs[m.group(1)] = f"(0x{off(m.group(1)):X}, {m.group(2)}, {fields(m.group(1))})" + elif (m:=re.match(r'#define\s+(\w+)\s*/\* ----G \*/\s*$', l)): regs[m.group(1)] = f"(None, None, {fields(m.group(1))})" # groups (for MMU) + out.extend([f"{arch or 'regs'} = {{", *[f" {k!r}: {v}," for k,v in regs.items()], "}"]) + return "\n".join(out) + + if nm == "nv_ref": return load(f"nv_regs/{nm}", [f"{swref_path}/{nm}.h"], gen=genreg, srcs=nv_src["nv_570"]) + if nm in __all__: + path, arches = (swref_path, swref[nm]) if nm in swref else (hwref_path, hwref[nm]) + return load(f"nv_regs/{nm}", [f"{path}/{arch_map[arch]}/{arch}/{nm}.h" for arch in arches], gen=genreg, srcs=nv_src["nv_570"]) + raise AttributeError(f"no such autogen: {nm}") diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_bus.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_bus.py new file mode 100644 index 000000000..43fbb84e4 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_bus.py @@ -0,0 +1,36 @@ +tu102 = { + 'NV_PBUS_VBIOS_SCRATCH': (0x0, lambda i: (0x00001400+(i)*4), {}), + 'NV_PBUS_SW_SCRATCH': (0x0, lambda i: (0x00001400+(i)*4), {}), + 'NV_PBUS_IFR_FMT_FIXED0': (0x0, 0x00000000, {'signature': (0, 31)}), + 'NV_PBUS_IFR_FMT_FIXED0_SIGNATURE_VALUE': 0x4947564E, + 'NV_PBUS_IFR_FMT_FIXED1': (0x0, 0x00000004, {'versionsw': (8, 15), 'fixed_data_size': (16, 30)}), + 'NV_PBUS_IFR_FMT_FIXED2': (0x0, 0x00000008, {'total_data_size': (0, 19)}), + 'NV_PBUS_BAR1_BLOCK': (0x0, 0x00001704, {'map': (0, 29), 'ptr': (0, 27), 'target': (28, 29), 'mode': (31, 31)}), + 'NV_PBUS_BAR1_BLOCK_PTR_0': 0x00000000, + 'NV_PBUS_BAR1_BLOCK_TARGET_VID_MEM': 0x00000000, + 'NV_PBUS_BAR1_BLOCK_TARGET_SYS_MEM_COHERENT': 0x00000002, + 'NV_PBUS_BAR1_BLOCK_TARGET_SYS_MEM_NONCOHERENT': 0x00000003, + 'NV_PBUS_BAR1_BLOCK_MODE_PHYSICAL': 0x00000000, + 'NV_PBUS_BAR1_BLOCK_MODE_VIRTUAL': 0x00000001, + 'NV_PBUS_BAR1_BLOCK_PTR_SHIFT': 12, + 'NV_PBUS_BAR2_BLOCK': (0x0, 0x00001714, {'map': (0, 29), 'ptr': (0, 27), 'target': (28, 29), 'debug_cya': (30, 30), 'mode': (31, 31), 'reserved': (30, 30)}), + 'NV_PBUS_BAR2_BLOCK_PTR_0': 0x00000000, + 'NV_PBUS_BAR2_BLOCK_TARGET_VID_MEM': 0x00000000, + 'NV_PBUS_BAR2_BLOCK_TARGET_SYS_MEM_COHERENT': 0x00000002, + 'NV_PBUS_BAR2_BLOCK_TARGET_SYS_MEM_NONCOHERENT': 0x00000003, + 'NV_PBUS_BAR2_BLOCK_DEBUG_CYA_OFF': 0x00000001, + 'NV_PBUS_BAR2_BLOCK_DEBUG_CYA_ON': 0x00000000, + 'NV_PBUS_BAR2_BLOCK_DEBUG_CYA_INIT': 0x00000001, + 'NV_PBUS_BAR2_BLOCK_MODE_PHYSICAL': 0x00000000, + 'NV_PBUS_BAR2_BLOCK_MODE_VIRTUAL': 0x00000001, + 'NV_PBUS_BAR2_BLOCK_PTR_SHIFT': 12, + 'NV_PBUS_BAR2_BLOCK_RESERVED_DEFAULT': 0x00000001, + 'NV_PBUS_BIND_STATUS_BAR1_PENDING_EMPTY': (0x0, 0x00000000, {}), + 'NV_PBUS_BIND_STATUS_BAR1_PENDING_BUSY': (0x0, 0x00000001, {}), + 'NV_PBUS_BIND_STATUS_BAR1_OUTSTANDING_FALSE': (0x0, 0x00000000, {}), + 'NV_PBUS_BIND_STATUS_BAR1_OUTSTANDING_TRUE': (0x0, 0x00000001, {}), + 'NV_PBUS_BIND_STATUS_BAR2_PENDING_EMPTY': (0x0, 0x00000000, {}), + 'NV_PBUS_BIND_STATUS_BAR2_PENDING_BUSY': (0x0, 0x00000001, {}), + 'NV_PBUS_BIND_STATUS_BAR2_OUTSTANDING_FALSE': (0x0, 0x00000000, {}), + 'NV_PBUS_BIND_STATUS_BAR2_OUTSTANDING_TRUE': (0x0, 0x00000001, {}), +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_falcon_second_pri.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_falcon_second_pri.py new file mode 100644 index 000000000..63a2c9615 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_falcon_second_pri.py @@ -0,0 +1,10 @@ +ga102 = { + 'NV_FALCON2_GSP_BASE': 0x00111000, + 'NV_FALCON2_NVDEC0_BASE': 0x00849c00, + 'NV_FALCON2_SEC_BASE': 0x00841000, + 'NV_PFALCON2_FALCON_MOD_SEL': (0x1000, 0x00000180, {'algo': (0, 7)}), + 'NV_PFALCON2_FALCON_MOD_SEL_ALGO_RSA3K': 0x00000001, + 'NV_PFALCON2_FALCON_BROM_CURR_UCODE_ID': (0x1000, 0x00000198, {'val': (0, 7)}), + 'NV_PFALCON2_FALCON_BROM_ENGIDMASK': (0x1000, 0x0000019c, {}), + 'NV_PFALCON2_FALCON_BROM_PARAADDR': (0x1000, lambda i: (0x00000210+(i)*4), {}), +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_falcon_v4.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_falcon_v4.py new file mode 100644 index 000000000..26189ef6b --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_falcon_v4.py @@ -0,0 +1,113 @@ +ga102 = { + 'NV_PFALCON_FALCON_IRQSCLR': (0x0, 0x00000004, {'halt': (4, 4), 'swgen0': (6, 6)}), + 'NV_PFALCON_FALCON_IRQSCLR_HALT_SET': 0x00000001, + 'NV_PFALCON_FALCON_IRQSCLR_SWGEN0_SET': 0x00000001, + 'NV_PFALCON_FALCON_IRQSTAT': (0x0, 0x00000008, {'halt': (4, 4), 'swgen0': (6, 6)}), + 'NV_PFALCON_FALCON_IRQSTAT_HALT_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_IRQSTAT_SWGEN0_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_INTR_RETRIGGER': (0x0, lambda i: (0x000003e8+(i)*4), {'trigger': (0, 0)}), + 'NV_PFALCON_FALCON_INTR_RETRIGGER__SIZE_1': 2, + 'NV_PFALCON_FALCON_INTR_RETRIGGER_TRIGGER_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_IRQMSET': (0x0, 0x00000010, {}), + 'NV_PFALCON_FALCON_IRQMCLR': (0x0, 0x00000014, {}), + 'NV_PFALCON_FALCON_IRQMASK': (0x0, 0x00000018, {}), + 'NV_PFALCON_FALCON_IRQDEST': (0x0, 0x0000001c, {}), + 'NV_PFALCON_FALCON_MAILBOX0': (0x0, 0x00000040, {}), + 'NV_PFALCON_FALCON_MAILBOX1': (0x0, 0x00000044, {}), + 'NV_PFALCON_FALCON_DMACTL': (0x0, 0x0000010c, {'require_ctx': (0, 0), 'dmem_scrubbing': (1, 1), 'imem_scrubbing': (2, 2)}), + 'NV_PFALCON_FALCON_DMACTL_REQUIRE_CTX_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_DMACTL_DMEM_SCRUBBING_DONE': 0x00000000, + 'NV_PFALCON_FALCON_DMACTL_IMEM_SCRUBBING_DONE': 0x00000000, + 'NV_PFALCON_FALCON_DMATRFBASE': (0x0, 0x00000110, {'base': (0, 31)}), + 'NV_PFALCON_FALCON_DMATRFMOFFS': (0x0, 0x00000114, {'offs': (0, 23)}), + 'NV_PFALCON_FALCON_DMATRFCMD': (0x0, 0x00000118, {'full': (0, 0), 'idle': (1, 1), 'sec': (2, 3), 'imem': (4, 4), 'write': (5, 5), 'size': (8, 10), 'ctxdma': (12, 14), 'set_dmtag': (16, 16)}), + 'NV_PFALCON_FALCON_DMATRFCMD_FULL_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_DMATRFCMD_FULL_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_DMATRFCMD_IDLE_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_DMATRFCMD_IDLE_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_DMATRFCMD_IMEM_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_DMATRFCMD_IMEM_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_DMATRFCMD_WRITE_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_DMATRFCMD_WRITE_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_DMATRFCMD_SIZE_256B': 0x00000006, + 'NV_PFALCON_FALCON_DMATRFCMD_SET_DMTAG_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_DMATRFFBOFFS': (0x0, 0x0000011c, {'offs': (0, 31)}), + 'NV_PFALCON_FALCON_DMATRFBASE1': (0x0, 0x00000128, {'base': (0, 8)}), + 'NV_PFALCON_FALCON_IMEMC': (0x0, lambda i: (0x00000180+(i)*16), {'offs': (2, 7), 'blk': (8, 23), 'aincw': (24, 24), 'secure': (28, 28)}), + 'NV_PFALCON_FALCON_IMEMC_AINCW_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_IMEMC_AINCW_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_IMEMD': (0x0, lambda i: (0x00000184+(i)*16), {'data': (0, 31)}), + 'NV_PFALCON_FALCON_IMEMT': (0x0, lambda i: (0x00000188+(i)*16), {'tag': (0, 15)}), + 'NV_PFALCON_FALCON_DMEMC': (0x0, lambda i: (0x000001c0+(i)*8), {'offs': (2, 7), 'blk': (8, 23), 'aincw': (24, 24)}), + 'NV_PFALCON_FALCON_DMEMC_AINCW_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_DMEMC_AINCW_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_DMEMD': (0x0, lambda i: (0x000001c4+(i)*8), {'data': (0, 31)}), + 'NV_PFALCON_FALCON_HWCFG': (0x0, 0x00000108, {'imem_size': (0, 8)}), + 'NV_PFALCON_FALCON_HWCFG2': (0x0, 0x000000f4, {'riscv': (10, 10), 'mem_scrubbing': (12, 12), 'reset_ready': (31, 31)}), + 'NV_PFALCON_FALCON_HWCFG2_RISCV_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_MEM_SCRUBBING_DONE': 0x00000000, + 'NV_PFALCON_FALCON_OS': (0x0, 0x00000080, {}), + 'NV_PFALCON_FALCON_RM': (0x0, 0x00000084, {}), + 'NV_PFALCON_FALCON_DEBUGINFO': (0x0, 0x00000094, {}), + 'NV_PFALCON_FALCON_CPUCTL': (0x0, 0x00000100, {'startcpu': (1, 1), 'halted': (4, 4), 'alias_en': (6, 6), 'alias_startcpu': (1, 1)}), + 'NV_PFALCON_FALCON_CPUCTL_STARTCPU_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_CPUCTL_STARTCPU_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_CPUCTL_HALTED_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_CPUCTL_ALIAS_EN_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_CPUCTL_ALIAS_EN_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_CPUCTL_ALIAS': 0x00000130, + 'NV_PFALCON_FALCON_CPUCTL_ALIAS_STARTCPU_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_CPUCTL_ALIAS_STARTCPU_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_BOOTVEC': (0x0, 0x00000104, {}), + 'NV_PFALCON_FALCON_HWCFG2_RESET_READY_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_RESET_READY_FALSE': 0x00000000, +} +gh100 = { + 'NV_PFALCON_FALCON_MAILBOX0': (0x0, 0x00000040, {'data': (0, 31)}), + 'NV_PFALCON_FALCON_MAILBOX0_DATA_INIT': 0x00000000, + 'NV_PFALCON_FALCON_MAILBOX1': (0x0, 0x00000044, {'data': (0, 31)}), + 'NV_PFALCON_FALCON_MAILBOX1_DATA_INIT': 0x00000000, + 'NV_PFALCON_FALCON_OS': (0x0, 0x00000080, {'version': (0, 31)}), + 'NV_PFALCON_FALCON_OS__DEVICE_MAP': 0x00000013, + 'NV_PFALCON_FALCON_OS_VERSION_INIT': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2': (0x0, 0x000000f4, {'sha': (0, 0), 'bmem': (1, 1), 'pkcboot': (2, 2), 'dbgmode': (3, 3), 'kmem': (4, 4), 'hscode_revocation': (5, 5), 'strap_fun': (6, 6), 'vhr': (7, 7), 'hs': (8, 8), 'securebus': (9, 9), 'riscv': (10, 10), 'riscv_pl3_disable': (11, 11), 'mem_scrubbing': (12, 12), 'riscv_br_priv_lockdown': (13, 13), 'boot_from_hs': (14, 14), 'riscv_br_adpair': (15, 15), 'scp': (16, 16), 'gdma': (17, 17), 'se_lite': (18, 18), 'prgn_rsvd_fuse': (24, 31)}), + 'NV_PFALCON_FALCON_HWCFG2_SHA_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_SHA_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_BMEM_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_BMEM_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_PKCBOOT_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_PKCBOOT_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_DBGMODE_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_DBGMODE_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_KMEM_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_KMEM_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_HSCODE_REVOCATION_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_HSCODE_REVOCATION_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_STRAP_FUN_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_STRAP_FUN_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_VHR_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_VHR_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_HS_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_HS_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_SECUREBUS_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_SECUREBUS_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_RISCV_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_RISCV_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_RISCV_PL3_DISABLE_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_RISCV_PL3_DISABLE_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_MEM_SCRUBBING_PENDING': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_MEM_SCRUBBING_DONE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_RISCV_BR_PRIV_LOCKDOWN_LOCK': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_RISCV_BR_PRIV_LOCKDOWN_UNLOCK': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_BOOT_FROM_HS_TRUE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_BOOT_FROM_HS_FALSE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_RISCV_BR_ADPAIR_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_RISCV_BR_ADPAIR_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_SCP_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_SCP_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_GDMA_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_GDMA_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_SE_LITE_ENABLE': 0x00000001, + 'NV_PFALCON_FALCON_HWCFG2_SE_LITE_DISABLE': 0x00000000, + 'NV_PFALCON_FALCON_HWCFG2_PRGN_RSVD_FUSE_DEFAULT': 0x00000000, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fb.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fb.py new file mode 100644 index 000000000..a0b0e27cb --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fb.py @@ -0,0 +1,27 @@ +tu102 = { + 'NV_PFB_NISO_ACCESS_COUNTER_NOTIFY_BUFFER_INFO': (0x0, 0x00100A18, {'full': (0, 0)}), + 'NV_PFB_NISO_ACCESS_COUNTER_NOTIFY_BUFFER_INFO_FULL_FALSE': 0x0, + 'NV_PFB_NISO_ACCESS_COUNTER_NOTIFY_BUFFER_INFO_FULL_TRUE': 0x1, + 'NV_PFB_PRI_MMU_INT_VECTOR_FAULT_NOTIFY_REPLAYABLE': (0x0, 64, {}), + 'NV_PFB_PRI_MMU_INT_VECTOR_FAULT_NOTIFY_NON_REPLAYABLE': (0x0, 132, {}), + 'NV_PFB_PRI_MMU_WPR2_ADDR_LO': (0x0, 0x001FA824, {'val': (4, 31)}), + 'NV_PFB_PRI_MMU_WPR2_ADDR_LO_ALIGNMENT': 0x0000000c, + 'NV_PFB_PRI_MMU_WPR2_ADDR_HI': (0x0, 0x001FA828, {'val': (4, 31)}), + 'NV_PFB_PRI_MMU_WPR2_ADDR_HI_ALIGNMENT': 0x0000000c, + 'NV_PFB_PRI_MMU_FAULT_BUFFER_SIZE_VAL_RESET': (0x0, 0x00000000, {}), + 'NV_PFB_PRI_MMU_FAULT_BUFFER_SIZE_OVERFLOW_INTR_DISABLE': (0x0, 0x00000000, {}), + 'NV_PFB_PRI_MMU_FAULT_BUFFER_SIZE_OVERFLOW_INTR_ENABLE': (0x0, 0x00000001, {}), + 'NV_PFB_PRI_MMU_FAULT_BUFFER_SIZE_SET_DEFAULT_NO': (0x0, 0x00000000, {}), + 'NV_PFB_PRI_MMU_FAULT_BUFFER_SIZE_SET_DEFAULT_YES': (0x0, 0x00000001, {}), + 'NV_PFB_PRI_MMU_FAULT_BUFFER_SIZE_ENABLE_FALSE': (0x0, 0x00000000, {}), + 'NV_PFB_PRI_MMU_FAULT_BUFFER_SIZE_ENABLE_TRUE': (0x0, 0x00000001, {}), + 'NV_PFB_PRI_MMU_L2TLB_ECC_UNCORRECTED_ERR_COUNT': (0x0, 0x00100E78, {'total': (0, 15), 'unique': (16, 31)}), + 'NV_PFB_PRI_MMU_L2TLB_ECC_UNCORRECTED_ERR_COUNT_TOTAL_INIT': 0, + 'NV_PFB_PRI_MMU_L2TLB_ECC_UNCORRECTED_ERR_COUNT_UNIQUE_INIT': 0, + 'NV_PFB_PRI_MMU_HUBTLB_ECC_UNCORRECTED_ERR_COUNT': (0x0, 0x00100E8C, {'total': (0, 15), 'unique': (16, 31)}), + 'NV_PFB_PRI_MMU_HUBTLB_ECC_UNCORRECTED_ERR_COUNT_TOTAL_INIT': 0, + 'NV_PFB_PRI_MMU_HUBTLB_ECC_UNCORRECTED_ERR_COUNT_UNIQUE_INIT': 0, + 'NV_PFB_PRI_MMU_FILLUNIT_ECC_UNCORRECTED_ERR_COUNT': (0x0, 0x00100EA0, {'total': (0, 15), 'unique': (16, 31)}), + 'NV_PFB_PRI_MMU_FILLUNIT_ECC_UNCORRECTED_ERR_COUNT_TOTAL_INIT': 0, + 'NV_PFB_PRI_MMU_FILLUNIT_ECC_UNCORRECTED_ERR_COUNT_UNIQUE_INIT': 0, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fbif_v4.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fbif_v4.py new file mode 100644 index 000000000..bb4514e04 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fbif_v4.py @@ -0,0 +1,8 @@ +ga102 = { + 'NV_PFALCON_FBIF_TRANSCFG': (0x600, lambda i: (0x00000000+(i)*4), {'target': (0, 1), 'mem_type': (2, 2)}), + 'NV_PFALCON_FBIF_TRANSCFG__SIZE_1': 8, + 'NV_PFALCON_FBIF_TRANSCFG_TARGET_COHERENT_SYSMEM': 0x00000001, + 'NV_PFALCON_FBIF_TRANSCFG_MEM_TYPE_PHYSICAL': 0x00000001, + 'NV_PFALCON_FBIF_CTL': (0x600, 0x00000024, {'allow_phys_no_ctx': (7, 7)}), + 'NV_PFALCON_FBIF_CTL_ALLOW_PHYS_NO_CTX_ALLOW': 0x00000001, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fsp_pri.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fsp_pri.py new file mode 100644 index 000000000..2ac834dfc --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_fsp_pri.py @@ -0,0 +1,33 @@ +gh100 = { + 'NV_PFSP_EMEMC': (0x0, lambda i: (0x008F2ac0+(i)*8), {'offs': (2, 7), 'blk': (8, 15), 'aincw': (24, 24), 'aincr': (25, 25)}), + 'NV_PFSP_EMEMC__SIZE_1': 8, + 'NV_PFSP_EMEMC_OFFS_INIT': 0x00000000, + 'NV_PFSP_EMEMC_BLK_INIT': 0x00000000, + 'NV_PFSP_EMEMC_AINCW_INIT': 0x00000000, + 'NV_PFSP_EMEMC_AINCW_TRUE': 0x00000001, + 'NV_PFSP_EMEMC_AINCW_FALSE': 0x00000000, + 'NV_PFSP_EMEMC_AINCR_INIT': 0x00000000, + 'NV_PFSP_EMEMC_AINCR_TRUE': 0x00000001, + 'NV_PFSP_EMEMC_AINCR_FALSE': 0x00000000, + 'NV_PFSP_EMEMD': (0x0, lambda i: (0x008F2ac4+(i)*8), {'data': (0, 31)}), + 'NV_PFSP_EMEMD__SIZE_1': 8, + 'NV_PFSP_MSGQ_HEAD': (0x0, lambda i: (0x008F2c80+(i)*8), {'val': (0, 31)}), + 'NV_PFSP_MSGQ_HEAD__SIZE_1': 8, + 'NV_PFSP_MSGQ_HEAD_VAL_INIT': 0x00000000, + 'NV_PFSP_MSGQ_TAIL': (0x0, lambda i: (0x008F2c84+(i)*8), {'val': (0, 31)}), + 'NV_PFSP_MSGQ_TAIL__SIZE_1': 8, + 'NV_PFSP_MSGQ_TAIL_VAL_INIT': 0x00000000, + 'NV_PFSP_QUEUE_HEAD': (0x0, lambda i: (0x008F2c00+(i)*8), {'address': (0, 31)}), + 'NV_PFSP_QUEUE_HEAD__SIZE_1': 8, + 'NV_PFSP_QUEUE_HEAD_ADDRESS_INIT': 0x00000000, + 'NV_PFSP_QUEUE_TAIL': (0x0, lambda i: (0x008F2c04+(i)*8), {'address': (0, 31)}), + 'NV_PFSP_QUEUE_TAIL__SIZE_1': 8, + 'NV_PFSP_QUEUE_TAIL_ADDRESS_INIT': 0x00000000, + 'NV_PFSP_FALCON_COMMON_SCRATCH_GROUP_2': (0x0, lambda i: (0x008f0320+(i)*4), {'val': (0, 31)}), + 'NV_PFSP_FALCON_COMMON_SCRATCH_GROUP_2__SIZE_1': 4, + 'NV_PFSP_FALCON_COMMON_SCRATCH_GROUP_2__DEVICE_MAP': 0x00000016, + 'NV_PFSP_FALCON_COMMON_SCRATCH_GROUP_2_VAL_INIT': 0x00000000, + 'NV_PFSP_FALCON_COMMON_SCRATCH_GROUP_3': (0x0, lambda i: (0x008f0330+(i)*4), {'val': (0, 31)}), + 'NV_PFSP_FALCON_COMMON_SCRATCH_GROUP_3__SIZE_1': 4, + 'NV_PFSP_FALCON_COMMON_SCRATCH_GROUP_3_VAL_INIT': 0x00000000, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_gc6_island.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_gc6_island.py new file mode 100644 index 000000000..7d7cf8f00 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_gc6_island.py @@ -0,0 +1,14 @@ +ga102 = { + 'NV_PGC6_AON_SECURE_SCRATCH_GROUP_05_PRIV_LEVEL_MASK': (0x0, 0x00118128, {'read_protection': (0, 3), 'read_protection_level0': (0, 0)}), + 'NV_PGC6_AON_SECURE_SCRATCH_GROUP_05_PRIV_LEVEL_MASK_READ_PROTECTION_LEVEL0_ENABLE': 0x00000001, + 'NV_PGC6_AON_SECURE_SCRATCH_GROUP_05_PRIV_LEVEL_MASK_READ_PROTECTION_LEVEL0_DISABLE': 0x00000000, + 'NV_PGC6_AON_SECURE_SCRATCH_GROUP_03': (0x0, lambda i: (0x00118214+(i)*4), {}), + 'NV_PGC6_AON_SECURE_SCRATCH_GROUP_05': (0x0, lambda i: (0x00118234+(i)*4), {'priv_level_mask_read_protection': (0, 3), 'priv_level_mask_read_protection_level0': (0, 0), '0_gfw_boot_progress': (0, 7)}), + 'NV_PGC6_AON_SECURE_SCRATCH_GROUP_42': (0x0, 0x001183a4, {}), + 'NV_PGC6_BSI_SECURE_SCRATCH_14': (0x0, 0x001180f8, {'boot_stage_3_handoff': (26, 26)}), + 'NV_PGC6_AON_FRTS_INPUT_WPR_SIZE_SECURE_SCRATCH_GROUP_03_0_WPR_SIZE_1MB_IN_4K': (0x0, 0x100, {}), + 'NV_PGC6_AON_SECURE_SCRATCH_GROUP_05_0_GFW_BOOT_PROGRESS_COMPLETED': 0x000000FF, + 'NV_USABLE_FB_SIZE_IN_MB_VALUE_INIT': 0, + 'NV_PGC6_BSI_SECURE_SCRATCH_14_BOOT_STAGE_3_HANDOFF_VALUE_INIT': 0x0, + 'NV_PGC6_BSI_SECURE_SCRATCH_14_BOOT_STAGE_3_HANDOFF_VALUE_DONE': 0x1, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_gsp.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_gsp.py new file mode 100644 index 000000000..2e65e8323 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_gsp.py @@ -0,0 +1,10 @@ +ga102 = { + 'NV_PGSP_FALCON_MAILBOX0': (0x0, 0x110040, {'data': (0, 31)}), + 'NV_PGSP_FALCON_MAILBOX1': (0x0, 0x110044, {'data': (0, 31)}), + 'NV_PGSP_FALCON_ENGINE': (0x0, 0x1103c0, {'reset': (0, 0)}), + 'NV_PGSP_FALCON_ENGINE_RESET_TRUE': 0x00000001, + 'NV_PGSP_FALCON_ENGINE_RESET_FALSE': 0x00000000, + 'NV_PGSP_MAILBOX__SIZE_1': 4, + 'NV_PGSP_QUEUE_HEAD': (0x0, lambda i: (0x110c00+(i)*8), {'address': (0, 31)}), + 'NV_PGSP_QUEUE_HEAD__SIZE_1': 8, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_mmu.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_mmu.py new file mode 100644 index 000000000..427552711 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_mmu.py @@ -0,0 +1,895 @@ +tu102 = { + 'NV_MMU_PDE': (None, None, {'aperture_big': ((0*32+0), (0*32+1)), 'size': ((0*32+2), (0*32+3)), 'address_big_sys': ((0*32+4), (0*32+31)), 'address_big_vid': ((0*32+4), (0*32+31-3)), 'address_big_vid_peer': ((0*32+32-3), (0*32+31)), 'aperture_small': ((1*32+0), (1*32+1)), 'vol_small': ((1*32+2), (1*32+2)), 'vol_big': ((1*32+3), (1*32+3)), 'address_small_sys': ((1*32+4), (1*32+31)), 'address_small_vid': ((1*32+4), (1*32+31-3)), 'address_small_vid_peer': ((1*32+32-3), (1*32+31))}), + 'NV_MMU_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_PDE_SIZE_FULL': 0x00000000, + 'NV_MMU_PDE_SIZE_HALF': 0x00000001, + 'NV_MMU_PDE_SIZE_QUARTER': 0x00000002, + 'NV_MMU_PDE_SIZE_EIGHTH': 0x00000003, + 'NV_MMU_PDE_ADDRESS_BIG_VID_PEER_0': 0x00000000, + 'NV_MMU_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_PDE_VOL_SMALL_TRUE': 0x00000001, + 'NV_MMU_PDE_VOL_SMALL_FALSE': 0x00000000, + 'NV_MMU_PDE_VOL_BIG_TRUE': 0x00000001, + 'NV_MMU_PDE_VOL_BIG_FALSE': 0x00000000, + 'NV_MMU_PDE_ADDRESS_SMALL_VID_PEER_0': 0x00000000, + 'NV_MMU_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_PDE__SIZE': 8, + 'NV_MMU_PTE': (None, None, {'valid': ((0*32+0), (0*32+0)), 'privilege': ((0*32+1), (0*32+1)), 'read_only': ((0*32+2), (0*32+2)), 'encrypted': ((0*32+3), (0*32+3)), 'address_sys': ((0*32+4), (0*32+31)), 'address_vid': ((0*32+4), (0*32+31-3)), 'address_vid_peer': ((0*32+32-3), (0*32+31)), 'vol': ((1*32+0), (1*32+0)), 'aperture': ((1*32+1), (1*32+2)), 'lock': ((1*32+3), (1*32+3)), 'atomic_disable': ((1*32+3), (1*32+3)), 'comptagline': ((1*32+12), (1*32+20+11)), 'read_disable': ((1*32+30), (1*32+30)), 'write_disable': ((1*32+31), (1*32+31)), 'kind': ((1*32+4), (1*32+11))}), + 'NV_MMU_PTE_VALID_TRUE': 0x1, + 'NV_MMU_PTE_VALID_FALSE': 0x0, + 'NV_MMU_PTE_PRIVILEGE_TRUE': 0x1, + 'NV_MMU_PTE_PRIVILEGE_FALSE': 0x0, + 'NV_MMU_PTE_READ_ONLY_TRUE': 0x1, + 'NV_MMU_PTE_READ_ONLY_FALSE': 0x0, + 'NV_MMU_PTE_ENCRYPTED_TRUE': 0x00000001, + 'NV_MMU_PTE_ENCRYPTED_FALSE': 0x00000000, + 'NV_MMU_PTE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_PTE_ADDRESS_VID_PEER_1': 0x00000001, + 'NV_MMU_PTE_ADDRESS_VID_PEER_2': 0x00000002, + 'NV_MMU_PTE_ADDRESS_VID_PEER_3': 0x00000003, + 'NV_MMU_PTE_ADDRESS_VID_PEER_4': 0x00000004, + 'NV_MMU_PTE_ADDRESS_VID_PEER_5': 0x00000005, + 'NV_MMU_PTE_ADDRESS_VID_PEER_6': 0x00000006, + 'NV_MMU_PTE_ADDRESS_VID_PEER_7': 0x00000007, + 'NV_MMU_PTE_VOL_TRUE': 0x00000001, + 'NV_MMU_PTE_VOL_FALSE': 0x00000000, + 'NV_MMU_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_PTE_LOCK_TRUE': 0x1, + 'NV_MMU_PTE_LOCK_FALSE': 0x0, + 'NV_MMU_PTE_ATOMIC_DISABLE_TRUE': 0x1, + 'NV_MMU_PTE_ATOMIC_DISABLE_FALSE': 0x0, + 'NV_MMU_PTE_READ_DISABLE_TRUE': 0x1, + 'NV_MMU_PTE_READ_DISABLE_FALSE': 0x0, + 'NV_MMU_PTE_WRITE_DISABLE_TRUE': 0x1, + 'NV_MMU_PTE_WRITE_DISABLE_FALSE': 0x0, + 'NV_MMU_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_PTE__SIZE': 8, + 'NV_MMU_PTE_COMPTAGS_NONE': 0x0, + 'NV_MMU_PTE_COMPTAGS_1': 0x1, + 'NV_MMU_PTE_COMPTAGS_2': 0x2, + 'NV_MMU_PTE_KIND_INVALID': 0x07, + 'NV_MMU_PTE_KIND_PITCH': 0x00, + 'NV_MMU_PTE_KIND_GENERIC_MEMORY': 0x06, + 'NV_MMU_PTE_KIND_Z16': 0x01, + 'NV_MMU_PTE_KIND_S8': 0x02, + 'NV_MMU_PTE_KIND_S8Z24': 0x03, + 'NV_MMU_PTE_KIND_ZF32_X24S8': 0x04, + 'NV_MMU_PTE_KIND_Z24S8': 0x05, + 'NV_MMU_PTE_KIND_GENERIC_MEMORY_COMPRESSIBLE': 0x08, + 'NV_MMU_PTE_KIND_GENERIC_MEMORY_COMPRESSIBLE_DISABLE_PLC': 0x09, + 'NV_MMU_PTE_KIND_S8_COMPRESSIBLE_DISABLE_PLC': 0x0A, + 'NV_MMU_PTE_KIND_Z16_COMPRESSIBLE_DISABLE_PLC': 0x0B, + 'NV_MMU_PTE_KIND_S8Z24_COMPRESSIBLE_DISABLE_PLC': 0x0C, + 'NV_MMU_PTE_KIND_ZF32_X24S8_COMPRESSIBLE_DISABLE_PLC': 0x0D, + 'NV_MMU_PTE_KIND_Z24S8_COMPRESSIBLE_DISABLE_PLC': 0x0E, + 'NV_MMU_PTE_KIND_SMSKED_MESSAGE': 0x0F, + 'NV_MMU_PTE_KIND_Z16_2C': 0x2a, + 'NV_MMU_PTE_KIND_Z16_MS2_2C': 0x11, + 'NV_MMU_PTE_KIND_Z16_MS4_2C': 0xC3, + 'NV_MMU_PTE_KIND_Z16_MS8_2C': 0x46, + 'NV_MMU_PTE_KIND_Z16_MS16_2C': 0x6c, + 'NV_MMU_PTE_KIND_Z16_2Z': 0x6b, + 'NV_MMU_PTE_KIND_Z16_MS2_2Z': 0x10, + 'NV_MMU_PTE_KIND_Z16_MS4_2Z': 0x60, + 'NV_MMU_PTE_KIND_Z16_MS8_2Z': 0x61, + 'NV_MMU_PTE_KIND_Z16_MS16_2Z': 0x62, + 'NV_MMU_PTE_KIND_Z16_2CZ': 0x36, + 'NV_MMU_PTE_KIND_Z16_MS2_2CZ': 0x37, + 'NV_MMU_PTE_KIND_Z16_MS4_2CZ': 0x38, + 'NV_MMU_PTE_KIND_Z16_MS8_2CZ': 0x39, + 'NV_MMU_PTE_KIND_Z16_MS16_2CZ': 0x5f, + 'NV_MMU_PTE_KIND_S8Z24_1Z': 0x12, + 'NV_MMU_PTE_KIND_S8Z24_MS2_1Z': 0x13, + 'NV_MMU_PTE_KIND_S8Z24_MS4_1Z': 0x14, + 'NV_MMU_PTE_KIND_S8Z24_MS8_1Z': 0x15, + 'NV_MMU_PTE_KIND_S8Z24_MS16_1Z': 0x16, + 'NV_MMU_PTE_KIND_S8Z24_2CZ': 0x17, + 'NV_MMU_PTE_KIND_S8Z24_MS2_2CZ': 0x18, + 'NV_MMU_PTE_KIND_S8Z24_MS4_2CZ': 0x19, + 'NV_MMU_PTE_KIND_S8Z24_MS8_2CZ': 0x1a, + 'NV_MMU_PTE_KIND_S8Z24_MS16_2CZ': 0x1b, + 'NV_MMU_PTE_KIND_S8Z24_2CS': 0x1c, + 'NV_MMU_PTE_KIND_S8Z24_MS2_2CS': 0x1d, + 'NV_MMU_PTE_KIND_S8Z24_MS4_2CS': 0x1e, + 'NV_MMU_PTE_KIND_S8Z24_MS8_2CS': 0x1f, + 'NV_MMU_PTE_KIND_S8Z24_MS16_2CS': 0x20, + 'NV_MMU_PTE_KIND_S8Z24_4CSZV': 0x21, + 'NV_MMU_PTE_KIND_S8Z24_MS2_4CSZV': 0x22, + 'NV_MMU_PTE_KIND_S8Z24_MS4_4CSZV': 0x23, + 'NV_MMU_PTE_KIND_S8Z24_MS8_4CSZV': 0x24, + 'NV_MMU_PTE_KIND_S8Z24_MS16_4CSZV': 0x25, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC12': 0x26, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC4': 0x27, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC8': 0x28, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC24': 0x29, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC12_1ZV': 0x2e, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC4_1ZV': 0x2f, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC8_1ZV': 0x30, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC24_1ZV': 0x31, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC12_2CS': 0x32, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC4_2CS': 0x33, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC8_2CS': 0x34, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC24_2CS': 0x35, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC12_2CZV': 0x3a, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC4_2CZV': 0x3b, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC8_2CZV': 0x3c, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC24_2CZV': 0x3d, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC12_2ZV': 0x3e, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC4_2ZV': 0x3f, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC8_2ZV': 0x40, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC24_2ZV': 0x41, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC12_4CSZV': 0x42, + 'NV_MMU_PTE_KIND_V8Z24_MS4_VC4_4CSZV': 0x43, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC8_4CSZV': 0x44, + 'NV_MMU_PTE_KIND_V8Z24_MS8_VC24_4CSZV': 0x45, + 'NV_MMU_PTE_KIND_Z24S8_1Z': 0x47, + 'NV_MMU_PTE_KIND_Z24S8_MS2_1Z': 0x48, + 'NV_MMU_PTE_KIND_Z24S8_MS4_1Z': 0x49, + 'NV_MMU_PTE_KIND_Z24S8_MS8_1Z': 0x4a, + 'NV_MMU_PTE_KIND_Z24S8_MS16_1Z': 0x4b, + 'NV_MMU_PTE_KIND_Z24S8_2CS': 0x4c, + 'NV_MMU_PTE_KIND_Z24S8_MS2_2CS': 0x4d, + 'NV_MMU_PTE_KIND_Z24S8_MS4_2CS': 0x4e, + 'NV_MMU_PTE_KIND_Z24S8_MS8_2CS': 0x4f, + 'NV_MMU_PTE_KIND_Z24S8_MS16_2CS': 0x50, + 'NV_MMU_PTE_KIND_Z24S8_2CZ': 0x51, + 'NV_MMU_PTE_KIND_Z24S8_MS2_2CZ': 0x52, + 'NV_MMU_PTE_KIND_Z24S8_MS4_2CZ': 0x53, + 'NV_MMU_PTE_KIND_Z24S8_MS8_2CZ': 0x54, + 'NV_MMU_PTE_KIND_Z24S8_MS16_2CZ': 0x55, + 'NV_MMU_PTE_KIND_Z24S8_4CSZV': 0x56, + 'NV_MMU_PTE_KIND_Z24S8_MS2_4CSZV': 0x57, + 'NV_MMU_PTE_KIND_Z24S8_MS4_4CSZV': 0x58, + 'NV_MMU_PTE_KIND_Z24S8_MS8_4CSZV': 0x59, + 'NV_MMU_PTE_KIND_Z24S8_MS16_4CSZV': 0x5a, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC12': 0x5b, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC4': 0x5c, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC8': 0x5d, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC24': 0x5e, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC12_1ZV': 0x63, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC4_1ZV': 0x64, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC8_1ZV': 0x65, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC24_1ZV': 0x66, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC12_2CS': 0x67, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC4_2CS': 0x68, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC8_2CS': 0x69, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC24_2CS': 0x6a, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC12_2CZV': 0x6f, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC4_2CZV': 0x70, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC8_2CZV': 0x71, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC24_2CZV': 0x72, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC12_2ZV': 0x73, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC4_2ZV': 0x74, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC8_2ZV': 0x75, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC24_2ZV': 0x76, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC12_4CSZV': 0x77, + 'NV_MMU_PTE_KIND_Z24V8_MS4_VC4_4CSZV': 0x78, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC8_4CSZV': 0x79, + 'NV_MMU_PTE_KIND_Z24V8_MS8_VC24_4CSZV': 0x7a, + 'NV_MMU_PTE_KIND_ZF32': 0x7b, + 'NV_MMU_PTE_KIND_ZF32_1Z': 0x7c, + 'NV_MMU_PTE_KIND_ZF32_MS2_1Z': 0x7d, + 'NV_MMU_PTE_KIND_ZF32_MS4_1Z': 0x7e, + 'NV_MMU_PTE_KIND_ZF32_MS8_1Z': 0x7f, + 'NV_MMU_PTE_KIND_ZF32_MS16_1Z': 0x80, + 'NV_MMU_PTE_KIND_ZF32_2CS': 0x81, + 'NV_MMU_PTE_KIND_ZF32_MS2_2CS': 0x82, + 'NV_MMU_PTE_KIND_ZF32_MS4_2CS': 0x83, + 'NV_MMU_PTE_KIND_ZF32_MS8_2CS': 0x84, + 'NV_MMU_PTE_KIND_ZF32_MS16_2CS': 0x85, + 'NV_MMU_PTE_KIND_ZF32_2CZ': 0x86, + 'NV_MMU_PTE_KIND_ZF32_MS2_2CZ': 0x87, + 'NV_MMU_PTE_KIND_ZF32_MS4_2CZ': 0x88, + 'NV_MMU_PTE_KIND_ZF32_MS8_2CZ': 0x89, + 'NV_MMU_PTE_KIND_ZF32_MS16_2CZ': 0x8a, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12': 0x8b, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4': 0x8c, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8': 0x8d, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24': 0x8e, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_1CS': 0x8f, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_1CS': 0x90, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_1CS': 0x91, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_1CS': 0x92, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_1ZV': 0x97, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_1ZV': 0x98, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_1ZV': 0x99, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_1ZV': 0x9a, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_1CZV': 0x9b, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_1CZV': 0x9c, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_1CZV': 0x9d, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_1CZV': 0x9e, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_2CS': 0x9f, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_2CS': 0xa0, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_2CS': 0xa1, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_2CS': 0xa2, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC12_2CSZV': 0xa3, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS4_VC4_2CSZV': 0xa4, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC8_2CSZV': 0xa5, + 'NV_MMU_PTE_KIND_X8Z24_X16V8S8_MS8_VC24_2CSZV': 0xa6, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12': 0xa7, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4': 0xa8, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8': 0xa9, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24': 0xaa, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_1CS': 0xab, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_1CS': 0xac, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_1CS': 0xad, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_1CS': 0xae, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_1ZV': 0xb3, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_1ZV': 0xb4, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_1ZV': 0xb5, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_1ZV': 0xb6, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_1CZV': 0xb7, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_1CZV': 0xb8, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_1CZV': 0xb9, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_1CZV': 0xba, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_2CS': 0xbb, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_2CS': 0xbc, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_2CS': 0xbd, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_2CS': 0xbe, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC12_2CSZV': 0xbf, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS4_VC4_2CSZV': 0xc0, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC8_2CSZV': 0xc1, + 'NV_MMU_PTE_KIND_ZF32_X16V8S8_MS8_VC24_2CSZV': 0xc2, + 'NV_MMU_PTE_KIND_ZF32_X24S8_1CS': 0xc4, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS2_1CS': 0xc5, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS4_1CS': 0xc6, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS8_1CS': 0xc7, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS16_1CS': 0xc8, + 'NV_MMU_PTE_KIND_ZF32_X24S8_2CSZV': 0xce, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS2_2CSZV': 0xcf, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS4_2CSZV': 0xd0, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS8_2CSZV': 0xd1, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS16_2CSZV': 0xd2, + 'NV_MMU_PTE_KIND_ZF32_X24S8_2CS': 0xd3, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS2_2CS': 0xd4, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS4_2CS': 0xd5, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS8_2CS': 0xd6, + 'NV_MMU_PTE_KIND_ZF32_X24S8_MS16_2CS': 0xd7, + 'NV_MMU_PTE_KIND_S8_2S': 0x2b, + 'NV_MMU_PTE_KIND_GENERIC_16BX2': 0xfe, + 'NV_MMU_PTE_KIND_C32_2C': 0xd8, + 'NV_MMU_PTE_KIND_C32_2CBR': 0xd9, + 'NV_MMU_PTE_KIND_C32_2CBA': 0xda, + 'NV_MMU_PTE_KIND_C32_2CRA': 0xdb, + 'NV_MMU_PTE_KIND_C32_2BRA': 0xdc, + 'NV_MMU_PTE_KIND_C32_MS2_2C': 0xdd, + 'NV_MMU_PTE_KIND_C32_MS2_2CBR': 0xde, + 'NV_MMU_PTE_KIND_C32_MS2_4CBRA': 0xcc, + 'NV_MMU_PTE_KIND_C32_MS4_2C': 0xdf, + 'NV_MMU_PTE_KIND_C32_MS4_2CBR': 0xe0, + 'NV_MMU_PTE_KIND_C32_MS4_2CBA': 0xe1, + 'NV_MMU_PTE_KIND_C32_MS4_2CRA': 0xe2, + 'NV_MMU_PTE_KIND_C32_MS4_2BRA': 0xe3, + 'NV_MMU_PTE_KIND_C32_MS4_4CBRA': 0x2c, + 'NV_MMU_PTE_KIND_C32_MS8_MS16_2C': 0xe4, + 'NV_MMU_PTE_KIND_C32_MS8_MS16_2CRA': 0xe5, + 'NV_MMU_PTE_KIND_C64_2C': 0xe6, + 'NV_MMU_PTE_KIND_C64_2CBR': 0xe7, + 'NV_MMU_PTE_KIND_C64_2CBA': 0xe8, + 'NV_MMU_PTE_KIND_C64_2CRA': 0xe9, + 'NV_MMU_PTE_KIND_C64_2BRA': 0xea, + 'NV_MMU_PTE_KIND_C64_MS2_2C': 0xeb, + 'NV_MMU_PTE_KIND_C64_MS2_2CBR': 0xec, + 'NV_MMU_PTE_KIND_C64_MS2_4CBRA': 0xcd, + 'NV_MMU_PTE_KIND_C64_MS4_2C': 0xed, + 'NV_MMU_PTE_KIND_C64_MS4_2CBR': 0xee, + 'NV_MMU_PTE_KIND_C64_MS4_2CBA': 0xef, + 'NV_MMU_PTE_KIND_C64_MS4_2CRA': 0xf0, + 'NV_MMU_PTE_KIND_C64_MS4_2BRA': 0xf1, + 'NV_MMU_PTE_KIND_C64_MS4_4CBRA': 0x2d, + 'NV_MMU_PTE_KIND_C64_MS8_MS16_2C': 0xf2, + 'NV_MMU_PTE_KIND_C64_MS8_MS16_2CRA': 0xf3, + 'NV_MMU_PTE_KIND_C128_2C': 0xf4, + 'NV_MMU_PTE_KIND_C128_2CR': 0xf5, + 'NV_MMU_PTE_KIND_C128_MS2_2C': 0xf6, + 'NV_MMU_PTE_KIND_C128_MS2_2CR': 0xf7, + 'NV_MMU_PTE_KIND_C128_MS4_2C': 0xf8, + 'NV_MMU_PTE_KIND_C128_MS4_2CR': 0xf9, + 'NV_MMU_PTE_KIND_C128_MS8_MS16_2C': 0xfa, + 'NV_MMU_PTE_KIND_C128_MS8_MS16_2CR': 0xfb, + 'NV_MMU_PTE_KIND_X8C24': 0xfc, + 'NV_MMU_PTE_KIND_PITCH_NO_SWIZZLE': 0xfd, + 'NV_MMU_PTE_KIND_SMHOST_MESSAGE': 0xcb, + 'NV_MMU_VER1_PDE': (None, None, {'aperture_big': ((0*32+0), (0*32+1)), 'size': ((0*32+2), (0*32+3)), 'address_big_sys': ((0*32+4), (0*32+31)), 'address_big_vid': ((0*32+4), (0*32+31-3)), 'address_big_vid_peer': ((0*32+32-3), (0*32+31)), 'aperture_small': ((1*32+0), (1*32+1)), 'vol_small': ((1*32+2), (1*32+2)), 'vol_big': ((1*32+3), (1*32+3)), 'address_small_sys': ((1*32+4), (1*32+31)), 'address_small_vid': ((1*32+4), (1*32+31-3)), 'address_small_vid_peer': ((1*32+32-3), (1*32+31))}), + 'NV_MMU_VER1_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_VER1_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER1_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER1_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER1_PDE_SIZE_FULL': 0x00000000, + 'NV_MMU_VER1_PDE_SIZE_HALF': 0x00000001, + 'NV_MMU_VER1_PDE_SIZE_QUARTER': 0x00000002, + 'NV_MMU_VER1_PDE_SIZE_EIGHTH': 0x00000003, + 'NV_MMU_VER1_PDE_ADDRESS_BIG_VID_PEER_0': 0x00000000, + 'NV_MMU_VER1_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_VER1_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER1_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER1_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER1_PDE_VOL_SMALL_TRUE': 0x00000001, + 'NV_MMU_VER1_PDE_VOL_SMALL_FALSE': 0x00000000, + 'NV_MMU_VER1_PDE_VOL_BIG_TRUE': 0x00000001, + 'NV_MMU_VER1_PDE_VOL_BIG_FALSE': 0x00000000, + 'NV_MMU_VER1_PDE_ADDRESS_SMALL_VID_PEER_0': 0x00000000, + 'NV_MMU_VER1_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER1_PDE__SIZE': 8, + 'NV_MMU_VER1_PTE': (None, None, {'valid': ((0*32+0), (0*32+0)), 'privilege': ((0*32+1), (0*32+1)), 'read_only': ((0*32+2), (0*32+2)), 'encrypted': ((0*32+3), (0*32+3)), 'address_sys': ((0*32+4), (0*32+31)), 'address_vid': ((0*32+4), (0*32+31-3)), 'address_vid_peer': ((0*32+32-3), (0*32+31)), 'vol': ((1*32+0), (1*32+0)), 'aperture': ((1*32+1), (1*32+2)), 'atomic_disable': ((1*32+3), (1*32+3)), 'comptagline': ((1*32+12), (1*32+20+11)), 'kind': ((1*32+4), (1*32+11))}), + 'NV_MMU_VER1_PTE_VALID_TRUE': 0x1, + 'NV_MMU_VER1_PTE_VALID_FALSE': 0x0, + 'NV_MMU_VER1_PTE_PRIVILEGE_TRUE': 0x1, + 'NV_MMU_VER1_PTE_PRIVILEGE_FALSE': 0x0, + 'NV_MMU_VER1_PTE_READ_ONLY_TRUE': 0x1, + 'NV_MMU_VER1_PTE_READ_ONLY_FALSE': 0x0, + 'NV_MMU_VER1_PTE_ENCRYPTED_TRUE': 0x00000001, + 'NV_MMU_VER1_PTE_ENCRYPTED_FALSE': 0x00000000, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_1': 0x00000001, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_2': 0x00000002, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_3': 0x00000003, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_4': 0x00000004, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_5': 0x00000005, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_6': 0x00000006, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_7': 0x00000007, + 'NV_MMU_VER1_PTE_VOL_TRUE': 0x00000001, + 'NV_MMU_VER1_PTE_VOL_FALSE': 0x00000000, + 'NV_MMU_VER1_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_VER1_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_VER1_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER1_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER1_PTE_ATOMIC_DISABLE_TRUE': 0x1, + 'NV_MMU_VER1_PTE_ATOMIC_DISABLE_FALSE': 0x0, + 'NV_MMU_VER1_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER1_PTE__SIZE': 8, + 'NV_MMU_VER1_PTE_COMPTAGS_NONE': 0x0, + 'NV_MMU_VER1_PTE_COMPTAGS_1': 0x1, + 'NV_MMU_VER1_PTE_COMPTAGS_2': 0x2, + 'NV_MMU_NEW_PDE': (None, None, {'is_pte': (0, 0), 'is_pde': (0, 0), 'valid': (0, 0), 'aperture': (1, 2), 'vol': (3, 3), 'no_ats': (5, 5), 'address_sys': (8, 53), 'address_vid': (8, (35-3)), 'address_vid_peer': ((36-3), 35)}), + 'NV_MMU_NEW_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_NEW_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_NEW_PDE_IS_PDE_TRUE': 0x0, + 'NV_MMU_NEW_PDE_IS_PDE_FALSE': 0x1, + 'NV_MMU_NEW_PDE_VALID_TRUE': 0x1, + 'NV_MMU_NEW_PDE_VALID_FALSE': 0x0, + 'NV_MMU_NEW_PDE_APERTURE_INVALID': 0x00000000, + 'NV_MMU_NEW_PDE_APERTURE_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_NEW_PDE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_NEW_PDE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_NEW_PDE_VOL_TRUE': 0x00000001, + 'NV_MMU_NEW_PDE_VOL_FALSE': 0x00000000, + 'NV_MMU_NEW_PDE_NO_ATS_TRUE': 0x1, + 'NV_MMU_NEW_PDE_NO_ATS_FALSE': 0x0, + 'NV_MMU_NEW_PDE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_NEW_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_NEW_PDE__SIZE': 8, + 'NV_MMU_NEW_DUAL_PDE': (None, None, {'is_pte': (0, 0), 'is_pde': (0, 0), 'valid': (0, 0), 'aperture_big': (1, 2), 'vol_big': (3, 3), 'no_ats': (5, 5), 'address_big_sys': ((8-4), 53), 'address_big_vid': ((8-4), (35-3)), 'address_big_vid_peer': ((36-3), 35), 'aperture_small': (65, 66), 'vol_small': (67, 67), 'address_small_sys': (72, 117), 'address_small_vid': (72, (99-3)), 'address_small_vid_peer': ((100-3), 99)}), + 'NV_MMU_NEW_DUAL_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_NEW_DUAL_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_NEW_DUAL_PDE_IS_PDE_TRUE': 0x0, + 'NV_MMU_NEW_DUAL_PDE_IS_PDE_FALSE': 0x1, + 'NV_MMU_NEW_DUAL_PDE_VALID_TRUE': 0x1, + 'NV_MMU_NEW_DUAL_PDE_VALID_FALSE': 0x0, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_NEW_DUAL_PDE_VOL_BIG_TRUE': 0x00000001, + 'NV_MMU_NEW_DUAL_PDE_VOL_BIG_FALSE': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_NO_ATS_TRUE': 0x1, + 'NV_MMU_NEW_DUAL_PDE_NO_ATS_FALSE': 0x0, + 'NV_MMU_NEW_DUAL_PDE_ADDRESS_BIG_VID_PEER_0': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_NEW_DUAL_PDE_VOL_SMALL_TRUE': 0x00000001, + 'NV_MMU_NEW_DUAL_PDE_VOL_SMALL_FALSE': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_ADDRESS_SMALL_VID_PEER_0': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_NEW_DUAL_PDE_ADDRESS_BIG_SHIFT': 8, + 'NV_MMU_NEW_DUAL_PDE__SIZE': 16, + 'NV_MMU_NEW_PTE': (None, None, {'valid': (0, 0), 'aperture': (1, 2), 'vol': (3, 3), 'encrypted': (4, 4), 'privilege': (5, 5), 'read_only': (6, 6), 'atomic_disable': (7, 7), 'address_sys': (8, 53), 'address_vid': (8, (35-3)), 'address_vid_peer': ((36-3), 35), 'comptagline': (36, (20+35)), 'kind': (56, 63)}), + 'NV_MMU_NEW_PTE_VALID_TRUE': 0x1, + 'NV_MMU_NEW_PTE_VALID_FALSE': 0x0, + 'NV_MMU_NEW_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_NEW_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_NEW_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_NEW_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_NEW_PTE_VOL_TRUE': 0x00000001, + 'NV_MMU_NEW_PTE_VOL_FALSE': 0x00000000, + 'NV_MMU_NEW_PTE_ENCRYPTED_TRUE': 0x00000001, + 'NV_MMU_NEW_PTE_ENCRYPTED_FALSE': 0x00000000, + 'NV_MMU_NEW_PTE_PRIVILEGE_TRUE': 0x1, + 'NV_MMU_NEW_PTE_PRIVILEGE_FALSE': 0x0, + 'NV_MMU_NEW_PTE_READ_ONLY_TRUE': 0x1, + 'NV_MMU_NEW_PTE_READ_ONLY_FALSE': 0x0, + 'NV_MMU_NEW_PTE_ATOMIC_DISABLE_TRUE': 0x1, + 'NV_MMU_NEW_PTE_ATOMIC_DISABLE_FALSE': 0x0, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_1': 0x00000001, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_2': 0x00000002, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_3': 0x00000003, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_4': 0x00000004, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_5': 0x00000005, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_6': 0x00000006, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_7': 0x00000007, + 'NV_MMU_NEW_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_NEW_PTE__SIZE': 8, + 'NV_MMU_VER2_PDE': (None, None, {'is_pte': (0, 0), 'is_pde': (0, 0), 'valid': (0, 0), 'aperture': (1, 2), 'vol': (3, 3), 'no_ats': (5, 5), 'address_sys': (8, 53), 'address_vid': (8, (35-3)), 'address_vid_peer': ((36-3), 35)}), + 'NV_MMU_VER2_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_VER2_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_VER2_PDE_IS_PDE_TRUE': 0x0, + 'NV_MMU_VER2_PDE_IS_PDE_FALSE': 0x1, + 'NV_MMU_VER2_PDE_VALID_TRUE': 0x1, + 'NV_MMU_VER2_PDE_VALID_FALSE': 0x0, + 'NV_MMU_VER2_PDE_APERTURE_INVALID': 0x00000000, + 'NV_MMU_VER2_PDE_APERTURE_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER2_PDE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER2_PDE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER2_PDE_VOL_TRUE': 0x00000001, + 'NV_MMU_VER2_PDE_VOL_FALSE': 0x00000000, + 'NV_MMU_VER2_PDE_NO_ATS_TRUE': 0x1, + 'NV_MMU_VER2_PDE_NO_ATS_FALSE': 0x0, + 'NV_MMU_VER2_PDE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_VER2_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER2_PDE__SIZE': 8, + 'NV_MMU_VER2_DUAL_PDE': (None, None, {'is_pte': (0, 0), 'is_pde': (0, 0), 'valid': (0, 0), 'aperture_big': (1, 2), 'vol_big': (3, 3), 'no_ats': (5, 5), 'address_big_sys': ((8-4), 53), 'address_big_vid': ((8-4), (35-3)), 'address_big_vid_peer': ((36-3), 35), 'aperture_small': (65, 66), 'vol_small': (67, 67), 'address_small_sys': (72, 117), 'address_small_vid': (72, (99-3)), 'address_small_vid_peer': ((100-3), 99)}), + 'NV_MMU_VER2_DUAL_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_VER2_DUAL_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_VER2_DUAL_PDE_IS_PDE_TRUE': 0x0, + 'NV_MMU_VER2_DUAL_PDE_IS_PDE_FALSE': 0x1, + 'NV_MMU_VER2_DUAL_PDE_VALID_TRUE': 0x1, + 'NV_MMU_VER2_DUAL_PDE_VALID_FALSE': 0x0, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER2_DUAL_PDE_VOL_BIG_TRUE': 0x00000001, + 'NV_MMU_VER2_DUAL_PDE_VOL_BIG_FALSE': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_NO_ATS_TRUE': 0x1, + 'NV_MMU_VER2_DUAL_PDE_NO_ATS_FALSE': 0x0, + 'NV_MMU_VER2_DUAL_PDE_ADDRESS_BIG_VID_PEER_0': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER2_DUAL_PDE_VOL_SMALL_TRUE': 0x00000001, + 'NV_MMU_VER2_DUAL_PDE_VOL_SMALL_FALSE': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_ADDRESS_SMALL_VID_PEER_0': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER2_DUAL_PDE_ADDRESS_BIG_SHIFT': 8, + 'NV_MMU_VER2_DUAL_PDE__SIZE': 16, + 'NV_MMU_VER2_PTE': (None, None, {'valid': (0, 0), 'aperture': (1, 2), 'vol': (3, 3), 'encrypted': (4, 4), 'privilege': (5, 5), 'read_only': (6, 6), 'atomic_disable': (7, 7), 'address_sys': (8, 53), 'address_vid': (8, (35-3)), 'address_vid_peer': ((36-3), 35), 'comptagline': (36, (20+35)), 'kind': (56, 63)}), + 'NV_MMU_VER2_PTE_VALID_TRUE': 0x1, + 'NV_MMU_VER2_PTE_VALID_FALSE': 0x0, + 'NV_MMU_VER2_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_VER2_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_VER2_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER2_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER2_PTE_VOL_TRUE': 0x00000001, + 'NV_MMU_VER2_PTE_VOL_FALSE': 0x00000000, + 'NV_MMU_VER2_PTE_ENCRYPTED_TRUE': 0x00000001, + 'NV_MMU_VER2_PTE_ENCRYPTED_FALSE': 0x00000000, + 'NV_MMU_VER2_PTE_PRIVILEGE_TRUE': 0x1, + 'NV_MMU_VER2_PTE_PRIVILEGE_FALSE': 0x0, + 'NV_MMU_VER2_PTE_READ_ONLY_TRUE': 0x1, + 'NV_MMU_VER2_PTE_READ_ONLY_FALSE': 0x0, + 'NV_MMU_VER2_PTE_ATOMIC_DISABLE_TRUE': 0x1, + 'NV_MMU_VER2_PTE_ATOMIC_DISABLE_FALSE': 0x0, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_1': 0x00000001, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_2': 0x00000002, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_3': 0x00000003, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_4': 0x00000004, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_5': 0x00000005, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_6': 0x00000006, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_7': 0x00000007, + 'NV_MMU_VER2_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER2_PTE__SIZE': 8, + 'NV_MMU_CLIENT': (None, None, {'kind': (0, 2)}), + 'NV_MMU_CLIENT_KIND_Z16': 0x1, + 'NV_MMU_CLIENT_KIND_S8': 0x2, + 'NV_MMU_CLIENT_KIND_S8Z24': 0x3, + 'NV_MMU_CLIENT_KIND_ZF32_X24S8': 0x4, + 'NV_MMU_CLIENT_KIND_Z24S8': 0x5, + 'NV_MMU_CLIENT_KIND_GENERIC_MEMORY': 0x6, + 'NV_MMU_CLIENT_KIND_INVALID': 0x7, +} +gh100 = { + 'NV_MMU_PDE': (None, None, {'aperture_big': ((0*32+0), (0*32+1)), 'size': ((0*32+2), (0*32+3)), 'address_big_sys': ((0*32+4), (0*32+31)), 'address_big_vid': ((0*32+4), (0*32+31-3)), 'address_big_vid_peer': ((0*32+32-3), (0*32+31)), 'aperture_small': ((1*32+0), (1*32+1)), 'vol_small': ((1*32+2), (1*32+2)), 'vol_big': ((1*32+3), (1*32+3)), 'address_small_sys': ((1*32+4), (1*32+31)), 'address_small_vid': ((1*32+4), (1*32+31-3)), 'address_small_vid_peer': ((1*32+32-3), (1*32+31))}), + 'NV_MMU_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_PDE_SIZE_FULL': 0x00000000, + 'NV_MMU_PDE_SIZE_HALF': 0x00000001, + 'NV_MMU_PDE_SIZE_QUARTER': 0x00000002, + 'NV_MMU_PDE_SIZE_EIGHTH': 0x00000003, + 'NV_MMU_PDE_ADDRESS_BIG_VID_PEER_0': 0x00000000, + 'NV_MMU_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_PDE_VOL_SMALL_TRUE': 0x00000001, + 'NV_MMU_PDE_VOL_SMALL_FALSE': 0x00000000, + 'NV_MMU_PDE_VOL_BIG_TRUE': 0x00000001, + 'NV_MMU_PDE_VOL_BIG_FALSE': 0x00000000, + 'NV_MMU_PDE_ADDRESS_SMALL_VID_PEER_0': 0x00000000, + 'NV_MMU_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_PDE__SIZE': 8, + 'NV_MMU_PTE': (None, None, {'valid': ((0*32+0), (0*32+0)), 'privilege': ((0*32+1), (0*32+1)), 'read_only': ((0*32+2), (0*32+2)), 'encrypted': ((0*32+3), (0*32+3)), 'address_sys': ((0*32+4), (0*32+31)), 'address_vid': ((0*32+4), (0*32+31-3)), 'address_vid_peer': ((0*32+32-3), (0*32+31)), 'vol': ((1*32+0), (1*32+0)), 'aperture': ((1*32+1), (1*32+2)), 'lock': ((1*32+3), (1*32+3)), 'atomic_disable': ((1*32+3), (1*32+3)), 'comptagline': ((1*32+12), (1*32+20+11)), 'read_disable': ((1*32+30), (1*32+30)), 'write_disable': ((1*32+31), (1*32+31)), 'kind': ((1*32+4), (1*32+7))}), + 'NV_MMU_PTE_VALID_TRUE': 0x1, + 'NV_MMU_PTE_VALID_FALSE': 0x0, + 'NV_MMU_PTE_PRIVILEGE_TRUE': 0x1, + 'NV_MMU_PTE_PRIVILEGE_FALSE': 0x0, + 'NV_MMU_PTE_READ_ONLY_TRUE': 0x1, + 'NV_MMU_PTE_READ_ONLY_FALSE': 0x0, + 'NV_MMU_PTE_ENCRYPTED_TRUE': 0x00000001, + 'NV_MMU_PTE_ENCRYPTED_FALSE': 0x00000000, + 'NV_MMU_PTE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_PTE_ADDRESS_VID_PEER_1': 0x00000001, + 'NV_MMU_PTE_ADDRESS_VID_PEER_2': 0x00000002, + 'NV_MMU_PTE_ADDRESS_VID_PEER_3': 0x00000003, + 'NV_MMU_PTE_ADDRESS_VID_PEER_4': 0x00000004, + 'NV_MMU_PTE_ADDRESS_VID_PEER_5': 0x00000005, + 'NV_MMU_PTE_ADDRESS_VID_PEER_6': 0x00000006, + 'NV_MMU_PTE_ADDRESS_VID_PEER_7': 0x00000007, + 'NV_MMU_PTE_VOL_TRUE': 0x00000001, + 'NV_MMU_PTE_VOL_FALSE': 0x00000000, + 'NV_MMU_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_PTE_LOCK_TRUE': 0x1, + 'NV_MMU_PTE_LOCK_FALSE': 0x0, + 'NV_MMU_PTE_ATOMIC_DISABLE_TRUE': 0x1, + 'NV_MMU_PTE_ATOMIC_DISABLE_FALSE': 0x0, + 'NV_MMU_PTE_READ_DISABLE_TRUE': 0x1, + 'NV_MMU_PTE_READ_DISABLE_FALSE': 0x0, + 'NV_MMU_PTE_WRITE_DISABLE_TRUE': 0x1, + 'NV_MMU_PTE_WRITE_DISABLE_FALSE': 0x0, + 'NV_MMU_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_PTE__SIZE': 8, + 'NV_MMU_PTE_COMPTAGS_NONE': 0x0, + 'NV_MMU_PTE_COMPTAGS_1': 0x1, + 'NV_MMU_PTE_COMPTAGS_2': 0x2, + 'NV_MMU_PTE_KIND_INVALID': 0x07, + 'NV_MMU_PTE_KIND_PITCH': 0x00, + 'NV_MMU_PTE_KIND_GENERIC_MEMORY': 0x6, + 'NV_MMU_PTE_KIND_Z16': 0x1, + 'NV_MMU_PTE_KIND_S8': 0x2, + 'NV_MMU_PTE_KIND_S8Z24': 0x3, + 'NV_MMU_PTE_KIND_ZF32_X24S8': 0x4, + 'NV_MMU_PTE_KIND_Z24S8': 0x5, + 'NV_MMU_PTE_KIND_GENERIC_MEMORY_COMPRESSIBLE': 0x8, + 'NV_MMU_PTE_KIND_GENERIC_MEMORY_COMPRESSIBLE_DISABLE_PLC': 0x9, + 'NV_MMU_PTE_KIND_S8_COMPRESSIBLE_DISABLE_PLC': 0xA, + 'NV_MMU_PTE_KIND_Z16_COMPRESSIBLE_DISABLE_PLC': 0xB, + 'NV_MMU_PTE_KIND_S8Z24_COMPRESSIBLE_DISABLE_PLC': 0xC, + 'NV_MMU_PTE_KIND_ZF32_X24S8_COMPRESSIBLE_DISABLE_PLC': 0xD, + 'NV_MMU_PTE_KIND_Z24S8_COMPRESSIBLE_DISABLE_PLC': 0xE, + 'NV_MMU_PTE_KIND_SMSKED_MESSAGE': 0xF, + 'NV_MMU_VER1_PDE': (None, None, {'aperture_big': ((0*32+0), (0*32+1)), 'size': ((0*32+2), (0*32+3)), 'address_big_sys': ((0*32+4), (0*32+31)), 'address_big_vid': ((0*32+4), (0*32+31-3)), 'address_big_vid_peer': ((0*32+32-3), (0*32+31)), 'aperture_small': ((1*32+0), (1*32+1)), 'vol_small': ((1*32+2), (1*32+2)), 'vol_big': ((1*32+3), (1*32+3)), 'address_small_sys': ((1*32+4), (1*32+31)), 'address_small_vid': ((1*32+4), (1*32+31-3)), 'address_small_vid_peer': ((1*32+32-3), (1*32+31))}), + 'NV_MMU_VER1_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_VER1_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER1_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER1_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER1_PDE_SIZE_FULL': 0x00000000, + 'NV_MMU_VER1_PDE_SIZE_HALF': 0x00000001, + 'NV_MMU_VER1_PDE_SIZE_QUARTER': 0x00000002, + 'NV_MMU_VER1_PDE_SIZE_EIGHTH': 0x00000003, + 'NV_MMU_VER1_PDE_ADDRESS_BIG_VID_PEER_0': 0x00000000, + 'NV_MMU_VER1_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_VER1_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER1_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER1_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER1_PDE_VOL_SMALL_TRUE': 0x00000001, + 'NV_MMU_VER1_PDE_VOL_SMALL_FALSE': 0x00000000, + 'NV_MMU_VER1_PDE_VOL_BIG_TRUE': 0x00000001, + 'NV_MMU_VER1_PDE_VOL_BIG_FALSE': 0x00000000, + 'NV_MMU_VER1_PDE_ADDRESS_SMALL_VID_PEER_0': 0x00000000, + 'NV_MMU_VER1_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER1_PDE__SIZE': 8, + 'NV_MMU_VER1_PTE': (None, None, {'valid': ((0*32+0), (0*32+0)), 'privilege': ((0*32+1), (0*32+1)), 'read_only': ((0*32+2), (0*32+2)), 'encrypted': ((0*32+3), (0*32+3)), 'address_sys': ((0*32+4), (0*32+31)), 'address_vid': ((0*32+4), (0*32+31-3)), 'address_vid_peer': ((0*32+32-3), (0*32+31)), 'vol': ((1*32+0), (1*32+0)), 'aperture': ((1*32+1), (1*32+2)), 'atomic_disable': ((1*32+3), (1*32+3)), 'comptagline': ((1*32+12), (1*32+20+11)), 'kind': ((1*32+4), (1*32+11))}), + 'NV_MMU_VER1_PTE_VALID_TRUE': 0x1, + 'NV_MMU_VER1_PTE_VALID_FALSE': 0x0, + 'NV_MMU_VER1_PTE_PRIVILEGE_TRUE': 0x1, + 'NV_MMU_VER1_PTE_PRIVILEGE_FALSE': 0x0, + 'NV_MMU_VER1_PTE_READ_ONLY_TRUE': 0x1, + 'NV_MMU_VER1_PTE_READ_ONLY_FALSE': 0x0, + 'NV_MMU_VER1_PTE_ENCRYPTED_TRUE': 0x00000001, + 'NV_MMU_VER1_PTE_ENCRYPTED_FALSE': 0x00000000, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_1': 0x00000001, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_2': 0x00000002, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_3': 0x00000003, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_4': 0x00000004, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_5': 0x00000005, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_6': 0x00000006, + 'NV_MMU_VER1_PTE_ADDRESS_VID_PEER_7': 0x00000007, + 'NV_MMU_VER1_PTE_VOL_TRUE': 0x00000001, + 'NV_MMU_VER1_PTE_VOL_FALSE': 0x00000000, + 'NV_MMU_VER1_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_VER1_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_VER1_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER1_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER1_PTE_ATOMIC_DISABLE_TRUE': 0x1, + 'NV_MMU_VER1_PTE_ATOMIC_DISABLE_FALSE': 0x0, + 'NV_MMU_VER1_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER1_PTE__SIZE': 8, + 'NV_MMU_VER1_PTE_COMPTAGS_NONE': 0x0, + 'NV_MMU_VER1_PTE_COMPTAGS_1': 0x1, + 'NV_MMU_VER1_PTE_COMPTAGS_2': 0x2, + 'NV_MMU_NEW_PDE': (None, None, {'is_pte': (0, 0), 'is_pde': (0, 0), 'valid': (0, 0), 'aperture': (1, 2), 'vol': (3, 3), 'no_ats': (5, 5), 'address_sys': (8, 53), 'address_vid': (8, (35-3)), 'address_vid_peer': ((36-3), 35)}), + 'NV_MMU_NEW_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_NEW_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_NEW_PDE_IS_PDE_TRUE': 0x0, + 'NV_MMU_NEW_PDE_IS_PDE_FALSE': 0x1, + 'NV_MMU_NEW_PDE_VALID_TRUE': 0x1, + 'NV_MMU_NEW_PDE_VALID_FALSE': 0x0, + 'NV_MMU_NEW_PDE_APERTURE_INVALID': 0x00000000, + 'NV_MMU_NEW_PDE_APERTURE_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_NEW_PDE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_NEW_PDE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_NEW_PDE_VOL_TRUE': 0x00000001, + 'NV_MMU_NEW_PDE_VOL_FALSE': 0x00000000, + 'NV_MMU_NEW_PDE_NO_ATS_TRUE': 0x1, + 'NV_MMU_NEW_PDE_NO_ATS_FALSE': 0x0, + 'NV_MMU_NEW_PDE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_NEW_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_NEW_PDE__SIZE': 8, + 'NV_MMU_NEW_DUAL_PDE': (None, None, {'is_pte': (0, 0), 'is_pde': (0, 0), 'valid': (0, 0), 'aperture_big': (1, 2), 'vol_big': (3, 3), 'no_ats': (5, 5), 'address_big_sys': ((8-4), 53), 'address_big_vid': ((8-4), (35-3)), 'address_big_vid_peer': ((36-3), 35), 'aperture_small': (65, 66), 'vol_small': (67, 67), 'address_small_sys': (72, 117), 'address_small_vid': (72, (99-3)), 'address_small_vid_peer': ((100-3), 99)}), + 'NV_MMU_NEW_DUAL_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_NEW_DUAL_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_NEW_DUAL_PDE_IS_PDE_TRUE': 0x0, + 'NV_MMU_NEW_DUAL_PDE_IS_PDE_FALSE': 0x1, + 'NV_MMU_NEW_DUAL_PDE_VALID_TRUE': 0x1, + 'NV_MMU_NEW_DUAL_PDE_VALID_FALSE': 0x0, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_NEW_DUAL_PDE_VOL_BIG_TRUE': 0x00000001, + 'NV_MMU_NEW_DUAL_PDE_VOL_BIG_FALSE': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_NO_ATS_TRUE': 0x1, + 'NV_MMU_NEW_DUAL_PDE_NO_ATS_FALSE': 0x0, + 'NV_MMU_NEW_DUAL_PDE_ADDRESS_BIG_VID_PEER_0': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_NEW_DUAL_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_NEW_DUAL_PDE_VOL_SMALL_TRUE': 0x00000001, + 'NV_MMU_NEW_DUAL_PDE_VOL_SMALL_FALSE': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_ADDRESS_SMALL_VID_PEER_0': 0x00000000, + 'NV_MMU_NEW_DUAL_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_NEW_DUAL_PDE_ADDRESS_BIG_SHIFT': 8, + 'NV_MMU_NEW_DUAL_PDE__SIZE': 16, + 'NV_MMU_NEW_PTE': (None, None, {'valid': (0, 0), 'aperture': (1, 2), 'vol': (3, 3), 'encrypted': (4, 4), 'privilege': (5, 5), 'read_only': (6, 6), 'atomic_disable': (7, 7), 'address_sys': (8, 53), 'address_vid': (8, (35-3)), 'address_vid_peer': ((36-3), 35), 'comptagline': (36, (20+35)), 'kind': (56, 63)}), + 'NV_MMU_NEW_PTE_VALID_TRUE': 0x1, + 'NV_MMU_NEW_PTE_VALID_FALSE': 0x0, + 'NV_MMU_NEW_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_NEW_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_NEW_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_NEW_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_NEW_PTE_VOL_TRUE': 0x00000001, + 'NV_MMU_NEW_PTE_VOL_FALSE': 0x00000000, + 'NV_MMU_NEW_PTE_ENCRYPTED_TRUE': 0x00000001, + 'NV_MMU_NEW_PTE_ENCRYPTED_FALSE': 0x00000000, + 'NV_MMU_NEW_PTE_PRIVILEGE_TRUE': 0x1, + 'NV_MMU_NEW_PTE_PRIVILEGE_FALSE': 0x0, + 'NV_MMU_NEW_PTE_READ_ONLY_TRUE': 0x1, + 'NV_MMU_NEW_PTE_READ_ONLY_FALSE': 0x0, + 'NV_MMU_NEW_PTE_ATOMIC_DISABLE_TRUE': 0x1, + 'NV_MMU_NEW_PTE_ATOMIC_DISABLE_FALSE': 0x0, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_1': 0x00000001, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_2': 0x00000002, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_3': 0x00000003, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_4': 0x00000004, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_5': 0x00000005, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_6': 0x00000006, + 'NV_MMU_NEW_PTE_ADDRESS_VID_PEER_7': 0x00000007, + 'NV_MMU_NEW_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_NEW_PTE__SIZE': 8, + 'NV_MMU_VER2_PDE': (None, None, {'is_pte': (0, 0), 'is_pde': (0, 0), 'valid': (0, 0), 'aperture': (1, 2), 'vol': (3, 3), 'no_ats': (5, 5), 'address_sys': (8, 53), 'address_vid': (8, (35-3)), 'address_vid_peer': ((36-3), 35)}), + 'NV_MMU_VER2_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_VER2_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_VER2_PDE_IS_PDE_TRUE': 0x0, + 'NV_MMU_VER2_PDE_IS_PDE_FALSE': 0x1, + 'NV_MMU_VER2_PDE_VALID_TRUE': 0x1, + 'NV_MMU_VER2_PDE_VALID_FALSE': 0x0, + 'NV_MMU_VER2_PDE_APERTURE_INVALID': 0x00000000, + 'NV_MMU_VER2_PDE_APERTURE_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER2_PDE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER2_PDE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER2_PDE_VOL_TRUE': 0x00000001, + 'NV_MMU_VER2_PDE_VOL_FALSE': 0x00000000, + 'NV_MMU_VER2_PDE_NO_ATS_TRUE': 0x1, + 'NV_MMU_VER2_PDE_NO_ATS_FALSE': 0x0, + 'NV_MMU_VER2_PDE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_VER2_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER2_PDE__SIZE': 8, + 'NV_MMU_VER2_DUAL_PDE': (None, None, {'is_pte': (0, 0), 'is_pde': (0, 0), 'valid': (0, 0), 'aperture_big': (1, 2), 'vol_big': (3, 3), 'no_ats': (5, 5), 'address_big_sys': ((8-4), 53), 'address_big_vid': ((8-4), (35-3)), 'address_big_vid_peer': ((36-3), 35), 'aperture_small': (65, 66), 'vol_small': (67, 67), 'address_small_sys': (72, 117), 'address_small_vid': (72, (99-3)), 'address_small_vid_peer': ((100-3), 99)}), + 'NV_MMU_VER2_DUAL_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_VER2_DUAL_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_VER2_DUAL_PDE_IS_PDE_TRUE': 0x0, + 'NV_MMU_VER2_DUAL_PDE_IS_PDE_FALSE': 0x1, + 'NV_MMU_VER2_DUAL_PDE_VALID_TRUE': 0x1, + 'NV_MMU_VER2_DUAL_PDE_VALID_FALSE': 0x0, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER2_DUAL_PDE_VOL_BIG_TRUE': 0x00000001, + 'NV_MMU_VER2_DUAL_PDE_VOL_BIG_FALSE': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_NO_ATS_TRUE': 0x1, + 'NV_MMU_VER2_DUAL_PDE_NO_ATS_FALSE': 0x0, + 'NV_MMU_VER2_DUAL_PDE_ADDRESS_BIG_VID_PEER_0': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER2_DUAL_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER2_DUAL_PDE_VOL_SMALL_TRUE': 0x00000001, + 'NV_MMU_VER2_DUAL_PDE_VOL_SMALL_FALSE': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_ADDRESS_SMALL_VID_PEER_0': 0x00000000, + 'NV_MMU_VER2_DUAL_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER2_DUAL_PDE_ADDRESS_BIG_SHIFT': 8, + 'NV_MMU_VER2_DUAL_PDE__SIZE': 16, + 'NV_MMU_VER2_PTE': (None, None, {'valid': (0, 0), 'aperture': (1, 2), 'vol': (3, 3), 'encrypted': (4, 4), 'privilege': (5, 5), 'read_only': (6, 6), 'atomic_disable': (7, 7), 'address_sys': (8, 53), 'address_vid': (8, (35-3)), 'address_vid_peer': ((36-3), 35), 'comptagline': (36, (20+35)), 'kind': (56, 63)}), + 'NV_MMU_VER2_PTE_VALID_TRUE': 0x1, + 'NV_MMU_VER2_PTE_VALID_FALSE': 0x0, + 'NV_MMU_VER2_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_VER2_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_VER2_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER2_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER2_PTE_VOL_TRUE': 0x00000001, + 'NV_MMU_VER2_PTE_VOL_FALSE': 0x00000000, + 'NV_MMU_VER2_PTE_ENCRYPTED_TRUE': 0x00000001, + 'NV_MMU_VER2_PTE_ENCRYPTED_FALSE': 0x00000000, + 'NV_MMU_VER2_PTE_PRIVILEGE_TRUE': 0x1, + 'NV_MMU_VER2_PTE_PRIVILEGE_FALSE': 0x0, + 'NV_MMU_VER2_PTE_READ_ONLY_TRUE': 0x1, + 'NV_MMU_VER2_PTE_READ_ONLY_FALSE': 0x0, + 'NV_MMU_VER2_PTE_ATOMIC_DISABLE_TRUE': 0x1, + 'NV_MMU_VER2_PTE_ATOMIC_DISABLE_FALSE': 0x0, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_0': 0x00000000, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_1': 0x00000001, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_2': 0x00000002, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_3': 0x00000003, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_4': 0x00000004, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_5': 0x00000005, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_6': 0x00000006, + 'NV_MMU_VER2_PTE_ADDRESS_VID_PEER_7': 0x00000007, + 'NV_MMU_VER2_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER2_PTE__SIZE': 8, + 'NV_MMU_VER3_PDE': (None, None, {'is_pte': (0, 0), 'valid': (0, 0), 'aperture': (1, 2), 'pcf': (3, 5), 'address': (12, 51)}), + 'NV_MMU_VER3_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_VER3_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_VER3_PDE_VALID_TRUE': 0x1, + 'NV_MMU_VER3_PDE_VALID_FALSE': 0x0, + 'NV_MMU_VER3_PDE_APERTURE_INVALID': 0x00000000, + 'NV_MMU_VER3_PDE_APERTURE_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER3_PDE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER3_PDE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER3_PDE_PCF_VALID_CACHED_ATS_ALLOWED__OR__INVALID_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_PDE_PCF_VALID_CACHED_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_PDE_PCF_INVALID_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_PDE_PCF_VALID_UNCACHED_ATS_ALLOWED__OR__SPARSE_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_PDE_PCF_VALID_UNCACHED_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_PDE_PCF_SPARSE_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_PDE_PCF_VALID_CACHED_ATS_NOT_ALLOWED__OR__INVALID_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_PDE_PCF_VALID_CACHED_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_PDE_PCF_INVALID_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_PDE_PCF_VALID_UNCACHED_ATS_NOT_ALLOWED__OR__SPARSE_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_PDE_PCF_VALID_UNCACHED_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_PDE_PCF_SPARSE_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER3_PDE__SIZE': 8, + 'NV_MMU_VER3_DUAL_PDE': (None, None, {'is_pte': (0, 0), 'valid': (0, 0), 'aperture_big': (1, 2), 'pcf_big': (3, 5), 'address_big': (8, 51), 'aperture_small': (65, 66), 'pcf_small': (67, 69), 'address_small': (76, 115)}), + 'NV_MMU_VER3_DUAL_PDE_IS_PTE_TRUE': 0x1, + 'NV_MMU_VER3_DUAL_PDE_IS_PTE_FALSE': 0x0, + 'NV_MMU_VER3_DUAL_PDE_VALID_TRUE': 0x1, + 'NV_MMU_VER3_DUAL_PDE_VALID_FALSE': 0x0, + 'NV_MMU_VER3_DUAL_PDE_APERTURE_BIG_INVALID': 0x00000000, + 'NV_MMU_VER3_DUAL_PDE_APERTURE_BIG_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER3_DUAL_PDE_APERTURE_BIG_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER3_DUAL_PDE_APERTURE_BIG_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_VALID_CACHED_ATS_ALLOWED__OR__INVALID_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_VALID_CACHED_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_INVALID_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_VALID_UNCACHED_ATS_ALLOWED__OR__SPARSE_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_VALID_UNCACHED_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_SPARSE_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_VALID_CACHED_ATS_NOT_ALLOWED__OR__INVALID_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_VALID_CACHED_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_INVALID_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_VALID_UNCACHED_ATS_NOT_ALLOWED__OR__SPARSE_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_VALID_UNCACHED_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_DUAL_PDE_PCF_BIG_SPARSE_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_DUAL_PDE_APERTURE_SMALL_INVALID': 0x00000000, + 'NV_MMU_VER3_DUAL_PDE_APERTURE_SMALL_VIDEO_MEMORY': 0x00000001, + 'NV_MMU_VER3_DUAL_PDE_APERTURE_SMALL_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER3_DUAL_PDE_APERTURE_SMALL_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_VALID_CACHED_ATS_ALLOWED__OR__INVALID_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_VALID_CACHED_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_INVALID_ATS_ALLOWED': 0x00000000, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_VALID_UNCACHED_ATS_ALLOWED__OR__SPARSE_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_VALID_UNCACHED_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_SPARSE_ATS_ALLOWED': 0x00000001, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_VALID_CACHED_ATS_NOT_ALLOWED__OR__INVALID_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_VALID_CACHED_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_INVALID_ATS_NOT_ALLOWED': 0x00000002, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_VALID_UNCACHED_ATS_NOT_ALLOWED__OR__SPARSE_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_VALID_UNCACHED_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_DUAL_PDE_PCF_SMALL_SPARSE_ATS_NOT_ALLOWED': 0x00000003, + 'NV_MMU_VER3_DUAL_PDE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER3_DUAL_PDE_ADDRESS_BIG_SHIFT': 8, + 'NV_MMU_VER3_DUAL_PDE__SIZE': 16, + 'NV_MMU_VER3_PTE': (None, None, {'valid': (0, 0), 'aperture': (1, 2), 'pcf': (3, 7), 'kind': (8, 11), 'address': (12, 51), 'address_sys': (12, 51), 'address_peer': (12, 51), 'address_vid': (12, 39), 'peer_id': ((64-3), 63)}), + 'NV_MMU_VER3_PTE_VALID_TRUE': 0x1, + 'NV_MMU_VER3_PTE_VALID_FALSE': 0x0, + 'NV_MMU_VER3_PTE_APERTURE_VIDEO_MEMORY': 0x00000000, + 'NV_MMU_VER3_PTE_APERTURE_PEER_MEMORY': 0x00000001, + 'NV_MMU_VER3_PTE_APERTURE_SYSTEM_COHERENT_MEMORY': 0x00000002, + 'NV_MMU_VER3_PTE_APERTURE_SYSTEM_NON_COHERENT_MEMORY': 0x00000003, + 'NV_MMU_VER3_PTE_PCF_INVALID': 0x00000000, + 'NV_MMU_VER3_PTE_PCF_SPARSE': 0x00000001, + 'NV_MMU_VER3_PTE_PCF_MAPPING_NOWHERE': 0x00000002, + 'NV_MMU_VER3_PTE_PCF_NO_VALID_4KB_PAGE': 0x00000003, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RW_ATOMIC_CACHED_ACE': 0x00000000, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RW_ATOMIC_UNCACHED_ACE': 0x00000001, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RW_ATOMIC_CACHED_ACE': 0x00000002, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RW_ATOMIC_UNCACHED_ACE': 0x00000003, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RO_ATOMIC_CACHED_ACE': 0x00000004, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RO_ATOMIC_UNCACHED_ACE': 0x00000005, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RO_ATOMIC_CACHED_ACE': 0x00000006, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RO_ATOMIC_UNCACHED_ACE': 0x00000007, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RW_NO_ATOMIC_CACHED_ACE': 0x00000008, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RW_NO_ATOMIC_UNCACHED_ACE': 0x00000009, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RW_NO_ATOMIC_CACHED_ACE': 0x0000000A, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RW_NO_ATOMIC_UNCACHED_ACE': 0x0000000B, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RO_NO_ATOMIC_CACHED_ACE': 0x0000000C, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RO_NO_ATOMIC_UNCACHED_ACE': 0x0000000D, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RO_NO_ATOMIC_CACHED_ACE': 0x0000000E, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RO_NO_ATOMIC_UNCACHED_ACE': 0x0000000F, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RW_ATOMIC_CACHED_ACD': 0x00000010, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RW_ATOMIC_UNCACHED_ACD': 0x00000011, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RW_ATOMIC_CACHED_ACD': 0x00000012, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RW_ATOMIC_UNCACHED_ACD': 0x00000013, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RO_ATOMIC_CACHED_ACD': 0x00000014, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RO_ATOMIC_UNCACHED_ACD': 0x00000015, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RO_ATOMIC_CACHED_ACD': 0x00000016, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RO_ATOMIC_UNCACHED_ACD': 0x00000017, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RW_NO_ATOMIC_CACHED_ACD': 0x00000018, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RW_NO_ATOMIC_UNCACHED_ACD': 0x00000019, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RW_NO_ATOMIC_CACHED_ACD': 0x0000001A, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RW_NO_ATOMIC_UNCACHED_ACD': 0x0000001B, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RO_NO_ATOMIC_CACHED_ACD': 0x0000001C, + 'NV_MMU_VER3_PTE_PCF_REGULAR_RO_NO_ATOMIC_UNCACHED_ACD': 0x0000001D, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RO_NO_ATOMIC_CACHED_ACD': 0x0000001E, + 'NV_MMU_VER3_PTE_PCF_PRIVILEGE_RO_NO_ATOMIC_UNCACHED_ACD': 0x0000001F, + 'NV_MMU_VER3_PTE_PEER_ID_0': 0x00000000, + 'NV_MMU_VER3_PTE_PEER_ID_1': 0x00000001, + 'NV_MMU_VER3_PTE_PEER_ID_2': 0x00000002, + 'NV_MMU_VER3_PTE_PEER_ID_3': 0x00000003, + 'NV_MMU_VER3_PTE_PEER_ID_4': 0x00000004, + 'NV_MMU_VER3_PTE_PEER_ID_5': 0x00000005, + 'NV_MMU_VER3_PTE_PEER_ID_6': 0x00000006, + 'NV_MMU_VER3_PTE_PEER_ID_7': 0x00000007, + 'NV_MMU_VER3_PTE_ADDRESS_SHIFT': 0x0000000c, + 'NV_MMU_VER3_PTE__SIZE': 8, + 'NV_MMU_CLIENT': (None, None, {'kind': (0, 2)}), + 'NV_MMU_CLIENT_KIND_Z16': 0x1, + 'NV_MMU_CLIENT_KIND_S8': 0x2, + 'NV_MMU_CLIENT_KIND_S8Z24': 0x3, + 'NV_MMU_CLIENT_KIND_ZF32_X24S8': 0x4, + 'NV_MMU_CLIENT_KIND_Z24S8': 0x5, + 'NV_MMU_CLIENT_KIND_GENERIC_MEMORY': 0x6, + 'NV_MMU_CLIENT_KIND_INVALID': 0x7, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_riscv_pri.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_riscv_pri.py new file mode 100644 index 000000000..931468bec --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_riscv_pri.py @@ -0,0 +1,14 @@ +ga102 = { + 'NV_FALCON2_GSP_BASE': 0x00111000, + 'NV_PRISCV_RISCV_IRQMASK': (0x1000, 0x00000528, {}), + 'NV_PRISCV_RISCV_IRQDEST': (0x1000, 0x0000052c, {}), + 'NV_PRISCV_RISCV_CPUCTL': (0x1000, 0x00000388, {'active_stat': (7, 7), 'halted': (4, 4)}), + 'NV_PRISCV_RISCV_CPUCTL_ACTIVE_STAT_ACTIVE': 0x00000001, + 'NV_PRISCV_RISCV_BCR_CTRL': (0x1000, 0x00000668, {'valid': (0, 0), 'core_select': (4, 4), 'brfetch': (8, 8)}), + 'NV_PRISCV_RISCV_BCR_CTRL_VALID_TRUE': 0x00000001, + 'NV_PRISCV_RISCV_BCR_CTRL_VALID_FALSE': 0x00000000, + 'NV_PRISCV_RISCV_BCR_CTRL_CORE_SELECT_FALCON': 0x00000000, + 'NV_PRISCV_RISCV_BCR_CTRL_CORE_SELECT_RISCV': 0x00000001, + 'NV_PRISCV_RISCV_BCR_CTRL_BRFETCH_TRUE': 0x00000001, + 'NV_PRISCV_RISCV_BCR_CTRL_BRFETCH_FALSE': 0x00000000, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_sec_pri.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_sec_pri.py new file mode 100644 index 000000000..acf0905bc --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_sec_pri.py @@ -0,0 +1,7 @@ +ga102 = { + 'NV_PSEC_FALCON_ENGINE': (0x0, 0x008403c0, {'reset': (0, 0)}), + 'NV_PSEC_FALCON_ENGINE_RESET_TRUE': 0x00000001, + 'NV_PSEC_FALCON_ENGINE_RESET_FALSE': 0x00000000, + 'NV_PSEC_MAILBOX__SIZE_1': 4, + 'NV_PSEC_MAILBOX_DATA_INIT': 0x00000000, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_therm.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_therm.py new file mode 100644 index 000000000..1417a5e64 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_therm.py @@ -0,0 +1,4 @@ +gb202 = { + 'NV_THERM_I2CS_SCRATCH': (0x0, 0x00ad00bc, {'data': (0, 31)}), + 'NV_THERM_I2CS_SCRATCH_DATA_INIT': 0x00000000, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_vm.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_vm.py new file mode 100644 index 000000000..f9b87ebdc --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/dev_vm.py @@ -0,0 +1,246 @@ +tu102 = { + 'NV_VIRTUAL_FUNCTION_PRIV_L2_SYSMEM_INVALIDATE': (0xB80000, 0x00000F00, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_L2_PEERMEM_INVALIDATE': (0xB80000, 0x00000F04, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP': (0xB80000, lambda i: (0x1600+(i)*4), {'value': (0, 31), 'en_set_value': (0, 31), 'en_clear_value': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP__SIZE_1': 1, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_SUBTREE': (0xB80000, lambda i: (i), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_SUBTREE__SIZE_1': 64, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_SUBTREE_INTR_PENDING': 1, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_SUBTREE_INTR_NOT_PENDING': 0, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_SET': (0xB80000, lambda i: (0x1608+(i)*4), {'value': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_SET__SIZE_1': 1, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_SET_SUBTREE': (0xB80000, lambda i: (i), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_SET_SUBTREE__SIZE_1': 64, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_SET_SUBTREE_ENABLE': 1, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_SET_SUBTREE_ENABLED': 1, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_SET_SUBTREE_DISABLED': 0, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_CLEAR': (0xB80000, lambda i: (0x1610+(i)*4), {'value': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_CLEAR__SIZE_1': 1, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_CLEAR_SUBTREE': (0xB80000, lambda i: (i), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_CLEAR_SUBTREE__SIZE_1': 64, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_CLEAR_SUBTREE_DISABLE': 1, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_CLEAR_SUBTREE_ENABLED': 1, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_EN_CLEAR_SUBTREE_DISABLED': 0, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF': (0xB80000, lambda i: (0x1000+(i)*4), {'value': (0, 31), 'en_set_value': (0, 31), 'en_clear_value': (0, 31), 'trigger_vector': (0, 11)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF__SIZE_1': 8, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_VALUE_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_SET': (0xB80000, lambda i: (0x1200+(i)*4), {'value': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_SET__SIZE_1': 8, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_SET_VALUE_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_CLEAR': (0xB80000, lambda i: (0x1400+(i)*4), {'value': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_CLEAR__SIZE_1': 8, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_CLEAR_VALUE_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_TRIGGER': 0x00001640, + 'NV_VIRTUAL_FUNCTION_PRIV_TIMER': (0xB80000, 0x2300, {'nsec': (0, 31), 'usec': (10, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_TIMER_USEC_INIT': 0x0, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_NON_REPLAY_FAULT_BUFFER': (0xB80000, 0, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_REPLAY_FAULT_BUFFER': (0xB80000, 1, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_LO': (0xB80000, lambda i: (0x00003000+(i)*32), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_LO__SIZE_1': 2, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_HI': (0xB80000, lambda i: (0x00003004+(i)*32), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_HI__SIZE_1': 2, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET': (0xB80000, lambda i: (0x00003008+(i)*32), {'ptr': (0, 19), 'getptr_corrupted': (30, 30), 'overflow': (31, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET__SIZE_1': 2, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET_PTR_RESET': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET_GETPTR_CORRUPTED_NO': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET_GETPTR_CORRUPTED_YES': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET_GETPTR_CORRUPTED_CLEAR': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET_OVERFLOW_NO': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET_OVERFLOW_YES': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_GET_OVERFLOW_CLEAR': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_PUT': (0xB80000, lambda i: (0x0000300C+(i)*32), {'ptr': (0, 19), 'getptr_corrupted': (30, 30), 'overflow': (31, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_PUT__SIZE_1': 2, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_PUT_PTR_RESET': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_PUT_GETPTR_CORRUPTED_NO': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_PUT_GETPTR_CORRUPTED_YES': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_PUT_OVERFLOW_NO': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_PUT_OVERFLOW_YES': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE': (0xB80000, lambda i: (0x00003010+(i)*32), {'val': (0, 19), 'overflow_intr': (29, 29), 'set_default': (30, 30), 'enable': (31, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE__SIZE_1': 2, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE_VAL_RESET': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE_OVERFLOW_INTR_DISABLE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE_OVERFLOW_INTR_ENABLE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE_SET_DEFAULT_NO': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE_SET_DEFAULT_YES': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE_ENABLE_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_BUFFER_SIZE_ENABLE_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_PAGE_FAULT_CTRL': (0xB80000, 0x00003070, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_ADDR_LO': (0xB80000, 0x00003080, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_ADDR_HI': (0xB80000, 0x00003084, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_INST_LO': (0xB80000, 0x00003088, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_INST_HI': (0xB80000, 0x0000308C, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_INFO': (0xB80000, 0x00003090, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_FAULT_STATUS': (0xB80000, 0x00003094, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_PDB': (0xB80000, 0x000030A0, {'aperture': (1, 1), 'addr': (4, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_PDB_APERTURE_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_PDB_APERTURE_VID_MEM': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_PDB_APERTURE_SYS_MEM': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_PDB_ADDR_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_PDB_ADDR_ALIGNMENT': 0x0000000c, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_UPPER_PDB': (0xB80000, 0x000030A4, {'addr': (0, 19)}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_UPPER_PDB_ADDR_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE': (0xB80000, 0x000030B0, {'pdb_aperture': (1, 1), 'pdb_addr': (4, 31), 'upper_pdb_addr': (0, 19), 'all_va': (0, 0), 'all_pdb': (1, 1), 'hubtlb_only': (2, 2), 'replay': (3, 5), 'sys_membar': (6, 6), 'ack': (7, 8), 'cancel_client_id': (9, 14), 'cancel_gpc_id': (15, 19), 'cancel_client_type': (20, 20), 'use_pasid': (21, 21), 'use_size': (22, 22), 'prop_flush': (23, 23), 'cache_level': (24, 26), 'trigger': (31, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_ALL_VA_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_ALL_VA_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_ALL_PDB_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_ALL_PDB_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_HUBTLB_ONLY_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_HUBTLB_ONLY_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_REPLAY_NONE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_REPLAY_START': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_REPLAY_START_ACK_ALL': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_REPLAY_CANCEL_TARGETED': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_REPLAY_CANCEL_GLOBAL': 0x00000004, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_REPLAY_CANCEL_VA_GLOBAL': 0x00000005, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_SYS_MEMBAR_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_SYS_MEMBAR_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_ACK_NONE_REQUIRED': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_ACK_INTRANODE': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_ACK_GLOBALLY': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CANCEL_CLIENT_TYPE_GPC': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CANCEL_CLIENT_TYPE_HUB': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_USE_PASID_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_USE_PASID_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_USE_SIZE_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_USE_SIZE_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_PROP_FLUSH_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_PROP_FLUSH_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_ALL': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_PTE_ONLY': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_UP_TO_PDE0': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_UP_TO_PDE1': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_UP_TO_PDE2': 0x00000004, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_UP_TO_PDE3': 0x00000005, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_UP_TO_PDE4': 0x00000006, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_UP_TO_PDE5': 0x00000007, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_CANCEL_READ': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_CANCEL_WRITE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_CANCEL_ATOMIC_STRONG': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_CANCEL_RSVRVD': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_CANCEL_ATOMIC_WEAK': 0x00000004, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_CANCEL_ATOMIC_ALL': 0x00000005, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_CANCEL_WRITE_AND_ATOMIC': 0x00000006, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_CACHE_LEVEL_CANCEL_ALL': 0x00000007, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_TRIGGER_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE_TRIGGER_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG': (0xB80000, 0x00003100, {'threshold': (0, 15), 'mimc_granularity': (16, 17), 'momc_granularity': (18, 19)}), + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_THRESHOLD_INIT': 0x00000080, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MIMC_GRANULARITY_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MIMC_GRANULARITY_64K': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MIMC_GRANULARITY_2M': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MIMC_GRANULARITY_16M': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MIMC_GRANULARITY_16G': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MOMC_GRANULARITY_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MOMC_GRANULARITY_64K': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MOMC_GRANULARITY_2M': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MOMC_GRANULARITY_16M': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_CONFIG_MOMC_GRANULARITY_16G': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_LO': (0xB80000, 0x00003108, {'en': (0, 0)}), + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_LO_EN_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_LO_EN_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_HI': (0xB80000, 0x0000310C, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_SIZE': (0xB80000, 0x00003110, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_GET': (0xB80000, 0x00003114, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_PUT': (0xB80000, 0x00003118, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_INFO': (0xB80000, 0x0000311C, {'full': (0, 0), 'pushed': (1, 1), 'write_nack': (24, 24)}), + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_INFO_FULL_FALSE': 0x0, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_INFO_FULL_TRUE': 0x1, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_INFO_PUSHED_FALSE': 0x0, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_INFO_PUSHED_TRUE': 0x1, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_INFO_WRITE_NACK_FALSE': 0x0, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_INFO_WRITE_NACK_TRUE': 0x1, + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_ADDR_LO': (0xB80000, lambda i: (0x00010000+(i)*16), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_ADDR_LO__SIZE_1': 6, + 'NV_VIRTUAL_FUNCTION_TIME_0': (0xB80000, 0x30080, {'nsec': (5, 31)}), + 'NV_VIRTUAL_FUNCTION_TIME_1': (0xB80000, 0x30084, {'nsec': (0, 28)}), + 'NV_VIRTUAL_FUNCTION_PRIV_DOORBELL': (0xB80000, 0x2200, {}), + 'NV_VIRTUAL_FUNCTION_DOORBELL': (0xB80000, 0x30090, {}), + 'NV_VIRTUAL_FUNCTION_ERR_CONT': (0xB80000, 0x30094, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_BAR1_BLOCK': (0xB80000, 0x00000F40, {'map': (0, 29), 'ptr': (0, 27), 'target': (28, 29), 'mode': (31, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_BAR1_BLOCK_PTR_0': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR1_BLOCK_TARGET_VID_MEM': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR1_BLOCK_TARGET_SYS_MEM_COHERENT': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR1_BLOCK_TARGET_SYS_MEM_NONCOHERENT': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR1_BLOCK_MODE_PHYSICAL': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR1_BLOCK_MODE_VIRTUAL': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK': (0xB80000, 0x00000F48, {'map': (0, 29), 'ptr': (0, 27), 'target': (28, 29), 'debug_cya': (30, 30), 'mode': (31, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_PTR_0': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_TARGET_VID_MEM': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_TARGET_SYS_MEM_COHERENT': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_TARGET_SYS_MEM_NONCOHERENT': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_DEBUG_CYA_OFF': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_DEBUG_CYA_ON': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_DEBUG_CYA_INIT': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_MODE_PHYSICAL': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BAR2_BLOCK_MODE_VIRTUAL': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS': (0xB80000, 0x00000F50, {'bar1_pending': (0, 0), 'bar1_outstanding': (1, 1), 'bar2_pending': (2, 2), 'bar2_outstanding': (3, 3)}), + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS_BAR1_PENDING_EMPTY': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS_BAR1_PENDING_BUSY': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS_BAR1_OUTSTANDING_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS_BAR1_OUTSTANDING_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS_BAR2_PENDING_EMPTY': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS_BAR2_PENDING_BUSY': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS_BAR2_OUTSTANDING_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_BIND_STATUS_BAR2_OUTSTANDING_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL': (0xB80000, lambda i: (0x0001000C+(i)*16), {'mask_bit': (0, 0)}), + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL__SIZE_1': 6, + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL_MASK_BIT_UNMASKED': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL_MASK_BIT_MASKED': 0x00000001, +} +gh100 = { + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_L2_SYSMEM_INVALIDATE': (0xB80000, 0x00000F10, {'token': (0, (31-1)), 'completed_token': (0, (31-1)), 'completed_status': (31, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_L2_SYSMEM_INVALIDATE_COMPLETED': 0x00000F14, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_L2_SYSMEM_INVALIDATE_COMPLETED_STATUS_BUSY': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_L2_PEERMEM_INVALIDATE': (0xB80000, 0x00000F18, {'token': (0, (31-1)), 'completed_token': (0, (31-1)), 'completed_status': (31, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_L2_PEERMEM_INVALIDATE_COMPLETED': 0x00000F1C, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_L2_PEERMEM_INVALIDATE_COMPLETED_STATUS_BUSY': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR': (0xB80000, 0x00000F70, {'mode': (9, 9), 'map': (10, 31), 'bar2_pending': (0, 0), 'bar2_outstanding': (1, 1), 'target': (10, 11), 'ptr': (12, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_MODE_PHYSICAL': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_TOP_SUBTREE': (0xB80000, lambda i: (i), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF__SIZE_1': (0xB80000, 16, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_SET__SIZE_1': (0xB80000, 16, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_CLEAR__SIZE_1': (0xB80000, 16, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_TIMER': (0xB80000, lambda i: (0x2300+(i)*4), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_TIMER__SIZE_1': 2, + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_ADDR_LO': (0xB80000, lambda i: (0x00010000+(i)*16), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_ADDR_HI': (0xB80000, lambda i: (0x00010004+(i)*16), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_DATA': (0xB80000, lambda i: (0x00010008+(i)*16), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL': (0xB80000, lambda i: (0x0001000C+(i)*16), {}), + 'NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL__SIZE_1': 9, + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_LO': (0xB80000, 0x00003108, {'base': (12, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_ACCESS_COUNTER_NOTIFY_BUFFER_HI': (0xB80000, 0x0000310C, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_DOORBELL': (0xB80000, 0x2200, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF': (0xB80000, lambda i: (0x1000+(i)*4), {'value': (0, 31), 'en_set_value': (0, 31), 'en_clear_value': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_VALUE_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_SET': (0xB80000, lambda i: (0x1200+(i)*4), {'value': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_SET_VALUE_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_CLEAR': (0xB80000, lambda i: (0x1400+(i)*4), {'value': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_CPU_INTR_LEAF_EN_CLEAR_VALUE_INIT': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_MMU_PAGE_FAULT_CTRL': (0xB80000, 0x00003070, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR': (0xB80000, 0x00000F60, {'map': (10, 31), 'bar1_pending': (0, 0), 'bar1_outstanding': (1, 1), 'mode': (9, 9), 'target': (10, 11), 'ptr': (12, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_BAR1_PENDING_EMPTY': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_BAR1_PENDING_BUSY': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_BAR1_OUTSTANDING_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_BAR1_OUTSTANDING_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_MODE_PHYSICAL': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_MODE_VIRTUAL': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_TARGET_VID_MEM': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_TARGET_SYS_MEM_COHERENT': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_TARGET_SYS_MEM_NONCOHERENT': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR_PTR_0': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_HIGH_ADDR': (0xB80000, 0x00000F64, {'ptr': (0, 31)}), + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_HIGH_ADDR_PTR_0': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_PTR_SHIFT': (0xB80000, 12, {}), + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_BAR2_PENDING_EMPTY': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_BAR2_PENDING_BUSY': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_BAR2_OUTSTANDING_FALSE': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_BAR2_OUTSTANDING_TRUE': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_MODE_VIRTUAL': 0x00000001, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_TARGET_VID_MEM': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_TARGET_SYS_MEM_COHERENT': 0x00000002, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_TARGET_SYS_MEM_NONCOHERENT': 0x00000003, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_LOW_ADDR_PTR_0': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_HIGH_ADDR': (0xB80000, 0x00000F74, {'ptr': (0, (52-33))}), + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_HIGH_ADDR_PTR_0': 0x00000000, + 'NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR2_BLOCK_PTR_SHIFT': (0xB80000, 12, {}), +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/nv_ref.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/nv_ref.py new file mode 100644 index 000000000..11aca6433 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nv_regs/nv_ref.py @@ -0,0 +1,75 @@ +regs = { + 'NV_CONFIG_PCI_NV_0': 0x00000000, + 'NV_CONFIG_PCI_NV_0_VENDOR_ID_NVIDIA': 0x000010DE, + 'NV_CONFIG_PCI_NV_1': 0x00000004, + 'NV_CONFIG_PCI_NV_1_IO_SPACE_DISABLED': 0x00000000, + 'NV_CONFIG_PCI_NV_1_IO_SPACE_ENABLED': 0x00000001, + 'NV_CONFIG_PCI_NV_1_MEMORY_SPACE_DISABLED': 0x00000000, + 'NV_CONFIG_PCI_NV_1_MEMORY_SPACE_ENABLED': 0x00000001, + 'NV_CONFIG_PCI_NV_1_BUS_MASTER_DISABLED': 0x00000000, + 'NV_CONFIG_PCI_NV_1_BUS_MASTER_ENABLED': 0x00000001, + 'NV_CONFIG_PCI_NV_2': 0x00000008, + 'NV_CONFIG_PCI_NV_3': 0x0000000C, + 'NV_CONFIG_PCI_NV_3_LATENCY_TIMER_0_CLOCKS': 0x00000000, + 'NV_CONFIG_PCI_NV_3_LATENCY_TIMER_8_CLOCKS': 0x00000001, + 'NV_CONFIG_PCI_NV_3_LATENCY_TIMER_240_CLOCKS': 0x0000001E, + 'NV_CONFIG_PCI_NV_3_LATENCY_TIMER_248_CLOCKS': 0x0000001F, + 'NV_CONFIG_PCI_NV_4': 0x00000010, + 'NV_CONFIG_PCI_NV_5': 0x00000014, + 'NV_CONFIG_PCI_NV_5_ADDRESS_TYPE_64_BIT': 0x00000002, + 'NV_CONFIG_PCI_NV_6': 0x00000018, + 'NV_CONFIG_PCI_NV_11': 0x0000002C, + 'NV_CONFIG_PCI_NV_11_SUBSYSTEM_VENDOR_ID_NONE': 0x00000000, + 'NV_CONFIG_PCI_NV_11_SUBSYSTEM_ID_NONE': 0x00000000, + 'NV_CONFIG_PCI_NV_11_SUBSYSTEM_ID_TNT2PRO': 0x0000001f, + 'NV_CONFIG_PCI_NV_12': 0x00000030, + 'NV_CONFIG_PCI_NV_13': 0x00000034, + 'NV_CONFIG_PCI_NV_14': 0x00000038, + 'NV_CONFIG_PCI_NV_15': 0x0000003C, + 'NV_PMC_BOOT_0': (0x0, 0x00000000, {'minor_revision': (0, 3), 'major_revision': (4, 7), 'architecture_1': (8, 8), 'implementation': (20, 23), 'architecture_0': (24, 28)}), + 'NV_PMC_BOOT_0_IMPLEMENTATION_0': 0x00000000, + 'NV_PMC_BOOT_0_IMPLEMENTATION_1': 0x00000001, + 'NV_PMC_BOOT_0_IMPLEMENTATION_2': 0x00000002, + 'NV_PMC_BOOT_0_IMPLEMENTATION_3': 0x00000003, + 'NV_PMC_BOOT_0_IMPLEMENTATION_4': 0x00000004, + 'NV_PMC_BOOT_0_IMPLEMENTATION_5': 0x00000005, + 'NV_PMC_BOOT_0_IMPLEMENTATION_6': 0x00000006, + 'NV_PMC_BOOT_0_IMPLEMENTATION_7': 0x00000007, + 'NV_PMC_BOOT_0_IMPLEMENTATION_8': 0x00000008, + 'NV_PMC_BOOT_0_IMPLEMENTATION_9': 0x00000009, + 'NV_PMC_BOOT_0_IMPLEMENTATION_A': 0x0000000A, + 'NV_PMC_BOOT_0_IMPLEMENTATION_B': 0x0000000B, + 'NV_PMC_BOOT_0_IMPLEMENTATION_C': 0x0000000C, + 'NV_PMC_BOOT_0_IMPLEMENTATION_D': 0x0000000D, + 'NV_PMC_BOOT_0_IMPLEMENTATION_E': 0x0000000E, + 'NV_PMC_BOOT_0_IMPLEMENTATION_F': 0x0000000F, + 'NV_PMC_BOOT_0_ARCHITECTURE_TU100': 0x00000016, + 'NV_PMC_BOOT_0_ARCHITECTURE_TU110': 0x00000016, + 'NV_PMC_BOOT_0_ARCHITECTURE_GA100': 0x00000017, + 'NV_PMC_BOOT_0_ARCHITECTURE_GH100': 0x00000018, + 'NV_PMC_BOOT_0_ARCHITECTURE_AD100': 0x00000019, + 'NV_PMC_BOOT_0_ARCHITECTURE_GB100': 0x0000001A, + 'NV_PMC_BOOT_0_ARCHITECTURE_GB200': 0x0000001B, + 'NV_PMC_BOOT_1': (0x0, 0x00000004, {'vgpu8': (8, 8), 'vgpu16': (16, 16), 'vgpu': (16, 17)}), + 'NV_PMC_BOOT_1_VGPU8_REAL': 0x00000000, + 'NV_PMC_BOOT_1_VGPU8_VIRTUAL': 0x00000001, + 'NV_PMC_BOOT_1_VGPU16_REAL': 0x00000000, + 'NV_PMC_BOOT_1_VGPU16_VIRTUAL': 0x00000001, + 'NV_PMC_BOOT_1_VGPU_REAL': 0x00000000, + 'NV_PMC_BOOT_1_VGPU_PV': 0x00000001, + 'NV_PMC_BOOT_1_VGPU_VF': 0x00000002, + 'NV_PMC_BOOT_42': (0x0, 0x00000A00, {'minor_extended_revision': (8, 11), 'minor_revision': (12, 15), 'major_revision': (16, 19), 'implementation': (20, 23), 'architecture': (24, 29), 'chip_id': (20, 29)}), + 'NV_PMC_BOOT_42_ARCHITECTURE_GM100': 0x00000011, + 'NV_PMC_BOOT_42_ARCHITECTURE_GM200': 0x00000012, + 'NV_PMC_BOOT_42_ARCHITECTURE_GP100': 0x00000013, + 'NV_PMC_BOOT_42_ARCHITECTURE_GV100': 0x00000014, + 'NV_PMC_BOOT_42_ARCHITECTURE_GV110': 0x00000015, + 'NV_PMC_BOOT_42_ARCHITECTURE_TU100': 0x00000016, + 'NV_PMC_BOOT_42_ARCHITECTURE_GA100': 0x00000017, + 'NV_PMC_BOOT_42_ARCHITECTURE_GH100': 0x00000018, + 'NV_PMC_BOOT_42_ARCHITECTURE_AD100': 0x00000019, + 'NV_PMC_BOOT_42_ARCHITECTURE_GB100': 0x0000001A, + 'NV_PMC_BOOT_42_ARCHITECTURE_GB200': 0x0000001B, + 'NV_PMC_BOOT_42_ARCHITECTURE_AMODEL': 0x0000001F, + 'NV_PMC_BOOT_42_CHIP_ID_GA100': 0x00000170, +} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nvjitlink.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nvjitlink.py new file mode 100644 index 000000000..eb9a013a8 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nvjitlink.py @@ -0,0 +1,42 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +import sysconfig +dll = c.DLL('nvjitlink', 'nvJitLink', [f'/{pre}/cuda/targets/{tgt}/lib' for pre in ['opt', 'usr/local'] for tgt in [sysconfig.get_config_vars().get("MULTIARCH", "").rsplit("-", 1)[0], 'sbsa-linux']]) +nvJitLinkResult: dict[int, str] = {(NVJITLINK_SUCCESS:=0): 'NVJITLINK_SUCCESS', (NVJITLINK_ERROR_UNRECOGNIZED_OPTION:=1): 'NVJITLINK_ERROR_UNRECOGNIZED_OPTION', (NVJITLINK_ERROR_MISSING_ARCH:=2): 'NVJITLINK_ERROR_MISSING_ARCH', (NVJITLINK_ERROR_INVALID_INPUT:=3): 'NVJITLINK_ERROR_INVALID_INPUT', (NVJITLINK_ERROR_PTX_COMPILE:=4): 'NVJITLINK_ERROR_PTX_COMPILE', (NVJITLINK_ERROR_NVVM_COMPILE:=5): 'NVJITLINK_ERROR_NVVM_COMPILE', (NVJITLINK_ERROR_INTERNAL:=6): 'NVJITLINK_ERROR_INTERNAL'} +nvJitLinkInputType: dict[int, str] = {(NVJITLINK_INPUT_NONE:=0): 'NVJITLINK_INPUT_NONE', (NVJITLINK_INPUT_CUBIN:=1): 'NVJITLINK_INPUT_CUBIN', (NVJITLINK_INPUT_PTX:=2): 'NVJITLINK_INPUT_PTX', (NVJITLINK_INPUT_LTOIR:=3): 'NVJITLINK_INPUT_LTOIR', (NVJITLINK_INPUT_FATBIN:=4): 'NVJITLINK_INPUT_FATBIN', (NVJITLINK_INPUT_OBJECT:=5): 'NVJITLINK_INPUT_OBJECT', (NVJITLINK_INPUT_LIBRARY:=6): 'NVJITLINK_INPUT_LIBRARY'} +class struct_nvJitLink(c.Struct): pass +nvJitLinkHandle: TypeAlias = c.POINTER[struct_nvJitLink] +uint32_t: TypeAlias = ctypes.c_uint32 +@dll.bind(ctypes.c_uint32, c.POINTER[nvJitLinkHandle], uint32_t, c.POINTER[c.POINTER[ctypes.c_char]]) +def nvJitLinkCreate(handle:c.POINTER[nvJitLinkHandle], numOptions:uint32_t, options:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nvJitLinkHandle]) +def nvJitLinkDestroy(handle:c.POINTER[nvJitLinkHandle]) -> ctypes.c_uint32: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, ctypes.c_uint32, ctypes.c_void_p, size_t, c.POINTER[ctypes.c_char]) +def nvJitLinkAddData(handle:nvJitLinkHandle, inputType:ctypes.c_uint32, data:ctypes.c_void_p, size:size_t, name:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, ctypes.c_uint32, c.POINTER[ctypes.c_char]) +def nvJitLinkAddFile(handle:nvJitLinkHandle, inputType:ctypes.c_uint32, fileName:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle) +def nvJitLinkComplete(handle:nvJitLinkHandle) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, c.POINTER[size_t]) +def nvJitLinkGetLinkedCubinSize(handle:nvJitLinkHandle, size:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, ctypes.c_void_p) +def nvJitLinkGetLinkedCubin(handle:nvJitLinkHandle, cubin:ctypes.c_void_p) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, c.POINTER[size_t]) +def nvJitLinkGetLinkedPtxSize(handle:nvJitLinkHandle, size:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, c.POINTER[ctypes.c_char]) +def nvJitLinkGetLinkedPtx(handle:nvJitLinkHandle, ptx:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, c.POINTER[size_t]) +def nvJitLinkGetErrorLogSize(handle:nvJitLinkHandle, size:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, c.POINTER[ctypes.c_char]) +def nvJitLinkGetErrorLog(handle:nvJitLinkHandle, log:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, c.POINTER[size_t]) +def nvJitLinkGetInfoLogSize(handle:nvJitLinkHandle, size:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvJitLinkHandle, c.POINTER[ctypes.c_char]) +def nvJitLinkGetInfoLog(handle:nvJitLinkHandle, log:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_uint32], c.POINTER[ctypes.c_uint32]) +def nvJitLinkVersion(major:c.POINTER[ctypes.c_uint32], minor:c.POINTER[ctypes.c_uint32]) -> ctypes.c_uint32: ... diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/nvrtc.py b/artifacts/package_runtime/tinygrad/runtime/autogen/nvrtc.py new file mode 100644 index 000000000..b8e50c9fb --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/nvrtc.py @@ -0,0 +1,55 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +import sysconfig +dll = c.DLL('nvrtc', 'nvrtc', [f'/{pre}/cuda/targets/{tgt}/lib' for pre in ['opt', 'usr/local'] for tgt in [sysconfig.get_config_vars().get("MULTIARCH", "").rsplit("-", 1)[0], 'sbsa-linux']]) +nvrtcResult: dict[int, str] = {(NVRTC_SUCCESS:=0): 'NVRTC_SUCCESS', (NVRTC_ERROR_OUT_OF_MEMORY:=1): 'NVRTC_ERROR_OUT_OF_MEMORY', (NVRTC_ERROR_PROGRAM_CREATION_FAILURE:=2): 'NVRTC_ERROR_PROGRAM_CREATION_FAILURE', (NVRTC_ERROR_INVALID_INPUT:=3): 'NVRTC_ERROR_INVALID_INPUT', (NVRTC_ERROR_INVALID_PROGRAM:=4): 'NVRTC_ERROR_INVALID_PROGRAM', (NVRTC_ERROR_INVALID_OPTION:=5): 'NVRTC_ERROR_INVALID_OPTION', (NVRTC_ERROR_COMPILATION:=6): 'NVRTC_ERROR_COMPILATION', (NVRTC_ERROR_BUILTIN_OPERATION_FAILURE:=7): 'NVRTC_ERROR_BUILTIN_OPERATION_FAILURE', (NVRTC_ERROR_NO_NAME_EXPRESSIONS_AFTER_COMPILATION:=8): 'NVRTC_ERROR_NO_NAME_EXPRESSIONS_AFTER_COMPILATION', (NVRTC_ERROR_NO_LOWERED_NAMES_BEFORE_COMPILATION:=9): 'NVRTC_ERROR_NO_LOWERED_NAMES_BEFORE_COMPILATION', (NVRTC_ERROR_NAME_EXPRESSION_NOT_VALID:=10): 'NVRTC_ERROR_NAME_EXPRESSION_NOT_VALID', (NVRTC_ERROR_INTERNAL_ERROR:=11): 'NVRTC_ERROR_INTERNAL_ERROR'} +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32) +def nvrtcGetErrorString(result:ctypes.c_uint32) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32], c.POINTER[ctypes.c_int32]) +def nvrtcVersion(major:c.POINTER[ctypes.c_int32], minor:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32]) +def nvrtcGetNumSupportedArchs(numArchs:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_int32]) +def nvrtcGetSupportedArchs(supportedArchs:c.POINTER[ctypes.c_int32]) -> ctypes.c_uint32: ... +class struct__nvrtcProgram(c.Struct): pass +nvrtcProgram: TypeAlias = c.POINTER[struct__nvrtcProgram] +@dll.bind(ctypes.c_uint32, c.POINTER[nvrtcProgram], c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[c.POINTER[ctypes.c_char]]) +def nvrtcCreateProgram(prog:c.POINTER[nvrtcProgram], src:c.POINTER[ctypes.c_char], name:c.POINTER[ctypes.c_char], numHeaders:int, headers:c.POINTER[c.POINTER[ctypes.c_char]], includeNames:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, c.POINTER[nvrtcProgram]) +def nvrtcDestroyProgram(prog:c.POINTER[nvrtcProgram]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, ctypes.c_int32, c.POINTER[c.POINTER[ctypes.c_char]]) +def nvrtcCompileProgram(prog:nvrtcProgram, numOptions:int, options:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +size_t: TypeAlias = ctypes.c_uint64 +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[size_t]) +def nvrtcGetPTXSize(prog:nvrtcProgram, ptxSizeRet:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[ctypes.c_char]) +def nvrtcGetPTX(prog:nvrtcProgram, ptx:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[size_t]) +def nvrtcGetCUBINSize(prog:nvrtcProgram, cubinSizeRet:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[ctypes.c_char]) +def nvrtcGetCUBIN(prog:nvrtcProgram, cubin:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[size_t]) +def nvrtcGetNVVMSize(prog:nvrtcProgram, nvvmSizeRet:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[ctypes.c_char]) +def nvrtcGetNVVM(prog:nvrtcProgram, nvvm:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[size_t]) +def nvrtcGetLTOIRSize(prog:nvrtcProgram, LTOIRSizeRet:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[ctypes.c_char]) +def nvrtcGetLTOIR(prog:nvrtcProgram, LTOIR:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[size_t]) +def nvrtcGetOptiXIRSize(prog:nvrtcProgram, optixirSizeRet:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[ctypes.c_char]) +def nvrtcGetOptiXIR(prog:nvrtcProgram, optixir:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[size_t]) +def nvrtcGetProgramLogSize(prog:nvrtcProgram, logSizeRet:c.POINTER[size_t]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[ctypes.c_char]) +def nvrtcGetProgramLog(prog:nvrtcProgram, log:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[ctypes.c_char]) +def nvrtcAddNameExpression(prog:nvrtcProgram, name_expression:c.POINTER[ctypes.c_char]) -> ctypes.c_uint32: ... +@dll.bind(ctypes.c_uint32, nvrtcProgram, c.POINTER[ctypes.c_char], c.POINTER[c.POINTER[ctypes.c_char]]) +def nvrtcGetLoweredName(prog:nvrtcProgram, name_expression:c.POINTER[ctypes.c_char], lowered_name:c.POINTER[c.POINTER[ctypes.c_char]]) -> ctypes.c_uint32: ... +__DEPRECATED__ = lambda msg: __attribute__((deprecated(msg))) # type: ignore \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/opencl.py b/artifacts/package_runtime/tinygrad/runtime/autogen/opencl.py new file mode 100644 index 000000000..832ee205e --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/opencl.py @@ -0,0 +1,812 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +dll = c.DLL('opencl', 'OpenCL') +class struct__cl_platform_id(c.Struct): pass +cl_platform_id: TypeAlias = c.POINTER[struct__cl_platform_id] +class struct__cl_device_id(c.Struct): pass +cl_device_id: TypeAlias = c.POINTER[struct__cl_device_id] +class struct__cl_context(c.Struct): pass +cl_context: TypeAlias = c.POINTER[struct__cl_context] +class struct__cl_command_queue(c.Struct): pass +cl_command_queue: TypeAlias = c.POINTER[struct__cl_command_queue] +class struct__cl_mem(c.Struct): pass +cl_mem: TypeAlias = c.POINTER[struct__cl_mem] +class struct__cl_program(c.Struct): pass +cl_program: TypeAlias = c.POINTER[struct__cl_program] +class struct__cl_kernel(c.Struct): pass +cl_kernel: TypeAlias = c.POINTER[struct__cl_kernel] +class struct__cl_event(c.Struct): pass +cl_event: TypeAlias = c.POINTER[struct__cl_event] +class struct__cl_sampler(c.Struct): pass +cl_sampler: TypeAlias = c.POINTER[struct__cl_sampler] +cl_bool: TypeAlias = ctypes.c_uint32 +cl_bitfield: TypeAlias = ctypes.c_uint64 +cl_properties: TypeAlias = ctypes.c_uint64 +cl_device_type: TypeAlias = ctypes.c_uint64 +cl_platform_info: TypeAlias = ctypes.c_uint32 +cl_device_info: TypeAlias = ctypes.c_uint32 +cl_device_fp_config: TypeAlias = ctypes.c_uint64 +cl_device_mem_cache_type: TypeAlias = ctypes.c_uint32 +cl_device_local_mem_type: TypeAlias = ctypes.c_uint32 +cl_device_exec_capabilities: TypeAlias = ctypes.c_uint64 +cl_device_svm_capabilities: TypeAlias = ctypes.c_uint64 +cl_command_queue_properties: TypeAlias = ctypes.c_uint64 +cl_device_partition_property: TypeAlias = ctypes.c_int64 +cl_device_affinity_domain: TypeAlias = ctypes.c_uint64 +cl_context_properties: TypeAlias = ctypes.c_int64 +cl_context_info: TypeAlias = ctypes.c_uint32 +cl_queue_properties: TypeAlias = ctypes.c_uint64 +cl_command_queue_info: TypeAlias = ctypes.c_uint32 +cl_channel_order: TypeAlias = ctypes.c_uint32 +cl_channel_type: TypeAlias = ctypes.c_uint32 +cl_mem_flags: TypeAlias = ctypes.c_uint64 +cl_svm_mem_flags: TypeAlias = ctypes.c_uint64 +cl_mem_object_type: TypeAlias = ctypes.c_uint32 +cl_mem_info: TypeAlias = ctypes.c_uint32 +cl_mem_migration_flags: TypeAlias = ctypes.c_uint64 +cl_image_info: TypeAlias = ctypes.c_uint32 +cl_buffer_create_type: TypeAlias = ctypes.c_uint32 +cl_addressing_mode: TypeAlias = ctypes.c_uint32 +cl_filter_mode: TypeAlias = ctypes.c_uint32 +cl_sampler_info: TypeAlias = ctypes.c_uint32 +cl_map_flags: TypeAlias = ctypes.c_uint64 +cl_pipe_properties: TypeAlias = ctypes.c_int64 +cl_pipe_info: TypeAlias = ctypes.c_uint32 +cl_program_info: TypeAlias = ctypes.c_uint32 +cl_program_build_info: TypeAlias = ctypes.c_uint32 +cl_program_binary_type: TypeAlias = ctypes.c_uint32 +cl_build_status: TypeAlias = ctypes.c_int32 +cl_kernel_info: TypeAlias = ctypes.c_uint32 +cl_kernel_arg_info: TypeAlias = ctypes.c_uint32 +cl_kernel_arg_address_qualifier: TypeAlias = ctypes.c_uint32 +cl_kernel_arg_access_qualifier: TypeAlias = ctypes.c_uint32 +cl_kernel_arg_type_qualifier: TypeAlias = ctypes.c_uint64 +cl_kernel_work_group_info: TypeAlias = ctypes.c_uint32 +cl_kernel_sub_group_info: TypeAlias = ctypes.c_uint32 +cl_event_info: TypeAlias = ctypes.c_uint32 +cl_command_type: TypeAlias = ctypes.c_uint32 +cl_profiling_info: TypeAlias = ctypes.c_uint32 +cl_sampler_properties: TypeAlias = ctypes.c_uint64 +cl_kernel_exec_info: TypeAlias = ctypes.c_uint32 +cl_device_atomic_capabilities: TypeAlias = ctypes.c_uint64 +cl_device_device_enqueue_capabilities: TypeAlias = ctypes.c_uint64 +cl_khronos_vendor_id: TypeAlias = ctypes.c_uint32 +cl_mem_properties: TypeAlias = ctypes.c_uint64 +cl_version: TypeAlias = ctypes.c_uint32 +@c.record +class struct__cl_image_format(c.Struct): + SIZE = 8 + image_channel_order: int + image_channel_data_type: int +struct__cl_image_format.register_fields([('image_channel_order', cl_channel_order, 0), ('image_channel_data_type', cl_channel_type, 4)]) +cl_image_format: TypeAlias = struct__cl_image_format +@c.record +class struct__cl_image_desc(c.Struct): + SIZE = 72 + image_type: int + image_width: int + image_height: int + image_depth: int + image_array_size: int + image_row_pitch: int + image_slice_pitch: int + num_mip_levels: int + num_samples: int + buffer: c.POINTER[struct__cl_mem] + mem_object: c.POINTER[struct__cl_mem] +size_t: TypeAlias = ctypes.c_uint64 +cl_uint: TypeAlias = ctypes.c_uint32 +struct__cl_image_desc.register_fields([('image_type', cl_mem_object_type, 0), ('image_width', size_t, 8), ('image_height', size_t, 16), ('image_depth', size_t, 24), ('image_array_size', size_t, 32), ('image_row_pitch', size_t, 40), ('image_slice_pitch', size_t, 48), ('num_mip_levels', cl_uint, 56), ('num_samples', cl_uint, 60), ('buffer', cl_mem, 64), ('mem_object', cl_mem, 64)]) +cl_image_desc: TypeAlias = struct__cl_image_desc +@c.record +class struct__cl_buffer_region(c.Struct): + SIZE = 16 + origin: int + size: int +struct__cl_buffer_region.register_fields([('origin', size_t, 0), ('size', size_t, 8)]) +cl_buffer_region: TypeAlias = struct__cl_buffer_region +@c.record +class struct__cl_name_version(c.Struct): + SIZE = 68 + version: int + name: c.Array[ctypes.c_char, Literal[64]] +struct__cl_name_version.register_fields([('version', cl_version, 0), ('name', c.Array[ctypes.c_char, Literal[64]], 4)]) +cl_name_version: TypeAlias = struct__cl_name_version +cl_int: TypeAlias = ctypes.c_int32 +@dll.bind(cl_int, cl_uint, c.POINTER[cl_platform_id], c.POINTER[cl_uint]) +def clGetPlatformIDs(num_entries:cl_uint, platforms:c.POINTER[cl_platform_id], num_platforms:c.POINTER[cl_uint]) -> cl_int: ... +@dll.bind(cl_int, cl_platform_id, cl_platform_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetPlatformInfo(platform:cl_platform_id, param_name:cl_platform_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_platform_id, cl_device_type, cl_uint, c.POINTER[cl_device_id], c.POINTER[cl_uint]) +def clGetDeviceIDs(platform:cl_platform_id, device_type:cl_device_type, num_entries:cl_uint, devices:c.POINTER[cl_device_id], num_devices:c.POINTER[cl_uint]) -> cl_int: ... +@dll.bind(cl_int, cl_device_id, cl_device_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetDeviceInfo(device:cl_device_id, param_name:cl_device_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_device_id, c.POINTER[cl_device_partition_property], cl_uint, c.POINTER[cl_device_id], c.POINTER[cl_uint]) +def clCreateSubDevices(in_device:cl_device_id, properties:c.POINTER[cl_device_partition_property], num_devices:cl_uint, out_devices:c.POINTER[cl_device_id], num_devices_ret:c.POINTER[cl_uint]) -> cl_int: ... +@dll.bind(cl_int, cl_device_id) +def clRetainDevice(device:cl_device_id) -> cl_int: ... +@dll.bind(cl_int, cl_device_id) +def clReleaseDevice(device:cl_device_id) -> cl_int: ... +@dll.bind(cl_int, cl_context, cl_device_id, cl_command_queue) +def clSetDefaultDeviceCommandQueue(context:cl_context, device:cl_device_id, command_queue:cl_command_queue) -> cl_int: ... +cl_ulong: TypeAlias = ctypes.c_uint64 +@dll.bind(cl_int, cl_device_id, c.POINTER[cl_ulong], c.POINTER[cl_ulong]) +def clGetDeviceAndHostTimer(device:cl_device_id, device_timestamp:c.POINTER[cl_ulong], host_timestamp:c.POINTER[cl_ulong]) -> cl_int: ... +@dll.bind(cl_int, cl_device_id, c.POINTER[cl_ulong]) +def clGetHostTimer(device:cl_device_id, host_timestamp:c.POINTER[cl_ulong]) -> cl_int: ... +@dll.bind(cl_context, c.POINTER[cl_context_properties], cl_uint, c.POINTER[cl_device_id], c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p, size_t, ctypes.c_void_p]], ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateContext(properties:c.POINTER[cl_context_properties], num_devices:cl_uint, devices:c.POINTER[cl_device_id], pfn_notify:c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p, size_t, ctypes.c_void_p]], user_data:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_context: ... +@dll.bind(cl_context, c.POINTER[cl_context_properties], cl_device_type, c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p, size_t, ctypes.c_void_p]], ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateContextFromType(properties:c.POINTER[cl_context_properties], device_type:cl_device_type, pfn_notify:c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], ctypes.c_void_p, size_t, ctypes.c_void_p]], user_data:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_context: ... +@dll.bind(cl_int, cl_context) +def clRetainContext(context:cl_context) -> cl_int: ... +@dll.bind(cl_int, cl_context) +def clReleaseContext(context:cl_context) -> cl_int: ... +@dll.bind(cl_int, cl_context, cl_context_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetContextInfo(context:cl_context, param_name:cl_context_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_context, c.CFUNCTYPE[None, [cl_context, ctypes.c_void_p]], ctypes.c_void_p) +def clSetContextDestructorCallback(context:cl_context, pfn_notify:c.CFUNCTYPE[None, [cl_context, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_command_queue, cl_context, cl_device_id, c.POINTER[cl_queue_properties], c.POINTER[cl_int]) +def clCreateCommandQueueWithProperties(context:cl_context, device:cl_device_id, properties:c.POINTER[cl_queue_properties], errcode_ret:c.POINTER[cl_int]) -> cl_command_queue: ... +@dll.bind(cl_int, cl_command_queue) +def clRetainCommandQueue(command_queue:cl_command_queue) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue) +def clReleaseCommandQueue(command_queue:cl_command_queue) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_command_queue_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetCommandQueueInfo(command_queue:cl_command_queue, param_name:cl_command_queue_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_mem, cl_context, cl_mem_flags, size_t, ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateBuffer(context:cl_context, flags:cl_mem_flags, size:size_t, host_ptr:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_mem: ... +@dll.bind(cl_mem, cl_mem, cl_mem_flags, cl_buffer_create_type, ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateSubBuffer(buffer:cl_mem, flags:cl_mem_flags, buffer_create_type:cl_buffer_create_type, buffer_create_info:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_mem: ... +@dll.bind(cl_mem, cl_context, cl_mem_flags, c.POINTER[cl_image_format], c.POINTER[cl_image_desc], ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateImage(context:cl_context, flags:cl_mem_flags, image_format:c.POINTER[cl_image_format], image_desc:c.POINTER[cl_image_desc], host_ptr:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_mem: ... +@dll.bind(cl_mem, cl_context, cl_mem_flags, cl_uint, cl_uint, c.POINTER[cl_pipe_properties], c.POINTER[cl_int]) +def clCreatePipe(context:cl_context, flags:cl_mem_flags, pipe_packet_size:cl_uint, pipe_max_packets:cl_uint, properties:c.POINTER[cl_pipe_properties], errcode_ret:c.POINTER[cl_int]) -> cl_mem: ... +@dll.bind(cl_mem, cl_context, c.POINTER[cl_mem_properties], cl_mem_flags, size_t, ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateBufferWithProperties(context:cl_context, properties:c.POINTER[cl_mem_properties], flags:cl_mem_flags, size:size_t, host_ptr:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_mem: ... +@dll.bind(cl_mem, cl_context, c.POINTER[cl_mem_properties], cl_mem_flags, c.POINTER[cl_image_format], c.POINTER[cl_image_desc], ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateImageWithProperties(context:cl_context, properties:c.POINTER[cl_mem_properties], flags:cl_mem_flags, image_format:c.POINTER[cl_image_format], image_desc:c.POINTER[cl_image_desc], host_ptr:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_mem: ... +@dll.bind(cl_int, cl_mem) +def clRetainMemObject(memobj:cl_mem) -> cl_int: ... +@dll.bind(cl_int, cl_mem) +def clReleaseMemObject(memobj:cl_mem) -> cl_int: ... +@dll.bind(cl_int, cl_context, cl_mem_flags, cl_mem_object_type, cl_uint, c.POINTER[cl_image_format], c.POINTER[cl_uint]) +def clGetSupportedImageFormats(context:cl_context, flags:cl_mem_flags, image_type:cl_mem_object_type, num_entries:cl_uint, image_formats:c.POINTER[cl_image_format], num_image_formats:c.POINTER[cl_uint]) -> cl_int: ... +@dll.bind(cl_int, cl_mem, cl_mem_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetMemObjectInfo(memobj:cl_mem, param_name:cl_mem_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_mem, cl_image_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetImageInfo(image:cl_mem, param_name:cl_image_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_mem, cl_pipe_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetPipeInfo(pipe:cl_mem, param_name:cl_pipe_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_mem, c.CFUNCTYPE[None, [cl_mem, ctypes.c_void_p]], ctypes.c_void_p) +def clSetMemObjectDestructorCallback(memobj:cl_mem, pfn_notify:c.CFUNCTYPE[None, [cl_mem, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> cl_int: ... +@dll.bind(ctypes.c_void_p, cl_context, cl_svm_mem_flags, size_t, cl_uint) +def clSVMAlloc(context:cl_context, flags:cl_svm_mem_flags, size:size_t, alignment:cl_uint) -> ctypes.c_void_p: ... +@dll.bind(None, cl_context, ctypes.c_void_p) +def clSVMFree(context:cl_context, svm_pointer:ctypes.c_void_p) -> None: ... +@dll.bind(cl_sampler, cl_context, c.POINTER[cl_sampler_properties], c.POINTER[cl_int]) +def clCreateSamplerWithProperties(context:cl_context, sampler_properties:c.POINTER[cl_sampler_properties], errcode_ret:c.POINTER[cl_int]) -> cl_sampler: ... +@dll.bind(cl_int, cl_sampler) +def clRetainSampler(sampler:cl_sampler) -> cl_int: ... +@dll.bind(cl_int, cl_sampler) +def clReleaseSampler(sampler:cl_sampler) -> cl_int: ... +@dll.bind(cl_int, cl_sampler, cl_sampler_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetSamplerInfo(sampler:cl_sampler, param_name:cl_sampler_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_program, cl_context, cl_uint, c.POINTER[c.POINTER[ctypes.c_char]], c.POINTER[size_t], c.POINTER[cl_int]) +def clCreateProgramWithSource(context:cl_context, count:cl_uint, strings:c.POINTER[c.POINTER[ctypes.c_char]], lengths:c.POINTER[size_t], errcode_ret:c.POINTER[cl_int]) -> cl_program: ... +@dll.bind(cl_program, cl_context, cl_uint, c.POINTER[cl_device_id], c.POINTER[size_t], c.POINTER[c.POINTER[ctypes.c_ubyte]], c.POINTER[cl_int], c.POINTER[cl_int]) +def clCreateProgramWithBinary(context:cl_context, num_devices:cl_uint, device_list:c.POINTER[cl_device_id], lengths:c.POINTER[size_t], binaries:c.POINTER[c.POINTER[ctypes.c_ubyte]], binary_status:c.POINTER[cl_int], errcode_ret:c.POINTER[cl_int]) -> cl_program: ... +@dll.bind(cl_program, cl_context, cl_uint, c.POINTER[cl_device_id], c.POINTER[ctypes.c_char], c.POINTER[cl_int]) +def clCreateProgramWithBuiltInKernels(context:cl_context, num_devices:cl_uint, device_list:c.POINTER[cl_device_id], kernel_names:c.POINTER[ctypes.c_char], errcode_ret:c.POINTER[cl_int]) -> cl_program: ... +@dll.bind(cl_program, cl_context, ctypes.c_void_p, size_t, c.POINTER[cl_int]) +def clCreateProgramWithIL(context:cl_context, il:ctypes.c_void_p, length:size_t, errcode_ret:c.POINTER[cl_int]) -> cl_program: ... +@dll.bind(cl_int, cl_program) +def clRetainProgram(program:cl_program) -> cl_int: ... +@dll.bind(cl_int, cl_program) +def clReleaseProgram(program:cl_program) -> cl_int: ... +@dll.bind(cl_int, cl_program, cl_uint, c.POINTER[cl_device_id], c.POINTER[ctypes.c_char], c.CFUNCTYPE[None, [cl_program, ctypes.c_void_p]], ctypes.c_void_p) +def clBuildProgram(program:cl_program, num_devices:cl_uint, device_list:c.POINTER[cl_device_id], options:c.POINTER[ctypes.c_char], pfn_notify:c.CFUNCTYPE[None, [cl_program, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_int, cl_program, cl_uint, c.POINTER[cl_device_id], c.POINTER[ctypes.c_char], cl_uint, c.POINTER[cl_program], c.POINTER[c.POINTER[ctypes.c_char]], c.CFUNCTYPE[None, [cl_program, ctypes.c_void_p]], ctypes.c_void_p) +def clCompileProgram(program:cl_program, num_devices:cl_uint, device_list:c.POINTER[cl_device_id], options:c.POINTER[ctypes.c_char], num_input_headers:cl_uint, input_headers:c.POINTER[cl_program], header_include_names:c.POINTER[c.POINTER[ctypes.c_char]], pfn_notify:c.CFUNCTYPE[None, [cl_program, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_program, cl_context, cl_uint, c.POINTER[cl_device_id], c.POINTER[ctypes.c_char], cl_uint, c.POINTER[cl_program], c.CFUNCTYPE[None, [cl_program, ctypes.c_void_p]], ctypes.c_void_p, c.POINTER[cl_int]) +def clLinkProgram(context:cl_context, num_devices:cl_uint, device_list:c.POINTER[cl_device_id], options:c.POINTER[ctypes.c_char], num_input_programs:cl_uint, input_programs:c.POINTER[cl_program], pfn_notify:c.CFUNCTYPE[None, [cl_program, ctypes.c_void_p]], user_data:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_program: ... +@dll.bind(cl_int, cl_program, c.CFUNCTYPE[None, [cl_program, ctypes.c_void_p]], ctypes.c_void_p) +def clSetProgramReleaseCallback(program:cl_program, pfn_notify:c.CFUNCTYPE[None, [cl_program, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_int, cl_program, cl_uint, size_t, ctypes.c_void_p) +def clSetProgramSpecializationConstant(program:cl_program, spec_id:cl_uint, spec_size:size_t, spec_value:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_int, cl_platform_id) +def clUnloadPlatformCompiler(platform:cl_platform_id) -> cl_int: ... +@dll.bind(cl_int, cl_program, cl_program_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetProgramInfo(program:cl_program, param_name:cl_program_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_program, cl_device_id, cl_program_build_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetProgramBuildInfo(program:cl_program, device:cl_device_id, param_name:cl_program_build_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_kernel, cl_program, c.POINTER[ctypes.c_char], c.POINTER[cl_int]) +def clCreateKernel(program:cl_program, kernel_name:c.POINTER[ctypes.c_char], errcode_ret:c.POINTER[cl_int]) -> cl_kernel: ... +@dll.bind(cl_int, cl_program, cl_uint, c.POINTER[cl_kernel], c.POINTER[cl_uint]) +def clCreateKernelsInProgram(program:cl_program, num_kernels:cl_uint, kernels:c.POINTER[cl_kernel], num_kernels_ret:c.POINTER[cl_uint]) -> cl_int: ... +@dll.bind(cl_kernel, cl_kernel, c.POINTER[cl_int]) +def clCloneKernel(source_kernel:cl_kernel, errcode_ret:c.POINTER[cl_int]) -> cl_kernel: ... +@dll.bind(cl_int, cl_kernel) +def clRetainKernel(kernel:cl_kernel) -> cl_int: ... +@dll.bind(cl_int, cl_kernel) +def clReleaseKernel(kernel:cl_kernel) -> cl_int: ... +@dll.bind(cl_int, cl_kernel, cl_uint, size_t, ctypes.c_void_p) +def clSetKernelArg(kernel:cl_kernel, arg_index:cl_uint, arg_size:size_t, arg_value:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_int, cl_kernel, cl_uint, ctypes.c_void_p) +def clSetKernelArgSVMPointer(kernel:cl_kernel, arg_index:cl_uint, arg_value:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_int, cl_kernel, cl_kernel_exec_info, size_t, ctypes.c_void_p) +def clSetKernelExecInfo(kernel:cl_kernel, param_name:cl_kernel_exec_info, param_value_size:size_t, param_value:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_int, cl_kernel, cl_kernel_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetKernelInfo(kernel:cl_kernel, param_name:cl_kernel_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_kernel, cl_uint, cl_kernel_arg_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetKernelArgInfo(kernel:cl_kernel, arg_indx:cl_uint, param_name:cl_kernel_arg_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_kernel, cl_device_id, cl_kernel_work_group_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetKernelWorkGroupInfo(kernel:cl_kernel, device:cl_device_id, param_name:cl_kernel_work_group_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_kernel, cl_device_id, cl_kernel_sub_group_info, size_t, ctypes.c_void_p, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetKernelSubGroupInfo(kernel:cl_kernel, device:cl_device_id, param_name:cl_kernel_sub_group_info, input_value_size:size_t, input_value:ctypes.c_void_p, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_uint, c.POINTER[cl_event]) +def clWaitForEvents(num_events:cl_uint, event_list:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_event, cl_event_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetEventInfo(event:cl_event, param_name:cl_event_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_event, cl_context, c.POINTER[cl_int]) +def clCreateUserEvent(context:cl_context, errcode_ret:c.POINTER[cl_int]) -> cl_event: ... +@dll.bind(cl_int, cl_event) +def clRetainEvent(event:cl_event) -> cl_int: ... +@dll.bind(cl_int, cl_event) +def clReleaseEvent(event:cl_event) -> cl_int: ... +@dll.bind(cl_int, cl_event, cl_int) +def clSetUserEventStatus(event:cl_event, execution_status:cl_int) -> cl_int: ... +@dll.bind(cl_int, cl_event, cl_int, c.CFUNCTYPE[None, [cl_event, cl_int, ctypes.c_void_p]], ctypes.c_void_p) +def clSetEventCallback(event:cl_event, command_exec_callback_type:cl_int, pfn_notify:c.CFUNCTYPE[None, [cl_event, cl_int, ctypes.c_void_p]], user_data:ctypes.c_void_p) -> cl_int: ... +@dll.bind(cl_int, cl_event, cl_profiling_info, size_t, ctypes.c_void_p, c.POINTER[size_t]) +def clGetEventProfilingInfo(event:cl_event, param_name:cl_profiling_info, param_value_size:size_t, param_value:ctypes.c_void_p, param_value_size_ret:c.POINTER[size_t]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue) +def clFlush(command_queue:cl_command_queue) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue) +def clFinish(command_queue:cl_command_queue) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_bool, size_t, size_t, ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueReadBuffer(command_queue:cl_command_queue, buffer:cl_mem, blocking_read:cl_bool, offset:size_t, size:size_t, ptr:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_bool, c.POINTER[size_t], c.POINTER[size_t], c.POINTER[size_t], size_t, size_t, size_t, size_t, ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueReadBufferRect(command_queue:cl_command_queue, buffer:cl_mem, blocking_read:cl_bool, buffer_origin:c.POINTER[size_t], host_origin:c.POINTER[size_t], region:c.POINTER[size_t], buffer_row_pitch:size_t, buffer_slice_pitch:size_t, host_row_pitch:size_t, host_slice_pitch:size_t, ptr:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_bool, size_t, size_t, ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueWriteBuffer(command_queue:cl_command_queue, buffer:cl_mem, blocking_write:cl_bool, offset:size_t, size:size_t, ptr:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_bool, c.POINTER[size_t], c.POINTER[size_t], c.POINTER[size_t], size_t, size_t, size_t, size_t, ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueWriteBufferRect(command_queue:cl_command_queue, buffer:cl_mem, blocking_write:cl_bool, buffer_origin:c.POINTER[size_t], host_origin:c.POINTER[size_t], region:c.POINTER[size_t], buffer_row_pitch:size_t, buffer_slice_pitch:size_t, host_row_pitch:size_t, host_slice_pitch:size_t, ptr:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, ctypes.c_void_p, size_t, size_t, size_t, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueFillBuffer(command_queue:cl_command_queue, buffer:cl_mem, pattern:ctypes.c_void_p, pattern_size:size_t, offset:size_t, size:size_t, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_mem, size_t, size_t, size_t, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueCopyBuffer(command_queue:cl_command_queue, src_buffer:cl_mem, dst_buffer:cl_mem, src_offset:size_t, dst_offset:size_t, size:size_t, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_mem, c.POINTER[size_t], c.POINTER[size_t], c.POINTER[size_t], size_t, size_t, size_t, size_t, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueCopyBufferRect(command_queue:cl_command_queue, src_buffer:cl_mem, dst_buffer:cl_mem, src_origin:c.POINTER[size_t], dst_origin:c.POINTER[size_t], region:c.POINTER[size_t], src_row_pitch:size_t, src_slice_pitch:size_t, dst_row_pitch:size_t, dst_slice_pitch:size_t, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_bool, c.POINTER[size_t], c.POINTER[size_t], size_t, size_t, ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueReadImage(command_queue:cl_command_queue, image:cl_mem, blocking_read:cl_bool, origin:c.POINTER[size_t], region:c.POINTER[size_t], row_pitch:size_t, slice_pitch:size_t, ptr:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_bool, c.POINTER[size_t], c.POINTER[size_t], size_t, size_t, ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueWriteImage(command_queue:cl_command_queue, image:cl_mem, blocking_write:cl_bool, origin:c.POINTER[size_t], region:c.POINTER[size_t], input_row_pitch:size_t, input_slice_pitch:size_t, ptr:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, ctypes.c_void_p, c.POINTER[size_t], c.POINTER[size_t], cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueFillImage(command_queue:cl_command_queue, image:cl_mem, fill_color:ctypes.c_void_p, origin:c.POINTER[size_t], region:c.POINTER[size_t], num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_mem, c.POINTER[size_t], c.POINTER[size_t], c.POINTER[size_t], cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueCopyImage(command_queue:cl_command_queue, src_image:cl_mem, dst_image:cl_mem, src_origin:c.POINTER[size_t], dst_origin:c.POINTER[size_t], region:c.POINTER[size_t], num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_mem, c.POINTER[size_t], c.POINTER[size_t], size_t, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueCopyImageToBuffer(command_queue:cl_command_queue, src_image:cl_mem, dst_buffer:cl_mem, src_origin:c.POINTER[size_t], region:c.POINTER[size_t], dst_offset:size_t, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, cl_mem, size_t, c.POINTER[size_t], c.POINTER[size_t], cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueCopyBufferToImage(command_queue:cl_command_queue, src_buffer:cl_mem, dst_image:cl_mem, src_offset:size_t, dst_origin:c.POINTER[size_t], region:c.POINTER[size_t], num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(ctypes.c_void_p, cl_command_queue, cl_mem, cl_bool, cl_map_flags, size_t, size_t, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event], c.POINTER[cl_int]) +def clEnqueueMapBuffer(command_queue:cl_command_queue, buffer:cl_mem, blocking_map:cl_bool, map_flags:cl_map_flags, offset:size_t, size:size_t, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event], errcode_ret:c.POINTER[cl_int]) -> ctypes.c_void_p: ... +@dll.bind(ctypes.c_void_p, cl_command_queue, cl_mem, cl_bool, cl_map_flags, c.POINTER[size_t], c.POINTER[size_t], c.POINTER[size_t], c.POINTER[size_t], cl_uint, c.POINTER[cl_event], c.POINTER[cl_event], c.POINTER[cl_int]) +def clEnqueueMapImage(command_queue:cl_command_queue, image:cl_mem, blocking_map:cl_bool, map_flags:cl_map_flags, origin:c.POINTER[size_t], region:c.POINTER[size_t], image_row_pitch:c.POINTER[size_t], image_slice_pitch:c.POINTER[size_t], num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event], errcode_ret:c.POINTER[cl_int]) -> ctypes.c_void_p: ... +@dll.bind(cl_int, cl_command_queue, cl_mem, ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueUnmapMemObject(command_queue:cl_command_queue, memobj:cl_mem, mapped_ptr:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_uint, c.POINTER[cl_mem], cl_mem_migration_flags, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueMigrateMemObjects(command_queue:cl_command_queue, num_mem_objects:cl_uint, mem_objects:c.POINTER[cl_mem], flags:cl_mem_migration_flags, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_kernel, cl_uint, c.POINTER[size_t], c.POINTER[size_t], c.POINTER[size_t], cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueNDRangeKernel(command_queue:cl_command_queue, kernel:cl_kernel, work_dim:cl_uint, global_work_offset:c.POINTER[size_t], global_work_size:c.POINTER[size_t], local_work_size:c.POINTER[size_t], num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, c.CFUNCTYPE[None, [ctypes.c_void_p]], ctypes.c_void_p, size_t, cl_uint, c.POINTER[cl_mem], c.POINTER[ctypes.c_void_p], cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueNativeKernel(command_queue:cl_command_queue, user_func:c.CFUNCTYPE[None, [ctypes.c_void_p]], args:ctypes.c_void_p, cb_args:size_t, num_mem_objects:cl_uint, mem_list:c.POINTER[cl_mem], args_mem_loc:c.POINTER[ctypes.c_void_p], num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueMarkerWithWaitList(command_queue:cl_command_queue, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueBarrierWithWaitList(command_queue:cl_command_queue, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_uint, c.Array[ctypes.c_void_p, Literal[0]], c.CFUNCTYPE[None, [cl_command_queue, cl_uint, c.Array[ctypes.c_void_p, Literal[0]], ctypes.c_void_p]], ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueSVMFree(command_queue:cl_command_queue, num_svm_pointers:cl_uint, svm_pointers:c.Array[ctypes.c_void_p, Literal[0]], pfn_free_func:c.CFUNCTYPE[None, [cl_command_queue, cl_uint, c.Array[ctypes.c_void_p, Literal[0]], ctypes.c_void_p]], user_data:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_bool, ctypes.c_void_p, ctypes.c_void_p, size_t, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueSVMMemcpy(command_queue:cl_command_queue, blocking_copy:cl_bool, dst_ptr:ctypes.c_void_p, src_ptr:ctypes.c_void_p, size:size_t, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, ctypes.c_void_p, ctypes.c_void_p, size_t, size_t, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueSVMMemFill(command_queue:cl_command_queue, svm_ptr:ctypes.c_void_p, pattern:ctypes.c_void_p, pattern_size:size_t, size:size_t, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_bool, cl_map_flags, ctypes.c_void_p, size_t, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueSVMMap(command_queue:cl_command_queue, blocking_map:cl_bool, flags:cl_map_flags, svm_ptr:ctypes.c_void_p, size:size_t, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, ctypes.c_void_p, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueSVMUnmap(command_queue:cl_command_queue, svm_ptr:ctypes.c_void_p, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_uint, c.POINTER[ctypes.c_void_p], c.POINTER[size_t], cl_mem_migration_flags, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueSVMMigrateMem(command_queue:cl_command_queue, num_svm_pointers:cl_uint, svm_pointers:c.POINTER[ctypes.c_void_p], sizes:c.POINTER[size_t], flags:cl_mem_migration_flags, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(ctypes.c_void_p, cl_platform_id, c.POINTER[ctypes.c_char]) +def clGetExtensionFunctionAddressForPlatform(platform:cl_platform_id, func_name:c.POINTER[ctypes.c_char]) -> ctypes.c_void_p: ... +@dll.bind(cl_mem, cl_context, cl_mem_flags, c.POINTER[cl_image_format], size_t, size_t, size_t, ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateImage2D(context:cl_context, flags:cl_mem_flags, image_format:c.POINTER[cl_image_format], image_width:size_t, image_height:size_t, image_row_pitch:size_t, host_ptr:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_mem: ... +@dll.bind(cl_mem, cl_context, cl_mem_flags, c.POINTER[cl_image_format], size_t, size_t, size_t, size_t, size_t, ctypes.c_void_p, c.POINTER[cl_int]) +def clCreateImage3D(context:cl_context, flags:cl_mem_flags, image_format:c.POINTER[cl_image_format], image_width:size_t, image_height:size_t, image_depth:size_t, image_row_pitch:size_t, image_slice_pitch:size_t, host_ptr:ctypes.c_void_p, errcode_ret:c.POINTER[cl_int]) -> cl_mem: ... +@dll.bind(cl_int, cl_command_queue, c.POINTER[cl_event]) +def clEnqueueMarker(command_queue:cl_command_queue, event:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue, cl_uint, c.POINTER[cl_event]) +def clEnqueueWaitForEvents(command_queue:cl_command_queue, num_events:cl_uint, event_list:c.POINTER[cl_event]) -> cl_int: ... +@dll.bind(cl_int, cl_command_queue) +def clEnqueueBarrier(command_queue:cl_command_queue) -> cl_int: ... +@dll.bind(cl_int) +def clUnloadCompiler() -> cl_int: ... +@dll.bind(ctypes.c_void_p, c.POINTER[ctypes.c_char]) +def clGetExtensionFunctionAddress(func_name:c.POINTER[ctypes.c_char]) -> ctypes.c_void_p: ... +@dll.bind(cl_command_queue, cl_context, cl_device_id, cl_command_queue_properties, c.POINTER[cl_int]) +def clCreateCommandQueue(context:cl_context, device:cl_device_id, properties:cl_command_queue_properties, errcode_ret:c.POINTER[cl_int]) -> cl_command_queue: ... +@dll.bind(cl_sampler, cl_context, cl_bool, cl_addressing_mode, cl_filter_mode, c.POINTER[cl_int]) +def clCreateSampler(context:cl_context, normalized_coords:cl_bool, addressing_mode:cl_addressing_mode, filter_mode:cl_filter_mode, errcode_ret:c.POINTER[cl_int]) -> cl_sampler: ... +@dll.bind(cl_int, cl_command_queue, cl_kernel, cl_uint, c.POINTER[cl_event], c.POINTER[cl_event]) +def clEnqueueTask(command_queue:cl_command_queue, kernel:cl_kernel, num_events_in_wait_list:cl_uint, event_wait_list:c.POINTER[cl_event], event:c.POINTER[cl_event]) -> cl_int: ... +CL_NAME_VERSION_MAX_NAME_SIZE = 64 +CL_SUCCESS = 0 +CL_DEVICE_NOT_FOUND = -1 +CL_DEVICE_NOT_AVAILABLE = -2 +CL_COMPILER_NOT_AVAILABLE = -3 +CL_MEM_OBJECT_ALLOCATION_FAILURE = -4 +CL_OUT_OF_RESOURCES = -5 +CL_OUT_OF_HOST_MEMORY = -6 +CL_PROFILING_INFO_NOT_AVAILABLE = -7 +CL_MEM_COPY_OVERLAP = -8 +CL_IMAGE_FORMAT_MISMATCH = -9 +CL_IMAGE_FORMAT_NOT_SUPPORTED = -10 +CL_BUILD_PROGRAM_FAILURE = -11 +CL_MAP_FAILURE = -12 +CL_MISALIGNED_SUB_BUFFER_OFFSET = -13 +CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST = -14 +CL_COMPILE_PROGRAM_FAILURE = -15 +CL_LINKER_NOT_AVAILABLE = -16 +CL_LINK_PROGRAM_FAILURE = -17 +CL_DEVICE_PARTITION_FAILED = -18 +CL_KERNEL_ARG_INFO_NOT_AVAILABLE = -19 +CL_INVALID_VALUE = -30 +CL_INVALID_DEVICE_TYPE = -31 +CL_INVALID_PLATFORM = -32 +CL_INVALID_DEVICE = -33 +CL_INVALID_CONTEXT = -34 +CL_INVALID_QUEUE_PROPERTIES = -35 +CL_INVALID_COMMAND_QUEUE = -36 +CL_INVALID_HOST_PTR = -37 +CL_INVALID_MEM_OBJECT = -38 +CL_INVALID_IMAGE_FORMAT_DESCRIPTOR = -39 +CL_INVALID_IMAGE_SIZE = -40 +CL_INVALID_SAMPLER = -41 +CL_INVALID_BINARY = -42 +CL_INVALID_BUILD_OPTIONS = -43 +CL_INVALID_PROGRAM = -44 +CL_INVALID_PROGRAM_EXECUTABLE = -45 +CL_INVALID_KERNEL_NAME = -46 +CL_INVALID_KERNEL_DEFINITION = -47 +CL_INVALID_KERNEL = -48 +CL_INVALID_ARG_INDEX = -49 +CL_INVALID_ARG_VALUE = -50 +CL_INVALID_ARG_SIZE = -51 +CL_INVALID_KERNEL_ARGS = -52 +CL_INVALID_WORK_DIMENSION = -53 +CL_INVALID_WORK_GROUP_SIZE = -54 +CL_INVALID_WORK_ITEM_SIZE = -55 +CL_INVALID_GLOBAL_OFFSET = -56 +CL_INVALID_EVENT_WAIT_LIST = -57 +CL_INVALID_EVENT = -58 +CL_INVALID_OPERATION = -59 +CL_INVALID_GL_OBJECT = -60 +CL_INVALID_BUFFER_SIZE = -61 +CL_INVALID_MIP_LEVEL = -62 +CL_INVALID_GLOBAL_WORK_SIZE = -63 +CL_INVALID_PROPERTY = -64 +CL_INVALID_IMAGE_DESCRIPTOR = -65 +CL_INVALID_COMPILER_OPTIONS = -66 +CL_INVALID_LINKER_OPTIONS = -67 +CL_INVALID_DEVICE_PARTITION_COUNT = -68 +CL_INVALID_PIPE_SIZE = -69 +CL_INVALID_DEVICE_QUEUE = -70 +CL_INVALID_SPEC_ID = -71 +CL_MAX_SIZE_RESTRICTION_EXCEEDED = -72 +CL_FALSE = 0 +CL_TRUE = 1 +CL_BLOCKING = CL_TRUE +CL_NON_BLOCKING = CL_FALSE +CL_PLATFORM_PROFILE = 0x0900 +CL_PLATFORM_VERSION = 0x0901 +CL_PLATFORM_NAME = 0x0902 +CL_PLATFORM_VENDOR = 0x0903 +CL_PLATFORM_EXTENSIONS = 0x0904 +CL_PLATFORM_HOST_TIMER_RESOLUTION = 0x0905 +CL_PLATFORM_NUMERIC_VERSION = 0x0906 +CL_PLATFORM_EXTENSIONS_WITH_VERSION = 0x0907 +CL_DEVICE_TYPE_DEFAULT = (1 << 0) +CL_DEVICE_TYPE_CPU = (1 << 1) +CL_DEVICE_TYPE_GPU = (1 << 2) +CL_DEVICE_TYPE_ACCELERATOR = (1 << 3) +CL_DEVICE_TYPE_CUSTOM = (1 << 4) +CL_DEVICE_TYPE_ALL = 0xFFFFFFFF +CL_DEVICE_TYPE = 0x1000 +CL_DEVICE_VENDOR_ID = 0x1001 +CL_DEVICE_MAX_COMPUTE_UNITS = 0x1002 +CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS = 0x1003 +CL_DEVICE_MAX_WORK_GROUP_SIZE = 0x1004 +CL_DEVICE_MAX_WORK_ITEM_SIZES = 0x1005 +CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR = 0x1006 +CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT = 0x1007 +CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT = 0x1008 +CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG = 0x1009 +CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT = 0x100A +CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE = 0x100B +CL_DEVICE_MAX_CLOCK_FREQUENCY = 0x100C +CL_DEVICE_ADDRESS_BITS = 0x100D +CL_DEVICE_MAX_READ_IMAGE_ARGS = 0x100E +CL_DEVICE_MAX_WRITE_IMAGE_ARGS = 0x100F +CL_DEVICE_MAX_MEM_ALLOC_SIZE = 0x1010 +CL_DEVICE_IMAGE2D_MAX_WIDTH = 0x1011 +CL_DEVICE_IMAGE2D_MAX_HEIGHT = 0x1012 +CL_DEVICE_IMAGE3D_MAX_WIDTH = 0x1013 +CL_DEVICE_IMAGE3D_MAX_HEIGHT = 0x1014 +CL_DEVICE_IMAGE3D_MAX_DEPTH = 0x1015 +CL_DEVICE_IMAGE_SUPPORT = 0x1016 +CL_DEVICE_MAX_PARAMETER_SIZE = 0x1017 +CL_DEVICE_MAX_SAMPLERS = 0x1018 +CL_DEVICE_MEM_BASE_ADDR_ALIGN = 0x1019 +CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE = 0x101A +CL_DEVICE_SINGLE_FP_CONFIG = 0x101B +CL_DEVICE_GLOBAL_MEM_CACHE_TYPE = 0x101C +CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE = 0x101D +CL_DEVICE_GLOBAL_MEM_CACHE_SIZE = 0x101E +CL_DEVICE_GLOBAL_MEM_SIZE = 0x101F +CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE = 0x1020 +CL_DEVICE_MAX_CONSTANT_ARGS = 0x1021 +CL_DEVICE_LOCAL_MEM_TYPE = 0x1022 +CL_DEVICE_LOCAL_MEM_SIZE = 0x1023 +CL_DEVICE_ERROR_CORRECTION_SUPPORT = 0x1024 +CL_DEVICE_PROFILING_TIMER_RESOLUTION = 0x1025 +CL_DEVICE_ENDIAN_LITTLE = 0x1026 +CL_DEVICE_AVAILABLE = 0x1027 +CL_DEVICE_COMPILER_AVAILABLE = 0x1028 +CL_DEVICE_EXECUTION_CAPABILITIES = 0x1029 +CL_DEVICE_QUEUE_PROPERTIES = 0x102A +CL_DEVICE_QUEUE_ON_HOST_PROPERTIES = 0x102A +CL_DEVICE_NAME = 0x102B +CL_DEVICE_VENDOR = 0x102C +CL_DRIVER_VERSION = 0x102D +CL_DEVICE_PROFILE = 0x102E +CL_DEVICE_VERSION = 0x102F +CL_DEVICE_EXTENSIONS = 0x1030 +CL_DEVICE_PLATFORM = 0x1031 +CL_DEVICE_DOUBLE_FP_CONFIG = 0x1032 +CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF = 0x1034 +CL_DEVICE_HOST_UNIFIED_MEMORY = 0x1035 +CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR = 0x1036 +CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT = 0x1037 +CL_DEVICE_NATIVE_VECTOR_WIDTH_INT = 0x1038 +CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG = 0x1039 +CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT = 0x103A +CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE = 0x103B +CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF = 0x103C +CL_DEVICE_OPENCL_C_VERSION = 0x103D +CL_DEVICE_LINKER_AVAILABLE = 0x103E +CL_DEVICE_BUILT_IN_KERNELS = 0x103F +CL_DEVICE_IMAGE_MAX_BUFFER_SIZE = 0x1040 +CL_DEVICE_IMAGE_MAX_ARRAY_SIZE = 0x1041 +CL_DEVICE_PARENT_DEVICE = 0x1042 +CL_DEVICE_PARTITION_MAX_SUB_DEVICES = 0x1043 +CL_DEVICE_PARTITION_PROPERTIES = 0x1044 +CL_DEVICE_PARTITION_AFFINITY_DOMAIN = 0x1045 +CL_DEVICE_PARTITION_TYPE = 0x1046 +CL_DEVICE_REFERENCE_COUNT = 0x1047 +CL_DEVICE_PREFERRED_INTEROP_USER_SYNC = 0x1048 +CL_DEVICE_PRINTF_BUFFER_SIZE = 0x1049 +CL_DEVICE_IMAGE_PITCH_ALIGNMENT = 0x104A +CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT = 0x104B +CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS = 0x104C +CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE = 0x104D +CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES = 0x104E +CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE = 0x104F +CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE = 0x1050 +CL_DEVICE_MAX_ON_DEVICE_QUEUES = 0x1051 +CL_DEVICE_MAX_ON_DEVICE_EVENTS = 0x1052 +CL_DEVICE_SVM_CAPABILITIES = 0x1053 +CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE = 0x1054 +CL_DEVICE_MAX_PIPE_ARGS = 0x1055 +CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS = 0x1056 +CL_DEVICE_PIPE_MAX_PACKET_SIZE = 0x1057 +CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT = 0x1058 +CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT = 0x1059 +CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT = 0x105A +CL_DEVICE_IL_VERSION = 0x105B +CL_DEVICE_MAX_NUM_SUB_GROUPS = 0x105C +CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS = 0x105D +CL_DEVICE_NUMERIC_VERSION = 0x105E +CL_DEVICE_EXTENSIONS_WITH_VERSION = 0x1060 +CL_DEVICE_ILS_WITH_VERSION = 0x1061 +CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION = 0x1062 +CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES = 0x1063 +CL_DEVICE_ATOMIC_FENCE_CAPABILITIES = 0x1064 +CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT = 0x1065 +CL_DEVICE_OPENCL_C_ALL_VERSIONS = 0x1066 +CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 0x1067 +CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT = 0x1068 +CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT = 0x1069 +CL_DEVICE_OPENCL_C_FEATURES = 0x106F +CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES = 0x1070 +CL_DEVICE_PIPE_SUPPORT = 0x1071 +CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED = 0x1072 +CL_FP_DENORM = (1 << 0) +CL_FP_INF_NAN = (1 << 1) +CL_FP_ROUND_TO_NEAREST = (1 << 2) +CL_FP_ROUND_TO_ZERO = (1 << 3) +CL_FP_ROUND_TO_INF = (1 << 4) +CL_FP_FMA = (1 << 5) +CL_FP_SOFT_FLOAT = (1 << 6) +CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT = (1 << 7) +CL_NONE = 0x0 +CL_READ_ONLY_CACHE = 0x1 +CL_READ_WRITE_CACHE = 0x2 +CL_LOCAL = 0x1 +CL_GLOBAL = 0x2 +CL_EXEC_KERNEL = (1 << 0) +CL_EXEC_NATIVE_KERNEL = (1 << 1) +CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE = (1 << 0) +CL_QUEUE_PROFILING_ENABLE = (1 << 1) +CL_QUEUE_ON_DEVICE = (1 << 2) +CL_QUEUE_ON_DEVICE_DEFAULT = (1 << 3) +CL_CONTEXT_REFERENCE_COUNT = 0x1080 +CL_CONTEXT_DEVICES = 0x1081 +CL_CONTEXT_PROPERTIES = 0x1082 +CL_CONTEXT_NUM_DEVICES = 0x1083 +CL_CONTEXT_PLATFORM = 0x1084 +CL_CONTEXT_INTEROP_USER_SYNC = 0x1085 +CL_DEVICE_PARTITION_EQUALLY = 0x1086 +CL_DEVICE_PARTITION_BY_COUNTS = 0x1087 +CL_DEVICE_PARTITION_BY_COUNTS_LIST_END = 0x0 +CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN = 0x1088 +CL_DEVICE_AFFINITY_DOMAIN_NUMA = (1 << 0) +CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE = (1 << 1) +CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE = (1 << 2) +CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE = (1 << 3) +CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE = (1 << 4) +CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE = (1 << 5) +CL_DEVICE_SVM_COARSE_GRAIN_BUFFER = (1 << 0) +CL_DEVICE_SVM_FINE_GRAIN_BUFFER = (1 << 1) +CL_DEVICE_SVM_FINE_GRAIN_SYSTEM = (1 << 2) +CL_DEVICE_SVM_ATOMICS = (1 << 3) +CL_QUEUE_CONTEXT = 0x1090 +CL_QUEUE_DEVICE = 0x1091 +CL_QUEUE_REFERENCE_COUNT = 0x1092 +CL_QUEUE_PROPERTIES = 0x1093 +CL_QUEUE_SIZE = 0x1094 +CL_QUEUE_DEVICE_DEFAULT = 0x1095 +CL_QUEUE_PROPERTIES_ARRAY = 0x1098 +CL_MEM_READ_WRITE = (1 << 0) +CL_MEM_WRITE_ONLY = (1 << 1) +CL_MEM_READ_ONLY = (1 << 2) +CL_MEM_USE_HOST_PTR = (1 << 3) +CL_MEM_ALLOC_HOST_PTR = (1 << 4) +CL_MEM_COPY_HOST_PTR = (1 << 5) +CL_MEM_HOST_WRITE_ONLY = (1 << 7) +CL_MEM_HOST_READ_ONLY = (1 << 8) +CL_MEM_HOST_NO_ACCESS = (1 << 9) +CL_MEM_SVM_FINE_GRAIN_BUFFER = (1 << 10) +CL_MEM_SVM_ATOMICS = (1 << 11) +CL_MEM_KERNEL_READ_AND_WRITE = (1 << 12) +CL_MIGRATE_MEM_OBJECT_HOST = (1 << 0) +CL_MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED = (1 << 1) +CL_R = 0x10B0 +CL_A = 0x10B1 +CL_RG = 0x10B2 +CL_RA = 0x10B3 +CL_RGB = 0x10B4 +CL_RGBA = 0x10B5 +CL_BGRA = 0x10B6 +CL_ARGB = 0x10B7 +CL_INTENSITY = 0x10B8 +CL_LUMINANCE = 0x10B9 +CL_Rx = 0x10BA +CL_RGx = 0x10BB +CL_RGBx = 0x10BC +CL_DEPTH = 0x10BD +CL_sRGB = 0x10BF +CL_sRGBx = 0x10C0 +CL_sRGBA = 0x10C1 +CL_sBGRA = 0x10C2 +CL_ABGR = 0x10C3 +CL_SNORM_INT8 = 0x10D0 +CL_SNORM_INT16 = 0x10D1 +CL_UNORM_INT8 = 0x10D2 +CL_UNORM_INT16 = 0x10D3 +CL_UNORM_SHORT_565 = 0x10D4 +CL_UNORM_SHORT_555 = 0x10D5 +CL_UNORM_INT_101010 = 0x10D6 +CL_SIGNED_INT8 = 0x10D7 +CL_SIGNED_INT16 = 0x10D8 +CL_SIGNED_INT32 = 0x10D9 +CL_UNSIGNED_INT8 = 0x10DA +CL_UNSIGNED_INT16 = 0x10DB +CL_UNSIGNED_INT32 = 0x10DC +CL_HALF_FLOAT = 0x10DD +CL_FLOAT = 0x10DE +CL_UNORM_INT_101010_2 = 0x10E0 +CL_MEM_OBJECT_BUFFER = 0x10F0 +CL_MEM_OBJECT_IMAGE2D = 0x10F1 +CL_MEM_OBJECT_IMAGE3D = 0x10F2 +CL_MEM_OBJECT_IMAGE2D_ARRAY = 0x10F3 +CL_MEM_OBJECT_IMAGE1D = 0x10F4 +CL_MEM_OBJECT_IMAGE1D_ARRAY = 0x10F5 +CL_MEM_OBJECT_IMAGE1D_BUFFER = 0x10F6 +CL_MEM_OBJECT_PIPE = 0x10F7 +CL_MEM_TYPE = 0x1100 +CL_MEM_FLAGS = 0x1101 +CL_MEM_SIZE = 0x1102 +CL_MEM_HOST_PTR = 0x1103 +CL_MEM_MAP_COUNT = 0x1104 +CL_MEM_REFERENCE_COUNT = 0x1105 +CL_MEM_CONTEXT = 0x1106 +CL_MEM_ASSOCIATED_MEMOBJECT = 0x1107 +CL_MEM_OFFSET = 0x1108 +CL_MEM_USES_SVM_POINTER = 0x1109 +CL_MEM_PROPERTIES = 0x110A +CL_IMAGE_FORMAT = 0x1110 +CL_IMAGE_ELEMENT_SIZE = 0x1111 +CL_IMAGE_ROW_PITCH = 0x1112 +CL_IMAGE_SLICE_PITCH = 0x1113 +CL_IMAGE_WIDTH = 0x1114 +CL_IMAGE_HEIGHT = 0x1115 +CL_IMAGE_DEPTH = 0x1116 +CL_IMAGE_ARRAY_SIZE = 0x1117 +CL_IMAGE_BUFFER = 0x1118 +CL_IMAGE_NUM_MIP_LEVELS = 0x1119 +CL_IMAGE_NUM_SAMPLES = 0x111A +CL_PIPE_PACKET_SIZE = 0x1120 +CL_PIPE_MAX_PACKETS = 0x1121 +CL_PIPE_PROPERTIES = 0x1122 +CL_ADDRESS_NONE = 0x1130 +CL_ADDRESS_CLAMP_TO_EDGE = 0x1131 +CL_ADDRESS_CLAMP = 0x1132 +CL_ADDRESS_REPEAT = 0x1133 +CL_ADDRESS_MIRRORED_REPEAT = 0x1134 +CL_FILTER_NEAREST = 0x1140 +CL_FILTER_LINEAR = 0x1141 +CL_SAMPLER_REFERENCE_COUNT = 0x1150 +CL_SAMPLER_CONTEXT = 0x1151 +CL_SAMPLER_NORMALIZED_COORDS = 0x1152 +CL_SAMPLER_ADDRESSING_MODE = 0x1153 +CL_SAMPLER_FILTER_MODE = 0x1154 +CL_SAMPLER_MIP_FILTER_MODE = 0x1155 +CL_SAMPLER_LOD_MIN = 0x1156 +CL_SAMPLER_LOD_MAX = 0x1157 +CL_SAMPLER_PROPERTIES = 0x1158 +CL_MAP_READ = (1 << 0) +CL_MAP_WRITE = (1 << 1) +CL_MAP_WRITE_INVALIDATE_REGION = (1 << 2) +CL_PROGRAM_REFERENCE_COUNT = 0x1160 +CL_PROGRAM_CONTEXT = 0x1161 +CL_PROGRAM_NUM_DEVICES = 0x1162 +CL_PROGRAM_DEVICES = 0x1163 +CL_PROGRAM_SOURCE = 0x1164 +CL_PROGRAM_BINARY_SIZES = 0x1165 +CL_PROGRAM_BINARIES = 0x1166 +CL_PROGRAM_NUM_KERNELS = 0x1167 +CL_PROGRAM_KERNEL_NAMES = 0x1168 +CL_PROGRAM_IL = 0x1169 +CL_PROGRAM_SCOPE_GLOBAL_CTORS_PRESENT = 0x116A +CL_PROGRAM_SCOPE_GLOBAL_DTORS_PRESENT = 0x116B +CL_PROGRAM_BUILD_STATUS = 0x1181 +CL_PROGRAM_BUILD_OPTIONS = 0x1182 +CL_PROGRAM_BUILD_LOG = 0x1183 +CL_PROGRAM_BINARY_TYPE = 0x1184 +CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE = 0x1185 +CL_PROGRAM_BINARY_TYPE_NONE = 0x0 +CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT = 0x1 +CL_PROGRAM_BINARY_TYPE_LIBRARY = 0x2 +CL_PROGRAM_BINARY_TYPE_EXECUTABLE = 0x4 +CL_BUILD_SUCCESS = 0 +CL_BUILD_NONE = -1 +CL_BUILD_ERROR = -2 +CL_BUILD_IN_PROGRESS = -3 +CL_KERNEL_FUNCTION_NAME = 0x1190 +CL_KERNEL_NUM_ARGS = 0x1191 +CL_KERNEL_REFERENCE_COUNT = 0x1192 +CL_KERNEL_CONTEXT = 0x1193 +CL_KERNEL_PROGRAM = 0x1194 +CL_KERNEL_ATTRIBUTES = 0x1195 +CL_KERNEL_ARG_ADDRESS_QUALIFIER = 0x1196 +CL_KERNEL_ARG_ACCESS_QUALIFIER = 0x1197 +CL_KERNEL_ARG_TYPE_NAME = 0x1198 +CL_KERNEL_ARG_TYPE_QUALIFIER = 0x1199 +CL_KERNEL_ARG_NAME = 0x119A +CL_KERNEL_ARG_ADDRESS_GLOBAL = 0x119B +CL_KERNEL_ARG_ADDRESS_LOCAL = 0x119C +CL_KERNEL_ARG_ADDRESS_CONSTANT = 0x119D +CL_KERNEL_ARG_ADDRESS_PRIVATE = 0x119E +CL_KERNEL_ARG_ACCESS_READ_ONLY = 0x11A0 +CL_KERNEL_ARG_ACCESS_WRITE_ONLY = 0x11A1 +CL_KERNEL_ARG_ACCESS_READ_WRITE = 0x11A2 +CL_KERNEL_ARG_ACCESS_NONE = 0x11A3 +CL_KERNEL_ARG_TYPE_NONE = 0 +CL_KERNEL_ARG_TYPE_CONST = (1 << 0) +CL_KERNEL_ARG_TYPE_RESTRICT = (1 << 1) +CL_KERNEL_ARG_TYPE_VOLATILE = (1 << 2) +CL_KERNEL_ARG_TYPE_PIPE = (1 << 3) +CL_KERNEL_WORK_GROUP_SIZE = 0x11B0 +CL_KERNEL_COMPILE_WORK_GROUP_SIZE = 0x11B1 +CL_KERNEL_LOCAL_MEM_SIZE = 0x11B2 +CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 0x11B3 +CL_KERNEL_PRIVATE_MEM_SIZE = 0x11B4 +CL_KERNEL_GLOBAL_WORK_SIZE = 0x11B5 +CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE = 0x2033 +CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE = 0x2034 +CL_KERNEL_LOCAL_SIZE_FOR_SUB_GROUP_COUNT = 0x11B8 +CL_KERNEL_MAX_NUM_SUB_GROUPS = 0x11B9 +CL_KERNEL_COMPILE_NUM_SUB_GROUPS = 0x11BA +CL_KERNEL_EXEC_INFO_SVM_PTRS = 0x11B6 +CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM = 0x11B7 +CL_EVENT_COMMAND_QUEUE = 0x11D0 +CL_EVENT_COMMAND_TYPE = 0x11D1 +CL_EVENT_REFERENCE_COUNT = 0x11D2 +CL_EVENT_COMMAND_EXECUTION_STATUS = 0x11D3 +CL_EVENT_CONTEXT = 0x11D4 +CL_COMMAND_NDRANGE_KERNEL = 0x11F0 +CL_COMMAND_TASK = 0x11F1 +CL_COMMAND_NATIVE_KERNEL = 0x11F2 +CL_COMMAND_READ_BUFFER = 0x11F3 +CL_COMMAND_WRITE_BUFFER = 0x11F4 +CL_COMMAND_COPY_BUFFER = 0x11F5 +CL_COMMAND_READ_IMAGE = 0x11F6 +CL_COMMAND_WRITE_IMAGE = 0x11F7 +CL_COMMAND_COPY_IMAGE = 0x11F8 +CL_COMMAND_COPY_IMAGE_TO_BUFFER = 0x11F9 +CL_COMMAND_COPY_BUFFER_TO_IMAGE = 0x11FA +CL_COMMAND_MAP_BUFFER = 0x11FB +CL_COMMAND_MAP_IMAGE = 0x11FC +CL_COMMAND_UNMAP_MEM_OBJECT = 0x11FD +CL_COMMAND_MARKER = 0x11FE +CL_COMMAND_ACQUIRE_GL_OBJECTS = 0x11FF +CL_COMMAND_RELEASE_GL_OBJECTS = 0x1200 +CL_COMMAND_READ_BUFFER_RECT = 0x1201 +CL_COMMAND_WRITE_BUFFER_RECT = 0x1202 +CL_COMMAND_COPY_BUFFER_RECT = 0x1203 +CL_COMMAND_USER = 0x1204 +CL_COMMAND_BARRIER = 0x1205 +CL_COMMAND_MIGRATE_MEM_OBJECTS = 0x1206 +CL_COMMAND_FILL_BUFFER = 0x1207 +CL_COMMAND_FILL_IMAGE = 0x1208 +CL_COMMAND_SVM_FREE = 0x1209 +CL_COMMAND_SVM_MEMCPY = 0x120A +CL_COMMAND_SVM_MEMFILL = 0x120B +CL_COMMAND_SVM_MAP = 0x120C +CL_COMMAND_SVM_UNMAP = 0x120D +CL_COMMAND_SVM_MIGRATE_MEM = 0x120E +CL_COMPLETE = 0x0 +CL_RUNNING = 0x1 +CL_SUBMITTED = 0x2 +CL_QUEUED = 0x3 +CL_BUFFER_CREATE_TYPE_REGION = 0x1220 +CL_PROFILING_COMMAND_QUEUED = 0x1280 +CL_PROFILING_COMMAND_SUBMIT = 0x1281 +CL_PROFILING_COMMAND_START = 0x1282 +CL_PROFILING_COMMAND_END = 0x1283 +CL_PROFILING_COMMAND_COMPLETE = 0x1284 +CL_DEVICE_ATOMIC_ORDER_RELAXED = (1 << 0) +CL_DEVICE_ATOMIC_ORDER_ACQ_REL = (1 << 1) +CL_DEVICE_ATOMIC_ORDER_SEQ_CST = (1 << 2) +CL_DEVICE_ATOMIC_SCOPE_WORK_ITEM = (1 << 3) +CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP = (1 << 4) +CL_DEVICE_ATOMIC_SCOPE_DEVICE = (1 << 5) +CL_DEVICE_ATOMIC_SCOPE_ALL_DEVICES = (1 << 6) +CL_DEVICE_QUEUE_SUPPORTED = (1 << 0) +CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT = (1 << 1) +CL_KHRONOS_VENDOR_ID_CODEPLAY = 0x10004 +CL_VERSION_MAJOR_BITS = (10) +CL_VERSION_MINOR_BITS = (10) +CL_VERSION_PATCH_BITS = (12) +CL_VERSION_MAJOR_MASK = ((1 << CL_VERSION_MAJOR_BITS) - 1) +CL_VERSION_MINOR_MASK = ((1 << CL_VERSION_MINOR_BITS) - 1) +CL_VERSION_PATCH_MASK = ((1 << CL_VERSION_PATCH_BITS) - 1) +CL_VERSION_MAJOR = lambda version: ((version) >> (CL_VERSION_MINOR_BITS + CL_VERSION_PATCH_BITS)) # type: ignore +CL_VERSION_MINOR = lambda version: (((version) >> CL_VERSION_PATCH_BITS) & CL_VERSION_MINOR_MASK) # type: ignore +CL_VERSION_PATCH = lambda version: ((version) & CL_VERSION_PATCH_MASK) # type: ignore +CL_MAKE_VERSION = lambda major,minor,patch: ((((major) & CL_VERSION_MAJOR_MASK) << (CL_VERSION_MINOR_BITS + CL_VERSION_PATCH_BITS)) | (((minor) & CL_VERSION_MINOR_MASK) << CL_VERSION_PATCH_BITS) | ((patch) & CL_VERSION_PATCH_MASK)) # type: ignore \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/pci.py b/artifacts/package_runtime/tinygrad/runtime/autogen/pci.py new file mode 100644 index 000000000..51d1880a1 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/pci.py @@ -0,0 +1,1043 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +PCI_CFG_SPACE_SIZE = 256 +PCI_CFG_SPACE_EXP_SIZE = 4096 +PCI_STD_HEADER_SIZEOF = 64 +PCI_STD_NUM_BARS = 6 +PCI_VENDOR_ID = 0x00 +PCI_DEVICE_ID = 0x02 +PCI_COMMAND = 0x04 +PCI_COMMAND_IO = 0x1 +PCI_COMMAND_MEMORY = 0x2 +PCI_COMMAND_MASTER = 0x4 +PCI_COMMAND_SPECIAL = 0x8 +PCI_COMMAND_INVALIDATE = 0x10 +PCI_COMMAND_VGA_PALETTE = 0x20 +PCI_COMMAND_PARITY = 0x40 +PCI_COMMAND_WAIT = 0x80 +PCI_COMMAND_SERR = 0x100 +PCI_COMMAND_FAST_BACK = 0x200 +PCI_COMMAND_INTX_DISABLE = 0x400 +PCI_STATUS = 0x06 +PCI_STATUS_IMM_READY = 0x01 +PCI_STATUS_INTERRUPT = 0x08 +PCI_STATUS_CAP_LIST = 0x10 +PCI_STATUS_66MHZ = 0x20 +PCI_STATUS_UDF = 0x40 +PCI_STATUS_FAST_BACK = 0x80 +PCI_STATUS_PARITY = 0x100 +PCI_STATUS_DEVSEL_MASK = 0x600 +PCI_STATUS_DEVSEL_FAST = 0x000 +PCI_STATUS_DEVSEL_MEDIUM = 0x200 +PCI_STATUS_DEVSEL_SLOW = 0x400 +PCI_STATUS_SIG_TARGET_ABORT = 0x800 +PCI_STATUS_REC_TARGET_ABORT = 0x1000 +PCI_STATUS_REC_MASTER_ABORT = 0x2000 +PCI_STATUS_SIG_SYSTEM_ERROR = 0x4000 +PCI_STATUS_DETECTED_PARITY = 0x8000 +PCI_CLASS_REVISION = 0x08 +PCI_REVISION_ID = 0x08 +PCI_CLASS_PROG = 0x09 +PCI_CLASS_DEVICE = 0x0a +PCI_CACHE_LINE_SIZE = 0x0c +PCI_LATENCY_TIMER = 0x0d +PCI_HEADER_TYPE = 0x0e +PCI_HEADER_TYPE_MASK = 0x7f +PCI_HEADER_TYPE_NORMAL = 0 +PCI_HEADER_TYPE_BRIDGE = 1 +PCI_HEADER_TYPE_CARDBUS = 2 +PCI_HEADER_TYPE_MFD = 0x80 +PCI_BIST = 0x0f +PCI_BIST_CODE_MASK = 0x0f +PCI_BIST_START = 0x40 +PCI_BIST_CAPABLE = 0x80 +PCI_BASE_ADDRESS_0 = 0x10 +PCI_BASE_ADDRESS_1 = 0x14 +PCI_BASE_ADDRESS_2 = 0x18 +PCI_BASE_ADDRESS_3 = 0x1c +PCI_BASE_ADDRESS_4 = 0x20 +PCI_BASE_ADDRESS_5 = 0x24 +PCI_BASE_ADDRESS_SPACE = 0x01 +PCI_BASE_ADDRESS_SPACE_IO = 0x01 +PCI_BASE_ADDRESS_SPACE_MEMORY = 0x00 +PCI_BASE_ADDRESS_MEM_TYPE_MASK = 0x06 +PCI_BASE_ADDRESS_MEM_TYPE_32 = 0x00 +PCI_BASE_ADDRESS_MEM_TYPE_1M = 0x02 +PCI_BASE_ADDRESS_MEM_TYPE_64 = 0x04 +PCI_BASE_ADDRESS_MEM_PREFETCH = 0x08 +PCI_BASE_ADDRESS_MEM_MASK = (~0x0f) +PCI_BASE_ADDRESS_IO_MASK = (~0x03) +PCI_CARDBUS_CIS = 0x28 +PCI_SUBSYSTEM_VENDOR_ID = 0x2c +PCI_SUBSYSTEM_ID = 0x2e +PCI_ROM_ADDRESS = 0x30 +PCI_ROM_ADDRESS_ENABLE = 0x01 +PCI_ROM_ADDRESS_MASK = (~0x7ff) +PCI_CAPABILITY_LIST = 0x34 +PCI_INTERRUPT_LINE = 0x3c +PCI_INTERRUPT_PIN = 0x3d +PCI_MIN_GNT = 0x3e +PCI_MAX_LAT = 0x3f +PCI_PRIMARY_BUS = 0x18 +PCI_SECONDARY_BUS = 0x19 +PCI_SUBORDINATE_BUS = 0x1a +PCI_SEC_LATENCY_TIMER = 0x1b +PCI_IO_BASE = 0x1c +PCI_IO_LIMIT = 0x1d +PCI_IO_RANGE_TYPE_MASK = 0x0f +PCI_IO_RANGE_TYPE_16 = 0x00 +PCI_IO_RANGE_TYPE_32 = 0x01 +PCI_IO_RANGE_MASK = (~0x0f) +PCI_IO_1K_RANGE_MASK = (~0x03) +PCI_SEC_STATUS = 0x1e +PCI_MEMORY_BASE = 0x20 +PCI_MEMORY_LIMIT = 0x22 +PCI_MEMORY_RANGE_TYPE_MASK = 0x0f +PCI_MEMORY_RANGE_MASK = (~0x0f) +PCI_PREF_MEMORY_BASE = 0x24 +PCI_PREF_MEMORY_LIMIT = 0x26 +PCI_PREF_RANGE_TYPE_MASK = 0x0f +PCI_PREF_RANGE_TYPE_32 = 0x00 +PCI_PREF_RANGE_TYPE_64 = 0x01 +PCI_PREF_RANGE_MASK = (~0x0f) +PCI_PREF_BASE_UPPER32 = 0x28 +PCI_PREF_LIMIT_UPPER32 = 0x2c +PCI_IO_BASE_UPPER16 = 0x30 +PCI_IO_LIMIT_UPPER16 = 0x32 +PCI_ROM_ADDRESS1 = 0x38 +PCI_BRIDGE_CONTROL = 0x3e +PCI_BRIDGE_CTL_PARITY = 0x01 +PCI_BRIDGE_CTL_SERR = 0x02 +PCI_BRIDGE_CTL_ISA = 0x04 +PCI_BRIDGE_CTL_VGA = 0x08 +PCI_BRIDGE_CTL_MASTER_ABORT = 0x20 +PCI_BRIDGE_CTL_BUS_RESET = 0x40 +PCI_BRIDGE_CTL_FAST_BACK = 0x80 +PCI_CB_CAPABILITY_LIST = 0x14 +PCI_CB_SEC_STATUS = 0x16 +PCI_CB_PRIMARY_BUS = 0x18 +PCI_CB_CARD_BUS = 0x19 +PCI_CB_SUBORDINATE_BUS = 0x1a +PCI_CB_LATENCY_TIMER = 0x1b +PCI_CB_MEMORY_BASE_0 = 0x1c +PCI_CB_MEMORY_LIMIT_0 = 0x20 +PCI_CB_MEMORY_BASE_1 = 0x24 +PCI_CB_MEMORY_LIMIT_1 = 0x28 +PCI_CB_IO_BASE_0 = 0x2c +PCI_CB_IO_BASE_0_HI = 0x2e +PCI_CB_IO_LIMIT_0 = 0x30 +PCI_CB_IO_LIMIT_0_HI = 0x32 +PCI_CB_IO_BASE_1 = 0x34 +PCI_CB_IO_BASE_1_HI = 0x36 +PCI_CB_IO_LIMIT_1 = 0x38 +PCI_CB_IO_LIMIT_1_HI = 0x3a +PCI_CB_IO_RANGE_MASK = (~0x03) +PCI_CB_BRIDGE_CONTROL = 0x3e +PCI_CB_BRIDGE_CTL_PARITY = 0x01 +PCI_CB_BRIDGE_CTL_SERR = 0x02 +PCI_CB_BRIDGE_CTL_ISA = 0x04 +PCI_CB_BRIDGE_CTL_VGA = 0x08 +PCI_CB_BRIDGE_CTL_MASTER_ABORT = 0x20 +PCI_CB_BRIDGE_CTL_CB_RESET = 0x40 +PCI_CB_BRIDGE_CTL_16BIT_INT = 0x80 +PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 = 0x100 +PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 = 0x200 +PCI_CB_BRIDGE_CTL_POST_WRITES = 0x400 +PCI_CB_SUBSYSTEM_VENDOR_ID = 0x40 +PCI_CB_SUBSYSTEM_ID = 0x42 +PCI_CB_LEGACY_MODE_BASE = 0x44 +PCI_CAP_ID_MASK = 0x00ff +PCI_CAP_LIST_NEXT_MASK = 0xff00 +PCI_CAP_LIST_ID = 0 +PCI_CAP_ID_PM = 0x01 +PCI_CAP_ID_AGP = 0x02 +PCI_CAP_ID_VPD = 0x03 +PCI_CAP_ID_SLOTID = 0x04 +PCI_CAP_ID_MSI = 0x05 +PCI_CAP_ID_CHSWP = 0x06 +PCI_CAP_ID_PCIX = 0x07 +PCI_CAP_ID_HT = 0x08 +PCI_CAP_ID_VNDR = 0x09 +PCI_CAP_ID_DBG = 0x0A +PCI_CAP_ID_CCRC = 0x0B +PCI_CAP_ID_SHPC = 0x0C +PCI_CAP_ID_SSVID = 0x0D +PCI_CAP_ID_AGP3 = 0x0E +PCI_CAP_ID_SECDEV = 0x0F +PCI_CAP_ID_EXP = 0x10 +PCI_CAP_ID_MSIX = 0x11 +PCI_CAP_ID_SATA = 0x12 +PCI_CAP_ID_AF = 0x13 +PCI_CAP_ID_EA = 0x14 +PCI_CAP_ID_MAX = PCI_CAP_ID_EA +PCI_CAP_LIST_NEXT = 1 +PCI_CAP_FLAGS = 2 +PCI_CAP_SIZEOF = 4 +PCI_PM_PMC = 2 +PCI_PM_CAP_VER_MASK = 0x0007 +PCI_PM_CAP_PME_CLOCK = 0x0008 +PCI_PM_CAP_RESERVED = 0x0010 +PCI_PM_CAP_DSI = 0x0020 +PCI_PM_CAP_AUX_POWER = 0x01C0 +PCI_PM_CAP_D1 = 0x0200 +PCI_PM_CAP_D2 = 0x0400 +PCI_PM_CAP_PME = 0x0800 +PCI_PM_CAP_PME_MASK = 0xF800 +PCI_PM_CAP_PME_D0 = 0x0800 +PCI_PM_CAP_PME_D1 = 0x1000 +PCI_PM_CAP_PME_D2 = 0x2000 +PCI_PM_CAP_PME_D3hot = 0x4000 +PCI_PM_CAP_PME_D3cold = 0x8000 +PCI_PM_CAP_PME_SHIFT = 11 +PCI_PM_CTRL = 4 +PCI_PM_CTRL_STATE_MASK = 0x0003 +PCI_PM_CTRL_NO_SOFT_RESET = 0x0008 +PCI_PM_CTRL_PME_ENABLE = 0x0100 +PCI_PM_CTRL_DATA_SEL_MASK = 0x1e00 +PCI_PM_CTRL_DATA_SCALE_MASK = 0x6000 +PCI_PM_CTRL_PME_STATUS = 0x8000 +PCI_PM_PPB_EXTENSIONS = 6 +PCI_PM_PPB_B2_B3 = 0x40 +PCI_PM_BPCC_ENABLE = 0x80 +PCI_PM_DATA_REGISTER = 7 +PCI_PM_SIZEOF = 8 +PCI_AGP_VERSION = 2 +PCI_AGP_RFU = 3 +PCI_AGP_STATUS = 4 +PCI_AGP_STATUS_RQ_MASK = 0xff000000 +PCI_AGP_STATUS_SBA = 0x0200 +PCI_AGP_STATUS_64BIT = 0x0020 +PCI_AGP_STATUS_FW = 0x0010 +PCI_AGP_STATUS_RATE4 = 0x0004 +PCI_AGP_STATUS_RATE2 = 0x0002 +PCI_AGP_STATUS_RATE1 = 0x0001 +PCI_AGP_COMMAND = 8 +PCI_AGP_COMMAND_RQ_MASK = 0xff000000 +PCI_AGP_COMMAND_SBA = 0x0200 +PCI_AGP_COMMAND_AGP = 0x0100 +PCI_AGP_COMMAND_64BIT = 0x0020 +PCI_AGP_COMMAND_FW = 0x0010 +PCI_AGP_COMMAND_RATE4 = 0x0004 +PCI_AGP_COMMAND_RATE2 = 0x0002 +PCI_AGP_COMMAND_RATE1 = 0x0001 +PCI_AGP_SIZEOF = 12 +PCI_VPD_ADDR = 2 +PCI_VPD_ADDR_MASK = 0x7fff +PCI_VPD_ADDR_F = 0x8000 +PCI_VPD_DATA = 4 +PCI_CAP_VPD_SIZEOF = 8 +PCI_SID_ESR = 2 +PCI_SID_ESR_NSLOTS = 0x1f +PCI_SID_ESR_FIC = 0x20 +PCI_SID_CHASSIS_NR = 3 +PCI_MSI_FLAGS = 0x02 +PCI_MSI_FLAGS_ENABLE = 0x0001 +PCI_MSI_FLAGS_QMASK = 0x000e +PCI_MSI_FLAGS_QSIZE = 0x0070 +PCI_MSI_FLAGS_64BIT = 0x0080 +PCI_MSI_FLAGS_MASKBIT = 0x0100 +PCI_MSI_RFU = 3 +PCI_MSI_ADDRESS_LO = 0x04 +PCI_MSI_ADDRESS_HI = 0x08 +PCI_MSI_DATA_32 = 0x08 +PCI_MSI_MASK_32 = 0x0c +PCI_MSI_PENDING_32 = 0x10 +PCI_MSI_DATA_64 = 0x0c +PCI_MSI_MASK_64 = 0x10 +PCI_MSI_PENDING_64 = 0x14 +PCI_MSIX_FLAGS = 2 +PCI_MSIX_FLAGS_QSIZE = 0x07FF +PCI_MSIX_FLAGS_MASKALL = 0x4000 +PCI_MSIX_FLAGS_ENABLE = 0x8000 +PCI_MSIX_TABLE = 4 +PCI_MSIX_TABLE_BIR = 0x00000007 +PCI_MSIX_TABLE_OFFSET = 0xfffffff8 +PCI_MSIX_PBA = 8 +PCI_MSIX_PBA_BIR = 0x00000007 +PCI_MSIX_PBA_OFFSET = 0xfffffff8 +PCI_MSIX_FLAGS_BIRMASK = PCI_MSIX_PBA_BIR +PCI_CAP_MSIX_SIZEOF = 12 +PCI_MSIX_ENTRY_SIZE = 16 +PCI_MSIX_ENTRY_LOWER_ADDR = 0x0 +PCI_MSIX_ENTRY_UPPER_ADDR = 0x4 +PCI_MSIX_ENTRY_DATA = 0x8 +PCI_MSIX_ENTRY_VECTOR_CTRL = 0xc +PCI_MSIX_ENTRY_CTRL_MASKBIT = 0x00000001 +PCI_MSIX_ENTRY_CTRL_ST = 0xffff0000 +PCI_CHSWP_CSR = 2 +PCI_CHSWP_DHA = 0x01 +PCI_CHSWP_EIM = 0x02 +PCI_CHSWP_PIE = 0x04 +PCI_CHSWP_LOO = 0x08 +PCI_CHSWP_PI = 0x30 +PCI_CHSWP_EXT = 0x40 +PCI_CHSWP_INS = 0x80 +PCI_AF_LENGTH = 2 +PCI_AF_CAP = 3 +PCI_AF_CAP_TP = 0x01 +PCI_AF_CAP_FLR = 0x02 +PCI_AF_CTRL = 4 +PCI_AF_CTRL_FLR = 0x01 +PCI_AF_STATUS = 5 +PCI_AF_STATUS_TP = 0x01 +PCI_CAP_AF_SIZEOF = 6 +PCI_EA_NUM_ENT = 2 +PCI_EA_NUM_ENT_MASK = 0x3f +PCI_EA_FIRST_ENT = 4 +PCI_EA_FIRST_ENT_BRIDGE = 8 +PCI_EA_ES = 0x00000007 +PCI_EA_BEI = 0x000000f0 +PCI_EA_SEC_BUS_MASK = 0xff +PCI_EA_SUB_BUS_MASK = 0xff00 +PCI_EA_SUB_BUS_SHIFT = 8 +PCI_EA_BEI_BAR0 = 0 +PCI_EA_BEI_BAR5 = 5 +PCI_EA_BEI_BRIDGE = 6 +PCI_EA_BEI_ENI = 7 +PCI_EA_BEI_ROM = 8 +PCI_EA_BEI_VF_BAR0 = 9 +PCI_EA_BEI_VF_BAR5 = 14 +PCI_EA_BEI_RESERVED = 15 +PCI_EA_PP = 0x0000ff00 +PCI_EA_SP = 0x00ff0000 +PCI_EA_P_MEM = 0x00 +PCI_EA_P_MEM_PREFETCH = 0x01 +PCI_EA_P_IO = 0x02 +PCI_EA_P_VF_MEM_PREFETCH = 0x03 +PCI_EA_P_VF_MEM = 0x04 +PCI_EA_P_BRIDGE_MEM = 0x05 +PCI_EA_P_BRIDGE_MEM_PREFETCH = 0x06 +PCI_EA_P_BRIDGE_IO = 0x07 +PCI_EA_P_MEM_RESERVED = 0xfd +PCI_EA_P_IO_RESERVED = 0xfe +PCI_EA_P_UNAVAILABLE = 0xff +PCI_EA_WRITABLE = 0x40000000 +PCI_EA_ENABLE = 0x80000000 +PCI_EA_BASE = 4 +PCI_EA_MAX_OFFSET = 8 +PCI_EA_IS_64 = 0x00000002 +PCI_EA_FIELD_MASK = 0xfffffffc +PCI_X_CMD = 2 +PCI_X_CMD_DPERR_E = 0x0001 +PCI_X_CMD_ERO = 0x0002 +PCI_X_CMD_READ_512 = 0x0000 +PCI_X_CMD_READ_1K = 0x0004 +PCI_X_CMD_READ_2K = 0x0008 +PCI_X_CMD_READ_4K = 0x000c +PCI_X_CMD_MAX_READ = 0x000c +PCI_X_CMD_SPLIT_1 = 0x0000 +PCI_X_CMD_SPLIT_2 = 0x0010 +PCI_X_CMD_SPLIT_3 = 0x0020 +PCI_X_CMD_SPLIT_4 = 0x0030 +PCI_X_CMD_SPLIT_8 = 0x0040 +PCI_X_CMD_SPLIT_12 = 0x0050 +PCI_X_CMD_SPLIT_16 = 0x0060 +PCI_X_CMD_SPLIT_32 = 0x0070 +PCI_X_CMD_MAX_SPLIT = 0x0070 +PCI_X_CMD_VERSION = lambda x: (((x) >> 12) & 3) # type: ignore +PCI_X_STATUS = 4 +PCI_X_STATUS_DEVFN = 0x000000ff +PCI_X_STATUS_BUS = 0x0000ff00 +PCI_X_STATUS_64BIT = 0x00010000 +PCI_X_STATUS_133MHZ = 0x00020000 +PCI_X_STATUS_SPL_DISC = 0x00040000 +PCI_X_STATUS_UNX_SPL = 0x00080000 +PCI_X_STATUS_COMPLEX = 0x00100000 +PCI_X_STATUS_MAX_READ = 0x00600000 +PCI_X_STATUS_MAX_SPLIT = 0x03800000 +PCI_X_STATUS_MAX_CUM = 0x1c000000 +PCI_X_STATUS_SPL_ERR = 0x20000000 +PCI_X_STATUS_266MHZ = 0x40000000 +PCI_X_STATUS_533MHZ = 0x80000000 +PCI_X_ECC_CSR = 8 +PCI_CAP_PCIX_SIZEOF_V0 = 8 +PCI_CAP_PCIX_SIZEOF_V1 = 24 +PCI_CAP_PCIX_SIZEOF_V2 = PCI_CAP_PCIX_SIZEOF_V1 +PCI_X_BRIDGE_SSTATUS = 2 +PCI_X_SSTATUS_64BIT = 0x0001 +PCI_X_SSTATUS_133MHZ = 0x0002 +PCI_X_SSTATUS_FREQ = 0x03c0 +PCI_X_SSTATUS_VERS = 0x3000 +PCI_X_SSTATUS_V1 = 0x1000 +PCI_X_SSTATUS_V2 = 0x2000 +PCI_X_SSTATUS_266MHZ = 0x4000 +PCI_X_SSTATUS_533MHZ = 0x8000 +PCI_X_BRIDGE_STATUS = 4 +PCI_SSVID_VENDOR_ID = 4 +PCI_SSVID_DEVICE_ID = 6 +PCI_EXP_FLAGS = 0x02 +PCI_EXP_FLAGS_VERS = 0x000f +PCI_EXP_FLAGS_TYPE = 0x00f0 +PCI_EXP_TYPE_ENDPOINT = 0x0 +PCI_EXP_TYPE_LEG_END = 0x1 +PCI_EXP_TYPE_ROOT_PORT = 0x4 +PCI_EXP_TYPE_UPSTREAM = 0x5 +PCI_EXP_TYPE_DOWNSTREAM = 0x6 +PCI_EXP_TYPE_PCI_BRIDGE = 0x7 +PCI_EXP_TYPE_PCIE_BRIDGE = 0x8 +PCI_EXP_TYPE_RC_END = 0x9 +PCI_EXP_TYPE_RC_EC = 0xa +PCI_EXP_FLAGS_SLOT = 0x0100 +PCI_EXP_FLAGS_IRQ = 0x3e00 +PCI_EXP_FLAGS_FLIT = 0x8000 +PCI_EXP_DEVCAP = 0x04 +PCI_EXP_DEVCAP_PAYLOAD = 0x00000007 +PCI_EXP_DEVCAP_PHANTOM = 0x00000018 +PCI_EXP_DEVCAP_EXT_TAG = 0x00000020 +PCI_EXP_DEVCAP_L0S = 0x000001c0 +PCI_EXP_DEVCAP_L1 = 0x00000e00 +PCI_EXP_DEVCAP_ATN_BUT = 0x00001000 +PCI_EXP_DEVCAP_ATN_IND = 0x00002000 +PCI_EXP_DEVCAP_PWR_IND = 0x00004000 +PCI_EXP_DEVCAP_RBER = 0x00008000 +PCI_EXP_DEVCAP_PWR_VAL = 0x03fc0000 +PCI_EXP_DEVCAP_PWR_SCL = 0x0c000000 +PCI_EXP_DEVCAP_FLR = 0x10000000 +PCI_EXP_DEVCTL = 0x08 +PCI_EXP_DEVCTL_CERE = 0x0001 +PCI_EXP_DEVCTL_NFERE = 0x0002 +PCI_EXP_DEVCTL_FERE = 0x0004 +PCI_EXP_DEVCTL_URRE = 0x0008 +PCI_EXP_DEVCTL_RELAX_EN = 0x0010 +PCI_EXP_DEVCTL_PAYLOAD = 0x00e0 +PCI_EXP_DEVCTL_PAYLOAD_128B = 0x0000 +PCI_EXP_DEVCTL_PAYLOAD_256B = 0x0020 +PCI_EXP_DEVCTL_PAYLOAD_512B = 0x0040 +PCI_EXP_DEVCTL_PAYLOAD_1024B = 0x0060 +PCI_EXP_DEVCTL_PAYLOAD_2048B = 0x0080 +PCI_EXP_DEVCTL_PAYLOAD_4096B = 0x00a0 +PCI_EXP_DEVCTL_EXT_TAG = 0x0100 +PCI_EXP_DEVCTL_PHANTOM = 0x0200 +PCI_EXP_DEVCTL_AUX_PME = 0x0400 +PCI_EXP_DEVCTL_NOSNOOP_EN = 0x0800 +PCI_EXP_DEVCTL_READRQ = 0x7000 +PCI_EXP_DEVCTL_READRQ_128B = 0x0000 +PCI_EXP_DEVCTL_READRQ_256B = 0x1000 +PCI_EXP_DEVCTL_READRQ_512B = 0x2000 +PCI_EXP_DEVCTL_READRQ_1024B = 0x3000 +PCI_EXP_DEVCTL_READRQ_2048B = 0x4000 +PCI_EXP_DEVCTL_READRQ_4096B = 0x5000 +PCI_EXP_DEVCTL_BCR_FLR = 0x8000 +PCI_EXP_DEVSTA = 0x0a +PCI_EXP_DEVSTA_CED = 0x0001 +PCI_EXP_DEVSTA_NFED = 0x0002 +PCI_EXP_DEVSTA_FED = 0x0004 +PCI_EXP_DEVSTA_URD = 0x0008 +PCI_EXP_DEVSTA_AUXPD = 0x0010 +PCI_EXP_DEVSTA_TRPND = 0x0020 +PCI_CAP_EXP_RC_ENDPOINT_SIZEOF_V1 = 12 +PCI_EXP_LNKCAP = 0x0c +PCI_EXP_LNKCAP_SLS = 0x0000000f +PCI_EXP_LNKCAP_SLS_2_5GB = 0x00000001 +PCI_EXP_LNKCAP_SLS_5_0GB = 0x00000002 +PCI_EXP_LNKCAP_SLS_8_0GB = 0x00000003 +PCI_EXP_LNKCAP_SLS_16_0GB = 0x00000004 +PCI_EXP_LNKCAP_SLS_32_0GB = 0x00000005 +PCI_EXP_LNKCAP_SLS_64_0GB = 0x00000006 +PCI_EXP_LNKCAP_MLW = 0x000003f0 +PCI_EXP_LNKCAP_ASPMS = 0x00000c00 +PCI_EXP_LNKCAP_ASPM_L0S = 0x00000400 +PCI_EXP_LNKCAP_ASPM_L1 = 0x00000800 +PCI_EXP_LNKCAP_L0SEL = 0x00007000 +PCI_EXP_LNKCAP_L1EL = 0x00038000 +PCI_EXP_LNKCAP_CLKPM = 0x00040000 +PCI_EXP_LNKCAP_SDERC = 0x00080000 +PCI_EXP_LNKCAP_DLLLARC = 0x00100000 +PCI_EXP_LNKCAP_LBNC = 0x00200000 +PCI_EXP_LNKCAP_PN = 0xff000000 +PCI_EXP_LNKCTL = 0x10 +PCI_EXP_LNKCTL_ASPMC = 0x0003 +PCI_EXP_LNKCTL_ASPM_L0S = 0x0001 +PCI_EXP_LNKCTL_ASPM_L1 = 0x0002 +PCI_EXP_LNKCTL_RCB = 0x0008 +PCI_EXP_LNKCTL_LD = 0x0010 +PCI_EXP_LNKCTL_RL = 0x0020 +PCI_EXP_LNKCTL_CCC = 0x0040 +PCI_EXP_LNKCTL_ES = 0x0080 +PCI_EXP_LNKCTL_CLKREQ_EN = 0x0100 +PCI_EXP_LNKCTL_HAWD = 0x0200 +PCI_EXP_LNKCTL_LBMIE = 0x0400 +PCI_EXP_LNKCTL_LABIE = 0x0800 +PCI_EXP_LNKSTA = 0x12 +PCI_EXP_LNKSTA_CLS = 0x000f +PCI_EXP_LNKSTA_CLS_2_5GB = 0x0001 +PCI_EXP_LNKSTA_CLS_5_0GB = 0x0002 +PCI_EXP_LNKSTA_CLS_8_0GB = 0x0003 +PCI_EXP_LNKSTA_CLS_16_0GB = 0x0004 +PCI_EXP_LNKSTA_CLS_32_0GB = 0x0005 +PCI_EXP_LNKSTA_CLS_64_0GB = 0x0006 +PCI_EXP_LNKSTA_NLW = 0x03f0 +PCI_EXP_LNKSTA_NLW_X1 = 0x0010 +PCI_EXP_LNKSTA_NLW_X2 = 0x0020 +PCI_EXP_LNKSTA_NLW_X4 = 0x0040 +PCI_EXP_LNKSTA_NLW_X8 = 0x0080 +PCI_EXP_LNKSTA_NLW_SHIFT = 4 +PCI_EXP_LNKSTA_LT = 0x0800 +PCI_EXP_LNKSTA_SLC = 0x1000 +PCI_EXP_LNKSTA_DLLLA = 0x2000 +PCI_EXP_LNKSTA_LBMS = 0x4000 +PCI_EXP_LNKSTA_LABS = 0x8000 +PCI_CAP_EXP_ENDPOINT_SIZEOF_V1 = 20 +PCI_EXP_SLTCAP = 0x14 +PCI_EXP_SLTCAP_ABP = 0x00000001 +PCI_EXP_SLTCAP_PCP = 0x00000002 +PCI_EXP_SLTCAP_MRLSP = 0x00000004 +PCI_EXP_SLTCAP_AIP = 0x00000008 +PCI_EXP_SLTCAP_PIP = 0x00000010 +PCI_EXP_SLTCAP_HPS = 0x00000020 +PCI_EXP_SLTCAP_HPC = 0x00000040 +PCI_EXP_SLTCAP_SPLV = 0x00007f80 +PCI_EXP_SLTCAP_SPLS = 0x00018000 +PCI_EXP_SLTCAP_EIP = 0x00020000 +PCI_EXP_SLTCAP_NCCS = 0x00040000 +PCI_EXP_SLTCAP_PSN = 0xfff80000 +PCI_EXP_SLTCTL = 0x18 +PCI_EXP_SLTCTL_ABPE = 0x0001 +PCI_EXP_SLTCTL_PFDE = 0x0002 +PCI_EXP_SLTCTL_MRLSCE = 0x0004 +PCI_EXP_SLTCTL_PDCE = 0x0008 +PCI_EXP_SLTCTL_CCIE = 0x0010 +PCI_EXP_SLTCTL_HPIE = 0x0020 +PCI_EXP_SLTCTL_AIC = 0x00c0 +PCI_EXP_SLTCTL_ATTN_IND_SHIFT = 6 +PCI_EXP_SLTCTL_ATTN_IND_ON = 0x0040 +PCI_EXP_SLTCTL_ATTN_IND_BLINK = 0x0080 +PCI_EXP_SLTCTL_ATTN_IND_OFF = 0x00c0 +PCI_EXP_SLTCTL_PIC = 0x0300 +PCI_EXP_SLTCTL_PWR_IND_ON = 0x0100 +PCI_EXP_SLTCTL_PWR_IND_BLINK = 0x0200 +PCI_EXP_SLTCTL_PWR_IND_OFF = 0x0300 +PCI_EXP_SLTCTL_PCC = 0x0400 +PCI_EXP_SLTCTL_PWR_ON = 0x0000 +PCI_EXP_SLTCTL_PWR_OFF = 0x0400 +PCI_EXP_SLTCTL_EIC = 0x0800 +PCI_EXP_SLTCTL_DLLSCE = 0x1000 +PCI_EXP_SLTCTL_ASPL_DISABLE = 0x2000 +PCI_EXP_SLTCTL_IBPD_DISABLE = 0x4000 +PCI_EXP_SLTSTA = 0x1a +PCI_EXP_SLTSTA_ABP = 0x0001 +PCI_EXP_SLTSTA_PFD = 0x0002 +PCI_EXP_SLTSTA_MRLSC = 0x0004 +PCI_EXP_SLTSTA_PDC = 0x0008 +PCI_EXP_SLTSTA_CC = 0x0010 +PCI_EXP_SLTSTA_MRLSS = 0x0020 +PCI_EXP_SLTSTA_PDS = 0x0040 +PCI_EXP_SLTSTA_EIS = 0x0080 +PCI_EXP_SLTSTA_DLLSC = 0x0100 +PCI_EXP_RTCTL = 0x1c +PCI_EXP_RTCTL_SECEE = 0x0001 +PCI_EXP_RTCTL_SENFEE = 0x0002 +PCI_EXP_RTCTL_SEFEE = 0x0004 +PCI_EXP_RTCTL_PMEIE = 0x0008 +PCI_EXP_RTCTL_RRS_SVE = 0x0010 +PCI_EXP_RTCTL_CRSSVE = PCI_EXP_RTCTL_RRS_SVE +PCI_EXP_RTCAP = 0x1e +PCI_EXP_RTCAP_RRS_SV = 0x0001 +PCI_EXP_RTCAP_CRSVIS = PCI_EXP_RTCAP_RRS_SV +PCI_EXP_RTSTA = 0x20 +PCI_EXP_RTSTA_PME_RQ_ID = 0x0000ffff +PCI_EXP_RTSTA_PME = 0x00010000 +PCI_EXP_RTSTA_PENDING = 0x00020000 +PCI_EXP_DEVCAP2 = 0x24 +PCI_EXP_DEVCAP2_COMP_TMOUT_DIS = 0x00000010 +PCI_EXP_DEVCAP2_ARI = 0x00000020 +PCI_EXP_DEVCAP2_ATOMIC_ROUTE = 0x00000040 +PCI_EXP_DEVCAP2_ATOMIC_COMP32 = 0x00000080 +PCI_EXP_DEVCAP2_ATOMIC_COMP64 = 0x00000100 +PCI_EXP_DEVCAP2_ATOMIC_COMP128 = 0x00000200 +PCI_EXP_DEVCAP2_LTR = 0x00000800 +PCI_EXP_DEVCAP2_TPH_COMP_MASK = 0x00003000 +PCI_EXP_DEVCAP2_OBFF_MASK = 0x000c0000 +PCI_EXP_DEVCAP2_OBFF_MSG = 0x00040000 +PCI_EXP_DEVCAP2_OBFF_WAKE = 0x00080000 +PCI_EXP_DEVCAP2_EE_PREFIX = 0x00200000 +PCI_EXP_DEVCAP2_EE_PREFIX_MAX = 0x00c00000 +PCI_EXP_DEVCTL2 = 0x28 +PCI_EXP_DEVCTL2_COMP_TIMEOUT = 0x000f +PCI_EXP_DEVCTL2_COMP_TMOUT_DIS = 0x0010 +PCI_EXP_DEVCTL2_ARI = 0x0020 +PCI_EXP_DEVCTL2_ATOMIC_REQ = 0x0040 +PCI_EXP_DEVCTL2_ATOMIC_EGRESS_BLOCK = 0x0080 +PCI_EXP_DEVCTL2_IDO_REQ_EN = 0x0100 +PCI_EXP_DEVCTL2_IDO_CMP_EN = 0x0200 +PCI_EXP_DEVCTL2_LTR_EN = 0x0400 +PCI_EXP_DEVCTL2_OBFF_MSGA_EN = 0x2000 +PCI_EXP_DEVCTL2_OBFF_MSGB_EN = 0x4000 +PCI_EXP_DEVCTL2_OBFF_WAKE_EN = 0x6000 +PCI_EXP_DEVSTA2 = 0x2a +PCI_CAP_EXP_RC_ENDPOINT_SIZEOF_V2 = 0x2c +PCI_EXP_LNKCAP2 = 0x2c +PCI_EXP_LNKCAP2_SLS = 0x000000fe +PCI_EXP_LNKCAP2_SLS_2_5GB = 0x00000002 +PCI_EXP_LNKCAP2_SLS_5_0GB = 0x00000004 +PCI_EXP_LNKCAP2_SLS_8_0GB = 0x00000008 +PCI_EXP_LNKCAP2_SLS_16_0GB = 0x00000010 +PCI_EXP_LNKCAP2_SLS_32_0GB = 0x00000020 +PCI_EXP_LNKCAP2_SLS_64_0GB = 0x00000040 +PCI_EXP_LNKCAP2_CROSSLINK = 0x00000100 +PCI_EXP_LNKCTL2 = 0x30 +PCI_EXP_LNKCTL2_TLS = 0x000f +PCI_EXP_LNKCTL2_TLS_2_5GT = 0x0001 +PCI_EXP_LNKCTL2_TLS_5_0GT = 0x0002 +PCI_EXP_LNKCTL2_TLS_8_0GT = 0x0003 +PCI_EXP_LNKCTL2_TLS_16_0GT = 0x0004 +PCI_EXP_LNKCTL2_TLS_32_0GT = 0x0005 +PCI_EXP_LNKCTL2_TLS_64_0GT = 0x0006 +PCI_EXP_LNKCTL2_ENTER_COMP = 0x0010 +PCI_EXP_LNKCTL2_TX_MARGIN = 0x0380 +PCI_EXP_LNKCTL2_HASD = 0x0020 +PCI_EXP_LNKSTA2 = 0x32 +PCI_EXP_LNKSTA2_FLIT = 0x0400 +PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 = 0x32 +PCI_EXP_SLTCAP2 = 0x34 +PCI_EXP_SLTCAP2_IBPD = 0x00000001 +PCI_EXP_SLTCTL2 = 0x38 +PCI_EXP_SLTSTA2 = 0x3a +PCI_EXT_CAP_ID = lambda header: (header & 0x0000ffff) # type: ignore +PCI_EXT_CAP_VER = lambda header: ((header >> 16) & 0xf) # type: ignore +PCI_EXT_CAP_NEXT = lambda header: ((header >> 20) & 0xffc) # type: ignore +PCI_EXT_CAP_ID_ERR = 0x01 +PCI_EXT_CAP_ID_VC = 0x02 +PCI_EXT_CAP_ID_DSN = 0x03 +PCI_EXT_CAP_ID_PWR = 0x04 +PCI_EXT_CAP_ID_RCLD = 0x05 +PCI_EXT_CAP_ID_RCILC = 0x06 +PCI_EXT_CAP_ID_RCEC = 0x07 +PCI_EXT_CAP_ID_MFVC = 0x08 +PCI_EXT_CAP_ID_VC9 = 0x09 +PCI_EXT_CAP_ID_RCRB = 0x0A +PCI_EXT_CAP_ID_VNDR = 0x0B +PCI_EXT_CAP_ID_CAC = 0x0C +PCI_EXT_CAP_ID_ACS = 0x0D +PCI_EXT_CAP_ID_ARI = 0x0E +PCI_EXT_CAP_ID_ATS = 0x0F +PCI_EXT_CAP_ID_SRIOV = 0x10 +PCI_EXT_CAP_ID_MRIOV = 0x11 +PCI_EXT_CAP_ID_MCAST = 0x12 +PCI_EXT_CAP_ID_PRI = 0x13 +PCI_EXT_CAP_ID_AMD_XXX = 0x14 +PCI_EXT_CAP_ID_REBAR = 0x15 +PCI_EXT_CAP_ID_DPA = 0x16 +PCI_EXT_CAP_ID_TPH = 0x17 +PCI_EXT_CAP_ID_LTR = 0x18 +PCI_EXT_CAP_ID_SECPCI = 0x19 +PCI_EXT_CAP_ID_PMUX = 0x1A +PCI_EXT_CAP_ID_PASID = 0x1B +PCI_EXT_CAP_ID_DPC = 0x1D +PCI_EXT_CAP_ID_L1SS = 0x1E +PCI_EXT_CAP_ID_PTM = 0x1F +PCI_EXT_CAP_ID_DVSEC = 0x23 +PCI_EXT_CAP_ID_VF_REBAR = 0x24 +PCI_EXT_CAP_ID_DLF = 0x25 +PCI_EXT_CAP_ID_PL_16GT = 0x26 +PCI_EXT_CAP_ID_NPEM = 0x29 +PCI_EXT_CAP_ID_PL_32GT = 0x2A +PCI_EXT_CAP_ID_DOE = 0x2E +PCI_EXT_CAP_ID_PL_64GT = 0x31 +PCI_EXT_CAP_ID_MAX = PCI_EXT_CAP_ID_PL_64GT +PCI_EXT_CAP_DSN_SIZEOF = 12 +PCI_EXT_CAP_MCAST_ENDPOINT_SIZEOF = 40 +PCI_ERR_UNCOR_STATUS = 0x04 +PCI_ERR_UNC_UND = 0x00000001 +PCI_ERR_UNC_DLP = 0x00000010 +PCI_ERR_UNC_SURPDN = 0x00000020 +PCI_ERR_UNC_POISON_TLP = 0x00001000 +PCI_ERR_UNC_FCP = 0x00002000 +PCI_ERR_UNC_COMP_TIME = 0x00004000 +PCI_ERR_UNC_COMP_ABORT = 0x00008000 +PCI_ERR_UNC_UNX_COMP = 0x00010000 +PCI_ERR_UNC_RX_OVER = 0x00020000 +PCI_ERR_UNC_MALF_TLP = 0x00040000 +PCI_ERR_UNC_ECRC = 0x00080000 +PCI_ERR_UNC_UNSUP = 0x00100000 +PCI_ERR_UNC_ACSV = 0x00200000 +PCI_ERR_UNC_INTN = 0x00400000 +PCI_ERR_UNC_MCBTLP = 0x00800000 +PCI_ERR_UNC_ATOMEG = 0x01000000 +PCI_ERR_UNC_TLPPRE = 0x02000000 +PCI_ERR_UNC_POISON_BLK = 0x04000000 +PCI_ERR_UNC_DMWR_BLK = 0x08000000 +PCI_ERR_UNC_IDE_CHECK = 0x10000000 +PCI_ERR_UNC_MISR_IDE = 0x20000000 +PCI_ERR_UNC_PCRC_CHECK = 0x40000000 +PCI_ERR_UNC_XLAT_BLK = 0x80000000 +PCI_ERR_UNCOR_MASK = 0x08 +PCI_ERR_UNCOR_SEVER = 0x0c +PCI_ERR_COR_STATUS = 0x10 +PCI_ERR_COR_RCVR = 0x00000001 +PCI_ERR_COR_BAD_TLP = 0x00000040 +PCI_ERR_COR_BAD_DLLP = 0x00000080 +PCI_ERR_COR_REP_ROLL = 0x00000100 +PCI_ERR_COR_REP_TIMER = 0x00001000 +PCI_ERR_COR_ADV_NFAT = 0x00002000 +PCI_ERR_COR_INTERNAL = 0x00004000 +PCI_ERR_COR_LOG_OVER = 0x00008000 +PCI_ERR_COR_MASK = 0x14 +PCI_ERR_CAP = 0x18 +PCI_ERR_CAP_FEP = lambda x: ((x) & 0x1f) # type: ignore +PCI_ERR_CAP_ECRC_GENC = 0x00000020 +PCI_ERR_CAP_ECRC_GENE = 0x00000040 +PCI_ERR_CAP_ECRC_CHKC = 0x00000080 +PCI_ERR_CAP_ECRC_CHKE = 0x00000100 +PCI_ERR_CAP_PREFIX_LOG_PRESENT = 0x00000800 +PCI_ERR_CAP_COMP_TIME_LOG = 0x00001000 +PCI_ERR_CAP_TLP_LOG_FLIT = 0x00040000 +PCI_ERR_CAP_TLP_LOG_SIZE = 0x00f80000 +PCI_ERR_HEADER_LOG = 0x1c +PCI_ERR_ROOT_COMMAND = 0x2c +PCI_ERR_ROOT_CMD_COR_EN = 0x00000001 +PCI_ERR_ROOT_CMD_NONFATAL_EN = 0x00000002 +PCI_ERR_ROOT_CMD_FATAL_EN = 0x00000004 +PCI_ERR_ROOT_STATUS = 0x30 +PCI_ERR_ROOT_COR_RCV = 0x00000001 +PCI_ERR_ROOT_MULTI_COR_RCV = 0x00000002 +PCI_ERR_ROOT_UNCOR_RCV = 0x00000004 +PCI_ERR_ROOT_MULTI_UNCOR_RCV = 0x00000008 +PCI_ERR_ROOT_FIRST_FATAL = 0x00000010 +PCI_ERR_ROOT_NONFATAL_RCV = 0x00000020 +PCI_ERR_ROOT_FATAL_RCV = 0x00000040 +PCI_ERR_ROOT_AER_IRQ = 0xf8000000 +PCI_ERR_ROOT_ERR_SRC = 0x34 +PCI_ERR_PREFIX_LOG = 0x38 +PCI_VC_PORT_CAP1 = 0x04 +PCI_VC_CAP1_EVCC = 0x00000007 +PCI_VC_CAP1_LPEVCC = 0x00000070 +PCI_VC_CAP1_ARB_SIZE = 0x00000c00 +PCI_VC_PORT_CAP2 = 0x08 +PCI_VC_CAP2_32_PHASE = 0x00000002 +PCI_VC_CAP2_64_PHASE = 0x00000004 +PCI_VC_CAP2_128_PHASE = 0x00000008 +PCI_VC_CAP2_ARB_OFF = 0xff000000 +PCI_VC_PORT_CTRL = 0x0c +PCI_VC_PORT_CTRL_LOAD_TABLE = 0x00000001 +PCI_VC_PORT_STATUS = 0x0e +PCI_VC_PORT_STATUS_TABLE = 0x00000001 +PCI_VC_RES_CAP = 0x10 +PCI_VC_RES_CAP_32_PHASE = 0x00000002 +PCI_VC_RES_CAP_64_PHASE = 0x00000004 +PCI_VC_RES_CAP_128_PHASE = 0x00000008 +PCI_VC_RES_CAP_128_PHASE_TB = 0x00000010 +PCI_VC_RES_CAP_256_PHASE = 0x00000020 +PCI_VC_RES_CAP_ARB_OFF = 0xff000000 +PCI_VC_RES_CTRL = 0x14 +PCI_VC_RES_CTRL_LOAD_TABLE = 0x00010000 +PCI_VC_RES_CTRL_ARB_SELECT = 0x000e0000 +PCI_VC_RES_CTRL_ID = 0x07000000 +PCI_VC_RES_CTRL_ENABLE = 0x80000000 +PCI_VC_RES_STATUS = 0x1a +PCI_VC_RES_STATUS_TABLE = 0x00000001 +PCI_VC_RES_STATUS_NEGO = 0x00000002 +PCI_CAP_VC_BASE_SIZEOF = 0x10 +PCI_CAP_VC_PER_VC_SIZEOF = 0x0c +PCI_PWR_DSR = 0x04 +PCI_PWR_DATA = 0x08 +PCI_PWR_DATA_BASE = lambda x: ((x) & 0xff) # type: ignore +PCI_PWR_DATA_SCALE = lambda x: (((x) >> 8) & 3) # type: ignore +PCI_PWR_DATA_PM_SUB = lambda x: (((x) >> 10) & 7) # type: ignore +PCI_PWR_DATA_PM_STATE = lambda x: (((x) >> 13) & 3) # type: ignore +PCI_PWR_DATA_TYPE = lambda x: (((x) >> 15) & 7) # type: ignore +PCI_PWR_DATA_RAIL = lambda x: (((x) >> 18) & 7) # type: ignore +PCI_PWR_CAP = 0x0c +PCI_PWR_CAP_BUDGET = lambda x: ((x) & 1) # type: ignore +PCI_EXT_CAP_PWR_SIZEOF = 0x10 +PCI_RCEC_RCIEP_BITMAP = 4 +PCI_RCEC_BUSN = 8 +PCI_RCEC_BUSN_REG_VER = 0x02 +PCI_RCEC_BUSN_NEXT = lambda x: (((x) >> 8) & 0xff) # type: ignore +PCI_RCEC_BUSN_LAST = lambda x: (((x) >> 16) & 0xff) # type: ignore +PCI_VNDR_HEADER = 4 +PCI_VNDR_HEADER_ID = lambda x: ((x) & 0xffff) # type: ignore +PCI_VNDR_HEADER_REV = lambda x: (((x) >> 16) & 0xf) # type: ignore +PCI_VNDR_HEADER_LEN = lambda x: (((x) >> 20) & 0xfff) # type: ignore +HT_3BIT_CAP_MASK = 0xE0 +HT_CAPTYPE_SLAVE = 0x00 +HT_CAPTYPE_HOST = 0x20 +HT_5BIT_CAP_MASK = 0xF8 +HT_CAPTYPE_IRQ = 0x80 +HT_CAPTYPE_REMAPPING_40 = 0xA0 +HT_CAPTYPE_REMAPPING_64 = 0xA2 +HT_CAPTYPE_UNITID_CLUMP = 0x90 +HT_CAPTYPE_EXTCONF = 0x98 +HT_CAPTYPE_MSI_MAPPING = 0xA8 +HT_MSI_FLAGS = 0x02 +HT_MSI_FLAGS_ENABLE = 0x1 +HT_MSI_FLAGS_FIXED = 0x2 +HT_MSI_FIXED_ADDR = 0x00000000FEE00000 +HT_MSI_ADDR_LO = 0x04 +HT_MSI_ADDR_LO_MASK = 0xFFF00000 +HT_MSI_ADDR_HI = 0x08 +HT_CAPTYPE_DIRECT_ROUTE = 0xB0 +HT_CAPTYPE_VCSET = 0xB8 +HT_CAPTYPE_ERROR_RETRY = 0xC0 +HT_CAPTYPE_GEN3 = 0xD0 +HT_CAPTYPE_PM = 0xE0 +HT_CAP_SIZEOF_LONG = 28 +HT_CAP_SIZEOF_SHORT = 24 +PCI_ARI_CAP = 0x04 +PCI_ARI_CAP_MFVC = 0x0001 +PCI_ARI_CAP_ACS = 0x0002 +PCI_ARI_CAP_NFN = lambda x: (((x) >> 8) & 0xff) # type: ignore +PCI_ARI_CTRL = 0x06 +PCI_ARI_CTRL_MFVC = 0x0001 +PCI_ARI_CTRL_ACS = 0x0002 +PCI_ARI_CTRL_FG = lambda x: (((x) >> 4) & 7) # type: ignore +PCI_EXT_CAP_ARI_SIZEOF = 8 +PCI_ATS_CAP = 0x04 +PCI_ATS_CAP_QDEP = lambda x: ((x) & 0x1f) # type: ignore +PCI_ATS_MAX_QDEP = 32 +PCI_ATS_CAP_PAGE_ALIGNED = 0x0020 +PCI_ATS_CTRL = 0x06 +PCI_ATS_CTRL_ENABLE = 0x8000 +PCI_ATS_CTRL_STU = lambda x: ((x) & 0x1f) # type: ignore +PCI_ATS_MIN_STU = 12 +PCI_EXT_CAP_ATS_SIZEOF = 8 +PCI_PRI_CTRL = 0x04 +PCI_PRI_CTRL_ENABLE = 0x0001 +PCI_PRI_CTRL_RESET = 0x0002 +PCI_PRI_STATUS = 0x06 +PCI_PRI_STATUS_RF = 0x0001 +PCI_PRI_STATUS_UPRGI = 0x0002 +PCI_PRI_STATUS_STOPPED = 0x0100 +PCI_PRI_STATUS_PASID = 0x8000 +PCI_PRI_MAX_REQ = 0x08 +PCI_PRI_ALLOC_REQ = 0x0c +PCI_EXT_CAP_PRI_SIZEOF = 16 +PCI_PASID_CAP = 0x04 +PCI_PASID_CAP_EXEC = 0x0002 +PCI_PASID_CAP_PRIV = 0x0004 +PCI_PASID_CAP_WIDTH = 0x1f00 +PCI_PASID_CTRL = 0x06 +PCI_PASID_CTRL_ENABLE = 0x0001 +PCI_PASID_CTRL_EXEC = 0x0002 +PCI_PASID_CTRL_PRIV = 0x0004 +PCI_EXT_CAP_PASID_SIZEOF = 8 +PCI_SRIOV_CAP = 0x04 +PCI_SRIOV_CAP_VFM = 0x00000001 +PCI_SRIOV_CAP_INTR = lambda x: ((x) >> 21) # type: ignore +PCI_SRIOV_CTRL = 0x08 +PCI_SRIOV_CTRL_VFE = 0x0001 +PCI_SRIOV_CTRL_VFM = 0x0002 +PCI_SRIOV_CTRL_INTR = 0x0004 +PCI_SRIOV_CTRL_MSE = 0x0008 +PCI_SRIOV_CTRL_ARI = 0x0010 +PCI_SRIOV_STATUS = 0x0a +PCI_SRIOV_STATUS_VFM = 0x0001 +PCI_SRIOV_INITIAL_VF = 0x0c +PCI_SRIOV_TOTAL_VF = 0x0e +PCI_SRIOV_NUM_VF = 0x10 +PCI_SRIOV_FUNC_LINK = 0x12 +PCI_SRIOV_VF_OFFSET = 0x14 +PCI_SRIOV_VF_STRIDE = 0x16 +PCI_SRIOV_VF_DID = 0x1a +PCI_SRIOV_SUP_PGSIZE = 0x1c +PCI_SRIOV_SYS_PGSIZE = 0x20 +PCI_SRIOV_BAR = 0x24 +PCI_SRIOV_NUM_BARS = 6 +PCI_SRIOV_VFM = 0x3c +PCI_SRIOV_VFM_BIR = lambda x: ((x) & 7) # type: ignore +PCI_SRIOV_VFM_OFFSET = lambda x: ((x) & ~7) # type: ignore +PCI_SRIOV_VFM_UA = 0x0 +PCI_SRIOV_VFM_MI = 0x1 +PCI_SRIOV_VFM_MO = 0x2 +PCI_SRIOV_VFM_AV = 0x3 +PCI_EXT_CAP_SRIOV_SIZEOF = 0x40 +PCI_LTR_MAX_SNOOP_LAT = 0x4 +PCI_LTR_MAX_NOSNOOP_LAT = 0x6 +PCI_LTR_VALUE_MASK = 0x000003ff +PCI_LTR_SCALE_MASK = 0x00001c00 +PCI_LTR_SCALE_SHIFT = 10 +PCI_LTR_NOSNOOP_VALUE = 0x03ff0000 +PCI_LTR_NOSNOOP_SCALE = 0x1c000000 +PCI_EXT_CAP_LTR_SIZEOF = 8 +PCI_ACS_CAP = 0x04 +PCI_ACS_SV = 0x0001 +PCI_ACS_TB = 0x0002 +PCI_ACS_RR = 0x0004 +PCI_ACS_CR = 0x0008 +PCI_ACS_UF = 0x0010 +PCI_ACS_EC = 0x0020 +PCI_ACS_DT = 0x0040 +PCI_ACS_EGRESS_BITS = 0x05 +PCI_ACS_CTRL = 0x06 +PCI_ACS_EGRESS_CTL_V = 0x08 +PCI_SATA_REGS = 4 +PCI_SATA_REGS_MASK = 0xF +PCI_SATA_REGS_INLINE = 0xF +PCI_SATA_SIZEOF_SHORT = 8 +PCI_SATA_SIZEOF_LONG = 16 +PCI_REBAR_CAP = 4 +PCI_REBAR_CAP_SIZES = 0xFFFFFFF0 +PCI_REBAR_CTRL = 8 +PCI_REBAR_CTRL_BAR_IDX = 0x00000007 +PCI_REBAR_CTRL_NBAR_MASK = 0x000000E0 +PCI_REBAR_CTRL_NBAR_SHIFT = 5 +PCI_REBAR_CTRL_BAR_SIZE = 0x00001F00 +PCI_REBAR_CTRL_BAR_SHIFT = 8 +PCI_DPA_CAP = 4 +PCI_DPA_CAP_SUBSTATE_MASK = 0x1F +PCI_DPA_BASE_SIZEOF = 16 +PCI_EXP_DEVCAP2_TPH_COMP_NONE = 0x0 +PCI_EXP_DEVCAP2_TPH_COMP_TPH_ONLY = 0x1 +PCI_EXP_DEVCAP2_TPH_COMP_EXT_TPH = 0x3 +PCI_TPH_CAP = 4 +PCI_TPH_CAP_ST_NS = 0x00000001 +PCI_TPH_CAP_ST_IV = 0x00000002 +PCI_TPH_CAP_ST_DS = 0x00000004 +PCI_TPH_CAP_EXT_TPH = 0x00000100 +PCI_TPH_CAP_LOC_MASK = 0x00000600 +PCI_TPH_LOC_NONE = 0x00000000 +PCI_TPH_LOC_CAP = 0x00000200 +PCI_TPH_LOC_MSIX = 0x00000400 +PCI_TPH_CAP_ST_MASK = 0x07FF0000 +PCI_TPH_CAP_ST_SHIFT = 16 +PCI_TPH_BASE_SIZEOF = 0xc +PCI_TPH_CTRL = 8 +PCI_TPH_CTRL_MODE_SEL_MASK = 0x00000007 +PCI_TPH_ST_NS_MODE = 0x0 +PCI_TPH_ST_IV_MODE = 0x1 +PCI_TPH_ST_DS_MODE = 0x2 +PCI_TPH_CTRL_REQ_EN_MASK = 0x00000300 +PCI_TPH_REQ_DISABLE = 0x0 +PCI_TPH_REQ_TPH_ONLY = 0x1 +PCI_TPH_REQ_EXT_TPH = 0x3 +PCI_EXP_DPC_CAP = 0x04 +PCI_EXP_DPC_IRQ = 0x001F +PCI_EXP_DPC_CAP_RP_EXT = 0x0020 +PCI_EXP_DPC_CAP_POISONED_TLP = 0x0040 +PCI_EXP_DPC_CAP_SW_TRIGGER = 0x0080 +PCI_EXP_DPC_RP_PIO_LOG_SIZE = 0x0F00 +PCI_EXP_DPC_CAP_DL_ACTIVE = 0x1000 +PCI_EXP_DPC_RP_PIO_LOG_SIZE4 = 0x2000 +PCI_EXP_DPC_CTL = 0x06 +PCI_EXP_DPC_CTL_EN_FATAL = 0x0001 +PCI_EXP_DPC_CTL_EN_NONFATAL = 0x0002 +PCI_EXP_DPC_CTL_INT_EN = 0x0008 +PCI_EXP_DPC_STATUS = 0x08 +PCI_EXP_DPC_STATUS_TRIGGER = 0x0001 +PCI_EXP_DPC_STATUS_TRIGGER_RSN = 0x0006 +PCI_EXP_DPC_STATUS_TRIGGER_RSN_UNCOR = 0x0000 +PCI_EXP_DPC_STATUS_TRIGGER_RSN_NFE = 0x0002 +PCI_EXP_DPC_STATUS_TRIGGER_RSN_FE = 0x0004 +PCI_EXP_DPC_STATUS_TRIGGER_RSN_IN_EXT = 0x0006 +PCI_EXP_DPC_STATUS_INTERRUPT = 0x0008 +PCI_EXP_DPC_RP_BUSY = 0x0010 +PCI_EXP_DPC_STATUS_TRIGGER_RSN_EXT = 0x0060 +PCI_EXP_DPC_STATUS_TRIGGER_RSN_RP_PIO = 0x0000 +PCI_EXP_DPC_STATUS_TRIGGER_RSN_SW_TRIGGER = 0x0020 +PCI_EXP_DPC_RP_PIO_FEP = 0x1f00 +PCI_EXP_DPC_SOURCE_ID = 0x0A +PCI_EXP_DPC_RP_PIO_STATUS = 0x0C +PCI_EXP_DPC_RP_PIO_MASK = 0x10 +PCI_EXP_DPC_RP_PIO_SEVERITY = 0x14 +PCI_EXP_DPC_RP_PIO_SYSERROR = 0x18 +PCI_EXP_DPC_RP_PIO_EXCEPTION = 0x1C +PCI_EXP_DPC_RP_PIO_HEADER_LOG = 0x20 +PCI_EXP_DPC_RP_PIO_IMPSPEC_LOG = 0x30 +PCI_EXP_DPC_RP_PIO_TLPPREFIX_LOG = 0x34 +PCI_PTM_CAP = 0x04 +PCI_PTM_CAP_REQ = 0x00000001 +PCI_PTM_CAP_RES = 0x00000002 +PCI_PTM_CAP_ROOT = 0x00000004 +PCI_PTM_GRANULARITY_MASK = 0x0000FF00 +PCI_PTM_CTRL = 0x08 +PCI_PTM_CTRL_ENABLE = 0x00000001 +PCI_PTM_CTRL_ROOT = 0x00000002 +PCI_L1SS_CAP = 0x04 +PCI_L1SS_CAP_PCIPM_L1_2 = 0x00000001 +PCI_L1SS_CAP_PCIPM_L1_1 = 0x00000002 +PCI_L1SS_CAP_ASPM_L1_2 = 0x00000004 +PCI_L1SS_CAP_ASPM_L1_1 = 0x00000008 +PCI_L1SS_CAP_L1_PM_SS = 0x00000010 +PCI_L1SS_CAP_CM_RESTORE_TIME = 0x0000ff00 +PCI_L1SS_CAP_P_PWR_ON_SCALE = 0x00030000 +PCI_L1SS_CAP_P_PWR_ON_VALUE = 0x00f80000 +PCI_L1SS_CTL1 = 0x08 +PCI_L1SS_CTL1_PCIPM_L1_2 = 0x00000001 +PCI_L1SS_CTL1_PCIPM_L1_1 = 0x00000002 +PCI_L1SS_CTL1_ASPM_L1_2 = 0x00000004 +PCI_L1SS_CTL1_ASPM_L1_1 = 0x00000008 +PCI_L1SS_CTL1_L1_2_MASK = 0x00000005 +PCI_L1SS_CTL1_L1SS_MASK = 0x0000000f +PCI_L1SS_CTL1_CM_RESTORE_TIME = 0x0000ff00 +PCI_L1SS_CTL1_LTR_L12_TH_VALUE = 0x03ff0000 +PCI_L1SS_CTL1_LTR_L12_TH_SCALE = 0xe0000000 +PCI_L1SS_CTL2 = 0x0c +PCI_L1SS_CTL2_T_PWR_ON_SCALE = 0x00000003 +PCI_L1SS_CTL2_T_PWR_ON_VALUE = 0x000000f8 +PCI_DVSEC_HEADER1 = 0x4 +PCI_DVSEC_HEADER1_VID = lambda x: ((x) & 0xffff) # type: ignore +PCI_DVSEC_HEADER1_REV = lambda x: (((x) >> 16) & 0xf) # type: ignore +PCI_DVSEC_HEADER1_LEN = lambda x: (((x) >> 20) & 0xfff) # type: ignore +PCI_DVSEC_HEADER2 = 0x8 +PCI_DVSEC_HEADER2_ID = lambda x: ((x) & 0xffff) # type: ignore +PCI_VF_REBAR_CAP = PCI_REBAR_CAP +PCI_VF_REBAR_CAP_SIZES = PCI_REBAR_CAP_SIZES +PCI_VF_REBAR_CTRL = PCI_REBAR_CTRL +PCI_VF_REBAR_CTRL_BAR_IDX = PCI_REBAR_CTRL_BAR_IDX +PCI_VF_REBAR_CTRL_NBAR_MASK = PCI_REBAR_CTRL_NBAR_MASK +PCI_VF_REBAR_CTRL_BAR_SIZE = PCI_REBAR_CTRL_BAR_SIZE +PCI_DLF_CAP = 0x04 +PCI_DLF_EXCHANGE_ENABLE = 0x80000000 +PCI_SECPCI_LE_CTRL = 0x0c +PCI_PL_16GT_LE_CTRL = 0x20 +PCI_PL_16GT_LE_CTRL_DSP_TX_PRESET_MASK = 0x0000000F +PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_MASK = 0x000000F0 +PCI_PL_16GT_LE_CTRL_USP_TX_PRESET_SHIFT = 4 +PCI_PL_32GT_LE_CTRL = 0x20 +PCI_PL_64GT_LE_CTRL = 0x20 +PCI_NPEM_CAP = 0x04 +PCI_NPEM_CAP_CAPABLE = 0x00000001 +PCI_NPEM_CTRL = 0x08 +PCI_NPEM_CTRL_ENABLE = 0x00000001 +PCI_NPEM_CMD_RESET = 0x00000002 +PCI_NPEM_IND_OK = 0x00000004 +PCI_NPEM_IND_LOCATE = 0x00000008 +PCI_NPEM_IND_FAIL = 0x00000010 +PCI_NPEM_IND_REBUILD = 0x00000020 +PCI_NPEM_IND_PFA = 0x00000040 +PCI_NPEM_IND_HOTSPARE = 0x00000080 +PCI_NPEM_IND_ICA = 0x00000100 +PCI_NPEM_IND_IFA = 0x00000200 +PCI_NPEM_IND_IDT = 0x00000400 +PCI_NPEM_IND_DISABLED = 0x00000800 +PCI_NPEM_IND_SPEC_0 = 0x01000000 +PCI_NPEM_IND_SPEC_1 = 0x02000000 +PCI_NPEM_IND_SPEC_2 = 0x04000000 +PCI_NPEM_IND_SPEC_3 = 0x08000000 +PCI_NPEM_IND_SPEC_4 = 0x10000000 +PCI_NPEM_IND_SPEC_5 = 0x20000000 +PCI_NPEM_IND_SPEC_6 = 0x40000000 +PCI_NPEM_IND_SPEC_7 = 0x80000000 +PCI_NPEM_STATUS = 0x0c +PCI_NPEM_STATUS_CC = 0x00000001 +PCI_DOE_CAP = 0x04 +PCI_DOE_CAP_INT_SUP = 0x00000001 +PCI_DOE_CAP_INT_MSG_NUM = 0x00000ffe +PCI_DOE_CTRL = 0x08 +PCI_DOE_CTRL_ABORT = 0x00000001 +PCI_DOE_CTRL_INT_EN = 0x00000002 +PCI_DOE_CTRL_GO = 0x80000000 +PCI_DOE_STATUS = 0x0c +PCI_DOE_STATUS_BUSY = 0x00000001 +PCI_DOE_STATUS_INT_STATUS = 0x00000002 +PCI_DOE_STATUS_ERROR = 0x00000004 +PCI_DOE_STATUS_DATA_OBJECT_READY = 0x80000000 +PCI_DOE_WRITE = 0x10 +PCI_DOE_READ = 0x14 +PCI_DOE_CAP_SIZEOF = 0x18 +PCI_DOE_DATA_OBJECT_HEADER_1_VID = 0x0000ffff +PCI_DOE_DATA_OBJECT_HEADER_1_TYPE = 0x00ff0000 +PCI_DOE_DATA_OBJECT_HEADER_2_LENGTH = 0x0003ffff +PCI_DOE_DATA_OBJECT_DISC_REQ_3_INDEX = 0x000000ff +PCI_DOE_DATA_OBJECT_DISC_REQ_3_VER = 0x0000ff00 +PCI_DOE_DATA_OBJECT_DISC_RSP_3_VID = 0x0000ffff +PCI_DOE_DATA_OBJECT_DISC_RSP_3_TYPE = 0x00ff0000 +PCI_DOE_DATA_OBJECT_DISC_RSP_3_NEXT_INDEX = 0xff000000 +PCI_DOE_DATA_OBJECT_DISC_RSP_3_PROTOCOL = PCI_DOE_DATA_OBJECT_DISC_RSP_3_TYPE +PCI_DVSEC_CXL_PORT = 3 +PCI_DVSEC_CXL_PORT_CTL = 0x0c +PCI_DVSEC_CXL_PORT_CTL_UNMASK_SBR = 0x00000001 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/qcom_dsp.py b/artifacts/package_runtime/tinygrad/runtime/autogen/qcom_dsp.py new file mode 100644 index 000000000..f57fd19a1 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/qcom_dsp.py @@ -0,0 +1,559 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +ion_user_handle_t: TypeAlias = ctypes.c_int32 +enum_ion_heap_type: dict[int, str] = {(ION_HEAP_TYPE_SYSTEM:=0): 'ION_HEAP_TYPE_SYSTEM', (ION_HEAP_TYPE_SYSTEM_CONTIG:=1): 'ION_HEAP_TYPE_SYSTEM_CONTIG', (ION_HEAP_TYPE_CARVEOUT:=2): 'ION_HEAP_TYPE_CARVEOUT', (ION_HEAP_TYPE_CHUNK:=3): 'ION_HEAP_TYPE_CHUNK', (ION_HEAP_TYPE_DMA:=4): 'ION_HEAP_TYPE_DMA', (ION_HEAP_TYPE_CUSTOM:=5): 'ION_HEAP_TYPE_CUSTOM', (ION_NUM_HEAPS:=16): 'ION_NUM_HEAPS'} +@c.record +class struct_ion_allocation_data(c.Struct): + SIZE = 32 + len: int + align: int + heap_id_mask: int + flags: int + handle: int +size_t: TypeAlias = ctypes.c_uint64 +struct_ion_allocation_data.register_fields([('len', size_t, 0), ('align', size_t, 8), ('heap_id_mask', ctypes.c_uint32, 16), ('flags', ctypes.c_uint32, 20), ('handle', ion_user_handle_t, 24)]) +@c.record +class struct_ion_fd_data(c.Struct): + SIZE = 8 + handle: int + fd: int +struct_ion_fd_data.register_fields([('handle', ion_user_handle_t, 0), ('fd', ctypes.c_int32, 4)]) +@c.record +class struct_ion_handle_data(c.Struct): + SIZE = 4 + handle: int +struct_ion_handle_data.register_fields([('handle', ion_user_handle_t, 0)]) +@c.record +class struct_ion_custom_data(c.Struct): + SIZE = 16 + cmd: int + arg: int +struct_ion_custom_data.register_fields([('cmd', ctypes.c_uint32, 0), ('arg', ctypes.c_uint64, 8)]) +enum_msm_ion_heap_types: dict[int, str] = {(ION_HEAP_TYPE_MSM_START:=6): 'ION_HEAP_TYPE_MSM_START', (ION_HEAP_TYPE_SECURE_DMA:=6): 'ION_HEAP_TYPE_SECURE_DMA', (ION_HEAP_TYPE_SYSTEM_SECURE:=7): 'ION_HEAP_TYPE_SYSTEM_SECURE', (ION_HEAP_TYPE_HYP_CMA:=8): 'ION_HEAP_TYPE_HYP_CMA'} +enum_ion_heap_ids: dict[int, str] = {(INVALID_HEAP_ID:=-1): 'INVALID_HEAP_ID', (ION_CP_MM_HEAP_ID:=8): 'ION_CP_MM_HEAP_ID', (ION_SECURE_HEAP_ID:=9): 'ION_SECURE_HEAP_ID', (ION_SECURE_DISPLAY_HEAP_ID:=10): 'ION_SECURE_DISPLAY_HEAP_ID', (ION_CP_MFC_HEAP_ID:=12): 'ION_CP_MFC_HEAP_ID', (ION_CP_WB_HEAP_ID:=16): 'ION_CP_WB_HEAP_ID', (ION_CAMERA_HEAP_ID:=20): 'ION_CAMERA_HEAP_ID', (ION_SYSTEM_CONTIG_HEAP_ID:=21): 'ION_SYSTEM_CONTIG_HEAP_ID', (ION_ADSP_HEAP_ID:=22): 'ION_ADSP_HEAP_ID', (ION_PIL1_HEAP_ID:=23): 'ION_PIL1_HEAP_ID', (ION_SF_HEAP_ID:=24): 'ION_SF_HEAP_ID', (ION_SYSTEM_HEAP_ID:=25): 'ION_SYSTEM_HEAP_ID', (ION_PIL2_HEAP_ID:=26): 'ION_PIL2_HEAP_ID', (ION_QSECOM_HEAP_ID:=27): 'ION_QSECOM_HEAP_ID', (ION_AUDIO_HEAP_ID:=28): 'ION_AUDIO_HEAP_ID', (ION_MM_FIRMWARE_HEAP_ID:=29): 'ION_MM_FIRMWARE_HEAP_ID', (ION_HEAP_ID_RESERVED:=31): 'ION_HEAP_ID_RESERVED'} +enum_ion_fixed_position: dict[int, str] = {(NOT_FIXED:=0): 'NOT_FIXED', (FIXED_LOW:=1): 'FIXED_LOW', (FIXED_MIDDLE:=2): 'FIXED_MIDDLE', (FIXED_HIGH:=3): 'FIXED_HIGH'} +enum_cp_mem_usage: dict[int, str] = {(VIDEO_BITSTREAM:=1): 'VIDEO_BITSTREAM', (VIDEO_PIXEL:=2): 'VIDEO_PIXEL', (VIDEO_NONPIXEL:=3): 'VIDEO_NONPIXEL', (DISPLAY_SECURE_CP_USAGE:=4): 'DISPLAY_SECURE_CP_USAGE', (CAMERA_SECURE_CP_USAGE:=5): 'CAMERA_SECURE_CP_USAGE', (MAX_USAGE:=6): 'MAX_USAGE', (UNKNOWN:=2147483647): 'UNKNOWN'} +@c.record +class struct_ion_flush_data(c.Struct): + SIZE = 24 + handle: int + fd: int + vaddr: ctypes.c_void_p + offset: int + length: int +struct_ion_flush_data.register_fields([('handle', ion_user_handle_t, 0), ('fd', ctypes.c_int32, 4), ('vaddr', ctypes.c_void_p, 8), ('offset', ctypes.c_uint32, 16), ('length', ctypes.c_uint32, 20)]) +@c.record +class struct_ion_prefetch_regions(c.Struct): + SIZE = 24 + vmid: int + sizes: c.POINTER[ctypes.c_uint64] + nr_sizes: int +struct_ion_prefetch_regions.register_fields([('vmid', ctypes.c_uint32, 0), ('sizes', c.POINTER[size_t], 8), ('nr_sizes', ctypes.c_uint32, 16)]) +@c.record +class struct_ion_prefetch_data(c.Struct): + SIZE = 32 + heap_id: int + len: int + regions: c.POINTER[struct_ion_prefetch_regions] + nr_regions: int +struct_ion_prefetch_data.register_fields([('heap_id', ctypes.c_int32, 0), ('len', ctypes.c_uint64, 8), ('regions', c.POINTER[struct_ion_prefetch_regions], 16), ('nr_regions', ctypes.c_uint32, 24)]) +@c.record +class struct_remote_buf64(c.Struct): + SIZE = 16 + pv: int + len: int +uint64_t: TypeAlias = ctypes.c_uint64 +struct_remote_buf64.register_fields([('pv', uint64_t, 0), ('len', uint64_t, 8)]) +@c.record +class struct_remote_dma_handle64(c.Struct): + SIZE = 12 + fd: int + offset: int + len: int +uint32_t: TypeAlias = ctypes.c_uint32 +struct_remote_dma_handle64.register_fields([('fd', ctypes.c_int32, 0), ('offset', uint32_t, 4), ('len', uint32_t, 8)]) +@c.record +class union_remote_arg64(c.Struct): + SIZE = 16 + buf: struct_remote_buf64 + dma: struct_remote_dma_handle64 + h: int +union_remote_arg64.register_fields([('buf', struct_remote_buf64, 0), ('dma', struct_remote_dma_handle64, 0), ('h', uint32_t, 0)]) +@c.record +class struct_remote_buf(c.Struct): + SIZE = 16 + pv: ctypes.c_void_p + len: int +struct_remote_buf.register_fields([('pv', ctypes.c_void_p, 0), ('len', size_t, 8)]) +@c.record +class struct_remote_dma_handle(c.Struct): + SIZE = 8 + fd: int + offset: int +struct_remote_dma_handle.register_fields([('fd', ctypes.c_int32, 0), ('offset', uint32_t, 4)]) +@c.record +class union_remote_arg(c.Struct): + SIZE = 16 + buf: struct_remote_buf + dma: struct_remote_dma_handle + h: int +union_remote_arg.register_fields([('buf', struct_remote_buf, 0), ('dma', struct_remote_dma_handle, 0), ('h', uint32_t, 0)]) +@c.record +class struct_fastrpc_ioctl_invoke(c.Struct): + SIZE = 16 + handle: int + sc: int + pra: c.POINTER[union_remote_arg] +struct_fastrpc_ioctl_invoke.register_fields([('handle', uint32_t, 0), ('sc', uint32_t, 4), ('pra', c.POINTER[union_remote_arg], 8)]) +@c.record +class struct_fastrpc_ioctl_invoke_fd(c.Struct): + SIZE = 24 + inv: struct_fastrpc_ioctl_invoke + fds: c.POINTER[ctypes.c_int32] +struct_fastrpc_ioctl_invoke_fd.register_fields([('inv', struct_fastrpc_ioctl_invoke, 0), ('fds', c.POINTER[ctypes.c_int32], 16)]) +@c.record +class struct_fastrpc_ioctl_invoke_attrs(c.Struct): + SIZE = 32 + inv: struct_fastrpc_ioctl_invoke + fds: c.POINTER[ctypes.c_int32] + attrs: c.POINTER[ctypes.c_uint32] +struct_fastrpc_ioctl_invoke_attrs.register_fields([('inv', struct_fastrpc_ioctl_invoke, 0), ('fds', c.POINTER[ctypes.c_int32], 16), ('attrs', c.POINTER[ctypes.c_uint32], 24)]) +@c.record +class struct_fastrpc_ioctl_invoke_crc(c.Struct): + SIZE = 40 + inv: struct_fastrpc_ioctl_invoke + fds: c.POINTER[ctypes.c_int32] + attrs: c.POINTER[ctypes.c_uint32] + crc: c.POINTER[ctypes.c_uint32] +struct_fastrpc_ioctl_invoke_crc.register_fields([('inv', struct_fastrpc_ioctl_invoke, 0), ('fds', c.POINTER[ctypes.c_int32], 16), ('attrs', c.POINTER[ctypes.c_uint32], 24), ('crc', c.POINTER[ctypes.c_uint32], 32)]) +@c.record +class struct_fastrpc_ioctl_init(c.Struct): + SIZE = 40 + flags: int + file: int + filelen: int + filefd: int + mem: int + memlen: int + memfd: int +uintptr_t: TypeAlias = ctypes.c_uint64 +int32_t: TypeAlias = ctypes.c_int32 +struct_fastrpc_ioctl_init.register_fields([('flags', uint32_t, 0), ('file', uintptr_t, 8), ('filelen', uint32_t, 16), ('filefd', int32_t, 20), ('mem', uintptr_t, 24), ('memlen', uint32_t, 32), ('memfd', int32_t, 36)]) +@c.record +class struct_fastrpc_ioctl_init_attrs(c.Struct): + SIZE = 48 + init: struct_fastrpc_ioctl_init + attrs: int + siglen: int +struct_fastrpc_ioctl_init_attrs.register_fields([('init', struct_fastrpc_ioctl_init, 0), ('attrs', ctypes.c_int32, 40), ('siglen', ctypes.c_uint32, 44)]) +@c.record +class struct_fastrpc_ioctl_munmap(c.Struct): + SIZE = 16 + vaddrout: int + size: int +struct_fastrpc_ioctl_munmap.register_fields([('vaddrout', uintptr_t, 0), ('size', size_t, 8)]) +@c.record +class struct_fastrpc_ioctl_munmap_64(c.Struct): + SIZE = 16 + vaddrout: int + size: int +struct_fastrpc_ioctl_munmap_64.register_fields([('vaddrout', uint64_t, 0), ('size', size_t, 8)]) +@c.record +class struct_fastrpc_ioctl_mmap(c.Struct): + SIZE = 32 + fd: int + flags: int + vaddrin: int + size: int + vaddrout: int +struct_fastrpc_ioctl_mmap.register_fields([('fd', ctypes.c_int32, 0), ('flags', uint32_t, 4), ('vaddrin', uintptr_t, 8), ('size', size_t, 16), ('vaddrout', uintptr_t, 24)]) +@c.record +class struct_fastrpc_ioctl_mmap_64(c.Struct): + SIZE = 32 + fd: int + flags: int + vaddrin: int + size: int + vaddrout: int +struct_fastrpc_ioctl_mmap_64.register_fields([('fd', ctypes.c_int32, 0), ('flags', uint32_t, 4), ('vaddrin', uint64_t, 8), ('size', size_t, 16), ('vaddrout', uint64_t, 24)]) +@c.record +class struct_fastrpc_ioctl_munmap_fd(c.Struct): + SIZE = 24 + fd: int + flags: int + va: int + len: int +ssize_t: TypeAlias = ctypes.c_int64 +struct_fastrpc_ioctl_munmap_fd.register_fields([('fd', ctypes.c_int32, 0), ('flags', uint32_t, 4), ('va', uintptr_t, 8), ('len', ssize_t, 16)]) +@c.record +class struct_fastrpc_ioctl_perf(c.Struct): + SIZE = 24 + data: int + numkeys: int + keys: int +struct_fastrpc_ioctl_perf.register_fields([('data', uintptr_t, 0), ('numkeys', uint32_t, 8), ('keys', uintptr_t, 16)]) +@c.record +class struct_fastrpc_ctrl_latency(c.Struct): + SIZE = 8 + enable: int + level: int +struct_fastrpc_ctrl_latency.register_fields([('enable', uint32_t, 0), ('level', uint32_t, 4)]) +@c.record +class struct_fastrpc_ctrl_smmu(c.Struct): + SIZE = 4 + sharedcb: int +struct_fastrpc_ctrl_smmu.register_fields([('sharedcb', uint32_t, 0)]) +@c.record +class struct_fastrpc_ctrl_kalloc(c.Struct): + SIZE = 4 + kalloc_support: int +struct_fastrpc_ctrl_kalloc.register_fields([('kalloc_support', uint32_t, 0)]) +@c.record +class struct_fastrpc_ioctl_control(c.Struct): + SIZE = 12 + req: int + lp: struct_fastrpc_ctrl_latency + smmu: struct_fastrpc_ctrl_smmu + kalloc: struct_fastrpc_ctrl_kalloc +struct_fastrpc_ioctl_control.register_fields([('req', uint32_t, 0), ('lp', struct_fastrpc_ctrl_latency, 4), ('smmu', struct_fastrpc_ctrl_smmu, 4), ('kalloc', struct_fastrpc_ctrl_kalloc, 4)]) +@c.record +class struct_smq_null_invoke(c.Struct): + SIZE = 16 + ctx: int + handle: int + sc: int +struct_smq_null_invoke.register_fields([('ctx', uint64_t, 0), ('handle', uint32_t, 8), ('sc', uint32_t, 12)]) +@c.record +class struct_smq_phy_page(c.Struct): + SIZE = 16 + addr: int + size: int +struct_smq_phy_page.register_fields([('addr', uint64_t, 0), ('size', uint64_t, 8)]) +@c.record +class struct_smq_invoke_buf(c.Struct): + SIZE = 8 + num: int + pgidx: int +struct_smq_invoke_buf.register_fields([('num', ctypes.c_int32, 0), ('pgidx', ctypes.c_int32, 4)]) +@c.record +class struct_smq_invoke(c.Struct): + SIZE = 32 + header: struct_smq_null_invoke + page: struct_smq_phy_page +struct_smq_invoke.register_fields([('header', struct_smq_null_invoke, 0), ('page', struct_smq_phy_page, 16)]) +@c.record +class struct_smq_msg(c.Struct): + SIZE = 40 + pid: int + tid: int + invoke: struct_smq_invoke +struct_smq_msg.register_fields([('pid', uint32_t, 0), ('tid', uint32_t, 4), ('invoke', struct_smq_invoke, 8)]) +@c.record +class struct_smq_invoke_rsp(c.Struct): + SIZE = 16 + ctx: int + retval: int +struct_smq_invoke_rsp.register_fields([('ctx', uint64_t, 0), ('retval', ctypes.c_int32, 8)]) +remote_handle: TypeAlias = ctypes.c_uint32 +remote_handle64: TypeAlias = ctypes.c_uint64 +fastrpc_async_jobid: TypeAlias = ctypes.c_uint64 +@c.record +class remote_buf(c.Struct): + SIZE = 16 + pv: ctypes.c_void_p + nLen: int +remote_buf.register_fields([('pv', ctypes.c_void_p, 0), ('nLen', size_t, 8)]) +@c.record +class remote_dma_handle(c.Struct): + SIZE = 8 + fd: int + offset: int +remote_dma_handle.register_fields([('fd', int32_t, 0), ('offset', uint32_t, 4)]) +@c.record +class remote_arg(c.Struct): + SIZE = 16 + buf: remote_buf + h: int + h64: int + dma: remote_dma_handle +remote_arg.register_fields([('buf', remote_buf, 0), ('h', remote_handle, 0), ('h64', remote_handle64, 0), ('dma', remote_dma_handle, 0)]) +enum_fastrpc_async_notify_type: dict[int, str] = {(FASTRPC_ASYNC_NO_SYNC:=0): 'FASTRPC_ASYNC_NO_SYNC', (FASTRPC_ASYNC_CALLBACK:=1): 'FASTRPC_ASYNC_CALLBACK', (FASTRPC_ASYNC_POLL:=2): 'FASTRPC_ASYNC_POLL', (FASTRPC_ASYNC_TYPE_MAX:=3): 'FASTRPC_ASYNC_TYPE_MAX'} +@c.record +class struct_fastrpc_async_callback(c.Struct): + SIZE = 16 + fn: c.CFUNCTYPE[None, [ctypes.c_uint64, ctypes.c_void_p, ctypes.c_int32]] + context: ctypes.c_void_p +struct_fastrpc_async_callback.register_fields([('fn', c.CFUNCTYPE[None, [fastrpc_async_jobid, ctypes.c_void_p, ctypes.c_int32]], 0), ('context', ctypes.c_void_p, 8)]) +fastrpc_async_callback_t: TypeAlias = struct_fastrpc_async_callback +@c.record +class struct_fastrpc_async_descriptor(c.Struct): + SIZE = 32 + type: int + jobid: int + cb: struct_fastrpc_async_callback +struct_fastrpc_async_descriptor.register_fields([('type', ctypes.c_uint32, 0), ('jobid', fastrpc_async_jobid, 8), ('cb', fastrpc_async_callback_t, 16)]) +fastrpc_async_descriptor_t: TypeAlias = struct_fastrpc_async_descriptor +enum_fastrpc_process_type: dict[int, str] = {(PROCESS_TYPE_SIGNED:=0): 'PROCESS_TYPE_SIGNED', (PROCESS_TYPE_UNSIGNED:=1): 'PROCESS_TYPE_UNSIGNED'} +enum_handle_control_req_id: dict[int, str] = {(DSPRPC_CONTROL_LATENCY:=1): 'DSPRPC_CONTROL_LATENCY', (DSPRPC_GET_DSP_INFO:=2): 'DSPRPC_GET_DSP_INFO', (DSPRPC_CONTROL_WAKELOCK:=3): 'DSPRPC_CONTROL_WAKELOCK', (DSPRPC_GET_DOMAIN:=4): 'DSPRPC_GET_DOMAIN'} +enum_remote_rpc_latency_flags: dict[int, str] = {(RPC_DISABLE_QOS:=0): 'RPC_DISABLE_QOS', (RPC_PM_QOS:=1): 'RPC_PM_QOS', (RPC_ADAPTIVE_QOS:=2): 'RPC_ADAPTIVE_QOS', (RPC_POLL_QOS:=3): 'RPC_POLL_QOS'} +remote_rpc_control_latency_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_remote_rpc_control_latency(c.Struct): + SIZE = 8 + enable: int + latency: int +struct_remote_rpc_control_latency.register_fields([('enable', remote_rpc_control_latency_t, 0), ('latency', uint32_t, 4)]) +enum_remote_dsp_attributes: dict[int, str] = {(DOMAIN_SUPPORT:=0): 'DOMAIN_SUPPORT', (UNSIGNED_PD_SUPPORT:=1): 'UNSIGNED_PD_SUPPORT', (HVX_SUPPORT_64B:=2): 'HVX_SUPPORT_64B', (HVX_SUPPORT_128B:=3): 'HVX_SUPPORT_128B', (VTCM_PAGE:=4): 'VTCM_PAGE', (VTCM_COUNT:=5): 'VTCM_COUNT', (ARCH_VER:=6): 'ARCH_VER', (HMX_SUPPORT_DEPTH:=7): 'HMX_SUPPORT_DEPTH', (HMX_SUPPORT_SPATIAL:=8): 'HMX_SUPPORT_SPATIAL', (ASYNC_FASTRPC_SUPPORT:=9): 'ASYNC_FASTRPC_SUPPORT', (STATUS_NOTIFICATION_SUPPORT:=10): 'STATUS_NOTIFICATION_SUPPORT', (FASTRPC_MAX_DSP_ATTRIBUTES:=11): 'FASTRPC_MAX_DSP_ATTRIBUTES'} +@c.record +class struct_remote_dsp_capability(c.Struct): + SIZE = 12 + domain: int + attribute_ID: int + capability: int +struct_remote_dsp_capability.register_fields([('domain', uint32_t, 0), ('attribute_ID', uint32_t, 4), ('capability', uint32_t, 8)]) +fastrpc_capability: TypeAlias = struct_remote_dsp_capability +@c.record +class struct_remote_rpc_control_wakelock(c.Struct): + SIZE = 4 + enable: int +struct_remote_rpc_control_wakelock.register_fields([('enable', uint32_t, 0)]) +@c.record +class struct_remote_rpc_get_domain(c.Struct): + SIZE = 4 + domain: int +struct_remote_rpc_get_domain.register_fields([('domain', ctypes.c_int32, 0)]) +remote_rpc_get_domain_t: TypeAlias = struct_remote_rpc_get_domain +enum_session_control_req_id: dict[int, str] = {(FASTRPC_THREAD_PARAMS:=1): 'FASTRPC_THREAD_PARAMS', (DSPRPC_CONTROL_UNSIGNED_MODULE:=2): 'DSPRPC_CONTROL_UNSIGNED_MODULE', (FASTRPC_RELATIVE_THREAD_PRIORITY:=4): 'FASTRPC_RELATIVE_THREAD_PRIORITY', (FASTRPC_REMOTE_PROCESS_KILL:=6): 'FASTRPC_REMOTE_PROCESS_KILL', (FASTRPC_SESSION_CLOSE:=7): 'FASTRPC_SESSION_CLOSE', (FASTRPC_CONTROL_PD_DUMP:=8): 'FASTRPC_CONTROL_PD_DUMP', (FASTRPC_REMOTE_PROCESS_EXCEPTION:=9): 'FASTRPC_REMOTE_PROCESS_EXCEPTION', (FASTRPC_REMOTE_PROCESS_TYPE:=10): 'FASTRPC_REMOTE_PROCESS_TYPE', (FASTRPC_REGISTER_STATUS_NOTIFICATIONS:=11): 'FASTRPC_REGISTER_STATUS_NOTIFICATIONS'} +@c.record +class struct_remote_rpc_thread_params(c.Struct): + SIZE = 12 + domain: int + prio: int + stack_size: int +struct_remote_rpc_thread_params.register_fields([('domain', ctypes.c_int32, 0), ('prio', ctypes.c_int32, 4), ('stack_size', ctypes.c_int32, 8)]) +@c.record +class struct_remote_rpc_control_unsigned_module(c.Struct): + SIZE = 8 + domain: int + enable: int +struct_remote_rpc_control_unsigned_module.register_fields([('domain', ctypes.c_int32, 0), ('enable', ctypes.c_int32, 4)]) +@c.record +class struct_remote_rpc_relative_thread_priority(c.Struct): + SIZE = 8 + domain: int + relative_thread_priority: int +struct_remote_rpc_relative_thread_priority.register_fields([('domain', ctypes.c_int32, 0), ('relative_thread_priority', ctypes.c_int32, 4)]) +@c.record +class struct_remote_rpc_process_clean_params(c.Struct): + SIZE = 4 + domain: int +struct_remote_rpc_process_clean_params.register_fields([('domain', ctypes.c_int32, 0)]) +@c.record +class struct_remote_rpc_session_close(c.Struct): + SIZE = 4 + domain: int +struct_remote_rpc_session_close.register_fields([('domain', ctypes.c_int32, 0)]) +@c.record +class struct_remote_rpc_control_pd_dump(c.Struct): + SIZE = 8 + domain: int + enable: int +struct_remote_rpc_control_pd_dump.register_fields([('domain', ctypes.c_int32, 0), ('enable', ctypes.c_int32, 4)]) +@c.record +class struct_remote_process_type(c.Struct): + SIZE = 8 + domain: int + process_type: int +struct_remote_process_type.register_fields([('domain', ctypes.c_int32, 0), ('process_type', ctypes.c_int32, 4)]) +remote_rpc_process_exception: TypeAlias = struct_remote_rpc_process_clean_params +enum_remote_rpc_status_flags: dict[int, str] = {(FASTRPC_USER_PD_UP:=0): 'FASTRPC_USER_PD_UP', (FASTRPC_USER_PD_EXIT:=1): 'FASTRPC_USER_PD_EXIT', (FASTRPC_USER_PD_FORCE_KILL:=2): 'FASTRPC_USER_PD_FORCE_KILL', (FASTRPC_USER_PD_EXCEPTION:=3): 'FASTRPC_USER_PD_EXCEPTION', (FASTRPC_DSP_SSR:=4): 'FASTRPC_DSP_SSR'} +remote_rpc_status_flags_t: TypeAlias = ctypes.c_uint32 +fastrpc_notif_fn_t: TypeAlias = c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, ctypes.c_int32, ctypes.c_int32, ctypes.c_uint32]] +@c.record +class struct_remote_rpc_notif_register(c.Struct): + SIZE = 24 + context: ctypes.c_void_p + domain: int + notifier_fn: c.CFUNCTYPE[ctypes.c_int32, [ctypes.c_void_p, ctypes.c_int32, ctypes.c_int32, ctypes.c_uint32]] +struct_remote_rpc_notif_register.register_fields([('context', ctypes.c_void_p, 0), ('domain', ctypes.c_int32, 8), ('notifier_fn', fastrpc_notif_fn_t, 16)]) +remote_rpc_notif_register_t: TypeAlias = struct_remote_rpc_notif_register +enum_remote_mem_map_flags: dict[int, str] = {(REMOTE_MAP_MEM_STATIC:=0): 'REMOTE_MAP_MEM_STATIC', (REMOTE_MAP_MAX_FLAG:=1): 'REMOTE_MAP_MAX_FLAG'} +enum_remote_buf_attributes: dict[int, str] = {(FASTRPC_ATTR_NON_COHERENT:=2): 'FASTRPC_ATTR_NON_COHERENT', (FASTRPC_ATTR_COHERENT:=4): 'FASTRPC_ATTR_COHERENT', (FASTRPC_ATTR_KEEP_MAP:=8): 'FASTRPC_ATTR_KEEP_MAP', (FASTRPC_ATTR_NOMAP:=16): 'FASTRPC_ATTR_NOMAP', (FASTRPC_ATTR_FORCE_NOFLUSH:=32): 'FASTRPC_ATTR_FORCE_NOFLUSH', (FASTRPC_ATTR_FORCE_NOINVALIDATE:=64): 'FASTRPC_ATTR_FORCE_NOINVALIDATE', (FASTRPC_ATTR_TRY_MAP_STATIC:=128): 'FASTRPC_ATTR_TRY_MAP_STATIC'} +enum_fastrpc_map_flags: dict[int, str] = {(FASTRPC_MAP_STATIC:=0): 'FASTRPC_MAP_STATIC', (FASTRPC_MAP_RESERVED:=1): 'FASTRPC_MAP_RESERVED', (FASTRPC_MAP_FD:=2): 'FASTRPC_MAP_FD', (FASTRPC_MAP_FD_DELAYED:=3): 'FASTRPC_MAP_FD_DELAYED', (FASTRPC_MAP_MAX:=4): 'FASTRPC_MAP_MAX'} +@c.record +class struct__cstring1_s(c.Struct): + SIZE = 16 + data: c.POINTER[ctypes.c_char] + dataLen: int +struct__cstring1_s.register_fields([('data', c.POINTER[ctypes.c_char], 0), ('dataLen', ctypes.c_int32, 8)]) +_cstring1_t: TypeAlias = struct__cstring1_s +apps_std_FILE: TypeAlias = ctypes.c_int32 +enum_apps_std_SEEK: dict[int, str] = {(APPS_STD_SEEK_SET:=0): 'APPS_STD_SEEK_SET', (APPS_STD_SEEK_CUR:=1): 'APPS_STD_SEEK_CUR', (APPS_STD_SEEK_END:=2): 'APPS_STD_SEEK_END', (_32BIT_PLACEHOLDER_apps_std_SEEK:=2147483647): '_32BIT_PLACEHOLDER_apps_std_SEEK'} +apps_std_SEEK: TypeAlias = ctypes.c_uint32 +@c.record +class struct_apps_std_DIR(c.Struct): + SIZE = 8 + handle: int +uint64: TypeAlias = ctypes.c_uint64 +struct_apps_std_DIR.register_fields([('handle', uint64, 0)]) +apps_std_DIR: TypeAlias = struct_apps_std_DIR +@c.record +class struct_apps_std_DIRENT(c.Struct): + SIZE = 260 + ino: int + name: c.Array[ctypes.c_char, Literal[255]] +struct_apps_std_DIRENT.register_fields([('ino', ctypes.c_int32, 0), ('name', c.Array[ctypes.c_char, Literal[255]], 4)]) +apps_std_DIRENT: TypeAlias = struct_apps_std_DIRENT +@c.record +class struct_apps_std_STAT(c.Struct): + SIZE = 96 + tsz: int + dev: int + ino: int + mode: int + nlink: int + rdev: int + size: int + atime: int + atimensec: int + mtime: int + mtimensec: int + ctime: int + ctimensec: int +uint32: TypeAlias = ctypes.c_uint32 +int64: TypeAlias = ctypes.c_int64 +struct_apps_std_STAT.register_fields([('tsz', uint64, 0), ('dev', uint64, 8), ('ino', uint64, 16), ('mode', uint32, 24), ('nlink', uint32, 28), ('rdev', uint64, 32), ('size', uint64, 40), ('atime', int64, 48), ('atimensec', int64, 56), ('mtime', int64, 64), ('mtimensec', int64, 72), ('ctime', int64, 80), ('ctimensec', int64, 88)]) +apps_std_STAT: TypeAlias = struct_apps_std_STAT +ION_HEAP_SYSTEM_MASK = ((1 << ION_HEAP_TYPE_SYSTEM)) +ION_HEAP_SYSTEM_CONTIG_MASK = ((1 << ION_HEAP_TYPE_SYSTEM_CONTIG)) +ION_HEAP_CARVEOUT_MASK = ((1 << ION_HEAP_TYPE_CARVEOUT)) +ION_HEAP_TYPE_DMA_MASK = ((1 << ION_HEAP_TYPE_DMA)) +ION_FLAG_CACHED = 1 +ION_FLAG_CACHED_NEEDS_SYNC = 2 +ION_IOC_MAGIC = 'I' +ION_IOC_ALLOC = _IOWR(ION_IOC_MAGIC, 0, struct_ion_allocation_data) +ION_IOC_FREE = _IOWR(ION_IOC_MAGIC, 1, struct_ion_handle_data) +ION_IOC_MAP = _IOWR(ION_IOC_MAGIC, 2, struct_ion_fd_data) +ION_IOC_SHARE = _IOWR(ION_IOC_MAGIC, 4, struct_ion_fd_data) +ION_IOC_IMPORT = _IOWR(ION_IOC_MAGIC, 5, struct_ion_fd_data) +ION_IOC_SYNC = _IOWR(ION_IOC_MAGIC, 7, struct_ion_fd_data) +ION_IOC_CUSTOM = _IOWR(ION_IOC_MAGIC, 6, struct_ion_custom_data) +ION_IOMMU_HEAP_ID = ION_SYSTEM_HEAP_ID +ION_HEAP_TYPE_IOMMU = ION_HEAP_TYPE_SYSTEM +ION_FLAG_CP_TOUCH = (1 << 17) +ION_FLAG_CP_BITSTREAM = (1 << 18) +ION_FLAG_CP_PIXEL = (1 << 19) +ION_FLAG_CP_NON_PIXEL = (1 << 20) +ION_FLAG_CP_CAMERA = (1 << 21) +ION_FLAG_CP_HLOS = (1 << 22) +ION_FLAG_CP_HLOS_FREE = (1 << 23) +ION_FLAG_CP_SEC_DISPLAY = (1 << 25) +ION_FLAG_CP_APP = (1 << 26) +ION_FLAG_ALLOW_NON_CONTIG = (1 << 24) +ION_FLAG_SECURE = (1 << ION_HEAP_ID_RESERVED) +ION_FLAG_FORCE_CONTIGUOUS = (1 << 30) +ION_FLAG_POOL_FORCE_ALLOC = (1 << 16) +ION_FLAG_POOL_PREFETCH = (1 << 27) +ION_SECURE = ION_FLAG_SECURE +ION_FORCE_CONTIGUOUS = ION_FLAG_FORCE_CONTIGUOUS +ION_HEAP = lambda bit: (1 << (bit)) # type: ignore +ION_ADSP_HEAP_NAME = "adsp" +ION_SYSTEM_HEAP_NAME = "system" +ION_VMALLOC_HEAP_NAME = ION_SYSTEM_HEAP_NAME +ION_KMALLOC_HEAP_NAME = "kmalloc" +ION_AUDIO_HEAP_NAME = "audio" +ION_SF_HEAP_NAME = "sf" +ION_MM_HEAP_NAME = "mm" +ION_CAMERA_HEAP_NAME = "camera_preview" +ION_IOMMU_HEAP_NAME = "iommu" +ION_MFC_HEAP_NAME = "mfc" +ION_WB_HEAP_NAME = "wb" +ION_MM_FIRMWARE_HEAP_NAME = "mm_fw" +ION_PIL1_HEAP_NAME = "pil_1" +ION_PIL2_HEAP_NAME = "pil_2" +ION_QSECOM_HEAP_NAME = "qsecom" +ION_SECURE_HEAP_NAME = "secure_heap" +ION_SECURE_DISPLAY_HEAP_NAME = "secure_display" +ION_SET_CACHED = lambda __cache: (__cache | ION_FLAG_CACHED) # type: ignore +ION_SET_UNCACHED = lambda __cache: (__cache & ~ION_FLAG_CACHED) # type: ignore +ION_IS_CACHED = lambda __flags: ((__flags) & ION_FLAG_CACHED) # type: ignore +ION_IOC_MSM_MAGIC = 'M' +ION_IOC_CLEAN_CACHES = _IOWR(ION_IOC_MSM_MAGIC, 0, struct_ion_flush_data) +ION_IOC_INV_CACHES = _IOWR(ION_IOC_MSM_MAGIC, 1, struct_ion_flush_data) +ION_IOC_CLEAN_INV_CACHES = _IOWR(ION_IOC_MSM_MAGIC, 2, struct_ion_flush_data) +ION_IOC_PREFETCH = _IOWR(ION_IOC_MSM_MAGIC, 3, struct_ion_prefetch_data) +ION_IOC_DRAIN = _IOWR(ION_IOC_MSM_MAGIC, 4, struct_ion_prefetch_data) +FASTRPC_IOCTL_INVOKE = _IOWR('R', 1, struct_fastrpc_ioctl_invoke) +FASTRPC_IOCTL_MMAP = _IOWR('R', 2, struct_fastrpc_ioctl_mmap) +FASTRPC_IOCTL_MUNMAP = _IOWR('R', 3, struct_fastrpc_ioctl_munmap) +FASTRPC_IOCTL_MMAP_64 = _IOWR('R', 14, struct_fastrpc_ioctl_mmap_64) +FASTRPC_IOCTL_MUNMAP_64 = _IOWR('R', 15, struct_fastrpc_ioctl_munmap_64) +FASTRPC_IOCTL_INVOKE_FD = _IOWR('R', 4, struct_fastrpc_ioctl_invoke_fd) +FASTRPC_IOCTL_SETMODE = _IOWR('R', 5, uint32_t) +FASTRPC_IOCTL_INIT = _IOWR('R', 6, struct_fastrpc_ioctl_init) +FASTRPC_IOCTL_INVOKE_ATTRS = _IOWR('R', 7, struct_fastrpc_ioctl_invoke_attrs) +FASTRPC_IOCTL_GETINFO = _IOWR('R', 8, uint32_t) +FASTRPC_IOCTL_GETPERF = _IOWR('R', 9, struct_fastrpc_ioctl_perf) +FASTRPC_IOCTL_INIT_ATTRS = _IOWR('R', 10, struct_fastrpc_ioctl_init_attrs) +FASTRPC_IOCTL_INVOKE_CRC = _IOWR('R', 11, struct_fastrpc_ioctl_invoke_crc) +FASTRPC_IOCTL_CONTROL = _IOWR('R', 12, struct_fastrpc_ioctl_control) +FASTRPC_IOCTL_MUNMAP_FD = _IOWR('R', 13, struct_fastrpc_ioctl_munmap_fd) +FASTRPC_GLINK_GUID = "fastrpcglink-apps-dsp" +FASTRPC_SMD_GUID = "fastrpcsmd-apps-dsp" +DEVICE_NAME = "adsprpc-smd" +FASTRPC_ATTR_NOVA = 0x1 +FASTRPC_ATTR_NON_COHERENT = 0x2 +FASTRPC_ATTR_COHERENT = 0x4 +FASTRPC_ATTR_KEEP_MAP = 0x8 +FASTRPC_ATTR_NOMAP = (16) +FASTRPC_MODE_PARALLEL = 0 +FASTRPC_MODE_SERIAL = 1 +FASTRPC_MODE_PROFILE = 2 +FASTRPC_MODE_SESSION = 4 +FASTRPC_INIT_ATTACH = 0 +FASTRPC_INIT_CREATE = 1 +FASTRPC_INIT_CREATE_STATIC = 2 +FASTRPC_INIT_ATTACH_SENSORS = 3 +REMOTE_SCALARS_INBUFS = lambda sc: (((sc) >> 16) & 0x0ff) # type: ignore +REMOTE_SCALARS_OUTBUFS = lambda sc: (((sc) >> 8) & 0x0ff) # type: ignore +REMOTE_SCALARS_INHANDLES = lambda sc: (((sc) >> 4) & 0x0f) # type: ignore +REMOTE_SCALARS_OUTHANDLES = lambda sc: ((sc) & 0x0f) # type: ignore +REMOTE_SCALARS_LENGTH = lambda sc: (REMOTE_SCALARS_INBUFS(sc) + REMOTE_SCALARS_OUTBUFS(sc) + REMOTE_SCALARS_INHANDLES(sc) + REMOTE_SCALARS_OUTHANDLES(sc)) # type: ignore +__TOSTR__ = lambda x: __STR__(x) # type: ignore +remote_arg64_t = union_remote_arg64 +remote_arg_t = union_remote_arg +FASTRPC_CONTROL_LATENCY = (1) +FASTRPC_CONTROL_SMMU = (2) +FASTRPC_CONTROL_KALLOC = (3) +REMOTE_SCALARS_METHOD_ATTR = lambda dwScalars: (((dwScalars) >> 29) & 0x7) # type: ignore +REMOTE_SCALARS_METHOD = lambda dwScalars: (((dwScalars) >> 24) & 0x1f) # type: ignore +REMOTE_SCALARS_INBUFS = lambda dwScalars: (((dwScalars) >> 16) & 0x0ff) # type: ignore +REMOTE_SCALARS_OUTBUFS = lambda dwScalars: (((dwScalars) >> 8) & 0x0ff) # type: ignore +REMOTE_SCALARS_INHANDLES = lambda dwScalars: (((dwScalars) >> 4) & 0x0f) # type: ignore +REMOTE_SCALARS_OUTHANDLES = lambda dwScalars: ((dwScalars) & 0x0f) # type: ignore +REMOTE_SCALARS_MAKEX = lambda nAttr,nMethod,nIn,nOut,noIn,noOut: ((((uint32_t) (nAttr) & 0x7) << 29) | (((uint32_t) (nMethod) & 0x1f) << 24) | (((uint32_t) (nIn) & 0xff) << 16) | (((uint32_t) (nOut) & 0xff) << 8) | (((uint32_t) (noIn) & 0x0f) << 4) | ((uint32_t) (noOut) & 0x0f)) # type: ignore +REMOTE_SCALARS_MAKE = lambda nMethod,nIn,nOut: REMOTE_SCALARS_MAKEX(0,nMethod,nIn,nOut,0,0) # type: ignore +REMOTE_SCALARS_LENGTH = lambda sc: (REMOTE_SCALARS_INBUFS(sc) + REMOTE_SCALARS_OUTBUFS(sc) + REMOTE_SCALARS_INHANDLES(sc) + REMOTE_SCALARS_OUTHANDLES(sc)) # type: ignore +__QAIC_REMOTE = lambda ff: ff # type: ignore +NUM_DOMAINS = 4 +NUM_SESSIONS = 2 +DOMAIN_ID_MASK = 3 +DEFAULT_DOMAIN_ID = 0 +ADSP_DOMAIN_ID = 0 +MDSP_DOMAIN_ID = 1 +SDSP_DOMAIN_ID = 2 +CDSP_DOMAIN_ID = 3 +ADSP_DOMAIN = "&_dom=adsp" +MDSP_DOMAIN = "&_dom=mdsp" +SDSP_DOMAIN = "&_dom=sdsp" +CDSP_DOMAIN = "&_dom=cdsp" +FASTRPC_WAKELOCK_CONTROL_SUPPORTED = 1 +REMOTE_MODE_PARALLEL = 0 +REMOTE_MODE_SERIAL = 1 +ITRANSPORT_PREFIX = "'\":;./\\" +__QAIC_HEADER = lambda ff: ff # type: ignore +__QAIC_IMPL = lambda ff: ff # type: ignore \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/rocprof.py b/artifacts/package_runtime/tinygrad/runtime/autogen/rocprof.py new file mode 100644 index 000000000..ea37bfd33 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/rocprof.py @@ -0,0 +1,170 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +dll = c.DLL('rocprof', ['rocprof-trace-decoder', p:='/usr/local/lib/rocprof-trace-decoder.so', p.replace('so','dylib')]) +rocprofiler_thread_trace_decoder_status_t: dict[int, str] = {(ROCPROFILER_THREAD_TRACE_DECODER_STATUS_SUCCESS:=0): 'ROCPROFILER_THREAD_TRACE_DECODER_STATUS_SUCCESS', (ROCPROFILER_THREAD_TRACE_DECODER_STATUS_ERROR:=1): 'ROCPROFILER_THREAD_TRACE_DECODER_STATUS_ERROR', (ROCPROFILER_THREAD_TRACE_DECODER_STATUS_ERROR_OUT_OF_RESOURCES:=2): 'ROCPROFILER_THREAD_TRACE_DECODER_STATUS_ERROR_OUT_OF_RESOURCES', (ROCPROFILER_THREAD_TRACE_DECODER_STATUS_ERROR_INVALID_ARGUMENT:=3): 'ROCPROFILER_THREAD_TRACE_DECODER_STATUS_ERROR_INVALID_ARGUMENT', (ROCPROFILER_THREAD_TRACE_DECODER_STATUS_ERROR_INVALID_SHADER_DATA:=4): 'ROCPROFILER_THREAD_TRACE_DECODER_STATUS_ERROR_INVALID_SHADER_DATA', (ROCPROFILER_THREAD_TRACE_DECODER_STATUS_LAST:=5): 'ROCPROFILER_THREAD_TRACE_DECODER_STATUS_LAST'} +enum_rocprofiler_thread_trace_decoder_record_type_t: dict[int, str] = {(ROCPROFILER_THREAD_TRACE_DECODER_RECORD_GFXIP:=0): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_GFXIP', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_OCCUPANCY:=1): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_OCCUPANCY', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_PERFEVENT:=2): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_PERFEVENT', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_WAVE:=3): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_WAVE', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_INFO:=4): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_INFO', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_DEBUG:=5): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_DEBUG', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_SHADERDATA:=6): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_SHADERDATA', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_REALTIME:=7): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_REALTIME', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_RT_FREQUENCY:=8): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_RT_FREQUENCY', (ROCPROFILER_THREAD_TRACE_DECODER_RECORD_LAST:=9): 'ROCPROFILER_THREAD_TRACE_DECODER_RECORD_LAST'} +rocprof_trace_decoder_trace_callback_t: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [ctypes.c_uint32, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p]] +@c.record +class struct_rocprofiler_thread_trace_decoder_pc_t(c.Struct): + SIZE = 16 + address: int + code_object_id: int +uint64_t: TypeAlias = ctypes.c_uint64 +struct_rocprofiler_thread_trace_decoder_pc_t.register_fields([('address', uint64_t, 0), ('code_object_id', uint64_t, 8)]) +rocprof_trace_decoder_isa_callback_t: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_uint64], c.POINTER[ctypes.c_uint64], struct_rocprofiler_thread_trace_decoder_pc_t, ctypes.c_void_p]] +rocprof_trace_decoder_se_data_callback_t: TypeAlias = c.CFUNCTYPE[ctypes.c_uint64, [c.POINTER[c.POINTER[ctypes.c_ubyte]], c.POINTER[ctypes.c_uint64], ctypes.c_void_p]] +@dll.bind(ctypes.c_uint32, rocprof_trace_decoder_se_data_callback_t, rocprof_trace_decoder_trace_callback_t, rocprof_trace_decoder_isa_callback_t, ctypes.c_void_p) +def rocprof_trace_decoder_parse_data(se_data_callback:rocprof_trace_decoder_se_data_callback_t, trace_callback:rocprof_trace_decoder_trace_callback_t, isa_callback:rocprof_trace_decoder_isa_callback_t, userdata:ctypes.c_void_p) -> ctypes.c_uint32: ... +enum_rocprofiler_thread_trace_decoder_info_t: dict[int, str] = {(ROCPROFILER_THREAD_TRACE_DECODER_INFO_NONE:=0): 'ROCPROFILER_THREAD_TRACE_DECODER_INFO_NONE', (ROCPROFILER_THREAD_TRACE_DECODER_INFO_DATA_LOST:=1): 'ROCPROFILER_THREAD_TRACE_DECODER_INFO_DATA_LOST', (ROCPROFILER_THREAD_TRACE_DECODER_INFO_STITCH_INCOMPLETE:=2): 'ROCPROFILER_THREAD_TRACE_DECODER_INFO_STITCH_INCOMPLETE', (ROCPROFILER_THREAD_TRACE_DECODER_INFO_WAVE_INCOMPLETE:=3): 'ROCPROFILER_THREAD_TRACE_DECODER_INFO_WAVE_INCOMPLETE', (ROCPROFILER_THREAD_TRACE_DECODER_INFO_LAST:=4): 'ROCPROFILER_THREAD_TRACE_DECODER_INFO_LAST'} +rocprofiler_thread_trace_decoder_info_t: TypeAlias = ctypes.c_uint32 +@dll.bind(c.POINTER[ctypes.c_char], rocprofiler_thread_trace_decoder_info_t) +def rocprof_trace_decoder_get_info_string(info:rocprofiler_thread_trace_decoder_info_t) -> c.POINTER[ctypes.c_char]: ... +@dll.bind(c.POINTER[ctypes.c_char], ctypes.c_uint32) +def rocprof_trace_decoder_get_status_string(status:ctypes.c_uint32) -> c.POINTER[ctypes.c_char]: ... +rocprofiler_thread_trace_decoder_debug_callback_t: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_int64, c.POINTER[ctypes.c_char], c.POINTER[ctypes.c_char], ctypes.c_void_p]] +@dll.bind(ctypes.c_uint32, c.POINTER[ctypes.c_char], uint64_t, rocprofiler_thread_trace_decoder_debug_callback_t, ctypes.c_void_p) +def rocprof_trace_decoder_dump_data(data:c.POINTER[ctypes.c_char], data_size:uint64_t, cb:rocprofiler_thread_trace_decoder_debug_callback_t, userdata:ctypes.c_void_p) -> ctypes.c_uint32: ... +@c.record +class union_rocprof_trace_decoder_gfx9_header_t(c.Struct): + SIZE = 8 + legacy_version: int + gfx9_version2: int + DSIMDM: int + DCU: int + reserved1: int + SEID: int + reserved2: int + raw: int +union_rocprof_trace_decoder_gfx9_header_t.register_fields([('legacy_version', uint64_t, 0, 13, 0), ('gfx9_version2', uint64_t, 1, 3, 5), ('DSIMDM', uint64_t, 2, 4, 0), ('DCU', uint64_t, 2, 5, 4), ('reserved1', uint64_t, 3, 1, 1), ('SEID', uint64_t, 3, 6, 2), ('reserved2', uint64_t, 4, 32, 0), ('raw', uint64_t, 0)]) +rocprof_trace_decoder_gfx9_header_t: TypeAlias = union_rocprof_trace_decoder_gfx9_header_t +@c.record +class union_rocprof_trace_decoder_instrument_enable_t(c.Struct): + SIZE = 4 + char1: int + char2: int + char3: int + char4: int + u32All: int +union_rocprof_trace_decoder_instrument_enable_t.register_fields([('char1', ctypes.c_uint32, 0, 8, 0), ('char2', ctypes.c_uint32, 1, 8, 0), ('char3', ctypes.c_uint32, 2, 8, 0), ('char4', ctypes.c_uint32, 3, 8, 0), ('u32All', ctypes.c_uint32, 0)]) +rocprof_trace_decoder_instrument_enable_t: TypeAlias = union_rocprof_trace_decoder_instrument_enable_t +@c.record +class union_rocprof_trace_decoder_packet_header_t(c.Struct): + SIZE = 4 + opcode: int + type: int + data20: int + u32All: int +union_rocprof_trace_decoder_packet_header_t.register_fields([('opcode', ctypes.c_uint32, 0, 8, 0), ('type', ctypes.c_uint32, 1, 4, 0), ('data20', ctypes.c_uint32, 1, 20, 4), ('u32All', ctypes.c_uint32, 0)]) +rocprof_trace_decoder_packet_header_t: TypeAlias = union_rocprof_trace_decoder_packet_header_t +enum_rocprof_trace_decoder_packet_opcode_t: dict[int, str] = {(ROCPROF_TRACE_DECODER_PACKET_OPCODE_CODEOBJ:=4): 'ROCPROF_TRACE_DECODER_PACKET_OPCODE_CODEOBJ', (ROCPROF_TRACE_DECODER_PACKET_OPCODE_RT_TIMESTAMP:=5): 'ROCPROF_TRACE_DECODER_PACKET_OPCODE_RT_TIMESTAMP', (ROCPROF_TRACE_DECODER_PACKET_OPCODE_AGENT_INFO:=6): 'ROCPROF_TRACE_DECODER_PACKET_OPCODE_AGENT_INFO'} +rocprof_trace_decoder_packet_opcode_t: TypeAlias = ctypes.c_uint32 +enum_rocprof_trace_decoder_agent_info_type_t: dict[int, str] = {(ROCPROF_TRACE_DECODER_AGENT_INFO_TYPE_RT_FREQUENCY_KHZ:=0): 'ROCPROF_TRACE_DECODER_AGENT_INFO_TYPE_RT_FREQUENCY_KHZ', (ROCPROF_TRACE_DECODER_AGENT_INFO_TYPE_COUNTER_INTERVAL:=1): 'ROCPROF_TRACE_DECODER_AGENT_INFO_TYPE_COUNTER_INTERVAL', (ROCPROF_TRACE_DECODER_AGENT_INFO_TYPE_LAST:=2): 'ROCPROF_TRACE_DECODER_AGENT_INFO_TYPE_LAST'} +rocprof_trace_decoder_agent_info_type_t: TypeAlias = ctypes.c_uint32 +@c.record +class union_rocprof_trace_decoder_codeobj_marker_tail_t(c.Struct): + SIZE = 4 + isUnload: int + bFromStart: int + legacy_id: int + raw: int +uint32_t: TypeAlias = ctypes.c_uint32 +union_rocprof_trace_decoder_codeobj_marker_tail_t.register_fields([('isUnload', uint32_t, 0, 1, 0), ('bFromStart', uint32_t, 0, 1, 1), ('legacy_id', uint32_t, 0, 30, 2), ('raw', uint32_t, 0)]) +rocprof_trace_decoder_codeobj_marker_tail_t: TypeAlias = union_rocprof_trace_decoder_codeobj_marker_tail_t +enum_rocprof_trace_decoder_codeobj_marker_type_t: dict[int, str] = {(ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_TAIL:=0): 'ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_TAIL', (ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_SIZE_LO:=1): 'ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_SIZE_LO', (ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_ADDR_LO:=2): 'ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_ADDR_LO', (ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_ADDR_HI:=3): 'ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_ADDR_HI', (ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_SIZE_HI:=4): 'ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_SIZE_HI', (ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_ID_LO:=5): 'ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_ID_LO', (ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_ID_HI:=6): 'ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_ID_HI', (ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_LAST:=7): 'ROCPROF_TRACE_DECODER_CODEOBJ_MARKER_TYPE_LAST'} +rocprof_trace_decoder_codeobj_marker_type_t: TypeAlias = ctypes.c_uint32 +rocprofiler_thread_trace_decoder_pc_t: TypeAlias = struct_rocprofiler_thread_trace_decoder_pc_t +@c.record +class struct_rocprofiler_thread_trace_decoder_perfevent_t(c.Struct): + SIZE = 24 + time: int + events0: int + events1: int + events2: int + events3: int + CU: int + bank: int +int64_t: TypeAlias = ctypes.c_int64 +uint16_t: TypeAlias = ctypes.c_uint16 +uint8_t: TypeAlias = ctypes.c_ubyte +struct_rocprofiler_thread_trace_decoder_perfevent_t.register_fields([('time', int64_t, 0), ('events0', uint16_t, 8), ('events1', uint16_t, 10), ('events2', uint16_t, 12), ('events3', uint16_t, 14), ('CU', uint8_t, 16), ('bank', uint8_t, 17)]) +rocprofiler_thread_trace_decoder_perfevent_t: TypeAlias = struct_rocprofiler_thread_trace_decoder_perfevent_t +@c.record +class struct_rocprofiler_thread_trace_decoder_occupancy_t(c.Struct): + SIZE = 32 + pc: struct_rocprofiler_thread_trace_decoder_pc_t + time: int + reserved: int + cu: int + simd: int + wave_id: int + start: int + _rsvd: int +struct_rocprofiler_thread_trace_decoder_occupancy_t.register_fields([('pc', rocprofiler_thread_trace_decoder_pc_t, 0), ('time', uint64_t, 16), ('reserved', uint8_t, 24), ('cu', uint8_t, 25), ('simd', uint8_t, 26), ('wave_id', uint8_t, 27), ('start', uint32_t, 28, 1, 0), ('_rsvd', uint32_t, 28, 31, 1)]) +rocprofiler_thread_trace_decoder_occupancy_t: TypeAlias = struct_rocprofiler_thread_trace_decoder_occupancy_t +enum_rocprofiler_thread_trace_decoder_wstate_type_t: dict[int, str] = {(ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_EMPTY:=0): 'ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_EMPTY', (ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_IDLE:=1): 'ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_IDLE', (ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_EXEC:=2): 'ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_EXEC', (ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_WAIT:=3): 'ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_WAIT', (ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_STALL:=4): 'ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_STALL', (ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_LAST:=5): 'ROCPROFILER_THREAD_TRACE_DECODER_WSTATE_LAST'} +rocprofiler_thread_trace_decoder_wstate_type_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_rocprofiler_thread_trace_decoder_wave_state_t(c.Struct): + SIZE = 8 + type: int + duration: int +int32_t: TypeAlias = ctypes.c_int32 +struct_rocprofiler_thread_trace_decoder_wave_state_t.register_fields([('type', int32_t, 0), ('duration', int32_t, 4)]) +rocprofiler_thread_trace_decoder_wave_state_t: TypeAlias = struct_rocprofiler_thread_trace_decoder_wave_state_t +enum_rocprofiler_thread_trace_decoder_inst_category_t: dict[int, str] = {(ROCPROFILER_THREAD_TRACE_DECODER_INST_NONE:=0): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_NONE', (ROCPROFILER_THREAD_TRACE_DECODER_INST_SMEM:=1): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_SMEM', (ROCPROFILER_THREAD_TRACE_DECODER_INST_SALU:=2): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_SALU', (ROCPROFILER_THREAD_TRACE_DECODER_INST_VMEM:=3): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_VMEM', (ROCPROFILER_THREAD_TRACE_DECODER_INST_FLAT:=4): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_FLAT', (ROCPROFILER_THREAD_TRACE_DECODER_INST_LDS:=5): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_LDS', (ROCPROFILER_THREAD_TRACE_DECODER_INST_VALU:=6): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_VALU', (ROCPROFILER_THREAD_TRACE_DECODER_INST_JUMP:=7): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_JUMP', (ROCPROFILER_THREAD_TRACE_DECODER_INST_NEXT:=8): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_NEXT', (ROCPROFILER_THREAD_TRACE_DECODER_INST_IMMED:=9): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_IMMED', (ROCPROFILER_THREAD_TRACE_DECODER_INST_CONTEXT:=10): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_CONTEXT', (ROCPROFILER_THREAD_TRACE_DECODER_INST_MESSAGE:=11): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_MESSAGE', (ROCPROFILER_THREAD_TRACE_DECODER_INST_BVH:=12): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_BVH', (ROCPROFILER_THREAD_TRACE_DECODER_INST_LAST:=13): 'ROCPROFILER_THREAD_TRACE_DECODER_INST_LAST'} +rocprofiler_thread_trace_decoder_inst_category_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_rocprofiler_thread_trace_decoder_inst_t(c.Struct): + SIZE = 32 + category: int + stall: int + duration: int + time: int + pc: struct_rocprofiler_thread_trace_decoder_pc_t +struct_rocprofiler_thread_trace_decoder_inst_t.register_fields([('category', uint32_t, 0, 8, 0), ('stall', uint32_t, 1, 24, 0), ('duration', int32_t, 4), ('time', int64_t, 8), ('pc', rocprofiler_thread_trace_decoder_pc_t, 16)]) +rocprofiler_thread_trace_decoder_inst_t: TypeAlias = struct_rocprofiler_thread_trace_decoder_inst_t +@c.record +class struct_rocprofiler_thread_trace_decoder_wave_t(c.Struct): + SIZE = 64 + cu: int + simd: int + wave_id: int + contexts: int + _rsvd1: int + _rsvd2: int + _rsvd3: int + begin_time: int + end_time: int + timeline_size: int + instructions_size: int + timeline_array: c.POINTER[struct_rocprofiler_thread_trace_decoder_wave_state_t] + instructions_array: c.POINTER[struct_rocprofiler_thread_trace_decoder_inst_t] +struct_rocprofiler_thread_trace_decoder_wave_t.register_fields([('cu', uint8_t, 0), ('simd', uint8_t, 1), ('wave_id', uint8_t, 2), ('contexts', uint8_t, 3), ('_rsvd1', uint32_t, 4), ('_rsvd2', uint32_t, 8), ('_rsvd3', uint32_t, 12), ('begin_time', int64_t, 16), ('end_time', int64_t, 24), ('timeline_size', uint64_t, 32), ('instructions_size', uint64_t, 40), ('timeline_array', c.POINTER[rocprofiler_thread_trace_decoder_wave_state_t], 48), ('instructions_array', c.POINTER[rocprofiler_thread_trace_decoder_inst_t], 56)]) +rocprofiler_thread_trace_decoder_wave_t: TypeAlias = struct_rocprofiler_thread_trace_decoder_wave_t +@c.record +class struct_rocprofiler_thread_trace_decoder_realtime_t(c.Struct): + SIZE = 24 + shader_clock: int + realtime_clock: int + reserved: int +struct_rocprofiler_thread_trace_decoder_realtime_t.register_fields([('shader_clock', int64_t, 0), ('realtime_clock', uint64_t, 8), ('reserved', uint64_t, 16)]) +rocprofiler_thread_trace_decoder_realtime_t: TypeAlias = struct_rocprofiler_thread_trace_decoder_realtime_t +enum_rocprofiler_thread_trace_decoder_shaderdata_flags_t: dict[int, str] = {(ROCPROFILER_THREAD_TRACE_DECODER_SHADERDATA_FLAGS_IMM:=0): 'ROCPROFILER_THREAD_TRACE_DECODER_SHADERDATA_FLAGS_IMM', (ROCPROFILER_THREAD_TRACE_DECODER_SHADERDATA_FLAGS_PRIV:=1): 'ROCPROFILER_THREAD_TRACE_DECODER_SHADERDATA_FLAGS_PRIV'} +rocprofiler_thread_trace_decoder_shaderdata_flags_t: TypeAlias = ctypes.c_uint32 +@c.record +class struct_rocprofiler_thread_trace_decoder_shaderdata_t(c.Struct): + SIZE = 24 + time: int + value: int + cu: int + simd: int + wave_id: int + flags: int + reserved: int +struct_rocprofiler_thread_trace_decoder_shaderdata_t.register_fields([('time', int64_t, 0), ('value', uint64_t, 8), ('cu', uint8_t, 16), ('simd', uint8_t, 17), ('wave_id', uint8_t, 18), ('flags', uint8_t, 19), ('reserved', uint32_t, 20)]) +rocprofiler_thread_trace_decoder_shaderdata_t: TypeAlias = struct_rocprofiler_thread_trace_decoder_shaderdata_t +rocprofiler_thread_trace_decoder_record_type_t: TypeAlias = ctypes.c_uint32 diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/sqtt.py b/artifacts/package_runtime/tinygrad/runtime/autogen/sqtt.py new file mode 100644 index 000000000..eb1d6c027 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/sqtt.py @@ -0,0 +1,524 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class struct_sqtt_data_info(c.Struct): + SIZE = 12 + cur_offset: int + trace_status: int + gfx9_write_counter: int + gfx10_dropped_cntr: int +uint32_t: TypeAlias = ctypes.c_uint32 +struct_sqtt_data_info.register_fields([('cur_offset', uint32_t, 0), ('trace_status', uint32_t, 4), ('gfx9_write_counter', uint32_t, 8), ('gfx10_dropped_cntr', uint32_t, 8)]) +@c.record +class struct_sqtt_data_se(c.Struct): + SIZE = 32 + info: struct_sqtt_data_info + data_ptr: ctypes.c_void_p + shader_engine: int + compute_unit: int +struct_sqtt_data_se.register_fields([('info', struct_sqtt_data_info, 0), ('data_ptr', ctypes.c_void_p, 16), ('shader_engine', uint32_t, 24), ('compute_unit', uint32_t, 28)]) +enum_sqtt_version: dict[int, str] = {(SQTT_VERSION_NONE:=0): 'SQTT_VERSION_NONE', (SQTT_VERSION_2_2:=5): 'SQTT_VERSION_2_2', (SQTT_VERSION_2_3:=6): 'SQTT_VERSION_2_3', (SQTT_VERSION_2_4:=7): 'SQTT_VERSION_2_4', (SQTT_VERSION_3_2:=11): 'SQTT_VERSION_3_2', (SQTT_VERSION_3_3:=12): 'SQTT_VERSION_3_3'} +enum_sqtt_file_chunk_type: dict[int, str] = {(SQTT_FILE_CHUNK_TYPE_ASIC_INFO:=0): 'SQTT_FILE_CHUNK_TYPE_ASIC_INFO', (SQTT_FILE_CHUNK_TYPE_SQTT_DESC:=1): 'SQTT_FILE_CHUNK_TYPE_SQTT_DESC', (SQTT_FILE_CHUNK_TYPE_SQTT_DATA:=2): 'SQTT_FILE_CHUNK_TYPE_SQTT_DATA', (SQTT_FILE_CHUNK_TYPE_API_INFO:=3): 'SQTT_FILE_CHUNK_TYPE_API_INFO', (SQTT_FILE_CHUNK_TYPE_RESERVED:=4): 'SQTT_FILE_CHUNK_TYPE_RESERVED', (SQTT_FILE_CHUNK_TYPE_QUEUE_EVENT_TIMINGS:=5): 'SQTT_FILE_CHUNK_TYPE_QUEUE_EVENT_TIMINGS', (SQTT_FILE_CHUNK_TYPE_CLOCK_CALIBRATION:=6): 'SQTT_FILE_CHUNK_TYPE_CLOCK_CALIBRATION', (SQTT_FILE_CHUNK_TYPE_CPU_INFO:=7): 'SQTT_FILE_CHUNK_TYPE_CPU_INFO', (SQTT_FILE_CHUNK_TYPE_SPM_DB:=8): 'SQTT_FILE_CHUNK_TYPE_SPM_DB', (SQTT_FILE_CHUNK_TYPE_CODE_OBJECT_DATABASE:=9): 'SQTT_FILE_CHUNK_TYPE_CODE_OBJECT_DATABASE', (SQTT_FILE_CHUNK_TYPE_CODE_OBJECT_LOADER_EVENTS:=10): 'SQTT_FILE_CHUNK_TYPE_CODE_OBJECT_LOADER_EVENTS', (SQTT_FILE_CHUNK_TYPE_PSO_CORRELATION:=11): 'SQTT_FILE_CHUNK_TYPE_PSO_CORRELATION', (SQTT_FILE_CHUNK_TYPE_INSTRUMENTATION_TABLE:=12): 'SQTT_FILE_CHUNK_TYPE_INSTRUMENTATION_TABLE', (SQTT_FILE_CHUNK_TYPE_COUNT:=13): 'SQTT_FILE_CHUNK_TYPE_COUNT'} +@c.record +class struct_sqtt_file_chunk_id(c.Struct): + SIZE = 4 + type: int + index: int + reserved: int +int32_t: TypeAlias = ctypes.c_int32 +struct_sqtt_file_chunk_id.register_fields([('type', int32_t, 0, 8, 0), ('index', int32_t, 1, 8, 0), ('reserved', int32_t, 2, 16, 0)]) +@c.record +class struct_sqtt_file_chunk_header(c.Struct): + SIZE = 16 + chunk_id: struct_sqtt_file_chunk_id + minor_version: int + major_version: int + size_in_bytes: int + padding: int +uint16_t: TypeAlias = ctypes.c_uint16 +struct_sqtt_file_chunk_header.register_fields([('chunk_id', struct_sqtt_file_chunk_id, 0), ('minor_version', uint16_t, 4), ('major_version', uint16_t, 6), ('size_in_bytes', int32_t, 8), ('padding', int32_t, 12)]) +@c.record +class struct_sqtt_file_header_flags(c.Struct): + SIZE = 4 + is_semaphore_queue_timing_etw: int + no_queue_semaphore_timestamps: int + reserved: int + value: int +struct_sqtt_file_header_flags.register_fields([('is_semaphore_queue_timing_etw', uint32_t, 0, 1, 0), ('no_queue_semaphore_timestamps', uint32_t, 0, 1, 1), ('reserved', uint32_t, 0, 30, 2), ('value', uint32_t, 0)]) +@c.record +class struct_sqtt_file_header(c.Struct): + SIZE = 56 + magic_number: int + version_major: int + version_minor: int + flags: struct_sqtt_file_header_flags + chunk_offset: int + second: int + minute: int + hour: int + day_in_month: int + month: int + year: int + day_in_week: int + day_in_year: int + is_daylight_savings: int +struct_sqtt_file_header.register_fields([('magic_number', uint32_t, 0), ('version_major', uint32_t, 4), ('version_minor', uint32_t, 8), ('flags', struct_sqtt_file_header_flags, 12), ('chunk_offset', int32_t, 16), ('second', int32_t, 20), ('minute', int32_t, 24), ('hour', int32_t, 28), ('day_in_month', int32_t, 32), ('month', int32_t, 36), ('year', int32_t, 40), ('day_in_week', int32_t, 44), ('day_in_year', int32_t, 48), ('is_daylight_savings', int32_t, 52)]) +@c.record +class struct_sqtt_file_chunk_cpu_info(c.Struct): + SIZE = 112 + header: struct_sqtt_file_chunk_header + vendor_id: c.Array[ctypes.c_uint32, Literal[4]] + processor_brand: c.Array[ctypes.c_uint32, Literal[12]] + reserved: c.Array[ctypes.c_uint32, Literal[2]] + cpu_timestamp_freq: int + clock_speed: int + num_logical_cores: int + num_physical_cores: int + system_ram_size: int +uint64_t: TypeAlias = ctypes.c_uint64 +struct_sqtt_file_chunk_cpu_info.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('vendor_id', c.Array[uint32_t, Literal[4]], 16), ('processor_brand', c.Array[uint32_t, Literal[12]], 32), ('reserved', c.Array[uint32_t, Literal[2]], 80), ('cpu_timestamp_freq', uint64_t, 88), ('clock_speed', uint32_t, 96), ('num_logical_cores', uint32_t, 100), ('num_physical_cores', uint32_t, 104), ('system_ram_size', uint32_t, 108)]) +enum_sqtt_file_chunk_asic_info_flags: dict[int, str] = {(SQTT_FILE_CHUNK_ASIC_INFO_FLAG_SC_PACKER_NUMBERING:=1): 'SQTT_FILE_CHUNK_ASIC_INFO_FLAG_SC_PACKER_NUMBERING', (SQTT_FILE_CHUNK_ASIC_INFO_FLAG_PS1_EVENT_TOKENS_ENABLED:=2): 'SQTT_FILE_CHUNK_ASIC_INFO_FLAG_PS1_EVENT_TOKENS_ENABLED'} +enum_sqtt_gpu_type: dict[int, str] = {(SQTT_GPU_TYPE_UNKNOWN:=0): 'SQTT_GPU_TYPE_UNKNOWN', (SQTT_GPU_TYPE_INTEGRATED:=1): 'SQTT_GPU_TYPE_INTEGRATED', (SQTT_GPU_TYPE_DISCRETE:=2): 'SQTT_GPU_TYPE_DISCRETE', (SQTT_GPU_TYPE_VIRTUAL:=3): 'SQTT_GPU_TYPE_VIRTUAL'} +enum_sqtt_gfxip_level: dict[int, str] = {(SQTT_GFXIP_LEVEL_NONE:=0): 'SQTT_GFXIP_LEVEL_NONE', (SQTT_GFXIP_LEVEL_GFXIP_6:=1): 'SQTT_GFXIP_LEVEL_GFXIP_6', (SQTT_GFXIP_LEVEL_GFXIP_7:=2): 'SQTT_GFXIP_LEVEL_GFXIP_7', (SQTT_GFXIP_LEVEL_GFXIP_8:=3): 'SQTT_GFXIP_LEVEL_GFXIP_8', (SQTT_GFXIP_LEVEL_GFXIP_8_1:=4): 'SQTT_GFXIP_LEVEL_GFXIP_8_1', (SQTT_GFXIP_LEVEL_GFXIP_9:=5): 'SQTT_GFXIP_LEVEL_GFXIP_9', (SQTT_GFXIP_LEVEL_GFXIP_10_1:=7): 'SQTT_GFXIP_LEVEL_GFXIP_10_1', (SQTT_GFXIP_LEVEL_GFXIP_10_3:=9): 'SQTT_GFXIP_LEVEL_GFXIP_10_3', (SQTT_GFXIP_LEVEL_GFXIP_11_0:=12): 'SQTT_GFXIP_LEVEL_GFXIP_11_0', (SQTT_GFXIP_LEVEL_GFXIP_11_5:=13): 'SQTT_GFXIP_LEVEL_GFXIP_11_5', (SQTT_GFXIP_LEVEL_GFXIP_12:=16): 'SQTT_GFXIP_LEVEL_GFXIP_12'} +enum_sqtt_memory_type: dict[int, str] = {(SQTT_MEMORY_TYPE_UNKNOWN:=0): 'SQTT_MEMORY_TYPE_UNKNOWN', (SQTT_MEMORY_TYPE_DDR:=1): 'SQTT_MEMORY_TYPE_DDR', (SQTT_MEMORY_TYPE_DDR2:=2): 'SQTT_MEMORY_TYPE_DDR2', (SQTT_MEMORY_TYPE_DDR3:=3): 'SQTT_MEMORY_TYPE_DDR3', (SQTT_MEMORY_TYPE_DDR4:=4): 'SQTT_MEMORY_TYPE_DDR4', (SQTT_MEMORY_TYPE_DDR5:=5): 'SQTT_MEMORY_TYPE_DDR5', (SQTT_MEMORY_TYPE_GDDR3:=16): 'SQTT_MEMORY_TYPE_GDDR3', (SQTT_MEMORY_TYPE_GDDR4:=17): 'SQTT_MEMORY_TYPE_GDDR4', (SQTT_MEMORY_TYPE_GDDR5:=18): 'SQTT_MEMORY_TYPE_GDDR5', (SQTT_MEMORY_TYPE_GDDR6:=19): 'SQTT_MEMORY_TYPE_GDDR6', (SQTT_MEMORY_TYPE_HBM:=32): 'SQTT_MEMORY_TYPE_HBM', (SQTT_MEMORY_TYPE_HBM2:=33): 'SQTT_MEMORY_TYPE_HBM2', (SQTT_MEMORY_TYPE_HBM3:=34): 'SQTT_MEMORY_TYPE_HBM3', (SQTT_MEMORY_TYPE_LPDDR4:=48): 'SQTT_MEMORY_TYPE_LPDDR4', (SQTT_MEMORY_TYPE_LPDDR5:=49): 'SQTT_MEMORY_TYPE_LPDDR5'} +@c.record +class struct_sqtt_file_chunk_asic_info(c.Struct): + SIZE = 768 + header: struct_sqtt_file_chunk_header + flags: int + trace_shader_core_clock: int + trace_memory_clock: int + device_id: int + device_revision_id: int + vgprs_per_simd: int + sgprs_per_simd: int + shader_engines: int + compute_unit_per_shader_engine: int + simd_per_compute_unit: int + wavefronts_per_simd: int + minimum_vgpr_alloc: int + vgpr_alloc_granularity: int + minimum_sgpr_alloc: int + sgpr_alloc_granularity: int + hardware_contexts: int + gpu_type: int + gfxip_level: int + gpu_index: int + gds_size: int + gds_per_shader_engine: int + ce_ram_size: int + ce_ram_size_graphics: int + ce_ram_size_compute: int + max_number_of_dedicated_cus: int + vram_size: int + vram_bus_width: int + l2_cache_size: int + l1_cache_size: int + lds_size: int + gpu_name: c.Array[ctypes.c_char, Literal[256]] + alu_per_clock: float + texture_per_clock: float + prims_per_clock: float + pixels_per_clock: float + gpu_timestamp_frequency: int + max_shader_core_clock: int + max_memory_clock: int + memory_ops_per_clock: int + memory_chip_type: int + lds_granularity: int + cu_mask: c.Array[c.Array[ctypes.c_uint16, Literal[2]], Literal[32]] + reserved1: c.Array[ctypes.c_char, Literal[128]] + active_pixel_packer_mask: c.Array[ctypes.c_uint32, Literal[4]] + reserved2: c.Array[ctypes.c_char, Literal[16]] + gl1_cache_size: int + instruction_cache_size: int + scalar_cache_size: int + mall_cache_size: int + padding: c.Array[ctypes.c_char, Literal[4]] +int64_t: TypeAlias = ctypes.c_int64 +struct_sqtt_file_chunk_asic_info.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('flags', uint64_t, 16), ('trace_shader_core_clock', uint64_t, 24), ('trace_memory_clock', uint64_t, 32), ('device_id', int32_t, 40), ('device_revision_id', int32_t, 44), ('vgprs_per_simd', int32_t, 48), ('sgprs_per_simd', int32_t, 52), ('shader_engines', int32_t, 56), ('compute_unit_per_shader_engine', int32_t, 60), ('simd_per_compute_unit', int32_t, 64), ('wavefronts_per_simd', int32_t, 68), ('minimum_vgpr_alloc', int32_t, 72), ('vgpr_alloc_granularity', int32_t, 76), ('minimum_sgpr_alloc', int32_t, 80), ('sgpr_alloc_granularity', int32_t, 84), ('hardware_contexts', int32_t, 88), ('gpu_type', ctypes.c_uint32, 92), ('gfxip_level', ctypes.c_uint32, 96), ('gpu_index', int32_t, 100), ('gds_size', int32_t, 104), ('gds_per_shader_engine', int32_t, 108), ('ce_ram_size', int32_t, 112), ('ce_ram_size_graphics', int32_t, 116), ('ce_ram_size_compute', int32_t, 120), ('max_number_of_dedicated_cus', int32_t, 124), ('vram_size', int64_t, 128), ('vram_bus_width', int32_t, 136), ('l2_cache_size', int32_t, 140), ('l1_cache_size', int32_t, 144), ('lds_size', int32_t, 148), ('gpu_name', c.Array[ctypes.c_char, Literal[256]], 152), ('alu_per_clock', ctypes.c_float, 408), ('texture_per_clock', ctypes.c_float, 412), ('prims_per_clock', ctypes.c_float, 416), ('pixels_per_clock', ctypes.c_float, 420), ('gpu_timestamp_frequency', uint64_t, 424), ('max_shader_core_clock', uint64_t, 432), ('max_memory_clock', uint64_t, 440), ('memory_ops_per_clock', uint32_t, 448), ('memory_chip_type', ctypes.c_uint32, 452), ('lds_granularity', uint32_t, 456), ('cu_mask', c.Array[c.Array[uint16_t, Literal[2]], Literal[32]], 460), ('reserved1', c.Array[ctypes.c_char, Literal[128]], 588), ('active_pixel_packer_mask', c.Array[uint32_t, Literal[4]], 716), ('reserved2', c.Array[ctypes.c_char, Literal[16]], 732), ('gl1_cache_size', uint32_t, 748), ('instruction_cache_size', uint32_t, 752), ('scalar_cache_size', uint32_t, 756), ('mall_cache_size', uint32_t, 760), ('padding', c.Array[ctypes.c_char, Literal[4]], 764)]) +enum_sqtt_api_type: dict[int, str] = {(SQTT_API_TYPE_DIRECTX_12:=0): 'SQTT_API_TYPE_DIRECTX_12', (SQTT_API_TYPE_VULKAN:=1): 'SQTT_API_TYPE_VULKAN', (SQTT_API_TYPE_GENERIC:=2): 'SQTT_API_TYPE_GENERIC', (SQTT_API_TYPE_OPENCL:=3): 'SQTT_API_TYPE_OPENCL'} +enum_sqtt_instruction_trace_mode: dict[int, str] = {(SQTT_INSTRUCTION_TRACE_DISABLED:=0): 'SQTT_INSTRUCTION_TRACE_DISABLED', (SQTT_INSTRUCTION_TRACE_FULL_FRAME:=1): 'SQTT_INSTRUCTION_TRACE_FULL_FRAME', (SQTT_INSTRUCTION_TRACE_API_PSO:=2): 'SQTT_INSTRUCTION_TRACE_API_PSO'} +enum_sqtt_profiling_mode: dict[int, str] = {(SQTT_PROFILING_MODE_PRESENT:=0): 'SQTT_PROFILING_MODE_PRESENT', (SQTT_PROFILING_MODE_USER_MARKERS:=1): 'SQTT_PROFILING_MODE_USER_MARKERS', (SQTT_PROFILING_MODE_INDEX:=2): 'SQTT_PROFILING_MODE_INDEX', (SQTT_PROFILING_MODE_TAG:=3): 'SQTT_PROFILING_MODE_TAG'} +@c.record +class union_sqtt_profiling_mode_data(c.Struct): + SIZE = 512 + user_marker_profiling_data: union_sqtt_profiling_mode_data_user_marker_profiling_data + index_profiling_data: union_sqtt_profiling_mode_data_index_profiling_data + tag_profiling_data: union_sqtt_profiling_mode_data_tag_profiling_data +@c.record +class union_sqtt_profiling_mode_data_user_marker_profiling_data(c.Struct): + SIZE = 512 + start: c.Array[ctypes.c_char, Literal[256]] + end: c.Array[ctypes.c_char, Literal[256]] +union_sqtt_profiling_mode_data_user_marker_profiling_data.register_fields([('start', c.Array[ctypes.c_char, Literal[256]], 0), ('end', c.Array[ctypes.c_char, Literal[256]], 256)]) +@c.record +class union_sqtt_profiling_mode_data_index_profiling_data(c.Struct): + SIZE = 8 + start: int + end: int +union_sqtt_profiling_mode_data_index_profiling_data.register_fields([('start', uint32_t, 0), ('end', uint32_t, 4)]) +@c.record +class union_sqtt_profiling_mode_data_tag_profiling_data(c.Struct): + SIZE = 16 + begin_hi: int + begin_lo: int + end_hi: int + end_lo: int +union_sqtt_profiling_mode_data_tag_profiling_data.register_fields([('begin_hi', uint32_t, 0), ('begin_lo', uint32_t, 4), ('end_hi', uint32_t, 8), ('end_lo', uint32_t, 12)]) +union_sqtt_profiling_mode_data.register_fields([('user_marker_profiling_data', union_sqtt_profiling_mode_data_user_marker_profiling_data, 0), ('index_profiling_data', union_sqtt_profiling_mode_data_index_profiling_data, 0), ('tag_profiling_data', union_sqtt_profiling_mode_data_tag_profiling_data, 0)]) +@c.record +class union_sqtt_instruction_trace_data(c.Struct): + SIZE = 8 + api_pso_data: union_sqtt_instruction_trace_data_api_pso_data + shader_engine_filter: union_sqtt_instruction_trace_data_shader_engine_filter +@c.record +class union_sqtt_instruction_trace_data_api_pso_data(c.Struct): + SIZE = 8 + api_pso_filter: int +union_sqtt_instruction_trace_data_api_pso_data.register_fields([('api_pso_filter', uint64_t, 0)]) +@c.record +class union_sqtt_instruction_trace_data_shader_engine_filter(c.Struct): + SIZE = 4 + mask: int +union_sqtt_instruction_trace_data_shader_engine_filter.register_fields([('mask', uint32_t, 0)]) +union_sqtt_instruction_trace_data.register_fields([('api_pso_data', union_sqtt_instruction_trace_data_api_pso_data, 0), ('shader_engine_filter', union_sqtt_instruction_trace_data_shader_engine_filter, 0)]) +@c.record +class struct_sqtt_file_chunk_api_info(c.Struct): + SIZE = 560 + header: struct_sqtt_file_chunk_header + api_type: int + major_version: int + minor_version: int + profiling_mode: int + reserved: int + profiling_mode_data: union_sqtt_profiling_mode_data + instruction_trace_mode: int + reserved2: int + instruction_trace_data: union_sqtt_instruction_trace_data +struct_sqtt_file_chunk_api_info.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('api_type', ctypes.c_uint32, 16), ('major_version', uint16_t, 20), ('minor_version', uint16_t, 22), ('profiling_mode', ctypes.c_uint32, 24), ('reserved', uint32_t, 28), ('profiling_mode_data', union_sqtt_profiling_mode_data, 32), ('instruction_trace_mode', ctypes.c_uint32, 544), ('reserved2', uint32_t, 548), ('instruction_trace_data', union_sqtt_instruction_trace_data, 552)]) +@c.record +class struct_sqtt_code_object_database_record(c.Struct): + SIZE = 4 + size: int +struct_sqtt_code_object_database_record.register_fields([('size', uint32_t, 0)]) +@c.record +class struct_sqtt_file_chunk_code_object_database(c.Struct): + SIZE = 32 + header: struct_sqtt_file_chunk_header + offset: int + flags: int + size: int + record_count: int +struct_sqtt_file_chunk_code_object_database.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('offset', uint32_t, 16), ('flags', uint32_t, 20), ('size', uint32_t, 24), ('record_count', uint32_t, 28)]) +@c.record +class struct_sqtt_code_object_loader_events_record(c.Struct): + SIZE = 40 + loader_event_type: int + reserved: int + base_address: int + code_object_hash: c.Array[ctypes.c_uint64, Literal[2]] + time_stamp: int +struct_sqtt_code_object_loader_events_record.register_fields([('loader_event_type', uint32_t, 0), ('reserved', uint32_t, 4), ('base_address', uint64_t, 8), ('code_object_hash', c.Array[uint64_t, Literal[2]], 16), ('time_stamp', uint64_t, 32)]) +@c.record +class struct_sqtt_file_chunk_code_object_loader_events(c.Struct): + SIZE = 32 + header: struct_sqtt_file_chunk_header + offset: int + flags: int + record_size: int + record_count: int +struct_sqtt_file_chunk_code_object_loader_events.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('offset', uint32_t, 16), ('flags', uint32_t, 20), ('record_size', uint32_t, 24), ('record_count', uint32_t, 28)]) +@c.record +class struct_sqtt_pso_correlation_record(c.Struct): + SIZE = 88 + api_pso_hash: int + pipeline_hash: c.Array[ctypes.c_uint64, Literal[2]] + api_level_obj_name: c.Array[ctypes.c_char, Literal[64]] +struct_sqtt_pso_correlation_record.register_fields([('api_pso_hash', uint64_t, 0), ('pipeline_hash', c.Array[uint64_t, Literal[2]], 8), ('api_level_obj_name', c.Array[ctypes.c_char, Literal[64]], 24)]) +@c.record +class struct_sqtt_file_chunk_pso_correlation(c.Struct): + SIZE = 32 + header: struct_sqtt_file_chunk_header + offset: int + flags: int + record_size: int + record_count: int +struct_sqtt_file_chunk_pso_correlation.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('offset', uint32_t, 16), ('flags', uint32_t, 20), ('record_size', uint32_t, 24), ('record_count', uint32_t, 28)]) +@c.record +class struct_sqtt_file_chunk_sqtt_desc(c.Struct): + SIZE = 32 + header: struct_sqtt_file_chunk_header + shader_engine_index: int + sqtt_version: int + v0: struct_sqtt_file_chunk_sqtt_desc_v0 + v1: struct_sqtt_file_chunk_sqtt_desc_v1 +@c.record +class struct_sqtt_file_chunk_sqtt_desc_v0(c.Struct): + SIZE = 4 + instrumentation_version: int +struct_sqtt_file_chunk_sqtt_desc_v0.register_fields([('instrumentation_version', int32_t, 0)]) +@c.record +class struct_sqtt_file_chunk_sqtt_desc_v1(c.Struct): + SIZE = 8 + instrumentation_spec_version: int + instrumentation_api_version: int + compute_unit_index: int +int16_t: TypeAlias = ctypes.c_int16 +struct_sqtt_file_chunk_sqtt_desc_v1.register_fields([('instrumentation_spec_version', int16_t, 0), ('instrumentation_api_version', int16_t, 2), ('compute_unit_index', int32_t, 4)]) +struct_sqtt_file_chunk_sqtt_desc.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('shader_engine_index', int32_t, 16), ('sqtt_version', ctypes.c_uint32, 20), ('v0', struct_sqtt_file_chunk_sqtt_desc_v0, 24), ('v1', struct_sqtt_file_chunk_sqtt_desc_v1, 24)]) +@c.record +class struct_sqtt_file_chunk_sqtt_data(c.Struct): + SIZE = 24 + header: struct_sqtt_file_chunk_header + offset: int + size: int +struct_sqtt_file_chunk_sqtt_data.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('offset', int32_t, 16), ('size', int32_t, 20)]) +@c.record +class struct_sqtt_file_chunk_queue_event_timings(c.Struct): + SIZE = 32 + header: struct_sqtt_file_chunk_header + queue_info_table_record_count: int + queue_info_table_size: int + queue_event_table_record_count: int + queue_event_table_size: int +struct_sqtt_file_chunk_queue_event_timings.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('queue_info_table_record_count', uint32_t, 16), ('queue_info_table_size', uint32_t, 20), ('queue_event_table_record_count', uint32_t, 24), ('queue_event_table_size', uint32_t, 28)]) +enum_sqtt_queue_type: dict[int, str] = {(SQTT_QUEUE_TYPE_UNKNOWN:=0): 'SQTT_QUEUE_TYPE_UNKNOWN', (SQTT_QUEUE_TYPE_UNIVERSAL:=1): 'SQTT_QUEUE_TYPE_UNIVERSAL', (SQTT_QUEUE_TYPE_COMPUTE:=2): 'SQTT_QUEUE_TYPE_COMPUTE', (SQTT_QUEUE_TYPE_DMA:=3): 'SQTT_QUEUE_TYPE_DMA'} +enum_sqtt_engine_type: dict[int, str] = {(SQTT_ENGINE_TYPE_UNKNOWN:=0): 'SQTT_ENGINE_TYPE_UNKNOWN', (SQTT_ENGINE_TYPE_UNIVERSAL:=1): 'SQTT_ENGINE_TYPE_UNIVERSAL', (SQTT_ENGINE_TYPE_COMPUTE:=2): 'SQTT_ENGINE_TYPE_COMPUTE', (SQTT_ENGINE_TYPE_EXCLUSIVE_COMPUTE:=3): 'SQTT_ENGINE_TYPE_EXCLUSIVE_COMPUTE', (SQTT_ENGINE_TYPE_DMA:=4): 'SQTT_ENGINE_TYPE_DMA', (SQTT_ENGINE_TYPE_HIGH_PRIORITY_UNIVERSAL:=7): 'SQTT_ENGINE_TYPE_HIGH_PRIORITY_UNIVERSAL', (SQTT_ENGINE_TYPE_HIGH_PRIORITY_GRAPHICS:=8): 'SQTT_ENGINE_TYPE_HIGH_PRIORITY_GRAPHICS'} +@c.record +class struct_sqtt_queue_hardware_info(c.Struct): + SIZE = 4 + queue_type: int + engine_type: int + reserved: int + value: int +struct_sqtt_queue_hardware_info.register_fields([('queue_type', int32_t, 0, 8, 0), ('engine_type', int32_t, 1, 8, 0), ('reserved', uint32_t, 2, 16, 0), ('value', uint32_t, 0)]) +@c.record +class struct_sqtt_queue_info_record(c.Struct): + SIZE = 24 + queue_id: int + queue_context: int + hardware_info: struct_sqtt_queue_hardware_info + reserved: int +struct_sqtt_queue_info_record.register_fields([('queue_id', uint64_t, 0), ('queue_context', uint64_t, 8), ('hardware_info', struct_sqtt_queue_hardware_info, 16), ('reserved', uint32_t, 20)]) +enum_sqtt_queue_event_type: dict[int, str] = {(SQTT_QUEUE_TIMING_EVENT_CMDBUF_SUBMIT:=0): 'SQTT_QUEUE_TIMING_EVENT_CMDBUF_SUBMIT', (SQTT_QUEUE_TIMING_EVENT_SIGNAL_SEMAPHORE:=1): 'SQTT_QUEUE_TIMING_EVENT_SIGNAL_SEMAPHORE', (SQTT_QUEUE_TIMING_EVENT_WAIT_SEMAPHORE:=2): 'SQTT_QUEUE_TIMING_EVENT_WAIT_SEMAPHORE', (SQTT_QUEUE_TIMING_EVENT_PRESENT:=3): 'SQTT_QUEUE_TIMING_EVENT_PRESENT'} +@c.record +class struct_sqtt_queue_event_record(c.Struct): + SIZE = 56 + event_type: int + sqtt_cb_id: int + frame_index: int + queue_info_index: int + submit_sub_index: int + api_id: int + cpu_timestamp: int + gpu_timestamps: c.Array[ctypes.c_uint64, Literal[2]] +struct_sqtt_queue_event_record.register_fields([('event_type', ctypes.c_uint32, 0), ('sqtt_cb_id', uint32_t, 4), ('frame_index', uint64_t, 8), ('queue_info_index', uint32_t, 16), ('submit_sub_index', uint32_t, 20), ('api_id', uint64_t, 24), ('cpu_timestamp', uint64_t, 32), ('gpu_timestamps', c.Array[uint64_t, Literal[2]], 40)]) +@c.record +class struct_sqtt_file_chunk_clock_calibration(c.Struct): + SIZE = 40 + header: struct_sqtt_file_chunk_header + cpu_timestamp: int + gpu_timestamp: int + reserved: int +struct_sqtt_file_chunk_clock_calibration.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('cpu_timestamp', uint64_t, 16), ('gpu_timestamp', uint64_t, 24), ('reserved', uint64_t, 32)]) +enum_elf_gfxip_level: dict[int, str] = {(EF_AMDGPU_MACH_AMDGCN_GFX801:=40): 'EF_AMDGPU_MACH_AMDGCN_GFX801', (EF_AMDGPU_MACH_AMDGCN_GFX900:=44): 'EF_AMDGPU_MACH_AMDGCN_GFX900', (EF_AMDGPU_MACH_AMDGCN_GFX1010:=51): 'EF_AMDGPU_MACH_AMDGCN_GFX1010', (EF_AMDGPU_MACH_AMDGCN_GFX1030:=54): 'EF_AMDGPU_MACH_AMDGCN_GFX1030', (EF_AMDGPU_MACH_AMDGCN_GFX1100:=65): 'EF_AMDGPU_MACH_AMDGCN_GFX1100', (EF_AMDGPU_MACH_AMDGCN_GFX1150:=67): 'EF_AMDGPU_MACH_AMDGCN_GFX1150', (EF_AMDGPU_MACH_AMDGCN_GFX1200:=78): 'EF_AMDGPU_MACH_AMDGCN_GFX1200'} +@c.record +class struct_sqtt_file_chunk_spm_db(c.Struct): + SIZE = 40 + header: struct_sqtt_file_chunk_header + flags: int + preamble_size: int + num_timestamps: int + num_spm_counter_info: int + spm_counter_info_size: int + sample_interval: int +struct_sqtt_file_chunk_spm_db.register_fields([('header', struct_sqtt_file_chunk_header, 0), ('flags', uint32_t, 16), ('preamble_size', uint32_t, 20), ('num_timestamps', uint32_t, 24), ('num_spm_counter_info', uint32_t, 28), ('spm_counter_info_size', uint32_t, 32), ('sample_interval', uint32_t, 36)]) +enum_rgp_sqtt_marker_identifier: dict[int, str] = {(RGP_SQTT_MARKER_IDENTIFIER_EVENT:=0): 'RGP_SQTT_MARKER_IDENTIFIER_EVENT', (RGP_SQTT_MARKER_IDENTIFIER_CB_START:=1): 'RGP_SQTT_MARKER_IDENTIFIER_CB_START', (RGP_SQTT_MARKER_IDENTIFIER_CB_END:=2): 'RGP_SQTT_MARKER_IDENTIFIER_CB_END', (RGP_SQTT_MARKER_IDENTIFIER_BARRIER_START:=3): 'RGP_SQTT_MARKER_IDENTIFIER_BARRIER_START', (RGP_SQTT_MARKER_IDENTIFIER_BARRIER_END:=4): 'RGP_SQTT_MARKER_IDENTIFIER_BARRIER_END', (RGP_SQTT_MARKER_IDENTIFIER_USER_EVENT:=5): 'RGP_SQTT_MARKER_IDENTIFIER_USER_EVENT', (RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API:=6): 'RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API', (RGP_SQTT_MARKER_IDENTIFIER_SYNC:=7): 'RGP_SQTT_MARKER_IDENTIFIER_SYNC', (RGP_SQTT_MARKER_IDENTIFIER_PRESENT:=8): 'RGP_SQTT_MARKER_IDENTIFIER_PRESENT', (RGP_SQTT_MARKER_IDENTIFIER_LAYOUT_TRANSITION:=9): 'RGP_SQTT_MARKER_IDENTIFIER_LAYOUT_TRANSITION', (RGP_SQTT_MARKER_IDENTIFIER_RENDER_PASS:=10): 'RGP_SQTT_MARKER_IDENTIFIER_RENDER_PASS', (RGP_SQTT_MARKER_IDENTIFIER_RESERVED2:=11): 'RGP_SQTT_MARKER_IDENTIFIER_RESERVED2', (RGP_SQTT_MARKER_IDENTIFIER_BIND_PIPELINE:=12): 'RGP_SQTT_MARKER_IDENTIFIER_BIND_PIPELINE', (RGP_SQTT_MARKER_IDENTIFIER_RESERVED4:=13): 'RGP_SQTT_MARKER_IDENTIFIER_RESERVED4', (RGP_SQTT_MARKER_IDENTIFIER_RESERVED5:=14): 'RGP_SQTT_MARKER_IDENTIFIER_RESERVED5', (RGP_SQTT_MARKER_IDENTIFIER_RESERVED6:=15): 'RGP_SQTT_MARKER_IDENTIFIER_RESERVED6'} +@c.record +class union_rgp_sqtt_marker_cb_id(c.Struct): + SIZE = 4 + per_frame_cb_id: union_rgp_sqtt_marker_cb_id_per_frame_cb_id + global_cb_id: union_rgp_sqtt_marker_cb_id_global_cb_id + all: int +@c.record +class union_rgp_sqtt_marker_cb_id_per_frame_cb_id(c.Struct): + SIZE = 4 + per_frame: int + frame_index: int + cb_index: int + reserved: int +union_rgp_sqtt_marker_cb_id_per_frame_cb_id.register_fields([('per_frame', uint32_t, 0, 1, 0), ('frame_index', uint32_t, 0, 7, 1), ('cb_index', uint32_t, 1, 12, 0), ('reserved', uint32_t, 2, 12, 4)]) +@c.record +class union_rgp_sqtt_marker_cb_id_global_cb_id(c.Struct): + SIZE = 4 + per_frame: int + cb_index: int + reserved: int +union_rgp_sqtt_marker_cb_id_global_cb_id.register_fields([('per_frame', uint32_t, 0, 1, 0), ('cb_index', uint32_t, 0, 19, 1), ('reserved', uint32_t, 2, 12, 4)]) +union_rgp_sqtt_marker_cb_id.register_fields([('per_frame_cb_id', union_rgp_sqtt_marker_cb_id_per_frame_cb_id, 0), ('global_cb_id', union_rgp_sqtt_marker_cb_id_global_cb_id, 0), ('all', uint32_t, 0)]) +@c.record +class struct_rgp_sqtt_marker_cb_start(c.Struct): + SIZE = 16 + identifier: int + ext_dwords: int + cb_id: int + queue: int + dword01: int + device_id_low: int + dword02: int + device_id_high: int + dword03: int + queue_flags: int + dword04: int +struct_rgp_sqtt_marker_cb_start.register_fields([('identifier', uint32_t, 0, 4, 0), ('ext_dwords', uint32_t, 0, 3, 4), ('cb_id', uint32_t, 0, 20, 7), ('queue', uint32_t, 3, 5, 3), ('dword01', uint32_t, 0), ('device_id_low', uint32_t, 4), ('dword02', uint32_t, 4), ('device_id_high', uint32_t, 8), ('dword03', uint32_t, 8), ('queue_flags', uint32_t, 12), ('dword04', uint32_t, 12)]) +@c.record +class struct_rgp_sqtt_marker_cb_end(c.Struct): + SIZE = 12 + identifier: int + ext_dwords: int + cb_id: int + reserved: int + dword01: int + device_id_low: int + dword02: int + device_id_high: int + dword03: int +struct_rgp_sqtt_marker_cb_end.register_fields([('identifier', uint32_t, 0, 4, 0), ('ext_dwords', uint32_t, 0, 3, 4), ('cb_id', uint32_t, 0, 20, 7), ('reserved', uint32_t, 3, 5, 3), ('dword01', uint32_t, 0), ('device_id_low', uint32_t, 4), ('dword02', uint32_t, 4), ('device_id_high', uint32_t, 8), ('dword03', uint32_t, 8)]) +enum_rgp_sqtt_marker_general_api_type: dict[int, str] = {(ApiCmdBindPipeline:=0): 'ApiCmdBindPipeline', (ApiCmdBindDescriptorSets:=1): 'ApiCmdBindDescriptorSets', (ApiCmdBindIndexBuffer:=2): 'ApiCmdBindIndexBuffer', (ApiCmdBindVertexBuffers:=3): 'ApiCmdBindVertexBuffers', (ApiCmdDraw:=4): 'ApiCmdDraw', (ApiCmdDrawIndexed:=5): 'ApiCmdDrawIndexed', (ApiCmdDrawIndirect:=6): 'ApiCmdDrawIndirect', (ApiCmdDrawIndexedIndirect:=7): 'ApiCmdDrawIndexedIndirect', (ApiCmdDrawIndirectCountAMD:=8): 'ApiCmdDrawIndirectCountAMD', (ApiCmdDrawIndexedIndirectCountAMD:=9): 'ApiCmdDrawIndexedIndirectCountAMD', (ApiCmdDispatch:=10): 'ApiCmdDispatch', (ApiCmdDispatchIndirect:=11): 'ApiCmdDispatchIndirect', (ApiCmdCopyBuffer:=12): 'ApiCmdCopyBuffer', (ApiCmdCopyImage:=13): 'ApiCmdCopyImage', (ApiCmdBlitImage:=14): 'ApiCmdBlitImage', (ApiCmdCopyBufferToImage:=15): 'ApiCmdCopyBufferToImage', (ApiCmdCopyImageToBuffer:=16): 'ApiCmdCopyImageToBuffer', (ApiCmdUpdateBuffer:=17): 'ApiCmdUpdateBuffer', (ApiCmdFillBuffer:=18): 'ApiCmdFillBuffer', (ApiCmdClearColorImage:=19): 'ApiCmdClearColorImage', (ApiCmdClearDepthStencilImage:=20): 'ApiCmdClearDepthStencilImage', (ApiCmdClearAttachments:=21): 'ApiCmdClearAttachments', (ApiCmdResolveImage:=22): 'ApiCmdResolveImage', (ApiCmdWaitEvents:=23): 'ApiCmdWaitEvents', (ApiCmdPipelineBarrier:=24): 'ApiCmdPipelineBarrier', (ApiCmdBeginQuery:=25): 'ApiCmdBeginQuery', (ApiCmdEndQuery:=26): 'ApiCmdEndQuery', (ApiCmdResetQueryPool:=27): 'ApiCmdResetQueryPool', (ApiCmdWriteTimestamp:=28): 'ApiCmdWriteTimestamp', (ApiCmdCopyQueryPoolResults:=29): 'ApiCmdCopyQueryPoolResults', (ApiCmdPushConstants:=30): 'ApiCmdPushConstants', (ApiCmdBeginRenderPass:=31): 'ApiCmdBeginRenderPass', (ApiCmdNextSubpass:=32): 'ApiCmdNextSubpass', (ApiCmdEndRenderPass:=33): 'ApiCmdEndRenderPass', (ApiCmdExecuteCommands:=34): 'ApiCmdExecuteCommands', (ApiCmdSetViewport:=35): 'ApiCmdSetViewport', (ApiCmdSetScissor:=36): 'ApiCmdSetScissor', (ApiCmdSetLineWidth:=37): 'ApiCmdSetLineWidth', (ApiCmdSetDepthBias:=38): 'ApiCmdSetDepthBias', (ApiCmdSetBlendConstants:=39): 'ApiCmdSetBlendConstants', (ApiCmdSetDepthBounds:=40): 'ApiCmdSetDepthBounds', (ApiCmdSetStencilCompareMask:=41): 'ApiCmdSetStencilCompareMask', (ApiCmdSetStencilWriteMask:=42): 'ApiCmdSetStencilWriteMask', (ApiCmdSetStencilReference:=43): 'ApiCmdSetStencilReference', (ApiCmdDrawIndirectCount:=44): 'ApiCmdDrawIndirectCount', (ApiCmdDrawIndexedIndirectCount:=45): 'ApiCmdDrawIndexedIndirectCount', (ApiCmdDrawMeshTasksEXT:=47): 'ApiCmdDrawMeshTasksEXT', (ApiCmdDrawMeshTasksIndirectCountEXT:=48): 'ApiCmdDrawMeshTasksIndirectCountEXT', (ApiCmdDrawMeshTasksIndirectEXT:=49): 'ApiCmdDrawMeshTasksIndirectEXT', (ApiRayTracingSeparateCompiled:=8388608): 'ApiRayTracingSeparateCompiled', (ApiInvalid:=4294967295): 'ApiInvalid'} +@c.record +class struct_rgp_sqtt_marker_general_api(c.Struct): + SIZE = 4 + identifier: int + ext_dwords: int + api_type: int + is_end: int + reserved: int + dword01: int +struct_rgp_sqtt_marker_general_api.register_fields([('identifier', uint32_t, 0, 4, 0), ('ext_dwords', uint32_t, 0, 3, 4), ('api_type', uint32_t, 0, 20, 7), ('is_end', uint32_t, 3, 1, 3), ('reserved', uint32_t, 3, 4, 4), ('dword01', uint32_t, 0)]) +enum_rgp_sqtt_marker_event_type: dict[int, str] = {(EventCmdDraw:=0): 'EventCmdDraw', (EventCmdDrawIndexed:=1): 'EventCmdDrawIndexed', (EventCmdDrawIndirect:=2): 'EventCmdDrawIndirect', (EventCmdDrawIndexedIndirect:=3): 'EventCmdDrawIndexedIndirect', (EventCmdDrawIndirectCountAMD:=4): 'EventCmdDrawIndirectCountAMD', (EventCmdDrawIndexedIndirectCountAMD:=5): 'EventCmdDrawIndexedIndirectCountAMD', (EventCmdDispatch:=6): 'EventCmdDispatch', (EventCmdDispatchIndirect:=7): 'EventCmdDispatchIndirect', (EventCmdCopyBuffer:=8): 'EventCmdCopyBuffer', (EventCmdCopyImage:=9): 'EventCmdCopyImage', (EventCmdBlitImage:=10): 'EventCmdBlitImage', (EventCmdCopyBufferToImage:=11): 'EventCmdCopyBufferToImage', (EventCmdCopyImageToBuffer:=12): 'EventCmdCopyImageToBuffer', (EventCmdUpdateBuffer:=13): 'EventCmdUpdateBuffer', (EventCmdFillBuffer:=14): 'EventCmdFillBuffer', (EventCmdClearColorImage:=15): 'EventCmdClearColorImage', (EventCmdClearDepthStencilImage:=16): 'EventCmdClearDepthStencilImage', (EventCmdClearAttachments:=17): 'EventCmdClearAttachments', (EventCmdResolveImage:=18): 'EventCmdResolveImage', (EventCmdWaitEvents:=19): 'EventCmdWaitEvents', (EventCmdPipelineBarrier:=20): 'EventCmdPipelineBarrier', (EventCmdResetQueryPool:=21): 'EventCmdResetQueryPool', (EventCmdCopyQueryPoolResults:=22): 'EventCmdCopyQueryPoolResults', (EventRenderPassColorClear:=23): 'EventRenderPassColorClear', (EventRenderPassDepthStencilClear:=24): 'EventRenderPassDepthStencilClear', (EventRenderPassResolve:=25): 'EventRenderPassResolve', (EventInternalUnknown:=26): 'EventInternalUnknown', (EventCmdDrawIndirectCount:=27): 'EventCmdDrawIndirectCount', (EventCmdDrawIndexedIndirectCount:=28): 'EventCmdDrawIndexedIndirectCount', (EventCmdTraceRaysKHR:=30): 'EventCmdTraceRaysKHR', (EventCmdTraceRaysIndirectKHR:=31): 'EventCmdTraceRaysIndirectKHR', (EventCmdBuildAccelerationStructuresKHR:=32): 'EventCmdBuildAccelerationStructuresKHR', (EventCmdBuildAccelerationStructuresIndirectKHR:=33): 'EventCmdBuildAccelerationStructuresIndirectKHR', (EventCmdCopyAccelerationStructureKHR:=34): 'EventCmdCopyAccelerationStructureKHR', (EventCmdCopyAccelerationStructureToMemoryKHR:=35): 'EventCmdCopyAccelerationStructureToMemoryKHR', (EventCmdCopyMemoryToAccelerationStructureKHR:=36): 'EventCmdCopyMemoryToAccelerationStructureKHR', (EventCmdDrawMeshTasksEXT:=41): 'EventCmdDrawMeshTasksEXT', (EventCmdDrawMeshTasksIndirectCountEXT:=42): 'EventCmdDrawMeshTasksIndirectCountEXT', (EventCmdDrawMeshTasksIndirectEXT:=43): 'EventCmdDrawMeshTasksIndirectEXT', (EventUnknown:=32767): 'EventUnknown', (EventInvalid:=4294967295): 'EventInvalid'} +@c.record +class struct_rgp_sqtt_marker_event(c.Struct): + SIZE = 12 + identifier: int + ext_dwords: int + api_type: int + has_thread_dims: int + dword01: int + cb_id: int + vertex_offset_reg_idx: int + instance_offset_reg_idx: int + draw_index_reg_idx: int + dword02: int + cmd_id: int + dword03: int +struct_rgp_sqtt_marker_event.register_fields([('identifier', uint32_t, 0, 4, 0), ('ext_dwords', uint32_t, 0, 3, 4), ('api_type', uint32_t, 0, 24, 7), ('has_thread_dims', uint32_t, 3, 1, 7), ('dword01', uint32_t, 0), ('cb_id', uint32_t, 4, 20, 0), ('vertex_offset_reg_idx', uint32_t, 6, 4, 4), ('instance_offset_reg_idx', uint32_t, 7, 4, 0), ('draw_index_reg_idx', uint32_t, 7, 4, 4), ('dword02', uint32_t, 4), ('cmd_id', uint32_t, 8), ('dword03', uint32_t, 8)]) +@c.record +class struct_rgp_sqtt_marker_event_with_dims(c.Struct): + SIZE = 24 + event: struct_rgp_sqtt_marker_event + thread_x: int + thread_y: int + thread_z: int +struct_rgp_sqtt_marker_event_with_dims.register_fields([('event', struct_rgp_sqtt_marker_event, 0), ('thread_x', uint32_t, 12), ('thread_y', uint32_t, 16), ('thread_z', uint32_t, 20)]) +@c.record +class struct_rgp_sqtt_marker_barrier_start(c.Struct): + SIZE = 8 + identifier: int + ext_dwords: int + cb_id: int + reserved: int + dword01: int + driver_reason: int + internal: int + dword02: int +struct_rgp_sqtt_marker_barrier_start.register_fields([('identifier', uint32_t, 0, 4, 0), ('ext_dwords', uint32_t, 0, 3, 4), ('cb_id', uint32_t, 0, 20, 7), ('reserved', uint32_t, 3, 5, 3), ('dword01', uint32_t, 0), ('driver_reason', uint32_t, 4, 31, 0), ('internal', uint32_t, 7, 1, 7), ('dword02', uint32_t, 4)]) +@c.record +class struct_rgp_sqtt_marker_barrier_end(c.Struct): + SIZE = 8 + identifier: int + ext_dwords: int + cb_id: int + wait_on_eop_ts: int + vs_partial_flush: int + ps_partial_flush: int + cs_partial_flush: int + pfp_sync_me: int + dword01: int + sync_cp_dma: int + inval_tcp: int + inval_sqI: int + inval_sqK: int + flush_tcc: int + inval_tcc: int + flush_cb: int + inval_cb: int + flush_db: int + inval_db: int + num_layout_transitions: int + inval_gl1: int + wait_on_ts: int + eop_ts_bottom_of_pipe: int + eos_ts_ps_done: int + eos_ts_cs_done: int + reserved: int + dword02: int +struct_rgp_sqtt_marker_barrier_end.register_fields([('identifier', uint32_t, 0, 4, 0), ('ext_dwords', uint32_t, 0, 3, 4), ('cb_id', uint32_t, 0, 20, 7), ('wait_on_eop_ts', uint32_t, 3, 1, 3), ('vs_partial_flush', uint32_t, 3, 1, 4), ('ps_partial_flush', uint32_t, 3, 1, 5), ('cs_partial_flush', uint32_t, 3, 1, 6), ('pfp_sync_me', uint32_t, 3, 1, 7), ('dword01', uint32_t, 0), ('sync_cp_dma', uint32_t, 4, 1, 0), ('inval_tcp', uint32_t, 4, 1, 1), ('inval_sqI', uint32_t, 4, 1, 2), ('inval_sqK', uint32_t, 4, 1, 3), ('flush_tcc', uint32_t, 4, 1, 4), ('inval_tcc', uint32_t, 4, 1, 5), ('flush_cb', uint32_t, 4, 1, 6), ('inval_cb', uint32_t, 4, 1, 7), ('flush_db', uint32_t, 5, 1, 0), ('inval_db', uint32_t, 5, 1, 1), ('num_layout_transitions', uint32_t, 5, 16, 2), ('inval_gl1', uint32_t, 7, 1, 2), ('wait_on_ts', uint32_t, 7, 1, 3), ('eop_ts_bottom_of_pipe', uint32_t, 7, 1, 4), ('eos_ts_ps_done', uint32_t, 7, 1, 5), ('eos_ts_cs_done', uint32_t, 7, 1, 6), ('reserved', uint32_t, 7, 1, 7), ('dword02', uint32_t, 4)]) +@c.record +class struct_rgp_sqtt_marker_layout_transition(c.Struct): + SIZE = 8 + identifier: int + ext_dwords: int + depth_stencil_expand: int + htile_hiz_range_expand: int + depth_stencil_resummarize: int + dcc_decompress: int + fmask_decompress: int + fast_clear_eliminate: int + fmask_color_expand: int + init_mask_ram: int + reserved1: int + dword01: int + reserved2: int + dword02: int +struct_rgp_sqtt_marker_layout_transition.register_fields([('identifier', uint32_t, 0, 4, 0), ('ext_dwords', uint32_t, 0, 3, 4), ('depth_stencil_expand', uint32_t, 0, 1, 7), ('htile_hiz_range_expand', uint32_t, 1, 1, 0), ('depth_stencil_resummarize', uint32_t, 1, 1, 1), ('dcc_decompress', uint32_t, 1, 1, 2), ('fmask_decompress', uint32_t, 1, 1, 3), ('fast_clear_eliminate', uint32_t, 1, 1, 4), ('fmask_color_expand', uint32_t, 1, 1, 5), ('init_mask_ram', uint32_t, 1, 1, 6), ('reserved1', uint32_t, 1, 17, 7), ('dword01', uint32_t, 0), ('reserved2', uint32_t, 4, 32, 0), ('dword02', uint32_t, 4)]) +@c.record +class struct_rgp_sqtt_marker_user_event(c.Struct): + SIZE = 4 + identifier: int + reserved0: int + data_type: int + reserved1: int + dword01: int +struct_rgp_sqtt_marker_user_event.register_fields([('identifier', uint32_t, 0, 4, 0), ('reserved0', uint32_t, 0, 8, 4), ('data_type', uint32_t, 1, 8, 4), ('reserved1', uint32_t, 2, 12, 4), ('dword01', uint32_t, 0)]) +@c.record +class struct_rgp_sqtt_marker_user_event_with_length(c.Struct): + SIZE = 8 + user_event: struct_rgp_sqtt_marker_user_event + length: int +struct_rgp_sqtt_marker_user_event_with_length.register_fields([('user_event', struct_rgp_sqtt_marker_user_event, 0), ('length', uint32_t, 4)]) +enum_rgp_sqtt_marker_user_event_type: dict[int, str] = {(UserEventTrigger:=0): 'UserEventTrigger', (UserEventPop:=1): 'UserEventPop', (UserEventPush:=2): 'UserEventPush', (UserEventObjectName:=3): 'UserEventObjectName'} +@c.record +class struct_rgp_sqtt_marker_pipeline_bind(c.Struct): + SIZE = 12 + identifier: int + ext_dwords: int + bind_point: int + cb_id: int + reserved: int + dword01: int + api_pso_hash: c.Array[ctypes.c_uint32, Literal[2]] + dword02: int + dword03: int +struct_rgp_sqtt_marker_pipeline_bind.register_fields([('identifier', uint32_t, 0, 4, 0), ('ext_dwords', uint32_t, 0, 3, 4), ('bind_point', uint32_t, 0, 1, 7), ('cb_id', uint32_t, 1, 20, 0), ('reserved', uint32_t, 3, 4, 4), ('dword01', uint32_t, 0), ('api_pso_hash', c.Array[uint32_t, Literal[2]], 4), ('dword02', uint32_t, 4), ('dword03', uint32_t, 8)]) +SQTT_FILE_MAGIC_NUMBER = 0x50303042 +SQTT_FILE_VERSION_MAJOR = 1 +SQTT_FILE_VERSION_MINOR = 5 +SQTT_GPU_NAME_MAX_SIZE = 256 +SQTT_MAX_NUM_SE = 32 +SQTT_SA_PER_SE = 2 +SQTT_ACTIVE_PIXEL_PACKER_MASK_DWORDS = 4 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/vfio.py b/artifacts/package_runtime/tinygrad/runtime/autogen/vfio.py new file mode 100644 index 000000000..f6a3108a7 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/vfio.py @@ -0,0 +1,587 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +@c.record +class struct_vfio_info_cap_header(c.Struct): + SIZE = 8 + id: int + version: int + next: int +__u16: TypeAlias = ctypes.c_uint16 +__u32: TypeAlias = ctypes.c_uint32 +struct_vfio_info_cap_header.register_fields([('id', ctypes.c_uint16, 0), ('version', ctypes.c_uint16, 2), ('next', ctypes.c_uint32, 4)]) +@c.record +class struct_vfio_group_status(c.Struct): + SIZE = 8 + argsz: int + flags: int +struct_vfio_group_status.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4)]) +@c.record +class struct_vfio_device_info(c.Struct): + SIZE = 24 + argsz: int + flags: int + num_regions: int + num_irqs: int + cap_offset: int + pad: int +struct_vfio_device_info.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('num_regions', ctypes.c_uint32, 8), ('num_irqs', ctypes.c_uint32, 12), ('cap_offset', ctypes.c_uint32, 16), ('pad', ctypes.c_uint32, 20)]) +@c.record +class struct_vfio_device_info_cap_pci_atomic_comp(c.Struct): + SIZE = 16 + header: struct_vfio_info_cap_header + flags: int + reserved: int +struct_vfio_device_info_cap_pci_atomic_comp.register_fields([('header', struct_vfio_info_cap_header, 0), ('flags', ctypes.c_uint32, 8), ('reserved', ctypes.c_uint32, 12)]) +@c.record +class struct_vfio_region_info(c.Struct): + SIZE = 32 + argsz: int + flags: int + index: int + cap_offset: int + size: int + offset: int +__u64: TypeAlias = ctypes.c_uint64 +struct_vfio_region_info.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('index', ctypes.c_uint32, 8), ('cap_offset', ctypes.c_uint32, 12), ('size', ctypes.c_uint64, 16), ('offset', ctypes.c_uint64, 24)]) +@c.record +class struct_vfio_region_sparse_mmap_area(c.Struct): + SIZE = 16 + offset: int + size: int +struct_vfio_region_sparse_mmap_area.register_fields([('offset', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8)]) +@c.record +class struct_vfio_region_info_cap_sparse_mmap(c.Struct): + SIZE = 16 + header: struct_vfio_info_cap_header + nr_areas: int + reserved: int + areas: c.Array[struct_vfio_region_sparse_mmap_area, Literal[0]] +struct_vfio_region_info_cap_sparse_mmap.register_fields([('header', struct_vfio_info_cap_header, 0), ('nr_areas', ctypes.c_uint32, 8), ('reserved', ctypes.c_uint32, 12), ('areas', c.Array[struct_vfio_region_sparse_mmap_area, Literal[0]], 16)]) +@c.record +class struct_vfio_region_info_cap_type(c.Struct): + SIZE = 16 + header: struct_vfio_info_cap_header + type: int + subtype: int +struct_vfio_region_info_cap_type.register_fields([('header', struct_vfio_info_cap_header, 0), ('type', ctypes.c_uint32, 8), ('subtype', ctypes.c_uint32, 12)]) +@c.record +class struct_vfio_region_gfx_edid(c.Struct): + SIZE = 24 + edid_offset: int + edid_max_size: int + edid_size: int + max_xres: int + max_yres: int + link_state: int +struct_vfio_region_gfx_edid.register_fields([('edid_offset', ctypes.c_uint32, 0), ('edid_max_size', ctypes.c_uint32, 4), ('edid_size', ctypes.c_uint32, 8), ('max_xres', ctypes.c_uint32, 12), ('max_yres', ctypes.c_uint32, 16), ('link_state', ctypes.c_uint32, 20)]) +@c.record +class struct_vfio_device_migration_info(c.Struct): + SIZE = 32 + device_state: int + reserved: int + pending_bytes: int + data_offset: int + data_size: int +struct_vfio_device_migration_info.register_fields([('device_state', ctypes.c_uint32, 0), ('reserved', ctypes.c_uint32, 4), ('pending_bytes', ctypes.c_uint64, 8), ('data_offset', ctypes.c_uint64, 16), ('data_size', ctypes.c_uint64, 24)]) +@c.record +class struct_vfio_region_info_cap_nvlink2_ssatgt(c.Struct): + SIZE = 16 + header: struct_vfio_info_cap_header + tgt: int +struct_vfio_region_info_cap_nvlink2_ssatgt.register_fields([('header', struct_vfio_info_cap_header, 0), ('tgt', ctypes.c_uint64, 8)]) +@c.record +class struct_vfio_region_info_cap_nvlink2_lnkspd(c.Struct): + SIZE = 16 + header: struct_vfio_info_cap_header + link_speed: int + __pad: int +struct_vfio_region_info_cap_nvlink2_lnkspd.register_fields([('header', struct_vfio_info_cap_header, 0), ('link_speed', ctypes.c_uint32, 8), ('__pad', ctypes.c_uint32, 12)]) +@c.record +class struct_vfio_irq_info(c.Struct): + SIZE = 16 + argsz: int + flags: int + index: int + count: int +struct_vfio_irq_info.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('index', ctypes.c_uint32, 8), ('count', ctypes.c_uint32, 12)]) +@c.record +class struct_vfio_irq_set(c.Struct): + SIZE = 20 + argsz: int + flags: int + index: int + start: int + count: int + data: c.Array[ctypes.c_ubyte, Literal[0]] +__u8: TypeAlias = ctypes.c_ubyte +struct_vfio_irq_set.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('index', ctypes.c_uint32, 8), ('start', ctypes.c_uint32, 12), ('count', ctypes.c_uint32, 16), ('data', c.Array[ctypes.c_ubyte, Literal[0]], 20)]) +_anonenum0: dict[int, str] = {(VFIO_PCI_BAR0_REGION_INDEX:=0): 'VFIO_PCI_BAR0_REGION_INDEX', (VFIO_PCI_BAR1_REGION_INDEX:=1): 'VFIO_PCI_BAR1_REGION_INDEX', (VFIO_PCI_BAR2_REGION_INDEX:=2): 'VFIO_PCI_BAR2_REGION_INDEX', (VFIO_PCI_BAR3_REGION_INDEX:=3): 'VFIO_PCI_BAR3_REGION_INDEX', (VFIO_PCI_BAR4_REGION_INDEX:=4): 'VFIO_PCI_BAR4_REGION_INDEX', (VFIO_PCI_BAR5_REGION_INDEX:=5): 'VFIO_PCI_BAR5_REGION_INDEX', (VFIO_PCI_ROM_REGION_INDEX:=6): 'VFIO_PCI_ROM_REGION_INDEX', (VFIO_PCI_CONFIG_REGION_INDEX:=7): 'VFIO_PCI_CONFIG_REGION_INDEX', (VFIO_PCI_VGA_REGION_INDEX:=8): 'VFIO_PCI_VGA_REGION_INDEX', (VFIO_PCI_NUM_REGIONS:=9): 'VFIO_PCI_NUM_REGIONS'} +_anonenum1: dict[int, str] = {(VFIO_PCI_INTX_IRQ_INDEX:=0): 'VFIO_PCI_INTX_IRQ_INDEX', (VFIO_PCI_MSI_IRQ_INDEX:=1): 'VFIO_PCI_MSI_IRQ_INDEX', (VFIO_PCI_MSIX_IRQ_INDEX:=2): 'VFIO_PCI_MSIX_IRQ_INDEX', (VFIO_PCI_ERR_IRQ_INDEX:=3): 'VFIO_PCI_ERR_IRQ_INDEX', (VFIO_PCI_REQ_IRQ_INDEX:=4): 'VFIO_PCI_REQ_IRQ_INDEX', (VFIO_PCI_NUM_IRQS:=5): 'VFIO_PCI_NUM_IRQS'} +_anonenum2: dict[int, str] = {(VFIO_CCW_CONFIG_REGION_INDEX:=0): 'VFIO_CCW_CONFIG_REGION_INDEX', (VFIO_CCW_NUM_REGIONS:=1): 'VFIO_CCW_NUM_REGIONS'} +_anonenum3: dict[int, str] = {(VFIO_CCW_IO_IRQ_INDEX:=0): 'VFIO_CCW_IO_IRQ_INDEX', (VFIO_CCW_CRW_IRQ_INDEX:=1): 'VFIO_CCW_CRW_IRQ_INDEX', (VFIO_CCW_REQ_IRQ_INDEX:=2): 'VFIO_CCW_REQ_IRQ_INDEX', (VFIO_CCW_NUM_IRQS:=3): 'VFIO_CCW_NUM_IRQS'} +_anonenum4: dict[int, str] = {(VFIO_AP_REQ_IRQ_INDEX:=0): 'VFIO_AP_REQ_IRQ_INDEX', (VFIO_AP_CFG_CHG_IRQ_INDEX:=1): 'VFIO_AP_CFG_CHG_IRQ_INDEX', (VFIO_AP_NUM_IRQS:=2): 'VFIO_AP_NUM_IRQS'} +@c.record +class struct_vfio_pci_dependent_device(c.Struct): + SIZE = 8 + group_id: int + devid: int + segment: int + bus: int + devfn: int +struct_vfio_pci_dependent_device.register_fields([('group_id', ctypes.c_uint32, 0), ('devid', ctypes.c_uint32, 0), ('segment', ctypes.c_uint16, 4), ('bus', ctypes.c_ubyte, 6), ('devfn', ctypes.c_ubyte, 7)]) +@c.record +class struct_vfio_pci_hot_reset_info(c.Struct): + SIZE = 12 + argsz: int + flags: int + count: int + devices: c.Array[struct_vfio_pci_dependent_device, Literal[0]] +struct_vfio_pci_hot_reset_info.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('count', ctypes.c_uint32, 8), ('devices', c.Array[struct_vfio_pci_dependent_device, Literal[0]], 12)]) +@c.record +class struct_vfio_pci_hot_reset(c.Struct): + SIZE = 12 + argsz: int + flags: int + count: int + group_fds: c.Array[ctypes.c_int32, Literal[0]] +__s32: TypeAlias = ctypes.c_int32 +struct_vfio_pci_hot_reset.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('count', ctypes.c_uint32, 8), ('group_fds', c.Array[ctypes.c_int32, Literal[0]], 12)]) +@c.record +class struct_vfio_device_gfx_plane_info(c.Struct): + SIZE = 64 + argsz: int + flags: int + drm_plane_type: int + drm_format: int + drm_format_mod: int + width: int + height: int + stride: int + size: int + x_pos: int + y_pos: int + x_hot: int + y_hot: int + region_index: int + dmabuf_id: int + reserved: int +struct_vfio_device_gfx_plane_info.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('drm_plane_type', ctypes.c_uint32, 8), ('drm_format', ctypes.c_uint32, 12), ('drm_format_mod', ctypes.c_uint64, 16), ('width', ctypes.c_uint32, 24), ('height', ctypes.c_uint32, 28), ('stride', ctypes.c_uint32, 32), ('size', ctypes.c_uint32, 36), ('x_pos', ctypes.c_uint32, 40), ('y_pos', ctypes.c_uint32, 44), ('x_hot', ctypes.c_uint32, 48), ('y_hot', ctypes.c_uint32, 52), ('region_index', ctypes.c_uint32, 56), ('dmabuf_id', ctypes.c_uint32, 56), ('reserved', ctypes.c_uint32, 60)]) +@c.record +class struct_vfio_device_ioeventfd(c.Struct): + SIZE = 32 + argsz: int + flags: int + offset: int + data: int + fd: int + reserved: int +struct_vfio_device_ioeventfd.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('offset', ctypes.c_uint64, 8), ('data', ctypes.c_uint64, 16), ('fd', ctypes.c_int32, 24), ('reserved', ctypes.c_uint32, 28)]) +@c.record +class struct_vfio_device_feature(c.Struct): + SIZE = 8 + argsz: int + flags: int + data: c.Array[ctypes.c_ubyte, Literal[0]] +struct_vfio_device_feature.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('data', c.Array[ctypes.c_ubyte, Literal[0]], 8)]) +@c.record +class struct_vfio_device_bind_iommufd(c.Struct): + SIZE = 24 + argsz: int + flags: int + iommufd: int + out_devid: int + token_uuid_ptr: int +struct_vfio_device_bind_iommufd.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('iommufd', ctypes.c_int32, 8), ('out_devid', ctypes.c_uint32, 12), ('token_uuid_ptr', ctypes.c_uint64, 16)]) +@c.record +class struct_vfio_device_attach_iommufd_pt(c.Struct): + SIZE = 16 + argsz: int + flags: int + pt_id: int + pasid: int +struct_vfio_device_attach_iommufd_pt.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('pt_id', ctypes.c_uint32, 8), ('pasid', ctypes.c_uint32, 12)]) +@c.record +class struct_vfio_device_detach_iommufd_pt(c.Struct): + SIZE = 12 + argsz: int + flags: int + pasid: int +struct_vfio_device_detach_iommufd_pt.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('pasid', ctypes.c_uint32, 8)]) +@c.record +class struct_vfio_device_feature_migration(c.Struct): + SIZE = 8 + flags: int +struct_vfio_device_feature_migration.register_fields([('flags', ctypes.c_uint64, 0)]) +@c.record +class struct_vfio_device_feature_mig_state(c.Struct): + SIZE = 8 + device_state: int + data_fd: int +struct_vfio_device_feature_mig_state.register_fields([('device_state', ctypes.c_uint32, 0), ('data_fd', ctypes.c_int32, 4)]) +enum_vfio_device_mig_state: dict[int, str] = {(VFIO_DEVICE_STATE_ERROR:=0): 'VFIO_DEVICE_STATE_ERROR', (VFIO_DEVICE_STATE_STOP:=1): 'VFIO_DEVICE_STATE_STOP', (VFIO_DEVICE_STATE_RUNNING:=2): 'VFIO_DEVICE_STATE_RUNNING', (VFIO_DEVICE_STATE_STOP_COPY:=3): 'VFIO_DEVICE_STATE_STOP_COPY', (VFIO_DEVICE_STATE_RESUMING:=4): 'VFIO_DEVICE_STATE_RESUMING', (VFIO_DEVICE_STATE_RUNNING_P2P:=5): 'VFIO_DEVICE_STATE_RUNNING_P2P', (VFIO_DEVICE_STATE_PRE_COPY:=6): 'VFIO_DEVICE_STATE_PRE_COPY', (VFIO_DEVICE_STATE_PRE_COPY_P2P:=7): 'VFIO_DEVICE_STATE_PRE_COPY_P2P', (VFIO_DEVICE_STATE_NR:=8): 'VFIO_DEVICE_STATE_NR'} +@c.record +class struct_vfio_precopy_info(c.Struct): + SIZE = 24 + argsz: int + flags: int + initial_bytes: int + dirty_bytes: int +struct_vfio_precopy_info.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('initial_bytes', ctypes.c_uint64, 8), ('dirty_bytes', ctypes.c_uint64, 16)]) +@c.record +class struct_vfio_device_low_power_entry_with_wakeup(c.Struct): + SIZE = 8 + wakeup_eventfd: int + reserved: int +struct_vfio_device_low_power_entry_with_wakeup.register_fields([('wakeup_eventfd', ctypes.c_int32, 0), ('reserved', ctypes.c_uint32, 4)]) +@c.record +class struct_vfio_device_feature_dma_logging_control(c.Struct): + SIZE = 24 + page_size: int + num_ranges: int + __reserved: int + ranges: int +struct_vfio_device_feature_dma_logging_control.register_fields([('page_size', ctypes.c_uint64, 0), ('num_ranges', ctypes.c_uint32, 8), ('__reserved', ctypes.c_uint32, 12), ('ranges', ctypes.c_uint64, 16)]) +@c.record +class struct_vfio_device_feature_dma_logging_range(c.Struct): + SIZE = 16 + iova: int + length: int +struct_vfio_device_feature_dma_logging_range.register_fields([('iova', ctypes.c_uint64, 0), ('length', ctypes.c_uint64, 8)]) +@c.record +class struct_vfio_device_feature_dma_logging_report(c.Struct): + SIZE = 32 + iova: int + length: int + page_size: int + bitmap: int +struct_vfio_device_feature_dma_logging_report.register_fields([('iova', ctypes.c_uint64, 0), ('length', ctypes.c_uint64, 8), ('page_size', ctypes.c_uint64, 16), ('bitmap', ctypes.c_uint64, 24)]) +@c.record +class struct_vfio_device_feature_mig_data_size(c.Struct): + SIZE = 8 + stop_copy_length: int +struct_vfio_device_feature_mig_data_size.register_fields([('stop_copy_length', ctypes.c_uint64, 0)]) +@c.record +class struct_vfio_device_feature_bus_master(c.Struct): + SIZE = 4 + op: int +struct_vfio_device_feature_bus_master.register_fields([('op', ctypes.c_uint32, 0)]) +@c.record +class struct_vfio_iommu_type1_info(c.Struct): + SIZE = 24 + argsz: int + flags: int + iova_pgsizes: int + cap_offset: int + pad: int +struct_vfio_iommu_type1_info.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('iova_pgsizes', ctypes.c_uint64, 8), ('cap_offset', ctypes.c_uint32, 16), ('pad', ctypes.c_uint32, 20)]) +@c.record +class struct_vfio_iova_range(c.Struct): + SIZE = 16 + start: int + end: int +struct_vfio_iova_range.register_fields([('start', ctypes.c_uint64, 0), ('end', ctypes.c_uint64, 8)]) +@c.record +class struct_vfio_iommu_type1_info_cap_iova_range(c.Struct): + SIZE = 16 + header: struct_vfio_info_cap_header + nr_iovas: int + reserved: int + iova_ranges: c.Array[struct_vfio_iova_range, Literal[0]] +struct_vfio_iommu_type1_info_cap_iova_range.register_fields([('header', struct_vfio_info_cap_header, 0), ('nr_iovas', ctypes.c_uint32, 8), ('reserved', ctypes.c_uint32, 12), ('iova_ranges', c.Array[struct_vfio_iova_range, Literal[0]], 16)]) +@c.record +class struct_vfio_iommu_type1_info_cap_migration(c.Struct): + SIZE = 32 + header: struct_vfio_info_cap_header + flags: int + pgsize_bitmap: int + max_dirty_bitmap_size: int +struct_vfio_iommu_type1_info_cap_migration.register_fields([('header', struct_vfio_info_cap_header, 0), ('flags', ctypes.c_uint32, 8), ('pgsize_bitmap', ctypes.c_uint64, 16), ('max_dirty_bitmap_size', ctypes.c_uint64, 24)]) +@c.record +class struct_vfio_iommu_type1_info_dma_avail(c.Struct): + SIZE = 12 + header: struct_vfio_info_cap_header + avail: int +struct_vfio_iommu_type1_info_dma_avail.register_fields([('header', struct_vfio_info_cap_header, 0), ('avail', ctypes.c_uint32, 8)]) +@c.record +class struct_vfio_iommu_type1_dma_map(c.Struct): + SIZE = 32 + argsz: int + flags: int + vaddr: int + iova: int + size: int +struct_vfio_iommu_type1_dma_map.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('vaddr', ctypes.c_uint64, 8), ('iova', ctypes.c_uint64, 16), ('size', ctypes.c_uint64, 24)]) +@c.record +class struct_vfio_bitmap(c.Struct): + SIZE = 24 + pgsize: int + size: int + data: c.POINTER[ctypes.c_uint64] +struct_vfio_bitmap.register_fields([('pgsize', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('data', c.POINTER[ctypes.c_uint64], 16)]) +@c.record +class struct_vfio_iommu_type1_dma_unmap(c.Struct): + SIZE = 24 + argsz: int + flags: int + iova: int + size: int + data: c.Array[ctypes.c_ubyte, Literal[0]] +struct_vfio_iommu_type1_dma_unmap.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('iova', ctypes.c_uint64, 8), ('size', ctypes.c_uint64, 16), ('data', c.Array[ctypes.c_ubyte, Literal[0]], 24)]) +@c.record +class struct_vfio_iommu_type1_dirty_bitmap(c.Struct): + SIZE = 8 + argsz: int + flags: int + data: c.Array[ctypes.c_ubyte, Literal[0]] +struct_vfio_iommu_type1_dirty_bitmap.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('data', c.Array[ctypes.c_ubyte, Literal[0]], 8)]) +@c.record +class struct_vfio_iommu_type1_dirty_bitmap_get(c.Struct): + SIZE = 40 + iova: int + size: int + bitmap: struct_vfio_bitmap +struct_vfio_iommu_type1_dirty_bitmap_get.register_fields([('iova', ctypes.c_uint64, 0), ('size', ctypes.c_uint64, 8), ('bitmap', struct_vfio_bitmap, 16)]) +@c.record +class struct_vfio_iommu_spapr_tce_ddw_info(c.Struct): + SIZE = 16 + pgsizes: int + max_dynamic_windows_supported: int + levels: int +struct_vfio_iommu_spapr_tce_ddw_info.register_fields([('pgsizes', ctypes.c_uint64, 0), ('max_dynamic_windows_supported', ctypes.c_uint32, 8), ('levels', ctypes.c_uint32, 12)]) +@c.record +class struct_vfio_iommu_spapr_tce_info(c.Struct): + SIZE = 32 + argsz: int + flags: int + dma32_window_start: int + dma32_window_size: int + ddw: struct_vfio_iommu_spapr_tce_ddw_info +struct_vfio_iommu_spapr_tce_info.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('dma32_window_start', ctypes.c_uint32, 8), ('dma32_window_size', ctypes.c_uint32, 12), ('ddw', struct_vfio_iommu_spapr_tce_ddw_info, 16)]) +@c.record +class struct_vfio_eeh_pe_err(c.Struct): + SIZE = 24 + type: int + func: int + addr: int + mask: int +struct_vfio_eeh_pe_err.register_fields([('type', ctypes.c_uint32, 0), ('func', ctypes.c_uint32, 4), ('addr', ctypes.c_uint64, 8), ('mask', ctypes.c_uint64, 16)]) +@c.record +class struct_vfio_eeh_pe_op(c.Struct): + SIZE = 40 + argsz: int + flags: int + op: int + err: struct_vfio_eeh_pe_err +struct_vfio_eeh_pe_op.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('op', ctypes.c_uint32, 8), ('err', struct_vfio_eeh_pe_err, 16)]) +@c.record +class struct_vfio_iommu_spapr_register_memory(c.Struct): + SIZE = 24 + argsz: int + flags: int + vaddr: int + size: int +struct_vfio_iommu_spapr_register_memory.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('vaddr', ctypes.c_uint64, 8), ('size', ctypes.c_uint64, 16)]) +@c.record +class struct_vfio_iommu_spapr_tce_create(c.Struct): + SIZE = 40 + argsz: int + flags: int + page_shift: int + __resv1: int + window_size: int + levels: int + __resv2: int + start_addr: int +struct_vfio_iommu_spapr_tce_create.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('page_shift', ctypes.c_uint32, 8), ('__resv1', ctypes.c_uint32, 12), ('window_size', ctypes.c_uint64, 16), ('levels', ctypes.c_uint32, 24), ('__resv2', ctypes.c_uint32, 28), ('start_addr', ctypes.c_uint64, 32)]) +@c.record +class struct_vfio_iommu_spapr_tce_remove(c.Struct): + SIZE = 16 + argsz: int + flags: int + start_addr: int +struct_vfio_iommu_spapr_tce_remove.register_fields([('argsz', ctypes.c_uint32, 0), ('flags', ctypes.c_uint32, 4), ('start_addr', ctypes.c_uint64, 8)]) +VFIO_API_VERSION = 0 +VFIO_TYPE1_IOMMU = 1 +VFIO_SPAPR_TCE_IOMMU = 2 +VFIO_TYPE1v2_IOMMU = 3 +VFIO_DMA_CC_IOMMU = 4 +VFIO_EEH = 5 +__VFIO_RESERVED_TYPE1_NESTING_IOMMU = 6 +VFIO_SPAPR_TCE_v2_IOMMU = 7 +VFIO_NOIOMMU_IOMMU = 8 +VFIO_UNMAP_ALL = 9 +VFIO_UPDATE_VADDR = 10 +VFIO_TYPE = (';') +VFIO_BASE = 100 +VFIO_GET_API_VERSION = _IO(VFIO_TYPE, VFIO_BASE + 0) +VFIO_CHECK_EXTENSION = _IO(VFIO_TYPE, VFIO_BASE + 1) +VFIO_SET_IOMMU = _IO(VFIO_TYPE, VFIO_BASE + 2) +VFIO_GROUP_FLAGS_VIABLE = (1 << 0) +VFIO_GROUP_FLAGS_CONTAINER_SET = (1 << 1) +VFIO_GROUP_GET_STATUS = _IO(VFIO_TYPE, VFIO_BASE + 3) +VFIO_GROUP_SET_CONTAINER = _IO(VFIO_TYPE, VFIO_BASE + 4) +VFIO_GROUP_UNSET_CONTAINER = _IO(VFIO_TYPE, VFIO_BASE + 5) +VFIO_GROUP_GET_DEVICE_FD = _IO(VFIO_TYPE, VFIO_BASE + 6) +VFIO_DEVICE_FLAGS_RESET = (1 << 0) +VFIO_DEVICE_FLAGS_PCI = (1 << 1) +VFIO_DEVICE_FLAGS_PLATFORM = (1 << 2) +VFIO_DEVICE_FLAGS_AMBA = (1 << 3) +VFIO_DEVICE_FLAGS_CCW = (1 << 4) +VFIO_DEVICE_FLAGS_AP = (1 << 5) +VFIO_DEVICE_FLAGS_FSL_MC = (1 << 6) +VFIO_DEVICE_FLAGS_CAPS = (1 << 7) +VFIO_DEVICE_FLAGS_CDX = (1 << 8) +VFIO_DEVICE_GET_INFO = _IO(VFIO_TYPE, VFIO_BASE + 7) +VFIO_DEVICE_API_PCI_STRING = "vfio-pci" +VFIO_DEVICE_API_PLATFORM_STRING = "vfio-platform" +VFIO_DEVICE_API_AMBA_STRING = "vfio-amba" +VFIO_DEVICE_API_CCW_STRING = "vfio-ccw" +VFIO_DEVICE_API_AP_STRING = "vfio-ap" +VFIO_DEVICE_INFO_CAP_ZPCI_BASE = 1 +VFIO_DEVICE_INFO_CAP_ZPCI_GROUP = 2 +VFIO_DEVICE_INFO_CAP_ZPCI_UTIL = 3 +VFIO_DEVICE_INFO_CAP_ZPCI_PFIP = 4 +VFIO_DEVICE_INFO_CAP_PCI_ATOMIC_COMP = 5 +VFIO_PCI_ATOMIC_COMP32 = (1 << 0) +VFIO_PCI_ATOMIC_COMP64 = (1 << 1) +VFIO_PCI_ATOMIC_COMP128 = (1 << 2) +VFIO_REGION_INFO_FLAG_READ = (1 << 0) +VFIO_REGION_INFO_FLAG_WRITE = (1 << 1) +VFIO_REGION_INFO_FLAG_MMAP = (1 << 2) +VFIO_REGION_INFO_FLAG_CAPS = (1 << 3) +VFIO_DEVICE_GET_REGION_INFO = _IO(VFIO_TYPE, VFIO_BASE + 8) +VFIO_REGION_INFO_CAP_SPARSE_MMAP = 1 +VFIO_REGION_INFO_CAP_TYPE = 2 +VFIO_REGION_TYPE_PCI_VENDOR_TYPE = (1 << 31) +VFIO_REGION_TYPE_PCI_VENDOR_MASK = (0xffff) +VFIO_REGION_TYPE_GFX = (1) +VFIO_REGION_TYPE_CCW = (2) +VFIO_REGION_TYPE_MIGRATION_DEPRECATED = (3) +VFIO_REGION_SUBTYPE_INTEL_IGD_OPREGION = (1) +VFIO_REGION_SUBTYPE_INTEL_IGD_HOST_CFG = (2) +VFIO_REGION_SUBTYPE_INTEL_IGD_LPC_CFG = (3) +VFIO_REGION_SUBTYPE_NVIDIA_NVLINK2_RAM = (1) +VFIO_REGION_SUBTYPE_IBM_NVLINK2_ATSD = (1) +VFIO_REGION_SUBTYPE_GFX_EDID = (1) +VFIO_DEVICE_GFX_LINK_STATE_UP = 1 +VFIO_DEVICE_GFX_LINK_STATE_DOWN = 2 +VFIO_REGION_SUBTYPE_CCW_ASYNC_CMD = (1) +VFIO_REGION_SUBTYPE_CCW_SCHIB = (2) +VFIO_REGION_SUBTYPE_CCW_CRW = (3) +VFIO_REGION_SUBTYPE_MIGRATION_DEPRECATED = (1) +VFIO_DEVICE_STATE_V1_STOP = (0) +VFIO_DEVICE_STATE_V1_RUNNING = (1 << 0) +VFIO_DEVICE_STATE_V1_SAVING = (1 << 1) +VFIO_DEVICE_STATE_V1_RESUMING = (1 << 2) +VFIO_DEVICE_STATE_MASK = (VFIO_DEVICE_STATE_V1_RUNNING | VFIO_DEVICE_STATE_V1_SAVING | VFIO_DEVICE_STATE_V1_RESUMING) +VFIO_DEVICE_STATE_IS_ERROR = lambda state: ((state & VFIO_DEVICE_STATE_MASK) == (VFIO_DEVICE_STATE_V1_SAVING | VFIO_DEVICE_STATE_V1_RESUMING)) # type: ignore +VFIO_DEVICE_STATE_SET_ERROR = lambda state: ((state & ~VFIO_DEVICE_STATE_MASK) | VFIO_DEVICE_STATE_V1_SAVING | VFIO_DEVICE_STATE_V1_RESUMING) # type: ignore +VFIO_REGION_INFO_CAP_MSIX_MAPPABLE = 3 +VFIO_REGION_INFO_CAP_NVLINK2_SSATGT = 4 +VFIO_REGION_INFO_CAP_NVLINK2_LNKSPD = 5 +VFIO_IRQ_INFO_EVENTFD = (1 << 0) +VFIO_IRQ_INFO_MASKABLE = (1 << 1) +VFIO_IRQ_INFO_AUTOMASKED = (1 << 2) +VFIO_IRQ_INFO_NORESIZE = (1 << 3) +VFIO_DEVICE_GET_IRQ_INFO = _IO(VFIO_TYPE, VFIO_BASE + 9) +VFIO_IRQ_SET_DATA_NONE = (1 << 0) +VFIO_IRQ_SET_DATA_BOOL = (1 << 1) +VFIO_IRQ_SET_DATA_EVENTFD = (1 << 2) +VFIO_IRQ_SET_ACTION_MASK = (1 << 3) +VFIO_IRQ_SET_ACTION_UNMASK = (1 << 4) +VFIO_IRQ_SET_ACTION_TRIGGER = (1 << 5) +VFIO_DEVICE_SET_IRQS = _IO(VFIO_TYPE, VFIO_BASE + 10) +VFIO_IRQ_SET_DATA_TYPE_MASK = (VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_DATA_BOOL | VFIO_IRQ_SET_DATA_EVENTFD) +VFIO_IRQ_SET_ACTION_TYPE_MASK = (VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_ACTION_UNMASK | VFIO_IRQ_SET_ACTION_TRIGGER) +VFIO_DEVICE_RESET = _IO(VFIO_TYPE, VFIO_BASE + 11) +VFIO_PCI_DEVID_OWNED = 0 +VFIO_PCI_DEVID_NOT_OWNED = -1 +VFIO_PCI_HOT_RESET_FLAG_DEV_ID = (1 << 0) +VFIO_PCI_HOT_RESET_FLAG_DEV_ID_OWNED = (1 << 1) +VFIO_DEVICE_GET_PCI_HOT_RESET_INFO = _IO(VFIO_TYPE, VFIO_BASE + 12) +VFIO_DEVICE_PCI_HOT_RESET = _IO(VFIO_TYPE, VFIO_BASE + 13) +VFIO_GFX_PLANE_TYPE_PROBE = (1 << 0) +VFIO_GFX_PLANE_TYPE_DMABUF = (1 << 1) +VFIO_GFX_PLANE_TYPE_REGION = (1 << 2) +VFIO_DEVICE_QUERY_GFX_PLANE = _IO(VFIO_TYPE, VFIO_BASE + 14) +VFIO_DEVICE_GET_GFX_DMABUF = _IO(VFIO_TYPE, VFIO_BASE + 15) +VFIO_DEVICE_IOEVENTFD_8 = (1 << 0) +VFIO_DEVICE_IOEVENTFD_16 = (1 << 1) +VFIO_DEVICE_IOEVENTFD_32 = (1 << 2) +VFIO_DEVICE_IOEVENTFD_64 = (1 << 3) +VFIO_DEVICE_IOEVENTFD_SIZE_MASK = (0xf) +VFIO_DEVICE_IOEVENTFD = _IO(VFIO_TYPE, VFIO_BASE + 16) +VFIO_DEVICE_FEATURE_MASK = (0xffff) +VFIO_DEVICE_FEATURE_GET = (1 << 16) +VFIO_DEVICE_FEATURE_SET = (1 << 17) +VFIO_DEVICE_FEATURE_PROBE = (1 << 18) +VFIO_DEVICE_FEATURE = _IO(VFIO_TYPE, VFIO_BASE + 17) +VFIO_DEVICE_BIND_FLAG_TOKEN = (1 << 0) +VFIO_DEVICE_BIND_IOMMUFD = _IO(VFIO_TYPE, VFIO_BASE + 18) +VFIO_DEVICE_ATTACH_PASID = (1 << 0) +VFIO_DEVICE_ATTACH_IOMMUFD_PT = _IO(VFIO_TYPE, VFIO_BASE + 19) +VFIO_DEVICE_DETACH_PASID = (1 << 0) +VFIO_DEVICE_DETACH_IOMMUFD_PT = _IO(VFIO_TYPE, VFIO_BASE + 20) +VFIO_DEVICE_FEATURE_PCI_VF_TOKEN = (0) +VFIO_MIGRATION_STOP_COPY = (1 << 0) +VFIO_MIGRATION_P2P = (1 << 1) +VFIO_MIGRATION_PRE_COPY = (1 << 2) +VFIO_DEVICE_FEATURE_MIGRATION = 1 +VFIO_DEVICE_FEATURE_MIG_DEVICE_STATE = 2 +VFIO_MIG_GET_PRECOPY_INFO = _IO(VFIO_TYPE, VFIO_BASE + 21) +VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY = 3 +VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY_WITH_WAKEUP = 4 +VFIO_DEVICE_FEATURE_LOW_POWER_EXIT = 5 +VFIO_DEVICE_FEATURE_DMA_LOGGING_START = 6 +VFIO_DEVICE_FEATURE_DMA_LOGGING_STOP = 7 +VFIO_DEVICE_FEATURE_DMA_LOGGING_REPORT = 8 +VFIO_DEVICE_FEATURE_MIG_DATA_SIZE = 9 +VFIO_DEVICE_FEATURE_CLEAR_MASTER = 0 +VFIO_DEVICE_FEATURE_SET_MASTER = 1 +VFIO_DEVICE_FEATURE_BUS_MASTER = 10 +VFIO_IOMMU_INFO_PGSIZES = (1 << 0) +VFIO_IOMMU_INFO_CAPS = (1 << 1) +VFIO_IOMMU_TYPE1_INFO_CAP_IOVA_RANGE = 1 +VFIO_IOMMU_TYPE1_INFO_CAP_MIGRATION = 2 +VFIO_IOMMU_TYPE1_INFO_DMA_AVAIL = 3 +VFIO_IOMMU_GET_INFO = _IO(VFIO_TYPE, VFIO_BASE + 12) +VFIO_DMA_MAP_FLAG_READ = (1 << 0) +VFIO_DMA_MAP_FLAG_WRITE = (1 << 1) +VFIO_DMA_MAP_FLAG_VADDR = (1 << 2) +VFIO_IOMMU_MAP_DMA = _IO(VFIO_TYPE, VFIO_BASE + 13) +VFIO_DMA_UNMAP_FLAG_GET_DIRTY_BITMAP = (1 << 0) +VFIO_DMA_UNMAP_FLAG_ALL = (1 << 1) +VFIO_DMA_UNMAP_FLAG_VADDR = (1 << 2) +VFIO_IOMMU_UNMAP_DMA = _IO(VFIO_TYPE, VFIO_BASE + 14) +VFIO_IOMMU_ENABLE = _IO(VFIO_TYPE, VFIO_BASE + 15) +VFIO_IOMMU_DISABLE = _IO(VFIO_TYPE, VFIO_BASE + 16) +VFIO_IOMMU_DIRTY_PAGES_FLAG_START = (1 << 0) +VFIO_IOMMU_DIRTY_PAGES_FLAG_STOP = (1 << 1) +VFIO_IOMMU_DIRTY_PAGES_FLAG_GET_BITMAP = (1 << 2) +VFIO_IOMMU_DIRTY_PAGES = _IO(VFIO_TYPE, VFIO_BASE + 17) +VFIO_IOMMU_SPAPR_INFO_DDW = (1 << 0) +VFIO_IOMMU_SPAPR_TCE_GET_INFO = _IO(VFIO_TYPE, VFIO_BASE + 12) +VFIO_EEH_PE_DISABLE = 0 +VFIO_EEH_PE_ENABLE = 1 +VFIO_EEH_PE_UNFREEZE_IO = 2 +VFIO_EEH_PE_UNFREEZE_DMA = 3 +VFIO_EEH_PE_GET_STATE = 4 +VFIO_EEH_PE_STATE_NORMAL = 0 +VFIO_EEH_PE_STATE_RESET = 1 +VFIO_EEH_PE_STATE_STOPPED = 2 +VFIO_EEH_PE_STATE_STOPPED_DMA = 4 +VFIO_EEH_PE_STATE_UNAVAIL = 5 +VFIO_EEH_PE_RESET_DEACTIVATE = 5 +VFIO_EEH_PE_RESET_HOT = 6 +VFIO_EEH_PE_RESET_FUNDAMENTAL = 7 +VFIO_EEH_PE_CONFIGURE = 8 +VFIO_EEH_PE_INJECT_ERR = 9 +VFIO_EEH_PE_OP = _IO(VFIO_TYPE, VFIO_BASE + 21) +VFIO_IOMMU_SPAPR_REGISTER_MEMORY = _IO(VFIO_TYPE, VFIO_BASE + 17) +VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY = _IO(VFIO_TYPE, VFIO_BASE + 18) +VFIO_IOMMU_SPAPR_TCE_CREATE = _IO(VFIO_TYPE, VFIO_BASE + 19) +VFIO_IOMMU_SPAPR_TCE_REMOVE = _IO(VFIO_TYPE, VFIO_BASE + 20) \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/autogen/webgpu.py b/artifacts/package_runtime/tinygrad/runtime/autogen/webgpu.py new file mode 100644 index 000000000..8ebc7c923 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/autogen/webgpu.py @@ -0,0 +1,2609 @@ +# mypy: disable-error-code="empty-body" +from __future__ import annotations +import ctypes +from typing import Literal, TypeAlias +from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR +from tinygrad.runtime.support import c +from tinygrad.helpers import WIN, OSX +import sysconfig, os +dll = c.DLL('webgpu', os.path.join(sysconfig.get_paths()['purelib'], 'pydawn', 'lib', 'libwebgpu_dawn.dll') if WIN else 'webgpu_dawn') +WGPUFlags: TypeAlias = ctypes.c_uint64 +WGPUBool: TypeAlias = ctypes.c_uint32 +class struct_WGPUAdapterImpl(c.Struct): pass +WGPUAdapter: TypeAlias = c.POINTER[struct_WGPUAdapterImpl] +class struct_WGPUBindGroupImpl(c.Struct): pass +WGPUBindGroup: TypeAlias = c.POINTER[struct_WGPUBindGroupImpl] +class struct_WGPUBindGroupLayoutImpl(c.Struct): pass +WGPUBindGroupLayout: TypeAlias = c.POINTER[struct_WGPUBindGroupLayoutImpl] +class struct_WGPUBufferImpl(c.Struct): pass +WGPUBuffer: TypeAlias = c.POINTER[struct_WGPUBufferImpl] +class struct_WGPUCommandBufferImpl(c.Struct): pass +WGPUCommandBuffer: TypeAlias = c.POINTER[struct_WGPUCommandBufferImpl] +class struct_WGPUCommandEncoderImpl(c.Struct): pass +WGPUCommandEncoder: TypeAlias = c.POINTER[struct_WGPUCommandEncoderImpl] +class struct_WGPUComputePassEncoderImpl(c.Struct): pass +WGPUComputePassEncoder: TypeAlias = c.POINTER[struct_WGPUComputePassEncoderImpl] +class struct_WGPUComputePipelineImpl(c.Struct): pass +WGPUComputePipeline: TypeAlias = c.POINTER[struct_WGPUComputePipelineImpl] +class struct_WGPUDeviceImpl(c.Struct): pass +WGPUDevice: TypeAlias = c.POINTER[struct_WGPUDeviceImpl] +class struct_WGPUExternalTextureImpl(c.Struct): pass +WGPUExternalTexture: TypeAlias = c.POINTER[struct_WGPUExternalTextureImpl] +class struct_WGPUInstanceImpl(c.Struct): pass +WGPUInstance: TypeAlias = c.POINTER[struct_WGPUInstanceImpl] +class struct_WGPUPipelineLayoutImpl(c.Struct): pass +WGPUPipelineLayout: TypeAlias = c.POINTER[struct_WGPUPipelineLayoutImpl] +class struct_WGPUQuerySetImpl(c.Struct): pass +WGPUQuerySet: TypeAlias = c.POINTER[struct_WGPUQuerySetImpl] +class struct_WGPUQueueImpl(c.Struct): pass +WGPUQueue: TypeAlias = c.POINTER[struct_WGPUQueueImpl] +class struct_WGPURenderBundleImpl(c.Struct): pass +WGPURenderBundle: TypeAlias = c.POINTER[struct_WGPURenderBundleImpl] +class struct_WGPURenderBundleEncoderImpl(c.Struct): pass +WGPURenderBundleEncoder: TypeAlias = c.POINTER[struct_WGPURenderBundleEncoderImpl] +class struct_WGPURenderPassEncoderImpl(c.Struct): pass +WGPURenderPassEncoder: TypeAlias = c.POINTER[struct_WGPURenderPassEncoderImpl] +class struct_WGPURenderPipelineImpl(c.Struct): pass +WGPURenderPipeline: TypeAlias = c.POINTER[struct_WGPURenderPipelineImpl] +class struct_WGPUSamplerImpl(c.Struct): pass +WGPUSampler: TypeAlias = c.POINTER[struct_WGPUSamplerImpl] +class struct_WGPUShaderModuleImpl(c.Struct): pass +WGPUShaderModule: TypeAlias = c.POINTER[struct_WGPUShaderModuleImpl] +class struct_WGPUSharedBufferMemoryImpl(c.Struct): pass +WGPUSharedBufferMemory: TypeAlias = c.POINTER[struct_WGPUSharedBufferMemoryImpl] +class struct_WGPUSharedFenceImpl(c.Struct): pass +WGPUSharedFence: TypeAlias = c.POINTER[struct_WGPUSharedFenceImpl] +class struct_WGPUSharedTextureMemoryImpl(c.Struct): pass +WGPUSharedTextureMemory: TypeAlias = c.POINTER[struct_WGPUSharedTextureMemoryImpl] +class struct_WGPUSurfaceImpl(c.Struct): pass +WGPUSurface: TypeAlias = c.POINTER[struct_WGPUSurfaceImpl] +class struct_WGPUTextureImpl(c.Struct): pass +WGPUTexture: TypeAlias = c.POINTER[struct_WGPUTextureImpl] +class struct_WGPUTextureViewImpl(c.Struct): pass +WGPUTextureView: TypeAlias = c.POINTER[struct_WGPUTextureViewImpl] +@c.record +class struct_WGPUINTERNAL__HAVE_EMDAWNWEBGPU_HEADER(c.Struct): + SIZE = 4 + unused: int +struct_WGPUINTERNAL__HAVE_EMDAWNWEBGPU_HEADER.register_fields([('unused', WGPUBool, 0)]) +@c.record +class struct_WGPUAdapterPropertiesD3D(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + shaderModel: int +@c.record +class struct_WGPUChainedStructOut(c.Struct): + SIZE = 16 + next: c.POINTER[struct_WGPUChainedStructOut] + sType: int +WGPUChainedStructOut: TypeAlias = struct_WGPUChainedStructOut +enum_WGPUSType: dict[int, str] = {(WGPUSType_ShaderSourceSPIRV:=1): 'WGPUSType_ShaderSourceSPIRV', (WGPUSType_ShaderSourceWGSL:=2): 'WGPUSType_ShaderSourceWGSL', (WGPUSType_RenderPassMaxDrawCount:=3): 'WGPUSType_RenderPassMaxDrawCount', (WGPUSType_SurfaceSourceMetalLayer:=4): 'WGPUSType_SurfaceSourceMetalLayer', (WGPUSType_SurfaceSourceWindowsHWND:=5): 'WGPUSType_SurfaceSourceWindowsHWND', (WGPUSType_SurfaceSourceXlibWindow:=6): 'WGPUSType_SurfaceSourceXlibWindow', (WGPUSType_SurfaceSourceWaylandSurface:=7): 'WGPUSType_SurfaceSourceWaylandSurface', (WGPUSType_SurfaceSourceAndroidNativeWindow:=8): 'WGPUSType_SurfaceSourceAndroidNativeWindow', (WGPUSType_SurfaceSourceXCBWindow:=9): 'WGPUSType_SurfaceSourceXCBWindow', (WGPUSType_AdapterPropertiesSubgroups:=10): 'WGPUSType_AdapterPropertiesSubgroups', (WGPUSType_TextureBindingViewDimensionDescriptor:=131072): 'WGPUSType_TextureBindingViewDimensionDescriptor', (WGPUSType_SurfaceSourceCanvasHTMLSelector_Emscripten:=262144): 'WGPUSType_SurfaceSourceCanvasHTMLSelector_Emscripten', (WGPUSType_SurfaceDescriptorFromWindowsCoreWindow:=327680): 'WGPUSType_SurfaceDescriptorFromWindowsCoreWindow', (WGPUSType_ExternalTextureBindingEntry:=327681): 'WGPUSType_ExternalTextureBindingEntry', (WGPUSType_ExternalTextureBindingLayout:=327682): 'WGPUSType_ExternalTextureBindingLayout', (WGPUSType_SurfaceDescriptorFromWindowsSwapChainPanel:=327683): 'WGPUSType_SurfaceDescriptorFromWindowsSwapChainPanel', (WGPUSType_DawnTextureInternalUsageDescriptor:=327684): 'WGPUSType_DawnTextureInternalUsageDescriptor', (WGPUSType_DawnEncoderInternalUsageDescriptor:=327685): 'WGPUSType_DawnEncoderInternalUsageDescriptor', (WGPUSType_DawnInstanceDescriptor:=327686): 'WGPUSType_DawnInstanceDescriptor', (WGPUSType_DawnCacheDeviceDescriptor:=327687): 'WGPUSType_DawnCacheDeviceDescriptor', (WGPUSType_DawnAdapterPropertiesPowerPreference:=327688): 'WGPUSType_DawnAdapterPropertiesPowerPreference', (WGPUSType_DawnBufferDescriptorErrorInfoFromWireClient:=327689): 'WGPUSType_DawnBufferDescriptorErrorInfoFromWireClient', (WGPUSType_DawnTogglesDescriptor:=327690): 'WGPUSType_DawnTogglesDescriptor', (WGPUSType_DawnShaderModuleSPIRVOptionsDescriptor:=327691): 'WGPUSType_DawnShaderModuleSPIRVOptionsDescriptor', (WGPUSType_RequestAdapterOptionsLUID:=327692): 'WGPUSType_RequestAdapterOptionsLUID', (WGPUSType_RequestAdapterOptionsGetGLProc:=327693): 'WGPUSType_RequestAdapterOptionsGetGLProc', (WGPUSType_RequestAdapterOptionsD3D11Device:=327694): 'WGPUSType_RequestAdapterOptionsD3D11Device', (WGPUSType_DawnRenderPassColorAttachmentRenderToSingleSampled:=327695): 'WGPUSType_DawnRenderPassColorAttachmentRenderToSingleSampled', (WGPUSType_RenderPassPixelLocalStorage:=327696): 'WGPUSType_RenderPassPixelLocalStorage', (WGPUSType_PipelineLayoutPixelLocalStorage:=327697): 'WGPUSType_PipelineLayoutPixelLocalStorage', (WGPUSType_BufferHostMappedPointer:=327698): 'WGPUSType_BufferHostMappedPointer', (WGPUSType_DawnExperimentalSubgroupLimits:=327699): 'WGPUSType_DawnExperimentalSubgroupLimits', (WGPUSType_AdapterPropertiesMemoryHeaps:=327700): 'WGPUSType_AdapterPropertiesMemoryHeaps', (WGPUSType_AdapterPropertiesD3D:=327701): 'WGPUSType_AdapterPropertiesD3D', (WGPUSType_AdapterPropertiesVk:=327702): 'WGPUSType_AdapterPropertiesVk', (WGPUSType_DawnWireWGSLControl:=327703): 'WGPUSType_DawnWireWGSLControl', (WGPUSType_DawnWGSLBlocklist:=327704): 'WGPUSType_DawnWGSLBlocklist', (WGPUSType_DrmFormatCapabilities:=327705): 'WGPUSType_DrmFormatCapabilities', (WGPUSType_ShaderModuleCompilationOptions:=327706): 'WGPUSType_ShaderModuleCompilationOptions', (WGPUSType_ColorTargetStateExpandResolveTextureDawn:=327707): 'WGPUSType_ColorTargetStateExpandResolveTextureDawn', (WGPUSType_RenderPassDescriptorExpandResolveRect:=327708): 'WGPUSType_RenderPassDescriptorExpandResolveRect', (WGPUSType_SharedTextureMemoryVkDedicatedAllocationDescriptor:=327709): 'WGPUSType_SharedTextureMemoryVkDedicatedAllocationDescriptor', (WGPUSType_SharedTextureMemoryAHardwareBufferDescriptor:=327710): 'WGPUSType_SharedTextureMemoryAHardwareBufferDescriptor', (WGPUSType_SharedTextureMemoryDmaBufDescriptor:=327711): 'WGPUSType_SharedTextureMemoryDmaBufDescriptor', (WGPUSType_SharedTextureMemoryOpaqueFDDescriptor:=327712): 'WGPUSType_SharedTextureMemoryOpaqueFDDescriptor', (WGPUSType_SharedTextureMemoryZirconHandleDescriptor:=327713): 'WGPUSType_SharedTextureMemoryZirconHandleDescriptor', (WGPUSType_SharedTextureMemoryDXGISharedHandleDescriptor:=327714): 'WGPUSType_SharedTextureMemoryDXGISharedHandleDescriptor', (WGPUSType_SharedTextureMemoryD3D11Texture2DDescriptor:=327715): 'WGPUSType_SharedTextureMemoryD3D11Texture2DDescriptor', (WGPUSType_SharedTextureMemoryIOSurfaceDescriptor:=327716): 'WGPUSType_SharedTextureMemoryIOSurfaceDescriptor', (WGPUSType_SharedTextureMemoryEGLImageDescriptor:=327717): 'WGPUSType_SharedTextureMemoryEGLImageDescriptor', (WGPUSType_SharedTextureMemoryInitializedBeginState:=327718): 'WGPUSType_SharedTextureMemoryInitializedBeginState', (WGPUSType_SharedTextureMemoryInitializedEndState:=327719): 'WGPUSType_SharedTextureMemoryInitializedEndState', (WGPUSType_SharedTextureMemoryVkImageLayoutBeginState:=327720): 'WGPUSType_SharedTextureMemoryVkImageLayoutBeginState', (WGPUSType_SharedTextureMemoryVkImageLayoutEndState:=327721): 'WGPUSType_SharedTextureMemoryVkImageLayoutEndState', (WGPUSType_SharedTextureMemoryD3DSwapchainBeginState:=327722): 'WGPUSType_SharedTextureMemoryD3DSwapchainBeginState', (WGPUSType_SharedFenceVkSemaphoreOpaqueFDDescriptor:=327723): 'WGPUSType_SharedFenceVkSemaphoreOpaqueFDDescriptor', (WGPUSType_SharedFenceVkSemaphoreOpaqueFDExportInfo:=327724): 'WGPUSType_SharedFenceVkSemaphoreOpaqueFDExportInfo', (WGPUSType_SharedFenceSyncFDDescriptor:=327725): 'WGPUSType_SharedFenceSyncFDDescriptor', (WGPUSType_SharedFenceSyncFDExportInfo:=327726): 'WGPUSType_SharedFenceSyncFDExportInfo', (WGPUSType_SharedFenceVkSemaphoreZirconHandleDescriptor:=327727): 'WGPUSType_SharedFenceVkSemaphoreZirconHandleDescriptor', (WGPUSType_SharedFenceVkSemaphoreZirconHandleExportInfo:=327728): 'WGPUSType_SharedFenceVkSemaphoreZirconHandleExportInfo', (WGPUSType_SharedFenceDXGISharedHandleDescriptor:=327729): 'WGPUSType_SharedFenceDXGISharedHandleDescriptor', (WGPUSType_SharedFenceDXGISharedHandleExportInfo:=327730): 'WGPUSType_SharedFenceDXGISharedHandleExportInfo', (WGPUSType_SharedFenceMTLSharedEventDescriptor:=327731): 'WGPUSType_SharedFenceMTLSharedEventDescriptor', (WGPUSType_SharedFenceMTLSharedEventExportInfo:=327732): 'WGPUSType_SharedFenceMTLSharedEventExportInfo', (WGPUSType_SharedBufferMemoryD3D12ResourceDescriptor:=327733): 'WGPUSType_SharedBufferMemoryD3D12ResourceDescriptor', (WGPUSType_StaticSamplerBindingLayout:=327734): 'WGPUSType_StaticSamplerBindingLayout', (WGPUSType_YCbCrVkDescriptor:=327735): 'WGPUSType_YCbCrVkDescriptor', (WGPUSType_SharedTextureMemoryAHardwareBufferProperties:=327736): 'WGPUSType_SharedTextureMemoryAHardwareBufferProperties', (WGPUSType_AHardwareBufferProperties:=327737): 'WGPUSType_AHardwareBufferProperties', (WGPUSType_DawnExperimentalImmediateDataLimits:=327738): 'WGPUSType_DawnExperimentalImmediateDataLimits', (WGPUSType_DawnTexelCopyBufferRowAlignmentLimits:=327739): 'WGPUSType_DawnTexelCopyBufferRowAlignmentLimits', (WGPUSType_Force32:=2147483647): 'WGPUSType_Force32'} +WGPUSType: TypeAlias = ctypes.c_uint32 +struct_WGPUChainedStructOut.register_fields([('next', c.POINTER[struct_WGPUChainedStructOut], 0), ('sType', WGPUSType, 8)]) +uint32_t: TypeAlias = ctypes.c_uint32 +struct_WGPUAdapterPropertiesD3D.register_fields([('chain', WGPUChainedStructOut, 0), ('shaderModel', uint32_t, 16)]) +@c.record +class struct_WGPUAdapterPropertiesSubgroups(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + subgroupMinSize: int + subgroupMaxSize: int +struct_WGPUAdapterPropertiesSubgroups.register_fields([('chain', WGPUChainedStructOut, 0), ('subgroupMinSize', uint32_t, 16), ('subgroupMaxSize', uint32_t, 20)]) +@c.record +class struct_WGPUAdapterPropertiesVk(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + driverVersion: int +struct_WGPUAdapterPropertiesVk.register_fields([('chain', WGPUChainedStructOut, 0), ('driverVersion', uint32_t, 16)]) +@c.record +class struct_WGPUBindGroupEntry(c.Struct): + SIZE = 56 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + binding: int + buffer: c.POINTER[struct_WGPUBufferImpl] + offset: int + size: int + sampler: c.POINTER[struct_WGPUSamplerImpl] + textureView: c.POINTER[struct_WGPUTextureViewImpl] +@c.record +class struct_WGPUChainedStruct(c.Struct): + SIZE = 16 + next: c.POINTER[struct_WGPUChainedStruct] + sType: int +WGPUChainedStruct: TypeAlias = struct_WGPUChainedStruct +struct_WGPUChainedStruct.register_fields([('next', c.POINTER[struct_WGPUChainedStruct], 0), ('sType', WGPUSType, 8)]) +uint64_t: TypeAlias = ctypes.c_uint64 +struct_WGPUBindGroupEntry.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('binding', uint32_t, 8), ('buffer', WGPUBuffer, 16), ('offset', uint64_t, 24), ('size', uint64_t, 32), ('sampler', WGPUSampler, 40), ('textureView', WGPUTextureView, 48)]) +@c.record +class struct_WGPUBlendComponent(c.Struct): + SIZE = 12 + operation: int + srcFactor: int + dstFactor: int +enum_WGPUBlendOperation: dict[int, str] = {(WGPUBlendOperation_Undefined:=0): 'WGPUBlendOperation_Undefined', (WGPUBlendOperation_Add:=1): 'WGPUBlendOperation_Add', (WGPUBlendOperation_Subtract:=2): 'WGPUBlendOperation_Subtract', (WGPUBlendOperation_ReverseSubtract:=3): 'WGPUBlendOperation_ReverseSubtract', (WGPUBlendOperation_Min:=4): 'WGPUBlendOperation_Min', (WGPUBlendOperation_Max:=5): 'WGPUBlendOperation_Max', (WGPUBlendOperation_Force32:=2147483647): 'WGPUBlendOperation_Force32'} +WGPUBlendOperation: TypeAlias = ctypes.c_uint32 +enum_WGPUBlendFactor: dict[int, str] = {(WGPUBlendFactor_Undefined:=0): 'WGPUBlendFactor_Undefined', (WGPUBlendFactor_Zero:=1): 'WGPUBlendFactor_Zero', (WGPUBlendFactor_One:=2): 'WGPUBlendFactor_One', (WGPUBlendFactor_Src:=3): 'WGPUBlendFactor_Src', (WGPUBlendFactor_OneMinusSrc:=4): 'WGPUBlendFactor_OneMinusSrc', (WGPUBlendFactor_SrcAlpha:=5): 'WGPUBlendFactor_SrcAlpha', (WGPUBlendFactor_OneMinusSrcAlpha:=6): 'WGPUBlendFactor_OneMinusSrcAlpha', (WGPUBlendFactor_Dst:=7): 'WGPUBlendFactor_Dst', (WGPUBlendFactor_OneMinusDst:=8): 'WGPUBlendFactor_OneMinusDst', (WGPUBlendFactor_DstAlpha:=9): 'WGPUBlendFactor_DstAlpha', (WGPUBlendFactor_OneMinusDstAlpha:=10): 'WGPUBlendFactor_OneMinusDstAlpha', (WGPUBlendFactor_SrcAlphaSaturated:=11): 'WGPUBlendFactor_SrcAlphaSaturated', (WGPUBlendFactor_Constant:=12): 'WGPUBlendFactor_Constant', (WGPUBlendFactor_OneMinusConstant:=13): 'WGPUBlendFactor_OneMinusConstant', (WGPUBlendFactor_Src1:=14): 'WGPUBlendFactor_Src1', (WGPUBlendFactor_OneMinusSrc1:=15): 'WGPUBlendFactor_OneMinusSrc1', (WGPUBlendFactor_Src1Alpha:=16): 'WGPUBlendFactor_Src1Alpha', (WGPUBlendFactor_OneMinusSrc1Alpha:=17): 'WGPUBlendFactor_OneMinusSrc1Alpha', (WGPUBlendFactor_Force32:=2147483647): 'WGPUBlendFactor_Force32'} +WGPUBlendFactor: TypeAlias = ctypes.c_uint32 +struct_WGPUBlendComponent.register_fields([('operation', WGPUBlendOperation, 0), ('srcFactor', WGPUBlendFactor, 4), ('dstFactor', WGPUBlendFactor, 8)]) +@c.record +class struct_WGPUBufferBindingLayout(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + type: int + hasDynamicOffset: int + minBindingSize: int +enum_WGPUBufferBindingType: dict[int, str] = {(WGPUBufferBindingType_BindingNotUsed:=0): 'WGPUBufferBindingType_BindingNotUsed', (WGPUBufferBindingType_Uniform:=1): 'WGPUBufferBindingType_Uniform', (WGPUBufferBindingType_Storage:=2): 'WGPUBufferBindingType_Storage', (WGPUBufferBindingType_ReadOnlyStorage:=3): 'WGPUBufferBindingType_ReadOnlyStorage', (WGPUBufferBindingType_Force32:=2147483647): 'WGPUBufferBindingType_Force32'} +WGPUBufferBindingType: TypeAlias = ctypes.c_uint32 +struct_WGPUBufferBindingLayout.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('type', WGPUBufferBindingType, 8), ('hasDynamicOffset', WGPUBool, 12), ('minBindingSize', uint64_t, 16)]) +@c.record +class struct_WGPUBufferHostMappedPointer(c.Struct): + SIZE = 40 + chain: struct_WGPUChainedStruct + pointer: ctypes.c_void_p + disposeCallback: c.CFUNCTYPE[None, [ctypes.c_void_p]] + userdata: ctypes.c_void_p +WGPUCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p]] +struct_WGPUBufferHostMappedPointer.register_fields([('chain', WGPUChainedStruct, 0), ('pointer', ctypes.c_void_p, 16), ('disposeCallback', WGPUCallback, 24), ('userdata', ctypes.c_void_p, 32)]) +@c.record +class struct_WGPUBufferMapCallbackInfo(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_void_p]] + userdata: ctypes.c_void_p +enum_WGPUCallbackMode: dict[int, str] = {(WGPUCallbackMode_WaitAnyOnly:=1): 'WGPUCallbackMode_WaitAnyOnly', (WGPUCallbackMode_AllowProcessEvents:=2): 'WGPUCallbackMode_AllowProcessEvents', (WGPUCallbackMode_AllowSpontaneous:=3): 'WGPUCallbackMode_AllowSpontaneous', (WGPUCallbackMode_Force32:=2147483647): 'WGPUCallbackMode_Force32'} +WGPUCallbackMode: TypeAlias = ctypes.c_uint32 +enum_WGPUBufferMapAsyncStatus: dict[int, str] = {(WGPUBufferMapAsyncStatus_Success:=1): 'WGPUBufferMapAsyncStatus_Success', (WGPUBufferMapAsyncStatus_InstanceDropped:=2): 'WGPUBufferMapAsyncStatus_InstanceDropped', (WGPUBufferMapAsyncStatus_ValidationError:=3): 'WGPUBufferMapAsyncStatus_ValidationError', (WGPUBufferMapAsyncStatus_Unknown:=4): 'WGPUBufferMapAsyncStatus_Unknown', (WGPUBufferMapAsyncStatus_DeviceLost:=5): 'WGPUBufferMapAsyncStatus_DeviceLost', (WGPUBufferMapAsyncStatus_DestroyedBeforeCallback:=6): 'WGPUBufferMapAsyncStatus_DestroyedBeforeCallback', (WGPUBufferMapAsyncStatus_UnmappedBeforeCallback:=7): 'WGPUBufferMapAsyncStatus_UnmappedBeforeCallback', (WGPUBufferMapAsyncStatus_MappingAlreadyPending:=8): 'WGPUBufferMapAsyncStatus_MappingAlreadyPending', (WGPUBufferMapAsyncStatus_OffsetOutOfRange:=9): 'WGPUBufferMapAsyncStatus_OffsetOutOfRange', (WGPUBufferMapAsyncStatus_SizeOutOfRange:=10): 'WGPUBufferMapAsyncStatus_SizeOutOfRange', (WGPUBufferMapAsyncStatus_Force32:=2147483647): 'WGPUBufferMapAsyncStatus_Force32'} +WGPUBufferMapCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_void_p]] +struct_WGPUBufferMapCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUBufferMapCallback, 16), ('userdata', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPUColor(c.Struct): + SIZE = 32 + r: float + g: float + b: float + a: float +struct_WGPUColor.register_fields([('r', ctypes.c_double, 0), ('g', ctypes.c_double, 8), ('b', ctypes.c_double, 16), ('a', ctypes.c_double, 24)]) +@c.record +class struct_WGPUColorTargetStateExpandResolveTextureDawn(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + enabled: int +struct_WGPUColorTargetStateExpandResolveTextureDawn.register_fields([('chain', WGPUChainedStruct, 0), ('enabled', WGPUBool, 16)]) +@c.record +class struct_WGPUCompilationInfoCallbackInfo(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUCompilationInfo], ctypes.c_void_p]] + userdata: ctypes.c_void_p +enum_WGPUCompilationInfoRequestStatus: dict[int, str] = {(WGPUCompilationInfoRequestStatus_Success:=1): 'WGPUCompilationInfoRequestStatus_Success', (WGPUCompilationInfoRequestStatus_InstanceDropped:=2): 'WGPUCompilationInfoRequestStatus_InstanceDropped', (WGPUCompilationInfoRequestStatus_Error:=3): 'WGPUCompilationInfoRequestStatus_Error', (WGPUCompilationInfoRequestStatus_DeviceLost:=4): 'WGPUCompilationInfoRequestStatus_DeviceLost', (WGPUCompilationInfoRequestStatus_Unknown:=5): 'WGPUCompilationInfoRequestStatus_Unknown', (WGPUCompilationInfoRequestStatus_Force32:=2147483647): 'WGPUCompilationInfoRequestStatus_Force32'} +@c.record +class struct_WGPUCompilationInfo(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + messageCount: int + messages: c.POINTER[struct_WGPUCompilationMessage] +size_t: TypeAlias = ctypes.c_uint64 +@c.record +class struct_WGPUCompilationMessage(c.Struct): + SIZE = 88 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + message: struct_WGPUStringView + type: int + lineNum: int + linePos: int + offset: int + length: int + utf16LinePos: int + utf16Offset: int + utf16Length: int +WGPUCompilationMessage: TypeAlias = struct_WGPUCompilationMessage +@c.record +class struct_WGPUStringView(c.Struct): + SIZE = 16 + data: c.POINTER[ctypes.c_char] + length: int +WGPUStringView: TypeAlias = struct_WGPUStringView +struct_WGPUStringView.register_fields([('data', c.POINTER[ctypes.c_char], 0), ('length', size_t, 8)]) +enum_WGPUCompilationMessageType: dict[int, str] = {(WGPUCompilationMessageType_Error:=1): 'WGPUCompilationMessageType_Error', (WGPUCompilationMessageType_Warning:=2): 'WGPUCompilationMessageType_Warning', (WGPUCompilationMessageType_Info:=3): 'WGPUCompilationMessageType_Info', (WGPUCompilationMessageType_Force32:=2147483647): 'WGPUCompilationMessageType_Force32'} +WGPUCompilationMessageType: TypeAlias = ctypes.c_uint32 +struct_WGPUCompilationMessage.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('message', WGPUStringView, 8), ('type', WGPUCompilationMessageType, 24), ('lineNum', uint64_t, 32), ('linePos', uint64_t, 40), ('offset', uint64_t, 48), ('length', uint64_t, 56), ('utf16LinePos', uint64_t, 64), ('utf16Offset', uint64_t, 72), ('utf16Length', uint64_t, 80)]) +struct_WGPUCompilationInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('messageCount', size_t, 8), ('messages', c.POINTER[WGPUCompilationMessage], 16)]) +WGPUCompilationInfoCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUCompilationInfo], ctypes.c_void_p]] +struct_WGPUCompilationInfoCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUCompilationInfoCallback, 16), ('userdata', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPUComputePassTimestampWrites(c.Struct): + SIZE = 16 + querySet: c.POINTER[struct_WGPUQuerySetImpl] + beginningOfPassWriteIndex: int + endOfPassWriteIndex: int +struct_WGPUComputePassTimestampWrites.register_fields([('querySet', WGPUQuerySet, 0), ('beginningOfPassWriteIndex', uint32_t, 8), ('endOfPassWriteIndex', uint32_t, 12)]) +@c.record +class struct_WGPUCopyTextureForBrowserOptions(c.Struct): + SIZE = 56 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + flipY: int + needsColorSpaceConversion: int + srcAlphaMode: int + srcTransferFunctionParameters: c.POINTER[ctypes.c_float] + conversionMatrix: c.POINTER[ctypes.c_float] + dstTransferFunctionParameters: c.POINTER[ctypes.c_float] + dstAlphaMode: int + internalUsage: int +enum_WGPUAlphaMode: dict[int, str] = {(WGPUAlphaMode_Opaque:=1): 'WGPUAlphaMode_Opaque', (WGPUAlphaMode_Premultiplied:=2): 'WGPUAlphaMode_Premultiplied', (WGPUAlphaMode_Unpremultiplied:=3): 'WGPUAlphaMode_Unpremultiplied', (WGPUAlphaMode_Force32:=2147483647): 'WGPUAlphaMode_Force32'} +WGPUAlphaMode: TypeAlias = ctypes.c_uint32 +struct_WGPUCopyTextureForBrowserOptions.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('flipY', WGPUBool, 8), ('needsColorSpaceConversion', WGPUBool, 12), ('srcAlphaMode', WGPUAlphaMode, 16), ('srcTransferFunctionParameters', c.POINTER[ctypes.c_float], 24), ('conversionMatrix', c.POINTER[ctypes.c_float], 32), ('dstTransferFunctionParameters', c.POINTER[ctypes.c_float], 40), ('dstAlphaMode', WGPUAlphaMode, 48), ('internalUsage', WGPUBool, 52)]) +@c.record +class struct_WGPUCreateComputePipelineAsyncCallbackInfo(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUComputePipelineImpl], struct_WGPUStringView, ctypes.c_void_p]] + userdata: ctypes.c_void_p +enum_WGPUCreatePipelineAsyncStatus: dict[int, str] = {(WGPUCreatePipelineAsyncStatus_Success:=1): 'WGPUCreatePipelineAsyncStatus_Success', (WGPUCreatePipelineAsyncStatus_InstanceDropped:=2): 'WGPUCreatePipelineAsyncStatus_InstanceDropped', (WGPUCreatePipelineAsyncStatus_ValidationError:=3): 'WGPUCreatePipelineAsyncStatus_ValidationError', (WGPUCreatePipelineAsyncStatus_InternalError:=4): 'WGPUCreatePipelineAsyncStatus_InternalError', (WGPUCreatePipelineAsyncStatus_DeviceLost:=5): 'WGPUCreatePipelineAsyncStatus_DeviceLost', (WGPUCreatePipelineAsyncStatus_DeviceDestroyed:=6): 'WGPUCreatePipelineAsyncStatus_DeviceDestroyed', (WGPUCreatePipelineAsyncStatus_Unknown:=7): 'WGPUCreatePipelineAsyncStatus_Unknown', (WGPUCreatePipelineAsyncStatus_Force32:=2147483647): 'WGPUCreatePipelineAsyncStatus_Force32'} +WGPUCreateComputePipelineAsyncCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUComputePipelineImpl], struct_WGPUStringView, ctypes.c_void_p]] +struct_WGPUCreateComputePipelineAsyncCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUCreateComputePipelineAsyncCallback, 16), ('userdata', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPUCreateRenderPipelineAsyncCallbackInfo(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPURenderPipelineImpl], struct_WGPUStringView, ctypes.c_void_p]] + userdata: ctypes.c_void_p +WGPUCreateRenderPipelineAsyncCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPURenderPipelineImpl], struct_WGPUStringView, ctypes.c_void_p]] +struct_WGPUCreateRenderPipelineAsyncCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUCreateRenderPipelineAsyncCallback, 16), ('userdata', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPUDawnWGSLBlocklist(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + blocklistedFeatureCount: int + blocklistedFeatures: c.POINTER[c.POINTER[ctypes.c_char]] +struct_WGPUDawnWGSLBlocklist.register_fields([('chain', WGPUChainedStruct, 0), ('blocklistedFeatureCount', size_t, 16), ('blocklistedFeatures', c.POINTER[c.POINTER[ctypes.c_char]], 24)]) +@c.record +class struct_WGPUDawnAdapterPropertiesPowerPreference(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + powerPreference: int +enum_WGPUPowerPreference: dict[int, str] = {(WGPUPowerPreference_Undefined:=0): 'WGPUPowerPreference_Undefined', (WGPUPowerPreference_LowPower:=1): 'WGPUPowerPreference_LowPower', (WGPUPowerPreference_HighPerformance:=2): 'WGPUPowerPreference_HighPerformance', (WGPUPowerPreference_Force32:=2147483647): 'WGPUPowerPreference_Force32'} +WGPUPowerPreference: TypeAlias = ctypes.c_uint32 +struct_WGPUDawnAdapterPropertiesPowerPreference.register_fields([('chain', WGPUChainedStructOut, 0), ('powerPreference', WGPUPowerPreference, 16)]) +@c.record +class struct_WGPUDawnBufferDescriptorErrorInfoFromWireClient(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + outOfMemory: int +struct_WGPUDawnBufferDescriptorErrorInfoFromWireClient.register_fields([('chain', WGPUChainedStruct, 0), ('outOfMemory', WGPUBool, 16)]) +@c.record +class struct_WGPUDawnEncoderInternalUsageDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + useInternalUsages: int +struct_WGPUDawnEncoderInternalUsageDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('useInternalUsages', WGPUBool, 16)]) +@c.record +class struct_WGPUDawnExperimentalImmediateDataLimits(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + maxImmediateDataRangeByteSize: int +struct_WGPUDawnExperimentalImmediateDataLimits.register_fields([('chain', WGPUChainedStructOut, 0), ('maxImmediateDataRangeByteSize', uint32_t, 16)]) +@c.record +class struct_WGPUDawnExperimentalSubgroupLimits(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + minSubgroupSize: int + maxSubgroupSize: int +struct_WGPUDawnExperimentalSubgroupLimits.register_fields([('chain', WGPUChainedStructOut, 0), ('minSubgroupSize', uint32_t, 16), ('maxSubgroupSize', uint32_t, 20)]) +@c.record +class struct_WGPUDawnRenderPassColorAttachmentRenderToSingleSampled(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + implicitSampleCount: int +struct_WGPUDawnRenderPassColorAttachmentRenderToSingleSampled.register_fields([('chain', WGPUChainedStruct, 0), ('implicitSampleCount', uint32_t, 16)]) +@c.record +class struct_WGPUDawnShaderModuleSPIRVOptionsDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + allowNonUniformDerivatives: int +struct_WGPUDawnShaderModuleSPIRVOptionsDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('allowNonUniformDerivatives', WGPUBool, 16)]) +@c.record +class struct_WGPUDawnTexelCopyBufferRowAlignmentLimits(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + minTexelCopyBufferRowAlignment: int +struct_WGPUDawnTexelCopyBufferRowAlignmentLimits.register_fields([('chain', WGPUChainedStructOut, 0), ('minTexelCopyBufferRowAlignment', uint32_t, 16)]) +@c.record +class struct_WGPUDawnTextureInternalUsageDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + internalUsage: int +WGPUTextureUsage: TypeAlias = ctypes.c_uint64 +struct_WGPUDawnTextureInternalUsageDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('internalUsage', WGPUTextureUsage, 16)]) +@c.record +class struct_WGPUDawnTogglesDescriptor(c.Struct): + SIZE = 48 + chain: struct_WGPUChainedStruct + enabledToggleCount: int + enabledToggles: c.POINTER[c.POINTER[ctypes.c_char]] + disabledToggleCount: int + disabledToggles: c.POINTER[c.POINTER[ctypes.c_char]] +struct_WGPUDawnTogglesDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('enabledToggleCount', size_t, 16), ('enabledToggles', c.POINTER[c.POINTER[ctypes.c_char]], 24), ('disabledToggleCount', size_t, 32), ('disabledToggles', c.POINTER[c.POINTER[ctypes.c_char]], 40)]) +@c.record +class struct_WGPUDawnWireWGSLControl(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + enableExperimental: int + enableUnsafe: int + enableTesting: int +struct_WGPUDawnWireWGSLControl.register_fields([('chain', WGPUChainedStruct, 0), ('enableExperimental', WGPUBool, 16), ('enableUnsafe', WGPUBool, 20), ('enableTesting', WGPUBool, 24)]) +@c.record +class struct_WGPUDeviceLostCallbackInfo(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [c.POINTER[c.POINTER[struct_WGPUDeviceImpl]], ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] + userdata: ctypes.c_void_p +enum_WGPUDeviceLostReason: dict[int, str] = {(WGPUDeviceLostReason_Unknown:=1): 'WGPUDeviceLostReason_Unknown', (WGPUDeviceLostReason_Destroyed:=2): 'WGPUDeviceLostReason_Destroyed', (WGPUDeviceLostReason_InstanceDropped:=3): 'WGPUDeviceLostReason_InstanceDropped', (WGPUDeviceLostReason_FailedCreation:=4): 'WGPUDeviceLostReason_FailedCreation', (WGPUDeviceLostReason_Force32:=2147483647): 'WGPUDeviceLostReason_Force32'} +WGPUDeviceLostCallbackNew: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[c.POINTER[struct_WGPUDeviceImpl]], ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] +struct_WGPUDeviceLostCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUDeviceLostCallbackNew, 16), ('userdata', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPUDrmFormatProperties(c.Struct): + SIZE = 16 + modifier: int + modifierPlaneCount: int +struct_WGPUDrmFormatProperties.register_fields([('modifier', uint64_t, 0), ('modifierPlaneCount', uint32_t, 8)]) +@c.record +class struct_WGPUExtent2D(c.Struct): + SIZE = 8 + width: int + height: int +struct_WGPUExtent2D.register_fields([('width', uint32_t, 0), ('height', uint32_t, 4)]) +@c.record +class struct_WGPUExtent3D(c.Struct): + SIZE = 12 + width: int + height: int + depthOrArrayLayers: int +struct_WGPUExtent3D.register_fields([('width', uint32_t, 0), ('height', uint32_t, 4), ('depthOrArrayLayers', uint32_t, 8)]) +@c.record +class struct_WGPUExternalTextureBindingEntry(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + externalTexture: c.POINTER[struct_WGPUExternalTextureImpl] +struct_WGPUExternalTextureBindingEntry.register_fields([('chain', WGPUChainedStruct, 0), ('externalTexture', WGPUExternalTexture, 16)]) +@c.record +class struct_WGPUExternalTextureBindingLayout(c.Struct): + SIZE = 16 + chain: struct_WGPUChainedStruct +struct_WGPUExternalTextureBindingLayout.register_fields([('chain', WGPUChainedStruct, 0)]) +@c.record +class struct_WGPUFormatCapabilities(c.Struct): + SIZE = 8 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] +struct_WGPUFormatCapabilities.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0)]) +@c.record +class struct_WGPUFuture(c.Struct): + SIZE = 8 + id: int +struct_WGPUFuture.register_fields([('id', uint64_t, 0)]) +@c.record +class struct_WGPUInstanceFeatures(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + timedWaitAnyEnable: int + timedWaitAnyMaxCount: int +struct_WGPUInstanceFeatures.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('timedWaitAnyEnable', WGPUBool, 8), ('timedWaitAnyMaxCount', size_t, 16)]) +@c.record +class struct_WGPULimits(c.Struct): + SIZE = 160 + maxTextureDimension1D: int + maxTextureDimension2D: int + maxTextureDimension3D: int + maxTextureArrayLayers: int + maxBindGroups: int + maxBindGroupsPlusVertexBuffers: int + maxBindingsPerBindGroup: int + maxDynamicUniformBuffersPerPipelineLayout: int + maxDynamicStorageBuffersPerPipelineLayout: int + maxSampledTexturesPerShaderStage: int + maxSamplersPerShaderStage: int + maxStorageBuffersPerShaderStage: int + maxStorageTexturesPerShaderStage: int + maxUniformBuffersPerShaderStage: int + maxUniformBufferBindingSize: int + maxStorageBufferBindingSize: int + minUniformBufferOffsetAlignment: int + minStorageBufferOffsetAlignment: int + maxVertexBuffers: int + maxBufferSize: int + maxVertexAttributes: int + maxVertexBufferArrayStride: int + maxInterStageShaderComponents: int + maxInterStageShaderVariables: int + maxColorAttachments: int + maxColorAttachmentBytesPerSample: int + maxComputeWorkgroupStorageSize: int + maxComputeInvocationsPerWorkgroup: int + maxComputeWorkgroupSizeX: int + maxComputeWorkgroupSizeY: int + maxComputeWorkgroupSizeZ: int + maxComputeWorkgroupsPerDimension: int + maxStorageBuffersInVertexStage: int + maxStorageTexturesInVertexStage: int + maxStorageBuffersInFragmentStage: int + maxStorageTexturesInFragmentStage: int +struct_WGPULimits.register_fields([('maxTextureDimension1D', uint32_t, 0), ('maxTextureDimension2D', uint32_t, 4), ('maxTextureDimension3D', uint32_t, 8), ('maxTextureArrayLayers', uint32_t, 12), ('maxBindGroups', uint32_t, 16), ('maxBindGroupsPlusVertexBuffers', uint32_t, 20), ('maxBindingsPerBindGroup', uint32_t, 24), ('maxDynamicUniformBuffersPerPipelineLayout', uint32_t, 28), ('maxDynamicStorageBuffersPerPipelineLayout', uint32_t, 32), ('maxSampledTexturesPerShaderStage', uint32_t, 36), ('maxSamplersPerShaderStage', uint32_t, 40), ('maxStorageBuffersPerShaderStage', uint32_t, 44), ('maxStorageTexturesPerShaderStage', uint32_t, 48), ('maxUniformBuffersPerShaderStage', uint32_t, 52), ('maxUniformBufferBindingSize', uint64_t, 56), ('maxStorageBufferBindingSize', uint64_t, 64), ('minUniformBufferOffsetAlignment', uint32_t, 72), ('minStorageBufferOffsetAlignment', uint32_t, 76), ('maxVertexBuffers', uint32_t, 80), ('maxBufferSize', uint64_t, 88), ('maxVertexAttributes', uint32_t, 96), ('maxVertexBufferArrayStride', uint32_t, 100), ('maxInterStageShaderComponents', uint32_t, 104), ('maxInterStageShaderVariables', uint32_t, 108), ('maxColorAttachments', uint32_t, 112), ('maxColorAttachmentBytesPerSample', uint32_t, 116), ('maxComputeWorkgroupStorageSize', uint32_t, 120), ('maxComputeInvocationsPerWorkgroup', uint32_t, 124), ('maxComputeWorkgroupSizeX', uint32_t, 128), ('maxComputeWorkgroupSizeY', uint32_t, 132), ('maxComputeWorkgroupSizeZ', uint32_t, 136), ('maxComputeWorkgroupsPerDimension', uint32_t, 140), ('maxStorageBuffersInVertexStage', uint32_t, 144), ('maxStorageTexturesInVertexStage', uint32_t, 148), ('maxStorageBuffersInFragmentStage', uint32_t, 152), ('maxStorageTexturesInFragmentStage', uint32_t, 156)]) +@c.record +class struct_WGPUMemoryHeapInfo(c.Struct): + SIZE = 16 + properties: int + size: int +WGPUHeapProperty: TypeAlias = ctypes.c_uint64 +struct_WGPUMemoryHeapInfo.register_fields([('properties', WGPUHeapProperty, 0), ('size', uint64_t, 8)]) +@c.record +class struct_WGPUMultisampleState(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + count: int + mask: int + alphaToCoverageEnabled: int +struct_WGPUMultisampleState.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('count', uint32_t, 8), ('mask', uint32_t, 12), ('alphaToCoverageEnabled', WGPUBool, 16)]) +@c.record +class struct_WGPUOrigin2D(c.Struct): + SIZE = 8 + x: int + y: int +struct_WGPUOrigin2D.register_fields([('x', uint32_t, 0), ('y', uint32_t, 4)]) +@c.record +class struct_WGPUOrigin3D(c.Struct): + SIZE = 12 + x: int + y: int + z: int +struct_WGPUOrigin3D.register_fields([('x', uint32_t, 0), ('y', uint32_t, 4), ('z', uint32_t, 8)]) +@c.record +class struct_WGPUPipelineLayoutStorageAttachment(c.Struct): + SIZE = 16 + offset: int + format: int +enum_WGPUTextureFormat: dict[int, str] = {(WGPUTextureFormat_Undefined:=0): 'WGPUTextureFormat_Undefined', (WGPUTextureFormat_R8Unorm:=1): 'WGPUTextureFormat_R8Unorm', (WGPUTextureFormat_R8Snorm:=2): 'WGPUTextureFormat_R8Snorm', (WGPUTextureFormat_R8Uint:=3): 'WGPUTextureFormat_R8Uint', (WGPUTextureFormat_R8Sint:=4): 'WGPUTextureFormat_R8Sint', (WGPUTextureFormat_R16Uint:=5): 'WGPUTextureFormat_R16Uint', (WGPUTextureFormat_R16Sint:=6): 'WGPUTextureFormat_R16Sint', (WGPUTextureFormat_R16Float:=7): 'WGPUTextureFormat_R16Float', (WGPUTextureFormat_RG8Unorm:=8): 'WGPUTextureFormat_RG8Unorm', (WGPUTextureFormat_RG8Snorm:=9): 'WGPUTextureFormat_RG8Snorm', (WGPUTextureFormat_RG8Uint:=10): 'WGPUTextureFormat_RG8Uint', (WGPUTextureFormat_RG8Sint:=11): 'WGPUTextureFormat_RG8Sint', (WGPUTextureFormat_R32Float:=12): 'WGPUTextureFormat_R32Float', (WGPUTextureFormat_R32Uint:=13): 'WGPUTextureFormat_R32Uint', (WGPUTextureFormat_R32Sint:=14): 'WGPUTextureFormat_R32Sint', (WGPUTextureFormat_RG16Uint:=15): 'WGPUTextureFormat_RG16Uint', (WGPUTextureFormat_RG16Sint:=16): 'WGPUTextureFormat_RG16Sint', (WGPUTextureFormat_RG16Float:=17): 'WGPUTextureFormat_RG16Float', (WGPUTextureFormat_RGBA8Unorm:=18): 'WGPUTextureFormat_RGBA8Unorm', (WGPUTextureFormat_RGBA8UnormSrgb:=19): 'WGPUTextureFormat_RGBA8UnormSrgb', (WGPUTextureFormat_RGBA8Snorm:=20): 'WGPUTextureFormat_RGBA8Snorm', (WGPUTextureFormat_RGBA8Uint:=21): 'WGPUTextureFormat_RGBA8Uint', (WGPUTextureFormat_RGBA8Sint:=22): 'WGPUTextureFormat_RGBA8Sint', (WGPUTextureFormat_BGRA8Unorm:=23): 'WGPUTextureFormat_BGRA8Unorm', (WGPUTextureFormat_BGRA8UnormSrgb:=24): 'WGPUTextureFormat_BGRA8UnormSrgb', (WGPUTextureFormat_RGB10A2Uint:=25): 'WGPUTextureFormat_RGB10A2Uint', (WGPUTextureFormat_RGB10A2Unorm:=26): 'WGPUTextureFormat_RGB10A2Unorm', (WGPUTextureFormat_RG11B10Ufloat:=27): 'WGPUTextureFormat_RG11B10Ufloat', (WGPUTextureFormat_RGB9E5Ufloat:=28): 'WGPUTextureFormat_RGB9E5Ufloat', (WGPUTextureFormat_RG32Float:=29): 'WGPUTextureFormat_RG32Float', (WGPUTextureFormat_RG32Uint:=30): 'WGPUTextureFormat_RG32Uint', (WGPUTextureFormat_RG32Sint:=31): 'WGPUTextureFormat_RG32Sint', (WGPUTextureFormat_RGBA16Uint:=32): 'WGPUTextureFormat_RGBA16Uint', (WGPUTextureFormat_RGBA16Sint:=33): 'WGPUTextureFormat_RGBA16Sint', (WGPUTextureFormat_RGBA16Float:=34): 'WGPUTextureFormat_RGBA16Float', (WGPUTextureFormat_RGBA32Float:=35): 'WGPUTextureFormat_RGBA32Float', (WGPUTextureFormat_RGBA32Uint:=36): 'WGPUTextureFormat_RGBA32Uint', (WGPUTextureFormat_RGBA32Sint:=37): 'WGPUTextureFormat_RGBA32Sint', (WGPUTextureFormat_Stencil8:=38): 'WGPUTextureFormat_Stencil8', (WGPUTextureFormat_Depth16Unorm:=39): 'WGPUTextureFormat_Depth16Unorm', (WGPUTextureFormat_Depth24Plus:=40): 'WGPUTextureFormat_Depth24Plus', (WGPUTextureFormat_Depth24PlusStencil8:=41): 'WGPUTextureFormat_Depth24PlusStencil8', (WGPUTextureFormat_Depth32Float:=42): 'WGPUTextureFormat_Depth32Float', (WGPUTextureFormat_Depth32FloatStencil8:=43): 'WGPUTextureFormat_Depth32FloatStencil8', (WGPUTextureFormat_BC1RGBAUnorm:=44): 'WGPUTextureFormat_BC1RGBAUnorm', (WGPUTextureFormat_BC1RGBAUnormSrgb:=45): 'WGPUTextureFormat_BC1RGBAUnormSrgb', (WGPUTextureFormat_BC2RGBAUnorm:=46): 'WGPUTextureFormat_BC2RGBAUnorm', (WGPUTextureFormat_BC2RGBAUnormSrgb:=47): 'WGPUTextureFormat_BC2RGBAUnormSrgb', (WGPUTextureFormat_BC3RGBAUnorm:=48): 'WGPUTextureFormat_BC3RGBAUnorm', (WGPUTextureFormat_BC3RGBAUnormSrgb:=49): 'WGPUTextureFormat_BC3RGBAUnormSrgb', (WGPUTextureFormat_BC4RUnorm:=50): 'WGPUTextureFormat_BC4RUnorm', (WGPUTextureFormat_BC4RSnorm:=51): 'WGPUTextureFormat_BC4RSnorm', (WGPUTextureFormat_BC5RGUnorm:=52): 'WGPUTextureFormat_BC5RGUnorm', (WGPUTextureFormat_BC5RGSnorm:=53): 'WGPUTextureFormat_BC5RGSnorm', (WGPUTextureFormat_BC6HRGBUfloat:=54): 'WGPUTextureFormat_BC6HRGBUfloat', (WGPUTextureFormat_BC6HRGBFloat:=55): 'WGPUTextureFormat_BC6HRGBFloat', (WGPUTextureFormat_BC7RGBAUnorm:=56): 'WGPUTextureFormat_BC7RGBAUnorm', (WGPUTextureFormat_BC7RGBAUnormSrgb:=57): 'WGPUTextureFormat_BC7RGBAUnormSrgb', (WGPUTextureFormat_ETC2RGB8Unorm:=58): 'WGPUTextureFormat_ETC2RGB8Unorm', (WGPUTextureFormat_ETC2RGB8UnormSrgb:=59): 'WGPUTextureFormat_ETC2RGB8UnormSrgb', (WGPUTextureFormat_ETC2RGB8A1Unorm:=60): 'WGPUTextureFormat_ETC2RGB8A1Unorm', (WGPUTextureFormat_ETC2RGB8A1UnormSrgb:=61): 'WGPUTextureFormat_ETC2RGB8A1UnormSrgb', (WGPUTextureFormat_ETC2RGBA8Unorm:=62): 'WGPUTextureFormat_ETC2RGBA8Unorm', (WGPUTextureFormat_ETC2RGBA8UnormSrgb:=63): 'WGPUTextureFormat_ETC2RGBA8UnormSrgb', (WGPUTextureFormat_EACR11Unorm:=64): 'WGPUTextureFormat_EACR11Unorm', (WGPUTextureFormat_EACR11Snorm:=65): 'WGPUTextureFormat_EACR11Snorm', (WGPUTextureFormat_EACRG11Unorm:=66): 'WGPUTextureFormat_EACRG11Unorm', (WGPUTextureFormat_EACRG11Snorm:=67): 'WGPUTextureFormat_EACRG11Snorm', (WGPUTextureFormat_ASTC4x4Unorm:=68): 'WGPUTextureFormat_ASTC4x4Unorm', (WGPUTextureFormat_ASTC4x4UnormSrgb:=69): 'WGPUTextureFormat_ASTC4x4UnormSrgb', (WGPUTextureFormat_ASTC5x4Unorm:=70): 'WGPUTextureFormat_ASTC5x4Unorm', (WGPUTextureFormat_ASTC5x4UnormSrgb:=71): 'WGPUTextureFormat_ASTC5x4UnormSrgb', (WGPUTextureFormat_ASTC5x5Unorm:=72): 'WGPUTextureFormat_ASTC5x5Unorm', (WGPUTextureFormat_ASTC5x5UnormSrgb:=73): 'WGPUTextureFormat_ASTC5x5UnormSrgb', (WGPUTextureFormat_ASTC6x5Unorm:=74): 'WGPUTextureFormat_ASTC6x5Unorm', (WGPUTextureFormat_ASTC6x5UnormSrgb:=75): 'WGPUTextureFormat_ASTC6x5UnormSrgb', (WGPUTextureFormat_ASTC6x6Unorm:=76): 'WGPUTextureFormat_ASTC6x6Unorm', (WGPUTextureFormat_ASTC6x6UnormSrgb:=77): 'WGPUTextureFormat_ASTC6x6UnormSrgb', (WGPUTextureFormat_ASTC8x5Unorm:=78): 'WGPUTextureFormat_ASTC8x5Unorm', (WGPUTextureFormat_ASTC8x5UnormSrgb:=79): 'WGPUTextureFormat_ASTC8x5UnormSrgb', (WGPUTextureFormat_ASTC8x6Unorm:=80): 'WGPUTextureFormat_ASTC8x6Unorm', (WGPUTextureFormat_ASTC8x6UnormSrgb:=81): 'WGPUTextureFormat_ASTC8x6UnormSrgb', (WGPUTextureFormat_ASTC8x8Unorm:=82): 'WGPUTextureFormat_ASTC8x8Unorm', (WGPUTextureFormat_ASTC8x8UnormSrgb:=83): 'WGPUTextureFormat_ASTC8x8UnormSrgb', (WGPUTextureFormat_ASTC10x5Unorm:=84): 'WGPUTextureFormat_ASTC10x5Unorm', (WGPUTextureFormat_ASTC10x5UnormSrgb:=85): 'WGPUTextureFormat_ASTC10x5UnormSrgb', (WGPUTextureFormat_ASTC10x6Unorm:=86): 'WGPUTextureFormat_ASTC10x6Unorm', (WGPUTextureFormat_ASTC10x6UnormSrgb:=87): 'WGPUTextureFormat_ASTC10x6UnormSrgb', (WGPUTextureFormat_ASTC10x8Unorm:=88): 'WGPUTextureFormat_ASTC10x8Unorm', (WGPUTextureFormat_ASTC10x8UnormSrgb:=89): 'WGPUTextureFormat_ASTC10x8UnormSrgb', (WGPUTextureFormat_ASTC10x10Unorm:=90): 'WGPUTextureFormat_ASTC10x10Unorm', (WGPUTextureFormat_ASTC10x10UnormSrgb:=91): 'WGPUTextureFormat_ASTC10x10UnormSrgb', (WGPUTextureFormat_ASTC12x10Unorm:=92): 'WGPUTextureFormat_ASTC12x10Unorm', (WGPUTextureFormat_ASTC12x10UnormSrgb:=93): 'WGPUTextureFormat_ASTC12x10UnormSrgb', (WGPUTextureFormat_ASTC12x12Unorm:=94): 'WGPUTextureFormat_ASTC12x12Unorm', (WGPUTextureFormat_ASTC12x12UnormSrgb:=95): 'WGPUTextureFormat_ASTC12x12UnormSrgb', (WGPUTextureFormat_R16Unorm:=327680): 'WGPUTextureFormat_R16Unorm', (WGPUTextureFormat_RG16Unorm:=327681): 'WGPUTextureFormat_RG16Unorm', (WGPUTextureFormat_RGBA16Unorm:=327682): 'WGPUTextureFormat_RGBA16Unorm', (WGPUTextureFormat_R16Snorm:=327683): 'WGPUTextureFormat_R16Snorm', (WGPUTextureFormat_RG16Snorm:=327684): 'WGPUTextureFormat_RG16Snorm', (WGPUTextureFormat_RGBA16Snorm:=327685): 'WGPUTextureFormat_RGBA16Snorm', (WGPUTextureFormat_R8BG8Biplanar420Unorm:=327686): 'WGPUTextureFormat_R8BG8Biplanar420Unorm', (WGPUTextureFormat_R10X6BG10X6Biplanar420Unorm:=327687): 'WGPUTextureFormat_R10X6BG10X6Biplanar420Unorm', (WGPUTextureFormat_R8BG8A8Triplanar420Unorm:=327688): 'WGPUTextureFormat_R8BG8A8Triplanar420Unorm', (WGPUTextureFormat_R8BG8Biplanar422Unorm:=327689): 'WGPUTextureFormat_R8BG8Biplanar422Unorm', (WGPUTextureFormat_R8BG8Biplanar444Unorm:=327690): 'WGPUTextureFormat_R8BG8Biplanar444Unorm', (WGPUTextureFormat_R10X6BG10X6Biplanar422Unorm:=327691): 'WGPUTextureFormat_R10X6BG10X6Biplanar422Unorm', (WGPUTextureFormat_R10X6BG10X6Biplanar444Unorm:=327692): 'WGPUTextureFormat_R10X6BG10X6Biplanar444Unorm', (WGPUTextureFormat_External:=327693): 'WGPUTextureFormat_External', (WGPUTextureFormat_Force32:=2147483647): 'WGPUTextureFormat_Force32'} +WGPUTextureFormat: TypeAlias = ctypes.c_uint32 +struct_WGPUPipelineLayoutStorageAttachment.register_fields([('offset', uint64_t, 0), ('format', WGPUTextureFormat, 8)]) +@c.record +class struct_WGPUPopErrorScopeCallbackInfo(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] + oldCallback: c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] + userdata: ctypes.c_void_p +enum_WGPUPopErrorScopeStatus: dict[int, str] = {(WGPUPopErrorScopeStatus_Success:=1): 'WGPUPopErrorScopeStatus_Success', (WGPUPopErrorScopeStatus_InstanceDropped:=2): 'WGPUPopErrorScopeStatus_InstanceDropped', (WGPUPopErrorScopeStatus_Force32:=2147483647): 'WGPUPopErrorScopeStatus_Force32'} +enum_WGPUErrorType: dict[int, str] = {(WGPUErrorType_NoError:=1): 'WGPUErrorType_NoError', (WGPUErrorType_Validation:=2): 'WGPUErrorType_Validation', (WGPUErrorType_OutOfMemory:=3): 'WGPUErrorType_OutOfMemory', (WGPUErrorType_Internal:=4): 'WGPUErrorType_Internal', (WGPUErrorType_Unknown:=5): 'WGPUErrorType_Unknown', (WGPUErrorType_DeviceLost:=6): 'WGPUErrorType_DeviceLost', (WGPUErrorType_Force32:=2147483647): 'WGPUErrorType_Force32'} +WGPUPopErrorScopeCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] +WGPUErrorCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] +struct_WGPUPopErrorScopeCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUPopErrorScopeCallback, 16), ('oldCallback', WGPUErrorCallback, 24), ('userdata', ctypes.c_void_p, 32)]) +@c.record +class struct_WGPUPrimitiveState(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + topology: int + stripIndexFormat: int + frontFace: int + cullMode: int + unclippedDepth: int +enum_WGPUPrimitiveTopology: dict[int, str] = {(WGPUPrimitiveTopology_Undefined:=0): 'WGPUPrimitiveTopology_Undefined', (WGPUPrimitiveTopology_PointList:=1): 'WGPUPrimitiveTopology_PointList', (WGPUPrimitiveTopology_LineList:=2): 'WGPUPrimitiveTopology_LineList', (WGPUPrimitiveTopology_LineStrip:=3): 'WGPUPrimitiveTopology_LineStrip', (WGPUPrimitiveTopology_TriangleList:=4): 'WGPUPrimitiveTopology_TriangleList', (WGPUPrimitiveTopology_TriangleStrip:=5): 'WGPUPrimitiveTopology_TriangleStrip', (WGPUPrimitiveTopology_Force32:=2147483647): 'WGPUPrimitiveTopology_Force32'} +WGPUPrimitiveTopology: TypeAlias = ctypes.c_uint32 +enum_WGPUIndexFormat: dict[int, str] = {(WGPUIndexFormat_Undefined:=0): 'WGPUIndexFormat_Undefined', (WGPUIndexFormat_Uint16:=1): 'WGPUIndexFormat_Uint16', (WGPUIndexFormat_Uint32:=2): 'WGPUIndexFormat_Uint32', (WGPUIndexFormat_Force32:=2147483647): 'WGPUIndexFormat_Force32'} +WGPUIndexFormat: TypeAlias = ctypes.c_uint32 +enum_WGPUFrontFace: dict[int, str] = {(WGPUFrontFace_Undefined:=0): 'WGPUFrontFace_Undefined', (WGPUFrontFace_CCW:=1): 'WGPUFrontFace_CCW', (WGPUFrontFace_CW:=2): 'WGPUFrontFace_CW', (WGPUFrontFace_Force32:=2147483647): 'WGPUFrontFace_Force32'} +WGPUFrontFace: TypeAlias = ctypes.c_uint32 +enum_WGPUCullMode: dict[int, str] = {(WGPUCullMode_Undefined:=0): 'WGPUCullMode_Undefined', (WGPUCullMode_None:=1): 'WGPUCullMode_None', (WGPUCullMode_Front:=2): 'WGPUCullMode_Front', (WGPUCullMode_Back:=3): 'WGPUCullMode_Back', (WGPUCullMode_Force32:=2147483647): 'WGPUCullMode_Force32'} +WGPUCullMode: TypeAlias = ctypes.c_uint32 +struct_WGPUPrimitiveState.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('topology', WGPUPrimitiveTopology, 8), ('stripIndexFormat', WGPUIndexFormat, 12), ('frontFace', WGPUFrontFace, 16), ('cullMode', WGPUCullMode, 20), ('unclippedDepth', WGPUBool, 24)]) +@c.record +class struct_WGPUQueueWorkDoneCallbackInfo(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_void_p]] + userdata: ctypes.c_void_p +enum_WGPUQueueWorkDoneStatus: dict[int, str] = {(WGPUQueueWorkDoneStatus_Success:=1): 'WGPUQueueWorkDoneStatus_Success', (WGPUQueueWorkDoneStatus_InstanceDropped:=2): 'WGPUQueueWorkDoneStatus_InstanceDropped', (WGPUQueueWorkDoneStatus_Error:=3): 'WGPUQueueWorkDoneStatus_Error', (WGPUQueueWorkDoneStatus_Unknown:=4): 'WGPUQueueWorkDoneStatus_Unknown', (WGPUQueueWorkDoneStatus_DeviceLost:=5): 'WGPUQueueWorkDoneStatus_DeviceLost', (WGPUQueueWorkDoneStatus_Force32:=2147483647): 'WGPUQueueWorkDoneStatus_Force32'} +WGPUQueueWorkDoneCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_void_p]] +struct_WGPUQueueWorkDoneCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUQueueWorkDoneCallback, 16), ('userdata', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPURenderPassDepthStencilAttachment(c.Struct): + SIZE = 40 + view: c.POINTER[struct_WGPUTextureViewImpl] + depthLoadOp: int + depthStoreOp: int + depthClearValue: float + depthReadOnly: int + stencilLoadOp: int + stencilStoreOp: int + stencilClearValue: int + stencilReadOnly: int +enum_WGPULoadOp: dict[int, str] = {(WGPULoadOp_Undefined:=0): 'WGPULoadOp_Undefined', (WGPULoadOp_Load:=1): 'WGPULoadOp_Load', (WGPULoadOp_Clear:=2): 'WGPULoadOp_Clear', (WGPULoadOp_ExpandResolveTexture:=327683): 'WGPULoadOp_ExpandResolveTexture', (WGPULoadOp_Force32:=2147483647): 'WGPULoadOp_Force32'} +WGPULoadOp: TypeAlias = ctypes.c_uint32 +enum_WGPUStoreOp: dict[int, str] = {(WGPUStoreOp_Undefined:=0): 'WGPUStoreOp_Undefined', (WGPUStoreOp_Store:=1): 'WGPUStoreOp_Store', (WGPUStoreOp_Discard:=2): 'WGPUStoreOp_Discard', (WGPUStoreOp_Force32:=2147483647): 'WGPUStoreOp_Force32'} +WGPUStoreOp: TypeAlias = ctypes.c_uint32 +struct_WGPURenderPassDepthStencilAttachment.register_fields([('view', WGPUTextureView, 0), ('depthLoadOp', WGPULoadOp, 8), ('depthStoreOp', WGPUStoreOp, 12), ('depthClearValue', ctypes.c_float, 16), ('depthReadOnly', WGPUBool, 20), ('stencilLoadOp', WGPULoadOp, 24), ('stencilStoreOp', WGPUStoreOp, 28), ('stencilClearValue', uint32_t, 32), ('stencilReadOnly', WGPUBool, 36)]) +@c.record +class struct_WGPURenderPassDescriptorExpandResolveRect(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + x: int + y: int + width: int + height: int +struct_WGPURenderPassDescriptorExpandResolveRect.register_fields([('chain', WGPUChainedStruct, 0), ('x', uint32_t, 16), ('y', uint32_t, 20), ('width', uint32_t, 24), ('height', uint32_t, 28)]) +@c.record +class struct_WGPURenderPassMaxDrawCount(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + maxDrawCount: int +struct_WGPURenderPassMaxDrawCount.register_fields([('chain', WGPUChainedStruct, 0), ('maxDrawCount', uint64_t, 16)]) +@c.record +class struct_WGPURenderPassTimestampWrites(c.Struct): + SIZE = 16 + querySet: c.POINTER[struct_WGPUQuerySetImpl] + beginningOfPassWriteIndex: int + endOfPassWriteIndex: int +struct_WGPURenderPassTimestampWrites.register_fields([('querySet', WGPUQuerySet, 0), ('beginningOfPassWriteIndex', uint32_t, 8), ('endOfPassWriteIndex', uint32_t, 12)]) +@c.record +class struct_WGPURequestAdapterCallbackInfo(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUAdapterImpl], struct_WGPUStringView, ctypes.c_void_p]] + userdata: ctypes.c_void_p +enum_WGPURequestAdapterStatus: dict[int, str] = {(WGPURequestAdapterStatus_Success:=1): 'WGPURequestAdapterStatus_Success', (WGPURequestAdapterStatus_InstanceDropped:=2): 'WGPURequestAdapterStatus_InstanceDropped', (WGPURequestAdapterStatus_Unavailable:=3): 'WGPURequestAdapterStatus_Unavailable', (WGPURequestAdapterStatus_Error:=4): 'WGPURequestAdapterStatus_Error', (WGPURequestAdapterStatus_Unknown:=5): 'WGPURequestAdapterStatus_Unknown', (WGPURequestAdapterStatus_Force32:=2147483647): 'WGPURequestAdapterStatus_Force32'} +WGPURequestAdapterCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUAdapterImpl], struct_WGPUStringView, ctypes.c_void_p]] +struct_WGPURequestAdapterCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPURequestAdapterCallback, 16), ('userdata', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPURequestAdapterOptions(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + compatibleSurface: c.POINTER[struct_WGPUSurfaceImpl] + featureLevel: int + powerPreference: int + backendType: int + forceFallbackAdapter: int + compatibilityMode: int +enum_WGPUFeatureLevel: dict[int, str] = {(WGPUFeatureLevel_Undefined:=0): 'WGPUFeatureLevel_Undefined', (WGPUFeatureLevel_Compatibility:=1): 'WGPUFeatureLevel_Compatibility', (WGPUFeatureLevel_Core:=2): 'WGPUFeatureLevel_Core', (WGPUFeatureLevel_Force32:=2147483647): 'WGPUFeatureLevel_Force32'} +WGPUFeatureLevel: TypeAlias = ctypes.c_uint32 +enum_WGPUBackendType: dict[int, str] = {(WGPUBackendType_Undefined:=0): 'WGPUBackendType_Undefined', (WGPUBackendType_Null:=1): 'WGPUBackendType_Null', (WGPUBackendType_WebGPU:=2): 'WGPUBackendType_WebGPU', (WGPUBackendType_D3D11:=3): 'WGPUBackendType_D3D11', (WGPUBackendType_D3D12:=4): 'WGPUBackendType_D3D12', (WGPUBackendType_Metal:=5): 'WGPUBackendType_Metal', (WGPUBackendType_Vulkan:=6): 'WGPUBackendType_Vulkan', (WGPUBackendType_OpenGL:=7): 'WGPUBackendType_OpenGL', (WGPUBackendType_OpenGLES:=8): 'WGPUBackendType_OpenGLES', (WGPUBackendType_Force32:=2147483647): 'WGPUBackendType_Force32'} +WGPUBackendType: TypeAlias = ctypes.c_uint32 +struct_WGPURequestAdapterOptions.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('compatibleSurface', WGPUSurface, 8), ('featureLevel', WGPUFeatureLevel, 16), ('powerPreference', WGPUPowerPreference, 20), ('backendType', WGPUBackendType, 24), ('forceFallbackAdapter', WGPUBool, 28), ('compatibilityMode', WGPUBool, 32)]) +@c.record +class struct_WGPURequestDeviceCallbackInfo(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUDeviceImpl], struct_WGPUStringView, ctypes.c_void_p]] + userdata: ctypes.c_void_p +enum_WGPURequestDeviceStatus: dict[int, str] = {(WGPURequestDeviceStatus_Success:=1): 'WGPURequestDeviceStatus_Success', (WGPURequestDeviceStatus_InstanceDropped:=2): 'WGPURequestDeviceStatus_InstanceDropped', (WGPURequestDeviceStatus_Error:=3): 'WGPURequestDeviceStatus_Error', (WGPURequestDeviceStatus_Unknown:=4): 'WGPURequestDeviceStatus_Unknown', (WGPURequestDeviceStatus_Force32:=2147483647): 'WGPURequestDeviceStatus_Force32'} +WGPURequestDeviceCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUDeviceImpl], struct_WGPUStringView, ctypes.c_void_p]] +struct_WGPURequestDeviceCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPURequestDeviceCallback, 16), ('userdata', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPUSamplerBindingLayout(c.Struct): + SIZE = 16 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + type: int +enum_WGPUSamplerBindingType: dict[int, str] = {(WGPUSamplerBindingType_BindingNotUsed:=0): 'WGPUSamplerBindingType_BindingNotUsed', (WGPUSamplerBindingType_Filtering:=1): 'WGPUSamplerBindingType_Filtering', (WGPUSamplerBindingType_NonFiltering:=2): 'WGPUSamplerBindingType_NonFiltering', (WGPUSamplerBindingType_Comparison:=3): 'WGPUSamplerBindingType_Comparison', (WGPUSamplerBindingType_Force32:=2147483647): 'WGPUSamplerBindingType_Force32'} +WGPUSamplerBindingType: TypeAlias = ctypes.c_uint32 +struct_WGPUSamplerBindingLayout.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('type', WGPUSamplerBindingType, 8)]) +@c.record +class struct_WGPUShaderModuleCompilationOptions(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + strictMath: int +struct_WGPUShaderModuleCompilationOptions.register_fields([('chain', WGPUChainedStruct, 0), ('strictMath', WGPUBool, 16)]) +@c.record +class struct_WGPUShaderSourceSPIRV(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + codeSize: int + code: c.POINTER[ctypes.c_uint32] +struct_WGPUShaderSourceSPIRV.register_fields([('chain', WGPUChainedStruct, 0), ('codeSize', uint32_t, 16), ('code', c.POINTER[uint32_t], 24)]) +@c.record +class struct_WGPUSharedBufferMemoryBeginAccessDescriptor(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + initialized: int + fenceCount: int + fences: c.POINTER[c.POINTER[struct_WGPUSharedFenceImpl]] + signaledValues: c.POINTER[ctypes.c_uint64] +struct_WGPUSharedBufferMemoryBeginAccessDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('initialized', WGPUBool, 8), ('fenceCount', size_t, 16), ('fences', c.POINTER[WGPUSharedFence], 24), ('signaledValues', c.POINTER[uint64_t], 32)]) +@c.record +class struct_WGPUSharedBufferMemoryEndAccessState(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] + initialized: int + fenceCount: int + fences: c.POINTER[c.POINTER[struct_WGPUSharedFenceImpl]] + signaledValues: c.POINTER[ctypes.c_uint64] +struct_WGPUSharedBufferMemoryEndAccessState.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0), ('initialized', WGPUBool, 8), ('fenceCount', size_t, 16), ('fences', c.POINTER[WGPUSharedFence], 24), ('signaledValues', c.POINTER[uint64_t], 32)]) +@c.record +class struct_WGPUSharedBufferMemoryProperties(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] + usage: int + size: int +WGPUBufferUsage: TypeAlias = ctypes.c_uint64 +struct_WGPUSharedBufferMemoryProperties.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0), ('usage', WGPUBufferUsage, 8), ('size', uint64_t, 16)]) +@c.record +class struct_WGPUSharedFenceDXGISharedHandleDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + handle: ctypes.c_void_p +struct_WGPUSharedFenceDXGISharedHandleDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('handle', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSharedFenceDXGISharedHandleExportInfo(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + handle: ctypes.c_void_p +struct_WGPUSharedFenceDXGISharedHandleExportInfo.register_fields([('chain', WGPUChainedStructOut, 0), ('handle', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSharedFenceMTLSharedEventDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + sharedEvent: ctypes.c_void_p +struct_WGPUSharedFenceMTLSharedEventDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('sharedEvent', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSharedFenceMTLSharedEventExportInfo(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + sharedEvent: ctypes.c_void_p +struct_WGPUSharedFenceMTLSharedEventExportInfo.register_fields([('chain', WGPUChainedStructOut, 0), ('sharedEvent', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSharedFenceExportInfo(c.Struct): + SIZE = 16 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] + type: int +enum_WGPUSharedFenceType: dict[int, str] = {(WGPUSharedFenceType_VkSemaphoreOpaqueFD:=1): 'WGPUSharedFenceType_VkSemaphoreOpaqueFD', (WGPUSharedFenceType_SyncFD:=2): 'WGPUSharedFenceType_SyncFD', (WGPUSharedFenceType_VkSemaphoreZirconHandle:=3): 'WGPUSharedFenceType_VkSemaphoreZirconHandle', (WGPUSharedFenceType_DXGISharedHandle:=4): 'WGPUSharedFenceType_DXGISharedHandle', (WGPUSharedFenceType_MTLSharedEvent:=5): 'WGPUSharedFenceType_MTLSharedEvent', (WGPUSharedFenceType_Force32:=2147483647): 'WGPUSharedFenceType_Force32'} +WGPUSharedFenceType: TypeAlias = ctypes.c_uint32 +struct_WGPUSharedFenceExportInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0), ('type', WGPUSharedFenceType, 8)]) +@c.record +class struct_WGPUSharedFenceSyncFDDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + handle: int +struct_WGPUSharedFenceSyncFDDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('handle', ctypes.c_int32, 16)]) +@c.record +class struct_WGPUSharedFenceSyncFDExportInfo(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + handle: int +struct_WGPUSharedFenceSyncFDExportInfo.register_fields([('chain', WGPUChainedStructOut, 0), ('handle', ctypes.c_int32, 16)]) +@c.record +class struct_WGPUSharedFenceVkSemaphoreOpaqueFDDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + handle: int +struct_WGPUSharedFenceVkSemaphoreOpaqueFDDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('handle', ctypes.c_int32, 16)]) +@c.record +class struct_WGPUSharedFenceVkSemaphoreOpaqueFDExportInfo(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + handle: int +struct_WGPUSharedFenceVkSemaphoreOpaqueFDExportInfo.register_fields([('chain', WGPUChainedStructOut, 0), ('handle', ctypes.c_int32, 16)]) +@c.record +class struct_WGPUSharedFenceVkSemaphoreZirconHandleDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + handle: int +struct_WGPUSharedFenceVkSemaphoreZirconHandleDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('handle', uint32_t, 16)]) +@c.record +class struct_WGPUSharedFenceVkSemaphoreZirconHandleExportInfo(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + handle: int +struct_WGPUSharedFenceVkSemaphoreZirconHandleExportInfo.register_fields([('chain', WGPUChainedStructOut, 0), ('handle', uint32_t, 16)]) +@c.record +class struct_WGPUSharedTextureMemoryD3DSwapchainBeginState(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + isSwapchain: int +struct_WGPUSharedTextureMemoryD3DSwapchainBeginState.register_fields([('chain', WGPUChainedStruct, 0), ('isSwapchain', WGPUBool, 16)]) +@c.record +class struct_WGPUSharedTextureMemoryDXGISharedHandleDescriptor(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + handle: ctypes.c_void_p + useKeyedMutex: int +struct_WGPUSharedTextureMemoryDXGISharedHandleDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('handle', ctypes.c_void_p, 16), ('useKeyedMutex', WGPUBool, 24)]) +@c.record +class struct_WGPUSharedTextureMemoryEGLImageDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + image: ctypes.c_void_p +struct_WGPUSharedTextureMemoryEGLImageDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('image', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSharedTextureMemoryIOSurfaceDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + ioSurface: ctypes.c_void_p +struct_WGPUSharedTextureMemoryIOSurfaceDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('ioSurface', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSharedTextureMemoryAHardwareBufferDescriptor(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + handle: ctypes.c_void_p + useExternalFormat: int +struct_WGPUSharedTextureMemoryAHardwareBufferDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('handle', ctypes.c_void_p, 16), ('useExternalFormat', WGPUBool, 24)]) +@c.record +class struct_WGPUSharedTextureMemoryBeginAccessDescriptor(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + concurrentRead: int + initialized: int + fenceCount: int + fences: c.POINTER[c.POINTER[struct_WGPUSharedFenceImpl]] + signaledValues: c.POINTER[ctypes.c_uint64] +struct_WGPUSharedTextureMemoryBeginAccessDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('concurrentRead', WGPUBool, 8), ('initialized', WGPUBool, 12), ('fenceCount', size_t, 16), ('fences', c.POINTER[WGPUSharedFence], 24), ('signaledValues', c.POINTER[uint64_t], 32)]) +@c.record +class struct_WGPUSharedTextureMemoryDmaBufPlane(c.Struct): + SIZE = 24 + fd: int + offset: int + stride: int +struct_WGPUSharedTextureMemoryDmaBufPlane.register_fields([('fd', ctypes.c_int32, 0), ('offset', uint64_t, 8), ('stride', uint32_t, 16)]) +@c.record +class struct_WGPUSharedTextureMemoryEndAccessState(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] + initialized: int + fenceCount: int + fences: c.POINTER[c.POINTER[struct_WGPUSharedFenceImpl]] + signaledValues: c.POINTER[ctypes.c_uint64] +struct_WGPUSharedTextureMemoryEndAccessState.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0), ('initialized', WGPUBool, 8), ('fenceCount', size_t, 16), ('fences', c.POINTER[WGPUSharedFence], 24), ('signaledValues', c.POINTER[uint64_t], 32)]) +@c.record +class struct_WGPUSharedTextureMemoryOpaqueFDDescriptor(c.Struct): + SIZE = 48 + chain: struct_WGPUChainedStruct + vkImageCreateInfo: ctypes.c_void_p + memoryFD: int + memoryTypeIndex: int + allocationSize: int + dedicatedAllocation: int +struct_WGPUSharedTextureMemoryOpaqueFDDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('vkImageCreateInfo', ctypes.c_void_p, 16), ('memoryFD', ctypes.c_int32, 24), ('memoryTypeIndex', uint32_t, 28), ('allocationSize', uint64_t, 32), ('dedicatedAllocation', WGPUBool, 40)]) +@c.record +class struct_WGPUSharedTextureMemoryVkDedicatedAllocationDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + dedicatedAllocation: int +struct_WGPUSharedTextureMemoryVkDedicatedAllocationDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('dedicatedAllocation', WGPUBool, 16)]) +@c.record +class struct_WGPUSharedTextureMemoryVkImageLayoutBeginState(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + oldLayout: int + newLayout: int +int32_t: TypeAlias = ctypes.c_int32 +struct_WGPUSharedTextureMemoryVkImageLayoutBeginState.register_fields([('chain', WGPUChainedStruct, 0), ('oldLayout', int32_t, 16), ('newLayout', int32_t, 20)]) +@c.record +class struct_WGPUSharedTextureMemoryVkImageLayoutEndState(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStructOut + oldLayout: int + newLayout: int +struct_WGPUSharedTextureMemoryVkImageLayoutEndState.register_fields([('chain', WGPUChainedStructOut, 0), ('oldLayout', int32_t, 16), ('newLayout', int32_t, 20)]) +@c.record +class struct_WGPUSharedTextureMemoryZirconHandleDescriptor(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + memoryFD: int + allocationSize: int +struct_WGPUSharedTextureMemoryZirconHandleDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('memoryFD', uint32_t, 16), ('allocationSize', uint64_t, 24)]) +@c.record +class struct_WGPUStaticSamplerBindingLayout(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + sampler: c.POINTER[struct_WGPUSamplerImpl] + sampledTextureBinding: int +struct_WGPUStaticSamplerBindingLayout.register_fields([('chain', WGPUChainedStruct, 0), ('sampler', WGPUSampler, 16), ('sampledTextureBinding', uint32_t, 24)]) +@c.record +class struct_WGPUStencilFaceState(c.Struct): + SIZE = 16 + compare: int + failOp: int + depthFailOp: int + passOp: int +enum_WGPUCompareFunction: dict[int, str] = {(WGPUCompareFunction_Undefined:=0): 'WGPUCompareFunction_Undefined', (WGPUCompareFunction_Never:=1): 'WGPUCompareFunction_Never', (WGPUCompareFunction_Less:=2): 'WGPUCompareFunction_Less', (WGPUCompareFunction_Equal:=3): 'WGPUCompareFunction_Equal', (WGPUCompareFunction_LessEqual:=4): 'WGPUCompareFunction_LessEqual', (WGPUCompareFunction_Greater:=5): 'WGPUCompareFunction_Greater', (WGPUCompareFunction_NotEqual:=6): 'WGPUCompareFunction_NotEqual', (WGPUCompareFunction_GreaterEqual:=7): 'WGPUCompareFunction_GreaterEqual', (WGPUCompareFunction_Always:=8): 'WGPUCompareFunction_Always', (WGPUCompareFunction_Force32:=2147483647): 'WGPUCompareFunction_Force32'} +WGPUCompareFunction: TypeAlias = ctypes.c_uint32 +enum_WGPUStencilOperation: dict[int, str] = {(WGPUStencilOperation_Undefined:=0): 'WGPUStencilOperation_Undefined', (WGPUStencilOperation_Keep:=1): 'WGPUStencilOperation_Keep', (WGPUStencilOperation_Zero:=2): 'WGPUStencilOperation_Zero', (WGPUStencilOperation_Replace:=3): 'WGPUStencilOperation_Replace', (WGPUStencilOperation_Invert:=4): 'WGPUStencilOperation_Invert', (WGPUStencilOperation_IncrementClamp:=5): 'WGPUStencilOperation_IncrementClamp', (WGPUStencilOperation_DecrementClamp:=6): 'WGPUStencilOperation_DecrementClamp', (WGPUStencilOperation_IncrementWrap:=7): 'WGPUStencilOperation_IncrementWrap', (WGPUStencilOperation_DecrementWrap:=8): 'WGPUStencilOperation_DecrementWrap', (WGPUStencilOperation_Force32:=2147483647): 'WGPUStencilOperation_Force32'} +WGPUStencilOperation: TypeAlias = ctypes.c_uint32 +struct_WGPUStencilFaceState.register_fields([('compare', WGPUCompareFunction, 0), ('failOp', WGPUStencilOperation, 4), ('depthFailOp', WGPUStencilOperation, 8), ('passOp', WGPUStencilOperation, 12)]) +@c.record +class struct_WGPUStorageTextureBindingLayout(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + access: int + format: int + viewDimension: int +enum_WGPUStorageTextureAccess: dict[int, str] = {(WGPUStorageTextureAccess_BindingNotUsed:=0): 'WGPUStorageTextureAccess_BindingNotUsed', (WGPUStorageTextureAccess_WriteOnly:=1): 'WGPUStorageTextureAccess_WriteOnly', (WGPUStorageTextureAccess_ReadOnly:=2): 'WGPUStorageTextureAccess_ReadOnly', (WGPUStorageTextureAccess_ReadWrite:=3): 'WGPUStorageTextureAccess_ReadWrite', (WGPUStorageTextureAccess_Force32:=2147483647): 'WGPUStorageTextureAccess_Force32'} +WGPUStorageTextureAccess: TypeAlias = ctypes.c_uint32 +enum_WGPUTextureViewDimension: dict[int, str] = {(WGPUTextureViewDimension_Undefined:=0): 'WGPUTextureViewDimension_Undefined', (WGPUTextureViewDimension_1D:=1): 'WGPUTextureViewDimension_1D', (WGPUTextureViewDimension_2D:=2): 'WGPUTextureViewDimension_2D', (WGPUTextureViewDimension_2DArray:=3): 'WGPUTextureViewDimension_2DArray', (WGPUTextureViewDimension_Cube:=4): 'WGPUTextureViewDimension_Cube', (WGPUTextureViewDimension_CubeArray:=5): 'WGPUTextureViewDimension_CubeArray', (WGPUTextureViewDimension_3D:=6): 'WGPUTextureViewDimension_3D', (WGPUTextureViewDimension_Force32:=2147483647): 'WGPUTextureViewDimension_Force32'} +WGPUTextureViewDimension: TypeAlias = ctypes.c_uint32 +struct_WGPUStorageTextureBindingLayout.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('access', WGPUStorageTextureAccess, 8), ('format', WGPUTextureFormat, 12), ('viewDimension', WGPUTextureViewDimension, 16)]) +@c.record +class struct_WGPUSupportedFeatures(c.Struct): + SIZE = 16 + featureCount: int + features: c.POINTER[ctypes.c_uint32] +enum_WGPUFeatureName: dict[int, str] = {(WGPUFeatureName_DepthClipControl:=1): 'WGPUFeatureName_DepthClipControl', (WGPUFeatureName_Depth32FloatStencil8:=2): 'WGPUFeatureName_Depth32FloatStencil8', (WGPUFeatureName_TimestampQuery:=3): 'WGPUFeatureName_TimestampQuery', (WGPUFeatureName_TextureCompressionBC:=4): 'WGPUFeatureName_TextureCompressionBC', (WGPUFeatureName_TextureCompressionETC2:=5): 'WGPUFeatureName_TextureCompressionETC2', (WGPUFeatureName_TextureCompressionASTC:=6): 'WGPUFeatureName_TextureCompressionASTC', (WGPUFeatureName_IndirectFirstInstance:=7): 'WGPUFeatureName_IndirectFirstInstance', (WGPUFeatureName_ShaderF16:=8): 'WGPUFeatureName_ShaderF16', (WGPUFeatureName_RG11B10UfloatRenderable:=9): 'WGPUFeatureName_RG11B10UfloatRenderable', (WGPUFeatureName_BGRA8UnormStorage:=10): 'WGPUFeatureName_BGRA8UnormStorage', (WGPUFeatureName_Float32Filterable:=11): 'WGPUFeatureName_Float32Filterable', (WGPUFeatureName_Float32Blendable:=12): 'WGPUFeatureName_Float32Blendable', (WGPUFeatureName_Subgroups:=13): 'WGPUFeatureName_Subgroups', (WGPUFeatureName_SubgroupsF16:=14): 'WGPUFeatureName_SubgroupsF16', (WGPUFeatureName_DawnInternalUsages:=327680): 'WGPUFeatureName_DawnInternalUsages', (WGPUFeatureName_DawnMultiPlanarFormats:=327681): 'WGPUFeatureName_DawnMultiPlanarFormats', (WGPUFeatureName_DawnNative:=327682): 'WGPUFeatureName_DawnNative', (WGPUFeatureName_ChromiumExperimentalTimestampQueryInsidePasses:=327683): 'WGPUFeatureName_ChromiumExperimentalTimestampQueryInsidePasses', (WGPUFeatureName_ImplicitDeviceSynchronization:=327684): 'WGPUFeatureName_ImplicitDeviceSynchronization', (WGPUFeatureName_ChromiumExperimentalImmediateData:=327685): 'WGPUFeatureName_ChromiumExperimentalImmediateData', (WGPUFeatureName_TransientAttachments:=327686): 'WGPUFeatureName_TransientAttachments', (WGPUFeatureName_MSAARenderToSingleSampled:=327687): 'WGPUFeatureName_MSAARenderToSingleSampled', (WGPUFeatureName_DualSourceBlending:=327688): 'WGPUFeatureName_DualSourceBlending', (WGPUFeatureName_D3D11MultithreadProtected:=327689): 'WGPUFeatureName_D3D11MultithreadProtected', (WGPUFeatureName_ANGLETextureSharing:=327690): 'WGPUFeatureName_ANGLETextureSharing', (WGPUFeatureName_PixelLocalStorageCoherent:=327691): 'WGPUFeatureName_PixelLocalStorageCoherent', (WGPUFeatureName_PixelLocalStorageNonCoherent:=327692): 'WGPUFeatureName_PixelLocalStorageNonCoherent', (WGPUFeatureName_Unorm16TextureFormats:=327693): 'WGPUFeatureName_Unorm16TextureFormats', (WGPUFeatureName_Snorm16TextureFormats:=327694): 'WGPUFeatureName_Snorm16TextureFormats', (WGPUFeatureName_MultiPlanarFormatExtendedUsages:=327695): 'WGPUFeatureName_MultiPlanarFormatExtendedUsages', (WGPUFeatureName_MultiPlanarFormatP010:=327696): 'WGPUFeatureName_MultiPlanarFormatP010', (WGPUFeatureName_HostMappedPointer:=327697): 'WGPUFeatureName_HostMappedPointer', (WGPUFeatureName_MultiPlanarRenderTargets:=327698): 'WGPUFeatureName_MultiPlanarRenderTargets', (WGPUFeatureName_MultiPlanarFormatNv12a:=327699): 'WGPUFeatureName_MultiPlanarFormatNv12a', (WGPUFeatureName_FramebufferFetch:=327700): 'WGPUFeatureName_FramebufferFetch', (WGPUFeatureName_BufferMapExtendedUsages:=327701): 'WGPUFeatureName_BufferMapExtendedUsages', (WGPUFeatureName_AdapterPropertiesMemoryHeaps:=327702): 'WGPUFeatureName_AdapterPropertiesMemoryHeaps', (WGPUFeatureName_AdapterPropertiesD3D:=327703): 'WGPUFeatureName_AdapterPropertiesD3D', (WGPUFeatureName_AdapterPropertiesVk:=327704): 'WGPUFeatureName_AdapterPropertiesVk', (WGPUFeatureName_R8UnormStorage:=327705): 'WGPUFeatureName_R8UnormStorage', (WGPUFeatureName_FormatCapabilities:=327706): 'WGPUFeatureName_FormatCapabilities', (WGPUFeatureName_DrmFormatCapabilities:=327707): 'WGPUFeatureName_DrmFormatCapabilities', (WGPUFeatureName_Norm16TextureFormats:=327708): 'WGPUFeatureName_Norm16TextureFormats', (WGPUFeatureName_MultiPlanarFormatNv16:=327709): 'WGPUFeatureName_MultiPlanarFormatNv16', (WGPUFeatureName_MultiPlanarFormatNv24:=327710): 'WGPUFeatureName_MultiPlanarFormatNv24', (WGPUFeatureName_MultiPlanarFormatP210:=327711): 'WGPUFeatureName_MultiPlanarFormatP210', (WGPUFeatureName_MultiPlanarFormatP410:=327712): 'WGPUFeatureName_MultiPlanarFormatP410', (WGPUFeatureName_SharedTextureMemoryVkDedicatedAllocation:=327713): 'WGPUFeatureName_SharedTextureMemoryVkDedicatedAllocation', (WGPUFeatureName_SharedTextureMemoryAHardwareBuffer:=327714): 'WGPUFeatureName_SharedTextureMemoryAHardwareBuffer', (WGPUFeatureName_SharedTextureMemoryDmaBuf:=327715): 'WGPUFeatureName_SharedTextureMemoryDmaBuf', (WGPUFeatureName_SharedTextureMemoryOpaqueFD:=327716): 'WGPUFeatureName_SharedTextureMemoryOpaqueFD', (WGPUFeatureName_SharedTextureMemoryZirconHandle:=327717): 'WGPUFeatureName_SharedTextureMemoryZirconHandle', (WGPUFeatureName_SharedTextureMemoryDXGISharedHandle:=327718): 'WGPUFeatureName_SharedTextureMemoryDXGISharedHandle', (WGPUFeatureName_SharedTextureMemoryD3D11Texture2D:=327719): 'WGPUFeatureName_SharedTextureMemoryD3D11Texture2D', (WGPUFeatureName_SharedTextureMemoryIOSurface:=327720): 'WGPUFeatureName_SharedTextureMemoryIOSurface', (WGPUFeatureName_SharedTextureMemoryEGLImage:=327721): 'WGPUFeatureName_SharedTextureMemoryEGLImage', (WGPUFeatureName_SharedFenceVkSemaphoreOpaqueFD:=327722): 'WGPUFeatureName_SharedFenceVkSemaphoreOpaqueFD', (WGPUFeatureName_SharedFenceSyncFD:=327723): 'WGPUFeatureName_SharedFenceSyncFD', (WGPUFeatureName_SharedFenceVkSemaphoreZirconHandle:=327724): 'WGPUFeatureName_SharedFenceVkSemaphoreZirconHandle', (WGPUFeatureName_SharedFenceDXGISharedHandle:=327725): 'WGPUFeatureName_SharedFenceDXGISharedHandle', (WGPUFeatureName_SharedFenceMTLSharedEvent:=327726): 'WGPUFeatureName_SharedFenceMTLSharedEvent', (WGPUFeatureName_SharedBufferMemoryD3D12Resource:=327727): 'WGPUFeatureName_SharedBufferMemoryD3D12Resource', (WGPUFeatureName_StaticSamplers:=327728): 'WGPUFeatureName_StaticSamplers', (WGPUFeatureName_YCbCrVulkanSamplers:=327729): 'WGPUFeatureName_YCbCrVulkanSamplers', (WGPUFeatureName_ShaderModuleCompilationOptions:=327730): 'WGPUFeatureName_ShaderModuleCompilationOptions', (WGPUFeatureName_DawnLoadResolveTexture:=327731): 'WGPUFeatureName_DawnLoadResolveTexture', (WGPUFeatureName_DawnPartialLoadResolveTexture:=327732): 'WGPUFeatureName_DawnPartialLoadResolveTexture', (WGPUFeatureName_MultiDrawIndirect:=327733): 'WGPUFeatureName_MultiDrawIndirect', (WGPUFeatureName_ClipDistances:=327734): 'WGPUFeatureName_ClipDistances', (WGPUFeatureName_DawnTexelCopyBufferRowAlignment:=327735): 'WGPUFeatureName_DawnTexelCopyBufferRowAlignment', (WGPUFeatureName_FlexibleTextureViews:=327736): 'WGPUFeatureName_FlexibleTextureViews', (WGPUFeatureName_Force32:=2147483647): 'WGPUFeatureName_Force32'} +WGPUFeatureName: TypeAlias = ctypes.c_uint32 +const_enum_WGPUFeatureName: dict[int, str] = {(WGPUFeatureName_DepthClipControl:=1): 'WGPUFeatureName_DepthClipControl', (WGPUFeatureName_Depth32FloatStencil8:=2): 'WGPUFeatureName_Depth32FloatStencil8', (WGPUFeatureName_TimestampQuery:=3): 'WGPUFeatureName_TimestampQuery', (WGPUFeatureName_TextureCompressionBC:=4): 'WGPUFeatureName_TextureCompressionBC', (WGPUFeatureName_TextureCompressionETC2:=5): 'WGPUFeatureName_TextureCompressionETC2', (WGPUFeatureName_TextureCompressionASTC:=6): 'WGPUFeatureName_TextureCompressionASTC', (WGPUFeatureName_IndirectFirstInstance:=7): 'WGPUFeatureName_IndirectFirstInstance', (WGPUFeatureName_ShaderF16:=8): 'WGPUFeatureName_ShaderF16', (WGPUFeatureName_RG11B10UfloatRenderable:=9): 'WGPUFeatureName_RG11B10UfloatRenderable', (WGPUFeatureName_BGRA8UnormStorage:=10): 'WGPUFeatureName_BGRA8UnormStorage', (WGPUFeatureName_Float32Filterable:=11): 'WGPUFeatureName_Float32Filterable', (WGPUFeatureName_Float32Blendable:=12): 'WGPUFeatureName_Float32Blendable', (WGPUFeatureName_Subgroups:=13): 'WGPUFeatureName_Subgroups', (WGPUFeatureName_SubgroupsF16:=14): 'WGPUFeatureName_SubgroupsF16', (WGPUFeatureName_DawnInternalUsages:=327680): 'WGPUFeatureName_DawnInternalUsages', (WGPUFeatureName_DawnMultiPlanarFormats:=327681): 'WGPUFeatureName_DawnMultiPlanarFormats', (WGPUFeatureName_DawnNative:=327682): 'WGPUFeatureName_DawnNative', (WGPUFeatureName_ChromiumExperimentalTimestampQueryInsidePasses:=327683): 'WGPUFeatureName_ChromiumExperimentalTimestampQueryInsidePasses', (WGPUFeatureName_ImplicitDeviceSynchronization:=327684): 'WGPUFeatureName_ImplicitDeviceSynchronization', (WGPUFeatureName_ChromiumExperimentalImmediateData:=327685): 'WGPUFeatureName_ChromiumExperimentalImmediateData', (WGPUFeatureName_TransientAttachments:=327686): 'WGPUFeatureName_TransientAttachments', (WGPUFeatureName_MSAARenderToSingleSampled:=327687): 'WGPUFeatureName_MSAARenderToSingleSampled', (WGPUFeatureName_DualSourceBlending:=327688): 'WGPUFeatureName_DualSourceBlending', (WGPUFeatureName_D3D11MultithreadProtected:=327689): 'WGPUFeatureName_D3D11MultithreadProtected', (WGPUFeatureName_ANGLETextureSharing:=327690): 'WGPUFeatureName_ANGLETextureSharing', (WGPUFeatureName_PixelLocalStorageCoherent:=327691): 'WGPUFeatureName_PixelLocalStorageCoherent', (WGPUFeatureName_PixelLocalStorageNonCoherent:=327692): 'WGPUFeatureName_PixelLocalStorageNonCoherent', (WGPUFeatureName_Unorm16TextureFormats:=327693): 'WGPUFeatureName_Unorm16TextureFormats', (WGPUFeatureName_Snorm16TextureFormats:=327694): 'WGPUFeatureName_Snorm16TextureFormats', (WGPUFeatureName_MultiPlanarFormatExtendedUsages:=327695): 'WGPUFeatureName_MultiPlanarFormatExtendedUsages', (WGPUFeatureName_MultiPlanarFormatP010:=327696): 'WGPUFeatureName_MultiPlanarFormatP010', (WGPUFeatureName_HostMappedPointer:=327697): 'WGPUFeatureName_HostMappedPointer', (WGPUFeatureName_MultiPlanarRenderTargets:=327698): 'WGPUFeatureName_MultiPlanarRenderTargets', (WGPUFeatureName_MultiPlanarFormatNv12a:=327699): 'WGPUFeatureName_MultiPlanarFormatNv12a', (WGPUFeatureName_FramebufferFetch:=327700): 'WGPUFeatureName_FramebufferFetch', (WGPUFeatureName_BufferMapExtendedUsages:=327701): 'WGPUFeatureName_BufferMapExtendedUsages', (WGPUFeatureName_AdapterPropertiesMemoryHeaps:=327702): 'WGPUFeatureName_AdapterPropertiesMemoryHeaps', (WGPUFeatureName_AdapterPropertiesD3D:=327703): 'WGPUFeatureName_AdapterPropertiesD3D', (WGPUFeatureName_AdapterPropertiesVk:=327704): 'WGPUFeatureName_AdapterPropertiesVk', (WGPUFeatureName_R8UnormStorage:=327705): 'WGPUFeatureName_R8UnormStorage', (WGPUFeatureName_FormatCapabilities:=327706): 'WGPUFeatureName_FormatCapabilities', (WGPUFeatureName_DrmFormatCapabilities:=327707): 'WGPUFeatureName_DrmFormatCapabilities', (WGPUFeatureName_Norm16TextureFormats:=327708): 'WGPUFeatureName_Norm16TextureFormats', (WGPUFeatureName_MultiPlanarFormatNv16:=327709): 'WGPUFeatureName_MultiPlanarFormatNv16', (WGPUFeatureName_MultiPlanarFormatNv24:=327710): 'WGPUFeatureName_MultiPlanarFormatNv24', (WGPUFeatureName_MultiPlanarFormatP210:=327711): 'WGPUFeatureName_MultiPlanarFormatP210', (WGPUFeatureName_MultiPlanarFormatP410:=327712): 'WGPUFeatureName_MultiPlanarFormatP410', (WGPUFeatureName_SharedTextureMemoryVkDedicatedAllocation:=327713): 'WGPUFeatureName_SharedTextureMemoryVkDedicatedAllocation', (WGPUFeatureName_SharedTextureMemoryAHardwareBuffer:=327714): 'WGPUFeatureName_SharedTextureMemoryAHardwareBuffer', (WGPUFeatureName_SharedTextureMemoryDmaBuf:=327715): 'WGPUFeatureName_SharedTextureMemoryDmaBuf', (WGPUFeatureName_SharedTextureMemoryOpaqueFD:=327716): 'WGPUFeatureName_SharedTextureMemoryOpaqueFD', (WGPUFeatureName_SharedTextureMemoryZirconHandle:=327717): 'WGPUFeatureName_SharedTextureMemoryZirconHandle', (WGPUFeatureName_SharedTextureMemoryDXGISharedHandle:=327718): 'WGPUFeatureName_SharedTextureMemoryDXGISharedHandle', (WGPUFeatureName_SharedTextureMemoryD3D11Texture2D:=327719): 'WGPUFeatureName_SharedTextureMemoryD3D11Texture2D', (WGPUFeatureName_SharedTextureMemoryIOSurface:=327720): 'WGPUFeatureName_SharedTextureMemoryIOSurface', (WGPUFeatureName_SharedTextureMemoryEGLImage:=327721): 'WGPUFeatureName_SharedTextureMemoryEGLImage', (WGPUFeatureName_SharedFenceVkSemaphoreOpaqueFD:=327722): 'WGPUFeatureName_SharedFenceVkSemaphoreOpaqueFD', (WGPUFeatureName_SharedFenceSyncFD:=327723): 'WGPUFeatureName_SharedFenceSyncFD', (WGPUFeatureName_SharedFenceVkSemaphoreZirconHandle:=327724): 'WGPUFeatureName_SharedFenceVkSemaphoreZirconHandle', (WGPUFeatureName_SharedFenceDXGISharedHandle:=327725): 'WGPUFeatureName_SharedFenceDXGISharedHandle', (WGPUFeatureName_SharedFenceMTLSharedEvent:=327726): 'WGPUFeatureName_SharedFenceMTLSharedEvent', (WGPUFeatureName_SharedBufferMemoryD3D12Resource:=327727): 'WGPUFeatureName_SharedBufferMemoryD3D12Resource', (WGPUFeatureName_StaticSamplers:=327728): 'WGPUFeatureName_StaticSamplers', (WGPUFeatureName_YCbCrVulkanSamplers:=327729): 'WGPUFeatureName_YCbCrVulkanSamplers', (WGPUFeatureName_ShaderModuleCompilationOptions:=327730): 'WGPUFeatureName_ShaderModuleCompilationOptions', (WGPUFeatureName_DawnLoadResolveTexture:=327731): 'WGPUFeatureName_DawnLoadResolveTexture', (WGPUFeatureName_DawnPartialLoadResolveTexture:=327732): 'WGPUFeatureName_DawnPartialLoadResolveTexture', (WGPUFeatureName_MultiDrawIndirect:=327733): 'WGPUFeatureName_MultiDrawIndirect', (WGPUFeatureName_ClipDistances:=327734): 'WGPUFeatureName_ClipDistances', (WGPUFeatureName_DawnTexelCopyBufferRowAlignment:=327735): 'WGPUFeatureName_DawnTexelCopyBufferRowAlignment', (WGPUFeatureName_FlexibleTextureViews:=327736): 'WGPUFeatureName_FlexibleTextureViews', (WGPUFeatureName_Force32:=2147483647): 'WGPUFeatureName_Force32'} +struct_WGPUSupportedFeatures.register_fields([('featureCount', size_t, 0), ('features', c.POINTER[WGPUFeatureName], 8)]) +@c.record +class struct_WGPUSurfaceCapabilities(c.Struct): + SIZE = 64 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] + usages: int + formatCount: int + formats: c.POINTER[ctypes.c_uint32] + presentModeCount: int + presentModes: c.POINTER[ctypes.c_uint32] + alphaModeCount: int + alphaModes: c.POINTER[ctypes.c_uint32] +enum_WGPUPresentMode: dict[int, str] = {(WGPUPresentMode_Fifo:=1): 'WGPUPresentMode_Fifo', (WGPUPresentMode_FifoRelaxed:=2): 'WGPUPresentMode_FifoRelaxed', (WGPUPresentMode_Immediate:=3): 'WGPUPresentMode_Immediate', (WGPUPresentMode_Mailbox:=4): 'WGPUPresentMode_Mailbox', (WGPUPresentMode_Force32:=2147483647): 'WGPUPresentMode_Force32'} +WGPUPresentMode: TypeAlias = ctypes.c_uint32 +enum_WGPUCompositeAlphaMode: dict[int, str] = {(WGPUCompositeAlphaMode_Auto:=0): 'WGPUCompositeAlphaMode_Auto', (WGPUCompositeAlphaMode_Opaque:=1): 'WGPUCompositeAlphaMode_Opaque', (WGPUCompositeAlphaMode_Premultiplied:=2): 'WGPUCompositeAlphaMode_Premultiplied', (WGPUCompositeAlphaMode_Unpremultiplied:=3): 'WGPUCompositeAlphaMode_Unpremultiplied', (WGPUCompositeAlphaMode_Inherit:=4): 'WGPUCompositeAlphaMode_Inherit', (WGPUCompositeAlphaMode_Force32:=2147483647): 'WGPUCompositeAlphaMode_Force32'} +WGPUCompositeAlphaMode: TypeAlias = ctypes.c_uint32 +const_enum_WGPUTextureFormat: dict[int, str] = {(WGPUTextureFormat_Undefined:=0): 'WGPUTextureFormat_Undefined', (WGPUTextureFormat_R8Unorm:=1): 'WGPUTextureFormat_R8Unorm', (WGPUTextureFormat_R8Snorm:=2): 'WGPUTextureFormat_R8Snorm', (WGPUTextureFormat_R8Uint:=3): 'WGPUTextureFormat_R8Uint', (WGPUTextureFormat_R8Sint:=4): 'WGPUTextureFormat_R8Sint', (WGPUTextureFormat_R16Uint:=5): 'WGPUTextureFormat_R16Uint', (WGPUTextureFormat_R16Sint:=6): 'WGPUTextureFormat_R16Sint', (WGPUTextureFormat_R16Float:=7): 'WGPUTextureFormat_R16Float', (WGPUTextureFormat_RG8Unorm:=8): 'WGPUTextureFormat_RG8Unorm', (WGPUTextureFormat_RG8Snorm:=9): 'WGPUTextureFormat_RG8Snorm', (WGPUTextureFormat_RG8Uint:=10): 'WGPUTextureFormat_RG8Uint', (WGPUTextureFormat_RG8Sint:=11): 'WGPUTextureFormat_RG8Sint', (WGPUTextureFormat_R32Float:=12): 'WGPUTextureFormat_R32Float', (WGPUTextureFormat_R32Uint:=13): 'WGPUTextureFormat_R32Uint', (WGPUTextureFormat_R32Sint:=14): 'WGPUTextureFormat_R32Sint', (WGPUTextureFormat_RG16Uint:=15): 'WGPUTextureFormat_RG16Uint', (WGPUTextureFormat_RG16Sint:=16): 'WGPUTextureFormat_RG16Sint', (WGPUTextureFormat_RG16Float:=17): 'WGPUTextureFormat_RG16Float', (WGPUTextureFormat_RGBA8Unorm:=18): 'WGPUTextureFormat_RGBA8Unorm', (WGPUTextureFormat_RGBA8UnormSrgb:=19): 'WGPUTextureFormat_RGBA8UnormSrgb', (WGPUTextureFormat_RGBA8Snorm:=20): 'WGPUTextureFormat_RGBA8Snorm', (WGPUTextureFormat_RGBA8Uint:=21): 'WGPUTextureFormat_RGBA8Uint', (WGPUTextureFormat_RGBA8Sint:=22): 'WGPUTextureFormat_RGBA8Sint', (WGPUTextureFormat_BGRA8Unorm:=23): 'WGPUTextureFormat_BGRA8Unorm', (WGPUTextureFormat_BGRA8UnormSrgb:=24): 'WGPUTextureFormat_BGRA8UnormSrgb', (WGPUTextureFormat_RGB10A2Uint:=25): 'WGPUTextureFormat_RGB10A2Uint', (WGPUTextureFormat_RGB10A2Unorm:=26): 'WGPUTextureFormat_RGB10A2Unorm', (WGPUTextureFormat_RG11B10Ufloat:=27): 'WGPUTextureFormat_RG11B10Ufloat', (WGPUTextureFormat_RGB9E5Ufloat:=28): 'WGPUTextureFormat_RGB9E5Ufloat', (WGPUTextureFormat_RG32Float:=29): 'WGPUTextureFormat_RG32Float', (WGPUTextureFormat_RG32Uint:=30): 'WGPUTextureFormat_RG32Uint', (WGPUTextureFormat_RG32Sint:=31): 'WGPUTextureFormat_RG32Sint', (WGPUTextureFormat_RGBA16Uint:=32): 'WGPUTextureFormat_RGBA16Uint', (WGPUTextureFormat_RGBA16Sint:=33): 'WGPUTextureFormat_RGBA16Sint', (WGPUTextureFormat_RGBA16Float:=34): 'WGPUTextureFormat_RGBA16Float', (WGPUTextureFormat_RGBA32Float:=35): 'WGPUTextureFormat_RGBA32Float', (WGPUTextureFormat_RGBA32Uint:=36): 'WGPUTextureFormat_RGBA32Uint', (WGPUTextureFormat_RGBA32Sint:=37): 'WGPUTextureFormat_RGBA32Sint', (WGPUTextureFormat_Stencil8:=38): 'WGPUTextureFormat_Stencil8', (WGPUTextureFormat_Depth16Unorm:=39): 'WGPUTextureFormat_Depth16Unorm', (WGPUTextureFormat_Depth24Plus:=40): 'WGPUTextureFormat_Depth24Plus', (WGPUTextureFormat_Depth24PlusStencil8:=41): 'WGPUTextureFormat_Depth24PlusStencil8', (WGPUTextureFormat_Depth32Float:=42): 'WGPUTextureFormat_Depth32Float', (WGPUTextureFormat_Depth32FloatStencil8:=43): 'WGPUTextureFormat_Depth32FloatStencil8', (WGPUTextureFormat_BC1RGBAUnorm:=44): 'WGPUTextureFormat_BC1RGBAUnorm', (WGPUTextureFormat_BC1RGBAUnormSrgb:=45): 'WGPUTextureFormat_BC1RGBAUnormSrgb', (WGPUTextureFormat_BC2RGBAUnorm:=46): 'WGPUTextureFormat_BC2RGBAUnorm', (WGPUTextureFormat_BC2RGBAUnormSrgb:=47): 'WGPUTextureFormat_BC2RGBAUnormSrgb', (WGPUTextureFormat_BC3RGBAUnorm:=48): 'WGPUTextureFormat_BC3RGBAUnorm', (WGPUTextureFormat_BC3RGBAUnormSrgb:=49): 'WGPUTextureFormat_BC3RGBAUnormSrgb', (WGPUTextureFormat_BC4RUnorm:=50): 'WGPUTextureFormat_BC4RUnorm', (WGPUTextureFormat_BC4RSnorm:=51): 'WGPUTextureFormat_BC4RSnorm', (WGPUTextureFormat_BC5RGUnorm:=52): 'WGPUTextureFormat_BC5RGUnorm', (WGPUTextureFormat_BC5RGSnorm:=53): 'WGPUTextureFormat_BC5RGSnorm', (WGPUTextureFormat_BC6HRGBUfloat:=54): 'WGPUTextureFormat_BC6HRGBUfloat', (WGPUTextureFormat_BC6HRGBFloat:=55): 'WGPUTextureFormat_BC6HRGBFloat', (WGPUTextureFormat_BC7RGBAUnorm:=56): 'WGPUTextureFormat_BC7RGBAUnorm', (WGPUTextureFormat_BC7RGBAUnormSrgb:=57): 'WGPUTextureFormat_BC7RGBAUnormSrgb', (WGPUTextureFormat_ETC2RGB8Unorm:=58): 'WGPUTextureFormat_ETC2RGB8Unorm', (WGPUTextureFormat_ETC2RGB8UnormSrgb:=59): 'WGPUTextureFormat_ETC2RGB8UnormSrgb', (WGPUTextureFormat_ETC2RGB8A1Unorm:=60): 'WGPUTextureFormat_ETC2RGB8A1Unorm', (WGPUTextureFormat_ETC2RGB8A1UnormSrgb:=61): 'WGPUTextureFormat_ETC2RGB8A1UnormSrgb', (WGPUTextureFormat_ETC2RGBA8Unorm:=62): 'WGPUTextureFormat_ETC2RGBA8Unorm', (WGPUTextureFormat_ETC2RGBA8UnormSrgb:=63): 'WGPUTextureFormat_ETC2RGBA8UnormSrgb', (WGPUTextureFormat_EACR11Unorm:=64): 'WGPUTextureFormat_EACR11Unorm', (WGPUTextureFormat_EACR11Snorm:=65): 'WGPUTextureFormat_EACR11Snorm', (WGPUTextureFormat_EACRG11Unorm:=66): 'WGPUTextureFormat_EACRG11Unorm', (WGPUTextureFormat_EACRG11Snorm:=67): 'WGPUTextureFormat_EACRG11Snorm', (WGPUTextureFormat_ASTC4x4Unorm:=68): 'WGPUTextureFormat_ASTC4x4Unorm', (WGPUTextureFormat_ASTC4x4UnormSrgb:=69): 'WGPUTextureFormat_ASTC4x4UnormSrgb', (WGPUTextureFormat_ASTC5x4Unorm:=70): 'WGPUTextureFormat_ASTC5x4Unorm', (WGPUTextureFormat_ASTC5x4UnormSrgb:=71): 'WGPUTextureFormat_ASTC5x4UnormSrgb', (WGPUTextureFormat_ASTC5x5Unorm:=72): 'WGPUTextureFormat_ASTC5x5Unorm', (WGPUTextureFormat_ASTC5x5UnormSrgb:=73): 'WGPUTextureFormat_ASTC5x5UnormSrgb', (WGPUTextureFormat_ASTC6x5Unorm:=74): 'WGPUTextureFormat_ASTC6x5Unorm', (WGPUTextureFormat_ASTC6x5UnormSrgb:=75): 'WGPUTextureFormat_ASTC6x5UnormSrgb', (WGPUTextureFormat_ASTC6x6Unorm:=76): 'WGPUTextureFormat_ASTC6x6Unorm', (WGPUTextureFormat_ASTC6x6UnormSrgb:=77): 'WGPUTextureFormat_ASTC6x6UnormSrgb', (WGPUTextureFormat_ASTC8x5Unorm:=78): 'WGPUTextureFormat_ASTC8x5Unorm', (WGPUTextureFormat_ASTC8x5UnormSrgb:=79): 'WGPUTextureFormat_ASTC8x5UnormSrgb', (WGPUTextureFormat_ASTC8x6Unorm:=80): 'WGPUTextureFormat_ASTC8x6Unorm', (WGPUTextureFormat_ASTC8x6UnormSrgb:=81): 'WGPUTextureFormat_ASTC8x6UnormSrgb', (WGPUTextureFormat_ASTC8x8Unorm:=82): 'WGPUTextureFormat_ASTC8x8Unorm', (WGPUTextureFormat_ASTC8x8UnormSrgb:=83): 'WGPUTextureFormat_ASTC8x8UnormSrgb', (WGPUTextureFormat_ASTC10x5Unorm:=84): 'WGPUTextureFormat_ASTC10x5Unorm', (WGPUTextureFormat_ASTC10x5UnormSrgb:=85): 'WGPUTextureFormat_ASTC10x5UnormSrgb', (WGPUTextureFormat_ASTC10x6Unorm:=86): 'WGPUTextureFormat_ASTC10x6Unorm', (WGPUTextureFormat_ASTC10x6UnormSrgb:=87): 'WGPUTextureFormat_ASTC10x6UnormSrgb', (WGPUTextureFormat_ASTC10x8Unorm:=88): 'WGPUTextureFormat_ASTC10x8Unorm', (WGPUTextureFormat_ASTC10x8UnormSrgb:=89): 'WGPUTextureFormat_ASTC10x8UnormSrgb', (WGPUTextureFormat_ASTC10x10Unorm:=90): 'WGPUTextureFormat_ASTC10x10Unorm', (WGPUTextureFormat_ASTC10x10UnormSrgb:=91): 'WGPUTextureFormat_ASTC10x10UnormSrgb', (WGPUTextureFormat_ASTC12x10Unorm:=92): 'WGPUTextureFormat_ASTC12x10Unorm', (WGPUTextureFormat_ASTC12x10UnormSrgb:=93): 'WGPUTextureFormat_ASTC12x10UnormSrgb', (WGPUTextureFormat_ASTC12x12Unorm:=94): 'WGPUTextureFormat_ASTC12x12Unorm', (WGPUTextureFormat_ASTC12x12UnormSrgb:=95): 'WGPUTextureFormat_ASTC12x12UnormSrgb', (WGPUTextureFormat_R16Unorm:=327680): 'WGPUTextureFormat_R16Unorm', (WGPUTextureFormat_RG16Unorm:=327681): 'WGPUTextureFormat_RG16Unorm', (WGPUTextureFormat_RGBA16Unorm:=327682): 'WGPUTextureFormat_RGBA16Unorm', (WGPUTextureFormat_R16Snorm:=327683): 'WGPUTextureFormat_R16Snorm', (WGPUTextureFormat_RG16Snorm:=327684): 'WGPUTextureFormat_RG16Snorm', (WGPUTextureFormat_RGBA16Snorm:=327685): 'WGPUTextureFormat_RGBA16Snorm', (WGPUTextureFormat_R8BG8Biplanar420Unorm:=327686): 'WGPUTextureFormat_R8BG8Biplanar420Unorm', (WGPUTextureFormat_R10X6BG10X6Biplanar420Unorm:=327687): 'WGPUTextureFormat_R10X6BG10X6Biplanar420Unorm', (WGPUTextureFormat_R8BG8A8Triplanar420Unorm:=327688): 'WGPUTextureFormat_R8BG8A8Triplanar420Unorm', (WGPUTextureFormat_R8BG8Biplanar422Unorm:=327689): 'WGPUTextureFormat_R8BG8Biplanar422Unorm', (WGPUTextureFormat_R8BG8Biplanar444Unorm:=327690): 'WGPUTextureFormat_R8BG8Biplanar444Unorm', (WGPUTextureFormat_R10X6BG10X6Biplanar422Unorm:=327691): 'WGPUTextureFormat_R10X6BG10X6Biplanar422Unorm', (WGPUTextureFormat_R10X6BG10X6Biplanar444Unorm:=327692): 'WGPUTextureFormat_R10X6BG10X6Biplanar444Unorm', (WGPUTextureFormat_External:=327693): 'WGPUTextureFormat_External', (WGPUTextureFormat_Force32:=2147483647): 'WGPUTextureFormat_Force32'} +const_enum_WGPUPresentMode: dict[int, str] = {(WGPUPresentMode_Fifo:=1): 'WGPUPresentMode_Fifo', (WGPUPresentMode_FifoRelaxed:=2): 'WGPUPresentMode_FifoRelaxed', (WGPUPresentMode_Immediate:=3): 'WGPUPresentMode_Immediate', (WGPUPresentMode_Mailbox:=4): 'WGPUPresentMode_Mailbox', (WGPUPresentMode_Force32:=2147483647): 'WGPUPresentMode_Force32'} +const_enum_WGPUCompositeAlphaMode: dict[int, str] = {(WGPUCompositeAlphaMode_Auto:=0): 'WGPUCompositeAlphaMode_Auto', (WGPUCompositeAlphaMode_Opaque:=1): 'WGPUCompositeAlphaMode_Opaque', (WGPUCompositeAlphaMode_Premultiplied:=2): 'WGPUCompositeAlphaMode_Premultiplied', (WGPUCompositeAlphaMode_Unpremultiplied:=3): 'WGPUCompositeAlphaMode_Unpremultiplied', (WGPUCompositeAlphaMode_Inherit:=4): 'WGPUCompositeAlphaMode_Inherit', (WGPUCompositeAlphaMode_Force32:=2147483647): 'WGPUCompositeAlphaMode_Force32'} +struct_WGPUSurfaceCapabilities.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0), ('usages', WGPUTextureUsage, 8), ('formatCount', size_t, 16), ('formats', c.POINTER[WGPUTextureFormat], 24), ('presentModeCount', size_t, 32), ('presentModes', c.POINTER[WGPUPresentMode], 40), ('alphaModeCount', size_t, 48), ('alphaModes', c.POINTER[WGPUCompositeAlphaMode], 56)]) +@c.record +class struct_WGPUSurfaceConfiguration(c.Struct): + SIZE = 64 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + device: c.POINTER[struct_WGPUDeviceImpl] + format: int + usage: int + viewFormatCount: int + viewFormats: c.POINTER[ctypes.c_uint32] + alphaMode: int + width: int + height: int + presentMode: int +struct_WGPUSurfaceConfiguration.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('device', WGPUDevice, 8), ('format', WGPUTextureFormat, 16), ('usage', WGPUTextureUsage, 24), ('viewFormatCount', size_t, 32), ('viewFormats', c.POINTER[WGPUTextureFormat], 40), ('alphaMode', WGPUCompositeAlphaMode, 48), ('width', uint32_t, 52), ('height', uint32_t, 56), ('presentMode', WGPUPresentMode, 60)]) +@c.record +class struct_WGPUSurfaceDescriptorFromWindowsCoreWindow(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + coreWindow: ctypes.c_void_p +struct_WGPUSurfaceDescriptorFromWindowsCoreWindow.register_fields([('chain', WGPUChainedStruct, 0), ('coreWindow', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSurfaceDescriptorFromWindowsSwapChainPanel(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + swapChainPanel: ctypes.c_void_p +struct_WGPUSurfaceDescriptorFromWindowsSwapChainPanel.register_fields([('chain', WGPUChainedStruct, 0), ('swapChainPanel', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSurfaceSourceXCBWindow(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + connection: ctypes.c_void_p + window: int +struct_WGPUSurfaceSourceXCBWindow.register_fields([('chain', WGPUChainedStruct, 0), ('connection', ctypes.c_void_p, 16), ('window', uint32_t, 24)]) +@c.record +class struct_WGPUSurfaceSourceAndroidNativeWindow(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + window: ctypes.c_void_p +struct_WGPUSurfaceSourceAndroidNativeWindow.register_fields([('chain', WGPUChainedStruct, 0), ('window', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSurfaceSourceMetalLayer(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + layer: ctypes.c_void_p +struct_WGPUSurfaceSourceMetalLayer.register_fields([('chain', WGPUChainedStruct, 0), ('layer', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUSurfaceSourceWaylandSurface(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + display: ctypes.c_void_p + surface: ctypes.c_void_p +struct_WGPUSurfaceSourceWaylandSurface.register_fields([('chain', WGPUChainedStruct, 0), ('display', ctypes.c_void_p, 16), ('surface', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPUSurfaceSourceWindowsHWND(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + hinstance: ctypes.c_void_p + hwnd: ctypes.c_void_p +struct_WGPUSurfaceSourceWindowsHWND.register_fields([('chain', WGPUChainedStruct, 0), ('hinstance', ctypes.c_void_p, 16), ('hwnd', ctypes.c_void_p, 24)]) +@c.record +class struct_WGPUSurfaceSourceXlibWindow(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + display: ctypes.c_void_p + window: int +struct_WGPUSurfaceSourceXlibWindow.register_fields([('chain', WGPUChainedStruct, 0), ('display', ctypes.c_void_p, 16), ('window', uint64_t, 24)]) +@c.record +class struct_WGPUSurfaceTexture(c.Struct): + SIZE = 16 + texture: c.POINTER[struct_WGPUTextureImpl] + suboptimal: int + status: int +enum_WGPUSurfaceGetCurrentTextureStatus: dict[int, str] = {(WGPUSurfaceGetCurrentTextureStatus_Success:=1): 'WGPUSurfaceGetCurrentTextureStatus_Success', (WGPUSurfaceGetCurrentTextureStatus_Timeout:=2): 'WGPUSurfaceGetCurrentTextureStatus_Timeout', (WGPUSurfaceGetCurrentTextureStatus_Outdated:=3): 'WGPUSurfaceGetCurrentTextureStatus_Outdated', (WGPUSurfaceGetCurrentTextureStatus_Lost:=4): 'WGPUSurfaceGetCurrentTextureStatus_Lost', (WGPUSurfaceGetCurrentTextureStatus_OutOfMemory:=5): 'WGPUSurfaceGetCurrentTextureStatus_OutOfMemory', (WGPUSurfaceGetCurrentTextureStatus_DeviceLost:=6): 'WGPUSurfaceGetCurrentTextureStatus_DeviceLost', (WGPUSurfaceGetCurrentTextureStatus_Error:=7): 'WGPUSurfaceGetCurrentTextureStatus_Error', (WGPUSurfaceGetCurrentTextureStatus_Force32:=2147483647): 'WGPUSurfaceGetCurrentTextureStatus_Force32'} +WGPUSurfaceGetCurrentTextureStatus: TypeAlias = ctypes.c_uint32 +struct_WGPUSurfaceTexture.register_fields([('texture', WGPUTexture, 0), ('suboptimal', WGPUBool, 8), ('status', WGPUSurfaceGetCurrentTextureStatus, 12)]) +@c.record +class struct_WGPUTextureBindingLayout(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + sampleType: int + viewDimension: int + multisampled: int +enum_WGPUTextureSampleType: dict[int, str] = {(WGPUTextureSampleType_BindingNotUsed:=0): 'WGPUTextureSampleType_BindingNotUsed', (WGPUTextureSampleType_Float:=1): 'WGPUTextureSampleType_Float', (WGPUTextureSampleType_UnfilterableFloat:=2): 'WGPUTextureSampleType_UnfilterableFloat', (WGPUTextureSampleType_Depth:=3): 'WGPUTextureSampleType_Depth', (WGPUTextureSampleType_Sint:=4): 'WGPUTextureSampleType_Sint', (WGPUTextureSampleType_Uint:=5): 'WGPUTextureSampleType_Uint', (WGPUTextureSampleType_Force32:=2147483647): 'WGPUTextureSampleType_Force32'} +WGPUTextureSampleType: TypeAlias = ctypes.c_uint32 +struct_WGPUTextureBindingLayout.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('sampleType', WGPUTextureSampleType, 8), ('viewDimension', WGPUTextureViewDimension, 12), ('multisampled', WGPUBool, 16)]) +@c.record +class struct_WGPUTextureBindingViewDimensionDescriptor(c.Struct): + SIZE = 24 + chain: struct_WGPUChainedStruct + textureBindingViewDimension: int +struct_WGPUTextureBindingViewDimensionDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('textureBindingViewDimension', WGPUTextureViewDimension, 16)]) +@c.record +class struct_WGPUTextureDataLayout(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + offset: int + bytesPerRow: int + rowsPerImage: int +struct_WGPUTextureDataLayout.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('offset', uint64_t, 8), ('bytesPerRow', uint32_t, 16), ('rowsPerImage', uint32_t, 20)]) +@c.record +class struct_WGPUUncapturedErrorCallbackInfo(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] + userdata: ctypes.c_void_p +struct_WGPUUncapturedErrorCallbackInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('callback', WGPUErrorCallback, 8), ('userdata', ctypes.c_void_p, 16)]) +@c.record +class struct_WGPUVertexAttribute(c.Struct): + SIZE = 24 + format: int + offset: int + shaderLocation: int +enum_WGPUVertexFormat: dict[int, str] = {(WGPUVertexFormat_Uint8:=1): 'WGPUVertexFormat_Uint8', (WGPUVertexFormat_Uint8x2:=2): 'WGPUVertexFormat_Uint8x2', (WGPUVertexFormat_Uint8x4:=3): 'WGPUVertexFormat_Uint8x4', (WGPUVertexFormat_Sint8:=4): 'WGPUVertexFormat_Sint8', (WGPUVertexFormat_Sint8x2:=5): 'WGPUVertexFormat_Sint8x2', (WGPUVertexFormat_Sint8x4:=6): 'WGPUVertexFormat_Sint8x4', (WGPUVertexFormat_Unorm8:=7): 'WGPUVertexFormat_Unorm8', (WGPUVertexFormat_Unorm8x2:=8): 'WGPUVertexFormat_Unorm8x2', (WGPUVertexFormat_Unorm8x4:=9): 'WGPUVertexFormat_Unorm8x4', (WGPUVertexFormat_Snorm8:=10): 'WGPUVertexFormat_Snorm8', (WGPUVertexFormat_Snorm8x2:=11): 'WGPUVertexFormat_Snorm8x2', (WGPUVertexFormat_Snorm8x4:=12): 'WGPUVertexFormat_Snorm8x4', (WGPUVertexFormat_Uint16:=13): 'WGPUVertexFormat_Uint16', (WGPUVertexFormat_Uint16x2:=14): 'WGPUVertexFormat_Uint16x2', (WGPUVertexFormat_Uint16x4:=15): 'WGPUVertexFormat_Uint16x4', (WGPUVertexFormat_Sint16:=16): 'WGPUVertexFormat_Sint16', (WGPUVertexFormat_Sint16x2:=17): 'WGPUVertexFormat_Sint16x2', (WGPUVertexFormat_Sint16x4:=18): 'WGPUVertexFormat_Sint16x4', (WGPUVertexFormat_Unorm16:=19): 'WGPUVertexFormat_Unorm16', (WGPUVertexFormat_Unorm16x2:=20): 'WGPUVertexFormat_Unorm16x2', (WGPUVertexFormat_Unorm16x4:=21): 'WGPUVertexFormat_Unorm16x4', (WGPUVertexFormat_Snorm16:=22): 'WGPUVertexFormat_Snorm16', (WGPUVertexFormat_Snorm16x2:=23): 'WGPUVertexFormat_Snorm16x2', (WGPUVertexFormat_Snorm16x4:=24): 'WGPUVertexFormat_Snorm16x4', (WGPUVertexFormat_Float16:=25): 'WGPUVertexFormat_Float16', (WGPUVertexFormat_Float16x2:=26): 'WGPUVertexFormat_Float16x2', (WGPUVertexFormat_Float16x4:=27): 'WGPUVertexFormat_Float16x4', (WGPUVertexFormat_Float32:=28): 'WGPUVertexFormat_Float32', (WGPUVertexFormat_Float32x2:=29): 'WGPUVertexFormat_Float32x2', (WGPUVertexFormat_Float32x3:=30): 'WGPUVertexFormat_Float32x3', (WGPUVertexFormat_Float32x4:=31): 'WGPUVertexFormat_Float32x4', (WGPUVertexFormat_Uint32:=32): 'WGPUVertexFormat_Uint32', (WGPUVertexFormat_Uint32x2:=33): 'WGPUVertexFormat_Uint32x2', (WGPUVertexFormat_Uint32x3:=34): 'WGPUVertexFormat_Uint32x3', (WGPUVertexFormat_Uint32x4:=35): 'WGPUVertexFormat_Uint32x4', (WGPUVertexFormat_Sint32:=36): 'WGPUVertexFormat_Sint32', (WGPUVertexFormat_Sint32x2:=37): 'WGPUVertexFormat_Sint32x2', (WGPUVertexFormat_Sint32x3:=38): 'WGPUVertexFormat_Sint32x3', (WGPUVertexFormat_Sint32x4:=39): 'WGPUVertexFormat_Sint32x4', (WGPUVertexFormat_Unorm10_10_10_2:=40): 'WGPUVertexFormat_Unorm10_10_10_2', (WGPUVertexFormat_Unorm8x4BGRA:=41): 'WGPUVertexFormat_Unorm8x4BGRA', (WGPUVertexFormat_Force32:=2147483647): 'WGPUVertexFormat_Force32'} +WGPUVertexFormat: TypeAlias = ctypes.c_uint32 +struct_WGPUVertexAttribute.register_fields([('format', WGPUVertexFormat, 0), ('offset', uint64_t, 8), ('shaderLocation', uint32_t, 16)]) +@c.record +class struct_WGPUYCbCrVkDescriptor(c.Struct): + SIZE = 72 + chain: struct_WGPUChainedStruct + vkFormat: int + vkYCbCrModel: int + vkYCbCrRange: int + vkComponentSwizzleRed: int + vkComponentSwizzleGreen: int + vkComponentSwizzleBlue: int + vkComponentSwizzleAlpha: int + vkXChromaOffset: int + vkYChromaOffset: int + vkChromaFilter: int + forceExplicitReconstruction: int + externalFormat: int +enum_WGPUFilterMode: dict[int, str] = {(WGPUFilterMode_Undefined:=0): 'WGPUFilterMode_Undefined', (WGPUFilterMode_Nearest:=1): 'WGPUFilterMode_Nearest', (WGPUFilterMode_Linear:=2): 'WGPUFilterMode_Linear', (WGPUFilterMode_Force32:=2147483647): 'WGPUFilterMode_Force32'} +WGPUFilterMode: TypeAlias = ctypes.c_uint32 +struct_WGPUYCbCrVkDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('vkFormat', uint32_t, 16), ('vkYCbCrModel', uint32_t, 20), ('vkYCbCrRange', uint32_t, 24), ('vkComponentSwizzleRed', uint32_t, 28), ('vkComponentSwizzleGreen', uint32_t, 32), ('vkComponentSwizzleBlue', uint32_t, 36), ('vkComponentSwizzleAlpha', uint32_t, 40), ('vkXChromaOffset', uint32_t, 44), ('vkYChromaOffset', uint32_t, 48), ('vkChromaFilter', WGPUFilterMode, 52), ('forceExplicitReconstruction', WGPUBool, 56), ('externalFormat', uint64_t, 64)]) +@c.record +class struct_WGPUAHardwareBufferProperties(c.Struct): + SIZE = 72 + yCbCrInfo: struct_WGPUYCbCrVkDescriptor +WGPUYCbCrVkDescriptor: TypeAlias = struct_WGPUYCbCrVkDescriptor +struct_WGPUAHardwareBufferProperties.register_fields([('yCbCrInfo', WGPUYCbCrVkDescriptor, 0)]) +@c.record +class struct_WGPUAdapterInfo(c.Struct): + SIZE = 96 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] + vendor: struct_WGPUStringView + architecture: struct_WGPUStringView + device: struct_WGPUStringView + description: struct_WGPUStringView + backendType: int + adapterType: int + vendorID: int + deviceID: int + compatibilityMode: int +enum_WGPUAdapterType: dict[int, str] = {(WGPUAdapterType_DiscreteGPU:=1): 'WGPUAdapterType_DiscreteGPU', (WGPUAdapterType_IntegratedGPU:=2): 'WGPUAdapterType_IntegratedGPU', (WGPUAdapterType_CPU:=3): 'WGPUAdapterType_CPU', (WGPUAdapterType_Unknown:=4): 'WGPUAdapterType_Unknown', (WGPUAdapterType_Force32:=2147483647): 'WGPUAdapterType_Force32'} +WGPUAdapterType: TypeAlias = ctypes.c_uint32 +struct_WGPUAdapterInfo.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0), ('vendor', WGPUStringView, 8), ('architecture', WGPUStringView, 24), ('device', WGPUStringView, 40), ('description', WGPUStringView, 56), ('backendType', WGPUBackendType, 72), ('adapterType', WGPUAdapterType, 76), ('vendorID', uint32_t, 80), ('deviceID', uint32_t, 84), ('compatibilityMode', WGPUBool, 88)]) +@c.record +class struct_WGPUAdapterPropertiesMemoryHeaps(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStructOut + heapCount: int + heapInfo: c.POINTER[struct_WGPUMemoryHeapInfo] +WGPUMemoryHeapInfo: TypeAlias = struct_WGPUMemoryHeapInfo +struct_WGPUAdapterPropertiesMemoryHeaps.register_fields([('chain', WGPUChainedStructOut, 0), ('heapCount', size_t, 16), ('heapInfo', c.POINTER[WGPUMemoryHeapInfo], 24)]) +@c.record +class struct_WGPUBindGroupDescriptor(c.Struct): + SIZE = 48 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + layout: c.POINTER[struct_WGPUBindGroupLayoutImpl] + entryCount: int + entries: c.POINTER[struct_WGPUBindGroupEntry] +WGPUBindGroupEntry: TypeAlias = struct_WGPUBindGroupEntry +struct_WGPUBindGroupDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('layout', WGPUBindGroupLayout, 24), ('entryCount', size_t, 32), ('entries', c.POINTER[WGPUBindGroupEntry], 40)]) +@c.record +class struct_WGPUBindGroupLayoutEntry(c.Struct): + SIZE = 112 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + binding: int + visibility: int + buffer: struct_WGPUBufferBindingLayout + sampler: struct_WGPUSamplerBindingLayout + texture: struct_WGPUTextureBindingLayout + storageTexture: struct_WGPUStorageTextureBindingLayout +WGPUShaderStage: TypeAlias = ctypes.c_uint64 +WGPUBufferBindingLayout: TypeAlias = struct_WGPUBufferBindingLayout +WGPUSamplerBindingLayout: TypeAlias = struct_WGPUSamplerBindingLayout +WGPUTextureBindingLayout: TypeAlias = struct_WGPUTextureBindingLayout +WGPUStorageTextureBindingLayout: TypeAlias = struct_WGPUStorageTextureBindingLayout +struct_WGPUBindGroupLayoutEntry.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('binding', uint32_t, 8), ('visibility', WGPUShaderStage, 16), ('buffer', WGPUBufferBindingLayout, 24), ('sampler', WGPUSamplerBindingLayout, 48), ('texture', WGPUTextureBindingLayout, 64), ('storageTexture', WGPUStorageTextureBindingLayout, 88)]) +@c.record +class struct_WGPUBlendState(c.Struct): + SIZE = 24 + color: struct_WGPUBlendComponent + alpha: struct_WGPUBlendComponent +WGPUBlendComponent: TypeAlias = struct_WGPUBlendComponent +struct_WGPUBlendState.register_fields([('color', WGPUBlendComponent, 0), ('alpha', WGPUBlendComponent, 12)]) +@c.record +class struct_WGPUBufferDescriptor(c.Struct): + SIZE = 48 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + usage: int + size: int + mappedAtCreation: int +struct_WGPUBufferDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('usage', WGPUBufferUsage, 24), ('size', uint64_t, 32), ('mappedAtCreation', WGPUBool, 40)]) +@c.record +class struct_WGPUCommandBufferDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPUCommandBufferDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPUCommandEncoderDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPUCommandEncoderDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPUComputePassDescriptor(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + timestampWrites: c.POINTER[struct_WGPUComputePassTimestampWrites] +WGPUComputePassTimestampWrites: TypeAlias = struct_WGPUComputePassTimestampWrites +struct_WGPUComputePassDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('timestampWrites', c.POINTER[WGPUComputePassTimestampWrites], 24)]) +@c.record +class struct_WGPUConstantEntry(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + key: struct_WGPUStringView + value: float +struct_WGPUConstantEntry.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('key', WGPUStringView, 8), ('value', ctypes.c_double, 24)]) +@c.record +class struct_WGPUDawnCacheDeviceDescriptor(c.Struct): + SIZE = 56 + chain: struct_WGPUChainedStruct + isolationKey: struct_WGPUStringView + loadDataFunction: c.CFUNCTYPE[ctypes.c_uint64, [ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p]] + storeDataFunction: c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p]] + functionUserdata: ctypes.c_void_p +WGPUDawnLoadCacheDataFunction: TypeAlias = c.CFUNCTYPE[ctypes.c_uint64, [ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p]] +WGPUDawnStoreCacheDataFunction: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p, ctypes.c_uint64, ctypes.c_void_p]] +struct_WGPUDawnCacheDeviceDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('isolationKey', WGPUStringView, 16), ('loadDataFunction', WGPUDawnLoadCacheDataFunction, 32), ('storeDataFunction', WGPUDawnStoreCacheDataFunction, 40), ('functionUserdata', ctypes.c_void_p, 48)]) +@c.record +class struct_WGPUDepthStencilState(c.Struct): + SIZE = 72 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + format: int + depthWriteEnabled: int + depthCompare: int + stencilFront: struct_WGPUStencilFaceState + stencilBack: struct_WGPUStencilFaceState + stencilReadMask: int + stencilWriteMask: int + depthBias: int + depthBiasSlopeScale: float + depthBiasClamp: float +enum_WGPUOptionalBool: dict[int, str] = {(WGPUOptionalBool_False:=0): 'WGPUOptionalBool_False', (WGPUOptionalBool_True:=1): 'WGPUOptionalBool_True', (WGPUOptionalBool_Undefined:=2): 'WGPUOptionalBool_Undefined', (WGPUOptionalBool_Force32:=2147483647): 'WGPUOptionalBool_Force32'} +WGPUOptionalBool: TypeAlias = ctypes.c_uint32 +WGPUStencilFaceState: TypeAlias = struct_WGPUStencilFaceState +struct_WGPUDepthStencilState.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('format', WGPUTextureFormat, 8), ('depthWriteEnabled', WGPUOptionalBool, 12), ('depthCompare', WGPUCompareFunction, 16), ('stencilFront', WGPUStencilFaceState, 20), ('stencilBack', WGPUStencilFaceState, 36), ('stencilReadMask', uint32_t, 52), ('stencilWriteMask', uint32_t, 56), ('depthBias', int32_t, 60), ('depthBiasSlopeScale', ctypes.c_float, 64), ('depthBiasClamp', ctypes.c_float, 68)]) +@c.record +class struct_WGPUDrmFormatCapabilities(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStructOut + propertiesCount: int + properties: c.POINTER[struct_WGPUDrmFormatProperties] +WGPUDrmFormatProperties: TypeAlias = struct_WGPUDrmFormatProperties +struct_WGPUDrmFormatCapabilities.register_fields([('chain', WGPUChainedStructOut, 0), ('propertiesCount', size_t, 16), ('properties', c.POINTER[WGPUDrmFormatProperties], 24)]) +@c.record +class struct_WGPUExternalTextureDescriptor(c.Struct): + SIZE = 112 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + plane0: c.POINTER[struct_WGPUTextureViewImpl] + plane1: c.POINTER[struct_WGPUTextureViewImpl] + cropOrigin: struct_WGPUOrigin2D + cropSize: struct_WGPUExtent2D + apparentSize: struct_WGPUExtent2D + doYuvToRgbConversionOnly: int + yuvToRgbConversionMatrix: c.POINTER[ctypes.c_float] + srcTransferFunctionParameters: c.POINTER[ctypes.c_float] + dstTransferFunctionParameters: c.POINTER[ctypes.c_float] + gamutConversionMatrix: c.POINTER[ctypes.c_float] + mirrored: int + rotation: int +WGPUOrigin2D: TypeAlias = struct_WGPUOrigin2D +WGPUExtent2D: TypeAlias = struct_WGPUExtent2D +enum_WGPUExternalTextureRotation: dict[int, str] = {(WGPUExternalTextureRotation_Rotate0Degrees:=1): 'WGPUExternalTextureRotation_Rotate0Degrees', (WGPUExternalTextureRotation_Rotate90Degrees:=2): 'WGPUExternalTextureRotation_Rotate90Degrees', (WGPUExternalTextureRotation_Rotate180Degrees:=3): 'WGPUExternalTextureRotation_Rotate180Degrees', (WGPUExternalTextureRotation_Rotate270Degrees:=4): 'WGPUExternalTextureRotation_Rotate270Degrees', (WGPUExternalTextureRotation_Force32:=2147483647): 'WGPUExternalTextureRotation_Force32'} +WGPUExternalTextureRotation: TypeAlias = ctypes.c_uint32 +struct_WGPUExternalTextureDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('plane0', WGPUTextureView, 24), ('plane1', WGPUTextureView, 32), ('cropOrigin', WGPUOrigin2D, 40), ('cropSize', WGPUExtent2D, 48), ('apparentSize', WGPUExtent2D, 56), ('doYuvToRgbConversionOnly', WGPUBool, 64), ('yuvToRgbConversionMatrix', c.POINTER[ctypes.c_float], 72), ('srcTransferFunctionParameters', c.POINTER[ctypes.c_float], 80), ('dstTransferFunctionParameters', c.POINTER[ctypes.c_float], 88), ('gamutConversionMatrix', c.POINTER[ctypes.c_float], 96), ('mirrored', WGPUBool, 104), ('rotation', WGPUExternalTextureRotation, 108)]) +@c.record +class struct_WGPUFutureWaitInfo(c.Struct): + SIZE = 16 + future: struct_WGPUFuture + completed: int +WGPUFuture: TypeAlias = struct_WGPUFuture +struct_WGPUFutureWaitInfo.register_fields([('future', WGPUFuture, 0), ('completed', WGPUBool, 8)]) +@c.record +class struct_WGPUImageCopyBuffer(c.Struct): + SIZE = 32 + layout: struct_WGPUTextureDataLayout + buffer: c.POINTER[struct_WGPUBufferImpl] +WGPUTextureDataLayout: TypeAlias = struct_WGPUTextureDataLayout +struct_WGPUImageCopyBuffer.register_fields([('layout', WGPUTextureDataLayout, 0), ('buffer', WGPUBuffer, 24)]) +@c.record +class struct_WGPUImageCopyExternalTexture(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + externalTexture: c.POINTER[struct_WGPUExternalTextureImpl] + origin: struct_WGPUOrigin3D + naturalSize: struct_WGPUExtent2D +WGPUOrigin3D: TypeAlias = struct_WGPUOrigin3D +struct_WGPUImageCopyExternalTexture.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('externalTexture', WGPUExternalTexture, 8), ('origin', WGPUOrigin3D, 16), ('naturalSize', WGPUExtent2D, 28)]) +@c.record +class struct_WGPUImageCopyTexture(c.Struct): + SIZE = 32 + texture: c.POINTER[struct_WGPUTextureImpl] + mipLevel: int + origin: struct_WGPUOrigin3D + aspect: int +enum_WGPUTextureAspect: dict[int, str] = {(WGPUTextureAspect_Undefined:=0): 'WGPUTextureAspect_Undefined', (WGPUTextureAspect_All:=1): 'WGPUTextureAspect_All', (WGPUTextureAspect_StencilOnly:=2): 'WGPUTextureAspect_StencilOnly', (WGPUTextureAspect_DepthOnly:=3): 'WGPUTextureAspect_DepthOnly', (WGPUTextureAspect_Plane0Only:=327680): 'WGPUTextureAspect_Plane0Only', (WGPUTextureAspect_Plane1Only:=327681): 'WGPUTextureAspect_Plane1Only', (WGPUTextureAspect_Plane2Only:=327682): 'WGPUTextureAspect_Plane2Only', (WGPUTextureAspect_Force32:=2147483647): 'WGPUTextureAspect_Force32'} +WGPUTextureAspect: TypeAlias = ctypes.c_uint32 +struct_WGPUImageCopyTexture.register_fields([('texture', WGPUTexture, 0), ('mipLevel', uint32_t, 8), ('origin', WGPUOrigin3D, 12), ('aspect', WGPUTextureAspect, 24)]) +@c.record +class struct_WGPUInstanceDescriptor(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + features: struct_WGPUInstanceFeatures +WGPUInstanceFeatures: TypeAlias = struct_WGPUInstanceFeatures +struct_WGPUInstanceDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('features', WGPUInstanceFeatures, 8)]) +@c.record +class struct_WGPUPipelineLayoutDescriptor(c.Struct): + SIZE = 48 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + bindGroupLayoutCount: int + bindGroupLayouts: c.POINTER[c.POINTER[struct_WGPUBindGroupLayoutImpl]] + immediateDataRangeByteSize: int +struct_WGPUPipelineLayoutDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('bindGroupLayoutCount', size_t, 24), ('bindGroupLayouts', c.POINTER[WGPUBindGroupLayout], 32), ('immediateDataRangeByteSize', uint32_t, 40)]) +@c.record +class struct_WGPUPipelineLayoutPixelLocalStorage(c.Struct): + SIZE = 40 + chain: struct_WGPUChainedStruct + totalPixelLocalStorageSize: int + storageAttachmentCount: int + storageAttachments: c.POINTER[struct_WGPUPipelineLayoutStorageAttachment] +WGPUPipelineLayoutStorageAttachment: TypeAlias = struct_WGPUPipelineLayoutStorageAttachment +struct_WGPUPipelineLayoutPixelLocalStorage.register_fields([('chain', WGPUChainedStruct, 0), ('totalPixelLocalStorageSize', uint64_t, 16), ('storageAttachmentCount', size_t, 24), ('storageAttachments', c.POINTER[WGPUPipelineLayoutStorageAttachment], 32)]) +@c.record +class struct_WGPUQuerySetDescriptor(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + type: int + count: int +enum_WGPUQueryType: dict[int, str] = {(WGPUQueryType_Occlusion:=1): 'WGPUQueryType_Occlusion', (WGPUQueryType_Timestamp:=2): 'WGPUQueryType_Timestamp', (WGPUQueryType_Force32:=2147483647): 'WGPUQueryType_Force32'} +WGPUQueryType: TypeAlias = ctypes.c_uint32 +struct_WGPUQuerySetDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('type', WGPUQueryType, 24), ('count', uint32_t, 28)]) +@c.record +class struct_WGPUQueueDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPUQueueDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPURenderBundleDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPURenderBundleDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPURenderBundleEncoderDescriptor(c.Struct): + SIZE = 56 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + colorFormatCount: int + colorFormats: c.POINTER[ctypes.c_uint32] + depthStencilFormat: int + sampleCount: int + depthReadOnly: int + stencilReadOnly: int +struct_WGPURenderBundleEncoderDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('colorFormatCount', size_t, 24), ('colorFormats', c.POINTER[WGPUTextureFormat], 32), ('depthStencilFormat', WGPUTextureFormat, 40), ('sampleCount', uint32_t, 44), ('depthReadOnly', WGPUBool, 48), ('stencilReadOnly', WGPUBool, 52)]) +@c.record +class struct_WGPURenderPassColorAttachment(c.Struct): + SIZE = 72 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + view: c.POINTER[struct_WGPUTextureViewImpl] + depthSlice: int + resolveTarget: c.POINTER[struct_WGPUTextureViewImpl] + loadOp: int + storeOp: int + clearValue: struct_WGPUColor +WGPUColor: TypeAlias = struct_WGPUColor +struct_WGPURenderPassColorAttachment.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('view', WGPUTextureView, 8), ('depthSlice', uint32_t, 16), ('resolveTarget', WGPUTextureView, 24), ('loadOp', WGPULoadOp, 32), ('storeOp', WGPUStoreOp, 36), ('clearValue', WGPUColor, 40)]) +@c.record +class struct_WGPURenderPassStorageAttachment(c.Struct): + SIZE = 64 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + offset: int + storage: c.POINTER[struct_WGPUTextureViewImpl] + loadOp: int + storeOp: int + clearValue: struct_WGPUColor +struct_WGPURenderPassStorageAttachment.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('offset', uint64_t, 8), ('storage', WGPUTextureView, 16), ('loadOp', WGPULoadOp, 24), ('storeOp', WGPUStoreOp, 28), ('clearValue', WGPUColor, 32)]) +@c.record +class struct_WGPURequiredLimits(c.Struct): + SIZE = 168 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + limits: struct_WGPULimits +WGPULimits: TypeAlias = struct_WGPULimits +struct_WGPURequiredLimits.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('limits', WGPULimits, 8)]) +@c.record +class struct_WGPUSamplerDescriptor(c.Struct): + SIZE = 64 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + addressModeU: int + addressModeV: int + addressModeW: int + magFilter: int + minFilter: int + mipmapFilter: int + lodMinClamp: float + lodMaxClamp: float + compare: int + maxAnisotropy: int +enum_WGPUAddressMode: dict[int, str] = {(WGPUAddressMode_Undefined:=0): 'WGPUAddressMode_Undefined', (WGPUAddressMode_ClampToEdge:=1): 'WGPUAddressMode_ClampToEdge', (WGPUAddressMode_Repeat:=2): 'WGPUAddressMode_Repeat', (WGPUAddressMode_MirrorRepeat:=3): 'WGPUAddressMode_MirrorRepeat', (WGPUAddressMode_Force32:=2147483647): 'WGPUAddressMode_Force32'} +WGPUAddressMode: TypeAlias = ctypes.c_uint32 +enum_WGPUMipmapFilterMode: dict[int, str] = {(WGPUMipmapFilterMode_Undefined:=0): 'WGPUMipmapFilterMode_Undefined', (WGPUMipmapFilterMode_Nearest:=1): 'WGPUMipmapFilterMode_Nearest', (WGPUMipmapFilterMode_Linear:=2): 'WGPUMipmapFilterMode_Linear', (WGPUMipmapFilterMode_Force32:=2147483647): 'WGPUMipmapFilterMode_Force32'} +WGPUMipmapFilterMode: TypeAlias = ctypes.c_uint32 +uint16_t: TypeAlias = ctypes.c_uint16 +struct_WGPUSamplerDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('addressModeU', WGPUAddressMode, 24), ('addressModeV', WGPUAddressMode, 28), ('addressModeW', WGPUAddressMode, 32), ('magFilter', WGPUFilterMode, 36), ('minFilter', WGPUFilterMode, 40), ('mipmapFilter', WGPUMipmapFilterMode, 44), ('lodMinClamp', ctypes.c_float, 48), ('lodMaxClamp', ctypes.c_float, 52), ('compare', WGPUCompareFunction, 56), ('maxAnisotropy', uint16_t, 60)]) +@c.record +class struct_WGPUShaderModuleDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPUShaderModuleDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPUShaderSourceWGSL(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + code: struct_WGPUStringView +struct_WGPUShaderSourceWGSL.register_fields([('chain', WGPUChainedStruct, 0), ('code', WGPUStringView, 16)]) +@c.record +class struct_WGPUSharedBufferMemoryDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPUSharedBufferMemoryDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPUSharedFenceDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPUSharedFenceDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPUSharedTextureMemoryAHardwareBufferProperties(c.Struct): + SIZE = 88 + chain: struct_WGPUChainedStructOut + yCbCrInfo: struct_WGPUYCbCrVkDescriptor +struct_WGPUSharedTextureMemoryAHardwareBufferProperties.register_fields([('chain', WGPUChainedStructOut, 0), ('yCbCrInfo', WGPUYCbCrVkDescriptor, 16)]) +@c.record +class struct_WGPUSharedTextureMemoryDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPUSharedTextureMemoryDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPUSharedTextureMemoryDmaBufDescriptor(c.Struct): + SIZE = 56 + chain: struct_WGPUChainedStruct + size: struct_WGPUExtent3D + drmFormat: int + drmModifier: int + planeCount: int + planes: c.POINTER[struct_WGPUSharedTextureMemoryDmaBufPlane] +WGPUExtent3D: TypeAlias = struct_WGPUExtent3D +WGPUSharedTextureMemoryDmaBufPlane: TypeAlias = struct_WGPUSharedTextureMemoryDmaBufPlane +struct_WGPUSharedTextureMemoryDmaBufDescriptor.register_fields([('chain', WGPUChainedStruct, 0), ('size', WGPUExtent3D, 16), ('drmFormat', uint32_t, 28), ('drmModifier', uint64_t, 32), ('planeCount', size_t, 40), ('planes', c.POINTER[WGPUSharedTextureMemoryDmaBufPlane], 48)]) +@c.record +class struct_WGPUSharedTextureMemoryProperties(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] + usage: int + size: struct_WGPUExtent3D + format: int +struct_WGPUSharedTextureMemoryProperties.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0), ('usage', WGPUTextureUsage, 8), ('size', WGPUExtent3D, 16), ('format', WGPUTextureFormat, 28)]) +@c.record +class struct_WGPUSupportedLimits(c.Struct): + SIZE = 168 + nextInChain: c.POINTER[struct_WGPUChainedStructOut] + limits: struct_WGPULimits +struct_WGPUSupportedLimits.register_fields([('nextInChain', c.POINTER[WGPUChainedStructOut], 0), ('limits', WGPULimits, 8)]) +@c.record +class struct_WGPUSurfaceDescriptor(c.Struct): + SIZE = 24 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView +struct_WGPUSurfaceDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8)]) +@c.record +class struct_WGPUSurfaceSourceCanvasHTMLSelector_Emscripten(c.Struct): + SIZE = 32 + chain: struct_WGPUChainedStruct + selector: struct_WGPUStringView +struct_WGPUSurfaceSourceCanvasHTMLSelector_Emscripten.register_fields([('chain', WGPUChainedStruct, 0), ('selector', WGPUStringView, 16)]) +@c.record +class struct_WGPUTextureDescriptor(c.Struct): + SIZE = 80 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + usage: int + dimension: int + size: struct_WGPUExtent3D + format: int + mipLevelCount: int + sampleCount: int + viewFormatCount: int + viewFormats: c.POINTER[ctypes.c_uint32] +enum_WGPUTextureDimension: dict[int, str] = {(WGPUTextureDimension_Undefined:=0): 'WGPUTextureDimension_Undefined', (WGPUTextureDimension_1D:=1): 'WGPUTextureDimension_1D', (WGPUTextureDimension_2D:=2): 'WGPUTextureDimension_2D', (WGPUTextureDimension_3D:=3): 'WGPUTextureDimension_3D', (WGPUTextureDimension_Force32:=2147483647): 'WGPUTextureDimension_Force32'} +WGPUTextureDimension: TypeAlias = ctypes.c_uint32 +struct_WGPUTextureDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('usage', WGPUTextureUsage, 24), ('dimension', WGPUTextureDimension, 32), ('size', WGPUExtent3D, 36), ('format', WGPUTextureFormat, 48), ('mipLevelCount', uint32_t, 52), ('sampleCount', uint32_t, 56), ('viewFormatCount', size_t, 64), ('viewFormats', c.POINTER[WGPUTextureFormat], 72)]) +@c.record +class struct_WGPUTextureViewDescriptor(c.Struct): + SIZE = 64 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + format: int + dimension: int + baseMipLevel: int + mipLevelCount: int + baseArrayLayer: int + arrayLayerCount: int + aspect: int + usage: int +struct_WGPUTextureViewDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('format', WGPUTextureFormat, 24), ('dimension', WGPUTextureViewDimension, 28), ('baseMipLevel', uint32_t, 32), ('mipLevelCount', uint32_t, 36), ('baseArrayLayer', uint32_t, 40), ('arrayLayerCount', uint32_t, 44), ('aspect', WGPUTextureAspect, 48), ('usage', WGPUTextureUsage, 56)]) +@c.record +class struct_WGPUVertexBufferLayout(c.Struct): + SIZE = 32 + arrayStride: int + stepMode: int + attributeCount: int + attributes: c.POINTER[struct_WGPUVertexAttribute] +enum_WGPUVertexStepMode: dict[int, str] = {(WGPUVertexStepMode_Undefined:=0): 'WGPUVertexStepMode_Undefined', (WGPUVertexStepMode_Vertex:=1): 'WGPUVertexStepMode_Vertex', (WGPUVertexStepMode_Instance:=2): 'WGPUVertexStepMode_Instance', (WGPUVertexStepMode_Force32:=2147483647): 'WGPUVertexStepMode_Force32'} +WGPUVertexStepMode: TypeAlias = ctypes.c_uint32 +WGPUVertexAttribute: TypeAlias = struct_WGPUVertexAttribute +struct_WGPUVertexBufferLayout.register_fields([('arrayStride', uint64_t, 0), ('stepMode', WGPUVertexStepMode, 8), ('attributeCount', size_t, 16), ('attributes', c.POINTER[WGPUVertexAttribute], 24)]) +@c.record +class struct_WGPUBindGroupLayoutDescriptor(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + entryCount: int + entries: c.POINTER[struct_WGPUBindGroupLayoutEntry] +WGPUBindGroupLayoutEntry: TypeAlias = struct_WGPUBindGroupLayoutEntry +struct_WGPUBindGroupLayoutDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('entryCount', size_t, 24), ('entries', c.POINTER[WGPUBindGroupLayoutEntry], 32)]) +@c.record +class struct_WGPUColorTargetState(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + format: int + blend: c.POINTER[struct_WGPUBlendState] + writeMask: int +WGPUBlendState: TypeAlias = struct_WGPUBlendState +WGPUColorWriteMask: TypeAlias = ctypes.c_uint64 +struct_WGPUColorTargetState.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('format', WGPUTextureFormat, 8), ('blend', c.POINTER[WGPUBlendState], 16), ('writeMask', WGPUColorWriteMask, 24)]) +@c.record +class struct_WGPUComputeState(c.Struct): + SIZE = 48 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + module: c.POINTER[struct_WGPUShaderModuleImpl] + entryPoint: struct_WGPUStringView + constantCount: int + constants: c.POINTER[struct_WGPUConstantEntry] +WGPUConstantEntry: TypeAlias = struct_WGPUConstantEntry +struct_WGPUComputeState.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('module', WGPUShaderModule, 8), ('entryPoint', WGPUStringView, 16), ('constantCount', size_t, 32), ('constants', c.POINTER[WGPUConstantEntry], 40)]) +@c.record +class struct_WGPUDeviceDescriptor(c.Struct): + SIZE = 144 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + requiredFeatureCount: int + requiredFeatures: c.POINTER[ctypes.c_uint32] + requiredLimits: c.POINTER[struct_WGPURequiredLimits] + defaultQueue: struct_WGPUQueueDescriptor + deviceLostCallbackInfo2: struct_WGPUDeviceLostCallbackInfo2 + uncapturedErrorCallbackInfo2: struct_WGPUUncapturedErrorCallbackInfo2 +WGPURequiredLimits: TypeAlias = struct_WGPURequiredLimits +WGPUQueueDescriptor: TypeAlias = struct_WGPUQueueDescriptor +@c.record +class struct_WGPUDeviceLostCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [c.POINTER[c.POINTER[struct_WGPUDeviceImpl]], ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +WGPUDeviceLostCallbackInfo2: TypeAlias = struct_WGPUDeviceLostCallbackInfo2 +WGPUDeviceLostCallback2: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[c.POINTER[struct_WGPUDeviceImpl]], ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] +struct_WGPUDeviceLostCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUDeviceLostCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +@c.record +class struct_WGPUUncapturedErrorCallbackInfo2(c.Struct): + SIZE = 32 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + callback: c.CFUNCTYPE[None, [c.POINTER[c.POINTER[struct_WGPUDeviceImpl]], ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +WGPUUncapturedErrorCallbackInfo2: TypeAlias = struct_WGPUUncapturedErrorCallbackInfo2 +WGPUUncapturedErrorCallback: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[c.POINTER[struct_WGPUDeviceImpl]], ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] +struct_WGPUUncapturedErrorCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('callback', WGPUUncapturedErrorCallback, 8), ('userdata1', ctypes.c_void_p, 16), ('userdata2', ctypes.c_void_p, 24)]) +struct_WGPUDeviceDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('requiredFeatureCount', size_t, 24), ('requiredFeatures', c.POINTER[WGPUFeatureName], 32), ('requiredLimits', c.POINTER[WGPURequiredLimits], 40), ('defaultQueue', WGPUQueueDescriptor, 48), ('deviceLostCallbackInfo2', WGPUDeviceLostCallbackInfo2, 72), ('uncapturedErrorCallbackInfo2', WGPUUncapturedErrorCallbackInfo2, 112)]) +@c.record +class struct_WGPURenderPassDescriptor(c.Struct): + SIZE = 64 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + colorAttachmentCount: int + colorAttachments: c.POINTER[struct_WGPURenderPassColorAttachment] + depthStencilAttachment: c.POINTER[struct_WGPURenderPassDepthStencilAttachment] + occlusionQuerySet: c.POINTER[struct_WGPUQuerySetImpl] + timestampWrites: c.POINTER[struct_WGPURenderPassTimestampWrites] +WGPURenderPassColorAttachment: TypeAlias = struct_WGPURenderPassColorAttachment +WGPURenderPassDepthStencilAttachment: TypeAlias = struct_WGPURenderPassDepthStencilAttachment +WGPURenderPassTimestampWrites: TypeAlias = struct_WGPURenderPassTimestampWrites +struct_WGPURenderPassDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('colorAttachmentCount', size_t, 24), ('colorAttachments', c.POINTER[WGPURenderPassColorAttachment], 32), ('depthStencilAttachment', c.POINTER[WGPURenderPassDepthStencilAttachment], 40), ('occlusionQuerySet', WGPUQuerySet, 48), ('timestampWrites', c.POINTER[WGPURenderPassTimestampWrites], 56)]) +@c.record +class struct_WGPURenderPassPixelLocalStorage(c.Struct): + SIZE = 40 + chain: struct_WGPUChainedStruct + totalPixelLocalStorageSize: int + storageAttachmentCount: int + storageAttachments: c.POINTER[struct_WGPURenderPassStorageAttachment] +WGPURenderPassStorageAttachment: TypeAlias = struct_WGPURenderPassStorageAttachment +struct_WGPURenderPassPixelLocalStorage.register_fields([('chain', WGPUChainedStruct, 0), ('totalPixelLocalStorageSize', uint64_t, 16), ('storageAttachmentCount', size_t, 24), ('storageAttachments', c.POINTER[WGPURenderPassStorageAttachment], 32)]) +@c.record +class struct_WGPUVertexState(c.Struct): + SIZE = 64 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + module: c.POINTER[struct_WGPUShaderModuleImpl] + entryPoint: struct_WGPUStringView + constantCount: int + constants: c.POINTER[struct_WGPUConstantEntry] + bufferCount: int + buffers: c.POINTER[struct_WGPUVertexBufferLayout] +WGPUVertexBufferLayout: TypeAlias = struct_WGPUVertexBufferLayout +struct_WGPUVertexState.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('module', WGPUShaderModule, 8), ('entryPoint', WGPUStringView, 16), ('constantCount', size_t, 32), ('constants', c.POINTER[WGPUConstantEntry], 40), ('bufferCount', size_t, 48), ('buffers', c.POINTER[WGPUVertexBufferLayout], 56)]) +@c.record +class struct_WGPUComputePipelineDescriptor(c.Struct): + SIZE = 80 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + layout: c.POINTER[struct_WGPUPipelineLayoutImpl] + compute: struct_WGPUComputeState +WGPUComputeState: TypeAlias = struct_WGPUComputeState +struct_WGPUComputePipelineDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('layout', WGPUPipelineLayout, 24), ('compute', WGPUComputeState, 32)]) +@c.record +class struct_WGPUFragmentState(c.Struct): + SIZE = 64 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + module: c.POINTER[struct_WGPUShaderModuleImpl] + entryPoint: struct_WGPUStringView + constantCount: int + constants: c.POINTER[struct_WGPUConstantEntry] + targetCount: int + targets: c.POINTER[struct_WGPUColorTargetState] +WGPUColorTargetState: TypeAlias = struct_WGPUColorTargetState +struct_WGPUFragmentState.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('module', WGPUShaderModule, 8), ('entryPoint', WGPUStringView, 16), ('constantCount', size_t, 32), ('constants', c.POINTER[WGPUConstantEntry], 40), ('targetCount', size_t, 48), ('targets', c.POINTER[WGPUColorTargetState], 56)]) +@c.record +class struct_WGPURenderPipelineDescriptor(c.Struct): + SIZE = 168 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + label: struct_WGPUStringView + layout: c.POINTER[struct_WGPUPipelineLayoutImpl] + vertex: struct_WGPUVertexState + primitive: struct_WGPUPrimitiveState + depthStencil: c.POINTER[struct_WGPUDepthStencilState] + multisample: struct_WGPUMultisampleState + fragment: c.POINTER[struct_WGPUFragmentState] +WGPUVertexState: TypeAlias = struct_WGPUVertexState +WGPUPrimitiveState: TypeAlias = struct_WGPUPrimitiveState +WGPUDepthStencilState: TypeAlias = struct_WGPUDepthStencilState +WGPUMultisampleState: TypeAlias = struct_WGPUMultisampleState +WGPUFragmentState: TypeAlias = struct_WGPUFragmentState +struct_WGPURenderPipelineDescriptor.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('label', WGPUStringView, 8), ('layout', WGPUPipelineLayout, 24), ('vertex', WGPUVertexState, 32), ('primitive', WGPUPrimitiveState, 96), ('depthStencil', c.POINTER[WGPUDepthStencilState], 128), ('multisample', WGPUMultisampleState, 136), ('fragment', c.POINTER[WGPUFragmentState], 160)]) +enum_WGPUWGSLFeatureName: dict[int, str] = {(WGPUWGSLFeatureName_ReadonlyAndReadwriteStorageTextures:=1): 'WGPUWGSLFeatureName_ReadonlyAndReadwriteStorageTextures', (WGPUWGSLFeatureName_Packed4x8IntegerDotProduct:=2): 'WGPUWGSLFeatureName_Packed4x8IntegerDotProduct', (WGPUWGSLFeatureName_UnrestrictedPointerParameters:=3): 'WGPUWGSLFeatureName_UnrestrictedPointerParameters', (WGPUWGSLFeatureName_PointerCompositeAccess:=4): 'WGPUWGSLFeatureName_PointerCompositeAccess', (WGPUWGSLFeatureName_ChromiumTestingUnimplemented:=327680): 'WGPUWGSLFeatureName_ChromiumTestingUnimplemented', (WGPUWGSLFeatureName_ChromiumTestingUnsafeExperimental:=327681): 'WGPUWGSLFeatureName_ChromiumTestingUnsafeExperimental', (WGPUWGSLFeatureName_ChromiumTestingExperimental:=327682): 'WGPUWGSLFeatureName_ChromiumTestingExperimental', (WGPUWGSLFeatureName_ChromiumTestingShippedWithKillswitch:=327683): 'WGPUWGSLFeatureName_ChromiumTestingShippedWithKillswitch', (WGPUWGSLFeatureName_ChromiumTestingShipped:=327684): 'WGPUWGSLFeatureName_ChromiumTestingShipped', (WGPUWGSLFeatureName_Force32:=2147483647): 'WGPUWGSLFeatureName_Force32'} +WGPUWGSLFeatureName: TypeAlias = ctypes.c_uint32 +WGPUBufferMapAsyncStatus: TypeAlias = ctypes.c_uint32 +enum_WGPUBufferMapState: dict[int, str] = {(WGPUBufferMapState_Unmapped:=1): 'WGPUBufferMapState_Unmapped', (WGPUBufferMapState_Pending:=2): 'WGPUBufferMapState_Pending', (WGPUBufferMapState_Mapped:=3): 'WGPUBufferMapState_Mapped', (WGPUBufferMapState_Force32:=2147483647): 'WGPUBufferMapState_Force32'} +WGPUBufferMapState: TypeAlias = ctypes.c_uint32 +WGPUCompilationInfoRequestStatus: TypeAlias = ctypes.c_uint32 +WGPUCreatePipelineAsyncStatus: TypeAlias = ctypes.c_uint32 +WGPUDeviceLostReason: TypeAlias = ctypes.c_uint32 +enum_WGPUErrorFilter: dict[int, str] = {(WGPUErrorFilter_Validation:=1): 'WGPUErrorFilter_Validation', (WGPUErrorFilter_OutOfMemory:=2): 'WGPUErrorFilter_OutOfMemory', (WGPUErrorFilter_Internal:=3): 'WGPUErrorFilter_Internal', (WGPUErrorFilter_Force32:=2147483647): 'WGPUErrorFilter_Force32'} +WGPUErrorFilter: TypeAlias = ctypes.c_uint32 +WGPUErrorType: TypeAlias = ctypes.c_uint32 +enum_WGPULoggingType: dict[int, str] = {(WGPULoggingType_Verbose:=1): 'WGPULoggingType_Verbose', (WGPULoggingType_Info:=2): 'WGPULoggingType_Info', (WGPULoggingType_Warning:=3): 'WGPULoggingType_Warning', (WGPULoggingType_Error:=4): 'WGPULoggingType_Error', (WGPULoggingType_Force32:=2147483647): 'WGPULoggingType_Force32'} +WGPULoggingType: TypeAlias = ctypes.c_uint32 +enum_WGPUMapAsyncStatus: dict[int, str] = {(WGPUMapAsyncStatus_Success:=1): 'WGPUMapAsyncStatus_Success', (WGPUMapAsyncStatus_InstanceDropped:=2): 'WGPUMapAsyncStatus_InstanceDropped', (WGPUMapAsyncStatus_Error:=3): 'WGPUMapAsyncStatus_Error', (WGPUMapAsyncStatus_Aborted:=4): 'WGPUMapAsyncStatus_Aborted', (WGPUMapAsyncStatus_Unknown:=5): 'WGPUMapAsyncStatus_Unknown', (WGPUMapAsyncStatus_Force32:=2147483647): 'WGPUMapAsyncStatus_Force32'} +WGPUMapAsyncStatus: TypeAlias = ctypes.c_uint32 +WGPUPopErrorScopeStatus: TypeAlias = ctypes.c_uint32 +WGPUQueueWorkDoneStatus: TypeAlias = ctypes.c_uint32 +WGPURequestAdapterStatus: TypeAlias = ctypes.c_uint32 +WGPURequestDeviceStatus: TypeAlias = ctypes.c_uint32 +enum_WGPUStatus: dict[int, str] = {(WGPUStatus_Success:=1): 'WGPUStatus_Success', (WGPUStatus_Error:=2): 'WGPUStatus_Error', (WGPUStatus_Force32:=2147483647): 'WGPUStatus_Force32'} +WGPUStatus: TypeAlias = ctypes.c_uint32 +enum_WGPUWaitStatus: dict[int, str] = {(WGPUWaitStatus_Success:=1): 'WGPUWaitStatus_Success', (WGPUWaitStatus_TimedOut:=2): 'WGPUWaitStatus_TimedOut', (WGPUWaitStatus_UnsupportedTimeout:=3): 'WGPUWaitStatus_UnsupportedTimeout', (WGPUWaitStatus_UnsupportedCount:=4): 'WGPUWaitStatus_UnsupportedCount', (WGPUWaitStatus_UnsupportedMixedSources:=5): 'WGPUWaitStatus_UnsupportedMixedSources', (WGPUWaitStatus_Unknown:=6): 'WGPUWaitStatus_Unknown', (WGPUWaitStatus_Force32:=2147483647): 'WGPUWaitStatus_Force32'} +WGPUWaitStatus: TypeAlias = ctypes.c_uint32 +WGPUMapMode: TypeAlias = ctypes.c_uint64 +WGPUDeviceLostCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] +WGPULoggingCallback: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]] +WGPUProc: TypeAlias = c.CFUNCTYPE[None, []] +WGPUBufferMapCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] +WGPUCompilationInfoCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUCompilationInfo], ctypes.c_void_p, ctypes.c_void_p]] +WGPUCreateComputePipelineAsyncCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUComputePipelineImpl], struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] +WGPUCreateRenderPipelineAsyncCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPURenderPipelineImpl], struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] +WGPUPopErrorScopeCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] +WGPUQueueWorkDoneCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p]] +WGPURequestAdapterCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUAdapterImpl], struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] +WGPURequestDeviceCallback2: TypeAlias = c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUDeviceImpl], struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] +@c.record +class struct_WGPUBufferMapCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +struct_WGPUBufferMapCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUBufferMapCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +WGPUBufferMapCallbackInfo2: TypeAlias = struct_WGPUBufferMapCallbackInfo2 +@c.record +class struct_WGPUCompilationInfoCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUCompilationInfo], ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +struct_WGPUCompilationInfoCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUCompilationInfoCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +WGPUCompilationInfoCallbackInfo2: TypeAlias = struct_WGPUCompilationInfoCallbackInfo2 +@c.record +class struct_WGPUCreateComputePipelineAsyncCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUComputePipelineImpl], struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +struct_WGPUCreateComputePipelineAsyncCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUCreateComputePipelineAsyncCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +WGPUCreateComputePipelineAsyncCallbackInfo2: TypeAlias = struct_WGPUCreateComputePipelineAsyncCallbackInfo2 +@c.record +class struct_WGPUCreateRenderPipelineAsyncCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPURenderPipelineImpl], struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +struct_WGPUCreateRenderPipelineAsyncCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUCreateRenderPipelineAsyncCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +WGPUCreateRenderPipelineAsyncCallbackInfo2: TypeAlias = struct_WGPUCreateRenderPipelineAsyncCallbackInfo2 +@c.record +class struct_WGPUPopErrorScopeCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +struct_WGPUPopErrorScopeCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUPopErrorScopeCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +WGPUPopErrorScopeCallbackInfo2: TypeAlias = struct_WGPUPopErrorScopeCallbackInfo2 +@c.record +class struct_WGPUQueueWorkDoneCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +struct_WGPUQueueWorkDoneCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPUQueueWorkDoneCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +WGPUQueueWorkDoneCallbackInfo2: TypeAlias = struct_WGPUQueueWorkDoneCallbackInfo2 +@c.record +class struct_WGPURequestAdapterCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUAdapterImpl], struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +struct_WGPURequestAdapterCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPURequestAdapterCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +WGPURequestAdapterCallbackInfo2: TypeAlias = struct_WGPURequestAdapterCallbackInfo2 +@c.record +class struct_WGPURequestDeviceCallbackInfo2(c.Struct): + SIZE = 40 + nextInChain: c.POINTER[struct_WGPUChainedStruct] + mode: int + callback: c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUDeviceImpl], struct_WGPUStringView, ctypes.c_void_p, ctypes.c_void_p]] + userdata1: ctypes.c_void_p + userdata2: ctypes.c_void_p +struct_WGPURequestDeviceCallbackInfo2.register_fields([('nextInChain', c.POINTER[WGPUChainedStruct], 0), ('mode', WGPUCallbackMode, 8), ('callback', WGPURequestDeviceCallback2, 16), ('userdata1', ctypes.c_void_p, 24), ('userdata2', ctypes.c_void_p, 32)]) +WGPURequestDeviceCallbackInfo2: TypeAlias = struct_WGPURequestDeviceCallbackInfo2 +WGPUINTERNAL__HAVE_EMDAWNWEBGPU_HEADER: TypeAlias = struct_WGPUINTERNAL__HAVE_EMDAWNWEBGPU_HEADER +WGPUAdapterPropertiesD3D: TypeAlias = struct_WGPUAdapterPropertiesD3D +WGPUAdapterPropertiesSubgroups: TypeAlias = struct_WGPUAdapterPropertiesSubgroups +WGPUAdapterPropertiesVk: TypeAlias = struct_WGPUAdapterPropertiesVk +WGPUBufferHostMappedPointer: TypeAlias = struct_WGPUBufferHostMappedPointer +WGPUBufferMapCallbackInfo: TypeAlias = struct_WGPUBufferMapCallbackInfo +WGPUColorTargetStateExpandResolveTextureDawn: TypeAlias = struct_WGPUColorTargetStateExpandResolveTextureDawn +WGPUCompilationInfoCallbackInfo: TypeAlias = struct_WGPUCompilationInfoCallbackInfo +WGPUCopyTextureForBrowserOptions: TypeAlias = struct_WGPUCopyTextureForBrowserOptions +WGPUCreateComputePipelineAsyncCallbackInfo: TypeAlias = struct_WGPUCreateComputePipelineAsyncCallbackInfo +WGPUCreateRenderPipelineAsyncCallbackInfo: TypeAlias = struct_WGPUCreateRenderPipelineAsyncCallbackInfo +WGPUDawnWGSLBlocklist: TypeAlias = struct_WGPUDawnWGSLBlocklist +WGPUDawnAdapterPropertiesPowerPreference: TypeAlias = struct_WGPUDawnAdapterPropertiesPowerPreference +WGPUDawnBufferDescriptorErrorInfoFromWireClient: TypeAlias = struct_WGPUDawnBufferDescriptorErrorInfoFromWireClient +WGPUDawnEncoderInternalUsageDescriptor: TypeAlias = struct_WGPUDawnEncoderInternalUsageDescriptor +WGPUDawnExperimentalImmediateDataLimits: TypeAlias = struct_WGPUDawnExperimentalImmediateDataLimits +WGPUDawnExperimentalSubgroupLimits: TypeAlias = struct_WGPUDawnExperimentalSubgroupLimits +WGPUDawnRenderPassColorAttachmentRenderToSingleSampled: TypeAlias = struct_WGPUDawnRenderPassColorAttachmentRenderToSingleSampled +WGPUDawnShaderModuleSPIRVOptionsDescriptor: TypeAlias = struct_WGPUDawnShaderModuleSPIRVOptionsDescriptor +WGPUDawnTexelCopyBufferRowAlignmentLimits: TypeAlias = struct_WGPUDawnTexelCopyBufferRowAlignmentLimits +WGPUDawnTextureInternalUsageDescriptor: TypeAlias = struct_WGPUDawnTextureInternalUsageDescriptor +WGPUDawnTogglesDescriptor: TypeAlias = struct_WGPUDawnTogglesDescriptor +WGPUDawnWireWGSLControl: TypeAlias = struct_WGPUDawnWireWGSLControl +WGPUDeviceLostCallbackInfo: TypeAlias = struct_WGPUDeviceLostCallbackInfo +WGPUExternalTextureBindingEntry: TypeAlias = struct_WGPUExternalTextureBindingEntry +WGPUExternalTextureBindingLayout: TypeAlias = struct_WGPUExternalTextureBindingLayout +WGPUFormatCapabilities: TypeAlias = struct_WGPUFormatCapabilities +WGPUPopErrorScopeCallbackInfo: TypeAlias = struct_WGPUPopErrorScopeCallbackInfo +WGPUQueueWorkDoneCallbackInfo: TypeAlias = struct_WGPUQueueWorkDoneCallbackInfo +WGPURenderPassDescriptorExpandResolveRect: TypeAlias = struct_WGPURenderPassDescriptorExpandResolveRect +WGPURenderPassMaxDrawCount: TypeAlias = struct_WGPURenderPassMaxDrawCount +WGPURequestAdapterCallbackInfo: TypeAlias = struct_WGPURequestAdapterCallbackInfo +WGPURequestAdapterOptions: TypeAlias = struct_WGPURequestAdapterOptions +WGPURequestDeviceCallbackInfo: TypeAlias = struct_WGPURequestDeviceCallbackInfo +WGPUShaderModuleCompilationOptions: TypeAlias = struct_WGPUShaderModuleCompilationOptions +WGPUShaderSourceSPIRV: TypeAlias = struct_WGPUShaderSourceSPIRV +WGPUSharedBufferMemoryBeginAccessDescriptor: TypeAlias = struct_WGPUSharedBufferMemoryBeginAccessDescriptor +WGPUSharedBufferMemoryEndAccessState: TypeAlias = struct_WGPUSharedBufferMemoryEndAccessState +WGPUSharedBufferMemoryProperties: TypeAlias = struct_WGPUSharedBufferMemoryProperties +WGPUSharedFenceDXGISharedHandleDescriptor: TypeAlias = struct_WGPUSharedFenceDXGISharedHandleDescriptor +WGPUSharedFenceDXGISharedHandleExportInfo: TypeAlias = struct_WGPUSharedFenceDXGISharedHandleExportInfo +WGPUSharedFenceMTLSharedEventDescriptor: TypeAlias = struct_WGPUSharedFenceMTLSharedEventDescriptor +WGPUSharedFenceMTLSharedEventExportInfo: TypeAlias = struct_WGPUSharedFenceMTLSharedEventExportInfo +WGPUSharedFenceExportInfo: TypeAlias = struct_WGPUSharedFenceExportInfo +WGPUSharedFenceSyncFDDescriptor: TypeAlias = struct_WGPUSharedFenceSyncFDDescriptor +WGPUSharedFenceSyncFDExportInfo: TypeAlias = struct_WGPUSharedFenceSyncFDExportInfo +WGPUSharedFenceVkSemaphoreOpaqueFDDescriptor: TypeAlias = struct_WGPUSharedFenceVkSemaphoreOpaqueFDDescriptor +WGPUSharedFenceVkSemaphoreOpaqueFDExportInfo: TypeAlias = struct_WGPUSharedFenceVkSemaphoreOpaqueFDExportInfo +WGPUSharedFenceVkSemaphoreZirconHandleDescriptor: TypeAlias = struct_WGPUSharedFenceVkSemaphoreZirconHandleDescriptor +WGPUSharedFenceVkSemaphoreZirconHandleExportInfo: TypeAlias = struct_WGPUSharedFenceVkSemaphoreZirconHandleExportInfo +WGPUSharedTextureMemoryD3DSwapchainBeginState: TypeAlias = struct_WGPUSharedTextureMemoryD3DSwapchainBeginState +WGPUSharedTextureMemoryDXGISharedHandleDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryDXGISharedHandleDescriptor +WGPUSharedTextureMemoryEGLImageDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryEGLImageDescriptor +WGPUSharedTextureMemoryIOSurfaceDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryIOSurfaceDescriptor +WGPUSharedTextureMemoryAHardwareBufferDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryAHardwareBufferDescriptor +WGPUSharedTextureMemoryBeginAccessDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryBeginAccessDescriptor +WGPUSharedTextureMemoryEndAccessState: TypeAlias = struct_WGPUSharedTextureMemoryEndAccessState +WGPUSharedTextureMemoryOpaqueFDDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryOpaqueFDDescriptor +WGPUSharedTextureMemoryVkDedicatedAllocationDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryVkDedicatedAllocationDescriptor +WGPUSharedTextureMemoryVkImageLayoutBeginState: TypeAlias = struct_WGPUSharedTextureMemoryVkImageLayoutBeginState +WGPUSharedTextureMemoryVkImageLayoutEndState: TypeAlias = struct_WGPUSharedTextureMemoryVkImageLayoutEndState +WGPUSharedTextureMemoryZirconHandleDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryZirconHandleDescriptor +WGPUStaticSamplerBindingLayout: TypeAlias = struct_WGPUStaticSamplerBindingLayout +WGPUSupportedFeatures: TypeAlias = struct_WGPUSupportedFeatures +WGPUSurfaceCapabilities: TypeAlias = struct_WGPUSurfaceCapabilities +WGPUSurfaceConfiguration: TypeAlias = struct_WGPUSurfaceConfiguration +WGPUSurfaceDescriptorFromWindowsCoreWindow: TypeAlias = struct_WGPUSurfaceDescriptorFromWindowsCoreWindow +WGPUSurfaceDescriptorFromWindowsSwapChainPanel: TypeAlias = struct_WGPUSurfaceDescriptorFromWindowsSwapChainPanel +WGPUSurfaceSourceXCBWindow: TypeAlias = struct_WGPUSurfaceSourceXCBWindow +WGPUSurfaceSourceAndroidNativeWindow: TypeAlias = struct_WGPUSurfaceSourceAndroidNativeWindow +WGPUSurfaceSourceMetalLayer: TypeAlias = struct_WGPUSurfaceSourceMetalLayer +WGPUSurfaceSourceWaylandSurface: TypeAlias = struct_WGPUSurfaceSourceWaylandSurface +WGPUSurfaceSourceWindowsHWND: TypeAlias = struct_WGPUSurfaceSourceWindowsHWND +WGPUSurfaceSourceXlibWindow: TypeAlias = struct_WGPUSurfaceSourceXlibWindow +WGPUSurfaceTexture: TypeAlias = struct_WGPUSurfaceTexture +WGPUTextureBindingViewDimensionDescriptor: TypeAlias = struct_WGPUTextureBindingViewDimensionDescriptor +WGPUUncapturedErrorCallbackInfo: TypeAlias = struct_WGPUUncapturedErrorCallbackInfo +WGPUAHardwareBufferProperties: TypeAlias = struct_WGPUAHardwareBufferProperties +WGPUAdapterInfo: TypeAlias = struct_WGPUAdapterInfo +WGPUAdapterPropertiesMemoryHeaps: TypeAlias = struct_WGPUAdapterPropertiesMemoryHeaps +WGPUBindGroupDescriptor: TypeAlias = struct_WGPUBindGroupDescriptor +WGPUBufferDescriptor: TypeAlias = struct_WGPUBufferDescriptor +WGPUCommandBufferDescriptor: TypeAlias = struct_WGPUCommandBufferDescriptor +WGPUCommandEncoderDescriptor: TypeAlias = struct_WGPUCommandEncoderDescriptor +WGPUComputePassDescriptor: TypeAlias = struct_WGPUComputePassDescriptor +WGPUDawnCacheDeviceDescriptor: TypeAlias = struct_WGPUDawnCacheDeviceDescriptor +WGPUDrmFormatCapabilities: TypeAlias = struct_WGPUDrmFormatCapabilities +WGPUExternalTextureDescriptor: TypeAlias = struct_WGPUExternalTextureDescriptor +WGPUFutureWaitInfo: TypeAlias = struct_WGPUFutureWaitInfo +WGPUImageCopyBuffer: TypeAlias = struct_WGPUImageCopyBuffer +WGPUImageCopyExternalTexture: TypeAlias = struct_WGPUImageCopyExternalTexture +WGPUImageCopyTexture: TypeAlias = struct_WGPUImageCopyTexture +WGPUInstanceDescriptor: TypeAlias = struct_WGPUInstanceDescriptor +WGPUPipelineLayoutDescriptor: TypeAlias = struct_WGPUPipelineLayoutDescriptor +WGPUPipelineLayoutPixelLocalStorage: TypeAlias = struct_WGPUPipelineLayoutPixelLocalStorage +WGPUQuerySetDescriptor: TypeAlias = struct_WGPUQuerySetDescriptor +WGPURenderBundleDescriptor: TypeAlias = struct_WGPURenderBundleDescriptor +WGPURenderBundleEncoderDescriptor: TypeAlias = struct_WGPURenderBundleEncoderDescriptor +WGPUSamplerDescriptor: TypeAlias = struct_WGPUSamplerDescriptor +WGPUShaderModuleDescriptor: TypeAlias = struct_WGPUShaderModuleDescriptor +WGPUShaderSourceWGSL: TypeAlias = struct_WGPUShaderSourceWGSL +WGPUSharedBufferMemoryDescriptor: TypeAlias = struct_WGPUSharedBufferMemoryDescriptor +WGPUSharedFenceDescriptor: TypeAlias = struct_WGPUSharedFenceDescriptor +WGPUSharedTextureMemoryAHardwareBufferProperties: TypeAlias = struct_WGPUSharedTextureMemoryAHardwareBufferProperties +WGPUSharedTextureMemoryDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryDescriptor +WGPUSharedTextureMemoryDmaBufDescriptor: TypeAlias = struct_WGPUSharedTextureMemoryDmaBufDescriptor +WGPUSharedTextureMemoryProperties: TypeAlias = struct_WGPUSharedTextureMemoryProperties +WGPUSupportedLimits: TypeAlias = struct_WGPUSupportedLimits +WGPUSurfaceDescriptor: TypeAlias = struct_WGPUSurfaceDescriptor +WGPUSurfaceSourceCanvasHTMLSelector_Emscripten: TypeAlias = struct_WGPUSurfaceSourceCanvasHTMLSelector_Emscripten +WGPUTextureDescriptor: TypeAlias = struct_WGPUTextureDescriptor +WGPUTextureViewDescriptor: TypeAlias = struct_WGPUTextureViewDescriptor +WGPUBindGroupLayoutDescriptor: TypeAlias = struct_WGPUBindGroupLayoutDescriptor +WGPUCompilationInfo: TypeAlias = struct_WGPUCompilationInfo +WGPUDeviceDescriptor: TypeAlias = struct_WGPUDeviceDescriptor +WGPURenderPassDescriptor: TypeAlias = struct_WGPURenderPassDescriptor +WGPURenderPassPixelLocalStorage: TypeAlias = struct_WGPURenderPassPixelLocalStorage +WGPUComputePipelineDescriptor: TypeAlias = struct_WGPUComputePipelineDescriptor +WGPURenderPipelineDescriptor: TypeAlias = struct_WGPURenderPipelineDescriptor +WGPURenderPassDescriptorMaxDrawCount: TypeAlias = struct_WGPURenderPassMaxDrawCount +WGPUShaderModuleSPIRVDescriptor: TypeAlias = struct_WGPUShaderSourceSPIRV +WGPUShaderModuleWGSLDescriptor: TypeAlias = struct_WGPUShaderSourceWGSL +WGPUSurfaceDescriptorFromAndroidNativeWindow: TypeAlias = struct_WGPUSurfaceSourceAndroidNativeWindow +WGPUSurfaceDescriptorFromCanvasHTMLSelector: TypeAlias = struct_WGPUSurfaceSourceCanvasHTMLSelector_Emscripten +WGPUSurfaceDescriptorFromMetalLayer: TypeAlias = struct_WGPUSurfaceSourceMetalLayer +WGPUSurfaceDescriptorFromWaylandSurface: TypeAlias = struct_WGPUSurfaceSourceWaylandSurface +WGPUSurfaceDescriptorFromWindowsHWND: TypeAlias = struct_WGPUSurfaceSourceWindowsHWND +WGPUSurfaceDescriptorFromXcbWindow: TypeAlias = struct_WGPUSurfaceSourceXCBWindow +WGPUSurfaceDescriptorFromXlibWindow: TypeAlias = struct_WGPUSurfaceSourceXlibWindow +WGPUProcAdapterInfoFreeMembers: TypeAlias = c.CFUNCTYPE[None, [struct_WGPUAdapterInfo]] +WGPUProcAdapterPropertiesMemoryHeapsFreeMembers: TypeAlias = c.CFUNCTYPE[None, [struct_WGPUAdapterPropertiesMemoryHeaps]] +WGPUProcCreateInstance: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUInstanceImpl], [c.POINTER[struct_WGPUInstanceDescriptor]]] +WGPUProcDrmFormatCapabilitiesFreeMembers: TypeAlias = c.CFUNCTYPE[None, [struct_WGPUDrmFormatCapabilities]] +WGPUProcGetInstanceFeatures: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUInstanceFeatures]]] +WGPUProcGetProcAddress: TypeAlias = c.CFUNCTYPE[c.CFUNCTYPE[None, []], [struct_WGPUStringView]] +WGPUProcSharedBufferMemoryEndAccessStateFreeMembers: TypeAlias = c.CFUNCTYPE[None, [struct_WGPUSharedBufferMemoryEndAccessState]] +WGPUProcSharedTextureMemoryEndAccessStateFreeMembers: TypeAlias = c.CFUNCTYPE[None, [struct_WGPUSharedTextureMemoryEndAccessState]] +WGPUProcSupportedFeaturesFreeMembers: TypeAlias = c.CFUNCTYPE[None, [struct_WGPUSupportedFeatures]] +WGPUProcSurfaceCapabilitiesFreeMembers: TypeAlias = c.CFUNCTYPE[None, [struct_WGPUSurfaceCapabilities]] +WGPUProcAdapterCreateDevice: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUDeviceImpl], [c.POINTER[struct_WGPUAdapterImpl], c.POINTER[struct_WGPUDeviceDescriptor]]] +WGPUProcAdapterGetFeatures: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUAdapterImpl], c.POINTER[struct_WGPUSupportedFeatures]]] +WGPUProcAdapterGetFormatCapabilities: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUAdapterImpl], ctypes.c_uint32, c.POINTER[struct_WGPUFormatCapabilities]]] +WGPUProcAdapterGetInfo: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUAdapterImpl], c.POINTER[struct_WGPUAdapterInfo]]] +WGPUProcAdapterGetInstance: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUInstanceImpl], [c.POINTER[struct_WGPUAdapterImpl]]] +WGPUProcAdapterGetLimits: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUAdapterImpl], c.POINTER[struct_WGPUSupportedLimits]]] +WGPUProcAdapterHasFeature: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUAdapterImpl], ctypes.c_uint32]] +WGPUProcAdapterRequestDevice: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUAdapterImpl], c.POINTER[struct_WGPUDeviceDescriptor], c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUDeviceImpl], struct_WGPUStringView, ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcAdapterRequestDevice2: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUAdapterImpl], c.POINTER[struct_WGPUDeviceDescriptor], struct_WGPURequestDeviceCallbackInfo2]] +WGPUProcAdapterRequestDeviceF: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUAdapterImpl], c.POINTER[struct_WGPUDeviceDescriptor], struct_WGPURequestDeviceCallbackInfo]] +WGPUProcAdapterAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUAdapterImpl]]] +WGPUProcAdapterRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUAdapterImpl]]] +WGPUProcBindGroupSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBindGroupImpl], struct_WGPUStringView]] +WGPUProcBindGroupAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBindGroupImpl]]] +WGPUProcBindGroupRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBindGroupImpl]]] +WGPUProcBindGroupLayoutSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBindGroupLayoutImpl], struct_WGPUStringView]] +WGPUProcBindGroupLayoutAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBindGroupLayoutImpl]]] +WGPUProcBindGroupLayoutRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBindGroupLayoutImpl]]] +WGPUProcBufferDestroy: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBufferImpl]]] +WGPUProcBufferGetConstMappedRange: TypeAlias = c.CFUNCTYPE[ctypes.c_void_p, [c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64]] +WGPUProcBufferGetMapState: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUBufferImpl]]] +WGPUProcBufferGetMappedRange: TypeAlias = c.CFUNCTYPE[ctypes.c_void_p, [c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64]] +WGPUProcBufferGetSize: TypeAlias = c.CFUNCTYPE[ctypes.c_uint64, [c.POINTER[struct_WGPUBufferImpl]]] +WGPUProcBufferGetUsage: TypeAlias = c.CFUNCTYPE[ctypes.c_uint64, [c.POINTER[struct_WGPUBufferImpl]]] +WGPUProcBufferMapAsync: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64, ctypes.c_uint64, c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcBufferMapAsync2: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64, ctypes.c_uint64, struct_WGPUBufferMapCallbackInfo2]] +WGPUProcBufferMapAsyncF: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64, ctypes.c_uint64, struct_WGPUBufferMapCallbackInfo]] +WGPUProcBufferSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBufferImpl], struct_WGPUStringView]] +WGPUProcBufferUnmap: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBufferImpl]]] +WGPUProcBufferAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBufferImpl]]] +WGPUProcBufferRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUBufferImpl]]] +WGPUProcCommandBufferSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandBufferImpl], struct_WGPUStringView]] +WGPUProcCommandBufferAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandBufferImpl]]] +WGPUProcCommandBufferRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandBufferImpl]]] +WGPUProcCommandEncoderBeginComputePass: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUComputePassEncoderImpl], [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUComputePassDescriptor]]] +WGPUProcCommandEncoderBeginRenderPass: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPURenderPassEncoderImpl], [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPURenderPassDescriptor]]] +WGPUProcCommandEncoderClearBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64]] +WGPUProcCommandEncoderCopyBufferToBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64]] +WGPUProcCommandEncoderCopyBufferToTexture: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUImageCopyBuffer], c.POINTER[struct_WGPUImageCopyTexture], c.POINTER[struct_WGPUExtent3D]]] +WGPUProcCommandEncoderCopyTextureToBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUImageCopyTexture], c.POINTER[struct_WGPUImageCopyBuffer], c.POINTER[struct_WGPUExtent3D]]] +WGPUProcCommandEncoderCopyTextureToTexture: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUImageCopyTexture], c.POINTER[struct_WGPUImageCopyTexture], c.POINTER[struct_WGPUExtent3D]]] +WGPUProcCommandEncoderFinish: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUCommandBufferImpl], [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUCommandBufferDescriptor]]] +WGPUProcCommandEncoderInjectValidationError: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], struct_WGPUStringView]] +WGPUProcCommandEncoderInsertDebugMarker: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], struct_WGPUStringView]] +WGPUProcCommandEncoderPopDebugGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl]]] +WGPUProcCommandEncoderPushDebugGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], struct_WGPUStringView]] +WGPUProcCommandEncoderResolveQuerySet: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUQuerySetImpl], ctypes.c_uint32, ctypes.c_uint32, c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64]] +WGPUProcCommandEncoderSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], struct_WGPUStringView]] +WGPUProcCommandEncoderWriteBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, c.POINTER[ctypes.c_ubyte], ctypes.c_uint64]] +WGPUProcCommandEncoderWriteTimestamp: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl], c.POINTER[struct_WGPUQuerySetImpl], ctypes.c_uint32]] +WGPUProcCommandEncoderAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl]]] +WGPUProcCommandEncoderRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUCommandEncoderImpl]]] +WGPUProcComputePassEncoderDispatchWorkgroups: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +WGPUProcComputePassEncoderDispatchWorkgroupsIndirect: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64]] +WGPUProcComputePassEncoderEnd: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl]]] +WGPUProcComputePassEncoderInsertDebugMarker: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl], struct_WGPUStringView]] +WGPUProcComputePassEncoderPopDebugGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl]]] +WGPUProcComputePassEncoderPushDebugGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl], struct_WGPUStringView]] +WGPUProcComputePassEncoderSetBindGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl], ctypes.c_uint32, c.POINTER[struct_WGPUBindGroupImpl], ctypes.c_uint64, c.POINTER[ctypes.c_uint32]]] +WGPUProcComputePassEncoderSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl], struct_WGPUStringView]] +WGPUProcComputePassEncoderSetPipeline: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl], c.POINTER[struct_WGPUComputePipelineImpl]]] +WGPUProcComputePassEncoderWriteTimestamp: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl], c.POINTER[struct_WGPUQuerySetImpl], ctypes.c_uint32]] +WGPUProcComputePassEncoderAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl]]] +WGPUProcComputePassEncoderRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePassEncoderImpl]]] +WGPUProcComputePipelineGetBindGroupLayout: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUBindGroupLayoutImpl], [c.POINTER[struct_WGPUComputePipelineImpl], ctypes.c_uint32]] +WGPUProcComputePipelineSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePipelineImpl], struct_WGPUStringView]] +WGPUProcComputePipelineAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePipelineImpl]]] +WGPUProcComputePipelineRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUComputePipelineImpl]]] +WGPUProcDeviceCreateBindGroup: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUBindGroupImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUBindGroupDescriptor]]] +WGPUProcDeviceCreateBindGroupLayout: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUBindGroupLayoutImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUBindGroupLayoutDescriptor]]] +WGPUProcDeviceCreateBuffer: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUBufferImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUBufferDescriptor]]] +WGPUProcDeviceCreateCommandEncoder: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUCommandEncoderImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUCommandEncoderDescriptor]]] +WGPUProcDeviceCreateComputePipeline: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUComputePipelineImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUComputePipelineDescriptor]]] +WGPUProcDeviceCreateComputePipelineAsync: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUComputePipelineDescriptor], c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUComputePipelineImpl], struct_WGPUStringView, ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcDeviceCreateComputePipelineAsync2: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUComputePipelineDescriptor], struct_WGPUCreateComputePipelineAsyncCallbackInfo2]] +WGPUProcDeviceCreateComputePipelineAsyncF: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUComputePipelineDescriptor], struct_WGPUCreateComputePipelineAsyncCallbackInfo]] +WGPUProcDeviceCreateErrorBuffer: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUBufferImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUBufferDescriptor]]] +WGPUProcDeviceCreateErrorExternalTexture: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUExternalTextureImpl], [c.POINTER[struct_WGPUDeviceImpl]]] +WGPUProcDeviceCreateErrorShaderModule: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUShaderModuleImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUShaderModuleDescriptor], struct_WGPUStringView]] +WGPUProcDeviceCreateErrorTexture: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUTextureImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUTextureDescriptor]]] +WGPUProcDeviceCreateExternalTexture: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUExternalTextureImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUExternalTextureDescriptor]]] +WGPUProcDeviceCreatePipelineLayout: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUPipelineLayoutImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUPipelineLayoutDescriptor]]] +WGPUProcDeviceCreateQuerySet: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUQuerySetImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUQuerySetDescriptor]]] +WGPUProcDeviceCreateRenderBundleEncoder: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPURenderBundleEncoderImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPURenderBundleEncoderDescriptor]]] +WGPUProcDeviceCreateRenderPipeline: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPURenderPipelineImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPURenderPipelineDescriptor]]] +WGPUProcDeviceCreateRenderPipelineAsync: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPURenderPipelineDescriptor], c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPURenderPipelineImpl], struct_WGPUStringView, ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcDeviceCreateRenderPipelineAsync2: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPURenderPipelineDescriptor], struct_WGPUCreateRenderPipelineAsyncCallbackInfo2]] +WGPUProcDeviceCreateRenderPipelineAsyncF: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPURenderPipelineDescriptor], struct_WGPUCreateRenderPipelineAsyncCallbackInfo]] +WGPUProcDeviceCreateSampler: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUSamplerImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUSamplerDescriptor]]] +WGPUProcDeviceCreateShaderModule: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUShaderModuleImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUShaderModuleDescriptor]]] +WGPUProcDeviceCreateTexture: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUTextureImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUTextureDescriptor]]] +WGPUProcDeviceDestroy: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl]]] +WGPUProcDeviceForceLoss: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], ctypes.c_uint32, struct_WGPUStringView]] +WGPUProcDeviceGetAHardwareBufferProperties: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUDeviceImpl], ctypes.c_void_p, c.POINTER[struct_WGPUAHardwareBufferProperties]]] +WGPUProcDeviceGetAdapter: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUAdapterImpl], [c.POINTER[struct_WGPUDeviceImpl]]] +WGPUProcDeviceGetAdapterInfo: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUAdapterInfo]]] +WGPUProcDeviceGetFeatures: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUSupportedFeatures]]] +WGPUProcDeviceGetLimits: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUSupportedLimits]]] +WGPUProcDeviceGetLostFuture: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUDeviceImpl]]] +WGPUProcDeviceGetQueue: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUQueueImpl], [c.POINTER[struct_WGPUDeviceImpl]]] +WGPUProcDeviceHasFeature: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUDeviceImpl], ctypes.c_uint32]] +WGPUProcDeviceImportSharedBufferMemory: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUSharedBufferMemoryImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUSharedBufferMemoryDescriptor]]] +WGPUProcDeviceImportSharedFence: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUSharedFenceImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUSharedFenceDescriptor]]] +WGPUProcDeviceImportSharedTextureMemory: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUSharedTextureMemoryImpl], [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUSharedTextureMemoryDescriptor]]] +WGPUProcDeviceInjectError: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], ctypes.c_uint32, struct_WGPUStringView]] +WGPUProcDevicePopErrorScope: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcDevicePopErrorScope2: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUDeviceImpl], struct_WGPUPopErrorScopeCallbackInfo2]] +WGPUProcDevicePopErrorScopeF: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUDeviceImpl], struct_WGPUPopErrorScopeCallbackInfo]] +WGPUProcDevicePushErrorScope: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], ctypes.c_uint32]] +WGPUProcDeviceSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], struct_WGPUStringView]] +WGPUProcDeviceSetLoggingCallback: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], c.CFUNCTYPE[None, [ctypes.c_uint32, struct_WGPUStringView, ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcDeviceTick: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl]]] +WGPUProcDeviceValidateTextureDescriptor: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl], c.POINTER[struct_WGPUTextureDescriptor]]] +WGPUProcDeviceAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl]]] +WGPUProcDeviceRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUDeviceImpl]]] +WGPUProcExternalTextureDestroy: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUExternalTextureImpl]]] +WGPUProcExternalTextureExpire: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUExternalTextureImpl]]] +WGPUProcExternalTextureRefresh: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUExternalTextureImpl]]] +WGPUProcExternalTextureSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUExternalTextureImpl], struct_WGPUStringView]] +WGPUProcExternalTextureAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUExternalTextureImpl]]] +WGPUProcExternalTextureRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUExternalTextureImpl]]] +WGPUProcInstanceCreateSurface: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUSurfaceImpl], [c.POINTER[struct_WGPUInstanceImpl], c.POINTER[struct_WGPUSurfaceDescriptor]]] +WGPUProcInstanceEnumerateWGSLLanguageFeatures: TypeAlias = c.CFUNCTYPE[ctypes.c_uint64, [c.POINTER[struct_WGPUInstanceImpl], c.POINTER[ctypes.c_uint32]]] +WGPUProcInstanceHasWGSLLanguageFeature: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUInstanceImpl], ctypes.c_uint32]] +WGPUProcInstanceProcessEvents: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUInstanceImpl]]] +WGPUProcInstanceRequestAdapter: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUInstanceImpl], c.POINTER[struct_WGPURequestAdapterOptions], c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUAdapterImpl], struct_WGPUStringView, ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcInstanceRequestAdapter2: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUInstanceImpl], c.POINTER[struct_WGPURequestAdapterOptions], struct_WGPURequestAdapterCallbackInfo2]] +WGPUProcInstanceRequestAdapterF: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUInstanceImpl], c.POINTER[struct_WGPURequestAdapterOptions], struct_WGPURequestAdapterCallbackInfo]] +WGPUProcInstanceWaitAny: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUInstanceImpl], ctypes.c_uint64, c.POINTER[struct_WGPUFutureWaitInfo], ctypes.c_uint64]] +WGPUProcInstanceAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUInstanceImpl]]] +WGPUProcInstanceRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUInstanceImpl]]] +WGPUProcPipelineLayoutSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUPipelineLayoutImpl], struct_WGPUStringView]] +WGPUProcPipelineLayoutAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUPipelineLayoutImpl]]] +WGPUProcPipelineLayoutRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUPipelineLayoutImpl]]] +WGPUProcQuerySetDestroy: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQuerySetImpl]]] +WGPUProcQuerySetGetCount: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUQuerySetImpl]]] +WGPUProcQuerySetGetType: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUQuerySetImpl]]] +WGPUProcQuerySetSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQuerySetImpl], struct_WGPUStringView]] +WGPUProcQuerySetAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQuerySetImpl]]] +WGPUProcQuerySetRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQuerySetImpl]]] +WGPUProcQueueCopyExternalTextureForBrowser: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl], c.POINTER[struct_WGPUImageCopyExternalTexture], c.POINTER[struct_WGPUImageCopyTexture], c.POINTER[struct_WGPUExtent3D], c.POINTER[struct_WGPUCopyTextureForBrowserOptions]]] +WGPUProcQueueCopyTextureForBrowser: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl], c.POINTER[struct_WGPUImageCopyTexture], c.POINTER[struct_WGPUImageCopyTexture], c.POINTER[struct_WGPUExtent3D], c.POINTER[struct_WGPUCopyTextureForBrowserOptions]]] +WGPUProcQueueOnSubmittedWorkDone: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl], c.CFUNCTYPE[None, [ctypes.c_uint32, ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcQueueOnSubmittedWorkDone2: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUQueueImpl], struct_WGPUQueueWorkDoneCallbackInfo2]] +WGPUProcQueueOnSubmittedWorkDoneF: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUQueueImpl], struct_WGPUQueueWorkDoneCallbackInfo]] +WGPUProcQueueSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl], struct_WGPUStringView]] +WGPUProcQueueSubmit: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl], ctypes.c_uint64, c.POINTER[c.POINTER[struct_WGPUCommandBufferImpl]]]] +WGPUProcQueueWriteBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_void_p, ctypes.c_uint64]] +WGPUProcQueueWriteTexture: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl], c.POINTER[struct_WGPUImageCopyTexture], ctypes.c_void_p, ctypes.c_uint64, c.POINTER[struct_WGPUTextureDataLayout], c.POINTER[struct_WGPUExtent3D]]] +WGPUProcQueueAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl]]] +WGPUProcQueueRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUQueueImpl]]] +WGPUProcRenderBundleSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleImpl], struct_WGPUStringView]] +WGPUProcRenderBundleAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleImpl]]] +WGPUProcRenderBundleRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleImpl]]] +WGPUProcRenderBundleEncoderDraw: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +WGPUProcRenderBundleEncoderDrawIndexed: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_int32, ctypes.c_uint32]] +WGPUProcRenderBundleEncoderDrawIndexedIndirect: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64]] +WGPUProcRenderBundleEncoderDrawIndirect: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64]] +WGPUProcRenderBundleEncoderFinish: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPURenderBundleImpl], [c.POINTER[struct_WGPURenderBundleEncoderImpl], c.POINTER[struct_WGPURenderBundleDescriptor]]] +WGPUProcRenderBundleEncoderInsertDebugMarker: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], struct_WGPUStringView]] +WGPUProcRenderBundleEncoderPopDebugGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl]]] +WGPUProcRenderBundleEncoderPushDebugGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], struct_WGPUStringView]] +WGPUProcRenderBundleEncoderSetBindGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], ctypes.c_uint32, c.POINTER[struct_WGPUBindGroupImpl], ctypes.c_uint64, c.POINTER[ctypes.c_uint32]]] +WGPUProcRenderBundleEncoderSetIndexBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint32, ctypes.c_uint64, ctypes.c_uint64]] +WGPUProcRenderBundleEncoderSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], struct_WGPUStringView]] +WGPUProcRenderBundleEncoderSetPipeline: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], c.POINTER[struct_WGPURenderPipelineImpl]]] +WGPUProcRenderBundleEncoderSetVertexBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl], ctypes.c_uint32, c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64]] +WGPUProcRenderBundleEncoderAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl]]] +WGPUProcRenderBundleEncoderRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderBundleEncoderImpl]]] +WGPUProcRenderPassEncoderBeginOcclusionQuery: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_uint32]] +WGPUProcRenderPassEncoderDraw: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +WGPUProcRenderPassEncoderDrawIndexed: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_int32, ctypes.c_uint32]] +WGPUProcRenderPassEncoderDrawIndexedIndirect: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64]] +WGPUProcRenderPassEncoderDrawIndirect: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64]] +WGPUProcRenderPassEncoderEnd: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl]]] +WGPUProcRenderPassEncoderEndOcclusionQuery: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl]]] +WGPUProcRenderPassEncoderExecuteBundles: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_uint64, c.POINTER[c.POINTER[struct_WGPURenderBundleImpl]]]] +WGPUProcRenderPassEncoderInsertDebugMarker: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], struct_WGPUStringView]] +WGPUProcRenderPassEncoderMultiDrawIndexedIndirect: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint32, c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64]] +WGPUProcRenderPassEncoderMultiDrawIndirect: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint32, c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64]] +WGPUProcRenderPassEncoderPixelLocalStorageBarrier: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl]]] +WGPUProcRenderPassEncoderPopDebugGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl]]] +WGPUProcRenderPassEncoderPushDebugGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], struct_WGPUStringView]] +WGPUProcRenderPassEncoderSetBindGroup: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_uint32, c.POINTER[struct_WGPUBindGroupImpl], ctypes.c_uint64, c.POINTER[ctypes.c_uint32]]] +WGPUProcRenderPassEncoderSetBlendConstant: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], c.POINTER[struct_WGPUColor]]] +WGPUProcRenderPassEncoderSetIndexBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint32, ctypes.c_uint64, ctypes.c_uint64]] +WGPUProcRenderPassEncoderSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], struct_WGPUStringView]] +WGPUProcRenderPassEncoderSetPipeline: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], c.POINTER[struct_WGPURenderPipelineImpl]]] +WGPUProcRenderPassEncoderSetScissorRect: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32, ctypes.c_uint32]] +WGPUProcRenderPassEncoderSetStencilReference: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_uint32]] +WGPUProcRenderPassEncoderSetVertexBuffer: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_uint32, c.POINTER[struct_WGPUBufferImpl], ctypes.c_uint64, ctypes.c_uint64]] +WGPUProcRenderPassEncoderSetViewport: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float]] +WGPUProcRenderPassEncoderWriteTimestamp: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl], c.POINTER[struct_WGPUQuerySetImpl], ctypes.c_uint32]] +WGPUProcRenderPassEncoderAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl]]] +WGPUProcRenderPassEncoderRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPassEncoderImpl]]] +WGPUProcRenderPipelineGetBindGroupLayout: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUBindGroupLayoutImpl], [c.POINTER[struct_WGPURenderPipelineImpl], ctypes.c_uint32]] +WGPUProcRenderPipelineSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPipelineImpl], struct_WGPUStringView]] +WGPUProcRenderPipelineAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPipelineImpl]]] +WGPUProcRenderPipelineRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPURenderPipelineImpl]]] +WGPUProcSamplerSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSamplerImpl], struct_WGPUStringView]] +WGPUProcSamplerAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSamplerImpl]]] +WGPUProcSamplerRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSamplerImpl]]] +WGPUProcShaderModuleGetCompilationInfo: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUShaderModuleImpl], c.CFUNCTYPE[None, [ctypes.c_uint32, c.POINTER[struct_WGPUCompilationInfo], ctypes.c_void_p]], ctypes.c_void_p]] +WGPUProcShaderModuleGetCompilationInfo2: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUShaderModuleImpl], struct_WGPUCompilationInfoCallbackInfo2]] +WGPUProcShaderModuleGetCompilationInfoF: TypeAlias = c.CFUNCTYPE[struct_WGPUFuture, [c.POINTER[struct_WGPUShaderModuleImpl], struct_WGPUCompilationInfoCallbackInfo]] +WGPUProcShaderModuleSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUShaderModuleImpl], struct_WGPUStringView]] +WGPUProcShaderModuleAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUShaderModuleImpl]]] +WGPUProcShaderModuleRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUShaderModuleImpl]]] +WGPUProcSharedBufferMemoryBeginAccess: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSharedBufferMemoryImpl], c.POINTER[struct_WGPUBufferImpl], c.POINTER[struct_WGPUSharedBufferMemoryBeginAccessDescriptor]]] +WGPUProcSharedBufferMemoryCreateBuffer: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUBufferImpl], [c.POINTER[struct_WGPUSharedBufferMemoryImpl], c.POINTER[struct_WGPUBufferDescriptor]]] +WGPUProcSharedBufferMemoryEndAccess: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSharedBufferMemoryImpl], c.POINTER[struct_WGPUBufferImpl], c.POINTER[struct_WGPUSharedBufferMemoryEndAccessState]]] +WGPUProcSharedBufferMemoryGetProperties: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSharedBufferMemoryImpl], c.POINTER[struct_WGPUSharedBufferMemoryProperties]]] +WGPUProcSharedBufferMemoryIsDeviceLost: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSharedBufferMemoryImpl]]] +WGPUProcSharedBufferMemorySetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedBufferMemoryImpl], struct_WGPUStringView]] +WGPUProcSharedBufferMemoryAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedBufferMemoryImpl]]] +WGPUProcSharedBufferMemoryRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedBufferMemoryImpl]]] +WGPUProcSharedFenceExportInfo: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedFenceImpl], c.POINTER[struct_WGPUSharedFenceExportInfo]]] +WGPUProcSharedFenceAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedFenceImpl]]] +WGPUProcSharedFenceRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedFenceImpl]]] +WGPUProcSharedTextureMemoryBeginAccess: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSharedTextureMemoryImpl], c.POINTER[struct_WGPUTextureImpl], c.POINTER[struct_WGPUSharedTextureMemoryBeginAccessDescriptor]]] +WGPUProcSharedTextureMemoryCreateTexture: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUTextureImpl], [c.POINTER[struct_WGPUSharedTextureMemoryImpl], c.POINTER[struct_WGPUTextureDescriptor]]] +WGPUProcSharedTextureMemoryEndAccess: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSharedTextureMemoryImpl], c.POINTER[struct_WGPUTextureImpl], c.POINTER[struct_WGPUSharedTextureMemoryEndAccessState]]] +WGPUProcSharedTextureMemoryGetProperties: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSharedTextureMemoryImpl], c.POINTER[struct_WGPUSharedTextureMemoryProperties]]] +WGPUProcSharedTextureMemoryIsDeviceLost: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSharedTextureMemoryImpl]]] +WGPUProcSharedTextureMemorySetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedTextureMemoryImpl], struct_WGPUStringView]] +WGPUProcSharedTextureMemoryAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedTextureMemoryImpl]]] +WGPUProcSharedTextureMemoryRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSharedTextureMemoryImpl]]] +WGPUProcSurfaceConfigure: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSurfaceImpl], c.POINTER[struct_WGPUSurfaceConfiguration]]] +WGPUProcSurfaceGetCapabilities: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUSurfaceImpl], c.POINTER[struct_WGPUAdapterImpl], c.POINTER[struct_WGPUSurfaceCapabilities]]] +WGPUProcSurfaceGetCurrentTexture: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSurfaceImpl], c.POINTER[struct_WGPUSurfaceTexture]]] +WGPUProcSurfacePresent: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSurfaceImpl]]] +WGPUProcSurfaceSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSurfaceImpl], struct_WGPUStringView]] +WGPUProcSurfaceUnconfigure: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSurfaceImpl]]] +WGPUProcSurfaceAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSurfaceImpl]]] +WGPUProcSurfaceRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUSurfaceImpl]]] +WGPUProcTextureCreateErrorView: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUTextureViewImpl], [c.POINTER[struct_WGPUTextureImpl], c.POINTER[struct_WGPUTextureViewDescriptor]]] +WGPUProcTextureCreateView: TypeAlias = c.CFUNCTYPE[c.POINTER[struct_WGPUTextureViewImpl], [c.POINTER[struct_WGPUTextureImpl], c.POINTER[struct_WGPUTextureViewDescriptor]]] +WGPUProcTextureDestroy: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureGetDepthOrArrayLayers: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureGetDimension: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureGetFormat: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureGetHeight: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureGetMipLevelCount: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureGetSampleCount: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureGetUsage: TypeAlias = c.CFUNCTYPE[ctypes.c_uint64, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureGetWidth: TypeAlias = c.CFUNCTYPE[ctypes.c_uint32, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUTextureImpl], struct_WGPUStringView]] +WGPUProcTextureAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUTextureImpl]]] +WGPUProcTextureViewSetLabel: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUTextureViewImpl], struct_WGPUStringView]] +WGPUProcTextureViewAddRef: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUTextureViewImpl]]] +WGPUProcTextureViewRelease: TypeAlias = c.CFUNCTYPE[None, [c.POINTER[struct_WGPUTextureViewImpl]]] +@dll.bind(None, WGPUAdapterInfo) +def wgpuAdapterInfoFreeMembers(value:WGPUAdapterInfo) -> None: ... +@dll.bind(None, WGPUAdapterPropertiesMemoryHeaps) +def wgpuAdapterPropertiesMemoryHeapsFreeMembers(value:WGPUAdapterPropertiesMemoryHeaps) -> None: ... +@dll.bind(WGPUInstance, c.POINTER[WGPUInstanceDescriptor]) +def wgpuCreateInstance(descriptor:c.POINTER[WGPUInstanceDescriptor]) -> WGPUInstance: ... +@dll.bind(None, WGPUDrmFormatCapabilities) +def wgpuDrmFormatCapabilitiesFreeMembers(value:WGPUDrmFormatCapabilities) -> None: ... +@dll.bind(WGPUStatus, c.POINTER[WGPUInstanceFeatures]) +def wgpuGetInstanceFeatures(features:c.POINTER[WGPUInstanceFeatures]) -> WGPUStatus: ... +@dll.bind(WGPUProc, WGPUStringView) +def wgpuGetProcAddress(procName:WGPUStringView) -> WGPUProc: ... +@dll.bind(None, WGPUSharedBufferMemoryEndAccessState) +def wgpuSharedBufferMemoryEndAccessStateFreeMembers(value:WGPUSharedBufferMemoryEndAccessState) -> None: ... +@dll.bind(None, WGPUSharedTextureMemoryEndAccessState) +def wgpuSharedTextureMemoryEndAccessStateFreeMembers(value:WGPUSharedTextureMemoryEndAccessState) -> None: ... +@dll.bind(None, WGPUSupportedFeatures) +def wgpuSupportedFeaturesFreeMembers(value:WGPUSupportedFeatures) -> None: ... +@dll.bind(None, WGPUSurfaceCapabilities) +def wgpuSurfaceCapabilitiesFreeMembers(value:WGPUSurfaceCapabilities) -> None: ... +@dll.bind(WGPUDevice, WGPUAdapter, c.POINTER[WGPUDeviceDescriptor]) +def wgpuAdapterCreateDevice(adapter:WGPUAdapter, descriptor:c.POINTER[WGPUDeviceDescriptor]) -> WGPUDevice: ... +@dll.bind(None, WGPUAdapter, c.POINTER[WGPUSupportedFeatures]) +def wgpuAdapterGetFeatures(adapter:WGPUAdapter, features:c.POINTER[WGPUSupportedFeatures]) -> None: ... +@dll.bind(WGPUStatus, WGPUAdapter, WGPUTextureFormat, c.POINTER[WGPUFormatCapabilities]) +def wgpuAdapterGetFormatCapabilities(adapter:WGPUAdapter, format:WGPUTextureFormat, capabilities:c.POINTER[WGPUFormatCapabilities]) -> WGPUStatus: ... +@dll.bind(WGPUStatus, WGPUAdapter, c.POINTER[WGPUAdapterInfo]) +def wgpuAdapterGetInfo(adapter:WGPUAdapter, info:c.POINTER[WGPUAdapterInfo]) -> WGPUStatus: ... +@dll.bind(WGPUInstance, WGPUAdapter) +def wgpuAdapterGetInstance(adapter:WGPUAdapter) -> WGPUInstance: ... +@dll.bind(WGPUStatus, WGPUAdapter, c.POINTER[WGPUSupportedLimits]) +def wgpuAdapterGetLimits(adapter:WGPUAdapter, limits:c.POINTER[WGPUSupportedLimits]) -> WGPUStatus: ... +@dll.bind(WGPUBool, WGPUAdapter, WGPUFeatureName) +def wgpuAdapterHasFeature(adapter:WGPUAdapter, feature:WGPUFeatureName) -> WGPUBool: ... +@dll.bind(None, WGPUAdapter, c.POINTER[WGPUDeviceDescriptor], WGPURequestDeviceCallback, ctypes.c_void_p) +def wgpuAdapterRequestDevice(adapter:WGPUAdapter, descriptor:c.POINTER[WGPUDeviceDescriptor], callback:WGPURequestDeviceCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(WGPUFuture, WGPUAdapter, c.POINTER[WGPUDeviceDescriptor], WGPURequestDeviceCallbackInfo2) +def wgpuAdapterRequestDevice2(adapter:WGPUAdapter, options:c.POINTER[WGPUDeviceDescriptor], callbackInfo:WGPURequestDeviceCallbackInfo2) -> WGPUFuture: ... +@dll.bind(WGPUFuture, WGPUAdapter, c.POINTER[WGPUDeviceDescriptor], WGPURequestDeviceCallbackInfo) +def wgpuAdapterRequestDeviceF(adapter:WGPUAdapter, options:c.POINTER[WGPUDeviceDescriptor], callbackInfo:WGPURequestDeviceCallbackInfo) -> WGPUFuture: ... +@dll.bind(None, WGPUAdapter) +def wgpuAdapterAddRef(adapter:WGPUAdapter) -> None: ... +@dll.bind(None, WGPUAdapter) +def wgpuAdapterRelease(adapter:WGPUAdapter) -> None: ... +@dll.bind(None, WGPUBindGroup, WGPUStringView) +def wgpuBindGroupSetLabel(bindGroup:WGPUBindGroup, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUBindGroup) +def wgpuBindGroupAddRef(bindGroup:WGPUBindGroup) -> None: ... +@dll.bind(None, WGPUBindGroup) +def wgpuBindGroupRelease(bindGroup:WGPUBindGroup) -> None: ... +@dll.bind(None, WGPUBindGroupLayout, WGPUStringView) +def wgpuBindGroupLayoutSetLabel(bindGroupLayout:WGPUBindGroupLayout, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUBindGroupLayout) +def wgpuBindGroupLayoutAddRef(bindGroupLayout:WGPUBindGroupLayout) -> None: ... +@dll.bind(None, WGPUBindGroupLayout) +def wgpuBindGroupLayoutRelease(bindGroupLayout:WGPUBindGroupLayout) -> None: ... +@dll.bind(None, WGPUBuffer) +def wgpuBufferDestroy(buffer:WGPUBuffer) -> None: ... +@dll.bind(ctypes.c_void_p, WGPUBuffer, size_t, size_t) +def wgpuBufferGetConstMappedRange(buffer:WGPUBuffer, offset:size_t, size:size_t) -> ctypes.c_void_p: ... +@dll.bind(WGPUBufferMapState, WGPUBuffer) +def wgpuBufferGetMapState(buffer:WGPUBuffer) -> WGPUBufferMapState: ... +@dll.bind(ctypes.c_void_p, WGPUBuffer, size_t, size_t) +def wgpuBufferGetMappedRange(buffer:WGPUBuffer, offset:size_t, size:size_t) -> ctypes.c_void_p: ... +@dll.bind(uint64_t, WGPUBuffer) +def wgpuBufferGetSize(buffer:WGPUBuffer) -> uint64_t: ... +@dll.bind(WGPUBufferUsage, WGPUBuffer) +def wgpuBufferGetUsage(buffer:WGPUBuffer) -> WGPUBufferUsage: ... +@dll.bind(None, WGPUBuffer, WGPUMapMode, size_t, size_t, WGPUBufferMapCallback, ctypes.c_void_p) +def wgpuBufferMapAsync(buffer:WGPUBuffer, mode:WGPUMapMode, offset:size_t, size:size_t, callback:WGPUBufferMapCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(WGPUFuture, WGPUBuffer, WGPUMapMode, size_t, size_t, WGPUBufferMapCallbackInfo2) +def wgpuBufferMapAsync2(buffer:WGPUBuffer, mode:WGPUMapMode, offset:size_t, size:size_t, callbackInfo:WGPUBufferMapCallbackInfo2) -> WGPUFuture: ... +@dll.bind(WGPUFuture, WGPUBuffer, WGPUMapMode, size_t, size_t, WGPUBufferMapCallbackInfo) +def wgpuBufferMapAsyncF(buffer:WGPUBuffer, mode:WGPUMapMode, offset:size_t, size:size_t, callbackInfo:WGPUBufferMapCallbackInfo) -> WGPUFuture: ... +@dll.bind(None, WGPUBuffer, WGPUStringView) +def wgpuBufferSetLabel(buffer:WGPUBuffer, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUBuffer) +def wgpuBufferUnmap(buffer:WGPUBuffer) -> None: ... +@dll.bind(None, WGPUBuffer) +def wgpuBufferAddRef(buffer:WGPUBuffer) -> None: ... +@dll.bind(None, WGPUBuffer) +def wgpuBufferRelease(buffer:WGPUBuffer) -> None: ... +@dll.bind(None, WGPUCommandBuffer, WGPUStringView) +def wgpuCommandBufferSetLabel(commandBuffer:WGPUCommandBuffer, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUCommandBuffer) +def wgpuCommandBufferAddRef(commandBuffer:WGPUCommandBuffer) -> None: ... +@dll.bind(None, WGPUCommandBuffer) +def wgpuCommandBufferRelease(commandBuffer:WGPUCommandBuffer) -> None: ... +@dll.bind(WGPUComputePassEncoder, WGPUCommandEncoder, c.POINTER[WGPUComputePassDescriptor]) +def wgpuCommandEncoderBeginComputePass(commandEncoder:WGPUCommandEncoder, descriptor:c.POINTER[WGPUComputePassDescriptor]) -> WGPUComputePassEncoder: ... +@dll.bind(WGPURenderPassEncoder, WGPUCommandEncoder, c.POINTER[WGPURenderPassDescriptor]) +def wgpuCommandEncoderBeginRenderPass(commandEncoder:WGPUCommandEncoder, descriptor:c.POINTER[WGPURenderPassDescriptor]) -> WGPURenderPassEncoder: ... +@dll.bind(None, WGPUCommandEncoder, WGPUBuffer, uint64_t, uint64_t) +def wgpuCommandEncoderClearBuffer(commandEncoder:WGPUCommandEncoder, buffer:WGPUBuffer, offset:uint64_t, size:uint64_t) -> None: ... +@dll.bind(None, WGPUCommandEncoder, WGPUBuffer, uint64_t, WGPUBuffer, uint64_t, uint64_t) +def wgpuCommandEncoderCopyBufferToBuffer(commandEncoder:WGPUCommandEncoder, source:WGPUBuffer, sourceOffset:uint64_t, destination:WGPUBuffer, destinationOffset:uint64_t, size:uint64_t) -> None: ... +@dll.bind(None, WGPUCommandEncoder, c.POINTER[WGPUImageCopyBuffer], c.POINTER[WGPUImageCopyTexture], c.POINTER[WGPUExtent3D]) +def wgpuCommandEncoderCopyBufferToTexture(commandEncoder:WGPUCommandEncoder, source:c.POINTER[WGPUImageCopyBuffer], destination:c.POINTER[WGPUImageCopyTexture], copySize:c.POINTER[WGPUExtent3D]) -> None: ... +@dll.bind(None, WGPUCommandEncoder, c.POINTER[WGPUImageCopyTexture], c.POINTER[WGPUImageCopyBuffer], c.POINTER[WGPUExtent3D]) +def wgpuCommandEncoderCopyTextureToBuffer(commandEncoder:WGPUCommandEncoder, source:c.POINTER[WGPUImageCopyTexture], destination:c.POINTER[WGPUImageCopyBuffer], copySize:c.POINTER[WGPUExtent3D]) -> None: ... +@dll.bind(None, WGPUCommandEncoder, c.POINTER[WGPUImageCopyTexture], c.POINTER[WGPUImageCopyTexture], c.POINTER[WGPUExtent3D]) +def wgpuCommandEncoderCopyTextureToTexture(commandEncoder:WGPUCommandEncoder, source:c.POINTER[WGPUImageCopyTexture], destination:c.POINTER[WGPUImageCopyTexture], copySize:c.POINTER[WGPUExtent3D]) -> None: ... +@dll.bind(WGPUCommandBuffer, WGPUCommandEncoder, c.POINTER[WGPUCommandBufferDescriptor]) +def wgpuCommandEncoderFinish(commandEncoder:WGPUCommandEncoder, descriptor:c.POINTER[WGPUCommandBufferDescriptor]) -> WGPUCommandBuffer: ... +@dll.bind(None, WGPUCommandEncoder, WGPUStringView) +def wgpuCommandEncoderInjectValidationError(commandEncoder:WGPUCommandEncoder, message:WGPUStringView) -> None: ... +@dll.bind(None, WGPUCommandEncoder, WGPUStringView) +def wgpuCommandEncoderInsertDebugMarker(commandEncoder:WGPUCommandEncoder, markerLabel:WGPUStringView) -> None: ... +@dll.bind(None, WGPUCommandEncoder) +def wgpuCommandEncoderPopDebugGroup(commandEncoder:WGPUCommandEncoder) -> None: ... +@dll.bind(None, WGPUCommandEncoder, WGPUStringView) +def wgpuCommandEncoderPushDebugGroup(commandEncoder:WGPUCommandEncoder, groupLabel:WGPUStringView) -> None: ... +@dll.bind(None, WGPUCommandEncoder, WGPUQuerySet, uint32_t, uint32_t, WGPUBuffer, uint64_t) +def wgpuCommandEncoderResolveQuerySet(commandEncoder:WGPUCommandEncoder, querySet:WGPUQuerySet, firstQuery:uint32_t, queryCount:uint32_t, destination:WGPUBuffer, destinationOffset:uint64_t) -> None: ... +@dll.bind(None, WGPUCommandEncoder, WGPUStringView) +def wgpuCommandEncoderSetLabel(commandEncoder:WGPUCommandEncoder, label:WGPUStringView) -> None: ... +uint8_t: TypeAlias = ctypes.c_ubyte +@dll.bind(None, WGPUCommandEncoder, WGPUBuffer, uint64_t, c.POINTER[uint8_t], uint64_t) +def wgpuCommandEncoderWriteBuffer(commandEncoder:WGPUCommandEncoder, buffer:WGPUBuffer, bufferOffset:uint64_t, data:c.POINTER[uint8_t], size:uint64_t) -> None: ... +@dll.bind(None, WGPUCommandEncoder, WGPUQuerySet, uint32_t) +def wgpuCommandEncoderWriteTimestamp(commandEncoder:WGPUCommandEncoder, querySet:WGPUQuerySet, queryIndex:uint32_t) -> None: ... +@dll.bind(None, WGPUCommandEncoder) +def wgpuCommandEncoderAddRef(commandEncoder:WGPUCommandEncoder) -> None: ... +@dll.bind(None, WGPUCommandEncoder) +def wgpuCommandEncoderRelease(commandEncoder:WGPUCommandEncoder) -> None: ... +@dll.bind(None, WGPUComputePassEncoder, uint32_t, uint32_t, uint32_t) +def wgpuComputePassEncoderDispatchWorkgroups(computePassEncoder:WGPUComputePassEncoder, workgroupCountX:uint32_t, workgroupCountY:uint32_t, workgroupCountZ:uint32_t) -> None: ... +@dll.bind(None, WGPUComputePassEncoder, WGPUBuffer, uint64_t) +def wgpuComputePassEncoderDispatchWorkgroupsIndirect(computePassEncoder:WGPUComputePassEncoder, indirectBuffer:WGPUBuffer, indirectOffset:uint64_t) -> None: ... +@dll.bind(None, WGPUComputePassEncoder) +def wgpuComputePassEncoderEnd(computePassEncoder:WGPUComputePassEncoder) -> None: ... +@dll.bind(None, WGPUComputePassEncoder, WGPUStringView) +def wgpuComputePassEncoderInsertDebugMarker(computePassEncoder:WGPUComputePassEncoder, markerLabel:WGPUStringView) -> None: ... +@dll.bind(None, WGPUComputePassEncoder) +def wgpuComputePassEncoderPopDebugGroup(computePassEncoder:WGPUComputePassEncoder) -> None: ... +@dll.bind(None, WGPUComputePassEncoder, WGPUStringView) +def wgpuComputePassEncoderPushDebugGroup(computePassEncoder:WGPUComputePassEncoder, groupLabel:WGPUStringView) -> None: ... +@dll.bind(None, WGPUComputePassEncoder, uint32_t, WGPUBindGroup, size_t, c.POINTER[uint32_t]) +def wgpuComputePassEncoderSetBindGroup(computePassEncoder:WGPUComputePassEncoder, groupIndex:uint32_t, group:WGPUBindGroup, dynamicOffsetCount:size_t, dynamicOffsets:c.POINTER[uint32_t]) -> None: ... +@dll.bind(None, WGPUComputePassEncoder, WGPUStringView) +def wgpuComputePassEncoderSetLabel(computePassEncoder:WGPUComputePassEncoder, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUComputePassEncoder, WGPUComputePipeline) +def wgpuComputePassEncoderSetPipeline(computePassEncoder:WGPUComputePassEncoder, pipeline:WGPUComputePipeline) -> None: ... +@dll.bind(None, WGPUComputePassEncoder, WGPUQuerySet, uint32_t) +def wgpuComputePassEncoderWriteTimestamp(computePassEncoder:WGPUComputePassEncoder, querySet:WGPUQuerySet, queryIndex:uint32_t) -> None: ... +@dll.bind(None, WGPUComputePassEncoder) +def wgpuComputePassEncoderAddRef(computePassEncoder:WGPUComputePassEncoder) -> None: ... +@dll.bind(None, WGPUComputePassEncoder) +def wgpuComputePassEncoderRelease(computePassEncoder:WGPUComputePassEncoder) -> None: ... +@dll.bind(WGPUBindGroupLayout, WGPUComputePipeline, uint32_t) +def wgpuComputePipelineGetBindGroupLayout(computePipeline:WGPUComputePipeline, groupIndex:uint32_t) -> WGPUBindGroupLayout: ... +@dll.bind(None, WGPUComputePipeline, WGPUStringView) +def wgpuComputePipelineSetLabel(computePipeline:WGPUComputePipeline, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUComputePipeline) +def wgpuComputePipelineAddRef(computePipeline:WGPUComputePipeline) -> None: ... +@dll.bind(None, WGPUComputePipeline) +def wgpuComputePipelineRelease(computePipeline:WGPUComputePipeline) -> None: ... +@dll.bind(WGPUBindGroup, WGPUDevice, c.POINTER[WGPUBindGroupDescriptor]) +def wgpuDeviceCreateBindGroup(device:WGPUDevice, descriptor:c.POINTER[WGPUBindGroupDescriptor]) -> WGPUBindGroup: ... +@dll.bind(WGPUBindGroupLayout, WGPUDevice, c.POINTER[WGPUBindGroupLayoutDescriptor]) +def wgpuDeviceCreateBindGroupLayout(device:WGPUDevice, descriptor:c.POINTER[WGPUBindGroupLayoutDescriptor]) -> WGPUBindGroupLayout: ... +@dll.bind(WGPUBuffer, WGPUDevice, c.POINTER[WGPUBufferDescriptor]) +def wgpuDeviceCreateBuffer(device:WGPUDevice, descriptor:c.POINTER[WGPUBufferDescriptor]) -> WGPUBuffer: ... +@dll.bind(WGPUCommandEncoder, WGPUDevice, c.POINTER[WGPUCommandEncoderDescriptor]) +def wgpuDeviceCreateCommandEncoder(device:WGPUDevice, descriptor:c.POINTER[WGPUCommandEncoderDescriptor]) -> WGPUCommandEncoder: ... +@dll.bind(WGPUComputePipeline, WGPUDevice, c.POINTER[WGPUComputePipelineDescriptor]) +def wgpuDeviceCreateComputePipeline(device:WGPUDevice, descriptor:c.POINTER[WGPUComputePipelineDescriptor]) -> WGPUComputePipeline: ... +@dll.bind(None, WGPUDevice, c.POINTER[WGPUComputePipelineDescriptor], WGPUCreateComputePipelineAsyncCallback, ctypes.c_void_p) +def wgpuDeviceCreateComputePipelineAsync(device:WGPUDevice, descriptor:c.POINTER[WGPUComputePipelineDescriptor], callback:WGPUCreateComputePipelineAsyncCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(WGPUFuture, WGPUDevice, c.POINTER[WGPUComputePipelineDescriptor], WGPUCreateComputePipelineAsyncCallbackInfo2) +def wgpuDeviceCreateComputePipelineAsync2(device:WGPUDevice, descriptor:c.POINTER[WGPUComputePipelineDescriptor], callbackInfo:WGPUCreateComputePipelineAsyncCallbackInfo2) -> WGPUFuture: ... +@dll.bind(WGPUFuture, WGPUDevice, c.POINTER[WGPUComputePipelineDescriptor], WGPUCreateComputePipelineAsyncCallbackInfo) +def wgpuDeviceCreateComputePipelineAsyncF(device:WGPUDevice, descriptor:c.POINTER[WGPUComputePipelineDescriptor], callbackInfo:WGPUCreateComputePipelineAsyncCallbackInfo) -> WGPUFuture: ... +@dll.bind(WGPUBuffer, WGPUDevice, c.POINTER[WGPUBufferDescriptor]) +def wgpuDeviceCreateErrorBuffer(device:WGPUDevice, descriptor:c.POINTER[WGPUBufferDescriptor]) -> WGPUBuffer: ... +@dll.bind(WGPUExternalTexture, WGPUDevice) +def wgpuDeviceCreateErrorExternalTexture(device:WGPUDevice) -> WGPUExternalTexture: ... +@dll.bind(WGPUShaderModule, WGPUDevice, c.POINTER[WGPUShaderModuleDescriptor], WGPUStringView) +def wgpuDeviceCreateErrorShaderModule(device:WGPUDevice, descriptor:c.POINTER[WGPUShaderModuleDescriptor], errorMessage:WGPUStringView) -> WGPUShaderModule: ... +@dll.bind(WGPUTexture, WGPUDevice, c.POINTER[WGPUTextureDescriptor]) +def wgpuDeviceCreateErrorTexture(device:WGPUDevice, descriptor:c.POINTER[WGPUTextureDescriptor]) -> WGPUTexture: ... +@dll.bind(WGPUExternalTexture, WGPUDevice, c.POINTER[WGPUExternalTextureDescriptor]) +def wgpuDeviceCreateExternalTexture(device:WGPUDevice, externalTextureDescriptor:c.POINTER[WGPUExternalTextureDescriptor]) -> WGPUExternalTexture: ... +@dll.bind(WGPUPipelineLayout, WGPUDevice, c.POINTER[WGPUPipelineLayoutDescriptor]) +def wgpuDeviceCreatePipelineLayout(device:WGPUDevice, descriptor:c.POINTER[WGPUPipelineLayoutDescriptor]) -> WGPUPipelineLayout: ... +@dll.bind(WGPUQuerySet, WGPUDevice, c.POINTER[WGPUQuerySetDescriptor]) +def wgpuDeviceCreateQuerySet(device:WGPUDevice, descriptor:c.POINTER[WGPUQuerySetDescriptor]) -> WGPUQuerySet: ... +@dll.bind(WGPURenderBundleEncoder, WGPUDevice, c.POINTER[WGPURenderBundleEncoderDescriptor]) +def wgpuDeviceCreateRenderBundleEncoder(device:WGPUDevice, descriptor:c.POINTER[WGPURenderBundleEncoderDescriptor]) -> WGPURenderBundleEncoder: ... +@dll.bind(WGPURenderPipeline, WGPUDevice, c.POINTER[WGPURenderPipelineDescriptor]) +def wgpuDeviceCreateRenderPipeline(device:WGPUDevice, descriptor:c.POINTER[WGPURenderPipelineDescriptor]) -> WGPURenderPipeline: ... +@dll.bind(None, WGPUDevice, c.POINTER[WGPURenderPipelineDescriptor], WGPUCreateRenderPipelineAsyncCallback, ctypes.c_void_p) +def wgpuDeviceCreateRenderPipelineAsync(device:WGPUDevice, descriptor:c.POINTER[WGPURenderPipelineDescriptor], callback:WGPUCreateRenderPipelineAsyncCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(WGPUFuture, WGPUDevice, c.POINTER[WGPURenderPipelineDescriptor], WGPUCreateRenderPipelineAsyncCallbackInfo2) +def wgpuDeviceCreateRenderPipelineAsync2(device:WGPUDevice, descriptor:c.POINTER[WGPURenderPipelineDescriptor], callbackInfo:WGPUCreateRenderPipelineAsyncCallbackInfo2) -> WGPUFuture: ... +@dll.bind(WGPUFuture, WGPUDevice, c.POINTER[WGPURenderPipelineDescriptor], WGPUCreateRenderPipelineAsyncCallbackInfo) +def wgpuDeviceCreateRenderPipelineAsyncF(device:WGPUDevice, descriptor:c.POINTER[WGPURenderPipelineDescriptor], callbackInfo:WGPUCreateRenderPipelineAsyncCallbackInfo) -> WGPUFuture: ... +@dll.bind(WGPUSampler, WGPUDevice, c.POINTER[WGPUSamplerDescriptor]) +def wgpuDeviceCreateSampler(device:WGPUDevice, descriptor:c.POINTER[WGPUSamplerDescriptor]) -> WGPUSampler: ... +@dll.bind(WGPUShaderModule, WGPUDevice, c.POINTER[WGPUShaderModuleDescriptor]) +def wgpuDeviceCreateShaderModule(device:WGPUDevice, descriptor:c.POINTER[WGPUShaderModuleDescriptor]) -> WGPUShaderModule: ... +@dll.bind(WGPUTexture, WGPUDevice, c.POINTER[WGPUTextureDescriptor]) +def wgpuDeviceCreateTexture(device:WGPUDevice, descriptor:c.POINTER[WGPUTextureDescriptor]) -> WGPUTexture: ... +@dll.bind(None, WGPUDevice) +def wgpuDeviceDestroy(device:WGPUDevice) -> None: ... +@dll.bind(None, WGPUDevice, WGPUDeviceLostReason, WGPUStringView) +def wgpuDeviceForceLoss(device:WGPUDevice, type:WGPUDeviceLostReason, message:WGPUStringView) -> None: ... +@dll.bind(WGPUStatus, WGPUDevice, ctypes.c_void_p, c.POINTER[WGPUAHardwareBufferProperties]) +def wgpuDeviceGetAHardwareBufferProperties(device:WGPUDevice, handle:ctypes.c_void_p, properties:c.POINTER[WGPUAHardwareBufferProperties]) -> WGPUStatus: ... +@dll.bind(WGPUAdapter, WGPUDevice) +def wgpuDeviceGetAdapter(device:WGPUDevice) -> WGPUAdapter: ... +@dll.bind(WGPUStatus, WGPUDevice, c.POINTER[WGPUAdapterInfo]) +def wgpuDeviceGetAdapterInfo(device:WGPUDevice, adapterInfo:c.POINTER[WGPUAdapterInfo]) -> WGPUStatus: ... +@dll.bind(None, WGPUDevice, c.POINTER[WGPUSupportedFeatures]) +def wgpuDeviceGetFeatures(device:WGPUDevice, features:c.POINTER[WGPUSupportedFeatures]) -> None: ... +@dll.bind(WGPUStatus, WGPUDevice, c.POINTER[WGPUSupportedLimits]) +def wgpuDeviceGetLimits(device:WGPUDevice, limits:c.POINTER[WGPUSupportedLimits]) -> WGPUStatus: ... +@dll.bind(WGPUFuture, WGPUDevice) +def wgpuDeviceGetLostFuture(device:WGPUDevice) -> WGPUFuture: ... +@dll.bind(WGPUQueue, WGPUDevice) +def wgpuDeviceGetQueue(device:WGPUDevice) -> WGPUQueue: ... +@dll.bind(WGPUBool, WGPUDevice, WGPUFeatureName) +def wgpuDeviceHasFeature(device:WGPUDevice, feature:WGPUFeatureName) -> WGPUBool: ... +@dll.bind(WGPUSharedBufferMemory, WGPUDevice, c.POINTER[WGPUSharedBufferMemoryDescriptor]) +def wgpuDeviceImportSharedBufferMemory(device:WGPUDevice, descriptor:c.POINTER[WGPUSharedBufferMemoryDescriptor]) -> WGPUSharedBufferMemory: ... +@dll.bind(WGPUSharedFence, WGPUDevice, c.POINTER[WGPUSharedFenceDescriptor]) +def wgpuDeviceImportSharedFence(device:WGPUDevice, descriptor:c.POINTER[WGPUSharedFenceDescriptor]) -> WGPUSharedFence: ... +@dll.bind(WGPUSharedTextureMemory, WGPUDevice, c.POINTER[WGPUSharedTextureMemoryDescriptor]) +def wgpuDeviceImportSharedTextureMemory(device:WGPUDevice, descriptor:c.POINTER[WGPUSharedTextureMemoryDescriptor]) -> WGPUSharedTextureMemory: ... +@dll.bind(None, WGPUDevice, WGPUErrorType, WGPUStringView) +def wgpuDeviceInjectError(device:WGPUDevice, type:WGPUErrorType, message:WGPUStringView) -> None: ... +@dll.bind(None, WGPUDevice, WGPUErrorCallback, ctypes.c_void_p) +def wgpuDevicePopErrorScope(device:WGPUDevice, oldCallback:WGPUErrorCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(WGPUFuture, WGPUDevice, WGPUPopErrorScopeCallbackInfo2) +def wgpuDevicePopErrorScope2(device:WGPUDevice, callbackInfo:WGPUPopErrorScopeCallbackInfo2) -> WGPUFuture: ... +@dll.bind(WGPUFuture, WGPUDevice, WGPUPopErrorScopeCallbackInfo) +def wgpuDevicePopErrorScopeF(device:WGPUDevice, callbackInfo:WGPUPopErrorScopeCallbackInfo) -> WGPUFuture: ... +@dll.bind(None, WGPUDevice, WGPUErrorFilter) +def wgpuDevicePushErrorScope(device:WGPUDevice, filter:WGPUErrorFilter) -> None: ... +@dll.bind(None, WGPUDevice, WGPUStringView) +def wgpuDeviceSetLabel(device:WGPUDevice, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUDevice, WGPULoggingCallback, ctypes.c_void_p) +def wgpuDeviceSetLoggingCallback(device:WGPUDevice, callback:WGPULoggingCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(None, WGPUDevice) +def wgpuDeviceTick(device:WGPUDevice) -> None: ... +@dll.bind(None, WGPUDevice, c.POINTER[WGPUTextureDescriptor]) +def wgpuDeviceValidateTextureDescriptor(device:WGPUDevice, descriptor:c.POINTER[WGPUTextureDescriptor]) -> None: ... +@dll.bind(None, WGPUDevice) +def wgpuDeviceAddRef(device:WGPUDevice) -> None: ... +@dll.bind(None, WGPUDevice) +def wgpuDeviceRelease(device:WGPUDevice) -> None: ... +@dll.bind(None, WGPUExternalTexture) +def wgpuExternalTextureDestroy(externalTexture:WGPUExternalTexture) -> None: ... +@dll.bind(None, WGPUExternalTexture) +def wgpuExternalTextureExpire(externalTexture:WGPUExternalTexture) -> None: ... +@dll.bind(None, WGPUExternalTexture) +def wgpuExternalTextureRefresh(externalTexture:WGPUExternalTexture) -> None: ... +@dll.bind(None, WGPUExternalTexture, WGPUStringView) +def wgpuExternalTextureSetLabel(externalTexture:WGPUExternalTexture, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUExternalTexture) +def wgpuExternalTextureAddRef(externalTexture:WGPUExternalTexture) -> None: ... +@dll.bind(None, WGPUExternalTexture) +def wgpuExternalTextureRelease(externalTexture:WGPUExternalTexture) -> None: ... +@dll.bind(WGPUSurface, WGPUInstance, c.POINTER[WGPUSurfaceDescriptor]) +def wgpuInstanceCreateSurface(instance:WGPUInstance, descriptor:c.POINTER[WGPUSurfaceDescriptor]) -> WGPUSurface: ... +@dll.bind(size_t, WGPUInstance, c.POINTER[WGPUWGSLFeatureName]) +def wgpuInstanceEnumerateWGSLLanguageFeatures(instance:WGPUInstance, features:c.POINTER[WGPUWGSLFeatureName]) -> size_t: ... +@dll.bind(WGPUBool, WGPUInstance, WGPUWGSLFeatureName) +def wgpuInstanceHasWGSLLanguageFeature(instance:WGPUInstance, feature:WGPUWGSLFeatureName) -> WGPUBool: ... +@dll.bind(None, WGPUInstance) +def wgpuInstanceProcessEvents(instance:WGPUInstance) -> None: ... +@dll.bind(None, WGPUInstance, c.POINTER[WGPURequestAdapterOptions], WGPURequestAdapterCallback, ctypes.c_void_p) +def wgpuInstanceRequestAdapter(instance:WGPUInstance, options:c.POINTER[WGPURequestAdapterOptions], callback:WGPURequestAdapterCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(WGPUFuture, WGPUInstance, c.POINTER[WGPURequestAdapterOptions], WGPURequestAdapterCallbackInfo2) +def wgpuInstanceRequestAdapter2(instance:WGPUInstance, options:c.POINTER[WGPURequestAdapterOptions], callbackInfo:WGPURequestAdapterCallbackInfo2) -> WGPUFuture: ... +@dll.bind(WGPUFuture, WGPUInstance, c.POINTER[WGPURequestAdapterOptions], WGPURequestAdapterCallbackInfo) +def wgpuInstanceRequestAdapterF(instance:WGPUInstance, options:c.POINTER[WGPURequestAdapterOptions], callbackInfo:WGPURequestAdapterCallbackInfo) -> WGPUFuture: ... +@dll.bind(WGPUWaitStatus, WGPUInstance, size_t, c.POINTER[WGPUFutureWaitInfo], uint64_t) +def wgpuInstanceWaitAny(instance:WGPUInstance, futureCount:size_t, futures:c.POINTER[WGPUFutureWaitInfo], timeoutNS:uint64_t) -> WGPUWaitStatus: ... +@dll.bind(None, WGPUInstance) +def wgpuInstanceAddRef(instance:WGPUInstance) -> None: ... +@dll.bind(None, WGPUInstance) +def wgpuInstanceRelease(instance:WGPUInstance) -> None: ... +@dll.bind(None, WGPUPipelineLayout, WGPUStringView) +def wgpuPipelineLayoutSetLabel(pipelineLayout:WGPUPipelineLayout, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUPipelineLayout) +def wgpuPipelineLayoutAddRef(pipelineLayout:WGPUPipelineLayout) -> None: ... +@dll.bind(None, WGPUPipelineLayout) +def wgpuPipelineLayoutRelease(pipelineLayout:WGPUPipelineLayout) -> None: ... +@dll.bind(None, WGPUQuerySet) +def wgpuQuerySetDestroy(querySet:WGPUQuerySet) -> None: ... +@dll.bind(uint32_t, WGPUQuerySet) +def wgpuQuerySetGetCount(querySet:WGPUQuerySet) -> uint32_t: ... +@dll.bind(WGPUQueryType, WGPUQuerySet) +def wgpuQuerySetGetType(querySet:WGPUQuerySet) -> WGPUQueryType: ... +@dll.bind(None, WGPUQuerySet, WGPUStringView) +def wgpuQuerySetSetLabel(querySet:WGPUQuerySet, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUQuerySet) +def wgpuQuerySetAddRef(querySet:WGPUQuerySet) -> None: ... +@dll.bind(None, WGPUQuerySet) +def wgpuQuerySetRelease(querySet:WGPUQuerySet) -> None: ... +@dll.bind(None, WGPUQueue, c.POINTER[WGPUImageCopyExternalTexture], c.POINTER[WGPUImageCopyTexture], c.POINTER[WGPUExtent3D], c.POINTER[WGPUCopyTextureForBrowserOptions]) +def wgpuQueueCopyExternalTextureForBrowser(queue:WGPUQueue, source:c.POINTER[WGPUImageCopyExternalTexture], destination:c.POINTER[WGPUImageCopyTexture], copySize:c.POINTER[WGPUExtent3D], options:c.POINTER[WGPUCopyTextureForBrowserOptions]) -> None: ... +@dll.bind(None, WGPUQueue, c.POINTER[WGPUImageCopyTexture], c.POINTER[WGPUImageCopyTexture], c.POINTER[WGPUExtent3D], c.POINTER[WGPUCopyTextureForBrowserOptions]) +def wgpuQueueCopyTextureForBrowser(queue:WGPUQueue, source:c.POINTER[WGPUImageCopyTexture], destination:c.POINTER[WGPUImageCopyTexture], copySize:c.POINTER[WGPUExtent3D], options:c.POINTER[WGPUCopyTextureForBrowserOptions]) -> None: ... +@dll.bind(None, WGPUQueue, WGPUQueueWorkDoneCallback, ctypes.c_void_p) +def wgpuQueueOnSubmittedWorkDone(queue:WGPUQueue, callback:WGPUQueueWorkDoneCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(WGPUFuture, WGPUQueue, WGPUQueueWorkDoneCallbackInfo2) +def wgpuQueueOnSubmittedWorkDone2(queue:WGPUQueue, callbackInfo:WGPUQueueWorkDoneCallbackInfo2) -> WGPUFuture: ... +@dll.bind(WGPUFuture, WGPUQueue, WGPUQueueWorkDoneCallbackInfo) +def wgpuQueueOnSubmittedWorkDoneF(queue:WGPUQueue, callbackInfo:WGPUQueueWorkDoneCallbackInfo) -> WGPUFuture: ... +@dll.bind(None, WGPUQueue, WGPUStringView) +def wgpuQueueSetLabel(queue:WGPUQueue, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUQueue, size_t, c.POINTER[WGPUCommandBuffer]) +def wgpuQueueSubmit(queue:WGPUQueue, commandCount:size_t, commands:c.POINTER[WGPUCommandBuffer]) -> None: ... +@dll.bind(None, WGPUQueue, WGPUBuffer, uint64_t, ctypes.c_void_p, size_t) +def wgpuQueueWriteBuffer(queue:WGPUQueue, buffer:WGPUBuffer, bufferOffset:uint64_t, data:ctypes.c_void_p, size:size_t) -> None: ... +@dll.bind(None, WGPUQueue, c.POINTER[WGPUImageCopyTexture], ctypes.c_void_p, size_t, c.POINTER[WGPUTextureDataLayout], c.POINTER[WGPUExtent3D]) +def wgpuQueueWriteTexture(queue:WGPUQueue, destination:c.POINTER[WGPUImageCopyTexture], data:ctypes.c_void_p, dataSize:size_t, dataLayout:c.POINTER[WGPUTextureDataLayout], writeSize:c.POINTER[WGPUExtent3D]) -> None: ... +@dll.bind(None, WGPUQueue) +def wgpuQueueAddRef(queue:WGPUQueue) -> None: ... +@dll.bind(None, WGPUQueue) +def wgpuQueueRelease(queue:WGPUQueue) -> None: ... +@dll.bind(None, WGPURenderBundle, WGPUStringView) +def wgpuRenderBundleSetLabel(renderBundle:WGPURenderBundle, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPURenderBundle) +def wgpuRenderBundleAddRef(renderBundle:WGPURenderBundle) -> None: ... +@dll.bind(None, WGPURenderBundle) +def wgpuRenderBundleRelease(renderBundle:WGPURenderBundle) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, uint32_t, uint32_t, uint32_t, uint32_t) +def wgpuRenderBundleEncoderDraw(renderBundleEncoder:WGPURenderBundleEncoder, vertexCount:uint32_t, instanceCount:uint32_t, firstVertex:uint32_t, firstInstance:uint32_t) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, uint32_t, uint32_t, uint32_t, int32_t, uint32_t) +def wgpuRenderBundleEncoderDrawIndexed(renderBundleEncoder:WGPURenderBundleEncoder, indexCount:uint32_t, instanceCount:uint32_t, firstIndex:uint32_t, baseVertex:int32_t, firstInstance:uint32_t) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, WGPUBuffer, uint64_t) +def wgpuRenderBundleEncoderDrawIndexedIndirect(renderBundleEncoder:WGPURenderBundleEncoder, indirectBuffer:WGPUBuffer, indirectOffset:uint64_t) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, WGPUBuffer, uint64_t) +def wgpuRenderBundleEncoderDrawIndirect(renderBundleEncoder:WGPURenderBundleEncoder, indirectBuffer:WGPUBuffer, indirectOffset:uint64_t) -> None: ... +@dll.bind(WGPURenderBundle, WGPURenderBundleEncoder, c.POINTER[WGPURenderBundleDescriptor]) +def wgpuRenderBundleEncoderFinish(renderBundleEncoder:WGPURenderBundleEncoder, descriptor:c.POINTER[WGPURenderBundleDescriptor]) -> WGPURenderBundle: ... +@dll.bind(None, WGPURenderBundleEncoder, WGPUStringView) +def wgpuRenderBundleEncoderInsertDebugMarker(renderBundleEncoder:WGPURenderBundleEncoder, markerLabel:WGPUStringView) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder) +def wgpuRenderBundleEncoderPopDebugGroup(renderBundleEncoder:WGPURenderBundleEncoder) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, WGPUStringView) +def wgpuRenderBundleEncoderPushDebugGroup(renderBundleEncoder:WGPURenderBundleEncoder, groupLabel:WGPUStringView) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, uint32_t, WGPUBindGroup, size_t, c.POINTER[uint32_t]) +def wgpuRenderBundleEncoderSetBindGroup(renderBundleEncoder:WGPURenderBundleEncoder, groupIndex:uint32_t, group:WGPUBindGroup, dynamicOffsetCount:size_t, dynamicOffsets:c.POINTER[uint32_t]) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, WGPUBuffer, WGPUIndexFormat, uint64_t, uint64_t) +def wgpuRenderBundleEncoderSetIndexBuffer(renderBundleEncoder:WGPURenderBundleEncoder, buffer:WGPUBuffer, format:WGPUIndexFormat, offset:uint64_t, size:uint64_t) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, WGPUStringView) +def wgpuRenderBundleEncoderSetLabel(renderBundleEncoder:WGPURenderBundleEncoder, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, WGPURenderPipeline) +def wgpuRenderBundleEncoderSetPipeline(renderBundleEncoder:WGPURenderBundleEncoder, pipeline:WGPURenderPipeline) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder, uint32_t, WGPUBuffer, uint64_t, uint64_t) +def wgpuRenderBundleEncoderSetVertexBuffer(renderBundleEncoder:WGPURenderBundleEncoder, slot:uint32_t, buffer:WGPUBuffer, offset:uint64_t, size:uint64_t) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder) +def wgpuRenderBundleEncoderAddRef(renderBundleEncoder:WGPURenderBundleEncoder) -> None: ... +@dll.bind(None, WGPURenderBundleEncoder) +def wgpuRenderBundleEncoderRelease(renderBundleEncoder:WGPURenderBundleEncoder) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, uint32_t) +def wgpuRenderPassEncoderBeginOcclusionQuery(renderPassEncoder:WGPURenderPassEncoder, queryIndex:uint32_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, uint32_t, uint32_t, uint32_t, uint32_t) +def wgpuRenderPassEncoderDraw(renderPassEncoder:WGPURenderPassEncoder, vertexCount:uint32_t, instanceCount:uint32_t, firstVertex:uint32_t, firstInstance:uint32_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, uint32_t, uint32_t, uint32_t, int32_t, uint32_t) +def wgpuRenderPassEncoderDrawIndexed(renderPassEncoder:WGPURenderPassEncoder, indexCount:uint32_t, instanceCount:uint32_t, firstIndex:uint32_t, baseVertex:int32_t, firstInstance:uint32_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUBuffer, uint64_t) +def wgpuRenderPassEncoderDrawIndexedIndirect(renderPassEncoder:WGPURenderPassEncoder, indirectBuffer:WGPUBuffer, indirectOffset:uint64_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUBuffer, uint64_t) +def wgpuRenderPassEncoderDrawIndirect(renderPassEncoder:WGPURenderPassEncoder, indirectBuffer:WGPUBuffer, indirectOffset:uint64_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder) +def wgpuRenderPassEncoderEnd(renderPassEncoder:WGPURenderPassEncoder) -> None: ... +@dll.bind(None, WGPURenderPassEncoder) +def wgpuRenderPassEncoderEndOcclusionQuery(renderPassEncoder:WGPURenderPassEncoder) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, size_t, c.POINTER[WGPURenderBundle]) +def wgpuRenderPassEncoderExecuteBundles(renderPassEncoder:WGPURenderPassEncoder, bundleCount:size_t, bundles:c.POINTER[WGPURenderBundle]) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUStringView) +def wgpuRenderPassEncoderInsertDebugMarker(renderPassEncoder:WGPURenderPassEncoder, markerLabel:WGPUStringView) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUBuffer, uint64_t, uint32_t, WGPUBuffer, uint64_t) +def wgpuRenderPassEncoderMultiDrawIndexedIndirect(renderPassEncoder:WGPURenderPassEncoder, indirectBuffer:WGPUBuffer, indirectOffset:uint64_t, maxDrawCount:uint32_t, drawCountBuffer:WGPUBuffer, drawCountBufferOffset:uint64_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUBuffer, uint64_t, uint32_t, WGPUBuffer, uint64_t) +def wgpuRenderPassEncoderMultiDrawIndirect(renderPassEncoder:WGPURenderPassEncoder, indirectBuffer:WGPUBuffer, indirectOffset:uint64_t, maxDrawCount:uint32_t, drawCountBuffer:WGPUBuffer, drawCountBufferOffset:uint64_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder) +def wgpuRenderPassEncoderPixelLocalStorageBarrier(renderPassEncoder:WGPURenderPassEncoder) -> None: ... +@dll.bind(None, WGPURenderPassEncoder) +def wgpuRenderPassEncoderPopDebugGroup(renderPassEncoder:WGPURenderPassEncoder) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUStringView) +def wgpuRenderPassEncoderPushDebugGroup(renderPassEncoder:WGPURenderPassEncoder, groupLabel:WGPUStringView) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, uint32_t, WGPUBindGroup, size_t, c.POINTER[uint32_t]) +def wgpuRenderPassEncoderSetBindGroup(renderPassEncoder:WGPURenderPassEncoder, groupIndex:uint32_t, group:WGPUBindGroup, dynamicOffsetCount:size_t, dynamicOffsets:c.POINTER[uint32_t]) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, c.POINTER[WGPUColor]) +def wgpuRenderPassEncoderSetBlendConstant(renderPassEncoder:WGPURenderPassEncoder, color:c.POINTER[WGPUColor]) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUBuffer, WGPUIndexFormat, uint64_t, uint64_t) +def wgpuRenderPassEncoderSetIndexBuffer(renderPassEncoder:WGPURenderPassEncoder, buffer:WGPUBuffer, format:WGPUIndexFormat, offset:uint64_t, size:uint64_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUStringView) +def wgpuRenderPassEncoderSetLabel(renderPassEncoder:WGPURenderPassEncoder, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPURenderPipeline) +def wgpuRenderPassEncoderSetPipeline(renderPassEncoder:WGPURenderPassEncoder, pipeline:WGPURenderPipeline) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, uint32_t, uint32_t, uint32_t, uint32_t) +def wgpuRenderPassEncoderSetScissorRect(renderPassEncoder:WGPURenderPassEncoder, x:uint32_t, y:uint32_t, width:uint32_t, height:uint32_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, uint32_t) +def wgpuRenderPassEncoderSetStencilReference(renderPassEncoder:WGPURenderPassEncoder, reference:uint32_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, uint32_t, WGPUBuffer, uint64_t, uint64_t) +def wgpuRenderPassEncoderSetVertexBuffer(renderPassEncoder:WGPURenderPassEncoder, slot:uint32_t, buffer:WGPUBuffer, offset:uint64_t, size:uint64_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float) +def wgpuRenderPassEncoderSetViewport(renderPassEncoder:WGPURenderPassEncoder, x:float, y:float, width:float, height:float, minDepth:float, maxDepth:float) -> None: ... +@dll.bind(None, WGPURenderPassEncoder, WGPUQuerySet, uint32_t) +def wgpuRenderPassEncoderWriteTimestamp(renderPassEncoder:WGPURenderPassEncoder, querySet:WGPUQuerySet, queryIndex:uint32_t) -> None: ... +@dll.bind(None, WGPURenderPassEncoder) +def wgpuRenderPassEncoderAddRef(renderPassEncoder:WGPURenderPassEncoder) -> None: ... +@dll.bind(None, WGPURenderPassEncoder) +def wgpuRenderPassEncoderRelease(renderPassEncoder:WGPURenderPassEncoder) -> None: ... +@dll.bind(WGPUBindGroupLayout, WGPURenderPipeline, uint32_t) +def wgpuRenderPipelineGetBindGroupLayout(renderPipeline:WGPURenderPipeline, groupIndex:uint32_t) -> WGPUBindGroupLayout: ... +@dll.bind(None, WGPURenderPipeline, WGPUStringView) +def wgpuRenderPipelineSetLabel(renderPipeline:WGPURenderPipeline, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPURenderPipeline) +def wgpuRenderPipelineAddRef(renderPipeline:WGPURenderPipeline) -> None: ... +@dll.bind(None, WGPURenderPipeline) +def wgpuRenderPipelineRelease(renderPipeline:WGPURenderPipeline) -> None: ... +@dll.bind(None, WGPUSampler, WGPUStringView) +def wgpuSamplerSetLabel(sampler:WGPUSampler, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUSampler) +def wgpuSamplerAddRef(sampler:WGPUSampler) -> None: ... +@dll.bind(None, WGPUSampler) +def wgpuSamplerRelease(sampler:WGPUSampler) -> None: ... +@dll.bind(None, WGPUShaderModule, WGPUCompilationInfoCallback, ctypes.c_void_p) +def wgpuShaderModuleGetCompilationInfo(shaderModule:WGPUShaderModule, callback:WGPUCompilationInfoCallback, userdata:ctypes.c_void_p) -> None: ... +@dll.bind(WGPUFuture, WGPUShaderModule, WGPUCompilationInfoCallbackInfo2) +def wgpuShaderModuleGetCompilationInfo2(shaderModule:WGPUShaderModule, callbackInfo:WGPUCompilationInfoCallbackInfo2) -> WGPUFuture: ... +@dll.bind(WGPUFuture, WGPUShaderModule, WGPUCompilationInfoCallbackInfo) +def wgpuShaderModuleGetCompilationInfoF(shaderModule:WGPUShaderModule, callbackInfo:WGPUCompilationInfoCallbackInfo) -> WGPUFuture: ... +@dll.bind(None, WGPUShaderModule, WGPUStringView) +def wgpuShaderModuleSetLabel(shaderModule:WGPUShaderModule, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUShaderModule) +def wgpuShaderModuleAddRef(shaderModule:WGPUShaderModule) -> None: ... +@dll.bind(None, WGPUShaderModule) +def wgpuShaderModuleRelease(shaderModule:WGPUShaderModule) -> None: ... +@dll.bind(WGPUStatus, WGPUSharedBufferMemory, WGPUBuffer, c.POINTER[WGPUSharedBufferMemoryBeginAccessDescriptor]) +def wgpuSharedBufferMemoryBeginAccess(sharedBufferMemory:WGPUSharedBufferMemory, buffer:WGPUBuffer, descriptor:c.POINTER[WGPUSharedBufferMemoryBeginAccessDescriptor]) -> WGPUStatus: ... +@dll.bind(WGPUBuffer, WGPUSharedBufferMemory, c.POINTER[WGPUBufferDescriptor]) +def wgpuSharedBufferMemoryCreateBuffer(sharedBufferMemory:WGPUSharedBufferMemory, descriptor:c.POINTER[WGPUBufferDescriptor]) -> WGPUBuffer: ... +@dll.bind(WGPUStatus, WGPUSharedBufferMemory, WGPUBuffer, c.POINTER[WGPUSharedBufferMemoryEndAccessState]) +def wgpuSharedBufferMemoryEndAccess(sharedBufferMemory:WGPUSharedBufferMemory, buffer:WGPUBuffer, descriptor:c.POINTER[WGPUSharedBufferMemoryEndAccessState]) -> WGPUStatus: ... +@dll.bind(WGPUStatus, WGPUSharedBufferMemory, c.POINTER[WGPUSharedBufferMemoryProperties]) +def wgpuSharedBufferMemoryGetProperties(sharedBufferMemory:WGPUSharedBufferMemory, properties:c.POINTER[WGPUSharedBufferMemoryProperties]) -> WGPUStatus: ... +@dll.bind(WGPUBool, WGPUSharedBufferMemory) +def wgpuSharedBufferMemoryIsDeviceLost(sharedBufferMemory:WGPUSharedBufferMemory) -> WGPUBool: ... +@dll.bind(None, WGPUSharedBufferMemory, WGPUStringView) +def wgpuSharedBufferMemorySetLabel(sharedBufferMemory:WGPUSharedBufferMemory, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUSharedBufferMemory) +def wgpuSharedBufferMemoryAddRef(sharedBufferMemory:WGPUSharedBufferMemory) -> None: ... +@dll.bind(None, WGPUSharedBufferMemory) +def wgpuSharedBufferMemoryRelease(sharedBufferMemory:WGPUSharedBufferMemory) -> None: ... +@dll.bind(None, WGPUSharedFence, c.POINTER[WGPUSharedFenceExportInfo]) +def wgpuSharedFenceExportInfo(sharedFence:WGPUSharedFence, info:c.POINTER[WGPUSharedFenceExportInfo]) -> None: ... +@dll.bind(None, WGPUSharedFence) +def wgpuSharedFenceAddRef(sharedFence:WGPUSharedFence) -> None: ... +@dll.bind(None, WGPUSharedFence) +def wgpuSharedFenceRelease(sharedFence:WGPUSharedFence) -> None: ... +@dll.bind(WGPUStatus, WGPUSharedTextureMemory, WGPUTexture, c.POINTER[WGPUSharedTextureMemoryBeginAccessDescriptor]) +def wgpuSharedTextureMemoryBeginAccess(sharedTextureMemory:WGPUSharedTextureMemory, texture:WGPUTexture, descriptor:c.POINTER[WGPUSharedTextureMemoryBeginAccessDescriptor]) -> WGPUStatus: ... +@dll.bind(WGPUTexture, WGPUSharedTextureMemory, c.POINTER[WGPUTextureDescriptor]) +def wgpuSharedTextureMemoryCreateTexture(sharedTextureMemory:WGPUSharedTextureMemory, descriptor:c.POINTER[WGPUTextureDescriptor]) -> WGPUTexture: ... +@dll.bind(WGPUStatus, WGPUSharedTextureMemory, WGPUTexture, c.POINTER[WGPUSharedTextureMemoryEndAccessState]) +def wgpuSharedTextureMemoryEndAccess(sharedTextureMemory:WGPUSharedTextureMemory, texture:WGPUTexture, descriptor:c.POINTER[WGPUSharedTextureMemoryEndAccessState]) -> WGPUStatus: ... +@dll.bind(WGPUStatus, WGPUSharedTextureMemory, c.POINTER[WGPUSharedTextureMemoryProperties]) +def wgpuSharedTextureMemoryGetProperties(sharedTextureMemory:WGPUSharedTextureMemory, properties:c.POINTER[WGPUSharedTextureMemoryProperties]) -> WGPUStatus: ... +@dll.bind(WGPUBool, WGPUSharedTextureMemory) +def wgpuSharedTextureMemoryIsDeviceLost(sharedTextureMemory:WGPUSharedTextureMemory) -> WGPUBool: ... +@dll.bind(None, WGPUSharedTextureMemory, WGPUStringView) +def wgpuSharedTextureMemorySetLabel(sharedTextureMemory:WGPUSharedTextureMemory, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUSharedTextureMemory) +def wgpuSharedTextureMemoryAddRef(sharedTextureMemory:WGPUSharedTextureMemory) -> None: ... +@dll.bind(None, WGPUSharedTextureMemory) +def wgpuSharedTextureMemoryRelease(sharedTextureMemory:WGPUSharedTextureMemory) -> None: ... +@dll.bind(None, WGPUSurface, c.POINTER[WGPUSurfaceConfiguration]) +def wgpuSurfaceConfigure(surface:WGPUSurface, config:c.POINTER[WGPUSurfaceConfiguration]) -> None: ... +@dll.bind(WGPUStatus, WGPUSurface, WGPUAdapter, c.POINTER[WGPUSurfaceCapabilities]) +def wgpuSurfaceGetCapabilities(surface:WGPUSurface, adapter:WGPUAdapter, capabilities:c.POINTER[WGPUSurfaceCapabilities]) -> WGPUStatus: ... +@dll.bind(None, WGPUSurface, c.POINTER[WGPUSurfaceTexture]) +def wgpuSurfaceGetCurrentTexture(surface:WGPUSurface, surfaceTexture:c.POINTER[WGPUSurfaceTexture]) -> None: ... +@dll.bind(None, WGPUSurface) +def wgpuSurfacePresent(surface:WGPUSurface) -> None: ... +@dll.bind(None, WGPUSurface, WGPUStringView) +def wgpuSurfaceSetLabel(surface:WGPUSurface, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUSurface) +def wgpuSurfaceUnconfigure(surface:WGPUSurface) -> None: ... +@dll.bind(None, WGPUSurface) +def wgpuSurfaceAddRef(surface:WGPUSurface) -> None: ... +@dll.bind(None, WGPUSurface) +def wgpuSurfaceRelease(surface:WGPUSurface) -> None: ... +@dll.bind(WGPUTextureView, WGPUTexture, c.POINTER[WGPUTextureViewDescriptor]) +def wgpuTextureCreateErrorView(texture:WGPUTexture, descriptor:c.POINTER[WGPUTextureViewDescriptor]) -> WGPUTextureView: ... +@dll.bind(WGPUTextureView, WGPUTexture, c.POINTER[WGPUTextureViewDescriptor]) +def wgpuTextureCreateView(texture:WGPUTexture, descriptor:c.POINTER[WGPUTextureViewDescriptor]) -> WGPUTextureView: ... +@dll.bind(None, WGPUTexture) +def wgpuTextureDestroy(texture:WGPUTexture) -> None: ... +@dll.bind(uint32_t, WGPUTexture) +def wgpuTextureGetDepthOrArrayLayers(texture:WGPUTexture) -> uint32_t: ... +@dll.bind(WGPUTextureDimension, WGPUTexture) +def wgpuTextureGetDimension(texture:WGPUTexture) -> WGPUTextureDimension: ... +@dll.bind(WGPUTextureFormat, WGPUTexture) +def wgpuTextureGetFormat(texture:WGPUTexture) -> WGPUTextureFormat: ... +@dll.bind(uint32_t, WGPUTexture) +def wgpuTextureGetHeight(texture:WGPUTexture) -> uint32_t: ... +@dll.bind(uint32_t, WGPUTexture) +def wgpuTextureGetMipLevelCount(texture:WGPUTexture) -> uint32_t: ... +@dll.bind(uint32_t, WGPUTexture) +def wgpuTextureGetSampleCount(texture:WGPUTexture) -> uint32_t: ... +@dll.bind(WGPUTextureUsage, WGPUTexture) +def wgpuTextureGetUsage(texture:WGPUTexture) -> WGPUTextureUsage: ... +@dll.bind(uint32_t, WGPUTexture) +def wgpuTextureGetWidth(texture:WGPUTexture) -> uint32_t: ... +@dll.bind(None, WGPUTexture, WGPUStringView) +def wgpuTextureSetLabel(texture:WGPUTexture, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUTexture) +def wgpuTextureAddRef(texture:WGPUTexture) -> None: ... +@dll.bind(None, WGPUTexture) +def wgpuTextureRelease(texture:WGPUTexture) -> None: ... +@dll.bind(None, WGPUTextureView, WGPUStringView) +def wgpuTextureViewSetLabel(textureView:WGPUTextureView, label:WGPUStringView) -> None: ... +@dll.bind(None, WGPUTextureView) +def wgpuTextureViewAddRef(textureView:WGPUTextureView) -> None: ... +@dll.bind(None, WGPUTextureView) +def wgpuTextureViewRelease(textureView:WGPUTextureView) -> None: ... +WGPUBufferUsage_None = 0x0000000000000000 +WGPUBufferUsage_MapRead = 0x0000000000000001 +WGPUBufferUsage_MapWrite = 0x0000000000000002 +WGPUBufferUsage_CopySrc = 0x0000000000000004 +WGPUBufferUsage_CopyDst = 0x0000000000000008 +WGPUBufferUsage_Index = 0x0000000000000010 +WGPUBufferUsage_Vertex = 0x0000000000000020 +WGPUBufferUsage_Uniform = 0x0000000000000040 +WGPUBufferUsage_Storage = 0x0000000000000080 +WGPUBufferUsage_Indirect = 0x0000000000000100 +WGPUBufferUsage_QueryResolve = 0x0000000000000200 +WGPUColorWriteMask_None = 0x0000000000000000 +WGPUColorWriteMask_Red = 0x0000000000000001 +WGPUColorWriteMask_Green = 0x0000000000000002 +WGPUColorWriteMask_Blue = 0x0000000000000004 +WGPUColorWriteMask_Alpha = 0x0000000000000008 +WGPUColorWriteMask_All = 0x000000000000000F +WGPUHeapProperty_DeviceLocal = 0x0000000000000001 +WGPUHeapProperty_HostVisible = 0x0000000000000002 +WGPUHeapProperty_HostCoherent = 0x0000000000000004 +WGPUHeapProperty_HostUncached = 0x0000000000000008 +WGPUHeapProperty_HostCached = 0x0000000000000010 +WGPUMapMode_None = 0x0000000000000000 +WGPUMapMode_Read = 0x0000000000000001 +WGPUMapMode_Write = 0x0000000000000002 +WGPUShaderStage_None = 0x0000000000000000 +WGPUShaderStage_Vertex = 0x0000000000000001 +WGPUShaderStage_Fragment = 0x0000000000000002 +WGPUShaderStage_Compute = 0x0000000000000004 +WGPUTextureUsage_None = 0x0000000000000000 +WGPUTextureUsage_CopySrc = 0x0000000000000001 +WGPUTextureUsage_CopyDst = 0x0000000000000002 +WGPUTextureUsage_TextureBinding = 0x0000000000000004 +WGPUTextureUsage_StorageBinding = 0x0000000000000008 +WGPUTextureUsage_RenderAttachment = 0x0000000000000010 +WGPUTextureUsage_TransientAttachment = 0x0000000000000020 +WGPUTextureUsage_StorageAttachment = 0x0000000000000040 \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/runtime/graph/__init__.py b/artifacts/package_runtime/tinygrad/runtime/graph/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/graph/cuda.py b/artifacts/package_runtime/tinygrad/runtime/graph/cuda.py new file mode 100644 index 000000000..ed228d135 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/graph/cuda.py @@ -0,0 +1,74 @@ +import ctypes +from typing import Any, cast +import tinygrad.runtime.autogen.cuda as cuda +from tinygrad.runtime.support.c import init_c_var +from tinygrad.device import Device, MultiBuffer +from tinygrad.uop.ops import UOp, Ops +from tinygrad.runtime.ops_cuda import CUDADevice, check, encode_args, cu_time_execution +from tinygrad.engine.jit import MultiGraphRunner + +class CUDAGraph(MultiGraphRunner): + def __init__(self, linear, input_uops=()): + super().__init__(linear, input_uops) + + self.nodes: list[tuple[Any, ...]] = [] # list of tuple(graph node, node params, c_args/context, is memcpy) + self.graph = init_c_var(cuda.CUgraph, lambda x: check(cuda.cuGraphCreate(ctypes.byref(x), 0))) + + for (dev_idx, ast, bufs, device_vars), runtime in zip(self.calls, self.runtimes): + if ast.op is Ops.PROGRAM: + assert runtime is not None + global_size, local_size = ast.arg.launch_dims({v: 0 for v in self.vars}) + + c_deps, new_node = self.new_node([b.base for b in bufs], ast.arg.outs) + c_args, vargs = encode_args([b._buf for b in bufs], [device_vars.get(x.expr, 0) for x in ast.arg.vars], runtime.signature) + kern_params = cuda.CUDA_KERNEL_NODE_PARAMS_v1(runtime.prg, *global_size, *local_size, runtime.smem, + ctypes.cast(0, ctypes.POINTER(ctypes.c_void_p)), vargs) + check(cuda.cuGraphAddKernelNode(ctypes.byref(new_node), self.graph, c_deps, len(c_deps or []), ctypes.byref(kern_params))) + + self.nodes.append((new_node, kern_params, c_args, False)) + elif ast.op is Ops.COPY: + dest, src = bufs[0], bufs[1] + src_dev = cast(CUDADevice, Device[src.device]) + c_deps, new_node = self.new_node([dest.base, src.base], [0]) + cp_params = cuda.CUDA_MEMCPY3D_v2(srcMemoryType=cuda.CU_MEMORYTYPE_DEVICE, srcDevice=src._buf, srcPitch=src.nbytes, srcHeight=1, + dstMemoryType=cuda.CU_MEMORYTYPE_DEVICE, dstDevice=dest._buf, dstPitch=dest.nbytes, dstHeight=1, + WidthInBytes=dest.nbytes, Height=1, Depth=1) + check(cuda.cuGraphAddMemcpyNode(ctypes.byref(new_node), self.graph, c_deps, len(c_deps or []), ctypes.byref(cp_params), src_dev.context)) + + self.nodes.append((new_node, cp_params, src_dev.context, True)) + + self.instance = init_c_var(cuda.CUgraphExec, lambda x: check(cuda.cuGraphInstantiate_v2(ctypes.byref(x), self.graph, None, None, 0))) + self.updatable = sorted({j for j,r in enumerate(self.uop_replace) if r} | self.var_vals_replace.keys() | self.launch_dims_replace.keys()) + + def new_node(self, bufs, write): + deps = self._access_resources(bufs, write, new_dependency=(node:=cuda.CUgraphNode())) + return (cuda.CUgraphNode*len(deps))(*deps) if deps else None, node + + def __call__(self, input_uops:tuple[UOp, ...], var_vals:dict[str, int], wait=False): + # Update buffers in the c_args struct. + for j in self.updatable: + (_, params, c_args, is_copy), dev_idx = self.nodes[j], self.calls[j][0] + for pos, iidx in self.uop_replace[j]: + buf = b.bufs[dev_idx] if isinstance(b:=input_uops[iidx].buffer, MultiBuffer) else b + if not is_copy: setattr(c_args, f'f{pos}', buf._buf) + else: setattr(params, 'srcDevice' if pos == 1 else 'dstDevice', buf._buf) + + # Update var_vals in the c_args struct. + for j, i, v in self.updated_vars(var_vals): setattr(self.nodes[j][2], f'v{i}', v) + + # Update launch dims in the kern_params struct. + for j, global_dims, local_dims in self.updated_launch_dims(var_vals): + node = self.nodes[j][1] + node.blockDimX, node.blockDimY, node.blockDimZ, node.gridDimX, node.gridDimY, node.gridDimZ = *local_dims, *global_dims # type: ignore[misc] + + # Update graph nodes with the updated structs. + for j in self.updatable: + node, c_node_params, c_args, is_copy = self.nodes[j] + if not is_copy: check(cuda.cuGraphExecKernelNodeSetParams(self.instance, node, ctypes.byref(c_node_params))) + else: check(cuda.cuGraphExecMemcpyNodeSetParams(self.instance, node, ctypes.byref(c_node_params), c_args)) + + return cu_time_execution(lambda: check(cuda.cuGraphLaunch(self.instance, None)), enable=wait) + + def __del__(self): + if hasattr(self, 'graph'): check(cuda.cuGraphDestroy(self.graph)) + if hasattr(self, 'instance'): check(cuda.cuGraphExecDestroy(self.instance)) diff --git a/artifacts/package_runtime/tinygrad/runtime/graph/hcq.py b/artifacts/package_runtime/tinygrad/runtime/graph/hcq.py new file mode 100644 index 000000000..dbe321159 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/graph/hcq.py @@ -0,0 +1,336 @@ +import collections, time +from typing import Any, cast +from tinygrad.helpers import round_up, PROFILE, ALL2ALL, merge_dicts, getenv, suppress_finalizing, TracingKey, unwrap +from tinygrad.runtime.support.hcq import HCQCompiled, HCQAllocator, HCQSignal, HCQBuffer, HWQueue, HCQArgsState, BumpAllocator, MMIOInterface +from tinygrad.device import Buffer, BufferSpec, Compiled, Device, MultiBuffer, ProfileGraphEntry, ProfileGraphEvent +from tinygrad.dtype import dtypes +from tinygrad.uop.ops import UOp, Ops, Variable +from tinygrad.engine.jit import GraphRunner, MultiGraphRunner +from tinygrad.runtime.ops_rdma import RDMACopyQueue + +class HCQGraph(MultiGraphRunner): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.devices = list({cast(HCQCompiled, Device[b.device]) for (_,_,bufs,_) in self.calls for b in bufs}) + + # CPU Device is always last + self.devices = sorted(self.devices, key=lambda x: 1 if x._is_cpu() else 0) + + # Replace input buffers with variables. + self.hcq_bufs = [[b._buf for b in bufs] for (_,_,bufs,_) in self.calls] + self.input_replace_to_var: dict[tuple[int, int], Variable] = {} + + for j, replace in enumerate(self.uop_replace): + for pos, iidx in replace: + x = self.input_replace_to_var.setdefault((j,pos), UOp.variable(f"inp_{iidx}_{self.calls[j][0]}", 0, 0xffffffffffffffff, dtype=dtypes.uint64)) + self.hcq_bufs[j][pos] = HCQBuffer(x, self.hcq_bufs[j][pos].size) # Create fake buffer with variable + + # Allocate kernel args. + kernargs_size: dict[Compiled, int] = collections.defaultdict(int) + for runtime in self.runtimes: + if runtime is None: continue + kernargs_size[runtime.dev] += round_up(runtime.kernargs_alloc_size, 16) + self.kernargs_bufs: dict[Compiled, HCQBuffer] = {d:d.allocator._alloc(max(sz, 1), BufferSpec(cpu_access=True)) for d,sz in kernargs_size.items()} + + # Fill initial arguments. + self.ji_args: dict[int, HCQArgsState] = {} + + kargs_alloc: dict[Compiled, BumpAllocator] = {dev:BumpAllocator(buf.size) for dev,buf in self.kernargs_bufs.items()} + for j, runtime in enumerate(self.runtimes): + if runtime is None: continue + argsbuf = self.kernargs_bufs[runtime.dev].offset(kargs_alloc[runtime.dev].alloc(runtime.kernargs_alloc_size, 16)) + self.ji_args[j] = runtime.fill_kernargs(self.hcq_bufs[j], self.calls[j][1].arg.vars, argsbuf) + + # Schedule Dependencies. + # There are two types of queues on each device: copy and compute. Both must synchronize with all external operations before launching any + # graph-related tasks. This synchronization uses a global timeline signal per device. Within the graph, the compute queue coordinates with + # global operations and sets a kickoff signal. Any queue accessing a buffer from another device waits for this signal from the device’s + # compute queue to ensure exclusive access. The compute queue signals the completion of the graph, synchronizing with the device's copy queue. + self.ji_schedule: dict[int, tuple[HCQCompiled, HWQueue, list, list, HCQSignal, int|None]] = {} + + self.comp_queues: dict[HCQCompiled, HWQueue] = {dev: unwrap(dev.hw_compute_queue_t)() for dev in self.devices} + self.copy_queues: dict[tuple[HCQCompiled, int], HWQueue] = {} # lazy allocation, keyed by (device, queue_idx) + self.rdma_queues: dict[tuple[HCQCompiled, HCQCompiled], RDMACopyQueue] = {} # lazy allocation, keyed by device pair + self.num_copy_queues: int = getenv("HCQ_NUM_SDMA", min(len(self.devices), 8) if ALL2ALL >= 1 else 1) + self.num_rdma_ops: dict[tuple[HCQCompiled, HCQCompiled], int] = collections.defaultdict(int) + + self.rdma_vars: dict[tuple[HCQCompiled, HCQCompiled], tuple[Variable, Any]] = {} # value is variable and src_qp + self.rdma_deps: dict[int, tuple[HWQueue, list[tuple[HCQSignal, int]], HCQSignal, int]] = {} + self.rdma_last_dest: dict[int, tuple[HWQueue, int]] = {} # per QP id: last (queue, signal_value) for dbell ordering + + # Per-peer-group representative device for signal allocation. For cpu, use devices[0]. + self.pg_dev: dict[Any, HCQCompiled] = {dev.peer_group: self.devices[0] for dev in self.devices if dev._is_cpu()} \ + | {dev.peer_group: dev for dev in self.devices if not dev._is_cpu()} + + self.kick_signals: dict[Any, HCQSignal] = {pg: pg_dev.new_signal(value=0) for pg, pg_dev in self.pg_dev.items()} + self.signals: dict[Any, HCQSignal] = {**{dev: dev.new_signal(value=0) for dev in self.devices if not dev._is_cpu()}, + **{dev: self.pg_dev[dev.peer_group].new_signal(value=0) for dev in self.devices if dev._is_cpu()}} + self.kickoff_value: int = 0 + self.kickoff_var = UOp.variable("kickoff_var", 0, 0xffffffff, dtype=dtypes.uint32) + + # When profiling allocate 2 signals for each jit item to measure speed. The jth jit item have signals at 2*j and 2*j+1. + # TODO: This logic might allocate a few extra signals... + self.prof_signals: list[HCQSignal] = [] + self.prof_graph_deps: list[list[int]] = [] + self.prof_graph_entries: list[ProfileGraphEntry] = [] + + self.last_j: dict[HWQueue, int|None] = collections.defaultdict(lambda: None) + self.queue_access: dict[HWQueue, dict[HWQueue, int|None]] = collections.defaultdict(lambda: collections.defaultdict(lambda: None)) + self.dev_access: dict[HWQueue, set[HCQCompiled]] = collections.defaultdict(set) + + for dev, queue in self.comp_queues.items(): self.dev_access[queue].add(dev) + + self.input_replace_map: dict[HCQCompiled, set[tuple[int, int]]] = collections.defaultdict(set) + self.device_vars: dict[HCQCompiled, dict[str, int]] = {} + + for j, ((_, ast, bufs, device_vars), runtime) in enumerate(zip(self.calls, self.runtimes)): + is_xfer = ast.op is Ops.COPY and hasattr(alc:=Device[bufs[0].device].allocator, '_transfer') and alc.supports_transfer \ + and bufs[0].device.split(":")[0] == bufs[1].device.split(":")[0] + ji_devs = [cast(HCQCompiled, Device[b.device]) for b in bufs] if is_xfer else [] + is_rdma = len(ji_devs) > 0 and not any(d._is_cpu() for d in ji_devs) and len(set(d.peer_group for d in ji_devs)) > 1 + + if runtime is not None: enqueue_dev: HCQCompiled = runtime.dev + else: + # For copy ops prioritize enqeueuing on the src device, so reverse the buffers. + for b in bufs[::-1]: + if (enqueue_dev:=cast(HCQCompiled, Device[b.device])).hw_copy_queue_t is not None: break + + # set any fixedvars on the device + self.device_vars[enqueue_dev] = merge_dicts([self.device_vars.get(enqueue_dev, {}), device_vars]) + if runtime is not None: self.device_vars[enqueue_dev] = merge_dicts([self.device_vars[enqueue_dev], {k: 0 for k in ast.arg.runtimevars}]) + + if runtime is not None: + enqueue_queue = self.comp_queues[enqueue_dev] + elif is_rdma: + enqueue_queue = self.comp_queues[enqueue_dev] + rdma_key = (cast(HCQCompiled, Device[bufs[0].device]).rdma_dev(), enqueue_dev.rdma_dev()) + self.rdma_queues.setdefault(rdma_key, RDMACopyQueue(enqueue_dev.rdma_dev())) + else: + assert (enqueue_dev.hw_copy_queue_t is not None), "device must implement a copy queue" + queue_idx = self.devices.index(cast(HCQCompiled, Device[bufs[0].device])) % self.num_copy_queues + enqueue_queue = self.copy_queues.setdefault((enqueue_dev, queue_idx), + enqueue_dev.hw_copy_queue_t(queue_idx=queue_idx).wait(self.kick_signals[enqueue_dev.peer_group], self.kickoff_var)) + + out_signal = self.signals.setdefault(enqueue_queue, self.pg_dev[enqueue_dev.peer_group].new_signal(value=0)) + + # Get dependencies based on input and output buffers. + if is_rdma: + src_qp, dest_qp = rdma_key[1].iface.connect(rdma_key[0])[:2] + sync_signals, opt_deps, rdeps = self._resolve_deps(bufs[1:], [], enqueue_queue, enqueue_dev, out_signal, j, + is_copy=is_xfer, rdma_qp=src_qp) + peer_queue = self.comp_queues[peer_dev:=cast(HCQCompiled, Device[bufs[0].device])] + peer_out_signal = self.signals.setdefault(peer_queue, self.pg_dev[peer_dev.peer_group].new_signal(value=0)) + peer_sync_signals, peer_opt_deps, peer_rdeps = self._resolve_deps(bufs[:1], [0], peer_queue, peer_dev, peer_out_signal, j, + is_copy=is_xfer, rdma_qp=dest_qp) + self.rdma_deps[j] = (peer_queue, peer_sync_signals + peer_opt_deps, peer_out_signal, j + 1) + self.last_j[peer_queue] = j + else: + sync_signals, opt_deps, rdeps = self._resolve_deps(bufs, ast.arg.outs if runtime is not None else [0], enqueue_queue, + enqueue_dev, out_signal, j, is_copy=is_xfer) + + self.ji_schedule[j] = (enqueue_dev, enqueue_queue, sync_signals, opt_deps[::-1], out_signal, None if runtime is not None else (j + 1)) + + # Collect profile information if profiling is enabled. + if PROFILE: + # When execution are chained, we can reuse the end timestamp from the previous command as the start timestamp for the current command. + sig_st = prev_ji * 2 + 1 if len(opt_deps) == 0 and (prev_ji:=self.last_j[enqueue_queue]) is not None else j * 2 + + # Description based on the command. + prof_ji_desc = runtime.name if runtime is not None else TracingKey(f"{bufs[1].device} -> {bufs[0].device}", ret=bufs[0].nbytes) + + prof_name = enqueue_dev.device if runtime is not None else f"{enqueue_dev.device}:SDMA:{queue_idx}" + self.prof_graph_entries.append(ProfileGraphEntry(prof_name, prof_ji_desc, sig_st, j * 2 + 1)) + self.prof_graph_deps.append([d - 1 for _, d in rdeps]) + + self.last_j[enqueue_queue] = j + + # Check which signals are used in the profile graph. + self.prof_signal_is_used: set[int] = {sid for ent in self.prof_graph_entries for sid in (ent.st_id, ent.en_id)} + + # Build hardware queues. + self.copy_to_devs: dict[HCQCompiled, set[HCQCompiled]] = {dev: set() for dev in self.devices} + + # Create variable timeline signals for each device. + timeline_sigaddrs = {dev: UOp.variable(f"timeline_sig_{self.dev_name(dev)}", 0, 0xffffffffffffffff, dtype=dtypes.uint64) for dev in self.devices} + self.virt_timeline_vals = {dev: UOp.variable(f"timeline_var_{self.dev_name(dev)}", 0, 0xffffffff, dtype=dtypes.uint32) for dev in self.devices} + self.virt_timeline_signals = {dev: unwrap(dev.signal_t)(HCQBuffer(timeline_sigaddrs[dev], 16),owner=dev,is_timeline=True) for dev in self.devices} + + for dev in self.devices: + self.comp_queues[dev].memory_barrier().wait(self.virt_timeline_signals[dev], self.virt_timeline_vals[dev]) \ + .wait(self.kick_signals[dev.peer_group], self.kickoff_var).signal(self.signals[dev], self.kickoff_var) + + for j, ((dev_idx, ast, bufs, _), runtime) in enumerate(zip(self.calls, self.runtimes)): + enqueue_dev, enqueue_queue, sync_signals, deps, signal, signal_val = self.ji_schedule[j] + + # Lazy allocate signals + if PROFILE: self.prof_signals += [enqueue_dev.new_signal(value=0) for _ in range(2)] + + for sig, val in sync_signals + deps: enqueue_queue.wait(sig, val) + + # Encode waits and start profile timestamp (if needed). + if PROFILE and j * 2 in self.prof_signal_is_used: enqueue_queue.timestamp(self.prof_signals[j * 2]) + + # Encode main commands based on ji type. + if runtime is not None: + enqueue_queue.exec(runtime, self.ji_args[j], ast.arg.global_size or (1,1,1), ast.arg.local_size or (1,1,1)) + elif j in self.rdma_deps: + dest_queue, dest_deps, dest_out_signal, dest_out_val = self.rdma_deps[j] + for sig, val in dest_deps: dest_queue.wait(sig, val) + + dest, src = bufs[0], bufs[1] + dest_dev, src_dev = cast(HCQCompiled, Device[dest.device]), cast(HCQCompiled, Device[src.device]) + dest_rdma, src_rdma = dest_dev.rdma_dev(), src_dev.rdma_dev() + + # get qp info + src_qp, dest_qp, src_cq_buf, dest_cq_buf = src_rdma.iface.connect(dest_rdma) + + # use var for head + head_var = self.rdma_vars.setdefault((dest_rdma, src_rdma), (UOp.variable(f"rdma_var_{j}", 0, 0xffffffff, dtype=dtypes.uint32), src_qp))[0] + next_head = self.num_rdma_ops[(dest_rdma, src_rdma)] + + rdma_queue = self.rdma_queues[(dest_rdma, src_rdma)] + rdma_queue.copy(self.hcq_bufs[j][0], self.hcq_bufs[j][1], dest.nbytes) \ + .encode_ring(enqueue_queue, src_dev, src_rdma.iface, src_qp, src_cq_buf, head_var + next_head, ring_uar=True) \ + .encode_ring(self.comp_queues[dest_dev], dest_dev, dest_rdma.iface, dest_qp, dest_cq_buf, head_var + next_head) + + dest_queue.signal(dest_out_signal, dest_out_val) + self.num_rdma_ops[(dest_rdma, src_rdma)] += 1 + elif ast.op is Ops.COPY: + dest, src = bufs[0], bufs[1] + uop_replace_j = dict(self.uop_replace[j]) + for bufid in range(len(bufs)): + if (replace_iidx:=uop_replace_j.get(bufid)) is not None: self.input_replace_map[enqueue_dev].add((replace_iidx, dev_idx)) + else: cast(HCQAllocator, enqueue_dev.allocator)._map(self.hcq_bufs[j][bufid]) + enqueue_queue.copy(self.hcq_bufs[j][0], self.hcq_bufs[j][1], dest.nbytes) + self.copy_to_devs[cast(HCQCompiled, Device[dest.device])].add(cast(HCQCompiled, Device[src.device])) + + # Encode finish profile timestamp (if needed). + if PROFILE and j * 2 + 1 in self.prof_signal_is_used: enqueue_queue.timestamp(self.prof_signals[j * 2 + 1]) + + if signal_val is not None: enqueue_queue.signal(signal, signal_val) + + for dev in self.devices: + for dep_dev in list(self.copy_to_devs[dev]) + [dev]: + for copy_q in self._dev_copy_queues(dep_dev): + if copy_q in self.signals: self.comp_queues[dev].wait(self.signals[copy_q], unwrap(self.last_j[copy_q]) + 1) + + self.comp_queues[dev].signal(self.virt_timeline_signals[dev], self.virt_timeline_vals[dev] + 1).bind(dev) + for copy_q in self._dev_copy_queues(dev): copy_q.bind(dev) + + self.last_timeline: dict[HCQCompiled, tuple[HCQSignal, int]] = {dev: (dev.timeline_signal, 0) for dev in self.devices} + self.queue_signals_to_reset = [self.signals[q] for q in list(self.comp_queues.values()) + list(self.copy_queues.values()) if q in self.signals] + + def _resolve_deps(self, bufs, outs, enqueue_queue, enqueue_dev, out_signal, j, is_copy, rdma_qp=None): + rdeps = self._access_resources(bufs, outs, (enqueue_queue, j + 1)) + + # Order shared QP doorbell record writes across different compute queues (head+1 must complete before head+2). + if rdma_qp is not None and (prev:=self.rdma_last_dest.get(id(rdma_qp))) is not None and prev[0] is not enqueue_queue: + rdeps = rdeps + [(prev[0], prev[1])] + if rdma_qp is not None: self.rdma_last_dest[id(rdma_qp)] = (enqueue_queue, j + 1) + + # Update dependencies to include previous kernel in queue. This is required for timeline signals. + opt_deps, deps = [], rdeps + ([(enqueue_queue, prev_ji + 1)] if (prev_ji:=self.last_j[enqueue_queue]) is not None else []) + + # Optimize dependencies by removing redundant ones. Remove waiting for the value of the queue which is known to be already + # synced with the current queue. + for dep_queue, dep_val in sorted(deps, key=lambda x: x[1], reverse=True): + if (qa:=self.queue_access[enqueue_queue][dep_queue]) is None or qa < dep_val: + opt_deps.append((self.signals[dep_queue], dep_val)) + self.queue_access[enqueue_queue][dep_queue] = dep_val + self.dev_access[enqueue_queue].update(self.dev_access[dep_queue]) + + # Ensure device is ready for use in current context: the graph has initialized the device and it's safe to operate on it within this graph. + # Only sync with same-peer-group devices; cross-peer-group sync is handled by RDMA. + sync_signals = [(self.signals[d], self.kickoff_var) for b in bufs + if (d:=cast(HCQCompiled, Device[cast(Buffer, b).device])) not in self.dev_access[enqueue_queue] + and (d.peer_group == enqueue_dev.peer_group or rdma_qp is None)] + self.dev_access[enqueue_queue].update(cast(HCQCompiled, Device[cast(Buffer, b).device]) for b in bufs) + + # Remove self-dependency for compute and copy queues. + # For compute, in case of NV, optimize when only 1 same-queue dependency exists, since NV chains 2+ executions in this case, + # eliminating dependency need. For RDMA, keep self-dependency to flush cache. + dname = enqueue_dev.device.split(":", 1)[0] + can_opt = dname in {"AMD", "QCOM"} or (dname == "NV" and len(sync_signals) == 0 and len(opt_deps) == 1 and id(opt_deps[0][0]) == id(out_signal)) + if (can_opt or is_copy) and rdma_qp is None: opt_deps = [x for x in opt_deps if id(x[0]) != id(out_signal)] + + # Enable necessary signals in the schedule by setting the signal value. + for sig, val in opt_deps: self.ji_schedule[val - 1] = self.ji_schedule[val - 1][:5] + (val,) + + return sync_signals, opt_deps, rdeps + + def _dev_copy_queues(self, dev): return [q for (d, _), q in self.copy_queues.items() if d == dev] + + def __call__(self, input_uops:tuple[UOp, ...], var_vals:dict[str, int], wait=False) -> float|None: + # Map input buffers + for dev in self.devices: + for iidx, dev_idx in self.input_replace_map[dev]: + buf = b.bufs[dev_idx] if isinstance(b:=input_uops[iidx].buffer, MultiBuffer) else b + cast(HCQAllocator, dev.allocator)._map(buf._buf) + + # Wait and restore signals + self.kickoff_value += 1 + for dev in self.devices: self.last_timeline[dev][0].wait(self.last_timeline[dev][1]) + if PROFILE and self.kickoff_value > 1: self.collect_timestamps() + + hcq_var_vals = {self.kickoff_var.expr: self.kickoff_value, **var_vals, + **{var.expr: dev.timeline_value - 1 for dev, var in self.virt_timeline_vals.items()}, + **{sig.base_buf.va_addr.expr: dev.timeline_signal.base_buf.va_addr for dev, sig in self.virt_timeline_signals.items()}} + + # Update buffers + for j, replace in enumerate(self.uop_replace): + dev_idx = self.calls[j][0] + for pos, iidx in replace: + buf = b.bufs[dev_idx] if isinstance(b:=input_uops[iidx].buffer, MultiBuffer) else b + hcq_var_vals[self.input_replace_to_var[(j,pos)].expr] = buf._buf.va_addr + + for (var, qp) in self.rdma_vars.values(): hcq_var_vals[var.expr] = qp.head + for q in self.rdma_queues.values(): q.submit(q.dev, hcq_var_vals) + + for dev in self.devices: + self.comp_queues[dev].submit(dev, hcq_var_vals_local:=hcq_var_vals|self.device_vars.get(dev, {})) + for copy_queue in self._dev_copy_queues(dev): copy_queue.submit(dev, hcq_var_vals_local) + self.last_timeline[dev] = (dev.timeline_signal, dev.next_timeline()) + + # Launch graph + for sig in self.queue_signals_to_reset: sig.value = 0 + for sig in self.kick_signals.values(): sig.value = self.kickoff_value + + if wait: + st = time.perf_counter() + for dev in self.devices: self.last_timeline[dev][0].wait(self.last_timeline[dev][1]) + return time.perf_counter() - st + return None + + def collect_timestamps(self): + # NOTE: Append to any device is fine... + self.devices[0].profile_events += [ProfileGraphEvent(self.prof_graph_entries, self.prof_graph_deps, [s.timestamp for s in self.prof_signals])] + + def dev_name(self, dev) -> str: return dev.device.replace(":", "_") + + @suppress_finalizing + def __del__(self): + for dev in self.devices: self.last_timeline[dev][0].wait(self.last_timeline[dev][1]) + + if PROFILE and self.kickoff_value >= 1: self.collect_timestamps() + + for fdev, buf in self.kernargs_bufs.items(): fdev.allocator._free(buf, BufferSpec(cpu_access=True)) + + @staticmethod + def supports_uop(batch_devs:list[Compiled], new_call:UOp) -> bool: + # Check if all devices are HCQ + all_devs = cast(list[HCQCompiled], GraphRunner._all_devs(batch_devs, new_call)) + if not all(issubclass(type(d), HCQCompiled) for d in all_devs): return False + + # If all of devices are mapped into CPU address space, can use CPU inside the peer group. + cpu_support = all(type(d.timeline_signal.base_buf.view) is MMIOInterface for d in all_devs) + + # Check if all devices are within the same peer group. Allow cross-peer-group if all peer groups have RDMA devices. + if len(set(d.peer_group for d in all_devs if not (cpu_support and d._is_cpu()))) > 1: + try: [d.rdma_dev() for d in all_devs if not d._is_cpu()] + except RuntimeError: return False + + if new_call.src[0].op is Ops.COPY: + # MOCKGPU is not supported, since it can't execute commands in parallel + is_xfer = len(set(type(d) for d in all_devs)) == 1 and hasattr(alc:=all_devs[0].allocator, '_transfer') and alc.supports_transfer + return is_xfer or (all_devs[0].hw_copy_queue_t is not None and not getattr(all_devs[0], 'iface', None).__class__.__name__.startswith("MOCK")) + return new_call.src[0].op is Ops.PROGRAM diff --git a/artifacts/package_runtime/tinygrad/runtime/graph/metal.py b/artifacts/package_runtime/tinygrad/runtime/graph/metal.py new file mode 100644 index 000000000..409cfb973 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/graph/metal.py @@ -0,0 +1,117 @@ +from typing import Any, cast +import ctypes, decimal, struct +from tinygrad.helpers import dedup, getenv, unwrap, PROFILE +from tinygrad.device import Buffer, Device, ProfileGraphEntry, ProfileGraphEvent +from tinygrad.uop.ops import UOp, Ops +from tinygrad.engine.jit import GraphRunner, GraphException +from tinygrad.runtime.ops_metal import MetalDevice, MetalAllocator, wait_check, to_ns_str +from tinygrad.runtime.autogen import metal + +class MetalGraph(GraphRunner): + def __init__(self, linear, input_uops=()): + super().__init__(linear, input_uops) + self.dev = cast(MetalDevice, Device[self.device]) + + # create metal batch exec + icb_descriptor = metal.MTLIndirectCommandBufferDescriptor.new() + icb_descriptor.setCommandTypes(metal.MTLIndirectCommandTypeConcurrentDispatch) + icb_descriptor.setInheritBuffers(False) + icb_descriptor.setInheritPipelineState(False) + icb_descriptor.setMaxKernelBufferBindCount(31) + + self.icb = self.dev.sysdevice.newIndirectCommandBufferWithDescriptor_maxCommandCount_options(icb_descriptor, len(self.calls), + metal.MTLResourceCPUCacheModeDefaultCache) + if self.icb.value is None: raise GraphException("create indirect command buffer failed, does your system support this?") + self.needs_icb_fix = int(not self.dev.arch.startswith("Apple") or int(self.dev.arch[5:]) < 9) # ICB fix not required on M3+ (Apple9+) + + self.var_bind_data = [] + if len(self.vars): + self.var_buf = self.dev.allocator.alloc(sum(dt.itemsize for r in self.runtimes for (_,_,dt,s) in unwrap(r).signature if s == ())) + self.var_buf_view, var_buf_offset = cast(MetalAllocator, self.dev.allocator)._as_buffer(self.var_buf), 0 + + all_pipelines, all_resources = [], [self.var_buf.buf] if len(self.vars) else [] + for j, ((_, ast, bufs, _), runtime, replace) in enumerate(zip(self.calls, self.runtimes, self.uop_replace)): + assert runtime is not None + icb_command = self.icb.indirectComputeCommandAtIndex(j).retained() + icb_command.setComputePipelineState(runtime.pipeline_state) + all_pipelines.append(runtime.pipeline_state) + for i, b in enumerate(bufs): + if not any(pos == i for pos, _ in replace): + icb_command.setKernelBuffer_offset_atIndex(b._buf.buf, b._buf.offset, i) + all_resources.append(b._buf.buf) + for nm,i,dt,_ in runtime.signature[len(bufs):]: + icb_command.setKernelBuffer_offset_atIndex(self.var_buf.buf, var_buf_offset, i) + self.var_bind_data.append((nm, var_buf_offset, dt.fmt)) + var_buf_offset += dt.itemsize + global_size, local_size = ast.arg.launch_dims({v: 0 for v in self.vars}) + icb_command.concurrentDispatchThreadgroups_threadsPerThreadgroup(metal.MTLSize(*global_size), metal.MTLSize(*local_size)) + icb_command.setBarrier() + + self.all_resources = dedup(all_resources) + self.all_pipelines = dedup(all_pipelines) + self.command_buffer: Any = None + self.range = metal.NSRange(0, len(self.calls)) + self.updatable = sorted({j for j,r in enumerate(self.uop_replace) if r} | self.var_vals_replace.keys() | self.launch_dims_replace.keys()) + + def __call__(self, input_uops:tuple[UOp, ...], var_vals:dict[str, int], wait=False): + if self.command_buffer is not None and self.command_buffer in self.dev.mtl_buffers_in_flight: wait_check(self.command_buffer) + # NOTE: old command buffer may not be inflight anymore + if self.command_buffer is not None and PROFILE: self.collect_timestamps() + + updated_bufs = [] + for j in self.updatable: + computeCommand = self.icb.indirectComputeCommandAtIndex(j) + for pos, iidx in self.uop_replace[j]: + buf = cast(Buffer, input_uops[iidx].buffer) + computeCommand.setKernelBuffer_offset_atIndex(buf._buf.buf, buf._buf.offset, pos) + updated_bufs.append(buf._buf.buf) + + all_resources = dedup(self.all_resources + updated_bufs) + for j, global_dims, local_dims in self.updated_launch_dims(var_vals): + self.icb.indirectComputeCommandAtIndex(j).concurrentDispatchThreadgroups_threadsPerThreadgroup(metal.MTLSize(*global_dims), + metal.MTLSize(*local_dims)) + for nm,ofs,fmt in self.var_bind_data: struct.pack_into(fmt, self.var_buf_view, ofs, var_vals[nm]) + + command_buffer = self.dev.mtl_queue.commandBuffer().retained() + encoder = command_buffer.computeCommandEncoder().retained() + encoder.useResources_count_usage(ctypes.cast((metal.MTLBuffer * len(all_resources))(*all_resources), ctypes.POINTER(metal.MTLResource)), + len(all_resources), metal.MTLResourceUsageRead | metal.MTLResourceUsageWrite) + + # NOTE: the pipelines likely need to be added to the used resources to fix the crash on M1/M2, but I haven't figured out how + # this is a O(n) hack to get them used. what should work is: + #encoder.useResources_count_usage_(self.all_pipelines, len(self.all_pipelines), Metal.MTLResourceUsageRead) + # but it fails with "Invalid Resource (00000009:kIOGPUCommandBufferCallbackErrorInvalidResource)" + # to repro the crash (which can also crash other running GPU apps), run with FIX_METAL_ICB=0 + if getenv("FIX_METAL_ICB", self.needs_icb_fix): + for ps in self.all_pipelines: + encoder.setComputePipelineState(ps) + encoder.dispatchThreadgroups_threadsPerThreadgroup(metal.MTLSize(0,0,0), metal.MTLSize(0,0,0)) + + encoder.executeCommandsInBuffer_withRange(self.icb, self.range) + encoder.endEncoding() + command_buffer.setLabel(to_ns_str(f"batched {len(self.calls)}")) + command_buffer.commit() + self.command_buffer = command_buffer + + self.dev.mtl_buffers_in_flight.append(command_buffer) + if wait: + wait_check(command_buffer) + return command_buffer.GPUEndTime() - command_buffer.GPUStartTime() + return None + + def collect_timestamps(self): + # create a graph event and evenly space each program + st, en = decimal.Decimal(self.command_buffer.GPUStartTime()) * 1000000, decimal.Decimal(self.command_buffer.GPUEndTime()) * 1000000 + ents = [ProfileGraphEntry(self.device, rt.name, i, i+1) for i, rt in enumerate(self.runtimes) if rt is not None] + self.dev.profile_events += [ProfileGraphEvent(ents, [], [st + (en-st)/len(ents)*i for i in range(len(ents)+1)])] + + def __del__(self): + if PROFILE and self.command_buffer is not None: + wait_check(self.command_buffer) + self.collect_timestamps() + + @staticmethod + def supports_uop(batch_devs, new_call:UOp) -> bool: + # Metal ICB replay encodes offsets as uint32; reject if any Metal buffer offset exceeds 32-bit range. + if any(b.op is Ops.SLICE and b.src[1].val * b.src[0].dtype.itemsize > 0xFFFFFFFF for b in new_call.src[1:]): return False + return GraphRunner.supports_uop(batch_devs, new_call) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_amd.py b/artifacts/package_runtime/tinygrad/runtime/ops_amd.py new file mode 100644 index 000000000..7404a1fca --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_amd.py @@ -0,0 +1,1103 @@ +from __future__ import annotations +from typing import cast +import os, ctypes, struct, hashlib, functools, importlib, mmap, errno, array, contextlib, sys, weakref, itertools, collections, atexit +assert sys.platform != 'win32' +from dataclasses import dataclass +from tinygrad.runtime.support.hcq import HCQCompiled, HCQAllocator, HCQBuffer, HWQueue, CLikeArgsState, HCQSignal, HCQProgram, FileIOInterface +from tinygrad.runtime.support.hcq import MMIOInterface, BumpAllocator, hcq_filter_visible_devices, hcq_profile +from tinygrad.uop.ops import sint +from tinygrad.device import Compiled, BufferSpec, TinyELF +from tinygrad.helpers import getenv, round_up, data64_le, DEBUG, PROFILE, ProfileEvent, lo32, hi32, colored, prod, ContextVar, TracingKey +from tinygrad.helpers import VIZ, ceildiv, unwrap, pluralize +from tinygrad.renderer.cstyle import HIPRenderer, HIPCCRenderer +from tinygrad.renderer.llvmir import AMDLLVMRenderer +from tinygrad.runtime.autogen import kfd, hsa, sqtt, amdgpu_kd, amdgpu_drm +from tinygrad.runtime.autogen.am import am +from tinygrad.runtime.support.elf import elf_loader +from tinygrad.runtime.support.am.amdev import AMDev, AMMemoryManager +from tinygrad.runtime.support.amd import AMDReg, AMDIP, import_module, import_soc, import_pmc +from tinygrad.runtime.support.system import System, PCIIfaceBase, PCIAllocationMeta, USBPCIDevice, MAP_FIXED, MAP_NORESERVE +from tinygrad.runtime.support.usb import USB3 +from tinygrad.runtime.support.memory import AddrSpace +if getenv("IOCTL"): import extra.hip_gpu_driver.hip_ioctl # noqa: F401 # pylint: disable=unused-import + +SQTT = ContextVar("SQTT", abs(VIZ.value)>=2) +SQTT_ITRACE_SE_MASK, SQTT_LIMIT_SE, SQTT_SIMD_SEL, SQTT_TOKEN_EXCLUDE = \ + ContextVar("SQTT_ITRACE_SE_MASK", 0b11), ContextVar("SQTT_LIMIT_SE", 0), ContextVar("SQTT_SIMD_SEL", 0), ContextVar("SQTT_TOKEN_EXCLUDE", 0) +PMC = ContextVar("PMC", abs(VIZ.value)>=2) +EVENT_INDEX_PARTIAL_FLUSH = 4 # based on a comment in nvd.h +WAIT_REG_MEM_FUNCTION_EQ = 3 # == +WAIT_REG_MEM_FUNCTION_NEQ = 4 # != +WAIT_REG_MEM_FUNCTION_GEQ = 5 # >= +AQL_HDR = (1 << hsa.HSA_PACKET_HEADER_BARRIER) | (hsa.HSA_FENCE_SCOPE_SYSTEM << hsa.HSA_PACKET_HEADER_SCACQUIRE_FENCE_SCOPE) \ + | (hsa.HSA_FENCE_SCOPE_SYSTEM << hsa.HSA_PACKET_HEADER_SCRELEASE_FENCE_SCOPE) + +@dataclass(frozen=True) +class ProfileSQTTEvent(ProfileEvent): device:str; kern:int; se:int; blob:bytes; itrace:bool; exec_tag:int # noqa: E702 + +@dataclass(frozen=True) +class PMCSample: name:str; block:str; xcc:int; inst:int; se:int; sa:int; wgp:int; off:int; size:int; regsample:str # noqa: E702 + +@dataclass(frozen=True) +class ProfilePMCEvent(ProfileEvent): device:str; kern:int; sched:list[PMCSample]; blob:bytes; exec_tag:int # noqa: E702 + +class AMDSignal(HCQSignal): + def __init__(self, *args, **kwargs): super().__init__(*args, **{**kwargs, 'timestamp_divider': 100}) + + def _sleep(self, time_spent_since_last_sleep_ms:int): + # Reasonable to sleep for long workloads (which take more than 200ms) and only timeline signals. + if time_spent_since_last_sleep_ms > 200 and self.owner is not None: self.owner.iface.sleep(200) + +class AMDComputeQueue(HWQueue): + def __init__(self, dev:AMDDevice): + self.dev, self.soc, self.pm4, self.gc, self.nbio = dev, dev.soc, dev.pm4, dev.gc, dev.nbio + super().__init__() + + def __del__(self): + if self.binded_device is not None: + self.binded_device.allocator.free(self.hw_page, self.hw_page.size, BufferSpec(cpu_access=True, nolru=True, uncached=True)) + + def pkt3(self, cmd, *vals): self.q(self.pm4.PACKET3(cmd, len(vals) - 1), *vals) + + def wreg(self, reg:AMDReg, *args:sint, **kwargs:int): + if bool(args) == bool(kwargs): raise RuntimeError('One (and only one) of *args or **kwargs must be specified') + if self.pm4.PACKET3_SET_SH_REG_START <= reg.addr[0] < self.pm4.PACKET3_SET_SH_REG_END: + set_packet, set_packet_start = self.pm4.PACKET3_SET_SH_REG, self.pm4.PACKET3_SET_SH_REG_START + elif self.pm4.PACKET3_SET_UCONFIG_REG_START <= reg.addr[0] < self.pm4.PACKET3_SET_UCONFIG_REG_START + 2**16-1: + set_packet, set_packet_start = self.pm4.PACKET3_SET_UCONFIG_REG, self.pm4.PACKET3_SET_UCONFIG_REG_START + else: raise RuntimeError(f'Cannot set {reg.name} ({reg.addr[0]}) via pm4 packet') + self.pkt3(set_packet, reg.addr[0] - set_packet_start, *(args or (reg.encode(**kwargs),))) + + @contextlib.contextmanager + def pred_exec(self, xcc_mask:int): + if self.dev.xccs > 1: + self.pkt3(self.pm4.PACKET3_PRED_EXEC, xcc_mask << 24) + prev_len = len(self._q) + yield + if self.dev.xccs > 1: + self._q[prev_len-1] |= (len(self._q) - prev_len) + + def set_grbm(self, instance=None, se=None, sh=None, wgp=None): + instance_val = (wgp << 2 | (instance or 0)) if wgp is not None else instance + self.wreg(self.gc.regGRBM_GFX_INDEX, **{(f'{key}_broadcast_writes' if val is None else f'{key}_index'): (1 if val is None else val) + for key, val in [('instance', instance_val), ('se', se), ('sh' if self.dev.target[0] == 9 else 'sa', sh)]}) + + def wait_reg_mem(self, value, mask=0xffffffff, mem=None, reg=None, reg_done=0, op=WAIT_REG_MEM_FUNCTION_GEQ): + wrm_info_dw = self.pm4.WAIT_REG_MEM_MEM_SPACE(int(mem is not None)) | self.pm4.WAIT_REG_MEM_OPERATION(int(mem is None and reg_done > 0)) \ + | self.pm4.WAIT_REG_MEM_FUNCTION(op) | self.pm4.WAIT_REG_MEM_ENGINE(0) + + self.pkt3(self.pm4.PACKET3_WAIT_REG_MEM, wrm_info_dw, *(data64_le(mem) if mem is not None else (reg, reg_done)), value, mask, 4) + return self + + def acquire_mem(self, addr=0x0, sz=(1 << 64)-1, gli=1, glm=1, glk=1, glv=1, gl1=1, gl2=1): + if self.dev.target[0] != 9: + cache_flags_dw = self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GLI_INV(gli) \ + | self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_INV(glm) | self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_WB(glm) \ + | self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_INV(glk) | self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_WB(glk) \ + | self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GLV_INV(glv) | self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GL1_INV(gl1) \ + | self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_INV(gl2) | self.pm4.PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_WB(gl2) + + self.pkt3(self.pm4.PACKET3_ACQUIRE_MEM, 0, *data64_le(sz), *data64_le(addr), 0, cache_flags_dw) + else: + cp_coher_cntl = self.pm4.PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_ICACHE_ACTION_ENA(gli) | \ + self.pm4.PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_ACTION_ENA(glk) | \ + self.pm4.PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_ACTION_ENA(gl2) | \ + self.pm4.PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_ACTION_ENA(gl1) | \ + self.pm4.PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WB_ACTION_ENA(gl2) + self.pkt3(self.pm4.PACKET3_ACQUIRE_MEM, cp_coher_cntl, *data64_le(sz), *data64_le(addr), 0x0000000A) + return self + + def release_mem(self, address=0x0, value=0, data_sel=0, int_sel=2, ctxid=0, cache_flush=False): + if self.dev.target[0] != 9: + cache_flags_dw = 0 if not cache_flush else (self.pm4.PACKET3_RELEASE_MEM_GCR_GLV_INV | self.pm4.PACKET3_RELEASE_MEM_GCR_GL1_INV \ + | self.pm4.PACKET3_RELEASE_MEM_GCR_GL2_INV | self.pm4.PACKET3_RELEASE_MEM_GCR_GLM_WB \ + | self.pm4.PACKET3_RELEASE_MEM_GCR_GLM_INV | self.pm4.PACKET3_RELEASE_MEM_GCR_GL2_WB | self.pm4.PACKET3_RELEASE_MEM_GCR_SEQ) + + event_dw = self.pm4.PACKET3_RELEASE_MEM_EVENT_TYPE(self.pm4.CACHE_FLUSH_AND_INV_TS_EVENT) \ + | self.pm4.PACKET3_RELEASE_MEM_EVENT_INDEX(self.pm4.event_index__mec_release_mem__end_of_pipe) + + memsel_dw = self.pm4.PACKET3_RELEASE_MEM_DATA_SEL(data_sel) | self.pm4.PACKET3_RELEASE_MEM_INT_SEL(int_sel) \ + | self.pm4.PACKET3_RELEASE_MEM_DST_SEL(0) + else: + cache_flags_dw = 0 if not cache_flush else (self.pm4.EOP_TC_WB_ACTION_EN | self.pm4.EOP_TC_NC_ACTION_EN) + + event_dw = self.pm4.EVENT_TYPE(self.pm4.CACHE_FLUSH_AND_INV_TS_EVENT) | self.pm4.EVENT_INDEX(self.pm4.event_index__mec_release_mem__end_of_pipe) + + memsel_dw = self.pm4.DATA_SEL(data_sel) | self.pm4.INT_SEL(int_sel) + + ctxid = 0 + + self.pkt3(self.pm4.PACKET3_RELEASE_MEM, event_dw | cache_flags_dw, memsel_dw, *data64_le(address), *data64_le(value), ctxid) + return self + + def memory_barrier(self): + pf = '0' if self.nbio.version[:2] != (7, 11) else '1' + self.wait_reg_mem(reg=getattr(self.nbio, f'regBIF_BX_PF{pf}_GPU_HDP_FLUSH_REQ').addr[0], + reg_done=getattr(self.nbio, f'regBIF_BX_PF{pf}_GPU_HDP_FLUSH_DONE').addr[0], value=0xffffffff) + return self.acquire_mem() + + def spi_config(self, tracing:bool): + self.wreg(self.gc.regSPI_CONFIG_CNTL, ps_pkr_priority_cntl=3, exp_priority_order=3, gpr_write_priority=0x2c688, + enable_sqg_bop_events=int(tracing), enable_sqg_top_events=int(tracing)) + + ### PMC ### + + def pmc_reset_counters(self, en=True): + self.set_grbm() + self.wreg(self.gc.regCP_PERFMON_CNTL if self.dev.target[0] <= 11 else self.gc.regCP_PERFMON_CNTL_1, perfmon_state=0) + if en: self.wreg(self.gc.regCP_PERFMON_CNTL if self.dev.target[0] <= 11 else self.gc.regCP_PERFMON_CNTL_1, perfmon_state=1) + return self + + def pmc_start(self, counters): + self.pmc_reset_counters(en=False) + self.wreg(self.gc.regSQ_PERFCOUNTER_CTRL, cs_en=1, ps_en=1, gs_en=1, hs_en=1, **({'vmid_mask':0xffff} if (gfx9:=self.dev.target[0] == 9) else {})) + if not gfx9: self.wreg(self.gc.regSQ_PERFCOUNTER_CTRL2, force_en=1, vmid_en=0xffff) + + end_off = 0 + block2pid:dict[str, itertools.count] = collections.defaultdict(lambda: itertools.count()) + for name,block,idx in counters: + # sq block on gfx11+ goes down to wgps + inst_cnt, se_cnt, sa_cnt, wgp_cnt = {"GRBM": (1, 1, 1, 1), "GL2C": (32, 1, 1, 1), "TCC": (16, 1, 1, 1), + "SQ": (1, self.dev.se_cnt) + ((1, 1) if gfx9 else (2, self.dev.iface.props['cu_per_simd_array'] // 2))}[block] + end_off += (rec_size:=prod((self.dev.xccs, inst_cnt, se_cnt, sa_cnt, wgp_cnt)) * 8) + + # gfx11+ and later require even-numbered SQ *_SELECT registers + regsample = f'reg{block}_PERFCOUNTER{(pcid:=next(block2pid[block]))}' + if (regsel:=getattr(self.gc, (f'reg{block}_PERFCOUNTER{(pcid*2) if not gfx9 and block=="SQ" else pcid}_SELECT'), None)) is None: + raise RuntimeError(f'{block} is out of perfcounter registers: ({regsample} is not found)') + + self.wreg(regsel, perf_sel=idx, **({'simd_mask':0xf, 'sqc_bank_mask':0xf, 'sqc_client_mask':0xf} if gfx9 and block == "SQ" else {})) + self.dev.pmc_sched.append(PMCSample(name, block, self.dev.xccs, inst_cnt, se_cnt, sa_cnt, wgp_cnt, end_off-rec_size, rec_size, regsample)) + + if gfx9: self.wreg(self.gc.regSQ_PERFCOUNTER_MASK, sh0_mask=0xffff, sh1_mask=0xffff) + self.wreg(self.gc.regCOMPUTE_PERFCOUNT_ENABLE, 1) + return self.pmc_reset_counters(en=True) + + def pmc_read(self, buf, sched): + self.set_grbm() + self.wreg(self.gc.regCP_PERFMON_CNTL if self.dev.target[0] <= 11 else self.gc.regCP_PERFMON_CNTL_1, perfmon_state=1, perfmon_sample_enable=1) + + for s in sched: + offset = itertools.count(s.off, step=8) + + for xcc in range(s.xcc): + with self.pred_exec(xcc_mask=1 << xcc): + for inst, se_idx, sa_idx, wgp_idx in itertools.product(range(s.inst), range(s.se), range(s.sa), range(s.wgp)): + loff = next(offset) + if s.wgp > 1 and not self.dev.iface.is_wgp_active(xcc, se_idx, sa_idx, wgp_idx): continue + self.set_grbm(**({'instance':inst} if s.inst > 1 else ({'se':se_idx}|({'sh':sa_idx, 'wgp':wgp_idx} if self.dev.target[0] != 9 else {})))) + + # Copy counter to memory (src_sel = perf, dst_sel = tc_l2) + lo, hi = getattr(self.gc, f'{s.regsample}_LO'), getattr(self.gc, f'{s.regsample}_HI', None) + self.pkt3(self.pm4.PACKET3_COPY_DATA, (2 << 8) | 4, lo.addr[0], 0, *data64_le(buf.va_addr+loff)) + if hi is not None: self.pkt3(self.pm4.PACKET3_COPY_DATA, (2 << 8) | 4, hi.addr[0], 0, *data64_le(buf.va_addr+loff+4)) + + return self.pmc_reset_counters(en=True) + + ### SQTT ### + + def sqtt_setup_exec(self, prg, global_size): + self.sqtt_userdata(sqtt.struct_rgp_sqtt_marker_pipeline_bind(identifier=sqtt.RGP_SQTT_MARKER_IDENTIFIER_BIND_PIPELINE, + bind_point=(__BIND_POINT_COMPUTE:=1), api_pso_hash=data64_le(prg.libhash[0]))) + self.sqtt_userdata(sqtt.struct_rgp_sqtt_marker_event(has_thread_dims=1, cmd_id=next(prg.dev.sqtt_next_cmd_id)), *global_size) + + if SQTT_LIMIT_SE: + # Calculate number of CUs per SE to enable based on blocks count. 4 is maximum simd per CU, but on rdna we can trace only 1. + cu_per_se = prod([x if isinstance(x, int) else 1 for x in global_size]) // ((self.dev.cu_cnt // self.dev.se_cnt) * 4) + for xcc in range(self.dev.xccs): + with self.pred_exec(xcc_mask=1 << xcc): + for i in range(8 if prg.dev.target[0] != 9 else 4): + if SQTT_LIMIT_SE > 1: mask = 1 if SQTT_ITRACE_SE_MASK.value & (1 << i) else 0 # only run unmasked shader engines + else: + sa_mask = (1 << (self.dev.iface.props['cu_per_simd_array'] // 2)) - 1 + cu_mask = (1 << (cu_per_se + (1 if i == 0 else 0))) - 1 + mask = lo32((cu_mask & sa_mask) | (cu_mask & (sa_mask << 16)) << 16) + self.wreg(getattr(self.gc, f'regCOMPUTE_STATIC_THREAD_MGMT_SE{i}'), mask) + + def sqtt_userdata(self, data, *extra_dwords): + data_ints = [x[0] for x in struct.iter_unpack('> se) & 0b1: mask |= (__SQTTINST:=1<<10) | (__SQTT_INST_PC:=1<<11) | (__SQTT_ISSUE:=1<<13) + + with self.pred_exec(xcc_mask=1<<(se // self.dev.se_cnt)): + self.set_grbm(se=se % self.dev.se_cnt, sh=0) + self.wreg(self.gc.regSQ_THREAD_TRACE_TOKEN_MASK, reg_mask=0xf, token_mask=mask) + self.wreg(self.gc.regSQ_THREAD_TRACE_TOKEN_MASK2, inst_mask=0xffffffff) + self.wreg(self.gc.regSQ_THREAD_TRACE_BASE, addr=lo32(buf0s[se].va_addr >> 12)) + self.wreg(self.gc.regSQ_THREAD_TRACE_BASE2, addr_hi=hi32(buf0s[se].va_addr >> 12)) + self.wreg(self.gc.regSQ_THREAD_TRACE_SIZE, size=buf0s[se].size >> 12) + self.wreg(self.gc.regSQ_THREAD_TRACE_CTRL, reset_buffer=1) + self.wreg(self.gc.regSQ_THREAD_TRACE_MODE, mask_cs=1, autoflush_en=1, mode=1) + else: + self.spi_config(tracing=True) + # One buffer for one SE, mesa does it with a single buffer and ac_sqtt_get_data_offset, but this is simpler and should work just as well + for se in range(len(buf0s)): + self.set_grbm(se=se, sh=0) + + buf0_lo, buf0_hi = data64_le(buf0s[se].va_addr >> 12) + if self.dev.target >= (12,0,0): + self.wreg(self.gc.regSQ_THREAD_TRACE_BUF0_SIZE, size=buf0s[se].size >> 12) + self.wreg(self.gc.regSQ_THREAD_TRACE_BUF0_BASE_LO, base_lo=buf0_lo) + self.wreg(self.gc.regSQ_THREAD_TRACE_BUF0_BASE_HI, base_hi=buf0_hi) + else: + self.wreg(self.gc.regSQ_THREAD_TRACE_BUF0_SIZE, base_hi=buf0_hi, size=buf0s[se].size >> 12) + self.wreg(self.gc.regSQ_THREAD_TRACE_BUF0_BASE, base_lo=buf0_lo) + # NOTE: SQTT can only trace instructions on one simd per se, this selects the simd in first wgp in first sa. + # For RGP to display instruction trace it has to see it on first SE. Howerver ACE/MEC/whatever does the dispatching starting with second se, + # and on amdgpu/non-AM it also does weird things with dispatch order inside se: around 7 times out of 10 it starts from the last cu, but + # sometimes not, especially if the kernel has more than one wavefront which means that kernels with small global size might get unlucky and + # be dispatched on something else and not be seen in instruction tracing tab. You can force the wavefronts of a kernel to be dispatched on the + # CUs you want to by disabling other CUs via bits in regCOMPUTE_STATIC_THREAD_MGMT_SE and trace even kernels that only have one wavefront. + # Use SQTT_SIMD_SEL to select which SIMD to trace (0-3). Memory ops show different InstOp values (0x2x vs 0x5x) based on SIMD. + cs_wtype = (1 << 6) if self.dev.target >= (12,0,0) else self.soc.SQ_TT_WTYPE_INCLUDE_CS_BIT + self.wreg(self.gc.regSQ_THREAD_TRACE_MASK, wtype_include=cs_wtype, simd_sel=SQTT_SIMD_SEL.value, wgp_sel=0, sa_sel=0) + reg_include = self.soc.SQ_TT_TOKEN_MASK_SQDEC_BIT | self.soc.SQ_TT_TOKEN_MASK_SHDEC_BIT | self.soc.SQ_TT_TOKEN_MASK_GFXUDEC_BIT | \ + self.soc.SQ_TT_TOKEN_MASK_COMP_BIT | self.soc.SQ_TT_TOKEN_MASK_CONTEXT_BIT + token_exclude = SQTT_TOKEN_EXCLUDE.value | ((1 << self.soc.SQ_TT_TOKEN_EXCLUDE_PERF_SHIFT) if self.dev.target < (12,0,0) else 0) + + # disable instr tracing + if not (SQTT_ITRACE_SE_MASK.value >> se) & 0b1: + # gfx12 doesn't have enums with all fields, so it's hardcoded, but it's the same as gfx11. + token_exclude |= (1 << self.soc.SQ_TT_TOKEN_EXCLUDE_VMEMEXEC_SHIFT | 1 << self.soc.SQ_TT_TOKEN_EXCLUDE_ALUEXEC_SHIFT | \ + 1 << self.soc.SQ_TT_TOKEN_EXCLUDE_VALUINST_SHIFT | 1 << self.soc.SQ_TT_TOKEN_EXCLUDE_IMMEDIATE_SHIFT | \ + 1 << self.soc.SQ_TT_TOKEN_EXCLUDE_INST_SHIFT) if self.dev.target < (12,0,0) else 0x927 + + self.wreg(self.gc.regSQ_THREAD_TRACE_TOKEN_MASK, reg_include=reg_include, token_exclude=token_exclude, bop_events_token_include=1, + **({} if self.dev.target < (12,0,0) else {'exclude_barrier_wait': 1})) + self.sqtt_config(tracing=True) + + self.set_grbm() + if self.dev.target[0] != 9: self.wreg(self.gc.regCOMPUTE_THREAD_TRACE_ENABLE, 1) + self.memory_barrier() + return self + + # Magic values from src/amd/common/ac_sqtt.c:ac_sqtt_emit_stop and src/amd/common/ac_sqtt.c:ac_sqtt_emit_wait + def sqtt_stop(self, wptrs:HCQBuffer): + self.memory_barrier() + self.set_grbm() + + # Start shutting everything down + if self.dev.target[0] == 9: self.wreg(self.gc.regSQ_THREAD_TRACE_MODE, mask_cs=1, autoflush_en=1, mode=0) + else: + self.wreg(self.gc.regCOMPUTE_THREAD_TRACE_ENABLE, 0) + self.pkt3(self.pm4.PACKET3_EVENT_WRITE, self.pm4.EVENT_TYPE(self.soc.THREAD_TRACE_FINISH) | self.pm4.EVENT_INDEX(0)) + + # For each SE wait for finish to complete and copy regSQ_THREAD_TRACE_WPTR to know where in the buffer trace data ends + for se in range(self.dev.se_cnt * self.dev.xccs): + with self.pred_exec(xcc_mask=1<<(se // self.dev.se_cnt)): + self.set_grbm(se=se % self.dev.se_cnt, sh=0) + + regstatus = self.gc.regSQ_THREAD_TRACE_STATUS.addr[0] - (self.pm4.PACKET3_SET_UCONFIG_REG_START if self.dev.target[0] == 9 else 0) + if self.dev.target[0] != 9: + self.wait_reg_mem(reg=regstatus, mask=self.gc.regSQ_THREAD_TRACE_STATUS.fields_mask('finish_pending'), op=WAIT_REG_MEM_FUNCTION_EQ, value=0) + self.sqtt_config(tracing=False) + self.wait_reg_mem(reg=regstatus, mask=self.gc.regSQ_THREAD_TRACE_STATUS.fields_mask('busy'), op=WAIT_REG_MEM_FUNCTION_EQ, value=0) + self.pkt3(self.pm4.PACKET3_EVENT_WRITE, self.pm4.EVENT_TYPE(self.soc.CS_PARTIAL_FLUSH) | self.pm4.EVENT_INDEX(EVENT_INDEX_PARTIAL_FLUSH)) + + # Copy WPTR to memory (src_sel = perf, dst_sel = tc_l2, wr_confirm = True) + self.pkt3(self.pm4.PACKET3_COPY_DATA, 1 << 20 | 2 << 8 | 4, self.gc.regSQ_THREAD_TRACE_WPTR.addr[0], 0, *data64_le(wptrs.va_addr+(se*4))) + + self.set_grbm() + if self.dev.target[0] != 9: self.spi_config(tracing=False) + self.memory_barrier() + return self + + def exec(self, prg:AMDProgram, args_state:CLikeArgsState, global_size:tuple[sint, ...], local_size:tuple[sint, ...]): + self.bind_args_state(args_state) + + self.acquire_mem(gli=0, gl2=0) + + user_regs = [] + if prg.enable_private_segment_sgpr: + assert self.dev.xccs == 1, "Only architected flat scratch is supported on multi-xcc" + scratch_hilo = data64_le(prg.dev.scratch.va_addr) + # sgpr word1 bit31 enables swizzle + # sgpr word3 = 0x14 << 12 | 2 << 28 | 2 << 21 | 1 << 23 + user_regs = [scratch_hilo[0], scratch_hilo[1] | 1 << 31, 0xffffffff, 0x20c14000] + + if prg.enable_dispatch_ptr: + dp = (dp_t:=hsa.hsa_kernel_dispatch_packet_t).from_address(int((disp_buf:=args_state.buf.offset(prg.kernargs_segment_size)).va_addr)) + + self.bind_sints(*local_size, mem=disp_buf.cpu_view(), struct_t=dp_t, start_field='workgroup_size_x', fmt='H') + self.bind_sints(*[g*l for g,l in zip(global_size, local_size)], mem=disp_buf.cpu_view(), struct_t=dp_t, start_field='grid_size_x', fmt='I') + dp.group_segment_size, dp.private_segment_size = prg.group_segment_size, prg.private_segment_size + dp.kernarg_address = cast(ctypes.c_void_p, args_state.buf.va_addr) + user_regs += [*data64_le(disp_buf.va_addr)] + + user_regs += [*data64_le(args_state.buf.va_addr)] + + if prg.dev.sqtt_enabled: self.sqtt_setup_exec(prg, global_size) + + self.wreg(self.gc.regCOMPUTE_PGM_LO, *data64_le(prg.prog_addr >> 8)) + self.wreg(self.gc.regCOMPUTE_PGM_RSRC1, prg.rsrc1, prg.rsrc2) + self.wreg(self.gc.regCOMPUTE_PGM_RSRC3, prg.rsrc3) + self.wreg(self.gc.regCOMPUTE_TMPRING_SIZE, prg.dev.tmpring_size) + + # this is what llvm refers to as "architected flat scratch" + for xcc_id in range(self.dev.xccs): + with self.pred_exec(xcc_mask=1<> 8)) + + self.wreg(self.gc.regCOMPUTE_RESTART_X, 0, 0, 0) + self.wreg(self.gc.regCOMPUTE_USER_DATA_0, *user_regs) + self.wreg(self.gc.regCOMPUTE_RESOURCE_LIMITS, waves_per_sh=getenv("WAVES_PER_SH")) + self.wreg(self.gc.regCOMPUTE_START_X, 0, 0, 0, *local_size, 0, 0) + + self.pkt3(self.pm4.PACKET3_DISPATCH_DIRECT, *global_size, + self.gc.regCOMPUTE_DISPATCH_INITIATOR.encode(**({'cs_w32_en': int(prg.wave32)} if prg.dev.target[0] != 9 else {}), + force_start_at_000=1, compute_shader_en=1)) + + if prg.dev.sqtt_enabled: self.pkt3(self.pm4.PACKET3_EVENT_WRITE, self.pm4.EVENT_TYPE(self.soc.THREAD_TRACE_MARKER) | self.pm4.EVENT_INDEX(0)) + self.pkt3(self.pm4.PACKET3_EVENT_WRITE, self.pm4.EVENT_TYPE(self.soc.CS_PARTIAL_FLUSH) | self.pm4.EVENT_INDEX(EVENT_INDEX_PARTIAL_FLUSH)) + return self + + def wait(self, signal:AMDSignal, value:sint=0): return self.wait_reg_mem(mem=signal.value_addr, value=value, mask=0xffffffff) + + def timestamp(self, signal:AMDSignal): + with self.pred_exec(xcc_mask=0b1): + self.release_mem(cache_flush=False) # ensure all prior writes are done + self.release_mem(signal.timestamp_addr, 0, self.pm4.data_sel__mec_release_mem__send_gpu_clock_counter, self.pm4.int_sel__mec_release_mem__none) + self.acquire_mem() # ensure timestamp is written + return self + + def write(self, b:HCQBuffer, val:sint, b64:bool=False): + data_sel = self.pm4.data_sel__mec_release_mem__send_64_bit_data if b64 else self.pm4.data_sel__mec_release_mem__send_32_bit_low + return self.release_mem(b.va_addr, val, data_sel, self.pm4.int_sel__mec_release_mem__none) + + def poll_bit(self, b:HCQBuffer, val:sint, mask:int): return self.wait_reg_mem(val, mask=mask, mem=b.va_addr, op=WAIT_REG_MEM_FUNCTION_EQ) + + def signal(self, signal:AMDSignal, value:sint=0): + with self.pred_exec(xcc_mask=0b1): + # NOTE: this needs an EOP buffer on the queue or it will NULL pointer + self.release_mem(signal.value_addr, value, self.pm4.data_sel__mec_release_mem__send_32_bit_low, + self.pm4.int_sel__mec_release_mem__none, cache_flush=True) + + if (dev:=signal.owner) is not None and signal.is_timeline and not dev.is_am(): + self.release_mem(dev.queue_event_mailbox_ptr, dev.queue_event.event_id, self.pm4.data_sel__mec_release_mem__send_32_bit_low, + self.pm4.int_sel__mec_release_mem__send_interrupt_after_write_confirm, ctxid=dev.queue_event.event_id) + return self + + def bind(self, dev:AMDDevice): + self.binded_device = dev + self.hw_page = dev.allocator.alloc(len(self._q) * 4, BufferSpec(cpu_access=True, nolru=True, uncached=True)) + hw_view = self.hw_page.cpu_view().view(fmt='I') + for i, value in enumerate(self._q): hw_view[i] = value + + self.indirect_cmd = [self.pm4.PACKET3(self.pm4.PACKET3_INDIRECT_BUFFER, 2), *data64_le(self.hw_page.va_addr), + len(self._q) | self.pm4.INDIRECT_BUFFER_VALID] + self._q = hw_view + return self + + def _submit(self, dev:AMDDevice): + cmds = self.indirect_cmd if dev == self.binded_device else self._q + # WORKAROUND: PACKET3_PRED_EXEC doesn't work in rings, only in IBs, create a fake IB inside a ring to work around that + if self.dev.xccs > 1 and dev != self.binded_device: + ib_end = ((dev.compute_queue.put_value + 5) % len(dev.compute_queue.ring)) + len(cmds) + ib_pad = len(dev.compute_queue.ring) - (ib_end - len(cmds)) if ib_end > len(dev.compute_queue.ring) else 0 + ib_ptr = dev.compute_queue.ring.addr + ((dev.compute_queue.put_value + 5 + ib_pad) % len(dev.compute_queue.ring)) * 4 + cmds = [self.pm4.PACKET3(self.pm4.PACKET3_INDIRECT_BUFFER, 2), *data64_le(ib_ptr), len(cmds) | self.pm4.INDIRECT_BUFFER_VALID, + self.pm4.PACKET3(self.pm4.PACKET3_NOP, ib_pad + len(cmds) - 1), *((0,) * ib_pad), *cmds] + + for i, value in enumerate(cmds): dev.compute_queue.ring[(dev.compute_queue.put_value + i) % len(dev.compute_queue.ring)] = value + + dev.compute_queue.put_value += len(cmds) + dev.compute_queue.signal_doorbell(dev) + +class AMDComputeAQLQueue(AMDComputeQueue): + def exec(self, prg:AMDProgram, args_state:CLikeArgsState, global_size:tuple[sint, ...], local_size:tuple[sint, ...]): + self.bind_args_state(args_state) + if prg.dev.sqtt_enabled: self.sqtt_setup_exec(prg, global_size) + self._q.append(pkt:=hsa.hsa_kernel_dispatch_packet_t(header=AQL_HDR | (hsa.HSA_PACKET_TYPE_KERNEL_DISPATCH << hsa.HSA_PACKET_HEADER_TYPE), + setup=3< bytes: + return bytes(array.array('I', [AQL_HDR | (hsa.HSA_PACKET_TYPE_VENDOR_SPECIFIC << hsa.HSA_PACKET_HEADER_TYPE) | (1 << 16), + self.pm4.PACKET3(self.pm4.PACKET3_INDIRECT_BUFFER, 2), *data64_le(addr), cnt | self.pm4.INDIRECT_BUFFER_VALID, 10] + [0] * 10)) + + def _prep_aql(self, q:list, pm4_buf:HCQBuffer) -> list[bytes|hsa.hsa_kernel_dispatch_packet_t]: + pm4_buf.cpu_view().view(fmt='I')[:len(q)] = array.array('I', [0 if isinstance(c, hsa.hsa_kernel_dispatch_packet_t) else c for c in q]) + + splits = [-1, *[i for i, c in enumerate(q) if isinstance(c, hsa.hsa_kernel_dispatch_packet_t)], len(q)] + aql_cmds:list[bytes|hsa.hsa_kernel_dispatch_packet_t] = [] + for prev_pkt, cur_pkt in zip(splits, splits[1:]): + if cur_pkt - prev_pkt > 1: aql_cmds.append(self._pm4_pkt(pm4_buf.va_addr + (prev_pkt+1) * 4, cur_pkt - prev_pkt - 1)) # pm4 commands + if cur_pkt < len(q): aql_cmds.append(q[cur_pkt]) # aql + return aql_cmds + + def bind(self, dev:AMDDevice): + self.binded_device = dev + self.hw_page = dev.allocator.alloc(len(self._q) * 4, BufferSpec(cpu_access=True, nolru=True, uncached=True)) + self._cmds = self._prep_aql(self._q, self.hw_page) + self._q = self.hw_page.cpu_view().view(fmt='I') + return self + + def _submit(self, dev:AMDDevice): + cmds = self._cmds if dev == self.binded_device else self._prep_aql(self._q, dev.pm4_ibs.offset(dev.pm4_ib_alloc.alloc(len(self._q) * 4, 16))) + aql_bytes = b''.join(bytes(c) if isinstance(c, hsa.hsa_kernel_dispatch_packet_t) else c for c in cmds) + + assert len(aql_bytes) < dev.compute_queue.ring.nbytes, "submit is too large for the queue" + cp_bytes = min(len(aql_bytes), (dev.compute_queue.ring.nbytes - (dev.compute_queue.put_value * 64) % dev.compute_queue.ring.nbytes)) + dev.compute_queue.ring.view(offset=(dev.compute_queue.put_value * 64) % dev.compute_queue.ring.nbytes, fmt='B')[:cp_bytes] = aql_bytes[:cp_bytes] + if (tail_bytes:=(len(aql_bytes) - cp_bytes)) > 0: dev.compute_queue.ring.view(offset=0, fmt='B')[:tail_bytes] = aql_bytes[cp_bytes:] + dev.compute_queue.put_value += len(aql_bytes) // 64 + dev.compute_queue.signal_doorbell(dev, doorbell_value=dev.compute_queue.put_value-1) + +class AMDCopyQueue(HWQueue): + def __init__(self, dev, max_copy_size=0x40000000, queue_idx=0): + self.dev, self.sdma, self.internal_cmd_sizes, self.max_copy_size, self.queue_idx = dev, dev.sdma, [], max_copy_size, queue_idx + super().__init__() + + def q(self, *arr): + super().q(*arr) + self.internal_cmd_sizes.append(len(arr)) + + def copy(self, dest:HCQBuffer, src:HCQBuffer, copy_size:int): + copied, copy_commands = 0, (copy_size + self.max_copy_size - 1) // self.max_copy_size + + for _ in range(copy_commands): + step_copy_size = min(copy_size - copied, self.max_copy_size) + + self.q(self.sdma.SDMA_OP_COPY | self.sdma.SDMA_PKT_COPY_LINEAR_HEADER_SUB_OP(self.sdma.SDMA_SUBOP_COPY_LINEAR), + self.sdma.SDMA_PKT_COPY_LINEAR_COUNT_COUNT(step_copy_size - 1), 0, *data64_le(src.va_addr + copied), *data64_le(dest.va_addr + copied)) + + copied += step_copy_size + return self + + def signal(self, signal:AMDSignal, value:sint=0): + fence_flags = self.sdma.SDMA_PKT_FENCE_HEADER_MTYPE(3) if self.dev.target[0] != 9 else 0 + self.q(self.sdma.SDMA_OP_FENCE | fence_flags, *data64_le(signal.value_addr), value) + + if (dev:=signal.owner) is not None and signal.is_timeline and not dev.is_am(): + self.q(self.sdma.SDMA_OP_FENCE | fence_flags, *data64_le(dev.queue_event_mailbox_ptr), dev.queue_event.event_id) + self.q(self.sdma.SDMA_OP_TRAP, self.sdma.SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT(dev.queue_event.event_id)) + return self + + def wait(self, signal:AMDSignal, value:sint=0): + self.q(self.sdma.SDMA_OP_POLL_REGMEM | self.sdma.SDMA_PKT_POLL_REGMEM_HEADER_FUNC(WAIT_REG_MEM_FUNCTION_GEQ) | \ + self.sdma.SDMA_PKT_POLL_REGMEM_HEADER_MEM_POLL(1), *data64_le(signal.value_addr), value, 0xffffffff, + self.sdma.SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(0x04) | self.sdma.SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT(0xfff)) + return self + + def timestamp(self, signal:AMDSignal): + self.q(self.sdma.SDMA_OP_TIMESTAMP | self.sdma.SDMA_PKT_TIMESTAMP_GET_HEADER_SUB_OP(self.sdma.SDMA_SUBOP_TIMESTAMP_GET_GLOBAL), + *data64_le(signal.timestamp_addr)) + return self + + def write(self, b:HCQBuffer, val:sint, b64:bool=False): + self.q(self.sdma.SDMA_OP_WRITE, *data64_le(b.va_addr), 1 if b64 else 0, lo32(val), *([hi32(val)] if b64 else [])) + return self + + def bind(self, dev:AMDDevice): + if not getenv("AMD_SDMA_BIND", 0) or not dev.is_am(): return + + self.binded_device = dev + self.hw_page = dev.allocator.alloc((qsz:=round_up(len(self._q), 8)) * 4, BufferSpec(cpu_access=True, nolru=True, uncached=True)) + hw_view = self.hw_page.cpu_view().view(fmt='I') + for i in range(qsz): hw_view[i] = self._q[i] if i < len(self._q) else 0 + + self.indirect_cmd = [self.sdma.SDMA_OP_INDIRECT | self.sdma.SDMA_PKT_INDIRECT_HEADER_VMID(0), *data64_le(self.hw_page.va_addr), qsz, + *data64_le(0)] + self._q, self.cmd_sizes = hw_view, [len(self.indirect_cmd)] + + def _submit(self, dev:AMDDevice): + sdma_queue = dev.sdma_queue(self.queue_idx) + if self.binded_device == dev: + # An IB packet must end on a 8 DW boundary. + add = (8 - (((sdma_queue.put_value % 32) // 4) + len(self.indirect_cmd) % 8)) % 8 + cmds, cmd_sizes = ([0] * add) + self.indirect_cmd, [len(self.indirect_cmd) + add] + + if len(cmds) * 4 >= (sdma_queue.ring.nbytes - sdma_queue.put_value % sdma_queue.ring.nbytes): + cmds, cmd_sizes = [0, 0] + self.indirect_cmd, [8] + else: cmds, cmd_sizes = self._q, self.internal_cmd_sizes + + tail_blit_dword = 0 + for cmdsz in cmd_sizes: + if (tail_blit_dword + cmdsz) * 4 >= sdma_queue.ring.nbytes - sdma_queue.put_value % sdma_queue.ring.nbytes: break + tail_blit_dword += cmdsz + + # Force align of submits to hit our usb layer write cache. + if (rem_packet_cnt := len(cmds) - tail_blit_dword) > 0 and dev.is_usb(): tail_blit_dword = 0 + + # USB devices run in single-step mode, so they can't overrun the queue. + total_bytes = (tail_blit_dword * 4 if rem_packet_cnt == 0 else -sdma_queue.put_value % sdma_queue.ring.nbytes) + rem_packet_cnt * 4 + assert total_bytes < sdma_queue.ring.nbytes, "SDMA queue overrun" + while not dev.is_usb() and sdma_queue.put_value + total_bytes - sdma_queue.read_ptr[0] > sdma_queue.ring.nbytes: pass + + start_idx = (sdma_queue.put_value % sdma_queue.ring.nbytes) // 4 + sdma_queue.ring[start_idx : start_idx + tail_blit_dword] = array.array('I', cmds[:tail_blit_dword]) + sdma_queue.put_value += tail_blit_dword * 4 + + if (rem_packet_cnt := len(cmds) - tail_blit_dword) > 0: + zero_fill = sdma_queue.ring.nbytes - sdma_queue.put_value % sdma_queue.ring.nbytes + sdma_queue.ring.view(sdma_queue.put_value % sdma_queue.ring.nbytes, zero_fill, fmt='B')[:] = bytes(zero_fill) + sdma_queue.put_value += zero_fill + + sdma_queue.ring[0:rem_packet_cnt] = array.array('I', cmds[tail_blit_dword:]) + sdma_queue.put_value += rem_packet_cnt * 4 + + sdma_queue.signal_doorbell(dev) + +class AMDProgram(HCQProgram['AMDDevice']): + def __init__(self, dev:AMDDevice, obj:TinyELF): + # TODO; this API needs the type signature of the function and global_size/local_size + self.dev, self.name, self.lib = dev, obj.name, obj.lib + + image, sections, relocs = elf_loader(self.lib) + + rodata_entry = next((sh.header.sh_addr for sh in sections if sh.name == ".rodata"), -1) + assert rodata_entry >= 0, ".rodata section not found" + + for apply_image_offset, rel_sym_offset, typ, addent in relocs: + if typ == 5: image[apply_image_offset:apply_image_offset+8] = struct.pack(' (self.dev.iface.props['lds_size_in_kb'] * 1024) // 512: raise RuntimeError("Too many resources requested: group_segment_size") + + # Ensure scratch size + self.dev._ensure_has_local_memory(self.private_segment_size) + + self.wave32: bool = desc.kernel_code_properties & 0x400 == 0x400 + + # Set rsrc1.priv=1 on gfx11 to workaround cwsr. + self.rsrc1: int = desc.compute_pgm_rsrc1 | ((1 << 20) if self.dev.target[0] == 11 else 0) + self.rsrc2: int = desc.compute_pgm_rsrc2 | (lds_size << 15) + self.rsrc3: int = desc.compute_pgm_rsrc3 + self.aql_prog_addr: int = self.lib_gpu.va_addr + rodata_entry + self.prog_addr: int = self.lib_gpu.va_addr + rodata_entry + desc.kernel_code_entry_byte_offset + # Some programs use hsa_kernel_dispatch_packet_t to read workgroup sizes during execution. + # The packet is represented as a pointer and set up in SGPRs. Space for the packet is allocated as part of the kernel arguments. + self.enable_dispatch_ptr: int = desc.kernel_code_properties & hsa.AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_DISPATCH_PTR + self.enable_private_segment_sgpr: int = desc.kernel_code_properties & hsa.AMD_KERNEL_CODE_PROPERTIES_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER + additional_alloc_sz = ctypes.sizeof(hsa.hsa_kernel_dispatch_packet_t) if self.enable_dispatch_ptr else 0 + + if dev.sqtt_enabled: self.libhash: tuple[int, int] = struct.unpack('= 5: print(f'\t{self.dev.device}: SE {se} blob size {wptr:#x}') + assert wptr >= 0 and wptr <= buf.size, f"{wptr} > {buf.size}, should never happen" + + # When sqtt buffer overflows, wptr stops at the last dword + if wptr >= buf.size - 32: + print(colored(f"{self.dev.device}: Warning: SQTT buffer is full (SE {se})! Increase SQTT buffer with SQTT_BUFFER_SIZE=X (in MB)", "yellow")) + + self.dev.allocator._copyout(sqtt_mv:=memoryview(bytearray(wptr)), buf) + resbuf = (struct.pack('> se) & 1), self.dev.prof_exec_counter)] + return res + +class AMDAllocator(HCQAllocator['AMDDevice']): + def __init__(self, dev:AMDDevice): + super().__init__(dev, copy_bufs=getattr(dev.iface, 'copy_bufs', None), + supports_copy_from_disk=dev.has_sdma_queue, supports_transfer=dev.has_sdma_queue and not dev.is_usb()) + + def _alloc(self, size:int, options:BufferSpec) -> HCQBuffer: + return self.dev.iface.alloc(size, host=options.host, uncached=options.uncached, cpu_access=options.cpu_access or not self.dev.has_sdma_queue) + + def _do_free(self, opaque, options:BufferSpec): self.dev.iface.free(opaque) + + def _do_map(self, buf:HCQBuffer): return self.dev.iface.map(buf._base if buf._base is not None else buf) + + def _copyout(self, dest:memoryview, src:HCQBuffer): + if not self.dev.is_usb(): return super()._copyout(dest, src) + self.dev.synchronize() + + with hcq_profile(self.dev, queue_type=self.dev.hw_copy_queue_t, desc=TracingKey(f"{self.dev.device} -> TINY", ret=dest.nbytes), enabled=PROFILE, + dev_suff="SDMA:0"): + for i in range(0, dest.nbytes, cp_size:=self.b[0].size): + self.dev.iface.pci_dev.usb.scsi_read_arm(lsize:=min(cp_size, dest.nbytes - i)) + self.dev.hw_copy_queue_t().wait(self.dev.timeline_signal, self.dev.timeline_value - 1) \ + .copy(self.b[0], src.offset(i), lsize) \ + .write(self.dev.iface.cq_buf.offset(12), 0) \ + .signal(self.dev.timeline_signal, self.dev.next_timeline()).submit(self.dev) + dest.cast('B')[i:i+lsize] = self.b[0].cpu_view().view(size=lsize, fmt='B')[:] + +@dataclass +class AMDQueueDesc: + ring: MMIOInterface + read_ptr: MMIOInterface + write_ptr: MMIOInterface + doorbell: MMIOInterface + put_value: int = 0 + params: tuple|None = None # setup_ring params for recovery + + def signal_doorbell(self, dev, doorbell_value:int|None=None): + try: + self.write_ptr[0] = self.put_value + + # No mapped access with usb + if dev.is_am() and not dev.is_usb(): + # Ensure all prior writes are visible to the GPU. + System.memory_barrier() + dev.iface.dev_impl.gmc.flush_hdp() + + self.doorbell[0] = self.put_value if doorbell_value is None else doorbell_value + except Exception as e: + dev.error_state = e + raise + +class KFDIface: + kfd:FileIOInterface|None = None + event_page:HCQBuffer|None = None + gpus:list[FileIOInterface] = [] + count:int = 0 + + def _is_usable_gpu(self, gpu_id): + with contextlib.suppress(OSError): return int(gpu_id.read()) != 0 + return False + + def __init__(self, dev, device_id): + self.dev = dev + + kfd_topo_path = "/sys/devices/virtual/kfd/kfd/topology/nodes" + + # Initialize KFD interface during first run + if KFDIface.kfd is None: + KFDIface.kfd = FileIOInterface("/dev/kfd", os.O_RDWR) + gpus = [g for g in FileIOInterface(kfd_topo_path).listdir() if self._is_usable_gpu(FileIOInterface(f"{kfd_topo_path}/{g}/gpu_id"))] + KFDIface.gpus = hcq_filter_visible_devices(sorted(gpus, key=lambda x: int(x.split('/')[-1])), "AMD") + KFDIface.count = len(KFDIface.gpus) + + if device_id >= len(KFDIface.gpus): raise RuntimeError(f"No device found for {device_id}. Requesting more devices than the system has?") + + self.gpu_id = int(FileIOInterface(f"{kfd_topo_path}/{KFDIface.gpus[device_id]}/gpu_id").read()) + self.props = {(p:=l.split())[0]: int(p[1]) for l in FileIOInterface(f"{kfd_topo_path}/{KFDIface.gpus[device_id]}/properties").read().splitlines()} + self.dev_sysfs_path = f"/sys/class/drm/renderD{self.props['drm_render_minor']}/device" + ip_base = f"{self.dev_sysfs_path}/ip_discovery/die/0" + id2ip = {am.GC_HWID: am.GC_HWIP, am.SDMA0_HWID: am.SDMA0_HWIP, am.NBIF_HWID: am.NBIF_HWIP} + ip_hw = [(id2ip[int(hwid)], int(hwid)) for hwid in FileIOInterface(ip_base).listdir() if hwid.isnumeric() and int(hwid) in id2ip] + self.ip_versions = {ip:tuple(int(FileIOInterface(f'{ip_base}/{hw}/0/{part}').read()) for part in ['major','minor','revision']) for ip,hw in ip_hw} + self.drm_fd = FileIOInterface(f"/dev/dri/renderD{self.props['drm_render_minor']}", os.O_RDWR) + + self.kfd_ver = ((ver_st:=kfd.AMDKFD_IOC_GET_VERSION(KFDIface.kfd)).major_version, ver_st.minor_version) + kfd.AMDKFD_IOC_ACQUIRE_VM(KFDIface.kfd, drm_fd=self.drm_fd.fd, gpu_id=self.gpu_id) + if self.kfd_ver >= (1,14): kfd.AMDKFD_IOC_RUNTIME_ENABLE(KFDIface.kfd, mode_mask=0) + + # Set these for our device. + if KFDIface.event_page is None: + KFDIface.event_page = self.alloc(0x8000, uncached=True) + kfd.AMDKFD_IOC_CREATE_EVENT(KFDIface.kfd, event_page_offset=KFDIface.event_page.meta.handle) + else: self.map(KFDIface.event_page) + + # Event to wait for queues completion + self.dev.queue_event = kfd.AMDKFD_IOC_CREATE_EVENT(KFDIface.kfd, event_type=kfd.KFD_IOC_EVENT_SIGNAL, auto_reset=1) + self.dev.queue_event_mailbox_ptr = KFDIface.event_page.va_addr + self.dev.queue_event.event_slot_index * 8 + + # OS events to collect memory and hardware faults + self.mem_fault_event = kfd.AMDKFD_IOC_CREATE_EVENT(KFDIface.kfd, event_type=kfd.KFD_IOC_EVENT_MEMORY) + self.hw_fault_event = kfd.AMDKFD_IOC_CREATE_EVENT(KFDIface.kfd, event_type=kfd.KFD_IOC_EVENT_HW_EXCEPTION) + + self.queue_event_arr = (kfd.struct_kfd_event_data * 3)(kfd.struct_kfd_event_data(event_id=self.dev.queue_event.event_id), + kfd.struct_kfd_event_data(event_id=self.mem_fault_event.event_id), kfd.struct_kfd_event_data(event_id=self.hw_fault_event.event_id)) + self.queue_event_arr_ptr = ctypes.addressof(self.queue_event_arr) + + def alloc(self, size:int, host=False, uncached=False, cpu_access=False, contiguous=False, cpu_addr=None) -> HCQBuffer: + flags = kfd.KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE | kfd.KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE | kfd.KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE + + if uncached: flags |= kfd.KFD_IOC_ALLOC_MEM_FLAGS_COHERENT | kfd.KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED | kfd.KFD_IOC_ALLOC_MEM_FLAGS_GTT + else: flags |= (kfd.KFD_IOC_ALLOC_MEM_FLAGS_USERPTR if host else kfd.KFD_IOC_ALLOC_MEM_FLAGS_VRAM) + + # Make mapped cpu address to be uncachable + if cpu_addr is not None: flags |= kfd.KFD_IOC_ALLOC_MEM_FLAGS_COHERENT | kfd.KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED + + if cpu_access or host: flags |= kfd.KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC + + if flags & kfd.KFD_IOC_ALLOC_MEM_FLAGS_USERPTR: + buf = addr = cpu_addr or FileIOInterface.anon_mmap(0, size, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED | mmap.MAP_ANONYMOUS, 0) + else: buf, addr = 0, FileIOInterface.anon_mmap(0, size, 0, mmap.MAP_PRIVATE | mmap.MAP_ANONYMOUS | MAP_NORESERVE, 0) + + try: mem = kfd.AMDKFD_IOC_ALLOC_MEMORY_OF_GPU(self.kfd, va_addr=addr, size=size, gpu_id=self.gpu_id, flags=flags, mmap_offset=buf) + except OSError as e: + if e.errno == errno.EINVAL and (flags & kfd.KFD_IOC_ALLOC_MEM_FLAGS_VRAM) and cpu_access: + raise MemoryError("Cannot allocate host-visible VRAM. Ensure the resizable BAR option is enabled on your system.") from e + if e.errno == errno.ENOMEM: raise MemoryError(f"Cannot allocate {size} bytes: no memory is available.") from e + raise + + if not (flags & kfd.KFD_IOC_ALLOC_MEM_FLAGS_USERPTR): + buf = self.drm_fd.mmap(mem.va_addr, mem.size, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED | MAP_FIXED, mem.mmap_offset) + assert addr == buf == mem.va_addr + + view = MMIOInterface(mem.va_addr, mem.size, fmt='B') if cpu_access or host else None + self.map(hcqbuf:=HCQBuffer(mem.va_addr, mem.size, meta=mem, view=view, owner=self.dev)) + return hcqbuf + + def free(self, mem): + gpus = (ctypes.c_int32 * 1)(self.gpu_id) + stm = kfd.AMDKFD_IOC_UNMAP_MEMORY_FROM_GPU(self.kfd, handle=mem.meta.handle, device_ids_array_ptr=ctypes.addressof(gpus), n_devices=1) + assert stm.n_success == 1 + if mem.owner == self.dev: + if mem.va_addr: FileIOInterface.munmap(mem.va_addr, mem.size) + kfd.AMDKFD_IOC_FREE_MEMORY_OF_GPU(self.kfd, handle=mem.meta.handle) + + def map(self, mem): + if mem.owner is not None and mem.owner._is_cpu(): return self.alloc(mem.size, host=True, cpu_addr=mem.va_addr) + + c_gpus = (ctypes.c_int32 * 1)(self.gpu_id) + stm = kfd.AMDKFD_IOC_MAP_MEMORY_TO_GPU(self.kfd, handle=mem.meta.handle, device_ids_array_ptr=ctypes.addressof(c_gpus), n_devices=1) + assert stm.n_success == 1 + return HCQBuffer(mem.va_addr, mem.size, meta=mem.meta, owner=mem.owner) + + def create_queue(self, queue_type, ring, gart, rptr, wptr, eop_buffer=None, cwsr_buffer=None, ctl_stack_size=0, ctx_save_restore_size=0, + xcc_id=0, idx=0): + queue = kfd.AMDKFD_IOC_CREATE_QUEUE(KFDIface.kfd, ring_base_address=ring.va_addr, ring_size=ring.size, gpu_id=self.gpu_id, + queue_type=queue_type, queue_percentage=kfd.KFD_MAX_QUEUE_PERCENTAGE|(xcc_id<<8), queue_priority=getenv("AMD_KFD_QUEUE_PRIORITY", 7), + eop_buffer_address=eop_buffer.va_addr if eop_buffer else 0, eop_buffer_size=eop_buffer.size if eop_buffer else 0, ctl_stack_size=ctl_stack_size, + ctx_save_restore_address=cwsr_buffer.va_addr if cwsr_buffer else 0, ctx_save_restore_size=ctx_save_restore_size, + write_pointer_address=gart.va_addr+wptr, read_pointer_address=gart.va_addr+rptr+8*xcc_id) + + if not hasattr(self, 'doorbells'): + self.doorbells_base = queue.doorbell_offset & (~0x1fff) # doorbell is two pages + self.doorbells = cast(FileIOInterface, KFDIface.kfd).mmap(0, 0x2000, mmap.PROT_READ|mmap.PROT_WRITE, mmap.MAP_SHARED, self.doorbells_base) + + return AMDQueueDesc(ring=MMIOInterface(ring.va_addr, ring.size, fmt='I'), read_ptr=MMIOInterface(queue.read_pointer_address, 8, fmt='Q'), + write_ptr=MMIOInterface(queue.write_pointer_address, 8, fmt='Q'), + doorbell=MMIOInterface(self.doorbells + queue.doorbell_offset - self.doorbells_base, 8, fmt='Q')) + + def sleep(self, tm:int): + kfd.AMDKFD_IOC_WAIT_EVENTS(KFDIface.kfd, events_ptr=self.queue_event_arr_ptr, num_events=3, wait_for_all=0, timeout=tm) + if self.queue_event_arr[1].memory_exception_data.gpu_id or self.queue_event_arr[2].hw_exception_data.gpu_id: self.on_device_hang() + + def on_device_hang(self): + def _str(st): return ' '.join(f'{k[0]}={getattr(st, k[0])}' for k in st._real_fields_) + + # try to collect fault info if not already set from sleep(). + if not self.queue_event_arr[1].memory_exception_data.gpu_id and not self.queue_event_arr[2].hw_exception_data.gpu_id: + with contextlib.suppress(RuntimeError): self.sleep(tm=1) + + report = [] + if self.queue_event_arr[1].memory_exception_data.gpu_id: + report += [f"MMU fault: 0x{self.queue_event_arr[1].memory_exception_data.va:X} | {_str(self.queue_event_arr[1].memory_exception_data.failure)}"] + if self.queue_event_arr[2].hw_exception_data.gpu_id: report += [f"HW fault: {_str(self.queue_event_arr[2].hw_exception_data)}"] + + raise RuntimeError("\n".join(report)) + + def require_profile_mode(self, can_set_mode=True): + if self.dev.target[0] == 9: return + fn = f'{self.dev_sysfs_path}/power_dpm_force_performance_level' + if (perflevel:=FileIOInterface(fn).read().strip()) != 'profile_standard': + if can_set_mode: + atexit.register(lambda: os.system(f"echo '{perflevel}' | sudo tee {fn} > /dev/null")) + os.system(f"echo 'profile_standard' | sudo tee {fn} > /dev/null") + self.require_profile_mode(can_set_mode=False) + else: + raise RuntimeError("PMC/SQTT requires stable power state: run `amd-smi set -l stable_std` for KFD iface") + + @functools.cached_property + def drm_dev_info(self) -> amdgpu_drm.struct_drm_amdgpu_info_device: + amdgpu_drm.DRM_IOCTL_AMDGPU_INFO(self.drm_fd, query=amdgpu_drm.AMDGPU_INFO_DEV_INFO, + return_pointer=ctypes.addressof(inf:=amdgpu_drm.struct_drm_amdgpu_info_device()), return_size=ctypes.sizeof(inf)) + return inf + def is_wgp_active(self, xcc, se, sa, wgp) -> bool: return ((self.drm_dev_info.cu_bitmap[se % 4][sa + (se // 4) * 2] >> (2 * wgp)) & 0x3) == 0x3 + +class PCIIface(PCIIfaceBase): + def __init__(self, dev, dev_id): + super().__init__(dev, dev_id, vendor=0x1002, devices=((0xffff, (0x74a1,0x744c,0x7480,0x7550,0x7551,0x7590,0x75a0)),), vram_bar=0, + va_start=AMMemoryManager.va_allocator.base, va_size=AMMemoryManager.va_allocator.size, dev_impl_t=AMDev) + self._compute_props() + + def p2p_paddrs(self, paddrs:list[tuple[int,int]]) -> tuple[list[tuple[int,int]], AddrSpace]: + return ([(self.dev_impl.paddr2xgmi(p), sz) for p, sz in paddrs], AddrSpace.PEER) if self.dev_impl.is_hive() else super().p2p_paddrs(paddrs) + + def require_profile_mode(self): return True + def is_wgp_active(self, xcc, se, sa, wgp) -> bool: return True # TODO: account for WGP disablement on some asics. + + def _compute_props(self): + self.ip_versions = self.dev_impl.ip_ver + + gfxver = int(f"{self.dev_impl.ip_ver[am.GC_HWIP][0]:02d}{self.dev_impl.ip_ver[am.GC_HWIP][1]:02d}{self.dev_impl.ip_ver[am.GC_HWIP][2]:02d}") + if self.dev_impl.gc_info.header.version_major == 2: + cu_per_sa = self.dev_impl.gc_info.gc_num_cu_per_sh + max_sh_per_se = self.dev_impl.gc_info.gc_num_sh_per_se + else: + cu_per_sa = 2 * (self.dev_impl.gc_info.gc_num_wgp0_per_sa + self.dev_impl.gc_info.gc_num_wgp1_per_sa) + max_sh_per_se = self.dev_impl.gc_info.gc_num_sa_per_se + + array_count = max_sh_per_se * self.dev_impl.gc_info.gc_num_se * self.dev_impl.gfx.xccs + self.props = {'cu_per_simd_array': cu_per_sa, 'simd_count': 2 * cu_per_sa * array_count, 'simd_per_cu': 2, 'array_count': array_count, + 'max_slots_scratch_cu': self.dev_impl.gc_info.gc_max_scratch_slots_per_cu, 'max_waves_per_simd': self.dev_impl.gc_info.gc_max_waves_per_simd, + 'simd_arrays_per_engine': max_sh_per_se, 'lds_size_in_kb': self.dev_impl.gc_info.gc_lds_size, 'num_xcc': self.dev_impl.gfx.xccs, + 'gfx_target_version': {90403: 90402}.get(gfxver, gfxver)} + + def create_queue(self, queue_type, ring, gart, rptr, wptr, eop_buffer=None, cwsr_buffer=None, ctl_stack_size=0, ctx_save_restore_size=0, + xcc_id=0, idx=0): + assert cwsr_buffer is None, "no cwsr buffer for am" + + rcvr_params: tuple + if queue_type == kfd.KFD_IOC_QUEUE_TYPE_SDMA: + doorbell_index = self.dev_impl.sdma.setup_ring(*(rcvr_params:=(ring.va_addr, ring.size, gart.va_addr+rptr, gart.va_addr+wptr, idx))) + else: + doorbell_index = self.dev_impl.gfx.setup_ring(*(rcvr_params:=(ring.va_addr, ring.size, gart.va_addr+rptr, gart.va_addr+wptr, + eop_buffer.va_addr, eop_buffer.size, is_aql:=(queue_type==kfd.KFD_IOC_QUEUE_TYPE_COMPUTE_AQL), is_aql))) + + return AMDQueueDesc(ring=ring.cpu_view().view(fmt='I'), doorbell=self.dev_impl.doorbell64.view(doorbell_index * 8, 8, fmt='Q'), put_value=0, + read_ptr=gart.cpu_view().view(offset=rptr, size=8, fmt='Q'), write_ptr=gart.cpu_view().view(offset=wptr, size=8, fmt='Q'), params=rcvr_params) + + def _collect_interrupts(self, reset=False, drain_only=False): + devs:list[AMDDevice] = [d for pg in HCQCompiled.peer_groups.values() for d in pg if isinstance(d, AMDDevice) and d.is_am()] + for d in devs: + if drain_only: d.iface.dev_impl.ih.drain() + else: d.iface.dev_impl.ih.interrupt_handler() + + if reset and d.iface.dev_impl.recover(force=d.error_state is not None): + d.compute_queue.put_value = d.compute_queue.read_ptr[0] = d.compute_queue.write_ptr[0] = 0 + d.iface.dev_impl.gfx.setup_ring(*d.compute_queue.params) + d.timeline_signal.value = d.timeline_value - 1 + d.error_state = None + + def sleep(self, timeout): + if hasattr(self.pci_dev, 'irq_poller') and self.pci_dev.irq_poller is not None and (events_cnt:=len(self.pci_dev.irq_poller.poll(timeout))): + self.pci_dev.irq_fd.read(8 * events_cnt) + self._collect_interrupts() + if self.dev_impl.is_err_state: raise RuntimeError("Device is in error state") + + def on_device_hang(self): + self._collect_interrupts(reset=True) + raise RuntimeError("Device hang detected") + + def device_fini(self): self.dev_impl.fini() + +class USBIface(PCIIface): + def __init__(self, dev, dev_id): # pylint: disable=super-init-not-called + if dev_id >= len(visible:=hcq_filter_visible_devices(USB3.list_devices(0xADD1, 0x0001) + USB3.list_devices(0x3801, 0x0001), "AMD")): + raise RuntimeError(f"AMD:{dev_id} does not exist ({pluralize('device', len(visible))} available)") + self.dev, self.pci_dev, self.vram_bar, self.count = dev, USBPCIDevice("AM", *visible[dev_id]), 0, len(visible) + self.dev_impl = AMDev(self.pci_dev) + self._compute_props() + + # special regions + self.copy_bufs = [self._dma_region(ctrl_addr=0xf000, sys_addr=0x200000, size=0x80000)] + self.sys_buf, self.sys_next_off = self._dma_region(ctrl_addr=0xa000, sys_addr=0x820000, size=0x1000), 0x200 + self.cq_buf = self._dma_region(ctrl_addr=0xb800, sys_addr=0x822000, size=0x1000) + + def _dma_region(self, ctrl_addr, sys_addr, size): + region = self.dev_impl.mm.map_range(vaddr:=self.dev_impl.mm.alloc_vaddr(size=size), size, [(sys_addr, size)], aspace=AddrSpace.SYS, uncached=True) + return HCQBuffer(vaddr, size, meta=PCIAllocationMeta(region, has_cpu_mapping=False), view=self.pci_dev.dma_view(ctrl_addr, size), owner=self.dev) + + def alloc(self, size:int, host=False, uncached=False, cpu_access=False, contiguous=False, force_devmem=False, **kwargs) -> HCQBuffer: + # usb allocates uncached and cpu_access in vram. vram writes are faster than sram writes + if host and self.sys_next_off + size < self.sys_buf.size: + self.sys_next_off += size + return self.sys_buf.offset(self.sys_next_off - size, size) + + # force devmem + return super().alloc(size, host=False, uncached=uncached, cpu_access=cpu_access, contiguous=contiguous, force_devmem=True, **kwargs) + + def sleep(self, timeout): pass + +def _mock(iface, name=None): return type(name or f"MOCK{iface.__name__}", (iface,), {}) + +class AMDDevice(HCQCompiled): + ifaces = [KFDIface, PCIIface, USBIface, _mock(KFDIface, "MOCKIface"), _mock(KFDIface), _mock(PCIIface), _mock(USBIface)] + + def is_am(self) -> bool: return isinstance(self.iface, (PCIIface, USBIface)) + def is_usb(self) -> bool: return isinstance(self.iface, USBIface) + + def __init__(self, device:str=""): + self.device_id = int(device.split(":")[1]) if ":" in device else 0 + + self.iface = self._select_iface() + + self.target:tuple[int, ...] = ((trgt:=self.iface.props['gfx_target_version']) // 10000, (trgt // 100) % 100, trgt % 100) + self.arch = "gfx%d%x%x" % self.target + assert (self.target in ((9,4,2),(9,5,0))) or self.target[0] in (11, 12), f"Unsupported arch: {self.arch}" + if DEBUG >= 1: print(f"AMDDevice: opening {self.device_id} with target {self.target} arch {self.arch}") + + self.xccs = self.iface.props.get('num_xcc', 1) + self.se_cnt = self.iface.props['array_count'] // self.iface.props['simd_arrays_per_engine'] // self.xccs + self.cu_cnt = self.iface.props['simd_count'] // self.iface.props['simd_per_cu'] // self.xccs + self.waves_per_cu = self.iface.props['max_waves_per_simd'] * self.iface.props['simd_per_cu'] + self.wave_cnt = (self.cu_cnt * self.waves_per_cu) if self.target[0] != 9 else min(self.cu_cnt * 40, self.se_cnt * self.xccs * 512) + + # https://gitlab.freedesktop.org/agd5f/linux/-/blob/a1fc9f584c4aaf8bc1ebfa459fc57a3f26a290d8/drivers/gpu/drm/amd/amdkfd/kfd_queue.c#L391 + sgrp_size_per_cu, hwreg_size_per_cu = 0x4000, 0x1000 + lds_size_per_cu = self.iface.props["lds_size_in_kb"] << 10 if self.target[:2] == (9,5) else 0x10000 + vgpr_size_per_cu = 0x60000 if self.target in {(11,0,0), (11,0,1), (11,5,1), (12,0,0), (12,0,1)} else 0x80000 if self.target[0] == 9 else 0x40000 + wg_data_size = round_up((vgpr_size_per_cu + sgrp_size_per_cu + lds_size_per_cu + hwreg_size_per_cu) * self.cu_cnt, mmap.PAGESIZE) + ctl_stack_size = round_up((12 if self.target[0] != 9 else 8) * self.wave_cnt + 8 + 40, mmap.PAGESIZE) + debug_memory_size = round_up(self.wave_cnt * 32, 64) + + self.ip_off = importlib.import_module(f"tinygrad.runtime.autogen.am.{'vega' if self.target[0] == 9 else 'navi'}_offsets") + self.soc = import_soc(self.target) + self.pm4 = importlib.import_module(f"tinygrad.runtime.autogen.am.pm4_{'soc15' if self.target[0] == 9 else 'nv'}") + self.sdma = import_module('sdma', min(self.iface.ip_versions[am.SDMA0_HWIP], (6, 0, 0))) + self.gc = AMDIP('gc', self.iface.ip_versions[am.GC_HWIP], + bases={i: tuple(getattr(self.ip_off, f'GC_BASE__INST{i}_SEG{s}', 0) for s in range(6)) for i in range(6)}) + + self.nbio = AMDIP('nbio' if self.target[0] < 12 else 'nbif', self.iface.ip_versions[am.NBIF_HWIP], + bases={i: tuple(getattr(self.ip_off, f'NBIO_BASE__INST{i}_SEG{s}', 0) for s in range(9)) for i in range(6)}) + + self.is_aql = getenv("AMD_AQL", int(self.xccs > 1)) + if self.is_aql: + self.pm4_ibs = self.iface.alloc(0x2000 if self.is_usb() else (16 << 20), uncached=True, cpu_access=True) + self.pm4_ib_alloc = BumpAllocator(self.pm4_ibs.size, wrap=True) + + self.compute_queue = self.create_queue(kfd.KFD_IOC_QUEUE_TYPE_COMPUTE_AQL if self.is_aql else kfd.KFD_IOC_QUEUE_TYPE_COMPUTE, + 0x2000 if self.is_usb() else (16 << 20), eop_buffer_size=0x1000, + ctx_save_restore_size=0 if self.is_am() else wg_data_size + ctl_stack_size, ctl_stack_size=ctl_stack_size, debug_memory_size=debug_memory_size) + + self.max_copy_size = 0x40000000 if self.iface.ip_versions[am.SDMA0_HWIP][0] >= 5 else 0x400000 + self.sdma_queues:dict = {} + self.has_sdma_queue = self.sdma_queue(0) is not None + + super().__init__(device, AMDAllocator(self), [HIPRenderer, AMDLLVMRenderer, HIPCCRenderer], AMDProgram, AMDSignal, + functools.partial(AMDComputeAQLQueue if self.is_aql else AMDComputeQueue, self), + functools.partial(AMDCopyQueue, self, max_copy_size=self.max_copy_size) if self.has_sdma_queue else None, + kernargs_size=(8 << 10) if self.is_usb() else (16 << 20), sigalloc_size=0x100 if self.is_usb() else 0x1000, + can_recover=self.is_am(), arch=self.arch) + + # Scratch setup + self.max_private_segment_size = 0 + self._ensure_has_local_memory(128) # set default scratch size to 128 bytes per thread + + self.pmc_enabled:bool = PROFILE > 0 and PMC > 0 + if self.pmc_enabled: + self.iface.require_profile_mode() + + self.pmc_sched:list[PMCSample] = [] + self.pmc_counters = import_pmc(self.target) + + # validate counters: SQ for SIMD busy/instruction counts, LDS stats, GRBM for GPU cycles, L2 cache hits/misses + l2, lds = ("TCC", "SQ") if self.target[0] == 9 else ("GL2C", "SQC") + pmc_default = f"SQ_BUSY_CYCLES,SQ_INSTS_VALU,SQ_INSTS_SALU,{lds}_LDS_IDX_ACTIVE,{lds}_LDS_BANK_CONFLICT,GRBM_GUI_ACTIVE,{l2}_HIT,{l2}_MISS" + for k in (PMC_COUNTERS:=getenv("PMC_COUNTERS", pmc_default).split(",")): + if k not in self.pmc_counters: raise RuntimeError(f"PMC counter {k} is not supported. Available: {','.join(self.pmc_counters.keys())}") + + cast(AMDComputeQueue, unwrap(self.hw_compute_queue_t)()).pmc_start([(k, *self.pmc_counters[k]) for k in PMC_COUNTERS]).submit(self) + self.pmc_buffer = self.allocator.alloc(self.pmc_sched[-1].off + self.pmc_sched[-1].size, BufferSpec(nolru=True, uncached=True)) + self.allocator._copyin(self.pmc_buffer, memoryview(bytearray(self.pmc_buffer.size))) # zero pmc buffers, some counters have only lo part. + + # SQTT is disabled by default because of runtime overhead and big file sizes (~200mb to Tensor.full() two 4096x4096 tensors and matmul them) + self.sqtt_enabled:bool = PROFILE > 0 and SQTT > 0 + if self.sqtt_enabled: + self.iface.require_profile_mode() + + SQTT_BUFFER_SIZE = getenv("SQTT_BUFFER_SIZE", 256) # in mb, per shader engine + self.sqtt_buffers = [self.allocator.alloc(SQTT_BUFFER_SIZE<<20, BufferSpec(nolru=True, uncached=True)) for _ in range(self.se_cnt * self.xccs)] + self.sqtt_wptrs = self.allocator.alloc(round_up(self.se_cnt * self.xccs * 4, 0x1000), BufferSpec(cpu_access=True, nolru=True)) + self.sqtt_next_cmd_id = itertools.count(0) + + def create_queue(self, queue_type, ring_size, ctx_save_restore_size=0, eop_buffer_size=0, ctl_stack_size=0, debug_memory_size=0, idx=0): + ring = self.iface.alloc(ring_size, uncached=True, cpu_access=True) + gart = self.iface.alloc(0x100, uncached=True, cpu_access=True) + + if queue_type == kfd.KFD_IOC_QUEUE_TYPE_COMPUTE_AQL: + self.aql_gart = gart + self.aql_desc = hsa.amd_queue_t(queue_properties=hsa.AMD_QUEUE_PROPERTIES_IS_PTR64 | hsa.AMD_QUEUE_PROPERTIES_ENABLE_PROFILING, + read_dispatch_id_field_base_byte_offset=getattr(hsa.amd_queue_t, 'read_dispatch_id').offset, + max_cu_id=(self.cu_cnt * self.xccs) - 1, max_wave_id=self.waves_per_cu - 1) + self.aql_gart.cpu_view().view(fmt='B')[:ctypes.sizeof(self.aql_desc)] = bytes(self.aql_desc) + + cwsr_buffer_size = round_up((ctx_save_restore_size + debug_memory_size) * self.xccs, mmap.PAGESIZE) + cwsr_buffer = self.iface.alloc(cwsr_buffer_size) if ctx_save_restore_size else None + eop_buffer = self.iface.alloc(eop_buffer_size) if eop_buffer_size else None + + return (self.iface.create_queue(queue_type, ring, gart, rptr=getattr(hsa.amd_queue_t, 'read_dispatch_id').offset, + wptr=getattr(hsa.amd_queue_t, 'write_dispatch_id').offset, eop_buffer=eop_buffer, cwsr_buffer=cwsr_buffer, + ctx_save_restore_size=ctx_save_restore_size, ctl_stack_size=ctl_stack_size, idx=idx)) + + def sdma_queue(self, idx:int): + if getenv("AMD_DISABLE_SDMA"): return None + if idx in self.sdma_queues: return self.sdma_queues[idx] + with contextlib.suppress(OSError): + self.sdma_queues[idx] = self.create_queue(kfd.KFD_IOC_QUEUE_TYPE_SDMA, 0x200 if self.is_usb() else (16 << 20), idx=idx) + return self.sdma_queues.get(idx, None) + + def _ensure_has_local_memory(self, private_segment_size): + if self.max_private_segment_size >= private_segment_size: return + + lanes_per_wave = 64 # wave64 + mem_alignment_size = 256 if self.target[0] != 9 else 1024 + size_per_thread = round_up(private_segment_size, mem_alignment_size // lanes_per_wave) + size_per_xcc = size_per_thread * lanes_per_wave * self.iface.props['max_slots_scratch_cu'] * self.cu_cnt + self.scratch, ok = self._realloc(getattr(self, 'scratch', None), size_per_xcc * self.xccs) + if ok: + # NOTE: xcc logic is correct only for GFX9. + max_scratch_waves = self.cu_cnt * self.iface.props['max_slots_scratch_cu'] * self.xccs + wave_scratch = ceildiv(lanes_per_wave * size_per_thread, mem_alignment_size) + num_waves = (size_per_xcc // (wave_scratch * mem_alignment_size)) // (self.se_cnt if self.target[0] != 9 else 1) + + tmpring_t = getattr(hsa, f'union_COMPUTE_TMPRING_SIZE{"_GFX"+str(self.target[0]) if self.target[0] != 9 else ""}_bitfields') + self.tmpring_size = int.from_bytes(tmpring_t(WAVES=min(num_waves, max_scratch_waves), WAVESIZE=wave_scratch), 'little') + self.max_private_segment_size = private_segment_size + + if hasattr(self, 'aql_desc'): + gfx9_rsrc = {'NUM_FORMAT':hsa.BUF_NUM_FORMAT_UINT, 'DATA_FORMAT':hsa.BUF_DATA_FORMAT_32, 'ELEMENT_SIZE':1, 'INDEX_STRIDE':3} + rsrc = {'DST_SEL_X':hsa.SQ_SEL_X, 'DST_SEL_Y':hsa.SQ_SEL_Y, 'DST_SEL_Z':hsa.SQ_SEL_Z, 'DST_SEL_W':hsa.SQ_SEL_W, 'ADD_TID_ENABLE':1, + 'TYPE':hsa.SQ_RSRC_BUF, **(gfx9_rsrc if self.target[0] == 9 else {'FORMAT':hsa.BUF_FORMAT_32_UINT, 'OOB_SELECT':2})} + rsrc1_t = getattr(hsa, f'union_SQ_BUF_RSRC_WORD1{"_GFX11" if self.target[0] != 9 else ""}_bitfields') + rsrc3_t = getattr(hsa, f'union_SQ_BUF_RSRC_WORD3{"_GFX"+str(self.target[0]) if self.target[0] != 9 else ""}_bitfields') + + self.aql_desc.scratch_backing_memory_location = int(self.scratch.va_addr) + self.aql_desc.scratch_wave64_lane_byte_size = self.max_private_segment_size * lanes_per_wave // 64 + self.aql_desc.scratch_resource_descriptor[:] = [lo32(self.scratch.va_addr), + int.from_bytes(rsrc1_t(BASE_ADDRESS_HI=hi32(self.scratch.va_addr), SWIZZLE_ENABLE=1), 'little'), + lo32(size_per_xcc), int.from_bytes(bytes(rsrc3_t(**rsrc)), 'little')] + self.aql_desc.compute_tmpring_size = self.tmpring_size + self.aql_gart.cpu_view()[:ctypes.sizeof(self.aql_desc)] = bytes(self.aql_desc) + + def invalidate_caches(self): + unwrap(self.hw_compute_queue_t)().memory_barrier().signal(self.timeline_signal, self.next_timeline()).submit(self) + self.synchronize() + + def synchronize(self, timeout:int|None=None): + super().synchronize(timeout) + if self.is_am() and not self.is_usb() and self.error_state is None: self.iface._collect_interrupts(reset=False, drain_only=True) + + def on_device_hang(self): self.iface.on_device_hang() + + def device_props(self): return self.iface.props + + def hw_copy_queues(self): return [(f"SDMA:{i}", functools.partial(unwrap(self.hw_copy_queue_t), queue_idx=i)) for i in self.sdma_queues] + +if getenv("HCQ2"): from extra.hcq2.ops_amd2 import * # noqa: F401, F403 # pylint: disable=unused-import diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_cl.py b/artifacts/package_runtime/tinygrad/runtime/ops_cl.py new file mode 100644 index 000000000..5087996e3 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_cl.py @@ -0,0 +1,130 @@ +from __future__ import annotations +from typing import cast +import ctypes, hashlib +from tinygrad.runtime.autogen import opencl as cl +from tinygrad.runtime.support import c +from tinygrad.helpers import to_char_p_p, from_mv, OSX, DEBUG, mv_address, suppress_finalizing, unwrap, round_up, is_image_shape +from tinygrad.renderer.cstyle import OpenCLRenderer +from tinygrad.device import BufferSpec, LRUAllocator, Compiled, Compiler, CompileError, TinyELF, Program + +CC_CB = c.CFUNCTYPE[None, [c.POINTER[ctypes.c_char], c.POINTER[None], cl.size_t, c.POINTER[None]]] +BP_CB = c.CFUNCTYPE[None, [cl.cl_program, c.POINTER[None]]] + +# see test/external/external_osx_profiling.py to determine this ratio. it's in like GPU clocks or something +OSX_TIMING_RATIO = (125/3) if OSX else 1.0 + +cl_errors = {attr: k for k in dir(cl) if k.startswith("CL_") and isinstance(attr:=getattr(cl, k), int) and attr <= 0} +def check(status): + if status != 0: raise RuntimeError(f"OpenCL Error {status}: {cl_errors.get(status, 'Unknown error')}") +def checked(ret, status): return (check(status.value), ret)[1] + +class CLCompiler(Compiler): + def __init__(self, dev:CLDevice, compile_key:str): + self.dev = dev + super().__init__(f"compile_cl_{compile_key}") + def compile(self, src:str) -> bytes: + program = checked(cl.clCreateProgramWithSource(self.dev.context, 1, to_char_p_p([src.encode()]), None, status := ctypes.c_int32()), status) + build_status: int = cl.clBuildProgram(program, 1, self.dev.device_id, None, BP_CB(), None) + if build_status != 0: + cl.clGetProgramBuildInfo(program, self.dev.device_id, cl.CL_PROGRAM_BUILD_LOG, 0, None, log_size := ctypes.c_size_t()) + cl.clGetProgramBuildInfo(program, self.dev.device_id, cl.CL_PROGRAM_BUILD_LOG, + log_size.value, mstr := ctypes.create_string_buffer(log_size.value), None) + raise CompileError(f"OpenCL Compile Error\n\n{mstr.value.decode()}") + check(cl.clGetProgramInfo(program, cl.CL_PROGRAM_BINARY_SIZES, ctypes.sizeof(ctypes.c_size_t), binary_sizes := (ctypes.c_size_t * 1)(), None)) + check(cl.clGetProgramInfo(program, cl.CL_PROGRAM_BINARIES, ctypes.sizeof(ctypes.c_void_p), + (ctypes.c_void_p * 1)(ctypes.addressof(binary := ctypes.create_string_buffer(binary_sizes[0]))), None)) + check(cl.clReleaseProgram(program)) + return bytes(binary) + +class CLProgram(Program['CLDevice']): + def __init__(self, device:CLDevice, obj:TinyELF): + self.dev, self.lib, self.signature = device, device.cl_compiler.compile_cached(obj.lib.decode()), obj.signature + self.program = checked(cl.clCreateProgramWithBinary(device.context, 1, device.device_id, (ctypes.c_size_t * 1)(len(self.lib)), + to_char_p_p([self.lib], ctypes.c_ubyte), binary_status := ctypes.c_int32(), + errcode_ret := ctypes.c_int32()), errcode_ret) + check(binary_status.value) + check(cl.clBuildProgram(self.program, 1, device.device_id, None, BP_CB(), None)) # NOTE: OSX requires this + self.kernel = checked(cl.clCreateKernel(self.program, obj.name.encode(), status := ctypes.c_int32()), status) + + def __del__(self): + try: check(cl.clReleaseKernel(self.kernel)) + except (TypeError, AttributeError): pass + try: check(cl.clReleaseProgram(self.program)) + except (TypeError, AttributeError): pass + + def __call__(self, *bufs:cl.cl_mem, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]|None=None, vals:tuple[int, ...]=(), + wait=False, **kw) -> float|None: + for i, (_, slot, dt, shape) in enumerate(self.signature): + b = bufs[slot] if slot < len(bufs) else getattr(ctypes, f"c_int{dt.bitsize}")(vals[slot-len(bufs)]) + if is_image_shape(shape): + pitch = (round_up(shape[1], 256) if OSX else shape[1]) * 4 * dt.itemsize + fmt = cl.cl_image_format(cl.CL_RGBA, {2:cl.CL_HALF_FLOAT, 4:cl.CL_FLOAT}[dt.itemsize]) + desc = cl.cl_image_desc(cl.CL_MEM_OBJECT_IMAGE2D, shape[1], shape[0], image_row_pitch=pitch, buffer=b) + img = checked(cl.clCreateImage(self.dev.context, cl.CL_MEM_READ_WRITE, fmt, desc, None, status:=ctypes.c_int32()), status) + check(cl.clSetKernelArg(self.kernel, i, ctypes.sizeof(img), ctypes.byref(img))) + else: check(cl.clSetKernelArg(self.kernel, i, ctypes.sizeof(b), ctypes.byref(b))) + if local_size is not None: global_size = cast(tuple[int,int,int], tuple(int(g*l) for g,l in zip(global_size, local_size))) + event = cl.cl_event() if wait else None + check(cl.clEnqueueNDRangeKernel(self.dev.queue, self.kernel, len(global_size), None, (ctypes.c_size_t * len(global_size))(*global_size), + (ctypes.c_size_t * len(local_size))(*local_size) if local_size else None, 0, None, event)) + if wait: + assert event is not None + check(cl.clWaitForEvents(1, event)) + check(cl.clGetEventProfilingInfo(event, cl.CL_PROFILING_COMMAND_START, 8, ctypes.byref(start := ctypes.c_uint64()), None)) + check(cl.clGetEventProfilingInfo(event, cl.CL_PROFILING_COMMAND_END, 8, ctypes.byref(end := ctypes.c_uint64()), None)) + return float(end.value-start.value) * OSX_TIMING_RATIO * 1e-9 + return None + +class CLAllocator(LRUAllocator['CLDevice']): + def _alloc(self, size:int, options:BufferSpec) -> cl.cl_mem: + return checked(cl.clCreateBuffer(self.dev.context, cl.CL_MEM_READ_WRITE, size, None, status := ctypes.c_int32()), status) + @suppress_finalizing + def _free(self, opaque:cl.cl_mem, options:BufferSpec): check(cl.clReleaseMemObject(opaque)) + def _copyin(self, dest:cl.cl_mem, src:memoryview): + if mv_address(src) % 16: src = memoryview(bytearray(src)) + check(cl.clEnqueueWriteBuffer(self.dev.queue, dest, False, 0, len(src)*src.itemsize, from_mv(src), 0, None, None)) + self.dev.pending_copyin.append(src) # NOTE: these can't be freed until the GPU actually executes this command + def _copyout(self, dest:memoryview, src:cl.cl_mem): + check(cl.clEnqueueReadBuffer(self.dev.queue, src, False, 0, len(dest)*dest.itemsize, from_mv(dest), 0, None, None)) + self.dev.synchronize() + +class CLDevice(Compiled): + device_ids = None # this is global and only initted once + def __init__(self, device:str=""): + if CLDevice.device_ids is None: + check(cl.clGetPlatformIDs(0, None, num_platforms := ctypes.c_uint32())) + check(cl.clGetPlatformIDs(num_platforms.value, platform_ids := (cl.cl_platform_id * num_platforms.value)(), None)) + for device_type in [cl.CL_DEVICE_TYPE_GPU, cl.CL_DEVICE_TYPE_DEFAULT]: + err = cl.clGetDeviceIDs(platform_ids[0], device_type, 0, None, num_devices := ctypes.c_uint32()) + if err == 0 and num_devices.value != 0: break + if DEBUG >= 1: print(f"CLDevice: got {num_platforms.value} platforms and {num_devices.value} devices") + CLDevice.device_ids = c.init_c_var((cl.cl_device_id * num_devices.value), + lambda x: check(cl.clGetDeviceIDs(platform_ids[0], device_type, num_devices, x, None))) + + self.device_id = CLDevice.device_ids[0 if ":" not in device else int(device.split(":")[1])] + self.device_name = (cl.clGetDeviceInfo(self.device_id, cl.CL_DEVICE_NAME, 256, + buf:=ctypes.create_string_buffer(256), None), buf.value.decode())[1] + self.driver_version = (cl.clGetDeviceInfo(self.device_id, cl.CL_DRIVER_VERSION, 256, + buf:=ctypes.create_string_buffer(256), None), buf.value.decode())[1] + if DEBUG >= 1: print(f"CLDevice: opening {self.device_name} with version {self.driver_version}") + self.context = checked(cl.clCreateContext(None, 1, self.device_id, CC_CB(), None, status := ctypes.c_int32()), status) + self.queue = checked(cl.clCreateCommandQueue(self.context, self.device_id, cl.CL_QUEUE_PROFILING_ENABLE, status), status) + self.pending_copyin: list[memoryview] = [] + check(cl.clGetDeviceInfo(self.device_id, cl.CL_DEVICE_EXTENSIONS, 0, None, ctypes.byref(exts_len:=ctypes.c_size_t()))) + self.device_exts = (cl.clGetDeviceInfo(self.device_id, cl.CL_DEVICE_EXTENSIONS, exts_len.value, + ctypes.byref(buf := ctypes.create_string_buffer(exts_len.value)), None), + ctypes.string_at(buf).decode().split())[1] + + self.cl_compiler = CLCompiler(self, f"{hashlib.md5(self.device_name.encode() + self.driver_version.encode()).hexdigest()}") + + arch = ",".join(self.device_exts) + if "cl_khr_image2d_from_buffer" in self.device_exts: + check(cl.clGetDeviceInfo(self.device_id, cl.CL_DEVICE_IMAGE_PITCH_ALIGNMENT, 4, ctypes.byref(ipa := ctypes.c_uint32()), None)) + arch += f",IMAGE_PITCH_ALIGNMENT={ipa.value}" + super().__init__(device, CLAllocator(self), [OpenCLRenderer], CLProgram, arch=arch) + + def count(self) -> int: return len(unwrap(self.device_ids)) + + def synchronize(self): + check(cl.clFinish(self.queue)) + self.pending_copyin.clear() diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_cpu.py b/artifacts/package_runtime/tinygrad/runtime/ops_cpu.py new file mode 100644 index 000000000..09a77e6a4 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_cpu.py @@ -0,0 +1,221 @@ +from __future__ import annotations +import platform, sys, os, ctypes, functools, mmap, threading, array, itertools +from dataclasses import replace +from typing import cast +from tinygrad.helpers import to_mv, OSX, WIN, Context, mv_address, suppress_finalizing, unwrap, data64_le, partition +from tinygrad.device import Buffer, BufferSpec, TinyELF +from tinygrad.runtime.support.hcq import HCQCompiled, HCQAllocator, HCQBuffer, HWQueue, HCQArgsState, HCQSignal, HCQProgram, MMIOInterface +from tinygrad.runtime.support.hcq import CLikeArgsState +from tinygrad.renderer.cstyle import ClangRenderer +from tinygrad.renderer.llvmir import CPULLVMRenderer +from tinygrad.renderer.nir import LVPRenderer +from tinygrad.renderer.isa.x86 import X86Renderer +from tinygrad.runtime.support.elf import jit_loader +from tinygrad.runtime.autogen import libc +from tinygrad.codegen import do_to_program +from tinygrad import UOp, dtypes +from tinygrad.dtype import AddrSpace +from tinygrad.uop.ops import sint, KernelInfo, Ops, UPat, PatternMatcher, graph_rewrite + +MAX_ARGS, CMD_SIZE, RING_SLOTS = 63, 64, (16 << 10) + +def signal_prog(): + val = UOp.param(1, dtypes.int, (), vmin_vmax=(0, dtypes.int.max), name="value", addrspace=AddrSpace.ALU) + return UOp.param(0, dtypes.uint32, (1,))[0].store(val.cast(dtypes.uint32)) + +def wait_prog(): + val = UOp.param(1, dtypes.int, (), vmin_vmax=(0, dtypes.int.max), name="value", addrspace=AddrSpace.ALU) + return (v:=UOp.param(0, dtypes.uint32, (1,), volatile=True).after(l:=UOp.loop(0))[0].load()).end(l, v < val.cast(dtypes.uint32)) + +def timestamp_prog(): + if WIN: val = UOp.const(0, dtypes.uint64) + else: + fn, ts = UOp.param(1, dtypes.uint64, (1,)), UOp.placeholder((2,), dtypes.uint64, slot=0, addrspace=AddrSpace.REG) + call = fn[0].load().call(UOp.const(6 if OSX else 1, dtypes.int), ts[0], ret_dtype=dtypes.void) # clock_gettime(CLOCK_MONOTONIC, &ts) + val = ts.after(call)[0].load() * 1_000_000_000 + ts.after(call)[1].load() + return UOp.param(0, dtypes.uint64, (1,))[0].store(val) + +def quit_prog(): + fn = UOp.param(0, dtypes.uint64, (1 if WIN else 3,)) + if WIN: return fn[0].load().call(UOp.const(0, dtypes.uint64), ret_dtype=dtypes.void) # ExitThread(0) + sem = UOp.param(1, dtypes.uint64, (1,)) + + close = fn[2].load().call(sem[0], ret_dtype=dtypes.void) # sem_close(sem) + return fn.after(close)[0].load().call(UOp.const(0, dtypes.uint64), ret_dtype=dtypes.void) # pthread_exit(0) + +def worker_prog(): + ring = UOp.param(0, dtypes.uint64, (RING_SLOTS * CMD_SIZE,), volatile=True) + wait, sem = UOp.param(1, dtypes.uint64, (1,), volatile=True), UOp.param(2, dtypes.uint64, (1,)) + cur = UOp.range(2**64-1, 0, dtype=dtypes.uint64) + + # spin on windows, sem_wait to sleep on posix + if WIN: ready = (v:=wait.after(lw:=UOp.loop(1), cur)[0].load()).end(lw, v <= cur) + else: ready = wait.after(cur)[0].load().call(sem.after(cur)[0], ret_dtype=dtypes.void) + + entry = [ring.after(ready).index((cur % RING_SLOTS) * CMD_SIZE + i).load() for i in range(CMD_SIZE)] + return entry[0].call(*entry[1:], ret_dtype=dtypes.void).end(cur) + +def host_wait(ctx, dst:UOp, val:UOp) -> UOp: + return (cur:=dst.after(loop:=UOp.loop(next(ctx))).index(UOp.const(0, dtypes.int)).load()).end(loop, cur < val) + +pm_host_opsel = PatternMatcher([(UPat(Ops.INS, arg="wait", src=(UPat(name="dst"), UPat(name="val"))), host_wait)]) + +def encode_host_queue(q:UOp) -> UOp: + # TODO: subset of hcq2 for now + spins, (store,) = partition(graph_rewrite(q, pm_host_opsel, ctx=itertools.count(), walk=True, name="host opsel").src, lambda u: u.op is Ops.END) + assert store.op is Ops.INS and store.arg == "store", f"host queue cannot encode {store.op} {store.arg}" + return store.src[0].after(*spins).index(UOp.const(0, dtypes.int)).store(store.src[1]) + +class CPUComputeQueue(HWQueue): + def __init__(self, dev): + super().__init__() + self.dev = dev + def _cmd(self, prog, args=(), vals=()): return self.exec(prg:=self.dev.prgs[prog], prg.fill_kernargs(args, vals), None, None) + def memory_barrier(self): return self + def exec(self, prg:CPUProgram, args_state:HCQArgsState, global_size, local_size): + if (lvp:=isinstance(args_state, LVPArgsState)): self.bind_args_state(args_state) + args:list[sint|None] = [args_state.buf.va_addr] if lvp else [*[x.va_addr for x in args_state.bufs], *args_state.vals] + assert len(args) <= MAX_ARGS, f"CPU programs support at most {MAX_ARGS} arguments, got {len(args)}" + for tid in range(1 if lvp else (global_size or (1,))[0]): + if not lvp and 'core_id' in prg.runtimevars: args[prg.runtimevars['core_id']] = tid + self.q(prg, *[unwrap(x) for x in args], *([0] * (MAX_ARGS - len(args)))) + return self + def wait(self, signal, value=0): return self._cmd(wait_prog, (signal.base_buf,), (value,)) + def timestamp(self, signal): return self._cmd(timestamp_prog, (signal.base_buf.offset(8, 8), self.dev.func_table._buf.offset(0, 8))) + def signal(self, signal, value:sint=0): return self._cmd(signal_prog, (signal.base_buf,), (value,)) + def _submit(self, dev): + dev.ensure_worker() + ring_view = dev.ring.as_memoryview(force_zero_copy=True, no_sync=True).cast('Q') + for off in range(0, len(self._q), CMD_SIZE): + entry = [self._q[off].addr, *self._q[off+1:off+CMD_SIZE]] + ring_view[(base:=(dev.ring_pos % RING_SLOTS) * CMD_SIZE):base+CMD_SIZE] = array.array('Q', (int(x) & ((1<<64)-1) for x in entry)) + dev.ring_pos += 1 + if WIN: dev.sys.as_memoryview(force_zero_copy=True, no_sync=True).cast('Q')[0] = dev.ring_pos + else: assert libc.sem_post(dev.sem) == 0 + +class LVPArgsState(CLikeArgsState): + def __init__(self, buf, prg, bufs, vals=()): super().__init__(buf, prg, bufs, vals, [*data64_le(buf.va_addr + 12), (len(bufs) + len(vals)) * 2]) + +# NOTE: MAP_JIT is added to mmap module in python 3.13 +MAP_JIT = 0x0800 + +class CPUProgram(HCQProgram['CPUDevice']): + rt_lib = None + try: rt_lib = ctypes.CDLL(ctypes.util.find_library('System' if OSX else 'kernel32') if OSX or WIN else 'libgcc_s.so.1') + except OSError: pass + + def __init__(self, dev:CPUDevice, obj:TinyELF): + self.signature, self.runtimevars = obj.signature, {name:slot for name,slot,*_ in obj.signature if name == 'core_id'} + + LVP = obj.target.renderer == "LVP" + if sys.platform == "win32": # mypy doesn't understand when WIN is used here + PAGE_EXECUTE_READWRITE, MEM_COMMIT, MEM_RESERVE = 0x40, 0x1000, 0x2000 + ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_void_p + self.addr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_void_p(0), ctypes.c_size_t(len(obj.lib)), MEM_COMMIT | MEM_RESERVE, + PAGE_EXECUTE_READWRITE) + ctypes.memmove(self.addr, obj.lib, len(obj.lib)) + ctypes.windll.kernel32.GetCurrentProcess.restype = ctypes.c_void_p + proc = ctypes.windll.kernel32.GetCurrentProcess() + ctypes.windll.kernel32.FlushInstructionCache(ctypes.c_void_p(proc), ctypes.c_void_p(self.addr), ctypes.c_size_t(len(obj.lib))) + self.fxn = ctypes.CFUNCTYPE(None)(self.addr) + else: + # On apple silicon with SPRR enabled (it always is in macos) RWX pages are unrepresentable: https://blog.svenpeter.dev/posts/m1_sprr_gxf/ + # MAP_JIT allows us to easily flip pages from RW- to R-X and vice versa. It is a noop on intel cpus. (man pthread_jit_write_protect_np) + self.mem = mmap.mmap(-1, len(obj.lib), mmap.MAP_ANON|mmap.MAP_PRIVATE|(MAP_JIT if OSX else 0), mmap.PROT_READ|mmap.PROT_WRITE|mmap.PROT_EXEC) + self.addr = mv_address(self.mem) + + if OSX: unwrap(CPUProgram.rt_lib).pthread_jit_write_protect_np(False) + lib = jit_loader(obj.lib, base=ctypes.addressof(ctypes.c_void_p.from_buffer(self.mem)), link_libs=['m']) if LVP else obj.lib + self.mem.write(lib) + if OSX: unwrap(CPUProgram.rt_lib).pthread_jit_write_protect_np(True) + + # __clear_cache isn't a normal libc function, but a compiler support routine found in libgcc_s for gcc and compiler-rt for clang. + # libgcc_s comes as shared library but compiler-rt is only a bunch of static library archives which we can't directly load, but fortunately + # it somehow found its way into libSystem on macos (likely because it used __builtin_clear_cache) and libgcc_s is ~always present on linux + # Using ["name"] instead of .name because otherwise name is getting mangled: https://docs.python.org/3.12/reference/expressions.html#index-5 + if CPUProgram.rt_lib is not None: CPUProgram.rt_lib["__clear_cache"](ctypes.c_void_p(self.addr), ctypes.c_void_p(self.addr + len(lib))) + else: + # msync should be a universal POSIX way to do this + libc.msync(ctypes.c_void_p(self.addr), len(lib), libc.MS_SYNC | libc.MS_INVALIDATE) + + self.fxn = ctypes.CFUNCTYPE(None)(self.addr) + + super().__init__(LVPArgsState if LVP else HCQArgsState, dev, obj, kernargs_alloc_size=12+256 if LVP else 0) + + @suppress_finalizing + def __del__(self): + if sys.platform == 'win32': ctypes.windll.kernel32.VirtualFree(ctypes.c_void_p(self.addr), ctypes.c_size_t(0), 0x8000) #0x8000 - MEM_RELEASE + +class CPUAllocator(HCQAllocator): + def __init__(self, dev:CPUDevice): super().__init__(dev, supports_copy_from_disk=False, supports_transfer=False) + def _alloc(self, size:int, options:BufferSpec) -> HCQBuffer: + if options.external_ptr is not None: addr, buf = options.external_ptr, None + elif WIN: addr = mv_address(buf:=mmap.mmap(-1, size, access=mmap.ACCESS_WRITE)) + else: addr = mv_address(buf:=mmap.mmap(-1, size, mmap.MAP_ANON | mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE)) + return HCQBuffer(va:=addr, sz:=size, meta=buf, view=MMIOInterface(va, sz, fmt='B'), owner=self.dev) + def _as_buffer(self, src) -> memoryview: return to_mv(src.va_addr, src.size) + def _do_map(self, buf:HCQBuffer): + if buf.view is None or not isinstance(buf.view, MMIOInterface): raise RuntimeError("Cannot map buffer without view to cpu") + return HCQBuffer(buf.view.addr, buf.size, view=buf.view, owner=buf.owner) + def _unmap(self, mb): pass # CPU _do_map returns a view wrapper, nothing to release + +class CPUDevice(HCQCompiled): + pm_lower = PatternMatcher([ + (UPat(Ops.CUSTOM_FUNCTION, arg="submit_cmdbuf", src=(UPat(Ops.LINEAR, name="q"),)), encode_host_queue)]) + + pm_bufferize = PatternMatcher([ + (UPat(Ops.PARAM, tag="sentinel_signal"), lambda ctx: ctx[0].signal("sentinel", (1 << 64) - 1)), + (UPat(Ops.PARAM, tag="timeline_signal"), lambda ctx: ctx[0].signal("timeline")), + (UPat(Ops.PARAM, tag="timeline_value"), lambda ctx: ctx[0].signal("value", 1)), + (UPat(Ops.PARAM, tag="signal", name="b"), lambda ctx, b: ctx[0].signal(b.arg.slot)), + ]) + + @functools.cache + def signal(self, name:str|int, init_value:int=0) -> Buffer: + (buf:=Buffer(self.device, 1, dtypes.uint64, preallocate=True)).as_memoryview(force_zero_copy=True, no_sync=True).cast('Q')[0] = init_value + return buf + + def __init__(self, device:str=""): + super().__init__(device, CPUAllocator(self), [ClangRenderer, CPULLVMRenderer, LVPRenderer, X86Renderer], CPUProgram, HCQSignal, + functools.partial(CPUComputeQueue, self), arch={'amd64':'x86_64', 'aarch64':'arm64'}.get(m:=platform.machine().lower(), m)+",native") + + self.ring_pos = 0 + + # posix uses sem to put cpus into sleep + self.sem_addr = 0 + if not WIN: + self.sem = libc.sem_open(sem_name:=f"/tinygrad-{os.getpid()}-{id(self):x}".encode(), os.O_CREAT|os.O_EXCL, 0o600, 0) # type: ignore[call-arg] + self.sem_addr = unwrap(ctypes.cast(self.sem, ctypes.c_void_p).value) + if self.sem_addr == ctypes.c_void_p(-1).value or libc.sem_unlink(sem_name): raise OSError(ctypes.get_errno(), "semaphore") + + # TODO: move to hcq2 + with Context(EMULATED_DTYPES="", TRACK_MATCH_STATS=0): + prgs = {f: f().sink(arg=KernelInfo(f.__name__), tag=1) for f in (signal_prog, wait_prog, timestamp_prog, quit_prog, worker_prog)} + self.prgs = {f: self.runtime(do_to_program(v, ClangRenderer(replace(self.renderer.target, renderer="CLANG"))).to_elf()) for f,v in prgs.items()} + + @functools.cached_property + def ring(self) -> Buffer: return Buffer(self.device, RING_SLOTS * CMD_SIZE, dtypes.uint64, preallocate=True) + @functools.cached_property + def sys(self) -> Buffer: return Buffer(self.device, 1, dtypes.uint64, preallocate=True) + @functools.cached_property + def sem_buf(self) -> Buffer: return Buffer(self.device, 1, dtypes.uint8, options=BufferSpec(external_ptr=self.sem_addr), preallocate=True) + + # TODO: move to hcq2 infra + @functools.cached_property + def func_table(self) -> Buffer: + fns = ([0, ctypes.windll.kernel32.ExitThread, 0, 0] if WIN else # type: ignore[attr-defined] + [libc.dll.clock_gettime, libc.dll.pthread_exit, libc.dll.sem_wait, libc.dll.sem_close]) + addrs = array.array('Q', [unwrap(ctypes.cast(f, ctypes.c_void_p).value) if f else 0 for f in fns]) + (ft:=Buffer(self.device, len(fns), dtypes.uint64, preallocate=True)).as_memoryview(force_zero_copy=True, no_sync=True).cast('Q')[:] = addrs + return ft + + @functools.cache + def ensure_worker(self): + threading.Thread(target=cast(CPUProgram, self.prgs[worker_prog]).fxn, daemon=True, args=[ctypes.c_uint64(x) for x in + [self.ring._buf.va_addr, self.sys._buf.va_addr if WIN else self.func_table._buf.va_addr+16, self.sem_addr]]).start() + + def finalize(self): + if self.ring_pos == 0: return # the worker starts with the first submit + ft = self.func_table._buf + CPUComputeQueue(self)._cmd(quit_prog, (ft.offset(8, 8),) if WIN else (ft.offset(8, 24), self.sem_buf._buf)).submit(self) + self.ring_pos = 0 diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_cuda.py b/artifacts/package_runtime/tinygrad/runtime/ops_cuda.py new file mode 100644 index 000000000..eed8996b3 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_cuda.py @@ -0,0 +1,134 @@ +from __future__ import annotations +import ctypes +from tinygrad.helpers import DEBUG, DEV, getenv, mv_address, suppress_finalizing +from tinygrad.device import Compiled, BufferSpec, LRUAllocator, Program, TinyELF +from tinygrad.renderer.cstyle import CUDARenderer, NVCCRenderer +from tinygrad.renderer.ptx import PTXRenderer +from tinygrad.runtime.autogen import cuda +from tinygrad.runtime.support.compiler_cuda import pretty_ptx +from tinygrad.runtime.support.c import init_c_struct_t, init_c_var +if getenv("IOCTL"): import extra.nv_gpu_driver.nv_ioctl # noqa: F401 # pylint: disable=unused-import +if (MOCKGPU:=DEV.target("CUDA").interface == "MOCK"): from test.mockgpu.cuda import cuda # type: ignore # pylint: disable=reimported + +def check(status): + if status != 0: + error = ctypes.string_at(init_c_var(ctypes.POINTER(ctypes.c_char), lambda x: cuda.cuGetErrorString(status, ctypes.byref(x)))).decode() + raise RuntimeError(f"CUDA Error {status}, {error}") + +def encode_args(args, vals, signature) -> tuple[ctypes.Structure, ctypes.Array]: + fields = ([(f'f{i}', cuda.CUdeviceptr_v2, i*8) for i in range(len(args))] + + [(f'v{i}', getattr(ctypes, f"c_int{dt.bitsize}"), off) for i,(off,dt) in enumerate(TinyELF.iter_sig(signature[len(args):], len(args)*8))]) + c_args = init_c_struct_t(fields[-1][2] + ctypes.sizeof(fields[-1][1]) if len(fields) else 0, tuple(fields))(*args, *vals) + vargs = (ctypes.c_void_p * 5)(ctypes.c_void_p(1), ctypes.cast(ctypes.byref(c_args), ctypes.c_void_p), ctypes.c_void_p(2), + ctypes.cast(ctypes.pointer(ctypes.c_size_t(ctypes.sizeof(c_args))), ctypes.c_void_p), ctypes.c_void_p(0)) + return c_args, vargs + +def cu_time_execution(cb, enable=False) -> float|None: + if not enable: return cb() + evs = [init_c_var(cuda.CUevent, lambda x: cuda.cuEventCreate(ctypes.byref(x), 0)) for _ in range(2)] + cuda.cuEventRecord(evs[0], None) + cb() + cuda.cuEventRecord(evs[1], None) + check(cuda.cuEventSynchronize(evs[1])) + cuda.cuEventElapsedTime(ctypes.byref(ret := ctypes.c_float()), evs[0], evs[1]) + for ev in evs: cuda.cuEventDestroy_v2(ev) + return ret.value * 1e-3 + +class CUDAProgram(Program['CUDADevice']): + def __init__(self, dev:CUDADevice, obj:TinyELF, smem:int=0): + self.dev, self.name, self.lib, self.signature, self.smem = dev, obj.name, obj.lib, obj.signature, smem + if DEBUG >= 5: print("\n".join([f"{i+1:>3} {line}" for i, line in enumerate(pretty_ptx(obj.lib.decode('utf-8')).split("\n"))])) + + check(cuda.cuCtxSetCurrent(self.dev.context)) + self.module = cuda.CUmodule() + status = cuda.cuModuleLoadData(ctypes.byref(self.module), obj.lib) + if status != 0: + del self.module + raise RuntimeError(f"module load failed with status code {status}: {cuda.enum_cudaError_enum.get(status)}") + check(cuda.cuModuleGetFunction(ctypes.byref(prg := cuda.CUfunction()), self.module, obj.name.encode("utf-8"))) + self.prg = prg + if self.smem > 0: check(cuda.cuFuncSetAttribute(self.prg, cuda.CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES, self.smem)) + + @suppress_finalizing + def __del__(self): check(cuda.cuModuleUnload(self.module)) + + def __call__(self, *args, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), vals:tuple[int, ...]=(), wait=False, **kw): + check(cuda.cuCtxSetCurrent(self.dev.context)) + if not hasattr(self, "vargs"): + self.c_args, self.vargs = encode_args(args, vals, self.signature) + + # HACK: For MOCKGPU send the args struct itself. + if MOCKGPU: self.vargs = self.c_args # type: ignore[assignment] + else: + for i in range(len(args)): self.c_args.__setattr__(f'f{i}', args[i]) + for i in range(len(vals)): self.c_args.__setattr__(f'v{i}', vals[i]) + return cu_time_execution(lambda: check(cuda.cuLaunchKernel(self.prg, *global_size, *local_size, self.smem, None, None, self.vargs)), enable=wait) + +class CUDAAllocator(LRUAllocator['CUDADevice']): + def _alloc(self, size, options:BufferSpec): + check(cuda.cuCtxSetCurrent(self.dev.context)) + if options.external_ptr: return cuda.CUdeviceptr_v2(options.external_ptr) + if options.host: return init_c_var(ctypes.c_void_p, lambda x: check(cuda.cuMemHostAlloc(ctypes.byref(x), size, 0x01))) + return init_c_var(cuda.CUdeviceptr, lambda x: check(cuda.cuMemAlloc_v2(ctypes.byref(x), size))) + @suppress_finalizing + def _free(self, opaque, options:BufferSpec): + if options.external_ptr: return + if options.host: check(cuda.cuMemFreeHost(opaque)) + else: check(cuda.cuMemFree_v2(opaque)) + def _copyin(self, dest, src:memoryview): + check(cuda.cuCtxSetCurrent(self.dev.context)) + host_mem = self.alloc(len(src), BufferSpec(host=True)) + self.dev.pending_copyin.append((host_mem, len(src), BufferSpec(host=True))) + ctypes.memmove(host_mem, mv_address(src), len(src)) + check(cuda.cuMemcpyHtoDAsync_v2(dest, host_mem, len(src), None)) + def _copyout(self, dest:memoryview, src): + CUDADevice.synchronize_system() + check(cuda.cuCtxSetCurrent(self.dev.context)) + check(cuda.cuMemcpyDtoH_v2(mv_address(dest), src, len(dest))) + def _transfer(self, dest, src, sz:int, src_dev, dest_dev): + check(cuda.cuCtxSetCurrent(src_dev.context)) + check(cuda.cuEventCreate(ctypes.byref(sync_event := cuda.CUevent()), 0)) + check(cuda.cuMemcpyDtoDAsync_v2(dest, src, sz, None)) + check(cuda.cuEventRecord(sync_event, None)) + check(cuda.cuCtxSetCurrent(dest_dev.context)) + check(cuda.cuStreamWaitEvent(None, sync_event, 0)) # sync the default stream on the dest dev + def _offset(self, buf, size:int, offset:int): return cuda.CUdeviceptr_v2(buf.value + offset) + +class CUDADevice(Compiled): + devices: list[CUDADevice] = [] + peer_access = False + + def __init__(self, device:str): + device_id = int(device.split(":")[1]) if ":" in device else 0 + check(cuda.cuInit(0)) + self.cu_device = init_c_var(cuda.CUdevice, lambda x: check(cuda.cuDeviceGet(ctypes.byref(x), device_id))) + self.context = init_c_var(cuda.CUcontext, lambda x: check(cuda.cuCtxCreate_v2(ctypes.byref(x), 0, self.cu_device))) + check(cuda.cuDeviceComputeCapability(ctypes.byref(major := ctypes.c_int()), ctypes.byref(minor := ctypes.c_int()), device_id)) + + for dev in CUDADevice.devices: + check(cuda.cuDeviceCanAccessPeer(ctypes.byref(val := ctypes.c_int()), self.cu_device, dev.cu_device)) + if val.value != 1: continue + check(cuda.cuCtxSetCurrent(dev.context)) + check(cuda.cuCtxEnablePeerAccess(self.context, 0)) + check(cuda.cuCtxSetCurrent(self.context)) + check(cuda.cuCtxEnablePeerAccess(dev.context, 0)) + CUDADevice.peer_access = True + + self.pending_copyin: list[tuple[int, int, BufferSpec|None]] = [] + CUDADevice.devices.append(self) + + from tinygrad.runtime.graph.cuda import CUDAGraph + super().__init__(device, CUDAAllocator(self), [CUDARenderer, PTXRenderer, NVCCRenderer], CUDAProgram, None if MOCKGPU else CUDAGraph, + arch=f"sm_{major.value}{minor.value}") + + def count(self) -> int: return init_c_var(ctypes.c_int, lambda x: check(cuda.cuDeviceGetCount(ctypes.byref(x)))).value + + def synchronize(self): + check(cuda.cuCtxSetCurrent(self.context)) + check(cuda.cuCtxSynchronize()) + for opaque,sz,options in self.pending_copyin: self.allocator.free(opaque, sz, options) + self.pending_copyin.clear() + + @staticmethod + def synchronize_system(): + for d in CUDADevice.devices: d.synchronize() diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_disk.py b/artifacts/package_runtime/tinygrad/runtime/ops_disk.py new file mode 100644 index 000000000..801bd35b6 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_disk.py @@ -0,0 +1,141 @@ +import os, sys, mmap, io, ctypes, contextlib, pathlib +from typing import Generator, Callable +from tinygrad.helpers import OSX, round_up +from tinygrad.device import Compiled, Allocator +with contextlib.suppress(ImportError): + import _posixshmem + from tinygrad.runtime.autogen import io_uring, libc + +class DiskDevice(Compiled): + _tried_io_uring_init = False + + def __init__(self, device:str): + if not DiskDevice._tried_io_uring_init: self._iouring_setup() + + self.size: int|None = None + self.fd: int|None = None + self.refcount = 0 + super().__init__(device, DiskAllocator(self), [], None) + def _might_open(self, size:int): + assert self.size is None or size <= self.size, f"can't reopen Disk tensor with larger size, opened with {self.size}, tried to open with {size}" + if self.size is not None and hasattr(self, "mem"): + self.refcount += 1 + return + filename = self.device[len("disk:"):] + + if sys.platform != "win32" and filename.startswith("shm:"): + fd = _posixshmem.shm_open("/"+filename[4:].lstrip("/"), os.O_RDWR, 0o600) + self.mem = mmap.mmap(fd, size, mmap.MAP_SHARED | MAP_POPULATE | MAP_LOCKED) + os.close(fd) + else: + try: self.fd = os.open(filename, os.O_RDWR|os.O_CREAT|getattr(os, "O_DIRECT", 0)) + except OSError: self.fd = os.open(filename, os.O_RDWR|os.O_CREAT) + if not pathlib.Path(filename).is_block_device() and os.fstat(self.fd).st_size < size: os.ftruncate(self.fd, size) + self.mem = mmap.mmap(self.fd, size) + self.size = size + if hasattr(self.mem, 'madvise') and (hp := getattr(mmap, "MADV_HUGEPAGE", None)) is not None: + with contextlib.suppress(OSError): self.mem.madvise(hp) # some systems have transparent_hugepage disabled + self.refcount += 1 + def _might_close(self): + self.refcount -= 1 + if self.refcount == 0: + if self.fd is not None: + os.close(self.fd) + if hasattr(self, "mem"): + try: self.mem.close() + except BufferError: pass + self.size = None + def _iouring_setup(self): + DiskDevice._tried_io_uring_init = True + + if sys.platform == 'linux' and not hasattr(sys, "getandroidapilevel"): + fd = libc.syscall(io_uring.NR_io_uring_setup, 4096, ctypes.byref(p:=io_uring.struct_io_uring_params())) + if fd < 0: return + + sq_ptr = libc.mmap(0, p.sq_off.array + p.sq_entries * 4, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED | MAP_POPULATE, fd, 0) + cq_ptr = libc.mmap(0, p.cq_off.cqes + p.cq_entries * ctypes.sizeof(io_uring.struct_io_uring_cqe), + mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED | MAP_POPULATE, fd, io_uring.IORING_OFF_CQ_RING) + sqes = libc.mmap(0, p.sq_entries * ctypes.sizeof(io_uring.struct_io_uring_sqe), + mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED | MAP_POPULATE, fd, io_uring.IORING_OFF_SQES) + + def u32ptr(val): return ctypes.cast(val, ctypes.POINTER(ctypes.c_uint32)) + sqdesc = io_uring.struct_io_uring_sq(khead=u32ptr(sq_ptr+p.sq_off.head), ktail=u32ptr(sq_ptr+p.sq_off.tail), + array=u32ptr(sq_ptr+p.sq_off.array), + kring_mask=u32ptr(sq_ptr+p.sq_off.ring_mask), sqes=ctypes.cast(sqes, ctypes.POINTER(io_uring.struct_io_uring_sqe))) + + cqdesc = io_uring.struct_io_uring_cq(khead=u32ptr(cq_ptr+p.cq_off.head), ktail=u32ptr(cq_ptr+p.cq_off.tail), + kring_mask=u32ptr(sq_ptr+p.cq_off.ring_mask), cqes=ctypes.cast(cq_ptr+p.cq_off.cqes, ctypes.POINTER(io_uring.struct_io_uring_cqe))) + + DiskDevice.io_uring = io_uring.struct_io_uring(ring_fd=fd, sq=sqdesc, cq=cqdesc) # type: ignore + +class DiskBuffer: + def __init__(self, device:DiskDevice, size:int, offset=0): + self.device, self.size, self.offset = device, size, offset + def __repr__(self): return f"" + def _buf(self) -> memoryview: + assert hasattr(self.device, "mem"), f"DiskBuffer wasn't opened: {self.device.device}" + return memoryview(self.device.mem)[self.offset:self.offset+self.size] + +MAP_LOCKED, MAP_POPULATE = 0 if OSX else 0x2000, getattr(mmap, "MAP_POPULATE", 0 if OSX else 0x008000) +class DiskAllocator(Allocator): + def __init__(self, dev:DiskDevice): super().__init__(dev) + def _alloc(self, size:int, options): + self.dev._might_open(size) + return DiskBuffer(self.dev, size) + def _free(self, opaque, options): self.dev._might_close() + def _as_buffer(self, src:DiskBuffer): return src._buf() + def _copyin(self, dest:DiskBuffer, src:memoryview): dest._buf()[:] = src + def _copyout(self, dest:memoryview, src:DiskBuffer): + if OSX and self.dev.fd is not None: + # OSX doesn't seem great at mmap, this is faster + with io.FileIO(self.dev.fd, "a+b", closefd=False) as fo: + fo.seek(src.offset) + bytes_read = 0 + while (n := fo.readinto(dest[bytes_read:])) is not None and n > 0: bytes_read += n + else: + dest[:] = src._buf() + + def _copyout_sharded(self, src:DiskBuffer, size:int, _get_free_buf:Callable, seg_len:int, + use_ioring:bool=True) -> Generator[tuple[int, int, int, int], None, None]: + fd_offset = src.offset - (minor_offset := src.offset % mmap.PAGESIZE) + processed_reqs_cnt, copied_in, next_read_offset, total_copy_size = 0, 0, 0, round_up(size + minor_offset, mmap.PAGESIZE) + + if not hasattr(DiskDevice, 'io_uring') or not use_ioring: + local_buf = memoryview(bytearray(seg_len)) + for off in range(0, total_copy_size, seg_len): + while (copy_batch := _get_free_buf()) is None: pass + read_size = min(seg_len, total_copy_size - off, src.device.size - fd_offset - off) + self._copyout(local_buf[:read_size], DiskBuffer(src.device, read_size, fd_offset + off)) + copy_batch[0].view(size=read_size)[:] = local_buf[:read_size] + real_copy_size = min(read_size - minor_offset, size - copied_in) + yield (copy_batch, copied_in, minor_offset, real_copy_size) + copied_in, minor_offset = copied_in + real_copy_size, 0 + return + + reqs: list[tuple[int, int, int, int]] = [] + while next_read_offset < total_copy_size or len(reqs) != processed_reqs_cnt: + if next_read_offset < total_copy_size and (copy_batch := _get_free_buf()) is not None: + # Prepare sqe + sqe_index = (tail:=DiskDevice.io_uring.sq.ktail[0]) & DiskDevice.io_uring.sq.kring_mask[0] + sqe = DiskDevice.io_uring.sq.sqes[sqe_index] + sqe.opcode, sqe.fd, sqe.off = io_uring.IORING_OP_READ, self.dev.fd, fd_offset + next_read_offset + sqe.addr, sqe.len, sqe.user_data = copy_batch[0].addr, min(seg_len, total_copy_size - next_read_offset), len(reqs) + + # Send sqe + DiskDevice.io_uring.sq.array[sqe_index] = sqe_index + DiskDevice.io_uring.sq.ktail[0] = tail + 1 + libc.syscall(io_uring.NR_io_uring_enter, DiskDevice.io_uring.ring_fd, 1, 1, io_uring.IORING_ENTER_GETEVENTS) + + reqs.append((copy_batch, copied_in, minor_offset, real_copy_size:=min(sqe.len - minor_offset, size - copied_in))) + next_read_offset += sqe.len + copied_in += real_copy_size + minor_offset = 0 + + if (head:=DiskDevice.io_uring.cq.khead[0]) != DiskDevice.io_uring.cq.ktail[0]: + cqe = DiskDevice.io_uring.cq.cqes[head & DiskDevice.io_uring.cq.kring_mask[0]] + assert cqe.res >= 0, f"read from disk failed, err: {cqe.res}" + yield reqs[cqe.user_data] + DiskDevice.io_uring.cq.khead[0] = head + 1 # advance + processed_reqs_cnt += 1 + + def _offset(self, buf:DiskBuffer, size:int, offset:int): return DiskBuffer(buf.device, size, offset) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_dsp.py b/artifacts/package_runtime/tinygrad/runtime/ops_dsp.py new file mode 100644 index 000000000..e8ffa2ef8 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_dsp.py @@ -0,0 +1,297 @@ +from __future__ import annotations +import ctypes, os, mmap, tempfile, pathlib, array, threading, contextlib, sys, subprocess, struct +assert sys.platform != 'win32' +from tinygrad.device import BufferSpec, Compiled, Allocator, Compiler, Program, TinyELF +from tinygrad.dtype import dtypes, AddrSpace +from tinygrad.uop.ops import Ops, UOp +from tinygrad.helpers import getenv, round_up, mv_address, to_mv, cpu_objdump, system, DEBUG, suppress_finalizing, Target, unwrap +from tinygrad.renderer.cstyle import ClangRenderer +from tinygrad.runtime.autogen import libc, qcom_dsp +if getenv("IOCTL"): import extra.dsp.run # noqa: F401 # pylint: disable=unused-import + +from tinygrad.uop.ops import PatternMatcher, UPat + +# NOTE: this just increases readability of the generated code +dsp_string = PatternMatcher([ + (UPat(Ops.CONST, (dtypes.int8, dtypes.uint8), name="x"), lambda ctx,x: str(x.val)), +]) + +class DSPRenderer(ClangRenderer): + has_threads = False + buffer_suffix = " restrict __attribute__((align_value(128)))" + kernel_typedef = "__attribute__((noinline)) void" + string_rewrite = dsp_string+ClangRenderer.string_rewrite + type_map = { **ClangRenderer.type_map, dtypes.uint64: "unsigned long long", dtypes.int64: "long long" } + code_for_op = {k:v for k,v in ClangRenderer.code_for_op.items() if k != Ops.SQRT} + + def __init__(self, target:Target): self.target, self.compiler = target, DSPCompiler() + + def _render_defines(self, uops) -> list[str]: + return ['''/* DSP boilerplate */ struct dcvs_v2_req { int type; int _pad; _Bool dcvs_enable; char dcvs_option; _Bool set_latency; int latency; + _Bool set_dcvs_params; short _pad2; char target_corner; char min_corner; char max_corner; int _pad3[3];};''','int HAP_power_set(void*, void*);', + 'typedef union { struct { void *pv; unsigned int len; } buf; struct { int fd; unsigned int offset; } dma; } remote_arg;', + 'void* HAP_mmap(void *addr, int len, int prot, int flags, int fd, long offset);', 'int HAP_munmap(void *addr, int len);', + 'unsigned long long HAP_perf_get_time_us(void);'] + super()._render_defines(uops) + + def _render_entry(self, function_name:str, bufs:list[tuple[str,tuple[UOp,bool]]]) -> str: + msrc = ['int entry(unsigned long long handle, unsigned int sc, remote_arg* pra) {', + 'struct dcvs_v2_req req = {.type=7, .dcvs_enable=0, .set_latency=1, .latency=100, .set_dcvs_params=1, .target_corner = 6 /* TURBO */};', + 'HAP_power_set((void*)handle, (void*)&req);'] + msrc += ['if ((sc>>24) != 2) return 0;'] + msrc += [f'{self._render_dtype(b[1][0].dtype) if b[1][0].addrspace == AddrSpace.ALU else "int"} sz_or_val_{i} = ' + f'*({self._render_dtype(b[1][0].dtype) if b[1][0].addrspace == AddrSpace.ALU else "int"}*)((char*)pra[0].buf.pv+{i*8});' + for i,b in enumerate(bufs)] + msrc += [f'int off{i} = ((int*)pra[1].buf.pv)[{i}];' for i,b in enumerate(bufs) if b[1][0].addrspace == AddrSpace.GLOBAL] + msrc += [f'void *buf_{i} = HAP_mmap(0,sz_or_val_{i},3,0,pra[{i+3}].dma.fd,0)+off{i};' + for i,b in enumerate(bufs) if b[1][0].addrspace == AddrSpace.GLOBAL] + msrc += ["unsigned long long start = HAP_perf_get_time_us();"] + fbufs = [(f'buf_{i}' if b[1][0].addrspace == AddrSpace.GLOBAL else f'sz_or_val_{i}') for i,b in enumerate(bufs)] + msrc += [f"{function_name}({', '.join(fbufs)});"] + msrc += ["*(unsigned long long *)(pra[2].buf.pv) = HAP_perf_get_time_us() - start;"] + msrc += [f'HAP_munmap(buf_{i}, sz_or_val_{i});' for i,b in enumerate(bufs) if b[1][0].addrspace == AddrSpace.GLOBAL] + msrc += ["return 0; }"] + return '\n'.join(msrc) + + def supported_dtypes(self): return {d for d in super().supported_dtypes() if d not in dtypes.fp8s+(dtypes.bfloat16,)} + +def rpc_sc(method=0, ins=0, outs=0, fds=0): return (method << 24) | (ins << 16) | (outs << 8) | fds +def rpc_prep_args(ins=None, outs=None, in_fds=None): + ins, outs, in_fds = ins or list(), outs or list(), in_fds or list() + + pra = (qcom_dsp.union_remote_arg * (len(ins) + len(outs) + len(in_fds)))() + fds = (ctypes.c_int32 * (len(ins) + len(outs) + len(in_fds)))(*([-1] * (len(ins) + len(outs))), *in_fds) + attrs = (ctypes.c_uint32 * (len(ins) + len(outs) + len(in_fds)))(*([0] * (len(ins) + len(outs))), *([1] * (len(in_fds)))) + + for i, mv in enumerate(ins + outs): pra[i].buf.pv, pra[i].buf.len = ctypes.c_void_p(mv_address(mv) if mv.nbytes > 0 else 0), mv.nbytes + return pra, fds, attrs, (ins, outs) + +class DSPProgram(Program['DSPDevice']): + def __init__(self, dev:DSPDevice, obj:TinyELF): self.dev, self.lib, self.signature = dev, obj.lib, obj.signature + + def __call__(self, *bufs, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), vals:tuple[int, ...]=(), wait=False, **kw): + if len(bufs) >= 16: raise RuntimeError(f"Too many buffers to execute: {len(bufs)}") + + pra, fds, attrs, _ = rpc_prep_args(ins=[var_vals_mv:=memoryview(bytearray((len(bufs)+len(vals))*8)), off_mv:=memoryview(bytearray(len(bufs)*4))], + outs=[timer:=memoryview(bytearray(8)).cast('Q')], in_fds=[b.share_info.fd for b in bufs]) + for i,b in enumerate(bufs): struct.pack_into('i', var_vals_mv, i*8, b.size) + for i,(v,(_,_,dt,_)) in enumerate(zip(vals, self.signature[len(bufs):]), start=len(bufs)): struct.pack_into(unwrap(dt.fmt), var_vals_mv, i*8, v) + off_mv.cast('I')[:] = array.array('I', tuple(b.offset for b in bufs)) + self.dev.exec_lib(self.lib, rpc_sc(method=2, ins=2, outs=1, fds=len(bufs)), pra, fds, attrs) + return timer[0] / 1e6 + +class DSPBuffer: + def __init__(self, va_addr:int, size:int, share_info, offset:int=0): + self.va_addr, self.size, self.share_info, self.offset = va_addr, size, share_info, offset + +class DSPAllocator(Allocator['DSPDevice']): + def _alloc(self, size:int, options:BufferSpec): + if getenv("MOCKDSP"): fd, share_info, flags = -1, None, mmap.MAP_SHARED|mmap.MAP_ANONYMOUS + else: + b = qcom_dsp.ION_IOC_ALLOC(self.dev.ion_fd, len=size, align=0x200, heap_id_mask=1< memoryview: return to_mv(src.va_addr, src.size) + def _copyin(self, dest:DSPBuffer, src:memoryview): ctypes.memmove(dest.va_addr, mv_address(src), src.nbytes) + def _copyout(self, dest:memoryview, src:DSPBuffer): ctypes.memmove(mv_address(dest), src.va_addr, dest.nbytes) + def _offset(self, buf, size:int, offset:int): return DSPBuffer(buf.va_addr+offset, size, buf.share_info, buf.offset+offset) + +class DSPCompiler(Compiler): + def __init__(self, mock:bool=False): + compiler_args = "--target=hexagon -mcpu=hexagonv65 -fuse-ld=lld -nostdlib -mhvx=v65 -mhvx-length=128b" + if mock: self.args = f"-static {compiler_args}" + else: + # Generate link script to pass into clang. Aligning all used sections to 4k fixes invoke problem. + sections = ['text', 'rela.plt', 'rela.dyn', 'plt', 'data', 'bss', 'hash', 'dynamic', + 'got', 'got.plt', 'dynsym', 'dynstr', 'symtab', 'shstrtab', 'strtab'] + sections_link = '\n'.join([f'.{n} : ALIGN(4096) {{ *(.{n}) }}' for n in sections]) + with tempfile.NamedTemporaryFile(delete=False) as self.link_ld: + self.link_ld.write(f"SECTIONS {{ . = 0x0; {sections_link}\n /DISCARD/ : {{ *(.note .note.* .gnu.hash .comment) }} }}".encode()) + self.link_ld.flush() + + self.args = f"-shared {compiler_args} -T{self.link_ld.name}" + + super().__init__(None if mock else "compile_dsp") + + def compile(self, src:str) -> bytes: + # TODO: remove file write. sadly clang doesn't like the use of /dev/stdout here + with tempfile.NamedTemporaryFile(delete=True) as f: + system(f"{getenv('CC','clang')} {self.args} -O2 -Wall -Werror -fno-stack-protector -x c -fPIC " + + f"-ffreestanding -nostdlib - -o {f.name}", input=src.encode()) + return pathlib.Path(f.name).read_bytes() + + def disassemble(self, lib:bytes): return cpu_objdump(lib, "llvm-objdump") + + +class DSPDevice(Compiled): + def __init__(self, device:str=""): + if getenv("MOCKDSP"): super().__init__(device, DSPAllocator(self), [MockDSPRenderer], MockDSPProgram) + else: + self.ion_fd = os.open('/dev/ion', os.O_RDONLY) + super().__init__(device, DSPAllocator(self), [DSPRenderer], DSPProgram) + fastrpc_shell = memoryview(bytearray(pathlib.Path('/dsp/cdsp/fastrpc_shell_3').read_bytes())) + self.shell_buf = self.allocator.alloc(round_up(fastrpc_shell.nbytes, 0x1000), BufferSpec(nolru=True)) + ctypes.memmove(self.shell_buf.va_addr, mv_address(fastrpc_shell), fastrpc_shell.nbytes) + + self.init_dsp() + RPCListener(self).start() + + def open_lib(self, lib): + self.binded_lib, self.binded_lib_off = lib, 0 + fp = "file:///tinylib?entry&_modver=1.0&_dom=cdsp\0" + pra, _, _, _ = rpc_prep_args(ins=[memoryview(array.array('I', [len(fp), 0xff])), memoryview(bytearray(fp.encode()))], + outs=[o1:=memoryview(bytearray(0x8)), o2:=memoryview(bytearray(0xff))]) + qcom_dsp.FASTRPC_IOCTL_INVOKE(self.rpc_fd, handle=0, sc=rpc_sc(method=0, ins=2, outs=2), pra=pra) + if o1.cast('i')[1] < 0: raise RuntimeError(f"Cannot open lib: {o2.tobytes().decode()}") + return o1.cast('I')[0] + + def close_lib(self, handle): + pra, _, _, _ = rpc_prep_args(ins=[memoryview(array.array('I', [handle, 0xff]))], outs=[memoryview(bytearray(0x8)), memoryview(bytearray(0xff))]) + qcom_dsp.FASTRPC_IOCTL_INVOKE(self.rpc_fd, handle=0, sc=rpc_sc(method=1, ins=1, outs=2), pra=pra) + + def exec_lib(self, lib, sc, args, fds, attrs): + def _exec_lib(): + handle = self.open_lib(lib) + qcom_dsp.FASTRPC_IOCTL_INVOKE_ATTRS(self.rpc_fd, fds=fds, attrs=attrs, inv=qcom_dsp.struct_fastrpc_ioctl_invoke(handle=handle, sc=sc, pra=args)) + self.close_lib(handle) + try: _exec_lib() + except (OSError, PermissionError): + # DSP might ask for a connection reset or just fail with operation not permitted, try to reset connection. + self.init_dsp() + try: _exec_lib() + except (OSError, PermissionError) as e: raise RuntimeError(e) + + def init_dsp(self): + if hasattr(self, 'rpc_fd'): + with contextlib.suppress(OSError): + qcom_dsp.FASTRPC_IOCTL_INVOKE(self.rpc_fd, handle=4, sc=rpc_sc(method=2, ins=0, outs=0)) # pylint: disable=access-member-before-definition + os.close(self.rpc_fd) # pylint: disable=access-member-before-definition + + self.rpc_fd: int = os.open('/dev/adsprpc-smd', os.O_RDONLY | os.O_NONBLOCK) + qcom_dsp.FASTRPC_IOCTL_GETINFO(self.rpc_fd, 3) + qcom_dsp.FASTRPC_IOCTL_CONTROL(self.rpc_fd, req=0x3) + qcom_dsp.FASTRPC_IOCTL_INIT(self.rpc_fd, flags=0x1, file=self.shell_buf.va_addr, filelen=self.shell_buf.size, filefd=self.shell_buf.share_info.fd) + qcom_dsp.FASTRPC_IOCTL_INVOKE(self.rpc_fd, handle=3, sc=rpc_sc(method=3, ins=0, outs=0)) + +class RPCListener(threading.Thread): + def __init__(self, device:DSPDevice): + super().__init__() + self.device, self.daemon = device, True + + def run(self): + # Setup initial request arguments. + context, status, TINYFD = 0, 0xffffffff, 0xffff + req_args, _, _, _ = rpc_prep_args(ins=[msg_send:=memoryview(bytearray(0x10)).cast('I'), out_buf:=memoryview(bytearray(0x10000)).cast('I')], + outs=[msg_recv:=memoryview(bytearray(0x10)).cast('I'), in_buf:=memoryview(bytearray(0x10000)).cast('I')]) + req_args[1].buf.len = 0 + + while True: + # Update message request and send it. + msg_send[:] = array.array('I', [context, status, req_args[1].buf.len, in_buf.nbytes]) + + try: qcom_dsp.FASTRPC_IOCTL_INVOKE(self.device.rpc_fd, handle=0x3, sc=0x04020200, pra=req_args) + except OSError: continue # retry + + context, inbufs, outbufs = msg_recv[0], ((sc:=msg_recv[2]) >> 16) & 0xff, (msg_recv[2] >> 8) & 0xff + + in_ptr, out_ptr, objs = mv_address(in_buf), mv_address(out_buf), [] + for i in range(inbufs + outbufs): + obj_ptr = round_up(in_ptr + 4, 8) if i < inbufs else round_up(out_ptr + 4, 8) + objs.append(to_mv(obj_ptr, obj_size:=to_mv(in_ptr, 4).cast('I')[0])) + if i < inbufs: in_ptr = obj_ptr + obj_size + else: + to_mv(out_ptr, 4).cast('I')[0] = obj_size + out_ptr = obj_ptr + obj_size + in_ptr += 4 + + in_args, out_args = objs[:inbufs], objs[inbufs:] + req_args[1].buf.len = out_ptr - mv_address(out_buf) + + status = 0 # reset status, will set if error + if sc == 0x20200: pass # greating + elif sc == 0x13050100: # open + try: out_args[0].cast('I')[0] = TINYFD if (name:=in_args[3].tobytes()[:-1].decode()) == "tinylib" else os.open(name, os.O_RDONLY) + except OSError: status = 1 + elif sc == 0x3010000: + if (fd:=in_args[0].cast('I')[0]) != TINYFD: os.close(fd) + elif sc == 0x9010000: # seek + if (fd:=in_args[0].cast('I')[0]) == TINYFD: + assert in_args[0].cast('I')[2] == qcom_dsp.APPS_STD_SEEK_SET, "Supported only SEEK_SET" + res, self.device.binded_lib_off = 0, in_args[0].cast('I')[1] + else: res = os.lseek(fd, in_args[0].cast('I')[1], in_args[0].cast('I')[2]) + status = 0 if res >= 0 else res + elif sc == 0x4010200: # read + if (fd:=in_args[0].cast('I')[0]) == TINYFD: + buf = self.device.binded_lib[self.device.binded_lib_off:self.device.binded_lib_off+in_args[0].cast('I')[1]] + self.device.binded_lib_off += len(buf) + else: buf = os.read(fd, in_args[0].cast('I')[1]) + out_args[1][:len(buf)] = buf + out_args[0].cast('I')[0:2] = array.array('I', [len(buf), int(len(buf) == 0)]) + elif sc == 0x1f020100: # stat + stat = os.stat(in_args[1].tobytes()[:-1].decode()) + out_stat = qcom_dsp.struct_apps_std_STAT.from_address(mv_address(out_args[0])) + for f in out_stat._real_fields_: out_stat.__setattr__(f[0], int(getattr(stat, f"st_{f[0]}", 0))) + elif sc == 0x2010100: # mmap + st = qcom_dsp.FASTRPC_IOCTL_MMAP(self.device.rpc_fd, fd=-1, flags=in_args[0].cast('I')[2], vaddrin=0, size=in_args[0].cast('Q')[3]) + out_args[0].cast('Q')[0:2] = array.array('Q', [0, st.vaddrout]) + else: raise RuntimeError(f"Unknown op: {sc=:X}") + +# ***** mock DSP ***** + +mockdsp_boilerplate = '''/* DSP boilerplate */ static long syscall(long r0, long r1, long r2, long r3, long r4, long r5, long r6) { +long retval; __asm__ volatile("r0 = %1; r1 = %2; r2 = %3; r3 = %4; r4 = %5; r5 = %6; r6 = %7; trap0(#1); %0 = r0" : "=r" (retval) + : "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5), "r" (r6) : "r0", "r1", "r2", "r3", "r4", "r5", "r6"); return retval; } +static int read(int fd, void* buf, int len) {{ return syscall(fd, (long)buf, len, 0, 0, 0, 63); }} +static int write(int fd, void* buf, int len) {{ return syscall(fd, (long)buf, len, 0, 0, 0, 64); }} +static int exit(int ret) {{ return syscall(ret, 0, 0, 0, 0, 0, 93); }} +static unsigned int inscount(void) {{ unsigned int ret; __asm__ volatile(".word 0x6a15c000; %0 = R0" : "=r" (ret) : : "r0"); return ret; }} +static void *mmap2(void *addr, unsigned int length, int prot, int flags, int fd, unsigned long offset) {{ +return (void*)syscall((long)addr, length, prot, flags, fd, offset, 222); }}''' + +class MockDSPRenderer(DSPRenderer): + def __init__(self, target:Target): self.target, self.compiler = target, DSPCompiler(mock=True) + def _render_defines(self, uops) -> list[str]: return ClangRenderer._render_defines(self, uops) + def _render_entry(self, function_name:str, bufs:list[tuple[str,tuple[UOp,bool]]]) -> str: + # https://gpages.juszkiewicz.com.pl/syscalls-table/syscalls.html + # control register 21 is HEX_REG_QEMU_INSN_CNT, 0x6a15c000 loads it + msrc = [mockdsp_boilerplate, 'void _start(void) {'] + for i,b in enumerate(bufs): + if b[1][0].addrspace == AddrSpace.GLOBAL: + sz = b[1][0].max_numel()*b[1][0].dtype.itemsize + # for loop for big reads + msrc.append(f"void *buf{i} = mmap2(0, {sz}, 3, 0x21, -1, 0); for(int rd = 0; rd < {sz}; rd += read(0, buf{i}+rd, {sz}-rd));") + else: + msrc.append(f"{self._render_dtype(b[1][0].dtype)} val{i}; read(0, &val{i}, {b[1][0].dtype.itemsize});") + msrc.append("unsigned int st = inscount();") + params = [(f'(void*)buf{i}' if b[1][0].addrspace == AddrSpace.GLOBAL else f'val{i}') for i,b in enumerate(bufs)] + msrc.append(f"{function_name}({', '.join(params)});") + msrc.append("unsigned int et = inscount() - st; write(1, &et, sizeof(et));") + for i,b in enumerate(bufs): + if b[1][0].addrspace == AddrSpace.GLOBAL: msrc.append(f"write(1, buf{i}, {b[1][0].max_numel()*b[1][0].dtype.itemsize});") + msrc.append('exit(0); }') + return '\n'.join(msrc) + +class MockDSPProgram(Program[DSPDevice]): + def __init__(self, dev:DSPDevice, obj:TinyELF): self.lib, self.signature = obj.lib, obj.signature + def __call__(self, *bufs, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), vals:tuple[int, ...]=(), wait=False, **kw): + with tempfile.NamedTemporaryFile(suffix=".out") as dsp_lib: + dsp_lib.write(self.lib) + dsp_lib.flush() + os.chmod(dsp_lib.name, 0o0777) + proc = subprocess.run(["qemu-hexagon-static", *(['-strace'] if DEBUG >= 5 else []), dsp_lib.name], + input=b''.join([bytes(to_mv(x.va_addr, x.size)) for x in bufs] + + [struct.pack(unwrap(dt.fmt), x) for x,(_,_,dt,_) in zip(vals, self.signature[len(bufs):])]), + stdout=subprocess.PIPE, check=True) + offset = 4 + for x in bufs: + to_mv(x.va_addr, x.size)[:] = proc.stdout[offset:offset+x.size] + offset += x.size + assert offset == len(proc.stdout) + return struct.unpack("I", proc.stdout[0:4])[0] / 1e9 # pretend it's 1 Ghz, but this is an inscount, not a time diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_hip.py b/artifacts/package_runtime/tinygrad/runtime/ops_hip.py new file mode 100644 index 000000000..81480f13e --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_hip.py @@ -0,0 +1,70 @@ +import ctypes +from tinygrad.helpers import mv_address, getenv, suppress_finalizing +from tinygrad.device import Compiled, LRUAllocator, BufferSpec, Program, TinyELF +from tinygrad.runtime.autogen import hip +from tinygrad.renderer.cstyle import HIPRenderer +from tinygrad.runtime.support.c import init_c_var, init_c_struct_t +if getenv("IOCTL"): import extra.hip_gpu_driver.hip_ioctl # noqa: F401 # pylint: disable=unused-import + +def check(status): + if status != 0: raise RuntimeError(f"HIP Error {status}, {ctypes.string_at(hip.hipGetErrorString(status)).decode()}") + +class HIPDevice(Compiled): + def __init__(self, device:str=""): + self.device_id = int(device.split(":")[1]) if ":" in device else 0 + self.arch = init_c_var(hip.hipDeviceProp_t, lambda x: check(hip.hipGetDeviceProperties(x, self.device_id))).gcnArchName.decode() + self.time_event_st, self.time_event_en = [init_c_var(hip.hipEvent_t, lambda x: hip.hipEventCreate(ctypes.byref(x), 0)) for _ in range(2)] + + super().__init__(device, HIPAllocator(self), [HIPRenderer], HIPProgram, arch=self.arch) + + def count(self) -> int: return init_c_var(ctypes.c_int, lambda x: check(hip.hipGetDeviceCount(x))).value + + def synchronize(self): + check(hip.hipSetDevice(self.device_id)) + check(hip.hipDeviceSynchronize()) + +class HIPProgram(Program[HIPDevice]): + def __init__(self, dev:HIPDevice, obj:TinyELF): + self.dev, self.name, self.lib, self.signature = dev, obj.name, obj.lib, obj.signature + check(hip.hipSetDevice(self.dev.device_id)) + self.module = init_c_var(hip.hipModule_t, lambda x: check(hip.hipModuleLoadData(ctypes.byref(x), obj.lib))) + self.prg = init_c_var(hip.hipFunction_t, lambda x: check(hip.hipModuleGetFunction(ctypes.byref(x), self.module, obj.name.encode("utf-8")))) + + @suppress_finalizing + def __del__(self): + if hasattr(self, 'module'): check(hip.hipModuleUnload(self.module)) + + def __call__(self, *args, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), vals:tuple[int, ...]=(), wait=False, **kw): + check(hip.hipSetDevice(self.dev.device_id)) + if not hasattr(self, "vargs"): + fields = ([(f'f{i}', hip.hipDeviceptr_t, i*8) for i in range(len(args))] + + [(f'v{i}', getattr(ctypes, f"c_int{dt.bitsize}"), o) for i,(o,dt) in enumerate(TinyELF.iter_sig(self.signature[len(args):], len(args)*8))]) + self.c_args = init_c_struct_t(fields[-1][2] + ctypes.sizeof(fields[-1][1]) if len(fields) else 0, tuple(fields))(*args, *vals) + self.vargs = (ctypes.c_void_p * 5)(1, ctypes.cast(ctypes.byref(self.c_args), ctypes.c_void_p), 2, + ctypes.cast(ctypes.pointer(ctypes.c_size_t(ctypes.sizeof(self.c_args))), ctypes.c_void_p), 3) + + for i in range(len(args)): self.c_args.__setattr__(f'f{i}', args[i]) + for i in range(len(vals)): self.c_args.__setattr__(f'v{i}', vals[i]) + + if wait: check(hip.hipEventRecord(self.dev.time_event_st, None)) + + check(hip.hipModuleLaunchKernel(self.prg, *global_size, *local_size, 0, None, None, self.vargs)) + + if wait: + check(hip.hipEventRecord(self.dev.time_event_en, None)) + check(hip.hipEventSynchronize(self.dev.time_event_en)) + check(hip.hipEventElapsedTime(ctypes.byref(ret := ctypes.c_float()), self.dev.time_event_st, self.dev.time_event_en)) + return ret.value * 1e-3 + +class HIPAllocator(LRUAllocator[HIPDevice]): + def _alloc(self, size:int, options:BufferSpec): + check(hip.hipSetDevice(self.dev.device_id)) + return init_c_var(hip.hipDeviceptr_t, lambda x: check(hip.hipMalloc(ctypes.byref(x), size))) + def _free(self, opaque, options:BufferSpec): check(hip.hipFree(opaque)) + def _copyin(self, dest, src: memoryview): + check(hip.hipSetDevice(self.dev.device_id)) + check(hip.hipMemcpy(dest, mv_address(src), len(src), hip.hipMemcpyHostToDevice)) + def _copyout(self, dest:memoryview, src): + self.dev.synchronize() + check(hip.hipMemcpy(mv_address(dest), src, len(dest), hip.hipMemcpyDeviceToHost)) + def _offset(self, buf, size:int, offset:int): return hip.hipDeviceptr_t(buf.value + offset) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_metal.py b/artifacts/package_runtime/tinygrad/runtime/ops_metal.py new file mode 100644 index 000000000..3a0fe42d2 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_metal.py @@ -0,0 +1,192 @@ +import subprocess, pathlib, struct, ctypes, tempfile, functools, decimal, platform +from tinygrad.helpers import prod, to_mv, round_up, cache_dir, PROFILE, ProfileRangeEvent, cpu_profile, unwrap, suppress_finalizing +import tinygrad.runtime.support.objc as objc +from tinygrad.device import Compiled, Compiler, CompileError, Program, TinyELF, LRUAllocator, ProfileDeviceEvent +from tinygrad.renderer.cstyle import MetalRenderer +from tinygrad.runtime.autogen import metal +from tinygrad.runtime.support.c import DLL + +# 13 is requestType that metal uses to compile source code into MTLB, there aren't any docs or symbols. +REQUEST_TYPE_COMPILE = 13 + +# Must be loaded for default Metal Device: https://developer.apple.com/documentation/metal/1433401-mtlcreatesystemdefaultdevice?language=objc +DLL("CoreGraphics", "CoreGraphics") + +# FIXME: these need autogen to support objc categories +# https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html +@functools.cache +def to_ns_str(s: str): return ctypes.cast(objc.msg("stringWithUTF8String:")(metal.NSString._objc_class_, s.encode()), metal.NSString) +def from_ns_str(s): return bytes(objc.msg("UTF8String", ctypes.c_char_p)(s)).decode() + +def wait_check(cbuf:metal.MTLCommandBuffer): + cbuf.waitUntilCompleted() + error_check(cbuf.error().retained()) + +def cmdbuf_label(cbuf:metal.MTLCommandBuffer) -> str|None: return from_ns_str(label) if (label:=cbuf.label()).value is not None else None + +def error_check(error: metal.NSError, error_constructor: type[Exception] = RuntimeError): + if error.value is None: return None + raise error_constructor(from_ns_str(error.localizedDescription().retained())) + +class MetalDevice(Compiled): + def __init__(self, device:str): + self.sysdevice = metal.MTLCreateSystemDefaultDevice() + self.mtl_queue = self.sysdevice.newCommandQueueWithMaxCommandBufferCount(1024) + if self.mtl_queue is None: raise RuntimeError("Cannot allocate a new command queue") + self.mtl_buffers_in_flight: list[metal.MTLCommandBuffer] = [] + self.timeline_signal = self.sysdevice.newSharedEvent() + self.timeline_value = 0 + + # https://developer.apple.com/documentation/metal/mtlgpufamily + def check_family(f): return next(filter(self.sysdevice.supportsFamily, reversed([v for v, nm in metal.enum_MTLGPUFamily.items() if f in nm])), 0) + + Compiled.profile_events += [ProfileDeviceEvent(device)] + + from tinygrad.runtime.graph.metal import MetalGraph + # NOTE: GitHub CI macOS runners use paravirtualized metal which is broken with graph. + # This can be reproduced locally with any virtualization software (like utm) that can create macOS VMs with apple's own virtualization framework. + super().__init__(device, MetalAllocator(self), [MetalRenderer], MetalProgram, + MetalGraph if 'virtual' not in from_ns_str(self.sysdevice.name()).lower() else None, + arch=metal.enum_MTLGPUFamily[check_family("Apple") or check_family("Mac")][12:]) + + def synchronize(self): + for cbuf in self.mtl_buffers_in_flight: + wait_check(cbuf) + st, en = decimal.Decimal(cbuf.GPUStartTime()) * 1000000, decimal.Decimal(cbuf.GPUEndTime()) * 1000000 + # NOTE: command buffers from MetalGraph are not profiled here + if PROFILE and (lb:=cmdbuf_label(cbuf)) is not None and not lb.startswith("batched"): + Compiled.profile_events += [ProfileRangeEvent(self.device, lb, st, en)] + self.mtl_buffers_in_flight.clear() + +class MetalCompiler(Compiler): + # Opening METAL after LLVM doesn't fail because ctypes.CDLL opens with RTLD_LOCAL but MTLCompiler opens it's own llvm with RTLD_GLOBAL + # This means that MTLCompiler's llvm will create it's own instances of global state because RTLD_LOCAL doesn't export symbols, but if RTLD_GLOBAL + # library is loaded first then RTLD_LOCAL library will just use it's symbols. On linux there is RTLD_DEEPBIND to prevent that, but on macos there + # doesn't seem to be anything we can do. + import tinygrad.runtime.autogen.llvm as _ + support = DLL("MTLCompiler", "MTLCompiler") + support.MTLCodeGenServiceCreate.restype = ctypes.c_void_p + + def __init__(self): + self.cgs = ctypes.c_void_p(MetalCompiler.support.MTLCodeGenServiceCreate(b"tinygrad")) + super().__init__("compile_metal_direct") + def __reduce__(self): return (MetalCompiler,()) # force pickle to create new instance for each multiprocessing fork + def compile(self, src:str) -> bytes: + ret: Exception|bytes = CompileError("MTLCodeGenServiceBuildRequest returned without calling the callback") + @ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_int32, ctypes.c_void_p, ctypes.c_size_t, ctypes.c_char_p) + def callback(blockptr, error, dataPtr, dataLen, errorMessage): + nonlocal ret + if error == 0: + reply = bytes(to_mv(dataPtr, dataLen)) + # offset from beginning to data = header size + warning size + ret = reply[sum(struct.unpack('= 26 else "metal3.1" if macos_major >= 14 else "metal3.0" if macos_major >= 13 else "macos-metal2.0" + + # llvm will create modules.timestamp in cache path and cache compilation of metal stdlib (250ms => 8ms compilation time) + # note that llvm won't necessarily create anything else here as apple has prebuilt versions of many standard libraries + params = f'-fno-fast-math -std={metal_version} --driver-mode=metal -x metal -fmodules-cache-path="{cache_dir}" -fno-caret-diagnostics' + # source blob has to be padded to multiple of 4 but at least one 'b\x00' should be added, params blob just has to be null terminated + src_padded, params_padded = src.encode() + b'\x00'*(round_up(len(src) + 1, 4) - len(src)), params.encode() + b'\x00' + request = struct.pack(' self.max_total_threads: + exec_width = self.pipeline_state.threadExecutionWidth() + memory_length = self.pipeline_state.staticThreadgroupMemoryLength() + raise RuntimeError(f"local size {local_size} bigger than {self.max_total_threads} with exec width {exec_width} memory length {memory_length}") + # commandBuffer/computeCommandEncoder returns +0 (autoreleased), so we can retain here. + # https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html + command_buffer = self.dev.mtl_queue.commandBuffer().retained() + encoder = command_buffer.computeCommandEncoder().retained() + encoder.setComputePipelineState(self.pipeline_state) + for i,a in enumerate(bufs): encoder.setBuffer_offset_atIndex(a.buf, a.offset, i) + for a,(_,i,dt,_) in zip(vals, self.signature[len(bufs):]): + encoder.setBytes_length_atIndex(bytes(getattr(ctypes, f"c_int{dt.bitsize}")(a)), dt.itemsize, i) + encoder.dispatchThreadgroups_threadsPerThreadgroup(metal.MTLSize(*global_size), metal.MTLSize(*local_size)) + encoder.endEncoding() + command_buffer.setLabel(to_ns_str(self.name)) # TODO: is this always needed? + command_buffer.commit() + self.dev.mtl_buffers_in_flight.append(command_buffer) + if wait: + wait_check(command_buffer) + return command_buffer.GPUEndTime() - command_buffer.GPUStartTime() + +class MetalBuffer: + def __init__(self, buf:metal.MTLBuffer, size:int, offset=0): self.buf, self.size, self.offset = buf, size, offset + +class MetalAllocator(LRUAllocator[MetalDevice]): + def _alloc(self, size:int, options) -> MetalBuffer: + if options.external_ptr: return MetalBuffer(metal.MTLBuffer(options.external_ptr), size) + + # Buffer is explicitly released in _free() rather than garbage collected via reference count + ret = self.dev.sysdevice.newBufferWithLength_options(size, metal.MTLResourceStorageModeShared) + ret.retain = False + if ret.value is None: raise MemoryError(f"Metal OOM while allocating {size=}") + return MetalBuffer(ret, size) + @suppress_finalizing + def _free(self, opaque:MetalBuffer, options): + if not options.external_ptr: opaque.buf.release() + def _transfer(self, dest:MetalBuffer, src:MetalBuffer, sz:int, src_dev:MetalDevice, dest_dev:MetalDevice): + dest_dev.synchronize() + src_command_buffer = src_dev.mtl_queue.commandBuffer().retained() + encoder = src_command_buffer.blitCommandEncoder().retained() + encoder.copyFromBuffer_sourceOffset_toBuffer_destinationOffset_size(src.buf, src.offset, dest.buf, dest.offset, sz) + encoder.endEncoding() + if src_dev != dest_dev: + src_command_buffer.encodeSignalEvent_value(ctypes.cast(src_dev.timeline_signal, metal.MTLEvent), src_dev.timeline_value) + dest_command_buffer = dest_dev.mtl_queue.commandBuffer().retained() + dest_command_buffer.encodeWaitForEvent_value(ctypes.cast(src_dev.timeline_signal, metal.MTLEvent), src_dev.timeline_value) + dest_command_buffer.commit() + dest_dev.mtl_buffers_in_flight.append(dest_command_buffer) + src_dev.timeline_value += 1 + src_command_buffer.setLabel(to_ns_str(f"COPY {src_dev.device} -> {dest_dev.device}")) + src_command_buffer.commit() + src_dev.mtl_buffers_in_flight.append(src_command_buffer) + # Transfers currently synchronize the completion. Otherwise, copies can sometimes lead to incorrect values. + # There is no real metal multidevice support for now, so transfer is used only for tests. + src_dev.synchronize() + def _cp_mv(self, dst, src, prof_desc): + self.dev.synchronize() + with cpu_profile(prof_desc, f"{self.dev.device}:COPY"): dst[:] = src + def _as_buffer(self, src:MetalBuffer) -> memoryview: return to_mv(src.buf.contents(), src.size + src.offset)[src.offset:] + def _copyin(self, dest:MetalBuffer, src:memoryview): self._cp_mv(self._as_buffer(dest), src, "TINY -> METAL") + def _copyout(self, dest:memoryview, src:MetalBuffer): self._cp_mv(dest, self._as_buffer(src), "METAL -> TINY") + def _offset(self, buf:MetalBuffer, size:int, offset:int): return MetalBuffer(buf.buf, size, offset) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_npy.py b/artifacts/package_runtime/tinygrad/runtime/ops_npy.py new file mode 100644 index 000000000..b7ef4e47f --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_npy.py @@ -0,0 +1,11 @@ +import numpy as np +from tinygrad.helpers import flat_mv +from tinygrad.device import Compiled, Allocator + +class NpyAllocator(Allocator['NpyDevice']): + def _alloc(self, size:int, options=None) -> np.ndarray: return np.empty(size, dtype=np.uint8) + def _as_buffer(self, src:np.ndarray) -> memoryview: return flat_mv(np.require(src, requirements='C').data) + def _copyout(self, dest:memoryview, src:np.ndarray): dest[:] = self._as_buffer(src) + +class NpyDevice(Compiled): + def __init__(self, device:str): super().__init__(device, NpyAllocator(self), [], None) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_null.py b/artifacts/package_runtime/tinygrad/runtime/ops_null.py new file mode 100644 index 000000000..228ef917d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_null.py @@ -0,0 +1,57 @@ +import inspect, math +from tinygrad.device import Compiled, Allocator, ProfileGraphEntry, ProfileGraphEvent, Program, TinyELF +from tinygrad.engine.jit import MultiGraphRunner +from tinygrad.renderer import Renderer, cstyle, nir, ptx, llvmir, wgsl +from tinygrad.renderer.cstyle import CStyleLanguage +from tinygrad.uop.ops import UOp, Ops +from tinygrad.helpers import cpu_profile, getenv, dedup, NULL_ALLOW_COPYOUT, PROFILE, cpu_events, perf_counter_us + +class NullRenderer(CStyleLanguage): + has_local = False + float4 = "float4" + barrier = "// BARRIER" + code_for_op = {**CStyleLanguage.code_for_op, Ops.THREEFRY: lambda a,b,dtype: f"threefry({a},{b})", Ops.MAX: lambda a,b,dtype: f"max({a},{b})"} + def asm(self, prg: UOp, lin: UOp) -> bytes: + assert self.target.arch.startswith("gfx"), "only amd supports assembly" + from tinygrad.renderer.amd.elf import assemble_linear + return assemble_linear(prg, lin, self.target.arch) + +class NullProgram(Program['NullDevice']): + def __init__(self, dev:'NullDevice', obj:TinyELF): self.device, self.name = dev.device, obj.name + def __call__(self, *bufs, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), vals:tuple[int, ...]=(), wait=False, **kw): + with cpu_profile(self.name, self.device): return 1e-3 + +class NullAllocator(Allocator['NullDevice']): + def _alloc(self, size, options): pass + def _copyin(self, dest, src:memoryview): pass + def _copyout(self, dest:memoryview, src): + if not NULL_ALLOW_COPYOUT: raise RuntimeError("no copyout on NULL") + def _transfer(self, dest, src, sz:int, src_dev, dest_dev): + with cpu_profile(f"{src_dev.device} -> {dest_dev.device}", f"{src_dev.device}:SDMA:0"): pass + def _offset(self, buf, size:int, offset:int): pass + +class NullGraph(MultiGraphRunner): + def __call__(self, input_uops:tuple[UOp, ...], var_vals:dict[str, int], wait=False) -> float|None: + if PROFILE: + st, descs = perf_counter_us(), [] + event_count:dict[str, int] = {} + for (_,_,bufs,_),runtime in zip(self.calls, self.runtimes): + # description based on command, copied from HCQ graph + device = runtime.device if runtime is not None else f"{bufs[1].device}:SDMA:0" + descs.append((device, runtime.name if runtime is not None else f"{bufs[1].device} -> {bufs[0].device}", count:=event_count.get(device, 0))) + event_count[device] = count+1 + # pack events evenly per device + dur, sigs, ents = max(1, math.ceil((perf_counter_us()-st)/max(event_count.values()))), [], [] + for i,(device,name,count) in enumerate(descs): + sigs += [st+count*dur, st+(count+1)*dur] + ents.append(ProfileGraphEntry(device, name, 2*i, 2*i+1)) + cpu_events.append(ProfileGraphEvent(ents, [], sigs)) + return 1e-1 + +class NullDevice(Compiled): + def __init__(self, device:str): + assert (emu:=getenv("EMULATE", "")) == "", \ + "EMULATE is deprecated, use DEV=NULL:HIP:"+{"AMD":"gfx1100", "AMD_RDNA4":"gfx1201", "AMD_CDNA4":"gfx950"}.get(emu, "") + renderers = [NullRenderer] + [r for m in [cstyle, nir, ptx, llvmir, wgsl] for r in m.__dict__.values() + if inspect.isclass(r) and issubclass(r, Renderer)] + super().__init__(device, NullAllocator(self), dedup(renderers), NullProgram, NullGraph) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_nv.py b/artifacts/package_runtime/tinygrad/runtime/ops_nv.py new file mode 100644 index 000000000..2c274a6dd --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_nv.py @@ -0,0 +1,848 @@ +from __future__ import annotations +import os, ctypes, contextlib, re, functools, mmap, struct, array, sys, weakref +assert sys.platform != 'win32' +from typing import cast +from dataclasses import dataclass +from tinygrad.runtime.support.hcq import HCQCompiled, HCQAllocator, HCQBuffer, HWQueue, CLikeArgsState, HCQProgram, HCQSignal, BumpAllocator +from tinygrad.runtime.support.hcq import MMIOInterface, FileIOInterface, hcq_filter_visible_devices, hcq_profile +from tinygrad.uop.ops import sint +from tinygrad.device import Compiled, BufferSpec, TinyELF +from tinygrad.helpers import getenv, mv_address, round_up, data64, data64_le, prod, OSX, hi32, lo32, PROFILE, ContextVar, VIZ, ProfileEvent +from tinygrad.renderer.ptx import PTXRenderer +from tinygrad.renderer.cstyle import CUDARenderer, NVCCRenderer +from tinygrad.runtime.autogen import nv_570, nv_580, nv_610, mesa +from tinygrad.runtime.support.elf import elf_loader +from tinygrad.runtime.support.nv.nvdev import NVDev, NVMemoryManager +from tinygrad.runtime.support.system import System, PCIIfaceBase, MAP_FIXED +from tinygrad.renderer.nir import NAKRenderer +if getenv("IOCTL"): import extra.nv_gpu_driver.nv_ioctl # noqa: F401 # pylint: disable=unused-import + +nv_gpu = nv_570 # default to 570 + +PMA = ContextVar("PMA", abs(VIZ.value)>=2) + +@dataclass(frozen=True) +class ProfilePMAEvent(ProfileEvent): device:str; kern:str; blob:bytes; exec_tag:int # noqa: E702 + +class NVSignal(HCQSignal): + def _sleep(self, time_spent_since_last_sleep_ms:int): + # Reasonable to sleep for long workloads (which take more than 200ms) and only timeline signals. + if time_spent_since_last_sleep_ms > 200 and self.owner is not None: self.owner.iface.sleep(200) + +def get_error_str(status): return f"{status}: {nv_gpu.nv_status_codes.get(status, 'Unknown error')}" + +NV_PFAULT_FAULT_TYPE = {dt:name for name,dt in nv_gpu.__dict__.items() if name.startswith("NV_PFAULT_FAULT_TYPE_")} +NV_PFAULT_ACCESS_TYPE = {dt:name.split("_")[-1] for name,dt in nv_gpu.__dict__.items() if name.startswith("NV_PFAULT_ACCESS_TYPE_")} + +def nv_flags(reg, **kwargs): return functools.reduce(int.__or__, ((getattr(nv_gpu, f"{reg}_{k}_{v}".upper()) if isinstance(v, str) else v) << + getattr(nv_gpu, f"{reg}_{k}".upper())[1] for k, v in kwargs.items()), 0) + +def nv_iowr(fd:FileIOInterface, nr, args, cmd=None): + ret = fd.ioctl(cmd or ((3 << 30) | (ctypes.sizeof(args) & 0x1FFF) << 16 | (ord('F') & 0xFF) << 8 | (nr & 0xFF)), args) + if ret != 0: raise RuntimeError(f"ioctl returned {ret}") + +class QMD: + fields: dict[str, dict[str, tuple[int, int]]] = {} + + def __init__(self, dev:NVDevice, view:MMIOInterface|None=None, **kwargs): + self.ver, self.sz = (5, 0x60) if dev.iface.compute_class >= nv_gpu.BLACKWELL_COMPUTE_A else (3, 0x40) + + # Init fields from module + if (pref:="NVCEC0_QMDV05_00" if self.ver == 5 else "NVC6C0_QMDV03_00") not in QMD.fields: + QMD.fields[pref] = {**{name[len(pref)+1:]: dt for name,dt in nv_gpu.__dict__.items() if name.startswith(pref) and isinstance(dt, tuple)}, + **{name[len(pref)+1:]+f"_{i}": dt(i) for name,dt in nv_gpu.__dict__.items() for i in range(8) if name.startswith(pref) and callable(dt)}} + + self.mv, self.pref = (memoryview(bytearray(self.sz * 4)) if view is None else view), pref + if kwargs: self.write(**kwargs) + + def _rw_bits(self, hi:int, lo:int, value:int|None=None): + mask = ((1 << (width:=hi - lo + 1)) - 1) << (lo % 8) + num = int.from_bytes(self.mv[lo//8:hi//8+1], "little") + + if value is None: return (num & mask) >> (lo % 8) + + if value >= (1 << width): raise ValueError(f"{value:#x} does not fit.") + self.mv[lo//8:hi//8+1] = int((num & ~mask) | ((value << (lo % 8)) & mask)).to_bytes((hi//8 - lo//8 + 1), "little") + + def write(self, **kwargs): + for k,val in kwargs.items(): self._rw_bits(*QMD.fields[self.pref][k.upper()], value=val) # type: ignore [misc] + + def read(self, k, val=0): return self._rw_bits(*QMD.fields[self.pref][k.upper()]) + + def field_offset(self, k): return QMD.fields[self.pref][k.upper()][1] // 8 + + def set_constant_buf_addr(self, i, addr): + if self.ver < 4: self.write(**{f'constant_buffer_addr_upper_{i}':hi32(addr), f'constant_buffer_addr_lower_{i}':lo32(addr)}) + else: self.write(**{f'constant_buffer_addr_upper_shifted6_{i}':hi32(addr >> 6), f'constant_buffer_addr_lower_shifted6_{i}':lo32(addr >> 6)}) + +class NVCommandQueue(HWQueue[HCQSignal, 'NVDevice', 'NVProgram', 'NVArgsState']): + def __init__(self): + self.active_qmd = None + super().__init__() + + def __del__(self): + if self.binded_device is not None: self.binded_device.allocator.free(self.hw_page, self.hw_page.size, BufferSpec(cpu_access=True, nolru=True)) + + def nvm(self, subchannel, mthd, *args, typ=2): self.q((typ << 28) | (len(args) << 16) | (subchannel << 13) | (mthd >> 2), *args) + + def setup(self, compute_class=None, copy_class=None, local_mem_window=None, shared_mem_window=None, local_mem=None, local_mem_tpc_bytes=None): + if compute_class: self.nvm(1, nv_gpu.NVC6C0_SET_OBJECT, compute_class) + if copy_class: self.nvm(4, nv_gpu.NVC6C0_SET_OBJECT, copy_class) + if local_mem_window: self.nvm(1, nv_gpu.NVC6C0_SET_SHADER_LOCAL_MEMORY_WINDOW_A, *data64(local_mem_window)) + if shared_mem_window: self.nvm(1, nv_gpu.NVC6C0_SET_SHADER_SHARED_MEMORY_WINDOW_A, *data64(shared_mem_window)) + if local_mem: self.nvm(1, nv_gpu.NVC6C0_SET_SHADER_LOCAL_MEMORY_A, *data64(local_mem)) + if local_mem_tpc_bytes: self.nvm(1, nv_gpu.NVC6C0_SET_SHADER_LOCAL_MEMORY_NON_THROTTLED_A, *data64(local_mem_tpc_bytes), 0xff) + return self + + def wait(self, signal:HCQSignal, value:sint=0): + self.nvm(0, nv_gpu.NVC56F_SEM_ADDR_LO, *data64_le(signal.value_addr), *data64_le(value), + nv_flags("NVC56F_SEM_EXECUTE", operation="acq_circ_geq", payload_size="64bit")) + self.active_qmd = None + return self + + def timestamp(self, signal:HCQSignal): return self.signal(signal, 0) + + def bind(self, dev:NVDevice): + self.binded_device = dev + self.hw_page = dev.allocator.alloc(len(self._q) * 4, BufferSpec(cpu_access=True, nolru=True)) + hw_view = self.hw_page.cpu_view().view(fmt='I') + for i, value in enumerate(self._q): hw_view[i] = value + + # From now on, the queue is on the device for faster submission. + self._q = hw_view + + def _submit_to_gpfifo(self, dev:NVDevice, gpfifo:GPFifo): + if dev == self.binded_device: cmdq_addr = self.hw_page.va_addr + else: + cmdq_addr = dev.cmdq_allocator.alloc(len(self._q) * 4, 16) + cmdq_wptr = (cmdq_addr - dev.cmdq_page.va_addr) // 4 + dev.cmdq[cmdq_wptr : cmdq_wptr + len(self._q)] = array.array('I', self._q) + + gpfifo.ring[gpfifo.put_value % gpfifo.entries_count] = (cmdq_addr//4 << 2) | (len(self._q) << 42) | (1 << 41) + gpfifo.gpput[0] = (gpfifo.put_value + 1) % gpfifo.entries_count + + System.memory_barrier() + dev.gpu_mmio[0x90 // 4] = gpfifo.token + gpfifo.put_value += 1 + +class NVComputeQueue(NVCommandQueue): + def memory_barrier(self): + self.nvm(1, nv_gpu.NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI, + nv_flags("NVC6C0_INVALIDATE_SHADER_CACHES_NO_WFI", instruction="true", global_data="true", constant="true")) + self.active_qmd:QMD|None = None + return self + + def exec(self, prg:NVProgram, args_state:NVArgsState, global_size:tuple[sint, ...], local_size:tuple[sint, ...]): + self.bind_args_state(args_state) + + qmd_buf = args_state.buf.offset(round_up(prg.constbufs[0][1], 1 << 8)) + qmd_buf.cpu_view().view(size=prg.qmd.mv.nbytes, fmt='B')[:] = prg.qmd.mv + assert qmd_buf.va_addr < (1 << 40), f"large qmd addr {qmd_buf.va_addr:x}" + + qmd = QMD(dev=prg.dev, view=qmd_buf.cpu_view()) # Save qmd for later update + + self.bind_sints_to_mem(*global_size, mem=qmd_buf.cpu_view(), fmt='I', offset=qmd.field_offset('cta_raster_width' if qmd.ver<4 else 'grid_width')) + self.bind_sints_to_mem(*(local_size[:2]), mem=qmd_buf.cpu_view(), fmt='H', offset=qmd.field_offset('cta_thread_dimension0')) + self.bind_sints_to_mem(local_size[2], mem=qmd_buf.cpu_view(), fmt='B', offset=qmd.field_offset('cta_thread_dimension2')) + qmd.set_constant_buf_addr(0, args_state.buf.va_addr) + + if self.active_qmd is None: + if prg.dev.pma_enabled: self.nvm(1, nv_gpu.NVC6C0_PM_TRIGGER, 0) + self.nvm(1, nv_gpu.NVC6C0_SEND_PCAS_A, qmd_buf.va_addr >> 8) + self.nvm(1, nv_gpu.NVC6C0_SEND_SIGNALING_PCAS2_B, 9) + else: + self.active_qmd.write(dependent_qmd0_pointer=qmd_buf.va_addr >> 8, dependent_qmd0_action=1, dependent_qmd0_prefetch=1, dependent_qmd0_enable=1) + + self.active_qmd, self.active_qmd_buf = qmd, qmd_buf + return self + + def signal(self, signal:HCQSignal, value:sint=0): + if self.active_qmd is not None: + for i in range(2): + if self.active_qmd.read(f'release{i}_enable') == 0: + self.active_qmd.write(**{f'release{i}_enable': 1}) + + addr_off = self.active_qmd.field_offset(f'release{i}_address_lower' if self.active_qmd.ver<4 else f'release_semaphore{i}_addr_lower') + self.bind_sints_to_mem(signal.value_addr & 0xffffffff, mem=self.active_qmd_buf.cpu_view(), fmt='I', offset=addr_off) + self.bind_sints_to_mem(signal.value_addr >> 32, mem=self.active_qmd_buf.cpu_view(), fmt='I', mask=0xf, offset=addr_off+4) + + val_off = self.active_qmd.field_offset(f'release{i}_payload_lower' if self.active_qmd.ver<4 else f'release_semaphore{i}_payload_lower') + self.bind_sints_to_mem(value & 0xffffffff, mem=self.active_qmd_buf.cpu_view(), fmt='I', offset=val_off) + self.bind_sints_to_mem(value >> 32, mem=self.active_qmd_buf.cpu_view(), fmt='I', offset=val_off+4) + return self + + self.nvm(0, nv_gpu.NVC56F_SEM_ADDR_LO, *data64_le(signal.value_addr), *data64_le(value), + nv_flags("NVC56F_SEM_EXECUTE", operation="release", release_wfi="en", payload_size="64bit", release_timestamp="en")) + self.nvm(0, nv_gpu.NVC56F_NON_STALL_INTERRUPT, 0x0) + self.active_qmd = None + return self + + def write(self, b:HCQBuffer, val:sint, b64:bool=False): + self.nvm(0, nv_gpu.NVC56F_SEM_ADDR_LO, *data64_le(b.va_addr), *data64_le(val), + nv_flags("NVC56F_SEM_EXECUTE", operation="release", release_wfi="en", payload_size="64bit" if b64 else "32bit")) + self.active_qmd = None + return self + + def poll_bit(self, b:HCQBuffer, val:sint, mask:int): + self.nvm(0, nv_gpu.NVC56F_SEM_ADDR_LO, *data64_le(b.va_addr), *data64_le((~mask & 0xFFFFFFFF) if val == 0 else val), + nv_flags("NVC56F_SEM_EXECUTE", operation="acq_nor" if val == 0 else "acq_and", payload_size="32bit")) + self.active_qmd = None + return self + + def _submit(self, dev:NVDevice): self._submit_to_gpfifo(dev, dev.compute_gpfifo) + +class NVCopyQueue(NVCommandQueue): + def __init__(self, queue_idx=0): + self.queue_idx = queue_idx + super().__init__() + + def copy(self, dest:HCQBuffer, src:HCQBuffer, copy_size:int): + for off in range(0, copy_size, step:=(1 << 31)): + self.nvm(4, nv_gpu.NVC6B5_OFFSET_IN_UPPER, *data64(src.va_addr+off), *data64(dest.va_addr+off)) + self.nvm(4, nv_gpu.NVC6B5_LINE_LENGTH_IN, min(copy_size-off, step)) + self.nvm(4, nv_gpu.NVC6B5_LAUNCH_DMA, + nv_flags("NVC6B5_LAUNCH_DMA", data_transfer_type="non_pipelined", src_memory_layout="pitch", dst_memory_layout="pitch")) + return self + + def signal(self, signal:HCQSignal, value:sint=0): + self.nvm(4, nv_gpu.NVC6B5_SET_SEMAPHORE_A, *data64(signal.value_addr), value) + self.nvm(4, nv_gpu.NVC6B5_LAUNCH_DMA, nv_flags("NVC6B5_LAUNCH_DMA", flush_enable="true", semaphore_type="release_four_word_semaphore")) + return self + + def _submit(self, dev:NVDevice): self._submit_to_gpfifo(dev, dev.dma_gpfifo) + +class NVVideoQueue(NVCommandQueue): + def decode_hevc_chunk(self, pic_desc:HCQBuffer, in_buf:HCQBuffer, out_buf:HCQBuffer, out_buf_pos:int, hist_bufs:list[HCQBuffer], hist_pos:list[int], + chroma_off:int, coloc_buf:HCQBuffer, filter_buf:HCQBuffer, intra_top_off:int, intra_unk_off:int|None, status_buf:HCQBuffer): + self.nvm(4, nv_gpu.NVC9B0_SET_APPLICATION_ID, nv_gpu.NVC9B0_SET_APPLICATION_ID_ID_HEVC) + self.nvm(4, nv_gpu.NVC9B0_SET_CONTROL_PARAMS, nv_flags("NVC9B0_SET_CONTROL_PARAMS", codec_type="hevc", testrun_env="prod_run", gptimer_on=1, + err_conceal_on=1, mbtimer_on=1, event_trace_logging_on=1)) + self.nvm(4, nv_gpu.NVC9B0_SET_DRV_PIC_SETUP_OFFSET, pic_desc.va_addr >> 8) + self.nvm(4, nv_gpu.NVC9B0_SET_IN_BUF_BASE_OFFSET, in_buf.va_addr >> 8) + for pos, buf in zip(hist_pos + [out_buf_pos], hist_bufs + [out_buf]): + self.nvm(4, nv_gpu.NVC9B0_SET_PICTURE_LUMA_OFFSET0 + pos*4, buf.va_addr >> 8) + self.nvm(4, nv_gpu.NVC9B0_SET_PICTURE_CHROMA_OFFSET0 + pos*4, buf.offset(chroma_off).va_addr >> 8) + self.nvm(4, nv_gpu.NVC9B0_SET_COLOC_DATA_OFFSET, coloc_buf.va_addr >> 8) + self.nvm(4, nv_gpu.NVC9B0_SET_NVDEC_STATUS_OFFSET, status_buf.va_addr >> 8) + self.nvm(4, nv_gpu.NVC9B0_HEVC_SET_TILE_SIZES_OFFSET, pic_desc.offset(0x200).va_addr >> 8) + self.nvm(4, nv_gpu.NVC9B0_HEVC_SET_FILTER_BUFFER_OFFSET, filter_buf.va_addr >> 8) + self.nvm(4, nv_gpu.NVC9B0_SET_INTRA_TOP_BUF_OFFSET, (filter_buf.va_addr + intra_top_off) >> 8) + if intra_unk_off is not None: self.nvm(4, 0x4dc, (filter_buf.va_addr + intra_unk_off) >> 8) + self.nvm(4, nv_gpu.NVC9B0_EXECUTE, 0) + return self + + def signal(self, signal:HCQSignal, value:sint=0): + self.nvm(4, nv_gpu.NVC9B0_SEMAPHORE_A, *data64(signal.value_addr), value) + self.nvm(4, nv_gpu.NVC9B0_SEMAPHORE_D, nv_flags("NVC9B0_SEMAPHORE_D", structure_size="four", payload_size="64bit")) + return self + + def _submit(self, dev:NVDevice): self._submit_to_gpfifo(dev, dev.vid_gpfifo) + +class NVArgsState(CLikeArgsState): + def __init__(self, buf:HCQBuffer, prg:NVProgram, bufs:tuple[HCQBuffer, ...], vals:tuple[int, ...]=()): + if (is_mock:=isinstance(prg.dev.iface, MOCKIface)): prg.cbuf_0[80:82] = [len(bufs), len(vals)] + super().__init__(buf, prg, bufs, vals=() if is_mock else vals, prefix=prg.cbuf_0 or None) + # mock expects all vars to be 64 bit + if is_mock and vals: self.bind_sints_to_buf(*vals, buf=self.buf, fmt='q', offset=len(prg.cbuf_0)*4 + len(bufs)*8) + +class NVProgram(HCQProgram['NVDevice']): + def __init__(self, dev:NVDevice, obj:TinyELF): + self.dev, self.name, self.lib = dev, obj.name, obj.lib + self.constbufs: dict[int, tuple[int, int]] = {0: (0, 0x160)} # dict[constbuf index, tuple[va_addr, size]] + + if (NAK:=isinstance(dev.renderer, NAKRenderer)): + image, self.cbuf_0 = memoryview(bytearray(obj.lib[ctypes.sizeof(info:=mesa.struct_nak_shader_info.from_buffer_copy(obj.lib)):])), [] + self.regs_usage, self.shmem_usage, self.lcmem_usage = info.num_gprs, round_up(info.cs.smem_size, 128), round_up(info.slm_size, 16) + elif isinstance(dev.iface, MOCKIface): image, sections, relocs = memoryview(bytearray(obj.lib) + b'\x00' * (4 - len(obj.lib)%4)).cast("I"), [], [] # type: ignore + else: image, sections, relocs = elf_loader(self.lib, force_section_align=128) + # NOTE: Ensure at least 4KB of space after the program to mitigate prefetch memory faults. + self.lib_gpu = self.dev.allocator.alloc(round_up((prog_sz:=image.nbytes), 0x1000) + 0x1000, buf_spec:=BufferSpec(nolru=True)) + prog_addr = self.lib_gpu.va_addr + if not NAK: + # For MOCKGPU, the lib is PTX code, so some values are emulated. + self.regs_usage, self.shmem_usage, self.lcmem_usage, cbuf0_size = 0, 0x400, 0x240, 0x160 if isinstance(dev.iface, MOCKIface) else 0 + for sh in sections: # pylint: disable=possibly-used-before-assignment + if sh.name == f".nv.shared.{self.name}": self.shmem_usage = round_up(0x400 + sh.header.sh_size, 128) + if sh.name == f".text.{self.name}": prog_addr, prog_sz = self.lib_gpu.va_addr+sh.header.sh_addr, sh.header.sh_size + elif m:=re.match(r'\.nv\.constant(\d+)', sh.name): + self.constbufs[int(m.group(1))] = (self.lib_gpu.va_addr+sh.header.sh_addr, sh.header.sh_size) + elif sh.name.startswith(".nv.info"): + for typ, param, data in self._parse_elf_info(sh): + if sh.name == f".nv.info.{obj.name}" and param == 0xa: cbuf0_size = struct.unpack_from("IH", data)[1] # EIATTR_PARAM_CBANK + elif sh.name == ".nv.info" and param == 0x12: self.lcmem_usage = struct.unpack_from("II", data)[1] + 0x240 # EIATTR_MIN_STACK_SIZE + elif sh.name == ".nv.info" and param == 0x2f: self.regs_usage = struct.unpack_from("II", data)[1] # EIATTR_REGCOUNT + + # Apply relocs + for apply_image_offset, rel_sym_offset, typ, _ in relocs: # pylint: disable=possibly-used-before-assignment + # These types are CUDA-specific, applying them here + if typ == 2: image[apply_image_offset:apply_image_offset+8] = struct.pack('> 32) + else: raise RuntimeError(f"unknown NV reloc {typ}") + + # Minimum cbuf_0 size for driver params: Blackwell needs index 223 (224 entries), older GPUs need index 11 (12 entries) + min_cbuf0_entries = 224 if dev.iface.compute_class >= nv_gpu.BLACKWELL_COMPUTE_A else 12 + self.cbuf_0 = [0] * max(cbuf0_size // 4, min_cbuf0_entries) + + # Ensure device has enough local memory to run the program + self.dev._ensure_has_local_memory(self.lcmem_usage) + self.dev.allocator._copyin(self.lib_gpu, image) + self.dev.synchronize() + + if dev.iface.compute_class >= nv_gpu.BLACKWELL_COMPUTE_A: + if not NAK: self.cbuf_0[188:192], self.cbuf_0[223] = [*data64_le(self.dev.shared_mem_window), *data64_le(self.dev.local_mem_window)], 0xfffdc0 + qmd = {'qmd_major_version':5, 'qmd_type':nv_gpu.NVCEC0_QMDV05_00_QMD_TYPE_GRID_CTA, 'program_address_upper_shifted4':hi32(prog_addr>>4), + 'program_address_lower_shifted4':lo32(prog_addr>>4), 'register_count':self.regs_usage, 'shared_memory_size_shifted7':self.shmem_usage>>7, + f'shader_local_memory_{"low" if NAK else "high"}_size_shifted4': self.dev.slm_per_thread>>4} + else: + if not NAK: self.cbuf_0[6:12] = [*data64_le(self.dev.shared_mem_window), *data64_le(self.dev.local_mem_window), *data64_le(0xfffdc0)] + qmd = {'qmd_major_version':3, 'sm_global_caching_enable':1, 'program_address_upper':hi32(prog_addr), 'program_address_lower':lo32(prog_addr), + 'shared_memory_size':self.shmem_usage, 'register_count_v':self.regs_usage, + f'shader_local_memory_{"low" if NAK else "high"}_size':self.dev.slm_per_thread} + + smem_cfg = min(shmem_conf * 1024 for shmem_conf in [32, 64, 100] if shmem_conf * 1024 >= self.shmem_usage) // 4096 + 1 + + self.qmd:QMD = QMD(dev, **qmd, qmd_group_id=0x3f, invalidate_texture_header_cache=1, invalidate_texture_sampler_cache=1, + invalidate_texture_data_cache=1, invalidate_shader_data_cache=1, api_visible_call_limit=1, sampler_index=1, barrier_count=1, + cwd_membar_type=nv_gpu.NVC6C0_QMDV03_00_CWD_MEMBAR_TYPE_L1_SYSMEMBAR, constant_buffer_invalidate_0=1, min_sm_config_shared_mem_size=smem_cfg, + target_sm_config_shared_mem_size=smem_cfg, max_sm_config_shared_mem_size=0x1a, program_prefetch_size=min(prog_sz>>8, 0x1ff), + sass_version=dev.sass_version, program_prefetch_addr_upper_shifted=prog_addr>>40, program_prefetch_addr_lower_shifted=prog_addr>>8) + + for i,(addr,sz) in self.constbufs.items(): + self.qmd.set_constant_buf_addr(i, addr) + self.qmd.write(**{f'constant_buffer_size_shifted4_{i}': sz, f'constant_buffer_valid_{i}': 1}) + + # Registers allocation granularity per warp is 256, warp allocation granularity is 4. Register file size is 65536. + self.max_threads = ((65536 // round_up(max(1, self.regs_usage) * 32, 256)) // 4) * 4 * 32 + + # NV's kernargs is constbuffer, then arguments to the kernel follows. Kernargs also appends QMD at the end of the kernel. + super().__init__(NVArgsState, self.dev, obj, kernargs_alloc_size=round_up(self.constbufs[0][1], 1 << 8) + (8 << 8)) + weakref.finalize(self, self._fini, self.dev, self.lib_gpu, buf_spec) + + def _parse_elf_info(self, sh, start_off=0): + while start_off < sh.header.sh_size: + typ, param, sz = struct.unpack_from("BBH", sh.content, start_off) + yield typ, param, sh.content[start_off+4:start_off+sz+4] if typ == 0x4 else sz + start_off += (sz if typ == 0x4 else 0) + 4 + + def __call__(self, *bufs, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), vals:tuple[int|None, ...]=(), + wait=False, timeout:int|None=None): + if prod(local_size) > 1024 or self.max_threads < prod(local_size) or self.lcmem_usage > self.dev.slm_per_thread: + raise RuntimeError(f"Too many resources requested for launch, {prod(local_size)=}, {self.max_threads=}") + if any(cur > mx for cur,mx in zip(global_size, [2147483647, 65535, 65535])) or any(cur > mx for cur,mx in zip(local_size, [1024, 1024, 64])): + raise RuntimeError(f"Invalid global/local dims {global_size=}, {local_size=}") + res = super().__call__(*bufs, global_size=global_size, local_size=local_size, vals=vals, wait=wait, timeout=timeout) + if self.dev.pma_enabled: + self.dev.synchronize() + if pma_blob:=self.dev._prof_readback(): + Compiled.profile_events += [ProfilePMAEvent(self.dev.device, self.name, pma_blob, self.dev.prof_exec_counter)] + return res + +class NVAllocator(HCQAllocator['NVDevice']): + def _alloc(self, size:int, options:BufferSpec) -> HCQBuffer: + return self.dev.iface.alloc(size, cpu_access=options.cpu_access, host=options.host) + + def _do_free(self, opaque:HCQBuffer, options:BufferSpec): self.dev.iface.free(opaque) + + def _do_map(self, buf:HCQBuffer): return self.dev.iface.map(buf._base if buf._base is not None else buf) + + def _encode_decode(self, bufout:HCQBuffer, bufin:HCQBuffer, desc_buf:HCQBuffer, hist:list[HCQBuffer], shape:tuple[int,...], frame_pos:int): + assert all(h.va_addr % 0x100 == 0 for h in hist + [bufin, bufout, desc_buf]), "all buffers must be 0x100 aligned" + + h, w = ((2 * shape[0]) // 3 if shape[0] % 3 == 0 else (2 * shape[0] - 1) // 3), shape[1] + self.dev._ensure_has_vid_hw(w, h) + + q = NVVideoQueue().wait(self.dev.timeline_signal, self.dev.timeline_value - 1) + with hcq_profile(self.dev, queue=q, desc="HEVC Decode", enabled=PROFILE, dev_suff="NVDEC"): + q.decode_hevc_chunk(desc_buf, bufin, bufout, frame_pos, hist, [(frame_pos-x) % (len(hist) + 1) for x in range(len(hist), 0, -1)], + round_up(w, 64)*round_up(h, 64), self.dev.vid_coloc_buf, self.dev.vid_filter_buf, self.dev.intra_top_off, + self.dev.intra_unk_off, self.dev.vid_stat_buf) + q.signal(self.dev.timeline_signal, self.dev.next_timeline()).submit(self.dev) + +@dataclass +class GPFifo: + ring: MMIOInterface + gpput: MMIOInterface + entries_count: int + token: int + put_value: int = 0 + +class NVKIface: + root = None + fd_ctl: FileIOInterface + fd_uvm: FileIOInterface + count: int + gpus_info: list|ctypes.Array = [] + + # TODO: Need a proper allocator for va addresses + # 0x1000000000 - 0x2000000000, reserved for system/cpu mappings + # VA space is 48bits. + low_uvm_vaddr_allocator: BumpAllocator = BumpAllocator(size=0x1000000000, base=0x8000000000 if OSX else 0x1000000000, wrap=False) + uvm_vaddr_allocator: BumpAllocator = BumpAllocator(size=(1 << 48) - 1, base=low_uvm_vaddr_allocator.base + low_uvm_vaddr_allocator.size, wrap=False) + host_object_enumerator: int = 0x1000 + + def __init__(self, dev, device_id): + if NVKIface.root is None: + global nv_gpu + + NVKIface.fd_ctl = FileIOInterface("/dev/nvidiactl", os.O_RDWR | os.O_CLOEXEC) + NVKIface.fd_uvm = FileIOInterface("/dev/nvidia-uvm", os.O_RDWR | os.O_CLOEXEC) + self.fd_uvm_2 = FileIOInterface("/dev/nvidia-uvm", os.O_RDWR | os.O_CLOEXEC) + NVKIface.root = self.rm_alloc(0, nv_gpu.NV01_ROOT_CLIENT, None, root=0) + + drvver = self.rm_control(self.root, nv_gpu.NV0000_CTRL_CMD_SYSTEM_GET_BUILD_VERSION_V2, nv_gpu.NV0000_CTRL_SYSTEM_GET_BUILD_VERSION_V2_PARAMS()) + if int(drvver.driverVersionBuffer.decode().split('.')[0], 10) >= 610: nv_gpu = nv_610 + elif int(drvver.driverVersionBuffer.decode().split('.')[0], 10) >= 580: nv_gpu = nv_580 + + self.uvm(nv_gpu.UVM_INITIALIZE, nv_gpu.UVM_INITIALIZE_PARAMS()) + + # this error is okay, CUDA hits it too + with contextlib.suppress(RuntimeError): self.uvm(nv_gpu.UVM_MM_INITIALIZE, nv_gpu.UVM_MM_INITIALIZE_PARAMS(uvmFd=self.fd_uvm.fd), self.fd_uvm_2) + + nv_iowr(NVKIface.fd_ctl, nv_gpu.NV_ESC_CARD_INFO, gpus_info:=(nv_gpu.nv_ioctl_card_info_t*64)()) + NVKIface.gpus_info = hcq_filter_visible_devices([gi for gi in gpus_info if gi.valid], "NV") + NVKIface.count = len(NVKIface.gpus_info) + + self.dev, self.device_id = dev, device_id + if self.device_id >= len(NVKIface.gpus_info) or not NVKIface.gpus_info[self.device_id].valid: + raise RuntimeError(f"No device found for {device_id}. Requesting more devices than the system has?") + + self.fd_dev = self._new_gpu_fd() + self.gpu_info = self.rm_control(self.root, nv_gpu.NV0000_CTRL_CMD_GPU_GET_ID_INFO_V2, + nv_gpu.NV0000_CTRL_GPU_GET_ID_INFO_V2_PARAMS(gpuId=NVKIface.gpus_info[self.device_id].gpu_id)) + self.gpu_minor = NVKIface.gpus_info[self.device_id].minor_number + self.gpu_instance = self.gpu_info.deviceInstance + + def rm_alloc(self, parent, clss, params=None, root=None) -> int: + nv_iowr(self.fd_ctl, nv_gpu.NV_ESC_RM_ALLOC, made:=nv_gpu.NVOS21_PARAMETERS(hRoot=root if root is not None else self.root, + hObjectParent=parent, hClass=clss, pAllocParms=ctypes.cast(ctypes.byref(params), ctypes.c_void_p) if params is not None else None)) + if made.status == nv_gpu.NV_ERR_NO_MEMORY: raise MemoryError(f"rm_alloc returned {get_error_str(made.status)}") + if made.status != 0: raise RuntimeError(f"rm_alloc returned {get_error_str(made.status)}") + return made.hObjectNew + + def rm_control(self, obj, cmd, params=None, **kwargs): + nv_iowr(self.fd_ctl, nv_gpu.NV_ESC_RM_CONTROL, made:=nv_gpu.NVOS54_PARAMETERS(hClient=self.root, hObject=obj, cmd=cmd, + paramsSize=ctypes.sizeof(params) if params is not None else 0, + params=ctypes.cast(ctypes.byref(params), ctypes.c_void_p) if params is not None else None)) + if made.status != 0: raise RuntimeError(f"rm_control returned {get_error_str(made.status)}") + return params + + def uvm(self, cmd, params, fd=None): + nv_iowr(fd or self.fd_uvm, None, params, cmd=cmd) + if params.rmStatus != 0: raise RuntimeError(f"uvm returned {get_error_str(params.rmStatus)}") + + def setup_usermode(self): + clsnum = self.rm_control(self.dev.nvdevice, nv_gpu.NV0080_CTRL_CMD_GPU_GET_CLASSLIST, nv_gpu.NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS(numClasses=0)) + clsinfo = self.rm_control(self.dev.nvdevice, nv_gpu.NV0080_CTRL_CMD_GPU_GET_CLASSLIST, nv_gpu.NV0080_CTRL_GPU_GET_CLASSLIST_PARAMS( + numClasses=clsnum.numClasses, classList=mv_address(classlist:=memoryview(bytearray(clsnum.numClasses * 4)).cast('I')))) + self.nvclasses = {classlist[i] for i in range(clsinfo.numClasses)} + self.usermode_class:int = next(c for c in [nv_gpu.HOPPER_USERMODE_A, nv_gpu.TURING_USERMODE_A] if c in self.nvclasses) + self.gpfifo_class:int = next(c for c in [nv_gpu.BLACKWELL_CHANNEL_GPFIFO_A, nv_gpu.AMPERE_CHANNEL_GPFIFO_A] if c in self.nvclasses) + self.compute_class:int = next(c for c in [nv_gpu.BLACKWELL_COMPUTE_B, nv_gpu.ADA_COMPUTE_A, nv_gpu.AMPERE_COMPUTE_B] if c in self.nvclasses) + self.dma_class:int = next(c for c in [nv_gpu.BLACKWELL_DMA_COPY_B, nv_gpu.AMPERE_DMA_COPY_B] if c in self.nvclasses) + self.viddec_class:int|None = next((c for c in [nv_gpu.NVCFB0_VIDEO_DECODER, nv_gpu.NVC9B0_VIDEO_DECODER] if c in self.nvclasses), None) + + usermode = self.rm_alloc(self.dev.subdevice, self.usermode_class) + return usermode, MMIOInterface(self._gpu_map_to_cpu(usermode, mmio_sz:=0x10000), mmio_sz, fmt='I') + + def setup_vm(self, vaspace): + self.rm_control(self.dev.subdevice, nv_gpu.NV2080_CTRL_CMD_GPU_GET_GID_INFO, raw_uuid:=nv_gpu.NV2080_CTRL_GPU_GET_GID_INFO_PARAMS( + flags=nv_gpu.NV2080_GPU_CMD_GPU_GET_GID_FLAGS_FORMAT_BINARY, length=16)) + self.gpu_uuid = nv_gpu.struct_nv_uuid(uuid=(ctypes.c_ubyte*16)(*[raw_uuid.data[i] for i in range(16)])) + + self.uvm(nv_gpu.UVM_REGISTER_GPU, nv_gpu.UVM_REGISTER_GPU_PARAMS(rmCtrlFd=-1, gpu_uuid=self.gpu_uuid)) + self.uvm(nv_gpu.UVM_REGISTER_GPU_VASPACE, nv_gpu.UVM_REGISTER_GPU_VASPACE_PARAMS( + gpuUuid=self.gpu_uuid, rmCtrlFd=self.fd_ctl.fd, hClient=self.root, hVaSpace=vaspace)) + + for dev in [d for pg in HCQCompiled.peer_groups.values() for d in pg if isinstance(d, NVDevice) and not d.is_nvd()]: + try: self.uvm(nv_gpu.UVM_ENABLE_PEER_ACCESS, nv_gpu.UVM_ENABLE_PEER_ACCESS_PARAMS(gpuUuidA=self.gpu_uuid, gpuUuidB=dev.iface.gpu_uuid)) + except RuntimeError as e: raise RuntimeError(f"{e}. Make sure GPUs #{self.gpu_minor} & #{dev.iface.gpu_minor} have P2P enabled.") from e + + def setup_gpfifo_vm(self, gpfifo): + self.uvm(nv_gpu.UVM_REGISTER_CHANNEL, nv_gpu.UVM_REGISTER_CHANNEL_PARAMS(gpuUuid=self.gpu_uuid, rmCtrlFd=self.fd_ctl.fd, hClient=self.root, + hChannel=gpfifo, base=self._alloc_gpu_vaddr(0x4000000, force_low=True), length=0x4000000)) + + def _new_gpu_fd(self): + fd_dev = FileIOInterface(f"/dev/nvidia{NVKIface.gpus_info[self.device_id].minor_number}", os.O_RDWR | os.O_CLOEXEC) + nv_iowr(fd_dev, nv_gpu.NV_ESC_REGISTER_FD, nv_gpu.nv_ioctl_register_fd_t(ctl_fd=self.fd_ctl.fd)) + return fd_dev + + def _gpu_map_to_cpu(self, memory_handle, size, target=None, flags=0, system=False): + fd_dev = self._new_gpu_fd() if not system else FileIOInterface("/dev/nvidiactl", os.O_RDWR | os.O_CLOEXEC) + made = nv_gpu.nv_ioctl_nvos33_parameters_with_fd(fd=fd_dev.fd, + params=nv_gpu.NVOS33_PARAMETERS(hClient=self.root, hDevice=self.dev.nvdevice, hMemory=memory_handle, length=size, flags=flags)) + nv_iowr(self.fd_ctl, nv_gpu.NV_ESC_RM_MAP_MEMORY, made) + if made.params.status != 0: raise RuntimeError(f"_gpu_map_to_cpu returned {get_error_str(made.params.status)}") + return fd_dev.mmap(target, size, mmap.PROT_READ|mmap.PROT_WRITE, mmap.MAP_SHARED | (MAP_FIXED if target is not None else 0), 0) + + def alloc(self, size:int, host=False, uncached=False, cpu_access=False, contiguous=False, map_flags=0, cpu_addr=None, **kwargs) -> HCQBuffer: + # Uncached memory is "system". Use huge pages only for gpu memory. + page_size = mmap.PAGESIZE if uncached or host else ((2 << 20) if size >= (8 << 20) else (mmap.PAGESIZE if isinstance(self, MOCKIface) else + 4 << 10)) + size = round_up(size, page_size) + va_addr = self._alloc_gpu_vaddr(size, alignment=page_size, force_low=cpu_access) if (alloced:=cpu_addr is None) else cpu_addr + + if host: + if alloced: va_addr = FileIOInterface.anon_mmap(va_addr, size, mmap.PROT_READ|mmap.PROT_WRITE, MAP_FIXED|mmap.MAP_SHARED|mmap.MAP_ANONYMOUS, 0) + + flags = (nv_gpu.NVOS02_FLAGS_PHYSICALITY_NONCONTIGUOUS << 4) | (nv_gpu.NVOS02_FLAGS_COHERENCY_CACHED << 12) \ + | (nv_gpu.NVOS02_FLAGS_MAPPING_NO_MAP << 30) + + NVKIface.host_object_enumerator += 1 + made = nv_gpu.nv_ioctl_nvos02_parameters_with_fd(params=nv_gpu.NVOS02_PARAMETERS(hRoot=self.root, hObjectParent=self.dev.nvdevice, flags=flags, + hObjectNew=NVKIface.host_object_enumerator, hClass=nv_gpu.NV01_MEMORY_SYSTEM_OS_DESCRIPTOR, pMemory=va_addr, limit=size-1), fd=-1) + nv_iowr(self.fd_dev, nv_gpu.NV_ESC_RM_ALLOC_MEMORY, made) + + if made.params.status != 0: raise RuntimeError(f"host alloc returned {get_error_str(made.params.status)}") + mem_handle = made.params.hObjectNew + else: + attr = ((nv_gpu.NVOS32_ATTR_PHYSICALITY_CONTIGUOUS if contiguous else nv_gpu.NVOS32_ATTR_PHYSICALITY_ALLOW_NONCONTIGUOUS) << 27) \ + | (nv_gpu.NVOS32_ATTR_PAGE_SIZE_HUGE if page_size > 0x1000 else 0) << 23 | ((nv_gpu.NVOS32_ATTR_LOCATION_PCI if uncached else 0) << 25) + + attr2 = ((nv_gpu.NVOS32_ATTR2_GPU_CACHEABLE_NO if uncached else nv_gpu.NVOS32_ATTR2_GPU_CACHEABLE_YES) << 2) \ + | ((nv_gpu.NVOS32_ATTR2_PAGE_SIZE_HUGE_2MB if page_size > 0x1000 else 0) << 20) | nv_gpu.NVOS32_ATTR2_ZBC_PREFER_NO_ZBC \ + | ((nv_gpu.NVOS32_ATTR2_PROTECTION_USER_READ_ONLY << 22) if kwargs.get('read_only') else 0) + + fl = nv_gpu.NVOS32_ALLOC_FLAGS_MAP_NOT_REQUIRED | nv_gpu.NVOS32_ALLOC_FLAGS_MEMORY_HANDLE_PROVIDED | nv_gpu.NVOS32_ALLOC_FLAGS_ALIGNMENT_FORCE \ + | nv_gpu.NVOS32_ALLOC_FLAGS_IGNORE_BANK_PLACEMENT | (nv_gpu.NVOS32_ALLOC_FLAGS_PERSISTENT_VIDMEM if not uncached else 0) + + alloc_func = nv_gpu.NV1_MEMORY_SYSTEM if uncached else nv_gpu.NV1_MEMORY_USER + alloc_params = nv_gpu.NV_MEMORY_ALLOCATION_PARAMS(owner=self.root, alignment=page_size, offset=0, limit=size-1, format=6, size=size, + type=nv_gpu.NVOS32_TYPE_NOTIFIER if uncached else nv_gpu.NVOS32_TYPE_IMAGE, attr=attr, attr2=attr2, flags=fl) + mem_handle = self.rm_alloc(self.dev.nvdevice, alloc_func, alloc_params) + + if cpu_access: va_addr = self._gpu_map_to_cpu(mem_handle, size, target=va_addr, flags=map_flags, system=uncached) + + return self._gpu_uvm_map(va_addr, size, mem_handle, has_cpu_mapping=cpu_access or host) + + def free(self, mem:HCQBuffer): + if mem.owner != self.dev: return + if mem.meta.hMemory > NVKIface.host_object_enumerator: # not a host object, clear phys mem. + made = nv_gpu.NVOS00_PARAMETERS(hRoot=self.root, hObjectParent=self.dev.nvdevice, hObjectOld=mem.meta.hMemory) + nv_iowr(self.fd_ctl, nv_gpu.NV_ESC_RM_FREE, made) + if made.status != 0: raise RuntimeError(f"_gpu_free returned {get_error_str(made.status)}") + + self.uvm(nv_gpu.UVM_FREE, nv_gpu.UVM_FREE_PARAMS(base=int(mem.va_addr), length=mem.size)) + if mem.view is not None: FileIOInterface.munmap(int(mem.va_addr), mem.size) + + def _gpu_uvm_map(self, va_base, size, mem_handle, create_range=True, has_cpu_mapping=False, owner=None) -> HCQBuffer: + if create_range: + self.uvm(nv_gpu.UVM_CREATE_EXTERNAL_RANGE, nv_gpu.UVM_CREATE_EXTERNAL_RANGE_PARAMS(base=va_base, length=size)) + made = nv_gpu.NVOS46_PARAMETERS(hClient=self.root, hDevice=self.dev.nvdevice, hDma=self.dev.virtmem, hMemory=mem_handle, length=size, + flags=(nv_gpu.NVOS46_FLAGS_PAGE_SIZE_4KB<<8)|(nv_gpu.NVOS46_FLAGS_CACHE_SNOOP_ENABLE<<4)|(nv_gpu.NVOS46_FLAGS_DMA_OFFSET_FIXED_TRUE<<15), + dmaOffset=va_base) + nv_iowr(self.fd_ctl, nv_gpu.NV_ESC_RM_MAP_MEMORY_DMA, made) + if made.status != 0: raise RuntimeError(f"nv_sys_alloc 1 returned {get_error_str(made.status)}") + assert made.dmaOffset == va_base, f"made.dmaOffset != va_base {made.dmaOffset=} {va_base=}" + + attrs = (nv_gpu.UvmGpuMappingAttributes*256)(nv_gpu.UvmGpuMappingAttributes(gpuUuid=self.gpu_uuid, gpuMappingType=1)) + + self.uvm(nv_gpu.UVM_MAP_EXTERNAL_ALLOCATION, uvm_map:=nv_gpu.UVM_MAP_EXTERNAL_ALLOCATION_PARAMS(base=va_base, length=size, + rmCtrlFd=self.fd_ctl.fd, hClient=self.root, hMemory=mem_handle, gpuAttributesCount=1, perGpuAttributes=attrs, mapped_gpu_ids=[self.gpu_uuid])) + return HCQBuffer(va_base, size, meta=uvm_map, view=MMIOInterface(va_base, size, fmt='B') if has_cpu_mapping else None, + owner=self.dev if owner is None else owner) + + def map(self, mem:HCQBuffer): + if mem.owner is not None and mem.owner._is_cpu(): + if not any(x.device.startswith("NV") for x in mem.mapped_devs): return self.alloc(mem.size, host=True, cpu_addr=mem.va_addr) + mem = mem.mappings[next(x for x in mem.mapped_devs if x.device.startswith("NV"))] + return self._gpu_uvm_map(mem.va_addr, mem.size, mem.meta.hMemory, create_range=False, owner=mem.owner) + + def _alloc_gpu_vaddr(self, size, alignment=(4 << 10), force_low=False): + return NVKIface.low_uvm_vaddr_allocator.alloc(size, alignment) if force_low else NVKIface.uvm_vaddr_allocator.alloc(size, alignment) + + def sleep(self, tm:int): pass + +class PCIIface(PCIIfaceBase): + def __init__(self, dev, dev_id): + # PCIIface's MAP_FIXED mmap will overwrite UVM allocations made by NVKIface, so don't try PCIIface if kernel driver was already used. + if NVKIface.root is not None: raise RuntimeError("Cannot use PCIIface after NVKIface has been initialized (would corrupt UVM memory)") + super().__init__(dev, dev_id, vendor=0x10de, devices=((0xff00, (0x2200,0x2400,0x2500,0x2600,0x2700,0x2800,0x2b00,0x2c00,0x2d00,0x2f00)),), + base_class=0x03, vram_bar=1, va_start=NVMemoryManager.va_allocator.base, va_size=NVMemoryManager.va_allocator.size, dev_impl_t=NVDev) + + self.root, self.gpu_instance = 0xc1000000, 0 + self.rm_alloc(0, nv_gpu.NV01_ROOT, nv_gpu.NV0000_ALLOC_PARAMETERS()) + + # Setup classes for the GPU + self.gpfifo_class, self.compute_class, self.dma_class = (gsp:=self.dev_impl.gsp).gpfifo_class, gsp.compute_class, gsp.dma_class + self.viddec_class = None + + def setup_usermode(self): return 0xce000000, self.pci_dev.map_bar(bar=0, fmt='I', off=0xbb0000, size=0x10000) + def setup_vm(self, vaspace): pass + def setup_gpfifo_vm(self, gpfifo): pass + + def rm_alloc(self, parent, clss, params=None, root=None) -> int: return self.dev_impl.gsp.rpc_rm_alloc(parent, clss, params, self.root) + def rm_control(self, obj, cmd, params=None, **kwargs): return self.dev_impl.gsp.rpc_rm_control(obj, cmd, params, self.root, **kwargs) + + def device_fini(self): self.dev_impl.fini() + + def sleep(self, timeout): + for _ in self.dev_impl.gsp.stat_q.read_resp(): pass + if self.dev_impl.is_err_state: raise RuntimeError("Device fault detected") + +class MOCKIface(NVKIface): count = 1 + +class NVDevice(HCQCompiled[NVSignal]): + ifaces = [NVKIface, PCIIface, MOCKIface] + + def is_nvd(self) -> bool: return isinstance(self.iface, PCIIface) + + def __init__(self, device:str=""): + self.device_id = int(device.split(":")[1]) if ":" in device else 0 + self.iface = self._select_iface() + + device_params = nv_gpu.NV0080_ALLOC_PARAMETERS(deviceId=self.iface.gpu_instance, hClientShare=self.iface.root, + vaMode=nv_gpu.NV_DEVICE_ALLOCATION_VAMODE_OPTIONAL_MULTIPLE_VASPACES) + self.nvdevice = self.iface.rm_alloc(self.iface.root, nv_gpu.NV01_DEVICE_0, device_params) + self.subdevice = self.iface.rm_alloc(self.nvdevice, nv_gpu.NV20_SUBDEVICE_0, nv_gpu.NV2080_ALLOC_PARAMETERS()) + self.virtmem = self.iface.rm_alloc(self.nvdevice, nv_gpu.NV01_MEMORY_VIRTUAL, nv_gpu.NV_MEMORY_VIRTUAL_ALLOCATION_PARAMS(limit=0x1ffffffffffff)) + self.usermode, self.gpu_mmio = self.iface.setup_usermode() + + self.iface.rm_control(self.subdevice, nv_gpu.NV2080_CTRL_CMD_PERF_BOOST, nv_gpu.NV2080_CTRL_PERF_BOOST_PARAMS(duration=0xffffffff, + flags=((nv_gpu.NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_YES << 4) | (nv_gpu.NV2080_CTRL_PERF_BOOST_FLAGS_CUDA_PRIORITY_HIGH << 6) | \ + (nv_gpu.NV2080_CTRL_PERF_BOOST_FLAGS_CMD_BOOST_TO_MAX)))) + + vaspace_params = nv_gpu.NV_VASPACE_ALLOCATION_PARAMETERS(vaBase=0x1000, vaSize=0x1fffffb000000, + flags=nv_gpu.NV_VASPACE_ALLOCATION_FLAGS_ENABLE_PAGE_FAULTING | nv_gpu.NV_VASPACE_ALLOCATION_FLAGS_IS_EXTERNALLY_OWNED) + vaspace = self.iface.rm_alloc(self.nvdevice, nv_gpu.FERMI_VASPACE_A, vaspace_params) + + self.iface.setup_vm(vaspace) + + channel_params = nv_gpu.NV_CHANNEL_GROUP_ALLOCATION_PARAMETERS(engineType=nv_gpu.NV2080_ENGINE_TYPE_GRAPHICS) + self.channel_group = self.iface.rm_alloc(self.nvdevice, nv_gpu.KEPLER_CHANNEL_GROUP_A, channel_params) + + self.gpfifo_area = self.iface.alloc(0x300000, contiguous=True, cpu_access=True, force_devmem=True, + map_flags=(nv_gpu.NVOS33_FLAGS_CACHING_TYPE_WRITECOMBINED<<23)) + + ctxshare_params = nv_gpu.NV_CTXSHARE_ALLOCATION_PARAMETERS(hVASpace=vaspace, flags=nv_gpu.NV_CTXSHARE_ALLOCATION_FLAGS_SUBCONTEXT_ASYNC) + ctxshare = self.iface.rm_alloc(self.channel_group, nv_gpu.FERMI_CONTEXT_SHARE_A, ctxshare_params) + + self.compute_gpfifo = self._new_gpu_fifo(self.gpfifo_area, ctxshare, self.channel_group, offset=0, entries=0x10000, compute=True) + self.dma_gpfifo = self._new_gpu_fifo(self.gpfifo_area, ctxshare, self.channel_group, offset=0x100000, entries=0x10000, compute=False) + self.iface.rm_control(self.channel_group, nv_gpu.NVA06C_CTRL_CMD_GPFIFO_SCHEDULE, nv_gpu.NVA06C_CTRL_GPFIFO_SCHEDULE_PARAMS(bEnable=1)) + + self.cmdq_page:HCQBuffer = self.iface.alloc(0x200000, cpu_access=True) + self.cmdq_allocator = BumpAllocator(size=self.cmdq_page.size, base=int(self.cmdq_page.va_addr), wrap=True) + self.cmdq = self.cmdq_page.cpu_view().view(fmt='I') + + self.num_gpcs, self.num_tpc_per_gpc, self.num_sm_per_tpc, self.max_warps_per_sm, self.sm_version = self._query_gpu_info('num_gpcs', + 'num_tpc_per_gpc', 'num_sm_per_tpc', 'max_warps_per_sm', 'sm_version') + + # FIXME: no idea how to convert this for blackwells + self.arch: str = "sm_120" if self.sm_version==0xa04 else f"sm_{(self.sm_version>>8)&0xff}{(val>>4) if (val:=self.sm_version&0xff) > 0xf else val}" + self.sass_version = ((self.sm_version & 0xf00) >> 4) | (self.sm_version & 0xf) + + super().__init__(device, NVAllocator(self), [CUDARenderer, PTXRenderer, NVCCRenderer, NAKRenderer], NVProgram, NVSignal, NVComputeQueue, + NVCopyQueue, arch=self.arch) + + self.pma_enabled = PMA.value > 0 and PROFILE >= 1 + if self.pma_enabled: self._prof_init() + + self._setup_gpfifos() + + def _new_gpu_fifo(self, gpfifo_area, ctxshare, channel_group, offset=0, entries=0x400, compute=False, video=False) -> GPFifo: + notifier = self.iface.alloc(48 << 20, uncached=True) + params = nv_gpu.NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS(gpFifoOffset=gpfifo_area.va_addr+offset, gpFifoEntries=entries, hContextShare=ctxshare, + hObjectError=notifier.meta.hMemory, hObjectBuffer=self.virtmem if video else gpfifo_area.meta.hMemory, + hUserdMemory=(ctypes.c_uint32*8)(gpfifo_area.meta.hMemory), userdOffset=(ctypes.c_uint64*8)(entries*8+offset), engineType=19 if video else 0) + gpfifo = self.iface.rm_alloc(channel_group, self.iface.gpfifo_class, params) + + if compute: + self.debug_compute_obj, self.debug_channel = self.iface.rm_alloc(gpfifo, self.iface.compute_class), gpfifo + debugger_params = nv_gpu.NV83DE_ALLOC_PARAMETERS(hAppClient=self.iface.root, hClass3dObject=self.debug_compute_obj) + self.debugger = self.iface.rm_alloc(self.nvdevice, nv_gpu.GT200_DEBUGGER, debugger_params) + elif not video: self.iface.rm_alloc(gpfifo, self.iface.dma_class) + else: self.iface.rm_alloc(gpfifo, self.iface.viddec_class) + + if channel_group == self.nvdevice: + self.iface.rm_control(gpfifo, nv_gpu.NVA06F_CTRL_CMD_BIND, nv_gpu.NVA06F_CTRL_BIND_PARAMS(engineType=params.engineType)) + self.iface.rm_control(gpfifo, nv_gpu.NVA06F_CTRL_CMD_GPFIFO_SCHEDULE, nv_gpu.NVA06F_CTRL_GPFIFO_SCHEDULE_PARAMS(bEnable=1)) + + ws_token_params = self.iface.rm_control(gpfifo, nv_gpu.NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN, + nv_gpu.NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS(workSubmitToken=-1)) + if ctxshare != 0: self.iface.setup_gpfifo_vm(gpfifo) + + return GPFifo(ring=gpfifo_area.cpu_view().view(offset, entries*8, fmt='Q'), entries_count=entries, token=ws_token_params.workSubmitToken, + gpput=gpfifo_area.cpu_view().view(offset + entries*8 + getattr(nv_gpu.AmpereAControlGPFifo, 'GPPut').offset, fmt='I')) + + def _query_gpu_info(self, *reqs): + nvrs = [getattr(nv_gpu,'NV2080_CTRL_GR_INFO_INDEX_'+r.upper(), getattr(nv_gpu,'NV2080_CTRL_GR_INFO_INDEX_LITTER_'+r.upper(), None)) for r in reqs] + + if self.is_nvd(): + x = self.iface.rm_control(self.subdevice, nv_gpu.NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_INFO, + nv_gpu.NV2080_CTRL_INTERNAL_STATIC_GR_GET_INFO_PARAMS()) + return [x.engineInfo[0].infoList[nvr].data for nvr in nvrs] + + infos = (nv_gpu.NV2080_CTRL_GR_INFO*len(nvrs))(*[nv_gpu.NV2080_CTRL_GR_INFO(index=nvr) for nvr in nvrs]) + self.iface.rm_control(self.subdevice, nv_gpu.NV2080_CTRL_CMD_GR_GET_INFO, + nv_gpu.NV2080_CTRL_GR_GET_INFO_PARAMS(grInfoListSize=len(infos), grInfoList=ctypes.addressof(infos))) + return [x.data for x in infos] + + def _setup_gpfifos(self): + self.slm_per_thread, self.shader_local_mem = 0, None + + # Set windows addresses to not collide with other allocated buffers. + self.shared_mem_window, self.local_mem_window = 0x729400000000, 0x729300000000 + + NVComputeQueue().setup(compute_class=self.iface.compute_class, local_mem_window=self.local_mem_window, shared_mem_window=self.shared_mem_window) \ + .signal(self.timeline_signal, self.next_timeline()).submit(self) + + NVCopyQueue().wait(self.timeline_signal, self.timeline_value - 1) \ + .setup(copy_class=self.iface.dma_class) \ + .signal(self.timeline_signal, self.next_timeline()).submit(self) + + self.synchronize() + + def _ensure_has_local_memory(self, required): + if self.slm_per_thread >= required: return + + self.slm_per_thread, old_slm_per_thread = round_up(required, 32), self.slm_per_thread + bytes_per_tpc = round_up(round_up(self.slm_per_thread * 32, 0x200) * self.max_warps_per_sm * self.num_sm_per_tpc, 0x8000) + self.shader_local_mem, ok = self._realloc(self.shader_local_mem, round_up(bytes_per_tpc*self.num_tpc_per_gpc*self.num_gpcs, 0x20000)) + + # Realloc failed, restore the old value. + if not ok: self.slm_per_thread = old_slm_per_thread + + cast(NVComputeQueue, NVComputeQueue().wait(self.timeline_signal, self.timeline_value - 1)) \ + .setup(local_mem=self.shader_local_mem.va_addr, local_mem_tpc_bytes=bytes_per_tpc) \ + .signal(self.timeline_signal, self.next_timeline()).submit(self) + + def _ensure_has_vid_hw(self, w, h): + if self.iface.viddec_class is None: raise RuntimeError(f"{self.device} Video decoder class not available.") + + coloc_size = round_up((round_up(h, 64) * round_up(h, 64)) + (round_up(w, 64) * round_up(h, 64) // 16), 2 << 20) + self.intra_top_off = round_up(h, 64) * (608 + 4864 + 152 + 2000) + intra_unk_size = ((2 << 20) if self.iface.viddec_class >= nv_gpu.NVCFB0_VIDEO_DECODER else 0) + self.intra_unk_off = (round_up(self.intra_top_off, 0x10000) + (64 << 10)) if intra_unk_size > 0 else None + filter_size = round_up(round_up(self.intra_top_off, 0x10000) + (64 << 10) + intra_unk_size, 2 << 20) + + if not hasattr(self, 'vid_gpfifo'): + self.vid_gpfifo = self._new_gpu_fifo(self.gpfifo_area, 0, self.nvdevice, offset=0x200000, entries=2048, compute=False, video=True) + self.vid_coloc_buf, self.vid_filter_buf = self.allocator.alloc(coloc_size), self.allocator.alloc(filter_size) + self.vid_stat_buf = self.allocator.alloc(0x1000) + NVVideoQueue().wait(self.timeline_signal, self.timeline_value - 1) \ + .setup(copy_class=self.iface.viddec_class) \ + .signal(self.timeline_signal, self.next_timeline()).submit(self) + else: + if coloc_size > self.vid_coloc_buf.size: self.vid_coloc_buf, _ = self._realloc(self.vid_coloc_buf, coloc_size, force=True) + if filter_size > self.vid_filter_buf.size: self.vid_filter_buf, _ = self._realloc(self.vid_filter_buf, filter_size, force=True) + + def hw_copy_queues(self): return super().hw_copy_queues() + ([("NVDEC:0", NVVideoQueue)] if hasattr(self, 'vid_gpfifo') else []) + + def invalidate_caches(self): + if self.is_nvd(): self.iface.rm_control(self.subdevice, nv_gpu.NV2080_CTRL_CMD_INTERNAL_BUS_FLUSH_WITH_SYSMEMBAR, None) + else: + self.iface.rm_control(self.subdevice, nv_gpu.NV2080_CTRL_CMD_FB_FLUSH_GPU_CACHE, nv_gpu.NV2080_CTRL_FB_FLUSH_GPU_CACHE_PARAMS( + flags=((nv_gpu.NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_WRITE_BACK_YES << 2) | (nv_gpu.NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_INVALIDATE_YES << 3) | + (nv_gpu.NV2080_CTRL_FB_FLUSH_GPU_CACHE_FLAGS_FLUSH_MODE_FULL_CACHE << 4)))) + + def on_device_hang(self): + # Prepare fault report. + # TODO: Restore the GPU using NV83DE_CTRL_CMD_CLEAR_ALL_SM_ERROR_STATES if needed. + + report = [] + sm_errors = self.iface.rm_control(self.debugger, nv_gpu.NV83DE_CTRL_CMD_DEBUG_READ_ALL_SM_ERROR_STATES, + nv_gpu.NV83DE_CTRL_DEBUG_READ_ALL_SM_ERROR_STATES_PARAMS(hTargetChannel=self.debug_channel, numSMsToRead=100)) + + if sm_errors.mmuFault.valid: + mmu = self.iface.rm_control(self.debugger, nv_gpu.NV83DE_CTRL_CMD_DEBUG_READ_MMU_FAULT_INFO, + nv_gpu.NV83DE_CTRL_DEBUG_READ_MMU_FAULT_INFO_PARAMS()) + for i in range(mmu.count): + pfinfo = mmu.mmuFaultInfoList[i] + report += [f"MMU fault: 0x{pfinfo.faultAddress:X} | {NV_PFAULT_FAULT_TYPE[pfinfo.faultType]} | {NV_PFAULT_ACCESS_TYPE[pfinfo.accessType]}"] + else: + for i, e in enumerate(sm_errors.smErrorStateArray): + if e.hwwGlobalEsr or e.hwwWarpEsr: report += [f"SM {i} fault: esr={e.hwwGlobalEsr} warp_esr={e.hwwWarpEsr:#x} warp_pc={e.hwwWarpEsrPc64:#x}"] + + raise RuntimeError("\n".join(report)) + + def _prof_init(self): + self.profiler = self.iface.rm_alloc(self.subdevice, nv_gpu.MAXWELL_PROFILER_DEVICE, + nv_gpu.NVB2CC_ALLOC_PARAMETERS(hClientTarget=self.iface.root, hContextTarget=self.channel_group)) + + power_params = nv_gpu.struct_NVB0CC_CTRL_POWER_REQUEST_FEATURES_PARAMS(controlMask=(nv_gpu.NVB0CC_CTRL_POWER_FEATURE_MASK_ELCG_DISABLE << 0) | \ + (nv_gpu.NVB0CC_CTRL_POWER_FEATURE_MASK_BLCG_DISABLE << 2) | (nv_gpu.NVB0CC_CTRL_POWER_FEATURE_MASK_ELPG_DISABLE << 6) | \ + (nv_gpu.NVB0CC_CTRL_POWER_FEATURE_MASK_IDLE_SLOWDOWN_DISABLE << 8) | (nv_gpu.NVB0CC_CTRL_POWER_FEATURE_MASK_VAT_DISABLE << 10)) + self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_POWER_REQUEST_FEATURES, power_params) + + self.pma_buf = self.iface.alloc(getenv("PMA_BUFFER_SIZE", 512) << 20, uncached=True, cpu_cached=True, cpu_access=True) + self.pma_bytes = self.iface.alloc(0x1000, uncached=True, cpu_cached=True, cpu_access=self.is_nvd(), read_only=True) + self.pma_rptr = 0 + + pma_stream = nv_gpu.struct_NVB0CC_CTRL_ALLOC_PMA_STREAM_PARAMS(hMemPmaBuffer=self.pma_buf.meta.hMemory, + pmaBufferSize=self.pma_buf.size, hMemPmaBytesAvailable=self.pma_bytes.meta.hMemory, pmaBufferVA=self.pma_buf.va_addr) + self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_ALLOC_PMA_STREAM, pma_stream, extra=(self.pma_buf, self.pma_bytes)) + + self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_RESERVE_HWPM_LEGACY, nv_gpu.struct_NVB0CC_CTRL_RESERVE_HWPM_LEGACY_PARAMS(ctxsw=0)) + self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_RESERVE_PM_AREA_PC_SAMPLER) + self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_BIND_PM_RESOURCES) + + self._prof_setup_pc_sampling() + + def _prof_setup_pc_sampling(self): + is_bw = self.iface.compute_class >= nv_gpu.BLACKWELL_COMPUTE_A + PMASYS_BASE, PMAGPC_BASE, GR_GPC_BASE, GPC_BASE = (0x2b1000, 0x2b0000, 0x424000, 0x200000) if is_bw else (0x24a000, 0x244000, 0x419800, 0x180000) + + tpc_masks = [m for i in range(self.num_gpcs) if (m:=self.iface.rm_control(self.subdevice, nv_gpu.NV2080_CTRL_CMD_GR_GET_TPC_MASK, + nv_gpu.NV2080_CTRL_GR_GET_TPC_MASK_PARAMS(gpcId=i)).tpcMask) > 0] + tpc_cnt = [bin(mask).count('1') for mask in tpc_masks] + + # enables pma on gpc + if not is_bw: self.reg_ops(*[(PMAGPC_BASE + gpc * 0x200, 0x100, 0x100) for gpc in range(len(tpc_masks))]) + + # sets streaming bw for each gpc + hs = nv_gpu.struct_NVB0CC_CTRL_HS_CREDITS_PARAMS(pmaChannelIdx=0, numEntries=len(tpc_masks)) + for i, mask in enumerate(tpc_masks): + hs.creditInfo[i] = nv_gpu.struct_NVB0CC_CTRL_PMA_STREAM_HS_CREDITS_INFO( + chipletType=nv_gpu.NVB0CC_CHIPLET_TYPE_GPC, chipletIndex=i, numCredits=bin(mask).count('1')) + self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_SET_HS_CREDITS, hs) + + if is_bw: + # enables pma on gpcs + self.reg_ops(*[op for i in range(3) for op in [(PMASYS_BASE + 0x128 + i*8, 480), (PMASYS_BASE + 0x12c + i*8, 0x80000000)]]) + self.reg_ops((PMAGPC_BASE + 0xa24, 0x04000001), (PMAGPC_BASE + 0xa10, 0x80000002)) + self.reg_ops(*[(GPC_BASE + gpc * 0x4000 + 0x200 + tpc * 0x200 + reg, 0) + for gpc in range(len(tpc_masks)) for tpc in range(tpc_cnt[gpc]) for reg in [0x100, 0x108, 0x110, 0x120]]) + + def SM_REG(gpc, tpc, sm, reg): return GPC_BASE + gpc * 0x4000 + 0x800 + (tpc * self.num_sm_per_tpc + sm) * 0x200 + reg + else: + self.reg_ops(*[(PMASYS_BASE + 0x65c + off * 4, 0xffffffff) for off in range(self.num_gpcs * 2)]) + self.reg_ops((PMASYS_BASE + 0x620, 0x2000007)) + + def SM_REG(gpc, tpc, sm, reg): return GPC_BASE + gpc * 0x4000 + (self.num_tpc_per_gpc - tpc_cnt[gpc] + tpc) * 0x200 + [0x400, 0x1000][sm] + reg + + # enable pc sampling for the context + self.reg_ops((GR_GPC_BASE + 0x304, 0x80808a)) + + # sm config and enable + self.reg_ops(*[op for gpc in range(len(tpc_masks)) for tpc in range(tpc_cnt[gpc]) for sm in range(self.num_sm_per_tpc) for op in [ + (SM_REG(gpc, tpc, sm, 0x128), (gpc << 5) | (tpc << 1) | sm), # enumeration. NOTE: different from cuda + (SM_REG(gpc, tpc, sm, 0x40), 0x19181716), (SM_REG(gpc, tpc, sm, 0x48), 0x1d1c1b1a), (SM_REG(gpc, tpc, sm, 0x50), 0x1e201f), # unk, counters? + (SM_REG(gpc, tpc, sm, 0xec), 0x1), (SM_REG(gpc, tpc, sm, 0x6c), 0x2), (SM_REG(gpc, tpc, sm, 0x9c), 0x5), + (SM_REG(gpc, tpc, sm, 0x108), 0xa0 if is_bw else 0x20), *([(SM_REG(gpc, tpc, sm, 0x120), 0x100000)] if is_bw else [])]]) + self.reg_ops((GR_GPC_BASE + 0x3dc, 0x1), reg_type=1) + + def reg_ops(self, *ops, reg_type=0, op=nv_gpu.NV2080_CTRL_GPU_REG_OP_WRITE_32): + for i in range(0, len(ops), 124): + params = nv_gpu.struct_NVB0CC_CTRL_EXEC_REG_OPS_PARAMS(regOpCount=len(chunk:=ops[i:i+124])) + for j, (off, val, *rest) in enumerate(chunk): + params.regOps[j] = nv_gpu.struct_NV2080_CTRL_GPU_REG_OP(regOp=op, regType=reg_type, + regOffset=off, regValueLo=val, regAndNMaskLo=rest[0] if rest else 0xffffffff) + with contextlib.suppress(RuntimeError): self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_EXEC_REG_OPS, params) + + def _prof_readback(self) -> bytes|None: + params = self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_PMA_STREAM_UPDATE_GET_PUT, + nv_gpu.struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS(bUpdateAvailableBytes=1, bWait=1)) + + if params.bOverflowStatus: raise RuntimeError("PMA profiler: buffer overflow detected") + if params.bytesAvailable == 0: return None + + start, end = self.pma_rptr, self.pma_rptr + params.bytesAvailable + pma_data = bytes(self.pma_buf.cpu_view()[start:min(end, self.pma_buf.size)]) + bytes(self.pma_buf.cpu_view()[:max(0, end - self.pma_buf.size)]) + self.pma_rptr = end % self.pma_buf.size + + self.iface.rm_control(self.profiler, nv_gpu.NVB0CC_CTRL_CMD_PMA_STREAM_UPDATE_GET_PUT, + nv_gpu.struct_NVB0CC_CTRL_PMA_STREAM_UPDATE_GET_PUT_PARAMS(bytesConsumed=params.bytesAvailable)) + return pma_data + + def device_props(self): return {'arch': self.arch, 'sm_version': self.sm_version} diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_python.py b/artifacts/package_runtime/tinygrad/runtime/ops_python.py new file mode 100644 index 000000000..aa1390f04 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_python.py @@ -0,0 +1,239 @@ +# pylint: disable=cell-var-from-loop +# a python uops emulator +# works to test the tensor cores, and all the uops in general +# this is the (living) definition of uops +from typing import Any, TYPE_CHECKING +import pickle, base64, itertools, time, sys, functools +from dataclasses import replace +from tinygrad.dtype import bitcast, DType, dtypes, AddrSpace, truncate, storage_fmt_for_dtype, to_storage_scalar, from_storage_scalar +from tinygrad.helpers import all_same, getenv, flatten, Target, IMAGE, is_image_shape, cpu_profile +from tinygrad.device import Buffer, Compiled, Compiler, Allocator, Program, TinyELF +from tinygrad.codegen.opt import tc +from tinygrad.uop.ops import exec_alu, python_alu, Ops, UOp, GroupOp +from tinygrad.renderer import Renderer + +def _load(m, i, dtype: DType): + if i is None: return 0.0 + if i < 0 or i >= len(m): raise IndexError(f"load out of bounds, size is {len(m)} and access is {i}") + return from_storage_scalar(m[i], dtype) + +def load(inp, j, dtype: DType): + if len(inp) >= 3: return [_load(m, x+j if x is not None else None, dtype) if gate else default for (m,x),default,gate in zip(*inp[:3])] + return [_load(m, x+j if x is not None else None, dtype) for m,x in inp[0]] + +def _store(m, i, v, dtype: DType): + if i < 0 or i >= len(m): raise IndexError(f"store out of bounds, size is {len(m)}, access is {i}, value is {v}") + m[i] = to_storage_scalar(v, dtype) + +# here are the models for the WMMA instruction on the different hardware +def generic_wmma_helper(inp, warp_size, WARP_THREADS, K, NUM_A, NUM_B, NUM_C, a_elem, b_elem, c_map): + for cc, tinp, num in zip(("A", "B", "C"), inp, (NUM_A, NUM_B, NUM_C)): + assert len(tinp) == num, f"{cc} must have {num} elements per thread, it has {len(tinp)}" + assert len(flatten(tinp)) == num * warp_size, f"WMMA must have {num * warp_size} total elements for {cc} in WMMA" + assert warp_size > 0 and warp_size % WARP_THREADS == 0, f"must have multiples of {WARP_THREADS} warp threads" + out = [inp[2][elem_idx][:] for elem_idx in range(NUM_C)] + for goff in range(0, warp_size, WARP_THREADS): + for lane_id in range(WARP_THREADS): + for elem_idx in range(NUM_C): # calculate new muls and add to acc + (c_i, c_j) = c_map(lane_id, elem_idx) + out[elem_idx][goff+lane_id] += sum(a_elem(inp[0], _k, c_j, goff) * b_elem(inp[1], c_i, _k, goff) for _k in range(K)) + return out + +class PythonProgram(Program['PythonDevice']): + def __init__(self, dev:'PythonDevice', obj:TinyELF): + self.uops: list[UOp] = pickle.loads(obj.lib) + self.uop_to_index: dict[UOp, int] = {u:i for i,u in enumerate(self.uops)} + self.loop_ends: dict[UOp, int] = {u.src[1]:i for i, u in enumerate(self.uops) if u.op == Ops.END} + def __call__(self, *bufs, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), vals:tuple[int, ...]=(), wait=False, **kw): + st = time.perf_counter() + warp = list(itertools.product(*[range(x) for x in local_size[::-1]])) + warp_size = len(warp) + for idxs in itertools.product(*[range(x) for x in global_size[::-1]]): + values: dict[UOp, Any] = {} + pbufs: list[memoryview] = list(bufs) + pvals: list[int] = list(vals) + exec_masks = [[True] * warp_size] + i = 0 + while i < len(self.uops): + u = self.uops[i] + src_values = [values[v] for v in u.src if v.dtype is not dtypes.void] + src_dtypes = [v.dtype for v in u.src if v.dtype is not dtypes.void] + if getenv("TRACE"): print(i, u.op, u.dtype, u.arg, src_values, src_dtypes) + if u.op is Ops.END: + if len(u.src) == 3: + # conditional backedge on a loop: jump back while the condition is true + if values[u.src[2]][0]: i = self.uop_to_index[u.src[1]] + else: i += 1 + else: i = self.uop_to_index[u.src[1]] + continue + if u.op is Ops.IF: + exec_masks.append([x and y for x,y in zip(exec_masks[-1], src_values[0])]) + i += 1 + continue + if u.op is Ops.ENDIF: + exec_masks.pop() + i += 1 + continue + if u.op in (Ops.BARRIER, Ops.SINK, Ops.NOOP, Ops.GROUP) or (u.op is Ops.RANGE and u.dtype == dtypes.void): + # in the python emulator, the warp is always in sync + i += 1 + continue + assert u.dtype is not None, f"{u.op} is missing a dtype" + if u.op is Ops.STORE: + assert len(src_values) == 2, f"STORE must be lowered to 2 srcs, got {len(src_values)}" + store_gate = exec_masks[-1] + for j,val in enumerate(src_values[1] if u.max_numel() > 1 else [src_values[1]]): + for (m,o),v,g in zip(src_values[0], val, store_gate): + if g: _store(m, o+j, v, src_dtypes[1]) + i += 1 + continue + if u.op is Ops.AFTER: values[u] = src_values[0] + elif u.op is Ops.PARAM and u.addrspace is AddrSpace.ALU: values[u] = [pvals.pop(0)] * warp_size + elif u.op in {Ops.PARAM, Ops.BUFFER}: + storage_fmt = storage_fmt_for_dtype(u.dtype) + if storage_fmt is None: raise RuntimeError(f"dtype={u.dtype} is not supported") + if TYPE_CHECKING or sys.version_info < (3, 12): assert storage_fmt != "e" + if u.addrspace == AddrSpace.REG: + # REGs are per thread + values[u] = [memoryview(bytearray(u.max_numel()*u.dtype.itemsize)).cast(storage_fmt) for _ in range(warp_size)] + else: + buf = memoryview(bytearray(u.max_numel()*u.dtype.itemsize)) if u.op is not Ops.PARAM else pbufs.pop(0) + values[u] = [buf.cast(storage_fmt)] * warp_size + elif u.op is Ops.SPECIAL: + if u.arg[0] == 'g': values[u] = [idxs[2-int(u.arg[-1])]] * warp_size + elif u.arg[0] == 'l': values[u] = [x[2-int(u.arg[-1])] for x in warp] + elif u.op is Ops.CONST: values[u] = [u.val] * warp_size + elif u.op in {Ops.INDEX, Ops.SHRINK}: + ret:list = [] + if u.src[0].addrspace == AddrSpace.ALU: + ret = [src_values[0][i][t] for t,i in enumerate(src_values[1])] + elif is_image_shape(u.src[0]._shape): + for m,oy,ox in zip(*src_values): + if ox < 0 or ox >= u.src[0]._shape[1] or oy < 0 or oy >= u.src[0]._shape[0]: ret.append((m, None)) + else: ret.append((m, ox*4 + oy*u.src[0]._shape[1]*4)) + else: + for m,o in zip(src_values[0], src_values[1]): ret.append((m,o)) + values[u] = ret + elif u.op is Ops.RANGE: + if u not in values: values[u] = [0] * warp_size + else: + for j in range(len(values[u])): + values[u][j] += 1 + if values[u][0] == src_values[0][0]: + del values[u] + i = self.loop_ends[u] + 1 + continue + elif u.op is Ops.STACK: values[u] = src_values + elif u.op is Ops.BITCAST: values[u] = [bitcast(x, src_dtypes[0], u.dtype) for x in src_values[0]] + elif u.op is Ops.CAST: + values[u] = [truncate.get(u.dtype, lambda dt: dt)(u.dtype.const(x)) for x in src_values[0]] + elif u.op is Ops.LOAD: + if (load_sz := u.max_numel()) > 1: + # buf and gate are not vecs + values[u] = [load([src_values[k] if k in [0,2] else src_values[k][j] \ + for k in range(len(src_values))], j, u.dtype) for j in range(load_sz)] + else: + values[u] = load(src_values, 0, u.dtype) + elif u.op is Ops.WMMA: + first_src_dtype = u.src[0].dtype + assert isinstance(first_src_dtype, DType) # mypy + dims, dtype_in, device, threads = u.arg[0], first_src_dtype, u.arg[2], u.arg[3] + wmma_helper = functools.partial(generic_wmma_helper, src_values, warp_size) + # TODO: refactor these to a shared TensorCoreLayout + if device == "METAL": + # A (2 elements on 32 threads): row major + def a_b_elem(x, i, j, goff): return x[(i%2)][goff+(i//2)%2+(j%4)*2+(i//4)*8+(j//4)*16] + # (i, j), C, D (2 elements on 32 threads): row major same as A/B + def c_map(lane, elem): return (elem + ((lane%2)*2) + ((lane//8)%2)*4, ((lane//2)%4) + (lane//16)*4) + values[u] = wmma_helper(32, 8, 2, 2, 2, a_b_elem, a_b_elem, c_map) + elif device == "AMD" and threads == 64: + def a_elem(x, k, row, goff): return x[k%(dims[2]//4)][goff + (k//(dims[2]//4))*16 + row] + def b_elem(x, col, k, goff): return a_elem(x, k, col, goff) # pylint: disable=arguments-out-of-order + def c_map(lane, elem): return (lane%16, (lane//16)*4 + elem) + values[u] = wmma_helper(64, dims[2], len(src_values[0]), len(src_values[1]), len(src_values[2]), a_elem, b_elem, c_map) + elif device == "AMD" and len(src_values[0]) == 8: # RDNA4 + def a_elem(x, k, row, goff): return x[k - [0, 4, 4, 8][k//4]][goff + row + [0, 16, 0, 16][k//4]] + def b_elem(x, col, k, goff): return a_elem(x, k, col, goff) + def c_map(lane, elem): return (lane%16, (lane//16)*8 + elem) + values[u] = wmma_helper(32, 16, 8, 8, 8, a_elem, b_elem, c_map) + elif device == "AMD": + # A (16 elements on 32 threads): col major, lane 16-32 == lane 0-15 + def a_elem(x, k, row, goff): + assert x[k][goff+row] == x[k][goff+row+16], "warp elements not duplicated properly across lanes" + return x[k][goff+row] + # B (16 elements on 32 threads): row major, lane 16-32 == lane 0-15 + def b_elem(x, col, k, goff): return a_elem(x, k, col, goff) # pylint: disable=arguments-out-of-order + def c_map(lane, elem): return (lane%16, lane//16+elem*2) # (i, j), C, D (8 elements on 32 threads): row major + values[u] = wmma_helper(32, 16, 16, 16, 8, a_elem, b_elem, c_map) + elif device == "CUDA": + # (col, row) given (lane, elem) for C & D (4 elements on 32 threads); shared by all tc shapes with M=16 N=8 + def c_map(lane, elem): return (elem%2 + (lane%4)*2, lane//4 + (elem//2)*8) + + if dims == (8,16,16): + def a_elem(x, k, row, goff): return x[k%2 + (row//8)*2 + (k//8)*4][goff + (k//2)%4 + (row%8)*4] + def b_elem(x, col, k, goff): return x[k%2 + (k//8)*2][goff + (k//2)%4 + col*4] + values[u] = wmma_helper(32, 16, 8, 4, 4, a_elem, b_elem, c_map) + + elif dims == (8,16,32): + def a_elem(x, k, row, goff): return x[k%4 + (row//8)*4 + (k//16)*8][goff + (k//4)%4 + (row%8)*4] + def b_elem(x, col, k, goff): return x[k%4 + (k//16)*4][goff + (k//4)%4 + col*4] + values[u] = wmma_helper(32, 32, 16, 8, 4, a_elem, b_elem, c_map) + + elif dims == (8,16,8) and dtype_in == dtypes.half: + def a_elem(x, k, row, goff): return x[k%2 + (row//8)*2][goff + k//2 + (row%8)*4] + def b_elem(x, col, k, goff): return x[k%2][goff + k//2 + col*4] + values[u] = wmma_helper(32, 8, 4, 2, 4, a_elem, b_elem, c_map) + + elif dims == (8,16,8) and dtype_in == dtypes.float: + def a_elem(x, k, row, goff): return x[(k//4)*2 + row//8][goff + k%4 + (row%8)*4] + def b_elem(x, col, k, goff): return x[k//4][goff + k%4 + col*4] + values[u] = wmma_helper(32, 8, 4, 2, 4, a_elem, b_elem, c_map) + + else: raise NotImplementedError(f"unimplemented tensor core {u.arg}") + else: raise NotImplementedError(f"unimplemented tensor core {u.arg}") + elif u.op in GroupOp.ALU: + assert all_same([len(x) for x in src_values]), f"{[len(x) for x in src_values]} doesn't match on {u.op}" + assert all_same([u.dtype] + src_dtypes) or u.op in {*GroupOp.Comparison, Ops.WHERE}, f"dtype mismatch on {u.op}" + values[u] = [exec_alu(u.op, u.dtype, p) for p in zip(*src_values)] + assert u in values, u + i += 1 + return time.perf_counter() - st + +class PythonCompiler(Compiler): + def compile(self, src:str) -> bytes: return base64.b64decode(src) + +class PythonRenderer(Renderer): + code_for_op = python_alu + compiler = PythonCompiler() + + def __init__(self, target:Target): + assert (emu:=getenv("EMULATE", "")) == "", ("EMULATE is deprecated, use DEV=PYTHON::" + + {"AMD":"gfx1100", "AMD_RDNA4":"gfx1201", "AMD_MFMA":"gfx950", "CUDA":"sm_80", "CUDA_SM75":"sm_75", "CUDA_SM89":"sm_89"}.get(emu, emu)) + target = replace(target, renderer="PYTHON") + if target.arch == "METAL": self.target, self.tensor_cores = replace(target, device="METAL"), tc.metal + elif target.arch.startswith("gfx"): + self.target = replace(target, device="AMD") + self.tensor_cores = tc.get_amd(target.arch) + elif target.arch.startswith("sm"): + self.target = replace(target, device="CUDA") + self.tensor_cores = tc.get_cuda(target.arch) + elif IMAGE and not target.arch: self.target = replace(target, arch="IMAGE_PITCH_ALIGNMENT=1") + else: self.target = target + + def render(self, uops:list[UOp]) -> str: return base64.b64encode(pickle.dumps(uops)).decode() + + def supported_dtypes(self): return {d for d in super().supported_dtypes() if d != dtypes.half or sys.version_info >= (3, 12)} + +class PythonAllocator(Allocator['PythonDevice']): + def _alloc(self, size, options): return memoryview(bytearray(size)) + def _as_buffer(self, src) -> memoryview: return src + def _copyin(self, dest, src:memoryview): + with cpu_profile("TINY -> PYTHON", f"{self.dev.device}:COPY"): dest[:] = src + def _copyout(self, dest:memoryview, src): + with cpu_profile("PYTHON -> TINY", f"{self.dev.device}:COPY"): dest[:] = src + def map(self, buf:Buffer): return buf.as_memoryview(force_zero_copy=True) + def _offset(self, buf:memoryview, size:int, offset:int): return buf[offset:offset+size] + +class PythonDevice(Compiled): + def __init__(self, device:str): + super().__init__(device, PythonAllocator(self), [PythonRenderer], PythonProgram) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_qcom.py b/artifacts/package_runtime/tinygrad/runtime/ops_qcom.py new file mode 100644 index 000000000..3535207b2 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_qcom.py @@ -0,0 +1,415 @@ +from __future__ import annotations +import os, ctypes, functools, mmap, struct, array, math, sys, weakref, contextlib +assert sys.platform != 'win32' +from typing import Any, cast +from tinygrad.device import BufferSpec, Device, TinyELF +from tinygrad.runtime.support.hcq import HCQBuffer, HWQueue, HCQProgram, HCQCompiled, HCQAllocatorBase, HCQSignal, HCQArgsState, BumpAllocator +from tinygrad.runtime.support.hcq import FileIOInterface, MMIOInterface +from tinygrad.runtime.autogen import kgsl, mesa +from tinygrad.renderer.cstyle import QCOMCLRenderer +from tinygrad.renderer.nir import IR3Renderer +from tinygrad.helpers import getenv, mv_address, to_mv, round_up, data64_le, ceildiv, prod, cpu_profile, lo32, suppress_finalizing, is_image_shape +from tinygrad.helpers import next_power2, flatten, PROFILE, IMAGE +from tinygrad.dtype import dtypes, AddrSpace +from tinygrad.runtime.support.system import System +if getenv("IOCTL"): import extra.qcom_gpu_driver.opencl_ioctl # noqa: F401 # pylint: disable=unused-import + +BUFTYPE_BUF, BUFTYPE_TEX, BUFTYPE_IBO = 0, 1, 2 + +@functools.cache +def dcache_flush(): + from tinygrad.uop.ops import UOp, Ops, KernelInfo + from tinygrad.codegen import to_program + buf, n = UOp.param(0, dtypes.uint8, shape=(1,)), UOp.param(1, dtypes.int, shape=(), name="n", addrspace=AddrSpace.ALU) + i = UOp.range(n, 0, dtype=dtypes.int) + flush = UOp(Ops.CUSTOM, src=(buf.index(i * 64),), arg='__asm__ volatile("dc cvac, %0" :: "r"({0}) : "memory");') + sink = UOp.sink(flush.end(i), UOp(Ops.CUSTOM, arg='__asm__ volatile("dsb sy" ::: "memory");'), arg=KernelInfo(name="dcache_flush")) + prg = to_program(UOp(Ops.PROGRAM, src=(sink, UOp(Ops.LINEAR, src=tuple(sink.toposort())))), Device["CPU"].renderer) + return Device["CPU"].runtime(prg.to_elf()) + +#Parse C-style defines: ___SHIFT and ___MASK from the adreno module into the following format: +# qreg.(=..., =..., ..., =...) +def _qreg_exec(__reg, __val=0, **kwargs): + for k, v in kwargs.items(): + reg_name = f"{__reg[4:]}_{k.removeprefix('_').upper()}" + __val |= (getattr(mesa, reg_name) if v else 0) if type(v) is bool else (v << getattr(mesa, f'{reg_name}__SHIFT')) + return __val +qreg: Any = type("QREG", (object,), {name[4:].lower(): functools.partial(_qreg_exec, name) for name in mesa.__dict__.keys() if name[:4] == 'REG_'}) + +def ctz(v): return (v & -v).bit_length() - 1 + +def parity(val: int): + for i in range(4,1,-1): val ^= val >> (1 << i) + return (~0x6996 >> (val & 0xf)) & 1 + +def pkt7_hdr(opcode: int, cnt: int): return mesa.CP_TYPE7_PKT | cnt & 0x3FFF | parity(cnt) << 15 | (opcode & 0x7F) << 16 | parity(opcode) << 23 + +def pkt4_hdr(reg: int, cnt: int): return mesa.CP_TYPE4_PKT | cnt & 0x7F | parity(cnt) << 7 | (reg & 0x3FFFF) << 8 | parity(reg) << 27 + +def _read_lib(lib, off) -> int: return struct.unpack("I", lib[off:off+4])[0] + +class QCOMSignal(HCQSignal): + def __init__(self, *args, **kwargs): super().__init__(*args, **{**kwargs, 'timestamp_divider': 19.2}) + + def _sleep(self, time_spent_since_last_sleep_ms:int): + # Sleep only for timeline signals. Do it immediately to free cpu. + if self.is_timeline and self.owner is not None: + kgsl.IOCTL_KGSL_DEVICE_WAITTIMESTAMP_CTXTID(self.owner.fd, context_id=self.owner.ctx, timestamp=self.owner.last_cmd, timeout=0xffffffff) + +class QCOMComputeQueue(HWQueue): + def __init__(self, dev:QCOMDevice): + self.dev = dev + super().__init__() + + @suppress_finalizing + def __del__(self): + if self.binded_device is not None: self.binded_device.allocator.free(self.hw_page, self.hw_page.size, BufferSpec(cpu_access=True, nolru=True)) + + def cmd(self, opcode: int, *vals: int): self.q(pkt7_hdr(opcode, len(vals)), *vals) + + def reg(self, reg: int, *vals: int): self.q(pkt4_hdr(reg, len(vals)), *vals) + + def _cache_flush(self, write_back=True, invalidate=False, sync=True, memsync=False): + # TODO: 7xx support. + if write_back: self.cmd(mesa.CP_EVENT_WRITE, mesa.CACHE_FLUSH_TS, *data64_le(self.dev.dummy_addr), 0) # dirty cache write-back. + if invalidate: self.cmd(mesa.CP_EVENT_WRITE, mesa.CACHE_INVALIDATE) # invalidate cache lines (following reads from RAM). + if memsync: self.cmd(mesa.CP_WAIT_MEM_WRITES) + if sync: self.cmd(mesa.CP_WAIT_FOR_IDLE) + + def memory_barrier(self): + self._cache_flush(write_back=True, invalidate=True, sync=True, memsync=True) + return self + + def signal(self, signal:QCOMSignal, value=0): + self.cmd(mesa.CP_WAIT_FOR_IDLE) + if self.dev.gpu_id[:2] < (7, 3): + self.cmd(mesa.CP_EVENT_WRITE, qreg.cp_event_write_0(event=mesa.CACHE_FLUSH_TS), *data64_le(signal.value_addr), lo32(value)) + self._cache_flush(write_back=True, invalidate=False, sync=False, memsync=False) + else: + # TODO: support devices starting with 8 Gen 1. Also, 700th series have convenient CP_GLOBAL_TIMESTAMP and CP_LOCAL_TIMESTAMP + raise RuntimeError('CP_EVENT_WRITE7 is not supported') + return self + + def timestamp(self, signal:QCOMSignal): + self.cmd(mesa.CP_WAIT_FOR_IDLE) + self.cmd(mesa.CP_REG_TO_MEM, qreg.cp_reg_to_mem_0(reg=mesa.REG_A6XX_CP_ALWAYS_ON_COUNTER, cnt=2, _64b=True),*data64_le(signal.timestamp_addr)) + return self + + def wait(self, signal:QCOMSignal, value=0): + self.cmd(mesa.CP_WAIT_REG_MEM, qreg.cp_wait_reg_mem_0(function=mesa.WRITE_GE, poll=mesa.POLL_MEMORY),*data64_le(signal.value_addr), + qreg.cp_wait_reg_mem_3(ref=value&0xFFFFFFFF), qreg.cp_wait_reg_mem_4(mask=0xFFFFFFFF), qreg.cp_wait_reg_mem_5(delay_loop_cycles=32)) + return self + + def _build_gpu_command(self, dev:QCOMDevice, hw_addr=None): + to_mv((hw_page_addr:=hw_addr or dev.cmd_buf_allocator.alloc(len(self._q) * 4)), len(self._q) * 4).cast('I')[:] = array.array('I', self._q) + obj = kgsl.struct_kgsl_command_object(gpuaddr=hw_page_addr, size=len(self._q) * 4, flags=kgsl.KGSL_CMDLIST_IB) + submit_req = kgsl.struct_kgsl_gpu_command(cmdlist=ctypes.addressof(obj), numcmds=1, context_id=dev.ctx, + cmdsize=ctypes.sizeof(kgsl.struct_kgsl_command_object)) + return submit_req, obj + + def bind(self, dev:QCOMDevice): + self.binded_device = dev + self.hw_page = dev.allocator.alloc(len(self._q) * 4, BufferSpec(cpu_access=True, nolru=True)) + self.submit_req, self.obj = self._build_gpu_command(self.binded_device, self.hw_page.va_addr) + # From now on, the queue is on the device for faster submission. + self._q = to_mv(self.obj.gpuaddr, len(self._q) * 4).cast("I") + + def _submit(self, dev:QCOMDevice): + if self.binded_device == dev: submit_req = self.submit_req + else: submit_req, _ = self._build_gpu_command(dev) + dev.last_cmd = kgsl.IOCTL_KGSL_GPU_COMMAND(dev.fd, __payload=submit_req).timestamp + + def exec(self, prg:QCOMProgram, args_state:QCOMArgsState, global_size, local_size): + self.bind_args_state(args_state) + + def cast_int(x, ceil=False): return (math.ceil(x) if ceil else int(x)) if isinstance(x, float) else x + global_size_mp = [cast_int(g*l) for g,l in zip(global_size, local_size)] + + self.cmd(mesa.CP_SET_MARKER, qreg.a6xx_cp_set_marker_0(mode=mesa.RM6_COMPUTE)) + self.reg(mesa.REG_A6XX_SP_UPDATE_CNTL, qreg.a6xx_sp_update_cntl(cs_state=True, cs_uav=True)) + self.reg(mesa.REG_A6XX_SP_UPDATE_CNTL, 0x0) + self.reg(mesa.REG_A6XX_SP_CS_TSIZE, qreg.a6xx_sp_cs_tsize(0x80)) # is this right? mesa uses 1 + self.reg(mesa.REG_A6XX_SP_CS_USIZE, qreg.a6xx_sp_cs_usize(0x40)) # mesa also uses 1 + self.reg(mesa.REG_A6XX_SP_MODE_CNTL, qreg.a6xx_sp_mode_cntl(isammode=mesa.ISAMMODE_GL if prg.NIR else mesa.ISAMMODE_CL, + constant_demotion_enable=prg.NIR)) + self.reg(mesa.REG_A6XX_SP_PERFCTR_SHADER_MASK, qreg.a6xx_sp_perfctr_shader_mask(cs=True)) + self.reg(mesa.REG_A6XX_TPL1_MODE_CNTL, qreg.a6xx_tpl1_mode_cntl(isammode=mesa.ISAMMODE_GL if prg.NIR else mesa.ISAMMODE_CL)) + self.reg(mesa.REG_A6XX_TPL1_DBG_ECO_CNTL, 0) + self.cmd(mesa.CP_WAIT_FOR_IDLE) + + self.reg(mesa.REG_A6XX_SP_CS_NDRANGE_0, + qreg.a6xx_sp_cs_ndrange_0(kerneldim=3, localsizex=local_size[0] - 1, localsizey=local_size[1] - 1, localsizez=local_size[2] - 1), + global_size_mp[0], 0, global_size_mp[1], 0, global_size_mp[2], 0, 0xccc0cf, 0xfc | qreg.a6xx_sp_cs_wge_cntl(threadsize=mesa.THREAD64), + cast_int(global_size[0], ceil=True), cast_int(global_size[1], ceil=True), cast_int(global_size[2], ceil=True)) + + self.reg(mesa.REG_A6XX_SP_CS_CNTL_0, + qreg.a6xx_sp_cs_cntl_0(threadsize=mesa.THREAD64, halfregfootprint=prg.hregs, fullregfootprint=prg.fregs, branchstack=prg.brnchstck), + qreg.a6xx_sp_cs_cntl_1(constantrammode=mesa.CONSTLEN_256, shared_size=prg.shared_size), # should this be CONSTLEN_512? + 0, prg.prg_offset, *data64_le(prg.lib_gpu.va_addr), + qreg.a6xx_sp_cs_pvt_mem_param(memsizeperitem=prg.pvtmem_size_per_item), *data64_le(prg.dev._stack.va_addr), + qreg.a6xx_sp_cs_pvt_mem_size(totalpvtmemsize=prg.pvtmem_size_total)) + + if prg.NIR and prg.wgsz != 0xfc: to_mv(int(args_state.buf.va_addr) + prg.wgsz * 4, 12)[:] = struct.pack("III", *local_size) + self.cmd(mesa.CP_LOAD_STATE6_FRAG, qreg.cp_load_state6_0(state_type=mesa.ST_CONSTANTS, state_src=mesa.SS6_INDIRECT, + state_block=mesa.SB6_CS_SHADER, num_unit=1024 // 4), + *data64_le(args_state.buf.va_addr)) + self.cmd(mesa.CP_LOAD_STATE6_FRAG, qreg.cp_load_state6_0(state_type=mesa.ST_SHADER, state_src=mesa.SS6_INDIRECT, + state_block=mesa.SB6_CS_SHADER, num_unit=ceildiv(prg.image_size, 128)), + *data64_le(prg.lib_gpu.va_addr)) + + self.reg(mesa.REG_A6XX_SP_REG_PROG_ID_0, 0xfcfcfcfc, 0xfcfcfcfc, 0xfcfcfcfc, 0xfc, qreg.a6xx_sp_cs_const_config(constlen=1024 // 4, enabled=True)) + + self.reg(mesa.REG_A6XX_SP_CS_PVT_MEM_STACK_OFFSET, qreg.a6xx_sp_cs_pvt_mem_stack_offset(prg.hw_stack_offset)) + # image_size is in bytes, but INSTR_SIZE is measured in units of instruction groups (16 instructions, 8 bytes each) + # https://elixir.bootlin.com/mesa/mesa-26.1.5/source/src/freedreno/ir3/ir3_shader.h#L719-L723 + self.reg(mesa.REG_A6XX_SP_CS_INSTR_SIZE, qreg.a6xx_sp_cs_instr_size(ceildiv(prg.image_size, 128))) + + if prg.samp_cnt > 0: + self.cmd(mesa.CP_LOAD_STATE6_FRAG, qreg.cp_load_state6_0(state_type=mesa.ST_SHADER, state_src=mesa.SS6_INDIRECT, + state_block=mesa.SB6_CS_TEX, num_unit=args_state.prg.samp_cnt), + *data64_le(args_state.buf.va_addr + args_state.prg.samp_off)) + self.reg(mesa.REG_A6XX_SP_CS_SAMPLER_BASE, *data64_le(args_state.buf.va_addr + args_state.prg.samp_off)) + self.reg(mesa.REG_A6XX_TPL1_CS_BORDER_COLOR_BASE, *data64_le(prg.dev.border_color_buf.va_addr)) + + if prg.tex_cnt > 0: + self.cmd(mesa.CP_LOAD_STATE6_FRAG, qreg.cp_load_state6_0(state_type=mesa.ST_CONSTANTS, state_src=mesa.SS6_INDIRECT, + state_block=mesa.SB6_CS_TEX, num_unit=min(16, args_state.prg.tex_cnt)), + *data64_le(args_state.buf.va_addr + args_state.prg.tex_off)) + self.reg(mesa.REG_A6XX_SP_CS_TEXMEMOBJ_BASE, *data64_le(args_state.buf.va_addr + args_state.prg.tex_off)) + + if prg.ibo_cnt > 0: + self.cmd(mesa.CP_LOAD_STATE6_FRAG, qreg.cp_load_state6_0(state_type=mesa.ST6_UAV, state_src=mesa.SS6_INDIRECT, + state_block=mesa.SB6_CS_SHADER, num_unit=args_state.prg.ibo_cnt), + *data64_le(args_state.buf.va_addr + args_state.prg.ibo_off)) + self.reg(mesa.REG_A6XX_SP_CS_UAV_BASE, *data64_le(args_state.buf.va_addr + args_state.prg.ibo_off)) + + self.reg(mesa.REG_A6XX_SP_CS_CONFIG, + qreg.a6xx_sp_cs_config(enabled=True, nsamp=args_state.prg.samp_cnt, ntex=args_state.prg.tex_cnt, nuav=args_state.prg.ibo_cnt)) + + if prg.NIR: + self.reg(mesa.REG_A6XX_SP_CS_CONST_CONFIG_0, + qreg.a6xx_sp_cs_const_config_0(wgidconstid=prg.wgid, wgsizeconstid=prg.wgsz, wgoffsetconstid=0xfc, localidregid=prg.lid), + qreg.a6xx_sp_cs_wge_cntl(linearlocalidregid=0xfc, threadsize=mesa.THREAD64)) + self.cmd(mesa.CP_EXEC_CS, 0, + qreg.cp_exec_cs_1(ngroups_x=global_size[0]), qreg.cp_exec_cs_2(ngroups_y=global_size[1]), qreg.cp_exec_cs_3(_ngroups_z=global_size[2])) + else: self.cmd(mesa.CP_RUN_OPENCL, 0) + + self._cache_flush(write_back=True, invalidate=False, sync=False, memsync=False) + return self + +class QCOMArgsState(HCQArgsState): + def __init__(self, buf:HCQBuffer, prg:QCOMProgram, bufs:tuple[HCQBuffer, ...], vals:tuple[int, ...]=()): + super().__init__(buf, prg, bufs, vals=vals) + ctypes.memset(int(self.buf.va_addr), 0, prg.kernargs_alloc_size) + + ubos = [bufs[slot] for _,slot,_,shape in prg.signature if slot < len(bufs) and not is_image_shape(shape)] + uavs = [(dt,shape,bufs[slot]) for _,slot,dt,shape in prg.signature if slot < len(bufs) and is_image_shape(shape)] + # NIR can reorder images to different texture slots + ibos, texs = uavs[:prg.ibo_cnt], [uavs[prg.ibo_cnt + (prg.tex_to_image[i] if prg.NIR else i)] for i in range(prg.tex_cnt)] + for cnst_val,cnst_off,cnst_sz in prg.consts_info: + to_mv(cast(int, self.buf.va_addr) + cnst_off, cnst_sz)[:] = cnst_val.to_bytes(cnst_sz, byteorder='little') + + if prg.samp_cnt > 0: to_mv(int(self.buf.va_addr) + prg.samp_off, len(prg.samplers) * 4).cast('I')[:] = array.array('I', prg.samplers) + if prg.NIR: + self.bind_sints_to_buf(*[b.va_addr for b in ubos], buf=self.buf, fmt='Q', offset=prg.buf_off) + for v,(o,dt) in zip(vals, TinyELF.iter_sig(prg.signature[len(bufs):], len(ubos)*8)): + self.bind_sints_to_buf(v, buf=self.buf, fmt=dt.fmt, offset=prg.buf_off + o) + else: + for i, b in enumerate(ubos): self.bind_sints_to_buf(b.va_addr, buf=self.buf, fmt='Q', offset=prg.buf_offs[i]) + for i,(v,(_,_,dt,_)) in enumerate(zip(vals, prg.signature[len(bufs):])): + self.bind_sints_to_buf(v, buf=self.buf, fmt=dt.fmt, offset=prg.buf_offs[i+len(ubos)]) + + def _tex(b, ibo=False): + imgdt, shape, buf = b + pitch = shape[1] * 4 * imgdt.itemsize + fmt = mesa.FMT6_32_32_32_32_FLOAT if imgdt.itemsize == 4 else mesa.FMT6_16_16_16_16_FLOAT + return [qreg.a6xx_tex_const_0(fmt=fmt) if ibo else qreg.a6xx_tex_const_0(0x8, swiz_x=0, swiz_y=1, swiz_z=2, swiz_w=3, fmt=fmt), + qreg.a6xx_tex_const_1(width=shape[1], height=shape[0]), + qreg.a6xx_tex_const_2(type=mesa.A6XX_TEX_2D, pitch=pitch, pitchalign=ctz(pitch)-6), 0, *data64_le(buf.va_addr), + qreg.a6xx_tex_const_6(plane_pitch=0x400000), qreg.a6xx_tex_const_7(13), 0, 0, 0, 0, 0, 0, 0, 0] + + self.bind_sints_to_buf(*flatten(map(_tex, texs)), buf=self.buf, fmt='I', offset=prg.tex_off) + self.bind_sints_to_buf(*flatten(map(functools.partial(_tex, ibo=True), ibos)), buf=self.buf, fmt='I', offset=prg.ibo_off) + +class QCOMProgram(HCQProgram['QCOMDevice']): + def __init__(self, dev: QCOMDevice, obj: TinyELF): + self.dev: QCOMDevice = dev + self.signature, self.name, self.NIR = obj.signature, obj.name, isinstance(dev.renderer, IR3Renderer) + + if self.NIR: + from tinygrad.runtime.support.compiler_mesa import IR3Compiler + v, cs, imm_vals, self.image = IR3Compiler.unpack_lib(obj.lib) + self.prg_offset, self.brnchstck, self.image_size, self.pvtmem, self.shmem = 0, v.branchstack, v.info.size, v.pvtmem_size, v.shared_size + self.wgsz = alloc.offset_vec4 * 4 + 8 if (alloc:=cs.allocs.consts[mesa.IR3_CONST_ALLOC_DRIVER_PARAMS]).size_vec4 else 0xfc + + self.wgid, self.lid = v.cs.work_group_id, v.cs.local_invocation_id # register ids + self.buf_off, imm_off = cs.ubo_state.range[0].offset, cs.allocs.max_const_offset_vec4 * 16 + self.consts_info = [(struct.unpack_from("> 9 + self.pvtmem_size_total: int = self.pvtmem_size_per_item * 128 * 2 + self.hw_stack_offset: int = round_up(next_power2(round_up(self.pvtmem, 512)) * 128 * 16, 0x1000) + self.shared_size: int = max(1, (self.shmem - 1) // 1024) + self.max_threads = min(1024, ((384 * 32) // (max(1, (self.fregs + round_up(self.hregs, 2) // 2)) * 128)) * 128) + dev._ensure_stack_size(self.hw_stack_offset * 4) + + kernargs_alloc_size = round_up(2048 + (self.tex_cnt + self.ibo_cnt) * 0x40 + len(self.samplers) * 4, 0x100) + super().__init__(QCOMArgsState, self.dev, obj, kernargs_alloc_size=kernargs_alloc_size) + weakref.finalize(self, self._fini, self.dev, self.lib_gpu, buf_spec) + + def __call__(self, *bufs, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), + vals:tuple[int|None, ...]=(), wait=False, **kw): + if self.max_threads < prod(local_size): raise RuntimeError("Too many resources requested for launch") + if any(g*l>mx for g,l,mx in zip(global_size, local_size, [65536, 65536, 65536])) and any(l>mx for l,mx in zip(local_size, [1024, 1024, 1024])): + raise RuntimeError(f"Invalid global/local dims {global_size=}, {local_size=}") + return super().__call__(*bufs, global_size=global_size, local_size=local_size, vals=vals, wait=wait) + + def _parse_lib(self, lib): + # Extract image binary + self.image_size = _read_lib(lib, 0x100) + self.image = lib[(image_offset:=_read_lib(lib, 0xc0)):image_offset+self.image_size] + + # Parse image descriptors + image_desc_off = _read_lib(lib, 0x110) + self.prg_offset, self.brnchstck = _read_lib(lib, image_desc_off+0xc4), _read_lib(lib, image_desc_off+0x108) // 2 + self.pvtmem, self.shmem = _read_lib(lib, image_desc_off+0xc8), _read_lib(lib, image_desc_off+0xd8) + + # Fill up constants and buffers info + self.consts_info = [] + + # Collect sampler info. + self.samp_cnt = samp_cnt_in_file = _read_lib(lib, image_desc_off + 0xdc) + assert self.samp_cnt <= 1, "Up to one sampler supported" + if self.samp_cnt: + self.samp_cnt += 1 + self.samplers = [qreg.a6xx_tex_samp_0(wrap_s=(clamp_mode:=mesa.A6XX_TEX_CLAMP_TO_BORDER), wrap_t=clamp_mode, wrap_r=clamp_mode), + qreg.a6xx_tex_samp_1(unnorm_coords=True, cubemapseamlessfiltoff=True), 0, 0, 0, 0, 0, 0] + else: self.samplers = [] + + # Collect kernel arguments (buffers) info. + bdoff, binfos = round_up(image_desc_off + 0x158 + len(self.name), 4) + 8 * samp_cnt_in_file, [] + while bdoff + 32 <= len(lib): + length, _, _, offset_words, _, _, _, typ = struct.unpack("8I", lib[bdoff:bdoff+32]) + if length == 0: break + binfos.append((offset_words * 4, typ)) + bdoff += length + self.buf_offs = [off for off,typ in binfos if typ not in {BUFTYPE_TEX, BUFTYPE_IBO}] + + # Setting correct offsets to textures/ibos. + self.tex_cnt, self.ibo_cnt = sum(typ is BUFTYPE_TEX for _,typ in binfos), sum(typ is BUFTYPE_IBO for _,typ in binfos) + self.ibo_off, self.tex_off, self.samp_off = 2048, 2048 + 0x40 * self.ibo_cnt, 2048 + 0x40 * self.tex_cnt + 0x40 * self.ibo_cnt + + if _read_lib(lib, 0xb0) != 0: # check if we have constants. + cdoff = _read_lib(lib, 0xac) + while cdoff + 40 <= image_offset: + cnst, offset_words, _, is32 = struct.unpack("I", lib[cdoff:cdoff+4])[0], *struct.unpack("III", lib[cdoff+16:cdoff+28]) + self.consts_info.append((cnst, offset_words * (sz_bytes:=(2 << is32)), sz_bytes)) + cdoff += 40 + + # Registers info + reg_desc_off = _read_lib(lib, 0x34) + self.fregs, self.hregs = _read_lib(lib, reg_desc_off + 0x14), _read_lib(lib, reg_desc_off + 0x18) + +class QCOMAllocator(HCQAllocatorBase): + def _alloc(self, size:int, opts:BufferSpec) -> HCQBuffer: + return self.dev._gpu_map(opts.external_ptr, size) if opts.external_ptr else self.dev._gpu_alloc(size) + + def _do_copy(self, src_addr, dest_addr, size, prof_text): + self.dev.synchronize() + with cpu_profile(prof_text, f"{self.dev.device}:COPY"): ctypes.memmove(dest_addr, src_addr, size) + + def _copyin(self, dest:HCQBuffer, src:memoryview): self._do_copy(mv_address(src), dest.cpu_view().addr, src.nbytes, f"TINY -> {self.dev.device}") + def _copyout(self, dest:memoryview, src:HCQBuffer): self._do_copy(src.cpu_view().addr, mv_address(dest), src.size, f"{self.dev.device} -> TINY") + + def _as_buffer(self, src:HCQBuffer) -> memoryview: return to_mv(src.cpu_view().addr, src.size) + + def _do_free(self, opaque, options:BufferSpec): self.dev._gpu_free(opaque) + +def flag(nm, val): return (val << getattr(kgsl, f"{nm}_SHIFT")) & getattr(kgsl, f"{nm}_MASK") + +class QCOMDevice(HCQCompiled): + def __init__(self, device:str=""): + self.fd = FileIOInterface('/dev/kgsl-3d0', os.O_RDWR) + self.dummy_addr = int(self._gpu_alloc(0x1000).va_addr) + + flags = kgsl.KGSL_CONTEXT_PREAMBLE | kgsl.KGSL_CONTEXT_PWR_CONSTRAINT | kgsl.KGSL_CONTEXT_NO_FAULT_TOLERANCE | kgsl.KGSL_CONTEXT_NO_GMEM_ALLOC \ + | flag("KGSL_CONTEXT_PRIORITY", getenv("QCOM_PRIORITY", 8)) | flag("KGSL_CONTEXT_PREEMPT_STYLE", kgsl.KGSL_CONTEXT_PREEMPT_STYLE_FINEGRAIN) + self.ctx = kgsl.IOCTL_KGSL_DRAWCTXT_CREATE(self.fd, flags=flags).drawctxt_id + + self.cmd_buf = self._gpu_alloc(16 << 20) + self.cmd_buf_allocator = BumpAllocator(size=self.cmd_buf.size, base=int(self.cmd_buf.va_addr), wrap=True) + + self.border_color_buf = self._gpu_alloc(0x1000, fill_zeroes=True) + + self.last_cmd:int = 0 + + # Set max power + struct.pack_into('IIQQ', pwr:=memoryview(bytearray(0x18)), 0, 1, self.ctx, mv_address(_:=memoryview(array.array('I', [1]))), 4) + kgsl.IOCTL_KGSL_SETPROPERTY(self.fd, type=kgsl.KGSL_PROP_PWR_CONSTRAINT, value=mv_address(pwr), sizebytes=pwr.nbytes) + + # Load info about qcom device + info = kgsl.struct_kgsl_devinfo() + kgsl.IOCTL_KGSL_DEVICE_GETPROPERTY(self.fd, type=kgsl.KGSL_PROP_DEVICE_INFO, value=ctypes.addressof(info), sizebytes=ctypes.sizeof(info)) + self.gpu_id = (info.chip_id >> 24, (info.chip_id >> 16) & 0xFF, (info.chip_id >> 8) & 0xFF) + + # a7xx start with 730x or 'Cxxx', a8xx starts 'Exxx' + if self.gpu_id[:2] >= (7, 3): raise RuntimeError(f"Unsupported GPU: chip_id={info.chip_id:#x}") + + if PROFILE and self.gpu_id[:2] < (7, 3): + System.write_sysfs("/sys/class/kgsl/kgsl-3d0/idle_timer", value="4000000000", msg="Failed to disable suspend mode", expected="4294967276") + + super().__init__(device, QCOMAllocator(self), [QCOMCLRenderer, IR3Renderer], QCOMProgram, QCOMSignal, functools.partial(QCOMComputeQueue, self), + arch=("a%d%d%d" + (",IMAGE_PITCH_ALIGNMENT=64" if IMAGE else "")) % self.gpu_id) + + def _gpu_alloc(self, size:int, flags:int=0, uncached=False, fill_zeroes=False) -> HCQBuffer: + flags |= flag("KGSL_MEMALIGN", alignment_hint:=12) | kgsl.KGSL_MEMFLAGS_USE_CPU_MAP + if uncached: flags |= flag("KGSL_CACHEMODE", kgsl.KGSL_CACHEMODE_UNCACHED) + + alloc = kgsl.IOCTL_KGSL_GPUOBJ_ALLOC(self.fd, size=(bosz:=round_up(size, 1< HCQBuffer: + ptr_aligned, size_aligned = (ptr & ~0xfff), round_up(size + (ptr & 0xfff), 0x1000) + dcache_flush().fxn(ctypes.c_uint64(ptr_line_aligned:=ptr & ~63), ceildiv(ptr + size - ptr_line_aligned, 64)) + try: + mi = kgsl.IOCTL_KGSL_MAP_USER_MEM(self.fd, hostptr=ptr_aligned, len=size_aligned, memtype=kgsl.KGSL_USER_MEM_TYPE_ADDR) + return HCQBuffer(mi.gpuaddr + (ptr - ptr_aligned), size=size, meta=(mi, False), view=MMIOInterface(ptr, size, fmt='B'), owner=self) + except OSError as e: + if e.errno == 14: return HCQBuffer(va_addr=ptr, size=size, meta=(None, False), view=MMIOInterface(ptr, size, fmt='B'), owner=self) + raise RuntimeError("Failed to map external pointer to GPU memory") from e + + def _gpu_free(self, mem:HCQBuffer): + if mem.meta[0] is None: return # external (gpu) ptr + if not mem.meta[1]: kgsl.IOCTL_KGSL_SHAREDMEM_FREE(self.fd, gpuaddr=mem.meta[0].gpuaddr) # external (cpu) ptr + else: + kgsl.IOCTL_KGSL_GPUOBJ_FREE(self.fd, id=mem.meta[0].id) + FileIOInterface.munmap(mem.va_addr, mem.meta[0].mmapsize) + + def _ensure_stack_size(self, sz): + if not hasattr(self, '_stack'): self._stack = self._gpu_alloc(sz) + elif self._stack.size < sz: + self.synchronize() + self._gpu_free(self._stack) + self._stack = self._gpu_alloc(sz) + + def _at_profile_finalize(self): + super()._at_profile_finalize() + with contextlib.suppress(RuntimeError): System.write_sysfs("/sys/class/kgsl/kgsl-3d0/idle_timer", "10", "Failed to reenable suspend mode") diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_rdma.py b/artifacts/package_runtime/tinygrad/runtime/ops_rdma.py new file mode 100644 index 000000000..6f7a46600 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_rdma.py @@ -0,0 +1,106 @@ +from __future__ import annotations +import mmap, struct, functools +from typing import cast +from tinygrad.uop.ops import sint +from tinygrad.runtime.support.hcq import HCQCompiled, HCQAllocatorBase, HCQAllocator, HWQueue, HCQBuffer, FileIOInterface +from tinygrad.runtime.support.system import System, PCIIfaceBase, PCIAllocationMeta +from tinygrad.runtime.support.memory import VirtMapping, AddrSpace +from tinygrad.runtime.support.mlx.mlxdev import MLXDev, MLXQP +from tinygrad.helpers import unwrap, to_be32, to_be64 + +class RDMACopyQueue(HWQueue): + def __init__(self, dev:RDMADevice): + self.dev = dev + super().__init__() + + def _wqe_data(self, buf:HCQBuffer, sz:int, nic:RDMADevice) -> bytes: + cast(HCQAllocatorBase, nic.allocator)._map(buf) + return struct.pack('>IIQ', sz, buf.mappings[nic].meta, buf.mappings[nic].va_addr + (buf.va_addr - buf.base.va_addr)) + + def encode_ring(self, hwq:HWQueue, dev:HCQCompiled, iface:MLXIface, qp:MLXQP, cq_buf:HCQBuffer, head:sint, ring_uar:bool=False): + for buf in [iface.dbr_buf, cq_buf] + ([iface.uar_buf] if ring_uar else []): cast(HCQAllocator, dev.allocator)._map(buf) + hwq.write(iface.dbr_buf.offset(qp.qp_dbr + (4 if ring_uar else 0)), to_be32(head + 1)) + if ring_uar: hwq.write(iface.uar_buf.offset(0x800), to_be64(((head << 8) | 0x0a) << 32 | ((qp.qp_info['qpn'] << 8) | 2)), b64=True) + hwq.poll_bit(cq_buf.offset((head & (qp.cq_size - 1)) * 64 + 60, 4), ((head >> (qp.cq_size.bit_length() - 1)) & 1) << 24, mask=0x01000000) + hwq.write(iface.dbr_buf.offset(qp.cq_dbr), to_be32((head + 1) & 0xFFFFFF)) + return self + + def copy(self, dest:HCQBuffer, src:HCQBuffer, sz:int): + src_qp, dest_qp, _, _ = self.dev.iface.connect(remote_nic:=unwrap(dest.owner).rdma_dev()) + + sq_wqe = bytearray(64) + sq_wqe[4:8] = struct.pack('>I', (src_qp.qp_info['qpn'] << 8) | 2) + sq_wqe[11] = 0x08 # CE: signal completion + sq_wqe[16:32] = self._wqe_data(src, sz, self.dev) + + self.q(remote_nic, bytes(sq_wqe), self._wqe_data(dest, sz, remote_nic)) + return self + + def _submit(self, dev:RDMADevice): + for remote_nic, sq_wqe, rq_wqe in zip(self._q[0::3], self._q[1::3], self._q[2::3]): + src_qp, dest_qp, _, _ = dev.iface.connect(remote_nic) + assert src_qp.head + 1 - to_be32(src_qp.dev.dbr[src_qp.qp_dbr // 4 + 1]) <= (1 << src_qp.log_sq_size), "SQ ring full" + assert src_qp.head + 1 - to_be32(dest_qp.dev.dbr[dest_qp.qp_dbr // 4]) <= (1 << dest_qp.log_rq_size), "RQ ring full" + dest_qp.qp_buf.view((src_qp.head & ((1 << dest_qp.log_rq_size) - 1)) * 16, 16)[:] = rq_wqe + sq_view = src_qp.qp_buf.view(src_qp.sq_offset + (src_qp.head & ((1 << src_qp.log_sq_size) - 1)) * 64, 64) + sq_view[:] = struct.pack('>I', (src_qp.head << 8) | 0x0a) + sq_wqe[4:] + src_qp.head += 1 + +class MLXIface(PCIIfaceBase): + def __init__(self, dev:RDMADevice, dev_id:int): + cl, pcibus = System.list_devices(vendor=0x15b3, devices=((0xffff, (0x101b,)),))[dev_id] + self.dev = dev + self.pci_dev = cl("mlx", pcibus) + self.mlx_dev = MLXDev(self.pci_dev, ip=f"10.0.0.{dev_id}") + self.uar_buf = self._buf([self.mlx_dev.pci_dev.bar_info(0)[0] + self.mlx_dev.uar * 0x1000]) + self.dbr_buf = self._buf(self.mlx_dev.dbr_paddrs) + + def is_bar_small(self) -> bool: return False + + def _buf(self, paddrs:list[int]) -> HCQBuffer: + va = FileIOInterface.anon_mmap(0, size:=len(paddrs) * 0x1000, 0, mmap.MAP_PRIVATE | mmap.MAP_ANONYMOUS, 0) + mapping = VirtMapping(va, size, [(p, 0x1000) for p in paddrs], AddrSpace.SYS, uncached=True, snooped=True) + return HCQBuffer(va, size, meta=PCIAllocationMeta(mapping, has_cpu_mapping=False), owner=self.dev) + + @functools.cache + def connect(self, remote_nic:RDMADevice) -> tuple[MLXQP, MLXQP, HCQBuffer, HCQBuffer]: + src_qp, dest_qp = MLXQP(self.mlx_dev, log_sq_size=7, log_rq_size=7), MLXQP(remote_nic.iface.mlx_dev, log_sq_size=7, log_rq_size=7) + src_qp.connect(dest_qp) + dest_qp.connect(src_qp) + return src_qp, dest_qp, self._buf(src_qp.cq_paddrs), remote_nic.iface._buf(dest_qp.cq_paddrs) + +class RDMAAllocator(HCQAllocatorBase): + def __init__(self, dev:RDMADevice): super().__init__(dev, batch_cnt=0) + + def _do_map(self, buf:HCQBuffer) -> HCQBuffer: + owner = unwrap(buf.base.owner) + bar, paddrs = owner.iface.pci_dev.bar_info(owner.iface.vram_bar)[0], buf.base.meta.mapping.paddrs # type: ignore[attr-defined] + page_sz = (2 << 20) if min(sz for _, sz in paddrs) >= (2 << 20) else (4 << 10) + pages = [bar + p + off for p, sz in paddrs for off in range(0, sz, page_sz)] + return HCQBuffer(bar + paddrs[0][0], buf.base.size, owner=owner, + meta=self.dev.iface.mlx_dev.register_mem(pages, len(pages) * page_sz, page_sz.bit_length() - 1)) + + def _do_free(self, buf:HCQBuffer, options): self.dev.iface.mlx_dev.unregister_mem(buf.meta) + def _unmap(self, mb): self.dev.iface.mlx_dev.unregister_mem(mb.meta) + + def _transfer(self, dest:HCQBuffer, src:HCQBuffer, sz:int, src_dev:HCQCompiled, dest_dev:HCQCompiled): + # sync device + src_q = unwrap(dest_dev.hw_compute_queue_t)().wait(src_dev.timeline_signal, src_dev.timeline_value - 1) + dest_q = unwrap(dest_dev.hw_compute_queue_t)().wait(dest_dev.timeline_signal, dest_dev.timeline_value - 1) + + # rdma body + encode doorbell rings + src_qp, dest_qp, src_cq_buf, dest_cq_buf = self.dev.iface.connect(remote_nic:=dest_dev.rdma_dev()) + RDMACopyQueue(self.dev).copy(dest, src, sz) \ + .encode_ring(src_q, src_dev, self.dev.iface, src_qp, src_cq_buf, src_qp.head, ring_uar=True) \ + .encode_ring(dest_q, dest_dev, remote_nic.iface, dest_qp, dest_cq_buf, src_qp.head) \ + .submit(self.dev) + + # signal completion + src_q.signal(src_dev.timeline_signal, src_dev.next_timeline()).submit(src_dev) + dest_q.signal(dest_dev.timeline_signal, dest_dev.next_timeline()).submit(dest_dev) + +class RDMADevice(HCQCompiled): + def __init__(self, device:str=""): + self.device_id = int(device.split(":")[1]) if ":" in device else 0 + self.iface = MLXIface(self, self.device_id) + super().__init__(device, RDMAAllocator(self), [], None, signal_t=None) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_tinyfs.py b/artifacts/package_runtime/tinygrad/runtime/ops_tinyfs.py new file mode 100644 index 000000000..c041a65de --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_tinyfs.py @@ -0,0 +1,128 @@ +import socket, json, asyncio, threading, math +from contextlib import asynccontextmanager +from tinygrad.device import Compiled, Allocator +from tinygrad.helpers import DEBUG, getenv, CHUNK_SIZE + +TINYFS_ENDPOINT = getenv("TINYFS_ENDPOINT", "localhost:6767") +TINYFS_TIMEOUT = getenv("TINYFS_TIMEOUT", 60) + +class TinyFSDevice(Compiled): + def __init__(self, device:str): + self.op = device[len("tinyfs:"):].upper() + super().__init__(device, TinyFSAllocator(self), [], None, None) + + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect((TINYFS_ENDPOINT.rsplit(":", 1)[0], int(TINYFS_ENDPOINT.rsplit(":", 1)[1]))) + self.sock.settimeout(TINYFS_TIMEOUT) + self.sfile = self.sock.makefile("rwb") + + # fetch node info + self.sfile.write(b"INFO\r\n") + self.sfile.flush() + info = self.sfile.readline() + self.node_info = json.loads(info) + if DEBUG >= 2: print(f"nodes: {self.node_info}") + + # spawn thread for async copyout + self.start_event = threading.Event() + self.t = threading.Thread(target=self._start_thread, daemon=True) + self.t.start() + self.start_event.wait() + + # connection pools + self.conn_pools: dict[str, asyncio.Queue] = {} + self.conn_pools_lock = asyncio.Lock() + + def finalize(self): + self.sfile.close() + + for pool in self.conn_pools.values(): + while not pool.empty(): + _, w = pool.get_nowait() + w.close() + asyncio.run_coroutine_threadsafe(w.wait_closed(), self.loop).result() + + if hasattr(self, "loop"): + self.loop.call_soon_threadsafe(self.loop.stop) + self.t.join() + + def _start_thread(self): + self.loop = asyncio.new_event_loop() + asyncio.set_event_loop(self.loop) + + self.start_event.set() + self.loop.run_forever() + self.loop.close() + + @asynccontextmanager + async def connection(self, loc): + if loc not in self.conn_pools: + await self.conn_pools_lock.acquire() + if loc not in self.conn_pools: + self.conn_pools[loc] = asyncio.Queue(nw:=getenv("ASYNC_COPY_WORKERS", 4)) + conn_tasks = [asyncio.open_connection(*self.node_info[loc][-1].rsplit(":", 1)) for _ in range(nw)] + connections = await asyncio.gather(*conn_tasks) + for reader, writer in connections: self.conn_pools[loc].put_nowait((reader, writer)) + self.conn_pools_lock.release() + + reader, writer = await self.conn_pools[loc].get() + try: + yield reader, writer + finally: + await self.conn_pools[loc].put((reader, writer)) + +class TinyFSBuffer: + def __init__(self, device:TinyFSDevice, size:int, offset=0, copyout_queue=None, hash_buf=None): + self.device, self.size, self.offset = device, size, offset + self.copyout_queue = [] if copyout_queue is None else copyout_queue + self.hash_buf = bytearray() if hash_buf is None else hash_buf + def __repr__(self): return f"" + +class TinyFSAllocator(Allocator[TinyFSDevice]): + def _alloc(self, size, options): + return TinyFSBuffer(self.dev, size) + + def _copyin(self, dest:TinyFSBuffer, src:memoryview): + if DEBUG >= 2: print(f"Copying in {dest.size} bytes to TINYFS:{dest.device.op}") + self.dev.sfile.write(f"{dest.device.op}_IN {dest.size}\r\n".encode()) + + self.dev.sfile.write(src) + self.dev.sfile.flush() + + if dest.device.op == "LOAD": + locs = self.dev.sfile.readline() + dest.copyout_queue[:] = json.loads(locs) + dest.hash_buf[:] = src.tobytes() + elif dest.device.op == "STORE": + expected_hashes = math.ceil(dest.size / CHUNK_SIZE) + dest.hash_buf[:] = bytearray(expected_hashes * 16) + self.dev.sfile.readinto(dest.hash_buf) + + def _copyout(self, dest:memoryview, src:TinyFSBuffer): + if DEBUG >= 2: print(f"Copying out {src.size} bytes from TINYFS:{src.device.op}") + if src.device.op == "LOAD": + asyncio.run_coroutine_threadsafe(self._copyout_async(dest, src), src.device.loop).result() + elif src.device.op == "STORE": + dest[:] = src.hash_buf + + async def _copyout_async(self, dest:memoryview, src:TinyFSBuffer): + async def _worker(i, loc): + async with self.dev.connection(loc) as (reader, writer): + ptr = i * CHUNK_SIZE + size = min(len(dest[ptr:ptr+CHUNK_SIZE]), CHUNK_SIZE) + + writer.write(f"CHUNK_OUT {size}\r\n".encode()) + writer.write(src.hash_buf[i*16:(i+1)*16]) + await asyncio.wait_for(writer.drain(), timeout=TINYFS_TIMEOUT) + + chunk = await asyncio.wait_for(reader.readexactly(size), timeout=TINYFS_TIMEOUT) + + view = dest[ptr:ptr+len(chunk)] + view[:] = chunk + del view + + workers = [asyncio.create_task(_worker(i, loc)) for i, loc in enumerate(src.copyout_queue)] + await asyncio.gather(*workers) + + def _offset(self, buf:TinyFSBuffer, size:int, offset:int): + return TinyFSBuffer(buf.device, size, offset, buf.copyout_queue, buf.hash_buf) diff --git a/artifacts/package_runtime/tinygrad/runtime/ops_webgpu.py b/artifacts/package_runtime/tinygrad/runtime/ops_webgpu.py new file mode 100644 index 000000000..dc3466e4a --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/ops_webgpu.py @@ -0,0 +1,221 @@ +import functools, struct +from tinygrad.device import Compiled, Allocator, BufferSpec, Program, TinyELF +from tinygrad.renderer.wgsl import WGSLRenderer +from tinygrad.helpers import round_up, suppress_finalizing, getenv, to_mv +from tinygrad.runtime.autogen import webgpu +from tinygrad.runtime.support import c +from typing import Callable +import ctypes + +backend_types = {v: k for k, v in webgpu.enum_WGPUBackendType.items()} +instance = webgpu.wgpuCreateInstance(webgpu.WGPUInstanceDescriptor(features=webgpu.WGPUInstanceFeatures(timedWaitAnyEnable=True))) + +def from_wgpu_str(string_view:webgpu.WGPUStringView) -> str: return ctypes.string_at(string_view.data, string_view.length).decode() +def to_wgpu_str(_str:str) -> webgpu.WGPUStringView: return webgpu.WGPUStringView(data=ctypes.create_string_buffer(_str.encode()), length=len(_str)) + +# gets a memoryview from a buffer, which is assumed to have MAP_READ (see _readable_buffer) +def buf_to_mv(buf:webgpu.WGPUBuffer) -> memoryview: + BufferMapAsync(buf, webgpu.WGPUMapMode_Read, 0, size:=webgpu.wgpuBufferGetSize(buf)) + return to_mv(webgpu.wgpuBufferGetConstMappedRange(buf, 0, size), size) + +# turns a webgpu function returning a future into python-synchronous function +# the new function handles the status code and optional error message, returning the other callback arguments +def synchronous(status_enum:dict[int, str], has_emsg:bool=False): + def wrap(fn:Callable[..., webgpu.WGPUFuture]) -> Callable: + @functools.wraps(fn) + def wrapper(*args): + status, payload, emsg = 0, [], None + + @next(ty for nm, ty, *_ in fn.argtypes[-1]._real_fields_ if nm == "callback") # type: ignore + def cb(s:int, *args): + nonlocal status, payload, emsg + # the last two arguments are "userdata1" and "userdata2", which we drop + # we must process wgpu strings in this callback, as they will be freed after we return + status, (*payload, emsg) = s, [from_wgpu_str(a) if type(a) is webgpu.WGPUStringView else a for a in args[:-2]] + ([] if has_emsg else [None]) + + future = fn(*args, fn.argtypes[-1](mode=webgpu.WGPUCallbackMode_WaitAnyOnly, callback=cb)) # type: ignore + if (future_status:=webgpu.wgpuInstanceWaitAny(instance, 1, webgpu.WGPUFutureWaitInfo(future), 2**64-1)) != webgpu.WGPUWaitStatus_Success: + raise RuntimeError(f"error while waiting for future ({fn.__name__}): {webgpu.enum_WGPUWaitStatus.get(future_status)}") + + if status != 1: raise RuntimeError(f"[{status_enum.get(status)}]{emsg or ''}") + return payload if len(payload) > 1 else payload[0] if len(payload) == 1 else None + return wrapper + return wrap + +BufferMapAsync = synchronous(webgpu.enum_WGPUBufferMapAsyncStatus, True)(webgpu.wgpuBufferMapAsync2) +DevicePopErrorScope = synchronous(webgpu.enum_WGPUPopErrorScopeStatus)(webgpu.wgpuDevicePopErrorScope2) +DeviceCreateComputePipeline = synchronous(webgpu.enum_WGPUCreatePipelineAsyncStatus, True)(webgpu.wgpuDeviceCreateComputePipelineAsync2) +InstanceRequestAdapter = synchronous(webgpu.enum_WGPURequestAdapterStatus, True)(webgpu.wgpuInstanceRequestAdapter2) +AdapterRequestDevice = synchronous(webgpu.enum_WGPURequestDeviceStatus, True)(webgpu.wgpuAdapterRequestDevice2) +QueueOnSubmittedWorkDone = synchronous(webgpu.enum_WGPUQueueWorkDoneStatus)(webgpu.wgpuQueueOnSubmittedWorkDone2) + +class WebGPUProgram(Program['WebGpuDevice']): + def __init__(self, dev:'WebGpuDevice', obj:TinyELF): + self.dev, self.name = dev, to_wgpu_str(obj.name) + + # Creating shader module + shader = webgpu.WGPUShaderModuleWGSLDescriptor(code=to_wgpu_str(obj.lib.decode()), + chain=webgpu.WGPUChainedStruct(sType=webgpu.WGPUSType_ShaderSourceWGSL)) + module = webgpu.WGPUShaderModuleDescriptor(nextInChain=ctypes.cast(ctypes.pointer(shader), ctypes.POINTER(webgpu.struct_WGPUChainedStruct))) + + # Check compiler error + webgpu.wgpuDevicePushErrorScope(self.dev.device_res, webgpu.WGPUErrorFilter_Validation) + self.prg = webgpu.wgpuDeviceCreateShaderModule(self.dev.device_res, module) + if err := self.dev.pop_error(): raise RuntimeError(f"Shader compilation failed: {err}") + + @suppress_finalizing + def __del__(self): webgpu.wgpuShaderModuleRelease(self.prg) + + def __call__(self, *bufs:webgpu.WGPUBuffer, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), + vals:tuple[int, ...]=(), wait=False, **kw) -> float|None: + wait = wait and webgpu.WGPUFeatureName_TimestampQuery in self.dev.features + + # Creating bind group layout + def bgl_entry(n:int, ty:str): + return webgpu.WGPUBindGroupLayoutEntry(binding=n, visibility=webgpu.WGPUShaderStage_Compute, + buffer=webgpu.WGPUBufferBindingLayout(type=getattr(webgpu, f'WGPUBufferBindingType_{ty}'))) + bind_entries = (webgpu.WGPUBindGroupLayoutEntry * (1+len(bufs)+len(vals)))( + bgl_entry(0, 'Uniform'), *(bgl_entry(i+1, 'Uniform' if i >= len(bufs) else 'Storage') for i in range(len(bufs)+len(vals)))) + + webgpu.wgpuDevicePushErrorScope(self.dev.device_res, webgpu.WGPUErrorFilter_Validation) + bind_layout = webgpu.wgpuDeviceCreateBindGroupLayout(self.dev.device_res, + webgpu.WGPUBindGroupLayoutDescriptor(entryCount=len(bind_entries), entries=bind_entries)) + + if err := self.dev.pop_error(): raise RuntimeError(f"Error creating bind group layout: {err}") + + # Creating pipeline layout + pipeline_layout_desc = webgpu.WGPUPipelineLayoutDescriptor(bindGroupLayoutCount=1, bindGroupLayouts=(webgpu.WGPUBindGroupLayout*1)(bind_layout)) + + webgpu.wgpuDevicePushErrorScope(self.dev.device_res, webgpu.WGPUErrorFilter_Validation) + pipeline_layout = webgpu.wgpuDeviceCreatePipelineLayout(self.dev.device_res, pipeline_layout_desc) + if err := self.dev.pop_error(): raise RuntimeError(f"Error creating pipeline layout: {err}") + + # Creating bind group + def bg_entry(n:int, x:webgpu.WGPUBuffer|int|float): + buf = x if isinstance(x, webgpu.WGPUBuffer) else self.dev.create_uniform(x) + return webgpu.WGPUBindGroupEntry(binding=n, buffer=buf, offset=0, size=webgpu.wgpuBufferGetSize(buf)) + bindings = (webgpu.WGPUBindGroupEntry * (1+len(bufs)+len(vals)))(bg_entry(0, float('inf')), *(bg_entry(i+1, x) for i,x in enumerate(bufs+vals))) + + bind_group_desc = webgpu.WGPUBindGroupDescriptor(layout=bind_layout, entryCount=len(bindings), entries=bindings) + webgpu.wgpuDevicePushErrorScope(self.dev.device_res, webgpu.WGPUErrorFilter_Validation) + bind_group = webgpu.wgpuDeviceCreateBindGroup(self.dev.device_res, bind_group_desc) + if err := self.dev.pop_error(): raise RuntimeError(f"Error creating bind group: {err}") + + # Creating compute pipeline + compute_desc = webgpu.WGPUComputePipelineDescriptor(layout=pipeline_layout, + compute=webgpu.WGPUComputeState(module=self.prg, entryPoint=self.name)) + pipeline_result = DeviceCreateComputePipeline(self.dev.device_res, compute_desc) + + command_encoder = webgpu.wgpuDeviceCreateCommandEncoder(self.dev.device_res, webgpu.WGPUCommandEncoderDescriptor()) + comp_pass_desc = webgpu.WGPUComputePassDescriptor() + + if wait: + query_set = webgpu.wgpuDeviceCreateQuerySet(self.dev.device_res, webgpu.WGPUQuerySetDescriptor(type=webgpu.WGPUQueryType_Timestamp, count=2)) + query_buf = webgpu.wgpuDeviceCreateBuffer( + self.dev.device_res, webgpu.WGPUBufferDescriptor(size=16, usage=webgpu.WGPUBufferUsage_QueryResolve | webgpu.WGPUBufferUsage_CopySrc)) + comp_pass_desc.timestampWrites = c.pointer(webgpu.WGPUComputePassTimestampWrites(querySet=query_set, beginningOfPassWriteIndex=0, + endOfPassWriteIndex=1)) + + # Begin compute pass + compute_pass = webgpu.wgpuCommandEncoderBeginComputePass(command_encoder, comp_pass_desc) + webgpu.wgpuComputePassEncoderSetPipeline(compute_pass, pipeline_result) + webgpu.wgpuComputePassEncoderSetBindGroup(compute_pass, 0, bind_group, 0, None) + webgpu.wgpuComputePassEncoderDispatchWorkgroups(compute_pass, *global_size) + webgpu.wgpuComputePassEncoderEnd(compute_pass) + + if wait: webgpu.wgpuCommandEncoderResolveQuerySet(command_encoder, query_set, 0, 2, query_buf, 0) + + cmd_buf = webgpu.wgpuCommandEncoderFinish(command_encoder, webgpu.WGPUCommandBufferDescriptor()) + webgpu.wgpuQueueSubmit(self.dev.queue, 1, (webgpu.WGPUCommandBuffer*1)(cmd_buf)) + + # release created objects + webgpu.wgpuBindGroupLayoutRelease(bind_layout) + webgpu.wgpuPipelineLayoutRelease(pipeline_layout) + webgpu.wgpuBindGroupRelease(bind_group) + webgpu.wgpuComputePipelineRelease(pipeline_result) + webgpu.wgpuCommandEncoderRelease(command_encoder) + webgpu.wgpuComputePassEncoderRelease(compute_pass) + webgpu.wgpuCommandBufferRelease(cmd_buf) + + if wait: + time = ((timestamps:=buf_to_mv(tmp_buf:=self.dev._readable_buffer(query_buf)).cast("Q").tolist())[1] - timestamps[0]) / 1e9 + self.dev.free(query_buf) + self.dev.free(tmp_buf) + webgpu.wgpuQuerySetDestroy(query_set) + webgpu.wgpuQuerySetRelease(query_set) + return time + return None + +class WebGpuAllocator(Allocator['WebGpuDevice']): + def _alloc(self, size:int, options:BufferSpec) -> webgpu.WGPUBuffer: + # WebGPU buffers have to be 4-byte aligned + return webgpu.wgpuDeviceCreateBuffer(self.dev.device_res, webgpu.WGPUBufferDescriptor(size=round_up(size, 4), + usage=webgpu.WGPUBufferUsage_Storage | webgpu.WGPUBufferUsage_CopyDst | webgpu.WGPUBufferUsage_CopySrc)) + def _copyin(self, dest:webgpu.WGPUBuffer, src:memoryview): + if src.nbytes % 4: + padded_src = bytearray(round_up(src.nbytes, 4)) + padded_src[:src.nbytes] = src + self.dev.write_buffer(dest, padded_src if src.nbytes % 4 else src) + def _copyout(self, dest:memoryview, src:webgpu.WGPUBuffer): + dest[:] = buf_to_mv(tmp_buf:=self.dev._readable_buffer(src))[:dest.nbytes] + self.dev.free(tmp_buf) + + def _free(self, opaque:webgpu.WGPUBuffer, options:BufferSpec): self.dev.free(opaque) + +class WebGpuDevice(Compiled): + def __init__(self, device:str): + # Requesting an adapter + adapter_res = InstanceRequestAdapter(instance, webgpu.WGPURequestAdapterOptions( + powerPreference=webgpu.WGPUPowerPreference_HighPerformance, backendType=backend_types.get(getenv("WEBGPU_BACKEND", ""), 0))) + + # Get supported features + webgpu.wgpuAdapterGetFeatures(adapter_res, supported_features:=webgpu.WGPUSupportedFeatures()) + self.features = [feat for i in range(supported_features.featureCount) + if (feat:=supported_features.features[i]) in [webgpu.WGPUFeatureName_TimestampQuery, webgpu.WGPUFeatureName_ShaderF16]] + webgpu.wgpuSupportedFeaturesFreeMembers(supported_features) + dev_desc = webgpu.WGPUDeviceDescriptor(requiredFeatureCount=len(self.features), + requiredFeatures=(webgpu.WGPUFeatureName * len(self.features))(*self.features)) + + # Limits + webgpu.wgpuAdapterGetLimits(adapter_res, supported_limits:=webgpu.WGPUSupportedLimits()) + dev_desc.requiredLimits = c.pointer(webgpu.WGPURequiredLimits(limits=supported_limits.limits)) + + # Requesting a device + self.device_res = AdapterRequestDevice(adapter_res, dev_desc) + self.queue = webgpu.wgpuDeviceGetQueue(self.device_res) + + webgpu.wgpuAdapterRelease(adapter_res) + + super().__init__(device, WebGpuAllocator(self), [WGSLRenderer], WebGPUProgram, + arch="shader-f16" * (webgpu.WGPUFeatureName_ShaderF16 in self.features)) + + def synchronize(self): QueueOnSubmittedWorkDone(self.queue) + + @suppress_finalizing + def free(self, buf:webgpu.WGPUBuffer): + if webgpu.wgpuBufferGetMapState(buf) == webgpu.WGPUBufferMapState_Mapped: webgpu.wgpuBufferUnmap(buf) + webgpu.wgpuBufferDestroy(buf) + webgpu.wgpuBufferRelease(buf) + + def pop_error(self) -> str: return DevicePopErrorScope(self.device_res)[1] + def create_uniform(self, val:int|float) -> webgpu.WGPUBuffer: + buf = webgpu.wgpuDeviceCreateBuffer(self.device_res, + webgpu.WGPUBufferDescriptor(size=4, usage=webgpu.WGPUBufferUsage_Uniform | webgpu.WGPUBufferUsage_CopyDst)) + self.write_buffer(buf, val.to_bytes(4, "little") if isinstance(val, int) else struct.pack(' webgpu.WGPUBuffer: + size = webgpu.wgpuBufferGetSize(buf) + ret = webgpu.wgpuDeviceCreateBuffer(self.device_res, + webgpu.WGPUBufferDescriptor(size=size, usage=webgpu.WGPUBufferUsage_CopyDst | webgpu.WGPUBufferUsage_MapRead, mappedAtCreation=False)) + + # copy_buffer_to_buffer + encoder = webgpu.wgpuDeviceCreateCommandEncoder(self.device_res, webgpu.WGPUCommandEncoderDescriptor()) + webgpu.wgpuCommandEncoderCopyBufferToBuffer(encoder, buf, 0, ret, 0, size) + cmd_buf = webgpu.wgpuCommandEncoderFinish(encoder, webgpu.WGPUCommandBufferDescriptor()) + webgpu.wgpuQueueSubmit(self.queue, 1, (webgpu.WGPUCommandBuffer*1)(cmd_buf)) + webgpu.wgpuCommandBufferRelease(cmd_buf) + webgpu.wgpuCommandEncoderRelease(encoder) + + return ret + def write_buffer(self, buf:webgpu.WGPUBuffer, src:memoryview|bytearray|bytes): + webgpu.wgpuQueueWriteBuffer(self.queue, buf, 0, (ctypes.c_uint8 * len(src)).from_buffer_copy(src), len(src)) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/__init__.py b/artifacts/package_runtime/tinygrad/runtime/support/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/support/am/__init__.py b/artifacts/package_runtime/tinygrad/runtime/support/am/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/support/am/amdev.py b/artifacts/package_runtime/tinygrad/runtime/support/am/amdev.py new file mode 100644 index 000000000..d4b577123 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/am/amdev.py @@ -0,0 +1,334 @@ +from __future__ import annotations +import ctypes, collections, dataclasses, functools, hashlib, array +from tinygrad.helpers import mv_address, getenv, DEBUG, lo32, hi32, fetch_fw +from tinygrad.runtime.autogen import pci +from tinygrad.runtime.autogen.am import am, fw +from tinygrad.runtime.support.amd import AMDReg, import_module, import_asic_regs +from tinygrad.runtime.support.memory import TLSFAllocator, MemoryManager, AddrSpace +from tinygrad.runtime.support.system import PCIDevice +from tinygrad.runtime.support.am.ip import AM_IP, AM_SOC, AM_GMC, AM_IH, AM_PSP, AM_SMU, AM_GFX, AM_SDMA + +AM_DEBUG = getenv("AM_DEBUG", 0) + +@dataclasses.dataclass +class AMRegister(AMDReg): + adev:AMDev + + def read(self, inst=0): return self.adev.rreg(self.addr[inst]) + def read_bitfields(self, inst=0) -> dict[str, int]: return self.decode(self.read(inst=inst)) + + def write(self, _am_val:int=0, inst=0, **kwargs): self.adev.wreg(self.addr[inst], _am_val | self.encode(**kwargs)) + + def update(self, inst=0, **kwargs): self.write(self.read(inst=inst) & ~self.fields_mask(*kwargs.keys()), inst=inst, **kwargs) + +class AMFirmware: + def __init__(self, adev): + self.adev = adev + def fmt_ver(hwip): return '_'.join(map(str, adev.ip_ver[hwip])) + + # Load SOS firmware + self.sos_fw = {} + + blob, sos_hdr = self.load_fw(f"psp_{fmt_ver(am.MP0_HWIP)}_sos.bin", versioned_header='struct_psp_firmware_header') + fw_bin = sos_hdr.psp_fw_bin + + for fw_i in range(sos_hdr.psp_fw_bin_count): + fw_bin_desc = am.struct_psp_fw_bin_desc.from_address(ctypes.addressof(fw_bin) + fw_i * ctypes.sizeof(am.struct_psp_fw_bin_desc)) + ucode_start_offset = fw_bin_desc.offset_bytes + sos_hdr.header.ucode_array_offset_bytes + self.sos_fw[fw_bin_desc.fw_type] = blob[ucode_start_offset:ucode_start_offset+fw_bin_desc.size_bytes] + + # Load other fw + self.ucode_start: dict[str, int] = {} + self.descs: list[tuple[list[int], memoryview]] = [] + + # SMU firmware + if adev.ip_ver[am.MP1_HWIP] != (13,0,12): + blob, hdr = self.load_fw(f"smu_{fmt_ver(am.MP1_HWIP)}.bin", versioned_header="struct_smc_firmware_header") + if self.adev.ip_ver[am.GC_HWIP] >= (11,0,0): + self.smu_psp_desc = self.desc(blob, hdr.v1_0.header.ucode_array_offset_bytes, hdr.v1_0.header.ucode_size_bytes, am.GFX_FW_TYPE_SMU) + else: + p2stables = (am.struct_smc_soft_pptable_entry * hdr.pptable_count).from_buffer(blob[hdr.pptable_entry_offset:]) + for p2stable in p2stables: + if p2stable.id == (__P2S_TABLE_ID_X:=0x50325358): + self.descs += [self.desc(blob, p2stable.ppt_offset_bytes, p2stable.ppt_size_bytes, am.GFX_FW_TYPE_P2S_TABLE)] + + # SDMA firmware + blob, hdr = self.load_fw(f"sdma_{fmt_ver(am.SDMA0_HWIP)}.bin", versioned_header="struct_sdma_firmware_header") + if hdr.header.header_version_major == 1: + self.descs += [self.desc(blob, hdr.header.ucode_array_offset_bytes, hdr.header.ucode_size_bytes, am.GFX_FW_TYPE_SDMA0, + am.GFX_FW_TYPE_SDMA1, am.GFX_FW_TYPE_SDMA2, am.GFX_FW_TYPE_SDMA3)] + elif hdr.header.header_version_major == 2: + self.descs += [self.desc(blob, hdr.ctl_ucode_offset, hdr.ctl_ucode_size_bytes, am.GFX_FW_TYPE_SDMA_UCODE_TH1)] + self.descs += [self.desc(blob, hdr.header.ucode_array_offset_bytes, hdr.ctx_ucode_size_bytes, am.GFX_FW_TYPE_SDMA_UCODE_TH0)] + else: self.descs += [self.desc(blob, hdr.header.ucode_array_offset_bytes, hdr.ucode_size_bytes, am.GFX_FW_TYPE_SDMA_UCODE_TH0)] + + # PFP, ME, MEC firmware + for (fw_name, fw_cnt) in ([('PFP', 1), ('ME', 1)] if self.adev.ip_ver[am.GC_HWIP] >= (12,0,0) else []) + [('MEC', 1)]: + blob, hdr = self.load_fw(f"gc_{fmt_ver(am.GC_HWIP)}_{fw_name.lower()}.bin", versioned_header="struct_gfx_firmware_header") + + ucode_off = hdr.header.ucode_array_offset_bytes + if hdr.header.header_version_major == 1: + # Code + self.descs += [self.desc(blob, ucode_off, hdr.header.ucode_size_bytes - hdr.jt_size * 4, getattr(am, f'GFX_FW_TYPE_CP_{fw_name}'))] + # JT + self.descs += [self.desc(blob, ucode_off + hdr.jt_offset * 4, hdr.jt_size * 4, getattr(am, f'GFX_FW_TYPE_CP_{fw_name}_ME1'))] + else: + # Code + self.descs += [self.desc(blob, ucode_off, hdr.ucode_size_bytes, getattr(am, f'GFX_FW_TYPE_RS64_{fw_name}'))] + # Stack + stack_fws = [getattr(am, f'GFX_FW_TYPE_RS64_{fw_name}_P{fwnum}_STACK') for fwnum in range(fw_cnt)] + self.descs += [self.desc(blob, hdr.data_offset_bytes, hdr.data_size_bytes, *stack_fws)] + self.ucode_start[fw_name] = hdr.ucode_start_addr_lo | (hdr.ucode_start_addr_hi << 32) + + # IMU firmware + if self.adev.ip_ver[am.GC_HWIP] >= (11,0,0): + blob, hdr = self.load_fw(f"gc_{fmt_ver(am.GC_HWIP)}_imu.bin", am.struct_imu_firmware_header_v1_0) + imu_i_off, imu_i_sz, imu_d_sz = hdr.header.ucode_array_offset_bytes, hdr.imu_iram_ucode_size_bytes, hdr.imu_dram_ucode_size_bytes + self.descs += [self.desc(blob, imu_i_off, imu_i_sz, am.GFX_FW_TYPE_IMU_I), self.desc(blob, imu_i_off+imu_i_sz, imu_d_sz, am.GFX_FW_TYPE_IMU_D)] + + # RLC firmware + blob, hdr0, hdr1, hdr2, hdr3 = self.load_fw(f"gc_{fmt_ver(am.GC_HWIP)}_rlc.bin", am.struct_rlc_firmware_header_v2_0, + am.struct_rlc_firmware_header_v2_1, am.struct_rlc_firmware_header_v2_2, am.struct_rlc_firmware_header_v2_3) + + if hdr0.header.header_version_minor == 1: + for mem,fmem in [('LIST_SRM_CNTL', 'list_cntl'), ('LIST_GPM_MEM', 'list_gpm'), ('LIST_SRM_MEM', 'list_srm')]: + off, sz = getattr(hdr1, f'save_restore_{fmem}_offset_bytes'), getattr(hdr1, f'save_restore_{fmem}_size_bytes') + self.descs += [self.desc(blob, off, sz, getattr(am, f'GFX_FW_TYPE_RLC_RESTORE_{mem}'))] + + if hdr0.header.header_version_minor >= 2: + for mem,fmem in [('IRAM', 'iram'), ('DRAM_BOOT', 'dram')]: + off, sz = getattr(hdr2, f'rlc_{fmem}_ucode_offset_bytes'), getattr(hdr2, f'rlc_{fmem}_ucode_size_bytes') + self.descs += [self.desc(blob, off, sz, getattr(am, f'GFX_FW_TYPE_RLC_{mem}'))] + + if hdr0.header.header_version_minor == 3: + for mem in ['P', 'V']: + off, sz = getattr(hdr3, f'rlc{mem.lower()}_ucode_offset_bytes'), getattr(hdr3, f'rlc{mem.lower()}_ucode_size_bytes') + self.descs += [self.desc(blob, off, sz, getattr(am, f'GFX_FW_TYPE_RLC_{mem}'))] + + self.descs += [self.desc(blob, hdr0.header.ucode_array_offset_bytes, hdr0.header.ucode_size_bytes, am.GFX_FW_TYPE_RLC_G)] + + def load_fw(self, fname:str, *headers, versioned_header:str|None=None): + blob = memoryview(bytearray(fetch_fw("amdgpu", fname, fw.hashes[fname]))) + if AM_DEBUG >= 1: print(f"am {self.adev.devfmt}: loading firmware {fname}: {hashlib.sha256(blob).hexdigest()}") + if versioned_header: + chdr = am.struct_common_firmware_header.from_address(mv_address(blob)) + headers += (getattr(am, versioned_header + f"_v{chdr.header_version_major}_{chdr.header_version_minor}"),) + return tuple([blob] + [hdr.from_address(mv_address(blob)) for hdr in headers]) + + def desc(self, blob:memoryview, offset:int, size:int, *types:int) -> tuple[list[int], memoryview]: return (list(types), blob[offset:offset+size]) + +class AMPageTableEntry: + def __init__(self, adev, paddr, lv): self.adev, self.paddr, self.lv, self.entries = adev, paddr, lv, adev.vram.view(paddr, 0x1000, fmt='Q') + + def set_entry(self, entry_id:int, paddr:int, table=False, uncached=False, aspace=AddrSpace.PHYS, snooped=False, frag=0, valid=True): + is_sys = aspace is AddrSpace.SYS + if aspace is AddrSpace.PHYS: paddr = self.adev.paddr2xgmi(paddr) + assert paddr & self.adev.gmc.address_space_mask == paddr, f"Invalid physical address {paddr:#x}" + self.entries[entry_id] = self.adev.gmc.get_pte_flags(self.lv, table, frag, uncached, is_sys, snooped, valid) | (paddr & 0x0000FFFFFFFFF000) + + def entry(self, entry_id:int) -> int: return self.entries[entry_id] + def valid(self, entry_id:int) -> bool: return (self.entries[entry_id] & am.AMDGPU_PTE_VALID) != 0 + def address(self, entry_id:int) -> int: + assert self.entries[entry_id] & am.AMDGPU_PTE_SYSTEM == 0, "should not be system address" + return self.adev.xgmi2paddr(self.entries[entry_id] & 0x0000FFFFFFFFF000) + def is_page(self, entry_id:int) -> bool: return self.lv == am.AMDGPU_VM_PTB or self.adev.gmc.is_pte_huge_page(self.lv, self.entries[entry_id]) + def supports_huge_page(self, paddr:int): return self.lv >= am.AMDGPU_VM_PDB2 + +class AMMemoryManager(MemoryManager): + va_allocator = TLSFAllocator((1 << 44), base=0x200000000000) # global for all devices. + + def on_range_mapped(self): + # Invalidate TLB after mappings. + self.dev.gmc.flush_tlb(ip='GC', vmid=0) + self.dev.gmc.flush_tlb(ip='MM', vmid=0) + +class AMDev: + Version = 0xA0000008 + + def __init__(self, pci_dev:PCIDevice, reset_mode=False): + self.pci_dev, self.devfmt = pci_dev, pci_dev.pcibus + self.vram, self.doorbell64, self.mmio = self.pci_dev.map_bar(0), self.pci_dev.map_bar(2, fmt='Q'), self.pci_dev.map_bar(5, fmt='I') + + self._run_discovery() + self._build_regs() + + # AM boot Process: + # The GPU being passed can be in one of several states: 1. Not initialized. 2. Initialized by amdgpu. 3. Initialized by AM. + # The 1st and 2nd states require a full GPU setup since their states are unknown. The 2nd state also requires a mode1 reset to + # reinitialize all components. + # + # The 3rd state can be set up partially to optimize boot time. In this case, only the GFX and SDMA IPs need to be initialized. + # To enable this, AM uses a separate boot memory that is guaranteed not to be overwritten. This physical memory is utilized for + # all blocks that are initialized only during the initial AM boot. + # To determine if the GPU is in the third state, AM uses regSCRATCH_REG7 as a flag. + # To determine if the previous AM session finalized correctly, AM uses regSCRATCH_REG6 as a flag. + self.is_booting = True # During boot only boot memory can be allocated. This flag is to validate this. + self.init_sw(smi_dev=False) + + self.partial_boot = (self.reg("regSCRATCH_REG7").read() == AMDev.Version) and (getenv("AM_RESET", 0) != 1) + if self.partial_boot and (self.reg("regSCRATCH_REG6").read() != 0 or self.reg(self.gmc.pf_status_reg("GC")).read() != 0): + if DEBUG >= 2: print(f"am {self.devfmt}: Malformed state. Issuing a full reset.") + self.partial_boot = False + + # Init hw for IP blocks where it is needed + if not self.partial_boot: + if self.psp.is_sos_alive() and self.smu.is_smu_alive(): + self.pci_dev.write_config_flush(pci.PCI_COMMAND, self.pci_dev.read_config(pci.PCI_COMMAND, 2) & ~pci.PCI_COMMAND_MASTER, 2) + if self.is_hive(): + if reset_mode: return # in reset mode, do not raise + raise RuntimeError("Malformed state. Use extra/amdpci/hive_reset.py to reset the hive") + self.smu.mode1_reset() + self.pci_dev.write_config_flush(pci.PCI_COMMAND, self.pci_dev.read_config(pci.PCI_COMMAND, 2) | pci.PCI_COMMAND_MASTER, 2) + self.init_hw(self.soc, self.gmc, self.ih, self.psp, self.smu) + + # Booting done + self.is_booting = False + + # Re-initialize main blocks + self.init_hw(self.gfx, self.sdma) + + if (max_power:=getenv("AM_POWER_LIMIT", 0.0)) > 0: + self.smu.set_power_limit(max_power) + self.smu.set_clocks(level=None) + else: self.smu.set_clocks(level=-1) # last level, max perf. + for ip in [self.soc, self.gfx]: ip.set_clockgating_state() + self.reg("regSCRATCH_REG7").write(AMDev.Version) + self.reg("regSCRATCH_REG6").write(1) # set initialized state. + if DEBUG >= 2: print(f"am {self.devfmt}: boot done") + + def init_sw(self, smi_dev=False): + self.smi_dev, self.is_err_state = smi_dev, False + + # Memory manager & firmware + self.mm = AMMemoryManager(self, self.vram_size - self.reserved_vram_size, boot_size=(32 << 20), pt_t=AMPageTableEntry, va_shifts=[12, 21, 30, 39], + va_bits=48, first_lv=am.AMDGPU_VM_PDB2, va_base=AMMemoryManager.va_allocator.base, reserve_ptable=not self.large_bar, + palloc_ranges=[(1 << (i + 12), (2 << 20) if i >= 9 else 0x1000) for i in range(9 * (3 - am.AMDGPU_VM_PDB2), -1, -1)]) + self.fw = AMFirmware(self) + + # Initialize IP blocks + self.soc:AM_SOC = AM_SOC(self) + self.gmc:AM_GMC = AM_GMC(self) + self.ih:AM_IH = AM_IH(self) + self.psp:AM_PSP = AM_PSP(self) + self.smu:AM_SMU = AM_SMU(self) + self.gfx:AM_GFX = AM_GFX(self) + self.sdma:AM_SDMA = AM_SDMA(self) + + # Init sw for all IP blocks + for ip in [self.soc, self.gmc, self.ih, self.psp, self.smu, self.gfx, self.sdma]: ip.init_sw() + + def init_hw(self, *blocks:AM_IP): + for ip in blocks: + ip.init_hw() + if DEBUG >= 2: print(f"am {self.devfmt}: {ip.__class__.__name__} initialized") + + def fini(self): + if DEBUG >= 2: print(f"am {self.devfmt}: Finalizing") + for ip in [self.sdma, self.gfx]: ip.fini_hw() + self.smu.set_clocks(level=0) + self.ih.interrupt_handler() + self.reg("regSCRATCH_REG6").write(self.is_err_state) # set finalized state. + + def recover(self, force=False) -> bool: + if not force and not self.is_err_state: return False + if DEBUG >= 3: print(f"am {self.devfmt}: Start recovery") + self.ih.interrupt_handler() + self.gfx.reset_mec() + self.is_err_state = False + if DEBUG >= 3: print(f"am {self.devfmt}: Recovery complete") + return True + + def is_hive(self) -> bool: return self.gmc.xgmi_seg_sz > 0 + + def paddr2mc(self, paddr:int) -> int: return self.gmc.mc_base + paddr + def paddr2xgmi(self, paddr:int) -> int: return self.gmc.paddr_base + paddr + def xgmi2paddr(self, xgmi_paddr:int) -> int: return xgmi_paddr - self.gmc.paddr_base + + def reg(self, reg:str) -> AMRegister: return self.__dict__[reg] + + def rreg(self, reg:int) -> int: + val = self.indirect_rreg(reg) if reg >= len(self.mmio) else self.mmio[reg] + if AM_DEBUG >= 4 and getattr(self, '_prev_rreg', None) != (reg, val): print(f"am {self.devfmt}: Reading register {reg:#x} with value {val:#x}") + self._prev_rreg = (reg, val) + return val + + def wreg(self, reg:int, val:int): + if AM_DEBUG >= 4: print(f"am {self.devfmt}: Writing register {reg:#x} with value {val:#x}") + if reg >= len(self.mmio): self.indirect_wreg(reg, val) + else: self.mmio[reg] = val + + def wreg_pair(self, reg_base:str, lo_suffix:str, hi_suffix:str, val:int, inst:int=0): + self.reg(f"{reg_base}{lo_suffix}").write(lo32(val), inst=inst) + self.reg(f"{reg_base}{hi_suffix}").write(hi32(val), inst=inst) + + def indirect_rreg(self, reg:int) -> int: + self.reg("regBIF_BX_PF0_RSMU_INDEX").write(reg * 4) + return self.reg("regBIF_BX_PF0_RSMU_DATA").read() + + def indirect_wreg(self, reg:int, val:int): + self.reg("regBIF_BX_PF0_RSMU_INDEX").write(reg * 4) + self.reg("regBIF_BX_PF0_RSMU_DATA").write(val) + + def indirect_wreg_pcie(self, reg:int, val:int, aid:int=0): + reg_addr = reg * 4 + ((((aid & 0b11) << 32) | (1 << 34)) if aid > 0 else 0) + self.reg("regBIF_BX0_PCIE_INDEX2").write(lo32(reg_addr)) + if hi32(reg_addr) > 0: self.reg("regBIF_BX0_PCIE_INDEX2_HI").write(hi32(reg_addr) & 0xff) + self.reg("regBIF_BX0_PCIE_DATA2").write(val) + if hi32(reg_addr) > 0: self.reg("regBIF_BX0_PCIE_INDEX2_HI").write(0) + + def _read_vram(self, addr, size) -> bytes: + assert addr % 4 == 0 and size % 4 == 0, f"Invalid address {addr:#x} or size {size:#x}" + res = [] + for caddr in range(addr, addr + size, 4): + self.wreg(0x06, caddr >> 31) + self.wreg(0x00, (caddr & 0x7FFFFFFF) | 0x80000000) + res.append(self.rreg(0x01)) + return bytes(array.array('I', res)) + + def _run_discovery(self): + # NOTE: Fixed register to query memory size without known ip bases to find the discovery table. + # The table is located at the end of VRAM - 64KB and is 10KB in size. + mmRCC_CONFIG_MEMSIZE = 0xde3 + self.vram_size = self.rreg(mmRCC_CONFIG_MEMSIZE) << 20 + self.large_bar = self.vram.nbytes >= self.vram_size + tmr_offset, tmr_size = self.vram_size - (64 << 10), (10 << 10) + + disc_tbl = self.vram.view(tmr_offset, tmr_size)[:] if self.large_bar else self._read_vram(tmr_offset, tmr_size) + self.bhdr = am.struct_binary_header.from_buffer(bytearray(disc_tbl)) + ihdr = am.struct_ip_discovery_header.from_address(ctypes.addressof(self.bhdr) + self.bhdr.table_list[am.IP_DISCOVERY].offset) + assert self.bhdr.binary_signature == am.BINARY_SIGNATURE and ihdr.signature == am.DISCOVERY_TABLE_SIGNATURE, "discovery signatures mismatch" + + self.regs_offset:dict[int, dict[int, tuple]] = collections.defaultdict(dict) + self.ip_ver:dict[int, tuple[int, int, int]] = {} + + for num_die in range(ihdr.num_dies): + dhdr = am.struct_die_header.from_address(ctypes.addressof(self.bhdr) + ihdr.die_info[num_die].die_offset) + + ip_offset = ctypes.addressof(self.bhdr) + ctypes.sizeof(dhdr) + ihdr.die_info[num_die].die_offset + for _ in range(dhdr.num_ips): + ip = am.struct_ip_v4.from_address(ip_offset) + ba = ((ctypes.c_uint64 if ihdr.base_addr_64_bit else ctypes.c_uint32) * ip.num_base_address).from_address(ip_offset + 8) + for hw_ip in range(1, am.MAX_HWIP): + if hw_ip in am.hw_id_map and am.hw_id_map[hw_ip] == ip.hw_id: + self.regs_offset[hw_ip][ip.instance_number] = tuple(list(ba)) + self.ip_ver[hw_ip] = (ip.major, ip.minor, ip.revision) + + ip_offset += 8 + (8 if ihdr.base_addr_64_bit else 4) * ip.num_base_address + + gc_info = am.struct_gc_info_v1_0.from_address(gc_addr:=ctypes.addressof(self.bhdr) + self.bhdr.table_list[am.GC].offset) + self.gc_info = getattr(am, f"struct_gc_info_v{gc_info.header.version_major}_{gc_info.header.version_minor}").from_address(gc_addr) + self.reserved_vram_size = (384 << 20) if self.ip_ver[am.GC_HWIP][:2] in {(9,4), (9,5)} else (64 << 20) + + @functools.cached_property + def hwid_names(self) -> dict[int, str]: return {v:k.removesuffix('_HWID') for k,v in vars(am).items() if k.endswith('_HWID') and isinstance(v, int)} + + def _ip_module(self, prefix:str, hwip): return import_module(prefix, self.ip_ver[hwip]) + + def _build_regs(self): + mods = [("mp", am.MP0_HWIP), ("hdp", am.HDP_HWIP), ("gc", am.GC_HWIP), ("mmhub", am.MMHUB_HWIP), ("osssys", am.OSSSYS_HWIP), + ("nbio" if self.ip_ver[am.GC_HWIP] < (12,0,0) else "nbif", am.NBIO_HWIP)] + if self.ip_ver[am.SDMA0_HWIP] in {(4,4,2), (4,4,4)}: mods += [("sdma", am.SDMA0_HWIP)] + + for prefix, hwip in mods: + self.__dict__.update(import_asic_regs(prefix, self.ip_ver[hwip], cls=functools.partial(AMRegister, adev=self, bases=self.regs_offset[hwip]))) + self.__dict__.update(import_asic_regs('mp', (11, 0, 0), cls=functools.partial(AMRegister, adev=self, bases=self.regs_offset[am.MP1_HWIP]))) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/am/ip.py b/artifacts/package_runtime/tinygrad/runtime/support/am/ip.py new file mode 100644 index 000000000..fcebddd30 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/am/ip.py @@ -0,0 +1,703 @@ +import ctypes, time, contextlib, functools +from typing import Literal +from tinygrad.helpers import to_mv, data64, lo32, hi32, DEBUG, wait_cond, pad_bytes, getbits +from tinygrad.runtime.autogen.am import am +from tinygrad.runtime.support.amd import import_soc +from tinygrad.runtime.support.memory import AddrSpace + +class AM_IP: + def __init__(self, adev): self.adev = adev + def init_sw(self): pass # Prepare sw/allocations for this IP + def init_hw(self): pass # Initialize hw for this IP + def fini_hw(self): pass # Finalize hw for this IP + def set_clockgating_state(self): pass # Set clockgating state for this IP + +class AM_SOC(AM_IP): + def init_sw(self): + self.module = import_soc(self.adev.ip_ver[am.GC_HWIP]) + self.ih_clients = am.enum_soc21_ih_clientid if (ih_soc21:=self.adev.ip_ver[am.GC_HWIP][0] >= 11) else am.enum_soc15_ih_clientid + + self.gfx_ih_clients = [am.SOC21_IH_CLIENTID_GRBM_CP, am.SOC21_IH_CLIENTID_GFX] \ + if ih_soc21 else [am.SOC15_IH_CLIENTID_GRBM_CP] + [getattr(am, f'SOC15_IH_CLIENTID_SE{i}SH') for i in range(4)] + self.sdma_ih_clients = [] if ih_soc21 else [getattr(am, f'SOC15_IH_CLIENTID_SDMA{i}') for i in range(8)] + + def _ih_srcs(pref:str, hwip:int) -> dict[int, str]: + return {getattr(am, k): k[off+9:] for k in dir(am) if k.startswith(f'{pref}_{self.adev.ip_ver[hwip][0]}') and (off:=k.find('__SRCID__')) != -1} + + gfx_srcs, sdma_srcs = _ih_srcs('GFX', am.GC_HWIP), _ih_srcs('SDMA0', am.SDMA0_HWIP) + self.ih_srcs_names:dict[int, dict[int, str]] = {**{k: gfx_srcs for k in self.gfx_ih_clients}, **{k: sdma_srcs for k in self.sdma_ih_clients}} + + def init_hw(self): + if self.adev.ip_ver[am.NBIO_HWIP] in {(7,9,0), (7,9,1)}: + self.adev.regXCC_DOORBELL_FENCE.write(0x0) + for aid in range(1, self.adev.gmc.vmhubs): + self.adev.indirect_wreg_pcie(self.adev.regXCC_DOORBELL_FENCE.addr[0], self.adev.regXCC_DOORBELL_FENCE.encode(shub_slv_mode=1), aid=aid) + self.adev.regBIFC_GFX_INT_MONITOR_MASK.write(0x7ff) + self.adev.regBIFC_DOORBELL_ACCESS_EN_PF.write(0xfffff) + else: self.adev.regRCC_DEV0_EPF2_STRAP2.update(strap_no_soft_reset_dev0_f2=0x0) + self.adev.regRCC_DEV0_EPF0_RCC_DOORBELL_APER_EN.write(0x1) + def set_clockgating_state(self): + if self.adev.ip_ver[am.HDP_HWIP] >= (5,2,1): self.adev.regHDP_MEM_POWER_CTRL.update(atomic_mem_power_ctrl_en=1, atomic_mem_power_ds_en=1) + + def doorbell_enable(self, port, awid=0, awaddr_31_28_value=0, offset=0, size=0, aid=0): + reg = self.adev.reg(f"{'regGDC_S2A0_S2A' if self.adev.ip_ver[am.GC_HWIP] >= (12,0,0) else 'regS2A'}_DOORBELL_ENTRY_{port}_CTRL") + val = reg.encode(**{f"s2a_doorbell_port{port}_enable":1, f"s2a_doorbell_port{port}_awid":awid, f"s2a_doorbell_port{port}_range_size":size, + f"s2a_doorbell_port{port}_awaddr_31_28_value":awaddr_31_28_value, f"s2a_doorbell_port{port}_range_offset":offset}) + + if self.adev.ip_ver[am.NBIO_HWIP] in {(7,9,0), (7,9,1)}: self.adev.indirect_wreg_pcie(reg.addr[0], val, aid=aid) + else: reg.write(val) + +class AM_GMC(AM_IP): + def init_sw(self): + self.vmhubs = len(self.adev.regs_offset[am.MMHUB_HWIP]) + + # XGMI (for supported systems) + self.xgmi_phys_id = self.adev.regMMMC_VM_XGMI_LFB_CNTL.read_bitfields()['pf_lfb_region'] if hasattr(self.adev, 'regMMMC_VM_XGMI_LFB_CNTL') else 0 + self.xgmi_seg_sz = self.adev.regMMMC_VM_XGMI_LFB_SIZE.read_bitfields()['pf_lfb_size']<<24 if hasattr(self.adev, 'regMMMC_VM_XGMI_LFB_SIZE') else 0 + + self.paddr_base = self.xgmi_phys_id * self.xgmi_seg_sz + + self.fb_base = (self.adev.regMMMC_VM_FB_LOCATION_BASE.read() & 0xFFFFFF) << 24 + self.fb_end = (self.adev.regMMMC_VM_FB_LOCATION_TOP.read() & 0xFFFFFF) << 24 + + # Memory controller aperture + self.mc_base = self.fb_base + self.paddr_base + + # VM aperture + self.vm_base = self.adev.mm.va_base + self.vm_end = min(self.vm_base + (1 << self.adev.mm.va_bits) - 1, 0x7fffffffffff) + + self.trans_futher = self.adev.ip_ver[am.GC_HWIP] < (10, 0, 0) + + # mi3xx has 48-bit, others have 44-bit address space + self.address_space_mask = (1 << (48 if self.adev.ip_ver[am.GC_HWIP][:2] in {(9,4), (9,5)} else 44)) - 1 + + self.memscratch_xgmi_paddr = self.adev.paddr2xgmi(self.adev.mm.palloc(0x1000, zero=False, boot=True)) + self.dummy_page_xgmi_paddr = self.adev.paddr2xgmi(self.adev.mm.palloc(0x1000, zero=False, boot=True)) + + # MM hub is inited before any tlb flushes and is still valid during partial_boot, so set it to true + self.hub_initted = {"MM": True, "GC": False} + + self.pf_status_reg = lambda ip: f"reg{ip}VM_L2_PROTECTION_FAULT_STATUS{'_LO32' if self.adev.ip_ver[am.GC_HWIP] >= (12,0,0) else ''}" + + def init_hw(self): self.init_hub("MM", inst_cnt=self.vmhubs) + + def flush_hdp(self): self.adev.wreg(self.adev.reg("regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL").read() // 4, 0x0) + def flush_tlb(self, ip:Literal["MM", "GC"], vmid, flush_type=0): + self.flush_hdp() + + # Can't issue TLB invalidation if the hub isn't initialized. + if not self.hub_initted[ip]: return + + for inst in range(self.adev.gmc.vmhubs if ip == "MM" else self.adev.gfx.xccs): + if ip == "MM": wait_cond(lambda: self.adev.regMMVM_INVALIDATE_ENG17_SEM.read(inst=inst) & 0x1, value=1, msg="mm flush_tlb timeout") + + self.adev.reg(f"reg{ip}VM_INVALIDATE_ENG17_REQ").write(flush_type=flush_type, per_vmid_invalidate_req=(1 << vmid), invalidate_l2_ptes=1, + invalidate_l2_pde0=1, invalidate_l2_pde1=1, invalidate_l2_pde2=1, invalidate_l1_ptes=1, clear_protection_fault_status_addr=0, inst=inst) + + wait_cond(lambda: self.adev.reg(f"reg{ip}VM_INVALIDATE_ENG17_ACK").read(inst=inst) & (1 << vmid), value=(1 << vmid), msg="flush_tlb timeout") + + if ip == "MM": self.adev.regMMVM_INVALIDATE_ENG17_SEM.write(0x0, inst=inst) + if self.adev.ip_ver[am.GC_HWIP] >= (11,0,0) and ip == "MM": + self.adev.regMMVM_L2_BANK_SELECT_RESERVED_CID2.update(reserved_cache_private_invalidation=1, inst=inst) + + # Read back the register to ensure the invalidation is complete + self.adev.regMMVM_L2_BANK_SELECT_RESERVED_CID2.read(inst=inst) + + def enable_vm_addressing(self, page_table, ip:Literal["MM", "GC"], vmid, inst): + self.adev.wreg_pair(f"reg{ip}VM_CONTEXT{vmid}_PAGE_TABLE_START_ADDR", "_LO32", "_HI32", self.vm_base >> 12, inst=inst) + self.adev.wreg_pair(f"reg{ip}VM_CONTEXT{vmid}_PAGE_TABLE_END_ADDR", "_LO32", "_HI32", self.vm_end >> 12, inst=inst) + self.adev.wreg_pair(f"reg{ip}VM_CONTEXT{vmid}_PAGE_TABLE_BASE_ADDR", "_LO32", "_HI32", self.adev.paddr2xgmi(page_table.paddr) | 1, inst=inst) + + fault_flags = {f'{x}_protection_fault_enable_interrupt':1 for x in ['pde0', 'dummy_page', 'range', 'valid', 'read', 'write', 'execute']} + en_def_flags = {f'{x}_protection_fault_enable_default':1 for x in ['pde0', 'dummy_page', 'range', 'valid', 'read', 'write', 'execute']} + self.adev.reg(f"reg{ip}VM_CONTEXT{vmid}_CNTL").write(0x1800000, **fault_flags, **en_def_flags, enable_context=1, + page_table_depth=((2 if self.trans_futher else 3) - page_table.lv), page_table_block_size=9 if self.trans_futher else 0, inst=inst) + + def init_hub(self, ip:Literal["MM", "GC"], inst_cnt:int): + # Init system apertures + for inst in range(inst_cnt): + self.adev.reg(f"reg{ip}MC_VM_AGP_BASE").write(0, inst=inst) + self.adev.reg(f"reg{ip}MC_VM_AGP_BOT").write(0xffffffffffff >> 24, inst=inst) # disable AGP + self.adev.reg(f"reg{ip}MC_VM_AGP_TOP").write(0, inst=inst) + + self.adev.reg(f"reg{ip}MC_VM_SYSTEM_APERTURE_LOW_ADDR").write(self.fb_base >> 18, inst=inst) + self.adev.reg(f"reg{ip}MC_VM_SYSTEM_APERTURE_HIGH_ADDR").write(self.fb_end >> 18, inst=inst) + self.adev.wreg_pair(f"reg{ip}MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR", "_LSB", "_MSB", self.memscratch_xgmi_paddr >> 12, inst=inst) + self.adev.wreg_pair(f"reg{ip}VM_L2_PROTECTION_FAULT_DEFAULT_ADDR", "_LO32", "_HI32", self.dummy_page_xgmi_paddr >> 12, inst=inst) + + self.adev.reg(f"reg{ip}VM_L2_PROTECTION_FAULT_CNTL2").update(active_page_migration_pte_read_retry=1, inst=inst) + + # Init TLB and cache + self.adev.reg(f"reg{ip}MC_VM_MX_L1_TLB_CNTL").update(enable_l1_tlb=1, system_access_mode=3, enable_advanced_driver_model=1, + system_aperture_unmapped_access=0, mtype=self.adev.soc.module.MTYPE_UC, inst=inst) + + self.adev.reg(f"reg{ip}VM_L2_CNTL").update(enable_l2_cache=1, enable_default_page_out_to_system_memory=1, + l2_pde0_cache_tag_generation_mode=0, pde_fault_classification=0, context1_identity_access_mode=1, identity_mode_fragment_size=0, + enable_l2_fragment_processing=int(self.adev.ip_ver[am.GC_HWIP] < (10,0,0)), inst=inst) + self.adev.reg(f"reg{ip}VM_L2_CNTL2").update(invalidate_all_l1_tlbs=1, invalidate_l2_cache=1, inst=inst) + self.adev.reg(f"reg{ip}VM_L2_CNTL3").write(l2_cache_4k_associativity=1, l2_cache_bigk_associativity=1, + bank_select=12 if self.trans_futher else 9, l2_cache_bigk_fragment_size=9 if self.trans_futher else 6, inst=inst) + self.adev.reg(f"reg{ip}VM_L2_CNTL4").write(l2_cache_4k_partition_count=1, inst=inst) + if self.adev.ip_ver[am.GC_HWIP] >= (10,0,0): self.adev.reg(f"reg{ip}VM_L2_CNTL5").write(walker_priority_client_id=0x1ff, inst=inst) + + self.enable_vm_addressing(self.adev.mm.root_page_table, ip, vmid=0, inst=inst) + + # Disable identity aperture + self.adev.wreg_pair(f"reg{ip}VM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR", "_LO32", "_HI32", 0xfffffffff, inst=inst) + self.adev.wreg_pair(f"reg{ip}VM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR", "_LO32", "_HI32", 0x0, inst=inst) + self.adev.wreg_pair(f"reg{ip}VM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET", "_LO32", "_HI32", 0x0, inst=inst) + + for eng_i in range(18): self.adev.wreg_pair(f"reg{ip}VM_INVALIDATE_ENG{eng_i}_ADDR_RANGE", "_LO32", "_HI32", 0x1fffffffff, inst=inst) + self.hub_initted[ip] = True + + @functools.cache # pylint: disable=method-cache-max-size-none + def get_pte_flags(self, pte_lv, is_table, frag, uncached, system, snooped, valid, extra=0): + extra |= (am.AMDGPU_PTE_SYSTEM * system) | (am.AMDGPU_PTE_SNOOPED * snooped) | (am.AMDGPU_PTE_VALID * valid) | am.AMDGPU_PTE_FRAG(frag) + if not is_table: extra |= (am.AMDGPU_PTE_WRITEABLE | am.AMDGPU_PTE_READABLE | am.AMDGPU_PTE_EXECUTABLE) + if self.adev.ip_ver[am.GC_HWIP] >= (12,0,0): + extra |= am.AMDGPU_PTE_MTYPE_GFX12(0, self.adev.soc.module.MTYPE_UC if uncached else 0) + extra |= (am.AMDGPU_PDE_PTE_GFX12 if not is_table and pte_lv != am.AMDGPU_VM_PTB else (am.AMDGPU_PTE_IS_PTE if not is_table else 0)) + elif self.adev.ip_ver[am.GC_HWIP] >= (10,0,0): + extra |= am.AMDGPU_PTE_MTYPE_NV10(0, self.adev.soc.module.MTYPE_UC if uncached else 0) + extra |= (am.AMDGPU_PDE_PTE if not is_table and pte_lv != am.AMDGPU_VM_PTB else 0) + else: + extra |= am.AMDGPU_PTE_MTYPE_VG10(0, self.adev.soc.module.MTYPE_UC if uncached else 0) + if is_table and pte_lv == am.AMDGPU_VM_PDB1: extra |= am.AMDGPU_PDE_BFS(0x9) + if is_table and pte_lv == am.AMDGPU_VM_PDB0: extra |= am.AMDGPU_PTE_TF + if not is_table and pte_lv not in {am.AMDGPU_VM_PTB, am.AMDGPU_VM_PDB0}: extra |= am.AMDGPU_PDE_PTE + return extra + def is_pte_huge_page(self, pte_lv, pte): + if self.adev.ip_ver[am.GC_HWIP] < (10,0,0): return (pte & am.AMDGPU_PDE_PTE) if pte_lv != am.AMDGPU_VM_PDB0 else not (pte & am.AMDGPU_PTE_TF) + return pte & (am.AMDGPU_PDE_PTE_GFX12 if self.adev.ip_ver[am.GC_HWIP] >= (12,0,0) else am.AMDGPU_PDE_PTE) + +class AM_SMU(AM_IP): + def init_sw(self): + self.smu_mod = self.adev._ip_module("smu", am.MP1_HWIP) + self.driver_table_paddr = self.adev.mm.palloc(0x4000, zero=False, boot=True) + + def init_hw(self): + self._send_msg(self.smu_mod.PPSMC_MSG_SetDriverDramAddrHigh, hi32(self.adev.paddr2mc(self.driver_table_paddr))) + self._send_msg(self.smu_mod.PPSMC_MSG_SetDriverDramAddrLow, lo32(self.adev.paddr2mc(self.driver_table_paddr))) + self._send_msg(self.smu_mod.PPSMC_MSG_EnableAllSmuFeatures, 0) + + def is_smu_alive(self): + with contextlib.suppress(TimeoutError): self._send_msg(self.smu_mod.PPSMC_MSG_GetSmuVersion, 0, timeout=100) + return self.adev.mmMP1_SMN_C2PMSG_90.read() != 0 + + def mode1_reset(self): + if DEBUG >= 2: print(f"am {self.adev.devfmt}: mode1 reset") + if self.adev.ip_ver[am.MP0_HWIP] >= (14,0,0) or self.adev.ip_ver[am.MP0_HWIP] in {(13,0,0), (13,0,7), (13,0,10)}: + self._send_msg(__DEBUGSMC_MSG_Mode1Reset:=2, 0, debug=True) + elif self.adev.ip_ver[am.MP0_HWIP] in {(13,0,6), (13,0,12)}: self._send_msg(self.smu_mod.PPSMC_MSG_GfxDriverReset, 1) + else: self._send_msg(self.smu_mod.PPSMC_MSG_Mode1Reset, 0) + + if not self.adev.is_hive(): time.sleep(0.5) # 500ms + + def read_table(self, table_t, arg): + if self.adev.ip_ver[am.MP0_HWIP] in {(13,0,6),(13,0,12)}: self._send_msg(self.smu_mod.PPSMC_MSG_GetMetricsTable, arg) + else: self._send_msg(self.smu_mod.PPSMC_MSG_TransferTableSmu2Dram, arg) + return table_t.from_buffer(bytearray(self.adev.vram.view(self.driver_table_paddr, ctypes.sizeof(table_t))[:])) + + @functools.cache # pylint: disable=method-cache-max-size-none + def read_clocks(self, clk_list:tuple[int]) -> dict[int, list[int]]: + return {clck: [self._send_msg(self.smu_mod.PPSMC_MSG_GetDpmFreqByIndex, (clck<<16)|i, read_back_arg=True)&0x7fffffff for i in range(cnt)] + for clck in clk_list if (cnt:=self._send_msg(self.smu_mod.PPSMC_MSG_GetDpmFreqByIndex, (clck<<16)|0xff, read_back_arg=True)&0x7fffffff)} + + def set_clocks(self, level:int|None): + clks = tuple([self.smu_mod.PPCLK_UCLK, self.smu_mod.PPCLK_FCLK, self.smu_mod.PPCLK_SOCCLK]) + if self.adev.ip_ver[am.MP0_HWIP] not in {(13,0,6), (13,0,12)}: clks += (self.smu_mod.PPCLK_GFXCLK,) + + if level is None: + for clck in clks: + with contextlib.suppress(TimeoutError): self._send_msg(self.smu_mod.PPSMC_MSG_SetSoftMinByFreq, clck << 16, timeout=20) + if self.adev.ip_ver[am.GC_HWIP] >= (10,0,0): self._send_msg(self.smu_mod.PPSMC_MSG_SetSoftMaxByFreq, clck << 16 | 0xffff) + return + + for clck, vals in self.read_clocks(clks).items(): + with contextlib.suppress(TimeoutError): self._send_msg(self.smu_mod.PPSMC_MSG_SetSoftMinByFreq, clck << 16 | (vals[level]), timeout=20) + if self.adev.ip_ver[am.GC_HWIP] >= (10,0,0): self._send_msg(self.smu_mod.PPSMC_MSG_SetSoftMaxByFreq, clck << 16 | (vals[level])) + + def set_power_limit(self, watts:float): + ppt_limit = max(int(round(watts)), 1) + self._send_msg(self.smu_mod.PPSMC_MSG_SetPptLimit, ppt_limit) + if DEBUG >= 2: print(f"am {self.adev.devfmt}: GPU power limit set to {ppt_limit}W") + + def _aca_read_reg(self, bank_idx:int, reg_idx:int, ue=True) -> int: + msg = self.smu_mod.PPSMC_MSG_McaBankDumpDW if ue else self.smu_mod.PPSMC_MSG_McaBankCeDumpDW + return (self._send_msg(msg, (bank_idx << 16) | (reg_idx * 8 + 4), read_back_arg=True) << 32) | \ + self._send_msg(msg, (bank_idx << 16) | (reg_idx * 8), read_back_arg=True) + + def _aca_read_banks(self, ue=True) -> list[list[int]]: + if not hasattr(self.smu_mod, 'PPSMC_MSG_QueryValidMcaCount'): return [] + count_msg = self.smu_mod.PPSMC_MSG_QueryValidMcaCount if ue else self.smu_mod.PPSMC_MSG_QueryValidMcaCeCount + return [[self._aca_read_reg(idx, reg_idx, ue=ue) for reg_idx in range(16)] for idx in range(self._send_msg(count_msg, 0, read_back_arg=True))] + + def _smu_cmn_send_msg(self, msg:int, param=0, debug=False): + (self.adev.mmMP1_SMN_C2PMSG_90 if not debug else self.adev.mmMP1_SMN_C2PMSG_54).write(0) # resp reg + (self.adev.mmMP1_SMN_C2PMSG_82 if not debug else self.adev.mmMP1_SMN_C2PMSG_53).write(param) + (self.adev.mmMP1_SMN_C2PMSG_66 if not debug else self.adev.mmMP1_SMN_C2PMSG_75).write(msg) + + def _send_msg(self, msg:int, param:int, read_back_arg=False, timeout=10000, debug=False): # default timeout is 10 seconds + self._smu_cmn_send_msg(msg, param, debug=debug) + wait_cond((self.adev.mmMP1_SMN_C2PMSG_90 if not debug else self.adev.mmMP1_SMN_C2PMSG_54).read, value=1, timeout_ms=timeout, + msg=f"SMU msg {msg:#x} timeout") + return (self.adev.mmMP1_SMN_C2PMSG_82 if not debug else self.adev.mmMP1_SMN_C2PMSG_53).read() if read_back_arg else None + +class AM_GFX(AM_IP): + def init_sw(self): + self.xccs = len(self.adev.regs_offset[am.GC_HWIP]) + self.mqd_paddr = [self.adev.mm.palloc(0x1000 * self.xccs, zero=False, boot=True) for i in range(2)] + self.mqd_mc = [self.adev.paddr2mc(mqd_paddr) for mqd_paddr in self.mqd_paddr] + + def init_hw(self): + # Wait for RLC autoload to complete + wait_cond(lambda: self.adev.regCP_STAT.read() == 0 or self.adev.regRLC_RLCS_BOOTLOAD_STATUS.read_bitfields()['bootload_complete'] == 0, + value=True, msg="RLC autoload timeout") + + self.adev.gmc.init_hub("GC", inst_cnt=self.xccs) + if self.adev.partial_boot: return self.reset_mec() + + self._config_mec() + + # NOTE: Golden reg for gfx11. No values for this reg provided. The kernel just ors 0x20000000 to this reg. + for xcc in range(self.xccs): self.adev.regTCP_CNTL.write(self.adev.regTCP_CNTL.read() | 0x20000000, inst=xcc) + + for xcc in range(self.xccs): self.adev.regRLC_CNTL.write(0x1, inst=xcc) + + for xcc in range(self.xccs): self.adev.regRLC_SRM_CNTL.update(srm_enable=1, auto_incr_addr=1, inst=xcc) + + for xcc in range(self.xccs): self.adev.regRLC_SPM_MC_CNTL.write(0xf, inst=xcc) + + if self.adev.ip_ver[am.NBIO_HWIP][:2] != (7,9): + self.adev.soc.doorbell_enable(port=0, awid=0x3, awaddr_31_28_value=0x3) + self.adev.soc.doorbell_enable(port=3, awid=0x6, awaddr_31_28_value=0x3) + + for xcc in range(self.xccs): + if self.adev.ip_ver[am.GC_HWIP] in {(9,4,3), (9,5,0)}: + self.adev.regGB_ADDR_CONFIG.write(0x2a114042, inst=xcc) # Golden value for mi300/mi350 + self.adev.regTCP_UTCL1_CNTL2.update(spare=1, inst=xcc) + + self.adev.regGRBM_CNTL.update(read_timeout=0xff, inst=xcc) + for i in range(0, 16): + self._grbm_select(vmid=i, inst=xcc) + self.adev.regSH_MEM_CONFIG.write(**({'initial_inst_prefetch':3} if self.adev.ip_ver[am.GC_HWIP][0]>=10 else {'retry_disable':1}), + **({'f8_mode':1} if self.adev.ip_ver[am.GC_HWIP][:2]==(9,4) else {}), + address_mode=self.adev.soc.module.SH_MEM_ADDRESS_MODE_64, alignment_mode=self.adev.soc.module.SH_MEM_ALIGNMENT_MODE_UNALIGNED, inst=xcc) + + # Configure apertures: + # LDS: 0x10000000'00000000 - 0x10000001'00000000 (4GB) + # Scratch: 0x20000000'00000000 - 0x20000001'00000000 (4GB) + self.adev.regSH_MEM_BASES.write(shared_base=0x1, private_base=0x2, inst=xcc) + self._grbm_select(inst=xcc) + + # Configure MEC doorbell range + self.adev.regCP_MEC_DOORBELL_RANGE_LOWER.write(0x100 * xcc, inst=xcc) + self.adev.regCP_MEC_DOORBELL_RANGE_UPPER.write(0x100 * xcc + 0xf8, inst=xcc) + + self._enable_mec() + + # Set 1 partition + if self.xccs > 1: self.adev.psp._spatial_partition_cmd(1) + + def fini_hw(self): self._dequeue_hqds() + + def reset_mec(self): + self._dequeue_hqds() + + if self.adev.ip_ver[am.GC_HWIP] < (12,0,0): # gfx12+ uses mec_pipe0_reset + for xcc in range(self.xccs): self.adev.regGRBM_SOFT_RESET.write(soft_reset_cp=1, soft_reset_cpc=1, inst=xcc) + time.sleep(0.05) + for xcc in range(self.xccs): self.adev.regGRBM_SOFT_RESET.write(0x0, inst=xcc) + + self._config_mec() + self._enable_mec() + + def setup_ring(self, ring_addr:int, ring_size:int, rptr_addr:int, wptr_addr:int, eop_addr:int, eop_size:int, idx:int, aql:bool) -> int: + pipe, queue, doorbell = idx // 4, idx % 4, am.AMDGPU_NAVI10_DOORBELL_MEC_RING0 + + for xcc in range(self.xccs if aql else 1): + self._grbm_select(me=1, pipe=pipe, queue=queue, inst=xcc) + + struct_t = getattr(am, f"struct_v{self.adev.ip_ver[am.GC_HWIP][0]}{'_compute' if self.adev.ip_ver[am.GC_HWIP][0] >= 10 else ''}_mqd") + mqd_struct = struct_t(header=0xC0310800, cp_mqd_base_addr_lo=lo32(self.mqd_mc[queue] + 0x1000*xcc), + cp_mqd_base_addr_hi=hi32(self.mqd_mc[queue] + 0x1000*xcc), cp_hqd_pipe_priority=0x2, cp_hqd_queue_priority=0xf, cp_hqd_quantum=0x111, + cp_hqd_persistent_state=self.adev.regCP_HQD_PERSISTENT_STATE.encode(preload_size=0x55, preload_req=1), + cp_hqd_pq_base_lo=lo32(ring_addr>>8), cp_hqd_pq_base_hi=hi32(ring_addr>>8), + cp_hqd_pq_rptr_report_addr_lo=lo32(rptr_addr), cp_hqd_pq_rptr_report_addr_hi=hi32(rptr_addr), + cp_hqd_pq_wptr_poll_addr_lo=lo32(wptr_addr), cp_hqd_pq_wptr_poll_addr_hi=hi32(wptr_addr), + cp_hqd_pq_doorbell_control=self.adev.regCP_HQD_PQ_DOORBELL_CONTROL.encode(doorbell_offset=doorbell*2, doorbell_en=1), + cp_hqd_pq_control=self.adev.regCP_HQD_PQ_CONTROL.encode(rptr_block_size=5, unord_dispatch=0, queue_size=(ring_size//4).bit_length()-2, + **({'queue_full_en':1, 'slot_based_wptr':2, 'no_update_rptr':xcc!=0 or self.xccs==1} if aql else {})), + cp_hqd_ib_control=self.adev.regCP_HQD_IB_CONTROL.encode(min_ib_avail_size=0x3), cp_hqd_hq_status0=0x20004000, + cp_mqd_control=self.adev.regCP_MQD_CONTROL.encode(priv_state=1), cp_hqd_vmid=0, cp_hqd_aql_control=int(aql), + cp_hqd_eop_base_addr_lo=lo32(eop_addr>>8), cp_hqd_eop_base_addr_hi=hi32(eop_addr>>8), + cp_hqd_eop_control=self.adev.regCP_HQD_EOP_CONTROL.encode(eop_size=(eop_size//4).bit_length()-2), + **({'compute_tg_chunk_size':1, 'compute_current_logic_xcc_id':xcc, 'cp_mqd_stride_size':0x1000} if aql and self.xccs > 1 else {})) + for se in range(8 if self.adev.ip_ver[am.GC_HWIP][0] >= 10 else 4): setattr(mqd_struct, f'compute_static_thread_mgmt_se{se}', 0xffffffff) + + self.adev.vram.view(self.mqd_paddr[queue] + 0x1000*xcc, ctypes.sizeof(mqd_struct))[:] = memoryview(mqd_struct).cast('B') + + mqd_st_mv = to_mv(ctypes.addressof(mqd_struct), ctypes.sizeof(mqd_struct)).cast('I') + for i, reg in enumerate(range(self.adev.regCP_MQD_BASE_ADDR.addr[xcc], self.adev.regCP_HQD_PQ_WPTR_HI.addr[xcc] + 1)): + self.adev.wreg(reg, mqd_st_mv[0x80 + i]) + self.adev.regCP_HQD_ACTIVE.write(0x1, inst=xcc) + + self.adev.gmc.flush_hdp() + self._grbm_select(inst=xcc) + return doorbell + + def set_clockgating_state(self): + if hasattr(self.adev, 'regMM_ATC_L2_MISC_CG'): self.adev.regMM_ATC_L2_MISC_CG.write(enable=1, mem_ls_enable=1) + + for xcc in range(self.xccs): + self.adev.regRLC_SAFE_MODE.write(message=1, cmd=1, inst=xcc) + wait_cond(lambda: self.adev.regRLC_SAFE_MODE.read(inst=xcc) & 0x1, value=0, msg="RLC safe mode timeout") + + self.adev.regRLC_CGCG_CGLS_CTRL.update(cgcg_gfx_idle_threshold=0x36, cgcg_en=1, cgls_rep_compansat_delay=0xf, cgls_en=1, inst=xcc) + + self.adev.regCP_RB_WPTR_POLL_CNTL.update(poll_frequency=0x100, idle_poll_count=0x90, inst=xcc) + self.adev.regCP_INT_CNTL.update(cntx_busy_int_enable=1, cntx_empty_int_enable=1, cmp_busy_int_enable=1, inst=xcc) + if self.adev.ip_ver[am.GC_HWIP] >= (10,0,0): + self.adev.regSDMA0_RLC_CGCG_CTRL.update(cgcg_int_enable=1, inst=xcc) + self.adev.regSDMA1_RLC_CGCG_CTRL.update(cgcg_int_enable=1, inst=xcc) + + feats_gfx9 = {'gfxip_mgls_override':0, 'gfxip_rep_fgcg_override':0} if self.adev.ip_ver[am.GC_HWIP][0] == 9 else {} + feats_gfx11 = {'perfmon_clock_state':1, 'gfxip_repeater_fgcg_override':0} if self.adev.ip_ver[am.GC_HWIP][0] >= 11 else {} + self.adev.regRLC_CGTT_MGCG_OVERRIDE.update(**feats_gfx9, **feats_gfx11, gfxip_fgcg_override=0, grbm_cgtt_sclk_override=0, + rlc_cgtt_sclk_override=0, gfxip_mgcg_override=0, gfxip_cgls_override=0, gfxip_cgcg_override=0, inst=xcc) + + self.adev.regRLC_SAFE_MODE.write(message=0, cmd=1, inst=xcc) + + def _grbm_select(self, me=0, pipe=0, queue=0, vmid=0, inst=0): + self.adev.regGRBM_GFX_CNTL.write(meid=me, pipeid=pipe, vmid=vmid, queueid=queue, inst=inst) + + def _enable_mec(self): + for xcc in range(self.xccs): + if self.adev.ip_ver[am.GC_HWIP] >= (10,0,0): self.adev.regCP_MEC_RS64_CNTL.update(mec_pipe0_reset=0, mec_pipe0_active=1, mec_halt=0, inst=xcc) + else: self.adev.regCP_MEC_CNTL.write(0x0, inst=xcc) + time.sleep(0.05) # Wait for MEC to be ready + + def _config_mec(self): + def _config_helper(eng_name, cntl_reg, eng_reg, pipe_cnt, me=0, xcc=0): + for pipe in range(pipe_cnt): + self._grbm_select(me=me, pipe=pipe, inst=xcc) + self.adev.wreg_pair(f"regCP_{eng_reg}_PRGRM_CNTR_START", "", "_HI", self.adev.fw.ucode_start[eng_name] >> 2, inst=xcc) + self._grbm_select(inst=xcc) + self.adev.reg(f"regCP_{cntl_reg}_CNTL").update(**{f"{eng_name.lower()}_pipe{pipe}_reset": 1 for pipe in range(pipe_cnt)}, inst=xcc) + self.adev.reg(f"regCP_{cntl_reg}_CNTL").update(**{f"{eng_name.lower()}_pipe{pipe}_reset": 0 for pipe in range(pipe_cnt)}, inst=xcc) + + for xcc in range(self.adev.gfx.xccs): + if self.adev.ip_ver[am.GC_HWIP] < (10,0,0): + self.adev.regCP_MEC_CNTL.update(mec_invalidate_icache=1, mec_me1_pipe0_reset=1, mec_me2_pipe0_reset=1, mec_me1_halt=1,mec_me2_halt=1,inst=xcc) + if self.adev.ip_ver[am.GC_HWIP] >= (12,0,0): + _config_helper(eng_name="PFP", cntl_reg="ME", eng_reg="PFP", pipe_cnt=1, xcc=xcc) + _config_helper(eng_name="ME", cntl_reg="ME", eng_reg="ME", pipe_cnt=1, xcc=xcc) + if self.adev.ip_ver[am.GC_HWIP] >= (10,0,0): + _config_helper(eng_name="MEC", cntl_reg="MEC_RS64", eng_reg="MEC_RS64", pipe_cnt=1, me=1, xcc=xcc) + + def _dequeue_hqds(self): + for q in range(2): + for xcc in range(self.xccs): + self._grbm_select(me=1, pipe=0, queue=q, inst=xcc) + if self.adev.regCP_HQD_ACTIVE.read(inst=xcc) & 1: + self.adev.regCP_HQD_DEQUEUE_REQUEST.write(0x2, inst=xcc) # 1 - DRAIN_PIPE; 2 - RESET_WAVES + self.adev.regSPI_COMPUTE_QUEUE_RESET.write(0x1, inst=xcc) + if not self.adev.is_err_state: wait_cond(lambda: self.adev.regCP_HQD_ACTIVE.read(inst=xcc) & 1, value=0, msg="HQD dequeue timeout") + self._grbm_select() + +class AM_IH(AM_IP): + def init_sw(self): + self.ring_size = 256 << 10 + def _alloc_ring(size): return (self.adev.mm.palloc(size, zero=False, boot=True), self.adev.mm.palloc(0x1000, zero=False, boot=True)) + self.rings = [(*_alloc_ring(self.ring_size), "", 0), (*_alloc_ring(self.ring_size), "_RING1", 1)] + self.ring_view = self.adev.vram.view(offset=self.rings[0][0], size=self.ring_size, fmt='I') + + def init_hw(self): + for ring_vm, rwptr_vm, suf, ring_id in self.rings: + self.adev.wreg_pair("regIH_RB_BASE", suf, f"_HI{suf}", self.adev.paddr2mc(ring_vm) >> 8) + + self.adev.reg(f"regIH_RB_CNTL{suf}").write(mc_space=4, wptr_overflow_clear=1, rb_size=((self.ring_size//4)-1).bit_length(), + mc_snoop=1, mc_ro=0, mc_vmid=0, **({'wptr_overflow_enable': 1, 'rptr_rearm': 1} if ring_id == 0 else {'rb_full_drain_enable': 1})) + + if ring_id == 0: self.adev.wreg_pair("regIH_RB_WPTR_ADDR", "_LO", "_HI", self.adev.paddr2mc(rwptr_vm)) + + self.adev.reg(f"regIH_RB_WPTR{suf}").write(0) + self.adev.reg(f"regIH_RB_RPTR{suf}").write(0) + + self.adev.reg(f"regIH_DOORBELL_RPTR{suf}").write(enable=0) + + if self.adev.ip_ver[am.OSSSYS_HWIP] != (4,4,2): + self.adev.regIH_STORM_CLIENT_LIST_CNTL.update(client18_is_storm_client=1) + self.adev.regIH_INT_FLOOD_CNTL.update(flood_cntl_enable=1) + self.adev.regIH_MSI_STORM_CTRL.update(delay=3) + + # toggle interrupts + for _, rwptr_vm, suf, ring_id in self.rings: + self.adev.reg(f"regIH_RB_CNTL{suf}").update(rb_enable=1, **({'enable_intr': 1} if ring_id == 0 else {})) + + def drain(self): + _, _, suf, _ = self.rings[0] + wptr = self.adev.reg(f"regIH_RB_WPTR{suf}").read_bitfields() + self.adev.regIH_RB_RPTR.write(wptr['offset'] % (self.ring_size // 4)) + + if wptr['rb_overflow']: + self.adev.reg(f"regIH_RB_WPTR{suf}").update(rb_overflow=0) + self.adev.reg(f"regIH_RB_CNTL{suf}").update(wptr_overflow_clear=1) + self.adev.reg(f"regIH_RB_CNTL{suf}").update(wptr_overflow_clear=0) + + def interrupt_handler(self): + _, _, suf, _ = self.rings[0] + wptr = self.adev.reg(f"regIH_RB_WPTR{suf}").read_bitfields() + rptr = self.adev.regIH_RB_RPTR.read() + + while rptr != wptr['offset']: + entry = [self.ring_view[(rptr + i) % (self.ring_size // 4)] for i in range(8)] + rptr = (rptr + 8) % (self.ring_size // 4) + + client, src, ring_id, vmid, vmid_type, pasid, node = \ + [getattr(am, f'SOC15_{n}_FROM_IH_ENTRY')(entry) for n in ['CLIENT_ID', 'SOURCE_ID', 'RING_ID', 'VMID', 'VMID_TYPE', 'PASID', 'NODEID']] + ctx = [getattr(am, f'SOC15_CONTEXT_ID{i}_FROM_IH_ENTRY')(entry) for i in range(4)] + + src_name = self.adev.soc.ih_srcs_names.get(client, {}).get(src, '') + if src_name in {"SDMA_TRAP", "CP_EOP_INTR"}: continue + + print(f"am {self.adev.devfmt}: IH ({rptr:#x}/{wptr['offset']:#x}) client={self.adev.soc.ih_clients.get(client)} src={src_name}({src}) " + f"ring={ring_id} vmid={vmid}({vmid_type}) pasid={pasid} node={node} ctx=[{ctx[0]:#x}, {ctx[1]:#x}, {ctx[2]:#x}, {ctx[3]:#x}]") + + if src_name == "SQ_INTERRUPT_ID": + enc_type = getbits(ctx[1], 6, 7) if (is_soc21:=self.adev.ip_ver[am.GC_HWIP][0] >= 11) else getbits(ctx[0], 26, 27) + err_type = getbits(ctx[0], 21, 24) if is_soc21 else getbits((ctx[0] & 0xfff) | ((ctx[0]>>16) & 0xf000) | ((ctx[1]<<16) & 0xff0000), 20, 23) + err_info = f" ({['EDC_FUE', 'ILLEGAL_INST', 'MEMVIOL', 'EDC_FED'][err_type]})" if enc_type == 2 else "" + print(f"am {self.adev.devfmt}: sq_intr: {['auto', 'wave', 'error'][enc_type]}{err_info}") + self.adev.is_err_state |= enc_type == 2 + elif src_name == "UTCL2_FAULT" or (self.adev.ip_ver[am.GC_HWIP][0] == 9 and client == am.SOC15_IH_CLIENTID_UTCL2): + bf = self.adev.reg(self.adev.gmc.pf_status_reg('GC')).read_bitfields() + va = (self.adev.reg('regGCVM_L2_PROTECTION_FAULT_ADDR_HI32').read()<<32) | self.adev.reg('regGCVM_L2_PROTECTION_FAULT_ADDR_LO32').read() + print(f"am {self.adev.devfmt}: GCVM_L2_PROTECTION_FAULT_STATUS: {bf} {va<<12:#x}") + self.adev.reg('regGCVM_L2_PROTECTION_FAULT_CNTL').update(clear_protection_fault_status_addr=1) + self.adev.is_err_state = True + else: self.adev.is_err_state = True + + self.drain() + + bif_intr = self.adev.regBIF_BX0_BIF_DOORBELL_INT_CNTL.read_bitfields() + athub_err, cntlr_err = bif_intr['ras_athub_err_event_interrupt_status'], bif_intr['ras_cntlr_interrupt_status'] + if athub_err or cntlr_err: + print(f"am {self.adev.devfmt}: fatal hardware error detected: {'RAS_ATHUB_ERR_EVENT ' if athub_err else ''}{'RAS_CNTLR' if cntlr_err else ''}") + + acas = self.adev.smu._aca_read_banks(ue=True) + self.adev.smu._aca_read_banks(ue=False) + for regs in acas: + acatyp = 'Uncorrectable' if (regs[1] >> 61) & 1 and (regs[1] >> 57) & 1 else 'Correctable' + hwname = f'{self.adev.hwid_names.get((regs[5] >> 32) & 0xFFF, "")} ({(regs[5] >> 32) & 0xFFF:#03x})' + print(f"am {self.adev.devfmt}: {acatyp} ACA: {hwname} mcatype={(regs[5] >> 48) & 0xFFFF:#06x} regs=[{', '.join(f'{r:#x}' for r in regs)}]") + + self.adev.regBIF_BX0_BIF_DOORBELL_INT_CNTL.write(ras_cntlr_interrupt_clear=cntlr_err, ras_athub_err_event_interrupt_clear=athub_err) + self.adev.is_err_state = True + +class AM_SDMA(AM_IP): + def init_sw(self): self.sdma_reginst, self.sdma_name = [], "F32" if self.adev.ip_ver[am.SDMA0_HWIP] < (7,0,0) else "MCU" + def init_hw(self): + for pipe_id in range(16 if self.adev.ip_ver[am.SDMA0_HWIP] < (5,0,0) else 1): + pipe, inst = ("", pipe_id) if self.adev.ip_ver[am.SDMA0_HWIP] < (5,0,0) else (str(pipe_id), 0) + + if self.adev.ip_ver[am.SDMA0_HWIP] >= (6,0,0): + self.adev.reg(f"regSDMA{pipe}_WATCHDOG_CNTL").update(queue_hang_count=100, inst=inst) # 10s, 100ms per unit + self.adev.reg(f"regSDMA{pipe}_UTCL1_CNTL").update(resp_mode=3, redo_delay=9, inst=inst) + + # rd=noa, wr=bypass + self.adev.reg(f"regSDMA{pipe}_UTCL1_PAGE").update(rd_l2_policy=2, wr_l2_policy=3, **({'llc_noalloc':1} if self.sdma_name == "F32" else {}), + inst=inst) + self.adev.reg(f"regSDMA{pipe}_{self.sdma_name}_CNTL").update(halt=0, **{f"{'th1_' if self.sdma_name == 'F32' else ''}reset":0}, inst=inst) + + self.adev.reg(f"regSDMA{pipe}_CNTL").update(trap_enable=1, + **({'utc_l1_enable':1} if self.adev.ip_ver[am.SDMA0_HWIP] <= (5,2,0) else {}), inst=inst) + + if self.adev.ip_ver[am.NBIO_HWIP] in {(7,9,0), (7,9,1)}: + for aid_id in range(4): + for dev_inst, (port, awid, offset, awaddr) in enumerate([(1, 0xe, 0xe, 0x1), (2, 0x8, 0x8, 0x2), (5, 0x9, 0x9, 0x8), (6, 0xa, 0xa, 0x9)]): + entry = dev_inst + 1 + 4 * aid_id + self.adev.reg(f"regDOORBELL0_CTRL_ENTRY_{entry}").write(**{f"bif_doorbell{entry}_range_size_entry": 20, + f"bif_doorbell{entry}_range_offset_entry": (am.AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0 + (entry - 1) * 0xA) * 2}) + self.adev.soc.doorbell_enable(port=port, awid=awid, awaddr_31_28_value=awaddr, offset=offset, size=4, aid=aid_id) + else: self.adev.soc.doorbell_enable(port=2, awid=0xe, awaddr_31_28_value=0x3, offset=am.AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0*2, size=4) + + def fini_hw(self): + for reg, inst in self.sdma_reginst: + self.adev.reg(f"{reg}_RB_CNTL").update(rb_enable=0, inst=inst) + self.adev.reg(f"{reg}_IB_CNTL").update(ib_enable=0, inst=inst) + self.adev.reg(f"{reg}_DOORBELL").update(enable=0, inst=inst) + self.adev.reg(f"{reg}_DOORBELL_OFFSET").update(offset=0, inst=inst) + + if self.adev.ip_ver[am.SDMA0_HWIP] >= (6,0,0): + self.adev.regGRBM_SOFT_RESET.write(soft_reset_sdma0=1) + time.sleep(0.01) + self.adev.regGRBM_SOFT_RESET.write(0x0) + + def setup_ring(self, ring_addr:int, ring_size:int, rptr_addr:int, wptr_addr:int, idx:int) -> int: + if self.adev.ip_ver[am.SDMA0_HWIP] >= (5,0,0) and idx > 0: raise RuntimeError(f"am {self.adev.devfmt}: sdma queue {idx} is not available") + + pipe, queue = idx // 4, idx % 4 + reg, inst = ("regSDMA_GFX", pipe+queue*4) if self.adev.ip_ver[am.SDMA0_HWIP][:2] == (4,4) else (f"regSDMA{pipe}_QUEUE{queue}", 0) + doorbell = am.AMDGPU_NAVI10_DOORBELL_sDMA_ENGINE0 + (pipe+queue*4) * 0xA + self.sdma_reginst.append((reg, inst)) + + self.adev.reg(f"{reg}_MINOR_PTR_UPDATE").write(0x1, inst=inst) + self.adev.wreg_pair(f"{reg}_RB_RPTR", "", "_HI", 0, inst=inst) + self.adev.wreg_pair(f"{reg}_RB_WPTR", "", "_HI", 0, inst=inst) + self.adev.wreg_pair(f"{reg}_RB_BASE", "", "_HI", ring_addr >> 8, inst=inst) + self.adev.wreg_pair(f"{reg}_RB_RPTR_ADDR", "_LO", "_HI", rptr_addr, inst=inst) + self.adev.wreg_pair(f"{reg}_RB_WPTR_POLL_ADDR", "_LO", "_HI", wptr_addr, inst=inst) + self.adev.reg(f"{reg}_DOORBELL_OFFSET").update(offset=doorbell * 2, inst=inst) + self.adev.reg(f"{reg}_DOORBELL").update(enable=1, inst=inst) + self.adev.reg(f"{reg}_MINOR_PTR_UPDATE").write(0x0, inst=inst) + self.adev.reg(f"{reg}_RB_CNTL").write(**({f'{self.sdma_name.lower()}_wptr_poll_enable':1} if self.adev.ip_ver[am.SDMA0_HWIP][:2]!=(4,4) else {}), + rb_vmid=0, rptr_writeback_enable=1, rptr_writeback_timer=4, rb_enable=1, rb_priv=1, rb_size=(ring_size//4).bit_length()-1, inst=inst) + self.adev.reg(f"{reg}_IB_CNTL").update(ib_enable=1, inst=inst) + return doorbell + +class AM_PSP(AM_IP): + def init_sw(self): + self.reg_pref = "regMP0_SMN_C2PMSG" if self.adev.ip_ver[am.MP0_HWIP] < (14,0,0) else "regMPASP_SMN_C2PMSG" + + if self.adev.devfmt.startswith("usb:"): + self.msg1_view, paddrs = self.adev.pci_dev.alloc_sysmem(512 << 10) + self.msg1_addr = self.adev.mm.alloc_vaddr(size=self.msg1_view.nbytes, align=am.PSP_1_MEG) + self.adev.mm.map_range(self.msg1_addr, self.msg1_view.nbytes, [(paddrs[0], self.msg1_view.nbytes)], AddrSpace.SYS, uncached=True, boot=True) + else: + self.msg1_paddr = self.adev.mm.palloc(am.PSP_1_MEG, align=am.PSP_1_MEG, zero=False, boot=True) + self.msg1_addr, self.msg1_view = self.adev.paddr2mc(self.msg1_paddr), self.adev.vram.view(self.msg1_paddr, am.PSP_1_MEG, 'B') + + self.cmd_paddr = self.adev.mm.palloc(am.PSP_CMD_BUFFER_SIZE, zero=False, boot=True) + self.fence_paddr = self.adev.mm.palloc(am.PSP_FENCE_BUFFER_SIZE, zero=True, boot=True) + + self.ring_size = 0x10000 + self.ring_paddr = self.adev.mm.palloc(self.ring_size, zero=False, boot=True) + + self.max_tmr_size, self.tmr_size = 0x1300000, 0 + self.boot_time_tmr = self.adev.ip_ver[am.MP0_HWIP] in {(13,0,6), (13,0,14), (14,0,2), (14,0,3)} + self.autoload_tmr = self.adev.ip_ver[am.MP0_HWIP] not in {(13,0,6), (13,0,14)} + self.tmr_paddr = self.adev.mm.palloc(self.max_tmr_size, align=am.PSP_TMR_ALIGNMENT, zero=False, boot=True) if not self.boot_time_tmr else 0 + + def init_hw(self): + spl_key = am.PSP_FW_TYPE_PSP_SPL if self.adev.ip_ver[am.MP0_HWIP] >= (14,0,0) else am.PSP_FW_TYPE_PSP_KDB + sos_components = [(am.PSP_FW_TYPE_PSP_KDB, am.PSP_BL__LOAD_KEY_DATABASE), (spl_key, am.PSP_BL__LOAD_TOS_SPL_TABLE), + (am.PSP_FW_TYPE_PSP_SYS_DRV, am.PSP_BL__LOAD_SYSDRV), (am.PSP_FW_TYPE_PSP_SOC_DRV, am.PSP_BL__LOAD_SOCDRV), + (am.PSP_FW_TYPE_PSP_INTF_DRV, am.PSP_BL__LOAD_INTFDRV), (am.PSP_FW_TYPE_PSP_DBG_DRV, am.PSP_BL__LOAD_DBGDRV), + (am.PSP_FW_TYPE_PSP_RAS_DRV, am.PSP_BL__LOAD_RASDRV), (am.PSP_FW_TYPE_PSP_SOS, am.PSP_BL__LOAD_SOSDRV)] + + if not self.is_sos_alive(): + for fw, compid in sos_components: self._bootloader_load_component(fw, compid) + wait_cond(self.is_sos_alive, value=True, msg="sOS failed to start") + + self._ring_create() + if am.PSP_FW_TYPE_PSP_TOC in self.adev.fw.sos_fw: self._tmr_init() + + # SMU fw should be loaded before TMR. + if hasattr(self.adev.fw, 'smu_psp_desc'): self._load_ip_fw_cmd(*self.adev.fw.smu_psp_desc) + if not self.boot_time_tmr or not self.autoload_tmr: self._tmr_load_cmd() + + for psp_desc in self.adev.fw.descs: self._load_ip_fw_cmd(*psp_desc) + + if self.adev.ip_ver[am.GC_HWIP] >= (11,0,0): self._rlc_autoload_cmd() + else: self._load_ip_fw_cmd([am.GFX_FW_TYPE_REG_LIST], self.adev.fw.sos_fw[am.PSP_FW_TYPE_PSP_RL]) + + def is_sos_alive(self): return self.adev.reg(f"{self.reg_pref}_81").read() != 0x0 + + def _wait_for_bootloader(self): wait_cond(lambda: self.adev.reg(f"{self.reg_pref}_35").read() & 0x80000000, value=0x80000000, msg="BL not ready") + + def _prep_msg1(self, data:memoryview): + assert len(data) <= self.msg1_view.nbytes, f"msg1 buffer is too small {len(data):#x} > {self.msg1_view.nbytes:#x}" + padded_data = pad_bytes(bytes(data) + b'\x00' * 4, 16) # HACK: apple's memcpy requires 16-bytes alignment + self.msg1_view[:len(padded_data)] = padded_data + self.adev.gmc.flush_hdp() + + def _bootloader_load_component(self, fw:int, compid:int): + if fw not in self.adev.fw.sos_fw: return 0 + + self._wait_for_bootloader() + + if DEBUG >= 2: print(f"am {self.adev.devfmt}: loading sos component: {am.enum_psp_fw_type.get(fw)}") + + self._prep_msg1(self.adev.fw.sos_fw[fw]) + self.adev.reg(f"{self.reg_pref}_36").write(self.msg1_addr >> 20) + self.adev.reg(f"{self.reg_pref}_35").write(compid) + + return self._wait_for_bootloader() if compid != am.PSP_BL__LOAD_SOSDRV else 0 + + def _tmr_init(self): + # Load TOC and calculate TMR size + self._prep_msg1(fwm:=self.adev.fw.sos_fw[am.PSP_FW_TYPE_PSP_TOC]) + self.tmr_size = self._load_toc_cmd(len(fwm)).resp.tmr_size + assert self.tmr_size <= self.max_tmr_size + + def _ring_create(self): + # If the ring is already created, destroy it + if self.adev.reg(f"{self.reg_pref}_71").read() != 0: + self.adev.reg(f"{self.reg_pref}_64").write(am.GFX_CTRL_CMD_ID_DESTROY_RINGS) + + # There might be handshake issue with hardware which needs delay + time.sleep(0.02) + + # Wait until the sOS is ready + wait_cond(lambda: self.adev.reg(f"{self.reg_pref}_64").read() & 0x80000000, value=0x80000000, msg="sOS not ready") + + self.adev.wreg_pair(self.reg_pref, "_69", "_70", self.adev.paddr2mc(self.ring_paddr)) + self.adev.reg(f"{self.reg_pref}_71").write(self.ring_size) + self.adev.reg(f"{self.reg_pref}_64").write(am.PSP_RING_TYPE__KM << 16) + + # There might be handshake issue with hardware which needs delay + time.sleep(0.02) + + wait_cond(lambda: self.adev.reg(f"{self.reg_pref}_64").read() & 0x8000FFFF, value=0x80000000, msg="sOS ring not created") + + def _ring_submit(self, cmd:am.struct_psp_gfx_cmd_resp) -> am.struct_psp_gfx_cmd_resp: + msg = am.struct_psp_gfx_rb_frame(fence_value=(prev_wptr:=self.adev.reg(f"{self.reg_pref}_67").read()) + 1, + cmd_buf_addr_lo=lo32(self.adev.paddr2mc(self.cmd_paddr)), cmd_buf_addr_hi=hi32(self.adev.paddr2mc(self.cmd_paddr)), + fence_addr_lo=lo32(self.adev.paddr2mc(self.fence_paddr)), fence_addr_hi=hi32(self.adev.paddr2mc(self.fence_paddr))) + + self.adev.vram.view(self.cmd_paddr, ctypes.sizeof(cmd))[:] = memoryview(cmd).cast('B') + self.adev.vram.view(self.ring_paddr + prev_wptr * 4, ctypes.sizeof(msg))[:] = memoryview(msg).cast('B') + + # Move the wptr + self.adev.reg(f"{self.reg_pref}_67").write(prev_wptr + ctypes.sizeof(am.struct_psp_gfx_rb_frame) // 4) + + wait_cond(lambda: self.adev.vram.view(self.fence_paddr, 4, 'I')[0], value=msg.fence_value, msg="sOS ring not responding") + + resp = type(cmd).from_buffer(bytearray(self.adev.vram.view(self.cmd_paddr, ctypes.sizeof(cmd))[:])) + if resp.resp.status != 0: raise RuntimeError(f"PSP command failed {resp.cmd_id} {resp.resp.status}") + + return resp + + def _load_ip_fw_cmd(self, fw_types:list[int], fw_bytes:memoryview): + self._prep_msg1(fw_bytes) + for fw_type in fw_types: + if DEBUG >= 2: print(f"am {self.adev.devfmt}: loading fw: {am.enum_psp_gfx_fw_type.get(fw_type)}") + cmd = am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_LOAD_IP_FW) + cmd.cmd.cmd_load_ip_fw.fw_phy_addr_hi, cmd.cmd.cmd_load_ip_fw.fw_phy_addr_lo = data64(self.msg1_addr) + cmd.cmd.cmd_load_ip_fw.fw_size = len(fw_bytes) + cmd.cmd.cmd_load_ip_fw.fw_type = fw_type + self._ring_submit(cmd) + + def _tmr_load_cmd(self) -> am.struct_psp_gfx_cmd_resp: + tmr_paddr = self.adev.paddr2xgmi(self.tmr_paddr) if self.tmr_paddr else 0 + + cmd = am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_SETUP_TMR) + cmd.cmd.cmd_setup_tmr.buf_phy_addr_hi, cmd.cmd.cmd_setup_tmr.buf_phy_addr_lo = data64(self.adev.paddr2mc(self.tmr_paddr) if self.tmr_paddr else 0) + cmd.cmd.cmd_setup_tmr.system_phy_addr_hi, cmd.cmd.cmd_setup_tmr.system_phy_addr_lo = data64(tmr_paddr) + cmd.cmd.cmd_setup_tmr.bitfield.virt_phy_addr = 1 + cmd.cmd.cmd_setup_tmr.buf_size = self.tmr_size if self.tmr_paddr else 0 + return self._ring_submit(cmd) + + def _load_toc_cmd(self, toc_size:int) -> am.struct_psp_gfx_cmd_resp: + cmd = am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_LOAD_TOC) + cmd.cmd.cmd_load_toc.toc_phy_addr_hi, cmd.cmd.cmd_load_toc.toc_phy_addr_lo = data64(self.msg1_addr) + cmd.cmd.cmd_load_toc.toc_size = toc_size + return self._ring_submit(cmd) + + def _spatial_partition_cmd(self, mode): + cmd = am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_SRIOV_SPATIAL_PART) + cmd.cmd.cmd_spatial_part.mode = mode + return self._ring_submit(cmd) + + def _rlc_autoload_cmd(self): return self._ring_submit(am.struct_psp_gfx_cmd_resp(cmd_id=am.GFX_CMD_ID_AUTOLOAD_RLC)) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/amd.py b/artifacts/package_runtime/tinygrad/runtime/support/amd.py new file mode 100644 index 000000000..cc7e07009 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/amd.py @@ -0,0 +1,47 @@ +import functools, tinygrad.runtime.autogen.am +from dataclasses import dataclass +from tinygrad.helpers import getbits + +@dataclass +class AMDReg: + name:str; offset:int; segment:int; fields:dict[str, tuple[int, int]]; bases:dict[int, tuple[int, ...]] # noqa: E702 + def __post_init__(self): self.addr:dict[int, int] = { inst: bases[self.segment] + self.offset for inst, bases in self.bases.items() } + + def encode(self, **kwargs) -> int: return functools.reduce(int.__or__, (value << self.fields[name][0] for name,value in kwargs.items()), 0) + def decode(self, val: int) -> dict: return {name:getbits(val, start, end) for name,(start,end) in self.fields.items()} + + def fields_mask(self, *names) -> int: + return functools.reduce(int.__or__, ((((1 << (self.fields[nm][1]-self.fields[nm][0]+1)) - 1) << self.fields[nm][0]) for nm in names), 0) + +@dataclass +class AMDIP: + name:str; version:tuple[int, int, int]; bases:dict[int, tuple[int, ...]] # noqa: E702 + + @functools.cached_property + def regs(self): return import_asic_regs(self.name, self.version, cls=functools.partial(AMDReg, bases=self.bases)) + + def __getattr__(self, name:str): + if name in self.regs: return self.regs[name] + if (name10:=name.replace('reg', 'mm')) in self.regs: return self.regs[name10] + raise AttributeError(f"{self.name.upper()} has no register {name}") + +# load the greatest module with matching major version that's less than or equal to the target version +# this is not universally correct, see below for an example, but appears reliable for most recent gpus +# https://github.com/torvalds/linux/blob/9207d47f966be9f4d52e7e0119ac2b7a7e366f3e/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c#L3163 +def import_module(name:str, target:tuple[int, int, int], submod=""): + # version overrides + target = {("smu", (13, 0, 7)): (13, 0, 0)}.get((name, target), target) + mod = getattr(tinygrad.runtime.autogen.am, submod) if submod else tinygrad.runtime.autogen.am + if (children:=[c for c in mod.__all__ if c.startswith(name) and (v:=tuple(map(int, c.split('_')[1:])))[0] == target[0] and v <= target]): + return getattr(mod, children[-1]) + raise ImportError(f"Failed to import {submod+'.' if submod else ''}{name} {'.'.join(map(str, target))}") + +def import_soc(ip): return getattr(tinygrad.runtime.autogen.am, f"soc_{ip[0]}") + +def import_pmc(ip) -> dict[str, tuple[str, int]]: + from tinygrad.runtime.autogen.am import pmc + # NOTE: precise arch for mi300+, generic for others, since rocm headers lack some archs + return {k:x for k,v in pmc.counters.items() if (x:=v.get(f"gfx{ip[0]}{ip[1]:x}{ip[2]:x}" if ip[0] == 9 else f"gfx{ip[0]}", None)) is not None} + +def import_asic_regs(prefix:str, version:tuple[int, int, int], cls=AMDReg) -> dict[str, AMDReg]: + return {reg:cls(name=reg, offset=off, segment=seg, fields=fields) for reg,(off,seg,fields) in import_module(prefix, version, submod="regs").items()} diff --git a/artifacts/package_runtime/tinygrad/runtime/support/autogen.py b/artifacts/package_runtime/tinygrad/runtime/support/autogen.py new file mode 100644 index 000000000..1bd8b17ba --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/autogen.py @@ -0,0 +1,289 @@ +import ctypes, itertools, re, functools, os, keyword +from tinygrad.helpers import unwrap +import tinygrad.runtime.autogen.libclang as clang # use REGEN=1 to regenerate libclang bindings + +def unwrap_cursor(c: clang.CXCursor) -> clang.CXCursor: + assert c != clang.clang_getNullCursor() + return c + +def children(c: clang.CXCursor) -> list[clang.CXCursor]: + ret = [] + @clang.CXCursorVisitor + def visitor(child, _0, _1): + nonlocal ret + ret.append(child) + return clang.CXChildVisit_Continue + clang.clang_visitChildren(c, visitor, None) + return ret + +def fields(t: clang.CXType) -> list[clang.CXCursor]: + ret = [] + @clang.CXFieldVisitor + def visitor(child, _): + nonlocal ret + ret.append(child) + return clang.CXVisit_Continue + clang.clang_Type_visitFields(t, visitor, None) + return ret + +# flattens anonymous structs/unions +def all_fields(t, off=0): + for f in fields(t): + if clang.clang_Cursor_isAnonymousRecordDecl(clang.clang_getTypeDeclaration(clang.clang_getCursorType(f))): + yield from all_fields(clang.clang_getCursorType(f), off + clang.clang_Cursor_getOffsetOfField(f) // 8) + elif nm(f): yield f, off+clang.clang_Cursor_getOffsetOfField(f) // 8 # ignores unnamed fields + +def arguments(c: clang.CXCursor|clang.CXType): + yield from ((clang.clang_Cursor_getArgument if isinstance(c, clang.CXCursor) else clang.clang_getArgType)(c, i) + for i in range(clang.clang_Cursor_getNumArguments(c) if isinstance(c, clang.CXCursor) else clang.clang_getNumArgTypes(c))) + +class Tokens: + def __init__(self, c: clang.CXCursor): + clang.clang_tokenize(tu:=clang.clang_Cursor_getTranslationUnit(c), clang.clang_getCursorExtent(c), + toks:=(ctypes.POINTER(clang.CXToken)()), cnt:=ctypes.c_uint32()) + self.tu, self.toks = tu, toks[:cnt.value] + for t in self.toks: t._tu = tu + + def __getitem__(self, idx): return self.toks[idx] + def __len__(self): return len(self.toks) + + def __del__(self): + if self.toks: clang.clang_disposeTokens(self.tu, self.toks[0], len(self.toks)) + +def cxs(fn): + @functools.wraps(fn) + def wrap(*args, **kwargs) -> str: + if ctypes.cast(clang.clang_getCString(cxs:=fn(*args, **kwargs)), ctypes.c_void_p).value is None: return "" + ret = ctypes.string_at(clang.clang_getCString(cxs)).decode() + clang.clang_disposeString(cxs) + return ret + return wrap + +# TODO: caching this would be nice? +nm = cxs(lambda c: getattr(clang, f"clang_get{c.__class__.__name__[2:]}Spelling")(*([c._tu, c] if isinstance(c, clang.CXToken) else [c]))) +def extent(c): return getattr(clang, f"clang_get{c.__class__.__name__[2:]}Extent")(*([c._tu, c] if isinstance(c, clang.CXToken) else [c])) +def loc(c): return getattr(clang, f"clang_get{c.__class__.__name__[2:]}Location")(*([c._tu, c] if isinstance(c, clang.CXToken) else [c])) +def gel(loc: clang.CXSourceLocation): + clang.clang_getExpansionLocation(loc, file:=clang.CXFile(), line:=ctypes.c_uint32(), None, offset:=ctypes.c_uint32()) + return {"file":clang.clang_getFileName(file), "line":line.value, "offset":offset.value} +loc_file = cxs(lambda loc: gel(loc)['file']) +def loc_off(loc: clang.CXSourceLocation) -> int: return gel(loc)['offset'] +def loc_line(loc: clang.CXSourceLocation) -> int: return gel(loc)['line'] + +def readext(f, fst, snd=None): + with open(f, "r") as f: # reopening this every time is dumb... + f.seek(start:=loc_off(clang.clang_getRangeStart(fst) if isinstance(fst, clang.CXSourceRange) else fst)) + return f.read(loc_off(clang.clang_getRangeEnd(fst) if isinstance(fst, clang.CXSourceRange) else snd)-start) +def attrs(c): return list(filter(lambda k: k >= 400 and k < 500, map(lambda c: c.kind, children(c)))) + +def protocols(t): yield from (clang.clang_Type_getObjCProtocolDecl(t, i) for i in range(clang.clang_Type_getNumObjCProtocolRefs(t))) +def basetype(t): return clang.clang_Type_getObjCObjectBaseType(t) + +base_rules = [(r'\s*\\\n\s*', ' '), (r'\s*\n\s*', ' '), (r'//.*', ''), (r'/\*.*?\*/', ''), (r'\b(0[xX][0-9a-fA-F]+|\d+)[uUlL]+\b', r'\1'), + (r'\b0+(?=\d)', ''), (r'\s*&&\s*', r' and '), (r'\s*\|\|\s*', r' or '), (r'\s*!\s*', ' not '), + (r'(struct|union|enum)\s*([a-zA-Z_][a-zA-Z0-9_]*\b)', r'\1_\2'), + (r'\((unsigned )?(char|uint64_t)\)', ''), (r'^.*\d+:\d+.*$', ''), (r'^.*\w##\w.*$', '')] + +uints = (clang.CXType_Char_U, clang.CXType_UChar, clang.CXType_UShort, clang.CXType_UInt, clang.CXType_ULong, clang.CXType_ULongLong) +ints = uints + (clang.CXType_Char_S, clang.CXType_SChar, clang.CXType_Short, clang.CXType_Int, clang.CXType_Long, clang.CXType_LongLong) +fps, specs = (clang.CXType_FunctionProto, clang.CXType_FunctionNoProto), (clang.CXCursor_ObjCSuperClassRef,) # this could include protocols + +tmap = {clang.CXType_Void:"None", clang.CXType_Char_U:"ctypes.c_ubyte", clang.CXType_UChar:"ctypes.c_ubyte", clang.CXType_WChar:"ctypes.c_wchar", + clang.CXType_Char_S:"ctypes.c_char", clang.CXType_SChar:"ctypes.c_byte", clang.CXType_Bool:"ctypes.c_bool", + **{getattr(clang, f'CXType_{k}'):f"ctypes.c_{k.lower()}" for k in ["Float", "Double", "LongDouble"]}, + **{getattr(clang, f'CXType_{k}'):f"ctypes.c_{'u' if 'U' in k else ''}int{sz}" for sz,k in + [(16, "UShort"), (16, "Short"), (32, "UInt"), (32, "Int"), (64, "ULong"), (64, "Long"), (64, "ULongLong"), (64, "LongLong")]}} + +# https://clang.llvm.org/docs/AutomaticReferenceCounting.html#arc-method-families +arc_families = ['alloc', 'copy', 'mutableCopy', 'new'] + +def normalize(a): return ("_" + n if keyword.iskeyword(n:=nm(a)) else n) + +def gen(name, files, dll="", args=[], prolog=[], rules=[], epilog=[], recsym=False, errno=False, anon_names={}, types={}, macros=True, paths=[], + patterns=[]): + extras, lines, anoncnt, types, objc, fns = [], [], itertools.count().__next__, {k:(v,True) for k,v in types.items()}, False, set() + + # ctypes automatically "unboxes" simple types + def typehint(ty) -> str: + if (v:={**{i:"int" for i in ints}, **{getattr(clang, f"CXType_{f}"):"float" for f in ['Float', 'Double', 'LongDouble']}, clang.CXType_Enum:"int", + clang.CXType_WChar:"str", clang.CXType_SChar:"int", clang.CXType_Char_S:"bytes", clang.CXType_Bool:"bool",}.get(ty.kind, None)): return v + return tname(ty) + + def tname(t, suggested_name=None, typedef=None) -> str: + suggested_name = anon_names.get(f"{loc_file(loc(decl:=clang.clang_getTypeDeclaration(t)))}:{loc_line(loc(decl))}", suggested_name) + nonlocal lines, types, anoncnt, objc + + if t.kind in tmap: return tmap[t.kind] + if nm(t) in types and types[nm(t)][1]: return types[nm(t)][0] + if ((f:=t).kind in fps) or (t.kind == clang.CXType_Pointer and (f:=clang.clang_getPointeeType(t)).kind in fps): + return (f"c.CFUNCTYPE[{tname(clang.clang_getResultType(f))}, [" + ', '.join(map(tname, arguments(f))) + "]]") + match t.kind: + case clang.CXType_Pointer: + return "ctypes.c_void_p" if (p:=clang.clang_getPointeeType(t)).kind==clang.CXType_Void else f"c.POINTER[{tname(p)}]" + case clang.CXType_ObjCObjectPointer: return tname(clang.clang_getPointeeType(t)) # TODO: this seems wrong + case clang.CXType_Elaborated: return tname(clang.clang_Type_getNamedType(t), suggested_name) + case clang.CXType_Typedef if nm(t) == nm(canon:=clang.clang_getCanonicalType(t)): return tname(canon) + case clang.CXType_Typedef: + defined, cnm = nm(canon:=clang.clang_getCanonicalType(t)) in types, tname(canon, typedef=nm(t)) + types[nm(t)] = cnm if nm(t).startswith("__") else nm(t).replace('::', '_'), True + # RECORDs need to handle typedefs specially to allow for self-reference + if canon.kind != clang.CXType_Record or defined: lines.append(f"{nm(t).replace('::', '_')}: TypeAlias = {cnm}") + return types[nm(t)][0] + case clang.CXType_Record: + # TODO: packed unions + # libclang does not use CXType_Elaborated for function parameters with type qualifiers (eg. void (*)(const struct foo)) + if (_nm:=re.sub(r"^const ", "", nm(t))) in types and types[_nm][1]: return types[_nm][0] + + # check if previously declared + if _nm in types: types[_nm] = (tnm:=types[_nm][0]), types[_nm][1] or len(fields(t)) != 0, (ln:=types[_nm][2]) + else: + real_nm = ((suggested_name or (f"_anon{'struct' if decl.kind==clang.CXCursor_StructDecl else 'union'}{anoncnt()}")) + if clang.clang_Cursor_isAnonymous(decl) else _nm) + types[_nm] = (tnm:=real_nm.replace(' ', '_').replace('::', '_')), len(fields(t)) != 0, (ln:=len(lines)) + lines.append(f"class {tnm}(c.Struct): pass") + if typedef: + lines.append(f"{typedef.replace('::', '_')}: TypeAlias = {tnm}") + types[typedef] = typedef.replace('::', '_'), True + ff = [(normalize(f), clang.clang_getCanonicalType(ty:=clang.clang_getCursorType(f)), tname(ty, f"{tnm}_{nm(f)}"), offset) + + ((clang.clang_getFieldDeclBitWidth(f), clang.clang_Cursor_getOffsetOfField(f) % 8) * clang.clang_Cursor_isBitField(f)) + for f,offset in all_fields(t)] + if ff: + lines[ln] = "\n".join(["@c.record", f"class {tnm}(c.Struct):", f" SIZE = {clang.clang_Type_getSizeOf(t)}"] + + [f" {f}: {typehint(ty)}" for f,ty,*args in ff]) + lines.append(f"{tnm}.register_fields([" + ", ".join([f"('{f}', {', '.join(str(a) for a in args)})" for f,ty,*args in ff]) + "])") + return tnm + case clang.CXType_Enum: + # TODO: C++ and GNU C have forward declared enums + types[nm(t)] = tname(ety:=clang.clang_getEnumDeclIntegerType(decl)), True + enm = suggested_name or f"_anonenum{anoncnt()}" if clang.clang_Cursor_isAnonymous(decl) else nm(t).replace(' ', '_').replace('::', '_') + def value(e): return (clang.clang_getEnumConstantDeclUnsignedValue if ety.kind in uints else clang.clang_getEnumConstantDeclValue)(e) + lines.append(f"{enm}: dict[int, str] = {{" + ", ".join(f"({nm(e)}:={value(e)}): '{nm(e)}'" for e in children(decl) + if e.kind == clang.CXCursor_EnumConstantDecl) + "}") + return types[nm(t)][0] + case clang.CXType_ConstantArray: return (f"c.Array[{tname(clang.clang_getArrayElementType(t), suggested_name and suggested_name.rstrip('s'))}, " + f"Literal[{clang.clang_getArraySize(t)}]]") + case clang.CXType_IncompleteArray: + return f"c.Array[{tname(clang.clang_getArrayElementType(t), suggested_name and suggested_name.rstrip('s'))}, Literal[0]]" + case clang.CXType_ObjCInterface: + is_defn = bool([f.kind for f in children(decl) if f.kind in (clang.CXCursor_ObjCInstanceMethodDecl, clang.CXCursor_ObjCClassMethodDecl)]) + if (tnm:=nm(t)) not in types: lines.append(f"class {tnm}(objc.Spec): pass") + types[tnm] = tnm, is_defn + if is_defn: + ims, cms = parse_objc_spec(decl, tnm, clang.CXCursor_ObjCInstanceMethodDecl), parse_objc_spec(decl, tnm, clang.CXCursor_ObjCClassMethodDecl) + bases = [tname(clang.clang_getCursorType(b)) for b in children(decl) if b.kind in specs] + lines.extend([*([f"{tnm}._bases_ = [{', '.join(bases)}]"] if bases else []), + *([f"{tnm}._methods_ = [", *ims, ']'] if ims else []), *([f"{tnm}._classmethods_ = [", *cms, ']'] if cms else [])]) + return tnm + case clang.CXType_ObjCSel: return "objc.id_" + case clang.CXType_ObjCId: return (objc:=True, "objc.id_")[1] + case clang.CXType_ObjCObject: + if basetype(t).kind != clang.CXType_ObjCId: raise NotImplementedError(f"generics unsupported: {nm(t)}") + if len(ps:=[proto(p) for p in protocols(t)]) == 0: + types[nm(t)] = "objc.id_", True + return "objc.id_" + if len(ps) == 1: + types[nm(t)] = ps[0], True + return ps[0] + types[nm(t)] = (tnm:=f"_anondynamic{anoncnt()}"), True + lines.append(f"class {tnm}({', '.join(ps)}): pass # {nm(t)}") + return tnm + case _: raise NotImplementedError(f"unsupported type {t.kind}") + + # parses an objc @interface or @protocol, returning a list of declerations that objc.Spec can parse, for the specified kind + # NB: ivars are unsupported + def parse_objc_spec(decl:clang.CXCursor, dnm:str, kind) -> list[str]: + nonlocal lines, types + ms = [] + for d in filter(lambda d: d.kind == kind, children(decl)): + rollback = lines, types + try: ms.append(f" ('{nm(d)}', {repr('instancetype') if nm(rt:=clang.clang_getCursorResultType(d))=='instancetype' else tname(rt)}, " + + f"[{', '.join('instancetype' if nm(a) == 'instancetype' else tname(clang.clang_getCursorType(a)) for a in arguments(d))}]" + + (", True" * (clang.CXCursor_NSReturnsRetained in attrs(d) or (any(nm(d).startswith(s) for s in arc_families) and rt.kind!=clang.CXType_Void))) + + "),") + except NotImplementedError as e: + print(f"skipping {dnm}.{nm(d)}: {e}") + lines, types = rollback + return ms + + # libclang doesn't have a "type" for @protocol, so we have to do this here... + def proto(decl): + nonlocal lines, types + if (dnm:=nm(decl)) in types and types[dnm][1]: return types[dnm][0] + # check if this is a forward declaration + is_defn = bool([f.kind for f in children(decl) if f.kind in (clang.CXCursor_ObjCInstanceMethodDecl, clang.CXCursor_ObjCClassMethodDecl)]) + if dnm not in types: lines.append(f"class {dnm}(objc.Spec): pass") + types[dnm] = dnm, is_defn + if is_defn: + bases = [proto(b) for b in children(decl) if b.kind==clang.CXCursor_ObjCProtocolRef and nm(b) != nm(decl)] + ims, cms = parse_objc_spec(decl, dnm, clang.CXCursor_ObjCInstanceMethodDecl), parse_objc_spec(decl, dnm, clang.CXCursor_ObjCClassMethodDecl) + lines.extend([*([f"{dnm}._bases_ = [{', '.join(bases)}]"] if bases else []), + *([f"{dnm}._methods_ = [", *ims, "]"] if ims else []), *([f"{dnm}._classmethods_ = [", *cms, "]"] if cms else [])]) + return dnm + + for f in files: + aa = ctypes.cast((ctypes.c_char_p * len(args))(*[x.encode() for x in args]), ctypes.POINTER(ctypes.POINTER(ctypes.c_char))) if len(args) else None + tu = clang.clang_parseTranslationUnit(idx:=clang.clang_createIndex(False, 0), os.fspath(f).encode(), aa, len(args), None, 0, + clang.CXTranslationUnit_DetailedPreprocessingRecord) + q = list(children(unwrap_cursor(clang.clang_getTranslationUnitCursor(tu))))[::-1] + while q: + c = q.pop() + if loc_file(loc(c)) != str(f) and (not recsym or c.kind not in (clang.CXCursor_FunctionDecl,)): continue + if patterns and not any(re.match(p, nm(c)) for p in patterns): continue + rollback = lines, types + try: + match c.kind: + case clang.CXCursor_FunctionDecl if clang.clang_getCursorLinkage(c) == clang.CXLinkage_External and dll and nm(c) not in fns: + # TODO: we could support name-mangling + fns.add(nm(c)) + rt, ats = clang.clang_getCursorResultType(c), [clang.clang_getCursorType(arg) for arg in arguments(c)] + anms = [normalize(arg) or '_' + str(i) for i, arg in enumerate(arguments(c))] + lines.extend([f"@dll.bind({', '.join([tname(at) for at in [rt] + ats])})", + f"def {nm(c)}({', '.join([f'{anm}:{typehint(at)}' for anm, at in zip(anms, ats)])}) -> {typehint(rt)}: ..."]) + if clang.CXCursor_NSReturnsRetained in attrs(c): lines.append(f"{nm(c)} = objc.returns_retained({nm(c)})") + case (clang.CXCursor_StructDecl | clang.CXCursor_UnionDecl | clang.CXCursor_TypedefDecl | clang.CXCursor_EnumDecl + | clang.CXCursor_ObjCInterfaceDecl): tname(clang.clang_getCursorType(c)) + case clang.CXCursor_MacroDefinition if macros and nm(c) and len(toks:=Tokens(c)) > 1: + if nm(toks[1])=='(' and clang.clang_equalLocations(clang.clang_getRangeEnd(extent(toks[0])), clang.clang_getRangeStart(extent(toks[1]))): + it = iter(toks[1:]) + _args = [nm(t) for t in itertools.takewhile(lambda t:nm(t)!=')', it) if clang.clang_getTokenKind(t) == clang.CXToken_Identifier] + if len(body:=list(it)) == 0: continue + extras += [f"{nm(c)} = lambda{' ' * bool(_args)}{','.join(_args)}: {readext(f,loc(body[0]),clang.clang_getRangeEnd(extent(toks[-1])))}"] + else: extras += [f"{nm(c)} = {readext(f, loc(toks[1]), clang.clang_getRangeEnd(extent(toks[-1])))}"] + case clang.CXCursor_VarDecl if clang.clang_getCursorLinkage(c) == clang.CXLinkage_Internal: + ty = clang.clang_getCursorType(c) + if (ty.kind == clang.CXType_ConstantArray and clang.clang_getCanonicalType(clang.clang_getArrayElementType(ty)).kind in ints and + (init:=children(c)[-1]).kind == clang.CXCursor_InitListExpr): + cs = children(init) + if all(re.match(r"\[.*\].*=", readext(f, extent(ch))) for ch in cs): + items = ','.join(f'{readext(f, extent(next(it:=iter(children(ch)))))}:{readext(f, extent(next(it)))}' for ch in cs) + extras += [f"{nm(c)} = {{{items}}}"] + else: extras += [f"{nm(c)} = ({','.join(readext(f, extent(ch)) for ch in cs)},)"] + elif clang.clang_getCanonicalType(ty).kind in ints: extras += [f"{nm(c)} = {readext(f, extent(children(c)[-1]))}"] + else: extras += [f"{nm(c)} = {tname(ty)}({readext(f, extent(children(c)[-1]))})"] + case clang.CXCursor_VarDecl if clang.clang_getCursorLinkage(c) == clang.CXLinkage_External and dll: + lines.append(f"try: {nm(c)} = {tname(clang.clang_getCursorType(c))}.in_dll(dll, '{nm(c)}') # type: ignore\n" + + "except (ValueError,AttributeError): pass") + case clang.CXCursor_ObjCProtocolDecl: proto(c) + case clang.CXCursor_Namespace | clang.CXCursor_LinkageSpec: q.extend(list(children(c))[::-1]) + except NotImplementedError as e: + print(f"skipping {nm(c)}: {e}") + lines, types = rollback + clang.clang_disposeTranslationUnit(tu) + clang.clang_disposeIndex(idx) + main = '\n'.join(['# mypy: disable-error-code="empty-body"', "from __future__ import annotations", "import ctypes", + "from typing import Literal, TypeAlias", "from tinygrad.runtime.support.c import _IO, _IOW, _IOR, _IOWR", + "from tinygrad.runtime.support import c", *prolog, *(["from tinygrad.runtime.support import objc"]*objc), + *([f"dll = c.DLL('{name}', {dll}{f', {paths}'*bool(paths)}{', use_errno=True'*errno})"] if dll else []), *lines]) + '\n' + extras = [f"{r} # type: ignore" if "lambda" in r else r + for m in extras if (r:=functools.reduce(lambda s,r:re.sub(r[0], r[1], s), rules + base_rules, m))] + while True: + try: + exec(main + '\n'.join(extras), {}) + break + except (SyntaxError, NameError, TypeError) as e: + extrano = unwrap(e.lineno if isinstance(e, SyntaxError) else unwrap(unwrap(e.__traceback__).tb_next).tb_lineno) - main.count('\n') - 1 + assert extrano >= 0 and extrano < len(extras), f"error outside extra range: {e}" + print(f"skipping {extras[extrano]}: {e}") + del extras[extrano] + except Exception as e: raise Exception("parsing failed") from e + return main + '\n'.join(extras + epilog) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/c.py b/artifacts/package_runtime/tinygrad/runtime/support/c.py new file mode 100644 index 000000000..009bf60e7 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/c.py @@ -0,0 +1,141 @@ +from __future__ import annotations +import ctypes, functools, os, pathlib, re, sys, sysconfig +from tinygrad.helpers import ceildiv, getenv, DEBUG, OSX, WIN +from typing import TYPE_CHECKING, get_args, Generic, ParamSpec, TypeVar + +def _do_ioctl(__idir, __base, __nr, __struct, __fd, *args, __payload=None, **kwargs): + assert not WIN, "ioctl not supported" + import tinygrad.runtime.support.hcq as hcq, fcntl + ioctl = __fd.ioctl if isinstance(__fd, hcq.FileIOInterface) else functools.partial(fcntl.ioctl, __fd) + if __struct is None: return ioctl((__base<<8)|__nr, __payload or (args[0] if args else 0)) + if (rc:=ioctl((__idir<<30)|(ctypes.sizeof(out:=(__payload or __struct(*args, **kwargs)))<<16)|(__base<<8)|__nr, out)): + raise RuntimeError(f"ioctl returned {rc}") + return out + +def _IO(base, nr): return functools.partial(_do_ioctl, 0, ord(base) if isinstance(base, str) else base, nr, None) +def _IOW(base, nr, typ): return functools.partial(_do_ioctl, 1, ord(base) if isinstance(base, str) else base, nr, typ) +def _IOR(base, nr, typ): return functools.partial(_do_ioctl, 2, ord(base) if isinstance(base, str) else base, nr, typ) +def _IOWR(base, nr, typ): return functools.partial(_do_ioctl, 3, ord(base) if isinstance(base, str) else base, nr, typ) + +T = TypeVar("T") +U = TypeVar("U") +P = ParamSpec("P") + +# mypy can't understand eg. ctypes.POINTER(ctypes.c_int), and python < 3.14 cannot understand ctypes.POINTER[ctypes.c_int] +class POINTER(Generic[T], ctypes._Pointer): + def __class_getitem__(cls, key): return ctypes.POINTER(key) +def pointer(x: T) -> POINTER[T]: return ctypes.pointer(x) # type: ignore + +if TYPE_CHECKING: _CFuncPtr = ctypes._CFunctionType +else: _CFuncPtr = ctypes._CFuncPtr + +class CFUNCTYPE(Generic[T, P], _CFuncPtr): + _flags_ = 0 + def __class_getitem__(cls, key): return ctypes.CFUNCTYPE(key[0], *key[1]) +class Array(Generic[T, U], ctypes.Array): + _type_, _length_ = ctypes.c_byte, 0 + def __class_getitem__(cls, key): return key[0] * get_args(key[1])[0] + def __new__(cls, ty, l): return ty * l + +class Struct(ctypes.Structure): + SIZE = 0 + + def __init__(self, *args, **kwargs): + ctypes.Structure.__init__(self) + for f,v in [*zip((rf[0] for rf in self._real_fields_), args), *kwargs.items()]: setattr(self, f, v) + + @classmethod + def register_fields(cls, fields): + setattr(cls, "_real_fields_", fields) + for i, (name, *args) in enumerate(fields): setattr(cls, name, Field(*args, name=name, idx=i)) + +def record(cls) -> type[Struct]: + setattr(cls, "_fields_", [('_mem_', ctypes.c_byte * cls.SIZE)]) + return cls + +class Field: + def __init__(self, typ, off, bit_width=None, bit_off=0, *, name=None, idx=0): + self.typ, self.off, self.bit_width, self.bit_off, self.name, self.idx = typ, off, bit_width, bit_off, name, idx + + def __set_name__(self, owner, name): + entry = (name, self.typ, self.off) + ((self.bit_width, self.bit_off) if self.bit_width else ()) + if hasattr(owner, "_real_fields_"): owner._real_fields_.append(entry) + else: setattr(owner, "_real_fields_", [entry]) + self.name, self.idx = name, len(owner._real_fields_) - 1 + + # lazily resolve field descriptors + def _resolve(self, cls): + if self.bit_width: # handle bitfields ourselves + sl, set_mask = slice(self.off, self.off+(sz:=ceildiv(self.bit_width+self.bit_off, 8))), ~((mask:=(1 << self.bit_width) - 1) << self.bit_off) + def b2i(obj): return int.from_bytes(memoryview(obj).cast("B")[sl], sys.byteorder) + def bset(obj, v): memoryview(obj).cast("B")[sl] = ((b2i(obj) & set_mask) | v << self.bit_off).to_bytes(sz, sys.byteorder) + # FIXME: signedness + cf = property(lambda obj: b2i(obj) >> self.bit_off & mask, bset) + # pull the CField descriptor from a dummy class, zero length arrays are so ctypes manages references to child objects for us + else: cf = type(self.name, (ctypes.Structure,), {"_layout_": "ms", "_pack_": 1, "_fields_": [(str(i), ctypes.c_byte*0) for i in range(self.idx)] + + [("_", ctypes.c_byte * self.off), ("v", self.typ)]}).v # type: ignore + setattr(cls, self.name, cf) + return cf + + def __get__(self, obj, objtype=None): return self._resolve(objtype).__get__(obj, objtype) if objtype else self + def __set__(self, obj, value): self._resolve(obj.__class__).__set__(obj, value) + +@functools.cache +def init_c_struct_t(sz:int, fields: tuple[tuple, ...]): + (CStruct:=type("CStruct", (Struct,), {'_fields_': [('_mem_', ctypes.c_byte * sz)]})).register_fields(fields) # type: ignore + return CStruct +def init_c_var(ty, creat_cb): return (creat_cb(v:=ty()), v)[1] + +class DLL(ctypes.CDLL): + _loaded_: set[str] = set() + + @staticmethod + def findlib(nm:str, paths:list[str], extra_paths=[]): + if nm == 'libc' and OSX: return '/usr/lib/libc.dylib' + if pathlib.Path(path:=getenv(nm.replace('-', '_').upper()+"_PATH", '')).is_file(): return path + for p in paths: + libpaths = {"posix": [d for d in os.environ.get('LD_LIBRARY_PATH', '').split(os.pathsep) if d] + ["/usr/lib64", "/usr/lib", "/usr/local/lib"], + "nt": os.environ['PATH'].split(os.pathsep), + "darwin": ["/opt/homebrew/lib", f"/System/Library/Frameworks/{p}.framework", f"/System/Library/PrivateFrameworks/{p}.framework"], + 'linux': ["/usr/lib/wsl/lib/", '/lib', '/lib64', f"/lib/{sysconfig.get_config_var('MULTIARCH')}"]} + if (pth:=pathlib.Path(p)).is_absolute(): + if pth.is_file(): return p + else: continue + for pre in (pathlib.Path(pre) for pre in ([path] if path else []) + libpaths.get(os.name, []) + libpaths.get(sys.platform, []) + extra_paths): + if not pre.is_dir(): continue + if WIN or OSX: + for base in ([f"lib{p}.dylib", f"{p}.dylib", str(p)] if OSX else [f"{p}.dll"]): + if (l:=pre / base).is_file() or (OSX and 'framework' in str(l) and l.is_symlink()): return str(l) + else: + for l in (l for l in pre.iterdir() if l.is_file() and re.fullmatch(f"lib{p}\\.so\\.?[0-9]*", l.name)): + # filter out linker scripts + with open(l, 'rb') as f: + if f.read(4) == b'\x7FELF': return str(l) + + def __init__(self, nm:str, paths:str|list[str], extra_paths=[], emsg="", **kwargs): + self.nm, self.emsg = nm, emsg or f"try setting {nm.upper()+'_PATH'}?" + if (path:= DLL.findlib(nm, paths if isinstance(paths, list) else [paths], extra_paths if isinstance(extra_paths, list) else [extra_paths])): + if DEBUG >= 3: print(f"loading {nm} from {path}") + try: + super().__init__(path, **kwargs) + self._loaded_.add(self.nm) + except OSError as e: + self.emsg = str(e) + if DEBUG >= 3: print(f"loading {nm} failed: {e}") + elif DEBUG >= 3: print(f"loading {nm} failed: not found on system") + + def bind(self, restype, *argtypes): + def wrap(fn): + cfunc = None + @functools.wraps(fn) + def wrapper(*args): + nonlocal cfunc + if cfunc is None: (cfunc:=getattr(self, fn.__name__)).argtypes, cfunc.restype = argtypes, restype + return cfunc(*args) + wrapper.restype, wrapper.argtypes = restype, argtypes # type: ignore + return wrapper + return wrap + + def __getattr__(self, nm): + if self.nm not in self._loaded_: raise AttributeError(f"failed to load library {self.nm}: {self.emsg}") + return super().__getattr__(nm) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/compiler_amd.py b/artifacts/package_runtime/tinygrad/runtime/support/compiler_amd.py new file mode 100644 index 000000000..eef5e07f8 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/compiler_amd.py @@ -0,0 +1,109 @@ +import ctypes, hashlib, tempfile, subprocess, pathlib +from tinygrad.helpers import amdgpu_disassemble, getenv +from tinygrad.runtime.autogen import comgr +try: + comgr.amd_comgr_get_version(ctypes.byref(major:=ctypes.c_uint64()), ctypes.byref(minor:=ctypes.c_uint64())) + if major.value >= 3: + # in comgr 3 the values of enums in headers were changed: https://github.com/ROCm/llvm-project/issues/272 + import tinygrad.runtime.autogen.comgr_3 as comgr # type: ignore[no-redef] + assert comgr.AMD_COMGR_LANGUAGE_HIP == 3 +except AttributeError: pass # ignore if ROCm isn't installed +from tinygrad.device import Compiler, CompileError +from tinygrad.runtime.support import c +from tinygrad.helpers import to_char_p_p + +def check(status): + if status != 0: + comgr.amd_comgr_status_string(status, ctypes.byref(status_str := ctypes.POINTER(ctypes.c_char)())) + raise RuntimeError(f"comgr fail {status}, {ctypes.string_at(status_str).decode()}") + +def _get_comgr_data(data_set, data_type): + check(comgr.amd_comgr_action_data_get_data(data_set, data_type, 0, ctypes.byref(data_exec := comgr.amd_comgr_data_t()))) + check(comgr.amd_comgr_get_data(data_exec, ctypes.byref(sz := ctypes.c_uint64()), None)) + check(comgr.amd_comgr_get_data(data_exec, ctypes.byref(sz), (dat := ctypes.create_string_buffer(sz.value)))) + check(comgr.amd_comgr_release_data(data_exec)) + return bytes(dat) + +# amd_comgr_action_info_set_options was deprecated +def set_options(action_info, options:bytes): + # TODO: this type should be correct in the autogen stub + @comgr.dll.bind(comgr.amd_comgr_status_t, comgr.amd_comgr_action_info_t, c.POINTER[c.POINTER[ctypes.c_char]], comgr.size_t) + def amd_comgr_action_info_set_option_list(ai, o, c) -> comgr.amd_comgr_status_t: pass # type: ignore[empty-body] + return amd_comgr_action_info_set_option_list(action_info, to_char_p_p(options_list:=options.split(b' ')), len(options_list)) + +# AMD_COMGR_SAVE_TEMPS=1 AMD_COMGR_REDIRECT_LOGS=stdout AMD_COMGR_EMIT_VERBOSE_LOGS=1 +def compile_hip(prg:str, arch="gfx1100", asm=False) -> bytes: + check(comgr.amd_comgr_create_action_info(ctypes.byref(action_info := comgr.amd_comgr_action_info_t()))) + check(comgr.amd_comgr_action_info_set_language(action_info, comgr.AMD_COMGR_LANGUAGE_HIP)) + check(comgr.amd_comgr_action_info_set_isa_name(action_info, b"amdgcn-amd-amdhsa--" + arch.encode())) + check(comgr.amd_comgr_action_info_set_logging(action_info, True)) + + check(comgr.amd_comgr_create_data_set(ctypes.byref(data_set_src := comgr.amd_comgr_data_set_t()))) + check(comgr.amd_comgr_create_data_set(ctypes.byref(data_set_bc := comgr.amd_comgr_data_set_t()))) + check(comgr.amd_comgr_create_data_set(ctypes.byref(data_set_reloc := comgr.amd_comgr_data_set_t()))) + check(comgr.amd_comgr_create_data_set(ctypes.byref(data_set_exec := comgr.amd_comgr_data_set_t()))) + + check(comgr.amd_comgr_create_data(comgr.AMD_COMGR_DATA_KIND_SOURCE, ctypes.byref(data_src := comgr.amd_comgr_data_t()))) + check(comgr.amd_comgr_set_data(data_src, len(rprg := prg.encode()), rprg)) + + if asm: + check(comgr.amd_comgr_set_data_name(data_src, b".s")) + check(comgr.amd_comgr_data_set_add(data_set_src, data_src)) + status = comgr.amd_comgr_do_action(comgr.AMD_COMGR_ACTION_ASSEMBLE_SOURCE_TO_RELOCATABLE, action_info, data_set_src, data_set_reloc) + if status != 0: + print(_get_comgr_data(data_set_reloc, comgr.AMD_COMGR_DATA_KIND_LOG).decode()) + raise RuntimeError("assemble failed") + else: + check(comgr.amd_comgr_set_data_name(data_src, b"")) + check(comgr.amd_comgr_data_set_add(data_set_src, data_src)) + # -include hiprtc_runtime.h was removed + options = [ + "-O3", "-mcumode", "--hip-version=6.0.32830", "-DHIP_VERSION_MAJOR=6", "-DHIP_VERSION_MINOR=0", "-DHIP_VERSION_PATCH=32830", + "-D__HIPCC_RTC__", "-std=c++14", "-nogpuinc", "-Wno-gnu-line-marker", "-Wno-missing-prototypes", f"--offload-arch={arch}", + "-I/opt/rocm/include", "-Xclang -disable-llvm-passes", "-Xclang -aux-triple", "-Xclang x86_64-unknown-linux-gnu"] + check(set_options(action_info, ' '.join(options).encode())) + status = comgr.amd_comgr_do_action(comgr.AMD_COMGR_ACTION_COMPILE_SOURCE_WITH_DEVICE_LIBS_TO_BC, action_info, data_set_src, data_set_bc) + if status != 0: + print(_get_comgr_data(data_set_bc, comgr.AMD_COMGR_DATA_KIND_LOG).decode()) + raise RuntimeError("compile failed") + check(set_options(action_info, b"-O3 -mllvm -amdgpu-internalize-symbols")) + check(comgr.amd_comgr_do_action(comgr.AMD_COMGR_ACTION_CODEGEN_BC_TO_RELOCATABLE, action_info, data_set_bc, data_set_reloc)) + + check(set_options(action_info, b"")) + check(comgr.amd_comgr_do_action(comgr.AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_EXECUTABLE, action_info, data_set_reloc, data_set_exec)) + ret = _get_comgr_data(data_set_exec, comgr.AMD_COMGR_DATA_KIND_EXECUTABLE) + check(comgr.amd_comgr_release_data(data_src)) + for x in [data_set_src, data_set_bc, data_set_reloc, data_set_exec]: check(comgr.amd_comgr_destroy_data_set(x)) + check(comgr.amd_comgr_destroy_action_info(action_info)) + return ret + +class HIPCompiler(Compiler): + def __init__(self, arch:str): + assert comgr.dll.nm in c.DLL._loaded_, f"comgr not available: {comgr.dll.emsg}" + self.arch = arch + super().__init__(f"compile_hip_{self.arch}") + def compile(self, src:str) -> bytes: + try: return compile_hip(src, self.arch, src.split('\n', 1)[0].strip() == '.text') + except RuntimeError as e: raise CompileError(e) from e + def disassemble(self, lib:bytes): amdgpu_disassemble(lib) + +class HIPCCCompiler(Compiler): + def __init__(self, arch:str, extra_options:list[str]=[]): + self.arch, self.extra_options, self.no_hipcc = arch, extra_options, getenv("NO_HIPCC") + super().__init__(f"compile_hipcc_{self.arch}_{hashlib.sha256(' '.join(extra_options).encode()).hexdigest()[:8]}"+ + ("_nohipcc" if self.no_hipcc else "")) + def compile(self, src:str) -> bytes: + if self.no_hipcc: return b"" + with tempfile.NamedTemporaryFile(suffix=".cpp") as srcf, tempfile.NamedTemporaryFile(suffix=".bc") as bcf: + with tempfile.NamedTemporaryFile(suffix=".hsaco") as libf: + srcf.write(src.encode()) + srcf.flush() + + rocm_path = getenv("ROCM_PATH", "/opt/rocm") + subprocess.run(["hipcc", "-c", "-emit-llvm", "--cuda-device-only", "-O3", "-mcumode", + f"--offload-arch={self.arch}", f"-I{rocm_path}/include/hip", "-o", bcf.name, srcf.name] + self.extra_options, check=True) + subprocess.run(["hipcc", "-target", "amdgcn-amd-amdhsa", f"-mcpu={self.arch}", + "-O3", "-mllvm", "-amdgpu-internalize-symbols", "-c", "-o", libf.name, bcf.name] + self.extra_options, check=True) + + return pathlib.Path(libf.name).read_bytes() + def disassemble(self, lib:bytes): amdgpu_disassemble(lib) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/compiler_cpu.py b/artifacts/package_runtime/tinygrad/runtime/support/compiler_cpu.py new file mode 100644 index 000000000..ae6dd07bf --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/compiler_cpu.py @@ -0,0 +1,39 @@ +import signal, subprocess, sys +from tinygrad.device import Compiler +from tinygrad.helpers import getenv, capstone_flatdump +from tinygrad.runtime.support.elf import jit_loader + +def _block_sigusr2(): + # msgq notifies readers via pthread_kill(SIGUSR2) by cached TID; a recycled TID can land + # the signal on this clang child and kill the compile mid-run (openpilot modeld crash) + if sys.platform == "linux": signal.pthread_sigmask(signal.SIG_BLOCK, {signal.SIGUSR2}) + +class ClangCompiler(Compiler): + def __init__(self, arch:list[str], cachekey="compile_clang_jit"): + assert len(arch) >= 2, f"invalid arch string: {','.join(arch)!r}, expected ',,[]' (eg. 'x86_64,znver2')" + self.arch, cpu, *feats = arch + match self.arch: + case "x86_64": self.args = [f"-march={cpu}"] + [f"-mno{f}" if f.startswith("-") else f"-m{f}" for f in feats] + # on arm march means "runs on this arch and superset" instead of "optimize for this arch". x86 march == arm mcpu + # x18 is a reserved platform register. It is clobbered on context switch in macos and is used to store TEB pointer in windows on arm + case "arm64": self.args = ["-ffixed-x18", "-mcpu=" + "+".join([cpu] + ["no"+f[1:] if f.startswith("-") else f for f in feats])] + case "riscv64": self.args = ["-march=" + "_".join(["rv64g" if cpu == "native" else cpu] + feats)] + case _: raise RuntimeError(f"unsupported arch: {self.arch!r}") + super().__init__(f"{cachekey}_{'_'.join(arch)}") + + def compile_to_obj(self, src:str) -> bytes: + """Compile C source to ELF object file (before linking).""" + # -fno-math-errno is required for __builtin_sqrt to become an instruction instead of a function call + return subprocess.check_output([getenv("CC", 'clang'), '-c', '-x', 'c', '-O2', '-fPIC', '-ffreestanding', '-fno-math-errno', '-nostdlib', + '-fno-ident', f'--target={self.arch}-none-unknown-elf', *self.args, '-', '-o', '-'], input=src.encode('utf-8'), + preexec_fn=_block_sigusr2 if sys.platform == "linux" else None) + + def compile(self, src:str) -> bytes: return jit_loader(self.compile_to_obj(src)) + + def disassemble(self, lib:bytes): return capstone_flatdump(lib, self.arch) + + +class X86Compiler(Compiler): + def __init__(self): super().__init__(None) + def compile(self, src:str) -> bytes: return bytes.fromhex(src) + def disassemble(self, lib:bytes): return capstone_flatdump(lib, "x86_64") diff --git a/artifacts/package_runtime/tinygrad/runtime/support/compiler_cuda.py b/artifacts/package_runtime/tinygrad/runtime/support/compiler_cuda.py new file mode 100644 index 000000000..1ba245a9c --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/compiler_cuda.py @@ -0,0 +1,92 @@ +import hashlib, tempfile, ctypes, re, pathlib +from tinygrad.helpers import to_char_p_p, colored, getenv, system +from tinygrad.runtime.support.c import init_c_var +from tinygrad.runtime.autogen import nvrtc, nvjitlink as jitlink +from tinygrad.device import Compiler, CompileError + +CUDA_PATH = getenv("CUDA_PATH", "") + +def _get_bytes(arg, get_str, get_sz, check) -> bytes: + x = ctypes.create_string_buffer(init_c_var(ctypes.c_size_t, lambda x: check(get_sz(arg, ctypes.byref(x)))).value) + check(get_str(arg, x)) + return ctypes.string_at(x, size=len(x)) + +def nvrtc_check(status, ctx=None): + if status != 0: + err_log = _get_bytes(ctx, nvrtc.nvrtcGetProgramLog, nvrtc.nvrtcGetProgramLogSize, lambda _: None).decode() if ctx else "" + raise CompileError(f"Nvrtc Error {status}, {ctypes.string_at(nvrtc.nvrtcGetErrorString(status)).decode()}\n{err_log}") + +def jitlink_check(status, ctx=None): + if status != 0: + err_log = _get_bytes(ctx, jitlink.nvJitLinkGetErrorLog, jitlink.nvJitLinkGetErrorLogSize, lambda _: None).decode() if ctx else "" + raise CompileError(f"jitlink Error {status}, {jitlink.nvJitLinkResult.get(status)}\n{err_log}") + +def pretty_ptx(s): + # all expressions match `` and replace it with `color()` + s = re.sub(r'([!@<\[\s,\+\-;\n])((?:[_%$][\w%\$_]+(?:\.[xyz])?\:?)|(?:buf\d+))([<>\]\s,\+\-;\n\)])', + lambda m:m[1]+colored(m[2], "blue")+m[3], s, flags=re.M) # identifiers + s = re.sub(r'(.)((?:b|s|u|f)(?:8|16|32|64)|pred)([\.\s])', lambda m:m[1]+colored(m[2], "green")+m[3], s, flags=re.M) # types + s = re.sub(r'^(\s*)([\w]+)(.*?;$)', lambda m:m[1]+colored(m[2], "yellow")+m[3], s, flags=re.M) # instructions + s = re.sub(r'([<>\[\]\s,\+\-;])((?:0[fF][0-9a-fA-F]{8})|(?:[0-9]+)|(?:0[xX][0-9a-fA-F]+))([<>\[\]\s,\+\-;])', + lambda m:m[1]+colored(m[2], "yellow")+m[3], s, flags=re.M) # numbers + s = re.sub(r'(\.)(param|reg|global)', lambda m:m[1]+colored(m[2], "magenta"), s, flags=re.M) # space + s = re.sub(r'(\.)(version|target|address_size|visible|entry)', lambda m:m[1]+colored(m[2], "magenta"), s, flags=re.M) # derivatives + return s + +def cuda_disassemble(lib:bytes, arch:str, ptx=False): + try: + fn = (pathlib.Path(tempfile.gettempdir()) / f"tinycuda_{hashlib.md5(lib).hexdigest()}").as_posix() + with open(fn, "wb") as f: f.write(lib.rstrip(b'\x00') if ptx else lib) + if ptx: system(f"ptxas -arch={arch} -o {fn} {fn}") + print(system(f'nvdisasm {fn}')) + except Exception as e: print("Failed to generate SASS", str(e), "Make sure your PATH contains ptxas/nvdisasm binary of compatible version.") + +class NVRTCCompiler(Compiler): + def __init__(self, arch:str, ptx=True, cache_key:str="cuda"): + self.ptx, self.arch, self.compile_options = ptx, arch, [f'--gpu-architecture={arch}'] + self.compile_options += [f"-I{CUDA_PATH}/include"] if CUDA_PATH else ["-I/usr/local/cuda/include", "-I/usr/include", "-I/opt/cuda/include"] + nvrtc_check(nvrtc.nvrtcVersion((nvrtcMajor := ctypes.c_int()), (nvrtcMinor := ctypes.c_int()))) + if (nvrtcMajor.value, nvrtcMinor.value) >= (12, 4): self.compile_options.append("--minimal") + super().__init__(f"compile_{cache_key}_{self.arch}") + def compile(self, src:str) -> bytes: + nvrtc_check(nvrtc.nvrtcCreateProgram(ctypes.byref(prog := nvrtc.nvrtcProgram()), src.encode(), "".encode(), 0, None, None)) + nvrtc_check(nvrtc.nvrtcCompileProgram(prog, len(self.compile_options), to_char_p_p([o.encode() for o in self.compile_options])), prog) + data = _get_bytes(prog, nvrtc.nvrtcGetPTX if self.ptx else nvrtc.nvrtcGetCUBIN, + nvrtc.nvrtcGetPTXSize if self.ptx else nvrtc.nvrtcGetCUBINSize, nvrtc_check) + nvrtc_check(nvrtc.nvrtcDestroyProgram(ctypes.byref(prog))) + return data + def disassemble(self, lib:bytes): cuda_disassemble(lib, self.arch, ptx=self.ptx) + +class NVCCCompiler(Compiler): + def __init__(self, arch:str, ptx:bool=True, cache_key:str="cuda", extra_options:list[str]=[]): + self.ptx, self.arch, self.extra_options = ptx, arch, extra_options + super().__init__(f"compile_nvcc_{cache_key+'ptx' if ptx else ''}_{self.arch}_{hashlib.sha256(' '.join(extra_options).encode()).hexdigest()[:8]}") + def compile(self, src:str) -> bytes: + mode, suffix = ("-ptx", ".ptx") if self.ptx else ("-cubin", ".cubin") + with tempfile.NamedTemporaryFile(suffix=".cu") as srcf, tempfile.NamedTemporaryFile(suffix=suffix) as libf: + srcf.write(src.encode()) + srcf.flush() + system(f"nvcc -arch={self.arch} {mode} -o {libf.name} {srcf.name} " + ' '.join(self.extra_options)) + return libf.read() + def disassemble(self, lib:bytes): cuda_disassemble(lib, self.arch, ptx=self.ptx) + +class PTXCompiler(Compiler): + def __init__(self, arch:str, cache_key="ptx"): + self.arch = arch + super().__init__(f"compile_{cache_key}_{self.arch}") + def compile(self, src:str) -> bytes: + return src.replace("TARGET", self.arch).replace("VERSION", "8.7" if (ver:=int(self.arch[3:]))>=120 else ("7.8" if ver>=89 else "7.5")).encode() + def disassemble(self, lib:bytes): cuda_disassemble(lib, self.arch, ptx=True) + +class NVPTXCompiler(PTXCompiler): + def __init__(self, arch:str): + jitlink_check(jitlink.nvJitLinkVersion(ctypes.byref(ctypes.c_uint()), ctypes.byref(ctypes.c_uint()))) + super().__init__(arch, cache_key="nv_ptx") + def compile(self, src:str) -> bytes: + jitlink_check(jitlink.nvJitLinkCreate(handle := jitlink.nvJitLinkHandle(), 1, to_char_p_p([f'-arch={self.arch}'.encode()])), handle) + jitlink_check(jitlink.nvJitLinkAddData(handle, jitlink.NVJITLINK_INPUT_PTX, ptxsrc:=super().compile(src), len(ptxsrc), "".encode()), handle) + jitlink_check(jitlink.nvJitLinkComplete(handle), handle) + data = _get_bytes(handle, jitlink.nvJitLinkGetLinkedCubin, jitlink.nvJitLinkGetLinkedCubinSize, jitlink_check) + jitlink_check(jitlink.nvJitLinkDestroy(handle)) + return data + def disassemble(self, lib:bytes): cuda_disassemble(lib, self.arch) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/compiler_llvm.py b/artifacts/package_runtime/tinygrad/runtime/support/compiler_llvm.py new file mode 100644 index 000000000..be012441a --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/compiler_llvm.py @@ -0,0 +1,94 @@ +import ctypes +from tinygrad.device import Compiler, CompileError +from tinygrad.helpers import getenv, capstone_flatdump, amdgpu_disassemble, unwrap, DEBUG +from tinygrad.runtime.support.elf import jit_loader +from tinygrad.runtime.autogen import llvm + +def cerr(): return ctypes.pointer(ctypes.pointer(ctypes.c_char())) + +def expect(x, err, ret=None): + if x: raise RuntimeError(unwrap(ctypes.cast(err.contents, ctypes.c_char_p).value).decode() if not isinstance(err, str) else err) + return ret + +class LLVMCompiler(Compiler): + jit = True + def __init__(self, arch:str, processor:str, feats:str, cache_key=None): + for component in ['Target', 'TargetInfo', 'TargetMC', 'AsmParser', 'AsmPrinter']: + getattr(llvm, "LLVMInitialize" + {'arm64': 'AArch64', 'x86_64': 'X86', 'riscv64': 'riscv64'}.get(arch, "AMDGPU") + component)() + + triple = {'arm64': b'aarch64-none-unknown-elf', 'x86_64': b'x86_64-none-unknown-elf', 'AMDGPU': b'amdgcn-amd-amdhsa'}[arch] + target = expect(llvm.LLVMGetTargetFromTriple(triple, ctypes.pointer(tgt:=llvm.LLVMTargetRef()), err:=cerr()), err, tgt) + if DEBUG >= 3: print(f"LLVM init for {processor!r} with {feats!r}") + self.target_machine = llvm.LLVMCreateTargetMachine(target, triple, processor.encode(), feats.encode(), + llvm.LLVMCodeGenLevelDefault, llvm.LLVMRelocPIC, llvm.LLVMCodeModelDefault) + + self.pbo = llvm.LLVMCreatePassBuilderOptions() + if (opt:=bool(getenv("LLVMOPT", "1"))): + self.passes = b'default' + llvm.LLVMPassBuilderOptionsSetLoopUnrolling(self.pbo, True) + llvm.LLVMPassBuilderOptionsSetLoopVectorization(self.pbo, True) + llvm.LLVMPassBuilderOptionsSetSLPVectorization(self.pbo, True) + llvm.LLVMPassBuilderOptionsSetVerifyEach(self.pbo, True) + else: + self.passes = b'default' + + # Create a per-instance context instead of using the global context to avoid shared state between parallel test processes + self.context = llvm.LLVMContextCreate() + self.diag_msgs: list[str] = [] + @llvm.LLVMDiagnosticHandler + def handle_diag(diag_ref, _arg): + severity = llvm.LLVMGetDiagInfoSeverity(diag_ref) + msg = ctypes.string_at(llvm.LLVMGetDiagInfoDescription(diag_ref)).decode() + if severity == llvm.LLVMDSError: + self.diag_msgs.append(msg) + self.handle_diag = handle_diag + llvm.LLVMContextSetDiagnosticHandler(self.context, handle_diag, None) + super().__init__(cache_key or f"compile_llvm_{processor}_{feats}{'_jit' if self.jit else ''}{'_opt' if opt else ''}") + + def __del__(self): + if hasattr(self, 'pbo'): llvm.LLVMDisposePassBuilderOptions(self.pbo) + if hasattr(self, 'context'): llvm.LLVMContextDispose(self.context) + + def compile_to_obj(self, src:str) -> bytes: + self.diag_msgs.clear() + src_buf = llvm.LLVMCreateMemoryBufferWithMemoryRangeCopy(ctypes.create_string_buffer(src_bytes:=src.encode()), len(src_bytes), b'src') + mod = expect(llvm.LLVMParseIRInContext(self.context, src_buf, ctypes.pointer(m:=llvm.LLVMModuleRef()), err:=cerr()), err, m) + expect(llvm.LLVMVerifyModule(mod, llvm.LLVMReturnStatusAction, err:=cerr()), err) + expect(llvm.LLVMRunPasses(mod, self.passes, self.target_machine, self.pbo), 'failed to run passes') + if DEBUG >= 7: print(ctypes.string_at(llvm.LLVMPrintModuleToString(mod)).decode()) + obj_buf = expect(llvm.LLVMTargetMachineEmitToMemoryBuffer(self.target_machine, mod, llvm.LLVMObjectFile, err:=cerr(), + buf:=llvm.LLVMMemoryBufferRef()), err, buf) + llvm.LLVMDisposeModule(mod) + obj = ctypes.string_at(llvm.LLVMGetBufferStart(obj_buf), llvm.LLVMGetBufferSize(obj_buf)) + llvm.LLVMDisposeMemoryBuffer(obj_buf) + if self.diag_msgs: raise RuntimeError("llvm diagnostic: " + "\n".join(self.diag_msgs)) + return obj + + def compile(self, src:str) -> bytes: return jit_loader(self.compile_to_obj(src)) if self.jit else self.compile_to_obj(src) + + +class CPULLVMCompiler(LLVMCompiler): + def __init__(self, arch:list[str], cache_key=None): + assert len(arch) >= 2, f"invalid arch string: {','.join(arch)!r}, expected ',,[]' (eg. 'x86_64,znver2')" + self.arch, cpu, *feats = arch + featstr = ','.join(f if f.startswith('-') else '+'+f for f in feats) + if cpu == "native": + cpu = ctypes.string_at(llvm.LLVMGetHostCPUName()).decode() + featstr = (featstr + "," if featstr else "") + ctypes.string_at(llvm.LLVMGetHostCPUFeatures()).decode() + # +reserve-x18 here does the same thing as -ffixed-x18 in ClangCompiler, see comments there for why it's needed on arm osx + super().__init__(self.arch, cpu, ('+reserve-x18,' if self.arch == "arm64" else '') + featstr, cache_key) + + def disassemble(self, lib:bytes): capstone_flatdump(lib, self.arch) + +class AMDLLVMCompiler(LLVMCompiler): + jit = False + def __init__(self, arch: str): + self.arch = arch + super().__init__("AMDGPU", self.arch, "+cumode") + def __reduce__(self): return (AMDLLVMCompiler, (self.arch,)) + def compile(self, src:str) -> bytes: + try: return super().compile(src) + except RuntimeError as e: + if "undefined value '@llvm.amdgcn." in str(e): raise CompileError(str(e) + "AMD with LLVM backend requires LLVM >= 18") from e + raise CompileError(e) from e + def disassemble(self, lib:bytes): amdgpu_disassemble(lib) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/compiler_mesa.py b/artifacts/package_runtime/tinygrad/runtime/support/compiler_mesa.py new file mode 100644 index 000000000..b5e7945cf --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/compiler_mesa.py @@ -0,0 +1,133 @@ +import base64, ctypes, pathlib, tempfile, hashlib +from tinygrad.device import Compiler +from tinygrad.helpers import cpu_objdump, system, data64 +from tinygrad.runtime.autogen import mesa, llvm, libc +from tinygrad.runtime.support.compiler_llvm import CPULLVMCompiler, expect, cerr + +# NB: compilers assume mesa's glsl type cache is managed externally with mesa.glsl_type_singleton_init_or_ref() and mesa.glsl_type_singleton_decref() + +def rzalloc(typ, ctx=None, **kwargs): + s = ctypes.cast(mesa.rzalloc_size(ctypes.cast(ctx, ctypes.c_void_p), ctypes.sizeof(typ)), ctypes.POINTER(typ)) + for k,v in kwargs.items(): setattr(s.contents, k, v) + return s + +def deserialize(enc_src, opts): + blobreader = mesa.struct_blob_reader() + mesa.blob_reader_init(blobreader, src:=base64.b64decode(enc_src), len(src)) + return mesa.nir_deserialize(None, ctypes.cast(opts, ctypes.POINTER(mesa.nir_shader_compiler_options)), blobreader) + +class LVPCompiler(CPULLVMCompiler): + def __init__(self, arch): CPULLVMCompiler.__init__(self, arch.split(","), cache_key="compile_lvp") + + def compile(self, src) -> bytes: + shader, ctx = deserialize(src, mesa.lvp_nir_options), llvm.LLVMGetGlobalContext() + gallivm = mesa.gallivm_create(None, mesa.lp_context_ref(ctypes.cast(ctx, ctypes.POINTER(mesa.struct_LLVMOpaqueContext)), True), None).contents + module, builder = ctypes.cast(gallivm.module, llvm.LLVMModuleRef), ctypes.cast(gallivm.builder, llvm.LLVMBuilderRef) + + params = mesa.struct_lp_build_tgsi_params(mesa.struct_lp_type(floating=True, sign=True, width=32, length=4), + resources_type=mesa.lp_build_jit_resources_type(gallivm), mask=ctypes.pointer(mesa.struct_lp_build_mask_context())) + + pt = llvm.LLVMPointerType(ctypes.cast(params.resources_type, llvm.LLVMTypeRef), 0) + fn = llvm.LLVMAddFunction(module, shader.contents.info.name, llvm.LLVMFunctionType(llvm.LLVMVoidTypeInContext(ctx), pt, 1, 0)) + llvm.LLVMPositionBuilderAtEnd(builder, llvm.LLVMAppendBasicBlockInContext(ctx, fn, b"entry")) + + params.consts_ptr = mesa.lp_build_struct_get_ptr2(gallivm, params.resources_type, + ctypes.cast(llvm.LLVMGetParam(fn, 0), mesa.LLVMValueRef), mesa.LP_JIT_RES_CONSTANTS, b"constants") + mesa.lp_build_mask_begin(params.mask, gallivm, params.type, mesa.lp_build_one(gallivm, params.type)) + mesa.lp_build_mask_end(params.mask) + + mesa.lp_build_nir_soa(gallivm, shader, params, None) + llvm.LLVMBuildRetVoid(builder) + mesa.gallivm_verify_function(gallivm, ctypes.cast(fn, mesa.LLVMValueRef)) + mesa.lp_passmgr_run(gallivm.passmgr, gallivm.module, ctypes.cast(self.target_machine, mesa.LLVMTargetMachineRef), gallivm.module_name) + obj_buf = expect(llvm.LLVMTargetMachineEmitToMemoryBuffer(self.target_machine, module, llvm.LLVMObjectFile, err:=cerr(), + ctypes.pointer(buf:=llvm.LLVMMemoryBufferRef())), err, buf) + obj = ctypes.string_at(llvm.LLVMGetBufferStart(obj_buf), llvm.LLVMGetBufferSize(obj_buf)) + + mesa.gallivm_destroy(gallivm) + mesa.ralloc_free(shader) + return obj + + def disassemble(self, lib: bytes): cpu_objdump(lib) + +class NAKCompiler(Compiler): + # simplified from https://elixir.bootlin.com/mesa/mesa-26.0.3/source/src/nouveau/winsys/nouveau_device.c#L118 + @staticmethod + def warps_per_sm(arch): return 48 if arch in ("sm_86", "sm_87", "sm_89", "sm_120") else 64 + def __init__(self, arch): + self.arch = arch + self.cc = mesa.nak_compiler_create(mesa.struct_nv_device_info(sm=int(arch[3:]), max_warps_per_mp=self.warps_per_sm(arch))) + self.nir_options = bytes(mesa.nak_nir_options(self.cc).contents) + super().__init__(f"compile_nak_{arch}") + + def __del__(self): mesa.nak_compiler_destroy(self.cc) + + def __reduce__(self): return NAKCompiler, (self.arch,) + + def compile(self, src) -> bytes: + shader = deserialize(src, self.nir_options) + mesa.nak_preprocess_nir(shader, self.cc) + ret = bytes((out:=mesa.nak_compile_shader(shader, False, self.cc, 0, None).contents).info) + ctypes.string_at(out.code, out.code_size) + mesa.nak_shader_bin_destroy(out) + mesa.ralloc_free(shader) + return ret + + def disassemble(self, lib: bytes): + try: + fn = (pathlib.Path(tempfile.gettempdir()) / f"tinynak_{hashlib.md5(lib).hexdigest()}").as_posix() + with open(fn, "wb") as f: f.write(lib[ctypes.sizeof(mesa.struct_nak_shader_info):]) + print(system(f"nvdisasm -b SM{self.arch[3:]} {fn}")) + except Exception as e: print("Failed to generate SASS", str(e), "Make sure your PATH contains nvdisasm binary of compatible version.") + +def disas_adreno(lib:bytes, gpu_id=630): + with tempfile.TemporaryFile('w+') as tf: + mesa_fp = ctypes.cast(fp:=libc.fdopen(tf.fileno(), b"w"), ctypes.POINTER(mesa.struct__IO_FILE)) + @ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_uint32, ctypes.c_void_p) + def hd(data, n, instr): + fst, snd = data64(ctypes.cast(instr, ctypes.POINTER(ctypes.c_uint64)).contents.value) + # print with libc so that output interleaves properly + libc.fputs(f"{n:04} [{fst:08x}_{snd:08x}] ".encode(), fp) + + mesa.ir3_isa_disasm(lib, len(lib), mesa_fp, mesa.struct_isa_decode_options(gpu_id, True, 0, True, pre_instr_cb=hd)) + libc.fflush(fp) + tf.seek(0) + print(tf.read()) + +class IR3Compiler(Compiler): + def __init__(self, arch): + assert arch.split(',')[0] == "a630", "only a630 supported, for now" + self.arch, self.dev_id = arch, mesa.struct_fd_dev_id(630, 0x6030001) + self.cc = mesa.ir3_compiler_create(None, self.dev_id, mesa.fd_dev_info(self.dev_id), + mesa.struct_ir3_compiler_options(disable_cache=True)).contents + self.cc.has_preamble = False + self.nir_options = bytes(mesa.ir3_get_compiler_options(self.cc).contents) + super().__init__(f"compile_ir3_{arch}") + + def __del__(self): mesa.ir3_compiler_destroy(self.cc) + + def __reduce__(self): return IR3Compiler, (self.arch,) + + # ir3_shader_variant info: https://elixir.bootlin.com/mesa/mesa-25.3.0/source/src/freedreno/ir3/ir3_shader.c#L1099 + def compile(self, src) -> bytes: + nir_shader = deserialize(src, self.nir_options) + mesa.ir3_nir_lower_io_vars_to_temporaries(nir_shader) + mesa.ir3_finalize_nir(self.cc, mesa.struct_ir3_shader_nir_options(), nir_shader) + shader = rzalloc(mesa.struct_ir3_shader, compiler=ctypes.pointer(self.cc), type=mesa.MESA_SHADER_COMPUTE, nir=nir_shader).contents + mesa.ir3_nir_post_finalize(shader) + v = rzalloc(mesa.struct_ir3_shader_variant, type=shader.type, compiler=ctypes.pointer(self.cc), key=mesa.struct_ir3_shader_key()).contents + v.const_state, shader.variants, shader.variant_count = rzalloc(mesa.struct_ir3_const_state, ctypes.pointer(v)), ctypes.pointer(v), 1 + v.num_uavs = (info:=nir_shader.contents.info).num_ssbos + info.num_images + assert not mesa.ir3_compile_shader_nir(self.cc, shader, v), "compilation failed" + lib = ctypes.cast(mesa.ir3_shader_assemble(v), ctypes.POINTER(ctypes.c_uint32)) + # NB: bytes(v) means the pointers in v are no longer safe! a custom __reduce__ that supports pointers for c.Struct would make this simpler + ret = bytes(v) + bytes(v.const_state.contents) + ctypes.string_at(v.imm_state.values, v.imm_state.count * 4) + ctypes.string_at(lib, v.info.size) + mesa.ralloc_free(ctypes.pointer(v)) + return ret + + @staticmethod + def unpack_lib(lib: bytes) -> tuple[mesa.struct_ir3_shader_variant, mesa.struct_ir3_const_state, bytes, bytes]: + shifted = lib[ctypes.sizeof(v:=mesa.struct_ir3_shader_variant.from_buffer_copy(lib)):] + shifted = shifted[ctypes.sizeof(cs:=mesa.struct_ir3_const_state.from_buffer_copy(shifted)):] + return v, cs, shifted[:v.imm_state.count * 4], shifted[v.imm_state.count * 4:] + + def disassemble(self, lib: bytes): disas_adreno(self.unpack_lib(lib)[3], self.dev_id.gpu_id) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/compiler_qcom.py b/artifacts/package_runtime/tinygrad/runtime/support/compiler_qcom.py new file mode 100644 index 000000000..ceb8f270b --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/compiler_qcom.py @@ -0,0 +1,38 @@ +import ctypes, struct +from tinygrad.device import Compiler +from tinygrad.helpers import DEBUG, system +from tinygrad.runtime.support.compiler_mesa import disas_adreno +# see https://github.com/sirhcm/tinydreno +from tinygrad.runtime.autogen import llvm_qcom + +def _read_lib(lib, off) -> int: return struct.unpack("I", lib[off:off+4])[0] + +class QCOMCompiler(Compiler): + def __init__(self, arch:str): + assert arch.split(',')[0] == "a630", "only a630 supported" + self.arch, self.chip_id, self.llvm_inst = arch, 0x6030001, llvm_qcom.cl_compiler_create_llvm_instance() + super().__init__(f"compile_qcomcl_{arch}") + + def __del__(self): llvm_qcom.cl_compiler_destroy_llvm_instance(self.llvm_inst) + + def __reduce__(self): return QCOMCompiler, (self.arch,) + + def checked(self, handle): + if not handle or (data:=(hc.executable if (hc:=handle.contents).type == llvm_qcom.CL_HANDLE_LINKED else hc.compiled).contents).error_code != 0: + llvm_qcom.cl_compiler_destroy_llvm_instance(self.llvm_inst) + self.llvm_inst = llvm_qcom.cl_compiler_create_llvm_instance() + raise RuntimeError("QCOM Compilation Error" + ("" if not handle else f": {ctypes.string_at(data.build_log).decode()}")) + return handle + + def compile(self, src) -> bytes: + ch = self.checked(llvm_qcom.cl_compiler_compile_source(self.llvm_inst, self.chip_id, llvm_qcom.CL_MODE_64BIT, b"", 0, 0, 0, src.encode(), 0, + llvm_qcom.CL_SRC_STR, None)) + if DEBUG >= 8: print(system("llvm-dis", input=ctypes.string_at((comp:=ch.contents.compiled.contents).llvm_bitcode, comp.llvm_bitcode_size))) + lh = self.checked(llvm_qcom.cl_compiler_link_program(self.llvm_inst, self.chip_id, llvm_qcom.CL_MODE_64BIT, None, 1, ch)) + llvm_qcom.cl_compiler_handle_create_binary(lh, ctypes.byref(ptr:=ctypes.c_void_p()), ctypes.byref(sz:=ctypes.c_size_t())) + for h in [ch, lh]: llvm_qcom.cl_compiler_free_handle(h) + ret = ctypes.string_at(ptr, sz.value) + llvm_qcom.cl_compiler_free_assembly(ptr) + return ret + + def disassemble(self, lib: bytes): disas_adreno(lib[(ofs:=_read_lib(lib, 0xc0)):ofs+_read_lib(lib, 0x100)], self.chip_id) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/elf.py b/artifacts/package_runtime/tinygrad/runtime/support/elf.py new file mode 100644 index 000000000..41917b2cb --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/elf.py @@ -0,0 +1,82 @@ +import struct, ctypes, ctypes.util +from dataclasses import dataclass +from tinygrad.helpers import getbits, i2u, unwrap +from tinygrad.runtime.autogen import libc + +@dataclass(frozen=True) +class ElfSection: name:str; header:libc.Elf64_Shdr|libc.Elf32_Shdr; content:bytes # noqa: E702 + +def link_sym(sym:str, libs:list[str]) -> int: + for lib in libs: + try: return unwrap(ctypes.cast(getattr(ctypes.CDLL(ctypes.util.find_library(lib)), sym), ctypes.c_void_p).value) + except (OSError, AttributeError): pass + raise RuntimeError(f'Attempting to relocate against an undefined symbol {sym}') + +def elf_loader(blob:bytes, force_section_align:int=1, link_libs:list[str]|None=None) -> tuple[memoryview, list[ElfSection], list[tuple]]: + assert blob[:4] == libc.ELFMAG.encode(), "blob is not an ELF, missing magic bytes" + ecls = {libc.ELFCLASS32: "Elf32", libc.ELFCLASS64: "Elf64"}[blob[libc.EI_CLASS]] + + def _strtab(blob: bytes, idx: int) -> str: return blob[idx:blob.find(b'\x00', idx)].decode('utf-8') + + header = getattr(libc, f"{ecls}_Ehdr").from_buffer_copy(blob) + section_headers = (getattr(libc, f"{ecls}_Shdr") * header.e_shnum).from_buffer_copy(blob[header.e_shoff:]) + sh_strtab = blob[(shstrst:=section_headers[header.e_shstrndx].sh_offset):shstrst+section_headers[header.e_shstrndx].sh_size] + sections = [ElfSection(_strtab(sh_strtab, sh.sh_name), sh, blob[sh.sh_offset:sh.sh_offset+sh.sh_size]) for sh in section_headers] + + def _to_carray(sh, ctype): return (ctype * (sh.header.sh_size // sh.header.sh_entsize)).from_buffer_copy(sh.content) + rel = [(sh, sh.name[4:], _to_carray(sh, getattr(libc, f"{ecls}_Rel"))) for sh in sections if sh.header.sh_type == libc.SHT_REL] + rela = [(sh, sh.name[5:], _to_carray(sh, getattr(libc, f"{ecls}_Rela"))) for sh in sections if sh.header.sh_type == libc.SHT_RELA] + symtab = next((_to_carray(sh, getattr(libc, f"{ecls}_Sym")) for sh in sections if sh.header.sh_type == libc.SHT_SYMTAB), None) + progbits = [sh for sh in sections if sh.header.sh_type == libc.SHT_PROGBITS] + + # Prealloc image for all fixed addresses. + image = bytearray(max([sh.header.sh_addr + sh.header.sh_size for sh in progbits if sh.header.sh_addr != 0] + [0])) + for sh in progbits: + if sh.header.sh_addr != 0: image[sh.header.sh_addr:sh.header.sh_addr+sh.header.sh_size] = sh.content + else: + image += b'\0' * (((align:=max(sh.header.sh_addralign, force_section_align)) - len(image) % align) % align) + sh.content + sh.header.sh_addr = len(image) - len(sh.content) + + # Relocations + relocs = [] + for sh, trgt_sh_name, c_rels in rel + rela: + if trgt_sh_name == ".eh_frame": continue + target_image_off = next(tsh for tsh in sections if tsh.name == trgt_sh_name).header.sh_addr + rels = [(r.r_offset, unwrap(symtab)[getattr(libc, f"{ecls.upper()}_R_SYM")(r.r_info)], getattr(libc, f"{ecls.upper()}_R_TYPE")(r.r_info), + getattr(r, "r_addend", 0)) for r in c_rels] + relocs += [(target_image_off + roff, link_sym(_strtab(sh_strtab, sym.st_name), link_libs or []) if sym.st_shndx == 0 else + sections[sym.st_shndx].header.sh_addr + sym.st_value, rtype, raddend) for roff, sym, rtype, raddend in rels] + + return memoryview(image), sections, relocs + +def jit_loader(obj: bytes, base:int=0, link_libs:list[str]|None=None) -> bytes: + image_, _, relocs = elf_loader(obj, link_libs=link_libs) + image = bytearray(image_) + + def relocate(instr: int, base: int, ploc: int, tgt: int, r_type: int): + match r_type: + # https://refspecs.linuxfoundation.org/elf/x86_64-abi-0.95.pdf + case libc.R_X86_64_PC32: return i2u(32, tgt-ploc) + case libc.R_X86_64_PLT32: return i2u(32, tgt-ploc-base) + # https://github.com/ARM-software/abi-aa/blob/main/aaelf64/aaelf64.rst for definitions of relocations + # https://www.scs.stanford.edu/~zyedidia/arm64/index.html for instruction encodings + case libc.R_AARCH64_ADR_PREL_PG_HI21: + rel_pg = (tgt & ~0xFFF) - (ploc & ~0xFFF) + return instr | (getbits(rel_pg, 12, 13) << 29) | (getbits(rel_pg, 14, 32) << 5) + case libc.R_AARCH64_ADD_ABS_LO12_NC: return instr | (getbits(tgt, 0, 11) << 10) + case libc.R_AARCH64_LDST16_ABS_LO12_NC: return instr | (getbits(tgt, 1, 11) << 10) + case libc.R_AARCH64_LDST32_ABS_LO12_NC: return instr | (getbits(tgt, 2, 11) << 10) + case libc.R_AARCH64_LDST64_ABS_LO12_NC: return instr | (getbits(tgt, 3, 11) << 10) + case libc.R_AARCH64_LDST128_ABS_LO12_NC: return instr | (getbits(tgt, 4, 11) << 10) + case libc.R_AARCH64_CALL26: + if -(2**25) <= tgt-ploc-base and tgt-ploc-base <= (2**25 - 1) * 4: return instr | getbits(tgt-ploc-base, 2, 27) + nonlocal image + # create trampoline: LDR x17, 8 BR x17 + image += struct.pack(" MMIOInterface: + return MMIOInterface(self.addr+offset, (self.nbytes - offset) if size is None else size, fmt=fmt or self.fmt) + +class FileIOInterface: + """ + Hardware Abstraction Layer for HCQ devices. The class provides a unified interface for interacting with hardware devices. + """ + + def __init__(self, path:str="", flags:int=os.O_RDONLY, fd:int|None=None): + self.path:str = path + self.fd:int = fd or os.open(path, flags) + def __del__(self): + if hasattr(self, 'fd'): os.close(self.fd) + def ioctl(self, request, arg): return fcntl.ioctl(self.fd, request, arg) + def mmap(self, start, sz, prot, flags, offset): return FileIOInterface._mmap(start, sz, prot, flags, self.fd, offset) + def read(self, size=None, binary=False, offset=None): + if offset is not None: self.seek(offset) + with open(self.fd, "rb" if binary else "r", closefd=False) as file: return file.read(size) + def write(self, content, binary=False, offset=None): + if offset is not None: self.seek(offset) + with open(self.fd, "wb" if binary else "w", closefd=False) as file: file.write(content) + def listdir(self): return os.listdir(self.path) + def seek(self, offset): os.lseek(self.fd, offset, os.SEEK_SET) + @staticmethod + def _mmap(start, sz, prot, flags, fd, offset): + x = libc.mmap(start, sz, prot, flags, fd, offset) + if x == 0xffffffffffffffff: raise OSError(f"Failed to mmap {sz} bytes at {hex(start)}: {os.strerror(ctypes.get_errno())}") + return x + @staticmethod + def anon_mmap(start, sz, prot, flags, offset): return FileIOInterface._mmap(start, sz, prot, flags, -1, offset) + @staticmethod + def munmap(buf, sz): return libc.munmap(buf, sz) + @staticmethod + def exists(path): return os.path.exists(path) + @staticmethod + def readlink(path): return os.readlink(path) + @staticmethod + def eventfd(initval, flags=None): return FileIOInterface(fd=os.eventfd(initval, flags)) # type: ignore[attr-defined] + +if DEV.interface.startswith("MOCK"): from test.mockgpu.mockgpu import MockFileIOInterface as FileIOInterface # noqa: F401 # pylint: disable=unused-import + +# **************** for HCQ Compatible Devices **************** + +def hcq_filter_visible_devices(devs, device): + assert (v:=getenv("HCQ_VISIBLE_DEVICES", "")) == "", f"HCQ_VISIBLE_DEVICES={v} is deprecated, use DEV={DEV.target(device, indices=v)} instead" + if '-' in (idstr:=DEV.target(device).indices): ids = list(range(int(idstr.split('-')[0]), int(idstr.split('-')[1])+1)) + else: ids = [int(x) for x in idstr.split(',') if x.strip()] + assert all(x < len(devs) for x in ids), f"invalid visibility filter: {ids} ({pluralize('device', len(devs))} available)" + return [devs[x] for x in ids] if ids else devs + +SignalType = TypeVar('SignalType', bound='HCQSignal') +HCQDeviceType = TypeVar('HCQDeviceType', bound='HCQCompiled') +ProgramType = TypeVar('ProgramType', bound='HCQProgram') +ArgsStateType = TypeVar('ArgsStateType', bound='HCQArgsState') + +class HWQueue(Generic[SignalType, HCQDeviceType, ProgramType, ArgsStateType]): + """ + A base class for hardware command queues in the HCQ (Hardware Command Queue) API. + """ + + def __init__(self): + self._q:Any = [] + self.binded_device:HCQDeviceType|None = None + self.q_sints:list[tuple[int, int]] = [] + self.mv_sints:list[tuple[MMIOInterface, int, int, int|None]] = [] + self.syms:list[sint] = [] + self._prev_resolved_syms:list[int|None] = [] + + def _new_sym(self, sym:sint) -> int: + if sym not in self.syms: + self.syms.append(sym) + self._prev_resolved_syms.append(None) + return self.syms.index(sym) + + def q(self, *values): + """ + Enqueues values in the queue. + + Args: + values: The values to enqueue in the queue. + """ + + for v in values: + if isinstance(v, UOp): + self.q_sints.append((len(self._q), self._new_sym(v))) + self._q.append(0xbadc0ded) + else: self._q.append(v) + + # *** common commands *** + + def timestamp(self, signal:SignalType): + """ + Enqueues a timestamp command which records the current time in a signal after all previously enqueued commands are completed. + + Args: + signal: The signal to store the timestamp + """ + + def signal(self, signal:SignalType, value:sint): + """ + Enqueues a signal command which sets the signal to the given value, ensuring all previous operations are completed. + + Args: + signal: The signal to set + value: The value to set the signal to + """ + + def wait(self, signal:SignalType, value:sint): + """ + Enqueues a wait command which halts execution until the signal is greater than or equal to a specific value. + + Args: + signal: The signal to wait on + value: The value to wait for + """ + + # *** commands for compute queues *** + + def memory_barrier(self): + """ + Enqueues a memory barrier command to ensure memory coherence between agents. Only on compute queues. + """ + + def exec(self, prg:ProgramType, args_state:ArgsStateType, global_size:tuple[sint, ...], local_size:tuple[sint, ...]): + """ + Enqueues an execution command for a kernel program. Only on compute queues. + + Args: + prg: The program to execute + args_state: The args state to execute program with + global_size: The global work size + local_size: The local work size + """ + + def write(self, b:HCQBuffer, val:sint, b64:bool=False): + """ + Enqueues a command to write a value to a buffer address after all previously enqueued commands are completed. + + Args: + b: The buffer to write to + val: The value to write + b64: If True, write a 64-bit value; otherwise write 32-bit + """ + raise NotImplementedError("write not implemented") + + def poll_bit(self, b:HCQBuffer, val:sint, mask:int): + """ + Enqueues a poll command which halts execution until (mem[b] & mask) == val. + val must be 0 or mask (i.e. checks if masked bits are all clear or all set). + + Args: + b: The buffer to poll + val: The expected value after masking (0 or mask) + mask: The bit mask to test + """ + raise NotImplementedError("poll_bit not implemented") + + # *** commands for copy queues *** + + def copy(self, dest:HCQBuffer, src:HCQBuffer, copy_size:int): + """ + Enqueues a copy command to transfer data. Only on copy queues. + + Args: + dest: The destination buffer of the copy + src: The source buffer of the copy + copy_size: The size of data to copy + """ + + # *** submit and bind commands *** + + def bind(self, dev:HCQDeviceType): + """ + Associates the queue with a specific device for optimized execution. + + This optional method allows backend implementations to tailor the queue for efficient use on the given device. When implemented, it can eliminate + the need to copy queues into the device, thereby enhancing performance. + + Args: + dev: The target device for queue optimization. + + Note: + Implementing this method is optional but recommended for performance gains. + """ + + def bind_args_state(self, args_state:ArgsStateType): + for vals, mem, fmt in args_state.bind_data: self.bind_sints_to_mem(*vals, mem=mem, fmt=fmt) + + def bind_sints(self, *vals:sint, mem:MMIOInterface, struct_t:Type[ctypes.Structure], start_field:str, fmt, mask:int|None=None): + self.bind_sints_to_mem(*vals, mem=mem, fmt=fmt, mask=mask, offset=getattr(struct_t, start_field).offset) + + def bind_sints_to_mem(self, *vals:sint, mem:MMIOInterface, fmt, mask:int|None=None, offset:int=0): + mv = mem.view(offset=offset, size=len(vals)*8, fmt=fmt) + for i, val in enumerate(vals): + if isinstance(val, int): mv[i] = val if mask is None else ((mv[i] & ~mask) | val) + else: self.mv_sints.append((mv, i, self._new_sym(val), mask)) + + def _apply_var_vals(self, var_vals:dict[str, int]): + resolved_syms: list[int|None] = [sym_infer(sym, var_vals) for sym in self.syms] + + for off, sym_idx in self.q_sints: + if self._prev_resolved_syms[sym_idx] == resolved_syms[sym_idx]: continue + self._q[off] = resolved_syms[sym_idx] + + for mv, off, sym_idx, mask in self.mv_sints: + if self._prev_resolved_syms[sym_idx] == resolved_syms[sym_idx]: continue + mv[off] = resolved_syms[sym_idx] if mask is None else ((mv[off] & ~mask) | resolved_syms[sym_idx]) + + self._prev_resolved_syms = resolved_syms + + def submit(self, dev:HCQDeviceType, var_vals:dict[str, int]|None=None): + """ + Submits the command queue to a specific device for execution. + + Args: + dev: The device to submit the queue to + """ + + if var_vals is not None: self._apply_var_vals(var_vals) + self._submit(dev) + return self + def _submit(self, dev:HCQDeviceType): raise NotImplementedError("need _submit") + +class HCQSignal(Generic[HCQDeviceType]): + def __init__(self, base_buf:HCQBuffer, value:int=0, owner:HCQDeviceType|None=None, is_timeline:bool=False, timestamp_divider=1000, virt=False): + self.base_buf, self.owner, self.is_timeline = base_buf, owner, is_timeline + self.should_return = isinstance(self.base_buf.va_addr, int) and self.owner is not None and not virt + self.timestamp_divider:decimal.Decimal = decimal.Decimal(timestamp_divider) + if isinstance(self.base_buf.va_addr, int) and not virt: self.value = value + + def __del__(self): + if self.should_return: HCQCompiled.signal_pool[unwrap(self.owner).peer_group].append(self.base_buf) + + @property + def value_addr(self) -> sint: return self.base_buf.va_addr + + @property + def timestamp_addr(self) -> sint: return self.base_buf.va_addr + 8 + + @property + def value(self) -> int: return self.base_buf.cpu_view().view(0, 8, 'Q')[0] + + @value.setter + def value(self, new_value:int): self.base_buf.cpu_view().view(0, 8, 'Q')[0] = new_value + + @property + def timestamp(self) -> decimal.Decimal: + """ + Get the timestamp field of the signal. + + This property provides read-only access to the signal's timestamp. + + Returns: + The timestamp in microseconds. + """ + return self.base_buf.cpu_view().view(8, 8, 'Q')[0] / self.timestamp_divider + + def _sleep(self, time_spent_since_last_sleep_ms:int): + """ + Optional function which can implement sleep functionality for the signal. + Raises RuntimeError if a fault is detected. + """ + + def wait(self, value:int, timeout:int|None=None): + """ + Waits the signal is greater than or equal to a specific value. + + Args: + value: The value to wait for. + timeout: Maximum time to wait in milliseconds. Defaults to 30s. + """ + timeout = timeout or getenv("HCQDEV_WAIT_TIMEOUT_MS", 30000) + start_time = int(time.perf_counter() * 1000) + while (not_passed:=(prev_value:=self.value) < value) and (cur_time:=int(time.perf_counter() * 1000)) - start_time < timeout: + self._sleep(cur_time - start_time) + if self.value != prev_value: start_time = int(time.perf_counter() * 1000) # progress was made, reset timer + if not_passed and self.value < value: raise RuntimeError(f"Wait timeout: {timeout} ms! (the signal is not set to {value}, but {self.value})") + +@contextlib.contextmanager +def hcq_profile(dev:HCQCompiled, enabled, desc, queue_type:Callable[[], HWQueue]|None=None, queue:HWQueue|None=None, dev_suff:str|None=None): + st, en = (dev.new_signal(), dev.new_signal()) if enabled else (None, None) + assert queue is not None or queue_type is not None, "Either queue or queue_type must be provided" + + if enabled and queue is not None: queue.timestamp(st) + elif enabled and queue_type is not None: + queue_type().wait(dev.timeline_signal, dev.timeline_value - 1).timestamp(st).signal(dev.timeline_signal, dev.next_timeline()).submit(dev) + + try: yield (st, en) + finally: + if enabled and queue is not None: queue.timestamp(en) + elif enabled and queue_type is not None: + queue_type().wait(dev.timeline_signal, dev.timeline_value - 1).timestamp(en).signal(dev.timeline_signal, dev.next_timeline()).submit(dev) + + if enabled and PROFILE: dev.sig_prof_records.append((unwrap(st), unwrap(en), desc, f"{dev.device}:{dev_suff}" if dev_suff else dev.device)) + +class HCQArgsState(Generic[ProgramType]): + def __init__(self, buf:HCQBuffer, prg:ProgramType, bufs:tuple[HCQBuffer, ...], vals:tuple[sint|None, ...]=()): + self.buf, self.prg, self.bufs, self.vals = buf, prg, bufs, vals + self.bind_data:list[tuple[tuple[sint, ...], MMIOInterface, str]] = [] + + def bind_sints_to_buf(self, *vals:sint, buf:HCQBuffer, fmt, offset=0): self.bind_data.append((vals, buf.cpu_view().view(offset=offset), fmt)) + +class CLikeArgsState(HCQArgsState[ProgramType]): + def __init__(self, buf:HCQBuffer, prg:ProgramType, bufs:tuple[HCQBuffer, ...], vals:tuple[sint|None, ...]=(), prefix:list[int]|None=None): + super().__init__(buf, prg, bufs, vals=vals) + + if prefix is not None: self.buf.cpu_view().view(size=len(prefix) * 4, fmt='I')[:] = array.array('I', prefix) + + self.bind_sints_to_buf(*[b.va_addr for b in bufs], buf=self.buf, fmt='Q', offset=len(prefix or []) * 4) + for v,(val_offset,dt) in zip(vals, TinyELF.iter_sig(prg.signature[-len(vals):], len(bufs) * 8)): + assert v is not None + self.bind_sints_to_buf(v, buf=self.buf, fmt=dt.fmt, offset=len(prefix or []) * 4 + val_offset) + +class HCQProgram(Program[HCQDeviceType]): + def __init__(self, args_state_t:Type[HCQArgsState], dev:HCQDeviceType, obj:TinyELF, kernargs_alloc_size:int, base:int|None=None): + self.args_state_t, self.dev, self.name, self.signature, self.kernargs_alloc_size = args_state_t, dev, obj.name, obj.signature, kernargs_alloc_size + self.prof_prg_counter = next(self.dev.prof_prg_counter) + if PROFILE: Compiled.profile_events += [ProfileProgramEvent(dev.device, obj.name, obj.lib, base, self.prof_prg_counter)] + + @staticmethod + def _fini(dev, buf, spec): dev.allocator.free(buf, buf.size, spec) + + def fill_kernargs(self, bufs:tuple[HCQBuffer, ...], vals:tuple[int|None, ...]=(), kernargs:HCQBuffer|None=None) -> HCQArgsState: + """ + Fills arguments for the kernel, optionally allocating space from the device if `kernargs_ptr` is not provided. + Args: + bufs: Buffers to be written to kernel arguments. + vals: Values to be written to kernel arguments. + kernargs_ptr: Optional pointer to pre-allocated kernel arguments memory. + Returns: + Arguments state with the given buffers and values set for the program. + """ + argsbuf = kernargs or self.dev.kernargs_buf.offset(offset=self.dev.kernargs_offset_allocator.alloc(self.kernargs_alloc_size, 8), + size=self.kernargs_alloc_size) + return self.args_state_t(argsbuf, self, bufs, vals=vals) + + def __call__(self, *bufs:HCQBuffer, global_size:tuple[int,int,int]=(1,1,1), local_size:tuple[int,int,int]=(1,1,1), + vals:tuple[int|None, ...]=(), wait:bool=False, timeout:int|None=None) -> float|None: + """ + Enqueues the program for execution with the given arguments and dimensions. + + Args: + bufs: Buffer arguments to execute the kernel with. + global_size: Specifies the global work size for kernel execution (equivalent to CUDA's grid size). + local_size: Specifies the local work size for kernel execution (equivalent to CUDA's block size). + vals: Value arguments to execute the kernel with. + wait: If True, waits for the kernel to complete execution. + + Returns: + Execution time of the kernel if 'wait' is True, otherwise None. + """ + + kernargs = self.fill_kernargs(bufs, vals) + q = unwrap(self.dev.hw_compute_queue_t)().wait(self.dev.timeline_signal, self.dev.timeline_value - 1).memory_barrier() + + self.dev.prof_exec_counter += 1 + with hcq_profile(self.dev, queue=q, desc=self.name, enabled=wait or PROFILE) as (sig_st, sig_en): + q.exec(self, kernargs, global_size, local_size) + + q.signal(self.dev.timeline_signal, self.dev.next_timeline()).submit(self.dev) + + if wait: self.dev.synchronize(timeout=timeout) + return (float(sig_en.timestamp - sig_st.timestamp) / 1e6) if wait else None + +class HCQCompiled(Compiled, Generic[SignalType]): + """ + A base class for devices compatible with the HCQ (Hardware Command Queue) API. + """ + peer_groups: dict[str, list[HCQCompiled]] = collections.defaultdict(list) + signal_pages: dict[str, list[HCQBuffer]] = collections.defaultdict(list) # per peer group + signal_pool: dict[str, list[HCQBuffer]] = collections.defaultdict(list) # per peer group + cpu_devices: list[HCQCompiled] = [] + + def __init__(self, device:str, allocator:HCQAllocatorBase, compilers:list[type[Renderer]], runtime:type[Program]|None, + signal_t:Type[SignalType]|None=None, comp_queue_t:Callable[..., HWQueue]|None=None, copy_queue_t:Callable[..., HWQueue]|None=None, + kernargs_size=(16 << 20), sigalloc_size=0x1000, can_recover:bool=False, arch=None): + self.device_id:int = int(device.split(":")[1]) if ":" in device else 0 + + from tinygrad.runtime.graph.hcq import HCQGraph + super().__init__(device, allocator, compilers, runtime, HCQGraph, arch=arch) + + self.peer_group = getattr(getattr(self, 'iface', None), 'peer_group', device.split(":")[0]) + HCQCompiled.peer_groups[self.peer_group].append(self) + + self.signal_t, self.hw_compute_queue_t, self.hw_copy_queue_t = signal_t, comp_queue_t, copy_queue_t + + self.timeline_value:int = 1 + self.sig_prof_records:list[tuple[HCQSignal, HCQSignal, str|TracingKey, str]] = [] + self.prof_exec_counter:int = 0 + self.prof_prg_counter = itertools.count(0) + + if signal_t is not None: + # Map signals if any + for sig_page in HCQCompiled.signal_pages[self.peer_group]: cast(HCQAllocator, self.allocator)._map(sig_page) + + self.sigalloc_size = sigalloc_size + self.timeline_signal, self._shadow_timeline_signal = self.new_signal(value=0, is_timeline=True), self.new_signal(value=0, is_timeline=True) + + if comp_queue_t is not None: + self.kernargs_buf:HCQBuffer = self.allocator.alloc(kernargs_size, BufferSpec(cpu_access=True)) + self.kernargs_offset_allocator:BumpAllocator = BumpAllocator(self.kernargs_buf.size, wrap=True) + + self.can_recover = can_recover # Whether the device can recover from faults or timeouts + self.error_state:Exception|None = None # Exception if error is unrecoverable and sync will always fail + + if self._is_cpu(): HCQCompiled.cpu_devices.append(self) + + def count(self) -> int: return self.iface.count if hasattr(self, 'iface') else 1 + + def synchronize(self, timeout:int|None=None): + if self.error_state is not None: raise self.error_state + if not hasattr(self, 'timeline_signal'): return + + # If we have any work on CPU devices, need to synchronize them. This is just an optimization to release GIL allowing to finish faster. + if not self._is_cpu(): + for dev in HCQCompiled.cpu_devices: dev.synchronize() + + try: self.timeline_signal.wait(self.timeline_value - 1, timeout=timeout if timeout is not None and self.can_recover else None) + except RuntimeError as e: + self.error_state = e + if hasattr(self, 'on_device_hang'): self.on_device_hang() + raise e + + if self.timeline_value > (1 << 31): self._wrap_timeline_signal() + if PROFILE: + Compiled.profile_events += [ProfileRangeEvent(dev, name, st.timestamp, en.timestamp) for st,en,name,dev in self.sig_prof_records] + self.sig_prof_records = [] + + def next_timeline(self): + self.timeline_value += 1 + return self.timeline_value - 1 + + def new_signal(self, **kwargs) -> SignalType: + assert self.signal_t is not None, "Device does not support signals" + if not HCQCompiled.signal_pool[pg:=self.peer_group]: + HCQCompiled.signal_pages[pg].append(alc:=self.allocator.alloc(self.sigalloc_size, BufferSpec(host=True, uncached=True, cpu_access=True))) + HCQCompiled.signal_pool[pg] += [alc.offset(offset=off, size=16) for off in range(0, alc.size, 16)] + for dev in HCQCompiled.peer_groups[pg]: cast(HCQAllocator, dev.allocator)._map(alc) + return self.signal_t(base_buf=HCQCompiled.signal_pool[pg].pop(), owner=self, **kwargs) + + def device_props(self) -> dict[str,Any]: return {} # to be overridden if needed. dict keys are backend dependent. + + def hw_compute_queues(self) -> list[tuple[str|None, Callable[[], HWQueue]]]: + return [(None, self.hw_compute_queue_t)] if self.hw_compute_queue_t is not None else [] + def hw_copy_queues(self) -> list[tuple[str, Callable[[], HWQueue]]]: + return [("SDMA:0", self.hw_copy_queue_t)] if self.hw_copy_queue_t is not None else [] + + def _at_profile_finalize(self): + self.synchronize() # Expect device to be synchronizes + + def _sync(d:HCQCompiled, q_t:Callable[[], HWQueue]): + q_t().timestamp(d.timeline_signal).signal(d.timeline_signal, d.next_timeline()).submit(d) + st = time.perf_counter_ns() + d.timeline_signal.wait(d.timeline_value - 1) # average of the two + et = time.perf_counter_ns() + return (decimal.Decimal(et+st) / 2000) - d.timeline_signal.timestamp + + for prefix, q_t in self.hw_compute_queues() + self.hw_copy_queues(): + devname = f"{self.device}:{prefix}" if prefix else self.device + Compiled.profile_events += [ProfileDeviceEvent(devname, statistics.median([_sync(self, q_t) for _ in range(40)]), props=self.device_props())] + + def _wrap_timeline_signal(self): + self.timeline_signal, self._shadow_timeline_signal, self.timeline_value = self._shadow_timeline_signal, self.timeline_signal, 1 + self.timeline_signal.value = 0 + cast(HCQAllocatorBase, self.allocator).b_timeline = [0] * len(cast(HCQAllocatorBase, self.allocator).b) + + def _realloc(self, oldbuf:HCQBuffer|None, new_size:int, options:BufferSpec|None=None, force=False) -> tuple[HCQBuffer, bool]: + if oldbuf is not None: self.allocator.free(oldbuf, oldbuf.size, options=options) + try: buf, realloced = self.allocator.alloc(new_size, options=options), True + except MemoryError: + if force: raise + buf, realloced = self.allocator.alloc(oldbuf.size if oldbuf is not None else new_size, options=options), False + return buf, realloced + + def _select_iface(self): + assert (v:=getenv(k:=f'{type(self).__name__[:-6].upper()}_IFACE', "")) == "", \ + f"{k}={v} is deprecated, use DEV={replace(DEV.target(type(self).__name__[:-6]), interface=v)} instead" + assert hasattr(self, "ifaces"), "must have ifaces to select an iface" + t = DEV.target(dev:=type(self).__name__[:-6]) + filtered = select_by_name(self.ifaces, lambda i: i.__name__[:-5], t.interface, f"{dev} has no interface {t.interface!r}") + filtered = [i for i in filtered if t.interface.startswith("MOCK") or not i.__name__[:-5].startswith("MOCK")] # never fallback to mock ifaces + return select_first_inited([functools.partial(cast(Callable, iface), self, self.device_id) for iface in filtered], + f"No interface for {dev}:{self.device_id} is available") + + def _is_cpu(self) -> bool: return hasattr(self, 'device') and self.device.split(":")[0] == "CPU" + + def rdma_dev(self): + for i in itertools.count(): + if (dev:=next((d for d in HCQCompiled.peer_groups[self.peer_group] if type(d).__name__ == 'RDMADevice'), None)): return dev + try: Device[f'RDMA:{i}'] + except IndexError: raise RuntimeError(f"No RDMA found for peer group '{self.peer_group}'") + + def finalize(self): + try: self.synchronize() # Try to finalize device in any case. + except RuntimeError as e: print(f"{self.device} synchronization failed before finalizing: {e}") + + # If the device has an interface, call its device_fini method to clean up resources. + if hasattr(self, 'iface') and hasattr(self.iface, 'device_fini'): self.iface.device_fini() + +class HCQBuffer: + def __init__(self, va_addr:sint, size:int, meta:Any=None, _base:HCQBuffer|None=None, view:MMIOInterface|None=None, + owner:HCQCompiled|None=None): + self.va_addr, self.size, self.meta, self._base, self.view = va_addr, size, meta, _base, view + self._devs, self.owner = ([owner] if owner is not None else []), owner + self._mappings:dict[HCQCompiled, HCQBuffer] = {} # mapping to the other devices + + def offset(self, offset:int=0, size:int|None=None) -> HCQBuffer: + return HCQBuffer(self.va_addr+offset, size or (self.size - offset), owner=self.owner, meta=self.meta, + _base=self._base or self, view=(self.view.view(offset=offset, size=size) if self.view is not None else None)) + + def cpu_view(self) -> MMIOInterface: + assert self.view is not None, "buffer has no cpu_view" + return self.view + + @property + def base(self) -> HCQBuffer: return self._base or self + + @property + def mappings(self): return self._mappings if self._base is None else self._base._mappings + + @property + def mapped_devs(self): return self._devs if self._base is None else self._base._devs + +class HCQAllocatorBase(LRUAllocator[HCQDeviceType], Generic[HCQDeviceType]): + """ + A base allocator class compatible with the HCQ (Hardware Command Queue) API. + + This class implements basic copy operations following the HCQ API, utilizing both types of `HWQueue`. + """ + + def __init__(self, dev:HCQDeviceType, batch_size:int=(2 << 20), batch_cnt:int=32, copy_bufs=None, **kwargs): + super().__init__(dev, **kwargs) + self.b = copy_bufs or [self._alloc(batch_size, BufferSpec(host=True)) for _ in range(batch_cnt)] + self.b_timeline, self.b_next = [0] * len(self.b), 0 + + def _map(self, buf:HCQBuffer) -> HCQBuffer: + if self.dev in buf.mapped_devs: return buf + if buf.owner is None: raise RuntimeError(f"map failed: buffer {buf.va_addr} has no owner, it's a virtual buffer") + if not hasattr(self, '_do_map'): raise NotImplementedError("map failed: no method implemented") + + # Since it's unified memory space, any buffer mapping is valid for all devices after successful map. + # Devices can save mappings and internal metadata as a new buffer. + if (mb:=self._do_map(buf)) is not None: buf.mappings[self.dev] = mb + buf.mapped_devs.append(self.dev) + return buf + + @suppress_finalizing + def _free(self, buf:HCQBuffer, options:BufferSpec|None=None): + for dev in buf.mapped_devs: dev.synchronize() + for d, mb in buf.mappings.items(): d.allocator._unmap(mb) + if hasattr(self, '_do_free'): self._do_free(buf, options) + + def _unmap(self, mb): self.dev.iface.free(mb) + + def _offset(self, buf, size:int, offset:int) -> HCQBuffer: return buf.offset(offset=offset, size=size) + +class HCQAllocator(HCQAllocatorBase, Generic[HCQDeviceType]): + def _copyin(self, dest:HCQBuffer, src:memoryview): + if self.dev.hw_copy_queue_t is None: + self.dev.synchronize() + with cpu_profile(f'TINY -> {self.dev.device}', f"{self.dev.device}:COPY"): ctypes.memmove(int(dest.va_addr), from_mv(src), len(src)) + return + + with hcq_profile(self.dev, queue_type=self.dev.hw_copy_queue_t, desc=TracingKey(f"TINY -> {self.dev.device}", ret=src.nbytes), enabled=PROFILE, + dev_suff="SDMA:0"): + for i in range(0, src.nbytes, self.b[0].size): + self.b_next = (self.b_next + 1) % len(self.b) + self.dev.timeline_signal.wait(self.b_timeline[self.b_next]) + + lsize = min(self.b[self.b_next].size, src.nbytes - i) + self.b[self.b_next].cpu_view().view(size=lsize, fmt='B')[:] = src.cast('B')[i:i+lsize] + self.dev.hw_copy_queue_t().wait(self.dev.timeline_signal, self.dev.timeline_value - 1) \ + .copy(dest.offset(i), self.b[self.b_next], lsize) \ + .signal(self.dev.timeline_signal, self.dev.next_timeline()).submit(self.dev) + self.b_timeline[self.b_next] = self.dev.timeline_value - 1 + + def copy_from_disk(self, dest:HCQBuffer, src, size): + def _get_temp_buf(): + # Check if the next buffer is safe to be used (its signal has passed) and reserve it. + if self.b_timeline[(self.b_next + 1) % len(self.b)] <= self.dev.timeline_signal.value: + self.b_timeline[(self.b_next + 1) % len(self.b)], self.b_next = (1 << 64), (self.b_next + 1) % len(self.b) + return (self.b[self.b_next].cpu_view(), self.b_next) + return None + + assert self.dev.hw_copy_queue_t is not None + with hcq_profile(self.dev, queue_type=self.dev.hw_copy_queue_t, desc=TracingKey(f"DISK -> {self.dev.device}", ret=size), enabled=PROFILE, + dev_suff="SDMA:0"): + for (batch_info, dst_off, src_off, copy_size) in src.device.allocator._copyout_sharded(src, size, _get_temp_buf, seg_len=self.b[0].size, + use_ioring=type(self.b[0].cpu_view()) is MMIOInterface): + self.dev.hw_copy_queue_t().wait(self.dev.timeline_signal, self.dev.timeline_value - 1) \ + .copy(dest.offset(dst_off), self.b[batch_info[1]].offset(src_off), copy_size) \ + .signal(self.dev.timeline_signal, self.dev.next_timeline()).submit(self.dev) + self.b_timeline[batch_info[1]] = self.dev.timeline_value - 1 + + def _copyout(self, dest:memoryview, src:HCQBuffer): + self.dev.synchronize() + if self.dev.hw_copy_queue_t is None: + with cpu_profile(f'{self.dev.device} -> TINY', f"{self.dev.device}:COPY"): ctypes.memmove(from_mv(dest), int(src.va_addr), len(dest)) + return + + with hcq_profile(self.dev, queue_type=self.dev.hw_copy_queue_t, desc=TracingKey(f"{self.dev.device} -> TINY", ret=dest.nbytes), enabled=PROFILE, + dev_suff="SDMA:0"): + for i in range(0, dest.nbytes, cp_size:=self.b[0].size): + self.dev.hw_copy_queue_t().wait(self.dev.timeline_signal, self.dev.timeline_value - 1) \ + .copy(self.b[0], src.offset(i), lsize:=min(cp_size, dest.nbytes-i)) \ + .signal(self.dev.timeline_signal, self.dev.next_timeline()).submit(self.dev) + self.dev.timeline_signal.wait(self.dev.timeline_value - 1) + dest.cast('B')[i:i+lsize] = self.b[0].cpu_view().view(size=lsize, fmt='B')[:] + + def _transfer(self, dest:HCQBuffer, src:HCQBuffer, sz:int, src_dev:HCQDeviceType, dest_dev:HCQDeviceType): + if src_dev.peer_group != dest_dev.peer_group: return src_dev.rdma_dev().allocator._transfer(dest, src, sz, src_dev, dest_dev) + + cast(HCQAllocator, src_dev.allocator)._map(dest) + + assert src_dev.hw_copy_queue_t is not None + with hcq_profile(src_dev, queue_type=src_dev.hw_copy_queue_t, desc=TracingKey(f"{src_dev.device} -> {dest_dev.device}", ret=sz), enabled=PROFILE, + dev_suff="SDMA:0"): + src_dev.hw_copy_queue_t().wait(src_dev.timeline_signal, src_dev.timeline_value - 1) \ + .wait(dest_dev.timeline_signal, dest_dev.timeline_value - 1) \ + .copy(dest, src, sz) \ + .signal(src_dev.timeline_signal, src_dev.next_timeline()).submit(src_dev) + + if src_dev != dest_dev: + unwrap(dest_dev.hw_compute_queue_t)().wait(src_dev.timeline_signal, src_dev.timeline_value - 1) \ + .wait(dest_dev.timeline_signal, dest_dev.timeline_value - 1) \ + .signal(dest_dev.timeline_signal, dest_dev.next_timeline()).submit(dest_dev) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/hcq2.py b/artifacts/package_runtime/tinygrad/runtime/support/hcq2.py new file mode 100644 index 000000000..8ff308fb6 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/hcq2.py @@ -0,0 +1,593 @@ +from __future__ import annotations +from typing import cast, Callable, TypeVar, Generic, Any, Sequence +import struct, functools, time, collections, itertools +from dataclasses import replace, dataclass +from tinygrad.helpers import DEV, getenv, select_first_inited, select_by_name, suppress_finalizing, dedup, pluralize, JIT_BATCH_SIZE, unwrap +from tinygrad.helpers import to_tuple, round_up, partition, data64_le, panic, ContextVar +from tinygrad.device import Device, Buffer, BufferSpec, Compiled, LRUAllocator, MultiBuffer, DepsTracker +from tinygrad.uop.ops import Ops, sint, UOp, UPat, PatternMatcher, KernelInfo, graph_rewrite, rewrite_group, GroupOp +from tinygrad.uop.symbolic import symbolic, pm_fold_cast_const +from tinygrad.dtype import dtypes, truncate +from tinygrad.runtime.support.hcq import MMIOInterface +from tinygrad.runtime.support.memory import BumpAllocator +from tinygrad.renderer import Renderer, Estimates +from tinygrad.engine.realize import to_program, get_call_arg_uops, get_call_name, get_call_outs_ins, estimate_uop +from tinygrad.engine.realize import pm_flatten_linear + +# ***************** +# 0. helpers + +HCQDeviceType = TypeVar('HCQDeviceType', bound='HCQ2Compiled') + +HCQ_RUNTIME_DEV = ContextVar("HCQ_RUNTIME_DEV", "CPU") + +HCQ_DEVS = frozenset(("AMD",)) +HCQ_P2P_DEVS = HCQ_DEVS | frozenset(("CPU",)) +HCQ_CACHE_TAGS = frozenset(("program", "systems", "template")) + +@dataclass(frozen=True) +class HCQInfo: + device:tuple[str, ...] + estimates:Estimates = Estimates() + + input_idxs:tuple[int, ...] = () # indexes into input_uops used by this call + inputs:int|None = None + +def all_devices_in(d:Any, c:frozenset[str]) -> bool: return {x.split(":")[0] for x in to_tuple(d)} <= c + +def unwrap_mstack(u): + if u.op is Ops.MSTACK: return tuple(x for s in u.src for x in unwrap_mstack(s)) + return unwrap_mstack(u.src[0]) if u.op in {Ops.MSELECT, Ops.SLICE} else (u,) + +def is_value_known_at_link(val:UOp) -> bool: + runtime_reads = [u for u in val.toposort() if u.op in (Ops.LOAD, Ops.INDEX)] + addressed_bufs = [b for g in val.toposort() if g.op is Ops.GETADDR for b in unwrap_mstack(g.buf_uop)] + + # addr of input params is not known at link time + return not val.variables() and not runtime_reads and all(b.op is not Ops.PARAM or b.tag is not None for b in addressed_bufs) + +def make_patches(buf:UOp, patches:Sequence[tuple[sint, UOp]]) -> tuple[UOp, ...]: + return tuple(buf.index(UOp(Ops.STACK, dtypes.int, tuple(UOp.const(off // buf.dtype.itemsize, dtypes.int) for off,_ in ps))) + .store(UOp(Ops.STACK, buf.dtype, tuple(val.cast(buf.dtype) for _,val in ps))).rtag(tag) + for ps, tag in zip(partition(patches, lambda p: is_value_known_at_link(p[1])), ("link", None)) if ps) + +def make_binary_patch(buf:UOp, blob:bytes) -> UOp: + data = UOp(Ops.BINARY, src=(), arg=blob).bitcast(buf.dtype) + r = UOp.range(len(blob) // buf.dtype.itemsize, 0, dtype=dtypes.int, src=(buf, data)) + return buf.index(r).store(data.index(r).load()).end(r).rtag("link") + +def make_cmdbuf(lin, devs, buf:UOp|None=None): + blob, patches = bytearray(), [] + for s in (s for ins in lin.src for s in ins.src): + if s.op is not Ops.CONST: patches.append((len(blob), s)) + blob.extend(struct.pack(f'<{s.dtype.fmt}', s.val if s.op is Ops.CONST else 0x0)) + cmdbuf = buf if buf is not None else UOp.placeholder((len(blob) // 4,), dtypes.uint32, next(UOp.unique_num), device=devs).rtag("cmdbuf") + return cmdbuf.after(make_binary_patch(cmdbuf, bytes(blob)), *make_patches(cmdbuf, patches)) + +def make_signal(devs, slot:int=0, tag:str="signal") -> UOp: + return UOp.placeholder((1,), dtypes.uint64, slot, device=devs, volatile=True).rtag(tag) + +def make_submit(*cmds, devs:str|tuple[str, ...], queue:str) -> UOp: + return UOp.custom_function("submit_cmdbuf", UOp(Ops.LINEAR, src=tuple(cmds), arg=(to_tuple(devs), queue))) +def get_submit(ast:UOp) -> UOp: return next(u for u in ast.toposort() if u.op is Ops.CUSTOM_FUNCTION and u.arg == "submit_cmdbuf") + +def make_call(name:str, body:UOp, info:HCQInfo) -> UOp: return UOp.custom_function("hcq", body).call(name=name, aux=info) + +def encode_kernargs_clike(call:UOp, prg:UOp, devs:str|tuple[str, ...]) -> UOp: + data, info = prg.arg + buf = UOp.placeholder((data.kernargs_alloc_size // 4,), dtypes.uint32, next(UOp.unique_num), device=devs).rtag("kernargs") + words = [w for gi in info.globals for w in data64_le(get_call_arg_uops(call)[gi].getaddr(devs))] + list(info.vars) + return buf.after(*make_patches(buf, [(i * 4, w) for i, w in enumerate(words)])) + +# ***************** +# 0.1. prep: replace buffers with params + +def replace_call_buffers(ctx:tuple[list[UOp], dict[UOp, int]], call:UOp) -> UOp|None: + bufs, slots = ctx + for s in call.src[1:]: + if s.op not in (Ops.PARAM, Ops.BIND) and slots.setdefault(s, len(bufs)) == len(bufs): bufs.append(s) + return call.replace(src=call.src[:1] + tuple(s if s.op in (Ops.PARAM, Ops.BIND) else s.param_like(slots[s]) for s in call.src[1:])) +pm_replace_buffers = PatternMatcher([(UPat(Ops.CALL, name="call"), replace_call_buffers)]) + +# ***************** +# 1.1. prep: staging copies + +def _need_staging(a, b): return all_devices_in(a.device, HCQ_DEVS) and not all_devices_in(b.device, HCQ_P2P_DEVS) + +def stage_copy(dst:UOp, src:UOp) -> UOp|None: + if not (_need_staging(src, dst) or _need_staging(dst, src)): return None + + stage = UOp.new_buffer("CPU", src.max_numel() * src.dtype.itemsize, dtypes.uint8) + return UOp(Ops.LINEAR, src=(src.copy_to_device("CPU").call(stage, src), stage.copy_to_device(dst.device).call(dst, stage))) +pm_insert_copy_staging = PatternMatcher([(UPat(Ops.CALL, src=(UPat(Ops.COPY), UPat(name="dst"), UPat(name="src"))), stage_copy)]) + +# ***************** +# 2. deps + +class HCQDepsTracker(DepsTracker): + @staticmethod + def _key(buf:Any) -> tuple[Any, int, int]: + return (buf.arg.slot, 0, buf.max_numel() * buf.dtype.itemsize) if isinstance(buf, UOp) else DepsTracker._key(buf) + +def _get_call_bufs_by_lane(call:UOp, devices:tuple[str, ...]) -> list[list[Any]]: + refs = get_call_arg_uops(call) + return [[b if b.op is Ops.PARAM else mb.bufs[lane] if isinstance(mb:=b.buffer, MultiBuffer) else mb for b in refs] for lane in range(len(devices))] + +def _get_deps(ctx:DepsTracker, bufs_by_lane:list[list[Any]], write, key:tuple[tuple[str, ...], str, int]) -> list[tuple[tuple, int, int]]: + dep_lanes:list[tuple[tuple, int, int]] = [] + for lane, bufs in enumerate(bufs_by_lane): + written = write if write is not None else list(range(len(bufs))) + dep_lanes += [(dep, dlane, lane) for dep, dlane in ctx.access_resources(bufs, written, (key, lane))] + return dep_lanes + +def _build_wait_cmds(slots:dict[str, int], dep_lanes:list[tuple[tuple, int, int]], devices:tuple[str, ...], queue:str) -> tuple[list[UOp], set[int]]: + # opt1: same-queue ops are fifo-ordered + if devices[0].split(":")[0] in {"AMD", "QCOM"} or queue.startswith("COPY"): + dep_lanes = [(dep, dlane, lane) for dep, dlane, lane in dep_lanes if (dep[0][dlane], dep[1]) != (devices[lane], queue)] + + # opt2: keep latest dep per (dep device, queue, cur lane) + latest = {((dep[0][dlane], dep[1]), lane): (dep, dlane) for dep, dlane, lane in sorted(dep_lanes, key=lambda x: x[0][2])} + deps:dict[tuple, list[int|None]] = collections.defaultdict(lambda: [None]*len(devices)) + for (_, lane), (dep, dlane) in latest.items(): deps[dep][lane] = dlane + + waits = [] + for (ddevs, dqueue, dtag), lanes in deps.items(): + sig = UOp.mstack(*[make_signal(d, tag="sentinel_signal") if dl is None else make_signal(ddevs[dl], slots[dqueue]) + for dl, d in zip(lanes, devices)]) + waits.append(UOp(Ops.INS, arg="wait", src=(sig, UOp.const(dtag + 1, dtypes.uint64)))) + return waits, {dtag for _, _, dtag in deps} + +def _build_finalizers(batch:list[tuple[UOp, tuple[str, ...]]], batch_info:list[tuple[tuple[str, ...], str]], + tracker:HCQDepsTracker, slots:dict[str, int]) -> tuple[list[UOp], list[UOp], set[int]]: + # collect all buffers which belong to devices + dev_bufs:dict[str, dict[int, Any]] = collections.defaultdict(dict) + for call, devices in batch: + for b in itertools.chain.from_iterable(_get_call_bufs_by_lane(call, devices)): + for bd in to_tuple(b.device): dev_bufs[bd][id(b)] = b + + n, fences, fins, signal_tags = len(batch_info), [], [], set() + for _, devgroup in itertools.groupby(sorted(dev_bufs), key=lambda d: d.split(":")[0]): + devs = tuple(devgroup) + + # to finalize the batch, sync all accesses from other devices to buffers that belong to this device + fin_deps = [dl for dl in _get_deps(tracker, [list(dev_bufs[d].values()) for d in devs], None, key=(devs, "COMPUTE:0", n)) if dl[0][2] < n] + waits, cur_signal_tags = _build_wait_cmds(slots, fin_deps, devs, "COMPUTE:0") + signal_tags |= cur_signal_tags + + # wait the syncs and signal the device epoch, then bump the timeline on the host + tl_signal, tl_value = make_signal(devs, tag="timeline_signal"), make_signal(devs, tag="timeline_value") + fin_submit = make_submit(*waits, UOp(Ops.INS, arg="store", src=(tl_signal, tl_value.index(0))), devs=devs, queue="COMPUTE:0") + epoch = (epoch_slot:=tl_value.after(fin_submit).index(0)).load() + + # fence once per device group on this schedule's previous epoch, then reset any queue signals used by the group + qs = dedup([qn for bdevs, qn in batch_info if set(bdevs) & set(devs)]) + sched_epoch = make_signal(devs, next(UOp.unique_num)) + + wait_device_epoch = (done:=tl_signal.after(loop:=UOp.loop(0)).index(0).load()).end(loop, done < sched_epoch.index(0).load()) + resets = [make_signal(devs, slots[q]).after(wait_device_epoch).index(0).store(0) for q in qs] + + fences.append(make_call("hcq_fence", UOp.sink(*(resets or [wait_device_epoch])), HCQInfo(devs))) + fins.append(make_call("hcq_finalizer", UOp.sink(epoch_slot.store(epoch + 1), sched_epoch.after(fin_submit).index(0).store(epoch)), HCQInfo(devs))) + return fences, fins, signal_tags + +def _finalize_batch(batch:list[tuple[UOp, tuple[str, ...]]]) -> list[UOp]: + batch_info = [(devices, "COMPUTE:0" if call.src[0].op is Ops.PROGRAM else "COPY:0") for call, devices in batch] + + # schedule deps + signal_tags:set[int] = set() + slots:dict[str, int] = collections.defaultdict(lambda: next(UOp.unique_num)) + deps_tracker = HCQDepsTracker() + call_waits:list[list[UOp]] = [] + for tag, ((call, _), (devices, queue)) in enumerate(zip(batch, batch_info)): + deps = _get_deps(deps_tracker, _get_call_bufs_by_lane(call, devices), get_call_outs_ins(call)[0], key=(devices, queue, tag)) + cmds, cur_signal_tags = _build_wait_cmds(slots, deps, devices, queue) + call_waits.append(cmds) + signal_tags |= cur_signal_tags + + # build fences and finalizers + fences, finalizers, finalizer_signal_tags = _build_finalizers(batch, batch_info, deps_tracker, slots) + signal_tags |= finalizer_signal_tags + + src = [] + for tag, ((call, _), (devices, queue), q) in enumerate(zip(batch, batch_info, call_waits)): + # first queue use, sync prior device work with the device timeline + if batch_info.index((devices, queue)) == tag: + epoch = make_signal(devices, tag="timeline_value").index(0) - 1 + q = [UOp(Ops.INS, arg="barrier", src=()), UOp(Ops.INS, arg="wait", src=(make_signal(devices, tag="timeline_signal"), epoch))] + q + + # and make hcq call + name, info = get_call_name(call, get_call_arg_uops(call)), HCQInfo(devices, estimate_uop(call)) + q += [call.replace(arg=replace(call.arg, aux=info))] + + # signal the queue if someone waits for us + if tag in signal_tags: q += [UOp(Ops.INS, arg="store", src=(make_signal(devices, slots[queue]), UOp.const(tag + 1, dtypes.uint64)))] + src.append(make_call(name, make_submit(*q, devs=devices, queue=queue).sink(), info)) + return fences + src + finalizers + +def sched_hcq_batches(l:UOp) -> UOp: + srcs:list[UOp] = [] + batch:list[tuple[UOp, tuple[str, ...]]] = [] + for call in l.src: + if (devs:=next((b.device for b in call.src[1:] if all_devices_in(b.device, HCQ_DEVS)), None)) is not None: batch.append((call, to_tuple(devs))) + else: srcs, batch = srcs + _finalize_batch(batch) + [call], [] + return l.replace(src=tuple(srcs + _finalize_batch(batch))) + +# ***************** +# 3. merge into queues + +def _merged_hcq_call(calls:list[UOp]) -> UOp: # TODO: simplify? + if len(calls) == 1: return calls[0] + devs, queue = get_submit(calls[0]).src[0].arg + body = make_submit(*[cmd for c in calls for cmd in get_submit(c).src[0].src], devs=devs, queue=queue).sink() + return make_call(f"submit {queue} ({len(calls)})", body, + replace(calls[0].arg.aux, estimates=sum((c.arg.aux.estimates for c in calls), start=Estimates()))) + +def merge_queues(linear:UOp) -> UOp: + new_src:list[UOp] = [] + opened_qs:dict[tuple[tuple[str, ...], str], list[UOp]] = {} # (devs, queue) -> list of hcq calls, kept in submit order + limits:dict[tuple[tuple[str, ...], str], int] = collections.defaultdict(lambda: JIT_BATCH_SIZE.value) + + for call in linear.src: + # non-hcq call, fence or finalizer: close all open queues + if not isinstance(call.arg.aux, HCQInfo) or (call.arg.name or "").startswith("hcq_"): + new_src += [_merged_hcq_call(opened_qs.pop(k)) for k in list(opened_qs)] + [call] + continue + + devs, queue = get_submit(call).src[0].arg + if (old:=opened_qs.pop(key:=(devs, queue), None)) is not None: + if limits[key] and len(old) >= limits[key]: new_src, old, limits[key] = new_src + [_merged_hcq_call(old)], [], limits[key] * 2 + new_rec = old + [call] + else: + # no such queue opened: close every open submit on this queue that shares a device, so submit order is kept + closing = [k for k in opened_qs if k[1] == queue and set(k[0]) & set(devs)] + new_src += [_merged_hcq_call(opened_qs.pop(k)) for k in closing] + new_rec = [call] + opened_qs[(devs, queue)] = new_rec + return linear.replace(src=tuple(new_src + [_merged_hcq_call(c) for c in opened_qs.values()])) + +pm_schedule_and_merge = PatternMatcher([(UPat(Ops.LINEAR, name="l"), + lambda ctx, l: merge_queues(sched_hcq_batches(l).substitute(ctx, walk=True, enter_calls=True)))]) + +# ***************** +# 4.2. hcq lowering: ops to ir + +def encode_cmdbuf(submit:UOp, lin:UOp) -> UOp|None: + if (pm:=Device.get_class(lin.arg[0][0]).pm_lower) is None: return None + return graph_rewrite(submit, pm, name=f"encode {lin.arg[0]}", enter_calls=True) +pm_encode_cmdbufs = PatternMatcher([ + (UPat(Ops.CUSTOM_FUNCTION, arg="submit_cmdbuf", src=(UPat(Ops.LINEAR, name="lin"),), name="submit"), encode_cmdbuf)]) + +# ***************** + +def get_getaddrs(p:UOp) -> list[UOp]: return [u for u in p.toposort(gate=lambda u: u.op is not Ops.AFTER) if u.op is Ops.GETADDR] + +def trim_link_patches(ctx:tuple[list[UOp], list[UOp]], a:UOp) -> UOp|None: + links, kept = partition(a.src[1:], lambda p: p.tag == "link") + ctx[0].extend(kept) + + # keep all patches from the link-time patches' subtrees in the C code + afters = [u for u in UOp.sink(*links).toposort() if u.op is Ops.AFTER] + ctx[1].extend(UOp.sink(*links).substitute({p: p.src[0] for p in afters}).src) + return a.src[0].after(*kept, *[d for p in afters for d in p.src[1:]]) if links else None +pm_trim_link_patches = PatternMatcher([(UPat(Ops.AFTER, src=(UPat((Ops.PARAM, Ops.MSTACK)),), allow_any_len=True, name="a"), trim_link_patches)]) + +def make_addr_table(call:UOp, gaddrs:list[UOp], name:str) -> tuple[UOp, dict[UOp, UOp], tuple[UOp, ...], dict[UOp, int]]: + bare = {g: g.replace(src=(g.src[0].without_after,)) for g in gaddrs} + + order = sorted(dedup(bare.values()), key=lambda g: ((b:=unwrap_mstack(g.buf_uop)[0]).arg.slot, repr(b.tag))) + slots = {g:i for i,g in enumerate(order)} + table = UOp.placeholder((len(order),), dtypes.uint64, next(UOp.unique_num), device=call.arg.aux.device).rtag(name) + + reads = {g: table.after(*g.src[0].src[1:] if g.src[0].op is Ops.AFTER else ()).index(UOp.const(slots[bare[g]], dtypes.int)).load() for g in gaddrs} + fills = (table.after(*make_patches(table, [(i*table.dtype.itemsize, addr) for addr, i in slots.items()])),) if slots else () + return table, reads, fills, {g:slots[bare[g]] for g in gaddrs} + +def is_bare_addr(val:UOp) -> bool: return val.op is Ops.CAST and val.src[0].op in (Ops.AND, Ops.SHR) and val.src[0].src[0].op is Ops.GETADDR + +def make_scatter_loops(patches:list[UOp], inputs_table:tuple, lt_patches:list[UOp]) -> dict[UOp, UOp]: + table, _, _, slots = inputs_table + subs, by_dst = {}, collections.defaultdict(list) + for p in patches: by_dst[p.buf_uop].append(p) + for dst, patches in by_dst.items(): + data = [] + for p in patches: + words = [(off, val, get_getaddrs(val)) for off,val in zip(p.src[0].src[1].src, p.src[1].src)] + data += [(off.val, slots[gaddrs[0]]) for off,_,gaddrs in words if gaddrs][::2] + scalars = [(off.val*dst.dtype.itemsize, val) for off,val,gaddrs in words if not gaddrs] + subs[p] = UOp.group(*make_patches(dst, scalars)) if scalars else UOp(Ops.NOOP) + + word_table, slot_table = (UOp.placeholder((len(data),), dtypes.uint32, next(UOp.unique_num), device=dst.device).rtag("systems") for _ in range(2)) + ridx = UOp.range(len(data), next(UOp.unique_num), dtype=dtypes.int, src=(word_table, slot_table, dst)) + widx, slot = ((p.index(ridx).load() % bound).cast(dtypes.int) for p,bound in ((word_table, dst.max_numel()-1), (slot_table, table.max_numel()))) + loop = UOp.group(*[dst.index(widx+i).store((table.index(slot).load() >> 32*i).cast(dtypes.uint32)) for i in range(2)]).end(ridx) + lt_patches += [make_binary_patch(buf, struct.pack(f'<{len(data)}I', *vals)) for buf,vals in zip((word_table, slot_table), zip(*data))] + subs[patches[0]] = UOp.group(loop, subs[patches[0]]) + return subs + +def is_input_addr(g:UOp) -> bool: return all(x.op is Ops.PARAM and x.tag is None for x in unwrap_mstack(g.buf_uop)) + +def split_patches(call:UOp) -> UOp|None: + rt_patches:list[UOp] = [] + lt_patches:list[UOp] = [] + body = graph_rewrite(call.src[0], pm_trim_link_patches, ctx=(rt_patches, lt_patches), name=f"trim link-time patches ({call.arg.name})") + + # split patches + inputs, internals = partition(dedup(g for p in rt_patches for g in get_getaddrs(p)), is_input_addr) + runtimes, systems = partition(internals, lambda g: any(x.tag in {"program", "kernargs", "cmdbuf"} for x in unwrap_mstack(g.buf_uop))) + tables = [make_addr_table(call, gs, n) for gs,n in ((inputs, "inputs"), (runtimes, "runtime"), (systems, "systems"))] + reads, fills = {k:v for _,r,_,_ in tables for k,v in r.items()}, [f for t in tables[1:] for f in t[2]] # inputs table is filled by exec + input_patches = [p for p in rt_patches if (gs:=get_getaddrs(p)) and all(map(is_input_addr, gs)) + and all(is_bare_addr(v) for v in p.src[1].src if get_getaddrs(v))] + scatter = make_scatter_loops(input_patches, tables[0], lt_patches) + body = body.substitute({p:p.substitute(scatter | reads) for p in rt_patches}) + + if inputs: # fence inputs + fills.append((t:=tables[0][0]).after(make_binary_patch(t, bytes(t.max_numel() * 8)))) # zeroed at link, slot 0 is the host fence + body = body.replace(src=(UOp.sink(*body.src[0].src, t.after(*body.src[0].src).index(0).store(0)),)) # open it once consumed + + lt_srcs = collections.defaultdict(list) + for p in lt_patches: lt_srcs[p.buf_uop].append(p) + return call.replace(src=(body, *call.src[1:], *[b.after(*ps) for b,ps in lt_srcs.items()], *fills), + arg=replace(call.arg, aux=replace(call.arg.aux, input_idxs=tuple(sorted(dedup(b.arg.slot for g in inputs for b in unwrap_mstack(g.buf_uop))))))) +pm_split_patches = PatternMatcher([(UPat(Ops.CALL, src=(UPat(Ops.CUSTOM_FUNCTION, arg="hcq"),), name="call", allow_any_len=True), split_patches)]) + +# ***************** + +def replace_params(call:UOp) -> UOp|None: + body, variables, param_ops = call.src[0], call.src[0].variables(), {Ops.PARAM, Ops.MSTACK} + args = dedup([s for u in body.toposort(gate=lambda u: u.op not in param_ops) for s in u.src if s.op in param_ops and s not in variables]) + + patched, refhold = partition(call.src[1:], lambda x: x.src[0] in args) + by_root = {p.src[0]: p for p in patched} + c_args = [by_root.get(a, a) for a in args] + + # keep buffers whose addresses become link-time constants alive and mapped + held = args + [r.without_after for r in refhold] + addrs = dedup([g.src[0].without_after for x in call.src for g in x.toposort() if g.op is Ops.GETADDR]) + refhold += [a for a in addrs if a not in held and all(b.op is not Ops.PARAM or b.tag is not None for b in unwrap_mstack(a))] + + sub = {(b:=u.without_after): UOp.param(i, u.dtype, shape=b.shape, device=HCQ_RUNTIME_DEV.value, volatile=b.op is Ops.PARAM and b.arg.volatile) + for i,u in enumerate(c_args)} | {v: v.replace(arg=replace(v.arg, slot=-1)) for v in variables if v.op is Ops.PARAM} + info = replace(call.arg.aux, inputs=next((i for i,u in enumerate(c_args) if u.without_after.tag == "inputs"), None)) + return call.replace(src=(body.substitute(sub).replace(arg="hcq_args"), *c_args, *refhold), + arg=replace(call.arg, aux=info)) # TODO: call.after(*refhold)? +pm_replace_params = PatternMatcher([ + (UPat(Ops.CALL, src=(UPat(Ops.CUSTOM_FUNCTION, arg="hcq"),), name="call", allow_any_len=True), replace_params)]) + +# ***************** + +def resolve_getaddr_slice(bv:UOp, g:UOp) -> UOp: + base = bv.src[0].after(*g.src[0].src[1:] if g.src[0].op is Ops.AFTER else ()) + itemsize = bv.src[0].dtype.itemsize if bv.src[0].without_after.op in (Ops.BUFFER, Ops.SLICE, Ops.MSTACK, Ops.MSELECT) else bv.dtype.itemsize + return UOp(Ops.GETADDR, src=(base,), arg=g.arg) + UOp.const(bv.src[1].val * itemsize, dtypes.uint64) + +pm_early_simplify = PatternMatcher([ + (UPat(Ops.GETADDR, src=(UPat.any(sl:=UPat(Ops.SLICE, name="bv"), sl.after(allow_any_len=True)),), name="g"), resolve_getaddr_slice), + (UPat(Ops.INDEX, src=(UPat(Ops.SLICE, name="bv"),), allow_any_len=True, name="x"), + lambda bv,x: x.replace(src=(bv.src[0], x.src[1] + bv.src[1].cast(x.src[1].dtype), *x.src[2:]))), +]) + +# ***************** +# 5.3. pack placeholders buffers + +def pack_hcq_placeholders(call:UOp) -> UOp|None: + bufs = [b for b in call.src[0].toposort() if b.op is Ops.PARAM and b.tag in {"scratch", "kernargs"}] + offs:dict[UOp, int] = {} + sizes:dict[Any, int] = {} + for b in bufs: + if b.tag == "scratch": sizes[b.tag] = max(sizes.get(b.tag, 0), b.max_numel()) + else: + offs[b] = round_up(sizes.get(b.tag, 0), 128 // b.dtype.itemsize) + sizes[b.tag] = offs[b] + b.max_numel() + counts = collections.Counter(b.tag for b in bufs) + bases = {b.tag:UOp.placeholder((sizes[b.tag],), b.dtype, next(UOp.unique_num), device=b.device).rtag(b.tag) for b in bufs if counts[b.tag] > 1} + subs = {b:UOp(Ops.SLICE, b.dtype, (bases[b.tag], UOp.const(offs.get(b, 0))), b.max_numel()) for b in bufs if b.tag in bases} + return call.replace(src=(call.src[0].substitute(subs, walk=True), *call.src[1:])) if subs else None +pm_pack_placeholders = PatternMatcher([ + (UPat(Ops.CALL, src=(UPat(Ops.CUSTOM_FUNCTION, arg="hcq"),), name="call", allow_any_len=True), pack_hcq_placeholders)]) + +# ***************** +# 8. callify hcq programs + +def callify_hcq(call:UOp, cf:UOp) -> UOp: + prg = to_program(cf.src[0].replace(arg=KernelInfo("hcq_submit"), tag=1), Device[HCQ_RUNTIME_DEV.value].renderer) + return call.replace(src=(cf.replace(src=(prg,), arg="hcq"), *call.src[1:])) +pm_callify_hcq = PatternMatcher([(UPat(Ops.CALL, src=( + UPat(Ops.CUSTOM_FUNCTION, arg="hcq_args", src=(UPat(Ops.SINK),), name="cf"),), name="call", allow_any_len=True), callify_hcq)]) + +hcq_compile_cache:dict[bytes, UOp] = {} + +@rewrite_group(lambda linear,input_uops,ret: f"HCQ Compile {pluralize('Kernel', len(ret.src))}") +def hcq_compile(linear:UOp, input_uops:list[UOp]|None=None) -> UOp: + if input_uops is not None: + slots = {u:i for i,u in reversed(tuple(enumerate(input_uops)))} + linear = graph_rewrite(linear, pm_replace_buffers, ctx=(input_uops, slots), walk=True, name="replace buffer") + + if (final_linear:=(hcq_compile_cache.get(cache_key:=linear.key))) is None: + # prep + linear = linear.substitute(back_map:={s.param_like(i): s for i,s in enumerate(input_uops)} if input_uops is not None else {}, walk=True) + linear = graph_rewrite(linear, pm_insert_copy_staging+pm_flatten_linear, name="insert copy staging") + + # schedule + linear = graph_rewrite(linear, pm_schedule_and_merge, ctx={s:p for p,s in back_map.items()}, walk=True, name="schedule and merge hcq") + + # lowering to hcq ir + linear = graph_rewrite(linear, pm_encode_cmdbufs+pm_pack_placeholders, walk=True, name="encode and pack", enter_calls=True) + + # patches and runtime uops + linear = graph_rewrite(linear, pm_early_simplify+symbolic+pm_fold_cast_const, bottom_up=False, name="simplify patches", enter_calls=True) + linear = graph_rewrite(linear, pm_split_patches, walk=True, name="split patches") + + # and compile it + linear = graph_rewrite(linear, pm_replace_params, name="replace params") + final_linear = hcq_compile_cache[cache_key] = graph_rewrite(linear, pm_callify_hcq, name="callify hcq", enter_calls=True) + + return final_linear + +# ***************** +# 6. bufferize placeholders: replace placeholders with real buffers. + +def bufferize_buf(ctx:bool, buf:UOp) -> UOp|None: + if buf.tag is None: return None + return UOp.mstack(*(UOp.from_buffer((dv:=Device[dev]).pm_bufferize.rewrite(buf, ctx=(dv, ctx)), HCQ_RUNTIME_DEV.value) + for dev in to_tuple(buf.device))) +pm_bufferize = PatternMatcher([(UPat(Ops.PARAM, name="buf"), bufferize_buf)]) + +# ***************** +# 7. resolve patches + +def push_stack(op, s): return UOp(Ops.STACK, + src=tuple(op.replace(dtype=op.dtype.scalar(), src=tuple(x if y is s else y for y in op.src)) for x in s.src)) + +def fold_binary(buf:UOp, blob:UOp) -> UOp: + for b in (m.bufs if isinstance(m:=buf.buffer, MultiBuffer) else (m,)): + b.ensure_allocated().as_memoryview(force_zero_copy=True, no_sync=True).cast('B')[:len(blob.arg)] = blob.arg + return UOp(Ops.NOOP) + +def fold_const_store(buf:UOp, off:UOp, val:UOp) -> UOp: + for off,val in zip(off.src, val.src): + for b,v in zip((bs:=mb.bufs if isinstance((mb:=buf.buffer), MultiBuffer) else (mb,)), val.src if val.op is Ops.STACK else (val,)*len(bs)): + data = struct.pack(f'<{v.dtype.fmt}', truncate[v.dtype](v.val)) + b.ensure_allocated().as_memoryview(force_zero_copy=True, no_sync=True).cast('B')[(bo:=off.val*buf.dtype.itemsize):bo+len(data)] = data + return UOp(Ops.NOOP) + +def resolve_getaddr(buf:UOp, g:UOp) -> UOp: + assert buf.op in (Ops.BUFFER, Ops.MSTACK, Ops.MSELECT), f"{buf.op}" + + devs, b = g.arg, buf.buffer + bufs = tuple(cast(Buffer, x.buffer) for x in buf.src) if buf.op is Ops.MSTACK else tuple(b.bufs if isinstance(b, MultiBuffer) else (b,)*len(devs)) + assert len(bufs) == len(devs), f"can't resolve {len(bufs)} buffers on {len(devs)} devices" + addrs = tuple(UOp.const(x.get_buf(d).va_addr, dtypes.uint64) for x, d in zip(bufs, devs)) + return addrs[0] if len(addrs) == 1 else UOp(Ops.STACK, src=addrs) + +pm_resolve_patches = PatternMatcher([ + # multi + (UPat(GroupOp.ALU, src=[UPat(Ops.STACK, name="s"), UPat(Ops.CONST)], name="op"), push_stack), + (UPat(Ops.CAST, src=(UPat(Ops.STACK, name="s"),), name="op"), push_stack), + + # getaddr + (UPat(Ops.GETADDR, src=(UPat(name="buf"),), name="g"), resolve_getaddr), + + # folders + (UPat(name="buf").index(UPat(Ops.RANGE), allow_any_len=True) + .store(UPat.any(UPat(Ops.BINARY, name="blob"), UPat(Ops.BINARY, name="blob").bitcast()).index(UPat(Ops.RANGE), allow_any_len=True).load()) + .end(UPat(Ops.RANGE)), fold_binary), + (UPat({Ops.BUFFER, Ops.SLICE, Ops.MSTACK}, name="buf").index(UPat(Ops.STACK, name="off")).store(UPat(Ops.STACK, name="val")), fold_const_store), +]) + +pm_assert_no_afters = PatternMatcher([(UPat(Ops.AFTER, name="a"), lambda a: panic(RuntimeError, f"AFTER left at hcq_link: {a.src[0].op}"))]) + +def link_buf_key(a:UOp): return a.key, to_tuple(a.device) +link_buf_cache:dict[tuple[bytes, tuple[str, ...]], UOp] = {} +link_linear_cache:dict[bytes, UOp] = {} + +@rewrite_group(lambda _,cache,ret: f"HCQ Link {pluralize('Kernel', len(ret.src))}") +def hcq_link(linear:UOp, cache=True) -> UOp: + if (linked:=link_linear_cache.get(linear_key:=linear.key)) is not None: return linked + + bufs = {(j,i):a for j,c in enumerate(linear.src) for i,a in enumerate(c.src[1:], 1) + if a.op is Ops.AFTER and unwrap_mstack(a.src[0])[0].tag in HCQ_CACHE_TAGS} + linear = linear.substitute({x:link_buf_cache[k] for a in bufs.values() if (k:=link_buf_key(a)) in link_buf_cache for x in (a, a.src[0])}, walk=True) + linear = graph_rewrite(linear, pm_resolve_patches+symbolic+pm_fold_cast_const+pm_assert_no_afters, bpm=pm_bufferize, ctx=cache, bottom_up=False, + name="resolve patches") + for (j,i),a in bufs.items(): link_buf_cache.setdefault(link_buf_key(a), linear.src[j].src[i]) + if cache: link_linear_cache[linear_key] = linear + return linear + +# ***************** +# Device classes + +class HCQ2Compiled(Compiled): + timestamp_divider: float = 1000.0 + + def __init__(self, device:str, allocator:HCQAllocator, compilers:list[type[Renderer]], runtime, can_recover:bool=False, arch=None): + self.device_id:int = int(device.split(":")[1]) if ":" in device else 0 + self.can_recover = can_recover + + self.pm_bufferize = PatternMatcher([ + (UPat(Ops.PARAM, tag="sentinel_signal"), lambda ctx: ctx[0].signal("sentinel", (1 << 64) - 1)), + (UPat(Ops.PARAM, tag="timeline_signal"), lambda ctx: ctx[0].signal("timeline")), + (UPat(Ops.PARAM, tag="timeline_value"), lambda ctx: ctx[0].signal("value", 1)), + (UPat(Ops.PARAM, tag="signal", name="b"), lambda ctx, b: ctx[0].signal(b.arg.slot)), + (UPat(Ops.PARAM, name="b"), lambda ctx, b: None if b.tag is None else ctx[0].new_buffer(b, cache=ctx[1])) + ]) + + super().__init__(device, allocator, compilers, runtime, None, arch=arch) + + self.rt_buffer = Buffer(self.device, 64 << 20, dtypes.uint8, options=BufferSpec(uncached=True, cpu_access=True)) + self.rt_allocator = BumpAllocator(64 << 20) + + def new_buffer(self, b:UOp, cache:bool) -> Buffer: + if cache or b.tag in HCQ_CACHE_TAGS: + return Buffer(self.device, b.max_numel(), b.dtype, options=BufferSpec(uncached=True, cpu_access=True, nolru=True)) + return self.rt_buffer.view(b.max_numel(), b.dtype, self.rt_allocator.alloc(b.max_numel() * b.dtype.itemsize, alignment=128)) + + @functools.cache + def signal(self, name:str|int, init_value:int=0) -> Buffer: + buf = Buffer(self.device, 1, dtypes.uint64, options=BufferSpec(host=True, uncached=True, cpu_access=True), preallocate=True) + buf.as_memoryview(force_zero_copy=True, no_sync=True).cast('Q')[0] = init_value + return buf + + def synchronize(self, timeout:int|None=None): + if HCQ_RUNTIME_DEV.value != self.device: Device[HCQ_RUNTIME_DEV.value].synchronize() + + sig = self.signal("timeline").as_memoryview(force_zero_copy=True, no_sync=True).cast('Q') + tl = self.signal("value", 1).as_memoryview(force_zero_copy=True, no_sync=True).cast('Q') + timeout = timeout if timeout is not None and self.can_recover else None + st = time.perf_counter() + while sig[0] < tl[0] - 1: + if time.perf_counter() - st > (timeout or 3000) / 1000: self.on_device_hang() + + def on_device_hang(self): raise RuntimeError(f"{self.device} hang detected") + + def device_props(self) -> dict[str,Any]: return {} # to be overridden if needed. dict keys are backend dependent. + + def count(self) -> int: return self.iface.count if hasattr(self, 'iface') else 1 + + def _select_iface(self): + assert (v:=getenv(k:=f'{type(self).__name__[:-6].upper()}_IFACE', "")) == "", \ + f"{k}={v} is deprecated, use DEV={replace(DEV.target(type(self).__name__[:-6]), interface=v)} instead" + assert hasattr(self, "ifaces"), "must have ifaces to select an iface" + t = DEV.target(dev:=type(self).__name__[:-6]) + filtered = select_by_name(self.ifaces, lambda i: i.__name__[:-5], t.interface, f"{dev} has no interface {t.interface!r}") + filtered = [i for i in filtered if t.interface.startswith("MOCK") or not i.__name__[:-5].startswith("MOCK")] # never fall back to mock ifaces + return select_first_inited([functools.partial(cast(Callable, iface), self, self.device_id) for iface in filtered], + f"No interface for {dev}:{self.device_id} is available") + + def _is_cpu(self) -> bool: return hasattr(self, 'device') and self.device.split(":")[0] == "CPU" + + def finalize(self): + try: self.synchronize() # try to finalize the device in any case + except RuntimeError as e: print(f"{self.device} synchronization failed before finalizing: {e}") + + # if the device has an interface, call device_fini to clean up resources + if hasattr(self, 'iface') and hasattr(self.iface, 'device_fini'): self.iface.device_fini() + +@dataclass +class HCQ2Buffer: + va_addr:sint + meta:Any=None + view:MMIOInterface|None=None + + def offset(self, offset:int, size:int) -> HCQ2Buffer: + return HCQ2Buffer(self.va_addr+offset, meta=self.meta, view=(self.view.view(offset=offset, size=size) if self.view is not None else None)) + +class HCQAllocator(LRUAllocator[HCQDeviceType], Generic[HCQDeviceType]): + def _as_buffer(self, buf:HCQ2Buffer) -> memoryview: + return unwrap(buf.view).mv + + def _map(self, buf:HCQ2Buffer) -> HCQ2Buffer: + if not hasattr(self, '_do_map'): raise NotImplementedError("map failed: no method implemented") + return self._do_map(buf) + + @suppress_finalizing + def _free(self, buf:HCQ2Buffer, options:BufferSpec|None=None): + if options is not None and options.external_ptr is not None: return + self.dev.synchronize() + if hasattr(self, '_do_free'): self._do_free(buf, options) + + def _unmap(self, mb): + self.dev.synchronize() + self.dev.iface.free(mb) + + def _offset(self, buf, size:int, offset:int) -> HCQ2Buffer: return buf.offset(offset=offset, size=size) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/memory.py b/artifacts/package_runtime/tinygrad/runtime/support/memory.py new file mode 100644 index 000000000..ac7239b76 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/memory.py @@ -0,0 +1,281 @@ +import collections, functools, dataclasses, enum +from typing import Any, ClassVar +from tinygrad.helpers import round_up, getenv + +class BumpAllocator: + def __init__(self, size:int, base:int=0, wrap:bool=True): self.size, self.ptr, self.base, self.wrap = size, 0, base, wrap + def alloc(self, size:int, alignment:int=1) -> int: + if round_up(self.ptr, alignment) + size > self.size: + if not self.wrap: raise RuntimeError("Out of memory") + self.ptr = 0 + self.ptr = (res:=round_up(self.ptr, alignment)) + size + return res + self.base + +class TLSFAllocator: + """ + The allocator is based on the Two-Level Segregated Fit (TLSF) algorithm. The allocator maintains 2 level of buckets: + * 1st level is determined by the most significant bit of the size. + * 2nd level splits the covered memory of 1st level into @lv2_cnt entries. + + For each allocation request, the allocator searches for the smallest block that can fit the requested size. + For each deallocation request, the allocator merges the block with its neighbors if they are free. + """ + + def __init__(self, size:int, base:int=0, block_size:int=16, lv2_cnt:int=16): + self.size, self.base, self.block_size, self.l2_cnt = size, base, block_size, lv2_cnt.bit_length() + self.storage:list = [collections.defaultdict(list) for _ in range(size.bit_length() + 1)] + self.lv1_entries:list[int] = [0] * len(self.storage) + + # self.blocks is more like a linked list, where each entry is a contiguous block. + self.blocks:dict[int, tuple[int, int|None, int|None, bool]] = {0: (size, None, None, True)} # size, next, prev, is_free + if size > 0: self._insert_block(0, size) + + @functools.cache # pylint: disable=method-cache-max-size-none + def lv1(self, size): return size.bit_length() + + @functools.cache # pylint: disable=method-cache-max-size-none + def lv2(self, size): return (size - (1 << (size.bit_length() - 1))) // (1 << max(0, size.bit_length() - self.l2_cnt)) + + def _insert_block(self, start:int, size:int, prev:int|None=None): + if prev is None: prev = self.blocks[start][2] + self.storage[self.lv1(size)][self.lv2(size)].append(start) + self.lv1_entries[self.lv1(size)] += 1 + self.blocks[start] = (size, start + size, prev, True) + return self + + def _remove_block(self, start:int, size:int, prev:int|None=None): + if prev is None: prev = self.blocks[start][2] + self.storage[self.lv1(size)][self.lv2(size)].remove(start) + self.lv1_entries[self.lv1(size)] -= 1 + self.blocks[start] = (size, start + size, prev, False) + return self + + def _split_block(self, start:int, size:int, new_size:int): + nxt = self.blocks[start][1] + assert self.blocks[start][3], "block must be free" + self._remove_block(start, size)._insert_block(start, new_size)._insert_block(start + new_size, size - new_size, prev=start) + if nxt in self.blocks: self.blocks[nxt] = (self.blocks[nxt][0], self.blocks[nxt][1], start + new_size, self.blocks[nxt][3]) + return self + + def _merge_right(self, start:int): + size, nxt, _, is_free = self.blocks[start] + assert is_free, "block must be free" + + while is_free and nxt in self.blocks: + if (blk:=self.blocks[nxt])[3] is False: break + self._remove_block(start, size)._remove_block(nxt, blk[0])._insert_block(start, size:=size + blk[0]) + assert self.blocks[start][1] == blk[1] + _, nxt, _, _ = self.blocks.pop(nxt) + + if nxt in self.blocks: self.blocks[nxt] = (self.blocks[nxt][0], self.blocks[nxt][1], start, self.blocks[nxt][3]) + + def _merge_block(self, start:int): + # Go left while blocks are free. Then merge all them right. + while (x:=self.blocks[start][2]) is not None and self.blocks[x][3] is True: start = x + self._merge_right(start) + + def alloc(self, req_size:int, align:int=1) -> int: + req_size = max(self.block_size, req_size) # at least block size. + size = max(self.block_size, req_size + align - 1) + + # Round up the allocation size to the next bucket, so any entry there can fit the requested size. + size = round_up(size, (1 << size.bit_length() - self.l2_cnt)) + + # Search for the smallest block that can fit the requested size. Start with its bucket and go up until any block is found. + for l1 in range(self.lv1(size), len(self.storage)): + if self.lv1_entries[l1] == 0: continue + for l2 in range(self.lv2(size) if l1 == size.bit_length() else 0, (1 << self.l2_cnt)): + if len(self.storage[l1][l2]) > 0: + # Block start address. + start = self.storage[l1][l2][0] + nsize = self.blocks[start][0] + assert nsize >= size, "block must be larger" + + # If request contains alignment, split the block into two parts. + if (new_start:=round_up(start, align)) != start: + self._split_block(start, nsize, new_start - start) + start, nsize = new_start, self.blocks[new_start][0] + + # If the block is larger than the requested size, split it into two parts. + if nsize > req_size: self._split_block(start, nsize, req_size) + self._remove_block(start, req_size) # Mark the block as allocated. + return start + self.base + raise MemoryError(f"Can't allocate {req_size} bytes") + + def free(self, start:int): + self._insert_block(start - self.base, self.blocks[start - self.base][0])._merge_block(start - self.base) + +# Memory Management + +class AddrSpace(enum.Enum): PHYS = enum.auto(); SYS = enum.auto(); PEER = enum.auto() # noqa: E702 + +@dataclasses.dataclass(frozen=True) +class VirtMapping: va_addr:int; size:int; paddrs:list[tuple[int, int]]; aspace:AddrSpace; uncached:bool=False; snooped:bool=False # noqa: E702 + +class PageTableTraverseContext: + def __init__(self, dev, pt, vaddr, create_pts=False, free_pts=False, inspect=False, boot=False): + self.dev, self.vaddr, self.create_pts, self.free_pts, self.inspect, self.boot = dev, vaddr - dev.mm.va_base, create_pts, free_pts, inspect, boot + self.pt_stack:list[tuple[Any, int, int]] = [(pt, self._pt_pte_idx(pt, self.vaddr), self._pt_pte_size(pt))] + + def _pt_pte_cnt(self, lv): return self.dev.mm.pte_cnt[lv] + def _pt_pte_size(self, pt): return self.dev.mm.pte_covers[pt.lv] + def _pt_pte_idx(self, pt, va): return (va // self._pt_pte_size(pt)) % self._pt_pte_cnt(pt.lv) + + def level_down(self): + pt, pte_idx, _ = self.pt_stack[-1] + + if not pt.valid(pte_idx): + assert self.create_pts, "Not allowed to create new page table" + pt.set_entry(pte_idx, self.dev.mm.palloc(0x1000, zero=True, boot=self.boot, ptable=True), table=True, valid=True) + + assert not pt.is_page(pte_idx), f"Must be table pt={pt.paddr:#x}, {pt.lv=} {pte_idx=} {pt.entry(pte_idx)=:#x}" + child_page_table = self.dev.mm.pt_t(self.dev, pt.address(pte_idx), lv=pt.lv+1) + + self.pt_stack.append((child_page_table, self._pt_pte_idx(child_page_table, self.vaddr), self._pt_pte_size(child_page_table))) + return self.pt_stack[-1] + + def _try_free_pt(self) -> bool: + pt, _, _ = self.pt_stack[-1] + if self.free_pts and pt != self.dev.mm.root_page_table and all(not pt.valid(i) for i in range(self._pt_pte_cnt(self.pt_stack[-1][0].lv))): + self.dev.mm.pfree(pt.paddr, ptable=True) + parent_pt, parent_pte_idx, _ = self.pt_stack[-2] + parent_pt.set_entry(parent_pte_idx, 0x0, valid=False) + return True + return False + + def level_up(self): + while self._try_free_pt() or self.pt_stack[-1][1] == self._pt_pte_cnt(self.pt_stack[-1][0].lv): + pt, pt_cnt, _ = self.pt_stack.pop() + if pt_cnt == self._pt_pte_cnt(pt.lv): self.pt_stack[-1] = (self.pt_stack[-1][0], self.pt_stack[-1][1] + 1, self.pt_stack[-1][2]) + + def next(self, size:int, paddr:int|None=None, off:int=0): + while size > 0: + pt, pte_idx, pte_covers = self.pt_stack[-1] + + # create_pts goes down until the page covers the request. + # free_pts goes down to the table, it assumses all entries are valid on the range (and validates that) + # inspect just visits any valid ranges and yields them. + if self.create_pts: + assert paddr is not None, "paddr must be provided when allocating new page tables" + while pte_covers > size or not pt.supports_huge_page(paddr+off) or self.vaddr&(pte_covers-1) != 0: pt, pte_idx, pte_covers = self.level_down() + else: + while not pt.is_page(pte_idx) and (self.free_pts or pt.valid(pte_idx)): pt, pte_idx, pte_covers = self.level_down() + + entries = max(min(size // pte_covers, self._pt_pte_cnt(pt.lv) - pte_idx), 1 if self.inspect else 0) + assert entries > 0, f"Invalid entries {size=:#x}, {pte_covers=:#x}" + yield off, pt, pte_idx, entries, pte_covers + + size, off, self.vaddr = size - entries * pte_covers, off + entries * pte_covers, self.vaddr + entries * pte_covers + self.pt_stack[-1] = (pt, pte_idx + entries, pte_covers) + self.level_up() + +class MemoryManager: + va_allocator: ClassVar[TLSFAllocator|None] = None + + def __init__(self, dev, vram_size:int, boot_size:int, pt_t, va_bits:int, va_shifts:list[int], va_base:int, + palloc_ranges:list[tuple[int, int]], first_lv:int=0, reserve_ptable=False): + self.dev, self.vram_size, self.va_shifts, self.va_base, lvl_msb = dev, vram_size, va_shifts, va_base, va_shifts + [va_bits + 1] + self.pte_covers, self.pte_cnt = [1 << x for x in va_shifts][::-1], [1 << (lvl_msb[i+1] - lvl_msb[i]) for i in range(len(lvl_msb) - 1)][::-1] + self.pt_t, self.palloc_ranges, self.level_cnt, self.va_bits, self.reserve_ptable = pt_t, palloc_ranges, len(va_shifts), va_bits, reserve_ptable + + self.boot_allocator = TLSFAllocator(boot_size, base=0) + self.ptable_allocator = TLSFAllocator(round_up(vram_size // 512, 1 << 20) if self.reserve_ptable else 0, base=self.boot_allocator.size) + self.pa_allocator = TLSFAllocator(vram_size - (off_sz:=self.boot_allocator.size + self.ptable_allocator.size), base=off_sz) + self.root_page_table = pt_t(self.dev, self.palloc(0x1000, zero=not self.dev.smi_dev, boot=True), lv=first_lv) + + def _frag_size(self, va, sz, must_cover=True): + """ + Calculate the tlb fragment size for a given virtual address and size. + If must_cover is True, the fragment size must cover the size, otherwise the biggest fragment size that fits the size is returned. + Fragment 0 is 4KB, 1 is 8KB and so on. + """ + va_pwr2_div, sz_pwr2_div, sz_pwr2_max = va & -(va) if va > 0 else (1 << 63), sz & -(sz), (1 << (sz.bit_length() - 1)) + return (min(va_pwr2_div, sz_pwr2_div) if must_cover else min(va_pwr2_div, sz_pwr2_max)).bit_length() - 1 - 12 + + def page_tables(self, vaddr:int, size:int): + ctx = PageTableTraverseContext(self.dev, self.root_page_table, vaddr, create_pts=True) + for _ in ctx.next(size, paddr=0): return [pt for pt, _, _ in ctx.pt_stack] + + def map_range(self, vaddr:int, size:int, paddrs:list[tuple[int, int]], aspace:AddrSpace, uncached=False, snooped=False, boot=False) -> VirtMapping: + if getenv("MM_DEBUG", 0): print(f"mm {self.dev.devfmt}: mapping {vaddr=:#x} ({size=:#x})") + + assert size == sum(p[1] for p in paddrs), f"Size mismatch {size=} {sum(p[1] for p in paddrs)=}" + + ctx = PageTableTraverseContext(self.dev, self.root_page_table, vaddr, boot=boot, inspect=True) + for _, pt, pte_idx, pte_cnt, _ in ctx.next(size): + for pte_off in range(pte_cnt): assert not pt.valid(pte_idx + pte_off), f"PTE already mapped: {pt.entry(pte_idx + pte_off):#x}" + + ctx = PageTableTraverseContext(self.dev, self.root_page_table, vaddr, create_pts=True, boot=boot) + for paddr, psize in paddrs: + for off, pt, pte_idx, pte_cnt, pte_covers in ctx.next(psize, paddr=paddr): + for pte_off in range(pte_cnt): + pt.set_entry(pte_idx + pte_off, paddr + off + pte_off * pte_covers, uncached=uncached, aspace=aspace, snooped=snooped, + frag=self._frag_size(ctx.vaddr+off, pte_cnt * pte_covers), valid=True) + + self.on_range_mapped() + return VirtMapping(vaddr, size, paddrs, aspace=aspace, uncached=uncached, snooped=snooped) + + def unmap_range(self, vaddr:int, size:int): + if getenv("MM_DEBUG", 0): print(f"mm {self.dev.devfmt}: unmapping {vaddr=:#x} ({size=:#x})") + + ctx = PageTableTraverseContext(self.dev, self.root_page_table, vaddr, free_pts=True) + for _, pt, pte_idx, pte_cnt, _ in ctx.next(size): + for pte_id in range(pte_idx, pte_idx + pte_cnt): + assert pt.valid(pte_id), f"PTE not mapped: {pt.entry(pte_id):#x}" + pt.set_entry(pte_id, paddr=0x0, valid=False) + + def on_range_mapped(self): pass + + @classmethod + def alloc_vaddr(cls, size:int, align=0x1000) -> int: + assert cls.va_allocator is not None, "must be set" + return cls.va_allocator.alloc(size, max((1 << (size.bit_length() - 1)), align)) + + @functools.cache # pylint: disable=method-cache-max-size-none + def identity_va(self, uncached:bool) -> int: + self.map_range(va:=self.alloc_vaddr(self.vram_size, self.vram_size), self.vram_size, [(0, self.vram_size)], AddrSpace.PHYS, uncached=uncached) + return va + + def valloc(self, size:int, align=0x1000, uncached=False, contiguous=False) -> VirtMapping: + if not getenv("GMMU", 1): + paddr = self.palloc(size:=round_up(size, 0x1000), align, zero=False) + return VirtMapping(self.identity_va(uncached) + paddr, size, [(paddr, size)], aspace=AddrSpace.PHYS, uncached=uncached) + + # Alloc physical memory and map it to the virtual address + va = self.alloc_vaddr(size:=round_up(size, 0x1000), align) + + if contiguous: paddrs = [(self.palloc(size, zero=True), size)] + else: + # Traverse the PT to find the largest contiguous sizes we need to allocate. Try to allocate the longest segment to reduce TLB pressure. + nxt_range, rem_size, paddrs = 0, size, [] + while rem_size > 0: + while self.palloc_ranges[nxt_range][0] > rem_size: nxt_range += 1 + + try: paddrs += [(self.palloc(try_sz:=self.palloc_ranges[nxt_range][0], self.palloc_ranges[nxt_range][1], zero=False), try_sz)] + except MemoryError: + # Move to a smaller size and try again. + nxt_range += 1 + if nxt_range == len(self.palloc_ranges): + for paddr, _ in paddrs: self.pfree(paddr) + raise MemoryError(f"Failed to allocate memory (OOM). Request size={size:#x} ({self.palloc_ranges[nxt_range-1]})") + continue + rem_size -= self.palloc_ranges[nxt_range][0] + + return self.map_range(va, size, paddrs, aspace=AddrSpace.PHYS, uncached=uncached) + + def vfree(self, vm:VirtMapping): + if not getenv("GMMU", 1): return self.pfree(vm.paddrs[0][0]) + + assert self.va_allocator is not None, "must be set" + self.unmap_range(vm.va_addr, vm.size) + self.va_allocator.free(vm.va_addr) + for paddr, _ in vm.paddrs: self.pfree(paddr) + + def palloc(self, size:int, align:int=0x1000, zero=True, boot=False, ptable=False) -> int: + assert self.dev.is_booting == boot, "During booting, only boot memory can be allocated" + allocator = self.boot_allocator if boot else (self.ptable_allocator if self.reserve_ptable and ptable else self.pa_allocator) + paddr = allocator.alloc(round_up(size, 0x1000), align) + if zero: self.dev.vram[paddr:paddr+size] = bytes(size) + return paddr + + def pfree(self, paddr:int, ptable=False): (self.ptable_allocator if self.reserve_ptable and ptable else self.pa_allocator).free(paddr) diff --git a/artifacts/package_runtime/tinygrad/runtime/support/mlx/__init__.py b/artifacts/package_runtime/tinygrad/runtime/support/mlx/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/support/mlx/mlxdev.py b/artifacts/package_runtime/tinygrad/runtime/support/mlx/mlxdev.py new file mode 100644 index 000000000..a93319bf5 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/mlx/mlxdev.py @@ -0,0 +1,248 @@ +from __future__ import annotations +import struct, random, socket, ctypes, functools, itertools +from tinygrad.helpers import getenv, wait_cond, round_up, next_power2, ceildiv, DEBUG, hi32, lo32, to_be32, to_be64 +from tinygrad.runtime.support.memory import BumpAllocator +from tinygrad.runtime.support.system import PCIDevice +from tinygrad.runtime.autogen import mlx5, pci + +MLX_DEBUG = getenv("MLX_DEBUG", 0) + +MLX5_CMD_STRUCTS = {v: (getattr(mlx5, f"struct_mlx5_ifc_{n[12:].lower()}_in_bits", None), + getattr(mlx5, f"struct_mlx5_ifc_{n[12:].lower()}_out_bits", None)) for n, v in mlx5.__dict__.items() if n.startswith("MLX5_CMD_OP_")} +MLX5_CMD_STRUCTS[mlx5.MLX5_CMD_OP_ACCESS_REG] = (mlx5.struct_mlx5_ifc_access_register_in_bits, mlx5.struct_mlx5_ifc_access_register_out_bits) + +def ipv4_to_gid(ip): return bytes(10) + b'\xff\xff' + socket.inet_aton(ip) + +def udp_sport(lqpn, rqpn): + v = (lqpn * rqpn ^ ((lqpn * rqpn) >> 20) ^ ((lqpn * rqpn) >> 40)) & 0xFFFFF + return ((v & 0x3FFF) ^ ((v & 0xFC000) >> 14)) | 0xC000 + +def ifc_get(buf, bit_off, width): + byte_off, bit_in, n = bit_off // 8, bit_off % 8, (bit_off % 8 + width + 7) // 8 + return (int.from_bytes(buf[byte_off:byte_off + n], 'big') >> (n * 8 - bit_in - width)) & ((1 << width) - 1) + +def ifc_set(buf, bit_off, width, value): + byte_off, bit_in, n = bit_off // 8, bit_off % 8, (bit_off % 8 + width + 7) // 8 + shift, val = n * 8 - bit_in - width, int.from_bytes(buf[byte_off:byte_off + n], 'big') + buf[byte_off:byte_off + n] = ((val & ~(((1 << width) - 1) << shift)) | ((value & ((1 << width) - 1)) << shift)).to_bytes(n, 'big') + +@functools.cache +def ifc_fields(ifc_struct): return {name: (off, ctypes.sizeof(typ)) for name, typ, off in ifc_struct._real_fields_ if not name.startswith('reserved')} + +def ifc_subfield(ifc_struct, field_name): + for name, typ, off in ifc_struct._real_fields_: + if name == field_name: return typ, ifc_fields(ifc_struct)[field_name][0] + raise KeyError(f"no field '{field_name}' in {ifc_struct}") + +def fill_ifc(buf, ifc_struct, base=0, **kw): + fields = ifc_fields(ifc_struct) + for name, val in kw.items(): + if isinstance(val, dict): + sub_struct, sub_off = ifc_subfield(ifc_struct, name) + fill_ifc(buf, sub_struct, base=base + sub_off, **val) + else: ifc_set(buf, base + fields[name][0], fields[name][1], val) + +def ifc_decode(buf, ifc_struct, base=0):return {name: ifc_get(buf, base + off, width) for name, (off, width) in ifc_fields(ifc_struct).items()} + +class MLXCmdQueue: + def __init__(self, dev): + self.dev, self._tok = dev, itertools.count(1) + + cmd_l = dev.iseg_r('cmdq_addr_l_sz') & 0xFF + self.log_stride, self.max_reg_cmds = cmd_l & 0xF, (1 << ((cmd_l >> 4) & 0xF)) - 1 + + stride = next_power2(ctypes.sizeof(mlx5.struct_mlx5_cmd_prot_block)) + self.queue, self.queue_paddrs = dev.pci_dev.alloc_sysmem(0x1000 + 1024 * stride) + self.mboxes = [(off:=0x1000 + i * stride, self.queue_paddrs[1 + (i * stride) // 0x1000] + (off % 0x1000)) for i in range(1024)] + + dev.iseg_w('cmdq_addr_h', hi32(self.queue_paddrs[0])) + dev.iseg_w('cmdq_addr_l_sz', lo32(self.queue_paddrs[0]) | cmd_l) + + def create_mbox_chain(self, base, tok, data): + n = ceildiv(len(data), chunk_sz:=mlx5.MLX5_CMD_DATA_BLOCK_SIZE) + for i in range(n): + off, _ = self.mboxes[base + i] + blk = mlx5.struct_mlx5_cmd_prot_block(data=(ctypes.c_ubyte*chunk_sz).from_buffer_copy(data[i*chunk_sz:(i+1)*chunk_sz].ljust(chunk_sz, b'\x00')), + next=to_be64(self.mboxes[base+i+1][1]) if i < n-1 else 0, block_num=to_be32(i), token=tok) + self.queue[off:off + ctypes.sizeof(mlx5.struct_mlx5_cmd_prot_block)] = bytes(blk) + return (self.mboxes[base][0], self.mboxes[base][1], n) + + def exec(self, opcode, op_mod=0, payload=b'', raw=False, **kw): + in_struct, out_struct = MLX5_CMD_STRUCTS[opcode] + out_sz = max(0, ctypes.sizeof(out_struct) - 16) if out_struct else 0 + tok, slot = (next(self._tok) % 255) + 1, self.max_reg_cmds if opcode == mlx5.MLX5_CMD_OP_MANAGE_PAGES else 0 + + # serialize input + inp_sz = max(16, ceildiv(max((off + w for off, w in ifc_fields(in_struct).values()), default=0), 8)) + fill_ifc(inp:=bytearray(inp_sz + len(payload)), in_struct, opcode=opcode, op_mod=op_mod, **kw) + if payload: inp[inp_sz:] = payload + + # prepare mailboxes and build command layout + _, in_ptr, n_in = self.create_mbox_chain(0, tok, inp[16:]) + _, out_ptr, n_out = self.create_mbox_chain(n_in, tok, bytes(out_sz)) + cmd = mlx5.struct_mlx5_cmd_layout(type=mlx5.MLX5_PCI_CMD_XPORT, inlen=to_be32(len(inp)), in_ptr=to_be64(in_ptr), + _in=(ctypes.c_uint32*4)(*(int.from_bytes(inp[i:i+4], 'little') for i in range(0, 16, 4))), + out_ptr=to_be64(out_ptr), outlen=to_be32(16 + out_sz), token=tok, status_own=mlx5.CMD_OWNER_HW) + cmd_bytes = bytearray(bytes(cmd)) + cmd_bytes[mlx5.struct_mlx5_cmd_layout.sig.offset] = (~functools.reduce(lambda a, b: a ^ b, cmd_bytes)) & 0xFF # type: ignore[attr-defined] + + # submit and wait for completion + slot_view = self.queue.view(slot << self.log_stride, len(cmd_bytes)) + slot_view[:] = cmd_bytes + self.dev.iseg_w('cmd_dbell', 1 << slot) + wait_cond(lambda: slot_view[mlx5.struct_mlx5_cmd_layout.status_own.offset] & mlx5.CMD_OWNER_HW, value=0, # type: ignore[attr-defined] + msg=f"cmd 0x{opcode:04x}") + + # check status and read output + assert slot_view[mlx5.struct_mlx5_cmd_layout.status_own.offset] >> 1 == 0, f"cmd 0x{opcode:04x} delivery error" # type: ignore[attr-defined] + + out_view = slot_view.view(mlx5.struct_mlx5_cmd_layout.out.offset, 16 + out_sz) # type: ignore[attr-defined] + status, syndrome = struct.unpack('>I', out_view[0:4])[0] >> 24, struct.unpack('>I', out_view[4:8])[0] + assert status == 0, f"cmd 0x{opcode:04x} failed status=0x{status:x} syn=0x{syndrome:08x}" + + ret = bytearray(out_view[:16]) + ret += b''.join(bytes(self.queue[va:va + mlx5.MLX5_CMD_DATA_BLOCK_SIZE]) for va, _ in self.mboxes[n_in:n_in+n_out])[:out_sz] + return ret if raw else (ifc_decode(ret, out_struct) if out_struct else ret) + +class MLXDev: + def __init__(self, pci_dev:PCIDevice, ip:str=getenv("MLX_IP", "10.0.0.1")): + self.pci_dev, self.devfmt, self.bar = pci_dev, pci_dev.pcibus, pci_dev.map_bar(0, fmt='I') + + fw_rev, cmdif_sub = self.iseg_r('fw_rev'), self.iseg_r('cmdif_rev_fw_sub') + if DEBUG >= 2: print(f"mlx5 {self.devfmt}: firmware {fw_rev >> 16}.{fw_rev & 0xFFFF}.{cmdif_sub & 0xFFFF}") + assert (cmdif_sub >> 16) == 5, f"unsupported mlx version: {cmdif_sub >> 16}" + + self.init_hw(ip) + + def rreg(self, off): return to_be32(self.bar[off // 4]) + def wreg(self, off, val): self.bar[off // 4] = to_be32(val) + def iseg_r(self, field): return self.rreg(getattr(mlx5.struct_mlx5_init_seg, field).offset) + def iseg_w(self, field, val): self.wreg(getattr(mlx5.struct_mlx5_init_seg, field).offset, val) + + def init_hw(self, ip): + wait_cond(lambda: self.iseg_r('initializing') & 0x80000000, value=0, msg="FW init timeout") + self.pci_dev.write_config(pci.PCI_COMMAND, self.pci_dev.read_config(pci.PCI_COMMAND, 2) | pci.PCI_COMMAND_MASTER, 2) + self.cmd = MLXCmdQueue(self) + wait_cond(lambda: self.iseg_r('initializing') & 0x80000000, value=0, msg="FW init timeout") + + self.cmd.exec(mlx5.MLX5_CMD_OP_ENABLE_HCA) + if self.cmd.exec(mlx5.MLX5_CMD_OP_QUERY_ISSI)['supported_issi_dw0'] & 2: + self.cmd.exec(mlx5.MLX5_CMD_OP_SET_ISSI, current_issi=1) + + self.provide_pages(mlx5.MLX5_BOOT_PAGES) + self.cmd.exec(mlx5.MLX5_CMD_OP_ACCESS_REG, register_id=mlx5.MLX5_REG_HOST_ENDIANNESS, payload=bytearray(16)) + + self.init_hca() + + self.uar = self.cmd.exec(mlx5.MLX5_CMD_OP_ALLOC_UAR)['uar'] + self.uar_view = self.pci_dev.map_bar(0, off=self.uar * 0x1000, size=0x1000, fmt='Q') + + vport = self.cmd.exec(mlx5.MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT, raw=True) + nvc_struct, nvc_off = ifc_subfield(mlx5.struct_mlx5_ifc_query_nic_vport_context_out_bits, 'nic_vport_context') + mac_struct, mac_off = ifc_subfield(nvc_struct, 'permanent_address') + self.mac = ifc_get(vport, nvc_off + mac_off + 16, 48) + + # enable roce + self.cmd.exec(mlx5.MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT, field_select=dict(roce_en=1), nic_vport_context=dict(roce_en=1)) + + dbr_mem, self.dbr_paddrs = self.pci_dev.alloc_sysmem(0x1000) + self.dbr = dbr_mem.view(fmt='I') + self.dbr_alloc = BumpAllocator(0x1000, wrap=False) + + self.pd = self.cmd.exec(mlx5.MLX5_CMD_OP_ALLOC_PD)['pd'] + res = self.cmd.exec(mlx5.MLX5_CMD_OP_CREATE_MKEY, memory_key_mkey_entry=dict(access_mode_1_0=0, rw=1, rr=1, lw=1, lr=1, qpn=0xFFFFFF, + mkey_7_0=(key_lo:=0x22), length64=1, pd=self.pd)) + self.mkey = (res['mkey_index'] << 8) | key_lo + + self.local_gid = ipv4_to_gid(ip) + self.cmd.exec(mlx5.MLX5_CMD_OP_SET_ROCE_ADDRESS, roce_address=dict(roce_version=2, source_l3_address=int.from_bytes(self.local_gid, 'big'), + roce_l3_type=0, source_mac_47_32=hi32(self.mac), source_mac_31_0=lo32(self.mac)), roce_address_index=0, vhca_port_num=1) + + if DEBUG >= 2: print(f"mlx5 {self.devfmt}: booted mac={self.mac.to_bytes(6,'big').hex(':')} mkey=0x{self.mkey:x}") + + def register_mem(self, paddrs:list[int], size:int, log_page_size:int=12) -> int: + n = len(paddrs) + mtt = struct.pack(f'>{round_up(n, 2)}Q', *paddrs, *([0] * (round_up(n, 2) - n))) + if MLX_DEBUG >= 1: print(f"mlx5 {self.devfmt}: register_mem pages={n} page_sz={1 << log_page_size} mtt_bytes={len(mtt)}") + self.provide_pages(mlx5.MLX5_INIT_PAGES) + res = self.cmd.exec(mlx5.MLX5_CMD_OP_CREATE_MKEY, translations_octword_actual_size=ceildiv(n, 2), payload=mtt, + memory_key_mkey_entry=dict(access_mode_1_0=1, lr=1, lw=1, rr=1, rw=1, pd=self.pd, qpn=0xFFFFFF, mkey_7_0=(key_lo:=0x33), + start_addr=paddrs[0], len=size, log_page_size=log_page_size, translations_octword_size=ceildiv(n, 2))) + return (res['mkey_index'] << 8) | key_lo + + def unregister_mem(self, mkey:int): self.cmd.exec(mlx5.MLX5_CMD_OP_DESTROY_MKEY, mkey_index=mkey >> 8) + + def provide_pages(self, mode): + if (npages:=self.cmd.exec(mlx5.MLX5_CMD_OP_QUERY_PAGES, op_mod=mode)['num_pages']) <= 0: return + if MLX_DEBUG >= 1: print(f"mlx5 {self.devfmt}: provide_pages mode={mode}, {npages} pages") + mem, paddrs = self.pci_dev.alloc_sysmem(npages * 0x1000) + self.cmd.exec(mlx5.MLX5_CMD_OP_MANAGE_PAGES, op_mod=mlx5.MLX5_PAGES_GIVE, input_num_entries=npages, payload=struct.pack(f'>{npages}Q', *paddrs)) + + def hca_query_cap(self, cap_type, cap_struct, mode): + raw = bytearray(self.cmd.exec(mlx5.MLX5_CMD_OP_QUERY_HCA_CAP, op_mod=(cap_type << 1) | mode, raw=True)[16:16+4096]) + return raw, ifc_decode(raw, cap_struct) + + def hca_set_cap(self, cap_type, cap_struct, raw, **kwargs): + fill_ifc(cap:=bytearray(raw), cap_struct, **kwargs) + self.cmd.exec(mlx5.MLX5_CMD_OP_SET_HCA_CAP, op_mod=cap_type << 1, capability=int.from_bytes(cap[:4096].ljust(4096, b'\x00'), 'big')) + + def init_hca(self): + gen_caps, gen_cur = self.hca_query_cap(mlx5.MLX5_CAP_GENERAL, mlx5.struct_mlx5_ifc_cmd_hca_cap_bits, mode=1) + self.hca_set_cap(mlx5.MLX5_CAP_GENERAL, mlx5.struct_mlx5_ifc_cmd_hca_cap_bits, gen_caps, + pkey_table_size=0, cmdif_checksum=0, log_uar_page_sz=0, log_max_qp=18, roce=1) + + roce_cur_raw, roce_cur = self.hca_query_cap(mlx5.MLX5_CAP_ROCE, mlx5.struct_mlx5_ifc_roce_cap_bits, mode=1) + self.hca_set_cap(mlx5.MLX5_CAP_ROCE, mlx5.struct_mlx5_ifc_roce_cap_bits, roce_cur_raw, sw_r_roce_src_udp_port=1) + + self.provide_pages(mlx5.MLX5_INIT_PAGES) + self.cmd.exec(mlx5.MLX5_CMD_OP_INIT_HCA, sw_owner_id=random.getrandbits(128)) + + _, self.caps = self.hca_query_cap(mlx5.MLX5_CAP_GENERAL, mlx5.struct_mlx5_ifc_cmd_hca_cap_bits, 1) + + if MLX_DEBUG >= 4: print(f"mlx5 {self.devfmt}: HCA initialized with gen_caps={gen_cur} roce_caps={roce_cur}") + +class MLXQP: + def __init__(self, dev:MLXDev, log_sq_size=4, log_rq_size=4, log_eq_size=7, log_cq_size=7): + self.dev, self.cq_size, self.log_sq_size, self.log_rq_size, self.head = dev, 1 << log_cq_size, log_sq_size, log_rq_size, 0 + + self.cq_dbr, self.qp_dbr = dev.dbr_alloc.alloc(8, alignment=8), dev.dbr_alloc.alloc(8, alignment=8) + + # create EQ, CQ + self.eq_mem, self.eq_paddrs, self.eq_info = self.create_queue(mlx5.MLX5_CMD_OP_CREATE_EQ, log_eq_size, entry_sz=64, owner_off=31, + eq_context_entry=dict(log_eq_size=log_eq_size, uar_page=dev.uar, log_page_size=0)) + + self.cq_mem, self.cq_paddrs, self.cq_info = self.create_queue(mlx5.MLX5_CMD_OP_CREATE_CQ, log_cq_size, entry_sz=64, owner_off=63, + cq_context=dict(log_cq_size=log_cq_size, uar_page=dev.uar, c_eqn_or_apu_element=self.eq_info['eq_number'], + dbr_addr=dev.dbr_paddrs[0] + self.cq_dbr, log_page_size=0)) + + # create QP, buffer is RQ (16B stride) + SQ (64B stride) + self.sq_offset = (1 << log_rq_size) << 4 + self.qp_buf, self.qp_paddrs, self.qp_info = self.create_queue(mlx5.MLX5_CMD_OP_CREATE_QP, log_sq_size, entry_sz=64, + owner_off=0, extra_sz=self.sq_offset, + qpc=dict(st=0, pm_state=3, pd=dev.pd, cqn_snd=self.cq_info['cqn'], cqn_rcv=self.cq_info['cqn'], log_msg_max=30, log_rq_size=log_rq_size, + log_rq_stride=0, log_sq_size=log_sq_size, rlky=1, uar_page=dev.uar, log_page_size=0, dbr_addr=dev.dbr_paddrs[0] + self.qp_dbr)) + + # transition to INIT + self.qp_op(mlx5.MLX5_CMD_OP_RST2INIT_QP, qpc_args=dict(log_ack_req_freq=8), addr_args=dict(pkey_index=0, vhca_port_num=1)) + + for i in range(self.cq_size): self.cq_mem[i * 64 + 63] = 0x01 # init owner bits so poll_cq waits for real CQEs + if MLX_DEBUG >= 1: print(f"mlx5: QP 0x{self.qp_info['qpn']:x} (EQ={self.eq_info['eq_number']} CQ=0x{self.cq_info['cqn']:x})") + + def create_queue(self, opcode, log_size, entry_sz, owner_off, extra_sz=0, **ctx_kw): + mem, paddrs = self.dev.pci_dev.alloc_sysmem((n := ceildiv((1 << log_size) * entry_sz + extra_sz, 0x1000)) * 0x1000) + return mem, paddrs, self.dev.cmd.exec(opcode, payload=struct.pack(f'>{n}Q', *paddrs), **ctx_kw) + + def qp_op(self, opcode, qpc_args=None, addr_args=None, **kwargs): + qpc_args = dict(st=0, pm_state=3, pd=self.dev.pd, cqn_snd=self.cq_info['cqn'], cqn_rcv=self.cq_info['cqn'], **(qpc_args or {})) + self.dev.cmd.exec(opcode, qpn=self.qp_info['qpn'], qpc=(qpc_args or {}) | {'primary_address_path': addr_args or {}}, **kwargs) + + def connect(self, remote:MLXQP): + self.qp_op(mlx5.MLX5_CMD_OP_INIT2RTR_QP, opt_param_mask=0x1A, + qpc_args=dict(mtu=5, log_msg_max=self.dev.caps['log_max_msg'], remote_qpn=remote.qp_info['qpn'], log_ack_req_freq=8, + log_rra_max=3, rre=1, rwe=1, min_rnr_nak=1, next_rcv_psn=0), + addr_args=dict(pkey_index=0, src_addr_index=0, hop_limit=64, udp_sport=udp_sport(self.qp_info['qpn'], remote.qp_info['qpn']), vhca_port_num=1, + rmac_47_32=hi32(remote.dev.mac), rmac_31_0=lo32(remote.dev.mac), rgid_rip=int.from_bytes(remote.dev.local_gid, 'big'))) + self.qp_op(mlx5.MLX5_CMD_OP_RTR2RTS_QP, qpc_args=dict(log_ack_req_freq=8, next_send_psn=0, log_sra_max=3, retry_count=7, rnr_retry=7), + addr_args=dict(ack_timeout=14, vhca_port_num=1)) + + if MLX_DEBUG >= 1: print(f"mlx5: QP 0x{self.qp_info['qpn']:x} connected (remote=0x{remote.qp_info['qpn']:x})") diff --git a/artifacts/package_runtime/tinygrad/runtime/support/nv/__init__.py b/artifacts/package_runtime/tinygrad/runtime/support/nv/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/runtime/support/nv/ip.py b/artifacts/package_runtime/tinygrad/runtime/support/nv/ip.py new file mode 100644 index 000000000..75a208d05 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/nv/ip.py @@ -0,0 +1,650 @@ +from __future__ import annotations +import ctypes, time, array, struct, itertools, dataclasses +from typing import cast, Any +from tinygrad.runtime.autogen import nv, nv_570 as nv_gpu, pci +from tinygrad.helpers import lo32, hi32, DEBUG, round_up, round_down, fetch_fw, wait_cond, ceildiv +from tinygrad.runtime.support.system import System +from tinygrad.runtime.support.hcq import MMIOInterface +from tinygrad.runtime.support.elf import elf_loader + +@dataclasses.dataclass(frozen=True) +class GRBufDesc: size:int; virt:bool; phys:bool; local:bool=False # noqa: E702 + +class NV_IP: + def __init__(self, nvdev): self.nvdev = nvdev + def init_sw(self): pass # Prepare sw/allocations for this IP + def init_hw(self): pass # Initialize hw for this IP + def fini_hw(self): pass # Finalize hw for this IP + +class NVRpcQueue: + def __init__(self, gsp:NV_GSP, view:MMIOInterface, completion_q_view:MMIOInterface|None=None): + self.tx_view = view.view(fmt='I') + wait_cond(lambda: self.tx_view[getattr(nv.msgqTxHeader, 'entryOff').offset // 4], value=0x1000, msg="RPC queue not initialized") + self.tx = nv.msgqTxHeader.from_buffer_copy(bytes(view[:ctypes.sizeof(nv.msgqTxHeader)])) + + if completion_q_view is not None: + comp_tx = nv.msgqTxHeader.from_buffer_copy(bytes(completion_q_view[:ctypes.sizeof(nv.msgqTxHeader)])) + self.rx_view = completion_q_view.view(comp_tx.rxHdrOff, fmt='I') + + self.gsp, self.view, self.seq = gsp, view, 0 + self.queue_mv = view.view(self.tx.entryOff, self.tx.msgSize * self.tx.msgCount) + + def _checksum(self, data:bytes): + if (pad_len:=(-len(data)) % 8): data += b'\x00' * pad_len + checksum = 0 + for offset in range(0, len(data), 8): checksum ^= struct.unpack_from('Q', data, offset)[0] + return hi32(checksum) ^ lo32(checksum) + + def _send_rpc_record(self, func:int, msg:bytes): + header = nv.rpc_message_header_v(signature=nv.NV_VGPU_MSG_SIGNATURE_VALID, rpc_result=nv.NV_VGPU_MSG_RESULT_RPC_PENDING, + rpc_result_private=nv.NV_VGPU_MSG_RESULT_RPC_PENDING, header_version=(3<<24), function=func, length=len(msg) + 0x20) + + msg = bytes(header) + msg + phdr = nv.GSP_MSG_QUEUE_ELEMENT(elemCount=ceildiv(len(msg) + ctypes.sizeof(nv.GSP_MSG_QUEUE_ELEMENT), self.tx.msgSize), seqNum=self.seq) + phdr.checkSum = self._checksum(bytes(phdr) + msg) + msg = (bytes(phdr) + msg).ljust(phdr.elemCount * self.tx.msgSize, b'\x00') + + wp = self.tx_view[getattr(nv.msgqTxHeader, 'writePtr').offset // 4] + off, first = wp * self.tx.msgSize, min(len(msg), len(self.queue_mv) - wp * self.tx.msgSize) + self.queue_mv[off:off+first] = msg[:first] + if first < len(msg): self.queue_mv[:len(msg)-first] = msg[first:] + self.tx_view[getattr(nv.msgqTxHeader, 'writePtr').offset // 4] = (wp + phdr.elemCount) % self.tx.msgCount + System.memory_barrier() + + self.seq += 1 + self.gsp.nvdev.NV_PGSP_QUEUE_HEAD[0].write(0x0) + + def send_rpc(self, func:int, msg:bytes): + max_payload = self.tx.msgSize * 16 - ctypes.sizeof(nv.GSP_MSG_QUEUE_ELEMENT) - ctypes.sizeof(nv.rpc_message_header_v) + self._send_rpc_record(func, msg[:max_payload]) + for off in range(max_payload, len(msg), max_payload): self._send_rpc_record(nv.NV_VGPU_MSG_FUNCTION_CONTINUATION_RECORD, msg[off:off+max_payload]) + + def read_resp(self): + System.memory_barrier() + while self.rx_view[0] != self.tx_view[getattr(nv.msgqTxHeader, 'writePtr').offset // 4]: + off = self.rx_view[0] * self.tx.msgSize + hdr = nv.rpc_message_header_v.from_buffer_copy(bytes(self.queue_mv[off + 0x30 : off + 0x30 + ctypes.sizeof(nv.rpc_message_header_v)])) + msg = bytes(self.queue_mv[off + 0x50 : off + 0x50 + hdr.length]) + + # Handling special functions + if hdr.function == nv.NV_VGPU_MSG_EVENT_GSP_RUN_CPU_SEQUENCER: self.gsp.run_cpu_seq(msg) + elif hdr.function == nv.NV_VGPU_MSG_EVENT_OS_ERROR_LOG: + print(f"nv {self.gsp.nvdev.devfmt}: GSP LOG: {msg[12:].rstrip(bytes([0])).decode('utf-8')}") + + self.gsp.nvdev.is_err_state |= hdr.function in {nv.NV_VGPU_MSG_EVENT_OS_ERROR_LOG, nv.NV_VGPU_MSG_EVENT_MMU_FAULT_QUEUED} + + # Update the read pointer + self.rx_view[0] = (self.rx_view[0] + round_up(hdr.length, self.tx.msgSize) // self.tx.msgSize) % self.tx.msgCount + System.memory_barrier() + + if DEBUG >= 3: + nm = nv.rpc_fns.get(hdr.function, nv.rpc_events.get(hdr.function, f'ev:{hdr.function:x}')) + print(f"nv {self.gsp.nvdev.devfmt}: in RPC: {nm}, res:{hdr.rpc_result:#x}") + + if hdr.rpc_result != 0: raise RuntimeError(f"RPC call {hdr.function} failed with result {hdr.rpc_result}") + yield hdr.function, msg + + def wait_resp(self, cmd:int, timeout:int=10000) -> bytes: + start_time = int(time.perf_counter() * 1000) + while (int(time.perf_counter() * 1000) - start_time) < timeout: + if (msg:=next((message for func, message in self.read_resp() if func == cmd), None)) is not None: return msg + raise RuntimeError(f"Timeout waiting for RPC response for command {cmd}") + +class NV_FLCN(NV_IP): + def wait_for_reset(self): + wait_cond(lambda _: self.nvdev.NV_PGC6_AON_SECURE_SCRATCH_GROUP_05_PRIV_LEVEL_MASK.read_bitfields()['read_protection_level0'] == 1 and + self.nvdev.NV_PGC6_AON_SECURE_SCRATCH_GROUP_05[0].read() & 0xff == 0xff, "waiting for reset") + + def init_sw(self): + self.nvdev.include("dev_gsp", "ga102") + self.nvdev.include("dev_falcon_v4", "ga102") + self.nvdev.include("dev_riscv_pri", "ga102") + self.nvdev.include("dev_fbif_v4", "ga102") + self.nvdev.include("dev_falcon_second_pri", "ga102") + self.nvdev.include("dev_sec_pri", "ga102") + self.nvdev.include("dev_bus", "tu102") + + self.prep_ucode() + self.prep_booter() + + def prep_ucode(self): + vbios_bytes, vbios_off = memoryview(bytes(array.array('I', self.nvdev.mmio[0x00300000//4:(0x00300000+0x100000)//4]))), 0 + while True: + pci_blck = vbios_bytes[vbios_off + nv.OFFSETOF_PCI_EXP_ROM_PCI_DATA_STRUCT_PTR:].cast('H')[0] + imglen = vbios_bytes[vbios_off + pci_blck + nv.OFFSETOF_PCI_DATA_STRUCT_IMAGE_LEN:].cast('H')[0] * nv.PCI_ROM_IMAGE_BLOCK_SIZE + match vbios_bytes[vbios_off + pci_blck + nv.OFFSETOF_PCI_DATA_STRUCT_CODE_TYPE]: + case nv.NV_BCRT_HASH_INFO_BASE_CODE_TYPE_VBIOS_BASE: block_size = imglen + case nv.NV_BCRT_HASH_INFO_BASE_CODE_TYPE_VBIOS_EXT: + expansion_rom_off = vbios_off - block_size + break + vbios_off += imglen + + bit_header = nv.BIT_HEADER_V1_00.from_buffer_copy(vbios_bytes[(bit_addr:=0x1b0):bit_addr + ctypes.sizeof(nv.BIT_HEADER_V1_00)]) + assert bit_header.Signature == 0x00544942, f"Invalid BIT header signature {hex(bit_header.Signature)}" + + for i in range(bit_header.TokenEntries): + bit = nv.BIT_TOKEN_V1_00.from_buffer_copy(vbios_bytes[bit_addr + bit_header.HeaderSize + i * bit_header.TokenSize:]) + if bit.TokenId != nv.BIT_TOKEN_FALCON_DATA or bit.DataVersion != 2 or bit.DataSize < nv.BIT_DATA_FALCON_DATA_V2_SIZE_4: continue + + falcon_data = nv.BIT_DATA_FALCON_DATA_V2.from_buffer_copy(vbios_bytes[bit.DataPtr & 0xffff:]) + ucode_hdr = nv.FALCON_UCODE_TABLE_HDR_V1.from_buffer_copy(vbios_bytes[(table_ptr:=expansion_rom_off + falcon_data.FalconUcodeTablePtr):]) + for j in range(ucode_hdr.EntryCount): + ucode_entry = nv.FALCON_UCODE_TABLE_ENTRY_V1.from_buffer_copy(vbios_bytes[table_ptr + ucode_hdr.HeaderSize + j * ucode_hdr.EntrySize:]) + if ucode_entry.ApplicationID != nv.FALCON_UCODE_ENTRY_APPID_FWSEC_PROD: continue + + ucode_desc_hdr = nv.FALCON_UCODE_DESC_HEADER.from_buffer_copy(vbios_bytes[expansion_rom_off + ucode_entry.DescPtr:]) + ucode_desc_off = expansion_rom_off + ucode_entry.DescPtr + ucode_desc_size = ucode_desc_hdr.vDesc >> 16 + + self.desc_v3 = nv.FALCON_UCODE_DESC_V3.from_buffer_copy(vbios_bytes[ucode_desc_off:ucode_desc_off + ucode_desc_size]) + + sig_total_size = ucode_desc_size - nv.FALCON_UCODE_DESC_V3_SIZE_44 + signature = vbios_bytes[ucode_desc_off + nv.FALCON_UCODE_DESC_V3_SIZE_44:][:sig_total_size] + image = vbios_bytes[ucode_desc_off + ucode_desc_size:][:round_up(self.desc_v3.StoredSize, 256)] + + self.frts_offset = self.nvdev.vram_size - 0x100000 - 0x100000 + read_vbios_desc = nv.FWSECLIC_READ_VBIOS_DESC(version=0x1, size=ctypes.sizeof(nv.FWSECLIC_READ_VBIOS_DESC), flags=2) + frst_reg_desc = nv.FWSECLIC_FRTS_REGION_DESC(version=0x1, size=ctypes.sizeof(nv.FWSECLIC_FRTS_REGION_DESC), + frtsRegionOffset4K=self.frts_offset >> 12, frtsRegionSize=0x100, frtsRegionMediaType=2) + frts_cmd = nv.FWSECLIC_FRTS_CMD(readVbiosDesc=read_vbios_desc, frtsRegionDesc=frst_reg_desc) + + def __patch(cmd_id, cmd): + patched_image = bytearray(image) + + dmem_offset = 0 + hdr = nv.FALCON_APPLICATION_INTERFACE_HEADER_V1.from_buffer_copy(image[(app_hdr_off:=self.desc_v3.IMEMLoadSize+self.desc_v3.InterfaceOffset):]) + ents = (nv.FALCON_APPLICATION_INTERFACE_ENTRY_V1 * hdr.entryCount).from_buffer_copy(image[app_hdr_off + ctypes.sizeof(hdr):]) + for i in range(hdr.entryCount): + if ents[i].id == nv.FALCON_APPLICATION_INTERFACE_ENTRY_ID_DMEMMAPPER: dmem_offset = ents[i].dmemOffset + + # Patch image + dmem = nv.FALCON_APPLICATION_INTERFACE_DMEM_MAPPER_V3.from_buffer_copy(image[(dmem_mapper_offset:=self.desc_v3.IMEMLoadSize+dmem_offset):]) + dmem.init_cmd = cmd_id + patched_image[dmem_mapper_offset : dmem_mapper_offset+len(bytes(dmem))] = bytes(dmem) + patched_image[(cmd_off:=self.desc_v3.IMEMLoadSize+dmem.cmd_in_buffer_offset) : cmd_off+len(cmd)] = cmd + patched_image[(sig_off:=self.desc_v3.IMEMLoadSize+self.desc_v3.PKCDataOffset) : sig_off+0x180] = signature[-0x180:] + + return self.nvdev._alloc_boot_mem(len(patched_image), data=patched_image, sysmem=False) + + _, self.frts_image_paddr, _ = __patch(0x15, bytes(frts_cmd)) + + def prep_booter(self): + sha = {"ga102":"4497e3eff7e95c774b8a569d17b27c08c9650158d10b229d2be81cdcad9a085b", + "ad102":"8b293e19b637c5e22c87a2428d1c71bb13e0904e8a88ac6b3c6c1f2679c6e37a"}[self.nvdev.fw_name] + h = nv.struct_nvfw_bin_hdr.from_buffer_copy(b:=fetch_fw(f"nvidia/{self.nvdev.fw_name}/gsp", "booter_load-570.144.bin", sha)) + lh = nv.struct_nvfw_hs_load_header_v2.from_buffer_copy(b, (hs:=nv.struct_nvfw_hs_header_v2.from_buffer_copy(b, h.header_offset)).header_offset) + app = nv.struct_nvfw_hs_load_header_v2_app.from_buffer_copy(b, hs.header_offset + ctypes.sizeof(nv.struct_nvfw_hs_load_header_v2)) + + patch_loc, patch_sig = struct.unpack_from("> 8)) + self.nvdev.NV_PFALCON_FALCON_DMATRFBASE1.with_base(base).write(hi32(src >> 8) & 0x1ff) + + xfered = 0 + while xfered < size: + wait_cond(lambda: self.nvdev.NV_PFALCON_FALCON_DMATRFCMD.with_base(base).read_bitfields()['full'], value=0, msg="DMA does not progress") + + self.nvdev.NV_PFALCON_FALCON_DMATRFMOFFS.with_base(base).write(dest + xfered) + self.nvdev.NV_PFALCON_FALCON_DMATRFFBOFFS.with_base(base).write(mem_off + xfered) + self.nvdev.NV_PFALCON_FALCON_DMATRFCMD.with_base(base).write(cmd) + xfered += 256 + + wait_cond(lambda: self.nvdev.NV_PFALCON_FALCON_DMATRFCMD.with_base(base).read_bitfields()['idle'], msg="DMA does not complete") + + def start_cpu(self, base:int): + if self.nvdev.NV_PFALCON_FALCON_CPUCTL.with_base(base).read_bitfields()['alias_en'] == 1: + self.nvdev.wreg(base + self.nvdev.NV_PFALCON_FALCON_CPUCTL_ALIAS, 0x2) + else: self.nvdev.NV_PFALCON_FALCON_CPUCTL.with_base(base).write(startcpu=1) + + def wait_cpu_halted(self, base): wait_cond(lambda: self.nvdev.NV_PFALCON_FALCON_CPUCTL.with_base(base).read_bitfields()['halted'], msg="not halted") + + def execute_hs(self, base, img_paddr, code_off, data_off, imemPa, imemVa, imemSz, dmemPa, dmemVa, dmemSz, pkc_off, engid, ucodeid, mailbox=None): + self.disable_ctx_req(base) + + # target=0 is FB (not in published headers) + self.nvdev.NV_PFALCON_FBIF_TRANSCFG.with_base(base)[ctx_dma:=0].update(target=0, mem_type=self.nvdev.NV_PFALCON_FBIF_TRANSCFG_MEM_TYPE_PHYSICAL) + + cmd = self.nvdev.NV_PFALCON_FALCON_DMATRFCMD.with_base(base).encode(write=0, size=self.nvdev.NV_PFALCON_FALCON_DMATRFCMD_SIZE_256B, + ctxdma=ctx_dma, imem=1, sec=1) + self.execute_dma(base, cmd, dest=imemPa, mem_off=imemVa, src=img_paddr+code_off-imemVa, size=imemSz) + + cmd = self.nvdev.NV_PFALCON_FALCON_DMATRFCMD.with_base(base).encode(write=0, size=self.nvdev.NV_PFALCON_FALCON_DMATRFCMD_SIZE_256B, + ctxdma=ctx_dma, imem=0, sec=0) + self.execute_dma(base, cmd, dest=dmemPa, mem_off=dmemVa, src=img_paddr+data_off-dmemVa, size=dmemSz) + + self.nvdev.NV_PFALCON2_FALCON_BROM_PARAADDR.with_base(base)[0].write(pkc_off) + self.nvdev.NV_PFALCON2_FALCON_BROM_ENGIDMASK.with_base(base).write(engid) + self.nvdev.NV_PFALCON2_FALCON_BROM_CURR_UCODE_ID.with_base(base).write(val=ucodeid) + self.nvdev.NV_PFALCON2_FALCON_MOD_SEL.with_base(base).write(algo=self.nvdev.NV_PFALCON2_FALCON_MOD_SEL_ALGO_RSA3K) + + self.nvdev.NV_PFALCON_FALCON_BOOTVEC.with_base(base).write(imemVa) + + if mailbox is not None: + self.nvdev.NV_PFALCON_FALCON_MAILBOX0.with_base(base).write(lo32(mailbox)) + self.nvdev.NV_PFALCON_FALCON_MAILBOX1.with_base(base).write(hi32(mailbox)) + + self.start_cpu(base) + self.wait_cpu_halted(base) + + if mailbox is not None: + return self.nvdev.NV_PFALCON_FALCON_MAILBOX0.with_base(base).read(), self.nvdev.NV_PFALCON_FALCON_MAILBOX1.with_base(base).read() + + def disable_ctx_req(self, base:int): + self.nvdev.NV_PFALCON_FBIF_CTL.with_base(base).update(allow_phys_no_ctx=1) + self.nvdev.NV_PFALCON_FALCON_DMACTL.with_base(base).write(0x0) + + def reset(self, base:int, riscv=False): + engine_reg = self.nvdev.NV_PGSP_FALCON_ENGINE if base == self.falcon else self.nvdev.NV_PSEC_FALCON_ENGINE + engine_reg.write(reset=1) + time.sleep(0.1) + engine_reg.write(reset=0) + + wait_cond(lambda: self.nvdev.NV_PFALCON_FALCON_HWCFG2.with_base(base).read_bitfields()['mem_scrubbing'], value=0, msg="Scrubbing not completed") + + if riscv: self.nvdev.NV_PRISCV_RISCV_BCR_CTRL.with_base(base).write(core_select=1, valid=0, brfetch=1) + elif self.nvdev.NV_PFALCON_FALCON_HWCFG2.with_base(base).read_bitfields()['riscv'] == 1: + self.nvdev.NV_PRISCV_RISCV_BCR_CTRL.with_base(base).write(core_select=0) + wait_cond(lambda: self.nvdev.NV_PRISCV_RISCV_BCR_CTRL.with_base(base).read_bitfields()['valid'], msg="RISCV core not booted") + self.nvdev.NV_PFALCON_FALCON_RM.with_base(base).write(self.nvdev.chip_id) + +class NV_FLCN_COT(NV_IP): + def wait_for_reset(self): + self.nvdev.include("dev_therm", "gb202") + wait_cond(lambda _: self.nvdev.NV_THERM_I2CS_SCRATCH.read() == 0xff, "waiting for reset") + + def init_sw(self): + self.nvdev.include("dev_gsp", "ga102") + self.nvdev.include("dev_falcon_v4", "gh100") + self.nvdev.include("dev_vm", "gh100") + self.nvdev.include("dev_fsp_pri", "gh100") + self.nvdev.include("dev_bus", "tu102") + + self.fmc_boot_args_view, _, fmc_boot_addrs = self.nvdev._alloc_boot_mem(ctypes.sizeof(nv.GSP_FMC_BOOT_PARAMS), + data=bytes(nv.GSP_FMC_BOOT_PARAMS())) + self.fmc_boot_args_sysmem = fmc_boot_addrs[0] + self.init_fmc_image() + + def init_fmc_image(self): + _, sections, _ = elf_loader(fetch_fw(f"nvidia/{self.nvdev.fw_name}/gsp", "fmc-570.144.bin", + "cb59a35c1d4bd1274d7267fd10243c29f843ff41c851b9cbd59f5af2ddd7fece")) + def _section(s): return next((sh.content for sh in sections if sh.name == s)) + self.fmc_booter_image, self.fmc_booter_hash = _section("image"), memoryview(_section("hash")).cast('I') + self.fmc_booter_sig, self.fmc_booter_pkey = memoryview(_section("signature")).cast('I'), memoryview(_section("publickey") + b"\x00" * 3).cast('I') + _, _, fmc_booter_addrs = self.nvdev._alloc_boot_mem(len(self.fmc_booter_image), data=self.fmc_booter_image) + self.fmc_booter_bar1 = fmc_booter_addrs[0] + + def init_hw(self): + self.falcon = 0x00110000 + + boot_args = nv.GSP_ACR_BOOT_GSP_RM_PARAMS(gspRmDescOffset=self.nvdev.gsp.wpr_meta_sysmem, + gspRmDescSize=ctypes.sizeof(nv.GspFwWprMeta), target=nv.GSP_DMA_TARGET_COHERENT_SYSTEM, bIsGspRmBoot=True) + rm_args = nv.GSP_RM_PARAMS(bootArgsOffset=self.nvdev.gsp.libos_args_sysmem, target=nv.GSP_DMA_TARGET_COHERENT_SYSTEM) + self.fmc_boot_args_view[:ctypes.sizeof(nv.GSP_FMC_BOOT_PARAMS)] = bytes(nv.GSP_FMC_BOOT_PARAMS(bootGspRmParams=boot_args, gspRmParams=rm_args)) + + cot_payload = nv.NVDM_PAYLOAD_COT(version=0x2, size=ctypes.sizeof(nv.NVDM_PAYLOAD_COT), frtsVidmemOffset=0x1c00000, frtsVidmemSize=0x100000, + gspBootArgsSysmemOffset=self.fmc_boot_args_sysmem, gspFmcSysmemOffset=self.fmc_booter_bar1) + for i,x in enumerate(self.fmc_booter_hash): cot_payload.hash384[i] = x + for i,x in enumerate(self.fmc_booter_sig): cot_payload.signature[i] = x + for i,x in enumerate(self.fmc_booter_pkey): cot_payload.publicKey[i] = x + + self.kfsp_send_msg(nv.NVDM_TYPE_COT, bytes(cot_payload)) + wait_cond(lambda: self.nvdev.NV_PFALCON_FALCON_HWCFG2.with_base(self.falcon).read_bitfields()['riscv_br_priv_lockdown'], value=0) + + def kfsp_send_msg(self, nvmd:int, buf:bytes): + # All single-packets go to seid 0 + headers = int.to_bytes((1 << 31) | (1 << 30), 4, 'little') + int.to_bytes((0x7e << 0) | (0x10de << 8) | (nvmd << 24), 4, 'little') + buf = headers + buf + (4 - (len(buf) % 4)) * b'\x00' + assert len(buf) < 0x400, f"FSP message too long: {len(buf)} bytes, max 1024 bytes" + + self.nvdev.NV_PFSP_EMEMC[0].write(offs=0, blk=0, aincw=1, aincr=0) + for i in range(0, len(buf), 4): self.nvdev.NV_PFSP_EMEMD[0].write(int.from_bytes(buf[i:i+4], 'little')) + + self.nvdev.NV_PFSP_QUEUE_TAIL[0].write(len(buf) - 4) + self.nvdev.NV_PFSP_QUEUE_HEAD[0].write(0) + + # Waiting for a response + wait_cond(lambda: self.nvdev.NV_PFSP_MSGQ_HEAD[0].read() != self.nvdev.NV_PFSP_MSGQ_TAIL[0].read(), msg="FSP didn't respond to message") + + self.nvdev.NV_PFSP_EMEMC[0].write(offs=0, blk=0, aincw=0, aincr=1) + self.nvdev.NV_PFSP_MSGQ_TAIL[0].write(self.nvdev.NV_PFSP_MSGQ_HEAD[0].read()) + +class NV_GSP(NV_IP): + def init_sw(self): + self.handle_gen = itertools.count(0xcf000000) + self.init_rm_args() + self.init_libos_args() + self.init_wpr_meta() + + # Prefill cmd queue with info for gsp to start. + self.rpc_set_gsp_system_info() + self.rpc_set_registry_table() + + self.gpfifo_class, self.compute_class, self.dma_class = nv_gpu.AMPERE_CHANNEL_GPFIFO_A, nv_gpu.AMPERE_COMPUTE_B, nv_gpu.AMPERE_DMA_COPY_B + match self.nvdev.chip_name[:2]: + case "AD": self.compute_class = nv_gpu.ADA_COMPUTE_A + case "GB": + self.gpfifo_class,self.compute_class,self.dma_class=nv_gpu.BLACKWELL_CHANNEL_GPFIFO_A,nv_gpu.BLACKWELL_COMPUTE_B,nv_gpu.BLACKWELL_DMA_COPY_B + + def init_rm_args(self, queue_size=0x40000): + # Alloc queues + pte_cnt = ((queue_pte_cnt:=(queue_size * 2) // 0x1000)) + round_up(queue_pte_cnt * 8, 0x1000) // 0x1000 + pt_size = round_up(pte_cnt * 8, 0x1000) + queues_view, _, queues_sysmem = self.nvdev._alloc_boot_mem(pt_size + queue_size * 2, sysmem=True) + + # Fill up ptes + for i, sysmem in enumerate(queues_sysmem): queues_view.view(i * 0x8, 0x8, fmt='Q')[0] = sysmem + + # Fill up arguments + queue_args = nv.MESSAGE_QUEUE_INIT_ARGUMENTS(sharedMemPhysAddr=queues_sysmem[0], pageTableEntryCount=pte_cnt, cmdQueueOffset=pt_size, + statQueueOffset=pt_size + queue_size) + _, _, rm_args_addrs = self.nvdev._alloc_boot_mem(ctypes.sizeof(nv.GSP_ARGUMENTS_CACHED), + data=bytes(nv.GSP_ARGUMENTS_CACHED(bDmemStack=True, messageQueueInitArguments=queue_args))) + self.rm_args_sysmem = rm_args_addrs[0] + + # Build command queue header + # self.cmd_q_va, self.stat_q_va = queues_view.addr + pt_size, queues_view.addr + pt_size + queue_size + self.cmd_q_view, self.stat_q_view = queues_view.view(pt_size), queues_view.view(pt_size + queue_size) + + self.cmd_q_view[:ctypes.sizeof(nv.msgqTxHeader)] = bytes(nv.msgqTxHeader(version=0, size=queue_size, entryOff=0x1000, msgSize=0x1000, + msgCount=(queue_size - 0x1000) // 0x1000, writePtr=0, flags=1, rxHdrOff=ctypes.sizeof(nv.msgqTxHeader))) + + self.cmd_q = NVRpcQueue(self, self.cmd_q_view, None) + + def init_libos_args(self): + _, _, logbuf_addrs = self.nvdev._alloc_boot_mem(2 << 20) + libos_args_view, _, libos_addrs = self.nvdev._alloc_boot_mem(0x1000) + self.libos_args_sysmem = libos_addrs[0] + + libos_structs = [nv.LibosMemoryRegionInitArgument(kind=nv.LIBOS_MEMORY_REGION_CONTIGUOUS, loc=nv.LIBOS_MEMORY_REGION_LOC_SYSMEM, size=0x10000, + id8=int.from_bytes(bytes(f"LOG{name}", 'utf-8'), 'big'), pa=logbuf_addrs[0] + 0x10000 * i) + for i, name in enumerate(["INIT", "INTR", "RM", "MNOC", "KRNL"])] + libos_structs.append(nv.LibosMemoryRegionInitArgument(kind=nv.LIBOS_MEMORY_REGION_CONTIGUOUS, loc=nv.LIBOS_MEMORY_REGION_LOC_SYSMEM, size=0x1000, + id8=int.from_bytes(bytes("RMARGS", 'utf-8'), 'big'), pa=self.rm_args_sysmem)) + libos_args_view[:sum(ctypes.sizeof(s) for s in libos_structs)] = b''.join(bytes(s) for s in libos_structs) + + def init_gsp_image(self): + _, sections, _ = elf_loader(fetch_fw("nvidia/ga102/gsp", "gsp-570.144.bin", "a8c3ebeed280323aedb51c061f321e73379cce7a9ae643a33dd03915df027f7f")) + self.gsp_image = next((sh.content for sh in sections if sh.name == ".fwimage")) + signature = next((sh.content for sh in sections if sh.name == (f".fwsignature_{self.nvdev.chip_name[:4].lower()}x"))) + + # Build radix3 + npages = [0, 0, 0, round_up(len(self.gsp_image), 0x1000) // 0x1000] + for i in range(3, 0, -1): npages[i-1] = ((npages[i] - 1) >> (nv.LIBOS_MEMORY_REGION_RADIX_PAGE_LOG2 - 3)) + 1 + + offsets = [sum(npages[:i]) * 0x1000 for i in range(4)] + radix_view, _, self.gsp_radix3_addrs = self.nvdev._alloc_boot_mem(offsets[-1] + len(self.gsp_image)) + + # Copy image + radix_view.view(offsets[-1], len(self.gsp_image))[:] = self.gsp_image + + # Copy level and image pages. + for i in range(0, 3): + cur_offset = sum(npages[:i+1]) + radix_view.view(offsets[i], npages[i+1] * 8, fmt='Q')[:] = array.array('Q', self.gsp_radix3_addrs[cur_offset:cur_offset+npages[i+1]]) + + # Copy signature + _, _, gsp_sig_addrs = self.nvdev._alloc_boot_mem(len(signature), data=signature) + self.gsp_signature_bar1 = gsp_sig_addrs[0] + + def init_boot_binary_image(self): + sha = {"ga102":"82428f532240727e95bb3083fbaaba9b2cc7b937314323f2d546ce7245f27fad", + "ad102":"65ab2e6b6e0fca95365c4deac79a34582abcfeb15b6ae234138f22e7183118a8", + "gb202":"d40b48e431d1707dc77af3605db358ed7a32ebfc2830eb74de2eddb4d3025071"}[self.nvdev.fw_name] + h = nv.struct_nvfw_bin_hdr.from_buffer_copy(b:=fetch_fw(f"nvidia/{self.nvdev.fw_name}/gsp", "bootloader-570.144.bin", sha)) + self.booter_image, self.booter_desc = b[h.data_offset:h.data_offset+h.data_size], nv.RM_RISCV_UCODE_DESC.from_buffer_copy(b, h.header_offset) + _, _, booter_addrs = self.nvdev._alloc_boot_mem(len(self.booter_image), data=self.booter_image) + self.booter_bar1 = booter_addrs[0] + + def init_wpr_meta(self): + self.init_gsp_image() + self.init_boot_binary_image() + + common = {'sizeOfBootloader':(boot_sz:=len(self.booter_image)), 'sysmemAddrOfBootloader':self.booter_bar1, + 'sizeOfRadix3Elf':(radix3_sz:=len(self.gsp_image)), 'sysmemAddrOfRadix3Elf': self.gsp_radix3_addrs[0], + 'sizeOfSignature': 0x1000, 'sysmemAddrOfSignature': self.gsp_signature_bar1, + 'bootloaderCodeOffset': self.booter_desc.monitorCodeOffset, 'bootloaderDataOffset': self.booter_desc.monitorDataOffset, + 'bootloaderManifestOffset': self.booter_desc.manifestOffset, 'revision':nv.GSP_FW_WPR_META_REVISION, 'magic':nv.GSP_FW_WPR_META_MAGIC} + + if self.nvdev.fmc_boot: + m = nv.GspFwWprMeta(**common, vgaWorkspaceSize=0x20000, pmuReservedSize=0x1820000, nonWprHeapSize=0x220000, gspFwHeapSize=0x8700000, + frtsSize=0x100000) + else: + m = nv.GspFwWprMeta(**common, vgaWorkspaceSize=(vga_sz:=0x100000), vgaWorkspaceOffset=(vga_off:=self.nvdev.vram_size-vga_sz), + gspFwWprEnd=vga_off, frtsSize=(frts_sz:=0x100000), frtsOffset=(frts_off:=vga_off-frts_sz), bootBinOffset=(boot_off:=frts_off-boot_sz), + gspFwOffset=(gsp_off:=round_down(boot_off-radix3_sz, 0x10000)), gspFwHeapSize=(gsp_heap_sz:=0x8100000), fbSize=self.nvdev.vram_size, + gspFwHeapOffset=(gsp_heap_off:=round_down(gsp_off-gsp_heap_sz, 0x100000)), gspFwWprStart=(wpr_st:=round_down(gsp_heap_off-0x1000, 0x100000)), + nonWprHeapSize=(non_wpr_sz:=0x100000), nonWprHeapOffset=(non_wpr_off:=round_down(wpr_st-non_wpr_sz, 0x100000)), gspFwRsvdStart=non_wpr_off) + assert self.nvdev.flcn.frts_offset == m.frtsOffset, f"FRTS mismatch: {self.nvdev.flcn.frts_offset} != {m.frtsOffset}" + self.wpr_meta, _, wpr_meta_addrs = self.nvdev._alloc_boot_mem(ctypes.sizeof(type(m)), data=bytes(m)) + self.wpr_meta_sysmem = wpr_meta_addrs[0] + + def promote_ctx(self, client:int, subdevice:int, obj:int, ctxbufs:dict[int, GRBufDesc], bufs=None, virt=None, phys=None): + res, prom = {}, nv_gpu.NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS(entryCount=len(ctxbufs), engineType=0x1, hChanClient=client, hObject=obj) + for i,(buf,desc) in enumerate(ctxbufs.items()): + use_v, use_p = (desc.virt if virt is None else virt), (desc.phys if phys is None else phys) + x = (bufs or {}).get(buf, self.nvdev.mm.valloc(desc.size, contiguous=True)) # allocate buffers + prom.promoteEntry[i] = nv_gpu.NV2080_CTRL_GPU_PROMOTE_CTX_BUFFER_ENTRY(bufferId=buf, gpuVirtAddr=x.va_addr if use_v else 0, bInitialize=use_p, + gpuPhysAddr=x.paddrs[0][0] if use_p else 0, size=desc.size if use_p else 0, physAttr=0x4 if use_p else 0, bNonmapped=(use_p and not use_v)) + res[buf] = x + self.rpc_rm_control(hObject=subdevice, cmd=nv_gpu.NV2080_CTRL_CMD_GPU_PROMOTE_CTX, params=prom, client=client) + return res + + def init_golden_image(self): + self.rpc_rm_alloc(hParent=0x0, hClass=0x0, params=nv_gpu.NV0000_ALLOC_PARAMETERS()) + dev = self.rpc_rm_alloc(hParent=self.priv_root, hClass=nv_gpu.NV01_DEVICE_0, params=nv_gpu.NV0080_ALLOC_PARAMETERS(hClientShare=self.priv_root)) + subdev = self.rpc_rm_alloc(hParent=dev, hClass=nv_gpu.NV20_SUBDEVICE_0, params=nv_gpu.NV2080_ALLOC_PARAMETERS()) + vaspace = self.rpc_rm_alloc(hParent=dev, hClass=nv_gpu.FERMI_VASPACE_A, params=nv_gpu.NV_VASPACE_ALLOCATION_PARAMETERS()) + + # reserve 512MB for the reserved PDES + res_va = self.nvdev.mm.alloc_vaddr(res_sz:=(512 << 20)) + + bufs_p = nv_gpu.struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS(pageSize=res_sz, numLevelsToCopy=3, + virtAddrLo=res_va, virtAddrHi=res_va + res_sz - 1) + for i,pt in enumerate(self.nvdev.mm.page_tables(res_va, size=res_sz)): + bufs_p.levels[i] = nv_gpu.struct_NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS_level(physAddress=pt.paddr, + size=self.nvdev.mm.pte_cnt[0] * 8 if i == 0 else 0x1000, pageShift=self.nvdev.mm.pte_covers[i].bit_length() - 1, aperture=1) + self.rpc_rm_control(hObject=vaspace, cmd=nv_gpu.NV90F1_CTRL_CMD_VASPACE_COPY_SERVER_RESERVED_PDES, params=bufs_p) + + gpfifo_area = self.nvdev.mm.valloc(4 << 10, contiguous=True) + userd = nv_gpu.NV_MEMORY_DESC_PARAMS(base=gpfifo_area.paddrs[0][0] + 0x20 * 8, size=0x20, addressSpace=2, cacheAttrib=0) + gg_params = nv_gpu.NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS(gpFifoOffset=gpfifo_area.va_addr, gpFifoEntries=32, engineType=0x1, cid=3, + hVASpace=vaspace, userdOffset=(ctypes.c_uint64*8)(0x20 * 8), userdMem=userd, internalFlags=0x1a, flags=0x200320) + ch_gpfifo = self.rpc_rm_alloc(hParent=dev, hClass=self.gpfifo_class, params=gg_params) + + gr_ctx_bufs_info = self.rpc_rm_control(hObject=subdev, cmd=nv_gpu.NV2080_CTRL_CMD_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO, + params=nv_gpu.NV2080_CTRL_INTERNAL_STATIC_KGR_GET_CONTEXT_BUFFERS_INFO_PARAMS()).engineContextBuffersInfo[0] + def _ctx_info(idx, add=0, align=None): return round_up(gr_ctx_bufs_info.engine[idx].size + add, align or gr_ctx_bufs_info.engine[idx].alignment) + + # Setup graphics context + gr_size = _ctx_info(nv_gpu.NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS, add=0x40000) + patch_size = _ctx_info(nv_gpu.NV0080_CTRL_FIFO_GET_ENGINE_CONTEXT_PROPERTIES_ENGINE_ID_GRAPHICS_PATCH) + cfgs_sizes = {x: _ctx_info(x + 14, align=(2 << 20) if x == 5 else None) for x in range(3, 11)} # indices 3–10 are mapped to 17–24 + self.grctx_bufs = {0: GRBufDesc(gr_size, phys=True, virt=True), 1: GRBufDesc(patch_size, phys=True, virt=True, local=True), + 2: GRBufDesc(patch_size, phys=True, virt=True), **{x: GRBufDesc(cfgs_sizes[x], phys=False, virt=True) for x in range(3, 7)}, + 9: GRBufDesc(cfgs_sizes[9], phys=True, virt=True), 10: GRBufDesc(cfgs_sizes[10], phys=True, virt=False), + 11: GRBufDesc(cfgs_sizes[10], phys=True, virt=True)} # NOTE: 11 reuses cfgs_sizes[10] + self.promote_ctx(self.priv_root, subdev, ch_gpfifo, {k:v for k, v in self.grctx_bufs.items() if not v.local}) + + self.rpc_rm_alloc(hParent=ch_gpfifo, hClass=self.compute_class, params=None) + self.rpc_rm_alloc(hParent=ch_gpfifo, hClass=self.dma_class, params=None) + + def init_hw(self): + self.stat_q = NVRpcQueue(self, self.stat_q_view, self.cmd_q_view) + self.cmd_q.rx_view = self.stat_q_view.view(self.stat_q.tx.rxHdrOff, fmt='I') + + self.stat_q.wait_resp(nv.NV_VGPU_MSG_EVENT_GSP_INIT_DONE) + + self.nvdev.NV_PBUS_BAR1_BLOCK.write(mode=0, target=0, ptr=0) + if self.nvdev.fmc_boot: self.nvdev.NV_VIRTUAL_FUNCTION_PRIV_FUNC_BAR1_BLOCK_LOW_ADDR.write(mode=0, target=0, ptr=0) + + self.priv_root = 0xc1e00004 + self.init_golden_image() + + def fini_hw(self): self.rpc_unloading_guest_driver() + + ### RPCs + + def rpc_alloc_memory(self, hDevice:int, hClass:int, paddrs:list[tuple[int,int]], length:int, flags:int, client:int|None=None) -> int: + assert all(sz == 0x1000 for _, sz in paddrs), f"all pages must be 4KB, got {[(hex(p), hex(sz)) for p, sz in paddrs]}" + + rpc = nv.rpc_alloc_memory_v(hClient=(client:=client or self.priv_root), hDevice=hDevice, hMemory=(handle:=next(self.handle_gen)), + hClass=hClass, flags=flags, pteAdjust=0, format=6, length=length, pageCount=len(paddrs)) + rpc.pteDesc.idr, rpc.pteDesc.length = nv.NV_VGPU_PTEDESC_IDR_NONE, (len(paddrs) & 0xffff) + + payload = bytes(rpc) + b''.join(bytes(nv.struct_pte_desc_pte_pde(pte=(paddr >> 12))) for paddr, _ in paddrs) + self.cmd_q.send_rpc(nv.NV_VGPU_MSG_FUNCTION_ALLOC_MEMORY, bytes(payload)) + self.stat_q.wait_resp(nv.NV_VGPU_MSG_FUNCTION_ALLOC_MEMORY) + return handle + + def rpc_rm_alloc(self, hParent:int, hClass:int, params:Any, client=None) -> int: + if hClass == self.gpfifo_class: + ramfc_alloc = self.nvdev.mm.valloc(0x1000, contiguous=True) + params.ramfcMem = nv_gpu.NV_MEMORY_DESC_PARAMS(base=ramfc_alloc.paddrs[0][0], size=0x200, addressSpace=2, cacheAttrib=0) + params.instanceMem = nv_gpu.NV_MEMORY_DESC_PARAMS(base=ramfc_alloc.paddrs[0][0], size=0x1000, addressSpace=2, cacheAttrib=0) + + _, method_paddr, _ = self.nvdev._alloc_boot_mem(0x5000, sysmem=False) + params.mthdbufMem = nv_gpu.NV_MEMORY_DESC_PARAMS(base=method_paddr, size=0x5000, addressSpace=2, cacheAttrib=0) + + if client is not None and client != self.priv_root and params.hObjectError != 0: + params.errorNotifierMem = nv_gpu.NV_MEMORY_DESC_PARAMS(base=0, size=0xecc, addressSpace=0, cacheAttrib=0) + params.userdMem = nv_gpu.NV_MEMORY_DESC_PARAMS(base=params.hUserdMemory[0] + params.userdOffset[0], size=0x400, addressSpace=2, cacheAttrib=0) + + alloc_args = nv.rpc_gsp_rm_alloc_v(hClient=(client:=client or self.priv_root), hParent=hParent, hObject=(obj:=next(self.handle_gen)), + hClass=hClass, flags=0x0, paramsSize=ctypes.sizeof(params) if params is not None else 0x0) + self.cmd_q.send_rpc(nv.NV_VGPU_MSG_FUNCTION_GSP_RM_ALLOC, bytes(alloc_args) + (bytes(params) if params is not None else b'')) + self.stat_q.wait_resp(nv.NV_VGPU_MSG_FUNCTION_GSP_RM_ALLOC) + + if hClass == nv_gpu.FERMI_VASPACE_A and client != self.priv_root: + self.rpc_set_page_directory(device=hParent, hVASpace=obj, pdir_paddr=self.nvdev.mm.root_page_table.paddr, client=client) + if hClass == nv_gpu.NV01_DEVICE_0 and client != self.priv_root: self.device = obj # save user device handle + if hClass == nv_gpu.NV20_SUBDEVICE_0: self.subdevice = obj # save subdevice handle + if hClass == self.compute_class and client != self.priv_root: + phys_gr_ctx = self.promote_ctx(client, self.subdevice, hParent, {k:v for k,v in self.grctx_bufs.items() if k in [0, 1, 2]}, virt=False) + self.promote_ctx(client, self.subdevice, hParent, {k:v for k,v in self.grctx_bufs.items() if k in [0, 1, 2]}, phys_gr_ctx, phys=False) + return obj if hClass != nv_gpu.NV1_ROOT else client + + def rpc_rm_control(self, hObject:int, cmd:int, params:Any, client=None, extra=None): + if cmd == nv_gpu.NVB0CC_CTRL_CMD_POWER_REQUEST_FEATURES: + self.rpc_rm_control(hObject, nv_gpu.NVB0CC_CTRL_CMD_INTERNAL_PERMISSIONS_INIT, nv_gpu.NVB0CC_CTRL_INTERNAL_PERMISSIONS_INIT_PARAMS( + bAdminProfilingPermitted=1, bDevProfilingPermitted=1, bCtxProfilingPermitted=1, bVideoMemoryProfilingPermitted=1, + bSysMemoryProfilingPermitted=1), client=client) + elif cmd == nv_gpu.NVB0CC_CTRL_CMD_ALLOC_PMA_STREAM: + params.hMemPmaBuffer = self.rpc_alloc_memory(self.device, nv_gpu.NV01_MEMORY_LIST_SYSTEM, extra[0].meta.mapping.paddrs, extra[0].size, + pma_flags:=(nv_gpu.NVOS02_FLAGS_PHYSICALITY_NONCONTIGUOUS << 4 | nv_gpu.NVOS02_FLAGS_MAPPING_NO_MAP << 30), client=client) + params.hMemPmaBytesAvailable = self.rpc_alloc_memory(self.device, nv_gpu.NV01_MEMORY_LIST_SYSTEM, extra[1].meta.mapping.paddrs, extra[1].size, + pma_flags | nv_gpu.NVOS02_FLAGS_ALLOC_USER_READ_ONLY_YES << 21, client=client) + + control_args = nv.rpc_gsp_rm_control_v(hClient=(client:=client or self.priv_root), hObject=hObject, cmd=cmd, flags=0x0, + paramsSize=ctypes.sizeof(params) if params is not None else 0x0) + self.cmd_q.send_rpc(nv.NV_VGPU_MSG_FUNCTION_GSP_RM_CONTROL, bytes(control_args) + (bytes(params) if params is not None else b'')) + res = self.stat_q.wait_resp(nv.NV_VGPU_MSG_FUNCTION_GSP_RM_CONTROL) + st = type(params).from_buffer_copy(res[len(bytes(control_args)):]) if params is not None else None + + # NOTE: gb20x requires the enable bit for token submission. Patch workSubmitToken here to maintain userspace compatibility. + if self.nvdev.chip_name.startswith("GB2") and cmd == nv_gpu.NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN: + cast(nv_gpu.NVC36F_CTRL_CMD_GPFIFO_GET_WORK_SUBMIT_TOKEN_PARAMS, st).workSubmitToken |= (1 << 30) + return st + + def rpc_set_page_directory(self, device:int, hVASpace:int, pdir_paddr:int, client=None, pasid=0xffffffff): + params = nv.struct_NV0080_CTRL_DMA_SET_PAGE_DIRECTORY_PARAMS_v1E_05(physAddress=pdir_paddr, + numEntries=self.nvdev.mm.pte_cnt[0], flags=0x8, hVASpace=hVASpace, pasid=pasid, subDeviceId=1, chId=0) # flags field is all channels. + alloc_args = nv.rpc_set_page_directory_v(hClient=client or self.priv_root, hDevice=device, pasid=pasid, params=params) + self.cmd_q.send_rpc(nv.NV_VGPU_MSG_FUNCTION_SET_PAGE_DIRECTORY, bytes(alloc_args)) + self.stat_q.wait_resp(nv.NV_VGPU_MSG_FUNCTION_SET_PAGE_DIRECTORY) + + def rpc_set_gsp_system_info(self): + def bdf_as_int(s): return 0x000 if s.startswith("usb") or s.startswith("remote") else (int(s[5:7],16)<<8) | (int(s[8:10],16)<<3) | int(s[-1],16) + + pcidev = self.nvdev.pci_dev + data = nv.GspSystemInfo(gpuPhysAddr=pcidev.bar_info(0)[0], gpuPhysFbAddr=pcidev.bar_info(1)[0], gpuPhysInstAddr=pcidev.bar_info(3)[0], + pciConfigMirrorBase=[0x88000, 0x92000][self.nvdev.fmc_boot], pciConfigMirrorSize=0x1000, nvDomainBusDeviceFunc=bdf_as_int(self.nvdev.devfmt), + bIsPassthru=1, PCIDeviceID=pcidev.read_config(pci.PCI_VENDOR_ID, 4), PCISubDeviceID=pcidev.read_config(pci.PCI_SUBSYSTEM_VENDOR_ID, 4), + PCIRevisionID=pcidev.read_config(pci.PCI_REVISION_ID, 1), maxUserVa=0x7ffffffff000) + self.cmd_q.send_rpc(nv.NV_VGPU_MSG_FUNCTION_GSP_SET_SYSTEM_INFO, bytes(data)) + + def rpc_unloading_guest_driver(self): + data = nv.rpc_unloading_guest_driver_v(bInPMTransition=0, bGc6Entering=0, newLevel=(__GPU_STATE_FLAGS_FAST_UNLOAD:=1 << 6)) + self.cmd_q.send_rpc(nv.NV_VGPU_MSG_FUNCTION_UNLOADING_GUEST_DRIVER, bytes(data)) + self.stat_q.wait_resp(nv.NV_VGPU_MSG_FUNCTION_UNLOADING_GUEST_DRIVER) + + def rpc_set_registry_table(self): + table = {'RMForcePcieConfigSave': 0x1, 'RMSecBusResetEnable': 0x1} + entries_bytes, data_bytes = bytes(), bytes() + hdr_size, entries_size = ctypes.sizeof(nv.PACKED_REGISTRY_TABLE), ctypes.sizeof(nv.PACKED_REGISTRY_ENTRY) * len(table) + + for k,v in table.items(): + entries_bytes += bytes(nv.PACKED_REGISTRY_ENTRY(nameOffset=hdr_size + entries_size + len(data_bytes), + type=nv.REGISTRY_TABLE_ENTRY_TYPE_DWORD, data=v, length=4)) + data_bytes += k.encode('utf-8') + b'\x00' + + header = nv.PACKED_REGISTRY_TABLE(size=hdr_size + len(entries_bytes) + len(data_bytes), numEntries=len(table)) + self.cmd_q.send_rpc(nv.NV_VGPU_MSG_FUNCTION_SET_REGISTRY, bytes(header) + entries_bytes + data_bytes) + + def run_cpu_seq(self, seq_buf:bytes): + hdr = nv.rpc_run_cpu_sequencer_v17_00.from_buffer_copy(seq_buf[:(hdr_sz:=ctypes.sizeof(nv.rpc_run_cpu_sequencer_v17_00))]) + cmd_iter = iter(memoryview(seq_buf[hdr_sz:]).cast('I')[:hdr.cmdIndex]) + + for op in cmd_iter: + if op == 0x0: self.nvdev.wreg(next(cmd_iter), next(cmd_iter)) # reg write + elif op == 0x1: # reg modify + addr, val, mask = next(cmd_iter), next(cmd_iter), next(cmd_iter) + self.nvdev.wreg(addr, (self.nvdev.rreg(addr) & ~mask) | (val & mask)) + elif op == 0x2: # reg poll + addr, mask, val, _, _ = next(cmd_iter), next(cmd_iter), next(cmd_iter), next(cmd_iter), next(cmd_iter) + wait_cond(lambda a, m: (self.nvdev.rreg(a) & m), addr, mask, value=val, msg=f"Register {addr:#x} not equal to {val:#x} after polling") + elif op == 0x3: time.sleep(next(cmd_iter) / 1e6) # delay us + elif op == 0x4: # save reg + addr, index = next(cmd_iter), next(cmd_iter) + hdr.regSaveArea[index] = self.nvdev.rreg(addr) + elif op == 0x5: # core reset + self.nvdev.flcn.reset(self.nvdev.flcn.falcon) + self.nvdev.flcn.disable_ctx_req(self.nvdev.flcn.falcon) + elif op == 0x6: self.nvdev.flcn.start_cpu(self.nvdev.flcn.falcon) + elif op == 0x7: self.nvdev.flcn.wait_cpu_halted(self.nvdev.flcn.falcon) + elif op == 0x8: # core resume + self.nvdev.flcn.reset(self.nvdev.flcn.falcon, riscv=True) + + self.nvdev.NV_PGSP_FALCON_MAILBOX0.write(lo32(self.libos_args_sysmem)) + self.nvdev.NV_PGSP_FALCON_MAILBOX1.write(hi32(self.libos_args_sysmem)) + + self.nvdev.flcn.start_cpu(self.nvdev.flcn.sec2) + wait_cond(lambda: self.nvdev.NV_PGC6_BSI_SECURE_SCRATCH_14.read_bitfields()['boot_stage_3_handoff'], msg="SEC2 didn't hand off") + + mailbox = self.nvdev.NV_PFALCON_FALCON_MAILBOX0.with_base(self.nvdev.flcn.sec2).read() + assert mailbox == 0x0, f"Falcon SEC2 failed to execute, mailbox is {mailbox:08x}" + else: raise ValueError(f"Unknown op code {op} in run_cpu_seq") diff --git a/artifacts/package_runtime/tinygrad/runtime/support/nv/nvdev.py b/artifacts/package_runtime/tinygrad/runtime/support/nv/nvdev.py new file mode 100644 index 000000000..bddeaf5a7 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/nv/nvdev.py @@ -0,0 +1,163 @@ +from __future__ import annotations +import time, functools, tinygrad.runtime.autogen.nv_regs +from tinygrad.helpers import getenv, DEBUG, getbits, round_up +from tinygrad.runtime.autogen import pci +from tinygrad.runtime.support.memory import TLSFAllocator, MemoryManager, AddrSpace +from tinygrad.runtime.support.nv.ip import NV_FLCN, NV_FLCN_COT, NV_GSP +from tinygrad.runtime.support.system import PCIDevice +from tinygrad.runtime.support.hcq import MMIOInterface + +NV_DEBUG = getenv("NV_DEBUG", 0) + +class NVReg: + def __init__(self, nvdev, base, off, fields=None): self.nvdev, self.base, self.off, self.fields = nvdev, base, off, fields + + def __getitem__(self, idx:int): return NVReg(self.nvdev, self.base, self.off(idx), fields=self.fields) + + def add_field(self, name:str, start:int, end:int): self.fields[name] = (start, end) + def with_base(self, base:int): return NVReg(self.nvdev, base + self.base, self.off, self.fields) + + def read(self): return self.nvdev.rreg(self.base + self.off) + def read_bitfields(self) -> dict[str, int]: return self.decode(self.read()) + + def write(self, _ini_val:int=0, **kwargs): self.nvdev.wreg(self.base + self.off, _ini_val | self.encode(**kwargs)) + + def update(self, **kwargs): self.write(self.read() & ~self.mask(*kwargs.keys()), **kwargs) + + def mask(self, *names): + return functools.reduce(int.__or__, ((((1 << (self.fields[nm][1]-self.fields[nm][0] + 1)) - 1) << self.fields[nm][0]) for nm in names), 0) + + def encode(self, **kwargs) -> int: return functools.reduce(int.__or__, (value << self.fields[name][0] for name,value in kwargs.items()), 0) + def decode(self, val: int) -> dict: return {name:getbits(val, start, end) for name,(start,end) in self.fields.items()} + +class NVPageTableEntry: + def __init__(self, nvdev, paddr, lv): self.nvdev, self.paddr, self.lv, self.entries = nvdev, paddr, lv, nvdev.vram.view(paddr, 0x1000, fmt='Q') + + def _is_dual_pde(self) -> bool: return self.lv == self.nvdev.mm.level_cnt - 2 + + def set_entry(self, entry_id:int, paddr:int, table=False, uncached=False, aspace=AddrSpace.PHYS, snooped=False, frag=0, valid=True): + if not table: + x = self.nvdev.pte_t.encode(valid=valid, address_sys=paddr >> 12, aperture=2 if aspace is AddrSpace.SYS else 0, kind=6, + **({'pcf': int(uncached)} if self.nvdev.mmu_ver == 3 else {'vol': uncached})) + else: + pde = self.nvdev.dual_pde_t if self._is_dual_pde() else self.nvdev.pde_t + small, sys = ("_small" if self._is_dual_pde() else ""), "" if self.nvdev.mmu_ver == 3 else "_sys" + x = pde.encode(is_pte=False, **{f'aperture{small}': 1 if valid else 0, f'address{small}{sys}': paddr >> 12}, + **({f'pcf{small}': 0b10} if self.nvdev.mmu_ver == 3 else {'no_ats': 1})) + + if self._is_dual_pde(): self.entries[2*entry_id], self.entries[2*entry_id+1] = x & 0xffffffffffffffff, x >> 64 + else: self.entries[entry_id] = x + + def entry(self, entry_id:int) -> int: + return (self.entries[2*entry_id+1]<<64) | self.entries[2*entry_id] if self._is_dual_pde() else self.entries[entry_id] + + def read_fields(self, entry_id:int) -> dict: + if self.is_page(entry_id): return self.nvdev.pte_t.decode(self.entry(entry_id)) + return (self.nvdev.dual_pde_t if self._is_dual_pde() else self.nvdev.pde_t).decode(self.entry(entry_id)) + + def is_page(self, entry_id) -> bool: return (self.entry(entry_id) & 1 == 1) if self.lv < self.nvdev.mm.level_cnt - 1 else True + def supports_huge_page(self, paddr:int): return self.lv >= self.nvdev.mm.level_cnt - 3 and paddr % self.nvdev.mm.pte_covers[self.lv] == 0 + + def valid(self, entry_id): + if self.is_page(entry_id): return self.read_fields(entry_id)['valid'] + return self.read_fields(entry_id)['aperture_small' if self._is_dual_pde() else 'aperture'] != 0 + + def address(self, entry_id:int) -> int: + small, sys = ("_small" if self._is_dual_pde() else ""), "_sys" if self.nvdev.mmu_ver == 2 or self.lv == self.nvdev.mm.level_cnt - 1 else "" + return self.read_fields(entry_id)[f'address{small}{sys}'] << 12 + +class NVMemoryManager(MemoryManager): + va_allocator = TLSFAllocator((1 << 44), base=0x1000000000) # global for all devices. + + def on_range_mapped(self): self.dev.NV_VIRTUAL_FUNCTION_PRIV_MMU_INVALIDATE.write((1 << 0) | (1 << 1) | (1 << 6) | (1 << 31)) + +class NVDev: + def __init__(self, pci_dev:PCIDevice): + self.pci_dev, self.devfmt, self.mmio = pci_dev, pci_dev.pcibus, pci_dev.map_bar(0, fmt='I') + + self.smi_dev, self.is_booting, self.is_err_state = False, True, False + self._early_ip_init() + self._early_mmu_init() + + # No booting state, gsp client is reinited every run. + self.is_booting = False + + for ip in [self.flcn, self.gsp]: ip.init_sw() + for ip in [self.flcn, self.gsp]: ip.init_hw() + + def fini(self): + for ip in [self.gsp, self.flcn]: ip.fini_hw() + + def reg(self, reg:str) -> NVReg: return self.__dict__[reg] + def wreg(self, addr:int, value:int): + self.mmio[addr // 4] = value + if NV_DEBUG >= 4: print(f"wreg: {hex(addr)} = {hex(value)}") + def rreg(self, addr:int) -> int: return self.mmio[addr // 4] + + def _early_ip_init(self): + self.reg_names:set[str] = set() + self.reg_offsets:dict[str, tuple[int, int]] = {} + + self.include("nv_ref", "") + self.include("dev_fb", "tu102") + self.include("dev_gc6_island", "ga102") + + if self.reg("NV_PFB_PRI_MMU_WPR2_ADDR_HI").read() != 0: + self.pci_dev.write_config_flush(pci.PCI_COMMAND, self.pci_dev.read_config(pci.PCI_COMMAND, 2) & ~pci.PCI_COMMAND_MASTER, 2) + if DEBUG >= 2: print(f"nv {self.devfmt}: WPR2 is up. Issuing a full reset.", flush=True) + self.pci_dev.reset() + time.sleep(0.1) # wait until device can respond again + + self.pci_dev.write_config_flush(pci.PCI_COMMAND, self.pci_dev.read_config(pci.PCI_COMMAND, 2) | pci.PCI_COMMAND_MASTER, 2) + self.chip_id = self.reg("NV_PMC_BOOT_0").read() + self.chip_details = self.reg("NV_PMC_BOOT_42").read_bitfields() + self.chip_name = {0x17: "GA1", 0x19: "AD1", 0x1b: "GB2"}[self.chip_details['architecture']] + f"{self.chip_details['implementation']:02d}" + self.fw_name = {"GB2": "gb202", "AD1": "ad102", "GA1": "ga102"}[self.chip_name[:3]] + self.mmu_ver, self.fmc_boot = (3, True) if self.chip_details['architecture'] >= 0x1a else (2, False) + + self.flcn:NV_FLCN|NV_FLCN_COT = NV_FLCN_COT(self) if self.fmc_boot else NV_FLCN(self) + self.gsp:NV_GSP = NV_GSP(self) + + self.flcn.wait_for_reset() + + def _early_mmu_init(self): + self.include("dev_vm", "tu102") + + # MMU Init + self.include("dev_mmu", "gh100" if self.mmu_ver == 3 else "tu102") + self.pte_t, self.pde_t, self.dual_pde_t = [self.__dict__[name] for name in [f'NV_MMU_VER{self.mmu_ver}_PTE', f'NV_MMU_VER{self.mmu_ver}_PDE', + f'NV_MMU_VER{self.mmu_ver}_DUAL_PDE']] + + self.vram_size = self.reg("NV_PGC6_AON_SECURE_SCRATCH_GROUP_42").read() << 20 + + self.vram, self.mmio = self.pci_dev.map_bar(1), self.pci_dev.map_bar(0, fmt='I') + self.large_bar = self.vram.nbytes >= self.vram_size + + # UVM depth HW level VA bits + # 0 PDE4 56:56 (hopper+) + # 1 PDE3 55:47 + # 2 PDE2 46:38 + # 3 PDE1 (or 512M PTE) 37:29 + # 4 PDE0 (dual 64k/4k PDE, or 2M PTE) 28:21 + # 5 PTE_64K / PTE_4K 20:16 / 20:12 + bits, shifts = (56, [12, 21, 29, 38, 47, 56]) if self.mmu_ver == 3 else (48, [12, 21, 29, 38, 47]) + + # tail vram reserved for falcon structs + self.mm = NVMemoryManager(self, self.vram_size - (64 << 20), boot_size=(2 << 20), pt_t=NVPageTableEntry, va_bits=bits, va_shifts=shifts, + va_base=0, palloc_ranges=[(x, x) for x in [512 << 20, 2 << 20, 4 << 10]], reserve_ptable=not self.large_bar) + + def _alloc_boot_mem(self, size:int, data:bytes|None=None, contiguous:bool=False, sysmem:bool|None=None) -> tuple[MMIOInterface,int|None,list[int]]: + sz = round_up(size, 0x1000) + if sysmem is True or (sysmem is None and not self.large_bar): + view, sysaddr = self.pci_dev.alloc_sysmem(size, 0, contiguous=contiguous) + paddr = None + else: + paddr = self.mm.palloc(sz, boot=False) + view = self.vram.view(paddr, sz) + sysaddr = [self.pci_dev.bar_info(1)[0] + paddr + i * 0x1000 for i in range(sz // 0x1000)] + if data is not None: view[:size] = data + return view, paddr, sysaddr + + def include(self, name:str, arch:str): + for k,v in getattr(getattr(tinygrad.runtime.autogen.nv_regs, name), arch or 'regs').items(): + self.__dict__[k] = NVReg(self, *v) if isinstance(v, tuple) else v diff --git a/artifacts/package_runtime/tinygrad/runtime/support/objc.py b/artifacts/package_runtime/tinygrad/runtime/support/objc.py new file mode 100644 index 000000000..1dcead40e --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/objc.py @@ -0,0 +1,73 @@ +import ctypes, ctypes.util, functools, sys +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: id_ = ctypes.c_void_p +else: + class id_(ctypes.c_void_p): + _is_finalizing = sys.is_finalizing # FIXME: why is this needed + + retain: bool = False + # This prevents ctypes from converting response to plain int, and dict.fromkeys() can use it to dedup + def __hash__(self): return hash(self.value) + def __eq__(self, other): return self.value == other.value + def __del__(self): + if self.retain and not self._is_finalizing(): self.release() + def release(self): msg("release")(self) + def retained(self): + setattr(self, 'retain', True) + return self + +def returns_retained(f): return functools.wraps(f)(lambda *args, **kwargs: f(*args, **kwargs).retained()) + +lib = ctypes.CDLL(ctypes.util.find_library('objc')) +lib.sel_registerName.restype = id_ +getsel = functools.cache(lib.sel_registerName) +lib.objc_getClass.restype = id_ +dispatch_data_create = ctypes.CDLL("/usr/lib/libSystem.dylib").dispatch_data_create +dispatch_data_create.restype = id_ +dispatch_data_create = returns_retained(dispatch_data_create) + +def msg(sel:str, restype=id_, argtypes=[], retain=False, clsmeth=False): + # Using attribute access returns a new reference so setting restype is safe + (sender:=lib["objc_msgSend"]).restype, sender.argtypes = restype, [id_, id_]+list(argtypes) if argtypes else [] + def f(ptr, *args): return sender(ptr._objc_class_ if clsmeth else ptr, getsel(sel.encode()), *args) + return returns_retained(f) if retain else f + +if TYPE_CHECKING: + import _ctypes + class MetaSpec(_ctypes._PyCSimpleType): + _objc_class_: id_ + def __getattr__(cls, nm:str) -> Any: ... + def __setattr__(cls, nm:str, v:Any): ... +else: + class MetaSpec(type(id_)): + def __new__(mcs, name, bases, dct): + cls = super().__new__(mcs, name, bases, {'_objc_class_': lib.objc_getClass(name.encode()), '_children_': set(), **dct}) + cls._methods_, cls._classmethods_ = dct.get('_methods_', []), dct.get('_classmethods_', []) + return cls + + def __setattr__(cls, k, v): + super().__setattr__(k, v) + if k in ("_methods_", "_classmethods_"): + for m in v: cls._addmeth(m, clsmeth=(k=="_classmethods_")) + for c in cls._children_: c._inherit(cls) + if k == "_bases_": + for b in v: + b._children_.add(cls) + cls._inherit(b) + + def _inherit(cls, b): + for _b in getattr(b, "_bases_", []): cls._inherit(_b) + for m in getattr(b, "_methods_", []): cls._addmeth(m) + for m in getattr(b, "_classmethods_", []): cls._addmeth(m, True) + for c in cls._children_: c._inherit(cls) + + def _addmeth(cls, m, clsmeth=False): + nm = m[0].strip(':').replace(':', '_') + if clsmeth: setattr(cls, nm, classmethod(msg(m[0], cls if m[1] == 'instancetype' else m[1], + [cls if a == 'instancetype' else a for a in m[2]], *m[3:], clsmeth=True))) # type: ignore[misc] + else: setattr(cls, nm, msg(m[0], cls if m[1] == 'instancetype' else m[1], [cls if a == 'instancetype' else a for a in m[2]], *m[3:])) + +class Spec(id_, metaclass=MetaSpec): + if TYPE_CHECKING: + def __getattr__(self, nm:str) -> Any: ... diff --git a/artifacts/package_runtime/tinygrad/runtime/support/system.py b/artifacts/package_runtime/tinygrad/runtime/support/system.py new file mode 100644 index 000000000..44e560618 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/system.py @@ -0,0 +1,443 @@ +from __future__ import annotations +import os, mmap, array, functools, ctypes, select, contextlib, dataclasses, sys, itertools, struct, socket, subprocess, time, enum, atexit +from tinygrad.helpers import round_up, getenv, OSX, temp, ceildiv, unwrap, fetch, system, _ensure_downloads_dir, DEBUG, flatten, pluralize +from tinygrad.runtime.autogen import libc, pci, vfio, iokit, corefoundation +from tinygrad.runtime.support.hcq import FileIOInterface, MMIOInterface, HCQBuffer, hcq_filter_visible_devices +from tinygrad.runtime.support.memory import VirtMapping, AddrSpace, BumpAllocator +from tinygrad.runtime.support.usb import USB3, CustomASM24Controller, USBMMIOInterface + +MAP_FIXED, MAP_FIXED_NOREPLACE = 0x10, 0x100000 +MAP_LOCKED, MAP_POPULATE, MAP_NORESERVE = 0 if OSX else 0x2000, getattr(mmap, "MAP_POPULATE", 0 if OSX else 0x008000), 0x400 + +class _System: + def write_sysfs(self, path:str, value:str, msg:str, expected:str|None=None): + if FileIOInterface(path, os.O_RDONLY).read().splitlines()[0] != (expected or value): + os.system(cmd:=f"sudo sh -c 'echo {value} > {path}'") + if FileIOInterface(path, os.O_RDONLY).read().splitlines()[0] != (expected or value): raise RuntimeError(f"{msg}. Please run {cmd} manually.") + + @functools.cached_property + def atomic_lib(self): return ctypes.CDLL(ctypes.util.find_library('atomic')) if sys.platform == "linux" else None + + @functools.cached_property + def libsys(self): return ctypes.CDLL(ctypes.util.find_library("System")) + + @functools.cached_property + def pagemap(self) -> FileIOInterface: + self.write_sysfs("/proc/sys/vm/compact_unevictable_allowed", "0", "Failed to disable migration of locked pages") + return FileIOInterface("/proc/self/pagemap", os.O_RDONLY) + + @functools.cached_property + def vfio(self) -> FileIOInterface|None: + try: + if not FileIOInterface.exists("/sys/module/vfio"): os.system("sudo modprobe vfio-pci disable_idle_d3=1") + + FileIOInterface("/sys/module/vfio/parameters/enable_unsafe_noiommu_mode", os.O_RDWR).write("1") + vfio_fd = FileIOInterface("/dev/vfio/vfio", os.O_RDWR) + vfio.VFIO_CHECK_EXTENSION(vfio_fd, vfio.VFIO_NOIOMMU_IOMMU) + + return vfio_fd + except OSError: return None + + @functools.cache + def reserve_va(self, va_start, va_size): + # cached, runs only once per range. used to not collide with other mappings. + FileIOInterface.anon_mmap(va_start, va_size, 0, mmap.MAP_PRIVATE | mmap.MAP_ANONYMOUS | MAP_NORESERVE | MAP_FIXED_NOREPLACE, 0) + + def memory_barrier(self): lib.atomic_thread_fence(__ATOMIC_SEQ_CST:=5) if (lib:=self.libsys if OSX else self.atomic_lib) is not None else None + + def lock_memory(self, addr:int, size:int): + if libc.mlock(ctypes.c_void_p(addr), size): raise RuntimeError(f"Failed to lock memory at {addr:#x} with size {size:#x}") + + def system_paddrs(self, vaddr:int, size:int) -> list[int]: + self.pagemap.seek(vaddr // mmap.PAGESIZE * 8) + return [(x & ((1<<55) - 1)) * mmap.PAGESIZE for x in array.array('Q', self.pagemap.read(size//mmap.PAGESIZE*8, binary=True))] + + def pci_scan_bus(self, vendor:int, devices:tuple[tuple[int, tuple[int, ...]], ...], base_class:int|None=None) -> list[str]: + all_devs = [] + if OSX: + def read_prop(svc, key) -> int: + cfkey = corefoundation.CFStringCreateWithCString(None, key.encode(), corefoundation.kCFStringEncodingUTF8) + cfdata = ctypes.cast(iokit.IORegistryEntryCreateCFProperty(svc, ctypes.cast(cfkey, iokit.CFStringRef), None, 0), corefoundation.CFDataRef) + corefoundation.CFDataGetBytes(cfdata, corefoundation.CFRange(0, corefoundation.CFDataGetLength(cfdata)), buf:=(ctypes.c_uint8*8)()) + return int.from_bytes(bytes(buf), "little") + + iokit.IOServiceGetMatchingServices(0, iokit.IOServiceMatching(b"IOPCIDevice"), ctypes.byref(iterator:=ctypes.c_uint())) + while svc:=iokit.IOIteratorNext(iterator): + if base_class is not None and read_prop(svc, "class-code") >> 16 != base_class: continue + all_devs.append((v:=read_prop(svc, "vendor-id"), d:=read_prop(svc, "device-id"), f"{v:x}:{d:x}")) + else: + try: devs = FileIOInterface("/sys/bus/pci/devices") + except FileNotFoundError: raise RuntimeError("no pcie") + for pcibus in devs.listdir(): + if base_class is not None and int(FileIOInterface(f"/sys/bus/pci/devices/{pcibus}/class").read(), 16) >> 16 != base_class: continue + all_devs.append((int(FileIOInterface(f"/sys/bus/pci/devices/{pcibus}/vendor").read(), 16), + int(FileIOInterface(f"/sys/bus/pci/devices/{pcibus}/device").read(), 16), pcibus)) + + return sorted([val for vndr, device, val in all_devs if vndr == vendor and any((device & mask) in devlist for mask, devlist in devices)]) + + @functools.cache + def list_devices(self, vendor:int, devices:tuple[tuple[int, tuple[int, ...]], ...], base_class:int|None=None): + if getenv("REMOTE", ""): return [(functools.partial(RemotePCIDevice,sock=s), x) for s,x in RemotePCIDevice.remote_list(vendor,devices,base_class)] + return [(APLRemotePCIDevice if OSX else PCIDevice, x) for x in System.pci_scan_bus(vendor, devices, base_class)] + + def pci_probe_device(self, device:str, dev_id:int, vendor:int, devices:tuple[tuple[int, tuple[int, ...]], ...], base_class:int|None=None): + try: cl, pcibus = (ds:=hcq_filter_visible_devices(self.list_devices(vendor, devices, base_class), device))[dev_id] + except IndexError: raise RuntimeError(f"{device}:{dev_id} does not exist ({pluralize('device', len(ds))} available)") + return cl(device[:2], pcibus) + + def pci_setup_usb_bars(self, usb:CustomASM24Controller, gpu_bus:int, mem_base:int, pref_mem_base:int) -> dict[int, tuple[int, int]]: + for bus in range(gpu_bus): + # All 3 values must be written at the same time. + buses = (0 << 0) | ((bus+1) << 8) | ((gpu_bus) << 16) + usb.pcie_cfg_req(pci.PCI_PRIMARY_BUS, bus=bus, dev=0, fn=0, value=buses, size=4) + + usb.pcie_cfg_req(pci.PCI_MEMORY_BASE, bus=bus, dev=0, fn=0, value=(mem_base>>16) & 0xffff, size=2) + usb.pcie_cfg_req(pci.PCI_MEMORY_LIMIT, bus=bus, dev=0, fn=0, value=0xffff, size=2) + usb.pcie_cfg_req(pci.PCI_PREF_MEMORY_BASE, bus=bus, dev=0, fn=0, value=(pref_mem_base>>16) & 0xffff, size=2) + usb.pcie_cfg_req(pci.PCI_PREF_MEMORY_LIMIT, bus=bus, dev=0, fn=0, value=0xffff, size=2) + usb.pcie_cfg_req(pci.PCI_PREF_BASE_UPPER32, bus=bus, dev=0, fn=0, value=pref_mem_base >> 32, size=4) + usb.pcie_cfg_req(pci.PCI_PREF_LIMIT_UPPER32, bus=bus, dev=0, fn=0, value=0xffffffff, size=4) + + usb.pcie_cfg_req(pci.PCI_COMMAND, bus=bus, dev=0, fn=0, value=pci.PCI_COMMAND_IO | pci.PCI_COMMAND_MEMORY | pci.PCI_COMMAND_MASTER, size=1) + + # resize bar 0 + cap_ptr = 0x100 + while cap_ptr: + if pci.PCI_EXT_CAP_ID(hdr:=usb.pcie_cfg_req(cap_ptr, bus=gpu_bus, dev=0, fn=0, size=4)) == pci.PCI_EXT_CAP_ID_REBAR: + cap = usb.pcie_cfg_req(cap_ptr + 0x04, bus=gpu_bus, dev=0, fn=0, size=4) + new_ctrl = (usb.pcie_cfg_req(cap_ptr + 0x08, bus=gpu_bus, dev=0, fn=0, size=4) & ~0x1F00) | ((int(cap >> 4).bit_length() - 1) << 8) + usb.pcie_cfg_req(cap_ptr + 0x08, bus=gpu_bus, dev=0, fn=0, value=new_ctrl, size=4) + + cap_ptr = pci.PCI_EXT_CAP_NEXT(hdr) + + mem_space_addr, bar_off, bars = [mem_base, pref_mem_base], 0, {} + while bar_off < 24: + cfg = usb.pcie_cfg_req(pci.PCI_BASE_ADDRESS_0 + bar_off, bus=gpu_bus, dev=0, fn=0, size=4) + bar_mem, bar_64 = bool(cfg & pci.PCI_BASE_ADDRESS_MEM_PREFETCH), cfg & pci.PCI_BASE_ADDRESS_MEM_TYPE_64 + + if (cfg & pci.PCI_BASE_ADDRESS_SPACE) == pci.PCI_BASE_ADDRESS_SPACE_MEMORY: + usb.pcie_cfg_req(pci.PCI_BASE_ADDRESS_0 + bar_off, bus=gpu_bus, dev=0, fn=0, value=0xffffffff, size=4) + lo = (usb.pcie_cfg_req(pci.PCI_BASE_ADDRESS_0 + bar_off, bus=gpu_bus, dev=0, fn=0, size=4) & 0xfffffff0) + + if bar_64: usb.pcie_cfg_req(pci.PCI_BASE_ADDRESS_0 + bar_off + 4, bus=gpu_bus, dev=0, fn=0, value=0xffffffff, size=4) + hi = (usb.pcie_cfg_req(pci.PCI_BASE_ADDRESS_0 + bar_off + 4, bus=gpu_bus, dev=0, fn=0, size=4) if bar_64 else 0) + + bar_size = ((~(((hi << 32) | lo) & ~0xf)) + 1) & (0xffffffffffffffff if bar_64 else 0xffffffff) + + usb.pcie_cfg_req(pci.PCI_BASE_ADDRESS_0 + bar_off, bus=gpu_bus, dev=0, fn=0, value=mem_space_addr[bar_mem] & 0xffffffff, size=4) + if bar_64: usb.pcie_cfg_req(pci.PCI_BASE_ADDRESS_0 + bar_off + 4, bus=gpu_bus, dev=0, fn=0, value=mem_space_addr[bar_mem] >> 32, size=4) + + bars[bar_off // 4] = (mem_space_addr[bar_mem], bar_size) + mem_space_addr[bar_mem] += round_up(bar_size, 2 << 20) + + bar_off += 8 if bar_64 else 4 + + usb.pcie_cfg_req(pci.PCI_COMMAND, bus=gpu_bus, dev=0, fn=0, value=pci.PCI_COMMAND_IO | pci.PCI_COMMAND_MEMORY | pci.PCI_COMMAND_MASTER, size=1) + return bars + + def flock_acquire(self, name:str) -> int: + import fcntl # to support windows + + os.umask(0) # Set umask to 0 to allow creating files with 0666 permissions + + # Avoid O_CREAT because we don’t want to re-create/replace an existing file (triggers extra perms checks) when opening as non-owner. + if os.path.exists(lock_name:=temp(name)): self.lock_fd = os.open(lock_name, os.O_RDWR) + else: self.lock_fd = os.open(lock_name, os.O_RDWR | os.O_CREAT | os.O_CLOEXEC, 0o666) + + try: fcntl.flock(self.lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except OSError: raise RuntimeError(f"Failed to acquire lock file {name}. `sudo lsof {lock_name}` may help identify the process holding the lock.") + + return self.lock_fd + +System = _System() + +# *** PCI Devices + +class PCIDevice: + def __init__(self, devpref:str, pcibus:str): + self.lock_fd = System.flock_acquire(f"{devpref.lower()}_{pcibus.lower()}.lock") + self.pcibus, self.irq_poller = pcibus, None + + try: FileIOInterface(f"/sys/bus/pci/devices/{self.pcibus}/enable", os.O_RDWR) + except PermissionError: raise PermissionError(f"Cannot access PCI device {pcibus}: run `extra/amdpci/setup_python_cap.sh` or use sudo") + + if FileIOInterface.exists(f"/sys/bus/pci/devices/{self.pcibus}/driver"): + FileIOInterface(f"/sys/bus/pci/devices/{self.pcibus}/driver/unbind", os.O_WRONLY).write(self.pcibus) + if FileIOInterface.exists(f"/sys/bus/pci/devices/{self.pcibus}/driver"): raise RuntimeError(f"Driver is bound to {pcibus}") + + # remove sibling functions of the gpu, if any + for fn in range(1, 8): + if FileIOInterface.exists(sib:=f"/sys/bus/pci/devices/{self.pcibus[:-1]}{fn}"): FileIOInterface(f"{sib}/remove", os.O_WRONLY).write("1") + + if getenv("VFIO", 0) and (vfio_fd:=System.vfio) is not None: + FileIOInterface(f"/sys/bus/pci/devices/{self.pcibus}/driver_override", os.O_WRONLY).write("vfio-pci") + FileIOInterface("/sys/bus/pci/drivers_probe", os.O_WRONLY).write(self.pcibus) + iommu_group = FileIOInterface.readlink(f"/sys/bus/pci/devices/{self.pcibus}/iommu_group").split('/')[-1] + + self.vfio_group = FileIOInterface(f"/dev/vfio/noiommu-{iommu_group}", os.O_RDWR) + vfio.VFIO_GROUP_SET_CONTAINER(self.vfio_group, ctypes.c_int(vfio_fd.fd)) + + with contextlib.suppress(OSError): vfio.VFIO_SET_IOMMU(vfio_fd, vfio.VFIO_NOIOMMU_IOMMU) # set iommu works only once for the fd. + self.vfio_dev = FileIOInterface(fd=vfio.VFIO_GROUP_GET_DEVICE_FD(self.vfio_group, ctypes.create_string_buffer(self.pcibus.encode()))) + + self.irq_fd = FileIOInterface.eventfd(0, 0) + self.irq_poller = select.poll() + self.irq_poller.register(self.irq_fd.fd, select.POLLIN) + + irqs = vfio.struct_vfio_irq_set(index=vfio.VFIO_PCI_MSI_IRQ_INDEX, flags=vfio.VFIO_IRQ_SET_DATA_EVENTFD|vfio.VFIO_IRQ_SET_ACTION_TRIGGER, + argsz=ctypes.sizeof(vfio.struct_vfio_irq_set) + ctypes.sizeof(ctypes.c_int), count=1) + vfio.VFIO_DEVICE_SET_IRQS(self.vfio_dev, (ctypes.c_byte * irqs.argsz).from_buffer(bytearray(bytes(irqs)) + struct.pack('i', self.irq_fd.fd))) + else: FileIOInterface(f"/sys/bus/pci/devices/{self.pcibus}/enable", os.O_RDWR).write("1") + + self.cfg_fd = FileIOInterface(f"/sys/bus/pci/devices/{self.pcibus}/config", os.O_RDWR | os.O_SYNC | os.O_CLOEXEC) + + def alloc_sysmem(self, size:int, vaddr:int=0, contiguous:bool=False) -> tuple[MMIOInterface, list[int]]: + assert not contiguous or size <= (2 << 20), "Contiguous allocation is only supported for sizes up to 2MB" + flags = (libc.MAP_HUGETLB if contiguous and (size:=round_up(size, mmap.PAGESIZE)) > mmap.PAGESIZE else 0) | (MAP_FIXED if vaddr else 0) + va = FileIOInterface.anon_mmap(vaddr, size, mmap.PROT_READ|mmap.PROT_WRITE, mmap.MAP_SHARED|mmap.MAP_ANONYMOUS|MAP_POPULATE|MAP_LOCKED|flags, 0) + sysmem_view, paddrs = MMIOInterface(va, size), [(x, mmap.PAGESIZE) for x in System.system_paddrs(va, size)] + return sysmem_view, [p + i for p, sz in paddrs for i in range(0, sz, 0x1000)][:ceildiv(size, 0x1000)] + + def reset(self): os.system(f"sudo sh -c 'echo 1 > /sys/bus/pci/devices/{self.pcibus}/reset'") + def read_config(self, offset:int, size:int): return int.from_bytes(self.cfg_fd.read(size, binary=True, offset=offset), byteorder='little') + def write_config(self, offset:int, value:int, size:int): self.cfg_fd.write(value.to_bytes(size, byteorder='little'), binary=True, offset=offset) + def write_config_flush(self, offset:int, value:int, size:int): + self.write_config(offset, value, size) + self.read_config(offset, size) + + @functools.cache + def bar_fd(self, bar_idx:int) -> FileIOInterface: + return FileIOInterface(f"/sys/bus/pci/devices/{self.pcibus}/resource{bar_idx}", os.O_RDWR | os.O_SYNC | os.O_CLOEXEC) + @functools.cache + def bar_info(self, bar_idx:int) -> tuple[int, int]: + s, e, _ = FileIOInterface(f"/sys/bus/pci/devices/{self.pcibus}/resource", os.O_RDONLY).read().splitlines()[bar_idx].split() + return (int(s, 16), int(e, 16) - int(s, 16) + 1) + def map_bar(self, bar:int, off:int=0, addr:int=0, size:int|None=None, fmt='B') -> MMIOInterface: + fd, sz = self.bar_fd(bar), size or (self.bar_info(bar)[1] - off) + libc.madvise(loc:=fd.mmap(addr, sz, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED | (MAP_FIXED if addr else 0), off), sz, libc.MADV_DONTFORK) + return MMIOInterface(loc, sz, fmt=fmt) + def resize_bar(self, bar_idx:int): + rpath = f"/sys/bus/pci/devices/{self.pcibus}/resource{bar_idx}_resize" + try: FileIOInterface(rpath, os.O_RDWR).write(str(int(FileIOInterface(rpath, os.O_RDONLY).read(), 16).bit_length() - 1)) + except OSError as e: raise RuntimeError(f"Cannot resize BAR {bar_idx}: {e}. Ensure the resizable BAR option is enabled.") from e + +class USBPCIDevice(PCIDevice): + def __init__(self, devpref:str, dev, pcibus): + self.pcibus, self.peer_group = pcibus, f"USBPCIDevice_{pcibus}" + self.lock_fd = System.flock_acquire(f"{devpref.lower()}_{pcibus.lower()}.lock") + usb = USB3(dev) + if DEBUG >= 1: print(f"am {self.pcibus}: product string: {usb.product!r}") + self.usb: CustomASM24Controller = CustomASM24Controller(usb) + self._bar_info = System.pci_setup_usb_bars(self.usb, gpu_bus=4, mem_base=0x10000000, pref_mem_base=(32 << 30)) + self.sram = BumpAllocator(size=0x80000, wrap=False) # asm24 controller sram + + def dma_view(self, ctrl_addr, size): return USBMMIOInterface(self.usb, ctrl_addr, size, fmt='B', pcimem=False) + def alloc_sysmem(self, size:int, vaddr:int=0, contiguous:bool=False) -> tuple[MMIOInterface, list[int]]: + return self.dma_view(0xf000 + (off:=self.sram.alloc(size)), size), [0x200000 + off] + + def read_config(self, offset:int, size:int): return self.usb.pcie_cfg_req(offset, bus=4, dev=0, fn=0, size=size) + def write_config(self, offset:int, value:int, size:int): self.usb.pcie_cfg_req(offset, bus=4, dev=0, fn=0, value=value, size=size) + + def bar_info(self, bar_idx:int) -> tuple[int, int]: return self._bar_info[bar_idx] # type: ignore[override] + def map_bar(self, bar, off=0, addr=0, size=None, fmt='B'): + return USBMMIOInterface(self.usb, self.bar_info(bar)[0] + off, size or self.bar_info(bar)[1], fmt) + def resize_bar(self, bar_idx:int): pass # already resized + +@dataclasses.dataclass +class PCIAllocationMeta: mapping:VirtMapping; has_cpu_mapping:bool; hMemory:int=0 # noqa: E702 + +class PCIIfaceBase: + @property + def peer_group(self) -> str: return getattr(self.pci_dev, 'peer_group', type(self.pci_dev).__name__) + def is_local(self) -> bool: return not isinstance(self.pci_dev, RemotePCIDevice) + def is_bar_small(self) -> bool: return self.pci_dev.bar_info(self.vram_bar)[1] == (256 << 20) + + def __init__(self, dev, dev_id, vendor, devices:tuple[tuple[int, tuple[int, ...]], ...], vram_bar, va_start, va_size, + dev_impl_t, base_class:int|None=None): + self.pci_dev = System.pci_probe_device(dn:=dev.__class__.__name__[:-6], dev_id, vendor, devices, base_class=base_class) + if self.is_local(): System.reserve_va(va_start, va_size) + with contextlib.suppress(Exception): self.pci_dev.resize_bar(vram_bar) + self.dev_impl = dev_impl_t(self.pci_dev) + self.dev, self.vram_bar, self.count = dev, vram_bar, len(hcq_filter_visible_devices(System.list_devices(vendor, devices, base_class), dn)) + + def alloc(self, size:int, host=False, uncached=False, cpu_access=False, contiguous=False, force_devmem=False, **kwargs) -> HCQBuffer: + should_use_sysmem = host or ((cpu_access if self.is_bar_small() else (uncached and cpu_access)) and not force_devmem) + + # Align size to huge pages for large allocations, otherwise the unaligned tail falls back to 4KB pages, increasing TLB pressure. + size = round_up(size, mmap.PAGESIZE if should_use_sysmem else ((2 << 20) if size >= (8 << 20) else (4 << 10))) + + if should_use_sysmem: + vaddr = self.dev_impl.mm.alloc_vaddr(size:=round_up(size, mmap.PAGESIZE), align=mmap.PAGESIZE) + memview, paddrs = self.pci_dev.alloc_sysmem(size, vaddr=vaddr, contiguous=contiguous) + mapping = self.dev_impl.mm.map_range(vaddr, size, [(paddr, 0x1000) for paddr in paddrs], aspace=AddrSpace.SYS, snooped=True, uncached=True) + return HCQBuffer(vaddr, size, meta=PCIAllocationMeta(mapping, has_cpu_mapping=True, hMemory=paddrs[0]), view=memview, owner=self.dev) + + mapping = self.dev_impl.mm.valloc(size:=round_up(size, 0x1000), uncached=uncached, contiguous=cpu_access) + barview = self.pci_dev.map_bar(bar=self.vram_bar, off=mapping.paddrs[0][0], size=mapping.size) if cpu_access else None + return HCQBuffer(mapping.va_addr, size, view=barview, meta=PCIAllocationMeta(mapping, cpu_access, hMemory=mapping.paddrs[0][0]), owner=self.dev) + + def free(self, b:HCQBuffer): + if b.owner != self.dev: self.dev.iface.dev_impl.mm.unmap_range(b.va_addr, round_up(b.size, 0x1000)) + if b.owner == self.dev and b.meta.mapping.aspace is AddrSpace.PHYS: self.dev_impl.mm.vfree(b.meta.mapping) + if b.owner == self.dev and self.is_local() and b.meta.has_cpu_mapping: FileIOInterface.munmap(b.va_addr, b.size) + + def p2p_paddrs(self, paddrs:list[tuple[int,int]]) -> tuple[list[tuple[int,int]], AddrSpace]: + return [(p + self.pci_dev.bar_info(self.vram_bar)[0], sz) for p, sz in paddrs], AddrSpace.SYS + + def map(self, b:HCQBuffer): + if b.owner is not None and b.owner._is_cpu(): + if not self.is_local(): raise RuntimeError(f"P2P mapping not supported for remote devices: {b.owner} -> {self.dev}") + + System.lock_memory(int(b.va_addr), b.size) + paddrs, aspace = [(x, 0x1000) for x in System.system_paddrs(int(b.va_addr), round_up(b.size, 0x1000))], AddrSpace.SYS + snooped, uncached = True, True + elif (ifa:=getattr(b.owner, "iface", None)) is not None and isinstance(ifa, PCIIfaceBase): + if ifa.is_bar_small(): raise RuntimeError(f"P2P mapping not supported for small bar devices: {b.owner} -> {self.dev}") + + snooped, uncached = True, b.meta.mapping.uncached + if b.meta.mapping.aspace is AddrSpace.SYS: paddrs, aspace = b.meta.mapping.paddrs, AddrSpace.SYS + else: paddrs, aspace = ifa.p2p_paddrs(b.meta.mapping.paddrs) + else: raise RuntimeError(f"map failed: {b.owner} -> {self.dev}") + + self.dev_impl.mm.map_range(int(b.va_addr), round_up(b.size, 0x1000), paddrs, aspace=aspace, snooped=snooped, uncached=uncached) + return HCQBuffer(b.va_addr, b.size, meta=b.meta, owner=b.owner) + +# *** Remote PCI Devices + +class RemoteCmd(enum.IntEnum): + PROBE,MAP_BAR,MAP_SYSMEM_FD,CFG_READ,CFG_WRITE,RESET,MMIO_READ,MMIO_WRITE,MAP_SYSMEM,SYSMEM_READ,SYSMEM_WRITE,RESIZE_BAR,PING = range(13) + +class RemoteMMIOInterface(MMIOInterface): + def __init__(self, dev:RemotePCIDevice, residx:int, nbytes:int, fmt='B', off=0, rd_cmd=RemoteCmd.MMIO_READ, wr_cmd=RemoteCmd.MMIO_WRITE): + self.dev, self.residx, self.nbytes, self.fmt, self.off, self.el_sz = dev, residx, nbytes, fmt, off, struct.calcsize(fmt) + self.rd_cmd, self.wr_cmd = rd_cmd, wr_cmd + + def __getitem__(self, index): + sl = index if isinstance(index, slice) else slice(index, index + 1) + start, stop = (sl.start or 0) * self.el_sz, (sl.stop or len(self)) * self.el_sz + data = self.dev._bulk_read(self.rd_cmd, self.residx, self.off + start, stop - start) + result = data if self.fmt == 'B' else list(struct.unpack(f'<{(stop - start) // self.el_sz}{self.fmt}', data)) + return result if isinstance(index, slice) else result[0] + + def __setitem__(self, index, val): + start = (index.start or 0) * self.el_sz if isinstance(index, slice) else index * self.el_sz + data = (val if self.fmt == 'B' else struct.pack(f'<{len(val)}{self.fmt}', *val)) if isinstance(index, slice) else struct.pack(f'<{self.fmt}', val) + self.dev._bulk_write(self.wr_cmd, self.residx, self.off + start, data) + + def view(self, offset:int=0, size:int|None=None, fmt=None): + return RemoteMMIOInterface(self.dev, self.residx, size or (self.nbytes - offset), fmt or self.fmt, self.off + offset, self.rd_cmd, self.wr_cmd) + +class RemotePCIDevice(PCIDevice): + _bulk_sent:int = 0 + _bulk_recv:int = 0 + _rpc_count:int = 0 + _start_time:float = 0.0 + + @staticmethod + @functools.cache + def remote_sock(host:str, port:int) -> socket.socket: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + sock.settimeout(getenv("REMOTE_TIMEOUT", 3)) + sock.connect((host, port)) + sock.settimeout(None) + if DEBUG >= 1 and RemotePCIDevice._start_time == 0.0: + RemotePCIDevice._start_time = time.perf_counter() + def _print_stats(): + dt = time.perf_counter() - RemotePCIDevice._start_time + sent_mb, recv_mb = RemotePCIDevice._bulk_sent / 1e6, RemotePCIDevice._bulk_recv / 1e6 + print(f"remote: sent {sent_mb:,.2f} MB ({sent_mb/dt:,.2f} MB/s), recv {recv_mb:,.2f} MB ({recv_mb/dt:,.2f} MB/s), " + f"{RemotePCIDevice._rpc_count:,} roundtrips in {dt:.2f}s") + atexit.register(_print_stats) + return sock + + @staticmethod + @functools.cache + def remote_list(vendor:int, devices:tuple[tuple[int, tuple[int, ...]], ...], base_class:int|None) -> list[tuple[socket.socket, str]]: + payload = array.array('I', itertools.chain.from_iterable((m, d) for m, ds in devices for d in ds)).tobytes() + def q(r:str) -> list[tuple[socket.socket, str]]: + sock = RemotePCIDevice.remote_sock((host:=r.strip().split(":")[0]), (port:=int(r.strip().split(":")[1]) if ":" in r else 6667)) + data_len, _, _, _ = RemotePCIDevice._rpc(sock, 0, RemoteCmd.PROBE, base_class or 0, len(payload), vendor, payload=payload) + return [(sock, f"remote:{host}:{port}:{d}") for d in RemotePCIDevice._recvall(sock, data_len).decode().split('\n')] + return flatten([q(r) for r in getenv("REMOTE", "").split(",") if r.strip()]) + + @staticmethod + def _recvall(sock:socket.socket, n:int) -> bytes: + data = b'' + while len(data) < n and (chunk:=sock.recv(n - len(data))): data += chunk + if len(data) < n: raise RuntimeError("Connection closed") + return data + + @staticmethod + def _rpc(sock:socket.socket, dev_id:int, cmd:int, *args:int, bar:int=0, readout_size:int=0, payload:bytes=b'', has_fd=False): + sock.sendall(struct.pack(' 0 else 'unknown error'}") + RemotePCIDevice._rpc_count += 1 + return (resp[1], resp[2]) + ((RemotePCIDevice._recvall(sock, readout_size) if readout_size > 0 else None),) + (fd,) + + def __init__(self, devpref:str, pcibus:str, sock:socket.socket): + self.sock, self.pcibus, self.dev_id = sock, pcibus, int(pcibus.split(':')[-1]) if ':' in pcibus else 0 + self.peer_group = sock.getpeername()[0] + for buft in [socket.SO_SNDBUF, socket.SO_RCVBUF]: self.sock.setsockopt(socket.SOL_SOCKET, buft, 64 << 20) + + self.lock_fd = System.flock_acquire(f"{devpref.lower()}_{pcibus.lower()}.lock") + + def _bulk_read(self, cmd:int, idx:int, offset:int, size:int) -> bytes: + RemotePCIDevice._bulk_recv += size + return unwrap(self._rpc(self.sock, self.dev_id, cmd, offset, size, bar=idx, readout_size=size)[2]) + def _bulk_write(self, cmd:int, idx:int, offset:int, data:bytes): + RemotePCIDevice._bulk_sent += len(data) + self.sock.sendall(struct.pack(' tuple[MMIOInterface, list[int]]: + paddrs_len, handle, _, _ = self._rpc(self.sock, self.dev_id, RemoteCmd.MAP_SYSMEM, size, int(contiguous)) + paddrs = list(struct.unpack(f'<{paddrs_len // 8}Q', self._recvall(self.sock, paddrs_len))) + return RemoteMMIOInterface(self, handle, size, fmt='B', rd_cmd=RemoteCmd.SYSMEM_READ, wr_cmd=RemoteCmd.SYSMEM_WRITE), paddrs + + def reset(self): self._rpc(self.sock, self.dev_id, RemoteCmd.RESET) + def read_config(self, offset:int, size:int): return self._rpc(self.sock, self.dev_id, RemoteCmd.CFG_READ, offset, size)[0] + def write_config(self, offset:int, value:int, size:int): self._rpc(self.sock, self.dev_id, RemoteCmd.CFG_WRITE, offset, size, value) + + @functools.cache + def bar_info(self, bar_idx:int) -> tuple[int, int]: return self._rpc(self.sock, self.dev_id, RemoteCmd.MAP_BAR, bar=bar_idx)[:2] + def map_bar(self, bar:int, off:int=0, addr:int=0, size:int|None=None, fmt='B') -> MMIOInterface: + return RemoteMMIOInterface(self, bar, size or self.bar_info(bar)[1], fmt).view(off, size, fmt) + def resize_bar(self, bar_idx:int): self._rpc(self.sock, self.dev_id, RemoteCmd.RESIZE_BAR, bar=bar_idx) + +class APLRemotePCIDevice(RemotePCIDevice): + APP_PATH = "/Applications/TinyGPU.app/Contents/MacOS/TinyGPU" + + @classmethod + def ensure_app(cls): + commit = "c0d024f9ff0e1dc8fdf217f255da7101d91e8323" + app_name = f"TinyGPU_{commit}.zip" + if (_ensure_downloads_dir() / app_name).is_file() and os.path.exists(cls.APP_PATH): return + print("Downloading TinyGPU.app...") + with contextlib.suppress(RuntimeError): system("pkill -f TinyGPU") + system(f"ditto -xk {fetch(f'https://github.com/tinygrad/tinygpu_releases/raw/{commit}/TinyGPU.zip', name=app_name)} /Applications") + print(system(f"{cls.APP_PATH} install")) + + def __init__(self, devpref:str, pcibus:str): + self.ensure_app() + sock_path, sock = getenv("APL_REMOTE_SOCK", temp("tinygpu.sock")), socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + for i in range(100): + with contextlib.suppress(ConnectionRefusedError, FileNotFoundError): + sock.connect(sock_path) + break + if i == 0: subprocess.Popen([self.APP_PATH, "server", sock_path], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + time.sleep(0.05) + else: raise RuntimeError(f"Failed to connect to TinyGPU server at {sock_path}.") + super().__init__(devpref, "usb4", sock=sock) + + def alloc_sysmem(self, size:int, vaddr:int=0, contiguous:bool=False) -> tuple[MMIOInterface, list[int]]: + mapped_size, _, _, fd = self._rpc(self.sock, self.dev_id, RemoteCmd.MAP_SYSMEM_FD, size, int(contiguous), has_fd=True) + memview = MMIOInterface(FileIOInterface(fd=fd).mmap(0, mapped_size, mmap.PROT_READ | mmap.PROT_WRITE, mmap.MAP_SHARED, 0), mapped_size, fmt='B') + + # paddrs are returned as (paddr, size) pairs until a (paddr=0, size=0) terminator in the beginning of the mapping. + paddrs_raw = list(itertools.takewhile(lambda p: p[1] != 0, zip(memview.view(fmt='Q')[0::2], memview.view(fmt='Q')[1::2]))) + return memview, [p + i for p, sz in paddrs_raw for i in range(0, sz, 0x1000)][:ceildiv(size, 0x1000)] diff --git a/artifacts/package_runtime/tinygrad/runtime/support/usb.py b/artifacts/package_runtime/tinygrad/runtime/support/usb.py new file mode 100644 index 000000000..b7e8b8186 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/runtime/support/usb.py @@ -0,0 +1,203 @@ +import ctypes, struct, time, functools, itertools +from tinygrad.runtime.autogen import libusb +from tinygrad.helpers import DEBUG, DEV, to_mv, round_up, ceildiv +from tinygrad.runtime.support.hcq import MMIOInterface +from tinygrad.runtime.support import c + +def alloc_cbuffer(sz:int) -> tuple[ctypes.Array, memoryview]: return (buf:=(ctypes.c_ubyte * sz)()), to_mv(ctypes.addressof(buf), sz) +def checked(fn, msg=None): + @functools.wraps(fn) + def wrapper(*args): + if (rc:=fn(*args)) < 0: raise RuntimeError(f"{msg or fn.__name__}: {ctypes.string_at(libusb.libusb_strerror(rc)).decode()}") + return rc + return wrapper + +class USB3: + @staticmethod + @functools.cache + def ctx(): + ctx = c.init_c_var(ctypes.POINTER(libusb.struct_libusb_context), checked(libusb.libusb_init)) + if DEBUG >= 6: checked(libusb.libusb_set_option)(ctx, libusb.LIBUSB_OPTION_LOG_LEVEL, 4) + return ctx + + @classmethod + @functools.cache + def list_devices(cls, vendor:int, dev:int) -> list[tuple[c.POINTER[libusb.struct_libusb_device], str]]: + ret = [] + for i in range(checked(libusb.libusb_get_device_list)(cls.ctx(), devs:=ctypes.POINTER(ctypes.POINTER(libusb.struct_libusb_device))())): + desc = c.init_c_var(libusb.struct_libusb_device_descriptor, lambda x: checked(libusb.libusb_get_device_descriptor)(devs[i], x)) + if (desc.idVendor, desc.idProduct) == (vendor, dev): + ret.append((libusb.libusb_ref_device(devs[i]), f"usb:{libusb.libusb_get_bus_number(devs[i])}-{libusb.libusb_get_device_address(devs[i])}")) + libusb.libusb_free_device_list(devs, 1) + return ret + + def __init__(self, dev:c.POINTER[libusb.struct_libusb_device], *args, **kwargs): + self._tags, self._transferred = itertools.count(1), ctypes.c_int(0) + self._bulk_buf, self._bulk_mv = alloc_cbuffer(4 << 20) + self._ctrl_buf, self._ctrl_mv = alloc_cbuffer(0x1000) + + self.handle = c.init_c_var(c.POINTER[libusb.struct_libusb_device_handle], lambda x: checked(libusb.libusb_open)(dev, x)) + + # Read product string descriptor + _buf = (ctypes.c_ubyte * 256)() + _desc = libusb.struct_libusb_device_descriptor() + checked(libusb.libusb_get_device_descriptor)(libusb.libusb_get_device(self.handle), ctypes.byref(_desc)) + _ret = checked(libusb.libusb_get_string_descriptor_ascii)(self.handle, _desc.iProduct, _buf, 256) + self.product = bytes(_buf[:_ret]).decode("ascii", errors="replace") + assert self.product.startswith("custom") or self.product.startswith("AS2462") + + # Detach kernel driver if needed + if checked(libusb.libusb_kernel_driver_active)(self.handle, 0): + checked(libusb.libusb_detach_kernel_driver)(self.handle, 0) + checked(libusb.libusb_reset_device)(self.handle) + + # Set configuration and claim interface + checked(libusb.libusb_set_configuration)(self.handle, 1) + checked(libusb.libusb_claim_interface)(self.handle, 0) + checked(libusb.libusb_set_interface_alt_setting)(self.handle, 0, 0) + + def control_write(self, request:int, value:int=0, index:int=0, data:bytes=b'', timeout:int=1000): + assert len(data) <= len(self._ctrl_mv) + self._ctrl_mv[:len(data)] = data + assert checked(libusb.libusb_control_transfer)(self.handle, 0x40, request, value, index, self._ctrl_buf, len(data), timeout) == len(data) + + def control_read(self, request:int, length:int, value:int=0, index:int=0, timeout:int=1000) -> memoryview: + assert length <= len(self._ctrl_mv) + assert checked(libusb.libusb_control_transfer)(self.handle, 0xC0, request, value, index, self._ctrl_buf, length, timeout) == length + return self._ctrl_mv[:length] + + def bulk_write(self, payload:bytes, timeout:int=1000): + if len(payload) > len(self._bulk_mv): self._bulk_buf, self._bulk_mv = alloc_cbuffer(len(payload)) + self._bulk_mv[:len(payload)] = payload + checked(libusb.libusb_bulk_transfer, "bulk OUT 0x02 failed") \ + (self.handle, 0x02, self._bulk_buf, len(payload), self._transferred, timeout) + assert self._transferred.value == len(payload), f"bulk OUT short write: {self._transferred.value}/{len(payload)} bytes" + + def bulk_read(self, length:int, timeout:int=1000) -> memoryview: + if length > len(self._bulk_mv): self._bulk_buf, self._bulk_mv = alloc_cbuffer(length) + checked(libusb.libusb_bulk_transfer, "bulk IN 0x81 failed")(self.handle, 0x81, self._bulk_buf, length, self._transferred, timeout) + return self._bulk_mv[:self._transferred.value] + + # NOTE: keep it for flash.py + def send_batch(self, cdbs:list[bytes], odata:list[bytes|None]|None=None): + for cdb, data in zip(cdbs, odata or [None] * len(cdbs)): + self.bulk_write(struct.pack("> 32, value), 5000) + + def _f0_in(self) -> tuple[int, int, int]: + data = self.usb.control_read(0xF0, 8, timeout=5000) + return struct.unpack_from('> 5) & 0x7, data[7] + + def pcie_request(self, fmt_type:int, address:int, value:int|None=None, size:int=4, cnt:int=10): + assert size > 0 and size <= 4, f"Invalid size {size}" + if DEBUG >= 5: print("pcie_request", hex(fmt_type), hex(address), value, size) + + offset = address & 0x3 + byte_en = ((1 << size) - 1) << offset + self._f0_out(fmt_type, byte_en, address & ~0x3, (value << (8 * offset)) if value is not None else 0) + + # Fast path: memory writes and messages don't return completions. + if ((fmt_type & 0b11011111) == 0b01000000) or ((fmt_type & 0b10111000) == 0b00110000): return + + # Read TLPs and config writes: read completion via 0xF0 IN. Retry on error/timeout. + data, cpl_status, ret_status = self._f0_in() + if ret_status != 0: + time.sleep(0.001) # TODO: this sleep is very picky + if cnt > 0: return self.pcie_request(fmt_type, address, value, size, cnt=cnt-1) + raise RuntimeError(f"TLP error after retries: ret_status={ret_status}, address={address:#x}") + + if cpl_status: + status_map = {0b001: f"Unsupported Request: {address:#x}", 0b100: "Completer Abort", 0b010: "Config Retry"} + raise RuntimeError(f"TLP completion status: {status_map.get(cpl_status, f'Reserved (0b{cpl_status:03b})')}") + + if value is None: return (data >> (8 * offset)) & ((1 << (8 * size)) - 1) + + def pcie_cfg_req(self, byte_addr:int, bus:int=1, dev:int=0, fn:int=0, value:int|None=None, size:int=4): + assert byte_addr >> 12 == 0 and bus >> 8 == 0 and dev >> 5 == 0 and fn >> 3 == 0 + fmt_type = (0x44 if value is not None else 0x4) | int(bus > 0) + address = (bus << 24) | (dev << 19) | (fn << 16) | (byte_addr & 0xfff) + return self.pcie_request(fmt_type, address, value, size) + + def pcie_mem_write(self, address:int, data:bytes): + """Streaming PCIe memory write via 0xF0 mode 1 + bulk OUT. Data is little-endian dwords on the wire.""" + if not data: return + assert len(data) % 4 == 0, f"pcie_mem_write requires 4-byte aligned size, got {len(data)}" + self._f0_out(0x60, 0x0F, address, len(data) // 4, mode=1) + self.usb.bulk_write(data) + + def pcie_mem_read(self, address:int, nbytes:int) -> memoryview: + """Streaming PCIe memory read via 0xF0 mode 2 + bulk IN. Returns little-endian bytes.""" + assert nbytes % 4 == 0, f"pcie_mem_read requires 4-byte aligned size, got {nbytes}" + self._f0_out(0x20, 0x0F, address, nbytes // 4, mode=2) + return self.usb.bulk_read(nbytes, timeout=30000) + + def read(self, base_addr:int, length:int) -> bytes: + """Read from chip XDATA via vendor control IN (bRequest=0xE4). wValue=addr, wLength=size.""" + result = b'' + for off in range(0, length, 0xFF): + chunk = min(0xFF, length - off) + result += self.usb.control_read(0xE4, chunk, value=base_addr + off) + return result + + def write(self, base_addr:int, data:bytes): + """Write to chip XDATA via vendor control OUT (bRequest=0xE5). wValue=addr, wIndex=val.""" + for off, val in enumerate(data): self.usb.control_write(0xE5, value=base_addr + off, index=val) + + def scsi_write(self, buf:bytes): + """Write to SRAM via 0xF2 vendor command + bulk OUT.""" + buf_padded = buf + b'\x00' * (round_up(len(buf), 512) - len(buf)) + sectors = len(buf_padded) // 512 + num_slots = ceildiv(len(buf_padded), 0x4000) # 16KB per slot + windex = (num_slots & 0xFF) << 8 + self.usb.control_write(0xF2, value=sectors, index=windex) + self.usb.bulk_write(buf_padded) + + def scsi_read_arm(self, size:int): + windex = (ceildiv(size, 0x4000) & 0xFF) << 8 + self.usb.control_write(0xF2, value=(ceildiv(size, 512) & 0x7FFF) | 0x8000, index=windex) + + def scsi_read(self, size:int) -> memoryview: return self.usb.bulk_read(round_up(size, 512), timeout=10000)[:size] + +class USBMMIOInterface(MMIOInterface): + def __init__(self, usb, addr, size, fmt, pcimem=True): # pylint: disable=super-init-not-called + self.usb, self.addr, self.nbytes, self.fmt, self.el_sz, self.pcimem = usb, addr, size, fmt, struct.calcsize(fmt), pcimem + + def _off_from_index(self, index): + if isinstance(index, slice): return ((index.start or 0) * self.el_sz, ((index.stop or len(self))-(index.start or 0)) * self.el_sz) + return (index * self.el_sz, self.el_sz) + + def __getitem__(self, index): + off, sz = self._off_from_index(index) + if self.pcimem: + assert sz % 4 == 0 and off % 4 == 0, f"pcie_mem_read requires 4-byte aligned access, got off={off}, sz={sz}" + data = self.usb.pcie_mem_read(self.addr + off, sz) + else: data = self.usb.scsi_read(sz) if self.addr == 0xf000 else self.usb.read(self.addr + off, sz) + return int.from_bytes(data, "little") if sz == self.el_sz else data + + def __setitem__(self, index, data): + off, _ = self._off_from_index(index) + data = struct.pack(self.fmt, data) if isinstance(data, int) else bytes(data) + if not self.pcimem: self.usb.scsi_write(data) if self.addr == 0xf000 else self.usb.write(self.addr + off, data) + else: self.usb.pcie_mem_write(self.addr+off, data) + + def view(self, offset:int=0, size:int|None=None, fmt=None): + return USBMMIOInterface(self.usb, self.addr+offset, self.nbytes-offset if size is None else size, fmt=fmt or self.fmt, pcimem=self.pcimem) + +if DEV.interface.startswith("MOCK"): from test.mockgpu.usb import MockUSB3 as USB3 # type: ignore # noqa: F811 diff --git a/artifacts/package_runtime/tinygrad/schedule/__init__.py b/artifacts/package_runtime/tinygrad/schedule/__init__.py new file mode 100644 index 000000000..a98e97b7c --- /dev/null +++ b/artifacts/package_runtime/tinygrad/schedule/__init__.py @@ -0,0 +1,203 @@ +import time, inspect +from collections import deque +from tinygrad.uop.ops import UOp, Ops, UOpMetaClass, rewrite_group, graph_rewrite, gate_kernel_sink, KernelInfo +from tinygrad.uop.spec import type_verify, spec_tensor +from tinygrad.helpers import DEBUG, cpu_profile, TracingKey, SPEC, pluralize, SCACHE, BASEDIR, partition, dedup + +# **** schedule linearizer + +# unwrap VIEW/CAST/etc to find the actual data source (kernel output, buffer, or multi-device op) +def _unwrap_src(s: UOp) -> UOp: + while len(s.src) and s.op not in {Ops.AFTER, Ops.BUFFER, Ops.PARAM, Ops.MSELECT, Ops.MSTACK, Ops.BIND}: s = s.src[0] + return s + +# a buffer state is AFTER | BUFFER | PARAM. MSELECT/MSTACK join per-device states, BIND is not a buffer dependency +def _states(s: UOp) -> list[UOp]: + s = _unwrap_src(s) + if s.op in {Ops.MSELECT, Ops.MSTACK}: return [st for ss in s.src for st in _states(ss)] + if s.op is Ops.BIND: return [] + assert s.op in {Ops.AFTER, Ops.BUFFER, Ops.PARAM}, f"input to kernel must resolve to a buffer state, not {s.op}" + return [s] + +def _split_after(after: UOp) -> tuple[tuple[UOp, ...], tuple[UOp, ...]]: + kernels, remaining = partition(after.src[1:], lambda s: s.op in {Ops.CALL, Ops.END}) + deps, remaining = partition(remaining, lambda s: s.op is Ops.AFTER) + if invalid := [s for s in remaining if s.op is not Ops.STORE]: + raise AssertionError(f"AFTER source should be CALL, END, STORE, or AFTER, not {invalid[0].op}") + return tuple(kernels), tuple(deps) + +def create_schedule(sched_sink:UOp) -> UOp: + with cpu_profile(TracingKey("toposort sched_sink")): + # build kernel dependency graph: edges from producer kernel to consumer kernels + children: dict[UOp, list[UOp]] = {} + in_degree: dict[UOp, int] = {} + writes: dict[UOp, list[tuple[UOp, UOp, tuple[UOp, ...]]]] = {} # buffer -> (AFTER, prior state, new kernels) + reads: list[tuple[UOp, UOp, UOp]] = [] # (reader AFTER, reader kernel, buffer state read) + for u in sched_sink.toposort(gate_kernel_sink): + if u.op is not Ops.AFTER: continue + kernels, after_deps = _split_after(u) + prev_state = _unwrap_src(u.src[0]) + prev_kernels = set(_split_after(prev_state)[0]) if prev_state.op is Ops.AFTER else set() + writes.setdefault(u.buf_uop, []).append((u, prev_state, tuple(k for k in kernels if k not in prev_kernels))) + for k in kernels: + in_degree.setdefault(k, 0) + if k.op is Ops.END: assert k.src[0].op is Ops.CALL, f"END src[0] should be KERNEL, not {k.src[0].op}" + kernel_deps = k.src[0].src[1:] if k.op is Ops.END else k.src[1:] + read_states = [st for s in kernel_deps for st in _states(s)] + reads += [(u, k, st) for st in read_states] + # RAW deps: a kernel runs after the kernels that produced the states it reads or joins + for st in read_states + [st for s in after_deps for st in _states(s)]: + if st.op is Ops.AFTER: + for t in _split_after(st)[0]: + children.setdefault(t, []).append(k) + in_degree[k] += 1 + # WAR deps: a kernel reading buffer state S must run before another write that supersedes S. an AFTER only + # supersedes its immediate prior state; join members already present in that prior state are ordering deps, not writes + for u, k, s in reads: + for a, prev_state, write_kernels in writes.get(s.buf_uop, []): + if a is u or prev_state is not s: continue + for t in write_kernels: + if t is not k and t not in k.backward_slice: + children.setdefault(k, []).append(t) + in_degree[t] += 1 + + with cpu_profile(TracingKey("linearize schedule")): + queue: deque[UOp] = deque(k for k,v in in_degree.items() if v == 0) + linearized: list[UOp] = [] + while len(queue): + rk = queue.popleft() + if rk.op is Ops.LINEAR: + linearized.extend(rk.src) + else: + k = rk.src[0] if rk.op is Ops.END else rk + assert k.op is Ops.CALL, f"unexpected op in queue: {k.op}" + buf_uops = tuple(_unwrap_src(s).buf_uop for s in k.src[1:] if s.op is not Ops.BIND) + linearized.append(k.src[0].call(*buf_uops)) + for x in children.get(rk, []): + in_degree[x] -= 1 + if in_degree[x] == 0: queue.append(x) + if any(in_degree.values()): raise RuntimeError("cycle detected in assign graph") + return UOp(Ops.LINEAR, src=tuple(linearized)) + +from tinygrad.schedule.memory import memory_plan_rewrite +from tinygrad.engine.realize import capturing, pm_flatten_linear +from tinygrad.schedule.rangeify import get_kernel_graph +from tinygrad.helpers import CAPTURING +from tinygrad.uop.ops import PatternMatcher, UPat, ParamArg +from tinygrad.dtype import AddrSpace + +def create_new_buffer(ctx:tuple[dict[UOp, UOp], tuple[UOp, ...]], b:UOp): + if (ret:=ctx[0].get(b, None)) is None: ctx[0][b] = ret = UOp.new_buffer(b.device, b.max_numel(), b.dtype) + return ret + +pm_post_sched_cache = PatternMatcher([ + # only resolve buffer PARAMs (slot>=0); ALU/shape vars use slot=-1 and must not be swapped for call args + (UPat(Ops.PARAM, name="x"), lambda ctx,x: ctx[1][x.arg.slot] if x.arg.slot >= 0 else None), + # create new BUFFERs + (UPat(Ops.BUFFER, src=(UPat(),), name="b"), lambda ctx,b: + create_new_buffer(ctx, b) if isinstance(b.arg, ParamArg) and b.addrspace is AddrSpace.GLOBAL else None), +]) + +def resolve_linear_call(linear_call:UOp): + linear = graph_rewrite(linear_call.src[0], pm_post_sched_cache, ctx=({}, linear_call.src[1:]), walk=True, name="params to buffers") + binds = {f"p{i}":x.src[0] for i,x in enumerate(linear_call.src[1:]) if x.op is Ops.BIND} + return linear.substitute({v:binds[v.expr] for v in linear.variables() if v.expr in binds}, enter_calls=True, name="resolve scalar params") + +pm_resolve_linear_call = PatternMatcher([ + # call LINEAR is resolved here + (UPat(Ops.CALL, src=(UPat(Ops.LINEAR),), name="linear_call", allow_any_len=True), resolve_linear_call), +])+pm_flatten_linear + +schedule_cache: dict[bytes, UOp] = {} +# ctx is just for DEBUG on inner +def lower_sink_to_linear(function:UOp) -> UOp|None: + st = time.perf_counter() + if isinstance(function.arg, KernelInfo): return None + cache_key = function.key + if not SCACHE or (sc_ret:=schedule_cache.get(cache_key, None)) is None: + if SPEC: type_verify(function, spec_tensor) + # support recursive CALLs + linear = create_schedule(get_kernel_graph(function)) + if SCACHE: schedule_cache[cache_key] = linear + else: + # schedule cache hit + linear = sc_ret + if (DEBUG >= 1 and len(linear.src) > 1) or DEBUG >= 3: + for frm in inspect.stack(): + if frm.filename == "": continue + if frm.filename.startswith(str(BASEDIR / "apps")): break + if not frm.filename.startswith(str(BASEDIR)) and not frm.filename.endswith("/contextlib.py"): break + else: + frm = None + print(f"scheduled {len(linear.src):5d} kernels in {(time.perf_counter()-st)*1000:8.2f} ms"+\ + f" | {' cache hit' if SCACHE and sc_ret is not None else 'CACHE MISS'} {cache_key.hex()[:8]}"+\ + f" | {len(UOpMetaClass.ucache):7d} uops in cache"+("" if frm is None else f" | {frm.filename}:{frm.lineno}")) + return linear + +pm_schedule = PatternMatcher([ + (UPat(Ops.SINK, name="function"), lower_sink_to_linear), +]) + +def assert_all_same_devices(ast:UOp): + devices = dedup([x.device for x in ast.toposort() if x.op is Ops.PARAM and x.device is not None]) + if len(devices) >= 2: raise RuntimeError(f"all buffers must be on the same device: {devices}") + +def copy_kernel_to_copy_uop(call:UOp, dst:UOp, src:UOp, r:UOp|None=None): + if dst.device == src.device and not (isinstance(dst.device, str) and dst.device.startswith("DISK")): return None + return call.replace(src=(UOp(Ops.COPY, src=(src,), arg=dst.device),) + call.src[1:]) + +def simplify_copy_kernel(call:UOp, ast:UOp, dst:UOp, src:UOp): + # NOTE: this is a codegen for SDMA devices + if dst.device == src.device and not (isinstance(dst.device, str) and dst.device.startswith("DISK")): return None + from tinygrad.codegen.simplify import pm_flatten_range, pm_simplify_ranges + from tinygrad.schedule.rangeify import pm_mops + from tinygrad.uop.symbolic import sym + sink = graph_rewrite(ast, sym+pm_mops+pm_flatten_range+pm_simplify_ranges, ctx={}, name="simplify ranges in copy") + return call.replace(src=(sink,) + call.src[1:]) + +pm_copy_from_store = PatternMatcher([ + # simplify copy kernels + (UPat(Ops.CALL, src=(UPat(Ops.SINK, name="ast"), UPat.var("dst"), UPat.var("src")), name="call"), simplify_copy_kernel), + + # replace this with a copy if it's a copy + (UPat(Ops.CALL, src=(UPat(Ops.PARAM, name="dst").index(UPat(Ops.CONST, arg=0)) + .store(UPat(Ops.PARAM, name="src").index(UPat(Ops.CONST, arg=0))).sink(),), + name="call", allow_any_len=True), copy_kernel_to_copy_uop), + (UPat(Ops.CALL, src=(UPat(Ops.PARAM, name="dst").index(UPat(Ops.RANGE, name="r")) + .store(UPat(Ops.PARAM, name="src").index(UPat(Ops.RANGE, name="r"))).end(UPat(Ops.RANGE, name="r")).sink(),), + name="call", allow_any_len=True), copy_kernel_to_copy_uop), + + # if it wasn't copy, it currently can't be cross device + (UPat(Ops.CALL, src=(UPat(Ops.SINK, name="ast"),), allow_any_len=True), assert_all_same_devices), +]) + +@rewrite_group(lambda _,ret: f"Schedule {pluralize('Kernel', len(ret[0].src))}") +def create_linear_with_vars(big_sink:UOp) -> tuple[UOp, dict[str, int]]: + # big_sink srcs are all the Tensors + linear_call = graph_rewrite(big_sink, pm_schedule, name="schedule to linear", enter_calls=True) + + # this recursively resolves the linear_call and allocates buffers + linear = graph_rewrite(linear_call, pm_resolve_linear_call, name="resolve linear call") + + # create copies + linear = graph_rewrite(linear, pm_copy_from_store, name="create COPY kernels for SDMA") + + # vars used in the schedule + used_vars = set().union(*[{v.expr for v in si.src[0].variables()} for si in linear.src]) + # get var_vals + var_vals: dict[str, int] = {} + for b in big_sink.src[1:]: + if b.op is Ops.BIND: + nm = b.src[0].expr + if nm not in used_vars: continue + val = b.src[1].val + if var_vals.get(nm, val) != val: raise RuntimeError(f"bind mismatch on {nm}, {var_vals[nm]} != {val}") + var_vals[nm] = val + + # jit captures this schedule, no need to execute. + if len(capturing) and CAPTURING: + capturing[0].add_linear(linear, var_vals) + return UOp(Ops.LINEAR, src=()), var_vals + + held_bufs = ({b for b in linear_call.src[1:] if b.op is Ops.BUFFER} if linear_call.op is Ops.CALL else set()) + return memory_plan_rewrite(linear, held_bufs), var_vals diff --git a/artifacts/package_runtime/tinygrad/schedule/allreduce.py b/artifacts/package_runtime/tinygrad/schedule/allreduce.py new file mode 100644 index 000000000..f5cc4c8e9 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/schedule/allreduce.py @@ -0,0 +1,66 @@ +import functools, itertools +from tinygrad.helpers import all_int, prod, DEBUG, RING, ALL2ALL, getenv +from tinygrad.uop.ops import UOp + +# *** allreduce implementation *** +def handle_allreduce(buf:UOp, red:UOp) -> UOp|None: + if not isinstance(buf.device, tuple): return None + ndev, shape, numel = len(buf.device), buf.shape, prod(buf.shape) + op, device = red.arg + + # ring allreduce doesn't provide a benefit with only 2 nodes or where number of elements is less than 256k (empirically) + # fallback to naive allreduce to save on kernel dispatch, chunking and reassembling chunks. + concrete = all_int(shape) + use_all2all = concrete and (ALL2ALL >= 2 or (ndev > 2 and numel > getenv("RING_ALLREDUCE_THRESHOLD", 256_000) and ALL2ALL >= 1)) + use_ring = concrete and not use_all2all and (RING >= 2 or (ndev > 2 and numel > getenv("RING_ALLREDUCE_THRESHOLD", 256_000) and RING >= 1)) + if DEBUG >= 2: print(f"{'ALL2ALL' if use_all2all else 'RING' if use_ring else 'NAIVE'} ALLREDUCE {ndev}x{numel} | {buf.dtype}") + + if not concrete: buf = buf.pad_to(buf.max_shape) + # contiguous before we copy it + buf = buf.contiguous() + + # naive: copy to all devices. if you shrink later, that'll be handled + if not use_ring and not use_all2all: + out = functools.reduce(lambda x,y: x.alu(op, y), [buf.mselect(i).copy_to_device(device) for i in range(ndev)]) + return out if concrete else out.shrink_to(shape) + + # chunk data into ndev pieces + assert isinstance(numel, int) + factor = next((f for f in [32, 16, 8, 4, 2] if numel % f == 0), 1) + base, left = divmod(numel // factor, ndev) + chunks = list(itertools.pairwise(itertools.accumulate([(base + 1) * factor] * left + [base * factor] * (ndev - left), initial=0))) + + # reduce-scatter + reduced_chunks:list[UOp] = [] + for i,(s,e) in enumerate(chunks): + if use_all2all: + chunks_on_i = [buf.mselect(j).reshape((numel,)).shrink(((s,e),)).copy_to_device(buf.device[i]) for j in range(ndev)] + reduced_chunks.append(functools.reduce(lambda x,y: x.alu(op, y), chunks_on_i)) + else: + chunk, reduced = buf.reshape((numel,)).shrink(((s,e),)), buf.reshape((numel,)).shrink(((s,e),)) + for step in range(ndev-1): + src, dest = (i+step)%ndev, (i+step+1)%ndev + cp = reduced.copy_to_device(buf.device[dest], src if isinstance(reduced.device, tuple) else None) + reduced = cp.alu(op, chunk.copy_to_device(buf.device[dest], dest)) + reduced_chunks.append(reduced) + + # allgather + copied_chunks:list[UOp] = [] + for i,rc in enumerate(reduced_chunks): + if isinstance(device, str): copied_chunks.append(rc.copy_to_device(device)) + elif use_all2all: copied_chunks.append(UOp.mstack(*(rc.copy_to_device(buf.device[j]) for j in range(ndev)))) + else: + chain:list[UOp] = [rc] + for step in range(ndev-1): + chain.append(rc := rc.copy_to_device(buf.device[(i+step)%ndev])) + copied_chunks.append(UOp.mstack(*(chain[(j-i+1)%ndev] for j in range(ndev)))) + + # reassemble + return UOp.usum(*[c.pad(((s,numel-e),)) for (s,e),c in zip(chunks, copied_chunks)]).reshape(shape) + +def create_allreduce_function(buf:UOp, red:UOp, output:UOp|None=None) -> UOp|None: + if output is None: output = UOp.invalids(red.shape, dtype=red.dtype, device=red.device) + to = red.param_like(0) + src = buf.param_like(1) + red = src.allreduce(*red.arg) + return output.after(to.after(to.store(handle_allreduce(src, red))).sink().call(output, buf.contiguous(), name="allreduce", precompile=True)) diff --git a/artifacts/package_runtime/tinygrad/schedule/indexing.py b/artifacts/package_runtime/tinygrad/schedule/indexing.py new file mode 100644 index 000000000..9424c1abc --- /dev/null +++ b/artifacts/package_runtime/tinygrad/schedule/indexing.py @@ -0,0 +1,334 @@ +from typing import Iterator +import functools, itertools +from dataclasses import dataclass, field, replace +from tinygrad.dtype import dtypes, AddrSpace +from tinygrad.uop.ops import PatternMatcher, UPat, Ops, UOp, resolve, GroupOp, graph_rewrite, sint, AxisType, rewrite_group, broadcast_axes +from tinygrad.uop.ops import gate_kernel_sink +from tinygrad.uop.symbolic import symbolic, pm_simplify_valid, pm_drop_and_clauses +from tinygrad.helpers import argsort, all_same, cpu_profile, PCONTIG, colored, Context, SPEC + +@dataclass +class IndexingContext: + realize_map: dict[UOp, None|list[int]] = field(default_factory=dict) + non_removable: dict[UOp, None] = field(default_factory=dict) + range_map: dict[UOp, tuple[tuple[UOp, ...], tuple[UOp, ...]]] = field(default_factory=dict) + # loads reachable from each UOp memoized across matches + buf_cache: dict[UOp, frozenset[UOp]] = field(default_factory=dict) + + # create ranges + range_idx: Iterator[int] = field(default_factory=itertools.count) + def new_range(self, s:sint, axistype:AxisType=AxisType.WEAK) -> UOp: + if isinstance(s, UOp) and s.op is Ops.RANGE: return s + # if a range has a 1 src, it's the same as UOp.const(0) + return UOp.range(s, next(self.range_idx), axistype) if resolve(s!=1) else UOp.const(0) + + +ALWAYS_CONTIGUOUS: set[Ops] = {Ops.CONTIGUOUS, Ops.AFTER, Ops.BUFFER, Ops.SLICE, + Ops.CONST, Ops.BIND, Ops.MSELECT, Ops.MSTACK, Ops.PARAM, + Ops.LOAD, Ops.CALL, Ops.FUNCTION} + +def realize(ctx:IndexingContext, tr:UOp) -> None: ctx.realize_map[tr] = None + +def realize_srcs(ctx:IndexingContext, rb:UOp) -> None: + for s in rb.src: + if s.base.op not in ALWAYS_CONTIGUOUS: ctx.realize_map[s] = None + +def realize_store_after_src(ctx:IndexingContext, dest:UOp, src:UOp): + # don't realize SLICE when it's the direct source of STORE+AFTER — the target buffer is the output + if src.op is Ops.SLICE and src in ctx.realize_map \ + and not dest.op_in_backward_slice_with_self(Ops.SHRINK, Ops.PERMUTE, Ops.FLIP, Ops.PAD): + del ctx.realize_map[src] + # you don't usually have to do this for assign unless there's a WAR hazard like TestAssign.test_assign_double_diamond_reduce + if dest.base in src.backward_slice_with_self: ctx.realize_map[src] = None + +def realize_custom_kernel_srcs(ctx:IndexingContext, c:UOp) -> None: + for s in c.src[1:]: + while s.op is Ops.RESHAPE: s = s.src[0] + if s.op not in ALWAYS_CONTIGUOUS: + ctx.realize_map[s] = None + ctx.non_removable[s] = None + +pm_generate_realize_map = PatternMatcher([ + # realize the inputs of custom kernel calls + (UPat(Ops.CALL, src=(UPat((Ops.SINK, Ops.PROGRAM)),), name="c", allow_any_len=True), realize_custom_kernel_srcs), + # always realize + (UPat({Ops.CONTIGUOUS, Ops.STORE}, name="tr"), realize), + # realize srcs of these + (UPat((Ops.MSELECT, Ops.MSTACK), name="rb"), realize_srcs), + # sometimes we need to realize the src of STORE if there's a self-access + (UPat(Ops.STORE, src=(UPat.var("dest"), UPat.var("src"))), realize_store_after_src), +]) + +@dataclass(frozen=True) +class BufferizeOpts: + # on AddrSpace.LOCAL, device is the id + device: str|tuple[str, ...]|int|None + addrspace: AddrSpace = AddrSpace.GLOBAL + removable: bool = True + +def broadcast_rngs(x:UOp, src:UOp, rngs:tuple[UOp, ...]) -> tuple[UOp, ...]: + if x.op not in GroupOp.Broadcastable: return rngs + baxes, nleft = broadcast_axes(src.shape, x.shape), len(x.shape)-len(src.shape) + return tuple(r.const_like(0) if j in baxes else r for j,r in enumerate(rngs) if j >= nleft) + +# TODO: srcs contain (real data srcs, something else, ranges) and the boundary is confusing. see range_start +def data_srcs(op:Ops, src:tuple[UOp, ...]) -> tuple[UOp, ...]: + if op in {Ops.PARAM, Ops.BUFFER, Ops.RANGE, Ops.SPECIAL, Ops.BIND}: return () + if op in GroupOp.Movement|{Ops.INDEX, Ops.SLICE, Ops.STAGE, Ops.REDUCE, Ops.AFTER, Ops.END}: return src[:1] + return src + +def create_bufferize_and_index_srcs(ctx:IndexingContext, x:UOp) -> list[UOp]: + new_srcs = [] + # shape/bound/index args that are not data src should not be indexed + data_src_count = len(data_srcs(x.op, x.src)) + for i, s in enumerate(x.src): + new_src = s + src_rngs = broadcast_rngs(x, s, ctx.range_map[x][0]) if x in ctx.range_map else () + if s.op in {Ops.PARAM, Ops.BUFFER, Ops.SLICE, Ops.MSTACK, Ops.MSELECT, Ops.AFTER}: + if x in ctx.range_map and i < data_src_count: new_src = new_src.index(*src_rngs) + elif s in ctx.realize_map: + realized_ranges = ctx.realize_map[s] + assert isinstance(realized_ranges, list), "realize map must contain range list" + closed_ranges = tuple([r for i,r in enumerate(ctx.range_map[s][1]) if i in realized_ranges]) + if s.op is Ops.STORE: + # add the ends if this is a store + new_src = s.end(*[r for r in closed_ranges if r.op is Ops.RANGE]) + del ctx.realize_map[s] + else: + removable = s.op not in ALWAYS_CONTIGUOUS and s not in ctx.non_removable + # LOCAL: None in the device assigns it a number later + opts = BufferizeOpts(device=s.device, removable=removable) if len(ctx.range_map[s][1]) == len(realized_ranges) else \ + BufferizeOpts(device=s.device, addrspace=AddrSpace.LOCAL, removable=removable) + new_src = UOp(Ops.STAGE, src=(new_src,)+closed_ranges, arg=opts) + if x in ctx.range_map: new_src = new_src.index(*[r for i,r in enumerate(src_rngs) if i in realized_ranges]) + new_srcs.append(new_src) + return new_srcs + +def create_bufferize_and_index_based_on_ranges(ctx:IndexingContext, x:UOp): + if x.op in {Ops.STAGE, Ops.INDEX}: return None + return x.replace(src=tuple(create_bufferize_and_index_srcs(ctx, x))) + +def convert_pad_to_where_to_keep_behavior_local(ctx:IndexingContext, x:UOp): + if x not in ctx.range_map: return None + bx = create_bufferize_and_index_based_on_ranges(ctx, x) + valid: UOp = UOp.const(True).uprod([r.get_valid() for r in ctx.range_map[x][0]]) + return valid.where(bx.src[0], UOp.const(x.dtype.const(0))) + +def convert_reduce_to_reduce_with_ranges(ctx:IndexingContext, x:UOp): + if x.arg[1] == 0: return None + bx = create_bufferize_and_index_based_on_ranges(ctx, x) + # input ranges + new_ranges = list(ctx.range_map[x][0][:x.arg[1]]) + return UOp(Ops.REDUCE, src=(bx.src[0],)+tuple(new_ranges), arg=(x.arg[0], 0)) + +def convert_stack_to_where(ctx:IndexingContext, x:UOp): + # only data STACKs: shape tuple STACKs aren't in range_map, the empty shape tuple is void + if x not in ctx.range_map or x.dtype == dtypes.void: return None + # use the src list directly, a transient STACK of mid-rangeify srcs violates the spec shape rule + srcs = create_bufferize_and_index_srcs(ctx, x) + r0 = ctx.range_map[x][1][0] + ret = srcs[-1] + for k in range(len(srcs)-2, -1, -1): ret = r0.eq(k).where(srcs[k], ret) + return ret + +def remove_movement_op_after_rangeify(ctx:IndexingContext, x:UOp): + if x in ctx.range_map or x.src[0].op is Ops.INDEX: return x.src[0] + +pm_apply_rangeify = PatternMatcher([ + # REDUCE(op, axis) -> REDUCE(op) with ranges + (UPat(Ops.REDUCE, name="x"), convert_reduce_to_reduce_with_ranges), + # PAD -> WHERE + (UPat(Ops.PAD, name="x"), convert_pad_to_where_to_keep_behavior_local), + # STACK -> WHERE select on the leading range + (UPat(Ops.STACK, name="x"), convert_stack_to_where), + # finally, apply_rangeify + (UPat(GroupOp.All, name="x"), create_bufferize_and_index_based_on_ranges), + # remove movement op + (UPat(GroupOp.Movement, name="x"), remove_movement_op_after_rangeify), +]) + +pm_fix_deviceless = PatternMatcher([ + (UPat(Ops.STAGE, name="b"), + lambda ctx,b: b.replace(arg=replace(b.arg, device=ctx)) if b.arg.addrspace is AddrSpace.GLOBAL and b.arg.device is None else None), +]) + +@functools.cache +def _apply_reshape(in_shape:tuple[sint,...], out_shape:tuple[sint, ...], urngs:UOp) -> UOp: + acc:sint = 1 + axes_in:list[UOp] = [] + for s,src in list(zip(out_shape, urngs.src))[::-1]: + axes_in.append(acc*src) + acc *= s + combined_axes = UOp.const(0).usum(axes_in) + axes_out:list[UOp] = [] + for s in in_shape[::-1]: + axes_out.append(combined_axes % s) + combined_axes //= s + # this simplify is doing a lot of heavy lifting. this is the replacement for the reshape view merging code + return graph_rewrite(UOp.sink(*axes_out[::-1]), symbolic+pm_simplify_valid+pm_drop_and_clauses, name="reshape") + +# this is the definition of the movement ops +@functools.cache +def apply_movement_op(op:Ops, in_shape:tuple[sint,...], arg:tuple, rngs:tuple[UOp, ...]) -> tuple[UOp, ...]: + match op: + case Ops.SHRINK: rngs = tuple(a if off == 0 else a+off for a,(off,_) in zip(rngs, arg)) + case Ops.PERMUTE: rngs = tuple(rngs[p] for p in argsort(arg)) + case Ops.FLIP: rngs = tuple(((s-1)-a) if f else a for a,s,f in zip(rngs, in_shape, arg)) + case Ops.EXPAND: rngs = rngs[len(arg):] + case Ops.PAD: + # NOTE: the .where(r-s, i) is not inside the graph_rewrite so that `convert_pad_to_where_to_keep_behavior_local` + # wraps the pad with only the newly added valid + rngs = tuple(r if (sz == sh and off == 0) else (r-off).valid(graph_rewrite((r >= off) & (r < (sh+off)), + symbolic+pm_simplify_valid, name="pad")) for r,sh,(off,sz) in zip(rngs, in_shape, arg)) + case Ops.RESHAPE: + sink = UOp.sink(*rngs).simplify() # NOTE: this applies any commutative flips to the rngs early + sub_array = {r:r.replace(src=r.src[:1], arg=(i, AxisType.PLACEHOLDER)) for i,r in enumerate(sink.ranges)} + rngs = _apply_reshape(in_shape, arg, sink.substitute(sub_array)).substitute({v:k for k,v in sub_array.items()}).src + case _: raise RuntimeError(f"{op} is not a MovementOp") + return rngs + +@rewrite_group(new_ctx=False) +def run_rangeify(tsink:UOp, debug:bool=False) -> tuple[UOp, IndexingContext]: + if debug: print("**************************") + rctx = IndexingContext() + + # get ops to realize + graph_rewrite(tsink, pm_generate_realize_map, ctx=rctx, name="get realize") + + # get the consumer map + with cpu_profile("consumer map in rangeify", "TINY"): + tsink_toposort = tsink.toposort(gate_kernel_sink) + consumer_map: dict[UOp, dict[UOp, None]] = {x:{} for x in tsink_toposort} + for c in tsink_toposort: + for x in data_srcs(c.op, c.src): + if x in consumer_map: consumer_map[x][c] = None + + # explicit rangeify + ending_ranges: dict[UOp, list[UOp]] = {} + for x in reversed(tsink_toposort): + # no ranges on kernels, they are internal + if x.op in {Ops.CALL, Ops.FUNCTION, Ops.LINEAR}: continue + + # AFTER doesn't have range + if x.op is Ops.AFTER: continue + + # treat MSTACK/MSELECT like SINK + if x.op in {Ops.MSTACK, Ops.MSELECT}: continue + + ending_ranges[x] = sum([ending_ranges.get(u, []) for u in consumer_map[x]], []) + # ranges the consumers iterate that this node broadcasts over + ended = [rctx.range_map[c][0][i] for c in consumer_map[x] if c in rctx.range_map and c.op in GroupOp.Broadcastable + for i in broadcast_axes(x.shape, c.shape)] + broadcast_ending_ranges = list(UOp.sink(*ended).ranges) + # fusion decision: REDUCE before the broadcast + if x.op is Ops.REDUCE: ending_ranges[x] += broadcast_ending_ranges + + # *** the ranges on the output are + # 1. new if this op is realized + # 2. from the single consumer if this op only has one consumer + # 3. potentially new if this op has 2+ consumers + + consumer_rngs = [broadcast_rngs(c, x, rctx.range_map[c][0]) for c in consumer_map[x] if c in rctx.range_map] + if x in rctx.realize_map: + # if this is in the realize_map, we create new ranges (at the output) + out_rngs = tuple(rctx.new_range(s) for s in x.shape) + # all ranges are ended now + ending_ranges[x] = [] + # mark all ranges as ended + assert rctx.realize_map[x] is None + rctx.realize_map[x] = list(range(len(x.shape))) + elif len(consumer_rngs) == 0: + # if no consumers have ranges and this isn't realized, this doesn't have ranges either. + continue + elif len(consumer_rngs) == 1: + # if this has one consumer, it inherits the ranges from it + out_rngs = consumer_rngs[0] + elif len(consumer_rngs) > 1: + # if this has two consumers, we have to merge the ranges and might create new ones + all_rngs: list[tuple[UOp, ...]] = list(zip(*consumer_rngs)) + rngs_valids = [] + for valid_rngs in all_rngs: + local_rngs, valids = zip(*[(r.get_idx(), r.get_valid()) for r in valid_rngs]) + rngs_valids.append((local_rngs, valids)) + + # TODO: in RANGEIFY > 1 all_all_same isn't required + all_all_same = all(all_same(local_rngs) for local_rngs,_ in rngs_valids) + _out_rngs = [] + _realize_axis = [] + for i,(local_rngs,valids) in enumerate(rngs_valids): + # we compare the ranges without their valids + if all_all_same or (PCONTIG and all_same(local_rngs)): + # the new valid is the OR of all the children valids + minimum_valid = UOp.const(False).usum(valids) + _out_rngs.append(graph_rewrite(local_rngs[0].valid(minimum_valid), symbolic, name="minimum_valid")) + else: + _out_rngs.append(rctx.new_range(x.shape[i])) + _realize_axis.append(i) + out_rngs = tuple(_out_rngs) + + # we have to (partially) realize here if there's new ranges + if len(_realize_axis): rctx.realize_map[x] = _realize_axis + + # if this element is a reduce and there's ended ranges, we might have to end some other ranges + if len(ending_ranges[x]) and x.op in GroupOp.Elementwise.union({Ops.REDUCE}): + _realize_axis = rctx.realize_map.get(x) or [] + for i,r in enumerate(out_rngs): + if i in _realize_axis: continue + if not (PCONTIG > 1) or any(any(rr.arg > e.arg for e in ending_ranges[x]) for rr in r.ranges): + _realize_axis.append(i) + ending_ranges[x] = [] + if len(_realize_axis): + rctx.realize_map[x] = _realize_axis + out_rngs = tuple([(rctx.new_range(x.shape[i]) if i in _realize_axis else r) for i,r in enumerate(out_rngs)]) + ending_ranges[x] += broadcast_ending_ranges + + # TODO: some ops don't have shape, enable this after the `.st` property is removed + #assert len(out_rngs) == len(x.shape), \ + # f"shape len mismatch {len(out_rngs)} != {len(x.shape)} on {x.op} with {len(consumer_map[x])} consumers and realize {x in realize_map}" + + # *** the ranges on the inputs are + # 1. swizzled for MovementOps + # 2. newly created for REDUCE (tensor graph form with axis) + # 3. passed through for everything else + + rngs = out_rngs # rngs is the input ranges # pylint: disable=possibly-used-before-assignment + + # apply movement ops + if x.op in GroupOp.Movement: rngs = apply_movement_op(x.op, x.src[0].shape, x.marg, rngs) + # STACK: the leading range selects the src, srcs get the trailing ranges + if x.op is Ops.STACK: rngs = out_rngs[1:] + # if the EXPAND is used to inject a range, we don't mark it as ending_ranges. otherwise we do. + # NOTE: this doesn't actually always end a range, but this is why convs are realized, so for now we need it + if x.op is Ops.EXPAND and all(isinstance(y, int) or y.op is not Ops.RANGE for y in x.shape): + ending_ranges[x] += list(UOp.sink(*out_rngs[:len(x.marg)]).ranges.keys()) + + # REDUCE creates ranges for the axes it is reducing + if x.op is Ops.REDUCE and x.arg[1]: + rngs = tuple(rctx.new_range(s, axistype=AxisType.REDUCE) for s in x.src[0].shape[:x.arg[1]]) + out_rngs + + if debug: + realized_ranges = rctx.realize_map.get(x, None) + if x.op is Ops.RESHAPE or len(rngs) != len(out_rngs): + disp = render_ranges(rngs, realized=realized_ranges) + " -> " + render_ranges(out_rngs, realized=realized_ranges) + else: + disp = render_ranges(rngs, out_rngs, realized=realized_ranges) + print("***" if x in rctx.realize_map else " ", + f"{len(consumer_map[x]):2d} {str(x.op):20s} {str(x._shape):35s} {len(ending_ranges[x]):2d}", disp) + + # assign to the range map. rngs are the input ranges, out_rngs are the output ranges, from the x op. + rctx.range_map[x] = (rngs, out_rngs) + + # NOTE: SPEC=3 is broken here with shape + with Context(SPEC=min(SPEC.value, 2)): + tsink = graph_rewrite(tsink, pm_apply_rangeify, ctx=rctx, bottom_up=True, name="apply rangeify") + # if a deviceless value must materialize, place it on the sink device + tsink = graph_rewrite(tsink, pm_fix_deviceless, ctx=tsink.device, name="add device to deviceless") + return tsink, rctx + +def render_ranges(*rngs_list, realized) -> str: + disp = [] + for i, rs in enumerate(zip(*[[r.render() for r in rngs] for rngs in rngs_list])): + rng = rs[0] if all_same(rs) else " -> ".join(rs) + if realized is not None and i in realized: rng = colored(rng, "yellow") + disp.append("["+rng+"]") + return ''.join(disp) diff --git a/artifacts/package_runtime/tinygrad/schedule/memory.py b/artifacts/package_runtime/tinygrad/schedule/memory.py new file mode 100644 index 000000000..a16acb09f --- /dev/null +++ b/artifacts/package_runtime/tinygrad/schedule/memory.py @@ -0,0 +1,64 @@ +from collections import defaultdict +from tinygrad.helpers import NO_MEMORY_PLANNER, DEBUG, round_up +from tinygrad.uop.ops import UOp, Ops +from tinygrad.dtype import dtypes +from tinygrad.runtime.support.memory import TLSFAllocator + +def _collect_bufs(u:UOp) -> list[UOp]: + if u.op is Ops.BUFFER: return [u] + if u.op in {Ops.MSELECT, Ops.MSTACK}: return [b for s in u.src for b in _collect_bufs(s)] + return [] + +def _can_plan(b:UOp, held_bufs:set[UOp]) -> bool: + if b in held_bufs: return False + devs = (b.device,) if isinstance(b.device, str) else b.device + # CL and WEBGPU do not support views, see explanation in contiguous_view_offset + return all(not d.startswith(("DISK", "TINYFS", "CL", "WEBGPU")) for d in devs) + +LaneKey = tuple[str, int] + +def memory_plan_rewrite(linear:UOp, held_bufs:set[UOp]|None=None) -> UOp: + if NO_MEMORY_PLANNER: return linear + if held_bufs is None: held_bufs = set() + + # compute lifetimes for all plannable internal buffers + first_appearance:dict[UOp, int] = {} + last_appearance:dict[UOp, int] = {} + copy_bufs: set[UOp] = set() + for i, si in enumerate(linear.src): + si_bufs = [b for src in si.src[1:] for b in _collect_bufs(src) if _can_plan(b, held_bufs)] + for b in si_bufs: + if b not in first_appearance: first_appearance[b] = i + last_appearance[b] = i + if si.src[0].op is Ops.COPY: copy_bufs.update(si_bufs) + if not first_appearance: return linear + + # separate copy and compute buffers into different lanes to avoid introducing dependencies (copy->compute->copy) + def _key(b:UOp): return (b.device, 1 if b in copy_bufs else 0) + buf_hold = {b: last_appearance[b] - first_appearance[b] + 1 for b in first_appearance if b in copy_bufs} + + # suballocation: build sorted open/close events, then alloc/free in order + block_size = 256 + nbytes = {b: round_up(b.max_numel() * b.dtype.itemsize, block_size) for b in first_appearance} + events = sorted([(first_appearance[b], True, b) for b in first_appearance] + + [(last_appearance[b] + 1 + buf_hold.get(b, 0), False, b) for b in first_appearance], key=lambda x: (x[0], x[1])) + total_memory = sum(nbytes.values()) * 2 + + offsets:dict[UOp, int] = {} + peaks:dict[LaneKey, tuple[int, TLSFAllocator]] = defaultdict(lambda: (0, TLSFAllocator(total_memory, block_size=block_size, lv2_cnt=32))) + for _, is_open, buf in events: + if is_open: offsets[buf] = peaks[_key(buf)][1].alloc(nbytes[buf]) + else: peaks[_key(buf)][1].free(offsets[buf]) + peaks[_key(buf)] = (max(peaks[_key(buf)][0], offsets[buf] + buf.max_numel() * buf.dtype.itemsize), peaks[_key(buf)][1]) + arena_sizes = {key: round_up(peak, block_size) for key, (peak, _) in peaks.items()} + + # build replace_map: each buffer becomes a SLICE into a shared per-device-lane arena + arenas = {key: UOp.new_buffer(key[0], sz, dtypes.int8) for key, sz in arena_sizes.items()} + replace_map:dict[UOp, UOp] = {} + for buf_uop, offset in offsets.items(): + replace_map[buf_uop] = UOp(Ops.SLICE, buf_uop.dtype, (arenas[_key(buf_uop)], UOp.const(offset)), buf_uop.max_numel()) + + if DEBUG >= 1 and (omem:=sum(nbytes.values()) / 1e6) != (nmem:=sum(arena_sizes.values()) / 1e6): + print(f"memory reduced from {omem:.2f} MB -> {nmem:.2f} MB, {len(first_appearance)} -> {len(arenas)} bufs") + + return linear.substitute(replace_map, name="memory plan", walk=True) diff --git a/artifacts/package_runtime/tinygrad/schedule/multi.py b/artifacts/package_runtime/tinygrad/schedule/multi.py new file mode 100644 index 000000000..17110647f --- /dev/null +++ b/artifacts/package_runtime/tinygrad/schedule/multi.py @@ -0,0 +1,319 @@ +from tinygrad.helpers import all_same, prod, getenv, ALLREDUCE_CAST +from tinygrad.uop.ops import Ops, UOp, PatternMatcher, UPat, GroupOp, AxisType, graph_rewrite, broadcast_axes, _broadcast_shape, sint_to_uop +from tinygrad.uop.ops import sint, ssimplify +from tinygrad.dtype import dtypes +from tinygrad.schedule.allreduce import handle_allreduce + +# ***** multi rewrite MSELECT/MSTACK ***** + +def _apply_shrink(marg, s:UOp, i:int) -> UOp: + new_arg = [tuple([x.substitute({drng[0]:drng[0].const_like(i)}) if isinstance(x, UOp) and + (drng:=[r for r in x.ranges if r.arg[-1] is AxisType.DEVICE]) else x for x in ss]) for ss in marg] + return s._mop(Ops.SHRINK, tuple(new_arg)) + +def mstack_early_shrink(ms:UOp, shrink:UOp): + ret:list[UOp] = [] + for i, x in enumerate(ms.src): + if x.op is Ops.COPY: + ret.append(_apply_shrink(shrink.marg, x.src[0], i).copy_to_device(x.device)) + else: + ret.append(_apply_shrink(shrink.marg, x, i).contiguous()) + return ms.replace(src=tuple(ret)) + +def lower_broadcast_copy(c:UOp, x:UOp): + if not (isinstance(c.device, tuple) and isinstance(x.device, str)): return None + if (sx:=x.simplify()).device is None and sx.base.op is Ops.CONST: return UOp(Ops.MSTACK, src=(sx,)*len(c.device)) + return UOp(Ops.MSTACK, src=tuple(x.copy_to_device(d) for d in c.device)) + +replace_allreduce = PatternMatcher([ + # BROADCAST: explicitly expand broadcast copies and combine with MSTACK + (UPat(Ops.COPY, name="c", src=(UPat(GroupOp.All-{Ops.CONST}, name="x"),)), lower_broadcast_copy), + # COPY_TO_ONE: if copying from multidevice to one, MSELECT the first (TODO: a little from each?) + (UPat(Ops.COPY, name="c", src=(UPat(GroupOp.All-{Ops.CONST}, name="x"),)), lambda c,x: + x.mselect(0).copy_to_device(c.device) if isinstance(c.device, str) and isinstance(x.device, tuple) else None), + # MSELECT on MSTACK is replaced with nothing + (UPat(Ops.MSELECT, src=(UPat(Ops.MSTACK, name="mstack"),), name="ms"), lambda mstack, ms: mstack.src[ms.arg]), + # move shrink before MSTACK + (UPat(Ops.SHRINK, src=(UPat(Ops.MSTACK, name="ms"),), allow_any_len=True, name="shrink"), mstack_early_shrink), + # move MSELECT before movement ops + (UPat(Ops.MSELECT, src=(UPat(GroupOp.Movement, src=(UPat.var("s"),), allow_any_len=True, name="v"),), name="ms"), + lambda s,v,ms: v.replace(src=(s.mselect(ms.arg),)+v.src[1:])), +]) + +_early_allreduce = PatternMatcher([ + (UPat(Ops.ALLREDUCE, src=(UPat.var("buf"),), name="red"), handle_allreduce), +]) +if not getenv("LATE_ALLREDUCE", 1): replace_allreduce = _early_allreduce + replace_allreduce + +# ***** multi functions ***** + +def shard_srcs(msrcs:tuple[UOp, ...], axis:int) -> list[UOp]: + # normalize srcs to local shards on axis + devices = [x.device for x in msrcs if x.device is not None] + assert all_same(devices), f"all buffers must have the same device {devices}" + # without devices the sharding range comes from the UNSHARD itself (e.g. a LOCAL thread range); + # device shards range over the devices instead + if len(devices): sharding_rng = UOp.range(len(devices[0]), -1, AxisType.DEVICE) + else: + sharding_rng = next((m.src[1] for m in msrcs if m.op is Ops.UNSHARD), None) + assert sharding_rng is not None, "shard_srcs requires a device or a sharding range" + + out_shape = _broadcast_shape(*[x.shape for x in msrcs]) + srcs:list[UOp] = [] + for mlb in msrcs: + src_axis = axis - (len(out_shape)-len(mlb.shape)) + if mlb.axis == src_axis: + # same axis, just copy through + srcs.append(mlb.src[0]) + else: + # otherwise every shard gets the full copy, sharded iff this src has the axis (broadcast srcs stay whole) + full = mlb if mlb.axis is None else copy_multi(mlb, mlb.device) + srcs.append(full if axis in broadcast_axes(mlb.shape, out_shape) else full._shard(src_axis, sharding_rng)) + return srcs + +def shard_subview(full:UOp, multi:UOp) -> UOp: + """the sub-view of an unsharded full-shape value (shape == multi.shape) that belongs to this shard: + _shard along every sharded axis (contiguous blocks, like the device path).""" + assert tuple(full.shape) == tuple(multi.shape), f"shard sub-view shape mismatch {full.shape} != {multi.shape}" + # an EXPAND of a scalar over the full shape is the same broadcast on every shard: re-expand over the shard shape + if full.op is Ops.EXPAND and full.src[0].shape == (): return full.src[0].expand(multi.src[0].shape) + for ax, rng in multi.sharding: full = full._shard(ax, rng) + return full + +def alu_multi(root:UOp): + multis = [m for m in root.src if m.op is Ops.UNSHARD] + if not multis: return None + sharding = multis[0].sharding + target = multis[0] + def can_handle(m:UOp) -> bool: + # same sharding (peel the UNSHARD), or a whole unsharded value of the full tile shape (takes its per-shard + # sub-view), or a broadcast scalar + if m.sharding: return m.sharding == sharding + return m.shape == () or tuple(m.shape) == tuple(target.shape) + if all(can_handle(m) for m in root.src): + # every src either has the target sharding or is whole on every shard: run the alu per-shard + srcs = [m.src[0] if m.op is Ops.UNSHARD else m if m.shape == () else shard_subview(m, target) for m in root.src] + return srcs[0].alu(root.op, *srcs[1:]).unshard(target.arg, target.src[1:]) + # resharding: single-axis fallback via shard_srcs + axis = root.axis + assert axis is not None + srcs = shard_srcs(root.src, axis) + return srcs[0].alu(root.op, *srcs[1:]).unshard(axis, next(m.src[1] for m in root.src if m.op is Ops.UNSHARD)) + +def reduce_multi(root:UOp, multi:UOp): + op, num_axes = root.arg + sharding = multi.sharding + reduced = [(ax, rng) for ax, rng in sharding if ax < num_axes] + remaining = [(ax, rng) for ax, rng in sharding if ax >= num_axes] + local = multi.src[0]._rop(op, tuple(range(num_axes))) + if reduced: + assert not remaining, f"partial allreduce not supported for multi-axis sharding {sharding}" + # all sharded axes are reduced: full allreduce + if ALLREDUCE_CAST and multi.src[0].op is Ops.CAST and multi.src[0].src[0].dtype in (dtypes.bfloat16, dtypes.half): + orig_dtype = multi.src[0].src[0].dtype + return local.cast(orig_dtype).allreduce(op, multi.device).cast(local.dtype) + return local.allreduce(op, multi.device) + # no sharded axes reduced: piecewise, keep all remaining sharding + new_axes = tuple(ax - num_axes for ax, _ in remaining) + new_rngs = tuple(rng for _, rng in remaining) + return local.unshard(new_axes, new_rngs) + +def reshape_multi(root:UOp, multi:UOp): + if prod(multi.shape) != prod(new_shape:=root.marg): raise RuntimeError("reshape must maintain prod(shape)") + # map every sharded axis through the reshape: the axis boundary must survive intact and stay divisible by its shard count + arg_acc:list[sint] = [1] + for s in new_shape: arg_acc.append(ssimplify(arg_acc[-1]*s)) + new_shardings = [] + for ax, rng in multi.sharding: + count = int(rng.vmax)+1 + target = prod(multi.shape[:ax]) + if target not in arg_acc: raise RuntimeError(f"reshape {multi.shape} -> {new_shape} moved items between shards") + new_ax = len(arg_acc) - arg_acc[::-1].index(target) - 1 + if new_shape[new_ax] % count != 0: raise RuntimeError(f"reshape {multi.shape} -> {new_shape} moved items between shards") + new_shardings.append((new_ax, rng)) + new_axs = {a for a, _ in new_shardings} + new_shape = tuple(s//(int(rng.vmax)+1) if a in new_axs else s for a,s in enumerate(new_shape)) + return multi.src[0].reshape(new_shape).unshard(tuple(a for a,_ in new_shardings), tuple(r for _,r in new_shardings)) + +def expand_multi(root:UOp, multi:UOp): + shift = len(root.marg) + return multi.src[0]._mop(Ops.EXPAND, arg=root.marg) \ + .unshard(tuple(ax+shift for ax,_ in multi.sharding), tuple(r for _,r in multi.sharding)) + +def pad_multi(root:UOp, multi:UOp): + for ax, _ in multi.sharding: + assert root.marg[ax] == (0, multi.shape[ax]), f"padding not supported for {root.marg=}" + counts = {a for a,_ in multi.sharding} + local_pad = tuple((0, multi.src[0].shape[a]) if a in counts else s for a,s in enumerate(root.marg)) + return multi.src[0]._mop(Ops.PAD, local_pad).unshard(multi.arg, multi.src[1:]) + +def permute_multi(root:UOp, multi:UOp): + # all permutes supported! + return multi.src[0].permute(root.marg) \ + .unshard(tuple(root.marg.index(ax) for ax,_ in multi.sharding), tuple(r for _,r in multi.sharding)) + +def shrink_multi(root:UOp, multi:UOp): + # resolve each sharded axis independently: a shrink to exactly this range's own shard resolves the UNSHARD along + # that axis (e.g. a fragment indexed by its LOCAL thread range becomes that thread's REG shard, no copy needed) + local_marg = list(root.marg) + remaining = list(multi.sharding) + for ax, rng in multi.sharding: + shard_sz = multi.src[0].shape[ax] + s, l = root.marg[ax] # SHRINK marg is (start, length) + if sint_to_uop(l).ssimplify() == shard_sz and (sint_to_uop(s)-rng*shard_sz).ssimplify() == 0: + local_marg[ax] = (0, shard_sz) + remaining.remove((ax, rng)) + continue + part_bounds = tuple((i*shard_sz, shard_sz) for i in range(int(rng.vmax)+1)) + if (s, l) == (0, multi.shape[ax]): local_marg[ax] = (0, shard_sz) # full axis stays sharded, shrink the other axes locally + else: + # NOTE: otherwise a shrink on the shard axis is only allowed on the legacy device path, selecting a single + # partition (which is copied to all the devices and optimized out later) + if len(multi.sharding) != 1 or not isinstance(multi.device, tuple) or (s, l) not in part_bounds: + raise RuntimeError(f"shrinking not supported for {root.marg=}") + non_shard_shrink = tuple((0, shard_sz) if i == ax else t for i, t in enumerate(root.marg)) + return multi.src[0].copy_to_device(multi.device, arg=part_bounds.index((s, l)))._mop(Ops.SHRINK, non_shard_shrink) + val = multi.src[0]._mop(Ops.SHRINK, tuple(local_marg)) + return val if not remaining else val.unshard(tuple(a for a,_ in remaining), tuple(r for _,r in remaining)) + +def flip_multi(root:UOp, multi:UOp): + for ax, _ in multi.sharding: + if root.marg[ax]: raise RuntimeError(f"flipping not supported on sharded axis {ax}") + return multi.src[0].flip([i for i,x in enumerate(root.marg) if x]).unshard(multi.arg, multi.src[1:]) + +def stack_multi(root:UOp): + # STACK adds a leading axis: srcs are sharded one axis below the output + multis = [m for m in root.src if m.op is Ops.UNSHARD] + if not multis: return None + sharding = multis[0].sharding + if all(m.sharding == sharding for m in multis): + srcs = [m.src[0] if m.op is Ops.UNSHARD else m for m in root.src] + new_sharding = tuple((ax+1, rng) for ax, rng in sharding) + return UOp(Ops.STACK, src=tuple(srcs)).unshard(tuple(a for a,_ in new_sharding), tuple(r for _,r in new_sharding)) + # resharding: single-axis fallback + axis = root.axis + assert axis is not None + return UOp(Ops.STACK, src=tuple(shard_srcs(root.src, axis-1))).unshard(axis, next(m.src[1] for m in root.src if m.op is Ops.UNSHARD)) + +def index_multi(root:UOp, multi:UOp): + # INDEX on UNSHARD: resolve each sharded axis into this range's own shard. + # Two ownership patterns are supported: + # contiguous: idx = rng*shard_sz + local (thread rng owns [rng*shard_sz, ...)) + # strided: idx = rng + ir*shard_sz (thread rng owns {rng, rng+shard_sz, ...}) + idxs = list(root.src[1:]) + for ax, rng in multi.sharding: + shard_sz = multi.src[0].shape[ax] + local = (idxs[ax] - rng*shard_sz).simplify() + if local.vmin >= 0 and local.vmax < shard_sz: + idxs[ax] = local + continue + # strided ownership: idx ≡ rng (mod shard_sz), intra-shard position is (idx - rng) // shard_sz + diff = (idxs[ax] - rng).simplify() + if (mod:=(diff % shard_sz).simplify()).op is Ops.CONST and mod.val == 0: + local = (diff // shard_sz).simplify() + if local.vmin >= 0 and local.vmax < shard_sz: + idxs[ax] = local + continue + raise RuntimeError(f"index_multi: cannot shard index {idxs[ax]} for UNSHARD axis {ax} with shard size {shard_sz}") + return multi.src[0].index(*idxs) + +def _shard_idx(rng:UOp, dev_idx:int) -> int: + drngs = [r for r in rng.ranges if r.arg[-1] is AxisType.DEVICE] + return 0 if not drngs else int(rng.substitute({drngs[0]: drngs[0].const_like(dev_idx)}).ssimplify()) + +def copy_multi(multi:UOp, device:str | tuple[str, ...]): + sharding = multi.sharding + if isinstance(device, str): + # reconstruct by concatenating along each axis from last to first + piece_info: list[tuple[tuple, UOp]] = [] + for i in range(len(multi.device)): + idxs = tuple(_shard_idx(r, i) for _, r in sharding) + piece_info.append((idxs, multi.src[0].mselect(i).copy_to_device(device))) + for j in range(len(sharding) - 1, -1, -1): + ax, rng = sharding[j] + groups: dict[tuple, list[tuple[int, UOp]]] = {} + for idxs, p in piece_info: + key = idxs[:j] + idxs[j+1:] + groups.setdefault(key, []).append((idxs[j], p)) + piece_info = [] + for key in sorted(groups): + grp = sorted(groups[key], key=lambda x: x[0]) + piece_info.append((key, grp[0][1].cat(*[x[1] for x in grp[1:]], dim=ax))) + return piece_info[0][1] + # multi-device target: unshard all axes and allreduce + val = multi.src[0] + for ax, rng in sharding: + bsz = val.shape[ax] + val = val.pad(tuple((0,0) if a != ax else (bsz*rng, bsz*int(rng.vmax) - bsz*rng) for a in range(len(val.shape)))) + return val.allreduce(Ops.ADD, device) + +def store_after_multi(dest:UOp, src:UOp): return dest.after(dest.store(src.src[0])).unshard(src.arg, src.src[1:]) + +def store_value_multi(dest:UOp, multi:UOp): + # storing a sharded value into an unsharded dest: every shard stores into its own sub-view of the dest + return shard_subview(dest, multi).store(multi.src[0]) + +def store_dest_multi(root:UOp, multi:UOp): + # STORE with a sharded dest: every shard stores into its own shard of the dest. + # the value is handled like in alu_multi: UNSHARD srcs peel, full-shape values take their per-shard sub-view + # (scalars arrive EXPANDed to the full shape by UOp.store's const_like, so they sub-view like everything else) + srcs = [multi.src[0]] + [x.src[0] if x.op is Ops.UNSHARD else shard_subview(x, multi) if tuple(x.shape) == tuple(multi.shape) else x + for x in root.src[1:]] + return UOp(root.op, root.dtype, tuple(srcs), root.arg) + +def passthrough_multi(root:UOp, multi:UOp): + new_src = (multi.src[0],)+tuple(x.src[0] if x.op is Ops.UNSHARD else x for x in root.src[1:]) + return UOp(root.op, root.dtype, src=new_src, arg=root.arg).unshard(multi.arg, multi.src[1:]) + +def rewrite_into_function(call:UOp): + if call.arg.precompile: return None + new_body = graph_rewrite(call.src[0], multi_pm, name="subcall") + new_args = tuple(a.src[0] if a.op is Ops.UNSHARD else a for a in call.src[1:]) + # after multi resolution, TUPLE elements may be UNSHARD — strip UNSHARD from body, create per-shard FUNCTION, wrap each GETTUPLE in its own UNSHARD + assert new_body.op is Ops.TUPLE + if any(s.op is Ops.UNSHARD for s in new_body.src): + shard_call = call.replace(src=(UOp.maketuple(*[s.src[0] if s.op is Ops.UNSHARD else s for s in new_body.src]),)+new_args) + return UOp.maketuple(*[shard_call.gettuple(i).unshard(s.arg, s.src[1:]) if s.op is Ops.UNSHARD else shard_call.gettuple(i) + for i, s in enumerate(new_body.src)]) + return call.replace(src=(new_body,)+new_args) + +def param_to_multi(p:UOp): + if p.axis is None: return None + return UOp.param(p.arg.slot, p.dtype, p.shard_shape, p.device, p.arg.vmin_vmax, p.arg.multiple_of, p.arg.name, p.arg.addrspace).unshard(p.axis) + +# NOTE: this is the same pattern as unrolled ranges +multi_pm = PatternMatcher([ + (UPat(Ops.PARAM, name="p"), param_to_multi), + (UPat(GroupOp.ALU, name="root", custom_early_reject=set([Ops.UNSHARD])), alu_multi), + (UPat(Ops.REDUCE, src=(UPat(Ops.UNSHARD, name="multi"), ), name="root"), reduce_multi), + (UPat(Ops.RESHAPE, src=(UPat(Ops.UNSHARD, name="multi"), UPat()), name="root"), reshape_multi), + (UPat(Ops.EXPAND, src=(UPat(Ops.UNSHARD, name="multi"), UPat()), name="root"), expand_multi), + (UPat(Ops.PAD, src=(UPat(Ops.UNSHARD, name="multi"), UPat(), UPat()), name="root"), pad_multi), + (UPat(Ops.SHRINK, src=(UPat(Ops.UNSHARD, name="multi"), UPat(), UPat()), name="root"), shrink_multi), + (UPat(Ops.PERMUTE, src=(UPat(Ops.UNSHARD, name="multi"), ), name="root"), permute_multi), + (UPat(Ops.FLIP, src=(UPat(Ops.UNSHARD, name="multi"), ), name="root"), flip_multi), + (UPat(Ops.STACK, name="root", custom_early_reject=set([Ops.UNSHARD])), stack_multi), + (UPat(Ops.INDEX, src=(UPat(Ops.UNSHARD, name="multi"),), name="root", allow_any_len=True), index_multi), + (UPat(Ops.AFTER, src=(UPat(Ops.UNSHARD), UPat(Ops.STORE, src=(UPat(Ops.UNSHARD, name="dest"), UPat(Ops.UNSHARD, name="src"))))), store_after_multi), + (UPat(Ops.COPY, src=(UPat(Ops.UNSHARD, name="multi"),), name="copy"), lambda multi,copy: copy_multi(multi, copy.arg)), + (UPat(Ops.ALLREDUCE, src=(UPat(Ops.UNSHARD, name="multi"),), name="red"), + lambda multi,red: multi.src[0].allreduce(*red.arg).unshard(multi.arg, multi.src[1:])), + + # resolve TUPLE+GETTUPLE (needed in multi) + (UPat(Ops.GETTUPLE, src=(UPat(Ops.TUPLE, name="t"),), name="g"), lambda g,t: t.src[g.arg]), + # GETTUPLE on UNSHARD: passthrough UNSHARD (e.g. when FUNCTION was replaced by UNSHARD(GETTUPLE(...))) + (UPat(Ops.GETTUPLE, src=(UPat(Ops.UNSHARD, name="multi"),), name="g"), + lambda g, multi: multi.src[0].gettuple(g.arg).unshard(multi.arg, multi.src[1:]) if multi.src[0].op in {Ops.FUNCTION, Ops.TUPLE} else multi), + # rewrite into FUNCTION calls explicitly for UNSHARD (value-producing) + (UPat(Ops.FUNCTION, name="call"), rewrite_into_function), + (UPat((Ops.CALL, Ops.FUNCTION, Ops.AFTER), src=(UPat(Ops.UNSHARD, name="multi"), ), name="root", allow_any_len=True), passthrough_multi), + # just strip the UNSHARD from non-value-producing CALLs (custom kernels, etc.) — FUNCTION is handled by rewrite_into_function + (UPat(Ops.CALL, dtype=dtypes.void, name="root", custom_early_reject=set([Ops.UNSHARD])), lambda root: + UOp(root.op, root.dtype, tuple(x.src[0] if x.op is Ops.UNSHARD else x for x in root.src), root.arg)), + (UPat((Ops.CAST, Ops.BITCAST, Ops.CONTIGUOUS, Ops.DETACH, Ops.CONTIGUOUS_BACKWARD), + src=(UPat(Ops.UNSHARD, name="multi"), ), name="root"), passthrough_multi), + # STORE of a sharded value into an unsharded dest (e.g. a fragment into a full output tile) + (UPat(Ops.STORE, src=(UPat.var("dest"), UPat(Ops.UNSHARD, name="multi"))), store_value_multi), + # STORE into a sharded dest (e.g. the fragment init): every shard stores into its own shard + (UPat(Ops.STORE, src=(UPat(Ops.UNSHARD, name="multi"), ), name="root", allow_any_len=True), store_dest_multi), +])+replace_allreduce diff --git a/artifacts/package_runtime/tinygrad/schedule/rangeify.py b/artifacts/package_runtime/tinygrad/schedule/rangeify.py new file mode 100644 index 000000000..3e3ddb2b1 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/schedule/rangeify.py @@ -0,0 +1,579 @@ +from dataclasses import dataclass, field, replace +from typing import cast +import itertools +from tinygrad.dtype import dtypes, AddrSpace, Invalid, to_dtype, strong_dtype +from tinygrad.uop.ops import PatternMatcher, UPat, Ops, UOp, resolve, GroupOp, KernelInfo, ParamArg, shape_to_shape_arg +from tinygrad.uop.ops import graph_rewrite, sint, AxisType, BottomUpGate, rewrite_group, identity_element +from tinygrad.uop.symbolic import symbolic, pm_fold_cast_const +from tinygrad.uop.movement import mop_cleanup +from tinygrad.helpers import prod, getenv, dedup, all_int, DEBUG, SPLIT_REDUCEOP, DEBUG_RANGEIFY, VIZ, MAX_KERNEL_BUFFERS +from tinygrad.helpers import PCONTIG, FLOAT16, OPENPILOT_HACKS, argsort, partition, get_single_element +from tinygrad.codegen.simplify import pm_flatten_range, pm_reduce_simplify +from tinygrad.codegen.opt import Opt +from tinygrad.schedule.indexing import run_rangeify, BufferizeOpts, IndexingContext, apply_movement_op +from tinygrad.schedule.multi import multi_pm +from tinygrad.schedule.allreduce import create_allreduce_function + +# creation can recurse a lot +import sys +sys.setrecursionlimit(10000) + +def found_after(ctx:dict[UOp, UOp], after:UOp, src:UOp): + if (x:=src).op is Ops.CAST and x.dtype == dtypes.half and FLOAT16: x, after = x.src[0], after.cast(dtypes.float) + while True: + if x.op is Ops.PERMUTE: x, after = x.src[0], after.permute(argsort(x.marg)) + elif x.op is Ops.RESHAPE: x, after = x.src[0], after.reshape(x.src[0].shape) + elif x.op is Ops.WHERE and x.src[2].base.is_invalid and x.src[1].op is Ops.PAD: + x, after = x.src[1].src[0], after.shrink(tuple((o, s+o) for (o,_),s in zip(x.src[1].marg, x.src[1].src[0].shape))) + else: break + ctx[x] = after + +# *** fold moved AFTERs (hack for openpilot) *** +pm_fold_moved_after = PatternMatcher([ + (UPat(Ops.AFTER, src=(UPat(), UPat(Ops.STORE, src=(UPat(), UPat((*GroupOp.Movement,Ops.CAST,Ops.WHERE), name="src")))), name="after"), found_after), + # replace ALU sources with AFTER versions found above + (UPat(GroupOp.ALU, name="alu"), lambda ctx,alu: alu.replace(src=new_src) if (new_src:=tuple(ctx.get(s, s) for s in alu.src)) != alu.src else None), +]) + +# movement op on INDEX as a PatternMatcher +def _mop_index(r:UOp, idx:UOp): + idxs = idx.src[1:] + if len(idxs) == len(r.shape): + return r.src[0].index(*apply_movement_op(r.op, r.src[0].shape, r.marg, idxs), dtype=idx.dtype, arg=idx.arg) + if r.op is Ops.RESHAPE: + src_prefix = len(r.src[0].shape) - len(r.shape[len(idxs):]) + if src_prefix >= 0 and r.src[0].shape[src_prefix:] == r.shape[len(idxs):]: + if src_prefix == 0: return r.src[0] if r.src[0].dtype == idx.dtype else None + ret = r.src[0].index(*apply_movement_op(r.op, r.src[0].shape[:src_prefix], r.shape[:len(idxs)], idxs), dtype=idx.dtype, arg=idx.arg) + return ret if ret.shape == idx.shape else None + +pm_mops = PatternMatcher([ + # handle movement ops on INDEX + (UPat(GroupOp.Movement, name="r").f(Ops.INDEX, allow_any_len=True, name="idx"), _mop_index), + # move movement ops and INDEX after AFTER + (UPat(GroupOp.Movement|{Ops.INDEX}, name="r").after(name="a", allow_any_len=True), + lambda r,a: UOp(r.op, src=(a.replace(src=(r.src[0],)+a.src[1:]),)+r.src[1:], arg=r.arg)), + (UPat(GroupOp.Movement, name="r").end(name="a", allow_any_len=True), lambda r,a: a.replace(src=(r.src[0],)+a.src[1:])), +]) + +# ***************** +# 0. do some cleanup rewrites, mostly copied from the old stuff + +def fix_store_hazard(target:UOp, src:UOp): + if (base:=target.base) not in src.backward_slice_with_self: return None + # PERMUTE and FLIP reorder indices, SHRINK can have overlapping regions when dest is also shrunk + unsafe = {Ops.PERMUTE, Ops.FLIP} | ({Ops.SHRINK} if target.op_in_backward_slice_with_self(Ops.SHRINK) else set()) + reaches_base: dict[UOp, bool] = {} + for s in src.toposort(gate=lambda s: s.op is not Ops.CONTIGUOUS): + reaches_base[s] = s is base or any(reaches_base.get(c) for c in s.src) + if reaches_base[s] and s.op in unsafe and not (s is target and s.op is Ops.SHRINK): return target.store(src.contiguous()) + +def split_reduceop(reduce:UOp, x:UOp): + if prod(reduce.shape) == 0: return None + if not SPLIT_REDUCEOP or not all_int(x.shape) or (prod(x.shape)//prod(reduce.shape))1) else 0 for i,s in enumerate(x.shape)]) + range_nums = [y.arg[0] for y in indexed.substitute({x.base:UOp(Ops.NOOP, x.base.dtype)}, extra_pm=pm_mops).ranges] + is_expanded = [i not in range_nums for i in range(len(x.shape))] + + if not (split_candidates:=[(i,d) for i in range(reduce.arg[1]) + for d in range(min(256,2**getenv("REDUCEOP_SPLIT_SIZE",22)//prod(reduce.shape)),8-1,-1) + if x.shape[i]%d==0 and not is_expanded[i]]): return None + dim_to_split, divisor = split_candidates[0] + splitted_shape = x.shape[:dim_to_split]+(divisor,)+(x.shape[dim_to_split]//divisor,)+x.shape[dim_to_split+1:] + splitted = x.reshape(splitted_shape).permute(tuple([d for d in range(len(splitted_shape)) if d!=dim_to_split]+[dim_to_split])) + if DEBUG >= 3: print(f"split {divisor}: {x.shape} -> {splitted.shape} -> {reduce.shape}") + # reduce original axes, then split + return splitted._rop(reduce.arg[0], tuple(range(reduce.arg[1]))).contiguous()._rop(reduce.arg[0], (len(reduce.shape),)).reshape(reduce.shape) + +pm_gather_params = PatternMatcher([ (UPat(Ops.PARAM, name="p"), lambda ctx, p: ctx.append(p) if p.arg.slot >= 0 else None), ]) +def resolve_function(c:UOp, allow_param_mismatch=True) -> UOp|None: + if c.arg.precompile: return None + params: list[UOp] = [] + graph_rewrite(c.src[0], pm_gather_params, bottom_up=True, ctx=params, name="gather params") + params = sorted(params, key=lambda x: x.arg.slot) + args = c.src[1:] + + # NOTE: this isn't really needed. it's okay if there's unused args in the function + if not allow_param_mismatch: + if [x.arg.slot for x in params] != list(range(len(params))): raise RuntimeError(f"params not in order: {[x.arg.slot for x in params]}") + if len(params) != len(args): raise TypeError(f"expected {len(params)} args, got {len(args)}") + + dict_map = {x:args[x.arg.slot] for x in params} + for i, (p, a) in enumerate(dict_map.items()): + if p.axis != a.axis: raise TypeError(f"arg {i} axis mismatch: expected {p.axis}, got {a.axis}") + if p.max_shape != a.max_shape: raise TypeError(f"arg {i} shape mismatch: expected {p.shape}, got {a.shape}") + if p.dtype != a.dtype: raise TypeError(f"arg {i} dtype mismatch: expected {p.dtype}, got {a.dtype}") + return c.src[0].substitute(dict_map, walk=True) + +# shape-changing bitcast +def expand_bitcast(bc:UOp) -> UOp|None: + x = bc.src[0] + if (ns:=bc.dtype.itemsize) == (os:=x.dtype.itemsize) or (isinstance(x.device, str) and x.device.startswith(("DISK", "TINYFS"))): return None + new_uint, tmp = to_dtype(f"uint{8*ns}"), x.bitcast(to_dtype(f"uint{8*os}")) + if ns > os: + tmp = tmp.reshape(x.shape[:-1] + (x.shape[-1]//(rate := ns//os), rate)) + parts = [tmp.shrink((None,)*(len(tmp.shape)-1) + ((i, i+1),)).cast(new_uint)<<8*i*os for i in range(rate)] + return parts[0].usum(*parts[1:]).squeeze(-1).bitcast(bc.dtype) + parts = [tmp>>8*i*ns for i in range(os//ns)] + return parts[0].stack(*parts[1:], dim=-1).flatten(-2).cast(new_uint).bitcast(bc.dtype) + +earliest_rewrites = mop_cleanup+PatternMatcher([ + # resolve FUNCTION calls (inline the body) + (UPat(Ops.FUNCTION, name="c"), resolve_function), + + # resolve TUPLE+GETTUPLE + (UPat(Ops.GETTUPLE, src=(UPat(Ops.TUPLE, name="t"),), name="g"), lambda g,t: t.src[g.arg]), + + # resolve allreduce (must be bottom up) + (UPat(Ops.ALLREDUCE, src=(UPat.var("buf"),), name="red"), create_allreduce_function), + + # split_reduceop + (UPat(Ops.REDUCE, name="reduce", src=(UPat.var("x"),)), split_reduceop), + + # remove DETACH/CONTIGUOUS_BACKWARD (TODO: this is copied in allocations) + (UPat((Ops.DETACH, Ops.CONTIGUOUS_BACKWARD), name="x"), lambda x: x.src[0]), + + # SINK only ever references the base + (UPat(Ops.SINK, name="x"), lambda x: x.replace(src=tuple(y.base for y in x.src))), + + # ** copy rules ** + + # COPY transfers a contiguous range, so materialize a source that's resized (shrink/pad/expand) or reordered (permute/flip) + (UPat(Ops.COPY, src=(UPat(GroupOp.Movement, name="r"),), name="c"), + lambda c,r: c.replace(src=(r.contiguous(),)) if resolve(r.numel() != r.base.numel(), False) or r.contiguous_view_offset() is None else None), + + # copy to same device is a no-op + (UPat(Ops.COPY, src=(UPat.var("x"),), name="copy"), lambda x,copy: x if x.device == copy.device else None), + + # copy on reshape is reshape on copy + (UPat(Ops.COPY, src=(UPat(Ops.RESHAPE, name="shp"),), name="cpy"), lambda shp,cpy: shp.src[0].copy_to_device(cpy.device).reshape(shp.shape)), + + # reshaping on STORE can be a NOOP + (UPat(Ops.STORE, src=(UPat(Ops.RESHAPE, src=(UPat.var("dst",),), allow_any_len=True), + UPat(Ops.RESHAPE, src=(UPat.var("src",),), allow_any_len=True))), + lambda dst,src: dst.store(src) if dst.shape == src.shape else None), + + # ** store rules ** + + # fix store hazard (dest is in used in src) by adding contiguous: TestAssign.test_post_flipped_assignment + (UPat(Ops.STORE, src=(UPat(name="target"), UPat(name="src"))), fix_store_hazard), + + # remove two STOREs that store the same thing to the same place: TestSchedule.test_dedup_assign + (UPat.var("buf").after(UPat.var("buf").store(UPat.var("src")), name="a1").after(UPat.var("a1").store(UPat.var("src"))), lambda buf,src,a1:a1), + + # store a buffer's own current contents back into itself: TestAssign.test_nested_after_contiguous_store_no_init + (UPat.var("buf").after(UPat.var("buf").store(UPat.var("buf").after(UPat.var("buf").store(UPat.var("src")), name="a1"))), lambda buf,src,a1:a1), + + # move bitcast from store dest to source: TestAssign.test_assign_bitcast + (UPat(Ops.STORE, src=(UPat(Ops.BITCAST, src=(UPat(name="target"),)), UPat(name="src"))), + lambda target, src: target.store(src.bitcast(target.dtype))), + + (UPat(Ops.BITCAST, name="bc"), expand_bitcast), + + # ** size 0 ** + + # reduce of size 0 is the identity element + (UPat(Ops.REDUCE, name="reduce", src=(UPat.var("x"),)), + lambda reduce,x: reduce.const_like(identity_element(reduce.arg[0], reduce.dtype)) if 0 in x.shape and 0 not in reduce.shape else None), + # handle size 0 + (UPat(GroupOp.All-{Ops.SINK}, name="x"), lambda x: x.const_like(0).rtag(x.tag) if x._shape is not None and 0 in x.shape else None), +]) + +# ***************** +# 3.5 cleanups + +ALWAYS_RUN_OPS = {Ops.CONTIGUOUS, Ops.NOOP} + +# you don't know in the first pass if axes are going to die, this happens if there's an EXPAND to the left +def cleanup_dead_axes(b:UOp): + if not b.arg.removable: return None + # don't optimize ALWAYS_RUN_OPS or AFTER (AFTER is a buffer identity — ranges define consumer access, not computation) + if b.src[0].op in ALWAYS_RUN_OPS or b.src[0].op is Ops.AFTER: return None + + new_rng = [] + hit = False + reshape: list[sint] = [] + for s,rng in zip(b.shape, b.src[1:]): + # skip for symbolic. TODO: fix this + if rng.op is Ops.RANGE and rng.src[0].op is not Ops.CONST: return None + # CONSTs are already dead axes + if rng.op is Ops.CONST or (rng.op is Ops.RANGE and rng not in b.src[0].ranges): + reshape.append(1) + hit = True + else: + reshape.append(s) + new_rng.append(rng) + if hit: + return b.replace(src=b.src[0:1]+tuple(new_rng)).reshape(tuple(reshape)).expand(b.shape) + +def gate_substitute(ctx, b:UOp) -> None: + if not any(r in b.ranges for r in ctx.keys()): raise BottomUpGate() +pm_gate_substitute = PatternMatcher([(UPat(GroupOp.All, name="b"), gate_substitute)], compiled=False) +# if a buffer is being stored just for permutes or something, remove it +# we want to reexpress the indexes of idx2 in terms of the implied b1 +def remove_bufferize(src:UOp, buf:UOp, idx:UOp): + # see if we can't do it, should this ever hit? + assert len(buf.src) == len(idx.src), f"index on wrong bufferize, {len(buf.src)} != {len(idx.src)}" + assert all(x.op in {Ops.RANGE, Ops.CONST} for x in buf.src[1:]) + + # if it's user contiguous, we never remove it + if src.op in ALWAYS_RUN_OPS or not buf.arg.removable: return None + + # *** here is where we compute the cost *** + # if we return None, the bufferize is kept + + accessed_buffers: list[UOp] = [] + indexes: list[UOp] = [] + reduces: list[UOp] = [] + def red_gate(x:UOp): + if x.op is Ops.AFTER: + accessed_buffers.append(x.buf_uop) + return False + if (x.op is Ops.STAGE and x.arg.addrspace == AddrSpace.GLOBAL) or x.op is Ops.MSTACK: + accessed_buffers.append(x) + return False + if x.op is Ops.STORE: + # don't look inside stores, this doesn't count toward buffer accesses + return False + if x.op is Ops.PARAM: + accessed_buffers.append(x) + if x.op is Ops.INDEX: + indexes.append(x) + if x.op is Ops.REDUCE: reduces.append(x) + return True + src.toposort(gate=red_gate) + del red_gate + accessed_buffers = dedup(accessed_buffers) + + # if this is generated from multiple buffers, don't remove this buffer + if len(accessed_buffers) > 3 and not (PCONTIG > 2): return None + + # if any reduces access a buffer, don't remove this buffer + buffer_in_reduce = False + def buf_gate(x:UOp): + nonlocal buffer_in_reduce + if x.op in {Ops.PARAM, Ops.STAGE, Ops.AFTER}: buffer_in_reduce = True + return not buffer_in_reduce + UOp.sink(*[x.src[0] for x in reduces]).toposort(gate=buf_gate) + del buf_gate + if buffer_in_reduce: + if PCONTIG > 2: + out_in_ratio = (prod(buf.shape)+1) / (sum([x.numel() for x in accessed_buffers])+1) + if out_in_ratio < 10: return None + # here we have to check the indexes, we might do a partial contig here + local_indexes = [x for x in indexes if x.src[0].op is Ops.STAGE and x.src[0].arg.addrspace == AddrSpace.LOCAL] + exclude_ranges = UOp.group(*[UOp.group(*x.src[1:]) for x in local_indexes]).ranges + subs = [(k,v) for k,v in zip(buf.src[1:], idx.src[1:]) if k.op is not Ops.CONST] + # if it's bufferized or a reduce, it's pcontig + is_pcontig, is_subs = partition(subs, lambda x: x[0] in exclude_ranges or any([r.arg[-1] == AxisType.REDUCE for r in x[1].ranges])) + if not len(is_subs): + return None + if len(is_pcontig): + ret = src.substitute(dict(is_subs), extra_pm=pm_gate_substitute) + return ret.bufferize(*[x[0] for x in is_pcontig], arg=BufferizeOpts(None, AddrSpace.LOCAL)).index(*[x[1] for x in is_pcontig]) + else: + return None + + # if it makes it here, the bufferize is removed + # this is the ranges replaced + # NOTE: if buf src is a const, we don't replace it. if idx is Invalid (dead load), don't replace it either + replaced = {k:v for k,v in zip(buf.src[1:], idx.src[1:]) if k.op is not Ops.CONST and not (v.op is Ops.CONST and v.val is Invalid)} + return src.substitute(replaced, extra_pm=pm_gate_substitute) + +def remove_noop_bufferize(idx,b2): + if idx.src[1:] != b2.src[1:]: return None + return idx.src[0].shrink(tuple((0, s) for s in b2.shape)) if b2.shape else idx.src[0] + +def after_all_invalid(after:UOp): + buf = after.src[0].buf_uop + # check all ranges are used (no expand), and same size (no pad and shrink) + return all(s.op is Ops.END and (st:=s.src[0]).op is Ops.STORE and st.src[1].base.is_invalid and st.src[0].buf_uop is buf + and all(r in st.src[0].ranges for r in s.ended_ranges) + and resolve(cast(UOp, prod(r.src[0] for r in s.ended_ranges)).eq(buf.numel()), False) for s in after.src[1:]) + +pm_const_buffer_folding = pm_mops+PatternMatcher([ + (UPat(Ops.STAGE, name="b"), cleanup_dead_axes), + # remove noop buffers. if we look at the next index we can remove even more of these + (UPat(Ops.INDEX, name="idx").f(Ops.STAGE, allow_any_len=True, name="b2"), remove_noop_bufferize), + (UPat(Ops.INDEX, src=(UPat(Ops.STAGE),), allow_any_len=True, name="idx").f(Ops.NOOP).f(Ops.STAGE, allow_any_len=True, name="b2"), + remove_noop_bufferize), + # no buffers for const (ranges don't matter for const - it's the same value everywhere) + (UPat(Ops.CONST, name='c').f(Ops.STAGE, allow_any_len=True, name="b"), lambda c,b: b.const_like(c.val)), + # indexing a const is a const + (UPat(Ops.INDEX, src=(UPat(Ops.CONST, name="c"),),), lambda c: c), + # indexing an after with all fully invalid stores is invalid + (UPat(Ops.INDEX, src=(UPat(Ops.AFTER, name="after"),), allow_any_len=True, name="idx"), + lambda idx,after: idx.const_like(Invalid) if after_all_invalid(after) else None), + # hack if a noop turned to a const + (UPat(Ops.NOOP, src=(UPat.cvar("c"),)), lambda c: c), + # mstack on CONST is CONST + (UPat(Ops.MSTACK, src=(UPat.var("s"),), allow_any_len=True).f(Ops.INDEX, allow_any_len=True), + lambda s: c if (c:=s.base).op is Ops.CONST else None), +]) + +pm_remove_bufferize = PatternMatcher([ + # remove reindexing with cost function + (UPat.var("src").f(Ops.STAGE, allow_any_len=True, name="buf").f(Ops.INDEX, allow_any_len=True, name="idx"), remove_bufferize), + # STORE to self is NOOP + (UPat.var("x").store(UPat.var("x")), lambda x: UOp(Ops.NOOP)), + # END on NOOP is NOOP + (UPat(Ops.END, src=(UPat(Ops.NOOP, name="x"),), allow_any_len=True), lambda x: x), +]) + +DEVICE_MAX_BUFS = {"METAL": 31, "WEBGPU": 8, "CPU": 31} # TODO: get from device? +def limit_bufs(ctx:IndexingContext, root:UOp): + if (device:=root.device) is None: return None # no device, index related calculations + device = device if isinstance(device, str) else device[0].split(":")[0] + if not (MAX_BUFS:=MAX_KERNEL_BUFFERS.value or DEVICE_MAX_BUFS.get(device, 0)): return None + + def visitor(u:UOp) -> frozenset[UOp]: + if u.op in {Ops.STAGE, Ops.AFTER, Ops.PARAM, Ops.MSELECT, Ops.MSTACK}: return frozenset((u,)) + if len(u.src) == 1: return ctx.buf_cache[u.src[0]] + return frozenset().union(*[ctx.buf_cache[s] for s in u.src]) + bufs = root.topovisit(visitor, ctx.buf_cache) + + if len(bufs) > MAX_BUFS - 1: # NOTE: this -1 is for the output buffer + srcs = [] + for s in root.src: + if s.op in GroupOp.Elementwise and s.device is not None: + # Insert bufferize: all AxisType.REDUCE before bufferize are AxisType.WEAK, the DEVICE range stays a launched axis + orig_ranges = s.ranges + end_ranges = [x.replace(arg=(next(ctx.range_idx), AxisType.WEAK)) if x.op is Ops.RANGE and x.arg[-1] is not AxisType.DEVICE else x + for x in s.ranges] + s = s.substitute(dict(zip(orig_ranges, end_ranges))).bufferize(*end_ranges, arg=BufferizeOpts(device=s.device)).index(*orig_ranges) + srcs.append(s) + return root.replace(src=tuple(srcs)) +pm_limit_bufs = PatternMatcher([(UPat(set.union(GroupOp.Binary, GroupOp.Ternary), name="root"), limit_bufs)]) + +# ***************** +# 4. put in buffers for bufferize +# TODO: should BUFFERIZE look a lot more like STORE +# BUFFERIZE has device in arg +# BUFFERIZE doesn't have indexing, that's implied by the ranges it closes +# BUFFERIZE returns the BUFFER ready for INDEXing (doing this will make splitting a lot easier) +# NOTE: this has been fixed up a bit + +def bufferize_to_store(ctx:itertools.count, x:UOp, idx:UOp, allow_locals=True): + size = prod(x.shape) + dtype = strong_dtype(x.dtype) # a BUFFER is never weak: store at the concrete dtype, the .cast(x.dtype) on the result keeps readers unchanged + rngs = sorted(idx.ranges, key=lambda x: x.arg) + assert size > 0 and isinstance(size, int), f"no zero sized or symbolic sized buffers {size}" + + # AFTER: add END to the existing STORE, return buffer with kernel dependency + if (after:=x.src[0]).op is Ops.AFTER: + buf = after.src[0].buf_uop.base + if not (stores := [s for s in after.src[1:] if s.op is Ops.STORE and s.src[0].op is Ops.INDEX]): return buf + # BUFFERIZE(INDEX(...)); store through the underlying global index instead. + ended_stores = [] + for store in stores: + store_target = store.src[0] + if store_target.src[0].op is Ops.STAGE and store_target.src[0].src[0].op is Ops.INDEX: + store_target = store_target.src[0].src[0] + if store.src[1] is store_target: continue # skip self-assign + end_rngs = sorted(dedup(tuple(store_target.ranges) + tuple(rngs)), key=lambda x: x.arg) + ended_stores.append(store_target.store(store.src[1]).end(*end_rngs)) + return buf.after(*ended_stores) + + # NOTE: the local BUFFER needs to be disambiguated here + if x.arg.addrspace == AddrSpace.GLOBAL: + buf = UOp(Ops.BUFFER, src=(shape_to_shape_arg((size,)),), arg=ParamArg(next(ctx), dtype, device=x.arg.device, addrspace=AddrSpace.GLOBAL)) + do_store = buf.index(idx).store(x.src[0].cast(dtype)).end(*rngs) + return buf.after(do_store).cast(x.dtype) + + if allow_locals: + # handle locals + buf = UOp.placeholder((size,), dtype, next(ctx), AddrSpace.LOCAL) + do_store = buf.index(idx).store(x.src[0].cast(dtype)).end(*rngs) + return buf.after(do_store).cast(x.dtype) + +# collapse any BUFFERIZE to single input BUFFERIZE +def flatten_bufferize(x:UOp): + if len(x.src) == 2: return None + ret = x.replace(src=(x.src[0], get_single_element(apply_movement_op(Ops.RESHAPE, (prod(x.shape),), x.shape, x.src[1:])))) + rngs = x.src[1:] + ret = ret.reshape(x.shape) + if any(r.op is Ops.RANGE and r.src[0].op is not Ops.CONST for r in rngs): + sym_shape = tuple([r.src[0] if r.op is not Ops.CONST else 1 for r in rngs]) + ret = ret.shrink(tuple([(0,x) for x in sym_shape])) + return ret +pm_flatten_bufferize = PatternMatcher([(UPat(Ops.STAGE, name="x"), flatten_bufferize)]) + +def is_noop_after_dep(x:UOp) -> bool: + return (x.op is Ops.NOOP and len(x.src) == 0) or (x.op is Ops.END and is_noop_after_dep(x.src[0])) + +def remove_noop_afters(x:UOp) -> UOp|None: + src = (x.src[0],) + tuple(s for s in x.src[1:] if not is_noop_after_dep(s)) + if len(src) != len(x.src): return src[0] if len(src) == 1 else x.replace(src=src) + return None + +pm_add_buffers = pm_mops+pm_flatten_bufferize+PatternMatcher([ + (UPat(Ops.STAGE, src=(UPat(), UPat(name="idx")), name="x"), lambda ctx,x,idx: bufferize_to_store(ctx, x, idx, allow_locals=False)), + + # INDEX of a buffer through the weak cast added above: index the buffer directly and cast the loaded value instead. + # this must run in the same rewrite that adds the cast, or the expander expands the whole casted buffer into one big VECTORIZE + (UPat(Ops.INDEX, src=(UPat(Ops.CAST, dtype=dtypes.weaks, src=(UPat.var("buf"),)),), allow_any_len=True, name="u"), + lambda u,buf: u.replace(dtype=None, src=(buf,)+u.src[1:]).cast(u.dtype)), + + # move RESHAPEs through MSELECT/MSTACK + (UPat((Ops.MSELECT, Ops.MSTACK), src=UPat(Ops.RESHAPE), name="m"), + lambda m: m.replace(src=tuple([x.src[0].base for x in m.src])).reshape(m.shape)), + + # remove any RESHAPEs on KERNEL + (UPat(Ops.CALL, name="k"), lambda k: k.replace(src=tuple(x.src[0] if x.op is Ops.RESHAPE else x for x in k.src))), + + # remove invalid writes + (UPat(Ops.STORE, src=(UPat(), UPat(Ops.CONTIGUOUS, src=(UPat(Ops.CONST, arg=Invalid),)))), lambda: UOp(Ops.NOOP)), + (UPat(Ops.STORE, src=(UPat(), UPat(Ops.CONST, arg=Invalid))), lambda: UOp(Ops.NOOP)), + (UPat(Ops.AFTER, name="x"), remove_noop_afters), +]) + +# ***************** +# 5. split into kernels + +@dataclass +class LocalAddBufferContext: + dg:int = 0 + map:dict = field(default_factory=dict) + vars:dict = field(default_factory=dict) + range:int = 0 + opts:tuple|None = None + +def debuf(ctx:LocalAddBufferContext, buf:UOp): + param = UOp(Ops.PARAM, src=(UOp.const(prod(buf.max_shape)),), + arg=ParamArg(ctx.dg, buf.dtype, addrspace=buf.addrspace, device=buf.device)) + ret = param.reshape(buf.max_shape) + # if the buffer has symbolic shape, shrink the max-sized view to the actual shape + if buf.max_shape != buf.shape: ret = ret.shrink(tuple((0, s) for s in buf.shape)) + if buf not in ctx.map: ctx.map[buf] = buf + ctx.dg += 1 + return ret + +def unbind_kernel(ctx:LocalAddBufferContext, b:UOp): + ctx.vars[b] = None + return b.src[0] + +def handle_after(ctx:LocalAddBufferContext, after:UOp): + if after.addrspace == AddrSpace.LOCAL: return None + buf = after.buf_uop + # NOTE: this is bottom up, so we only add it once + if buf not in ctx.map: ctx.map[buf] = after + return buf + +def renumber_range(ctx:LocalAddBufferContext, r:UOp): + if r.tag != (): return None + ret = r.replace(arg=(ctx.range,)+r.arg[1:], tag=None) + ctx.range += 1 + return ret + +def find_bufs(x:UOp): + idxs = [s for s in x.toposort(gate=lambda x: x.op is not Ops.AFTER) if s.op is Ops.INDEX] + read_from: dict[UOp, Ops] = {} + if any((buf:=idx.buf_uop).op in {Ops.BUFFER, Ops.PARAM} and read_from.setdefault(buf, op:=idx.src[0].op) is not op for idx in idxs): + raise RuntimeError(f"cycle detected while indexing {buf}") + +to_define_global = PatternMatcher([ + (UPat(Ops.STORE, name="x"), find_bufs), + (UPat((Ops.BUFFER, Ops.MSTACK, Ops.MSELECT), name="buf"), debuf), + (UPat(Ops.PARAM, name="v"), lambda v: + UOp.variable(v.arg.name, v.arg.vmin_vmax[0], v.arg.vmin_vmax[1], v.dtype, multiple_of=v.arg.multiple_of) + if v.arg.name is not None and v.arg.vmin_vmax is not None else None), + + # this renumbers the params + (UPat(Ops.PARAM, name="buf"), lambda ctx, buf: + None if buf.tag != () or buf.arg.name is not None or buf._shape is None else debuf(ctx, buf)), + + # ALU params are scalar symbolic values, not buffers. + (UPat(Ops.INDEX, src=(UPat(Ops.PARAM, name="v"),)), lambda v: v if v.addrspace == AddrSpace.ALU else None), + + (UPat(Ops.BIND, name="b"), unbind_kernel), + (UPat(Ops.AFTER, name="after"), handle_after), + + # remove device from local BUFFERIZE + (UPat(Ops.STAGE, name="b"), lambda b: b.replace(arg=replace(b.arg, device=None))), + + # renumber the ranges starting with 0 so that kernel deduping works + (UPat(Ops.RANGE, name="r"), renumber_range), +]) + +def get_contiguous(ctx:LocalAddBufferContext, x:UOp): + if isinstance(x.arg, tuple) and all(isinstance(y, Opt) for y in x.arg): ctx.opts = x.arg + return x.src[0] + +rangeify_codegen = PatternMatcher([ + (UPat(Ops.CONTIGUOUS, name="x"), get_contiguous), + + # no NOOP in the kernel graph + # TODO: this can be moved into codegen? + (UPat(Ops.NOOP, name="x"), lambda x: x.src[0] if len(x.src) else None), +]) + +pm_add_param_range_tags = PatternMatcher([ + (UPat((Ops.PARAM, Ops.RANGE), name="x"), lambda x: x.rtag(())), +]) + +def split_store(x:UOp) -> UOp|None: + # if we have any open ranges here, we don't split. open DEVICE ranges are fine, they are bound per device at launch + if any(r.arg[-1] is not AxisType.DEVICE for r in x.ranges): return None + + # local kernel rewrite + lctx = LocalAddBufferContext() + ret = graph_rewrite(x, to_define_global+pm_flatten_range+rangeify_codegen, ctx=lctx, name="kernel split", bottom_up=True) + + # create the Kernel. NOTE: buffers can be on different devices here now, they are compiled to SDMA copies later by schedule + return ret.sink(arg=KernelInfo(opts_to_apply=lctx.opts)).call(*lctx.map.values(), *lctx.vars.keys()) + +split_kernels = PatternMatcher([ + (UPat((Ops.STORE, Ops.END), name="x"), split_store), +]) + +def convert_copy_to_store(ctx, copy:UOp, existing_buf:UOp|None=None): + input_src = copy.src[0] + if not input_src.has_buffer_identity(after_ok=True): input_src = input_src.contiguous() + input_src = input_src.flatten() + if existing_buf is not None: + # if the existing buffer is not a full buffer, we can't use it + if not existing_buf.has_buffer_identity(after_ok=True): return None + # if there's already a buffer, we just use it + return existing_buf.flatten().store(input_src) + # create the output buffer + buf = UOp(Ops.BUFFER, src=(shape_to_shape_arg(input_src.max_shape),), arg=ParamArg(next(ctx), copy.dtype, device=copy.device)) + # reshape back to input + return buf.after(buf.store(input_src)).reshape(copy.shape) + +pm_copy_to_store = PatternMatcher([ + (UPat(name="existing_buf").store(UPat(Ops.COPY, name="copy")), convert_copy_to_store), + (UPat(Ops.COPY, name="copy"), convert_copy_to_store), +]) + +@rewrite_group(new_ctx=False) +def get_kernel_graph(sink:UOp) -> UOp: + tsink = graph_rewrite(sink, multi_pm, name="multi_pm") + if OPENPILOT_HACKS: tsink = graph_rewrite(tsink, pm_fold_moved_after, ctx={}, name="fold moved afters") + tsink = graph_rewrite(tsink, pm_mops+earliest_rewrites, bottom_up=True, name="earliest rewrites") + + tsink = graph_rewrite(tsink, pm_copy_to_store, ctx=itertools.count(0), bottom_up=True, name="convert copy to store") + + # convert movement ops to ranges + tsink, rctx = run_rangeify(tsink, bool(DEBUG_RANGEIFY)) + + tsink = graph_rewrite(tsink, symbolic+pm_fold_cast_const+pm_reduce_simplify+pm_const_buffer_folding+pm_remove_bufferize, + name="symbolic+reduce_collapse+debuf") + tsink = graph_rewrite(tsink, pm_limit_bufs, ctx=rctx, name="limit buffers") + + if VIZ: graph_rewrite(tsink, PatternMatcher([]), name="View Rangeify") + + # bufferize -> store + slots = [x.arg.slot for x in tsink.toposort() if x.op is Ops.BUFFER and isinstance(x.arg, ParamArg) and x.addrspace is AddrSpace.GLOBAL] + paramarg_start: int = max([-1]+slots) + 1 + tsink = graph_rewrite(tsink, pm_add_buffers+pm_add_param_range_tags, ctx=itertools.count(paramarg_start), bottom_up=True, name="stage to store") + tsink = graph_rewrite(tsink, split_kernels, bottom_up=True, name="split kernels") + + if VIZ: graph_rewrite(tsink, PatternMatcher([]), name="View Kernel Graph") + return tsink diff --git a/artifacts/package_runtime/tinygrad/tensor.py b/artifacts/package_runtime/tinygrad/tensor.py new file mode 100644 index 000000000..304d1fe1a --- /dev/null +++ b/artifacts/package_runtime/tinygrad/tensor.py @@ -0,0 +1,772 @@ +# inspired by https://github.com/karpathy/micrograd/blob/master/micrograd/engine.py +from __future__ import annotations +import time, functools, sys, inspect, pathlib, hashlib, weakref +from dataclasses import dataclass, field +from typing import Any, Callable, cast, get_args, ParamSpec, TypeGuard, TypeVar, Generic, TYPE_CHECKING +if TYPE_CHECKING: import numpy +from tinygrad.dtype import DType, DTypeLike, dtypes, ConstType, least_upper_dtype, to_dtype, strong_dtype, \ + _from_np_dtype, _to_np_dtype, PyConst, AddrSpace +from tinygrad.helpers import all_int, getenv, fetch, Metadata, TRACEMETA, TracingKey +from tinygrad.helpers import cpu_profile, suppress_finalizing, disable_gc, VIZ, pluralize +from tinygrad.uop.ops import UOp, Ops, sint, all_metadata, Variable, ConstLike, UPat, PatternMatcher, GroupOp, ParamArg, graph_rewrite, rewrite_group +from tinygrad.mixin.rand import RandMixin +from tinygrad.schedule import create_linear_with_vars +from tinygrad.device import Buffer, canonicalize_device +from tinygrad.engine.realize import run_linear + +# *** callify: transform a tensor graph into a CALL UOp such that all state is properly scoped *** + +@dataclass +class AllocCtx: + uop_list: list[UOp] = field(default_factory=list) + buffer_map: dict[UOp, UOp] = field(default_factory=dict) + bases: set[UOp] = field(default_factory=set) + assigns: list[UOp] = field(default_factory=list) + replacements: list[UOp] = field(default_factory=list) + +def tag_uop(ctx:AllocCtx, x:UOp): + if x.tag is not None: return None + ctx.uop_list.append(x) + return x.replace(tag=(len(ctx.uop_list)-1,)) + +def disk_like(u:UOp): return isinstance(u.device, str) and u.device.startswith(("DISK", "TINYFS")) + +def disk_copy_is_buffer(ctx:AllocCtx, u:UOp): + # copies to disk are replaced with the disk buffer + if disk_like(u) and u.tag is None: + ctx.buffer_map[u] = u.empty_like() + return u.rtag(()) + # all copies from disk/numpy are realized into a real buffer + from_creation = isinstance(u.src[0].device, str) and u.src[0].device.startswith(("NPY", "DISK", "PYTHON", "TINYFS")) + if from_creation: return tag_uop(ctx, u) + +# CONTIGUOUS and AFTER + parents are the only nodes that get updated +add_tags = PatternMatcher([ + (UPat(Ops.COPY, name="u"), disk_copy_is_buffer), + # no tag on copies that are assigned via STORE+AFTER — merge COPY tag into AFTER + (UPat(Ops.AFTER, src=(UPat(), UPat(Ops.STORE, src=(UPat(name="dest"), UPat(Ops.COPY, name="c")))), name="a"), + lambda a,c,dest: a.replace(src=(a.src[0], a.src[1].replace(src=(dest, c.rtag(())))), tag=a.tag+c.tag) if a.tag and c.tag else None), + (UPat((Ops.CONTIGUOUS, Ops.AFTER), name="x"), tag_uop), + (UPat(GroupOp.All, name="x"), lambda ctx,x: tag_uop(ctx,x) if x in ctx.bases else None), +]) + +def replace_contig_with_store_after(u:UOp): + # can't allocate a buffer for a virtual value + if u.is_virtual: return None + # if size is 0, remove the contig + if 0 in u.shape: return u.src[0] + # no real contig for DISK/TINYFS tensors, they are left alone + if disk_like(u): return u.rtag(None) + buf = u.empty_like() + return buf.after(buf.store(u.src[0])).rtag(u.tag) + +def replace_store_after_with_contig(u:UOp, src:UOp): + assigned_to = u + while assigned_to.op in {Ops.BITCAST, Ops.AFTER, Ops.UNSHARD}: assigned_to = assigned_to.src[0].base + if assigned_to.op not in {Ops.BUFFER, Ops.SLICE}: return src.contiguous(tag=u.tag) + +def _make_buffer_view(src:UOp) -> UOp|None: + """If movement ops on src collapse to a contiguous range, return SLICE. Otherwise None.""" + if (offset := src.contiguous_view_offset()) is None: return None + buf = src.base + if buf.op is Ops.SLICE: + byte_offset = buf.src[1].val * buf.src[0].dtype.itemsize + offset * src.dtype.itemsize + buf = buf.src[0] + if byte_offset % buf.dtype.itemsize != 0: return None + offset = byte_offset // buf.dtype.itemsize + return UOp(Ops.SLICE, src.dtype, (buf, UOp.const(offset)), src.numel()) + +def contiguous_mops_to_view(c:UOp, src:UOp): + """MOPS(BUFFER) → SLICE when movement ops collapse to a contiguous range.""" + buf = src.base + if buf.op not in {Ops.BUFFER, Ops.SLICE, Ops.UNSHARD}: return None + if src.op is Ops.RESHAPE and src.src[0].op in {Ops.BUFFER, Ops.SLICE} and c.op is not Ops.BITCAST: return None + if c.op is not Ops.BITCAST and src.op is Ops.BUFFER: return None + + # no symbolic shape + if not all_int(c.shape): return None + + if buf.op is not Ops.UNSHARD and (view := _make_buffer_view(src)) is not None: + view = (view.replace(dtype=c.dtype, arg=c.numel()) if c.op is Ops.BITCAST else view).reshape(c.shape) + return c.replace(src=(view,)) if c.op is Ops.COPY else view + + # for UNSHARD tensors, use multi_pm to resolve per-shard movement ops, then create SLICE on the resolved result + if not isinstance(c.device, str): + from tinygrad.schedule.multi import multi_pm + resolved = graph_rewrite(src, multi_pm, name="multi_buffer_view") + if resolved.op is not Ops.UNSHARD: return None + if (view := _make_buffer_view(resolved.src[0])) is None: return None + return view.reshape(resolved.src[0].shape).unshard(resolved.arg, resolved.src[1:]).contiguous(tag=c.tag) + + return None + +def _precompiled_output_redirect(s:UOp, t:UOp) -> UOp|None: + # how output s lands in the caller's buffer t, or None if it must be copied into t + # materialize straight into t + if s.op is Ops.CONTIGUOUS: return t.after(t.store(s.src[0])) + # rebind output storage to t + if s.op in {Ops.BUFFER, Ops.UNSHARD} and s.has_buffer_identity(): return t + return None + +def transform_precompiled_call(c:UOp) -> UOp|None: + if not c.arg.precompile: return None + assert c.src[0].op is Ops.TUPLE, f"expected TUPLE body for precompiled FUNCTION, got {c.src[0].op}" + input_buffers = tuple(x.contiguous() if x.op not in {Ops.AFTER, Ops.BIND} else x for x in c.src[1:]) + + # add the outputs to the call + srcs = c.src[0].src + resolved = [c.gettuple(i) for i in range(len(srcs))] + outs = tuple(r.empty_like() for r in resolved) + targets = [o.param_like(len(c.src)-1+i).shrink_to(s.shape) for i,(o,s) in enumerate(zip(outs, srcs))] + + subs:dict[UOp, UOp] = {} + items:list[UOp] = [] + for s, t in zip(srcs, targets): + after_deps:list[UOp] = [] + while s.op is Ops.AFTER: + after_deps.extend(s.src[1:]) + s = s.src[0] + if (placed := _precompiled_output_redirect(s, t)) is not None and s not in subs: + subs[s] = placed + items.append(s.after(*after_deps) if after_deps else s) + else: + items.append(t.after(t.store(s.after(*after_deps)))) + fxn = UOp.sink(*(x.substitute(subs) for x in items)) + + # body switches from TUPLE to SINK, so the node becomes an opaque CALL (not FUNCTION) + new_call = UOp(Ops.CALL, src=(fxn, *input_buffers, *outs), arg=c.arg) + rets = tuple(o.after(new_call) for o in outs) + + # if the CALL has symbolic shapes, shrink the max-sized output to the actual symbolic shape + # NOTE: must use resolved shapes from the FUNCTION (which substitutes PARAMs with external args), not raw body shapes + rets = tuple(r.shrink_to(rs.shape) for r,rs in zip(rets, resolved)) + + return UOp.maketuple(*rets) + +# NOTE: adding rules to here is bad. these all need to run before the schedule cache +pm_early_transform_tensor_graph = PatternMatcher([ + # transform precompiled FUNCTIONs into CALLs (body becomes SINK with stores) + (UPat(Ops.FUNCTION, name="c"), transform_precompiled_call), + + # resolve TUPLE+GETTUPLE (for precompiled calls) + (UPat(Ops.GETTUPLE, src=(UPat(Ops.TUPLE, name="t"),), name="g"), lambda g,t: t.src[g.arg]), + + # fold MOPS+BITCAST over BUFFER/SLICE into SLICE when movement ops collapse to contiguous range + (UPat((Ops.BITCAST, Ops.COPY, Ops.CONTIGUOUS), src=(UPat(GroupOp.Movement|{Ops.BUFFER}, name="src"),), name="c"), contiguous_mops_to_view), + + # remove contiguous on movement ops before a copy on disk + (UPat(GroupOp.Movement-{Ops.SHRINK, Ops.RESHAPE}, name="x").f(Ops.CONTIGUOUS).f(Ops.COPY, name="copy"), lambda x,copy: + copy.replace(src=(x,), tag=None) if isinstance(x.device, str) and x.device.startswith("DISK") else None), + # push copy past movement ops to disk + (UPat(GroupOp.Movement-{Ops.SHRINK, Ops.RESHAPE}, name="x").f(Ops.COPY, name="copy"), lambda x,copy: + x.replace(src=(copy.replace(src=(x.src[0],), tag=None),)+x.src[1:]) \ + if isinstance(x.device, str) and x.device.startswith("DISK") else None), + + # add CONTIGUOUS to tagged UOps + (UPat(GroupOp.All-{Ops.CONTIGUOUS, Ops.AFTER, Ops.STORE}, name="x"), + lambda x: None if x.tag is None else x.rtag(None).contiguous(tag=x.tag) if x.tag else x.replace(tag=None)), + # remove extra CONTIGUOUS on AFTER (only when target is contiguous) + (UPat(Ops.CONTIGUOUS, src=(UPat(Ops.AFTER, name="a"),), name="c"), + lambda a,c: a.replace(tag=(a.tag or ())+(c.tag or ())) if a.src[0].has_buffer_identity() else None), + # replace AFTER+STORE with CONTIGUOUS when target is not a buffer + (UPat(Ops.AFTER, src=(UPat(), UPat(Ops.STORE, src=(UPat(), UPat(name="src")))), name="u"), replace_store_after_with_contig), + # replace CONTIGUOUS with STORE+AFTER + (UPat(Ops.CONTIGUOUS, name="u"), replace_contig_with_store_after), + # remove DETACH/CONTIGUOUS_BACKWARD (allows more contiguous removal) + (UPat((Ops.DETACH, Ops.CONTIGUOUS_BACKWARD), name="x"), lambda x: x.src[0]), +]) + +def finalize_after(ctx:AllocCtx, x:UOp): + # untagged: record as an assign for the call body + if x.tag is None: + ctx.assigns.append(x) + return None + # tagged: untag and map each original pre-rewrite UOp to the stripped buffer; the untagged result is reprocessed as untagged + ret = x.replace(tag=None) + replace_uop = ret + # then, add views back + views:list[UOp] = [] + while replace_uop.op in GroupOp.Movement|{Ops.UNSHARD, Ops.BITCAST, Ops.AFTER}: + if replace_uop.op is not Ops.AFTER: views.append(replace_uop) + replace_uop = replace_uop.src[0] + for v in reversed(views): replace_uop = v.replace(src=(replace_uop,)+v.src[1:]) + for t in x.tag: + original_uop: UOp = ctx.uop_list[t] + ctx.buffer_map[original_uop] = replace_uop.shrink_to(original_uop.shape) + return ret + +def replace_input_buffer(ctx:AllocCtx, b:UOp): + ctx.replacements.append(b) + if b.op is Ops.BIND: return b.param_like(len(ctx.replacements)-1) + return UOp.param(len(ctx.replacements)-1, b.dtype, b.shape, b.device, + addrspace=b.addrspace if b.addrspace is not None else AddrSpace.GLOBAL) + +pm_finalize_call = PatternMatcher([ + (UPat(Ops.AFTER, name="x"), finalize_after), + (UPat(Ops.COPY, name="x"), lambda ctx,x: ctx.assigns.append(x) if isinstance(x.device, str) and x.device.startswith(("DISK", "TINYFS")) else None), +]) + +pm_replace_buf = PatternMatcher([ + # replace BUFFER with PARAM for cache key normalization + (UPat(Ops.BUFFER, src=(UPat(),), name="b"), lambda ctx,b: + replace_input_buffer(ctx, b) if isinstance(b.arg, ParamArg) and b.addrspace is AddrSpace.GLOBAL else None), + # replace SLICE with PARAM. this rewrite is bottom up so BUFFERs we don't need won't be in the input + (UPat(Ops.SLICE, src=(UPat(Ops.BUFFER), UPat(Ops.CONST, dtype=dtypes.weakint)), name="b"), replace_input_buffer), + # strip value from BIND for cache key normalization, so different values hit same cache + (UPat(Ops.BIND, src=(UPat(Ops.PARAM), UPat(Ops.CONST)), name="b"), replace_input_buffer), +]) + +@rewrite_group(lambda _,ret: f"Callify {pluralize('Buffer', len(ret[1]))}") +def transform_to_call(big_sink:UOp) -> tuple[UOp, dict[UOp, UOp]]: + if VIZ: graph_rewrite(big_sink, PatternMatcher([]), name="View Tensor Graph") + # uop list is a list in the original_sink graph and we can map to the tags later + # same predicate as Tensor.realize + ctx = AllocCtx(bases={base for x in big_sink.src if not (base:=x.base).is_virtual and not base.has_buffer_identity() + and base.op is not Ops.AFTER and base.addrspace is not AddrSpace.ALU}) + + # this rewrite is "read-only", it adds simple things to buffer_map and may sink things on big_sink, bottom_up + # this is the only one where we have to be careful to not break the tensor graph + big_sink = graph_rewrite(big_sink, add_tags, ctx=ctx, bottom_up=True, name="number the uops") + + # here we can break the tensor graph. this is the only place you need to maintain numbered tags + big_sink = graph_rewrite(big_sink, pm_early_transform_tensor_graph, name="early transform tensor graph") + + # here we construct the final buffer_map: as-built nodes -> their final storage. values are never keys + graph_rewrite(big_sink, pm_finalize_call, ctx=ctx, name="finalize call") + ret = graph_rewrite(UOp.sink(*ctx.assigns), pm_replace_buf, ctx=ctx, bottom_up=True, name="replace bufs").call(*ctx.replacements) + assert not any(x in ctx.buffer_map for x in ctx.buffer_map.values()) + if VIZ: graph_rewrite(ret, PatternMatcher([]), name="View Call") + return ret, ctx.buffer_map + +# *** all in scope Tensors are here. this gets relevant UOps *** + +all_tensors: dict[weakref.ref[Tensor], None] = {} +def _apply_map_to_tensors(applied_map:dict[UOp, UOp], name:str) -> None: + with cpu_profile(TracingKey(name), "TINY"): + # get tensors in scope + in_scope: dict[UOp, bool] = {} + def visitor(node: UOp) -> bool: return True if node in applied_map else any(in_scope.get(s, False) for s in node.src) + scope_tensors: list[Tensor] = [t for tref in list(all_tensors) if (t:=tref()) is not None and t.uop.topovisit(visitor, in_scope)] + + # get all Tensors and apply the map. always walk: replace exactly the nodes the map names, values are final + sink = UOp.sink(*[t.uop for t in scope_tensors]) + new_sink = sink.substitute(applied_map, name=f"substitute {name}", walk=True) + + # set the relevant uop to the realized UOps + for t,s,ns in zip(scope_tensors, sink.src, new_sink.src): + if s is ns: continue + t.uop = ns + +# **** Tensor helper functions **** + +def is_numpy_ndarray(x) -> "TypeGuard[numpy.ndarray]": return str(type(x)) == "" + +def _fromnp(x: 'numpy.ndarray') -> UOp: + ret = UOp.new_buffer("NPY", x.size, _from_np_dtype(x.dtype)) + # fake realize + ret.buffer.allocate(x) + return ret.reshape(x.shape) + +class Tensor(RandMixin): + """ + A `Tensor` is a multi-dimensional matrix containing elements of a single data type. + + ```python exec="true" session="tensor" + from tinygrad import Tensor, dtypes, nn, Context + import numpy as np + import math + np.set_printoptions(precision=4) + ``` + """ + __slots__ = "uop", "is_param", "grad" + + def __init__(self, data:ConstType|bytes|list|tuple|UOp|'numpy.ndarray'|pathlib.Path|None, + device:str|tuple|list|None=None, dtype:DTypeLike|None=None): + if device is None: + if isinstance(data, pathlib.Path): device = f"DISK:{data.resolve()}" # keep it on the disk if device is None + elif isinstance(data, UOp): device = data.device + _dtype:DType|None = to_dtype(dtype) if dtype is not None else None + _device:str|tuple[str, ...] = canonicalize_device(device) + del device, dtype + + # tensors can have gradients if you have called .backward + self.grad:Tensor|None = None + + self.is_param:bool = True + + # create a UOp from the different types of inputs + if data is None: + data = UOp.const(0.0, _dtype) + elif isinstance(data, get_args(ConstType)): + data = UOp.const(data, _dtype) + elif is_numpy_ndarray(data) and data.shape == (): + data = UOp.const(data.item(), _dtype or _from_np_dtype(data.dtype)) + elif not isinstance(data, UOp): + if _dtype in dtypes.weaks: raise RuntimeError(f"cannot create storage for weak dtype {_dtype}") + if isinstance(data, bytes): + data = UOp._frompy(data, _dtype or dtypes.uint8, _device) + elif isinstance(data, (list, tuple)): + data = UOp._frompy(data, _dtype or dtypes.from_py(data), _device) + elif is_numpy_ndarray(data): + data = _fromnp(data.astype(npdtype) if _dtype is not None and (npdtype:=_to_np_dtype(_dtype)) is not None else data) + elif isinstance(data, pathlib.Path): + _dtype = _dtype or dtypes.uint8 + data = UOp.new_buffer(f"DISK:{data.resolve()}", data.stat().st_size // _dtype.itemsize, _dtype) + + # by this point, it has to be a UOp + if not isinstance(data, UOp): raise RuntimeError(f"can't create Tensor from {data!r} with type {type(data)}") + + # data might be on a different device + self.uop:UOp = data if data.device is None or data.device == _device else data.copy_to_device(_device) + # cast on the target device, the source may not hold the dtype (numpy has no fp8/bfloat16) or be able to compute it (DISK) + if _dtype is not None: self.uop = self.uop.cast(_dtype) + + # add to all_tensors after construction succeeds + all_tensors[weakref.ref(self)] = None + + @suppress_finalizing + def __del__(self): all_tensors.pop(weakref.ref(self), None) + + def _apply_uop(self, fxn:Callable[..., UOp], *x:Tensor, **kwargs) -> Tensor: + srcs = (self,)+x + new_uop: UOp = fxn(*[t.uop for t in srcs], **kwargs) + if TRACEMETA >= 1 and (metadata:=_METADATA.get()) is not None: all_metadata[new_uop] = (metadata,) + # directly create the Tensor + ret = Tensor.__new__(Tensor) + ret.uop, ret.grad, ret.is_param = new_uop, None, True + # add to all_tensors after construction succeeds + all_tensors[weakref.ref(ret)] = None + return ret + + # alu, _uop, _wrap_uop and const are used by the mixins + def alu(self, op: Ops, *src: Tensor) -> Tensor: return self._apply_uop(lambda *u: u[0].alu(op, *u[1:]), *src) + @property + def _uop(self) -> UOp: return self.uop + @classmethod + def _wrap_uop(cls, u:UOp) -> Tensor: return cls(u) + @staticmethod + def const(b:ConstLike, dtype:DType|None=None) -> Tensor: return Tensor(UOp.const(b, dtype)) + + def is_param_(self, is_param:bool=True) -> Tensor: + self.is_param = is_param + return self + + def __repr__(self): + ld = self.uop + ld_repr = f"" + return f"" + + # Python has a non moving GC, so this should be okay + def __hash__(self): return id(self) + + def __bool__(self): raise TypeError("__bool__ on Tensor is not defined") + + def __len__(self): + if not self.shape: raise TypeError("len() of a 0-d tensor") + return self.shape[0] + + @property + def device(self) -> str|tuple[str, ...]|None: return self.uop.device + + @property + def shape(self) -> tuple[sint, ...]: return self.uop.shape + + @property + def dtype(self) -> DType: return self.uop.dtype + + # ***** data handlers **** + + def as_param(self, slot:int): + return Tensor(UOp.param(slot, self.dtype, self.uop.shard_shape, self.device, axis=self.uop.axis)) + + def call(self, *lst:Tensor, fxn:Tensor|UOp, grad_fxn:Callable|None=None) -> Tensor: + fret = fxn._uop.call(*[t.uop for t in (self,)+lst], grad_fxn=grad_fxn) + return Tensor(fret.gettuple(0)) + + def custom_kernel(self, *lst:Tensor, fxn:Callable, grad_fxn:Callable|None=None) -> list[Tensor]: + """ + Call into a custom kernel written in UOps. Returns the Tensors after the Kernel has been applied. + + This API is alpha and may change. + """ + return [Tensor(u) for u in UOp.custom_kernel(*[t.uop for t in (self,)+lst], fxn=fxn, grad_fxn=grad_fxn)] + + def callify(self, *lst:Tensor) -> Tensor: + big_sink = UOp.sink(*[x.uop for x in (self,)+lst]) + big_sink, buffer_map = transform_to_call(big_sink) + _apply_map_to_tensors({x:y.after(big_sink) for x,y in buffer_map.items()}, name="callify") + return self + + def linear_with_vars(self, *lst:Tensor) -> tuple[UOp, dict[str, int]]: + """Creates the LINEAR UOp needed to realize these Tensor(s), with Variables.""" + # weakness ends where storage begins + if any(t.dtype in dtypes.weaks and t.uop.device is not None for t in (self,)+lst): + raise RuntimeError("cannot realize a weak dtype; cast to a concrete dtype first") + big_sink, becomes_map = transform_to_call(UOp.sink(*[x.uop for x in (self,)+lst])) + _apply_map_to_tensors(becomes_map, name="buffers") + return create_linear_with_vars(big_sink) + + def schedule_linear(self, *lst:Tensor) -> UOp: + """Creates the schedule needed to realize these Tensor(s).""" + linear, var_vals = self.linear_with_vars(*lst) + assert len(var_vals) == 0 + return linear + + @disable_gc() + def realize(self, *lst:Tensor, do_update_stats=True) -> Tensor: + """Triggers the computation needed to create these Tensor(s).""" + to_realize = [x for x in (self,)+lst if not x.uop.is_virtual and not x.uop.has_buffer_identity()] + if len(to_realize): + run_linear(*Tensor.linear_with_vars(*to_realize), update_stats=do_update_stats) + return self + + def replace(self, x:Tensor) -> Tensor: + """ + Replaces the data of this tensor with the data of another tensor. Only the shape of the tensors must match. + """ + # used for replacing a Tensor with a new version of it (potentially with a different device and dtype) + assert self.shape == x.shape, f"replace shape mismatch {self.shape} != {x.shape}" + self.uop = x.uop + return self + + def assign(self, x:Tensor|PyConst|list|tuple) -> Tensor: + if self.dtype in dtypes.weaks: self.uop = self.uop.clone() + is_disk = isinstance(self.device, str) and self.device.startswith(("DISK", "TINYFS")) + if not isinstance(x, Tensor): x = Tensor(x, device="CPU" if is_disk else self.device, dtype=self.dtype) + if self.uop is x.uop: return self # a self assign is a NOOP + # broadcast x (shape only, dtype must match) + x = x._broadcast_to(self.shape) + if x.dtype in dtypes.weaks: x = x.cast(least_upper_dtype(self.dtype, x.dtype)) + if x.dtype != self.dtype: raise RuntimeError(f"assign dtype mismatch {self.dtype} != {x.dtype}") + if not is_disk and x.uop.device is not None and self.device is not None and self.device != x.device: + raise RuntimeError(f"assign device mismatch {self.device} != {x.device}") + if isinstance(self.device, tuple) and x.uop.device is not None and self.uop.axis != x.uop.axis: + raise RuntimeError(f"multi axis mismatch {self.uop.axis} != {x.uop.axis}") + + # TODO: this is a hack for writing to DISK. remove with working assign + if is_disk: + (b:=self._buffer()).copy_from(Buffer("PYTHON", b.size, b.dtype, opaque=x._data())) + return self + # STORE+AFTER: STORE is the write effect (void), AFTER wraps the view for correct shape/ranging + assign = self.uop.after(self.uop.store(x.uop)) + if (base := self.uop.base).op in {Ops.BUFFER, Ops.AFTER} and self.uop is not base and not self.uop.has_buffer_identity(): + # view assign: replace at the buffer-identity level (e.g. RESHAPE(BUFFER)) so @function's substitution catches it + ib = self.uop + while not ib.has_buffer_identity() and ib is not base: ib = ib.src[0] + assigned_ib = ib.after(assign) + _apply_map_to_tensors({ib: assigned_ib}, name="Embed View Assign") + else: + # simple assign + self.uop = assign + return self + + def _buffer(self) -> Buffer: + from tinygrad.engine.realize import capturing + if capturing and not getenv("UNSAFE_ALLOW_JIT_BUFFER"): + from tinygrad.engine.jit import JitError + raise JitError("cannot access tensor data during JIT capture, the value will be baked in") + x = self.contiguous() + if self.uop.device is None or isinstance(self.device, tuple): x = x.clone("CPU") + return cast(Buffer, x.realize().uop.buffer).ensure_allocated() + + def _data(self) -> memoryview: return self._buffer().as_memoryview() + + def data(self) -> memoryview: + """ + Returns the data of this tensor as a memoryview. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3, 4]) + print(np.frombuffer(t.data(), dtype=np.int32)) + ``` + """ + if self.dtype in dtypes.weaks: return self.cast(strong_dtype(self.dtype)).data() + if 0 in self.shape: return memoryview(bytearray(0)).cast(self.dtype.fmt) # type: ignore[arg-type,return-value] + assert all_int(self.shape), f"no data if shape is symbolic, {self.shape=}" + buf = self._buffer() + fmt = buf.dtype.fmt + assert fmt is not None, f"no fmt dtype for {buf.dtype}" + assert fmt != "e" or sys.version_info >= (3, 12) + return buf.as_memoryview().cast(fmt, self.shape) # type: ignore[arg-type,return-value] + + # NOTE: list[Any] because return type is recursive (list[list[...]] for higher dimensions) + def tolist(self) -> PyConst|list[Any]: + """ + Returns the value of this tensor as a nested list. + Returns single value for const tensor. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3, 4]) + print(t.tolist()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor(5) + print(t.tolist()) + ``` + """ + # TODO: remove half once minimum python supports it + if self.dtype in (dtypes.half, dtypes.bfloat16, *dtypes.fp8s): return self.cast(dtypes.float32).tolist() + if 0 in self.shape: + assert all_int(self.shape), f"no data if shape is symbolic, {self.shape=}" + def _tolist(shape:tuple[int, ...]): return [_tolist(shape[1:]) for _ in range(shape[0])] + return _tolist(self.shape) + return self.data().tolist() + + def numpy(self) -> 'numpy.ndarray': + """ + Returns the value of this tensor as a `numpy.ndarray`. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1, 2, 3, 4]) + print(repr(t.numpy())) + ``` + """ + if self.dtype in dtypes.weaks: return self.cast(strong_dtype(self.dtype)).numpy() + assert all_int(self.shape), f"no data if shape is symbolic, {self.shape=}" + import numpy as np + if self.dtype in { dtypes.bfloat16, *dtypes.fp8s }: return self.float().numpy() + if 0 in self.shape: return np.empty(self.shape, dtype=_to_np_dtype(self.dtype)) + return self._buffer().numpy().reshape(self.shape) + + def clone(self, device:str|tuple[str, ...]|None=None) -> Tensor: + """ + Creates a clone of this tensor allocating a separate buffer for the data. + If `device` is specified, the clone is placed on that device. + """ + ret = Tensor(self.uop.clone(device=device)) + if self.grad is not None: ret.grad = self.grad.clone(device=device) + return ret.is_param_(self.is_param) + + def to(self, device:str|tuple[str, ...]|None) -> Tensor: + """ + Moves the tensor to the given device. + """ + if self.uop.device is None: return self + if (device:=canonicalize_device(device)) == self.device: return self + ret = Tensor(self.uop.copy_to_device(device)) + if self.grad is not None: ret.grad = self.grad.to(device) + return ret.is_param_(self.is_param) + + def to_(self, device:str|tuple[str, ...]|None) -> Tensor: + """ + Moves the tensor to the given device in place. + """ + real = self.to(device) + if self.grad is not None and real.grad is not None: self.grad.replace(real.grad) + return self.replace(real) + + def shard(self, devices:tuple[str, ...], axis:int|None=None) -> Tensor: + """ + Shards the tensor across the given devices. Optionally specify which axis to shard on. + + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor.empty(2, 4) + print(t.shard((t.device, t.device), axis=1).uop) + ``` + """ + if self.uop.device is None: return self + if not isinstance(self.device, str): raise RuntimeError("can't shard a multi-device tensor") + if len(devices) == 1: return self.to(devices[0]) + devices = cast(tuple[str, ...], canonicalize_device(devices)) + uop = self.uop.shard(devices, None if axis is None else self._resolve_dim(axis)) + return Tensor(uop).is_param_(self.is_param) + + def shard_(self, devices:tuple[str, ...], axis:int|None=None) -> Tensor: + """ + Shards the tensor across the given devices in place. + """ + return self.replace(self.shard(devices, axis)) + + def shard_like(self, y:Tensor) -> Tensor: + """ + Shards the tensor the same way as `y` (same devices and axis). + """ + if y.device is None: return self + if isinstance(y.device, str): return self.to(y.device) + return self if isinstance(self.device, tuple) and (y.device, y.uop.axis) == (self.device, self.uop.axis) else self.shard(y.device, y.uop.axis) + + # ***** creation entrypoint ***** + + @staticmethod + def from_blob(ptr:int, shape:tuple[int, ...], **kwargs) -> Tensor: + """ + Exposes the pointer as a Tensor without taking ownership of the original data. + The pointer must remain valid for the entire lifetime of the created Tensor. + + You can pass in `dtype` and `device` keyword arguments to control the data type and device of the tensor. + Additionally, all other keyword arguments are passed to the constructor of the tensor. + """ + r = Tensor.empty(*shape, **kwargs) + assert isinstance(r.device, str) + cast(Buffer, r.uop.buffer).allocate(external_ptr=ptr) + return r + + @staticmethod + def from_url(url:str, gunzip:bool=False, **kwargs) -> Tensor: + """ + Creates a Tensor from a URL. + + This is the preferred way to access Internet resources. + It currently returns a DISK Tensor, but in the future it may return an HTTP Tensor. + This also will soon become lazy (when possible) and not print progress without DEBUG. + + The `gunzip` flag will gzip extract the resource and return an extracted Tensor. + """ + return Tensor(fetch(url, gunzip=gunzip), **kwargs) + + _seed: int = int(time.time()) + _device_seeds: dict[str, Tensor] = {} + _device_rng_counters: dict[str, Tensor] = {} + @staticmethod + def manual_seed(seed=0) -> None: + """ + Sets the seed for random operations. + + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) + print(Tensor.rand(5).numpy()) + print(Tensor.rand(5).numpy()) + ``` + ```python exec="true" source="above" session="tensor" result="python" + Tensor.manual_seed(42) # reset to the same seed + print(Tensor.rand(5).numpy()) + print(Tensor.rand(5).numpy()) + ``` + """ + Tensor._seed, Tensor._device_seeds, Tensor._device_rng_counters = seed, {}, {} + + @staticmethod + def _next_counter(device:str, num:int) -> tuple[Tensor, Tensor]: + if device not in Tensor._device_seeds: + seed = [int.from_bytes(hashlib.sha256(len(Tensor._device_seeds).to_bytes(4, "big")).digest(), "big"), Tensor._seed] + Tensor._device_seeds[device] = Tensor(seed, device=device, dtype=dtypes.uint32) + Tensor._device_rng_counters[device] = Tensor([0, 0], device=device, dtype=dtypes.uint32) + counter = Tensor._device_rng_counters[device] + new_low = counter[0:1] + (num & 0xffffffff) + new_high = counter[1:2] + (num >> 32) + (new_low < counter[0]) + counter.assign(new_low.cat(new_high)) + low = counter[0:1] - (num & 0xffffffff) + high = counter[1:2] - (num >> 32) - (counter[0] < (num & 0xffffffff)) + return Tensor._device_seeds[device], low.cat(high) + + # ***** toposort and backward pass ***** + + def backward(self, gradient:Tensor|None=None) -> Tensor: + """ + Propagates the gradient of a tensor backwards through the computation graph. + If the 'gradient' argument is not provided, the tensor must be a scalar, and the gradient is implicitly set to 1.0. + ```python exec="true" source="above" session="tensor" result="python" + t = Tensor([1.0, 2.0, 3.0, 4.0]) + t.sum().backward() + print(t.grad.numpy()) + ``` + """ + all_uops = self.uop.toposort() + # backward fills .grad for every in-scope non-CONST float tensor + tensors_need_grad: list[Tensor] = [t for tref in all_tensors if (t:=tref()) is not None and \ + t.uop in all_uops and t.is_floating_point() and t.uop.op is not Ops.CONST] + # clear contexts + for t,g in zip(tensors_need_grad, self.gradient(*tensors_need_grad, gradient=gradient)): + assert g.shape == t.shape, f"grad shape must match tensor shape, {g.shape!r} != {t.shape!r}" + if g.device is None and t.device is not None: g = g.clone(device=t.device) + if t.grad is None: t.grad = g + else: t.grad.assign(t.grad + g.to(t.grad.device)) + return self + + # ***** movement ops ***** + + def _mop(self, op:Ops, arg) -> Tensor: return self._apply_uop(UOp._mop, op=op, arg=arg) + def _rop(self, op:Ops, axis:tuple[int, ...]) -> Tensor: return self._apply_uop(UOp._rop, op=op, axis=axis) + + def __setitem__(self, indices, v:Tensor|PyConst|list|tuple) -> None: + if self.dtype in dtypes.weaks: raise RuntimeError("cannot setitem into a weak tensor; it has no storage") + if isinstance(v, Tensor): + if v.dtype in dtypes.weaks: v = v.cast(least_upper_dtype(self.dtype, v.dtype)) + if v.dtype != self.dtype: raise RuntimeError(f"setitem dtype mismatch: {self.dtype=} != {v.dtype=}") + # raise if mutation would diverge from eager (allow only pure views of a realized buffer; exclude +=/-= RHS via v_uop/v_bw) + v_uop, v_bw = (v.uop, v.uop.backward_slice) if isinstance(v, Tensor) else (None, {}) + if self.uop.op_in_backward_slice_with_self(Ops.BUFFER): + shared = self.uop.base if self.uop.base.is_realized else None + if any(self.uop in t.uop.backward_slice_with_self and t.uop.base is not shared for tref in all_tensors + if (t:=tref()) is not None and t is not self and t.uop is not v_uop and t.uop not in v_bw): + raise RuntimeError("can't setitem on a tensor with other uses") + idx = [indices] if (isinstance(indices, list) and all_int(indices)) or not isinstance(indices, (tuple, list)) else list(indices) + is_disk = isinstance(self.device, str) and self.device.startswith("DISK") + advanced = any(isinstance(i, (Tensor, list, tuple)) for i in idx) + realized = is_disk or self.uop.base.op is Ops.BUFFER or self.uop._base_buffer_is_realized() + if (not self.uop.base.is_realized and self.is_floating_point()) or not (advanced or realized): + if not isinstance(v, Tensor): v = Tensor(v, device=self.device, dtype=self.dtype) + # __iadd__/__isub__ creates AFTER(view, STORE(view, computed)); unwrap to get the computed value + if v.uop.op is Ops.AFTER and any(s.op is Ops.STORE for s in v.uop.src[1:]): v = v._apply_uop(lambda x: x.src[1].src[1]) + self.replace(self._getitem(indices, v)) + elif advanced: # advanced setitem + if is_disk: raise RuntimeError("advanced setitem is not supported for DISK tensors") + if not isinstance(v, Tensor): v = Tensor(v, device=self.device, dtype=self.dtype) + self.assign(self._getitem(indices, v)) + else: # basic setitem + view = self[indices] + if isinstance(v, Tensor) and v.uop.op is Ops.AFTER and v.uop in view.uop.base.src: return + view.assign(v) + + def __delitem__(self, indices) -> None: + raise TypeError("Tensor does not support deleting items") + + # ***** op wrappers ***** + + # unlike Tensors, UOps are immutable, so these don't go in mixin + def __iadd__(self, x) -> Tensor: return self.assign(self.add(x)) # type: ignore[misc] + def __isub__(self, x) -> Tensor: return self.assign(self.sub(x)) # type: ignore[misc] + def __imul__(self, x) -> Tensor: return self.assign(self.mul(x)) # type: ignore[misc] + def __itruediv__(self, x) -> Tensor: return self.assign(self.div(x)) # type: ignore[misc] + def __ifloordiv__(self, x) -> Tensor: return self.assign(self.__floordiv__(x)) # type: ignore[misc] + def __ipow__(self, x) -> Tensor: return self.assign(self.pow(x)) # type: ignore[misc] + def __iand__(self, x) -> Tensor: return self.assign(self.bitwise_and(x)) # type: ignore[misc] + def __ior__(self, x) -> Tensor: return self.assign(self.bitwise_or(x)) # type: ignore[misc] + def __ixor__(self, x) -> Tensor: return self.assign(self.bitwise_xor(x)) # type: ignore[misc] + def __ilshift__(self, x) -> Tensor: return self.assign(self.lshift(x)) # type: ignore[misc] + def __irshift__(self, x) -> Tensor: return self.assign(self.rshift(x)) # type: ignore[misc] + def __imatmul__(self, x) -> Tensor: return self.assign(self.matmul(x)) # type: ignore[misc] + + def __eq__(self, x) -> Tensor: return self.eq(x) # type: ignore[override] + + # ***** encoding/decoding ops ***** + + def decode_hevc_frame(self, frame_pos:Variable, shape:tuple[int,...], state:Tensor, ref_frames:list[Tensor]|None=None) -> Tensor: + """ + Creates a Tensor by decoding an HEVC frame chunk. + + You must provide the output shape of the decoded data (`shape`), the HEVC context (`vstate`), and, if required by the chunk, + the reference frames (`ref_frames`). + """ + ref_frames = [x.contiguous() for x in ref_frames or []] + assert frame_pos.op is Ops.BIND, "frame_pos must be a bound Variable" + srcs = (out:=Tensor.empty(*shape, device=self.device, dtype=self.dtype), self.contiguous(), state.contiguous(), *ref_frames) + fn = UOp(Ops.CUSTOM_FUNCTION, src=(frame_pos.src[0], *[UOp.const(s, dtypes.int) for s in shape]), arg="encdec") + return Tensor(out.uop.after(fn.call(*[s.uop for s in srcs], frame_pos))) + +P = ParamSpec("P") +T = TypeVar("T") + +# this tracks the tensor.py METADATA, contextvars.ContextVar was switched to this due to thread safety issues +class _ContextVar(Generic[T]): + def __init__(self, default:T): self.state:T = default + def get(self) -> T: return self.state + def set(self, x:T) -> T: + ret, self.state = self.state, x + return ret +_METADATA: _ContextVar[Metadata|None] = _ContextVar(default=None) + +def _metadata_wrapper(fn: Callable[P, T]) -> Callable[P, T]: + def _wrapper(*args: P.args, **kwargs: P.kwargs) -> T: + if TRACEMETA < 1 or _METADATA.get() is not None: return fn(*args, **kwargs) + token = _METADATA.set(Metadata(name=fn.__name__)) + with cpu_profile(TracingKey(fn.__name__), "USER"): + ret = fn(*args, **kwargs) + _METADATA.set(token) + return ret + return _wrapper + +if TRACEMETA >= 1: + for name, fn in inspect.getmembers(Tensor, inspect.isfunction): + if name in ["__class__", "__del__", "__init__", "__new__", "__repr__", "backward", "sequential", "gradient"]: continue + setattr(Tensor, name, functools.wraps(fn)(_metadata_wrapper(fn))) diff --git a/artifacts/package_runtime/tinygrad/uop/__init__.py b/artifacts/package_runtime/tinygrad/uop/__init__.py new file mode 100644 index 000000000..e39fc8b87 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/__init__.py @@ -0,0 +1,140 @@ +# flake8: noqa: E702 +# allow semicolons to put multiple ops on one line +from enum import auto, IntEnum, Enum + +# wrapper around IntEnum that preserves Enum.__str__ and makes auto() unique across all FastEnum subclasses +class FastEnum(IntEnum): + def __str__(self): return Enum.__str__(self) + def __repr__(x): return str(x) + @staticmethod + def _generate_next_value_(_, __, ___, last_values): return 1 + max([0, *last_values, *[max(c) for c in FastEnum.__subclasses__()]]) + +# the order of these Ops controls the order of the toposort +class Ops(FastEnum): + # ** 1 -- defines/special ** + + # BIND pairs a symbolic PARAM with a concrete value + BIND = auto() + + # this is a RANGE for GPU dimensions, similar to symbolic shapes but not exactly + SPECIAL = auto() + + # BUFFER allocates global/local/register storage depending on its addrspace + BUFFER = auto() + + # ** 2 -- non op uops ** + + # uops that aren't rendered + NOOP = auto(); REWRITE_ERROR = auto() + # FUNCTION has a TUPLE body and is gradient-able; CALL is an opaque kernel invocation + PARAM = auto(); FUNCTION = auto(); CALL = auto() + + # renderer + # LINEAR is a list of UOps, SOURCE has a str arg that's human readable, BINARY has bytes arg that's compiled + PROGRAM = auto(); LINEAR = auto(); SOURCE = auto(); BINARY = auto() + + # AFTER passes src[0] through and promises in the toposort that any consumers of the AFTER run after src[1:] + # GROUP is a NOOP that just merges things together + SINK = auto(); AFTER = auto(); GROUP = auto() + + # vector creation / item selection + STACK = auto() + + # tuple/gettuple for function with multiple returns + TUPLE = auto(); GETTUPLE = auto() + + # hcq specific + GETADDR = auto() + + # ** 3 -- load/store ** + + # INDEX is a BinaryOp similar to ADD, but it operates on pointers + INDEX = auto(); SHRINK = auto() + + # load/store before math + LOAD = auto(); STORE = auto() + + # ** 4 -- math ** + + # tensor core math op, not elementwise + WMMA = auto() + + # UnaryOps + CAST = auto(); BITCAST = auto(); EXP2 = auto(); LOG2 = auto(); SIN = auto() + SQRT = auto(); RECIPROCAL = auto(); NEG = auto(); TRUNC = auto() + + # BinaryOps + ADD = auto(); MUL = auto(); SHL = auto(); SHR = auto(); CDIV = auto(); MAX = auto(); CMOD = auto() + CMPLT = auto(); CMPNE = auto(); CMPEQ = auto() + XOR = auto(); OR = auto(); AND = auto() + THREEFRY = auto(); SUB = auto(); FDIV = auto(); POW = auto() + FLOORDIV = auto(); FLOORMOD = auto() + + # TernaryOps + WHERE = auto(); MULACC = auto() + + # ** 5 -- control flow / consts / custom ** + + # control flow ops + BARRIER = auto(); RANGE = auto(); IF = auto(); END = auto(); ENDIF = auto(); WAIT = auto() + + # const. + CONST = auto() + + # CUSTOM/CUSTOMI are used to output strings into codegen. the I makes the string inline + CUSTOM = auto(); CUSTOMI = auto() + + # INS is a machine instruction + INS = auto() + + # ** 6 -- ops that don't exist in programs ** + + # ops that adjust the behavior of the scheduler + CONTIGUOUS = auto(); CONTIGUOUS_BACKWARD = auto(); DETACH = auto() + + # buffer ops + STAGE = auto(); COPY = auto(); SLICE = auto(); MSELECT = auto(); MSTACK = auto(); CUSTOM_FUNCTION = auto() + + # the core 6 movement ops! these only exist in the tensor graph + RESHAPE = auto(); PERMUTE = auto(); EXPAND = auto(); PAD = auto(); FLIP = auto() + UNSHARD = auto() # UNSHARD is really a movement op + + # reduce + REDUCE = auto(); ALLREDUCE = auto() + + # ** 7 -- pattern compiler IR (used in upat.py) ** + # PYLITERAL carries a Python literal as an arg for CUSTOM predicates + PYLITERAL = auto() + +class GroupOp: + Unary = {Ops.EXP2, Ops.LOG2, Ops.SIN, Ops.SQRT, Ops.RECIPROCAL, Ops.NEG, Ops.TRUNC} + Binary = {Ops.ADD, Ops.MUL, Ops.CDIV, Ops.MAX, Ops.CMOD, Ops.CMPLT, Ops.CMPNE, Ops.CMPEQ, + Ops.XOR, Ops.SHL, Ops.SHR, Ops.OR, Ops.AND, Ops.THREEFRY, Ops.SUB, Ops.FDIV, Ops.POW, Ops.FLOORDIV, Ops.FLOORMOD} + Ternary = {Ops.WHERE, Ops.MULACC} + ALU = set.union(Unary, Binary, Ternary) + Broadcastable = set.union(Binary, Ternary) + + # TODO: is BITCAST always Elementwise if it's shape changing? + Elementwise = set.union(ALU, {Ops.CAST, Ops.BITCAST}) + + Defines = {Ops.PARAM, Ops.BUFFER} + + Irreducible = {Ops.CONST, Ops.SPECIAL, Ops.RANGE, Ops.PARAM, Ops.GETADDR} + Movement = {Ops.RESHAPE, Ops.EXPAND, Ops.PERMUTE, Ops.PAD, Ops.SHRINK, Ops.FLIP} + + # BinaryOps that can be flipped + Commutative = {Ops.ADD, Ops.MUL, Ops.MAX, Ops.CMPNE, Ops.CMPEQ, Ops.XOR, Ops.AND, Ops.OR} + + # BinaryOps where f(f(a,b),c) = f(a,f(b,c)) + Associative = {Ops.ADD, Ops.MUL, Ops.AND, Ops.OR, Ops.MAX} + + # BinaryOps that satisfy f(x,x)=x see https://en.wikipedia.org/wiki/Idempotence + Idempotent = {Ops.OR, Ops.AND, Ops.MAX} + + # ALU ops valid as the reduce op in REDUCE/ALLREDUCE arg + Reduce = {Ops.ADD, Ops.MUL, Ops.MAX} + + # These can change the dtype to bool + Comparison = {Ops.CMPLT, Ops.CMPNE, Ops.CMPEQ} + + All = set(Ops) diff --git a/artifacts/package_runtime/tinygrad/uop/divandmod.py b/artifacts/package_runtime/tinygrad/uop/divandmod.py new file mode 100644 index 000000000..03dbd1e13 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/divandmod.py @@ -0,0 +1,109 @@ +import functools, itertools, math +from tinygrad.uop.ops import PatternMatcher, UPat, Ops, UOp +from tinygrad.dtype import dtypes +from tinygrad.helpers import unwrap + +# NOTE: this cache is only on index UOps +@functools.cache +def fold_divmod_general(d: UOp) -> UOp|None: + x, y = d.src + + if y.vmin==y.vmax==0: raise ZeroDivisionError(f"{'Division' if d.op is Ops.FLOORDIV else 'Mod'} by zero trying to rewrite {x.alu(d.op, y)}") + # x//y is constant + if (xdiv:=x//y).vmin == xdiv.vmax: return x - xdiv.vmin*y if d.op is Ops.FLOORMOD else xdiv.const_like(xdiv.vmin) + # PARAM // c is irreducible + if x.op is Ops.PARAM and y.op is Ops.CONST and x.arg.multiple_of % y.val == 0: return d.const_like(0) if d.op is Ops.FLOORMOD else None + + # split uops for the rest of the processing + x_peeled, const = x.pop_const() + uops_no_const = list(x_peeled.split_uop(Ops.ADD)) + + # ** Constant Denominator Rules ** + # these rules strictly require y to be a scalar constant > 0 + if y.op is Ops.CONST and (c := y.val) > 0: + # nested_div: (x%(k*c))//c -> (x//c)%k (requires k>0); the mod case is handled by remove_nested_mod below + if d.op is Ops.FLOORDIV and x.op is Ops.FLOORMOD and (k := x.src[1].divides(c)) is not None and k > 0: return x.src[0] // y % k + + # remove_nested_mod in sum: (a%4 + b)%2 -> (a+b)%2 + if d.op is Ops.FLOORMOD: + new_xs, changed = [], False + for u in uops_no_const: + if u.op is Ops.FLOORMOD and u.src[1].divides(c) is not None: + u = u.src[0] + changed = True + new_xs.append(u) + if changed: return (UOp.usum(*new_xs) + const) % y + + # Shared decomposition for folding rules + decomp = [(u.divides(f:=u.const_factor()),f) for u in uops_no_const] + terms, factors = zip(*decomp) + + # fold_divmod_congruence: fold if a is congruent to an expression whose range is between 0 and c + # try both signs of the remainder for a lone term (covers a binary numerator that crosses one period) + # or on an exact f%c == c//2 tie; otherwise pick the smaller to keep the product over terms small + rem_choices = [(r, r-c) if (r:=f%c)*2 == c or len(terms)==1 else (min(r, r-c, key=abs),) for f in factors] + for rems in itertools.product(*rem_choices): + if (rem:=sum(r*v for r,v in zip(rems,terms))+const%c).vmin//c==rem.vmax//c: + if d.op is Ops.FLOORMOD: return rem - rem.vmin//c*c + return sum((f-r)//c * v for f,r,v in zip(factors,rems,terms)) + const//c + rem.vmin//c + + # gcd_with_remainder: factor out common gcd from numerator + if (g:=math.gcd(*factors, c)) > 1: + new_x = unwrap(x_peeled.divides(g)).simplify() + (const//g)%(c//g) + if new_x.vmin >= 0: + if d.op is Ops.FLOORMOD: return new_x % (c//g) * g + const%g + return new_x // (c//g) + const//c + + # nest_by_factor: x//c -> (x//f)//(c//f), x%c -> (x//f%(c//f))*f + b where b=x%f + # FLOORDIV identity holds for any sign of x; FLOORMOD reconstruction needs x.vmin>=0 + results = [] + for div in {abs(f) for u, f in zip(uops_no_const, factors) if u.op is not Ops.CONST and 1 < abs(f) < c and (c%f)==0}: + if (newxs := fold_divmod_general(x//div)) is not None: + if d.op is Ops.FLOORDIV: + results.append((len(newxs.backward_slice), newxs // (c // div))) + elif x.vmin >= 0 and newxs.vmin >= 0: + b_parts = [f%div*t for f, t in zip(factors, terms) if f%div] + if const % div: b_parts.append(x.const_like(const % div)) + b = UOp.usum(*b_parts) if b_parts else x.const_like(0) + if 0 <= b.vmin and b.vmax < div: + results.append((len((r:=(newxs % x.ufix(c//div))*div + b).backward_slice), r)) + if results: return min(results, key=lambda r: r[0])[1] + + # ** Variable Denominator / Fallback Rules ** + # These rules apply to variables OR constants that failed the checks above. + # Reconstruct all uops including const for these checks. + all_uops = list(x.split_uop(Ops.ADD)) + + # divide_by_gcd: x//y -> (x//gcd)//(y//gcd) + gcd = UOp.gcd(*all_uops, y).simplify() + if not (gcd.op is Ops.CONST and gcd.val==1): + ret = unwrap(x.divide_exact(gcd)).alu(d.op, unwrap(y.divide_exact(gcd))) + return ret*gcd if d.op is Ops.FLOORMOD else ret + + # factor_remainder: (d*x+y)//d -> x+y//d + if y.vmin<0 or x.vmin<0: return None + quo, rem = [], [] + for u in all_uops: + if (q:=u.divide_exact(y)) is not None: quo.append(q) + elif y.op is Ops.CONST and (c:=u.const_factor())%y.val!=c: + rem.append(u.divides(c)*(c%y.val)) + quo.append(u.divides(c)*(c//y.val) if d.op is Ops.FLOORDIV else u.const_like(0)) + else: rem.append(u) + + if not quo: return None + new_x = sum(rem)+x.const_like(0) + if new_x.vmin<0: return None + return new_x%y if d.op is Ops.FLOORMOD else new_x//y+sum(quo) + +div_and_mod_symbolic = PatternMatcher([ + # ** 1. Fast Inline Rules ** + # (x//c+a)//d -> (x+a*c)//(c*d) for c>0, d>0 + ((UPat.var("x")//UPat.cvar("c") + UPat.cvar("a"))//UPat.cvar("d"), lambda x,c,a,d: (x+a*c)//(c*d) if d.vmin>0 else None), + # (x+c)//d -> (x+c%d)//d + c//d ; (x+c)%d -> (x+c%d)%d (split the multiple of d out of the const, holds for any d!=0) + (UPat((Ops.FLOORDIV, Ops.FLOORMOD), src=(UPat.var("x", dtypes.weakint)+UPat.cvar("c"), UPat.cvar("d")), name="n"), + lambda n,x,c,d: None if d.val==0 or c.val%d.val==c.val else + (x+c.val%d.val)//d + c.val//d.val if n.op is Ops.FLOORDIV else (x+c.val%d.val)%d), + + # ** 2. Slow Rules ** + (UPat((Ops.FLOORDIV, Ops.FLOORMOD), dtypes.weakint, name="d"), lambda d: fold_divmod_general(d)), +]) diff --git a/artifacts/package_runtime/tinygrad/uop/movement.py b/artifacts/package_runtime/tinygrad/uop/movement.py new file mode 100644 index 000000000..295efced0 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/movement.py @@ -0,0 +1,26 @@ +from tinygrad.uop.ops import PatternMatcher, UPat, Ops + +# TODO: pm_mops from rangeify belongs here. this is all pattern matchers that strictly clean up movement ops + +mop_cleanup = PatternMatcher([ + # merge adjacent RESHAPES + (UPat(Ops.RESHAPE, src=(UPat(Ops.RESHAPE, name="x2"), UPat()), name="x"), lambda x,x2: x.replace(src=(x2.src[0], x.src[1]))), + # remove noop RESHAPEs + (UPat(Ops.RESHAPE, src=(UPat(name="x2"), UPat()), name="x"), lambda x,x2: x2 if x2._shape is not None and x2.shape == x.shape else None), + # merge PERMUTEs + (UPat(Ops.PERMUTE, src=(UPat(Ops.PERMUTE, name="x2"),), name="x"), lambda x,x2: x2.replace(arg=tuple(x2.arg[i] for i in x.arg))), + # remove noop PERMUTEs + (UPat(Ops.PERMUTE, name="x"), lambda x: x.src[0] if list(x.arg) == list(range(len(x.arg))) else None), + # STACK on INDEX CONST + (UPat(Ops.STACK, src=UPat(Ops.INDEX, src=(UPat.var("src"), UPat(Ops.CONST))), name="stk"), + lambda src,stk: src if stk.shape == src.shape and list(range(len(stk.src))) == [x.src[1].val for x in stk.src] else None), + # const INDEX into STACK is src + (UPat(Ops.INDEX, src=(UPat(Ops.STACK, name="a"), UPat.cvar("i")), name="idx", allow_any_len=True), + lambda a,i,idx: a.src[i.val] if len(idx.src) <= 2 else a.src[i.val].index(*idx.src[2:])), + # INDEX on INDEX is INDEX + (UPat(Ops.INDEX, src=(UPat(Ops.INDEX, name="idx1", allow_any_len=True),), allow_any_len=True, name="idx2"), + lambda idx1,idx2: idx1.src[0].index(*idx1.src[1:], *idx2.src[1:]) if all(x.shape == () for x in idx1.src[1:]+idx2.src[1:]) else None), + # INDEX on shaped INDEX (TODO: this can be more generic) + (UPat(Ops.INDEX, src=(UPat(Ops.INDEX, src=(UPat.var("buf"), UPat.var("idx1_arg"))),), allow_any_len=True, name="idx2"), + lambda buf,idx1_arg,idx2: buf.index(idx1_arg.index(*idx2.src[1:])) if len(idx1_arg.shape) == len(idx2.src[1:]) else None), +]) diff --git a/artifacts/package_runtime/tinygrad/uop/ops.py b/artifacts/package_runtime/tinygrad/uop/ops.py new file mode 100644 index 000000000..55f39d49a --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/ops.py @@ -0,0 +1,1782 @@ +from __future__ import annotations +from typing import Any, Callable, cast, TYPE_CHECKING, Type, Sequence, Iterable, Final, Iterator +import sys, time, functools, itertools, math, operator, hashlib, os, types, pickle, pathlib, inspect, weakref, collections, struct +from dataclasses import dataclass, replace +from enum import Enum, auto +from tinygrad.uop import Ops, GroupOp +from tinygrad.dtype import ConstType, dtypes, DType, DTypeLike, truncate, least_upper_dtype, least_upper_float, Invalid, AddrSpace, strong_dtype +from tinygrad.dtype import PyConst, InvalidType, weak_dtype, bitcast +from tinygrad.device import Buffer, MultiBuffer, canonicalize_device, TinyELF +from tinygrad.helpers import ContextVar, all_int, prod, getenv, all_same, Context, partition, temp, unwrap, T, argfix, Metadata, flatten, TRACEMETA +from tinygrad.helpers import PROFILE, dedup, cdiv, cmod, floordiv, floormod, diskcache_put, to_function_name, cpu_profile, TracingKey +from tinygrad.helpers import VIZ, SPEC, CAPTURE_PROCESS_REPLAY, DISALLOW_BROADCAST, get_shape, fully_flatten, to_tuple +from tinygrad.helpers import colored, ansilen, printable, Target, is_image_shape +if TYPE_CHECKING: + from tinygrad.renderer import Estimates + +class AxisType(Enum): + def __repr__(self): return str(self) + DEVICE = auto(); GLOBAL = auto(); WARP = auto(); LOCAL = auto(); WEAK = auto(); GROUP_REDUCE = auto(); REDUCE = auto(); UPCAST = auto() # noqa: E702 + UNROLL = auto(); THREAD = auto(); PLACEHOLDER = auto(); LOOP = auto() # noqa: E702 + +@dataclass(frozen=True, order=True) +class ParamArg: + slot: int + dtype: DType + vmin_vmax: tuple[PyConst, PyConst]|None = None + multiple_of: int|None = None + name: str|None = None + addrspace: AddrSpace|None = AddrSpace.GLOBAL + axis: int|None = None + device: str|tuple[str, ...]|None = None + volatile: bool = False + def __repr__(self): + fields = (("vmin_vmax", None), ("multiple_of", None), ("name", None), ("addrspace", AddrSpace.GLOBAL), ("axis", None), ("device", None), + ("volatile", False)) + args = [repr(self.slot), repr(self.dtype)] + [f"{k}={v!r}" for k,default in fields if (v:=getattr(self, k)) != default] + return f"ParamArg({', '.join(args)})" +axis_letters = {AxisType.DEVICE: "d", AxisType.GLOBAL: "g", AxisType.THREAD: "t", AxisType.LOCAL: "l", AxisType.WARP: "w", AxisType.WEAK: "L", + AxisType.LOOP: "L", AxisType.UPCAST: "u", AxisType.GROUP_REDUCE: "G", AxisType.REDUCE: "R", AxisType.UNROLL: "r"} +axis_colors = {AxisType.DEVICE: "green", AxisType.GLOBAL: "blue", AxisType.THREAD: "BLUE", AxisType.LOCAL: "cyan", AxisType.WARP: "CYAN", + AxisType.WEAK: "WHITE", AxisType.LOOP: "WHITE", AxisType.UPCAST: "yellow", AxisType.GROUP_REDUCE: "RED", AxisType.REDUCE: "red", + AxisType.UNROLL: "magenta"} + +# NOTE: LOCAL and GROUP_REDUCE have the same priority. the order here matters +axis_to_pos = {AxisType.DEVICE: -2, AxisType.WEAK: -1, AxisType.LOOP: -1, AxisType.THREAD: 0, AxisType.GLOBAL: 0, AxisType.WARP: 1, + AxisType.LOCAL: 2, AxisType.UPCAST: 3, AxisType.GROUP_REDUCE: 2, AxisType.REDUCE: 4, AxisType.UNROLL: 5} + +range_start = {Ops.STAGE: 1, Ops.REDUCE: 1, Ops.WMMA: 3, Ops.END: 1, Ops.CALL: 1, Ops.FUNCTION: 1, + Ops.SLICE: 2, Ops.LINEAR: 0} + +# https://en.wikipedia.org/wiki/Identity_element +def identity_element(op:Ops, dt:DType) -> PyConst: return dt.const({Ops.ADD:0, Ops.MUL:1, Ops.MAX:dt.min}[op]) + +# With True as the default, this matches the old symbolic behavior +def resolve(x:UOp|bool, default:bool=True): + if isinstance(x, bool): return x + assert x.dtype == dtypes.bool, "UOp in resolve must be bool" + # NOTE: generating the text for the exception is expensive, so we do this + return bool(sx.vmin) if (sx:=x.simplify()).vmin == sx.vmax else default + +# smax/smin are replacements for max/min that preserve symbolic +def _suop(lst, uop_fxn, python_fxn): + uops, nums = partition(lst, lambda x: isinstance(x, UOp)) + return ssimplify(functools.reduce(uop_fxn, uops + ([python_fxn(nums)] if nums else []))) +def smax(*lst) -> sint: return _suop(argfix(*lst), UOp.maximum, max) +def smin(*lst) -> sint: return _suop(argfix(*lst), UOp.minimum, min) +def srender(x:sint) -> str: return x.render() if isinstance(x, UOp) else str(x) +def _align_left(*shapes:tuple[sint, ...]) -> tuple[tuple[sint, ...], ...]: + max_dim = max(len(s) for s in shapes) + return tuple((1,)*(max_dim-len(s))+s for s in shapes) +def _broadcast_shape(*shapes:tuple[sint, ...]) -> tuple[sint, ...]: + if all_same(shapes): return shapes[0] + # per right-aligned dim: sizes of 1 broadcast to the others, which must all agree + ret = [] + for sizes in zip(*_align_left(*shapes)): + if len(rest:=dedup([s for s in sizes if isinstance(s, UOp) or s != 1])) > 1: + raise IndexError(f"shape mismatch: objects cannot be broadcast to a single shape {shapes}") + ret.append(rest[0] if rest else 1) + return tuple(ret) +def broadcast_axes(src_shape:tuple[sint, ...], out_shape:tuple[sint, ...]) -> tuple[int, ...]: + # out axes that are added or expanded + if (nleft:=len(out_shape)-len(src_shape)) < 0: raise RuntimeError(f"cannot broadcast {src_shape} into {out_shape}") + return tuple(range(nleft)) + tuple(nleft+i for i,s in enumerate(src_shape) if resolve(s == 1, default=False) and resolve(out_shape[nleft+i] != 1)) + +def ssimplify(uop:sint): return uop.ssimplify() if isinstance(uop, UOp) else uop +def sym_infer(uop: UOp|int, var_vals: dict[str, int]) -> int: return uop.sym_infer(var_vals) if isinstance(uop, UOp) else uop + +def range_str(u:UOp, color=False) -> str: + ret = '_'.join([str(x) if x >= 0 else "m"+str(-x) for x in u.arg[0:-1]]) + return colored(ret, axis_colors[u.arg[-1]]) if color else ret + +def multirange_str(rngs:Iterable[UOp], color=False, pad=None) -> str: + ret = ','.join([range_str(x, color=color) for x in sorted(rngs, key=lambda x: x.arg)]) + if pad is not None: ret += " " * (pad-ansilen(ret)) + return ret + +def shape_to_shape_arg(arg:tuple[sint, ...]) -> UOp: + for x in arg: + if isinstance(x, UOp) and not dtypes.is_int(x.dtype): raise RuntimeError(f"shape must be int, got {x.dtype} in {arg}") + if len(arg) == 0: return UOp(Ops.STACK) + elif len(arg) == 1: return UOp.const(arg[0], dtypes.weakint) + else: return UOp(Ops.STACK, src=tuple(UOp.const(x) if isinstance(x, int) else x for x in arg)) + +def consumer_map_from_toposort(lst:Iterable[UOp]): + ret: dict[UOp, dict[UOp, None]] = {} + for u in lst: + ret[u] = {} + for s in u.src: + if s in ret: ret[s][u] = None + return ret + +def promo_dtype(src:tuple[UOp,...]) -> DType: + dts = [x.dtype for x in src] + return dts[0] if all_same(dts) else least_upper_dtype(*dts) + +def dtype_from_uop(op:Ops, src:tuple[UOp,...], arg:Any) -> DType|None: + # here are the dtype production rules, eventually this will go in UOp as a recursive property + match op: + case Ops.STORE | Ops.LINEAR | Ops.SINK | Ops.PROGRAM | Ops.SOURCE | \ + Ops.END | Ops.BARRIER | Ops.GROUP | Ops.IF | Ops.ENDIF | \ + Ops.TUPLE | Ops.FUNCTION | Ops.CUSTOM_FUNCTION | Ops.REWRITE_ERROR: + # always void + return dtypes.void + case Ops.CALL: + # a CALL of an opaque body is void, a CALL of an address can return a value + return dtypes.void if src[0].dtype is dtypes.void else None + case Ops.CUSTOM | Ops.CUSTOMI | Ops.PYLITERAL: + return None + case Ops.INS: + return None + case Ops.NOOP: + # NOOP can be void or carry any dtype (e.g. x.f(Ops.NOOP) or substitute base with NOOP) + return None + case Ops.INDEX: + # an image access is always float, no matter the storage dtype + # TODO: should there be a CAST so src[0].dtype just work? + if (b:=src[0]).op is Ops.PARAM and is_image_shape(b.shape): return dtypes.float + return b.dtype + case Ops.LOAD | Ops.UNSHARD | Ops.REDUCE | Ops.AFTER | Ops.RANGE | \ + Ops.CONTIGUOUS | Ops.CONTIGUOUS_BACKWARD | Ops.COPY | Ops.STAGE | Ops.DETACH | \ + Ops.MSTACK | Ops.MSELECT | Ops.ALLREDUCE | Ops.SPECIAL: + # pass through first + return src[0].dtype + case Ops.CMPLT | Ops.CMPNE | Ops.CMPEQ: + return dtypes.bool + case Ops.SIN | Ops.LOG2 | Ops.EXP2 | Ops.SQRT | Ops.RECIPROCAL: + return least_upper_float(src[0].dtype) + case Ops.WHERE: + if src[0].dtype != dtypes.bool: raise RuntimeError(f"where cond must be bool, got {src[0].dtype}") + return promo_dtype(src[1:]) + case Ops.STACK: + if len(src) == 0: return dtypes.void + return promo_dtype(src) + case Ops.BIND: + assert src[0].dtype == src[1].dtype, f"bind dtype mismatch {src[0].dtype} != {src[1].dtype}" + return src[0].dtype + case Ops.WMMA: + # WMMA output dtype is the accumulator dtype (src[2]) + return src[2].dtype + case Ops.GETTUPLE: + # GETTUPLE extracts from a TUPLE (possibly through a FUNCTION) + in_tuple = src[0].src[0] if src[0].op is Ops.FUNCTION else src[0] + return in_tuple.src[arg].dtype + case Ops.GETADDR: + return dtypes.uint64 + case Ops.SHL | Ops.SHR: + if not all(dtypes.is_int(x.dtype) for x in src): raise RuntimeError(f"shift operands must be int, got {[x.dtype for x in src]}") + return src[0].dtype + case Ops.BUFFER | Ops.PARAM: + assert isinstance(arg, ParamArg), "BUFFER/PARAM must have ParamArg" + return arg.dtype + case Ops.BINARY: + return dtypes.uint8 + case Ops.SLICE: + # TODO: slice just shouldn't exist + return None + case Ops.CAST | Ops.BITCAST: + assert isinstance(arg, DType), f"CAST/BITCAST arg must be DType, got {arg}" + return arg + case Ops.CONST: + # derived from the value. order matters: bool is an int subclass, ConstFloat is a float subclass + if isinstance(arg, InvalidType): return dtypes.bool # Invalid is always bool, the promo lattice bottom + if isinstance(arg, bool): return dtypes.bool + if isinstance(arg, int): return dtypes.weakint + if isinstance(arg, float): return dtypes.weakfloat + raise TypeError(f"no dtype for CONST with arg {arg}") + if op in GroupOp.Unary: return src[0].dtype + # NOTE: CMPLT, CMPNE, CMPEQ, WHERE, SHL, SHR are handled above + if op in GroupOp.Broadcastable: return promo_dtype(src) + if op in GroupOp.Movement: return src[0].dtype + raise RuntimeError(f"no dtype for {op} with arg {arg}") + +class UOpMetaClass(type): + ucache:dict[tuple, weakref.ReferenceType[UOp]] = {} + def __call__(cls, op:Ops, dtype:DType|None=None, src:tuple[UOp,...]=tuple(), arg:Any=None, tag:Any=None, + metadata:tuple[Metadata,...]|None=None, _buffer:Buffer|None=None): + if dtype is None: dtype = dtype_from_uop(op, src, arg) or dtypes.void + # CONST derives its dtype by value only when the constructor omits one + # TODO: delete this once the dtype field is removed, for now it just re-implements spec.py + # an INDEX presents its access dtype, which a still-weak source matches up to weakness + if SPEC == 2 and op is not Ops.CONST and \ + not any(s.base.is_invalid for s in src) and (expected_dtype:=dtype_from_uop(op, src, arg)) is not None and expected_dtype != dtype and \ + not (op is Ops.INDEX and weak_dtype(expected_dtype) == weak_dtype(dtype)): + raise RuntimeError(f"bad dtype {dtype}, expected {expected_dtype} on {op}") + if (wret:=UOpMetaClass.ucache.get(key:=(op, dtype, src, arg, tag), None)) is not None and (ret:=wret()) is not None: return ret + UOpMetaClass.ucache[key] = weakref.ref(created:=super().__call__(*key)) + if metadata is not None: all_metadata[created] = metadata + # NOTE: this value is set by pickle when pickling a realized tensor + if _buffer is not None: + assert op is Ops.BUFFER, f"trying to set Buffer {_buffer} for {op}" + buffers[created] = _buffer + if SPEC > 1: + from tinygrad.uop.spec import spec_full, test_pyrender + if SPEC > 2: + # SPEC=3 checks the shape + _ = created._shape + if SPEC > 3: + test_pyrender(created) + with Context(CHECK_OOB=0): fret = cast(bool|None, spec_full.rewrite(created)) + if fret is not True: raise RuntimeError(f"SPEC ISSUE {fret}: {created}") + return created + +# some uops map to other stuff +buffers:weakref.WeakKeyDictionary[UOp, Buffer|MultiBuffer] = weakref.WeakKeyDictionary() # this maps BUFFER/SLICE uops to their device Buffers +all_metadata:weakref.WeakKeyDictionary[UOp, tuple[Metadata, ...]] = weakref.WeakKeyDictionary() # TODO: should this be here? + +# recursive_property replaces functools.cached_property in recursive UOp functions to prevent RecursionError +class recursive_property(property): + def __init__(self, fxn): + self.fxn = fxn + self.nm = "_RECURSIVE_PROPERTY_"+fxn.__name__ + self.__doc__ = fxn.__doc__ + def __get__(self, x:UOp|None, owner=None): + if x is None: return self + if self.nm in x.__dict__: return x.__dict__[self.nm] + for node in x.toposort(gate=lambda node: self.nm not in node.__dict__): node.__dict__[self.nm] = self.fxn(node) + return x.__dict__[self.nm] + +# we import this late so we can use resolve/smax in mixins +from tinygrad.mixin.op import OpMixin +from tinygrad.mixin.rand import RandMixin + +# NOTE: this should be frozen, but frozen is slower +@dataclass(eq=False, slots=True) +class UOp(RandMixin, metaclass=UOpMetaClass): + op:Ops + dtype:DType = dtypes.void + src:tuple[UOp, ...] = tuple() + arg:Any = None + tag:Any = None + def __del__(self): + if Ops is not None and self.op is Ops.BUFFER and (buffer:=buffers.get(self)) is not None: buffer.ref(-1) + try: del UOpMetaClass.ucache[(self.op, self.dtype, self.src, self.arg, self.tag)] + except AttributeError: pass + def __reduce__(self): + args = [self.op, self.dtype, self.src, self.arg, self.tag, self.metadata] + if self.op is Ops.BUFFER and self.realized is not None: args.append(self.realized) + return UOp, tuple(args) + def replace(self, **kwargs) -> UOp: + new_args = (kwargs.pop("op", self.op), kwargs.pop("dtype", self.dtype), kwargs.pop("src", self.src), + kwargs.pop("arg", self.arg), kwargs.pop("tag", self.tag)) + assert len(kwargs) == 0, f"unused kwargs in replace {list(kwargs)}" + if (self.op, self.dtype, self.src, self.arg, self.tag) == new_args: return self + return UOp(*new_args) + def rtag(self, tag=True): return self.replace(tag=tag) + @property + def val(self): + assert self.op is Ops.CONST, f"val is only for CONST, got {self.op}" + return self.arg + @property + def is_invalid(self) -> bool: return self.op is Ops.CONST and self.val is Invalid + @recursive_property + def key(self) -> bytes: + return hashlib.sha256(str((self.op, self.dtype, self.arg)).encode() + b"".join([s.key for s in self.src])).digest() + def __repr__(self): + from tinygrad.uop.render import pretty_print + return pretty_print(self) + def argstr(self): + if self.op is Ops.REDUCE: return f'({", ".join(map(str, self.arg))})' + return repr(self.arg) + def tagstr(self): return f", tag={self.tag}" if self.tag is not None else "" + + def f(self, op, **kwargs): return UOp(op, dtype=kwargs.pop("dtype", self.dtype), src=(self,), **kwargs) + + @functools.cached_property + def backward_slice(self:UOp) -> dict[UOp, None]: + res: dict[UOp, None] = self.toposort() + res.pop(self) + return res + + @property + def backward_slice_with_self(self:UOp) -> dict[UOp, None]: return {self:None, **self.backward_slice} + def op_in_backward_slice_with_self(self, *ops:Ops) -> bool: + # Check self first, then iterate backward_slice (avoids creating intermediate dict) + return self.op in ops or any(x.op in ops for x in self.backward_slice) + + @recursive_property + def _bool_slice(self) -> frozenset[UOp]: return frozenset().union(*[s.bool_slice for s in self.src]) + # NOTE: self is added outside the cache, a cached self-reference is a cycle the refcounter can't free + @property + def bool_slice(self) -> frozenset[UOp]: return self._bool_slice | {self} if self.dtype is dtypes.bool else self._bool_slice + + def toposort(self, gate:Callable|None=None, enter_calls=True) -> dict[UOp, None]: + cache: dict[UOp, None] = {} + stack: list[tuple[UOp, bool]] = [(self, False)] # each stack entry is (node, visited_flag) + while stack: + node, visited = stack.pop() + if node in cache: continue + if not visited: + if gate is None or gate(node): + stack.append((node, True)) # push node back on stack to process after its srcs + for s in reversed(node.src if enter_calls or node.op not in {Ops.CALL, Ops.FUNCTION} else node.src[1:]): + stack.append((s, False)) # push srcs on the stack + else: cache[node] = None # second time i'm seeing this node, add it to returned toposort + return cache + + def topovisit(self, visitor:Callable[[UOp], T], cache:dict[UOp, T]) -> T: + # NOTE: this shares a lot of code with toposort + stack: list[tuple[UOp, bool]] = [(self, False)] + while stack: + node, visited = stack.pop() + if node in cache: continue + if not visited: + stack.append((node, True)) + for s in reversed(node.src): stack.append((s, False)) + else: cache[node] = visitor(node) + return cache[self] + + @functools.cached_property + def tuplize(self:UOp) -> tuple: + return (self.op.value, self.arg, self.dtype,)+tuple([x.tuplize for x in self.src]) + + # *** uop shape stuff *** + + @recursive_property + def _shape(self) -> tuple[sint, ...]|None: + match self.op: + # late ops don't have shape + case Ops.IF | Ops.BARRIER | Ops.SINK | Ops.REWRITE_ERROR | Ops.ENDIF | Ops.GROUP | \ + Ops.LINEAR | Ops.PROGRAM | Ops.SOURCE | Ops.TUPLE | Ops.FUNCTION: + return None + + # a void CALL has no shape, the return value of a CALL has the shape of its dtype + case Ops.CALL: + return None if self.dtype is dtypes.void else () + + # INS shape is always scalar, vector width is in the instruction encoding + case Ops.INS: + if self.dtype is dtypes.void: return None + return () + + # special (terrible) case for RESHAPE on NOOP + case Ops.RESHAPE: + if self.src[0].op is Ops.NOOP: return self.marg + + # hacks for NOOP + case Ops.NOOP: + return self.src[0]._shape if len(self.src) >= 1 else None + + case Ops.GETTUPLE: + # GETTUPLE extracts from a TUPLE (possibly through a FUNCTION) + in_tuple = self.src[0].src[0] if self.src[0].op is Ops.FUNCTION else self.src[0] + assert in_tuple.op is Ops.TUPLE + inner_shape = in_tuple.src[self.arg]._shape + if inner_shape is None: return None + # if through a FUNCTION, substitute internal PARAMs in the shape with corresponding args + if self.src[0].op is Ops.FUNCTION: + return tuple(graph_rewrite(s, _pm_resolve_params, self.src[0].src[1:], walk=True) if isinstance(s, UOp) else s for s in inner_shape) + return inner_shape + + case Ops.INDEX: + shp:list[sint] = [] + for s in self.src[1:]: shp.extend(list(s.shape)) + return tuple(shp) + self.src[0].shape[len(self.src[1:]):] + + case Ops.STACK: + if len(self.src) == 0: return () + return (len(self.src),) + self.src[0].shape + case Ops.CONST: + return () + + # some ops init the shape + case Ops.GETADDR: return () + case Ops.BIND | Ops.RANGE | Ops.SPECIAL: return () + case Ops.BINARY: return (len(self.arg),) + case Ops.BUFFER: + if len(self.src): return self.src[0].as_shape + return () + case Ops.SLICE: + # HACK: SLICE is used inside kernels, so we set the shape to () if it's on an INDEX + if self.src[0].op is Ops.INDEX: return () + return (self.arg,) + case Ops.CUSTOM | Ops.CUSTOMI: + if self.dtype is dtypes.void: return None + input_shapes = [x._shape for x in self.src if x._shape is not None] + return _broadcast_shape(*input_shapes) if input_shapes else None + case Ops.CUSTOM_FUNCTION: return None + case Ops.PYLITERAL: return None + case Ops.STAGE: + # STAGE adds the existing shape to the front, opposite of INDEX + return tuple([int(r.vmax+1) for r in self.src[1:]])+self.src[0].shape + + # param has shape as the only arg + case Ops.PARAM: + return self.src[0].as_shape + + # wmma output shape = accumulator shape (src[2]) + case Ops.WMMA: + wmma_b = _broadcast_shape(self.src[0].shape[:-1], self.src[1].shape[:-1], self.src[2].shape[:-1]) + return wmma_b + (self.src[2].shape[-1],) + + # passthrough ops + case Ops.MSTACK | Ops.MSELECT | Ops.DETACH | Ops.CONTIGUOUS | Ops.CONTIGUOUS_BACKWARD | Ops.AFTER | Ops.LOAD | \ + Ops.COPY | Ops.ALLREDUCE | Ops.STORE | Ops.END: + return self.src[0]._shape + + case Ops.BITCAST: + ps = self.src[0]._shape + if ps is None: return None + if (output_sz:=self.dtype.itemsize) != (input_sz:=self.src[0].dtype.itemsize) and len(ps) > 0: + if isinstance(ps[-1], int) and (ps[-1]*input_sz) % output_sz: raise RuntimeError("unsupported size in bitcast") + return ps[:-1]+(ssimplify((ps[-1]*input_sz) // output_sz),) + return ps + + # UNSHARD marker has no shape + case Ops.UNSHARD if len(self.src) == 0: return None + + # movement ops change the shape + # NOTE: ssimplify is required because the shape needs to be canonical for broadcasting and same shape checking + if self.op in GroupOp.Movement.union({Ops.UNSHARD, Ops.REDUCE}): + ps = self.src[0]._shape + if ps is None: raise RuntimeError(f"movement op {self.op} requires shape, {self.src[0].op} doesn't have one") + match self.op: + case Ops.RESHAPE: + if not all(x >= 0 for x in self.marg): raise ValueError(f"shape can't contain negative numbers {self.marg}") + if prod(ps) != prod(self.marg): raise ValueError(f"bad reshape: {ps} -> {self.marg}") + return self.marg + case Ops.EXPAND: + return tuple(self.marg) + ps + case Ops.PERMUTE: + if sorted(self.marg) != list(range(len(ps))): raise ValueError(f"invalid permutation {self.marg} of len {len(ps)}") + return tuple(ps[i] for i in self.marg) + case Ops.PAD: + # TODO: why do i need resolve here? + if len(ps) != len(self.marg) or not all(resolve(sz>=0) and resolve(0<=o) and resolve(o+s<=sz) for s,(o,sz) in zip(ps, self.marg)): + raise ValueError(f"invalid pad {self.marg} for {ps}") + return tuple(ssimplify(sz) for _,sz in self.marg) + case Ops.SHRINK: + # TODO: why do i need resolve here? + if len(ps) != len(self.marg) or not all(resolve(0<=o) and resolve(sz>=0) and resolve(o+sz<=s) for s,(o,sz) in zip(ps, self.marg)): + raise ValueError(f"invalid shrink {self.marg} for {ps}") + return tuple(ssimplify(sz) for _,sz in self.marg) + case Ops.FLIP: + if len(ps) != len(self.marg) or not all(isinstance(x, bool) for x in self.marg): raise ValueError(f"bad flip on {ps}, {self.marg}") + return ps + case Ops.UNSHARD: return tuple(s*(int(self.src[1:][self.arg.index(a)].vmax)+1) if a in self.arg else s for a,s in enumerate(ps)) + case Ops.REDUCE: + num_axes = self.arg[1] + if not isinstance(num_axes, int) or num_axes < 0 or num_axes > len(ps): + raise ValueError(f"invalid type for axis: {num_axes}") + return ps[num_axes:] + + if self.op in GroupOp.Unary.union({Ops.CAST}): + assert len(self.src) == 1, "unary ops must have 1 src" + return self.src[0]._shape + + # elementwise ops keep the shape the same. all inputs with shape must match + if self.op in GroupOp.Broadcastable: + input_shapes = [x._shape for x in self.src] + assert len(self.src) > 0 and all(x is not None for x in input_shapes), f"None input shape not supported for {self.op}" + if DISALLOW_BROADCAST and not all_same(input_shapes): + raise RuntimeError(f"shape mismatch at {self.op}: {input_shapes} {[x.op for x in self.src]}") + # broadcasting lives in _shape property now + return _broadcast_shape(*input_shapes) + + # all Ops must be explicitly handled + raise NotImplementedError(f"no shape handling for {self.op} with {self.dtype}") + + @property + def shape(self) -> tuple[sint, ...]: + if (ret:=self._shape) is None: raise RuntimeError(f"shape requested, but {self.op} doesn't have a shape") + return ret + + @property + def max_shape(self) -> tuple[int, ...]: return to_max_shape(self.shape) + def max_numel(self) -> int: return prod(self.max_shape) + + @property + def shard_shape(self) -> tuple[sint, ...]: + if not isinstance(self.device, tuple) or self.axis is None: return self.shape + dcount = int(self.src[1].vmax)+1 if self.op is Ops.UNSHARD else len(self.device) + return tuple(x//dcount if i == self.axis else x for i,x in enumerate(self.shape)) + + @property + def max_shard_shape(self) -> tuple[int, ...]: return to_max_shape(self.shard_shape) + + @functools.cached_property + def ended_ranges(self) -> tuple[UOp, ...]: + if self.op in range_start: return self.src[range_start[self.op]:] + if self.op is Ops.AFTER: return tuple(flatten([x.ended_ranges for x in self.src[1:]])) + # UNSHARD ends the DEVICE range: its src is per-device index math, the device axis is carried by the axis metadata + if self.op is Ops.UNSHARD: return self.src[1:] + return () + + # determine what ranges this is in + @recursive_property + def _ranges(self) -> dict[UOp, None]: + ret: dict[UOp, None] = {} + for s in self.src: ret.update(s.ranges) + for er in self.ended_ranges: + if er.op is Ops.RANGE: + # if it's a single RANGE, we don't flow through it. + ret.pop(er, None) + else: + # if it's not a RANGE, we include all ranges in srcs. + # technically we shouldn't flow through these ranges either, but this is pre pm_add_control_flow so it's the same. + for s in er.ranges: ret.pop(s, None) + return ret + + @property + def ranges(self) -> dict[UOp, None]: + if self.op is Ops.RANGE: return {self:None} | self._ranges + return self._ranges + + # *** uop evaluation *** + + def simplify(self, tracked=False): + if self.op is Ops.CONST: return self + if self.op is Ops.SINK and all(s.op is Ops.CONST or (s.op is Ops.STACK and len(s.src) == 0) for s in self.src): return self + # late import! + from tinygrad.uop.symbolic import symbolic, pm_fold_cast_const + with Context(TRACK_MATCH_STATS=0 if not tracked else TRACK_MATCH_STATS.value): + return graph_rewrite(self, symbolic+pm_fold_cast_const, name="simplify") + def ssimplify(self) -> UOp|ConstType: return ret.val if (ret:=self.simplify()).op is Ops.CONST else ret + def _eval(self, dtype, expected_type:Type[T]) -> T: + assert self.dtype in dtype, f"eval with wrong dtype {self}" + vmin, vmax = (simple_self:=self.simplify())._min_max + if vmin != vmax: raise ValueError(f"eval failed to be a single number, range is {vmin} to {vmax} in {simple_self.render()}") + assert isinstance(vmin, expected_type), f"vmin is wrong dtype {type(vmin)} != {expected_type}" + return vmin + def __bool__(self): return self._eval((dtypes.bool,), bool) + def __int__(self): return self._eval(dtypes.ints+(dtypes.weakint,), int) + def __float__(self): return float(self._eval(dtypes.floats+(dtypes.weakfloat,), float)) + def substitute(self, dvars:dict[UOp, UOp], name:str|None=None, extra_pm:PatternMatcher|None=None, walk:bool=False, enter_calls:bool=False): + dvars = {k:v for k,v in dvars.items() if k is not v} + if len(dvars) == 0: return self + with Context(TRACK_MATCH_STATS=(0 if name is None else TRACK_MATCH_STATS.value)): + return graph_rewrite(self, (extra_pm+_substitute) if extra_pm is not None else _substitute, dvars, + bottom_up=True, walk=walk, enter_calls=enter_calls, name=name) + # NOTE: this is not called by Tensor slice (Tensor handles UOps directly), but satisfies SupportsIndex for type checking + def __index__(self): return self.__int__() + + # *** uop tracing stuff *** + + @recursive_property + def trace_num(self): + num = next(ucount) + uop_fields[num] = (self.op, self.dtype, tuple(s.trace_num for s in self.src), self.arg, self.tag)+((self.metadata,) if TRACEMETA>=2 else ()) + return num + + # *** uop syntactic sugar *** + + def sink(*srcs:UOp|None, **kwargs): # pylint: disable=no-self-argument + return UOp(Ops.SINK, src=tuple([x for x in srcs if x is not None]), **kwargs) + def maketuple(*srcs:UOp): # pylint: disable=no-self-argument + return UOp(Ops.TUPLE, src=srcs) + def gettuple(self, idx:int) -> UOp: + in_tuple = self.src[0] if self.op is Ops.FUNCTION else self + assert in_tuple.op is Ops.TUPLE, f"gettuple requires FUNCTION or TUPLE source, got {self.op}" + return UOp(Ops.GETTUPLE, src=(self,), arg=idx) + def group(*srcs:UOp|None): # pylint: disable=no-self-argument + if len(srcs) == 1 and isinstance(srcs[0], UOp): return srcs[0] + return UOp(Ops.GROUP, src=tuple([x for x in srcs if x is not None])) + def index(self, *srcs:UOp|int|None, **kwargs): + new_srcs: list[UOp] = [UOp.const(x) if isinstance(x, int) else x for x in srcs if x is not None] + if len(new_srcs) == 1 and new_srcs[0].op is Ops.CONST and self.op is Ops.STACK: return self.src[new_srcs[0].val] + return UOp(Ops.INDEX, src=(self,)+tuple(new_srcs), **kwargs) + def __getitem__(self, idx): + # buffers index into INDEX UOps (scalar lookup); everything else uses the shared mixin view path + if self.addrspace in (None, AddrSpace.ALU) or self.device is not None: return super(UOp, self).__getitem__(idx) + idx = self._normalize_indices(list(argfix(idx))) + if len(slice_idx:=[i for i,x in enumerate(idx) if isinstance(x, slice)]): + # apply SHRINK for slices that aren't the full range + bounds = tuple((s.start or 0, s.stop if s.stop is not None else self.shape[i]) if isinstance(s, slice) else (0, self.shape[i]) + for i, s in enumerate(idx)) + src = self.shrink(bounds) + non_slice_args = [x for x in idx if not isinstance(x, slice)] + if not non_slice_args: return src # all dims are slices, no indexing needed + perm = src.permute(tuple([i for i in range(src.ndim) if i not in slice_idx] + slice_idx)) + return perm.index(*non_slice_args) + return self.index(*idx) + @property + def _uop(self) -> UOp: return self + @classmethod + def _wrap_uop(cls, u:UOp) -> UOp: return u + def const_like(self, b:ConstLike, dtype:DType|None=None): + ret = UOp.const(b, dtype or self.dtype) + return ret._mop(Ops.EXPAND, arg=self._shape) if self._shape and ret._shape != self._shape else ret + def vconst_like(self, b:ConstLike, dtype:DType|None=None): + # for use after movement ops have been removed + return UOp.const(b, dtype or self.dtype).broadcast(self.max_numel()) + def ufix(self, x): + if isinstance(x, UOp): return x + return UOp.const(x) + def broadcast(self, count:int): + if count == 1: return self + return UOp(Ops.STACK, src=(self,)*count) + def load(self, *src:UOp, **kwargs): return UOp(Ops.LOAD, src=(self,)+src, **kwargs) + def store(self, src:UOp|ConstType, gate:UOp|None=None, **kwargs): + srcs = (self, self.const_like(src) if not isinstance(src, UOp) else src) + ((gate,) if gate is not None else ()) + return UOp(Ops.STORE, src=srcs, **kwargs) + def end(self, *src:UOp): return UOp(Ops.END, src=(self,)+src) if len(src) else self + def after(self, *src:UOp, **kwargs): return UOp(Ops.AFTER, src=(self,)+src, **kwargs) if len(src) else self + @property + def without_after(self) -> UOp: return self.src[0] if self.op is Ops.AFTER else self + def barrier(self, *src:UOp): return UOp(Ops.BARRIER, src=(self,)+src) + def ins(self, arg, **kwargs): return UOp(Ops.INS, kwargs.pop("dtype", self.dtype), kwargs.pop("src", self.src), arg, kwargs.pop("tag", self.tag)) + def contract(self, *rngs:UOp): + assert all(x.arg[-1] == AxisType.UPCAST for x in rngs), "all contract ranges must be upcast" + return UOp.stack(*[self.substitute(dict(zip(rngs, [r.const_like(i) for r,i in zip(rngs, idx)]))) + for idx in itertools.product(*[range(int(r.vmax)+1) for r in rngs])]) + def alu(self, op, *src:UOp, **kwargs): return UOp(op, src=(self, *src), **kwargs) + @staticmethod + def const(b:ConstLike, dtype:DType|None=None): + if dtype is None or b is Invalid: dtype = dtypes.from_py(b) + if isinstance(b, UOp): return b.cast(dtype) + # NOTE: it always has to be STACK now, even if they are all the same + if isinstance(b, tuple): return UOp.stack(*[UOp.const(c, dtype) for c in b]) + return UOp(Ops.CONST, dtype, arg=dtype.const(b), src=()) + @staticmethod + def range(end:sint, axis_id, axis_type=AxisType.WEAK, *arg, dtype=dtypes.weakint, src=(), **kwargs): + return UOp(Ops.RANGE, src=(sint_to_uop(end, dtype),)+src, arg=(axis_id, axis_type)+arg, **kwargs) + @staticmethod + def loop(axis_id:int, *arg): return UOp(Ops.RANGE, src=(UOp(Ops.NOOP),), arg=(axis_id, AxisType.WEAK)+arg) + @staticmethod + def special(end:sint, name:str, dtype=dtypes.weakint): return UOp(Ops.SPECIAL, src=(sint_to_uop(end, dtype),), arg=name) + @staticmethod + def wmma(a:UOp, b:UOp, acc:UOp, dims:tuple[int, int, int], device:str, threads:int, tc_upcast_axes=None): + # dtype_in is stored in the arg (not derived from src[0].dtype) because bitcast rewrites change src dtypes + return UOp(Ops.WMMA, src=(a, b, acc), arg=(dims, a.dtype, device, threads, tc_upcast_axes)) + def _rop(self, op:Ops, axis:tuple[int, ...]): + # NOTE: we don't allow reduce on 1s axis + axis = tuple(sorted(axis)) + reduce_axis = tuple(x for x in axis if resolve(self.shape[x] != 1)) + if not len(reduce_axis): + return self.reshape(tuple(s for i,s in enumerate(self.shape) if i not in axis)) + # permute so reduced axes are at the front + perm = reduce_axis + tuple(i for i in range(len(self.shape)) if i not in reduce_axis) + ret = UOp(Ops.REDUCE, src=(self.permute(perm),), arg=(op, len(reduce_axis))) + return ret.reshape(tuple(s for i,s in enumerate(self.shape) if i not in axis)) if axis != reduce_axis else ret + @staticmethod + def invalid(): return UOp.const(Invalid) + def valid(self, cond): + return cond.where(self, self.const_like(Invalid)) + def get_idx(self) -> UOp: + if self.op is Ops.STACK: return UOp.stack(*(x.get_idx() for x in self.src)) + return self.src[1] if self.op is Ops.WHERE and self.src[2].is_invalid else self + def get_valid(self) -> UOp: + if self.op is Ops.STACK: return UOp.stack(*(x.get_valid() for x in self.src)) + return self.src[0] if self.op is Ops.WHERE and self.src[2].is_invalid else UOp.const(not self.is_invalid) + def reduce(self, *src:UOp, **kwargs): + arg = kwargs.pop('arg', None) + if isinstance(arg, Ops): arg = (arg, 0) + return UOp(Ops.REDUCE, src=(self,)+src, arg=arg, **kwargs) + + def bufferize(self, *args, **kwargs): return UOp(Ops.STAGE, src=(self,)+args, **kwargs) + def allreduce(self, op, device:str|tuple[str, ...]): + assert isinstance(self.device, tuple), f"allreduce must be on tuple {self.device} isn't" + return UOp(Ops.ALLREDUCE, src=(self,), arg=(op, device)) + def overflows(self, dtype:DType) -> bool: return self.vmin < dtype.min or dtype.max < self.vmax + + def split_uop(self:UOp, sep:Ops) -> Iterator[UOp]: + if self.op is sep: + for s in self.src: yield from s.split_uop(sep) + else: yield self + + # *** multi-device helpers *** + + def unshard(self, axis:int|tuple[int, ...]|None, device_range:UOp|tuple[UOp, ...]|None=None): + assert axis is not None, "multi None is no longer supported" + # an UNSHARD carries the value and one sharding range per sharded axis (arg is the tuple of sharded axes, + # sorted). the single-axis axis form defaults the range to a DEVICE range over the devices; a range need not + # be DEVICE, e.g. a LOCAL range shards a kernel tile into per-thread fragments + if isinstance(axis, int): axis = (axis,) + if device_range is None: + assert isinstance(self.device, tuple), f"multi device must be tuple, {self.device} isn't" + device_range = (UOp.range(len(self.device), -1, AxisType.DEVICE),) + if isinstance(device_range, UOp): device_range = (device_range,) + assert isinstance(device_range, tuple) and len(axis) == len(device_range) and len(set(axis)) == len(axis) + axis, device_range = map(tuple, zip(*sorted(zip(axis, device_range)))) + return UOp(Ops.UNSHARD, src=(self, *device_range), arg=axis) + + @property + def sharding(self) -> tuple[tuple[int, UOp], ...]: + """(axis, RANGE) pairs this value is sharded over (the source of truth for shard bounds/counts).""" + return tuple(zip(self.arg, self.src[1:])) if self.op is Ops.UNSHARD else () + + @property + def bounds(self): + if self.axis is None: raise RuntimeError("bounds is not defined when axis is None") + dcount = int(self.src[1].vmax)+1 if self.op is Ops.UNSHARD else len(self.device) + return tuple(itertools.pairwise(itertools.accumulate([self.src[0].shape[self.axis] for _ in range(dcount)], initial=0))) + + @functools.cached_property + def axis(self) -> int|None: + # COPY removes axis. TODO: add more tests for this, and consider MSELECT/MSTACK + if self.op is Ops.COPY: return None + if self.op is Ops.UNSHARD: + if len(self.arg) != 1: raise RuntimeError(f"UOp is sharded on multiple axes {self.arg}, use .sharding") + return self.arg[0] + # GETTUPLE: axis comes from the specific TUPLE element, not src[0] + if self.op is Ops.GETTUPLE: + in_tuple = self.src[0].src[0] if self.src[0].op is Ops.FUNCTION else self.src[0] + return in_tuple.src[self.arg].axis if in_tuple.op is Ops.TUPLE else None + if self.op is Ops.PARAM: return self.arg.axis + # NOTE: they all have to share an axis, we always choose [-1]. src axes are right-aligned into the output shape + if self.op in GroupOp.ALU.union({Ops.STACK}): + return axes[-1] if (axes := dedup([x.axis+len(self.shape)-len(x.shape) for x in self.src if x.axis is not None])) else None + if len(self.src) == 0: return None + src_axis = self.src[0].axis + if self.op is Ops.SHRINK and src_axis is not None and self.marg[src_axis] != (0, self.src[0].shape[src_axis]): + return None # SHRINK will remove the sharding if it's on axis + if self.op is Ops.REDUCE: + if src_axis is None: return None + if src_axis < self.arg[1]: return None + return src_axis - self.arg[1] + if self.op is Ops.RESHAPE: + if src_axis is None: return None + arg_acc:list[sint] = [ssimplify(x) for x in itertools.accumulate(self.marg, operator.mul, initial=1)] + # new_axis is the last one that preserves prod(prior to new_axis) and must not move items between shards + target = ssimplify(prod(self.src[0].shape[:src_axis])) + if target not in arg_acc: raise RuntimeError(f"reshape {self.src[0].shape} -> {self.shape} moved items between shards") + new_axis = len(arg_acc) - arg_acc[::-1].index(target) - 1 + dcount = len(self.device) if isinstance(self.device, tuple) else \ + int(next(u.src[1] for u in self.src[0].toposort() if u.op is Ops.UNSHARD).vmax)+1 + if self.shape[new_axis] % dcount != 0: raise RuntimeError(f"reshape {self.src[0].shape} -> {self.shape} moved items between shards") + return new_axis + if self.op is Ops.PERMUTE: return self.marg.index(src_axis) if src_axis is not None else None + if self.op is Ops.EXPAND: return src_axis + len(self.marg) if src_axis is not None else None + return src_axis + + def _unshard(self, axis:int) -> UOp: + bsz, dcount = self.shape[axis], len(self.device) + dnum = UOp.range(dcount, -1, AxisType.DEVICE) + return self.pad(tuple((0,0) if a != axis else (bsz*dnum, bsz*(dcount-1) - bsz*dnum) for a in range(len(self.shape)))) + + def _shard(self, axis:int, rng:UOp) -> UOp: + if len(self.shape) == 0: return self # scalars broadcast, no sharding needed + dcount = int(rng.vmax)+1 + if self.shape[axis] % dcount != 0: raise RuntimeError(f"multi axis uneven: {self.shape[axis]=} {axis=} {dcount=}") + sz = self.shape[axis] // dcount + return self.shrink(tuple((0,s) if i != axis else (rng*sz,rng*sz+sz) for i,s in enumerate(self.shape))) + def shard(self, devices:tuple[str, ...], axis:int|None=None) -> UOp: + copied = self.copy_to_device(devices) + return copied if axis is None else copied._shard(axis, UOp.range(len(devices), -1, AxisType.DEVICE)).unshard(axis) + + def copy_to_device(self, device:str|tuple[str, ...], arg=None): + assert arg is None or isinstance(self.device, tuple) + inp = self if arg is None else UOp(Ops.MSELECT, src=(self,), arg=arg) + if inp.dtype in dtypes.weaks: raise RuntimeError(f"cannot create storage for weak dtype {inp.dtype}") + return UOp(Ops.COPY, src=(inp,), arg=device) + def mselect(self, arg:int) -> UOp: return UOp(Ops.MSELECT, src=(self,), arg=arg) + def mstack(self, *srcs: UOp) -> UOp: return UOp(Ops.MSTACK, src=(self,)+srcs) if len(srcs) else self + @property + def metadata(self) -> tuple[Metadata, ...]|None: return all_metadata.get(self, None) + + # *** uop movement ops *** + + @property + def base(self) -> UOp: + if self.op in GroupOp.Movement: return self.src[0].base + if self.op is Ops.DETACH: return self.src[0].base # DETACH can't change base + return self + + # cached property here makes external_uop_gc fail, why? + @property + def as_shape(self) -> tuple[sint, ...]: + if self.op is Ops.CONST: return (self.val,) + if self.op is not Ops.STACK: return (ssimplify(self),) + return tuple(s.val if s.op is Ops.CONST else ssimplify(s) for s in self.src) + + @functools.cached_property + def marg(self): + match self.op: + case Ops.RESHAPE | Ops.EXPAND: return self.src[1].as_shape + case Ops.PAD | Ops.SHRINK: return tuple(zip(self.src[1].as_shape, self.src[2].as_shape)) + case Ops.PERMUTE | Ops.FLIP: return self.arg + case _: raise RuntimeError(f"{self.op} is not a MovementOp") + + def _mop(self, op:Ops, arg) -> UOp: + # early NOOP + if op is Ops.EXPAND and len(arg) == 0: return self + if op in {Ops.SHRINK, Ops.PAD} and len(arg) == 0: + assert len(self.shape) == 0, "0 len arg only valid on zero length shape" + return self + match op: + case Ops.RESHAPE | Ops.EXPAND: src_args = [arg] + case Ops.PAD | Ops.SHRINK: src_args = list(zip(*arg)) + case Ops.PERMUTE | Ops.FLIP: src_args = [] + case Ops.STACK: + # arg is the other srcs; all are cast to the promoted dtype, spec requires STACK srcs to match its dtype + srcs = (self,)+tuple(arg) + dtype = cast(DType, dtype_from_uop(Ops.STACK, srcs, None)) + # TODO: why cast here? + return UOp(Ops.STACK, dtype, tuple(u if u.base.is_invalid else u.cast(dtype) for u in srcs)) + case _: raise RuntimeError(f"{op} is not a MovementOp") + usrcs = [shape_to_shape_arg(arg) for arg in src_args] + if len(usrcs) == 0: return UOp(op, src=(self,), arg=arg) + return UOp(op, src=(self,)+UOp.sink(*usrcs).simplify().src) + + # *** uop Buffer stuff *** + + unique_num = itertools.count(0) + + def getaddr(self, device=None) -> UOp: + if self.without_after.op not in {Ops.BUFFER, Ops.SLICE, Ops.BINARY, Ops.MSTACK, Ops.MSELECT, Ops.PARAM}: return self + return UOp(Ops.GETADDR, src=(self,), arg=device or to_tuple(self.device)[0]) + @staticmethod + def new_buffer(device:str|tuple[str, ...], size:int, dtype:DType, num=None): + if dtype in dtypes.weaks: raise RuntimeError(f"cannot create storage for weak dtype {dtype}") + slot = next(UOp.unique_num) if num is None else num + return UOp(Ops.BUFFER, src=(shape_to_shape_arg((size,)),), arg=ParamArg(slot, dtype, device=device)) + @staticmethod + def from_buffer(opaque:Buffer, device:str|tuple[str, ...]|None=None): + if (uop:=UOp.new_buffer(device or opaque.device, opaque.size, opaque.dtype, num=-id(opaque))) not in buffers: buffers[uop] = opaque.ref(1) + else: assert buffers[uop] is opaque + return uop + def empty_like(self, dtype:DTypeLike|None=None, device:str|tuple[str, ...]|None=None) -> UOp: + device = canonicalize_device(self.device if device is None else device) + axis = self.axis if isinstance(device, tuple) else None + ret = UOp.empty(self.shard_shape if axis is not None else self.shape, dtype=strong_dtype(self.dtype) if dtype is None else dtype, device=device) + return ret.unshard(axis) if axis is not None else ret + @staticmethod + def _frompy(x:list|tuple|bytes, dtype:DType, device:str|tuple[str, ...]|None=None) -> UOp: + device = canonicalize_device(device) + if isinstance(x, bytes): ret, data = UOp.new_buffer("PYTHON", len(x)//dtype.itemsize, dtype), x + else: + # bfloat16 and fp8 have no struct format, so pack a float32 buffer and cast + bdtype = dtypes.float32 if dtype in [dtypes.bfloat16, *dtypes.fp8s] else dtype + assert bdtype.fmt is not None, f"{bdtype=} has None fmt" + ret = UOp.empty(shape:=get_shape(x), dtype=bdtype, device="PYTHON") + data = struct.pack(f"{prod(shape)}{bdtype.fmt}", *[truncate[bdtype](bdtype.const(xi)) for xi in fully_flatten(x)]) + ret.buffer.allocate(memoryview(bytearray(data))) # fake realize. buffer storage must be writable, and bytes isn't + if ret.dtype != dtype: ret = ret.cast(dtype) + return ret if ret.device == device else ret.copy_to_device(device) + def clone(self, device=None) -> UOp: + device = device or self.device + ret = self.empty_like(device=device) + src = self if self.device is None or self.device == device else self.copy_to_device(device) + return ret.after(ret.store(src.cast(ret.dtype))) + @recursive_property + def device(self) -> str|tuple[str, ...]|None: + if self.op is Ops.PARAM: return self.arg.device + if self.op is Ops.STAGE: return self.arg.device + if self.op is Ops.AFTER: return self.src[0].device + if self.op is Ops.MSELECT: + assert isinstance(self.src[0].device, tuple), f"mselect must be on tuple device, getting {self.src[0].device}" + return self.src[0].device[self.arg] + if self.op is Ops.MSTACK: return tuple(cast(str, x.device) for x in self.src) + if self.op is Ops.BUFFER: return self.arg.device + if self.op is Ops.COPY: return self.arg + if self.op is Ops.ALLREDUCE: return self.arg[1] + for x in self.src: + if x.device is not None: return x.device + return None + @property + def is_virtual(self) -> bool: + # NOTE: no device means no place to store, weak means no width to store. neither can back a buffer as-is + # TODO: unify with has_buffer_identity + return self.device is None or self.dtype in dtypes.weaks + @recursive_property + def addrspace(self) -> AddrSpace|None: + if self.op is Ops.PARAM: return self.arg.addrspace + if self.op is Ops.BUFFER: return self.arg.addrspace + if self.op in {Ops.SPECIAL, Ops.RANGE}: return AddrSpace.ALU + if self.op is Ops.LOAD: return AddrSpace.ALU # LOAD brings things into the ALU + if self.op in {Ops.INDEX, Ops.CAST, Ops.AFTER, Ops.REDUCE, Ops.STORE, Ops.MSTACK, Ops.MSELECT, Ops.END, Ops.UNSHARD}: + return self.src[0].addrspace + if self.op in GroupOp.Movement: return self.src[0].addrspace + if self.op in {Ops.STACK, Ops.WMMA, Ops.GROUP} or self.op in GroupOp.Elementwise: + ad = [x.addrspace for x in self.src if x.addrspace is not None] + if not len(ad) or not all_same(ad): return None + return ad[0] + return None + @property + def buf_uop(self) -> UOp: + if self.op in {Ops.BUFFER, Ops.PARAM}: return self + if self.op is Ops.MSELECT: return self.src[0].buf_uop.mselect(self.arg) + if self.op is Ops.MSTACK: return UOp(Ops.MSTACK, src=tuple(x.buf_uop for x in self.src)) + if self.base.op is Ops.AFTER: return self.base.src[0].buf_uop.base + s = self + while len(s.src) and s.op not in {Ops.BUFFER, Ops.PARAM, Ops.STAGE, Ops.MSTACK}: s = s.src[0] + return s + + def contiguous_view_offset(self) -> int|None: + """If movement ops on a BUFFER collapse to a contiguous range, return `offset` in elements. Otherwise None.""" + from tinygrad.schedule.rangeify import pm_mops + from tinygrad.uop.symbolic import symbolic + + # WEBGPU and CL do not support views. + # WEBGPU requires that minUniformBufferOffsetAlignment be at least 32 bytes: https://gpuweb.github.io/gpuweb/#adapter-capability-guarantees + # CL 1.1 provides the clCreateSubBuffer API, but at the time of writing, relevant CL runtimes (rusticl, adreno, nvidia, amd) do not provide + # reasonable values for CL_DEVICE_MEM_BASE_ADDR_ALIGN. cl_ext_buffer_device_address could potentially help, but this extension is not provided + # by relevant CL runtimes at time of writing. + if (dev:=self.device) is not None and any(d.startswith(("WEBGPU", "CL")) for d in ((dev,) if isinstance(dev, str) else dev)): return None + + idx = self.flatten().index(UOp.range(self.numel(), 0)) + out = graph_rewrite(idx, pm_mops+symbolic+pm_contiguous_view_offset, ctx=self, name="contiguous_view_offset") + return out.val if out.op is Ops.CONST and isinstance(out.val, int) else None + + def has_buffer_identity(self, after_ok=False): + """Check if this UOp has a concrete buffer identity in the graph (RESHAPE/UNSHARD -> BUFFER chain).""" + # TODO: this is confusing because UOp.variable('v', 0, 1, dtypes.weakfloat) is True for jit to work, but it doesn't have a buffer + if self.op in {Ops.RESHAPE, Ops.UNSHARD, Ops.MSELECT}: return self.src[0].has_buffer_identity(after_ok) + if after_ok and self.op == Ops.AFTER: return self.src[0].has_buffer_identity(after_ok) + return self.op in {Ops.BUFFER, Ops.SLICE, Ops.PARAM} + + def _base_buffer_is_realized(self) -> bool: + """Walk through AFTER chain to find if the underlying buffer is realized (has allocated memory).""" + u = self.base + while u.op is Ops.AFTER: u = u.src[0] + return u.is_realized + + @property + def buffer(self) -> Buffer|MultiBuffer: + if self.op in {Ops.CONTIGUOUS, Ops.RESHAPE, Ops.UNSHARD, Ops.DETACH, Ops.AFTER}: return self.src[0].buffer + # this buffer can process disk tensors and simple movement ops + if self is not self.base: + buf = self.base.buffer + assert isinstance(buf, Buffer), "must be a Buffer for movement ops" + offset = self.contiguous_view_offset() + if offset is None: raise RuntimeError(f"non-contiguous view is not supported for {buf.device} buffer") + return buf.view(prod(self.max_shape), self.dtype, offset*self.dtype.itemsize) + if self.op is Ops.BITCAST: + buf = self.src[0].buffer + assert isinstance(buf, Buffer), "must be a Buffer for BITCAST" + return buf.view(prod(self.max_shape), self.dtype, 0) + if self.op is Ops.SLICE: + if (cret:=buffers.get(self)) is not None: return cret + buf = self.src[0].buffer + offset = self.src[1].val + if isinstance(buf, MultiBuffer): + mbuf = MultiBuffer.__new__(MultiBuffer) + mbuf.bufs = [b.view(self.arg, self.dtype, offset * self.src[0].dtype.itemsize) for b in buf.bufs] + buffers[self] = mbuf + return mbuf + assert isinstance(buf, Buffer), "must be a Buffer for SLICE" + buffers[self] = bv = buf.view(self.arg, self.dtype, offset * self.src[0].dtype.itemsize) + return bv + if self.op is Ops.MSELECT: + ret = self.src[0].buffer + assert isinstance(ret, MultiBuffer) + return ret.bufs[self.arg] + if self.op is Ops.MSTACK: + ret = MultiBuffer.__new__(MultiBuffer) + ret.bufs = [cast(Buffer, x.buffer) for x in self.src] + assert all_same([(x.size, x.dtype) for x in ret.bufs]), "multibuffers mismatch buffers" + return ret + assert self.op is Ops.BUFFER, f"must be BUFFER {self.op}" + if (cret:=buffers.get(self)) is not None: return cret + rdtype = self.dtype + if isinstance(self.device, tuple): ret = MultiBuffer(self.device, self.max_numel(), rdtype).ref(1) + else: ret = Buffer(self.device, self.max_numel(), rdtype).ref(1) + buffers[self] = ret + return ret + @property + def realized(self) -> Buffer|MultiBuffer|None: + if self.op is Ops.UNSHARD: return self.src[0].realized + # only these can be realized + if self.op not in (Ops.BUFFER, Ops.MSTACK): return None + # LOCAL/REG scratch buffers are never realized + if self.op is Ops.BUFFER and self.addrspace in (AddrSpace.LOCAL, AddrSpace.REG): return None + # an unbacked intermediate BUFFER (directly or as an MSTACK source) is not realized + if any(b.op is Ops.BUFFER and buffers.get(b) is None for b in self.backward_slice_with_self): return None + # NOTE: this is used by the JIT to determine which inputs we capture + return self.buffer if self.buffer.is_allocated() else None + @property + def is_realized(self) -> bool: return self.base.realized is not None + + # *** uop Variable stuff *** + + @staticmethod + def variable(name:str, min_val:PyConst, max_val:PyConst, dtype:DType=dtypes.weakint, multiple_of:int=1) -> UOp: + return UOp(Ops.PARAM, src=(shape_to_shape_arg(()),), + arg=ParamArg(-1, dtype, name=name, vmin_vmax=(min_val, max_val), multiple_of=multiple_of, addrspace=AddrSpace.ALU)) + @property + def expr(self) -> str: + assert self.op is Ops.PARAM + return unwrap(self.arg.name) + def bind(self, val:int|UOp): + assert self.op is Ops.PARAM and self.addrspace is AddrSpace.ALU, f"op is {self.op}, need PARAM" + uval = self.const_like(val) if isinstance(val, int) else val + assert self.vmin <= uval.vmin and uval.vmax <= self.vmax, f"bind {val} not in range [{self.vmin}, {self.vmax}]" + assert uval.divides(self.arg.multiple_of) is not None, f"bind {val} not divisible by {self.arg.multiple_of}" + return UOp(Ops.BIND, src=(self, uval)) + def unbind(self) -> tuple[Variable, int]: + assert self.op is Ops.BIND and self.src[0].op is Ops.PARAM and self.src[1].op is Ops.CONST, f"can't unbind {self}" + return self.src[0], self.src[1].val + def unbind_all(self) -> tuple[UOp, dict[Variable, int]]: + ret:dict[Variable, int] = {} + return graph_rewrite(self, pm_unbind, ctx=ret), ret + def variables(self) -> list[Variable]: + return sorted({x if x.op is Ops.PARAM else UOp.variable("_device_num", 0, x.vmax, dtype=x.dtype) + for x in self.backward_slice_with_self if (x.op is Ops.RANGE and x.arg[-1] is AxisType.DEVICE) or x.op is Ops.PARAM + and x.arg.addrspace is AddrSpace.ALU}, key=lambda v: v.expr) + + # *** uop symbolic stuff *** + + def const_factor(self) -> int: + """largest known int that divides self""" + # TODO: for negatives it's not the largest + if self.op is Ops.CONST: return self.val + if self.op is Ops.STACK: return math.gcd(*[x.const_factor() for x in self.src]) + if self.op is Ops.ADD: return math.gcd(self.src[0].const_factor(), self.src[1].const_factor()) + if self.op is Ops.MUL: return self.src[0].val if self.src[0].op is Ops.CONST else self.src[1].val if self.src[1].op is Ops.CONST else 1 + if self.op is Ops.PARAM and self.arg.multiple_of is not None: return self.arg.multiple_of + return 1 + def divides(self, v:int) -> UOp|None: + if v==1: return self + if self.op is Ops.CONST: return self.const_like(self.val//v) if self.val%v == 0 else None + if self.op is Ops.STACK: + srcs = tuple(s.divides(v) for s in self.src) + return None if any(s is None for s in srcs) else UOp(Ops.STACK, src=cast(tuple[UOp, ...], srcs)) + if self.op is Ops.ADD: return d0+d1 if (d0:=self.src[0].divides(v)) is not None and (d1:=self.src[1].divides(v)) is not None else None + if self.op is Ops.MUL: + if (d0:=self.src[0].divides(v)) is not None: return d0 * self.src[1] + if (d1:=self.src[1].divides(v)) is not None: return self.src[0] * d1 + if self.op is Ops.PARAM and self.arg.multiple_of is not None: return self // v if self.arg.multiple_of%v == 0 else None + return None # generic None if we aren't sure + def pop_const(self, op=Ops.ADD) -> tuple[UOp, PyConst]: # NOTE: assume Invalid ALU is resolved + return (self.src[0], self.src[1].val) if self.op is op and self.src[1].op is Ops.CONST else (self, identity_element(op, self.dtype)) + @staticmethod + def gcd(*uops: UOp) -> UOp: + terms, factors = zip(*[(u.divides(f:=u.const_factor()),f) for u in uops]) + count = functools.reduce(operator.and_, [collections.Counter(term.split_uop(Ops.MUL)) for term in terms]) + return math.prod([*count.elements(), terms[0].const_like(math.gcd(*factors))]) # put the const at the top + def divide_exact(self, v:UOp) -> UOp|None: + if self is v: return self.const_like(1) + if v.op is Ops.CONST: return self.divides(v.val) + if self.op is Ops.ADD: return None if (s0:=self.src[0].divide_exact(v)) is None or (s1:=self.src[1].divide_exact(v)) is None else s0+s1 + if self.op is Ops.MUL: + (fac, const), (div_fac, div_const) = self.pop_const(Ops.MUL), v.pop_const(Ops.MUL) + new_count = collections.Counter(fac.split_uop(Ops.MUL)) + new_count.subtract(div_fac.split_uop(Ops.MUL)) + if const%div_const==0 and all(v>=0 for v in new_count.values()): return math.prod(new_count.elements(), start=self.const_like(const//div_const)) + return None # generic None if we aren't sure + @property + def vmin(self) -> PyConst: return self._min_max[0] + @property + def vmax(self) -> PyConst: return self._min_max[1] + @functools.cached_property + def _min_max(self) -> tuple[PyConst, PyConst]: + if self.op in GroupOp.Binary and not dtypes.is_float(self.dtype): + (s0_vmin, s0_vmax), (s1_vmin, s1_vmax) = self.src[0]._min_max, self.src[1]._min_max + if self.op is Ops.ADD: return s0_vmin+s1_vmin, s0_vmax+s1_vmax + if self.op is Ops.SUB: return s0_vmin-s1_vmax, s0_vmax-s1_vmin + if self.op is Ops.AND and dtypes.is_int(self.dtype) and s1_vmin == s1_vmax >= 0: + return 0, s1_vmax if s0_vmin < 0 else min(s0_vmax, s1_vmax) + if self.op is Ops.MUL: return min(vals:=(s0_vmin*s1_vmin, s0_vmin*s1_vmax, s0_vmax*s1_vmin, s0_vmax*s1_vmax)), max(vals) + # SHL/SHR on consts only + if self.op is Ops.SHL and s1_vmin == s1_vmax and all_int(t:=(s0_vmin, s0_vmax, s1_vmin)): return t[0] << t[2], t[1] << t[2] + if self.op is Ops.SHR and s1_vmin == s1_vmax and all_int(t:=(s0_vmin, s0_vmax, s1_vmin)): return t[0] >> t[2], t[1] >> t[2] + if self.op is Ops.CMOD: + if (c:=s1_vmin) == s1_vmax > 0: + return (0 if s0_vmin > 0 else s0_vmin if 0 >= s0_vmin > -c else -(s1_vmax-1), 0 if s0_vmax < 0 else s0_vmax if 0 <= s0_vmax < c else c-1) + if s1_vmin > 0: return (0, s1_vmax-1) if s0_vmin >= 0 else (-(s1_vmax-1), 0) if s0_vmax <= 0 else (-(s1_vmax-1), s1_vmax-1) + if s1_vmax < 0: return (0, -s1_vmin-1) if s0_vmin >= 0 else (-(-s1_vmin-1), 0) if s0_vmax <= 0 else (-(-s1_vmin-1), -s1_vmin-1) + if self.op is Ops.CDIV: + assert isinstance(s0_vmin, int) and isinstance(s0_vmax, int) and isinstance(s1_vmin, int) and isinstance(s1_vmax, int) + if s1_vmin*s1_vmax>0: + return min(vals:=(cdiv(s0_vmin, s1_vmin), cdiv(s0_vmin, s1_vmax), cdiv(s0_vmax, s1_vmin), cdiv(s0_vmax, s1_vmax))), max(vals) + if self.op is Ops.FLOORDIV: + assert isinstance(s0_vmin, int) and isinstance(s0_vmax, int) and isinstance(s1_vmin, int) and isinstance(s1_vmax, int) + if s0_vmin > s0_vmax: return 0, 0 # numerator range is empty (e.g. RANGE with end=0) + if s1_vmin*s1_vmax>0: return min(vals:=(s0_vmin//s1_vmin, s0_vmin//s1_vmax, s0_vmax//s1_vmin, s0_vmax//s1_vmax)), max(vals) + if self.op is Ops.FLOORMOD: + assert isinstance(s0_vmin, int) and isinstance(s0_vmax, int) and isinstance(s1_vmin, int) and isinstance(s1_vmax, int) + if s0_vmin > s0_vmax: return 0, 0 # numerator range is empty (e.g. RANGE with end=0) + if (c:=s1_vmin) == s1_vmax > 0: return (s0_vmin%c, s0_vmax%c) if s0_vmin//c == s0_vmax//c else (0, c-1) + if (c:=s1_vmin) == s1_vmax < 0: return (s0_vmin%c, s0_vmax%c) if s0_vmin//c == s0_vmax//c else (c+1, 0) + if s1_vmin > 0: return (0, s1_vmax-1) + if s1_vmax < 0: return (s1_vmin+1, 0) + if self.op is Ops.XOR and s1_vmin == s1_vmax == -1 and isinstance(s0_vmin, int) and isinstance(s0_vmax, int): + return ~int(s0_vmax), ~int(s0_vmin) + if self.op is Ops.MAX: return max(s0_vmin, s1_vmin), max(s0_vmax, s1_vmax) + if self.op is Ops.CMPLT: return (s0_vmax str: + ctx: dict[UOp, str] = {} + from tinygrad.uop.render import renderer + pm = renderer if pm is None else pm + for u in (s:=self.simplify() if simplify else self).toposort(): + ctx[u] = cast(str, pm.rewrite(u, ctx=ctx)) + return ctx[s] + + def pyrender(self): + from tinygrad.uop.render import pyrender + return pyrender(self) + + # *** uop high level syntactic sugar *** + + @staticmethod + def placeholder(shape:tuple[int, ...], dtype:DType, slot:int, addrspace=AddrSpace.GLOBAL, device=None, volatile=False): + dtype = strong_dtype(dtype) # storage is never weak: a placeholder commits the width of what's put in it + if addrspace is AddrSpace.GLOBAL: + ret = UOp(Ops.PARAM, src=(shape_to_shape_arg((prod(shape),)),), arg=ParamArg(slot, dtype, addrspace=addrspace, device=device,volatile=volatile)) + else: + assert addrspace in (AddrSpace.LOCAL, AddrSpace.REG) + assert device is None, "LOCAL and REG placeholders cannot have a device" + ret = UOp(Ops.BUFFER, src=(shape_to_shape_arg((prod(shape),)),), arg=ParamArg(slot, dtype, addrspace=addrspace)) + if len(shape) > 1: ret = ret.reshape(shape) + return ret + def placeholder_like(self, slot:int, addrspace=AddrSpace.GLOBAL): + assert all_int(self.shape), "no placeholder-like on symbolic shape" + return UOp.placeholder(self.max_shard_shape, self.dtype, slot, addrspace) + + # set is store+end+after + def set(self:UOp, val:UOp|ConstType, end:UOp|tuple[UOp, ...]|list[UOp]=()) -> UOp: + return self.src[0].after(self.store(val).end(*argfix(end))) + + # TODO: this should replace placeholder + @staticmethod + def param(slot:int, dtype:DType, shape:tuple[sint, ...]|None=None, device=None, vmin_vmax:tuple[PyConst, PyConst]|None=None, + multiple_of:int|None=None, name=None, addrspace=AddrSpace.GLOBAL, axis:int|None=None, volatile:bool=False): + if dtype in dtypes.weaks: raise RuntimeError(f"cannot create param for weak dtype {dtype}") + if shape is not None and axis is not None and isinstance(device, tuple): + shape = tuple(s*len(device) if i == axis else s for i,s in enumerate(shape)) + src: tuple[UOp, ...] = (UOp(Ops.NOOP) if shape is None else shape_to_shape_arg(shape),) + return UOp(Ops.PARAM, src=src, arg=ParamArg(slot, dtype, vmin_vmax, multiple_of, name, addrspace, axis, device, volatile)) + def param_like(self, slot:int): + if self.op is Ops.BIND: return self.src[0].replace(arg=replace(self.src[0].arg, slot=slot, name=f"p{slot}")) + addrspace = self.addrspace if self.addrspace is not None else AddrSpace.GLOBAL + return UOp.param(slot, self.dtype, self.shard_shape if self.axis is not None else self._shape, self.device, addrspace=addrspace, axis=self.axis) + + @staticmethod + def custom_function(name:str, *src:UOp) -> UOp: return UOp(Ops.CUSTOM_FUNCTION, src=src, arg=name) + + # opaque bodies stay as Ops.CALL; value-producing bodies become Ops.FUNCTION (wrapped in TUPLE) + _OPAQUE_CALL_BODIES = {Ops.SINK, Ops.PROGRAM, Ops.LINEAR, Ops.COPY, Ops.SLICE, Ops.CUSTOM_FUNCTION} + def call(self, *srcs:UOp, ret_dtype:DType|None=None, grad_fxn:Callable|None=None, + name:str|None=None, precompile:bool=False, precompile_backward:bool=False, aux:Any=None) -> UOp: + if ret_dtype is not None: return UOp(Ops.CALL, ret_dtype, src=(self,)+srcs) + # calls are launched per device, so an open DEVICE range is allowed to cross the call boundary + assert all(r.arg[-1] is AxisType.DEVICE for r in self.ranges), \ + f"ranges {self.ranges} are leaking out of the call in {self.pyrender()}" + if self.op in UOp._OPAQUE_CALL_BODIES: + return UOp(Ops.CALL, src=(self,)+srcs, arg=CallInfo(grad_fxn, name, precompile, precompile_backward, aux)) + # value-producing bodies are always wrapped in TUPLE so FUNCTION dtype is always void + body = self if self.op is Ops.TUPLE else UOp.maketuple(self) + return UOp(Ops.FUNCTION, src=(body,)+srcs, arg=CallInfo(grad_fxn, name, precompile, precompile_backward, aux)) + def custom_kernel(*srcs:UOp, fxn:Callable, grad_fxn:Callable|None=None) -> list[UOp]: + placeholders = [UOp.placeholder_like(s, slot=i) for i,s in enumerate(srcs)] + kernel = fxn(*placeholders).call(*srcs, grad_fxn=grad_fxn) + return [s.after(kernel) for s in srcs] + + def to_elf(self) -> TinyELF: + assert self.op is Ops.PROGRAM and isinstance(self.arg, ProgramInfo), "to_elf should only be called on a PROGRAM ast" + sig = tuple((u.arg.name, u.arg.slot, u.dtype, u._shape) + for u in tuple(filter(lambda u: u.op is Ops.PARAM and u.addrspace != AddrSpace.ALU, self.src[1].src)) + self.arg.vars) + return TinyELF(self.src[3].arg, self.arg.function_name, self.arg.target, sig) + +@dataclass(frozen=True) +class KernelInfo: + name: str = "test" # name of the kernel + axis_types: tuple[AxisType, ...] = tuple() + dont_use_locals: bool = False # don't use local indexing + applied_opts: tuple = tuple() + opts_to_apply: tuple|None = None + estimates: Estimates|None = None + beam: int = 0 + @property + def function_name(self): return to_function_name(self.name) + +@dataclass(frozen=True) +class ProgramInfo: + name: str = "test" + global_size: tuple[int|float, ...] = (1, 1, 1) + local_size: tuple[int, ...]|None = None + vars: tuple[UOp, ...] = () + globals: tuple[int, ...] = () + outs: tuple[int, ...] = () + ins: tuple[int, ...] = () + target: Target = Target() + + @property + def function_name(self): return to_function_name(self.name) + + @property + def runtimevars(self) -> dict[str, int]: return {v.expr: i for i, v in enumerate(self.vars) if v.expr == 'core_id'} + + def launch_dims(self, var_vals:dict[str, int]) -> tuple[tuple[int, ...], tuple[int, ...]|None]: + global_size = tuple([sym_infer(sz, var_vals) for sz in self.global_size]) # type: ignore[arg-type] + local_size = tuple([sym_infer(sz, var_vals) for sz in self.local_size]) if self.local_size is not None else None + return global_size, local_size + + def vals(self, var_vals:dict[str, int]) -> tuple[int|None, ...]: + try: return tuple(var_vals[k.expr] if k.expr not in self.runtimevars else None for k in self.vars) + except KeyError as e: raise RuntimeError(f"unbound Variable {e} used by {self.function_name}") from None + + @staticmethod + def from_sink(sink:UOp, target:Target=Target()) -> ProgramInfo: + _vars: list[UOp] = [] + _globals: list[int] = [] + outs: list[int] = [] + ins: list[int] = [] + global_size: list[int] = [1, 1, 1] + local_size: list[int]|None = [1, 1, 1] + for u in sink.toposort(): + if u.op is Ops.PARAM and u.addrspace == AddrSpace.ALU: _vars.append(u) + if u.op is Ops.PARAM and u.addrspace != AddrSpace.ALU: _globals.append(u.arg.slot) + if u.op in (Ops.STORE, Ops.LOAD): + if (idx:=u.src[0]).op in (Ops.INDEX, Ops.SHRINK) or (u.src[0].op is Ops.CAST and (idx:=u.src[0].src[0]).op is Ops.INDEX): + if (buf:=idx.src[0].buf_uop).op is Ops.PARAM: (outs if u.op is Ops.STORE else ins).append(buf.arg.slot) + if u.op is Ops.SPECIAL: + if u.arg[0] == 'i': local_size = None + special_size = local_size if u.arg[0] == 'l' else global_size + if special_size is not None: special_size[int(u.arg[-1])] = cast(int, u.src[0].ssimplify()) + if u.op is Ops.PARAM and u in _vars and u.expr == 'core_id': global_size[0] = int(u.vmax) + 1 + return ProgramInfo(sink.arg.name if isinstance(sink.arg, KernelInfo) else "test", tuple(global_size), + tuple(local_size) if local_size is not None else None, tuple(sorted(dedup(_vars), key=lambda v: v.arg.slot)), + tuple(sorted(dedup(_globals))), tuple(sorted(dedup(outs))), tuple(sorted(dedup(ins))), target) + +@dataclass(frozen=True) +class CallInfo: + grad_fxn: Callable|None = None + name: str|None = None + precompile: bool = False + precompile_backward: bool = False + aux: Any = None + # grad_fxn can't be pickled + def __reduce__(self): return (CallInfo, (None, self.name, self.precompile, self.precompile_backward, self.aux)) + def __repr__(self): + gf = id(self.grad_fxn) if self.grad_fxn else None + return f"CallInfo({gf}, {repr(self.name)}, {self.precompile}, {self.precompile_backward})" + +# ******** ops in python ******** + +def safe_exp2(x): + try: return 2 ** x + except OverflowError: return math.inf + +def safe_pow(x, y): + try: return math.nan if isinstance(p:=pow(x, y), complex) else p + except ZeroDivisionError: return math.inf + except ValueError: return math.inf if x > 0 else -math.inf + +python_alu: dict[Ops, Callable] = { + Ops.LOG2: lambda x: math.log2(x) if x > 0 else -math.inf if x == 0 else math.nan, Ops.EXP2: safe_exp2, + Ops.SQRT: lambda x: math.sqrt(x) if x >= 0 else math.nan, Ops.RECIPROCAL: lambda x: 1/x if x != 0 else math.copysign(math.inf, x), + Ops.SIN: lambda x: math.sin(x) if not math.isinf(x) else math.nan, Ops.POW: safe_pow, + Ops.TRUNC: lambda x: math.trunc(x) if math.isfinite(x) else x, + Ops.NEG: operator.neg, Ops.ADD: operator.add, Ops.SUB: operator.sub, Ops.MUL: operator.mul, Ops.CMPNE: operator.ne, Ops.CMPLT: operator.lt, + Ops.XOR: operator.xor, Ops.OR: operator.or_, Ops.AND: operator.and_, Ops.SHR: operator.rshift, Ops.SHL: operator.lshift, Ops.MAX: max, + Ops.CMOD: cmod, Ops.CDIV: cdiv, Ops.FLOORDIV: floordiv, Ops.FLOORMOD: floormod, + Ops.MULACC: lambda x,y,z: (x*y)+z, Ops.WHERE: lambda x,y,z: y if x else z, Ops.CMPEQ: operator.eq} + +def exec_alu(op:Ops, dtype:DType, operands, truncate_output=True): + if any(isinstance(x, tuple) for x in operands): + count = max(len(x) for x in operands if isinstance(x, tuple)) + return tuple([exec_alu(op, dtype, [x[i] if isinstance(x, tuple) else x for x in operands]) for i in range(count)]) + if op in GroupOp.Binary and Invalid in operands: return Invalid + alu = python_alu[op](*operands) + if truncate_output and (truncate_fxn:=truncate.get(dtype)) is not None: return truncate_fxn(alu) + return alu + +# ***** pattern matcher ***** + +def get_location() -> tuple[str, int]: + frm = sys._getframe(1) + # skip over ops.py and anything in mixin + while frm.f_back is not None and not frm.f_back.f_code.co_filename.startswith(" DType: return self.match_dtype[0] if self.match_dtype is not None else dtypes.void + + def __reduce__(self): + return UPat, (self.op, self.match_dtype, self._in_src, self.arg, self.name, not self.strict_length, self.custom_early_reject, self.location, + self.is_any, self.match_tag) + def named(self, name:str): + return UPat(self.op, self.match_dtype, self._in_src, self.arg, name, not self.strict_length, self.custom_early_reject, tag=self.match_tag) + + @staticmethod + def any(*src): return UPat(src=src, is_any=True) + def or_casted(self, name:str|None=None): return UPat.any(self if name is None else self.named(name), UPat(Ops.CAST, name=name, src=(self,))) + def or_after(self, name:str|None=None): + return UPat.any(self if name is None else self.named(name), UPat(Ops.AFTER, name=name, src=(self,), allow_any_len=True)) + @staticmethod + @functools.cache + def var(name:str|None=None, dtype:DType|tuple[DType, ...]|None=None): return UPat(dtype=dtype, name=name) + @staticmethod + @functools.cache + def cvar(name:str|None=None, dtype:DType|tuple[DType, ...]|None=None, arg=None): return UPat(Ops.CONST, dtype, name=name, arg=arg) + @staticmethod + def const(b:ConstType, dtype:DType|tuple[DType, ...]|None=None): return UPat(Ops.CONST, dtype=dtype, arg=b) + + # lil helper + def f(self, op, **kwargs): return UPat(op, src=(self,), **kwargs) + + # copied from UOp + def sink(*srcs:UPat|None, **kwargs): # pylint: disable=no-self-argument + return UPat(Ops.SINK, src=tuple([x for x in srcs if x is not None]), **kwargs) + def index(self, *srcs:UPat|None, **kwargs): + return UPat(Ops.INDEX, src=(self,)+tuple(x for x in srcs if x is not None), **kwargs) + def cast(self, dtype=None, **kwargs): + if dtype is not None and self.match_dtype == (dtype,): return self + return UPat(Ops.CAST, dtype, (self,), **kwargs) + def bitcast(self, dtype=None): return UPat(Ops.BITCAST, dtype, (self,)) + def load(self, *src:UPat, **kwargs): return UPat(Ops.LOAD, src=(self,)+src, **kwargs) + def store(self, *src:UPat, **kwargs): return UPat(Ops.STORE, src=(self,)+src, **kwargs) + def reduce(self, *src:UPat, **kwargs): + arg = kwargs.pop('arg', None) + if isinstance(arg, Ops): arg = (arg, 0) + return UPat(Ops.REDUCE, self.match_dtype, src=(self,)+src, arg=arg, **kwargs) + def broadcast(self, **kwargs): return UPat(Ops.STACK, self.match_dtype, src=self, **kwargs) + def after(self, *src:UPat, **kwargs): return UPat(Ops.AFTER, self.match_dtype, (self,)+src, **kwargs) + def end(self, *src:UPat, **kwargs): return UPat(Ops.END, src=(self,)+src, **kwargs) + + def _broadcasted(self, y, reverse=False) -> tuple[UPat, UPat]: + y = self.ufix(y) + return (y, self) if reverse else (self, y) + def ufix(self, x): return UPat.cvar(arg=x) if not isinstance(x, UPat) else x + def __floordiv__(self, x): return self._binop(Ops.FLOORDIV, x, False) + def __rfloordiv__(self, x): return self._binop(Ops.FLOORDIV, x, True) + def mod(self, x, reverse=False): return self._binop(Ops.FLOORMOD, x, reverse) + def alu(self, op:Ops, *src:UPat): + asrc = (self,)+src + return UPat(op, dtypes.bool if op in {Ops.CMPLT, Ops.CMPNE} else asrc[-1].match_dtype, list(asrc) if op in GroupOp.Commutative else asrc) + + def match(self:UPat, uop:UOp, store:dict[str, UOp]) -> list[dict[str, UOp]]: + if self.is_any: return flatten([x.match(uop, store.copy()) for x in self.src[0]]) + if (self.op is not None and uop.op not in self.op) or \ + (self.name is not None and store.setdefault(self.name, uop) is not uop) or \ + (self.match_dtype is not None and uop.dtype not in self.match_dtype and uop.dtype.scalar() not in self.match_dtype) or \ + (self.arg is not None and self.arg != uop.arg) or \ + (self.match_tag is not None and uop.tag not in self.match_tag) or \ + (len(uop.src) < self.required_len) or \ + (self.strict_length and len(uop.src) != self.required_len): return [] + if self.src is None: return [store] + res: list[dict[str, UOp]] = [] + for vp in self.src: + stores, new_stores = [store.copy()], [] + for uu, vv in zip(uop.src, vp): + for s in stores: new_stores.extend(vv.match(uu, s)) + stores, new_stores = new_stores, [] + res.extend(stores) + return res + +def deconstruct_function(fxn:Callable) -> tuple: + new_globals = {k:v for k,v in fxn.__globals__.items() if k in fxn.__code__.co_names} + for co in fxn.__code__.co_consts: + if isinstance(co, types.CodeType): new_globals.update({k:v for k,v in fxn.__globals__.items() if k in co.co_names}) + # NOTE: optional round trip through pickle! + assert fxn.__closure__ is None, "closures are not supported in pattern matchers" + ret = fxn.__code__, new_globals, fxn.__name__, fxn.__defaults__ + return pickle.loads(pickle.dumps(ret)) if getenv("TEST_PICKLE") else ret + +@functools.cache +def upat_interpret(p:UPat, fxn:Callable) -> Callable: + real_fxn = types.FunctionType(*deconstruct_function(fxn)) + if 'ctx' in inspect.signature(real_fxn).parameters: + def universal_match(uop, ctx): + for match in p.match(uop, {}): + if (ret:=real_fxn(ctx=ctx, **match)) is not None: return ret # pylint: disable=not-callable + return None + else: + def universal_match(uop, _): + for match in p.match(uop, {}): + if (ret:=real_fxn(**match)) is not None: return ret # pylint: disable=not-callable + return None + return universal_match + +def upat_deferred_compile(p:UPat, fxn:Callable, entry:list) -> Callable: + def lazy_compile(uop, ctx): + from tinygrad.uop.upat import upat_compile + entry[1] = upat_compile(p, fxn) or upat_interpret(p, fxn) + return entry[1](uop, ctx) + return lazy_compile + +class PatternMatcher: + def __init__(self, patterns:Sequence[tuple[UPat, Callable|tuple]], compiled=bool(getenv("UPAT_COMPILE", 1))): + # if this comes from a pickle, we reconstruct the lambda functions here + self.patterns:list[tuple[UPat, Callable]] = [(p,types.FunctionType(*fxn) if isinstance(fxn, tuple) else fxn) for p,fxn in patterns] + # NOTE: use of DefaultDict here is very dangerous! all keys will live for the lifetime of the PatternMatcher! + self.pdict: dict[Ops, list[list]] = {} + # uop is required, arg is optional + for p,fxn in self.patterns: + assert p.op is not None + entry: list = [p, None, p.early_reject] + entry[1] = upat_deferred_compile(p, fxn, entry) if compiled else upat_interpret(p, fxn) + for uop in p.op: self.pdict.setdefault(uop, []).append(entry) + + def __reduce__(self): return PatternMatcher, ([(x,deconstruct_function(fxn) if fxn.__name__ == "" else fxn) for x,fxn in self.patterns],) + + @functools.cache # pylint: disable=method-cache-max-size-none + def __add__(self, more:PatternMatcher) -> PatternMatcher: return PatternMatcher(self.patterns+more.patterns) + + def rewrite(self, uop:UOp, ctx=None): + if len(pats:=self.pdict.get(uop.op, [])): + if (ler:=uop.__dict__.get('_src_ops')) is None: uop.__dict__['_src_ops'] = ler = {u.op for u in uop.src} + for _,match,early_reject in pats: + if not early_reject.issubset(ler): continue + if (ret:=match(uop, ctx)) is not None and ret is not uop: return ret + return None + +# *** tracking pattern matcher *** + +TRACK_MATCH_STATS = ContextVar("TRACK_MATCH_STATS", 2 if VIZ else 0) +REWRITE_STACK_LIMIT = ContextVar("REWRITE_STACK_LIMIT", 250000) +match_stats:dict[UPat, list[int|float]] = dict() + +# TRACK_MATCH_STATS>=2 or VIZ=1 saves all matches +ucount = itertools.count() +uop_fields:dict[int, tuple] = {} + +@dataclass(frozen=True) +class TrackedGraphRewrite: + loc:tuple[str, int] # location that called graph_rewrite + sink:int # the sink input to graph_rewrite + matches:list[tuple[int, int, tuple, float]] # before/after UOp, UPat location and time + name:str # name of the rewrite + depth:int # depth if it's a subrewrite + bottom_up:bool + walk:bool + enter_calls:bool + +tracked_keys:list[TracingKey] = [] +tracked_ctxs:list[list[TrackedGraphRewrite]] = [] +_name_cnt:dict[str, itertools.count] = {} + +if CAPTURE_PROCESS_REPLAY: + replay_capture: list[bytes] = [] + import atexit, uuid + @atexit.register + def save_to_diskcache(): + uid = uuid.uuid4() # one id per process + for i,v in enumerate(replay_capture): diskcache_put("process_replay", f"{uid}_{i}", v, prepickled=True) + +def add_trace_group(kt:TracingKey) -> None: + tracked_keys.append(kt) + tracked_ctxs.append([]) + +active_group:list[int] = [] +active_rewrites:list[TrackedGraphRewrite] = [] +def rewrite_group(name:Callable[..., str|TracingKey]|bool=True, replay:bool=False, new_ctx:bool=True): + if not new_ctx: assert not callable(name) and not replay, "name fxn and replay are only supported for new_ctx groups" + def _decorator(func): + def __wrapper(*args, **kwargs): + # without tracking, we just call the function (unless top-level, which always profiles) + if TRACK_MATCH_STATS < 2 and not new_ctx: return func(*args, **kwargs) + fn = key = func.__name__ + idx = -1 + if TRACK_MATCH_STATS >= 2: + if new_ctx: + add_trace_group(key:=TracingKey(n:=f"{fn} n{next(_name_cnt.setdefault(fn, itertools.count(1)))}", (n,))) + active_group.append(idx:=len(tracked_keys)-1) + else: + rewrite_name = str(kwargs.get("name", None) or fn) + assert args and isinstance(args[0], UOp), f"invalid match tracing inputs for {rewrite_name} with {args}" + loc = ((frm:=sys._getframe(1)).f_code.co_filename, frm.f_lineno) + depth = len(active_rewrites) + if not tracked_ctxs: add_trace_group(TracingKey(f"default {fn}")) + dest_group = active_group[-1] if active_group else len(tracked_ctxs)-1 + tracked_ctxs[dest_group].append(ctx:=TrackedGraphRewrite(loc, args[0].trace_num, [], rewrite_name, depth, kwargs.get("bottom_up", False), + kwargs.get("walk", False), kwargs.get("enter_calls", False))) + active_rewrites.append(ctx) + key = rewrite_name # profile spans are named after the rewrite step + with cpu_profile(key, "TINY") as e: + ret = func(*args, **kwargs) + if TRACK_MATCH_STATS >= 2: + if new_ctx: active_group.pop() + else: active_rewrites.pop() + if callable(name): + name_ret = name(*args, **kwargs, ret=ret) + assert isinstance(name_ret, (TracingKey, str)), f"name function returned {type(name_ret)}" + tracked_keys[idx] = k = TracingKey(n:=tracked_keys[idx].display_name.replace(fn, name_ret), (n,)) if isinstance(name_ret, str) else name_ret + e.name = TracingKey(k.display_name if isinstance(name_ret, str) else f"{fn} for {k.display_name}", k.keys) + if CAPTURE_PROCESS_REPLAY and replay: + # find the unittest frame we're capturing in + frm = sys._getframe(1) + while (f_back:=frm.f_back) is not None and "unittest" not in f_back.f_code.co_filename: frm = f_back + replay_loc = f"{frm.f_code.co_filename.split('/')[-1]}:{frm.f_lineno} {frm.f_code.co_name}" + # capture global context vars and all the args passed in + inputs = (fn, args, kwargs, ContextVar._cache) + replay_capture.append(pickle.dumps(inputs+(replay_loc, ret))) + return ret + return __wrapper + return _decorator + +class TrackedPatternMatcher(PatternMatcher): + def rewrite(self, uop:UOp, ctx=None): + if len(pats:=self.pdict.get(uop.op, [])): + ret = None + ler = {u.op for u in uop.src} + for p,match,early_reject in pats: + if p not in match_stats: match_stats[p] = [0,0,0.0,0.0] + st = time.perf_counter() + if not early_reject.issubset(ler): + match_stats[p][2] += time.perf_counter()-st + continue + match_stats[p][1] += 1 + try: ret = match(uop, ctx) + except Exception as e: + if TRACK_MATCH_STATS >= 2 and active_rewrites: + err_str = f"{type(e).__name__}\n{sys.exc_info()[1]}" + active_rewrites[-1].matches.append((uop.trace_num, UOp(Ops.REWRITE_ERROR, src=uop.src, arg=err_str).trace_num, p.location, 0)) + raise + if ret is not None and ret is not uop: + match_stats[p][0] += 1 + match_stats[p][3] += (et:=time.perf_counter()-st) + if TRACK_MATCH_STATS >= 3: print(f"{et*1e6:7.2f} us -- ", printable(p.location)) + if TRACK_MATCH_STATS >= 2 and isinstance(ret, UOp) and active_rewrites: + active_rewrites[-1].matches.append((uop.trace_num, ret.trace_num, p.location, et)) + return ret + match_stats[p][2] += time.perf_counter()-st + return None + +@dataclass(frozen=True) +class RewriteTrace: keys:list[TracingKey]; rewrites:list[list[TrackedGraphRewrite]]; uop_fields:dict[int, tuple] # noqa: E702 + +if TRACK_MATCH_STATS or PROFILE: + PatternMatcher = TrackedPatternMatcher # type: ignore + import atexit + @atexit.register + def print_match_stats(): + if TRACK_MATCH_STATS >= 2: + with open(fn:=temp("rewrites.pkl", append_user=True), "wb") as f: + print(f"rewrote {len(tracked_ctxs)} graphs and matched {sum(len(r.matches) for x in tracked_ctxs for r in x)} times, saved to {fn}") + pickle.dump(RewriteTrace(tracked_keys, tracked_ctxs, uop_fields), f) + TRACK_MATCH_STATS.value = 0 + launch_viz("REWRITE_DATA", temp("rewrites.pkl", append_user=True)) + if getenv("PRINT_MATCH_STATS", TRACK_MATCH_STATS.value and not VIZ): + ret = [0,0,0.0,0.0] + for k,v in sorted(list(match_stats.items()), key=lambda x: x[1][2]+x[1][3]): + loc_str = f"{k.location[0].split('/')[-1]}:{k.location[1]}" + if v[1] != 0: print(f"{v[0]:6d} / {v[1]:7d} -- {v[3]*1000.:9.2f} / {(v[2]+v[3])*1000.:9.2f} ms -- {loc_str:20s}", printable(k.location)) + ret = [x+y for x,y in zip(ret, v)] + print(f"{ret[0]:6d} / {ret[1]:7d} -- {ret[3]*1000.:9.2f} / {(ret[2]+ret[3])*1000.:9.2f} ms -- TOTAL") + print(f"{len(match_stats)} rules, {sum(v[0] > 0 for v in match_stats.values())} matched once") + + def launch_viz(env_str:str, data:str): + os.environ[f"{env_str}_DATA"] = data + if not TRACK_MATCH_STATS and not PROFILE: + os.environ["VIZ"], os.environ["PROFILE"], os.environ["TRACK_MATCH_STATS"] = "0", "0", "0" + args = ['--rewrites-path', os.getenv("REWRITE_DATA", "")] if os.getenv("REWRITE_DATA", "") else [] + args += ['--profile-path', os.getenv("PROFILE_DATA", "")] if os.getenv("PROFILE_DATA", "") else [] + viz_path = pathlib.Path(__file__).resolve().parent.parent / "viz" / "serve.py" + if VIZ > 0 and sys.stdout.isatty(): os.execv(sys.executable, [sys.executable, viz_path.as_posix()] + args) + if VIZ: print("saved viz files, view using: python -m tinygrad.viz.cli") + VIZ.value = 0 + +# *** simple graph rewrite engine *** + +# A pure Python sentinel, but *typed* as UOp so it fits all the dict annotations +SENTINEL: Final[UOp] = cast(UOp, object()) +class BottomUpGate(Exception): pass +class RewriteContext: + def __init__(self, pm, bpm, ctx=None, enter_calls=False): + self.pm: PatternMatcher|None = pm + self.bpm: PatternMatcher|None = bpm + self.bpm_cache: dict[UOp, UOp|None] = {} + self.ctx = ctx + self.replace: dict[UOp, UOp] = {} + self.enter_calls = enter_calls + + # no cache needed: pm_rewrite is called at most once per UOp due to the replace dict check in unified_rewrite + def pm_rewrite(self, x:UOp) -> UOp|None: return unwrap(self.pm).rewrite(x, self.ctx) + + def cached_bpm_rewrite(self, x:UOp) -> UOp|None: + if (ret:=self.bpm_cache.get(x,SENTINEL)) is not SENTINEL: return ret + ret = self.bpm_cache[x] = unwrap(self.bpm).rewrite(x, self.ctx) + return ret + + def walk_rewrite(self, root:UOp) -> UOp: + """MLIR-style Walk Pattern Rewrite Driver: single-pass, no re-traversal into rewritten subtrees.""" + stack: list[tuple[UOp, bool]] = [(root, False)] + while stack: + n, processed = stack.pop() + if n in self.replace: continue + if not processed: + # bottom-up: try bpm on original node first, if it rewrites, use result as-is (no traversal into replacement) + if self.bpm is not None and (rewritten:=self.cached_bpm_rewrite(n)) is not None: + self.replace[n] = rewritten + continue + # no rewrite, process children then come back to rebuild + stack.append((n, True)) + if not self.enter_calls and (n.op is Ops.FUNCTION or (n.op is Ops.CALL and n.src[0].op in UOp._OPAQUE_CALL_BODIES)): + self.replace[n.src[0]] = n.src[0] + for x in reversed(n.src): + if x not in self.replace: stack.append((x, False)) + else: + # rebuild node with rewritten srcs + new_src = tuple(self.replace.get(x, x) for x in n.src) + new_n = UOp(n.op, _rebuild_dtype(n, new_src), new_src, n.arg, n.tag) if new_src != n.src else n + # top-down: try pm on rebuilt node, use result as-is (no re-traversal) + if self.pm is not None and (rewritten:=self.pm_rewrite(new_n)) is not None: new_n = rewritten + self.replace[n] = new_n + return self.replace.get(root, root) + + def unified_rewrite(self, root:UOp) -> UOp: + stack: collections.deque[tuple[UOp, int, UOp]] = collections.deque([(root, 0, root)]) + on_stack = {root} # all UOps either on the stack or in self.replace, i.e. dont have to be placed again + waitlist: dict[UOp, list[tuple[UOp, int, UOp]]] = {} # UOps waiting on a dependency to be in self.replace + while stack: + if len(stack) > REWRITE_STACK_LIMIT: raise RuntimeError("infinite loop in graph_rewrite (stack too big)") + n, stage, new_n = stack.pop() + if n in self.replace: continue # skip any nodes we have seen + if stage == 0: + # if bottom up, we rewrite this node early. in both cases, we add its srcs to the stack + if self.bpm is not None: + # apply rewrite rules until a fixed point is reached. may return `uop` itself if PatternMatcher doesn't match + test_n: UOp|None = n + seen = set() + try: + while test_n is not None: + if test_n in seen: raise RuntimeError("infinite loop in fixed_point_rewrite") + seen.add(test_n) + new_n, test_n = test_n, self.cached_bpm_rewrite(test_n) + except BottomUpGate: + # if the bpm matching raised a gate, we are done with this node and dont continue down the srcs + self.replace[n] = unwrap(test_n) + if n in waitlist: stack.extend(waitlist.pop(n)) + continue + stack.append((n, 1, new_n)) + # NOTE: CALL/FUNCTION are handled as a special case. + # The function that is called is not included in the graph_rewrite. + # If you want to graph_rewrite a call, you can + # A CALL of an address is not a body, its srcs are regular dataflow + if not self.enter_calls and (new_n.op is Ops.FUNCTION or (new_n.op is Ops.CALL and new_n.src[0].op in UOp._OPAQUE_CALL_BODIES)): + self.replace[new_n.src[0]] = new_n.src[0] + for x in reversed(new_n.src): + if x in on_stack: continue + stack.append((x, 0, x)) + on_stack.add(x) + elif stage == 1: + tmp = [] + for x in new_n.src: + if (rx:=self.replace.get(x, SENTINEL)) is SENTINEL: + # source not ready: register in waitlist instead of spinning + waitlist.setdefault(x, []).append((n, 1, new_n)) + break + tmp.append(rx) + else: + # in stage 1, once all srcs are rewritten, rebuild (if changed) or run top-down rewrite + if (new_src:=tuple(tmp)) == new_n.src: + # if top down, do the rewrite. if no rewrite or bottom up, we are done rewriting this node so we add it to the dict + if self.pm is None or (new_src_n:=self.pm_rewrite(new_n)) is None: + self.replace[n] = new_n + if n in waitlist: stack.extend(waitlist.pop(n)) + continue + else: + # if srcs changed from rewrites, construct a new UOp with the new srcs + new_src_n = UOp(new_n.op, _rebuild_dtype(new_n, new_src), new_src, new_n.arg, new_n.tag) + # trigger a rewrite of new_src_n, then after that rewrite is done, link it back to n + stack.append((n, 2, new_src_n)) + stack.append((new_src_n, 0, new_src_n)) + else: + # in stage 2, we link the result of new_n to the result of n + if (replaced_new_n:=self.replace.get(new_n, SENTINEL)) is SENTINEL: + # not ready: register in waitlist instead of spinning + waitlist.setdefault(new_n, []).append((n, 2, new_n)) + else: + # otherwise we are done + self.replace[n] = replaced_new_n + if n in waitlist: stack.extend(waitlist.pop(n)) + return self.replace[root] + +@rewrite_group(new_ctx=False) +def graph_rewrite(sink:UOp, pm:PatternMatcher, ctx=None, bottom_up=False, name=None, bpm=None, walk=False, enter_calls=False) -> UOp: + rewrite_ctx = RewriteContext(pm if not bottom_up else None, pm if bottom_up else bpm, ctx, enter_calls) + return rewrite_ctx.walk_rewrite(sink) if walk else rewrite_ctx.unified_rewrite(sink) + +def _rebuild_dtype(n:UOp, new_src:tuple[UOp,...]) -> DType: + # TODO: delete this once the dtype field is removed, every rebuild will re-derive + if all(a.dtype is b.dtype or b.base.is_invalid for a,b in zip(n.src, new_src)): return n.dtype + return dtype_from_uop(n.op, new_src, n.arg) or n.dtype + +def sint_to_uop(x:sint, dtype=dtypes.weakint) -> UOp: return UOp.const(x, dtype) +def to_max_shape(shape:tuple[sint, ...]) -> tuple[int, ...]: return tuple(int(x.vmax) if isinstance(x, UOp) else x for x in shape) + +_substitute = PatternMatcher([(UPat(tuple(Ops), name="x"), lambda ctx,x: ctx.get(x,None))]) +_pm_resolve_params = PatternMatcher([(UPat(Ops.PARAM, name="p"), lambda ctx,p: ctx[p.arg.slot])]) +remove_all_tags = PatternMatcher([(UPat(GroupOp.All, name="x"), lambda x: x.replace(tag=None) if x.tag is not None else None)]) + +def gate_kernel_sink(x:UOp) -> bool: + if x.op is Ops.LINEAR: return False + if x.op is Ops.SINK and isinstance(x.arg, KernelInfo): return False + return True + +def do_unbind(ctx:dict[Variable, int], x:UOp): + v,i = x.unbind() + ctx[v] = i + return v +pm_unbind = PatternMatcher([(UPat(Ops.BIND, name="x"), do_unbind)]) + +# ctx is source UOp for which we are finding a contiguous view for. used in contiguous_view_offset +pm_contiguous_view_offset = PatternMatcher([ + (UPat(Ops.INDEX, src=(UPat(),)), lambda: UOp.const(0)), + (UPat(Ops.INDEX, src=(UPat(), UPat(Ops.RANGE))), lambda: UOp.const(0)), + (UPat(Ops.INDEX, src=(UPat(), UPat(Ops.RANGE)+UPat.cvar('c'))), lambda c: c), + (UPat(Ops.INDEX, src=(UPat(), UPat.cvar('c'))), lambda ctx, c: c if resolve(ctx.numel() == 1, False) else None), +]) + +# *** what was symbolic.py *** + +sint = int|UOp +Variable = UOp + +ConstLike = ConstType|Variable|tuple[ConstType, ...] diff --git a/artifacts/package_runtime/tinygrad/uop/render.py b/artifacts/package_runtime/tinygrad/uop/render.py new file mode 100644 index 000000000..03133e1ce --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/render.py @@ -0,0 +1,160 @@ +from tinygrad.dtype import AddrSpace, dtypes +from tinygrad.uop import Ops, GroupOp +from tinygrad.uop.ops import ParamArg, UOp, PatternMatcher, UPat, multirange_str, range_str, consumer_map_from_toposort +from tinygrad.helpers import strip_parens + +def pretty_print(x:UOp, cache=None, d=0)->str: + def dfs(x:UOp, cache:dict): + for s in x.src: + cache.setdefault(s, [len(cache), 0, False])[1] += 1 + if cache[s][1] == 1: dfs(s, cache) + if cache is None: dfs(x, cache:={}) + if (cx:=cache.setdefault(x, [0,0,False]))[2]: return f"{' '*d}x{cx[0]}" + cx[2], srcs = True, (''.join(f'\n{pretty_print(s, cache, d+2)},' for s in x.src)) + return f"{' '*d}{f'x{cx[0]}:=' * (cx[1]>1)}{type(x).__name__}({x.op}, {x.dtype}, arg={x.argstr()}{x.tagstr()}, src=({srcs}))" + +# ***** uop helpers ***** + +def print_uops(uops:list[UOp]): + uops_index = {u:i for i,u in enumerate(uops)} + for i,u in enumerate(uops): + formatted_srcs = [(uops_index[x] if x.op is not Ops.CONST else f"{x.val}") if x in uops else "--" for x in u.src] + print(f"{i:4d} {str(u.op):20s}: {multirange_str(u.ranges, color=True, pad=10)} {str(u.dtype):40s} " f"{str(formatted_srcs):32s} {u.arg}") + +# for debug +syms = { Ops.ADD: "+", Ops.SUB: "-", Ops.FLOORDIV: "//", Ops.FLOORMOD: "%", Ops.SHL: "<<", Ops.SHR: ">>", + Ops.MUL: "*", Ops.CMPLT: "<", Ops.CMPNE: "!=", Ops.AND: "&", Ops.OR: "|", Ops.XOR: "^"} +# comparison operators are not in here because they are chained in python, not left-associative +precedence = {Ops.MUL:1, Ops.FLOORDIV:1, Ops.FLOORMOD:1, Ops.ADD:2, Ops.SUB:2, Ops.SHL:3, Ops.SHR:3, Ops.AND:4, Ops.XOR:5, Ops.OR:6} +def strip_binary_parens(x:UOp, left:str, right:str, code_for_op) -> str: + if x.op not in precedence: return code_for_op(left, right) + return code_for_op(strip_parens(left) if precedence.get(x.src[0].op,99)<=precedence[x.op] else left, strip_parens(right) if + precedence.get(x.src[1].op,99) 1 else '')+(', dtype='+str(x.dtype) if x.dtype is not dtypes.weakint else '')+")"), + # TODO: index shouldn't mismatch dtype + (UPat(Ops.INDEX, src=(UPat(), UPat()), allow_any_len=True, name="x"), lambda ctx,x: + f"{ctx[x.src[0]]}.index({ctx[x.src[1]]}, "+''.join([f"{ctx[xx]}, " for xx in x.src[2:]])+ + f"dtype={x.dtype})" if x.src[0].dtype != x.dtype else None), + # TODO: movement ops simplify stuff, this can break SPEC=2 + #(UPat(GroupOp.Movement, name="x"), lambda ctx,x: f"{ctx[x.src[0]]}.{x.op.name.lower()}({render_marg(ctx,x)})"), + # NOTE: CMPNE doesn't work cause there's no __rne__ + # explicit trunc ops: `//` and `%` parse as FLOORDIV/FLOORMOD, so render CDIV/CMOD via .alu() + (UPat(Ops.CDIV, name="x"), lambda ctx,x: f"{ctx[x.src[0]]}.alu(Ops.CDIV, {ctx[x.src[1]]})"), + (UPat(Ops.CMOD, name="x"), lambda ctx,x: f"{ctx[x.src[0]]}.alu(Ops.CMOD, {ctx[x.src[1]]})"), + # `.where` re-promotes its operands, so render WHERE via .alu() too + (UPat(Ops.WHERE, name="x"), lambda ctx,x: f"{ctx[x.src[0]]}.alu(Ops.WHERE, {ctx[x.src[1]]}, {ctx[x.src[2]]})"), + # the binary operators re-promote their operands (a weak src meeting a strong one gets a cast), render those via .alu() too + (UPat(set(syms.keys())-{Ops.SUB, Ops.CDIV, Ops.CMOD}, name="x"), lambda ctx,x: + strip_binary_parens(x, ctx[x.src[0]], ctx[x.src[1]], lambda a,b: f"({a}{syms[x.op]}{b})") + if x.src[0]._broadcasted(x.src[1]) == x.src else f"{ctx[x.src[0]]}.alu({x.op}, {ctx[x.src[1]]})"), + (UPat(sugar, src=(), name="x"), lambda x: f"UOp.{x.op.name.lower()}("+', '.join(([f'arg={repr(x.arg)}'] if x.arg is not None else []))+")"), + (UPat(sugar, name="x"), lambda ctx,x: f"{ctx[x.src[0]]}.{x.op.name.lower()}("+', '.join([ctx[y] for y in x.src[1:]] + \ + ([f'arg={repr(x.arg)}'] if x.arg is not None else []))+")"), +]) + +# NOTE: you can remove pm_pyrender_extra and it'll still be correct +pm_pyrender = pm_pyrender_extra+PatternMatcher([ + (UPat(GroupOp.All, name="u"), lambda ctx,u: f"UOp({u.op}, {u.dtype}, {srcs(ctx,u.src)}"+(f", {repr(u.arg)})" if u.arg is not None else ")")), +]) + +def _render_with_splits(lst:list[UOp], pm:PatternMatcher, to_render:set[UOp], split_depth:int=100) -> dict[str, str]: + r: dict[UOp, str] = {} + ret: dict[str, str] = {} + depth: dict[UOp, int] = {} + for i,u in enumerate(lst): + # limit inline depth to avoid "too many nested parentheses" in Python parser + op_depth = 1 + max([depth.get(s, 0) for s in u.src], default=0) + if op_depth > split_depth: to_render.add(u) + depth[u] = 0 if u in to_render else op_depth + ren = pm.rewrite(u, ctx=r) + assert isinstance(ren, str) + if u.tag is not None: ren += f".rtag({repr(u.tag)})" + if u not in to_render: r[u] = ren + else: + r[u] = f"c{i}" if u is not lst[-1] else "ast" + ret[r[u]] = ren + return ret + +def pyrender(ast:UOp) -> str: + lst = list(ast.toposort()) + + cmap = consumer_map_from_toposort(lst) + not_rendered = {Ops.CONST} + always_rendered = {Ops.PARAM, Ops.LOAD, Ops.SPECIAL, Ops.RANGE, Ops.CONTIGUOUS, Ops.STACK, + Ops.BUFFER, Ops.COPY, Ops.CALL, Ops.FUNCTION, Ops.WHERE, Ops.END} + + to_render: set[UOp] = {ast} + for u in lst: + if u.op in {Ops.SINK}: + for s in u.src: to_render.add(s) + if u.op is Ops.STORE: to_render.add(u.src[1]) + if u.op is Ops.REDUCE: to_render.add(u.src[0]) + if u.op is Ops.FUNCTION or (u.op is Ops.CALL and u.src[0].dtype is dtypes.void): raise NotImplementedError("call can't be pyrendered") + if u.op in not_rendered: continue + # checking the consumers is not enough, you have to make sure it's not used twice by the one consumer + if len(cmap[u]) == 1 and len([x for x in list(cmap[u].keys())[0].src if x is u]) == 1 and u.op not in always_rendered: continue + to_render.add(u) + + ret = _render_with_splits(lst, pm_pyrender, to_render) + return '\n'.join([f"{k} = {strip_parens(v)}" for k,v in ret.items()]) diff --git a/artifacts/package_runtime/tinygrad/uop/spec.py b/artifacts/package_runtime/tinygrad/uop/spec.py new file mode 100644 index 000000000..a6af821b6 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/spec.py @@ -0,0 +1,278 @@ +import math +from typing import Any +from tinygrad.uop.ops import PatternMatcher, UPat, GroupOp, Ops, UOp, AxisType, KernelInfo, ParamArg +from tinygrad.uop.render import print_uops, pyrender +from tinygrad.dtype import DType, dtypes, AddrSpace, Invalid, ConstFloat +from tinygrad.helpers import DEBUG, Context, SPEC, Metadata, panic, CHECK_OOB, all_same, is_image_shape + +# ***** uop helpers ***** + +def validate_index(uidx:UOp, gate:UOp|None=None): + if len(uidx.src) != 2: return True # skip for non final index. TODO: check more complex index with shape + buf,idx = uidx.src + if idx.is_invalid: return True + if gate is None: gate = UOp.const(True) + # TODO: check for overflow + if not CHECK_OOB or is_image_shape(buf._shape): return True + + # buffer size + sz = buf.max_numel() + + # We can use UOp min/max to do a faster check, but it can give false positive since its not an exact bound and doesn't consider the mask + if 0<=idx.vmin and idx.vmax 1: test_pyrender(lst[-1]) # assume this is the sink + + with Context(TRACK_MATCH_STATS=0): + for i,u in enumerate(lst): + ret: bool|None = check_spec.rewrite(u) + if ret is not True: + if DEBUG >= 3: print_uops(lst) + raise RuntimeError(f"UOp verification failed at {i} on {u.op} {u.dtype} {len(u.src)} {[(x.op, x.dtype, x.arg) for x in u.src]} {u.arg}") + +# ***** new specs ***** +def matches_dtype(x:UOp, dtype:DType) -> bool: return x.dtype == dtype or x.base.is_invalid # Invalid matches any dtype +# these ops can be used in the tensor graph and programs +spec_shared = PatternMatcher([ + # NOTE: for testing, we let sinks be anything + (UPat(Ops.SINK, dtypes.void), lambda: True), + + # NOOP. TODO: remove this + (UPat(Ops.NOOP), lambda: True), + + # CONST is everywhere; Invalid is a bool const + (UPat(Ops.CONST, src=(), name="x"), lambda x: x.dtype is dtypes.bool if x.is_invalid else type(x.val) is type(x.dtype.const(x.val))), + + # STACK is everywhere too + (UPat(Ops.STACK, dtype=dtypes.void, src=()), lambda: True), + (UPat(Ops.STACK, src=(UPat(),), allow_any_len=True, name="s"), + lambda s: all_same([x.shape for x in s.src]) and all(matches_dtype(x, s.dtype) or x.dtype in dtypes.weaks for x in s.src)), + + # ALUs: operands match the result dtype, except comparisons/WHERE; renderer-lowered shifts may use a uint32 count + # a weak dtype matches any dtype until lowering commits its operand + (UPat(Ops.WHERE, name="w", src=(UPat(dtype=dtypes.bool), UPat(), UPat())), + lambda w: all(matches_dtype(s, w.dtype) or s.dtype in dtypes.weaks for s in w.src[1:])), + (UPat(GroupOp.Comparison, dtype=dtypes.bool, src=(UPat.var("x"), UPat.var("y"))), + lambda x,y: matches_dtype(x, y.dtype) or matches_dtype(y, x.dtype) or x.dtype in dtypes.weaks or y.dtype in dtypes.weaks), + (UPat((Ops.AND, Ops.OR, Ops.XOR, Ops.SHL, Ops.SHR), name="x"), lambda x: False if any(dtypes.is_float(s.dtype) for s in x.src) else None), + (UPat((Ops.SHL, Ops.SHR), src=(UPat.var("x"), UPat(dtype=dtypes.uint)), name="a"), lambda a,x: matches_dtype(x, a.dtype) or None), + (UPat((Ops.CDIV, Ops.CMOD, Ops.FLOORDIV, Ops.FLOORMOD), name="x"), lambda x: None if dtypes.is_int(x.dtype) else False), + (UPat(GroupOp.ALU, name="x"), lambda x: all(matches_dtype(y, x.dtype) or y.dtype in dtypes.weaks for y in x.src)), + + # CAST + (UPat((Ops.BITCAST, Ops.CAST), src=(UPat(),), name="x"), lambda x: isinstance(x.arg, DType)), + + # RANGE can be in the big graph now. a void RANGE is a bound-less loop header, the arg is an axis id like RANGE + (UPat(Ops.RANGE, src=(UPat.var("x"),), allow_any_len=True, name="rng"), lambda rng,x: + matches_dtype(x, rng.dtype) and isinstance(rng.arg, tuple) and len(rng.arg) >= 2 and \ + all(isinstance(ra, int) for ra in rng.arg[0:-1]) and isinstance(rng.arg[-1], AxisType)), + (UPat(Ops.INDEX, name="x"), lambda x: len(x.src)>0 and all(dtypes.is_int(y.dtype) or y.base.is_invalid for y in x.src[1:]) or None), + # END closes RANGEs + (UPat(Ops.END, src=(UPat(),), allow_any_len=True, name="x"), lambda x: all(u.op is Ops.RANGE for u in x.src[1:]) or None), + # a loop-ended END requires a trailing bool condition for the backedge (loop again while true) + (UPat(Ops.END, src=(UPat(), UPat(Ops.RANGE, dtypes.void), UPat(dtype=dtypes.bool))), lambda: True), + + # PARAM + (UPat(Ops.PARAM, name="x"), lambda x: isinstance(x.arg, ParamArg)), + (UPat(Ops.BUFFER, src=(UPat(),), name="x"), lambda x: + isinstance(x.arg, ParamArg) and x.addrspace in (AddrSpace.REG, AddrSpace.LOCAL)), + + # GROUP of stores (or groups, or NOOPs) + (UPat(Ops.GROUP, dtypes.void, src=UPat((Ops.GROUP, Ops.STORE, Ops.NOOP, Ops.INS, Ops.END))), lambda: True), + + # AFTER on Movement Op, PARAM, BUFFER, CONTIGUOUS, or another AFTER + (UPat(Ops.AFTER, src=(UPat(GroupOp.Movement.union({Ops.PARAM, Ops.BUFFER, Ops.CONTIGUOUS, Ops.INDEX, + Ops.AFTER, Ops.UNSHARD, Ops.BITCAST, Ops.INS})),), + allow_any_len=True, name="x"), lambda x: matches_dtype(x.src[0], x.dtype)), + + # CUSTOM (inline and non inline) + (UPat((Ops.CUSTOMI, Ops.CUSTOM)), lambda: True), + + # CALL of an external function + (UPat(Ops.CALL, src=(UPat(),), allow_any_len=True, name="x"), + lambda x: matches_dtype(x.src[0], dtypes.uint64) if x.src[0].dtype is not dtypes.void else None), + + # pattern compiler IR ops (not in tensor/program graphs, but spec-compliant) + (UPat(Ops.PYLITERAL), lambda: True), + + # BARRIER (on any length). TODO: this should only be in spec_program + (UPat(Ops.BARRIER, dtypes.void), lambda: True), + + # assembly instruction + (UPat(Ops.INS), lambda: True), + + # LOAD(idx) / STORE(idx, val) with gates on the LOAD/STORE + (UPat((Ops.INDEX, Ops.SHRINK), name="uidx").or_casted().load(), validate_index), + (UPat((Ops.INDEX, Ops.SHRINK), name="uidx").or_casted().load(UPat.var("alt"), UPat.var("gate", dtype=dtypes.bool), name="load"), + lambda uidx,gate,alt,load: validate_index(uidx, gate) if matches_dtype(alt, load.dtype) else False), + (UPat((Ops.INDEX, Ops.SHRINK), name="uidx").or_casted().store(UPat()), validate_index), + (UPat((Ops.INDEX, Ops.SHRINK), name="uidx").or_casted().store(UPat(), UPat.var("gate", dtype=dtypes.bool)), validate_index), + + # STORE in tensor graph: store a value into a target + (UPat(Ops.STORE, dtypes.void, (UPat(name="x"), UPat())), lambda x: True), + + # WMMA has a + (UPat(Ops.WMMA, src=(UPat(), UPat(), UPat()), name="x"), lambda x: isinstance(x.arg, tuple) and len(x.arg) == 5), +]) + +def is_device(d): return isinstance(d, str) or (isinstance(d, tuple) and all(isinstance(s, str) for s in d)) + +def valid_gettuple(g:UOp, t:UOp): return isinstance(g.arg, int) and 0 <= g.arg < len(t.src) and matches_dtype(t.src[g.arg], g.dtype) + +# these ops can exist in tensor but not programs. example: movement +spec_tensor = PatternMatcher([ + (UPat((Ops.SIN, Ops.LOG2, Ops.EXP2, Ops.SQRT, Ops.RECIPROCAL), src=(UPat(),), name="u"), lambda u: dtypes.is_float(u.dtype)), + + # BUFFER + (UPat(Ops.BUFFER, src=(UPat(),), name="buf"), lambda buf: + (isinstance(buf.dtype, DType) and matches_dtype(buf.src[0], dtypes.weakint) and is_device(buf.arg.device)) + if isinstance(buf.arg, ParamArg) and buf.addrspace is AddrSpace.GLOBAL else None), + + # Tensor variable bindings + (UPat(Ops.BIND, (dtypes.int, dtypes.long, dtypes.weakint,), (UPat(Ops.PARAM), UPat.cvar(dtype=(dtypes.int,dtypes.long,dtypes.weakint,))), arg=None), + lambda: True), + + # custom function + (UPat(Ops.CUSTOM_FUNCTION, name="x"), lambda x: isinstance(x.arg, str)), + + # CALL + (UPat(Ops.CALL, dtypes.void, src=(UPat((Ops.SINK, Ops.LINEAR, Ops.PROGRAM, Ops.COPY, Ops.CUSTOM_FUNCTION)),), allow_any_len=True), lambda: True), + + # FUNCTION + TUPLE must have void dtype, GETTUPLE can only appear on FUNCTION or TUPLE + (UPat(Ops.FUNCTION, dtypes.void, src=(UPat(Ops.TUPLE),), allow_any_len=True), lambda: True), + (UPat(Ops.TUPLE, dtypes.void), lambda: True), + (UPat(Ops.GETTUPLE, src=(UPat(Ops.FUNCTION, src=(UPat(Ops.TUPLE, name="t"),), allow_any_len=True),), name="g"), valid_gettuple), + (UPat(Ops.GETTUPLE, src=(UPat(Ops.TUPLE, name="t"),), name="g"), valid_gettuple), + + # SPECIAL is index before index lowering. custom_kernel currently has this + (UPat(Ops.SPECIAL, src=(UPat.var("x", dtypes.weakint),), name="s"), lambda s,x: matches_dtype(x, s.dtype) and isinstance(s.arg, str)), + + # movement ops + (UPat((Ops.RESHAPE, Ops.EXPAND), src=(UPat(), UPat())), lambda: True), + (UPat((Ops.PAD, Ops.SHRINK), src=(UPat(), UPat(), UPat()), name="x"), lambda x: x.src[1].shape == x.src[2].shape), + (UPat((Ops.PERMUTE, Ops.FLIP), name="mv", src=(UPat(),)), lambda mv: isinstance(mv.arg, tuple)), + + # REDUCE has arg=(op, num_axes), src[1:] are ranges after lowering + (UPat(Ops.REDUCE, src=(UPat(),), allow_any_len=True, name="x"), + lambda x: isinstance(x.arg, tuple) and len(x.arg) == 2 and x.arg[0] in GroupOp.Reduce + and isinstance(x.arg[1], int) and all(y.dtype in (dtypes.weakint, dtypes.int) for y in x.src[1:])), + + # COPY + (UPat(Ops.COPY, name="copy", src=(UPat.var("x"),)), lambda copy,x: matches_dtype(x, copy.dtype) and is_device(copy.arg)), + (UPat(Ops.ALLREDUCE, name="red", src=(UPat.var("x"),)), lambda red,x: matches_dtype(x, red.dtype) and isinstance(red.arg, tuple) and + len(red.arg) == 2 and red.arg[0] in GroupOp.Reduce and is_device(red.arg[1])), + + # UNSHARD/MSELECT/MSTACK + # an UNSHARD carries the value and one sharding range per sharded axis (usually a DEVICE RANGE, but can be a derived expression) + (UPat(Ops.UNSHARD, name="multi"), lambda multi: len(multi.src) == 1+len(multi.arg) and matches_dtype(multi.src[0], multi.dtype) + and all(isinstance(a, int) for a in multi.arg) and all(r.dtype in dtypes.weaks for r in multi.src[1:])), + (UPat(Ops.MSELECT, name="x"), lambda x: isinstance(x.src[0].device, tuple) and x.arg < len(x.src[0].device)), + (UPat(Ops.MSTACK, name="x"), lambda x: all(isinstance(s.device, str) for s in x.src) or (all_same(x.src) and x.src[0].device is None)), + + # CONTIGUOUS ensures the source UOp realizes + (UPat((Ops.DETACH, Ops.CONTIGUOUS, Ops.CONTIGUOUS_BACKWARD), name="root", src=(UPat.var("x"),), arg=None), + lambda root,x: matches_dtype(x, root.dtype)), + + # TODO: this should not be here. STAGE is transformed to BUFFER later + (UPat(Ops.STAGE, src=(UPat(),), allow_any_len=True), lambda: True), + + # codegen: PROGRAM with progressive sources through the pipeline (SINK, LINEAR?, SOURCE?, BINARY?) + (UPat(Ops.LINEAR, dtypes.void), lambda: True), + (UPat(Ops.SOURCE, dtypes.void, src=()), lambda: True), + (UPat(Ops.BINARY, dtypes.uint8, src=(), name="x"), lambda x: isinstance(x.arg, bytes)), + (UPat(Ops.PROGRAM, dtypes.void, src=(UPat(Ops.SINK),)), lambda: True), + (UPat(Ops.PROGRAM, dtypes.void, src=(UPat(Ops.SINK), UPat(Ops.LINEAR))), lambda: True), + (UPat(Ops.PROGRAM, dtypes.void, src=(UPat(Ops.SINK), UPat(Ops.LINEAR), UPat(Ops.SOURCE))), lambda: True), + (UPat(Ops.PROGRAM, dtypes.void, src=(UPat(Ops.SINK), UPat(Ops.LINEAR), UPat(Ops.SOURCE), UPat(Ops.BINARY))), lambda: True), +])+spec_shared + +# these ops can exist in programs but not the tensor spec. example: LOAD +spec_program = PatternMatcher([ + # index and weak dtypes are not allowed in programs + (UPat(GroupOp.All, (dtypes.weakint, dtypes.weakfloat)), lambda: False), + + # allow special SHRINK + (UPat(Ops.SHRINK, src=(UPat((Ops.PARAM, Ops.BUFFER, Ops.AFTER)), UPat(), UPat(Ops.CONST))), lambda: True), + + # movement ops are not allowed in programs + (UPat(GroupOp.Movement), lambda: False), + + # REG/LOCAL buffer + (UPat(Ops.BUFFER, name="x"), lambda x: isinstance(x.arg, ParamArg) and x.addrspace in (AddrSpace.REG, AddrSpace.LOCAL)), + + # Invalid is not allowed in program + (UPat(Ops.CONST, arg=Invalid), lambda: False), + + # if has a + (UPat(Ops.IF, dtype=dtypes.void, src=(UPat(dtype=dtypes.bool), UPat((Ops.CAST, Ops.INDEX, Ops.SHRINK)))), lambda: True), + (UPat(Ops.ENDIF, dtype=dtypes.void, src=(UPat(Ops.IF),)), lambda: True), + + # SPECIAL is int32 after index lowering + (UPat(Ops.SPECIAL, src=(UPat.var("x", dtypes.int32),), name="s"), lambda s,x: matches_dtype(x, s.dtype) and isinstance(s.arg, str)), +])+spec_shared + +spec_hcq = PatternMatcher([ + (UPat(Ops.GETADDR, dtypes.uint64, src=(UPat((Ops.BUFFER, Ops.PARAM)).or_after(),), name="x"), lambda x: is_device(x.arg)), + (UPat(Ops.PROGRAM, dtypes.void, src=(UPat((Ops.BUFFER, Ops.PARAM)).or_after(),)), lambda: True), +])+spec_shared + +# these are intermediate ops. everything should be deleted from here +spec_full = PatternMatcher([ + (UPat(Ops.REWRITE_ERROR, dtypes.void, name="x"), lambda x: isinstance(x.arg, str)), + + # SLICE on BUFFER is allowed if BUFFER is + (UPat(Ops.SLICE, src=(UPat(GroupOp.Movement.union({Ops.BUFFER, Ops.PARAM, Ops.STAGE, Ops.AFTER})), + UPat(Ops.CONST, dtype=dtypes.weakint)), allow_any_len=True, name="bv"), + lambda bv: isinstance(bv.arg, int)), + + (UPat(Ops.CALL, dtypes.void, src=(UPat((Ops.SLICE,)),), allow_any_len=True), lambda: True), + + # codegen may end ranges after gpudims has replaced RANGE with SPECIAL. + (UPat(Ops.END, src=(UPat(), UPat()), allow_any_len=True), lambda: True), + + # allow any AFTER + (UPat(Ops.AFTER, src=(UPat(),), allow_any_len=True), lambda: True), + + # all loads/stores + (UPat((Ops.LOAD, Ops.STORE)), lambda: True), + + # while BIND is being casted + (UPat(Ops.BIND, (dtypes.int, dtypes.weakint), (UPat(), UPat()), arg=None), lambda: True), +])+spec_tensor+spec_program+spec_hcq + +# **** pyrender (move this) **** + +# late imports to avoid circular import +from tinygrad.codegen.opt import Opt, OptOps +from tinygrad.schedule.rangeify import BufferizeOpts +glbls:dict[str, Any] = {"inf": math.inf, "nan": math.nan, "KernelInfo": KernelInfo, "Metadata": Metadata, + "UOp": UOp, "dtypes": dtypes, "Ops": Ops, "AxisType": AxisType, "Invalid": Invalid, + "Opt": Opt, "OptOps": OptOps, "BufferizeOpts": BufferizeOpts, "AddrSpace": AddrSpace, "panic": panic, + "ConstFloat": ConstFloat, "ParamArg": ParamArg} +def eval_pyrender(code:str) -> UOp: + lcls:dict[str, Any] = {} + exec(code, glbls, lcls) + return lcls['ast'] + +def test_pyrender(test_ast:UOp, assert_parents=True): + try: code = pyrender(test_ast) + except NotImplementedError: return None # this is okay, not all ops can be pyrendered + ast:UOp = eval_pyrender(code) + if ast is not test_ast: + if assert_parents: + for u in test_ast.toposort(): test_pyrender(u, assert_parents=False) + raise RuntimeError(f"PYRENDER ISSUE:\nSTR MATCH: {str(test_ast) == str(ast)}\nUOP:\n{test_ast}\nPRODUCED:\n{ast}\nCODE:\n{code}") + return code diff --git a/artifacts/package_runtime/tinygrad/uop/symbolic.py b/artifacts/package_runtime/tinygrad/uop/symbolic.py new file mode 100644 index 000000000..3e325dd3d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/symbolic.py @@ -0,0 +1,461 @@ +# all of symbolic lives here now +import math +from collections import defaultdict +from tinygrad.uop.ops import Ops, PatternMatcher, UPat, UOp, GroupOp, exec_alu +from tinygrad.dtype import PyConst, ConstType, dtypes, can_lossless_cast, Invalid, bitcast +from tinygrad.helpers import partition, all_same, prod, flatten, unwrap, IMAGE, dedup +from tinygrad.uop.divandmod import div_and_mod_symbolic +from tinygrad.uop.movement import mop_cleanup + +# TODO: symbolic shouldn't be importing from codegen +from tinygrad.codegen.decomp.transcendental import xpow + +# ******** phase 1 of symbolic used to live in ops, it's the most generic folding rules ******** + +def simplify_pow(x:UOp, c:UOp) -> UOp|None: + if c.val < 0: return x.reciprocal().pow(-c.val) + if c.val == 0: return x.const_like(1) + if int(c.val-0.5)+0.5 == c.val: return x.pow(c.val-0.5) * x.sqrt() + if int(c.val) == c.val: return (y := x.pow(c.val//2)) * y * (x if c.val%2 == 1 else 1) + return None + +def fold_bitcast(root:UOp, c:UOp) -> UOp|None: + if c.dtype.fmt is None or root.dtype.fmt is None or c.dtype.itemsize != root.dtype.itemsize: return None + return root.const_like(bitcast(c.val, c.dtype, root.dtype)) + +def const_arg(u:UOp) -> ConstType|tuple[ConstType, ...]|None: + if u.op is Ops.CONST: return u.val + if u.op is Ops.STACK and all(s.op is Ops.CONST for s in u.src): return tuple(s.val for s in u.src) + return None + +def fold_const_alu(a:UOp) -> UOp|None: + vals = [const_arg(s) for s in a.src] + return None if any(v is None for v in vals) else a.const_like(exec_alu(a.op, a.dtype, vals, False)) + +def _quotient_base(q:UOp, base:UOp, div:int) -> UOp|None: + # the B with q == B//div and B%div == base%div, or None. only such congruence is needed to recombine, and canonicalization + # moves consts freely: the quotient may be merged ((x//c + a)//div -> (x + a*c)//(c*div) for div>0) and shifted ((y + k*D)//D == y//D + k) + (q, s), (num, a) = q.pop_const(), base.pop_const() + if q.op is not Ops.FLOORDIV or q.src[1].op is not Ops.CONST: return None + if div > 0 and num.op is Ops.FLOORDIV and num.src[1].op is Ops.CONST and q.src[1].val == (c:=num.src[1].val)*div: num, a, D = num.src[0], a*c, c*div + elif q.src[1].val == div: D = div + else: return None + (x, xa), (p, pa) = num.pop_const(), q.src[0].pop_const() + if p is not x or (t:=xa + a - pa) % D: return None + return base - k*div if (k:=t//D - s) else base + +def fold_add_divmod_recombine(x:UOp) -> UOp|None: + # a scaled mod (base%div)*mul recombines with a partner q*(div*mul) carrying the quotient of a b == base (mod div): + # q == b//div -> b*mul (full recombine) + # q == (b//div)%d -> (b%(div*d))*mul (partial recombine into a wider mod, needs d>0) + terms = list(x.split_uop(Ops.ADD)) + for i,u in enumerate(terms): + mod, mul = u.pop_const(Ops.MUL) + if mod.op is not Ops.FLOORMOD or mod.src[1].op is not Ops.CONST: continue + base, div = mod.src[0], mod.src[1].val + for j,v in enumerate(terms): + q, scale = v.pop_const(Ops.MUL) + if i == j or scale != div*mul: continue + rest = [t for k,t in enumerate(terms) if k not in (i,j)] + if (b:=_quotient_base(q, base, div)) is not None: return (b*mul).usum(*rest) + if q.op is Ops.FLOORMOD and q.src[1].op is Ops.CONST and (d:=q.src[1].val) > 0 and (b:=_quotient_base(q.src[0], base, div)) is not None: + return ((b % (div*d))*mul).usum(*rest) + return None + +# Invalid poisons the value: ops move inside the gate so the Invalid reaches the LOAD/STORE and folds there. +# this needs to be before symbolic so that 0*something_that_might_be_invalid doesnt become 0 +invalid_pat = UPat(Ops.CONST, arg=Invalid, name="i") +invalid_gate = UPat.var("cond").where(UPat.var("x"), invalid_pat) +pm_data_invalid = PatternMatcher([ + (invalid_pat.broadcast(), lambda i: i), + (UPat(GroupOp.Unary|{Ops.CAST, Ops.BITCAST}, src=(invalid_pat,)), lambda i: i), + (UPat(GroupOp.Unary|{Ops.CAST, Ops.BITCAST}, src=(invalid_gate,), name="op"), + lambda cond,x,op,i: cond.where(op.replace(src=(x,)), i)), + # binary ops move inside the gate, with Invalid in the false branch + (UPat(GroupOp.Binary, src=(invalid_gate, UPat.var("y")), name="alu"), lambda cond,x,y,alu,i: cond.where(x.alu(alu.op,y), i)), + (UPat(GroupOp.Binary, src=(UPat.var("y"), invalid_gate), name="alu"), lambda cond,x,y,alu,i: cond.where(y.alu(alu.op,x), i)), + (UPat(GroupOp.Binary-GroupOp.Comparison, src=[invalid_pat, UPat()]), lambda i: i), + # an Invalid condition poisons the whole where; a gated Invalid condition lifts the gate out + (invalid_pat.where(UPat(), UPat()), lambda i: i), + (invalid_gate.where(UPat.var("a"), UPat.var("b")), lambda cond,x,i,a,b: cond.where(x.where(a,b), i)), + # normalize where(cond, Invalid, val) -> where(~cond, val, Invalid) + (UPat.var("cond").where(invalid_pat, UPat.var("val")), lambda cond, i, val: cond.logical_not().where(val, i) if not val.is_invalid else i), + # lift Invalid out: a.where(cond.where(x, Invalid), c) -> (~a|cond).where(a.where(x, c), Invalid) + (UPat.var("a").where(invalid_gate, UPat.var("c")), lambda cond,i,x,a,c: + (a.logical_not()|cond).where(a.where(x,c), i) if not c.is_invalid else None), + (UPat.var("a").where(UPat.var("b"), invalid_gate), lambda cond,i,x,a,b: (a|cond).where(a.where(b, x), i) if not b.is_invalid else None), + # fold gated LOAD/STORE + (UPat(Ops.STORE, src=(UPat(Ops.INDEX, src=(UPat(), invalid_pat), allow_any_len=True).or_casted(), UPat())), lambda i: UOp(Ops.NOOP)), + (UPat(Ops.LOAD, src=(UPat(Ops.INDEX, src=(UPat(), invalid_pat), allow_any_len=True).or_casted(),), allow_any_len=True, name="x"), + lambda x,i: x.src[1] if len(x.src) > 1 else x.const_like(0)), +]) + +pm_remove_invalid = PatternMatcher([ + (invalid_gate.named("w"), lambda cond,x,i,w: w.replace(src=(cond,x,w.const_like(0)))), + (UPat(Ops.STACK, name="s"), lambda s: s.replace(src=tuple(UOp.const(0, s.dtype) if x.is_invalid else x for x in s.src)) + if any(x.is_invalid for x in s.src) else None), +]) + +# the one rule that collapses the pair CAST(dt, CONST(v)) into a typed CONST +# TODO: delete this once CONST has no dtype +pm_fold_cast_const = PatternMatcher([(UPat(Ops.CAST, name="root", src=(UPat.cvar("c"),)), lambda root, c: root.const_like(c.val))]) + +symbolic_simple = pm_data_invalid + PatternMatcher([ + # ** self folding ** + (UPat.var("x") + 0, lambda x: x), # x+0 -> x + (UPat.var("x") * 1, lambda x: x), # x*1 -> x + (UPat.var("x", dtype=dtypes.ints+(dtypes.bool, dtypes.weakint)) ^ 0, lambda x: x), # x^0 -> x + (UPat.var("x") // UPat.var("x"), lambda x: x.const_like(1)), # x//x -> 1 + (UPat.var("x") // 1, lambda x: x), # x//1 -> x + (UPat.var("x") // -1, lambda x: -x), # x//-1 -> -x + ((UPat.var("x") ^ UPat.var("y")) ^ UPat.var("y"), lambda x,y: x), # (x^y)^y -> x + ((UPat.var() % UPat.var("y")).named("base") % UPat.var("y"), lambda base,y: base), # (x%y)%y = -> x%y (rewritten with base for speed) + # variations of (x%c)+(x//c)*c = x + (UPat(Ops.ADD, dtype=dtypes.weakint, name="x"), fold_add_divmod_recombine), + (UPat.var("x", dtype=dtypes.bool) & UPat.cvar("c"), lambda x,c: x if c.val else c), + (UPat.var("x", dtype=dtypes.bool) | UPat.cvar("c"), lambda x,c: c if c.val else x), + (UPat.var("x", dtype=dtypes.bool) != UPat.const(False, dtypes.bool), lambda x: x), # x != False -> x + (UPat(GroupOp.Idempotent, src=(UPat.var("x"), UPat.var("x"))), lambda x: x), + (UPat.var("x", dtype=dtypes.bool).logical_not().logical_not(), lambda x: x), + (UPat.var("x", dtype=dtypes.bool).where(UPat.const(True, dtypes.bool), UPat.const(False, dtypes.bool)), lambda x: x), + (UPat.var("x", dtype=dtypes.bool).where(UPat.const(False, dtypes.bool), UPat.const(True, dtypes.bool)), lambda x: x.logical_not()), + # CAST(bool -> int) != const — CAST(True)=1, CAST(False)=0, so fold based on const value + (UPat.var("x", dtype=dtypes.bool).cast(dtypes.ints+(dtypes.weakint,)) != UPat.cvar("c"), + lambda x,c: x if c.val == 0 else x.logical_not() if c.val == 1 else x.const_like(True)), + (UPat.var("x", dtype=dtypes.ints+(dtypes.bool, dtypes.weakint)).trunc(), lambda x: x), + # ** zero folding ** + (UPat.var("x") < UPat.var("x"), lambda x: x.const_like(False, dtypes.bool)), # x < x -> False + (UPat.var("x") % UPat.var("x"), lambda x: x.const_like(0)), # x%x -> 0 + (UPat.var("x") ^ UPat.var("x"), lambda x: x.const_like(0)), # x^x -> 0 + (UPat.var("x") & 0, lambda x: x.const_like(0)), # x&0 -> 0 + # (x&mask)>>k -> x>>k when mask only clears bits below k + ((UPat.var("x") & UPat.cvar("mask")) >> UPat.cvar("k"), + lambda x,mask,k: x >> k.val if mask.val | ((1 << k.val) - 1) == -1 else None), + ((UPat.var("x") & UPat.cvar("mask")) // UPat.cvar("c"), + lambda x,mask,c: x // c.val if c.val > 0 and c.val & (c.val-1) == 0 and mask.val | (c.val-1) == -1 else None), + (UPat.var("x", dtype=dtypes.ints+(dtypes.bool, dtypes.weakint)) != UPat.var("x"), + lambda x: x.const_like(False, dtypes.bool)), # x != x -> False (only ints) + # ** constant folding ** + (UPat(GroupOp.Unary, src=(UPat((Ops.CONST, Ops.STACK)),), name="a"), fold_const_alu), + # NOTE: THREEFRY(const,const) folds via its decomposition + (UPat(GroupOp.Binary-{Ops.THREEFRY}, src=(UPat((Ops.CONST, Ops.STACK)),)*2, name="a"), fold_const_alu), + (UPat(GroupOp.Ternary, src=(UPat((Ops.CONST, Ops.STACK)),)*3, name="a"), fold_const_alu), + # bool MUL is AND, ADD/MAX is OR. prevents other rules to rewrite bool ADD/MUL incorrectly + (UPat.var('x', dtype=dtypes.bool) * UPat.var('y', dtype=dtypes.bool), lambda x,y: x&y), + (UPat.var('x', dtype=dtypes.bool) + UPat.var('y', dtype=dtypes.bool), lambda x,y: x|y), + (UPat.var('x', dtype=dtypes.bool).maximum(UPat.var('y', dtype=dtypes.bool)), lambda x,y: x|y), + # *** div rules *** + (UPat.cvar('x', arg=0) / 0, lambda x: x.const_like(float('nan'))), # 0/0 -> nan + ((UPat.var("x") * 0) / 0, lambda x: x.const_like(float('nan'))), # (x*0)/0 -> nan + # can be wrong if x or x2 is 0 + (UPat.var("x") / UPat.var("x"), lambda x: x.const_like(1)), # x/x -> 1 + ((UPat.var("x") * UPat.var("x2")) / UPat.var("x2"), lambda x,x2: x), # (x*x2)/x2 -> x + # x*0 -> 0 or 0*x -> 0 + # if x is nan or inf it should render the nan value. + # NOTE: this can be wrong for loaded NaN + (UPat.var("x") * 0, lambda x: x.const_like(float("nan") if x.op is Ops.CONST + and isinstance(x.val, float) and (math.isnan(x.val) or math.isinf(x.val)) else 0)), + # *** cast/bitcast *** + (UPat((Ops.CAST, Ops.BITCAST), name="root"), lambda root: root.src[0] if root.dtype == root.src[0].dtype else None), + (UPat(Ops.BITCAST, name="root", src=(UPat.cvar("c"),)), fold_bitcast), + # b.cast(a).cast(b) -> b if a preserves all values in b + (UPat.var('x').cast(name="a").cast(name="b"), lambda x,a,b: x if x.dtype == b.dtype and can_lossless_cast(b.dtype, a.dtype) else None), + # bitcast twice + (UPat(Ops.BITCAST, name="b", src=(UPat.var('x').bitcast(),)), lambda x,b: x.bitcast(b.dtype)), + (UPat.var("x").cast(dtypes.bool), lambda x: x != 0), + # ** pow ** + (UPat.var("x").alu(Ops.POW, UPat.cvar("c")), simplify_pow), + # positive const ** x + (UPat.cvar("c").alu(Ops.POW, UPat.var("x")), lambda c,x: c if c.val == 1 else (x*math.log2(c.val)).exp2() if c.val > 0 else None), + # unpack a uint64 packed from two uint32 (threefry) + (((UPat.var(None, dtypes.uint64)<<32) | UPat.var('y', dtypes.uint32).cast(dtypes.uint64)).cast(dtypes.uint32), lambda y: y), + (((UPat.var('x', dtypes.uint32).cast(dtypes.uint64)<<32) | UPat.var(None, dtypes.uint32).cast(dtypes.uint64))>>32, + lambda x: x.cast(dtypes.uint64)), + # ** simple where folding ** + # a conditional with the same results either way is a noop, also fold const conditionals + (UPat.var().where(UPat.var("val"), UPat.var("val")), lambda val: val), + (UPat.cvar("gate").where(UPat.var("c0"), UPat.var("c1")), lambda gate, c0, c1: c0 if gate.val else c1), + # a.where(b.where(c, d), d) -> (a & b).where(c, d) + (UPat.var("a").where(UPat.var("b").where(UPat.var("c"), UPat.var("d")), UPat.var("d")), lambda a,b,c,d: (a&b).where(c,d)), + # a.where(c, b.where(c, d)) -> (a | b).where(c, d) + (UPat.var("a").where(UPat.var("c"), UPat.var("b").where(UPat.var("c"), UPat.var("d"))), lambda a,b,c,d: (a|b).where(c,d)), +])+mop_cleanup + +# ******** phase 2 builds on phase 1, it includes the old "symbolic", rules that match deeper ******** + +def lt_folding(x:UOp, c:int) -> UOp|None: + p, np = partition(x.split_uop(Ops.ADD), lambda u: u.const_factor() == 1) + if np and (d:=math.gcd(*[u.const_factor() for u in np], c)) > 1 and 0 <= sum(u.vmin for u in p) and sum(u.vmax for u in p) < d: + return unwrap(UOp.usum(*np).divides(d))<(c//d) + return None + +def canonicalize_simplex(X:UOp) -> UOp|None: + # (X := a0*x0 + a1*x1 + ...) > 0 is equivalent to x0 + x1 + ... > 0 if xi >= 0 and ai > 0 for ints. + # returns x0 + x1 + ... in such case, or None if not + changed, ret = False, [] + for u in X.split_uop(Ops.ADD): + # assumed the const is the last src of MUL + if u.op is Ops.MUL and u.src[1].op is Ops.CONST and u.src[1].val > 0: + changed = True + u = u.src[0] + if not (u.op in GroupOp.Irreducible and u.vmin >= 0): return None + ret.append(u) + return UOp.usum(*ret) if changed else None + +commutative = PatternMatcher([ + # ** COMMUTATIVE flipping (only for index) ** + # NOTE: this can break merging vector math by only flipping some of them + (UPat(GroupOp.Commutative, dtype=dtypes.weakint, name='x'), lambda x: + x.replace(src=x.src[::-1]) if x.src[1].tuplize < x.src[0].tuplize and not x.src[0].tuplize < x.src[1].tuplize else None), +]) + +def fold_where_closure(cond:UOp, t:UOp, f:UOp) -> UOp|None: + """in cond.where(t, f), cond is True within t and False within f""" + if cond not in t.bool_slice and cond not in f.bool_slice: return None + # INDEX gates are owned by the valid/store-coalescing machinery, leave them alone + if any(u.op_in_backward_slice_with_self(Ops.INDEX) for u in (cond, t, f)): return None + return cond.where(t.substitute({cond: cond.const_like(True)}), f.substitute({cond: cond.const_like(False)})) + +symbolic = symbolic_simple+commutative+PatternMatcher([ + # ** boolean algebra ** + # TODO: make a more general or folder like simplify_valid + (UPat.var("x", dtype=dtypes.bool) | UPat.var("x", dtype=dtypes.bool).logical_not(), lambda x: x.const_like(True)), # x|!x -> True + # ** combine terms ** + (UPat.var("x") * UPat.cvar("c0") + UPat.var("x") * UPat.cvar("c1"), lambda x,c0,c1: x*(c0+c1)), # (x*c0)+(x*c1) -> x*(c0+c1) + ((UPat.var("y") + UPat.var("x") * UPat.cvar("c0")) + UPat.var("x") * UPat.cvar("c1"), lambda x,y,c0,c1: y+x*(c0+c1)), + (UPat.var("x") + UPat.var("x") * UPat.cvar("c"), lambda x,c: x*(c+1)), # (x+x*c)-> x*(c+1) + ((UPat.var("y") + UPat.var("x")) + UPat.var("x") * UPat.cvar("c"), lambda x,y,c: y+x*(c+1)), + ((UPat.var("y") + UPat.var("x") * UPat.cvar("c")) + UPat.var("x"), lambda x,y,c: y+x*(c+1)), + (UPat.var("x") + UPat.var("x"), lambda x: x*2), # (x+x)-> x*2 + ((UPat.var("y") + UPat.var("x")) + UPat.var("x"), lambda y,x: y+x*2), + ((UPat.var("x") / UPat.var("x2")) / UPat.var("x3"), lambda x,x2,x3: x/(x2*x3) if x2 is not x3 else None), # (x/x2)/x3 -> x/(x2*x3) + (-1 * (UPat.var("x") + UPat.cvar("c")), lambda x,c: (-x)+(-c)), # -(x+c) -> -x + -c + (UPat.cvar("y") * (UPat.var("x", dtype=dtypes.weakint) + UPat.cvar("c")), lambda x,y,c: (y*x)+(y*c)), # y*(x+c) -> y*x + y*c + # ** where folding ** + (UPat.var("cond", dtype=dtypes.bool).logical_not().where(UPat.var("t"), UPat.var("f")), + lambda cond, t, f: cond.where(f,t) if not f.is_invalid else None), + # in cond.where(t, f), uses of cond fold to True within t and False within f + (UPat.var("cond", dtype=dtypes.bool).where(UPat.var("t"), UPat.var("f")), fold_where_closure), + # alu of two where with same conds can combine, only do if true branch or false branch is const + (UPat(GroupOp.Binary, name="alu", src=(UPat.var("c").where(UPat.var("t"), UPat.var("f")), UPat.var("c").where(UPat.var("tt"), UPat.var("ff")))), \ + lambda alu,c,t,tt,f,ff: c.where(t.alu(alu.op, tt), f.alu(alu.op, ff)) if t.op == tt.op == Ops.CONST or f.op == ff.op == Ops.CONST else None), + # if its a plus we add the associative variation too + ((UPat.var("y")+UPat.var("c").where(UPat.var("t"), UPat.var("f"))) + UPat.var("c").where(UPat.var("tt"), UPat.var("ff")), \ + lambda y,c,t,tt,f,ff: y+c.where(t+tt, f+ff) if t.op == tt.op == Ops.CONST or f.op == ff.op == Ops.CONST else None), + # complementary zero branches under the same condition select directly + (UPat.var("c").where(UPat.var("t"), 0) + UPat.var("c").where(0, UPat.var("f")), lambda c,t,f: c.where(t, f)), + # ALU/variable min==max -> CONST + (UPat({Ops.CMPLT, Ops.CMPNE, Ops.FLOORDIV, Ops.FLOORMOD, Ops.PARAM, Ops.BIND, Ops.SPECIAL}, name="x"), + lambda x: x.const_like(x.vmin) if x.vmin == x.vmax else None), + (UPat(Ops.RANGE, src=(UPat(Ops.CONST,)), name="x"), lambda x: x.const_like(x.vmin) if x.vmin == x.vmax else None), + # max folding + (UPat.maximum(UPat.var("x"), UPat.var("y")), lambda x,y: x if x.vmin >= y.vmax else y if x.vmax <= y.vmin else None), + # TODO: why does this rule break beautiful_mnist? + #((UPat.var("x")+UPat.var("z")).maximum(UPat.var("y")+UPat.var("z")), lambda x,y,z: x.maximum(y) + z), + # ** two stage ALU folding ** + *((UPat.var("x").alu(op, UPat.cvar("c1")).alu(op, UPat.cvar("c2")).named("f"), + lambda f,x,c1,c2: x.alu(f.op,c1.alu(f.op,c2))) for op in GroupOp.Associative), + ((UPat.cvar("c0") + UPat.var("x")) < UPat.cvar("c1"), lambda x,c0,c1: x<(c1-c0)), # c0 + x < c1 -> x < c1 - c0 + # (x//c1)//c2 -> x//(c1*c2) for c2>0 + ((UPat.var("x") // UPat.cvar("c1")) // UPat.cvar("c2"), lambda x,c1,c2: x//(c1*c2) if c2.vmin>0 else None), + # ** lt ** + # c0*x sign(c0)*x < ceil(c1/abs(c0)) + ((UPat.cvar("c0")*UPat.var("x", dtype=dtypes.weakint)) 0 else -x)<-(-c1.val//abs(c0.val)) if abs(c0.val) > 1 else None), + # x//d x0, and -> c*d 0 else (x>c.val*d.val) if d.val < 0 else None), + # ** move add/mul consts to end (NOTE: this is still happening before constant folding) ** + ((UPat.var("x") + UPat.cvar("c1")) + UPat.var("y"), lambda x,c1,y: (x+y)+c1 if y.op is not Ops.CONST else None), + ((UPat.var("x") * UPat.cvar("c1")) * UPat.var("y"), lambda x,c1,y: (x*y)*c1 if y.op is not Ops.CONST else None), + # *** rules from symbolic *** + # generic lt folding + (UPat.var("x", dtypes.weakint) 0. NOTE: not x < 1 means x > 0 + ((UPat.var("x", dtypes.weakint)<1).ne(True), lambda x: (newx<1).ne(True) if (newx:=canonicalize_simplex(x)) is not None else None), + # a range mod its own upper bound is just the range + (UPat(Ops.RANGE, src=UPat.var("end"), name="r")%UPat.var("end"), lambda r,end: r), + (UPat(Ops.RANGE, src=UPat.var("end"), name="r")//UPat.var("end"), lambda r,end: r.const_like(0)), + # cast/long folding + # if the intermediate cast doesnt narrow we can do it in one cast + (UPat.var('x').cast(name="a").cast(name="b"), lambda x,a,b: x.cast(b.dtype) if can_lossless_cast(x.dtype, a.dtype) else None), + (UPat.var('x', dtypes.ints+(dtypes.weakint,)).cast(dtypes.ints+(dtypes.weakint,), name="a").cast(name="b"), + lambda x,a,b: x.cast(b.dtype) if a.dtype.min<=x.vmin and x.vmax<=a.dtype.max else None), + # try to do math in int instead of long, keep weak const weak + (UPat(GroupOp.Binary, src=(UPat.var("x", dtypes.long), UPat.var("y", dtypes.long)), name="u"), lambda u,x,y: + (UOp.const(x.val) if x.op is Ops.CONST else x.cast(dtypes.int)).alu(u.op, + UOp.const(y.val) if y.op is Ops.CONST else y.cast(dtypes.int)).cast(u.dtype) + if not any(v.overflows(dtypes.int) for v in (u,x,y)) else None), + ((UPat.var("x", dtypes.weakint) + UPat.cvar("c")).cast(dtypes.sints, name="cast"), lambda x,c,cast:x.cast(cast.dtype)+cast.const_like(c.val)), + # only RANGE/IF/STORE/KERNEL have side effects + (UPat(Ops.AFTER, name="x"), lambda x: x.replace(src=(x.src[0],)+ + tuple(dedup(flatten([(y,) if y.op in {Ops.RANGE, Ops.STORE, Ops.CALL, Ops.FUNCTION, Ops.BARRIER, Ops.END, Ops.LINEAR, Ops.STAGE} + else y.src for y in x.src[1:]]))))), + # after with 1 src is just src[0] + (UPat(Ops.AFTER, src=(UPat.var("s"),)), lambda s: s), +])+div_and_mod_symbolic + +# ******** we take a small aside to "simplify_valid" to rewrite valids ******** + +def parse_valid(v:UOp) -> tuple[UOp, bool, int]|None: + # if it's X <= c, returns X, True, c + # if it's X >= c, returns X, False, c + + if v.op is Ops.CMPNE and v.src[1].op is Ops.CONST and v.src[1].val == 1 and (s0:=v.src[0]).op is Ops.CMPLT and dtypes.is_int(s0.src[0].dtype): + # (X < c).ne(True) -> X >= c + return s0.src[0], False, int(s0.src[1].vmin) + if v.op is Ops.CMPLT and dtypes.is_int(v.src[0].dtype): + # c < X -> X >= c+1 (a const on the left is a lower bound on the right) + if v.src[0].op is Ops.CONST: return v.src[1], False, int(v.src[0].val)+1 + # X < c -> X <= c-1 + return v.src[0], True, int((v.src[1]).vmax)-1 + return None + +def uop_given_valid(valid:UOp, uop:UOp, try_simplex=True) -> UOp: + # return simplified uop (might be the same as input) + + # first, parse valid into {expr: (lower_bound, upper_bound)} + bounds:defaultdict[UOp, list[PyConst|None]] = defaultdict(lambda: [None, None]) + for stmt in valid.split_uop(Ops.AND): + if (res:=parse_valid(stmt)) is None: continue + expr, is_upper, c = res + bounds[expr][int(is_upper)] = c + + # simplify uop given that valid is True + all_candidates = [] + for i,(expr,v) in enumerate(bounds.items()): + v0, v1 = (expr.vmin if v[0] is None else v[0], expr.vmax if v[1] is None else v[1]) + # try checking the whole clause + all_candidates.append((expr, UOp.variable(f"fake{i}", v0, v1, expr.dtype))) + + if try_simplex: + # every candidate is a set of constrained UOp based on valid, and if every item in a set simplifies the uop into a same output, we rewrite uop + candidates = [[all_candidates[-1]]] + if expr.op is Ops.ADD and v0 == 1 and all(u.op in GroupOp.Irreducible for u in expr.split_uop(Ops.ADD)): + # if the constraint is a simplex: X0 + X1 + ... > 0, we can check if all Xi > 0 simplify into the same output + candidates.append([(Xi, UOp.variable(f"fake{i}", 1, Xi.vmax, Xi.dtype)) for Xi in expr.split_uop(Ops.ADD)]) + + for candidate in candidates: + # if every branch in candidate gives the same simplified uop, we can rewrite the uop + if any(X not in uop.backward_slice_with_self for X,_ in candidate): continue # skip if a branch var isn't in uop + newuops = [uop.substitute({X:newX}).simplify().substitute({newX:X}).simplify() for X,newX in candidate] + if all_same(newuops): uop = newuops[0] + elif uop.op is Ops.STACK and len(uop.src) == 2: + if all_same([uops.src[0] for uops in newuops]): uop = uop.replace(src=(newuops[0].src[0], uop.src[1])) + if all_same([uops.src[1] for uops in newuops]): uop = uop.replace(src=(uop.src[0], newuops[0].src[1])) + + # try all the valids together (but only the whole expressions) + if (s_uop:=uop.substitute(sub_dict:=dict(all_candidates))) is not uop: + uop = s_uop.simplify().substitute({newX:X for X,newX in sub_dict.items()}).simplify() + return uop + +def _valid_priority(v: UOp, valids:list[UOp]) -> int: + # we want valid that's in other valids' parents to be first, so it's more likely the other valids get simplified + return 0 if (res:=parse_valid(v)) is None else sum(-1 for other in valids if res[0] in other.backward_slice_with_self) + +def simplify_valid(valid:UOp) -> UOp|None: + if valid.op_in_backward_slice_with_self(Ops.INDEX): return None # this should only be for indexing, skip if there's a INDEX + ret:list[UOp] = [] + valids = list(valid.split_uop(Ops.AND)) + valids = sorted(valids, key=lambda v: _valid_priority(v, valids)) + for stmt in dedup(valids): + if ret: stmt = uop_given_valid(UOp.uprod(*ret), stmt) + ret.append(stmt) + return UOp.uprod(*ret) if ret != valids else None + +# ******** phase 3 is the complete symbolic ******** + +def reduce_mul_chain(r:UOp) -> UOp|None: + if r.arg[0] not in {Ops.ADD, Ops.MAX}: return None + if r.dtype != r.src[0].dtype: return None + inside, outside = [], [] + for m in r.src[0].split_uop(Ops.MUL): + m_parents = m.backward_slice + if m not in r.src[1:] and all(r not in m_parents for r in r.src[1:]) and (r.arg[0] != Ops.MAX or m.vmin >= 0): outside.append(m) + else: inside.append(m) + if len(outside) == 0: return None + return r.replace(src=(prod(inside) if len(inside) else r.src[0].const_like(1),)+r.src[1:])*prod(outside) + +def drop_and_clauses(cond:UOp, x:UOp, i:UOp) -> UOp|None: + keep, drop = partition(cond.split_uop(Ops.AND), lambda c: any(r in x.ranges for r in c.ranges)) + return UOp.const(True).uprod(*keep).where(x, i) if drop else None +pm_drop_and_clauses = PatternMatcher([(invalid_gate, drop_and_clauses)]) + +# move conditions from where to load's valid, drop clauses already in load +def where_on_load(cond:UOp, buf:UOp, idx:UOp, or_cast:UOp) -> UOp|None: + where_clauses, load_valid = list(cond.split_uop(Ops.AND)), idx.get_valid() + in_load = set(load_valid.split_uop(Ops.AND)) + idx_index = {u for u in idx.backward_slice_with_self if u.op is Ops.INDEX} + # can move if: condition's ranges are subset of idx's ranges, and no data dependent INDEX (only idx's INDEX allowed) + def can_move(c:UOp) -> bool: + return c.ranges.keys() <= idx.ranges.keys() and all(u in idx_index for u in c.backward_slice_with_self if u.op is Ops.INDEX) + moved, keep = partition([c for c in where_clauses if c not in in_load], can_move) + if len(keep) == len(where_clauses): return None + idx = buf.index(idx.get_idx().valid(load_valid.uprod(*moved))) + ret_idx = idx.cast(or_cast.dtype) if or_cast.op is Ops.CAST else idx + return UOp.const(True).uprod(*keep).where(ret_idx, ret_idx.const_like(0)) + +# where after gated load becomes alt value, TODO: this is sort of duplicated with rules in devectorizer +pm_move_where_on_load = PatternMatcher([ + (UPat.var("cond").where(UPat.var("buf").index(UPat.var("idx")).or_casted("or_cast"), 0), where_on_load), + (UPat.var("cond").where(0, UPat.var("buf").index(UPat.var("idx")).or_casted("or_cast")), + lambda cond,buf,idx,or_cast: where_on_load(cond.logical_not(),buf,idx,or_cast)), +]) + +def gated_given_valid(cond:UOp, x:UOp, i:UOp) -> UOp|None: + if x.dtype is not dtypes.weakint: return None + # Skip if x contains DIV/MOD AND IMAGE mode is enabled -> image index e.g. openpilot + if IMAGE.value > 0 and x.op_in_backward_slice_with_self(Ops.CDIV, Ops.CMOD, Ops.FLOORDIV, Ops.FLOORMOD): return None + return cond.where(uop_given_valid(cond, x, try_simplex=False), i) + +pm_simplify_valid = PatternMatcher([ + # simplify valid + (UPat(Ops.AND, name="valid"), simplify_valid), + (invalid_gate, gated_given_valid), +]) + +# this is symbolic 2.0 +REMOVE_FROM_SINK_LIKE = {Ops.NOOP, Ops.STACK, Ops.SINK, Ops.GROUP} +pm_clean_up_group_sink = PatternMatcher([ + # clean up GROUP/SINK + (UPat(Ops.GROUP, src=(UPat.var("x"),)), lambda x: x), + (UPat((Ops.SINK, Ops.GROUP), name="root"), + lambda root: UOp(root.op, src=tuple(flatten(x.src if x.op in REMOVE_FROM_SINK_LIKE else (x,) for x in root.src)), arg=root.arg) + if any(x.op in REMOVE_FROM_SINK_LIKE for x in root.src) else None), +]) + +sym = symbolic+pm_simplify_valid+PatternMatcher([ + # reorder ALU/VECTORIZE + (UPat(GroupOp.ALU, src=(UPat(Ops.STACK, src=UPat(name='x')), UPat(Ops.STACK, src=UPat(name='y'))), name='alu'), + lambda x,y,alu: UOp(Ops.STACK, src=(UOp(alu.op, src=(x,y)),))), + # ** where ** + # push cast to branches + (UPat.var("s").where(UPat.var("a"), UPat.var("b")).cast().named("cast"), lambda s,a,b,cast: s.where(a.cast(cast.dtype), b.cast(cast.dtype))), + # ** pow ** + ((UPat(Ops.POW, name="p"), lambda p: xpow(*p.src))), + # ** load/store folding ** + (UPat.store(UPat(Ops.INDEX, name="index"), UPat.load(UPat(Ops.INDEX, name="index"))), lambda index: UOp(Ops.NOOP)), + (UPat.store(UPat(Ops.INDEX, name="index"), UPat.var("gate").where(UPat.var("alt"), + UPat.load(UPat(Ops.INDEX, name="index")))), + lambda index, gate, alt: UOp.store(index.src[0].index(index.src[1].valid(gate)), alt)), + # fold gated LOAD/STORE + (UPat(Ops.STORE, src=(UPat(), invalid_pat)), lambda i: UOp(Ops.NOOP)), + # store of where with invalid -> gated store + (UPat(Ops.STORE, src=(UPat(Ops.INDEX, name="index"), UPat.var("cond").where(UPat.var("val"), invalid_pat))), + lambda index, cond, val, i: UOp.store(index.src[0].index(index.src[1].valid(cond)), val)), + ((UPat.var("x") * UPat.var("x")).reciprocal(), lambda x: x.reciprocal()*x.reciprocal()), # 1/(x^c) -> (1/x)^c + ((UPat.var("x") * UPat.var("x") * UPat.var("x")).reciprocal(), lambda x: x.reciprocal()*x.reciprocal()*x.reciprocal()), + ((UPat.var("x") * UPat.cvar("c")).reciprocal(), lambda x,c: x.reciprocal()*c.reciprocal()), # 1/(x*c) -> (1/c)*(1/x) + (UPat.var("x") * ((1+UPat.var("x")).reciprocal().named("d")), lambda x,d: 1-d), # x*/(1+x) -> 1-1/(1+x) + (UPat.var("x") * ((1+UPat.var("x")).reciprocal().named("d")*UPat.var("y")), lambda x,y,d: y*(1-d)), + (UPat.var("x") * ((1+UPat.var("x")).reciprocal().named("d")+UPat.var("y")), lambda x,y,d: (1-d)+x*y), + # move const multiply after REDUCE (NOTE: the mul chain can do this, but only if it's a same dtype reduce) + ((UPat.var("x")*UPat.cvar("c")).reduce(arg=Ops.ADD, name="r", allow_any_len=True), lambda x,c,r: r.replace(src=(x,)+r.src[1:])*c.val), + # reduce mul chain, move muls after the reduce + (UPat(Ops.MUL).reduce(name="r", allow_any_len=True), reduce_mul_chain), + # ** combine terms (opinionated) ** + (-1 * (UPat.var("x") + UPat.var("y")), lambda x,y: (-x)+(-y)), # -(x+y) -> -x + -y + # (x+y)*c -> x*c+y*c. only for int, float has inf*0=nan issue + ((UPat.var("x", dtypes.weakint) + UPat.var("y")) * UPat.cvar("c"), lambda x,y,c: x*c+y*c), +])+pm_clean_up_group_sink diff --git a/artifacts/package_runtime/tinygrad/uop/upat.py b/artifacts/package_runtime/tinygrad/uop/upat.py new file mode 100644 index 000000000..9bbcab452 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/upat.py @@ -0,0 +1,171 @@ +from typing import Any, Callable +import itertools, inspect, functools, types +from tinygrad.helpers import partition, dedup, Context +from tinygrad.uop.ops import UPat, UOp, Ops, PatternMatcher, graph_rewrite, deconstruct_function + +class UPatCompileError(Exception): pass + +# **** UPat compiled **** +# This file builds an IR of match predicates and compiles them to Python source. +# Ops used: CUSTOM (format-string predicate over operands), CUSTOMI (inline string fragment), +# STORE (bind a matched UOp to a name), PYLITERAL (Python literal for CUSTOM operands), +# AND/OR (clause combininers). + +def _get_clause(self:UPat, base:UOp, depth=0) -> UOp: + if self.is_any: + assert len(self.src) == 1 + return UOp(Ops.AND, src=(UOp(Ops.OR, src=tuple(_get_clause(s, base, depth) for s in self.src[0])),)) + # build the and_clause for acceptance + and_clause:list[UOp] = [] + if self.op is not None: + if len(self.op) > 1: and_clause.append(UOp(Ops.CUSTOM, src=(base, UOp(Ops.PYLITERAL, arg=tuple(int(x) for x in self.op))), arg="{0}.op in {1}")) + else: and_clause.append(UOp(Ops.CUSTOM, src=(base,), arg="{0}.op == "+str(self.op[0].value))) + if self.arg is not None: + if isinstance(self.arg, int): and_clause.append(UOp(Ops.CUSTOM, src=(base,), arg="{0}.arg == "+str(int(self.arg)))) + else: and_clause.append(UOp(Ops.CUSTOM, src=(base, UOp(Ops.PYLITERAL, arg=self.arg)), arg="{0}.arg == {1}")) + if self.strict_length or self.required_len > 0: + and_clause.append(UOp(Ops.CUSTOM, src=(base,), arg=("len({0}.src)"+(" == " if self.strict_length else " >= ")+str(self.required_len)))) + if self.name is not None: and_clause.append(UOp(Ops.STORE, src=(UOp(Ops.CUSTOMI, arg=self.name), base))) + if self.match_dtype is not None: + if len(self.match_dtype) > 1: + and_clause.append(UOp(Ops.CUSTOM, src=(base, UOp(Ops.PYLITERAL, arg=tuple(self.match_dtype))), + arg="{0}.dtype in {1}")) + else: + and_clause.append(UOp(Ops.CUSTOM, src=(base, UOp(Ops.PYLITERAL, arg=self.match_dtype[0])), + arg="{0}.dtype == {1}")) + if self.match_tag is not None: + if len(self.match_tag) > 1: + and_clause.append(UOp(Ops.CUSTOM, src=(base, UOp(Ops.PYLITERAL, arg=tuple(self.match_tag))), arg="{0}.tag in {1}")) + else: and_clause.append(UOp(Ops.CUSTOM, src=(base, UOp(Ops.PYLITERAL, arg=self.match_tag[0])), arg="{0}.tag == {1}")) + if self.src is not None: + # single match + if len(self.src) == 1 and isinstance(self.src[0], tuple): + and_clause += [_get_clause(s, base.index(i), depth) for i,s in enumerate(self.src[0])] + # repeat match + elif len(self.src) == 1 and isinstance(self.src[0], itertools.repeat): + it = UOp(Ops.CUSTOMI, arg=f"ituop{depth}") + match = _get_clause(next(self.src[0]), it, depth+1) + and_clause.append(UOp(Ops.CUSTOM, src=(match, it, base), arg="all([{0} for {1} in {2}.src])")) + # multi match (fork) + elif len(self.src) > 1 and all(isinstance(x, tuple) for x in self.src): + fork_cond = [UOp(Ops.AND, src=tuple([_get_clause(s, base.index(i), depth) for i,s in enumerate(ss)])) for ss in self.src] + and_clause.append(UOp(Ops.OR, src=tuple(fork_cond))) + else: raise RuntimeError("broken") + return UOp(Ops.AND, src=tuple(and_clause)) if and_clause else UOp(Ops.CUSTOMI, arg="True") + +# *** pattern matcher *** + +def do_process_and(a:UOp) -> UOp|None: + found = False + new_src:list[UOp] = [] + or_clause:list[UOp] = [] + + # remove any nested ANDs, extract or clauses + for x in a.src: + if x.op is Ops.AND: + new_src.extend(x.src) + found = True + elif x.op is Ops.OR: or_clause.append(x) + else: new_src.append(x) + + # too big to compile + if len(or_clause) >= 4: raise UPatCompileError("too big to compile") + + # one or clause max + if len(or_clause) > 1: + # need the product of the or clauses + or_clause = [UOp(Ops.OR, src=tuple([UOp(Ops.AND, src=x) for x in itertools.product(*[x.src for x in or_clause])]))] + found = True + + # handle stores + stores, new_src = partition(new_src, lambda x: x.op is Ops.STORE) + if len(stores): + if len(or_clause): + # push stores to the top if we have an or_clause + assert len(or_clause) == 1 and all(x.op is Ops.AND for x in or_clause[0].src) + or_clause = [UOp(Ops.OR, src=tuple([x.replace(src=x.src+tuple(stores)) for x in or_clause[0].src]))] + found = True + else: + # check for duplicate stores + dict_stores: dict[UOp, UOp] = {} + for store in stores: + if store.src[0] in dict_stores: + # duplicate store is an identity compare + new_src.append(UOp(Ops.CUSTOM, src=(dict_stores[store.src[0]], store.src[1]), arg="{0} is {1}")) + found = True + else: + dict_stores[store.src[0]] = store.src[1] + # put the stores back + for k,v in dict_stores.items(): new_src.append(UOp(Ops.STORE, src=(k,v))) + + # reassemble, if there's any deduping to do, do it + if len(dretand:=dedup(new_src+or_clause)) != len(new_src)+len(or_clause): found = True + return UOp(Ops.AND, src=tuple(dretand)) if found else None + +# processor +pm_proc = PatternMatcher([(UPat(Ops.AND, name="a"), do_process_and)], compiled=False) + +# renderer +def wrap(ctx, x) -> UOp: + ctx[ret:=f"a{len(ctx)}"] = x.arg + return UOp(Ops.CUSTOMI, arg=ret) + +pm_renderer = PatternMatcher([ + (UPat(Ops.PYLITERAL, name="x"), wrap), + + # AND of CUSTOMI fragments inside a CUSTOM becomes a single CUSTOMI (joined with " and ") + (UPat(Ops.CUSTOM, src=(UPat(Ops.AND, src=UPat(Ops.CUSTOMI), name="x"), UPat(), UPat()), name="r"), + lambda r,x: r.replace(src=(UOp(Ops.CUSTOMI, arg="(" + ' and '.join(y.arg for y in x.src) + ")"),)+r.src[1:])), + + (UPat(Ops.CUSTOM, src=UPat(Ops.CUSTOMI), name="x"), lambda x: UOp(Ops.CUSTOMI, arg=x.arg.format(*[y.arg for y in x.src]))), + (UPat(Ops.INDEX, src=(UPat(Ops.CUSTOMI, name="x"), UPat(Ops.CONST, name="c")), name="g"), lambda x,c,g: x.replace(arg=x.arg+f".src[{c.val}]")) +], compiled=False) + +def _final_render(x:UOp, has_ctx:bool, depth=1) -> list[str]: + assert x.op is Ops.AND + and_pieces, store_pieces = [], [] + or_pieces: list[str] = [] + for s in x.src: + if s.op is Ops.OR: + assert len(or_pieces) == 0 and len(s.src) >= 1 + for ss in s.src: or_pieces.extend(_final_render(ss, has_ctx, depth+1)) + elif s.op is Ops.STORE: + assert s.src[0].op is Ops.CUSTOMI and s.src[1].op is Ops.CUSTOMI + store_pieces.append(f"{s.src[0].arg}={s.src[1].arg}") + elif s.op is Ops.CUSTOMI: and_pieces.append(s.arg) + else: raise UPatCompileError(f"can't compile this {s}") + # if we have an or, render it + if len(or_pieces): + assert len(store_pieces) == 0 + and_clause = ' and '.join(and_pieces) + return [f"{' '*depth}if {and_clause if len(and_clause) else 'True'}:"] + or_pieces + # if we don't, this is a final return + store_clause = ', '.join((["ctx=ctx"] if has_ctx else [])+store_pieces) + and_clause = ' and '.join(and_pieces + [f"(_ret:=_fxn({store_clause})) is not None"]) + return [f"{' '*depth}if {and_clause}: return _ret"] + +def _get_code(self:UPat, has_ctx:bool): + ret = _get_clause(self, UOp(Ops.CUSTOMI, arg="uop")) + try: + # TODO: this should be tracked in a "system" rewrite, not untracked or tracked with kernel + with Context(TRACK_MATCH_STATS=0): + ret = graph_rewrite(ret, pm_proc, name="process UPat") + dyn_lookup: dict[str, Any] = {} + out = graph_rewrite(ret, pm_renderer, ctx=dyn_lookup, name="compile UPat") + rendered = _final_render(out, has_ctx) + except UPatCompileError: + #print("FAILED", self, self.location) + return None + return '\n'.join([f"# match for {self.location}", "def compiled_match(uop, ctx):"] + rendered + [" return None"]), dyn_lookup + +@functools.cache +def upat_compile(self:UPat, fxn) -> Callable|None: + real_fxn = types.FunctionType(*deconstruct_function(fxn)) + code = _get_code(self, 'ctx' in inspect.signature(real_fxn).parameters) + if code is None: return None + code_str, dyn_lookup = code + globs = dyn_lookup.copy() + globs["_fxn"] = real_fxn + namespace: dict = {} + exec(code_str, globs, namespace) # pylint: disable=W0122 + return namespace["compiled_match"] diff --git a/artifacts/package_runtime/tinygrad/uop/validate.py b/artifacts/package_runtime/tinygrad/uop/validate.py new file mode 100644 index 000000000..d87fce5a3 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/validate.py @@ -0,0 +1,88 @@ +from typing import Callable +from tinygrad.uop.ops import PatternMatcher, UPat, GroupOp, Ops, UOp, python_alu +from tinygrad.dtype import dtypes, Invalid +from tinygrad.helpers import cpu_profile +import z3 + +# older versions of z3 dont have some operators like & overloaded +if z3.get_version() < (4, 12, 4, 0): + raise ImportError("bounds checking requires z3 >= 4.12.4, use CHECK_OOB=0 to disable, or \"pip install 'z3-solver>=4.12.4\"") + +# IDIV is truncated division but z3 does euclidian division (floor if b>0 ceil otherwise); mod by power of two sometimes uses Ops.AND +def z3_cdiv(a:z3.ArithRef, b:z3.ArithRef) -> z3.ArithRef:return z3.If((a<0), z3.If(0 z3.ArithRef: return z3.If(b > 0, a/b, (-a)/(-b)) +def z3_xor(a:z3.ExprRef, b:z3.ExprRef) -> z3.ExprRef: + if isinstance(a, z3.BoolRef): return a^b + # x ^ -1 = -(x+1), i.e. bitwise NOT + if isinstance(b, z3.IntNumRef) and b.as_long() == -1: return -(a+1) + if isinstance(a, z3.IntNumRef) and a.as_long() == -1: return -(b+1) + raise RuntimeError(f"z3 int XOR only supports XOR with -1, got {a=} {b=}") +def z3_and(a:z3.ExprRef, b:z3.ExprRef) -> z3.ExprRef: + if isinstance(a, z3.BoolRef): return a&b + if isinstance(a, z3.IntNumRef): a, b = b, a + if isinstance(b, z3.IntNumRef): + # x & (2^k-1) = x % 2^k and x & -(2^k) = x - x % 2^k for any x in two's complement + if (m:=b.as_long()+1) > 0 and m&(m-1) == 0: return a%m + if (m:=-b.as_long()) > 0 and m&(m-1) == 0: return a - a%m + raise RuntimeError(f"z3 int AND only supports 2**k-1 and -2**k masks, got {a=} {b=}") +z3_alu: dict[Ops, Callable[..., z3.ExprRef]] = python_alu | {Ops.CMOD: lambda a,b: a-z3_cdiv(a,b)*b, Ops.CDIV: z3_cdiv, Ops.FLOORDIV: z3_floordiv, + Ops.FLOORMOD: lambda a,b: a-z3_floordiv(a,b)*b, + Ops.SHR: lambda a,b: a/(2**b.as_long()), Ops.SHL: lambda a,b: a*(2**b.as_long()), + Ops.AND: z3_and, Ops.WHERE: z3.If, Ops.XOR: z3_xor, Ops.MAX: lambda a,b: z3.If(a tuple[z3.ArithRef, z3.BoolRef]: + return (s:=z3.Int(name, ctx=z3ctx)), (vmin <= s)&(s <= vmax) + +z3_renderer = PatternMatcher([ + (UPat.var("cond").where(UPat.var("x"), UPat(Ops.CONST, arg=Invalid)), lambda x,cond,ctx: (ctx[1][x], ctx[1][cond])), + # variables + (UPat(Ops.SPECIAL, name="x"), lambda x,ctx: create_bounded(x.arg, 0, ctx[1][x.src[0]]-1, ctx[0])), + (UPat(Ops.PARAM, name="x"), lambda x,ctx: create_bounded(x.arg.name, x.vmin, x.vmax, ctx[0])), + (UPat(Ops.RANGE, name="x"), lambda x,ctx: create_bounded(x.render(simplify=False), 0, ctx[1][x.src[0]]-1, ctx[0])), + # loads are variables bounded by the min/max of the dtype. non-pointer INDEX is also a LOAD + (UPat((Ops.LOAD, Ops.INDEX), dtypes.ints+(dtypes.weakint,), name="x"), lambda x,ctx: + create_bounded(f"load{len(ctx[1])}", x.dtype.min, x.dtype.max, ctx[0])), + (UPat((Ops.LOAD, Ops.INDEX), dtypes.bool), lambda ctx: (z3.Bool(f"load{len(ctx[1])}", ctx=ctx[0]), None)), + # constants + (UPat(Ops.CONST, arg=Invalid), lambda ctx: (z3.Int("Invalid", ctx=ctx[0]), None)), + (UPat(Ops.CONST, dtypes.ints+(dtypes.weakint,), name="x"), lambda x,ctx: (z3.IntVal(x.val, ctx=ctx[0]), None)), + (UPat(Ops.CONST, dtypes.bool, name="x"), lambda x,ctx: (z3.BoolVal(x.val, ctx=ctx[0]), None)), + # casts from floats create new variables + (UPat(Ops.CAST, dtypes.ints+(dtypes.weakint,), src=(UPat(dtype=dtypes.floats),), name="x"), lambda x,ctx: + create_bounded(f"cast{len(ctx[1])}", x.dtype.min, x.dtype.max, ctx[0])), + # A comparison between floats introduces a new bool variable + (UPat(GroupOp.Comparison, src=UPat(dtype=dtypes.floats)), lambda ctx: (z3.Bool(f"float_cmp{len(ctx[1])}", ctx=ctx[0]), None)), + # casts from bool/int to int/bool + (UPat(Ops.CAST, dtypes.ints+(dtypes.weakint,),src=(UPat.var("x", dtypes.bool),)), lambda x,ctx: (z3.If(ctx[1][x], 1, 0), None)), + (UPat(Ops.CAST, dtypes.ints+(dtypes.weakint,), src=(UPat.var("x", dtypes.ints+(dtypes.weakint,)),)), lambda x,ctx: (ctx[1][x], None)), + (UPat(Ops.CAST, dtypes.bool, name="x"), lambda x,ctx: (ctx[1][x.src[0]]!=0, None)), + (UPat(GroupOp.ALU, name="x"), lambda x,ctx: (z3_alu[x.op](*(ctx[1][s] for s in x.src)), None)), +]) + +def uops_to_z3(solver:z3.Solver, *uops: UOp) -> list[z3.ExprRef]: + # gate on upstream memory addressing, but keep INDEX as an unknown LOAD + lst = list(UOp.sink(*uops).toposort(gate=lambda x: x.op not in {Ops.AFTER, Ops.BUFFER, Ops.SHRINK} and \ + (x.dtype in dtypes.ints+(dtypes.bool, dtypes.weakint) or x.op is Ops.SINK)))[:-1] + z3map: dict[UOp, z3.ExprRef] = {} + for u in lst: + # NOTE: we skip STACK here, it can't actually be accessed + if u.op is Ops.STACK: continue + z3_rewritten: tuple[z3.ExprRef, z3.BoolRef|None]|None = z3_renderer.rewrite(u, ctx=(solver.ctx, z3map)) + if z3_rewritten is None: raise NotImplementedError(f"{u.op} is not supported by z3") + new_u, constraint = z3_rewritten + if constraint is not None: solver.add(constraint) + z3map[u] = new_u + assert all(u in z3map for u in uops), "UOp failed to rewrite to z3!" + return [z3map[u] for u in uops] + +def validate_index_with_z3(sz:int, idx:UOp, gate:UOp) -> bool: + solver = z3.Solver(ctx=z3.Context()) + z3_idx, z3_mask = uops_to_z3(solver, idx, gate) + solver.add(z3_mask) + with cpu_profile("validate index with z3", "TINY"): + match solver.check((z3_idx<0)|(sz<=z3_idx)): + case z3.unsat: return True + case z3.sat: print(f"# OUT OF BOUNDS ACCESS: at {solver.model()} INDEX not in 0 - {sz}\nconstraints = {solver}") + case z3.unknown: print(f"# UNKNOWN RESULT FROM Z3: {solver.reason_unknown()}\nconstraints = {solver}") + print(f"idx={idx.render(simplify=False)}") + print(f"mask={gate.render(simplify=False)}") + return False diff --git a/artifacts/package_runtime/tinygrad/uop/weak.py b/artifacts/package_runtime/tinygrad/uop/weak.py new file mode 100644 index 000000000..0b0e578ca --- /dev/null +++ b/artifacts/package_runtime/tinygrad/uop/weak.py @@ -0,0 +1,78 @@ +from dataclasses import replace +from tinygrad.dtype import dtypes, DType, AddrSpace, Invalid, least_upper_dtype, strong_dtype, weak_dtype +from tinygrad.helpers import unwrap +from tinygrad.uop.ops import UOp, UPat, Ops, PatternMatcher, GroupOp, graph_rewrite, dtype_from_uop + +def select_dtype(u:UOp): + if u.dtype is dtypes.weakfloat: return dtypes.default_float + return dtypes.long if u.overflows(dtypes.int32) else dtypes.int + +def lower_weak_node(u:UOp) -> UOp|None: + start, src = (1 if u.op is Ops.WHERE else 0), tuple(s.src[0] if s.op is Ops.CAST and s.dtype in dtypes.weaks else s for s in u.src) + if src == u.src or any(s.dtype in dtypes.weaks for s in src[start:]): return None + dt = strong_dtype(least_upper_dtype(select_dtype(u), *(s.dtype for s in src)) if u.op in GroupOp.Binary + else unwrap(dtype_from_uop(u.op, src, u.arg))) + return u.replace(dtype=None, src=src[:start]+tuple(s if s.base.is_invalid else s.cast(dt) for s in src[start:])).cast(u.dtype) + +pm_lower_weak = PatternMatcher([ + (UPat(Ops.CONST, dtype=dtypes.weaks, name="u"), lambda u: UOp.const(u.val, select_dtype(u)).cast(u.dtype)), + # two stacked weak casts are a weakint value used as weakfloat (or vice versa): resolve the inner one at the outer kind's default. + # a SINGLE weak cast is never rewritten here, each consumer absorbs it on its own edge (see lower_weak_srcs) + (UPat(Ops.CAST, dtype=dtypes.weaks, src=(UPat(Ops.CAST, dtype=dtypes.weaks, src=(UPat.var("x"),)),), name="u"), + lambda u,x: x.cast(select_dtype(u)).cast(u.dtype) if x.dtype not in dtypes.weaks else None), + # Binary can widen from the bounds, all other nodes derive from the lowered sources. + # a weakfloat Unary (sin/exp2/...) must resolve here, before the transcendental decomposition + (UPat(GroupOp.Binary|GroupOp.Unary|{Ops.WHERE, Ops.RANGE, Ops.STACK, Ops.SPECIAL}, name="u"), lower_weak_node), + (UPat(Ops.PARAM, dtype=dtypes.weakint, name="u"), + lambda u: u.replace(dtype=None, arg=replace(u.arg, dtype=select_dtype(u))).cast(dtypes.weakint) if u.addrspace == AddrSpace.ALU else None), +]) + +def lower_weak_srcs(ctx:dict[UOp, UOp]|None, u:UOp) -> UOp|None: + if ctx is None: ctx = {} + def lower(s:UOp) -> UOp: + if (r:=ctx.get(s)) is None: + r = graph_rewrite(s, pm_lower_weak) + # the consumer absorbs the cast on its own edge + ctx[s] = r = r.src[0] if r.op is Ops.CAST and r.dtype in dtypes.weaks else r + return r + # a comparison demands a common operand width: lower it whole so the Binary rule unifies its operands + ret = lower(u) if u.op in GroupOp.Comparison else u.replace(src=tuple(lower(s) if s.dtype in dtypes.weaks else s for s in u.src)) + return None if ret is u else ret + +def commit_weak(s:UOp, dt:DType) -> UOp: + # a bare weak CONST commits directly (the value stays mathematical, emission truncates), a weak non-const src takes the demand cast + return UOp.const(s.val, dt) if s.op is Ops.CONST else s.cast(dt) + +def commit_weak_srcs(u:UOp) -> UOp|None: + if not any(s.dtype in dtypes.weaks for s in u.src): return None + if (dt:=least_upper_dtype(*(s.dtype for s in u.src))) in dtypes.weaks: return None + # the root re-derives: a shift's dtype is its lhs's, so committing the lhs commits the node too + return u.replace(dtype=None, src=tuple(commit_weak(s, dt) if s.dtype in dtypes.weaks else s for s in u.src)) + +# runs in index lowering and in the decomps: a rule that mints a weak const commits it in the same rewrite, so none reaches the renderer +pm_commit_weak = PatternMatcher([ + (UPat(GroupOp.Broadcastable, name="u"), commit_weak_srcs), + # demand from the destination: a STORE's weak value commits at the destination's dtype + (UPat(Ops.STORE, src=(UPat(), UPat(dtype=dtypes.weaks)), allow_any_len=True, name="u"), + lambda u: u.replace(src=(u.src[0], commit_weak(u.src[1], u.src[0].dtype), *u.src[2:]))), +]) + +# a concrete CAST over a weak node states the width the value will live at. that width is a floor, never a narrowing +def cast_weak_srcs(c:UOp, u:UOp) -> UOp|None: + if c.dtype in dtypes.weaks or weak_dtype(c.dtype) is not u.dtype: return None + dt = least_upper_dtype(c.dtype, select_dtype(u)) + return u.replace(dtype=None, src=tuple(commit_weak(s, dt) if s.dtype in dtypes.weaks else s for s in u.src)).cast(c.dtype) + +pm_cast_weak = PatternMatcher([ + (UPat(Ops.CAST, name="c", src=(UPat(GroupOp.ALU, dtype=dtypes.weaks, name="u"),)), cast_weak_srcs), +]) + +pm_lower_index_dtype = pm_commit_weak+pm_cast_weak+PatternMatcher([ + (UPat(GroupOp.All, name="u"), + lambda ctx,u: lower_weak_srcs(ctx, u) if u.dtype not in dtypes.weaks and any(s.dtype in dtypes.weaks for s in u.src) else None), + # a valid index into an n-element buffer lives in [0,n): a gated long index narrows when n-1 fits int32 (out-of-gate wraps, discarded) + # TODO: more generic + (UPat((Ops.INDEX, Ops.SHRINK), src=(UPat.var("buf"), UPat.var("gate").where(UPat.var("idx", dtypes.long), UPat(Ops.CONST, arg=Invalid))), + allow_any_len=True, name="u"), + lambda u,buf,gate,idx: u.replace(src=(buf, idx.cast(dtypes.int).valid(gate))+u.src[2:]) if buf.max_numel()-1 <= dtypes.int32.max else None), +]) diff --git a/artifacts/package_runtime/tinygrad/viz/__init__.py b/artifacts/package_runtime/tinygrad/viz/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/highlight.min.js b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/highlight.min.js new file mode 100644 index 000000000..5442f21b9 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/highlight.min.js @@ -0,0 +1,1232 @@ +/*! + Highlight.js v11.10.0 (git: 366a8bd012) + (c) 2006-2024 Josh Goebel and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";function e(n){ +return n instanceof Map?n.clear=n.delete=n.set=()=>{ +throw Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{ +const a=n[t],i=typeof a;"object"!==i&&"function"!==i||Object.isFrozen(a)||e(a) +})),n}class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function t(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] +;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope +;class r{constructor(e,n){ +this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ +this.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{ +if(e.startsWith("language:"))return e.replace("language:","language-") +;if(e.includes(".")){const t=e.split(".") +;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") +}return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)} +closeNode(e){i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const s=(e={})=>{const n={children:[]} +;return Object.assign(n,e),n};class o{constructor(){ +this.rootNode=s(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const n=s({scope:e}) +;this.add(n),this.stack.push(n)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){ +return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), +n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +o._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e} +addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ +this.closeNode()}__addSublanguage(e,n){const t=e.root +;n&&(t.scope="language:"+n),this.add(t)}toHTML(){ +return new r(this,this.options).value()}finalize(){ +return this.closeAllNodes(),!0}}function c(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return b("(?=",e,")")} +function g(e){return b("(?:",e,")*")}function u(e){return b("(?:",e,")?")} +function b(...e){return e.map((e=>c(e))).join("")}function m(...e){const n=(e=>{ +const n=e[e.length-1] +;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} +})(e);return"("+(n.capture?"":"?:")+e.map((e=>c(e))).join("|")+")"} +function p(e){return RegExp(e.toString()+"|").exec("").length-1} +const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function h(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t +;let a=c(e),i="";for(;a.length>0;){const e=_.exec(a);if(!e){i+=a;break} +i+=a.substring(0,e.index), +a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], +"("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} +const f="[a-zA-Z]\\w*",E="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",w="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",N="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},k={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},x={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},O=(e,n,t={})=>{const i=a({scope:"comment",begin:e,end:n, +contains:[]},t);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const r=m("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:b(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},M=O("//","$"),A=O("/\\*","\\*/"),S=O("#","$");var C=Object.freeze({ +__proto__:null,APOS_STRING_MODE:k,BACKSLASH_ESCAPE:v,BINARY_NUMBER_MODE:{ +scope:"number",begin:N,relevance:0},BINARY_NUMBER_RE:N,COMMENT:O, +C_BLOCK_COMMENT_MODE:A,C_LINE_COMMENT_MODE:M,C_NUMBER_MODE:{scope:"number", +begin:w,relevance:0},C_NUMBER_RE:w,END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}}),HASH_COMMENT_MODE:S,IDENT_RE:f, +MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+E,relevance:0}, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},NUMBER_RE:y, +PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},QUOTE_STRING_MODE:x,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, +end:/\/[gimuy]*/,contains:[v,{begin:/\[/,end:/\]/,relevance:0,contains:[v]}]}, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const n=/^#![ ]*\// +;return e.binary&&(e.begin=b(n,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:n, +end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, +TITLE_MODE:{scope:"title",begin:f,relevance:0},UNDERSCORE_IDENT_RE:E, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:E,relevance:0}});function T(e,n){ +"."===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){ +n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function I(e,n){ +Array.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function L(e,n){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function B(e,n){ +void 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] +})),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={ +relevance:0,contains:[Object.assign(t,{endsParent:!0})] +},e.relevance=0,delete t.beforeMatch +},F=["of","and","for","in","not","or","if","then","parent","list","value"],z="keyword" +;function j(e,n,t=z){const a=Object.create(null) +;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ +Object.assign(a,j(e[t],n,t))})),a;function i(e,t){ +n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") +;a[t[0]]=[e,U(t[0],t[1])]}))}}function U(e,n){ +return n?Number(n):(e=>F.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ +console.error(e)},q=(e,...n)=>{console.log("WARN: "+e,...n)},H=(e,n)=>{ +P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) +},G=Error();function Z(e,n,{key:t}){let a=0;const i=e[t],r={},s={} +;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=p(n[e-1]) +;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=h(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=h(e.end,{joinWith:""})}})(e)}function Q(e){ +function n(n,t){ +return RegExp(c(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) +}class t{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,n){ +n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), +this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(h(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const n=this.matcherRe.exec(e);if(!n)return null +;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] +;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t +;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))), +n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){ +this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){ +const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex +;let t=n.exec(e) +;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{ +const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)} +return t&&(this.regexIndex+=t.position+1, +this.regexIndex===this.count&&this.considerAll()),t}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(r,s){const o=r +;if(r.isCompiled)return o +;[R,L,W,$].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), +r.__beforeBegin=null,[D,I,B].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +l=r.keywords.$pattern, +delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=j(r.keywords,e.case_insensitive)), +o.keywordPatternRe=n(l,!0), +s&&(r.begin||(r.begin=/\B|\b/),o.beginRe=n(o.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(o.endRe=n(o.end)), +o.terminatorEnd=c(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), +r.illegal&&(o.illegalRe=n(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{ +variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) +})),r.starts&&t(r.starts,s),o.matcher=(e=>{const n=new i +;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){ +return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{ +constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} +const J=t,Y=a,ee=Symbol("nomatch"),ne=t=>{ +const a=Object.create(null),i=Object.create(null),r=[];let s=!0 +;const o="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let p={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function _(e){ +return p.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" +;"object"==typeof n?(a=e, +t=n.ignoreIllegals,i=n.language):(H("10.7.0","highlight(lang, code, ...args) has been deprecated."), +H("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};O("before:highlight",r) +;const s=r.result?r.result:f(r.language,r.code,t) +;return s.code=r.code,O("after:highlight",s),s}function f(e,t,i,r){ +const l=Object.create(null);function c(){if(!O.keywords)return void A.addText(S) +;let e=0;O.keywordPatternRe.lastIndex=0;let n=O.keywordPatternRe.exec(S),t="" +;for(;n;){t+=S.substring(e,n.index) +;const i=N.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,O.keywords[a]);if(r){ +const[e,a]=r +;if(A.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith("_"))t+=n[0];else{ +const t=N.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0] +;e=O.keywordPatternRe.lastIndex,n=O.keywordPatternRe.exec(S)}var a +;t+=S.substring(e),A.addText(t)}function d(){null!=O.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof O.subLanguage){ +if(!a[O.subLanguage])return void A.addText(S) +;e=f(O.subLanguage,S,!0,M[O.subLanguage]),M[O.subLanguage]=e._top +}else e=E(S,O.subLanguage.length?O.subLanguage:null) +;O.relevance>0&&(C+=e.relevance),A.__addSublanguage(e._emitter,e.language) +})():c(),S=""}function g(e,n){ +""!==e&&(A.startScope(n),A.addText(e),A.endScope())}function u(e,n){let t=1 +;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue} +const a=N.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(S=i,c(),S=""),t++}} +function b(e,n){ +return e.scope&&"string"==typeof e.scope&&A.openNode(N.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(g(S,N.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,n),S="")),O=Object.create(e,{parent:{ +value:O}}),O}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n) +;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new n(e) +;e["on:end"](t,a),a.isMatchIgnored&&(i=!1)}if(i){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return m(e.parent,t,a)}function _(e){ +return 0===O.matcher.regexIndex?(S+=e[0],1):(D=!0,0)}function h(e){ +const n=e[0],a=t.substring(e.index),i=m(O,e,a);if(!i)return ee;const r=O +;O.endScope&&O.endScope._wrap?(d(), +g(n,O.endScope._wrap)):O.endScope&&O.endScope._multi?(d(), +u(O.endScope,e)):r.skip?S+=n:(r.returnEnd||r.excludeEnd||(S+=n), +d(),r.excludeEnd&&(S=n));do{ +O.scope&&A.closeNode(),O.skip||O.subLanguage||(C+=O.relevance),O=O.parent +}while(O!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length} +let y={};function w(a,r){const o=r&&r[0];if(S+=a,null==o)return d(),0 +;if("begin"===y.type&&"end"===r.type&&y.index===r.index&&""===o){ +if(S+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) +;throw n.languageName=e,n.badRule=y.rule,n}return 1} +if(y=r,"begin"===r.type)return(e=>{ +const t=e[0],a=e.rule,i=new n(a),r=[a.__beforeBegin,a["on:begin"]] +;for(const n of r)if(n&&(n(e,i),i.isMatchIgnored))return _(t) +;return a.skip?S+=t:(a.excludeBegin&&(S+=t), +d(),a.returnBegin||a.excludeBegin||(S=t)),b(a,e),a.returnBegin?0:t.length})(r) +;if("illegal"===r.type&&!i){ +const e=Error('Illegal lexeme "'+o+'" for mode "'+(O.scope||"")+'"') +;throw e.mode=O,e}if("end"===r.type){const e=h(r);if(e!==ee)return e} +if("illegal"===r.type&&""===o)return 1 +;if(R>1e5&&R>3*r.index)throw Error("potential infinite loop, way more iterations than matches") +;return S+=o,o.length}const N=v(e) +;if(!N)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const k=Q(N);let x="",O=r||k;const M={},A=new p.__emitter(p);(()=>{const e=[] +;for(let n=O;n!==N;n=n.parent)n.scope&&e.unshift(n.scope) +;e.forEach((e=>A.openNode(e)))})();let S="",C=0,T=0,R=0,D=!1;try{ +if(N.__emitTokens)N.__emitTokens(t,A);else{for(O.matcher.considerAll();;){ +R++,D?D=!1:O.matcher.considerAll(),O.matcher.lastIndex=T +;const e=O.matcher.exec(t);if(!e)break;const n=w(t.substring(T,e.index),e) +;T=e.index+n}w(t.substring(T))}return A.finalize(),x=A.toHTML(),{language:e, +value:x,relevance:C,illegal:!1,_emitter:A,_top:O}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:T, +context:t.slice(T-100,T+100),mode:n.mode,resultSoFar:x},_emitter:A};if(s)return{ +language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:A,_top:O} +;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{ +const n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)} +;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(x).map((n=>f(n,e,!1))) +;i.unshift(t);const r=i.sort(((e,n)=>{ +if(e.relevance!==n.relevance)return n.relevance-e.relevance +;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 +;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,l=s +;return l.secondBest=o,l}function y(e){let n=null;const t=(e=>{ +let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" +;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1]) +;return n||(q(o.replace("{}",t[1])), +q("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} +return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return +;if(O("before:highlightElement",{el:e,language:t +}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) +;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),p.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) +;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a) +;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,n,t)=>{const a=n&&i[n]||t +;e.classList.add("hljs"),e.classList.add("language-"+a) +})(e,t,r.language),e.result={language:r.language,re:r.relevance, +relevance:r.relevance},r.secondBest&&(e.secondBest={ +language:r.secondBest.language,relevance:r.secondBest.relevance +}),O("after:highlightElement",{el:e,result:r,text:a})}let w=!1;function N(){ +"loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(y):w=!0 +}function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} +function k(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +i[e.toLowerCase()]=n}))}function x(e){const n=v(e) +;return n&&!n.disableAutodetect}function O(e,n){const t=e;r.forEach((e=>{ +e[t]&&e[t](n)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +w&&N()}),!1),Object.assign(t,{highlight:h,highlightAuto:E,highlightAll:N, +highlightElement:y, +highlightBlock:e=>(H("10.7.0","highlightBlock will be removed entirely in v12.0"), +H("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{p=Y(p,e)}, +initHighlighting:()=>{ +N(),H("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +N(),H("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!s)throw n;K(n),i=c} +i.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&k(i.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete a[e] +;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, +listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:k, +autoDetection:x,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ +e["before:highlightBlock"](Object.assign({block:n.el},n)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ +e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)}, +removePlugin:e=>{const n=r.indexOf(e);-1!==n&&r.splice(n,1)}}),t.debugMode=()=>{ +s=!1},t.safeMode=()=>{s=!0},t.versionString="11.10.0",t.regex={concat:b, +lookahead:d,either:m,optional:u,anyNumberOfTimes:g} +;for(const n in C)"object"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t +},te=ne({});te.newInstance=()=>ne({});const ae=e=>({IMPORTANT:{scope:"meta", +begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ +scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, +FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, +ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} +}),ie=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],re=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),se=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),oe=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),le=["accent-color","align-content","align-items","align-self","alignment-baseline","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-end-end-radius","border-end-start-radius","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","cx","cy","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","empty-cells","enable-background","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","flood-color","flood-opacity","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","inset","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","kerning","justify-content","justify-items","justify-self","left","letter-spacing","lighting-color","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","marker","marker-end","marker-mid","marker-start","mask","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","scale","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","speak","speak-as","src","tab-size","table-layout","text-anchor","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-offset","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","vector-effect","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index"].sort().reverse(),ce=se.concat(oe).sort().reverse() +;var de="[0-9](_*[0-9])*",ge=`\\.(${de})`,ue="[0-9a-fA-F](_*[0-9a-fA-F])*",be={ +className:"number",variants:[{ +begin:`(\\b(${de})((${ge})|\\.)?|(${ge}))[eE][+-]?(${de})[fFdD]?\\b`},{ +begin:`\\b(${de})((${ge})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${ge})[fFdD]?\\b`},{begin:`\\b(${de})[fFdD]\\b`},{ +begin:`\\b0[xX]((${ue})\\.?|(${ue})?\\.(${ue}))[pP][+-]?(${de})[fFdD]?\\b`},{ +begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${ue})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};function me(e,n,t){return-1===t?"":e.replace(n,(a=>me(e,n,t-1)))} +const pe="[A-Za-z$_][0-9A-Za-z$_]*",_e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],he=["true","false","null","undefined","NaN","Infinity"],fe=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Ee=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],ye=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],we=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],Ne=[].concat(ye,fe,Ee) +;function ve(e){const n=e.regex,t=pe,a={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const t=e[0].length+e.index,a=e.input[t] +;if("<"===a||","===a)return void n.ignoreMatch();let i +;">"===a&&(((e,{after:n})=>{const t="e+"\\s*\\(")), +n.concat("(?!",v.join("|"),")")),t,n.lookahead(/\s*\(/)), +className:"title.function",relevance:0};var v;const k={ +begin:n.concat(/\./,n.lookahead(n.concat(t,/(?![0-9A-Za-z$_(])/))),end:t, +excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},x={ +match:[/get|set/,/\s+/,t,/(?=\()/],className:{1:"keyword",3:"title.function"}, +contains:[{begin:/\(\)/},f] +},O="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",M={ +match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(O)], +keywords:"async",className:{1:"keyword",3:"title.function"},contains:[f]} +;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ +PARAMS_CONTAINS:h,CLASS_REFERENCE:y},illegal:/#(?![$_A-z])/, +contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ +label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\$\d+/},l,y,{ +className:"attr",begin:t+n.lookahead(":"),relevance:0},M,{ +begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[m,e.REGEXP_MODE,{ +className:"function",begin:O,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,keywords:i,contains:h}]}]},{begin:/,/,relevance:0 +},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, +"on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ +begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},w,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:t, +className:"title.function"})]},{match:/\.\.\./,relevance:0},k,{match:"\\$"+t, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[f]},N,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},E,x,{match:/\$[(.]/}]}} +const ke=e=>b(/\b/,e,/\w$/.test(e)?/\b/:/\B/),xe=["Protocol","Type"].map(ke),Oe=["init","self"].map(ke),Me=["Any","Self"],Ae=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","package","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Se=["false","nil","true"],Ce=["assignment","associativity","higherThan","left","lowerThan","none","right"],Te=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],Re=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],De=m(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Ie=m(De,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),Le=b(De,Ie,"*"),Be=m(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),$e=m(Be,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Fe=b(Be,$e,"*"),ze=b(/[A-Z]/,$e,"*"),je=["attached","autoclosure",b(/convention\(/,m("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",b(/objc\(/,Fe,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Ue=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;var Pe=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ +begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} +;Object.assign(t,{className:"variable",variants:[{ +begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE] +},r=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),s={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(o);const l={begin:/\$?\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] +},c=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),d={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, +keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[c,e.SHEBANG(),d,l,r,s,{match:/(\/[a-z._-]+)+/},o,{match:/\\"/},{ +className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}},grmr_c:e=>{ +const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ +match:/\batomic_[a-z]{3,6}\b/}]},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], +type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"], +literal:"true false NULL", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" +},b=[c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:b.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:b.concat(["self"]),relevance:0}]),relevance:0},p={ +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], +relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, +keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s] +}]},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"=]/,contains:[{ +beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, +strings:o,keywords:u}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ +contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="(?!struct)("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",begin:"\\b[a-z\\d_]*_t\\b"},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{ +begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)" +},{ +begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], +keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], +literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], +_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] +},b={className:"function.dispatch",relevance:0,keywords:{ +_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] +}, +begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/)) +},m=[b,c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],p={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:m.concat(["self"]),relevance:0}]),relevance:0},_={className:"function", +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{ +begin:/:/,endsWithParent:!0,contains:[o,l]},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/,end:/\)/,keywords:u, +relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s]}] +},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:u,illegal:"",keywords:u,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:u},{ +match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], +className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={ +keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/, +keywords:n},o=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,o]},c={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]},d=e.inherit(c,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]}) +;s.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE], +o.contains=[d,l,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[{className:"string", +begin:/"""("*)(?!")(.|\n)*?"""\1/,relevance:1 +},c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},u={begin:"<",end:">", +contains:[{beginKeywords:"in out"},t] +},b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +keyword:"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,a,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{ +const n=e.regex,t=ae(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ +name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{ +keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"}, +contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+se.join("|")+")"},{begin:":(:)?("+oe.join("|")+")"}] +},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+le.join("|")+")\\b"},{ +begin:/:/,end:/[;}{]/, +contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[...a,{className:"string",begin:/[^)]/,endsWithParent:!0, +excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]", +relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ +},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:re.join(" ")},contains:[{ +begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ +className:"selector-tag",begin:"\\b("+ie.join("|")+")\\b"}]}},grmr_diff:e=>{ +const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ +className:"meta",relevance:10, +match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) +},{className:"comment",variants:[{ +begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), +end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]}},grmr_go:e=>{const n={ +keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], +type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], +literal:["true","false","iota","nil"], +built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{const n=e.regex +;return{name:"GraphQL",aliases:["gql"],case_insensitive:!0,disableAutodetect:!1, +keywords:{ +keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], +literal:["true","false","null"]}, +contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ +scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", +begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, +end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ +scope:"symbol",begin:n.concat(/[_A-Za-z][_0-9A-Za-z]*/,n.lookahead(/\s*:/)), +relevance:0}],illegal:[/[;<']/,/BEGIN/]}},grmr_ini:e=>{const n=e.regex,t={ +className:"number",relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{ +begin:e.NUMBER_RE}]},a=e.COMMENT();a.variants=[{begin:/;/,end:/$/},{begin:/#/, +end:/$/}];const i={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{ +begin:/\$\{(.*?)\}/}]},r={className:"literal", +begin:/\bon|off|true|false|yes|no\b/},s={className:"string", +contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ +begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] +},o={begin:/\[/,end:/\]/,contains:[a,r,i,s,t,"self"],relevance:0 +},l=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ +name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)), +className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{ +const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+me("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ +keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},r={className:"meta",begin:"@"+t,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},s={className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, +className:"string",contains:[e.BACKSLASH_ESCAPE] +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t],className:{ +1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ +begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", +3:"title.class"},contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0, +contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,be,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},be,r]}},grmr_javascript:ve, +grmr_json:e=>{const n=["true","false","null"],t={scope:"literal", +beginKeywords:n.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{ +literal:n},contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/, +relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0 +},e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], +illegal:"\\S"}},grmr_kotlin:e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(r);const s={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] +},l=be,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},t,s,o,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0 +},e.C_LINE_COMMENT_MODE,c,s,o,r,e.C_NUMBER_MODE]},c]},{ +begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ +3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, +excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},l]}},grmr_less:e=>{ +const n=ae(e),t=ce,a="[\\w-]+",i="("+a+"|@\\{"+a+"\\})",r=[],s=[],o=e=>({ +className:"string",begin:"~?"+e+".*?"+e}),l=(e,n,t)=>({className:e,begin:n, +relevance:t}),c={$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:re.join(" ")},d={begin:"\\(",end:"\\)",contains:s,keywords:c, +relevance:0} +;s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,o("'"),o('"'),n.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},n.HEXCOLOR,d,l("variable","@@?"+a,10),l("variable","@\\{"+a+"\\}"),l("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);const g=s.concat({ +begin:/\{/,end:/\}/,contains:r}),u={beginKeywords:"when",endsWithParent:!0, +contains:[{beginKeywords:"and not"}].concat(s)},b={begin:i+"\\s*:", +returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/ +},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+le.join("|")+")\\b", +end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}] +},m={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:c,returnEnd:!0,contains:s,relevance:0}},p={ +className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a +}],starts:{end:"[;}]",returnEnd:!0,contains:g}},_={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:i,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,u,l("keyword","all\\b"),l("variable","@\\{"+a+"\\}"),{ +begin:"\\b("+ie.join("|")+")\\b",className:"selector-tag" +},n.CSS_NUMBER_MODE,l("selector-tag",i,0),l("selector-id","#"+i),l("selector-class","\\."+i,0),l("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+se.join("|")+")"},{ +className:"selector-pseudo",begin:":(:)?("+oe.join("|")+")"},{begin:/\(/, +end:/\)/,relevance:0,contains:g},{begin:"!important"},n.FUNCTION_DISPATCH]},h={ +begin:a+":(:)?"+`(${t.join("|")})`,returnBegin:!0,contains:[_]} +;return r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,m,p,h,b,_,u,n.FUNCTION_DISPATCH), +{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:r}}, +grmr_lua:e=>{const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"] +},i=[e.COMMENT("--(?!"+n+")","$"),e.COMMENT("--"+n,t,{contains:[a],relevance:10 +})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:i}].concat(i) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:n,end:t,contains:[a],relevance:5}])}},grmr_makefile:e=>{const n={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{ +const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={ +variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},r=e.inherit(a,{contains:[] +}),s=e.inherit(i,{contains:[]});a.contains.push(s),i.contains.push(r) +;let o=[n,t];return[a,i,r,s].forEach((e=>{e.contains=e.contains.concat(o) +})),o=o.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:o},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:o}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:o, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},{scope:"literal", +match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}, +grmr_objectivec:e=>{const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n, +keyword:["@interface","@class","@protocol","@implementation"]};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{"variable.language":["this","super"],$pattern:n, +keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], +literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], +built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], +type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] +},illegal:"/,end:/$/,illegal:"\\n" +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", +begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t, +contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, +relevance:0}]}},grmr_perl:e=>{const n=e.regex,t=/[dualxmsipngr]{0,12}/,a={ +$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot class close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl field fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map method mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/, +end:/\}/},s={scope:"attr",match:/\s+:\s*\w+(\s*\(.*?\))?/},o={scope:"variable", +variants:[{begin:/\$\d/},{ +begin:n.concat(/[$%@](?!")(\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@](?!")[^\s\w{=]|\$=/,relevance:0}],contains:[s]},l={ +className:"number",variants:[{match:/0?\.[0-9][0-9_]+\b/},{ +match:/\bv?(0|[1-9][0-9_]*(\.[0-9_]+)?|[1-9][0-9_]*)\b/},{ +match:/\b0[0-7][0-7_]*\b/},{match:/\b0x[0-9a-fA-F][0-9a-fA-F_]*\b/},{ +match:/\b0b[0-1][0-1_]*\b/}],relevance:0 +},c=[e.BACKSLASH_ESCAPE,i,o],d=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],g=(e,a,i="\\1")=>{ +const r="\\1"===i?i:n.concat(i,a) +;return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t) +},u=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),b=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),r,{className:"string",contains:c,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},l,{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:g("s|tr|y",n.either(...d,{capture:!0}))},{begin:g("s|tr|y","\\(","\\)")},{ +begin:g("s|tr|y","\\[","\\]")},{begin:g("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:u("(?:m|qr)?",/\//,/\//)},{begin:u("m|qr",n.either(...d,{capture:!0 +}),/\1/)},{begin:u("m|qr",/\(/,/\)/)},{begin:u("m|qr",/\[/,/\]/)},{ +begin:u("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub method", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,s] +},{className:"class",beginKeywords:"class",end:"[;{]",excludeEnd:!0,relevance:5, +contains:[e.TITLE_MODE,s,l]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$", +end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$", +className:"comment"}]}];return i.contains=b,r.contains=b,{name:"Perl", +aliases:["pl","pm"],keywords:a,contains:b}},grmr_php:e=>{ +const n=e.regex,t=/(?![A-Za-z0-9])(?![$])/,a=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),i=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),r={ +scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{ +begin:/\{\$/,end:/\}/}]},o=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),l="[ \t\n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ +illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),o,{ +begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(s),"on:begin":(e,n)=>{ +n.data._beginMatch=e[1]||e[2]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}},e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},d={scope:"number",variants:[{ +begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" +}],relevance:0 +},g=["false","null","true"],u=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],b=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],m={ +keyword:u,literal:(e=>{const n=[];return e.forEach((e=>{ +n.push(e),e.toLowerCase()===e?n.push(e.toUpperCase()):n.push(e.toLowerCase()) +})),n})(g),built_in:b},p=e=>e.map((e=>e.replace(/\|\d+$/,""))),_={variants:[{ +match:[/new/,n.concat(l,"+"),n.concat("(?!",p(b).join("\\b|"),"\\b)"),i],scope:{ +1:"keyword",4:"title.class"}}]},h=n.concat(a,"\\b(?!\\()"),f={variants:[{ +match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{2:"variable.constant" +}},{match:[/::/,/class/],scope:{2:"variable.language"}},{ +match:[i,n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{1:"title.class", +3:"variable.constant"}},{match:[i,n.concat("::",n.lookahead(/(?!class\b)/))], +scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class", +3:"variable.language"}}]},E={scope:"attr", +match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0, +begin:/\(/,end:/\)/,keywords:m,contains:[E,r,f,e.C_BLOCK_COMMENT_MODE,c,d,_] +},w={relevance:0, +match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(l,"*"),n.lookahead(/(?=\()/)], +scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(w) +;const N=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, +keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/, +endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{ +begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]}, +contains:["self",...N]},...N,{scope:"meta",match:i}] +},e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ +scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, +keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, +contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ +begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ +begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,w,f,{ +match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},_,{ +scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, +excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" +},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", +begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:m, +contains:["self",r,f,e.C_BLOCK_COMMENT_MODE,c,d]}]},{scope:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ +beginKeywords:"use",relevance:0,end:";",contains:[{ +match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},c,d]} +},grmr_php_template:e=>({name:"PHP template",subLanguage:"xml",contains:[{ +begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*", +end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0 +},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null, +contains:null,skip:!0})]}]}),grmr_plaintext:e=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0}),grmr_python:e=>{ +const n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],i={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:a, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},r={className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/, +end:/\}/,keywords:i,illegal:/#/},o={begin:/\{\{/,relevance:0},l={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,o,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,g="\\b|"+a.join("|"),u={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})`},{begin:`(${d})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${g})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${g})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})`},{begin:`\\b(${c})[jJ](?=${g})` +}]},b={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:i, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i, +contains:["self",r,u,l,e.HASH_COMMENT_MODE]}]};return s.contains=[l,u,r],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i, +illegal:/(<\/|\?)|=>/,contains:[r,u,{scope:"variable.language",match:/\bself\b/ +},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword" +},l,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{1:"keyword", +3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[u,m,l]}]}}, +grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta.prompt", +starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{ +begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}),grmr_r:e=>{ +const n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) +;return{name:"R",keywords:{$pattern:t, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, +starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), +endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ +scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0 +}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}] +}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE], +variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{ +1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"}, +match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{ +2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]}]},{scope:{3:"operator"}, +match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{ +match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`", +contains:[{begin:/\\./}]}]}},grmr_ruby:e=>{ +const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),r={ +"variable.constant":["__FILE__","__LINE__","__ENCODING__"], +"variable.language":["self","super"], +keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], +built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], +literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},o={ +begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[s] +}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/, +end:/\}/,keywords:r},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c], +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ +begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ +begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, +end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ +begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ +begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), +contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[e.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",u={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},b={variants:[{match:/\(\)/},{ +className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, +keywords:r}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ +match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", +4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,i],scope:{ +2:"title.class"},keywords:r},{relevance:0,match:[i,/\.new[. (]/],scope:{ +1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{ +match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{ +begin:e.IDENT_RE+"::"},{className:"symbol", +begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, +relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", +keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c], +illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ +begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", +end:"\\][a-z]*"}]}].concat(o,l),relevance:0}].concat(o,l) +;c.contains=m,b.contains=m;const p=[{begin:/^\s*=>/,starts:{end:"$",contains:m} +},{className:"meta.prompt", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",keywords:r,contains:m}}];return l.unshift(o),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/, +contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, +grmr_rust:e=>{ +const n=e.regex,t=/(r#)?/,a=n.concat(t,e.UNDERSCORE_IDENT_RE),i=n.concat(t,e.IDENT_RE),r={ +className:"title.function.invoke",relevance:0, +begin:n.concat(/\b/,/(?!let|for|while|if|else|match\b)/,i,n.lookahead(/\s*\(/)) +},s="([ui](8|16|32|64|128|size)|f(32|64))?",o=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],l=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:l, +keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"], +literal:["true","false","Some","None","Ok","Err"],built_in:o},illegal:""},r]}}, +grmr_scss:e=>{const n=ae(e),t=oe,a=se,i="@[a-z-]+",r={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS", +case_insensitive:!0,illegal:"[=/|']", +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+ie.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+a.join("|")+")"},{className:"selector-pseudo", +begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/, +contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute", +begin:"\\b("+le.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:/:/,end:/[;}{]/,relevance:0, +contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH] +},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{ +begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:re.join(" ")},contains:[{begin:i, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE] +},n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session", +aliases:["console","shellsession"],contains:[{className:"meta.prompt", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]}),grmr_sql:e=>{ +const n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=r,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!r.includes(e))),c={ +begin:n.concat(/\b/,n.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} +;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ +$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{const a=t +;return n=n||[],e.map((e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, +keyword:l.concat(s),literal:a,type:i}},{className:"type", +begin:n.either("double precision","large object","with timezone","without timezone") +},c,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string", +variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/, +contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{ +className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, +relevance:0}]}},grmr_swift:e=>{const n={match:/\s+/,relevance:0 +},t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={ +match:[/\./,m(...xe,...Oe)],className:{2:"keyword"}},r={match:b(/\./,m(...Ae)), +relevance:0},s=Ae.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ +className:"keyword", +match:m(...Ae.filter((e=>"string"!=typeof e)).concat(Me).map(ke),...Oe)}]},l={ +$pattern:m(/\b\w+/,/#\w+/),keyword:s.concat(Te),literal:Se},c=[i,r,o],g=[{ +match:b(/\./,m(...Re)),relevance:0},{className:"built_in", +match:b(/\b/,m(...Re),/(?=\()/)}],u={match:/->/,relevance:0},p=[u,{ +className:"operator",relevance:0,variants:[{match:Le},{match:`\\.(\\.|${Ie})+`}] +}],_="([0-9]_*)+",h="([0-9a-fA-F]_*)+",f={className:"number",relevance:0, +variants:[{match:`\\b(${_})(\\.(${_}))?([eE][+-]?(${_}))?\\b`},{ +match:`\\b0x(${h})(\\.(${h}))?([pP][+-]?(${_}))?\\b`},{match:/\b0o([0-7]_*)+\b/ +},{match:/\b0b([01]_*)+\b/}]},E=(e="")=>({className:"subst",variants:[{ +match:b(/\\/,e,/[0\\tnr"']/)},{match:b(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] +}),y=(e="")=>({className:"subst",match:b(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) +}),w=(e="")=>({className:"subst",label:"interpol",begin:b(/\\/,e,/\(/),end:/\)/ +}),N=(e="")=>({begin:b(e,/"""/),end:b(/"""/,e),contains:[E(e),y(e),w(e)] +}),v=(e="")=>({begin:b(e,/"/),end:b(/"/,e),contains:[E(e),w(e)]}),k={ +className:"string", +variants:[N(),N("#"),N("##"),N("###"),v(),v("#"),v("##"),v("###")] +},x=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, +contains:[e.BACKSLASH_ESCAPE]}],O={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, +contains:x},M=e=>{const n=b(e,/\//),t=b(/\//,e);return{begin:n,end:t, +contains:[...x,{scope:"comment",begin:`#(?!.*${t})`,end:/$/}]}},A={ +scope:"regexp",variants:[M("###"),M("##"),M("#"),O]},S={match:b(/`/,Fe,/`/) +},C=[S,{className:"variable",match:/\$\d+/},{className:"variable", +match:`\\$${$e}+`}],T=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ +contains:[{begin:/\(/,end:/\)/,keywords:Ue,contains:[...p,f,k]}]}},{ +scope:"keyword",match:b(/@/,m(...je),d(m(/\(/,/\s+/)))},{scope:"meta", +match:b(/@/,Fe)}],R={match:d(/\b[A-Z]/),relevance:0,contains:[{className:"type", +match:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,$e,"+") +},{className:"type",match:ze,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:b(/\s+&\s+/,d(ze)),relevance:0}]},D={ +begin://,keywords:l,contains:[...a,...c,...T,u,R]};R.contains.push(D) +;const I={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ +match:b(Fe,/\s*:/),keywords:"_|0",relevance:0 +},...a,A,...c,...g,...p,f,k,...C,...T,R]},L={begin://, +keywords:"repeat each",contains:[...a,R]},B={begin:/\(/,end:/\)/,keywords:l, +contains:[{begin:m(d(b(Fe,/\s*:/)),d(b(Fe,/\s+/,Fe,/\s*:/))),end:/:/, +relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params", +match:Fe}]},...a,...c,...p,f,k,...T,R,I],endsParent:!0,illegal:/["']/},$={ +match:[/(func|macro)/,/\s+/,m(S.match,Fe,Le)],className:{1:"keyword", +3:"title.function"},contains:[L,B,n],illegal:[/\[/,/%/]},F={ +match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, +contains:[L,B,n],illegal:/\[|%/},z={match:[/operator/,/\s+/,Le],className:{ +1:"keyword",3:"title"}},j={begin:[/precedencegroup/,/\s+/,ze],className:{ +1:"keyword",3:"title"},contains:[R],keywords:[...Ce,...Se],end:/}/},U={ +begin:[/(struct|protocol|class|extension|enum|actor)/,/\s+/,Fe,/\s*/], +beginScope:{1:"keyword",3:"title.class"},keywords:l,contains:[L,...c,{begin:/:/, +end:/\{/,keywords:l,contains:[{scope:"title.class.inherited",match:ze},...c], +relevance:0}]};for(const e of k.variants){ +const n=e.contains.find((e=>"interpol"===e.label));n.keywords=l +;const t=[...c,...g,...p,f,k,...C];n.contains=[...t,{begin:/\(/,end:/\)/, +contains:["self",...t]}]}return{name:"Swift",keywords:l, +contains:[...a,$,F,U,z,j,{beginKeywords:"import",end:/$/,contains:[...a], +relevance:0},A,...c,...g,...p,f,k,...C,...T,R,I]}},grmr_typescript:e=>{ +const n=ve(e),t=pe,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={ +begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:"keyword",3:"title.class"} +},r={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{ +keyword:"interface extends",built_in:a},contains:[n.exports.CLASS_REFERENCE] +},s={$pattern:pe, +keyword:_e.concat(["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"]), +literal:he,built_in:Ne.concat(a),"variable.language":we},o={className:"meta", +begin:"@"+t},l=(e,n,t)=>{const a=e.contains.findIndex((e=>e.label===n)) +;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)} +;Object.assign(n.keywords,s),n.exports.PARAMS_CONTAINS.push(o) +;const c=n.contains.find((e=>"attr"===e.className)) +;return n.exports.PARAMS_CONTAINS.push([n.exports.CLASS_REFERENCE,c]), +n.contains=n.contains.concat([o,i,r]), +l(n,"shebang",e.SHEBANG()),l(n,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{ +name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n},grmr_vbnet:e=>{ +const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={ +className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{ +begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{ +begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)}] +},o=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}] +}),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]}) +;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0, +classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},o,l,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +keyword:"const disable else elseif enable end externalsource if region then"}, +contains:[l]}]}},grmr_wasm:e=>{e.regex;const n=e.COMMENT(/\(;/,/;\)/) +;return n.contains.push("self"),{name:"WebAssembly",keywords:{$pattern:/[\w.]+/, +keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"] +},contains:[e.COMMENT(/;;/,/$/),n,{match:[/(?:offset|align)/,/\s*/,/=/], +className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{ +match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{ +begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword", +3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/, +className:"type"},{className:"keyword", +match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ +},{className:"number",relevance:0, +match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ +}]}},grmr_xml:e=>{ +const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[i,r,o,s]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:n.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ +className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ +className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} +},grmr_yaml:e=>{ +const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),r={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s={begin:/\{/, +end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]", +contains:[r],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{ +begin:/\w[\w :()\./-]*:(?=[ \t]|$)/},{begin:/"\w[\w :()\./-]*":(?=[ \t]|$)/},{ +begin:/'\w[\w :()\./-]*':(?=[ \t]|$)/}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type", +begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l] +;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:l}}});const Ke=te;for(const e of Object.keys(Pe)){ +const n=e.replace("grmr_","").replace("_","-");Ke.registerLanguage(n,Pe[e])} +return Ke}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/cpp.min.js b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/cpp.min.js new file mode 100644 index 000000000..9f0411f05 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/cpp.min.js @@ -0,0 +1,47 @@ +/*! `cpp` grammar compiled for Highlight.js 11.10.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const t=e.regex,a=e.COMMENT("//","$",{ +contains:[{begin:/\\\n/}] +}),n="decltype\\(auto\\)",r="[a-zA-Z_]\\w*::",i="(?!struct)("+n+"|"+t.optional(r)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",s={ +className:"type",begin:"\\b[a-z\\d_]*_t\\b"},c={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ +className:"number",variants:[{ +begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)" +},{ +begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)" +}],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{ +className:"string",begin:/<.*?>/},a,e.C_BLOCK_COMMENT_MODE]},u={ +className:"title",begin:t.optional(r)+e.IDENT_RE,relevance:0 +},d=t.optional(r)+e.IDENT_RE+"\\s*\\(",p={ +type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], +keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], +literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], +_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] +},_={className:"function.dispatch",relevance:0,keywords:{ +_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] +}, +begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/)) +},m=[_,l,s,a,e.C_BLOCK_COMMENT_MODE,o,c],f={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:p,contains:m.concat([{begin:/\(/,end:/\)/,keywords:p, +contains:m.concat(["self"]),relevance:0}]),relevance:0},g={className:"function", +begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:p,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:n,keywords:p,relevance:0},{ +begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{ +begin:/:/,endsWithParent:!0,contains:[c,o]},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0, +contains:[a,e.C_BLOCK_COMMENT_MODE,c,o,s,{begin:/\(/,end:/\)/,keywords:p, +relevance:0,contains:["self",a,e.C_BLOCK_COMMENT_MODE,c,o,s]}] +},s,a,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:p,illegal:"",keywords:p,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:p},{ +match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], +className:{1:"keyword",3:"title.class"}}])}}})();hljs.registerLanguage("cpp",e) +})(); \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/python.min.js b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/python.min.js new file mode 100644 index 000000000..2f53bd30d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/python.min.js @@ -0,0 +1,42 @@ +/*! `python` grammar compiled for Highlight.js 11.10.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,s=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],t={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:s, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},i={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, +end:/\}/,keywords:t,illegal:/#/},l={begin:/\{\{/,relevance:0},o={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,i],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,i,l,r]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},b="[0-9](_?[0-9])*",c=`(\\b(${b}))?\\.(${b})|\\b(${b})\\.`,d="\\b|"+s.join("|"),g={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${b})|(${c}))[eE][+-]?(${b})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${b})[jJ](?=${d})` +}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:t, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t, +contains:["self",i,g,o,e.HASH_COMMENT_MODE]}]};return r.contains=[o,g,i],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:t, +illegal:/(<\/|\?)|=>/,contains:[i,g,{scope:"variable.language",match:/\bself\b/ +},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword" +},o,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{1:"keyword", +3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,o]}]}}})() +;hljs.registerLanguage("python",e)})(); \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/x86asm.min.js b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/x86asm.min.js new file mode 100644 index 000000000..03f594459 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/languages/x86asm.min.js @@ -0,0 +1,19 @@ +/*! `x86asm` grammar compiled for Highlight.js 11.10.0 */ +(()=>{var s=(()=>{"use strict";return s=>({name:"Intel x86 Assembly", +case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE, +keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63", +built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr", +meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__" +},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{ +begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*(\\.[0-9_]*)?(?:[pP](?:[+-]?[0-9_]+)?)?)\\b", +relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{ +begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b" +},{ +begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b" +}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'" +},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{ +begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{ +begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst", +begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{ +className:"meta",begin:/^\s*\.[\w_-]+/}]})})();hljs.registerLanguage("x86asm",s) +})(); \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/styles/default.min.css b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/styles/default.min.css new file mode 100644 index 000000000..a75ea9116 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/assets/cdnjs.cloudflare.com/ajax/libs/highlight.js/11.10.0/styles/default.min.css @@ -0,0 +1,9 @@ +/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/viz/assets/d3js.org/d3.v7.min.js b/artifacts/package_runtime/tinygrad/viz/assets/d3js.org/d3.v7.min.js new file mode 100644 index 000000000..33bb88026 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/assets/d3js.org/d3.v7.min.js @@ -0,0 +1,2 @@ +// https://d3js.org v7.9.0 Copyright 2010-2023 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).d3=t.d3||{})}(this,(function(t){"use strict";function n(t,n){return null==t||null==n?NaN:tn?1:t>=n?0:NaN}function e(t,n){return null==t||null==n?NaN:nt?1:n>=t?0:NaN}function r(t){let r,o,a;function u(t,n,e=0,i=t.length){if(e>>1;o(t[r],n)<0?e=r+1:i=r}while(en(t(e),r),a=(n,e)=>t(n)-e):(r=t===n||t===e?t:i,o=t,a=t),{left:u,center:function(t,n,e=0,r=t.length){const i=u(t,n,e,r-1);return i>e&&a(t[i-1],n)>-a(t[i],n)?i-1:i},right:function(t,n,e=0,i=t.length){if(e>>1;o(t[r],n)<=0?e=r+1:i=r}while(e{n(t,e,(r<<=2)+0,(i<<=2)+0,o<<=2),n(t,e,r+1,i+1,o),n(t,e,r+2,i+2,o),n(t,e,r+3,i+3,o)}}));function d(t){return function(n,e,r=e){if(!((e=+e)>=0))throw new RangeError("invalid rx");if(!((r=+r)>=0))throw new RangeError("invalid ry");let{data:i,width:o,height:a}=n;if(!((o=Math.floor(o))>=0))throw new RangeError("invalid width");if(!((a=Math.floor(void 0!==a?a:i.length/o))>=0))throw new RangeError("invalid height");if(!o||!a||!e&&!r)return n;const u=e&&t(e),c=r&&t(r),f=i.slice();return u&&c?(p(u,f,i,o,a),p(u,i,f,o,a),p(u,f,i,o,a),g(c,i,f,o,a),g(c,f,i,o,a),g(c,i,f,o,a)):u?(p(u,i,f,o,a),p(u,f,i,o,a),p(u,i,f,o,a)):c&&(g(c,i,f,o,a),g(c,f,i,o,a),g(c,i,f,o,a)),n}}function p(t,n,e,r,i){for(let o=0,a=r*i;o{if(!((o-=a)>=i))return;let u=t*r[i];const c=a*t;for(let t=i,n=i+c;t{if(!((a-=u)>=o))return;let c=n*i[o];const f=u*n,s=f+u;for(let t=o,n=o+f;t=n&&++e;else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(i=+i)>=i&&++e}return e}function _(t){return 0|t.length}function b(t){return!(t>0)}function m(t){return"object"!=typeof t||"length"in t?t:Array.from(t)}function x(t,n){let e,r=0,i=0,o=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(e=n-i,i+=e/++r,o+=e*(n-i));else{let a=-1;for(let u of t)null!=(u=n(u,++a,t))&&(u=+u)>=u&&(e=u-i,i+=e/++r,o+=e*(u-i))}if(r>1)return o/(r-1)}function w(t,n){const e=x(t,n);return e?Math.sqrt(e):e}function M(t,n){let e,r;if(void 0===n)for(const n of t)null!=n&&(void 0===e?n>=n&&(e=r=n):(e>n&&(e=n),r=o&&(e=r=o):(e>o&&(e=o),r0){for(o=t[--i];i>0&&(n=o,e=t[--i],o=n+e,r=e-(o-n),!r););i>0&&(r<0&&t[i-1]<0||r>0&&t[i-1]>0)&&(e=2*r,n=o+e,e==n-o&&(o=n))}return o}}class InternMap extends Map{constructor(t,n=N){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),null!=t)for(const[n,e]of t)this.set(n,e)}get(t){return super.get(A(this,t))}has(t){return super.has(A(this,t))}set(t,n){return super.set(S(this,t),n)}delete(t){return super.delete(E(this,t))}}class InternSet extends Set{constructor(t,n=N){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),null!=t)for(const n of t)this.add(n)}has(t){return super.has(A(this,t))}add(t){return super.add(S(this,t))}delete(t){return super.delete(E(this,t))}}function A({_intern:t,_key:n},e){const r=n(e);return t.has(r)?t.get(r):e}function S({_intern:t,_key:n},e){const r=n(e);return t.has(r)?t.get(r):(t.set(r,e),e)}function E({_intern:t,_key:n},e){const r=n(e);return t.has(r)&&(e=t.get(r),t.delete(r)),e}function N(t){return null!==t&&"object"==typeof t?t.valueOf():t}function k(t){return t}function C(t,...n){return F(t,k,k,n)}function P(t,...n){return F(t,Array.from,k,n)}function z(t,n){for(let e=1,r=n.length;et.pop().map((([n,e])=>[...t,n,e]))));return t}function $(t,n,...e){return F(t,k,n,e)}function D(t,n,...e){return F(t,Array.from,n,e)}function R(t){if(1!==t.length)throw new Error("duplicate key");return t[0]}function F(t,n,e,r){return function t(i,o){if(o>=r.length)return e(i);const a=new InternMap,u=r[o++];let c=-1;for(const t of i){const n=u(t,++c,i),e=a.get(n);e?e.push(t):a.set(n,[t])}for(const[n,e]of a)a.set(n,t(e,o));return n(a)}(t,0)}function q(t,n){return Array.from(n,(n=>t[n]))}function U(t,...n){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");t=Array.from(t);let[e]=n;if(e&&2!==e.length||n.length>1){const r=Uint32Array.from(t,((t,n)=>n));return n.length>1?(n=n.map((n=>t.map(n))),r.sort(((t,e)=>{for(const r of n){const n=O(r[t],r[e]);if(n)return n}}))):(e=t.map(e),r.sort(((t,n)=>O(e[t],e[n])))),q(t,r)}return t.sort(I(e))}function I(t=n){if(t===n)return O;if("function"!=typeof t)throw new TypeError("compare is not a function");return(n,e)=>{const r=t(n,e);return r||0===r?r:(0===t(e,e))-(0===t(n,n))}}function O(t,n){return(null==t||!(t>=t))-(null==n||!(n>=n))||(tn?1:0)}var B=Array.prototype.slice;function Y(t){return()=>t}const L=Math.sqrt(50),j=Math.sqrt(10),H=Math.sqrt(2);function X(t,n,e){const r=(n-t)/Math.max(0,e),i=Math.floor(Math.log10(r)),o=r/Math.pow(10,i),a=o>=L?10:o>=j?5:o>=H?2:1;let u,c,f;return i<0?(f=Math.pow(10,-i)/a,u=Math.round(t*f),c=Math.round(n*f),u/fn&&--c,f=-f):(f=Math.pow(10,i)*a,u=Math.round(t/f),c=Math.round(n/f),u*fn&&--c),c0))return[];if((t=+t)===(n=+n))return[t];const r=n=i))return[];const u=o-i+1,c=new Array(u);if(r)if(a<0)for(let t=0;t0?(t=Math.floor(t/i)*i,n=Math.ceil(n/i)*i):i<0&&(t=Math.ceil(t*i)/i,n=Math.floor(n*i)/i),r=i}}function K(t){return Math.max(1,Math.ceil(Math.log(v(t))/Math.LN2)+1)}function Q(){var t=k,n=M,e=K;function r(r){Array.isArray(r)||(r=Array.from(r));var i,o,a,u=r.length,c=new Array(u);for(i=0;i=h)if(t>=h&&n===M){const t=V(l,h,e);isFinite(t)&&(t>0?h=(Math.floor(h/t)+1)*t:t<0&&(h=(Math.ceil(h*-t)+1)/-t))}else d.pop()}for(var p=d.length,g=0,y=p;d[g]<=l;)++g;for(;d[y-1]>h;)--y;(g||y0?d[i-1]:l,v.x1=i0)for(i=0;i=n)&&(e=n);else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(e=i)&&(e=i)}return e}function tt(t,n){let e,r=-1,i=-1;if(void 0===n)for(const n of t)++i,null!=n&&(e=n)&&(e=n,r=i);else for(let o of t)null!=(o=n(o,++i,t))&&(e=o)&&(e=o,r=i);return r}function nt(t,n){let e;if(void 0===n)for(const n of t)null!=n&&(e>n||void 0===e&&n>=n)&&(e=n);else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&(e>i||void 0===e&&i>=i)&&(e=i)}return e}function et(t,n){let e,r=-1,i=-1;if(void 0===n)for(const n of t)++i,null!=n&&(e>n||void 0===e&&n>=n)&&(e=n,r=i);else for(let o of t)null!=(o=n(o,++i,t))&&(e>o||void 0===e&&o>=o)&&(e=o,r=i);return r}function rt(t,n,e=0,r=1/0,i){if(n=Math.floor(n),e=Math.floor(Math.max(0,e)),r=Math.floor(Math.min(t.length-1,r)),!(e<=n&&n<=r))return t;for(i=void 0===i?O:I(i);r>e;){if(r-e>600){const o=r-e+1,a=n-e+1,u=Math.log(o),c=.5*Math.exp(2*u/3),f=.5*Math.sqrt(u*c*(o-c)/o)*(a-o/2<0?-1:1);rt(t,n,Math.max(e,Math.floor(n-a*c/o+f)),Math.min(r,Math.floor(n+(o-a)*c/o+f)),i)}const o=t[n];let a=e,u=r;for(it(t,e,n),i(t[r],o)>0&&it(t,e,r);a0;)--u}0===i(t[e],o)?it(t,e,u):(++u,it(t,u,r)),u<=n&&(e=u+1),n<=u&&(r=u-1)}return t}function it(t,n,e){const r=t[n];t[n]=t[e],t[e]=r}function ot(t,e=n){let r,i=!1;if(1===e.length){let o;for(const a of t){const t=e(a);(i?n(t,o)>0:0===n(t,t))&&(r=a,o=t,i=!0)}}else for(const n of t)(i?e(n,r)>0:0===e(n,n))&&(r=n,i=!0);return r}function at(t,n,e){if(t=Float64Array.from(function*(t,n){if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(yield n);else{let e=-1;for(let r of t)null!=(r=n(r,++e,t))&&(r=+r)>=r&&(yield r)}}(t,e)),(r=t.length)&&!isNaN(n=+n)){if(n<=0||r<2)return nt(t);if(n>=1)return J(t);var r,i=(r-1)*n,o=Math.floor(i),a=J(rt(t,o).subarray(0,o+1));return a+(nt(t.subarray(o+1))-a)*(i-o)}}function ut(t,n,e=o){if((r=t.length)&&!isNaN(n=+n)){if(n<=0||r<2)return+e(t[0],0,t);if(n>=1)return+e(t[r-1],r-1,t);var r,i=(r-1)*n,a=Math.floor(i),u=+e(t[a],a,t);return u+(+e(t[a+1],a+1,t)-u)*(i-a)}}function ct(t,n,e=o){if(!isNaN(n=+n)){if(r=Float64Array.from(t,((n,r)=>o(e(t[r],r,t)))),n<=0)return et(r);if(n>=1)return tt(r);var r,i=Uint32Array.from(t,((t,n)=>n)),a=r.length-1,u=Math.floor(a*n);return rt(i,u,0,a,((t,n)=>O(r[t],r[n]))),(u=ot(i.subarray(0,u+1),(t=>r[t])))>=0?u:-1}}function ft(t){return Array.from(function*(t){for(const n of t)yield*n}(t))}function st(t,n){return[t,n]}function lt(t,n,e){t=+t,n=+n,e=(i=arguments.length)<2?(n=t,t=0,1):i<3?1:+e;for(var r=-1,i=0|Math.max(0,Math.ceil((n-t)/e)),o=new Array(i);++r+t(n)}function kt(t,n){return n=Math.max(0,t.bandwidth()-2*n)/2,t.round()&&(n=Math.round(n)),e=>+t(e)+n}function Ct(){return!this.__axis}function Pt(t,n){var e=[],r=null,i=null,o=6,a=6,u=3,c="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,f=t===xt||t===Tt?-1:1,s=t===Tt||t===wt?"x":"y",l=t===xt||t===Mt?St:Et;function h(h){var d=null==r?n.ticks?n.ticks.apply(n,e):n.domain():r,p=null==i?n.tickFormat?n.tickFormat.apply(n,e):mt:i,g=Math.max(o,0)+u,y=n.range(),v=+y[0]+c,_=+y[y.length-1]+c,b=(n.bandwidth?kt:Nt)(n.copy(),c),m=h.selection?h.selection():h,x=m.selectAll(".domain").data([null]),w=m.selectAll(".tick").data(d,n).order(),M=w.exit(),T=w.enter().append("g").attr("class","tick"),A=w.select("line"),S=w.select("text");x=x.merge(x.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),w=w.merge(T),A=A.merge(T.append("line").attr("stroke","currentColor").attr(s+"2",f*o)),S=S.merge(T.append("text").attr("fill","currentColor").attr(s,f*g).attr("dy",t===xt?"0em":t===Mt?"0.71em":"0.32em")),h!==m&&(x=x.transition(h),w=w.transition(h),A=A.transition(h),S=S.transition(h),M=M.transition(h).attr("opacity",At).attr("transform",(function(t){return isFinite(t=b(t))?l(t+c):this.getAttribute("transform")})),T.attr("opacity",At).attr("transform",(function(t){var n=this.parentNode.__axis;return l((n&&isFinite(n=n(t))?n:b(t))+c)}))),M.remove(),x.attr("d",t===Tt||t===wt?a?"M"+f*a+","+v+"H"+c+"V"+_+"H"+f*a:"M"+c+","+v+"V"+_:a?"M"+v+","+f*a+"V"+c+"H"+_+"V"+f*a:"M"+v+","+c+"H"+_),w.attr("opacity",1).attr("transform",(function(t){return l(b(t)+c)})),A.attr(s+"2",f*o),S.attr(s,f*g).text(p),m.filter(Ct).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===wt?"start":t===Tt?"end":"middle"),m.each((function(){this.__axis=b}))}return h.scale=function(t){return arguments.length?(n=t,h):n},h.ticks=function(){return e=Array.from(arguments),h},h.tickArguments=function(t){return arguments.length?(e=null==t?[]:Array.from(t),h):e.slice()},h.tickValues=function(t){return arguments.length?(r=null==t?null:Array.from(t),h):r&&r.slice()},h.tickFormat=function(t){return arguments.length?(i=t,h):i},h.tickSize=function(t){return arguments.length?(o=a=+t,h):o},h.tickSizeInner=function(t){return arguments.length?(o=+t,h):o},h.tickSizeOuter=function(t){return arguments.length?(a=+t,h):a},h.tickPadding=function(t){return arguments.length?(u=+t,h):u},h.offset=function(t){return arguments.length?(c=+t,h):c},h}var zt={value:()=>{}};function $t(){for(var t,n=0,e=arguments.length,r={};n=0&&(n=t.slice(e+1),t=t.slice(0,e)),t&&!r.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}}))),a=-1,u=o.length;if(!(arguments.length<2)){if(null!=n&&"function"!=typeof n)throw new Error("invalid callback: "+n);for(;++a0)for(var e,r,i=new Array(e),o=0;o=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),Ut.hasOwnProperty(n)?{space:Ut[n],local:t}:t}function Ot(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===qt&&n.documentElement.namespaceURI===qt?n.createElement(t):n.createElementNS(e,t)}}function Bt(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Yt(t){var n=It(t);return(n.local?Bt:Ot)(n)}function Lt(){}function jt(t){return null==t?Lt:function(){return this.querySelector(t)}}function Ht(t){return null==t?[]:Array.isArray(t)?t:Array.from(t)}function Xt(){return[]}function Gt(t){return null==t?Xt:function(){return this.querySelectorAll(t)}}function Vt(t){return function(){return this.matches(t)}}function Wt(t){return function(n){return n.matches(t)}}var Zt=Array.prototype.find;function Kt(){return this.firstElementChild}var Qt=Array.prototype.filter;function Jt(){return Array.from(this.children)}function tn(t){return new Array(t.length)}function nn(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}function en(t,n,e,r,i,o){for(var a,u=0,c=n.length,f=o.length;un?1:t>=n?0:NaN}function cn(t){return function(){this.removeAttribute(t)}}function fn(t){return function(){this.removeAttributeNS(t.space,t.local)}}function sn(t,n){return function(){this.setAttribute(t,n)}}function ln(t,n){return function(){this.setAttributeNS(t.space,t.local,n)}}function hn(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}}function dn(t,n){return function(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}}function pn(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function gn(t){return function(){this.style.removeProperty(t)}}function yn(t,n,e){return function(){this.style.setProperty(t,n,e)}}function vn(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}function _n(t,n){return t.style.getPropertyValue(n)||pn(t).getComputedStyle(t,null).getPropertyValue(n)}function bn(t){return function(){delete this[t]}}function mn(t,n){return function(){this[t]=n}}function xn(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}function wn(t){return t.trim().split(/^|\s+/)}function Mn(t){return t.classList||new Tn(t)}function Tn(t){this._node=t,this._names=wn(t.getAttribute("class")||"")}function An(t,n){for(var e=Mn(t),r=-1,i=n.length;++r=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Gn=[null];function Vn(t,n){this._groups=t,this._parents=n}function Wn(){return new Vn([[document.documentElement]],Gn)}function Zn(t){return"string"==typeof t?new Vn([[document.querySelector(t)]],[document.documentElement]):new Vn([[t]],Gn)}Vn.prototype=Wn.prototype={constructor:Vn,select:function(t){"function"!=typeof t&&(t=jt(t));for(var n=this._groups,e=n.length,r=new Array(e),i=0;i=m&&(m=b+1);!(_=y[m])&&++m=0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=un);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?gn:"function"==typeof n?vn:yn)(t,n,null==e?"":e)):_n(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?bn:"function"==typeof n?xn:mn)(t,n)):this.node()[t]},classed:function(t,n){var e=wn(t+"");if(arguments.length<2){for(var r=Mn(this.node()),i=-1,o=e.length;++i=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}}))}(t+""),a=o.length;if(!(arguments.length<2)){for(u=n?Ln:Yn,r=0;r()=>t;function fe(t,{sourceEvent:n,subject:e,target:r,identifier:i,active:o,x:a,y:u,dx:c,dy:f,dispatch:s}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},subject:{value:e,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:u,enumerable:!0,configurable:!0},dx:{value:c,enumerable:!0,configurable:!0},dy:{value:f,enumerable:!0,configurable:!0},_:{value:s}})}function se(t){return!t.ctrlKey&&!t.button}function le(){return this.parentNode}function he(t,n){return null==n?{x:t.x,y:t.y}:n}function de(){return navigator.maxTouchPoints||"ontouchstart"in this}function pe(t,n,e){t.prototype=n.prototype=e,e.constructor=t}function ge(t,n){var e=Object.create(t.prototype);for(var r in n)e[r]=n[r];return e}function ye(){}fe.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};var ve=.7,_e=1/ve,be="\\s*([+-]?\\d+)\\s*",me="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",xe="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",we=/^#([0-9a-f]{3,8})$/,Me=new RegExp(`^rgb\\(${be},${be},${be}\\)$`),Te=new RegExp(`^rgb\\(${xe},${xe},${xe}\\)$`),Ae=new RegExp(`^rgba\\(${be},${be},${be},${me}\\)$`),Se=new RegExp(`^rgba\\(${xe},${xe},${xe},${me}\\)$`),Ee=new RegExp(`^hsl\\(${me},${xe},${xe}\\)$`),Ne=new RegExp(`^hsla\\(${me},${xe},${xe},${me}\\)$`),ke={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function Ce(){return this.rgb().formatHex()}function Pe(){return this.rgb().formatRgb()}function ze(t){var n,e;return t=(t+"").trim().toLowerCase(),(n=we.exec(t))?(e=n[1].length,n=parseInt(n[1],16),6===e?$e(n):3===e?new qe(n>>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):8===e?De(n>>24&255,n>>16&255,n>>8&255,(255&n)/255):4===e?De(n>>12&15|n>>8&240,n>>8&15|n>>4&240,n>>4&15|240&n,((15&n)<<4|15&n)/255):null):(n=Me.exec(t))?new qe(n[1],n[2],n[3],1):(n=Te.exec(t))?new qe(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=Ae.exec(t))?De(n[1],n[2],n[3],n[4]):(n=Se.exec(t))?De(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=Ee.exec(t))?Le(n[1],n[2]/100,n[3]/100,1):(n=Ne.exec(t))?Le(n[1],n[2]/100,n[3]/100,n[4]):ke.hasOwnProperty(t)?$e(ke[t]):"transparent"===t?new qe(NaN,NaN,NaN,0):null}function $e(t){return new qe(t>>16&255,t>>8&255,255&t,1)}function De(t,n,e,r){return r<=0&&(t=n=e=NaN),new qe(t,n,e,r)}function Re(t){return t instanceof ye||(t=ze(t)),t?new qe((t=t.rgb()).r,t.g,t.b,t.opacity):new qe}function Fe(t,n,e,r){return 1===arguments.length?Re(t):new qe(t,n,e,null==r?1:r)}function qe(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function Ue(){return`#${Ye(this.r)}${Ye(this.g)}${Ye(this.b)}`}function Ie(){const t=Oe(this.opacity);return`${1===t?"rgb(":"rgba("}${Be(this.r)}, ${Be(this.g)}, ${Be(this.b)}${1===t?")":`, ${t})`}`}function Oe(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Be(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Ye(t){return((t=Be(t))<16?"0":"")+t.toString(16)}function Le(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new Xe(t,n,e,r)}function je(t){if(t instanceof Xe)return new Xe(t.h,t.s,t.l,t.opacity);if(t instanceof ye||(t=ze(t)),!t)return new Xe;if(t instanceof Xe)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),a=NaN,u=o-i,c=(o+i)/2;return u?(a=n===o?(e-r)/u+6*(e0&&c<1?0:a,new Xe(a,u,c,t.opacity)}function He(t,n,e,r){return 1===arguments.length?je(t):new Xe(t,n,e,null==r?1:r)}function Xe(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function Ge(t){return(t=(t||0)%360)<0?t+360:t}function Ve(t){return Math.max(0,Math.min(1,t||0))}function We(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}pe(ye,ze,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:Ce,formatHex:Ce,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return je(this).formatHsl()},formatRgb:Pe,toString:Pe}),pe(qe,Fe,ge(ye,{brighter(t){return t=null==t?_e:Math.pow(_e,t),new qe(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?ve:Math.pow(ve,t),new qe(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new qe(Be(this.r),Be(this.g),Be(this.b),Oe(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Ue,formatHex:Ue,formatHex8:function(){return`#${Ye(this.r)}${Ye(this.g)}${Ye(this.b)}${Ye(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Ie,toString:Ie})),pe(Xe,He,ge(ye,{brighter(t){return t=null==t?_e:Math.pow(_e,t),new Xe(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?ve:Math.pow(ve,t),new Xe(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,r=e+(e<.5?e:1-e)*n,i=2*e-r;return new qe(We(t>=240?t-240:t+120,i,r),We(t,i,r),We(t<120?t+240:t-120,i,r),this.opacity)},clamp(){return new Xe(Ge(this.h),Ve(this.s),Ve(this.l),Oe(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Oe(this.opacity);return`${1===t?"hsl(":"hsla("}${Ge(this.h)}, ${100*Ve(this.s)}%, ${100*Ve(this.l)}%${1===t?")":`, ${t})`}`}}));const Ze=Math.PI/180,Ke=180/Math.PI,Qe=.96422,Je=1,tr=.82521,nr=4/29,er=6/29,rr=3*er*er,ir=er*er*er;function or(t){if(t instanceof ur)return new ur(t.l,t.a,t.b,t.opacity);if(t instanceof pr)return gr(t);t instanceof qe||(t=Re(t));var n,e,r=lr(t.r),i=lr(t.g),o=lr(t.b),a=cr((.2225045*r+.7168786*i+.0606169*o)/Je);return r===i&&i===o?n=e=a:(n=cr((.4360747*r+.3850649*i+.1430804*o)/Qe),e=cr((.0139322*r+.0971045*i+.7141733*o)/tr)),new ur(116*a-16,500*(n-a),200*(a-e),t.opacity)}function ar(t,n,e,r){return 1===arguments.length?or(t):new ur(t,n,e,null==r?1:r)}function ur(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function cr(t){return t>ir?Math.pow(t,1/3):t/rr+nr}function fr(t){return t>er?t*t*t:rr*(t-nr)}function sr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function lr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function hr(t){if(t instanceof pr)return new pr(t.h,t.c,t.l,t.opacity);if(t instanceof ur||(t=or(t)),0===t.a&&0===t.b)return new pr(NaN,0=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,u=r()=>t;function Cr(t,n){return function(e){return t+e*n}}function Pr(t,n){var e=n-t;return e?Cr(t,e>180||e<-180?e-360*Math.round(e/360):e):kr(isNaN(t)?n:t)}function zr(t){return 1==(t=+t)?$r:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):kr(isNaN(n)?e:n)}}function $r(t,n){var e=n-t;return e?Cr(t,e):kr(isNaN(t)?n:t)}var Dr=function t(n){var e=zr(n);function r(t,n){var r=e((t=Fe(t)).r,(n=Fe(n)).r),i=e(t.g,n.g),o=e(t.b,n.b),a=$r(t.opacity,n.opacity);return function(n){return t.r=r(n),t.g=i(n),t.b=o(n),t.opacity=a(n),t+""}}return r.gamma=t,r}(1);function Rr(t){return function(n){var e,r,i=n.length,o=new Array(i),a=new Array(i),u=new Array(i);for(e=0;eo&&(i=n.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(e=e[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,c.push({i:a,x:Yr(e,r)})),o=Hr.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:Yr(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,a.rotate,u,c),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:Yr(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,a.skewX,u,c),function(t,n,e,r,o,a){if(t!==e||n!==r){var u=o.push(i(o)+"scale(",null,",",null,")");a.push({i:u-4,x:Yr(t,e)},{i:u-2,x:Yr(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,a.scaleX,a.scaleY,u,c),o=a=null,function(t){for(var n,e=-1,r=c.length;++e=0&&n._call.call(void 0,t),n=n._next;--yi}function Ci(){xi=(mi=Mi.now())+wi,yi=vi=0;try{ki()}finally{yi=0,function(){var t,n,e=pi,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:pi=n);gi=t,zi(r)}(),xi=0}}function Pi(){var t=Mi.now(),n=t-mi;n>bi&&(wi-=n,mi=t)}function zi(t){yi||(vi&&(vi=clearTimeout(vi)),t-xi>24?(t<1/0&&(vi=setTimeout(Ci,t-Mi.now()-wi)),_i&&(_i=clearInterval(_i))):(_i||(mi=Mi.now(),_i=setInterval(Pi,bi)),yi=1,Ti(Ci)))}function $i(t,n,e){var r=new Ei;return n=null==n?0:+n,r.restart((e=>{r.stop(),t(e+n)}),n,e),r}Ei.prototype=Ni.prototype={constructor:Ei,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?Ai():+e)+(null==n?0:+n),this._next||gi===this||(gi?gi._next=this:pi=this,gi=this),this._call=t,this._time=e,zi()},stop:function(){this._call&&(this._call=null,this._time=1/0,zi())}};var Di=$t("start","end","cancel","interrupt"),Ri=[],Fi=0,qi=1,Ui=2,Ii=3,Oi=4,Bi=5,Yi=6;function Li(t,n,e,r,i,o){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var r,i=t.__transition;function o(t){e.state=qi,e.timer.restart(a,e.delay,e.time),e.delay<=t&&a(t-e.delay)}function a(o){var f,s,l,h;if(e.state!==qi)return c();for(f in i)if((h=i[f]).name===e.name){if(h.state===Ii)return $i(a);h.state===Oi?(h.state=Yi,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete i[f]):+fFi)throw new Error("too late; already scheduled");return e}function Hi(t,n){var e=Xi(t,n);if(e.state>Ii)throw new Error("too late; already running");return e}function Xi(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function Gi(t,n){var e,r,i,o=t.__transition,a=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>Ui&&e.state=0&&(t=t.slice(0,n)),!t||"start"===t}))}(n)?ji:Hi;return function(){var a=o(this,t),u=a.on;u!==r&&(i=(r=u).copy()).on(n,e),a.on=i}}(e,t,n))},attr:function(t,n){var e=It(t),r="transform"===e?ni:Ki;return this.attrTween(t,"function"==typeof n?(e.local?ro:eo)(e,r,Zi(this,"attr."+t,n)):null==n?(e.local?Ji:Qi)(e):(e.local?no:to)(e,r,n))},attrTween:function(t,n){var e="attr."+t;if(arguments.length<2)return(e=this.tween(e))&&e._value;if(null==n)return this.tween(e,null);if("function"!=typeof n)throw new Error;var r=It(t);return this.tween(e,(r.local?io:oo)(r,n))},style:function(t,n,e){var r="transform"==(t+="")?ti:Ki;return null==n?this.styleTween(t,function(t,n){var e,r,i;return function(){var o=_n(this,t),a=(this.style.removeProperty(t),_n(this,t));return o===a?null:o===e&&a===r?i:i=n(e=o,r=a)}}(t,r)).on("end.style."+t,lo(t)):"function"==typeof n?this.styleTween(t,function(t,n,e){var r,i,o;return function(){var a=_n(this,t),u=e(this),c=u+"";return null==u&&(this.style.removeProperty(t),c=u=_n(this,t)),a===c?null:a===r&&c===i?o:(i=c,o=n(r=a,u))}}(t,r,Zi(this,"style."+t,n))).each(function(t,n){var e,r,i,o,a="style."+n,u="end."+a;return function(){var c=Hi(this,t),f=c.on,s=null==c.value[a]?o||(o=lo(n)):void 0;f===e&&i===s||(r=(e=f).copy()).on(u,i=s),c.on=r}}(this._id,t)):this.styleTween(t,function(t,n,e){var r,i,o=e+"";return function(){var a=_n(this,t);return a===o?null:a===r?i:i=n(r=a,e)}}(t,r,n),e).on("end.style."+t,null)},styleTween:function(t,n,e){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==n)return this.tween(r,null);if("function"!=typeof n)throw new Error;return this.tween(r,function(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&function(t,n,e){return function(r){this.style.setProperty(t,n.call(this,r),e)}}(t,o,e)),r}return o._value=n,o}(t,n,null==e?"":e))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var n=t(this);this.textContent=null==n?"":n}}(Zi(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var n="text";if(arguments.length<1)return(n=this.tween(n))&&n._value;if(null==t)return this.tween(n,null);if("function"!=typeof t)throw new Error;return this.tween(n,function(t){var n,e;function r(){var r=t.apply(this,arguments);return r!==e&&(n=(e=r)&&function(t){return function(n){this.textContent=t.call(this,n)}}(r)),n}return r._value=t,r}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var n=this.parentNode;for(var e in this.__transition)if(+e!==t)return;n&&n.removeChild(this)}}(this._id))},tween:function(t,n){var e=this._id;if(t+="",arguments.length<2){for(var r,i=Xi(this.node(),e).tween,o=0,a=i.length;o()=>t;function Qo(t,{sourceEvent:n,target:e,selection:r,mode:i,dispatch:o}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},selection:{value:r,enumerable:!0,configurable:!0},mode:{value:i,enumerable:!0,configurable:!0},_:{value:o}})}function Jo(t){t.preventDefault(),t.stopImmediatePropagation()}var ta={name:"drag"},na={name:"space"},ea={name:"handle"},ra={name:"center"};const{abs:ia,max:oa,min:aa}=Math;function ua(t){return[+t[0],+t[1]]}function ca(t){return[ua(t[0]),ua(t[1])]}var fa={name:"x",handles:["w","e"].map(va),input:function(t,n){return null==t?null:[[+t[0],n[0][1]],[+t[1],n[1][1]]]},output:function(t){return t&&[t[0][0],t[1][0]]}},sa={name:"y",handles:["n","s"].map(va),input:function(t,n){return null==t?null:[[n[0][0],+t[0]],[n[1][0],+t[1]]]},output:function(t){return t&&[t[0][1],t[1][1]]}},la={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(va),input:function(t){return null==t?null:ca(t)},output:function(t){return t}},ha={overlay:"crosshair",selection:"move",n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},da={e:"w",w:"e",nw:"ne",ne:"nw",se:"sw",sw:"se"},pa={n:"s",s:"n",nw:"sw",ne:"se",se:"ne",sw:"nw"},ga={overlay:1,selection:1,n:null,e:1,s:null,w:-1,nw:-1,ne:1,se:1,sw:-1},ya={overlay:1,selection:1,n:-1,e:null,s:1,w:null,nw:-1,ne:-1,se:1,sw:1};function va(t){return{type:t}}function _a(t){return!t.ctrlKey&&!t.button}function ba(){var t=this.ownerSVGElement||this;return t.hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]}function ma(){return navigator.maxTouchPoints||"ontouchstart"in this}function xa(t){for(;!t.__brush;)if(!(t=t.parentNode))return;return t.__brush}function wa(t){var n,e=ba,r=_a,i=ma,o=!0,a=$t("start","brush","end"),u=6;function c(n){var e=n.property("__brush",g).selectAll(".overlay").data([va("overlay")]);e.enter().append("rect").attr("class","overlay").attr("pointer-events","all").attr("cursor",ha.overlay).merge(e).each((function(){var t=xa(this).extent;Zn(this).attr("x",t[0][0]).attr("y",t[0][1]).attr("width",t[1][0]-t[0][0]).attr("height",t[1][1]-t[0][1])})),n.selectAll(".selection").data([va("selection")]).enter().append("rect").attr("class","selection").attr("cursor",ha.selection).attr("fill","#777").attr("fill-opacity",.3).attr("stroke","#fff").attr("shape-rendering","crispEdges");var r=n.selectAll(".handle").data(t.handles,(function(t){return t.type}));r.exit().remove(),r.enter().append("rect").attr("class",(function(t){return"handle handle--"+t.type})).attr("cursor",(function(t){return ha[t.type]})),n.each(f).attr("fill","none").attr("pointer-events","all").on("mousedown.brush",h).filter(i).on("touchstart.brush",h).on("touchmove.brush",d).on("touchend.brush touchcancel.brush",p).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function f(){var t=Zn(this),n=xa(this).selection;n?(t.selectAll(".selection").style("display",null).attr("x",n[0][0]).attr("y",n[0][1]).attr("width",n[1][0]-n[0][0]).attr("height",n[1][1]-n[0][1]),t.selectAll(".handle").style("display",null).attr("x",(function(t){return"e"===t.type[t.type.length-1]?n[1][0]-u/2:n[0][0]-u/2})).attr("y",(function(t){return"s"===t.type[0]?n[1][1]-u/2:n[0][1]-u/2})).attr("width",(function(t){return"n"===t.type||"s"===t.type?n[1][0]-n[0][0]+u:u})).attr("height",(function(t){return"e"===t.type||"w"===t.type?n[1][1]-n[0][1]+u:u}))):t.selectAll(".selection,.handle").style("display","none").attr("x",null).attr("y",null).attr("width",null).attr("height",null)}function s(t,n,e){var r=t.__brush.emitter;return!r||e&&r.clean?new l(t,n,e):r}function l(t,n,e){this.that=t,this.args=n,this.state=t.__brush,this.active=0,this.clean=e}function h(e){if((!n||e.touches)&&r.apply(this,arguments)){var i,a,u,c,l,h,d,p,g,y,v,_=this,b=e.target.__data__.type,m="selection"===(o&&e.metaKey?b="overlay":b)?ta:o&&e.altKey?ra:ea,x=t===sa?null:ga[b],w=t===fa?null:ya[b],M=xa(_),T=M.extent,A=M.selection,S=T[0][0],E=T[0][1],N=T[1][0],k=T[1][1],C=0,P=0,z=x&&w&&o&&e.shiftKey,$=Array.from(e.touches||[e],(t=>{const n=t.identifier;return(t=ne(t,_)).point0=t.slice(),t.identifier=n,t}));Gi(_);var D=s(_,arguments,!0).beforestart();if("overlay"===b){A&&(g=!0);const n=[$[0],$[1]||$[0]];M.selection=A=[[i=t===sa?S:aa(n[0][0],n[1][0]),u=t===fa?E:aa(n[0][1],n[1][1])],[l=t===sa?N:oa(n[0][0],n[1][0]),d=t===fa?k:oa(n[0][1],n[1][1])]],$.length>1&&I(e)}else i=A[0][0],u=A[0][1],l=A[1][0],d=A[1][1];a=i,c=u,h=l,p=d;var R=Zn(_).attr("pointer-events","none"),F=R.selectAll(".overlay").attr("cursor",ha[b]);if(e.touches)D.moved=U,D.ended=O;else{var q=Zn(e.view).on("mousemove.brush",U,!0).on("mouseup.brush",O,!0);o&&q.on("keydown.brush",(function(t){switch(t.keyCode){case 16:z=x&&w;break;case 18:m===ea&&(x&&(l=h-C*x,i=a+C*x),w&&(d=p-P*w,u=c+P*w),m=ra,I(t));break;case 32:m!==ea&&m!==ra||(x<0?l=h-C:x>0&&(i=a-C),w<0?d=p-P:w>0&&(u=c-P),m=na,F.attr("cursor",ha.selection),I(t));break;default:return}Jo(t)}),!0).on("keyup.brush",(function(t){switch(t.keyCode){case 16:z&&(y=v=z=!1,I(t));break;case 18:m===ra&&(x<0?l=h:x>0&&(i=a),w<0?d=p:w>0&&(u=c),m=ea,I(t));break;case 32:m===na&&(t.altKey?(x&&(l=h-C*x,i=a+C*x),w&&(d=p-P*w,u=c+P*w),m=ra):(x<0?l=h:x>0&&(i=a),w<0?d=p:w>0&&(u=c),m=ea),F.attr("cursor",ha[b]),I(t));break;default:return}Jo(t)}),!0),ae(e.view)}f.call(_),D.start(e,m.name)}function U(t){for(const n of t.changedTouches||[t])for(const t of $)t.identifier===n.identifier&&(t.cur=ne(n,_));if(z&&!y&&!v&&1===$.length){const t=$[0];ia(t.cur[0]-t[0])>ia(t.cur[1]-t[1])?v=!0:y=!0}for(const t of $)t.cur&&(t[0]=t.cur[0],t[1]=t.cur[1]);g=!0,Jo(t),I(t)}function I(t){const n=$[0],e=n.point0;var r;switch(C=n[0]-e[0],P=n[1]-e[1],m){case na:case ta:x&&(C=oa(S-i,aa(N-l,C)),a=i+C,h=l+C),w&&(P=oa(E-u,aa(k-d,P)),c=u+P,p=d+P);break;case ea:$[1]?(x&&(a=oa(S,aa(N,$[0][0])),h=oa(S,aa(N,$[1][0])),x=1),w&&(c=oa(E,aa(k,$[0][1])),p=oa(E,aa(k,$[1][1])),w=1)):(x<0?(C=oa(S-i,aa(N-i,C)),a=i+C,h=l):x>0&&(C=oa(S-l,aa(N-l,C)),a=i,h=l+C),w<0?(P=oa(E-u,aa(k-u,P)),c=u+P,p=d):w>0&&(P=oa(E-d,aa(k-d,P)),c=u,p=d+P));break;case ra:x&&(a=oa(S,aa(N,i-C*x)),h=oa(S,aa(N,l+C*x))),w&&(c=oa(E,aa(k,u-P*w)),p=oa(E,aa(k,d+P*w)))}ht+e))}function za(t,n){var e=0,r=null,i=null,o=null;function a(a){var u,c=a.length,f=new Array(c),s=Pa(0,c),l=new Array(c*c),h=new Array(c),d=0;a=Float64Array.from({length:c*c},n?(t,n)=>a[n%c][n/c|0]:(t,n)=>a[n/c|0][n%c]);for(let n=0;nr(f[t],f[n])));for(const e of s){const r=n;if(t){const t=Pa(1+~c,c).filter((t=>t<0?a[~t*c+e]:a[e*c+t]));i&&t.sort(((t,n)=>i(t<0?-a[~t*c+e]:a[e*c+t],n<0?-a[~n*c+e]:a[e*c+n])));for(const r of t)if(r<0){(l[~r*c+e]||(l[~r*c+e]={source:null,target:null})).target={index:e,startAngle:n,endAngle:n+=a[~r*c+e]*d,value:a[~r*c+e]}}else{(l[e*c+r]||(l[e*c+r]={source:null,target:null})).source={index:e,startAngle:n,endAngle:n+=a[e*c+r]*d,value:a[e*c+r]}}h[e]={index:e,startAngle:r,endAngle:n,value:f[e]}}else{const t=Pa(0,c).filter((t=>a[e*c+t]||a[t*c+e]));i&&t.sort(((t,n)=>i(a[e*c+t],a[e*c+n])));for(const r of t){let t;if(e=0))throw new Error(`invalid digits: ${t}`);if(n>15)return qa;const e=10**n;return function(t){this._+=t[0];for(let n=1,r=t.length;nRa)if(Math.abs(s*u-c*f)>Ra&&i){let h=e-o,d=r-a,p=u*u+c*c,g=h*h+d*d,y=Math.sqrt(p),v=Math.sqrt(l),_=i*Math.tan(($a-Math.acos((p+l-g)/(2*y*v)))/2),b=_/v,m=_/y;Math.abs(b-1)>Ra&&this._append`L${t+b*f},${n+b*s}`,this._append`A${i},${i},0,0,${+(s*h>f*d)},${this._x1=t+m*u},${this._y1=n+m*c}`}else this._append`L${this._x1=t},${this._y1=n}`;else;}arc(t,n,e,r,i,o){if(t=+t,n=+n,o=!!o,(e=+e)<0)throw new Error(`negative radius: ${e}`);let a=e*Math.cos(r),u=e*Math.sin(r),c=t+a,f=n+u,s=1^o,l=o?r-i:i-r;null===this._x1?this._append`M${c},${f}`:(Math.abs(this._x1-c)>Ra||Math.abs(this._y1-f)>Ra)&&this._append`L${c},${f}`,e&&(l<0&&(l=l%Da+Da),l>Fa?this._append`A${e},${e},0,1,${s},${t-a},${n-u}A${e},${e},0,1,${s},${this._x1=c},${this._y1=f}`:l>Ra&&this._append`A${e},${e},0,${+(l>=$a)},${s},${this._x1=t+e*Math.cos(i)},${this._y1=n+e*Math.sin(i)}`)}rect(t,n,e,r){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}h${e=+e}v${+r}h${-e}Z`}toString(){return this._}};function Ia(){return new Ua}Ia.prototype=Ua.prototype;var Oa=Array.prototype.slice;function Ba(t){return function(){return t}}function Ya(t){return t.source}function La(t){return t.target}function ja(t){return t.radius}function Ha(t){return t.startAngle}function Xa(t){return t.endAngle}function Ga(){return 0}function Va(){return 10}function Wa(t){var n=Ya,e=La,r=ja,i=ja,o=Ha,a=Xa,u=Ga,c=null;function f(){var f,s=n.apply(this,arguments),l=e.apply(this,arguments),h=u.apply(this,arguments)/2,d=Oa.call(arguments),p=+r.apply(this,(d[0]=s,d)),g=o.apply(this,d)-Ea,y=a.apply(this,d)-Ea,v=+i.apply(this,(d[0]=l,d)),_=o.apply(this,d)-Ea,b=a.apply(this,d)-Ea;if(c||(c=f=Ia()),h>Ca&&(Ma(y-g)>2*h+Ca?y>g?(g+=h,y-=h):(g-=h,y+=h):g=y=(g+y)/2,Ma(b-_)>2*h+Ca?b>_?(_+=h,b-=h):(_-=h,b+=h):_=b=(_+b)/2),c.moveTo(p*Ta(g),p*Aa(g)),c.arc(0,0,p,g,y),g!==_||y!==b)if(t){var m=v-+t.apply(this,arguments),x=(_+b)/2;c.quadraticCurveTo(0,0,m*Ta(_),m*Aa(_)),c.lineTo(v*Ta(x),v*Aa(x)),c.lineTo(m*Ta(b),m*Aa(b))}else c.quadraticCurveTo(0,0,v*Ta(_),v*Aa(_)),c.arc(0,0,v,_,b);if(c.quadraticCurveTo(0,0,p*Ta(g),p*Aa(g)),c.closePath(),f)return c=null,f+""||null}return t&&(f.headRadius=function(n){return arguments.length?(t="function"==typeof n?n:Ba(+n),f):t}),f.radius=function(t){return arguments.length?(r=i="function"==typeof t?t:Ba(+t),f):r},f.sourceRadius=function(t){return arguments.length?(r="function"==typeof t?t:Ba(+t),f):r},f.targetRadius=function(t){return arguments.length?(i="function"==typeof t?t:Ba(+t),f):i},f.startAngle=function(t){return arguments.length?(o="function"==typeof t?t:Ba(+t),f):o},f.endAngle=function(t){return arguments.length?(a="function"==typeof t?t:Ba(+t),f):a},f.padAngle=function(t){return arguments.length?(u="function"==typeof t?t:Ba(+t),f):u},f.source=function(t){return arguments.length?(n=t,f):n},f.target=function(t){return arguments.length?(e=t,f):e},f.context=function(t){return arguments.length?(c=null==t?null:t,f):c},f}var Za=Array.prototype.slice;function Ka(t,n){return t-n}var Qa=t=>()=>t;function Ja(t,n){for(var e,r=-1,i=n.length;++rr!=d>r&&e<(h-f)*(r-s)/(d-s)+f&&(i=-i)}return i}function nu(t,n,e){var r,i,o,a;return function(t,n,e){return(n[0]-t[0])*(e[1]-t[1])==(e[0]-t[0])*(n[1]-t[1])}(t,n,e)&&(i=t[r=+(t[0]===n[0])],o=e[r],a=n[r],i<=o&&o<=a||a<=o&&o<=i)}function eu(){}var ru=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function iu(){var t=1,n=1,e=K,r=u;function i(t){var n=e(t);if(Array.isArray(n))n=n.slice().sort(Ka);else{const e=M(t,ou);for(n=G(...Z(e[0],e[1],n),n);n[n.length-1]>=e[1];)n.pop();for(;n[1]o(t,n)))}function o(e,i){const o=null==i?NaN:+i;if(isNaN(o))throw new Error(`invalid value: ${i}`);var u=[],c=[];return function(e,r,i){var o,u,c,f,s,l,h=new Array,d=new Array;o=u=-1,f=au(e[0],r),ru[f<<1].forEach(p);for(;++o=r,ru[s<<2].forEach(p);for(;++o0?u.push([t]):c.push(t)})),c.forEach((function(t){for(var n,e=0,r=u.length;e0&&o0&&a=0&&o>=0))throw new Error("invalid size");return t=r,n=o,i},i.thresholds=function(t){return arguments.length?(e="function"==typeof t?t:Array.isArray(t)?Qa(Za.call(t)):Qa(t),i):e},i.smooth=function(t){return arguments.length?(r=t?u:eu,i):r===u},i}function ou(t){return isFinite(t)?t:NaN}function au(t,n){return null!=t&&+t>=n}function uu(t){return null==t||isNaN(t=+t)?-1/0:t}function cu(t,n,e,r){const i=r-n,o=e-n,a=isFinite(i)||isFinite(o)?i/o:Math.sign(i)/Math.sign(o);return isNaN(a)?t:t+a-.5}function fu(t){return t[0]}function su(t){return t[1]}function lu(){return 1}const hu=134217729,du=33306690738754706e-32;function pu(t,n,e,r,i){let o,a,u,c,f=n[0],s=r[0],l=0,h=0;s>f==s>-f?(o=f,f=n[++l]):(o=s,s=r[++h]);let d=0;if(lf==s>-f?(a=f+o,u=o-(a-f),f=n[++l]):(a=s+o,u=o-(a-s),s=r[++h]),o=a,0!==u&&(i[d++]=u);lf==s>-f?(a=o+f,c=a-o,u=o-(a-c)+(f-c),f=n[++l]):(a=o+s,c=a-o,u=o-(a-c)+(s-c),s=r[++h]),o=a,0!==u&&(i[d++]=u);for(;l=33306690738754716e-32*f?c:-function(t,n,e,r,i,o,a){let u,c,f,s,l,h,d,p,g,y,v,_,b,m,x,w,M,T;const A=t-i,S=e-i,E=n-o,N=r-o;m=A*N,h=hu*A,d=h-(h-A),p=A-d,h=hu*N,g=h-(h-N),y=N-g,x=p*y-(m-d*g-p*g-d*y),w=E*S,h=hu*E,d=h-(h-E),p=E-d,h=hu*S,g=h-(h-S),y=S-g,M=p*y-(w-d*g-p*g-d*y),v=x-M,l=x-v,_u[0]=x-(v+l)+(l-M),_=m+v,l=_-m,b=m-(_-l)+(v-l),v=b-w,l=b-v,_u[1]=b-(v+l)+(l-w),T=_+v,l=T-_,_u[2]=_-(T-l)+(v-l),_u[3]=T;let k=function(t,n){let e=n[0];for(let r=1;r=C||-k>=C)return k;if(l=t-A,u=t-(A+l)+(l-i),l=e-S,f=e-(S+l)+(l-i),l=n-E,c=n-(E+l)+(l-o),l=r-N,s=r-(N+l)+(l-o),0===u&&0===c&&0===f&&0===s)return k;if(C=vu*a+du*Math.abs(k),k+=A*s+N*u-(E*f+S*c),k>=C||-k>=C)return k;m=u*N,h=hu*u,d=h-(h-u),p=u-d,h=hu*N,g=h-(h-N),y=N-g,x=p*y-(m-d*g-p*g-d*y),w=c*S,h=hu*c,d=h-(h-c),p=c-d,h=hu*S,g=h-(h-S),y=S-g,M=p*y-(w-d*g-p*g-d*y),v=x-M,l=x-v,wu[0]=x-(v+l)+(l-M),_=m+v,l=_-m,b=m-(_-l)+(v-l),v=b-w,l=b-v,wu[1]=b-(v+l)+(l-w),T=_+v,l=T-_,wu[2]=_-(T-l)+(v-l),wu[3]=T;const P=pu(4,_u,4,wu,bu);m=A*s,h=hu*A,d=h-(h-A),p=A-d,h=hu*s,g=h-(h-s),y=s-g,x=p*y-(m-d*g-p*g-d*y),w=E*f,h=hu*E,d=h-(h-E),p=E-d,h=hu*f,g=h-(h-f),y=f-g,M=p*y-(w-d*g-p*g-d*y),v=x-M,l=x-v,wu[0]=x-(v+l)+(l-M),_=m+v,l=_-m,b=m-(_-l)+(v-l),v=b-w,l=b-v,wu[1]=b-(v+l)+(l-w),T=_+v,l=T-_,wu[2]=_-(T-l)+(v-l),wu[3]=T;const z=pu(P,bu,4,wu,mu);m=u*s,h=hu*u,d=h-(h-u),p=u-d,h=hu*s,g=h-(h-s),y=s-g,x=p*y-(m-d*g-p*g-d*y),w=c*f,h=hu*c,d=h-(h-c),p=c-d,h=hu*f,g=h-(h-f),y=f-g,M=p*y-(w-d*g-p*g-d*y),v=x-M,l=x-v,wu[0]=x-(v+l)+(l-M),_=m+v,l=_-m,b=m-(_-l)+(v-l),v=b-w,l=b-v,wu[1]=b-(v+l)+(l-w),T=_+v,l=T-_,wu[2]=_-(T-l)+(v-l),wu[3]=T;const $=pu(z,mu,4,wu,xu);return xu[$-1]}(t,n,e,r,i,o,f)}const Tu=Math.pow(2,-52),Au=new Uint32Array(512);class Su{static from(t,n=zu,e=$u){const r=t.length,i=new Float64Array(2*r);for(let o=0;o>1;if(n>0&&"number"!=typeof t[0])throw new Error("Expected coords to contain numbers.");this.coords=t;const e=Math.max(2*n-5,0);this._triangles=new Uint32Array(3*e),this._halfedges=new Int32Array(3*e),this._hashSize=Math.ceil(Math.sqrt(n)),this._hullPrev=new Uint32Array(n),this._hullNext=new Uint32Array(n),this._hullTri=new Uint32Array(n),this._hullHash=new Int32Array(this._hashSize),this._ids=new Uint32Array(n),this._dists=new Float64Array(n),this.update()}update(){const{coords:t,_hullPrev:n,_hullNext:e,_hullTri:r,_hullHash:i}=this,o=t.length>>1;let a=1/0,u=1/0,c=-1/0,f=-1/0;for(let n=0;nc&&(c=e),r>f&&(f=r),this._ids[n]=n}const s=(a+c)/2,l=(u+f)/2;let h,d,p;for(let n=0,e=1/0;n0&&(d=n,e=r)}let v=t[2*d],_=t[2*d+1],b=1/0;for(let n=0;nr&&(n[e++]=i,r=o)}return this.hull=n.subarray(0,e),this.triangles=new Uint32Array(0),void(this.halfedges=new Uint32Array(0))}if(Mu(g,y,v,_,m,x)<0){const t=d,n=v,e=_;d=p,v=m,_=x,p=t,m=n,x=e}const w=function(t,n,e,r,i,o){const a=e-t,u=r-n,c=i-t,f=o-n,s=a*a+u*u,l=c*c+f*f,h=.5/(a*f-u*c),d=t+(f*s-u*l)*h,p=n+(a*l-c*s)*h;return{x:d,y:p}}(g,y,v,_,m,x);this._cx=w.x,this._cy=w.y;for(let n=0;n0&&Math.abs(f-o)<=Tu&&Math.abs(s-a)<=Tu)continue;if(o=f,a=s,c===h||c===d||c===p)continue;let l=0;for(let t=0,n=this._hashKey(f,s);t=0;)if(y=g,y===l){y=-1;break}if(-1===y)continue;let v=this._addTriangle(y,c,e[y],-1,-1,r[y]);r[c]=this._legalize(v+2),r[y]=v,M++;let _=e[y];for(;g=e[_],Mu(f,s,t[2*_],t[2*_+1],t[2*g],t[2*g+1])<0;)v=this._addTriangle(_,c,g,r[c],-1,r[_]),r[c]=this._legalize(v+2),e[_]=_,M--,_=g;if(y===l)for(;g=n[y],Mu(f,s,t[2*g],t[2*g+1],t[2*y],t[2*y+1])<0;)v=this._addTriangle(g,c,y,-1,r[y],r[g]),this._legalize(v+2),r[g]=v,e[y]=y,M--,y=g;this._hullStart=n[c]=y,e[y]=n[_]=c,e[c]=_,i[this._hashKey(f,s)]=c,i[this._hashKey(t[2*y],t[2*y+1])]=y}this.hull=new Uint32Array(M);for(let t=0,n=this._hullStart;t0?3-e:1+e)/4}(t-this._cx,n-this._cy)*this._hashSize)%this._hashSize}_legalize(t){const{_triangles:n,_halfedges:e,coords:r}=this;let i=0,o=0;for(;;){const a=e[t],u=t-t%3;if(o=u+(t+2)%3,-1===a){if(0===i)break;t=Au[--i];continue}const c=a-a%3,f=u+(t+1)%3,s=c+(a+2)%3,l=n[o],h=n[t],d=n[f],p=n[s];if(Nu(r[2*l],r[2*l+1],r[2*h],r[2*h+1],r[2*d],r[2*d+1],r[2*p],r[2*p+1])){n[t]=p,n[a]=l;const r=e[s];if(-1===r){let n=this._hullStart;do{if(this._hullTri[n]===s){this._hullTri[n]=t;break}n=this._hullPrev[n]}while(n!==this._hullStart)}this._link(t,r),this._link(a,e[o]),this._link(o,s);const u=c+(a+1)%3;i=e&&n[t[a]]>o;)t[a+1]=t[a--];t[a+1]=r}else{let i=e+1,o=r;Pu(t,e+r>>1,i),n[t[e]]>n[t[r]]&&Pu(t,e,r),n[t[i]]>n[t[r]]&&Pu(t,i,r),n[t[e]]>n[t[i]]&&Pu(t,e,i);const a=t[i],u=n[a];for(;;){do{i++}while(n[t[i]]u);if(o=o-e?(Cu(t,n,i,r),Cu(t,n,e,o-1)):(Cu(t,n,e,o-1),Cu(t,n,i,r))}}function Pu(t,n,e){const r=t[n];t[n]=t[e],t[e]=r}function zu(t){return t[0]}function $u(t){return t[1]}const Du=1e-6;class Ru{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=""}moveTo(t,n){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")}lineTo(t,n){this._+=`L${this._x1=+t},${this._y1=+n}`}arc(t,n,e){const r=(t=+t)+(e=+e),i=n=+n;if(e<0)throw new Error("negative radius");null===this._x1?this._+=`M${r},${i}`:(Math.abs(this._x1-r)>Du||Math.abs(this._y1-i)>Du)&&(this._+="L"+r+","+i),e&&(this._+=`A${e},${e},0,1,1,${t-e},${n}A${e},${e},0,1,1,${this._x1=r},${this._y1=i}`)}rect(t,n,e,r){this._+=`M${this._x0=this._x1=+t},${this._y0=this._y1=+n}h${+e}v${+r}h${-e}Z`}value(){return this._||null}}class Fu{constructor(){this._=[]}moveTo(t,n){this._.push([t,n])}closePath(){this._.push(this._[0].slice())}lineTo(t,n){this._.push([t,n])}value(){return this._.length?this._:null}}class qu{constructor(t,[n,e,r,i]=[0,0,960,500]){if(!((r=+r)>=(n=+n)&&(i=+i)>=(e=+e)))throw new Error("invalid bounds");this.delaunay=t,this._circumcenters=new Float64Array(2*t.points.length),this.vectors=new Float64Array(2*t.points.length),this.xmax=r,this.xmin=n,this.ymax=i,this.ymin=e,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){const{delaunay:{points:t,hull:n,triangles:e},vectors:r}=this;let i,o;const a=this.circumcenters=this._circumcenters.subarray(0,e.length/3*2);for(let r,u,c=0,f=0,s=e.length;c1;)i-=2;for(let t=2;t0){if(n>=this.ymax)return null;(i=(this.ymax-n)/r)0){if(t>=this.xmax)return null;(i=(this.xmax-t)/e)this.xmax?2:0)|(nthis.ymax?8:0)}_simplify(t){if(t&&t.length>4){for(let n=0;n2&&function(t){const{triangles:n,coords:e}=t;for(let t=0;t1e-10)return!1}return!0}(t)){this.collinear=Int32Array.from({length:n.length/2},((t,n)=>n)).sort(((t,e)=>n[2*t]-n[2*e]||n[2*t+1]-n[2*e+1]));const t=this.collinear[0],e=this.collinear[this.collinear.length-1],r=[n[2*t],n[2*t+1],n[2*e],n[2*e+1]],i=1e-8*Math.hypot(r[3]-r[1],r[2]-r[0]);for(let t=0,e=n.length/2;t0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=r[0],o[r[0]]=1,2===r.length&&(o[r[1]]=0,this.triangles[1]=r[1],this.triangles[2]=r[1]))}voronoi(t){return new qu(this,t)}*neighbors(t){const{inedges:n,hull:e,_hullIndex:r,halfedges:i,triangles:o,collinear:a}=this;if(a){const n=a.indexOf(t);return n>0&&(yield a[n-1]),void(n=0&&i!==e&&i!==r;)e=i;return i}_step(t,n,e){const{inedges:r,hull:i,_hullIndex:o,halfedges:a,triangles:u,points:c}=this;if(-1===r[t]||!c.length)return(t+1)%(c.length>>1);let f=t,s=Iu(n-c[2*t],2)+Iu(e-c[2*t+1],2);const l=r[t];let h=l;do{let r=u[h];const l=Iu(n-c[2*r],2)+Iu(e-c[2*r+1],2);if(l9999?"+"+Ku(n,6):Ku(n,4))+"-"+Ku(t.getUTCMonth()+1,2)+"-"+Ku(t.getUTCDate(),2)+(o?"T"+Ku(e,2)+":"+Ku(r,2)+":"+Ku(i,2)+"."+Ku(o,3)+"Z":i?"T"+Ku(e,2)+":"+Ku(r,2)+":"+Ku(i,2)+"Z":r||e?"T"+Ku(e,2)+":"+Ku(r,2)+"Z":"")}function Ju(t){var n=new RegExp('["'+t+"\n\r]"),e=t.charCodeAt(0);function r(t,n){var r,i=[],o=t.length,a=0,u=0,c=o<=0,f=!1;function s(){if(c)return Hu;if(f)return f=!1,ju;var n,r,i=a;if(t.charCodeAt(i)===Xu){for(;a++=o?c=!0:(r=t.charCodeAt(a++))===Gu?f=!0:r===Vu&&(f=!0,t.charCodeAt(a)===Gu&&++a),t.slice(i+1,n-1).replace(/""/g,'"')}for(;amc(n,e).then((n=>(new DOMParser).parseFromString(n,t)))}var Sc=Ac("application/xml"),Ec=Ac("text/html"),Nc=Ac("image/svg+xml");function kc(t,n,e,r){if(isNaN(n)||isNaN(e))return t;var i,o,a,u,c,f,s,l,h,d=t._root,p={data:r},g=t._x0,y=t._y0,v=t._x1,_=t._y1;if(!d)return t._root=p,t;for(;d.length;)if((f=n>=(o=(g+v)/2))?g=o:v=o,(s=e>=(a=(y+_)/2))?y=a:_=a,i=d,!(d=d[l=s<<1|f]))return i[l]=p,t;if(u=+t._x.call(null,d.data),c=+t._y.call(null,d.data),n===u&&e===c)return p.next=d,i?i[l]=p:t._root=p,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(f=n>=(o=(g+v)/2))?g=o:v=o,(s=e>=(a=(y+_)/2))?y=a:_=a}while((l=s<<1|f)==(h=(c>=a)<<1|u>=o));return i[h]=d,i[l]=p,t}function Cc(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function Pc(t){return t[0]}function zc(t){return t[1]}function $c(t,n,e){var r=new Dc(null==n?Pc:n,null==e?zc:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function Dc(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function Rc(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}var Fc=$c.prototype=Dc.prototype;function qc(t){return function(){return t}}function Uc(t){return 1e-6*(t()-.5)}function Ic(t){return t.x+t.vx}function Oc(t){return t.y+t.vy}function Bc(t){return t.index}function Yc(t,n){var e=t.get(n);if(!e)throw new Error("node not found: "+n);return e}Fc.copy=function(){var t,n,e=new Dc(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=Rc(r),e;for(t=[{source:r,target:e._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=new Array(4)}):r.target[i]=Rc(n));return e},Fc.add=function(t){const n=+this._x.call(null,t),e=+this._y.call(null,t);return kc(this.cover(n,e),n,e,t)},Fc.addAll=function(t){var n,e,r,i,o=t.length,a=new Array(o),u=new Array(o),c=1/0,f=1/0,s=-1/0,l=-1/0;for(e=0;es&&(s=r),il&&(l=i));if(c>s||f>l)return this;for(this.cover(c,f).cover(s,l),e=0;et||t>=i||r>n||n>=o;)switch(u=(nh||(o=c.y0)>d||(a=c.x1)=v)<<1|t>=y)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-f],p[p.length-1-f]=c)}else{var _=t-+this._x.call(null,g.data),b=n-+this._y.call(null,g.data),m=_*_+b*b;if(m=(u=(p+y)/2))?p=u:y=u,(s=a>=(c=(g+v)/2))?g=c:v=c,n=d,!(d=d[l=s<<1|f]))return this;if(!d.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):n?(i?n[l]=i:delete n[l],(d=n[0]||n[1]||n[2]||n[3])&&d===(n[3]||n[2]||n[1]||n[0])&&!d.length&&(e?e[h]=d:this._root=d),this):(this._root=i,this)},Fc.removeAll=function(t){for(var n=0,e=t.length;n1?r[0]+r.slice(2):r,+t.slice(e+1)]}function Zc(t){return(t=Wc(Math.abs(t)))?t[1]:NaN}var Kc,Qc=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Jc(t){if(!(n=Qc.exec(t)))throw new Error("invalid format: "+t);var n;return new tf({fill:n[1],align:n[2],sign:n[3],symbol:n[4],zero:n[5],width:n[6],comma:n[7],precision:n[8]&&n[8].slice(1),trim:n[9],type:n[10]})}function tf(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function nf(t,n){var e=Wc(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}Jc.prototype=tf.prototype,tf.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var ef={"%":(t,n)=>(100*t).toFixed(n),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,n)=>t.toExponential(n),f:(t,n)=>t.toFixed(n),g:(t,n)=>t.toPrecision(n),o:t=>Math.round(t).toString(8),p:(t,n)=>nf(100*t,n),r:nf,s:function(t,n){var e=Wc(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(Kc=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+Wc(t,Math.max(0,n+o-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function rf(t){return t}var of,af=Array.prototype.map,uf=["y","z","a","f","p","n","Âĩ","m","","k","M","G","T","P","E","Z","Y"];function cf(t){var n,e,r=void 0===t.grouping||void 0===t.thousands?rf:(n=af.call(t.grouping,Number),e=t.thousands+"",function(t,r){for(var i=t.length,o=[],a=0,u=n[0],c=0;i>0&&u>0&&(c+u+1>r&&(u=Math.max(1,r-c)),o.push(t.substring(i-=u,i+u)),!((c+=u+1)>r));)u=n[a=(a+1)%n.length];return o.reverse().join(e)}),i=void 0===t.currency?"":t.currency[0]+"",o=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",u=void 0===t.numerals?rf:function(t){return function(n){return n.replace(/[0-9]/g,(function(n){return t[+n]}))}}(af.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",f=void 0===t.minus?"−":t.minus+"",s=void 0===t.nan?"NaN":t.nan+"";function l(t){var n=(t=Jc(t)).fill,e=t.align,l=t.sign,h=t.symbol,d=t.zero,p=t.width,g=t.comma,y=t.precision,v=t.trim,_=t.type;"n"===_?(g=!0,_="g"):ef[_]||(void 0===y&&(y=12),v=!0,_="g"),(d||"0"===n&&"="===e)&&(d=!0,n="0",e="=");var b="$"===h?i:"#"===h&&/[boxX]/.test(_)?"0"+_.toLowerCase():"",m="$"===h?o:/[%p]/.test(_)?c:"",x=ef[_],w=/[defgprs%]/.test(_);function M(t){var i,o,c,h=b,M=m;if("c"===_)M=x(t)+M,t="";else{var T=(t=+t)<0||1/t<0;if(t=isNaN(t)?s:x(Math.abs(t),y),v&&(t=function(t){t:for(var n,e=t.length,r=1,i=-1;r0&&(i=0)}return i>0?t.slice(0,i)+t.slice(n+1):t}(t)),T&&0==+t&&"+"!==l&&(T=!1),h=(T?"("===l?l:f:"-"===l||"("===l?"":l)+h,M=("s"===_?uf[8+Kc/3]:"")+M+(T&&"("===l?")":""),w)for(i=-1,o=t.length;++i(c=t.charCodeAt(i))||c>57){M=(46===c?a+t.slice(i+1):t.slice(i))+M,t=t.slice(0,i);break}}g&&!d&&(t=r(t,1/0));var A=h.length+t.length+M.length,S=A>1)+h+t+M+S.slice(A);break;default:t=S+h+t+M}return u(t)}return y=void 0===y?6:/[gprs]/.test(_)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),M.toString=function(){return t+""},M}return{format:l,formatPrefix:function(t,n){var e=l(((t=Jc(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(Zc(n)/3))),i=Math.pow(10,-r),o=uf[8+r/3];return function(t){return e(i*t)+o}}}}function ff(n){return of=cf(n),t.format=of.format,t.formatPrefix=of.formatPrefix,of}function sf(t){return Math.max(0,-Zc(Math.abs(t)))}function lf(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Zc(n)/3)))-Zc(Math.abs(t)))}function hf(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,Zc(n)-Zc(t))+1}t.format=void 0,t.formatPrefix=void 0,ff({thousands:",",grouping:[3],currency:["$",""]});var df=1e-6,pf=1e-12,gf=Math.PI,yf=gf/2,vf=gf/4,_f=2*gf,bf=180/gf,mf=gf/180,xf=Math.abs,wf=Math.atan,Mf=Math.atan2,Tf=Math.cos,Af=Math.ceil,Sf=Math.exp,Ef=Math.hypot,Nf=Math.log,kf=Math.pow,Cf=Math.sin,Pf=Math.sign||function(t){return t>0?1:t<0?-1:0},zf=Math.sqrt,$f=Math.tan;function Df(t){return t>1?0:t<-1?gf:Math.acos(t)}function Rf(t){return t>1?yf:t<-1?-yf:Math.asin(t)}function Ff(t){return(t=Cf(t/2))*t}function qf(){}function Uf(t,n){t&&Of.hasOwnProperty(t.type)&&Of[t.type](t,n)}var If={Feature:function(t,n){Uf(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r=0?1:-1,i=r*e,o=Tf(n=(n*=mf)/2+vf),a=Cf(n),u=Vf*a,c=Gf*o+u*Tf(i),f=u*r*Cf(i);as.add(Mf(f,c)),Xf=t,Gf=o,Vf=a}function ds(t){return[Mf(t[1],t[0]),Rf(t[2])]}function ps(t){var n=t[0],e=t[1],r=Tf(e);return[r*Tf(n),r*Cf(n),Cf(e)]}function gs(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function ys(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function vs(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function _s(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function bs(t){var n=zf(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}var ms,xs,ws,Ms,Ts,As,Ss,Es,Ns,ks,Cs,Ps,zs,$s,Ds,Rs,Fs={point:qs,lineStart:Is,lineEnd:Os,polygonStart:function(){Fs.point=Bs,Fs.lineStart=Ys,Fs.lineEnd=Ls,rs=new T,cs.polygonStart()},polygonEnd:function(){cs.polygonEnd(),Fs.point=qs,Fs.lineStart=Is,Fs.lineEnd=Os,as<0?(Wf=-(Kf=180),Zf=-(Qf=90)):rs>df?Qf=90:rs<-df&&(Zf=-90),os[0]=Wf,os[1]=Kf},sphere:function(){Wf=-(Kf=180),Zf=-(Qf=90)}};function qs(t,n){is.push(os=[Wf=t,Kf=t]),nQf&&(Qf=n)}function Us(t,n){var e=ps([t*mf,n*mf]);if(es){var r=ys(es,e),i=ys([r[1],-r[0],0],r);bs(i),i=ds(i);var o,a=t-Jf,u=a>0?1:-1,c=i[0]*bf*u,f=xf(a)>180;f^(u*JfQf&&(Qf=o):f^(u*Jf<(c=(c+360)%360-180)&&cQf&&(Qf=n)),f?tjs(Wf,Kf)&&(Kf=t):js(t,Kf)>js(Wf,Kf)&&(Wf=t):Kf>=Wf?(tKf&&(Kf=t)):t>Jf?js(Wf,t)>js(Wf,Kf)&&(Kf=t):js(t,Kf)>js(Wf,Kf)&&(Wf=t)}else is.push(os=[Wf=t,Kf=t]);nQf&&(Qf=n),es=e,Jf=t}function Is(){Fs.point=Us}function Os(){os[0]=Wf,os[1]=Kf,Fs.point=qs,es=null}function Bs(t,n){if(es){var e=t-Jf;rs.add(xf(e)>180?e+(e>0?360:-360):e)}else ts=t,ns=n;cs.point(t,n),Us(t,n)}function Ys(){cs.lineStart()}function Ls(){Bs(ts,ns),cs.lineEnd(),xf(rs)>df&&(Wf=-(Kf=180)),os[0]=Wf,os[1]=Kf,es=null}function js(t,n){return(n-=t)<0?n+360:n}function Hs(t,n){return t[0]-n[0]}function Xs(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:ngf&&(t-=Math.round(t/_f)*_f),[t,n]}function ul(t,n,e){return(t%=_f)?n||e?ol(fl(t),sl(n,e)):fl(t):n||e?sl(n,e):al}function cl(t){return function(n,e){return xf(n+=t)>gf&&(n-=Math.round(n/_f)*_f),[n,e]}}function fl(t){var n=cl(t);return n.invert=cl(-t),n}function sl(t,n){var e=Tf(t),r=Cf(t),i=Tf(n),o=Cf(n);function a(t,n){var a=Tf(n),u=Tf(t)*a,c=Cf(t)*a,f=Cf(n),s=f*e+u*r;return[Mf(c*i-s*o,u*e-f*r),Rf(s*i+c*o)]}return a.invert=function(t,n){var a=Tf(n),u=Tf(t)*a,c=Cf(t)*a,f=Cf(n),s=f*i-c*o;return[Mf(c*i+f*o,u*e+s*r),Rf(s*e-u*r)]},a}function ll(t){function n(n){return(n=t(n[0]*mf,n[1]*mf))[0]*=bf,n[1]*=bf,n}return t=ul(t[0]*mf,t[1]*mf,t.length>2?t[2]*mf:0),n.invert=function(n){return(n=t.invert(n[0]*mf,n[1]*mf))[0]*=bf,n[1]*=bf,n},n}function hl(t,n,e,r,i,o){if(e){var a=Tf(n),u=Cf(n),c=r*e;null==i?(i=n+r*_f,o=n-c/2):(i=dl(a,i),o=dl(a,o),(r>0?io)&&(i+=r*_f));for(var f,s=i;r>0?s>o:s1&&n.push(n.pop().concat(n.shift()))},result:function(){var e=n;return n=[],t=null,e}}}function gl(t,n){return xf(t[0]-n[0])=0;--o)i.point((s=f[o])[0],s[1]);else r(h.x,h.p.x,-1,i);h=h.p}f=(h=h.o).z,d=!d}while(!h.v);i.lineEnd()}}}function _l(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r=0?1:-1,E=S*A,N=E>gf,k=y*w;if(c.add(Mf(k*S*Cf(E),v*M+k*Tf(E))),a+=N?A+S*_f:A,N^p>=e^m>=e){var C=ys(ps(d),ps(b));bs(C);var P=ys(o,C);bs(P);var z=(N^A>=0?-1:1)*Rf(P[2]);(r>z||r===z&&(C[0]||C[1]))&&(u+=N^A>=0?1:-1)}}return(a<-df||a0){for(l||(i.polygonStart(),l=!0),i.lineStart(),t=0;t1&&2&c&&h.push(h.pop().concat(h.shift())),a.push(h.filter(wl))}return h}}function wl(t){return t.length>1}function Ml(t,n){return((t=t.x)[0]<0?t[1]-yf-df:yf-t[1])-((n=n.x)[0]<0?n[1]-yf-df:yf-n[1])}al.invert=al;var Tl=xl((function(){return!0}),(function(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,a){var u=o>0?gf:-gf,c=xf(o-e);xf(c-gf)0?yf:-yf),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(o,r),n=0):i!==u&&c>=gf&&(xf(e-i)df?wf((Cf(n)*(o=Tf(r))*Cf(e)-Cf(r)*(i=Tf(n))*Cf(t))/(i*o*a)):(n+r)/2}(e,r,o,a),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),n=0),t.point(e=o,r=a),i=u},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}}),(function(t,n,e,r){var i;if(null==t)i=e*yf,r.point(-gf,i),r.point(0,i),r.point(gf,i),r.point(gf,0),r.point(gf,-i),r.point(0,-i),r.point(-gf,-i),r.point(-gf,0),r.point(-gf,i);else if(xf(t[0]-n[0])>df){var o=t[0]0,i=xf(n)>df;function o(t,e){return Tf(t)*Tf(e)>n}function a(t,e,r){var i=[1,0,0],o=ys(ps(t),ps(e)),a=gs(o,o),u=o[0],c=a-u*u;if(!c)return!r&&t;var f=n*a/c,s=-n*u/c,l=ys(i,o),h=_s(i,f);vs(h,_s(o,s));var d=l,p=gs(h,d),g=gs(d,d),y=p*p-g*(gs(h,h)-1);if(!(y<0)){var v=zf(y),_=_s(d,(-p-v)/g);if(vs(_,h),_=ds(_),!r)return _;var b,m=t[0],x=e[0],w=t[1],M=e[1];x0^_[1]<(xf(_[0]-m)gf^(m<=_[0]&&_[0]<=x)){var S=_s(d,(-p+v)/g);return vs(S,h),[_,ds(S)]}}}function u(n,e){var i=r?t:gf-t,o=0;return n<-i?o|=1:n>i&&(o|=2),e<-i?o|=4:e>i&&(o|=8),o}return xl(o,(function(t){var n,e,c,f,s;return{lineStart:function(){f=c=!1,s=1},point:function(l,h){var d,p=[l,h],g=o(l,h),y=r?g?0:u(l,h):g?u(l+(l<0?gf:-gf),h):0;if(!n&&(f=c=g)&&t.lineStart(),g!==c&&(!(d=a(n,p))||gl(n,d)||gl(p,d))&&(p[2]=1),g!==c)s=0,g?(t.lineStart(),d=a(p,n),t.point(d[0],d[1])):(d=a(n,p),t.point(d[0],d[1],2),t.lineEnd()),n=d;else if(i&&n&&r^g){var v;y&e||!(v=a(p,n,!0))||(s=0,r?(t.lineStart(),t.point(v[0][0],v[0][1]),t.point(v[1][0],v[1][1]),t.lineEnd()):(t.point(v[1][0],v[1][1]),t.lineEnd(),t.lineStart(),t.point(v[0][0],v[0][1],3)))}!g||n&&gl(n,p)||t.point(p[0],p[1]),n=p,c=g,e=y},lineEnd:function(){c&&t.lineEnd(),n=null},clean:function(){return s|(f&&c)<<1}}}),(function(n,r,i,o){hl(o,t,e,i,n,r)}),r?[0,-t]:[-gf,t-gf])}var Sl,El,Nl,kl,Cl=1e9,Pl=-Cl;function zl(t,n,e,r){function i(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function o(i,o,u,f){var s=0,l=0;if(null==i||(s=a(i,u))!==(l=a(o,u))||c(i,o)<0^u>0)do{f.point(0===s||3===s?t:e,s>1?r:n)}while((s=(s+u+4)%4)!==l);else f.point(o[0],o[1])}function a(r,i){return xf(r[0]-t)0?0:3:xf(r[0]-e)0?2:1:xf(r[1]-n)0?1:0:i>0?3:2}function u(t,n){return c(t.x,n.x)}function c(t,n){var e=a(t,1),r=a(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(a){var c,f,s,l,h,d,p,g,y,v,_,b=a,m=pl(),x={point:w,lineStart:function(){x.point=M,f&&f.push(s=[]);v=!0,y=!1,p=g=NaN},lineEnd:function(){c&&(M(l,h),d&&y&&m.rejoin(),c.push(m.result()));x.point=w,y&&b.lineEnd()},polygonStart:function(){b=m,c=[],f=[],_=!0},polygonEnd:function(){var n=function(){for(var n=0,e=0,i=f.length;er&&(h-o)*(r-a)>(d-a)*(t-o)&&++n:d<=r&&(h-o)*(r-a)<(d-a)*(t-o)&&--n;return n}(),e=_&&n,i=(c=ft(c)).length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),o(null,null,1,a),a.lineEnd()),i&&vl(c,u,n,o,a),a.polygonEnd());b=a,c=f=s=null}};function w(t,n){i(t,n)&&b.point(t,n)}function M(o,a){var u=i(o,a);if(f&&s.push([o,a]),v)l=o,h=a,d=u,v=!1,u&&(b.lineStart(),b.point(o,a));else if(u&&y)b.point(o,a);else{var c=[p=Math.max(Pl,Math.min(Cl,p)),g=Math.max(Pl,Math.min(Cl,g))],m=[o=Math.max(Pl,Math.min(Cl,o)),a=Math.max(Pl,Math.min(Cl,a))];!function(t,n,e,r,i,o){var a,u=t[0],c=t[1],f=0,s=1,l=n[0]-u,h=n[1]-c;if(a=e-u,l||!(a>0)){if(a/=l,l<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=i-u,l||!(a<0)){if(a/=l,l<0){if(a>s)return;a>f&&(f=a)}else if(l>0){if(a0)){if(a/=h,h<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=o-c,h||!(a<0)){if(a/=h,h<0){if(a>s)return;a>f&&(f=a)}else if(h>0){if(a0&&(t[0]=u+f*l,t[1]=c+f*h),s<1&&(n[0]=u+s*l,n[1]=c+s*h),!0}}}}}(c,m,t,n,e,r)?u&&(b.lineStart(),b.point(o,a),_=!1):(y||(b.lineStart(),b.point(c[0],c[1])),b.point(m[0],m[1]),u||b.lineEnd(),_=!1)}p=o,g=a,y=u}return x}}var $l={sphere:qf,point:qf,lineStart:function(){$l.point=Rl,$l.lineEnd=Dl},lineEnd:qf,polygonStart:qf,polygonEnd:qf};function Dl(){$l.point=$l.lineEnd=qf}function Rl(t,n){El=t*=mf,Nl=Cf(n*=mf),kl=Tf(n),$l.point=Fl}function Fl(t,n){t*=mf;var e=Cf(n*=mf),r=Tf(n),i=xf(t-El),o=Tf(i),a=r*Cf(i),u=kl*e-Nl*r*o,c=Nl*e+kl*r*o;Sl.add(Mf(zf(a*a+u*u),c)),El=t,Nl=e,kl=r}function ql(t){return Sl=new T,Lf(t,$l),+Sl}var Ul=[null,null],Il={type:"LineString",coordinates:Ul};function Ol(t,n){return Ul[0]=t,Ul[1]=n,ql(Il)}var Bl={Feature:function(t,n){return Ll(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r0&&(i=Ol(t[o],t[o-1]))>0&&e<=i&&r<=i&&(e+r-i)*(1-Math.pow((e-r)/i,2))df})).map(c)).concat(lt(Af(o/d)*d,i,d).filter((function(t){return xf(t%g)>df})).map(f))}return v.lines=function(){return _().map((function(t){return{type:"LineString",coordinates:t}}))},v.outline=function(){return{type:"Polygon",coordinates:[s(r).concat(l(a).slice(1),s(e).reverse().slice(1),l(u).reverse().slice(1))]}},v.extent=function(t){return arguments.length?v.extentMajor(t).extentMinor(t):v.extentMinor()},v.extentMajor=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],u=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),u>a&&(t=u,u=a,a=t),v.precision(y)):[[r,u],[e,a]]},v.extentMinor=function(e){return arguments.length?(n=+e[0][0],t=+e[1][0],o=+e[0][1],i=+e[1][1],n>t&&(e=n,n=t,t=e),o>i&&(e=o,o=i,i=e),v.precision(y)):[[n,o],[t,i]]},v.step=function(t){return arguments.length?v.stepMajor(t).stepMinor(t):v.stepMinor()},v.stepMajor=function(t){return arguments.length?(p=+t[0],g=+t[1],v):[p,g]},v.stepMinor=function(t){return arguments.length?(h=+t[0],d=+t[1],v):[h,d]},v.precision=function(h){return arguments.length?(y=+h,c=Wl(o,i,90),f=Zl(n,t,y),s=Wl(u,a,90),l=Zl(r,e,y),v):y},v.extentMajor([[-180,-90+df],[180,90-df]]).extentMinor([[-180,-80-df],[180,80+df]])}var Ql,Jl,th,nh,eh=t=>t,rh=new T,ih=new T,oh={point:qf,lineStart:qf,lineEnd:qf,polygonStart:function(){oh.lineStart=ah,oh.lineEnd=fh},polygonEnd:function(){oh.lineStart=oh.lineEnd=oh.point=qf,rh.add(xf(ih)),ih=new T},result:function(){var t=rh/2;return rh=new T,t}};function ah(){oh.point=uh}function uh(t,n){oh.point=ch,Ql=th=t,Jl=nh=n}function ch(t,n){ih.add(nh*t-th*n),th=t,nh=n}function fh(){ch(Ql,Jl)}var sh=oh,lh=1/0,hh=lh,dh=-lh,ph=dh,gh={point:function(t,n){tdh&&(dh=t);nph&&(ph=n)},lineStart:qf,lineEnd:qf,polygonStart:qf,polygonEnd:qf,result:function(){var t=[[lh,hh],[dh,ph]];return dh=ph=-(hh=lh=1/0),t}};var yh,vh,_h,bh,mh=gh,xh=0,wh=0,Mh=0,Th=0,Ah=0,Sh=0,Eh=0,Nh=0,kh=0,Ch={point:Ph,lineStart:zh,lineEnd:Rh,polygonStart:function(){Ch.lineStart=Fh,Ch.lineEnd=qh},polygonEnd:function(){Ch.point=Ph,Ch.lineStart=zh,Ch.lineEnd=Rh},result:function(){var t=kh?[Eh/kh,Nh/kh]:Sh?[Th/Sh,Ah/Sh]:Mh?[xh/Mh,wh/Mh]:[NaN,NaN];return xh=wh=Mh=Th=Ah=Sh=Eh=Nh=kh=0,t}};function Ph(t,n){xh+=t,wh+=n,++Mh}function zh(){Ch.point=$h}function $h(t,n){Ch.point=Dh,Ph(_h=t,bh=n)}function Dh(t,n){var e=t-_h,r=n-bh,i=zf(e*e+r*r);Th+=i*(_h+t)/2,Ah+=i*(bh+n)/2,Sh+=i,Ph(_h=t,bh=n)}function Rh(){Ch.point=Ph}function Fh(){Ch.point=Uh}function qh(){Ih(yh,vh)}function Uh(t,n){Ch.point=Ih,Ph(yh=_h=t,vh=bh=n)}function Ih(t,n){var e=t-_h,r=n-bh,i=zf(e*e+r*r);Th+=i*(_h+t)/2,Ah+=i*(bh+n)/2,Sh+=i,Eh+=(i=bh*t-_h*n)*(_h+t),Nh+=i*(bh+n),kh+=3*i,Ph(_h=t,bh=n)}var Oh=Ch;function Bh(t){this._context=t}Bh.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._context.moveTo(t,n),this._point=1;break;case 1:this._context.lineTo(t,n);break;default:this._context.moveTo(t+this._radius,n),this._context.arc(t,n,this._radius,0,_f)}},result:qf};var Yh,Lh,jh,Hh,Xh,Gh=new T,Vh={point:qf,lineStart:function(){Vh.point=Wh},lineEnd:function(){Yh&&Zh(Lh,jh),Vh.point=qf},polygonStart:function(){Yh=!0},polygonEnd:function(){Yh=null},result:function(){var t=+Gh;return Gh=new T,t}};function Wh(t,n){Vh.point=Zh,Lh=Hh=t,jh=Xh=n}function Zh(t,n){Hh-=t,Xh-=n,Gh.add(zf(Hh*Hh+Xh*Xh)),Hh=t,Xh=n}var Kh=Vh;let Qh,Jh,td,nd;class ed{constructor(t){this._append=null==t?rd:function(t){const n=Math.floor(t);if(!(n>=0))throw new RangeError(`invalid digits: ${t}`);if(n>15)return rd;if(n!==Qh){const t=10**n;Qh=n,Jh=function(n){let e=1;this._+=n[0];for(const r=n.length;e4*n&&g--){var m=a+h,x=u+d,w=c+p,M=zf(m*m+x*x+w*w),T=Rf(w/=M),A=xf(xf(w)-1)n||xf((v*k+_*C)/b-.5)>.3||a*h+u*d+c*p2?t[2]%360*mf:0,k()):[y*bf,v*bf,_*bf]},E.angle=function(t){return arguments.length?(b=t%360*mf,k()):b*bf},E.reflectX=function(t){return arguments.length?(m=t?-1:1,k()):m<0},E.reflectY=function(t){return arguments.length?(x=t?-1:1,k()):x<0},E.precision=function(t){return arguments.length?(a=dd(u,S=t*t),C()):zf(S)},E.fitExtent=function(t,n){return ud(E,t,n)},E.fitSize=function(t,n){return cd(E,t,n)},E.fitWidth=function(t,n){return fd(E,t,n)},E.fitHeight=function(t,n){return sd(E,t,n)},function(){return n=t.apply(this,arguments),E.invert=n.invert&&N,k()}}function _d(t){var n=0,e=gf/3,r=vd(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*mf,e=t[1]*mf):[n*bf,e*bf]},i}function bd(t,n){var e=Cf(t),r=(e+Cf(n))/2;if(xf(r)0?n<-yf+df&&(n=-yf+df):n>yf-df&&(n=yf-df);var e=i/kf(Nd(n),r);return[e*Cf(r*t),i-e*Tf(r*t)]}return o.invert=function(t,n){var e=i-n,o=Pf(r)*zf(t*t+e*e),a=Mf(t,xf(e))*Pf(e);return e*r<0&&(a-=gf*Pf(t)*Pf(e)),[a/r,2*wf(kf(i/o,1/r))-yf]},o}function Cd(t,n){return[t,n]}function Pd(t,n){var e=Tf(t),r=t===n?Cf(t):(e-Tf(n))/(n-t),i=e/r+t;if(xf(r)=0;)n+=e[r].value;else n=1;t.value=n}function Gd(t,n){t instanceof Map?(t=[void 0,t],void 0===n&&(n=Wd)):void 0===n&&(n=Vd);for(var e,r,i,o,a,u=new Qd(t),c=[u];e=c.pop();)if((i=n(e.data))&&(a=(i=Array.from(i)).length))for(e.children=i,o=a-1;o>=0;--o)c.push(r=i[o]=new Qd(i[o])),r.parent=e,r.depth=e.depth+1;return u.eachBefore(Kd)}function Vd(t){return t.children}function Wd(t){return Array.isArray(t)?t[1]:null}function Zd(t){void 0!==t.data.value&&(t.value=t.data.value),t.data=t.data.data}function Kd(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function Qd(t){this.data=t,this.depth=this.height=0,this.parent=null}function Jd(t){return null==t?null:tp(t)}function tp(t){if("function"!=typeof t)throw new Error;return t}function np(){return 0}function ep(t){return function(){return t}}qd.invert=function(t,n){for(var e,r=n,i=r*r,o=i*i*i,a=0;a<12&&(o=(i=(r-=e=(r*(zd+$d*i+o*(Dd+Rd*i))-n)/(zd+3*$d*i+o*(7*Dd+9*Rd*i)))*r)*i*i,!(xf(e)df&&--i>0);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},Od.invert=Md(Rf),Bd.invert=Md((function(t){return 2*wf(t)})),Yd.invert=function(t,n){return[-n,2*wf(Sf(t))-yf]},Qd.prototype=Gd.prototype={constructor:Qd,count:function(){return this.eachAfter(Xd)},each:function(t,n){let e=-1;for(const r of this)t.call(n,r,++e,this);return this},eachAfter:function(t,n){for(var e,r,i,o=this,a=[o],u=[],c=-1;o=a.pop();)if(u.push(o),e=o.children)for(r=0,i=e.length;r=0;--r)o.push(e[r]);return this},find:function(t,n){let e=-1;for(const r of this)if(t.call(n,r,++e,this))return r},sum:function(t){return this.eachAfter((function(n){for(var e=+t(n.data)||0,r=n.children,i=r&&r.length;--i>=0;)e+=r[i].value;n.value=e}))},sort:function(t){return this.eachBefore((function(n){n.children&&n.children.sort(t)}))},path:function(t){for(var n=this,e=function(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;t=e.pop(),n=r.pop();for(;t===n;)i=t,t=e.pop(),n=r.pop();return i}(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},descendants:function(){return Array.from(this)},leaves:function(){var t=[];return this.eachBefore((function(n){n.children||t.push(n)})),t},links:function(){var t=this,n=[];return t.each((function(e){e!==t&&n.push({source:e.parent,target:e})})),n},copy:function(){return Gd(this).eachBefore(Zd)},[Symbol.iterator]:function*(){var t,n,e,r,i=this,o=[i];do{for(t=o.reverse(),o=[];i=t.pop();)if(yield i,n=i.children)for(e=0,r=n.length;e(t=(rp*t+ip)%op)/op}function up(t,n){for(var e,r,i=0,o=(t=function(t,n){let e,r,i=t.length;for(;i;)r=n()*i--|0,e=t[i],t[i]=t[r],t[r]=e;return t}(Array.from(t),n)).length,a=[];i0&&e*e>r*r+i*i}function lp(t,n){for(var e=0;e1e-6?(E+Math.sqrt(E*E-4*S*N))/(2*S):N/E);return{x:r+w+M*k,y:i+T+A*k,r:k}}function gp(t,n,e){var r,i,o,a,u=t.x-n.x,c=t.y-n.y,f=u*u+c*c;f?(i=n.r+e.r,i*=i,a=t.r+e.r,i>(a*=a)?(r=(f+a-i)/(2*f),o=Math.sqrt(Math.max(0,a/f-r*r)),e.x=t.x-r*u-o*c,e.y=t.y-r*c+o*u):(r=(f+i-a)/(2*f),o=Math.sqrt(Math.max(0,i/f-r*r)),e.x=n.x+r*u-o*c,e.y=n.y+r*c+o*u)):(e.x=n.x+e.r,e.y=n.y)}function yp(t,n){var e=t.r+n.r-1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r*r+i*i}function vp(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n.y*e.r+e.y*n.r)/r;return i*i+o*o}function _p(t){this._=t,this.next=null,this.previous=null}function bp(t,n){if(!(o=(t=function(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}(t)).length))return 0;var e,r,i,o,a,u,c,f,s,l,h;if((e=t[0]).x=0,e.y=0,!(o>1))return e.r;if(r=t[1],e.x=-r.r,r.x=e.r,r.y=0,!(o>2))return e.r+r.r;gp(r,e,i=t[2]),e=new _p(e),r=new _p(r),i=new _p(i),e.next=i.previous=r,r.next=e.previous=i,i.next=r.previous=e;t:for(c=3;c1&&!zp(t,n););return t.slice(0,n)}function zp(t,n){if("/"===t[n]){let e=0;for(;n>0&&"\\"===t[--n];)++e;if(!(1&e))return!0}return!1}function $p(t,n){return t.parent===n.parent?1:2}function Dp(t){var n=t.children;return n?n[0]:t.t}function Rp(t){var n=t.children;return n?n[n.length-1]:t.t}function Fp(t,n,e){var r=e/(n.i-t.i);n.c-=r,n.s+=e,t.c+=r,n.z+=e,n.m+=e}function qp(t,n,e){return t.a.parent===n.parent?t.a:e}function Up(t,n){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=n}function Ip(t,n,e,r,i){for(var o,a=t.children,u=-1,c=a.length,f=t.value&&(i-e)/t.value;++uh&&(h=u),y=s*s*g,(d=Math.max(h/y,y/l))>p){s-=u;break}p=d}v.push(a={value:s,dice:c1?n:1)},e}(Op);var Lp=function t(n){function e(t,e,r,i,o){if((a=t._squarify)&&a.ratio===n)for(var a,u,c,f,s,l=-1,h=a.length,d=t.value;++l1?n:1)},e}(Op);function jp(t,n,e){return(n[0]-t[0])*(e[1]-t[1])-(n[1]-t[1])*(e[0]-t[0])}function Hp(t,n){return t[0]-n[0]||t[1]-n[1]}function Xp(t){const n=t.length,e=[0,1];let r,i=2;for(r=2;r1&&jp(t[e[i-2]],t[e[i-1]],t[r])<=0;)--i;e[i++]=r}return e.slice(0,i)}var Gp=Math.random,Vp=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,1===arguments.length?(e=t,t=0):e-=t,function(){return n()*e+t}}return e.source=t,e}(Gp),Wp=function t(n){function e(t,e){return arguments.length<2&&(e=t,t=0),t=Math.floor(t),e=Math.floor(e)-t,function(){return Math.floor(n()*e+t)}}return e.source=t,e}(Gp),Zp=function t(n){function e(t,e){var r,i;return t=null==t?0:+t,e=null==e?1:+e,function(){var o;if(null!=r)o=r,r=null;else do{r=2*n()-1,o=2*n()-1,i=r*r+o*o}while(!i||i>1);return t+e*o*Math.sqrt(-2*Math.log(i)/i)}}return e.source=t,e}(Gp),Kp=function t(n){var e=Zp.source(n);function r(){var t=e.apply(this,arguments);return function(){return Math.exp(t())}}return r.source=t,r}(Gp),Qp=function t(n){function e(t){return(t=+t)<=0?()=>0:function(){for(var e=0,r=t;r>1;--r)e+=n();return e+r*n()}}return e.source=t,e}(Gp),Jp=function t(n){var e=Qp.source(n);function r(t){if(0==(t=+t))return n;var r=e(t);return function(){return r()/t}}return r.source=t,r}(Gp),tg=function t(n){function e(t){return function(){return-Math.log1p(-n())/t}}return e.source=t,e}(Gp),ng=function t(n){function e(t){if((t=+t)<0)throw new RangeError("invalid alpha");return t=1/-t,function(){return Math.pow(1-n(),t)}}return e.source=t,e}(Gp),eg=function t(n){function e(t){if((t=+t)<0||t>1)throw new RangeError("invalid p");return function(){return Math.floor(n()+t)}}return e.source=t,e}(Gp),rg=function t(n){function e(t){if((t=+t)<0||t>1)throw new RangeError("invalid p");return 0===t?()=>1/0:1===t?()=>1:(t=Math.log1p(-t),function(){return 1+Math.floor(Math.log1p(-n())/t)})}return e.source=t,e}(Gp),ig=function t(n){var e=Zp.source(n)();function r(t,r){if((t=+t)<0)throw new RangeError("invalid k");if(0===t)return()=>0;if(r=null==r?1:+r,1===t)return()=>-Math.log1p(-n())*r;var i=(t<1?t+1:t)-1/3,o=1/(3*Math.sqrt(i)),a=t<1?()=>Math.pow(n(),1/t):()=>1;return function(){do{do{var t=e(),u=1+o*t}while(u<=0);u*=u*u;var c=1-n()}while(c>=1-.0331*t*t*t*t&&Math.log(c)>=.5*t*t+i*(1-u+Math.log(u)));return i*u*a()*r}}return r.source=t,r}(Gp),og=function t(n){var e=ig.source(n);function r(t,n){var r=e(t),i=e(n);return function(){var t=r();return 0===t?0:t/(t+i())}}return r.source=t,r}(Gp),ag=function t(n){var e=rg.source(n),r=og.source(n);function i(t,n){return t=+t,(n=+n)>=1?()=>t:n<=0?()=>0:function(){for(var i=0,o=t,a=n;o*a>16&&o*(1-a)>16;){var u=Math.floor((o+1)*a),c=r(u,o-u+1)();c<=a?(i+=u,o-=u,a=(a-c)/(1-c)):(o=u-1,a/=c)}for(var f=a<.5,s=e(f?a:1-a),l=s(),h=0;l<=o;++h)l+=s();return i+(f?h:o-h)}}return i.source=t,i}(Gp),ug=function t(n){function e(t,e,r){var i;return 0==(t=+t)?i=t=>-Math.log(t):(t=1/t,i=n=>Math.pow(n,t)),e=null==e?0:+e,r=null==r?1:+r,function(){return e+r*i(-Math.log1p(-n()))}}return e.source=t,e}(Gp),cg=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,function(){return t+e*Math.tan(Math.PI*n())}}return e.source=t,e}(Gp),fg=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,function(){var r=n();return t+e*Math.log(r/(1-r))}}return e.source=t,e}(Gp),sg=function t(n){var e=ig.source(n),r=ag.source(n);function i(t){return function(){for(var i=0,o=t;o>16;){var a=Math.floor(.875*o),u=e(a)();if(u>o)return i+r(a-1,o/u)();i+=a,o-=u}for(var c=-Math.log1p(-n()),f=0;c<=o;++f)c-=Math.log1p(-n());return i+f}}return i.source=t,i}(Gp);const lg=1/4294967296;function hg(t,n){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(n).domain(t)}return this}function dg(t,n){switch(arguments.length){case 0:break;case 1:"function"==typeof t?this.interpolator(t):this.range(t);break;default:this.domain(t),"function"==typeof n?this.interpolator(n):this.range(n)}return this}const pg=Symbol("implicit");function gg(){var t=new InternMap,n=[],e=[],r=pg;function i(i){let o=t.get(i);if(void 0===o){if(r!==pg)return r;t.set(i,o=n.push(i)-1)}return e[o%e.length]}return i.domain=function(e){if(!arguments.length)return n.slice();n=[],t=new InternMap;for(const r of e)t.has(r)||t.set(r,n.push(r)-1);return i},i.range=function(t){return arguments.length?(e=Array.from(t),i):e.slice()},i.unknown=function(t){return arguments.length?(r=t,i):r},i.copy=function(){return gg(n,e).unknown(r)},hg.apply(i,arguments),i}function yg(){var t,n,e=gg().unknown(void 0),r=e.domain,i=e.range,o=0,a=1,u=!1,c=0,f=0,s=.5;function l(){var e=r().length,l=an&&(e=t,t=n,n=e),function(e){return Math.max(t,Math.min(n,e))}}(a[0],a[t-1])),r=t>2?Mg:wg,i=o=null,l}function l(n){return null==n||isNaN(n=+n)?e:(i||(i=r(a.map(t),u,c)))(t(f(n)))}return l.invert=function(e){return f(n((o||(o=r(u,a.map(t),Yr)))(e)))},l.domain=function(t){return arguments.length?(a=Array.from(t,_g),s()):a.slice()},l.range=function(t){return arguments.length?(u=Array.from(t),s()):u.slice()},l.rangeRound=function(t){return u=Array.from(t),c=Vr,s()},l.clamp=function(t){return arguments.length?(f=!!t||mg,s()):f!==mg},l.interpolate=function(t){return arguments.length?(c=t,s()):c},l.unknown=function(t){return arguments.length?(e=t,l):e},function(e,r){return t=e,n=r,s()}}function Sg(){return Ag()(mg,mg)}function Eg(n,e,r,i){var o,a=W(n,e,r);switch((i=Jc(null==i?",f":i)).type){case"s":var u=Math.max(Math.abs(n),Math.abs(e));return null!=i.precision||isNaN(o=lf(a,u))||(i.precision=o),t.formatPrefix(i,u);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(o=hf(a,Math.max(Math.abs(n),Math.abs(e))))||(i.precision=o-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(o=sf(a))||(i.precision=o-2*("%"===i.type))}return t.format(i)}function Ng(t){var n=t.domain;return t.ticks=function(t){var e=n();return G(e[0],e[e.length-1],null==t?10:t)},t.tickFormat=function(t,e){var r=n();return Eg(r[0],r[r.length-1],null==t?10:t,e)},t.nice=function(e){null==e&&(e=10);var r,i,o=n(),a=0,u=o.length-1,c=o[a],f=o[u],s=10;for(f0;){if((i=V(c,f,e))===r)return o[a]=c,o[u]=f,n(o);if(i>0)c=Math.floor(c/i)*i,f=Math.ceil(f/i)*i;else{if(!(i<0))break;c=Math.ceil(c*i)/i,f=Math.floor(f*i)/i}r=i}return t},t}function kg(t,n){var e,r=0,i=(t=t.slice()).length-1,o=t[r],a=t[i];return a-t(-n,e)}function Fg(n){const e=n(Cg,Pg),r=e.domain;let i,o,a=10;function u(){return i=function(t){return t===Math.E?Math.log:10===t&&Math.log10||2===t&&Math.log2||(t=Math.log(t),n=>Math.log(n)/t)}(a),o=function(t){return 10===t?Dg:t===Math.E?Math.exp:n=>Math.pow(t,n)}(a),r()[0]<0?(i=Rg(i),o=Rg(o),n(zg,$g)):n(Cg,Pg),e}return e.base=function(t){return arguments.length?(a=+t,u()):a},e.domain=function(t){return arguments.length?(r(t),u()):r()},e.ticks=t=>{const n=r();let e=n[0],u=n[n.length-1];const c=u0){for(;l<=h;++l)for(f=1;fu)break;p.push(s)}}else for(;l<=h;++l)for(f=a-1;f>=1;--f)if(s=l>0?f/o(-l):f*o(l),!(su)break;p.push(s)}2*p.length{if(null==n&&(n=10),null==r&&(r=10===a?"s":","),"function"!=typeof r&&(a%1||null!=(r=Jc(r)).precision||(r.trim=!0),r=t.format(r)),n===1/0)return r;const u=Math.max(1,a*n/e.ticks().length);return t=>{let n=t/o(Math.round(i(t)));return n*ar(kg(r(),{floor:t=>o(Math.floor(i(t))),ceil:t=>o(Math.ceil(i(t)))})),e}function qg(t){return function(n){return Math.sign(n)*Math.log1p(Math.abs(n/t))}}function Ug(t){return function(n){return Math.sign(n)*Math.expm1(Math.abs(n))*t}}function Ig(t){var n=1,e=t(qg(n),Ug(n));return e.constant=function(e){return arguments.length?t(qg(n=+e),Ug(n)):n},Ng(e)}function Og(t){return function(n){return n<0?-Math.pow(-n,t):Math.pow(n,t)}}function Bg(t){return t<0?-Math.sqrt(-t):Math.sqrt(t)}function Yg(t){return t<0?-t*t:t*t}function Lg(t){var n=t(mg,mg),e=1;return n.exponent=function(n){return arguments.length?1===(e=+n)?t(mg,mg):.5===e?t(Bg,Yg):t(Og(e),Og(1/e)):e},Ng(n)}function jg(){var t=Lg(Ag());return t.copy=function(){return Tg(t,jg()).exponent(t.exponent())},hg.apply(t,arguments),t}function Hg(t){return Math.sign(t)*t*t}const Xg=new Date,Gg=new Date;function Vg(t,n,e,r){function i(n){return t(n=0===arguments.length?new Date:new Date(+n)),n}return i.floor=n=>(t(n=new Date(+n)),n),i.ceil=e=>(t(e=new Date(e-1)),n(e,1),t(e),e),i.round=t=>{const n=i(t),e=i.ceil(t);return t-n(n(t=new Date(+t),null==e?1:Math.floor(e)),t),i.range=(e,r,o)=>{const a=[];if(e=i.ceil(e),o=null==o?1:Math.floor(o),!(e0))return a;let u;do{a.push(u=new Date(+e)),n(e,o),t(e)}while(uVg((n=>{if(n>=n)for(;t(n),!e(n);)n.setTime(n-1)}),((t,r)=>{if(t>=t)if(r<0)for(;++r<=0;)for(;n(t,-1),!e(t););else for(;--r>=0;)for(;n(t,1),!e(t););})),e&&(i.count=(n,r)=>(Xg.setTime(+n),Gg.setTime(+r),t(Xg),t(Gg),Math.floor(e(Xg,Gg))),i.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?n=>r(n)%t==0:n=>i.count(0,n)%t==0):i:null)),i}const Wg=Vg((()=>{}),((t,n)=>{t.setTime(+t+n)}),((t,n)=>n-t));Wg.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?Vg((n=>{n.setTime(Math.floor(n/t)*t)}),((n,e)=>{n.setTime(+n+e*t)}),((n,e)=>(e-n)/t)):Wg:null);const Zg=Wg.range,Kg=1e3,Qg=6e4,Jg=36e5,ty=864e5,ny=6048e5,ey=2592e6,ry=31536e6,iy=Vg((t=>{t.setTime(t-t.getMilliseconds())}),((t,n)=>{t.setTime(+t+n*Kg)}),((t,n)=>(n-t)/Kg),(t=>t.getUTCSeconds())),oy=iy.range,ay=Vg((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*Kg)}),((t,n)=>{t.setTime(+t+n*Qg)}),((t,n)=>(n-t)/Qg),(t=>t.getMinutes())),uy=ay.range,cy=Vg((t=>{t.setUTCSeconds(0,0)}),((t,n)=>{t.setTime(+t+n*Qg)}),((t,n)=>(n-t)/Qg),(t=>t.getUTCMinutes())),fy=cy.range,sy=Vg((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*Kg-t.getMinutes()*Qg)}),((t,n)=>{t.setTime(+t+n*Jg)}),((t,n)=>(n-t)/Jg),(t=>t.getHours())),ly=sy.range,hy=Vg((t=>{t.setUTCMinutes(0,0,0)}),((t,n)=>{t.setTime(+t+n*Jg)}),((t,n)=>(n-t)/Jg),(t=>t.getUTCHours())),dy=hy.range,py=Vg((t=>t.setHours(0,0,0,0)),((t,n)=>t.setDate(t.getDate()+n)),((t,n)=>(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Qg)/ty),(t=>t.getDate()-1)),gy=py.range,yy=Vg((t=>{t.setUTCHours(0,0,0,0)}),((t,n)=>{t.setUTCDate(t.getUTCDate()+n)}),((t,n)=>(n-t)/ty),(t=>t.getUTCDate()-1)),vy=yy.range,_y=Vg((t=>{t.setUTCHours(0,0,0,0)}),((t,n)=>{t.setUTCDate(t.getUTCDate()+n)}),((t,n)=>(n-t)/ty),(t=>Math.floor(t/ty))),by=_y.range;function my(t){return Vg((n=>{n.setDate(n.getDate()-(n.getDay()+7-t)%7),n.setHours(0,0,0,0)}),((t,n)=>{t.setDate(t.getDate()+7*n)}),((t,n)=>(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Qg)/ny))}const xy=my(0),wy=my(1),My=my(2),Ty=my(3),Ay=my(4),Sy=my(5),Ey=my(6),Ny=xy.range,ky=wy.range,Cy=My.range,Py=Ty.range,zy=Ay.range,$y=Sy.range,Dy=Ey.range;function Ry(t){return Vg((n=>{n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-t)%7),n.setUTCHours(0,0,0,0)}),((t,n)=>{t.setUTCDate(t.getUTCDate()+7*n)}),((t,n)=>(n-t)/ny))}const Fy=Ry(0),qy=Ry(1),Uy=Ry(2),Iy=Ry(3),Oy=Ry(4),By=Ry(5),Yy=Ry(6),Ly=Fy.range,jy=qy.range,Hy=Uy.range,Xy=Iy.range,Gy=Oy.range,Vy=By.range,Wy=Yy.range,Zy=Vg((t=>{t.setDate(1),t.setHours(0,0,0,0)}),((t,n)=>{t.setMonth(t.getMonth()+n)}),((t,n)=>n.getMonth()-t.getMonth()+12*(n.getFullYear()-t.getFullYear())),(t=>t.getMonth())),Ky=Zy.range,Qy=Vg((t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),((t,n)=>{t.setUTCMonth(t.getUTCMonth()+n)}),((t,n)=>n.getUTCMonth()-t.getUTCMonth()+12*(n.getUTCFullYear()-t.getUTCFullYear())),(t=>t.getUTCMonth())),Jy=Qy.range,tv=Vg((t=>{t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,n)=>{t.setFullYear(t.getFullYear()+n)}),((t,n)=>n.getFullYear()-t.getFullYear()),(t=>t.getFullYear()));tv.every=t=>isFinite(t=Math.floor(t))&&t>0?Vg((n=>{n.setFullYear(Math.floor(n.getFullYear()/t)*t),n.setMonth(0,1),n.setHours(0,0,0,0)}),((n,e)=>{n.setFullYear(n.getFullYear()+e*t)})):null;const nv=tv.range,ev=Vg((t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,n)=>{t.setUTCFullYear(t.getUTCFullYear()+n)}),((t,n)=>n.getUTCFullYear()-t.getUTCFullYear()),(t=>t.getUTCFullYear()));ev.every=t=>isFinite(t=Math.floor(t))&&t>0?Vg((n=>{n.setUTCFullYear(Math.floor(n.getUTCFullYear()/t)*t),n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)}),((n,e)=>{n.setUTCFullYear(n.getUTCFullYear()+e*t)})):null;const rv=ev.range;function iv(t,n,e,i,o,a){const u=[[iy,1,Kg],[iy,5,5e3],[iy,15,15e3],[iy,30,3e4],[a,1,Qg],[a,5,3e5],[a,15,9e5],[a,30,18e5],[o,1,Jg],[o,3,108e5],[o,6,216e5],[o,12,432e5],[i,1,ty],[i,2,1728e5],[e,1,ny],[n,1,ey],[n,3,7776e6],[t,1,ry]];function c(n,e,i){const o=Math.abs(e-n)/i,a=r((([,,t])=>t)).right(u,o);if(a===u.length)return t.every(W(n/ry,e/ry,i));if(0===a)return Wg.every(Math.max(W(n,e,i),1));const[c,f]=u[o/u[a-1][2]=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:k_,s:C_,S:Zv,u:Kv,U:Qv,V:t_,w:n_,W:e_,x:null,X:null,y:r_,Y:o_,Z:u_,"%":N_},m={a:function(t){return a[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return u[t.getUTCMonth()]},c:null,d:c_,e:c_,f:d_,g:T_,G:S_,H:f_,I:s_,j:l_,L:h_,m:p_,M:g_,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:k_,s:C_,S:y_,u:v_,U:__,V:m_,w:x_,W:w_,x:null,X:null,y:M_,Y:A_,Z:E_,"%":N_},x={a:function(t,n,e){var r=d.exec(n.slice(e));return r?(t.w=p.get(r[0].toLowerCase()),e+r[0].length):-1},A:function(t,n,e){var r=l.exec(n.slice(e));return r?(t.w=h.get(r[0].toLowerCase()),e+r[0].length):-1},b:function(t,n,e){var r=v.exec(n.slice(e));return r?(t.m=_.get(r[0].toLowerCase()),e+r[0].length):-1},B:function(t,n,e){var r=g.exec(n.slice(e));return r?(t.m=y.get(r[0].toLowerCase()),e+r[0].length):-1},c:function(t,e,r){return T(t,n,e,r)},d:zv,e:zv,f:Uv,g:Nv,G:Ev,H:Dv,I:Dv,j:$v,L:qv,m:Pv,M:Rv,p:function(t,n,e){var r=f.exec(n.slice(e));return r?(t.p=s.get(r[0].toLowerCase()),e+r[0].length):-1},q:Cv,Q:Ov,s:Bv,S:Fv,u:Mv,U:Tv,V:Av,w:wv,W:Sv,x:function(t,n,r){return T(t,e,n,r)},X:function(t,n,e){return T(t,r,n,e)},y:Nv,Y:Ev,Z:kv,"%":Iv};function w(t,n){return function(e){var r,i,o,a=[],u=-1,c=0,f=t.length;for(e instanceof Date||(e=new Date(+e));++u53)return null;"w"in o||(o.w=1),"Z"in o?(i=(r=sv(lv(o.y,0,1))).getUTCDay(),r=i>4||0===i?qy.ceil(r):qy(r),r=yy.offset(r,7*(o.V-1)),o.y=r.getUTCFullYear(),o.m=r.getUTCMonth(),o.d=r.getUTCDate()+(o.w+6)%7):(i=(r=fv(lv(o.y,0,1))).getDay(),r=i>4||0===i?wy.ceil(r):wy(r),r=py.offset(r,7*(o.V-1)),o.y=r.getFullYear(),o.m=r.getMonth(),o.d=r.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),i="Z"in o?sv(lv(o.y,0,1)).getUTCDay():fv(lv(o.y,0,1)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(i+5)%7:o.w+7*o.U-(i+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,sv(o)):fv(o)}}function T(t,n,e,r){for(var i,o,a=0,u=n.length,c=e.length;a=c)return-1;if(37===(i=n.charCodeAt(a++))){if(i=n.charAt(a++),!(o=x[i in pv?n.charAt(a++):i])||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}return b.x=w(e,b),b.X=w(r,b),b.c=w(n,b),m.x=w(e,m),m.X=w(r,m),m.c=w(n,m),{format:function(t){var n=w(t+="",b);return n.toString=function(){return t},n},parse:function(t){var n=M(t+="",!1);return n.toString=function(){return t},n},utcFormat:function(t){var n=w(t+="",m);return n.toString=function(){return t},n},utcParse:function(t){var n=M(t+="",!0);return n.toString=function(){return t},n}}}var dv,pv={"-":"",_:" ",0:"0"},gv=/^\s*\d+/,yv=/^%/,vv=/[\\^$*+?|[\]().{}]/g;function _v(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o[t.toLowerCase(),n])))}function wv(t,n,e){var r=gv.exec(n.slice(e,e+1));return r?(t.w=+r[0],e+r[0].length):-1}function Mv(t,n,e){var r=gv.exec(n.slice(e,e+1));return r?(t.u=+r[0],e+r[0].length):-1}function Tv(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.U=+r[0],e+r[0].length):-1}function Av(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.V=+r[0],e+r[0].length):-1}function Sv(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.W=+r[0],e+r[0].length):-1}function Ev(t,n,e){var r=gv.exec(n.slice(e,e+4));return r?(t.y=+r[0],e+r[0].length):-1}function Nv(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),e+r[0].length):-1}function kv(t,n,e){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(n.slice(e,e+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),e+r[0].length):-1}function Cv(t,n,e){var r=gv.exec(n.slice(e,e+1));return r?(t.q=3*r[0]-3,e+r[0].length):-1}function Pv(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function zv(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function $v(t,n,e){var r=gv.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[0],e+r[0].length):-1}function Dv(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function Rv(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function Fv(t,n,e){var r=gv.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function qv(t,n,e){var r=gv.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function Uv(t,n,e){var r=gv.exec(n.slice(e,e+6));return r?(t.L=Math.floor(r[0]/1e3),e+r[0].length):-1}function Iv(t,n,e){var r=yv.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function Ov(t,n,e){var r=gv.exec(n.slice(e));return r?(t.Q=+r[0],e+r[0].length):-1}function Bv(t,n,e){var r=gv.exec(n.slice(e));return r?(t.s=+r[0],e+r[0].length):-1}function Yv(t,n){return _v(t.getDate(),n,2)}function Lv(t,n){return _v(t.getHours(),n,2)}function jv(t,n){return _v(t.getHours()%12||12,n,2)}function Hv(t,n){return _v(1+py.count(tv(t),t),n,3)}function Xv(t,n){return _v(t.getMilliseconds(),n,3)}function Gv(t,n){return Xv(t,n)+"000"}function Vv(t,n){return _v(t.getMonth()+1,n,2)}function Wv(t,n){return _v(t.getMinutes(),n,2)}function Zv(t,n){return _v(t.getSeconds(),n,2)}function Kv(t){var n=t.getDay();return 0===n?7:n}function Qv(t,n){return _v(xy.count(tv(t)-1,t),n,2)}function Jv(t){var n=t.getDay();return n>=4||0===n?Ay(t):Ay.ceil(t)}function t_(t,n){return t=Jv(t),_v(Ay.count(tv(t),t)+(4===tv(t).getDay()),n,2)}function n_(t){return t.getDay()}function e_(t,n){return _v(wy.count(tv(t)-1,t),n,2)}function r_(t,n){return _v(t.getFullYear()%100,n,2)}function i_(t,n){return _v((t=Jv(t)).getFullYear()%100,n,2)}function o_(t,n){return _v(t.getFullYear()%1e4,n,4)}function a_(t,n){var e=t.getDay();return _v((t=e>=4||0===e?Ay(t):Ay.ceil(t)).getFullYear()%1e4,n,4)}function u_(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+_v(n/60|0,"0",2)+_v(n%60,"0",2)}function c_(t,n){return _v(t.getUTCDate(),n,2)}function f_(t,n){return _v(t.getUTCHours(),n,2)}function s_(t,n){return _v(t.getUTCHours()%12||12,n,2)}function l_(t,n){return _v(1+yy.count(ev(t),t),n,3)}function h_(t,n){return _v(t.getUTCMilliseconds(),n,3)}function d_(t,n){return h_(t,n)+"000"}function p_(t,n){return _v(t.getUTCMonth()+1,n,2)}function g_(t,n){return _v(t.getUTCMinutes(),n,2)}function y_(t,n){return _v(t.getUTCSeconds(),n,2)}function v_(t){var n=t.getUTCDay();return 0===n?7:n}function __(t,n){return _v(Fy.count(ev(t)-1,t),n,2)}function b_(t){var n=t.getUTCDay();return n>=4||0===n?Oy(t):Oy.ceil(t)}function m_(t,n){return t=b_(t),_v(Oy.count(ev(t),t)+(4===ev(t).getUTCDay()),n,2)}function x_(t){return t.getUTCDay()}function w_(t,n){return _v(qy.count(ev(t)-1,t),n,2)}function M_(t,n){return _v(t.getUTCFullYear()%100,n,2)}function T_(t,n){return _v((t=b_(t)).getUTCFullYear()%100,n,2)}function A_(t,n){return _v(t.getUTCFullYear()%1e4,n,4)}function S_(t,n){var e=t.getUTCDay();return _v((t=e>=4||0===e?Oy(t):Oy.ceil(t)).getUTCFullYear()%1e4,n,4)}function E_(){return"+0000"}function N_(){return"%"}function k_(t){return+t}function C_(t){return Math.floor(+t/1e3)}function P_(n){return dv=hv(n),t.timeFormat=dv.format,t.timeParse=dv.parse,t.utcFormat=dv.utcFormat,t.utcParse=dv.utcParse,dv}t.timeFormat=void 0,t.timeParse=void 0,t.utcFormat=void 0,t.utcParse=void 0,P_({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var z_="%Y-%m-%dT%H:%M:%S.%LZ";var $_=Date.prototype.toISOString?function(t){return t.toISOString()}:t.utcFormat(z_),D_=$_;var R_=+new Date("2000-01-01T00:00:00.000Z")?function(t){var n=new Date(t);return isNaN(n)?null:n}:t.utcParse(z_),F_=R_;function q_(t){return new Date(t)}function U_(t){return t instanceof Date?+t:+new Date(+t)}function I_(t,n,e,r,i,o,a,u,c,f){var s=Sg(),l=s.invert,h=s.domain,d=f(".%L"),p=f(":%S"),g=f("%I:%M"),y=f("%I %p"),v=f("%a %d"),_=f("%b %d"),b=f("%B"),m=f("%Y");function x(t){return(c(t)Fr(t[t.length-1]),ib=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(H_),ob=rb(ib),ab=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(H_),ub=rb(ab),cb=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(H_),fb=rb(cb),sb=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(H_),lb=rb(sb),hb=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(H_),db=rb(hb),pb=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(H_),gb=rb(pb),yb=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(H_),vb=rb(yb),_b=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(H_),bb=rb(_b),mb=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(H_),xb=rb(mb),wb=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(H_),Mb=rb(wb),Tb=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(H_),Ab=rb(Tb),Sb=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(H_),Eb=rb(Sb),Nb=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(H_),kb=rb(Nb),Cb=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(H_),Pb=rb(Cb),zb=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(H_),$b=rb(zb),Db=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(H_),Rb=rb(Db),Fb=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(H_),qb=rb(Fb),Ub=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(H_),Ib=rb(Ub),Ob=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(H_),Bb=rb(Ob),Yb=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(H_),Lb=rb(Yb),jb=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(H_),Hb=rb(jb),Xb=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(H_),Gb=rb(Xb),Vb=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(H_),Wb=rb(Vb),Zb=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(H_),Kb=rb(Zb),Qb=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(H_),Jb=rb(Qb),tm=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(H_),nm=rb(tm),em=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(H_),rm=rb(em);var im=hi(Tr(300,.5,0),Tr(-240,.5,1)),om=hi(Tr(-100,.75,.35),Tr(80,1.5,.8)),am=hi(Tr(260,.75,.35),Tr(80,1.5,.8)),um=Tr();var cm=Fe(),fm=Math.PI/3,sm=2*Math.PI/3;function lm(t){var n=t.length;return function(e){return t[Math.max(0,Math.min(n-1,Math.floor(e*n)))]}}var hm=lm(H_("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),dm=lm(H_("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),pm=lm(H_("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),gm=lm(H_("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function ym(t){return function(){return t}}const vm=Math.abs,_m=Math.atan2,bm=Math.cos,mm=Math.max,xm=Math.min,wm=Math.sin,Mm=Math.sqrt,Tm=1e-12,Am=Math.PI,Sm=Am/2,Em=2*Am;function Nm(t){return t>=1?Sm:t<=-1?-Sm:Math.asin(t)}function km(t){let n=3;return t.digits=function(e){if(!arguments.length)return n;if(null==e)n=null;else{const t=Math.floor(e);if(!(t>=0))throw new RangeError(`invalid digits: ${e}`);n=t}return t},()=>new Ua(n)}function Cm(t){return t.innerRadius}function Pm(t){return t.outerRadius}function zm(t){return t.startAngle}function $m(t){return t.endAngle}function Dm(t){return t&&t.padAngle}function Rm(t,n,e,r,i,o,a){var u=t-e,c=n-r,f=(a?o:-o)/Mm(u*u+c*c),s=f*c,l=-f*u,h=t+s,d=n+l,p=e+s,g=r+l,y=(h+p)/2,v=(d+g)/2,_=p-h,b=g-d,m=_*_+b*b,x=i-o,w=h*g-p*d,M=(b<0?-1:1)*Mm(mm(0,x*x*m-w*w)),T=(w*b-_*M)/m,A=(-w*_-b*M)/m,S=(w*b+_*M)/m,E=(-w*_+b*M)/m,N=T-y,k=A-v,C=S-y,P=E-v;return N*N+k*k>C*C+P*P&&(T=S,A=E),{cx:T,cy:A,x01:-s,y01:-l,x11:T*(i/x-1),y11:A*(i/x-1)}}var Fm=Array.prototype.slice;function qm(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function Um(t){this._context=t}function Im(t){return new Um(t)}function Om(t){return t[0]}function Bm(t){return t[1]}function Ym(t,n){var e=ym(!0),r=null,i=Im,o=null,a=km(u);function u(u){var c,f,s,l=(u=qm(u)).length,h=!1;for(null==r&&(o=i(s=a())),c=0;c<=l;++c)!(c=l;--h)u.point(v[h],_[h]);u.lineEnd(),u.areaEnd()}y&&(v[s]=+t(d,s,f),_[s]=+n(d,s,f),u.point(r?+r(d,s,f):v[s],e?+e(d,s,f):_[s]))}if(p)return u=null,p+""||null}function s(){return Ym().defined(i).curve(a).context(o)}return t="function"==typeof t?t:void 0===t?Om:ym(+t),n="function"==typeof n?n:ym(void 0===n?0:+n),e="function"==typeof e?e:void 0===e?Bm:ym(+e),f.x=function(n){return arguments.length?(t="function"==typeof n?n:ym(+n),r=null,f):t},f.x0=function(n){return arguments.length?(t="function"==typeof n?n:ym(+n),f):t},f.x1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:ym(+t),f):r},f.y=function(t){return arguments.length?(n="function"==typeof t?t:ym(+t),e=null,f):n},f.y0=function(t){return arguments.length?(n="function"==typeof t?t:ym(+t),f):n},f.y1=function(t){return arguments.length?(e=null==t?null:"function"==typeof t?t:ym(+t),f):e},f.lineX0=f.lineY0=function(){return s().x(t).y(n)},f.lineY1=function(){return s().x(t).y(e)},f.lineX1=function(){return s().x(r).y(n)},f.defined=function(t){return arguments.length?(i="function"==typeof t?t:ym(!!t),f):i},f.curve=function(t){return arguments.length?(a=t,null!=o&&(u=a(o)),f):a},f.context=function(t){return arguments.length?(null==t?o=u=null:u=a(o=t),f):o},f}function jm(t,n){return nt?1:n>=t?0:NaN}function Hm(t){return t}Um.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._context.lineTo(t,n)}}};var Xm=Vm(Im);function Gm(t){this._curve=t}function Vm(t){function n(n){return new Gm(t(n))}return n._curve=t,n}function Wm(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?n(Vm(t)):n()._curve},t}function Zm(){return Wm(Ym().curve(Xm))}function Km(){var t=Lm().curve(Xm),n=t.curve,e=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return Wm(e())},delete t.lineX0,t.lineEndAngle=function(){return Wm(r())},delete t.lineX1,t.lineInnerRadius=function(){return Wm(i())},delete t.lineY0,t.lineOuterRadius=function(){return Wm(o())},delete t.lineY1,t.curve=function(t){return arguments.length?n(Vm(t)):n()._curve},t}function Qm(t,n){return[(n=+n)*Math.cos(t-=Math.PI/2),n*Math.sin(t)]}Gm.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};class Jm{constructor(t,n){this._context=t,this._x=n}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,n,t,n):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+n)/2,t,this._y0,t,n)}this._x0=t,this._y0=n}}class tx{constructor(t){this._context=t}lineStart(){this._point=0}lineEnd(){}point(t,n){if(t=+t,n=+n,0===this._point)this._point=1;else{const e=Qm(this._x0,this._y0),r=Qm(this._x0,this._y0=(this._y0+n)/2),i=Qm(t,this._y0),o=Qm(t,n);this._context.moveTo(...e),this._context.bezierCurveTo(...r,...i,...o)}this._x0=t,this._y0=n}}function nx(t){return new Jm(t,!0)}function ex(t){return new Jm(t,!1)}function rx(t){return new tx(t)}function ix(t){return t.source}function ox(t){return t.target}function ax(t){let n=ix,e=ox,r=Om,i=Bm,o=null,a=null,u=km(c);function c(){let c;const f=Fm.call(arguments),s=n.apply(this,f),l=e.apply(this,f);if(null==o&&(a=t(c=u())),a.lineStart(),f[0]=s,a.point(+r.apply(this,f),+i.apply(this,f)),f[0]=l,a.point(+r.apply(this,f),+i.apply(this,f)),a.lineEnd(),c)return a=null,c+""||null}return c.source=function(t){return arguments.length?(n=t,c):n},c.target=function(t){return arguments.length?(e=t,c):e},c.x=function(t){return arguments.length?(r="function"==typeof t?t:ym(+t),c):r},c.y=function(t){return arguments.length?(i="function"==typeof t?t:ym(+t),c):i},c.context=function(n){return arguments.length?(null==n?o=a=null:a=t(o=n),c):o},c}const ux=Mm(3);var cx={draw(t,n){const e=.59436*Mm(n+xm(n/28,.75)),r=e/2,i=r*ux;t.moveTo(0,e),t.lineTo(0,-e),t.moveTo(-i,-r),t.lineTo(i,r),t.moveTo(-i,r),t.lineTo(i,-r)}},fx={draw(t,n){const e=Mm(n/Am);t.moveTo(e,0),t.arc(0,0,e,0,Em)}},sx={draw(t,n){const e=Mm(n/5)/2;t.moveTo(-3*e,-e),t.lineTo(-e,-e),t.lineTo(-e,-3*e),t.lineTo(e,-3*e),t.lineTo(e,-e),t.lineTo(3*e,-e),t.lineTo(3*e,e),t.lineTo(e,e),t.lineTo(e,3*e),t.lineTo(-e,3*e),t.lineTo(-e,e),t.lineTo(-3*e,e),t.closePath()}};const lx=Mm(1/3),hx=2*lx;var dx={draw(t,n){const e=Mm(n/hx),r=e*lx;t.moveTo(0,-e),t.lineTo(r,0),t.lineTo(0,e),t.lineTo(-r,0),t.closePath()}},px={draw(t,n){const e=.62625*Mm(n);t.moveTo(0,-e),t.lineTo(e,0),t.lineTo(0,e),t.lineTo(-e,0),t.closePath()}},gx={draw(t,n){const e=.87559*Mm(n-xm(n/7,2));t.moveTo(-e,0),t.lineTo(e,0),t.moveTo(0,e),t.lineTo(0,-e)}},yx={draw(t,n){const e=Mm(n),r=-e/2;t.rect(r,r,e,e)}},vx={draw(t,n){const e=.4431*Mm(n);t.moveTo(e,e),t.lineTo(e,-e),t.lineTo(-e,-e),t.lineTo(-e,e),t.closePath()}};const _x=wm(Am/10)/wm(7*Am/10),bx=wm(Em/10)*_x,mx=-bm(Em/10)*_x;var xx={draw(t,n){const e=Mm(.8908130915292852*n),r=bx*e,i=mx*e;t.moveTo(0,-e),t.lineTo(r,i);for(let n=1;n<5;++n){const o=Em*n/5,a=bm(o),u=wm(o);t.lineTo(u*e,-a*e),t.lineTo(a*r-u*i,u*r+a*i)}t.closePath()}};const wx=Mm(3);var Mx={draw(t,n){const e=-Mm(n/(3*wx));t.moveTo(0,2*e),t.lineTo(-wx*e,-e),t.lineTo(wx*e,-e),t.closePath()}};const Tx=Mm(3);var Ax={draw(t,n){const e=.6824*Mm(n),r=e/2,i=e*Tx/2;t.moveTo(0,-e),t.lineTo(i,r),t.lineTo(-i,r),t.closePath()}};const Sx=-.5,Ex=Mm(3)/2,Nx=1/Mm(12),kx=3*(Nx/2+1);var Cx={draw(t,n){const e=Mm(n/kx),r=e/2,i=e*Nx,o=r,a=e*Nx+e,u=-o,c=a;t.moveTo(r,i),t.lineTo(o,a),t.lineTo(u,c),t.lineTo(Sx*r-Ex*i,Ex*r+Sx*i),t.lineTo(Sx*o-Ex*a,Ex*o+Sx*a),t.lineTo(Sx*u-Ex*c,Ex*u+Sx*c),t.lineTo(Sx*r+Ex*i,Sx*i-Ex*r),t.lineTo(Sx*o+Ex*a,Sx*a-Ex*o),t.lineTo(Sx*u+Ex*c,Sx*c-Ex*u),t.closePath()}},Px={draw(t,n){const e=.6189*Mm(n-xm(n/6,1.7));t.moveTo(-e,-e),t.lineTo(e,e),t.moveTo(-e,e),t.lineTo(e,-e)}};const zx=[fx,sx,dx,yx,xx,Mx,Cx],$x=[fx,gx,Px,Ax,cx,vx,px];function Dx(){}function Rx(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+n)/6,(t._y0+4*t._y1+e)/6)}function Fx(t){this._context=t}function qx(t){this._context=t}function Ux(t){this._context=t}function Ix(t,n){this._basis=new Fx(t),this._beta=n}Fx.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Rx(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Rx(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},qx.prototype={areaStart:Dx,areaEnd:Dx,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x2=t,this._y2=n;break;case 1:this._point=2,this._x3=t,this._y3=n;break;case 2:this._point=3,this._x4=t,this._y4=n,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:Rx(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},Ux.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var e=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break;case 3:this._point=4;default:Rx(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},Ix.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,n=this._y,e=t.length-1;if(e>0)for(var r,i=t[0],o=n[0],a=t[e]-i,u=n[e]-o,c=-1;++c<=e;)r=c/e,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*a),this._beta*n[c]+(1-this._beta)*(o+r*u));this._x=this._y=null,this._basis.lineEnd()},point:function(t,n){this._x.push(+t),this._y.push(+n)}};var Ox=function t(n){function e(t){return 1===n?new Fx(t):new Ix(t,n)}return e.beta=function(n){return t(+n)},e}(.85);function Bx(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-n),t._y2+t._k*(t._y1-e),t._x2,t._y2)}function Yx(t,n){this._context=t,this._k=(1-n)/6}Yx.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Bx(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2,this._x1=t,this._y1=n;break;case 2:this._point=3;default:Bx(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Lx=function t(n){function e(t){return new Yx(t,n)}return e.tension=function(n){return t(+n)},e}(0);function jx(t,n){this._context=t,this._k=(1-n)/6}jx.prototype={areaStart:Dx,areaEnd:Dx,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:Bx(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Hx=function t(n){function e(t){return new jx(t,n)}return e.tension=function(n){return t(+n)},e}(0);function Xx(t,n){this._context=t,this._k=(1-n)/6}Xx.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Bx(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Gx=function t(n){function e(t){return new Xx(t,n)}return e.tension=function(n){return t(+n)},e}(0);function Vx(t,n,e){var r=t._x1,i=t._y1,o=t._x2,a=t._y2;if(t._l01_a>Tm){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>Tm){var f=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,s=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*f+t._x1*t._l23_2a-n*t._l12_2a)/s,a=(a*f+t._y1*t._l23_2a-e*t._l12_2a)/s}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function Wx(t,n){this._context=t,this._alpha=n}Wx.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:Vx(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Zx=function t(n){function e(t){return n?new Wx(t,n):new Yx(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function Kx(t,n){this._context=t,this._alpha=n}Kx.prototype={areaStart:Dx,areaEnd:Dx,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:Vx(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var Qx=function t(n){function e(t){return n?new Kx(t,n):new jx(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function Jx(t,n){this._context=t,this._alpha=n}Jx.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Vx(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var tw=function t(n){function e(t){return n?new Jx(t,n):new Xx(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function nw(t){this._context=t}function ew(t){return t<0?-1:1}function rw(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(e-t._y1)/(i||r<0&&-0),u=(o*i+a*r)/(r+i);return(ew(o)+ew(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(u))||0}function iw(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function ow(t,n,e){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,u=(o-r)/3;t._context.bezierCurveTo(r+u,i+u*n,o-u,a-u*e,o,a)}function aw(t){this._context=t}function uw(t){this._context=new cw(t)}function cw(t){this._context=t}function fw(t){this._context=t}function sw(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),a=new Array(r);for(i[0]=0,o[0]=2,a[0]=t[0]+2*t[1],n=1;n=0;--n)i[n]=(a[n]-i[n+1])/o[n];for(o[r-1]=(t[r]+i[r-1])/2,n=0;n1)for(var e,r,i,o=1,a=t[n[0]],u=a.length;o=0;)e[n]=n;return e}function pw(t,n){return t[n]}function gw(t){const n=[];return n.key=t,n}function yw(t){var n=t.map(vw);return dw(t).sort((function(t,e){return n[t]-n[e]}))}function vw(t){for(var n,e=-1,r=0,i=t.length,o=-1/0;++eo&&(o=n,r=e);return r}function _w(t){var n=t.map(bw);return dw(t).sort((function(t,e){return n[t]-n[e]}))}function bw(t){for(var n,e=0,r=-1,i=t.length;++r=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,n),this._context.lineTo(t,n);else{var e=this._x*(1-this._t)+t*this._t;this._context.lineTo(e,this._y),this._context.lineTo(e,n)}}this._x=t,this._y=n}};var mw=t=>()=>t;function xw(t,{sourceEvent:n,target:e,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:n,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function ww(t,n,e){this.k=t,this.x=n,this.y=e}ww.prototype={constructor:ww,scale:function(t){return 1===t?this:new ww(this.k*t,this.x,this.y)},translate:function(t,n){return 0===t&0===n?this:new ww(this.k,this.x+this.k*t,this.y+this.k*n)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Mw=new ww(1,0,0);function Tw(t){for(;!t.__zoom;)if(!(t=t.parentNode))return Mw;return t.__zoom}function Aw(t){t.stopImmediatePropagation()}function Sw(t){t.preventDefault(),t.stopImmediatePropagation()}function Ew(t){return!(t.ctrlKey&&"wheel"!==t.type||t.button)}function Nw(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t).hasAttribute("viewBox")?[[(t=t.viewBox.baseVal).x,t.y],[t.x+t.width,t.y+t.height]]:[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]:[[0,0],[t.clientWidth,t.clientHeight]]}function kw(){return this.__zoom||Mw}function Cw(t){return-t.deltaY*(1===t.deltaMode?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function Pw(){return navigator.maxTouchPoints||"ontouchstart"in this}function zw(t,n,e){var r=t.invertX(n[0][0])-e[0][0],i=t.invertX(n[1][0])-e[1][0],o=t.invertY(n[0][1])-e[0][1],a=t.invertY(n[1][1])-e[1][1];return t.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}Tw.prototype=ww.prototype,t.Adder=T,t.Delaunay=Lu,t.FormatSpecifier=tf,t.InternMap=InternMap,t.InternSet=InternSet,t.Node=Qd,t.Path=Ua,t.Voronoi=qu,t.ZoomTransform=ww,t.active=function(t,n){var e,r,i=t.__transition;if(i)for(r in n=null==n?null:n+"",i)if((e=i[r]).state>qi&&e.name===n)return new po([[t]],Zo,n,+r);return null},t.arc=function(){var t=Cm,n=Pm,e=ym(0),r=null,i=zm,o=$m,a=Dm,u=null,c=km(f);function f(){var f,s,l=+t.apply(this,arguments),h=+n.apply(this,arguments),d=i.apply(this,arguments)-Sm,p=o.apply(this,arguments)-Sm,g=vm(p-d),y=p>d;if(u||(u=f=c()),hTm)if(g>Em-Tm)u.moveTo(h*bm(d),h*wm(d)),u.arc(0,0,h,d,p,!y),l>Tm&&(u.moveTo(l*bm(p),l*wm(p)),u.arc(0,0,l,p,d,y));else{var v,_,b=d,m=p,x=d,w=p,M=g,T=g,A=a.apply(this,arguments)/2,S=A>Tm&&(r?+r.apply(this,arguments):Mm(l*l+h*h)),E=xm(vm(h-l)/2,+e.apply(this,arguments)),N=E,k=E;if(S>Tm){var C=Nm(S/l*wm(A)),P=Nm(S/h*wm(A));(M-=2*C)>Tm?(x+=C*=y?1:-1,w-=C):(M=0,x=w=(d+p)/2),(T-=2*P)>Tm?(b+=P*=y?1:-1,m-=P):(T=0,b=m=(d+p)/2)}var z=h*bm(b),$=h*wm(b),D=l*bm(w),R=l*wm(w);if(E>Tm){var F,q=h*bm(m),U=h*wm(m),I=l*bm(x),O=l*wm(x);if(g1?0:t<-1?Am:Math.acos(t)}((B*L+Y*j)/(Mm(B*B+Y*Y)*Mm(L*L+j*j)))/2),X=Mm(F[0]*F[0]+F[1]*F[1]);N=xm(E,(l-X)/(H-1)),k=xm(E,(h-X)/(H+1))}else N=k=0}T>Tm?k>Tm?(v=Rm(I,O,z,$,h,k,y),_=Rm(q,U,D,R,h,k,y),u.moveTo(v.cx+v.x01,v.cy+v.y01),kTm&&M>Tm?N>Tm?(v=Rm(D,R,q,U,l,-N,y),_=Rm(z,$,I,O,l,-N,y),u.lineTo(v.cx+v.x01,v.cy+v.y01),N=0))throw new RangeError("invalid r");let e=t.length;if(!((e=Math.floor(e))>=0))throw new RangeError("invalid length");if(!e||!n)return t;const r=y(n),i=t.slice();return r(t,i,0,e,1),r(i,t,0,e,1),r(t,i,0,e,1),t},t.blur2=l,t.blurImage=h,t.brush=function(){return wa(la)},t.brushSelection=function(t){var n=t.__brush;return n?n.dim.output(n.selection):null},t.brushX=function(){return wa(fa)},t.brushY=function(){return wa(sa)},t.buffer=function(t,n){return fetch(t,n).then(_c)},t.chord=function(){return za(!1,!1)},t.chordDirected=function(){return za(!0,!1)},t.chordTranspose=function(){return za(!1,!0)},t.cluster=function(){var t=Ld,n=1,e=1,r=!1;function i(i){var o,a=0;i.eachAfter((function(n){var e=n.children;e?(n.x=function(t){return t.reduce(jd,0)/t.length}(e),n.y=function(t){return 1+t.reduce(Hd,0)}(e)):(n.x=o?a+=t(n,o):0,n.y=0,o=n)}));var u=function(t){for(var n;n=t.children;)t=n[0];return t}(i),c=function(t){for(var n;n=t.children;)t=n[n.length-1];return t}(i),f=u.x-t(u,c)/2,s=c.x+t(c,u)/2;return i.eachAfter(r?function(t){t.x=(t.x-i.x)*n,t.y=(i.y-t.y)*e}:function(t){t.x=(t.x-f)/(s-f)*n,t.y=(1-(i.y?t.y/i.y:1))*e})}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},t.color=ze,t.contourDensity=function(){var t=fu,n=su,e=lu,r=960,i=500,o=20,a=2,u=3*o,c=r+2*u>>a,f=i+2*u>>a,s=Qa(20);function h(r){var i=new Float32Array(c*f),s=Math.pow(2,-a),h=-1;for(const o of r){var d=(t(o,++h,r)+u)*s,p=(n(o,h,r)+u)*s,g=+e(o,h,r);if(g&&d>=0&&d=0&&pt*r)))(n).map(((t,n)=>(t.value=+e[n],p(t))))}function p(t){return t.coordinates.forEach(g),t}function g(t){t.forEach(y)}function y(t){t.forEach(v)}function v(t){t[0]=t[0]*Math.pow(2,a)-u,t[1]=t[1]*Math.pow(2,a)-u}function _(){return c=r+2*(u=3*o)>>a,f=i+2*u>>a,d}return d.contours=function(t){var n=h(t),e=iu().size([c,f]),r=Math.pow(2,2*a),i=t=>{t=+t;var i=p(e.contour(n,t*r));return i.value=t,i};return Object.defineProperty(i,"max",{get:()=>J(n)/r}),i},d.x=function(n){return arguments.length?(t="function"==typeof n?n:Qa(+n),d):t},d.y=function(t){return arguments.length?(n="function"==typeof t?t:Qa(+t),d):n},d.weight=function(t){return arguments.length?(e="function"==typeof t?t:Qa(+t),d):e},d.size=function(t){if(!arguments.length)return[r,i];var n=+t[0],e=+t[1];if(!(n>=0&&e>=0))throw new Error("invalid size");return r=n,i=e,_()},d.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return a=Math.floor(Math.log(t)/Math.LN2),_()},d.thresholds=function(t){return arguments.length?(s="function"==typeof t?t:Array.isArray(t)?Qa(Za.call(t)):Qa(t),d):s},d.bandwidth=function(t){if(!arguments.length)return Math.sqrt(o*(o+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return o=(Math.sqrt(4*t*t+1)-1)/2,_()},d},t.contours=iu,t.count=v,t.create=function(t){return Zn(Yt(t).call(document.documentElement))},t.creator=Yt,t.cross=function(...t){const n="function"==typeof t[t.length-1]&&function(t){return n=>t(...n)}(t.pop()),e=(t=t.map(m)).map(_),r=t.length-1,i=new Array(r+1).fill(0),o=[];if(r<0||e.some(b))return o;for(;;){o.push(i.map(((n,e)=>t[e][n])));let a=r;for(;++i[a]===e[a];){if(0===a)return n?o.map(n):o;i[a--]=0}}},t.csv=wc,t.csvFormat=rc,t.csvFormatBody=ic,t.csvFormatRow=ac,t.csvFormatRows=oc,t.csvFormatValue=uc,t.csvParse=nc,t.csvParseRows=ec,t.cubehelix=Tr,t.cumsum=function(t,n){var e=0,r=0;return Float64Array.from(t,void 0===n?t=>e+=+t||0:i=>e+=+n(i,r++,t)||0)},t.curveBasis=function(t){return new Fx(t)},t.curveBasisClosed=function(t){return new qx(t)},t.curveBasisOpen=function(t){return new Ux(t)},t.curveBumpX=nx,t.curveBumpY=ex,t.curveBundle=Ox,t.curveCardinal=Lx,t.curveCardinalClosed=Hx,t.curveCardinalOpen=Gx,t.curveCatmullRom=Zx,t.curveCatmullRomClosed=Qx,t.curveCatmullRomOpen=tw,t.curveLinear=Im,t.curveLinearClosed=function(t){return new nw(t)},t.curveMonotoneX=function(t){return new aw(t)},t.curveMonotoneY=function(t){return new uw(t)},t.curveNatural=function(t){return new fw(t)},t.curveStep=function(t){return new lw(t,.5)},t.curveStepAfter=function(t){return new lw(t,1)},t.curveStepBefore=function(t){return new lw(t,0)},t.descending=e,t.deviation=w,t.difference=function(t,...n){t=new InternSet(t);for(const e of n)for(const n of e)t.delete(n);return t},t.disjoint=function(t,n){const e=n[Symbol.iterator](),r=new InternSet;for(const n of t){if(r.has(n))return!1;let t,i;for(;({value:t,done:i}=e.next())&&!i;){if(Object.is(n,t))return!1;r.add(t)}}return!0},t.dispatch=$t,t.drag=function(){var t,n,e,r,i=se,o=le,a=he,u=de,c={},f=$t("start","drag","end"),s=0,l=0;function h(t){t.on("mousedown.drag",d).filter(u).on("touchstart.drag",y).on("touchmove.drag",v,ee).on("touchend.drag touchcancel.drag",_).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(a,u){if(!r&&i.call(this,a,u)){var c=b(this,o.call(this,a,u),a,u,"mouse");c&&(Zn(a.view).on("mousemove.drag",p,re).on("mouseup.drag",g,re),ae(a.view),ie(a),e=!1,t=a.clientX,n=a.clientY,c("start",a))}}function p(r){if(oe(r),!e){var i=r.clientX-t,o=r.clientY-n;e=i*i+o*o>l}c.mouse("drag",r)}function g(t){Zn(t.view).on("mousemove.drag mouseup.drag",null),ue(t.view,e),oe(t),c.mouse("end",t)}function y(t,n){if(i.call(this,t,n)){var e,r,a=t.changedTouches,u=o.call(this,t,n),c=a.length;for(e=0;e+t,t.easePoly=wo,t.easePolyIn=mo,t.easePolyInOut=wo,t.easePolyOut=xo,t.easeQuad=_o,t.easeQuadIn=function(t){return t*t},t.easeQuadInOut=_o,t.easeQuadOut=function(t){return t*(2-t)},t.easeSin=Ao,t.easeSinIn=function(t){return 1==+t?1:1-Math.cos(t*To)},t.easeSinInOut=Ao,t.easeSinOut=function(t){return Math.sin(t*To)},t.every=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");let e=-1;for(const r of t)if(!n(r,++e,t))return!1;return!0},t.extent=M,t.fcumsum=function(t,n){const e=new T;let r=-1;return Float64Array.from(t,void 0===n?t=>e.add(+t||0):i=>e.add(+n(i,++r,t)||0))},t.filter=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");const e=[];let r=-1;for(const i of t)n(i,++r,t)&&e.push(i);return e},t.flatGroup=function(t,...n){return z(P(t,...n),n)},t.flatRollup=function(t,n,...e){return z(D(t,n,...e),e)},t.forceCenter=function(t,n){var e,r=1;function i(){var i,o,a=e.length,u=0,c=0;for(i=0;if+p||os+p||ac.index){var g=f-u.x-u.vx,y=s-u.y-u.vy,v=g*g+y*y;vt.r&&(t.r=t[n].r)}function c(){if(n){var r,i,o=n.length;for(e=new Array(o),r=0;r[u(t,n,r),t])));for(a=0,i=new Array(f);a=u)){(t.data!==n||t.next)&&(0===l&&(p+=(l=Uc(e))*l),0===h&&(p+=(h=Uc(e))*h),p(t=(Lc*t+jc)%Hc)/Hc}();function l(){h(),f.call("tick",n),e1?(null==e?u.delete(t):u.set(t,p(e)),n):u.get(t)},find:function(n,e,r){var i,o,a,u,c,f=0,s=t.length;for(null==r?r=1/0:r*=r,f=0;f1?(f.on(t,e),n):f.on(t)}}},t.forceX=function(t){var n,e,r,i=qc(.1);function o(t){for(var i,o=0,a=n.length;o=.12&&i<.234&&r>=-.425&&r<-.214?u:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:a).invert(t)},s.stream=function(e){return t&&n===e?t:(r=[a.stream(n=e),u.stream(e),c.stream(e)],i=r.length,t={point:function(t,n){for(var e=-1;++ejs(r[0],r[1])&&(r[1]=i[1]),js(i[0],r[1])>js(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(a=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(u=js(r[1],i[0]))>a&&(a=u,Wf=i[0],Kf=r[1])}return is=os=null,Wf===1/0||Zf===1/0?[[NaN,NaN],[NaN,NaN]]:[[Wf,Zf],[Kf,Qf]]},t.geoCentroid=function(t){ms=xs=ws=Ms=Ts=As=Ss=Es=0,Ns=new T,ks=new T,Cs=new T,Lf(t,Gs);var n=+Ns,e=+ks,r=+Cs,i=Ef(n,e,r);return i=0))throw new RangeError(`invalid digits: ${t}`);i=n}return null===n&&(r=new ed(i)),a},a.projection(t).digits(i).context(n)},t.geoProjection=yd,t.geoProjectionMutator=vd,t.geoRotation=ll,t.geoStereographic=function(){return yd(Bd).scale(250).clipAngle(142)},t.geoStereographicRaw=Bd,t.geoStream=Lf,t.geoTransform=function(t){return{stream:id(t)}},t.geoTransverseMercator=function(){var t=Ed(Yd),n=t.center,e=t.rotate;return t.center=function(t){return arguments.length?n([-t[1],t[0]]):[(t=n())[1],-t[0]]},t.rotate=function(t){return arguments.length?e([t[0],t[1],t.length>2?t[2]+90:90]):[(t=e())[0],t[1],t[2]-90]},e([0,0,90]).scale(159.155)},t.geoTransverseMercatorRaw=Yd,t.gray=function(t,n){return new ur(t,0,0,null==n?1:n)},t.greatest=ot,t.greatestIndex=function(t,e=n){if(1===e.length)return tt(t,e);let r,i=-1,o=-1;for(const n of t)++o,(i<0?0===e(n,n):e(n,r)>0)&&(r=n,i=o);return i},t.group=C,t.groupSort=function(t,e,r){return(2!==e.length?U($(t,e,r),(([t,e],[r,i])=>n(e,i)||n(t,r))):U(C(t,r),(([t,r],[i,o])=>e(r,o)||n(t,i)))).map((([t])=>t))},t.groups=P,t.hcl=dr,t.hierarchy=Gd,t.histogram=Q,t.hsl=He,t.html=Ec,t.image=function(t,n){return new Promise((function(e,r){var i=new Image;for(var o in n)i[o]=n[o];i.onerror=r,i.onload=function(){e(i)},i.src=t}))},t.index=function(t,...n){return F(t,k,R,n)},t.indexes=function(t,...n){return F(t,Array.from,R,n)},t.interpolate=Gr,t.interpolateArray=function(t,n){return(Ir(n)?Ur:Or)(t,n)},t.interpolateBasis=Er,t.interpolateBasisClosed=Nr,t.interpolateBlues=Gb,t.interpolateBrBG=ob,t.interpolateBuGn=Mb,t.interpolateBuPu=Ab,t.interpolateCividis=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(-4.54-t*(35.34-t*(2381.73-t*(6402.7-t*(7024.72-2710.57*t)))))))+", "+Math.max(0,Math.min(255,Math.round(32.49+t*(170.73+t*(52.82-t*(131.46-t*(176.58-67.37*t)))))))+", "+Math.max(0,Math.min(255,Math.round(81.24+t*(442.36-t*(2482.43-t*(6167.24-t*(6614.94-2475.67*t)))))))+")"},t.interpolateCool=am,t.interpolateCubehelix=li,t.interpolateCubehelixDefault=im,t.interpolateCubehelixLong=hi,t.interpolateDate=Br,t.interpolateDiscrete=function(t){var n=t.length;return function(e){return t[Math.max(0,Math.min(n-1,Math.floor(e*n)))]}},t.interpolateGnBu=Eb,t.interpolateGreens=Wb,t.interpolateGreys=Kb,t.interpolateHcl=ci,t.interpolateHclLong=fi,t.interpolateHsl=oi,t.interpolateHslLong=ai,t.interpolateHue=function(t,n){var e=Pr(+t,+n);return function(t){var n=e(t);return n-360*Math.floor(n/360)}},t.interpolateInferno=pm,t.interpolateLab=function(t,n){var e=$r((t=ar(t)).l,(n=ar(n)).l),r=$r(t.a,n.a),i=$r(t.b,n.b),o=$r(t.opacity,n.opacity);return function(n){return t.l=e(n),t.a=r(n),t.b=i(n),t.opacity=o(n),t+""}},t.interpolateMagma=dm,t.interpolateNumber=Yr,t.interpolateNumberArray=Ur,t.interpolateObject=Lr,t.interpolateOrRd=kb,t.interpolateOranges=rm,t.interpolatePRGn=ub,t.interpolatePiYG=fb,t.interpolatePlasma=gm,t.interpolatePuBu=$b,t.interpolatePuBuGn=Pb,t.interpolatePuOr=lb,t.interpolatePuRd=Rb,t.interpolatePurples=Jb,t.interpolateRainbow=function(t){(t<0||t>1)&&(t-=Math.floor(t));var n=Math.abs(t-.5);return um.h=360*t-100,um.s=1.5-1.5*n,um.l=.8-.9*n,um+""},t.interpolateRdBu=db,t.interpolateRdGy=gb,t.interpolateRdPu=qb,t.interpolateRdYlBu=vb,t.interpolateRdYlGn=bb,t.interpolateReds=nm,t.interpolateRgb=Dr,t.interpolateRgbBasis=Fr,t.interpolateRgbBasisClosed=qr,t.interpolateRound=Vr,t.interpolateSinebow=function(t){var n;return t=(.5-t)*Math.PI,cm.r=255*(n=Math.sin(t))*n,cm.g=255*(n=Math.sin(t+fm))*n,cm.b=255*(n=Math.sin(t+sm))*n,cm+""},t.interpolateSpectral=xb,t.interpolateString=Xr,t.interpolateTransformCss=ti,t.interpolateTransformSvg=ni,t.interpolateTurbo=function(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"},t.interpolateViridis=hm,t.interpolateWarm=om,t.interpolateYlGn=Bb,t.interpolateYlGnBu=Ib,t.interpolateYlOrBr=Lb,t.interpolateYlOrRd=Hb,t.interpolateZoom=ri,t.interrupt=Gi,t.intersection=function(t,...n){t=new InternSet(t),n=n.map(vt);t:for(const e of t)for(const r of n)if(!r.has(e)){t.delete(e);continue t}return t},t.interval=function(t,n,e){var r=new Ei,i=n;return null==n?(r.restart(t,n,e),r):(r._restart=r.restart,r.restart=function(t,n,e){n=+n,e=null==e?Ai():+e,r._restart((function o(a){a+=i,r._restart(o,i+=n,e),t(a)}),n,e)},r.restart(t,n,e),r)},t.isoFormat=D_,t.isoParse=F_,t.json=function(t,n){return fetch(t,n).then(Tc)},t.lab=ar,t.lch=function(t,n,e,r){return 1===arguments.length?hr(t):new pr(e,n,t,null==r?1:r)},t.least=function(t,e=n){let r,i=!1;if(1===e.length){let o;for(const a of t){const t=e(a);(i?n(t,o)<0:0===n(t,t))&&(r=a,o=t,i=!0)}}else for(const n of t)(i?e(n,r)<0:0===e(n,n))&&(r=n,i=!0);return r},t.leastIndex=ht,t.line=Ym,t.lineRadial=Zm,t.link=ax,t.linkHorizontal=function(){return ax(nx)},t.linkRadial=function(){const t=ax(rx);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t},t.linkVertical=function(){return ax(ex)},t.local=Qn,t.map=function(t,n){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");if("function"!=typeof n)throw new TypeError("mapper is not a function");return Array.from(t,((e,r)=>n(e,r,t)))},t.matcher=Vt,t.max=J,t.maxIndex=tt,t.mean=function(t,n){let e=0,r=0;if(void 0===n)for(let n of t)null!=n&&(n=+n)>=n&&(++e,r+=n);else{let i=-1;for(let o of t)null!=(o=n(o,++i,t))&&(o=+o)>=o&&(++e,r+=o)}if(e)return r/e},t.median=function(t,n){return at(t,.5,n)},t.medianIndex=function(t,n){return ct(t,.5,n)},t.merge=ft,t.min=nt,t.minIndex=et,t.mode=function(t,n){const e=new InternMap;if(void 0===n)for(let n of t)null!=n&&n>=n&&e.set(n,(e.get(n)||0)+1);else{let r=-1;for(let i of t)null!=(i=n(i,++r,t))&&i>=i&&e.set(i,(e.get(i)||0)+1)}let r,i=0;for(const[t,n]of e)n>i&&(i=n,r=t);return r},t.namespace=It,t.namespaces=Ut,t.nice=Z,t.now=Ai,t.pack=function(){var t=null,n=1,e=1,r=np;function i(i){const o=ap();return i.x=n/2,i.y=e/2,t?i.eachBefore(xp(t)).eachAfter(wp(r,.5,o)).eachBefore(Mp(1)):i.eachBefore(xp(mp)).eachAfter(wp(np,1,o)).eachAfter(wp(r,i.r/Math.min(n,e),o)).eachBefore(Mp(Math.min(n,e)/(2*i.r))),i}return i.radius=function(n){return arguments.length?(t=Jd(n),i):t},i.size=function(t){return arguments.length?(n=+t[0],e=+t[1],i):[n,e]},i.padding=function(t){return arguments.length?(r="function"==typeof t?t:ep(+t),i):r},i},t.packEnclose=function(t){return up(t,ap())},t.packSiblings=function(t){return bp(t,ap()),t},t.pairs=function(t,n=st){const e=[];let r,i=!1;for(const o of t)i&&e.push(n(r,o)),r=o,i=!0;return e},t.partition=function(){var t=1,n=1,e=0,r=!1;function i(i){var o=i.height+1;return i.x0=i.y0=e,i.x1=t,i.y1=n/o,i.eachBefore(function(t,n){return function(r){r.children&&Ap(r,r.x0,t*(r.depth+1)/n,r.x1,t*(r.depth+2)/n);var i=r.x0,o=r.y0,a=r.x1-e,u=r.y1-e;a0&&(d+=l);for(null!=n?p.sort((function(t,e){return n(g[t],g[e])})):null!=e&&p.sort((function(t,n){return e(a[t],a[n])})),u=0,f=d?(v-h*b)/d:0;u0?l*f:0)+b,g[c]={data:a[c],index:u,value:l,startAngle:y,endAngle:s,padAngle:_};return g}return a.value=function(n){return arguments.length?(t="function"==typeof n?n:ym(+n),a):t},a.sortValues=function(t){return arguments.length?(n=t,e=null,a):n},a.sort=function(t){return arguments.length?(e=t,n=null,a):e},a.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:ym(+t),a):r},a.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:ym(+t),a):i},a.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:ym(+t),a):o},a},t.piecewise=di,t.pointRadial=Qm,t.pointer=ne,t.pointers=function(t,n){return t.target&&(t=te(t),void 0===n&&(n=t.currentTarget),t=t.touches||[t]),Array.from(t,(t=>ne(t,n)))},t.polygonArea=function(t){for(var n,e=-1,r=t.length,i=t[r-1],o=0;++eu!=f>u&&a<(c-e)*(u-r)/(f-r)+e&&(s=!s),c=e,f=r;return s},t.polygonHull=function(t){if((e=t.length)<3)return null;var n,e,r=new Array(e),i=new Array(e);for(n=0;n=0;--n)f.push(t[r[o[n]][2]]);for(n=+u;n(n=1664525*n+1013904223|0,lg*(n>>>0))},t.randomLogNormal=Kp,t.randomLogistic=fg,t.randomNormal=Zp,t.randomPareto=ng,t.randomPoisson=sg,t.randomUniform=Vp,t.randomWeibull=ug,t.range=lt,t.rank=function(t,e=n){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");let r=Array.from(t);const i=new Float64Array(r.length);2!==e.length&&(r=r.map(e),e=n);const o=(t,n)=>e(r[t],r[n]);let a,u;return(t=Uint32Array.from(r,((t,n)=>n))).sort(e===n?(t,n)=>O(r[t],r[n]):I(o)),t.forEach(((t,n)=>{const e=o(t,void 0===a?t:a);e>=0?((void 0===a||e>0)&&(a=t,u=n),i[t]=u):i[t]=NaN})),i},t.reduce=function(t,n,e){if("function"!=typeof n)throw new TypeError("reducer is not a function");const r=t[Symbol.iterator]();let i,o,a=-1;if(arguments.length<3){if(({done:i,value:e}=r.next()),i)return;++a}for(;({done:i,value:o}=r.next()),!i;)e=n(e,o,++a,t);return e},t.reverse=function(t){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");return Array.from(t).reverse()},t.rgb=Fe,t.ribbon=function(){return Wa()},t.ribbonArrow=function(){return Wa(Va)},t.rollup=$,t.rollups=D,t.scaleBand=yg,t.scaleDiverging=function t(){var n=Ng(L_()(mg));return n.copy=function(){return B_(n,t())},dg.apply(n,arguments)},t.scaleDivergingLog=function t(){var n=Fg(L_()).domain([.1,1,10]);return n.copy=function(){return B_(n,t()).base(n.base())},dg.apply(n,arguments)},t.scaleDivergingPow=j_,t.scaleDivergingSqrt=function(){return j_.apply(null,arguments).exponent(.5)},t.scaleDivergingSymlog=function t(){var n=Ig(L_());return n.copy=function(){return B_(n,t()).constant(n.constant())},dg.apply(n,arguments)},t.scaleIdentity=function t(n){var e;function r(t){return null==t||isNaN(t=+t)?e:t}return r.invert=r,r.domain=r.range=function(t){return arguments.length?(n=Array.from(t,_g),r):n.slice()},r.unknown=function(t){return arguments.length?(e=t,r):e},r.copy=function(){return t(n).unknown(e)},n=arguments.length?Array.from(n,_g):[0,1],Ng(r)},t.scaleImplicit=pg,t.scaleLinear=function t(){var n=Sg();return n.copy=function(){return Tg(n,t())},hg.apply(n,arguments),Ng(n)},t.scaleLog=function t(){const n=Fg(Ag()).domain([1,10]);return n.copy=()=>Tg(n,t()).base(n.base()),hg.apply(n,arguments),n},t.scaleOrdinal=gg,t.scalePoint=function(){return vg(yg.apply(null,arguments).paddingInner(1))},t.scalePow=jg,t.scaleQuantile=function t(){var e,r=[],i=[],o=[];function a(){var t=0,n=Math.max(1,i.length);for(o=new Array(n-1);++t0?o[n-1]:r[0],n=i?[o[i-1],r]:[o[n-1],o[n]]},u.unknown=function(t){return arguments.length?(n=t,u):u},u.thresholds=function(){return o.slice()},u.copy=function(){return t().domain([e,r]).range(a).unknown(n)},hg.apply(Ng(u),arguments)},t.scaleRadial=function t(){var n,e=Sg(),r=[0,1],i=!1;function o(t){var r=function(t){return Math.sign(t)*Math.sqrt(Math.abs(t))}(e(t));return isNaN(r)?n:i?Math.round(r):r}return o.invert=function(t){return e.invert(Hg(t))},o.domain=function(t){return arguments.length?(e.domain(t),o):e.domain()},o.range=function(t){return arguments.length?(e.range((r=Array.from(t,_g)).map(Hg)),o):r.slice()},o.rangeRound=function(t){return o.range(t).round(!0)},o.round=function(t){return arguments.length?(i=!!t,o):i},o.clamp=function(t){return arguments.length?(e.clamp(t),o):e.clamp()},o.unknown=function(t){return arguments.length?(n=t,o):n},o.copy=function(){return t(e.domain(),r).round(i).clamp(e.clamp()).unknown(n)},hg.apply(o,arguments),Ng(o)},t.scaleSequential=function t(){var n=Ng(O_()(mg));return n.copy=function(){return B_(n,t())},dg.apply(n,arguments)},t.scaleSequentialLog=function t(){var n=Fg(O_()).domain([1,10]);return n.copy=function(){return B_(n,t()).base(n.base())},dg.apply(n,arguments)},t.scaleSequentialPow=Y_,t.scaleSequentialQuantile=function t(){var e=[],r=mg;function i(t){if(null!=t&&!isNaN(t=+t))return r((s(e,t,1)-1)/(e.length-1))}return i.domain=function(t){if(!arguments.length)return e.slice();e=[];for(let n of t)null==n||isNaN(n=+n)||e.push(n);return e.sort(n),i},i.interpolator=function(t){return arguments.length?(r=t,i):r},i.range=function(){return e.map(((t,n)=>r(n/(e.length-1))))},i.quantiles=function(t){return Array.from({length:t+1},((n,r)=>at(e,r/t)))},i.copy=function(){return t(r).domain(e)},dg.apply(i,arguments)},t.scaleSequentialSqrt=function(){return Y_.apply(null,arguments).exponent(.5)},t.scaleSequentialSymlog=function t(){var n=Ig(O_());return n.copy=function(){return B_(n,t()).constant(n.constant())},dg.apply(n,arguments)},t.scaleSqrt=function(){return jg.apply(null,arguments).exponent(.5)},t.scaleSymlog=function t(){var n=Ig(Ag());return n.copy=function(){return Tg(n,t()).constant(n.constant())},hg.apply(n,arguments)},t.scaleThreshold=function t(){var n,e=[.5],r=[0,1],i=1;function o(t){return null!=t&&t<=t?r[s(e,t,0,i)]:n}return o.domain=function(t){return arguments.length?(e=Array.from(t),i=Math.min(e.length,r.length-1),o):e.slice()},o.range=function(t){return arguments.length?(r=Array.from(t),i=Math.min(e.length,r.length-1),o):r.slice()},o.invertExtent=function(t){var n=r.indexOf(t);return[e[n-1],e[n]]},o.unknown=function(t){return arguments.length?(n=t,o):n},o.copy=function(){return t().domain(e).range(r).unknown(n)},hg.apply(o,arguments)},t.scaleTime=function(){return hg.apply(I_(uv,cv,tv,Zy,xy,py,sy,ay,iy,t.timeFormat).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)},t.scaleUtc=function(){return hg.apply(I_(ov,av,ev,Qy,Fy,yy,hy,cy,iy,t.utcFormat).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)},t.scan=function(t,n){const e=ht(t,n);return e<0?void 0:e},t.schemeAccent=G_,t.schemeBlues=Xb,t.schemeBrBG=ib,t.schemeBuGn=wb,t.schemeBuPu=Tb,t.schemeCategory10=X_,t.schemeDark2=V_,t.schemeGnBu=Sb,t.schemeGreens=Vb,t.schemeGreys=Zb,t.schemeObservable10=W_,t.schemeOrRd=Nb,t.schemeOranges=em,t.schemePRGn=ab,t.schemePaired=Z_,t.schemePastel1=K_,t.schemePastel2=Q_,t.schemePiYG=cb,t.schemePuBu=zb,t.schemePuBuGn=Cb,t.schemePuOr=sb,t.schemePuRd=Db,t.schemePurples=Qb,t.schemeRdBu=hb,t.schemeRdGy=pb,t.schemeRdPu=Fb,t.schemeRdYlBu=yb,t.schemeRdYlGn=_b,t.schemeReds=tm,t.schemeSet1=J_,t.schemeSet2=tb,t.schemeSet3=nb,t.schemeSpectral=mb,t.schemeTableau10=eb,t.schemeYlGn=Ob,t.schemeYlGnBu=Ub,t.schemeYlOrBr=Yb,t.schemeYlOrRd=jb,t.select=Zn,t.selectAll=function(t){return"string"==typeof t?new Vn([document.querySelectorAll(t)],[document.documentElement]):new Vn([Ht(t)],Gn)},t.selection=Wn,t.selector=jt,t.selectorAll=Gt,t.shuffle=dt,t.shuffler=pt,t.some=function(t,n){if("function"!=typeof n)throw new TypeError("test is not a function");let e=-1;for(const r of t)if(n(r,++e,t))return!0;return!1},t.sort=U,t.stack=function(){var t=ym([]),n=dw,e=hw,r=pw;function i(i){var o,a,u=Array.from(t.apply(this,arguments),gw),c=u.length,f=-1;for(const t of i)for(o=0,++f;o0)for(var e,r,i,o,a,u,c=0,f=t[n[0]].length;c0?(r[0]=o,r[1]=o+=i):i<0?(r[1]=a,r[0]=a+=i):(r[0]=0,r[1]=i)},t.stackOffsetExpand=function(t,n){if((r=t.length)>0){for(var e,r,i,o=0,a=t[0].length;o0){for(var e,r=0,i=t[n[0]],o=i.length;r0&&(r=(e=t[n[0]]).length)>0){for(var e,r,i,o=0,a=1;afunction(t){t=`${t}`;let n=t.length;zp(t,n-1)&&!zp(t,n-2)&&(t=t.slice(0,-1));return"/"===t[0]?t:`/${t}`}(t(n,e,r)))),e=n.map(Pp),i=new Set(n).add("");for(const t of e)i.has(t)||(i.add(t),n.push(t),e.push(Pp(t)),h.push(Np));d=(t,e)=>n[e],p=(t,n)=>e[n]}for(a=0,i=h.length;a=0&&(f=h[t]).data===Np;--t)f.data=null}if(u.parent=Sp,u.eachBefore((function(t){t.depth=t.parent.depth+1,--i})).eachBefore(Kd),u.parent=null,i>0)throw new Error("cycle");return u}return r.id=function(t){return arguments.length?(n=Jd(t),r):n},r.parentId=function(t){return arguments.length?(e=Jd(t),r):e},r.path=function(n){return arguments.length?(t=Jd(n),r):t},r},t.style=_n,t.subset=function(t,n){return _t(n,t)},t.sum=function(t,n){let e=0;if(void 0===n)for(let n of t)(n=+n)&&(e+=n);else{let r=-1;for(let i of t)(i=+n(i,++r,t))&&(e+=i)}return e},t.superset=_t,t.svg=Nc,t.symbol=function(t,n){let e=null,r=km(i);function i(){let i;if(e||(e=i=r()),t.apply(this,arguments).draw(e,+n.apply(this,arguments)),i)return e=null,i+""||null}return t="function"==typeof t?t:ym(t||fx),n="function"==typeof n?n:ym(void 0===n?64:+n),i.type=function(n){return arguments.length?(t="function"==typeof n?n:ym(n),i):t},i.size=function(t){return arguments.length?(n="function"==typeof t?t:ym(+t),i):n},i.context=function(t){return arguments.length?(e=null==t?null:t,i):e},i},t.symbolAsterisk=cx,t.symbolCircle=fx,t.symbolCross=sx,t.symbolDiamond=dx,t.symbolDiamond2=px,t.symbolPlus=gx,t.symbolSquare=yx,t.symbolSquare2=vx,t.symbolStar=xx,t.symbolTimes=Px,t.symbolTriangle=Mx,t.symbolTriangle2=Ax,t.symbolWye=Cx,t.symbolX=Px,t.symbols=zx,t.symbolsFill=zx,t.symbolsStroke=$x,t.text=mc,t.thresholdFreedmanDiaconis=function(t,n,e){const r=v(t),i=at(t,.75)-at(t,.25);return r&&i?Math.ceil((e-n)/(2*i*Math.pow(r,-1/3))):1},t.thresholdScott=function(t,n,e){const r=v(t),i=w(t);return r&&i?Math.ceil((e-n)*Math.cbrt(r)/(3.49*i)):1},t.thresholdSturges=K,t.tickFormat=Eg,t.tickIncrement=V,t.tickStep=W,t.ticks=G,t.timeDay=py,t.timeDays=gy,t.timeFormatDefaultLocale=P_,t.timeFormatLocale=hv,t.timeFriday=Sy,t.timeFridays=$y,t.timeHour=sy,t.timeHours=ly,t.timeInterval=Vg,t.timeMillisecond=Wg,t.timeMilliseconds=Zg,t.timeMinute=ay,t.timeMinutes=uy,t.timeMonday=wy,t.timeMondays=ky,t.timeMonth=Zy,t.timeMonths=Ky,t.timeSaturday=Ey,t.timeSaturdays=Dy,t.timeSecond=iy,t.timeSeconds=oy,t.timeSunday=xy,t.timeSundays=Ny,t.timeThursday=Ay,t.timeThursdays=zy,t.timeTickInterval=cv,t.timeTicks=uv,t.timeTuesday=My,t.timeTuesdays=Cy,t.timeWednesday=Ty,t.timeWednesdays=Py,t.timeWeek=xy,t.timeWeeks=Ny,t.timeYear=tv,t.timeYears=nv,t.timeout=$i,t.timer=Ni,t.timerFlush=ki,t.transition=go,t.transpose=gt,t.tree=function(){var t=$p,n=1,e=1,r=null;function i(i){var c=function(t){for(var n,e,r,i,o,a=new Up(t,0),u=[a];n=u.pop();)if(r=n._.children)for(n.children=new Array(o=r.length),i=o-1;i>=0;--i)u.push(e=n.children[i]=new Up(r[i],i)),e.parent=n;return(a.parent=new Up(null,0)).children=[a],a}(i);if(c.eachAfter(o),c.parent.m=-c.z,c.eachBefore(a),r)i.eachBefore(u);else{var f=i,s=i,l=i;i.eachBefore((function(t){t.xs.x&&(s=t),t.depth>l.depth&&(l=t)}));var h=f===s?1:t(f,s)/2,d=h-f.x,p=n/(s.x+h+d),g=e/(l.depth||1);i.eachBefore((function(t){t.x=(t.x+d)*p,t.y=t.depth*g}))}return i}function o(n){var e=n.children,r=n.parent.children,i=n.i?r[n.i-1]:null;if(e){!function(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}(n);var o=(e[0].z+e[e.length-1].z)/2;i?(n.z=i.z+t(n._,i._),n.m=n.z-o):n.z=o}else i&&(n.z=i.z+t(n._,i._));n.parent.A=function(n,e,r){if(e){for(var i,o=n,a=n,u=e,c=o.parent.children[0],f=o.m,s=a.m,l=u.m,h=c.m;u=Rp(u),o=Dp(o),u&&o;)c=Dp(c),(a=Rp(a)).a=n,(i=u.z+l-o.z-f+t(u._,o._))>0&&(Fp(qp(u,n,r),n,i),f+=i,s+=i),l+=u.m,f+=o.m,h+=c.m,s+=a.m;u&&!Rp(a)&&(a.t=u,a.m+=l-s),o&&!Dp(c)&&(c.t=o,c.m+=f-h,r=n)}return r}(n,i,n.parent.A||r[0])}function a(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function u(t){t.x*=n,t.y=t.depth*e}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},t.treemap=function(){var t=Yp,n=!1,e=1,r=1,i=[0],o=np,a=np,u=np,c=np,f=np;function s(t){return t.x0=t.y0=0,t.x1=e,t.y1=r,t.eachBefore(l),i=[0],n&&t.eachBefore(Tp),t}function l(n){var e=i[n.depth],r=n.x0+e,s=n.y0+e,l=n.x1-e,h=n.y1-e;l=e-1){var s=u[n];return s.x0=i,s.y0=o,s.x1=a,void(s.y1=c)}var l=f[n],h=r/2+l,d=n+1,p=e-1;for(;d>>1;f[g]c-o){var _=r?(i*v+a*y)/r:a;t(n,d,y,i,o,_,c),t(d,e,v,_,o,a,c)}else{var b=r?(o*v+c*y)/r:c;t(n,d,y,i,o,a,b),t(d,e,v,i,b,a,c)}}(0,c,t.value,n,e,r,i)},t.treemapDice=Ap,t.treemapResquarify=Lp,t.treemapSlice=Ip,t.treemapSliceDice=function(t,n,e,r,i){(1&t.depth?Ip:Ap)(t,n,e,r,i)},t.treemapSquarify=Yp,t.tsv=Mc,t.tsvFormat=lc,t.tsvFormatBody=hc,t.tsvFormatRow=pc,t.tsvFormatRows=dc,t.tsvFormatValue=gc,t.tsvParse=fc,t.tsvParseRows=sc,t.union=function(...t){const n=new InternSet;for(const e of t)for(const t of e)n.add(t);return n},t.unixDay=_y,t.unixDays=by,t.utcDay=yy,t.utcDays=vy,t.utcFriday=By,t.utcFridays=Vy,t.utcHour=hy,t.utcHours=dy,t.utcMillisecond=Wg,t.utcMilliseconds=Zg,t.utcMinute=cy,t.utcMinutes=fy,t.utcMonday=qy,t.utcMondays=jy,t.utcMonth=Qy,t.utcMonths=Jy,t.utcSaturday=Yy,t.utcSaturdays=Wy,t.utcSecond=iy,t.utcSeconds=oy,t.utcSunday=Fy,t.utcSundays=Ly,t.utcThursday=Oy,t.utcThursdays=Gy,t.utcTickInterval=av,t.utcTicks=ov,t.utcTuesday=Uy,t.utcTuesdays=Hy,t.utcWednesday=Iy,t.utcWednesdays=Xy,t.utcWeek=Fy,t.utcWeeks=Ly,t.utcYear=ev,t.utcYears=rv,t.variance=x,t.version="7.9.0",t.window=pn,t.xml=Sc,t.zip=function(){return gt(arguments)},t.zoom=function(){var t,n,e,r=Ew,i=Nw,o=zw,a=Cw,u=Pw,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],s=250,l=ri,h=$t("start","zoom","end"),d=500,p=150,g=0,y=10;function v(t){t.property("__zoom",kw).on("wheel.zoom",T,{passive:!1}).on("mousedown.zoom",A).on("dblclick.zoom",S).filter(u).on("touchstart.zoom",E).on("touchmove.zoom",N).on("touchend.zoom touchcancel.zoom",k).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function _(t,n){return(n=Math.max(c[0],Math.min(c[1],n)))===t.k?t:new ww(n,t.x,t.y)}function b(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new ww(t.k,r,i)}function m(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function x(t,n,e,r){t.on("start.zoom",(function(){w(this,arguments).event(r).start()})).on("interrupt.zoom end.zoom",(function(){w(this,arguments).event(r).end()})).tween("zoom",(function(){var t=this,o=arguments,a=w(t,o).event(r),u=i.apply(t,o),c=null==e?m(u):"function"==typeof e?e.apply(t,o):e,f=Math.max(u[1][0]-u[0][0],u[1][1]-u[0][1]),s=t.__zoom,h="function"==typeof n?n.apply(t,o):n,d=l(s.invert(c).concat(f/s.k),h.invert(c).concat(f/h.k));return function(t){if(1===t)t=h;else{var n=d(t),e=f/n[2];t=new ww(e,c[0]-n[0]*e,c[1]-n[1]*e)}a.zoom(null,t)}}))}function w(t,n,e){return!e&&t.__zooming||new M(t,n)}function M(t,n){this.that=t,this.args=n,this.active=0,this.sourceEvent=null,this.extent=i.apply(t,n),this.taps=0}function T(t,...n){if(r.apply(this,arguments)){var e=w(this,n).event(t),i=this.__zoom,u=Math.max(c[0],Math.min(c[1],i.k*Math.pow(2,a.apply(this,arguments)))),s=ne(t);if(e.wheel)e.mouse[0][0]===s[0]&&e.mouse[0][1]===s[1]||(e.mouse[1]=i.invert(e.mouse[0]=s)),clearTimeout(e.wheel);else{if(i.k===u)return;e.mouse=[s,i.invert(s)],Gi(this),e.start()}Sw(t),e.wheel=setTimeout((function(){e.wheel=null,e.end()}),p),e.zoom("mouse",o(b(_(i,u),e.mouse[0],e.mouse[1]),e.extent,f))}}function A(t,...n){if(!e&&r.apply(this,arguments)){var i=t.currentTarget,a=w(this,n,!0).event(t),u=Zn(t.view).on("mousemove.zoom",(function(t){if(Sw(t),!a.moved){var n=t.clientX-s,e=t.clientY-l;a.moved=n*n+e*e>g}a.event(t).zoom("mouse",o(b(a.that.__zoom,a.mouse[0]=ne(t,i),a.mouse[1]),a.extent,f))}),!0).on("mouseup.zoom",(function(t){u.on("mousemove.zoom mouseup.zoom",null),ue(t.view,a.moved),Sw(t),a.event(t).end()}),!0),c=ne(t,i),s=t.clientX,l=t.clientY;ae(t.view),Aw(t),a.mouse=[c,this.__zoom.invert(c)],Gi(this),a.start()}}function S(t,...n){if(r.apply(this,arguments)){var e=this.__zoom,a=ne(t.changedTouches?t.changedTouches[0]:t,this),u=e.invert(a),c=e.k*(t.shiftKey?.5:2),l=o(b(_(e,c),a,u),i.apply(this,n),f);Sw(t),s>0?Zn(this).transition().duration(s).call(x,l,a,t):Zn(this).call(v.transform,l,a,t)}}function E(e,...i){if(r.apply(this,arguments)){var o,a,u,c,f=e.touches,s=f.length,l=w(this,i,e.changedTouches.length===s).event(e);for(Aw(e),a=0;a{var R=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports);var A=R((Di,pe)=>{var tt=(()=>{var e=Object.defineProperty,r=Object.getOwnPropertyNames,t=(T,j,q)=>j in T?e(T,j,{enumerable:!0,configurable:!0,writable:!0,value:q}):T[j]=q,n=(T,j)=>function(){return j||(0,T[r(T)[0]])((j={exports:{}}).exports,j),j.exports},i=(T,j,q)=>t(T,typeof j!="symbol"?j+"":j,q),a=n({"lib/graph.js"(T,j){"use strict";var q="\0",w="\0",_="",p=class{constructor(l){i(this,"_isDirected",!0),i(this,"_isMultigraph",!1),i(this,"_isCompound",!1),i(this,"_label"),i(this,"_defaultNodeLabelFn",()=>{}),i(this,"_defaultEdgeLabelFn",()=>{}),i(this,"_nodes",{}),i(this,"_in",{}),i(this,"_preds",{}),i(this,"_out",{}),i(this,"_sucs",{}),i(this,"_edgeObjs",{}),i(this,"_edgeLabels",{}),i(this,"_nodeCount",0),i(this,"_edgeCount",0),i(this,"_parent"),i(this,"_children"),l&&(this._isDirected=Object.hasOwn(l,"directed")?l.directed:!0,this._isMultigraph=Object.hasOwn(l,"multigraph")?l.multigraph:!1,this._isCompound=Object.hasOwn(l,"compound")?l.compound:!1),this._isCompound&&(this._parent={},this._children={},this._children[w]={})}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(l){return this._label=l,this}graph(){return this._label}setDefaultNodeLabel(l){return this._defaultNodeLabelFn=l,typeof l!="function"&&(this._defaultNodeLabelFn=()=>l),this}nodeCount(){return this._nodeCount}nodes(){return Object.keys(this._nodes)}sources(){var l=this;return this.nodes().filter(h=>Object.keys(l._in[h]).length===0)}sinks(){var l=this;return this.nodes().filter(h=>Object.keys(l._out[h]).length===0)}setNodes(l,h){var E=arguments,k=this;return l.forEach(function(y){E.length>1?k.setNode(y,h):k.setNode(y)}),this}setNode(l,h){return Object.hasOwn(this._nodes,l)?(arguments.length>1&&(this._nodes[l]=h),this):(this._nodes[l]=arguments.length>1?h:this._defaultNodeLabelFn(l),this._isCompound&&(this._parent[l]=w,this._children[l]={},this._children[w][l]=!0),this._in[l]={},this._preds[l]={},this._out[l]={},this._sucs[l]={},++this._nodeCount,this)}node(l){return this._nodes[l]}hasNode(l){return Object.hasOwn(this._nodes,l)}removeNode(l){var h=this;if(Object.hasOwn(this._nodes,l)){var E=k=>h.removeEdge(h._edgeObjs[k]);delete this._nodes[l],this._isCompound&&(this._removeFromParentsChildList(l),delete this._parent[l],this.children(l).forEach(function(k){h.setParent(k)}),delete this._children[l]),Object.keys(this._in[l]).forEach(E),delete this._in[l],delete this._preds[l],Object.keys(this._out[l]).forEach(E),delete this._out[l],delete this._sucs[l],--this._nodeCount}return this}setParent(l,h){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(h===void 0)h=w;else{h+="";for(var E=h;E!==void 0;E=this.parent(E))if(E===l)throw new Error("Setting "+h+" as parent of "+l+" would create a cycle");this.setNode(h)}return this.setNode(l),this._removeFromParentsChildList(l),this._parent[l]=h,this._children[h][l]=!0,this}_removeFromParentsChildList(l){delete this._children[this._parent[l]][l]}parent(l){if(this._isCompound){var h=this._parent[l];if(h!==w)return h}}children(l=w){if(this._isCompound){var h=this._children[l];if(h)return Object.keys(h)}else{if(l===w)return this.nodes();if(this.hasNode(l))return[]}}predecessors(l){var h=this._preds[l];if(h)return Object.keys(h)}successors(l){var h=this._sucs[l];if(h)return Object.keys(h)}neighbors(l){var h=this.predecessors(l);if(h){let k=new Set(h);for(var E of this.successors(l))k.add(E);return Array.from(k.values())}}isLeaf(l){var h;return this.isDirected()?h=this.successors(l):h=this.neighbors(l),h.length===0}filterNodes(l){var h=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});h.setGraph(this.graph());var E=this;Object.entries(this._nodes).forEach(function([O,I]){l(O)&&h.setNode(O,I)}),Object.values(this._edgeObjs).forEach(function(O){h.hasNode(O.v)&&h.hasNode(O.w)&&h.setEdge(O,E.edge(O))});var k={};function y(O){var I=E.parent(O);if(I===void 0||h.hasNode(I))return k[O]=I,I;if(I in k)return k[I];for(var L=[O,I],F=I;;){if(F=E.parent(F),F===void 0||h.hasNode(F)){for(var U=0;Uh.setParent(O,y(O))),h}setDefaultEdgeLabel(l){return this._defaultEdgeLabelFn=l,typeof l!="function"&&(this._defaultEdgeLabelFn=()=>l),this}edgeCount(){return this._edgeCount}edges(){return Object.values(this._edgeObjs)}setPath(l,h){var E=this,k=arguments;return l.reduce(function(y,O){return k.length>1?E.setEdge(y,O,h):E.setEdge(y,O),O}),this}setEdge(){var l,h,E,k,y=!1,O=arguments[0];typeof O=="object"&&O!==null&&"v"in O?(l=O.v,h=O.w,E=O.name,arguments.length===2&&(k=arguments[1],y=!0)):(l=O,h=arguments[1],E=arguments[3],arguments.length>2&&(k=arguments[2],y=!0)),l=""+l,h=""+h,E!==void 0&&(E=""+E);var I=g(this._isDirected,l,h,E);if(Object.hasOwn(this._edgeLabels,I))return y&&(this._edgeLabels[I]=k),this;if(E!==void 0&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(l),this.setNode(h),this._edgeLabels[I]=y?k:this._defaultEdgeLabelFn(l,h,E);var L=x(this._isDirected,l,h,E);return l=L.v,h=L.w,Object.freeze(L),this._edgeObjs[I]=L,m(this._preds[h],l),m(this._sucs[l],h),this._in[h][I]=L,this._out[l][I]=L,this._edgeCount++,this}edge(l,h,E){var k=arguments.length===1?v(this._isDirected,arguments[0]):g(this._isDirected,l,h,E);return this._edgeLabels[k]}edgeAsObj(){let l=this.edge(...arguments);return typeof l!="object"?{label:l}:l}hasEdge(l,h,E){var k=arguments.length===1?v(this._isDirected,arguments[0]):g(this._isDirected,l,h,E);return Object.hasOwn(this._edgeLabels,k)}removeEdge(l,h,E){var k=arguments.length===1?v(this._isDirected,arguments[0]):g(this._isDirected,l,h,E),y=this._edgeObjs[k];return y&&(l=y.v,h=y.w,delete this._edgeLabels[k],delete this._edgeObjs[k],b(this._preds[h],l),b(this._sucs[l],h),delete this._in[h][k],delete this._out[l][k],this._edgeCount--),this}inEdges(l,h){return this.isDirected()?this.filterEdges(this._in[l],l,h):this.nodeEdges(l,h)}outEdges(l,h){return this.isDirected()?this.filterEdges(this._out[l],l,h):this.nodeEdges(l,h)}nodeEdges(l,h){if(l in this._nodes)return this.filterEdges({...this._in[l],...this._out[l]},l,h)}filterEdges(l,h,E){if(l){var k=Object.values(l);return E?k.filter(function(y){return y.v===h&&y.w===E||y.v===E&&y.w===h}):k}}};function m(l,h){l[h]?l[h]++:l[h]=1}function b(l,h){--l[h]||delete l[h]}function g(l,h,E,k){var y=""+h,O=""+E;if(!l&&y>O){var I=y;y=O,O=I}return y+_+O+_+(k===void 0?q:k)}function x(l,h,E,k){var y=""+h,O=""+E;if(!l&&y>O){var I=y;y=O,O=I}var L={v:y,w:O};return k&&(L.name=k),L}function v(l,h){return g(l,h.v,h.w,h.name)}j.exports=p}}),s=n({"lib/version.js"(T,j){j.exports="3.0.4"}}),o=n({"lib/index.js"(T,j){j.exports={Graph:a(),version:s()}}}),d=n({"lib/json.js"(T,j){var q=a();j.exports={write:w,read:m};function w(b){var g={options:{directed:b.isDirected(),multigraph:b.isMultigraph(),compound:b.isCompound()},nodes:_(b),edges:p(b)};return b.graph()!==void 0&&(g.value=structuredClone(b.graph())),g}function _(b){return b.nodes().map(function(g){var x=b.node(g),v=b.parent(g),l={v:g};return x!==void 0&&(l.value=x),v!==void 0&&(l.parent=v),l})}function p(b){return b.edges().map(function(g){var x=b.edge(g),v={v:g.v,w:g.w};return g.name!==void 0&&(v.name=g.name),x!==void 0&&(v.value=x),v})}function m(b){var g=new q(b.options).setGraph(b.value);return b.nodes.forEach(function(x){g.setNode(x.v,x.value),x.parent&&g.setParent(x.v,x.parent)}),b.edges.forEach(function(x){g.setEdge({v:x.v,w:x.w,name:x.name},x.value)}),g}}}),u=n({"lib/alg/bellman-ford.js"(T,j){j.exports=w;var q=()=>1;function w(p,m,b,g){return _(p,String(m),b||q,g||function(x){return p.outEdges(x)})}function _(p,m,b,g){var x={},v=!0,l=0,h=p.nodes(),E=function(I){var L=b(I);x[I.v].distance+L0;){var v=x.pop();if(!Object.hasOwn(_,v)){_[v]=!0,m.push(v);var l=w.successors(v);if(l)for(var h=l.length-1;h>=0;h--)x.push(l[h]);var E=w.predecessors(v);if(E)for(var k=E.length-1;k>=0;k--)x.push(E[k])}}}return w.nodes().forEach(function(g){m=[],b(g),m.length&&p.push(m)}),p}}}),c=n({"lib/data/priority-queue.js"(T,j){var q=class{constructor(){i(this,"_arr",[]),i(this,"_keyIndices",{})}size(){return this._arr.length}keys(){return this._arr.map(function(w){return w.key})}has(w){return Object.hasOwn(this._keyIndices,w)}priority(w){var _=this._keyIndices[w];if(_!==void 0)return this._arr[_].priority}min(){if(this.size()===0)throw new Error("Queue underflow");return this._arr[0].key}add(w,_){var p=this._keyIndices;if(w=String(w),!Object.hasOwn(p,w)){var m=this._arr,b=m.length;return p[w]=b,m.push({key:w,priority:_}),this._decrease(b),!0}return!1}removeMin(){this._swap(0,this._arr.length-1);var w=this._arr.pop();return delete this._keyIndices[w.key],this._heapify(0),w.key}decrease(w,_){var p=this._keyIndices[w];if(_>this._arr[p].priority)throw new Error("New priority is greater than current priority. Key: "+w+" Old: "+this._arr[p].priority+" New: "+_);this._arr[p].priority=_,this._decrease(p)}_heapify(w){for(var _=this._arr;;){var p=2*w,m=p+1,b=w;if(p<_.length)if(b=_[p].priority<_[b].priority?p:b,m<_.length&&(b=_[m].priority<_[b].priority?m:b),b!==w)this._swap(w,b),w=b;else break;else break}}_decrease(w){for(var _=this._arr,p=_[w].priority,m;w!==0&&(m=w>>1,!(_[m].priority1;function _(m,b,g,x){var v=function(l){return m.outEdges(l)};return p(m,String(b),g||w,x||v)}function p(m,b,g,x){var v={},l=new q,h,E,k=function(y){var O=y.v!==h?y.v:y.w,I=v[O],L=g(y),F=E.distance+L;if(L<0)throw new Error("dijkstra does not allow negative edge weights. Bad edge: "+y+" Weight: "+L);F0&&(h=l.removeMin(),E=v[h],E.distance!==Number.POSITIVE_INFINITY);)x(h).forEach(k);return v}}}),C=n({"lib/alg/dijkstra-all.js"(T,j){var q=N();j.exports=w;function w(_,p,m){return _.nodes().reduce(function(b,g){return b[g]=q(_,g,p,m),b},{})}}}),S=n({"lib/alg/extract-path.js"(T,j){j.exports=q;function q(_,p,m){if(_[p].predecessor!==void 0)throw new Error("Invalid source vertex");if(_[m].predecessor===void 0&&m!==p)throw new Error("Invalid destination vertex");return{weight:_[m].distance,path:w(_,p,m)}}function w(_,p,m){for(var b=[],g=m;g!==p;)b.push(g),g=_[g].predecessor;return b.push(p),b.reverse()}}}),M=n({"lib/alg/tarjan.js"(T,j){j.exports=q;function q(w){var _=0,p=[],m={},b=[];function g(x){var v=[[x,0]];for(m[x]={onStack:!0,lowlink:_,index:_++},p.push(x);v.length>0;){var l=v[v.length-1],h=l[0],E=w.successors(h),k=l[1];if(k0){var I=v[v.length-1][0];m[I].lowlink=Math.min(m[I].lowlink,O.lowlink)}if(O.lowlink===O.index){var L=[],F;do F=p.pop(),m[F].onStack=!1,L.push(F);while(h!==F);b.push(L)}}}}return w.nodes().forEach(function(x){Object.hasOwn(m,x)||g(x)}),b}}}),P=n({"lib/alg/find-cycles.js"(T,j){var q=M();j.exports=w;function w(_){return q(_).filter(function(p){return p.length>1||p.length===1&&_.hasEdge(p[0],p[0])})}}}),D=n({"lib/alg/floyd-warshall.js"(T,j){j.exports=w;var q=()=>1;function w(p,m,b){return _(p,m||q,b||function(g){return p.outEdges(g)})}function _(p,m,b){var g={},x=p.nodes();return x.forEach(function(v){g[v]={},g[v][v]={distance:0},x.forEach(function(l){v!==l&&(g[v][l]={distance:Number.POSITIVE_INFINITY})}),b(v).forEach(function(l){var h=l.v===v?l.w:l.v,E=m(l);g[v][h]={distance:E,predecessor:v}})}),x.forEach(function(v){var l=g[v];x.forEach(function(h){var E=g[h];x.forEach(function(k){var y=E[v],O=l[k],I=E[k],L=y.distance+O.distance;L0;){var l=v[v.length-1],h=l[0],E=l[1];if(E===0){if(Object.hasOwn(m,h))throw new w;if(Object.hasOwn(p,h)){v.pop();continue}m[h]=!0,p[h]=!0}var k=_.predecessors(h);E0;){for(var h=l[l.length-1],E=h[0],k=g(E),y=h[1],O=!1,I=y;I0;){if(v=x.removeMin(),Object.hasOwn(g,v))b.setEdge(v,g[v]);else{if(h)throw new Error("Input graph is not connected: "+p);h=!0}p.nodeEdges(v).forEach(l)}return b}}}),$r=n({"lib/alg/shortest-paths.js"(T,j){var q=N(),w=u();j.exports=_;function _(m,b,g,x){return p(m,b,g,x||function(v){return m.outEdges(v)})}function p(m,b,g,x){if(g===void 0)return q(m,b,g,x);for(var v=!1,l=m.nodes(),h=0;h{var ee=class{constructor(){let r={};r._next=r._prev=r,this._sentinel=r}dequeue(){let r=this._sentinel,t=r._prev;if(t!==r)return be(t),t}enqueue(r){let t=this._sentinel;r._prev&&r._next&&be(r),r._next=t._next,t._next._prev=r,t._next=r,r._prev=t}toString(){let r=[],t=this._sentinel,n=t._prev;for(;n!==t;)r.push(JSON.stringify(n,nt)),n=n._prev;return"["+r.join(", ")+"]"}};function be(e){e._prev._next=e._next,e._next._prev=e._prev,delete e._next,delete e._prev}function nt(e,r){if(e!=="_next"&&e!=="_prev")return r}ve.exports=ee});var ge=R((Wi,we)=>{var it=A().Graph,st=me();we.exports=ot;var at=()=>1;function ot(e,r){if(e.nodeCount()<=1)return[];let t=dt(e,r||at);return lt(t.graph,t.buckets,t.zeroIdx).flatMap(i=>e.outEdges(i.v,i.w))}function lt(e,r,t){let n=[],i=r[r.length-1],a=r[0],s;for(;e.nodeCount();){for(;s=a.dequeue();)re(e,r,t,s);for(;s=i.dequeue();)re(e,r,t,s);if(e.nodeCount()){for(let o=r.length-2;o>0;--o)if(s=r[o].dequeue(),s){n=n.concat(re(e,r,t,s,!0));break}}}return n}function re(e,r,t,n,i){let a=i?[]:void 0;return e.inEdges(n.v).forEach(s=>{let o=e.edge(s),d=e.node(s.v);i&&a.push({v:s.v,w:s.w}),d.out-=o,te(r,t,d)}),e.outEdges(n.v).forEach(s=>{let o=e.edge(s),d=s.w,u=e.node(d);u.in-=o,te(r,t,u)}),e.removeNode(n.v),a}function dt(e,r){let t=new it,n=0,i=0;e.nodes().forEach(o=>{t.setNode(o,{v:o,in:0,out:0})}),e.edges().forEach(o=>{let d=t.edge(o.v,o.w)||0,u=r(o),f=d+u;t.setEdge(o.v,o.w,f),i=Math.max(i,t.node(o.v).out+=u),n=Math.max(n,t.node(o.w).in+=u)});let a=ut(i+n+3).map(()=>new st),s=n+1;return t.nodes().forEach(o=>{te(a,s,t.node(o))}),{graph:t,buckets:a,zeroIdx:s}}function te(e,r,t){t.out?t.in?e[t.out-t.in+r].enqueue(t):e[e.length-1].enqueue(t):e[0].enqueue(t)}function ut(e){let r=[];for(let t=0;t{"use strict";var Ee=A().Graph;Oe.exports={addBorderNode:gt,addDummyNode:_e,applyWithChunking:Q,asNonCompoundGraph:ft,buildLayerMatrix:vt,intersectRect:bt,mapValues:Ot,maxRank:ke,normalizeRanks:mt,notime:kt,partition:Et,pick:yt,predecessorWeights:pt,range:ye,removeEmptyRanks:wt,simplify:ht,successorWeights:ct,time:_t,uniqueId:xe,zipObject:ne};function _e(e,r,t,n){for(var i=n;e.hasNode(i);)i=xe(n);return t.dummy=r,e.setNode(i,t),i}function ht(e){let r=new Ee().setGraph(e.graph());return e.nodes().forEach(t=>r.setNode(t,e.node(t))),e.edges().forEach(t=>{let n=r.edge(t.v,t.w)||{weight:0,minlen:1},i=e.edge(t);r.setEdge(t.v,t.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),r}function ft(e){let r=new Ee({multigraph:e.isMultigraph()}).setGraph(e.graph());return e.nodes().forEach(t=>{e.children(t).length||r.setNode(t,e.node(t))}),e.edges().forEach(t=>{r.setEdge(t,e.edge(t))}),r}function ct(e){let r=e.nodes().map(t=>{let n={};return e.outEdges(t).forEach(i=>{n[i.w]=(n[i.w]||0)+e.edge(i).weight}),n});return ne(e.nodes(),r)}function pt(e){let r=e.nodes().map(t=>{let n={};return e.inEdges(t).forEach(i=>{n[i.v]=(n[i.v]||0)+e.edge(i).weight}),n});return ne(e.nodes(),r)}function bt(e,r){let t=e.x,n=e.y,i=r.x-t,a=r.y-n,s=e.width/2,o=e.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");let d,u;return Math.abs(a)*s>Math.abs(i)*o?(a<0&&(o=-o),d=o*i/a,u=o):(i<0&&(s=-s),d=s,u=s*a/i),{x:t+d,y:n+u}}function vt(e){let r=ye(ke(e)+1).map(()=>[]);return e.nodes().forEach(t=>{let n=e.node(t),i=n.rank;i!==void 0&&(r[i][n.order]=t)}),r}function mt(e){let r=e.nodes().map(n=>{let i=e.node(n).rank;return i===void 0?Number.MAX_VALUE:i}),t=Q(Math.min,r);e.nodes().forEach(n=>{let i=e.node(n);Object.hasOwn(i,"rank")&&(i.rank-=t)})}function wt(e){let r=e.nodes().map(s=>e.node(s).rank).filter(s=>s!==void 0),t=Q(Math.min,r),n=[];e.nodes().forEach(s=>{let o=e.node(s).rank-t;n[o]||(n[o]=[]),n[o].push(s)});let i=0,a=e.graph().nodeRankFactor;Array.from(n).forEach((s,o)=>{s===void 0&&o%a!==0?--i:s!==void 0&&i&&s.forEach(d=>e.node(d).rank+=i)})}function gt(e,r,t,n){let i={width:0,height:0};return arguments.length>=4&&(i.rank=t,i.order=n),_e(e,"border",i,r)}function Q(e,r){if(r.length===0)return e();let t=r[0];for(let n=1;n{let i=e.node(n).rank;return i===void 0?Number.MIN_VALUE:i});return Q(Math.max,t)}function Et(e,r){let t={lhs:[],rhs:[]};return e.forEach(n=>{r(n)?t.lhs.push(n):t.rhs.push(n)}),t}function _t(e,r){let t=Date.now();try{return r()}finally{console.log(e+" time: "+(Date.now()-t)+"ms")}}function kt(e,r){return r()}var xt=0;function xe(e){var r=++xt;return e+(""+r)}function ye(e,r,t=1){r==null&&(r=e,e=0);let n=a=>arn[r]),Object.entries(e).reduce((n,[i,a])=>(n[i]=t(a,i),n),{})}function ne(e,r){return e.reduce((t,n,i)=>(t[n]=r[i],t),{})}});var je=R((Ui,Ne)=>{"use strict";var Nt=ge(),jt=G().uniqueId;Ne.exports={run:It,undo:qt};function It(e){(e.graph().acyclicer==="greedy"?Nt(e,t(e)):Ct(e)).forEach(n=>{let i=e.edge(n);e.removeEdge(n),i.forwardName=n.name,i.reversed=!0,e.setEdge(n.w,n.v,i,jt("rev"))});function t(n){return i=>n.edge(i).weight}}function Ct(e){let r=[],t={},n={};function i(a){let s=[[a,0]];for(;s.length>0;){let[o,d]=s[s.length-1];if(d===0){if(Object.hasOwn(n,o)){s.pop();continue}n[o]=!0,t[o]=!0}let u=e.outEdges(o);if(d{let t=e.edge(r);if(t.reversed){e.removeEdge(r);let n=t.forwardName;delete t.reversed,delete t.forwardName,e.setEdge(r.w,r.v,t,n)}})}});var Ce=R((Hi,Ie)=>{"use strict";var Lt=G();Ie.exports={run:Tt,undo:Mt};function Tt(e){e.graph().dummyChains=[],e.edges().forEach(r=>Rt(e,r))}function Rt(e,r){let t=r.v,n=e.node(t).rank,i=r.w,a=e.node(i).rank,s=r.name,o=e.edge(r),d=o.labelRank;if(a===n+1)return;e.removeEdge(r);let u,f,c;for(c=0,++n;n{let t=e.node(r),n=t.edgeLabel,i;for(e.setEdge(t.edgeObj,n);t.dummy;)i=e.successors(r)[0],e.removeNode(r),n.points.push({x:t.x,y:t.y}),t.dummy==="edge-label"&&(n.x=t.x,n.y=t.y,n.width=t.width,n.height=t.height),r=i,t=e.node(r)})}});var H=R((Xi,qe)=>{"use strict";var{applyWithChunking:St}=G();qe.exports={longestPath:Pt,slack:Ft};function Pt(e){var r={};function t(n){let i=[[n,!1]];for(;i.length>0;){let[o,d]=i[i.length-1];if(Object.hasOwn(r,o)){i.pop();continue}if(d){i.pop(),r[o]=!0;var a=e.node(o);let u=e.outEdges(o).map(f=>f==null?Number.POSITIVE_INFINITY:e.node(f.w).rank-e.edge(f).minlen);var s=St(Math.min,u);s===Number.POSITIVE_INFINITY&&(s=0),a.rank=s}else{i[i.length-1][1]=!0;let u=e.outEdges(o);for(let f=u.length-1;f>=0;f--){let c=u[f];c!=null&&!Object.hasOwn(r,c.w)&&i.push([c.w,!1])}}}}e.sources().forEach(t)}function Ft(e,r){return e.node(r.w).rank-e.node(r.v).rank-e.edge(r).minlen}});var ie=R((Qi,Le)=>{"use strict";var Gt=A().Graph,J=H().slack;Le.exports=Dt;function Dt(e){var r=new Gt({directed:!1}),t=e.nodes()[0],n=e.nodeCount();r.setNode(t,{});for(var i,a;At(r,e)0;){let a=i.pop();r.nodeEdges(a).forEach(s=>{var o=s.v,d=a===o?s.w:o;!e.hasNode(d)&&!J(r,s)&&(e.setNode(d,{}),e.setEdge(a,d,{}),i.push(d))})}}return e.nodes().forEach(t),e.nodeCount()}function Vt(e,r){return r.edges().reduce((n,i)=>{let a=Number.POSITIVE_INFINITY;return e.hasNode(i.v)!==e.hasNode(i.w)&&(a=J(r,i)),ar.node(n).rank+=t)}});var De=R((Ji,Ge)=>{"use strict";var Bt=ie(),Te=H().slack,Wt=H().longestPath,zt=A().alg.preorder,Ut=A().alg.postorder,Ht=G().simplify;Ge.exports=W;W.initLowLimValues=ae;W.initCutValues=se;W.calcCutValue=Me;W.leaveEdge=Se;W.enterEdge=Pe;W.exchangeEdges=Fe;function W(e){e=Ht(e),Wt(e);var r=Bt(e);ae(r),se(r,e);for(var t,n;t=Se(r);)n=Pe(r,e,t),Fe(r,e,t,n)}function se(e,r){var t=Ut(e,e.nodes());t=t.slice(0,t.length-1),t.forEach(n=>Xt(e,r,n))}function Xt(e,r,t){var n=e.node(t),i=n.parent;e.edge(t,i).cutvalue=Me(e,r,t)}function Me(e,r,t){var n=e.node(t),i=n.parent,a=!0,s=r.edge(t,i),o=0;return s||(a=!1,s=r.edge(i,t)),o=s.weight,r.nodeEdges(t).forEach(d=>{var u=d.v===t,f=u?d.w:d.v;if(f!==i){var c=u===a,N=r.edge(d).weight;if(o+=c?N:-N,Kt(e,t,f)){var C=e.edge(t,f).cutvalue;o+=c?-C:C}}}),o}function ae(e,r){arguments.length<2&&(r=e.nodes()[0]),Qt(e,{},1,r)}function Qt(e,r,t,n,i){let a=[[n,i,0,t]];for(;a.length>0;){let s=a[a.length-1],[o,d,u,f]=s;u===0&&(r[o]=!0);let c=e.neighbors(o),N=!1;for(let C=u;Ce.edge(r).cutvalue<0)}function Pe(e,r,t){var n=t.v,i=t.w;r.hasEdge(n,i)||(n=t.w,i=t.v);var a=e.node(n),s=e.node(i),o=a,d=!1;a.lim>s.lim&&(o=s,d=!0);var u=r.edges().filter(f=>d===Re(e,e.node(f.v),o)&&d!==Re(e,e.node(f.w),o));return u.reduce((f,c)=>Te(r,c)!r.node(i).parent),n=zt(e,t);n=n.slice(1),n.forEach(i=>{var a=e.node(i).parent,s=r.edge(i,a),o=!1;s||(s=r.edge(a,i),o=!0),r.node(i).rank=r.node(a).rank+(o?s.minlen:-s.minlen)})}function Kt(e,r,t){return e.hasEdge(r,t)}function Re(e,r,t){return t.low<=r.lim&&r.lim<=t.lim}});var Be=R((Ki,Ye)=>{"use strict";var Zt=H(),Ve=Zt.longestPath,$t=ie(),en=De();Ye.exports=rn;function rn(e){var r=e.graph().ranker;if(r instanceof Function)return r(e);switch(e.graph().ranker){case"network-simplex":Ae(e);break;case"tight-tree":nn(e);break;case"longest-path":tn(e);break;case"none":break;default:Ae(e)}}var tn=Ve;function nn(e){Ve(e),$t(e)}function Ae(e){en(e)}});var ze=R((Zi,We)=>{We.exports=sn;function sn(e){let r=on(e);e.graph().dummyChains.forEach(t=>{let n=e.node(t),i=n.edgeObj,a=an(e,r,i.v,i.w),s=a.path,o=a.lca,d=0,u=s[d],f=!0;for(;t!==i.w;){if(n=e.node(t),f){for(;(u=s[d])!==o&&e.node(u).maxRanks||o>r[d].lim));for(u=d,d=n;(d=e.parent(d))!==u;)a.push(d);return{path:i.concat(a.reverse()),lca:u}}function on(e){let r={},t=0,n=[];for(e.children().forEach(i=>n.push([i,!1,0]));n.length>0;){let i=n[n.length-1],[a,s]=i;if(s)n.pop(),r[a]={low:i[2],lim:t++};else{i[1]=!0,i[2]=t;let o=e.children(a);for(let d=o.length-1;d>=0;d--)n.push([o[d],!1,0])}}return r}});var He=R(($i,Ue)=>{var K=G();Ue.exports={run:ln,cleanup:fn};function ln(e){let r=K.addDummyNode(e,"root",{},"_root"),t=un(e),n=Object.values(t),i=K.applyWithChunking(Math.max,n)-1,a=2*i+1;e.graph().nestingRoot=r,e.edges().forEach(o=>e.edge(o).minlen*=a);let s=hn(e)+1;e.children().forEach(o=>dn(e,r,a,s,i,t,o)),e.graph().nodeRankFactor=a}function dn(e,r,t,n,i,a,s){let o=[[s,!1]];for(;o.length>0;){let d=o[o.length-1],[u,f]=d,c=e.children(u);if(!c.length){o.pop(),u!==r&&e.setEdge(r,u,{weight:0,minlen:t});continue}if(!f){d[1]=!0;for(let M=c.length-1;M>=0;M--)o.push([c[M],!1]);continue}o.pop();let N=K.addBorderNode(e,"_bt"),C=K.addBorderNode(e,"_bb"),S=e.node(u);e.setParent(N,u),S.borderTop=N,e.setParent(C,u),S.borderBottom=C,c.forEach(M=>{let P=e.node(M),D=P.borderTop?P.borderTop:M,Y=P.borderBottom?P.borderBottom:M,X=P.borderTop?n:2*n,z=D!==Y?1:i-a[u]+1;e.setEdge(N,D,{weight:X,minlen:z,nestingEdge:!0}),e.setEdge(Y,C,{weight:X,minlen:z,nestingEdge:!0})}),e.parent(u)||e.setEdge(r,N,{weight:0,minlen:i+a[u]})}}function un(e){var r={};let t=[];for(e.children().forEach(i=>t.push([i,1]));t.length>0;){let[i,a]=t.pop();var n=e.children(i);n&&n.length&&n.forEach(s=>t.push([s,a+1])),r[i]=a}return r}function hn(e){return e.edges().reduce((r,t)=>r+e.edge(t).weight,0)}function fn(e){var r=e.graph();e.removeNode(r.nestingRoot),delete r.nestingRoot,e.edges().forEach(t=>{var n=e.edge(t);n.nestingEdge&&e.removeEdge(t)})}});var Je=R((es,Qe)=>{var cn=G();Qe.exports=pn;function pn(e){let r=[];for(e.children().forEach(t=>r.push([t,!1]));r.length>0;){let t=r[r.length-1],[n,i]=t,a=e.children(n);if(a.length&&!i){t[1]=!0;for(let o=a.length-1;o>=0;o--)r.push([a[o],!1]);continue}r.pop();let s=e.node(n);if(Object.hasOwn(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(let o=s.minRank,d=s.maxRank+1;o{"use strict";$e.exports={adjust:bn,undo:vn};function bn(e){let r=e.graph().rankdir.toLowerCase();(r==="lr"||r==="rl")&&Ze(e)}function vn(e){let r=e.graph().rankdir.toLowerCase();(r==="bt"||r==="rl")&&mn(e),(r==="lr"||r==="rl")&&(wn(e),Ze(e))}function Ze(e){e.nodes().forEach(r=>Ke(e.node(r))),e.edges().forEach(r=>Ke(e.edge(r)))}function Ke(e){let r=e.width;e.width=e.height,e.height=r}function mn(e){e.nodes().forEach(r=>oe(e.node(r))),e.edges().forEach(r=>{let t=e.edge(r);t.points.forEach(oe),Object.hasOwn(t,"y")&&oe(t)})}function oe(e){e.y=-e.y}function wn(e){e.nodes().forEach(r=>le(e.node(r))),e.edges().forEach(r=>{let t=e.edge(r);t.points.forEach(le),Object.hasOwn(t,"x")&&le(t)})}function le(e){let r=e.x;e.x=e.y,e.y=r}});var nr=R((ts,tr)=>{"use strict";var rr=G();tr.exports=gn;function gn(e){let r={},t=e.nodes().filter(d=>!e.children(d).length),n=t.map(d=>e.node(d).rank),i=rr.applyWithChunking(Math.max,n),a=rr.range(i+1).map(()=>[]);function s(d){let u=[d];for(;u.length>0;){let f=u.pop();if(r[f])continue;r[f]=!0;let c=e.node(f);a[c.rank].push(f);let N=e.successors(f);for(let C=N.length-1;C>=0;C--)u.push(N[C])}}return t.sort((d,u)=>e.node(d).rank-e.node(u).rank).forEach(s),a}});var sr=R((ns,ir)=>{"use strict";var En=G().zipObject;ir.exports=_n;function _n(e,r){let t=0;for(let n=1;nf)),i=r.flatMap(u=>e.outEdges(u).map(f=>({pos:n[f.w],weight:e.edge(f).weight})).sort((f,c)=>f.pos-c.pos)),a=1;for(;a{let f=u.pos+a;o[f]+=u.weight;let c=0;for(;f>0;)f%2&&(c+=o[f+1]),f=f-1>>1,o[f]+=u.weight;d+=u.weight*c}),d}});var or=R((is,ar)=>{ar.exports=xn;function xn(e,r=[]){return r.map(t=>{let n=e.inEdges(t);if(n.length){let i=n.reduce((a,s)=>{let o=e.edge(s),d=e.node(s.v);return{sum:a.sum+o.weight*d.order,weight:a.weight+o.weight}},{sum:0,weight:0});return{v:t,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:t}})}});var dr=R((ss,lr)=>{"use strict";var yn=G();lr.exports=On;function On(e,r){let t={};e.forEach((i,a)=>{let s=t[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:a};i.barycenter!==void 0&&(s.barycenter=i.barycenter,s.weight=i.weight)}),r.edges().forEach(i=>{let a=t[i.v],s=t[i.w];a!==void 0&&s!==void 0&&(s.indegree++,a.out.push(t[i.w]))});let n=Object.values(t).filter(i=>!i.indegree);return Nn(n)}function Nn(e){let r=[];function t(i){return a=>{a.merged||(a.barycenter===void 0||i.barycenter===void 0||a.barycenter>=i.barycenter)&&jn(i,a)}}function n(i){return a=>{a.in.push(i),--a.indegree===0&&e.push(a)}}for(;e.length;){let i=e.pop();r.push(i),i.in.reverse().forEach(t(i)),i.out.forEach(n(i))}return r.filter(i=>!i.merged).map(i=>yn.pick(i,["vs","i","barycenter","weight"]))}function jn(e,r){let t=0,n=0;e.weight&&(t+=e.barycenter*e.weight,n+=e.weight),r.weight&&(t+=r.barycenter*r.weight,n+=r.weight),e.vs=r.vs.concat(e.vs),e.barycenter=t/n,e.weight=n,e.i=Math.min(r.i,e.i),r.merged=!0}});var fr=R((as,hr)=>{var In=G();hr.exports=Cn;function Cn(e,r){let t=In.partition(e,f=>Object.hasOwn(f,"barycenter")),n=t.lhs,i=t.rhs.sort((f,c)=>c.i-f.i),a=[],s=0,o=0,d=0;n.sort(qn(!!r)),d=ur(a,i,d),n.forEach(f=>{d+=f.vs.length,a.push(f.vs),s+=f.barycenter*f.weight,o+=f.weight,d=ur(a,i,d)});let u={vs:a.flat(!0)};return o&&(u.barycenter=s/o,u.weight=o),u}function ur(e,r,t){let n;for(;r.length&&(n=r[r.length-1]).i<=t;)r.pop(),e.push(n.vs),t++;return t}function qn(e){return(r,t)=>r.barycentert.barycenter?1:e?t.i-r.i:r.i-t.i}});var br=R((os,pr)=>{var cr=or(),Ln=dr(),Tn=fr();pr.exports=Rn;function Rn(e,r,t,n){let i=[],a=[r];for(;a.length>0;){let o=a.pop();i.push(o);let d=e.children(o),u=e.node(o),f=u?u.borderLeft:void 0;f&&(d=d.filter(N=>N!==f&&N!==u.borderRight));let c=cr(e,d);for(let N=c.length-1;N>=0;N--)e.children(c[N].v).length&&a.push(c[N].v)}let s={};for(let o=i.length-1;o>=0;o--){let d=i[o],u=e.children(d),f=e.node(d),c=f?f.borderLeft:void 0,N=f?f.borderRight:void 0,C={};c&&(u=u.filter(D=>D!==c&&D!==N));let S=cr(e,u);S.forEach(D=>{if(e.children(D.v).length){let Y=s[D.v];C[D.v]=Y,Object.hasOwn(Y,"barycenter")&&Sn(D,Y)}});let M=Ln(S,t);Mn(M,C);let P=Tn(M,n);if(c&&(P.vs=[c,P.vs,N].flat(!0),e.predecessors(c).length)){let D=e.node(e.predecessors(c)[0]),Y=e.node(e.predecessors(N)[0]);Object.hasOwn(P,"barycenter")||(P.barycenter=0,P.weight=0),P.barycenter=(P.barycenter*P.weight+D.order+Y.order)/(P.weight+2),P.weight+=2}s[d]=P}return s[r]}function Mn(e,r){e.forEach(t=>{t.vs=t.vs.flatMap(n=>r[n]?r[n].vs:n)})}function Sn(e,r){e.barycenter!==void 0?(e.barycenter=(e.barycenter*e.weight+r.barycenter*r.weight)/(e.weight+r.weight),e.weight+=r.weight):(e.barycenter=r.barycenter,e.weight=r.weight)}});var mr=R((ls,vr)=>{var Pn=A().Graph,Fn=G();vr.exports=Gn;function Gn(e,r,t,n){n||(n=e.nodes());let i=Dn(e),a=new Pn({compound:!0}).setGraph({root:i}).setDefaultNodeLabel(s=>e.node(s));return n.forEach(s=>{let o=e.node(s),d=e.parent(s);(o.rank===r||o.minRank<=r&&r<=o.maxRank)&&(a.setNode(s),a.setParent(s,d||i),e[t](s).forEach(u=>{let f=u.v===s?u.w:u.v,c=a.edge(f,s),N=c!==void 0?c.weight:0;a.setEdge(f,s,{weight:e.edge(u).weight+N})}),Object.hasOwn(o,"minRank")&&a.setNode(s,{borderLeft:o.borderLeft[r],borderRight:o.borderRight[r]}))}),a}function Dn(e){for(var r;e.hasNode(r=Fn.uniqueId("_root")););return r}});var gr=R((ds,wr)=>{wr.exports=An;function An(e,r,t){let n={},i;t.forEach(a=>{let s=e.parent(a),o,d;for(;s;){if(o=e.parent(s),o?(d=n[o],n[o]=s):(d=i,i=s),d&&d!==s){r.setEdge(d,s);return}s=o}})}});var yr=R((us,xr)=>{"use strict";var Vn=nr(),Yn=sr(),Bn=br(),Wn=mr(),zn=gr(),Un=A().Graph,Z=G();xr.exports=kr;function kr(e,r={}){if(typeof r.customOrder=="function"){r.customOrder(e,kr);return}let t=Z.maxRank(e),n=Er(e,Z.range(1,t+1),"inEdges"),i=Er(e,Z.range(t-1,-1,-1),"outEdges"),a=Vn(e);if(_r(e,a),r.disableOptimalOrderHeuristic)return;let s=Number.POSITIVE_INFINITY,o,d=r.constraints||[];for(let u=0,f=0;f<4;++u,++f){Hn(u%2?n:i,u%4>=2,d),a=Z.buildLayerMatrix(e);let c=Yn(e,a);c{n.has(a)||n.set(a,[]),n.get(a).push(s)};for(let a of e.nodes()){let s=e.node(a);if(typeof s.rank=="number"&&i(s.rank,a),typeof s.minRank=="number"&&typeof s.maxRank=="number")for(let o=s.minRank;o<=s.maxRank;o++)o!==s.rank&&i(o,a)}return r.map(function(a){return Wn(e,a,t,n.get(a)||[])})}function Hn(e,r,t){let n=new Un;e.forEach(function(i){t.forEach(o=>n.setEdge(o.left,o.right));let a=i.graph().root,s=Bn(i,a,n,r);s.vs.forEach((o,d)=>i.node(o).order=d),zn(i,n,s.vs)})}function _r(e,r){Object.values(r).forEach(t=>t.forEach((n,i)=>e.node(n).order=i))}});var Mr=R((hs,Rr)=>{"use strict";var Xn=A().Graph,B=G();Rr.exports={positionX:Kn,findType1Conflicts:Or,findType2Conflicts:Nr,addConflict:de,hasConflict:jr,verticalAlignment:Ir,horizontalCompaction:Cr,alignCoordinates:Lr,findSmallestWidthAlignment:qr,balance:Tr};function Or(e,r){let t={};function n(i,a){let s=0,o=0,d=i.length,u=a[a.length-1];return a.forEach((f,c)=>{let N=Qn(e,f),C=N?e.node(N).order:d;(N||f===u)&&(a.slice(o,c+1).forEach(S=>{e.predecessors(S).forEach(M=>{let P=e.node(M),D=P.order;(D{f=a[c],e.node(f).dummy&&e.predecessors(f).forEach(N=>{let C=e.node(N);C.dummy&&(C.orderu)&&de(t,N,f)})})}function i(a,s){let o=-1,d,u=0;return s.forEach((f,c)=>{if(e.node(f).dummy==="border"){let N=e.predecessors(f);N.length&&(d=e.node(N[0]).order,n(s,u,c,o,d),u=c,o=d)}n(s,u,s.length,d,a.length)}),s}return r.length&&r.reduce(i),t}function Qn(e,r){if(e.node(r).dummy)return e.predecessors(r).find(t=>e.node(t).dummy)}function de(e,r,t){if(r>t){let i=r;r=t,t=i}let n=e[r];n||(e[r]=n={}),n[t]=!0}function jr(e,r,t){if(r>t){let n=r;r=t,t=n}return!!e[r]&&Object.hasOwn(e[r],t)}function Ir(e,r,t,n){let i={},a={},s={};return r.forEach(o=>{o.forEach((d,u)=>{i[d]=d,a[d]=d,s[d]=u})}),r.forEach(o=>{let d=-1;o.forEach(u=>{let f=n(u);if(f.length){f=f.sort((N,C)=>s[N]-s[C]);let c=(f.length-1)/2;for(let N=Math.floor(c),C=Math.ceil(c);N<=C;++N){let S=f[N];a[u]===u&&dMath.max(N,a[C.v]+s.edge(C)),0)}function f(c){let N=s.outEdges(c).reduce((S,M)=>Math.min(S,a[M.w]-s.edge(M)),Number.POSITIVE_INFINITY),C=e.node(c);N!==Number.POSITIVE_INFINITY&&C.borderType!==o&&(a[c]=Math.max(a[c],N))}return d(u,s.predecessors.bind(s)),d(f,s.successors.bind(s)),Object.keys(n).forEach(c=>a[c]=a[t[c]]),a}function Jn(e,r,t,n){let i=new Xn,a=e.graph(),s=Zn(a.nodesep,a.edgesep,n);return r.forEach(o=>{let d;o.forEach(u=>{let f=t[u];if(i.setNode(f),d){var c=t[d],N=i.edge(c,f);i.setEdge(c,f,Math.max(s(e,u,d),N||0))}d=u})}),i}function qr(e,r){return Object.values(r).reduce((t,n)=>{let i=Number.NEGATIVE_INFINITY,a=Number.POSITIVE_INFINITY;Object.entries(n).forEach(([o,d])=>{let u=$n(e,o)/2;i=Math.max(d+u,i),a=Math.min(d-u,a)});let s=i-a;return s{["l","r"].forEach(s=>{let o=a+s,d=e[o];if(d===r)return;let u=Object.values(d),f=n-B.applyWithChunking(Math.min,u);s!=="l"&&(f=i-B.applyWithChunking(Math.max,u)),f&&(e[o]=B.mapValues(d,c=>c+f))})})}function Tr(e,r){return B.mapValues(e.ul,(t,n)=>{if(r)return e[r.toLowerCase()][n];{let i=Object.values(e).map(a=>a[n]).sort((a,s)=>a-s);return(i[1]+i[2])/2}})}function Kn(e){let r=B.buildLayerMatrix(e),t=Object.assign(Or(e,r),Nr(e,r)),n={},i;["u","d"].forEach(s=>{i=s==="u"?r:Object.values(r).reverse(),["l","r"].forEach(o=>{o==="r"&&(i=i.map(c=>Object.values(c).reverse()));let d=(s==="u"?e.predecessors:e.successors).bind(e),u=Ir(e,i,t,d),f=Cr(e,i,u.root,u.align,o==="r");o==="r"&&(f=B.mapValues(f,c=>-c)),n[s+o]=f})});let a=qr(e,n);return Lr(n,a),Tr(n,e.graph().align)}function Zn(e,r,t){return(n,i,a)=>{let s=n.node(i),o=n.node(a),d=0,u;if(d+=s.width/2,Object.hasOwn(s,"labelpos"))switch(s.labelpos.toLowerCase()){case"l":u=-s.width/2;break;case"r":u=s.width/2;break}if(u&&(d+=t?u:-u),u=0,d+=(s.dummy?r:e)/2,d+=(o.dummy?r:e)/2,d+=o.width/2,Object.hasOwn(o,"labelpos"))switch(o.labelpos.toLowerCase()){case"l":u=o.width/2;break;case"r":u=-o.width/2;break}return u&&(d+=t?u:-u),u=0,d}}function $n(e,r){return e.node(r).width}});var Fr=R((fs,Pr)=>{"use strict";var Sr=G(),ei=Mr().positionX;Pr.exports=ri;function ri(e){e=Sr.asNonCompoundGraph(e),ti(e),Object.entries(ei(e)).forEach(([r,t])=>e.node(r).x=t)}function ti(e){let r=Sr.buildLayerMatrix(e),t=e.graph().ranksep,n=e.graph().rankalign,i=0;r.forEach(a=>{let s=a.reduce((o,d)=>{let u=e.node(d).height;return o>u?o:u},0);a.forEach(o=>{let d=e.node(o);n==="top"?d.y=i+d.height/2:n==="bottom"?d.y=i+s-d.height/2:d.y=i+s/2}),i+=s+t})}});var Wr=R((cs,Br)=>{"use strict";var Gr=je(),Dr=Ce(),ni=Be(),ii=G().normalizeRanks,si=ze(),ai=G().removeEmptyRanks,Ar=He(),oi=Je(),Vr=er(),li=yr(),di=Fr(),V=G(),ui=A().Graph;Br.exports=hi;function hi(e,r={}){let t=r.debugTiming?V.time:V.notime;return t("layout",()=>{let n=t(" buildLayoutGraph",()=>_i(e));return t(" runLayout",()=>fi(n,t,r)),t(" updateInputGraph",()=>ci(e,n)),n})}function fi(e,r,t){r(" makeSpaceForEdgeLabels",()=>ki(e)),r(" removeSelfEdges",()=>Li(e)),r(" acyclic",()=>Gr.run(e)),r(" nestingGraph.run",()=>Ar.run(e)),r(" rank",()=>ni(V.asNonCompoundGraph(e))),r(" injectEdgeLabelProxies",()=>xi(e)),r(" removeEmptyRanks",()=>ai(e)),r(" nestingGraph.cleanup",()=>Ar.cleanup(e)),r(" normalizeRanks",()=>ii(e)),r(" assignRankMinMax",()=>yi(e)),r(" removeEdgeLabelProxies",()=>Oi(e)),r(" normalize.run",()=>Dr.run(e)),r(" parentDummyChains",()=>si(e)),r(" addBorderSegments",()=>oi(e)),r(" order",()=>li(e,t)),r(" insertSelfEdges",()=>Ti(e)),r(" adjustCoordinateSystem",()=>Vr.adjust(e)),r(" position",()=>di(e)),r(" positionSelfEdges",()=>Ri(e)),r(" removeBorderNodes",()=>qi(e)),r(" normalize.undo",()=>Dr.undo(e)),r(" fixupEdgeLabelCoords",()=>Ii(e)),r(" undoCoordinateSystem",()=>Vr.undo(e)),r(" translateGraph",()=>Ni(e)),r(" assignNodeIntersects",()=>ji(e)),r(" reversePoints",()=>Ci(e)),r(" acyclic.undo",()=>Gr.undo(e))}function ci(e,r){e.nodes().forEach(t=>{let n=e.node(t),i=r.node(t);n&&(n.x=i.x,n.y=i.y,n.order=i.order,n.rank=i.rank,r.children(t).length&&(n.width=i.width,n.height=i.height))}),e.edges().forEach(t=>{let n=e.edge(t),i=r.edge(t);n.points=i.points,Object.hasOwn(i,"x")&&(n.x=i.x,n.y=i.y)}),e.graph().width=r.graph().width,e.graph().height=r.graph().height}var pi=["nodesep","edgesep","ranksep","marginx","marginy"],bi={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb",rankalign:"center"},vi=["acyclicer","ranker","rankdir","align","rankalign"],mi=["width","height","rank"],Yr={width:0,height:0},wi=["minlen","weight","width","height","labeloffset"],gi={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},Ei=["labelpos"];function _i(e){let r=new ui({multigraph:!0,compound:!0}),t=he(e.graph());return r.setGraph(Object.assign({},bi,ue(t,pi),V.pick(t,vi))),e.nodes().forEach(n=>{let i=he(e.node(n)),a=ue(i,mi);Object.keys(Yr).forEach(s=>{a[s]===void 0&&(a[s]=Yr[s])}),r.setNode(n,a),r.setParent(n,e.parent(n))}),e.edges().forEach(n=>{let i=he(e.edge(n));r.setEdge(n,Object.assign({},gi,ue(i,wi),V.pick(i,Ei)))}),r}function ki(e){let r=e.graph();r.ranksep/=2,e.edges().forEach(t=>{let n=e.edge(t);n.minlen*=2,n.labelpos.toLowerCase()!=="c"&&(r.rankdir==="TB"||r.rankdir==="BT"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function xi(e){e.edges().forEach(r=>{let t=e.edge(r);if(t.width&&t.height){let n=e.node(r.v),a={rank:(e.node(r.w).rank-n.rank)/2+n.rank,e:r};V.addDummyNode(e,"edge-proxy",a,"_ep")}})}function yi(e){let r=0;e.nodes().forEach(t=>{let n=e.node(t);n.borderTop&&(n.minRank=e.node(n.borderTop).rank,n.maxRank=e.node(n.borderBottom).rank,r=Math.max(r,n.maxRank))}),e.graph().maxRank=r}function Oi(e){e.nodes().forEach(r=>{let t=e.node(r);t.dummy==="edge-proxy"&&(e.edge(t.e).labelRank=t.rank,e.removeNode(r))})}function Ni(e){let r=Number.POSITIVE_INFINITY,t=0,n=Number.POSITIVE_INFINITY,i=0,a=e.graph(),s=a.marginx||0,o=a.marginy||0;function d(u){let f=u.x,c=u.y,N=u.width,C=u.height;r=Math.min(r,f-N/2),t=Math.max(t,f+N/2),n=Math.min(n,c-C/2),i=Math.max(i,c+C/2)}e.nodes().forEach(u=>d(e.node(u))),e.edges().forEach(u=>{let f=e.edge(u);Object.hasOwn(f,"x")&&d(f)}),r-=s,n-=o,e.nodes().forEach(u=>{let f=e.node(u);f.x-=r,f.y-=n}),e.edges().forEach(u=>{let f=e.edge(u);f.points.forEach(c=>{c.x-=r,c.y-=n}),Object.hasOwn(f,"x")&&(f.x-=r),Object.hasOwn(f,"y")&&(f.y-=n)}),a.width=t-r+s,a.height=i-n+o}function ji(e){e.edges().forEach(r=>{let t=e.edge(r),n=e.node(r.v),i=e.node(r.w),a,s;t.points?(a=t.points[0],s=t.points[t.points.length-1]):(t.points=[],a=i,s=n),t.points.unshift(V.intersectRect(n,a)),t.points.push(V.intersectRect(i,s))})}function Ii(e){e.edges().forEach(r=>{let t=e.edge(r);if(Object.hasOwn(t,"x"))switch((t.labelpos==="l"||t.labelpos==="r")&&(t.width-=t.labeloffset),t.labelpos){case"l":t.x-=t.width/2+t.labeloffset;break;case"r":t.x+=t.width/2+t.labeloffset;break}})}function Ci(e){e.edges().forEach(r=>{let t=e.edge(r);t.reversed&&t.points.reverse()})}function qi(e){e.nodes().forEach(r=>{if(e.children(r).length){let t=e.node(r),n=e.node(t.borderTop),i=e.node(t.borderBottom),a=e.node(t.borderLeft[t.borderLeft.length-1]),s=e.node(t.borderRight[t.borderRight.length-1]);t.width=Math.abs(s.x-a.x),t.height=Math.abs(i.y-n.y),t.x=a.x+t.width/2,t.y=n.y+t.height/2}}),e.nodes().forEach(r=>{e.node(r).dummy==="border"&&e.removeNode(r)})}function Li(e){e.edges().forEach(r=>{if(r.v===r.w){var t=e.node(r.v);t.selfEdges||(t.selfEdges=[]),t.selfEdges.push({e:r,label:e.edge(r)}),e.removeEdge(r)}})}function Ti(e){var r=V.buildLayerMatrix(e);r.forEach(t=>{var n=0;t.forEach((i,a)=>{var s=e.node(i);s.order=a+n,(s.selfEdges||[]).forEach(o=>{V.addDummyNode(e,"selfedge",{width:o.label.width,height:o.label.height,rank:s.rank,order:a+ ++n,e:o.e,label:o.label},"_se")}),delete s.selfEdges})})}function Ri(e){e.nodes().forEach(r=>{var t=e.node(r);if(t.dummy==="selfedge"){var n=e.node(t.e.v),i=n.x+n.width/2,a=n.y,s=t.x-i,o=n.height/2;e.setEdge(t.e,t.label),e.removeNode(r),t.label.points=[{x:i+2*s/3,y:a-o},{x:i+5*s/6,y:a-o},{x:i+s,y:a},{x:i+5*s/6,y:a+o},{x:i+2*s/3,y:a+o}],t.label.x=t.x,t.label.y=t.y}})}function ue(e,r){return V.mapValues(V.pick(e,r),Number)}function he(e){var r={};return e&&Object.entries(e).forEach(([t,n])=>{typeof t=="string"&&(t=t.toLowerCase()),r[t]=n}),r}});var Ur=R((ps,zr)=>{var Mi=G(),Si=A().Graph;zr.exports={debugOrdering:Pi};function Pi(e){let r=Mi.buildLayerMatrix(e),t=new Si({compound:!0,multigraph:!0}).setGraph({});return e.nodes().forEach(n=>{t.setNode(n,{label:n}),t.setParent(n,"layer"+e.node(n).rank)}),e.edges().forEach(n=>t.setEdge(n.v,n.w,{},n.name)),r.forEach((n,i)=>{let a="layer"+i;t.setNode(a,{rank:"same"}),n.reduce((s,o)=>(t.setEdge(s,o,{style:"invis"}),o))}),t}});var Xr=R((bs,Hr)=>{Hr.exports="2.0.5-pre"});var Fi=R((vs,Qr)=>{Qr.exports={graphlib:A(),layout:Wr(),debug:Ur(),util:{time:G().time,notime:G().notime},version:Xr()}});return Fi();})(); +/*! For license information please see dagre.min.js.LEGAL.txt */ +//# sourceMappingURL=dagre.min.js.map diff --git a/artifacts/package_runtime/tinygrad/viz/assets/unpkg.com/@highlightjs/cdn-assets@11.10.0/styles/tokyo-night-dark.min.css b/artifacts/package_runtime/tinygrad/viz/assets/unpkg.com/@highlightjs/cdn-assets@11.10.0/styles/tokyo-night-dark.min.css new file mode 100644 index 000000000..dc63ad9e7 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/assets/unpkg.com/@highlightjs/cdn-assets@11.10.0/styles/tokyo-night-dark.min.css @@ -0,0 +1,8 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: Tokyo-night-Dark + origin: https://github.com/enkia/tokyo-night-vscode-theme + Description: Original highlight.js style + Author: (c) Henri Vandersleyen + License: see project LICENSE + Touched: 2022 +*/.hljs-comment,.hljs-meta{color:#565f89}.hljs-deletion,.hljs-doctag,.hljs-regexp,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-tag,.hljs-template-tag,.hljs-variable.language_{color:#f7768e}.hljs-link,.hljs-literal,.hljs-number,.hljs-params,.hljs-template-variable,.hljs-type,.hljs-variable{color:#ff9e64}.hljs-attribute,.hljs-built_in{color:#e0af68}.hljs-keyword,.hljs-property,.hljs-subst,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#7dcfff}.hljs-selector-tag{color:#73daca}.hljs-addition,.hljs-bullet,.hljs-quote,.hljs-string,.hljs-symbol{color:#9ece6a}.hljs-code,.hljs-formula,.hljs-section{color:#7aa2f7}.hljs-attr,.hljs-char.escape_,.hljs-keyword,.hljs-name,.hljs-operator{color:#bb9af7}.hljs-punctuation{color:#c0caf5}.hljs{background:#1a1b26;color:#9aa5ce}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} \ No newline at end of file diff --git a/artifacts/package_runtime/tinygrad/viz/cli.py b/artifacts/package_runtime/tinygrad/viz/cli.py new file mode 100644 index 000000000..0e62ac451 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/cli.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python3 +import argparse, pathlib, signal, struct, json, os, itertools, heapq +os.environ["VIZ"] = "0" +if hasattr(signal, "SIGPIPE"): signal.signal(signal.SIGPIPE, signal.SIG_DFL) +from typing import Iterator +from tinygrad.viz import serve as viz +from tinygrad.viz.serve import fmt_colored +from tinygrad.uop.ops import RewriteTrace +from tinygrad.helpers import temp, ansistrip, colored, time_to_str, ansilen, ProfilePointEvent, ProfileRangeEvent, TracingKey, unwrap, NO_COLOR, DEBUG + +# profile decoder used in CLI and tests +def decode_profile(data:bytes) -> dict: + ret, off = data, 0 + def u(fmt:str) -> tuple: + nonlocal off + vals = struct.unpack_from(fmt, ret, off) + off += struct.calcsize(fmt) + return vals + total_dur, global_peak, index_len, layout_len = u(" int|None: return None if i == 0 else i-1 + for _ in range(layout_len): + klen = u(" str: + if isinstance(v, str): return f"{k} {v}" + if k == "FLOPS" or k.startswith("B/s"): return f"{v*1e-9:.0f} G{k}" if v < 1e13 else f"{v*1e-12:.0f} T{k}" + if k == "B": return next((f"{v/s:.0f} {u}" for s,u in ((1e9,"GB"),(1e6,"MB"),(1e3,"KB")) if v>=s), f"{v:.0f} B") + return f"{k}={v}" +def fmt_data(data:dict) -> str: return " ".join((p:=to_str(k, v))+" "*max(0, 14-ansilen(p)) for k,v in data.items()) + +def marker_st(markers:list[dict], name:str) -> int: + try: return next(e["ts"] for e in markers if e["name"] == name) + except StopIteration: raise RuntimeError(f"marker not found: {name}") from None + +def get(data:dict, key:str): + for k,v in data.items(): + if ansistrip(k) == key: return v + import difflib + match = difflib.get_close_matches(key, [ansistrip(k) for k in data], n=1, cutoff=0.6) + raise RuntimeError(f'item "{key}" not found in list'+(f", did you mean {match[0]!r}?" if match else '')) + +def fmt_top(k:dict) -> str: + return f"{fmt_colored(k['name'])}{' ' * max(0, 38-ansilen(k['name']))} {time_to_str(k['dur_ms']*1e-3, w=9)} {k['count']:7d} {k['pct']:6.2f}%"+\ + (" "*4+fmt_data(k['fmt']) if k['fmt'] else "") + +def fmt_all(k:dict) -> str: + if k["device"] in {"MARKER", "SOURCE"}: return f"--- {k['device']} {k['name']}"+(f"/{k['st_ms']:9.2f}ms" if k['st_ms'] else "") + ptm = colored(time_to_str(k["dur_ms"]*1e-3, w=9), "yellow" if k["dur_ms"] > 10 else None) + name = f"*** {k['device'][:7]:7s} "+k["name"]+" "*(46-ansilen(k["name"])) + return f"{name} tm {ptm}/{k['st_ms']:9.2f}ms"+(f" ({fmt_data(k['fmt'])})" if k["fmt"] else "") + +def main(args) -> None: + viz.load_rewrites(viz_data:=viz.VizData(viz.load_pickle(args.rewrites_path, default=RewriteTrace([], [], {})))) + + def emit(val, to_str=str) -> str: return json.dumps(val if isinstance(val, dict) else {"value":val}) if args.json else to_str(val) + + def print_step(step:dict, print_graph=False, reconstruct_matches=False) -> None: + data = viz.get_render(viz_data, step["query"], update_sink=False) + if isinstance(data.get("value"), Iterator): + for m in data["value"]: + if print_graph and "graph" in m and not args.json: + for k,v in m["graph"].items(): + print(f"[{k}] {' '.join((lines:=v['label'].splitlines())[:5])}{'...' if len(lines) > 5 else ''}"+(f" tag={v['tag']}" if v['tag'] else '')) + if v["src"]: + print(" src: "+", ".join([f"{i}->[{x}]" for i,x in v["src"]])) + elif "uop" in m: print(emit(m["graph"] if print_graph else m["uop"])) + if not reconstruct_matches: return None + if m.get("diff"): + loc = pathlib.Path(m["upat"][0][0]) + print(emit(f"{loc.parent.name}/{loc.name}:{m['upat'][0][1]}\n{m['upat'][1]}")) + for line in m["diff"]: print(emit(colored(line, "red" if line.startswith("-") else "green" if line.startswith("+") else None))) + if data.get("src") is not None: print(emit(data["src"])) + + profile_bytes = viz.get_profile(viz_data, viz.load_pickle(args.profile_path, default=[])) + if profile_bytes is None: raise RuntimeError(f"empty profile in {args.profile_path}") + profile = decode_profile(profile_bytes) + profile["layout"].update([(f'{c["name"][5:]}{" SQTT" if s["name"].endswith("PKTS") else ""} {s["name"]}', s["_data"]) for c in viz_data.ctxs + if c["name"].startswith("SQTT") for s in c["steps"] if s["name"].endswith(("PMC", "PKTS"))]) + if args.list and not args.src: return print("\n".join(emit(fmt_colored(k)) for k in ["ALL"]+list(profile["layout"]))) + + # ** SQTT printer + data = None if not args.src else get(profile["layout"], args.src[0]) + if args.src and "SQTT" in args.src[0]: + # modern terminals support 24-bit color + def hex_colored(st:str, color:str) -> str: return f"\x1b[38;2;{int(color[1:3],16)};{int(color[3:5],16)};{int(color[5:7],16)}m{st}\x1b[0m" + print(emit(f"{'Clk':<12} {'Unit':<20} {'Op':<22} {'Dur':<4} {'Delay':<4} {'Info'}")) + print(emit("-" * 100)) + pc_map:dict[int, str] = {} + pkt_idxs:dict[str, itertools.count] = {} + dispatch_to_inst:dict[str, tuple[str, int]] = {} + inst_st:int|None = None + for e in viz.sqtt_timeline(*unwrap(data)): + if isinstance(e, ProfilePointEvent) and e.key == 'pcMap': pc_map = e.arg + if not isinstance(e, ProfileRangeEvent): continue + if inst_st is None: inst_st = int(e.st) + assert isinstance(e.name, TracingKey) + op_name, ret, info = e.name.display_name, json.loads(e.name.ret[4:]) if e.name.ret else {}, "" + color = next((v for k,v in viz.wave_colors.items() if k in op_name), None) + op_str = hex_colored(op_name, color) if color and not NO_COLOR else op_name + inst, phase, delay = None, None, 0 + idx = next(pkt_idxs.setdefault(e.device, itertools.count())) + if e.device.startswith("WAVE"): + inst = f"0x{pc:05x} {pc_map[pc]}" if (pc:=ret.get("pc")) is not None else f"{'':7} {op_name}" + dispatch_to_inst[f"{e.device}-{idx}"] = (inst, int(e.st)) + phase = "DISPATCH" + if (link:=ret.get("link")) is not None: + inst, dispatch_st = dispatch_to_inst[link] + phase, delay = "EXEC", int(e.st) - dispatch_st + if inst and phase: info = f"{phase:<8} {inst}" + unit = e.device.replace(" ", "-") + row = {"clk":int(e.st)-inst_st, "cycle":int(e.st), "unit":unit, "op":op_name, "dur":int(unwrap(e.en)-e.st), "delay":delay or "", "info":info} + print(emit(row, lambda _: f"{row['clk']:<12} {unit:<20} {op_str}{' '*(22-ansilen(op_str))} {row['dur']:<4} {str(row['delay']):<4} {info}")) + + # ** PMC printer + elif args.src and "PMC" in args.src[0]: + pmc = viz.unpack_pmc(unwrap(data)) + pmc_fmt:list[str] = [] + for name,val,*detail in pmc["rows"]: + pmc_fmt += [f"{name} {val}"]+([" ".join(f"{k}={v}" for k,v in zip(detail[0]["cols"], r)) for r in detail[0]["rows"]] if detail else []) + print(emit(pmc, lambda _: "\n".join(pmc_fmt))) + + # ** Memory printer + elif data is not None and data["event_type"] == 1: + print(emit({"peak":data["peak"]}, lambda _: f"Peak: {data['peak']}"+"\n"+f"{'TS':<10} {'Event':<6} {'Key':>8} Info")) + for e in data["events"]: + info = str(arg:=e.pop("arg", {})) + if e["event"] == "free": info = ', '.join([f"{fmt_colored(k)} {['read','write','write+read'][m]}@data{n}" for _,k,n,m in arg["users"]]) + print(emit({**e, "info":info}, lambda _: f"{e['ts']:<10} {e['event']:<6} {e.get('key', ''):>8} {info}")) + + # ** Profiler printer + else: + timelines = [(n,l) for n,l in profile["layout"].items() if isinstance(l, dict) and l.get("event_type") == 0] + markers = profile.get("markers", []) + interval:tuple[int, int]|None = None + if (rng:=args.interval): interval = (marker_st(markers, rng[0]), marker_st(markers, rng[1]) if len(rng) > 1 else profile["dur"]) + def produce_top_kernels() -> Iterator[dict]: + tagged = ((n,e) for n,l in timelines for e in l["events"]) if not args.src else ((args.src[0],e) for e in unwrap(data)["events"]) + agg:dict[tuple[str,str], tuple[float, int, int|None, dict[str, float]]] = {} # map (device, kernel name) to (total time, count, ref, est) + est_keys = ("FLOPS", "B/s mem", "B/s lds") + total = 0 + for dev,e in tagged: + if interval and not interval[0] <= e["st"] <= interval[1]: continue + et = e["dur"] * 1e-3 + t, c, ref, est = agg.get((dev,e["name"]), (0.0, 0, None, {})) + est.update({k:est.get(k, 0.0)+e["fmt"][k]*e["dur"]*1e-6 for k in est_keys if k in e["fmt"]}) + agg[(dev,e["name"])] = (t+et, c+1, e["ref"], est) + total += et + items = sorted(agg.items(), key=lambda kv:kv[1][0], reverse=True) + num_rows = len(items) if args.t < 0 else args.t + for (dev,name),(t,c,ref,est) in items[:num_rows]: + display = f"{dev[:7]:7s} {fmt_colored(name)}" if not args.src else fmt_colored(name) + yield {"name":display, "dur_ms":t, "count":c, "pct":t/total*100.0, "ref":ref, "fmt":{k:int(est[k]/(t*1e-3)) for k in est_keys if k in est}} + if num_rows > 0 and items[num_rows:]: + other_t = sum(t for _,(t,_,_,_) in items[num_rows:]) + other_c = sum(c for _,(_,c,_,_) in items[num_rows:]) + yield {"name":"Other", "dur_ms":other_t, "count":other_c, "pct":other_t/total*100.0, "ref":None, "fmt":None} + def produce_all_kernels() -> Iterator[dict]: + event_streams = [[(e["st"], n, e) for e in l["events"]] for n,l in timelines] if not args.src \ + else [[(e["st"], args.src[0], e) for e in unwrap(data)["events"]]] + if not args.src: + for n,l in profile["layout"].items(): + if not isinstance(l, dict) or l.get("event_type") != 0: yield {"device":"SOURCE", "name":n, "st_ms":0, "ref":None, "ext":None} + marker_stream = sorted([(m["ts"], "MARKER", m) for m in markers], key=lambda t:t[0]) + for ts,dev,e in heapq.merge(*event_streams, marker_stream, key=lambda t:t[0]): + if interval is not None and not interval[0] <= ts <= interval[1]: continue + if dev == "MARKER": + yield {"device":dev, "name":fmt_colored(e["name"]), "st_ms":ts*1e-3, "ref":None, "ext":None} + continue + ext, fmt = [], e["fmt"] + if (tb:=fmt.pop("tb", [])): + while tb: + file, lineno, fxn, code = tb.pop() + line = f"{file.split('/')[-1]}:{lineno} {fxn}" + if fmt: ext.append(f"{line} {code}") + elif not file.startswith("<") and not fxn.startswith("<"): fmt["loc"] = line + yield {"device":dev, "name":fmt_colored(e["name"]), "dur_ms":e["dur"]*1e-3, "st_ms":e["st"]*1e-3, "fmt":fmt, "ref":e["ref"], + "ext":"\n".join(ext)} + fmt_row = fmt_top if args.t else fmt_all + seen_refs:set[int] = set() + def render_event(k:dict, ls=args.list) -> None: + if len(args.src) > 1 and ansistrip(k["name"]) not in args.src: return None + print(emit(k, to_str=fmt_row)) + if k["ref"] is not None and k["ref"] not in seen_refs: + seen_refs.add(k["ref"]) + for i,s in enumerate(viz_data.ctxs[k["ref"]]["steps"]): + if DEBUG >= 3 and s["name"] == "View Base AST": print_step(s) + if DEBUG >= 4 and s["name"] == "View Source": print_step(s) + if DEBUG >= 5 or ls: print(emit(" "*s["depth"]+s["name"]+(f" - {s['match_count']}" if s.get('match_count', 0) else ''))) + if DEBUG >= 6 or (DEBUG >= 5 and s["name"] == "View Kernel Graph") or (s["name"] in args.src): + print_step(s, print_graph=True, reconstruct_matches=s["name"] in args.src) + if DEBUG >= 7: print_step(s, reconstruct_matches=True) + elif DEBUG >= 3 and k.get("ext"): print(emit(k["ext"])) + for k in (produce_top_kernels if args.t else produce_all_kernels)(): render_event(k) + +def get_arg_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(prog="python -m tinygrad.viz.cli") + parser.add_argument("-s", "--src", nargs="+", default=[], metavar="NAME", help="Select a data source (default: all)") + parser.add_argument("--list", "--ls", dest="list", action="store_true", help="List sources") + parser.add_argument("--interval", nargs="+", metavar=("START", "END"), help="Optional start and end marker") + parser.add_argument("-t", nargs="?", type=int, const=20, metavar="COUNT", help="Aggregate top kernels (optional count, default 20)") + parser.add_argument("--profile-path", type=str, metavar="PATH", help="Optional path to profile.pkl (default: latest profile)", + default=temp("profile.pkl", append_user=True)) + parser.add_argument("--rewrites-path", type=str, metavar="PATH", help="Optional path to rewrites.pkl (default: latest rewrites)", + default=temp("rewrites.pkl", append_user=True)) + parser.add_argument("--json", action="store_true", help="Emit profiler output as JSON") + return parser + +if __name__ == "__main__": + try: main(get_arg_parser().parse_args()) + except KeyboardInterrupt: pass diff --git a/artifacts/package_runtime/tinygrad/viz/index.html b/artifacts/package_runtime/tinygrad/viz/index.html new file mode 100644 index 000000000..ea208358d --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/index.html @@ -0,0 +1,454 @@ + + + + tinygrad viz + + + + + + + + + + + + + +
+
+ + +
+
+
+
+
+ + + + + + + + + + + + +
+
+ +
+
+ + + diff --git a/artifacts/package_runtime/tinygrad/viz/js/index.js b/artifacts/package_runtime/tinygrad/viz/js/index.js new file mode 100644 index 000000000..8ea2ef384 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/js/index.js @@ -0,0 +1,1222 @@ +// ** graph helpers + +const displaySelection = (sel) => { + for (const e of document.getElementsByClassName("view")) e.style.display = e.matches(sel) ? "flex" : "none"; +} +const metadata = document.querySelector(".metadata"); + +const darkenHex = (h, p = 0) => + `#${( + c = parseInt(h.slice(1), 16), + f = 1 - p / 100, + ((c >> 16 & 255) * f | 0) << 16 | + ((c >> 8 & 255) * f | 0) << 8 | + ((c & 255) * f | 0) + ).toString(16).padStart(6, '0')}`; + +const ANSI_COLORS = ["#b3b3b3", "#ff6666", "#66b366", "#ffff66", "#6666ff", "#ff66ff", "#66ffff", "#ffffff"]; +const ANSI_COLORS_LIGHT = ["#d9d9d9","#ff9999","#99cc99","#ffff99","#9999ff","#ff99ff","#ccffff","#ffffff"]; +const parseColors = (name, defaultColor="#ffffff") => Array.from(name.matchAll(/(?:\u001b\[(\d+)m([\s\S]*?)\u001b\[0m)|([^\u001b]+)/g), + ([_, code, colored_st, st]) => ({ st: colored_st ?? st, color: code != null ? (code>=90 ? ANSI_COLORS_LIGHT : ANSI_COLORS)[(parseInt(code)-30+60)%60] : defaultColor })); + +const colored = n => d3.create("span").call(s => s.selectAll("span").data(typeof n === "string" ? parseColors(n) : n).join("span") + .style("color", d => d.color).text(d => d.st)).node(); + +const rect = (s) => (typeof s === "string" ? document.querySelector(s) : s).getBoundingClientRect(); +const viewBounds = () => [rect(".ctx-list-parent").right, rect(".metadata-parent").left]; + +// dims of shapes on the canvas aren't tracked by the browser, we compute it +const canvasRect = (s, pixelScale) => { + const { e } = selectShape(s), t = data.tracks.get(s.split("-")[0]); + const x = pixelScale(e.x), w = pixelScale(e.x+e.width)-x, y = t.offsetY+e.y; + return {x0:x, x1:x+w, y0:y, y1:y+e.height}; +}; + +let timeout = null; +const Status = {STARTED:0, COMPLETE:1, ERR:2} +const updateProgress = (st, msg) => { + clearTimeout(timeout); + const msgEl = d3.select("#progress-message").style("display", "none"); + const customEl = d3.select("#custom").style("display", "none"); + if (st === Status.STARTED) { + msgEl.text(msg); + timeout = setTimeout(() => msgEl.style("display", "block"), 2000); + } else if (st === Status.ERR) { + displaySelection("#custom"); + customEl.html("").append("div").classed("raw-text", true).append(() => codeBlock(msg)); + } +} + +function intersectRect(r1, r2) { + const dx = r2.x-r1.x; + const dy = r2.y-r1.y; + if (dx === 0 && dy === 0) throw new Error("Invalid node coordinates, rects must not overlap"); + const scaleX = dx !== 0 ? (r1.width/2)/Math.abs(dx) : Infinity; + const scaleY = dy !== 0 ? (r1.height/2)/Math.abs(dy) : Infinity; + const scale = Math.min(scaleX, scaleY); + return {x:r1.x+dx*scale, y:r1.y+dy*scale}; +} + +function addTags(root, path) { + root.selectAll("circle").data(d => d.rect ? [] : [d]).join("circle").attr("r", 5).style("fill", d => d.fill ?? null).style("stroke", d => d.stroke ?? null); + root.selectAll("rect").data(d => d.rect ? [d] : []).join("rect").attr("x", d => -d.width/2).attr("y", d => -d.height/2) + .attr("width", d => d.width).attr("height", d => d.height).style("fill", d => d.fill ?? null).style("stroke", d => d.stroke ?? null); + if (path != null) root.selectAll("path").data(d => [d]).join("path").attr("d", path); + else root.selectAll("text").data(d => [d]).join("text").text(d => d.text).attr("dy", "0.35em"); +} + +anchor = null; +const drawGraph = (data) => { + const g = dagre.graphlib.json.read(data); + // draw nodes + d3.select("#graph-svg").on("click", () => d3.selectAll(".highlight").classed("highlight", false)); + const callCount = g.graph().callCount; + const nodes = d3.select("#nodes").selectAll("g").data(g.nodes().map(id => g.node(id)), d => d).join("g").attr("class", d => d.className ?? "node") + .attr("transform", d => `translate(${d.x},${d.y})`).on("click", (e,d) => { + const parents = g.predecessors(d.id); + const children = g.successors(d.id); + if (parents == null && children == null) return; + const src = [...parents, ...children, d.id]; + nodes.classed("highlight", n => src.includes(n.id)).classed("child", n => children.includes(n.id)); + if (!e.target.classList.contains("token")) labels.selectAll("rect.bg").classed("highlight", false); + const matchEdge = (v, w) => (v===d.id && children.includes(w)) ? "highlight child " : (parents.includes(v) && w===d.id) ? "highlight " : ""; + d3.select("#edges").selectAll("path.edgePath").attr("class", e => matchEdge(e.v, e.w)+"edgePath"); + d3.select("#edge-labels").selectAll("g.port").attr("class", (_, i, n) => matchEdge(...n[i].id.split("-"))+"port"); + e.stopPropagation(); + }); + nodes.selectAll("rect").data(d => [d]).join("rect").attr("width", d => d.width).attr("height", d => d.height).attr("fill", d => d.color) + .attr("x", d => -d.width/2).attr("y", d => -d.height/2).classed("node", true); + const STROKE_WIDTH = 1.4, textSpace = g.graph().textSpace; + const labels = nodes.selectAll("g.label").data(d => [d]).join("g").attr("class", "label"); + labels.attr("transform", d => `translate(${d.labelX-d.labelWidth/2}, -${d.labelHeight/2+STROKE_WIDTH*2})`); + const rectGroup = labels.selectAll("g.rect-group").data(d => [d]).join("g").attr("class", "rect-group"); + const tokens = labels.selectAll("g.text-group").data(d => [d]).join("g").attr("class", "text-group").selectAll("text").data(d => { + if (Array.isArray(d.label)) return [d.label]; + const ret = [[]]; + for (const s of parseColors(d.label, defaultColor="initial")) { + const color = darkenHex(s.color, 25); + const lines = s.st.split("\n"); + ret.at(-1).push({ st:lines[0], color }); + for (let i=1; i d).join("tspan").attr("x", "0").attr("dy", g.graph().lh) + .selectAll("tspan").data(d => d).join("tspan").attr("dx", (d, i) => i > 0 && d.st !== "," ? textSpace: 0).text(d => d.st).classed("token", true) + .attr("xml:space", "preserve").attr("fill", d => d.color); + const tokensBg = rectGroup.selectAll("rect.bg").data((d, i, nodes) => { + const ret = []; + d3.select(nodes[i].parentElement).select("g.text-group").selectAll("tspan.token").each((d, i, nodes) => { + if (!d.keys?.length) return; + const b = nodes[i].getBBox(); ret.push({ keys:d.keys, x:b.x, y:b.y, width:b.width, height:b.height }); + }); + return ret; + }).join("rect").attr("class", "bg").attr("x", d => d.x).attr("y", d => d.y).attr("width", d => d.width).attr("height", d => d.height); + tokens.on("click", (e, { keys }) => { + tokensBg.classed("highlight", (d, i, nodes) => !nodes[i].classList.contains("highlight") && d.keys.some(k => keys?.includes(k))); + }); + addTags(nodes.selectAll("g.tag").data(d => d.tag != null ? [d] : []).join("g").attr("class", "tag") + .attr("transform", d => `translate(${-d.width/2+8}, ${-d.height/2+8})`).datum(e => ({ text:e.tag }))); + addTags(nodes.selectAll("g.addrspace").data(d => d.addrspace != null ? [d] : []).join("g").attr("class", "tag addrspace") + .attr("transform", d => `translate(${d.width/2-8}, ${-d.height/2+8})`).datum(e => ({ rect:true, width:10, height:10, fill:e.addrspace, stroke:"none" }))); + const CALL_TAG_WIDTH = 14; + addTags(nodes.selectAll("g.type").data(d => d.collapsible ? [d] : []).join("g").attr("class", d => `tag clickable ${d.collapsed ? 'collapsed' : 'expanded'}`) + .attr("transform", d => d.collapsePorts != null ? `translate(${CALL_TAG_WIDTH/2-d.width/2}, ${0})` : `translate(${-d.width/2}, ${0})`) + .datum(d => ({ ...d, text:d.collapsed ? "+" : "−", fill:d.collapsePorts != null ? null : d.color, + ...(d.collapsePorts != null && { rect:true, width:CALL_TAG_WIDTH }) })).on("click", (e,d) => { + e.stopPropagation(); + const t = d3.zoomTransform(document.getElementById("graph-svg")); + const [x, y] = t.apply([d.x, d.y]); + anchor = {id:d.id, x, y, k:t.k}; + if (d.callNode) { + if (state.callSrcMask.has(d.id)) state.callSrcMask.delete(d.id); else state.callSrcMask.add(d.id); + if (state.callSrcMask.size >= callCount) { showCallSrc.toggle.checked = !showCallSrc.toggle.checked; state.callSrcMask.clear(); } + } else { if (state.expandedNodes.has(d.id)) state.expandedNodes.delete(d.id); else state.expandedNodes.add(d.id); } + return setState({}); + })); + addTags(nodes.selectAll("g.ref").data(d => d.ref != null ? [d] : []).join("g").attr("class", "tag ref") + .attr("transform", d => `translate(${d.width/2-2}, ${-d.height/2+2})`).on("click", (e,d) => { e.stopPropagation(); switchCtx(d.ref); }).datum(d => ({ref:d.ref})), + "M-1.7 1.7 L1.7 -1.7 M-0.55 -1.7 H1.7 V0.55"); + // draw edges + const line = d3.line().x(d => d.x).y(d => d.y).curve(d3.curveBasis), edges = g.edges(); + d3.select("#edges").selectAll("path.edgePath").data(edges).join("path").attr("class", "edgePath").attr("d", (e) => { + const edge = g.edge(e); + const points = edge.points.slice(1, edge.points.length-1); + points.unshift(intersectRect(g.node(e.v), points[0])); + points.push(intersectRect(g.node(e.w), points[points.length-1])); + return line(points); + }).attr("marker-end", "url(#arrowhead)").attr("stroke", e => g.edge(e).color || "#4a4b57"); + return g; +} + +// ** UOp graph + +let workerUrl = null, worker = null; +async function initWorker() { + const resp = await Promise.all(["/assets/dagrejs.github.io/project/dagre/latest/dagre.min.js","/js/worker.js"].map(u => fetch(u))); + workerUrl = URL.createObjectURL(new Blob([(await Promise.all(resp.map((r) => r.text()))).join("\n")], { type: "application/javascript" })); +} + +function renderDag(layoutSpec, { recenter }) { + // start calculating the new layout (non-blocking) + updateProgress(Status.STARTED, "Rendering new graph..."); + if (worker != null) worker.terminate(); + worker = new Worker(workerUrl); + worker.postMessage(layoutSpec); + worker.onmessage = (e) => { + if (e.data.error) { + updateProgress(Status.ERR, "Error in graph layout:\n"+e.data.error); + return; + } + const data = e.data.result; + displaySelection("#graph"); + updateProgress(Status.COMPLETE); + const g = drawGraph(data); + addTags(d3.select("#edge-labels").selectAll("g").data(data.edges).join("g").attr("transform", (e) => { + // get a point near the end + const [p1, p2] = e.value.points.slice(-2); + const dx = p2.x-p1.x; + const dy = p2.y-p1.y; + // normalize to the unit vector + const len = Math.sqrt(dx*dx + dy*dy); + const ux = dx / len; + const uy = dy / len; + // avoid overlap with the arrowhead + const offset = 17; + const x = p2.x - ux * offset; + const y = p2.y - uy * offset; + return `translate(${x}, ${y})` + }).attr("class", e => e.value.label.type).attr("id", e => `${e.v}-${e.w}`).datum(e => ({ text:e.value.label.text }))); + if (anchor != null) { + const n = g.node(anchor.id); + if (n != null) d3.select("#graph-svg").call(svgZoom.transform, d3.zoomIdentity.translate(anchor.x-n.x*anchor.k, anchor.y-n.y*anchor.k).scale(anchor.k)); + } else if (recenter) document.getElementById("zoom-to-fit-btn").click(); + anchor = null; + }; + worker.onerror = (e) => { + e.preventDefault(); + updateProgress(Status.ERR, "Error in graph layout:\n"+e.message); + } +} + +// ** profiler graph + +function formatMicroseconds(ts, showUs=true) { + const s = Math.floor(ts / 1e6), ms = Math.floor((ts % 1e6) / 1e3), us = Math.round(ts % 1e3); + const parts = []; + if (s) parts.push(`${s}s`); + if (ms || (!showUs && !s)) parts.push(`${ms}ms`); + if (showUs && (us || (!ms && !s))) parts.push(`${us}us`); + return parts.join(' '); +} + +function formatCycles(cycles) { + const M = Math.floor(cycles / 1e6), K = Math.floor((cycles % 1e6) / 1e3), s = Math.round(cycles % 1e3); + const parts = []; + if (M) parts.push(`${M}M`); + if (K) parts.push(`${K}K`); + if (s || (!M && !K)) parts.push(`${s}`); + return parts.join(" "); +} + +const formatUnit = (d, unit="") => d3.format(".3~s")(d)+unit; +const skipFmt = new Set(["tb", "pc", "link"]); +const formatData = (fmt) => Object.entries(fmt ?? {}).filter(([k]) => !skipFmt.has(k)).map(([k, v]) => typeof(v) === "string" ? `${k} ${v}` : formatUnit(v, k)); + +const waveColor = (op) => { + let ret = data.waveColors.find(([pattern]) => op.includes(pattern))?.[1] ?? "#ffffff"; + if (op.includes("OTHER_") || op.includes("_ALT")) { ret = darkenHex(ret, 75) } + if (op.includes("LDS_")) { ret = darkenHex(ret, 25) } + return ret +}; +const colorScheme = {TINY:new Map([["Schedule","#1b5745"],["precompile","#1d2e62"],["compile","#63b0cd"],["DEFAULT","#354f52"]]), + DEFAULT:["#2b2e39", "#2c2f3a", "#31343f", "#323544", "#2d303a", "#2e313c", "#343746", "#353847", "#3c4050", "#404459", "#444862", "#4a4e65"], + BUFFER:["#342483", "#3E2E94", "#4938A4", "#5442B4", "#5E4CC2", "#674FCA"], SIMD:new Map([["OCC", "#101725"], ["INST", "#0A2042"]]), + GPC:new Map([["NONE","#1a7a2e"],["MEMORY_DEPENDENCY","#8b1a00"],["EXEC_DEPENDENCY","#006b6b"],["INST_FETCH","#7a7a00"],["SYNC","#6b006b"], + ["PIPE_BUSY","#7a4a00"],["MEMORY_THROTTLE","#5c0000"],["CONSTANT_MEMORY","#1a3d7a"],["NOT_SELECTED","#2e2e3a"],["OTHER","#4a4a55"], + ["SLEEPING","#1a1a2a"],["DEFAULT","#3a3a45"]]), WAVE:waveColor, VMEMEXEC:waveColor, ALUEXEC:waveColor} +const cycleColors = (lst, i) => lst[i%lst.length]; + +const rescaleTrack = (source, tid, k) => { + for (const shapes of source.views) + for (const e of shapes) { + for (let i=0; i { + ctx.beginPath(); + ctx.moveTo(x[0], y[0]); + ctx.lineTo(x[1], y[1]); + ctx.fillStyle = ctx.strokeStyle = opts?.color || "#f0f0f5"; + ctx.stroke(); +} + +function tabulate(rows) { + const root = d3.create("div").style("display", "grid").style("grid-template-columns", `${Math.max(...rows.map(x => x[0].length), 0)}ch 1fr`).style("gap", "0.2em").style("white-space", "nowrap"); + for (const [k,v] of rows) { root.append("div").text(k); root.append("div").node().append(v); } + return root.node(); +} + +var data, focusedDevice, focusedShape, formatTime, canvasZoom, zoomLevel = d3.zoomIdentity; + +const canvasDims = () => { + const sideRect = rect("#device-list"); + return [Math.round(document.querySelector("#profiler").clientWidth-sideRect.width), Math.round(sideRect.height)]; +} + +function selectShape(key) { + if (key == null) return {}; + const [t, idx] = key.split("-"); + const track = data.tracks.get(t); + return { eventType:track?.eventType, e:track?.shapes[idx] }; +} + +// scaling function for time to pixels +const timelineScale = () => d3.scaleLinear().domain([data.first, data.dur]).range([0, canvasDims()[0]]); + +function timeAtCycle(clk) { + if (clk < data.instSt || clk > data.instEt || data.tracks.get("Shader Clock") == null) return "-"; + let cur = data.instSt, ns = 0, freq = null; + // walk through all frequency changes and accumulate time in nanoseconds + for (const [s, v] of data.tracks.get("Shader Clock").valueMap) { + if (freq != null && freq > 0 && cur < s) { + const et = Math.min(clk, s); + ns += (et - cur) * 1e9 / freq; + cur = et; + if (cur === clk) break; + } + freq = v; + } + // ending cycles use the last known frequency + if (cur < clk) ns += (clk - cur) * 1e9 / freq; + const remNs = Math.round(ns % 1000); + return ns/1000>1 ? formatMicroseconds(ns / 1000, true) + (remNs ? ` ${remNs}ns` : "") : Math.round(ns)+"ns"; +} + +function getZoomIdentity() { + const xscale = timelineScale(), deviceRight = rect("#device-list").right, [viewLeft, sidebarLeft] = viewBounds(); + const viewRight = sidebarLeft || rect(".main-container").right; + const x0 = Math.max(0, viewLeft-deviceRight), x1 = Math.min(canvasDims()[0], viewRight-deviceRight); + // for packets, set zoom to the full range of instruction events + const [st, et] = data.instSt != null ? [data.instSt, data.instEt] : [data.first, data.dur]; + const k = (x1-x0)/(xscale(et)-xscale(st)); + return d3.zoomIdentity.translate(x0-xscale(st)*k, 0).scale(k); +} + +const Modes = {0:'read', 1:'write', 2:'write+read'}; + +function setFocus(key) { + if (key !== focusedShape) { + saveToHistory({ shape:focusedShape }); + // adjust zoom if the entire shape is off screen + const { eventType, e } = selectShape(key); + if (e != null) { + const xscale = timelineScale(); + const [x0, x1] = eventType === EventTypes.EXEC ? [e.x, e.x+e.width] : [e.x[0], e.x.at(-1)]; + const [st, et] = xscale.range().map(zoomLevel.invertX, zoomLevel).map(xscale.invert, xscale); + if (x1 < st || x0 > et) zoomLevel = d3.zoomIdentity.translate(-xscale((x0+x1)/2-(et-st)/2)*zoomLevel.k, 0).scale(zoomLevel.k); + } + const link = e?.arg.link ?? data.links.get(key); + data.link = link == null ? null : [key, link]; + focusedShape = key; d3.select("#timeline").call(canvasZoom.transform, zoomLevel); + const tooltip = document.getElementById("tooltip"); + if (tooltip.dataset.key !== key) tooltip.style.display = "none"; + } + const { eventType, e } = selectShape(key); + if (metadata.querySelector(".info") == null) d3.select(metadata).html("").append("div").classed("info", true); + const html = d3.select(".info").html(""); + if (eventType === EventTypes.EXEC) { + const [n, _, ...rest] = e.arg.tooltipText.split("\n"); + const tableData = [["Name", colored(e.arg.label)], ["Duration", formatTime(e.width)]]; + if (data.instSt != null) { + const p = d3.create("p"); + p.append("span").text(timeAtCycle(e.x)); + p.append("span").style("margin-left", "8px").style("color", "#f0f0f566").text(formatTime(e.x)); + tableData.push(["Cycle", formatTime(e.x-data.instSt)], ["Time", p.node()]); + } else tableData.push(["Start Time", formatTime(e.x)]); + if (data.link != null) tableData.push(["Delay", `${formatTime(Math.abs(selectShape(data.link[0]).e.x - selectShape(data.link[1]).e.x))} Cycles`]); + html.append(() => tabulate(tableData)); + let group = html.append("div").classed("args", true); + for (const r of rest) group.append("p").text(r); + group = html.append("div").classed("args", true); + for (const b of e.arg.bufs.sort((a, b) => a.num - b.num)) { + group.append("p").text(`${Modes[b.mode]}@data${b.num} ${formatUnit(b.nbytes, 'B')}`).style("cursor", "pointer").on("click", () => { + const row = document.getElementById(b.k); if (!isExpanded(row)) { row.click(); } + setFocus(b.key); + }); + } + if (e.arg.ctx != null) { + const i = e.arg.ctx; s = e.arg.step; + html.append("a").text(ctxs[i+1].steps[s].name).on("click", () => switchCtx(i, s)); + const prgSrc = ctxs[i+1].steps.findIndex(s => s.name === "View Source"); + if (prgSrc !== -1) html.append("a").text("View Source").on("click", () => switchCtx(i, prgSrc)); + } + if (e.arg.trace != null) html.append(() => traceBlock(e.arg.trace.slice(1).reverse())); + } + if (eventType === EventTypes.BUF) { + const [dtype, sz, nbytes, dur] = e.arg.tooltipText.split("\n"); + const rows = [["DType", dtype], ["Len", sz], ["Size", nbytes], ["Lifetime", dur]]; + if (e.arg.users != null) rows.push(["Users", e.arg.users.length]); + html.append(() => tabulate(rows)); + const kernels = html.append("div").classed("args", true); + for (let u=0; u colored(`[${u}] ${repr} ${Modes[mode]}@data${num}`)); + const shapeInfo = selectShape(shape).e?.arg?.tooltipText?.split("\n"); + if (shapeInfo?.length > 5) p.append("span").text(" "+shapeInfo[5]); + if (shape != null) p.style("cursor", "pointer").on("click", () => setFocus(shape)); + } + } + // instructions list renderer + let instList = document.getElementById("insts"); + if (data.pcMap == null) return d3.select(instList?.parentElement).html(""); + if (instList == null) { + let contents = ""; + for (let [pc, label] of Object.entries(data.pcMap)) { + pc = parseInt(pc); + const pcHex = pc.toString(16); + contents += `
${"0x"+pcHex.padStart(Math.max(4, Math.ceil(pcHex.length/4)*4), 0)}${label}
`; + } + instList = d3.create("pre").append("code").classed("hljs", true).style("margin-top", "20px").attr("id", "insts").html(contents).node(); + metadata.insertBefore(instList.parentElement, html.node()); + } + d3.select(instList).selectAll("span").classed("highlight", false); + let instLine = document.getElementById(`inst-${e?.arg.pc}`); + if (instLine == null && data.link != null) instLine = document.getElementById(`inst-${selectShape(data.link[1]).e.arg.pc}`); + if (instLine != null) { + instLine.classList.add("highlight"); + const r = rect(instLine), c = rect(instList); + if (Math.max(c.top-r.bottom, r.top-c.bottom)>=-30) instList.scrollTop = instLine.offsetTop-instList.clientHeight/2+instLine.clientHeight/2; + } +} + +const EventTypes = { EXEC:0, BUF:1 }; + +async function renderProfiler(path, opts) { + displaySelection("#profiler"); + // support non realtime x axis units + formatTime = opts.unit === "ms" ? formatMicroseconds : formatCycles; + if (data?.path !== path) { data = {tracks:new Map(), axes:{}, path, first:null, links:new Map()}; focusedDevice = null; focusedShape = null; } + setFocus(focusedShape); + // layout once! + if (data.tracks.size !== 0) return updateProgress(Status.COMPLETE); + const profiler = d3.select("#profiler").html(""); + const buf = cache[path] ?? await fetchValue(path); + const view = new DataView(buf); + let offset = 0; + const u8 = () => { const ret = view.getUint8(offset); offset += 1; return ret; } + const u32 = () => { const ret = view.getUint32(offset, true); offset += 4; return ret; } + const u64 = () => { const ret = new Number(view.getBigUint64(offset, true)); offset += 8; return ret; } + const f32 = () => { const ret = view.getFloat32(offset, true); offset += 4; return ret; } + const optional = (i) => i === 0 ? null : i-1; + const dur = u32(), tracePeak = u64(), indexLen = u32(), layoutsLen = u32(); data.dur = dur; + const textDecoder = new TextDecoder("utf-8"); + const { strings, dtypeSize, markers, ...extData } = JSON.parse(textDecoder.decode(new Uint8Array(buf, offset, indexLen))); offset += indexLen; + for (const [k,v] of Object.entries(extData)) data[k] = v; + // place devices on the y axis and set vertical positions + const [tickSize, padding, baseOffset] = [5, 8, markers.length ? 14 : 0]; + const secondaryTick = opts.unit == "clk" ? timeAtCycle : null; + const axisHeight = secondaryTick != null ? tickSize*2+(padding*2) : tickSize; + const deviceList = profiler.append("div").attr("id", "device-list").style("padding-top", axisHeight+padding+baseOffset+"px"); + const canvas = profiler.append("canvas").attr("id", "timeline").node(); + // NOTE: scrolling via mouse can only zoom the graph + canvas.addEventListener("wheel", e => (e.stopPropagation(), e.preventDefault()), { passive:false }); + const ctx = canvas.getContext("2d"); + const canvasTop = rect(canvas).top; + // map event name to shape and label colors + const colorMap = new Map(), coloredNames = new Map(); + // map shapes by event key + const shapeMap = new Map(); + const heightScale = d3.scaleLinear().domain([0, tracePeak]).range([4,maxheight=100]); + for (let i=0; i e.st >= levelEt); + const et = e.st+Math.trunc(e.dur); + if (depth === -1) { + depth = levels.length; + levels.push(et); + } else levels[depth] = et; + if (depth === 0 || opts.colorByName) colorKey = e.name.split(" ")[0]; + if (!colorMap.has(colorKey)) { + const color = typeof colors === "function" ? colors(colorKey) + : colors instanceof Map ? (colors.get(colorKey) || colors.get("DEFAULT")) : cycleColors(colors, colorMap.size); + colorMap.set(colorKey, d3.rgb(color)); + } + const fillColor = colorMap.get(colorKey).brighter(0.3*depth).toString(); + let label = coloredNames.get(e.name); + if (label == null) { + label = parseColors(e.name).flatMap(({ color, st }) => { + const parts = []; + for (let i=0; i0 ? ref.step+1 : 0; + const steps = ctxs[ref.ctx+1].steps; + for (let si=start; si ({shape:shapeMap.get(u32()), repr:strings[u32()], num:u32(), mode:u8()})); + const {nbytes, shapeKey} = allocs.get(key); allocs.delete(key); + users?.forEach((u) => selectShape(u.shape).e?.arg.bufs.push({ key:shapeKey, nbytes, num:u.num, mode:u.mode, k })); + memEvents.push({alloc, key, users, nbytes}); + timestamps.push(ts); valueMap.set(ts, y); + x += 1; y -= nbytes; + } + } + timestamps.push(dur); + const height = linear ? (baseHeight-padding)*(opts.heightScale ?? 1)*2 : heightScale(peak); + const yscale = d3.scaleLinear().domain([0, peak]).range([height, 0]); + // generic polygon merger + const base0 = yscale(0); + const sum = {x:[], y0:[], y1:[], fillColor:linear ? null : "#2b1b72"}; + for (let i=0; i { + if (bufShapes != null) return bufShapes; + bufShapes = []; + const buf_shapes = new Map(), temp = new Map(); + let x = 0, y = 0; + for (const e of memEvents) { + if (e.alloc) { + const shape = {x:[x], y:[y], dtype:e.dtype, sz:e.sz, nbytes:e.nbytes, key:e.key}; + buf_shapes.set(e.key, shape); temp.set(e.key, shape); + x += 1; y += e.nbytes; + } else { + const free = buf_shapes.get(e.key); + free.users = e.users; + x += 1; y -= free.nbytes; + free.x.push(x); free.y.push(free.y.at(-1)); + temp.delete(e.key); + for (const [k, v] of temp) { + if (k <= e.key) continue; + v.x.push(x, x); + v.y.push(v.y.at(-1), v.y.at(-1)-free.nbytes); + } + } + } + for (const [num, {dtype, sz, nbytes, y, x:steps, users}] of buf_shapes) { + const x = steps.map(s => timestamps[s]); + const dur = x.at(-1)-x[0]; + const arg = { tooltipText:`${dtype}\n${formatUnit(sz)}\n${formatUnit(nbytes, 'B')}\n${formatTime(dur)}`, users, key:`${k}-${bufShapes.length}` }; + bufShapes.push({ x, y0:y.map(yscale), y1:y.map(y0 => yscale(y0+nbytes)), arg, fillColor:cycleColors(colorScheme.BUFFER, bufShapes.length) }); + } + return bufShapes; + }; + if (timestamps.length > 0) data.first = data.first == null ? timestamps[0] : Math.min(data.first, timestamps[0]); + data.tracks.set(k, { shapes:[sum], eventType, linear, visible, offsetY, pcolor:linear ? "#4fa3cc" : "#c9a8ff", height, peak, scaleFactor:maxheight*4/height, + get views() { return [[sum], linear ? null : buildBufShapes()]; }, valueMap, rowBorderColor, unit:linear ? "Hz" : "B" }); + div.style("height", height+padding+"px").style("cursor", "pointer").on("click", (e) => { + if (linear) return; + const newFocus = e.currentTarget.id === focusedDevice ? null : e.currentTarget.id; + let offset = 0; + for (const [tid, track] of data.tracks) { + track.offsetY += offset; + if (tid === newFocus) { track.shapes = track.views[1]; offset += rescaleTrack(track, tid, track.scaleFactor); } + else if (tid === focusedDevice) { track.shapes = track.views[0]; offset += rescaleTrack(track, tid, 1/track.scaleFactor); } + } + data.axes.y = newFocus != null ? { domain:[0, (t=data.tracks.get(newFocus)).peak], range:[t.offsetY+t.height, t.offsetY], fmt:t.unit } : null; + toggleCls(document.getElementById(focusedDevice), document.getElementById(newFocus), "expanded"); + focusedDevice = newFocus; + return resize(); + }); + } + } + for (const m of markers) m.label = m.name.split(/(\s+)/).map(st => ({ st, color:m.color, width:ctx.measureText(st).width })); + if (data.pcMap != null) setFocus(focusedShape); + // secondary axis mapping + let instRange = null; + for (const [k, { shapes }] of data.tracks) if (!k.includes("Clock") && path.includes("sqtt")) { + const first = shapes[0].x, last = shapes.at(-1).x+shapes.at(-1).width; + instRange = instRange == null ? [first, last] : [Math.min(first, instRange[0]), Math.max(last, instRange[1])]; + } + if (instRange != null) [data.instSt, data.instEt] = instRange; + updateProgress(Status.COMPLETE); + // draw events on a timeline + const dpr = window.devicePixelRatio || 1; + const ellipsisWidth = ctx.measureText("...").width; + const drawText = (ctx, label, lx, ly, maxWidth) => { + let lw = 0; + for (let li=0; li maxWidth) { + if (lw>0) ctx.fillText("...", lx+lw, ly); + break; + } + ctx.fillStyle = label[li].color; + ctx.fillText(label[li].st, lx+lw, ly); + lw += label[li].width; + } + } + function render(transform) { + zoomLevel = transform; + const canvasWidth = canvas.clientWidth; + ctx.clearRect(0, 0, canvasWidth, canvas.clientHeight); + // rescale to match current zoom + const xscale = timelineScale(); + const visibleX = xscale.range().map(zoomLevel.invertX, zoomLevel).map(xscale.invert, xscale); + const st = visibleX[0], et = visibleX[1]; + xscale.domain([st, et]); + const profilerEl = profiler.node(); + const visibleYStart = profilerEl.scrollTop-canvasTop + rect(profilerEl).top, visibleYEnd = visibleYStart+profilerEl.clientHeight; + ctx.textBaseline = "middle"; + // draw shapes + for (const [k, { shapes, eventType, linear, visible, offsetY, valueMap, pcolor, scolor, unit, rowBorderColor }] of data.tracks) { + visible.length = 0; + const trackHeight = rect(document.getElementById(k)).height; + if (offsetY+trackHeight < visibleYStart || offsetY > visibleYEnd) continue; + const link0 = data.link?.[0]; const link1 = data.link?.[1], highlightRect = focusedShape != null || data.link != null, splitRects = scolor != null; + if (eventType === EventTypes.BUF) { // generic polygon + for (const e of shapes) { + if (e.x[0]>et || e.x.at(-1)=0; i--) ctx.lineTo(x[i], offsetY+e.y0[i]); ctx.closePath(); ctx.fillStyle = e.fillColor; ctx.fill(); } + if (focusedShape != null && e.arg?.key === focusedShape) { ctx.strokeStyle = pcolor; ctx.stroke(); } + } + } else { // contiguous rect + for (const e of shapes) { + if (e.x>et || e.x+e.width 10) { ctx.strokeStyle = scolor; ctx.strokeRect(x, y, width, e.height); } + } + } + // draw row line + if (rowBorderColor != null) { + const y = offsetY+trackHeight-padding/2 - 0.5; + drawLine(ctx, [0, canvasWidth], [y, y], { color:rowBorderColor }); + } + } + // draw the link + if (data.link != null) { + const [a, b] = [canvasRect(data.link[0], xscale), canvasRect(data.link[1], xscale)]; + const [left, right] = a.x0 <= b.x0 ? [a, b] : [b, a]; + const startX = left.x1, endX = right.x0; + const leftY = (left.y0+left.y1)/2, rightY = (right.y0+right.y1)/2; + const dx = endX-startX, bend = Math.max(12, Math.min(40, dx/2)); + ctx.beginPath(); ctx.moveTo(startX, leftY); ctx.bezierCurveTo(startX+bend, leftY, endX-bend, rightY, endX, rightY); ctx.strokeStyle = "#858b9d"; ctx.stroke(); + } + // draw axes + ctx.translate(0, baseOffset); + const y = secondaryTick != null ? tickSize+padding : 0; + drawLine(ctx, xscale.range(), [y, y]); + let lastLabelEnd = -Infinity; + for (const tick of xscale.ticks()) { + if (!Number.isInteger(tick)) continue; + const x = xscale(tick); + drawLine(ctx, [x, x], [y, y+tickSize]); + const labelX = x+ctx.lineWidth+2; + if (labelX <= lastLabelEnd) continue; + const label = formatTime(tick, et-st <= 1e3); + ctx.textBaseline = "top"; + ctx.fillText(label, labelX, y+tickSize); + lastLabelEnd = labelX + ctx.measureText(label).width + 4; + if (secondaryTick != null) { + drawLine(ctx, [x, x], [y, y-tickSize]); + const label = secondaryTick(tick, st, et); ctx.fillText(label, labelX, 0); + lastLabelEnd = Math.max(lastLabelEnd, labelX + ctx.measureText(label).width + 4); + } + } + if (data.axes.y != null) { + drawLine(ctx, [0, 0], data.axes.y.range); + const yscale = d3.scaleLinear().domain(data.axes.y.domain).range(data.axes.y.range); + for (const tick of yscale.ticks()) { + const y = yscale(tick); + drawLine(ctx, [0, tickSize], [y, y]); + ctx.textBaseline = "middle"; + ctx.fillText(formatUnit(tick, data.axes.y.fmt), tickSize+2, y); + } + } + // draw markers + ctx.translate(0, -baseOffset); + ctx.textBaseline = "top"; + let prevX = null; + for (let i=0; i 0) { + zoomLevel = d3.zoomIdentity.translate(zoomLevel.x+lastCanvasRect.left-newRect.left, 0).scale(zoomLevel.k*lastCanvasRect.width/width); + } + lastCanvasRect = { left:newRect.left, width }; + d3.select(canvas).call(canvasZoom.transform, zoomLevel); + } + + zoomLevel = getZoomIdentity(); + canvasZoom = d3.zoom().filter(vizZoomFilter).on("zoom", e => render(e.transform)); + d3.select(canvas).call(canvasZoom); + document.addEventListener("contextmenu", e => e.ctrlKey && e.preventDefault()); + + new ResizeObserver(([e]) => e.contentRect.width > 0 && resize()).observe(profiler.node()); + profiler.on("scroll", () => render(zoomLevel)); + + function findRectAtPosition(x, y) { + let track = null; + for (const k of data.tracks.keys()) { + const r = rect(document.getElementById(k)); + if (y >= r.y && y <= r.y+r.height) { track = data.tracks.get(k); break; } + } + if (track == null) return; + const R = rect(canvas); + const X = ((x-R.left) * (canvas.width/R.width))/dpr; + const Y = ((y-R.top) * (canvas.height/R.height))/dpr; + for (const r of track.visible) { + if (Y>=r.y0 && Y<=r.y1 && X>=r.x0 && X<=r.x1) return r.arg; + } + } + + const clickShape = (e) => { + e.preventDefault(); + const foundRect = findRectAtPosition(e.clientX, e.clientY); + if (foundRect?.step != null && (foundRect?.key == null || e.type == "dblclick")) { return switchCtx(foundRect.ctx, foundRect.step); } + if (foundRect?.key != focusedShape) { setFocus(foundRect?.key); } + } + canvas.addEventListener("click", clickShape); + canvas.addEventListener("dblclick", clickShape); + + canvas.addEventListener("mousemove", e => { + const foundRect = findRectAtPosition(e.clientX, e.clientY); + const tooltip = document.getElementById("tooltip"); + if (foundRect?.tooltipText != null) { + tooltip.replaceChildren(colored(foundRect.label||[]), document.createTextNode(foundRect.tooltipText)); + tooltip.style.display = "block"; + tooltip.style.left = (e.pageX+10)+"px"; + tooltip.style.top = (e.pageY)+"px"; + tooltip.dataset.key = foundRect.key ?? ""; + } else tooltip.style.display = "none"; + }); + canvas.addEventListener("mouseleave", () => document.getElementById("tooltip").style.display = "none"); +} + +// ** zoom and recentering + +const vizZoomFilter = e => (!e.ctrlKey || e.type === 'wheel' || e.type === 'mousedown') && !e.button && e.type !== 'dblclick'; +const svgZoom = d3.zoom().filter(vizZoomFilter).on("zoom", (e) => d3.select("#render").attr("transform", e.transform)); +d3.select("#graph-svg").call(svgZoom); + +// zoom to fit into view +document.getElementById("zoom-to-fit-btn").addEventListener("click", () => { + const canvas = d3.select("#timeline"); + if (!canvas.empty() && rect(canvas.node()).width !== 0) { + return canvas.call(canvasZoom.transform, getZoomIdentity()); + } + const svg = d3.select("#graph-svg"); + svg.call(svgZoom.transform, d3.zoomIdentity); + const mainRect = rect(".main-container"); + const [x0, x1] = viewBounds(); + const pad = 16; + const R = { x: x0+pad, y: mainRect.top+pad, width: (x1>0 ? x1-x0 : mainRect.width)-2*pad, height: mainRect.height-2*pad }; + const r = rect("#render"); + if (r.width === 0) return; + const scale = Math.min(R.width/r.width, R.height/r.height); + const [tx, ty] = [R.x+(R.width-r.width*scale)/2-r.left*scale, R.y+(R.height-r.height*scale)/2]; + svg.call(svgZoom.transform, d3.zoomIdentity.translate(tx, ty).scale(scale)); +}); + +// **** main VIZ interfacae + +const pathLink = (fp, lineno) => d3.create("a").attr("href", "vscode://file/"+fp+":"+lineno).text(`${fp.split("/").at(-1)}:${lineno}`); +function codeBlock(st, language, { loc, wrap }={}) { + const code = document.createElement("code"); + // plaintext renders like a terminal print, otherwise render with syntax highlighting + if (!language || language === "txt") code.appendChild(colored(st)); + else code.innerHTML = hljs.highlight(st, { language }).value; + code.className = "hljs"; + const ret = document.createElement("pre"); + if (wrap) ret.className = "wrap"; + if (loc != null) ret.appendChild(pathLink(loc[0], loc[1]).style("margin-bottom", "4px").node()); + ret.appendChild(code); + return ret; +} +function traceBlock(trace) { + const root = d3.create("pre").append("code").classed("hljs", true); + for (let i=trace.length-1; i>=0; i--) { + const [fp, lineno, fn, code] = trace[i]; + root.append("div").style("margin-bottom", "2px").style("display","flex").text(fn+" ").append(() => pathLink(fp, lineno).node()); + root.append("div").html(hljs.highlight(code, { language: "python" }).value).style("margin-bottom", "1ex"); + } + return root.node().parentNode; +} + +function toggleCls(prev, next, cls, value) { + prev?.classList.remove(cls); + next?.classList.toggle(cls, value ?? true); + requestAnimationFrame(() => next?.scrollIntoView({ behavior: "auto", block: "nearest" })); +} + +// ** hljs extra definitions for UOps and float4 +hljs.registerLanguage("python", (hljs) => ({ + ...hljs.getLanguage("python"), + case_insensitive: false, + contains: [ + { begin: 'dtypes\\.[a-zA-Z_][a-zA-Z0-9_-]*(\\.[a-zA-Z_][a-zA-Z0-9_-]*)*' + '(?=[.\\s\\n[:,(])', className: "type" }, + { begin: 'dtypes\\.[a-zA-Z_][a-zA-Z0-9_-].vec*' + '(?=[.\\s\\n[:,(])', className: "type" }, + { begin: '[a-zA-Z_][a-zA-Z0-9_-]*\\.[a-zA-Z_][a-zA-Z0-9_-]*' + '(?=[.\\s\\n[:,()])', className: "operator" }, + { begin: '[A-Z][a-zA-Z0-9_]*(?=\\()', className: "section", ignoreEnd: true }, + ...hljs.getLanguage("python").contains, + ] +})); +hljs.registerLanguage("cpp", (hljs) => ({ + ...hljs.getLanguage('cpp'), + contains: [{ begin: '\\b(?:float|half)[0-9]+\\b', className: 'type' }, ...hljs.getLanguage('cpp').contains] +})); + +async function fetchValue(path) { + const res = await fetch(path); + return (await (res.headers.get("content-type") === "application/json" ? res.json() : res.arrayBuffer())); +} + +var ret = []; +var cache = {}; +var ctxs = null; +const evtSources = []; +// VIZ displays graph rewrites in 3 levels, from bottom-up: +// rewrite: a single UOp transformation +// step: collection of rewrites +// context: collection of steps +const state = {currentCtx:-1, currentStep:0, currentRewrite:0, expandSteps:false, callSrcMask:new Set(), expandedNodes:new Set()}; +function setState(ns) { + saveToHistory(state); + const { ctx:prevCtx, step:prevStep } = select(state.currentCtx, state.currentStep); + const prevRewrite = state.currentRewrite; + Object.assign(state, ns); + // update element styles if needed + const { ctx, step } = select(state.currentCtx, state.currentStep); + toggleCls(prevCtx, ctx, "expanded", state.expandSteps); + if (ctx?.id !== prevCtx?.id) { + toggleCls(prevCtx, ctx, "active"); + } + if (ctx?.id !== prevCtx?.id || step?.id !== prevStep?.id) { + toggleCls(prevStep, step, "active"); + // walk the tree back until all parents expanded so that the child is visible + let e = step; + while (e?.parentElement?.id.startsWith("step")) { + e.parentElement.classList.add("expanded"); + e = e.parentElement; + } + } + // re-render + main(); +} + +const getSubrewrites = (ul) => ul.querySelectorAll(":scope > ul"); + +function saveToHistory(ns) { + // NOTE: browser does a structured clone, passing a mutable object is safe. + history.replaceState(ns, ""); + history.pushState(ns, ""); +} + +// switch to the start of a new graph and expand all the steps +const switchCtx = (newCtx, step) => setState({ expandSteps:true, currentCtx:newCtx+1, currentStep:step ?? 0, currentRewrite:0 }); + +window.addEventListener("popstate", (e) => { + if (e.state?.shape != null) return setFocus(e.state?.shape); + if (e.state != null) setState(e.state); +}); + +const createToggle = (id, text) => { + const label = d3.create("label").text(text).node(); + const toggle = d3.create("input").attr("type", "checkbox").attr("id", id).property("checked", true).node(); + label.prepend(toggle); + return { toggle, label }; +} +const showIndexing = createToggle("show-indexing", "Show indexing (r)"); +const showCallSrc = createToggle("show-call-src", "Show all CALL src (c)"); showCallSrc.toggle.checked = false; +const showSink = createToggle("show-sink", "Show SINK (s)"); +showSink.toggle.checked = false; +const showGraph = createToggle("show-graph", "Show graph (g)"); +showGraph.toggle.onchange = () => displaySelection(rect("#graph").width > 0 ? "#custom" : "#graph"); + +function appendSteps(root, idx, steps) { + const stack = []; + for (const [j,u] of steps.entries()) { + while (stack.length && stack.at(-1).depth >= u.depth) stack.pop(); + const list = stack.length > 0 ? stack.at(-1).li : root; + u.li = list.appendChild(document.createElement("ul")); + u.li.id = `step-${idx}-${j}` + const p = u.li.appendChild(document.createElement("p")); + p.appendChild(colored(`${u.name}`+(u.match_count ? ` - ${u.match_count}` : ''))); + p.onclick = (e) => { + e.stopPropagation(); + const subrewrites = getSubrewrites(e.currentTarget.parentElement); + if (subrewrites.length) { e.currentTarget.parentElement.classList.toggle("expanded"); } + setState({ currentStep:j, currentCtx:idx, currentRewrite:0 }); + } + stack.push(u); + } + for (const l of root.querySelectorAll("ul > ul > p")) { + const subrewrites = getSubrewrites(l.parentElement); + if (subrewrites.length > 0) { l.appendChild(d3.create("span").text(` (${subrewrites.length})`).node()); l.parentElement.classList.add("has-children"); } + } +} + +async function main() { + // ** left sidebar context list + if (ctxs == null) { + ctxs = [{ name:"Profiler", steps:[] }]; + for (const r of await fetchValue("/ctxs")) ctxs.push(r); + const ctxList = document.querySelector(".ctx-list"); + for (const [i,{name, steps}] of ctxs.entries()) { + const ul = ctxList.appendChild(document.createElement("ul")); + ul.id = `ctx-${i}`; + const p = ul.appendChild(document.createElement("p")); + p.appendChild(colored(name)); + p.onclick = () => { + setState(i === state.currentCtx ? { expandSteps:!state.expandSteps } : { expandSteps:true, currentCtx:i, currentStep:0, currentRewrite:0 }); + } + appendSteps(ul, i, steps); + } + return setState({ currentCtx:-1 }); + } + // ** center graph + const { currentCtx, currentStep, currentRewrite, expandSteps } = state; + if (currentCtx == -1) return; + const ctx = ctxs[currentCtx]; + const step = ctx.steps[currentStep]; + const ckey = step?.query; + // close any pending event sources + let activeSrc = null; + for (const e of evtSources) { + const url = new URL(e.url); + if (url.pathname+url.search !== ckey) e.close(); + else if (e.readyState === EventSource.OPEN) activeSrc = e; + } + if (ctx.name === "Profiler") return renderProfiler("/get_profile", {unit:"ms", width:"132px"}); + if (workerUrl == null) await initWorker(); + if (ckey in cache) { + ret = cache[ckey]; + } + if (!ckey.startsWith("/graph")) { + if (!(ckey in cache)) cache[ckey] = ret = await fetchValue(ckey); + if (ret.steps?.length > 0) { + const el = select(state.currentCtx, state.currentStep); + if (el.step.querySelectorAll("ul").length === ret.steps.length) return; + // re render the list with new items + ctx.steps.push(...ret.steps); + while (el.ctx.children.length > 1) el.ctx.children[1].remove(); + appendSteps(el.ctx, state.currentCtx, ctx.steps); + return setState({ currentStep:state.currentStep+1, expandSteps:true }); + } + // timeline with cycles on the x axis + if (ret instanceof ArrayBuffer) { + const pkts = step.query.includes("sqtt"); + return renderProfiler(ckey, {unit:"clk", heightScale:0.5, hideLabels:true, colorByName:pkts}); + } + metadata.replaceChildren(...((ret.metadata ?? []).map((m) => { + return tabulate(m.map((e) => [e.label.trim(), typeof e.value === "string" ? e.value : formatUnit(e.value)])); + }))); + // graph render + if (ret.data != null) { + metadata.prepend(showGraph.label); + renderDag(ret, { recenter:true }); + } else displaySelection("#custom"); + // table / plaintext render + const root = d3.create("div").classed("raw-text", true); + function renderTable(root, ret) { + const table = root.append("table"); + const thead = table.append("thead"); + for (const c of ret.cols) thead.append("th").text(c.title ?? c); + for (const r of ret.rows) { + const tr = table.append("tr").classed("main-row", true); + for (const [i,value] of r.entries()) { + // nested table + if (value.cols != null) { + tr.classed("has-children", true); + tr.on("click", () => { + const el = tr.node().nextElementSibling; + if (el?.classList.contains("nested-row")) { tr.classed("expanded", false); return el.remove(); } + tr.classed("expanded", true); + const td = table.insert("tr", () => tr.node().nextSibling).classed("nested-row", true).append("td"); + td.attr("colSpan", ret.cols.length); + renderTable(td, value); + }); + continue; + } + const td = tr.append("td").classed(ret.cols[i], true); + // string format scalar values + td.append(() => typeof value === "string" ? colored(value) : d3.create("p").text(ret.cols[i] === "Duration" ? formatMicroseconds(value) : formatUnit(value)).node()); + } + } + return table; + } + if (ret.ref != null) { + const disasmIdx = ctxs[ret.ref+1].steps.findIndex(s => s.name === "View Disassembly") + metadata.appendChild(d3.create("a").text("View Disassembly").on("click", () => switchCtx(ret.ref, disasmIdx)).node()); + } + if (ret.cols != null) renderTable(root, ret); + else if (ret.src != null) root.append(() => codeBlock(ret.src, ret.lang)); + return document.querySelector("#custom").replaceChildren(root.node()); + } + // ** Graph view + // if we don't have a complete cache yet we start streaming graphs in this step + if (!(ckey in cache) || (!cache[ckey].done && activeSrc == null)) { + ret = []; + cache[ckey] = ret; + const eventSource = new EventSource(ckey); + evtSources.push(eventSource); + eventSource.onmessage = (e) => { + if (e.data === "[DONE]") { ret.done = true; eventSource.close(); return; } + const chunk = JSON.parse(e.data); + ret.push(chunk); + // if it's the first one render this new rgaph + if (ret.length === 1) return main(); + // otherwise just enable the graph selector + const ul = document.getElementById(`rewrite-${ret.length-1}`); + if (ul != null) ul.classList.remove("disabled"); + }; + } + if (ret.length === 0) return; + // ** center graph + const data = ret[currentRewrite]; + const render = (layoutOpts, renderOpts) => renderDag({ data, opts:layoutOpts }, renderOpts); + const getOpts = () => ({ showIndexing:showIndexing.toggle.checked, showCallSrc:showCallSrc.toggle.checked, showSink:showSink.toggle.checked, + callSrcMask:state.callSrcMask, expandedNodes:state.expandedNodes }); + render(getOpts(), { recenter:currentRewrite === 0 }); + showIndexing.toggle.onchange = () => render(getOpts(), { recenter:true }); + showCallSrc.toggle.onchange = () => { state.callSrcMask.clear(); render(getOpts(), { recenter:true }); } + showSink.toggle.onchange = () => render(getOpts(), { recenter:true }); + // ** right sidebar metadata + metadata.innerHTML = ""; + if (ckey.includes("rewrites")) metadata.append(showIndexing.label, showCallSrc.label, showSink.label); + if (step.code_line != null) metadata.appendChild(codeBlock(step.code_line, "python", { loc:step.loc, wrap:true })); + if (step.trace) metadata.appendChild(traceBlock(step.trace)); + if (data.uop != null) metadata.appendChild(codeBlock(data.uop, "python", { wrap:false })).classList.toggle("full-height", step.match_count === 0); + // ** multi graph in one page + if (!step.match_count) return; + const rewriteList = metadata.appendChild(document.createElement("div")); + rewriteList.className = "rewrite-list"; + for (let s=0; s<=step.match_count; s++) { + const ul = rewriteList.appendChild(document.createElement("ul")); + ul.id = `rewrite-${s}`; + const p = ul.appendChild(document.createElement("p")); + p.innerText = s; + ul.onclick = () => setState({ currentRewrite:s }); + ul.className = s > ret.length-1 ? "disabled" : s === currentRewrite ? "active" : ""; + if (s > 0 && s === currentRewrite) { + const { upat, diff } = ret[s]; + metadata.appendChild(codeBlock(upat[1], "python", { loc:upat[0], wrap:true })); + const diffCode = metadata.appendChild(document.createElement("pre")).appendChild(document.createElement("code")); + for (const line of diff) { + diffCode.appendChild(colored([{st:line, color:line.startsWith("+") ? "#3aa56d" : line.startsWith("-") ? "#d14b4b" : "#f0f0f5"}])); + diffCode.appendChild(document.createElement("br")); + } + diffCode.className = "wrap"; + } + } +} + +// **** collapse/expand + +let isCollapsed = false; +document.querySelector(".collapse-btn").addEventListener("click", (e) => { + isCollapsed = !isCollapsed; + document.querySelector(".main-container").classList.toggle("collapsed", isCollapsed); + e.currentTarget.blur(); + e.currentTarget.style.transform = isCollapsed ? "rotate(180deg)" : "rotate(0deg)"; + window.dispatchEvent(new Event("resize")); +}); + +// **** resizer + +function appendResizer(element, { minWidth, maxWidth }, left=false) { + const handle = Object.assign(document.createElement("div"), { className: "resize-handle", style: left ? "right: 0" : "left: 0; margin-top: 0" }); + element.appendChild(handle); + const resize = (e) => { + const change = e.clientX - element.dataset.startX; + let newWidth = ((Number(element.dataset.startWidth)+(left ? change : -change))/Number(element.dataset.containerWidth))*100; + element.style.width = `${Math.max(minWidth, Math.min(maxWidth, newWidth))}%`; + }; + handle.addEventListener("mousedown", (e) => { + e.preventDefault(); + element.dataset.startX = e.clientX; + element.dataset.containerWidth = rect(".main-container").width; + element.dataset.startWidth = element.getBoundingClientRect().width; + document.documentElement.addEventListener("mousemove", resize, false); + document.documentElement.addEventListener("mouseup", () => { + document.documentElement.removeEventListener("mousemove", resize, false); + element.style.userSelect = "initial"; + }, { once: true }); + }); +} +appendResizer(document.querySelector(".ctx-list-parent"), { minWidth: 15, maxWidth: 50 }, left=true); +appendResizer(document.querySelector(".metadata-parent"), { minWidth: 20, maxWidth: 50 }); + +// **** keyboard shortcuts + +const select = (ctx, step) => ({ ctx:document.getElementById(`ctx-${ctx}`), step:document.getElementById(`step-${ctx}-${step}`) }); +const deselect = (element) => { + const parts = element?.id.split("-").map(Number); + return element?.id.startsWith("ctx") ? { ctx:parts[1], step:null } : element?.id.startsWith("step") ? {ctx:parts[1], step:parts[2]} : {}; +} +const isExpanded = (el) => el?.classList.contains("expanded"); + +document.addEventListener("keydown", (event) => { + const { currentCtx, currentStep, currentRewrite, expandSteps } = state; + // up and down change the step or context from the list + const changeStep = expandSteps && ctxs[currentCtx].steps?.length; + const { step, ctx } = select(currentCtx, currentStep); + if (event.key == "ArrowUp") { + event.preventDefault(); + if (changeStep) { + let prev = deselect(step.previousElementSibling); + if (prev.step == null && isExpanded(step.parentElement)) prev = deselect(step.parentElement); + return prev.step != null && !isExpanded(step) && setState({ currentRewrite:0, currentStep:prev.step }); + } + return setState({ currentStep:0, currentRewrite:0, currentCtx:Math.max(0, currentCtx-1), expandSteps:false }); + } + if (event.key == "ArrowDown") { + event.preventDefault(); + if (changeStep) { + const next = deselect(isExpanded(step) ? step.children[1] : step.nextElementSibling); + return next.step != null && setState({ currentRewrite:0, currentStep:next.step }); + } + return setState({ currentStep:0, currentRewrite:0, currentCtx:Math.min(ctxs.length-1, currentCtx+1), expandSteps:false }); + } + // enter toggles focus on a single rewrite stage + if (event.key == "Enter") { + event.preventDefault() + if (currentCtx === -1) { + return setState({ currentCtx:0, expandSteps:true }); + } + if (expandSteps && getSubrewrites(step).length) return step.children[0].click(); + return setState({ expandSteps:!expandSteps }); + } + // left and right go through rewrites in a single UOp, in profiler go forward/backward in time + if (event.key == "ArrowLeft" || event.key == "ArrowRight") { + event.preventDefault() + if (profiler.style.display !== "none" && focusedShape != null) { + const [t, idx] = focusedShape.split("-"); + const i = parseInt(idx), last = data.tracks.get(t).shapes.length-1; + return setFocus(`${t}-${event.key == "ArrowLeft" ? Math.max(0, i-1) : Math.min(last, i+1)}`); + } + if (event.key == "ArrowLeft") return setState({ currentRewrite:Math.max(0, currentRewrite-1) }); + const totalRewrites = ret.length-1; + return setState({ currentRewrite:Math.min(totalRewrites, currentRewrite+1) }); + } + // space recenters the graph + if (event.key == " ") { + event.preventDefault() + document.getElementById("zoom-to-fit-btn").click(); + } + // r key toggles indexing + if (event.key === "r") showIndexing.toggle.click(); + // c key toggles CALL src + if (event.key === "c" && !event.ctrlKey && !event.metaKey && !event.altKey) showCallSrc.toggle.click(); + // s key toggles SINK + if (event.key === "s") showSink.toggle.click(); + // g key toggles graph + if (event.key === "g") showGraph.toggle.click(); +}); + +main() diff --git a/artifacts/package_runtime/tinygrad/viz/js/worker.js b/artifacts/package_runtime/tinygrad/viz/js/worker.js new file mode 100644 index 000000000..00de46c5f --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/js/worker.js @@ -0,0 +1,122 @@ +const NODE_PADDING = 10; +const rectDims = (lw, lh) => ({ width:lw+NODE_PADDING*2, height:lh+NODE_PADDING*2, labelWidth:lw, labelHeight:lh }); + +const canvas = new OffscreenCanvas(0, 0); +const ctx = canvas.getContext("2d"); + +onmessage = (e) => { + try { + const { data, opts } = e.data; + const g = new dagre.graphlib.Graph({ compound: true }).setDefaultEdgeLabel(function() { return {}; }); + (data.blocks != null ? layoutCfg : layoutUOp)(g, data, opts); + postMessage({result: dagre.graphlib.json.write(g)}); + self.close(); + } catch (err) { + postMessage({error: err.stack || err.message || String(err)}); + self.close(); + } +} + +const layoutCfg = (g, { blocks, paths, pc_tokens }) => { + const lineHeight = 18; + g.setGraph({ rankdir:"TD", font:"monospace", lh:lineHeight, textSpace:"1ch" }); + ctx.font = `350 ${lineHeight}px ${g.graph().font}`; + // basic blocks render the assembly in nodes + const tokenColors = {0:"#7aa2f7", 1:"#9aa5ce"}; + for (const [lead, members] of Object.entries(blocks)) { + let [width, height, label] = [0, 0, []]; + for (const m of members) { + const tokens = pc_tokens[m]; + label.push(tokens.map((t, i) => ({st:t.st, keys:t.keys, color:tokenColors[t.kind]}))); + width = Math.max(width, ctx.measureText(tokens.map((t) => t.st).join("")).width); + height += lineHeight; + } + g.setNode(lead, { ...rectDims(width, height), label, labelX:0, id:lead, color:"#1a1b26", addrspace:null }); + } + // paths become edges between basic blocks + const pathColors = {0:"#3f7564", 1:"#7a4540", 2:"#3b5f7e"}; + for (const [lead, value] of Object.entries(paths)) { + for (const [id, color] of Object.entries(value)) g.setEdge(lead, id, {label:{type:"port", text:""}, color:pathColors[color]}); + } + dagre.layout(g); +} + +const layoutUOp = (g, { graph, change }, opts) => { + const lineHeight = 14; + g.setGraph({ rankdir: "LR", font:"sans-serif", lh:lineHeight }); + ctx.font = `350 ${lineHeight}px ${g.graph().font}`; + if (change?.length) g.setNode("overlay", {label:"", labelWidth:0, labelHeight:0, labelX:0, className:"overlay"}); + let callCount = 0; + for (const [k, {label, src, ref, color, tag, exclude, addrspace}] of Object.entries(graph)) { + // adjust node dims by label size (excluding escape codes) + add padding + let [width, height] = [0, 0]; + for (line of label.replace(/\u001B\[(?:K|.*?m)/g, "").split("\n")) { + width = Math.max(width, ctx.measureText(line).width); + height += lineHeight; + } + const op = label.split("\n", 1)[0]; + const callNode = op === "CALL" || op === "FUNCTION", programNode = op === "PROGRAM"; + const collapsePorts = callNode ? [0] : programNode ? [0, 1] : null; + if (callNode) callCount++; + g.setNode(k, {...rectDims(width, height), label, labelX:0, ref, id:k, color, tag, callNode, collapsePorts, exclude, addrspace, + className:label.startsWith("REWRITE_ERROR") ? "err" : null}); + // add edges + const edgeCounts = {}; + for (const [_, s] of src) edgeCounts[s] = (edgeCounts[s] || 0)+1; + for (const [port, s] of src) g.setEdge(s, k, { label: edgeCounts[s] > 1 ? {type:"tag", text:edgeCounts[s]} : {type:"port", text:port}, + ...(collapsePorts?.includes(port) && {color:"#a0a1b8"})}); + if (change?.includes(parseInt(k))) g.setParent(k, "overlay"); + } + // optionally hide nodes from the layout + if (!opts.showSink) { + for (const n of g.nodes()) { + const node = g.node(n); + if ((node.label === "SINK" || node.label.startsWith("SINK\n")) && (g.successors(n) || []).length === 0) g.removeNode(n); + } + } + if (!opts.showIndexing) { + for (const n of g.nodes()) { + const node = g.node(n); + if (node.label.includes("dtypes.weakint")) g.removeNode(n); + } + } + // optionally remove node srcs, track affected nodes + const disconnected = new Set(); + const CALL_TAG_WIDTH = 14; + for (const n of g.nodes()) { + const node = g.node(n); + for (const consumerId of (g.successors(n) || [])) { + const consumer = g.node(consumerId); + // add +- toggle if this consumer has collapsible sources + const edge = g.edge(n, consumerId); + const collapsible = consumer.collapsePorts != null ? consumer.collapsePorts.includes(edge?.label?.text) : node.exclude; + if (!collapsible) continue; + consumer.collapsible = true; + // increase width of call/function/program nodes to make space for a toggle + if (consumer.collapsePorts != null) { consumer.width = consumer.labelWidth+NODE_PADDING*2+CALL_TAG_WIDTH; consumer.labelX = CALL_TAG_WIDTH/2; } + // make sources invisible if UI has toggled it off + const collapsed = consumer.callNode ? opts.showCallSrc === opts.callSrcMask.has(consumerId) : !opts.expandedNodes.has(consumerId); + if (!collapsed) continue; + consumer.collapsed = true; + g.removeEdge(n, consumerId); + disconnected.add(n); + } + } + // remove nodes that are now disconnected (no successors), only from affected subtree + let changed = true; + while (changed) { + changed = false; + for (const n of disconnected) { + if (!g.hasNode(n)) continue; + if ((g.successors(n) || []).length === 0) { + for (const pred of (g.predecessors(n) || [])) disconnected.add(pred); + g.removeNode(n); + changed = true; + } + } + } + g.graph().callCount = callCount; + dagre.layout(g); + // remove overlay node if it's empty + if (!g.node("overlay")?.width) g.removeNode("overlay"); +} diff --git a/artifacts/package_runtime/tinygrad/viz/serve.py b/artifacts/package_runtime/tinygrad/viz/serve.py new file mode 100644 index 000000000..506fcac00 --- /dev/null +++ b/artifacts/package_runtime/tinygrad/viz/serve.py @@ -0,0 +1,739 @@ +#!/usr/bin/env python3 +import multiprocessing, pickle, difflib, os, threading, json, time, sys, webbrowser, socket, argparse, codecs, io, struct, re, traceback, itertools +import socketserver +from contextlib import redirect_stdout, redirect_stderr, contextmanager +from decimal import Decimal +from dataclasses import dataclass, field +from urllib.parse import parse_qs, urlparse +from http.server import BaseHTTPRequestHandler +from typing import Any, TypedDict, TypeVar, Generator, Callable +from tinygrad.helpers import colored, getenv, unwrap, word_wrap, TRACEMETA, ProfileEvent, ProfileRangeEvent, TracingKey, ProfilePointEvent, temp +from tinygrad.helpers import printable, Context, START_TIME, NO_COLOR, ansistrip +from tinygrad.renderer.amd.dsl import Inst +from tinygrad.renderer.amd import detect_format + +# NOTE: using HTTPServer forces a potentially slow socket.getfqdn +class TCPServerWithReuse(socketserver.TCPServer): + allow_reuse_address = True + def __init__(self, server_address, RequestHandlerClass): + print(f"*** started server on http://127.0.0.1:{server_address[1]} at {time.perf_counter()-START_TIME:.2f} s") + super().__init__(server_address, RequestHandlerClass) + +class HTTPRequestHandler(BaseHTTPRequestHandler): + def send_data(self, data:bytes, content_type:str="application/json", status_code:int=200): + self.send_response(status_code) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(len(data))) + self.end_headers() + return self.wfile.write(data) + def stream_json(self, source:Generator): + try: + self.send_response(200) + self.send_header("Content-Type", "text/event-stream") + self.send_header("Cache-Control", "no-cache") + self.end_headers() + for r in source: + self.wfile.write(f"data: {json.dumps(filter_keys(r))}\n\n".encode("utf-8")) + self.wfile.flush() + self.wfile.write("data: [DONE]\n\n".encode("utf-8")) + # pass if client closed connection + except (BrokenPipeError, ConnectionResetError): source.close() + +from tinygrad.uop.ops import TrackedGraphRewrite, RewriteTrace, UOp, Ops, GroupOp, srender, sint, sym_infer, range_str, range_start, multirange_str +from tinygrad.uop.ops import KernelInfo +from tinygrad.uop.render import print_uops, pyrender +from tinygrad.device import ProfileDeviceEvent, ProfileGraphEvent, ProfileGraphEntry, ProfileProgramEvent +from tinygrad.dtype import dtypes, AddrSpace + +uops_colors = {Ops.LOAD: "#ffc0c0", Ops.STORE: "#87CEEB", Ops.CONST: "#e0e0e0", Ops.REDUCE: "#FF5B5B", + Ops.RANGE: "#c8a0e0", Ops.BARRIER: "#ff8080", Ops.IF: "#c8b0c0", Ops.SPECIAL: "#c0c0ff", + Ops.INDEX: "#CEF9B7", Ops.STACK: "#D8F9E4", + Ops.WMMA: "#efefc0", Ops.UNSHARD: "#f6ccff", Ops.INS: "#eec4ff", + **{x:"#D8F9E4" for x in GroupOp.Movement}, **{x:"#ffffc0" for x in GroupOp.ALU}, Ops.THREEFRY:"#ffff80", + Ops.SLICE: "#E5EAFF", Ops.BUFFER: "#B0BDFF", Ops.GETADDR: "#9DB1F0", Ops.COPY: "#a040a0", Ops.CUSTOM_FUNCTION: "#bf71b6", + Ops.CALL: "#00B7C8", Ops.FUNCTION: "#C07788", Ops.PARAM: "#14686F", Ops.SOURCE: "#c0c0c0", Ops.BINARY: "#404040", + Ops.LINEAR: "#7DF4FF", + Ops.ALLREDUCE: "#ff40a0", Ops.MSELECT: "#d040a0", Ops.MSTACK: "#d040a0", Ops.CONTIGUOUS: "#FFC14D", + Ops.STAGE: "#AC640D", Ops.REWRITE_ERROR: "#1a1b26", Ops.AFTER: "#8A7866", Ops.END: "#524C46"} + +addrspace_colors = {AddrSpace.ALU: "#AAAAAA", AddrSpace.REG:"#e68181", AddrSpace.LOCAL:"#e7c86a", AddrSpace.GLOBAL:"#75bd7b"} + +# VIZ API + +# A step is a lightweight descriptor for a trace entry +# Includes a name, metadata and a URL path for fetching the full data + +def create_step(name:str, query:tuple[str, int, int], data=None, depth:int=0, **kwargs) -> dict: + return {"name":name, "query":f"{query[0]}?ctx={query[1]}&step={query[2]}", "_data":data, "depth":depth, **kwargs} + +@dataclass(frozen=True) +class VizData: + trace:RewriteTrace = field(default_factory=lambda: RewriteTrace([], [], {})) + ctxs:list[dict] = field(default_factory=list) + ref_map:dict[Any, int] = field(default_factory=dict) + all_uops:dict[int, UOp] = field(default_factory=dict) + +# ** load all saved rewrites + +def load_rewrites(data:VizData) -> None: + assert not data.ctxs and not data.ref_map, "load_rewrites called multiple times" + for i,k in enumerate(data.trace.keys): + steps:list[dict] = [] + ki:KernelInfo|None = None + for j,s in enumerate(data.trace.rewrites[i]): + steps.append(create_step(s.name, ("/graph-rewrites", i, j), loc=s.loc, match_count=len(s.matches), code_line=printable(s.loc), + trace=k.tb if j==0 else None, depth=s.depth)) + # get source and binary from Ops.PROGRAM + if s.name == "linearize/render": + steps.append(create_step("View UOp List", ("/uops", i, len(steps)), j, depth=s.depth)) + steps.append(create_step("View Source", ("/code", i, len(steps)), j, depth=s.depth)) + steps.append(create_step("View Disassembly", ("/asm", i, len(steps)), (k.ret, j), depth=s.depth)) + if s.name == "View Program": ki = _reconstruct(data, s.sink, depth=1).src[0].arg + for key in k.keys: data.ref_map[canonicalize_ast(key) if isinstance(key, UOp) else key] = i + data.ctxs.append({"name":k.display_name, "steps":steps, "ki":ki}) + +# ** get the complete UOp graphs for one rewrite + +class GraphRewriteDetails(TypedDict): + graph: dict # JSON serialized UOp for this rewrite step + uop: str # strigified UOp for this rewrite step + diff: list[str]|None # diff of the single UOp that changed + change: list[int]|None # the new UOp id + all its parents ids + upat: tuple[tuple[str, int], str]|None # [loc, source_code] of the matched UPat + _sink: UOp + +def shape_to_str(s:tuple[sint, ...]): return "(" + ','.join(srender(x) for x in s) + ")" +def mask_to_str(s:tuple[tuple[sint, sint], ...]): return "(" + ','.join(shape_to_str(x) for x in s) + ")" +def pystr(u:UOp) -> str: + # pyrender may check for shape mismatch + try: return pyrender(u) + except Exception: return str(u) + +def fmt_colored(s:str) -> str: return ansistrip(s) if NO_COLOR else s + +def canonicalize_ast(u:UOp) -> UOp: return u.replace(arg=KernelInfo()) if u.op is Ops.SINK and isinstance(u.arg, KernelInfo) else u + +def uop_to_json(data:VizData, x:UOp) -> dict[int, dict]: + assert isinstance(x, UOp) + graph: dict[int, dict] = {} + excluded: set[UOp] = set() + for u in (toposort:=x.toposort()): + # always exclude CONST + if u.op is Ops.CONST and u is not x: excluded.add(u) + if u.op is Ops.STACK and len(u.src) == 0: excluded.add(u) + # exclude RESHAPE/EXPAND that only serve to broadcast a CONST + if u.op in {Ops.RESHAPE, Ops.EXPAND} and len(u.src) >= 1 and u.src[0] in excluded and u is not x: excluded.add(u) + if u.op in {*GroupOp.Movement, Ops.PARAM}: excluded.update(s for s in u.src if s.op is Ops.STACK and all(x.op is Ops.CONST for x in s.src)) + for u in toposort: + argst = codecs.decode(str(u.arg), "unicode_escape") + with soft_err(): + if u.op in GroupOp.Movement and u.marg: argst = (mask_to_str if u.op in {Ops.SHRINK, Ops.PAD} else shape_to_str)(u.marg) + if u.op is Ops.BINARY: argst = f"<{len(u.arg)} bytes>" + if u.op is Ops.CONST and dtypes.is_float(u.dtype): argst = f"{u.val:g}" + wrap_len = 200 if u.op is Ops.SOURCE else 80 + label = f"{str(u.op).split('.')[1]}{(chr(10)+word_wrap(argst.replace(':', ''), wrap=wrap_len)) if u.arg is not None else ''}" + if u.dtype != dtypes.void: label += f"\n{u.dtype}" + for idx,x in enumerate(u.src[:1] if u.op in {Ops.STAGE, Ops.INDEX} else (u.src if u.op is not Ops.END else [])): + if x in excluded: + # walk through excluded movement ops to find the underlying CONST + cx = x + while cx.op in GroupOp.Movement and len(cx.src) >= 1 and cx.src[0] in excluded: cx = cx.src[0] + arg = f"{cx.val:g}" if cx.op is Ops.CONST and dtypes.is_float(cx.dtype) else cx.render() if cx.op is Ops.STACK else f"{cx.arg}" + label += f"\n{cx.op.name}{idx} {arg}" + (f" {cx.src[0].op}" if len(cx.src) else "") + try: + if len(rngs:=u.ranges): + label += f"\n({multirange_str(rngs, color=True)})" + if u._shape is not None: + label += f"\n{shape_to_str(u.shape)}" + if u.op in {Ops.CALL, Ops.FUNCTION}: + label += f"\n{u.src[0].key.hex()[:8]}\n{u.src[0].op}" + if u.op in {Ops.INDEX, Ops.STAGE}: + label += f"\n{u.render()}" if sum(len(s.toposort()) for s in u.src[1:]) < 30 else "\nINDEX TOO LARGE" + ranges: list[UOp] = [] + for us in u.src[1:]: ranges += [s for s in us.toposort() if s.op in {Ops.RANGE, Ops.SPECIAL}] + if ranges: label += "\n"+' '.join([f"{s.render()}={s.vmax+1}" for s in ranges]) + if u.op in {Ops.END, Ops.REDUCE} and len(trngs:=list(UOp.sink(*u.src[range_start[u.op]:]).ranges)): + label += "\n"+' '.join([f"{range_str(s, color=True)}({s.vmax+1})" for s in trngs]) + except Exception: + label += "\n" + ref = data.ref_map.get(canonicalize_ast(u.src[0])) if u.op in {Ops.CALL, Ops.FUNCTION} else None + if ref is not None: label += f"\ncodegen@{fmt_colored(data.ctxs[ref]['name'])}" + # NOTE: kernel already has metadata in arg + if TRACEMETA >= 2 and u.metadata is not None and u.op not in {Ops.CALL, Ops.FUNCTION}: label += "\n"+str(u.metadata) + # limit SOURCE labels line count + if u.op is Ops.SOURCE and len(lines:=label.split("\n")) > 40: + label = "\n".join(lines[:30]) + "\n..." + addrspace_color:str|None = None + with soft_err(): addrspace_color = addrspace_colors.get(u.addrspace, None) if u.addrspace is not None else None + graph[id(u)] = {"label":label, "src":[(i,id(x)) for i,x in enumerate(u.src)], "exclude":u in excluded, "color":uops_colors.get(u.op, "#ffffff"), + "ref":ref, "tag":repr(u.tag) if u.tag is not None else None, "addrspace":addrspace_color} + return graph + +def _reconstruct(data:VizData, a:int, depth:int|None=None): + if depth is None and a in data.all_uops: return data.all_uops[a] + op, dtype, src, arg, *rest = data.trace.uop_fields[a] + if depth is not None and depth <= 0: return UOp(op, dtype, (), arg, *rest) + ret = UOp(op, dtype, tuple(_reconstruct(data, s, None if depth is None else depth-1) for s in src), arg, *rest) + if depth is None: data.all_uops[a] = ret + return ret + +def get_full_rewrite(data:VizData, ctx:TrackedGraphRewrite, depth:int|None=None, update_sink=True) -> Generator[GraphRewriteDetails, None, None]: + next_sink, err = _reconstruct(data, ctx.sink, depth=depth), False + yield {"graph":uop_to_json(data, next_sink), "uop":pystr(next_sink), "change":None, "diff":None, "upat":None, "_sink":next_sink} + replaces: dict[UOp, UOp] = {} + for u0_num,u1_num,upat_loc,dur in ctx.matches: + if err: break + replaces[u0:=_reconstruct(data, u0_num, depth=depth)] = u1 = _reconstruct(data, u1_num, depth=depth) + try: new_sink = next_sink.substitute(replaces, walk=ctx.walk, enter_calls=ctx.enter_calls) if update_sink else next_sink + except RuntimeError: new_sink, err = UOp(Ops.REWRITE_ERROR, arg=traceback.format_exc()), True + match_repr = f"# {dur*1e6:.2f} us\n"+printable(upat_loc) + yield {"graph":(sink_json:=uop_to_json(data, new_sink)), "uop":pystr(new_sink), "change":[id(x) for x in u1.toposort() if id(x) in sink_json], + "diff":list(difflib.unified_diff(pystr(u0).splitlines(), pystr(u1).splitlines())), "upat":(upat_loc, match_repr), "_sink":new_sink} + if not ctx.bottom_up: next_sink = new_sink + +def get_sink_at(upats:tuple[str, ...], viz_data:VizData, kernel_idx:int, lin_idx:int, depth:int|None=None) -> UOp|None: + for s in get_full_rewrite(viz_data, ctx:=viz_data.trace.rewrites[kernel_idx][lin_idx], depth=depth): + if (s["upat"] is not None and any(n in s["upat"][1] for n in upats)) or len(ctx.matches) == 0: return s["_sink"] + return None + +# encoder helpers + +def enum_str(s, cache:dict[str, int]) -> int: + if (cret:=cache.get(s)) is not None: return cret + cache[s] = ret = len(cache) + return ret + +def option(s:int|None) -> int: return 0 if s is None else s+1 + +def rel_ts(ts:int|Decimal, start_ts:int, ctx:str="") -> int: + val = int(ts) - start_ts + if val < 0 or val > 0xFFFFFFFF: raise ValueError(f"timestamp out of range: {ctx} diff={val} (ts={ts} start={start_ts})") + return val + +# Profiler API + +def cpu_ts_diff(device_ts_diffs:dict[str, Decimal], device:str) -> Decimal: return device_ts_diffs.get(device, Decimal(0)) + +DevEvent = ProfileRangeEvent|ProfileGraphEntry|ProfilePointEvent +def flatten_events(profile:list[ProfileEvent], device_ts_diffs:dict[str, Decimal]) -> Generator[tuple[Decimal, Decimal, DevEvent], None, None]: + for e in profile: + if isinstance(e, ProfileRangeEvent): yield (e.st+(diff:=cpu_ts_diff(device_ts_diffs, e.device)), (e.en if e.en is not None else e.st)+diff, e) + elif isinstance(e, ProfilePointEvent): yield (e.ts, e.ts, e) + elif isinstance(e, ProfileGraphEvent): + cpu_ts = [] + for ent in e.ents: cpu_ts += [e.sigs[ent.st_id]+(diff:=cpu_ts_diff(device_ts_diffs, ent.device)), e.sigs[ent.en_id]+diff] + yield (st:=min(cpu_ts)), (et:=max(cpu_ts)), ProfileRangeEvent(f"{e.ents[0].device.split(':')[0]} Graph", f"batched {len(e.ents)}", st, et) + for i,ent in enumerate(e.ents): yield (cpu_ts[i*2], cpu_ts[i*2+1], ent) + +# normalize event timestamps and attach kernel metadata +def timeline_layout(data:VizData, dev_events:list[tuple[int, int, float, DevEvent]], start_ts:int, scache:dict[str, int]) -> bytes|None: + events:list[bytes] = [] + ei:ProfilePointEvent|None = None + for st,et,dur,e in dev_events: + if isinstance(e, ProfilePointEvent) and e.name == "exec": ei = e + if dur == 0: continue + name, key = e.name, None + fmt:dict = {} + if (ref:=data.ref_map.get(name)) is not None and ref < len(data.ctxs): + name = data.ctxs[ref]["name"] + if (ki:=data.ctxs[ref].get("ki")) is not None and ki.estimates is not None and ei is not None: + for est_key,est_val in (("FLOPS", ki.estimates.ops), ("B/s mem", ki.estimates.mem), ("B/s lds", ki.estimates.lds)): + with soft_err(lambda _: fmt.update({est_key:"ERR"})): fmt[est_key] = int(sym_infer(est_val, ei.arg['var_vals'])/(dur*1e-6)) + key = ei.key + elif isinstance(e.name, TracingKey): + name = e.name.display_name + ref = next((v for k in e.name.keys if (v:=data.ref_map.get(k)) is not None), None) + if isinstance(e.name.ret, str): fmt.update(json.loads(e.name.ret[4:]) if e.name.ret.startswith("JSON") else {"metadata":e.name.ret}) + elif isinstance(e.name.ret, int): fmt["B/s"], fmt["B"] = int(e.name.ret/(dur*1e-6)), e.name.ret + elif e.name.tb: fmt["tb"] = e.name.tb + events.append(struct.pack(" bytes: + ei_encoding:list[tuple[int, int, int, int]] = [] # <[u32, u32, u32, u8] [run id, display name, buffer number and mode (2 = r/w, 1 = w, 0 = r)] + for e in execs: + num = next(i for i,k in enumerate(e.arg["bufs"]) if k == key) + mode = 2 if (num in e.arg["inputs"] and num in e.arg["outputs"]) else 1 if (num in e.arg["outputs"]) else 0 + ei_encoding.append((e.key, enum_str(e.arg["name"], scache), num, mode)) + return struct.pack(" tuple[str, bytes|None]: + if k.startswith("LINE:"): + xy = [(rel_ts(e.ts, start_ts, f"line '{k}' on {e.device}"), e.key) for st,_,_,e in dev_events if isinstance(e, ProfilePointEvent)] + peaks.append(peak:=max([y for _,y in xy])) + return k.replace("LINE:", ""), struct.pack(" peak: peak = mem + if e.name == "exec" and e.arg["bufs"]: + for b in e.arg["bufs"]: buf_ei.setdefault(b, []).append(e) + if e.name == "free": + events.append(encode_mem_free(e.key, rel_ts(e.ts, start_ts, f"free on {e.device}"), buf_ei.pop(e.key, []), scache)) + mem -= temp.pop(e.key) + for t in temp: events.append(encode_mem_free(t, rel_ts(end_ts, start_ts, f"end_ts for {k}"), buf_ei.pop(t, []), scache)) + peaks.append(peak) + return f"{k} Memory", struct.pack(" tuple[tuple[int, int], ...]: + return ((0, 0),) if "Clock" in row else tuple((ord(ss[0][0]), int(ss[1])) if len(ss:=x.split(":"))>1 else (999,999) for x in row.split()) + +# *** Performance counters + +metrics:dict[str, Callable[[dict[str, tuple[int, int, int]]], str]] = { + "VALU utilization": lambda s: f"{100 * (s['SQ_INSTS_VALU'][0] / s['SQ_INSTS_VALU'][2]) / (s['GRBM_GUI_ACTIVE'][1] * 4):.1f}%", + "SALU utilization": lambda s: f"{100 * (s['SQ_INSTS_SALU'][0] / s['SQ_INSTS_SALU'][2]) / (s['GRBM_GUI_ACTIVE'][1] * 4):.1f}%", +} + +def unpack_pmc(e) -> dict: + agg_cols = ["Name", "Sum"] + rows:list[list] = [] + stats:dict[str, tuple[int, int, int]] = {} # name -> (sum, max, count) + view, ptr = memoryview(e.blob).cast('Q'), 0 + for s in e.sched: + sample_cols = ["XCC", "INST", "SE", "SA"] + [f"WGP:{i}" for i in range(s.wgp)] + row:list = [s.name, 0, {"cols":sample_cols, "rows":[]}] + max_val, cnt = 0, 0 + for sample in itertools.product(range(s.xcc), range(s.inst), range(s.se), range(s.sa)): + vals:list[int] = [] + # pack work group processors on the same se + for _ in range(s.wgp): + row[1] += (val:=int(view[ptr])) + max_val, cnt = max(max_val, val), cnt + 1 + vals.append(val) + ptr += 1 + row[2]["rows"].append(sample+tuple(vals)) + stats[s.name] = (row[1], max_val, cnt) + rows.append(row) + for name, fn in metrics.items(): + try: rows.append([name, fn(stats)]) + except KeyError: pass + return {"rows":rows, "cols":agg_cols} + +# ** on startup, list all the performance counter traces + +def load_amd_counters(data:VizData, profile:list) -> None: + counter_events:dict[tuple[int, int], dict] = {} + durations:dict[str, list[float]] = {} + prg_events:dict[int, ProfileProgramEvent] = {} + arch = "" + for e in profile: + if type(e).__name__ in {"ProfilePMCEvent", "ProfileSQTTEvent"}: + counter_events.setdefault((e.kern, e.exec_tag), {}).setdefault(type(e).__name__, []).append(e) + if isinstance(e, ProfileRangeEvent) and e.device.startswith("AMD") and e.en is not None: + durations.setdefault(str(e.name), []).append(float(e.en-e.st)) + if isinstance(e, ProfileProgramEvent) and e.device.startswith("AMD") and e.tag is not None: prg_events[e.tag] = e + if isinstance(e, ProfileDeviceEvent) and e.device.startswith("AMD"): arch = f"gfx{unwrap(e.props)['gfx_target_version']//1000}" + if len(counter_events) == 0: return None + data.ctxs.append({"name":"All Counters", "steps":[create_step("PMC", ("/all-pmc", len(data.ctxs), 0), (durations, all_counters:={}))]}) + run_number = {n:0 for n,_ in counter_events} + for (k, tag),v in counter_events.items(): + # use the colored name if it exists + name = data.ctxs[r]["ki"].name if (r:=data.ref_map.get(pname:=prg_events[k].name)) is not None else pname + run_number[k] += 1 + steps:list[dict] = [] + if (pmc:=v.get("ProfilePMCEvent")): + steps.append(create_step("PMC", ("/prg-pmc", len(data.ctxs), len(steps)), pmc[0])) + all_counters[(name, run_number[k], pname)] = pmc[0] + # to decode a SQTT trace, we need the raw stream, program binary and device properties + if (sqtt:=v.get("ProfileSQTTEvent")): + for e in sqtt: + if e.itrace: steps.append(create_step(f"SE:{e.se} PKTS", (f"/sqtt-{e.se}",len(data.ctxs),len(steps)), data=(e.blob,prg_events[k].lib,arch))) + try: + with Context(DEBUG=0): from extra.sqtt.roc import unpack_occ + steps.append(create_step("OCC", ("/amd-sqtt-occ", len(data.ctxs), len(steps)), + data={"fxn":unpack_occ, "args":((k, tag), sqtt, prg_events[k], arch)})) + except Exception: pass + data.ctxs.append({"name":f"SQTT {name}"+(f" n{run_number[k]}" if run_number[k] > 1 else ""), "steps":steps}) + +wave_colors = {"WMMA": "#1F7857", **{x:"#ffffc0" for x in ["VALU", "VINTERP"]}, "SALU": "#cef263", "SMEM": "#ffc0c0", "STORE": "#4fa3cc", + **{x:"#b2b7c9" for x in ["VMEM", "SGMEM"]}, "LDS": "#9fb4a6", "IMMEDIATE": "#f3b44a", "BARRIER": "#d00000", + "JUMP_NO": "#fb8500", "JUMP": "#ffb703", "WAVERDY": "#1a2a2a"} + +def sqtt_timeline(data:bytes, lib:bytes, target:str) -> Generator[ProfileEvent, None, None]: + from tinygrad.renderer.amd.sqtt import (map_insts, InstructionInfo, PacketType, INST, InstOp, VALUINST, IMMEDIATE, IMMEDIATE_MASK, VMEMEXEC, + ALUEXEC, INST_RDNA4, InstOpRDNA4, TS_DELTA_OR_MARK, TS_DELTA_OR_MARK_RDNA4, CDNA_INST, InstOpCDNA, + WAVEEND, WAVEEND_RDNA4, CDNA_WAVEEND, WAVERDY) + pc_map = {addr:str(inst) for addr,inst in amd_decode(lib, target).items()} + row_ends:dict[str, Decimal] = {} + row_counts:dict[str, itertools.count] = {} + curr_barrier:dict[int, ProfileRangeEvent] = {} + exec_pending:dict[str, list[tuple[str, str]]] = {} + dispatch_to_exec = {"WMMA":"VALU", "VALU":"VALU", "VALU1":"VALU", "VALUT":"VALU", "VALUB":"VALU", "VALUINST":"VALU", "VINTERP":"VALU", + "SGMEM":"VMEM", "FLAT":"VMEM", "LDS":"LDS", "SALU":"SALU", "SMEM":"SALU", "VMEM":"VMEM"} + def add(name:str, p:PacketType, wave:int|None=None, info:InstructionInfo|None=None) -> Generator[ProfileEvent, None, None]: + row = f"WAVE:{wave}" if (wave:=getattr(p, "wave", wave)) is not None else f"{p.__class__.__name__}:0 {name.replace('_ALT', '')}" + # by default we extend the packet to one cycle after timestamp + start_time, end_time = p._time, p._time+1 + # exec links to dispatch, dispatch links to PC + link:dict|None = {"pc":info.pc} if info else None + if isinstance(p, (ALUEXEC, VMEMEXEC)): + dispatch_id, op_type = exec_pending[name].pop(0) + # wmma exec gets its own color and its own row on rdna4 + if op_type.startswith("WMMA"): + name = name+"_WMMA" + if not op_type.startswith("WMMA_VALU"): row = "ALUEXEC:0 WMMA" + # transcendental valu gets its own row + if op_type.startswith("VALUT"): row = "ALUEXEC:0 TFU" + # extend execs by the op type's known duration, p._time marks the first or last cycle based on the op type + duration = int(dur_match.group(1)) if (dur_match:=re.match(r".*_(\d+)$", op_type)) else 1 + if any(ss in row for ss in ("SALU", "TFU", "VMEM", "LDS")): start_time, end_time = p._time, p._time+duration + else: start_time, end_time = p._time-duration, p._time + link = {"link":dispatch_id} + # queue inst dispatches + idx = next(row_counts.setdefault(row, itertools.count(0))) + if isinstance(p, (VALUINST, INST, INST_RDNA4)) and (exec_type:=dispatch_to_exec.get(name.replace("OTHER_", "").split("_")[0])) is not None: + if name.startswith("OTHER_"): exec_type = f"{exec_type}_ALT" + # detect rdna3 wmma from the asm, only rdna4 has an op type for it + if isinstance(p, VALUINST) and (asm:=getattr(unwrap(info).inst, "op_name", "")).startswith("V_WMMA"): + name = f"WMMA_VALU_{16 if 'IU4' in asm else 32}" + exec_pending.setdefault(exec_type, []).append((f"{row}-{idx}", name)) + # construct and yield the event for this packet + if row not in row_ends: yield ProfilePointEvent(row, "JSON", "pcMap", pc_map, ts=Decimal(0)) + yield (e:=ProfileRangeEvent(row, TracingKey(name, ret="JSON"+json.dumps(link) if link else None), Decimal(start_time), Decimal(end_time))) + row_ends[row] = unwrap(e.en) + # barrier on this wave extends to fill the time it was waiting + if wave is not None: + if (barrier:=curr_barrier.pop(wave, None)) is not None: barrier.en = Decimal(p._time) + if name in {"BARRIER", "BARRIER_SIGNAL"}: curr_barrier[wave] = e + NS_PER_TICK = 10 # 100MHz + prev_pair:tuple[int, int]|None = None # (shader, realtime) + yield ProfilePointEvent("", "JSON", "waveColors", list(wave_colors.items()), ts=Decimal(0)) + for p, info in map_insts(data, lib, target): + if isinstance(p, (TS_DELTA_OR_MARK, TS_DELTA_OR_MARK_RDNA4)) and p.is_marker: + pair = (p._time, p.delta) + if prev_pair is None: prev_pair = pair + else: + (s0, r0), (s1, r1) = prev_pair, pair + freq_hz = (s1 - s0) * 1_000_000_000 // ((r1 - r0) * NS_PER_TICK) + yield ProfilePointEvent("LINE:Shader Clock", "freq_hz", freq_hz, ts=Decimal(p._time)) + prev_pair = pair + if isinstance(p, (INST, INST_RDNA4, CDNA_INST)): + name = p.op.name if isinstance(p.op, (InstOp, InstOpRDNA4, InstOpCDNA)) else f"0x{p.op:02x}" + yield from add(name, p, info=info) + if isinstance(p, (VALUINST, IMMEDIATE, WAVEEND, WAVEEND_RDNA4, CDNA_WAVEEND)): yield from add(p.__class__.__name__, p, info=info) + if isinstance(p, IMMEDIATE_MASK): yield from add("IMMEDIATE", p, wave=unwrap(info).wave, info=info) + if isinstance(p, WAVERDY): + for wave in range(16): + if p.mask & (1 << wave): + if wave in curr_barrier: yield from add("WAVERDY", p, wave=wave) + if isinstance(p, (VMEMEXEC, ALUEXEC)): + name = str(p.src).split('.')[1] + if name == "VALU_SALU": + yield from add("VALU", p) + yield from add("SALU", p) + else: + yield from add(name, p) + +def device_sort_fn(k:str) -> tuple: + special = {"GC": 0, "USER": 1, "TINY": 2, "ALLDEVS":100, "DISK": 999} + is_memory = k.endswith(" Memory") + p = k.split(" ")[0].split(":") + dev_base = p[0] if len(p) < 2 or not p[1].isdigit() else f"{p[0]}:{p[1]}" + return (is_memory, special.get(p[0], special['ALLDEVS']), dev_base, k) + +def get_profile(data:VizData, profile:list[ProfileEvent], sort_fn:Callable[[str], Any]=device_sort_fn) -> bytes|None: + # start by getting the time diffs + device_ts_diffs:dict[str, Decimal] = {} + device_decoders:dict[str, Callable[[VizData, list[ProfileEvent]], None]] = {} + for ev in profile: + if isinstance(ev, ProfileDeviceEvent): + device_ts_diffs[ev.device] = ev.tdiff + if (d:=ev.device.split(":")[0]) == "AMD": device_decoders[d] = load_amd_counters + if d == "NV": device_decoders[d] = load_nv_counters + # load device specific counters + for fxn in device_decoders.values(): fxn(data, profile) + # map events per device + dev_events:dict[str, list[tuple[int, int, float, DevEvent]]] = {} + markers:list[ProfilePointEvent] = [] + ext_data:dict[str, Any] = {} + start_ts:int|None = None + end_ts:int|None = None + for ts,en,e in flatten_events(profile, device_ts_diffs): + dev_events.setdefault(e.device,[]).append((st:=int(ts), et:=int(en), float(en-ts), e)) + if start_ts is None or st < start_ts: start_ts = st + if end_ts is None or et > end_ts: end_ts = et + if isinstance(e, ProfilePointEvent) and e.name == "marker": markers.append(e) + if isinstance(e, ProfilePointEvent) and e.name == "JSON": ext_data[e.key] = e.arg + if start_ts is None: return None + # return layout of per device events + layout:dict[str, bytes|None] = {} + scache:dict[str, int] = {} + peaks:list[int] = [] + dtype_size:dict[str, int] = {} + for k,v in dev_events.items(): + v.sort(key=lambda e:e[0]) + layout[k] = timeline_layout(data, v, start_ts, scache) + layout.update([graph_layout(k, v, start_ts, unwrap(end_ts), peaks, dtype_size, scache)]) + sorted_layout = sorted([k for k,v in layout.items() if v is not None], key=sort_fn) + ret = [b"".join([struct.pack(" None: + steps:list[dict] = [] + sm_version = {e.device:e.props.get("sm_version", 0x800) for e in profile if isinstance(e, ProfileDeviceEvent) and e.props is not None} + run_number:dict[str, int] = {} + for e in profile: + if type(e).__name__ == "ProfilePMAEvent": + run_number[e.kern] = run_num = run_number.get(e.kern, 0)+1 + steps.append(create_step(f"PMA {e.kern}"+(f"n{run_num}" if run_num>1 else ""), ("/prg-pma-pkts", len(data.ctxs), len(steps)), + data=(e.blob, sm_version[e.device]))) + if steps: data.ctxs.append({"name":"All Counters", "steps":steps}) + +def pma_timeline(blob:bytes, sm_version:int) -> list[ProfileEvent]: + from extra.nv_pma.decode import decode, decode_tpc_id + ret:list[ProfileEvent] = [] + rows:dict[str, None] = {} + tpc_count:dict[int, int] = {} + # assume every sample is 32 cycles + cycles_per_sample = 32 + for s, tpc_id in decode(blob, sm_version): + if len(ret) > getenv("MAX_SQTT_PKTS", 50_000): break + gpc, tpc, sm = decode_tpc_id(tpc_id) + tpc_count[tpc_id] = (n:=tpc_count.get(tpc_id,0)) + 1 + rows.setdefault(row:=f"GPC:{gpc} TPC:{tpc} SM:{sm} WAVE:{s.wave_id}") + ret.append(ProfileRangeEvent(row, TracingKey(s.stall_reason.name, ret=f"pc=0x{s.pc_offset:06x} active={s.active}"), + Decimal(n*cycles_per_sample), Decimal((n+1)*cycles_per_sample))) + return [ProfilePointEvent(r, "start", r, ts=Decimal(0)) for r in rows]+ret + +# ** Assembly static analyzers + +def get_stdout(f: Callable) -> str: + buf = io.StringIO() + try: + with redirect_stdout(buf), redirect_stderr(buf): f() + except Exception: traceback.print_exc(file=buf) + return buf.getvalue() + +def get_elf_section(lib:bytes, name:str): + from tinygrad.runtime.support.elf import elf_loader + return next((sh for sh in elf_loader(lib)[1] if sh.name == name)) + +def amd_decode(lib:bytes, target:str) -> dict[int, Inst]: + text = get_elf_section(lib, ".text") + off, buf = text.header.sh_addr, text.content + arch = "rdna3" if target.startswith("gfx11") else "rdna4" if target.startswith("gfx12") else "cdna" + addr_table:dict[int, Inst] = {} + offset = 0 + while offset < len(buf): + remaining = buf[offset:] + fmt = detect_format(remaining, arch) + decoded = fmt.from_bytes(remaining) + addr_table[off+offset] = decoded + offset += decoded.size() + return addr_table + +def parse_branch(inst) -> int|None: + if "branch" in getattr(inst, "op_name", "").lower(): + x = inst.simm16 & 0xffff + return (x - 0x10000 if x & 0x8000 else x)*4 + return None + +COND_TAKEN, COND_NOT_TAKEN, UNCOND = range(3) +def amdgpu_cfg(lib:bytes, target:str) -> dict: + # decode + pc_table = amd_decode(lib, target) + # get leaders + leaders:set[int] = {next(iter(pc_table))} + for pc, inst in pc_table.items(): + if (offset:=parse_branch(inst)) is not None: leaders.update((pc+inst.size()+offset, pc+inst.size())) + # build the cfg + curr:int|None = None + blocks:dict[int, list[int]] = {} + paths:dict[int, dict[int, int]] = {} + for pc, inst in pc_table.items(): + if pc in leaders: + paths[curr:=pc] = {} + blocks[pc] = [] + else: assert curr is not None, f"no basic block found for {pc}" + blocks[curr].append(pc) + # otherwise a basic block can have exactly one or two paths + nx = pc+inst.size() + if (offset:=parse_branch(inst)) is not None: + if inst.op_name == "S_BRANCH": paths[curr][nx+offset] = UNCOND + else: paths[curr].update([(nx+offset, COND_TAKEN), (nx, COND_NOT_TAKEN)]) + elif nx in leaders: paths[curr][nx] = UNCOND + pc_tokens:dict[int, list[dict]] = {} + from tinygrad.renderer.amd.dsl import Reg + for pc, inst in pc_table.items(): + pc_tokens[pc] = tokens = [] + for name, f in inst._fields: + if isinstance(val:=getattr(inst, name), Reg): tokens.append({"st":val.fmt(), "keys":[f"r{val.offset+i}" for i in range(val.sz)], "kind":1}) + elif name in {"op","opx","opy"}: tokens.append({"st":(op_name:=val.name.lower()), "keys":[op_name], "kind":0}) + elif name != "encoding" and val != f.default: tokens.append({"st":(s:=repr(val)), "keys":[s], "kind":1}) + # show a smaller view for repeated instructions in the graph + lines:list[str] = [] + disasm = {pc:str(inst) for pc,inst in pc_table.items()} + asm_width = max(len(asm) for asm in disasm.values()) + for pcs in blocks.values(): + new_pcs:list[int] = [] + i, n = 0, len(pcs) + while i < n: + j = i+1 + while j1: + pc_tokens[pcs[i]].append({"st":f"({j-i}x)", "keys":[], "kind":0}) + for k in range(i+1, j): del pc_tokens[pcs[k]] + lines.append(f"{disasm[pcs[i]]:<{asm_width}} # {pcs[i]:012X}"+(f"...{pcs[j-1]:012X} ({j-i}x)" if j-i>1 else "")) + i = j + pcs[:] = new_pcs + from tinygrad.runtime.autogen import amdgpu_kd + kd = amdgpu_kd.llvm_amdhsa_kernel_descriptor_t.from_buffer_copy(bytearray(get_elf_section(lib, ".rodata").content)) + vgpr_gran = kd.compute_pgm_rsrc1 & amdgpu_kd.COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT + return {"data":{"blocks":blocks, "paths":paths, "pc_tokens":pc_tokens}, "src":"\n".join(lines), "lang":"python", + "metadata":[[{"label":f"{r} Alloc", "value":v} for r,v in [("VGPR", (vgpr_gran+1)*8-7), ("LDS", kd.group_segment_fixed_size), + ("Scratch", kd.private_segment_fixed_size)] if v>0]]} + +# ** Main render function to get the complete details about a trace event + +def get_render(viz_data:VizData, query:str, **kwargs) -> dict: + url = urlparse(query) + i, j, fmt = get_int(qs:=parse_qs(url.query), "ctx"), get_int(qs, "step"), url.path.lstrip("/") + data = viz_data.ctxs[i]["steps"][j]["_data"] + if fmt == "graph-rewrites": return {"value":get_full_rewrite(viz_data, viz_data.trace.rewrites[i][j], **kwargs), "content_type":"text/event-stream"} + if fmt == "uops": + if (sink:=get_sink_at(("do_linearize",), viz_data, i, data)) is None: return {"src":"No linear found"} + return {"src":sink.arg} if sink.op is Ops.REWRITE_ERROR else {"src":get_stdout(lambda: print_uops(list(unwrap(sink).src[1].src)))} + if fmt == "code": + if (sink:=get_sink_at(("do_render",), viz_data, i, data, depth=1)) is None: return {"src":"No source found"} + return {"src":sink.arg} if sink.op is Ops.REWRITE_ERROR else {"src":sink.src[2].arg, "lang":"cpp"} + if fmt == "asm": + ret:dict = {} + renderer, idx = data + if (sink:=get_sink_at(("do_compile","do_assemble"), viz_data, i, idx, depth=1)) is None: return {"src":"No binary found"} + if sink.op is Ops.REWRITE_ERROR: return {"src":sink.arg} + lib:bytes = sink.src[3].arg + if renderer.target.arch.startswith("gfx"): + with soft_err(lambda err: ret.update(err)): ret.update(amdgpu_cfg(lib, renderer.target.arch)) + else: ret["src"] = get_stdout(lambda: renderer.compiler.disassemble(lib)) + return ret + if fmt == "all-pmc": + durations, pmc = data + ret = {"cols":{}, "rows":[]} + for (name, n, k),events in pmc.items(): + pmc_table = unpack_pmc(events) + ret["cols"].update([(r[0], None) for r in pmc_table["rows"]]) + ret["rows"].append((name, durations[k][n-1], *[r[1] for r in pmc_table["rows"]])) + ret["cols"] = ["Kernel", "Duration", *ret["cols"]] + return ret + if fmt == "prg-pmc": return unpack_pmc(data) + if fmt.startswith("sqtt"): + ret = {} + with soft_err(lambda err:ret.update(err)): + if (events:=get_profile(viz_data, list(itertools.islice(sqtt_timeline(*data), getenv("MAX_SQTT_PKTS", 50_000))), sort_fn=row_tuple)): + ret = {"value":events, "content_type":"application/octet-stream"} + else: ret = {"src":"No SQTT trace on this SE."} + return ret + # viewers for the amd decoder in extra + if fmt.startswith("amd-sqtt"): return data["fxn"](viz_data, i, j, *data["args"]) + if fmt == "cu-sqtt": return {"value":get_profile(viz_data, data, sort_fn=row_tuple), "content_type":"application/octet-stream"} + if fmt == "prg-pma-pkts": + ret = {} + with soft_err(lambda err:ret.update(err)): + if (events:=get_profile(viz_data, pma_timeline(*data), sort_fn=row_tuple)): ret = {"value":events, "content_type":"application/octet-stream"} + else: ret = {"src":"No PMA samples found."} + return ret + return data + +# ** HTTP server + +def get_int(query:dict[str, list[str]], k:str) -> int: return int(query.get(k,["0"])[0]) + +def filter_keys(data:dict) -> dict: return {k:v for k,v in data.items() if not k.startswith("_")} + +class Handler(HTTPRequestHandler): + def do_GET(self): + ret, status_code, content_type = b"", 200, "text/html" + + if (url:=urlparse(self.path)).path == "/": + with open(os.path.join(os.path.dirname(__file__), "index.html"), "rb") as f: ret = f.read() + elif self.path.startswith(("/assets/", "/js/")) and '/..' not in self.path: + try: + with open(os.path.join(os.path.dirname(__file__), self.path.strip('/')), "rb") as f: ret = f.read() + if url.path.endswith(".js"): content_type = "application/javascript" + if url.path.endswith(".css"): content_type = "text/css" + except FileNotFoundError: status_code = 404 + + elif url.path == "/ctxs": + lst = [{"name":c["name"], "steps":[filter_keys(s) for s in c["steps"]]} for c in data.ctxs] + ret, content_type = json.dumps(lst).encode(), "application/json" + elif url.path == "/get_profile" and profile_ret: ret, content_type = profile_ret, "application/octet-stream" + else: + if not (render_src:=get_render(data, self.path)): status_code = 404 + else: + if "content_type" in render_src: ret, content_type = render_src["value"], render_src["content_type"] + else: ret, content_type = json.dumps(render_src).encode(), "application/json" + if content_type == "text/event-stream": return self.stream_json(render_src["value"]) + + return self.send_data(ret, content_type, status_code) + +# ** main loop + +def reloader(): + mtime = os.stat(__file__).st_mtime + while not stop_reloader.is_set(): + if mtime != os.stat(__file__).st_mtime: + print("reloading server...") + os.execv(sys.executable, [sys.executable] + sys.argv) + time.sleep(0.1) + +T = TypeVar("T") +# unpickling may load libraries, turn off DEBUG=3 output +@Context(DEBUG=0) +def load_pickle(path:str, default:T) -> T: + if not os.path.exists(path): return default + with open(path, "rb") as f: return pickle.load(f) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--rewrites-path', type=str, help='Path to rewrites', default=temp("rewrites.pkl", append_user=True)) + parser.add_argument('--profile-path', type=str, help='Path to profile', default=temp("profile.pkl", append_user=True)) + args = parser.parse_args() + + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + if s.connect_ex(((HOST:="http://127.0.0.1").replace("http://", ""), PORT:=getenv("PORT", 8000))) == 0: + raise RuntimeError(f"{HOST}:{PORT} is occupied! use PORT= to change.") + stop_reloader = threading.Event() + multiprocessing.current_process().name = "VizProcess" + Context(ALLOW_DEVICE_USAGE=0).__enter__() # disallow opening of devices + st = time.perf_counter() + print("*** viz is starting") + + data = VizData(load_pickle(args.rewrites_path, default=RewriteTrace([], [], {}))) + load_rewrites(data) + profile_ret = get_profile(data, load_pickle(args.profile_path, default=[])) + + server = TCPServerWithReuse(('', PORT), Handler) + reloader_thread = threading.Thread(target=reloader) + reloader_thread.start() + print(colored(f"*** ready in {(time.perf_counter()-st)*1e3:4.2f}ms", "green"), flush=True) + if len(getenv("BROWSER", "")) > 0: webbrowser.open(f"{HOST}:{PORT}") + try: server.serve_forever() + except KeyboardInterrupt: + print("*** viz is shutting down...") + stop_reloader.set() diff --git a/artifacts/runtime/apply_boot_branding.py b/artifacts/runtime/apply_boot_branding.py new file mode 100644 index 000000000..284657a45 --- /dev/null +++ b/artifacts/runtime/apply_boot_branding.py @@ -0,0 +1,317 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import shutil +import subprocess +import sys +import time +from collections.abc import Callable +from pathlib import Path + +_COLOR = sys.stdout.isatty() and os.environ.get("NO_COLOR") is None + + +def _paint(text: str, code: str) -> str: + return f"\033[{code}m{text}\033[0m" if _COLOR else text + + +ROOT = Path(__file__).resolve().parents[2] +ASSET_DIR = ROOT / "artifacts" / "runtime" / "boot_branding" +BG_ASSET = ASSET_DIR / "bg.jpg" +SPLASH_BMP_ASSET = ASSET_DIR / "splash_embedded.bmp" + +BG_TARGET = Path("/usr/comma/bg.jpg") +SPLASH_TARGET = Path("/dev/block/bootdevice/by-name/splash") +SPLASH_BMP_OFFSET = 16384 + +PASSWD_PATH = Path("/etc/passwd") +SHADOW_PATH = Path("/etc/shadow") +IQ_USER = "iq" +IQ_GECOS = "IQ.Pilot" +SOURCE_USER = "comma" + +STATE_DIR = Path("/data/iqpilot_boot_branding") +BACKUP_DIR = STATE_DIR / "backups" +META_PATH = BACKUP_DIR / "metadata.json" +BG_BACKUP = BACKUP_DIR / "bg.jpg.orig" +SPLASH_BACKUP = BACKUP_DIR / "splash.partition.orig.img" + + +def sha256_bytes(data: bytes) -> str: + return hashlib.sha256(data).hexdigest() + + +def sha256_path(path: Path) -> str: + h = hashlib.sha256() + with path.open("rb") as f: + for chunk in iter(lambda: f.read(1024 * 1024), b""): + h.update(chunk) + return h.hexdigest() + + +def run(cmd: list[str], capture_output: bool = False) -> str: + res = subprocess.run(cmd, check=True, text=True, capture_output=capture_output) + return res.stdout.strip() if capture_output else "" + + +def get_root_mount_options() -> str: + return run(["findmnt", "-no", "OPTIONS", "/"], capture_output=True) + + +def remount_root(mode: str) -> None: + run(["mount", "-o", mode, "/"]) + + +def splash_size() -> int: + return int(run(["blockdev", "--getsize64", str(SPLASH_TARGET)], capture_output=True)) + + +def read_splash_bytes(offset: int, size: int) -> bytes: + with SPLASH_TARGET.open("rb") as f: + f.seek(offset) + return f.read(size) + + +def write_splash_bytes(offset: int, data: bytes) -> None: + with SPLASH_TARGET.open("r+b", buffering=0) as f: + f.seek(offset) + f.write(data) + f.flush() + os.fsync(f.fileno()) + + +def backup_if_missing() -> None: + BACKUP_DIR.mkdir(parents=True, exist_ok=True) + + if not BG_BACKUP.exists(): + shutil.copy2(BG_TARGET, BG_BACKUP) + + if not SPLASH_BACKUP.exists(): + with SPLASH_TARGET.open("rb") as src, SPLASH_BACKUP.open("wb") as dst: + remaining = splash_size() + while remaining > 0: + chunk = src.read(min(1024 * 1024, remaining)) + if not chunk: + break + dst.write(chunk) + remaining -= len(chunk) + + if not META_PATH.exists(): + splash_backup_hash = sha256_path(SPLASH_BACKUP) + meta = { + "bg_backup_sha256": sha256_path(BG_BACKUP), + "splash_backup_sha256": splash_backup_hash, + "bg_asset_sha256": sha256_path(BG_ASSET) if BG_ASSET.exists() else None, + "splash_asset_sha256": sha256_path(SPLASH_BMP_ASSET) if SPLASH_BMP_ASSET.exists() else None, + "splash_bmp_offset": SPLASH_BMP_OFFSET, + } + META_PATH.write_text(json.dumps(meta, indent=2) + "\n", encoding="utf-8") + + +def _line_for_user(text: str, user: str) -> str | None: + prefix = f"{user}:" + for line in text.splitlines(): + if line.startswith(prefix): + return line + return None + + +def _expected_passwd_line(source_passwd_line: str) -> str: + """Build the iq passwd line by cloning comma's UID/GID/home/shell.""" + fields = source_passwd_line.split(":") + if len(fields) < 7: + raise ValueError(f"malformed passwd line for {SOURCE_USER!r}: {source_passwd_line!r}") + _name, passwd_x, uid, gid, _gecos, home, shell = fields[:7] + return f"{IQ_USER}:{passwd_x}:{uid}:{gid}:{IQ_GECOS}:{home}:{shell}" + + +def _expected_shadow_line(days_since_epoch: int) -> str: + return f"{IQ_USER}:!:{days_since_epoch}:0:99999:7:::" + + +def _replace_or_append(text: str, user: str, new_line: str) -> str: + prefix = f"{user}:" + out: list[str] = [] + replaced = False + for line in text.splitlines(): + if line.startswith(prefix): + if not replaced: + out.append(new_line) + replaced = True + continue + out.append(line) + if not replaced: + out.append(new_line) + return "\n".join(out) + "\n" + + +def ensure_iq_user( + passwd_path: Path | None = None, + shadow_path: Path | None = None, + remount: Callable[[str], None] | None = None, + root_opts: str | None = None, + now: Callable[[], float] | None = None, +) -> bool: + """Ensure an `iq` user exists as a UID-1000 alias of `comma`. + + Idempotent: returns False when /etc/passwd and /etc/shadow already have a + correctly-shaped `iq` entry, True when either file was modified. + """ + passwd_path = passwd_path if passwd_path is not None else PASSWD_PATH + shadow_path = shadow_path if shadow_path is not None else SHADOW_PATH + remount = remount if remount is not None else remount_root + now = now if now is not None else time.time + + passwd_text = passwd_path.read_text(encoding="utf-8") if passwd_path.exists() else "" + shadow_text = shadow_path.read_text(encoding="utf-8") if shadow_path.exists() else "" + + source_line = _line_for_user(passwd_text, SOURCE_USER) + if source_line is None: + # Without a comma user to clone from we'd create a broken iq entry; bail. + return False + + expected_passwd = _expected_passwd_line(source_line) + passwd_line = _line_for_user(passwd_text, IQ_USER) + shadow_line = _line_for_user(shadow_text, IQ_USER) + + passwd_ok = passwd_line == expected_passwd + shadow_ok = shadow_line is not None and shadow_line.startswith(f"{IQ_USER}:!:") + if passwd_ok and shadow_ok: + return False + + days = int(now() // 86400) + new_passwd = _replace_or_append(passwd_text, IQ_USER, expected_passwd) + new_shadow = _replace_or_append(shadow_text, IQ_USER, _expected_shadow_line(days)) + + opts = root_opts if root_opts is not None else get_root_mount_options() + remounted = False + try: + remount("remount,rw") + remounted = True + if not passwd_ok: + passwd_path.write_text(new_passwd, encoding="utf-8") + if not shadow_ok: + shadow_path.write_text(new_shadow, encoding="utf-8") + finally: + if remounted: + remount(f"remount,{opts}") + + return True + + +def apply_branding() -> bool: + if not BG_ASSET.exists() or not SPLASH_BMP_ASSET.exists(): + return False + + backup_if_missing() + + bg_asset_bytes = BG_ASSET.read_bytes() + splash_asset_bytes = SPLASH_BMP_ASSET.read_bytes() + + current_bg_hash = sha256_path(BG_TARGET) + current_splash_hash = sha256_bytes(read_splash_bytes(SPLASH_BMP_OFFSET, len(splash_asset_bytes))) + + bg_asset_hash = sha256_bytes(bg_asset_bytes) + splash_asset_hash = sha256_bytes(splash_asset_bytes) + + if current_bg_hash == bg_asset_hash and current_splash_hash == splash_asset_hash: + return False + + root_opts = get_root_mount_options() + remounted = False + try: + if current_bg_hash != bg_asset_hash: + remount_root("remount,rw") + remounted = True + BG_TARGET.write_bytes(bg_asset_bytes) + + if current_splash_hash != splash_asset_hash: + write_splash_bytes(SPLASH_BMP_OFFSET, splash_asset_bytes) + run(["sync"]) + finally: + if remounted: + remount_root(f"remount,{root_opts}") + + return True + + +def restore_branding() -> bool: + if not BG_BACKUP.exists() or not SPLASH_BACKUP.exists(): + return False + + root_opts = get_root_mount_options() + remounted = False + try: + remount_root("remount,rw") + remounted = True + shutil.copy2(BG_BACKUP, BG_TARGET) + + with SPLASH_BACKUP.open("rb") as src, SPLASH_TARGET.open("r+b", buffering=0) as dst: + while True: + chunk = src.read(1024 * 1024) + if not chunk: + break + dst.write(chunk) + dst.flush() + os.fsync(dst.fileno()) + run(["sync"]) + finally: + if remounted: + remount_root(f"remount,{root_opts}") + + return True + + +def status() -> dict[str, object]: + result: dict[str, object] = { + "bg_asset_exists": BG_ASSET.exists(), + "splash_asset_exists": SPLASH_BMP_ASSET.exists(), + "bg_backup_exists": BG_BACKUP.exists(), + "splash_backup_exists": SPLASH_BACKUP.exists(), + } + if BG_ASSET.exists() and BG_TARGET.exists(): + result["bg_asset_sha256"] = sha256_path(BG_ASSET) + result["bg_current_sha256"] = sha256_path(BG_TARGET) + if SPLASH_BMP_ASSET.exists() and SPLASH_TARGET.exists(): + splash_asset_bytes = SPLASH_BMP_ASSET.read_bytes() + result["splash_asset_sha256"] = sha256_bytes(splash_asset_bytes) + result["splash_current_sha256"] = sha256_bytes(read_splash_bytes(SPLASH_BMP_OFFSET, len(splash_asset_bytes))) + return result + + +def main() -> int: + if os.geteuid() != 0: + raise SystemExit("apply_boot_branding.py must run as root") + + parser = argparse.ArgumentParser() + group = parser.add_mutually_exclusive_group() + group.add_argument("--restore", action="store_true") + group.add_argument("--status", action="store_true") + args = parser.parse_args() + + if args.status: + print(json.dumps(status(), indent=2)) + return 0 + + changed = restore_branding() if args.restore else apply_branding() + + try: + iq_changed = ensure_iq_user() + except Exception as e: # noqa: BLE001 + iq_changed = False + print(_paint(f"ensure_iq_user failed: {e}", "1;38;5;203")) + + if changed or iq_changed: + print(_paint("changed", "38;5;114")) + else: + print(_paint("no-change", "2;38;5;246")) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/artifacts/runtime/boot_branding/bg.jpg b/artifacts/runtime/boot_branding/bg.jpg new file mode 100644 index 000000000..90851aefe Binary files /dev/null and b/artifacts/runtime/boot_branding/bg.jpg differ diff --git a/artifacts/runtime/boot_branding/splash_embedded.bmp b/artifacts/runtime/boot_branding/splash_embedded.bmp new file mode 100644 index 000000000..71b3dab6f Binary files /dev/null and b/artifacts/runtime/boot_branding/splash_embedded.bmp differ diff --git a/artifacts/runtime/ensure_private_installed.sh b/artifacts/runtime/ensure_private_installed.sh new file mode 100644 index 000000000..6593075ae --- /dev/null +++ b/artifacts/runtime/ensure_private_installed.sh @@ -0,0 +1,381 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." >/dev/null && pwd )" +INSTALL_ROOT="${ROOT_DIR}/.iqpilot" +BUNDLES_ROOT="${INSTALL_ROOT}/bundles" +VERIFY_SCRIPT="${ROOT_DIR}/artifacts/runtime/verify_proprietary_bundle.py" + +manifest_hash() { + local manifest_path="$1" + if command -v sha256sum >/dev/null 2>&1; then + sha256sum "${manifest_path}" | awk '{print $1}' + else + shasum -a 256 "${manifest_path}" | awk '{print $1}' + fi +} + +NAVD_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_navd_private" +HEPHA_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_hephaestusd_private" +MODEL_SELECTOR_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_model_selector_private" +ALC_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_alc_private" +COMMANDER_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_commander_private" +UPDATER_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_updater_private" +VALHALLA_RUNTIME_BUNDLE="${ROOT_DIR}/artifacts/iqpilot_valhalla_runtime" +BUNDLE_INSTALL_NAVD="${BUNDLES_ROOT}/iqpilot_navd_private" +BUNDLE_INSTALL_HEPHA="${BUNDLES_ROOT}/iqpilot_hephaestusd_private" +BUNDLE_INSTALL_MODEL_SELECTOR="${BUNDLES_ROOT}/iqpilot_model_selector_private" +BUNDLE_INSTALL_ALC="${BUNDLES_ROOT}/iqpilot_alc_private" +BUNDLE_INSTALL_COMMANDER="${BUNDLES_ROOT}/iqpilot_commander_private" +BUNDLE_INSTALL_UPDATER="${BUNDLES_ROOT}/iqpilot_updater_private" +BUNDLE_INSTALL_VALHALLA_RUNTIME="${BUNDLES_ROOT}/iqpilot_valhalla_runtime" +NAVD_STATE_FILE="${INSTALL_ROOT}/.installed_navd_manifest.sha256" +HEPHA_STATE_FILE="${INSTALL_ROOT}/.installed_hephaestusd_manifest.sha256" +MODEL_SELECTOR_STATE_FILE="${INSTALL_ROOT}/.installed_model_selector_manifest.sha256" +ALC_STATE_FILE="${INSTALL_ROOT}/.installed_alc_manifest.sha256" +COMMANDER_STATE_FILE="${INSTALL_ROOT}/.installed_commander_manifest.sha256" +UPDATER_STATE_FILE="${INSTALL_ROOT}/.installed_updater_manifest.sha256" +VALHALLA_RUNTIME_STATE_FILE="${INSTALL_ROOT}/.installed_valhalla_runtime_manifest.sha256" +NAVD_SENTINEL_BASE="${BUNDLE_INSTALL_NAVD}/python/iqpilot_private/navd/navd" +HEPHA_SENTINEL_BASE="${BUNDLE_INSTALL_HEPHA}/python/iqpilot_private/konn3kt/hephaestus/hephaestusd" +MODEL_SELECTOR_SENTINEL_BASE="${BUNDLE_INSTALL_MODEL_SELECTOR}/python/iqpilot_private/models/manager" +ALC_SENTINEL_BASE="${BUNDLE_INSTALL_ALC}/python/iqpilot_private/konn3kt/iqlvbs/alc" +COMMANDER_SENTINEL_BASE="${BUNDLE_INSTALL_COMMANDER}/python/iqpilot_private/konn3kt/iqlvbs/iqlvbs_commander" +UPDATER_SENTINEL_BASE="${BUNDLE_INSTALL_UPDATER}/python/iqpilot_private/updater/git_remote" +VALHALLA_RUNTIME_SENTINEL="${BUNDLE_INSTALL_VALHALLA_RUNTIME}/valhalla_runtime/bin/valhalla_service" + +NAVD_HASH="" +HEPHA_HASH="" +MODEL_SELECTOR_HASH="" +ALC_HASH="" +COMMANDER_HASH="" +UPDATER_HASH="" +VALHALLA_RUNTIME_HASH="" +NEED_INSTALL=0 +HAVE_BUNDLE=0 + +seed_hepha_ble_runtime() { + if [ ! -f "${HEPHA_BUNDLE}/manifest.json" ]; then + return 0 + fi + + PYTHONPATH="${ROOT_DIR}" python3 <<'PY' +from pathlib import Path +import os +import secrets + +BLE_ENABLE_PARAM = "Konn3ktBleTransportEnabled" +PRIMARY_AUTH_DIR = Path("/data/konn3kt_ble") +FALLBACK_AUTH_DIR = Path("/data/openpilot/.konn3kt_ble") + + +def ensure_dir(path: Path, mode: int) -> bool: + try: + path.mkdir(parents=True, exist_ok=True) + try: + os.chmod(path, mode) + except Exception: + pass + return True + except Exception: + return False + + +def write_if_missing(path: Path, contents: str, mode: int) -> None: + if path.exists(): + return + path.write_text(contents, encoding="utf-8") + try: + os.chmod(path, mode) + except Exception: + pass + + +def seed_ble_enable_param() -> None: + try: + from openpilot.common.params import Params + params = Params() + if params.get(BLE_ENABLE_PARAM) is None: + params.put_bool(BLE_ENABLE_PARAM, True) + return + except Exception: + pass + + param_path = Path("/data/params/d") / BLE_ENABLE_PARAM + if ensure_dir(param_path.parent, 0o755): + try: + if not param_path.exists(): + param_path.write_bytes(b"1") + except Exception: + pass + + +def seed_ble_auth_artifacts() -> None: + auth_dir = None + for candidate in (PRIMARY_AUTH_DIR, FALLBACK_AUTH_DIR): + if ensure_dir(candidate, 0o700): + auth_dir = candidate + break + + if auth_dir is None: + return + + write_if_missing(auth_dir / "approved_clients.json", "{}\n", 0o600) + write_if_missing(auth_dir / "install_credentials.json", "{}\n", 0o600) + write_if_missing(auth_dir / "dev_secret", f"{secrets.token_hex(32)}\n", 0o600) + + +seed_ble_enable_param() +seed_ble_auth_artifacts() +PY + + if [ -d /usr/lib/python3/dist-packages/gi ]; then + ln -sfn /usr/lib/python3/dist-packages/gi "${ROOT_DIR}/gi" + fi +} + +module_present() { + local base_path="$1" + if [ -f "${base_path}.pyc" ]; then + return 0 + fi + if compgen -G "${base_path}".*.so >/dev/null; then + return 0 + fi + return 1 +} + +apply_manifest_modes() { + local bundle_root="$1" + if [ ! -f "${bundle_root}/manifest.json" ]; then + return 0 + fi + + python3 - "${bundle_root}" <<'PY' +from pathlib import Path +import json +import os +import sys + +root = Path(sys.argv[1]) +manifest = json.loads((root / "manifest.json").read_text(encoding="utf-8")) +for rel, meta in manifest.items(): + if rel in {"signatures", "runtime"} or not isinstance(meta, dict) or "mode" not in meta: + continue + path = root / rel + if path.exists(): + os.chmod(path, int(meta["mode"])) +PY +} + +installed_bundle_valid() { + local bundle_root="$1" + if [ ! -f "${bundle_root}/manifest.json" ]; then + return 1 + fi + apply_manifest_modes "${bundle_root}" || return 1 + python3 "${VERIFY_SCRIPT}" "${bundle_root}" >/dev/null 2>&1 +} + +if [ -f "${NAVD_BUNDLE}/manifest.json" ]; then + apply_manifest_modes "${NAVD_BUNDLE}" || true + HAVE_BUNDLE=1 + NAVD_HASH="$(manifest_hash "${NAVD_BUNDLE}/manifest.json")" + NAVD_DST_HASH="" + if [ -f "${NAVD_STATE_FILE}" ]; then + NAVD_DST_HASH="$(cat "${NAVD_STATE_FILE}" 2>/dev/null || true)" + fi + if ! module_present "${NAVD_SENTINEL_BASE}" || [ "${NAVD_HASH}" != "${NAVD_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_NAVD}"; then + NEED_INSTALL=1 + fi +fi + +if [ -f "${HEPHA_BUNDLE}/manifest.json" ]; then + apply_manifest_modes "${HEPHA_BUNDLE}" || true + HAVE_BUNDLE=1 + HEPHA_HASH="$(manifest_hash "${HEPHA_BUNDLE}/manifest.json")" + HEPHA_DST_HASH="" + if [ -f "${HEPHA_STATE_FILE}" ]; then + HEPHA_DST_HASH="$(cat "${HEPHA_STATE_FILE}" 2>/dev/null || true)" + fi + if ! module_present "${HEPHA_SENTINEL_BASE}" || [ "${HEPHA_HASH}" != "${HEPHA_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_HEPHA}"; then + NEED_INSTALL=1 + fi +fi + +if [ -f "${MODEL_SELECTOR_BUNDLE}/manifest.json" ]; then + apply_manifest_modes "${MODEL_SELECTOR_BUNDLE}" || true + HAVE_BUNDLE=1 + MODEL_SELECTOR_HASH="$(manifest_hash "${MODEL_SELECTOR_BUNDLE}/manifest.json")" + MODEL_SELECTOR_DST_HASH="" + if [ -f "${MODEL_SELECTOR_STATE_FILE}" ]; then + MODEL_SELECTOR_DST_HASH="$(cat "${MODEL_SELECTOR_STATE_FILE}" 2>/dev/null || true)" + fi + if ! module_present "${MODEL_SELECTOR_SENTINEL_BASE}" || [ "${MODEL_SELECTOR_HASH}" != "${MODEL_SELECTOR_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_MODEL_SELECTOR}"; then + NEED_INSTALL=1 + fi +fi + +if [ -f "${ALC_BUNDLE}/manifest.json" ]; then + apply_manifest_modes "${ALC_BUNDLE}" || true + HAVE_BUNDLE=1 + ALC_HASH="$(manifest_hash "${ALC_BUNDLE}/manifest.json")" + ALC_DST_HASH="" + if [ -f "${ALC_STATE_FILE}" ]; then + ALC_DST_HASH="$(cat "${ALC_STATE_FILE}" 2>/dev/null || true)" + fi + if ! module_present "${ALC_SENTINEL_BASE}" || [ "${ALC_HASH}" != "${ALC_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_ALC}"; then + NEED_INSTALL=1 + fi +fi + +if [ -f "${COMMANDER_BUNDLE}/manifest.json" ]; then + apply_manifest_modes "${COMMANDER_BUNDLE}" || true + HAVE_BUNDLE=1 + COMMANDER_HASH="$(manifest_hash "${COMMANDER_BUNDLE}/manifest.json")" + COMMANDER_DST_HASH="" + if [ -f "${COMMANDER_STATE_FILE}" ]; then + COMMANDER_DST_HASH="$(cat "${COMMANDER_STATE_FILE}" 2>/dev/null || true)" + fi + if ! module_present "${COMMANDER_SENTINEL_BASE}" || [ "${COMMANDER_HASH}" != "${COMMANDER_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_COMMANDER}"; then + NEED_INSTALL=1 + fi +fi + +if [ -f "${UPDATER_BUNDLE}/manifest.json" ]; then + apply_manifest_modes "${UPDATER_BUNDLE}" || true + HAVE_BUNDLE=1 + UPDATER_HASH="$(manifest_hash "${UPDATER_BUNDLE}/manifest.json")" + UPDATER_DST_HASH="" + if [ -f "${UPDATER_STATE_FILE}" ]; then + UPDATER_DST_HASH="$(cat "${UPDATER_STATE_FILE}" 2>/dev/null || true)" + fi + if ! module_present "${UPDATER_SENTINEL_BASE}" || [ "${UPDATER_HASH}" != "${UPDATER_DST_HASH}" ] || ! installed_bundle_valid "${BUNDLE_INSTALL_UPDATER}"; then + NEED_INSTALL=1 + fi +fi + +if [ -f "${VALHALLA_RUNTIME_BUNDLE}/manifest.json" ]; then + apply_manifest_modes "${VALHALLA_RUNTIME_BUNDLE}" || true + HAVE_BUNDLE=1 + VALHALLA_RUNTIME_HASH="$(manifest_hash "${VALHALLA_RUNTIME_BUNDLE}/manifest.json")" + VALHALLA_RUNTIME_DST_HASH="" + if [ -f "${VALHALLA_RUNTIME_STATE_FILE}" ]; then + VALHALLA_RUNTIME_DST_HASH="$(cat "${VALHALLA_RUNTIME_STATE_FILE}" 2>/dev/null || true)" + fi + if [ ! -x "${VALHALLA_RUNTIME_SENTINEL}" ] || [ "${VALHALLA_RUNTIME_HASH}" != "${VALHALLA_RUNTIME_DST_HASH}" ]; then + NEED_INSTALL=1 + fi +fi + +if [ "${HAVE_BUNDLE}" -eq 0 ]; then + exit 0 +fi + +if [ "${NEED_INSTALL}" -eq 0 ]; then + seed_hepha_ble_runtime || true + exit 0 +fi + +TMP_ROOT="${INSTALL_ROOT}.tmp.$$" +echo "Installing bundled private artifacts..." +rm -rf "${TMP_ROOT}" +mkdir -p "${TMP_ROOT}" +mkdir -p "${TMP_ROOT}/bundles" + +if [ -d "${INSTALL_ROOT}" ]; then + cp -a "${INSTALL_ROOT}"/. "${TMP_ROOT}/" +fi + +if [ -f "${NAVD_BUNDLE}/manifest.json" ]; then + python3 "${VERIFY_SCRIPT}" "${NAVD_BUNDLE}" + rm -rf "${TMP_ROOT}/bundles/iqpilot_navd_private" + mkdir -p "${TMP_ROOT}/bundles/iqpilot_navd_private" + cp -a "${NAVD_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_navd_private/" + apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_navd_private" +fi + +if [ -f "${HEPHA_BUNDLE}/manifest.json" ]; then + python3 "${VERIFY_SCRIPT}" "${HEPHA_BUNDLE}" + rm -rf "${TMP_ROOT}/bundles/iqpilot_hephaestusd_private" + mkdir -p "${TMP_ROOT}/bundles/iqpilot_hephaestusd_private" + cp -a "${HEPHA_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_hephaestusd_private/" + apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_hephaestusd_private" +fi + +if [ -f "${MODEL_SELECTOR_BUNDLE}/manifest.json" ]; then + python3 "${VERIFY_SCRIPT}" "${MODEL_SELECTOR_BUNDLE}" + rm -rf "${TMP_ROOT}/bundles/iqpilot_model_selector_private" + mkdir -p "${TMP_ROOT}/bundles/iqpilot_model_selector_private" + cp -a "${MODEL_SELECTOR_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_model_selector_private/" + apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_model_selector_private" +fi + +if [ -f "${ALC_BUNDLE}/manifest.json" ]; then + python3 "${VERIFY_SCRIPT}" "${ALC_BUNDLE}" + rm -rf "${TMP_ROOT}/bundles/iqpilot_alc_private" + mkdir -p "${TMP_ROOT}/bundles/iqpilot_alc_private" + cp -a "${ALC_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_alc_private/" + apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_alc_private" +fi + +if [ -f "${COMMANDER_BUNDLE}/manifest.json" ]; then + python3 "${VERIFY_SCRIPT}" "${COMMANDER_BUNDLE}" + rm -rf "${TMP_ROOT}/bundles/iqpilot_commander_private" + mkdir -p "${TMP_ROOT}/bundles/iqpilot_commander_private" + cp -a "${COMMANDER_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_commander_private/" + apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_commander_private" +fi + +if [ -f "${UPDATER_BUNDLE}/manifest.json" ]; then + python3 "${VERIFY_SCRIPT}" "${UPDATER_BUNDLE}" + rm -rf "${TMP_ROOT}/bundles/iqpilot_updater_private" + mkdir -p "${TMP_ROOT}/bundles/iqpilot_updater_private" + cp -a "${UPDATER_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_updater_private/" + apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_updater_private" +fi + +if [ -f "${VALHALLA_RUNTIME_BUNDLE}/manifest.json" ]; then + python3 "${VERIFY_SCRIPT}" "${VALHALLA_RUNTIME_BUNDLE}" + rm -rf "${TMP_ROOT}/bundles/iqpilot_valhalla_runtime" + mkdir -p "${TMP_ROOT}/bundles/iqpilot_valhalla_runtime" + cp -a "${VALHALLA_RUNTIME_BUNDLE}"/. "${TMP_ROOT}/bundles/iqpilot_valhalla_runtime/" + apply_manifest_modes "${TMP_ROOT}/bundles/iqpilot_valhalla_runtime" +fi + +if [ -d "${INSTALL_ROOT}" ]; then + rm -rf "${INSTALL_ROOT}.bak" + mv "${INSTALL_ROOT}" "${INSTALL_ROOT}.bak" +fi + +mv "${TMP_ROOT}" "${INSTALL_ROOT}" + +if [ -d "${INSTALL_ROOT}.bak" ]; then + rm -rf "${INSTALL_ROOT}.bak" +fi + +if [ -n "${NAVD_HASH}" ]; then + printf '%s\n' "${NAVD_HASH}" > "${NAVD_STATE_FILE}" +fi +if [ -n "${HEPHA_HASH}" ]; then + printf '%s\n' "${HEPHA_HASH}" > "${HEPHA_STATE_FILE}" +fi +if [ -n "${MODEL_SELECTOR_HASH}" ]; then + printf '%s\n' "${MODEL_SELECTOR_HASH}" > "${MODEL_SELECTOR_STATE_FILE}" +fi +if [ -n "${ALC_HASH}" ]; then + printf '%s\n' "${ALC_HASH}" > "${ALC_STATE_FILE}" +fi +if [ -n "${COMMANDER_HASH}" ]; then + printf '%s\n' "${COMMANDER_HASH}" > "${COMMANDER_STATE_FILE}" +fi +if [ -n "${UPDATER_HASH}" ]; then + printf '%s\n' "${UPDATER_HASH}" > "${UPDATER_STATE_FILE}" +fi +if [ -n "${VALHALLA_RUNTIME_HASH}" ]; then + printf '%s\n' "${VALHALLA_RUNTIME_HASH}" > "${VALHALLA_RUNTIME_STATE_FILE}" +fi + +seed_hepha_ble_runtime || true + +echo "Private artifacts installed." diff --git a/artifacts/runtime/env_sync.sh b/artifacts/runtime/env_sync.sh new file mode 100755 index 000000000..a61c98800 --- /dev/null +++ b/artifacts/runtime/env_sync.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash +# Python env + proprietary runtime sync for the openpilot tree. +# +# Two callers, same steps: +# - launch_chffrplus.sh sources this at boot and calls sync_python_env. When an +# update was already prepared this is a warm no-op; when there is real work +# (local dev edits, failed prep) it runs under the boot spinner as before. +# - updated.py executes this standalone right after an update is applied to +# disk, so the heavy uv/package work happens offroad with the stack idle +# instead of at boot alongside everything else starting at once. +# +# Variables assigned here (VENV_SITE_PACKAGES, BASE_SITE_PACKAGES, ...) are +# intentionally global: the sourced caller composes PYTHONPATH from them. + +sync_python_env() { + local DIR + DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." >/dev/null && pwd )" + + # Best-effort: install the verified runtime before anything starts the services that + # need it. This only succeeds on a tree that has built _verified_import.so, so on a + # prebuilt release install it is a no-op -- there the runtime arrives with the IQ.OS + # flash, whose image bakes it in. What actually fixes the 20+ minute first-install hang + # is --no-block on the service starts below: hephaestusd/ble-transportd/flockd each + # ExecStartPre-wait up to 600s for /usr/libexec/iqpilot/iqpilot_bundle_runner. + if [ -x "$DIR/iqpilot/system/proprietary_runtime/install_verified_runtime.sh" ]; then + "$DIR/iqpilot/system/proprietary_runtime/install_verified_runtime.sh" || true + fi + + # Install/update proprietary runtime bundles. + if [ -f "$DIR/artifacts/runtime/ensure_private_installed.sh" ]; then + bash "$DIR/artifacts/runtime/ensure_private_installed.sh" || true + elif [ -x "$DIR/scripts/iqpilot/ensure_navd_private_installed.sh" ]; then + # Backward-compat fallback for older trees. + "$DIR/scripts/iqpilot/ensure_navd_private_installed.sh" || true + fi + + PYTHONPATH="$DIR" /usr/local/venv/bin/python3 -c "from iqpilot.common.git_creds import install_credential_helper; install_credential_helper('$DIR')" 2>/dev/null || true + PACKAGE_SOURCES_ID="$(git -C "$DIR" rev-parse --verify --quiet "HEAD:artifacts/package_sources" 2>/dev/null || true)" + PACKAGE_LOCK_SHA="$(printf '%s\n%s\n' "$(sha256sum "$DIR/uv.lock" | awk '{print $1}')" "$PACKAGE_SOURCES_ID" | sha256sum | awk '{print $1}')" + INSTALLED_PACKAGE_LOCK_SHA="$(cat "$DIR/.iqpilot-package-lock-sha256" 2>/dev/null || true)" + mapfile -t RUNTIME_WHEELS < <(/usr/local/venv/bin/python3 "$DIR/iqpilot/system/runtime_wheel_requirements.py" "$DIR") + mapfile -t RUNTIME_WHEEL_SOURCES < <(/usr/local/venv/bin/python3 "$DIR/iqpilot/system/runtime_wheel_requirements.py" "$DIR" --sources) + RUNTIME_WHEEL_LOCK_SHA="$(printf '%s\n' "${RUNTIME_WHEELS[@]}" | sha256sum | awk '{print $1}')" + INSTALLED_RUNTIME_WHEEL_LOCK_SHA="$(cat "$DIR/.iqpilot-runtime-wheel-lock-sha256" 2>/dev/null || true)" + BASE_SITE_PACKAGES="$(/usr/local/venv/bin/python3 -c 'import site; print(site.getsitepackages()[0])')" + PROJECT_RAYLIB="$("$DIR/.venv/bin/python3" -c 'import importlib.metadata; print(importlib.metadata.distribution("raylib").locate_file(""))' 2>/dev/null || true)" + if [[ "$PROJECT_RAYLIB" = "$DIR/.venv"/* ]]; then + sudo rm -rf "$DIR/.venv" + rm -f "$DIR/.iqpilot-package-lock-sha256" "$DIR/.iqpilot-runtime-wheel-lock-sha256" + INSTALLED_PACKAGE_LOCK_SHA="" + INSTALLED_RUNTIME_WHEEL_LOCK_SHA="" + fi + VENV_SITE_PACKAGES="$("$DIR/.venv/bin/python3" -c 'import site; print(site.getsitepackages()[0])' 2>/dev/null || true)" + PACKAGES_READY=0 + if [ -d "$DIR/artifacts/package_runtime" ] && PYTHONPATH="$DIR/artifacts/package_runtime" /usr/local/venv/bin/python3 -c "import iqdbc, msgq, panda, tinygrad" 2>/dev/null; then + PACKAGES_READY=1 + elif [ "$PACKAGE_LOCK_SHA" = "$INSTALLED_PACKAGE_LOCK_SHA" ] && "$DIR/.venv/bin/python3" -c "import iqdbc, msgq, panda, tinygrad" 2>/dev/null \ + && "$DIR/.venv/bin/python3" "$DIR/iqpilot/system/runtime_packages_verify.py"; then + # a top-level import passes on a partially extracted install (lazy backends), + # so readiness also requires every wheel RECORD file to exist on disk + PACKAGES_READY=1 + fi + RUNTIME_WHEELS_READY=0 + if [ -d "$DIR/artifacts/package_runtime" ] && PYTHONPATH="$DIR/artifacts/package_runtime" /usr/local/venv/bin/python3 -c "import libdatachannel" 2>/dev/null; then + RUNTIME_WHEELS_READY=1 + elif [ "$RUNTIME_WHEEL_LOCK_SHA" = "$INSTALLED_RUNTIME_WHEEL_LOCK_SHA" ] && "$DIR/.venv/bin/python3" -c "import libdatachannel" 2>/dev/null \ + && PYTHONPATH="$DIR" "$DIR/.venv/bin/python3" "$DIR/iqpilot/system/runtime_wheels_verify.py"; then + RUNTIME_WHEELS_READY=1 + fi + if [ ! -f "$DIR/prebuilt" ] && [ ! -x "$DIR/.venv/bin/python3" ]; then + PACKAGES_READY=0 + RUNTIME_WHEELS_READY=0 + fi + if [ "$PACKAGES_READY" != "1" ] || [ "$RUNTIME_WHEELS_READY" != "1" ]; then + UV_CACHE_DIR="$DIR/.uv-cache" + if [ ! -x "$DIR/.venv/bin/python3" ]; then + UV_CACHE_DIR="$UV_CACHE_DIR" uv venv --python /usr/local/venv/bin/python3 "$DIR/.venv" || return 1 + VENV_SITE_PACKAGES="$("$DIR/.venv/bin/python3" -c 'import site; print(site.getsitepackages()[0])')" + fi + sudo chown -R "$(id -u):$(id -g)" "$DIR/.venv" "$UV_CACHE_DIR" "$DIR/artifacts/package_sources" 2>/dev/null || true + if [ "${#RUNTIME_WHEELS[@]}" = "0" ] || [ "${#RUNTIME_WHEEL_SOURCES[@]}" = "0" ]; then + return 1 + fi + if [ "$PACKAGES_READY" != "1" ]; then + IQDBC_PACKAGE_SOURCE="" + PACKAGE_SOURCES=() + while IFS=$'\t' read -r package_name package_source; do + PACKAGE_SOURCES+=("$package_source") + if [ "$package_name" = "iqdbc" ]; then + IQDBC_PACKAGE_SOURCE="$package_source" + fi + done < <(/usr/local/venv/bin/python3 "$DIR/iqpilot/system/runtime_package_sources.py" "$DIR") + if [ "${#PACKAGE_SOURCES[@]}" = "0" ] || [ -z "$IQDBC_PACKAGE_SOURCE" ]; then + return 1 + fi + PACKAGE_BUILD_PYTHONPATH="$BASE_SITE_PACKAGES:$VENV_SITE_PACKAGES" + # The base AGNOS venv ships Eigen as a Python package instead of under + # /usr/include, so source-package builds need its install directory on the compiler include path. + # Resolve it through Python rather than pinning the Python minor version. + EIGEN_INCLUDE_ROOT="$(/usr/local/venv/bin/python3 -c \ + 'from pathlib import Path; import eigen; root = Path(eigen.__file__).resolve().parent / "install"; assert (root / "eigen3/Eigen/Dense").is_file(); print(root)' \ + 2>/dev/null || true)" + PACKAGE_BUILD_CPATH="${CPATH:-}" + if [ -n "$EIGEN_INCLUDE_ROOT" ]; then + PACKAGE_BUILD_CPATH="$EIGEN_INCLUDE_ROOT${PACKAGE_BUILD_CPATH:+:$PACKAGE_BUILD_CPATH}" + fi + UV_CACHE_DIR="$UV_CACHE_DIR" PYTHONPATH="$PACKAGE_BUILD_PYTHONPATH" CPATH="$PACKAGE_BUILD_CPATH" PATH="/usr/local/venv/bin:/usr/bin:$PATH" \ + uv pip install --python "$DIR/.venv/bin/python" --no-build-isolation --no-deps --reinstall "$IQDBC_PACKAGE_SOURCE" || return 1 + UV_CACHE_DIR="$UV_CACHE_DIR" PYTHONPATH="$PACKAGE_BUILD_PYTHONPATH" CPATH="$PACKAGE_BUILD_CPATH" PATH="/usr/local/venv/bin:/usr/bin:$PATH" \ + uv pip install --python "$DIR/.venv/bin/python" --no-build-isolation --no-deps --reinstall "${PACKAGE_SOURCES[@]}" || return 1 + printf '%s\n' "$PACKAGE_LOCK_SHA" > "$DIR/.iqpilot-package-lock-sha256" + fi + if [ "$RUNTIME_WHEELS_READY" != "1" ]; then + UV_CACHE_DIR="$UV_CACHE_DIR" PATH="/usr/local/venv/bin:/usr/bin:$PATH" \ + uv pip install --python "$DIR/.venv/bin/python" --no-deps --reinstall "${RUNTIME_WHEEL_SOURCES[@]}" || return 1 + "$DIR/.venv/bin/python3" -c "import libdatachannel" || return 1 + PYTHONPATH="$DIR" "$DIR/.venv/bin/python3" "$DIR/iqpilot/system/runtime_wheels_verify.py" || return 1 + printf '%s\n' "$RUNTIME_WHEEL_LOCK_SHA" > "$DIR/.iqpilot-runtime-wheel-lock-sha256" + fi + fi + if [ ! -f "$DIR/prebuilt" ] && [ ! -x "$DIR/.venv/bin/python3" ]; then + return 1 + fi + if [ -n "$VENV_SITE_PACKAGES" ]; then + printf 'import site; site.addsitedir("%s")\n' "$BASE_SITE_PACKAGES" | sudo tee "$VENV_SITE_PACKAGES/iqpilot-system-venv.pth" >/dev/null + fi +} + +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + sync_python_env + exit $? +fi + +# NOTE: keep this file in lockstep with the launch-time expectations above -- +# updated.py invokes it standalone and launch_chffrplus.sh sources it. diff --git a/artifacts/runtime/test_apply_boot_branding.py b/artifacts/runtime/test_apply_boot_branding.py new file mode 100644 index 000000000..e741bf143 --- /dev/null +++ b/artifacts/runtime/test_apply_boot_branding.py @@ -0,0 +1,216 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from artifacts.runtime import apply_boot_branding as abb + + +COMMA_HOME = "/home/comma" + +EXISTING_PASSWD = ( + "root:x:0:0:root:/root:/bin/bash\n" + "daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n" + f"comma:x:1000:1000:comma:{COMMA_HOME}:/bin/bash\n" + "nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n" +) + +EXISTING_SHADOW = ( + "root:*:19000:0:99999:7:::\n" + "daemon:*:19000:0:99999:7:::\n" + "comma:$6$abc$xyz:19000:0:99999:7:::\n" + "nobody:!:19000:0:99999:7:::\n" +) + +EXPECTED_PASSWD_LINE = f"iq:x:1000:1000:IQ.Pilot:{COMMA_HOME}:/bin/bash" + + +@pytest.fixture +def etc(tmp_path: Path) -> tuple[Path, Path]: + passwd = tmp_path / "passwd" + shadow = tmp_path / "shadow" + passwd.write_text(EXISTING_PASSWD, encoding="utf-8") + shadow.write_text(EXISTING_SHADOW, encoding="utf-8") + return passwd, shadow + + +@pytest.fixture +def fake_remount(): + calls: list[str] = [] + + def _remount(mode: str) -> None: + calls.append(mode) + + _remount.calls = calls + return _remount + + +def _frozen_now() -> float: + return 1779494400.0 + + +def test_fresh_install_adds_iq_user(etc, fake_remount): + passwd, shadow = etc + + changed = abb.ensure_iq_user( + passwd_path=passwd, + shadow_path=shadow, + remount=fake_remount, + root_opts="ro,relatime", + now=_frozen_now, + ) + + assert changed is True + passwd_text = passwd.read_text(encoding="utf-8") + shadow_text = shadow.read_text(encoding="utf-8") + + assert EXPECTED_PASSWD_LINE in passwd_text.splitlines() + assert any(l.startswith("iq:!:") and l.endswith(":0:99999:7:::") for l in shadow_text.splitlines()) + + for original_line in EXISTING_PASSWD.splitlines(): + assert original_line in passwd_text.splitlines() + for original_line in EXISTING_SHADOW.splitlines(): + assert original_line in shadow_text.splitlines() + + assert fake_remount.calls == ["remount,rw", "remount,ro,relatime"] + + +def test_second_boot_is_noop(etc, fake_remount): + passwd, shadow = etc + + abb.ensure_iq_user(passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now) + passwd_after_first = passwd.read_text(encoding="utf-8") + shadow_after_first = shadow.read_text(encoding="utf-8") + fake_remount.calls.clear() + + changed = abb.ensure_iq_user( + passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now, + ) + + assert changed is False + assert passwd.read_text(encoding="utf-8") == passwd_after_first + assert shadow.read_text(encoding="utf-8") == shadow_after_first + assert fake_remount.calls == [] # no remount when nothing to do + + +def test_partial_state_self_heals(etc, fake_remount): + passwd, shadow = etc + passwd.write_text(EXISTING_PASSWD + EXPECTED_PASSWD_LINE + "\n", encoding="utf-8") + # shadow lacks iq + + changed = abb.ensure_iq_user( + passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now, + ) + + assert changed is True + iq_passwd_lines = [l for l in passwd.read_text(encoding="utf-8").splitlines() if l.startswith("iq:")] + iq_shadow_lines = [l for l in shadow.read_text(encoding="utf-8").splitlines() if l.startswith("iq:")] + assert iq_passwd_lines == [EXPECTED_PASSWD_LINE] # not duplicated + assert len(iq_shadow_lines) == 1 + assert iq_shadow_lines[0].startswith("iq:!:") + + +def test_malformed_iq_passwd_line_replaced(etc, fake_remount): + passwd, shadow = etc + wrong = "iq:x:1000:1000:old:/root:/bin/sh" + passwd.write_text(EXISTING_PASSWD + wrong + "\n", encoding="utf-8") + + changed = abb.ensure_iq_user( + passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now, + ) + + assert changed is True + iq_lines = [l for l in passwd.read_text(encoding="utf-8").splitlines() if l.startswith("iq:")] + assert iq_lines == [EXPECTED_PASSWD_LINE] + + +def test_remount_ro_restored_on_write_failure(tmp_path, fake_remount): + passwd = tmp_path / "ro_passwd" + passwd.write_text(EXISTING_PASSWD, encoding="utf-8") + passwd.chmod(0o444) # force write to raise + + shadow = tmp_path / "shadow" + shadow.write_text(EXISTING_SHADOW, encoding="utf-8") + + with pytest.raises(PermissionError): + abb.ensure_iq_user( + passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now, + ) + + assert fake_remount.calls == ["remount,rw", "remount,ro"] + + +def test_does_not_alter_existing_branding_flow(monkeypatch, etc, fake_remount, capsys): + passwd, shadow = etc + + monkeypatch.setattr(abb, "PASSWD_PATH", passwd) + monkeypatch.setattr(abb, "SHADOW_PATH", shadow) + monkeypatch.setattr(abb, "remount_root", fake_remount) + monkeypatch.setattr(abb, "get_root_mount_options", lambda: "ro,relatime") + monkeypatch.setattr(abb.os, "geteuid", lambda: 0) + monkeypatch.setattr(abb, "apply_branding", lambda: False) # no assets → branding no-op + monkeypatch.setattr("sys.argv", ["apply_boot_branding.py"]) + + rc = abb.main() + out = capsys.readouterr().out.strip().splitlines() + + assert rc == 0 + assert out[-1] == "changed" # iq_changed flips combined result + assert EXPECTED_PASSWD_LINE in passwd.read_text(encoding="utf-8").splitlines() + + +def test_iq_home_tracks_commas_actual_home(tmp_path, fake_remount): + passwd = tmp_path / "passwd" + shadow = tmp_path / "shadow" + unusual_home = "/data/some/relocated/home/comma" + passwd.write_text( + "root:x:0:0:root:/root:/bin/bash\n" + f"comma:x:1000:1000:comma:{unusual_home}:/bin/zsh\n", + encoding="utf-8", + ) + shadow.write_text("comma:$6$x$y:19000:0:99999:7:::\n", encoding="utf-8") + + changed = abb.ensure_iq_user( + passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now, + ) + + assert changed is True + iq_line = [l for l in passwd.read_text(encoding="utf-8").splitlines() if l.startswith("iq:")][0] + # iq inherits comma's home, shell, UID, GID — not a hardcoded path + assert iq_line == f"iq:x:1000:1000:IQ.Pilot:{unusual_home}:/bin/zsh" + + +def test_skips_when_comma_user_absent(tmp_path, fake_remount): + passwd = tmp_path / "passwd" + shadow = tmp_path / "shadow" + passwd.write_text("root:x:0:0:root:/root:/bin/bash\n", encoding="utf-8") + shadow.write_text("root:*:19000:0:99999:7:::\n", encoding="utf-8") + + changed = abb.ensure_iq_user( + passwd_path=passwd, shadow_path=shadow, remount=fake_remount, root_opts="ro", now=_frozen_now, + ) + + assert changed is False + assert "iq:" not in passwd.read_text(encoding="utf-8") + assert "iq:" not in shadow.read_text(encoding="utf-8") + assert fake_remount.calls == [] + + +def test_ensure_iq_user_failure_is_swallowed_by_main(monkeypatch, capsys): + def boom(*a, **kw): + raise RuntimeError("simulated failure") + + monkeypatch.setattr(abb, "ensure_iq_user", boom) + monkeypatch.setattr(abb.os, "geteuid", lambda: 0) + monkeypatch.setattr(abb, "apply_branding", lambda: True) + monkeypatch.setattr("sys.argv", ["apply_boot_branding.py"]) + + rc = abb.main() + out = capsys.readouterr().out + + assert rc == 0 + assert "ensure_iq_user failed: simulated failure" in out + assert "changed" in out # branding ran, so combined result is still "changed" diff --git a/artifacts/runtime/verify_proprietary_bundle.py b/artifacts/runtime/verify_proprietary_bundle.py new file mode 100644 index 000000000..d0a97252c --- /dev/null +++ b/artifacts/runtime/verify_proprietary_bundle.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +import argparse +import hashlib +import json +import stat +from pathlib import Path + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description="Verify IQ Pilot proprietary bundle manifest") + p.add_argument("bundle_root", help="Bundle directory containing manifest.json") + return p.parse_args() + + +def sha256(path: Path) -> str: + h = hashlib.sha256() + with path.open("rb") as f: + while True: + b = f.read(1024 * 1024) + if not b: + break + h.update(b) + return h.hexdigest() + + +def main() -> None: + args = parse_args() + root = Path(args.bundle_root).resolve() + manifest_path = root / "manifest.json" + if not manifest_path.exists(): + raise SystemExit(f"manifest not found: {manifest_path}") + + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + failures: list[str] = [] + + for rel, meta in manifest.items(): + if rel in {"signatures", "runtime"}: + continue + f = root / rel + if not f.exists(): + failures.append(f"missing: {rel}") + continue + + got = sha256(f) + exp = str(meta["sha256"]) + if got != exp: + failures.append(f"sha256 mismatch: {rel}") + + got_size = f.stat().st_size + exp_size = int(meta["size"]) + if got_size != exp_size: + failures.append(f"size mismatch: {rel} ({got_size} != {exp_size})") + + if "mode" in meta: + got_mode = stat.S_IMODE(f.stat().st_mode) + exp_mode = int(meta["mode"]) + if got_mode != exp_mode: + failures.append(f"mode mismatch: {rel} ({got_mode:o} != {exp_mode:o})") + + if failures: + print("FAILED") + for x in failures: + print(x) + raise SystemExit(1) + + print("OK") + + +if __name__ == "__main__": + main() diff --git a/artifacts/runtime_wheels/libdatachannel_py-2026.1.0.dev2-cp312-cp312-manylinux_2_35_aarch64.whl b/artifacts/runtime_wheels/libdatachannel_py-2026.1.0.dev2-cp312-cp312-manylinux_2_35_aarch64.whl new file mode 100644 index 000000000..67597026a Binary files /dev/null and b/artifacts/runtime_wheels/libdatachannel_py-2026.1.0.dev2-cp312-cp312-manylinux_2_35_aarch64.whl differ diff --git a/compile_commands.json b/compile_commands.json new file mode 100644 index 000000000..09018176b --- /dev/null +++ b/compile_commands.json @@ -0,0 +1,488 @@ +[ + { + "command": "clang++ -o iqpilot/common/params.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/params.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/params.cc", + "output": "/data/openpilot/iqpilot/common/params.o" + }, + { + "command": "clang++ -o iqpilot/common/swaglog.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/swaglog.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/swaglog.cc", + "output": "/data/openpilot/iqpilot/common/swaglog.o" + }, + { + "command": "clang++ -o iqpilot/common/util.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/util.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/util.cc", + "output": "/data/openpilot/iqpilot/common/util.o" + }, + { + "command": "clang++ -o iqpilot/common/ratekeeper.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/ratekeeper.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/ratekeeper.cc", + "output": "/data/openpilot/iqpilot/common/ratekeeper.o" + }, + { + "command": "clang++ -o iqpilot/common/clutil.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/clutil.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/clutil.cc", + "output": "/data/openpilot/iqpilot/common/clutil.o" + }, + { + "command": "clang++ -o iqpilot/common/yuv.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/yuv.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/yuv.cc", + "output": "/data/openpilot/iqpilot/common/yuv.o" + }, + { + "command": "clang++ -o iqpilot/common/params_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include iqpilot/common/params_pyx.cpp", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/params_pyx.cpp", + "output": "/data/openpilot/iqpilot/common/params_pyx.o" + }, + { + "command": "clang++ -o iqpilot/cereal/gen/cpp/log.capnp.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/cereal/gen/cpp/log.capnp.c++", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/cereal/gen/cpp/log.capnp.c++", + "output": "/data/openpilot/iqpilot/cereal/gen/cpp/log.capnp.o" + }, + { + "command": "clang++ -o iqpilot/cereal/gen/cpp/legacy.capnp.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/cereal/gen/cpp/legacy.capnp.c++", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/cereal/gen/cpp/legacy.capnp.c++", + "output": "/data/openpilot/iqpilot/cereal/gen/cpp/legacy.capnp.o" + }, + { + "command": "clang++ -o iqpilot/cereal/gen/cpp/custom.capnp.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/cereal/gen/cpp/custom.capnp.c++", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/cereal/gen/cpp/custom.capnp.c++", + "output": "/data/openpilot/iqpilot/cereal/gen/cpp/custom.capnp.o" + }, + { + "command": "clang++ -o iqpilot/cereal/gen/cpp/car.capnp.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/cereal/gen/cpp/car.capnp.c++", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/cereal/gen/cpp/car.capnp.c++", + "output": "/data/openpilot/iqpilot/cereal/gen/cpp/car.capnp.o" + }, + { + "command": "clang++ -o iqpilot/cereal/messaging/bridge.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/cereal/messaging/bridge.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/cereal/messaging/bridge.cc", + "output": "/data/openpilot/iqpilot/cereal/messaging/bridge.o" + }, + { + "command": "clang++ -o iqpilot/cereal/messaging/msgq_to_zmq.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/cereal/messaging/msgq_to_zmq.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/cereal/messaging/msgq_to_zmq.cc", + "output": "/data/openpilot/iqpilot/cereal/messaging/msgq_to_zmq.o" + }, + { + "command": "clang++ -o iqpilot/cereal/messaging/socketmaster.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/cereal/messaging/socketmaster.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/cereal/messaging/socketmaster.cc", + "output": "/data/openpilot/iqpilot/cereal/messaging/socketmaster.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/logger.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/logger.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/logger.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/logger.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/zstd_writer.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/zstd_writer.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/zstd_writer.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/zstd_writer.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/video_writer.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/video_writer.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/video_writer.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/video_writer.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/encoder/encoder.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/encoder/encoder.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/encoder/encoder.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/encoder/encoder.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/encoder/v4l_encoder.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/encoder/v4l_encoder.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/encoder/v4l_encoder.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/encoder/v4l_encoder.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/encoder/jpeg_encoder.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/encoder/jpeg_encoder.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/encoder/jpeg_encoder.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/encoder/jpeg_encoder.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/loggerd.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/loggerd.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/loggerd.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/loggerd.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/encoderd.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/encoderd.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/encoderd.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/encoderd.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/bootlog.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/bootlog.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/bootlog.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/bootlog.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/encoder/qcom_decoder_hwdec.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/tools/replay/qcom_decoder.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/tools/replay/qcom_decoder.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/encoder/qcom_decoder_hwdec.o" + }, + { + "command": "clang++ -o iqpilot/system/loggerd/encoder/v4l_decode.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/loggerd/encoder/v4l_decode.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/loggerd/encoder/v4l_decode.cc", + "output": "/data/openpilot/iqpilot/system/loggerd/encoder/v4l_decode.o" + }, + { + "command": "clang++ -o iqpilot/system/camerad/cameras/camera_qcom2.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/camerad/cameras/camera_qcom2.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/camerad/cameras/camera_qcom2.cc", + "output": "/data/openpilot/iqpilot/system/camerad/cameras/camera_qcom2.o" + }, + { + "command": "clang++ -o iqpilot/system/camerad/cameras/camera_common.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/camerad/cameras/camera_common.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/camerad/cameras/camera_common.cc", + "output": "/data/openpilot/iqpilot/system/camerad/cameras/camera_common.o" + }, + { + "command": "clang++ -o iqpilot/system/camerad/cameras/spectra.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/camerad/cameras/spectra.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/camerad/cameras/spectra.cc", + "output": "/data/openpilot/iqpilot/system/camerad/cameras/spectra.o" + }, + { + "command": "clang++ -o iqpilot/system/camerad/cameras/cdm.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/camerad/cameras/cdm.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/camerad/cameras/cdm.cc", + "output": "/data/openpilot/iqpilot/system/camerad/cameras/cdm.o" + }, + { + "command": "clang++ -o iqpilot/system/camerad/sensors/ar0231.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/camerad/sensors/ar0231.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/camerad/sensors/ar0231.cc", + "output": "/data/openpilot/iqpilot/system/camerad/sensors/ar0231.o" + }, + { + "command": "clang++ -o iqpilot/system/camerad/sensors/ox03c10.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/camerad/sensors/ox03c10.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/camerad/sensors/ox03c10.cc", + "output": "/data/openpilot/iqpilot/system/camerad/sensors/ox03c10.o" + }, + { + "command": "clang++ -o iqpilot/system/camerad/sensors/os04c10.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/camerad/sensors/os04c10.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/camerad/sensors/os04c10.cc", + "output": "/data/openpilot/iqpilot/system/camerad/sensors/os04c10.o" + }, + { + "command": "clang++ -o iqpilot/system/camerad/main.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/system/camerad/main.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/system/camerad/main.cc", + "output": "/data/openpilot/iqpilot/system/camerad/main.o" + }, + { + "command": "clang++ -o iqpilot/third_party/json11/json11.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unqualified-std-cast-call -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/third_party/json11/json11.cpp", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/third_party/json11/json11.cpp", + "output": "/data/openpilot/iqpilot/third_party/json11/json11.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/pandad/panda.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/pandad/panda.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/pandad/panda.cc", + "output": "/data/openpilot/iqpilot/selfdrive/pandad/panda.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/pandad/panda_comms.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/pandad/panda_comms.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/pandad/panda_comms.cc", + "output": "/data/openpilot/iqpilot/selfdrive/pandad/panda_comms.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/pandad/spi.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/pandad/spi.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/pandad/spi.cc", + "output": "/data/openpilot/iqpilot/selfdrive/pandad/spi.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/pandad/main.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/pandad/main.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/pandad/main.cc", + "output": "/data/openpilot/iqpilot/selfdrive/pandad/main.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/pandad/pandad.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/pandad/pandad.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/pandad/pandad.cc", + "output": "/data/openpilot/iqpilot/selfdrive/pandad/pandad.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/pandad/panda_safety.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/pandad/panda_safety.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/pandad/panda_safety.cc", + "output": "/data/openpilot/iqpilot/selfdrive/pandad/panda_safety.o" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_solver_lat.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_solver_lat.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_solver_lat.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_solver_lat.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_ode_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_ode_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_ode_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_ode_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_vde_forw.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_vde_forw.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_vde_forw.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_model/lat_expl_vde_forw.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun_jac_ut_xt.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun_jac_ut_xt.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_fun_jac_ut_xt.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_hess.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_hess.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_hess.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun_jac_ut_xt.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun_jac_ut_xt.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_fun_jac_ut_xt.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_hess.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_hess.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_e_hess.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun_jac_ut_xt.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun_jac_ut_xt.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_fun_jac_ut_xt.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_hess.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_hess.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/lat_cost/lat_cost_y_0_hess.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.o -c -std=gnu11 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.o" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_solver_long.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_solver_long.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_solver_long.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_solver_long.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_ode_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_ode_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_ode_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_ode_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_vde_forw.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_vde_forw.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_vde_forw.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_model/long_expl_vde_forw.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun_jac_ut_xt.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun_jac_ut_xt.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_fun_jac_ut_xt.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_hess.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_hess.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_hess.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun_jac_ut_xt.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun_jac_ut_xt.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_fun_jac_ut_xt.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_hess.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_hess.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_e_hess.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun_jac_ut_xt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun_jac_ut_xt.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun_jac_ut_xt.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_fun_jac_ut_xt.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_hess.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_hess.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_hess.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_cost/long_cost_y_0_hess.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun_jac_uxt_zt.os -c -std=gnu11 -DACADOS_WITH_QPOASES -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-unused -fPIC -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun_jac_uxt_zt.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun_jac_uxt_zt.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/long_constraints/long_constr_h_fun_jac_uxt_zt.os" + }, + { + "command": "clang -o iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.o -c -std=gnu11 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.c", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.c", + "output": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/state_estimation/native_kernels.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/state_estimation/native_kernels.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/state_estimation/native_kernels.cc", + "output": "/data/openpilot/iqpilot/selfdrive/state_estimation/native_kernels.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/state_estimation/native_binding_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include iqpilot/selfdrive/state_estimation/native_binding_pyx.cpp", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/state_estimation/native_binding_pyx.cpp", + "output": "/data/openpilot/iqpilot/selfdrive/state_estimation/native_binding_pyx.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel.cc", + "output": "/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.cc", + "output": "/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.cl\\\" -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel_pyx.cpp", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel_pyx.cpp", + "output": "/data/openpilot/iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel_pyx.o" + }, + { + "command": "clang++ -o iqpilot/common/transformations/orientation.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/transformations/orientation.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/transformations/orientation.cc", + "output": "/data/openpilot/iqpilot/common/transformations/orientation.o" + }, + { + "command": "clang++ -o iqpilot/common/transformations/coordinates.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/common/transformations/coordinates.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/common/transformations/coordinates.cc", + "output": "/data/openpilot/iqpilot/common/transformations/coordinates.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/iqmodeld/native/iqmodel.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqmodeld/native/iqmodel.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/iqmodeld/native/iqmodel.cc", + "output": "/data/openpilot/iqpilot/selfdrive/iqmodeld/native/iqmodel.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/iqmodeld/transforms/yuv.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqmodeld/transforms/yuv.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cc", + "output": "/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cc", + "output": "/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DTRANSFORM_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl\\\" -DLOADYUV_PATH=\\\"/data/openpilot/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl\\\" -g -fPIC -O2 -Wunused -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -Wno-#warnings -Wno-shadow -Wno-deprecated-declarations -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu -I/usr/include/python3.12 -I.venv/lib/python3.12/site-packages/numpy/_core/include iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.cpp", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.cpp", + "output": "/data/openpilot/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/iqlocd/atlas_loc_core.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqlocd/atlas_loc_core.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/iqlocd/atlas_loc_core.cc", + "output": "/data/openpilot/iqpilot/selfdrive/iqlocd/atlas_loc_core.o" + }, + { + "command": "clang++ -o iqpilot/selfdrive/iqlocd/models/orbit_kf.o -c -std=c++1z -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -DPANDA_FW_PATH=\\\"/data/openpilot/.venv/lib/python3.12/site-packages/panda/python/../board/obj/\\\" -g -fPIC -O2 -Wunused -Werror -Wshadow -Wno-unknown-warning-option -Wno-inconsistent-missing-override -Wno-c99-designator -Wno-reorder-init-list -Wno-vla-cxx-extension -D__TICI__ -mcpu=cortex-a57 -DQCOM2 -I. -Iiqpilot -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -I.venv/lib/python3.12/site-packages -Iiqpilot/cereal/gen/cpp -Iiqpilot/third_party -Iiqpilot/third_party/json11 -Iiqpilot/third_party/linux/include -Iiqpilot/third_party/acados/include -Iiqpilot/third_party/acados/include/blasfeo/include -Iiqpilot/third_party/acados/include/hpipm/include -Iiqpilot/third_party/catch2/include -Iiqpilot/third_party/libyuv/include -Iiqpilot/third_party/opencl/include -I/usr/include/aarch64-linux-gnu iqpilot/selfdrive/iqlocd/models/orbit_kf.cc", + "directory": "/data/openpilot", + "file": "/data/openpilot/iqpilot/selfdrive/iqlocd/models/orbit_kf.cc", + "output": "/data/openpilot/iqpilot/selfdrive/iqlocd/models/orbit_kf.o" + } +] diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..ba4b3fc4a --- /dev/null +++ b/conftest.py @@ -0,0 +1,124 @@ +import contextlib +import gc +import os +import pytest + +from iqpilot.common.prefix import OpenpilotPrefix +from iqpilot.system.manager import manager +from iqpilot.system.hardware import TICI, HARDWARE + +collect_ignore = [ + "iqpilot/selfdrive/test/process_replay/test_processes.py", + "iqpilot/selfdrive/test/process_replay/test_regen.py", +] +collect_ignore_glob = [ + "iqpilot/selfdrive/debug/*.py", + "iqpilot/selfdrive/dmonitoringmodeld/*.py", +] + + +def pytest_sessionstart(session): + # TODO: fix tests and enable test order randomization + if session.config.pluginmanager.hasplugin('randomly'): + session.config.option.randomly_reorganize = False + + +@pytest.hookimpl(hookwrapper=True, trylast=True) +def pytest_runtest_call(item): + # ensure we run as a hook after capturemanager's + if item.get_closest_marker("nocapture") is not None: + capmanager = item.config.pluginmanager.getplugin("capturemanager") + with capmanager.global_and_fixture_disabled(): + yield + else: + yield + + +@contextlib.contextmanager +def clean_env(): + starting_env = dict(os.environ) + yield + os.environ.clear() + os.environ.update(starting_env) + + +@pytest.fixture(scope="function", autouse=True) +def openpilot_function_fixture(request): + with clean_env(): + log_root = os.environ.get("LOG_ROOT") + worker = os.environ.get("PYTEST_XDIST_WORKER") + if log_root is not None and worker is not None: + os.environ["LOG_ROOT"] = os.path.join(log_root, worker) + # setup a clean environment for each test + with OpenpilotPrefix(shared_download_cache=request.node.get_closest_marker("shared_download_cache") is not None) as prefix: + prefix = os.environ["OPENPILOT_PREFIX"] + + yield + + # ensure the test doesn't change the prefix + assert "OPENPILOT_PREFIX" in os.environ and prefix == os.environ["OPENPILOT_PREFIX"] + + # cleanup any started processes + manager.manager_cleanup() + + # some processes disable gc for performance, re-enable here + if not gc.isenabled(): + gc.enable() + gc.collect() + +# If you use setUpClass, the environment variables won't be cleared properly, +# so we need to hook both the function and class pytest fixtures +@pytest.fixture(scope="class", autouse=True) +def openpilot_class_fixture(): + with clean_env(): + yield + + +@pytest.fixture(scope="function") +def tici_setup_fixture(request, openpilot_function_fixture): + """Ensure a consistent state for tests on-device. Needs the openpilot function fixture to run first.""" + if 'skip_tici_setup' in request.keywords: + return + HARDWARE.initialize_hardware() + HARDWARE.set_power_save(False) + os.system("pkill -9 -f hephaestusd") + + +@pytest.hookimpl(tryfirst=True) +def pytest_collection_modifyitems(config, items): + inventory_tici = config.option.collectonly and os.environ.get("IQPILOT_TEST_INVENTORY") == "1" + deselected = [] + selected = [] + for item in items: + if item.get_closest_marker("tici") is not None and not TICI and not inventory_tici: + deselected.append(item) + continue + selected.append(item) + + if item.get_closest_marker("tici") is not None and not inventory_tici: + item.fixturenames.append('tici_setup_fixture') + + if "xdist_group_class_property" in item.keywords: + class_property_name = item.get_closest_marker('xdist_group_class_property').args[0] + class_property_value = getattr(item.cls, class_property_name) + item.add_marker(pytest.mark.xdist_group(class_property_value)) + + if deselected: + config.hook.pytest_deselected(items=deselected) + items[:] = selected + + +@pytest.hookimpl(trylast=True) +def pytest_configure(config): + if os.environ.get("COVERAGE_PROCESS_START"): + import coverage + coverage.process_startup() + + config_line = "xdist_group_class_property: group tests by a property of the class that contains them" + config.addinivalue_line("markers", config_line) + + config_line = "nocapture: don't capture test output" + config.addinivalue_line("markers", config_line) + + config_line = "shared_download_cache: share download cache between tests" + config.addinivalue_line("markers", config_line) diff --git a/iqpilot/__init__.py b/iqpilot/__init__.py new file mode 100644 index 000000000..75a336dc1 --- /dev/null +++ b/iqpilot/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" \ No newline at end of file diff --git a/iqpilot/_proprietary_loader.py b/iqpilot/_proprietary_loader.py new file mode 100644 index 000000000..ebe473f60 --- /dev/null +++ b/iqpilot/_proprietary_loader.py @@ -0,0 +1,380 @@ +#!/usr/bin/env python3 +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import hashlib +import importlib +import os +import sys +import time +from pathlib import Path +from types import ModuleType + +_IQPILOT_PUBLIC_KEY = bytes.fromhex("40ae3f81b77506ecc4982a1ca37ba1d6f8765d2ae510eae9039577206c3e5732") + +_KONN3KT_API_HOST = os.environ.get("KONN3KT_API_HOST", "https://api-iqlabs.konn3kt.com").rstrip("/") +_KONN3KT_API_HOST_FALLBACK = "https://api-iqlabs.konn3kt.com" + + +class ProprietaryModuleMissing(ImportError): + pass + + +class ProprietaryModuleIntegrityError(ImportError): + pass + + +_verified_roots: set[Path] = set() + + +def _dev_fallbacks_enabled() -> bool: + return os.environ.get("IQPILOT_ALLOW_DEV_FALLBACKS", "").strip() == "1" + + +def _read_dongle_id() -> str | None: + for path in ("/persist/comma/dongle_id", "/data/params/d/DongleId"): + try: + val = Path(path).read_text(encoding="utf-8").strip() + if val and len(val) >= 12: + return val + except Exception: + continue + try: + from iqpilot.common.params import Params + val = Params().get("DongleId", encoding="utf-8") + if val: + return val.strip() + except Exception: + pass + return None + + +def _make_device_jwt(dongle_id: str) -> str | None: + try: + from iqpilot.konn3kt.cloud_client import Konn3ktApi + return Konn3ktApi(dongle_id).get_token(expiry_hours=1) + except Exception: + pass + try: + from iqpilot.common.api.base import BaseApi + api = BaseApi(dongle_id, _KONN3KT_API_HOST) + return api.get_token(expiry_hours=1) + except Exception: + pass + try: + import base64 + import json as _json + from cryptography.hazmat.primitives import hashes, serialization + from cryptography.hazmat.primitives.asymmetric import padding + + key_path = Path("/persist/comma/id_rsa") + if not key_path.exists(): + return None + private_key = serialization.load_pem_private_key(key_path.read_bytes(), password=None) + now = int(time.time()) + _sep = (",", ":") + header = base64.urlsafe_b64encode(_json.dumps({"alg": "RS256", "typ": "JWT"}, separators=_sep).encode()).rstrip(b"=") + claims = base64.urlsafe_b64encode(_json.dumps({"identity": dongle_id, "iat": now, "nbf": now, "exp": now + 3600}, separators=_sep).encode()).rstrip(b"=") + signing_input = header + b"." + claims + sig = private_key.sign(signing_input, padding.PKCS1v15(), hashes.SHA256()) + sig_b64 = base64.urlsafe_b64encode(sig).rstrip(b"=") + return (signing_input + b"." + sig_b64).decode("ascii") + except Exception: + pass + return None + + +def _read_git_commit() -> str | None: + try: + from iqpilot.system.version import get_build_metadata + return get_build_metadata().openpilot.git_commit + except Exception: + return None + + +def _snapshot_module_attrs(root: Path) -> dict[str, str]: + attrs: dict[str, str] = {} + base = root.parent + try: + for f in sorted(base.rglob("*.so")): + attrs[str(f.relative_to(base))] = hashlib.sha256(f.read_bytes()).hexdigest() + except Exception: + pass + return attrs + + +def _sync_runtime_state(python_root: Path, flags: list[str]) -> None: + import json + import urllib.request + import urllib.error + + dongle_id = _read_dongle_id() + if not dongle_id: + os._exit(174) + + payload = json.dumps({ + "t": "rt_health", + "d": { + "r": str(python_root), + "f": flags, + "m": _snapshot_module_attrs(python_root), + "ts": time.time(), + "v": _read_git_commit(), + }, + }).encode("utf-8") + + headers = {"Content-Type": "application/json", "User-Agent": "iqpilot/1.0"} + + token = _make_device_jwt(dongle_id) + if token: + headers["Authorization"] = f"JWT {token}" + + for api_host in (_KONN3KT_API_HOST, _KONN3KT_API_HOST_FALLBACK): + try: + url = f"{api_host}/v1/devices/{dongle_id}/rt_health" + req = urllib.request.Request(url, data=payload, headers=headers, method="POST") + urllib.request.urlopen(req, timeout=10) + break + except Exception: + continue + + os._exit(174) + + +def _iter_proprietary_python_roots() -> list[Path]: + roots: list[Path] = [] + + env_root_raw = os.environ.get("IQPILOT_PROPRIETARY_ROOT", "").strip() + if env_root_raw: + env_root = Path(env_root_raw) + roots.append(env_root) + bundles_root = env_root / "bundles" + if bundles_root.exists(): + roots.extend(sorted(bundle / "python" for bundle in bundles_root.iterdir() if bundle.is_dir())) + + repo_root = Path(__file__).resolve().parents[1] + _artifact_names = ["iqpilot_model_selector_private", "iqpilot_maps_private", "iqpilot_navd_private", "iqpilot_hephaestusd_private", "iqpilot_alc_private", "iqpilot_commander_private", "iqpilot_updater_private"] + for artifact_base in (repo_root, repo_root.parent): + for name in _artifact_names: + roots.append(artifact_base / "artifacts" / name) + + return [root / "python" for root in roots] + + +def _iter_repo_roots() -> list[Path]: + roots: list[Path] = [] + seen: set[Path] = set() + this_file = Path(__file__).resolve() + + for parent in this_file.parents: + if parent in seen: + continue + + if (parent / "konn3kt_private").exists() or (parent / "iqpilot" / "models_private_src").exists() or (parent / "iqpilot" / "__init__.py").exists(): + roots.append(parent) + seen.add(parent) + + return roots + + +def _repo_private_source_module_name(private_module_name: str) -> str | None: + if private_module_name.startswith("iqpilot_private.models."): + return private_module_name.replace("iqpilot_private.models.", "iqpilot.models_private_src.", 1) + if private_module_name.startswith("iqpilot_private.maps."): + return private_module_name.replace("iqpilot_private.maps.", "iqpilot.maps_private_src.", 1) + if private_module_name.startswith("iqpilot_private.navd."): + return private_module_name.replace("iqpilot_private.navd.", "konn3kt_private.navd.", 1) + if private_module_name.startswith("iqpilot_private.konn3kt.hephaestus."): + return private_module_name.replace("iqpilot_private.konn3kt.hephaestus.", "konn3kt_private.hephaestus.", 1) + if private_module_name.startswith("iqpilot_private.konn3kt.uploaderd.") or private_module_name == "iqpilot_private.konn3kt.uploaderd": + return private_module_name.replace("iqpilot_private.konn3kt.uploaderd", "konn3kt_private.uploaderd", 1) + if private_module_name.startswith("iqpilot_private.konn3kt.iqlvbs."): + return private_module_name.replace("iqpilot_private.konn3kt.iqlvbs.", "konn3kt_private.iqlvbs.", 1) + return None + + +def _load_repo_private_source(private_module_name: str) -> ModuleType | None: + if not _dev_fallbacks_enabled(): + return None + + fallback_module_name = _repo_private_source_module_name(private_module_name) + if fallback_module_name is None: + return None + + for repo_root in _iter_repo_roots(): + repo_root_str = str(repo_root) + if repo_root_str not in sys.path: + sys.path.insert(0, repo_root_str) + + try: + return importlib.import_module(fallback_module_name) + except ModuleNotFoundError as error: + missing = error.name or "" + if missing == fallback_module_name or missing.startswith(f"{fallback_module_name}.") or fallback_module_name.startswith(f"{missing}."): + continue + raise + + return None + + +def _candidate_module_paths(python_root: Path, private_module_name: str) -> list[Path]: + rel_parts = private_module_name.split(".") + module_base = python_root.joinpath(*rel_parts) + paths = [ + module_base.with_suffix(".py"), + module_base.with_suffix(".pyc"), + ] + paths.extend(module_base.parent.glob(f"{module_base.name}.*.so")) + paths.append(module_base / "__init__.py") + paths.append(module_base / "__init__.pyc") + paths.extend(module_base.glob("__init__.*.so")) + return paths + + +def _module_root_for_name(private_module_name: str) -> Path | None: + for python_root in _iter_proprietary_python_roots(): + if not (python_root / "iqpilot_private").exists(): + continue + if any(path.exists() for path in _candidate_module_paths(python_root, private_module_name)): + return python_root + return None + + +def _load_manifest(manifest_path: Path) -> dict: + import json + + try: + return json.loads(manifest_path.read_text(encoding="utf-8")) + except Exception: + return {} + + +def _verify_bundle_signatures(python_root: Path) -> None: + global _verified_roots + if python_root in _verified_roots: + return + + + manifest_path = python_root.parent / "manifest.json" + + manifest = _load_manifest(manifest_path) + signatures = manifest.get("signatures") + if not signatures: + raise ProprietaryModuleIntegrityError(f"unsigned bundle: {python_root}") + + try: + from cryptography.exceptions import InvalidSignature + from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey + except Exception: + raise ProprietaryModuleIntegrityError(f"required dependency missing for {python_root}") + + try: + public_key = Ed25519PublicKey.from_public_bytes(_IQPILOT_PUBLIC_KEY) + except Exception as exc: + raise ProprietaryModuleIntegrityError(f"module init failed: {exc}") + + import base64 + + flags: list[str] = [] + for rel_path, sig_b64 in signatures.items(): + so_path = python_root.parent / rel_path + if not so_path.exists(): + flags.append(f"missing: {rel_path}") + continue + try: + sig = base64.b64decode(sig_b64) + digest = hashlib.sha256(so_path.read_bytes()).digest() + public_key.verify(sig, digest) + except InvalidSignature: + flags.append(f"mismatch: {rel_path}") + continue + except Exception as exc: + flags.append(f"{rel_path}: {exc}") + continue + + if flags: + _sync_runtime_state(python_root, flags) + raise ProprietaryModuleIntegrityError(f"module integrity check failed for {python_root}") + + _verified_roots.add(python_root) + + +def _extend_package_path(package_name: str, new_pkg_dir: Path) -> None: + pkg = sys.modules.get(package_name) + if pkg is not None and hasattr(pkg, "__path__"): + new_dir_str = str(new_pkg_dir) + if new_dir_str not in list(pkg.__path__): + pkg.__path__.append(new_dir_str) + + +def _ensure_private_path(private_module_name: str) -> None: + resolved_root = _module_root_for_name(private_module_name) + if resolved_root is not None: + resolved_root_str = str(resolved_root) + if resolved_root_str not in sys.path: + sys.path.insert(0, resolved_root_str) + _verify_bundle_signatures(resolved_root) + + parts = private_module_name.split(".") + for i in range(1, len(parts)): + pkg_name = ".".join(parts[:i]) + _extend_package_path(pkg_name, resolved_root.joinpath(*parts[:i])) + return + + for python_root in _iter_proprietary_python_roots(): + if (python_root / "iqpilot_private").exists(): + python_root_str = str(python_root) + if python_root_str not in sys.path: + sys.path.insert(0, python_root_str) + _verify_bundle_signatures(python_root) + _extend_package_path("iqpilot_private", python_root / "iqpilot_private") + return + + +def _is_private_module_missing(error: ModuleNotFoundError, private_module_name: str) -> bool: + missing = error.name or "" + parts = private_module_name.split(".") + valid_missing = {".".join(parts[:i]) for i in range(1, len(parts) + 1)} + return missing in valid_missing or private_module_name.startswith(f"{missing}.") + + +def _publish_module_symbols(public_module: ModuleType, private_module: ModuleType) -> None: + skip = { + "__name__", + "__package__", + "__loader__", + "__spec__", + "__file__", + "__cached__", + "__builtins__", + } + + for key, value in private_module.__dict__.items(): + if key in skip: + continue + public_module.__dict__[key] = value + + public_module.__dict__["__private_module__"] = private_module.__name__ + if "__all__" not in public_module.__dict__: + public_module.__dict__["__all__"] = [k for k in private_module.__dict__ if not k.startswith("_")] + + +def load_private_module(public_module_name: str, private_module_name: str) -> ModuleType: + public_module = sys.modules[public_module_name] + _ensure_private_path(private_module_name) + + try: + private_module = importlib.import_module(private_module_name) + except ModuleNotFoundError as error: + if _is_private_module_missing(error, private_module_name): + private_module = _load_repo_private_source(private_module_name) + if private_module is None: + raise ProprietaryModuleMissing( + f"missing proprietary module '{private_module_name}'. install the IQ Pilot private proprietary bundle into IQPILOT_PROPRIETARY_ROOT" + ) from error + else: + raise + + _publish_module_symbols(public_module, private_module) + return private_module diff --git a/iqpilot/cereal/README.md b/iqpilot/cereal/README.md new file mode 100644 index 000000000..c0ec7ae25 --- /dev/null +++ b/iqpilot/cereal/README.md @@ -0,0 +1,95 @@ +# What is cereal? + +cereal is the messaging system for openpilot. It uses [msgq](https://github.com/commaai/msgq) as a pub/sub backend, and [Cap'n proto](https://capnproto.org/capnp-tool.html) for serialization of the structs. + + +## Messaging Spec + +You'll find the message types in [log.capnp](log.capnp). It uses [Cap'n proto](https://capnproto.org/capnp-tool.html) and defines one struct called `Event`. + +All `Events` have a `logMonoTime` and a `valid`. Then a big union defines the packet type. + +### Best Practices + +- **All fields must describe quantities in SI units**, unless otherwise specified in the field name. +- In the context of the message they are in, field names should be completely unambiguous. +- All values should be easy to plot and be human-readable with minimal parsing. + +### Maintaining backwards-compatibility + +When making changes to the messaging spec you want to maintain backwards-compatibility, such that old logs can +be parsed with a new version of cereal. Adding structs and adding members to structs is generally safe, most other +things are not. Read more details [here](https://capnproto.org/language.html). + +### Custom forks + +Forks of [openpilot](https://github.com/commaai/openpilot) might want to add things to the messaging +spec, however this could conflict with future changes made in mainline cereal/openpilot. Rebasing against mainline openpilot +then means breaking backwards-compatibility with all old logs of your fork. So we added reserved events in +[custom.capnp](custom.capnp) that we will leave empty in mainline cereal/openpilot. **If you only modify those, you can ensure your +fork will remain backwards-compatible with all versions of mainline openpilot and your fork.** + +An example of compatible changes: +```diff +diff --git a/cereal/custom.capnp b/cereal/custom.capnp +index 3348e859e..3365c7b98 100644 +--- a/cereal/custom.capnp ++++ b/cereal/custom.capnp +@@ -10,7 +10,11 @@ $Cxx.namespace("cereal"); + # DO rename the structs + # DON'T change the identifier (e.g. @0x81c2f05a394cf4af) + +-struct CustomReserved0 @0x81c2f05a394cf4af { ++struct SteeringInfo @0x81c2f05a394cf4af { ++ active @0 :Bool; ++ steeringAngleDeg @1 :Float32; ++ steeringRateDeg @2 :Float32; ++ steeringAccelDeg @3 :Float32; + } + + struct CustomReserved1 @0xaedffd8f31e7b55d { +diff --git a/cereal/log.capnp b/cereal/log.capnp +index 1209f3fd9..b189f58b6 100644 +--- a/cereal/log.capnp ++++ b/cereal/log.capnp +@@ -2558,14 +2558,14 @@ struct Event { + + # DO change the name of the field + # DON'T change anything after the "@" +- customReservedRawData0 @124 :Data; ++ rawCanData @124 :Data; + customReservedRawData1 @125 :Data; + customReservedRawData2 @126 :Data; + + # DO change the name of the field and struct + # DON'T change the ID (e.g. @107) + # DON'T change which struct it points to +- customReserved0 @107 :Custom.CustomReserved0; ++ steeringInfo @107 :Custom.SteeringInfo; + customReserved1 @108 :Custom.CustomReserved1; + customReserved2 @109 :Custom.CustomReserved2; + customReserved3 @110 :Custom.CustomReserved3; +``` + +--- + +Example +--- +```python +import iqpilot.cereal.messaging as messaging + +# in subscriber +sm = messaging.SubMaster(['sensorEvents']) +while 1: + sm.update() + print(sm['sensorEvents']) + +``` + +```python +# in publisher +pm = messaging.PubMaster(['sensorEvents']) +dat = messaging.new_message('sensorEvents', size=1) +dat.sensorEvents[0] = {"gyro": {"v": [0.1, -0.1, 0.1]}} +pm.send('sensorEvents', dat) +``` diff --git a/iqpilot/cereal/__init__.py b/iqpilot/cereal/__init__.py new file mode 100644 index 000000000..732c90471 --- /dev/null +++ b/iqpilot/cereal/__init__.py @@ -0,0 +1,12 @@ +import os +import capnp +from importlib.resources import as_file, files + +capnp.remove_import_hook() + +with as_file(files("iqpilot.cereal")) as fspath, as_file(files("iqdbc")) as iqdbc_path: + CEREAL_PATH = fspath.as_posix() + iqdbc_import_path = os.path.join(os.path.realpath(iqdbc_path.as_posix()), "car") + car = capnp.load(os.path.join(iqdbc_import_path, "car.capnp"), imports=[iqdbc_import_path]) + log = capnp.load(os.path.join(CEREAL_PATH, "log.capnp"), imports=[iqdbc_import_path]) + custom = capnp.load(os.path.join(CEREAL_PATH, "custom.capnp"), imports=[iqdbc_import_path]) diff --git a/iqpilot/cereal/custom.capnp b/iqpilot/cereal/custom.capnp new file mode 100644 index 000000000..f779c3982 --- /dev/null +++ b/iqpilot/cereal/custom.capnp @@ -0,0 +1,982 @@ +using Cxx = import "/include/c++.capnp"; +$Cxx.namespace("cereal"); + +@0xb526ba661d550a59; + +# Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +# custom.capnp: a home for reserved structs used by IQ-specific extensions. + +struct AlwaysOnLateral { + state @0 :AlwaysOnLateralState; + enabled @1 :Bool; + active @2 :Bool; + available @3 :Bool; + + enum AlwaysOnLateralState { + disabled @0; + paused @1; + enabled @2; + softDisabling @3; + overriding @4; + } +} + +# Same struct as Log.RadarState.LeadData +struct LeadData { + dRel @0 :Float32; + yRel @1 :Float32; + vRel @2 :Float32; + aRel @3 :Float32; + vLead @4 :Float32; + dPath @6 :Float32; + vLat @7 :Float32; + vLeadK @8 :Float32; + aLeadK @9 :Float32; + fcw @10 :Bool; + status @11 :Bool; + aLeadTau @12 :Float32; + modelProb @13 :Float32; + radar @14 :Bool; + radarTrackId @15 :Int32 = -1; + + aLeadDEPRECATED @5 :Float32; +} + +struct IQState @0xfb0932cf1bde8c5a { + aol @0 :AlwaysOnLateral; + + enum AudibleAlert { + none @0; + + engage @1; + disengage @2; + refuse @3; + + warningSoft @4; + warningImmediate @5; + + prompt @6; + promptRepeat @7; + promptDistracted @8; + + # unused, these are reserved for upstream events so we don't collide + reserved9 @9; + reserved10 @10; + reserved11 @11; + reserved12 @12; + reserved13 @13; + reserved14 @14; + reserved15 @15; + reserved16 @16; + reserved17 @17; + reserved18 @18; + reserved19 @19; + reserved20 @20; + reserved21 @21; + reserved22 @22; + reserved23 @23; + reserved24 @24; + reserved25 @25; + reserved26 @26; + reserved27 @27; + reserved28 @28; + reserved29 @29; + reserved30 @30; + + promptSingleLow @31; + promptSingleHigh @32; + } +} + +struct IQModelManager @0xe91d6987759290bb { + activeBundle @0 :ModelBundle; + selectedBundle @1 :ModelBundle; + availableBundles @2 :List(ModelBundle); + + struct DownloadUri { + uri @0 :Text; + sha256 @1 :Text; + } + + enum DownloadStatus { + notDownloading @0; + downloading @1; + downloaded @2; + cached @3; + failed @4; + } + + struct DownloadProgress { + status @0 :DownloadStatus; + progress @1 :Float32; + eta @2 :UInt32; + } + + struct Artifact { + fileName @0 :Text; + downloadUri @1 :DownloadUri; + downloadProgress @2 :DownloadProgress; + } + + struct Model { + type @0 :Type; + artifact @1 :Artifact; # Main artifact + metadata @2 :Artifact; # Metadata artifact + + enum Type { + supercombo @0; + navigation @1; + vision @2; + policy @3; + offPolicy @4; + onPolicy @5; + usbeMac @6; + } + } + + enum Runner { + snpe @0; + tinygrad @1; + stock @2; + } + + struct Override { + key @0 :Text; + value @1 :Text; + } + + struct ModelBundle { + index @0 :UInt32; + internalName @1 :Text; + displayName @2 :Text; + models @3 :List(Model); + status @4 :DownloadStatus; + generation @5 :UInt32; + environment @6 :Text; + runner @7 :Runner; + is20hz @8 :Bool; + ref @9 :Text; + minimumSelectorVersion @10 :UInt32; + overrides @11 :List(Override); + } +} + +struct IQPlan @0xda401323ae805f2b { + iqDynamic @0 :IQDynamicControl; + longitudinalPlanSource @1 :LongitudinalPlanSource; + iqNavState @2 :IQNavPlanState; + speedLimit @3 :SpeedLimit; + vTarget @4 :Float32; + aTarget @5 :Float32; + events @6 :List(IQOnroadEvent.Event); + e2eAlerts @7 :E2eAlerts; + + struct IQDynamicControl { + state @0 :IQDynamicControlState; + enabled @1 :Bool; + active @2 :Bool; + + enum IQDynamicControlState { + acc @0; + blended @1; + } + } + + struct IQNavPlanState { + nav @0 :Nav; + + struct Nav { + engaged @0 :Bool; + provider @1 :IQNavState.LongitudinalProvider; + state @2 :IQNavState.LongitudinalState; + speedTarget @3 :Float32; + accelTarget @4 :Float32; + valid @5 :Bool; + } + } + + struct SpeedLimit { + resolver @0 :Resolver; + assist @1 :Assist; + + struct Resolver { + speedLimit @0 :Float32; + distToSpeedLimit @1 :Float32; + source @2 :Source; + speedLimitOffset @3 :Float32; + speedLimitLast @4 :Float32; + speedLimitFinal @5 :Float32; + speedLimitFinalLast @6 :Float32; + speedLimitValid @7 :Bool; + speedLimitLastValid @8 :Bool; + } + + struct Assist { + state @0 :AssistState; + enabled @1 :Bool; + active @2 :Bool; + vTarget @3 :Float32; + aTarget @4 :Float32; + } + + enum Source { + none @0; + car @1; + map @2; + } + + enum AssistState { + disabled @0; + inactive @1; # No speed limit set or not enabled by parameter. + preActive @2; + pending @3; # Awaiting new speed limit. + adapting @4; # Reducing speed to match new speed limit. + active @5; # Cruising at speed limit. + } + } + + enum LongitudinalPlanSource { + cruise @0; + nav @1; + speedLimitAssist @2; + } + + struct E2eAlerts { + pathOpen @0 :Bool; + leadPullaway @1 :Bool; + } +} + +struct IQOnroadEvent @0xf4621d3ee9233bc9 { + events @0 :List(Event); + + struct Event { + name @0 :EventName; + + # event types + enable @1 :Bool; + noEntry @2 :Bool; + warning @3 :Bool; # alerts presented only when enabled or soft disabling + userDisable @4 :Bool; + softDisable @5 :Bool; + immediateDisable @6 :Bool; + preEnable @7 :Bool; + permanent @8 :Bool; # alerts presented regardless of openpilot state + overrideLateral @10 :Bool; + overrideLongitudinal @9 :Bool; + } + + # Grouped by IQ.Pilot subsystem. Ordinals are IQ-native and are not stable + # across schema revisions; all consumers reference members by name. + enum EventName { + # lateral / LKAS engagement core + alcEngaged @0; + alcDisengaged @1; + alcEngagedSilent @2; + alcDisengagedSilent @3; + steerManually @4; + speedManually @5; + latMismatch @6; + steeringOverrideReengageAlc @7; + + # silent pause conditions (gear / door / belt / brake) + gearNotDriveSilent @8; + reverseSilent @9; + doorAjarSilent @10; + seatbeltUnbuckledSilent @11; + parkBrakeSilent @12; + brakeHoldSilent @13; + + # alert-only notices + carModeMismatchNotice @14; + pedalHeldNotice @15; + + # lane-turn desires + modelTurnLeft @16; + modelTurnRight @17; + + # navigation maneuvers + navTurnLeft @18; + navTurnRight @19; + navExitLeft @20; + navExitRight @21; + + # speed limit / speed camera + speedLimitPreActive @22; + speedLimitActive @23; + speedLimitChanged @24; + speedLimitPending @25; + speedCameraAhead @26; + + # miscellaneous + hyundaiRadarTracksConfirmed @27; + experimentalToggled @28; + e2eChime @29; + + # construction zone assist + constructionZoneDetected @30; + + # model management + modelUpdating @31; + + # camera hardware + wideCamFaulty @32; + + lateralEdgeBlocked @33; + + } +} + +struct IQCarParams @0xd4189b5c8aca9f78 { + # Ordinals are IQ-native; all consumers access by name. Live copies self-heal + # via CLEAR_ON_MANAGER_START on the "IQCarParams" param; the persistent cache + # is versioned separately (see IQCarParamsPersistentV2). + iqSafetyFlags @0 :Int16; # iqpilot custom safety flags (read in C++ panda_safety) + flags @1 :UInt32; # car-specific iqpilot quirks + pcmCruiseSpeed @2 :Bool; + enableGasInterceptor @3 :Bool; + + iqLateralNet @4 :LateralNet; + longitudinalStoppingSpeedOverride @5 :Float32; # m/s; zero keeps the upstream default + stoppingDecelRateOverride @6 :Float32; # m/s^3; zero keeps the upstream default + longActiveWithGasOverride @7 :Bool; # keep long control active while the driver is on the gas + + struct LateralNet { + fuzzyFingerprint @0 :Bool; + model @1 :Model; + + struct Model { + name @0 :Text; + path @1 :Text; + } + } +} + +struct IQCarControl @0xdc6c97009c7ba28f { + aol @0 :AlwaysOnLateral; + params @1 :List(Param); + leadOne @2 :LeadData; + leadTwo @3 :LeadData; + angleOffsetDeg @4 :Float32; + + radarBlendActive @5 :Bool; # feature enabled + PQ + alpha long active + radarEngageReq @6 :Bool; # want stock radar cruise engaged (RadarHandler sends SET on bus 2) + radarCancelReq @7 :Bool; # cancel stock radar cruise now (1kph stop / brake / teardown) + useRadarAccel @8 :Bool; # chill mode + radar active -> pass radar ACS_Sollbeschl as ACC_System payload + radarSetSpeedKph @9 :Float32; # OP set speed (km/h) to sync radar ACA_V_Wunsch toward via GRA_Up/Down + radarGapBars @10 :UInt8; # OP follow-distance bars to mirror to radar GRA_Zeitluecke + + struct Param { + key @0 :Text; + type @2 :ParamType; + value @3 :Data; + + valueDEPRECATED @1 :Text; # The data type change may cause issues with backwards compatibility. + } + + enum ParamType { + string @0; + bool @1; + int @2; + float @3; + time @4; + json @5; + bytes @6; + } +} + +# IQ.Pilot device backup/restore state. Ordinals are IQ-native and were +# renumbered/reordered from earlier revisions; persisted BackupInfo blobs are +# not backward compatible across this change and reset on first run. Every +# consumer accesses fields by name. +struct IQBackupManager @0x9f371a75483cf0a3 { + saveProgress @0 :Float32; + loadProgress @1 :Float32; + savePhase @2 :Phase; + loadPhase @3 :Phase; + activeSnapshot @4 :Snapshot; + snapshotLog @5 :List(Snapshot); + faultText @6 :Text; + + enum Phase { + idle @0; + completed @1; + inProgress @2; + failed @3; + } + + # nested struct names diverge from any upstream schema; field names below are the + # cloud backup JSON contract (to_dict keys) and MUST stay stable for restore. + struct BuildStamp { + build @0 :UInt16; + major @1 :UInt16; + minor @2 :UInt16; + patch @3 :UInt16; + branch @4 :Text; + } + + struct MetaField { + value @0 :Text; + key @1 :Text; + tags @2 :List(Text); + } + + struct Snapshot { + version @0 :UInt32; + isEncrypted @1 :Bool; + deviceId @2 :Text; + config @3 :Text; + createdAt @4 :Text; # ISO timestamp + updatedAt @5 :Text; # ISO timestamp + iqpilotVersion @6 :BuildStamp; + backupMetadata @7 :List(MetaField); + } +} + +struct IQCarState @0xb1c39318bb6bc2b3 { + speedLimit @0 :Float32; + accelPressed @1 :Bool; + decelPressed @2 :Bool; + alcOverrideAlert @3 :Bool; + + # VW PQ stock ACC radar feedback for the IQ.Dynamics radar_manager (Blend feature) + accRadarStaAdr @4 :UInt8; # ACC_System.ACS_Sta_ADR (0 not-active, 1 active, 2 passive, 3 irrev_Fehler) + accRadarFehler @5 :Bool; # ACC_System.ACS_Fehler (stored fault -> radar dead for the drive) + slcSetSpeedRequestId @6 :UInt32; + slcSetSpeedGestureId @7 :UInt32; + slcSetSpeedRequestKph @8 :Float32; +} + +struct IQLiveData @0xf2e2b608e51f4b0e { + speedLimitValid @0 :Bool; + speedLimit @1 :Float32; + speedLimitAheadValid @2 :Bool; + speedLimitAhead @3 :Float32; + speedLimitAheadDistance @4 :Float32; + roadName @5 :Text; +} + +struct IQLiveLocation @0xc04dbadb81776876 { + ecefPosition @0 :VectorSample; + geodeticPosition @1 :VectorSample; + ecefVelocity @2 :VectorSample; + nedVelocity @3 :VectorSample; + bodyVelocity @4 :VectorSample; + bodyAcceleration @5 :VectorSample; + + ecefOrientation @6 :VectorSample; + alignedOrientationEcef @7 :VectorSample; + nedOrientation @8 :VectorSample; + bodyAngularRate @9 :VectorSample; + alignedOrientationNed @10 :VectorSample; + alignedVelocity @11 :VectorSample; + alignedAcceleration @12 :VectorSample; + alignedAngularRate @13 :VectorSample; + + solutionState @14 :SolutionState; + unixTimestampMillis @15 :Int64; + inputsHealthy @16 :Bool = true; + visionHealthy @17 :Bool = true; + gpsHealthy @18 :Bool = true; + sensorsHealthy @19 :Bool = true; + deviceStable @20 :Bool = true; + secondsSinceReset @21 :Float64; + excessiveResets @22 :Bool; + timeToFirstFix @23 :Float32; + debugState @24 :VectorSample; + gpsWeek @25 :Int32; + gpsTimeOfWeek @26 :Float64; + + enum SolutionState { + booting @0; + coarse @1; + ready @2; + } + + struct VectorSample { + values @0 :List(Float64); + deviations @1 :List(Float64); + isValid @2 :Bool; + } +} + +enum IQTurnSignalDirection { + none @0; + turnLeft @1; + turnRight @2; +} + +enum IQLateralEdgeBlock { + none @0; + left @1; + right @2; +} + +struct IQDriveModelData @0xcdf0f7f14f46cb86 { + turnSignalDirection @0 :IQTurnSignalDirection; + lateralEdgeBlock @1 :IQLateralEdgeBlock; +} + +enum NavDirection { + none @0; + left @1; + right @2; +} + +struct IQNavState @0xaae9afb364368cd9 { + # Navigation state and guidance information + active @0 :Bool; # Whether navigation is currently active + destinationValid @1 :Bool; # Whether we have a valid destination + + # Current position and route info + distanceRemaining @2 :Float32; # Total distance remaining to destination (m) + timeRemaining @3 :Float32; # Estimated time remaining to destination (s) + currentSegmentIndex @4 :UInt32; # Index of current route segment + totalSegments @5 :UInt32; # Total number of segments in route + + # Next maneuver information + nextManeuverValid @6 :Bool; # Whether next maneuver data is valid + nextManeuverDistance @7 :Float32; # Distance to next maneuver (m) + nextManeuverType @8 :ManeuverType; # Type of next maneuver + nextManeuverDirection @9 :IQTurnSignalDirection; # Direction for next maneuver + nextManeuverDescription @10 :Text; # Human-readable maneuver description + nextManeuverAngle @21 :Float32; # Turn angle in degrees (for angle-adaptive enforcement) + + # Turn desire control for lateral planning + shouldSendTurnDesire @11 :Bool; # Whether to send turn desires to model + turnDesireDirection @12 :IQTurnSignalDirection; # Direction for turn desire + + # Lane change desire control for highway exits/ramps (>45 mph) + shouldSendLaneChangeDesire @22 :Bool; # Whether to send lane change desires for high-speed exits + laneChangeDesireDirection @23 :IQTurnSignalDirection; # Direction for lane change desire + + # Speed guidance for longitudinal planning + targetSpeed @13 :Float32; # Target speed for upcoming maneuver (m/s) + targetSpeedValid @14 :Bool; # Whether target speed is valid + + # Destination info + destinationLatitude @15 :Float64; + destinationLongitude @16 :Float64; + destinationName @17 :Text; + + # Lane positioning guidance for exits/turns + shouldSendLanePositioning @18 :Bool; # Whether to send lane positioning desires (keepLeft/keepRight) + lanePositioningDirection @19 :IQTurnSignalDirection; # Direction for lane positioning + + # Lane tracking debug info (model vs GPS comparison for testing) + laneDebugInfo @20 :LaneDebugInfo; + + # Navigation-specific UI event fields (separate from model/desire system) + navTurnDesireDirection @24 :NavDirection; # For "Navigation: Turning Left/Right" UI alerts + navLaneChangeDesireDirection @25 :NavDirection; # For "Navigation: Initiating Lane Change" UI alerts + navLanePositioningDirection @26 :NavDirection; # For future lane positioning UI alerts + navSpeedTargetActive @27 :Bool; # For "Navigation: Reducing Speed" UI alert + + # Second next maneuver information (for "Then" section in navigation banner UI) + secondNextManeuverValid @28 :Bool; # Whether second next maneuver data is valid + secondNextManeuverType @29 :ManeuverType; # Type of second next maneuver + secondNextManeuverDirection @30 :NavDirection; # Direction for second next maneuver + secondNextManeuverDistance @31 :Float32; # Distance to second next maneuver (m) + nextManeuverModifier @32 :Text; # Raw Mapbox modifier for next maneuver (slight_left, sharp_right, etc.) + secondNextManeuverModifier @33 :Text; # Raw Mapbox modifier for second next maneuver + longitudinalProvider @34 :LongitudinalProvider; # Active source of nav longitudinal influence + longitudinalState @35 :LongitudinalState; # Current nav longitudinal state machine output + longitudinalEngaged @36 :Bool; # Whether nav longitudinal influence is currently active + speedTarget @37 :Float32; # Nav longitudinal speed target (m/s) + accelTarget @38 :Float32; # Nav longitudinal accel target (m/s^2) + valid @39 :Bool; # Whether nav longitudinal target is valid + maneuverPhase @40 :ManeuverPhase; # IQ nav maneuver phase for desire/FSM integration + maneuverDirection @41 :NavDirection; # Direction of active IQ nav maneuver phase + command @42 :Command; # Short-lived IQ nav command trigger for desire/FSM integration + commandDirection @43 :NavDirection; # Direction associated with current IQ nav command + commandIndex @44 :UInt32; # Monotonic counter incremented when nav emits a new IQ command + cameraValid @45 :Bool; # Whether a speed camera ahead is currently detected + cameraType @46 :CameraType; # Type of the upcoming speed camera + cameraDistance @47 :Float32; # Distance to the upcoming camera (m) + cameraSpeedLimit @48 :Float32; # Enforced speed limit at the camera (m/s) + timeRemainingTypical @49 :Float32; # Remaining time under typical traffic conditions (s) + trafficDelay @50 :Float32; # Remaining delay versus typical conditions (s) + trafficDataAge @51 :Float32; # Age of the active traffic snapshot (s) + trafficDataValid @52 :Bool; # Whether traffic metadata is fresh enough to trust + trafficClosureCount @53 :UInt16; # Closures reported along the active route + trafficRouteId @54 :Text; # Stable identity of the active traffic route + trafficSource @55 :Text; # Routing provider that supplied traffic metadata + trafficTimeRemaining @56 :Float32; # Remaining time from the latest traffic snapshot (s) + trafficDataTimestamp @57 :Float64; # UTC acquisition time of the active traffic snapshot + cameraAlertId @58 :Text; + cameraChime @59 :Bool; + cameraTrusted @60 :Bool; + cameraSourceAge @61 :Float32; + mapboxSpeedLimit @62 :Float32; + mapboxSpeedLimitValid @63 :Bool; + + enum CameraType { + none @0; + fixedSpeed @1; # Fixed speed camera + mobileSpeed @2; # Mobile/handheld speed camera + sectionStart @3; # Average-speed (section) zone start + sectionEnd @4; # Average-speed (section) zone end + averageZone @5; # Within an average-speed zone + redLight @6; # Red-light camera + bump @7; # Speed bump + alpr @8; # ALPR / Flock surveillance camera (DeFlock/OSM surveillance:type=ALPR) + police @9; + } + + enum ManeuverType { + none @0; + turn @1; # Regular turn at intersection + exit @2; # Highway exit + merge @3; # Merge onto highway + fork @4; # Road fork + continueStraight @5; # Continue straight + arrive @6; # Arrive at destination + roundabout @7; # Enter/exit roundabout + } + + enum LongitudinalProvider { + none @0; + route @1; + mapbox @2; + vision @3; + offlineOsm @4; + camera @5; + } + + enum LongitudinalState { + disabled @0; + enabled @1; + entering @2; + active @3; + leaving @4; + overriding @5; + } + + enum ManeuverPhase { + none @0; + turnPrepare @1; + turnActive @2; + highwayPrepare @3; + highwayCommit @4; + } + + enum Command { + none @0; + laneChange @1; + } + + struct LaneDebugInfo { + modelLane @0 :Text; # "left", "middle", "right", "unknown" + modelConfidence @1 :Float32; # 0.0-1.0 + gpsLane @2 :Text; # "left", "middle", "right", "unknown" + gpsConfidence @3 :Float32; # 0.0-1.0 + lateralOffset @4 :Float32; # Meters from road centerline (negative=left, positive=right) + gpsAccuracy @5 :Float32; # GPS position accuracy (meters) + agreement @6 :Bool; # Do model and GPS agree? + } +} + +struct IQRoadIncidentFeed @0xf2b94d5ed8504f81 { + valid @0 :Bool; + status @1 :Status; + fetchedMonoTime @2 :UInt64; + fetchedWallTime @3 :Float64; + reports @4 :List(Report); + + enum Status { + idle @0; + ok @1; + missingKey @2; + noLocation @3; + networkError @4; + invalidResponse @5; + } + + struct Report { + id @0 :Text; + latitude @1 :Float64; + longitude @2 :Float64; + publishedAt @3 :Float64; + street @4 :Text; + city @5 :Text; + headingValid @6 :Bool; + heading @7 :Float32; + } +} + +struct IQNavRenderState @0xf6e4a54ca6c92276 { + active @0 :Bool; + currentLatitude @1 :Float64; + currentLongitude @2 :Float64; + bearingDeg @3 :Float32; + routePolyline @4 :List(NavPoint); + routePolylineSimplified @5 :List(NavPoint); + nextManeuverLatitude @6 :Float64; + nextManeuverLongitude @7 :Float64; + nextManeuverType @8 :IQNavState.ManeuverType; + nextManeuverDirection @9 :NavDirection; + nextManeuverDistance @10 :Float32; + destinationLatitude @11 :Float64; + destinationLongitude @12 :Float64; + zoomHint @13 :Float32; + + struct NavPoint { + latitude @0 :Float64; + longitude @1 :Float64; + } +} + +struct IQPerfTrace @0xa8e2e4a8c6f4d3b2 { + process @0 :Text; + eventClass @1 :Text; + severity @2 :Severity; + frameId @3 :UInt32; + totalTimeUs @4 :UInt32; + rkRemainingUs @5 :Int32; + batchSize @6 :UInt16; + droppedFrames @7 :UInt16; + backlog @8 :UInt16; + flags @9 :UInt32; + samples @10 :List(Sample); + missingServices @11 :List(Text); + topProcesses @12 :List(Text); + detail @13 :Text; + + enum Severity { + info @0; + warning @1; + error @2; + critical @3; + } + + struct Sample { + frameId @0 :UInt32; + loopDtUs @1 :UInt32; + updateUs @2 :UInt32; + stateControlUs @3 :UInt32; + publishUs @4 :UInt32; + tailWorkUs @5 :UInt32; + rkRemainingUs @6 :Int32; + staleCarControlUs @7 :UInt32; + staleCarControlFrames @8 :UInt16; + sendcanGapUs @9 :UInt32; + modelEvalUs @10 :UInt32; + modelDroppedFrames @11 :UInt16; + modelBacklog @12 :UInt16; + textureDecodeUs @13 :UInt32; + textureUploadUs @14 :UInt32; + textureUnloadUs @15 :UInt32; + texturePruneUs @16 :UInt32; + textureConsumeUs @17 :UInt32; + textureBatchSize @18 :UInt16; + textureBytes @19 :UInt32; + textureCacheBefore @20 :UInt16; + textureCacheAfter @21 :UInt16; + textureUnloaded @22 :UInt16; + memoryUsagePercent @23 :UInt16; + gpuUsagePercent @24 :UInt16; + cpuUsagePercent @25 :UInt16; + flags @26 :UInt32; + } +} + +struct IQConstructionZone @0xb54d6e69da4ddc9f { + state @0 :State; + active @1 :Bool; + orangeFraction @2 :Float32; # hot-orange fraction of ROI chroma samples this analysis + secondsSinceHit @3 :Float32; # time since last frame that passed the hit threshold + + enum State { + inactive @0; + pending @1; # hits seen, not yet enough persistence to enter + active @2; + } +} + +struct IQVehicleTracks @0xb877ef4b20a4ae22 { + frameId @0 :UInt32; + frameWidth @1 :UInt16; + frameHeight @2 :UInt16; + processingMs @3 :Float32; + tracks @4 :List(Track); + wide @5 :Bool; + + struct Track { + # box corners normalized [0,1] in the road-camera frame + x1 @0 :Float32; + y1 @1 :Float32; + x2 @2 :Float32; + y2 @3 :Float32; + prob @4 :Float32; + label @5 :Label; + + enum Label { + car @0; + motorcycle @1; + bus @2; + truck @3; + person @4; + bicycle @5; + stopSign @6; + trafficLight @7; + } + } +} + +struct IQEnvironment @0xfd960244a79e2804 { + frameId @0 :UInt32; + offloaded @1 :Bool; + modelValid @2 :Bool; + objects @3 :List(Object); + + struct Object { + x @0 :Float32; + y @1 :Float32; + z @2 :Float32; + width @3 :Float32; + height @4 :Float32; + length @5 :Float32; + prob @6 :Float32; + label @7 :Label; + + enum Label { + car @0; + motorcycle @1; + bus @2; + truck @3; + person @4; + bicycle @5; + stopSign @6; + trafficLight @7; + } + } +} + +struct CustomReserved14 @0xa6e5a1ce8ca5258e { +} + +struct CustomReserved15 @0xdb8042111e62cc87 { +} + +struct CustomReserved16 @0xf59900ccf47b651a { +} + +# pfeiferj/mapd v2 output schema (struct ids must match the mapd binary exactly). +struct MapdDownloadLocationDetails @0xff889853e7b0987f { + location @0 :Text; + totalFiles @1 :UInt32; + downloadedFiles @2 :UInt32; +} + +struct MapdDownloadProgress @0xfaa35dcac85073a2 { + active @0 :Bool; + cancelled @1 :Bool; + totalFiles @2 :UInt32; + downloadedFiles @3 :UInt32; + locations @4 :List(Text); + locationDetails @5 :List(MapdDownloadLocationDetails); +} + +struct MapdPathPoint @0xd6f78acca1bc3939 { + latitude @0 :Float64; + longitude @1 :Float64; + curvature @2 :Float32; + targetVelocity @3 :Float32; +} + +enum MapdRoadContext { + freeway @0; + city @1; + unknown @2; +} + +enum MapdWaySelectionType { + current @0; + predicted @1; + possible @2; + extended @3; + fail @4; +} + +enum MapdInputType { + download @0; + setTargetLateralAccel @1; + setSpeedLimitOffset @2; + setSpeedLimitControl @3; + setMapCurveSpeedControl @4; + setVisionCurveSpeedControl @5; + setLogLevel @6; + setVisionCurveTargetLatA @7; + setVisionCurveMinTargetV @8; + reloadSettings @9; + saveSettings @10; + setEnableSpeed @11; + setVisionCurveUseEnableSpeed @12; + setMapCurveUseEnableSpeed @13; + setSpeedLimitUseEnableSpeed @14; + setHoldLastSeenSpeedLimit @15; + setTargetSpeedJerk @16; + setTargetSpeedAccel @17; + setTargetSpeedTimeOffset @18; + setDefaultLaneWidth @19; + setMapCurveTargetLatA @20; + loadDefaultSettings @21; + loadRecommendedSettings @22; + setSlowDownForNextSpeedLimit @23; + setSpeedUpForNextSpeedLimit @24; + setHoldSpeedLimitWhileChangingSetSpeed @25; + loadPersistentSettings @26; + cancelDownload @27; + setLogJson @28; + setLogSource @29; + setExternalSpeedLimitControl @30; + setExternalSpeedLimit @31; + setSpeedLimitPriority @32; + setSpeedLimitChangeRequiresAccept @33; + acceptSpeedLimit @34; + setPressGasToAcceptSpeedLimit @35; + setAdjustSetSpeedToAcceptSpeedLimit @36; + setAcceptSpeedLimitTimeout @37; + setPressGasToOverrideSpeedLimit @38; +} + +struct MapdExtendedOut @0x8d12e6a08c60a1a1 { + downloadProgress @0 :MapdDownloadProgress; + settings @1 :Text; + path @2 :List(MapdPathPoint); +} + +struct MapdIn @0xb9ceb3ea89cecc23 { + type @0 :MapdInputType; + float @1 :Float32; + str @2 :Text; + bool @3 :Bool; +} + +struct MapdOut @0xd615f9fe1608a3c0 { + wayName @0 :Text; + wayRef @1 :Text; + roadName @2 :Text; + speedLimit @3 :Float32; + nextSpeedLimit @4 :Float32; + nextSpeedLimitDistance @5 :Float32; + hazard @6 :Text; + nextHazard @7 :Text; + nextHazardDistance @8 :Float32; + advisorySpeed @9 :Float32; + nextAdvisorySpeed @10 :Float32; + nextAdvisorySpeedDistance @11 :Float32; + oneWay @12 :Bool; + lanes @13 :UInt8; + tileLoaded @14 :Bool; + speedLimitSuggestedSpeed @15 :Float32; + suggestedSpeed @16 :Float32; + estimatedRoadWidth @17 :Float32; + roadContext @18 :MapdRoadContext; + distanceFromWayCenter @19 :Float32; + visionCurveSpeed @20 :Float32; + mapCurveSpeed @21 :Float32; + waySelectionType @22 :MapdWaySelectionType; + speedLimitAccepted @23 :Bool; +} diff --git a/iqpilot/cereal/include/c++.capnp b/iqpilot/cereal/include/c++.capnp new file mode 100644 index 000000000..2bda54717 --- /dev/null +++ b/iqpilot/cereal/include/c++.capnp @@ -0,0 +1,26 @@ +# Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors +# Licensed under the MIT License: +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +@0xbdf87d7bb8304e81; +$namespace("capnp::annotations"); + +annotation namespace(file): Text; +annotation name(field, enumerant, struct, enum, interface, method, param, group, union): Text; diff --git a/iqpilot/cereal/legacy.capnp b/iqpilot/cereal/legacy.capnp new file mode 100644 index 000000000..8ddf046ad --- /dev/null +++ b/iqpilot/cereal/legacy.capnp @@ -0,0 +1,573 @@ +using Cxx = import "/include/c++.capnp"; +$Cxx.namespace("cereal"); + +@0x80ef1ec4889c2a63; + +# legacy.capnp: a home for deprecated structs + +struct LogRotate @0x9811e1f38f62f2d1 { + segmentNum @0 :Int32; + path @1 :Text; +} + +struct LiveUI @0xc08240f996aefced { + rearViewCam @0 :Bool; + alertText1 @1 :Text; + alertText2 @2 :Text; + awarenessStatus @3 :Float32; +} + +struct UiLayoutState @0x88dcce08ad29dda0 { + activeApp @0 :App; + sidebarCollapsed @1 :Bool; + mapEnabled @2 :Bool; + mockEngaged @3 :Bool; + + enum App @0x9917470acf94d285 { + home @0; + music @1; + nav @2; + settings @3; + none @4; + } +} + +struct OrbslamCorrection @0x8afd33dc9b35e1aa { + correctionMonoTime @0 :UInt64; + prePositionECEF @1 :List(Float64); + postPositionECEF @2 :List(Float64); + prePoseQuatECEF @3 :List(Float32); + postPoseQuatECEF @4 :List(Float32); + numInliers @5 :UInt32; +} + +struct EthernetPacket @0xa99a9d5b33cf5859 { + pkt @0 :Data; + ts @1 :Float32; +} + +struct CellInfo @0xcff7566681c277ce { + timestamp @0 :UInt64; + repr @1 :Text; # android toString() for now +} + +struct WifiScan @0xd4df5a192382ba0b { + bssid @0 :Text; + ssid @1 :Text; + capabilities @2 :Text; + frequency @3 :Int32; + level @4 :Int32; + timestamp @5 :Int64; + + centerFreq0 @6 :Int32; + centerFreq1 @7 :Int32; + channelWidth @8 :ChannelWidth; + operatorFriendlyName @9 :Text; + venueName @10 :Text; + is80211mcResponder @11 :Bool; + passpoint @12 :Bool; + + distanceCm @13 :Int32; + distanceSdCm @14 :Int32; + + enum ChannelWidth @0xcb6a279f015f6b51 { + w20Mhz @0; + w40Mhz @1; + w80Mhz @2; + w160Mhz @3; + w80Plus80Mhz @4; + } +} + +struct LiveEventData @0x94b7baa90c5c321e { + name @0 :Text; + value @1 :Int32; +} + +struct ModelData @0xb8aad62cffef28a9 { + frameId @0 :UInt32; + frameAge @12 :UInt32; + frameDropPerc @13 :Float32; + timestampEof @9 :UInt64; + modelExecutionTime @14 :Float32; + gpuExecutionTime @16 :Float32; + rawPred @15 :Data; + + path @1 :PathData; + leftLane @2 :PathData; + rightLane @3 :PathData; + lead @4 :LeadData; + freePath @6 :List(Float32); + + settings @5 :ModelSettings; + leadFuture @7 :LeadData; + speed @8 :List(Float32); + meta @10 :MetaData; + longitudinal @11 :LongitudinalData; + + struct PathData @0x8817eeea389e9f08 { + points @0 :List(Float32); + prob @1 :Float32; + std @2 :Float32; + stds @3 :List(Float32); + poly @4 :List(Float32); + validLen @5 :Float32; + } + + struct LeadData @0xd1c9bef96d26fa91 { + dist @0 :Float32; + prob @1 :Float32; + std @2 :Float32; + relVel @3 :Float32; + relVelStd @4 :Float32; + relY @5 :Float32; + relYStd @6 :Float32; + relA @7 :Float32; + relAStd @8 :Float32; + } + + struct ModelSettings @0xa26e3710efd3e914 { + bigBoxX @0 :UInt16; + bigBoxY @1 :UInt16; + bigBoxWidth @2 :UInt16; + bigBoxHeight @3 :UInt16; + boxProjection @4 :List(Float32); + yuvCorrection @5 :List(Float32); + inputTransform @6 :List(Float32); + } + + struct MetaData @0x9744f25fb60f2bf8 { + engagedProb @0 :Float32; + desirePrediction @1 :List(Float32); + brakeDisengageProb @2 :Float32; + gasDisengageProb @3 :Float32; + steerOverrideProb @4 :Float32; + desireState @5 :List(Float32); + } + + struct LongitudinalData @0xf98f999c6a071122 { + distances @2 :List(Float32); + speeds @0 :List(Float32); + accelerations @1 :List(Float32); + } +} + +struct ECEFPoint @0xc25bbbd524983447 { + x @0 :Float64; + y @1 :Float64; + z @2 :Float64; +} + +struct ECEFPointDEPRECATED @0xe10e21168db0c7f7 { + x @0 :Float32; + y @1 :Float32; + z @2 :Float32; +} + +struct GPSPlannerPoints @0xab54c59699f8f9f3 { + curPosDEPRECATED @0 :ECEFPointDEPRECATED; + pointsDEPRECATED @1 :List(ECEFPointDEPRECATED); + curPos @6 :ECEFPoint; + points @7 :List(ECEFPoint); + valid @2 :Bool; + trackName @3 :Text; + speedLimit @4 :Float32; + accelTarget @5 :Float32; +} + +struct GPSPlannerPlan @0xf5ad1d90cdc1dd6b { + valid @0 :Bool; + poly @1 :List(Float32); + trackName @2 :Text; + speed @3 :Float32; + acceleration @4 :Float32; + pointsDEPRECATED @5 :List(ECEFPointDEPRECATED); + points @6 :List(ECEFPoint); + xLookahead @7 :Float32; +} + +struct UiNavigationEvent @0x90c8426c3eaddd3b { + type @0: Type; + status @1: Status; + distanceTo @2: Float32; + endRoadPointDEPRECATED @3: ECEFPointDEPRECATED; + endRoadPoint @4: ECEFPoint; + + enum Type @0xe8db07dcf8fcea05 { + none @0; + laneChangeLeft @1; + laneChangeRight @2; + mergeLeft @3; + mergeRight @4; + turnLeft @5; + turnRight @6; + } + + enum Status @0xb9aa88c75ef99a1f { + none @0; + passive @1; + approaching @2; + active @3; + } +} + +struct LiveLocationData @0xb99b2bc7a57e8128 { + status @0 :UInt8; + + # 3D fix + lat @1 :Float64; + lon @2 :Float64; + alt @3 :Float32; # m + + # speed + speed @4 :Float32; # m/s + + # NED velocity components + vNED @5 :List(Float32); + + # roll, pitch, heading (x,y,z) + roll @6 :Float32; # WRT to center of earth? + pitch @7 :Float32; # WRT to center of earth? + heading @8 :Float32; # WRT to north? + + # what are these? + wanderAngle @9 :Float32; + trackAngle @10 :Float32; + + # car frame -- https://upload.wikimedia.org/wikipedia/commons/f/f5/RPY_angles_of_cars.png + + # gyro, in car frame, deg/s + gyro @11 :List(Float32); + + # accel, in car frame, m/s^2 + accel @12 :List(Float32); + + accuracy @13 :Accuracy; + + source @14 :SensorSource; + # if we are fixing a location in the past + fixMonoTime @15 :UInt64; + + gpsWeek @16 :Int32; + timeOfWeek @17 :Float64; + + positionECEF @18 :List(Float64); + poseQuatECEF @19 :List(Float32); + pitchCalibration @20 :Float32; + yawCalibration @21 :Float32; + imuFrame @22 :List(Float32); + + struct Accuracy @0x943dc4625473b03f { + pNEDError @0 :List(Float32); + vNEDError @1 :List(Float32); + rollError @2 :Float32; + pitchError @3 :Float32; + headingError @4 :Float32; + ellipsoidSemiMajorError @5 :Float32; + ellipsoidSemiMinorError @6 :Float32; + ellipsoidOrientationError @7 :Float32; + } + + enum SensorSource @0xc871d3cc252af657 { + applanix @0; + kalman @1; + orbslam @2; + timing @3; + dummy @4; + } +} + +struct OrbOdometry @0xd7700859ed1f5b76 { + # timing first + startMonoTime @0 :UInt64; + endMonoTime @1 :UInt64; + + # fundamental matrix and error + f @2: List(Float64); + err @3: Float64; + + # number of inlier points + inliers @4: Int32; + + # for debug only + # indexed by endMonoTime features + # value is startMonoTime feature match + # -1 if no match + matches @5: List(Int16); +} + +struct OrbFeatures @0xcd60164a8a0159ef { + timestampEof @0 :UInt64; + # transposed arrays of normalized image coordinates + # len(xs) == len(ys) == len(descriptors) * 32 + xs @1 :List(Float32); + ys @2 :List(Float32); + descriptors @3 :Data; + octaves @4 :List(Int8); + + # match index to last OrbFeatures + # -1 if no match + timestampLastEof @5 :UInt64; + matches @6: List(Int16); +} + +struct OrbFeaturesSummary @0xd500d30c5803fa4f { + timestampEof @0 :UInt64; + timestampLastEof @1 :UInt64; + + featureCount @2 :UInt16; + matchCount @3 :UInt16; + computeNs @4 :UInt64; +} + +struct OrbKeyFrame @0xc8233c0345e27e24 { + # this is a globally unique id for the KeyFrame + id @0: UInt64; + + # this is the location of the KeyFrame + pos @1: ECEFPoint; + + # these are the features in the world + # len(dpos) == len(descriptors) * 32 + dpos @2 :List(ECEFPoint); + descriptors @3 :Data; +} + +struct KalmanOdometry @0x92e21bb7ea38793a { + trans @0 :List(Float32); # m/s in device frame + rot @1 :List(Float32); # rad/s in device frame + transStd @2 :List(Float32); # std m/s in device frame + rotStd @3 :List(Float32); # std rad/s in device frame +} + +struct OrbObservation @0x9b326d4e436afec7 { + observationMonoTime @0 :UInt64; + normalizedCoordinates @1 :List(Float32); + locationECEF @2 :List(Float64); + matchDistance @3: UInt32; +} + +struct CalibrationFeatures @0x8fdfadb254ea867a { + frameId @0 :UInt32; + + p0 @1 :List(Float32); + p1 @2 :List(Float32); + status @3 :List(Int8); +} + +struct NavStatus @0xbd8822120928120c { + isNavigating @0 :Bool; + currentAddress @1 :Address; + + struct Address @0xce7cd672cacc7814 { + title @0 :Text; + lat @1 :Float64; + lng @2 :Float64; + house @3 :Text; + address @4 :Text; + street @5 :Text; + city @6 :Text; + state @7 :Text; + country @8 :Text; + } +} + +struct NavUpdate @0xdb98be6565516acb { + isNavigating @0 :Bool; + curSegment @1 :Int32; + segments @2 :List(Segment); + + struct LatLng @0x9eaef9187cadbb9b { + lat @0 :Float64; + lng @1 :Float64; + } + + struct Segment @0xa5b39b4fc4d7da3f { + from @0 :LatLng; + to @1 :LatLng; + updateTime @2 :Int32; + distance @3 :Int32; + crossTime @4 :Int32; + exitNo @5 :Int32; + instruction @6 :Instruction; + + parts @7 :List(LatLng); + + enum Instruction @0xc5417a637451246f { + turnLeft @0; + turnRight @1; + keepLeft @2; + keepRight @3; + straight @4; + roundaboutExitNumber @5; + roundaboutExit @6; + roundaboutTurnLeft @7; + unkn8 @8; + roundaboutStraight @9; + unkn10 @10; + roundaboutTurnRight @11; + unkn12 @12; + roundaboutUturn @13; + unkn14 @14; + arrive @15; + exitLeft @16; + exitRight @17; + unkn18 @18; + uturn @19; + # ... + } + } +} + +struct TrafficEvent @0xacfa74a094e62626 { + type @0 :Type; + distance @1 :Float32; + action @2 :Action; + resuming @3 :Bool; + + enum Type @0xd85d75253435bf4b { + stopSign @0; + lightRed @1; + lightYellow @2; + lightGreen @3; + stopLight @4; + } + + enum Action @0xa6f6ce72165ccb49 { + none @0; + yield @1; + stop @2; + resumeReady @3; + } + +} + + +struct AndroidGnss @0xdfdf30d03fc485bd { + union { + measurements @0 :Measurements; + navigationMessage @1 :NavigationMessage; + } + + struct Measurements @0xa20710d4f428d6cd { + clock @0 :Clock; + measurements @1 :List(Measurement); + + struct Clock @0xa0e27b453a38f450 { + timeNanos @0 :Int64; + hardwareClockDiscontinuityCount @1 :Int32; + + hasTimeUncertaintyNanos @2 :Bool; + timeUncertaintyNanos @3 :Float64; + + hasLeapSecond @4 :Bool; + leapSecond @5 :Int32; + + hasFullBiasNanos @6 :Bool; + fullBiasNanos @7 :Int64; + + hasBiasNanos @8 :Bool; + biasNanos @9 :Float64; + + hasBiasUncertaintyNanos @10 :Bool; + biasUncertaintyNanos @11 :Float64; + + hasDriftNanosPerSecond @12 :Bool; + driftNanosPerSecond @13 :Float64; + + hasDriftUncertaintyNanosPerSecond @14 :Bool; + driftUncertaintyNanosPerSecond @15 :Float64; + } + + struct Measurement @0xd949bf717d77614d { + svId @0 :Int32; + constellation @1 :Constellation; + + timeOffsetNanos @2 :Float64; + state @3 :Int32; + receivedSvTimeNanos @4 :Int64; + receivedSvTimeUncertaintyNanos @5 :Int64; + cn0DbHz @6 :Float64; + pseudorangeRateMetersPerSecond @7 :Float64; + pseudorangeRateUncertaintyMetersPerSecond @8 :Float64; + accumulatedDeltaRangeState @9 :Int32; + accumulatedDeltaRangeMeters @10 :Float64; + accumulatedDeltaRangeUncertaintyMeters @11 :Float64; + + hasCarrierFrequencyHz @12 :Bool; + carrierFrequencyHz @13 :Float32; + hasCarrierCycles @14 :Bool; + carrierCycles @15 :Int64; + hasCarrierPhase @16 :Bool; + carrierPhase @17 :Float64; + hasCarrierPhaseUncertainty @18 :Bool; + carrierPhaseUncertainty @19 :Float64; + hasSnrInDb @20 :Bool; + snrInDb @21 :Float64; + + multipathIndicator @22 :MultipathIndicator; + + enum Constellation @0x9ef1f3ff0deb5ffb { + unknown @0; + gps @1; + sbas @2; + glonass @3; + qzss @4; + beidou @5; + galileo @6; + } + + enum State @0xcbb9490adce12d72 { + unknown @0; + codeLock @1; + bitSync @2; + subframeSync @3; + towDecoded @4; + msecAmbiguous @5; + symbolSync @6; + gloStringSync @7; + gloTodDecoded @8; + bdsD2BitSync @9; + bdsD2SubframeSync @10; + galE1bcCodeLock @11; + galE1c2ndCodeLock @12; + galE1bPageSync @13; + sbasSync @14; + } + + enum MultipathIndicator @0xc04e7b6231d4caa8 { + unknown @0; + detected @1; + notDetected @2; + } + } + } + + struct NavigationMessage @0xe2517b083095fd4e { + type @0 :Int32; + svId @1 :Int32; + messageId @2 :Int32; + submessageId @3 :Int32; + data @4 :Data; + status @5 :Status; + + enum Status @0xec1ff7996b35366f { + unknown @0; + parityPassed @1; + parityRebuilt @2; + } + } +} + +struct LidarPts @0xe3d6685d4e9d8f7a { + r @0 :List(UInt16); # uint16 m*500.0 + theta @1 :List(UInt16); # uint16 deg*100.0 + reflect @2 :List(UInt8); # uint8 0-255 + + # For storing out of file. + idx @3 :UInt64; + + # For storing in file + pkt @4 :Data; +} + diff --git a/iqpilot/cereal/log.capnp b/iqpilot/cereal/log.capnp new file mode 100644 index 000000000..fb080df1c --- /dev/null +++ b/iqpilot/cereal/log.capnp @@ -0,0 +1,2795 @@ +using Cxx = import "/include/c++.capnp"; +$Cxx.namespace("cereal"); + +using Car = import "/car.capnp"; +using Legacy = import "legacy.capnp"; +using Custom = import "custom.capnp"; + +@0xf3b1f17e25a4285b; + +# Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +const logVersion :Int32 = 1; + +struct Map(Key, Value) { + entries @0 :List(Entry); + struct Entry { + key @0 :Key; + value @1 :Value; + } +} + +struct OnroadEvent @0xc4fa6047f024e718 { + name @0 :EventName; + + # event types + enable @1 :Bool; + noEntry @2 :Bool; + warning @3 :Bool; # alerts presented only when enabled or soft disabling + userDisable @4 :Bool; + softDisable @5 :Bool; + immediateDisable @6 :Bool; + preEnable @7 :Bool; + permanent @8 :Bool; # alerts presented regardless of openpilot state + overrideLateral @10 :Bool; + overrideLongitudinal @9 :Bool; + + enum EventName @0x91f1992a1f77fb03 { + canError @0; + steerUnavailable @1; + wrongGear @2; + doorOpen @3; + seatbeltNotLatched @4; + espDisabled @5; + wrongCarMode @6; + steerTempUnavailable @7; + reverseGear @8; + buttonCancel @9; + buttonEnable @10; + pedalPressed @11; # exits active state + preEnableStandstill @12; # added during pre-enable state with brake + gasPressedOverride @13; # added when user is pressing gas with no disengage on gas + steerOverride @14; + steerDisengage @94; # exits active state + cruiseDisabled @15; + speedTooLow @16; + outOfSpace @17; + overheat @18; + calibrationIncomplete @19; + calibrationInvalid @20; + calibrationRecalibrating @21; + controlsMismatch @22; + pcmEnable @23; + pcmDisable @24; + radarFault @25; + radarTempUnavailable @93; + brakeHold @26; + parkBrake @27; + manualRestart @28; + joystickDebug @29; + longitudinalManeuver @30; + steerTempUnavailableSilent @31; + resumeRequired @32; + preDriverDistracted @33; + promptDriverDistracted @34; + driverDistracted @35; + preDriverUnresponsive @36; + promptDriverUnresponsive @37; + driverUnresponsive @38; + belowSteerSpeed @39; + lowBattery @40; + accFaulted @41; + sensorDataInvalid @42; + commIssue @43; + commIssueAvgFreq @44; + tooDistracted @45; + posenetInvalid @46; + preLaneChangeLeft @48; + preLaneChangeRight @49; + laneChange @50; + lowMemory @51; + stockAeb @52; + stockLkas @98; + lateralManeuver @99; + cruiseFaultLateralAllowed @100; + ldw @53; + carUnrecognized @54; + invalidLkasSetting @55; + speedTooHigh @56; + laneChangeBlocked @57; + relayMalfunction @58; + stockFcw @59; + startup @60; + startupNoCar @61; + startupNoControl @62; + startupNoSecOcKey @63; + startupMaster @64; + fcw @65; + steerSaturated @66; + belowEngageSpeed @67; + noGps @68; + wrongCruiseMode @69; + modeldLagging @70; + deviceFalling @71; + fanMalfunction @72; + cameraMalfunction @73; + cameraFrameRate @74; + processNotRunning @75; + dashcamMode @76; + selfdriveInitializing @77; + usbError @78; + cruiseMismatch @79; + canBusMissing @80; + selfdrivedLagging @81; + resumeBlocked @82; + steerTimeLimit @83; + vehicleSensorsInvalid @84; + locationdTemporaryError @85; + locationdPermanentError @86; + paramsdTemporaryError @87; + paramsdPermanentError @88; + actuatorsApiUnavailable @89; + espActive @90; + personalityChanged @91; + aeb @92; + userBookmark @95; + excessiveActuation @96; + audioFeedback @97; + bigModelLoading @101; + bigModelFailed @102; + + soundsUnavailableDEPRECATED @47; + } +} + +enum LongitudinalPersonality { + aggressive @0; + standard @1; + relaxed @2; +} + +struct InitData { + kernelArgs @0 :List(Text); + kernelVersion @15 :Text; + osVersion @18 :Text; + + dongleId @2 :Text; + bootlogId @22 :Text; + + deviceType @3 :DeviceType; + version @4 :Text; + gitCommit @10 :Text; + gitCommitDate @21 :Text; + gitBranch @11 :Text; + gitRemote @13 :Text; + + # this is source commit for prebuilt branches + gitSrcCommit @23 :Text; + gitSrcCommitDate @24 :Text; + + androidProperties @16 :Map(Text, Text); + + pandaInfo @8 :PandaInfo; + + dirty @9 :Bool; + passive @12 :Bool; + params @17 :Map(Text, Data); + + commands @19 :Map(Text, Data); + + wallTimeNanos @20 :UInt64; + + ufsHealth @25 :UfsHealth; + + struct UfsHealth { + preEolInfo @0 :UInt8; + lifeTimeEstimateA @1 :UInt8; + lifeTimeEstimateB @2 :UInt8; + vendorHealthReport @3 :Data; + } + + enum DeviceType { + unknown @0; + neo @1; + chffrAndroid @2; + chffrIos @3; + tici @4; + pc @5; + tizi @6; + mici @7; + } + + struct PandaInfo { + hasPanda @0 :Bool; + dongleId @1 :Text; + stVersion @2 :Text; + espVersion @3 :Text; + } + + # ***** deprecated stuff ***** + gctxDEPRECATED @1 :Text; + androidBuildInfo @5 :AndroidBuildInfo; + androidSensorsDEPRECATED @6 :List(AndroidSensor); + chffrAndroidExtraDEPRECATED @7 :ChffrAndroidExtra; + iosBuildInfoDEPRECATED @14 :IosBuildInfo; + + struct AndroidBuildInfo { + board @0 :Text; + bootloader @1 :Text; + brand @2 :Text; + device @3 :Text; + display @4 :Text; + fingerprint @5 :Text; + hardware @6 :Text; + host @7 :Text; + id @8 :Text; + manufacturer @9 :Text; + model @10 :Text; + product @11 :Text; + radioVersion @12 :Text; + serial @13 :Text; + supportedAbis @14 :List(Text); + tags @15 :Text; + time @16 :Int64; + type @17 :Text; + user @18 :Text; + + versionCodename @19 :Text; + versionRelease @20 :Text; + versionSdk @21 :Int32; + versionSecurityPatch @22 :Text; + } + + struct AndroidSensor { + id @0 :Int32; + name @1 :Text; + vendor @2 :Text; + version @3 :Int32; + handle @4 :Int32; + type @5 :Int32; + maxRange @6 :Float32; + resolution @7 :Float32; + power @8 :Float32; + minDelay @9 :Int32; + fifoReservedEventCount @10 :UInt32; + fifoMaxEventCount @11 :UInt32; + stringType @12 :Text; + maxDelay @13 :Int32; + } + + struct ChffrAndroidExtra { + allCameraCharacteristics @0 :Map(Text, Text); + } + + struct IosBuildInfo { + appVersion @0 :Text; + appBuild @1 :UInt32; + osVersion @2 :Text; + deviceModel @3 :Text; + } +} + +struct FrameData { + frameId @0 :UInt32; + frameIdSensor @25 :UInt32; + requestId @28 :UInt32; + encodeId @1 :UInt32; + + # Timestamps + timestampEof @2 :UInt64; + timestampSof @8 :UInt64; + processingTime @23 :Float32; + + # Exposure + integLines @4 :Int32; + highConversionGain @20 :Bool; + gain @15 :Float32; # This includes highConversionGain if enabled + measuredGreyFraction @21 :Float32; + targetGreyFraction @22 :Float32; + exposureValPercent @27 :Float32; + + transform @10 :List(Float32); + + image @6 :Data; + + temperaturesC @24 :List(Float32); + + enum FrameTypeDEPRECATED { + unknown @0; + neo @1; + chffrAndroid @2; + front @3; + } + + sensor @26 :ImageSensor; + enum ImageSensor { + unknown @0; + ar0231 @1; + ox03c10 @2; + os04c10 @3; + } + + frameLengthDEPRECATED @3 :Int32; + globalGainDEPRECATED @5 :Int32; + frameTypeDEPRECATED @7 :FrameTypeDEPRECATED; + androidCaptureResultDEPRECATED @9 :AndroidCaptureResult; + lensPosDEPRECATED @11 :Int32; + lensSagDEPRECATED @12 :Float32; + lensErrDEPRECATED @13 :Float32; + lensTruePosDEPRECATED @14 :Float32; + focusValDEPRECATED @16 :List(Int16); + focusConfDEPRECATED @17 :List(UInt8); + sharpnessScoreDEPRECATED @18 :List(UInt16); + recoverStateDEPRECATED @19 :Int32; + struct AndroidCaptureResult { + sensitivity @0 :Int32; + frameDuration @1 :Int64; + exposureTime @2 :Int64; + rollingShutterSkew @3 :UInt64; + colorCorrectionTransform @4 :List(Int32); + colorCorrectionGains @5 :List(Float32); + displayRotation @6 :Int8; + } +} + +struct Thumbnail { + frameId @0 :UInt32; + timestampEof @1 :UInt64; + thumbnail @2 :Data; + encoding @3 :Encoding; + + enum Encoding { + unknown @0; + jpeg @1; + keyframe @2; + } +} + +struct GPSNMEAData { + timestamp @0 :Int64; + localWallTime @1 :UInt64; + nmea @2 :Text; +} + +# android sensor_event_t +struct SensorEventData { + version @0 :Int32; + sensor @1 :Int32; + type @2 :Int32; + timestamp @3 :Int64; + uncalibratedDEPRECATED @10 :Bool; + + union { + acceleration @4 :SensorVec; + magnetic @5 :SensorVec; + orientation @6 :SensorVec; + gyro @7 :SensorVec; + pressure @9 :SensorVec; + magneticUncalibrated @11 :SensorVec; + gyroUncalibrated @12 :SensorVec; + proximity @13: Float32; + light @14: Float32; + temperature @15: Float32; + } + source @8 :SensorSource; + + struct SensorVec { + v @0 :List(Float32); + status @1 :Int8; + } + + enum SensorSource { + android @0; + iOS @1; + fiber @2; + velodyne @3; # Velodyne IMU + bno055 @4; # Bosch accelerometer + lsm6ds3 @5; # includes LSM6DS3 and LSM6DS3TR, TR = tape reel + bmp280 @6; # barometer + mmc3416x @7; # magnetometer + bmx055 @8; + rpr0521 @9; + lsm6ds3trc @10; + mmc5603nj @11; + } +} + +# android struct GpsLocation +struct GpsLocationData { + # Contains module-specific flags. + flags @0 :UInt16; + + # Represents latitude in degrees. + latitude @1 :Float64; + + # Represents longitude in degrees. + longitude @2 :Float64; + + # Represents altitude in meters above the WGS 84 reference ellipsoid. + altitude @3 :Float64; + + # Represents speed in meters per second. + speed @4 :Float32; + + # Represents heading in degrees. + bearingDeg @5 :Float32; + + # Represents expected horizontal accuracy in meters. + horizontalAccuracy @6 :Float32; + + unixTimestampMillis @7 :Int64; + + source @8 :SensorSource; + + # Represents NED velocity in m/s. + vNED @9 :List(Float32); + + # Represents expected vertical accuracy in meters. (presumably 1 sigma?) + verticalAccuracy @10 :Float32; + + # Represents bearing accuracy in degrees. (presumably 1 sigma?) + bearingAccuracyDeg @11 :Float32; + + # Represents velocity accuracy in m/s. (presumably 1 sigma?) + speedAccuracy @12 :Float32; + + hasFix @13 :Bool; + satelliteCount @14 :Int8; + + enum SensorSource { + android @0; + iOS @1; + car @2; + velodyne @3; # Velodyne IMU + fusion @4; + external @5; + ublox @6; + trimble @7; + qcomdiag @8; + unicore @9; + } +} + +enum Desire { + none @0; + turnLeft @1; + turnRight @2; + laneChangeLeft @3; + laneChangeRight @4; + keepLeft @5; + keepRight @6; +} + +enum LaneChangeState { + off @0; + preLaneChange @1; + laneChangeStarting @2; + laneChangeFinishing @3; +} + +enum LaneChangeDirection { + none @0; + left @1; + right @2; +} + +struct CanData { + address @0 :UInt32; + dat @2 :Data; + src @3 :UInt8; + busTimeDEPRECATED @1 :UInt16; +} + +struct DeviceState @0xa4d8b5af2aa492eb { + deviceType @45 :InitData.DeviceType; + + networkType @22 :NetworkType; + networkInfo @31 :NetworkInfo; + networkStrength @24 :NetworkStrength; + networkStats @43 :NetworkStats; + networkMetered @41 :Bool; + lastAthenaPingTime @32 :UInt64; + + started @11 :Bool; + startedMonoTime @13 :UInt64; + + # ordinals track commaai/openpilot exactly (@50 bottomSocTempC, @51 dock + # presence, @52 usbState) so upstream tooling stays able to read our logs; + # only the field NAME differs, we do not use comma's internal dock codename. + bottomSocTempC @50 :Float32; + egpuDockPresent @51 :Bool; + usbState @52 :UsbState; + + # system utilization + freeSpacePercent @7 :Float32; + memoryUsagePercent @19 :Int8; + gpuUsagePercent @33 :Int8; + cpuUsagePercent @34 :List(Int8); # per-core cpu usage + + # power + offroadPowerUsageUwh @23 :UInt32; + carBatteryCapacityUwh @25 :UInt32; + powerDrawW @40 :Float32; + somPowerDrawW @42 :Float32; + + # device thermals + cpuTempC @26 :List(Float32); + gpuTempC @27 :List(Float32); + dspTempC @49 :Float32; + memoryTempC @28 :Float32; + modemTempC @36 :List(Float32); + pmicTempC @39 :List(Float32); + intakeTempC @46 :Float32; + exhaustTempC @47 :Float32; + caseTempC @48 :Float32; + maxTempC @44 :Float32; # max of other temps, used to control fan + thermalZones @38 :List(ThermalZone); + thermalStatus @14 :ThermalStatus; + + fanSpeedPercentDesired @10 :UInt16; + screenBrightnessPercent @37 :Int8; + + struct ThermalZone { + name @0 :Text; + temp @1 :Float32; + } + + enum ThermalStatus { + green @0; + yellow @1; + red @2; + danger @3; + } + + enum NetworkType { + none @0; + wifi @1; + cell2G @2; + cell3G @3; + cell4G @4; + cell5G @5; + ethernet @6; + } + + enum NetworkStrength { + unknown @0; + poor @1; + moderate @2; + good @3; + great @4; + } + + struct NetworkInfo { + technology @0 :Text; + operator @1 :Text; + band @2 :Text; + channel @3 :UInt16; + extra @4 :Text; + state @5 :Text; + } + + struct NetworkStats { + wwanTx @0 :Int64; + wwanRx @1 :Int64; + } + + # deprecated + cpu0DEPRECATED @0 :UInt16; + cpu1DEPRECATED @1 :UInt16; + cpu2DEPRECATED @2 :UInt16; + cpu3DEPRECATED @3 :UInt16; + memDEPRECATED @4 :UInt16; + gpuDEPRECATED @5 :UInt16; + batDEPRECATED @6 :UInt32; + pa0DEPRECATED @21 :UInt16; + cpuUsagePercentDEPRECATED @20 :Int8; + batteryStatusDEPRECATED @9 :Text; + batteryVoltageDEPRECATED @16 :Int32; + batteryTempCDEPRECATED @29 :Float32; + batteryPercentDEPRECATED @8 :Int16; + batteryCurrentDEPRECATED @15 :Int32; + chargingErrorDEPRECATED @17 :Bool; + chargingDisabledDEPRECATED @18 :Bool; + usbOnlineDEPRECATED @12 :Bool; + ambientTempCDEPRECATED @30 :Float32; + nvmeTempCDEPRECATED @35 :List(Float32); +} + +struct UsbState { + devices @0 :List(Device); + # IQ extension (no upstream equivalent): controller-level link errors, needed + # because portli is a CONTROLLER counter and in peripheral mode (eMac gadget + # link) the peer never enumerates, so no Device row can carry it. + linkErrorCount @1 :UInt32; + # IQ extension, same reason: CC orientation describes the PORT, so it is + # readable while the link is in peripheral mode. The per-device field below + # matches upstream but only populates when something enumerates on that + # controller (host mode, e.g. the eGPU dock) — never during an eMac session. + usb3Lane @2 :Device.Usb3Lane; + + struct Device { + busnum @0 :UInt8; + devnum @1 :UInt8; + vendorId @2 :UInt16; + productId @3 :UInt16; + speedMbps @4 :UInt16; + manufacturer @6 :Text; + product @5 :Text; + linkErrorCount @7 :UInt16; + usb3Lane @8 :Usb3Lane; + + enum Usb3Lane { + unknown @0; + a @1; + b @2; + } + } +} + +struct PandaState @0xa7649e2575e4591e { + ignitionLine @2 :Bool; + rxBufferOverflow @7 :UInt32; + txBufferOverflow @8 :UInt32; + pandaType @10 :PandaType; + ignitionCan @13 :Bool; + faultStatus @15 :FaultStatus; + powerSaveEnabled @16 :Bool; + uptime @17 :UInt32; + faults @18 :List(FaultType); + heartbeatLost @22 :Bool; + interruptLoad @25 :Float32; + fanPower @28 :UInt8; + + spiErrorCount @33 :UInt16; + + harnessStatus @21 :HarnessStatus; + sbu1Voltage @35 :Float32; + sbu2Voltage @36 :Float32; + + # can health + canState0 @29 :PandaCanState; + canState1 @30 :PandaCanState; + canState2 @31 :PandaCanState; + + # safety stuff + controlsAllowed @3 :Bool; + safetyRxInvalid @19 :UInt32; + safetyTxBlocked @24 :UInt32; + safetyModel @14 :Car.CarParams.SafetyModel; + safetyParam @27 :UInt16; + alternativeExperience @23 :Int16; + safetyRxChecksInvalid @32 :Bool; + + voltage @0 :UInt32; + current @1 :UInt32; + + enum FaultStatus { + none @0; + faultTemp @1; + faultPerm @2; + } + + enum FaultType { + relayMalfunction @0; + unusedInterruptHandled @1; + interruptRateCan1 @2; + interruptRateCan2 @3; + interruptRateCan3 @4; + interruptRateTach @5; + interruptRateGmlanDEPRECATED @6; + interruptRateInterrupts @7; + interruptRateSpiDma @8; + interruptRateSpiCs @9; + interruptRateUart1 @10; + interruptRateUart2 @11; + interruptRateUart3 @12; + interruptRateUart5 @13; + interruptRateUartDma @14; + interruptRateUsb @15; + interruptRateTim1 @16; + interruptRateTim3 @17; + registerDivergent @18; + interruptRateKlineInit @19; + interruptRateClockSource @20; + interruptRateTick @21; + interruptRateExti @22; + interruptRateSpi @23; + interruptRateUart7 @24; + sirenMalfunction @25; + heartbeatLoopWatchdog @26; + # Update max fault type in boardd when adding faults + } + + enum PandaType @0x8a58adf93e5b3751 { + unknown @0; + whitePanda @1; + greyPanda @2; + blackPanda @3; + pedal @4; + uno @5; + dos @6; + redPanda @7; + redPandaV2 @8; + tres @9; + cuatro @10; + } + + enum HarnessStatus { + notConnected @0; + normal @1; + flipped @2; + } + + struct PandaCanState { + busOff @0 :Bool; + busOffCnt @1 :UInt32; + errorWarning @2 :Bool; + errorPassive @3 :Bool; + lastError @4 :LecErrorCode; + lastStoredError @5 :LecErrorCode; + lastDataError @6 :LecErrorCode; + lastDataStoredError @7 :LecErrorCode; + receiveErrorCnt @8 :UInt8; + transmitErrorCnt @9 :UInt8; + totalErrorCnt @10 :UInt32; + totalTxLostCnt @11 :UInt32; + totalRxLostCnt @12 :UInt32; + totalTxCnt @13 :UInt32; + totalRxCnt @14 :UInt32; + totalFwdCnt @15 :UInt32; + canSpeed @16 :UInt16; + canDataSpeed @17 :UInt16; + canfdEnabled @18 :Bool; + brsEnabled @19 :Bool; + canfdNonIso @20 :Bool; + irq0CallRate @21 :UInt32; + irq1CallRate @22 :UInt32; + irq2CallRate @23 :UInt32; + canCoreResetCnt @24 :UInt32; + + enum LecErrorCode { + noError @0; + stuffError @1; + formError @2; + ackError @3; + bit1Error @4; + bit0Error @5; + crcError @6; + noChange @7; + } + } + + gasInterceptorDetectedDEPRECATED @4 :Bool; + startedSignalDetectedDEPRECATED @5 :Bool; + hasGpsDEPRECATED @6 :Bool; + gmlanSendErrsDEPRECATED @9 :UInt32; + fanSpeedRpmDEPRECATED @11 :UInt16; + usbPowerModeDEPRECATED @12 :PeripheralState.UsbPowerModeDEPRECATED; + safetyParamDEPRECATED @20 :Int16; + safetyParam2DEPRECATED @26 :UInt32; + fanStallCountDEPRECATED @34 :UInt8; +} + +struct PeripheralState { + pandaType @0 :PandaState.PandaType; + voltage @1 :UInt32; + current @2 :UInt32; + fanSpeedRpm @3 :UInt16; + + usbPowerModeDEPRECATED @4 :UsbPowerModeDEPRECATED; + enum UsbPowerModeDEPRECATED @0xa8883583b32c9877 { + none @0; + client @1; + cdp @2; + dcp @3; + } +} + +struct EgpuDockState { + tempC @0 :Float32; + memoryTempC @1 :Float32; + powerDrawW @2 :Float32; + powerLimitW @3 :Float32; + gpuUsagePercent @4 :UInt8; + gpuClockMhz @5 :UInt16; + fanSpeedRpm @6 :UInt16; + pcieLtssm @7 :UInt8; + supplyVoltage @8 :UInt16; # mV + supplyCurrent @9 :Int16; # mA + supplyFault @10 :Bool; +} + +struct RadarState @0x9a185389d6fdd05f { + mdMonoTime @6 :UInt64; + carStateMonoTime @11 :UInt64; + radarErrors @13 :Car.RadarData.Error; + + leadOne @3 :LeadData; + leadTwo @4 :LeadData; + + struct LeadData { + dRel @0 :Float32; + yRel @1 :Float32; + vRel @2 :Float32; + aRel @3 :Float32; + vLead @4 :Float32; + dPath @6 :Float32; + vLat @7 :Float32; + vLeadK @8 :Float32; + aLeadK @9 :Float32; + fcw @10 :Bool; + status @11 :Bool; + aLeadTau @12 :Float32; + modelProb @13 :Float32; + radar @14 :Bool; + radarTrackId @15 :Int32 = -1; + + aLeadDEPRECATED @5 :Float32; + } + + # deprecated + ftMonoTimeDEPRECATED @7 :UInt64; + warpMatrixDEPRECATED @0 :List(Float32); + angleOffsetDEPRECATED @1 :Float32; + calStatusDEPRECATED @2 :Int8; + calCycleDEPRECATED @8 :Int32; + calPercDEPRECATED @9 :Int8; + canMonoTimesDEPRECATED @10 :List(UInt64); + cumLagMsDEPRECATED @5 :Float32; + radarErrorsDEPRECATED @12 :List(Car.RadarData.ErrorDEPRECATED); +} + +struct ExtrinsicsCalibration @0x96df70754d8390bc { + calStatus @11 :Status; + calCycle @2 :Int32; + calPerc @3 :Int8; + validBlocks @9 :Int32; + + # view_frame_from_road_frame + # ui's is inversed needs new + extrinsicMatrix @4 :List(Float32); + # the direction of travel vector in device frame + rpyCalib @7 :List(Float32); + rpyCalibSpread @8 :List(Float32); + wideFromDeviceEuler @10 :List(Float32); + height @12 :List(Float32); + + warpMatrixDEPRECATED @0 :List(Float32); + calStatusDEPRECATED @1 :Int8; + warpMatrix2DEPRECATED @5 :List(Float32); + warpMatrixBigDEPRECATED @6 :List(Float32); + + enum Status { + uncalibrated @0; + calibrated @1; + invalid @2; + recalibrating @3; + } +} + +struct LiveTracksDEPRECATED { + trackId @0 :Int32; + dRel @1 :Float32; + yRel @2 :Float32; + vRel @3 :Float32; + aRel @4 :Float32; + timeStamp @5 :Float32; + status @6 :Float32; + currentTime @7 :Float32; + stationary @8 :Bool; + oncoming @9 :Bool; +} + +struct SelfdriveState { + # high level system state + state @0 :OpenpilotState; + enabled @1 :Bool; + active @2 :Bool; + engageable @9 :Bool; # can OP be engaged? + + # UI alerts + alertText1 @3 :Text; + alertText2 @4 :Text; + alertStatus @5 :AlertStatus; + alertSize @6 :AlertSize; + alertType @7 :Text; + alertSound @8 :Car.CarControl.HUDControl.AudibleAlert; + alertHudVisual @12 :Car.CarControl.HUDControl.VisualAlert; + + # configurable driving settings + experimentalMode @10 :Bool; + personality @11 :LongitudinalPersonality; + + enum OpenpilotState @0xdbe58b96d2d1ac61 { + disabled @0; + preEnabled @1; + enabled @2; + softDisabling @3; + overriding @4; # superset of overriding with steering or accelerator + } + + enum AlertStatus @0xa0d0dcd113193c62 { + normal @0; + userPrompt @1; + critical @2; + } + + enum AlertSize @0xe98bb99d6e985f64 { + none @0; + small @1; + mid @2; + full @3; + } +} + +struct ControlsState @0x97ff69c53601abf1 { + longitudinalPlanMonoTime @28 :UInt64; + lateralPlanMonoTime @50 :UInt64; + + longControlState @30 :Car.CarControl.Actuators.LongControlState; + upAccelCmd @4 :Float32; + uiAccelCmd @5 :Float32; + ufAccelCmd @33 :Float32; + curvature @37 :Float32; # path curvature from vehicle model + desiredCurvature @61 :Float32; # lag adjusted curvatures used by lateral controllers + forceDecel @51 :Bool; + + lateralControlState :union { + pidState @53 :LateralPIDState; + angleState @58 :LateralAngleState; + debugState @59 :LateralDebugState; + torqueState @60 :LateralTorqueState; + + curvatureStateDEPRECATED @65 :LateralCurvatureState; + lqrStateDEPRECATED @55 :LateralLQRState; + indiStateDEPRECATED @52 :LateralINDIState; + } + + struct LateralINDIState { + active @0 :Bool; + steeringAngleDeg @1 :Float32; + steeringRateDeg @2 :Float32; + steeringAccelDeg @3 :Float32; + rateSetPoint @4 :Float32; + accelSetPoint @5 :Float32; + accelError @6 :Float32; + delayedOutput @7 :Float32; + delta @8 :Float32; + output @9 :Float32; + saturated @10 :Bool; + steeringAngleDesiredDeg @11 :Float32; + steeringRateDesiredDeg @12 :Float32; + } + + struct LateralPIDState { + active @0 :Bool; + steeringAngleDeg @1 :Float32; + steeringRateDeg @2 :Float32; + angleError @3 :Float32; + p @4 :Float32; + i @5 :Float32; + f @6 :Float32; + output @7 :Float32; + saturated @8 :Bool; + steeringAngleDesiredDeg @9 :Float32; + } + + struct LateralTorqueState { + active @0 :Bool; + error @1 :Float32; + errorRate @8 :Float32; + p @2 :Float32; + i @3 :Float32; + d @4 :Float32; + f @5 :Float32; + output @6 :Float32; + saturated @7 :Bool; + actualLateralAccel @9 :Float32; + desiredLateralAccel @10 :Float32; + desiredLateralJerk @11 :Float32; + version @12 :Int32; + } + + struct LateralLQRState { + active @0 :Bool; + steeringAngleDeg @1 :Float32; + i @2 :Float32; + output @3 :Float32; + lqrOutput @4 :Float32; + saturated @5 :Bool; + steeringAngleDesiredDeg @6 :Float32; + } + + struct LateralAngleState { + active @0 :Bool; + steeringAngleDeg @1 :Float32; + output @2 :Float32; + saturated @3 :Bool; + steeringAngleDesiredDeg @4 :Float32; + } + + struct LateralCurvatureState { + active @0 :Bool; + actualCurvature @1 :Float32; + desiredCurvature @2 :Float32; + error @3 :Float32; + p @4 :Float32; + i @5 :Float32; + f @6 :Float32; + output @7 :Float32; + saturated @8 :Bool; + } + + struct LateralDebugState { + active @0 :Bool; + steeringAngleDeg @1 :Float32; + output @2 :Float32; + saturated @3 :Bool; + } + + # deprecated + vEgoDEPRECATED @0 :Float32; + vEgoRawDEPRECATED @32 :Float32; + aEgoDEPRECATED @1 :Float32; + canMonoTimeDEPRECATED @16 :UInt64; + radarStateMonoTimeDEPRECATED @17 :UInt64; + mdMonoTimeDEPRECATED @18 :UInt64; + yActualDEPRECATED @6 :Float32; + yDesDEPRECATED @7 :Float32; + upSteerDEPRECATED @8 :Float32; + uiSteerDEPRECATED @9 :Float32; + ufSteerDEPRECATED @34 :Float32; + aTargetMinDEPRECATED @10 :Float32; + aTargetMaxDEPRECATED @11 :Float32; + rearViewCamDEPRECATED @23 :Bool; + driverMonitoringOnDEPRECATED @43 :Bool; + hudLeadDEPRECATED @14 :Int32; + alertSoundDEPRECATED @45 :Text; + angleModelBiasDEPRECATED @27 :Float32; + gpsPlannerActiveDEPRECATED @40 :Bool; + decelForTurnDEPRECATED @47 :Bool; + decelForModelDEPRECATED @54 :Bool; + awarenessStatusDEPRECATED @26 :Float32; + angleSteersDEPRECATED @13 :Float32; + vCurvatureDEPRECATED @46 :Float32; + mapValidDEPRECATED @49 :Bool; + jerkFactorDEPRECATED @12 :Float32; + steerOverrideDEPRECATED @20 :Bool; + steeringAngleDesiredDegDEPRECATED @29 :Float32; + canMonoTimesDEPRECATED @21 :List(UInt64); + desiredCurvatureRateDEPRECATED @62 :Float32; + canErrorCounterDEPRECATED @57 :UInt32; + vPidDEPRECATED @2 :Float32; + alertBlinkingRateDEPRECATED @42 :Float32; + alertText1DEPRECATED @24 :Text; + alertText2DEPRECATED @25 :Text; + alertStatusDEPRECATED @38 :SelfdriveState.AlertStatus; + alertSizeDEPRECATED @39 :SelfdriveState.AlertSize; + alertTypeDEPRECATED @44 :Text; + alertSound2DEPRECATED @56 :Car.CarControl.HUDControl.AudibleAlert; + engageableDEPRECATED @41 :Bool; # can OP be engaged? + stateDEPRECATED @31 :SelfdriveState.OpenpilotState; + enabledDEPRECATED @19 :Bool; + activeDEPRECATED @36 :Bool; + experimentalModeDEPRECATED @64 :Bool; + personalityDEPRECATED @66 :LongitudinalPersonality; + vCruiseDEPRECATED @22 :Float32; # actual set speed + vCruiseClusterDEPRECATED @63 :Float32; # set speed to display in the UI + startMonoTimeDEPRECATED @48 :UInt64; + cumLagMsDEPRECATED @15 :Float32; + aTargetDEPRECATED @35 :Float32; + vTargetLeadDEPRECATED @3 :Float32; +} + +struct DrivingModelData { + frameId @0 :UInt32; + frameIdExtra @1 :UInt32; + frameDropPerc @6 :Float32; + modelExecutionTime @7 :Float32; + + action @2 :ModelDataV2.Action; + + laneLineMeta @3 :LaneLineMeta; + meta @4 :MetaData; + + path @5 :PolyPath; + + struct PolyPath { + xCoefficients @0 :List(Float32); + yCoefficients @1 :List(Float32); + zCoefficients @2 :List(Float32); + } + + struct LaneLineMeta { + leftY @0 :Float32; + rightY @1 :Float32; + leftProb @2 :Float32; + rightProb @3 :Float32; + } + + struct MetaData { + laneChangeState @0 :LaneChangeState; + laneChangeDirection @1 :LaneChangeDirection; + } +} + +# All SI units and in device frame +struct XYZTData @0xc3cbae1fd505ae80 { + x @0 :List(Float32); + y @1 :List(Float32); + z @2 :List(Float32); + t @3 :List(Float32); + xStd @4 :List(Float32); + yStd @5 :List(Float32); + zStd @6 :List(Float32); +} + +struct ModelDataV2 { + frameId @0 :UInt32; + frameIdExtra @20 :UInt32; + frameAge @1 :UInt32; + frameDropPerc @2 :Float32; + timestampEof @3 :UInt64; + modelExecutionTime @15 :Float32; + rawPredictions @16 :Data; + big @27 :Bool; + + # predicted future position, orientation, etc.. + position @4 :XYZTData; + orientation @5 :XYZTData; + velocity @6 :XYZTData; + orientationRate @7 :XYZTData; + acceleration @19 :XYZTData; + + # prediction lanelines and road edges + laneLines @8 :List(XYZTData); + laneLineProbs @9 :List(Float32); + laneLineStds @13 :List(Float32); + roadEdges @10 :List(XYZTData); + roadEdgeStds @14 :List(Float32); + + # predicted lead cars + leads @11 :List(LeadDataV2); + leadsV3 @18 :List(LeadDataV3); + + meta @12 :MetaData; + confidence @23: ConfidenceClass; + + # Model perceived motion + temporalPoseDEPRECATED @21 :Pose; + + # e2e lateral planner + action @26: Action; + + gpuExecutionTimeDEPRECATED @17 :Float32; + navEnabledDEPRECATED @22 :Bool; + locationMonoTimeDEPRECATED @24 :UInt64; + lateralPlannerSolutionDEPRECATED @25: LateralPlannerSolution; + + struct LeadDataV2 { + prob @0 :Float32; # probability that car is your lead at time t + t @1 :Float32; + + # x and y are relative position in device frame + # v is norm relative speed + # a is norm relative acceleration + xyva @2 :List(Float32); + xyvaStd @3 :List(Float32); + } + + struct LeadDataV3 { + prob @0 :Float32; # probability that car is your lead at time t + probTime @1 :Float32; + t @2 :List(Float32); + + # x and y are relative position in device frame + # v absolute norm speed + # a is derivative of v + x @3 :List(Float32); + xStd @4 :List(Float32); + y @5 :List(Float32); + yStd @6 :List(Float32); + v @7 :List(Float32); + vStd @8 :List(Float32); + a @9 :List(Float32); + aStd @10 :List(Float32); + } + + + struct MetaData { + engagedProb @0 :Float32; + desirePrediction @1 :List(Float32); + desireState @5 :List(Float32); + disengagePredictions @6 :DisengagePredictions; + hardBrakePredicted @7 :Bool; + laneChangeState @8 :LaneChangeState; + laneChangeDirection @9 :LaneChangeDirection; + + + # deprecated + brakeDisengageProbDEPRECATED @2 :Float32; + gasDisengageProbDEPRECATED @3 :Float32; + steerOverrideProbDEPRECATED @4 :Float32; + } + + enum ConfidenceClass { + red @0; + yellow @1; + green @2; + } + + struct DisengagePredictions { + t @0 :List(Float32); + brakeDisengageProbs @1 :List(Float32); + gasDisengageProbs @2 :List(Float32); + steerOverrideProbs @3 :List(Float32); + brake3MetersPerSecondSquaredProbs @4 :List(Float32); + brake4MetersPerSecondSquaredProbs @5 :List(Float32); + brake5MetersPerSecondSquaredProbs @6 :List(Float32); + gasPressProbs @7 :List(Float32); + brakePressProbs @8 :List(Float32); + } + + struct Pose { + trans @0 :List(Float32); # m/s in device frame + rot @1 :List(Float32); # rad/s in device frame + transStd @2 :List(Float32); # std m/s in device frame + rotStd @3 :List(Float32); # std rad/s in device frame + } + + struct LateralPlannerSolution { + x @0 :List(Float32); + y @1 :List(Float32); + yaw @2 :List(Float32); + yawRate @3 :List(Float32); + xStd @4 :List(Float32); + yStd @5 :List(Float32); + yawStd @6 :List(Float32); + yawRateStd @7 :List(Float32); + } + + struct Action { + desiredCurvature @0 :Float32; + desiredAcceleration @1 :Float32; + shouldStop @2 :Bool; + } +} + +struct EncodeIndex { + # picture from camera + frameId @0 :UInt32; + type @1 :Type; + # index of encoder from start of route + encodeId @2 :UInt32; + # minute long segment this frame is in + segmentNum @3 :Int32; + # index into camera file in segment in presentation order + segmentId @4 :UInt32; + # index into camera file in segment in encode order + segmentIdEncode @5 :UInt32; + timestampSof @6 :UInt64; + timestampEof @7 :UInt64; + + # encoder metadata + flags @8 :UInt32; + len @9 :UInt32; + + enum Type { + bigBoxLossless @0; + fullHEVC @1; + qcameraH264 @6; + livestreamH264 @7; + + # deprecated + bigBoxHEVCDEPRECATED @2; + chffrAndroidH264DEPRECATED @3; + fullLosslessClipDEPRECATED @4; + frontDEPRECATED @5; + + } +} + +struct AndroidLogEntry { + id @0 :UInt8; + ts @1 :UInt64; + priority @2 :UInt8; + pid @3 :Int32; + tid @4 :Int32; + tag @5 :Text; + message @6 :Text; +} + +struct DriverAssistance { + # Lane Departure Warnings + leftLaneDeparture @0 :Bool; + rightLaneDeparture @1 :Bool; + + # FCW, AEB, etc. will go here +} + +struct LateralManeuverPlan { + desiredCurvature @0 :Float32; # 1/m +} + +struct LongitudinalPlan @0xe00b5b3eba12876c { + modelMonoTime @9 :UInt64; + hasLead @7 :Bool; + fcw @8 :Bool; + longitudinalPlanSource @15 :LongitudinalPlanSource; + processingDelay @29 :Float32; + + # desired speed/accel/jerk over next 2.5s + accels @32 :List(Float32); + speeds @33 :List(Float32); + jerks @34 :List(Float32); + aTarget @18 :Float32; + shouldStop @37: Bool; + allowThrottle @38: Bool; + allowBrake @39: Bool; + leadDistance @40 :Float32; + + + solverExecutionTime @35 :Float32; + + # lead trajectories the MPC solved against (13 points at T_IDXS) + leadTrajectoryX0 @41 :List(Float32); + leadTrajectoryV0 @42 :List(Float32); + leadTrajectoryX1 @43 :List(Float32); + leadTrajectoryV1 @44 :List(Float32); + + enum LongitudinalPlanSource { + cruise @0; + lead0 @1; + lead1 @2; + lead2 @3; + e2e @4; + } + + # deprecated + vCruiseDEPRECATED @16 :Float32; + aCruiseDEPRECATED @17 :Float32; + vTargetDEPRECATED @3 :Float32; + vTargetFutureDEPRECATED @14 :Float32; + vStartDEPRECATED @26 :Float32; + aStartDEPRECATED @27 :Float32; + vMaxDEPRECATED @20 :Float32; + radarStateMonoTimeDEPRECATED @10 :UInt64; + jerkFactorDEPRECATED @6 :Float32; + hasLeftLaneDEPRECATED @23 :Bool; + hasRightLaneDEPRECATED @24 :Bool; + aTargetMinDEPRECATED @4 :Float32; + aTargetMaxDEPRECATED @5 :Float32; + lateralValidDEPRECATED @0 :Bool; + longitudinalValidDEPRECATED @2 :Bool; + dPolyDEPRECATED @1 :List(Float32); + laneWidthDEPRECATED @11 :Float32; + vCurvatureDEPRECATED @21 :Float32; + decelForTurnDEPRECATED @22 :Bool; + mapValidDEPRECATED @25 :Bool; + radarValidDEPRECATED @28 :Bool; + radarCanErrorDEPRECATED @30 :Bool; + commIssueDEPRECATED @31 :Bool; + eventsDEPRECATED @13 :List(Car.OnroadEventDEPRECATED); + gpsTrajectoryDEPRECATED @12 :GpsTrajectory; + gpsPlannerActiveDEPRECATED @19 :Bool; + personalityDEPRECATED @36 :LongitudinalPersonality; + + struct GpsTrajectory { + x @0 :List(Float32); + y @1 :List(Float32); + } +} +struct UiPlan { + frameId @2 :UInt32; + position @0 :XYZTData; + accel @1 :List(Float32); +} + +struct LateralPlan @0xe1e9318e2ae8b51e { + modelMonoTime @31 :UInt64; + laneWidthDEPRECATED @0 :Float32; + lProbDEPRECATED @5 :Float32; + rProbDEPRECATED @7 :Float32; + dPathPoints @20 :List(Float32); + dProbDEPRECATED @21 :Float32; + + mpcSolutionValid @9 :Bool; + desire @17 :Desire; + laneChangeState @18 :LaneChangeState; + laneChangeDirection @19 :LaneChangeDirection; + useLaneLines @29 :Bool; + + # desired curvatures over next 2.5s in rad/m + psis @26 :List(Float32); + curvatures @27 :List(Float32); + curvatureRates @28 :List(Float32); + + solverExecutionTime @30 :Float32; + solverCost @32 :Float32; + solverState @33 :SolverState; + + struct SolverState { + x @0 :List(List(Float32)); + u @1 :List(Float32); + } + + # deprecated + curvatureDEPRECATED @22 :Float32; + curvatureRateDEPRECATED @23 :Float32; + rawCurvatureDEPRECATED @24 :Float32; + rawCurvatureRateDEPRECATED @25 :Float32; + cProbDEPRECATED @3 :Float32; + dPolyDEPRECATED @1 :List(Float32); + cPolyDEPRECATED @2 :List(Float32); + lPolyDEPRECATED @4 :List(Float32); + rPolyDEPRECATED @6 :List(Float32); + modelValidDEPRECATED @12 :Bool; + commIssueDEPRECATED @15 :Bool; + posenetValidDEPRECATED @16 :Bool; + sensorValidDEPRECATED @14 :Bool; + paramsValidDEPRECATED @10 :Bool; + steeringAngleDegDEPRECATED @8 :Float32; # deg + steeringRateDegDEPRECATED @13 :Float32; # deg/s + angleOffsetDegDEPRECATED @11 :Float32; +} + +struct LiveLocationKalman { + + # More info on reference frames: + # https://github.com/commaai/openpilot/tree/master/common/transformations + + positionECEF @0 : Measurement; + positionGeodetic @1 : Measurement; + velocityECEF @2 : Measurement; + velocityNED @3 : Measurement; + velocityDevice @4 : Measurement; + accelerationDevice @5: Measurement; + + + # These angles are all eulers and roll, pitch, yaw + # orientationECEF transforms to rot matrix: ecef_from_device + orientationECEF @6 : Measurement; + calibratedOrientationECEF @20 : Measurement; + orientationNED @7 : Measurement; + angularVelocityDevice @8 : Measurement; + + # orientationNEDCalibrated transforms to rot matrix: NED_from_calibrated + calibratedOrientationNED @9 : Measurement; + + # Calibrated frame is simply device frame + # aligned with the vehicle + velocityCalibrated @10 : Measurement; + accelerationCalibrated @11 : Measurement; + angularVelocityCalibrated @12 : Measurement; + + gpsWeek @13 :Int32; + gpsTimeOfWeek @14 :Float64; + status @15 :Status; + unixTimestampMillis @16 :Int64; + inputsOK @17 :Bool = true; + posenetOK @18 :Bool = true; + gpsOK @19 :Bool = true; + sensorsOK @21 :Bool = true; + deviceStable @22 :Bool = true; + timeSinceReset @23 :Float64; + excessiveResets @24 :Bool; + timeToFirstFix @25 :Float32; + + filterState @26 : Measurement; + + enum Status { + uninitialized @0; + uncalibrated @1; + valid @2; + } + + struct Measurement { + value @0 : List(Float64); + std @1 : List(Float64); + valid @2 : Bool; + } +} + + +struct DeviceMotion @0xc24ca2b57206b44d { + # More info on reference frames: + # https://github.com/commaai/openpilot/tree/master/common/transformations + orientationNED @0 :XYZMeasurement; + velocityDevice @1 :XYZMeasurement; + accelerationDevice @2 :XYZMeasurement; + angularVelocityDevice @3 :XYZMeasurement; + + inputsOK @4 :Bool = false; + posenetOK @5 :Bool = false; + sensorsOK @6 :Bool = false; + + debugFilterState @7 :FilterState; + + struct XYZMeasurement { + x @0 :Float32; + y @1 :Float32; + z @2 :Float32; + xStd @3 :Float32; + yStd @4 :Float32; + zStd @5 :Float32; + valid @6 :Bool; + } + + struct FilterState { + value @0 : List(Float64); + std @1 : List(Float64); + valid @2 : Bool; + + observations @3 :List(Observation); + + struct Observation { + kind @0 :Int32; + value @1 :List(Float32); + error @2 :List(Float32); + } + } +} + +struct ProcLog { + cpuTimes @0 :List(CPUTimes); + mem @1 :Mem; + procs @2 :List(Process); + + struct Process { + pid @0 :Int32; + name @1 :Text; + state @2 :UInt8; + ppid @3 :Int32; + + cpuUser @4 :Float32; + cpuSystem @5 :Float32; + cpuChildrenUser @6 :Float32; + cpuChildrenSystem @7 :Float32; + priority @8 :Int64; + nice @9 :Int32; + numThreads @10 :Int32; + startTime @11 :Float64; + + memVms @12 :UInt64; + memRss @13 :UInt64; + + processor @14 :Int32; + + cmdline @15 :List(Text); + exe @16 :Text; + } + + struct CPUTimes { + cpuNum @0 :Int64; + user @1 :Float32; + nice @2 :Float32; + system @3 :Float32; + idle @4 :Float32; + iowait @5 :Float32; + irq @6 :Float32; + softirq @7 :Float32; + } + + struct Mem { + total @0 :UInt64; + free @1 :UInt64; + available @2 :UInt64; + buffers @3 :UInt64; + cached @4 :UInt64; + active @5 :UInt64; + inactive @6 :UInt64; + shared @7 :UInt64; + } +} + +struct GnssMeasurements { + measTime @0 :UInt64; + gpsWeek @1 :Int16; + gpsTimeOfWeek @2 :Float64; + + correctedMeasurements @3 :List(CorrectedMeasurement); + ephemerisStatuses @9 :List(EphemerisStatus); + + kalmanPositionECEF @4 :LiveLocationKalman.Measurement; + kalmanVelocityECEF @5 :LiveLocationKalman.Measurement; + positionECEF @6 :LiveLocationKalman.Measurement; + velocityECEF @7 :LiveLocationKalman.Measurement; + timeToFirstFix @8 :Float32; + # Todo sync this with timing pulse of ublox + + struct EphemerisStatus { + constellationId @0 :ConstellationId; + svId @1 :UInt8; + type @2 :EphemerisType; + source @3 :EphemerisSource; + gpsWeek @4 : UInt16; + tow @5 :Float64; + } + + struct CorrectedMeasurement { + constellationId @0 :ConstellationId; + svId @1 :UInt8; + # Is 0 when not Glonass constellation. + glonassFrequency @2 :Int8; + pseudorange @3 :Float64; + pseudorangeStd @4 :Float64; + pseudorangeRate @5 :Float64; + pseudorangeRateStd @6 :Float64; + # Satellite position and velocity [x,y,z] + satPos @7 :List(Float64); + satVel @8 :List(Float64); + ephemerisSourceDEPRECATED @9 :EphemerisSourceDEPRECATED; + } + + struct EphemerisSourceDEPRECATED { + type @0 :EphemerisType; + # first epoch in file: + gpsWeek @1 :Int16; # -1 if Nav + gpsTimeOfWeek @2 :Int32; # -1 if Nav. Integer for seconds is good enough for logs. + } + + enum ConstellationId { + # Satellite Constellation using the Ublox gnssid as index + gps @0; + sbas @1; + galileo @2; + beidou @3; + imes @4; + qznss @5; + glonass @6; + } + + enum EphemerisType { + nav @0; + # Different ultra-rapid files: + nasaUltraRapid @1; + glonassIacUltraRapid @2; + qcom @3; + } + + enum EphemerisSource { + gnssChip @0; + internet @1; + cache @2; + unknown @3; + } +} + +struct UbloxGnss { + union { + measurementReport @0 :MeasurementReport; + ephemeris @1 :Ephemeris; + ionoData @2 :IonoData; + hwStatus @3 :HwStatus; + hwStatus2 @4 :HwStatus2; + glonassEphemeris @5 :GlonassEphemeris; + satReport @6 :SatReport; + } + + struct SatReport { + #received time of week in gps time in seconds and gps week + iTow @0 :UInt32; + svs @1 :List(SatInfo); + + struct SatInfo { + svId @0 :UInt8; + gnssId @1 :UInt8; + flagsBitfield @2 :UInt32; + cno @3 :UInt8; + elevationDeg @4 :Int8; + azimuthDeg @5 :Int16; + pseudorangeResidual @6 :Float32; + } + } + + struct MeasurementReport { + #received time of week in gps time in seconds and gps week + rcvTow @0 :Float64; + gpsWeek @1 :UInt16; + # leap seconds in seconds + leapSeconds @2 :UInt16; + # receiver status + receiverStatus @3 :ReceiverStatus; + # num of measurements to follow + numMeas @4 :UInt8; + measurements @5 :List(Measurement); + + struct ReceiverStatus { + # leap seconds have been determined + leapSecValid @0 :Bool; + # Clock reset applied + clkReset @1 :Bool; + } + + struct Measurement { + svId @0 :UInt8; + trackingStatus @1 :TrackingStatus; + # pseudorange in meters + pseudorange @2 :Float64; + # carrier phase measurement in cycles + carrierCycles @3 :Float64; + # doppler measurement in Hz + doppler @4 :Float32; + # GNSS id, 0 is gps + gnssId @5 :UInt8; + glonassFrequencyIndex @6 :UInt8; + # carrier phase locktime counter in ms + locktime @7 :UInt16; + # Carrier-to-noise density ratio (signal strength) in dBHz + cno @8 :UInt8; + # pseudorange standard deviation in meters + pseudorangeStdev @9 :Float32; + # carrier phase standard deviation in cycles + carrierPhaseStdev @10 :Float32; + # doppler standard deviation in Hz + dopplerStdev @11 :Float32; + sigId @12 :UInt8; + + struct TrackingStatus { + # pseudorange valid + pseudorangeValid @0 :Bool; + # carrier phase valid + carrierPhaseValid @1 :Bool; + # half cycle valid + halfCycleValid @2 :Bool; + # half cycle subtracted from phase + halfCycleSubtracted @3 :Bool; + } + } + } + + struct Ephemeris { + # This is according to the rinex (2?) format + svId @0 :UInt16; + year @1 :UInt16; + month @2 :UInt16; + day @3 :UInt16; + hour @4 :UInt16; + minute @5 :UInt16; + second @6 :Float32; + af0 @7 :Float64; + af1 @8 :Float64; + af2 @9 :Float64; + + iode @10 :Float64; + crs @11 :Float64; + deltaN @12 :Float64; + m0 @13 :Float64; + + cuc @14 :Float64; + ecc @15 :Float64; + cus @16 :Float64; + a @17 :Float64; # note that this is not the root!! + + toe @18 :Float64; + cic @19 :Float64; + omega0 @20 :Float64; + cis @21 :Float64; + + i0 @22 :Float64; + crc @23 :Float64; + omega @24 :Float64; + omegaDot @25 :Float64; + + iDot @26 :Float64; + codesL2 @27 :Float64; + gpsWeekDEPRECATED @28 :Float64; + l2 @29 :Float64; + + svAcc @30 :Float64; + svHealth @31 :Float64; + tgd @32 :Float64; + iodc @33 :Float64; + + transmissionTime @34 :Float64; + fitInterval @35 :Float64; + + toc @36 :Float64; + + ionoCoeffsValid @37 :Bool; + ionoAlpha @38 :List(Float64); + ionoBeta @39 :List(Float64); + + towCount @40 :UInt32; + toeWeek @41 :UInt16; + tocWeek @42 :UInt16; + } + + struct IonoData { + svHealth @0 :UInt32; + tow @1 :Float64; + gpsWeek @2 :Float64; + + ionoAlpha @3 :List(Float64); + ionoBeta @4 :List(Float64); + + healthValid @5 :Bool; + ionoCoeffsValid @6 :Bool; + } + + struct HwStatus { + noisePerMS @0 :UInt16; + agcCnt @1 :UInt16; + aStatus @2 :AntennaSupervisorState; + aPower @3 :AntennaPowerStatus; + jamInd @4 :UInt8; + flags @5 :UInt8; + + enum AntennaSupervisorState { + init @0; + dontknow @1; + ok @2; + short @3; + open @4; + } + + enum AntennaPowerStatus { + off @0; + on @1; + dontknow @2; + } + } + + struct HwStatus2 { + ofsI @0 :Int8; + magI @1 :UInt8; + ofsQ @2 :Int8; + magQ @3 :UInt8; + cfgSource @4 :ConfigSource; + lowLevCfg @5 :UInt32; + postStatus @6 :UInt32; + + enum ConfigSource { + undefined @0; + rom @1; + otp @2; + configpins @3; + flash @4; + } + } + + struct GlonassEphemeris { + svId @0 :UInt16; + year @1 :UInt16; + dayInYear @2 :UInt16; + hour @3 :UInt16; + minute @4 :UInt16; + second @5 :Float32; + + x @6 :Float64; + xVel @7 :Float64; + xAccel @8 :Float64; + y @9 :Float64; + yVel @10 :Float64; + yAccel @11 :Float64; + z @12 :Float64; + zVel @13 :Float64; + zAccel @14 :Float64; + + svType @15 :UInt8; + svURA @16 :Float32; + age @17 :UInt8; + + svHealth @18 :UInt8; + tkDEPRECATED @19 :UInt16; + tb @20 :UInt16; + + tauN @21 :Float64; + deltaTauN @22 :Float64; + gammaN @23 :Float64; + + p1 @24 :UInt8; + p2 @25 :UInt8; + p3 @26 :UInt8; + p4 @27 :UInt8; + + freqNumDEPRECATED @28 :UInt32; + + n4 @29 :UInt8; + nt @30 :UInt16; + freqNum @31 :Int16; + tkSeconds @32 :UInt32; + } +} + +struct QcomGnss @0xde94674b07ae51c1 { + logTs @0 :UInt64; + union { + measurementReport @1 :MeasurementReport; + clockReport @2 :ClockReport; + drMeasurementReport @3 :DrMeasurementReport; + drSvPoly @4 :DrSvPolyReport; + rawLog @5 :Data; + } + + enum MeasurementSource @0xd71a12b6faada7ee { + gps @0; + glonass @1; + beidou @2; + unknown3 @3; + unknown4 @4; + unknown5 @5; + sbas @6; + } + + enum SVObservationState @0xe81e829a0d6c83e9 { + idle @0; + search @1; + searchVerify @2; + bitEdge @3; + trackVerify @4; + track @5; + restart @6; + dpo @7; + glo10msBe @8; + glo10msAt @9; + } + + struct MeasurementStatus @0xe501010e1bcae83b { + subMillisecondIsValid @0 :Bool; + subBitTimeIsKnown @1 :Bool; + satelliteTimeIsKnown @2 :Bool; + bitEdgeConfirmedFromSignal @3 :Bool; + measuredVelocity @4 :Bool; + fineOrCoarseVelocity @5 :Bool; + lockPointValid @6 :Bool; + lockPointPositive @7 :Bool; + lastUpdateFromDifference @8 :Bool; + lastUpdateFromVelocityDifference @9 :Bool; + strongIndicationOfCrossCorelation @10 :Bool; + tentativeMeasurement @11 :Bool; + measurementNotUsable @12 :Bool; + sirCheckIsNeeded @13 :Bool; + probationMode @14 :Bool; + + glonassMeanderBitEdgeValid @15 :Bool; + glonassTimeMarkValid @16 :Bool; + + gpsRoundRobinRxDiversity @17 :Bool; + gpsRxDiversity @18 :Bool; + gpsLowBandwidthRxDiversityCombined @19 :Bool; + gpsHighBandwidthNu4 @20 :Bool; + gpsHighBandwidthNu8 @21 :Bool; + gpsHighBandwidthUniform @22 :Bool; + multipathIndicator @23 :Bool; + + imdJammingIndicator @24 :Bool; + lteB13TxJammingIndicator @25 :Bool; + freshMeasurementIndicator @26 :Bool; + + multipathEstimateIsValid @27 :Bool; + directionIsValid @28 :Bool; + } + + struct MeasurementReport @0xf580d7d86b7b8692 { + source @0 :MeasurementSource; + + fCount @1 :UInt32; + + gpsWeek @2 :UInt16; + glonassCycleNumber @3 :UInt8; + glonassNumberOfDays @4 :UInt16; + + milliseconds @5 :UInt32; + timeBias @6 :Float32; + clockTimeUncertainty @7 :Float32; + clockFrequencyBias @8 :Float32; + clockFrequencyUncertainty @9 :Float32; + + sv @10 :List(SV); + + struct SV @0xf10c595ae7bb2c27 { + svId @0 :UInt8; + observationState @2 :SVObservationState; + observations @3 :UInt8; + goodObservations @4 :UInt8; + gpsParityErrorCount @5 :UInt16; + glonassFrequencyIndex @1 :Int8; + glonassHemmingErrorCount @6 :UInt8; + filterStages @7 :UInt8; + carrierNoise @8 :UInt16; + latency @9 :Int16; + predetectInterval @10 :UInt8; + postdetections @11 :UInt16; + + unfilteredMeasurementIntegral @12 :UInt32; + unfilteredMeasurementFraction @13 :Float32; + unfilteredTimeUncertainty @14 :Float32; + unfilteredSpeed @15 :Float32; + unfilteredSpeedUncertainty @16 :Float32; + measurementStatus @17 :MeasurementStatus; + multipathEstimate @18 :UInt32; + azimuth @19 :Float32; + elevation @20 :Float32; + carrierPhaseCyclesIntegral @21 :Int32; + carrierPhaseCyclesFraction @22 :UInt16; + fineSpeed @23 :Float32; + fineSpeedUncertainty @24 :Float32; + cycleSlipCount @25 :UInt8; + } + + } + + struct ClockReport @0xca965e4add8f4f0b { + hasFCount @0 :Bool; + fCount @1 :UInt32; + + hasGpsWeek @2 :Bool; + gpsWeek @3 :UInt16; + hasGpsMilliseconds @4 :Bool; + gpsMilliseconds @5 :UInt32; + gpsTimeBias @6 :Float32; + gpsClockTimeUncertainty @7 :Float32; + gpsClockSource @8 :UInt8; + + hasGlonassYear @9 :Bool; + glonassYear @10 :UInt8; + hasGlonassDay @11 :Bool; + glonassDay @12 :UInt16; + hasGlonassMilliseconds @13 :Bool; + glonassMilliseconds @14 :UInt32; + glonassTimeBias @15 :Float32; + glonassClockTimeUncertainty @16 :Float32; + glonassClockSource @17 :UInt8; + + bdsWeek @18 :UInt16; + bdsMilliseconds @19 :UInt32; + bdsTimeBias @20 :Float32; + bdsClockTimeUncertainty @21 :Float32; + bdsClockSource @22 :UInt8; + + galWeek @23 :UInt16; + galMilliseconds @24 :UInt32; + galTimeBias @25 :Float32; + galClockTimeUncertainty @26 :Float32; + galClockSource @27 :UInt8; + + clockFrequencyBias @28 :Float32; + clockFrequencyUncertainty @29 :Float32; + frequencySource @30 :UInt8; + gpsLeapSeconds @31 :UInt8; + gpsLeapSecondsUncertainty @32 :UInt8; + gpsLeapSecondsSource @33 :UInt8; + + gpsToGlonassTimeBiasMilliseconds @34 :Float32; + gpsToGlonassTimeBiasMillisecondsUncertainty @35 :Float32; + gpsToBdsTimeBiasMilliseconds @36 :Float32; + gpsToBdsTimeBiasMillisecondsUncertainty @37 :Float32; + bdsToGloTimeBiasMilliseconds @38 :Float32; + bdsToGloTimeBiasMillisecondsUncertainty @39 :Float32; + gpsToGalTimeBiasMilliseconds @40 :Float32; + gpsToGalTimeBiasMillisecondsUncertainty @41 :Float32; + galToGloTimeBiasMilliseconds @42 :Float32; + galToGloTimeBiasMillisecondsUncertainty @43 :Float32; + galToBdsTimeBiasMilliseconds @44 :Float32; + galToBdsTimeBiasMillisecondsUncertainty @45 :Float32; + + hasRtcTime @46 :Bool; + systemRtcTime @47 :UInt32; + fCountOffset @48 :UInt32; + lpmRtcCount @49 :UInt32; + clockResets @50 :UInt32; + } + + struct DrMeasurementReport @0x8053c39445c6c75c { + + reason @0 :UInt8; + seqNum @1 :UInt8; + seqMax @2 :UInt8; + rfLoss @3 :UInt16; + + systemRtcValid @4 :Bool; + fCount @5 :UInt32; + clockResets @6 :UInt32; + systemRtcTime @7 :UInt64; + + gpsLeapSeconds @8 :UInt8; + gpsLeapSecondsUncertainty @9 :UInt8; + gpsToGlonassTimeBiasMilliseconds @10 :Float32; + gpsToGlonassTimeBiasMillisecondsUncertainty @11 :Float32; + + gpsWeek @12 :UInt16; + gpsMilliseconds @13 :UInt32; + gpsTimeBiasMs @14 :UInt32; + gpsClockTimeUncertaintyMs @15 :UInt32; + gpsClockSource @16 :UInt8; + + glonassClockSource @17 :UInt8; + glonassYear @18 :UInt8; + glonassDay @19 :UInt16; + glonassMilliseconds @20 :UInt32; + glonassTimeBias @21 :Float32; + glonassClockTimeUncertainty @22 :Float32; + + clockFrequencyBias @23 :Float32; + clockFrequencyUncertainty @24 :Float32; + frequencySource @25 :UInt8; + + source @26 :MeasurementSource; + + sv @27 :List(SV); + + struct SV @0xf08b81df8cbf459c { + svId @0 :UInt8; + glonassFrequencyIndex @1 :Int8; + observationState @2 :SVObservationState; + observations @3 :UInt8; + goodObservations @4 :UInt8; + filterStages @5 :UInt8; + predetectInterval @6 :UInt8; + cycleSlipCount @7 :UInt8; + postdetections @8 :UInt16; + + measurementStatus @9 :MeasurementStatus; + + carrierNoise @10 :UInt16; + rfLoss @11 :UInt16; + latency @12 :Int16; + + filteredMeasurementFraction @13 :Float32; + filteredMeasurementIntegral @14 :UInt32; + filteredTimeUncertainty @15 :Float32; + filteredSpeed @16 :Float32; + filteredSpeedUncertainty @17 :Float32; + + unfilteredMeasurementFraction @18 :Float32; + unfilteredMeasurementIntegral @19 :UInt32; + unfilteredTimeUncertainty @20 :Float32; + unfilteredSpeed @21 :Float32; + unfilteredSpeedUncertainty @22 :Float32; + + multipathEstimate @23 :UInt32; + azimuth @24 :Float32; + elevation @25 :Float32; + dopplerAcceleration @26 :Float32; + fineSpeed @27 :Float32; + fineSpeedUncertainty @28 :Float32; + + carrierPhase @29 :Float64; + fCount @30 :UInt32; + + parityErrorCount @31 :UInt16; + goodParity @32 :Bool; + } + } + + struct DrSvPolyReport @0xb1fb80811a673270 { + svId @0 :UInt16; + frequencyIndex @1 :Int8; + + hasPosition @2 :Bool; + hasIono @3 :Bool; + hasTropo @4 :Bool; + hasElevation @5 :Bool; + polyFromXtra @6 :Bool; + hasSbasIono @7 :Bool; + + iode @8 :UInt16; + t0 @9 :Float64; + xyz0 @10 :List(Float64); + xyzN @11 :List(Float64); + other @12 :List(Float32); + + positionUncertainty @13 :Float32; + ionoDelay @14 :Float32; + ionoDot @15 :Float32; + sbasIonoDelay @16 :Float32; + sbasIonoDot @17 :Float32; + tropoDelay @18 :Float32; + elevation @19 :Float32; + elevationDot @20 :Float32; + elevationUncertainty @21 :Float32; + velocityCoeff @22 :List(Float64); + + gpsWeek @23 :UInt16; + gpsTow @24 :Float64; + } +} + +struct Clocks { + wallTimeNanos @3 :UInt64; # unix epoch time + + bootTimeNanosDEPRECATED @0 :UInt64; + monotonicNanosDEPRECATED @1 :UInt64; + monotonicRawNanosDEPRECATD @2 :UInt64; + modemUptimeMillisDEPRECATED @4 :UInt64; +} + +struct LiveMpcData { + x @0 :List(Float32); + y @1 :List(Float32); + psi @2 :List(Float32); + curvature @3 :List(Float32); + qpIterations @4 :UInt32; + calculationTime @5 :UInt64; + cost @6 :Float64; +} + +struct LiveLongitudinalMpcData { + xEgo @0 :List(Float32); + vEgo @1 :List(Float32); + aEgo @2 :List(Float32); + xLead @3 :List(Float32); + vLead @4 :List(Float32); + aLead @5 :List(Float32); + aLeadTau @6 :Float32; # lead accel time constant + qpIterations @7 :UInt32; + mpcId @8 :UInt32; + calculationTime @9 :UInt64; + cost @10 :Float64; +} + +struct Joystick { + # convenient for debug and live tuning + axes @0: List(Float32); + buttons @1: List(Bool); +} + +struct DriverStateV2 { + frameId @0 :UInt32; + modelExecutionTime @1 :Float32; + gpuExecutionTime @8 :Float32; + rawPredictions @3 :Data; + + wheelOnRightProb @5 :Float32; + leftDriverData @6 :DriverData; + rightDriverData @7 :DriverData; + + struct DriverData { + faceOrientation @0 :List(Float32); + faceOrientationStd @1 :List(Float32); + facePosition @2 :List(Float32); + facePositionStd @3 :List(Float32); + faceProb @4 :Float32; + leftEyeProb @5 :Float32; + rightEyeProb @6 :Float32; + leftBlinkProb @7 :Float32; + rightBlinkProb @8 :Float32; + sunglassesProb @9 :Float32; + phoneProb @13 :Float32; + notReadyProbDEPRECATED @12 :List(Float32); + occludedProbDEPRECATED @10 :Float32; + readyProbDEPRECATED @11 :List(Float32); + } + + dspExecutionTimeDEPRECATED @2 :Float32; + poorVisionProbDEPRECATED @4 :Float32; +} + +struct DriverStateDEPRECATED @0xb83c6cc593ed0a00 { + frameId @0 :UInt32; + modelExecutionTime @14 :Float32; + dspExecutionTime @16 :Float32; + rawPredictions @15 :Data; + + faceOrientation @3 :List(Float32); + facePosition @4 :List(Float32); + faceProb @5 :Float32; + leftEyeProb @6 :Float32; + rightEyeProb @7 :Float32; + leftBlinkProb @8 :Float32; + rightBlinkProb @9 :Float32; + faceOrientationStd @11 :List(Float32); + facePositionStd @12 :List(Float32); + sunglassesProb @13 :Float32; + poorVision @17 :Float32; + partialFace @18 :Float32; + distractedPose @19 :Float32; + distractedEyes @20 :Float32; + eyesOnRoad @21 :Float32; + phoneUse @22 :Float32; + occludedProb @23 :Float32; + + readyProb @24 :List(Float32); + notReadyProb @25 :List(Float32); + + irPwrDEPRECATED @10 :Float32; + descriptorDEPRECATED @1 :List(Float32); + stdDEPRECATED @2 :Float32; +} + +struct DriverMonitoringState @0xb83cda094a1da284 { + events @18 :List(OnroadEvent); + faceDetected @1 :Bool; + isDistracted @2 :Bool; + distractedType @17 :UInt32; + awarenessStatus @3 :Float32; + posePitchOffset @6 :Float32; + posePitchValidCount @7 :UInt32; + poseYawOffset @8 :Float32; + poseYawValidCount @9 :UInt32; + stepChange @10 :Float32; + awarenessActive @11 :Float32; + awarenessPassive @12 :Float32; + isLowStd @13 :Bool; + hiStdCount @14 :UInt32; + isActiveMode @16 :Bool; + isRHD @4 :Bool; + uncertainCount @19 :UInt32; + phoneProbOffset @20 :Float32; + phoneProbValidCount @21 :UInt32; + + isPreviewDEPRECATED @15 :Bool; + rhdCheckedDEPRECATED @5 :Bool; + eventsDEPRECATED @0 :List(Car.OnroadEventDEPRECATED); +} + +struct Boot { + wallTimeNanos @0 :UInt64; + pstore @4 :Map(Text, Data); + commands @5 :Map(Text, Data); + launchLog @3 :Text; + + lastKmsgDEPRECATED @1 :Data; + lastPmsgDEPRECATED @2 :Data; +} + +struct VehicleParameters @0xd9058dcb967c2753 { + valid @0 :Bool; + gyroBias @1 :Float32; + angleOffsetDeg @2 :Float32; + angleOffsetAverageDeg @3 :Float32; + stiffnessFactor @4 :Float32; + steerRatio @5 :Float32; + sensorValid @6 :Bool; + posenetSpeed @8 :Float32; + posenetValid @9 :Bool; + angleOffsetFastStd @10 :Float32; + angleOffsetAverageStd @11 :Float32; + stiffnessFactorStd @12 :Float32; + steerRatioStd @13 :Float32; + roll @14 :Float32; + debugFilterState @16 :FilterState; + + angleOffsetValid @17 :Bool = true; + angleOffsetAverageValid @18 :Bool = true; + steerRatioValid @19 :Bool = true; + stiffnessFactorValid @20 :Bool = true; + + yawRateDEPRECATED @7 :Float32; + filterStateDEPRECATED @15 :LiveLocationKalman.Measurement; + + struct FilterState { + value @0 : List(Float64); + std @1 : List(Float64); + } +} + +struct LateralTorqueParameters @0xe61690eb0b091692 { + valid @0 :Bool; + latAccelFactorRaw @1 :Float32; + latAccelOffsetRaw @2 :Float32; + frictionCoefficientRaw @3 :Float32; + latAccelFactorFiltered @4 :Float32; + latAccelOffsetFiltered @5 :Float32; + frictionCoefficientFiltered @6 :Float32; + totalBucketPoints @7 :Float32; + decay @8 :Float32; + maxResets @9 :Float32; + points @10 :List(List(Float32)); + version @11 :Int32; + useParams @12 :Bool; + calPerc @13 :Int8; +} + +struct LateralDelay @0x98dfdb22c44df8d4 { + lateralDelay @0 :Float32; + validBlocks @1 :Int32; + status @2 :Status; + + lateralDelayEstimate @3 :Float32; + lateralDelayEstimateStd @5 :Float32; + points @4 :List(Float32); + calPerc @6 :Int8; + version @7 :Int32; + + enum Status { + unestimated @0; + estimated @1; + invalid @2; + } +} + +struct LiveMapDataDEPRECATED { + speedLimitValid @0 :Bool; + speedLimit @1 :Float32; + speedAdvisoryValid @12 :Bool; + speedAdvisory @13 :Float32; + speedLimitAheadValid @14 :Bool; + speedLimitAhead @15 :Float32; + speedLimitAheadDistance @16 :Float32; + curvatureValid @2 :Bool; + curvature @3 :Float32; + wayId @4 :UInt64; + roadX @5 :List(Float32); + roadY @6 :List(Float32); + lastGps @7: GpsLocationData; + roadCurvatureX @8 :List(Float32); + roadCurvature @9 :List(Float32); + distToTurn @10 :Float32; + mapValid @11 :Bool; +} + +struct CameraOdometry { + frameId @4 :UInt32; + timestampEof @5 :UInt64; + trans @0 :List(Float32); # m/s in device frame + rot @1 :List(Float32); # rad/s in device frame + transStd @2 :List(Float32); # std m/s in device frame + rotStd @3 :List(Float32); # std rad/s in device frame + wideFromDeviceEuler @6 :List(Float32); + wideFromDeviceEulerStd @7 :List(Float32); + roadTransformTrans @8 :List(Float32); + roadTransformTransStd @9 :List(Float32); +} + +struct Sentinel { + enum SentinelType { + endOfSegment @0; + endOfRoute @1; + startOfSegment @2; + startOfRoute @3; + } + type @0 :SentinelType; + signal @1 :Int32; +} + +struct UIDebug { + drawTimeMillis @0 :Float32; +} + +struct ManagerState { + processes @0 :List(ProcessState); + + struct ProcessState { + name @0 :Text; + pid @1 :Int32; + running @2 :Bool; + shouldBeRunning @4 :Bool; + exitCode @3 :Int32; + } +} + +struct UploaderState { + immediateQueueSize @0 :UInt32; + immediateQueueCount @1 :UInt32; + rawQueueSize @2 :UInt32; + rawQueueCount @3 :UInt32; + + # stats for last successfully uploaded file + lastTime @4 :Float32; # s + lastSpeed @5 :Float32; # MB/s + lastFilename @6 :Text; +} + +struct NavInstruction { + maneuverPrimaryText @0 :Text; + maneuverSecondaryText @1 :Text; + maneuverDistance @2 :Float32; # m + maneuverType @3 :Text; # TODO: Make Enum + maneuverModifier @4 :Text; # TODO: Make Enum + + distanceRemaining @5 :Float32; # m + timeRemaining @6 :Float32; # s + timeRemainingTypical @7 :Float32; # s + + lanes @8 :List(Lane); + showFull @9 :Bool; + + speedLimit @10 :Float32; # m/s + speedLimitSign @11 :SpeedLimitSign; + + allManeuvers @12 :List(Maneuver); + + struct Lane { + directions @0 :List(Direction); + active @1 :Bool; + activeDirection @2 :Direction; + } + + enum Direction { + none @0; + left @1; + right @2; + straight @3; + slightLeft @4; + slightRight @5; + } + + enum SpeedLimitSign { + mutcd @0; # US Style + vienna @1; # EU Style + } + + struct Maneuver { + distance @0 :Float32; + type @1 :Text; + modifier @2 :Text; + } +} + +struct NavRoute { + coordinates @0 :List(Coordinate); + + struct Coordinate { + latitude @0 :Float32; + longitude @1 :Float32; + } +} + +struct MapRenderState { + locationMonoTime @0 :UInt64; + renderTime @1 :Float32; + frameId @2: UInt32; +} + +struct NavModelData { + frameId @0 :UInt32; + locationMonoTime @6 :UInt64; + modelExecutionTime @1 :Float32; + dspExecutionTime @2 :Float32; + features @3 :List(Float32); + # predicted future position + position @4 :XYData; + desirePrediction @5 :List(Float32); + + # All SI units and in device frame + struct XYData { + x @0 :List(Float32); + y @1 :List(Float32); + xStd @2 :List(Float32); + yStd @3 :List(Float32); + } +} + +struct EncodeData { + idx @0 :EncodeIndex; + data @1 :Data; + header @2 :Data; + unixTimestampNanos @3 :UInt64; + width @4 :UInt32; + height @5 :UInt32; +} + +struct DebugAlert { + alertText1 @0 :Text; + alertText2 @1 :Text; +} + +struct UserBookmark @0xfe346a9de48d9b50 { +} + +struct SoundPressure @0xdc24138990726023 { + soundPressure @0 :Float32; + + # uncalibrated, A-weighted + soundPressureWeighted @3 :Float32; + soundPressureWeightedDb @1 :Float32; + + filteredSoundPressureWeightedDbDEPRECATED @2 :Float32; +} + +struct AudioData { + data @0 :Data; + sampleRate @1 :UInt32; +} + +struct AudioFeedback { + audio @0 :AudioData; + blockNum @1 :UInt16; +} + +struct Touch { + sec @0 :Int64; + usec @1 :Int64; + type @2 :UInt8; + code @3 :Int32; + value @4 :Int32; +} + +struct Event { + logMonoTime @0 :UInt64; # nanoseconds + valid @67 :Bool = true; + + union { + # *********** log metadata *********** + initData @1 :InitData; + sentinel @73 :Sentinel; + + # *********** bootlog *********** + boot @60 :Boot; + + # ********** openpilot daemon msgs ********** + gpsNMEA @3 :GPSNMEAData; + can @5 :List(CanData); + controlsState @7 :ControlsState; + selfdriveState @130 :SelfdriveState; + gyroscope @99 :SensorEventData; + accelerometer @98 :SensorEventData; + magnetometer @95 :SensorEventData; + lightSensor @96 :SensorEventData; + temperatureSensor @97 :SensorEventData; + pandaStates @81 :List(PandaState); + peripheralState @80 :PeripheralState; + radarState @13 :RadarState; + radarTracks @131 :Car.RadarData; + sendcan @17 :List(CanData); + extrinsicsCalibration @19 :ExtrinsicsCalibration; + carState @22 :Car.CarState; + carControl @23 :Car.CarControl; + carOutput @127 :Car.CarOutput; + longitudinalPlan @24 :LongitudinalPlan; + lateralManeuverPlan @162 :LateralManeuverPlan; + driverAssistance @132 :DriverAssistance; + ubloxGnss @34 :UbloxGnss; + ubloxRaw @39 :Data; + qcomGnss @31 :QcomGnss; + gpsLocationExternal @48 :GpsLocationData; + gpsLocation @21 :GpsLocationData; + gnssMeasurements @91 :GnssMeasurements; + vehicleParameters @61 :VehicleParameters; + lateralTorqueParameters @94 :LateralTorqueParameters; + lateralDelay @146 : LateralDelay; + cameraOdometry @63 :CameraOdometry; + thumbnail @66: Thumbnail; + onroadEvents @134: List(OnroadEvent); + carParams @69: Car.CarParams; + driverMonitoringState @71: DriverMonitoringState; + deviceMotion @129 :DeviceMotion; + modelV2 @75 :ModelDataV2; + drivingModelData @128 :DrivingModelData; + driverStateV2 @92 :DriverStateV2; + + # camera stuff, each camera state has a matching encode idx + roadCameraState @2 :FrameData; + driverCameraState @70: FrameData; + wideRoadCameraState @74: FrameData; + roadEncodeIdx @15 :EncodeIndex; + driverEncodeIdx @76 :EncodeIndex; + wideRoadEncodeIdx @77 :EncodeIndex; + qRoadEncodeIdx @90 :EncodeIndex; + + livestreamRoadEncodeIdx @117 :EncodeIndex; + livestreamWideRoadEncodeIdx @118 :EncodeIndex; + livestreamDriverEncodeIdx @119 :EncodeIndex; + + # microphone data + soundPressure @103 :SoundPressure; + rawAudioData @147 :AudioData; + webrtcAudioData @152 :AudioData; + + # systems stuff + androidLog @20 :AndroidLogEntry; + managerState @78 :ManagerState; + uploaderState @79 :UploaderState; + procLog @33 :ProcLog; + clocks @35 :Clocks; + deviceState @6 :DeviceState; + logMessage @18 :Text; + errorLogMessage @85 :Text; + + # touch frame + touch @135 :List(Touch); + + # navigation + navInstruction @82 :NavInstruction; + navRoute @83 :NavRoute; + navThumbnail @84: Thumbnail; + mapRenderState @105: MapRenderState; + + # UI services + uiDebug @102 :UIDebug; + + # driving feedback + userBookmark @93 :UserBookmark; + bookmarkButton @148 :UserBookmark; + audioFeedback @149 :AudioFeedback; + + # *********** debug *********** + testJoystick @52 :Joystick; + roadEncodeData @86 :EncodeData; + driverEncodeData @87 :EncodeData; + wideRoadEncodeData @88 :EncodeData; + qRoadEncodeData @89 :EncodeData; + alertDebug @133 :DebugAlert; + + livestreamRoadEncodeData @120 :EncodeData; + livestreamWideRoadEncodeData @121 :EncodeData; + livestreamDriverEncodeData @122 :EncodeData; + + # *********** Custom: reserved for forks *********** + + # DO change the name of the field + # DON'T change anything after the "@" + customReservedRawData0 @124 :Data; + customReservedRawData1 @125 :Data; + customReservedRawData2 @126 :Data; + + # DO change the name of the field and struct + # DON'T change the ID (e.g. @107) + # DON'T change which struct it points to + customReservedState107 @107 :Custom.IQState; + customReservedModelManager108 @108 :Custom.IQModelManager; + customReservedPlan109 @109 :Custom.IQPlan; + customReservedEvents110 @110 :Custom.IQOnroadEvent; + customReservedCarParams111 @111 :Custom.IQCarParams; + customReservedCarControl112 @112 :Custom.IQCarControl; + customReservedBackupManager113 @113 :Custom.IQBackupManager; + customReservedCarState114 @114 :Custom.IQCarState; + customReservedLiveData115 @115 :Custom.IQLiveData; + customReservedDriveModel116 @116 :Custom.IQDriveModelData; + backupManagerK3 @151 :Custom.IQBackupManager; + iqNavState @150 :Custom.IQNavState; + iqState @153 :Custom.IQState; + iqModelManager @154 :Custom.IQModelManager; + iqPlan @155 :Custom.IQPlan; + egpuDockState @166 :EgpuDockState; + iqOnroadEvents @156 :Custom.IQOnroadEvent; + iqCarParams @157 :Custom.IQCarParams; + iqCarControl @158 :Custom.IQCarControl; + iqCarState @159 :Custom.IQCarState; + iqLiveData @160 :Custom.IQLiveData; + iqDriveModelData @161 :Custom.IQDriveModelData; + iqNavRenderState @163 :Custom.IQNavRenderState; + iqLiveLocation @164 :Custom.IQLiveLocation; + iqRoadIncidentFeed @165 :Custom.IQRoadIncidentFeed; + iqPerfTrace @136 :Custom.IQPerfTrace; + iqConstructionZone @137 :Custom.IQConstructionZone; + iqVehicleTracks @138 :Custom.IQVehicleTracks; + iqEnvironment @139 :Custom.IQEnvironment; + customReserved14 @140 :Custom.CustomReserved14; + customReserved15 @141 :Custom.CustomReserved15; + customReserved16 @142 :Custom.CustomReserved16; + mapdExtendedOut @143 :Custom.MapdExtendedOut; + mapdIn @144 :Custom.MapdIn; + mapdOut @145 :Custom.MapdOut; + + # *********** legacy + deprecated *********** + model @9 :Legacy.ModelData; # TODO: rename modelV2 and mark this as deprecated + liveMpcDEPRECATED @36 :LiveMpcData; + liveLongitudinalMpcDEPRECATED @37 :LiveLongitudinalMpcData; + liveLocationKalmanLegacyDEPRECATED @51 :Legacy.LiveLocationData; + orbslamCorrectionDEPRECATED @45 :Legacy.OrbslamCorrection; + liveUIDEPRECATED @14 :Legacy.LiveUI; + sensorEventDEPRECATED @4 :SensorEventData; + liveEventDEPRECATED @8 :List(Legacy.LiveEventData); + liveLocationDEPRECATED @25 :Legacy.LiveLocationData; + ethernetDataDEPRECATED @26 :List(Legacy.EthernetPacket); + cellInfoDEPRECATED @28 :List(Legacy.CellInfo); + wifiScanDEPRECATED @29 :List(Legacy.WifiScan); + uiNavigationEventDEPRECATED @50 :Legacy.UiNavigationEvent; + liveMapDataDEPRECATED @62 :LiveMapDataDEPRECATED; + gpsPlannerPointsDEPRECATED @40 :Legacy.GPSPlannerPoints; + gpsPlannerPlanDEPRECATED @41 :Legacy.GPSPlannerPlan; + applanixRawDEPRECATED @42 :Data; + androidGnssDEPRECATED @30 :Legacy.AndroidGnss; + lidarPtsDEPRECATED @32 :Legacy.LidarPts; + navStatusDEPRECATED @38 :Legacy.NavStatus; + trafficEventsDEPRECATED @43 :List(Legacy.TrafficEvent); + liveLocationTimingDEPRECATED @44 :Legacy.LiveLocationData; + liveLocationCorrectedDEPRECATED @46 :Legacy.LiveLocationData; + navUpdateDEPRECATED @27 :Legacy.NavUpdate; + orbObservationDEPRECATED @47 :List(Legacy.OrbObservation); + locationDEPRECATED @49 :Legacy.LiveLocationData; + orbOdometryDEPRECATED @53 :Legacy.OrbOdometry; + orbFeaturesDEPRECATED @54 :Legacy.OrbFeatures; + applanixLocationDEPRECATED @55 :Legacy.LiveLocationData; + orbKeyFrameDEPRECATED @56 :Legacy.OrbKeyFrame; + orbFeaturesSummaryDEPRECATED @58 :Legacy.OrbFeaturesSummary; + featuresDEPRECATED @10 :Legacy.CalibrationFeatures; + kalmanOdometryDEPRECATED @65 :Legacy.KalmanOdometry; + uiLayoutStateDEPRECATED @57 :Legacy.UiLayoutState; + pandaStateDEPRECATED @12 :PandaState; + driverStateDEPRECATED @59 :DriverStateDEPRECATED; + sensorEventsDEPRECATED @11 :List(SensorEventData); + lateralPlanDEPRECATED @64 :LateralPlan; + navModelDEPRECATED @104 :NavModelData; + uiPlanDEPRECATED @106 :UiPlan; + liveLocationKalman @72 :LiveLocationKalman; + liveTracksDEPRECATED @16 :List(LiveTracksDEPRECATED); + onroadEventsDEPRECATED @68: List(Car.OnroadEventDEPRECATED); + gyroscope2DEPRECATED @100 :SensorEventData; + accelerometer2DEPRECATED @101 :SensorEventData; + temperatureSensor2DEPRECATED @123 :SensorEventData; + } +} diff --git a/iqpilot/cereal/messaging/__init__.py b/iqpilot/cereal/messaging/__init__.py new file mode 100644 index 000000000..4bef22314 --- /dev/null +++ b/iqpilot/cereal/messaging/__init__.py @@ -0,0 +1,269 @@ +# must be built with scons +from msgq import fake_event_handle, drain_sock_raw, MultiplePublishersError, IpcError, \ + Context, Poller, SubSocket, PubSocket, SocketEventHandle, toggle_fake_events, \ + set_fake_prefix, get_fake_prefix, delete_fake_prefix, wait_for_one_event +import msgq +import os +import capnp +import time + +from typing import Optional, List, Union, Dict + +from iqpilot.cereal import log +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.utils import MovingAverage + +NO_TRAVERSAL_LIMIT = 2**64-1 + + +def pub_sock(endpoint: str) -> PubSocket: + service = SERVICE_LIST.get(endpoint) + segment_size = service.queue_size if service else 0 + return msgq.pub_sock(endpoint, segment_size) + + +def sub_sock(endpoint: str, poller: Optional[Poller] = None, addr: str = "127.0.0.1", + conflate: bool = False, timeout: Optional[int] = None) -> SubSocket: + service = SERVICE_LIST.get(endpoint) + segment_size = service.queue_size if service else 0 + return msgq.sub_sock(endpoint, poller=poller, addr=addr, conflate=conflate, + timeout=timeout, segment_size=segment_size) + + +def reset_context(): + msgq.context = Context() + + +def log_from_bytes(dat: bytes, struct: capnp.lib.capnp._StructModule = log.Event) -> capnp.lib.capnp._DynamicStructReader: + with struct.from_bytes(dat, traversal_limit_in_words=NO_TRAVERSAL_LIMIT) as msg: + return msg + + +def new_message(service: Optional[str], size: Optional[int] = None, **kwargs) -> capnp.lib.capnp._DynamicStructBuilder: + args = { + 'valid': False, + 'logMonoTime': int(time.monotonic() * 1e9), + **kwargs + } + dat = log.Event.new_message(**args) + if service is not None: + if size is None: + dat.init(service) + else: + dat.init(service, size) + return dat + + +def drain_sock(sock: SubSocket, wait_for_one: bool = False) -> List[capnp.lib.capnp._DynamicStructReader]: + """Receive all message currently available on the queue""" + msgs = drain_sock_raw(sock, wait_for_one=wait_for_one) + return [log_from_bytes(m) for m in msgs] + + +# TODO: print when we drop packets? +def recv_sock(sock: SubSocket, wait: bool = False) -> Optional[capnp.lib.capnp._DynamicStructReader]: + """Same as drain sock, but only returns latest message. Consider using conflate instead.""" + dat = None + + while 1: + if wait and dat is None: + recv = sock.receive() + else: + recv = sock.receive(non_blocking=True) + + if recv is None: # Timeout hit + break + + dat = recv + + if dat is not None: + dat = log_from_bytes(dat) + + return dat + + +def recv_one(sock: SubSocket) -> Optional[capnp.lib.capnp._DynamicStructReader]: + dat = sock.receive() + if dat is not None: + dat = log_from_bytes(dat) + return dat + + +def recv_one_or_none(sock: SubSocket) -> Optional[capnp.lib.capnp._DynamicStructReader]: + dat = sock.receive(non_blocking=True) + if dat is not None: + dat = log_from_bytes(dat) + return dat + + +def recv_one_retry(sock: SubSocket) -> capnp.lib.capnp._DynamicStructReader: + """Keep receiving until we get a message""" + while True: + dat = sock.receive() + if dat is not None: + return log_from_bytes(dat) + + +class FrequencyTracker: + def __init__(self, service_freq: float, update_freq: float, is_poll: bool): + freq = max(min(service_freq, update_freq), 1.) + if is_poll: + min_freq = max_freq = freq + else: + max_freq = min(freq, update_freq) + if service_freq >= 2 * update_freq: + min_freq = update_freq + elif update_freq >= 2* service_freq: + min_freq = freq + else: + min_freq = min(freq, freq / 2.) + + self.min_freq = min_freq * 0.8 + self.max_freq = max_freq * 1.2 + self.avg_dt = MovingAverage(int(10 * freq)) + self.recent_avg_dt = MovingAverage(int(freq)) + self.prev_time = 0.0 + + def record_recv_time(self, cur_time: float) -> None: + # TODO: Handle case where cur_time is less than prev_time + if self.prev_time > 1e-5: + dt = cur_time - self.prev_time + + self.avg_dt.add_value(dt) + self.recent_avg_dt.add_value(dt) + + self.prev_time = cur_time + + @property + def valid(self) -> bool: + if self.avg_dt.count == 0: + return False + + avg_freq = 1.0 / self.avg_dt.get_average() + if self.min_freq <= avg_freq <= self.max_freq: + return True + + avg_freq_recent = 1.0 / self.recent_avg_dt.get_average() + return self.min_freq <= avg_freq_recent <= self.max_freq + + +class SubMaster: + def __init__(self, services: List[str], poll: Optional[str] = None, + ignore_alive: Optional[List[str]] = None, ignore_avg_freq: Optional[List[str]] = None, + ignore_valid: Optional[List[str]] = None, addr: str = "127.0.0.1", frequency: Optional[float] = None): + self.frame = -1 + self.services = services + self.seen = {s: False for s in services} + self.updated = {s: False for s in services} + self.recv_time = {s: 0. for s in services} + self.recv_frame = {s: 0 for s in services} + self.sock = {} + self.data = {} + self.logMonoTime = {s: 0 for s in services} + + # zero-frequency / on-demand services are always alive and presumed valid; all others must pass checks + on_demand = {s: SERVICE_LIST[s].frequency <= 1e-5 for s in services} + self.static_freq_services = set(s for s in services if not on_demand[s]) + self.alive = {s: on_demand[s] for s in services} + self.freq_ok = {s: on_demand[s] for s in services} + self.valid = {s: on_demand[s] for s in services} + + self.freq_tracker: Dict[str, FrequencyTracker] = {} + self.poller = Poller() + polled_services = set([poll, ] if poll is not None else services) + self.non_polled_services = set(services) - polled_services + + self.ignore_average_freq = [] if ignore_avg_freq is None else ignore_avg_freq + self.ignore_alive = [] if ignore_alive is None else ignore_alive + self.ignore_valid = [] if ignore_valid is None else ignore_valid + + self.simulation = bool(int(os.getenv("SIMULATION", "0"))) + + # if freq and poll aren't specified, assume the max to be conservative + assert frequency is None or poll is None, "Do not specify 'frequency' - frequency of the polled service will be used." + self.update_freq = frequency or max([SERVICE_LIST[s].frequency for s in polled_services]) + + for s in services: + p = self.poller if s not in self.non_polled_services else None + self.sock[s] = sub_sock(s, poller=p, addr=addr, conflate=True) + + try: + data = new_message(s) + except capnp.lib.capnp.KjException: + data = new_message(s, 0) # lists + + self.data[s] = getattr(data.as_reader(), s) + self.freq_tracker[s] = FrequencyTracker(SERVICE_LIST[s].frequency, self.update_freq, s == poll) + + def __getitem__(self, s: str) -> capnp.lib.capnp._DynamicStructReader: + return self.data[s] + + def _check_avg_freq(self, s: str) -> bool: + return SERVICE_LIST[s].frequency > 0.99 and (s not in self.ignore_average_freq) and (s not in self.ignore_alive) + + def update(self, timeout: int = 100) -> None: + msgs = [] + for sock in self.poller.poll(timeout): + msgs.append(recv_one_or_none(sock)) + + # non-blocking receive for non-polled sockets + for s in self.non_polled_services: + msgs.append(recv_one_or_none(self.sock[s])) + self.update_msgs(time.monotonic(), msgs) + + def update_msgs(self, cur_time: float, msgs: List[capnp.lib.capnp._DynamicStructReader]) -> None: + self.frame += 1 + self.updated = dict.fromkeys(self.services, False) + for msg in msgs: + if msg is None: + continue + + s = msg.which() + self.seen[s] = True + self.updated[s] = True + + self.freq_tracker[s].record_recv_time(cur_time) + self.recv_time[s] = cur_time + self.recv_frame[s] = self.frame + self.data[s] = getattr(msg, s) + self.logMonoTime[s] = msg.logMonoTime + self.valid[s] = msg.valid + + for s in self.static_freq_services: + # alive if delay is within 10x the expected frequency; checks relaxed in simulator + self.alive[s] = (cur_time - self.recv_time[s]) < (10. / SERVICE_LIST[s].frequency) or (self.seen[s] and self.simulation) + self.freq_ok[s] = self.freq_tracker[s].valid or self.simulation + + def all_alive(self, service_list: Optional[List[str]] = None) -> bool: + return all(self.alive[s] for s in (service_list or self.services) if s not in self.ignore_alive) + + def all_freq_ok(self, service_list: Optional[List[str]] = None) -> bool: + return all(self.freq_ok[s] for s in (service_list or self.services) if self._check_avg_freq(s)) + + def all_valid(self, service_list: Optional[List[str]] = None) -> bool: + return all(self.valid[s] for s in (service_list or self.services) if s not in self.ignore_valid) + + def all_checks(self, service_list: Optional[List[str]] = None) -> bool: + return self.all_alive(service_list) and self.all_freq_ok(service_list) and self.all_valid(service_list) + + +class PubMaster: + def __init__(self, services: List[str]): + self.sock = {} + for s in services: + self.sock[s] = pub_sock(s) + + def send(self, s: str, dat: Union[bytes, capnp.lib.capnp._DynamicStructBuilder]) -> None: + if not isinstance(dat, bytes): + dat = dat.to_bytes() + self.sock[s].send(dat) + + def wait_for_readers_to_update(self, s: str, timeout: int, dt: float = 0.05) -> bool: + for _ in range(int(timeout*(1./dt))): + if self.sock[s].all_readers_updated(): + return True + time.sleep(dt) + return False + + def all_readers_updated(self, s: str) -> bool: + return self.sock[s].all_readers_updated() # type: ignore diff --git a/iqpilot/cereal/messaging/bridge b/iqpilot/cereal/messaging/bridge new file mode 100755 index 000000000..65c782268 Binary files /dev/null and b/iqpilot/cereal/messaging/bridge differ diff --git a/iqpilot/cereal/messaging/tests/__init__.py b/iqpilot/cereal/messaging/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/cereal/messaging/tests/test_messaging.py b/iqpilot/cereal/messaging/tests/test_messaging.py new file mode 100644 index 000000000..d39bbc497 --- /dev/null +++ b/iqpilot/cereal/messaging/tests/test_messaging.py @@ -0,0 +1,186 @@ +import os +import capnp +import numbers +import random +import threading +import time +from parameterized import parameterized + +from iqpilot.cereal import log, car +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST + +events = [evt for evt in log.Event.schema.union_fields if evt in SERVICE_LIST.keys()] + +def random_sock(): + return random.choice(events) + +def random_socks(num_socks=10): + return list({random_sock() for _ in range(num_socks)}) + +def random_bytes(length=1000): + return bytes([random.randrange(0xFF) for _ in range(length)]) + +def zmq_sleep(t=1): + if "ZMQ" in os.environ: + time.sleep(t) + + +# TODO: this should take any capnp struct and returrn a msg with random populated data +def random_carstate(): + fields = ["vEgo", "aEgo", "brake", "steeringAngleDeg"] + msg = messaging.new_message("carState") + cs = msg.carState + for f in fields: + setattr(cs, f, random.random() * 10) + return msg + +# TODO: this should compare any capnp structs +def assert_carstate(cs1, cs2): + for f in car.CarState.schema.non_union_fields: + # TODO: check all types + val1, val2 = getattr(cs1, f), getattr(cs2, f) + if isinstance(val1, numbers.Number): + assert val1 == val2, f"{f}: sent '{val1}' vs recvd '{val2}'" + +def delayed_send(delay, sock, dat): + def send_func(): + sock.send(dat) + threading.Timer(delay, send_func).start() + + +class TestMessaging: + def setUp(self): + # TODO: ZMQ tests are too slow; all sleeps will need to be + # replaced with logic to block on the necessary condition + assert "ZMQ" not in os.environ + + # ZMQ pub socket takes too long to die + # sleep to prevent multiple publishers error between tests + zmq_sleep() + + @parameterized.expand(events) + def test_new_message(self, evt): + try: + msg = messaging.new_message(evt) + except capnp.lib.capnp.KjException: + msg = messaging.new_message(evt, random.randrange(200)) + assert (time.monotonic() - msg.logMonoTime) < 0.1 + assert not msg.valid + assert evt == msg.which() + + @parameterized.expand(events) + def test_pub_sock(self, evt): + messaging.pub_sock(evt) + + @parameterized.expand(events) + def test_sub_sock(self, evt): + messaging.sub_sock(evt) + + @parameterized.expand([ + (messaging.drain_sock, capnp._DynamicStructReader), + (messaging.drain_sock_raw, bytes), + ]) + def test_drain_sock(self, func, expected_type): + sock = "carState" + pub_sock = messaging.pub_sock(sock) + sub_sock = messaging.sub_sock(sock, timeout=1000) + zmq_sleep() + + # no wait and no msgs in queue + msgs = func(sub_sock) + assert isinstance(msgs, list) + assert len(msgs) == 0 + + # no wait but msgs are queued up + num_msgs = random.randrange(3, 10) + for _ in range(num_msgs): + pub_sock.send(messaging.new_message(sock).to_bytes()) + time.sleep(0.1) + msgs = func(sub_sock) + assert isinstance(msgs, list) + assert all(isinstance(msg, expected_type) for msg in msgs) + assert len(msgs) == num_msgs + + def test_recv_sock(self): + sock = "carState" + pub_sock = messaging.pub_sock(sock) + sub_sock = messaging.sub_sock(sock, timeout=100) + zmq_sleep() + + # no wait and no msg in queue, socket should timeout + recvd = messaging.recv_sock(sub_sock) + assert recvd is None + + # no wait and one msg in queue + msg = random_carstate() + pub_sock.send(msg.to_bytes()) + time.sleep(0.01) + recvd = messaging.recv_sock(sub_sock) + assert isinstance(recvd, capnp._DynamicStructReader) + # https://github.com/python/mypy/issues/13038 + assert_carstate(msg.carState, recvd.carState) + + def test_recv_one(self): + sock = "carState" + pub_sock = messaging.pub_sock(sock) + sub_sock = messaging.sub_sock(sock, timeout=1000) + zmq_sleep() + + # no msg in queue, socket should timeout + recvd = messaging.recv_one(sub_sock) + assert recvd is None + + # one msg in queue + msg = random_carstate() + pub_sock.send(msg.to_bytes()) + recvd = messaging.recv_one(sub_sock) + assert isinstance(recvd, capnp._DynamicStructReader) + assert_carstate(msg.carState, recvd.carState) + + def test_recv_one_or_none(self): + sock = "carState" + pub_sock = messaging.pub_sock(sock) + sub_sock = messaging.sub_sock(sock) + zmq_sleep() + + # no msg in queue, socket shouldn't block + recvd = messaging.recv_one_or_none(sub_sock) + assert recvd is None + + # one msg in queue + msg = random_carstate() + pub_sock.send(msg.to_bytes()) + recvd = messaging.recv_one_or_none(sub_sock) + assert isinstance(recvd, capnp._DynamicStructReader) + assert_carstate(msg.carState, recvd.carState) + + def test_recv_one_retry(self): + sock = "carState" + sock_timeout = 0.1 + pub_sock = messaging.pub_sock(sock) + sub_sock = messaging.sub_sock(sock, timeout=round(sock_timeout*1000)) + zmq_sleep() + + # this test doesn't work with ZMQ since multiprocessing interrupts it + if "ZMQ" not in os.environ: + # wait 5 socket timeouts and make sure it's still retrying + result = [] + thread = threading.Thread(target=lambda: result.append(messaging.recv_one_retry(sub_sock))) + thread.start() + time.sleep(sock_timeout*5) + assert thread.is_alive() + msg = random_carstate() + pub_sock.send(msg.to_bytes()) + thread.join(timeout=1) + assert not thread.is_alive() + assert_carstate(msg.carState, result[0].carState) + + # wait 5 socket timeouts before sending + msg = random_carstate() + start_time = time.monotonic() + delayed_send(sock_timeout*5, pub_sock, msg.to_bytes()) + recvd = messaging.recv_one_retry(sub_sock) + assert (time.monotonic() - start_time) >= sock_timeout*5 + assert isinstance(recvd, capnp._DynamicStructReader) + assert_carstate(msg.carState, recvd.carState) diff --git a/iqpilot/cereal/messaging/tests/test_pub_sub_master.py b/iqpilot/cereal/messaging/tests/test_pub_sub_master.py new file mode 100644 index 000000000..cad69f858 --- /dev/null +++ b/iqpilot/cereal/messaging/tests/test_pub_sub_master.py @@ -0,0 +1,161 @@ +import random +import time +from typing import Sized, cast + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.messaging.tests.test_messaging import events, random_sock, random_socks, \ + random_bytes, random_carstate, assert_carstate, \ + zmq_sleep +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.timeout import Timeout + + +class TestSubMaster: + + def setup_method(self): + # ZMQ pub socket takes too long to die + # sleep to prevent multiple publishers error between tests + zmq_sleep(3) + + def test_init(self): + sm = messaging.SubMaster(events) + for p in [sm.updated, sm.recv_time, sm.recv_frame, sm.alive, + sm.sock, sm.data, sm.logMonoTime, sm.valid]: + assert len(cast(Sized, p)) == len(events) + + def test_init_state(self): + socks = random_socks() + sm = messaging.SubMaster(socks) + assert sm.frame == -1 + assert not any(sm.updated.values()) + assert not any(sm.seen.values()) + on_demand = {s: SERVICE_LIST[s].frequency <= 1e-5 for s in sm.services} + assert all(sm.alive[s] == sm.valid[s] == sm.freq_ok[s] == on_demand[s] for s in sm.services) + assert all(t == 0. for t in sm.recv_time.values()) + assert all(f == 0 for f in sm.recv_frame.values()) + assert all(t == 0 for t in sm.logMonoTime.values()) + + for p in [sm.updated, sm.recv_time, sm.recv_frame, sm.alive, + sm.sock, sm.data, sm.logMonoTime, sm.valid]: + assert len(cast(Sized, p)) == len(socks) + + def test_getitem(self): + sock = "carState" + pub_sock = messaging.pub_sock(sock) + sm = messaging.SubMaster([sock,]) + zmq_sleep() + + msg = random_carstate() + pub_sock.send(msg.to_bytes()) + sm.update(1000) + assert_carstate(msg.carState, sm[sock]) + + # TODO: break this test up to individually test SubMaster.update and SubMaster.update_msgs + def test_update(self): + sock = "carState" + pub_sock = messaging.pub_sock(sock) + sm = messaging.SubMaster([sock,]) + zmq_sleep() + + for i in range(10): + msg = messaging.new_message(sock) + pub_sock.send(msg.to_bytes()) + sm.update(1000) + assert sm.frame == i + assert all(sm.updated.values()) + + def test_update_timeout(self): + sock = random_sock() + sm = messaging.SubMaster([sock,]) + timeout = 100 + start_time = time.monotonic() + with Timeout(2): + sm.update(timeout) + t = time.monotonic() - start_time + assert t >= timeout/1000. + assert not any(sm.updated.values()) + + def test_avg_frequency_checks(self): + for poll in (True, False): + sm = messaging.SubMaster(["modelV2", "carParams", "carState", "cameraOdometry", "extrinsicsCalibration"], + poll=("modelV2" if poll else None), + frequency=(20. if not poll else None)) + + checks = { + "carState": (20, 20), + "modelV2": (20, 20 if poll else 10), + "cameraOdometry": (20, 10), + "extrinsicsCalibration": (4, 4), + "carParams": (None, None), + "userBookmark": (None, None), + } + + for service, (max_freq, min_freq) in checks.items(): + if max_freq is not None: + assert sm._check_avg_freq(service) + assert sm.freq_tracker[service].max_freq == max_freq*1.2 + assert sm.freq_tracker[service].min_freq == min_freq*0.8 + else: + assert not sm._check_avg_freq(service) + + def test_alive(self): + pass + + def test_ignore_alive(self): + pass + + def test_valid(self): + pass + + # SubMaster should always conflate + def test_conflate(self): + sock = "carState" + pub_sock = messaging.pub_sock(sock) + sm = messaging.SubMaster([sock,]) + + n = 10 + for i in range(n+1): + msg = messaging.new_message(sock) + msg.carState.vEgo = i + pub_sock.send(msg.to_bytes()) + time.sleep(0.01) + sm.update(1000) + assert sm[sock].vEgo == n + + +class TestPubMaster: + + def setup_method(self): + # ZMQ pub socket takes too long to die + # sleep to prevent multiple publishers error between tests + zmq_sleep(3) + + def test_init(self): + messaging.PubMaster(events) + + def test_send(self): + socks = random_socks() + pm = messaging.PubMaster(socks) + sub_socks = {s: messaging.sub_sock(s, conflate=True, timeout=1000) for s in socks} + zmq_sleep() + + # PubMaster accepts either a capnp msg builder or bytes + for capnp in [True, False]: + for i in range(100): + sock = socks[i % len(socks)] + + if capnp: + try: + msg = messaging.new_message(sock) + except Exception: + msg = messaging.new_message(sock, random.randrange(50)) + else: + msg = random_bytes() + + pm.send(sock, msg) + recvd = sub_socks[sock].receive() + + if capnp: + msg.clear_write_flag() + msg = msg.to_bytes() + assert msg == recvd, i diff --git a/iqpilot/cereal/messaging/tests/test_services.py b/iqpilot/cereal/messaging/tests/test_services.py new file mode 100644 index 000000000..14f80f392 --- /dev/null +++ b/iqpilot/cereal/messaging/tests/test_services.py @@ -0,0 +1,27 @@ +import os +import tempfile +from typing import Dict +from parameterized import parameterized + +from iqpilot.cereal import log +import iqpilot.cereal.services as services +from iqpilot.cereal.services import SERVICE_LIST + + +class TestServices: + + @parameterized.expand(SERVICE_LIST.keys()) + def test_services(self, s): + service = SERVICE_LIST[s] + assert service.frequency <= 104 + assert service.decimation != 0 + + def test_generated_header(self): + with tempfile.NamedTemporaryFile(suffix=".h") as f: + ret = os.system(f"python3 {services.__file__} > {f.name} && clang++ {f.name} -std=c++11") + assert ret == 0, "generated services header is not valid C" + + def test_all_services_exist_in_log_union(self): + event_fields = set(log.Event.schema.union_fields) + missing = sorted(s for s in SERVICE_LIST if s not in event_fields) + assert not missing, f"services missing from log.capnp Event union: {missing}" diff --git a/iqpilot/cereal/messaging/tests/validate_sp_cereal_upstream.py b/iqpilot/cereal/messaging/tests/validate_sp_cereal_upstream.py new file mode 100755 index 000000000..d5227707c --- /dev/null +++ b/iqpilot/cereal/messaging/tests/validate_sp_cereal_upstream.py @@ -0,0 +1,222 @@ +#!/usr/bin/env python3 +import argparse +import sys +from typing import Any, List, Tuple + +DEBUG = False + + +def print_debug(string: str) -> None: + if DEBUG: + print(string) + + +def create_schema_instance(struct: Any, prop: Tuple[str, Any]) -> Any: + """ + Create a new instance of a schema type, handling different field types. + + Args: + struct: The Cap'n Proto schema structure + prop: A tuple containing the field name and field metadata + + Returns: + A new initialized schema instance + """ + struct_instance = struct.new_message() + field_name, field_metadata = prop + + try: + field_type = field_metadata.proto.slot.type.which() + + # Initialize different types of fields + if field_type in ('list', 'text', 'data'): + struct_instance.init(field_name, 1) + print_debug(f"Initialized list/text/data field: {field_name}") + elif field_type in ('struct', 'object'): + struct_instance.init(field_name) + print_debug(f"Initialized struct/object field: {field_name}") + + return struct_instance + + except Exception as e: + print(f"Error creating instance for {field_name}: {e}") + return None + + +def get_schema_fields(schema_struct: Any) -> List[Tuple[str, Any]]: + """ + Retrieve all fields from a given schema structure. + + Args: + schema_struct: The Cap'n Proto schema structure + + Returns: + A list of field names and their metadata + """ + try: + # Get all fields from the schema + schema_fields = list(schema_struct.schema.fields.items()) + + print_debug("Discovered schema fields:") + for field_name, field_metadata in schema_fields: + print_debug(f"- {field_name}") + + return schema_fields + + except Exception as e: + print(f"Error retrieving schema fields: {e}") + return [] + + +def generate_schema_instances(schema_struct: Any) -> List[Any]: + """ + Generate instances for all fields in a given schema. + + Args: + schema_struct: The Cap'n Proto schema structure + + Returns: + A list of schema instances + """ + schema_fields = get_schema_fields(schema_struct) + instances = [] + + for field_prop in schema_fields: + try: + instance = create_schema_instance(schema_struct, field_prop) + if instance is not None: + instances.append(instance) + except Exception as e: + print(f"Skipping field due to error: {e}") + + print(f"Generated {len(instances)} schema instances") + return instances + + +def persist_instances(instances: List[Any], filename: str) -> None: + """ + Write schema instances to a binary file. + + Args: + instances: List of schema instances + filename: Output file path + """ + try: + with open(filename, 'wb') as f: + for instance in instances: + f.write(instance.to_bytes()) + + print(f"Successfully wrote {len(instances)} instances to {filename}") + + except Exception as e: + print(f"Error persisting instances: {e}") + sys.exit(1) + + +def read_instances(filename: str, schema_type: Any) -> List[Any]: + """ + Read schema instances from a binary file. + + Args: + filename: Input file path + schema_type: The schema type to use for reading + + Returns: + A list of read schema instances + """ + try: + with open(filename, 'rb') as f: + data = f.read() + + instances = list(schema_type.read_multiple_bytes(data)) + + print(f"Read {len(instances)} instances from {filename}") + return instances + + except Exception as e: + print(f"Error reading instances: {e}") + sys.exit(1) + + +def compare_schemas(original_instances: List[Any], read_instances: List[Any]) -> bool: + """ + Compare original and read-back instances to detect potential breaking changes. + + Args: + original_instances: List of originally generated instances + read_instances: List of instances read back from file + + Returns: + Boolean indicating whether schemas appear compatible + """ + if len(original_instances) != len(read_instances): + print("❌ Schema Compatibility Warning: Instance count mismatch") + return False + + compatible = True + for struct in read_instances: + try: + getattr(struct, struct.which()) # Attempting to access the field to validate readability + except Exception as e: + print(f"❌ Structural change detected: {struct.which()} is not readable.\nFull error: {e}") + compatible = False + + return compatible + + +def main(): + """ + CLI entry point for schema compatibility testing. + """ + # Setup argument parser + parser = argparse.ArgumentParser( + description='Cap\'n Proto Schema Compatibility Testing Tool', + epilog='Test schema compatibility by generating and reading back instances.' + ) + + # Add mutually exclusive group for generation or reading mode + mode_group = parser.add_mutually_exclusive_group(required=True) + mode_group.add_argument('-g', '--generate', action='store_true', + help='Generate schema instances') + mode_group.add_argument('-r', '--read', action='store_true', + help='Read and validate schema instances') + + # Common arguments + parser.add_argument('-f', '--file', + default='schema_instances.bin', + help='Output/input binary file (default: schema_instances.bin)') + + # Parse arguments + args = parser.parse_args() + + # Import the schema dynamically + try: + from iqpilot.cereal import log + schema_type = log.Event + except ImportError: + print("Error: Unable to import schema. Ensure 'cereal' is installed.") + sys.exit(1) + + # Execute based on mode + if args.generate: + print("🔧 Generating Schema Instances") + instances = generate_schema_instances(schema_type) + persist_instances(instances, args.file) + print("✅ Instance generation complete") + + elif args.read: + print("🔍 Reading and Validating Schema Instances") + generated_instances = generate_schema_instances(schema_type) + read_back_instances = read_instances(args.file, schema_type) + + # Compare schemas + if compare_schemas(generated_instances, read_back_instances): + print("✅ Schema Compatibility: No breaking changes detected") + sys.exit(0) + else: + print("❌ Potential Schema Breaking Changes Detected") + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/cereal/services.py b/iqpilot/cereal/services.py new file mode 100755 index 000000000..4bca8a3e4 --- /dev/null +++ b/iqpilot/cereal/services.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +from enum import IntEnum +from typing import Optional + + +# TODO: this should be automatically determined using the capnp schema +class QueueSize(IntEnum): + BIG = 10 * 1024 * 1024 # 10MB - video frames, large AI outputs + MEDIUM = 2 * 1024 * 1024 # 2MB - high freq (CAN), livestream + SMALL = 250 * 1024 # 250KB - most services + + +class Service: + def __init__(self, should_log: bool, frequency: float, decimation: Optional[int] = None, + queue_size: QueueSize = QueueSize.SMALL): + self.should_log = should_log + self.frequency = frequency + self.decimation = decimation + self.queue_size = queue_size + + +_services: dict[str, tuple] = { + # service: (should_log, frequency, qlog decimation (optional)) + # note: the "EncodeIdx" packets will still be in the log + "gyroscope": (True, 104., 104), + "accelerometer": (True, 104., 104), + "magnetometer": (True, 25.), + "lightSensor": (True, 100., 100), + "temperatureSensor": (True, 2., 200), + "gpsNMEA": (True, 9.), + "deviceState": (True, 2., 1), + "touch": (True, 20., 1), + "can": (True, 100., 2053, QueueSize.BIG), # decimation gives ~3 msgs in a full segment + "controlsState": (True, 100., 10, QueueSize.MEDIUM), + "selfdriveState": (True, 100., 10), + "pandaStates": (True, 10., 1), + "peripheralState": (True, 2., 1), + "radarState": (True, 20., 5), + "roadEncodeIdx": (False, 20., 1), + "radarTracks": (True, 20.), + "sendcan": (True, 100., 139, QueueSize.MEDIUM), + "logMessage": (True, 0., None, QueueSize.MEDIUM), + "errorLogMessage": (True, 0., 1, QueueSize.MEDIUM), + "extrinsicsCalibration": (True, 4., 4), + "lateralTorqueParameters": (True, 4., 1), + "lateralDelay": (True, 4., 1), + "androidLog": (True, 0.), + "carState": (True, 100., 10), + "carControl": (True, 100., 10), + "carOutput": (True, 100., 10), + "longitudinalPlan": (True, 20., 10), + "lateralManeuverPlan": (True, 20.), + "driverAssistance": (True, 20., 20), + "procLog": (True, 0.5, 15, QueueSize.MEDIUM), + "gpsLocationExternal": (True, 10., 10), + "gpsLocation": (True, 1., 1), + "ubloxGnss": (True, 10.), + "qcomGnss": (True, 2.), + "gnssMeasurements": (True, 10., 10), + "clocks": (True, 0.1, 1), + "ubloxRaw": (True, 20.), + "deviceMotion": (True, 20., 4), + "vehicleParameters": (True, 20., 5), + "cameraOdometry": (True, 20., 10), + "thumbnail": (True, 1 / 60., 1), + "onroadEvents": (True, 1., 1), + "carParams": (True, 0.02, 1), + "roadCameraState": (True, 20., 20), + "driverCameraState": (True, 20., 20), + "driverEncodeIdx": (False, 20., 1), + "driverStateV2": (True, 20., 10), + "driverMonitoringState": (True, 20., 10), + "wideRoadEncodeIdx": (False, 20., 1), + "wideRoadCameraState": (True, 20., 20), + "drivingModelData": (True, 20., 10), + "modelV2": (True, 20., None, QueueSize.MEDIUM), + "managerState": (True, 2., 1), + "uploaderState": (True, 0., 1), + "navInstruction": (True, 1., 10), + "navRoute": (True, 0.), + "navThumbnail": (True, 0.), + "qRoadEncodeIdx": (False, 20.), + "userBookmark": (True, 0., 1), + "soundPressure": (True, 10., 10), + "rawAudioData": (False, 20.), + "webrtcAudioData": (False, 50.), + "bookmarkButton": (True, 0., 1), + "audioFeedback": (True, 0., 1), + "roadEncodeData": (False, 20., None, QueueSize.BIG), + "driverEncodeData": (False, 20., None, QueueSize.BIG), + "wideRoadEncodeData": (False, 20., None, QueueSize.BIG), + "qRoadEncodeData": (False, 20., None, QueueSize.BIG), + + # iqpilot + "iqModelManager": (False, 1., 1, QueueSize.MEDIUM), + "backupManagerK3": (False, 1., 1), + "iqCarParams": (True, 0.02, 1), + "iqCarControl": (True, 100., 10), + "iqCarState": (True, 100., 10), + "iqLiveData": (True, 1., 1), + "iqConstructionZone": (True, 2., 2), + "iqVehicleTracks": (True, 4., 4), + "iqEnvironment": (True, 4., 4), + "mapdOut": (True, 20., 20, QueueSize.MEDIUM), + "mapdExtendedOut": (False, 1., -1, QueueSize.MEDIUM), + "mapdIn": (False, 1., -1, QueueSize.MEDIUM), + "iqNavState": (True, 5., 10), + "iqRoadIncidentFeed": (True, 0.2, 1), + "iqNavRenderState": (True, 5., 10, QueueSize.MEDIUM), + "iqState": (True, 100., 10), + "egpuDockState": (True, 10., 10), + "iqPlan": (True, 20., 10), + "iqOnroadEvents": (True, 1., 1), + "iqDriveModelData": (True, 20., None, QueueSize.MEDIUM), + "iqLiveLocation": (True, 20.), + "liveLocationKalman": (True, 20.), + "iqPerfTrace": (True, 0., 1, QueueSize.SMALL), + + # debug + "uiDebug": (True, 0., 1), + "testJoystick": (True, 0.), + "alertDebug": (True, 20., 5), + "livestreamWideRoadEncodeIdx": (False, 20.), + "livestreamRoadEncodeIdx": (False, 20.), + "livestreamDriverEncodeIdx": (False, 20.), + "livestreamWideRoadEncodeData": (False, 20., None, QueueSize.MEDIUM), + "livestreamRoadEncodeData": (False, 20., None, QueueSize.MEDIUM), + "livestreamDriverEncodeData": (False, 20., None, QueueSize.MEDIUM), + "customReservedRawData0": (True, 0.), + "customReservedRawData1": (True, 0.), + "customReservedRawData2": (True, 0.), +} +SERVICE_LIST = {name: Service(*vals) for + idx, (name, vals) in enumerate(_services.items())} + + +def build_header(): + h = "" + h += "/* THIS IS AN AUTOGENERATED FILE, PLEASE EDIT services.py */\n" + h += "#ifndef __SERVICES_H\n" + h += "#define __SERVICES_H\n" + + h += "#include \n" + h += "#include \n" + + h += "struct service { std::string name; bool should_log; float frequency; int decimation; size_t queue_size; };\n" + h += "static std::map services = {\n" + for k, v in SERVICE_LIST.items(): + should_log = "true" if v.should_log else "false" + decimation = -1 if v.decimation is None else v.decimation + h += ' { "%s", {"%s", %s, %f, %d, %d}},\n' % \ + (k, k, should_log, v.frequency, decimation, v.queue_size) + h += "};\n" + + h += "#endif\n" + return h + + +if __name__ == "__main__": + print(build_header()) diff --git a/iqpilot/cereal/visionipc.py b/iqpilot/cereal/visionipc.py new file mode 100644 index 000000000..d3c842e58 --- /dev/null +++ b/iqpilot/cereal/visionipc.py @@ -0,0 +1,8 @@ +from enum import IntEnum + + +class VisionStreamType(IntEnum): + VISION_STREAM_ROAD = 0 + VISION_STREAM_DRIVER = 1 + VISION_STREAM_WIDE_ROAD = 2 + VISION_STREAM_MAP = 3 diff --git a/iqpilot/common/.gitignore b/iqpilot/common/.gitignore new file mode 100644 index 000000000..ce1da4c53 --- /dev/null +++ b/iqpilot/common/.gitignore @@ -0,0 +1 @@ +*.cpp diff --git a/iqpilot/common/__init__.py b/iqpilot/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/common/api/__init__.py b/iqpilot/common/api/__init__.py new file mode 100644 index 000000000..7c7b26fc2 --- /dev/null +++ b/iqpilot/common/api/__init__.py @@ -0,0 +1,26 @@ +import iqpilot.common.api.comma_connect + + +class Api: + def __init__(self, dongle_id): + self.service = iqpilot.common.api.comma_connect.CommaConnectApi(dongle_id) + + def request(self, method, endpoint, **params): + return self.service.request(method, endpoint, **params) + + def get(self, *args, **kwargs): + return self.service.get(*args, **kwargs) + + def post(self, *args, **kwargs): + return self.service.post(*args, **kwargs) + + def get_token(self, payload_extra=None, expiry_hours=1): + return self.service.get_token(payload_extra, expiry_hours) + + +def api_get(endpoint, method='GET', timeout=None, access_token=None, session=None, **params): + return iqpilot.common.api.comma_connect.CommaConnectApi(None).api_get(endpoint, method, timeout, access_token, session, **params) + + +def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]: + return iqpilot.common.api.comma_connect.CommaConnectApi(None).get_key_pair() diff --git a/iqpilot/common/api/base.py b/iqpilot/common/api/base.py new file mode 100644 index 000000000..8170a19b2 --- /dev/null +++ b/iqpilot/common/api/base.py @@ -0,0 +1,84 @@ +import jwt +import os +import requests +import unicodedata +from datetime import datetime, timedelta, UTC +from functools import lru_cache +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.version import get_version + +# name: jwt signature algorithm +KEYS = {"id_rsa": "RS256", + "id_ecdsa": "ES256"} + + +@lru_cache(maxsize=4) +def load_signing_key(private_key: str): + # PyJWT re-parses a PEM string on every encode; an RSA parse is ~40ms, so cache the key object + try: + from cryptography.hazmat.primitives.serialization import load_pem_private_key + return load_pem_private_key(private_key.encode(), password=None) + except Exception: + return private_key + + +class BaseApi: + def __init__(self, dongle_id, api_host, user_agent="openpilot-"): + self.dongle_id = dongle_id + self.api_host = api_host + self.user_agent = user_agent + self.jwt_algorithm, self.private_key, _ = self.get_key_pair() + + def get(self, *args, **kwargs): + return self.request('GET', *args, **kwargs) + + def post(self, *args, **kwargs): + return self.request('POST', *args, **kwargs) + + def request(self, method, endpoint, timeout=None, access_token=None, **params): + return self.api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params) + + def _get_token(self, payload_extra=None, expiry_hours=1, **extra_payload): + now = datetime.now(UTC).replace(tzinfo=None) + payload = { + 'identity': self.dongle_id, + 'nbf': now, + 'iat': now, + 'exp': now + timedelta(hours=expiry_hours), + **extra_payload + } + if payload_extra is not None: + payload.update(payload_extra) + key = load_signing_key(self.private_key) if self.private_key else self.private_key + token = jwt.encode(payload, key, algorithm=self.jwt_algorithm) + if isinstance(token, bytes): + token = token.decode('utf8') + return token + + def get_token(self, payload_extra=None, expiry_hours=1): + return self._get_token(payload_extra, expiry_hours) + + def remove_non_ascii_chars(self, text): + normalized_text = unicodedata.normalize('NFD', text) + ascii_encoded_text = normalized_text.encode('ascii', 'ignore') + return ascii_encoded_text.decode() + + def api_get(self, endpoint, method='GET', timeout=None, access_token=None, session=None, json=None, **params): + headers = {} + if access_token is not None: + headers['Authorization'] = "JWT " + access_token + + version = self.remove_non_ascii_chars(get_version()) + headers['User-Agent'] = self.user_agent + version + + # TODO: add session to Api + req = requests if session is None else session + return req.request(method, f"{self.api_host}/{endpoint}", timeout=timeout, headers=headers, json=json, params=params) + + @staticmethod + def get_key_pair() -> tuple[str, str, str] | tuple[None, None, None]: + for key in KEYS: + if os.path.isfile(Paths.persist_root() + f'/comma/{key}') and os.path.isfile(Paths.persist_root() + f'/comma/{key}.pub'): + with open(Paths.persist_root() + f'/comma/{key}') as private, open(Paths.persist_root() + f'/comma/{key}.pub') as public: + return KEYS[key], private.read(), public.read() + return None, None, None diff --git a/iqpilot/common/api/comma_connect.py b/iqpilot/common/api/comma_connect.py new file mode 100644 index 000000000..bc16d40eb --- /dev/null +++ b/iqpilot/common/api/comma_connect.py @@ -0,0 +1,11 @@ +import os + +from iqpilot.common.api.base import BaseApi + +API_HOST = os.getenv('API_HOST', 'https://api-iqlabs.konn3kt.com') + + +class CommaConnectApi(BaseApi): + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "openpilot-" diff --git a/iqpilot/common/atlas_alerts.py b/iqpilot/common/atlas_alerts.py new file mode 100644 index 000000000..c261db844 --- /dev/null +++ b/iqpilot/common/atlas_alerts.py @@ -0,0 +1,281 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from bisect import insort +from collections.abc import Callable, Iterable +from dataclasses import dataclass, field +from enum import IntEnum + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car, log +from iqpilot.common.realtime import DT_CTRL +from iqpilot.system.hardware import HARDWARE + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus +VisualAlert = car.CarControl.HUDControl.VisualAlert +AudibleAlert = car.CarControl.HUDControl.AudibleAlert + + +def _frames_for(seconds: float) -> int: + return int(seconds / DT_CTRL) + + +class Tier(IntEnum): + LOWEST = 0 + LOWER = 1 + LOW = 2 + MID = 3 + HIGH = 4 + HIGHEST = 5 + + +class Tags: + ENABLE = "enable" + PRE_ENABLE = "preEnable" + OVERRIDE_LATERAL = "overrideLateral" + OVERRIDE_LONGITUDINAL = "overrideLongitudinal" + NO_ENTRY = "noEntry" + WARNING = "warning" + USER_DISABLE = "userDisable" + SOFT_DISABLE = "softDisable" + IMMEDIATE_DISABLE = "immediateDisable" + PERMANENT = "permanent" + + +@dataclass(slots=True) +class AlertCard: + alert_text_1: str + alert_text_2: str + alert_status: log.SelfdriveState.AlertStatus + alert_size: log.SelfdriveState.AlertSize + priority: Tier + visual_alert: car.CarControl.HUDControl.VisualAlert + audible_alert: car.CarControl.HUDControl.AudibleAlert + duration: int + creation_delay: float = 0.0 + alert_type: str = field(default="", init=False) + event_type: str | None = field(default=None, init=False) + + def __init__(self, + alert_text_1: str, + alert_text_2: str, + alert_status: log.SelfdriveState.AlertStatus, + alert_size: log.SelfdriveState.AlertSize, + priority: Tier, + visual_alert: car.CarControl.HUDControl.VisualAlert, + audible_alert: car.CarControl.HUDControl.AudibleAlert, + duration: float, + creation_delay: float = 0.0): + self.alert_text_1 = alert_text_1 + self.alert_text_2 = alert_text_2 + self.alert_status = alert_status + self.alert_size = alert_size + self.priority = priority + self.visual_alert = visual_alert + self.audible_alert = audible_alert + self.duration = _frames_for(duration) + self.creation_delay = creation_delay + self.alert_type = "" + self.event_type = None + + def __str__(self) -> str: + return f"{self.alert_text_1}/{self.alert_text_2} {self.priority} {self.visual_alert} {self.audible_alert}" + + +AlertFactory = Callable[[car.CarParams, car.CarState, messaging.SubMaster, bool, int, log.ControlsState], AlertCard] + + +def car_mode_entry_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> AlertCard: + del CS, sm, metric, soft_disable_time, personality + headline = "Enable Adaptive Cruise to Engage" + if CP.brand == "honda": + headline = "Enable Main Switch to Engage" + return NoEntryCard(headline) + + +class EventBook(ABC): + def __init__(self): + self._live_names: list[int] = [] + self._latched_names: list[int] = [] + self.event_counters: dict[int, int] = {} + + @property + def events(self) -> list[int]: + return self._live_names + + @events.setter + def events(self, values: list[int]) -> None: + self._live_names = values + + @property + def static_events(self) -> list[int]: + return self._latched_names + + @static_events.setter + def static_events(self, values: list[int]) -> None: + self._latched_names = values + + @property + def names(self) -> list[int]: + return list(self._live_names) + + def __len__(self) -> int: + return len(self._live_names) + + def add(self, event_name: int, static: bool = False) -> None: + if static: + insort(self._latched_names, event_name) + insort(self._live_names, event_name) + + def clear(self) -> None: + refreshed: dict[int, int] = {} + for event_name, frames_seen in self.event_counters.items(): + refreshed[event_name] = frames_seen + 1 if event_name in self._live_names else 0 + self.event_counters = refreshed + self._live_names = list(self._latched_names) + + def contains(self, event_type: str) -> bool: + board = self.get_events_mapping() + return any(event_type in board.get(event_name, {}) for event_name in self._live_names) + + def has(self, event_name: int) -> bool: + return event_name in self._live_names + + def contains_in_list(self, events_list: list[int]) -> bool: + return any(event_name in self._live_names for event_name in events_list) + + def remove(self, event_name: int, static: bool = False) -> None: + if static and event_name in self._latched_names: + self._latched_names.remove(event_name) + + if event_name in self._live_names: + self.event_counters[event_name] = self.event_counters.get(event_name, 0) + 1 + self._live_names.remove(event_name) + + def add_from_msg(self, events: Iterable) -> None: + for event in events: + insort(self._live_names, event.name.raw) + + def to_msg(self): + board = self.get_events_mapping() + outbound = [] + for event_name in self._live_names: + msg = self.get_event_msg_type().new_message() + msg.name = event_name + for event_kind in board.get(event_name, {}): + setattr(msg, event_kind, True) + outbound.append(msg) + return outbound + + def create_alerts(self, event_types: list[str], callback_args=None): + callback_args = [] if callback_args is None else callback_args + board = self.get_events_mapping() + spawned: list[AlertCard] = [] + for event_name in self._live_names: + variants = board.get(event_name, {}) + for event_type in event_types: + chosen = variants.get(event_type) + if chosen is None: + continue + alert = self._realize(chosen, callback_args) + age_frames = self.event_counters.get(event_name, 0) + 1 + if age_frames * DT_CTRL < alert.creation_delay: + continue + alert.alert_type = f"{self.get_event_name(event_name)}/{event_type}" + alert.event_type = event_type + spawned.append(alert) + return spawned + + @staticmethod + def _realize(candidate: AlertCard | AlertFactory, callback_args: list) -> AlertCard: + return candidate if isinstance(candidate, AlertCard) else candidate(*callback_args) + + @abstractmethod + def get_events_mapping(self) -> dict[int, dict[str, AlertCard | AlertFactory]]: + raise NotImplementedError + + @abstractmethod + def get_event_name(self, event: int) -> str: + raise NotImplementedError + + @abstractmethod + def get_event_msg_type(self): + raise NotImplementedError + + +def _mici_reframe(primary: str, secondary: str) -> tuple[str, str, log.SelfdriveState.AlertSize]: + if HARDWARE.get_device_type() == "mici": + return secondary, primary, AlertSize.small + return primary, secondary, AlertSize.mid + + +class NoEntryCard(AlertCard): + def __init__(self, + alert_text_2: str, + alert_text_1: str = "IQ.Pilot Unavailable", + visual_alert: car.CarControl.HUDControl.VisualAlert = VisualAlert.none, + priority: Tier = Tier.LOW): + primary, secondary, size = _mici_reframe(alert_text_1, alert_text_2) + super().__init__(primary, secondary, AlertStatus.normal, size, priority, visual_alert, AudibleAlert.refuse, 3.0) + + +class GentleDisableCard(AlertCard): + def __init__(self, alert_text_2: str): + super().__init__( + "TAKE CONTROL IMMEDIATELY", + alert_text_2, + AlertStatus.userPrompt, + AlertSize.full, + Tier.MID, + VisualAlert.steerRequired, + AudibleAlert.warningSoft, + 2.0, + ) + + +class PendingDisableCard(GentleDisableCard): + def __init__(self, alert_text_2: str): + super().__init__(alert_text_2) + self.alert_text_1 = "IQ.Pilot will disengage" + + +class HardDisableCard(AlertCard): + def __init__(self, alert_text_2: str): + super().__init__( + "TAKE CONTROL IMMEDIATELY", + alert_text_2, + AlertStatus.critical, + AlertSize.full, + Tier.HIGHEST, + VisualAlert.steerRequired, + AudibleAlert.warningImmediate, + 4.0, + ) + + +class ChimeCard(AlertCard): + def __init__(self, audible_alert: car.CarControl.HUDControl.AudibleAlert): + super().__init__("", "", AlertStatus.normal, AlertSize.none, Tier.MID, VisualAlert.none, audible_alert, 0.2) + + +class BannerCard(AlertCard): + def __init__(self, alert_text_1: str, alert_text_2: str = "", duration: float = 0.2, priority: Tier = Tier.LOWER, creation_delay: float = 0.0): + size = AlertSize.mid if alert_text_2 else AlertSize.small + super().__init__(alert_text_1, alert_text_2, AlertStatus.normal, size, priority, VisualAlert.none, AudibleAlert.none, duration, creation_delay) + + +class BootCard(AlertCard): + def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal): + if HARDWARE.get_device_type() == "mici": + compact_secondary = "" if alert_text_2 == "Always keep hands on wheel and eyes on road" else alert_text_2 + super().__init__(alert_text_1, compact_secondary, alert_status, AlertSize.small, Tier.LOWER, VisualAlert.none, AudibleAlert.none, 5.0) + else: + super().__init__(alert_text_1, alert_text_2, alert_status, AlertSize.mid, Tier.LOWER, VisualAlert.none, AudibleAlert.none, 5.0) + + +class AlertBase(AlertCard): + pass + + +NULL_ALERT = AlertCard("", "", AlertStatus.normal, AlertSize.none, Tier.LOWEST, VisualAlert.none, AudibleAlert.none, 0.0) diff --git a/iqpilot/common/auto_units.py b/iqpilot/common/auto_units.py new file mode 100644 index 000000000..7276bc43c --- /dev/null +++ b/iqpilot/common/auto_units.py @@ -0,0 +1,58 @@ +import time + +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.geo_regions import UNKNOWN_REGION, region_for_position, region_is_metric + +CHECK_INTERVAL = 10.0 +CONFIRMATIONS = 3 + + +class AutoUnits: + def __init__(self, params: Params | None = None): + self.params = params or Params() + self._next_check = 0.0 + self._candidate = UNKNOWN_REGION + self._confirmations = 0 + + def _position(self) -> tuple[float, float, bool]: + from iqpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position + + lat, lon, _, valid = current_or_last_gps_position(self.params) + return lat, lon, valid + + def update(self, now: float | None = None) -> None: + if not self.params.get_bool("IQAutoUnits"): + self._candidate = UNKNOWN_REGION + self._confirmations = 0 + return + + now = time.monotonic() if now is None else now + if now < self._next_check: + return + self._next_check = now + CHECK_INTERVAL + + lat, lon, valid = self._position() + region = region_for_position(lat, lon) if valid else UNKNOWN_REGION + if region == UNKNOWN_REGION: + self._confirmations = 0 + return + + if region != self._candidate: + self._candidate = region + self._confirmations = 1 + return + + self._confirmations += 1 + if self._confirmations < CONFIRMATIONS: + return + + if region == self.params.get("IQAutoUnitsRegion"): + return + + self.params.put("IQAutoUnitsRegion", region) + + metric = region_is_metric(region) + if metric != self.params.get_bool("IsMetric"): + self.params.put_bool("IsMetric", metric) + cloudlog.warning(f"auto units: {region} detected, switching to {'km/h' if metric else 'mph'}") diff --git a/iqpilot/common/basedir.py b/iqpilot/common/basedir.py new file mode 100644 index 000000000..49b092d93 --- /dev/null +++ b/iqpilot/common/basedir.py @@ -0,0 +1,4 @@ +import os + + +BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../..")) diff --git a/iqpilot/common/constants.py b/iqpilot/common/constants.py new file mode 100644 index 000000000..7ca425c4b --- /dev/null +++ b/iqpilot/common/constants.py @@ -0,0 +1,23 @@ +import numpy as np + +# conversions +class CV: + # Speed + MPH_TO_KPH = 1.609344 + KPH_TO_MPH = 1. / MPH_TO_KPH + MS_TO_KPH = 3.6 + KPH_TO_MS = 1. / MS_TO_KPH + MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH + MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS + MS_TO_KNOTS = 1.9438 + KNOTS_TO_MS = 1. / MS_TO_KNOTS + + # Angle + DEG_TO_RAD = np.pi / 180. + RAD_TO_DEG = 1. / DEG_TO_RAD + + # Mass + LB_TO_KG = 0.453592 + + +ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2 diff --git a/iqpilot/common/file_chunker.py b/iqpilot/common/file_chunker.py new file mode 100644 index 000000000..57dfc3553 --- /dev/null +++ b/iqpilot/common/file_chunker.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +import sys +import math +import os +from pathlib import Path + +CHUNK_SIZE = 45 * 1024 * 1024 # 45MB, under GitHub's 50MB limit + +def get_chunk_name(name, idx, num_chunks): + return f"{name}.chunk{idx+1:02d}of{num_chunks:02d}" + +def get_manifest_path(name): + return f"{name}.chunkmanifest" + +def _chunk_paths(path, num_chunks): + return [get_manifest_path(path)] + [get_chunk_name(path, i, num_chunks) for i in range(num_chunks)] + +def get_chunk_targets(path, file_size): + num_chunks = math.ceil(file_size / CHUNK_SIZE) + return _chunk_paths(path, num_chunks) + +def chunk_file(path, targets): + manifest_path, *chunk_paths = targets + with open(path, 'rb') as f: + data = f.read() + actual_num_chunks = max(1, math.ceil(len(data) / CHUNK_SIZE)) + assert len(chunk_paths) >= actual_num_chunks, f"Allowed {len(chunk_paths)} chunks but needs at least {actual_num_chunks}, for path {path}" + for i, chunk_path in enumerate(chunk_paths): + with open(chunk_path, 'wb') as f: + f.write(data[i * CHUNK_SIZE:(i + 1) * CHUNK_SIZE]) + Path(manifest_path).write_text(str(len(chunk_paths))) + os.remove(path) + +def get_existing_chunks(path): + if os.path.isfile(path): + return [path] + if os.path.isfile(manifest := get_manifest_path(path)): + num_chunks = int(Path(manifest).read_text().strip()) + return _chunk_paths(path, num_chunks) + raise FileNotFoundError(path) + +def read_file_chunked(path): + manifest_path = get_manifest_path(path) + if os.path.isfile(manifest_path): + num_chunks = int(Path(manifest_path).read_text().strip()) + return b''.join(Path(get_chunk_name(path, i, num_chunks)).read_bytes() for i in range(num_chunks)) + if os.path.isfile(path): + return Path(path).read_bytes() + raise FileNotFoundError(path) + + +if __name__ == "__main__": + path = sys.argv[1] + chunk_paths = get_chunk_targets(path, os.path.getsize(path)) + chunk_file(path, chunk_paths) diff --git a/iqpilot/common/file_helpers.py b/iqpilot/common/file_helpers.py new file mode 100644 index 000000000..1d459fe13 --- /dev/null +++ b/iqpilot/common/file_helpers.py @@ -0,0 +1 @@ +from iqpilot.common.utils import CallbackReader, get_upload_stream diff --git a/iqpilot/common/filter_simple.py b/iqpilot/common/filter_simple.py new file mode 100644 index 000000000..30839f66e --- /dev/null +++ b/iqpilot/common/filter_simple.py @@ -0,0 +1,71 @@ +from collections import deque + +import numpy as np + + +class FirstOrderFilter: + def __init__(self, x0, rc, dt, initialized=True): + self.x = x0 + self.dt = dt + self.update_alpha(rc) + self.initialized = initialized + + def update_alpha(self, rc): + self.alpha = self.dt / (rc + self.dt) + + def update(self, x): + if self.initialized: + self.x = (1. - self.alpha) * self.x + self.alpha * x + else: + self.initialized = True + self.x = x + return self.x + + +class BounceFilter(FirstOrderFilter): + def __init__(self, x0, rc, dt, initialized=True, bounce=2): + self.velocity = FirstOrderFilter(0.0, 0.15, dt) + self.bounce = bounce + super().__init__(x0, rc, dt, initialized) + + def update(self, x): + super().update(x) + scale = self.dt / (1.0 / 60.0) # tuned at 60 fps + self.velocity.x += (x - self.x) * self.bounce * scale * self.dt + self.velocity.update(0.0) + if abs(self.velocity.x) < 1e-5: + self.velocity.x = 0.0 + self.x += self.velocity.x + return self.x + + +class MyMovingAverage: + def __init__(self, window_size, value=None): + self.window_size = window_size + if value is not None: + self.values = deque([value] * window_size, maxlen=window_size) + self.sum = value * window_size + self.result = value + else: + self.values = deque(maxlen=window_size) + self.sum = 0 + self.result = 0 + + def set(self, value): + self.values.clear() + self.values.append(value) + self.sum = value + self.result = value + return value + + def set_all(self, value): + self.values = deque([value] * self.window_size, maxlen=self.window_size) + self.sum = value * self.window_size + self.result = value + return value + + def process(self, value, median=False): + self.values.append(value) + self.sum = sum(self.values) + self.result = float(np.median(self.values)) if median else float(self.sum) / len(self.values) + return self.result diff --git a/iqpilot/common/geo_regions.py b/iqpilot/common/geo_regions.py new file mode 100644 index 000000000..ec47c99ef --- /dev/null +++ b/iqpilot/common/geo_regions.py @@ -0,0 +1,140 @@ +MPH_REGIONS = ("US", "GB", "LR") +METRIC_REGION = "METRIC" +UNKNOWN_REGION = "" + +_US_CONUS = [ + (-123.32, 49.00), (-117.03, 49.00), (-110.00, 49.00), (-104.05, 49.00), (-97.23, 49.00), (-95.15, 49.00), + (-95.15, 49.38), (-94.82, 49.30), (-94.68, 48.77), (-93.85, 48.63), (-93.35, 48.62), (-92.72, 48.54), + (-92.30, 48.24), (-91.55, 48.10), (-90.84, 48.24), (-89.99, 48.02), (-89.60, 48.02), (-89.10, 48.32), + (-88.40, 48.30), (-87.00, 47.80), (-85.60, 47.15), (-84.60, 46.75), (-84.42, 46.56), (-84.30, 46.49), + (-84.12, 46.28), (-83.90, 46.05), (-83.40, 45.75), (-82.90, 45.05), (-82.55, 44.00), (-82.42, 43.00), + (-82.70, 42.47), (-82.93, 42.34), (-83.00, 42.33), (-83.05, 42.32), (-83.075, 42.312), (-83.13, 42.25), + (-83.15, 42.18), (-83.11, 42.10), (-83.09, 42.02), + (-82.50, 41.70), (-81.50, 42.00), (-80.20, 42.40), (-79.06, 42.85), (-79.05, 43.27), (-78.00, 43.45), + (-77.00, 43.65), (-76.40, 44.10), (-75.80, 44.50), (-74.75, 45.00), (-73.35, 45.01), (-71.50, 45.01), + (-71.29, 45.30), (-70.90, 45.30), (-70.72, 45.42), (-70.31, 45.86), (-70.05, 46.44), (-69.99, 46.70), + (-69.24, 47.46), (-68.90, 47.20), (-68.38, 47.29), (-67.79, 47.07), (-67.78, 45.94), (-67.42, 45.60), + (-67.03, 44.80), (-68.00, 44.30), (-69.06, 43.80), (-70.20, 43.60), (-70.80, 42.85), (-70.00, 41.90), + (-70.00, 41.55), (-71.20, 41.30), (-72.00, 41.05), (-73.90, 40.55), (-74.20, 39.60), (-75.05, 38.45), + (-75.90, 37.05), (-75.50, 35.20), (-78.50, 33.85), (-80.90, 32.00), (-81.40, 30.70), (-80.03, 26.80), + (-80.15, 25.15), (-81.20, 24.55), (-82.00, 26.40), (-82.80, 27.80), (-83.00, 29.15), (-84.30, 29.90), + (-85.30, 29.65), (-87.50, 30.25), (-89.00, 29.15), (-89.40, 28.95), (-91.30, 29.10), (-93.80, 29.65), + (-95.00, 29.10), (-97.10, 27.80), (-97.14, 25.96), (-98.30, 26.05), (-99.10, 26.40), (-99.50, 27.60), + (-100.40, 28.50), (-101.40, 29.77), (-102.30, 29.88), (-102.90, 29.30), (-103.30, 29.00), (-104.37, 29.56), + (-104.68, 30.13), (-105.30, 30.80), (-105.85, 31.30), (-106.15, 31.50), (-106.30, 31.68), (-106.45, 31.755), + (-106.53, 31.786), (-108.21, 31.783), (-108.21, 31.33), (-111.07, 31.33), (-114.72, 32.72), + (-117.13, 32.53), (-118.40, 33.75), (-119.80, 34.40), (-120.65, 35.10), (-121.90, 36.60), (-122.52, 37.78), + (-123.75, 39.40), (-124.20, 40.45), (-124.15, 42.00), (-124.05, 43.35), (-123.95, 46.25), (-124.75, 48.40), + (-123.30, 48.25), (-123.15, 48.70), +] + +_US_ALASKA = [ + (-141.00, 70.20), (-141.00, 60.30), (-139.05, 60.35), (-137.45, 58.95), (-136.47, 59.63), (-135.03, 59.57), + (-134.30, 58.90), (-133.40, 58.20), (-132.20, 56.90), (-130.60, 56.20), (-130.01, 54.80), (-131.80, 54.70), + (-133.80, 55.90), (-136.60, 58.20), (-140.00, 59.70), (-145.00, 60.00), (-149.20, 59.10), (-152.30, 57.30), + (-155.20, 55.60), (-160.00, 54.60), (-164.50, 54.40), (-162.00, 57.50), (-165.00, 60.20), (-167.50, 62.50), + (-164.00, 64.50), (-168.10, 65.60), (-166.00, 68.30), (-161.00, 70.30), (-156.50, 71.40), (-150.00, 70.50), +] + +_US_ALEUTIANS_EAST = [(-180.00, 51.00), (-158.50, 51.00), (-158.50, 56.00), (-180.00, 56.00)] +_US_ALEUTIANS_WEST = [(172.00, 51.00), (180.00, 51.00), (180.00, 54.00), (172.00, 54.00)] +_US_HAWAII = [(-160.50, 18.80), (-154.70, 18.80), (-154.70, 22.30), (-160.50, 22.30)] +_US_PUERTO_RICO = [(-67.35, 17.85), (-64.55, 17.85), (-64.55, 18.55), (-67.35, 18.55)] +_US_MARIANAS = [(144.50, 13.10), (146.20, 13.10), (146.20, 20.60), (144.50, 20.60)] +_US_SAMOA = [(-171.20, -14.60), (-168.10, -14.60), (-168.10, -11.00), (-171.20, -11.00)] + +_GB_BRITAIN = [ + (-5.72, 50.07), (-4.20, 50.32), (-3.41, 50.62), (-2.45, 50.52), (-1.80, 50.72), (-0.90, 50.77), + (0.58, 50.85), (1.35, 51.13), (1.38, 51.38), (1.15, 51.79), (1.35, 51.95), (1.75, 52.48), + (1.30, 52.94), (0.49, 52.94), (0.34, 53.15), (-0.08, 53.57), (-0.08, 54.12), (-0.61, 54.49), + (-1.18, 54.69), (-1.38, 54.91), (-1.50, 55.13), (-2.00, 55.77), (-2.52, 56.00), (-2.62, 56.28), + (-2.47, 56.55), (-2.21, 56.96), (-2.08, 57.14), (-1.77, 57.50), (-2.00, 57.70), (-2.96, 57.68), + (-3.90, 57.60), (-4.22, 57.48), (-4.05, 57.81), (-3.85, 58.01), (-3.65, 58.12), (-3.09, 58.44), + (-3.01, 58.67), (-3.35, 58.62), (-3.52, 58.60), (-4.99, 58.62), (-5.05, 58.45), (-5.16, 57.90), (-5.70, 57.72), + (-5.72, 57.28), (-5.83, 57.00), (-5.72, 56.65), (-5.47, 56.41), (-5.79, 55.60), (-5.62, 55.31), + (-4.82, 55.64), (-4.63, 55.46), (-4.85, 55.24), (-5.12, 54.84), (-4.86, 54.63), (-4.44, 54.87), + (-4.05, 54.83), (-3.26, 54.98), (-3.05, 54.90), (-3.50, 54.72), (-3.23, 54.07), (-3.05, 53.82), + (-3.40, 53.34), (-3.83, 53.33), (-4.63, 53.42), (-4.72, 53.28), (-4.35, 53.12), (-4.76, 52.80), + (-4.06, 52.72), (-4.09, 52.41), (-4.66, 52.09), (-5.31, 51.88), (-5.06, 51.70), (-4.70, 51.67), + (-4.30, 51.62), (-3.95, 51.56), (-3.70, 51.48), (-3.17, 51.45), (-2.99, 51.55), (-2.67, 51.62), + (-2.48, 51.72), (-2.30, 51.85), (-2.70, 51.50), (-2.98, 51.35), (-3.00, 51.20), (-3.47, 51.21), + (-4.12, 51.21), (-4.55, 50.83), (-5.08, 50.42), (-5.48, 50.21), +] + +_GB_NORTHERN_IRELAND = [ + (-6.03, 54.05), (-6.28, 54.10), (-6.65, 54.17), (-6.86, 54.33), (-7.16, 54.34), (-7.31, 54.12), + (-7.62, 54.14), (-8.00, 54.31), (-8.18, 54.47), (-8.20, 54.52), (-7.90, 54.55), (-7.85, 54.72), (-7.55, 54.75), + (-7.44, 54.94), (-7.25, 55.06), (-6.95, 55.22), (-6.50, 55.25), (-6.25, 55.31), (-6.03, 55.22), + (-5.43, 54.62), (-5.53, 54.24), +] + +_GB_ISLE_OF_MAN = [(-4.85, 54.03), (-4.30, 54.03), (-4.30, 54.42), (-4.85, 54.42)] +_GB_CHANNEL_ISLANDS = [(-2.75, 49.15), (-1.95, 49.15), (-1.95, 49.80), (-2.75, 49.80)] +_GB_ISLE_OF_WIGHT = [(-1.60, 50.55), (-1.05, 50.55), (-1.05, 50.80), (-1.60, 50.80)] +_GB_OUTER_HEBRIDES = [(-7.75, 56.75), (-6.05, 56.75), (-6.05, 58.55), (-7.75, 58.55)] +_GB_INNER_HEBRIDES = [(-7.00, 55.45), (-5.55, 55.45), (-5.55, 57.85), (-7.00, 57.85)] +_GB_ORKNEY = [(-3.50, 58.70), (-2.35, 58.70), (-2.35, 59.45), (-3.50, 59.45)] +_GB_SHETLAND = [(-1.85, 59.80), (-0.65, 59.80), (-0.65, 60.90), (-1.85, 60.90)] + +_LR_LIBERIA = [ + (-11.46, 6.77), (-11.30, 6.95), (-11.16, 7.15), (-11.05, 7.40), (-10.85, 7.75), (-10.60, 8.00), + (-10.28, 8.49), (-9.70, 8.54), (-9.35, 7.80), + (-8.85, 7.40), (-8.48, 7.55), (-8.30, 6.90), (-7.95, 6.20), (-7.60, 5.20), (-7.40, 4.55), + (-7.74, 4.33), (-8.46, 4.61), (-9.06, 4.97), (-9.52, 5.36), (-10.08, 5.85), (-10.40, 6.11), + (-10.83, 6.27), +] + +_REGION_RINGS = { + "US": (_US_CONUS, _US_ALASKA, _US_ALEUTIANS_EAST, _US_ALEUTIANS_WEST, _US_HAWAII, _US_PUERTO_RICO, + _US_MARIANAS, _US_SAMOA), + "GB": (_GB_BRITAIN, _GB_NORTHERN_IRELAND, _GB_ISLE_OF_MAN, _GB_CHANNEL_ISLANDS, _GB_ISLE_OF_WIGHT, + _GB_OUTER_HEBRIDES, _GB_INNER_HEBRIDES, _GB_ORKNEY, _GB_SHETLAND), + "LR": (_LR_LIBERIA,), +} + + +def _bounded(rings): + out = [] + for ring in rings: + lons = [p[0] for p in ring] + lats = [p[1] for p in ring] + out.append(((min(lons), min(lats), max(lons), max(lats)), ring)) + return tuple(out) + + +_REGIONS = tuple((region, _bounded(rings)) for region, rings in _REGION_RINGS.items()) + + +def _point_in_ring(lat: float, lon: float, ring) -> bool: + inside = False + count = len(ring) + j = count - 1 + for i in range(count): + lon_i, lat_i = ring[i] + lon_j, lat_j = ring[j] + if (lat_i > lat) != (lat_j > lat): + crossing = (lon_j - lon_i) * (lat - lat_i) / (lat_j - lat_i) + lon_i + if lon < crossing: + inside = not inside + j = i + return inside + + +def valid_position(lat: float, lon: float) -> bool: + return abs(lat) <= 90.0 and abs(lon) <= 180.0 and (abs(lat) > 1e-4 or abs(lon) > 1e-4) + + +def region_for_position(lat: float, lon: float) -> str: + if not valid_position(lat, lon): + return UNKNOWN_REGION + + for region, rings in _REGIONS: + for (min_lon, min_lat, max_lon, max_lat), ring in rings: + if min_lon <= lon <= max_lon and min_lat <= lat <= max_lat and _point_in_ring(lat, lon, ring): + return region + + return METRIC_REGION + + +def region_is_metric(region: str) -> bool: + return bool(region) and region not in MPH_REGIONS diff --git a/iqpilot/common/git.py b/iqpilot/common/git.py new file mode 100644 index 000000000..2d2ff89e4 --- /dev/null +++ b/iqpilot/common/git.py @@ -0,0 +1,42 @@ +from functools import cache +import subprocess +from iqpilot.common.utils import run_cmd, run_cmd_default + + +@cache +def get_commit(cwd: str | None = None, branch: str = "HEAD") -> str: + return run_cmd_default(["git", "rev-parse", branch], cwd=cwd) + + +@cache +def get_commit_date(cwd: str | None = None, commit: str = "HEAD") -> str: + return run_cmd_default(["git", "show", "--no-patch", "--format='%ct %ci'", commit], cwd=cwd) + + +@cache +def get_short_branch(cwd: str | None = None) -> str: + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"], cwd=cwd) + + +@cache +def get_branch(cwd: str | None = None) -> str: + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], cwd=cwd) + + +@cache +def get_origin(cwd: str | None = None) -> str: + try: + local_branch = run_cmd(["git", "name-rev", "--name-only", "HEAD"], cwd=cwd) + tracking_remote = run_cmd(["git", "config", "branch." + local_branch + ".remote"], cwd=cwd) + return run_cmd(["git", "config", "remote." + tracking_remote + ".url"], cwd=cwd) + except subprocess.CalledProcessError: # Not on a branch, fallback + return run_cmd_default(["git", "config", "--get", "remote.origin.url"], cwd=cwd) + + +@cache +def get_normalized_origin(cwd: str | None = None) -> str: + return get_origin(cwd) \ + .replace("git@", "", 1) \ + .replace(".git", "", 1) \ + .replace("https://", "", 1) \ + .replace(":", "/", 1) diff --git a/iqpilot/common/git_creds.py b/iqpilot/common/git_creds.py new file mode 100644 index 000000000..c130b0317 --- /dev/null +++ b/iqpilot/common/git_creds.py @@ -0,0 +1,250 @@ +import base64 +import json +import os +import subprocess + +from iqpilot.common.params import Params + +PARAM = "GitAuthBlob" +PARAMS_DIR = os.environ.get("PARAMS_DIR", "/data/params/d") +KEY_DIR = "/data/konn3kt" +KEY_PATH = os.path.join(KEY_DIR, "git_auth.key") +HELPER_PATH = os.path.join(KEY_DIR, "git_credential_helper.py") +DEFAULT_REPO_DIR = "/data/openpilot" +CREDENTIAL_HOSTS = ("git.konn3kt.com", "gitlvb.teallvbs.xyz") + +_HELPER_SCRIPT = '''#!/usr/bin/env python3 +import json +import os +import sys + +KEY_PATH = "{key_path}" + + +def main() -> None: + if len(sys.argv) < 2 or sys.argv[1] != "get": + return + # drain git's request on stdin (terminated by a blank line) + for line in sys.stdin: + if not line.strip(): + break + params_dir = os.environ.get("PARAMS_DIR", "/data/params/d") + blob_path = os.path.join(params_dir, "GitAuthBlob") + try: + with open(KEY_PATH, "rb") as f: + key = f.read().strip() + with open(blob_path, "rb") as f: + blob = f.read() + if not blob: + return + from cryptography.fernet import Fernet + data = json.loads(Fernet(key).decrypt(blob).decode()) + username = data.get("u", "") + token = data.get("t", "") + if username and token: + sys.stdout.write("username=%s\\npassword=%s\\n" % (username, token)) + except Exception: + return + + +if __name__ == "__main__": + main() +''' + + +def _params_get(name: str) -> bytes | None: + # Params -> cereal -> iqdbc: that chain is unavailable mid-bootstrap (this module's + # callers install those very packages), so fall back to the params file directly, + # exactly like the embedded credential helper does. + try: + return Params().get(name) + except Exception: + try: + with open(os.path.join(PARAMS_DIR, name), "rb") as f: + return f.read() + except OSError: + return None + + +def _params_put(name: str, value: bytes) -> None: + try: + Params().put(name, value) + return + except Exception: + pass + os.makedirs(PARAMS_DIR, exist_ok=True) + tmp = os.path.join(PARAMS_DIR, f".tmp_{name}") + fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o644) + with os.fdopen(fd, "wb") as f: + f.write(value) + f.flush() + os.fsync(f.fileno()) + os.replace(tmp, os.path.join(PARAMS_DIR, name)) + + +def _params_remove(name: str) -> None: + try: + Params().remove(name) + return + except Exception: + pass + try: + os.unlink(os.path.join(PARAMS_DIR, name)) + except OSError: + pass + + +def _load_or_create_key() -> bytes: + from cryptography.fernet import Fernet + try: + with open(KEY_PATH, "rb") as f: + return f.read().strip() + except FileNotFoundError: + pass + key = Fernet.generate_key() + os.makedirs(KEY_DIR, exist_ok=True) + # write atomically with restrictive perms + tmp = KEY_PATH + ".tmp" + fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600) + with os.fdopen(fd, "wb") as f: + f.write(key) + os.replace(tmp, KEY_PATH) + return key + + +def set_credentials(username: str, token: str) -> None: + """Encrypt and store credentials. Empty username AND token clears them.""" + username = (username or "").strip() + token = (token or "").strip() + if not username and not token: + clear_credentials() + return + from cryptography.fernet import Fernet + blob = Fernet(_load_or_create_key()).encrypt( + json.dumps({"u": username, "t": token}).encode() + ) + _params_put(PARAM, blob) + try: + install_credential_helper(DEFAULT_REPO_DIR) + except Exception: + pass + + +def get_credentials() -> tuple[str, str] | None: + """Return (username, token), or None if unset / unreadable.""" + blob = _params_get(PARAM) + if not blob: + return None + try: + from cryptography.fernet import Fernet + data = json.loads(Fernet(_load_or_create_key()).decrypt(blob).decode()) + return data.get("u", ""), data.get("t", "") + except Exception: + return None + + +def clear_credentials() -> None: + _params_remove(PARAM) + + +def has_credentials() -> bool: + return get_credentials() is not None + + +def _auth_header(username: str, token: str) -> str: + return "Authorization: Basic " + base64.b64encode(f"{username}:{token}".encode()).decode() + + +def ssh_to_https(url: str) -> str: + """Convert an SSH git URL to its HTTPS equivalent. Returns url unchanged if it + is not an SSH URL. A leading ssh. host label is dropped (ssh.host -> host).""" + url = url.strip() + host = path = "" + if url.startswith("ssh://"): + rest = url[len("ssh://"):] + rest = rest.split("@", 1)[-1] # drop user@ + hostport, _, path = rest.partition("/") + host = hostport.split(":", 1)[0] # drop :port + elif url.startswith("git@") or ("@" in url and ":" in url.split("@", 1)[-1] and "://" not in url): + rest = url.split("@", 1)[-1] # host:owner/repo.git + host, _, path = rest.partition(":") + else: + return url # already https/http or unrecognised + if host.startswith("ssh."): + host = host[len("ssh."):] + return f"https://{host}/{path}" + + +def install_credential_helper(repo_dir: str = DEFAULT_REPO_DIR) -> None: + if get_credentials() is None: + return + + scopes = {f"https://{host}" for host in CREDENTIAL_HOSTS} + origin = subprocess.run( + ["git", "-C", repo_dir, "config", "--get", "remote.origin.url"], + capture_output=True, text=True, check=False, + ).stdout.strip() + https = ssh_to_https(origin) + if https.startswith("https://"): + from urllib.parse import urlsplit + parts = urlsplit(https) + if parts.hostname: + scopes.add(f"{parts.scheme}://{parts.hostname}") + + try: + os.makedirs(KEY_DIR, exist_ok=True) + tmp = HELPER_PATH + ".tmp" + fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o755) + with os.fdopen(fd, "w") as f: + f.write(_HELPER_SCRIPT.format(key_path=KEY_PATH)) + os.replace(tmp, HELPER_PATH) + except Exception: + return + + helper_cmd = f"!/usr/bin/env python3 {HELPER_PATH}" + for scope in scopes: + subprocess.run( + ["git", "config", "--global", f"credential.{scope}.helper", helper_cmd], + check=False, capture_output=True, + ) + + +def configure(repo_dir: str) -> None: + """Apply on-device credentials to the git repo at repo_dir before a remote op. + + No-op when no credentials are stored. If the origin is an SSH URL it is + rewritten in-place to the HTTPS equivalent so the Basic-auth header applies. + The header is injected via GIT_CONFIG_* env (never persisted to .git/config). + Idempotent.""" + creds = get_credentials() + if creds is None: + return + username, token = creds + + try: + install_credential_helper(repo_dir) + except Exception: + pass + + origin = subprocess.run( + ["git", "-C", repo_dir, "config", "--get", "remote.origin.url"], + capture_output=True, text=True, check=False, + ).stdout.strip() + if not origin: + return + + https = ssh_to_https(origin) + if https != origin and https.startswith("https://"): + subprocess.run( + ["git", "-C", repo_dir, "config", "remote.origin.url", https], + check=False, capture_output=True, + ) + + if not https.startswith("https://"): + return # header auth only works over https + + # scope to this exact repo URL prefix (trailing slash => component boundary) + key = https if https.endswith("/") else https + "/" + os.environ["GIT_CONFIG_COUNT"] = "1" + os.environ["GIT_CONFIG_KEY_0"] = f"http.{key}.extraHeader" + os.environ["GIT_CONFIG_VALUE_0"] = _auth_header(username, token) diff --git a/iqpilot/common/gpio.py b/iqpilot/common/gpio.py new file mode 100644 index 000000000..8f025a2da --- /dev/null +++ b/iqpilot/common/gpio.py @@ -0,0 +1,89 @@ +import os +import fcntl +import ctypes +from functools import cache + +def gpio_init(pin: int, output: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f: + f.write(b"out" if output else b"in") + except Exception as e: + print(f"Failed to set gpio {pin} direction: {e}") + +def gpio_set(pin: int, high: bool) -> None: + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f: + f.write(b"1" if high else b"0") + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + +def gpio_read(pin: int) -> bool | None: + val = None + try: + with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f: + val = bool(int(f.read().strip())) + except Exception as e: + print(f"Failed to set gpio {pin} value: {e}") + + return val + +def gpio_export(pin: int) -> None: + if os.path.isdir(f"/sys/class/gpio/gpio{pin}"): + return + + try: + with open("/sys/class/gpio/export", 'w') as f: + f.write(str(pin)) + except Exception: + print(f"Failed to export gpio {pin}") + +@cache +def get_irq_action(irq: int) -> list[str]: + try: + with open(f"/sys/kernel/irq/{irq}/actions") as f: + actions = f.read().strip().split(',') + return actions + except FileNotFoundError: + return [] + +def get_irqs_for_action(action: str) -> list[str]: + ret = [] + with open("/proc/interrupts") as f: + for l in f.readlines(): + irq = l.split(':')[0].strip() + if irq.isdigit() and action in get_irq_action(irq): + ret.append(irq) + return ret + +# *** gpiochip *** + +class gpioevent_data(ctypes.Structure): + _fields_ = [ + ("timestamp", ctypes.c_uint64), + ("id", ctypes.c_uint32), + ] + +class gpioevent_request(ctypes.Structure): + _fields_ = [ + ("lineoffset", ctypes.c_uint32), + ("handleflags", ctypes.c_uint32), + ("eventflags", ctypes.c_uint32), + ("label", ctypes.c_char * 32), + ("fd", ctypes.c_int) + ] + +def gpiochip_get_ro_value_fd(label: str, gpiochip_id: int, pin: int) -> int: + GPIOEVENT_REQUEST_BOTH_EDGES = 0x3 + GPIOHANDLE_REQUEST_INPUT = 0x1 + GPIO_GET_LINEEVENT_IOCTL = 0xc030b404 + + rq = gpioevent_request() + rq.lineoffset = pin + rq.handleflags = GPIOHANDLE_REQUEST_INPUT + rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES + rq.label = label.encode('utf-8')[:31] + b'\0' + + fd = os.open(f"/dev/gpiochip{gpiochip_id}", os.O_RDONLY) + fcntl.ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, rq) + os.close(fd) + return int(rq.fd) diff --git a/iqpilot/common/gps.py b/iqpilot/common/gps.py new file mode 100644 index 000000000..775a0a318 --- /dev/null +++ b/iqpilot/common/gps.py @@ -0,0 +1,8 @@ +from iqpilot.common.params import Params + + +def get_gps_location_service(params: Params) -> str: + if params.get_bool("UbloxAvailable"): + return "gpsLocationExternal" + else: + return "gpsLocation" diff --git a/iqpilot/common/i2c.py b/iqpilot/common/i2c.py new file mode 100644 index 000000000..1dfaa659a --- /dev/null +++ b/iqpilot/common/i2c.py @@ -0,0 +1,81 @@ +import os +import fcntl +import ctypes + +# I2C constants from /usr/include/linux/i2c-dev.h +I2C_SLAVE = 0x0703 +I2C_SLAVE_FORCE = 0x0706 +I2C_SMBUS = 0x0720 + +# SMBus transfer types +I2C_SMBUS_READ = 1 +I2C_SMBUS_WRITE = 0 +I2C_SMBUS_BYTE_DATA = 2 +I2C_SMBUS_I2C_BLOCK_DATA = 8 + +I2C_SMBUS_BLOCK_MAX = 32 + + +class _I2cSmbusData(ctypes.Union): + _fields_ = [ + ("byte", ctypes.c_uint8), + ("word", ctypes.c_uint16), + ("block", ctypes.c_uint8 * (I2C_SMBUS_BLOCK_MAX + 2)), + ] + + +class _I2cSmbusIoctlData(ctypes.Structure): + _fields_ = [ + ("read_write", ctypes.c_uint8), + ("command", ctypes.c_uint8), + ("size", ctypes.c_uint32), + ("data", ctypes.POINTER(_I2cSmbusData)), + ] + + +class SMBus: + def __init__(self, bus: int): + self._fd = os.open(f'/dev/i2c-{bus}', os.O_RDWR) + + def __enter__(self) -> 'SMBus': + return self + + def __exit__(self, *args) -> None: + self.close() + + def close(self) -> None: + if hasattr(self, '_fd') and self._fd >= 0: + os.close(self._fd) + self._fd = -1 + + def _set_address(self, addr: int, force: bool = False) -> None: + ioctl_arg = I2C_SLAVE_FORCE if force else I2C_SLAVE + fcntl.ioctl(self._fd, ioctl_arg, addr) + + def _smbus_access(self, read_write: int, command: int, size: int, data: _I2cSmbusData) -> None: + ioctl_data = _I2cSmbusIoctlData(read_write, command, size, ctypes.pointer(data)) + fcntl.ioctl(self._fd, I2C_SMBUS, ioctl_data) + + def read_byte_data(self, addr: int, register: int, force: bool = False) -> int: + self._set_address(addr, force) + data = _I2cSmbusData() + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_BYTE_DATA, data) + return int(data.byte) + + def write_byte_data(self, addr: int, register: int, value: int, force: bool = False) -> None: + self._set_address(addr, force) + data = _I2cSmbusData() + data.byte = value & 0xFF + self._smbus_access(I2C_SMBUS_WRITE, register, I2C_SMBUS_BYTE_DATA, data) + + def read_i2c_block_data(self, addr: int, register: int, length: int, force: bool = False) -> list[int]: + self._set_address(addr, force) + if not (0 <= length <= I2C_SMBUS_BLOCK_MAX): + raise ValueError(f"length must be 0..{I2C_SMBUS_BLOCK_MAX}") + + data = _I2cSmbusData() + data.block[0] = length + self._smbus_access(I2C_SMBUS_READ, register, I2C_SMBUS_I2C_BLOCK_DATA, data) + read_len = int(data.block[0]) or length + read_len = min(read_len, length) + return [int(b) for b in data.block[1 : read_len + 1]] diff --git a/iqpilot/common/iq_perf.py b/iqpilot/common/iq_perf.py new file mode 100644 index 000000000..f36f5edef --- /dev/null +++ b/iqpilot/common/iq_perf.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import time +from collections import deque +from dataclasses import dataclass +from typing import Any + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import custom +from iqpilot.common.swaglog import cloudlog + + +TRACE_SERVICE = "iqPerfTrace" +MAX_TRACE_SAMPLES = 16 +_SHARED_PM: messaging.PubMaster | None = None + + +@dataclass(slots=True) +class PerfSample: + frame_id: int = 0 + loop_dt_us: int = 0 + update_us: int = 0 + state_control_us: int = 0 + publish_us: int = 0 + tail_work_us: int = 0 + rk_remaining_us: int = 0 + stale_carcontrol_us: int = 0 + stale_carcontrol_frames: int = 0 + sendcan_gap_us: int = 0 + model_eval_us: int = 0 + model_dropped_frames: int = 0 + model_backlog: int = 0 + texture_decode_us: int = 0 + texture_upload_us: int = 0 + texture_unload_us: int = 0 + texture_prune_us: int = 0 + texture_consume_us: int = 0 + texture_batch_size: int = 0 + texture_bytes: int = 0 + texture_cache_before: int = 0 + texture_cache_after: int = 0 + texture_unloaded: int = 0 + memory_usage_percent: int = 0 + gpu_usage_percent: int = 0 + cpu_usage_percent: int = 0 + flags: int = 0 + + +class PerfTraceRing: + def __init__(self, size: int = MAX_TRACE_SAMPLES): + self._samples: deque[PerfSample] = deque(maxlen=size) + + def push(self, sample: PerfSample) -> None: + self._samples.append(sample) + + def snapshot(self) -> list[PerfSample]: + return list(self._samples) + + +class PerfTraceEmitter: + _SEVERITY_MAP = { + "info": custom.IQPerfTrace.Severity.info, + "warning": custom.IQPerfTrace.Severity.warning, + "error": custom.IQPerfTrace.Severity.error, + "critical": custom.IQPerfTrace.Severity.critical, + } + + def __init__(self, process_name: str, pubmaster: messaging.PubMaster | None = None): + self.process_name = process_name + self._pm: messaging.PubMaster | None = pubmaster + self._last_emit_mono: dict[str, float] = {} + self._disabled = False + + def _pubmaster(self) -> messaging.PubMaster: + global _SHARED_PM + if self._pm is not None: + return self._pm + if _SHARED_PM is None: + _SHARED_PM = messaging.PubMaster([TRACE_SERVICE]) + self._pm = _SHARED_PM + return self._pm + + @staticmethod + def _clamp_uint(value: int, bits: int) -> int: + return max(0, min(value, (1 << bits) - 1)) + + @staticmethod + def _clamp_int(value: int, bits: int) -> int: + lo = -(1 << (bits - 1)) + hi = (1 << (bits - 1)) - 1 + return max(lo, min(value, hi)) + + def emit(self, event_class: str, *, + severity: str = "warning", + frame_id: int = 0, + total_time_us: int = 0, + rk_remaining_us: int = 0, + batch_size: int = 0, + dropped_frames: int = 0, + backlog: int = 0, + flags: int = 0, + samples: list[PerfSample] | None = None, + missing_services: list[str] | None = None, + top_processes: list[str] | None = None, + detail: str = "", + min_interval_s: float = 0.0, + mirror_cloudlog: bool = True) -> bool: + if self._disabled: + return False + now = time.monotonic() + last_emit = self._last_emit_mono.get(event_class, 0.0) + if min_interval_s > 0.0 and (now - last_emit) < min_interval_s: + return False + self._last_emit_mono[event_class] = now + + msg = messaging.new_message(TRACE_SERVICE) + trace = msg.iqPerfTrace + trace.process = self.process_name + trace.eventClass = event_class + trace.severity = self._SEVERITY_MAP.get(severity, custom.IQPerfTrace.Severity.warning) + trace.frameId = self._clamp_uint(int(frame_id), 32) + trace.totalTimeUs = self._clamp_uint(int(total_time_us), 32) + trace.rkRemainingUs = self._clamp_int(int(rk_remaining_us), 32) + trace.batchSize = self._clamp_uint(int(batch_size), 16) + trace.droppedFrames = self._clamp_uint(int(dropped_frames), 16) + trace.backlog = self._clamp_uint(int(backlog), 16) + trace.flags = self._clamp_uint(int(flags), 32) + trace.missingServices = list(missing_services or []) + trace.topProcesses = list(top_processes or []) + trace.detail = detail + + trace_samples = samples or [] + samples_builder = trace.init("samples", len(trace_samples)) + for i, sample in enumerate(trace_samples): + builder = samples_builder[i] + builder.frameId = self._clamp_uint(int(sample.frame_id), 32) + builder.loopDtUs = self._clamp_uint(int(sample.loop_dt_us), 32) + builder.updateUs = self._clamp_uint(int(sample.update_us), 32) + builder.stateControlUs = self._clamp_uint(int(sample.state_control_us), 32) + builder.publishUs = self._clamp_uint(int(sample.publish_us), 32) + builder.tailWorkUs = self._clamp_uint(int(sample.tail_work_us), 32) + builder.rkRemainingUs = self._clamp_int(int(sample.rk_remaining_us), 32) + builder.staleCarControlUs = self._clamp_uint(int(sample.stale_carcontrol_us), 32) + builder.staleCarControlFrames = self._clamp_uint(int(sample.stale_carcontrol_frames), 16) + builder.sendcanGapUs = self._clamp_uint(int(sample.sendcan_gap_us), 32) + builder.modelEvalUs = self._clamp_uint(int(sample.model_eval_us), 32) + builder.modelDroppedFrames = self._clamp_uint(int(sample.model_dropped_frames), 16) + builder.modelBacklog = self._clamp_uint(int(sample.model_backlog), 16) + builder.textureDecodeUs = self._clamp_uint(int(sample.texture_decode_us), 32) + builder.textureUploadUs = self._clamp_uint(int(sample.texture_upload_us), 32) + builder.textureUnloadUs = self._clamp_uint(int(sample.texture_unload_us), 32) + builder.texturePruneUs = self._clamp_uint(int(sample.texture_prune_us), 32) + builder.textureConsumeUs = self._clamp_uint(int(sample.texture_consume_us), 32) + builder.textureBatchSize = self._clamp_uint(int(sample.texture_batch_size), 16) + builder.textureBytes = self._clamp_uint(int(sample.texture_bytes), 32) + builder.textureCacheBefore = self._clamp_uint(int(sample.texture_cache_before), 16) + builder.textureCacheAfter = self._clamp_uint(int(sample.texture_cache_after), 16) + builder.textureUnloaded = self._clamp_uint(int(sample.texture_unloaded), 16) + builder.memoryUsagePercent = self._clamp_uint(int(sample.memory_usage_percent), 16) + builder.gpuUsagePercent = self._clamp_uint(int(sample.gpu_usage_percent), 16) + builder.cpuUsagePercent = self._clamp_uint(int(sample.cpu_usage_percent), 16) + builder.flags = self._clamp_uint(int(sample.flags), 32) + + try: + self._pubmaster().send(TRACE_SERVICE, msg) + except messaging.MultiplePublishersError: + self._disabled = True + cloudlog.error(f"iq_perf_trace disabled for {self.process_name}: duplicate publisher for {TRACE_SERVICE}") + return False + except Exception: + cloudlog.exception(f"iq_perf_trace publish failed for {self.process_name}") + return False + + if mirror_cloudlog: + cloudlog.event( + "iq_perf_trace", + process=self.process_name, + event_class=event_class, + severity=severity, + frame_id=int(frame_id), + total_time_us=int(total_time_us), + dropped_frames=int(dropped_frames), + flags=int(flags), + detail=detail, + ) + return True diff --git a/iqpilot/common/issue_debug.py b/iqpilot/common/issue_debug.py new file mode 100644 index 000000000..e8c517a7d --- /dev/null +++ b/iqpilot/common/issue_debug.py @@ -0,0 +1,44 @@ +import os +import threading +import time +from datetime import datetime +from pathlib import Path + +from iqpilot.system.hardware import PC +from iqpilot.system.hardware.hw import Paths + + +DEBUG_FILENAME = "iqpilot_issue_debug.txt" +DEBUG_PATH = Path(Paths.comma_home()) / "community" / DEBUG_FILENAME if PC else Path("/data/community") / DEBUG_FILENAME + +_lock = threading.Lock() +_last_log_times: dict[str, float] = {} + + +def log_issue(tag: str, message: str) -> None: + try: + DEBUG_PATH.parent.mkdir(parents=True, exist_ok=True) + with _lock: + with open(DEBUG_PATH, "a", encoding="utf-8") as f: + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + f.write(f"[{timestamp}] [{tag}] {message}\n") + except OSError: + pass + + +def log_issue_limited(key: str, tag: str, message: str, interval_sec: float = 1.0) -> None: + now = time.monotonic() + with _lock: + last = _last_log_times.get(key, 0.0) + if now - last < interval_sec: + return + _last_log_times[key] = now + + log_issue(tag, message) + + +def clear_issue_debug_log() -> None: + try: + os.remove(DEBUG_PATH) + except OSError: + pass diff --git a/iqpilot/common/k3_slc_log.py b/iqpilot/common/k3_slc_log.py new file mode 100644 index 000000000..9cbf90fe7 --- /dev/null +++ b/iqpilot/common/k3_slc_log.py @@ -0,0 +1,15 @@ +from datetime import datetime + +from iqpilot.common.swaglog import cloudlog + +K3_SLC_LOG_FILE = "/data/openpilot/k3_slc.txt" + + +def k3_slc_log(message: str) -> None: + try: + with open(K3_SLC_LOG_FILE, "a") as f: + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + f.write(f"[{timestamp}] {message}\n") + f.flush() + except Exception as e: + cloudlog.error(f"[K3_SLC] Failed to write debug log: {e}") diff --git a/iqpilot/common/logging_extra.py b/iqpilot/common/logging_extra.py new file mode 100644 index 000000000..ceaf083cd --- /dev/null +++ b/iqpilot/common/logging_extra.py @@ -0,0 +1,249 @@ +import io +import os +import sys +import copy +import json +import time +import uuid +import socket +import logging +import traceback +import numpy as np +from threading import local +from collections import OrderedDict +from contextlib import contextmanager + +LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ + +def json_handler(obj): + if isinstance(obj, np.bool_): + return bool(obj) + # if isinstance(obj, (datetime.date, datetime.time)): + # return obj.isoformat() + return repr(obj) + +def json_robust_dumps(obj): + return json.dumps(obj, default=json_handler) + +class NiceOrderedDict(OrderedDict): + def __str__(self): + return json_robust_dumps(self) + +class SwagFormatter(logging.Formatter): + def __init__(self, swaglogger): + logging.Formatter.__init__(self, None, '%a %b %d %H:%M:%S %Z %Y') + + self.swaglogger = swaglogger + self.host = socket.gethostname() + + def format_dict(self, record): + record_dict = NiceOrderedDict() + + if isinstance(record.msg, dict): + record_dict['msg'] = record.msg + else: + try: + record_dict['msg'] = record.getMessage() + except (ValueError, TypeError): + record_dict['msg'] = [record.msg]+record.args + + record_dict['ctx'] = self.swaglogger.get_ctx() + + if record.exc_info: + record_dict['exc_info'] = self.formatException(record.exc_info) + + record_dict['level'] = record.levelname + record_dict['levelnum'] = record.levelno + record_dict['name'] = record.name + record_dict['filename'] = record.filename + record_dict['lineno'] = record.lineno + record_dict['pathname'] = record.pathname + record_dict['module'] = record.module + record_dict['funcName'] = record.funcName + record_dict['host'] = self.host + record_dict['process'] = record.process + record_dict['thread'] = record.thread + record_dict['threadName'] = record.threadName + record_dict['created'] = record.created + + return record_dict + + def format(self, record): + if self.swaglogger is None: + raise Exception("must set swaglogger before calling format()") + return json_robust_dumps(self.format_dict(record)) + +class SwagLogFileFormatter(SwagFormatter): + def fix_kv(self, k, v): + # append type to names to preserve legacy naming in logs + # avoids overlapping key namespaces with different types + # e.g. log.info() creates 'msg' -> 'msg$s' + # log.event() creates 'msg.health.logMonoTime' -> 'msg.health.logMonoTime$i' + # because overlapping namespace 'msg' caused problems + if isinstance(v, (str, bytes)): + k += "$s" + elif isinstance(v, float): + k += "$f" + elif isinstance(v, bool): + k += "$b" + elif isinstance(v, int): + k += "$i" + elif isinstance(v, dict): + nv = {} + for ik, iv in v.items(): + ik, iv = self.fix_kv(ik, iv) + nv[ik] = iv + v = nv + elif isinstance(v, list): + k += "$a" + return k, v + + def format(self, record): + if isinstance(record, str): + v = json.loads(record) + else: + v = self.format_dict(record) + + mk, mv = self.fix_kv('msg', v['msg']) + del v['msg'] + v[mk] = mv + v['id'] = uuid.uuid4().hex + + return json_robust_dumps(v) + +class SwagErrorFilter(logging.Filter): + def filter(self, record): + return record.levelno < logging.ERROR + +def _tmpfunc(): + return 0 + +def _srcfile(): + return os.path.normcase(_tmpfunc.__code__.co_filename) + +class SwagLogger(logging.Logger): + def __init__(self): + logging.Logger.__init__(self, "swaglog") + + self.global_ctx = {} + + self.log_local = local() + self.log_local.ctx = {} + + def local_ctx(self): + try: + return self.log_local.ctx + except AttributeError: + self.log_local.ctx = {} + return self.log_local.ctx + + def get_ctx(self): + return dict(self.local_ctx(), **self.global_ctx) + + @contextmanager + def ctx(self, **kwargs): + old_ctx = self.local_ctx() + self.log_local.ctx = copy.copy(old_ctx) or {} + self.log_local.ctx.update(kwargs) + try: + yield + finally: + self.log_local.ctx = old_ctx + + def bind(self, **kwargs): + self.local_ctx().update(kwargs) + + def bind_global(self, **kwargs): + self.global_ctx.update(kwargs) + + def event(self, event, *args, **kwargs): + evt = NiceOrderedDict() + evt['event'] = event + if args: + evt['args'] = args + evt.update(kwargs) + if 'error' in kwargs: + self.error(evt) + elif 'debug' in kwargs: + self.debug(evt) + else: + self.info(evt) + + def timestamp(self, event_name): + if LOG_TIMESTAMPS: + t = time.monotonic() + tstp = NiceOrderedDict() + tstp['timestamp'] = NiceOrderedDict() + tstp['timestamp']["event"] = event_name + tstp['timestamp']["time"] = t*1e9 + self.debug(tstp) + + def findCaller(self, stack_info=False, stacklevel=1): + """ + Find the stack frame of the caller so that we can note the source + file name, line number and function name. + """ + f = sys._getframe(3) + #On some versions of IronPython, currentframe() returns None if + #IronPython isn't run with -X:Frames. + if f is not None: + f = f.f_back + orig_f = f + while f and stacklevel > 1: + f = f.f_back + stacklevel -= 1 + if not f: + f = orig_f + rv = "(unknown file)", 0, "(unknown function)", None + while hasattr(f, "f_code"): + co = f.f_code + filename = os.path.normcase(co.co_filename) + + if filename == _srcfile: + f = f.f_back + continue + sinfo = None + if stack_info: + sio = io.StringIO() + sio.write('Stack (most recent call last):\n') + traceback.print_stack(f, file=sio) + sinfo = sio.getvalue() + if sinfo[-1] == '\n': + sinfo = sinfo[:-1] + sio.close() + rv = (co.co_filename, f.f_lineno, co.co_name, sinfo) + break + return rv + +if __name__ == "__main__": + log = SwagLogger() + + stdout_handler = logging.StreamHandler(sys.stdout) + stdout_handler.setLevel(logging.INFO) + stdout_handler.addFilter(SwagErrorFilter()) + log.addHandler(stdout_handler) + + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.ERROR) + log.addHandler(stderr_handler) + + log.info("asdasd %s", "a") + log.info({'wut': 1}) + log.warning("warning") + log.error("error") + log.critical("critical") + log.event("test", x="y") + + with log.ctx(): + stdout_handler.setFormatter(SwagFormatter(log)) + stderr_handler.setFormatter(SwagFormatter(log)) + log.bind(user="some user") + log.info("in req") + print("") + log.warning("warning") + print("") + log.error("error") + print("") + log.critical("critical") + print("") + log.event("do_req", a=1, b="c") diff --git a/iqpilot/common/markdown.py b/iqpilot/common/markdown.py new file mode 100644 index 000000000..f0f056d96 --- /dev/null +++ b/iqpilot/common/markdown.py @@ -0,0 +1,45 @@ +HTML_REPLACEMENTS = [ + (r'&', r'&'), + (r'"', r'"'), +] + +def parse_markdown(text: str, tab_length: int = 2) -> str: + lines = text.split("\n") + output: list[str] = [] + list_level = 0 + + def end_outstanding_lists(level: int, end_level: int) -> int: + while level > end_level: + level -= 1 + output.append("") + if level > 0: + output.append("") + return end_level + + for i, line in enumerate(lines): + if i + 1 < len(lines) and lines[i + 1].startswith("==="): # heading + output.append(f"

{line}

") + elif line.startswith("==="): + pass + elif line.lstrip().startswith("* "): # list + line_level = 1 + line.count(" " * tab_length, 0, line.index("*")) + if list_level >= line_level: + list_level = end_outstanding_lists(list_level, line_level) + else: + list_level += 1 + if list_level > 1: + output[-1] = output[-1].replace("", "") + output.append("
    ") + output.append(f"
  • {line.replace('*', '', 1).lstrip()}
  • ") + else: + list_level = end_outstanding_lists(list_level, 0) + if len(line) > 0: + output.append(line) + + end_outstanding_lists(list_level, 0) + output_str = "\n".join(output) + "\n" + + for (fr, to) in HTML_REPLACEMENTS: + output_str = output_str.replace(fr, to) + + return output_str diff --git a/iqpilot/common/mock/__init__.py b/iqpilot/common/mock/__init__.py new file mode 100644 index 000000000..4751f3f62 --- /dev/null +++ b/iqpilot/common/mock/__init__.py @@ -0,0 +1,50 @@ +""" +Utilities for generating mock messages for testing. +example in common/tests/test_mock.py +""" + + +import functools +import threading +from iqpilot.cereal.messaging import PubMaster +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.mock.generators import generate_deviceMotion +from iqpilot.common.realtime import Ratekeeper + + +MOCK_GENERATOR = { + "deviceMotion": generate_deviceMotion +} + + +def generate_messages_loop(services: list[str], done: threading.Event): + pm = PubMaster(services) + rk = Ratekeeper(100) + i = 0 + while not done.is_set(): + for s in services: + should_send = i % (100/SERVICE_LIST[s].frequency) == 0 + if should_send: + message = MOCK_GENERATOR[s]() + pm.send(s, message) + i += 1 + rk.keep_time() + + +def mock_messages(services: list[str] | str): + if isinstance(services, str): + services = [services] + + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + done = threading.Event() + t = threading.Thread(target=generate_messages_loop, args=(services, done)) + t.start() + try: + return func(*args, **kwargs) + finally: + done.set() + t.join() + return wrapper + return decorator diff --git a/iqpilot/common/mock/generators.py b/iqpilot/common/mock/generators.py new file mode 100644 index 000000000..27f424ad6 --- /dev/null +++ b/iqpilot/common/mock/generators.py @@ -0,0 +1,14 @@ +from iqpilot.cereal import messaging + + +def generate_deviceMotion(): + msg = messaging.new_message('deviceMotion') + meas = {'x': 0.0, 'y': 0.0, 'z': 0.0, 'xStd': 0.0, 'yStd': 0.0, 'zStd': 0.0, 'valid': True} + msg.deviceMotion.orientationNED = meas + msg.deviceMotion.velocityDevice = meas + msg.deviceMotion.angularVelocityDevice = meas + msg.deviceMotion.accelerationDevice = meas + msg.deviceMotion.inputsOK = True + msg.deviceMotion.posenetOK = True + msg.deviceMotion.sensorsOK = True + return msg diff --git a/iqpilot/common/params.py b/iqpilot/common/params.py new file mode 100644 index 000000000..6e057b403 --- /dev/null +++ b/iqpilot/common/params.py @@ -0,0 +1,158 @@ +try: + from iqpilot.common.params_pyx import Params, ParamKeyFlag, ParamKeyType, UnknownKeyName +except ImportError: + import datetime + import os + import threading + from enum import IntEnum, IntFlag + + class UnknownKeyName(Exception): + pass + + class ParamKeyFlag(IntFlag): + # must stay in lockstep with enum ParamKeyFlag in common/params.h + PERSISTENT = 0x02 + CLEAR_ON_MANAGER_START = 0x04 + CLEAR_ON_ONROAD_TRANSITION = 0x08 + CLEAR_ON_OFFROAD_TRANSITION = 0x10 + DONT_LOG = 0x20 + DEVELOPMENT_ONLY = 0x40 + CLEAR_ON_IGNITION_ON = 0x80 + ALL = 0xFFFFFFFF + + class ParamKeyType(IntEnum): + STRING = 0 + BOOL = 1 + INT = 2 + FLOAT = 3 + TIME = 4 + JSON = 5 + BYTES = 6 + + class Params: + def __init__(self, path: str = ""): + if path: + root = path + else: + from iqpilot.system.hardware.hw import Paths + root = Paths.params() + self._d = os.path.join(root, os.environ.get("OPENPILOT_PREFIX", "d")) + self._lock = threading.Lock() + + def _p(self, key): + if isinstance(key, bytes): + key = key.decode() + return os.path.join(self._d, key) + + def check_key(self, key): + return True + + def get(self, key, block: bool = False, return_default: bool = False, encoding=None): + try: + with open(self._p(key), "rb") as f: + dat = f.read() + except (FileNotFoundError, NotADirectoryError, IsADirectoryError): + return None + if encoding is not None: + return dat.decode(encoding) + # params_pyx returns string-typed values decoded; default to utf-8, fall back to raw bytes + try: + return dat.decode("utf-8") + except UnicodeDecodeError: + return dat + + def get_bool(self, key, block: bool = False) -> bool: + try: + with open(self._p(key), "rb") as f: + return f.read() == b"1" + except (FileNotFoundError, NotADirectoryError, IsADirectoryError): + return False + + def get_int(self, key, block: bool = False) -> int: + value = self.get(key, block=block) + return int(value) if value else 0 + + def get_float(self, key, block: bool = False) -> float: + value = self.get(key, block=block) + return float(value) if value else 0.0 + + def put(self, key, dat): + if isinstance(dat, datetime.datetime): + dat = dat.isoformat() + if isinstance(dat, (int, float)): + # Params are strings on disk and half the fleet's writers spell numeric + # puts as put(key, int). Letting that reach f.write() raises + # "a bytes-like object is required" -- which, when the writer sits in a + # connection's recv loop (hephaestusd's ping handler), tears down the + # transport on the first server ping and flaps the device offline on a + # timer. A params write must not be able to do that: coerce losslessly. + dat = str(dat) + if isinstance(dat, str): + dat = dat.encode("utf-8") + with self._lock: + os.makedirs(self._d, exist_ok=True) + p = self._p(key) + tmp = p + ".tmp" + with open(tmp, "wb") as f: + f.write(dat) + f.flush() + os.fsync(f.fileno()) + os.rename(tmp, p) + + def put_bool(self, key, val: bool): + self.put(key, b"1" if val else b"0") + + def put_int(self, key, val: int): + self.put(key, str(val)) + + def put_float(self, key, val: float): + self.put(key, str(val)) + + def put_nonblocking(self, key, dat): + self.put(key, dat) + + def put_bool_nonblocking(self, key, val: bool): + self.put_bool(key, val) + + def put_int_nonblocking(self, key, val: int): + self.put_int(key, val) + + def put_float_nonblocking(self, key, val: float): + self.put_float(key, val) + + def remove(self, key): + try: + os.remove(self._p(key)) + except FileNotFoundError: + pass + + def clear_all(self, tx_type=None): + pass + + def get_param_path(self, key: str = "") -> str: + return self._p(key) if key else self._d + + def all_keys(self): + try: + return [k.encode() for k in os.listdir(self._d)] + except FileNotFoundError: + return [] + +assert Params +assert ParamKeyFlag +assert ParamKeyType +assert UnknownKeyName + +if __name__ == "__main__": + import sys + + params = Params() + key = sys.argv[1] + assert params.check_key(key), f"unknown param: {key}" + + if len(sys.argv) == 3: + val = sys.argv[2] + print(f"SET: {key} = {val}") + params.put(key, val) + elif len(sys.argv) == 2: + print(f"GET: {key} = {params.get(key)}") diff --git a/iqpilot/common/params_pyx.so b/iqpilot/common/params_pyx.so new file mode 100755 index 000000000..04843abe4 Binary files /dev/null and b/iqpilot/common/params_pyx.so differ diff --git a/iqpilot/common/pid.py b/iqpilot/common/pid.py new file mode 100644 index 000000000..b3d64d6fc --- /dev/null +++ b/iqpilot/common/pid.py @@ -0,0 +1,57 @@ +import numpy as np +from numbers import Number + +class PIDController: + def __init__(self, k_p, k_i, k_d=0., pos_limit=1e308, neg_limit=-1e308, rate=100): + self._k_p: list[list[float]] = [[0], [k_p]] if isinstance(k_p, Number) else k_p + self._k_i: list[list[float]] = [[0], [k_i]] if isinstance(k_i, Number) else k_i + self._k_d: list[list[float]] = [[0], [k_d]] if isinstance(k_d, Number) else k_d + + self.set_limits(pos_limit, neg_limit) + + self.i_dt = 1.0 / rate + self.speed = 0.0 + + self.reset() + + @property + def k_p(self): + return np.interp(self.speed, self._k_p[0], self._k_p[1]) + + @property + def k_i(self): + return np.interp(self.speed, self._k_i[0], self._k_i[1]) + + @property + def k_d(self): + return np.interp(self.speed, self._k_d[0], self._k_d[1]) + + def reset(self): + self.p = 0.0 + self.i = 0.0 + self.d = 0.0 + self.f = 0.0 + self.control = 0 + + def set_limits(self, pos_limit, neg_limit): + self.pos_limit = pos_limit + self.neg_limit = neg_limit + + def update(self, error, error_rate=0.0, speed=0.0, feedforward=0., freeze_integrator=False): + self.speed = speed + self.p = self.k_p * float(error) + self.d = self.k_d * error_rate + self.f = feedforward + + if not freeze_integrator: + i = self.i + self.k_i * self.i_dt * error + + # Don't allow windup if already clipping + test_control = self.p + i + self.d + self.f + i_upperbound = self.i if test_control > self.pos_limit else self.pos_limit + i_lowerbound = self.i if test_control < self.neg_limit else self.neg_limit + self.i = np.clip(i, i_lowerbound, i_upperbound) + + control = self.p + self.i + self.d + self.f + self.control = np.clip(control, self.neg_limit, self.pos_limit) + return self.control diff --git a/iqpilot/common/prefix.py b/iqpilot/common/prefix.py new file mode 100644 index 000000000..cd71dfb01 --- /dev/null +++ b/iqpilot/common/prefix.py @@ -0,0 +1,66 @@ +import os +import platform +import shutil +import uuid + + +from iqpilot.common.params import Params +from iqpilot.system.hardware import PC +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT + +class OpenpilotPrefix: + def __init__(self, prefix: str | None = None, create_dirs_on_enter: bool = True, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False): + self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15]) + shm_path = "/tmp" if platform.system() == "Darwin" else "/dev/shm" + self.msgq_path = os.path.join(shm_path, "msgq_" + self.prefix) + self.create_dirs_on_enter = create_dirs_on_enter + self.clean_dirs_on_exit = clean_dirs_on_exit + self.shared_download_cache = shared_download_cache + + def __enter__(self): + self.original_prefix = os.environ.get('OPENPILOT_PREFIX', None) + os.environ['OPENPILOT_PREFIX'] = self.prefix + + if self.create_dirs_on_enter: + self.create_dirs() + + if self.shared_download_cache: + os.environ["COMMA_CACHE"] = DEFAULT_DOWNLOAD_CACHE_ROOT + + return self + + def __exit__(self, exc_type, exc_obj, exc_tb): + if self.clean_dirs_on_exit: + self.clean_dirs() + try: + del os.environ['OPENPILOT_PREFIX'] + if self.original_prefix is not None: + os.environ['OPENPILOT_PREFIX'] = self.original_prefix + except KeyError: + pass + return False + + def create_dirs(self): + try: + os.mkdir(self.msgq_path) + except FileExistsError: + pass + os.makedirs(Paths.log_root(), exist_ok=True) + + def clean_dirs(self): + symlink_path = Params().get_param_path() + if os.path.islink(symlink_path): + shutil.rmtree(os.path.realpath(symlink_path), ignore_errors=True) + try: + os.remove(symlink_path) + except FileNotFoundError: + pass + else: + shutil.rmtree(symlink_path, ignore_errors=True) + shutil.rmtree(self.msgq_path, ignore_errors=True) + if PC: + shutil.rmtree(Paths.log_root(), ignore_errors=True) + if not os.environ.get("COMMA_CACHE", False): + shutil.rmtree(Paths.download_cache_root(), ignore_errors=True) + shutil.rmtree(Paths.comma_home(), ignore_errors=True) diff --git a/iqpilot/common/pt2.py b/iqpilot/common/pt2.py new file mode 100644 index 000000000..c1afc545b --- /dev/null +++ b/iqpilot/common/pt2.py @@ -0,0 +1,40 @@ +import math + + +class PT2Filter: + def __init__(self, w0: float, zeta: float, dt: float): + self.w0 = w0 + self.zeta = zeta + self.dt = dt + self.a1, self.a2, self.b0, self.b1, self.b2 = self._design(w0, zeta, dt) + self.y1 = 0.0 + self.y2 = 0.0 + self.u1 = 0.0 + self.u2 = 0.0 + + @staticmethod + def _design(w0: float, zeta: float, dt: float): + # bilinear transform of H(s) = w0^2 / (s^2 + 2*zeta*w0*s + w0^2) + alpha = 2.0 / dt + a2_den = alpha**2 + (2.0 * zeta * w0 * alpha) + w0**2 + a1_den = (-2.0 * alpha**2) + (2.0 * w0**2) + a0_den = alpha**2 - (2.0 * zeta * w0 * alpha) + w0**2 + return (a1_den / a2_den, a0_den / a2_den, + w0**2 / a2_den, 2.0 * w0**2 / a2_den, w0**2 / a2_den) + + def reset(self, value: float = 0.0) -> None: + self.y1 = value + self.y2 = value + self.u1 = value + self.u2 = value + + def update(self, u: float) -> float: + y = (-self.a1 * self.y1) - (self.a2 * self.y2) + (self.b0 * u) + (self.b1 * self.u1) + (self.b2 * self.u2) + self.y2 = self.y1 + self.y1 = y + self.u2 = self.u1 + self.u1 = u + return y + + def steady_state_steps(self) -> int: + return math.ceil((4.0 / (self.zeta * self.w0)) / self.dt) diff --git a/iqpilot/common/realtime.py b/iqpilot/common/realtime.py new file mode 100644 index 000000000..9fd2f695d --- /dev/null +++ b/iqpilot/common/realtime.py @@ -0,0 +1,134 @@ +"""Utilities for reading real time clocks and keeping soft real time constraints.""" +import gc +import os +import sys +import time + +from setproctitle import getproctitle + +from iqpilot.common.utils import MovingAverage +from iqpilot.system.hardware import PC + + +# time step for each process +DT_CTRL = 0.01 # controlsd +DT_MDL = 0.05 # model +DT_HW = 0.5 # hardwared and manager +DT_DMON = 0.05 # driver monitoring + + +class Priority: + # CORE 2 + # - modeld = 55 + # - camerad = 54 + CTRL_LOW = 51 # plannerd & radard + + # CORE 3 + # - pandad = 55 + CTRL_HIGH = 53 + + +def set_core_affinity(cores: list[int]) -> None: + if sys.platform == 'linux' and not PC: + os.sched_setaffinity(0, cores) + + +def config_realtime_process(cores: int | list[int], priority: int) -> None: + gc.disable() + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(priority)) + c = cores if isinstance(cores, list) else [cores, ] + set_core_affinity(c) + + +def config_background_thread() -> None: + if sys.platform == 'linux' and not PC: + os.sched_setscheduler(0, os.SCHED_OTHER, os.sched_param(0)) + set_core_affinity(list(range(os.cpu_count() or 1))) + + +def lock_memory() -> None: + """mlockall this process so memory reclaim/compaction can't stall it. RT control + procs only (locking ui/modeld would worsen pressure). Best-effort.""" + if sys.platform != 'linux' or PC: + return + try: + import ctypes + import resource + resource.setrlimit(resource.RLIMIT_MEMLOCK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) + MCL_CURRENT, MCL_FUTURE = 0x1, 0x2 + libc = ctypes.CDLL("libc.so.6", use_errno=True) + if libc.mlockall(MCL_CURRENT | MCL_FUTURE) != 0: + raise OSError(ctypes.get_errno(), os.strerror(ctypes.get_errno())) + except Exception as e: + try: + from iqpilot.common.swaglog import cloudlog + cloudlog.warning(f"lock_memory (mlockall) failed: {e}") + except Exception: + pass + + +class Ratekeeper: + def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None: + """Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative.""" + self._interval = 1. / rate + self._print_delay_threshold = print_delay_threshold + self._frame = 0 + self._remaining = 0.0 + self._process_name = getproctitle() + self._last_monitor_time = -1. + self._next_frame_time = -1. + + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + def reset(self) -> None: + self._remaining = 0.0 + self._last_monitor_time = -1. + self._next_frame_time = -1. + self.avg_dt = MovingAverage(100) + self.avg_dt.add_value(self._interval) + + @property + def frame(self) -> int: + return self._frame + + @property + def remaining(self) -> float: + return self._remaining + + @property + def lag(self) -> float: + return max(0., -self._remaining) + + @property + def lagging(self) -> bool: + expected_dt = self._interval * (1 / 0.9) + return self.avg_dt.get_average() > expected_dt + + # Maintain loop rate by calling this at the end of each loop + def keep_time(self) -> bool: + lagged = self.monitor_time() + if self._remaining > 0: + time.sleep(self._remaining) + return lagged + + # Monitors the cumulative lag, but does not enforce a rate + def monitor_time(self) -> bool: + if self._last_monitor_time < 0: + self._next_frame_time = time.monotonic() + self._interval + self._last_monitor_time = time.monotonic() + + prev = self._last_monitor_time + self._last_monitor_time = time.monotonic() + self.avg_dt.add_value(self._last_monitor_time - prev) + + lagged = False + remaining = self._next_frame_time - time.monotonic() + self._next_frame_time += self._interval + if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: + print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms") + lagged = True + self._frame += 1 + self._remaining = remaining + return lagged diff --git a/iqpilot/common/simple_kalman.py b/iqpilot/common/simple_kalman.py new file mode 100644 index 000000000..194b27204 --- /dev/null +++ b/iqpilot/common/simple_kalman.py @@ -0,0 +1,54 @@ +import numpy as np + + +def get_kalman_gain(dt, A, C, Q, R, iterations=100): + P = np.zeros_like(Q) + for _ in range(iterations): + P = A.dot(P).dot(A.T) + dt * Q + S = C.dot(P).dot(C.T) + R + K = P.dot(C.T).dot(np.linalg.inv(S)) + P = (np.eye(len(P)) - K.dot(C)).dot(P) + return K + + +class KF1D: + # this EKF assumes constant covariance matrix, so calculations are much simpler + # the Kalman gain also needs to be precomputed using the control module + + def __init__(self, x0, A, C, K): + self.x0_0 = x0[0][0] + self.x1_0 = x0[1][0] + self.A0_0 = A[0][0] + self.A0_1 = A[0][1] + self.A1_0 = A[1][0] + self.A1_1 = A[1][1] + self.C0_0 = C[0] + self.C0_1 = C[1] + self.K0_0 = K[0][0] + self.K1_0 = K[1][0] + + self.A_K_0 = self.A0_0 - self.K0_0 * self.C0_0 + self.A_K_1 = self.A0_1 - self.K0_0 * self.C0_1 + self.A_K_2 = self.A1_0 - self.K1_0 * self.C0_0 + self.A_K_3 = self.A1_1 - self.K1_0 * self.C0_1 + + # K matrix needs to be pre-computed as follow: + # import control + # (x, l, K) = control.dare(np.transpose(self.A), np.transpose(self.C), Q, R) + # self.K = np.transpose(K) + + def update(self, meas): + #self.x = np.dot(self.A_K, self.x) + np.dot(self.K, meas) + x0_0 = self.A_K_0 * self.x0_0 + self.A_K_1 * self.x1_0 + self.K0_0 * meas + x1_0 = self.A_K_2 * self.x0_0 + self.A_K_3 * self.x1_0 + self.K1_0 * meas + self.x0_0 = x0_0 + self.x1_0 = x1_0 + return [self.x0_0, self.x1_0] + + @property + def x(self): + return [[self.x0_0], [self.x1_0]] + + def set_x(self, x): + self.x0_0 = x[0][0] + self.x1_0 = x[1][0] diff --git a/iqpilot/common/slc_utilities.py b/iqpilot/common/slc_utilities.py new file mode 100644 index 000000000..296ab0785 --- /dev/null +++ b/iqpilot/common/slc_utilities.py @@ -0,0 +1,126 @@ +import math +import numpy as np + +try: + import requests +except ImportError: + requests = None + +from iqpilot.common.slc_variables import EARTH_RADIUS + + +def calculate_bearing_offset(latitude, longitude, current_bearing, distance): + """ + Calculate new GPS coordinates given a starting point, bearing, and distance. + Used for Mapbox API lookahead calculations. + + Args: + latitude: Starting latitude in degrees + longitude: Starting longitude in degrees + current_bearing: Bearing in degrees (0-360) + distance: Distance to project in meters + + Returns: + Tuple of (new_latitude, new_longitude) in degrees + """ + bearing = math.radians(current_bearing) + lat_rad = math.radians(latitude) + lon_rad = math.radians(longitude) + + delta = distance / EARTH_RADIUS + + new_lat = math.asin(math.sin(lat_rad) * math.cos(delta) + math.cos(lat_rad) * math.sin(delta) * math.cos(bearing)) + new_lon = lon_rad + math.atan2(math.sin(bearing) * math.sin(delta) * math.cos(lat_rad), math.cos(delta) - math.sin(lat_rad) * math.sin(new_lat)) + return math.degrees(new_lat), math.degrees(new_lon) + + +def calculate_distance_to_point(lat1, lon1, lat2, lon2): + """ + Calculate the great circle distance between two GPS points using the Haversine formula. + + Args: + lat1, lon1: First point coordinates in degrees + lat2, lon2: Second point coordinates in degrees + + Returns: + Distance in meters + """ + lat1_rad = math.radians(lat1) + lon1_rad = math.radians(lon1) + lat2_rad = math.radians(lat2) + lon2_rad = math.radians(lon2) + + delta_lat = lat2_rad - lat1_rad + delta_lon = lon2_rad - lon1_rad + + a = (math.sin(delta_lat / 2) ** 2) + math.cos(lat1_rad) * math.cos(lat2_rad) * (math.sin(delta_lon / 2) ** 2) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + + return EARTH_RADIUS * c + + +def calculate_lane_width(lane_line1, lane_line2, road_edge=None): + """ + Calculate the width of a lane based on lane line positions. + Used for speed limit filler to determine road width. + + Args: + lane_line1: First lane line object with x, y coordinates + lane_line2: Second lane line object with x, y coordinates + road_edge: Optional road edge object with x, y coordinates + + Returns: + Lane width in meters + """ + lane_line1_x = np.asarray(lane_line1.x) + lane_line1_y = np.asarray(lane_line1.y) + + lane_line2_x = np.asarray(lane_line2.x) + lane_line2_y = np.asarray(lane_line2.y) + + lane_y_interp = np.interp(lane_line2_x, lane_line1_x, lane_line1_y) + distance_to_lane = np.median(np.abs(lane_line2_y - lane_y_interp)) + + if road_edge is None: + return distance_to_lane + + road_edge_x = np.asarray(road_edge.x) + road_edge_y = np.asarray(road_edge.y) + + edge_y_interp = np.interp(lane_line2_x, road_edge_x, road_edge_y) + distance_to_edge = np.median(np.abs(lane_line2_y - edge_y_interp)) + + return max(distance_to_lane, distance_to_edge) + + +def is_url_pingable(url): + """ + Check if a URL is accessible and responding. + Used to verify Mapbox/Overpass API availability before making requests. + + Args: + url: URL to ping + + Returns: + Boolean indicating if URL is accessible + """ + if not url: + return False + + if requests is None: + return False + + if not hasattr(is_url_pingable, "session"): + is_url_pingable.session = requests.Session() + is_url_pingable.session.headers.update({"User-Agent": "iqpilot-ping-test/1.0"}) + + try: + response = is_url_pingable.session.head(url, timeout=10, allow_redirects=True) + if response.status_code in (405, 501): + response = is_url_pingable.session.get(url, timeout=10, allow_redirects=True, stream=True) + + is_accessible = response.ok + response.close() + return is_accessible + except Exception: + return False diff --git a/iqpilot/common/slc_variables.py b/iqpilot/common/slc_variables.py new file mode 100644 index 000000000..80278d580 --- /dev/null +++ b/iqpilot/common/slc_variables.py @@ -0,0 +1,35 @@ +# Earth radius in meters (for GPS calculations) +EARTH_RADIUS = 6378137 + +# Mapbox API limits +FREE_MAPBOX_REQUESTS = 100_000 + +# Speed limit offset zones for different unit systems +# Each entry is (min_speed_ms, max_speed_ms, param_name); the param value is a +# percent offset applied to the resolved limit (e.g. 10 -> +10%), lower bound inclusive + +OFFSET_PERCENT_MAX = 50.0 + +OFFSET_MAP_IMPERIAL = [ + (0, 8.94, "speed_limit_offset1"), # 0-20 mph + (8.94, 17.88, "speed_limit_offset2"), # 20-40 mph + (17.88, float("inf"), "speed_limit_offset3"), # 40+ mph +] + +OFFSET_MAP_METRIC = [ + (0, 8.33, "speed_limit_offset1"), # 0-30 km/h + (8.33, 16.67, "speed_limit_offset2"), # 30-60 km/h + (16.67, float("inf"), "speed_limit_offset3"), # 60+ km/h +] + +# Speed limit filler constants +BOUNDING_BOX_RADIUS_DEGREE = 0.1 +MAX_ENTRIES = 1_000_000 +MAX_OVERPASS_DATA_BYTES = 1_073_741_824 +MAX_OVERPASS_REQUESTS = 10_000 +METERS_PER_DEG_LAT = 111_320 +VETTING_INTERVAL_DAYS = 7 + +# Overpass API URLs +OVERPASS_API_URL = "https://overpass-api.de/api/interpreter" +OVERPASS_STATUS_URL = "https://overpass-api.de/api/status" diff --git a/iqpilot/common/speed_assist_tiers.py b/iqpilot/common/speed_assist_tiers.py new file mode 100644 index 000000000..ef94c1bb1 --- /dev/null +++ b/iqpilot/common/speed_assist_tiers.py @@ -0,0 +1,20 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Engagement tiers for the speed-assist feature. A tier is persisted as an integer +under the "IQSpeedAssistMode" param; the ordinal IS the stored value and must remain +stable (0..3), ordered by how much the tier is allowed to intervene. +""" +from enum import IntEnum + +STORE_KEY = "IQSpeedAssistMode" + +# none -> just display the limit -> highlight overspeed -> move the set speed +SpeedAssistTier = IntEnum("SpeedAssistTier", "DISABLED ADVISORY ALERTING ACTUATING", start=0) + +DEFAULT_TIER = SpeedAssistTier.ADVISORY + + +def actuates_speed(tier) -> bool: + """Only the top tier is permitted to drive the cruise set speed.""" + return int(tier) == SpeedAssistTier.ACTUATING diff --git a/iqpilot/common/spinner.py b/iqpilot/common/spinner.py new file mode 100755 index 000000000..b823d09a4 --- /dev/null +++ b/iqpilot/common/spinner.py @@ -0,0 +1,52 @@ +import os +import subprocess +from iqpilot.common.basedir import BASEDIR + + +class Spinner: + def __init__(self): + try: + self.spinner_proc = subprocess.Popen(["./spinner.py"], + stdin=subprocess.PIPE, + cwd=os.path.join(BASEDIR, "iqpilot", "system", "ui"), + close_fds=True) + except OSError: + self.spinner_proc = None + + def __enter__(self): + return self + + def update(self, spinner_text: str): + if self.spinner_proc is not None: + self.spinner_proc.stdin.write(spinner_text.encode('utf8') + b"\n") + try: + self.spinner_proc.stdin.flush() + except BrokenPipeError: + pass + + def update_progress(self, cur: float, total: float): + self.update(str(round(100 * cur / total))) + + def close(self): + if self.spinner_proc is not None: + self.spinner_proc.kill() + try: + self.spinner_proc.communicate(timeout=2.) + except subprocess.TimeoutExpired: + print("WARNING: failed to kill spinner") + self.spinner_proc = None + + def __del__(self): + self.close() + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + + +if __name__ == "__main__": + import time + with Spinner() as s: + s.update("Spinner text") + time.sleep(5.0) + print("gone") + time.sleep(5.0) diff --git a/iqpilot/common/stat_live.py b/iqpilot/common/stat_live.py new file mode 100644 index 000000000..3901c448d --- /dev/null +++ b/iqpilot/common/stat_live.py @@ -0,0 +1,73 @@ +import numpy as np + +class RunningStat: + # tracks realtime mean and standard deviation without storing any data + def __init__(self, priors=None, max_trackable=-1): + self.max_trackable = max_trackable + if priors is not None: + # initialize from history + self.M = priors[0] + self.S = priors[1] + self.n = priors[2] + self.M_last = self.M + self.S_last = self.S + + else: + self.reset() + + def reset(self): + self.M = 0. + self.S = 0. + self.M_last = 0. + self.S_last = 0. + self.n = 0 + + def push_data(self, new_data): + # short term memory hack + if self.max_trackable < 0 or self.n < self.max_trackable: + self.n += 1 + if self.n == 0: + self.M_last = new_data + self.M = self.M_last + self.S_last = 0. + else: + self.M = self.M_last + (new_data - self.M_last) / self.n + self.S = self.S_last + (new_data - self.M_last) * (new_data - self.M) + self.M_last = self.M + self.S_last = self.S + + def mean(self): + return self.M + + def variance(self): + if self.n >= 2: + return self.S / (self.n - 1.) + else: + return 0 + + def std(self): + return np.sqrt(self.variance()) + + def params_to_save(self): + return [self.M, self.S, self.n] + +class RunningStatFilter: + def __init__(self, raw_priors=None, filtered_priors=None, max_trackable=-1): + self.raw_stat = RunningStat(raw_priors, -1) + self.filtered_stat = RunningStat(filtered_priors, max_trackable) + + def reset(self): + self.raw_stat.reset() + self.filtered_stat.reset() + + def push_and_update(self, new_data): + _std_last = self.raw_stat.std() + self.raw_stat.push_data(new_data) + _delta_std = self.raw_stat.std() - _std_last + if _delta_std <= 0: + self.filtered_stat.push_data(new_data) + else: + pass + # self.filtered_stat.push_data(self.filtered_stat.mean()) + +# class SequentialBayesian(): diff --git a/iqpilot/common/steer_delay.py b/iqpilot/common/steer_delay.py new file mode 100644 index 000000000..349f975d3 --- /dev/null +++ b/iqpilot/common/steer_delay.py @@ -0,0 +1,60 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Chooses which steer-actuator delay the lateral controllers run with: the value the +live estimator learned, or the driver's fixed software delay — gated by the +"IQLiveSteerDelay" param. The pick is mirrored into "IQSteerDelayCache" so consumers that do +not subscribe to lateralDelay can still read the current value. +""" +from iqpilot.cereal import car +from iqpilot.common.params import Params + +_ENABLE_KEY = "IQLiveSteerDelay" +_FIXED_KEY = "IQSoftwareSteerDelay" +_CACHE_KEY = "IQSteerDelayCache" + + +def fixed_steer_delay(params, stock_delay): + """The rack's own delay plus the driver's IQSoftwareSteerDelay offset, as the UI reports it.""" + return stock_delay + float(params.get(_FIXED_KEY, return_default=True)) + + +def resolve_steer_delay(params, stock_delay): + """Learned lateral delay while live-learning is enabled, otherwise the driver's fixed delay.""" + if not params.get_bool(_ENABLE_KEY): + return fixed_steer_delay(params, stock_delay) + return float(params.get(_CACHE_KEY, return_default=True)) + + +def lateral_action_delay(params, car_params, live_delay): + """Delay the lateral path should be planned against. + + Angle cars honour the IQLiveSteerDelay toggle so that with live learning off the + estimate never reaches the path: lagd cross-correlates against localizer lateral + accel, so it reports whole-vehicle response (~0.36 s measured on VW MQB, 0.44 s on + Tesla) where the lookahead wants actuator delay (~0.10 s). Torque cars keep the + live estimate. + """ + if car_params.steerControlType == car.CarParams.SteerControlType.angle: + return resolve_steer_delay(params, car_params.steerActuatorDelay) + return live_delay + + +def cached_steer_delay(): + """Last value SteerDelayPublisher mirrored into the param — usable without a + lateralDelay subscription (e.g. at process startup).""" + return Params().get(_CACHE_KEY, return_default=True) + + +class SteerDelayPublisher: + """Refreshes IQSteerDelayCache every lag message: the learned live delay when the + toggle is on, else the actuator delay plus the driver's fixed software offset.""" + + def __init__(self, car_params): + self._params = Params() + self._actuator_delay = car_params.steerActuatorDelay + + def update(self, lag_msg): + live = self._params.get_bool(_ENABLE_KEY) + value = lag_msg.lateralDelay.lateralDelay if live else fixed_steer_delay(self._params, self._actuator_delay) + self._params.put_nonblocking(_CACHE_KEY, value) diff --git a/iqpilot/common/swaglog.py b/iqpilot/common/swaglog.py new file mode 100644 index 000000000..f8fd9d392 --- /dev/null +++ b/iqpilot/common/swaglog.py @@ -0,0 +1,165 @@ +import logging +import os +import sys +import time +import warnings +from pathlib import Path +from logging.handlers import BaseRotatingHandler + +import zmq + +from iqpilot.common.logging_extra import SwagLogger, SwagFormatter, SwagLogFileFormatter +from iqpilot.system.hardware.hw import Paths + + +def get_file_handler(): + Path(Paths.swaglog_root()).mkdir(parents=True, exist_ok=True) + base_filename = os.path.join(Paths.swaglog_root(), "swaglog") + handler = SwaglogRotatingFileHandler(base_filename) + return handler + +class SwaglogRotatingFileHandler(BaseRotatingHandler): + def __init__(self, base_filename, interval=60, max_bytes=1024*256, backup_count=2500, encoding=None): + super().__init__(base_filename, mode="a", encoding=encoding, delay=True) + self.base_filename = base_filename + self.interval = interval # seconds + self.max_bytes = max_bytes + self.backup_count = backup_count + self.log_files = self.get_existing_logfiles() + log_indexes = [f.split(".")[-1] for f in self.log_files] + self.last_file_idx = max([int(i) for i in log_indexes if i.isdigit()] or [-1]) + self.last_rollover = None + self.doRollover() + + def _open(self): + self.last_rollover = time.monotonic() + self.last_file_idx += 1 + next_filename = f"{self.base_filename}.{self.last_file_idx:010}" + stream = open(next_filename, self.mode, encoding=self.encoding) + self.log_files.insert(0, next_filename) + return stream + + def get_existing_logfiles(self): + log_files = list() + base_dir = os.path.dirname(self.base_filename) + for fn in os.listdir(base_dir): + fp = os.path.join(base_dir, fn) + if fp.startswith(self.base_filename) and os.path.isfile(fp): + log_files.append(fp) + return sorted(log_files) + + def shouldRollover(self, record): + size_exceeded = self.max_bytes > 0 and self.stream.tell() >= self.max_bytes + time_exceeded = self.interval > 0 and self.last_rollover + self.interval <= time.monotonic() + return size_exceeded or time_exceeded + + def doRollover(self): + if self.stream: + self.stream.close() + self.stream = self._open() + + if self.backup_count > 0: + while len(self.log_files) > self.backup_count: + to_delete = self.log_files.pop() + if os.path.exists(to_delete): # just being safe, should always exist + os.remove(to_delete) + +class UnixDomainSocketHandler(logging.Handler): + def __init__(self, formatter): + logging.Handler.__init__(self) + self.setFormatter(formatter) + self.pid = None + + self.zctx = None + self.sock = None + + def __del__(self): + self.close() + + def close(self): + if self.sock is not None: + self.sock.close() + if self.zctx is not None: + self.zctx.term() + + def connect(self): + self.zctx = zmq.Context() + self.sock = self.zctx.socket(zmq.PUSH) + self.sock.setsockopt(zmq.LINGER, 10) + self.sock.connect(Paths.swaglog_ipc()) + self.pid = os.getpid() + + def emit(self, record): + if os.getpid() != self.pid: + # TODO suppresses warning about forking proc with zmq socket, fix root cause + warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*") + self.connect() + + msg = self.format(record).rstrip('\n') + # print("SEND".format(repr(msg))) + try: + s = chr(record.levelno)+msg + self.sock.send(s.encode('utf8'), zmq.NOBLOCK) + except zmq.error.Again: + # drop :/ + pass + + +class ForwardingHandler(logging.Handler): + def __init__(self, target_logger): + super().__init__() + self.target_logger = target_logger + + def emit(self, record): + self.target_logger.handle(record) + + +def add_file_handler(log): + """ + Function to add the file log handler to swaglog. + This can be used to store logs when logmessaged is not running. + """ + handler = get_file_handler() + handler.setFormatter(SwagLogFileFormatter(log)) + log.addHandler(handler) + + +cloudlog = log = SwagLogger() +log.setLevel(logging.DEBUG) + + +class PrettyConsoleFormatter(logging.Formatter): + # StreamHandler writes to stderr, so tty-gate on that + _COLOR = sys.stderr.isatty() and os.environ.get('NO_COLOR') is None + + def format(self, record): + msg = record.getMessage() + if not self._COLOR: + return f"{record.filename}: {msg}" + lvl = record.levelno + if lvl >= 50: lc, ln = "\033[1;38;5;196m", "CRIT" + elif lvl >= 40: lc, ln = "\033[1;38;5;203m", " ERR" + elif lvl >= 30: lc, ln = "\033[38;5;214m", "WARN" + elif lvl >= 20: lc, ln = "\033[38;5;110m", "info" + else: lc, ln = "\033[38;5;244m", " dbg" + body = f"\033[1;38;5;210m{msg}\033[0m" if lvl >= 40 else msg + src = "" if record.filename == "(unknown file)" else f"\033[2m{record.filename}\033[0m " + return f"{lc}{ln:>4}\033[0m {src}{body}" + + +outhandler = logging.StreamHandler() +outhandler.setFormatter(PrettyConsoleFormatter()) + +print_level = os.environ.get('LOGPRINT', 'warning') +if print_level == 'debug': + outhandler.setLevel(logging.DEBUG) +elif print_level == 'info': + outhandler.setLevel(logging.INFO) +elif print_level == 'warning': + outhandler.setLevel(logging.WARNING) + +ipchandler = UnixDomainSocketHandler(SwagFormatter(log)) + +log.addHandler(outhandler) +# logs are sent through IPC before writing to disk to prevent disk I/O blocking +log.addHandler(ipchandler) diff --git a/iqpilot/common/tests/.gitignore b/iqpilot/common/tests/.gitignore new file mode 100644 index 000000000..6cddfc7bd --- /dev/null +++ b/iqpilot/common/tests/.gitignore @@ -0,0 +1 @@ +test_common diff --git a/iqpilot/common/tests/__init__.py b/iqpilot/common/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/common/tests/test_file_helpers.py b/iqpilot/common/tests/test_file_helpers.py new file mode 100644 index 000000000..18c6b7e97 --- /dev/null +++ b/iqpilot/common/tests/test_file_helpers.py @@ -0,0 +1,19 @@ +import os +from uuid import uuid4 + +from iqpilot.common.utils import atomic_write + + +class TestFileHelpers: + def run_atomic_write_func(self, atomic_write_func): + path = f"/tmp/tmp{uuid4()}" + with atomic_write_func(path) as f: + f.write("test") + assert not os.path.exists(path) + + with open(path) as f: + assert f.read() == "test" + os.remove(path) + + def test_atomic_write(self): + self.run_atomic_write_func(atomic_write) diff --git a/iqpilot/common/tests/test_markdown.py b/iqpilot/common/tests/test_markdown.py new file mode 100644 index 000000000..385a51e6c --- /dev/null +++ b/iqpilot/common/tests/test_markdown.py @@ -0,0 +1,15 @@ +import os + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.markdown import parse_markdown + + +class TestMarkdown: + def test_all_release_notes(self): + with open(os.path.join(BASEDIR, "iqpilot", "docs", "CHANGELOG.md")) as f: + release_notes = f.read().split("\n\n") + assert len(release_notes) > 10 + + for rn in release_notes: + md = parse_markdown(rn) + assert len(md) > 0 diff --git a/iqpilot/common/tests/test_params.py b/iqpilot/common/tests/test_params.py new file mode 100644 index 000000000..80bfa3c03 --- /dev/null +++ b/iqpilot/common/tests/test_params.py @@ -0,0 +1,145 @@ +import pytest +import datetime +import os +import threading +import time +import uuid + +from iqpilot.common.params import Params, ParamKeyFlag, UnknownKeyName + +class TestParams: + def setup_method(self): + self.params = Params() + + def test_params_put_and_get(self): + self.params.put("DongleId", "cb38263377b873ee") + assert self.params.get("DongleId") == "cb38263377b873ee" + + def test_params_non_ascii(self): + st = b"\xe1\x90\xff" + self.params.put("CarParams", st) + assert self.params.get("CarParams") == st + + def test_params_get_cleared_manager_start(self): + self.params.put("CarParams", b"test") + self.params.put("DongleId", "cb38263377b873ee") + assert self.params.get("CarParams") == b"test" + + undefined_param = self.params.get_param_path(uuid.uuid4().hex) + with open(undefined_param, "w") as f: + f.write("test") + assert os.path.isfile(undefined_param) + + self.params.clear_all(ParamKeyFlag.CLEAR_ON_MANAGER_START) + assert self.params.get("CarParams") is None + assert self.params.get("DongleId") is not None + assert not os.path.isfile(undefined_param) + + def test_params_two_things(self): + self.params.put("DongleId", "bob") + self.params.put("AthenadPid", 123) + assert self.params.get("DongleId") == "bob" + assert self.params.get("AthenadPid") == 123 + + def test_params_get_block(self): + def _delayed_writer(): + time.sleep(0.1) + self.params.put("CarParams", b"test") + threading.Thread(target=_delayed_writer).start() + assert self.params.get("CarParams") is None + assert self.params.get("CarParams", block=True) == b"test" + + def test_params_unknown_key_fails(self): + with pytest.raises(UnknownKeyName): + self.params.get("swag") + + with pytest.raises(UnknownKeyName): + self.params.get_bool("swag") + + with pytest.raises(UnknownKeyName): + self.params.put("swag", "abc") + + with pytest.raises(UnknownKeyName): + self.params.put_bool("swag", True) + + def test_remove_not_there(self): + assert self.params.get("CarParams") is None + self.params.remove("CarParams") + assert self.params.get("CarParams") is None + + def test_get_bool(self): + self.params.remove("IsMetric") + assert not self.params.get_bool("IsMetric") + + self.params.put_bool("IsMetric", True) + assert self.params.get_bool("IsMetric") + + self.params.put_bool("IsMetric", False) + assert not self.params.get_bool("IsMetric") + + self.params.put("IsMetric", True) + assert self.params.get_bool("IsMetric") + + self.params.put("IsMetric", False) + assert not self.params.get_bool("IsMetric") + + def test_navigation_disabled_default(self): + self.params.remove("NavigationEnabled") + assert not self.params.get_bool("NavigationEnabled") + + def test_put_non_blocking_with_get_block(self): + q = Params() + def _delayed_writer(): + time.sleep(0.1) + Params().put_nonblocking("CarParams", b"test") + threading.Thread(target=_delayed_writer).start() + assert q.get("CarParams") is None + assert q.get("CarParams", True) == b"test" + + def test_put_bool_non_blocking_with_get_block(self): + q = Params() + def _delayed_writer(): + time.sleep(0.1) + Params().put_bool_nonblocking("CarParams", True) + threading.Thread(target=_delayed_writer).start() + assert q.get("CarParams") is None + assert q.get("CarParams", True) == b"1" + + def test_params_all_keys(self): + keys = Params().all_keys() + + # sanity checks + assert len(keys) > 20 + assert len(keys) == len(set(keys)) + assert b"CarParams" in keys + + def test_params_default_value(self): + self.params.remove("LanguageSetting") + self.params.remove("LongitudinalPersonality") + self.params.remove("LiveParameters") + + assert self.params.get("LanguageSetting") is None + assert self.params.get("LanguageSetting", return_default=False) is None + assert isinstance(self.params.get("LanguageSetting", return_default=True), str) + assert isinstance(self.params.get("LongitudinalPersonality", return_default=True), int) + assert self.params.get("LiveParameters") is None + assert self.params.get("LiveParameters", return_default=True) is None + + def test_params_get_type(self): + # json + self.params.put("ApiCache_FirehoseStats", {"a": 0}) + assert self.params.get("ApiCache_FirehoseStats") == {"a": 0} + + # int + self.params.put("BootCount", 1441) + assert self.params.get("BootCount") == 1441 + + # bool + self.params.put("AdbEnabled", True) + assert self.params.get("AdbEnabled") + assert isinstance(self.params.get("AdbEnabled"), bool) + + # time + now = datetime.datetime.now(datetime.UTC) + self.params.put("InstallDate", now) + assert self.params.get("InstallDate") == now diff --git a/iqpilot/common/tests/test_realtime.py b/iqpilot/common/tests/test_realtime.py new file mode 100644 index 000000000..9ef7a602d --- /dev/null +++ b/iqpilot/common/tests/test_realtime.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +import pytest + +from iqpilot.common.realtime import config_background_thread, Ratekeeper + + +class MonotonicClock: + def __init__(self) -> None: + self.now = 0. + + def advance(self, seconds: float) -> None: + self.now += seconds + + def __call__(self) -> float: + return self.now + + +def test_ratekeeper_reset_discards_accumulated_lag(monkeypatch): + clock = MonotonicClock() + monkeypatch.setattr("iqpilot.common.realtime.time.monotonic", clock) + rk = Ratekeeper(100) + + rk.monitor_time() + clock.advance(0.075) + rk.monitor_time() + assert rk.remaining == pytest.approx(-0.055) + assert rk.lag == pytest.approx(0.055) + + rk.reset() + assert rk.remaining == 0. + assert rk.lag == 0. + + rk.monitor_time() + assert rk.remaining == pytest.approx(0.01) + assert rk.lag == 0. + + +def test_ratekeeper_reset_preserves_frame_count(monkeypatch): + clock = MonotonicClock() + monkeypatch.setattr("iqpilot.common.realtime.time.monotonic", clock) + rk = Ratekeeper(100) + + rk.monitor_time() + clock.advance(0.01) + rk.monitor_time() + frame = rk.frame + + rk.reset() + assert rk.frame == frame + + +def test_config_background_thread_restores_normal_scheduling(monkeypatch): + calls = [] + monkeypatch.setattr("iqpilot.common.realtime.sys.platform", "linux") + monkeypatch.setattr("iqpilot.common.realtime.PC", False) + monkeypatch.setattr("iqpilot.common.realtime.os.cpu_count", lambda: 8) + monkeypatch.setattr("iqpilot.common.realtime.os.SCHED_OTHER", 0, raising=False) + monkeypatch.setattr("iqpilot.common.realtime.os.sched_param", lambda priority: priority, raising=False) + monkeypatch.setattr("iqpilot.common.realtime.os.sched_setscheduler", lambda pid, policy, param: calls.append((pid, policy, param)), raising=False) + monkeypatch.setattr("iqpilot.common.realtime.os.sched_setaffinity", lambda pid, cores: calls.append((pid, set(cores))), raising=False) + + config_background_thread() + + assert calls == [(0, 0, 0), (0, set(range(8)))] diff --git a/iqpilot/common/tests/test_simple_kalman.py b/iqpilot/common/tests/test_simple_kalman.py new file mode 100644 index 000000000..6791e85e3 --- /dev/null +++ b/iqpilot/common/tests/test_simple_kalman.py @@ -0,0 +1,29 @@ +from iqpilot.common.simple_kalman import KF1D + + +class TestSimpleKalman: + def setup_method(self): + dt = 0.01 + x0_0 = 0.0 + x1_0 = 0.0 + A0_0 = 1.0 + A0_1 = dt + A1_0 = 0.0 + A1_1 = 1.0 + C0_0 = 1.0 + C0_1 = 0.0 + K0_0 = 0.12287673 + K1_0 = 0.29666309 + + self.kf = KF1D(x0=[[x0_0], [x1_0]], + A=[[A0_0, A0_1], [A1_0, A1_1]], + C=[C0_0, C0_1], + K=[[K0_0], [K1_0]]) + + def test_getter_setter(self): + self.kf.set_x([[1.0], [1.0]]) + assert self.kf.x == [[1.0], [1.0]] + + def test_update_returns_state(self): + x = self.kf.update(100) + assert x == [i[0] for i in self.kf.x] diff --git a/iqpilot/common/tests/test_steer_delay.py b/iqpilot/common/tests/test_steer_delay.py new file mode 100644 index 000000000..7050c3bcb --- /dev/null +++ b/iqpilot/common/tests/test_steer_delay.py @@ -0,0 +1,91 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import time + +import pytest + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car +from iqpilot.common.params import Params +from iqpilot.common.steer_delay import ( + SteerDelayPublisher, + cached_steer_delay, + fixed_steer_delay, + lateral_action_delay, + resolve_steer_delay, +) + +ANGLE = car.CarParams.SteerControlType.angle +TORQUE = car.CarParams.SteerControlType.torque + +LIVE_DELAY = 0.4387 +RACK_DELAY = 0.10 +OFFSET = 0.05 + + +@pytest.fixture +def params(tmp_path, monkeypatch): + monkeypatch.setenv("PARAMS_ROOT", str(tmp_path)) + p = Params() + p.put("IQSteerDelayCache", LIVE_DELAY) + p.put("IQSoftwareSteerDelay", OFFSET) + return p + + +def _car_params(steer_control_type): + cp = car.CarParams.new_message() + cp.steerControlType = steer_control_type + cp.steerActuatorDelay = RACK_DELAY + return cp + + +def _lateral_delay_msg(value): + msg = messaging.new_message("lateralDelay") + msg.lateralDelay.lateralDelay = value + return msg.as_reader() + + +def test_params_fixture_is_isolated_from_the_real_device(params, tmp_path): + assert str(tmp_path) in params.get_param_path("") + + +@pytest.mark.parametrize("live_enabled", [True, False]) +def test_torque_cars_always_use_live_delay(params, live_enabled): + params.put_bool("IQLiveSteerDelay", live_enabled) + assert lateral_action_delay(params, _car_params(TORQUE), LIVE_DELAY) == pytest.approx(LIVE_DELAY) + + +def test_angle_cars_ignore_live_delay_when_self_tuning_is_off(params): + params.put_bool("IQLiveSteerDelay", False) + delay = lateral_action_delay(params, _car_params(ANGLE), LIVE_DELAY) + assert delay == pytest.approx(RACK_DELAY + OFFSET) + assert delay != pytest.approx(LIVE_DELAY) + + +def test_angle_cars_use_cached_delay_when_self_tuning_is_on(params): + params.put_bool("IQLiveSteerDelay", True) + assert lateral_action_delay(params, _car_params(ANGLE), LIVE_DELAY) == pytest.approx(LIVE_DELAY) + + +@pytest.mark.parametrize("offset", [0.05, 0.20, 0.50]) +def test_manual_offset_reaches_the_path_and_matches_what_the_ui_reports(params, offset): + params.put_bool("IQLiveSteerDelay", False) + params.put("IQSoftwareSteerDelay", offset) + ui_total = RACK_DELAY + offset + assert fixed_steer_delay(params, RACK_DELAY) == pytest.approx(ui_total) + assert lateral_action_delay(params, _car_params(ANGLE), LIVE_DELAY) == pytest.approx(ui_total) + + +@pytest.mark.parametrize("live_enabled", [False, True]) +def test_publisher_writes_the_value_the_resolver_reads(params, live_enabled): + params.put_bool("IQLiveSteerDelay", live_enabled) + params.put("IQSteerDelayCache", -1.0) + SteerDelayPublisher(_car_params(ANGLE)).update(_lateral_delay_msg(LIVE_DELAY)) + + expected = LIVE_DELAY if live_enabled else RACK_DELAY + OFFSET + deadline = time.monotonic() + 5.0 + while cached_steer_delay() != pytest.approx(expected) and time.monotonic() < deadline: + time.sleep(0.01) + assert cached_steer_delay() == pytest.approx(expected) + assert resolve_steer_delay(params, RACK_DELAY) == pytest.approx(expected) diff --git a/iqpilot/common/text_window.py b/iqpilot/common/text_window.py new file mode 100755 index 000000000..7fe86c10d --- /dev/null +++ b/iqpilot/common/text_window.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +import os +import time +import subprocess +from iqpilot.common.basedir import BASEDIR + + +class TextWindow: + def __init__(self, text): + try: + self.text_proc = subprocess.Popen(["./text.py", text], + stdin=subprocess.PIPE, + cwd=os.path.join(BASEDIR, "iqpilot", "system", "ui"), + close_fds=True) + except OSError: + self.text_proc = None + + def get_status(self): + if self.text_proc is not None: + self.text_proc.poll() + return self.text_proc.returncode + return None + + def __enter__(self): + return self + + def close(self): + if self.text_proc is not None: + self.text_proc.terminate() + self.text_proc = None + + def wait_for_exit(self): + if self.text_proc is not None: + while True: + if self.get_status() == 1: + return + time.sleep(0.1) + + def __del__(self): + self.close() + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + + +if __name__ == "__main__": + text = """Traceback (most recent call last): + File "./controlsd.py", line 608, in + main() + File "./controlsd.py", line 604, in main + controlsd_thread(sm, pm, logcan) + File "./controlsd.py", line 455, in controlsd_thread + 1/0 +ZeroDivisionError: division by zero""" + print(text) + + with TextWindow(text) as s: + for _ in range(100): + if s.get_status() == 1: + print("Got exit button") + break + time.sleep(0.1) + print("gone") diff --git a/iqpilot/common/time_helpers.py b/iqpilot/common/time_helpers.py new file mode 100644 index 000000000..8564e270c --- /dev/null +++ b/iqpilot/common/time_helpers.py @@ -0,0 +1,15 @@ +import datetime +from pathlib import Path + +MIN_DATE = datetime.datetime(year=2025, month=2, day=21) + +def min_date(): + # on systemd systems, the default time is the systemd build time + systemd_path = Path("/lib/systemd/systemd") + if systemd_path.exists(): + d = datetime.datetime.fromtimestamp(systemd_path.stat().st_mtime) + return max(MIN_DATE, d + datetime.timedelta(days=1)) + return MIN_DATE + +def system_time_valid(): + return datetime.datetime.now() > min_date() diff --git a/iqpilot/common/timeout.py b/iqpilot/common/timeout.py new file mode 100644 index 000000000..d0b0ce063 --- /dev/null +++ b/iqpilot/common/timeout.py @@ -0,0 +1,27 @@ +import signal + +class TimeoutException(Exception): + pass + +class Timeout: + """ + Timeout context manager. + For example this code will raise a TimeoutException: + with Timeout(seconds=5, error_msg="Sleep was too long"): + time.sleep(10) + """ + def __init__(self, seconds, error_msg=None): + if error_msg is None: + error_msg = f'Timed out after {seconds} seconds' + self.seconds = seconds + self.error_msg = error_msg + + def handle_timeout(self, signume, frame): + raise TimeoutException(self.error_msg) + + def __enter__(self): + signal.signal(signal.SIGALRM, self.handle_timeout) + signal.alarm(self.seconds) + + def __exit__(self, exc_type, exc_val, exc_tb): + signal.alarm(0) diff --git a/iqpilot/common/transformations/.gitignore b/iqpilot/common/transformations/.gitignore new file mode 100644 index 000000000..a67290f09 --- /dev/null +++ b/iqpilot/common/transformations/.gitignore @@ -0,0 +1,2 @@ +transformations +transformations.cpp diff --git a/iqpilot/common/transformations/README.md b/iqpilot/common/transformations/README.md new file mode 100644 index 000000000..42a060da8 --- /dev/null +++ b/iqpilot/common/transformations/README.md @@ -0,0 +1,70 @@ + +Reference Frames +------ +Many reference frames are used throughout. This +folder contains all helper functions needed to +transform between them. Generally this is done +by generating a rotation matrix and multiplying. + + +| Name | [x, y, z] | Units | Notes | +| :-------------: |:-------------:| :-----:| :----: | +| Geodetic | [Latitude, Longitude, Altitude] | geodetic coordinates | Sometimes used as [lon, lat, alt], avoid this frame. | +| ECEF | [x, y, z] | meters | We use **ITRF14 (IGS14)**, NOT NAD83.
    This is the global Mesh3D frame. | +| NED | [North, East, Down] | meters | Relative to earth's surface, useful for visualizing. | +| Device | [Forward, Right, Down] | meters | This is the Mesh3D local frame.
    Relative to camera, **not imu.**
    ![img](http://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/RPY_angles_of_airplanes.png/440px-RPY_angles_of_airplanes.png)| +| Calibrated | [Forward, Right, Down] | meters | This is the frame the model outputs are in.
    More details below.
    | +| Car | [Forward, Right, Down] | meters | This is useful for estimating position of points on the road.
    More details below.
    | +| View | [Right, Down, Forward] | meters | Like device frame, but according to camera conventions. | +| Camera | [u, v, focal] | pixels | Like view frame, but 2d on the camera image.| +| Normalized Camera | [u / focal, v / focal, 1] | / | | +| Model | [u, v, focal] | pixels | The sampled rectangle of the full camera frame the model uses. | +| Normalized Model | [u / focal, v / focal, 1] | / | | + + + + +Orientation Conventions +------ +Quaternions, rotation matrices and euler angles are three +equivalent representations of orientation and all three are +used throughout the code base. + +For euler angles the preferred convention is [roll, pitch, yaw] +which corresponds to rotations around the [x, y, z] axes. All +euler angles should always be in radians or radians/s unless +for plotting or display purposes. For quaternions the hamilton +notations is preferred which is [qw, qx, qy, qz]. All quaternions +should always be normalized with a strictly positive qw. **These +quaternions are a unique representation of orientation whereas euler angles +or rotation matrices are not.** + +To rotate from one frame into another with euler angles the +convention is to rotate around roll, then pitch and then yaw, +while rotating around the rotated axes, not the original axes. + + +Car frame +------ +Device frame is aligned with the road-facing camera used by openpilot. However, when controlling the vehicle it is helpful to think in a reference frame aligned with the vehicle. These two reference frames can be different. + +The orientation of car frame is defined to be aligned with the car's direction of travel and the road plane when the vehicle is driving on a flat road and not turning. The origin of car frame is defined to be directly below device frame (in car frame), such that it is on the road plane. The position and orientation of this frame is not necessarily always aligned with the direction of travel or the road plane due to suspension movements and other effects. + + +Calibrated frame +------ +It is helpful for openpilot's driving model to take in images that look similar when mounted differently in different cars. To achieve this we "calibrate" the images by transforming it into calibrated frame. Calibrated frame is defined to be aligned with car frame in pitch and yaw, and aligned with device frame in roll. It also has the same origin as device frame. + + +Example +------ +To transform global Mesh3D positions and orientations (positions_ecef, quats_ecef) into the local frame described by the +first position and orientation from Mesh3D one would do: +``` +ecef_from_local = rot_from_quat(quats_ecef[0]) +local_from_ecef = ecef_from_local.T +positions_local = np.einsum('ij,kj->ki', local_from_ecef, postions_ecef - positions_ecef[0]) +rotations_global = rot_from_quat(quats_ecef) +rotations_local = np.einsum('ij,kjl->kil', local_from_ecef, rotations_global) +eulers_local = euler_from_rot(rotations_local) +``` diff --git a/iqpilot/common/transformations/__init__.py b/iqpilot/common/transformations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/common/transformations/camera.py b/iqpilot/common/transformations/camera.py new file mode 100644 index 000000000..d9428072e --- /dev/null +++ b/iqpilot/common/transformations/camera.py @@ -0,0 +1,179 @@ +import itertools +import numpy as np +from dataclasses import dataclass + +import iqpilot.common.transformations.orientation as orient + +## -- hardcoded hardware params -- +@dataclass(frozen=True) +class CameraConfig: + width: int + height: int + focal_length: float + + @property + def size(self): + return (self.width, self.height) + + @property + def intrinsics(self): + # aka 'K' aka camera_frame_from_view_frame + return np.array([ + [self.focal_length, 0.0, float(self.width)/2], + [0.0, self.focal_length, float(self.height)/2], + [0.0, 0.0, 1.0] + ]) + + @property + def intrinsics_inv(self): + # aka 'K_inv' aka view_frame_from_camera_frame + return np.linalg.inv(self.intrinsics) + +@dataclass(frozen=True) +class _NoneCameraConfig(CameraConfig): + width: int = 0 + height: int = 0 + focal_length: float = 0 + +@dataclass(frozen=True) +class DeviceCameraConfig: + fcam: CameraConfig + dcam: CameraConfig + ecam: CameraConfig + + def all_cams(self): + for cam in ['fcam', 'dcam', 'ecam']: + if not isinstance(getattr(self, cam), _NoneCameraConfig): + yield cam, getattr(self, cam) + +_ar_ox_fisheye = CameraConfig(1928, 1208, 567.0) # focal length probably wrong? magnification is not consistent across frame +_os_fisheye = CameraConfig(2688 // 2, 1520 // 2, 567.0 / 4 * 3) +_ar_ox_config = DeviceCameraConfig(CameraConfig(1928, 1208, 2648.0), _ar_ox_fisheye, _ar_ox_fisheye) +_os_config = DeviceCameraConfig(CameraConfig(2688 // 2, 1520 // 2, 1522.0 * 3 / 4), _os_fisheye, _os_fisheye) +_neo_config = DeviceCameraConfig(CameraConfig(1164, 874, 910.0), CameraConfig(816, 612, 650.0), _NoneCameraConfig()) + +DEVICE_CAMERAS = { + # A "device camera" is defined by a device type and sensor + + # sensor type was never set on eon/neo/two + ("neo", "unknown"): _neo_config, + # unknown here is AR0231, field was added with OX03C10 support + ("tici", "unknown"): _ar_ox_config, + + # before deviceState.deviceType was set, assume tici AR config + ("unknown", "ar0231"): _ar_ox_config, + ("unknown", "ox03c10"): _ar_ox_config, + + # simulator (emulates a tici) + ("pc", "unknown"): _ar_ox_config, +} +prods = itertools.product(('tici', 'tizi', 'mici'), (('ar0231', _ar_ox_config), ('ox03c10', _ar_ox_config), ('os04c10', _os_config))) +DEVICE_CAMERAS.update({(d, c[0]): c[1] for d, c in prods}) + +# device/mesh : x->forward, y-> right, z->down +# view : x->right, y->down, z->forward +device_frame_from_view_frame = np.array([ + [ 0., 0., 1.], + [ 1., 0., 0.], + [ 0., 1., 0.] +]) +view_frame_from_device_frame = device_frame_from_view_frame.T + + +# aka 'extrinsic_matrix' +# road : x->forward, y -> left, z->up +def get_view_frame_from_road_frame(roll, pitch, yaw, height): + device_from_road = orient.rot_from_euler([roll, pitch, yaw]).dot(np.diag([1, -1, -1])) + view_from_road = view_frame_from_device_frame.dot(device_from_road) + return np.hstack((view_from_road, [[0], [height], [0]])) + + + +# aka 'extrinsic_matrix' +def get_view_frame_from_calib_frame(roll, pitch, yaw, height): + device_from_calib= orient.rot_from_euler([roll, pitch, yaw]) + view_from_calib = view_frame_from_device_frame.dot(device_from_calib) + return np.hstack((view_from_calib, [[0], [height], [0]])) + + +def vp_from_ke(m): + """ + Computes the vanishing point from the product of the intrinsic and extrinsic + matrices C = KE. + + The vanishing point is defined as lim x->infinity C (x, 0, 0, 1).T + """ + return (m[0, 0]/m[2, 0], m[1, 0]/m[2, 0]) + + +def roll_from_ke(m): + # note: different from calibration.h/RollAnglefromKE: i think that one's just wrong + return np.arctan2(-(m[1, 0] - m[1, 1] * m[2, 0] / m[2, 1]), + -(m[0, 0] - m[0, 1] * m[2, 0] / m[2, 1])) + + +def normalize(img_pts, intrinsics): + # normalizes image coordinates + # accepts single pt or array of pts + intrinsics_inv = np.linalg.inv(intrinsics) + img_pts = np.array(img_pts) + input_shape = img_pts.shape + img_pts = np.atleast_2d(img_pts) + img_pts = np.hstack((img_pts, np.ones((img_pts.shape[0], 1)))) + img_pts_normalized = img_pts.dot(intrinsics_inv.T) + img_pts_normalized[(img_pts < 0).any(axis=1)] = np.nan + return img_pts_normalized[:, :2].reshape(input_shape) + + +def denormalize(img_pts, intrinsics, width=np.inf, height=np.inf): + # denormalizes image coordinates + # accepts single pt or array of pts + img_pts = np.array(img_pts) + input_shape = img_pts.shape + img_pts = np.atleast_2d(img_pts) + img_pts = np.hstack((img_pts, np.ones((img_pts.shape[0], 1), dtype=img_pts.dtype))) + img_pts_denormalized = img_pts.dot(intrinsics.T) + if np.isfinite(width): + img_pts_denormalized[img_pts_denormalized[:, 0] > width] = np.nan + img_pts_denormalized[img_pts_denormalized[:, 0] < 0] = np.nan + if np.isfinite(height): + img_pts_denormalized[img_pts_denormalized[:, 1] > height] = np.nan + img_pts_denormalized[img_pts_denormalized[:, 1] < 0] = np.nan + return img_pts_denormalized[:, :2].reshape(input_shape) + + +def get_calib_from_vp(vp, intrinsics): + vp_norm = normalize(vp, intrinsics) + yaw_calib = np.arctan(vp_norm[0]) + pitch_calib = -np.arctan(vp_norm[1]*np.cos(yaw_calib)) + roll_calib = 0 + return roll_calib, pitch_calib, yaw_calib + + +def device_from_ecef(pos_ecef, orientation_ecef, pt_ecef): + # device from ecef frame + # device frame is x -> forward, y-> right, z -> down + # accepts single pt or array of pts + input_shape = pt_ecef.shape + pt_ecef = np.atleast_2d(pt_ecef) + ecef_from_device_rot = orient.rotations_from_quats(orientation_ecef) + device_from_ecef_rot = ecef_from_device_rot.T + pt_ecef_rel = pt_ecef - pos_ecef + pt_device = np.einsum('jk,ik->ij', device_from_ecef_rot, pt_ecef_rel) + return pt_device.reshape(input_shape) + + +def img_from_device(pt_device): + # img coordinates from pts in device frame + # first transforms to view frame, then to img coords + # accepts single pt or array of pts + input_shape = pt_device.shape + pt_device = np.atleast_2d(pt_device) + pt_view = np.einsum('jk,ik->ij', view_frame_from_device_frame, pt_device) + + # This function should never return negative depths + pt_view[pt_view[:, 2] < 0] = np.nan + + pt_img = pt_view/pt_view[:, 2:3] + return pt_img.reshape(input_shape)[:, :2] + diff --git a/iqpilot/common/transformations/coordinates.py b/iqpilot/common/transformations/coordinates.py new file mode 100644 index 000000000..7597ce10b --- /dev/null +++ b/iqpilot/common/transformations/coordinates.py @@ -0,0 +1,18 @@ +from iqpilot.common.transformations.orientation import numpy_wrap +from iqpilot.common.transformations.transformations import (ecef2geodetic_single, + geodetic2ecef_single) +from iqpilot.common.transformations.transformations import LocalCoord as LocalCoord_single + + +class LocalCoord(LocalCoord_single): + ecef2ned = numpy_wrap(LocalCoord_single.ecef2ned_single, (3,), (3,)) + ned2ecef = numpy_wrap(LocalCoord_single.ned2ecef_single, (3,), (3,)) + geodetic2ned = numpy_wrap(LocalCoord_single.geodetic2ned_single, (3,), (3,)) + ned2geodetic = numpy_wrap(LocalCoord_single.ned2geodetic_single, (3,), (3,)) + + +geodetic2ecef = numpy_wrap(geodetic2ecef_single, (3,), (3,)) +ecef2geodetic = numpy_wrap(ecef2geodetic_single, (3,), (3,)) + +geodetic_from_ecef = ecef2geodetic +ecef_from_geodetic = geodetic2ecef diff --git a/iqpilot/common/transformations/model.py b/iqpilot/common/transformations/model.py new file mode 100644 index 000000000..96b1e5411 --- /dev/null +++ b/iqpilot/common/transformations/model.py @@ -0,0 +1,70 @@ +import numpy as np + +from iqpilot.common.transformations.orientation import rot_from_euler +from iqpilot.common.transformations.camera import get_view_frame_from_calib_frame, view_frame_from_device_frame, _ar_ox_fisheye + +# segnet +SEGNET_SIZE = (512, 384) + +# MED model +MEDMODEL_INPUT_SIZE = (512, 256) +MEDMODEL_YUV_SIZE = (MEDMODEL_INPUT_SIZE[0], MEDMODEL_INPUT_SIZE[1] * 3 // 2) +MEDMODEL_CY = 47.6 + +medmodel_fl = 910.0 +medmodel_intrinsics = np.array([ + [medmodel_fl, 0.0, 0.5 * MEDMODEL_INPUT_SIZE[0]], + [0.0, medmodel_fl, MEDMODEL_CY], + [0.0, 0.0, 1.0]]) + + +# BIG model +BIGMODEL_INPUT_SIZE = (1024, 512) +BIGMODEL_YUV_SIZE = (BIGMODEL_INPUT_SIZE[0], BIGMODEL_INPUT_SIZE[1] * 3 // 2) + +bigmodel_fl = 910.0 +bigmodel_intrinsics = np.array([ + [bigmodel_fl, 0.0, 0.5 * BIGMODEL_INPUT_SIZE[0]], + [0.0, bigmodel_fl, 256 + MEDMODEL_CY], + [0.0, 0.0, 1.0]]) + + +# SBIG model (big model with the size of small model) +SBIGMODEL_INPUT_SIZE = (512, 256) +SBIGMODEL_YUV_SIZE = (SBIGMODEL_INPUT_SIZE[0], SBIGMODEL_INPUT_SIZE[1] * 3 // 2) + +sbigmodel_fl = 455.0 +sbigmodel_intrinsics = np.array([ + [sbigmodel_fl, 0.0, 0.5 * SBIGMODEL_INPUT_SIZE[0]], + [0.0, sbigmodel_fl, 0.5 * (256 + MEDMODEL_CY)], + [0.0, 0.0, 1.0]]) + +DM_INPUT_SIZE = (1440, 960) +dmonitoringmodel_fl = _ar_ox_fisheye.focal_length +dmonitoringmodel_intrinsics = np.array([ + [dmonitoringmodel_fl, 0.0, DM_INPUT_SIZE[0]/2], + [0.0, dmonitoringmodel_fl, DM_INPUT_SIZE[1]/2 - (_ar_ox_fisheye.height - DM_INPUT_SIZE[1])/2], + [0.0, 0.0, 1.0]]) + +bigmodel_frame_from_calib_frame = np.dot(bigmodel_intrinsics, + get_view_frame_from_calib_frame(0, 0, 0, 0)) + + +sbigmodel_frame_from_calib_frame = np.dot(sbigmodel_intrinsics, + get_view_frame_from_calib_frame(0, 0, 0, 0)) + +medmodel_frame_from_calib_frame = np.dot(medmodel_intrinsics, + get_view_frame_from_calib_frame(0, 0, 0, 0)) + +medmodel_frame_from_bigmodel_frame = np.dot(medmodel_intrinsics, np.linalg.inv(bigmodel_intrinsics)) + +calib_from_medmodel = np.linalg.inv(medmodel_frame_from_calib_frame[:, :3]) +calib_from_sbigmodel = np.linalg.inv(sbigmodel_frame_from_calib_frame[:, :3]) + +# This function is verified to give similar results to xx.uncommon.utils.transform_img +def get_warp_matrix(device_from_calib_euler: np.ndarray, intrinsics: np.ndarray, bigmodel_frame: bool = False) -> np.ndarray: + calib_from_model = calib_from_sbigmodel if bigmodel_frame else calib_from_medmodel + device_from_calib = rot_from_euler(device_from_calib_euler) + camera_from_calib = intrinsics @ view_frame_from_device_frame @ device_from_calib + warp_matrix: np.ndarray = camera_from_calib @ calib_from_model + return warp_matrix diff --git a/iqpilot/common/transformations/orientation.py b/iqpilot/common/transformations/orientation.py new file mode 100644 index 000000000..61172fad7 --- /dev/null +++ b/iqpilot/common/transformations/orientation.py @@ -0,0 +1,52 @@ +import numpy as np +from collections.abc import Callable + +from iqpilot.common.transformations.transformations import (ecef_euler_from_ned_single, + euler2quat_single, + euler2rot_single, + ned_euler_from_ecef_single, + quat2euler_single, + quat2rot_single, + rot2euler_single, + rot2quat_single) + + +def numpy_wrap(function, input_shape, output_shape) -> Callable[..., np.ndarray]: + """Wrap a function to take either an input or list of inputs and return the correct shape""" + def f(*inps): + *args, inp = inps + inp = np.array(inp) + shape = inp.shape + + if len(shape) == len(input_shape): + out_shape = output_shape + else: + out_shape = (shape[0],) + output_shape + + # Add empty dimension if inputs is not a list + if len(shape) == len(input_shape): + inp.shape = (1, ) + inp.shape + + result = np.asarray([function(*args, i) for i in inp]) + result.shape = out_shape + return result + return f + + +euler2quat = numpy_wrap(euler2quat_single, (3,), (4,)) +quat2euler = numpy_wrap(quat2euler_single, (4,), (3,)) +quat2rot = numpy_wrap(quat2rot_single, (4,), (3, 3)) +rot2quat = numpy_wrap(rot2quat_single, (3, 3), (4,)) +euler2rot = numpy_wrap(euler2rot_single, (3,), (3, 3)) +rot2euler = numpy_wrap(rot2euler_single, (3, 3), (3,)) +ecef_euler_from_ned = numpy_wrap(ecef_euler_from_ned_single, (3,), (3,)) +ned_euler_from_ecef = numpy_wrap(ned_euler_from_ecef_single, (3,), (3,)) + +quats_from_rotations = rot2quat +quat_from_rot = rot2quat +rotations_from_quats = quat2rot +rot_from_quat = quat2rot +euler_from_rot = rot2euler +euler_from_quat = quat2euler +rot_from_euler = euler2rot +quat_from_euler = euler2quat diff --git a/iqpilot/common/transformations/tests/__init__.py b/iqpilot/common/transformations/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/common/transformations/tests/test_coordinates.py b/iqpilot/common/transformations/tests/test_coordinates.py new file mode 100644 index 000000000..07c89d221 --- /dev/null +++ b/iqpilot/common/transformations/tests/test_coordinates.py @@ -0,0 +1,137 @@ +import numpy as np + +import iqpilot.common.transformations.coordinates as coord + +geodetic_positions = np.array([[37.7610403, -122.4778699, 115], + [27.4840915, -68.5867592, 2380], + [32.4916858, -113.652821, -6], + [15.1392514, 103.6976037, 24], + [24.2302229, 44.2835412, 1650]]) + +ecef_positions = np.array([[-2711076.55270557, -4259167.14692758, 3884579.87669935], + [ 2068042.69652729, -5273435.40316622, 2927004.89190746], + [-2160412.60461669, -4932588.89873832, 3406542.29652851], + [-1458247.92550567, 5983060.87496612, 1654984.6099885 ], + [ 4167239.10867871, 4064301.90363223, 2602234.6065749 ]]) + +ecef_positions_offset = np.array([[-2711004.46961115, -4259099.33540613, 3884605.16002147], + [ 2068074.30639499, -5273413.78835412, 2927012.48741131], + [-2160344.53748176, -4932586.20092211, 3406636.2962545 ], + [-1458211.98517094, 5983151.11161276, 1655077.02698447], + [ 4167271.20055269, 4064398.22619263, 2602238.95265847]]) + + +ned_offsets = np.array([[78.722153649976391, 24.396208657446344, 60.343017506838436], + [10.699003365155221, 37.319278617604269, 4.1084100025050407], + [95.282646251726959, 61.266689955574428, -25.376506058505054], + [68.535769283630003, -56.285970011848889, -100.54840137956515], + [-33.066609321880179, 46.549821994306861, -84.062540548335591]]) + +ecef_init_batch = np.array([2068042.69652729, -5273435.40316622, 2927004.89190746]) +ecef_positions_offset_batch = np.array([[ 2068089.41454771, -5273434.46829148, 2927074.04783672], + [ 2068103.31628647, -5273393.92275431, 2927102.08725987], + [ 2068108.49939636, -5273359.27047121, 2927045.07091581], + [ 2068075.12395611, -5273381.69432566, 2927041.08207992], + [ 2068060.72033399, -5273430.6061505, 2927094.54928305]]) + +ned_offsets_batch = np.array([[ 53.88103168, 43.83445935, -46.27488057], + [ 93.83378995, 71.57943024, -30.23113187], + [ 57.26725796, 89.05602684, 23.02265814], + [ 49.71775195, 49.79767572, 17.15351015], + [ 78.56272609, 18.53100158, -43.25290759]]) + + +class TestNED: + def test_small_distances(self): + start_geodetic = np.array([33.8042184, -117.888593, 0.0]) + local_coord = coord.LocalCoord.from_geodetic(start_geodetic) + + start_ned = local_coord.geodetic2ned(start_geodetic) + np.testing.assert_array_equal(start_ned, np.zeros(3,)) + + west_geodetic = start_geodetic + [0, -0.0005, 0] + west_ned = local_coord.geodetic2ned(west_geodetic) + assert np.abs(west_ned[0]) < 1e-3 + assert west_ned[1] < 0 + + southwest_geodetic = start_geodetic + [-0.0005, -0.002, 0] + southwest_ned = local_coord.geodetic2ned(southwest_geodetic) + assert southwest_ned[0] < 0 + assert southwest_ned[1] < 0 + + def test_ecef_geodetic(self): + # testing single + np.testing.assert_allclose(ecef_positions[0], coord.geodetic2ecef(geodetic_positions[0]), rtol=1e-9) + np.testing.assert_allclose(geodetic_positions[0, :2], coord.ecef2geodetic(ecef_positions[0])[:2], rtol=1e-9) + np.testing.assert_allclose(geodetic_positions[0, 2], coord.ecef2geodetic(ecef_positions[0])[2], rtol=1e-9, atol=1e-4) + + np.testing.assert_allclose(geodetic_positions[:, :2], coord.ecef2geodetic(ecef_positions)[:, :2], rtol=1e-9) + np.testing.assert_allclose(geodetic_positions[:, 2], coord.ecef2geodetic(ecef_positions)[:, 2], rtol=1e-9, atol=1e-4) + np.testing.assert_allclose(ecef_positions, coord.geodetic2ecef(geodetic_positions), rtol=1e-9) + + + def test_ned(self): + for ecef_pos in ecef_positions: + converter = coord.LocalCoord.from_ecef(ecef_pos) + ecef_pos_moved = ecef_pos + [25, -25, 25] + ecef_pos_moved_double_converted = converter.ned2ecef(converter.ecef2ned(ecef_pos_moved)) + np.testing.assert_allclose(ecef_pos_moved, ecef_pos_moved_double_converted, rtol=1e-9) + + for geo_pos in geodetic_positions: + converter = coord.LocalCoord.from_geodetic(geo_pos) + geo_pos_moved = geo_pos + np.array([0, 0, 10]) + geo_pos_double_converted_moved = converter.ned2geodetic(converter.geodetic2ned(geo_pos) + np.array([0, 0, -10])) + np.testing.assert_allclose(geo_pos_moved[:2], geo_pos_double_converted_moved[:2], rtol=1e-9, atol=1e-6) + np.testing.assert_allclose(geo_pos_moved[2], geo_pos_double_converted_moved[2], rtol=1e-9, atol=1e-4) + + def test_ned_saved_results(self): + for i, ecef_pos in enumerate(ecef_positions): + converter = coord.LocalCoord.from_ecef(ecef_pos) + np.testing.assert_allclose(converter.ned2ecef(ned_offsets[i]), + ecef_positions_offset[i], + rtol=1e-9, atol=1e-4) + np.testing.assert_allclose(converter.ecef2ned(ecef_positions_offset[i]), + ned_offsets[i], + rtol=1e-9, atol=1e-4) + + def test_ned_batch(self): + converter = coord.LocalCoord.from_ecef(ecef_init_batch) + np.testing.assert_allclose(converter.ecef2ned(ecef_positions_offset_batch), + ned_offsets_batch, + rtol=1e-9, atol=1e-7) + np.testing.assert_allclose(converter.ned2ecef(ned_offsets_batch), + ecef_positions_offset_batch, + rtol=1e-9, atol=1e-7) + + def test_errors(self): + # Test wrong shape/type for geodetic2ecef + # numpy_wrap raises IndexError for scalar input + with np.testing.assert_raises(IndexError): + coord.geodetic2ecef(1.0) + + with np.testing.assert_raises_regex(ValueError, "Geodetic must be size 3"): + coord.geodetic2ecef([0, 0]) + + with np.testing.assert_raises_regex(ValueError, "Geodetic must be size 3"): + coord.geodetic2ecef([0, 0, 0, 0]) + + with np.testing.assert_raises(TypeError): + coord.geodetic2ecef(['a', 'b', 'c']) + + # Test LocalCoord constructor errors + with np.testing.assert_raises(ValueError): + coord.LocalCoord.from_geodetic([0, 0]) + + with np.testing.assert_raises(ValueError): + coord.LocalCoord.from_geodetic(1) + + with np.testing.assert_raises(TypeError): + coord.LocalCoord.from_geodetic(['a', 'b', 'c']) + + # Test wrong shape/type for ecef2geodetic + with np.testing.assert_raises(ValueError): + coord.ecef2geodetic([1, 2]) + with np.testing.assert_raises(ValueError): + coord.ecef2geodetic([1, 2, 3, 4]) + with np.testing.assert_raises(IndexError): + coord.ecef2geodetic(1.0) diff --git a/iqpilot/common/transformations/tests/test_orientation.py b/iqpilot/common/transformations/tests/test_orientation.py new file mode 100644 index 000000000..14c2f2aba --- /dev/null +++ b/iqpilot/common/transformations/tests/test_orientation.py @@ -0,0 +1,91 @@ +import numpy as np +import pytest + +from iqpilot.common.transformations.orientation import euler2quat, quat2euler, euler2rot, rot2euler, \ + rot2quat, quat2rot, \ + ned_euler_from_ecef + +eulers = np.array([[ 1.46520501, 2.78688383, 2.92780854], + [ 4.86909526, 3.60618161, 4.30648981], + [ 3.72175965, 2.68763705, 5.43895988], + [ 5.92306687, 5.69573614, 0.81100357], + [ 0.67838374, 5.02402037, 2.47106426]]) + +quats = np.array([[ 0.66855182, -0.71500939, 0.19539353, 0.06017818], + [ 0.43163717, 0.70013301, 0.28209145, 0.49389021], + [ 0.44121991, -0.08252646, 0.34257534, 0.82532207], + [ 0.88578382, -0.04515356, -0.32936046, 0.32383617], + [ 0.06578165, 0.61282835, 0.07126891, 0.78424163]]) + +ecef_positions = np.array([[-2711076.55270557, -4259167.14692758, 3884579.87669935], + [ 2068042.69652729, -5273435.40316622, 2927004.89190746], + [-2160412.60461669, -4932588.89873832, 3406542.29652851], + [-1458247.92550567, 5983060.87496612, 1654984.6099885 ], + [ 4167239.10867871, 4064301.90363223, 2602234.6065749 ]]) + +ned_eulers = np.array([[ 0.46806039, -0.4881889 , 1.65697808], + [-2.14525969, -0.36533066, 0.73813479], + [-1.39523364, -0.58540761, -1.77376356], + [-1.84220435, 0.61828016, -1.03310421], + [ 2.50450101, 0.36304151, 0.33136365]]) + + +class TestOrientation: + def test_quat_euler(self): + for i, eul in enumerate(eulers): + np.testing.assert_allclose(quats[i], euler2quat(eul), rtol=1e-7) + np.testing.assert_allclose(quats[i], euler2quat(quat2euler(quats[i])), rtol=1e-6) + for i, eul in enumerate(eulers): + np.testing.assert_allclose(quats[i], euler2quat(list(eul)), rtol=1e-7) + np.testing.assert_allclose(quats[i], euler2quat(quat2euler(list(quats[i]))), rtol=1e-6) + np.testing.assert_allclose(quats, euler2quat(eulers), rtol=1e-7) + np.testing.assert_allclose(quats, euler2quat(quat2euler(quats)), rtol=1e-6) + + def test_rot_euler(self): + for eul in eulers: + np.testing.assert_allclose(euler2quat(eul), euler2quat(rot2euler(euler2rot(eul))), rtol=1e-7) + for eul in eulers: + np.testing.assert_allclose(euler2quat(eul), euler2quat(rot2euler(euler2rot(list(eul)))), rtol=1e-7) + np.testing.assert_allclose(euler2quat(eulers), euler2quat(rot2euler(euler2rot(eulers))), rtol=1e-7) + + def test_rot_quat(self): + for quat in quats: + np.testing.assert_allclose(quat, rot2quat(quat2rot(quat)), rtol=1e-7) + for quat in quats: + np.testing.assert_allclose(quat, rot2quat(quat2rot(list(quat))), rtol=1e-7) + np.testing.assert_allclose(quats, rot2quat(quat2rot(quats)), rtol=1e-7) + + def test_euler_ned(self): + for i in range(len(eulers)): + np.testing.assert_allclose(ned_eulers[i], ned_euler_from_ecef(ecef_positions[i], eulers[i]), rtol=1e-7) + #np.testing.assert_allclose(eulers[i], ecef_euler_from_ned(ecef_positions[i], ned_eulers[i]), rtol=1e-7) + # np.testing.assert_allclose(ned_eulers, ned_euler_from_ecef(ecef_positions, eulers), rtol=1e-7) + + def test_inputs(self): + with pytest.raises(ValueError): + euler2quat([1, 2]) + + with pytest.raises(ValueError): + quat2rot([1, 2, 3]) + + with pytest.raises(IndexError): + rot2quat(np.zeros((2, 2))) + + def test_euler_rot_consistency(self): + rpy = [0.1, 0.2, 0.3] + R = euler2rot(rpy) + + # R -> q -> R + q = rot2quat(R) + R_new = quat2rot(q) + np.testing.assert_allclose(R, R_new, atol=1e-15) + + # q -> R -> Euler (quat2euler) -> R + rpy_new = quat2euler(q) + R_new2 = euler2rot(rpy_new) + np.testing.assert_allclose(R, R_new2, atol=1e-15) + + # R -> Euler (rot2euler) -> R + rpy_from_rot = rot2euler(R) + R_new3 = euler2rot(rpy_from_rot) + np.testing.assert_allclose(R, R_new3, atol=1e-15) diff --git a/iqpilot/common/transformations/transformations.py b/iqpilot/common/transformations/transformations.py new file mode 100644 index 000000000..5cb6220f9 --- /dev/null +++ b/iqpilot/common/transformations/transformations.py @@ -0,0 +1,342 @@ +import numpy as np + + +# Constants +a = 6378137.0 +b = 6356752.3142 +esq = 6.69437999014e-3 +e1sq = 6.73949674228e-3 + + +def geodetic2ecef_single(g): + """ + Convert geodetic coordinates (latitude, longitude, altitude) to ECEF. + """ + try: + if len(g) != 3: + raise ValueError("Geodetic must be size 3") + except TypeError: + raise ValueError("Geodetic must be a sequence of length 3") from None + + lat, lon, alt = g + lat = np.radians(lat) + lon = np.radians(lon) + xi = np.sqrt(1.0 - esq * np.sin(lat)**2) + x = (a / xi + alt) * np.cos(lat) * np.cos(lon) + y = (a / xi + alt) * np.cos(lat) * np.sin(lon) + z = (a / xi * (1.0 - esq) + alt) * np.sin(lat) + return np.array([x, y, z]) + + +def ecef2geodetic_single(e): + """ + Convert ECEF to geodetic coordinates using Ferrari's solution. + """ + x, y, z = e + r = np.sqrt(x**2 + y**2) + Esq = a**2 - b**2 + F = 54 * b**2 * z**2 + G = r**2 + (1 - esq) * z**2 - esq * Esq + C = (esq**2 * F * r**2) / (G**3) + S = np.cbrt(1 + C + np.sqrt(C**2 + 2 * C)) + P = F / (3 * (S + 1 / S + 1)**2 * G**2) + Q = np.sqrt(1 + 2 * esq**2 * P) + r_0 = -(P * esq * r) / (1 + Q) + np.sqrt(0.5 * a**2 * (1 + 1.0 / Q) - P * (1 - esq) * z**2 / (Q * (1 + Q)) - 0.5 * P * r**2) + U = np.sqrt((r - esq * r_0)**2 + z**2) + V = np.sqrt((r - esq * r_0)**2 + (1 - esq) * z**2) + Z_0 = b**2 * z / (a * V) + h = U * (1 - b**2 / (a * V)) + lat = np.arctan((z + e1sq * Z_0) / r) + lon = np.arctan2(y, x) + return np.array([np.degrees(lat), np.degrees(lon), h]) + + +def euler2quat_single(euler): + """ + Convert Euler angles (roll, pitch, yaw) to a quaternion. + Rotation order: Z-Y-X (yaw, pitch, roll). + """ + phi, theta, psi = euler + + c_phi, s_phi = np.cos(phi / 2), np.sin(phi / 2) + c_theta, s_theta = np.cos(theta / 2), np.sin(theta / 2) + c_psi, s_psi = np.cos(psi / 2), np.sin(psi / 2) + + w = c_phi * c_theta * c_psi + s_phi * s_theta * s_psi + x = s_phi * c_theta * c_psi - c_phi * s_theta * s_psi + y = c_phi * s_theta * c_psi + s_phi * c_theta * s_psi + z = c_phi * c_theta * s_psi - s_phi * s_theta * c_psi + + if w < 0: + return np.array([-w, -x, -y, -z]) + return np.array([w, x, y, z]) + + +def quat2euler_single(q): + """ + Convert a quaternion to Euler angles (roll, pitch, yaw). + """ + w, x, y, z = q + gamma = np.arctan2(2 * (w * x + y * z), 1 - 2 * (x**2 + y**2)) + sin_arg = 2 * (w * y - z * x) + sin_arg = np.clip(sin_arg, -1.0, 1.0) + theta = np.arcsin(sin_arg) + psi = np.arctan2(2 * (w * z + x * y), 1 - 2 * (y**2 + z**2)) + return np.array([gamma, theta, psi]) + + +def quat2rot_single(q): + """ + Convert a quaternion to a 3x3 rotation matrix. + """ + w, x, y, z = q + xx, yy, zz = x * x, y * y, z * z + xy, xz, yz = x * y, x * z, y * z + wx, wy, wz = w * x, w * y, w * z + + mat = np.array([ + [1 - 2 * (yy + zz), 2 * (xy - wz), 2 * (xz + wy)], + [2 * (xy + wz), 1 - 2 * (xx + zz), 2 * (yz - wx)], + [2 * (xz - wy), 2 * (yz + wx), 1 - 2 * (xx + yy)] + ]) + return mat + + +def rot2quat_single(rot): + """ + Convert a 3x3 rotation matrix to a quaternion. + """ + trace = np.trace(rot) + if trace > 0: + s = 0.5 / np.sqrt(trace + 1.0) + w = 0.25 / s + x = (rot[2, 1] - rot[1, 2]) * s + y = (rot[0, 2] - rot[2, 0]) * s + z = (rot[1, 0] - rot[0, 1]) * s + else: + if rot[0, 0] > rot[1, 1] and rot[0, 0] > rot[2, 2]: + s = 2.0 * np.sqrt(1.0 + rot[0, 0] - rot[1, 1] - rot[2, 2]) + w = (rot[2, 1] - rot[1, 2]) / s + x = 0.25 * s + y = (rot[0, 1] + rot[1, 0]) / s + z = (rot[0, 2] + rot[2, 0]) / s + elif rot[1, 1] > rot[2, 2]: + s = 2.0 * np.sqrt(1.0 + rot[1, 1] - rot[0, 0] - rot[2, 2]) + w = (rot[0, 2] - rot[2, 0]) / s + x = (rot[0, 1] + rot[1, 0]) / s + y = 0.25 * s + z = (rot[1, 2] + rot[2, 1]) / s + else: + s = 2.0 * np.sqrt(1.0 + rot[2, 2] - rot[0, 0] - rot[1, 1]) + w = (rot[1, 0] - rot[0, 1]) / s + x = (rot[0, 2] + rot[2, 0]) / s + y = (rot[1, 2] + rot[2, 1]) / s + z = 0.25 * s + + if w < 0: + return np.array([-w, -x, -y, -z]) + return np.array([w, x, y, z]) + + +def euler2rot_single(euler): + """ + Convert Euler angles (roll, pitch, yaw) to a 3x3 rotation matrix. + Rotation order: Z-Y-X (yaw, pitch, roll). + """ + phi, theta, psi = euler + + cx, sx = np.cos(phi), np.sin(phi) + cy, sy = np.cos(theta), np.sin(theta) + cz, sz = np.cos(psi), np.sin(psi) + + Rx = np.array([[1, 0, 0], [0, cx, -sx], [0, sx, cx]]) + Ry = np.array([[cy, 0, sy], [0, 1, 0], [-sy, 0, cy]]) + Rz = np.array([[cz, -sz, 0], [sz, cz, 0], [0, 0, 1]]) + + return Rz @ Ry @ Rx + + +def rot2euler_single(rot): + """ + Convert a 3x3 rotation matrix to Euler angles (roll, pitch, yaw). + """ + return quat2euler_single(rot2quat_single(rot)) + + +def rot_matrix(roll, pitch, yaw): + """ + Create a 3x3 rotation matrix from roll, pitch, and yaw angles. + """ + return euler2rot_single([roll, pitch, yaw]) + + +def axis_angle_to_rot(axis, angle): + """ + Convert an axis-angle representation to a 3x3 rotation matrix. + """ + c = np.cos(angle / 2) + s = np.sin(angle / 2) + q = np.array([c, s*axis[0], s*axis[1], s*axis[2]]) + return quat2rot_single(q) + + +class LocalCoord: + """ + A class to handle conversions between ECEF and local NED coordinates. + """ + def __init__(self, geodetic=None, ecef=None): + """ + Initialize LocalCoord with either geodetic or ECEF coordinates. + """ + if geodetic is not None: + self.init_ecef = geodetic2ecef_single(geodetic) + lat, lon, _ = geodetic + elif ecef is not None: + self.init_ecef = np.array(ecef) + lat, lon, _ = ecef2geodetic_single(ecef) + else: + raise ValueError("Must provide geodetic or ecef") + + lat = np.radians(lat) + lon = np.radians(lon) + + self.ned2ecef_matrix = np.array([ + [-np.sin(lat) * np.cos(lon), -np.sin(lon), -np.cos(lat) * np.cos(lon)], + [-np.sin(lat) * np.sin(lon), np.cos(lon), -np.cos(lat) * np.sin(lon)], + [np.cos(lat), 0, -np.sin(lat)] + ]) + self.ecef2ned_matrix = self.ned2ecef_matrix.T + + @classmethod + def from_geodetic(cls, geodetic): + """ + Create a LocalCoord instance from geodetic coordinates. + """ + return cls(geodetic=geodetic) + + @classmethod + def from_ecef(cls, ecef): + """ + Create a LocalCoord instance from ECEF coordinates. + """ + return cls(ecef=ecef) + + def ecef2ned_single(self, ecef): + """ + Convert a single ECEF point to NED coordinates relative to the origin. + """ + return self.ecef2ned_matrix @ (ecef - self.init_ecef) + + def ned2ecef_single(self, ned): + """ + Convert a single NED point to ECEF coordinates. + """ + return self.ned2ecef_matrix @ ned + self.init_ecef + + def geodetic2ned_single(self, geodetic): + """ + Convert a single geodetic point to NED coordinates. + """ + ecef = geodetic2ecef_single(geodetic) + return self.ecef2ned_single(ecef) + + def ned2geodetic_single(self, ned): + """ + Convert a single NED point to geodetic coordinates. + """ + ecef = self.ned2ecef_single(ned) + return ecef2geodetic_single(ecef) + + @property + def ned_from_ecef_matrix(self): + """ + Returns the rotation matrix from ECEF to NED coordinates. + """ + return self.ecef2ned_matrix + + @property + def ecef_from_ned_matrix(self): + """ + Returns the rotation matrix from NED to ECEF coordinates. + """ + return self.ned2ecef_matrix + + +def ecef_euler_from_ned_single(ecef_init, ned_pose): + """ + Convert NED Euler angles (roll, pitch, yaw) at a given ECEF origin + to equivalent ECEF Euler angles. + """ + converter = LocalCoord(ecef=ecef_init) + zero = np.array(ecef_init) + + x0 = converter.ned2ecef_single([1, 0, 0]) - zero + y0 = converter.ned2ecef_single([0, 1, 0]) - zero + z0 = converter.ned2ecef_single([0, 0, 1]) - zero + + phi, theta, psi = ned_pose + + x1 = axis_angle_to_rot(z0, psi) @ x0 + y1 = axis_angle_to_rot(z0, psi) @ y0 + z1 = axis_angle_to_rot(z0, psi) @ z0 + + x2 = axis_angle_to_rot(y1, theta) @ x1 + y2 = axis_angle_to_rot(y1, theta) @ y1 + z2 = axis_angle_to_rot(y1, theta) @ z1 + + x3 = axis_angle_to_rot(x2, phi) @ x2 + y3 = axis_angle_to_rot(x2, phi) @ y2 + + x0 = np.array([1.0, 0, 0]) + y0 = np.array([0, 1.0, 0]) + z0 = np.array([0, 0, 1.0]) + + psi_out = np.arctan2(np.dot(x3, y0), np.dot(x3, x0)) + theta_out = np.arctan2(-np.dot(x3, z0), np.sqrt(np.dot(x3, x0)**2 + np.dot(x3, y0)**2)) + + y2 = axis_angle_to_rot(z0, psi_out) @ y0 + z2 = axis_angle_to_rot(y2, theta_out) @ z0 + + phi_out = np.arctan2(np.dot(y3, z2), np.dot(y3, y2)) + + return np.array([phi_out, theta_out, psi_out]) + + +def ned_euler_from_ecef_single(ecef_init, ecef_pose): + """ + Convert ECEF Euler angles (roll, pitch, yaw) at a given ECEF origin + to equivalent NED Euler angles. + """ + converter = LocalCoord(ecef=ecef_init) + + x0 = np.array([1.0, 0, 0]) + y0 = np.array([0, 1.0, 0]) + z0 = np.array([0, 0, 1.0]) + + phi, theta, psi = ecef_pose + + x1 = axis_angle_to_rot(z0, psi) @ x0 + y1 = axis_angle_to_rot(z0, psi) @ y0 + z1 = axis_angle_to_rot(z0, psi) @ z0 + + x2 = axis_angle_to_rot(y1, theta) @ x1 + y2 = axis_angle_to_rot(y1, theta) @ y1 + z2 = axis_angle_to_rot(y1, theta) @ z1 + + x3 = axis_angle_to_rot(x2, phi) @ x2 + y3 = axis_angle_to_rot(x2, phi) @ y2 + + zero = np.array(ecef_init) + x0 = converter.ned2ecef_single([1, 0, 0]) - zero + y0 = converter.ned2ecef_single([0, 1, 0]) - zero + z0 = converter.ned2ecef_single([0, 0, 1]) - zero + + psi_out = np.arctan2(np.dot(x3, y0), np.dot(x3, x0)) + theta_out = np.arctan2(-np.dot(x3, z0), np.sqrt(np.dot(x3, x0)**2 + np.dot(x3, y0)**2)) + + y2 = axis_angle_to_rot(z0, psi_out) @ y0 + z2 = axis_angle_to_rot(y2, theta_out) @ z0 + + phi_out = np.arctan2(np.dot(y3, z2), np.dot(y3, y2)) + + return np.array([phi_out, theta_out, psi_out]) diff --git a/iqpilot/common/utils.py b/iqpilot/common/utils.py new file mode 100644 index 000000000..e0aa1605d --- /dev/null +++ b/iqpilot/common/utils.py @@ -0,0 +1,271 @@ +import io +import os +import tempfile +import contextlib +import subprocess +import time +import functools +from subprocess import Popen, PIPE, TimeoutExpired +import zstandard as zstd + +LOG_COMPRESSION_LEVEL = 10 # little benefit up to level 15. level ~17 is a small step change + +class Timer: + """Simple lap timer for profiling sequential operations.""" + + def __init__(self): + self._start = self._lap = time.monotonic() + self._sections = {} + + def lap(self, name): + now = time.monotonic() + self._sections[name] = now - self._lap + self._lap = now + + @property + def total(self): + return time.monotonic() - self._start + + def fmt(self, duration): + parts = ", ".join(f"{k}={v:.2f}s" + (f" ({duration/v:.0f}x)" if k == 'render' and v > 0 else "") for k, v in self._sections.items()) + total = self.total + realtime = f"{duration/total:.1f}x realtime" if total > 0 else "N/A" + return f"{duration}s in {total:.1f}s ({realtime}) | {parts}" + +def sudo_write(val: str, path: str) -> None: + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + os.system(f"sudo chmod a+w {path}") + try: + with open(path, 'w') as f: + f.write(str(val)) + except PermissionError: + # fallback for debugfs files + os.system(f"sudo su -c 'echo {val} > {path}'") + + +def sudo_read(path: str) -> str: + try: + return subprocess.check_output(f"sudo cat {path}", shell=True, encoding='utf8').strip() + except Exception: + return "" + + +class MovingAverage: + def __init__(self, window_size: int): + self.window_size: int = window_size + self.buffer: list[float] = [0.0] * window_size + self.index: int = 0 + self.count: int = 0 + self.sum: float = 0.0 + + def add_value(self, new_value: float): + # Update the sum: subtract the value being replaced and add the new value + self.sum -= self.buffer[self.index] + self.buffer[self.index] = new_value + self.sum += new_value + + # Update the index in a circular manner + self.index = (self.index + 1) % self.window_size + + # Track the number of added values (for partial windows) + self.count = min(self.count + 1, self.window_size) + + def get_average(self) -> float: + if self.count == 0: + return float('nan') + return self.sum / self.count + + +class CallbackReader: + """Wraps a file, but overrides the read method to also + call a callback function with the number of bytes read so far.""" + + def __init__(self, f, callback, *args): + self.f = f + self.callback = callback + self.cb_args = args + self.total_read = 0 + + def __getattr__(self, attr): + return getattr(self.f, attr) + + def read(self, *args, **kwargs): + chunk = self.f.read(*args, **kwargs) + self.total_read += len(chunk) + self.callback(*self.cb_args, self.total_read) + return chunk + + +@contextlib.contextmanager +def atomic_write(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None, + overwrite: bool = False): + """Write to a file atomically using a temporary file in the same directory as the destination file.""" + dir_name = os.path.dirname(path) + + if not overwrite and os.path.exists(path): + raise FileExistsError(f"File '{path}' already exists. To overwrite it, set 'overwrite' to True.") + + with tempfile.NamedTemporaryFile(mode=mode, buffering=buffering, encoding=encoding, newline=newline, dir=dir_name, delete=False) as tmp_file: + yield tmp_file + tmp_file_name = tmp_file.name + os.replace(tmp_file_name, path) + + +def get_upload_stream(filepath: str, should_compress: bool) -> tuple[io.BufferedIOBase, int]: + if not should_compress: + file_size = os.path.getsize(filepath) + file_stream = open(filepath, "rb") + return file_stream, file_size + + # Compress the file on the fly + compressed_stream = io.BytesIO() + compressor = zstd.ZstdCompressor(level=LOG_COMPRESSION_LEVEL) + + with open(filepath, "rb") as f: + compressor.copy_stream(f, compressed_stream) + compressed_size = compressed_stream.tell() + compressed_stream.seek(0) + return compressed_stream, compressed_size + + +# remove all keys that end in DEPRECATED +def strip_deprecated_keys(d): + for k in list(d.keys()): + if isinstance(k, str): + if k.endswith('DEPRECATED'): + d.pop(k) + elif isinstance(d[k], dict): + strip_deprecated_keys(d[k]) + return d + + +def run_cmd(cmd: list[str], cwd=None, env=None) -> str: + return subprocess.check_output(cmd, encoding='utf8', cwd=cwd, env=env).strip() + + +def run_cmd_default(cmd: list[str], default: str = "", cwd=None, env=None) -> str: + try: + return run_cmd(cmd, cwd=cwd, env=env) + except subprocess.CalledProcessError: + return default + + +@contextlib.contextmanager +def managed_proc(cmd: list[str], env: dict[str, str]): + proc = Popen(cmd, env=env, stdout=PIPE, stderr=PIPE) + try: + yield proc + finally: + if proc.poll() is None: + proc.terminate() + try: + proc.wait(timeout=5) + except TimeoutExpired: + proc.kill() + + +def tabulate(tabular_data, headers=(), tablefmt="simple", floatfmt="g", stralign="left", numalign=None): + rows = [list(row) for row in tabular_data] + + def fmt(val): + if isinstance(val, str): + return val + if isinstance(val, (bool, int)): + return str(val) + try: + return format(val, floatfmt) + except (TypeError, ValueError): + return str(val) + + formatted = [[fmt(c) for c in row] for row in rows] + hdrs = [str(h) for h in headers] if headers else None + + ncols = max((len(r) for r in formatted), default=0) + if hdrs: + ncols = max(ncols, len(hdrs)) + if ncols == 0: + return "" + + for r in formatted: + r.extend([""] * (ncols - len(r))) + if hdrs: + hdrs.extend([""] * (ncols - len(hdrs))) + + widths = [0] * ncols + if hdrs: + for i in range(ncols): + widths[i] = len(hdrs[i]) + for row in formatted: + for i in range(ncols): + widths[i] = max(widths[i], max(len(ln) for ln in row[i].split('\n'))) + + def _align(s, w): + if stralign == "center": + return s.center(w) + return s.ljust(w) + + if tablefmt == "html": + parts = [""] + if hdrs: + parts.append("") + parts.append("" + "".join(f"" for h in hdrs) + "") + parts.append("") + parts.append("") + for row in formatted: + parts.append("" + "".join(f"" for c in row) + "") + parts.append("") + parts.append("
    {h}
    {c}
    ") + return "\n".join(parts) + + if tablefmt == "simple_grid": + def _sep(left, mid, right): + return left + mid.join("─" * (w + 2) for w in widths) + right + + top, mid_sep, bot = _sep("┌", "â”Ŧ", "┐"), _sep("├", "â”ŧ", "┤"), _sep("└", "┴", "┘") + + def _fmt_row(cells): + split = [c.split('\n') for c in cells] + nlines = max(len(s) for s in split) + for s in split: + s.extend([""] * (nlines - len(s))) + return ["│" + "│".join(f" {_align(split[i][li], widths[i])} " for i in range(ncols)) + "│" for li in range(nlines)] + + lines = [top] + if hdrs: + lines.extend(_fmt_row(hdrs)) + lines.append(mid_sep) + for ri, row in enumerate(formatted): + lines.extend(_fmt_row(row)) + lines.append(mid_sep if ri < len(formatted) - 1 else bot) + return "\n".join(lines) + + gap = " " + lines = [] + if hdrs: + lines.append(gap.join(h.ljust(w) for h, w in zip(hdrs, widths, strict=True))) + lines.append(gap.join("-" * w for w in widths)) + for row in formatted: + lines.append(gap.join(_align(row[i], widths[i]) for i in range(ncols))) + return "\n".join(lines) + + +def retry(attempts=3, delay=1.0, ignore_failure=False): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + for _ in range(attempts): + try: + return func(*args, **kwargs) + except Exception: + print(f"{func.__name__} failed, trying again") + time.sleep(delay) + + if ignore_failure: + print(f"{func.__name__} failed after retry") + else: + raise Exception(f"{func.__name__} failed after retry") + return wrapper + return decorator diff --git a/iqpilot/common/version.h b/iqpilot/common/version.h new file mode 100644 index 000000000..5039ecb00 --- /dev/null +++ b/iqpilot/common/version.h @@ -0,0 +1 @@ +#define COMMA_VERSION "IQ.Pilot 1.0c" diff --git a/iqpilot/common/version.py b/iqpilot/common/version.py new file mode 100644 index 000000000..c6d11163a --- /dev/null +++ b/iqpilot/common/version.py @@ -0,0 +1,5 @@ +from iqpilot.common.git import get_normalized_origin + + +def get_version() -> str: + return "IQ.Pilot 1.0c" diff --git a/iqpilot/docs/CHANGELOG.md b/iqpilot/docs/CHANGELOG.md new file mode 100644 index 000000000..3dc10a1bb --- /dev/null +++ b/iqpilot/docs/CHANGELOG.md @@ -0,0 +1,321 @@ +# IQ.Pilot User Changelog + +## IQ.Pilot 1.0c Changelog + +### Features + +#### Navigate on IQ.Pilot + +- Added Navigate on IQ.Pilot as a complete on-device navigation experience. +- Added destination search with Home, Work, and Recent shortcuts. +- Added live turn-by-turn guidance with automatic rerouting after a missed turn or route deviation. +- Added traffic-aware online routing with automatic traffic refresh, delay tracking, closure awareness, and fresh-route metadata. +- Added AMap destination search and routing for configured mainland China devices. +- Added an interactive off-road map with panning and current-location display. +- Added a split on-road map view so the camera, model path, route, current position, and upcoming maneuver remain visible together. +- Added route-aware longitudinal planning for turns, highway exits, and highway forks. +- Added route-aware lane-change guidance for supported highway exits. +- Added route-commanded automatic turn signals on supported vehicles. +- Added optional exit-lane-change assistance with Blind Spot Monitoring awareness. +- Improved low-speed maneuver guidance so the model keeps the requested turn path while waiting and carries it through the committed turn. +- Added route cancellation and saved-destination management from the Navigate screen in the Konn3kt app. + +#### IQ Speed Assist + +- Added the new IQ Speed Assist architecture. +- Added TomTom speed-limit data alongside dashboard, Mapbox, and offline OpenStreetMap sources. +- Added percentage-based offset zones for low, medium, and higher speed ranges. +- Added direct integration of upcoming speed limits into the longitudinal cruise envelope for earlier and smoother reactions. + +#### Construction Zone Assist + +- Added optional camera-based Construction Zone Assist. +- Added road-camera detection of bright orange work-zone barrels and markers. +- Added an adjustable work-zone target speed with a 60 mph default. +- Added daylight, road-speed, and active-zone state checks to reduce detections from unrelated reflective objects. + +#### Camera Alerts + +- Added direct Flock/ALPR hardware detection from nearby Bluetooth and Wi-Fi radio signatures. +- Added warnings for mapped speed cameras, red-light cameras, and ALPR/Flock Safety cameras. +- Direct radio detection works without internet access or preexisting map data, and can warn about a nearby unit before appearing in the map database. +- Added optional speed-camera slowdown using the detected camera limit and a configurable safety factor. +- Added optional haptic feedback on supported Hyundai/Kia/Genesis vehicles when approaching a speed camera. + +#### IQ.Dynamic + +- Added configurable IQ.Dynamic activation for curves, low road speeds, slower or stopped lead vehicles, and model-predicted stops. +- Added separate road-speed, lead-speed, and model-stop timing controls. +- Added on-device IQ.Dynamic configuration by double-tapping IQ.Dynamic in the longitudinal mode selector. +- Added on-road IQ longitudinal-mode cycling through the nucleus icon on BIG UI devices. +- Added optional stock-radar blending on supported Volkswagen PQ vehicles for more stable highway following. +- Added IQ Force Stops for model-predicted stop lights and stop signs when no lead vehicle is present. +- Added adjustable minimum stop length and stopping distance. + +#### General Longitudinal Updates + +- Added end-to-end cruise convergence so the vehicle returns toward the selected cruise speed as the road opens in IQ.Pilot (E2E) mode. +- Added Smooth Stops for gentler final braking at regular and model-predicted stops. +- Added smoother pull-away behavior and departure chimes when a lead moves or the path opens. +- Added an optional Experimental Lead MPC mode. +- Added earlier reactions to upcoming curves. + +#### IQ Steering Assistance Behavior (SAB) + +- Added a distinct lateral-only engagement border separate from full lateral-and-longitudinal engagement. +- Added Always-On Lateral support through compatible Hyundai LFA buttons. +- Added an optional mode that pauses steering torque when the driver takes the wheel and resumes after release. + +#### Lane Changes + +- Added an optional model-based lane edge guard that blocks lane changes when a road edge is detected on the target side. + +#### Lateral Tuning + +- Added configurable steering smoothing, slew limiting, and curvature lookahead. +- Improved curve entry and reduced abrupt steering changes while preserving quick avoidance responses. +- Added angle-based steering and optional torque blending for Volkswagen vehicles with ALC. +- Added Volkswagen PQ HCA7 steering support and live-learned curvature correction on supported MEB vehicles. + +#### Driving Models + +- Added automatic model refresh and redownload when an installed model needs an update. +- Added a clear Driving Model Updating state, and engagement now waits until the selected model is ready. + +#### IQ eMac + +- Added IQ eMac for running supported big driving models on an Apple Silicon Mac over USB. +- Added a Big Model selector with Off, BRH, Lebowski, and RDF choices. +- Added one-time model download and compilation on the Mac, with cached models for later drives. +- Added automatic USB network setup with a one-time Mac administrator prompt when required. +- Added USB AMD eGPU-dock support with automatic detection and recovery tools. + +#### IQ eMac App + +- Added a native Mac app for starting, monitoring, restarting, and stopping IQ eMac. +- Added live connection, model, download, compilation, inference rate, latency, and session status. +- Added persistent menu-bar operation with compact live statistics. + +#### Home Screen and Off-Road UI + +- Added a new IQ.Pilot home screen with dedicated Routes, Navigation, Video, and status views. +- Added a selectable home-panel widget and an expanded status bar. +- Added 60 fps BIG UI presentation and improved Comma 4 visuals. +- Added connected Wi-Fi, vehicle state, temperature, Konn3kt status, and installed IQ.OS version displays. +- Added automatic mph or km/h selection based on the device location. +- Added smoother navigation, transitions, animations, and controls. +- Added Polish and expanded translations throughout the Comma 4 UI and IQ.Pilot settings. + +#### On-Road UI + +- Added a glowing orb for the primary lead vehicle. +- Added live Konn3kt accent colors across borders, lane lines, controls, and sliders. +- Updated the acceleration bar with IQ.Pilot's teal and pink visual style. +- Added on-road longitudinal personality selection. +- Added a Silent Mode bell control. +- Added Night Mode for automatic display sleep after sunset. +- Added a gradual volume ramp for immediate warning alerts. +- Added screen recording through Konn3kt. + +#### Dashcam and Routes + +- Increased dashcam (qcam) video resolution by 5x. +- Added a master dashcam control for route logging, video, and audio. +- Added crash-safe recording with recovery after power loss or an interrupted route. +- Added an on-device Routes screen with drive details and upload status. +- Added model path, steering angle, driver-monitoring state, speed, and cruise-speed overlays to the route viewer in the Konn3kt app. + +#### Live View, Audio, and WebSSH + +- Added live on-road video over cellular/Wi-Fi with the model path overlay. +- Added full-resolution HDR driver-camera video on Comma 4. +- Added microphone audio and two-way voice communication through Konn3kt. +- Added an on-road indicator while Live View is active. +- Added road, wide, and driver-camera snapshots. +- Added faster camera switching, adaptive video quality, and dual-camera picture-in-picture. +- Improved Konn3kt WebSSH connection reliability. + +#### Konn3kt Services + +- Konn3kt now remains available when IQ.Pilot is stopped or cannot open its main UI. +- Added remote recovery access over Wi-Fi and cellular. +- Added faster reconnection after network or IP-address changes. +- Added dedicated route, log, and crash-log uploading. +- Added Volkswagen and Tesla odometer display. +- Added encrypted device backup and restore. +- Added supported Volkswagen coding, diagnostic controls, and EPS flashing through Konn3kt. + +#### Konn3kt Bluetooth Control + +- Added direct Bluetooth control from the Konn3kt app across supported IQ.OS devices. +- Added Bluetooth synchronization for vehicle, display, network, navigation, and driving settings. +- Added automatic discovery and pairing without manual network configuration. +- Added automatic Bluetooth fallback when Wi-Fi or cellular service is unavailable. +- Added setup-stage Wi-Fi configuration, channel selection, and installation control. + +#### Volkswagen PQ and MQB + +- Expanded Volkswagen PQ and MQB vehicle support. +- Added Volkswagen Passat B7/NMS and SEAT Alhambra Stop-and-Go support. +- Added Stop-and-Go and automatic-resume improvements across supported PQ and MQB vehicles. +- Added stock-radar blending with IQ.Dynamic on supported PQ vehicles. +- Added automatic PQ steering-patch detection and minimum-steering-speed handling. +- Added Volkswagen PQ firmware backup, patching, programming, and recovery tools. +- Added PQ and MQB steering coding and compatibility checks through Konn3kt. +- Added continued PQ and MQB lateral control during cruise faults. +- Added an MQB Steering Lockout toggle that reduces low-speed steering torque to prevent LKAS faults on sensitive MQB vehicles. + +#### Volkswagen MEB and MQBevo + +- Added official Volkswagen MEB and MQBevo support. +- Added supported Volkswagen ID.3, ID.4, ID.5, and Golf Mk8 configurations through model year 2025. +- Added platform-specific steering, zero-speed steering, and ACC display support. +- Added vehicle Drive/Park state handling and reliable device wake support. + +#### Toyota and Lexus + +- Added Toyota and Lexus Stop-and-Go support with an optional compatibility mode. +- Added SDSU support. +- Fixed ignition handling so the device returns off-road in Park. + +#### Hyundai, Kia, and Genesis + +- Added more supported Hyundai, Kia, and Genesis variants. +- Added expanded CAN-FD, HDA2, Camera SCC, radar-track, and corner-radar support. +- Added Auto Cruise Control and Auto Engage options on compatible vehicles. +- Added custom steering maximum and steering-rate controls. +- Added lane-change-specific steering-rate controls. +- Added speed-camera haptics and Always-On Lateral support through compatible LFA buttons. + +#### Honda, Subaru, and Tesla + +- Added smoother final braking on supported Honda vehicles. +- Added Subaru Creep from Standstill. +- Added support for additional Tesla configurations and Model Y steering firmware. +- Fixed Tesla stock-DAS cancellation so cruise speed remains available for IQ.Pilot longitudinal control. +- Added an optional Tesla FSD/Autosteer visualization mode while IQ.Pilot steers. + +#### IQ.OS + +- Updated device firmware to IQ.OS 4.9.7. +- Added support for Comma 3, Comma 3X, Comma 4, Konik A1/M, and Mr.One C3/C3 Lite. +- Added per-unit Comma 4 display calibration and HDR camera color support. +- Reduced Comma 3 cold-boot time from 39 seconds to 21 seconds. +- Improved USB link recovery for IQ eMac and eGPU configurations. +- Improved Konik A1 audio reliability. +- Added assisted GPS acquisition through Konn3kt. + +#### FastSleep and Power Management + +- Added FastSleep deep standby after the vehicle is parked. +- Added faster standby when vehicle battery voltage begins to drop. +- Added staged low-voltage shutdown protection. +- Kept Konn3kt recovery access available while high-power IQ.Pilot services sleep. +- Added immediate wake when ignition or charging is detected. + +#### Bluetooth Setup and Controller Support + +- Added zero-touch Bluetooth onboarding with Konn3kt pairing and setup progress. +- Added IQ.OS update confirmation through Konn3kt. +- Kept Bluetooth controls available independently from the main IQ.Pilot process. + +#### Network, Cellular, and eSIM + +- Added a new Network settings experience on Comma 3 and Comma 4. +- Added a direct Wi-Fi Disconnect action. +- Added automatic cellular reconnection after APN changes. +- Added SIM recovery for Comma 3X devices with a worn tray-presence switch. +- Added experimental eSIM setup and profile management through QR or manual activation codes. + +#### Device and Recovery Controls + +- Added Force On-Road for a temporary ten-minute diagnostic session while parked. +- Added Update & Reboot on the crash and recovery screen. +- Added USB Storage mode to access device storage over USB. + +#### Updater and Installation + +- Added a new IQ.Pilot and IQ.OS update workflow. +- Added Predownload Only and Predownload + Preinstall modes. +- Added interrupted-installation recovery. + +#### Reliability and Camera Fault Recovery + +- Added independent recovery for navigation and map services. +- Added automatic wide-camera fault detection so the road and driver cameras can continue operating, with an on-road warning after fallback. +- Improved calibration recovery and protected driving services from map-service communication stalls. + +--- + +### Technical Changes + +- Reduced the IQ.Pilot total installation size to just 139.48 MiB. +- Removed the legacy openpilot source mirror, compatibility directories, and obsolete source aliases. +- Removed every Git submodule from the IQ.Pilot repository. +- Updated release builds to vendor the exact pinned component sources and required LFS assets into a self-contained installation without nested Git repositories or private source URLs. +- Added navigation-memory handling so important fork and exit guidance remains available when a model output briefly omits it. +- Added on-device map rendering and route-state services designed specifically for IQ.Pilot. +- Reduced navigation CPU, GPU, and memory overhead so the map can remain open for long drives without competing with the driving model. +- Added full offline routing through a packaged Valhalla runtime. +- Added offline navigation that can operate without Mapbox or an active internet connection. +- Added support for keeping multiple offline regions installed simultaneously. +- Added offline raster map tiles for the on-screen map, not only route calculation and road metadata. +- Added separate Online On-Screen Maps and Offline On-Screen Maps controls. +- Added resumable regional map downloads for unstable cellular and hotspot connections. +- Added combined download progress for routing databases and rendered map tiles. +- Added automatic recognition of already installed map regions. +- Added automatic restoration of missing offline-map data. +- Added a pinned IQ.Pilot mapd v2 fork with binary verification and automatic quarantine of incompatible mapd builds. +- Added a hosted regional tile-bundle service with a secondary fallback source. +- Added background tile decoding and bounded texture caching to keep map work off the UI render path. +- Added automatic stock-radar set-speed and following-gap synchronization on supported Volkswagen vehicles. +- Hardened Experimental Lead MPC with model-horizon validation and automatic radar-trajectory fallback when model lead data is missing, malformed, or non-finite. +- Added Bluetooth-controller commands for testing or controlling Always-On Lateral in Joystick Mode. +- Added the unified IQModeld runtime. +- Added a native IQModeld bridge for current combined models and legacy split models. +- Added fused vision-and-policy execution for supported supercombo bundles. +- Added zero-copy camera-frame handling through the current tinygrad runner. +- Added combined-artifact, combined-split, fused, tinygrad, and ONNX runner support under one manager. +- Added signed and notarized Mac packaging with improved USB transport diagnostics. +- Added stable border-crossing detection and last-known-location fallback for IQ Auto Units. +- Added tappable branch information in the BIG UI header. +- Fixed live language updates and several previously untranslated or malformed translations. +- Added qlog-only route visualization, allowing the model path and driving telemetry to be viewed even when only a qlog and qcam are uploaded, and no rlog is available. +- Hardened Qualcomm encoder polling and H.264 filtering for more reliable route recording. +- Fixed upload queues that could stall behind a missing build-version file. +- Fixed route-upload cache invalidation when a file is replaced at the same path, preventing stale upload state from being reused. +- Added automatic LocalAPI deployment and configuration. +- Fixed periodic Konn3kt disconnects caused by numeric heartbeat parameters terminating the connection writer. +- Added authenticated BLE requests, replay protection, and a dedicated settings RPC dispatcher. +- Added live propagation of BLE setting changes to the device UI and active IQ.Pilot services. +- Added TRW450 ACC handling for the Volkswagen Passat B7/NMS. +- Added MQB standstill handling for supported non-EPB ACC vehicles. +- Added dedicated PQ radar engagement, cancellation, set-speed, acceleration, and following-gap management. +- Added model-year ECU fingerprint checks and expanded Passat identification. +- Added explicit Volkswagen car-readiness state handling. +- Added on-car MLB longitudinal refinements and HCA steering-status configuration for compatible Audi and Porsche platforms. +- Corrected Porsche Macan vehicle selection and Volkswagen-group settings presentation. +- Added MEB camera-harness support for lateral control with stock ACC and compatible gateway-harness support for IQ.Pilot longitudinal control. +- Added broader Hyundai/Kia/Genesis vehicle parameter and fingerprint diagnostics. +- Added guarded Tesla vehicle-bus parsing for supported harness configurations. +- Added kernel-level USB 3 logging support. +- Added updated USB 3 receive equalization and VGA calibration for improved link stability. +- Added 2 GB compressed zram swap for additional memory headroom. +- Fixed GPS clock synchronization to interpret and apply timestamps in UTC. +- Forced the Qualcomm camera BPS pipeline to its maximum clock for more consistent frame processing. +- Disabled unsupported EGL zero-copy paths on Comma 4 while retaining them on compatible Comma 3 and Comma 3X hardware. +- Added in-process audio-stream retries so an unavailable Konik A1 audio DSP does not crash-loop the alert service. +- Added cached Konn3kt-assisted GPS data with freshness checks for faster GNSS acquisition when no local AssistNow token is configured. +- Added measured-voltage power decisions while FastSleep is active. +- Added an authenticated Bluetooth GATT transport and RPC dispatcher. +- Added live remote CAN streaming from a device into Cabana through Konn3kt. +- Updated Cabana and Jotpluggler to current upstream tool foundations while retaining Konn3kt device, route, DBC, and direct remote-stream support. +- Added replay support for IQ.Pilot's crash-safe H.264 fragmented-MP4 recordings, including correct container seeking, decoder-delay handling, and multi-frame packet output. +- Added a precompiled release pipeline for comma 3, comma 3X, and comma 4. +- Added automatic runtime-package bootstrap, revision pinning, and credential reuse for fresh devices and updates. +- Added the iq command center for setup, environment checks, builds, quality checks, package synchronization, status, branch switching, updates, service control, fast restart, and optional reboot. +- Added an IQ.Pilot process layout built around independent model, navigation, map, uploader, backup, and perception services. +- Added clearer on-device build, process-state, and diagnostic output. +- Improved Panda SPI NACK handling for more reliable device-to-vehicle communication. +- Hardened calibration by clearing invalid saved calibration, preserving stable solutions during excessive spread on supported comma 3/3X hardware, and rejecting implausible camera-height data before model or path projection. +- Added validation for every public vehicle platform and route plus expanded deterministic and ARM64 process-replay coverage. diff --git a/iqpilot/iq_maps/__init__.py b/iqpilot/iq_maps/__init__.py new file mode 100644 index 000000000..1d4270037 --- /dev/null +++ b/iqpilot/iq_maps/__init__.py @@ -0,0 +1,5 @@ +import os +from iqpilot.common.basedir import BASEDIR + +VENDOR_MAPD_BIN_DIR = os.path.join(BASEDIR, "iqpilot/third_party/mapd_pfeiferj") +VENDOR_MAPD_PATH = os.path.join(VENDOR_MAPD_BIN_DIR, "mapd") diff --git a/iqpilot/iq_maps/orchestrator.py b/iqpilot/iq_maps/orchestrator.py new file mode 100755 index 000000000..14623a217 --- /dev/null +++ b/iqpilot/iq_maps/orchestrator.py @@ -0,0 +1,419 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import platform +import os +import glob +import shutil +import signal +import subprocess +import threading +import time +from datetime import datetime + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import custom +from iqpilot.common.params import Params +from iqpilot.common.realtime import Ratekeeper, config_realtime_process +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert +from iqpilot.system.hardware.hw import Paths +from iqpilot.iq_maps import VENDOR_MAPD_BIN_DIR, VENDOR_MAPD_PATH +from iqpilot.iq_maps.tile_bundle_downloader import TileBundleDownloader, region_bundle_installed +from iqpilot.iq_maps.vendor_mapd_installer import VendorMapdInstaller + +OfflineMapAction = custom.MapdInputType +_region_sync_worker: threading.Thread | None = None + +_active_proc_lock = threading.Lock() +_active_proc: subprocess.Popen | None = None +_shutdown = threading.Event() +_tile_downloader: TileBundleDownloader | None = None + + +def _vendor_fetch_pidfile() -> str: + return os.path.join(Paths.mapd_root(), ".vendor_fetch.pid") + + +def _pid_is_vendor_fetch(pid: int) -> bool: + try: + with open(f"/proc/{pid}/cmdline", "rb") as f: + cmdline = f.read() + except OSError: + return False + return VENDOR_MAPD_PATH.encode() in cmdline + + +def _reap_orphaned_vendor_fetch() -> None: + pidfile = _vendor_fetch_pidfile() + try: + with open(pidfile) as f: + pid = int(f.read().strip()) + except (OSError, ValueError): + return + try: + if _pid_is_vendor_fetch(pid): + cloudlog.warning(f"iq_maps: reaping orphaned vendor-fetch mapd pid={pid} from a prior run") + os.kill(pid, signal.SIGTERM) + for _ in range(20): + time.sleep(0.1) + if not _pid_is_vendor_fetch(pid): + break + else: + os.kill(pid, signal.SIGKILL) + except ProcessLookupError: + pass + finally: + try: + os.remove(pidfile) + except OSError: + pass + + +def _kill_active_proc() -> None: + with _active_proc_lock: + proc = _active_proc + if proc is None or proc.poll() is not None: + return + proc.terminate() + try: + proc.wait(timeout=3) + except Exception: + proc.kill() + try: + proc.wait(timeout=2) + except Exception: + pass + + +def _handle_shutdown_signal(signum, _frame) -> None: + cloudlog.warning(f"iq_maps: mapd_manager received signal {signum}, cleaning up vendor-fetch subprocess") + _shutdown.set() + _kill_active_proc() + if _tile_downloader is not None: + _tile_downloader.cancel() + worker = _region_sync_worker + if worker is not None and worker.is_alive(): + worker.join(timeout=3) + raise SystemExit(0) + + +def _install_signal_handlers() -> None: + signal.signal(signal.SIGINT, _handle_shutdown_signal) + signal.signal(signal.SIGTERM, _handle_shutdown_signal) + + +def ensure_vendor_runtime() -> None: + try: + VendorMapdInstaller().verify() + except Exception: + cloudlog.exception("iq_maps: vendor runtime verification failed") + +params = Params() +mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else params + + +def stale_region_artifacts() -> list[str]: + patterns = [ + f"{Paths.mapd_root()}/db", + f"{Paths.mapd_root()}/v*" + ] + stale_paths: list[str] = [] + for pattern in patterns: + for match in glob.glob(pattern): + stale_paths.append(match) + if os.path.isdir(match): + stale_paths.extend(glob.glob(match + '/**', recursive=True)) + if not os.path.isfile(VENDOR_MAPD_PATH): + stale_paths.append(VENDOR_MAPD_PATH) + return stale_paths + + +def purge_stale_region_artifacts(stale_paths: list[str]) -> None: + for candidate in stale_paths: + if candidate.endswith('/') and os.path.isfile(candidate[:-1]): + candidate = candidate[:-1] + if os.path.islink(candidate) or os.path.isfile(candidate): + os.remove(candidate) + elif os.path.isdir(candidate): + shutil.rmtree(candidate, ignore_errors=False) + + +def _compose_region_selector(nations: list[str], states: list[str] | None = None) -> str: + requested_paths: list[str] = [] + for state_code in (states or []): + code = str(state_code).strip().upper() + if code and code != "ALL": + requested_paths.append(f"us_state.{code}") + for nation_code in (nations or []): + code = str(nation_code).strip().upper() + if code: + requested_paths.append(f"nation.{code}") + return ",".join(requested_paths) + + +def _fetch_tile_bundles(region_selector: str, abort_check=None) -> None: + global _tile_downloader + if not params.get_bool("OfflineOSMaps"): + return + selectors = [part for part in region_selector.split(",") if part] + if not selectors: + return + try: + _tile_downloader = TileBundleDownloader(params=params, mem_params=mem_params, abort_check=abort_check) + _tile_downloader.download_regions(selectors) + except Exception: + cloudlog.exception("iq_maps: tile bundle download failed") + finally: + _tile_downloader = None + + +def _drive_vendor_fetch(region_selector: str, requested_regions: dict) -> None: + global _active_proc + proc = None + cancelled = False + try: + mem_params.put("OSMDownloadLocations", requested_regions) + proc = subprocess.Popen([VENDOR_MAPD_PATH], cwd=VENDOR_MAPD_BIN_DIR, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + start_new_session=True) + with _active_proc_lock: + _active_proc = proc + with open(_vendor_fetch_pidfile(), "w") as f: + f.write(str(proc.pid)) + + pm = messaging.PubMaster(["mapdIn"]) + sm = messaging.SubMaster(["mapdExtendedOut"]) + time.sleep(4.0) + + for _ in range(10): + msg = messaging.new_message("mapdIn") + msg.mapdIn.type = OfflineMapAction.download + msg.mapdIn.str = region_selector + pm.send("mapdIn", msg) + time.sleep(0.2) + + started = False + deadline = time.monotonic() + 3600.0 + while time.monotonic() < deadline and not _shutdown.is_set(): + sm.update(500) + dp = sm["mapdExtendedOut"].downloadProgress + mem_params.put("OSMDownloadProgress", { + "active": bool(dp.active), + "total_files": int(dp.totalFiles), + "downloaded_files": int(dp.downloadedFiles), + }) + if dp.active: + started = True + elif started: + break + if not mem_params.get("OSMDownloadLocations"): + cancelled = True + cancel = messaging.new_message("mapdIn") + cancel.mapdIn.type = OfflineMapAction.cancelDownload + pm.send("mapdIn", cancel) + break + cloudlog.info(f"iq_maps: vendor map download finished for {region_selector}") + if not cancelled and not _shutdown.is_set(): + _fetch_tile_bundles(region_selector, abort_check=lambda: _shutdown.is_set() or not mem_params.get("OSMDownloadLocations")) + except Exception: + cloudlog.exception("iq_maps: vendor map download failed") + finally: + try: + mem_params.remove("OSMDownloadLocations") + except Exception: + pass + if proc is not None: + proc.terminate() + try: + proc.wait(timeout=5) + except Exception: + proc.kill() + with _active_proc_lock: + _active_proc = None + try: + os.remove(_vendor_fetch_pidfile()) + except OSError: + pass + + +def queue_region_refresh(nations: list[str], states: list[str] | None = None) -> None: + global _region_sync_worker + params.put("OsmDownloadedDate", str(datetime.now().timestamp())) + params.put_bool("OsmDbUpdatesCheck", False) + + region_selector = _compose_region_selector(nations, states) + if not region_selector: + cloudlog.warning("iq_maps: no region selected for offline map download") + return + if _region_sync_worker is not None and _region_sync_worker.is_alive(): + cloudlog.warning("iq_maps: vendor map download already in progress") + return + + requested_regions = {"nations": nations, "states": states or [], "paths": region_selector} + cloudlog.info(f"iq_maps: starting vendor map download for {region_selector}") + _region_sync_worker = threading.Thread( + target=_drive_vendor_fetch, + args=(region_selector, requested_regions), + daemon=True, + ) + _region_sync_worker.start() + + +def normalize_region_selection(nations: list[str], states: list[str] | None = None) -> tuple[list[str], list[str]]: + normalized_nations = list(nations) + normalized_states = list(states or []) + lowered_states = {entry.lower() for entry in normalized_states} + + if "US" in normalized_nations and normalized_states and "all" not in lowered_states: + normalized_nations = [entry for entry in normalized_nations if entry != "US"] + elif normalized_states: + normalized_states = [entry for entry in normalized_states if entry.lower() != "all"] + + return normalized_nations, normalized_states + + +_AUTO_RESTORE_INTERVAL_S = 1800.0 +_last_auto_restore_t = 0.0 + + +def region_data_missing() -> bool: + if not params.get_bool("OsmLocal"): + return False + if not params.get("OsmDownloadedDate"): + return False + if glob.glob(f"{Paths.mapd_root()}/db") or glob.glob(f"{Paths.mapd_root()}/v*"): + return False + if glob.glob(f"{Paths.mapd_root()}/offline/*/*"): + return False + country = params.get("OsmLocationName", return_default=True) + return bool(country) + + +def configured_states() -> list[str]: + try: + states = params.get("OsmStateNames") + if isinstance(states, bytes): + import json as _json + states = _json.loads(states.decode("utf-8")) + if isinstance(states, str): + import json as _json + states = _json.loads(states) + if isinstance(states, list) and states: + return [str(s).strip().upper() for s in states if str(s).strip()] + except Exception: + pass + state = params.get("OsmStateName", return_default=True) + return [state] if state else [] + + +def maybe_auto_restore_region() -> None: + global _last_auto_restore_t + if not region_data_missing(): + return + if _region_sync_worker is not None and _region_sync_worker.is_alive(): + return + now = time.monotonic() + if now - _last_auto_restore_t < _AUTO_RESTORE_INTERVAL_S: + return + _last_auto_restore_t = now + country = params.get("OsmLocationName", return_default=True) + states = configured_states() + nations, states_filtered = normalize_region_selection([country], states) + cloudlog.warning(f"iq_maps: configured offline region {country}/{states} has no data on disk; auto-restoring") + queue_region_refresh(nations, states_filtered) + + +_TILE_RESTORE_INTERVAL_S = 1800.0 +_last_tile_restore_t = 0.0 +_tile_only_worker: threading.Thread | None = None + + +def _configured_region_selector() -> str: + country = params.get("OsmLocationName", return_default=True) + states = configured_states() + nations, states_filtered = normalize_region_selection([country] if country else [], states) + return _compose_region_selector(nations, states_filtered) + + +def tile_bundles_missing() -> bool: + if not params.get_bool("OfflineOSMaps"): + return False + selector = _configured_region_selector() + if not selector: + return False + return any(not region_bundle_installed(part) for part in selector.split(",") if part) + + +def maybe_restore_tile_bundles() -> None: + global _last_tile_restore_t, _tile_only_worker + if not tile_bundles_missing(): + return + if _region_sync_worker is not None and _region_sync_worker.is_alive(): + return + if _tile_only_worker is not None and _tile_only_worker.is_alive(): + return + now = time.monotonic() + if now - _last_tile_restore_t < _TILE_RESTORE_INTERVAL_S: + return + _last_tile_restore_t = now + selector = _configured_region_selector() + cloudlog.warning(f"iq_maps: offline map tile bundles missing for {selector}; downloading") + _tile_only_worker = threading.Thread( + target=_fetch_tile_bundles, + args=(selector,), + kwargs={"abort_check": _shutdown.is_set}, + daemon=True, + ) + _tile_only_worker.start() + + +def sync_osm_request_flags() -> None: + maybe_auto_restore_region() + maybe_restore_tile_bundles() + if params.get_bool("OsmDbUpdatesCheck"): + if _region_sync_worker is not None and _region_sync_worker.is_alive(): + return + purge_stale_region_artifacts(stale_region_artifacts()) + country = params.get("OsmLocationName", return_default=True) + states = configured_states() + filtered_nations, filtered_states = normalize_region_selection([country], states) + queue_region_refresh(filtered_nations, filtered_states) + + if not mem_params.get("OSMDownloadBounds"): + mem_params.put("OSMDownloadBounds", "") + + if not mem_params.get("LastGPSPosition"): + mem_params.put("LastGPSPosition", "{}") + + +def run_loop(): + ensure_vendor_runtime() + config_realtime_process([0, 1, 2, 3], 5) + + rk = Ratekeeper(1, print_delay_threshold=None) + + try: + os.mkdir(Paths.mapd_root()) + except FileExistsError: + pass + except PermissionError: + cloudlog.exception(f"iq_maps: failed to make {Paths.mapd_root()}") + _reap_orphaned_vendor_fetch() + _install_signal_handlers() + + while not _shutdown.is_set(): + show_alert = stale_region_artifacts() and params.get_bool("OsmLocal") + set_offroad_alert("Offroad_OSMUpdateRequired", show_alert, "This alert will be cleared when new maps are downloaded.") + + sync_osm_request_flags() + rk.keep_time() + + +def main(): + run_loop() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/iq_maps/tile_bundle_downloader.py b/iqpilot/iq_maps/tile_bundle_downloader.py new file mode 100644 index 000000000..6d3e8bd7e --- /dev/null +++ b/iqpilot/iq_maps/tile_bundle_downloader.py @@ -0,0 +1,516 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import hashlib +import json +import platform +import threading +import time +from pathlib import Path + +import requests + +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.ui.onroad.offline_tiles import offline_map_root + +try: + from iqpilot.iq_maps.tiles_auth import get_base_urls as _private_base_urls, get_requests_auth as _private_auth +except Exception: # ProprietaryModuleMissing or import errors in stripped builds + _private_base_urls = None + _private_auth = None + +# Tile bundles live as LFS objects in the PRIVATE repo IQ.Lvbs/iqmaps (R2 is gone). +# Anonymous access 404s by design; devices authenticate with the embedded read-only PAT +# carried by the closed-source updater bundle (same fetch account as the OS images). +# Hugging Face is primary: it is CDN-served, so device downloads no longer come off the +# gitea box's home uplink. The gitea copies stay as failover -- if HF ever suspends the +# repo the fleet silently falls back instead of losing maps entirely. +HF_TILE_BUNDLE_BASE_URL = "https://huggingface.co/datasets/T3vl/iqmaps/resolve/main" +DEFAULT_TILE_BUNDLE_BASE_URL = "https://git.konn3kt.com/IQ.Lvbs/iqmaps/raw/branch/master" +FALLBACK_TILE_BUNDLE_BASE_URL = "https://gitlvb.teallvbs.xyz/IQ.Lvbs/iqmaps/raw/branch/master" + +# Gitea /raw NEVER returns LFS content -- it returns this pointer, and the real bytes come +# from the LFS batch API (see _resolve_object_url). +LFS_POINTER_MAGIC = b"version https://git-lfs" +BASE_URL_PARAM = "OfflineTilesBaseUrl" +PROGRESS_PARAM = "OfflineTilesDownloadProgress" +REQUEST_PARAM = "OfflineTilesDownloadRequest" +CHUNK_BYTES = 1 << 20 +# must match scripts/iqpilot/tile_factory/upload_bundles_lfs.py +PART_BYTES = 90 * 1024 * 1024 +HTTP_TIMEOUT_S = 30.0 +STREAM_RETRIES = 8 + + +def candidate_base_urls(params: Params) -> list[str]: + override = params.get(BASE_URL_PARAM) + if isinstance(override, bytes): + override = override.decode("utf-8", errors="ignore") + override = (override or "").strip() + if override: + return [override.rstrip("/")] + # HF first (CDN, and it keeps device traffic off the gitea box's uplink); the bundle's + # own endpoints and the self-hosted defaults follow as failover. + urls: list[str] = [HF_TILE_BUNDLE_BASE_URL] + if _private_base_urls is not None: + try: + urls.extend(url.rstrip("/") for url in _private_base_urls()) + except Exception: + pass + urls.append(DEFAULT_TILE_BUNDLE_BASE_URL) + urls.append(FALLBACK_TILE_BUNDLE_BASE_URL) + seen: set[str] = set() + return [u for u in urls if not (u in seen or seen.add(u))] + + +def _is_hf(url: str) -> bool: + return "huggingface.co" in url.lower() + + +def _maps_auth_module(): + """The read PAT lives in the compiled updater bundle (never in this open file).""" + try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + return import_verified_module("iqpilot_updater_private", "iqpilot_private.updater.git_remote") + except Exception: + pass + try: + import importlib + import os + import sys + root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) + bundle_python = os.path.join(root, "artifacts", "iqpilot_updater_private", "python") + if os.path.isdir(bundle_python): + if bundle_python not in sys.path: + sys.path.insert(0, bundle_python) + return importlib.import_module("iqpilot_private.updater.git_remote") + except Exception: + pass + return None + + +def request_headers(url: str) -> dict: + mod = _maps_auth_module() + if mod is not None: + if _is_hf(url): + # HF wants a bearer token, not basic auth; a build whose bundle predates HF + # hosting simply gets nothing here and falls through to the gitea mirrors. + try: + token = mod.map_tiles_hf_token() + if token: + return {"Authorization": f"Bearer {token}"} + except Exception: + pass + return {} + try: + headers = mod.map_tiles_headers(url) + if headers: + return headers + except Exception: + pass + try: + from iqpilot.common.git_creds import get_credentials + creds = get_credentials() + if creds and all(creds) and "/iq.lvbs/iqmaps" in url.lower(): + import base64 + return {"Authorization": "Basic " + base64.b64encode(f"{creds[0]}:{creds[1]}".encode()).decode()} + except Exception: + pass + return {} + + +def request_auth() -> tuple[str, str] | None: + if _private_auth is None: + return None + try: + return _private_auth() + except Exception: + return None + + +def _lfs_endpoint(base_url: str) -> str: + """///raw/branch/ -> //.git/info/lfs""" + return base_url.split("/raw/", 1)[0] + ".git/info/lfs" + + +def _resolve_oid_url(session: requests.Session, base_url: str, oid: str, size: int, + headers: dict) -> tuple[str, dict]: + """Bundles are stored as bare LFS objects addressed by oid from the index -- no pointer + files, because committing one per part meant hundreds of concurrent commits per branch.""" + batch = session.post(f"{_lfs_endpoint(base_url)}/objects/batch", + data=json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}), + headers={"Content-Type": "application/vnd.git-lfs+json", + "Accept": "application/vnd.git-lfs+json", **headers}, + timeout=HTTP_TIMEOUT_S) + batch.raise_for_status() + entry = batch.json()["objects"][0] + if "actions" not in entry: + raise requests.RequestException(f"LFS object unavailable: {entry.get('error', oid)}") + action = entry["actions"]["download"] + return action["href"], action.get("header", {}) + + +def _resolve_object_url(session: requests.Session, url: str, headers: dict) -> tuple[str, dict]: + """Follow a Gitea LFS pointer to the real (pre-signed) object URL. + + Returns the URL to stream plus any extra headers it needs. A plain host that serves the + bytes directly (local test server, static mirror) resolves to itself unchanged.""" + probe = session.get(url, headers={**headers, "Accept-Encoding": None}, stream=True, + timeout=HTTP_TIMEOUT_S) + probe.raise_for_status() + # A host that serves the bytes itself still needs the caller's auth on the real GET -- + # returning {} here sends the download out anonymous and a private host answers 401. + if int(probe.headers.get("content-length") or 0) >= 1024: + probe.close() + return url, dict(headers) + body = probe.content + probe.close() + if not body.startswith(LFS_POINTER_MAGIC): + return url, dict(headers) + + meta = dict(line.split(" ", 1) for line in body.decode().strip().splitlines() if " " in line) + oid = meta["oid"].split(":", 1)[1] + size = int(meta["size"]) + lfs_base = url.split("/raw/", 1)[0] + ".git/info/lfs" + batch = session.post(f"{lfs_base}/objects/batch", + data=json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}), + headers={"Content-Type": "application/vnd.git-lfs+json", + "Accept": "application/vnd.git-lfs+json", **headers}, + timeout=HTTP_TIMEOUT_S) + batch.raise_for_status() + action = batch.json()["objects"][0]["actions"]["download"] + return action["href"], action.get("header", {}) + + +def fetch_index(base_url: str, session: requests.Session) -> dict: + index_url = f"{base_url}/index.json" + headers = request_headers(index_url) + # requests' auth= rewrites the Authorization header, so only fall back to it when the + # closed-source bundle gave us nothing. + response = session.get(index_url, timeout=HTTP_TIMEOUT_S, headers=headers, + auth=None if headers else request_auth()) + response.raise_for_status() + index = response.json() + regions = index.get("regions") + if not isinstance(regions, dict): + raise ValueError("tile bundle index has no regions") + return regions + + +def region_bundle_dir(selector: str) -> Path: + return offline_map_root() / "regions" / selector + + +def region_bundle_path(selector: str) -> Path: + return region_bundle_dir(selector) / "tiles" / "offline.mbtiles" + + +def region_valhalla_path(selector: str) -> Path: + # valhalla mmaps this tar in place, so it stays uncompressed on disk + return region_bundle_dir(selector) / "valhalla" / "tiles.tar" + + +def region_valhalla_installed(selector: str) -> bool: + return region_valhalla_path(selector).exists() + + +def installed_valhalla_selectors() -> list[str]: + regions_root = offline_map_root() / "regions" + if not regions_root.exists(): + return [] + return sorted( + child.name for child in regions_root.iterdir() + if child.is_dir() and (child / "valhalla" / "tiles.tar").exists() + ) + + +def region_bundle_installed(selector: str) -> bool: + return region_bundle_path(selector).exists() + + +def installed_region_selectors() -> list[str]: + regions_root = offline_map_root() / "regions" + if not regions_root.exists(): + return [] + return sorted( + child.name for child in regions_root.iterdir() + if child.is_dir() and (child / "tiles" / "offline.mbtiles").exists() + ) + + +def _hash_existing(path: Path) -> tuple["hashlib._Hash", int]: + digest = hashlib.sha256() + size = 0 + with open(path, "rb") as f: + while True: + chunk = f.read(CHUNK_BYTES) + if not chunk: + break + digest.update(chunk) + size += len(chunk) + return digest, size + + +def _write_manifest(selector: str, entry: dict) -> None: + manifest = { + "region": selector, + "version": entry.get("version", ""), + "mbtiles": { + "bounds": entry.get("bounds", ""), + "minzoom": entry.get("minzoom"), + "maxzoom": entry.get("maxzoom"), + "bytes": entry.get("bytes"), + "sha256": entry.get("sha256", ""), + }, + } + if entry.get("day_path"): + manifest["mbtiles_day"] = { + "bytes": entry.get("day_bytes"), + "sha256": entry.get("day_sha256", ""), + } + manifest_path = region_bundle_dir(selector) / "manifest.json" + manifest_path.parent.mkdir(parents=True, exist_ok=True) + manifest_path.write_text(json.dumps(manifest, indent=2)) + + +class TileBundleDownloader: + + def __init__(self, params: Params | None = None, mem_params: Params | None = None, + abort_check=None): + self.params = params if params is not None else Params() + if mem_params is not None: + self.mem_params = mem_params + else: + self.mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else self.params + self.session = requests.Session() + self._cancelled = threading.Event() + self._abort_check = abort_check + + def cancel(self) -> None: + self._cancelled.set() + + def _should_abort(self) -> bool: + if self._cancelled.is_set(): + return True + if not self.mem_params.get(REQUEST_PARAM): + self._cancelled.set() + return True + if self._abort_check is not None and self._abort_check(): + self._cancelled.set() + return True + return False + + def _publish_progress(self, region: str, downloaded: int, total: int, active: bool) -> None: + self.mem_params.put(PROGRESS_PARAM, { + "active": active, + "region": region, + "downloaded_bytes": int(downloaded), + "total_bytes": int(total), + }) + + def _download_one(self, selector: str, entry: dict, base_url: str, + progress_offset: int, progress_total: int) -> bool: + night_path = region_bundle_path(selector) + ok = self._download_file( + selector, base_url, entry["path"], int(entry.get("bytes", 0)), + str(entry.get("sha256", "")).strip().lower(), night_path, + progress_offset, progress_total, int(entry.get("parts", 1)), entry.get("objects"), + ) + if not ok: + return False + if entry.get("day_path"): + day_ok = self._download_file( + selector, base_url, entry["day_path"], int(entry.get("day_bytes", 0)), + str(entry.get("day_sha256", "")).strip().lower(), + night_path.with_name("offline_day.mbtiles"), + progress_offset + int(entry.get("bytes", 0)), progress_total, + int(entry.get("day_parts", 1)), entry.get("day_objects"), + ) + if not day_ok: + cloudlog.warning(f"iq_maps: day-style bundle failed for {selector}; night set installed") + if entry.get("valhalla_path"): + # routing is additive: a region whose extract is missing or corrupt must still end up + # with a usable map rather than failing the whole download + try: + nav_ok = self._download_file( + selector, base_url, entry["valhalla_path"], int(entry.get("valhalla_bytes", 0)), + str(entry.get("valhalla_sha256", "")).strip().lower(), + region_valhalla_path(selector), + progress_offset + int(entry.get("bytes", 0)) + int(entry.get("day_bytes", 0)), + progress_total, 1, entry.get("valhalla_objects"), + ) + except Exception as exc: + nav_ok = False + cloudlog.warning(f"iq_maps: routing extract errored for {selector}: {exc}") + if not nav_ok: + cloudlog.warning(f"iq_maps: routing extract failed for {selector}; map tiles installed") + _write_manifest(selector, entry) + cloudlog.info(f"iq_maps: installed tile bundle {selector}") + return True + + def _download_file(self, selector: str, base_url: str, remote_path: str, expected_bytes: int, + expected_sha: str, final_path: Path, + progress_offset: int, progress_total: int, parts: int = 1, + objects: list | None = None) -> bool: + # Bundles are published as .pNN because Cloudflare caps proxied bodies at ~100MB. + # They stream back-to-back into ONE .part file: concatenating afterwards would need + # double the free space, which devices do not have. + base = f"{base_url}/{remote_path.lstrip('/')}" + count = len(objects) if objects else parts + if objects and not _is_hf(base_url): + urls = [None] * count # gitea: resolved per-attempt from the oid + else: + # HF (and plain mirrors) serve the same chunks as ordinary .pNN files + urls = [base] if count <= 1 else [f"{base}.p{i:02d}" for i in range(count)] + part_path = final_path.with_name(final_path.name + ".part") + part_path.parent.mkdir(parents=True, exist_ok=True) + + downloaded = 0 + digest = hashlib.sha256() + last_error: Exception | None = None + for attempt in range(STREAM_RETRIES): + if self._should_abort(): + cloudlog.warning(f"iq_maps: tile bundle download cancelled for {selector}") + return False + if attempt: + time.sleep(min(30.0, 2.0 * attempt)) + try: + digest = hashlib.sha256() + resume_from = 0 + if part_path.exists(): + digest, resume_from = _hash_existing(part_path) + if expected_bytes and resume_from > expected_bytes: + part_path.unlink() + digest = hashlib.sha256() + resume_from = 0 + + # every part but the last is exactly PART_BYTES, so a byte offset maps to a part index + first_part = resume_from // PART_BYTES if len(urls) > 1 else 0 + skip_in_part = resume_from - first_part * PART_BYTES if len(urls) > 1 else resume_from + downloaded = resume_from + mode = "ab" if resume_from else "wb" + with open(part_path, mode) as f: + for index in range(first_part, len(urls)): + if objects and not _is_hf(base_url): + url_headers = request_headers(base_url) + auth = None if url_headers else request_auth() + object_url, object_headers = _resolve_oid_url( + self.session, base_url, objects[index]["oid"], int(objects[index]["size"]), + url_headers) + else: + url = urls[index] + url_headers = request_headers(url) + auth = None if url_headers else request_auth() + # Re-resolve per part: a pre-signed LFS object URL can expire mid-download. + object_url, object_headers = _resolve_object_url(self.session, url, url_headers) + headers = dict(object_headers) + offset = skip_in_part if index == first_part else 0 + if offset: + headers["Range"] = f"bytes={offset}-" + response = self.session.get(object_url, headers=headers, stream=True, + timeout=HTTP_TIMEOUT_S, auth=auth) + if offset and response.status_code != 206: + # server ignored the range: restart this whole file cleanly + f.close() + part_path.unlink(missing_ok=True) + raise requests.RequestException(f"range not honoured for part {index}") + response.raise_for_status() + for chunk in response.iter_content(chunk_size=CHUNK_BYTES): + if self._should_abort(): + cloudlog.warning(f"iq_maps: tile bundle download cancelled for {selector}") + return False + f.write(chunk) + digest.update(chunk) + downloaded += len(chunk) + self._publish_progress(selector, progress_offset + downloaded, progress_total, active=True) + break + except requests.RequestException as exc: + last_error = exc + cloudlog.warning(f"iq_maps: tile bundle stream interrupted for {selector} " + + f"(attempt {attempt + 1}/{STREAM_RETRIES}): {exc}") + else: + raise requests.RequestException(f"stream failed after {STREAM_RETRIES} attempts") from last_error + + if expected_bytes and downloaded != expected_bytes: + cloudlog.error(f"iq_maps: tile bundle size mismatch for {selector}: {downloaded} != {expected_bytes}") + part_path.unlink(missing_ok=True) + return False + if expected_sha and digest.hexdigest() != expected_sha: + cloudlog.error(f"iq_maps: tile bundle sha256 mismatch for {selector}") + part_path.unlink(missing_ok=True) + return False + + part_path.replace(final_path) + return True + + def download_regions(self, selectors: list[str]) -> bool: + self._cancelled.clear() + ok = True + try: + self.mem_params.put(REQUEST_PARAM, {"regions": list(selectors)}) + regions = None + base_url = "" + for candidate in candidate_base_urls(self.params): + try: + regions = fetch_index(candidate, self.session) + base_url = candidate + break + except (requests.RequestException, ValueError, json.JSONDecodeError): + cloudlog.warning(f"iq_maps: tile bundle index unavailable at {candidate}") + if regions is None: + cloudlog.error("iq_maps: no tile bundle host reachable") + return False + + wanted: list[tuple[str, dict]] = [] + for selector in selectors: + entry = regions.get(selector) + if entry is None: + cloudlog.warning(f"iq_maps: no tile bundle published for {selector}") + ok = False + continue + if region_bundle_installed(selector) and self._installed_matches(selector, entry): + continue + wanted.append((selector, entry)) + + progress_total = sum(int(entry.get("bytes", 0)) + int(entry.get("day_bytes", 0)) for _, entry in wanted) + progress_offset = 0 + for selector, entry in wanted: + if self._should_abort(): + return False + try: + if not self._download_one(selector, entry, base_url, progress_offset, progress_total): + ok = False + except (requests.RequestException, OSError): + cloudlog.exception(f"iq_maps: tile bundle download failed for {selector}") + ok = False + progress_offset += int(entry.get("bytes", 0)) + int(entry.get("day_bytes", 0)) + return ok + finally: + self._publish_progress("", 0, 0, active=False) + try: + self.mem_params.remove(REQUEST_PARAM) + except Exception: + pass + + @staticmethod + def _installed_matches(selector: str, entry: dict) -> bool: + manifest_path = region_bundle_dir(selector) / "manifest.json" + try: + manifest = json.loads(manifest_path.read_text()) + except (OSError, json.JSONDecodeError): + return False + installed_sha = str(manifest.get("mbtiles", {}).get("sha256", "")).strip().lower() + expected_sha = str(entry.get("sha256", "")).strip().lower() + if not expected_sha or installed_sha != expected_sha: + return False + if entry.get("day_path"): + day_file = region_bundle_dir(selector) / "tiles" / "offline_day.mbtiles" + installed_day = str(manifest.get("mbtiles_day", {}).get("sha256", "")).strip().lower() + expected_day = str(entry.get("day_sha256", "")).strip().lower() + if not day_file.exists() or installed_day != expected_day: + return False + return True diff --git a/iqpilot/iq_maps/tiles_auth.py b/iqpilot/iq_maps/tiles_auth.py new file mode 100644 index 000000000..4866a1b58 --- /dev/null +++ b/iqpilot/iq_maps/tiles_auth.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 +""" +Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.maps.git_auth") +except ProprietaryModuleMissing: + from iqpilot.maps_private_src.git_auth import * diff --git a/iqpilot/iq_maps/update_vendor_version.py b/iqpilot/iq_maps/update_vendor_version.py new file mode 100755 index 000000000..bbd9582fe --- /dev/null +++ b/iqpilot/iq_maps/update_vendor_version.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import argparse +import os +import re +import sys + +from iqpilot.common.basedir import BASEDIR +from iqpilot.iq_maps import VENDOR_MAPD_PATH +from iqpilot.iq_maps.vendor_mapd_installer import ( + VENDOR_RELEASE_TAG, + sha256_of_file, +) + +_RELEASE_SYMBOL = "VENDOR_RELEASE_TAG" +_INSTALLER_SRC = os.path.join(BASEDIR, "iqpilot", "iq_maps", "vendor_mapd_installer.py") +HASH_FILE = os.path.join(BASEDIR, "iqpilot", "iq_maps", "tests", "mapd_hash") +_HASH_FILE = HASH_FILE +_TAG_ASSIGN = re.compile(rf'^{_RELEASE_SYMBOL}\s*=\s*["\'][^"\']*["\']', re.MULTILINE) + + +def rewrite_pinned_tag(new_tag: str) -> bool: + with open(_INSTALLER_SRC) as f: + src = f.read() + + patched, count = _TAG_ASSIGN.subn(f'{_RELEASE_SYMBOL} = "{new_tag}"', src, count=1) + if count != 1: + print(f"could not locate the {_RELEASE_SYMBOL} assignment in {_INSTALLER_SRC}; nothing written") + return False + + with open(_INSTALLER_SRC, "w") as f: + f.write(patched) + print(f"pinned {_RELEASE_SYMBOL} -> {new_tag}") + return True + + +def refresh_hash_file() -> None: + digest = sha256_of_file(VENDOR_MAPD_PATH) + with open(_HASH_FILE, "w") as f: + f.write(digest) + print(f"wrote binary hash {digest} -> {_HASH_FILE}") + + +def main() -> int: + parser = argparse.ArgumentParser(description="Pin a new mapd release tag and refresh its hash") + parser.add_argument("--new_ver", type=str, help='e.g. --new_ver "v2.1.0"') + args = parser.parse_args() + + if not args.new_ver: + parser.print_help() + print(f'\ncurrently pinned: {VENDOR_RELEASE_TAG} (unchanged)') + return 0 + + target = args.new_ver.strip() + if target == VENDOR_RELEASE_TAG: + reply = input(f"{target} is already the pinned tag — re-run anyway? (y/N): ").strip().lower() + if reply != "y": + print("aborted; nothing changed") + return 0 + + if not rewrite_pinned_tag(target): + return 1 + refresh_hash_file() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/iqpilot/iq_maps/vendor_mapd_installer.py b/iqpilot/iq_maps/vendor_mapd_installer.py new file mode 100755 index 000000000..dc00b63be --- /dev/null +++ b/iqpilot/iq_maps/vendor_mapd_installer.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import hashlib +import os +import sys + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.common.spinner import Spinner +from iqpilot.common.swaglog import cloudlog +from iqpilot.iq_maps import VENDOR_MAPD_PATH +import iqpilot.system.sentry as sentry + +VENDOR_RELEASE_TAG = "v2.0.6-iq1" + +_VERSION_PARAM = "MapdVersion" +_HASH_FILE = os.path.join(BASEDIR, "iqpilot", "iq_maps", "tests", "mapd_hash") +QUARANTINE_PATH = VENDOR_MAPD_PATH + ".quarantined" + + +def sha256_of_file(path: str) -> str: + digest = hashlib.sha256() + with open(path, "rb") as handle: + for block in iter(lambda: handle.read(1 << 20), b""): + digest.update(block) + return digest.hexdigest() + + +def stamp_vendor_version(version: str, params: Params | None = None) -> None: + (params or Params()).put(_VERSION_PARAM, version) + + +class VendorMapdInstaller: + def __init__(self, spinner_ref: Spinner | None = None, params: Params | None = None): + self._spinner = spinner_ref + self._params = params if params is not None else Params() + + def get_installed_version(self) -> str: + return str(self._params.get(_VERSION_PARAM) or "") + + def verify(self) -> bool: + expected = self._expected_hash() + if not expected: + cloudlog.error("iq_maps: pinned mapd hash missing, vendor binary cannot be verified") + return False + + if not os.path.isfile(VENDOR_MAPD_PATH): + self._say("Offline maps engine missing; it will be restored by the next update.") + self._params.remove(_VERSION_PARAM) + return False + + try: + current = sha256_of_file(VENDOR_MAPD_PATH) + except OSError: + cloudlog.exception("iq_maps: vendor mapd unreadable") + return False + + if current == expected: + stamp_vendor_version(VENDOR_RELEASE_TAG, self._params) + try: + os.remove(QUARANTINE_PATH) + except OSError: + pass + self._say(f"Offline maps engine verified [{VENDOR_RELEASE_TAG}]") + return True + + cloudlog.error(f"iq_maps: vendor mapd hash {current[:12]} != pinned {expected[:12]}, quarantining") + self._say("Offline maps engine failed verification; quarantined until the next update.") + try: + os.replace(VENDOR_MAPD_PATH, QUARANTINE_PATH) + except OSError: + cloudlog.exception("iq_maps: vendor mapd quarantine failed") + return False + self._params.remove(_VERSION_PARAM) + try: + raise RuntimeError(f"vendor mapd hash mismatch quarantined: {current}") + except RuntimeError as exc: + sentry.init(sentry.SentryProject.SELFDRIVE) + sentry.capture_exception(exc) + return False + + def _expected_hash(self) -> str: + try: + with open(_HASH_FILE) as f: + return f.read().strip() + except OSError: + return "" + + def _say(self, text: str) -> None: + if self._spinner is not None: + self._spinner.update(text) + + +if __name__ == "__main__": + spinner = Spinner() + ok = VendorMapdInstaller(spinner).verify() + spinner.close() + sys.exit(0 if ok else 1) diff --git a/iqpilot/konn3kt/__init__.py b/iqpilot/konn3kt/__init__.py new file mode 100644 index 000000000..148992e3f --- /dev/null +++ b/iqpilot/konn3kt/__init__.py @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" \ No newline at end of file diff --git a/iqpilot/konn3kt/canlive/__init__.py b/iqpilot/konn3kt/canlive/__init__.py new file mode 100644 index 000000000..3cd07e084 --- /dev/null +++ b/iqpilot/konn3kt/canlive/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" \ No newline at end of file diff --git a/iqpilot/konn3kt/canlive/canlived.py b/iqpilot/konn3kt/canlive/canlived.py new file mode 100755 index 000000000..2a59d2365 --- /dev/null +++ b/iqpilot/konn3kt/canlive/canlived.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import os +import threading + +from websocket import ABNF, create_connection + +import iqpilot.cereal.messaging as messaging +from iqpilot.common.api import Api +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +CAN_SERVICES = ["can"] +RECONNECT_MIN = 1.0 +RECONNECT_MAX = 10.0 + +def _api_host() -> str: + host = "wss://api-iqlabs.konn3kt.com" + host = host.rstrip("/") + if host.startswith("https://"): + host = "wss://" + host[len("https://"):] + elif host.startswith("http://"): + host = "ws://" + host[len("http://"):] + return host + + +def _stream_once(dongle_id: str, ws_uri: str, token: str, exit_event: threading.Event) -> None: + ws = create_connection(ws_uri, cookie="jwt=" + token, enable_multithread=True, timeout=30.0) + cloudlog.info("canlived: connected to %s", ws_uri) + try: + socks = [messaging.sub_sock(s, conflate=False, timeout=100) for s in CAN_SERVICES] + while not exit_event.is_set(): + got_any = False + for sock in socks: + while True: + raw = sock.receive(non_blocking=True) + if raw is None: + break + got_any = True + ws.send_frame(ABNF.create_frame(raw, ABNF.OPCODE_BINARY, 1)) + if not got_any: + exit_event.wait(0.005) + finally: + try: + ws.close() + except Exception: + pass + + +def main(exit_event: threading.Event | None = None) -> None: + if exit_event is None: + exit_event = threading.Event() + + params = Params() + dongle_id = params.get("DongleId", encoding="utf-8") + if not dongle_id: + cloudlog.error("canlived: no DongleId, cannot stream") + return + + api = Api(dongle_id) + host = _api_host() + ws_uri = f"{host}/ws/can/{dongle_id}" + + backoff = RECONNECT_MIN + while not exit_event.is_set(): + try: + token = api.get_token(expiry_hours=1) + _stream_once(dongle_id, ws_uri, token, exit_event) + backoff = RECONNECT_MIN + except Exception as e: + cloudlog.exception("canlived: stream error: %s", e) + exit_event.wait(backoff) + backoff = min(backoff * 2, RECONNECT_MAX) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/konn3kt/cloud_client.py b/iqpilot/konn3kt/cloud_client.py new file mode 100644 index 000000000..2897609eb --- /dev/null +++ b/iqpilot/konn3kt/cloud_client.py @@ -0,0 +1,17 @@ +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + + +import os +from iqpilot.common.api.base import BaseApi +API_HOST = os.getenv('KONN3KT_API_HOST', 'https://api-iqlabs.konn3kt.com') + +class Konn3ktApi(BaseApi): + + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "konn3kt-device-" + + def get_token(self, expiry_hours=1): + return super()._get_token(expiry_hours=expiry_hours) diff --git a/iqpilot/konn3kt/common/__init__.py b/iqpilot/konn3kt/common/__init__.py new file mode 100644 index 000000000..3cd07e084 --- /dev/null +++ b/iqpilot/konn3kt/common/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" \ No newline at end of file diff --git a/iqpilot/konn3kt/common/param_codec.py b/iqpilot/konn3kt/common/param_codec.py new file mode 100644 index 000000000..fed10cc48 --- /dev/null +++ b/iqpilot/konn3kt/common/param_codec.py @@ -0,0 +1,48 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import base64 +import gzip +import json + +from iqpilot.common.params import Params, ParamKeyType + + +def encode_param(name: str, params=None, use_default: bool = False) -> bytes | None: + params = params or Params() + raw = params.get_default_value(name) if use_default else params.get(name) + if raw is None: + return None + + ktype = params.get_type(name) + if ktype == ParamKeyType.BYTES: + return bytes(raw) + if ktype == ParamKeyType.JSON: + return json.dumps(raw).encode("utf-8") + return str(raw).encode("utf-8") + + +_FROM_TEXT = { + ParamKeyType.STRING: lambda s: s, + ParamKeyType.BOOL: lambda s: s.lower() in ("true", "1", "yes"), + ParamKeyType.INT: int, + ParamKeyType.FLOAT: float, + ParamKeyType.TIME: str, + ParamKeyType.JSON: json.loads, +} + + +def restore_param_from_base64(name: str, b64_data: str, compressed: bool = False) -> None: + params = Params() + ktype = params.get_type(name) + + blob = base64.b64decode(b64_data) + if compressed: + blob = gzip.decompress(blob) + + if ktype == ParamKeyType.BYTES: + value = blob + else: + value = _FROM_TEXT.get(ktype, lambda s: s)(blob.decode("utf-8")) + + params.put(name, value) diff --git a/iqpilot/konn3kt/registration.py b/iqpilot/konn3kt/registration.py new file mode 100755 index 000000000..1ef907dd9 --- /dev/null +++ b/iqpilot/konn3kt/registration.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +import os +import time +import json +import jwt +import re +import secrets +from typing import cast +from pathlib import Path + +from datetime import datetime, timedelta, UTC +from iqpilot.common.api import api_get, get_key_pair +from iqpilot.common.params import Params +from iqpilot.common.spinner import Spinner +from iqpilot.system.hardware import HARDWARE, PC +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog + + +UNREGISTERED_DONGLE_ID = "UnregisteredDevice" + +_DONGLE_ID_RE = re.compile(r"^[a-fA-F0-9]{16}$") +IMEI_WAIT_TIMEOUT = 15.0 + + +def _read_persist_dongle_id() -> str | None: + p = Path(Paths.persist_root()) / "comma" / "dongle_id" + try: + if not p.is_file(): + return None + s = p.read_text().strip() + return s or None + except Exception: + cloudlog.exception("failed to read persist dongle_id") + return None + + +def get_cached_dongle_id(params: Params | None = None, prefer_readonly: bool = True) -> str | None: + ro = _read_persist_dongle_id() + if is_valid_dongle_id(ro): + ro = ro.lower() + if prefer_readonly and ro: + return ro + p = Params() if params is None else params + v = p.get("DongleId") + if v and v != UNREGISTERED_DONGLE_ID: + return v.lower() if is_valid_dongle_id(v) else v + return ro or None +def is_valid_dongle_id(dongle_id: str | None) -> bool: + return bool(dongle_id and _DONGLE_ID_RE.fullmatch(dongle_id)) +def get_or_create_dongle_id(params: Params | None = None, prefer_readonly: bool = True) -> str: + p = Params() if params is None else params + dongle_id = get_cached_dongle_id(p, prefer_readonly=prefer_readonly) + if dongle_id and dongle_id != UNREGISTERED_DONGLE_ID: + return dongle_id + dongle_id = secrets.token_hex(8) + p.put("DongleId", dongle_id) + cloudlog.warning(f"generated new DongleId={dongle_id} (no readonly dongle_id found)") + return dongle_id +def ensure_dev_pairing_identity(params: Params | None = None, force_reset: bool = False) -> dict[str, str]: + p = Params() if params is None else params + + persist_dir = Path(Paths.persist_root()) / "comma" + persist_dir.mkdir(parents=True, exist_ok=True) + + dongle_path = persist_dir / "dongle_id" + priv_path = persist_dir / "id_rsa" + pub_path = persist_dir / "id_rsa.pub" + + if force_reset: + for fp in (dongle_path, priv_path, pub_path): + try: + fp.unlink(missing_ok=True) + except Exception: + cloudlog.exception(f"failed to remove {fp}") + try: + (persist_dir / "konn3kt_prime_type").unlink(missing_ok=True) + except Exception: + pass + try: + p.remove("PrimeType") + except Exception: + pass + forced_dongle = os.getenv("KONN3KT_DEV_DONGLE_ID") + dongle_id = forced_dongle.strip().lower() if forced_dongle else None + if dongle_id and not is_valid_dongle_id(dongle_id): + cloudlog.error("KONN3KT_DEV_DONGLE_ID must be 16 hex chars") + dongle_id = None + if dongle_id is None: + existing = None + try: + existing = dongle_path.read_text().strip().lower() if dongle_path.is_file() else None + except Exception: + cloudlog.exception("failed reading existing dev dongle_id") + dongle_id = existing if is_valid_dongle_id(existing) else secrets.token_hex(8) + try: + dongle_path.write_text(dongle_id) + except Exception: + cloudlog.exception("failed writing dev dongle_id") + p.put("DongleId", dongle_id) + p.put("HardwareSerial", p.get("HardwareSerial") or f"DEV-{dongle_id}") + if force_reset or (not priv_path.is_file()) or (not pub_path.is_file()): + try: + from cryptography.hazmat.primitives import serialization + from cryptography.hazmat.primitives.asymmetric import rsa + key = rsa.generate_private_key(public_exponent=65537, key_size=2048) + priv_bytes = key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption(), + ) + pub_bytes = key.public_key().public_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PublicFormat.SubjectPublicKeyInfo, + ) + priv_path.write_bytes(priv_bytes) + pub_path.write_bytes(pub_bytes) + except Exception: + cloudlog.exception("failed generating dev RSA keys") + raise + return { + "dongle_id": dongle_id, + "serial": p.get("HardwareSerial") or f"DEV-{dongle_id}", + "persist_dir": str(persist_dir), + } +def is_registered_device() -> bool: + dongle = Params().get("DongleId") + return dongle not in (None, UNREGISTERED_DONGLE_ID) + + +def _normalize_imei(value: str | None) -> str: + return value or "" + + +def get_registration_identifiers(wait_timeout: float = IMEI_WAIT_TIMEOUT, show_spinner: bool = False) -> tuple[str, str, str]: + serial = HARDWARE.get_serial() + spinner = Spinner() if show_spinner else None + start_time = time.monotonic() + imei1: str | None = None + imei2: str | None = None + + while time.monotonic() - start_time < wait_timeout: + try: + imei1, imei2 = HARDWARE.get_imei(0), HARDWARE.get_imei(1) + if imei1 or imei2: + break + except RuntimeError as e: + if "no modems" in str(e).lower(): + cloudlog.warning("No cellular modem available, proceeding without IMEI") + break + cloudlog.exception("Error getting imei, trying again...") + except Exception: + cloudlog.exception("Error getting imei, trying again...") + time.sleep(1) + + imei1 = _normalize_imei(imei1) + imei2 = _normalize_imei(imei2) + + if not imei1 and not imei2: + cloudlog.warning(f"proceeding with serial-only registration for serial={serial}") + if spinner is not None: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1 or None}, {imei2 or None})") + spinner.close() + + return serial, imei1, imei2 + + +def register(show_spinner=False) -> str | None: + params = Params() + + dongle_id: str | None = get_cached_dongle_id(params, prefer_readonly=True) + if dongle_id in ("", UNREGISTERED_DONGLE_ID): + dongle_id = None + + jwt_algo, private_key, public_key = get_key_pair() + + if not public_key: + dongle_id = UNREGISTERED_DONGLE_ID + cloudlog.warning("missing public key") + elif dongle_id is None: + if show_spinner: + spinner = Spinner() + spinner.update("registering device") + + serial, imei1, imei2 = get_registration_identifiers(wait_timeout=IMEI_WAIT_TIMEOUT, show_spinner=False) + + backoff = 0 + start_time = time.monotonic() + while True: + try: + register_token = jwt.encode({'register': True, 'exp': datetime.now(UTC).replace(tzinfo=None) + timedelta(hours=1)}, + cast(str, private_key), algorithm=jwt_algo) + cloudlog.info("getting pilotauth") + cloudlog.info("getting pilotauth") + resp = api_get("v2/pilotauth/", method='POST', timeout=15, + imei=imei1, imei2=imei2, serial=serial, public_key=public_key, register_token=register_token) + + if resp.status_code in (400, 402, 403): + cloudlog.info(f"Unable to register device, got {resp.status_code}") + dongle_id = UNREGISTERED_DONGLE_ID + else: + dongleauth = json.loads(resp.text) + dongle_id = dongleauth["dongle_id"] + break + except Exception: + cloudlog.exception("failed to authenticate") + backoff = min(backoff + 1, 15) + time.sleep(backoff) + + if time.monotonic() - start_time > 60 and show_spinner: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") + return UNREGISTERED_DONGLE_ID + + if show_spinner: + spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1 or None}, {imei2 or None})") + spinner.close() + + if dongle_id: + params.put("DongleId", dongle_id) + from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert + set_offroad_alert("Offroad_UnregisteredHardware", False) + return dongle_id + + +if __name__ == "__main__": + print(register()) diff --git a/iqpilot/konn3kt/service_health.py b/iqpilot/konn3kt/service_health.py new file mode 100644 index 000000000..848978c1e --- /dev/null +++ b/iqpilot/konn3kt/service_health.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +""" +Copyright ÂŠī¸ IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +def hephaestus_ready(params=None) -> bool: + return True + + +def hephaestus_ready_shim(): + return hephaestus_ready() \ No newline at end of file diff --git a/iqpilot/navd/__init__.py b/iqpilot/navd/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/navd/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/sab/__init__.py b/iqpilot/sab/__init__.py new file mode 100644 index 000000000..37c0527c7 --- /dev/null +++ b/iqpilot/sab/__init__.py @@ -0,0 +1,22 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from .behavior import ( + SteeringAssistanceBehavior, + GuidanceStateMachine, + DriverInterventionMode, + BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE, + apply_aol_brand_overrides, + apply_aol_experience_flags, + read_aol_enabled_pref, + read_joint_engagement_pref, + read_main_cruise_pref, + resolve_brake_intervention_mode, +) + +__all__ = [ + "SteeringAssistanceBehavior", "GuidanceStateMachine", "DriverInterventionMode", + "BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE", "apply_aol_brand_overrides", "apply_aol_experience_flags", + "read_aol_enabled_pref", "read_joint_engagement_pref", "read_main_cruise_pref", + "resolve_brake_intervention_mode", +] diff --git a/iqpilot/sab/behavior.py b/iqpilot/sab/behavior.py new file mode 100644 index 000000000..b68c483c9 --- /dev/null +++ b/iqpilot/sab/behavior.py @@ -0,0 +1,525 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from dataclasses import dataclass +from typing import Optional + +from iqpilot.common.params import Params, UnknownKeyName +from iqdbc.car import structs +from iqpilot.common.realtime import DT_CTRL +from iqdbc.safety import ALTERNATIVE_EXPERIENCE +from iqpilot.selfdrive.selfdrived.events import ET +from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiFlagsIQ, HyundaiSafetyFlagsIQ +from iqpilot.selfdrive.selfdrived.state import SOFT_DISABLE_TIME +from iqpilot.cereal import log, custom + +State = custom.AlwaysOnLateral.AlwaysOnLateralState + +class DriverInterventionMode: + CONTINUE = 0 + SUSPEND = 1 + CANCEL = 2 + +_FORCED_BRAKE_CANCEL = frozenset({"rivian"}) +BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE = ("rivian", "tesla") +_HYUNDAI_MAIN_CRUISE_FLAG_BRANDS = frozenset({"hyundai"}) + +_EXPERIENCE_BY_BRAKE_MODE = { + DriverInterventionMode.CANCEL: ALTERNATIVE_EXPERIENCE.AOL_DISENGAGE_LATERAL_ON_BRAKE, + DriverInterventionMode.SUSPEND: ALTERNATIVE_EXPERIENCE.AOL_PAUSE_LATERAL_ON_BRAKE, +} + + +def uses_forced_brake_cancel(CP: structs.CarParams, CP_IQ: structs.IQCarParams): + del CP_IQ + return CP.brand in _FORCED_BRAKE_CANCEL + + +def read_aol_enabled_pref(params: Params): + return params.get_bool("AolEnabled") + + +def read_main_cruise_pref(params: Params): + return params.get_bool("AolMainCruiseAllowed") + + +def read_joint_engagement_pref(params: Params): + return params.get_bool("AolUnifiedEngagementMode") + + +def read_lateral_override_pause_pref(params: Params): + return params.get_bool("AolPauseOnSteeringOverride") + + +def resolve_brake_intervention_mode(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params: Params): + if uses_forced_brake_cancel(CP, CP_IQ): + return DriverInterventionMode.CANCEL + return params.get("AolSteeringMode", return_default=True) + + +def apply_aol_experience_flags(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params: Params): + if not read_aol_enabled_pref(params): + return + CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.ENABLE_AOL + mode = resolve_brake_intervention_mode(CP, CP_IQ, params) + CP.alternativeExperience |= _EXPERIENCE_BY_BRAKE_MODE.get(mode, 0) + + +def apply_aol_brand_overrides(CP: structs.CarParams, CP_IQ: structs.IQCarParams, params: Params): + if CP.brand in _HYUNDAI_MAIN_CRUISE_FLAG_BRANDS: + CP_IQ.flags |= HyundaiFlagsIQ.MAIN_BTN_LONG_TOGGLE.value + CP_IQ.iqSafetyFlags |= HyundaiSafetyFlagsIQ.MAIN_BTN_LONG_TOGGLE + + if uses_forced_brake_cancel(CP, CP_IQ): + params.put("AolSteeringMode", DriverInterventionMode.CANCEL) + params.put_bool("AolUnifiedEngagementMode", True) + + if CP.brand in BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE: + params.remove("AolMainCruiseAllowed") + + +EventName = log.OnroadEvent.EventName +EventNameIQ = custom.IQOnroadEvent.EventName +TORQUE_DELIVERING_STATES = (State.overriding, State.enabled, State.softDisabling) +LATERAL_CONTROLLED_STATES = (State.paused, *TORQUE_DELIVERING_STATES) +GUIDANCE_AVAILABLE_SIGNAL = ET.ENABLE +GUIDANCE_GATE_BLOCK_SIGNAL = ET.NO_ENTRY +GUIDANCE_SUPPRESSION_SIGNAL = ET.SOFT_DISABLE +GUIDANCE_OPERATOR_OFF_SIGNAL = ET.USER_DISABLE +GUIDANCE_HARD_CUT_SIGNAL = ET.IMMEDIATE_DISABLE +GUIDANCE_DRIVER_OVERRIDE_SIGNAL = ET.OVERRIDE_LATERAL +GUIDANCE_ACTIVE_ALERT = ET.WARNING + +PAUSE_WITH_IQ_EVENTS = ( + EventNameIQ.parkBrakeSilent, + EventNameIQ.seatbeltUnbuckledSilent, + EventNameIQ.doorAjarSilent, + EventNameIQ.brakeHoldSilent, + EventNameIQ.reverseSilent, + EventNameIQ.gearNotDriveSilent, +) +PAUSE_WITH_STOCK_EVENTS = ( + EventName.parkBrake, + EventName.seatbeltNotLatched, + EventName.doorOpen, + EventName.brakeHold, + EventName.reverseGear, + EventName.wrongGear, +) +GEARS_ALLOW_PAUSED_SILENT = PAUSE_WITH_IQ_EVENTS +GEARS_ALLOW_PAUSED = PAUSE_WITH_STOCK_EVENTS + + +@dataclass(frozen=True) +class GuidancePulse: + wake_ping: bool + gate_closed: bool + cooldown_call: bool + driver_kill: bool + hard_cut: bool + hands_on_wheel: bool + hush_cut: bool + pit_stop_ready: bool + + +class GuidanceStateMachine: + def __init__(self, sab): + self.sab = sab + self.selfdrive = sab.selfdrive + self._sm_core = sab.selfdrive.state_machine + self._events = sab.selfdrive.events + self._events_iq = sab.selfdrive.events_iq + self.state = State.disabled + + @property + def _parks_on_override(self) -> bool: + return bool(self.sab.pause_on_lateral_override) + + def _hands_on_landing(self, pulse: GuidancePulse) -> State: + if not pulse.hands_on_wheel: + return State.enabled + return State.paused if self._parks_on_override else State.overriding + + def _queue_alert_if_solo(self, alert_type: str): + if not self.selfdrive.enabled: + self._sm_core.current_alert_types.append(alert_type) + + def _sees_event(self, event_type: str): + return self._events.contains(event_type) or self._events_iq.contains(event_type) + + def _can_take_pit_stop(self): + return self._events.contains_in_list(PAUSE_WITH_STOCK_EVENTS) or self._events_iq.contains_in_list(PAUSE_WITH_IQ_EVENTS) + + def _capture_pulse(self) -> GuidancePulse: + return GuidancePulse( + wake_ping=self._sees_event(GUIDANCE_AVAILABLE_SIGNAL), + gate_closed=self._sees_event(GUIDANCE_GATE_BLOCK_SIGNAL), + cooldown_call=self._sees_event(GUIDANCE_SUPPRESSION_SIGNAL), + driver_kill=self._sees_event(GUIDANCE_OPERATOR_OFF_SIGNAL), + hard_cut=self._sees_event(GUIDANCE_HARD_CUT_SIGNAL), + hands_on_wheel=self._sees_event(GUIDANCE_DRIVER_OVERRIDE_SIGNAL), + hush_cut=self._events_iq.has(EventNameIQ.alcDisengagedSilent), + pit_stop_ready=self._can_take_pit_stop(), + ) + + def _start_grace_period(self): + if not self.selfdrive.enabled: + self._sm_core.soft_disable_timer = int(SOFT_DISABLE_TIME / DT_CTRL) + self._sm_core.current_alert_types.append(GUIDANCE_SUPPRESSION_SIGNAL) + + def _run_global_cutoffs(self, pulse: GuidancePulse) -> Optional[object]: + if pulse.driver_kill: + self._sm_core.current_alert_types.append(GUIDANCE_OPERATOR_OFF_SIGNAL) + return State.paused if pulse.hush_cut else State.disabled + if pulse.hard_cut: + self._queue_alert_if_solo(GUIDANCE_HARD_CUT_SIGNAL) + return State.disabled + return None + + def _handle_disabled(self, pulse: GuidancePulse) -> State: + if not pulse.wake_ping: + return State.disabled + if pulse.gate_closed: + self._queue_alert_if_solo(GUIDANCE_GATE_BLOCK_SIGNAL) + return State.paused if pulse.pit_stop_ready else State.disabled + self._queue_alert_if_solo(GUIDANCE_AVAILABLE_SIGNAL) + return self._hands_on_landing(pulse) + + def _handle_enabled(self, pulse: GuidancePulse) -> State: + forced_state = self._run_global_cutoffs(pulse) + if forced_state is not None: + return forced_state + if pulse.cooldown_call: + self._start_grace_period() + return State.softDisabling + if pulse.hands_on_wheel: + if self._parks_on_override: + return State.paused + self._queue_alert_if_solo(GUIDANCE_DRIVER_OVERRIDE_SIGNAL) + return State.overriding + return State.enabled + + def _handle_soft_disabling(self, pulse: GuidancePulse) -> State: + forced_state = self._run_global_cutoffs(pulse) + if forced_state is not None: + return forced_state + if not pulse.cooldown_call: + return State.enabled + if self._sm_core.soft_disable_timer > 0: + self._queue_alert_if_solo(GUIDANCE_SUPPRESSION_SIGNAL) + return State.softDisabling + return State.disabled + + def _handle_paused(self, pulse: GuidancePulse) -> State: + forced_state = self._run_global_cutoffs(pulse) + if forced_state is not None: + return forced_state + if not pulse.wake_ping: + return State.paused + if pulse.gate_closed: + self._queue_alert_if_solo(GUIDANCE_GATE_BLOCK_SIGNAL) + return State.paused + self._queue_alert_if_solo(GUIDANCE_AVAILABLE_SIGNAL) + return self._hands_on_landing(pulse) + + def _handle_overriding(self, pulse: GuidancePulse) -> State: + forced_state = self._run_global_cutoffs(pulse) + if forced_state is not None: + return forced_state + if pulse.cooldown_call: + self._start_grace_period() + return State.softDisabling + if pulse.hands_on_wheel: + if self._parks_on_override: + return State.paused + self._sm_core.current_alert_types.append(GUIDANCE_DRIVER_OVERRIDE_SIGNAL) + return State.overriding + return State.enabled + + def update(self): + pulse = self._capture_pulse() + handler = { + State.disabled: self._handle_disabled, + State.enabled: self._handle_enabled, + State.softDisabling: self._handle_soft_disabling, + State.paused: self._handle_paused, + State.overriding: self._handle_overriding, + }[self.state] + + self.state = handler(pulse) + enabled = self.state in LATERAL_CONTROLLED_STATES + active = self.state in TORQUE_DELIVERING_STATES + if active: + self._queue_alert_if_solo(GUIDANCE_ACTIVE_ALERT) + return enabled, active + +_E = log.OnroadEvent.EventName +_Q = custom.IQOnroadEvent.EventName +_BTN = structs.CarState.ButtonEvent.Type +_GEAR = structs.CarState.GearShifter + +_CRUISE_SET_TAPS = frozenset((_BTN.accelCruise, _BTN.resumeCruise, _BTN.decelCruise, _BTN.setCruise)) +_LATERAL_TOGGLE_BUTTONS = (_BTN.lkas, _BTN.lfaButton) +_HYUNDAI_LDA_MASK = HyundaiFlags.CANFD + +_QUIET_SWAPS = ( + (_Q.seatbeltUnbuckledSilent, _E.seatbeltNotLatched, True, None), + (_Q.doorAjarSilent, _E.doorOpen, True, None), + (_Q.reverseSilent, _E.reverseGear, False, None), + (_Q.parkBrakeSilent, _E.parkBrake, False, None), + (_Q.brakeHoldSilent, _E.brakeHold, False, None), + (_Q.gearNotDriveSilent, _E.wrongGear, False, + lambda cs: cs.vEgo < 2.5 or cs.gearShifter == _GEAR.reverse), +) + +_DROP_ON_ENTRY = (_E.speedTooLow, _E.belowEngageSpeed, _E.preEnableStandstill, + _E.manualRestart, _E.cruiseDisabled) +_DROP_ON_EXIT = (_E.wrongCruiseMode, _E.pedalPressed, _E.buttonCancel, _E.pcmDisable) + + +class SteeringAssistanceBehavior: + def __init__(self, selfdrive): + sd = selfdrive + self.selfdrive = sd + self.CP, self.CP_IQ, self.params = sd.CP, sd.CP_IQ, sd.params + self.events, self.events_iq = sd.events, sd.events_iq + + self.enabled = self.active = self.available = False + self.pause_on_lateral_override = False + sd.enabled_prev = False + self.state_machine = GuidanceStateMachine(self) + + self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") + self._apply_brand_capabilities() + self._reload_preferences(full=True) + + def _apply_brand_capabilities(self): + brand = self.CP.brand + self.no_main_cruise = brand in BRANDS_WITHOUT_MAIN_CRUISE_TOGGLE + lda_capable = bool(self.CP.flags & _HYUNDAI_LDA_MASK) or bool(self.CP_IQ.flags & HyundaiFlagsIQ.HAS_LFA_BUTTON) + self.hkg_allow = brand == "hyundai" and lda_capable + + def _reload_preferences(self, full: bool = False): + self.main_enabled_toggle = read_main_cruise_pref(self.params) + self.unified_engagement_mode = read_joint_engagement_pref(self.params) + self.pause_on_lateral_override = read_lateral_override_pause_pref(self.params) + if full: + self.enabled_toggle = read_aol_enabled_pref(self.params) + self.steering_mode_on_brake = resolve_brake_intervention_mode(self.CP, self.CP_IQ, self.params) + + def read_params(self): + self._reload_preferences() + + def _has(self, ev): + return self.events.has(ev) + + def _drop(self, ev): + self.events.remove(ev) + + def _raise(self, ev): + self.events.add(ev) + + def _emit(self, ev): + self.events_iq.add(ev) + + def _retract(self, ev): + self.events_iq.remove(ev) + + def _emitted(self, ev): + return self.events_iq.contains(ev) + + def _emitted_any(self, evs): + return self.events_iq.contains_in_list(evs) + + def _iq_has(self, ev): + return self.events_iq.has(ev) + + def _brake_without_gas(self, cs): + prev_gas = self.selfdrive.CS_prev.gasPressed + gas_rising_edge = cs.gasPressed and not prev_gas + override_via_gas = gas_rising_edge and self.disengage_on_accelerator + return self._has(_E.pedalPressed) and not override_via_gas + + def _lateral_overridden(self): + return self.events.contains(ET.OVERRIDE_LATERAL) or self.events_iq.contains(ET.OVERRIDE_LATERAL) + + def _may_silently_resume(self, cs): + suspend_on_brake = self.steering_mode_on_brake == DriverInterventionMode.SUSPEND + if suspend_on_brake and self._brake_without_gas(cs): + return False + if self.pause_on_lateral_override and self._lateral_overridden(): + return False + return not self._emitted_any(GEARS_ALLOW_PAUSED_SILENT) + + @property + def _long_held_two_cycles(self): + sd = self.selfdrive + return bool(sd.enabled_prev and sd.enabled) + + def _uem_blocks_engage(self): + if not self.unified_engagement_mode or self.enabled: + return True + return self._long_held_two_cycles + + def _lateral_offered(self, cs): + return bool(cs.lateralAvailable or cs.cruiseState.available or self.hkg_allow or self.CP.brand == "tesla") + + @staticmethod + def _main_cruise_live(cs): + cruise = getattr(cs, 'cruiseState', None) + if getattr(cruise, 'available', False): + return True + return bool(getattr(cs, 'cruiseFaultLateralMode', False)) + + def _swap_event(self, stock: int, silent: int): + self._drop(stock) + self._emit(silent) + + def _flag_pause(self): + already_held = self.state_machine.state is State.paused + if not already_held: + self._emit(_Q.alcDisengagedSilent) + + def _resolve_wrong_mode(self, alert_only: bool): + if not alert_only: + self._drop(_E.wrongCarMode) + elif self._has(_E.wrongCarMode): + self._swap_event(_E.wrongCarMode, _Q.carModeMismatchNotice) + + def _consume_joystick_aol_request(self, cs) -> str | None: + if not self.params.get_bool("JoystickDebugMode"): + return None + try: + raw = self.params.get("JoystickAolRequest") + except UnknownKeyName: + return None + if not raw: + return None + try: + request = raw.decode("utf-8") if isinstance(raw, (bytes, bytearray)) else str(raw) + except Exception: + request = "" + try: + self.params.remove("JoystickAolRequest") + except UnknownKeyName: + return None + + verb = request.strip().lower() + if verb not in ("enable", "disable"): + return None + if not getattr(cs, "started", False): + return None + if getattr(cs, "doorOpen", False) or getattr(cs, "seatbeltUnlatched", False): + return None + parked_or_reverse = getattr(cs, "gearShifter", _GEAR.unknown) in (_GEAR.park, _GEAR.reverse) + return None if parked_or_reverse else verb + + def _phase_joystick(self, cs): + verb = self._consume_joystick_aol_request(cs) + if verb is not None: + self._emit(_Q.alcEngaged if verb == "enable" else _Q.alcDisengaged) + + def _phase_soften_for_lateral_session(self, cs): + if self.selfdrive.enabled or not self.enabled: + return + + for silent, stock, standstill_only, extra in _QUIET_SWAPS: + if standstill_only and not cs.standstill: + continue + if not self._has(stock): + continue + if extra is not None and not extra(cs): + continue + self._swap_event(stock, silent) + self._flag_pause() + + if self.steering_mode_on_brake == DriverInterventionMode.SUSPEND and self._brake_without_gas(cs): + self._flag_pause() + + for chatter in _DROP_ON_ENTRY: + self._drop(chatter) + + _ENGAGE_TRIGGERS = (_E.pcmEnable, _E.buttonEnable) + + def _phase_engagement(self, cs): + long_engage = any(self._has(trig) for trig in self._ENGAGE_TRIGGERS) + tapped_set = any(be.type in _CRUISE_SET_TAPS for be in cs.buttonEvents) + self._resolve_wrong_mode(long_engage or tapped_set) + + if long_engage: + if self._brake_without_gas(cs): + self._emit(_Q.pedalHeldNotice) + if self._uem_blocks_engage(): + self._drop(_E.pcmEnable) + self._drop(_E.buttonEnable) + return + + if self.main_enabled_toggle and self._main_cruise_live(cs) and not self._main_cruise_live(self.selfdrive.CS_prev): + self._emit(_Q.alcEngaged) + + def _phase_buttons(self, cs): + kill_all = False + long_dropped_out = self.selfdrive.enabled_prev and not self.selfdrive.enabled + for be in cs.buttonEvents: + if be.type == _BTN.cancel and long_dropped_out: + self._emit(_Q.speedManually) + if not (be.type in _LATERAL_TOGGLE_BUTTONS and be.pressed and self._lateral_offered(cs)): + continue + if not self.enabled: + self._emit(_Q.alcEngaged) + continue + self._emit(_Q.alcDisengaged) + if self.selfdrive.enabled: + kill_all = True + return kill_all + + def _phase_availability(self, cs): + main_off = self.main_enabled_toggle and not self._main_cruise_live(cs) + if self.no_main_cruise or (self._lateral_offered(cs) and not main_off): + return + self._drop(_E.buttonEnable) + if self.enabled: + self._emit(_Q.alcDisengaged) + + def _phase_brake_policy(self, cs): + if self.steering_mode_on_brake != DriverInterventionMode.CANCEL or not self._brake_without_gas(cs): + return + if self.enabled: + self._emit(_Q.alcDisengaged) + elif self._emitted(_Q.alcEngaged): + self._retract(_Q.alcEngaged) + self._emit(_Q.pedalHeldNotice) + + def _phase_resume_from_pause(self, cs): + held = self.state_machine.state is State.paused + if held and self._may_silently_resume(cs): + self._emit(_Q.alcEngagedSilent) + + def update_events(self, cs): + self._phase_joystick(cs) + self._phase_soften_for_lateral_session(cs) + self._phase_engagement(cs) + kill_all = self._phase_buttons(cs) + self._phase_availability(cs) + self._phase_brake_policy(cs) + self._phase_resume_from_pause(cs) + + for chatter in _DROP_ON_EXIT: + self._drop(chatter) + + if kill_all: + self._raise(_E.buttonCancel) + + def update(self, cs): + if not self.enabled_toggle and not self.params.get_bool("JoystickDebugMode"): + return + self.update_events(cs) + self.update_state() + + def update_state(self): + sd = self.selfdrive + sd.enabled_prev = sd.enabled + runnable = sd.initialized and not self.CP.passive + if runnable: + verdict = self.state_machine.update() + self.enabled, self.active = verdict diff --git a/iqpilot/sab/tests/test_sab.py b/iqpilot/sab/tests/test_sab.py new file mode 100644 index 000000000..7d5a7e104 --- /dev/null +++ b/iqpilot/sab/tests/test_sab.py @@ -0,0 +1,229 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from types import SimpleNamespace + +from iqpilot.cereal import custom +from iqdbc.car import structs +from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiFlagsIQ +from iqpilot.sab.behavior import SteeringAssistanceBehavior +from iqpilot.selfdrive.selfdrived.iq_events import IQEvents +from iqpilot.selfdrive.selfdrived.events import Events +from iqpilot.cereal import log + + +ButtonType = structs.CarState.ButtonEvent.Type +EventName = log.OnroadEvent.EventName +EventNameIQ = custom.IQOnroadEvent.EventName +GuidanceState = custom.AlwaysOnLateral.AlwaysOnLateralState + + +class MockParams: + def __init__(self, main_cruise_allowed: bool = False, aol_enabled: bool = True, + pause_on_steering_override: bool = False): + self.main_cruise_allowed = main_cruise_allowed + self.aol_enabled = aol_enabled + self.pause_on_steering_override = pause_on_steering_override + + def get_bool(self, key: str) -> bool: + return { + "AolEnabled": self.aol_enabled, + "AolMainCruiseAllowed": self.main_cruise_allowed, + "AolUnifiedEngagementMode": False, + "AolPauseOnSteeringOverride": self.pause_on_steering_override, + "JoystickDebugMode": False, + }.get(key, False) + + def get(self, key: str, return_default: bool = False): + if key == "AolSteeringMode": + return 0 if return_default else b"0" + return None + + def remove(self, key: str) -> None: + return None + + +def make_selfdrive(cp_flags: int, brand: str = "hyundai", main_cruise_allowed: bool = False, + aol_enabled: bool = True, cp_iq_flags: int = 0, + pause_on_steering_override: bool = False): + cp = SimpleNamespace( + brand=brand, + flags=cp_flags, + passive=False, + notCar=False, + safetyModel=structs.CarParams.SafetyModel.noOutput, + ) + cp_iq = SimpleNamespace(flags=cp_iq_flags) + return SimpleNamespace( + CP=cp, + CP_IQ=cp_iq, + params=MockParams(main_cruise_allowed, aol_enabled, pause_on_steering_override), + state_machine=SimpleNamespace(soft_disable_timer=0, current_alert_types=[]), + events=Events(), + events_iq=IQEvents(), + CS_prev=SimpleNamespace( + gasPressed=False, + cruiseState=SimpleNamespace(available=False), + lateralAvailable=False, + ), + enabled=False, + enabled_prev=False, + initialized=True, + ) + + +def make_car_state(): + return SimpleNamespace( + started=True, + standstill=False, + doorOpen=False, + seatbeltUnlatched=False, + gearShifter=structs.CarState.GearShifter.drive, + vEgo=0.0, + gasPressed=False, + brakePressed=False, + cruiseState=SimpleNamespace(available=False), + lateralAvailable=False, + buttonEvents=[structs.CarState.ButtonEvent(pressed=True, type=ButtonType.lkas)], + ) + + +def make_vw_car_state(cruise_available: bool, cruise_fault_lateral: bool = False): + return SimpleNamespace( + started=True, + standstill=False, + doorOpen=False, + seatbeltUnlatched=False, + gearShifter=structs.CarState.GearShifter.drive, + vEgo=0.0, + gasPressed=False, + brakePressed=False, + cruiseState=SimpleNamespace(available=cruise_available), + lateralAvailable=cruise_available or cruise_fault_lateral, + cruiseFaultLateralMode=cruise_fault_lateral, + buttonEvents=[], + ) + + +def test_hyundai_lkas_button_can_arm_guidance_before_lateral_available(): + selfdrive = make_selfdrive(0, cp_iq_flags=HyundaiFlagsIQ.HAS_LFA_BUTTON) + guidance = SteeringAssistanceBehavior(selfdrive) + car_state = make_car_state() + car_state.buttonEvents = [structs.CarState.ButtonEvent(pressed=True, type=ButtonType.lfaButton)] + + guidance.update_events(car_state) + + assert selfdrive.events_iq.has(EventNameIQ.alcEngaged) + + +def test_hyundai_lkas_button_stays_inactive_without_platform_support(): + selfdrive = make_selfdrive(0) + guidance = SteeringAssistanceBehavior(selfdrive) + + guidance.update_events(make_car_state()) + + assert not selfdrive.events_iq.has(EventNameIQ.alcEngaged) + + +def test_main_cruise_drop_cuts_guidance_even_if_lateral_signal_stays_true(): + selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True) + selfdrive.CS_prev = make_vw_car_state(cruise_available=True) + guidance = SteeringAssistanceBehavior(selfdrive) + guidance.enabled = True + + guidance.update_events(make_vw_car_state(cruise_available=False)) + + assert selfdrive.events_iq.has(EventNameIQ.alcDisengaged) + + +def test_faulted_lateral_mode_does_not_force_disable_guidance(): + selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True) + selfdrive.CS_prev = make_vw_car_state(cruise_available=True) + guidance = SteeringAssistanceBehavior(selfdrive) + guidance.enabled = True + + guidance.update_events(make_vw_car_state(cruise_available=False, cruise_fault_lateral=True)) + + assert not selfdrive.events_iq.has(EventNameIQ.alcDisengaged) + + +def test_main_switch_rising_edge_arms_guidance_during_faulted_cruise(): + selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True) + selfdrive.CS_prev = make_vw_car_state(cruise_available=False, cruise_fault_lateral=False) + guidance = SteeringAssistanceBehavior(selfdrive) + + guidance.update_events(make_vw_car_state(cruise_available=False, cruise_fault_lateral=True)) + + assert selfdrive.events_iq.has(EventNameIQ.alcEngaged) + + +def test_main_cruise_rising_edge_does_not_engage_when_toggle_is_off(): + selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True, aol_enabled=False) + selfdrive.CS_prev = make_vw_car_state(cruise_available=False) + guidance = SteeringAssistanceBehavior(selfdrive) + + guidance.update(make_vw_car_state(cruise_available=True)) + + assert not selfdrive.events_iq.has(EventNameIQ.alcEngaged) + assert not guidance.active + assert not guidance.enabled + assert guidance.state_machine.state == custom.AlwaysOnLateral.AlwaysOnLateralState.disabled + + +def run_cycle(guidance, selfdrive, car_state, steering_pressed: bool): + selfdrive.events.clear() + selfdrive.events_iq.clear() + if steering_pressed: + selfdrive.events.add(EventName.steerOverride) + guidance.update(car_state) + selfdrive.CS_prev = car_state + + +def make_engaged_guidance(pause_on_steering_override: bool): + selfdrive = make_selfdrive(0, brand="volkswagen", pause_on_steering_override=pause_on_steering_override) + selfdrive.CS_prev = make_vw_car_state(cruise_available=True) + guidance = SteeringAssistanceBehavior(selfdrive) + guidance.enabled = True + guidance.state_machine.state = GuidanceState.enabled + return guidance, selfdrive + + +def test_steering_override_parks_guidance_when_enabled(): + guidance, selfdrive = make_engaged_guidance(True) + + run_cycle(guidance, selfdrive, make_vw_car_state(cruise_available=True), steering_pressed=True) + + assert guidance.state_machine.state == GuidanceState.paused + assert guidance.enabled + assert not guidance.active + + +def test_guidance_resumes_once_steering_is_released(): + guidance, selfdrive = make_engaged_guidance(True) + + run_cycle(guidance, selfdrive, make_vw_car_state(cruise_available=True), steering_pressed=True) + run_cycle(guidance, selfdrive, make_vw_car_state(cruise_available=True), steering_pressed=False) + + assert guidance.state_machine.state == GuidanceState.enabled + assert guidance.active + + +def test_steering_override_keeps_torque_when_option_is_off(): + guidance, selfdrive = make_engaged_guidance(False) + + run_cycle(guidance, selfdrive, make_vw_car_state(cruise_available=True), steering_pressed=True) + + assert guidance.state_machine.state == GuidanceState.overriding + assert guidance.active + + +def test_main_cruise_rising_edge_engages_when_toggle_is_on(): + selfdrive = make_selfdrive(0, brand="volkswagen", main_cruise_allowed=True, aol_enabled=True) + selfdrive.CS_prev = make_vw_car_state(cruise_available=False) + guidance = SteeringAssistanceBehavior(selfdrive) + + guidance.update(make_vw_car_state(cruise_available=True)) + + assert selfdrive.events_iq.has(EventNameIQ.alcEngaged) + assert guidance.active diff --git a/iqpilot/sab/tests/test_sab_state_machine.py b/iqpilot/sab/tests/test_sab_state_machine.py new file mode 100644 index 000000000..38d8fa114 --- /dev/null +++ b/iqpilot/sab/tests/test_sab_state_machine.py @@ -0,0 +1,234 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import pytest + +from iqpilot.cereal import custom +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.selfdrived.events import ET +from iqpilot.selfdrive.selfdrived.state import SOFT_DISABLE_TIME +from iqpilot.sab.behavior import (GuidanceStateMachine, PAUSE_WITH_IQ_EVENTS, + PAUSE_WITH_STOCK_EVENTS) + +State = custom.AlwaysOnLateral.AlwaysOnLateralState +EventNameIQ = custom.IQOnroadEvent.EventName + +SOFT_DISABLE_FRAMES = int(SOFT_DISABLE_TIME / DT_CTRL) + +ENABLE = ET.ENABLE +NO_ENTRY = ET.NO_ENTRY +SOFT = ET.SOFT_DISABLE +USER = ET.USER_DISABLE +IMMEDIATE = ET.IMMEDIATE_DISABLE +OVERRIDE = ET.OVERRIDE_LATERAL +SILENT = "silent-disable" +PAUSE_OK = "pause-eligible" + + +class SignalBag: + def __init__(self, types=(), names=()): + self._types = set(types) + self._names = set(names) + + def contains(self, event_type): + return event_type in self._types + + def has(self, name): + return name in self._names + + def contains_in_list(self, names): + return any(n in self._names for n in names) + + +class Host: + class _SSM: + def __init__(self): + self.current_alert_types = [] + self.soft_disable_timer = 0 + + def __init__(self, signals, selfdrive_enabled=False): + types = {s for s in signals if s in (ENABLE, NO_ENTRY, SOFT, USER, IMMEDIATE, OVERRIDE)} + names = set() + if SILENT in signals: + names.add(EventNameIQ.alcDisengagedSilent) + if PAUSE_OK in signals: + names.add(PAUSE_WITH_IQ_EVENTS[0]) + + self.enabled = selfdrive_enabled + self.state_machine = self._SSM() + self.events = SignalBag(types) + self.events_iq = SignalBag((), names) + + +class Sab: + def __init__(self, host, pause_on_lateral_override=False): + self.selfdrive = host + self.pause_on_lateral_override = pause_on_lateral_override + + +def machine_at(state, signals, selfdrive_enabled=False, pause_on_lateral_override=False): + host = Host(signals, selfdrive_enabled) + m = GuidanceStateMachine(Sab(host, pause_on_lateral_override)) + m.state = state + return m, host + + +TRANSITIONS = [ + ("idle stays idle", State.disabled, (), State.disabled), + ("engage", State.disabled, (ENABLE,), State.enabled), + ("engage while overriding", State.disabled, (ENABLE, OVERRIDE), State.overriding), + ("blocked entry", State.disabled, (ENABLE, NO_ENTRY), State.disabled), + ("blocked entry parks when pause-eligible", State.disabled, (ENABLE, NO_ENTRY, PAUSE_OK), State.paused), + ("cruise steady", State.enabled, (), State.enabled), + ("driver off switch", State.enabled, (USER,), State.disabled), + ("driver off switch, silent -> pause", State.enabled, (USER, SILENT), State.paused), + ("hard fault", State.enabled, (IMMEDIATE,), State.disabled), + ("grace period entry", State.enabled, (SOFT,), State.softDisabling), + ("hands on wheel", State.enabled, (OVERRIDE,), State.overriding), + ("user beats soft", State.enabled, (USER, SOFT), State.disabled), + ("hard beats soft", State.enabled, (IMMEDIATE, SOFT), State.disabled), + ("condition cleared", State.softDisabling, (), State.enabled), + ("user during grace", State.softDisabling, (USER,), State.disabled), + ("hard during grace", State.softDisabling, (IMMEDIATE,), State.disabled), + ("stays parked", State.paused, (), State.paused), + ("blocked resume", State.paused, (ENABLE, NO_ENTRY), State.paused), + ("resume", State.paused, (ENABLE,), State.enabled), + ("resume into override", State.paused, (ENABLE, OVERRIDE), State.overriding), + ("user kill while parked", State.paused, (USER,), State.disabled), + ("silent user kill re-parks", State.paused, (USER, SILENT), State.paused), + ("hard fault while parked", State.paused, (IMMEDIATE,), State.disabled), + ("override released", State.overriding, (), State.enabled), + ("override held", State.overriding, (OVERRIDE,), State.overriding), + ("override to grace", State.overriding, (SOFT,), State.softDisabling), + ("override user kill", State.overriding, (USER,), State.disabled), + ("override hard fault", State.overriding, (IMMEDIATE,), State.disabled), +] + +@pytest.mark.parametrize("label,start,signals,expected", TRANSITIONS, ids=[t[0] for t in TRANSITIONS]) +def test_transition(label, start, signals, expected): + m, _ = machine_at(start, signals) + m.update() + assert m.state == expected + + +@pytest.mark.parametrize("start,signals,expected_enabled,expected_active", [ + (State.disabled, (), False, False), + (State.disabled, (ENABLE,), True, True), + (State.disabled, (ENABLE, NO_ENTRY, PAUSE_OK), True, False), + (State.enabled, (), True, True), + (State.enabled, (SOFT,), True, True), + (State.enabled, (USER,), False, False), + (State.overriding, (OVERRIDE,), True, True), +]) +def test_update_outputs(start, signals, expected_enabled, expected_active): + m, _ = machine_at(start, signals) + enabled, active = m.update() + assert (enabled, active) == (expected_enabled, expected_active) + +class TestSoftDisableTimer: + def test_grace_period_arms_timer_when_solo(self): + m, host = machine_at(State.enabled, (SOFT,)) + m.update() + assert m.state == State.softDisabling + assert host.state_machine.soft_disable_timer == SOFT_DISABLE_FRAMES + assert ET.SOFT_DISABLE in host.state_machine.current_alert_types + + def test_grace_period_skips_timer_when_selfdrive_owns_it(self): + m, host = machine_at(State.enabled, (SOFT,), selfdrive_enabled=True) + m.update() + assert m.state == State.softDisabling + assert host.state_machine.soft_disable_timer == 0 + + def test_expiry_disables(self): + m, host = machine_at(State.softDisabling, (SOFT,)) + host.state_machine.soft_disable_timer = 0 + m.update() + assert m.state == State.disabled + + def test_countdown_keeps_grace(self): + m, host = machine_at(State.softDisabling, (SOFT,)) + host.state_machine.soft_disable_timer = 5 + m.update() + assert m.state == State.softDisabling + +class TestAlertQueueing: + def test_alerts_only_queued_when_solo(self): + m, host = machine_at(State.disabled, (ENABLE,), selfdrive_enabled=True) + m.update() + assert host.state_machine.current_alert_types == [] + + def test_engage_alert_queued(self): + m, host = machine_at(State.disabled, (ENABLE,)) + m.update() + assert ET.ENABLE in host.state_machine.current_alert_types + assert ET.WARNING in host.state_machine.current_alert_types + + def test_no_entry_alert_queued(self): + m, host = machine_at(State.disabled, (ENABLE, NO_ENTRY)) + m.update() + assert ET.NO_ENTRY in host.state_machine.current_alert_types + + def test_user_disable_alert_always_queued(self): + m, host = machine_at(State.enabled, (USER,), selfdrive_enabled=True) + m.update() + assert ET.USER_DISABLE in host.state_machine.current_alert_types + + def test_override_alert_repeats_while_held(self): + m, host = machine_at(State.overriding, (OVERRIDE,), selfdrive_enabled=True) + m.update() + assert ET.OVERRIDE_LATERAL in host.state_machine.current_alert_types + +class TestPauseEligibility: + @pytest.mark.parametrize("event_name", PAUSE_WITH_IQ_EVENTS) + def test_each_iq_pause_event_parks(self, event_name): + host = Host((ENABLE, NO_ENTRY)) + host.events_iq = SignalBag((), {event_name}) + m = GuidanceStateMachine(Sab(host)) + m.state = State.disabled + m.update() + assert m.state == State.paused + + @pytest.mark.parametrize("event_name", PAUSE_WITH_STOCK_EVENTS) + def test_each_stock_pause_event_parks(self, event_name): + host = Host((ENABLE, NO_ENTRY)) + host.events = SignalBag({ENABLE, NO_ENTRY}, {event_name}) + m = GuidanceStateMachine(Sab(host)) + m.state = State.disabled + m.update() + assert m.state == State.paused + +OVERRIDE_PAUSE_TRANSITIONS = [ + ("hands on wheel parks", State.enabled, (OVERRIDE,), State.paused), + ("override held stays parked", State.overriding, (OVERRIDE,), State.paused), + ("engage while overriding parks", State.disabled, (ENABLE, OVERRIDE), State.paused), + ("parked resume waits for release", State.paused, (ENABLE, OVERRIDE), State.paused), + ("release resumes", State.paused, (ENABLE,), State.enabled), + ("hands off keeps steering", State.enabled, (), State.enabled), + ("user kill still kills", State.enabled, (OVERRIDE, USER), State.disabled), + ("hard fault still faults", State.enabled, (OVERRIDE, IMMEDIATE), State.disabled), + ("grace beats override", State.enabled, (OVERRIDE, SOFT), State.softDisabling), +] + +@pytest.mark.parametrize("label,start,signals,expected", OVERRIDE_PAUSE_TRANSITIONS, + ids=[t[0] for t in OVERRIDE_PAUSE_TRANSITIONS]) +def test_override_pause_transition(label, start, signals, expected): + m, _ = machine_at(start, signals, pause_on_lateral_override=True) + m.update() + assert m.state == expected + + +class TestOverridePauseOutputs: + def test_torque_stops_while_overriding(self): + m, _ = machine_at(State.enabled, (OVERRIDE,), pause_on_lateral_override=True) + enabled, active = m.update() + assert (enabled, active) == (True, False) + + def test_torque_returns_on_release(self): + m, _ = machine_at(State.paused, (ENABLE,), pause_on_lateral_override=True) + enabled, active = m.update() + assert (enabled, active) == (True, True) + + def test_override_alert_not_queued_while_parked(self): + m, host = machine_at(State.enabled, (OVERRIDE,), pause_on_lateral_override=True) + m.update() + assert ET.OVERRIDE_LATERAL not in host.state_machine.current_alert_types diff --git a/iqpilot/selfdrive/__init__.py b/iqpilot/selfdrive/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/assets/.gitattributes b/iqpilot/selfdrive/assets/.gitattributes new file mode 100644 index 000000000..2ea5aa365 --- /dev/null +++ b/iqpilot/selfdrive/assets/.gitattributes @@ -0,0 +1,10 @@ +*.png -filter -diff -merge -text +**/*.png -filter -diff -merge -text +*.svg -filter -diff -merge text eol=lf +**/*.svg -filter -diff -merge text eol=lf +*.jpg -filter -diff -merge -text +**/*.jpg -filter -diff -merge -text +*.jpeg -filter -diff -merge -text +**/*.jpeg -filter -diff -merge -text +*.webp -filter -diff -merge -text +**/*.webp -filter -diff -merge -text diff --git a/iqpilot/selfdrive/assets/.gitignore b/iqpilot/selfdrive/assets/.gitignore new file mode 100644 index 000000000..fffd4b4ed --- /dev/null +++ b/iqpilot/selfdrive/assets/.gitignore @@ -0,0 +1,4 @@ +*.cc +fonts/*.fnt +fonts/*.png +translations_assets.qrc diff --git a/iqpilot/selfdrive/assets/assets.qrc b/iqpilot/selfdrive/assets/assets.qrc new file mode 100644 index 000000000..26a7d998e --- /dev/null +++ b/iqpilot/selfdrive/assets/assets.qrc @@ -0,0 +1,20 @@ + + + ../../third_party/bootstrap/bootstrap-icons.svg + images/button_continue_triangle.svg + icons/circled_check.svg + icons/circled_slash.svg + icons/eye_open.svg + icons/eye_closed.svg + icons/close.svg + icons/lock_closed.svg + icons/checkmark.svg + icons/warning.png + icons/wifi_strength_low.svg + icons/wifi_strength_medium.svg + icons/wifi_strength_high.svg + icons/wifi_strength_full.svg + + ../ui/translations/languages.json + + diff --git a/iqpilot/selfdrive/assets/body/awake.gif b/iqpilot/selfdrive/assets/body/awake.gif new file mode 100644 index 000000000..7ec67055d Binary files /dev/null and b/iqpilot/selfdrive/assets/body/awake.gif differ diff --git a/iqpilot/selfdrive/assets/body/sleep.gif b/iqpilot/selfdrive/assets/body/sleep.gif new file mode 100644 index 000000000..469cc8033 Binary files /dev/null and b/iqpilot/selfdrive/assets/body/sleep.gif differ diff --git a/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.fnt b/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.fnt new file mode 100644 index 000000000..325ea1956 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.fnt @@ -0,0 +1,254 @@ +info face="Audiowide-Regular" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Audiowide-Regular.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=51 height=200 xoffset=0 yoffset=0 xadvance=51 page=0 chnl=15 +char id=33 x=81 y=6 width=24 height=110 xoffset=8 yoffset=45 xadvance=40 page=0 chnl=15 +char id=34 x=117 y=6 width=46 height=40 xoffset=7 yoffset=49 xadvance=59 page=0 chnl=15 +char id=35 x=175 y=6 width=104 height=106 xoffset=5 yoffset=49 xadvance=114 page=0 chnl=15 +char id=36 x=291 y=6 width=73 height=110 xoffset=5 yoffset=45 xadvance=83 page=0 chnl=15 +char id=37 x=376 y=6 width=124 height=100 xoffset=6 yoffset=55 xadvance=135 page=0 chnl=15 +char id=38 x=512 y=6 width=91 height=100 xoffset=9 yoffset=55 xadvance=105 page=0 chnl=15 +char id=39 x=615 y=6 width=20 height=40 xoffset=7 yoffset=49 xadvance=33 page=0 chnl=15 +char id=40 x=647 y=6 width=61 height=144 xoffset=5 yoffset=28 xadvance=67 page=0 chnl=15 +char id=41 x=720 y=6 width=61 height=144 xoffset=1 yoffset=28 xadvance=67 page=0 chnl=15 +char id=42 x=793 y=6 width=66 height=71 xoffset=10 yoffset=45 xadvance=85 page=0 chnl=15 +char id=43 x=871 y=6 width=73 height=73 xoffset=6 yoffset=64 xadvance=84 page=0 chnl=15 +char id=44 x=956 y=6 width=27 height=40 xoffset=3 yoffset=130 xadvance=35 page=0 chnl=15 +char id=45 x=995 y=6 width=73 height=19 xoffset=8 yoffset=91 xadvance=89 page=0 chnl=15 +char id=46 x=1080 y=6 width=20 height=20 xoffset=6 yoffset=135 xadvance=32 page=0 chnl=15 +char id=47 x=1112 y=6 width=92 height=110 xoffset=6 yoffset=45 xadvance=103 page=0 chnl=15 +char id=48 x=1216 y=6 width=129 height=110 xoffset=8 yoffset=45 xadvance=145 page=0 chnl=15 +char id=49 x=1357 y=6 width=39 height=110 xoffset=5 yoffset=45 xadvance=55 page=0 chnl=15 +char id=50 x=1408 y=6 width=102 height=110 xoffset=8 yoffset=45 xadvance=118 page=0 chnl=15 +char id=51 x=1522 y=6 width=93 height=110 xoffset=10 yoffset=45 xadvance=112 page=0 chnl=15 +char id=52 x=1627 y=6 width=102 height=110 xoffset=8 yoffset=45 xadvance=121 page=0 chnl=15 +char id=53 x=1741 y=6 width=102 height=110 xoffset=9 yoffset=45 xadvance=117 page=0 chnl=15 +char id=54 x=1855 y=6 width=102 height=110 xoffset=9 yoffset=45 xadvance=116 page=0 chnl=15 +char id=55 x=1969 y=6 width=92 height=110 xoffset=5 yoffset=45 xadvance=100 page=0 chnl=15 +char id=56 x=2073 y=6 width=102 height=110 xoffset=8 yoffset=45 xadvance=117 page=0 chnl=15 +char id=57 x=2187 y=6 width=102 height=110 xoffset=6 yoffset=45 xadvance=116 page=0 chnl=15 +char id=58 x=2301 y=6 width=20 height=83 xoffset=9 yoffset=72 xadvance=38 page=0 chnl=15 +char id=59 x=2333 y=6 width=27 height=98 xoffset=4 yoffset=72 xadvance=39 page=0 chnl=15 +char id=60 x=2372 y=6 width=70 height=81 xoffset=5 yoffset=59 xadvance=82 page=0 chnl=15 +char id=61 x=2454 y=6 width=73 height=55 xoffset=10 yoffset=73 xadvance=92 page=0 chnl=15 +char id=62 x=2539 y=6 width=70 height=81 xoffset=7 yoffset=59 xadvance=82 page=0 chnl=15 +char id=63 x=2621 y=6 width=92 height=110 xoffset=6 yoffset=45 xadvance=104 page=0 chnl=15 +char id=64 x=2725 y=6 width=87 height=87 xoffset=9 yoffset=69 xadvance=103 page=0 chnl=15 +char id=65 x=2824 y=6 width=111 height=110 xoffset=9 yoffset=45 xadvance=130 page=0 chnl=15 +char id=66 x=2947 y=6 width=111 height=110 xoffset=11 yoffset=45 xadvance=126 page=0 chnl=15 +char id=67 x=3070 y=6 width=100 height=110 xoffset=10 yoffset=45 xadvance=117 page=0 chnl=15 +char id=68 x=3182 y=6 width=111 height=110 xoffset=11 yoffset=45 xadvance=129 page=0 chnl=15 +char id=69 x=3305 y=6 width=100 height=110 xoffset=11 yoffset=45 xadvance=118 page=0 chnl=15 +char id=70 x=3417 y=6 width=101 height=110 xoffset=11 yoffset=45 xadvance=115 page=0 chnl=15 +char id=71 x=3530 y=6 width=110 height=110 xoffset=10 yoffset=45 xadvance=129 page=0 chnl=15 +char id=72 x=3652 y=6 width=111 height=110 xoffset=11 yoffset=45 xadvance=133 page=0 chnl=15 +char id=73 x=3775 y=6 width=21 height=110 xoffset=11 yoffset=45 xadvance=43 page=0 chnl=15 +char id=74 x=3808 y=6 width=101 height=110 xoffset=3 yoffset=45 xadvance=115 page=0 chnl=15 +char id=75 x=3921 y=6 width=116 height=110 xoffset=11 yoffset=45 xadvance=127 page=0 chnl=15 +char id=76 x=6 y=218 width=102 height=110 xoffset=11 yoffset=45 xadvance=115 page=0 chnl=15 +char id=77 x=120 y=218 width=129 height=114 xoffset=11 yoffset=43 xadvance=150 page=0 chnl=15 +char id=78 x=261 y=218 width=111 height=114 xoffset=11 yoffset=43 xadvance=132 page=0 chnl=15 +char id=79 x=384 y=218 width=119 height=114 xoffset=8 yoffset=43 xadvance=134 page=0 chnl=15 +char id=80 x=515 y=218 width=111 height=110 xoffset=11 yoffset=45 xadvance=126 page=0 chnl=15 +char id=81 x=638 y=218 width=119 height=129 xoffset=8 yoffset=43 xadvance=134 page=0 chnl=15 +char id=82 x=769 y=218 width=116 height=110 xoffset=11 yoffset=45 xadvance=129 page=0 chnl=15 +char id=83 x=897 y=218 width=111 height=110 xoffset=7 yoffset=45 xadvance=122 page=0 chnl=15 +char id=84 x=1020 y=218 width=108 height=110 xoffset=3 yoffset=45 xadvance=113 page=0 chnl=15 +char id=85 x=1140 y=218 width=111 height=110 xoffset=9 yoffset=45 xadvance=130 page=0 chnl=15 +char id=86 x=1263 y=218 width=123 height=112 xoffset=-1 yoffset=45 xadvance=121 page=0 chnl=15 +char id=87 x=1398 y=218 width=147 height=112 xoffset=5 yoffset=45 xadvance=157 page=0 chnl=15 +char id=88 x=1557 y=218 width=122 height=110 xoffset=1 yoffset=45 xadvance=123 page=0 chnl=15 +char id=89 x=1691 y=218 width=111 height=110 xoffset=6 yoffset=45 xadvance=122 page=0 chnl=15 +char id=90 x=1814 y=218 width=102 height=110 xoffset=5 yoffset=45 xadvance=111 page=0 chnl=15 +char id=91 x=1928 y=218 width=42 height=147 xoffset=10 yoffset=27 xadvance=57 page=0 chnl=15 +char id=92 x=1982 y=218 width=91 height=110 xoffset=6 yoffset=45 xadvance=103 page=0 chnl=15 +char id=93 x=2085 y=218 width=43 height=147 xoffset=5 yoffset=27 xadvance=57 page=0 chnl=15 +char id=94 x=2140 y=218 width=64 height=57 xoffset=2 yoffset=45 xadvance=67 page=0 chnl=15 +char id=95 x=2216 y=218 width=89 height=18 xoffset=9 yoffset=164 xadvance=106 page=0 chnl=15 +char id=96 x=2317 y=218 width=46 height=34 xoffset=15 yoffset=33 xadvance=87 page=0 chnl=15 +char id=97 x=2375 y=218 width=91 height=83 xoffset=4 yoffset=72 xadvance=102 page=0 chnl=15 +char id=98 x=2478 y=218 width=93 height=118 xoffset=8 yoffset=37 xadvance=108 page=0 chnl=15 +char id=99 x=2583 y=218 width=83 height=83 xoffset=7 yoffset=72 xadvance=96 page=0 chnl=15 +char id=100 x=2678 y=218 width=93 height=118 xoffset=8 yoffset=37 xadvance=109 page=0 chnl=15 +char id=101 x=2783 y=218 width=92 height=83 xoffset=7 yoffset=72 xadvance=102 page=0 chnl=15 +char id=102 x=2887 y=218 width=74 height=119 xoffset=9 yoffset=36 xadvance=86 page=0 chnl=15 +char id=103 x=2973 y=218 width=93 height=119 xoffset=7 yoffset=72 xadvance=108 page=0 chnl=15 +char id=104 x=3078 y=218 width=93 height=118 xoffset=9 yoffset=37 xadvance=110 page=0 chnl=15 +char id=105 x=3183 y=218 width=21 height=118 xoffset=9 yoffset=37 xadvance=39 page=0 chnl=15 +char id=106 x=3216 y=218 width=65 height=154 xoffset=-35 yoffset=37 xadvance=39 page=0 chnl=15 +char id=107 x=3293 y=218 width=98 height=118 xoffset=9 yoffset=37 xadvance=108 page=0 chnl=15 +char id=108 x=3403 y=218 width=38 height=118 xoffset=8 yoffset=37 xadvance=49 page=0 chnl=15 +char id=109 x=3453 y=218 width=120 height=83 xoffset=9 yoffset=72 xadvance=137 page=0 chnl=15 +char id=110 x=3585 y=218 width=93 height=83 xoffset=9 yoffset=72 xadvance=109 page=0 chnl=15 +char id=111 x=3690 y=218 width=93 height=83 xoffset=7 yoffset=72 xadvance=107 page=0 chnl=15 +char id=112 x=3795 y=218 width=93 height=109 xoffset=8 yoffset=72 xadvance=108 page=0 chnl=15 +char id=113 x=3900 y=218 width=93 height=109 xoffset=7 yoffset=72 xadvance=108 page=0 chnl=15 +char id=114 x=4005 y=218 width=74 height=83 xoffset=8 yoffset=72 xadvance=85 page=0 chnl=15 +char id=115 x=6 y=430 width=84 height=83 xoffset=6 yoffset=72 xadvance=93 page=0 chnl=15 +char id=116 x=102 y=430 width=82 height=110 xoffset=3 yoffset=45 xadvance=88 page=0 chnl=15 +char id=117 x=196 y=430 width=92 height=83 xoffset=8 yoffset=72 xadvance=109 page=0 chnl=15 +char id=118 x=300 y=430 width=100 height=84 xoffset=9 yoffset=72 xadvance=105 page=0 chnl=15 +char id=119 x=412 y=430 width=137 height=84 xoffset=9 yoffset=71 xadvance=143 page=0 chnl=15 +char id=120 x=561 y=430 width=109 height=83 xoffset=0 yoffset=72 xadvance=109 page=0 chnl=15 +char id=121 x=682 y=430 width=93 height=119 xoffset=8 yoffset=72 xadvance=110 page=0 chnl=15 +char id=122 x=787 y=430 width=85 height=83 xoffset=5 yoffset=72 xadvance=94 page=0 chnl=15 +char id=123 x=884 y=430 width=61 height=147 xoffset=1 yoffset=27 xadvance=66 page=0 chnl=15 +char id=124 x=957 y=430 width=21 height=147 xoffset=10 yoffset=27 xadvance=40 page=0 chnl=15 +char id=125 x=990 y=430 width=60 height=147 xoffset=5 yoffset=27 xadvance=66 page=0 chnl=15 +char id=126 x=1062 y=430 width=84 height=29 xoffset=8 yoffset=88 xadvance=99 page=0 chnl=15 +char id=161 x=1158 y=430 width=25 height=111 xoffset=7 yoffset=76 xadvance=39 page=0 chnl=15 +char id=163 x=1195 y=430 width=127 height=110 xoffset=5 yoffset=45 xadvance=137 page=0 chnl=15 +char id=165 x=1334 y=430 width=110 height=110 xoffset=8 yoffset=45 xadvance=126 page=0 chnl=15 +char id=167 x=1456 y=430 width=110 height=147 xoffset=9 yoffset=27 xadvance=126 page=0 chnl=15 +char id=171 x=1578 y=430 width=99 height=63 xoffset=4 yoffset=82 xadvance=109 page=0 chnl=15 +char id=176 x=1689 y=430 width=46 height=46 xoffset=5 yoffset=49 xadvance=55 page=0 chnl=15 +char id=187 x=1747 y=430 width=99 height=63 xoffset=6 yoffset=82 xadvance=109 page=0 chnl=15 +char id=191 x=1858 y=430 width=92 height=111 xoffset=6 yoffset=76 xadvance=103 page=0 chnl=15 +char id=192 x=1962 y=430 width=111 height=154 xoffset=9 yoffset=1 xadvance=130 page=0 chnl=15 +char id=193 x=2085 y=430 width=111 height=154 xoffset=9 yoffset=1 xadvance=130 page=0 chnl=15 +char id=195 x=2208 y=430 width=111 height=148 xoffset=9 yoffset=7 xadvance=130 page=0 chnl=15 +char id=196 x=2331 y=430 width=111 height=143 xoffset=9 yoffset=12 xadvance=130 page=0 chnl=15 +char id=199 x=2454 y=430 width=100 height=145 xoffset=10 yoffset=45 xadvance=117 page=0 chnl=15 +char id=201 x=2566 y=430 width=100 height=154 xoffset=11 yoffset=1 xadvance=118 page=0 chnl=15 +char id=202 x=2678 y=430 width=100 height=154 xoffset=11 yoffset=1 xadvance=118 page=0 chnl=15 +char id=205 x=2790 y=430 width=51 height=154 xoffset=11 yoffset=1 xadvance=43 page=0 chnl=15 +char id=209 x=2853 y=430 width=111 height=144 xoffset=11 yoffset=13 xadvance=132 page=0 chnl=15 +char id=211 x=2976 y=430 width=119 height=156 xoffset=8 yoffset=1 xadvance=134 page=0 chnl=15 +char id=212 x=3107 y=430 width=119 height=156 xoffset=8 yoffset=1 xadvance=134 page=0 chnl=15 +char id=214 x=3238 y=430 width=119 height=145 xoffset=8 yoffset=12 xadvance=134 page=0 chnl=15 +char id=215 x=3369 y=430 width=77 height=55 xoffset=7 yoffset=73 xadvance=90 page=0 chnl=15 +char id=218 x=3458 y=430 width=111 height=147 xoffset=9 yoffset=8 xadvance=130 page=0 chnl=15 +char id=220 x=3581 y=430 width=111 height=137 xoffset=9 yoffset=18 xadvance=130 page=0 chnl=15 +char id=223 x=3704 y=430 width=110 height=119 xoffset=9 yoffset=36 xadvance=122 page=0 chnl=15 +char id=224 x=3826 y=430 width=91 height=127 xoffset=4 yoffset=28 xadvance=102 page=0 chnl=15 +char id=225 x=3929 y=430 width=91 height=127 xoffset=4 yoffset=28 xadvance=102 page=0 chnl=15 +char id=226 x=6 y=642 width=91 height=127 xoffset=4 yoffset=28 xadvance=102 page=0 chnl=15 +char id=227 x=109 y=642 width=91 height=121 xoffset=4 yoffset=34 xadvance=102 page=0 chnl=15 +char id=228 x=212 y=642 width=91 height=116 xoffset=4 yoffset=39 xadvance=102 page=0 chnl=15 +char id=231 x=315 y=642 width=83 height=118 xoffset=7 yoffset=72 xadvance=96 page=0 chnl=15 +char id=232 x=410 y=642 width=92 height=127 xoffset=7 yoffset=28 xadvance=102 page=0 chnl=15 +char id=233 x=514 y=642 width=92 height=127 xoffset=7 yoffset=28 xadvance=102 page=0 chnl=15 +char id=234 x=618 y=642 width=92 height=127 xoffset=7 yoffset=28 xadvance=102 page=0 chnl=15 +char id=237 x=722 y=642 width=52 height=127 xoffset=9 yoffset=28 xadvance=39 page=0 chnl=15 +char id=238 x=786 y=642 width=73 height=123 xoffset=-17 yoffset=32 xadvance=39 page=0 chnl=15 +char id=241 x=871 y=642 width=93 height=121 xoffset=9 yoffset=34 xadvance=109 page=0 chnl=15 +char id=243 x=976 y=642 width=93 height=127 xoffset=7 yoffset=28 xadvance=107 page=0 chnl=15 +char id=244 x=1081 y=642 width=93 height=127 xoffset=7 yoffset=28 xadvance=107 page=0 chnl=15 +char id=245 x=1186 y=642 width=93 height=121 xoffset=7 yoffset=34 xadvance=107 page=0 chnl=15 +char id=246 x=1291 y=642 width=93 height=116 xoffset=7 yoffset=39 xadvance=107 page=0 chnl=15 +char id=249 x=1396 y=642 width=92 height=122 xoffset=8 yoffset=33 xadvance=109 page=0 chnl=15 +char id=250 x=1500 y=642 width=92 height=122 xoffset=8 yoffset=33 xadvance=109 page=0 chnl=15 +char id=251 x=1604 y=642 width=92 height=127 xoffset=8 yoffset=28 xadvance=109 page=0 chnl=15 +char id=252 x=1708 y=642 width=92 height=116 xoffset=8 yoffset=39 xadvance=109 page=0 chnl=15 +char id=260 x=1812 y=642 width=124 height=144 xoffset=9 yoffset=45 xadvance=130 page=0 chnl=15 +char id=261 x=1948 y=642 width=91 height=117 xoffset=4 yoffset=72 xadvance=102 page=0 chnl=15 +char id=262 x=2051 y=642 width=100 height=149 xoffset=10 yoffset=6 xadvance=117 page=0 chnl=15 +char id=263 x=2163 y=642 width=88 height=122 xoffset=7 yoffset=33 xadvance=96 page=0 chnl=15 +char id=280 x=2263 y=642 width=100 height=144 xoffset=11 yoffset=45 xadvance=118 page=0 chnl=15 +char id=281 x=2375 y=642 width=92 height=117 xoffset=7 yoffset=72 xadvance=102 page=0 chnl=15 +char id=286 x=2479 y=642 width=110 height=146 xoffset=10 yoffset=9 xadvance=129 page=0 chnl=15 +char id=287 x=2601 y=642 width=93 height=155 xoffset=7 yoffset=36 xadvance=108 page=0 chnl=15 +char id=304 x=2706 y=642 width=21 height=138 xoffset=11 yoffset=17 xadvance=43 page=0 chnl=15 +char id=305 x=2739 y=642 width=21 height=83 xoffset=9 yoffset=72 xadvance=39 page=0 chnl=15 +char id=321 x=2772 y=642 width=122 height=110 xoffset=4 yoffset=45 xadvance=128 page=0 chnl=15 +char id=322 x=2906 y=642 width=64 height=118 xoffset=4 yoffset=37 xadvance=72 page=0 chnl=15 +char id=323 x=2982 y=642 width=111 height=151 xoffset=11 yoffset=6 xadvance=132 page=0 chnl=15 +char id=324 x=3105 y=642 width=93 height=122 xoffset=9 yoffset=33 xadvance=109 page=0 chnl=15 +char id=339 x=3210 y=642 width=165 height=83 xoffset=7 yoffset=72 xadvance=174 page=0 chnl=15 +char id=346 x=3387 y=642 width=111 height=149 xoffset=7 yoffset=6 xadvance=122 page=0 chnl=15 +char id=347 x=3510 y=642 width=84 height=122 xoffset=6 yoffset=33 xadvance=93 page=0 chnl=15 +char id=350 x=3606 y=642 width=111 height=145 xoffset=7 yoffset=45 xadvance=122 page=0 chnl=15 +char id=351 x=3729 y=642 width=84 height=118 xoffset=6 yoffset=72 xadvance=93 page=0 chnl=15 +char id=377 x=3825 y=642 width=102 height=149 xoffset=5 yoffset=6 xadvance=111 page=0 chnl=15 +char id=378 x=3939 y=642 width=85 height=122 xoffset=5 yoffset=33 xadvance=94 page=0 chnl=15 +char id=379 x=6 y=854 width=102 height=138 xoffset=5 yoffset=17 xadvance=111 page=0 chnl=15 +char id=380 x=120 y=854 width=85 height=111 xoffset=5 yoffset=44 xadvance=94 page=0 chnl=15 +char id=1028 x=217 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1030 x=229 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1040 x=241 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1041 x=253 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1042 x=265 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1043 x=277 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1044 x=289 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1045 x=301 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1046 x=313 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1047 x=325 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1048 x=337 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1049 x=349 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1050 x=361 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1051 x=373 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1052 x=385 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1053 x=397 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1054 x=409 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1055 x=421 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1056 x=433 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1057 x=445 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1058 x=457 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1059 x=469 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1060 x=481 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1061 x=493 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1062 x=505 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1063 x=517 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1064 x=529 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1065 x=541 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1068 x=553 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1070 x=565 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1071 x=577 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1072 x=589 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1073 x=601 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1074 x=613 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1075 x=625 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1076 x=637 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1077 x=649 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1078 x=661 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1079 x=673 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1080 x=685 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1081 x=697 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1082 x=709 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1083 x=721 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1084 x=733 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1085 x=745 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1086 x=757 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1087 x=769 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1088 x=781 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1089 x=793 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1090 x=805 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1091 x=817 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1092 x=829 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1093 x=841 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1094 x=853 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1095 x=865 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1096 x=877 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1097 x=889 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1100 x=901 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1102 x=913 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1103 x=925 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1108 x=937 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1110 x=949 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1111 x=961 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8209 x=973 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=985 y=854 width=64 height=19 xoffset=8 yoffset=91 xadvance=80 page=0 chnl=15 +char id=8212 x=1061 y=854 width=127 height=19 xoffset=8 yoffset=91 xadvance=143 page=0 chnl=15 +char id=8217 x=1200 y=854 width=26 height=40 xoffset=6 yoffset=49 xadvance=36 page=0 chnl=15 +char id=8220 x=1238 y=854 width=56 height=40 xoffset=4 yoffset=49 xadvance=64 page=0 chnl=15 +char id=8221 x=1306 y=854 width=55 height=40 xoffset=6 yoffset=49 xadvance=64 page=0 chnl=15 +char id=8222 x=1373 y=854 width=55 height=40 xoffset=3 yoffset=130 xadvance=63 page=0 chnl=15 +char id=8226 x=1440 y=854 width=32 height=32 xoffset=10 yoffset=83 xadvance=52 page=0 chnl=15 +char id=8364 x=1484 y=854 width=127 height=110 xoffset=7 yoffset=45 xadvance=142 page=0 chnl=15 +char id=8627 x=1623 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8679 x=1635 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9003 x=1647 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9251 x=1659 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9654 x=1671 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9664 x=1683 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9675 x=1695 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9679 x=1707 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9881 x=1719 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=1731 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10004 x=1743 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=1755 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=1767 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=1779 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=1791 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.png b/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.png new file mode 100644 index 000000000..35f985251 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.ttf b/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.ttf new file mode 100644 index 000000000..348817d57 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Audiowide-Regular.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Black.fnt b/iqpilot/selfdrive/assets/fonts/Inter-Black.fnt new file mode 100644 index 000000000..e4aa36195 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-Black.fnt @@ -0,0 +1,254 @@ +info face="Inter-Black" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-Black.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=32 height=200 xoffset=0 yoffset=0 xadvance=32 page=0 chnl=15 +char id=33 x=62 y=6 width=34 height=123 xoffset=12 yoffset=39 xadvance=58 page=0 chnl=15 +char id=34 x=108 y=6 width=53 height=50 xoffset=5 yoffset=39 xadvance=63 page=0 chnl=15 +char id=35 x=173 y=6 width=109 height=121 xoffset=0 yoffset=39 xadvance=109 page=0 chnl=15 +char id=36 x=294 y=6 width=102 height=152 xoffset=4 yoffset=24 xadvance=110 page=0 chnl=15 +char id=37 x=408 y=6 width=121 height=133 xoffset=13 yoffset=33 xadvance=147 page=0 chnl=15 +char id=38 x=541 y=6 width=112 height=125 xoffset=5 yoffset=37 xadvance=115 page=0 chnl=15 +char id=39 x=665 y=6 width=22 height=50 xoffset=5 yoffset=39 xadvance=33 page=0 chnl=15 +char id=40 x=699 y=6 width=57 height=149 xoffset=14 yoffset=39 xadvance=72 page=0 chnl=15 +char id=41 x=768 y=6 width=57 height=149 xoffset=2 yoffset=39 xadvance=72 page=0 chnl=15 +char id=42 x=837 y=6 width=69 height=69 xoffset=16 yoffset=39 xadvance=100 page=0 chnl=15 +char id=43 x=918 y=6 width=88 height=88 xoffset=13 yoffset=67 xadvance=114 page=0 chnl=15 +char id=44 x=1018 y=6 width=33 height=47 xoffset=7 yoffset=143 xadvance=52 page=0 chnl=15 +char id=45 x=1063 y=6 width=57 height=26 xoffset=11 yoffset=99 xadvance=78 page=0 chnl=15 +char id=46 x=1132 y=6 width=34 height=33 xoffset=9 yoffset=129 xadvance=51 page=0 chnl=15 +char id=47 x=1178 y=6 width=68 height=145 xoffset=0 yoffset=34 xadvance=68 page=0 chnl=15 +char id=48 x=1258 y=6 width=107 height=126 xoffset=7 yoffset=38 xadvance=120 page=0 chnl=15 +char id=49 x=1377 y=6 width=60 height=121 xoffset=7 yoffset=39 xadvance=83 page=0 chnl=15 +char id=50 x=1449 y=6 width=96 height=122 xoffset=5 yoffset=38 xadvance=106 page=0 chnl=15 +char id=51 x=1557 y=6 width=100 height=124 xoffset=6 yoffset=38 xadvance=111 page=0 chnl=15 +char id=52 x=1669 y=6 width=105 height=121 xoffset=6 yoffset=39 xadvance=115 page=0 chnl=15 +char id=53 x=1786 y=6 width=97 height=123 xoffset=8 yoffset=39 xadvance=110 page=0 chnl=15 +char id=54 x=1895 y=6 width=101 height=125 xoffset=6 yoffset=37 xadvance=113 page=0 chnl=15 +char id=55 x=2008 y=6 width=90 height=121 xoffset=5 yoffset=39 xadvance=100 page=0 chnl=15 +char id=56 x=2110 y=6 width=102 height=124 xoffset=6 yoffset=38 xadvance=114 page=0 chnl=15 +char id=57 x=2224 y=6 width=102 height=125 xoffset=6 yoffset=37 xadvance=113 page=0 chnl=15 +char id=58 x=2338 y=6 width=34 height=94 xoffset=9 yoffset=68 xadvance=51 page=0 chnl=15 +char id=59 x=2384 y=6 width=38 height=122 xoffset=7 yoffset=68 xadvance=52 page=0 chnl=15 +char id=60 x=2434 y=6 width=88 height=99 xoffset=13 yoffset=62 xadvance=114 page=0 chnl=15 +char id=61 x=2534 y=6 width=88 height=69 xoffset=13 yoffset=77 xadvance=114 page=0 chnl=15 +char id=62 x=2634 y=6 width=88 height=99 xoffset=13 yoffset=62 xadvance=114 page=0 chnl=15 +char id=63 x=2734 y=6 width=86 height=124 xoffset=6 yoffset=38 xadvance=99 page=0 chnl=15 +char id=64 x=2832 y=6 width=164 height=160 xoffset=11 yoffset=37 xadvance=180 page=0 chnl=15 +char id=65 x=3008 y=6 width=125 height=121 xoffset=3 yoffset=39 xadvance=131 page=0 chnl=15 +char id=66 x=3145 y=6 width=100 height=121 xoffset=7 yoffset=39 xadvance=110 page=0 chnl=15 +char id=67 x=3257 y=6 width=113 height=124 xoffset=7 yoffset=38 xadvance=126 page=0 chnl=15 +char id=68 x=3382 y=6 width=107 height=121 xoffset=7 yoffset=39 xadvance=121 page=0 chnl=15 +char id=69 x=3501 y=6 width=88 height=121 xoffset=7 yoffset=39 xadvance=102 page=0 chnl=15 +char id=70 x=3601 y=6 width=86 height=121 xoffset=7 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=3699 y=6 width=114 height=124 xoffset=7 yoffset=38 xadvance=127 page=0 chnl=15 +char id=72 x=3825 y=6 width=110 height=121 xoffset=7 yoffset=39 xadvance=123 page=0 chnl=15 +char id=73 x=3947 y=6 width=34 height=121 xoffset=7 yoffset=39 xadvance=48 page=0 chnl=15 +char id=74 x=3993 y=6 width=89 height=123 xoffset=1 yoffset=39 xadvance=97 page=0 chnl=15 +char id=75 x=6 y=218 width=111 height=121 xoffset=7 yoffset=39 xadvance=118 page=0 chnl=15 +char id=76 x=129 y=218 width=82 height=121 xoffset=7 yoffset=39 xadvance=94 page=0 chnl=15 +char id=77 x=223 y=218 width=140 height=121 xoffset=7 yoffset=39 xadvance=153 page=0 chnl=15 +char id=78 x=375 y=218 width=105 height=121 xoffset=7 yoffset=39 xadvance=119 page=0 chnl=15 +char id=79 x=492 y=218 width=118 height=124 xoffset=7 yoffset=38 xadvance=131 page=0 chnl=15 +char id=80 x=622 y=218 width=98 height=121 xoffset=7 yoffset=39 xadvance=108 page=0 chnl=15 +char id=81 x=732 y=218 width=118 height=131 xoffset=7 yoffset=38 xadvance=131 page=0 chnl=15 +char id=82 x=862 y=218 width=102 height=121 xoffset=7 yoffset=39 xadvance=110 page=0 chnl=15 +char id=83 x=976 y=218 width=102 height=124 xoffset=4 yoffset=38 xadvance=110 page=0 chnl=15 +char id=84 x=1090 y=218 width=105 height=121 xoffset=4 yoffset=39 xadvance=113 page=0 chnl=15 +char id=85 x=1207 y=218 width=105 height=123 xoffset=7 yoffset=39 xadvance=119 page=0 chnl=15 +char id=86 x=1324 y=218 width=125 height=121 xoffset=3 yoffset=39 xadvance=131 page=0 chnl=15 +char id=87 x=1461 y=218 width=176 height=121 xoffset=2 yoffset=39 xadvance=180 page=0 chnl=15 +char id=88 x=1649 y=218 width=118 height=121 xoffset=4 yoffset=39 xadvance=126 page=0 chnl=15 +char id=89 x=1779 y=218 width=122 height=121 xoffset=2 yoffset=39 xadvance=126 page=0 chnl=15 +char id=90 x=1913 y=218 width=99 height=121 xoffset=8 yoffset=39 xadvance=114 page=0 chnl=15 +char id=91 x=2024 y=218 width=55 height=149 xoffset=16 yoffset=39 xadvance=72 page=0 chnl=15 +char id=92 x=2091 y=218 width=68 height=145 xoffset=0 yoffset=34 xadvance=68 page=0 chnl=15 +char id=93 x=2171 y=218 width=55 height=149 xoffset=2 yoffset=39 xadvance=72 page=0 chnl=15 +char id=94 x=2238 y=218 width=74 height=54 xoffset=4 yoffset=41 xadvance=82 page=0 chnl=15 +char id=95 x=2324 y=218 width=82 height=24 xoffset=0 yoffset=160 xadvance=81 page=0 chnl=15 +char id=96 x=2418 y=218 width=40 height=27 xoffset=21 yoffset=32 xadvance=82 page=0 chnl=15 +char id=97 x=2470 y=218 width=88 height=94 xoffset=3 yoffset=68 xadvance=97 page=0 chnl=15 +char id=98 x=2570 y=218 width=95 height=123 xoffset=7 yoffset=39 xadvance=106 page=0 chnl=15 +char id=99 x=2677 y=218 width=92 height=94 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15 +char id=100 x=2781 y=218 width=94 height=123 xoffset=5 yoffset=39 xadvance=106 page=0 chnl=15 +char id=101 x=2887 y=218 width=92 height=94 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15 +char id=102 x=2991 y=218 width=66 height=126 xoffset=1 yoffset=34 xadvance=66 page=0 chnl=15 +char id=103 x=3069 y=218 width=95 height=127 xoffset=5 yoffset=68 xadvance=107 page=0 chnl=15 +char id=104 x=3176 y=218 width=92 height=121 xoffset=8 yoffset=39 xadvance=106 page=0 chnl=15 +char id=105 x=3280 y=218 width=33 height=130 xoffset=8 yoffset=30 xadvance=48 page=0 chnl=15 +char id=106 x=3325 y=218 width=47 height=164 xoffset=-6 yoffset=30 xadvance=48 page=0 chnl=15 +char id=107 x=3384 y=218 width=93 height=121 xoffset=8 yoffset=39 xadvance=100 page=0 chnl=15 +char id=108 x=3489 y=218 width=33 height=121 xoffset=8 yoffset=39 xadvance=48 page=0 chnl=15 +char id=109 x=3534 y=218 width=140 height=92 xoffset=8 yoffset=68 xadvance=155 page=0 chnl=15 +char id=110 x=3686 y=218 width=92 height=92 xoffset=8 yoffset=68 xadvance=106 page=0 chnl=15 +char id=111 x=3790 y=218 width=95 height=94 xoffset=4 yoffset=68 xadvance=103 page=0 chnl=15 +char id=112 x=3897 y=218 width=94 height=126 xoffset=8 yoffset=68 xadvance=107 page=0 chnl=15 +char id=113 x=6 y=430 width=94 height=126 xoffset=5 yoffset=68 xadvance=107 page=0 chnl=15 +char id=114 x=112 y=430 width=62 height=92 xoffset=8 yoffset=68 xadvance=71 page=0 chnl=15 +char id=115 x=186 y=430 width=89 height=94 xoffset=4 yoffset=68 xadvance=97 page=0 chnl=15 +char id=116 x=287 y=430 width=62 height=114 xoffset=2 yoffset=48 xadvance=66 page=0 chnl=15 +char id=117 x=361 y=430 width=92 height=93 xoffset=8 yoffset=69 xadvance=107 page=0 chnl=15 +char id=118 x=465 y=430 width=100 height=91 xoffset=0 yoffset=69 xadvance=100 page=0 chnl=15 +char id=119 x=577 y=430 width=142 height=91 xoffset=1 yoffset=69 xadvance=144 page=0 chnl=15 +char id=120 x=731 y=430 width=95 height=91 xoffset=2 yoffset=69 xadvance=98 page=0 chnl=15 +char id=121 x=838 y=430 width=100 height=125 xoffset=0 yoffset=69 xadvance=100 page=0 chnl=15 +char id=122 x=950 y=430 width=80 height=91 xoffset=9 yoffset=69 xadvance=97 page=0 chnl=15 +char id=123 x=1042 y=430 width=67 height=149 xoffset=4 yoffset=39 xadvance=72 page=0 chnl=15 +char id=124 x=1121 y=430 width=33 height=198 xoffset=17 yoffset=1 xadvance=66 page=0 chnl=15 +char id=125 x=1166 y=430 width=67 height=149 xoffset=2 yoffset=39 xadvance=72 page=0 chnl=15 +char id=126 x=1245 y=430 width=93 height=43 xoffset=11 yoffset=90 xadvance=114 page=0 chnl=15 +char id=161 x=1350 y=430 width=34 height=123 xoffset=12 yoffset=68 xadvance=58 page=0 chnl=15 +char id=163 x=1396 y=430 width=94 height=122 xoffset=11 yoffset=38 xadvance=115 page=0 chnl=15 +char id=165 x=1502 y=430 width=93 height=121 xoffset=2 yoffset=39 xadvance=97 page=0 chnl=15 +char id=167 x=1607 y=430 width=85 height=147 xoffset=9 yoffset=38 xadvance=102 page=0 chnl=15 +char id=171 x=1704 y=430 width=99 height=73 xoffset=8 yoffset=75 xadvance=112 page=0 chnl=15 +char id=176 x=1815 y=430 width=61 height=61 xoffset=8 yoffset=39 xadvance=76 page=0 chnl=15 +char id=187 x=1888 y=430 width=100 height=73 xoffset=6 yoffset=75 xadvance=113 page=0 chnl=15 +char id=191 x=2000 y=430 width=86 height=125 xoffset=7 yoffset=69 xadvance=99 page=0 chnl=15 +char id=192 x=2098 y=430 width=125 height=158 xoffset=3 yoffset=2 xadvance=131 page=0 chnl=15 +char id=193 x=2235 y=430 width=125 height=158 xoffset=3 yoffset=2 xadvance=131 page=0 chnl=15 +char id=195 x=2372 y=430 width=125 height=158 xoffset=3 yoffset=2 xadvance=131 page=0 chnl=15 +char id=196 x=2509 y=430 width=125 height=158 xoffset=3 yoffset=2 xadvance=131 page=0 chnl=15 +char id=199 x=2646 y=430 width=113 height=162 xoffset=7 yoffset=38 xadvance=126 page=0 chnl=15 +char id=201 x=2771 y=430 width=88 height=158 xoffset=7 yoffset=2 xadvance=102 page=0 chnl=15 +char id=202 x=2871 y=430 width=88 height=159 xoffset=7 yoffset=1 xadvance=102 page=0 chnl=15 +char id=205 x=2971 y=430 width=46 height=158 xoffset=7 yoffset=2 xadvance=48 page=0 chnl=15 +char id=209 x=3029 y=430 width=105 height=157 xoffset=7 yoffset=3 xadvance=119 page=0 chnl=15 +char id=211 x=3146 y=430 width=118 height=160 xoffset=7 yoffset=2 xadvance=131 page=0 chnl=15 +char id=212 x=3276 y=430 width=118 height=161 xoffset=7 yoffset=1 xadvance=131 page=0 chnl=15 +char id=214 x=3406 y=430 width=118 height=160 xoffset=7 yoffset=2 xadvance=131 page=0 chnl=15 +char id=215 x=3536 y=430 width=93 height=94 xoffset=11 yoffset=64 xadvance=114 page=0 chnl=15 +char id=218 x=3641 y=430 width=105 height=160 xoffset=7 yoffset=2 xadvance=119 page=0 chnl=15 +char id=220 x=3758 y=430 width=105 height=160 xoffset=7 yoffset=2 xadvance=119 page=0 chnl=15 +char id=223 x=3875 y=430 width=104 height=122 xoffset=7 yoffset=38 xadvance=115 page=0 chnl=15 +char id=224 x=3991 y=430 width=88 height=130 xoffset=3 yoffset=32 xadvance=97 page=0 chnl=15 +char id=225 x=6 y=642 width=88 height=130 xoffset=3 yoffset=32 xadvance=97 page=0 chnl=15 +char id=226 x=106 y=642 width=88 height=131 xoffset=3 yoffset=31 xadvance=97 page=0 chnl=15 +char id=227 x=206 y=642 width=88 height=129 xoffset=3 yoffset=33 xadvance=97 page=0 chnl=15 +char id=228 x=306 y=642 width=88 height=130 xoffset=3 yoffset=32 xadvance=97 page=0 chnl=15 +char id=231 x=406 y=642 width=92 height=132 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15 +char id=232 x=510 y=642 width=92 height=130 xoffset=4 yoffset=32 xadvance=100 page=0 chnl=15 +char id=233 x=614 y=642 width=92 height=130 xoffset=4 yoffset=32 xadvance=100 page=0 chnl=15 +char id=234 x=718 y=642 width=92 height=131 xoffset=4 yoffset=31 xadvance=100 page=0 chnl=15 +char id=237 x=822 y=642 width=45 height=128 xoffset=8 yoffset=32 xadvance=48 page=0 chnl=15 +char id=238 x=879 y=642 width=77 height=129 xoffset=-14 yoffset=31 xadvance=48 page=0 chnl=15 +char id=241 x=968 y=642 width=92 height=127 xoffset=8 yoffset=33 xadvance=106 page=0 chnl=15 +char id=243 x=1072 y=642 width=95 height=130 xoffset=4 yoffset=32 xadvance=103 page=0 chnl=15 +char id=244 x=1179 y=642 width=95 height=131 xoffset=4 yoffset=31 xadvance=103 page=0 chnl=15 +char id=245 x=1286 y=642 width=95 height=129 xoffset=4 yoffset=33 xadvance=103 page=0 chnl=15 +char id=246 x=1393 y=642 width=95 height=130 xoffset=4 yoffset=32 xadvance=103 page=0 chnl=15 +char id=249 x=1500 y=642 width=92 height=130 xoffset=8 yoffset=32 xadvance=107 page=0 chnl=15 +char id=250 x=1604 y=642 width=92 height=130 xoffset=8 yoffset=32 xadvance=107 page=0 chnl=15 +char id=251 x=1708 y=642 width=92 height=131 xoffset=8 yoffset=31 xadvance=107 page=0 chnl=15 +char id=252 x=1812 y=642 width=92 height=130 xoffset=8 yoffset=32 xadvance=107 page=0 chnl=15 +char id=260 x=1916 y=642 width=128 height=154 xoffset=3 yoffset=39 xadvance=131 page=0 chnl=15 +char id=261 x=2056 y=642 width=90 height=125 xoffset=3 yoffset=68 xadvance=97 page=0 chnl=15 +char id=262 x=2158 y=642 width=113 height=160 xoffset=7 yoffset=2 xadvance=126 page=0 chnl=15 +char id=263 x=2283 y=642 width=92 height=130 xoffset=4 yoffset=32 xadvance=100 page=0 chnl=15 +char id=280 x=2387 y=642 width=90 height=154 xoffset=7 yoffset=39 xadvance=102 page=0 chnl=15 +char id=281 x=2489 y=642 width=92 height=121 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15 +char id=286 x=2593 y=642 width=114 height=155 xoffset=7 yoffset=7 xadvance=127 page=0 chnl=15 +char id=287 x=2719 y=642 width=95 height=158 xoffset=5 yoffset=37 xadvance=107 page=0 chnl=15 +char id=304 x=2826 y=642 width=34 height=160 xoffset=7 yoffset=0 xadvance=48 page=0 chnl=15 +char id=305 x=2872 y=642 width=33 height=91 xoffset=8 yoffset=69 xadvance=48 page=0 chnl=15 +char id=321 x=2917 y=642 width=97 height=121 xoffset=1 yoffset=39 xadvance=99 page=0 chnl=15 +char id=322 x=3026 y=642 width=53 height=121 xoffset=-2 yoffset=39 xadvance=48 page=0 chnl=15 +char id=323 x=3091 y=642 width=105 height=158 xoffset=7 yoffset=2 xadvance=119 page=0 chnl=15 +char id=324 x=3208 y=642 width=92 height=128 xoffset=8 yoffset=32 xadvance=106 page=0 chnl=15 +char id=339 x=3312 y=642 width=154 height=94 xoffset=5 yoffset=68 xadvance=159 page=0 chnl=15 +char id=346 x=3478 y=642 width=102 height=160 xoffset=4 yoffset=2 xadvance=110 page=0 chnl=15 +char id=347 x=3592 y=642 width=89 height=130 xoffset=4 yoffset=32 xadvance=97 page=0 chnl=15 +char id=350 x=3693 y=642 width=102 height=162 xoffset=4 yoffset=38 xadvance=110 page=0 chnl=15 +char id=351 x=3807 y=642 width=89 height=132 xoffset=4 yoffset=68 xadvance=97 page=0 chnl=15 +char id=377 x=3908 y=642 width=99 height=158 xoffset=8 yoffset=2 xadvance=114 page=0 chnl=15 +char id=378 x=6 y=854 width=80 height=128 xoffset=9 yoffset=32 xadvance=97 page=0 chnl=15 +char id=379 x=98 y=854 width=99 height=160 xoffset=8 yoffset=0 xadvance=114 page=0 chnl=15 +char id=380 x=209 y=854 width=80 height=130 xoffset=9 yoffset=30 xadvance=97 page=0 chnl=15 +char id=1028 x=301 y=854 width=105 height=124 xoffset=7 yoffset=38 xadvance=118 page=0 chnl=15 +char id=1030 x=418 y=854 width=34 height=121 xoffset=7 yoffset=39 xadvance=48 page=0 chnl=15 +char id=1040 x=464 y=854 width=125 height=121 xoffset=3 yoffset=39 xadvance=131 page=0 chnl=15 +char id=1041 x=601 y=854 width=97 height=121 xoffset=7 yoffset=39 xadvance=106 page=0 chnl=15 +char id=1042 x=710 y=854 width=100 height=121 xoffset=7 yoffset=39 xadvance=110 page=0 chnl=15 +char id=1043 x=822 y=854 width=86 height=121 xoffset=7 yoffset=39 xadvance=96 page=0 chnl=15 +char id=1044 x=920 y=854 width=128 height=150 xoffset=3 yoffset=39 xadvance=134 page=0 chnl=15 +char id=1045 x=1060 y=854 width=88 height=121 xoffset=7 yoffset=39 xadvance=102 page=0 chnl=15 +char id=1046 x=1160 y=854 width=186 height=121 xoffset=4 yoffset=39 xadvance=194 page=0 chnl=15 +char id=1047 x=1358 y=854 width=100 height=124 xoffset=6 yoffset=38 xadvance=111 page=0 chnl=15 +char id=1048 x=1470 y=854 width=105 height=121 xoffset=7 yoffset=39 xadvance=119 page=0 chnl=15 +char id=1049 x=1587 y=854 width=105 height=153 xoffset=7 yoffset=7 xadvance=119 page=0 chnl=15 +char id=1050 x=1704 y=854 width=124 height=121 xoffset=7 yoffset=39 xadvance=131 page=0 chnl=15 +char id=1051 x=1840 y=854 width=112 height=121 xoffset=3 yoffset=39 xadvance=122 page=0 chnl=15 +char id=1052 x=1964 y=854 width=140 height=121 xoffset=7 yoffset=39 xadvance=153 page=0 chnl=15 +char id=1053 x=2116 y=854 width=110 height=121 xoffset=7 yoffset=39 xadvance=123 page=0 chnl=15 +char id=1054 x=2238 y=854 width=118 height=124 xoffset=7 yoffset=38 xadvance=131 page=0 chnl=15 +char id=1055 x=2368 y=854 width=106 height=121 xoffset=13 yoffset=39 xadvance=131 page=0 chnl=15 +char id=1056 x=2486 y=854 width=98 height=121 xoffset=7 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1057 x=2596 y=854 width=113 height=124 xoffset=7 yoffset=38 xadvance=126 page=0 chnl=15 +char id=1058 x=2721 y=854 width=105 height=121 xoffset=4 yoffset=39 xadvance=113 page=0 chnl=15 +char id=1059 x=2838 y=854 width=112 height=123 xoffset=2 yoffset=39 xadvance=116 page=0 chnl=15 +char id=1060 x=2962 y=854 width=137 height=128 xoffset=7 yoffset=37 xadvance=150 page=0 chnl=15 +char id=1061 x=3111 y=854 width=118 height=121 xoffset=4 yoffset=39 xadvance=126 page=0 chnl=15 +char id=1062 x=3241 y=854 width=126 height=150 xoffset=7 yoffset=39 xadvance=135 page=0 chnl=15 +char id=1063 x=3379 y=854 width=103 height=121 xoffset=15 yoffset=39 xadvance=131 page=0 chnl=15 +char id=1064 x=3494 y=854 width=154 height=121 xoffset=15 yoffset=39 xadvance=184 page=0 chnl=15 +char id=1065 x=3660 y=854 width=168 height=150 xoffset=15 yoffset=39 xadvance=185 page=0 chnl=15 +char id=1068 x=3840 y=854 width=96 height=121 xoffset=8 yoffset=39 xadvance=114 page=0 chnl=15 +char id=1070 x=6 y=1066 width=166 height=124 xoffset=7 yoffset=38 xadvance=164 page=0 chnl=15 +char id=1071 x=184 y=1066 width=101 height=121 xoffset=2 yoffset=39 xadvance=110 page=0 chnl=15 +char id=1072 x=297 y=1066 width=88 height=94 xoffset=3 yoffset=68 xadvance=97 page=0 chnl=15 +char id=1073 x=397 y=1066 width=94 height=125 xoffset=5 yoffset=37 xadvance=104 page=0 chnl=15 +char id=1074 x=503 y=1066 width=85 height=91 xoffset=8 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1075 x=600 y=1066 width=66 height=91 xoffset=8 yoffset=69 xadvance=77 page=0 chnl=15 +char id=1076 x=678 y=1066 width=111 height=118 xoffset=2 yoffset=69 xadvance=115 page=0 chnl=15 +char id=1077 x=801 y=1066 width=92 height=94 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15 +char id=1078 x=905 y=1066 width=147 height=91 xoffset=2 yoffset=69 xadvance=150 page=0 chnl=15 +char id=1079 x=1064 y=1066 width=83 height=94 xoffset=4 yoffset=68 xadvance=90 page=0 chnl=15 +char id=1080 x=1159 y=1066 width=87 height=91 xoffset=8 yoffset=69 xadvance=102 page=0 chnl=15 +char id=1081 x=1258 y=1066 width=87 height=123 xoffset=8 yoffset=37 xadvance=102 page=0 chnl=15 +char id=1082 x=1357 y=1066 width=95 height=91 xoffset=8 yoffset=69 xadvance=102 page=0 chnl=15 +char id=1083 x=1464 y=1066 width=91 height=91 xoffset=4 yoffset=69 xadvance=101 page=0 chnl=15 +char id=1084 x=1567 y=1066 width=114 height=91 xoffset=8 yoffset=69 xadvance=128 page=0 chnl=15 +char id=1085 x=1693 y=1066 width=84 height=91 xoffset=8 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1086 x=1789 y=1066 width=95 height=94 xoffset=4 yoffset=68 xadvance=103 page=0 chnl=15 +char id=1087 x=1896 y=1066 width=85 height=91 xoffset=8 yoffset=69 xadvance=100 page=0 chnl=15 +char id=1088 x=1993 y=1066 width=94 height=126 xoffset=8 yoffset=68 xadvance=107 page=0 chnl=15 +char id=1089 x=2099 y=1066 width=92 height=94 xoffset=4 yoffset=68 xadvance=100 page=0 chnl=15 +char id=1090 x=2203 y=1066 width=89 height=91 xoffset=3 yoffset=69 xadvance=94 page=0 chnl=15 +char id=1091 x=2304 y=1066 width=100 height=125 xoffset=0 yoffset=69 xadvance=100 page=0 chnl=15 +char id=1092 x=2416 y=1066 width=135 height=152 xoffset=4 yoffset=39 xadvance=143 page=0 chnl=15 +char id=1093 x=2563 y=1066 width=95 height=91 xoffset=2 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1094 x=2670 y=1066 width=116 height=120 xoffset=8 yoffset=69 xadvance=126 page=0 chnl=15 +char id=1095 x=2798 y=1066 width=85 height=91 xoffset=8 yoffset=69 xadvance=99 page=0 chnl=15 +char id=1096 x=2895 y=1066 width=132 height=91 xoffset=8 yoffset=69 xadvance=146 page=0 chnl=15 +char id=1097 x=3039 y=1066 width=155 height=117 xoffset=8 yoffset=69 xadvance=165 page=0 chnl=15 +char id=1100 x=3206 y=1066 width=88 height=91 xoffset=8 yoffset=69 xadvance=100 page=0 chnl=15 +char id=1102 x=3306 y=1066 width=131 height=94 xoffset=4 yoffset=68 xadvance=139 page=0 chnl=15 +char id=1103 x=3449 y=1066 width=87 height=91 xoffset=4 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1108 x=3548 y=1066 width=90 height=94 xoffset=7 yoffset=68 xadvance=100 page=0 chnl=15 +char id=1110 x=3650 y=1066 width=33 height=130 xoffset=8 yoffset=30 xadvance=48 page=0 chnl=15 +char id=1111 x=3695 y=1066 width=67 height=128 xoffset=-9 yoffset=32 xadvance=48 page=0 chnl=15 +char id=8209 x=3774 y=1066 width=57 height=26 xoffset=18 yoffset=99 xadvance=88 page=0 chnl=15 +char id=8211 x=3843 y=1066 width=83 height=26 xoffset=0 yoffset=99 xadvance=82 page=0 chnl=15 +char id=8212 x=6 y=1278 width=166 height=26 xoffset=0 yoffset=99 xadvance=165 page=0 chnl=15 +char id=8217 x=184 y=1278 width=29 height=46 xoffset=6 yoffset=39 xadvance=42 page=0 chnl=15 +char id=8220 x=225 y=1278 width=60 height=45 xoffset=9 yoffset=33 xadvance=74 page=0 chnl=15 +char id=8221 x=297 y=1278 width=59 height=46 xoffset=6 yoffset=39 xadvance=73 page=0 chnl=15 +char id=8222 x=368 y=1278 width=59 height=46 xoffset=5 yoffset=144 xadvance=73 page=0 chnl=15 +char id=8226 x=439 y=1278 width=52 height=52 xoffset=7 yoffset=86 xadvance=65 page=0 chnl=15 +char id=8364 x=503 y=1278 width=103 height=124 xoffset=5 yoffset=38 xadvance=115 page=0 chnl=15 +char id=8627 x=618 y=1278 width=139 height=112 xoffset=16 yoffset=39 xadvance=170 page=0 chnl=15 +char id=8679 x=769 y=1278 width=170 height=130 xoffset=11 yoffset=30 xadvance=191 page=0 chnl=15 +char id=9003 x=951 y=1278 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=1136 y=1278 width=110 height=41 xoffset=10 yoffset=148 xadvance=130 page=0 chnl=15 +char id=9654 x=1258 y=1278 width=135 height=152 xoffset=18 yoffset=24 xadvance=162 page=0 chnl=15 +char id=9664 x=1405 y=1278 width=135 height=152 xoffset=9 yoffset=24 xadvance=162 page=0 chnl=15 +char id=9675 x=1552 y=1278 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=1689 y=1278 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=1826 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=1838 y=1278 width=127 height=101 xoffset=14 yoffset=57 xadvance=145 page=0 chnl=15 +char id=10004 x=1977 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=1989 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=2001 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=2013 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=2025 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Black.png b/iqpilot/selfdrive/assets/fonts/Inter-Black.png new file mode 100644 index 000000000..a6be89dc3 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Black.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Black.ttf b/iqpilot/selfdrive/assets/fonts/Inter-Black.ttf new file mode 100644 index 000000000..565375773 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Black.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Bold.fnt b/iqpilot/selfdrive/assets/fonts/Inter-Bold.fnt new file mode 100644 index 000000000..35cf23f45 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-Bold.fnt @@ -0,0 +1,254 @@ +info face="Inter-Bold" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-Bold.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=38 height=200 xoffset=0 yoffset=0 xadvance=38 page=0 chnl=15 +char id=33 x=68 y=6 width=29 height=123 xoffset=12 yoffset=39 xadvance=53 page=0 chnl=15 +char id=34 x=109 y=6 width=49 height=47 xoffset=8 yoffset=39 xadvance=64 page=0 chnl=15 +char id=35 x=170 y=6 width=105 height=121 xoffset=1 yoffset=39 xadvance=107 page=0 chnl=15 +char id=36 x=287 y=6 width=96 height=152 xoffset=6 yoffset=24 xadvance=108 page=0 chnl=15 +char id=37 x=395 y=6 width=116 height=130 xoffset=13 yoffset=35 xadvance=142 page=0 chnl=15 +char id=38 x=523 y=6 width=105 height=124 xoffset=6 yoffset=38 xadvance=111 page=0 chnl=15 +char id=39 x=640 y=6 width=19 height=47 xoffset=8 yoffset=39 xadvance=34 page=0 chnl=15 +char id=40 x=671 y=6 width=49 height=150 xoffset=15 yoffset=37 xadvance=67 page=0 chnl=15 +char id=41 x=732 y=6 width=49 height=150 xoffset=4 yoffset=37 xadvance=67 page=0 chnl=15 +char id=42 x=793 y=6 width=67 height=69 xoffset=13 yoffset=39 xadvance=93 page=0 chnl=15 +char id=43 x=872 y=6 width=84 height=84 xoffset=14 yoffset=70 xadvance=112 page=0 chnl=15 +char id=44 x=968 y=6 width=29 height=47 xoffset=9 yoffset=143 xadvance=50 page=0 chnl=15 +char id=45 x=1009 y=6 width=56 height=21 xoffset=11 yoffset=100 xadvance=77 page=0 chnl=15 +char id=46 x=1077 y=6 width=29 height=29 xoffset=10 yoffset=133 xadvance=49 page=0 chnl=15 +char id=47 x=1118 y=6 width=61 height=145 xoffset=2 yoffset=34 xadvance=64 page=0 chnl=15 +char id=48 x=1191 y=6 width=98 height=125 xoffset=8 yoffset=38 xadvance=113 page=0 chnl=15 +char id=49 x=1301 y=6 width=55 height=121 xoffset=8 yoffset=39 xadvance=80 page=0 chnl=15 +char id=50 x=1368 y=6 width=88 height=122 xoffset=8 yoffset=38 xadvance=104 page=0 chnl=15 +char id=51 x=1468 y=6 width=93 height=124 xoffset=8 yoffset=38 xadvance=108 page=0 chnl=15 +char id=52 x=1573 y=6 width=98 height=121 xoffset=7 yoffset=39 xadvance=112 page=0 chnl=15 +char id=53 x=1683 y=6 width=89 height=123 xoffset=10 yoffset=39 xadvance=106 page=0 chnl=15 +char id=54 x=1784 y=6 width=94 height=125 xoffset=7 yoffset=37 xadvance=109 page=0 chnl=15 +char id=55 x=1890 y=6 width=85 height=121 xoffset=6 yoffset=39 xadvance=98 page=0 chnl=15 +char id=56 x=1987 y=6 width=95 height=124 xoffset=7 yoffset=38 xadvance=109 page=0 chnl=15 +char id=57 x=2094 y=6 width=94 height=125 xoffset=8 yoffset=37 xadvance=109 page=0 chnl=15 +char id=58 x=2200 y=6 width=29 height=92 xoffset=10 yoffset=70 xadvance=49 page=0 chnl=15 +char id=59 x=2241 y=6 width=32 height=120 xoffset=9 yoffset=70 xadvance=49 page=0 chnl=15 +char id=60 x=2285 y=6 width=84 height=94 xoffset=14 yoffset=65 xadvance=112 page=0 chnl=15 +char id=61 x=2381 y=6 width=82 height=60 xoffset=15 yoffset=82 xadvance=112 page=0 chnl=15 +char id=62 x=2475 y=6 width=84 height=94 xoffset=14 yoffset=65 xadvance=112 page=0 chnl=15 +char id=63 x=2571 y=6 width=80 height=124 xoffset=6 yoffset=38 xadvance=92 page=0 chnl=15 +char id=64 x=2663 y=6 width=155 height=155 xoffset=9 yoffset=40 xadvance=170 page=0 chnl=15 +char id=65 x=2830 y=6 width=117 height=121 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15 +char id=66 x=2959 y=6 width=94 height=121 xoffset=10 yoffset=39 xadvance=109 page=0 chnl=15 +char id=67 x=3065 y=6 width=109 height=124 xoffset=8 yoffset=38 xadvance=124 page=0 chnl=15 +char id=68 x=3186 y=6 width=102 height=121 xoffset=10 yoffset=39 xadvance=120 page=0 chnl=15 +char id=69 x=3300 y=6 width=82 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15 +char id=70 x=3394 y=6 width=81 height=121 xoffset=10 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=3487 y=6 width=110 height=124 xoffset=8 yoffset=38 xadvance=125 page=0 chnl=15 +char id=72 x=3609 y=6 width=103 height=121 xoffset=10 yoffset=39 xadvance=123 page=0 chnl=15 +char id=73 x=3724 y=6 width=26 height=121 xoffset=10 yoffset=39 xadvance=46 page=0 chnl=15 +char id=74 x=3762 y=6 width=81 height=123 xoffset=3 yoffset=39 xadvance=94 page=0 chnl=15 +char id=75 x=3855 y=6 width=102 height=121 xoffset=10 yoffset=39 xadvance=113 page=0 chnl=15 +char id=76 x=3969 y=6 width=78 height=121 xoffset=10 yoffset=39 xadvance=93 page=0 chnl=15 +char id=77 x=6 y=218 width=131 height=121 xoffset=10 yoffset=39 xadvance=151 page=0 chnl=15 +char id=78 x=149 y=218 width=101 height=121 xoffset=10 yoffset=39 xadvance=121 page=0 chnl=15 +char id=79 x=262 y=218 width=113 height=124 xoffset=8 yoffset=38 xadvance=129 page=0 chnl=15 +char id=80 x=387 y=218 width=91 height=121 xoffset=10 yoffset=39 xadvance=107 page=0 chnl=15 +char id=81 x=490 y=218 width=113 height=132 xoffset=8 yoffset=38 xadvance=129 page=0 chnl=15 +char id=82 x=615 y=218 width=96 height=121 xoffset=10 yoffset=39 xadvance=108 page=0 chnl=15 +char id=83 x=723 y=218 width=96 height=124 xoffset=6 yoffset=38 xadvance=108 page=0 chnl=15 +char id=84 x=831 y=218 width=100 height=121 xoffset=5 yoffset=39 xadvance=110 page=0 chnl=15 +char id=85 x=943 y=218 width=101 height=123 xoffset=10 yoffset=39 xadvance=120 page=0 chnl=15 +char id=86 x=1056 y=218 width=117 height=121 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15 +char id=87 x=1185 y=218 width=166 height=121 xoffset=3 yoffset=39 xadvance=171 page=0 chnl=15 +char id=88 x=1363 y=218 width=110 height=121 xoffset=4 yoffset=39 xadvance=118 page=0 chnl=15 +char id=89 x=1485 y=218 width=114 height=121 xoffset=3 yoffset=39 xadvance=119 page=0 chnl=15 +char id=90 x=1611 y=218 width=93 height=121 xoffset=9 yoffset=39 xadvance=110 page=0 chnl=15 +char id=91 x=1716 y=218 width=47 height=150 xoffset=17 yoffset=37 xadvance=67 page=0 chnl=15 +char id=92 x=1775 y=218 width=61 height=145 xoffset=2 yoffset=34 xadvance=64 page=0 chnl=15 +char id=93 x=1848 y=218 width=48 height=150 xoffset=3 yoffset=37 xadvance=67 page=0 chnl=15 +char id=94 x=1908 y=218 width=71 height=53 xoffset=5 yoffset=42 xadvance=80 page=0 chnl=15 +char id=95 x=1991 y=218 width=80 height=19 xoffset=-1 yoffset=160 xadvance=78 page=0 chnl=15 +char id=96 x=2083 y=218 width=36 height=28 xoffset=23 yoffset=31 xadvance=82 page=0 chnl=15 +char id=97 x=2131 y=218 width=82 height=94 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15 +char id=98 x=2225 y=218 width=89 height=123 xoffset=10 yoffset=39 xadvance=104 page=0 chnl=15 +char id=99 x=2326 y=218 width=85 height=94 xoffset=6 yoffset=68 xadvance=97 page=0 chnl=15 +char id=100 x=2423 y=218 width=89 height=123 xoffset=6 yoffset=39 xadvance=104 page=0 chnl=15 +char id=101 x=2524 y=218 width=87 height=94 xoffset=6 yoffset=68 xadvance=98 page=0 chnl=15 +char id=102 x=2623 y=218 width=61 height=126 xoffset=2 yoffset=34 xadvance=63 page=0 chnl=15 +char id=103 x=2696 y=218 width=89 height=128 xoffset=6 yoffset=68 xadvance=104 page=0 chnl=15 +char id=104 x=2797 y=218 width=85 height=121 xoffset=9 yoffset=39 xadvance=103 page=0 chnl=15 +char id=105 x=2894 y=218 width=28 height=128 xoffset=9 yoffset=32 xadvance=44 page=0 chnl=15 +char id=106 x=2934 y=218 width=41 height=162 xoffset=-5 yoffset=32 xadvance=44 page=0 chnl=15 +char id=107 x=2987 y=218 width=87 height=121 xoffset=9 yoffset=39 xadvance=96 page=0 chnl=15 +char id=108 x=3086 y=218 width=26 height=121 xoffset=9 yoffset=39 xadvance=44 page=0 chnl=15 +char id=109 x=3124 y=218 width=132 height=92 xoffset=9 yoffset=68 xadvance=150 page=0 chnl=15 +char id=110 x=3268 y=218 width=85 height=92 xoffset=9 yoffset=68 xadvance=102 page=0 chnl=15 +char id=111 x=3365 y=218 width=90 height=94 xoffset=6 yoffset=68 xadvance=101 page=0 chnl=15 +char id=112 x=3467 y=218 width=89 height=126 xoffset=9 yoffset=68 xadvance=104 page=0 chnl=15 +char id=113 x=3568 y=218 width=89 height=126 xoffset=6 yoffset=68 xadvance=104 page=0 chnl=15 +char id=114 x=3669 y=218 width=56 height=92 xoffset=9 yoffset=68 xadvance=67 page=0 chnl=15 +char id=115 x=3737 y=218 width=83 height=94 xoffset=5 yoffset=68 xadvance=92 page=0 chnl=15 +char id=116 x=3832 y=218 width=57 height=114 xoffset=3 yoffset=48 xadvance=64 page=0 chnl=15 +char id=117 x=3901 y=218 width=84 height=93 xoffset=9 yoffset=69 xadvance=102 page=0 chnl=15 +char id=118 x=6 y=430 width=93 height=91 xoffset=2 yoffset=69 xadvance=96 page=0 chnl=15 +char id=119 x=111 y=430 width=135 height=91 xoffset=3 yoffset=69 xadvance=140 page=0 chnl=15 +char id=120 x=258 y=430 width=87 height=91 xoffset=4 yoffset=69 xadvance=94 page=0 chnl=15 +char id=121 x=357 y=430 width=93 height=125 xoffset=2 yoffset=69 xadvance=96 page=0 chnl=15 +char id=122 x=462 y=430 width=77 height=91 xoffset=9 yoffset=69 xadvance=94 page=0 chnl=15 +char id=123 x=551 y=430 width=59 height=150 xoffset=5 yoffset=37 xadvance=67 page=0 chnl=15 +char id=124 x=622 y=430 width=24 height=198 xoffset=19 yoffset=1 xadvance=61 page=0 chnl=15 +char id=125 x=658 y=430 width=60 height=150 xoffset=3 yoffset=37 xadvance=67 page=0 chnl=15 +char id=126 x=730 y=430 width=89 height=38 xoffset=12 yoffset=93 xadvance=112 page=0 chnl=15 +char id=161 x=831 y=430 width=29 height=123 xoffset=12 yoffset=68 xadvance=53 page=0 chnl=15 +char id=163 x=872 y=430 width=89 height=122 xoffset=11 yoffset=38 xadvance=110 page=0 chnl=15 +char id=165 x=973 y=430 width=91 height=121 xoffset=2 yoffset=39 xadvance=94 page=0 chnl=15 +char id=167 x=1076 y=430 width=82 height=147 xoffset=8 yoffset=38 xadvance=98 page=0 chnl=15 +char id=171 x=1170 y=430 width=86 height=73 xoffset=9 yoffset=75 xadvance=103 page=0 chnl=15 +char id=176 x=1268 y=430 width=58 height=59 xoffset=9 yoffset=38 xadvance=75 page=0 chnl=15 +char id=187 x=1338 y=430 width=86 height=73 xoffset=8 yoffset=75 xadvance=103 page=0 chnl=15 +char id=191 x=1436 y=430 width=80 height=124 xoffset=7 yoffset=69 xadvance=92 page=0 chnl=15 +char id=192 x=1528 y=430 width=117 height=159 xoffset=3 yoffset=1 xadvance=123 page=0 chnl=15 +char id=193 x=1657 y=430 width=117 height=159 xoffset=3 yoffset=1 xadvance=123 page=0 chnl=15 +char id=195 x=1786 y=430 width=117 height=156 xoffset=3 yoffset=4 xadvance=123 page=0 chnl=15 +char id=196 x=1915 y=430 width=117 height=157 xoffset=3 yoffset=3 xadvance=123 page=0 chnl=15 +char id=199 x=2044 y=430 width=109 height=161 xoffset=8 yoffset=38 xadvance=124 page=0 chnl=15 +char id=201 x=2165 y=430 width=82 height=159 xoffset=10 yoffset=1 xadvance=101 page=0 chnl=15 +char id=202 x=2259 y=430 width=82 height=158 xoffset=10 yoffset=2 xadvance=101 page=0 chnl=15 +char id=205 x=2353 y=430 width=40 height=159 xoffset=10 yoffset=1 xadvance=46 page=0 chnl=15 +char id=209 x=2405 y=430 width=101 height=155 xoffset=10 yoffset=5 xadvance=121 page=0 chnl=15 +char id=211 x=2518 y=430 width=113 height=161 xoffset=8 yoffset=1 xadvance=129 page=0 chnl=15 +char id=212 x=2643 y=430 width=113 height=160 xoffset=8 yoffset=2 xadvance=129 page=0 chnl=15 +char id=214 x=2768 y=430 width=113 height=159 xoffset=8 yoffset=3 xadvance=129 page=0 chnl=15 +char id=215 x=2893 y=430 width=86 height=86 xoffset=13 yoffset=69 xadvance=112 page=0 chnl=15 +char id=218 x=2991 y=430 width=101 height=161 xoffset=10 yoffset=1 xadvance=120 page=0 chnl=15 +char id=220 x=3104 y=430 width=101 height=159 xoffset=10 yoffset=3 xadvance=120 page=0 chnl=15 +char id=223 x=3217 y=430 width=93 height=122 xoffset=10 yoffset=38 xadvance=109 page=0 chnl=15 +char id=224 x=3322 y=430 width=82 height=131 xoffset=5 yoffset=31 xadvance=95 page=0 chnl=15 +char id=225 x=3416 y=430 width=82 height=131 xoffset=5 yoffset=31 xadvance=95 page=0 chnl=15 +char id=226 x=3510 y=430 width=82 height=130 xoffset=5 yoffset=32 xadvance=95 page=0 chnl=15 +char id=227 x=3604 y=430 width=82 height=127 xoffset=5 yoffset=35 xadvance=95 page=0 chnl=15 +char id=228 x=3698 y=430 width=82 height=129 xoffset=5 yoffset=33 xadvance=95 page=0 chnl=15 +char id=231 x=3792 y=430 width=85 height=131 xoffset=6 yoffset=68 xadvance=97 page=0 chnl=15 +char id=232 x=3889 y=430 width=87 height=131 xoffset=6 yoffset=31 xadvance=98 page=0 chnl=15 +char id=233 x=3988 y=430 width=87 height=131 xoffset=6 yoffset=31 xadvance=98 page=0 chnl=15 +char id=234 x=6 y=642 width=87 height=130 xoffset=6 yoffset=32 xadvance=98 page=0 chnl=15 +char id=237 x=105 y=642 width=41 height=129 xoffset=9 yoffset=31 xadvance=44 page=0 chnl=15 +char id=238 x=158 y=642 width=67 height=128 xoffset=-11 yoffset=32 xadvance=44 page=0 chnl=15 +char id=241 x=237 y=642 width=85 height=125 xoffset=9 yoffset=35 xadvance=102 page=0 chnl=15 +char id=243 x=334 y=642 width=90 height=131 xoffset=6 yoffset=31 xadvance=101 page=0 chnl=15 +char id=244 x=436 y=642 width=90 height=130 xoffset=6 yoffset=32 xadvance=101 page=0 chnl=15 +char id=245 x=538 y=642 width=90 height=127 xoffset=6 yoffset=35 xadvance=101 page=0 chnl=15 +char id=246 x=640 y=642 width=90 height=129 xoffset=6 yoffset=33 xadvance=101 page=0 chnl=15 +char id=249 x=742 y=642 width=84 height=131 xoffset=9 yoffset=31 xadvance=102 page=0 chnl=15 +char id=250 x=838 y=642 width=84 height=131 xoffset=9 yoffset=31 xadvance=102 page=0 chnl=15 +char id=251 x=934 y=642 width=84 height=130 xoffset=9 yoffset=32 xadvance=102 page=0 chnl=15 +char id=252 x=1030 y=642 width=84 height=129 xoffset=9 yoffset=33 xadvance=102 page=0 chnl=15 +char id=260 x=1126 y=642 width=119 height=155 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15 +char id=261 x=1257 y=642 width=84 height=126 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15 +char id=262 x=1353 y=642 width=109 height=161 xoffset=8 yoffset=1 xadvance=124 page=0 chnl=15 +char id=263 x=1474 y=642 width=85 height=131 xoffset=6 yoffset=31 xadvance=97 page=0 chnl=15 +char id=280 x=1571 y=642 width=84 height=155 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15 +char id=281 x=1667 y=642 width=87 height=124 xoffset=6 yoffset=68 xadvance=98 page=0 chnl=15 +char id=286 x=1766 y=642 width=110 height=154 xoffset=8 yoffset=8 xadvance=125 page=0 chnl=15 +char id=287 x=1888 y=642 width=89 height=158 xoffset=6 yoffset=38 xadvance=104 page=0 chnl=15 +char id=304 x=1989 y=642 width=28 height=158 xoffset=9 yoffset=2 xadvance=46 page=0 chnl=15 +char id=305 x=2029 y=642 width=26 height=91 xoffset=9 yoffset=69 xadvance=44 page=0 chnl=15 +char id=321 x=2067 y=642 width=91 height=121 xoffset=2 yoffset=39 xadvance=96 page=0 chnl=15 +char id=322 x=2170 y=642 width=49 height=121 xoffset=-2 yoffset=39 xadvance=44 page=0 chnl=15 +char id=323 x=2231 y=642 width=101 height=159 xoffset=10 yoffset=1 xadvance=121 page=0 chnl=15 +char id=324 x=2344 y=642 width=85 height=129 xoffset=9 yoffset=31 xadvance=102 page=0 chnl=15 +char id=339 x=2441 y=642 width=152 height=94 xoffset=6 yoffset=68 xadvance=161 page=0 chnl=15 +char id=346 x=2605 y=642 width=96 height=161 xoffset=6 yoffset=1 xadvance=108 page=0 chnl=15 +char id=347 x=2713 y=642 width=83 height=131 xoffset=5 yoffset=31 xadvance=92 page=0 chnl=15 +char id=350 x=2808 y=642 width=96 height=161 xoffset=6 yoffset=38 xadvance=108 page=0 chnl=15 +char id=351 x=2916 y=642 width=83 height=131 xoffset=5 yoffset=68 xadvance=92 page=0 chnl=15 +char id=377 x=3011 y=642 width=93 height=159 xoffset=9 yoffset=1 xadvance=110 page=0 chnl=15 +char id=378 x=3116 y=642 width=77 height=129 xoffset=9 yoffset=31 xadvance=94 page=0 chnl=15 +char id=379 x=3205 y=642 width=93 height=158 xoffset=9 yoffset=2 xadvance=110 page=0 chnl=15 +char id=380 x=3310 y=642 width=77 height=128 xoffset=9 yoffset=32 xadvance=94 page=0 chnl=15 +char id=1028 x=3399 y=642 width=100 height=124 xoffset=8 yoffset=38 xadvance=115 page=0 chnl=15 +char id=1030 x=3511 y=642 width=26 height=121 xoffset=10 yoffset=39 xadvance=46 page=0 chnl=15 +char id=1040 x=3549 y=642 width=117 height=121 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15 +char id=1041 x=3678 y=642 width=92 height=121 xoffset=10 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1042 x=3782 y=642 width=94 height=121 xoffset=10 yoffset=39 xadvance=109 page=0 chnl=15 +char id=1043 x=3888 y=642 width=81 height=121 xoffset=10 yoffset=39 xadvance=96 page=0 chnl=15 +char id=1044 x=6 y=854 width=123 height=150 xoffset=3 yoffset=39 xadvance=130 page=0 chnl=15 +char id=1045 x=141 y=854 width=82 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15 +char id=1046 x=235 y=854 width=171 height=121 xoffset=4 yoffset=39 xadvance=179 page=0 chnl=15 +char id=1047 x=418 y=854 width=93 height=124 xoffset=8 yoffset=38 xadvance=108 page=0 chnl=15 +char id=1048 x=523 y=854 width=101 height=121 xoffset=10 yoffset=39 xadvance=121 page=0 chnl=15 +char id=1049 x=636 y=854 width=101 height=152 xoffset=10 yoffset=8 xadvance=121 page=0 chnl=15 +char id=1050 x=749 y=854 width=109 height=121 xoffset=10 yoffset=39 xadvance=121 page=0 chnl=15 +char id=1051 x=870 y=854 width=108 height=121 xoffset=3 yoffset=39 xadvance=120 page=0 chnl=15 +char id=1052 x=990 y=854 width=131 height=121 xoffset=10 yoffset=39 xadvance=151 page=0 chnl=15 +char id=1053 x=1133 y=854 width=103 height=121 xoffset=10 yoffset=39 xadvance=123 page=0 chnl=15 +char id=1054 x=1248 y=854 width=113 height=124 xoffset=8 yoffset=38 xadvance=129 page=0 chnl=15 +char id=1055 x=1373 y=854 width=100 height=121 xoffset=13 yoffset=39 xadvance=126 page=0 chnl=15 +char id=1056 x=1485 y=854 width=91 height=121 xoffset=10 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1057 x=1588 y=854 width=109 height=124 xoffset=8 yoffset=38 xadvance=124 page=0 chnl=15 +char id=1058 x=1709 y=854 width=100 height=121 xoffset=5 yoffset=39 xadvance=110 page=0 chnl=15 +char id=1059 x=1821 y=854 width=105 height=123 xoffset=3 yoffset=39 xadvance=110 page=0 chnl=15 +char id=1060 x=1938 y=854 width=127 height=128 xoffset=8 yoffset=37 xadvance=142 page=0 chnl=15 +char id=1061 x=2077 y=854 width=110 height=121 xoffset=4 yoffset=39 xadvance=118 page=0 chnl=15 +char id=1062 x=2199 y=854 width=117 height=150 xoffset=10 yoffset=39 xadvance=131 page=0 chnl=15 +char id=1063 x=2328 y=854 width=97 height=121 xoffset=15 yoffset=39 xadvance=126 page=0 chnl=15 +char id=1064 x=2437 y=854 width=144 height=121 xoffset=15 yoffset=39 xadvance=173 page=0 chnl=15 +char id=1065 x=2593 y=854 width=157 height=150 xoffset=15 yoffset=39 xadvance=176 page=0 chnl=15 +char id=1068 x=2762 y=854 width=93 height=121 xoffset=10 yoffset=39 xadvance=111 page=0 chnl=15 +char id=1070 x=2867 y=854 width=157 height=124 xoffset=10 yoffset=38 xadvance=165 page=0 chnl=15 +char id=1071 x=3036 y=854 width=96 height=121 xoffset=3 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1072 x=3144 y=854 width=82 height=94 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15 +char id=1073 x=3238 y=854 width=89 height=126 xoffset=6 yoffset=36 xadvance=101 page=0 chnl=15 +char id=1074 x=3339 y=854 width=81 height=91 xoffset=9 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1075 x=3432 y=854 width=63 height=91 xoffset=9 yoffset=69 xadvance=76 page=0 chnl=15 +char id=1076 x=3507 y=854 width=105 height=118 xoffset=2 yoffset=69 xadvance=110 page=0 chnl=15 +char id=1077 x=3624 y=854 width=87 height=94 xoffset=6 yoffset=68 xadvance=98 page=0 chnl=15 +char id=1078 x=3723 y=854 width=137 height=91 xoffset=4 yoffset=69 xadvance=145 page=0 chnl=15 +char id=1079 x=3872 y=854 width=77 height=94 xoffset=5 yoffset=68 xadvance=87 page=0 chnl=15 +char id=1080 x=3961 y=854 width=82 height=91 xoffset=9 yoffset=69 xadvance=100 page=0 chnl=15 +char id=1081 x=6 y=1066 width=82 height=122 xoffset=9 yoffset=38 xadvance=100 page=0 chnl=15 +char id=1082 x=100 y=1066 width=88 height=91 xoffset=9 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1083 x=200 y=1066 width=87 height=91 xoffset=4 yoffset=69 xadvance=99 page=0 chnl=15 +char id=1084 x=299 y=1066 width=109 height=91 xoffset=9 yoffset=69 xadvance=126 page=0 chnl=15 +char id=1085 x=420 y=1066 width=80 height=91 xoffset=9 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1086 x=512 y=1066 width=90 height=94 xoffset=6 yoffset=68 xadvance=101 page=0 chnl=15 +char id=1087 x=614 y=1066 width=80 height=91 xoffset=9 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1088 x=706 y=1066 width=89 height=126 xoffset=9 yoffset=68 xadvance=104 page=0 chnl=15 +char id=1089 x=807 y=1066 width=85 height=94 xoffset=6 yoffset=68 xadvance=97 page=0 chnl=15 +char id=1090 x=904 y=1066 width=82 height=91 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15 +char id=1091 x=998 y=1066 width=93 height=125 xoffset=2 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1092 x=1103 y=1066 width=119 height=152 xoffset=6 yoffset=39 xadvance=131 page=0 chnl=15 +char id=1093 x=1234 y=1066 width=87 height=91 xoffset=4 yoffset=69 xadvance=94 page=0 chnl=15 +char id=1094 x=1333 y=1066 width=105 height=120 xoffset=9 yoffset=69 xadvance=118 page=0 chnl=15 +char id=1095 x=1450 y=1066 width=80 height=91 xoffset=9 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1096 x=1542 y=1066 width=124 height=91 xoffset=9 yoffset=69 xadvance=141 page=0 chnl=15 +char id=1097 x=1678 y=1066 width=143 height=117 xoffset=9 yoffset=69 xadvance=156 page=0 chnl=15 +char id=1100 x=1833 y=1066 width=82 height=91 xoffset=9 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1102 x=1927 y=1066 width=126 height=94 xoffset=5 yoffset=68 xadvance=137 page=0 chnl=15 +char id=1103 x=2065 y=1066 width=82 height=91 xoffset=5 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1108 x=2159 y=1066 width=85 height=94 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15 +char id=1110 x=2256 y=1066 width=28 height=128 xoffset=9 yoffset=32 xadvance=44 page=0 chnl=15 +char id=1111 x=2296 y=1066 width=61 height=127 xoffset=-8 yoffset=33 xadvance=44 page=0 chnl=15 +char id=8209 x=2369 y=1066 width=56 height=21 xoffset=12 yoffset=100 xadvance=76 page=0 chnl=15 +char id=8211 x=2437 y=1066 width=83 height=21 xoffset=0 yoffset=100 xadvance=82 page=0 chnl=15 +char id=8212 x=2532 y=1066 width=166 height=21 xoffset=0 yoffset=100 xadvance=165 page=0 chnl=15 +char id=8217 x=2710 y=1066 width=27 height=44 xoffset=4 yoffset=39 xadvance=37 page=0 chnl=15 +char id=8220 x=2749 y=1066 width=56 height=44 xoffset=9 yoffset=34 xadvance=69 page=0 chnl=15 +char id=8221 x=2817 y=1066 width=57 height=44 xoffset=4 yoffset=39 xadvance=69 page=0 chnl=15 +char id=8222 x=2886 y=1066 width=57 height=44 xoffset=4 yoffset=144 xadvance=69 page=0 chnl=15 +char id=8226 x=2955 y=1066 width=53 height=52 xoffset=12 yoffset=86 xadvance=76 page=0 chnl=15 +char id=8364 x=3020 y=1066 width=101 height=124 xoffset=4 yoffset=38 xadvance=113 page=0 chnl=15 +char id=8627 x=3133 y=1066 width=136 height=109 xoffset=16 yoffset=39 xadvance=167 page=0 chnl=15 +char id=8679 x=3281 y=1066 width=158 height=130 xoffset=12 yoffset=30 xadvance=182 page=0 chnl=15 +char id=9003 x=3451 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=3636 y=1066 width=104 height=40 xoffset=11 yoffset=148 xadvance=126 page=0 chnl=15 +char id=9654 x=3752 y=1066 width=132 height=152 xoffset=17 yoffset=24 xadvance=157 page=0 chnl=15 +char id=9664 x=3896 y=1066 width=132 height=152 xoffset=9 yoffset=24 xadvance=157 page=0 chnl=15 +char id=9675 x=6 y=1278 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=143 y=1278 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=280 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=292 y=1278 width=122 height=94 xoffset=15 yoffset=59 xadvance=145 page=0 chnl=15 +char id=10004 x=426 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=438 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=450 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=462 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=474 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Bold.png b/iqpilot/selfdrive/assets/fonts/Inter-Bold.png new file mode 100644 index 000000000..5a2ce6710 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Bold.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Bold.ttf b/iqpilot/selfdrive/assets/fonts/Inter-Bold.ttf new file mode 100644 index 000000000..e98b84ce8 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Bold.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.fnt b/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.fnt new file mode 100644 index 000000000..8bfb1fb23 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.fnt @@ -0,0 +1,254 @@ +info face="Inter-ExtraBold" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-ExtraBold.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=35 height=200 xoffset=0 yoffset=0 xadvance=35 page=0 chnl=15 +char id=33 x=65 y=6 width=32 height=123 xoffset=12 yoffset=39 xadvance=56 page=0 chnl=15 +char id=34 x=109 y=6 width=50 height=48 xoffset=7 yoffset=39 xadvance=64 page=0 chnl=15 +char id=35 x=171 y=6 width=107 height=121 xoffset=1 yoffset=39 xadvance=108 page=0 chnl=15 +char id=36 x=290 y=6 width=99 height=152 xoffset=5 yoffset=24 xadvance=109 page=0 chnl=15 +char id=37 x=401 y=6 width=119 height=132 xoffset=13 yoffset=34 xadvance=144 page=0 chnl=15 +char id=38 x=532 y=6 width=109 height=124 xoffset=5 yoffset=38 xadvance=113 page=0 chnl=15 +char id=39 x=653 y=6 width=20 height=48 xoffset=7 yoffset=39 xadvance=33 page=0 chnl=15 +char id=40 x=685 y=6 width=53 height=149 xoffset=14 yoffset=38 xadvance=70 page=0 chnl=15 +char id=41 x=750 y=6 width=53 height=149 xoffset=3 yoffset=38 xadvance=70 page=0 chnl=15 +char id=42 x=815 y=6 width=69 height=69 xoffset=14 yoffset=39 xadvance=96 page=0 chnl=15 +char id=43 x=896 y=6 width=86 height=86 xoffset=14 yoffset=69 xadvance=113 page=0 chnl=15 +char id=44 x=994 y=6 width=31 height=47 xoffset=8 yoffset=143 xadvance=51 page=0 chnl=15 +char id=45 x=1037 y=6 width=56 height=23 xoffset=11 yoffset=100 xadvance=77 page=0 chnl=15 +char id=46 x=1105 y=6 width=32 height=31 xoffset=9 yoffset=131 xadvance=50 page=0 chnl=15 +char id=47 x=1149 y=6 width=64 height=145 xoffset=1 yoffset=34 xadvance=66 page=0 chnl=15 +char id=48 x=1225 y=6 width=103 height=125 xoffset=7 yoffset=38 xadvance=117 page=0 chnl=15 +char id=49 x=1340 y=6 width=58 height=121 xoffset=7 yoffset=39 xadvance=82 page=0 chnl=15 +char id=50 x=1410 y=6 width=91 height=122 xoffset=7 yoffset=38 xadvance=105 page=0 chnl=15 +char id=51 x=1513 y=6 width=96 height=124 xoffset=7 yoffset=38 xadvance=110 page=0 chnl=15 +char id=52 x=1621 y=6 width=101 height=121 xoffset=7 yoffset=39 xadvance=113 page=0 chnl=15 +char id=53 x=1734 y=6 width=93 height=123 xoffset=9 yoffset=39 xadvance=108 page=0 chnl=15 +char id=54 x=1839 y=6 width=98 height=125 xoffset=6 yoffset=37 xadvance=111 page=0 chnl=15 +char id=55 x=1949 y=6 width=88 height=121 xoffset=5 yoffset=39 xadvance=99 page=0 chnl=15 +char id=56 x=2049 y=6 width=98 height=124 xoffset=7 yoffset=38 xadvance=111 page=0 chnl=15 +char id=57 x=2159 y=6 width=98 height=125 xoffset=7 yoffset=37 xadvance=111 page=0 chnl=15 +char id=58 x=2269 y=6 width=32 height=93 xoffset=9 yoffset=69 xadvance=50 page=0 chnl=15 +char id=59 x=2313 y=6 width=35 height=121 xoffset=8 yoffset=69 xadvance=50 page=0 chnl=15 +char id=60 x=2360 y=6 width=86 height=97 xoffset=14 yoffset=63 xadvance=113 page=0 chnl=15 +char id=61 x=2458 y=6 width=85 height=65 xoffset=14 yoffset=79 xadvance=113 page=0 chnl=15 +char id=62 x=2555 y=6 width=86 height=97 xoffset=14 yoffset=63 xadvance=113 page=0 chnl=15 +char id=63 x=2653 y=6 width=83 height=124 xoffset=6 yoffset=38 xadvance=96 page=0 chnl=15 +char id=64 x=2748 y=6 width=160 height=158 xoffset=10 yoffset=38 xadvance=175 page=0 chnl=15 +char id=65 x=2920 y=6 width=121 height=121 xoffset=3 yoffset=39 xadvance=127 page=0 chnl=15 +char id=66 x=3053 y=6 width=96 height=121 xoffset=9 yoffset=39 xadvance=109 page=0 chnl=15 +char id=67 x=3161 y=6 width=112 height=124 xoffset=7 yoffset=38 xadvance=125 page=0 chnl=15 +char id=68 x=3285 y=6 width=104 height=121 xoffset=9 yoffset=39 xadvance=120 page=0 chnl=15 +char id=69 x=3401 y=6 width=84 height=121 xoffset=9 yoffset=39 xadvance=101 page=0 chnl=15 +char id=70 x=3497 y=6 width=83 height=121 xoffset=9 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=3592 y=6 width=112 height=124 xoffset=7 yoffset=38 xadvance=126 page=0 chnl=15 +char id=72 x=3716 y=6 width=106 height=121 xoffset=9 yoffset=39 xadvance=123 page=0 chnl=15 +char id=73 x=3834 y=6 width=30 height=121 xoffset=9 yoffset=39 xadvance=47 page=0 chnl=15 +char id=74 x=3876 y=6 width=85 height=123 xoffset=2 yoffset=39 xadvance=95 page=0 chnl=15 +char id=75 x=3973 y=6 width=106 height=121 xoffset=9 yoffset=39 xadvance=116 page=0 chnl=15 +char id=76 x=6 y=218 width=80 height=121 xoffset=9 yoffset=39 xadvance=94 page=0 chnl=15 +char id=77 x=98 y=218 width=135 height=121 xoffset=9 yoffset=39 xadvance=152 page=0 chnl=15 +char id=78 x=245 y=218 width=103 height=121 xoffset=9 yoffset=39 xadvance=120 page=0 chnl=15 +char id=79 x=360 y=218 width=116 height=124 xoffset=7 yoffset=38 xadvance=130 page=0 chnl=15 +char id=80 x=488 y=218 width=94 height=121 xoffset=9 yoffset=39 xadvance=107 page=0 chnl=15 +char id=81 x=594 y=218 width=116 height=132 xoffset=7 yoffset=38 xadvance=130 page=0 chnl=15 +char id=82 x=722 y=218 width=98 height=121 xoffset=9 yoffset=39 xadvance=109 page=0 chnl=15 +char id=83 x=832 y=218 width=99 height=124 xoffset=5 yoffset=38 xadvance=109 page=0 chnl=15 +char id=84 x=943 y=218 width=102 height=121 xoffset=5 yoffset=39 xadvance=111 page=0 chnl=15 +char id=85 x=1057 y=218 width=102 height=123 xoffset=9 yoffset=39 xadvance=119 page=0 chnl=15 +char id=86 x=1171 y=218 width=121 height=121 xoffset=3 yoffset=39 xadvance=127 page=0 chnl=15 +char id=87 x=1304 y=218 width=172 height=121 xoffset=2 yoffset=39 xadvance=175 page=0 chnl=15 +char id=88 x=1488 y=218 width=114 height=121 xoffset=4 yoffset=39 xadvance=122 page=0 chnl=15 +char id=89 x=1614 y=218 width=117 height=121 xoffset=3 yoffset=39 xadvance=123 page=0 chnl=15 +char id=90 x=1743 y=218 width=96 height=121 xoffset=8 yoffset=39 xadvance=112 page=0 chnl=15 +char id=91 x=1851 y=218 width=52 height=149 xoffset=16 yoffset=38 xadvance=70 page=0 chnl=15 +char id=92 x=1915 y=218 width=64 height=145 xoffset=1 yoffset=34 xadvance=66 page=0 chnl=15 +char id=93 x=1991 y=218 width=51 height=149 xoffset=3 yoffset=38 xadvance=70 page=0 chnl=15 +char id=94 x=2054 y=218 width=72 height=53 xoffset=5 yoffset=42 xadvance=81 page=0 chnl=15 +char id=95 x=2138 y=218 width=82 height=22 xoffset=-1 yoffset=160 xadvance=80 page=0 chnl=15 +char id=96 x=2232 y=218 width=38 height=28 xoffset=22 yoffset=31 xadvance=82 page=0 chnl=15 +char id=97 x=2282 y=218 width=85 height=94 xoffset=4 yoffset=68 xadvance=96 page=0 chnl=15 +char id=98 x=2379 y=218 width=91 height=123 xoffset=9 yoffset=39 xadvance=105 page=0 chnl=15 +char id=99 x=2482 y=218 width=89 height=94 xoffset=5 yoffset=68 xadvance=98 page=0 chnl=15 +char id=100 x=2583 y=218 width=92 height=123 xoffset=5 yoffset=39 xadvance=105 page=0 chnl=15 +char id=101 x=2687 y=218 width=90 height=94 xoffset=5 yoffset=68 xadvance=99 page=0 chnl=15 +char id=102 x=2789 y=218 width=63 height=126 xoffset=2 yoffset=34 xadvance=65 page=0 chnl=15 +char id=103 x=2864 y=218 width=92 height=127 xoffset=5 yoffset=68 xadvance=105 page=0 chnl=15 +char id=104 x=2968 y=218 width=88 height=121 xoffset=9 yoffset=39 xadvance=104 page=0 chnl=15 +char id=105 x=3068 y=218 width=31 height=129 xoffset=8 yoffset=31 xadvance=46 page=0 chnl=15 +char id=106 x=3111 y=218 width=44 height=163 xoffset=-5 yoffset=31 xadvance=46 page=0 chnl=15 +char id=107 x=3167 y=218 width=90 height=121 xoffset=9 yoffset=39 xadvance=98 page=0 chnl=15 +char id=108 x=3269 y=218 width=29 height=121 xoffset=9 yoffset=39 xadvance=46 page=0 chnl=15 +char id=109 x=3310 y=218 width=136 height=92 xoffset=9 yoffset=68 xadvance=153 page=0 chnl=15 +char id=110 x=3458 y=218 width=88 height=92 xoffset=9 yoffset=68 xadvance=104 page=0 chnl=15 +char id=111 x=3558 y=218 width=92 height=94 xoffset=5 yoffset=68 xadvance=102 page=0 chnl=15 +char id=112 x=3662 y=218 width=91 height=126 xoffset=9 yoffset=68 xadvance=105 page=0 chnl=15 +char id=113 x=3765 y=218 width=92 height=126 xoffset=5 yoffset=68 xadvance=105 page=0 chnl=15 +char id=114 x=3869 y=218 width=58 height=92 xoffset=9 yoffset=68 xadvance=69 page=0 chnl=15 +char id=115 x=3939 y=218 width=86 height=94 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15 +char id=116 x=6 y=430 width=59 height=114 xoffset=3 yoffset=48 xadvance=65 page=0 chnl=15 +char id=117 x=77 y=430 width=87 height=93 xoffset=9 yoffset=69 xadvance=105 page=0 chnl=15 +char id=118 x=176 y=430 width=96 height=91 xoffset=1 yoffset=69 xadvance=98 page=0 chnl=15 +char id=119 x=284 y=430 width=139 height=91 xoffset=2 yoffset=69 xadvance=142 page=0 chnl=15 +char id=120 x=435 y=430 width=91 height=91 xoffset=3 yoffset=69 xadvance=96 page=0 chnl=15 +char id=121 x=538 y=430 width=96 height=125 xoffset=1 yoffset=69 xadvance=98 page=0 chnl=15 +char id=122 x=646 y=430 width=78 height=91 xoffset=9 yoffset=69 xadvance=96 page=0 chnl=15 +char id=123 x=736 y=430 width=64 height=149 xoffset=4 yoffset=38 xadvance=70 page=0 chnl=15 +char id=124 x=812 y=430 width=29 height=198 xoffset=18 yoffset=1 xadvance=64 page=0 chnl=15 +char id=125 x=853 y=430 width=63 height=149 xoffset=3 yoffset=38 xadvance=70 page=0 chnl=15 +char id=126 x=928 y=430 width=91 height=41 xoffset=11 yoffset=91 xadvance=113 page=0 chnl=15 +char id=161 x=1031 y=430 width=32 height=123 xoffset=12 yoffset=68 xadvance=56 page=0 chnl=15 +char id=163 x=1075 y=430 width=91 height=122 xoffset=11 yoffset=38 xadvance=113 page=0 chnl=15 +char id=165 x=1178 y=430 width=92 height=121 xoffset=2 yoffset=39 xadvance=95 page=0 chnl=15 +char id=167 x=1282 y=430 width=83 height=147 xoffset=9 yoffset=38 xadvance=100 page=0 chnl=15 +char id=171 x=1377 y=430 width=92 height=73 xoffset=9 yoffset=75 xadvance=108 page=0 chnl=15 +char id=176 x=1481 y=430 width=60 height=59 xoffset=8 yoffset=39 xadvance=76 page=0 chnl=15 +char id=187 x=1553 y=430 width=93 height=73 xoffset=7 yoffset=75 xadvance=108 page=0 chnl=15 +char id=191 x=1658 y=430 width=83 height=125 xoffset=7 yoffset=69 xadvance=96 page=0 chnl=15 +char id=192 x=1753 y=430 width=121 height=159 xoffset=3 yoffset=1 xadvance=127 page=0 chnl=15 +char id=193 x=1886 y=430 width=121 height=159 xoffset=3 yoffset=1 xadvance=127 page=0 chnl=15 +char id=195 x=2019 y=430 width=121 height=157 xoffset=3 yoffset=3 xadvance=127 page=0 chnl=15 +char id=196 x=2152 y=430 width=121 height=158 xoffset=3 yoffset=2 xadvance=127 page=0 chnl=15 +char id=199 x=2285 y=430 width=112 height=161 xoffset=7 yoffset=38 xadvance=125 page=0 chnl=15 +char id=201 x=2409 y=430 width=84 height=159 xoffset=9 yoffset=1 xadvance=101 page=0 chnl=15 +char id=202 x=2505 y=430 width=84 height=158 xoffset=9 yoffset=2 xadvance=101 page=0 chnl=15 +char id=205 x=2601 y=430 width=43 height=159 xoffset=9 yoffset=1 xadvance=47 page=0 chnl=15 +char id=209 x=2656 y=430 width=103 height=156 xoffset=9 yoffset=4 xadvance=120 page=0 chnl=15 +char id=211 x=2771 y=430 width=116 height=161 xoffset=7 yoffset=1 xadvance=130 page=0 chnl=15 +char id=212 x=2899 y=430 width=116 height=160 xoffset=7 yoffset=2 xadvance=130 page=0 chnl=15 +char id=214 x=3027 y=430 width=116 height=160 xoffset=7 yoffset=2 xadvance=130 page=0 chnl=15 +char id=215 x=3155 y=430 width=90 height=90 xoffset=12 yoffset=67 xadvance=113 page=0 chnl=15 +char id=218 x=3257 y=430 width=102 height=161 xoffset=9 yoffset=1 xadvance=119 page=0 chnl=15 +char id=220 x=3371 y=430 width=102 height=160 xoffset=9 yoffset=2 xadvance=119 page=0 chnl=15 +char id=223 x=3485 y=430 width=98 height=122 xoffset=9 yoffset=38 xadvance=112 page=0 chnl=15 +char id=224 x=3595 y=430 width=85 height=131 xoffset=4 yoffset=31 xadvance=96 page=0 chnl=15 +char id=225 x=3692 y=430 width=85 height=131 xoffset=4 yoffset=31 xadvance=96 page=0 chnl=15 +char id=226 x=3789 y=430 width=85 height=130 xoffset=4 yoffset=32 xadvance=96 page=0 chnl=15 +char id=227 x=3886 y=430 width=85 height=128 xoffset=4 yoffset=34 xadvance=96 page=0 chnl=15 +char id=228 x=3983 y=430 width=85 height=130 xoffset=4 yoffset=32 xadvance=96 page=0 chnl=15 +char id=231 x=6 y=642 width=89 height=131 xoffset=5 yoffset=68 xadvance=98 page=0 chnl=15 +char id=232 x=107 y=642 width=90 height=131 xoffset=5 yoffset=31 xadvance=99 page=0 chnl=15 +char id=233 x=209 y=642 width=90 height=131 xoffset=5 yoffset=31 xadvance=99 page=0 chnl=15 +char id=234 x=311 y=642 width=90 height=130 xoffset=5 yoffset=32 xadvance=99 page=0 chnl=15 +char id=237 x=413 y=642 width=42 height=129 xoffset=9 yoffset=31 xadvance=46 page=0 chnl=15 +char id=238 x=467 y=642 width=73 height=128 xoffset=-13 yoffset=32 xadvance=46 page=0 chnl=15 +char id=241 x=552 y=642 width=88 height=126 xoffset=9 yoffset=34 xadvance=104 page=0 chnl=15 +char id=243 x=652 y=642 width=92 height=131 xoffset=5 yoffset=31 xadvance=102 page=0 chnl=15 +char id=244 x=756 y=642 width=92 height=130 xoffset=5 yoffset=32 xadvance=102 page=0 chnl=15 +char id=245 x=860 y=642 width=92 height=128 xoffset=5 yoffset=34 xadvance=102 page=0 chnl=15 +char id=246 x=964 y=642 width=92 height=130 xoffset=5 yoffset=32 xadvance=102 page=0 chnl=15 +char id=249 x=1068 y=642 width=87 height=131 xoffset=9 yoffset=31 xadvance=105 page=0 chnl=15 +char id=250 x=1167 y=642 width=87 height=131 xoffset=9 yoffset=31 xadvance=105 page=0 chnl=15 +char id=251 x=1266 y=642 width=87 height=130 xoffset=9 yoffset=32 xadvance=105 page=0 chnl=15 +char id=252 x=1365 y=642 width=87 height=130 xoffset=9 yoffset=32 xadvance=105 page=0 chnl=15 +char id=260 x=1464 y=642 width=123 height=155 xoffset=3 yoffset=39 xadvance=127 page=0 chnl=15 +char id=261 x=1599 y=642 width=87 height=126 xoffset=4 yoffset=68 xadvance=96 page=0 chnl=15 +char id=262 x=1698 y=642 width=112 height=161 xoffset=7 yoffset=1 xadvance=125 page=0 chnl=15 +char id=263 x=1822 y=642 width=89 height=131 xoffset=5 yoffset=31 xadvance=98 page=0 chnl=15 +char id=280 x=1923 y=642 width=87 height=155 xoffset=9 yoffset=39 xadvance=101 page=0 chnl=15 +char id=281 x=2022 y=642 width=90 height=122 xoffset=5 yoffset=68 xadvance=99 page=0 chnl=15 +char id=286 x=2124 y=642 width=112 height=155 xoffset=7 yoffset=7 xadvance=126 page=0 chnl=15 +char id=287 x=2248 y=642 width=92 height=158 xoffset=5 yoffset=37 xadvance=105 page=0 chnl=15 +char id=304 x=2352 y=642 width=31 height=159 xoffset=8 yoffset=1 xadvance=47 page=0 chnl=15 +char id=305 x=2395 y=642 width=29 height=91 xoffset=9 yoffset=69 xadvance=46 page=0 chnl=15 +char id=321 x=2436 y=642 width=94 height=121 xoffset=1 yoffset=39 xadvance=98 page=0 chnl=15 +char id=322 x=2542 y=642 width=51 height=121 xoffset=-2 yoffset=39 xadvance=46 page=0 chnl=15 +char id=323 x=2605 y=642 width=103 height=159 xoffset=9 yoffset=1 xadvance=120 page=0 chnl=15 +char id=324 x=2720 y=642 width=88 height=129 xoffset=9 yoffset=31 xadvance=104 page=0 chnl=15 +char id=339 x=2820 y=642 width=153 height=94 xoffset=5 yoffset=68 xadvance=160 page=0 chnl=15 +char id=346 x=2985 y=642 width=99 height=161 xoffset=5 yoffset=1 xadvance=109 page=0 chnl=15 +char id=347 x=3096 y=642 width=86 height=131 xoffset=5 yoffset=31 xadvance=95 page=0 chnl=15 +char id=350 x=3194 y=642 width=99 height=161 xoffset=5 yoffset=38 xadvance=109 page=0 chnl=15 +char id=351 x=3305 y=642 width=86 height=131 xoffset=5 yoffset=68 xadvance=95 page=0 chnl=15 +char id=377 x=3403 y=642 width=96 height=159 xoffset=8 yoffset=1 xadvance=112 page=0 chnl=15 +char id=378 x=3511 y=642 width=78 height=129 xoffset=9 yoffset=31 xadvance=96 page=0 chnl=15 +char id=379 x=3601 y=642 width=96 height=159 xoffset=8 yoffset=1 xadvance=112 page=0 chnl=15 +char id=380 x=3709 y=642 width=78 height=129 xoffset=9 yoffset=31 xadvance=96 page=0 chnl=15 +char id=1028 x=3799 y=642 width=103 height=124 xoffset=7 yoffset=38 xadvance=117 page=0 chnl=15 +char id=1030 x=3914 y=642 width=30 height=121 xoffset=9 yoffset=39 xadvance=47 page=0 chnl=15 +char id=1040 x=3956 y=642 width=121 height=121 xoffset=3 yoffset=39 xadvance=127 page=0 chnl=15 +char id=1041 x=6 y=854 width=94 height=121 xoffset=9 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1042 x=112 y=854 width=96 height=121 xoffset=9 yoffset=39 xadvance=109 page=0 chnl=15 +char id=1043 x=220 y=854 width=83 height=121 xoffset=9 yoffset=39 xadvance=96 page=0 chnl=15 +char id=1044 x=315 y=854 width=126 height=150 xoffset=3 yoffset=39 xadvance=132 page=0 chnl=15 +char id=1045 x=453 y=854 width=84 height=121 xoffset=9 yoffset=39 xadvance=101 page=0 chnl=15 +char id=1046 x=549 y=854 width=179 height=121 xoffset=4 yoffset=39 xadvance=186 page=0 chnl=15 +char id=1047 x=740 y=854 width=96 height=124 xoffset=7 yoffset=38 xadvance=110 page=0 chnl=15 +char id=1048 x=848 y=854 width=103 height=121 xoffset=9 yoffset=39 xadvance=120 page=0 chnl=15 +char id=1049 x=963 y=854 width=103 height=153 xoffset=9 yoffset=7 xadvance=120 page=0 chnl=15 +char id=1050 x=1078 y=854 width=116 height=121 xoffset=9 yoffset=39 xadvance=126 page=0 chnl=15 +char id=1051 x=1206 y=854 width=110 height=121 xoffset=3 yoffset=39 xadvance=121 page=0 chnl=15 +char id=1052 x=1328 y=854 width=135 height=121 xoffset=9 yoffset=39 xadvance=152 page=0 chnl=15 +char id=1053 x=1475 y=854 width=106 height=121 xoffset=9 yoffset=39 xadvance=123 page=0 chnl=15 +char id=1054 x=1593 y=854 width=116 height=124 xoffset=7 yoffset=38 xadvance=130 page=0 chnl=15 +char id=1055 x=1721 y=854 width=103 height=121 xoffset=13 yoffset=39 xadvance=128 page=0 chnl=15 +char id=1056 x=1836 y=854 width=94 height=121 xoffset=9 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1057 x=1942 y=854 width=112 height=124 xoffset=7 yoffset=38 xadvance=125 page=0 chnl=15 +char id=1058 x=2066 y=854 width=102 height=121 xoffset=5 yoffset=39 xadvance=111 page=0 chnl=15 +char id=1059 x=2180 y=854 width=108 height=123 xoffset=3 yoffset=39 xadvance=113 page=0 chnl=15 +char id=1060 x=2300 y=854 width=132 height=128 xoffset=7 yoffset=37 xadvance=146 page=0 chnl=15 +char id=1061 x=2444 y=854 width=114 height=121 xoffset=4 yoffset=39 xadvance=122 page=0 chnl=15 +char id=1062 x=2570 y=854 width=121 height=150 xoffset=9 yoffset=39 xadvance=133 page=0 chnl=15 +char id=1063 x=2703 y=854 width=100 height=121 xoffset=15 yoffset=39 xadvance=129 page=0 chnl=15 +char id=1064 x=2815 y=854 width=149 height=121 xoffset=15 yoffset=39 xadvance=178 page=0 chnl=15 +char id=1065 x=2976 y=854 width=162 height=150 xoffset=15 yoffset=39 xadvance=180 page=0 chnl=15 +char id=1068 x=3150 y=854 width=94 height=121 xoffset=9 yoffset=39 xadvance=113 page=0 chnl=15 +char id=1070 x=3256 y=854 width=161 height=124 xoffset=9 yoffset=38 xadvance=164 page=0 chnl=15 +char id=1071 x=3429 y=854 width=99 height=121 xoffset=2 yoffset=39 xadvance=109 page=0 chnl=15 +char id=1072 x=3540 y=854 width=85 height=94 xoffset=4 yoffset=68 xadvance=96 page=0 chnl=15 +char id=1073 x=3637 y=854 width=92 height=126 xoffset=5 yoffset=36 xadvance=102 page=0 chnl=15 +char id=1074 x=3741 y=854 width=83 height=91 xoffset=9 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1075 x=3836 y=854 width=64 height=91 xoffset=9 yoffset=69 xadvance=77 page=0 chnl=15 +char id=1076 x=3912 y=854 width=108 height=118 xoffset=2 yoffset=69 xadvance=113 page=0 chnl=15 +char id=1077 x=6 y=1066 width=90 height=94 xoffset=5 yoffset=68 xadvance=99 page=0 chnl=15 +char id=1078 x=108 y=1066 width=142 height=91 xoffset=3 yoffset=69 xadvance=147 page=0 chnl=15 +char id=1079 x=262 y=1066 width=80 height=94 xoffset=4 yoffset=68 xadvance=88 page=0 chnl=15 +char id=1080 x=354 y=1066 width=84 height=91 xoffset=9 yoffset=69 xadvance=101 page=0 chnl=15 +char id=1081 x=450 y=1066 width=84 height=123 xoffset=9 yoffset=37 xadvance=101 page=0 chnl=15 +char id=1082 x=546 y=1066 width=91 height=91 xoffset=9 yoffset=69 xadvance=99 page=0 chnl=15 +char id=1083 x=649 y=1066 width=89 height=91 xoffset=4 yoffset=69 xadvance=100 page=0 chnl=15 +char id=1084 x=750 y=1066 width=111 height=91 xoffset=9 yoffset=69 xadvance=127 page=0 chnl=15 +char id=1085 x=873 y=1066 width=81 height=91 xoffset=9 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1086 x=966 y=1066 width=92 height=94 xoffset=5 yoffset=68 xadvance=102 page=0 chnl=15 +char id=1087 x=1070 y=1066 width=82 height=91 xoffset=9 yoffset=69 xadvance=99 page=0 chnl=15 +char id=1088 x=1164 y=1066 width=91 height=126 xoffset=9 yoffset=68 xadvance=105 page=0 chnl=15 +char id=1089 x=1267 y=1066 width=89 height=94 xoffset=5 yoffset=68 xadvance=98 page=0 chnl=15 +char id=1090 x=1368 y=1066 width=86 height=91 xoffset=4 yoffset=69 xadvance=93 page=0 chnl=15 +char id=1091 x=1466 y=1066 width=96 height=125 xoffset=1 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1092 x=1574 y=1066 width=127 height=152 xoffset=5 yoffset=39 xadvance=137 page=0 chnl=15 +char id=1093 x=1713 y=1066 width=91 height=91 xoffset=3 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1094 x=1816 y=1066 width=110 height=120 xoffset=9 yoffset=69 xadvance=122 page=0 chnl=15 +char id=1095 x=1938 y=1066 width=82 height=91 xoffset=9 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1096 x=2032 y=1066 width=127 height=91 xoffset=9 yoffset=69 xadvance=144 page=0 chnl=15 +char id=1097 x=2171 y=1066 width=148 height=117 xoffset=9 yoffset=69 xadvance=161 page=0 chnl=15 +char id=1100 x=2331 y=1066 width=85 height=91 xoffset=9 yoffset=69 xadvance=99 page=0 chnl=15 +char id=1102 x=2428 y=1066 width=129 height=94 xoffset=4 yoffset=68 xadvance=138 page=0 chnl=15 +char id=1103 x=2569 y=1066 width=84 height=91 xoffset=5 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1108 x=2665 y=1066 width=87 height=94 xoffset=6 yoffset=68 xadvance=98 page=0 chnl=15 +char id=1110 x=2764 y=1066 width=31 height=129 xoffset=8 yoffset=31 xadvance=46 page=0 chnl=15 +char id=1111 x=2807 y=1066 width=65 height=128 xoffset=-9 yoffset=32 xadvance=46 page=0 chnl=15 +char id=8209 x=2884 y=1066 width=57 height=23 xoffset=15 yoffset=100 xadvance=82 page=0 chnl=15 +char id=8211 x=2953 y=1066 width=83 height=23 xoffset=0 yoffset=100 xadvance=82 page=0 chnl=15 +char id=8212 x=3048 y=1066 width=166 height=23 xoffset=0 yoffset=100 xadvance=165 page=0 chnl=15 +char id=8217 x=3226 y=1066 width=28 height=45 xoffset=5 yoffset=39 xadvance=40 page=0 chnl=15 +char id=8220 x=3266 y=1066 width=58 height=45 xoffset=9 yoffset=33 xadvance=71 page=0 chnl=15 +char id=8221 x=3336 y=1066 width=58 height=45 xoffset=5 yoffset=39 xadvance=71 page=0 chnl=15 +char id=8222 x=3406 y=1066 width=57 height=45 xoffset=5 yoffset=144 xadvance=71 page=0 chnl=15 +char id=8226 x=3475 y=1066 width=53 height=52 xoffset=9 yoffset=86 xadvance=71 page=0 chnl=15 +char id=8364 x=3540 y=1066 width=102 height=124 xoffset=4 yoffset=38 xadvance=114 page=0 chnl=15 +char id=8627 x=3654 y=1066 width=137 height=110 xoffset=16 yoffset=39 xadvance=169 page=0 chnl=15 +char id=8679 x=3803 y=1066 width=163 height=130 xoffset=12 yoffset=30 xadvance=187 page=0 chnl=15 +char id=9003 x=6 y=1278 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=191 y=1278 width=107 height=41 xoffset=11 yoffset=148 xadvance=128 page=0 chnl=15 +char id=9654 x=310 y=1278 width=134 height=152 xoffset=17 yoffset=24 xadvance=160 page=0 chnl=15 +char id=9664 x=456 y=1278 width=134 height=152 xoffset=9 yoffset=24 xadvance=160 page=0 chnl=15 +char id=9675 x=602 y=1278 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=739 y=1278 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=876 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=888 y=1278 width=124 height=98 xoffset=15 yoffset=58 xadvance=145 page=0 chnl=15 +char id=10004 x=1024 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=1036 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=1048 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=1060 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=1072 y=1278 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.png b/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.png new file mode 100644 index 000000000..373cd30e3 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.ttf b/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.ttf new file mode 100644 index 000000000..7f16a0f0f Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-ExtraBold.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.fnt b/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.fnt new file mode 100644 index 000000000..37849a878 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.fnt @@ -0,0 +1,254 @@ +info face="Inter-ExtraLight" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-ExtraLight.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=46 height=200 xoffset=0 yoffset=0 xadvance=46 page=0 chnl=15 +char id=33 x=76 y=6 width=14 height=122 xoffset=15 yoffset=39 xadvance=44 page=0 chnl=15 +char id=34 x=102 y=6 width=33 height=40 xoffset=13 yoffset=39 xadvance=59 page=0 chnl=15 +char id=35 x=147 y=6 width=99 height=121 xoffset=3 yoffset=39 xadvance=104 page=0 chnl=15 +char id=36 x=258 y=6 width=81 height=152 xoffset=11 yoffset=24 xadvance=102 page=0 chnl=15 +char id=37 x=351 y=6 width=104 height=124 xoffset=13 yoffset=38 xadvance=129 page=0 chnl=15 +char id=38 x=467 y=6 width=88 height=124 xoffset=9 yoffset=38 xadvance=99 page=0 chnl=15 +char id=39 x=567 y=6 width=8 height=40 xoffset=13 yoffset=39 xadvance=34 page=0 chnl=15 +char id=40 x=587 y=6 width=27 height=151 xoffset=18 yoffset=34 xadvance=54 page=0 chnl=15 +char id=41 x=626 y=6 width=26 height=151 xoffset=10 yoffset=34 xadvance=54 page=0 chnl=15 +char id=42 x=664 y=6 width=63 height=69 xoffset=10 yoffset=39 xadvance=82 page=0 chnl=15 +char id=43 x=739 y=6 width=72 height=72 xoffset=17 yoffset=77 xadvance=106 page=0 chnl=15 +char id=44 x=823 y=6 width=16 height=47 xoffset=13 yoffset=143 xadvance=43 page=0 chnl=15 +char id=45 x=851 y=6 width=48 height=7 xoffset=13 yoffset=105 xadvance=73 page=0 chnl=15 +char id=46 x=911 y=6 width=13 height=13 xoffset=15 yoffset=148 xadvance=43 page=0 chnl=15 +char id=47 x=936 y=6 width=47 height=145 xoffset=4 yoffset=34 xadvance=55 page=0 chnl=15 +char id=48 x=995 y=6 width=78 height=124 xoffset=11 yoffset=38 xadvance=99 page=0 chnl=15 +char id=49 x=1085 y=6 width=36 height=121 xoffset=11 yoffset=39 xadvance=70 page=0 chnl=15 +char id=50 x=1133 y=6 width=74 height=122 xoffset=14 yoffset=38 xadvance=101 page=0 chnl=15 +char id=51 x=1219 y=6 width=76 height=124 xoffset=14 yoffset=38 xadvance=102 page=0 chnl=15 +char id=52 x=1307 y=6 width=79 height=121 xoffset=11 yoffset=39 xadvance=100 page=0 chnl=15 +char id=53 x=1398 y=6 width=72 height=123 xoffset=13 yoffset=39 xadvance=96 page=0 chnl=15 +char id=54 x=1482 y=6 width=75 height=124 xoffset=12 yoffset=38 xadvance=98 page=0 chnl=15 +char id=55 x=1569 y=6 width=73 height=121 xoffset=9 yoffset=39 xadvance=91 page=0 chnl=15 +char id=56 x=1654 y=6 width=78 height=124 xoffset=11 yoffset=38 xadvance=100 page=0 chnl=15 +char id=57 x=1744 y=6 width=75 height=125 xoffset=12 yoffset=37 xadvance=98 page=0 chnl=15 +char id=58 x=1831 y=6 width=13 height=77 xoffset=15 yoffset=78 xadvance=43 page=0 chnl=15 +char id=59 x=1856 y=6 width=17 height=112 xoffset=13 yoffset=78 xadvance=43 page=0 chnl=15 +char id=60 x=1885 y=6 width=69 height=88 xoffset=19 yoffset=69 xadvance=106 page=0 chnl=15 +char id=61 x=1966 y=6 width=62 height=40 xoffset=22 yoffset=93 xadvance=106 page=0 chnl=15 +char id=62 x=2040 y=6 width=69 height=88 xoffset=19 yoffset=69 xadvance=106 page=0 chnl=15 +char id=63 x=2121 y=6 width=65 height=123 xoffset=7 yoffset=38 xadvance=80 page=0 chnl=15 +char id=64 x=2198 y=6 width=139 height=148 xoffset=8 yoffset=44 xadvance=154 page=0 chnl=15 +char id=65 x=2349 y=6 width=97 height=121 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15 +char id=66 x=2458 y=6 width=78 height=121 xoffset=17 yoffset=39 xadvance=106 page=0 chnl=15 +char id=67 x=2548 y=6 width=98 height=124 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15 +char id=68 x=2658 y=6 width=91 height=121 xoffset=17 yoffset=39 xadvance=118 page=0 chnl=15 +char id=69 x=2761 y=6 width=69 height=121 xoffset=17 yoffset=39 xadvance=97 page=0 chnl=15 +char id=70 x=2842 y=6 width=68 height=121 xoffset=17 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=2922 y=6 width=99 height=124 xoffset=11 yoffset=38 xadvance=122 page=0 chnl=15 +char id=72 x=3033 y=6 width=88 height=121 xoffset=17 yoffset=39 xadvance=121 page=0 chnl=15 +char id=73 x=3133 y=6 width=8 height=121 xoffset=17 yoffset=39 xadvance=42 page=0 chnl=15 +char id=74 x=3153 y=6 width=62 height=123 xoffset=8 yoffset=39 xadvance=87 page=0 chnl=15 +char id=75 x=3227 y=6 width=82 height=121 xoffset=17 yoffset=39 xadvance=103 page=0 chnl=15 +char id=76 x=3321 y=6 width=67 height=121 xoffset=17 yoffset=39 xadvance=92 page=0 chnl=15 +char id=77 x=3400 y=6 width=110 height=121 xoffset=17 yoffset=39 xadvance=144 page=0 chnl=15 +char id=78 x=3522 y=6 width=93 height=121 xoffset=17 yoffset=39 xadvance=126 page=0 chnl=15 +char id=79 x=3627 y=6 width=102 height=124 xoffset=11 yoffset=38 xadvance=124 page=0 chnl=15 +char id=80 x=3741 y=6 width=75 height=121 xoffset=17 yoffset=39 xadvance=101 page=0 chnl=15 +char id=81 x=3828 y=6 width=102 height=134 xoffset=11 yoffset=38 xadvance=124 page=0 chnl=15 +char id=82 x=3942 y=6 width=80 height=121 xoffset=17 yoffset=39 xadvance=102 page=0 chnl=15 +char id=83 x=6 y=218 width=81 height=125 xoffset=11 yoffset=37 xadvance=102 page=0 chnl=15 +char id=84 x=99 y=218 width=85 height=121 xoffset=9 yoffset=39 xadvance=102 page=0 chnl=15 +char id=85 x=196 y=218 width=90 height=123 xoffset=17 yoffset=39 xadvance=123 page=0 chnl=15 +char id=86 x=298 y=218 width=97 height=121 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15 +char id=87 x=407 y=218 width=143 height=121 xoffset=4 yoffset=39 xadvance=150 page=0 chnl=15 +char id=88 x=562 y=218 width=90 height=121 xoffset=5 yoffset=39 xadvance=99 page=0 chnl=15 +char id=89 x=664 y=218 width=95 height=121 xoffset=5 yoffset=39 xadvance=104 page=0 chnl=15 +char id=90 x=771 y=218 width=79 height=121 xoffset=11 yoffset=39 xadvance=101 page=0 chnl=15 +char id=91 x=862 y=218 width=26 height=151 xoffset=20 yoffset=34 xadvance=54 page=0 chnl=15 +char id=92 x=900 y=218 width=47 height=145 xoffset=4 yoffset=34 xadvance=55 page=0 chnl=15 +char id=93 x=959 y=218 width=26 height=151 xoffset=9 yoffset=34 xadvance=54 page=0 chnl=15 +char id=94 x=997 y=218 width=56 height=52 xoffset=7 yoffset=43 xadvance=69 page=0 chnl=15 +char id=95 x=1065 y=218 width=74 height=7 xoffset=-1 yoffset=160 xadvance=71 page=0 chnl=15 +char id=96 x=1151 y=218 width=25 height=27 xoffset=28 yoffset=31 xadvance=82 page=0 chnl=15 +char id=97 x=1188 y=218 width=66 height=94 xoffset=10 yoffset=68 xadvance=90 page=0 chnl=15 +char id=98 x=1266 y=218 width=74 height=123 xoffset=17 yoffset=39 xadvance=100 page=0 chnl=15 +char id=99 x=1352 y=218 width=74 height=94 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=100 x=1438 y=218 width=74 height=123 xoffset=9 yoffset=39 xadvance=100 page=0 chnl=15 +char id=101 x=1524 y=218 width=77 height=94 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15 +char id=102 x=1613 y=218 width=46 height=125 xoffset=8 yoffset=35 xadvance=56 page=0 chnl=15 +char id=103 x=1671 y=218 width=74 height=128 xoffset=9 yoffset=68 xadvance=97 page=0 chnl=15 +char id=104 x=1757 y=218 width=67 height=121 xoffset=14 yoffset=39 xadvance=95 page=0 chnl=15 +char id=105 x=1836 y=218 width=13 height=118 xoffset=12 yoffset=42 xadvance=37 page=0 chnl=15 +char id=106 x=1861 y=218 width=28 height=152 xoffset=-3 yoffset=42 xadvance=37 page=0 chnl=15 +char id=107 x=1901 y=218 width=66 height=121 xoffset=14 yoffset=39 xadvance=83 page=0 chnl=15 +char id=108 x=1979 y=218 width=9 height=121 xoffset=14 yoffset=39 xadvance=36 page=0 chnl=15 +char id=109 x=2000 y=218 width=112 height=92 xoffset=14 yoffset=68 xadvance=139 page=0 chnl=15 +char id=110 x=2124 y=218 width=66 height=92 xoffset=14 yoffset=68 xadvance=94 page=0 chnl=15 +char id=111 x=2202 y=218 width=78 height=94 xoffset=9 yoffset=68 xadvance=96 page=0 chnl=15 +char id=112 x=2292 y=218 width=74 height=126 xoffset=14 yoffset=68 xadvance=97 page=0 chnl=15 +char id=113 x=2378 y=218 width=74 height=126 xoffset=9 yoffset=68 xadvance=97 page=0 chnl=15 +char id=114 x=2464 y=218 width=38 height=92 xoffset=14 yoffset=68 xadvance=56 page=0 chnl=15 +char id=115 x=2514 y=218 width=64 height=94 xoffset=10 yoffset=68 xadvance=83 page=0 chnl=15 +char id=116 x=2590 y=218 width=44 height=114 xoffset=7 yoffset=48 xadvance=58 page=0 chnl=15 +char id=117 x=2646 y=218 width=66 height=93 xoffset=14 yoffset=69 xadvance=94 page=0 chnl=15 +char id=118 x=2724 y=218 width=74 height=91 xoffset=7 yoffset=69 xadvance=88 page=0 chnl=15 +char id=119 x=2810 y=218 width=118 height=91 xoffset=7 yoffset=69 xadvance=131 page=0 chnl=15 +char id=120 x=2940 y=218 width=67 height=91 xoffset=9 yoffset=69 xadvance=84 page=0 chnl=15 +char id=121 x=3019 y=218 width=74 height=125 xoffset=7 yoffset=69 xadvance=88 page=0 chnl=15 +char id=122 x=3105 y=218 width=66 height=91 xoffset=11 yoffset=69 xadvance=85 page=0 chnl=15 +char id=123 x=3183 y=218 width=43 height=151 xoffset=9 yoffset=34 xadvance=54 page=0 chnl=15 +char id=124 x=3238 y=218 width=8 height=198 xoffset=20 yoffset=1 xadvance=48 page=0 chnl=15 +char id=125 x=3258 y=218 width=43 height=151 xoffset=3 yoffset=34 xadvance=54 page=0 chnl=15 +char id=126 x=3313 y=218 width=78 height=23 xoffset=14 yoffset=101 xadvance=106 page=0 chnl=15 +char id=161 x=3403 y=218 width=14 height=122 xoffset=15 yoffset=69 xadvance=44 page=0 chnl=15 +char id=163 x=3429 y=218 width=79 height=122 xoffset=12 yoffset=38 xadvance=104 page=0 chnl=15 +char id=165 x=3520 y=218 width=82 height=121 xoffset=3 yoffset=39 xadvance=87 page=0 chnl=15 +char id=167 x=3614 y=218 width=69 height=147 xoffset=10 yoffset=38 xadvance=88 page=0 chnl=15 +char id=171 x=3695 y=218 width=62 height=73 xoffset=12 yoffset=75 xadvance=87 page=0 chnl=15 +char id=176 x=3769 y=218 width=51 height=51 xoffset=12 yoffset=38 xadvance=75 page=0 chnl=15 +char id=187 x=3832 y=218 width=63 height=73 xoffset=13 yoffset=75 xadvance=88 page=0 chnl=15 +char id=191 x=3907 y=218 width=66 height=124 xoffset=8 yoffset=68 xadvance=80 page=0 chnl=15 +char id=192 x=3985 y=218 width=97 height=159 xoffset=4 yoffset=1 xadvance=105 page=0 chnl=15 +char id=193 x=6 y=430 width=97 height=159 xoffset=4 yoffset=1 xadvance=105 page=0 chnl=15 +char id=195 x=115 y=430 width=97 height=152 xoffset=4 yoffset=8 xadvance=105 page=0 chnl=15 +char id=196 x=224 y=430 width=97 height=148 xoffset=4 yoffset=12 xadvance=105 page=0 chnl=15 +char id=199 x=333 y=430 width=98 height=155 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15 +char id=201 x=443 y=430 width=69 height=159 xoffset=17 yoffset=1 xadvance=97 page=0 chnl=15 +char id=202 x=524 y=430 width=69 height=154 xoffset=17 yoffset=6 xadvance=97 page=0 chnl=15 +char id=205 x=605 y=430 width=25 height=159 xoffset=17 yoffset=1 xadvance=42 page=0 chnl=15 +char id=209 x=642 y=430 width=93 height=150 xoffset=17 yoffset=10 xadvance=126 page=0 chnl=15 +char id=211 x=747 y=430 width=102 height=161 xoffset=11 yoffset=1 xadvance=124 page=0 chnl=15 +char id=212 x=861 y=430 width=102 height=156 xoffset=11 yoffset=6 xadvance=124 page=0 chnl=15 +char id=214 x=975 y=430 width=102 height=150 xoffset=11 yoffset=12 xadvance=124 page=0 chnl=15 +char id=215 x=1089 y=430 width=72 height=72 xoffset=17 yoffset=77 xadvance=106 page=0 chnl=15 +char id=218 x=1173 y=430 width=90 height=161 xoffset=17 yoffset=1 xadvance=123 page=0 chnl=15 +char id=220 x=1275 y=430 width=90 height=150 xoffset=17 yoffset=12 xadvance=123 page=0 chnl=15 +char id=223 x=1377 y=430 width=69 height=122 xoffset=17 yoffset=38 xadvance=96 page=0 chnl=15 +char id=224 x=1458 y=430 width=66 height=131 xoffset=10 yoffset=31 xadvance=90 page=0 chnl=15 +char id=225 x=1536 y=430 width=66 height=131 xoffset=10 yoffset=31 xadvance=90 page=0 chnl=15 +char id=226 x=1614 y=430 width=66 height=126 xoffset=10 yoffset=36 xadvance=90 page=0 chnl=15 +char id=227 x=1692 y=430 width=66 height=122 xoffset=10 yoffset=40 xadvance=90 page=0 chnl=15 +char id=228 x=1770 y=430 width=66 height=120 xoffset=10 yoffset=42 xadvance=90 page=0 chnl=15 +char id=231 x=1848 y=430 width=74 height=124 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=232 x=1934 y=430 width=77 height=131 xoffset=9 yoffset=31 xadvance=95 page=0 chnl=15 +char id=233 x=2023 y=430 width=77 height=131 xoffset=9 yoffset=31 xadvance=95 page=0 chnl=15 +char id=234 x=2112 y=430 width=77 height=126 xoffset=9 yoffset=36 xadvance=95 page=0 chnl=15 +char id=237 x=2201 y=430 width=25 height=129 xoffset=15 yoffset=31 xadvance=37 page=0 chnl=15 +char id=238 x=2238 y=430 width=47 height=124 xoffset=-5 yoffset=36 xadvance=37 page=0 chnl=15 +char id=241 x=2297 y=430 width=66 height=120 xoffset=14 yoffset=40 xadvance=94 page=0 chnl=15 +char id=243 x=2375 y=430 width=78 height=131 xoffset=9 yoffset=31 xadvance=96 page=0 chnl=15 +char id=244 x=2465 y=430 width=78 height=126 xoffset=9 yoffset=36 xadvance=96 page=0 chnl=15 +char id=245 x=2555 y=430 width=78 height=122 xoffset=9 yoffset=40 xadvance=96 page=0 chnl=15 +char id=246 x=2645 y=430 width=78 height=120 xoffset=9 yoffset=42 xadvance=96 page=0 chnl=15 +char id=249 x=2735 y=430 width=66 height=131 xoffset=14 yoffset=31 xadvance=94 page=0 chnl=15 +char id=250 x=2813 y=430 width=66 height=131 xoffset=14 yoffset=31 xadvance=94 page=0 chnl=15 +char id=251 x=2891 y=430 width=66 height=126 xoffset=14 yoffset=36 xadvance=94 page=0 chnl=15 +char id=252 x=2969 y=430 width=66 height=120 xoffset=14 yoffset=42 xadvance=94 page=0 chnl=15 +char id=260 x=3047 y=430 width=102 height=157 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15 +char id=261 x=3161 y=430 width=72 height=128 xoffset=10 yoffset=68 xadvance=90 page=0 chnl=15 +char id=262 x=3245 y=430 width=98 height=161 xoffset=11 yoffset=1 xadvance=119 page=0 chnl=15 +char id=263 x=3355 y=430 width=74 height=131 xoffset=9 yoffset=31 xadvance=91 page=0 chnl=15 +char id=280 x=3441 y=430 width=75 height=157 xoffset=17 yoffset=39 xadvance=97 page=0 chnl=15 +char id=281 x=3528 y=430 width=77 height=128 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15 +char id=286 x=3617 y=430 width=99 height=153 xoffset=11 yoffset=9 xadvance=122 page=0 chnl=15 +char id=287 x=3728 y=430 width=74 height=157 xoffset=9 yoffset=39 xadvance=97 page=0 chnl=15 +char id=304 x=3814 y=430 width=12 height=148 xoffset=15 yoffset=12 xadvance=42 page=0 chnl=15 +char id=305 x=3838 y=430 width=8 height=91 xoffset=15 yoffset=69 xadvance=37 page=0 chnl=15 +char id=321 x=3858 y=430 width=79 height=121 xoffset=1 yoffset=39 xadvance=90 page=0 chnl=15 +char id=322 x=3949 y=430 width=35 height=121 xoffset=0 yoffset=39 xadvance=34 page=0 chnl=15 +char id=323 x=6 y=642 width=93 height=159 xoffset=17 yoffset=1 xadvance=126 page=0 chnl=15 +char id=324 x=111 y=642 width=66 height=129 xoffset=14 yoffset=31 xadvance=94 page=0 chnl=15 +char id=339 x=189 y=642 width=147 height=94 xoffset=9 yoffset=68 xadvance=165 page=0 chnl=15 +char id=346 x=348 y=642 width=81 height=161 xoffset=11 yoffset=1 xadvance=102 page=0 chnl=15 +char id=347 x=441 y=642 width=64 height=131 xoffset=10 yoffset=31 xadvance=83 page=0 chnl=15 +char id=350 x=517 y=642 width=81 height=155 xoffset=11 yoffset=37 xadvance=102 page=0 chnl=15 +char id=351 x=610 y=642 width=64 height=124 xoffset=10 yoffset=68 xadvance=83 page=0 chnl=15 +char id=377 x=686 y=642 width=79 height=159 xoffset=11 yoffset=1 xadvance=101 page=0 chnl=15 +char id=378 x=777 y=642 width=66 height=129 xoffset=11 yoffset=31 xadvance=85 page=0 chnl=15 +char id=379 x=855 y=642 width=79 height=148 xoffset=11 yoffset=12 xadvance=101 page=0 chnl=15 +char id=380 x=946 y=642 width=66 height=118 xoffset=11 yoffset=42 xadvance=85 page=0 chnl=15 +char id=1028 x=1024 y=642 width=81 height=52 xoffset=13 yoffset=74 xadvance=107 page=0 chnl=15 +char id=1030 x=1117 y=642 width=8 height=121 xoffset=17 yoffset=39 xadvance=42 page=0 chnl=15 +char id=1040 x=1137 y=642 width=97 height=121 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15 +char id=1041 x=1246 y=642 width=82 height=121 xoffset=17 yoffset=39 xadvance=109 page=0 chnl=15 +char id=1042 x=1340 y=642 width=78 height=121 xoffset=17 yoffset=39 xadvance=106 page=0 chnl=15 +char id=1043 x=1430 y=642 width=69 height=121 xoffset=17 yoffset=39 xadvance=94 page=0 chnl=15 +char id=1044 x=1511 y=642 width=108 height=151 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15 +char id=1045 x=1631 y=642 width=69 height=121 xoffset=17 yoffset=39 xadvance=97 page=0 chnl=15 +char id=1046 x=1712 y=642 width=140 height=121 xoffset=1 yoffset=39 xadvance=141 page=0 chnl=15 +char id=1047 x=1864 y=642 width=76 height=124 xoffset=14 yoffset=38 xadvance=102 page=0 chnl=15 +char id=1048 x=1952 y=642 width=93 height=121 xoffset=17 yoffset=39 xadvance=126 page=0 chnl=15 +char id=1049 x=2057 y=642 width=93 height=151 xoffset=17 yoffset=9 xadvance=126 page=0 chnl=15 +char id=1050 x=2162 y=642 width=78 height=121 xoffset=17 yoffset=39 xadvance=100 page=0 chnl=15 +char id=1051 x=2252 y=642 width=96 height=121 xoffset=4 yoffset=39 xadvance=116 page=0 chnl=15 +char id=1052 x=2360 y=642 width=110 height=121 xoffset=17 yoffset=39 xadvance=144 page=0 chnl=15 +char id=1053 x=2482 y=642 width=88 height=121 xoffset=17 yoffset=39 xadvance=121 page=0 chnl=15 +char id=1054 x=2582 y=642 width=102 height=124 xoffset=11 yoffset=38 xadvance=124 page=0 chnl=15 +char id=1055 x=2696 y=642 width=85 height=121 xoffset=15 yoffset=39 xadvance=114 page=0 chnl=15 +char id=1056 x=2793 y=642 width=75 height=121 xoffset=17 yoffset=39 xadvance=101 page=0 chnl=15 +char id=1057 x=2880 y=642 width=98 height=124 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15 +char id=1058 x=2990 y=642 width=85 height=121 xoffset=9 yoffset=39 xadvance=102 page=0 chnl=15 +char id=1059 x=3087 y=642 width=88 height=123 xoffset=5 yoffset=39 xadvance=97 page=0 chnl=15 +char id=1060 x=3187 y=642 width=102 height=128 xoffset=11 yoffset=37 xadvance=123 page=0 chnl=15 +char id=1061 x=3301 y=642 width=90 height=121 xoffset=5 yoffset=39 xadvance=99 page=0 chnl=15 +char id=1062 x=3403 y=642 width=93 height=150 xoffset=17 yoffset=39 xadvance=116 page=0 chnl=15 +char id=1063 x=3508 y=642 width=82 height=121 xoffset=16 yoffset=39 xadvance=114 page=0 chnl=15 +char id=1064 x=3602 y=642 width=119 height=121 xoffset=17 yoffset=39 xadvance=152 page=0 chnl=15 +char id=1065 x=3733 y=642 width=127 height=150 xoffset=17 yoffset=39 xadvance=151 page=0 chnl=15 +char id=1068 x=3872 y=642 width=82 height=121 xoffset=17 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1070 x=6 y=854 width=135 height=124 xoffset=17 yoffset=38 xadvance=168 page=0 chnl=15 +char id=1071 x=153 y=854 width=80 height=121 xoffset=6 yoffset=39 xadvance=102 page=0 chnl=15 +char id=1072 x=245 y=854 width=66 height=94 xoffset=10 yoffset=68 xadvance=90 page=0 chnl=15 +char id=1073 x=323 y=854 width=77 height=126 xoffset=9 yoffset=36 xadvance=95 page=0 chnl=15 +char id=1074 x=412 y=854 width=68 height=91 xoffset=14 yoffset=69 xadvance=91 page=0 chnl=15 +char id=1075 x=492 y=854 width=53 height=91 xoffset=14 yoffset=69 xadvance=75 page=0 chnl=15 +char id=1076 x=557 y=854 width=89 height=117 xoffset=3 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1077 x=658 y=854 width=77 height=94 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15 +char id=1078 x=747 y=854 width=115 height=91 xoffset=9 yoffset=69 xadvance=132 page=0 chnl=15 +char id=1079 x=874 y=854 width=65 height=94 xoffset=8 yoffset=68 xadvance=80 page=0 chnl=15 +char id=1080 x=951 y=854 width=69 height=91 xoffset=14 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1081 x=1032 y=854 width=69 height=121 xoffset=14 yoffset=39 xadvance=97 page=0 chnl=15 +char id=1082 x=1113 y=854 width=64 height=91 xoffset=14 yoffset=69 xadvance=81 page=0 chnl=15 +char id=1083 x=1189 y=854 width=77 height=91 xoffset=5 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1084 x=1278 y=854 width=91 height=91 xoffset=14 yoffset=69 xadvance=120 page=0 chnl=15 +char id=1085 x=1381 y=854 width=68 height=91 xoffset=14 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1086 x=1461 y=854 width=78 height=94 xoffset=9 yoffset=68 xadvance=96 page=0 chnl=15 +char id=1087 x=1551 y=854 width=66 height=91 xoffset=15 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1088 x=1629 y=854 width=74 height=126 xoffset=14 yoffset=68 xadvance=97 page=0 chnl=15 +char id=1089 x=1715 y=854 width=74 height=94 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=1090 x=1801 y=854 width=68 height=91 xoffset=9 yoffset=69 xadvance=85 page=0 chnl=15 +char id=1091 x=1881 y=854 width=74 height=125 xoffset=7 yoffset=69 xadvance=88 page=0 chnl=15 +char id=1092 x=1967 y=854 width=98 height=152 xoffset=9 yoffset=39 xadvance=116 page=0 chnl=15 +char id=1093 x=2077 y=854 width=67 height=91 xoffset=9 yoffset=69 xadvance=84 page=0 chnl=15 +char id=1094 x=2156 y=854 width=73 height=121 xoffset=15 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1095 x=2241 y=854 width=65 height=91 xoffset=14 yoffset=69 xadvance=93 page=0 chnl=15 +char id=1096 x=2318 y=854 width=102 height=91 xoffset=14 yoffset=69 xadvance=131 page=0 chnl=15 +char id=1097 x=2432 y=854 width=111 height=117 xoffset=14 yoffset=69 xadvance=132 page=0 chnl=15 +char id=1100 x=2555 y=854 width=65 height=91 xoffset=14 yoffset=69 xadvance=87 page=0 chnl=15 +char id=1102 x=2632 y=854 width=115 height=94 xoffset=6 yoffset=68 xadvance=132 page=0 chnl=15 +char id=1103 x=2759 y=854 width=69 height=91 xoffset=7 yoffset=69 xadvance=91 page=0 chnl=15 +char id=1108 x=2840 y=854 width=71 height=94 xoffset=2 yoffset=68 xadvance=80 page=0 chnl=15 +char id=1110 x=2923 y=854 width=13 height=118 xoffset=12 yoffset=42 xadvance=37 page=0 chnl=15 +char id=1111 x=2948 y=854 width=38 height=118 xoffset=0 yoffset=42 xadvance=37 page=0 chnl=15 +char id=8209 x=2998 y=854 width=48 height=7 xoffset=-2 yoffset=105 xadvance=47 page=0 chnl=15 +char id=8211 x=3058 y=854 width=83 height=7 xoffset=0 yoffset=105 xadvance=82 page=0 chnl=15 +char id=8212 x=3153 y=854 width=166 height=7 xoffset=0 yoffset=105 xadvance=165 page=0 chnl=15 +char id=8217 x=3331 y=854 width=19 height=41 xoffset=3 yoffset=39 xadvance=27 page=0 chnl=15 +char id=8220 x=3362 y=854 width=44 height=41 xoffset=8 yoffset=37 xadvance=54 page=0 chnl=15 +char id=8221 x=3418 y=854 width=44 height=41 xoffset=3 yoffset=39 xadvance=54 page=0 chnl=15 +char id=8222 x=3474 y=854 width=44 height=42 xoffset=3 yoffset=144 xadvance=54 page=0 chnl=15 +char id=8226 x=3530 y=854 width=39 height=38 xoffset=27 yoffset=93 xadvance=92 page=0 chnl=15 +char id=8364 x=3581 y=854 width=95 height=124 xoffset=5 yoffset=38 xadvance=111 page=0 chnl=15 +char id=8627 x=3688 y=854 width=125 height=100 xoffset=16 yoffset=39 xadvance=156 page=0 chnl=15 +char id=8679 x=3825 y=854 width=122 height=130 xoffset=15 yoffset=30 xadvance=151 page=0 chnl=15 +char id=9003 x=6 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=191 y=1066 width=36 height=34 xoffset=39 yoffset=148 xadvance=114 page=0 chnl=15 +char id=9654 x=239 y=1066 width=126 height=152 xoffset=14 yoffset=24 xadvance=146 page=0 chnl=15 +char id=9664 x=377 y=1066 width=126 height=152 xoffset=7 yoffset=24 xadvance=146 page=0 chnl=15 +char id=9675 x=515 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=652 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=789 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=801 y=1066 width=110 height=77 xoffset=18 yoffset=65 xadvance=145 page=0 chnl=15 +char id=10004 x=923 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=935 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=947 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=959 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=971 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.png b/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.png new file mode 100644 index 000000000..9947e0f0b Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.ttf b/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.ttf new file mode 100644 index 000000000..69426a3eb Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-ExtraLight.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Light.fnt b/iqpilot/selfdrive/assets/fonts/Inter-Light.fnt new file mode 100644 index 000000000..24373df21 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-Light.fnt @@ -0,0 +1,254 @@ +info face="Inter-Light" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-Light.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=46 height=200 xoffset=0 yoffset=0 xadvance=46 page=0 chnl=15 +char id=33 x=76 y=6 width=17 height=122 xoffset=14 yoffset=39 xadvance=45 page=0 chnl=15 +char id=34 x=105 y=6 width=39 height=41 xoffset=12 yoffset=39 xadvance=63 page=0 chnl=15 +char id=35 x=156 y=6 width=99 height=121 xoffset=3 yoffset=39 xadvance=104 page=0 chnl=15 +char id=36 x=267 y=6 width=84 height=152 xoffset=10 yoffset=24 xadvance=103 page=0 chnl=15 +char id=37 x=363 y=6 width=106 height=124 xoffset=13 yoffset=38 xadvance=132 page=0 chnl=15 +char id=38 x=481 y=6 width=91 height=124 xoffset=9 yoffset=38 xadvance=102 page=0 chnl=15 +char id=39 x=584 y=6 width=11 height=41 xoffset=12 yoffset=39 xadvance=35 page=0 chnl=15 +char id=40 x=607 y=6 width=31 height=151 xoffset=18 yoffset=34 xadvance=57 page=0 chnl=15 +char id=41 x=650 y=6 width=32 height=151 xoffset=8 yoffset=34 xadvance=57 page=0 chnl=15 +char id=42 x=694 y=6 width=64 height=69 xoffset=9 yoffset=39 xadvance=82 page=0 chnl=15 +char id=43 x=770 y=6 width=76 height=76 xoffset=16 yoffset=75 xadvance=107 page=0 chnl=15 +char id=44 x=858 y=6 width=20 height=47 xoffset=12 yoffset=143 xadvance=44 page=0 chnl=15 +char id=45 x=890 y=6 width=51 height=11 xoffset=12 yoffset=103 xadvance=74 page=0 chnl=15 +char id=46 x=953 y=6 width=18 height=18 xoffset=13 yoffset=143 xadvance=44 page=0 chnl=15 +char id=47 x=983 y=6 width=49 height=145 xoffset=4 yoffset=34 xadvance=57 page=0 chnl=15 +char id=48 x=1044 y=6 width=81 height=124 xoffset=10 yoffset=38 xadvance=101 page=0 chnl=15 +char id=49 x=1137 y=6 width=41 height=121 xoffset=10 yoffset=39 xadvance=73 page=0 chnl=15 +char id=50 x=1190 y=6 width=76 height=122 xoffset=13 yoffset=38 xadvance=100 page=0 chnl=15 +char id=51 x=1278 y=6 width=79 height=124 xoffset=13 yoffset=38 xadvance=103 page=0 chnl=15 +char id=52 x=1369 y=6 width=84 height=121 xoffset=10 yoffset=39 xadvance=103 page=0 chnl=15 +char id=53 x=1465 y=6 width=74 height=123 xoffset=13 yoffset=39 xadvance=98 page=0 chnl=15 +char id=54 x=1551 y=6 width=79 height=125 xoffset=11 yoffset=37 xadvance=100 page=0 chnl=15 +char id=55 x=1642 y=6 width=76 height=121 xoffset=8 yoffset=39 xadvance=93 page=0 chnl=15 +char id=56 x=1730 y=6 width=81 height=124 xoffset=10 yoffset=38 xadvance=101 page=0 chnl=15 +char id=57 x=1823 y=6 width=79 height=125 xoffset=11 yoffset=37 xadvance=100 page=0 chnl=15 +char id=58 x=1914 y=6 width=18 height=83 xoffset=13 yoffset=75 xadvance=44 page=0 chnl=15 +char id=59 x=1944 y=6 width=21 height=115 xoffset=12 yoffset=75 xadvance=45 page=0 chnl=15 +char id=60 x=1977 y=6 width=73 height=88 xoffset=17 yoffset=69 xadvance=107 page=0 chnl=15 +char id=61 x=2062 y=6 width=68 height=44 xoffset=20 yoffset=91 xadvance=107 page=0 chnl=15 +char id=62 x=2142 y=6 width=73 height=88 xoffset=17 yoffset=69 xadvance=107 page=0 chnl=15 +char id=63 x=2227 y=6 width=68 height=123 xoffset=6 yoffset=38 xadvance=82 page=0 chnl=15 +char id=64 x=2307 y=6 width=139 height=148 xoffset=8 yoffset=44 xadvance=154 page=0 chnl=15 +char id=65 x=2458 y=6 width=100 height=121 xoffset=4 yoffset=39 xadvance=108 page=0 chnl=15 +char id=66 x=2570 y=6 width=82 height=121 xoffset=15 yoffset=39 xadvance=106 page=0 chnl=15 +char id=67 x=2664 y=6 width=101 height=124 xoffset=10 yoffset=38 xadvance=119 page=0 chnl=15 +char id=68 x=2777 y=6 width=93 height=121 xoffset=15 yoffset=39 xadvance=118 page=0 chnl=15 +char id=69 x=2882 y=6 width=72 height=121 xoffset=15 yoffset=39 xadvance=98 page=0 chnl=15 +char id=70 x=2966 y=6 width=71 height=121 xoffset=15 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=3049 y=6 width=102 height=124 xoffset=10 yoffset=38 xadvance=122 page=0 chnl=15 +char id=72 x=3163 y=6 width=92 height=121 xoffset=15 yoffset=39 xadvance=122 page=0 chnl=15 +char id=73 x=3267 y=6 width=12 height=121 xoffset=15 yoffset=39 xadvance=42 page=0 chnl=15 +char id=74 x=3291 y=6 width=66 height=123 xoffset=7 yoffset=39 xadvance=88 page=0 chnl=15 +char id=75 x=3369 y=6 width=87 height=121 xoffset=15 yoffset=39 xadvance=105 page=0 chnl=15 +char id=76 x=3468 y=6 width=70 height=121 xoffset=15 yoffset=39 xadvance=92 page=0 chnl=15 +char id=77 x=3550 y=6 width=115 height=121 xoffset=15 yoffset=39 xadvance=145 page=0 chnl=15 +char id=78 x=3677 y=6 width=95 height=121 xoffset=15 yoffset=39 xadvance=125 page=0 chnl=15 +char id=79 x=3784 y=6 width=105 height=124 xoffset=10 yoffset=38 xadvance=125 page=0 chnl=15 +char id=80 x=3901 y=6 width=79 height=121 xoffset=15 yoffset=39 xadvance=103 page=0 chnl=15 +char id=81 x=6 y=218 width=105 height=134 xoffset=10 yoffset=38 xadvance=125 page=0 chnl=15 +char id=82 x=123 y=218 width=84 height=121 xoffset=15 yoffset=39 xadvance=104 page=0 chnl=15 +char id=83 x=219 y=218 width=84 height=125 xoffset=10 yoffset=38 xadvance=103 page=0 chnl=15 +char id=84 x=315 y=218 width=88 height=121 xoffset=8 yoffset=39 xadvance=104 page=0 chnl=15 +char id=85 x=415 y=218 width=93 height=124 xoffset=15 yoffset=39 xadvance=123 page=0 chnl=15 +char id=86 x=520 y=218 width=100 height=121 xoffset=4 yoffset=39 xadvance=108 page=0 chnl=15 +char id=87 x=632 y=218 width=147 height=121 xoffset=3 yoffset=39 xadvance=153 page=0 chnl=15 +char id=88 x=791 y=218 width=95 height=121 xoffset=4 yoffset=39 xadvance=102 page=0 chnl=15 +char id=89 x=898 y=218 width=99 height=121 xoffset=4 yoffset=39 xadvance=107 page=0 chnl=15 +char id=90 x=1009 y=218 width=82 height=121 xoffset=10 yoffset=39 xadvance=102 page=0 chnl=15 +char id=91 x=1103 y=218 width=31 height=151 xoffset=19 yoffset=34 xadvance=57 page=0 chnl=15 +char id=92 x=1146 y=218 width=49 height=145 xoffset=4 yoffset=34 xadvance=57 page=0 chnl=15 +char id=93 x=1207 y=218 width=31 height=151 xoffset=7 yoffset=34 xadvance=57 page=0 chnl=15 +char id=94 x=1250 y=218 width=61 height=52 xoffset=6 yoffset=43 xadvance=73 page=0 chnl=15 +char id=95 x=1323 y=218 width=75 height=10 xoffset=-1 yoffset=160 xadvance=73 page=0 chnl=15 +char id=96 x=1410 y=218 width=28 height=28 xoffset=27 yoffset=30 xadvance=82 page=0 chnl=15 +char id=97 x=1450 y=218 width=69 height=95 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=98 x=1531 y=218 width=78 height=123 xoffset=15 yoffset=39 xadvance=101 page=0 chnl=15 +char id=99 x=1621 y=218 width=75 height=94 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=100 x=1708 y=218 width=77 height=123 xoffset=9 yoffset=39 xadvance=101 page=0 chnl=15 +char id=101 x=1797 y=218 width=78 height=94 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15 +char id=102 x=1887 y=218 width=50 height=126 xoffset=6 yoffset=34 xadvance=57 page=0 chnl=15 +char id=103 x=1949 y=218 width=77 height=128 xoffset=9 yoffset=68 xadvance=99 page=0 chnl=15 +char id=104 x=2038 y=218 width=70 height=121 xoffset=13 yoffset=39 xadvance=96 page=0 chnl=15 +char id=105 x=2120 y=218 width=17 height=121 xoffset=11 yoffset=39 xadvance=38 page=0 chnl=15 +char id=106 x=2149 y=218 width=30 height=155 xoffset=-3 yoffset=39 xadvance=38 page=0 chnl=15 +char id=107 x=2191 y=218 width=71 height=121 xoffset=13 yoffset=39 xadvance=86 page=0 chnl=15 +char id=108 x=2274 y=218 width=12 height=121 xoffset=13 yoffset=39 xadvance=38 page=0 chnl=15 +char id=109 x=2298 y=218 width=115 height=92 xoffset=13 yoffset=68 xadvance=141 page=0 chnl=15 +char id=110 x=2425 y=218 width=69 height=92 xoffset=13 yoffset=68 xadvance=95 page=0 chnl=15 +char id=111 x=2506 y=218 width=80 height=94 xoffset=9 yoffset=68 xadvance=97 page=0 chnl=15 +char id=112 x=2598 y=218 width=77 height=126 xoffset=13 yoffset=68 xadvance=99 page=0 chnl=15 +char id=113 x=2687 y=218 width=77 height=126 xoffset=9 yoffset=68 xadvance=99 page=0 chnl=15 +char id=114 x=2776 y=218 width=42 height=92 xoffset=13 yoffset=68 xadvance=58 page=0 chnl=15 +char id=115 x=2830 y=218 width=67 height=94 xoffset=9 yoffset=68 xadvance=84 page=0 chnl=15 +char id=116 x=2909 y=218 width=47 height=114 xoffset=6 yoffset=48 xadvance=59 page=0 chnl=15 +char id=117 x=2968 y=218 width=69 height=93 xoffset=13 yoffset=69 xadvance=95 page=0 chnl=15 +char id=118 x=3049 y=218 width=78 height=91 xoffset=6 yoffset=69 xadvance=90 page=0 chnl=15 +char id=119 x=3139 y=218 width=121 height=91 xoffset=6 yoffset=69 xadvance=133 page=0 chnl=15 +char id=120 x=3272 y=218 width=71 height=91 xoffset=8 yoffset=69 xadvance=87 page=0 chnl=15 +char id=121 x=3355 y=218 width=78 height=125 xoffset=6 yoffset=69 xadvance=90 page=0 chnl=15 +char id=122 x=3445 y=218 width=69 height=91 xoffset=10 yoffset=69 xadvance=87 page=0 chnl=15 +char id=123 x=3526 y=218 width=46 height=151 xoffset=7 yoffset=34 xadvance=57 page=0 chnl=15 +char id=124 x=3584 y=218 width=11 height=198 xoffset=20 yoffset=1 xadvance=50 page=0 chnl=15 +char id=125 x=3607 y=218 width=46 height=151 xoffset=4 yoffset=34 xadvance=57 page=0 chnl=15 +char id=126 x=3665 y=218 width=80 height=27 xoffset=14 yoffset=99 xadvance=107 page=0 chnl=15 +char id=161 x=3757 y=218 width=17 height=122 xoffset=14 yoffset=69 xadvance=45 page=0 chnl=15 +char id=163 x=3786 y=218 width=82 height=122 xoffset=11 yoffset=38 xadvance=104 page=0 chnl=15 +char id=165 x=3880 y=218 width=85 height=121 xoffset=2 yoffset=39 xadvance=89 page=0 chnl=15 +char id=167 x=3977 y=218 width=72 height=147 xoffset=9 yoffset=38 xadvance=89 page=0 chnl=15 +char id=171 x=6 y=430 width=65 height=73 xoffset=11 yoffset=75 xadvance=88 page=0 chnl=15 +char id=176 x=83 y=430 width=53 height=53 xoffset=11 yoffset=38 xadvance=75 page=0 chnl=15 +char id=187 x=148 y=430 width=65 height=73 xoffset=12 yoffset=75 xadvance=88 page=0 chnl=15 +char id=191 x=225 y=430 width=68 height=124 xoffset=8 yoffset=68 xadvance=82 page=0 chnl=15 +char id=192 x=305 y=430 width=100 height=160 xoffset=4 yoffset=0 xadvance=108 page=0 chnl=15 +char id=193 x=417 y=430 width=100 height=160 xoffset=4 yoffset=0 xadvance=108 page=0 chnl=15 +char id=195 x=529 y=430 width=100 height=153 xoffset=4 yoffset=7 xadvance=108 page=0 chnl=15 +char id=196 x=641 y=430 width=100 height=151 xoffset=4 yoffset=9 xadvance=108 page=0 chnl=15 +char id=199 x=753 y=430 width=101 height=157 xoffset=10 yoffset=38 xadvance=119 page=0 chnl=15 +char id=201 x=866 y=430 width=72 height=160 xoffset=15 yoffset=0 xadvance=98 page=0 chnl=15 +char id=202 x=950 y=430 width=72 height=155 xoffset=15 yoffset=5 xadvance=98 page=0 chnl=15 +char id=205 x=1034 y=430 width=29 height=160 xoffset=15 yoffset=0 xadvance=42 page=0 chnl=15 +char id=209 x=1075 y=430 width=95 height=152 xoffset=15 yoffset=8 xadvance=125 page=0 chnl=15 +char id=211 x=1182 y=430 width=105 height=162 xoffset=10 yoffset=0 xadvance=125 page=0 chnl=15 +char id=212 x=1299 y=430 width=105 height=157 xoffset=10 yoffset=5 xadvance=125 page=0 chnl=15 +char id=214 x=1416 y=430 width=105 height=153 xoffset=10 yoffset=9 xadvance=125 page=0 chnl=15 +char id=215 x=1533 y=430 width=74 height=74 xoffset=17 yoffset=76 xadvance=107 page=0 chnl=15 +char id=218 x=1619 y=430 width=93 height=163 xoffset=15 yoffset=0 xadvance=123 page=0 chnl=15 +char id=220 x=1724 y=430 width=93 height=154 xoffset=15 yoffset=9 xadvance=123 page=0 chnl=15 +char id=223 x=1829 y=430 width=74 height=122 xoffset=15 yoffset=38 xadvance=98 page=0 chnl=15 +char id=224 x=1915 y=430 width=69 height=133 xoffset=9 yoffset=30 xadvance=91 page=0 chnl=15 +char id=225 x=1996 y=430 width=69 height=133 xoffset=9 yoffset=30 xadvance=91 page=0 chnl=15 +char id=226 x=2077 y=430 width=69 height=128 xoffset=9 yoffset=35 xadvance=91 page=0 chnl=15 +char id=227 x=2158 y=430 width=69 height=125 xoffset=9 yoffset=38 xadvance=91 page=0 chnl=15 +char id=228 x=2239 y=430 width=69 height=124 xoffset=9 yoffset=39 xadvance=91 page=0 chnl=15 +char id=231 x=2320 y=430 width=75 height=126 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=232 x=2407 y=430 width=78 height=132 xoffset=9 yoffset=30 xadvance=95 page=0 chnl=15 +char id=233 x=2497 y=430 width=78 height=132 xoffset=9 yoffset=30 xadvance=95 page=0 chnl=15 +char id=234 x=2587 y=430 width=78 height=127 xoffset=9 yoffset=35 xadvance=95 page=0 chnl=15 +char id=237 x=2677 y=430 width=29 height=130 xoffset=13 yoffset=30 xadvance=38 page=0 chnl=15 +char id=238 x=2718 y=430 width=49 height=125 xoffset=-5 yoffset=35 xadvance=38 page=0 chnl=15 +char id=241 x=2779 y=430 width=69 height=122 xoffset=13 yoffset=38 xadvance=95 page=0 chnl=15 +char id=243 x=2860 y=430 width=80 height=132 xoffset=9 yoffset=30 xadvance=97 page=0 chnl=15 +char id=244 x=2952 y=430 width=80 height=127 xoffset=9 yoffset=35 xadvance=97 page=0 chnl=15 +char id=245 x=3044 y=430 width=80 height=124 xoffset=9 yoffset=38 xadvance=97 page=0 chnl=15 +char id=246 x=3136 y=430 width=80 height=123 xoffset=9 yoffset=39 xadvance=97 page=0 chnl=15 +char id=249 x=3228 y=430 width=69 height=132 xoffset=13 yoffset=30 xadvance=95 page=0 chnl=15 +char id=250 x=3309 y=430 width=69 height=132 xoffset=13 yoffset=30 xadvance=95 page=0 chnl=15 +char id=251 x=3390 y=430 width=69 height=127 xoffset=13 yoffset=35 xadvance=95 page=0 chnl=15 +char id=252 x=3471 y=430 width=69 height=123 xoffset=13 yoffset=39 xadvance=95 page=0 chnl=15 +char id=260 x=3552 y=430 width=104 height=157 xoffset=4 yoffset=39 xadvance=108 page=0 chnl=15 +char id=261 x=3668 y=430 width=73 height=128 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=262 x=3753 y=430 width=101 height=162 xoffset=10 yoffset=0 xadvance=119 page=0 chnl=15 +char id=263 x=3866 y=430 width=75 height=132 xoffset=9 yoffset=30 xadvance=91 page=0 chnl=15 +char id=280 x=3953 y=430 width=76 height=157 xoffset=15 yoffset=39 xadvance=98 page=0 chnl=15 +char id=281 x=6 y=642 width=78 height=128 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15 +char id=286 x=96 y=642 width=102 height=153 xoffset=10 yoffset=9 xadvance=122 page=0 chnl=15 +char id=287 x=210 y=642 width=77 height=157 xoffset=9 yoffset=39 xadvance=99 page=0 chnl=15 +char id=304 x=299 y=642 width=17 height=151 xoffset=13 yoffset=9 xadvance=42 page=0 chnl=15 +char id=305 x=328 y=642 width=12 height=91 xoffset=13 yoffset=69 xadvance=38 page=0 chnl=15 +char id=321 x=352 y=642 width=81 height=121 xoffset=2 yoffset=39 xadvance=91 page=0 chnl=15 +char id=322 x=445 y=642 width=39 height=121 xoffset=-1 yoffset=39 xadvance=37 page=0 chnl=15 +char id=323 x=496 y=642 width=95 height=160 xoffset=15 yoffset=0 xadvance=125 page=0 chnl=15 +char id=324 x=603 y=642 width=69 height=130 xoffset=13 yoffset=30 xadvance=95 page=0 chnl=15 +char id=339 x=684 y=642 width=147 height=94 xoffset=9 yoffset=68 xadvance=164 page=0 chnl=15 +char id=346 x=843 y=642 width=84 height=163 xoffset=10 yoffset=0 xadvance=103 page=0 chnl=15 +char id=347 x=939 y=642 width=67 height=132 xoffset=9 yoffset=30 xadvance=84 page=0 chnl=15 +char id=350 x=1018 y=642 width=84 height=156 xoffset=10 yoffset=38 xadvance=103 page=0 chnl=15 +char id=351 x=1114 y=642 width=67 height=126 xoffset=9 yoffset=68 xadvance=84 page=0 chnl=15 +char id=377 x=1193 y=642 width=82 height=160 xoffset=10 yoffset=0 xadvance=102 page=0 chnl=15 +char id=378 x=1287 y=642 width=69 height=130 xoffset=10 yoffset=30 xadvance=87 page=0 chnl=15 +char id=379 x=1368 y=642 width=82 height=151 xoffset=10 yoffset=9 xadvance=102 page=0 chnl=15 +char id=380 x=1462 y=642 width=69 height=121 xoffset=10 yoffset=39 xadvance=87 page=0 chnl=15 +char id=1028 x=1543 y=642 width=87 height=44 xoffset=11 yoffset=78 xadvance=108 page=0 chnl=15 +char id=1030 x=1642 y=642 width=12 height=121 xoffset=15 yoffset=39 xadvance=42 page=0 chnl=15 +char id=1040 x=1666 y=642 width=100 height=121 xoffset=4 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1041 x=1778 y=642 width=84 height=121 xoffset=15 yoffset=39 xadvance=109 page=0 chnl=15 +char id=1042 x=1874 y=642 width=82 height=121 xoffset=15 yoffset=39 xadvance=106 page=0 chnl=15 +char id=1043 x=1968 y=642 width=72 height=121 xoffset=15 yoffset=39 xadvance=94 page=0 chnl=15 +char id=1044 x=2052 y=642 width=111 height=151 xoffset=4 yoffset=39 xadvance=121 page=0 chnl=15 +char id=1045 x=2175 y=642 width=72 height=121 xoffset=15 yoffset=39 xadvance=98 page=0 chnl=15 +char id=1046 x=2259 y=642 width=145 height=121 xoffset=2 yoffset=39 xadvance=149 page=0 chnl=15 +char id=1047 x=2416 y=642 width=79 height=124 xoffset=13 yoffset=38 xadvance=103 page=0 chnl=15 +char id=1048 x=2507 y=642 width=95 height=121 xoffset=15 yoffset=39 xadvance=125 page=0 chnl=15 +char id=1049 x=2614 y=642 width=95 height=151 xoffset=15 yoffset=9 xadvance=125 page=0 chnl=15 +char id=1050 x=2721 y=642 width=84 height=121 xoffset=15 yoffset=39 xadvance=103 page=0 chnl=15 +char id=1051 x=2817 y=642 width=98 height=121 xoffset=4 yoffset=39 xadvance=117 page=0 chnl=15 +char id=1052 x=2927 y=642 width=115 height=121 xoffset=15 yoffset=39 xadvance=145 page=0 chnl=15 +char id=1053 x=3054 y=642 width=92 height=121 xoffset=15 yoffset=39 xadvance=122 page=0 chnl=15 +char id=1054 x=3158 y=642 width=105 height=124 xoffset=10 yoffset=38 xadvance=125 page=0 chnl=15 +char id=1055 x=3275 y=642 width=87 height=121 xoffset=15 yoffset=39 xadvance=116 page=0 chnl=15 +char id=1056 x=3374 y=642 width=79 height=121 xoffset=15 yoffset=39 xadvance=103 page=0 chnl=15 +char id=1057 x=3465 y=642 width=101 height=124 xoffset=10 yoffset=38 xadvance=119 page=0 chnl=15 +char id=1058 x=3578 y=642 width=88 height=121 xoffset=8 yoffset=39 xadvance=104 page=0 chnl=15 +char id=1059 x=3678 y=642 width=92 height=123 xoffset=4 yoffset=39 xadvance=100 page=0 chnl=15 +char id=1060 x=3782 y=642 width=107 height=128 xoffset=10 yoffset=37 xadvance=127 page=0 chnl=15 +char id=1061 x=3901 y=642 width=95 height=121 xoffset=4 yoffset=39 xadvance=102 page=0 chnl=15 +char id=1062 x=6 y=854 width=98 height=150 xoffset=15 yoffset=39 xadvance=120 page=0 chnl=15 +char id=1063 x=116 y=854 width=86 height=121 xoffset=15 yoffset=39 xadvance=116 page=0 chnl=15 +char id=1064 x=214 y=854 width=125 height=121 xoffset=15 yoffset=39 xadvance=154 page=0 chnl=15 +char id=1065 x=351 y=854 width=134 height=150 xoffset=15 yoffset=39 xadvance=156 page=0 chnl=15 +char id=1068 x=497 y=854 width=84 height=121 xoffset=15 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1070 x=593 y=854 width=140 height=124 xoffset=15 yoffset=38 xadvance=167 page=0 chnl=15 +char id=1071 x=745 y=854 width=84 height=121 xoffset=5 yoffset=39 xadvance=104 page=0 chnl=15 +char id=1072 x=841 y=854 width=69 height=95 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=1073 x=922 y=854 width=79 height=126 xoffset=9 yoffset=36 xadvance=96 page=0 chnl=15 +char id=1074 x=1013 y=854 width=71 height=91 xoffset=13 yoffset=69 xadvance=92 page=0 chnl=15 +char id=1075 x=1096 y=854 width=55 height=91 xoffset=13 yoffset=69 xadvance=75 page=0 chnl=15 +char id=1076 x=1163 y=854 width=92 height=117 xoffset=3 yoffset=69 xadvance=100 page=0 chnl=15 +char id=1077 x=1267 y=854 width=78 height=94 xoffset=9 yoffset=68 xadvance=95 page=0 chnl=15 +char id=1078 x=1357 y=854 width=119 height=91 xoffset=8 yoffset=69 xadvance=134 page=0 chnl=15 +char id=1079 x=1488 y=854 width=67 height=94 xoffset=7 yoffset=68 xadvance=81 page=0 chnl=15 +char id=1080 x=1567 y=854 width=72 height=91 xoffset=13 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1081 x=1651 y=854 width=72 height=121 xoffset=13 yoffset=39 xadvance=98 page=0 chnl=15 +char id=1082 x=1735 y=854 width=69 height=91 xoffset=13 yoffset=69 xadvance=85 page=0 chnl=15 +char id=1083 x=1816 y=854 width=80 height=91 xoffset=4 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1084 x=1908 y=854 width=96 height=91 xoffset=13 yoffset=69 xadvance=122 page=0 chnl=15 +char id=1085 x=2016 y=854 width=70 height=91 xoffset=13 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1086 x=2098 y=854 width=80 height=94 xoffset=9 yoffset=68 xadvance=97 page=0 chnl=15 +char id=1087 x=2190 y=854 width=70 height=91 xoffset=13 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1088 x=2272 y=854 width=77 height=126 xoffset=13 yoffset=68 xadvance=99 page=0 chnl=15 +char id=1089 x=2361 y=854 width=75 height=94 xoffset=9 yoffset=68 xadvance=91 page=0 chnl=15 +char id=1090 x=2448 y=854 width=71 height=91 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15 +char id=1091 x=2531 y=854 width=78 height=125 xoffset=6 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1092 x=2621 y=854 width=97 height=152 xoffset=9 yoffset=39 xadvance=114 page=0 chnl=15 +char id=1093 x=2730 y=854 width=71 height=91 xoffset=8 yoffset=69 xadvance=87 page=0 chnl=15 +char id=1094 x=2813 y=854 width=80 height=121 xoffset=13 yoffset=69 xadvance=100 page=0 chnl=15 +char id=1095 x=2905 y=854 width=68 height=91 xoffset=13 yoffset=69 xadvance=94 page=0 chnl=15 +char id=1096 x=2985 y=854 width=107 height=91 xoffset=13 yoffset=69 xadvance=133 page=0 chnl=15 +char id=1097 x=3104 y=854 width=118 height=117 xoffset=13 yoffset=69 xadvance=137 page=0 chnl=15 +char id=1100 x=3234 y=854 width=68 height=91 xoffset=13 yoffset=69 xadvance=89 page=0 chnl=15 +char id=1102 x=3314 y=854 width=117 height=94 xoffset=6 yoffset=68 xadvance=133 page=0 chnl=15 +char id=1103 x=3443 y=854 width=71 height=91 xoffset=7 yoffset=69 xadvance=91 page=0 chnl=15 +char id=1108 x=3526 y=854 width=74 height=94 xoffset=2 yoffset=68 xadvance=85 page=0 chnl=15 +char id=1110 x=3612 y=854 width=17 height=121 xoffset=11 yoffset=39 xadvance=38 page=0 chnl=15 +char id=1111 x=3641 y=854 width=46 height=121 xoffset=-4 yoffset=39 xadvance=38 page=0 chnl=15 +char id=8209 x=3699 y=854 width=51 height=11 xoffset=0 yoffset=103 xadvance=53 page=0 chnl=15 +char id=8211 x=3762 y=854 width=83 height=11 xoffset=0 yoffset=103 xadvance=82 page=0 chnl=15 +char id=8212 x=3857 y=854 width=166 height=11 xoffset=0 yoffset=103 xadvance=165 page=0 chnl=15 +char id=8217 x=4035 y=854 width=22 height=41 xoffset=2 yoffset=39 xadvance=28 page=0 chnl=15 +char id=8220 x=6 y=1066 width=49 height=41 xoffset=8 yoffset=37 xadvance=58 page=0 chnl=15 +char id=8221 x=67 y=1066 width=49 height=41 xoffset=2 yoffset=39 xadvance=58 page=0 chnl=15 +char id=8222 x=128 y=1066 width=49 height=42 xoffset=2 yoffset=144 xadvance=58 page=0 chnl=15 +char id=8226 x=189 y=1066 width=45 height=46 xoffset=24 yoffset=89 xadvance=92 page=0 chnl=15 +char id=8364 x=246 y=1066 width=96 height=124 xoffset=4 yoffset=38 xadvance=110 page=0 chnl=15 +char id=8627 x=354 y=1066 width=128 height=102 xoffset=16 yoffset=39 xadvance=159 page=0 chnl=15 +char id=8679 x=494 y=1066 width=131 height=130 xoffset=15 yoffset=30 xadvance=160 page=0 chnl=15 +char id=9003 x=637 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=822 y=1066 width=38 height=36 xoffset=39 yoffset=148 xadvance=116 page=0 chnl=15 +char id=9654 x=872 y=1066 width=128 height=152 xoffset=14 yoffset=24 xadvance=148 page=0 chnl=15 +char id=9664 x=1012 y=1066 width=128 height=152 xoffset=7 yoffset=24 xadvance=148 page=0 chnl=15 +char id=9675 x=1152 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=1289 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=1426 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=1438 y=1066 width=112 height=80 xoffset=18 yoffset=64 xadvance=145 page=0 chnl=15 +char id=10004 x=1562 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=1574 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=1586 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=1598 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=1610 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Light.png b/iqpilot/selfdrive/assets/fonts/Inter-Light.png new file mode 100644 index 000000000..6470e79a3 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Light.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Light.ttf b/iqpilot/selfdrive/assets/fonts/Inter-Light.ttf new file mode 100644 index 000000000..a5f073690 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Light.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Medium.fnt b/iqpilot/selfdrive/assets/fonts/Inter-Medium.fnt new file mode 100644 index 000000000..e80d473d6 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-Medium.fnt @@ -0,0 +1,254 @@ +info face="Inter-Medium" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-Medium.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=43 height=200 xoffset=0 yoffset=0 xadvance=43 page=0 chnl=15 +char id=33 x=73 y=6 width=25 height=123 xoffset=12 yoffset=39 xadvance=48 page=0 chnl=15 +char id=34 x=110 y=6 width=46 height=44 xoffset=10 yoffset=39 xadvance=66 page=0 chnl=15 +char id=35 x=168 y=6 width=101 height=121 xoffset=2 yoffset=39 xadvance=105 page=0 chnl=15 +char id=36 x=281 y=6 width=90 height=152 xoffset=8 yoffset=24 xadvance=106 page=0 chnl=15 +char id=37 x=383 y=6 width=111 height=126 xoffset=13 yoffset=37 xadvance=136 page=0 chnl=15 +char id=38 x=506 y=6 width=99 height=124 xoffset=7 yoffset=38 xadvance=107 page=0 chnl=15 +char id=39 x=617 y=6 width=16 height=44 xoffset=10 yoffset=39 xadvance=35 page=0 chnl=15 +char id=40 x=645 y=6 width=40 height=150 xoffset=16 yoffset=35 xadvance=62 page=0 chnl=15 +char id=41 x=697 y=6 width=40 height=150 xoffset=6 yoffset=35 xadvance=62 page=0 chnl=15 +char id=42 x=749 y=6 width=66 height=69 xoffset=10 yoffset=39 xadvance=86 page=0 chnl=15 +char id=43 x=827 y=6 width=80 height=80 xoffset=15 yoffset=73 xadvance=110 page=0 chnl=15 +char id=44 x=919 y=6 width=25 height=47 xoffset=10 yoffset=143 xadvance=47 page=0 chnl=15 +char id=45 x=956 y=6 width=54 height=16 xoffset=11 yoffset=101 xadvance=76 page=0 chnl=15 +char id=46 x=1022 y=6 width=25 height=25 xoffset=11 yoffset=137 xadvance=46 page=0 chnl=15 +char id=47 x=1059 y=6 width=55 height=145 xoffset=3 yoffset=34 xadvance=60 page=0 chnl=15 +char id=48 x=1126 y=6 width=89 height=124 xoffset=9 yoffset=38 xadvance=106 page=0 chnl=15 +char id=49 x=1227 y=6 width=49 height=121 xoffset=9 yoffset=39 xadvance=78 page=0 chnl=15 +char id=50 x=1288 y=6 width=80 height=122 xoffset=11 yoffset=38 xadvance=101 page=0 chnl=15 +char id=51 x=1380 y=6 width=86 height=124 xoffset=10 yoffset=38 xadvance=106 page=0 chnl=15 +char id=52 x=1478 y=6 width=91 height=121 xoffset=9 yoffset=39 xadvance=108 page=0 chnl=15 +char id=53 x=1581 y=6 width=82 height=123 xoffset=11 yoffset=39 xadvance=102 page=0 chnl=15 +char id=54 x=1675 y=6 width=87 height=125 xoffset=9 yoffset=37 xadvance=105 page=0 chnl=15 +char id=55 x=1774 y=6 width=80 height=121 xoffset=7 yoffset=39 xadvance=95 page=0 chnl=15 +char id=56 x=1866 y=6 width=86 height=124 xoffset=9 yoffset=38 xadvance=104 page=0 chnl=15 +char id=57 x=1964 y=6 width=87 height=125 xoffset=9 yoffset=37 xadvance=105 page=0 chnl=15 +char id=58 x=2063 y=6 width=25 height=90 xoffset=11 yoffset=72 xadvance=46 page=0 chnl=15 +char id=59 x=2100 y=6 width=28 height=118 xoffset=10 yoffset=72 xadvance=47 page=0 chnl=15 +char id=60 x=2140 y=6 width=79 height=90 xoffset=16 yoffset=68 xadvance=110 page=0 chnl=15 +char id=61 x=2231 y=6 width=76 height=53 xoffset=17 yoffset=86 xadvance=110 page=0 chnl=15 +char id=62 x=2319 y=6 width=79 height=90 xoffset=16 yoffset=68 xadvance=110 page=0 chnl=15 +char id=63 x=2410 y=6 width=73 height=124 xoffset=6 yoffset=38 xadvance=86 page=0 chnl=15 +char id=64 x=2495 y=6 width=145 height=151 xoffset=8 yoffset=42 xadvance=159 page=0 chnl=15 +char id=65 x=2652 y=6 width=108 height=121 xoffset=4 yoffset=39 xadvance=115 page=0 chnl=15 +char id=66 x=2772 y=6 width=87 height=121 xoffset=13 yoffset=39 xadvance=108 page=0 chnl=15 +char id=67 x=2871 y=6 width=105 height=124 xoffset=9 yoffset=38 xadvance=121 page=0 chnl=15 +char id=68 x=2988 y=6 width=97 height=121 xoffset=13 yoffset=39 xadvance=119 page=0 chnl=15 +char id=69 x=3097 y=6 width=77 height=121 xoffset=13 yoffset=39 xadvance=99 page=0 chnl=15 +char id=70 x=3186 y=6 width=75 height=121 xoffset=13 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=3273 y=6 width=105 height=124 xoffset=9 yoffset=38 xadvance=123 page=0 chnl=15 +char id=72 x=3390 y=6 width=97 height=121 xoffset=13 yoffset=39 xadvance=122 page=0 chnl=15 +char id=73 x=3499 y=6 width=19 height=121 xoffset=13 yoffset=39 xadvance=44 page=0 chnl=15 +char id=74 x=3530 y=6 width=73 height=123 xoffset=5 yoffset=39 xadvance=91 page=0 chnl=15 +char id=75 x=3615 y=6 width=94 height=121 xoffset=13 yoffset=39 xadvance=109 page=0 chnl=15 +char id=76 x=3721 y=6 width=73 height=121 xoffset=13 yoffset=39 xadvance=93 page=0 chnl=15 +char id=77 x=3806 y=6 width=123 height=121 xoffset=13 yoffset=39 xadvance=148 page=0 chnl=15 +char id=78 x=3941 y=6 width=98 height=121 xoffset=13 yoffset=39 xadvance=123 page=0 chnl=15 +char id=79 x=6 y=218 width=109 height=124 xoffset=9 yoffset=38 xadvance=126 page=0 chnl=15 +char id=80 x=127 y=218 width=85 height=121 xoffset=13 yoffset=39 xadvance=105 page=0 chnl=15 +char id=81 x=224 y=218 width=109 height=133 xoffset=9 yoffset=38 xadvance=126 page=0 chnl=15 +char id=82 x=345 y=218 width=90 height=121 xoffset=13 yoffset=39 xadvance=106 page=0 chnl=15 +char id=83 x=447 y=218 width=90 height=124 xoffset=8 yoffset=38 xadvance=106 page=0 chnl=15 +char id=84 x=549 y=218 width=94 height=121 xoffset=7 yoffset=39 xadvance=107 page=0 chnl=15 +char id=85 x=655 y=218 width=96 height=123 xoffset=13 yoffset=39 xadvance=121 page=0 chnl=15 +char id=86 x=763 y=218 width=108 height=121 xoffset=4 yoffset=39 xadvance=115 page=0 chnl=15 +char id=87 x=883 y=218 width=156 height=121 xoffset=3 yoffset=39 xadvance=161 page=0 chnl=15 +char id=88 x=1051 y=218 width=102 height=121 xoffset=4 yoffset=39 xadvance=110 page=0 chnl=15 +char id=89 x=1165 y=218 width=107 height=121 xoffset=3 yoffset=39 xadvance=113 page=0 chnl=15 +char id=90 x=1284 y=218 width=88 height=121 xoffset=9 yoffset=39 xadvance=105 page=0 chnl=15 +char id=91 x=1384 y=218 width=40 height=150 xoffset=18 yoffset=35 xadvance=62 page=0 chnl=15 +char id=92 x=1436 y=218 width=55 height=145 xoffset=3 yoffset=34 xadvance=60 page=0 chnl=15 +char id=93 x=1503 y=218 width=39 height=150 xoffset=5 yoffset=35 xadvance=62 page=0 chnl=15 +char id=94 x=1554 y=218 width=67 height=52 xoffset=6 yoffset=43 xadvance=78 page=0 chnl=15 +char id=95 x=1633 y=218 width=78 height=15 xoffset=-1 yoffset=160 xadvance=75 page=0 chnl=15 +char id=96 x=1723 y=218 width=33 height=28 xoffset=25 yoffset=30 xadvance=82 page=0 chnl=15 +char id=97 x=1768 y=218 width=76 height=94 xoffset=7 yoffset=68 xadvance=94 page=0 chnl=15 +char id=98 x=1856 y=218 width=83 height=123 xoffset=13 yoffset=39 xadvance=103 page=0 chnl=15 +char id=99 x=1951 y=218 width=80 height=94 xoffset=7 yoffset=68 xadvance=93 page=0 chnl=15 +char id=100 x=2043 y=218 width=84 height=123 xoffset=7 yoffset=39 xadvance=103 page=0 chnl=15 +char id=101 x=2139 y=218 width=83 height=94 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15 +char id=102 x=2234 y=218 width=57 height=126 xoffset=3 yoffset=34 xadvance=60 page=0 chnl=15 +char id=103 x=2303 y=218 width=84 height=128 xoffset=7 yoffset=68 xadvance=101 page=0 chnl=15 +char id=104 x=2399 y=218 width=77 height=121 xoffset=11 yoffset=39 xadvance=99 page=0 chnl=15 +char id=105 x=2488 y=218 width=23 height=125 xoffset=9 yoffset=35 xadvance=41 page=0 chnl=15 +char id=106 x=2523 y=218 width=35 height=159 xoffset=-3 yoffset=35 xadvance=41 page=0 chnl=15 +char id=107 x=2570 y=218 width=80 height=121 xoffset=11 yoffset=39 xadvance=91 page=0 chnl=15 +char id=108 x=2662 y=218 width=19 height=121 xoffset=11 yoffset=39 xadvance=41 page=0 chnl=15 +char id=109 x=2693 y=218 width=124 height=92 xoffset=11 yoffset=68 xadvance=146 page=0 chnl=15 +char id=110 x=2829 y=218 width=77 height=92 xoffset=11 yoffset=68 xadvance=98 page=0 chnl=15 +char id=111 x=2918 y=218 width=85 height=94 xoffset=7 yoffset=68 xadvance=99 page=0 chnl=15 +char id=112 x=3015 y=218 width=84 height=126 xoffset=11 yoffset=68 xadvance=101 page=0 chnl=15 +char id=113 x=3111 y=218 width=84 height=126 xoffset=7 yoffset=68 xadvance=101 page=0 chnl=15 +char id=114 x=3207 y=218 width=50 height=92 xoffset=11 yoffset=68 xadvance=63 page=0 chnl=15 +char id=115 x=3269 y=218 width=75 height=94 xoffset=7 yoffset=68 xadvance=88 page=0 chnl=15 +char id=116 x=3356 y=218 width=52 height=114 xoffset=4 yoffset=48 xadvance=61 page=0 chnl=15 +char id=117 x=3420 y=218 width=76 height=93 xoffset=11 yoffset=69 xadvance=98 page=0 chnl=15 +char id=118 x=3508 y=218 width=85 height=91 xoffset=4 yoffset=69 xadvance=93 page=0 chnl=15 +char id=119 x=3605 y=218 width=128 height=91 xoffset=4 yoffset=69 xadvance=136 page=0 chnl=15 +char id=120 x=3745 y=218 width=80 height=91 xoffset=6 yoffset=69 xadvance=91 page=0 chnl=15 +char id=121 x=3837 y=218 width=86 height=125 xoffset=4 yoffset=69 xadvance=93 page=0 chnl=15 +char id=122 x=3935 y=218 width=74 height=91 xoffset=9 yoffset=69 xadvance=91 page=0 chnl=15 +char id=123 x=4021 y=218 width=53 height=150 xoffset=5 yoffset=35 xadvance=62 page=0 chnl=15 +char id=124 x=6 y=430 width=17 height=198 xoffset=20 yoffset=1 xadvance=56 page=0 chnl=15 +char id=125 x=35 y=430 width=52 height=150 xoffset=5 yoffset=35 xadvance=62 page=0 chnl=15 +char id=126 x=99 y=430 width=85 height=34 xoffset=13 yoffset=95 xadvance=110 page=0 chnl=15 +char id=161 x=196 y=430 width=25 height=122 xoffset=12 yoffset=69 xadvance=48 page=0 chnl=15 +char id=163 x=233 y=430 width=86 height=122 xoffset=10 yoffset=38 xadvance=106 page=0 chnl=15 +char id=165 x=331 y=430 width=88 height=121 xoffset=2 yoffset=39 xadvance=91 page=0 chnl=15 +char id=167 x=431 y=430 width=77 height=147 xoffset=8 yoffset=38 xadvance=93 page=0 chnl=15 +char id=171 x=520 y=430 width=73 height=73 xoffset=10 yoffset=75 xadvance=93 page=0 chnl=15 +char id=176 x=605 y=430 width=56 height=57 xoffset=10 yoffset=38 xadvance=75 page=0 chnl=15 +char id=187 x=673 y=430 width=73 height=73 xoffset=10 yoffset=75 xadvance=94 page=0 chnl=15 +char id=191 x=758 y=430 width=73 height=124 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15 +char id=192 x=843 y=430 width=108 height=160 xoffset=4 yoffset=0 xadvance=115 page=0 chnl=15 +char id=193 x=963 y=430 width=108 height=160 xoffset=4 yoffset=0 xadvance=115 page=0 chnl=15 +char id=195 x=1083 y=430 width=108 height=155 xoffset=4 yoffset=5 xadvance=115 page=0 chnl=15 +char id=196 x=1203 y=430 width=108 height=155 xoffset=4 yoffset=5 xadvance=115 page=0 chnl=15 +char id=199 x=1323 y=430 width=105 height=159 xoffset=9 yoffset=38 xadvance=121 page=0 chnl=15 +char id=201 x=1440 y=430 width=77 height=160 xoffset=13 yoffset=0 xadvance=99 page=0 chnl=15 +char id=202 x=1529 y=430 width=77 height=157 xoffset=13 yoffset=3 xadvance=99 page=0 chnl=15 +char id=205 x=1618 y=430 width=35 height=160 xoffset=13 yoffset=0 xadvance=44 page=0 chnl=15 +char id=209 x=1665 y=430 width=98 height=154 xoffset=13 yoffset=6 xadvance=123 page=0 chnl=15 +char id=211 x=1775 y=430 width=109 height=162 xoffset=9 yoffset=0 xadvance=126 page=0 chnl=15 +char id=212 x=1896 y=430 width=109 height=159 xoffset=9 yoffset=3 xadvance=126 page=0 chnl=15 +char id=214 x=2017 y=430 width=109 height=157 xoffset=9 yoffset=5 xadvance=126 page=0 chnl=15 +char id=215 x=2138 y=430 width=80 height=79 xoffset=15 yoffset=73 xadvance=110 page=0 chnl=15 +char id=218 x=2230 y=430 width=96 height=162 xoffset=13 yoffset=0 xadvance=121 page=0 chnl=15 +char id=220 x=2338 y=430 width=96 height=157 xoffset=13 yoffset=5 xadvance=121 page=0 chnl=15 +char id=223 x=2446 y=430 width=83 height=122 xoffset=13 yoffset=38 xadvance=103 page=0 chnl=15 +char id=224 x=2541 y=430 width=76 height=132 xoffset=7 yoffset=30 xadvance=94 page=0 chnl=15 +char id=225 x=2629 y=430 width=76 height=132 xoffset=7 yoffset=30 xadvance=94 page=0 chnl=15 +char id=226 x=2717 y=430 width=76 height=129 xoffset=7 yoffset=33 xadvance=94 page=0 chnl=15 +char id=227 x=2805 y=430 width=76 height=126 xoffset=7 yoffset=36 xadvance=94 page=0 chnl=15 +char id=228 x=2893 y=430 width=76 height=127 xoffset=7 yoffset=35 xadvance=94 page=0 chnl=15 +char id=231 x=2981 y=430 width=80 height=129 xoffset=7 yoffset=68 xadvance=93 page=0 chnl=15 +char id=232 x=3073 y=430 width=83 height=132 xoffset=7 yoffset=30 xadvance=97 page=0 chnl=15 +char id=233 x=3168 y=430 width=83 height=132 xoffset=7 yoffset=30 xadvance=97 page=0 chnl=15 +char id=234 x=3263 y=430 width=83 height=129 xoffset=7 yoffset=33 xadvance=97 page=0 chnl=15 +char id=237 x=3358 y=430 width=35 height=130 xoffset=11 yoffset=30 xadvance=41 page=0 chnl=15 +char id=238 x=3405 y=430 width=57 height=127 xoffset=-8 yoffset=33 xadvance=41 page=0 chnl=15 +char id=241 x=3474 y=430 width=77 height=124 xoffset=11 yoffset=36 xadvance=98 page=0 chnl=15 +char id=243 x=3563 y=430 width=85 height=132 xoffset=7 yoffset=30 xadvance=99 page=0 chnl=15 +char id=244 x=3660 y=430 width=85 height=129 xoffset=7 yoffset=33 xadvance=99 page=0 chnl=15 +char id=245 x=3757 y=430 width=85 height=126 xoffset=7 yoffset=36 xadvance=99 page=0 chnl=15 +char id=246 x=3854 y=430 width=85 height=127 xoffset=7 yoffset=35 xadvance=99 page=0 chnl=15 +char id=249 x=3951 y=430 width=76 height=132 xoffset=11 yoffset=30 xadvance=98 page=0 chnl=15 +char id=250 x=6 y=642 width=76 height=132 xoffset=11 yoffset=30 xadvance=98 page=0 chnl=15 +char id=251 x=94 y=642 width=76 height=129 xoffset=11 yoffset=33 xadvance=98 page=0 chnl=15 +char id=252 x=182 y=642 width=76 height=127 xoffset=11 yoffset=35 xadvance=98 page=0 chnl=15 +char id=260 x=270 y=642 width=110 height=156 xoffset=4 yoffset=39 xadvance=115 page=0 chnl=15 +char id=261 x=392 y=642 width=78 height=127 xoffset=7 yoffset=68 xadvance=94 page=0 chnl=15 +char id=262 x=482 y=642 width=105 height=162 xoffset=9 yoffset=0 xadvance=121 page=0 chnl=15 +char id=263 x=599 y=642 width=80 height=132 xoffset=7 yoffset=30 xadvance=93 page=0 chnl=15 +char id=280 x=691 y=642 width=78 height=156 xoffset=13 yoffset=39 xadvance=99 page=0 chnl=15 +char id=281 x=781 y=642 width=83 height=126 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15 +char id=286 x=876 y=642 width=105 height=153 xoffset=9 yoffset=9 xadvance=123 page=0 chnl=15 +char id=287 x=993 y=642 width=84 height=157 xoffset=7 yoffset=39 xadvance=101 page=0 chnl=15 +char id=304 x=1089 y=642 width=23 height=156 xoffset=11 yoffset=4 xadvance=44 page=0 chnl=15 +char id=305 x=1124 y=642 width=19 height=91 xoffset=11 yoffset=69 xadvance=41 page=0 chnl=15 +char id=321 x=1155 y=642 width=85 height=121 xoffset=3 yoffset=39 xadvance=94 page=0 chnl=15 +char id=322 x=1252 y=642 width=43 height=121 xoffset=-1 yoffset=39 xadvance=41 page=0 chnl=15 +char id=323 x=1307 y=642 width=98 height=160 xoffset=13 yoffset=0 xadvance=123 page=0 chnl=15 +char id=324 x=1417 y=642 width=77 height=130 xoffset=11 yoffset=30 xadvance=98 page=0 chnl=15 +char id=339 x=1506 y=642 width=150 height=94 xoffset=7 yoffset=68 xadvance=162 page=0 chnl=15 +char id=346 x=1668 y=642 width=90 height=162 xoffset=8 yoffset=0 xadvance=106 page=0 chnl=15 +char id=347 x=1770 y=642 width=75 height=132 xoffset=7 yoffset=30 xadvance=88 page=0 chnl=15 +char id=350 x=1857 y=642 width=90 height=159 xoffset=8 yoffset=38 xadvance=106 page=0 chnl=15 +char id=351 x=1959 y=642 width=75 height=129 xoffset=7 yoffset=68 xadvance=88 page=0 chnl=15 +char id=377 x=2046 y=642 width=88 height=160 xoffset=9 yoffset=0 xadvance=105 page=0 chnl=15 +char id=378 x=2146 y=642 width=74 height=130 xoffset=9 yoffset=30 xadvance=91 page=0 chnl=15 +char id=379 x=2232 y=642 width=88 height=156 xoffset=9 yoffset=4 xadvance=105 page=0 chnl=15 +char id=380 x=2332 y=642 width=74 height=125 xoffset=9 yoffset=35 xadvance=91 page=0 chnl=15 +char id=1028 x=2418 y=642 width=95 height=124 xoffset=9 yoffset=38 xadvance=111 page=0 chnl=15 +char id=1030 x=2525 y=642 width=19 height=121 xoffset=13 yoffset=39 xadvance=44 page=0 chnl=15 +char id=1040 x=2556 y=642 width=108 height=121 xoffset=4 yoffset=39 xadvance=115 page=0 chnl=15 +char id=1041 x=2676 y=642 width=88 height=121 xoffset=13 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1042 x=2776 y=642 width=87 height=121 xoffset=13 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1043 x=2875 y=642 width=76 height=121 xoffset=13 yoffset=39 xadvance=95 page=0 chnl=15 +char id=1044 x=2963 y=642 width=116 height=151 xoffset=4 yoffset=39 xadvance=126 page=0 chnl=15 +char id=1045 x=3091 y=642 width=77 height=121 xoffset=13 yoffset=39 xadvance=99 page=0 chnl=15 +char id=1046 x=3180 y=642 width=156 height=121 xoffset=4 yoffset=39 xadvance=164 page=0 chnl=15 +char id=1047 x=3348 y=642 width=86 height=124 xoffset=10 yoffset=38 xadvance=106 page=0 chnl=15 +char id=1048 x=3446 y=642 width=98 height=121 xoffset=13 yoffset=39 xadvance=123 page=0 chnl=15 +char id=1049 x=3556 y=642 width=98 height=151 xoffset=13 yoffset=9 xadvance=123 page=0 chnl=15 +char id=1050 x=3666 y=642 width=94 height=121 xoffset=13 yoffset=39 xadvance=111 page=0 chnl=15 +char id=1051 x=3772 y=642 width=102 height=121 xoffset=4 yoffset=39 xadvance=118 page=0 chnl=15 +char id=1052 x=3886 y=642 width=123 height=121 xoffset=13 yoffset=39 xadvance=148 page=0 chnl=15 +char id=1053 x=6 y=854 width=97 height=121 xoffset=13 yoffset=39 xadvance=122 page=0 chnl=15 +char id=1054 x=115 y=854 width=109 height=124 xoffset=9 yoffset=38 xadvance=126 page=0 chnl=15 +char id=1055 x=236 y=854 width=94 height=121 xoffset=14 yoffset=39 xadvance=121 page=0 chnl=15 +char id=1056 x=342 y=854 width=85 height=121 xoffset=13 yoffset=39 xadvance=105 page=0 chnl=15 +char id=1057 x=439 y=854 width=105 height=124 xoffset=9 yoffset=38 xadvance=121 page=0 chnl=15 +char id=1058 x=556 y=854 width=94 height=121 xoffset=7 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1059 x=662 y=854 width=99 height=123 xoffset=3 yoffset=39 xadvance=105 page=0 chnl=15 +char id=1060 x=773 y=854 width=117 height=128 xoffset=9 yoffset=37 xadvance=134 page=0 chnl=15 +char id=1061 x=902 y=854 width=102 height=121 xoffset=4 yoffset=39 xadvance=110 page=0 chnl=15 +char id=1062 x=1016 y=854 width=107 height=150 xoffset=13 yoffset=39 xadvance=126 page=0 chnl=15 +char id=1063 x=1135 y=854 width=92 height=121 xoffset=15 yoffset=39 xadvance=120 page=0 chnl=15 +char id=1064 x=1239 y=854 width=134 height=121 xoffset=14 yoffset=39 xadvance=162 page=0 chnl=15 +char id=1065 x=1385 y=854 width=146 height=150 xoffset=14 yoffset=39 xadvance=166 page=0 chnl=15 +char id=1068 x=1543 y=854 width=88 height=121 xoffset=13 yoffset=39 xadvance=109 page=0 chnl=15 +char id=1070 x=1643 y=854 width=148 height=124 xoffset=13 yoffset=38 xadvance=166 page=0 chnl=15 +char id=1071 x=1803 y=854 width=90 height=121 xoffset=4 yoffset=39 xadvance=106 page=0 chnl=15 +char id=1072 x=1905 y=854 width=76 height=94 xoffset=7 yoffset=68 xadvance=94 page=0 chnl=15 +char id=1073 x=1993 y=854 width=84 height=126 xoffset=7 yoffset=36 xadvance=98 page=0 chnl=15 +char id=1074 x=2089 y=854 width=76 height=91 xoffset=11 yoffset=69 xadvance=93 page=0 chnl=15 +char id=1075 x=2177 y=854 width=59 height=91 xoffset=11 yoffset=69 xadvance=76 page=0 chnl=15 +char id=1076 x=2248 y=854 width=99 height=117 xoffset=2 yoffset=69 xadvance=105 page=0 chnl=15 +char id=1077 x=2359 y=854 width=83 height=94 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15 +char id=1078 x=2454 y=854 width=128 height=91 xoffset=6 yoffset=69 xadvance=139 page=0 chnl=15 +char id=1079 x=2594 y=854 width=72 height=94 xoffset=6 yoffset=68 xadvance=83 page=0 chnl=15 +char id=1080 x=2678 y=854 width=77 height=91 xoffset=11 yoffset=69 xadvance=99 page=0 chnl=15 +char id=1081 x=2767 y=854 width=77 height=121 xoffset=11 yoffset=39 xadvance=99 page=0 chnl=15 +char id=1082 x=2856 y=854 width=79 height=91 xoffset=11 yoffset=69 xadvance=91 page=0 chnl=15 +char id=1083 x=2947 y=854 width=83 height=91 xoffset=4 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1084 x=3042 y=854 width=103 height=91 xoffset=11 yoffset=69 xadvance=124 page=0 chnl=15 +char id=1085 x=3157 y=854 width=75 height=91 xoffset=11 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1086 x=3244 y=854 width=85 height=94 xoffset=7 yoffset=68 xadvance=99 page=0 chnl=15 +char id=1087 x=3341 y=854 width=75 height=91 xoffset=11 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1088 x=3428 y=854 width=84 height=126 xoffset=11 yoffset=68 xadvance=101 page=0 chnl=15 +char id=1089 x=3524 y=854 width=80 height=94 xoffset=7 yoffset=68 xadvance=93 page=0 chnl=15 +char id=1090 x=3616 y=854 width=77 height=91 xoffset=6 yoffset=69 xadvance=89 page=0 chnl=15 +char id=1091 x=3705 y=854 width=86 height=125 xoffset=4 yoffset=69 xadvance=93 page=0 chnl=15 +char id=1092 x=3803 y=854 width=104 height=152 xoffset=7 yoffset=39 xadvance=118 page=0 chnl=15 +char id=1093 x=3919 y=854 width=80 height=91 xoffset=6 yoffset=69 xadvance=91 page=0 chnl=15 +char id=1094 x=6 y=1066 width=92 height=121 xoffset=11 yoffset=69 xadvance=109 page=0 chnl=15 +char id=1095 x=110 y=1066 width=74 height=91 xoffset=11 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1096 x=196 y=1066 width=115 height=91 xoffset=11 yoffset=69 xadvance=137 page=0 chnl=15 +char id=1097 x=323 y=1066 width=130 height=117 xoffset=11 yoffset=69 xadvance=147 page=0 chnl=15 +char id=1100 x=465 y=1066 width=75 height=91 xoffset=11 yoffset=69 xadvance=93 page=0 chnl=15 +char id=1102 x=552 y=1066 width=122 height=94 xoffset=5 yoffset=68 xadvance=135 page=0 chnl=15 +char id=1103 x=686 y=1066 width=77 height=91 xoffset=6 yoffset=69 xadvance=93 page=0 chnl=15 +char id=1108 x=775 y=1066 width=80 height=94 xoffset=3 yoffset=68 xadvance=91 page=0 chnl=15 +char id=1110 x=867 y=1066 width=23 height=125 xoffset=9 yoffset=35 xadvance=41 page=0 chnl=15 +char id=1111 x=902 y=1066 width=56 height=125 xoffset=-7 yoffset=35 xadvance=41 page=0 chnl=15 +char id=8209 x=970 y=1066 width=54 height=16 xoffset=6 yoffset=101 xadvance=65 page=0 chnl=15 +char id=8211 x=1036 y=1066 width=83 height=16 xoffset=0 yoffset=101 xadvance=82 page=0 chnl=15 +char id=8212 x=1131 y=1066 width=166 height=16 xoffset=0 yoffset=101 xadvance=165 page=0 chnl=15 +char id=8217 x=1309 y=1066 width=24 height=42 xoffset=3 yoffset=39 xadvance=32 page=0 chnl=15 +char id=8220 x=1345 y=1066 width=54 height=42 xoffset=8 yoffset=36 xadvance=65 page=0 chnl=15 +char id=8221 x=1411 y=1066 width=54 height=42 xoffset=3 yoffset=39 xadvance=65 page=0 chnl=15 +char id=8222 x=1477 y=1066 width=54 height=42 xoffset=3 yoffset=144 xadvance=65 page=0 chnl=15 +char id=8226 x=1543 y=1066 width=53 height=52 xoffset=17 yoffset=86 xadvance=87 page=0 chnl=15 +char id=8364 x=1608 y=1066 width=98 height=124 xoffset=4 yoffset=38 xadvance=111 page=0 chnl=15 +char id=8627 x=1718 y=1066 width=133 height=105 xoffset=16 yoffset=39 xadvance=164 page=0 chnl=15 +char id=8679 x=1863 y=1066 width=146 height=130 xoffset=14 yoffset=30 xadvance=173 page=0 chnl=15 +char id=9003 x=2021 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=2206 y=1066 width=99 height=39 xoffset=11 yoffset=148 xadvance=121 page=0 chnl=15 +char id=9654 x=2317 y=1066 width=130 height=152 xoffset=16 yoffset=24 xadvance=153 page=0 chnl=15 +char id=9664 x=2459 y=1066 width=130 height=152 xoffset=8 yoffset=24 xadvance=153 page=0 chnl=15 +char id=9675 x=2601 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=2738 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=2875 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=2887 y=1066 width=116 height=86 xoffset=17 yoffset=62 xadvance=145 page=0 chnl=15 +char id=10004 x=3015 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=3027 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=3039 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=3051 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=3063 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Medium.png b/iqpilot/selfdrive/assets/fonts/Inter-Medium.png new file mode 100644 index 000000000..c70fe697b Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Medium.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Medium.ttf b/iqpilot/selfdrive/assets/fonts/Inter-Medium.ttf new file mode 100644 index 000000000..721147d83 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Medium.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Regular.fnt b/iqpilot/selfdrive/assets/fonts/Inter-Regular.fnt new file mode 100644 index 000000000..e4cdab188 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-Regular.fnt @@ -0,0 +1,254 @@ +info face="Inter-Regular" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-Regular.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=46 height=200 xoffset=0 yoffset=0 xadvance=46 page=0 chnl=15 +char id=33 x=76 y=6 width=22 height=122 xoffset=12 yoffset=39 xadvance=46 page=0 chnl=15 +char id=34 x=110 y=6 width=44 height=43 xoffset=11 yoffset=39 xadvance=66 page=0 chnl=15 +char id=35 x=166 y=6 width=100 height=121 xoffset=2 yoffset=39 xadvance=104 page=0 chnl=15 +char id=36 x=278 y=6 width=88 height=152 xoffset=9 yoffset=24 xadvance=105 page=0 chnl=15 +char id=37 x=378 y=6 width=108 height=124 xoffset=13 yoffset=38 xadvance=134 page=0 chnl=15 +char id=38 x=498 y=6 width=96 height=124 xoffset=8 yoffset=38 xadvance=105 page=0 chnl=15 +char id=39 x=606 y=6 width=14 height=43 xoffset=11 yoffset=39 xadvance=36 page=0 chnl=15 +char id=40 x=632 y=6 width=36 height=151 xoffset=17 yoffset=34 xadvance=59 page=0 chnl=15 +char id=41 x=680 y=6 width=36 height=151 xoffset=7 yoffset=34 xadvance=59 page=0 chnl=15 +char id=42 x=728 y=6 width=65 height=69 xoffset=9 yoffset=39 xadvance=82 page=0 chnl=15 +char id=43 x=805 y=6 width=79 height=78 xoffset=15 yoffset=74 xadvance=108 page=0 chnl=15 +char id=44 x=896 y=6 width=23 height=47 xoffset=11 yoffset=143 xadvance=46 page=0 chnl=15 +char id=45 x=931 y=6 width=54 height=13 xoffset=11 yoffset=102 xadvance=76 page=0 chnl=15 +char id=46 x=997 y=6 width=22 height=22 xoffset=12 yoffset=139 xadvance=45 page=0 chnl=15 +char id=47 x=1031 y=6 width=53 height=145 xoffset=3 yoffset=34 xadvance=58 page=0 chnl=15 +char id=48 x=1096 y=6 width=85 height=124 xoffset=9 yoffset=38 xadvance=103 page=0 chnl=15 +char id=49 x=1193 y=6 width=45 height=121 xoffset=10 yoffset=39 xadvance=76 page=0 chnl=15 +char id=50 x=1250 y=6 width=77 height=122 xoffset=12 yoffset=38 xadvance=100 page=0 chnl=15 +char id=51 x=1339 y=6 width=82 height=124 xoffset=12 yoffset=38 xadvance=105 page=0 chnl=15 +char id=52 x=1433 y=6 width=88 height=121 xoffset=9 yoffset=39 xadvance=106 page=0 chnl=15 +char id=53 x=1533 y=6 width=78 height=123 xoffset=12 yoffset=39 xadvance=100 page=0 chnl=15 +char id=54 x=1623 y=6 width=83 height=125 xoffset=10 yoffset=37 xadvance=103 page=0 chnl=15 +char id=55 x=1718 y=6 width=78 height=121 xoffset=7 yoffset=39 xadvance=94 page=0 chnl=15 +char id=56 x=1808 y=6 width=82 height=124 xoffset=10 yoffset=38 xadvance=101 page=0 chnl=15 +char id=57 x=1902 y=6 width=83 height=125 xoffset=10 yoffset=37 xadvance=103 page=0 chnl=15 +char id=58 x=1997 y=6 width=22 height=89 xoffset=12 yoffset=72 xadvance=45 page=0 chnl=15 +char id=59 x=2031 y=6 width=25 height=118 xoffset=11 yoffset=72 xadvance=46 page=0 chnl=15 +char id=60 x=2068 y=6 width=77 height=88 xoffset=16 yoffset=69 xadvance=108 page=0 chnl=15 +char id=61 x=2157 y=6 width=73 height=48 xoffset=18 yoffset=89 xadvance=108 page=0 chnl=15 +char id=62 x=2242 y=6 width=77 height=88 xoffset=16 yoffset=69 xadvance=108 page=0 chnl=15 +char id=63 x=2331 y=6 width=70 height=123 xoffset=6 yoffset=38 xadvance=83 page=0 chnl=15 +char id=64 x=2413 y=6 width=140 height=148 xoffset=7 yoffset=44 xadvance=154 page=0 chnl=15 +char id=65 x=2565 y=6 width=104 height=121 xoffset=4 yoffset=39 xadvance=111 page=0 chnl=15 +char id=66 x=2681 y=6 width=85 height=121 xoffset=14 yoffset=39 xadvance=107 page=0 chnl=15 +char id=67 x=2778 y=6 width=103 height=124 xoffset=9 yoffset=38 xadvance=120 page=0 chnl=15 +char id=68 x=2893 y=6 width=95 height=121 xoffset=14 yoffset=39 xadvance=118 page=0 chnl=15 +char id=69 x=3000 y=6 width=75 height=121 xoffset=14 yoffset=39 xadvance=98 page=0 chnl=15 +char id=70 x=3087 y=6 width=73 height=121 xoffset=14 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=3172 y=6 width=104 height=124 xoffset=9 yoffset=38 xadvance=122 page=0 chnl=15 +char id=72 x=3288 y=6 width=94 height=121 xoffset=14 yoffset=39 xadvance=122 page=0 chnl=15 +char id=73 x=3394 y=6 width=16 height=121 xoffset=14 yoffset=39 xadvance=43 page=0 chnl=15 +char id=74 x=3422 y=6 width=70 height=123 xoffset=6 yoffset=39 xadvance=89 page=0 chnl=15 +char id=75 x=3504 y=6 width=90 height=121 xoffset=14 yoffset=39 xadvance=107 page=0 chnl=15 +char id=76 x=3606 y=6 width=71 height=121 xoffset=14 yoffset=39 xadvance=92 page=0 chnl=15 +char id=77 x=3689 y=6 width=119 height=121 xoffset=14 yoffset=39 xadvance=146 page=0 chnl=15 +char id=78 x=3820 y=6 width=96 height=121 xoffset=14 yoffset=39 xadvance=124 page=0 chnl=15 +char id=79 x=3928 y=6 width=107 height=124 xoffset=9 yoffset=38 xadvance=125 page=0 chnl=15 +char id=80 x=6 y=218 width=83 height=121 xoffset=14 yoffset=39 xadvance=104 page=0 chnl=15 +char id=81 x=101 y=218 width=107 height=134 xoffset=9 yoffset=38 xadvance=125 page=0 chnl=15 +char id=82 x=220 y=218 width=87 height=121 xoffset=14 yoffset=39 xadvance=105 page=0 chnl=15 +char id=83 x=319 y=218 width=88 height=125 xoffset=9 yoffset=38 xadvance=105 page=0 chnl=15 +char id=84 x=419 y=218 width=92 height=121 xoffset=7 yoffset=39 xadvance=106 page=0 chnl=15 +char id=85 x=523 y=218 width=94 height=124 xoffset=14 yoffset=39 xadvance=122 page=0 chnl=15 +char id=86 x=629 y=218 width=104 height=121 xoffset=4 yoffset=39 xadvance=111 page=0 chnl=15 +char id=87 x=745 y=218 width=151 height=121 xoffset=3 yoffset=39 xadvance=156 page=0 chnl=15 +char id=88 x=908 y=218 width=98 height=121 xoffset=4 yoffset=39 xadvance=106 page=0 chnl=15 +char id=89 x=1018 y=218 width=102 height=121 xoffset=4 yoffset=39 xadvance=109 page=0 chnl=15 +char id=90 x=1132 y=218 width=85 height=121 xoffset=9 yoffset=39 xadvance=103 page=0 chnl=15 +char id=91 x=1229 y=218 width=36 height=151 xoffset=19 yoffset=34 xadvance=59 page=0 chnl=15 +char id=92 x=1277 y=218 width=53 height=145 xoffset=3 yoffset=34 xadvance=58 page=0 chnl=15 +char id=93 x=1342 y=218 width=36 height=151 xoffset=5 yoffset=34 xadvance=59 page=0 chnl=15 +char id=94 x=1390 y=218 width=65 height=52 xoffset=6 yoffset=43 xadvance=77 page=0 chnl=15 +char id=95 x=1467 y=218 width=76 height=13 xoffset=-1 yoffset=160 xadvance=74 page=0 chnl=15 +char id=96 x=1555 y=218 width=32 height=28 xoffset=25 yoffset=30 xadvance=82 page=0 chnl=15 +char id=97 x=1599 y=218 width=73 height=95 xoffset=8 yoffset=68 xadvance=93 page=0 chnl=15 +char id=98 x=1684 y=218 width=81 height=123 xoffset=14 yoffset=39 xadvance=102 page=0 chnl=15 +char id=99 x=1777 y=218 width=77 height=94 xoffset=8 yoffset=68 xadvance=92 page=0 chnl=15 +char id=100 x=1866 y=218 width=81 height=123 xoffset=8 yoffset=39 xadvance=102 page=0 chnl=15 +char id=101 x=1959 y=218 width=80 height=94 xoffset=8 yoffset=68 xadvance=96 page=0 chnl=15 +char id=102 x=2051 y=218 width=54 height=126 xoffset=4 yoffset=34 xadvance=59 page=0 chnl=15 +char id=103 x=2117 y=218 width=81 height=128 xoffset=8 yoffset=68 xadvance=100 page=0 chnl=15 +char id=104 x=2210 y=218 width=73 height=121 xoffset=12 yoffset=39 xadvance=97 page=0 chnl=15 +char id=105 x=2295 y=218 width=21 height=124 xoffset=9 yoffset=36 xadvance=39 page=0 chnl=15 +char id=106 x=2328 y=218 width=33 height=158 xoffset=-3 yoffset=36 xadvance=39 page=0 chnl=15 +char id=107 x=2373 y=218 width=76 height=121 xoffset=12 yoffset=39 xadvance=89 page=0 chnl=15 +char id=108 x=2461 y=218 width=15 height=121 xoffset=12 yoffset=39 xadvance=39 page=0 chnl=15 +char id=109 x=2488 y=218 width=119 height=92 xoffset=12 yoffset=68 xadvance=143 page=0 chnl=15 +char id=110 x=2619 y=218 width=73 height=92 xoffset=12 yoffset=68 xadvance=96 page=0 chnl=15 +char id=111 x=2704 y=218 width=83 height=94 xoffset=8 yoffset=68 xadvance=98 page=0 chnl=15 +char id=112 x=2799 y=218 width=81 height=126 xoffset=12 yoffset=68 xadvance=100 page=0 chnl=15 +char id=113 x=2892 y=218 width=81 height=126 xoffset=8 yoffset=68 xadvance=100 page=0 chnl=15 +char id=114 x=2985 y=218 width=46 height=92 xoffset=12 yoffset=68 xadvance=61 page=0 chnl=15 +char id=115 x=3043 y=218 width=71 height=94 xoffset=8 yoffset=68 xadvance=86 page=0 chnl=15 +char id=116 x=3126 y=218 width=49 height=114 xoffset=5 yoffset=48 xadvance=60 page=0 chnl=15 +char id=117 x=3187 y=218 width=72 height=93 xoffset=12 yoffset=69 xadvance=96 page=0 chnl=15 +char id=118 x=3271 y=218 width=82 height=91 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15 +char id=119 x=3365 y=218 width=124 height=91 xoffset=5 yoffset=69 xadvance=134 page=0 chnl=15 +char id=120 x=3501 y=218 width=76 height=91 xoffset=7 yoffset=69 xadvance=89 page=0 chnl=15 +char id=121 x=3589 y=218 width=82 height=125 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15 +char id=122 x=3683 y=218 width=71 height=91 xoffset=10 yoffset=69 xadvance=89 page=0 chnl=15 +char id=123 x=3766 y=218 width=49 height=151 xoffset=6 yoffset=34 xadvance=59 page=0 chnl=15 +char id=124 x=3827 y=218 width=12 height=198 xoffset=21 yoffset=1 xadvance=53 page=0 chnl=15 +char id=125 x=3851 y=218 width=49 height=151 xoffset=5 yoffset=34 xadvance=59 page=0 chnl=15 +char id=126 x=3912 y=218 width=83 height=31 xoffset=13 yoffset=97 xadvance=108 page=0 chnl=15 +char id=161 x=4007 y=218 width=22 height=122 xoffset=12 yoffset=69 xadvance=46 page=0 chnl=15 +char id=163 x=6 y=430 width=84 height=122 xoffset=10 yoffset=38 xadvance=104 page=0 chnl=15 +char id=165 x=102 y=430 width=87 height=121 xoffset=2 yoffset=39 xadvance=90 page=0 chnl=15 +char id=167 x=201 y=430 width=75 height=147 xoffset=8 yoffset=38 xadvance=91 page=0 chnl=15 +char id=171 x=288 y=430 width=66 height=73 xoffset=11 yoffset=75 xadvance=89 page=0 chnl=15 +char id=176 x=366 y=430 width=55 height=55 xoffset=10 yoffset=38 xadvance=75 page=0 chnl=15 +char id=187 x=433 y=430 width=66 height=73 xoffset=11 yoffset=75 xadvance=89 page=0 chnl=15 +char id=191 x=511 y=430 width=70 height=123 xoffset=8 yoffset=69 xadvance=83 page=0 chnl=15 +char id=192 x=593 y=430 width=104 height=160 xoffset=4 yoffset=0 xadvance=111 page=0 chnl=15 +char id=193 x=709 y=430 width=104 height=160 xoffset=4 yoffset=0 xadvance=111 page=0 chnl=15 +char id=195 x=825 y=430 width=104 height=155 xoffset=4 yoffset=5 xadvance=111 page=0 chnl=15 +char id=196 x=941 y=430 width=104 height=154 xoffset=4 yoffset=6 xadvance=111 page=0 chnl=15 +char id=199 x=1057 y=430 width=103 height=159 xoffset=9 yoffset=38 xadvance=120 page=0 chnl=15 +char id=201 x=1172 y=430 width=75 height=160 xoffset=14 yoffset=0 xadvance=98 page=0 chnl=15 +char id=202 x=1259 y=430 width=75 height=157 xoffset=14 yoffset=3 xadvance=98 page=0 chnl=15 +char id=205 x=1346 y=430 width=33 height=160 xoffset=14 yoffset=0 xadvance=43 page=0 chnl=15 +char id=209 x=1391 y=430 width=96 height=154 xoffset=14 yoffset=6 xadvance=124 page=0 chnl=15 +char id=211 x=1499 y=430 width=107 height=162 xoffset=9 yoffset=0 xadvance=125 page=0 chnl=15 +char id=212 x=1618 y=430 width=107 height=159 xoffset=9 yoffset=3 xadvance=125 page=0 chnl=15 +char id=214 x=1737 y=430 width=107 height=156 xoffset=9 yoffset=6 xadvance=125 page=0 chnl=15 +char id=215 x=1856 y=430 width=77 height=76 xoffset=16 yoffset=75 xadvance=108 page=0 chnl=15 +char id=218 x=1945 y=430 width=94 height=163 xoffset=14 yoffset=0 xadvance=122 page=0 chnl=15 +char id=220 x=2051 y=430 width=94 height=157 xoffset=14 yoffset=6 xadvance=122 page=0 chnl=15 +char id=223 x=2157 y=430 width=78 height=122 xoffset=14 yoffset=38 xadvance=100 page=0 chnl=15 +char id=224 x=2247 y=430 width=73 height=133 xoffset=8 yoffset=30 xadvance=93 page=0 chnl=15 +char id=225 x=2332 y=430 width=73 height=133 xoffset=8 yoffset=30 xadvance=93 page=0 chnl=15 +char id=226 x=2417 y=430 width=73 height=130 xoffset=8 yoffset=33 xadvance=93 page=0 chnl=15 +char id=227 x=2502 y=430 width=73 height=127 xoffset=8 yoffset=36 xadvance=93 page=0 chnl=15 +char id=228 x=2587 y=430 width=73 height=127 xoffset=8 yoffset=36 xadvance=93 page=0 chnl=15 +char id=231 x=2672 y=430 width=77 height=128 xoffset=8 yoffset=68 xadvance=92 page=0 chnl=15 +char id=232 x=2761 y=430 width=80 height=132 xoffset=8 yoffset=30 xadvance=96 page=0 chnl=15 +char id=233 x=2853 y=430 width=80 height=132 xoffset=8 yoffset=30 xadvance=96 page=0 chnl=15 +char id=234 x=2945 y=430 width=80 height=129 xoffset=8 yoffset=33 xadvance=96 page=0 chnl=15 +char id=237 x=3037 y=430 width=32 height=130 xoffset=12 yoffset=30 xadvance=39 page=0 chnl=15 +char id=238 x=3081 y=430 width=52 height=127 xoffset=-6 yoffset=33 xadvance=39 page=0 chnl=15 +char id=241 x=3145 y=430 width=73 height=124 xoffset=12 yoffset=36 xadvance=96 page=0 chnl=15 +char id=243 x=3230 y=430 width=83 height=132 xoffset=8 yoffset=30 xadvance=98 page=0 chnl=15 +char id=244 x=3325 y=430 width=83 height=129 xoffset=8 yoffset=33 xadvance=98 page=0 chnl=15 +char id=245 x=3420 y=430 width=83 height=126 xoffset=8 yoffset=36 xadvance=98 page=0 chnl=15 +char id=246 x=3515 y=430 width=83 height=126 xoffset=8 yoffset=36 xadvance=98 page=0 chnl=15 +char id=249 x=3610 y=430 width=72 height=132 xoffset=12 yoffset=30 xadvance=96 page=0 chnl=15 +char id=250 x=3694 y=430 width=72 height=132 xoffset=12 yoffset=30 xadvance=96 page=0 chnl=15 +char id=251 x=3778 y=430 width=72 height=129 xoffset=12 yoffset=33 xadvance=96 page=0 chnl=15 +char id=252 x=3862 y=430 width=72 height=126 xoffset=12 yoffset=36 xadvance=96 page=0 chnl=15 +char id=260 x=3946 y=430 width=105 height=157 xoffset=4 yoffset=39 xadvance=111 page=0 chnl=15 +char id=261 x=6 y=642 width=74 height=128 xoffset=8 yoffset=68 xadvance=93 page=0 chnl=15 +char id=262 x=92 y=642 width=103 height=162 xoffset=9 yoffset=0 xadvance=120 page=0 chnl=15 +char id=263 x=207 y=642 width=77 height=132 xoffset=8 yoffset=30 xadvance=92 page=0 chnl=15 +char id=280 x=296 y=642 width=76 height=157 xoffset=14 yoffset=39 xadvance=98 page=0 chnl=15 +char id=281 x=384 y=642 width=80 height=128 xoffset=8 yoffset=68 xadvance=96 page=0 chnl=15 +char id=286 x=476 y=642 width=104 height=153 xoffset=9 yoffset=9 xadvance=122 page=0 chnl=15 +char id=287 x=592 y=642 width=81 height=157 xoffset=8 yoffset=39 xadvance=100 page=0 chnl=15 +char id=304 x=685 y=642 width=21 height=154 xoffset=11 yoffset=6 xadvance=43 page=0 chnl=15 +char id=305 x=718 y=642 width=15 height=91 xoffset=12 yoffset=69 xadvance=39 page=0 chnl=15 +char id=321 x=745 y=642 width=82 height=121 xoffset=3 yoffset=39 xadvance=92 page=0 chnl=15 +char id=322 x=839 y=642 width=41 height=121 xoffset=-1 yoffset=39 xadvance=39 page=0 chnl=15 +char id=323 x=892 y=642 width=96 height=160 xoffset=14 yoffset=0 xadvance=124 page=0 chnl=15 +char id=324 x=1000 y=642 width=73 height=130 xoffset=12 yoffset=30 xadvance=96 page=0 chnl=15 +char id=339 x=1085 y=642 width=148 height=94 xoffset=8 yoffset=68 xadvance=163 page=0 chnl=15 +char id=346 x=1245 y=642 width=88 height=163 xoffset=9 yoffset=0 xadvance=105 page=0 chnl=15 +char id=347 x=1345 y=642 width=71 height=132 xoffset=8 yoffset=30 xadvance=86 page=0 chnl=15 +char id=350 x=1428 y=642 width=88 height=158 xoffset=9 yoffset=38 xadvance=105 page=0 chnl=15 +char id=351 x=1528 y=642 width=71 height=128 xoffset=8 yoffset=68 xadvance=86 page=0 chnl=15 +char id=377 x=1611 y=642 width=85 height=160 xoffset=9 yoffset=0 xadvance=103 page=0 chnl=15 +char id=378 x=1708 y=642 width=71 height=130 xoffset=10 yoffset=30 xadvance=89 page=0 chnl=15 +char id=379 x=1791 y=642 width=85 height=154 xoffset=9 yoffset=6 xadvance=103 page=0 chnl=15 +char id=380 x=1888 y=642 width=71 height=124 xoffset=10 yoffset=36 xadvance=89 page=0 chnl=15 +char id=1028 x=1971 y=642 width=92 height=124 xoffset=9 yoffset=38 xadvance=109 page=0 chnl=15 +char id=1030 x=2075 y=642 width=16 height=121 xoffset=14 yoffset=39 xadvance=43 page=0 chnl=15 +char id=1040 x=2103 y=642 width=104 height=121 xoffset=4 yoffset=39 xadvance=111 page=0 chnl=15 +char id=1041 x=2219 y=642 width=86 height=121 xoffset=14 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1042 x=2317 y=642 width=85 height=121 xoffset=14 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1043 x=2414 y=642 width=74 height=121 xoffset=14 yoffset=39 xadvance=95 page=0 chnl=15 +char id=1044 x=2500 y=642 width=113 height=151 xoffset=4 yoffset=39 xadvance=124 page=0 chnl=15 +char id=1045 x=2625 y=642 width=75 height=121 xoffset=14 yoffset=39 xadvance=98 page=0 chnl=15 +char id=1046 x=2712 y=642 width=149 height=121 xoffset=4 yoffset=39 xadvance=156 page=0 chnl=15 +char id=1047 x=2873 y=642 width=82 height=124 xoffset=12 yoffset=38 xadvance=105 page=0 chnl=15 +char id=1048 x=2967 y=642 width=96 height=121 xoffset=14 yoffset=39 xadvance=124 page=0 chnl=15 +char id=1049 x=3075 y=642 width=96 height=151 xoffset=14 yoffset=9 xadvance=124 page=0 chnl=15 +char id=1050 x=3183 y=642 width=89 height=121 xoffset=14 yoffset=39 xadvance=106 page=0 chnl=15 +char id=1051 x=3284 y=642 width=100 height=121 xoffset=4 yoffset=39 xadvance=117 page=0 chnl=15 +char id=1052 x=3396 y=642 width=119 height=121 xoffset=14 yoffset=39 xadvance=146 page=0 chnl=15 +char id=1053 x=3527 y=642 width=94 height=121 xoffset=14 yoffset=39 xadvance=122 page=0 chnl=15 +char id=1054 x=3633 y=642 width=107 height=124 xoffset=9 yoffset=38 xadvance=125 page=0 chnl=15 +char id=1055 x=3752 y=642 width=91 height=121 xoffset=14 yoffset=39 xadvance=119 page=0 chnl=15 +char id=1056 x=3855 y=642 width=83 height=121 xoffset=14 yoffset=39 xadvance=104 page=0 chnl=15 +char id=1057 x=3950 y=642 width=103 height=124 xoffset=9 yoffset=38 xadvance=120 page=0 chnl=15 +char id=1058 x=6 y=854 width=92 height=121 xoffset=7 yoffset=39 xadvance=106 page=0 chnl=15 +char id=1059 x=110 y=854 width=95 height=123 xoffset=4 yoffset=39 xadvance=103 page=0 chnl=15 +char id=1060 x=217 y=854 width=112 height=128 xoffset=9 yoffset=37 xadvance=130 page=0 chnl=15 +char id=1061 x=341 y=854 width=98 height=121 xoffset=4 yoffset=39 xadvance=106 page=0 chnl=15 +char id=1062 x=451 y=854 width=103 height=150 xoffset=14 yoffset=39 xadvance=124 page=0 chnl=15 +char id=1063 x=566 y=854 width=89 height=121 xoffset=15 yoffset=39 xadvance=118 page=0 chnl=15 +char id=1064 x=667 y=854 width=129 height=121 xoffset=14 yoffset=39 xadvance=157 page=0 chnl=15 +char id=1065 x=808 y=854 width=141 height=150 xoffset=14 yoffset=39 xadvance=161 page=0 chnl=15 +char id=1068 x=961 y=854 width=86 height=121 xoffset=14 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1070 x=1059 y=854 width=144 height=124 xoffset=14 yoffset=38 xadvance=167 page=0 chnl=15 +char id=1071 x=1215 y=854 width=88 height=121 xoffset=4 yoffset=39 xadvance=105 page=0 chnl=15 +char id=1072 x=1315 y=854 width=73 height=95 xoffset=8 yoffset=68 xadvance=93 page=0 chnl=15 +char id=1073 x=1400 y=854 width=81 height=126 xoffset=8 yoffset=36 xadvance=97 page=0 chnl=15 +char id=1074 x=1493 y=854 width=73 height=91 xoffset=12 yoffset=69 xadvance=92 page=0 chnl=15 +char id=1075 x=1578 y=854 width=57 height=91 xoffset=12 yoffset=69 xadvance=75 page=0 chnl=15 +char id=1076 x=1647 y=854 width=95 height=117 xoffset=3 yoffset=69 xadvance=103 page=0 chnl=15 +char id=1077 x=1754 y=854 width=80 height=94 xoffset=8 yoffset=68 xadvance=96 page=0 chnl=15 +char id=1078 x=1846 y=854 width=123 height=91 xoffset=7 yoffset=69 xadvance=136 page=0 chnl=15 +char id=1079 x=1981 y=854 width=68 height=94 xoffset=7 yoffset=68 xadvance=81 page=0 chnl=15 +char id=1080 x=2061 y=854 width=74 height=91 xoffset=12 yoffset=69 xadvance=98 page=0 chnl=15 +char id=1081 x=2147 y=854 width=74 height=121 xoffset=12 yoffset=39 xadvance=98 page=0 chnl=15 +char id=1082 x=2233 y=854 width=75 height=91 xoffset=12 yoffset=69 xadvance=88 page=0 chnl=15 +char id=1083 x=2320 y=854 width=81 height=91 xoffset=4 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1084 x=2413 y=854 width=100 height=91 xoffset=12 yoffset=69 xadvance=123 page=0 chnl=15 +char id=1085 x=2525 y=854 width=72 height=91 xoffset=12 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1086 x=2609 y=854 width=83 height=94 xoffset=8 yoffset=68 xadvance=98 page=0 chnl=15 +char id=1087 x=2704 y=854 width=72 height=91 xoffset=12 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1088 x=2788 y=854 width=81 height=126 xoffset=12 yoffset=68 xadvance=100 page=0 chnl=15 +char id=1089 x=2881 y=854 width=77 height=94 xoffset=8 yoffset=68 xadvance=92 page=0 chnl=15 +char id=1090 x=2970 y=854 width=74 height=91 xoffset=7 yoffset=69 xadvance=88 page=0 chnl=15 +char id=1091 x=3056 y=854 width=82 height=125 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15 +char id=1092 x=3150 y=854 width=96 height=152 xoffset=8 yoffset=39 xadvance=112 page=0 chnl=15 +char id=1093 x=3258 y=854 width=76 height=91 xoffset=7 yoffset=69 xadvance=89 page=0 chnl=15 +char id=1094 x=3346 y=854 width=86 height=121 xoffset=12 yoffset=69 xadvance=104 page=0 chnl=15 +char id=1095 x=3444 y=854 width=71 height=91 xoffset=12 yoffset=69 xadvance=94 page=0 chnl=15 +char id=1096 x=3527 y=854 width=111 height=91 xoffset=12 yoffset=69 xadvance=134 page=0 chnl=15 +char id=1097 x=3650 y=854 width=124 height=117 xoffset=12 yoffset=69 xadvance=143 page=0 chnl=15 +char id=1100 x=3786 y=854 width=72 height=91 xoffset=12 yoffset=69 xadvance=91 page=0 chnl=15 +char id=1102 x=3870 y=854 width=119 height=94 xoffset=6 yoffset=68 xadvance=134 page=0 chnl=15 +char id=1103 x=4001 y=854 width=75 height=91 xoffset=6 yoffset=69 xadvance=92 page=0 chnl=15 +char id=1108 x=6 y=1066 width=77 height=94 xoffset=2 yoffset=68 xadvance=89 page=0 chnl=15 +char id=1110 x=95 y=1066 width=21 height=124 xoffset=9 yoffset=36 xadvance=39 page=0 chnl=15 +char id=1111 x=128 y=1066 width=54 height=124 xoffset=-7 yoffset=36 xadvance=39 page=0 chnl=15 +char id=8209 x=194 y=1066 width=53 height=13 xoffset=3 yoffset=102 xadvance=59 page=0 chnl=15 +char id=8211 x=259 y=1066 width=83 height=13 xoffset=0 yoffset=102 xadvance=82 page=0 chnl=15 +char id=8212 x=354 y=1066 width=166 height=13 xoffset=0 yoffset=102 xadvance=165 page=0 chnl=15 +char id=8217 x=532 y=1066 width=23 height=41 xoffset=2 yoffset=39 xadvance=30 page=0 chnl=15 +char id=8220 x=567 y=1066 width=54 height=41 xoffset=7 yoffset=37 xadvance=62 page=0 chnl=15 +char id=8221 x=633 y=1066 width=53 height=41 xoffset=2 yoffset=39 xadvance=62 page=0 chnl=15 +char id=8222 x=698 y=1066 width=53 height=42 xoffset=2 yoffset=144 xadvance=62 page=0 chnl=15 +char id=8226 x=763 y=1066 width=53 height=52 xoffset=20 yoffset=86 xadvance=92 page=0 chnl=15 +char id=8364 x=828 y=1066 width=96 height=124 xoffset=4 yoffset=38 xadvance=109 page=0 chnl=15 +char id=8627 x=936 y=1066 width=131 height=104 xoffset=16 yoffset=39 xadvance=162 page=0 chnl=15 +char id=8679 x=1079 y=1066 width=139 height=130 xoffset=15 yoffset=30 xadvance=169 page=0 chnl=15 +char id=9003 x=1230 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=1415 y=1066 width=96 height=38 xoffset=12 yoffset=148 xadvance=119 page=0 chnl=15 +char id=9654 x=1523 y=1066 width=129 height=152 xoffset=15 yoffset=24 xadvance=151 page=0 chnl=15 +char id=9664 x=1664 y=1066 width=129 height=152 xoffset=7 yoffset=24 xadvance=151 page=0 chnl=15 +char id=9675 x=1805 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=1942 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=2079 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=2091 y=1066 width=114 height=83 xoffset=17 yoffset=63 xadvance=145 page=0 chnl=15 +char id=10004 x=2217 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=2229 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=2241 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=2253 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=2265 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Regular.png b/iqpilot/selfdrive/assets/fonts/Inter-Regular.png new file mode 100644 index 000000000..771fae955 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Regular.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Regular.ttf b/iqpilot/selfdrive/assets/fonts/Inter-Regular.ttf new file mode 100644 index 000000000..96fd6a12d Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Regular.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.fnt b/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.fnt new file mode 100644 index 000000000..02a2923f9 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.fnt @@ -0,0 +1,254 @@ +info face="Inter-SemiBold" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-SemiBold.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=41 height=200 xoffset=0 yoffset=0 xadvance=41 page=0 chnl=15 +char id=33 x=71 y=6 width=27 height=123 xoffset=12 yoffset=39 xadvance=51 page=0 chnl=15 +char id=34 x=110 y=6 width=47 height=46 xoffset=9 yoffset=39 xadvance=65 page=0 chnl=15 +char id=35 x=169 y=6 width=103 height=121 xoffset=2 yoffset=39 xadvance=106 page=0 chnl=15 +char id=36 x=284 y=6 width=93 height=152 xoffset=7 yoffset=24 xadvance=107 page=0 chnl=15 +char id=37 x=389 y=6 width=113 height=128 xoffset=13 yoffset=36 xadvance=139 page=0 chnl=15 +char id=38 x=514 y=6 width=102 height=124 xoffset=7 yoffset=38 xadvance=109 page=0 chnl=15 +char id=39 x=628 y=6 width=17 height=46 xoffset=9 yoffset=39 xadvance=35 page=0 chnl=15 +char id=40 x=657 y=6 width=44 height=150 xoffset=16 yoffset=36 xadvance=65 page=0 chnl=15 +char id=41 x=713 y=6 width=44 height=150 xoffset=5 yoffset=36 xadvance=65 page=0 chnl=15 +char id=42 x=769 y=6 width=67 height=69 xoffset=11 yoffset=39 xadvance=89 page=0 chnl=15 +char id=43 x=848 y=6 width=83 height=82 xoffset=14 yoffset=71 xadvance=111 page=0 chnl=15 +char id=44 x=943 y=6 width=27 height=47 xoffset=9 yoffset=143 xadvance=48 page=0 chnl=15 +char id=45 x=982 y=6 width=55 height=18 xoffset=11 yoffset=101 xadvance=76 page=0 chnl=15 +char id=46 x=1049 y=6 width=26 height=27 xoffset=11 yoffset=135 xadvance=48 page=0 chnl=15 +char id=47 x=1087 y=6 width=58 height=145 xoffset=2 yoffset=34 xadvance=62 page=0 chnl=15 +char id=48 x=1157 y=6 width=94 height=125 xoffset=8 yoffset=38 xadvance=110 page=0 chnl=15 +char id=49 x=1263 y=6 width=52 height=121 xoffset=8 yoffset=39 xadvance=79 page=0 chnl=15 +char id=50 x=1327 y=6 width=85 height=122 xoffset=9 yoffset=38 xadvance=102 page=0 chnl=15 +char id=51 x=1424 y=6 width=90 height=124 xoffset=9 yoffset=38 xadvance=107 page=0 chnl=15 +char id=52 x=1526 y=6 width=94 height=121 xoffset=8 yoffset=39 xadvance=110 page=0 chnl=15 +char id=53 x=1632 y=6 width=86 height=123 xoffset=10 yoffset=39 xadvance=104 page=0 chnl=15 +char id=54 x=1730 y=6 width=91 height=125 xoffset=8 yoffset=37 xadvance=107 page=0 chnl=15 +char id=55 x=1833 y=6 width=83 height=121 xoffset=6 yoffset=39 xadvance=97 page=0 chnl=15 +char id=56 x=1928 y=6 width=91 height=124 xoffset=8 yoffset=38 xadvance=106 page=0 chnl=15 +char id=57 x=2031 y=6 width=90 height=125 xoffset=9 yoffset=37 xadvance=107 page=0 chnl=15 +char id=58 x=2133 y=6 width=26 height=91 xoffset=11 yoffset=71 xadvance=48 page=0 chnl=15 +char id=59 x=2171 y=6 width=31 height=119 xoffset=9 yoffset=71 xadvance=48 page=0 chnl=15 +char id=60 x=2214 y=6 width=81 height=92 xoffset=15 yoffset=66 xadvance=111 page=0 chnl=15 +char id=61 x=2307 y=6 width=79 height=57 xoffset=16 yoffset=84 xadvance=111 page=0 chnl=15 +char id=62 x=2398 y=6 width=81 height=92 xoffset=15 yoffset=66 xadvance=111 page=0 chnl=15 +char id=63 x=2491 y=6 width=77 height=124 xoffset=6 yoffset=38 xadvance=89 page=0 chnl=15 +char id=64 x=2580 y=6 width=149 height=153 xoffset=9 yoffset=41 xadvance=165 page=0 chnl=15 +char id=65 x=2741 y=6 width=112 height=121 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15 +char id=66 x=2865 y=6 width=91 height=121 xoffset=11 yoffset=39 xadvance=108 page=0 chnl=15 +char id=67 x=2968 y=6 width=107 height=124 xoffset=8 yoffset=38 xadvance=122 page=0 chnl=15 +char id=68 x=3087 y=6 width=100 height=121 xoffset=11 yoffset=39 xadvance=119 page=0 chnl=15 +char id=69 x=3199 y=6 width=80 height=121 xoffset=11 yoffset=39 xadvance=100 page=0 chnl=15 +char id=70 x=3291 y=6 width=78 height=121 xoffset=11 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=3381 y=6 width=108 height=124 xoffset=8 yoffset=38 xadvance=124 page=0 chnl=15 +char id=72 x=3501 y=6 width=101 height=121 xoffset=11 yoffset=39 xadvance=122 page=0 chnl=15 +char id=73 x=3614 y=6 width=23 height=121 xoffset=11 yoffset=39 xadvance=45 page=0 chnl=15 +char id=74 x=3649 y=6 width=77 height=123 xoffset=4 yoffset=39 xadvance=92 page=0 chnl=15 +char id=75 x=3738 y=6 width=98 height=121 xoffset=11 yoffset=39 xadvance=111 page=0 chnl=15 +char id=76 x=3848 y=6 width=76 height=121 xoffset=11 yoffset=39 xadvance=93 page=0 chnl=15 +char id=77 x=3936 y=6 width=127 height=121 xoffset=11 yoffset=39 xadvance=149 page=0 chnl=15 +char id=78 x=6 y=218 width=100 height=121 xoffset=11 yoffset=39 xadvance=122 page=0 chnl=15 +char id=79 x=118 y=218 width=112 height=124 xoffset=8 yoffset=38 xadvance=128 page=0 chnl=15 +char id=80 x=242 y=218 width=89 height=121 xoffset=11 yoffset=39 xadvance=106 page=0 chnl=15 +char id=81 x=343 y=218 width=112 height=133 xoffset=8 yoffset=38 xadvance=128 page=0 chnl=15 +char id=82 x=467 y=218 width=93 height=121 xoffset=11 yoffset=39 xadvance=107 page=0 chnl=15 +char id=83 x=572 y=218 width=93 height=124 xoffset=7 yoffset=38 xadvance=107 page=0 chnl=15 +char id=84 x=677 y=218 width=97 height=121 xoffset=6 yoffset=39 xadvance=109 page=0 chnl=15 +char id=85 x=786 y=218 width=99 height=123 xoffset=11 yoffset=39 xadvance=121 page=0 chnl=15 +char id=86 x=897 y=218 width=112 height=121 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15 +char id=87 x=1021 y=218 width=161 height=121 xoffset=3 yoffset=39 xadvance=166 page=0 chnl=15 +char id=88 x=1194 y=218 width=106 height=121 xoffset=4 yoffset=39 xadvance=114 page=0 chnl=15 +char id=89 x=1312 y=218 width=110 height=121 xoffset=3 yoffset=39 xadvance=116 page=0 chnl=15 +char id=90 x=1434 y=218 width=90 height=121 xoffset=9 yoffset=39 xadvance=107 page=0 chnl=15 +char id=91 x=1536 y=218 width=43 height=150 xoffset=18 yoffset=36 xadvance=65 page=0 chnl=15 +char id=92 x=1591 y=218 width=58 height=145 xoffset=2 yoffset=34 xadvance=62 page=0 chnl=15 +char id=93 x=1661 y=218 width=43 height=150 xoffset=4 yoffset=36 xadvance=65 page=0 chnl=15 +char id=94 x=1716 y=218 width=69 height=53 xoffset=5 yoffset=42 xadvance=79 page=0 chnl=15 +char id=95 x=1797 y=218 width=79 height=17 xoffset=-1 yoffset=160 xadvance=77 page=0 chnl=15 +char id=96 x=1888 y=218 width=35 height=28 xoffset=24 yoffset=31 xadvance=82 page=0 chnl=15 +char id=97 x=1935 y=218 width=79 height=94 xoffset=6 yoffset=68 xadvance=94 page=0 chnl=15 +char id=98 x=2026 y=218 width=86 height=123 xoffset=11 yoffset=39 xadvance=104 page=0 chnl=15 +char id=99 x=2124 y=218 width=82 height=94 xoffset=7 yoffset=68 xadvance=95 page=0 chnl=15 +char id=100 x=2218 y=218 width=86 height=123 xoffset=7 yoffset=39 xadvance=104 page=0 chnl=15 +char id=101 x=2316 y=218 width=84 height=94 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15 +char id=102 x=2412 y=218 width=58 height=126 xoffset=3 yoffset=34 xadvance=62 page=0 chnl=15 +char id=103 x=2482 y=218 width=86 height=128 xoffset=7 yoffset=68 xadvance=103 page=0 chnl=15 +char id=104 x=2580 y=218 width=81 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15 +char id=105 x=2673 y=218 width=25 height=126 xoffset=9 yoffset=34 xadvance=43 page=0 chnl=15 +char id=106 x=2710 y=218 width=38 height=160 xoffset=-4 yoffset=34 xadvance=43 page=0 chnl=15 +char id=107 x=2760 y=218 width=83 height=121 xoffset=10 yoffset=39 xadvance=94 page=0 chnl=15 +char id=108 x=2855 y=218 width=23 height=121 xoffset=10 yoffset=39 xadvance=43 page=0 chnl=15 +char id=109 x=2890 y=218 width=128 height=92 xoffset=10 yoffset=68 xadvance=148 page=0 chnl=15 +char id=110 x=3030 y=218 width=81 height=92 xoffset=10 yoffset=68 xadvance=100 page=0 chnl=15 +char id=111 x=3123 y=218 width=87 height=94 xoffset=7 yoffset=68 xadvance=100 page=0 chnl=15 +char id=112 x=3222 y=218 width=87 height=126 xoffset=10 yoffset=68 xadvance=103 page=0 chnl=15 +char id=113 x=3321 y=218 width=86 height=126 xoffset=7 yoffset=68 xadvance=103 page=0 chnl=15 +char id=114 x=3419 y=218 width=53 height=92 xoffset=10 yoffset=68 xadvance=65 page=0 chnl=15 +char id=115 x=3484 y=218 width=79 height=94 xoffset=6 yoffset=68 xadvance=90 page=0 chnl=15 +char id=116 x=3575 y=218 width=54 height=114 xoffset=4 yoffset=48 xadvance=62 page=0 chnl=15 +char id=117 x=3641 y=218 width=80 height=93 xoffset=10 yoffset=69 xadvance=100 page=0 chnl=15 +char id=118 x=3733 y=218 width=89 height=91 xoffset=3 yoffset=69 xadvance=95 page=0 chnl=15 +char id=119 x=3834 y=218 width=131 height=91 xoffset=4 yoffset=69 xadvance=138 page=0 chnl=15 +char id=120 x=3977 y=218 width=83 height=91 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15 +char id=121 x=6 y=430 width=89 height=125 xoffset=3 yoffset=69 xadvance=95 page=0 chnl=15 +char id=122 x=107 y=430 width=75 height=91 xoffset=9 yoffset=69 xadvance=92 page=0 chnl=15 +char id=123 x=194 y=430 width=56 height=150 xoffset=5 yoffset=36 xadvance=65 page=0 chnl=15 +char id=124 x=262 y=430 width=21 height=198 xoffset=19 yoffset=1 xadvance=59 page=0 chnl=15 +char id=125 x=295 y=430 width=56 height=150 xoffset=4 yoffset=36 xadvance=65 page=0 chnl=15 +char id=126 x=363 y=430 width=87 height=36 xoffset=12 yoffset=94 xadvance=111 page=0 chnl=15 +char id=161 x=462 y=430 width=27 height=123 xoffset=12 yoffset=68 xadvance=51 page=0 chnl=15 +char id=163 x=501 y=430 width=88 height=122 xoffset=10 yoffset=38 xadvance=108 page=0 chnl=15 +char id=165 x=601 y=430 width=89 height=121 xoffset=2 yoffset=39 xadvance=93 page=0 chnl=15 +char id=167 x=702 y=430 width=80 height=147 xoffset=8 yoffset=38 xadvance=95 page=0 chnl=15 +char id=171 x=794 y=430 width=79 height=73 xoffset=10 yoffset=75 xadvance=98 page=0 chnl=15 +char id=176 x=885 y=430 width=58 height=58 xoffset=9 yoffset=38 xadvance=75 page=0 chnl=15 +char id=187 x=955 y=430 width=80 height=73 xoffset=9 yoffset=75 xadvance=99 page=0 chnl=15 +char id=191 x=1047 y=430 width=77 height=124 xoffset=7 yoffset=69 xadvance=89 page=0 chnl=15 +char id=192 x=1136 y=430 width=112 height=159 xoffset=4 yoffset=1 xadvance=119 page=0 chnl=15 +char id=193 x=1260 y=430 width=112 height=159 xoffset=4 yoffset=1 xadvance=119 page=0 chnl=15 +char id=195 x=1384 y=430 width=112 height=156 xoffset=4 yoffset=4 xadvance=119 page=0 chnl=15 +char id=196 x=1508 y=430 width=112 height=156 xoffset=4 yoffset=4 xadvance=119 page=0 chnl=15 +char id=199 x=1632 y=430 width=107 height=160 xoffset=8 yoffset=38 xadvance=122 page=0 chnl=15 +char id=201 x=1751 y=430 width=80 height=159 xoffset=11 yoffset=1 xadvance=100 page=0 chnl=15 +char id=202 x=1843 y=430 width=80 height=158 xoffset=11 yoffset=2 xadvance=100 page=0 chnl=15 +char id=205 x=1935 y=430 width=38 height=159 xoffset=11 yoffset=1 xadvance=45 page=0 chnl=15 +char id=209 x=1985 y=430 width=100 height=155 xoffset=11 yoffset=5 xadvance=122 page=0 chnl=15 +char id=211 x=2097 y=430 width=112 height=161 xoffset=8 yoffset=1 xadvance=128 page=0 chnl=15 +char id=212 x=2221 y=430 width=112 height=160 xoffset=8 yoffset=2 xadvance=128 page=0 chnl=15 +char id=214 x=2345 y=430 width=112 height=158 xoffset=8 yoffset=4 xadvance=128 page=0 chnl=15 +char id=215 x=2469 y=430 width=83 height=83 xoffset=14 yoffset=71 xadvance=111 page=0 chnl=15 +char id=218 x=2564 y=430 width=99 height=161 xoffset=11 yoffset=1 xadvance=121 page=0 chnl=15 +char id=220 x=2675 y=430 width=99 height=158 xoffset=11 yoffset=4 xadvance=121 page=0 chnl=15 +char id=223 x=2786 y=430 width=89 height=122 xoffset=11 yoffset=38 xadvance=106 page=0 chnl=15 +char id=224 x=2887 y=430 width=79 height=131 xoffset=6 yoffset=31 xadvance=94 page=0 chnl=15 +char id=225 x=2978 y=430 width=79 height=131 xoffset=6 yoffset=31 xadvance=94 page=0 chnl=15 +char id=226 x=3069 y=430 width=79 height=130 xoffset=6 yoffset=32 xadvance=94 page=0 chnl=15 +char id=227 x=3160 y=430 width=79 height=127 xoffset=6 yoffset=35 xadvance=94 page=0 chnl=15 +char id=228 x=3251 y=430 width=79 height=128 xoffset=6 yoffset=34 xadvance=94 page=0 chnl=15 +char id=231 x=3342 y=430 width=82 height=130 xoffset=7 yoffset=68 xadvance=95 page=0 chnl=15 +char id=232 x=3436 y=430 width=84 height=131 xoffset=7 yoffset=31 xadvance=97 page=0 chnl=15 +char id=233 x=3532 y=430 width=84 height=131 xoffset=7 yoffset=31 xadvance=97 page=0 chnl=15 +char id=234 x=3628 y=430 width=84 height=130 xoffset=7 yoffset=32 xadvance=97 page=0 chnl=15 +char id=237 x=3724 y=430 width=38 height=129 xoffset=10 yoffset=31 xadvance=43 page=0 chnl=15 +char id=238 x=3774 y=430 width=62 height=128 xoffset=-9 yoffset=32 xadvance=43 page=0 chnl=15 +char id=241 x=3848 y=430 width=81 height=125 xoffset=10 yoffset=35 xadvance=100 page=0 chnl=15 +char id=243 x=3941 y=430 width=87 height=131 xoffset=7 yoffset=31 xadvance=100 page=0 chnl=15 +char id=244 x=6 y=642 width=87 height=130 xoffset=7 yoffset=32 xadvance=100 page=0 chnl=15 +char id=245 x=105 y=642 width=87 height=127 xoffset=7 yoffset=35 xadvance=100 page=0 chnl=15 +char id=246 x=204 y=642 width=87 height=128 xoffset=7 yoffset=34 xadvance=100 page=0 chnl=15 +char id=249 x=303 y=642 width=80 height=131 xoffset=10 yoffset=31 xadvance=100 page=0 chnl=15 +char id=250 x=395 y=642 width=80 height=131 xoffset=10 yoffset=31 xadvance=100 page=0 chnl=15 +char id=251 x=487 y=642 width=80 height=130 xoffset=10 yoffset=32 xadvance=100 page=0 chnl=15 +char id=252 x=579 y=642 width=80 height=128 xoffset=10 yoffset=34 xadvance=100 page=0 chnl=15 +char id=260 x=671 y=642 width=114 height=156 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15 +char id=261 x=797 y=642 width=81 height=127 xoffset=6 yoffset=68 xadvance=94 page=0 chnl=15 +char id=262 x=890 y=642 width=107 height=161 xoffset=8 yoffset=1 xadvance=122 page=0 chnl=15 +char id=263 x=1009 y=642 width=82 height=131 xoffset=7 yoffset=31 xadvance=95 page=0 chnl=15 +char id=280 x=1103 y=642 width=82 height=156 xoffset=11 yoffset=39 xadvance=100 page=0 chnl=15 +char id=281 x=1197 y=642 width=84 height=125 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15 +char id=286 x=1293 y=642 width=108 height=154 xoffset=8 yoffset=8 xadvance=124 page=0 chnl=15 +char id=287 x=1413 y=642 width=86 height=158 xoffset=7 yoffset=38 xadvance=103 page=0 chnl=15 +char id=304 x=1511 y=642 width=26 height=157 xoffset=10 yoffset=3 xadvance=45 page=0 chnl=15 +char id=305 x=1549 y=642 width=23 height=91 xoffset=10 yoffset=69 xadvance=43 page=0 chnl=15 +char id=321 x=1584 y=642 width=88 height=121 xoffset=2 yoffset=39 xadvance=95 page=0 chnl=15 +char id=322 x=1684 y=642 width=45 height=121 xoffset=-1 yoffset=39 xadvance=43 page=0 chnl=15 +char id=323 x=1741 y=642 width=100 height=159 xoffset=11 yoffset=1 xadvance=122 page=0 chnl=15 +char id=324 x=1853 y=642 width=81 height=129 xoffset=10 yoffset=31 xadvance=100 page=0 chnl=15 +char id=339 x=1946 y=642 width=150 height=94 xoffset=7 yoffset=68 xadvance=162 page=0 chnl=15 +char id=346 x=2108 y=642 width=93 height=161 xoffset=7 yoffset=1 xadvance=107 page=0 chnl=15 +char id=347 x=2213 y=642 width=79 height=131 xoffset=6 yoffset=31 xadvance=90 page=0 chnl=15 +char id=350 x=2304 y=642 width=93 height=160 xoffset=7 yoffset=38 xadvance=107 page=0 chnl=15 +char id=351 x=2409 y=642 width=79 height=130 xoffset=6 yoffset=68 xadvance=90 page=0 chnl=15 +char id=377 x=2500 y=642 width=90 height=159 xoffset=9 yoffset=1 xadvance=107 page=0 chnl=15 +char id=378 x=2602 y=642 width=75 height=129 xoffset=9 yoffset=31 xadvance=92 page=0 chnl=15 +char id=379 x=2689 y=642 width=90 height=157 xoffset=9 yoffset=3 xadvance=107 page=0 chnl=15 +char id=380 x=2791 y=642 width=75 height=126 xoffset=9 yoffset=34 xadvance=92 page=0 chnl=15 +char id=1028 x=2878 y=642 width=98 height=124 xoffset=8 yoffset=38 xadvance=113 page=0 chnl=15 +char id=1030 x=2988 y=642 width=23 height=121 xoffset=11 yoffset=39 xadvance=45 page=0 chnl=15 +char id=1040 x=3023 y=642 width=112 height=121 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15 +char id=1041 x=3147 y=642 width=90 height=121 xoffset=11 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1042 x=3249 y=642 width=91 height=121 xoffset=11 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1043 x=3352 y=642 width=79 height=121 xoffset=11 yoffset=39 xadvance=95 page=0 chnl=15 +char id=1044 x=3443 y=642 width=119 height=150 xoffset=4 yoffset=39 xadvance=128 page=0 chnl=15 +char id=1045 x=3574 y=642 width=80 height=121 xoffset=11 yoffset=39 xadvance=100 page=0 chnl=15 +char id=1046 x=3666 y=642 width=164 height=121 xoffset=4 yoffset=39 xadvance=171 page=0 chnl=15 +char id=1047 x=3842 y=642 width=90 height=124 xoffset=9 yoffset=38 xadvance=107 page=0 chnl=15 +char id=1048 x=3944 y=642 width=100 height=121 xoffset=11 yoffset=39 xadvance=122 page=0 chnl=15 +char id=1049 x=6 y=854 width=100 height=152 xoffset=11 yoffset=8 xadvance=122 page=0 chnl=15 +char id=1050 x=118 y=854 width=102 height=121 xoffset=11 yoffset=39 xadvance=116 page=0 chnl=15 +char id=1051 x=232 y=854 width=104 height=121 xoffset=4 yoffset=39 xadvance=119 page=0 chnl=15 +char id=1052 x=348 y=854 width=127 height=121 xoffset=11 yoffset=39 xadvance=149 page=0 chnl=15 +char id=1053 x=487 y=854 width=101 height=121 xoffset=11 yoffset=39 xadvance=122 page=0 chnl=15 +char id=1054 x=600 y=854 width=112 height=124 xoffset=8 yoffset=38 xadvance=128 page=0 chnl=15 +char id=1055 x=724 y=854 width=96 height=121 xoffset=14 yoffset=39 xadvance=124 page=0 chnl=15 +char id=1056 x=832 y=854 width=89 height=121 xoffset=11 yoffset=39 xadvance=106 page=0 chnl=15 +char id=1057 x=933 y=854 width=107 height=124 xoffset=8 yoffset=38 xadvance=122 page=0 chnl=15 +char id=1058 x=1052 y=854 width=97 height=121 xoffset=6 yoffset=39 xadvance=109 page=0 chnl=15 +char id=1059 x=1161 y=854 width=102 height=123 xoffset=3 yoffset=39 xadvance=108 page=0 chnl=15 +char id=1060 x=1275 y=854 width=122 height=128 xoffset=8 yoffset=37 xadvance=138 page=0 chnl=15 +char id=1061 x=1409 y=854 width=106 height=121 xoffset=4 yoffset=39 xadvance=114 page=0 chnl=15 +char id=1062 x=1527 y=854 width=113 height=150 xoffset=11 yoffset=39 xadvance=128 page=0 chnl=15 +char id=1063 x=1652 y=854 width=94 height=121 xoffset=15 yoffset=39 xadvance=123 page=0 chnl=15 +char id=1064 x=1758 y=854 width=138 height=121 xoffset=15 yoffset=39 xadvance=167 page=0 chnl=15 +char id=1065 x=1908 y=854 width=151 height=150 xoffset=15 yoffset=39 xadvance=171 page=0 chnl=15 +char id=1068 x=2071 y=854 width=90 height=121 xoffset=12 yoffset=39 xadvance=110 page=0 chnl=15 +char id=1070 x=2173 y=854 width=153 height=124 xoffset=11 yoffset=38 xadvance=166 page=0 chnl=15 +char id=1071 x=2338 y=854 width=93 height=121 xoffset=3 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1072 x=2443 y=854 width=79 height=94 xoffset=6 yoffset=68 xadvance=94 page=0 chnl=15 +char id=1073 x=2534 y=854 width=86 height=126 xoffset=7 yoffset=36 xadvance=100 page=0 chnl=15 +char id=1074 x=2632 y=854 width=78 height=91 xoffset=10 yoffset=69 xadvance=94 page=0 chnl=15 +char id=1075 x=2722 y=854 width=61 height=91 xoffset=10 yoffset=69 xadvance=76 page=0 chnl=15 +char id=1076 x=2795 y=854 width=102 height=118 xoffset=2 yoffset=69 xadvance=108 page=0 chnl=15 +char id=1077 x=2909 y=854 width=84 height=94 xoffset=7 yoffset=68 xadvance=97 page=0 chnl=15 +char id=1078 x=3005 y=854 width=133 height=91 xoffset=5 yoffset=69 xadvance=142 page=0 chnl=15 +char id=1079 x=3150 y=854 width=75 height=94 xoffset=5 yoffset=68 xadvance=85 page=0 chnl=15 +char id=1080 x=3237 y=854 width=80 height=91 xoffset=10 yoffset=69 xadvance=100 page=0 chnl=15 +char id=1081 x=3329 y=854 width=80 height=122 xoffset=10 yoffset=38 xadvance=100 page=0 chnl=15 +char id=1082 x=3421 y=854 width=83 height=91 xoffset=10 yoffset=69 xadvance=94 page=0 chnl=15 +char id=1083 x=3516 y=854 width=85 height=91 xoffset=4 yoffset=69 xadvance=99 page=0 chnl=15 +char id=1084 x=3613 y=854 width=106 height=91 xoffset=10 yoffset=69 xadvance=125 page=0 chnl=15 +char id=1085 x=3731 y=854 width=77 height=91 xoffset=10 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1086 x=3820 y=854 width=87 height=94 xoffset=7 yoffset=68 xadvance=100 page=0 chnl=15 +char id=1087 x=3919 y=854 width=78 height=91 xoffset=10 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1088 x=6 y=1066 width=87 height=126 xoffset=10 yoffset=68 xadvance=103 page=0 chnl=15 +char id=1089 x=105 y=1066 width=82 height=94 xoffset=7 yoffset=68 xadvance=95 page=0 chnl=15 +char id=1090 x=199 y=1066 width=80 height=91 xoffset=5 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1091 x=291 y=1066 width=89 height=125 xoffset=3 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1092 x=392 y=1066 width=111 height=152 xoffset=7 yoffset=39 xadvance=124 page=0 chnl=15 +char id=1093 x=515 y=1066 width=83 height=91 xoffset=5 yoffset=69 xadvance=92 page=0 chnl=15 +char id=1094 x=610 y=1066 width=98 height=120 xoffset=10 yoffset=69 xadvance=113 page=0 chnl=15 +char id=1095 x=720 y=1066 width=77 height=91 xoffset=10 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1096 x=809 y=1066 width=120 height=91 xoffset=10 yoffset=69 xadvance=139 page=0 chnl=15 +char id=1097 x=941 y=1066 width=137 height=117 xoffset=10 yoffset=69 xadvance=152 page=0 chnl=15 +char id=1100 x=1090 y=1066 width=79 height=91 xoffset=10 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1102 x=1181 y=1066 width=124 height=94 xoffset=5 yoffset=68 xadvance=136 page=0 chnl=15 +char id=1103 x=1317 y=1066 width=80 height=91 xoffset=5 yoffset=69 xadvance=94 page=0 chnl=15 +char id=1108 x=1409 y=1066 width=82 height=94 xoffset=4 yoffset=68 xadvance=93 page=0 chnl=15 +char id=1110 x=1503 y=1066 width=25 height=126 xoffset=9 yoffset=34 xadvance=43 page=0 chnl=15 +char id=1111 x=1540 y=1066 width=59 height=126 xoffset=-8 yoffset=34 xadvance=43 page=0 chnl=15 +char id=8209 x=1611 y=1066 width=55 height=18 xoffset=9 yoffset=101 xadvance=70 page=0 chnl=15 +char id=8211 x=1678 y=1066 width=83 height=18 xoffset=0 yoffset=101 xadvance=82 page=0 chnl=15 +char id=8212 x=1773 y=1066 width=166 height=18 xoffset=0 yoffset=101 xadvance=165 page=0 chnl=15 +char id=8217 x=1951 y=1066 width=26 height=43 xoffset=3 yoffset=39 xadvance=35 page=0 chnl=15 +char id=8220 x=1989 y=1066 width=56 height=43 xoffset=8 yoffset=35 xadvance=67 page=0 chnl=15 +char id=8221 x=2057 y=1066 width=56 height=43 xoffset=3 yoffset=39 xadvance=67 page=0 chnl=15 +char id=8222 x=2125 y=1066 width=56 height=43 xoffset=3 yoffset=144 xadvance=67 page=0 chnl=15 +char id=8226 x=2193 y=1066 width=52 height=52 xoffset=15 yoffset=86 xadvance=82 page=0 chnl=15 +char id=8364 x=2257 y=1066 width=99 height=124 xoffset=4 yoffset=38 xadvance=112 page=0 chnl=15 +char id=8627 x=2368 y=1066 width=134 height=107 xoffset=16 yoffset=39 xadvance=165 page=0 chnl=15 +char id=8679 x=2514 y=1066 width=152 height=130 xoffset=13 yoffset=30 xadvance=178 page=0 chnl=15 +char id=9003 x=2678 y=1066 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=2863 y=1066 width=102 height=39 xoffset=11 yoffset=148 xadvance=123 page=0 chnl=15 +char id=9654 x=2977 y=1066 width=131 height=152 xoffset=16 yoffset=24 xadvance=155 page=0 chnl=15 +char id=9664 x=3120 y=1066 width=131 height=152 xoffset=8 yoffset=24 xadvance=155 page=0 chnl=15 +char id=9675 x=3263 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=3400 y=1066 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=3537 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=3549 y=1066 width=119 height=91 xoffset=16 yoffset=60 xadvance=145 page=0 chnl=15 +char id=10004 x=3680 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=3692 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=3704 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=3716 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=3728 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.png b/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.png new file mode 100644 index 000000000..8b364d544 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.ttf b/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.ttf new file mode 100644 index 000000000..ddb279290 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-SemiBold.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Thin.fnt b/iqpilot/selfdrive/assets/fonts/Inter-Thin.fnt new file mode 100644 index 000000000..c67fac1ea --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Inter-Thin.fnt @@ -0,0 +1,254 @@ +info face="Inter-Thin" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Inter-Thin.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=46 height=200 xoffset=0 yoffset=0 xadvance=46 page=0 chnl=15 +char id=33 x=76 y=6 width=9 height=122 xoffset=17 yoffset=39 xadvance=43 page=0 chnl=15 +char id=34 x=97 y=6 width=27 height=39 xoffset=15 yoffset=39 xadvance=56 page=0 chnl=15 +char id=35 x=136 y=6 width=98 height=121 xoffset=3 yoffset=39 xadvance=104 page=0 chnl=15 +char id=36 x=246 y=6 width=77 height=152 xoffset=12 yoffset=24 xadvance=101 page=0 chnl=15 +char id=37 x=335 y=6 width=102 height=124 xoffset=13 yoffset=38 xadvance=127 page=0 chnl=15 +char id=38 x=449 y=6 width=84 height=124 xoffset=10 yoffset=38 xadvance=96 page=0 chnl=15 +char id=39 x=545 y=6 width=4 height=39 xoffset=15 yoffset=39 xadvance=33 page=0 chnl=15 +char id=40 x=561 y=6 width=22 height=151 xoffset=19 yoffset=34 xadvance=52 page=0 chnl=15 +char id=41 x=595 y=6 width=22 height=151 xoffset=11 yoffset=34 xadvance=52 page=0 chnl=15 +char id=42 x=629 y=6 width=61 height=69 xoffset=11 yoffset=39 xadvance=82 page=0 chnl=15 +char id=43 x=702 y=6 width=69 height=69 xoffset=18 yoffset=79 xadvance=105 page=0 chnl=15 +char id=44 x=783 y=6 width=13 height=47 xoffset=14 yoffset=143 xadvance=42 page=0 chnl=15 +char id=45 x=808 y=6 width=46 height=5 xoffset=13 yoffset=106 xadvance=72 page=0 chnl=15 +char id=46 x=866 y=6 width=10 height=9 xoffset=16 yoffset=152 xadvance=41 page=0 chnl=15 +char id=47 x=888 y=6 width=44 height=145 xoffset=5 yoffset=34 xadvance=53 page=0 chnl=15 +char id=48 x=944 y=6 width=75 height=124 xoffset=11 yoffset=38 xadvance=97 page=0 chnl=15 +char id=49 x=1031 y=6 width=32 height=121 xoffset=11 yoffset=39 xadvance=67 page=0 chnl=15 +char id=50 x=1075 y=6 width=73 height=122 xoffset=15 yoffset=38 xadvance=102 page=0 chnl=15 +char id=51 x=1160 y=6 width=72 height=124 xoffset=15 yoffset=38 xadvance=101 page=0 chnl=15 +char id=52 x=1244 y=6 width=75 height=121 xoffset=12 yoffset=39 xadvance=98 page=0 chnl=15 +char id=53 x=1331 y=6 width=69 height=123 xoffset=13 yoffset=39 xadvance=94 page=0 chnl=15 +char id=54 x=1412 y=6 width=70 height=124 xoffset=13 yoffset=38 xadvance=96 page=0 chnl=15 +char id=55 x=1494 y=6 width=71 height=121 xoffset=9 yoffset=39 xadvance=90 page=0 chnl=15 +char id=56 x=1577 y=6 width=76 height=124 xoffset=12 yoffset=38 xadvance=99 page=0 chnl=15 +char id=57 x=1665 y=6 width=70 height=125 xoffset=13 yoffset=37 xadvance=96 page=0 chnl=15 +char id=58 x=1747 y=6 width=10 height=71 xoffset=16 yoffset=81 xadvance=41 page=0 chnl=15 +char id=59 x=1769 y=6 width=14 height=109 xoffset=14 yoffset=81 xadvance=42 page=0 chnl=15 +char id=60 x=1795 y=6 width=65 height=88 xoffset=20 yoffset=69 xadvance=105 page=0 chnl=15 +char id=61 x=1872 y=6 width=57 height=36 xoffset=24 yoffset=95 xadvance=105 page=0 chnl=15 +char id=62 x=1941 y=6 width=65 height=88 xoffset=20 yoffset=69 xadvance=105 page=0 chnl=15 +char id=63 x=2018 y=6 width=63 height=123 xoffset=7 yoffset=38 xadvance=79 page=0 chnl=15 +char id=64 x=2093 y=6 width=139 height=148 xoffset=8 yoffset=44 xadvance=154 page=0 chnl=15 +char id=65 x=2244 y=6 width=92 height=121 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15 +char id=66 x=2348 y=6 width=76 height=121 xoffset=18 yoffset=39 xadvance=105 page=0 chnl=15 +char id=67 x=2436 y=6 width=97 height=124 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15 +char id=68 x=2545 y=6 width=89 height=121 xoffset=18 yoffset=39 xadvance=118 page=0 chnl=15 +char id=69 x=2646 y=6 width=67 height=121 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15 +char id=70 x=2725 y=6 width=66 height=121 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15 +char id=71 x=2803 y=6 width=98 height=124 xoffset=11 yoffset=38 xadvance=122 page=0 chnl=15 +char id=72 x=2913 y=6 width=85 height=121 xoffset=18 yoffset=39 xadvance=121 page=0 chnl=15 +char id=73 x=3010 y=6 width=5 height=121 xoffset=18 yoffset=39 xadvance=41 page=0 chnl=15 +char id=74 x=3027 y=6 width=60 height=123 xoffset=8 yoffset=39 xadvance=85 page=0 chnl=15 +char id=75 x=3099 y=6 width=79 height=121 xoffset=18 yoffset=39 xadvance=101 page=0 chnl=15 +char id=76 x=3190 y=6 width=65 height=121 xoffset=18 yoffset=39 xadvance=92 page=0 chnl=15 +char id=77 x=3267 y=6 width=106 height=121 xoffset=18 yoffset=39 xadvance=142 page=0 chnl=15 +char id=78 x=3385 y=6 width=91 height=121 xoffset=18 yoffset=39 xadvance=127 page=0 chnl=15 +char id=79 x=3488 y=6 width=101 height=124 xoffset=11 yoffset=38 xadvance=123 page=0 chnl=15 +char id=80 x=3601 y=6 width=71 height=121 xoffset=18 yoffset=39 xadvance=100 page=0 chnl=15 +char id=81 x=3684 y=6 width=101 height=134 xoffset=11 yoffset=38 xadvance=123 page=0 chnl=15 +char id=82 x=3797 y=6 width=77 height=121 xoffset=18 yoffset=39 xadvance=101 page=0 chnl=15 +char id=83 x=3886 y=6 width=77 height=125 xoffset=12 yoffset=37 xadvance=101 page=0 chnl=15 +char id=84 x=3975 y=6 width=82 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15 +char id=85 x=6 y=218 width=88 height=123 xoffset=18 yoffset=39 xadvance=123 page=0 chnl=15 +char id=86 x=106 y=218 width=92 height=121 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15 +char id=87 x=210 y=218 width=139 height=121 xoffset=4 yoffset=39 xadvance=147 page=0 chnl=15 +char id=88 x=361 y=218 width=87 height=121 xoffset=5 yoffset=39 xadvance=96 page=0 chnl=15 +char id=89 x=460 y=218 width=91 height=121 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15 +char id=90 x=563 y=218 width=77 height=121 xoffset=12 yoffset=39 xadvance=100 page=0 chnl=15 +char id=91 x=652 y=218 width=22 height=151 xoffset=20 yoffset=34 xadvance=52 page=0 chnl=15 +char id=92 x=686 y=218 width=44 height=145 xoffset=5 yoffset=34 xadvance=53 page=0 chnl=15 +char id=93 x=742 y=218 width=22 height=151 xoffset=10 yoffset=34 xadvance=52 page=0 chnl=15 +char id=94 x=776 y=218 width=52 height=52 xoffset=7 yoffset=43 xadvance=66 page=0 chnl=15 +char id=95 x=840 y=218 width=72 height=4 xoffset=-1 yoffset=160 xadvance=70 page=0 chnl=15 +char id=96 x=924 y=218 width=22 height=26 xoffset=29 yoffset=31 xadvance=82 page=0 chnl=15 +char id=97 x=958 y=218 width=63 height=94 xoffset=11 yoffset=68 xadvance=89 page=0 chnl=15 +char id=98 x=1033 y=218 width=71 height=123 xoffset=18 yoffset=39 xadvance=98 page=0 chnl=15 +char id=99 x=1116 y=218 width=71 height=94 xoffset=10 yoffset=68 xadvance=91 page=0 chnl=15 +char id=100 x=1199 y=218 width=71 height=123 xoffset=10 yoffset=39 xadvance=98 page=0 chnl=15 +char id=101 x=1282 y=218 width=75 height=94 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15 +char id=102 x=1369 y=218 width=41 height=124 xoffset=11 yoffset=36 xadvance=54 page=0 chnl=15 +char id=103 x=1422 y=218 width=71 height=128 xoffset=10 yoffset=68 xadvance=96 page=0 chnl=15 +char id=104 x=1505 y=218 width=63 height=121 xoffset=15 yoffset=39 xadvance=93 page=0 chnl=15 +char id=105 x=1580 y=218 width=9 height=115 xoffset=14 yoffset=45 xadvance=36 page=0 chnl=15 +char id=106 x=1601 y=218 width=26 height=149 xoffset=-3 yoffset=45 xadvance=36 page=0 chnl=15 +char id=107 x=1639 y=218 width=60 height=121 xoffset=15 yoffset=39 xadvance=80 page=0 chnl=15 +char id=108 x=1711 y=218 width=5 height=121 xoffset=15 yoffset=39 xadvance=35 page=0 chnl=15 +char id=109 x=1728 y=218 width=108 height=92 xoffset=15 yoffset=68 xadvance=138 page=0 chnl=15 +char id=110 x=1848 y=218 width=63 height=92 xoffset=15 yoffset=68 xadvance=93 page=0 chnl=15 +char id=111 x=1923 y=218 width=76 height=94 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15 +char id=112 x=2011 y=218 width=70 height=126 xoffset=15 yoffset=68 xadvance=95 page=0 chnl=15 +char id=113 x=2093 y=218 width=71 height=126 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15 +char id=114 x=2176 y=218 width=35 height=92 xoffset=15 yoffset=68 xadvance=53 page=0 chnl=15 +char id=115 x=2223 y=218 width=60 height=94 xoffset=11 yoffset=68 xadvance=81 page=0 chnl=15 +char id=116 x=2295 y=218 width=42 height=114 xoffset=8 yoffset=48 xadvance=57 page=0 chnl=15 +char id=117 x=2349 y=218 width=63 height=93 xoffset=15 yoffset=69 xadvance=93 page=0 chnl=15 +char id=118 x=2424 y=218 width=70 height=91 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15 +char id=119 x=2506 y=218 width=115 height=91 xoffset=8 yoffset=69 xadvance=130 page=0 chnl=15 +char id=120 x=2633 y=218 width=63 height=91 xoffset=10 yoffset=69 xadvance=82 page=0 chnl=15 +char id=121 x=2708 y=218 width=70 height=126 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15 +char id=122 x=2790 y=218 width=62 height=91 xoffset=12 yoffset=69 xadvance=84 page=0 chnl=15 +char id=123 x=2864 y=218 width=40 height=151 xoffset=10 yoffset=34 xadvance=52 page=0 chnl=15 +char id=124 x=2916 y=218 width=5 height=198 xoffset=20 yoffset=1 xadvance=45 page=0 chnl=15 +char id=125 x=2933 y=218 width=40 height=151 xoffset=2 yoffset=34 xadvance=52 page=0 chnl=15 +char id=126 x=2985 y=218 width=75 height=18 xoffset=15 yoffset=104 xadvance=105 page=0 chnl=15 +char id=161 x=3072 y=218 width=9 height=122 xoffset=17 yoffset=69 xadvance=43 page=0 chnl=15 +char id=163 x=3093 y=218 width=77 height=122 xoffset=13 yoffset=38 xadvance=104 page=0 chnl=15 +char id=165 x=3182 y=218 width=80 height=121 xoffset=3 yoffset=39 xadvance=86 page=0 chnl=15 +char id=167 x=3274 y=218 width=67 height=147 xoffset=10 yoffset=38 xadvance=87 page=0 chnl=15 +char id=171 x=3353 y=218 width=59 height=73 xoffset=13 yoffset=75 xadvance=86 page=0 chnl=15 +char id=176 x=3424 y=218 width=49 height=49 xoffset=13 yoffset=38 xadvance=75 page=0 chnl=15 +char id=187 x=3485 y=218 width=60 height=73 xoffset=15 yoffset=75 xadvance=88 page=0 chnl=15 +char id=191 x=3557 y=218 width=63 height=123 xoffset=9 yoffset=68 xadvance=79 page=0 chnl=15 +char id=192 x=3632 y=218 width=92 height=159 xoffset=5 yoffset=1 xadvance=101 page=0 chnl=15 +char id=193 x=3736 y=218 width=92 height=159 xoffset=5 yoffset=1 xadvance=101 page=0 chnl=15 +char id=195 x=3840 y=218 width=92 height=151 xoffset=5 yoffset=9 xadvance=101 page=0 chnl=15 +char id=196 x=3944 y=218 width=92 height=145 xoffset=5 yoffset=15 xadvance=101 page=0 chnl=15 +char id=199 x=6 y=430 width=97 height=153 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15 +char id=201 x=115 y=430 width=67 height=159 xoffset=18 yoffset=1 xadvance=96 page=0 chnl=15 +char id=202 x=194 y=430 width=67 height=153 xoffset=18 yoffset=7 xadvance=96 page=0 chnl=15 +char id=205 x=273 y=430 width=22 height=159 xoffset=18 yoffset=1 xadvance=41 page=0 chnl=15 +char id=209 x=307 y=430 width=91 height=149 xoffset=18 yoffset=11 xadvance=127 page=0 chnl=15 +char id=211 x=410 y=430 width=101 height=161 xoffset=11 yoffset=1 xadvance=123 page=0 chnl=15 +char id=212 x=523 y=430 width=101 height=155 xoffset=11 yoffset=7 xadvance=123 page=0 chnl=15 +char id=214 x=636 y=430 width=101 height=147 xoffset=11 yoffset=15 xadvance=123 page=0 chnl=15 +char id=215 x=749 y=430 width=70 height=70 xoffset=18 yoffset=78 xadvance=105 page=0 chnl=15 +char id=218 x=831 y=430 width=88 height=161 xoffset=18 yoffset=1 xadvance=123 page=0 chnl=15 +char id=220 x=931 y=430 width=88 height=147 xoffset=18 yoffset=15 xadvance=123 page=0 chnl=15 +char id=223 x=1031 y=430 width=65 height=122 xoffset=18 yoffset=38 xadvance=94 page=0 chnl=15 +char id=224 x=1108 y=430 width=63 height=131 xoffset=11 yoffset=31 xadvance=89 page=0 chnl=15 +char id=225 x=1183 y=430 width=63 height=131 xoffset=11 yoffset=31 xadvance=89 page=0 chnl=15 +char id=226 x=1258 y=430 width=63 height=125 xoffset=11 yoffset=37 xadvance=89 page=0 chnl=15 +char id=227 x=1333 y=430 width=63 height=121 xoffset=11 yoffset=41 xadvance=89 page=0 chnl=15 +char id=228 x=1408 y=430 width=63 height=117 xoffset=11 yoffset=45 xadvance=89 page=0 chnl=15 +char id=231 x=1483 y=430 width=71 height=123 xoffset=10 yoffset=68 xadvance=91 page=0 chnl=15 +char id=232 x=1566 y=430 width=75 height=131 xoffset=10 yoffset=31 xadvance=95 page=0 chnl=15 +char id=233 x=1653 y=430 width=75 height=131 xoffset=10 yoffset=31 xadvance=95 page=0 chnl=15 +char id=234 x=1740 y=430 width=75 height=125 xoffset=10 yoffset=37 xadvance=95 page=0 chnl=15 +char id=237 x=1827 y=430 width=22 height=129 xoffset=16 yoffset=31 xadvance=36 page=0 chnl=15 +char id=238 x=1861 y=430 width=45 height=123 xoffset=-4 yoffset=37 xadvance=36 page=0 chnl=15 +char id=241 x=1918 y=430 width=63 height=119 xoffset=15 yoffset=41 xadvance=93 page=0 chnl=15 +char id=243 x=1993 y=430 width=76 height=131 xoffset=10 yoffset=31 xadvance=95 page=0 chnl=15 +char id=244 x=2081 y=430 width=76 height=125 xoffset=10 yoffset=37 xadvance=95 page=0 chnl=15 +char id=245 x=2169 y=430 width=76 height=121 xoffset=10 yoffset=41 xadvance=95 page=0 chnl=15 +char id=246 x=2257 y=430 width=76 height=117 xoffset=10 yoffset=45 xadvance=95 page=0 chnl=15 +char id=249 x=2345 y=430 width=63 height=131 xoffset=15 yoffset=31 xadvance=93 page=0 chnl=15 +char id=250 x=2420 y=430 width=63 height=131 xoffset=15 yoffset=31 xadvance=93 page=0 chnl=15 +char id=251 x=2495 y=430 width=63 height=125 xoffset=15 yoffset=37 xadvance=93 page=0 chnl=15 +char id=252 x=2570 y=430 width=63 height=117 xoffset=15 yoffset=45 xadvance=93 page=0 chnl=15 +char id=260 x=2645 y=430 width=100 height=157 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15 +char id=261 x=2757 y=430 width=70 height=128 xoffset=11 yoffset=68 xadvance=89 page=0 chnl=15 +char id=262 x=2839 y=430 width=97 height=161 xoffset=11 yoffset=1 xadvance=119 page=0 chnl=15 +char id=263 x=2948 y=430 width=71 height=131 xoffset=10 yoffset=31 xadvance=91 page=0 chnl=15 +char id=280 x=3031 y=430 width=75 height=157 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15 +char id=281 x=3118 y=430 width=75 height=128 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15 +char id=286 x=3205 y=430 width=98 height=153 xoffset=11 yoffset=9 xadvance=122 page=0 chnl=15 +char id=287 x=3315 y=430 width=71 height=157 xoffset=10 yoffset=39 xadvance=96 page=0 chnl=15 +char id=304 x=3398 y=430 width=9 height=145 xoffset=16 yoffset=15 xadvance=41 page=0 chnl=15 +char id=305 x=3419 y=430 width=5 height=91 xoffset=16 yoffset=69 xadvance=36 page=0 chnl=15 +char id=321 x=3436 y=430 width=78 height=121 xoffset=0 yoffset=39 xadvance=89 page=0 chnl=15 +char id=322 x=3526 y=430 width=33 height=121 xoffset=0 yoffset=39 xadvance=32 page=0 chnl=15 +char id=323 x=3571 y=430 width=91 height=159 xoffset=18 yoffset=1 xadvance=127 page=0 chnl=15 +char id=324 x=3674 y=430 width=63 height=129 xoffset=15 yoffset=31 xadvance=93 page=0 chnl=15 +char id=339 x=3749 y=430 width=146 height=94 xoffset=10 yoffset=68 xadvance=165 page=0 chnl=15 +char id=346 x=3907 y=430 width=77 height=161 xoffset=12 yoffset=1 xadvance=101 page=0 chnl=15 +char id=347 x=3996 y=430 width=60 height=131 xoffset=11 yoffset=31 xadvance=81 page=0 chnl=15 +char id=350 x=6 y=642 width=77 height=154 xoffset=12 yoffset=37 xadvance=101 page=0 chnl=15 +char id=351 x=95 y=642 width=60 height=123 xoffset=11 yoffset=68 xadvance=81 page=0 chnl=15 +char id=377 x=167 y=642 width=77 height=159 xoffset=12 yoffset=1 xadvance=100 page=0 chnl=15 +char id=378 x=256 y=642 width=62 height=129 xoffset=12 yoffset=31 xadvance=84 page=0 chnl=15 +char id=379 x=330 y=642 width=77 height=145 xoffset=12 yoffset=15 xadvance=100 page=0 chnl=15 +char id=380 x=419 y=642 width=62 height=115 xoffset=12 yoffset=45 xadvance=84 page=0 chnl=15 +char id=1028 x=493 y=642 width=84 height=124 xoffset=11 yoffset=38 xadvance=105 page=0 chnl=15 +char id=1030 x=589 y=642 width=5 height=121 xoffset=18 yoffset=39 xadvance=41 page=0 chnl=15 +char id=1040 x=606 y=642 width=92 height=121 xoffset=5 yoffset=39 xadvance=101 page=0 chnl=15 +char id=1041 x=710 y=642 width=80 height=121 xoffset=18 yoffset=39 xadvance=110 page=0 chnl=15 +char id=1042 x=802 y=642 width=76 height=121 xoffset=18 yoffset=39 xadvance=105 page=0 chnl=15 +char id=1043 x=890 y=642 width=67 height=121 xoffset=18 yoffset=39 xadvance=94 page=0 chnl=15 +char id=1044 x=969 y=642 width=105 height=151 xoffset=5 yoffset=39 xadvance=117 page=0 chnl=15 +char id=1045 x=1086 y=642 width=67 height=121 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15 +char id=1046 x=1165 y=642 width=135 height=121 xoffset=0 yoffset=39 xadvance=134 page=0 chnl=15 +char id=1047 x=1312 y=642 width=72 height=124 xoffset=15 yoffset=38 xadvance=101 page=0 chnl=15 +char id=1048 x=1396 y=642 width=91 height=121 xoffset=18 yoffset=39 xadvance=127 page=0 chnl=15 +char id=1049 x=1499 y=642 width=91 height=151 xoffset=18 yoffset=9 xadvance=127 page=0 chnl=15 +char id=1050 x=1602 y=642 width=74 height=121 xoffset=18 yoffset=39 xadvance=96 page=0 chnl=15 +char id=1051 x=1688 y=642 width=93 height=121 xoffset=5 yoffset=39 xadvance=116 page=0 chnl=15 +char id=1052 x=1793 y=642 width=106 height=121 xoffset=18 yoffset=39 xadvance=142 page=0 chnl=15 +char id=1053 x=1911 y=642 width=85 height=121 xoffset=18 yoffset=39 xadvance=121 page=0 chnl=15 +char id=1054 x=2008 y=642 width=101 height=124 xoffset=11 yoffset=38 xadvance=123 page=0 chnl=15 +char id=1055 x=2121 y=642 width=82 height=121 xoffset=15 yoffset=39 xadvance=112 page=0 chnl=15 +char id=1056 x=2215 y=642 width=71 height=121 xoffset=18 yoffset=39 xadvance=100 page=0 chnl=15 +char id=1057 x=2298 y=642 width=97 height=124 xoffset=11 yoffset=38 xadvance=119 page=0 chnl=15 +char id=1058 x=2407 y=642 width=82 height=121 xoffset=10 yoffset=39 xadvance=101 page=0 chnl=15 +char id=1059 x=2501 y=642 width=85 height=123 xoffset=5 yoffset=39 xadvance=94 page=0 chnl=15 +char id=1060 x=2598 y=642 width=98 height=128 xoffset=11 yoffset=37 xadvance=119 page=0 chnl=15 +char id=1061 x=2708 y=642 width=87 height=121 xoffset=5 yoffset=39 xadvance=96 page=0 chnl=15 +char id=1062 x=2807 y=642 width=88 height=150 xoffset=18 yoffset=39 xadvance=113 page=0 chnl=15 +char id=1063 x=2907 y=642 width=79 height=121 xoffset=16 yoffset=39 xadvance=113 page=0 chnl=15 +char id=1064 x=2998 y=642 width=114 height=121 xoffset=18 yoffset=39 xadvance=150 page=0 chnl=15 +char id=1065 x=3124 y=642 width=120 height=150 xoffset=18 yoffset=39 xadvance=145 page=0 chnl=15 +char id=1068 x=3256 y=642 width=80 height=121 xoffset=18 yoffset=39 xadvance=107 page=0 chnl=15 +char id=1070 x=3348 y=642 width=131 height=124 xoffset=18 yoffset=38 xadvance=168 page=0 chnl=15 +char id=1071 x=3491 y=642 width=76 height=121 xoffset=7 yoffset=39 xadvance=101 page=0 chnl=15 +char id=1072 x=3579 y=642 width=63 height=94 xoffset=11 yoffset=68 xadvance=89 page=0 chnl=15 +char id=1073 x=3654 y=642 width=74 height=126 xoffset=10 yoffset=36 xadvance=94 page=0 chnl=15 +char id=1074 x=3740 y=642 width=66 height=91 xoffset=15 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1075 x=3818 y=642 width=51 height=91 xoffset=15 yoffset=69 xadvance=75 page=0 chnl=15 +char id=1076 x=3881 y=642 width=86 height=117 xoffset=3 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1077 x=3979 y=642 width=75 height=94 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15 +char id=1078 x=6 y=854 width=110 height=91 xoffset=10 yoffset=69 xadvance=130 page=0 chnl=15 +char id=1079 x=128 y=854 width=62 height=94 xoffset=9 yoffset=68 xadvance=80 page=0 chnl=15 +char id=1080 x=202 y=854 width=67 height=91 xoffset=15 yoffset=69 xadvance=97 page=0 chnl=15 +char id=1081 x=281 y=854 width=67 height=121 xoffset=15 yoffset=39 xadvance=97 page=0 chnl=15 +char id=1082 x=360 y=854 width=58 height=91 xoffset=15 yoffset=69 xadvance=78 page=0 chnl=15 +char id=1083 x=430 y=854 width=75 height=91 xoffset=5 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1084 x=517 y=854 width=87 height=91 xoffset=15 yoffset=69 xadvance=118 page=0 chnl=15 +char id=1085 x=616 y=854 width=65 height=91 xoffset=15 yoffset=69 xadvance=96 page=0 chnl=15 +char id=1086 x=693 y=854 width=76 height=94 xoffset=10 yoffset=68 xadvance=95 page=0 chnl=15 +char id=1087 x=781 y=854 width=64 height=91 xoffset=16 yoffset=69 xadvance=95 page=0 chnl=15 +char id=1088 x=857 y=854 width=70 height=126 xoffset=15 yoffset=68 xadvance=95 page=0 chnl=15 +char id=1089 x=939 y=854 width=71 height=94 xoffset=10 yoffset=68 xadvance=91 page=0 chnl=15 +char id=1090 x=1022 y=854 width=66 height=91 xoffset=9 yoffset=69 xadvance=84 page=0 chnl=15 +char id=1091 x=1100 y=854 width=70 height=126 xoffset=8 yoffset=69 xadvance=86 page=0 chnl=15 +char id=1092 x=1182 y=854 width=98 height=152 xoffset=10 yoffset=39 xadvance=117 page=0 chnl=15 +char id=1093 x=1292 y=854 width=63 height=91 xoffset=10 yoffset=69 xadvance=82 page=0 chnl=15 +char id=1094 x=1367 y=854 width=67 height=121 xoffset=16 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1095 x=1446 y=854 width=62 height=91 xoffset=15 yoffset=69 xadvance=92 page=0 chnl=15 +char id=1096 x=1520 y=854 width=98 height=91 xoffset=15 yoffset=69 xadvance=129 page=0 chnl=15 +char id=1097 x=1630 y=854 width=105 height=118 xoffset=15 yoffset=69 xadvance=127 page=0 chnl=15 +char id=1100 x=1747 y=854 width=61 height=91 xoffset=15 yoffset=69 xadvance=86 page=0 chnl=15 +char id=1102 x=1820 y=854 width=112 height=94 xoffset=7 yoffset=68 xadvance=131 page=0 chnl=15 +char id=1103 x=1944 y=854 width=66 height=91 xoffset=8 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1108 x=2022 y=854 width=67 height=94 xoffset=2 yoffset=68 xadvance=76 page=0 chnl=15 +char id=1110 x=2101 y=854 width=9 height=115 xoffset=14 yoffset=45 xadvance=36 page=0 chnl=15 +char id=1111 x=2122 y=854 width=31 height=115 xoffset=3 yoffset=45 xadvance=36 page=0 chnl=15 +char id=8209 x=2165 y=854 width=46 height=5 xoffset=-5 yoffset=106 xadvance=41 page=0 chnl=15 +char id=8211 x=2223 y=854 width=83 height=5 xoffset=0 yoffset=106 xadvance=82 page=0 chnl=15 +char id=8212 x=2318 y=854 width=166 height=5 xoffset=0 yoffset=106 xadvance=165 page=0 chnl=15 +char id=8217 x=2496 y=854 width=18 height=41 xoffset=3 yoffset=39 xadvance=25 page=0 chnl=15 +char id=8220 x=2526 y=854 width=40 height=41 xoffset=8 yoffset=37 xadvance=50 page=0 chnl=15 +char id=8221 x=2578 y=854 width=40 height=41 xoffset=3 yoffset=39 xadvance=50 page=0 chnl=15 +char id=8222 x=2630 y=854 width=40 height=42 xoffset=3 yoffset=144 xadvance=50 page=0 chnl=15 +char id=8226 x=2682 y=854 width=31 height=31 xoffset=31 yoffset=97 xadvance=92 page=0 chnl=15 +char id=8364 x=2725 y=854 width=95 height=124 xoffset=5 yoffset=38 xadvance=112 page=0 chnl=15 +char id=8627 x=2832 y=854 width=122 height=98 xoffset=16 yoffset=39 xadvance=153 page=0 chnl=15 +char id=8679 x=2966 y=854 width=113 height=130 xoffset=15 yoffset=30 xadvance=142 page=0 chnl=15 +char id=9003 x=3091 y=854 width=173 height=121 xoffset=13 yoffset=39 xadvance=200 page=0 chnl=15 +char id=9251 x=3276 y=854 width=87 height=36 xoffset=13 yoffset=148 xadvance=112 page=0 chnl=15 +char id=9654 x=3375 y=854 width=125 height=152 xoffset=13 yoffset=24 xadvance=144 page=0 chnl=15 +char id=9664 x=3512 y=854 width=125 height=152 xoffset=6 yoffset=24 xadvance=144 page=0 chnl=15 +char id=9675 x=3649 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9679 x=3786 y=854 width=125 height=125 xoffset=13 yoffset=37 xadvance=151 page=0 chnl=15 +char id=9881 x=3923 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=3935 y=854 width=108 height=73 xoffset=19 yoffset=66 xadvance=145 page=0 chnl=15 +char id=10004 x=4055 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=4067 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=4079 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=6 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=18 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Thin.png b/iqpilot/selfdrive/assets/fonts/Inter-Thin.png new file mode 100644 index 000000000..ef08e9650 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Thin.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Inter-Thin.ttf b/iqpilot/selfdrive/assets/fonts/Inter-Thin.ttf new file mode 100644 index 000000000..76be6252b Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Inter-Thin.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.fnt b/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.fnt new file mode 100644 index 000000000..7ad9b5a81 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.fnt @@ -0,0 +1,254 @@ +info face="JetBrainsMono-Medium" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="JetBrainsMono-Medium.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=90 height=200 xoffset=0 yoffset=0 xadvance=90 page=0 chnl=15 +char id=33 x=120 y=6 width=25 height=112 xoffset=33 yoffset=43 xadvance=90 page=0 chnl=15 +char id=34 x=157 y=6 width=49 height=46 xoffset=21 yoffset=43 xadvance=90 page=0 chnl=15 +char id=35 x=218 y=6 width=81 height=111 xoffset=5 yoffset=43 xadvance=90 page=0 chnl=15 +char id=36 x=311 y=6 width=71 height=154 xoffset=10 yoffset=22 xadvance=90 page=0 chnl=15 +char id=37 x=394 y=6 width=89 height=113 xoffset=1 yoffset=42 xadvance=90 page=0 chnl=15 +char id=38 x=495 y=6 width=80 height=115 xoffset=7 yoffset=41 xadvance=90 page=0 chnl=15 +char id=39 x=587 y=6 width=17 height=46 xoffset=36 yoffset=43 xadvance=90 page=0 chnl=15 +char id=40 x=616 y=6 width=47 height=147 xoffset=27 yoffset=26 xadvance=90 page=0 chnl=15 +char id=41 x=675 y=6 width=47 height=147 xoffset=17 yoffset=26 xadvance=90 page=0 chnl=15 +char id=42 x=734 y=6 width=81 height=80 xoffset=5 yoffset=61 xadvance=90 page=0 chnl=15 +char id=43 x=827 y=6 width=73 height=72 xoffset=9 yoffset=68 xadvance=90 page=0 chnl=15 +char id=44 x=912 y=6 width=34 height=48 xoffset=24 yoffset=131 xadvance=90 page=0 chnl=15 +char id=45 x=958 y=6 width=49 height=14 xoffset=21 yoffset=97 xadvance=90 page=0 chnl=15 +char id=46 x=1019 y=6 width=27 height=27 xoffset=32 yoffset=129 xadvance=90 page=0 chnl=15 +char id=47 x=1058 y=6 width=71 height=143 xoffset=10 yoffset=28 xadvance=90 page=0 chnl=15 +char id=48 x=1141 y=6 width=69 height=115 xoffset=11 yoffset=41 xadvance=90 page=0 chnl=15 +char id=49 x=1222 y=6 width=70 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=50 x=1304 y=6 width=70 height=113 xoffset=10 yoffset=41 xadvance=90 page=0 chnl=15 +char id=51 x=1386 y=6 width=69 height=113 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15 +char id=52 x=1467 y=6 width=65 height=111 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15 +char id=53 x=1544 y=6 width=67 height=113 xoffset=12 yoffset=43 xadvance=90 page=0 chnl=15 +char id=54 x=1623 y=6 width=73 height=113 xoffset=9 yoffset=43 xadvance=90 page=0 chnl=15 +char id=55 x=1708 y=6 width=73 height=111 xoffset=11 yoffset=43 xadvance=90 page=0 chnl=15 +char id=56 x=1793 y=6 width=73 height=115 xoffset=9 yoffset=41 xadvance=90 page=0 chnl=15 +char id=57 x=1878 y=6 width=73 height=113 xoffset=9 yoffset=41 xadvance=90 page=0 chnl=15 +char id=58 x=1963 y=6 width=27 height=87 xoffset=32 yoffset=69 xadvance=90 page=0 chnl=15 +char id=59 x=2002 y=6 width=34 height=110 xoffset=25 yoffset=69 xadvance=90 page=0 chnl=15 +char id=60 x=2048 y=6 width=67 height=82 xoffset=12 yoffset=63 xadvance=90 page=0 chnl=15 +char id=61 x=2127 y=6 width=67 height=50 xoffset=12 yoffset=79 xadvance=90 page=0 chnl=15 +char id=62 x=2206 y=6 width=67 height=82 xoffset=12 yoffset=63 xadvance=90 page=0 chnl=15 +char id=63 x=2285 y=6 width=56 height=112 xoffset=19 yoffset=43 xadvance=90 page=0 chnl=15 +char id=64 x=2353 y=6 width=80 height=141 xoffset=6 yoffset=41 xadvance=90 page=0 chnl=15 +char id=65 x=2445 y=6 width=78 height=111 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15 +char id=66 x=2535 y=6 width=69 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=67 x=2616 y=6 width=68 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15 +char id=68 x=2696 y=6 width=66 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=69 x=2774 y=6 width=66 height=111 xoffset=14 yoffset=43 xadvance=90 page=0 chnl=15 +char id=70 x=2852 y=6 width=67 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=71 x=2931 y=6 width=68 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15 +char id=72 x=3011 y=6 width=65 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=73 x=3088 y=6 width=61 height=111 xoffset=15 yoffset=43 xadvance=90 page=0 chnl=15 +char id=74 x=3161 y=6 width=70 height=113 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15 +char id=75 x=3243 y=6 width=73 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=76 x=3328 y=6 width=65 height=111 xoffset=19 yoffset=43 xadvance=90 page=0 chnl=15 +char id=77 x=3405 y=6 width=71 height=111 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15 +char id=78 x=3488 y=6 width=66 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=79 x=3566 y=6 width=67 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15 +char id=80 x=3645 y=6 width=71 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=81 x=3728 y=6 width=70 height=141 xoffset=11 yoffset=41 xadvance=90 page=0 chnl=15 +char id=82 x=3810 y=6 width=71 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=83 x=3893 y=6 width=71 height=115 xoffset=10 yoffset=41 xadvance=90 page=0 chnl=15 +char id=84 x=3976 y=6 width=75 height=111 xoffset=8 yoffset=43 xadvance=90 page=0 chnl=15 +char id=85 x=6 y=218 width=66 height=113 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=86 x=84 y=218 width=78 height=111 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15 +char id=87 x=174 y=218 width=85 height=111 xoffset=3 yoffset=43 xadvance=90 page=0 chnl=15 +char id=88 x=271 y=218 width=81 height=111 xoffset=5 yoffset=43 xadvance=90 page=0 chnl=15 +char id=89 x=364 y=218 width=83 height=111 xoffset=4 yoffset=43 xadvance=90 page=0 chnl=15 +char id=90 x=459 y=218 width=67 height=111 xoffset=12 yoffset=43 xadvance=90 page=0 chnl=15 +char id=91 x=538 y=218 width=39 height=143 xoffset=30 yoffset=28 xadvance=90 page=0 chnl=15 +char id=92 x=589 y=218 width=71 height=143 xoffset=10 yoffset=28 xadvance=90 page=0 chnl=15 +char id=93 x=672 y=218 width=39 height=143 xoffset=22 yoffset=28 xadvance=90 page=0 chnl=15 +char id=94 x=723 y=218 width=69 height=60 xoffset=11 yoffset=43 xadvance=90 page=0 chnl=15 +char id=95 x=804 y=218 width=73 height=14 xoffset=9 yoffset=157 xadvance=90 page=0 chnl=15 +char id=96 x=889 y=218 width=34 height=22 xoffset=23 yoffset=35 xadvance=90 page=0 chnl=15 +char id=97 x=935 y=218 width=69 height=87 xoffset=9 yoffset=69 xadvance=90 page=0 chnl=15 +char id=98 x=1016 y=218 width=66 height=113 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=99 x=1094 y=218 width=68 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=100 x=1174 y=218 width=66 height=113 xoffset=12 yoffset=43 xadvance=90 page=0 chnl=15 +char id=101 x=1252 y=218 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=102 x=1331 y=218 width=74 height=111 xoffset=8 yoffset=43 xadvance=90 page=0 chnl=15 +char id=103 x=1417 y=218 width=66 height=113 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=104 x=1495 y=218 width=65 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=105 x=1572 y=218 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=106 x=1657 y=218 width=60 height=147 xoffset=10 yoffset=35 xadvance=90 page=0 chnl=15 +char id=107 x=1729 y=218 width=72 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=108 x=1813 y=218 width=80 height=111 xoffset=4 yoffset=43 xadvance=90 page=0 chnl=15 +char id=109 x=1905 y=218 width=75 height=85 xoffset=8 yoffset=69 xadvance=90 page=0 chnl=15 +char id=110 x=1992 y=218 width=65 height=85 xoffset=13 yoffset=69 xadvance=90 page=0 chnl=15 +char id=111 x=2069 y=218 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=112 x=2148 y=218 width=66 height=113 xoffset=13 yoffset=69 xadvance=90 page=0 chnl=15 +char id=113 x=2226 y=218 width=66 height=113 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=114 x=2304 y=218 width=67 height=85 xoffset=15 yoffset=69 xadvance=90 page=0 chnl=15 +char id=115 x=2383 y=218 width=68 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=116 x=2463 y=218 width=73 height=107 xoffset=7 yoffset=47 xadvance=90 page=0 chnl=15 +char id=117 x=2548 y=218 width=65 height=86 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15 +char id=118 x=2625 y=218 width=79 height=84 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15 +char id=119 x=2716 y=218 width=83 height=84 xoffset=4 yoffset=70 xadvance=90 page=0 chnl=15 +char id=120 x=2811 y=218 width=78 height=84 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15 +char id=121 x=2901 y=218 width=79 height=112 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15 +char id=122 x=2992 y=218 width=65 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15 +char id=123 x=3069 y=218 width=66 height=143 xoffset=11 yoffset=28 xadvance=90 page=0 chnl=15 +char id=124 x=3147 y=218 width=16 height=143 xoffset=38 yoffset=28 xadvance=90 page=0 chnl=15 +char id=125 x=3175 y=218 width=66 height=143 xoffset=14 yoffset=28 xadvance=90 page=0 chnl=15 +char id=126 x=3253 y=218 width=72 height=33 xoffset=10 yoffset=84 xadvance=90 page=0 chnl=15 +char id=161 x=3337 y=218 width=25 height=113 xoffset=33 yoffset=69 xadvance=90 page=0 chnl=15 +char id=163 x=3374 y=218 width=71 height=113 xoffset=11 yoffset=41 xadvance=90 page=0 chnl=15 +char id=165 x=3457 y=218 width=83 height=111 xoffset=4 yoffset=43 xadvance=90 page=0 chnl=15 +char id=167 x=3552 y=218 width=70 height=137 xoffset=10 yoffset=41 xadvance=90 page=0 chnl=15 +char id=171 x=3634 y=218 width=83 height=73 xoffset=4 yoffset=75 xadvance=90 page=0 chnl=15 +char id=176 x=3729 y=218 width=47 height=45 xoffset=22 yoffset=41 xadvance=90 page=0 chnl=15 +char id=187 x=3788 y=218 width=83 height=73 xoffset=4 yoffset=75 xadvance=90 page=0 chnl=15 +char id=191 x=3883 y=218 width=55 height=111 xoffset=16 yoffset=69 xadvance=90 page=0 chnl=15 +char id=192 x=3950 y=218 width=78 height=144 xoffset=6 yoffset=10 xadvance=90 page=0 chnl=15 +char id=193 x=6 y=430 width=78 height=144 xoffset=6 yoffset=10 xadvance=90 page=0 chnl=15 +char id=195 x=96 y=430 width=78 height=144 xoffset=6 yoffset=10 xadvance=90 page=0 chnl=15 +char id=196 x=186 y=430 width=78 height=144 xoffset=6 yoffset=10 xadvance=90 page=0 chnl=15 +char id=199 x=276 y=430 width=68 height=145 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15 +char id=201 x=356 y=430 width=66 height=144 xoffset=14 yoffset=10 xadvance=90 page=0 chnl=15 +char id=202 x=434 y=430 width=66 height=144 xoffset=14 yoffset=10 xadvance=90 page=0 chnl=15 +char id=205 x=512 y=430 width=61 height=144 xoffset=15 yoffset=10 xadvance=90 page=0 chnl=15 +char id=209 x=585 y=430 width=66 height=144 xoffset=13 yoffset=10 xadvance=90 page=0 chnl=15 +char id=211 x=663 y=430 width=67 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15 +char id=212 x=742 y=430 width=67 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15 +char id=214 x=821 y=430 width=67 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15 +char id=215 x=900 y=430 width=61 height=62 xoffset=15 yoffset=73 xadvance=90 page=0 chnl=15 +char id=218 x=973 y=430 width=66 height=146 xoffset=13 yoffset=10 xadvance=90 page=0 chnl=15 +char id=220 x=1051 y=430 width=66 height=146 xoffset=13 yoffset=10 xadvance=90 page=0 chnl=15 +char id=223 x=1129 y=430 width=69 height=113 xoffset=13 yoffset=41 xadvance=90 page=0 chnl=15 +char id=224 x=1210 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15 +char id=225 x=1291 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15 +char id=226 x=1372 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15 +char id=227 x=1453 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15 +char id=228 x=1534 y=430 width=69 height=121 xoffset=9 yoffset=35 xadvance=90 page=0 chnl=15 +char id=231 x=1615 y=430 width=68 height=117 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=232 x=1695 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=233 x=1774 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=234 x=1853 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=237 x=1932 y=430 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=238 x=2017 y=430 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=241 x=2102 y=430 width=65 height=119 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=243 x=2179 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=244 x=2258 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=245 x=2337 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=246 x=2416 y=430 width=67 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=249 x=2495 y=430 width=65 height=121 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=250 x=2572 y=430 width=65 height=121 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=251 x=2649 y=430 width=65 height=121 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=252 x=2726 y=430 width=65 height=121 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=260 x=2803 y=430 width=83 height=143 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15 +char id=261 x=2898 y=430 width=77 height=117 xoffset=9 yoffset=69 xadvance=90 page=0 chnl=15 +char id=262 x=2987 y=430 width=68 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15 +char id=263 x=3067 y=430 width=68 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=280 x=3147 y=430 width=66 height=143 xoffset=14 yoffset=43 xadvance=90 page=0 chnl=15 +char id=281 x=3225 y=430 width=67 height=117 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=286 x=3304 y=430 width=68 height=146 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15 +char id=287 x=3384 y=430 width=66 height=147 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=304 x=3462 y=430 width=61 height=144 xoffset=15 yoffset=10 xadvance=90 page=0 chnl=15 +char id=305 x=3535 y=430 width=73 height=84 xoffset=12 yoffset=70 xadvance=90 page=0 chnl=15 +char id=321 x=3620 y=430 width=81 height=111 xoffset=3 yoffset=43 xadvance=90 page=0 chnl=15 +char id=322 x=3713 y=430 width=80 height=111 xoffset=4 yoffset=43 xadvance=90 page=0 chnl=15 +char id=323 x=3805 y=430 width=66 height=144 xoffset=13 yoffset=10 xadvance=90 page=0 chnl=15 +char id=324 x=3883 y=430 width=65 height=119 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=339 x=3960 y=430 width=81 height=87 xoffset=5 yoffset=69 xadvance=90 page=0 chnl=15 +char id=346 x=6 y=642 width=71 height=146 xoffset=10 yoffset=10 xadvance=90 page=0 chnl=15 +char id=347 x=89 y=642 width=68 height=121 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=350 x=169 y=642 width=71 height=145 xoffset=10 yoffset=41 xadvance=90 page=0 chnl=15 +char id=351 x=252 y=642 width=68 height=117 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=377 x=332 y=642 width=67 height=144 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15 +char id=378 x=411 y=642 width=65 height=119 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=379 x=488 y=642 width=67 height=144 xoffset=12 yoffset=10 xadvance=90 page=0 chnl=15 +char id=380 x=567 y=642 width=65 height=119 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=1028 x=644 y=642 width=66 height=115 xoffset=13 yoffset=41 xadvance=90 page=0 chnl=15 +char id=1030 x=722 y=642 width=61 height=111 xoffset=15 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1040 x=795 y=642 width=78 height=111 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1041 x=885 y=642 width=69 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1042 x=966 y=642 width=69 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1043 x=1047 y=642 width=66 height=111 xoffset=19 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1044 x=1125 y=642 width=85 height=133 xoffset=3 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1045 x=1222 y=642 width=66 height=111 xoffset=14 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1046 x=1300 y=642 width=89 height=111 xoffset=1 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1047 x=1401 y=642 width=74 height=115 xoffset=7 yoffset=41 xadvance=90 page=0 chnl=15 +char id=1048 x=1487 y=642 width=66 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1049 x=1565 y=642 width=66 height=144 xoffset=13 yoffset=10 xadvance=90 page=0 chnl=15 +char id=1050 x=1643 y=642 width=73 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1051 x=1728 y=642 width=76 height=112 xoffset=2 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1052 x=1816 y=642 width=71 height=111 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1053 x=1899 y=642 width=65 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1054 x=1976 y=642 width=67 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15 +char id=1055 x=2055 y=642 width=65 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1056 x=2132 y=642 width=71 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1057 x=2215 y=642 width=68 height=115 xoffset=12 yoffset=41 xadvance=90 page=0 chnl=15 +char id=1058 x=2295 y=642 width=75 height=111 xoffset=8 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1059 x=2382 y=642 width=78 height=111 xoffset=6 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1060 x=2472 y=642 width=77 height=121 xoffset=7 yoffset=37 xadvance=90 page=0 chnl=15 +char id=1061 x=2561 y=642 width=81 height=111 xoffset=5 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1062 x=2654 y=642 width=73 height=133 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1063 x=2739 y=642 width=68 height=111 xoffset=10 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1064 x=2819 y=642 width=73 height=111 xoffset=9 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1065 x=2904 y=642 width=79 height=133 xoffset=9 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1068 x=2995 y=642 width=71 height=111 xoffset=13 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1070 x=3078 y=642 width=78 height=115 xoffset=8 yoffset=41 xadvance=90 page=0 chnl=15 +char id=1071 x=3168 y=642 width=70 height=111 xoffset=8 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1072 x=3250 y=642 width=69 height=87 xoffset=9 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1073 x=3331 y=642 width=67 height=113 xoffset=12 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1074 x=3410 y=642 width=68 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1075 x=3490 y=642 width=61 height=84 xoffset=19 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1076 x=3563 y=642 width=82 height=106 xoffset=4 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1077 x=3657 y=642 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1078 x=3736 y=642 width=87 height=84 xoffset=2 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1079 x=3835 y=642 width=71 height=87 xoffset=9 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1080 x=3918 y=642 width=65 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1081 x=3995 y=642 width=65 height=119 xoffset=13 yoffset=35 xadvance=90 page=0 chnl=15 +char id=1082 x=6 y=854 width=72 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1083 x=90 y=854 width=75 height=86 xoffset=3 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1084 x=177 y=854 width=71 height=84 xoffset=10 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1085 x=260 y=854 width=65 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1086 x=337 y=854 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1087 x=416 y=854 width=65 height=84 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1088 x=493 y=854 width=66 height=113 xoffset=13 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1089 x=571 y=854 width=68 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1090 x=651 y=854 width=75 height=84 xoffset=8 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1091 x=738 y=854 width=79 height=112 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1092 x=829 y=854 width=77 height=139 xoffset=7 yoffset=43 xadvance=90 page=0 chnl=15 +char id=1093 x=918 y=854 width=78 height=84 xoffset=6 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1094 x=1008 y=854 width=73 height=106 xoffset=13 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1095 x=1093 y=854 width=66 height=84 xoffset=11 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1096 x=1171 y=854 width=75 height=84 xoffset=8 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1097 x=1258 y=854 width=80 height=106 xoffset=8 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1100 x=1350 y=854 width=70 height=84 xoffset=14 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1102 x=1432 y=854 width=78 height=87 xoffset=8 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1103 x=1522 y=854 width=69 height=84 xoffset=9 yoffset=70 xadvance=90 page=0 chnl=15 +char id=1108 x=1603 y=854 width=67 height=87 xoffset=12 yoffset=69 xadvance=90 page=0 chnl=15 +char id=1110 x=1682 y=854 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=1111 x=1767 y=854 width=73 height=119 xoffset=12 yoffset=35 xadvance=90 page=0 chnl=15 +char id=8209 x=1852 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=1864 y=854 width=68 height=14 xoffset=11 yoffset=97 xadvance=90 page=0 chnl=15 +char id=8212 x=1944 y=854 width=91 height=14 xoffset=0 yoffset=97 xadvance=90 page=0 chnl=15 +char id=8217 x=2047 y=854 width=34 height=48 xoffset=28 yoffset=36 xadvance=90 page=0 chnl=15 +char id=8220 x=2093 y=854 width=69 height=48 xoffset=10 yoffset=36 xadvance=90 page=0 chnl=15 +char id=8221 x=2174 y=854 width=70 height=48 xoffset=11 yoffset=36 xadvance=90 page=0 chnl=15 +char id=8222 x=2256 y=854 width=70 height=48 xoffset=11 yoffset=131 xadvance=90 page=0 chnl=15 +char id=8226 x=2338 y=854 width=38 height=38 xoffset=26 yoffset=80 xadvance=90 page=0 chnl=15 +char id=8364 x=2388 y=854 width=81 height=113 xoffset=2 yoffset=43 xadvance=90 page=0 chnl=15 +char id=8627 x=2481 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8679 x=2493 y=854 width=87 height=115 xoffset=2 yoffset=39 xadvance=90 page=0 chnl=15 +char id=9003 x=2592 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9251 x=2604 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9654 x=2616 y=854 width=93 height=95 xoffset=0 yoffset=52 xadvance=90 page=0 chnl=15 +char id=9664 x=2721 y=854 width=93 height=95 xoffset=-2 yoffset=52 xadvance=90 page=0 chnl=15 +char id=9675 x=2826 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9679 x=2838 y=854 width=95 height=95 xoffset=-2 yoffset=52 xadvance=90 page=0 chnl=15 +char id=9881 x=2945 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=2957 y=854 width=81 height=79 xoffset=5 yoffset=59 xadvance=90 page=0 chnl=15 +char id=10004 x=3050 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=3062 y=854 width=73 height=73 xoffset=9 yoffset=67 xadvance=90 page=0 chnl=15 +char id=65039 x=3147 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=3159 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=3171 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.png b/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.png new file mode 100644 index 000000000..6f331aa90 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.png differ diff --git a/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.ttf b/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.ttf new file mode 100644 index 000000000..a6ba5529a Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/NotoColorEmoji.ttf b/iqpilot/selfdrive/assets/fonts/NotoColorEmoji.ttf new file mode 100644 index 000000000..d94a23d77 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/NotoColorEmoji.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.fnt b/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.fnt new file mode 100644 index 000000000..28e3c570b --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.fnt @@ -0,0 +1,254 @@ +info face="Syncopate-Regular" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=206 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Syncopate-Regular.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=77 height=200 xoffset=0 yoffset=0 xadvance=77 page=0 chnl=15 +char id=33 x=107 y=6 width=17 height=139 xoffset=20 yoffset=18 xadvance=56 page=0 chnl=15 +char id=34 x=136 y=6 width=46 height=42 xoffset=7 yoffset=18 xadvance=59 page=0 chnl=15 +char id=35 x=194 y=6 width=125 height=139 xoffset=10 yoffset=18 xadvance=144 page=0 chnl=15 +char id=36 x=331 y=6 width=126 height=161 xoffset=16 yoffset=7 xadvance=158 page=0 chnl=15 +char id=37 x=469 y=6 width=177 height=145 xoffset=10 yoffset=15 xadvance=205 page=0 chnl=15 +char id=38 x=658 y=6 width=164 height=145 xoffset=15 yoffset=15 xadvance=191 page=0 chnl=15 +char id=39 x=834 y=6 width=15 height=42 xoffset=7 yoffset=18 xadvance=28 page=0 chnl=15 +char id=40 x=861 y=6 width=51 height=168 xoffset=16 yoffset=4 xadvance=86 page=0 chnl=15 +char id=41 x=924 y=6 width=51 height=168 xoffset=20 yoffset=4 xadvance=86 page=0 chnl=15 +char id=42 x=987 y=6 width=80 height=81 xoffset=12 yoffset=18 xadvance=104 page=0 chnl=15 +char id=43 x=1079 y=6 width=97 height=98 xoffset=17 yoffset=39 xadvance=131 page=0 chnl=15 +char id=44 x=1188 y=6 width=26 height=43 xoffset=4 yoffset=135 xadvance=38 page=0 chnl=15 +char id=45 x=1226 y=6 width=80 height=13 xoffset=16 yoffset=81 xadvance=111 page=0 chnl=15 +char id=46 x=1318 y=6 width=18 height=22 xoffset=10 yoffset=135 xadvance=38 page=0 chnl=15 +char id=47 x=1348 y=6 width=81 height=150 xoffset=11 yoffset=12 xadvance=103 page=0 chnl=15 +char id=48 x=1441 y=6 width=148 height=145 xoffset=12 yoffset=15 xadvance=172 page=0 chnl=15 +char id=49 x=1601 y=6 width=46 height=139 xoffset=0 yoffset=18 xadvance=70 page=0 chnl=15 +char id=50 x=1659 y=6 width=131 height=142 xoffset=8 yoffset=15 xadvance=150 page=0 chnl=15 +char id=51 x=1802 y=6 width=128 height=145 xoffset=8 yoffset=15 xadvance=150 page=0 chnl=15 +char id=52 x=1942 y=6 width=147 height=139 xoffset=6 yoffset=18 xadvance=158 page=0 chnl=15 +char id=53 x=2101 y=6 width=129 height=142 xoffset=12 yoffset=18 xadvance=152 page=0 chnl=15 +char id=54 x=2242 y=6 width=139 height=145 xoffset=13 yoffset=15 xadvance=159 page=0 chnl=15 +char id=55 x=2393 y=6 width=133 height=139 xoffset=0 yoffset=18 xadvance=138 page=0 chnl=15 +char id=56 x=2538 y=6 width=142 height=145 xoffset=11 yoffset=15 xadvance=164 page=0 chnl=15 +char id=57 x=2692 y=6 width=139 height=145 xoffset=9 yoffset=15 xadvance=160 page=0 chnl=15 +char id=58 x=2843 y=6 width=19 height=97 xoffset=16 yoffset=60 xadvance=50 page=0 chnl=15 +char id=59 x=2874 y=6 width=26 height=118 xoffset=9 yoffset=60 xadvance=48 page=0 chnl=15 +char id=60 x=2912 y=6 width=100 height=99 xoffset=15 yoffset=38 xadvance=131 page=0 chnl=15 +char id=61 x=3024 y=6 width=97 height=50 xoffset=17 yoffset=63 xadvance=131 page=0 chnl=15 +char id=62 x=3133 y=6 width=99 height=99 xoffset=17 yoffset=38 xadvance=131 page=0 chnl=15 +char id=63 x=3244 y=6 width=92 height=142 xoffset=12 yoffset=15 xadvance=117 page=0 chnl=15 +char id=64 x=3348 y=6 width=180 height=146 xoffset=15 yoffset=14 xadvance=209 page=0 chnl=15 +char id=65 x=3540 y=6 width=161 height=139 xoffset=4 yoffset=18 xadvance=168 page=0 chnl=15 +char id=66 x=3713 y=6 width=138 height=139 xoffset=23 yoffset=18 xadvance=172 page=0 chnl=15 +char id=67 x=3863 y=6 width=153 height=145 xoffset=13 yoffset=15 xadvance=179 page=0 chnl=15 +char id=68 x=6 y=218 width=152 height=139 xoffset=23 yoffset=18 xadvance=188 page=0 chnl=15 +char id=69 x=170 y=218 width=118 height=139 xoffset=23 yoffset=18 xadvance=156 page=0 chnl=15 +char id=70 x=300 y=218 width=111 height=139 xoffset=23 yoffset=18 xadvance=142 page=0 chnl=15 +char id=71 x=423 y=218 width=159 height=145 xoffset=13 yoffset=15 xadvance=188 page=0 chnl=15 +char id=72 x=594 y=218 width=150 height=139 xoffset=23 yoffset=18 xadvance=196 page=0 chnl=15 +char id=73 x=756 y=218 width=13 height=139 xoffset=23 yoffset=18 xadvance=59 page=0 chnl=15 +char id=74 x=781 y=218 width=100 height=141 xoffset=0 yoffset=18 xadvance=122 page=0 chnl=15 +char id=75 x=893 y=218 width=141 height=139 xoffset=23 yoffset=18 xadvance=166 page=0 chnl=15 +char id=76 x=1046 y=218 width=115 height=139 xoffset=23 yoffset=18 xadvance=144 page=0 chnl=15 +char id=77 x=1173 y=218 width=190 height=139 xoffset=23 yoffset=18 xadvance=235 page=0 chnl=15 +char id=78 x=1375 y=218 width=148 height=139 xoffset=23 yoffset=18 xadvance=193 page=0 chnl=15 +char id=79 x=1535 y=218 width=177 height=145 xoffset=13 yoffset=15 xadvance=203 page=0 chnl=15 +char id=80 x=1724 y=218 width=136 height=139 xoffset=23 yoffset=18 xadvance=169 page=0 chnl=15 +char id=81 x=1872 y=218 width=190 height=147 xoffset=13 yoffset=15 xadvance=203 page=0 chnl=15 +char id=82 x=2074 y=218 width=142 height=139 xoffset=23 yoffset=18 xadvance=172 page=0 chnl=15 +char id=83 x=2228 y=218 width=131 height=145 xoffset=16 yoffset=15 xadvance=162 page=0 chnl=15 +char id=84 x=2371 y=218 width=140 height=139 xoffset=3 yoffset=18 xadvance=146 page=0 chnl=15 +char id=85 x=2523 y=218 width=141 height=142 xoffset=22 yoffset=18 xadvance=184 page=0 chnl=15 +char id=86 x=2676 y=218 width=159 height=139 xoffset=5 yoffset=18 xadvance=169 page=0 chnl=15 +char id=87 x=2847 y=218 width=247 height=139 xoffset=7 yoffset=18 xadvance=261 page=0 chnl=15 +char id=88 x=3106 y=218 width=152 height=139 xoffset=9 yoffset=18 xadvance=169 page=0 chnl=15 +char id=89 x=3270 y=218 width=144 height=139 xoffset=7 yoffset=18 xadvance=157 page=0 chnl=15 +char id=90 x=3426 y=218 width=124 height=139 xoffset=14 yoffset=18 xadvance=150 page=0 chnl=15 +char id=91 x=3562 y=218 width=49 height=164 xoffset=26 yoffset=6 xadvance=84 page=0 chnl=15 +char id=92 x=3623 y=218 width=81 height=150 xoffset=11 yoffset=12 xadvance=103 page=0 chnl=15 +char id=93 x=3716 y=218 width=49 height=164 xoffset=10 yoffset=6 xadvance=84 page=0 chnl=15 +char id=94 x=3777 y=218 width=83 height=60 xoffset=6 yoffset=18 xadvance=95 page=0 chnl=15 +char id=95 x=3872 y=218 width=104 height=13 xoffset=0 yoffset=170 xadvance=103 page=0 chnl=15 +char id=96 x=3988 y=218 width=50 height=31 xoffset=18 yoffset=12 xadvance=109 page=0 chnl=15 +char id=97 x=6 y=430 width=150 height=145 xoffset=12 yoffset=15 xadvance=183 page=0 chnl=15 +char id=98 x=168 y=430 width=138 height=139 xoffset=23 yoffset=18 xadvance=172 page=0 chnl=15 +char id=99 x=318 y=430 width=153 height=145 xoffset=13 yoffset=15 xadvance=179 page=0 chnl=15 +char id=100 x=483 y=430 width=152 height=139 xoffset=23 yoffset=18 xadvance=188 page=0 chnl=15 +char id=101 x=647 y=430 width=162 height=144 xoffset=13 yoffset=16 xadvance=188 page=0 chnl=15 +char id=102 x=821 y=430 width=134 height=139 xoffset=23 yoffset=18 xadvance=169 page=0 chnl=15 +char id=103 x=967 y=430 width=159 height=145 xoffset=13 yoffset=15 xadvance=188 page=0 chnl=15 +char id=104 x=1138 y=430 width=150 height=139 xoffset=23 yoffset=18 xadvance=196 page=0 chnl=15 +char id=105 x=1300 y=430 width=13 height=139 xoffset=23 yoffset=18 xadvance=59 page=0 chnl=15 +char id=106 x=1325 y=430 width=100 height=141 xoffset=0 yoffset=18 xadvance=122 page=0 chnl=15 +char id=107 x=1437 y=430 width=144 height=139 xoffset=23 yoffset=18 xadvance=179 page=0 chnl=15 +char id=108 x=1593 y=430 width=122 height=139 xoffset=23 yoffset=18 xadvance=146 page=0 chnl=15 +char id=109 x=1727 y=430 width=212 height=142 xoffset=23 yoffset=15 xadvance=257 page=0 chnl=15 +char id=110 x=1951 y=430 width=148 height=142 xoffset=23 yoffset=15 xadvance=192 page=0 chnl=15 +char id=111 x=2111 y=430 width=177 height=145 xoffset=13 yoffset=15 xadvance=203 page=0 chnl=15 +char id=112 x=2300 y=430 width=136 height=139 xoffset=23 yoffset=18 xadvance=169 page=0 chnl=15 +char id=113 x=2448 y=430 width=189 height=146 xoffset=13 yoffset=15 xadvance=203 page=0 chnl=15 +char id=114 x=2649 y=430 width=104 height=143 xoffset=23 yoffset=14 xadvance=126 page=0 chnl=15 +char id=115 x=2765 y=430 width=131 height=145 xoffset=16 yoffset=15 xadvance=162 page=0 chnl=15 +char id=116 x=2908 y=430 width=140 height=139 xoffset=3 yoffset=18 xadvance=146 page=0 chnl=15 +char id=117 x=3060 y=430 width=148 height=143 xoffset=22 yoffset=18 xadvance=192 page=0 chnl=15 +char id=118 x=3220 y=430 width=159 height=139 xoffset=5 yoffset=18 xadvance=169 page=0 chnl=15 +char id=119 x=3391 y=430 width=247 height=139 xoffset=7 yoffset=18 xadvance=261 page=0 chnl=15 +char id=120 x=3650 y=430 width=152 height=139 xoffset=9 yoffset=18 xadvance=169 page=0 chnl=15 +char id=121 x=3814 y=430 width=147 height=142 xoffset=18 yoffset=18 xadvance=188 page=0 chnl=15 +char id=122 x=6 y=642 width=124 height=139 xoffset=14 yoffset=18 xadvance=150 page=0 chnl=15 +char id=123 x=142 y=642 width=64 height=164 xoffset=6 yoffset=6 xadvance=79 page=0 chnl=15 +char id=124 x=218 y=642 width=14 height=207 xoffset=20 yoffset=-1 xadvance=53 page=0 chnl=15 +char id=125 x=244 y=642 width=64 height=164 xoffset=10 yoffset=6 xadvance=79 page=0 chnl=15 +char id=126 x=320 y=642 width=101 height=24 xoffset=15 yoffset=76 xadvance=131 page=0 chnl=15 +char id=161 x=433 y=642 width=17 height=139 xoffset=20 yoffset=18 xadvance=56 page=0 chnl=15 +char id=163 x=462 y=642 width=140 height=145 xoffset=12 yoffset=15 xadvance=163 page=0 chnl=15 +char id=165 x=614 y=642 width=144 height=139 xoffset=12 yoffset=18 xadvance=167 page=0 chnl=15 +char id=167 x=770 y=642 width=79 height=144 xoffset=12 yoffset=16 xadvance=103 page=0 chnl=15 +char id=171 x=861 y=642 width=75 height=78 xoffset=8 yoffset=49 xadvance=91 page=0 chnl=15 +char id=176 x=948 y=642 width=51 height=51 xoffset=13 yoffset=18 xadvance=77 page=0 chnl=15 +char id=187 x=1011 y=642 width=75 height=78 xoffset=8 yoffset=49 xadvance=91 page=0 chnl=15 +char id=191 x=1098 y=642 width=92 height=142 xoffset=14 yoffset=18 xadvance=117 page=0 chnl=15 +char id=192 x=1202 y=642 width=161 height=181 xoffset=4 yoffset=-24 xadvance=168 page=0 chnl=15 +char id=193 x=1375 y=642 width=161 height=181 xoffset=4 yoffset=-24 xadvance=168 page=0 chnl=15 +char id=195 x=1548 y=642 width=161 height=175 xoffset=4 yoffset=-18 xadvance=168 page=0 chnl=15 +char id=196 x=1721 y=642 width=161 height=169 xoffset=4 yoffset=-12 xadvance=168 page=0 chnl=15 +char id=199 x=1894 y=642 width=153 height=183 xoffset=13 yoffset=15 xadvance=179 page=0 chnl=15 +char id=201 x=2059 y=642 width=118 height=181 xoffset=23 yoffset=-24 xadvance=156 page=0 chnl=15 +char id=202 x=2189 y=642 width=118 height=181 xoffset=23 yoffset=-24 xadvance=156 page=0 chnl=15 +char id=205 x=2319 y=642 width=49 height=181 xoffset=17 yoffset=-24 xadvance=59 page=0 chnl=15 +char id=209 x=2380 y=642 width=148 height=175 xoffset=23 yoffset=-18 xadvance=193 page=0 chnl=15 +char id=211 x=2540 y=642 width=177 height=184 xoffset=13 yoffset=-24 xadvance=203 page=0 chnl=15 +char id=212 x=2729 y=642 width=177 height=184 xoffset=13 yoffset=-24 xadvance=203 page=0 chnl=15 +char id=214 x=2918 y=642 width=177 height=172 xoffset=13 yoffset=-12 xadvance=203 page=0 chnl=15 +char id=215 x=3107 y=642 width=87 height=86 xoffset=22 yoffset=45 xadvance=131 page=0 chnl=15 +char id=218 x=3206 y=642 width=141 height=184 xoffset=22 yoffset=-24 xadvance=184 page=0 chnl=15 +char id=220 x=3359 y=642 width=141 height=172 xoffset=22 yoffset=-12 xadvance=184 page=0 chnl=15 +char id=223 x=3512 y=642 width=148 height=146 xoffset=19 yoffset=14 xadvance=178 page=0 chnl=15 +char id=224 x=3672 y=642 width=150 height=184 xoffset=12 yoffset=-24 xadvance=183 page=0 chnl=15 +char id=225 x=3834 y=642 width=150 height=184 xoffset=12 yoffset=-24 xadvance=183 page=0 chnl=15 +char id=226 x=6 y=854 width=150 height=184 xoffset=12 yoffset=-24 xadvance=183 page=0 chnl=15 +char id=227 x=168 y=854 width=150 height=178 xoffset=12 yoffset=-18 xadvance=183 page=0 chnl=15 +char id=228 x=330 y=854 width=150 height=172 xoffset=12 yoffset=-12 xadvance=183 page=0 chnl=15 +char id=231 x=492 y=854 width=153 height=183 xoffset=13 yoffset=15 xadvance=179 page=0 chnl=15 +char id=232 x=657 y=854 width=162 height=184 xoffset=13 yoffset=-24 xadvance=188 page=0 chnl=15 +char id=233 x=831 y=854 width=162 height=184 xoffset=13 yoffset=-24 xadvance=188 page=0 chnl=15 +char id=234 x=1005 y=854 width=162 height=184 xoffset=13 yoffset=-24 xadvance=188 page=0 chnl=15 +char id=237 x=1179 y=854 width=49 height=181 xoffset=17 yoffset=-24 xadvance=59 page=0 chnl=15 +char id=238 x=1240 y=854 width=79 height=181 xoffset=-10 yoffset=-24 xadvance=59 page=0 chnl=15 +char id=241 x=1331 y=854 width=148 height=175 xoffset=23 yoffset=-18 xadvance=192 page=0 chnl=15 +char id=243 x=1491 y=854 width=177 height=184 xoffset=13 yoffset=-24 xadvance=203 page=0 chnl=15 +char id=244 x=1680 y=854 width=177 height=184 xoffset=13 yoffset=-24 xadvance=203 page=0 chnl=15 +char id=245 x=1869 y=854 width=177 height=178 xoffset=13 yoffset=-18 xadvance=203 page=0 chnl=15 +char id=246 x=2058 y=854 width=177 height=172 xoffset=13 yoffset=-12 xadvance=203 page=0 chnl=15 +char id=249 x=2247 y=854 width=148 height=185 xoffset=22 yoffset=-24 xadvance=192 page=0 chnl=15 +char id=250 x=2407 y=854 width=148 height=185 xoffset=22 yoffset=-24 xadvance=192 page=0 chnl=15 +char id=251 x=2567 y=854 width=148 height=185 xoffset=22 yoffset=-24 xadvance=192 page=0 chnl=15 +char id=252 x=2727 y=854 width=148 height=173 xoffset=22 yoffset=-12 xadvance=192 page=0 chnl=15 +char id=260 x=2887 y=854 width=174 height=175 xoffset=4 yoffset=18 xadvance=168 page=0 chnl=15 +char id=261 x=3073 y=854 width=165 height=178 xoffset=12 yoffset=15 xadvance=183 page=0 chnl=15 +char id=262 x=3250 y=854 width=153 height=184 xoffset=13 yoffset=-24 xadvance=179 page=0 chnl=15 +char id=263 x=3415 y=854 width=153 height=184 xoffset=13 yoffset=-24 xadvance=179 page=0 chnl=15 +char id=280 x=3580 y=854 width=118 height=175 xoffset=23 yoffset=18 xadvance=156 page=0 chnl=15 +char id=281 x=3710 y=854 width=162 height=174 xoffset=13 yoffset=16 xadvance=188 page=0 chnl=15 +char id=286 x=3884 y=854 width=159 height=180 xoffset=13 yoffset=-20 xadvance=188 page=0 chnl=15 +char id=287 x=6 y=1066 width=159 height=180 xoffset=13 yoffset=-20 xadvance=188 page=0 chnl=15 +char id=304 x=177 y=1066 width=17 height=170 xoffset=21 yoffset=-13 xadvance=59 page=0 chnl=15 +char id=305 x=206 y=1066 width=13 height=139 xoffset=23 yoffset=18 xadvance=59 page=0 chnl=15 +char id=321 x=231 y=1066 width=138 height=139 xoffset=0 yoffset=18 xadvance=144 page=0 chnl=15 +char id=322 x=381 y=1066 width=145 height=139 xoffset=0 yoffset=18 xadvance=146 page=0 chnl=15 +char id=323 x=538 y=1066 width=148 height=181 xoffset=23 yoffset=-24 xadvance=193 page=0 chnl=15 +char id=324 x=698 y=1066 width=148 height=181 xoffset=23 yoffset=-24 xadvance=192 page=0 chnl=15 +char id=339 x=858 y=1066 width=325 height=145 xoffset=13 yoffset=15 xadvance=349 page=0 chnl=15 +char id=346 x=1195 y=1066 width=131 height=184 xoffset=16 yoffset=-24 xadvance=162 page=0 chnl=15 +char id=347 x=1338 y=1066 width=131 height=184 xoffset=16 yoffset=-24 xadvance=162 page=0 chnl=15 +char id=350 x=1481 y=1066 width=131 height=183 xoffset=16 yoffset=15 xadvance=162 page=0 chnl=15 +char id=351 x=1624 y=1066 width=131 height=183 xoffset=16 yoffset=15 xadvance=162 page=0 chnl=15 +char id=377 x=1767 y=1066 width=124 height=181 xoffset=14 yoffset=-24 xadvance=150 page=0 chnl=15 +char id=378 x=1903 y=1066 width=124 height=181 xoffset=14 yoffset=-24 xadvance=150 page=0 chnl=15 +char id=379 x=2039 y=1066 width=124 height=170 xoffset=14 yoffset=-13 xadvance=150 page=0 chnl=15 +char id=380 x=2175 y=1066 width=124 height=170 xoffset=14 yoffset=-13 xadvance=150 page=0 chnl=15 +char id=1028 x=2311 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1030 x=2323 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1040 x=2335 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1041 x=2347 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1042 x=2359 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1043 x=2371 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1044 x=2383 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1045 x=2395 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1046 x=2407 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1047 x=2419 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1048 x=2431 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1049 x=2443 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1050 x=2455 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1051 x=2467 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1052 x=2479 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1053 x=2491 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1054 x=2503 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1055 x=2515 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1056 x=2527 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1057 x=2539 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1058 x=2551 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1059 x=2563 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1060 x=2575 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1061 x=2587 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1062 x=2599 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1063 x=2611 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1064 x=2623 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1065 x=2635 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1068 x=2647 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1070 x=2659 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1071 x=2671 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1072 x=2683 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1073 x=2695 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1074 x=2707 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1075 x=2719 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1076 x=2731 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1077 x=2743 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1078 x=2755 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1079 x=2767 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1080 x=2779 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1081 x=2791 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1082 x=2803 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1083 x=2815 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1084 x=2827 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1085 x=2839 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1086 x=2851 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1087 x=2863 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1088 x=2875 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1089 x=2887 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1090 x=2899 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1091 x=2911 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1092 x=2923 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1093 x=2935 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1094 x=2947 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1095 x=2959 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1096 x=2971 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1097 x=2983 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1100 x=2995 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1102 x=3007 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1103 x=3019 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1108 x=3031 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1110 x=3043 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1111 x=3055 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8209 x=3067 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=3079 y=1066 width=79 height=12 xoffset=4 yoffset=82 xadvance=86 page=0 chnl=15 +char id=8212 x=3170 y=1066 width=207 height=12 xoffset=0 yoffset=82 xadvance=206 page=0 chnl=15 +char id=8217 x=3389 y=1066 width=22 height=37 xoffset=6 yoffset=18 xadvance=33 page=0 chnl=15 +char id=8220 x=3423 y=1066 width=51 height=37 xoffset=6 yoffset=18 xadvance=62 page=0 chnl=15 +char id=8221 x=3486 y=1066 width=51 height=37 xoffset=6 yoffset=18 xadvance=62 page=0 chnl=15 +char id=8222 x=3549 y=1066 width=51 height=37 xoffset=6 yoffset=139 xadvance=62 page=0 chnl=15 +char id=8226 x=3612 y=1066 width=41 height=41 xoffset=16 yoffset=65 xadvance=72 page=0 chnl=15 +char id=8364 x=3665 y=1066 width=152 height=145 xoffset=5 yoffset=15 xadvance=172 page=0 chnl=15 +char id=8627 x=3829 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8679 x=3841 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9003 x=3853 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9251 x=3865 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9654 x=3877 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9664 x=3889 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9675 x=3901 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9679 x=3913 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9881 x=3925 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=3937 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10004 x=3949 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=3961 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=3973 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=3985 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=3997 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.png b/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.png new file mode 100644 index 000000000..8ede5177a Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.ttf b/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.ttf new file mode 100644 index 000000000..a1fbf3f34 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Syncopate-Regular.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/Tektur-Variable.fnt b/iqpilot/selfdrive/assets/fonts/Tektur-Variable.fnt new file mode 100644 index 000000000..e593e9fee --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/Tektur-Variable.fnt @@ -0,0 +1,254 @@ +info face="Tektur-Variable" size=-200 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=200 base=200 scaleW=4096 scaleH=2048 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="Tektur-Variable.png" +chars count=250 +char id=10 x=6 y=6 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=32 x=18 y=6 width=40 height=200 xoffset=0 yoffset=0 xadvance=40 page=0 chnl=15 +char id=33 x=70 y=6 width=17 height=108 xoffset=12 yoffset=45 xadvance=41 page=0 chnl=15 +char id=34 x=99 y=6 width=44 height=38 xoffset=9 yoffset=45 xadvance=61 page=0 chnl=15 +char id=35 x=155 y=6 width=108 height=108 xoffset=9 yoffset=45 xadvance=126 page=0 chnl=15 +char id=36 x=275 y=6 width=84 height=127 xoffset=9 yoffset=36 xadvance=101 page=0 chnl=15 +char id=37 x=371 y=6 width=84 height=108 xoffset=4 yoffset=45 xadvance=92 page=0 chnl=15 +char id=38 x=467 y=6 width=102 height=108 xoffset=8 yoffset=45 xadvance=113 page=0 chnl=15 +char id=39 x=581 y=6 width=16 height=38 xoffset=9 yoffset=45 xadvance=33 page=0 chnl=15 +char id=40 x=609 y=6 width=41 height=138 xoffset=9 yoffset=37 xadvance=52 page=0 chnl=15 +char id=41 x=662 y=6 width=41 height=138 xoffset=3 yoffset=37 xadvance=52 page=0 chnl=15 +char id=42 x=715 y=6 width=72 height=72 xoffset=4 yoffset=45 xadvance=80 page=0 chnl=15 +char id=43 x=799 y=6 width=81 height=81 xoffset=6 yoffset=63 xadvance=92 page=0 chnl=15 +char id=44 x=892 y=6 width=25 height=38 xoffset=4 yoffset=137 xadvance=38 page=0 chnl=15 +char id=45 x=929 y=6 width=41 height=15 xoffset=6 yoffset=96 xadvance=52 page=0 chnl=15 +char id=46 x=982 y=6 width=15 height=16 xoffset=12 yoffset=137 xadvance=38 page=0 chnl=15 +char id=47 x=1009 y=6 width=66 height=108 xoffset=1 yoffset=45 xadvance=67 page=0 chnl=15 +char id=48 x=1087 y=6 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15 +char id=49 x=1181 y=6 width=54 height=109 xoffset=6 yoffset=45 xadvance=66 page=0 chnl=15 +char id=50 x=1247 y=6 width=84 height=108 xoffset=9 yoffset=45 xadvance=101 page=0 chnl=15 +char id=51 x=1343 y=6 width=84 height=108 xoffset=4 yoffset=45 xadvance=93 page=0 chnl=15 +char id=52 x=1439 y=6 width=84 height=108 xoffset=6 yoffset=45 xadvance=98 page=0 chnl=15 +char id=53 x=1535 y=6 width=84 height=108 xoffset=9 yoffset=45 xadvance=101 page=0 chnl=15 +char id=54 x=1631 y=6 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15 +char id=55 x=1725 y=6 width=84 height=108 xoffset=6 yoffset=45 xadvance=95 page=0 chnl=15 +char id=56 x=1821 y=6 width=89 height=108 xoffset=7 yoffset=45 xadvance=103 page=0 chnl=15 +char id=57 x=1922 y=6 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15 +char id=58 x=2016 y=6 width=15 height=71 xoffset=12 yoffset=82 xadvance=38 page=0 chnl=15 +char id=59 x=2043 y=6 width=25 height=93 xoffset=2 yoffset=82 xadvance=38 page=0 chnl=15 +char id=60 x=2080 y=6 width=83 height=87 xoffset=4 yoffset=66 xadvance=92 page=0 chnl=15 +char id=61 x=2175 y=6 width=81 height=46 xoffset=6 yoffset=81 xadvance=92 page=0 chnl=15 +char id=62 x=2268 y=6 width=82 height=87 xoffset=6 yoffset=66 xadvance=92 page=0 chnl=15 +char id=63 x=2362 y=6 width=81 height=108 xoffset=2 yoffset=45 xadvance=84 page=0 chnl=15 +char id=64 x=2455 y=6 width=105 height=130 xoffset=9 yoffset=45 xadvance=123 page=0 chnl=15 +char id=65 x=2572 y=6 width=94 height=108 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15 +char id=66 x=2678 y=6 width=84 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15 +char id=67 x=2774 y=6 width=71 height=108 xoffset=9 yoffset=45 xadvance=84 page=0 chnl=15 +char id=68 x=2857 y=6 width=80 height=108 xoffset=9 yoffset=45 xadvance=97 page=0 chnl=15 +char id=69 x=2949 y=6 width=76 height=108 xoffset=9 yoffset=45 xadvance=89 page=0 chnl=15 +char id=70 x=3037 y=6 width=75 height=108 xoffset=9 yoffset=45 xadvance=87 page=0 chnl=15 +char id=71 x=3124 y=6 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15 +char id=72 x=3218 y=6 width=85 height=108 xoffset=9 yoffset=45 xadvance=103 page=0 chnl=15 +char id=73 x=3315 y=6 width=54 height=110 xoffset=6 yoffset=44 xadvance=66 page=0 chnl=15 +char id=74 x=3381 y=6 width=78 height=108 xoffset=6 yoffset=45 xadvance=92 page=0 chnl=15 +char id=75 x=3471 y=6 width=87 height=108 xoffset=9 yoffset=45 xadvance=96 page=0 chnl=15 +char id=76 x=3570 y=6 width=79 height=108 xoffset=9 yoffset=45 xadvance=92 page=0 chnl=15 +char id=77 x=3661 y=6 width=102 height=108 xoffset=9 yoffset=45 xadvance=120 page=0 chnl=15 +char id=78 x=3775 y=6 width=87 height=108 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15 +char id=79 x=3874 y=6 width=87 height=108 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15 +char id=80 x=3973 y=6 width=81 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15 +char id=81 x=6 y=218 width=93 height=122 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15 +char id=82 x=111 y=218 width=91 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15 +char id=83 x=214 y=218 width=81 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15 +char id=84 x=307 y=218 width=81 height=108 xoffset=3 yoffset=45 xadvance=86 page=0 chnl=15 +char id=85 x=400 y=218 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15 +char id=86 x=494 y=218 width=94 height=108 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15 +char id=87 x=600 y=218 width=127 height=108 xoffset=3 yoffset=45 xadvance=132 page=0 chnl=15 +char id=88 x=739 y=218 width=96 height=108 xoffset=3 yoffset=45 xadvance=101 page=0 chnl=15 +char id=89 x=847 y=218 width=92 height=108 xoffset=3 yoffset=45 xadvance=98 page=0 chnl=15 +char id=90 x=951 y=218 width=72 height=108 xoffset=7 yoffset=45 xadvance=86 page=0 chnl=15 +char id=91 x=1035 y=218 width=41 height=138 xoffset=9 yoffset=37 xadvance=52 page=0 chnl=15 +char id=92 x=1088 y=218 width=66 height=108 xoffset=1 yoffset=45 xadvance=67 page=0 chnl=15 +char id=93 x=1166 y=218 width=41 height=138 xoffset=3 yoffset=37 xadvance=52 page=0 chnl=15 +char id=94 x=1219 y=218 width=73 height=55 xoffset=2 yoffset=45 xadvance=76 page=0 chnl=15 +char id=95 x=1304 y=218 width=81 height=13 xoffset=6 yoffset=153 xadvance=92 page=0 chnl=15 +char id=96 x=1397 y=218 width=51 height=14 xoffset=333 yoffset=41 xadvance=378 page=0 chnl=15 +char id=97 x=1460 y=218 width=77 height=87 xoffset=7 yoffset=66 xadvance=92 page=0 chnl=15 +char id=98 x=1549 y=218 width=78 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15 +char id=99 x=1639 y=218 width=72 height=87 xoffset=8 yoffset=66 xadvance=83 page=0 chnl=15 +char id=100 x=1723 y=218 width=79 height=108 xoffset=8 yoffset=45 xadvance=95 page=0 chnl=15 +char id=101 x=1814 y=218 width=75 height=87 xoffset=8 yoffset=66 xadvance=90 page=0 chnl=15 +char id=102 x=1901 y=218 width=52 height=108 xoffset=9 yoffset=45 xadvance=63 page=0 chnl=15 +char id=103 x=1965 y=218 width=77 height=109 xoffset=8 yoffset=66 xadvance=93 page=0 chnl=15 +char id=104 x=2054 y=218 width=78 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15 +char id=105 x=2144 y=218 width=15 height=110 xoffset=9 yoffset=43 xadvance=32 page=0 chnl=15 +char id=106 x=2171 y=218 width=15 height=132 xoffset=9 yoffset=43 xadvance=32 page=0 chnl=15 +char id=107 x=2198 y=218 width=82 height=108 xoffset=9 yoffset=45 xadvance=92 page=0 chnl=15 +char id=108 x=2292 y=218 width=15 height=108 xoffset=9 yoffset=45 xadvance=32 page=0 chnl=15 +char id=109 x=2319 y=218 width=124 height=87 xoffset=9 yoffset=66 xadvance=141 page=0 chnl=15 +char id=110 x=2455 y=218 width=78 height=87 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15 +char id=111 x=2545 y=218 width=76 height=87 xoffset=8 yoffset=66 xadvance=92 page=0 chnl=15 +char id=112 x=2633 y=218 width=78 height=109 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15 +char id=113 x=2723 y=218 width=79 height=109 xoffset=8 yoffset=66 xadvance=95 page=0 chnl=15 +char id=114 x=2814 y=218 width=61 height=87 xoffset=9 yoffset=66 xadvance=72 page=0 chnl=15 +char id=115 x=2887 y=218 width=76 height=87 xoffset=8 yoffset=66 xadvance=92 page=0 chnl=15 +char id=116 x=2975 y=218 width=55 height=108 xoffset=9 yoffset=45 xadvance=66 page=0 chnl=15 +char id=117 x=3042 y=218 width=78 height=87 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15 +char id=118 x=3132 y=218 width=87 height=87 xoffset=1 yoffset=66 xadvance=89 page=0 chnl=15 +char id=119 x=3231 y=218 width=118 height=87 xoffset=6 yoffset=66 xadvance=129 page=0 chnl=15 +char id=120 x=3361 y=218 width=91 height=87 xoffset=3 yoffset=66 xadvance=96 page=0 chnl=15 +char id=121 x=3464 y=218 width=90 height=109 xoffset=1 yoffset=66 xadvance=92 page=0 chnl=15 +char id=122 x=3566 y=218 width=73 height=87 xoffset=4 yoffset=66 xadvance=81 page=0 chnl=15 +char id=123 x=3651 y=218 width=56 height=138 xoffset=3 yoffset=37 xadvance=61 page=0 chnl=15 +char id=124 x=3719 y=218 width=15 height=139 xoffset=9 yoffset=36 xadvance=32 page=0 chnl=15 +char id=125 x=3746 y=218 width=56 height=138 xoffset=3 yoffset=37 xadvance=61 page=0 chnl=15 +char id=126 x=3814 y=218 width=87 height=35 xoffset=3 yoffset=85 xadvance=92 page=0 chnl=15 +char id=161 x=3913 y=218 width=17 height=109 xoffset=12 yoffset=66 xadvance=41 page=0 chnl=15 +char id=163 x=3942 y=218 width=92 height=108 xoffset=4 yoffset=45 xadvance=100 page=0 chnl=15 +char id=165 x=6 y=430 width=92 height=108 xoffset=3 yoffset=45 xadvance=98 page=0 chnl=15 +char id=167 x=110 y=430 width=82 height=123 xoffset=8 yoffset=45 xadvance=98 page=0 chnl=15 +char id=171 x=204 y=430 width=99 height=87 xoffset=3 yoffset=66 xadvance=106 page=0 chnl=15 +char id=176 x=315 y=430 width=44 height=44 xoffset=3 yoffset=45 xadvance=49 page=0 chnl=15 +char id=187 x=371 y=430 width=100 height=87 xoffset=4 yoffset=66 xadvance=106 page=0 chnl=15 +char id=191 x=483 y=430 width=81 height=109 xoffset=2 yoffset=66 xadvance=84 page=0 chnl=15 +char id=192 x=576 y=430 width=94 height=134 xoffset=3 yoffset=19 xadvance=100 page=0 chnl=15 +char id=193 x=682 y=430 width=94 height=134 xoffset=3 yoffset=19 xadvance=100 page=0 chnl=15 +char id=195 x=788 y=430 width=94 height=138 xoffset=3 yoffset=15 xadvance=100 page=0 chnl=15 +char id=196 x=894 y=430 width=94 height=131 xoffset=3 yoffset=22 xadvance=100 page=0 chnl=15 +char id=199 x=1000 y=430 width=71 height=139 xoffset=9 yoffset=45 xadvance=84 page=0 chnl=15 +char id=201 x=1083 y=430 width=76 height=134 xoffset=9 yoffset=19 xadvance=89 page=0 chnl=15 +char id=202 x=1171 y=430 width=76 height=140 xoffset=9 yoffset=13 xadvance=89 page=0 chnl=15 +char id=205 x=1259 y=430 width=57 height=135 xoffset=6 yoffset=19 xadvance=66 page=0 chnl=15 +char id=209 x=1328 y=430 width=87 height=138 xoffset=9 yoffset=15 xadvance=104 page=0 chnl=15 +char id=211 x=1427 y=430 width=87 height=134 xoffset=9 yoffset=19 xadvance=104 page=0 chnl=15 +char id=212 x=1526 y=430 width=87 height=140 xoffset=9 yoffset=13 xadvance=104 page=0 chnl=15 +char id=214 x=1625 y=430 width=87 height=131 xoffset=9 yoffset=22 xadvance=104 page=0 chnl=15 +char id=215 x=1724 y=430 width=75 height=75 xoffset=9 yoffset=66 xadvance=92 page=0 chnl=15 +char id=218 x=1811 y=430 width=82 height=134 xoffset=9 yoffset=19 xadvance=100 page=0 chnl=15 +char id=220 x=1905 y=430 width=82 height=131 xoffset=9 yoffset=22 xadvance=100 page=0 chnl=15 +char id=223 x=1999 y=430 width=82 height=108 xoffset=9 yoffset=45 xadvance=96 page=0 chnl=15 +char id=224 x=2093 y=430 width=77 height=112 xoffset=7 yoffset=41 xadvance=92 page=0 chnl=15 +char id=225 x=2182 y=430 width=77 height=112 xoffset=7 yoffset=41 xadvance=92 page=0 chnl=15 +char id=226 x=2271 y=430 width=77 height=118 xoffset=7 yoffset=35 xadvance=92 page=0 chnl=15 +char id=227 x=2360 y=430 width=77 height=117 xoffset=7 yoffset=36 xadvance=92 page=0 chnl=15 +char id=228 x=2449 y=430 width=77 height=110 xoffset=7 yoffset=43 xadvance=92 page=0 chnl=15 +char id=231 x=2538 y=430 width=72 height=118 xoffset=8 yoffset=66 xadvance=83 page=0 chnl=15 +char id=232 x=2622 y=430 width=75 height=112 xoffset=8 yoffset=41 xadvance=90 page=0 chnl=15 +char id=233 x=2709 y=430 width=75 height=112 xoffset=8 yoffset=41 xadvance=90 page=0 chnl=15 +char id=234 x=2796 y=430 width=75 height=118 xoffset=8 yoffset=35 xadvance=90 page=0 chnl=15 +char id=237 x=2883 y=430 width=26 height=112 xoffset=6 yoffset=41 xadvance=32 page=0 chnl=15 +char id=238 x=2921 y=430 width=60 height=118 xoffset=-14 yoffset=35 xadvance=32 page=0 chnl=15 +char id=241 x=2993 y=430 width=78 height=117 xoffset=9 yoffset=36 xadvance=95 page=0 chnl=15 +char id=243 x=3083 y=430 width=76 height=112 xoffset=8 yoffset=41 xadvance=92 page=0 chnl=15 +char id=244 x=3171 y=430 width=76 height=118 xoffset=8 yoffset=35 xadvance=92 page=0 chnl=15 +char id=245 x=3259 y=430 width=76 height=117 xoffset=8 yoffset=36 xadvance=92 page=0 chnl=15 +char id=246 x=3347 y=430 width=76 height=110 xoffset=8 yoffset=43 xadvance=92 page=0 chnl=15 +char id=249 x=3435 y=430 width=78 height=112 xoffset=9 yoffset=41 xadvance=95 page=0 chnl=15 +char id=250 x=3525 y=430 width=78 height=112 xoffset=9 yoffset=41 xadvance=95 page=0 chnl=15 +char id=251 x=3615 y=430 width=78 height=118 xoffset=9 yoffset=35 xadvance=95 page=0 chnl=15 +char id=252 x=3705 y=430 width=78 height=110 xoffset=9 yoffset=43 xadvance=95 page=0 chnl=15 +char id=260 x=3795 y=430 width=94 height=139 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15 +char id=261 x=3901 y=430 width=77 height=118 xoffset=7 yoffset=66 xadvance=92 page=0 chnl=15 +char id=262 x=3990 y=430 width=71 height=134 xoffset=9 yoffset=19 xadvance=84 page=0 chnl=15 +char id=263 x=6 y=642 width=73 height=112 xoffset=8 yoffset=41 xadvance=83 page=0 chnl=15 +char id=280 x=91 y=642 width=76 height=139 xoffset=9 yoffset=45 xadvance=89 page=0 chnl=15 +char id=281 x=179 y=642 width=75 height=118 xoffset=8 yoffset=66 xadvance=90 page=0 chnl=15 +char id=286 x=266 y=642 width=82 height=137 xoffset=9 yoffset=16 xadvance=100 page=0 chnl=15 +char id=287 x=360 y=642 width=77 height=138 xoffset=8 yoffset=37 xadvance=93 page=0 chnl=15 +char id=304 x=449 y=642 width=54 height=132 xoffset=6 yoffset=22 xadvance=66 page=0 chnl=15 +char id=305 x=515 y=642 width=15 height=87 xoffset=9 yoffset=66 xadvance=32 page=0 chnl=15 +char id=321 x=542 y=642 width=79 height=108 xoffset=9 yoffset=45 xadvance=92 page=0 chnl=15 +char id=322 x=633 y=642 width=41 height=108 xoffset=3 yoffset=45 xadvance=47 page=0 chnl=15 +char id=323 x=686 y=642 width=87 height=134 xoffset=9 yoffset=19 xadvance=104 page=0 chnl=15 +char id=324 x=785 y=642 width=78 height=112 xoffset=9 yoffset=41 xadvance=95 page=0 chnl=15 +char id=339 x=875 y=642 width=127 height=87 xoffset=8 yoffset=66 xadvance=143 page=0 chnl=15 +char id=346 x=1014 y=642 width=81 height=134 xoffset=9 yoffset=19 xadvance=98 page=0 chnl=15 +char id=347 x=1107 y=642 width=76 height=112 xoffset=8 yoffset=41 xadvance=92 page=0 chnl=15 +char id=350 x=1195 y=642 width=81 height=139 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15 +char id=351 x=1288 y=642 width=76 height=118 xoffset=8 yoffset=66 xadvance=92 page=0 chnl=15 +char id=377 x=1376 y=642 width=72 height=134 xoffset=7 yoffset=19 xadvance=86 page=0 chnl=15 +char id=378 x=1460 y=642 width=73 height=112 xoffset=4 yoffset=41 xadvance=81 page=0 chnl=15 +char id=379 x=1545 y=642 width=72 height=131 xoffset=7 yoffset=22 xadvance=86 page=0 chnl=15 +char id=380 x=1629 y=642 width=73 height=110 xoffset=4 yoffset=43 xadvance=81 page=0 chnl=15 +char id=1028 x=1714 y=642 width=79 height=108 xoffset=9 yoffset=45 xadvance=92 page=0 chnl=15 +char id=1030 x=1805 y=642 width=54 height=110 xoffset=6 yoffset=44 xadvance=66 page=0 chnl=15 +char id=1040 x=1871 y=642 width=94 height=108 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15 +char id=1041 x=1977 y=642 width=84 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15 +char id=1042 x=2073 y=642 width=84 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15 +char id=1043 x=2169 y=642 width=68 height=108 xoffset=9 yoffset=45 xadvance=78 page=0 chnl=15 +char id=1044 x=2249 y=642 width=107 height=130 xoffset=2 yoffset=45 xadvance=110 page=0 chnl=15 +char id=1045 x=2368 y=642 width=76 height=108 xoffset=9 yoffset=45 xadvance=89 page=0 chnl=15 +char id=1046 x=2456 y=642 width=138 height=108 xoffset=0 yoffset=45 xadvance=138 page=0 chnl=15 +char id=1047 x=2606 y=642 width=85 height=108 xoffset=3 yoffset=45 xadvance=93 page=0 chnl=15 +char id=1048 x=2703 y=642 width=87 height=108 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15 +char id=1049 x=2802 y=642 width=87 height=137 xoffset=9 yoffset=16 xadvance=104 page=0 chnl=15 +char id=1050 x=2901 y=642 width=87 height=108 xoffset=9 yoffset=45 xadvance=96 page=0 chnl=15 +char id=1051 x=3000 y=642 width=91 height=108 xoffset=3 yoffset=45 xadvance=103 page=0 chnl=15 +char id=1052 x=3103 y=642 width=102 height=108 xoffset=9 yoffset=45 xadvance=120 page=0 chnl=15 +char id=1053 x=3217 y=642 width=85 height=108 xoffset=9 yoffset=45 xadvance=103 page=0 chnl=15 +char id=1054 x=3314 y=642 width=87 height=108 xoffset=9 yoffset=45 xadvance=104 page=0 chnl=15 +char id=1055 x=3413 y=642 width=82 height=108 xoffset=9 yoffset=45 xadvance=100 page=0 chnl=15 +char id=1056 x=3507 y=642 width=81 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15 +char id=1057 x=3600 y=642 width=71 height=108 xoffset=9 yoffset=45 xadvance=84 page=0 chnl=15 +char id=1058 x=3683 y=642 width=81 height=108 xoffset=3 yoffset=45 xadvance=86 page=0 chnl=15 +char id=1059 x=3776 y=642 width=90 height=108 xoffset=1 yoffset=45 xadvance=92 page=0 chnl=15 +char id=1060 x=3878 y=642 width=105 height=108 xoffset=9 yoffset=45 xadvance=123 page=0 chnl=15 +char id=1061 x=6 y=854 width=96 height=108 xoffset=3 yoffset=45 xadvance=101 page=0 chnl=15 +char id=1062 x=114 y=854 width=92 height=130 xoffset=9 yoffset=45 xadvance=101 page=0 chnl=15 +char id=1063 x=218 y=854 width=81 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15 +char id=1064 x=311 y=854 width=125 height=108 xoffset=9 yoffset=45 xadvance=143 page=0 chnl=15 +char id=1065 x=448 y=854 width=135 height=130 xoffset=9 yoffset=45 xadvance=144 page=0 chnl=15 +char id=1068 x=595 y=854 width=84 height=108 xoffset=9 yoffset=45 xadvance=98 page=0 chnl=15 +char id=1070 x=691 y=854 width=128 height=108 xoffset=9 yoffset=45 xadvance=146 page=0 chnl=15 +char id=1071 x=831 y=854 width=91 height=108 xoffset=0 yoffset=45 xadvance=100 page=0 chnl=15 +char id=1072 x=934 y=854 width=77 height=87 xoffset=7 yoffset=66 xadvance=92 page=0 chnl=15 +char id=1073 x=1023 y=854 width=78 height=108 xoffset=9 yoffset=45 xadvance=95 page=0 chnl=15 +char id=1074 x=1113 y=854 width=78 height=87 xoffset=9 yoffset=66 xadvance=93 page=0 chnl=15 +char id=1075 x=1203 y=854 width=61 height=87 xoffset=9 yoffset=66 xadvance=72 page=0 chnl=15 +char id=1076 x=1276 y=854 width=77 height=109 xoffset=8 yoffset=66 xadvance=93 page=0 chnl=15 +char id=1077 x=1365 y=854 width=75 height=87 xoffset=8 yoffset=66 xadvance=90 page=0 chnl=15 +char id=1078 x=1452 y=854 width=144 height=87 xoffset=1 yoffset=66 xadvance=146 page=0 chnl=15 +char id=1079 x=1608 y=854 width=78 height=87 xoffset=5 yoffset=66 xadvance=90 page=0 chnl=15 +char id=1080 x=1698 y=854 width=82 height=87 xoffset=9 yoffset=66 xadvance=100 page=0 chnl=15 +char id=1081 x=1792 y=854 width=82 height=116 xoffset=9 yoffset=37 xadvance=100 page=0 chnl=15 +char id=1082 x=1886 y=854 width=85 height=87 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15 +char id=1083 x=1983 y=854 width=85 height=87 xoffset=2 yoffset=66 xadvance=95 page=0 chnl=15 +char id=1084 x=2080 y=854 width=93 height=87 xoffset=9 yoffset=66 xadvance=110 page=0 chnl=15 +char id=1085 x=2185 y=854 width=78 height=87 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15 +char id=1086 x=2275 y=854 width=76 height=87 xoffset=8 yoffset=66 xadvance=92 page=0 chnl=15 +char id=1087 x=2363 y=854 width=77 height=87 xoffset=10 yoffset=66 xadvance=96 page=0 chnl=15 +char id=1088 x=2452 y=854 width=78 height=109 xoffset=9 yoffset=66 xadvance=95 page=0 chnl=15 +char id=1089 x=2542 y=854 width=72 height=87 xoffset=8 yoffset=66 xadvance=83 page=0 chnl=15 +char id=1090 x=2626 y=854 width=81 height=87 xoffset=3 yoffset=66 xadvance=86 page=0 chnl=15 +char id=1091 x=2719 y=854 width=90 height=109 xoffset=1 yoffset=66 xadvance=92 page=0 chnl=15 +char id=1092 x=2821 y=854 width=105 height=130 xoffset=9 yoffset=45 xadvance=123 page=0 chnl=15 +char id=1093 x=2938 y=854 width=91 height=87 xoffset=3 yoffset=66 xadvance=96 page=0 chnl=15 +char id=1094 x=3041 y=854 width=88 height=109 xoffset=9 yoffset=66 xadvance=98 page=0 chnl=15 +char id=1095 x=3141 y=854 width=78 height=87 xoffset=8 yoffset=66 xadvance=94 page=0 chnl=15 +char id=1096 x=3231 y=854 width=119 height=87 xoffset=9 yoffset=66 xadvance=136 page=0 chnl=15 +char id=1097 x=3362 y=854 width=129 height=109 xoffset=9 yoffset=66 xadvance=138 page=0 chnl=15 +char id=1100 x=3503 y=854 width=78 height=87 xoffset=9 yoffset=66 xadvance=93 page=0 chnl=15 +char id=1102 x=3593 y=854 width=108 height=87 xoffset=9 yoffset=66 xadvance=124 page=0 chnl=15 +char id=1103 x=3713 y=854 width=82 height=87 xoffset=2 yoffset=66 xadvance=92 page=0 chnl=15 +char id=1108 x=3807 y=854 width=73 height=87 xoffset=8 yoffset=66 xadvance=86 page=0 chnl=15 +char id=1110 x=3892 y=854 width=15 height=110 xoffset=9 yoffset=43 xadvance=32 page=0 chnl=15 +char id=1111 x=3919 y=854 width=40 height=110 xoffset=-4 yoffset=43 xadvance=32 page=0 chnl=15 +char id=8209 x=3971 y=854 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8211 x=3983 y=854 width=50 height=13 xoffset=6 yoffset=97 xadvance=61 page=0 chnl=15 +char id=8212 x=6 y=1066 width=81 height=13 xoffset=6 yoffset=97 xadvance=92 page=0 chnl=15 +char id=8217 x=99 y=1066 width=25 height=38 xoffset=4 yoffset=45 xadvance=38 page=0 chnl=15 +char id=8220 x=136 y=1066 width=50 height=38 xoffset=10 yoffset=45 xadvance=64 page=0 chnl=15 +char id=8221 x=198 y=1066 width=51 height=38 xoffset=4 yoffset=45 xadvance=64 page=0 chnl=15 +char id=8222 x=261 y=1066 width=51 height=38 xoffset=4 yoffset=137 xadvance=64 page=0 chnl=15 +char id=8226 x=324 y=1066 width=59 height=60 xoffset=9 yoffset=77 xadvance=76 page=0 chnl=15 +char id=8364 x=395 y=1066 width=93 height=108 xoffset=3 yoffset=45 xadvance=100 page=0 chnl=15 +char id=8627 x=500 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8679 x=512 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9003 x=524 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9251 x=536 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9654 x=548 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9664 x=560 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9675 x=572 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9679 x=584 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=9881 x=596 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10003 x=608 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10004 x=620 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=10005 x=632 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=65039 x=644 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=127783 x=656 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 +char id=128293 x=668 y=1066 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/Tektur-Variable.png b/iqpilot/selfdrive/assets/fonts/Tektur-Variable.png new file mode 100644 index 000000000..0fdf2d57c Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Tektur-Variable.png differ diff --git a/iqpilot/selfdrive/assets/fonts/Tektur-Variable.ttf b/iqpilot/selfdrive/assets/fonts/Tektur-Variable.ttf new file mode 100644 index 000000000..d1cf18b3a Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/Tektur-Variable.ttf differ diff --git a/iqpilot/selfdrive/assets/fonts/process.py b/iqpilot/selfdrive/assets/fonts/process.py new file mode 100755 index 000000000..0de61d191 --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/process.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 +import os +from contextlib import contextmanager +from pathlib import Path +import json + + +@contextmanager +def _quiet_fds(*fds): + # mute the raylib load banner (printed on first native use, before any log level applies) + saved = [os.dup(fd) for fd in fds] + devnull = os.open(os.devnull, os.O_WRONLY) + try: + for fd in fds: + os.dup2(devnull, fd) + yield + finally: + for fd, s in zip(fds, saved): + os.dup2(s, fd) + os.close(s) + os.close(devnull) + + +with _quiet_fds(1, 2): + import pyray as rl + rl.set_trace_log_level(rl.TraceLogLevel.LOG_ERROR) # first native call: triggers the banner + +FONT_DIR = Path(__file__).resolve().parent +SELFDRIVE_DIR = FONT_DIR.parents[1] +TRANSLATIONS_DIR = SELFDRIVE_DIR / "ui" / "translations" +LANGUAGES_FILE = TRANSLATIONS_DIR / "languages.json" + +GLYPH_PADDING = 6 +EXTRA_CHARS = "–‑✓×°§â€ĸX⚙✕◀â–ļ✔âŒĢâ‡§âŖâ—‹â—â†ŗÃ§ÃĒÃŧÃąâ€“â€‘âœ“Ã—Â°Â§â€ĸâ‚ŦÂŖÂĨ" +UNIFONT_LANGUAGES = {"ar", "th", "zh-CHT", "zh-CHS", "ko", "ja"} + + +def _load_font_data_arity() -> int: + # The C signature of LoadFontData differs between raylib builds; the pyray wrapper is a + # *args shim, so ask cffi for the real function type instead of catching arity errors. + import raylib as _raylib + return len(_raylib.ffi.typeof(_raylib.rl.LoadFontData).args) + + +def _languages(): + if not LANGUAGES_FILE.exists(): + return {} + with LANGUAGES_FILE.open(encoding="utf-8") as f: + return json.load(f) + + +def _char_sets(): + base = set(map(chr, range(32, 127))) | set(EXTRA_CHARS) + unifont = set(base) + + for language, code in _languages().items(): + unifont.update(language) + po_path = TRANSLATIONS_DIR / f"app_{code}.po" + try: + chars = set(po_path.read_text(encoding="utf-8")) + except FileNotFoundError: + continue + (unifont if code in UNIFONT_LANGUAGES else base).update(chars) + + return tuple(sorted(ord(c) for c in base)), tuple(sorted(ord(c) for c in unifont)) + + +def _glyph_metrics(glyphs, rects, glyph_count): + entries = [] + min_offset_y, max_extent = None, 0 + for idx in range(glyph_count): + glyph = glyphs[idx] + rect = rects[idx] + # Take the codepoint from the glyph itself: the 7-arg LoadFontData returns a + # compacted array of only the glyphs it found, so positional pairing with the + # requested codepoint list would misattribute (and previously overran) entries. + codepoint = glyph.value + width = int(round(rect.width)) + height = int(round(rect.height)) + offset_y = int(round(glyph.offsetY)) + min_offset_y = offset_y if min_offset_y is None else min(min_offset_y, offset_y) + max_extent = max(max_extent, offset_y + height) + entries.append({ + "id": codepoint, + "x": int(round(rect.x)), + "y": int(round(rect.y)), + "width": width, + "height": height, + "xoffset": int(round(glyph.offsetX)), + "yoffset": offset_y, + "xadvance": int(round(glyph.advanceX)), + }) + + if min_offset_y is None: + raise RuntimeError("No glyphs were generated") + + line_height = int(round(max_extent - min_offset_y)) + base = int(round(max_extent)) + return entries, line_height, base + + +def _write_bmfont(path: Path, font_size: int, face: str, atlas_name: str, line_height: int, base: int, atlas_size, entries): + # TODO: why doesn't raylib calculate these metrics correctly? + if line_height != font_size: + line_height = font_size + lines = [ + f"info face=\"{face}\" size=-{font_size} bold=0 italic=0 charset=\"\" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0", + f"common lineHeight={line_height} base={base} scaleW={atlas_size[0]} scaleH={atlas_size[1]} pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4", + f"page id=0 file=\"{atlas_name}\"", + f"chars count={len(entries)}", + ] + for entry in entries: + lines.append( + ("char id={id:<4} x={x:<5} y={y:<5} width={width:<5} height={height:<5} " + + "xoffset={xoffset:<5} yoffset={yoffset:<5} xadvance={xadvance:<5} page=0 chnl=15").format(**entry) + ) + path.write_text("\n".join(lines) + "\n") + + +def _looks_like_lfs_pointer(data: bytes) -> bool: + head = data[:256] + return b"git-lfs.github.com/spec/v1" in head and b"oid sha256:" in head + + +def _can_reuse_prebuilt(font_path: Path) -> bool: + return (FONT_DIR / f"{font_path.stem}.fnt").exists() and (FONT_DIR / f"{font_path.stem}.png").exists() + + +def _process_font(font_path: Path, codepoints: tuple[int, ...]): + font_size = { + "unifont.otf": 16, # unifont is only 16x8 or 16x16 pixels per glyph + }.get(font_path.name, 200) + + data = font_path.read_bytes() + file_buf = rl.ffi.new("unsigned char[]", data) + cp_buffer = rl.ffi.new("int[]", codepoints) + cp_ptr = rl.ffi.cast("int *", cp_buffer) + args = [rl.ffi.cast("unsigned char *", file_buf), len(data), font_size, cp_ptr, len(codepoints), rl.FontType.FONT_DEFAULT] + glyph_count_ptr = None + if _load_font_data_arity() == 7: + # IQ.OS >= 4.1 wheel: LoadFontData grew an int *glyphCount out-param AND returns + # only the glyphs it actually loaded (fewer than codepointCount when some are + # missing). We MUST read that count — using len(codepoints) below would index + # past the glyph/rect arrays and segfault. The PC pypi wheel (raylib <= 5.5) is + # the 6-arg version that returns codepointCount glyphs. + glyph_count_ptr = rl.ffi.new("int *", 0) + args.append(glyph_count_ptr) + glyphs = rl.load_font_data(*args) + if glyphs == rl.ffi.NULL: + if _can_reuse_prebuilt(font_path): + reason = "raylib failed to load font data" + if _looks_like_lfs_pointer(data): + reason += " (file looks like a Git LFS pointer, not real font data)" + print(f"WARNING: {reason}; reusing prebuilt atlas for {font_path.name}") + return + reason = f"raylib failed to load font data for {font_path.name}" + if _looks_like_lfs_pointer(data): + reason += " (file looks like a Git LFS pointer, not real font data)" + raise RuntimeError(reason) + + # Actual number of glyphs in the returned array (out-param on 7-arg raylib, else + # codepointCount). Everything downstream must use this, not len(codepoints). + glyph_count = glyph_count_ptr[0] if glyph_count_ptr is not None else len(codepoints) + + rects_ptr = rl.ffi.new("Rectangle **") + image = rl.gen_image_font_atlas(glyphs, rects_ptr, glyph_count, font_size, GLYPH_PADDING, 0) + if image.width == 0 or image.height == 0: + if _can_reuse_prebuilt(font_path): + print(f"WARNING: raylib returned an empty atlas; reusing prebuilt atlas for {font_path.name}") + return + raise RuntimeError(f"raylib returned an empty atlas for {font_path.name}") + + rects = rects_ptr[0] + atlas_name = f"{font_path.stem}.png" + atlas_path = FONT_DIR / atlas_name + entries, line_height, base = _glyph_metrics(glyphs, rects, glyph_count) + + if not rl.export_image(image, atlas_path.as_posix()): + raise RuntimeError("Failed to export atlas image") + + _write_bmfont(FONT_DIR / f"{font_path.stem}.fnt", font_size, font_path.stem, atlas_name, line_height, base, (image.width, image.height), entries) + + +def main(): + base_cp, unifont_cp = _char_sets() + fonts = sorted(FONT_DIR.glob("*.ttf")) + sorted(FONT_DIR.glob("*.otf")) + for font in fonts: + if "emoji" in font.name.lower(): + continue + glyphs = unifont_cp if font.stem.lower().startswith("unifont") else base_cp + _process_font(font, glyphs) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/iqpilot/selfdrive/assets/fonts/unifont.fnt b/iqpilot/selfdrive/assets/fonts/unifont.fnt new file mode 100644 index 000000000..4e238cdea --- /dev/null +++ b/iqpilot/selfdrive/assets/fonts/unifont.fnt @@ -0,0 +1,1953 @@ +info face="unifont" size=-16 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0 +common lineHeight=16 base=16 scaleW=2048 scaleH=1024 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="unifont.png" +chars count=1949 +char id=10 x=6 y=6 width=16 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32 x=34 y=6 width=8 height=16 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15 +char id=33 x=54 y=6 width=1 height=10 xoffset=4 yoffset=4 xadvance=8 page=0 chnl=15 +char id=34 x=67 y=6 width=5 height=4 xoffset=2 yoffset=2 xadvance=8 page=0 chnl=15 +char id=35 x=84 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=36 x=102 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=37 x=121 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=38 x=140 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=39 x=159 y=6 width=1 height=4 xoffset=4 yoffset=2 xadvance=8 page=0 chnl=15 +char id=40 x=172 y=6 width=3 height=12 xoffset=3 yoffset=3 xadvance=8 page=0 chnl=15 +char id=41 x=187 y=6 width=3 height=12 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15 +char id=42 x=202 y=6 width=7 height=7 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=43 x=221 y=6 width=7 height=7 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=44 x=240 y=6 width=2 height=4 xoffset=3 yoffset=12 xadvance=8 page=0 chnl=15 +char id=45 x=254 y=6 width=4 height=1 xoffset=2 yoffset=9 xadvance=8 page=0 chnl=15 +char id=46 x=270 y=6 width=2 height=2 xoffset=3 yoffset=12 xadvance=8 page=0 chnl=15 +char id=47 x=284 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=48 x=302 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=49 x=320 y=6 width=5 height=10 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=15 +char id=50 x=337 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=51 x=355 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=52 x=373 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=53 x=391 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=54 x=409 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=55 x=427 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=56 x=445 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=57 x=463 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=58 x=481 y=6 width=2 height=7 xoffset=3 yoffset=6 xadvance=8 page=0 chnl=15 +char id=59 x=495 y=6 width=2 height=9 xoffset=3 yoffset=6 xadvance=8 page=0 chnl=15 +char id=60 x=509 y=6 width=5 height=9 xoffset=2 yoffset=5 xadvance=8 page=0 chnl=15 +char id=61 x=526 y=6 width=6 height=5 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15 +char id=62 x=544 y=6 width=5 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=63 x=561 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=64 x=579 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=65 x=597 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=66 x=615 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=67 x=633 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=68 x=651 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=69 x=669 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=70 x=687 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=71 x=705 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=72 x=723 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=73 x=741 y=6 width=5 height=10 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=15 +char id=74 x=758 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=75 x=777 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=76 x=795 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=77 x=813 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=78 x=831 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=79 x=849 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=80 x=867 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=81 x=885 y=6 width=7 height=11 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=82 x=904 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=83 x=922 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=84 x=940 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=85 x=959 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=86 x=977 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=87 x=996 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=88 x=1014 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=89 x=1032 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=90 x=1051 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=91 x=1069 y=6 width=3 height=12 xoffset=4 yoffset=3 xadvance=8 page=0 chnl=15 +char id=92 x=1084 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=93 x=1102 y=6 width=3 height=12 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=94 x=1117 y=6 width=6 height=3 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=95 x=1135 y=6 width=7 height=1 xoffset=1 yoffset=14 xadvance=8 page=0 chnl=15 +char id=96 x=1154 y=6 width=3 height=3 xoffset=2 yoffset=1 xadvance=8 page=0 chnl=15 +char id=97 x=1169 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=98 x=1187 y=6 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=99 x=1205 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=100 x=1223 y=6 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=101 x=1241 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=102 x=1259 y=6 width=5 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=103 x=1276 y=6 width=6 height=11 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=104 x=1294 y=6 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=105 x=1312 y=6 width=5 height=11 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15 +char id=106 x=1329 y=6 width=5 height=13 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=107 x=1346 y=6 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=108 x=1364 y=6 width=5 height=11 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15 +char id=109 x=1381 y=6 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=110 x=1400 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=111 x=1418 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=112 x=1436 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=113 x=1454 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=114 x=1472 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=115 x=1490 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=116 x=1508 y=6 width=5 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=117 x=1525 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=118 x=1543 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=119 x=1561 y=6 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=120 x=1580 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=121 x=1598 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=122 x=1616 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=123 x=1634 y=6 width=4 height=13 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15 +char id=124 x=1650 y=6 width=1 height=14 xoffset=4 yoffset=2 xadvance=8 page=0 chnl=15 +char id=125 x=1663 y=6 width=4 height=13 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15 +char id=126 x=1679 y=6 width=7 height=3 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=163 x=1698 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=165 x=1717 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=167 x=1736 y=6 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=176 x=1754 y=6 width=4 height=4 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=15 +char id=177 x=1770 y=6 width=7 height=9 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=183 x=1789 y=6 width=2 height=2 xoffset=3 yoffset=8 xadvance=8 page=0 chnl=15 +char id=215 x=1803 y=6 width=6 height=5 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15 +char id=231 x=1821 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=234 x=1839 y=6 width=6 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=241 x=1857 y=6 width=6 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=252 x=1875 y=6 width=6 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=1059 x=1893 y=6 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1072 x=1912 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1082 x=1930 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1085 x=1948 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1088 x=1966 y=6 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1089 x=1984 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1100 x=2002 y=6 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1111 x=2020 y=6 width=5 height=11 xoffset=2 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1548 x=6 y=34 width=2 height=4 xoffset=3 yoffset=7 xadvance=8 page=0 chnl=15 +char id=1563 x=20 y=34 width=2 height=5 xoffset=3 yoffset=7 xadvance=8 page=0 chnl=15 +char id=1567 x=34 y=34 width=7 height=9 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1569 x=53 y=34 width=4 height=5 xoffset=2 yoffset=7 xadvance=8 page=0 chnl=15 +char id=1570 x=69 y=34 width=7 height=10 xoffset=1 yoffset=1 xadvance=8 page=0 chnl=15 +char id=1571 x=88 y=34 width=3 height=11 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=15 +char id=1572 x=103 y=34 width=6 height=13 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=1573 x=121 y=34 width=3 height=13 xoffset=3 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1574 x=136 y=34 width=6 height=11 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1575 x=154 y=34 width=1 height=8 xoffset=4 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1576 x=167 y=34 width=6 height=7 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15 +char id=1577 x=185 y=34 width=4 height=7 xoffset=2 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1578 x=201 y=34 width=6 height=7 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1579 x=219 y=34 width=6 height=9 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=1580 x=237 y=34 width=6 height=8 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1581 x=255 y=34 width=6 height=8 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1582 x=273 y=34 width=6 height=11 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=1583 x=291 y=34 width=6 height=5 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1584 x=309 y=34 width=6 height=7 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1585 x=327 y=34 width=6 height=7 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1586 x=345 y=34 width=6 height=10 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=1587 x=363 y=34 width=7 height=7 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1588 x=382 y=34 width=7 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=1589 x=401 y=34 width=7 height=6 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1590 x=420 y=34 width=7 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=1591 x=439 y=34 width=6 height=8 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1592 x=457 y=34 width=6 height=8 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1593 x=475 y=34 width=6 height=9 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15 +char id=1594 x=493 y=34 width=6 height=12 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1600 x=511 y=34 width=8 height=1 xoffset=0 yoffset=10 xadvance=8 page=0 chnl=15 +char id=1601 x=531 y=34 width=6 height=8 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1602 x=549 y=34 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=1603 x=567 y=34 width=6 height=8 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1604 x=585 y=34 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=1605 x=603 y=34 width=5 height=8 xoffset=2 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1606 x=620 y=34 width=6 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=1607 x=638 y=34 width=4 height=5 xoffset=2 yoffset=6 xadvance=8 page=0 chnl=15 +char id=1608 x=654 y=34 width=6 height=8 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15 +char id=1609 x=672 y=34 width=6 height=7 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1610 x=690 y=34 width=6 height=8 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=15 +char id=1611 x=708 y=34 width=4 height=4 xoffset=2 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1613 x=724 y=34 width=4 height=4 xoffset=2 yoffset=10 xadvance=0 page=0 chnl=15 +char id=1614 x=740 y=34 width=4 height=2 xoffset=2 yoffset=2 xadvance=0 page=0 chnl=15 +char id=1615 x=756 y=34 width=5 height=5 xoffset=2 yoffset=0 xadvance=0 page=0 chnl=15 +char id=1616 x=773 y=34 width=4 height=2 xoffset=2 yoffset=14 xadvance=0 page=0 chnl=15 +char id=1617 x=789 y=34 width=5 height=4 xoffset=1 yoffset=3 xadvance=0 page=0 chnl=15 +char id=1642 x=806 y=34 width=5 height=10 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=3585 x=823 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3586 x=841 y=34 width=5 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3588 x=858 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3591 x=876 y=34 width=5 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3592 x=893 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3593 x=911 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3594 x=929 y=34 width=5 height=9 xoffset=2 yoffset=5 xadvance=8 page=0 chnl=15 +char id=3595 x=946 y=34 width=6 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=3597 x=964 y=34 width=6 height=9 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3598 x=982 y=34 width=6 height=9 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3599 x=1000 y=34 width=6 height=9 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3600 x=1018 y=34 width=5 height=10 xoffset=2 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3601 x=1035 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3602 x=1053 y=34 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3603 x=1072 y=34 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3604 x=1091 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3605 x=1109 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3606 x=1127 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3607 x=1145 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3608 x=1163 y=34 width=5 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3609 x=1180 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3610 x=1198 y=34 width=5 height=8 xoffset=2 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3611 x=1215 y=34 width=5 height=9 xoffset=2 yoffset=5 xadvance=8 page=0 chnl=15 +char id=3612 x=1232 y=34 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3614 x=1251 y=34 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3615 x=1270 y=34 width=7 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=3616 x=1289 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3617 x=1307 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3618 x=1325 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3619 x=1343 y=34 width=5 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3620 x=1360 y=34 width=6 height=9 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3621 x=1378 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3623 x=1396 y=34 width=5 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3624 x=1413 y=34 width=6 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=3625 x=1431 y=34 width=7 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3626 x=1450 y=34 width=7 height=9 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=3627 x=1469 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3629 x=1487 y=34 width=6 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3632 x=1505 y=34 width=4 height=5 xoffset=2 yoffset=7 xadvance=8 page=0 chnl=15 +char id=3633 x=1521 y=34 width=6 height=2 xoffset=-6 yoffset=3 xadvance=0 page=0 chnl=15 +char id=3634 x=1539 y=34 width=5 height=8 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3635 x=1556 y=34 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=3636 x=1574 y=34 width=6 height=2 xoffset=-7 yoffset=3 xadvance=0 page=0 chnl=15 +char id=3637 x=1592 y=34 width=6 height=2 xoffset=-7 yoffset=3 xadvance=0 page=0 chnl=15 +char id=3638 x=1610 y=34 width=6 height=2 xoffset=-7 yoffset=3 xadvance=0 page=0 chnl=15 +char id=3639 x=1628 y=34 width=6 height=2 xoffset=-7 yoffset=3 xadvance=0 page=0 chnl=15 +char id=3640 x=1646 y=34 width=2 height=2 xoffset=-3 yoffset=14 xadvance=0 page=0 chnl=15 +char id=3641 x=1660 y=34 width=4 height=2 xoffset=-5 yoffset=14 xadvance=0 page=0 chnl=15 +char id=3648 x=1676 y=34 width=2 height=8 xoffset=3 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3649 x=1690 y=34 width=5 height=8 xoffset=2 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3650 x=1707 y=34 width=7 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=3651 x=1726 y=34 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=3652 x=1744 y=34 width=6 height=11 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=15 +char id=3654 x=1762 y=34 width=6 height=10 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=3655 x=1780 y=34 width=6 height=5 xoffset=-7 yoffset=0 xadvance=0 page=0 chnl=15 +char id=3656 x=1798 y=34 width=1 height=3 xoffset=-3 yoffset=0 xadvance=0 page=0 chnl=15 +char id=3657 x=1811 y=34 width=5 height=3 xoffset=-5 yoffset=0 xadvance=0 page=0 chnl=15 +char id=3660 x=1828 y=34 width=4 height=3 xoffset=-4 yoffset=0 xadvance=0 page=0 chnl=15 +char id=8209 x=1844 y=34 width=4 height=1 xoffset=2 yoffset=9 xadvance=8 page=0 chnl=15 +char id=8211 x=1860 y=34 width=6 height=1 xoffset=1 yoffset=9 xadvance=8 page=0 chnl=15 +char id=8212 x=1878 y=34 width=8 height=1 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=15 +char id=8220 x=1898 y=34 width=6 height=4 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=8221 x=1916 y=34 width=6 height=4 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=8226 x=1934 y=34 width=5 height=5 xoffset=1 yoffset=7 xadvance=8 page=0 chnl=15 +char id=8230 x=1951 y=34 width=7 height=2 xoffset=1 yoffset=12 xadvance=8 page=0 chnl=15 +char id=8364 x=1970 y=34 width=6 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=8627 x=1988 y=34 width=5 height=12 xoffset=2 yoffset=0 xadvance=8 page=0 chnl=15 +char id=8679 x=2005 y=34 width=7 height=12 xoffset=1 yoffset=2 xadvance=8 page=0 chnl=15 +char id=9003 x=2024 y=34 width=8 height=5 xoffset=0 yoffset=7 xadvance=8 page=0 chnl=15 +char id=9251 x=6 y=62 width=6 height=2 xoffset=1 yoffset=12 xadvance=8 page=0 chnl=15 +char id=9654 x=24 y=62 width=6 height=6 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=9664 x=42 y=62 width=6 height=6 xoffset=1 yoffset=6 xadvance=8 page=0 chnl=15 +char id=9675 x=60 y=62 width=7 height=7 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=9679 x=79 y=62 width=7 height=7 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=15 +char id=9881 x=98 y=62 width=13 height=13 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=10003 x=123 y=62 width=7 height=10 xoffset=1 yoffset=4 xadvance=8 page=0 chnl=15 +char id=10004 x=142 y=62 width=15 height=11 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15 +char id=10005 x=169 y=62 width=11 height=11 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12289 x=192 y=62 width=4 height=4 xoffset=3 yoffset=10 xadvance=16 page=0 chnl=15 +char id=12290 x=208 y=62 width=4 height=4 xoffset=3 yoffset=10 xadvance=16 page=0 chnl=15 +char id=12300 x=224 y=62 width=5 height=11 xoffset=8 yoffset=0 xadvance=16 page=0 chnl=15 +char id=12301 x=241 y=62 width=5 height=11 xoffset=3 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12354 x=258 y=62 width=11 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12356 x=281 y=62 width=12 height=9 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12358 x=305 y=62 width=8 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12360 x=325 y=62 width=11 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12362 x=348 y=62 width=12 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12363 x=372 y=62 width=12 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12364 x=396 y=62 width=13 height=13 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12365 x=421 y=62 width=9 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12366 x=442 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12367 x=466 y=62 width=6 height=14 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12368 x=484 y=62 width=10 height=14 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12369 x=506 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12370 x=530 y=62 width=13 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12371 x=555 y=62 width=10 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12372 x=577 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12373 x=601 y=62 width=10 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12374 x=623 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12375 x=647 y=62 width=10 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12376 x=669 y=62 width=10 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12377 x=691 y=62 width=12 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12378 x=715 y=62 width=13 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12379 x=740 y=62 width=12 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12380 x=764 y=62 width=13 height=13 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12381 x=789 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12383 x=812 y=62 width=11 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12384 x=835 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12385 x=859 y=62 width=11 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12387 x=882 y=62 width=10 height=8 xoffset=2 yoffset=7 xadvance=16 page=0 chnl=15 +char id=12388 x=904 y=62 width=12 height=9 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12389 x=928 y=62 width=13 height=12 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12390 x=953 y=62 width=12 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12391 x=977 y=62 width=13 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12392 x=1002 y=62 width=9 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12393 x=1023 y=62 width=11 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12394 x=1046 y=62 width=11 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12395 x=1069 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12397 x=1092 y=62 width=12 height=13 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12398 x=1116 y=62 width=11 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12399 x=1139 y=62 width=11 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12400 x=1162 y=62 width=13 height=13 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12402 x=1187 y=62 width=11 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12403 x=1210 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12405 x=1234 y=62 width=13 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12408 x=1259 y=62 width=12 height=6 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=12409 x=1283 y=62 width=12 height=8 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12411 x=1307 y=62 width=11 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12414 x=1330 y=62 width=9 height=13 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12415 x=1351 y=62 width=13 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12416 x=1376 y=62 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12417 x=1400 y=62 width=12 height=12 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12418 x=1424 y=62 width=10 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12420 x=1446 y=62 width=12 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12422 x=1470 y=62 width=12 height=13 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12423 x=1494 y=62 width=8 height=11 xoffset=3 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12424 x=1514 y=62 width=10 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12425 x=1536 y=62 width=8 height=14 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12426 x=1556 y=62 width=8 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12427 x=1576 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12428 x=1598 y=62 width=13 height=13 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12429 x=1623 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12431 x=1645 y=62 width=12 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12434 x=1669 y=62 width=11 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12435 x=1692 y=62 width=11 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12449 x=1715 y=62 width=9 height=8 xoffset=2 yoffset=7 xadvance=16 page=0 chnl=15 +char id=12450 x=1736 y=62 width=10 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12451 x=1758 y=62 width=8 height=10 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=15 +char id=12452 x=1778 y=62 width=9 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12454 x=1799 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12455 x=1821 y=62 width=9 height=7 xoffset=3 yoffset=7 xadvance=16 page=0 chnl=15 +char id=12456 x=1842 y=62 width=11 height=9 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12457 x=1865 y=62 width=8 height=10 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=15 +char id=12458 x=1885 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12459 x=1908 y=62 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12460 x=1930 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12461 x=1954 y=62 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12463 x=1977 y=62 width=9 height=13 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12464 x=1998 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12466 x=2022 y=62 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12467 x=6 y=90 width=10 height=9 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12468 x=28 y=90 width=13 height=12 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12470 x=53 y=90 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12471 x=77 y=90 width=10 height=11 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12472 x=99 y=90 width=11 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12473 x=122 y=90 width=10 height=10 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12474 x=144 y=90 width=13 height=12 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12475 x=169 y=90 width=11 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12476 x=192 y=90 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12477 x=216 y=90 width=9 height=13 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12479 x=237 y=90 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12480 x=259 y=90 width=13 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12481 x=284 y=90 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12483 x=307 y=90 width=8 height=8 xoffset=3 yoffset=7 xadvance=16 page=0 chnl=15 +char id=12484 x=327 y=90 width=11 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12486 x=350 y=90 width=11 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12487 x=373 y=90 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12488 x=397 y=90 width=7 height=13 xoffset=4 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12489 x=416 y=90 width=9 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12490 x=437 y=90 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12491 x=460 y=90 width=11 height=8 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12492 x=483 y=90 width=10 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12493 x=505 y=90 width=11 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12494 x=528 y=90 width=8 height=13 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12495 x=548 y=90 width=12 height=8 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=12496 x=572 y=90 width=13 height=11 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12497 x=597 y=90 width=13 height=12 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12498 x=622 y=90 width=9 height=11 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12499 x=643 y=90 width=10 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12500 x=665 y=90 width=10 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12501 x=687 y=90 width=9 height=11 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12502 x=708 y=90 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12503 x=732 y=90 width=12 height=13 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12505 x=756 y=90 width=13 height=9 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12506 x=781 y=90 width=13 height=9 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12507 x=806 y=90 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12508 x=828 y=90 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12509 x=852 y=90 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=12510 x=876 y=90 width=11 height=9 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12511 x=899 y=90 width=8 height=13 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12512 x=919 y=90 width=11 height=11 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12513 x=942 y=90 width=10 height=13 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12514 x=964 y=90 width=11 height=10 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12515 x=987 y=90 width=9 height=9 xoffset=3 yoffset=6 xadvance=16 page=0 chnl=15 +char id=12516 x=1008 y=90 width=11 height=12 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12517 x=1031 y=90 width=9 height=6 xoffset=3 yoffset=7 xadvance=16 page=0 chnl=15 +char id=12518 x=1052 y=90 width=11 height=7 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=12519 x=1075 y=90 width=7 height=8 xoffset=4 yoffset=6 xadvance=16 page=0 chnl=15 +char id=12520 x=1094 y=90 width=9 height=11 xoffset=3 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12521 x=1115 y=90 width=10 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12522 x=1137 y=90 width=7 height=13 xoffset=4 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12523 x=1156 y=90 width=11 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12524 x=1179 y=90 width=9 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=12525 x=1200 y=90 width=10 height=9 xoffset=2 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12527 x=1222 y=90 width=10 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=12531 x=1244 y=90 width=10 height=10 xoffset=3 yoffset=4 xadvance=16 page=0 chnl=15 +char id=12539 x=1266 y=90 width=4 height=4 xoffset=5 yoffset=6 xadvance=16 page=0 chnl=15 +char id=12540 x=1282 y=90 width=12 height=2 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15 +char id=19968 x=1306 y=90 width=15 height=1 xoffset=0 yoffset=7 xadvance=16 page=0 chnl=15 +char id=19978 x=1333 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=19979 x=1360 y=90 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=19981 x=1387 y=90 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=19982 x=1413 y=90 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=19987 x=1439 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=19988 x=1466 y=90 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20001 x=1493 y=90 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20006 x=1520 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20010 x=1547 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20013 x=1574 y=90 width=11 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20016 x=1597 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20018 x=1624 y=90 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20026 x=1649 y=90 width=13 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20027 x=1674 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20037 x=1701 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20040 x=1728 y=90 width=13 height=15 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20043 x=1753 y=90 width=14 height=15 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20063 x=1779 y=90 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20064 x=1806 y=90 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20080 x=1830 y=90 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20102 x=1857 y=90 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20104 x=1881 y=90 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20107 x=1907 y=90 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20108 x=1934 y=90 width=15 height=10 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=15 +char id=20110 x=1961 y=90 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20113 x=1988 y=90 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20114 x=2015 y=90 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20122 x=6 y=118 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20123 x=33 y=118 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20126 x=60 y=118 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20132 x=87 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20134 x=114 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20139 x=141 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20142 x=168 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20154 x=195 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20160 x=222 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20165 x=249 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20170 x=276 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20171 x=303 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20173 x=330 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20174 x=356 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20181 x=383 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20182 x=410 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20184 x=437 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20195 x=464 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20196 x=491 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20197 x=518 y=118 width=13 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20202 x=543 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20204 x=570 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20214 x=596 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20219 x=623 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20221 x=650 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20241 x=677 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20247 x=704 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20248 x=731 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20250 x=758 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20256 x=785 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20280 x=812 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20294 x=838 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20295 x=865 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20301 x=892 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20302 x=919 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20303 x=946 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20307 x=973 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20309 x=1000 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20316 x=1027 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20320 x=1054 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20339 x=1081 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20341 x=1108 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20351 x=1135 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20358 x=1162 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20363 x=1189 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20379 x=1215 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20381 x=1242 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20391 x=1269 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20415 x=1295 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20418 x=1322 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20445 x=1349 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20449 x=1376 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20462 x=1403 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20491 x=1430 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20497 x=1456 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20505 x=1482 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20516 x=1509 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20540 x=1536 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20559 x=1563 y=118 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20572 x=1589 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20596 x=1616 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20597 x=1643 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20633 x=1670 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20648 x=1697 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20659 x=1724 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20677 x=1751 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20687 x=1778 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20778 x=1805 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20786 x=1832 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20801 x=1859 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20803 x=1886 y=118 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20805 x=1913 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20808 x=1940 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20809 x=1967 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20811 x=1994 y=118 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20813 x=6 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20837 x=33 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20839 x=60 y=146 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20840 x=85 y=146 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20844 x=112 y=146 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20849 x=139 y=146 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20851 x=165 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20854 x=192 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20856 x=219 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20860 x=246 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20869 x=273 y=146 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20870 x=298 y=146 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20874 x=323 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20876 x=350 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20877 x=377 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20915 x=404 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20917 x=431 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=20934 x=458 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20943 x=485 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20945 x=512 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20966 x=539 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20986 x=566 y=146 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20987 x=591 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20998 x=618 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=20999 x=645 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21010 x=671 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21015 x=697 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21017 x=723 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21021 x=749 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21024 x=775 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21028 x=802 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21033 x=828 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21034 x=854 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21035 x=880 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21040 x=906 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21046 x=932 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21047 x=958 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21049 x=985 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21051 x=1011 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21063 x=1037 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21066 x=1063 y=146 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21069 x=1088 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21123 x=1115 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21147 x=1141 y=146 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21151 x=1165 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21152 x=1191 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21153 x=1217 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21160 x=1244 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21161 x=1270 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21177 x=1296 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21205 x=1322 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21209 x=1348 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21247 x=1375 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21253 x=1401 y=146 width=14 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21270 x=1427 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21306 x=1454 y=146 width=14 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21312 x=1480 y=146 width=14 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21319 x=1506 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21332 x=1533 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21333 x=1560 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21335 x=1587 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21336 x=1614 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21345 x=1641 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21360 x=1668 y=146 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21363 x=1693 y=146 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21368 x=1718 y=146 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21378 x=1744 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21407 x=1771 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21435 x=1798 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21442 x=1825 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21450 x=1852 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21453 x=1879 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21457 x=1906 y=146 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21462 x=1932 y=146 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21463 x=1959 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21464 x=1986 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21472 x=2013 y=146 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21476 x=6 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21482 x=33 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21487 x=58 y=174 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21488 x=84 y=174 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21491 x=109 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21495 x=136 y=174 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21496 x=163 y=174 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21507 x=187 y=174 width=14 height=15 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21508 x=213 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21512 x=240 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21516 x=267 y=174 width=12 height=15 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21517 x=291 y=174 width=13 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21518 x=316 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21521 x=343 y=174 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21527 x=368 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21542 x=393 y=174 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21547 x=420 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21551 x=447 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21576 x=473 y=174 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21578 x=500 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21592 x=527 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21608 x=552 y=174 width=13 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21619 x=577 y=174 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21629 x=603 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21644 x=630 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21697 x=656 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21709 x=681 y=174 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21729 x=706 y=174 width=11 height=15 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21738 x=729 y=174 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21796 x=755 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21807 x=782 y=174 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21830 x=808 y=174 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21839 x=833 y=174 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21855 x=857 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21892 x=884 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21914 x=911 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=21934 x=938 y=174 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=21966 x=965 y=174 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22120 x=991 y=174 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22238 x=1018 y=174 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22240 x=1042 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22259 x=1067 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22260 x=1092 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22266 x=1117 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22269 x=1142 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22270 x=1167 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22283 x=1192 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22285 x=1217 y=174 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22287 x=1242 y=174 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22294 x=1267 y=174 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22312 x=1292 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22320 x=1319 y=174 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22330 x=1346 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22336 x=1372 y=174 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22343 x=1399 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22374 x=1425 y=174 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22411 x=1452 y=174 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22495 x=1479 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22519 x=1506 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22577 x=1533 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22580 x=1560 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22635 x=1587 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22659 x=1614 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22679 x=1641 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22686 x=1668 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22768 x=1694 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22788 x=1721 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22791 x=1748 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22793 x=1775 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22797 x=1802 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22806 x=1829 y=174 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22810 x=1855 y=174 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22816 x=1879 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22823 x=1906 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22825 x=1933 y=174 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=22833 x=1960 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22836 x=1987 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22888 x=2014 y=174 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22909 x=6 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22914 x=33 y=202 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=22987 x=59 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23376 x=86 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=23384 x=113 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23398 x=140 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23416 x=167 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23427 x=194 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23429 x=221 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23433 x=248 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23436 x=275 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23450 x=302 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23454 x=329 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23455 x=356 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23460 x=383 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23478 x=410 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23481 x=437 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23485 x=464 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23494 x=491 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23519 x=518 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23526 x=545 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23531 x=572 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23532 x=599 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23545 x=626 y=202 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23548 x=652 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=23550 x=679 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23553 x=706 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23556 x=733 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23558 x=760 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23559 x=787 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23560 x=814 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23563 x=841 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=23565 x=868 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23566 x=895 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23567 x=922 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23569 x=949 y=202 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23578 x=974 y=202 width=11 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23601 x=997 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23627 x=1024 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=23631 x=1051 y=202 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=23637 x=1077 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23646 x=1104 y=202 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=23653 x=1130 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=23849 x=1157 y=202 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24030 x=1183 y=202 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24033 x=1209 y=202 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24037 x=1236 y=202 width=15 height=12 xoffset=0 yoffset=2 xadvance=16 page=0 chnl=15 +char id=24038 x=1263 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24046 x=1290 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24049 x=1317 y=202 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24050 x=1341 y=202 width=12 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24052 x=1365 y=202 width=13 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24067 x=1390 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24076 x=1417 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24102 x=1444 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24110 x=1471 y=202 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24111 x=1497 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24112 x=1524 y=202 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24115 x=1550 y=202 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24118 x=1576 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24120 x=1603 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24133 x=1630 y=202 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24149 x=1656 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24178 x=1683 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24179 x=1710 y=202 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24180 x=1737 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24182 x=1764 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24191 x=1791 y=202 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24195 x=1817 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24207 x=1844 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24211 x=1871 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24212 x=1898 y=202 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24230 x=1925 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24235 x=1952 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24288 x=1979 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24291 x=2006 y=202 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24310 x=6 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24314 x=33 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24320 x=60 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24323 x=87 y=230 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24335 x=113 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24341 x=140 y=230 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24359 x=164 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24367 x=191 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24373 x=218 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24375 x=245 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24378 x=272 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24398 x=299 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24403 x=326 y=230 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24405 x=350 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24418 x=377 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24433 x=404 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24448 x=431 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24452 x=458 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24453 x=485 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24460 x=512 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24465 x=539 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24467 x=566 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24471 x=593 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24478 x=620 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24481 x=647 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24489 x=674 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24517 x=701 y=230 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=24535 x=728 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24536 x=755 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24540 x=782 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24555 x=809 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24577 x=836 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24590 x=863 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24613 x=890 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24615 x=917 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24674 x=944 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24687 x=971 y=230 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24744 x=998 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24773 x=1025 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24800 x=1052 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24847 x=1079 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24863 x=1106 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24907 x=1133 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=24930 x=1160 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25033 x=1187 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25104 x=1214 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25105 x=1241 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25110 x=1268 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25143 x=1295 y=230 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25147 x=1319 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25152 x=1346 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25163 x=1373 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25165 x=1400 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25171 x=1427 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25191 x=1454 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25193 x=1481 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25195 x=1508 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25197 x=1534 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25201 x=1561 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25214 x=1588 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25215 x=1614 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25233 x=1641 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25240 x=1667 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25246 x=1694 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25252 x=1721 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25253 x=1748 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25269 x=1775 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25273 x=1802 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25276 x=1829 y=230 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25289 x=1855 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25298 x=1882 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25311 x=1909 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25313 x=1936 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25321 x=1963 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25324 x=1990 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25345 x=2017 y=230 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25351 x=6 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25353 x=33 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25369 x=60 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25377 x=87 y=258 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25391 x=113 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25407 x=140 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25442 x=167 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25454 x=194 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25475 x=221 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25480 x=248 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25490 x=275 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25505 x=302 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25506 x=329 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25509 x=356 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25511 x=383 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25512 x=410 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25551 x=437 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25552 x=464 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25554 x=491 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25563 x=518 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25588 x=545 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25622 x=572 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25628 x=599 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25645 x=626 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25658 x=653 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25668 x=680 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25670 x=707 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25671 x=734 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25764 x=761 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25773 x=788 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25799 x=815 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25803 x=842 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25805 x=869 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25806 x=896 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25818 x=923 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25836 x=950 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25847 x=977 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25850 x=1004 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25903 x=1031 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25910 x=1058 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25913 x=1084 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25918 x=1111 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25925 x=1138 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25928 x=1165 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25935 x=1192 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25943 x=1219 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25968 x=1246 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25972 x=1273 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25976 x=1300 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=25991 x=1327 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26009 x=1354 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26029 x=1381 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26031 x=1407 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26032 x=1434 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26039 x=1461 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26041 x=1487 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26044 x=1514 y=258 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26045 x=1541 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26080 x=1568 y=258 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26082 x=1594 y=258 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26085 x=1620 y=258 width=9 height=15 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26086 x=1641 y=258 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26087 x=1668 y=258 width=12 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26102 x=1692 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26103 x=1718 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26126 x=1744 y=258 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26144 x=1769 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26159 x=1795 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26174 x=1822 y=258 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26178 x=1849 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26222 x=1875 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26223 x=1902 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26242 x=1929 y=258 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26263 x=1956 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26283 x=1982 y=258 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26289 x=2008 y=258 width=14 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26354 x=6 y=286 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26356 x=31 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26360 x=58 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26367 x=85 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26368 x=112 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26371 x=139 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26377 x=166 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26381 x=193 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26395 x=220 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26397 x=247 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26399 x=274 y=286 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26410 x=300 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26412 x=327 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26426 x=354 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26435 x=381 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26438 x=408 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26454 x=435 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26463 x=462 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26465 x=489 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26469 x=516 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26494 x=543 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26495 x=570 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26524 x=597 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=26576 x=624 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26597 x=651 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26631 x=678 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26639 x=705 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26657 x=732 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26679 x=759 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26681 x=786 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26684 x=813 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26696 x=840 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26725 x=867 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26751 x=894 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26781 x=921 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26816 x=948 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26820 x=975 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26908 x=1002 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26970 x=1029 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26989 x=1056 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=26997 x=1083 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27161 x=1110 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27169 x=1137 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27171 x=1164 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27178 x=1191 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27211 x=1218 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27231 x=1245 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27243 x=1272 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27284 x=1299 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27298 x=1326 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27323 x=1353 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27396 x=1380 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27402 x=1407 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27425 x=1434 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27426 x=1461 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27454 x=1488 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27489 x=1515 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27490 x=1542 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27491 x=1569 y=286 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=27492 x=1596 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27493 x=1623 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27508 x=1650 y=286 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27515 x=1677 y=286 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=27573 x=1703 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27599 x=1730 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27604 x=1757 y=286 width=13 height=15 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27663 x=1782 y=286 width=13 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27671 x=1807 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27704 x=1834 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27714 x=1861 y=286 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27770 x=1887 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27794 x=1914 y=286 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27809 x=1941 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=27833 x=1968 y=286 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27839 x=1994 y=286 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=27841 x=6 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=27861 x=33 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27874 x=60 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27880 x=87 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27963 x=114 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27969 x=141 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=27979 x=168 y=314 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28040 x=194 y=314 width=13 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28136 x=219 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28151 x=246 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=28155 x=273 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=28165 x=300 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28168 x=327 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28187 x=354 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28201 x=381 y=314 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=28204 x=408 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28216 x=435 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28288 x=462 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28291 x=489 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28304 x=516 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=28310 x=543 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28331 x=570 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28369 x=597 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=28388 x=624 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28436 x=651 y=314 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28459 x=677 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28507 x=704 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=28608 x=731 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28670 x=758 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28779 x=785 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28783 x=812 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28789 x=839 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=28857 x=866 y=314 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28858 x=892 y=314 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28865 x=918 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28909 x=945 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28961 x=972 y=314 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=28982 x=998 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29022 x=1025 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29031 x=1052 y=314 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=29060 x=1078 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29105 x=1105 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29128 x=1132 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29197 x=1159 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29255 x=1186 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29256 x=1211 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29260 x=1238 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29289 x=1265 y=314 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29305 x=1291 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29366 x=1318 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29376 x=1345 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29575 x=1372 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29615 x=1399 y=314 width=15 height=14 xoffset=0 yoffset=2 xadvance=16 page=0 chnl=15 +char id=29616 x=1426 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=29694 x=1453 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=29702 x=1480 y=314 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=29790 x=1507 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29872 x=1534 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=29926 x=1561 y=314 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=29983 x=1588 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=29992 x=1615 y=314 width=13 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30000 x=1640 y=314 width=11 height=14 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30001 x=1663 y=314 width=11 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30005 x=1686 y=314 width=13 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30011 x=1711 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30028 x=1738 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30041 x=1765 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30053 x=1790 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30059 x=1817 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30064 x=1844 y=314 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30070 x=1871 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30090 x=1898 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30330 x=1925 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30331 x=1952 y=314 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30332 x=1979 y=314 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30340 x=2006 y=314 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30342 x=6 y=342 width=12 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30417 x=30 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30422 x=57 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30424 x=84 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30435 x=111 y=342 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30436 x=138 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30446 x=165 y=342 width=11 height=15 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30450 x=188 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30452 x=215 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30456 x=242 y=342 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30465 x=268 y=342 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30475 x=294 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30495 x=321 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30496 x=348 y=342 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30528 x=374 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30561 x=401 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30636 x=428 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30690 x=455 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30693 x=482 y=342 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30697 x=508 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30701 x=535 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30721 x=562 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30830 x=589 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30879 x=616 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30906 x=643 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=30908 x=670 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=30938 x=697 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31034 x=724 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=31070 x=751 y=342 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31163 x=777 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31169 x=804 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31181 x=831 y=342 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31186 x=857 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31216 x=884 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31227 x=911 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31232 x=938 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31243 x=965 y=342 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=31278 x=992 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31281 x=1019 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31283 x=1046 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31309 x=1073 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31337 x=1100 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31354 x=1127 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31361 x=1154 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31389 x=1181 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31435 x=1208 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31471 x=1235 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31508 x=1262 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31532 x=1289 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31558 x=1316 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31561 x=1343 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31572 x=1370 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31574 x=1397 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31616 x=1424 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31639 x=1451 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31649 x=1478 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31661 x=1505 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31684 x=1532 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31777 x=1559 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31859 x=1586 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31867 x=1613 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31934 x=1640 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=31995 x=1667 y=342 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32000 x=1692 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32004 x=1719 y=342 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32005 x=1745 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32011 x=1772 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32013 x=1799 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32020 x=1826 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32026 x=1853 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32034 x=1880 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32039 x=1907 y=342 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32047 x=1932 y=342 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=32048 x=1956 y=342 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32066 x=1982 y=342 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32068 x=2009 y=342 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32076 x=6 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32080 x=33 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32085 x=60 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32113 x=87 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32118 x=114 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32147 x=141 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32153 x=168 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32154 x=195 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32173 x=222 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32178 x=249 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32202 x=276 y=370 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32210 x=302 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32218 x=329 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32227 x=356 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32232 x=383 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32233 x=410 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32244 x=437 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32294 x=464 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32305 x=491 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32321 x=518 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32362 x=545 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32380 x=572 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32396 x=599 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32418 x=626 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32422 x=653 y=370 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32423 x=679 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32435 x=706 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32437 x=733 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32441 x=760 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32447 x=787 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32451 x=814 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32452 x=841 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32456 x=868 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32463 x=895 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32467 x=922 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32472 x=949 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32476 x=976 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32477 x=1003 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32479 x=1030 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32487 x=1057 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32490 x=1084 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32493 x=1111 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32500 x=1138 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32531 x=1165 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32534 x=1192 y=370 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32536 x=1218 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32593 x=1245 y=370 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=32622 x=1270 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32654 x=1297 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32722 x=1324 y=370 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=32771 x=1349 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32773 x=1376 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32780 x=1403 y=370 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=32791 x=1428 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32882 x=1455 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32887 x=1482 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=32930 x=1509 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33021 x=1536 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33041 x=1563 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33067 x=1590 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33073 x=1617 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33126 x=1644 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33225 x=1671 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33258 x=1698 y=370 width=9 height=16 xoffset=3 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33267 x=1719 y=370 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=33268 x=1746 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33287 x=1773 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33290 x=1800 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33298 x=1827 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33322 x=1854 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33324 x=1881 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33333 x=1908 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33391 x=1935 y=370 width=13 height=16 xoffset=2 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33394 x=1960 y=370 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33509 x=1987 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33521 x=2014 y=370 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33539 x=6 y=398 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33655 x=33 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33719 x=60 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33829 x=87 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33853 x=114 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=33879 x=141 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34101 x=168 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34255 x=195 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34389 x=222 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34394 x=249 y=398 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34395 x=275 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34399 x=302 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34562 x=329 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34701 x=356 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34722 x=383 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34837 x=410 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34892 x=437 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34920 x=464 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=34987 x=491 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35013 x=518 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35036 x=545 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35037 x=572 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35041 x=599 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35069 x=626 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35201 x=653 y=398 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35206 x=678 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35211 x=705 y=398 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35215 x=732 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35222 x=759 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35239 x=786 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35258 x=813 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35261 x=840 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35264 x=867 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35265 x=894 y=398 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35266 x=921 y=398 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35268 x=948 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35270 x=975 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35272 x=1002 y=398 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35273 x=1027 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35282 x=1054 y=398 width=13 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35299 x=1079 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35302 x=1106 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35320 x=1133 y=398 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35328 x=1159 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35330 x=1186 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35336 x=1213 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35338 x=1240 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35347 x=1267 y=398 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35352 x=1293 y=398 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35373 x=1320 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35377 x=1347 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35387 x=1374 y=398 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35388 x=1401 y=398 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35430 x=1428 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35442 x=1455 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35443 x=1482 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35468 x=1509 y=398 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35469 x=1536 y=398 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35486 x=1563 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35492 x=1590 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35498 x=1617 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35501 x=1644 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35506 x=1671 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35519 x=1698 y=398 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35531 x=1724 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35613 x=1751 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35657 x=1778 y=398 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35672 x=1805 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35686 x=1832 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35696 x=1859 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35703 x=1886 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35712 x=1913 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35722 x=1940 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35731 x=1967 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35745 x=1994 y=398 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35746 x=6 y=426 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35748 x=33 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35753 x=60 y=426 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35757 x=87 y=426 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35758 x=113 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35760 x=140 y=426 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35768 x=167 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35774 x=194 y=426 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35775 x=221 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35777 x=248 y=426 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35782 x=275 y=426 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35797 x=302 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35813 x=329 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35814 x=356 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35821 x=383 y=426 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35823 x=410 y=426 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35828 x=437 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35831 x=464 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35835 x=491 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35843 x=518 y=426 width=14 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=35874 x=544 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=35937 x=571 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36000 x=598 y=426 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36012 x=624 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36023 x=651 y=426 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36028 x=676 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36039 x=703 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36074 x=730 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36084 x=757 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36092 x=784 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36127 x=811 y=426 width=12 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36131 x=835 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36133 x=862 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36134 x=889 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36136 x=916 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36141 x=943 y=426 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36148 x=969 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36153 x=996 y=426 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36196 x=1021 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36208 x=1048 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36215 x=1075 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36229 x=1102 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36234 x=1129 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36275 x=1156 y=426 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36305 x=1183 y=426 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36317 x=1210 y=426 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36319 x=1237 y=426 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36321 x=1264 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36328 x=1291 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36335 x=1318 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36339 x=1345 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36367 x=1372 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36393 x=1399 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36394 x=1426 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36452 x=1453 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36523 x=1480 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36554 x=1507 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36575 x=1534 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36578 x=1561 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36611 x=1588 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36617 x=1615 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36628 x=1642 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36629 x=1669 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36635 x=1696 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36655 x=1723 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36664 x=1750 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36681 x=1777 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36710 x=1804 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36716 x=1831 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36719 x=1858 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36731 x=1885 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36733 x=1912 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36739 x=1939 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36741 x=1966 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36742 x=1993 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36753 x=2020 y=426 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36755 x=6 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36776 x=33 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36793 x=60 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36796 x=87 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36798 x=114 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36807 x=141 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36814 x=168 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36816 x=195 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36817 x=222 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36820 x=249 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36824 x=276 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36825 x=303 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36827 x=330 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36828 x=357 y=454 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36830 x=384 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36831 x=411 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36861 x=438 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36864 x=465 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36865 x=492 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36866 x=519 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36873 x=546 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36879 x=573 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36889 x=600 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36890 x=627 y=454 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36895 x=654 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36899 x=681 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36913 x=708 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36914 x=735 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36920 x=762 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36926 x=789 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36933 x=816 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36938 x=843 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36939 x=870 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=36942 x=897 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36947 x=924 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36948 x=951 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36949 x=978 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36951 x=1005 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36960 x=1032 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36969 x=1059 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36974 x=1086 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36978 x=1113 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36984 x=1140 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36986 x=1167 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36991 x=1194 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=36996 x=1221 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=37002 x=1248 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37096 x=1275 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37117 x=1302 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37197 x=1329 y=454 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=37266 x=1356 y=454 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=37319 x=1383 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37324 x=1410 y=454 width=15 height=14 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=37325 x=1437 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37326 x=1464 y=454 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=37327 x=1491 y=454 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=37329 x=1518 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37397 x=1545 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37636 x=1572 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37679 x=1599 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37682 x=1626 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37749 x=1653 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37782 x=1680 y=454 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37857 x=1706 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37912 x=1733 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38000 x=1760 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38047 x=1787 y=454 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38053 x=1813 y=454 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38062 x=1839 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38144 x=1866 y=454 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38145 x=1892 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38169 x=1919 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38190 x=1946 y=454 width=15 height=15 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38263 x=1973 y=454 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38271 x=2000 y=454 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38272 x=6 y=482 width=12 height=15 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38275 x=30 y=482 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38281 x=55 y=482 width=13 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38283 x=80 y=482 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38291 x=104 y=482 width=12 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38306 x=128 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38321 x=153 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38364 x=178 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38376 x=203 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38378 x=228 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38381 x=253 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38382 x=278 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38388 x=303 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38405 x=328 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38408 x=353 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38431 x=378 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38450 x=404 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38468 x=430 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38469 x=456 y=482 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38480 x=482 y=482 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38500 x=508 y=482 width=14 height=15 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38542 x=534 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38543 x=560 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38544 x=586 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38555 x=612 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38556 x=638 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38560 x=664 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38568 x=690 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38577 x=716 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38590 x=742 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38598 x=769 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38626 x=796 y=482 width=14 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38627 x=822 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38642 x=849 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38651 x=876 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38656 x=903 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38728 x=930 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38745 x=957 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38748 x=984 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38750 x=1011 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38754 x=1038 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38899 x=1065 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38911 x=1092 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38917 x=1119 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38918 x=1146 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38920 x=1173 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38928 x=1200 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38936 x=1227 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38957 x=1254 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38988 x=1281 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=38989 x=1308 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38991 x=1335 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=38996 x=1362 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39006 x=1389 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39023 x=1416 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=39033 x=1443 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=39035 x=1470 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39044 x=1497 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=39046 x=1524 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39057 x=1551 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39064 x=1578 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=39068 x=1605 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39069 x=1632 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39080 x=1659 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=39118 x=1686 y=482 width=15 height=15 xoffset=0 yoffset=1 xadvance=16 page=0 chnl=15 +char id=39165 x=1713 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39243 x=1740 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39304 x=1767 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39318 x=1794 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39376 x=1821 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39381 x=1848 y=482 width=14 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39387 x=1874 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39443 x=1901 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39511 x=1928 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39542 x=1955 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39547 x=1982 y=482 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39550 x=2009 y=482 width=13 height=16 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39564 x=6 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39636 x=33 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=39640 x=60 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=40065 x=87 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=40613 x=114 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=40614 x=141 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=40636 x=168 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=40664 x=195 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=40670 x=222 y=510 width=15 height=16 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15 +char id=44032 x=249 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44033 x=275 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44036 x=301 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44048 x=327 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44049 x=353 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44050 x=379 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44053 x=405 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44057 x=431 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44060 x=457 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44144 x=482 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44148 x=506 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44152 x=530 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44160 x=554 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44163 x=578 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44172 x=602 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44176 x=627 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44192 x=652 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44200 x=678 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44201 x=702 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44208 x=726 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44221 x=750 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44228 x=774 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44256 x=799 y=510 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=44257 x=826 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44275 x=853 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44277 x=880 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44284 x=907 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44288 x=934 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44305 x=961 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44368 x=988 y=510 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=44396 x=1015 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44397 x=1042 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44404 x=1069 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44428 x=1096 y=510 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44480 x=1121 y=510 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44508 x=1146 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44536 x=1173 y=510 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=44537 x=1200 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44540 x=1227 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44544 x=1254 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44552 x=1281 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44553 x=1308 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44592 x=1335 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44596 x=1359 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44620 x=1383 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44637 x=1409 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44648 x=1435 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44732 x=1460 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=44760 x=1484 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45068 x=1509 y=510 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45076 x=1534 y=510 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45124 x=1559 y=510 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=45130 x=1586 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45141 x=1613 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45149 x=1640 y=510 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45196 x=1667 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45208 x=1691 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45212 x=1717 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45216 x=1743 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45225 x=1769 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45230 x=1795 y=510 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45236 x=1821 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45253 x=1846 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45320 x=1871 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45328 x=1895 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45331 x=1919 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45336 x=1943 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45347 x=1967 y=510 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45348 x=1991 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45367 x=2016 y=510 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45380 x=6 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45432 x=30 y=538 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=45433 x=57 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45458 x=84 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45572 x=111 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45576 x=138 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45580 x=165 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45712 x=192 y=538 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=45716 x=219 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45720 x=246 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45733 x=273 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45768 x=300 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45772 x=324 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45776 x=348 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45784 x=372 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45789 x=396 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45796 x=420 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45800 x=446 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45803 x=472 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45804 x=498 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45812 x=524 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45813 x=550 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45817 x=576 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45824 x=602 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45841 x=627 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45908 x=652 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45927 x=676 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45936 x=700 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=45944 x=725 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46020 x=750 y=538 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=46021 x=777 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46028 x=804 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46041 x=831 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46104 x=858 y=538 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46108 x=883 y=538 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46112 x=908 y=538 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46120 x=933 y=538 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46121 x=958 y=538 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46160 x=983 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46177 x=1010 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46244 x=1037 y=538 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46300 x=1062 y=538 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=46304 x=1089 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46308 x=1116 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46317 x=1143 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46321 x=1170 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46356 x=1197 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46377 x=1221 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46384 x=1245 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46412 x=1271 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46500 x=1296 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46523 x=1320 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46524 x=1344 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46608 x=1369 y=538 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=46832 x=1396 y=538 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46972 x=1421 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46973 x=1447 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=46988 x=1473 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47000 x=1499 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47001 x=1524 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47004 x=1549 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47019 x=1574 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47049 x=1599 y=538 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47084 x=1625 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47088 x=1649 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47100 x=1673 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47101 x=1697 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47111 x=1721 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47112 x=1745 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47116 x=1770 y=538 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47140 x=1795 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47141 x=1819 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47161 x=1843 y=538 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47196 x=1867 y=538 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=47197 x=1894 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47204 x=1921 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47213 x=1948 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47217 x=1975 y=538 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47308 x=2002 y=538 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=47336 x=6 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47344 x=33 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47448 x=60 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47456 x=87 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47476 x=114 y=566 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=47480 x=141 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47484 x=168 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47492 x=195 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47532 x=222 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47536 x=246 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47540 x=270 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47548 x=294 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47549 x=318 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47553 x=342 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47560 x=366 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47561 x=392 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47564 x=418 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47566 x=444 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47568 x=470 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47581 x=496 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47582 x=522 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47585 x=548 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47589 x=574 y=566 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47672 x=599 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47688 x=623 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47700 x=647 y=566 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47728 x=672 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47732 x=696 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47749 x=720 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47784 x=744 y=566 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=47785 x=771 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47803 x=798 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47924 x=825 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47928 x=852 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47931 x=879 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=47941 x=906 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48064 x=933 y=566 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=48120 x=960 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48121 x=984 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48124 x=1008 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48128 x=1032 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48141 x=1056 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48143 x=1080 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48148 x=1104 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48149 x=1130 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48150 x=1156 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48152 x=1182 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48155 x=1208 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48156 x=1234 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48157 x=1260 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48159 x=1286 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48169 x=1312 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48260 x=1338 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48264 x=1362 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48276 x=1386 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48277 x=1410 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48279 x=1434 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48288 x=1458 y=566 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48320 x=1483 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48324 x=1507 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48372 x=1531 y=566 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=48373 x=1558 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48376 x=1585 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48380 x=1612 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48389 x=1639 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48512 x=1666 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48513 x=1693 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48516 x=1720 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48520 x=1747 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48652 x=1774 y=566 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=48660 x=1801 y=566 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48708 x=1828 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48712 x=1852 y=566 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48736 x=1876 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48744 x=1902 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49324 x=1928 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49325 x=1954 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49328 x=1980 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49332 x=2006 y=566 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49345 x=6 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49352 x=32 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49353 x=57 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49373 x=82 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49399 x=107 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49436 x=133 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49440 x=157 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49444 x=181 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49457 x=205 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49464 x=229 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49472 x=254 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49483 x=279 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49496 x=304 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49548 x=328 y=594 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=49549 x=355 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49688 x=382 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49692 x=409 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49704 x=436 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49828 x=463 y=594 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=49845 x=490 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49849 x=517 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49884 x=544 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49885 x=568 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49888 x=592 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=49892 x=616 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50444 x=640 y=594 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50500 x=665 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50504 x=691 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50506 x=717 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50508 x=743 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50520 x=769 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50526 x=795 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50529 x=821 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50532 x=846 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50545 x=871 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50556 x=896 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50557 x=922 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50577 x=948 y=594 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50612 x=974 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50616 x=998 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50620 x=1022 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50629 x=1046 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50630 x=1070 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50631 x=1095 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50632 x=1119 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50640 x=1144 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50644 x=1169 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50668 x=1194 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50669 x=1218 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50672 x=1242 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50676 x=1266 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50689 x=1290 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50696 x=1314 y=594 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50724 x=1339 y=594 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=50728 x=1366 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50732 x=1393 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50741 x=1420 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50752 x=1447 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50756 x=1474 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50808 x=1501 y=594 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50812 x=1526 y=594 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50836 x=1551 y=594 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=50857 x=1578 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50864 x=1605 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50868 x=1632 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50880 x=1659 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50892 x=1686 y=594 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50896 x=1711 y=594 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50920 x=1736 y=594 width=14 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50948 x=1762 y=594 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=50976 x=1787 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51004 x=1814 y=594 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=51008 x=1841 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51012 x=1868 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51020 x=1895 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51025 x=1922 y=594 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51032 x=1949 y=594 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51060 x=1974 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51064 x=1998 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51068 x=2022 y=594 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51069 x=6 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51076 x=30 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51077 x=54 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51080 x=78 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51088 x=103 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51089 x=129 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51096 x=155 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51104 x=181 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51109 x=207 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51116 x=233 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51200 x=258 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51201 x=282 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51204 x=306 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51208 x=330 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51217 x=354 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51221 x=378 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51228 x=402 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51256 x=427 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51312 x=451 y=622 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=51333 x=478 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51339 x=505 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51340 x=532 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51452 x=559 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51456 x=586 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51460 x=613 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51469 x=640 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51473 x=667 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51592 x=694 y=622 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=51593 x=721 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51600 x=748 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51608 x=775 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51613 x=802 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51648 x=829 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51649 x=853 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51652 x=877 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51656 x=901 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51664 x=925 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51665 x=949 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=51901 x=973 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52264 x=1000 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52265 x=1026 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52280 x=1052 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52286 x=1078 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52293 x=1104 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52376 x=1129 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52393 x=1153 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52397 x=1177 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52404 x=1201 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52488 x=1226 y=622 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=52572 x=1253 y=622 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52628 x=1278 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52636 x=1305 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52649 x=1332 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52656 x=1359 y=622 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52712 x=1384 y=622 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52769 x=1409 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52824 x=1436 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52825 x=1460 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52840 x=1484 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52852 x=1508 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52880 x=1534 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52884 x=1559 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52888 x=1584 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52896 x=1609 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52964 x=1634 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52968 x=1658 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=52980 x=1682 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53020 x=1706 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53028 x=1730 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53076 x=1754 y=622 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=53356 x=1781 y=622 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=53360 x=1808 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53364 x=1835 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53372 x=1862 y=622 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53412 x=1889 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53429 x=1913 y=622 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53440 x=1937 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53444 x=1963 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53448 x=1989 y=622 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53468 x=2015 y=622 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53469 x=6 y=650 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53552 x=31 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53580 x=55 y=650 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53596 x=80 y=650 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53664 x=105 y=650 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=53681 x=132 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53685 x=159 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53804 x=186 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53916 x=213 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=53944 x=240 y=650 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=53948 x=267 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54000 x=294 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54001 x=318 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54021 x=342 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54028 x=366 y=650 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54032 x=392 y=650 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54047 x=418 y=650 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54056 x=444 y=650 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54168 x=469 y=650 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54200 x=494 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54217 x=518 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54224 x=542 y=650 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54252 x=567 y=650 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=54253 x=594 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54256 x=621 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54260 x=648 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54268 x=675 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54364 x=702 y=650 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=54408 x=729 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54504 x=756 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54532 x=783 y=650 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=54540 x=810 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54588 x=837 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54596 x=861 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54616 x=885 y=650 width=14 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54617 x=911 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54620 x=938 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54624 x=965 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54632 x=992 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54633 x=1019 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54635 x=1046 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54637 x=1073 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54644 x=1100 y=650 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54648 x=1125 y=650 width=14 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54665 x=1151 y=650 width=14 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54693 x=1177 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54728 x=1204 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54744 x=1228 y=650 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54788 x=1253 y=650 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54805 x=1278 y=650 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54812 x=1303 y=650 width=13 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54840 x=1328 y=650 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=54844 x=1355 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54848 x=1382 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54856 x=1409 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54868 x=1436 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54869 x=1463 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54872 x=1490 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54876 x=1517 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54889 x=1544 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54924 x=1571 y=650 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54925 x=1596 y=650 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54945 x=1621 y=650 width=13 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=54952 x=1646 y=650 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=54980 x=1673 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=55092 x=1700 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=55120 x=1727 y=650 width=15 height=11 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=55124 x=1754 y=650 width=15 height=14 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=55176 x=1781 y=650 width=12 height=14 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=65281 x=1805 y=650 width=3 height=12 xoffset=5 yoffset=2 xadvance=16 page=0 chnl=15 +char id=65286 x=1820 y=650 width=11 height=12 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=65288 x=1843 y=650 width=5 height=14 xoffset=7 yoffset=1 xadvance=16 page=0 chnl=15 +char id=65289 x=1860 y=650 width=5 height=14 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15 +char id=65291 x=1877 y=650 width=11 height=11 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=65292 x=1900 y=650 width=2 height=5 xoffset=4 yoffset=10 xadvance=16 page=0 chnl=15 +char id=65295 x=1914 y=650 width=14 height=14 xoffset=1 yoffset=1 xadvance=16 page=0 chnl=15 +char id=65306 x=1940 y=650 width=2 height=7 xoffset=5 yoffset=5 xadvance=16 page=0 chnl=15 +char id=65307 x=1954 y=650 width=2 height=10 xoffset=5 yoffset=5 xadvance=16 page=0 chnl=15 +char id=65311 x=1968 y=650 width=9 height=12 xoffset=3 yoffset=2 xadvance=16 page=0 chnl=15 +char id=128293 x=1989 y=650 width=0 height=0 xoffset=0 yoffset=0 xadvance=0 page=0 chnl=15 diff --git a/iqpilot/selfdrive/assets/fonts/unifont.otf b/iqpilot/selfdrive/assets/fonts/unifont.otf new file mode 100644 index 000000000..537b53eaa Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/unifont.otf differ diff --git a/iqpilot/selfdrive/assets/fonts/unifont.png b/iqpilot/selfdrive/assets/fonts/unifont.png new file mode 100644 index 000000000..a27732975 Binary files /dev/null and b/iqpilot/selfdrive/assets/fonts/unifont.png differ diff --git a/iqpilot/selfdrive/assets/icons/.gitattributes b/iqpilot/selfdrive/assets/icons/.gitattributes new file mode 100644 index 000000000..202d2b7a0 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/.gitattributes @@ -0,0 +1,6 @@ +*.png -filter -diff -merge -text +*/*.png -filter -diff -merge -text +*/*/*.png -filter -diff -merge -text +*.svg -filter -diff -merge text eol=lf +*/*.svg -filter -diff -merge text eol=lf +*/*/*.svg -filter -diff -merge text eol=lf diff --git a/iqpilot/selfdrive/assets/icons/arrow-right.png b/iqpilot/selfdrive/assets/icons/arrow-right.png new file mode 100644 index 000000000..704029383 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/arrow-right.png differ diff --git a/iqpilot/selfdrive/assets/icons/backspace.png b/iqpilot/selfdrive/assets/icons/backspace.png new file mode 100644 index 000000000..0de132aab Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/backspace.png differ diff --git a/iqpilot/selfdrive/assets/icons/calibration.png b/iqpilot/selfdrive/assets/icons/calibration.png new file mode 100644 index 000000000..c4ee0d63d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/calibration.png differ diff --git a/iqpilot/selfdrive/assets/icons/camera.png b/iqpilot/selfdrive/assets/icons/camera.png new file mode 100644 index 000000000..544ebe90e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/camera.png differ diff --git a/iqpilot/selfdrive/assets/icons/capslock-fill.png b/iqpilot/selfdrive/assets/icons/capslock-fill.png new file mode 100644 index 000000000..e52f3ec2f Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/capslock-fill.png differ diff --git a/iqpilot/selfdrive/assets/icons/checkmark.png b/iqpilot/selfdrive/assets/icons/checkmark.png new file mode 100644 index 000000000..c1886defd Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/checkmark.png differ diff --git a/iqpilot/selfdrive/assets/icons/checkmark.svg b/iqpilot/selfdrive/assets/icons/checkmark.svg new file mode 100644 index 000000000..bb04a2b12 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/checkmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/iqpilot/selfdrive/assets/icons/chevron_right.png b/iqpilot/selfdrive/assets/icons/chevron_right.png new file mode 100644 index 000000000..a3aaa7648 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/chevron_right.png differ diff --git a/iqpilot/selfdrive/assets/icons/chffr_wheel.png b/iqpilot/selfdrive/assets/icons/chffr_wheel.png new file mode 100644 index 000000000..3f09a35a7 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/chffr_wheel.png differ diff --git a/iqpilot/selfdrive/assets/icons/circled_check.png b/iqpilot/selfdrive/assets/icons/circled_check.png new file mode 100644 index 000000000..a29a613bf Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/circled_check.png differ diff --git a/iqpilot/selfdrive/assets/icons/circled_check.svg b/iqpilot/selfdrive/assets/icons/circled_check.svg new file mode 100644 index 000000000..03cc81109 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/circled_check.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/circled_slash.png b/iqpilot/selfdrive/assets/icons/circled_slash.png new file mode 100644 index 000000000..cf22b9c19 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/circled_slash.png differ diff --git a/iqpilot/selfdrive/assets/icons/circled_slash.svg b/iqpilot/selfdrive/assets/icons/circled_slash.svg new file mode 100644 index 000000000..5f22233ef --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/circled_slash.svg @@ -0,0 +1,3 @@ + + + diff --git a/iqpilot/selfdrive/assets/icons/clock.png b/iqpilot/selfdrive/assets/icons/clock.png new file mode 100644 index 000000000..c93c69e6d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/clock.png differ diff --git a/iqpilot/selfdrive/assets/icons/close.png b/iqpilot/selfdrive/assets/icons/close.png new file mode 100644 index 000000000..9c39fce89 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/close.png differ diff --git a/iqpilot/selfdrive/assets/icons/close.svg b/iqpilot/selfdrive/assets/icons/close.svg new file mode 100644 index 000000000..6927cede0 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/iqpilot/selfdrive/assets/icons/close2.png b/iqpilot/selfdrive/assets/icons/close2.png new file mode 100644 index 000000000..055a2970f Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/close2.png differ diff --git a/iqpilot/selfdrive/assets/icons/close2.svg b/iqpilot/selfdrive/assets/icons/close2.svg new file mode 100644 index 000000000..be1385848 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/close2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/couch.png b/iqpilot/selfdrive/assets/icons/couch.png new file mode 100644 index 000000000..bde02c0b7 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/couch.png differ diff --git a/iqpilot/selfdrive/assets/icons/couch.svg b/iqpilot/selfdrive/assets/icons/couch.svg new file mode 100644 index 000000000..6317cf92f --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/couch.svg @@ -0,0 +1,3 @@ + + + diff --git a/iqpilot/selfdrive/assets/icons/disengage_on_accelerator.png b/iqpilot/selfdrive/assets/icons/disengage_on_accelerator.png new file mode 100644 index 000000000..181491c05 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/disengage_on_accelerator.png differ diff --git a/iqpilot/selfdrive/assets/icons/disengage_on_accelerator.svg b/iqpilot/selfdrive/assets/icons/disengage_on_accelerator.svg new file mode 100644 index 000000000..d90ba8ca5 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/disengage_on_accelerator.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/driver_face.png b/iqpilot/selfdrive/assets/icons/driver_face.png new file mode 100644 index 000000000..e2d943e53 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/driver_face.png differ diff --git a/iqpilot/selfdrive/assets/icons/experimental.png b/iqpilot/selfdrive/assets/icons/experimental.png new file mode 100644 index 000000000..fcb1e086a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/experimental.png differ diff --git a/iqpilot/selfdrive/assets/icons/experimental.svg b/iqpilot/selfdrive/assets/icons/experimental.svg new file mode 100644 index 000000000..2be14b808 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/experimental.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/iqpilot/selfdrive/assets/icons/experimental_grey.png b/iqpilot/selfdrive/assets/icons/experimental_grey.png new file mode 100644 index 000000000..9be4bd720 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/experimental_grey.png differ diff --git a/iqpilot/selfdrive/assets/icons/experimental_grey.svg b/iqpilot/selfdrive/assets/icons/experimental_grey.svg new file mode 100644 index 000000000..0f77bb008 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/experimental_grey.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/experimental_white.png b/iqpilot/selfdrive/assets/icons/experimental_white.png new file mode 100644 index 000000000..4751ee527 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/experimental_white.png differ diff --git a/iqpilot/selfdrive/assets/icons/experimental_white.svg b/iqpilot/selfdrive/assets/icons/experimental_white.svg new file mode 100644 index 000000000..d5052e9d2 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/experimental_white.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/eye_closed.png b/iqpilot/selfdrive/assets/icons/eye_closed.png new file mode 100644 index 000000000..910363f75 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/eye_closed.png differ diff --git a/iqpilot/selfdrive/assets/icons/eye_closed.svg b/iqpilot/selfdrive/assets/icons/eye_closed.svg new file mode 100644 index 000000000..47410a035 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/eye_closed.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iqpilot/selfdrive/assets/icons/eye_open.png b/iqpilot/selfdrive/assets/icons/eye_open.png new file mode 100644 index 000000000..55b505658 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/eye_open.png differ diff --git a/iqpilot/selfdrive/assets/icons/eye_open.svg b/iqpilot/selfdrive/assets/icons/eye_open.svg new file mode 100644 index 000000000..16d34f080 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/eye_open.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/eyes_crossed.png b/iqpilot/selfdrive/assets/icons/eyes_crossed.png new file mode 100644 index 000000000..9b800c4c7 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/eyes_crossed.png differ diff --git a/iqpilot/selfdrive/assets/icons/eyes_open.png b/iqpilot/selfdrive/assets/icons/eyes_open.png new file mode 100644 index 000000000..5e6cf7583 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/eyes_open.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/ATTRIBUTION.txt b/iqpilot/selfdrive/assets/icons/iq/ATTRIBUTION.txt new file mode 100644 index 000000000..122dcc6a5 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/iq/ATTRIBUTION.txt @@ -0,0 +1,6 @@ +Icons in this directory are derived from Lucide (https://lucide.dev), +licensed under the ISC License. Stroke color was modified (white, or a +teal gradient for the offroad launcher tiles) and rasterized to PNG. + +Lucide Š Lucide Contributors — ISC License +https://github.com/lucide-icons/lucide/blob/main/LICENSE diff --git a/iqpilot/selfdrive/assets/icons/iq/back.png b/iqpilot/selfdrive/assets/icons/iq/back.png new file mode 100644 index 000000000..a3d5a7945 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/back.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/battery.png b/iqpilot/selfdrive/assets/icons/iq/battery.png new file mode 100644 index 000000000..f6af3804c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/battery.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/battery_charging.png b/iqpilot/selfdrive/assets/icons/iq/battery_charging.png new file mode 100644 index 000000000..8d3bf3b3c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/battery_charging.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/bell-slash.png b/iqpilot/selfdrive/assets/icons/iq/bell-slash.png new file mode 100644 index 000000000..3164064c9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/bell-slash.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/bell.png b/iqpilot/selfdrive/assets/icons/iq/bell.png new file mode 100644 index 000000000..675b3ab95 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/bell.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/bookmark.png b/iqpilot/selfdrive/assets/icons/iq/bookmark.png new file mode 100644 index 000000000..7ccd1bfdb Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/bookmark.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/chevron_down.png b/iqpilot/selfdrive/assets/icons/iq/chevron_down.png new file mode 100644 index 000000000..dc924d971 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/chevron_down.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/chevron_right.png b/iqpilot/selfdrive/assets/icons/iq/chevron_right.png new file mode 100644 index 000000000..89a48e804 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/chevron_right.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/close.png b/iqpilot/selfdrive/assets/icons/iq/close.png new file mode 100644 index 000000000..a5114aa56 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/close.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/home.png b/iqpilot/selfdrive/assets/icons/iq/home.png new file mode 100644 index 000000000..47eb08ae4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/home.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/moon.png b/iqpilot/selfdrive/assets/icons/iq/moon.png new file mode 100644 index 000000000..b72052da3 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/moon.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/pin.png b/iqpilot/selfdrive/assets/icons/iq/pin.png new file mode 100644 index 000000000..71d34fd1e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/pin.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/play.png b/iqpilot/selfdrive/assets/icons/iq/play.png new file mode 100644 index 000000000..2f94e24e6 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/play.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/power.png b/iqpilot/selfdrive/assets/icons/iq/power.png new file mode 100644 index 000000000..517d316b8 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/power.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/recent.png b/iqpilot/selfdrive/assets/icons/iq/recent.png new file mode 100644 index 000000000..6811dc96c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/recent.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/restart.png b/iqpilot/selfdrive/assets/icons/iq/restart.png new file mode 100644 index 000000000..d42e857f2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/restart.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/rotate-ccw.png b/iqpilot/selfdrive/assets/icons/iq/rotate-ccw.png new file mode 100644 index 000000000..0c7fc6e21 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/rotate-ccw.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/rotate-ccw.svg b/iqpilot/selfdrive/assets/icons/iq/rotate-ccw.svg new file mode 100644 index 000000000..e3d11dbe9 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/iq/rotate-ccw.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/iq/rotate-cw.png b/iqpilot/selfdrive/assets/icons/iq/rotate-cw.png new file mode 100644 index 000000000..0619daf98 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/rotate-cw.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/rotate-cw.svg b/iqpilot/selfdrive/assets/icons/iq/rotate-cw.svg new file mode 100644 index 000000000..c27d8820d --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/iq/rotate-cw.svg @@ -0,0 +1,4 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/iq/search.png b/iqpilot/selfdrive/assets/icons/iq/search.png new file mode 100644 index 000000000..6514ca683 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/search.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/sec_maintenance.png b/iqpilot/selfdrive/assets/icons/iq/sec_maintenance.png new file mode 100644 index 000000000..66355b840 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/sec_maintenance.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/sec_system.png b/iqpilot/selfdrive/assets/icons/iq/sec_system.png new file mode 100644 index 000000000..eb8666021 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/sec_system.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/signal.png b/iqpilot/selfdrive/assets/icons/iq/signal.png new file mode 100644 index 000000000..7b1d4dab3 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/signal.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/square-parking.png b/iqpilot/selfdrive/assets/icons/iq/square-parking.png new file mode 100644 index 000000000..d8b44ed0d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/square-parking.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/square-parking.svg b/iqpilot/selfdrive/assets/icons/iq/square-parking.svg new file mode 100644 index 000000000..b7642a15b --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/iq/square-parking.svg @@ -0,0 +1,14 @@ + + + + diff --git a/iqpilot/selfdrive/assets/icons/iq/tile_nav.png b/iqpilot/selfdrive/assets/icons/iq/tile_nav.png new file mode 100644 index 000000000..974c7fe0c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/tile_nav.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/tile_routes.png b/iqpilot/selfdrive/assets/icons/iq/tile_routes.png new file mode 100644 index 000000000..d58b6569e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/tile_routes.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/tile_settings.png b/iqpilot/selfdrive/assets/icons/iq/tile_settings.png new file mode 100644 index 000000000..2078f1b81 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/tile_settings.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/tile_stats.png b/iqpilot/selfdrive/assets/icons/iq/tile_stats.png new file mode 100644 index 000000000..2e746eacd Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/tile_stats.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/trash.png b/iqpilot/selfdrive/assets/icons/iq/trash.png new file mode 100644 index 000000000..ec5d7282d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/trash.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/wifi.png b/iqpilot/selfdrive/assets/icons/iq/wifi.png new file mode 100644 index 000000000..553eaa010 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/wifi.png differ diff --git a/iqpilot/selfdrive/assets/icons/iq/work.png b/iqpilot/selfdrive/assets/icons/iq/work.png new file mode 100644 index 000000000..e8fb476a4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/iq/work.png differ diff --git a/iqpilot/selfdrive/assets/icons/lead_orb.png b/iqpilot/selfdrive/assets/icons/lead_orb.png new file mode 100644 index 000000000..8146527b4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/lead_orb.png differ diff --git a/iqpilot/selfdrive/assets/icons/link.png b/iqpilot/selfdrive/assets/icons/link.png new file mode 100644 index 000000000..218c03a98 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/link.png differ diff --git a/iqpilot/selfdrive/assets/icons/live_view.png b/iqpilot/selfdrive/assets/icons/live_view.png new file mode 100644 index 000000000..e85ccfb5b Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/live_view.png differ diff --git a/iqpilot/selfdrive/assets/icons/lock_closed.png b/iqpilot/selfdrive/assets/icons/lock_closed.png new file mode 100644 index 000000000..05afcaef9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/lock_closed.png differ diff --git a/iqpilot/selfdrive/assets/icons/lock_closed.svg b/iqpilot/selfdrive/assets/icons/lock_closed.svg new file mode 100644 index 000000000..923344f75 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/lock_closed.svg @@ -0,0 +1,3 @@ + + + diff --git a/iqpilot/selfdrive/assets/icons/menu.png b/iqpilot/selfdrive/assets/icons/menu.png new file mode 100644 index 000000000..837cf5831 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/menu.png differ diff --git a/iqpilot/selfdrive/assets/icons/metric.png b/iqpilot/selfdrive/assets/icons/metric.png new file mode 100644 index 000000000..eaa2438fa Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/metric.png differ diff --git a/iqpilot/selfdrive/assets/icons/microphone.png b/iqpilot/selfdrive/assets/icons/microphone.png new file mode 100644 index 000000000..787ad86e0 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/microphone.png differ diff --git a/iqpilot/selfdrive/assets/icons/minus.png b/iqpilot/selfdrive/assets/icons/minus.png new file mode 100644 index 000000000..e5327c0d3 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/minus.png differ diff --git a/iqpilot/selfdrive/assets/icons/monitoring.png b/iqpilot/selfdrive/assets/icons/monitoring.png new file mode 100644 index 000000000..05f78811e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/monitoring.png differ diff --git a/iqpilot/selfdrive/assets/icons/network.png b/iqpilot/selfdrive/assets/icons/network.png new file mode 100644 index 000000000..116d47ecf Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/network.png differ diff --git a/iqpilot/selfdrive/assets/icons/network.svg b/iqpilot/selfdrive/assets/icons/network.svg new file mode 100644 index 000000000..2c0817d9e --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/network.svg @@ -0,0 +1 @@ + diff --git a/iqpilot/selfdrive/assets/icons/road.png b/iqpilot/selfdrive/assets/icons/road.png new file mode 100644 index 000000000..5868ed1cc Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/road.png differ diff --git a/iqpilot/selfdrive/assets/icons/settings.png b/iqpilot/selfdrive/assets/icons/settings.png new file mode 100644 index 000000000..d0c90a620 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/settings.png differ diff --git a/iqpilot/selfdrive/assets/icons/shell.png b/iqpilot/selfdrive/assets/icons/shell.png new file mode 100644 index 000000000..e28040fc5 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/shell.png differ diff --git a/iqpilot/selfdrive/assets/icons/shell.svg b/iqpilot/selfdrive/assets/icons/shell.svg new file mode 100644 index 000000000..e33d5a436 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/shell.svg @@ -0,0 +1 @@ + diff --git a/iqpilot/selfdrive/assets/icons/shift-fill.png b/iqpilot/selfdrive/assets/icons/shift-fill.png new file mode 100644 index 000000000..7cf0d2527 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/shift-fill.png differ diff --git a/iqpilot/selfdrive/assets/icons/shift.png b/iqpilot/selfdrive/assets/icons/shift.png new file mode 100644 index 000000000..5847339e6 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/shift.png differ diff --git a/iqpilot/selfdrive/assets/icons/speed_limit.png b/iqpilot/selfdrive/assets/icons/speed_limit.png new file mode 100644 index 000000000..0aa7038f9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/speed_limit.png differ diff --git a/iqpilot/selfdrive/assets/icons/triangle.png b/iqpilot/selfdrive/assets/icons/triangle.png new file mode 100644 index 000000000..86f9156ce Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/triangle.png differ diff --git a/iqpilot/selfdrive/assets/icons/triangle.svg b/iqpilot/selfdrive/assets/icons/triangle.svg new file mode 100644 index 000000000..ef10e16e2 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/triangle.svg @@ -0,0 +1,3 @@ + + + diff --git a/iqpilot/selfdrive/assets/icons/warning.png b/iqpilot/selfdrive/assets/icons/warning.png new file mode 100644 index 000000000..50fe82112 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/warning.png differ diff --git a/iqpilot/selfdrive/assets/icons/wifi_strength_full.png b/iqpilot/selfdrive/assets/icons/wifi_strength_full.png new file mode 100644 index 000000000..58d3feedc Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/wifi_strength_full.png differ diff --git a/iqpilot/selfdrive/assets/icons/wifi_strength_full.svg b/iqpilot/selfdrive/assets/icons/wifi_strength_full.svg new file mode 100644 index 000000000..96af03799 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/wifi_strength_full.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iqpilot/selfdrive/assets/icons/wifi_strength_high.png b/iqpilot/selfdrive/assets/icons/wifi_strength_high.png new file mode 100644 index 000000000..327a75b2a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/wifi_strength_high.png differ diff --git a/iqpilot/selfdrive/assets/icons/wifi_strength_high.svg b/iqpilot/selfdrive/assets/icons/wifi_strength_high.svg new file mode 100644 index 000000000..63fc8bc0b --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/wifi_strength_high.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iqpilot/selfdrive/assets/icons/wifi_strength_low.png b/iqpilot/selfdrive/assets/icons/wifi_strength_low.png new file mode 100644 index 000000000..5464acfd2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/wifi_strength_low.png differ diff --git a/iqpilot/selfdrive/assets/icons/wifi_strength_low.svg b/iqpilot/selfdrive/assets/icons/wifi_strength_low.svg new file mode 100644 index 000000000..5bc67bed5 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/wifi_strength_low.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/iqpilot/selfdrive/assets/icons/wifi_strength_medium.png b/iqpilot/selfdrive/assets/icons/wifi_strength_medium.png new file mode 100644 index 000000000..5340423e5 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/wifi_strength_medium.png differ diff --git a/iqpilot/selfdrive/assets/icons/wifi_strength_medium.svg b/iqpilot/selfdrive/assets/icons/wifi_strength_medium.svg new file mode 100644 index 000000000..9030dbc56 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/wifi_strength_medium.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iqpilot/selfdrive/assets/icons/wifi_uploading.png b/iqpilot/selfdrive/assets/icons/wifi_uploading.png new file mode 100644 index 000000000..e0aa598fb Binary files /dev/null and b/iqpilot/selfdrive/assets/icons/wifi_uploading.png differ diff --git a/iqpilot/selfdrive/assets/icons/wifi_uploading.svg b/iqpilot/selfdrive/assets/icons/wifi_uploading.svg new file mode 100644 index 000000000..1c1c9af45 --- /dev/null +++ b/iqpilot/selfdrive/assets/icons/wifi_uploading.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iqpilot/selfdrive/assets/icons_mici/adb_short.png b/iqpilot/selfdrive/assets/icons_mici/adb_short.png new file mode 100644 index 000000000..162b4e71d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/adb_short.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle.png new file mode 100644 index 000000000..817d79f95 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_disabled.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_disabled.png new file mode 100644 index 000000000..52fb7f4e3 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_disabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_hover.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_hover.png new file mode 100644 index 000000000..b098870b7 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_hover.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_pressed.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_pressed.png new file mode 100644 index 000000000..90a5af125 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red.png new file mode 100644 index 000000000..e4c06b4e3 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red_hover.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red_hover.png new file mode 100644 index 000000000..e42e22982 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red_hover.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red_pressed.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red_pressed.png new file mode 100644 index 000000000..8349feb40 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_circle_red_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle.png new file mode 100644 index 000000000..0a68722c4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_disabled.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_disabled.png new file mode 100644 index 000000000..e4ef99b82 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_disabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_hover.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_hover.png new file mode 100644 index 000000000..6c98434f5 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_hover.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_pressed.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_pressed.png new file mode 100644 index 000000000..43ed496ad Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_rectangle_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_back.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_back.png new file mode 100644 index 000000000..61f7be9f4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_back.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_back_pressed.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_back_pressed.png new file mode 100644 index 000000000..cc9e50ece Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_back_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_check.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_check.png new file mode 100644 index 000000000..b73e008a3 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_check.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_check_pressed.png b/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_check_pressed.png new file mode 100644 index 000000000..9af6c6ee8 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/button_side_check_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/slider_bg.png b/iqpilot/selfdrive/assets/icons_mici/buttons/slider_bg.png new file mode 100644 index 000000000..cf1c7d67b Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/slider_bg.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_dot_disabled.png b/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_dot_disabled.png new file mode 100644 index 000000000..03aa4cd1b Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_dot_disabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_dot_enabled.png b/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_dot_enabled.png new file mode 100644 index 000000000..0f8062054 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_dot_enabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_pill_disabled.png b/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_pill_disabled.png new file mode 100644 index 000000000..e6008661d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_pill_disabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_pill_enabled.png b/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_pill_enabled.png new file mode 100644 index 000000000..2a5612a19 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/buttons/toggle_pill_enabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/egpu.png b/iqpilot/selfdrive/assets/icons_mici/egpu.png new file mode 100644 index 000000000..6341111ee Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/egpu.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/egpu_green.png b/iqpilot/selfdrive/assets/icons_mici/egpu_green.png new file mode 100644 index 000000000..4f05cf1e4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/egpu_green.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/egpu_orange.png b/iqpilot/selfdrive/assets/icons_mici/egpu_orange.png new file mode 100644 index 000000000..6a3fd3d00 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/egpu_orange.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/exclamation_point.png b/iqpilot/selfdrive/assets/icons_mici/exclamation_point.png new file mode 100644 index 000000000..7a5773d7a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/exclamation_point.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/experimental_mode.png b/iqpilot/selfdrive/assets/icons_mici/experimental_mode.png new file mode 100644 index 000000000..db699bc8d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/experimental_mode.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/experimental_mode_mici.png b/iqpilot/selfdrive/assets/icons_mici/experimental_mode_mici.png new file mode 100644 index 000000000..e741b4053 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/experimental_mode_mici.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/experimental_mode_tizi.png b/iqpilot/selfdrive/assets/icons_mici/experimental_mode_tizi.png new file mode 100644 index 000000000..6045b7ac9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/experimental_mode_tizi.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/iqdynamic_mode_mici.png b/iqpilot/selfdrive/assets/icons_mici/iqdynamic_mode_mici.png new file mode 100644 index 000000000..9116fb492 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/iqdynamic_mode_mici.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/iqdynamic_mode_tizi.png b/iqpilot/selfdrive/assets/icons_mici/iqdynamic_mode_tizi.png new file mode 100644 index 000000000..8b466cdf4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/iqdynamic_mode_tizi.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/iqstandard_mode_mici.png b/iqpilot/selfdrive/assets/icons_mici/iqstandard_mode_mici.png new file mode 100644 index 000000000..ae98bbb6e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/iqstandard_mode_mici.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/iqstandard_mode_tizi.png b/iqpilot/selfdrive/assets/icons_mici/iqstandard_mode_tizi.png new file mode 100644 index 000000000..8b2a2868a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/iqstandard_mode_tizi.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/mac.png b/iqpilot/selfdrive/assets/icons_mici/mac.png new file mode 100644 index 000000000..e33feb574 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/mac.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/mac_green.png b/iqpilot/selfdrive/assets/icons_mici/mac_green.png new file mode 100644 index 000000000..308b38ca9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/mac_green.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/mac_orange.png b/iqpilot/selfdrive/assets/icons_mici/mac_orange.png new file mode 100644 index 000000000..027306604 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/mac_orange.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/microphone.png b/iqpilot/selfdrive/assets/icons_mici/microphone.png new file mode 100644 index 000000000..c64f871d8 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/microphone.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/models.png b/iqpilot/selfdrive/assets/icons_mici/models.png new file mode 100644 index 000000000..17d57e625 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/models.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/big_alert.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/big_alert.png new file mode 100644 index 000000000..a4f6a50da Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/big_alert.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/big_alert_pressed.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/big_alert_pressed.png new file mode 100644 index 000000000..1c97c3326 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/big_alert_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/green_wheel.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/green_wheel.png new file mode 100644 index 000000000..76a73bbd2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/green_wheel.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/medium_alert.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/medium_alert.png new file mode 100644 index 000000000..4fe8a188c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/medium_alert.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/medium_alert_pressed.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/medium_alert_pressed.png new file mode 100644 index 000000000..8b531f048 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/medium_alert_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/orange_warning.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/orange_warning.png new file mode 100644 index 000000000..ff1f7cdf6 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/orange_warning.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/red_warning.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/red_warning.png new file mode 100644 index 000000000..a726f528a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/red_warning.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/small_alert.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/small_alert.png new file mode 100644 index 000000000..83a1e72ea Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/small_alert.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/small_alert_pressed.png b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/small_alert_pressed.png new file mode 100644 index 000000000..50921ce6c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/offroad_alerts/small_alert_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/blind_spot_left.png b/iqpilot/selfdrive/assets/icons_mici/onroad/blind_spot_left.png new file mode 100644 index 000000000..e50c22c89 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/blind_spot_left.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/blind_spot_right.png b/iqpilot/selfdrive/assets/icons_mici/onroad/blind_spot_right.png new file mode 100644 index 000000000..af306b538 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/blind_spot_right.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/bookmark.png b/iqpilot/selfdrive/assets/icons_mici/onroad/bookmark.png new file mode 100644 index 000000000..929654f01 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/bookmark.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/bookmark_fill.png b/iqpilot/selfdrive/assets/icons_mici/onroad/bookmark_fill.png new file mode 100644 index 000000000..c52fe2ac2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/bookmark_fill.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_background.png b/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_background.png new file mode 100644 index 000000000..b464f3c10 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_background.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_cone.png b/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_cone.png new file mode 100644 index 000000000..1f36e9cb2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_cone.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_person.png b/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_person.png new file mode 100644 index 000000000..223ff6979 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/driver_monitoring/dm_person.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/eye_fill.png b/iqpilot/selfdrive/assets/icons_mici/onroad/eye_fill.png new file mode 100644 index 000000000..438b3bc8c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/eye_fill.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/eye_orange.png b/iqpilot/selfdrive/assets/icons_mici/onroad/eye_orange.png new file mode 100644 index 000000000..8cd929707 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/eye_orange.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/glasses.png b/iqpilot/selfdrive/assets/icons_mici/onroad/glasses.png new file mode 100644 index 000000000..8de9c4395 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/glasses.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/onroad_fade.png b/iqpilot/selfdrive/assets/icons_mici/onroad/onroad_fade.png new file mode 100644 index 000000000..de0388580 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/onroad_fade.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/turn_signal_left.png b/iqpilot/selfdrive/assets/icons_mici/onroad/turn_signal_left.png new file mode 100644 index 000000000..bb7e5970d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/turn_signal_left.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/onroad/turn_signal_right.png b/iqpilot/selfdrive/assets/icons_mici/onroad/turn_signal_right.png new file mode 100644 index 000000000..91304ea47 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/onroad/turn_signal_right.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings.png b/iqpilot/selfdrive/assets/icons_mici/settings.png new file mode 100644 index 000000000..91a4a1ca6 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/brightness.png b/iqpilot/selfdrive/assets/icons_mici/settings/brightness.png new file mode 100644 index 000000000..283a514a4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/brightness.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/camera.png b/iqpilot/selfdrive/assets/icons_mici/settings/camera.png new file mode 100644 index 000000000..2c43fa32c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/camera.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/developer/ssh.png b/iqpilot/selfdrive/assets/icons_mici/settings/developer/ssh.png new file mode 100644 index 000000000..a99becf24 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/developer/ssh.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/developer_icon.png b/iqpilot/selfdrive/assets/icons_mici/settings/developer_icon.png new file mode 100644 index 000000000..b6e74098d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/developer_icon.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/cameras.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/cameras.png new file mode 100644 index 000000000..d51a1f1fa Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/cameras.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/fcc_logo.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/fcc_logo.png new file mode 100644 index 000000000..818a40d64 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/fcc_logo.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/info.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/info.png new file mode 100644 index 000000000..05cfb723e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/info.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/language.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/language.png new file mode 100644 index 000000000..c1e660268 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/language.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/lkas.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/lkas.png new file mode 100644 index 000000000..b6b10c8d2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/lkas.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/pair.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/pair.png new file mode 100644 index 000000000..0c9a19c44 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/pair.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/power.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/power.png new file mode 100644 index 000000000..2b06febc1 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/power.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/reboot.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/reboot.png new file mode 100644 index 000000000..a107f9ebe Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/reboot.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/uninstall.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/uninstall.png new file mode 100644 index 000000000..6db14985d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/uninstall.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/up_to_date.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/up_to_date.png new file mode 100644 index 000000000..ed87ba667 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/up_to_date.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device/update.png b/iqpilot/selfdrive/assets/icons_mici/settings/device/update.png new file mode 100644 index 000000000..277d27ea9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device/update.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/device_icon.png b/iqpilot/selfdrive/assets/icons_mici/settings/device_icon.png new file mode 100644 index 000000000..d56e6679d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/device_icon.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/firehose.png b/iqpilot/selfdrive/assets/icons_mici/settings/firehose.png new file mode 100644 index 000000000..c1e53f9b5 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/firehose.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/backspace.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/backspace.png new file mode 100644 index 000000000..ebea79638 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/backspace.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_lock.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_lock.png new file mode 100644 index 000000000..97c29255f Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_lock.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_lower.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_lower.png new file mode 100644 index 000000000..e2e4526f4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_lower.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_upper.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_upper.png new file mode 100644 index 000000000..348a4c14f Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/caps_upper.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/confirm.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/confirm.png new file mode 100644 index 000000000..3c18b1c2b Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/confirm.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/enter.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/enter.png new file mode 100644 index 000000000..b853d98d7 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/enter.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/enter_disabled.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/enter_disabled.png new file mode 100644 index 000000000..df54c043c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/enter_disabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/keyboard_background.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/keyboard_background.png new file mode 100644 index 000000000..ee795581a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/keyboard_background.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/space.png b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/space.png new file mode 100644 index 000000000..0d5bc90ef Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/keyboard/space.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/konn3kt_icon.png b/iqpilot/selfdrive/assets/icons_mici/settings/konn3kt_icon.png new file mode 100644 index 000000000..c34731e38 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/konn3kt_icon.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_full.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_full.png new file mode 100644 index 000000000..6899a72ce Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_full.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_high.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_high.png new file mode 100644 index 000000000..751ce84ac Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_high.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_low.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_low.png new file mode 100644 index 000000000..ff7d21692 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_low.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_medium.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_medium.png new file mode 100644 index 000000000..c69d66750 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_medium.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_none.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_none.png new file mode 100644 index 000000000..63846f360 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/cell_strength_none.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/connect_button.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/connect_button.png new file mode 100644 index 000000000..88967f7f4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/connect_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/connect_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/connect_button_pressed.png new file mode 100644 index 000000000..fd9c2e22f Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/connect_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/forget_button.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/forget_button.png new file mode 100644 index 000000000..cec31dcc8 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/forget_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/forget_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/forget_button_pressed.png new file mode 100644 index 000000000..b12fb37a9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/forget_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/full_connect_button.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/full_connect_button.png new file mode 100644 index 000000000..8dd295bf9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/full_connect_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/full_connect_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/full_connect_button_pressed.png new file mode 100644 index 000000000..cf39bc9fe Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/full_connect_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/lock.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/lock.png new file mode 100644 index 000000000..a7463eee0 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/lock.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/trash.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/trash.png new file mode 100644 index 000000000..8805ac133 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/trash.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/new/wifi_selected.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/wifi_selected.png new file mode 100644 index 000000000..18b593b7a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/new/wifi_selected.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/tethering.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/tethering.png new file mode 100644 index 000000000..239a2ce3b Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/tethering.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_full.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_full.png new file mode 100644 index 000000000..8297266f8 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_full.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_low.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_low.png new file mode 100644 index 000000000..93e66dc9e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_low.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_medium.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_medium.png new file mode 100644 index 000000000..e5145cf32 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_medium.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_none.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_none.png new file mode 100644 index 000000000..641c2cd5e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_none.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_slash.png b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_slash.png new file mode 100644 index 000000000..dfb36eba8 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/network/wifi_strength_slash.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/sd_card.png b/iqpilot/selfdrive/assets/icons_mici/settings/sd_card.png new file mode 100644 index 000000000..46c9fae99 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/sd_card.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/software.png b/iqpilot/selfdrive/assets/icons_mici/settings/software.png new file mode 100644 index 000000000..3dfd60589 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/software.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/trips.png b/iqpilot/selfdrive/assets/icons_mici/settings/trips.png new file mode 100644 index 000000000..a3cd01ae2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/trips.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/vehicle.png b/iqpilot/selfdrive/assets/icons_mici/settings/vehicle.png new file mode 100644 index 000000000..7f7fd2721 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/vehicle.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/settings/vertical_scroll_indicator.png b/iqpilot/selfdrive/assets/icons_mici/settings/vertical_scroll_indicator.png new file mode 100644 index 000000000..f0e966354 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/settings/vertical_scroll_indicator.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/back_new.png b/iqpilot/selfdrive/assets/icons_mici/setup/back_new.png new file mode 100644 index 000000000..2c08818fd Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/back_new.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_check.png b/iqpilot/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_check.png new file mode 100644 index 000000000..f6ef2063e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_check.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_question.png b/iqpilot/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_question.png new file mode 100644 index 000000000..c0abb7b14 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/driver_monitoring/dm_question.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/green_button.png b/iqpilot/selfdrive/assets/icons_mici/setup/green_button.png new file mode 100644 index 000000000..6432d23bb Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/green_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/green_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/setup/green_button_pressed.png new file mode 100644 index 000000000..ac85054f6 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/green_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/green_dm.png b/iqpilot/selfdrive/assets/icons_mici/setup/green_dm.png new file mode 100644 index 000000000..863cc1a12 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/green_dm.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/green_info.png b/iqpilot/selfdrive/assets/icons_mici/setup/green_info.png new file mode 100644 index 000000000..fcd53b299 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/green_info.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/medium_button_bg.png b/iqpilot/selfdrive/assets/icons_mici/setup/medium_button_bg.png new file mode 100644 index 000000000..8cbcf2329 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/medium_button_bg.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/medium_button_pressed_bg.png b/iqpilot/selfdrive/assets/icons_mici/setup/medium_button_pressed_bg.png new file mode 100644 index 000000000..905c6c92e Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/medium_button_pressed_bg.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/orange_dm.png b/iqpilot/selfdrive/assets/icons_mici/setup/orange_dm.png new file mode 100644 index 000000000..87ffdaf1f Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/orange_dm.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/red_warning.png b/iqpilot/selfdrive/assets/icons_mici/setup/red_warning.png new file mode 100644 index 000000000..ea712d50f Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/red_warning.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/reset/small_button.png b/iqpilot/selfdrive/assets/icons_mici/setup/reset/small_button.png new file mode 100644 index 000000000..15d1215ef Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/reset/small_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/reset/small_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/setup/reset/small_button_pressed.png new file mode 100644 index 000000000..44cbbd195 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/reset/small_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/reset/wide_button.png b/iqpilot/selfdrive/assets/icons_mici/setup/reset/wide_button.png new file mode 100644 index 000000000..6b0980104 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/reset/wide_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/reset/wide_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/setup/reset/wide_button_pressed.png new file mode 100644 index 000000000..e5d9f4259 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/reset/wide_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/restore.png b/iqpilot/selfdrive/assets/icons_mici/setup/restore.png new file mode 100644 index 000000000..ef840da97 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/restore.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/scroll_down_indicator.png b/iqpilot/selfdrive/assets/icons_mici/setup/scroll_down_indicator.png new file mode 100644 index 000000000..be7ddc41a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/scroll_down_indicator.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_button.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_button.png new file mode 100644 index 000000000..eb9754d50 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_button_disabled.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_button_disabled.png new file mode 100644 index 000000000..d307d5478 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_button_disabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_button_pressed.png new file mode 100644 index 000000000..b31ba01fb Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_red_pill.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_red_pill.png new file mode 100644 index 000000000..e8b38046d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_red_pill.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_red_pill_pressed.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_red_pill_pressed.png new file mode 100644 index 000000000..2e6aca32f Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_red_pill_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_arrow.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_arrow.png new file mode 100644 index 000000000..7c9e6f74c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_arrow.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_bg.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_bg.png new file mode 100644 index 000000000..291dbd607 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_bg.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_bg_larger.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_bg_larger.png new file mode 100644 index 000000000..9a4e96af2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_bg_larger.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_black_rounded_rectangle.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_black_rounded_rectangle.png new file mode 100644 index 000000000..1c7e3b09b Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_black_rounded_rectangle.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_green_rounded_rectangle.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_green_rounded_rectangle.png new file mode 100644 index 000000000..c74e4c8e3 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_green_rounded_rectangle.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_red_circle.png b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_red_circle.png new file mode 100644 index 000000000..cec31dcc8 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/small_slider/slider_red_circle.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button.png b/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button.png new file mode 100644 index 000000000..35293936a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button_disabled.png b/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button_disabled.png new file mode 100644 index 000000000..d10e0fe33 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button_disabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button_pressed.png new file mode 100644 index 000000000..58d24382a Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/smaller_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/warning.png b/iqpilot/selfdrive/assets/icons_mici/setup/warning.png new file mode 100644 index 000000000..0113ceb76 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/warning.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/widish_button.png b/iqpilot/selfdrive/assets/icons_mici/setup/widish_button.png new file mode 100644 index 000000000..ffaecc673 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/widish_button.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/widish_button_disabled.png b/iqpilot/selfdrive/assets/icons_mici/setup/widish_button_disabled.png new file mode 100644 index 000000000..d192accff Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/widish_button_disabled.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/setup/widish_button_pressed.png b/iqpilot/selfdrive/assets/icons_mici/setup/widish_button_pressed.png new file mode 100644 index 000000000..72a4c3181 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/setup/widish_button_pressed.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/speedometer.png b/iqpilot/selfdrive/assets/icons_mici/speedometer.png new file mode 100644 index 000000000..105c8f070 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/speedometer.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/ssh_short.png b/iqpilot/selfdrive/assets/icons_mici/ssh_short.png new file mode 100644 index 000000000..128d8d5a4 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/ssh_short.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/tethering_short.png b/iqpilot/selfdrive/assets/icons_mici/tethering_short.png new file mode 100644 index 000000000..0b905f2f2 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/tethering_short.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/turn_intent_left.png b/iqpilot/selfdrive/assets/icons_mici/turn_intent_left.png new file mode 100644 index 000000000..3815158c9 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/turn_intent_left.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/turn_intent_right.png b/iqpilot/selfdrive/assets/icons_mici/turn_intent_right.png new file mode 100644 index 000000000..0afe64541 Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/turn_intent_right.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/wheel.png b/iqpilot/selfdrive/assets/icons_mici/wheel.png new file mode 100644 index 000000000..c5a0acf2c Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/wheel.png differ diff --git a/iqpilot/selfdrive/assets/icons_mici/wheel_critical.png b/iqpilot/selfdrive/assets/icons_mici/wheel_critical.png new file mode 100644 index 000000000..3c399916d Binary files /dev/null and b/iqpilot/selfdrive/assets/icons_mici/wheel_critical.png differ diff --git a/iqpilot/selfdrive/assets/images/Background.png b/iqpilot/selfdrive/assets/images/Background.png new file mode 100644 index 000000000..8cde2812e Binary files /dev/null and b/iqpilot/selfdrive/assets/images/Background.png differ diff --git a/iqpilot/selfdrive/assets/images/button_continue_triangle.png b/iqpilot/selfdrive/assets/images/button_continue_triangle.png new file mode 100644 index 000000000..eeacfeb83 Binary files /dev/null and b/iqpilot/selfdrive/assets/images/button_continue_triangle.png differ diff --git a/iqpilot/selfdrive/assets/images/button_continue_triangle.svg b/iqpilot/selfdrive/assets/images/button_continue_triangle.svg new file mode 100644 index 000000000..814b36c4b --- /dev/null +++ b/iqpilot/selfdrive/assets/images/button_continue_triangle.svg @@ -0,0 +1,3 @@ + + + diff --git a/iqpilot/selfdrive/assets/images/button_flag.png b/iqpilot/selfdrive/assets/images/button_flag.png new file mode 100644 index 000000000..cac4db6d4 Binary files /dev/null and b/iqpilot/selfdrive/assets/images/button_flag.png differ diff --git a/iqpilot/selfdrive/assets/images/button_home.png b/iqpilot/selfdrive/assets/images/button_home.png new file mode 100644 index 000000000..9f52faf9e Binary files /dev/null and b/iqpilot/selfdrive/assets/images/button_home.png differ diff --git a/iqpilot/selfdrive/assets/images/button_settings.png b/iqpilot/selfdrive/assets/images/button_settings.png new file mode 100644 index 000000000..e04262b88 Binary files /dev/null and b/iqpilot/selfdrive/assets/images/button_settings.png differ diff --git a/iqpilot/selfdrive/assets/images/k3_spinner.png b/iqpilot/selfdrive/assets/images/k3_spinner.png new file mode 100644 index 000000000..e3a67ed22 Binary files /dev/null and b/iqpilot/selfdrive/assets/images/k3_spinner.png differ diff --git a/iqpilot/selfdrive/assets/images/spinner_comma.png b/iqpilot/selfdrive/assets/images/spinner_comma.png new file mode 100644 index 000000000..d9f6543b8 Binary files /dev/null and b/iqpilot/selfdrive/assets/images/spinner_comma.png differ diff --git a/iqpilot/selfdrive/assets/images/spinner_track.png b/iqpilot/selfdrive/assets/images/spinner_track.png new file mode 100644 index 000000000..931c17e83 Binary files /dev/null and b/iqpilot/selfdrive/assets/images/spinner_track.png differ diff --git a/iqpilot/selfdrive/assets/img_minus_arrow_down.png b/iqpilot/selfdrive/assets/img_minus_arrow_down.png new file mode 100644 index 000000000..b41bbe754 Binary files /dev/null and b/iqpilot/selfdrive/assets/img_minus_arrow_down.png differ diff --git a/iqpilot/selfdrive/assets/img_plus_arrow_up.png b/iqpilot/selfdrive/assets/img_plus_arrow_up.png new file mode 100644 index 000000000..0f72f27a0 Binary files /dev/null and b/iqpilot/selfdrive/assets/img_plus_arrow_up.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_arrive.png b/iqpilot/selfdrive/assets/navigation/direction_arrive.png new file mode 100644 index 000000000..733c12909 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_arrive.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_continue_left.png b/iqpilot/selfdrive/assets/navigation/direction_continue_left.png new file mode 100644 index 000000000..9a618026f Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_continue_left.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_continue_right.png b/iqpilot/selfdrive/assets/navigation/direction_continue_right.png new file mode 100644 index 000000000..0fbaa3f25 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_continue_right.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_flag.png b/iqpilot/selfdrive/assets/navigation/direction_flag.png new file mode 100644 index 000000000..bad12ec66 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_flag.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_fork_left.png b/iqpilot/selfdrive/assets/navigation/direction_fork_left.png new file mode 100644 index 000000000..b244b42b5 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_fork_left.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_fork_right.png b/iqpilot/selfdrive/assets/navigation/direction_fork_right.png new file mode 100644 index 000000000..aa3efaabc Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_fork_right.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_merge_left.png b/iqpilot/selfdrive/assets/navigation/direction_merge_left.png new file mode 100644 index 000000000..a713f52c5 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_merge_left.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_merge_right.png b/iqpilot/selfdrive/assets/navigation/direction_merge_right.png new file mode 100644 index 000000000..3390b31a0 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_merge_right.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_off_ramp_left.png b/iqpilot/selfdrive/assets/navigation/direction_off_ramp_left.png new file mode 100644 index 000000000..d3fd18289 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_off_ramp_left.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_off_ramp_right.png b/iqpilot/selfdrive/assets/navigation/direction_off_ramp_right.png new file mode 100644 index 000000000..722e3f808 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_off_ramp_right.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_turn_left.png b/iqpilot/selfdrive/assets/navigation/direction_turn_left.png new file mode 100644 index 000000000..9a618026f Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_turn_left.png differ diff --git a/iqpilot/selfdrive/assets/navigation/direction_turn_right.png b/iqpilot/selfdrive/assets/navigation/direction_turn_right.png new file mode 100644 index 000000000..0fbaa3f25 Binary files /dev/null and b/iqpilot/selfdrive/assets/navigation/direction_turn_right.png differ diff --git a/iqpilot/selfdrive/assets/offroad/fcc.html b/iqpilot/selfdrive/assets/offroad/fcc.html new file mode 100644 index 000000000..960a7a06c --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/fcc.html @@ -0,0 +1,55 @@ + + +

    Supplier's Declaration of Conformity: 47 CFR § 2.1077 Compliance Information

    + +

    Unique Identifier

    +

    comma three

    + +

    Authorized Components

    + +
    Thundersoft TurboX D845 SOM
    +

    FCC ID: 2AOHHTURBOXSOMD845

    + +
    Quectel/EG25-G
    +

    FCC ID: XMR201903EG25G

    +

    This device complies with Part 15 of the FCC Rules.

    +

    Operation is subject to the following two conditions:

    + +

    (1) this device may not cause harmful interference, and

    +

    (2) this device must accept any interference received, including interference that may cause undesired operation.

    + + The following test reports are subject to this declaration: + Test report number: HR20191001605 + Issue date: 2019-2-21 + + The following manufacturer/importer/entity (located in the USA) is responsible for this declaration: + Company name: Quectel Wireless Solutions Co., Ltd. + Name/Title (legal representative): Yin JiXiong + Address: 7th Floor, Hongye Building, No.1801 Hongmei Road, Xuhui District, Shanghai 200233, China + Phone: +8602150086326 Extension: 800 + Fax: +862153253668 + E-mail: johnny.xiang@quectel.com +

    + +

    Responsible Party - U.S. Contact Information

    +

    comma.ai

    +

    501 W Broadway St

    +

    STE A #403

    +

    San Diego, California

    +

    92101

    +

    United States

    +

    support@comma.ai

    + +

    FCC Compliance Statement

    +

    This device complies with part 15 of the FCC Rules. Operation is subject to the following two conditions: (1) This device may not cause harmful interference, and (2) this device must accept any interference received, including interference that may cause undesired operation. Note: This equipment has been tested and found to comply with the limits for a Class B digital device, pursuant to part 15 of the FCC Rules. These limits are designed to provide reasonable protection against harmful interference in a residential installation.

    +

    This equipment generates, uses, and can radiate radio frequency energy and, if not installed and used in accordance with the instructions, may cause harmful interference to radio communications. However, there is no guarantee that interference will not occur in a particular installation.

    +

    If this equipment does cause harmful interference to radio or television reception, which can be determined by turning the equipment off and on, the user is encouraged to try to correct the interference by one or more of the following measures:

    +

    Reorient or relocate the receiving antenna.

    +

    Increase the separation between the equipment and receiver.

    +

    Connect the equipment to an outlet on a circuit different from that to which the receiver is connected.

    +

    Consult the dealer or an experienced radio/TV technician for help.

    +

    Changes or modifications to this product not expressly approved by the party responsible for compliance could void the electromagnetic compatibility (EMC) and wireless compliance and negate your authority to operate the product.

    +

    This product has demonstrated EMC compliance under conditions that included the use of compliant peripheral devices and shielded cables between system components. It is important that you use compliant peripheral devices and shielded cables between system components to reduce the possibility of causing interference to radios, televisions, and other electronic devices.

    +

    The radiated output power of this device meets the limits of FCC/IC radio frequency exposure limits. This device should be operated with a minimum separation distance of 20 cm (8 inches) between the equipment and a person's body.

    + + diff --git a/iqpilot/selfdrive/assets/offroad/icon_home.png b/iqpilot/selfdrive/assets/offroad/icon_home.png new file mode 100644 index 000000000..83ea07b02 Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_home.png differ diff --git a/iqpilot/selfdrive/assets/offroad/icon_home.svg b/iqpilot/selfdrive/assets/offroad/icon_home.svg new file mode 100644 index 000000000..d5a752a41 --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/icon_home.svg @@ -0,0 +1,12 @@ + + + diff --git a/iqpilot/selfdrive/assets/offroad/icon_longitudinal.png b/iqpilot/selfdrive/assets/offroad/icon_longitudinal.png new file mode 100644 index 000000000..a11f3c2f0 Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_longitudinal.png differ diff --git a/iqpilot/selfdrive/assets/offroad/icon_longitudinal.svg b/iqpilot/selfdrive/assets/offroad/icon_longitudinal.svg new file mode 100644 index 000000000..6b03079fd --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/icon_longitudinal.svg @@ -0,0 +1 @@ + diff --git a/iqpilot/selfdrive/assets/offroad/icon_models.png b/iqpilot/selfdrive/assets/offroad/icon_models.png new file mode 100644 index 000000000..e94c3b10c Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_models.png differ diff --git a/iqpilot/selfdrive/assets/offroad/icon_models.svg b/iqpilot/selfdrive/assets/offroad/icon_models.svg new file mode 100644 index 000000000..63c42beef --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/icon_models.svg @@ -0,0 +1 @@ + diff --git a/iqpilot/selfdrive/assets/offroad/icon_software.png b/iqpilot/selfdrive/assets/offroad/icon_software.png new file mode 100644 index 000000000..760a283d6 Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_software.png differ diff --git a/iqpilot/selfdrive/assets/offroad/icon_software.svg b/iqpilot/selfdrive/assets/offroad/icon_software.svg new file mode 100644 index 000000000..519ce068d --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/icon_software.svg @@ -0,0 +1 @@ + diff --git a/iqpilot/selfdrive/assets/offroad/icon_toggle.png b/iqpilot/selfdrive/assets/offroad/icon_toggle.png new file mode 100644 index 000000000..bd9554723 Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_toggle.png differ diff --git a/iqpilot/selfdrive/assets/offroad/icon_toggle.svg b/iqpilot/selfdrive/assets/offroad/icon_toggle.svg new file mode 100644 index 000000000..17642b8b0 --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/icon_toggle.svg @@ -0,0 +1 @@ + diff --git a/iqpilot/selfdrive/assets/offroad/icon_vehicle.png b/iqpilot/selfdrive/assets/offroad/icon_vehicle.png new file mode 100644 index 000000000..d59a7a939 Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_vehicle.png differ diff --git a/iqpilot/selfdrive/assets/offroad/icon_vehicle.svg b/iqpilot/selfdrive/assets/offroad/icon_vehicle.svg new file mode 100644 index 000000000..909713d67 --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/icon_vehicle.svg @@ -0,0 +1 @@ + diff --git a/iqpilot/selfdrive/assets/offroad/icon_visuals.png b/iqpilot/selfdrive/assets/offroad/icon_visuals.png new file mode 100644 index 000000000..b9ee43ad1 Binary files /dev/null and b/iqpilot/selfdrive/assets/offroad/icon_visuals.png differ diff --git a/iqpilot/selfdrive/assets/offroad/icon_visuals.svg b/iqpilot/selfdrive/assets/offroad/icon_visuals.svg new file mode 100644 index 000000000..bcc105998 --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/icon_visuals.svg @@ -0,0 +1 @@ + diff --git a/iqpilot/selfdrive/assets/offroad/mici_fcc.html b/iqpilot/selfdrive/assets/offroad/mici_fcc.html new file mode 100644 index 000000000..e6e418912 --- /dev/null +++ b/iqpilot/selfdrive/assets/offroad/mici_fcc.html @@ -0,0 +1,16 @@ +

    HVIN: comma four

    +

    FCC ID: 2BFC6-MICI

    +

    IC: 32232-MICI

    +

    Contains FCC ID: XMR2023EG916QGL

    +

    Contains IC: 10224A-023EG916QGL

    +

    +This device contains licence-exempt transmitter(s)/receiver(s) that comply with Innovation, Science and Economic Development +Canada's licence-exempt RSS(s) and complies with part 15 of the FCC Rules. Operation is subject to the following two conditions:
    +1. This device may not cause harmful interference.
    +2. This device must accept any interference received, including interference that may cause undesired operation of the device.
    +

    +L'Êmetteur/rÊcepteur exempt de licence contenu dans le prÊsent appareil est conforme aux CNR d'Innovation, Sciences +et DÊveloppement Êconomique Canada applicables aux appareils radio exempts de licence. L'exploitation est autorisÊe +aux deux conditions suivantes :
    +1. L'appareil ne doit pas produire de brouillage.
    +2. L'appareil doit accepter tout brouillage radioÊlectrique subi, mÃĒme si le brouillage est susceptible d'en compromettre
    diff --git a/iqpilot/selfdrive/assets/prep-svg.sh b/iqpilot/selfdrive/assets/prep-svg.sh new file mode 100755 index 000000000..2332cd25c --- /dev/null +++ b/iqpilot/selfdrive/assets/prep-svg.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +ICONS_DIR="$DIR/icons" +BOOTSTRAP_SVG="$DIR/../../third_party/bootstrap/bootstrap-icons.svg" + +ICON_IDS=( + arrow-right + backspace + capslock-fill + shift + shift-fill +) +ICON_FILL_COLOR="#fff" + +# extract bootstrap icons +for id in "${ICON_IDS[@]}"; do + svg="${ICONS_DIR}/${id}.svg" + perl -0777 -ne "print \$& if /]*id=\"$id\"[^>]*>.*?<\/symbol>/s" "$BOOTSTRAP_SVG" \ + | sed "s//<\/svg>/" > "$svg" +done + +# sudo apt install inkscape + +for svg in $(find $DIR -type f | grep svg$); do + bunx svgo $svg --multipass --pretty --indent 2 + + # convert to PNG + png="${svg%.svg}.png" + width=$(inkscape --query-width "$svg") + height=$(inkscape --query-height "$svg") + if (( $(echo "$width > $height" | bc -l) )); then + export_dim="--export-width=512" + else + export_dim="--export-height=512" + fi + inkscape "$svg" --export-filename="$png" "$export_dim" + + optipng -o7 -strip all "$png" +done + +# cleanup bootstrap SVGs +for id in "${ICON_IDS[@]}"; do + rm "${ICONS_DIR}/${id}.svg" +done diff --git a/iqpilot/selfdrive/assets/sounds/disengage.wav b/iqpilot/selfdrive/assets/sounds/disengage.wav new file mode 100644 index 000000000..1e49e1b72 Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/disengage.wav differ diff --git a/iqpilot/selfdrive/assets/sounds/engage.wav b/iqpilot/selfdrive/assets/sounds/engage.wav new file mode 100644 index 000000000..e6befed16 Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/engage.wav differ diff --git a/iqpilot/selfdrive/assets/sounds/prompt.wav b/iqpilot/selfdrive/assets/sounds/prompt.wav new file mode 100644 index 000000000..1ae77051e Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/prompt.wav differ diff --git a/iqpilot/selfdrive/assets/sounds/prompt_distracted.wav b/iqpilot/selfdrive/assets/sounds/prompt_distracted.wav new file mode 100644 index 000000000..c3d4475ca Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/prompt_distracted.wav differ diff --git a/iqpilot/selfdrive/assets/sounds/prompt_single_high.wav b/iqpilot/selfdrive/assets/sounds/prompt_single_high.wav new file mode 100644 index 000000000..f77c87bd6 Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/prompt_single_high.wav differ diff --git a/iqpilot/selfdrive/assets/sounds/prompt_single_low.wav b/iqpilot/selfdrive/assets/sounds/prompt_single_low.wav new file mode 100644 index 000000000..4557df7e5 Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/prompt_single_low.wav differ diff --git a/iqpilot/selfdrive/assets/sounds/refuse.wav b/iqpilot/selfdrive/assets/sounds/refuse.wav new file mode 100644 index 000000000..0e80f7d12 Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/refuse.wav differ diff --git a/iqpilot/selfdrive/assets/sounds/warning_immediate.wav b/iqpilot/selfdrive/assets/sounds/warning_immediate.wav new file mode 100644 index 000000000..b1815a958 Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/warning_immediate.wav differ diff --git a/iqpilot/selfdrive/assets/sounds/warning_soft.wav b/iqpilot/selfdrive/assets/sounds/warning_soft.wav new file mode 100644 index 000000000..261c7e137 Binary files /dev/null and b/iqpilot/selfdrive/assets/sounds/warning_soft.wav differ diff --git a/iqpilot/selfdrive/car/CARS_template.md b/iqpilot/selfdrive/car/CARS_template.md new file mode 100644 index 000000000..cd352b2ed --- /dev/null +++ b/iqpilot/selfdrive/car/CARS_template.md @@ -0,0 +1,74 @@ +{% set footnote_tag = '[{}](#footnotes)' %} +{% set star_icon = '[![star](assets/icon-star-{}.svg)](##)' %} +{% set video_icon = '' %} +{# Force hardware column wider by using a blank image with max width. #} +{% set width_tag = '%s
     ' %} +{% set hardware_col_name = 'Hardware Needed' %} +{% set wide_hardware_col_name = width_tag|format(hardware_col_name) -%} + + + +# Supported Cars + +A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. + +# {{all_car_docs | selectattr('support_type', 'eq', SupportType.UPSTREAM) | list | length}} Supported Cars + +|{{Column | map(attribute='value') | join('|') | replace(hardware_col_name, wide_hardware_col_name)}}| +|---|---|---|{% for _ in range((Column | length) - 3) %}{{':---:|'}}{% endfor +%} +{% for car_docs in all_car_docs | selectattr('support_type', 'eq', SupportType.UPSTREAM) %} +|{% for column in Column %}{{car_docs.get_column(column, star_icon, video_icon, footnote_tag)}}|{% endfor %} + +{% endfor %} + +### Footnotes +{% for footnote in footnotes %} +{{loop.index}}{{footnote | replace('
    ', '')}}
    +{% endfor %} + +## Community Maintained Cars +Although they're not upstream, the community has openpilot running on other makes and models. See the 'Community Supported Models' section of each make [on our wiki](https://wiki.comma.ai/). + +# Don't see your car here? + +**openpilot can support many more cars than it currently does.** There are a few reasons your car may not be supported. +If your car doesn't fit into any of the incompatibility criteria here, then there's a good chance it can be supported! We're adding support for new cars all the time. **We don't have a roadmap for car support**, and in fact, most car support comes from users like you! + +### Which cars are able to be supported? + +openpilot uses the existing steering, gas, and brake interfaces in your car. If your car lacks any one of these interfaces, openpilot will not be able to control the car. If your car has [ACC](https://en.wikipedia.org/wiki/Adaptive_cruise_control) and any form of [LKAS](https://en.wikipedia.org/wiki/Automated_Lane_Keeping_Systems)/[LCA](https://en.wikipedia.org/wiki/Lane_centering), then it almost certainly has these interfaces. These features generally started shipping on cars around 2016. Note that manufacturers will often make their own [marketing terms](https://en.wikipedia.org/wiki/Adaptive_cruise_control#Vehicle_models_supporting_adaptive_cruise_control) for these features, such as Hyundai's "Smart Cruise Control" branding of Adaptive Cruise Control. + +If your car has the following packages or features, then it's a good candidate for support. + +| Make | Required Package/Features | +| ---- | ------------------------- | +| Acura | Any car with AcuraWatch will work. AcuraWatch comes standard on many newer models. | +| Ford | Any car with Lane Centering will likely work. | +| Honda | Any car with Honda Sensing will work. Honda Sensing comes standard on many newer models. | +| Subaru | Any car with EyeSight will work. EyeSight comes standard on many newer models. | +| Nissan | Any car with ProPILOT will likely work. | +| Toyota & Lexus | Any car that has Toyota/Lexus Safety Sense with "Lane Departure Alert with Steering Assist (LDA w/SA)" and/or "Lane Tracing Assist (LTA)" will work. Note that LDA without Steering Assist will not work. These features come standard on most newer models. | +| Hyundai, Kia, & Genesis | Any car with Smart Cruise Control (SCC) and Lane Following Assist (LFA) or Lane Keeping Assist (LKAS) will work. LKAS/LFA comes standard on most newer models. Any form of SCC will work, such as NSCC. | +| Chrysler, Jeep, & Ram | Any car with LaneSense and Adaptive Cruise Control will likely work. These come standard on many newer models. | + +### FlexRay + +All the cars that openpilot supports use a [CAN bus](https://en.wikipedia.org/wiki/CAN_bus) for communication between all the car's computers, however a CAN bus isn't the only way that the computers in your car can communicate. Most, if not all, vehicles from the following manufacturers use [FlexRay](https://en.wikipedia.org/wiki/FlexRay) instead of a CAN bus: **BMW, Mercedes, Audi, Land Rover, and some Volvo**. These cars may one day be supported, but we have no immediate plans to support FlexRay. + +### Toyota Security + +openpilot does not yet support these Toyota models due to a new message authentication method. +[Vote](https://comma.ai/shop#toyota-security) if you'd like to see openpilot support on these models. + +* Toyota RAV4 Prime 2021+ +* Toyota Sienna 2021+ +* Toyota Venza 2021+ +* Toyota Sequoia 2023+ +* Toyota Tundra 2022+ +* Toyota Highlander 2024+ +* Toyota Corolla Cross 2022+ (only US model) +* Toyota Camry 2025+ +* Lexus NX 2022+ +* Toyota bZ4x 2023+ +* Subaru Solterra 2023+ + diff --git a/iqpilot/selfdrive/car/__init__.py b/iqpilot/selfdrive/car/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/car/car_specific.py b/iqpilot/selfdrive/car/car_specific.py new file mode 100644 index 000000000..78816d608 --- /dev/null +++ b/iqpilot/selfdrive/car/car_specific.py @@ -0,0 +1,189 @@ +from iqpilot.cereal import car, log +from iqdbc.car import DT_CTRL, structs +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.interfaces import MAX_CTRL_SPEED +from iqdbc.car.toyota.values import ToyotaFlags + +from iqpilot.selfdrive.selfdrived.events import Events + +ButtonType = structs.CarState.ButtonEvent.Type +GearShifter = structs.CarState.GearShifter +EventName = log.OnroadEvent.EventName +NetworkLocation = structs.CarParams.NetworkLocation + + +class CarSpecificEvents: + def __init__(self, CP: structs.CarParams): + self.CP = CP + + self.steering_unpressed = 0 + self.low_speed_alert = False + self.no_steer_warning = False + self.silent_steer_warning = True + + def update(self, CS: car.CarState, CS_prev: car.CarState, CC: car.CarControl): + if self.CP.brand in ('body', 'mock'): + return Events() + + events = self.create_common_events(CS, CS_prev) + + if self.CP.brand == 'chrysler': + # Low speed steer alert hysteresis logic + if self.CP.minSteerSpeed > 0. and CS.vEgo < (self.CP.minSteerSpeed + 0.5): + self.low_speed_alert = True + elif CS.vEgo > (self.CP.minSteerSpeed + 1.): + self.low_speed_alert = False + if self.low_speed_alert: + events.add(EventName.belowSteerSpeed) + + elif self.CP.brand == 'honda': + if self.CP.pcmCruise and CS.vEgo < self.CP.minEnableSpeed: + events.add(EventName.belowEngageSpeed) + + if self.CP.pcmCruise: + # we engage when pcm is active (rising edge) + if CS.cruiseState.enabled and not CS_prev.cruiseState.enabled: + events.add(EventName.pcmEnable) + elif not CS.cruiseState.enabled and (CC.actuators.accel >= 0. or not self.CP.openpilotLongitudinalControl): + # it can happen that car cruise disables while comma system is enabled: need to + # keep braking if needed or if the speed is very low + if CS.vEgo < self.CP.minEnableSpeed + 2.: + # non loud alert if cruise disables below 25mph as expected (+ a little margin) + events.add(EventName.speedTooLow) + else: + events.add(EventName.cruiseDisabled) + if self.CP.minEnableSpeed > 0 and CS.vEgo < 0.001: + events.add(EventName.manualRestart) + + elif self.CP.brand == 'toyota': + # TODO: when we check for unexpected disengagement, check gear not S1, S2, S3 + if self.CP.openpilotLongitudinalControl: + # Only can leave standstill when planner wants to move + if CS.cruiseState.standstill and not CS.brakePressed and (CC.cruiseControl.resume or self.CP.flags & ToyotaFlags.HYBRID.value): + events.add(EventName.resumeRequired) + if CS.vEgo < self.CP.minEnableSpeed: + events.add(EventName.belowEngageSpeed) + if CC.actuators.accel > 0.3: + # some margin on the actuator to not false trigger cancellation while stopping + events.add(EventName.speedTooLow) + if CS.vEgo < 0.001: + # while in standstill, send a user alert + events.add(EventName.manualRestart) + + elif self.CP.brand == 'gm': + # Enabling at a standstill with brake is allowed + # TODO: verify 17 Volt can enable for the first time at a stop and allow for all GMs + if CS.vEgo < self.CP.minEnableSpeed and not (CS.standstill and CS.brake >= 20 and + self.CP.networkLocation == NetworkLocation.fwdCamera): + events.add(EventName.belowEngageSpeed) + if CS.cruiseState.standstill: + events.add(EventName.resumeRequired) + + elif self.CP.brand == 'volkswagen': + if self.CP.openpilotLongitudinalControl: + if CS.vEgo < self.CP.minEnableSpeed + 0.5: + events.add(EventName.belowEngageSpeed) + if CC.enabled and CS.vEgo < self.CP.minEnableSpeed: + events.add(EventName.speedTooLow) + + # TODO: this needs to be implemented generically in carState struct + # if CC.eps_timer_soft_disable_alert: + # events.add(EventName.steerTimeLimit) + + return events + + def create_common_events(self, CS: structs.CarState, CS_prev: car.CarState): + events = Events() + + CI = interfaces[self.CP.carFingerprint] + # TODO: cleanup the honda-specific logic + pcm_enable = self.CP.pcmCruise and self.CP.brand != 'honda' + # TODO: on some hyundai cars, the cancel button is also the pause/resume button, + # so only use it for cancel when running openpilot longitudinal + allow_button_cancel = self.CP.brand != 'hyundai' + + if CS.doorOpen: + events.add(EventName.doorOpen) + if CS.seatbeltUnlatched: + events.add(EventName.seatbeltNotLatched) + if CS.gearShifter != GearShifter.drive and CS.gearShifter not in CI.DRIVABLE_GEARS: + events.add(EventName.wrongGear) + if CS.gearShifter == GearShifter.reverse: + events.add(EventName.reverseGear) + if not CS.cruiseState.available and not getattr(CS, 'cruiseFaultLateralMode', False): + events.add(EventName.wrongCarMode) + if CS.espDisabled: + events.add(EventName.espDisabled) + if CS.espActive: + events.add(EventName.espActive) + if CS.stockFcw: + events.add(EventName.stockFcw) + if CS.stockAeb: + events.add(EventName.stockAeb) + if CS.stockLkas: + events.add(EventName.stockLkas) + if CS.vEgo > MAX_CTRL_SPEED: + events.add(EventName.speedTooHigh) + if CS.cruiseState.nonAdaptive: + events.add(EventName.wrongCruiseMode) + if CS.brakeHoldActive and self.CP.openpilotLongitudinalControl: + events.add(EventName.brakeHold) + if CS.parkingBrake: + events.add(EventName.parkBrake) + if getattr(CS, 'cruiseFaultLateralMode', False): + events.add(EventName.cruiseFaultLateralAllowed) + elif CS.accFaulted: + events.add(EventName.accFaulted) + if CS.steeringPressed: + events.add(EventName.steerOverride) + if CS.steeringDisengage and not CS_prev.steeringDisengage: + events.add(EventName.steerDisengage) + if CS.brakePressed and CS.standstill: + events.add(EventName.preEnableStandstill) + if CS.gasPressed: + events.add(EventName.gasPressedOverride) + if CS.vehicleSensorsInvalid: + events.add(EventName.vehicleSensorsInvalid) + if CS.invalidLkasSetting: + events.add(EventName.invalidLkasSetting) + if CS.lowSpeedAlert: + events.add(EventName.belowSteerSpeed) + if CS.buttonEnable: + events.add(EventName.buttonEnable) + + # Handle cancel button presses + for b in CS.buttonEvents: + # Disable on rising and falling edge of cancel for both stock and OP long + # TODO: only check the cancel button with openpilot longitudinal on all brands to match panda safety + if b.type == ButtonType.cancel and (allow_button_cancel or not self.CP.pcmCruise): + events.add(EventName.buttonCancel) + + # Handle permanent and temporary steering faults + self.steering_unpressed = 0 if CS.steeringPressed else self.steering_unpressed + 1 + if CS.steerFaultTemporary: + if CS.steeringPressed and (not CS_prev.steerFaultTemporary or self.no_steer_warning): + self.no_steer_warning = True + else: + self.no_steer_warning = False + + # if the user overrode recently, show a less harsh alert + if self.silent_steer_warning or CS.standstill or self.steering_unpressed < int(1.5 / DT_CTRL): + self.silent_steer_warning = True + events.add(EventName.steerTempUnavailableSilent) + else: + events.add(EventName.steerTempUnavailable) + else: + self.no_steer_warning = False + self.silent_steer_warning = False + if CS.steerFaultPermanent: + events.add(EventName.steerUnavailable) + + # we engage when pcm is active (rising edge) + # enabling can optionally be blocked by the car interface + if pcm_enable: + if CS.cruiseState.enabled and not CS_prev.cruiseState.enabled and not CS.blockPcmEnable: + events.add(EventName.pcmEnable) + elif not CS.cruiseState.enabled and not getattr(CS, 'cruiseFaultLateralMode', False): + events.add(EventName.pcmDisable) + + return events diff --git a/iqpilot/selfdrive/car/card.py b/iqpilot/selfdrive/car/card.py new file mode 100755 index 000000000..69c083b44 --- /dev/null +++ b/iqpilot/selfdrive/car/card.py @@ -0,0 +1,585 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import json +import math +import os +import time +import threading + +import iqpilot.cereal.messaging as messaging + +from iqpilot.cereal import car, log, custom + +from iqpilot.common.iq_perf import PerfSample, PerfTraceEmitter, PerfTraceRing +from iqpilot.common.params import Params, UnknownKeyName +from iqpilot.common.realtime import config_background_thread, config_realtime_process, lock_memory, Priority, Ratekeeper +from iqpilot.common.swaglog import cloudlog, ForwardingHandler + +from iqdbc.car import DT_CTRL, structs +from iqdbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable +from iqdbc.car.carlog import carlog +from iqdbc.car.fw_versions import ObdCallback +from iqdbc.car.car_helpers import get_car, interfaces +from iqdbc.car.interfaces import CarInterfaceBase, RadarInterfaceBase +from iqpilot.selfdrive.pandad import can_capnp_to_list, can_list_to_can_capnp +from iqpilot.selfdrive.car.cruise import VCruiseHelper +from iqpilot.selfdrive.car.helpers import convert_iq_car_control_compact, convert_to_capnp + +from iqpilot.sab.behavior import apply_aol_experience_flags, apply_aol_brand_overrides +from iqpilot.selfdrive.car import interfaces as iqpilot_interfaces + +REPLAY = "REPLAY" in os.environ + +EventName = log.OnroadEvent.EventName +CARD_FLAG_FALLBACK_ACTIVE = 1 << 0 +CARD_FLAG_CARSTATE_ALIVE = 1 << 1 +CARD_FLAG_SENDCAN_GAP = 1 << 2 +CARD_SENDCAN_GAP_WARN_US = 20_000 +CARD_SENDCAN_GAP_ERROR_US = 60_000 + +# forward +carlog.addHandler(ForwardingHandler(cloudlog)) + + +def obd_callback(params: Params) -> ObdCallback: + def set_obd_multiplexing(obd_multiplexing: bool): + if params.get_bool("ObdMultiplexingEnabled") != obd_multiplexing: + cloudlog.warning(f"Setting OBD multiplexing to {obd_multiplexing}") + params.remove("ObdMultiplexingChanged") + params.put_bool("ObdMultiplexingEnabled", obd_multiplexing) + params.get_bool("ObdMultiplexingChanged", block=True) + cloudlog.warning("OBD multiplexing set successfully") + return set_obd_multiplexing + + +def can_comm_callbacks(logcan: messaging.SubSocket, sendcan: messaging.PubSocket) -> tuple[CanRecvCallable, CanSendCallable]: + def can_recv(wait_for_one: bool = False) -> list[list[CanData]]: + """ + wait_for_one: wait the normal logcan socket timeout for a CAN packet, may return empty list if nothing comes + + Returns: CAN packets comprised of CanData objects for easy access + """ + ret = [] + for can in messaging.drain_sock(logcan, wait_for_one=wait_for_one): + ret.append([CanData(msg.address, msg.dat, msg.src) for msg in can.can]) + return ret + + def can_send(msgs: list[CanData]) -> None: + sendcan.send(can_list_to_can_capnp(msgs, msgtype='sendcan')) + + return can_recv, can_send + + +def run_optional_pre_init(CI: CarInterfaceBase, CP: structs.CarParams, CP_IQ: structs.IQCarParams, + can_callbacks: tuple[CanRecvCallable, CanSendCallable]) -> None: + pre_init = getattr(CI, "pre_init", None) + if callable(pre_init): + pre_init(CP, CP_IQ, *can_callbacks) + + +class Car: + CI: CarInterfaceBase + RI: RadarInterfaceBase + CP: car.CarParams + CP_IQ: structs.IQCarParams + CP_IQ_capnp: custom.IQCarParams + + def __init__(self, CI=None, RI=None) -> None: + self.can_sock = messaging.sub_sock('can', timeout=20) + self.sm = messaging.SubMaster(['pandaStates', 'carControl', 'onroadEvents', 'testJoystick', 'modelV2'] + ['iqCarControl', 'iqPlan']) + self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams', 'carOutput', 'radarTracks', 'iqPerfTrace'] + ['iqCarParams', 'iqCarState']) + + self.can_rcv_cum_timeout_counter = 0 + + self.CC_prev = car.CarControl.new_message() + self.CS_prev = car.CarState.new_message() + self.CS_IQ_prev = custom.IQCarState.new_message() + self.initialized_prev = False + + self.last_actuators_output = structs.CarControl.Actuators() + + self.params = Params() + self.joystick_buttons_prev = [False, False] + self.joystick_debug_mode = self.params.get_bool("JoystickDebugMode") + + self.can_callbacks = can_comm_callbacks(self.can_sock, self.pm.sock['sendcan']) + + is_release = self.params.get_bool("IsReleaseBranch") + is_release_iq = self.params.get_bool("IsReleaseIqBranch") + + if CI is None: + # wait for one pandaState and one CAN packet + print("Waiting for CAN messages...") + while True: + can = messaging.recv_one_retry(self.can_sock) + if len(can.can) > 0: + break + + alpha_long_allowed = self.params.get_bool("AlphaLongitudinalEnabled") + num_pandas = len(messaging.recv_one_retry(self.sm.sock['pandaStates']).pandaStates) + + cached_params = None + cached_params_raw = self.params.get("CarParamsCache") + if cached_params_raw is not None: + with car.CarParams.from_bytes(cached_params_raw) as _cached_params: + cached_params = _cached_params + + fixed_fingerprint = (self.params.get("CarPlatformBundle") or {}).get("platform", None) + init_params_list_iq = iqpilot_interfaces.initialize_params(self.params) + + self.CI = get_car(*self.can_callbacks, obd_callback(self.params), alpha_long_allowed, is_release, num_pandas, cached_params, + fixed_fingerprint, init_params_list_iq, is_release_iq) + iqpilot_interfaces.apply_iq_car_config(self.CI, self.params) + self.RI = interfaces[self.CI.CP.carFingerprint].RadarInterface(self.CI.CP, self.CI.CP_IQ) + self.CP = self.CI.CP + self.CP_IQ = self.CI.CP_IQ + + # continue onto next fingerprinting step in pandad + self.params.put_bool("FirmwareQueryDone", True) + else: + self.CI, self.CP, self.CP_IQ = CI, CI.CP, CI.CP_IQ + self.RI = RI + + self.CP.alternativeExperience = 0 + # Steering assistance behavior flags + apply_aol_experience_flags(self.CP, self.CP_IQ, self.params) + apply_aol_brand_overrides(self.CP, self.CP_IQ, self.params) + + # IQ.Dynamic control mode + self.iq_dynamic_mode = self.params.get_bool("IQDynamicMode") + + openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle") + run_optional_pre_init(self.CI, self.CP, self.CP_IQ, self.can_callbacks) + controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly + self.CP.passive = not controller_available or self.CP.dashcamOnly + if self.CP.passive: + safety_config = structs.CarParams.SafetyConfig() + safety_config.safetyModel = structs.CarParams.SafetyModel.noOutput + self.CP.safetyConfigs = [safety_config] + + if self.CP.secOcRequired: + # Copy user key if available + try: + with open("/cache/params/SecOCKey") as f: + user_key = f.readline().strip() + if len(user_key) == 32: + self.params.put("SecOCKey", user_key) + except Exception: + pass + + secoc_key = self.params.get("SecOCKey") + if secoc_key is not None: + saved_secoc_key = bytes.fromhex(secoc_key.strip()) + if len(saved_secoc_key) == 16: + self.CP.secOcKeyAvailable = True + self.CI.CS.secoc_key = saved_secoc_key + if controller_available: + self.CI.CC.secoc_key = saved_secoc_key + else: + cloudlog.warning("Saved SecOC key is invalid") + + if controller_available: + self._seed_learned_factors() + + # Write previous route's CarParams + prev_cp = self.params.get("CarParamsPersistent") + if prev_cp is not None: + self.params.put("CarParamsPrevRoute", prev_cp) + + # Write CarParams for controls and radard + cp_bytes = self.CP.to_bytes() + self.params.put("CarParams", cp_bytes) + self.params.put_nonblocking("CarParamsCache", cp_bytes) + self.params.put_nonblocking("CarParamsPersistent", cp_bytes) + + self.CP_IQ_capnp = convert_to_capnp(self.CP_IQ) + cp_IQ_bytes = self.CP_IQ_capnp.to_bytes() + self.params.put("IQCarParams", cp_IQ_bytes) + self.params.put_nonblocking("IQCarParamsCache", cp_IQ_bytes) + # V2 key: the IQCarParams schema was renumbered, so pre-update persisted bytes + # must never be decoded with the new schema. The old key is left to age out. + self.params.put_nonblocking("IQCarParamsPersistentV2", cp_IQ_bytes) + + self.v_cruise_helper = VCruiseHelper(self.CP, self.CP_IQ) + self._needs_iq_lead_data = self.CP.brand == "hyundai" + self.carcontrol_stale_frames = max(1, int(round(0.06 / DT_CTRL))) + self._perf = PerfTraceEmitter("card", pubmaster=self.pm) + self._perf_ring = PerfTraceRing() + self._last_sendcan_mono_ns: int | None = None + self._lag_initialized = False + + self.is_metric = self.params.get_bool("IsMetric") + self.experimental_mode = self.params.get_bool("ExperimentalMode") + + # card is driven by can recv, expected at 100Hz + self.rk = Ratekeeper(100, print_delay_threshold=None) + + # log fingerprint in sentry + iqpilot_interfaces.log_fingerprint(self.CP) + + def state_update(self) -> tuple[car.CarState, custom.IQCarState, structs.RadarDataT | None]: + """carState update loop, driven by can""" + + can_strs = messaging.drain_sock_raw(self.can_sock, wait_for_one=True) + can_list = can_capnp_to_list(can_strs) + + # Update carState from CAN + CS, CS_IQ = self.CI.update(can_list) + CS_IQ = convert_to_capnp(CS_IQ) + + # Update radar tracks from CAN + RD: structs.RadarDataT | None = self.RI.update(can_list) + + self.sm.update(0) + self.inject_joystick_buttons(CS) + + can_rcv_valid = len(can_strs) > 0 + + # Check for CAN timeout + if not can_rcv_valid: + self.can_rcv_cum_timeout_counter += 1 + + if can_rcv_valid and REPLAY: + self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime + + if self.sm.updated['iqPlan']: + self.v_cruise_helper.update_speed_limit_assist(self.is_metric, self.sm['iqPlan']) + + if self.v_cruise_helper.volkswagen_standby_set_speed and CS.cruiseState.available and not self.v_cruise_helper.v_cruise_initialized: + self.v_cruise_helper.initialize_v_cruise(CS, self.experimental_mode, self.iq_dynamic_mode) + + self.v_cruise_helper.update_v_cruise(CS, self.sm['carControl'].enabled, self.is_metric) + if self.sm['carControl'].enabled and not self.CC_prev.enabled: + # Use CarState w/ buttons from the step selfdrived enables on + self.v_cruise_helper.initialize_v_cruise(self.CS_prev, self.experimental_mode, self.iq_dynamic_mode) + + # TODO: mirror the carState.cruiseState struct? + CS.vCruise = float(self.v_cruise_helper.v_cruise_kph) + CS.vCruiseCluster = float(self.v_cruise_helper.v_cruise_cluster_kph) + CS_IQ.slcSetSpeedRequestId = self.v_cruise_helper.slc_set_speed_request_id + CS_IQ.slcSetSpeedGestureId = self.v_cruise_helper.slc_set_speed_gesture_id + CS_IQ.slcSetSpeedRequestKph = self.v_cruise_helper.slc_set_speed_request_kph + + return CS, CS_IQ, RD + + def _learned_factor_attrs(self): + if self.CI.CC is None: + return () + return tuple(attr for attr in ("gasfactor", "windfactor") if hasattr(self.CI.CC, attr)) + + def _stored_learned_factors(self) -> dict: + # JSON-typed params come back already parsed from params_pyx; only the pure-python fallback + # returns raw bytes + stored = self.params.get("IQLongLearnedFactors") + if isinstance(stored, bytes | str): + try: + stored = json.loads(stored) + except ValueError: + stored = None + return stored if isinstance(stored, dict) else {} + + def _seed_learned_factors(self): + attrs = self._learned_factor_attrs() + if not attrs: + return + factors = self._stored_learned_factors().get(str(self.CP.carFingerprint), {}) + for attr in attrs: + value = factors.get(attr) + if isinstance(value, int | float) and math.isfinite(value): + setattr(self.CI.CC, attr, float(value)) + + def _save_learned_factors(self): + attrs = self._learned_factor_attrs() + if not attrs: + return + stored = self._stored_learned_factors() + stored[str(self.CP.carFingerprint)] = {attr: float(getattr(self.CI.CC, attr)) for attr in attrs} + # JSON-typed params take the dict itself; params_pyx serializes and rejects pre-dumped strings + self.params.put_nonblocking("IQLongLearnedFactors", stored) + + def state_publish(self, CS: car.CarState, CS_IQ: custom.IQCarState, RD: structs.RadarDataT | None): + """carState and carParams publish loop""" + + # persist live-learned longitudinal factors so they survive across drives; card authors the + # car's CAN stream, so a persistence failure must never take it down mid-drive + if self.sm.frame > 0 and self.sm.frame % int(60. / DT_CTRL) == 0: + try: + self._save_learned_factors() + except Exception: + cloudlog.exception("failed to persist learned longitudinal factors") + + # carParams - logged every 50 seconds (> 1 per segment) + if self.sm.frame % int(50. / DT_CTRL) == 0: + cp_send = messaging.new_message('carParams') + cp_send.valid = True + cp_send.carParams = self.CP + self.pm.send('carParams', cp_send) + + # publish new carOutput + co_send = messaging.new_message('carOutput') + co_send.valid = self.sm.all_checks(['carControl']) + co_send.carOutput.actuatorsOutput = self.last_actuators_output + self.pm.send('carOutput', co_send) + + # kick off controlsd step while we actuate the latest carControl packet + cs_send = messaging.new_message('carState') + cs_send.valid = CS.canValid + cs_send.carState = CS + cs_send.carState.canErrorCounter = self.can_rcv_cum_timeout_counter + cs_send.carState.cumLagMs = self.rk.lag * 1000. if self._lag_initialized else 0. + self.pm.send('carState', cs_send) + + if RD is not None: + tracks_msg = messaging.new_message('radarTracks') + tracks_msg.valid = not any(RD.errors.to_dict().values()) + tracks_msg.radarTracks = RD + self.pm.send('radarTracks', tracks_msg) + + # iqCarParams - logged every 50 seconds (> 1 per segment) + if self.sm.frame % int(50. / DT_CTRL) == 0: + iq_cp_send = messaging.new_message('iqCarParams') + iq_cp_send.valid = True + iq_cp_send.iqCarParams = self.CP_IQ_capnp + self.pm.send('iqCarParams', iq_cp_send) + + iq_cs_send = messaging.new_message('iqCarState') + iq_cs_send.valid = CS.canValid + iq_cs_send.iqCarState = CS_IQ + self.pm.send('iqCarState', iq_cs_send) + + def controls_update(self, CS: car.CarState, CC: car.CarControl, CC_IQ: custom.IQCarControl): + """control update loop, driven by carControl""" + + if not self.initialized_prev: + # Initialize CarInterface, once controls are ready + # TODO: this can make us miss at least a few cycles when doing an ECU knockout + self.CI.init(self.CP, self.CP_IQ, *self.can_callbacks) + # signal pandad to switch to car safety mode + self.params.put_bool_nonblocking("ControlsReady", True) + + stale_frames = max(0, self.sm.frame - self.sm.recv_frame['carControl']) + stale_carcontrol_us = int(round(stale_frames * DT_CTRL * 1_000_000)) + carstate_alive = bool(CS.canValid) + fallback_active = False + + if self.sm.all_alive(['carControl']): + # send car controls over can + now_nanos = self.can_log_mono_time if REPLAY else int(time.monotonic() * 1e9) + started = time.monotonic_ns() + cc_iq = convert_iq_car_control_compact(CC_IQ, include_leads=self._needs_iq_lead_data) + convert_us = (time.monotonic_ns() - started) // 1000 + + model = self.sm['modelV2'] if self.sm.valid['modelV2'] else None + started = time.monotonic_ns() + self.last_actuators_output, can_sends = self.CI.apply(CC, cc_iq, now_nanos, model) + apply_us = (time.monotonic_ns() - started) // 1000 + + started = time.monotonic_ns() + self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=CS.canValid)) + sendcan_us = (time.monotonic_ns() - started) // 1000 + + self.CC_prev = CC + else: + convert_us = 0 + apply_us = 0 + sendcan_us = 0 + if stale_frames >= self.carcontrol_stale_frames: + fallback_active = True + fallback_cc = CC.as_builder() + fallback_cc.enabled = False + fallback_cc.latActive = False + fallback_cc.longActive = False + fallback_cc.leftBlinker = False + fallback_cc.rightBlinker = False + fallback_cc.cruiseControl.cancel = bool(CS.cruiseState.enabled or self.CC_prev.enabled or self.CC_prev.longActive) + fallback_cc.cruiseControl.resume = False + fallback_cc.cruiseControl.override = False + fallback_cc.actuators.torque = 0.0 + fallback_cc.actuators.steeringAngleDeg = float(getattr(CS, 'steeringAngleDeg', 0.0)) + fallback_cc.actuators.curvature = 0.0 + fallback_cc.actuators.accel = 0.0 + fallback_cc.actuators.longControlState = car.CarControl.Actuators.LongControlState.off + + fallback_cc_iq = custom.IQCarControl.new_message() + + now_nanos = self.can_log_mono_time if REPLAY else int(time.monotonic() * 1e9) + started = time.monotonic_ns() + cc_iq = convert_iq_car_control_compact(fallback_cc_iq, include_leads=self._needs_iq_lead_data) + convert_us = (time.monotonic_ns() - started) // 1000 + + started = time.monotonic_ns() + self.last_actuators_output, can_sends = self.CI.apply(fallback_cc.as_reader(), cc_iq, now_nanos) + apply_us = (time.monotonic_ns() - started) // 1000 + + started = time.monotonic_ns() + self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=CS.canValid)) + sendcan_us = (time.monotonic_ns() - started) // 1000 + + now_ns = time.monotonic_ns() + sendcan_gap_us = 0 + if sendcan_us > 0: + if self._last_sendcan_mono_ns is not None: + sendcan_gap_us = max(0, (now_ns - self._last_sendcan_mono_ns) // 1000) + self._last_sendcan_mono_ns = now_ns + + flags = 0 + if fallback_active: + flags |= CARD_FLAG_FALLBACK_ACTIVE + if carstate_alive: + flags |= CARD_FLAG_CARSTATE_ALIVE + if sendcan_gap_us >= CARD_SENDCAN_GAP_WARN_US: + flags |= CARD_FLAG_SENDCAN_GAP + + sample = PerfSample( + frame_id=self.sm.frame, + stale_carcontrol_us=stale_carcontrol_us, + stale_carcontrol_frames=stale_frames, + sendcan_gap_us=int(sendcan_gap_us), + publish_us=int(convert_us), + state_control_us=int(apply_us), + tail_work_us=int(sendcan_us), + flags=flags, + ) + self._perf_ring.push(sample) + + if stale_carcontrol_us >= 20_000 or fallback_active or sendcan_gap_us >= CARD_SENDCAN_GAP_WARN_US: + severity = "warning" + if stale_carcontrol_us >= 60_000 or sendcan_gap_us >= CARD_SENDCAN_GAP_ERROR_US: + severity = "error" + detail = ( + f"stale_carcontrol_us={stale_carcontrol_us} stale_frames={stale_frames} " + f"convert_us={convert_us} apply_us={apply_us} sendcan_us={sendcan_us} " + f"sendcan_gap_us={sendcan_gap_us} fallback={int(fallback_active)}" + ) + self._perf.emit( + "card_stale_carcontrol" if stale_carcontrol_us >= 20_000 else "card_sendcan_gap", + severity=severity, + frame_id=self.sm.frame, + total_time_us=int(convert_us + apply_us + sendcan_us), + batch_size=len(self._perf_ring.snapshot()), + flags=flags, + samples=self._perf_ring.snapshot(), + detail=detail, + min_interval_s=0.25, + ) + + def step(self): + started_ns = time.monotonic_ns() + checkpoint_ns = started_ns + + CS, CS_IQ, RD = self.state_update() + state_update_us = (time.monotonic_ns() - checkpoint_ns) // 1000 + checkpoint_ns = time.monotonic_ns() + + self.state_publish(CS, CS_IQ, RD) + state_publish_us = (time.monotonic_ns() - checkpoint_ns) // 1000 + checkpoint_ns = time.monotonic_ns() + + initialized = (not any(e.name == EventName.selfdriveInitializing for e in self.sm['onroadEvents']) and + self.sm.seen['onroadEvents']) + if not self.CP.passive and initialized: + self.controls_update(CS, self.sm['carControl'], self.sm['iqCarControl']) + if initialized and not self._lag_initialized: + self.rk.reset() + self._lag_initialized = True + controls_update_us = (time.monotonic_ns() - checkpoint_ns) // 1000 + + self.initialized_prev = initialized + self.CS_prev = CS + self.CS_IQ_prev = CS_IQ + + total_us = (time.monotonic_ns() - started_ns) // 1000 + step_sample = PerfSample( + frame_id=self.sm.frame, + loop_dt_us=int(total_us), + update_us=int(state_update_us), + publish_us=int(state_publish_us), + state_control_us=int(controls_update_us), + ) + self._perf_ring.push(step_sample) + if total_us >= 15_000 or state_update_us >= 8_000 or controls_update_us >= 8_000: + detail = ( + f"state_update_us={state_update_us} state_publish_us={state_publish_us} " + f"controls_update_us={controls_update_us}" + ) + self._perf.emit( + "card_slow_loop", + severity="warning" if total_us < 50_000 else "error", + frame_id=self.sm.frame, + total_time_us=int(total_us), + samples=self._perf_ring.snapshot(), + detail=detail, + min_interval_s=0.25, + ) + + def inject_joystick_buttons(self, CS: car.CarState) -> None: + if not self.joystick_debug_mode: + self.joystick_buttons_prev = [False, False] + return + + if self.sm.recv_frame['testJoystick'] == 0: + self.joystick_buttons_prev = [False, False] + return + + age_s = (self.sm.frame - self.sm.recv_frame['testJoystick']) * DT_CTRL + buttons = list(getattr(self.sm['testJoystick'], 'buttons', [])) + current = [ + bool(buttons[0]) if len(buttons) > 0 else False, + bool(buttons[1]) if len(buttons) > 1 else False, + ] + + if age_s > 0.2: + current = [False, False] + + engage = current[0] and not self.joystick_buttons_prev[0] + disengage = current[1] and not self.joystick_buttons_prev[1] + self.joystick_buttons_prev = current + + if engage: + try: + self.params.put("JoystickAolRequest", "enable") + except UnknownKeyName: + pass + if disengage: + try: + self.params.put("JoystickAolRequest", "disable") + except UnknownKeyName: + pass + + def params_thread(self, evt): + config_background_thread() + while not evt.is_set(): + self.is_metric = self.params.get_bool("IsMetric") + self.experimental_mode = self.params.get_bool("ExperimentalMode") and self.CP.openpilotLongitudinalControl + + # iqpilot + self.iq_dynamic_mode = self.params.get_bool("IQDynamicMode") + self.joystick_debug_mode = self.params.get_bool("JoystickDebugMode") + self.v_cruise_helper.read_custom_set_speed_params() + + time.sleep(0.1) + + def card_thread(self): + e = threading.Event() + t = threading.Thread(target=self.params_thread, args=(e, )) + try: + t.start() + while True: + self.step() + self.rk.monitor_time() + finally: + e.set() + t.join() + + +def main(): + config_realtime_process(4, Priority.CTRL_HIGH) + lock_memory() + car = Car() + car.card_thread() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/car/cruise.py b/iqpilot/selfdrive/car/cruise.py new file mode 100644 index 000000000..79881caee --- /dev/null +++ b/iqpilot/selfdrive/car/cruise.py @@ -0,0 +1,387 @@ +import math +import numpy as np + +from iqpilot.cereal import car +from iqpilot.common.constants import CV +from iqpilot.cereal import car, custom +from iqdbc.car import structs +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.car.long_increments import LongIncrementConfig, read_long_increment_config, resolve_button_step + + +# ===== VCruiseHelperIQ (dissolved from iqpilot vcruise_helper_iq) ===== + +ButtonType = car.CarState.ButtonEvent.Type +SpeedLimitAssistState = custom.IQPlan.SpeedLimit.AssistState +SPEED_LIMIT_CONTROL_ACTIVE_STATES = (SpeedLimitAssistState.active, SpeedLimitAssistState.adapting) + + +def compare_cluster_target(v_cruise_cluster: float, target_set_speed: float, is_metric: bool) -> tuple[bool, bool]: + """Whether the cluster set-speed needs +/- presses to reach the target, in display units.""" + to_shown = CV.MS_TO_KPH if is_metric else CV.MS_TO_MPH + now = round(v_cruise_cluster * to_shown) + goal = round(target_set_speed * to_shown) + return now < goal, now > goal + + +CRUISE_BUTTON_TIMER = {ButtonType.decelCruise: 0, ButtonType.accelCruise: 0, + ButtonType.setCruise: 0, ButtonType.resumeCruise: 0, + ButtonType.cancel: 0, ButtonType.mainCruise: 0} + +V_CRUISE_MIN = 8 +V_CRUISE_MAX = 200 # ~ 124 mph +V_CRUISE_UNSET = 255 +IQ_SET_SPEED_MODE_OFF = 0 +IQ_SET_SPEED_MODE_FIXED = 1 +IQ_SET_SPEED_MPH_DEFAULT = 65 +IQ_SET_SPEED_MPH_MIN = 20 +IQ_SET_SPEED_MPH_MAX = 120 + + +def get_minimum_set_speed_kph(_is_metric: bool) -> float: + # IQ minimum set speed floor, expressed in kph for VCruiseHelper integration. + return float(V_CRUISE_MIN) + + +def update_manual_button_timers(CS: car.CarState, button_timers: dict[car.CarState.ButtonEvent.Type, int]) -> None: + # age any button that's currently held (nonzero timer) + for btn, held_frames in button_timers.items(): + if held_frames > 0: + button_timers[btn] = held_frames + 1 + + # a press/release edge (re)starts the timer at 1 or clears it to 0 + for event in CS.buttonEvents: + raw = event.type.raw + if raw in button_timers: + button_timers[raw] = 1 if event.pressed else 0 + + +class VCruiseHelperIQ: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams) -> None: + self.CP = CP + self.CP_IQ = CP_IQ + self.v_cruise_kph = V_CRUISE_UNSET + self.v_cruise_cluster_kph = V_CRUISE_UNSET + self.params = Params() + self.v_cruise_min = 0 + self.enabled_prev = False + + self.long_increment_config: LongIncrementConfig = read_long_increment_config(self.params) + self.set_speed_to_limit = self._read_set_speed_to_limit() + self.iq_set_speed_mode = self._read_iq_set_speed_mode() + self.iq_set_speed_use_current = self._read_iq_set_speed_use_current() + self.iq_set_speed_mph = self._read_iq_set_speed_mph() + + self.enable_button_timers = CRUISE_BUTTON_TIMER + + # Speed Limit Assist + self.speed_limit_state = SpeedLimitAssistState.disabled + self.prev_speed_limit_state = SpeedLimitAssistState.disabled + self.has_speed_limit = False + self.speed_limit_final_last = 0. + self.speed_limit_final_last_kph = 0. + self.prev_speed_limit_final_last_kph = 0. + self.req_plus = False + self.req_minus = False + + def _read_set_speed_to_limit(self) -> bool: + try: + return self.params.get_bool("SLCSetSpeedToLimit") + except Exception: + return False + + def _read_iq_set_speed_mode(self) -> int: + try: + return int(self.params.get("IQE2ESetSpeedMode", return_default=True) or IQ_SET_SPEED_MODE_OFF) + except Exception: + return IQ_SET_SPEED_MODE_OFF + + def _read_iq_set_speed_use_current(self) -> bool: + try: + return bool(self.params.get_bool("IQE2ESetSpeedUseCurrent")) + except Exception: + return False + + def _read_iq_set_speed_mph(self) -> int: + try: + value = int(self.params.get("IQE2ESetSpeedMph", return_default=True) or IQ_SET_SPEED_MPH_DEFAULT) + except Exception: + value = IQ_SET_SPEED_MPH_DEFAULT + return int(np.clip(value, IQ_SET_SPEED_MPH_MIN, IQ_SET_SPEED_MPH_MAX)) + + def read_custom_set_speed_params(self) -> None: + self.long_increment_config = read_long_increment_config(self.params) + self.set_speed_to_limit = self._read_set_speed_to_limit() + self.iq_set_speed_mode = self._read_iq_set_speed_mode() + self.iq_set_speed_use_current = self._read_iq_set_speed_use_current() + self.iq_set_speed_mph = self._read_iq_set_speed_mph() + + def get_iq_mode_initial_set_speed_kph(self, current_speed_kph: float, fallback_kph: float) -> float: + if self.iq_set_speed_mode != IQ_SET_SPEED_MODE_FIXED: + return fallback_kph + + if self.iq_set_speed_use_current: + return float(np.clip(round(current_speed_kph, 1), self.v_cruise_min, V_CRUISE_MAX)) + + fixed_kph = float(self.iq_set_speed_mph) * CV.MPH_TO_KPH + return float(np.clip(round(fixed_kph, 1), self.v_cruise_min, V_CRUISE_MAX)) + + def update_v_cruise_delta(self, long_press: bool, v_cruise_delta: float) -> tuple[bool, float]: + return resolve_button_step(self.long_increment_config, long_press, v_cruise_delta) + + def get_minimum_set_speed(self, is_metric: bool) -> None: + if self.CP_IQ.pcmCruiseSpeed: + self.v_cruise_min = V_CRUISE_MIN + return + + self.v_cruise_min = get_minimum_set_speed_kph(is_metric) + + def update_enabled_state(self, CS: car.CarState, enabled: bool) -> bool: + # pcmCruiseSpeed cars keep the stock enabled flag; others gate engagement on button release + if self.CP_IQ.pcmCruiseSpeed: + return enabled + + update_manual_button_timers(CS, self.enable_button_timers) + button_pressed = any(t > 0 for t in self.enable_button_timers.values()) + + if enabled and not self.enabled_prev: + # first engage frame while the button is still down: hold off until it's let go + self.enabled_prev = not button_pressed + return False + if not enabled: + self.enabled_prev = False + + return enabled and self.enabled_prev + + def update_speed_limit_assist(self, is_metric, LP_IQ: custom.IQPlan) -> None: + resolver = LP_IQ.speedLimit.resolver + self.has_speed_limit = resolver.speedLimitValid or resolver.speedLimitLastValid + self.speed_limit_final_last = LP_IQ.speedLimit.resolver.speedLimitFinalLast + self.speed_limit_final_last_kph = self.speed_limit_final_last * CV.MS_TO_KPH + self.speed_limit_state = LP_IQ.speedLimit.assist.state + self.req_plus, self.req_minus = compare_cluster_target(self.v_cruise_cluster_kph * CV.KPH_TO_MS, + self.speed_limit_final_last, is_metric) + + @property + def update_speed_limit_final_last_changed(self) -> bool: + if not self.has_speed_limit: + return False + return self.speed_limit_final_last_kph != self.prev_speed_limit_final_last_kph + + def update_speed_limit_assist_v_cruise_non_pcm(self) -> None: + if self.set_speed_to_limit and \ + self.speed_limit_state in SPEED_LIMIT_CONTROL_ACTIVE_STATES and \ + (self.prev_speed_limit_state not in SPEED_LIMIT_CONTROL_ACTIVE_STATES or self.update_speed_limit_final_last_changed): + self.v_cruise_kph = np.clip(round(self.speed_limit_final_last_kph, 1), self.v_cruise_min, V_CRUISE_MAX) + + self.prev_speed_limit_state = self.speed_limit_state + self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph + + def update_speed_limit_assist_v_cruise_op_long(self) -> None: + if not self.CP.openpilotLongitudinalControl or not self.set_speed_to_limit: + return + + if self.speed_limit_state == SpeedLimitAssistState.disabled: + self.prev_speed_limit_state = self.speed_limit_state + self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph + return + + if not self.has_speed_limit or self.speed_limit_final_last_kph <= 0: + self.prev_speed_limit_state = self.speed_limit_state + self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph + return + + target_kph = float(np.clip(round(self.speed_limit_final_last_kph, 1), self.v_cruise_min, V_CRUISE_MAX)) + # OP Long uses planner min(v_cruise, slc target) to enforce limits. + # Do not clamp the user's max (v_cruise) here, or they cannot raise/lower it. + # Only sync on initial activation or when the resolved limit changes. + if (self.v_cruise_kph == V_CRUISE_UNSET and self.speed_limit_state in SPEED_LIMIT_CONTROL_ACTIVE_STATES) or \ + self.update_speed_limit_final_last_changed: + self.v_cruise_kph = target_kph + self.v_cruise_cluster_kph = target_kph + + self.prev_speed_limit_state = self.speed_limit_state + self.prev_speed_limit_final_last_kph = self.speed_limit_final_last_kph + + + +# WARNING: this value was determined based on the model's training distribution, +# model predictions above this speed can be unpredictable +# V_CRUISE's are in kph +V_CRUISE_MIN = 8 +V_CRUISE_MAX = 200 # ~ 124 mph +V_CRUISE_UNSET = 255 +V_CRUISE_INITIAL = 40 +V_CRUISE_INITIAL_EXPERIMENTAL_MODE = 105 +IMPERIAL_INCREMENT = round(CV.MPH_TO_KPH, 1) # round here to avoid rounding errors incrementing set speed + +ButtonEvent = car.CarState.ButtonEvent +ButtonType = car.CarState.ButtonEvent.Type +CRUISE_LONG_PRESS = 50 +CRUISE_NEAREST_FUNC = { + ButtonType.accelCruise: math.ceil, + ButtonType.decelCruise: math.floor, +} +CRUISE_INTERVAL_SIGN = { + ButtonType.accelCruise: +1, + ButtonType.decelCruise: -1, +} + + +class VCruiseHelper(VCruiseHelperIQ): + def __init__(self, CP, CP_IQ): + VCruiseHelperIQ.__init__(self, CP, CP_IQ) + self.CP = CP + self.v_cruise_kph = V_CRUISE_UNSET + self.v_cruise_cluster_kph = V_CRUISE_UNSET + self.v_cruise_kph_last = 0 + self.button_timers = {ButtonType.decelCruise: 0, ButtonType.accelCruise: 0} + self.button_change_states = {btn: {"standstill": False, "enabled": False} for btn in self.button_timers} + self.slc_set_speed_request_id = 0 + self.slc_set_speed_gesture_id = 0 + self.slc_set_speed_request_kph = 0.0 + self._slc_accel_held = False + self._slc_accel_release_frames = 0 + self._slc_pcm_speed_last = None + + def _update_slc_accel_gesture(self, CS): + self._slc_accel_release_frames = max(0, self._slc_accel_release_frames - 1) + for button in CS.buttonEvents: + if button.type in (ButtonType.accelCruise, ButtonType.resumeCruise): + if button.pressed: + self.slc_set_speed_gesture_id = (self.slc_set_speed_gesture_id + 1) % (1 << 32) + self._slc_accel_release_frames = 0 + else: + self._slc_accel_release_frames = int(0.5 / DT_CTRL) + self._slc_accel_held = button.pressed + elif button.pressed: + self._slc_accel_held = False + self._slc_accel_release_frames = 0 + if not CS.cruiseState.available: + self._slc_accel_held = False + self._slc_accel_release_frames = 0 + + def _record_slc_set_speed_increase(self, previous_kph, enabled): + if enabled and (self._slc_accel_held or self._slc_accel_release_frames > 0) and \ + previous_kph is not None and 0 < previous_kph < self.v_cruise_kph <= V_CRUISE_MAX: + self.slc_set_speed_request_id = (self.slc_set_speed_request_id + 1) % (1 << 32) + self.slc_set_speed_request_kph = float(self.v_cruise_kph) + + @property + def v_cruise_initialized(self): + return self.v_cruise_kph != V_CRUISE_UNSET + + @property + def volkswagen_standby_set_speed(self) -> bool: + return self.CP.brand == "volkswagen" and self.CP.openpilotLongitudinalControl and not self.CP.pcmCruise + + def update_v_cruise(self, CS, enabled, is_metric): + self.v_cruise_kph_last = self.v_cruise_kph + self._update_slc_accel_gesture(CS) + + self.get_minimum_set_speed(is_metric) + + if CS.cruiseState.available: + _enabled = self.update_enabled_state(CS, enabled) + if not self.CP.pcmCruise or (not self.CP_IQ.pcmCruiseSpeed and _enabled): + # if stock cruise is completely disabled, then we can use our own set speed logic + self._update_v_cruise_non_pcm(CS, _enabled, is_metric, self.volkswagen_standby_set_speed) + self._record_slc_set_speed_increase(self.v_cruise_kph_last, _enabled) + self.update_speed_limit_assist_v_cruise_non_pcm() + self.v_cruise_cluster_kph = self.v_cruise_kph + self.update_button_timers(CS, enabled) + else: + self.v_cruise_kph = CS.cruiseState.speed * CV.MS_TO_KPH + self.v_cruise_cluster_kph = CS.cruiseState.speedCluster * CV.MS_TO_KPH + self._record_slc_set_speed_increase(self._slc_pcm_speed_last, _enabled) + self._slc_pcm_speed_last = self.v_cruise_kph + if CS.cruiseState.speed == 0: + self.v_cruise_kph = V_CRUISE_UNSET + self.v_cruise_cluster_kph = V_CRUISE_UNSET + elif CS.cruiseState.speed == -1: + self.v_cruise_kph = -1 + self.v_cruise_cluster_kph = -1 + else: + self.update_speed_limit_assist_v_cruise_op_long() + else: + self.v_cruise_kph = V_CRUISE_UNSET + self.v_cruise_cluster_kph = V_CRUISE_UNSET + self._slc_pcm_speed_last = None + + def _update_v_cruise_non_pcm(self, CS, enabled, is_metric, allow_standby_adjustment=False): + # handle button presses. TODO: this should be in state_control, but a decelCruise press + # would have the effect of both enabling and changing speed is checked after the state transition + if not enabled and not allow_standby_adjustment: + return + + long_press = False + button_type = None + + v_cruise_delta = 1. if is_metric else IMPERIAL_INCREMENT + + for b in CS.buttonEvents: + if b.type.raw in self.button_timers and not b.pressed: + if self.button_timers[b.type.raw] > CRUISE_LONG_PRESS: + return # end long press + button_type = b.type.raw + break + else: + for k, timer in self.button_timers.items(): + if timer and timer % CRUISE_LONG_PRESS == 0: + button_type = k + long_press = True + break + + if button_type is None: + return + + # Don't adjust speed when pressing resume to exit standstill + cruise_standstill = self.button_change_states[button_type]["standstill"] or CS.cruiseState.standstill + if button_type == ButtonType.accelCruise and cruise_standstill: + return + + # Don't adjust speed if we've enabled since the button was depressed (some ports enable on rising edge) + if enabled and not self.button_change_states[button_type]["enabled"]: + return + + long_press, v_cruise_delta = VCruiseHelperIQ.update_v_cruise_delta(self, long_press, v_cruise_delta) + if long_press and self.v_cruise_kph % v_cruise_delta != 0: # partial interval + self.v_cruise_kph = CRUISE_NEAREST_FUNC[button_type](self.v_cruise_kph / v_cruise_delta) * v_cruise_delta + else: + self.v_cruise_kph += v_cruise_delta * CRUISE_INTERVAL_SIGN[button_type] + + # If set is pressed while overriding, clip cruise speed to minimum of vEgo + if enabled and CS.gasPressed and button_type in (ButtonType.decelCruise, ButtonType.setCruise): + self.v_cruise_kph = max(self.v_cruise_kph, CS.vEgo * CV.MS_TO_KPH) + + self.v_cruise_kph = np.clip(round(self.v_cruise_kph, 1), self.v_cruise_min, V_CRUISE_MAX) + + def update_button_timers(self, CS, enabled): + # increment timer for buttons still pressed + for k in self.button_timers: + if self.button_timers[k] > 0: + self.button_timers[k] += 1 + + for b in CS.buttonEvents: + if b.type.raw in self.button_timers: + # Start/end timer and store current state on change of button pressed + self.button_timers[b.type.raw] = 1 if b.pressed else 0 + self.button_change_states[b.type.raw] = {"standstill": CS.cruiseState.standstill, "enabled": enabled} + + def initialize_v_cruise(self, CS, experimental_mode: bool, iq_dynamic_mode: bool) -> None: + # initializing is handled by the PCM + if self.CP.pcmCruise or self.v_cruise_initialized: + return + + initial_experimental_mode = experimental_mode and not iq_dynamic_mode + initial = V_CRUISE_INITIAL_EXPERIMENTAL_MODE if initial_experimental_mode else V_CRUISE_INITIAL + if initial_experimental_mode: + initial = self.get_iq_mode_initial_set_speed_kph(CS.vEgo * CV.MS_TO_KPH, initial) + + if any(b.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for b in CS.buttonEvents) and self.v_cruise_initialized: + self.v_cruise_kph = self.v_cruise_kph_last + else: + self.v_cruise_kph = int(round(np.clip(CS.vEgo * CV.MS_TO_KPH, initial, V_CRUISE_MAX))) + + self.v_cruise_cluster_kph = self.v_cruise_kph diff --git a/iqpilot/selfdrive/car/docs.py b/iqpilot/selfdrive/car/docs.py new file mode 100755 index 000000000..2ae419d89 --- /dev/null +++ b/iqpilot/selfdrive/car/docs.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +import argparse +import os + +from iqpilot.common.basedir import BASEDIR +from iqdbc.car.docs import get_all_car_docs, generate_cars_md + +CARS_MD_OUT = os.path.join(BASEDIR, "docs", "CARS.md") +CARS_MD_TEMPLATE = os.path.join(BASEDIR, "iqpilot", "selfdrive", "car", "CARS_template.md") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Auto generates supported cars documentation", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument("--template", default=CARS_MD_TEMPLATE, help="Override default template filename") + parser.add_argument("--out", default=CARS_MD_OUT, help="Override default generated filename") + args = parser.parse_args() + + with open(args.out, 'w') as f: + f.write(generate_cars_md(get_all_car_docs(), args.template)) + print(f"Generated and written to {args.out}") diff --git a/iqpilot/selfdrive/car/enhanced_stock_longitudinal_control.py b/iqpilot/selfdrive/car/enhanced_stock_longitudinal_control.py new file mode 100644 index 000000000..9b99693bf --- /dev/null +++ b/iqpilot/selfdrive/car/enhanced_stock_longitudinal_control.py @@ -0,0 +1,67 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from __future__ import annotations + +from iqpilot.common.constants import CV +from iqpilot.selfdrive.car.cruise import V_CRUISE_MAX + +from iqdbc.car import structs + +ENHANCED_STOCK_LONGITUDINAL_CONTROL_SET_SPEED_KPH_KEY = "enhancedStockLongitudinalControl.setSpeedKph" + + +def _float_param(key: str, value: float) -> dict[str, object]: + return {"key": key, "type": "float", "value": f"{float(value):.3f}".encode("utf-8")} + + +def _clamp_set_speed_kph(value: float) -> float: + return max(0.0, min(V_CRUISE_MAX, float(value))) + + +def build_iq_control_params_from_plan(CP: structs.CarParams, iq_plan, selfdrive_enabled: bool, + current_set_speed_kph: float, previous_sync_limit_kph: float | None, + pending_sync_limit_kph: float | None) -> tuple[list[dict[str, object]], float | None, float | None]: + if not CP.openpilotLongitudinalControl or not selfdrive_enabled: + return [], None, None + + resolver = getattr(getattr(iq_plan, "speedLimit", None), "resolver", None) + assist = getattr(getattr(iq_plan, "speedLimit", None), "assist", None) + if resolver is None or assist is None: + return [], None, None + + speed_limit_final_last = float(getattr(resolver, "speedLimitFinalLast", 0.0) or 0.0) + assist_enabled = bool(getattr(assist, "enabled", False)) + if not assist_enabled or speed_limit_final_last <= 0.0: + return [], None, None + + resolved_limit_kph = _clamp_set_speed_kph(speed_limit_final_last * CV.MS_TO_KPH) + limit_changed = previous_sync_limit_kph is None or abs(resolved_limit_kph - previous_sync_limit_kph) > 0.05 + if limit_changed: + pending_sync_limit_kph = resolved_limit_kph + + if pending_sync_limit_kph is not None: + if abs(current_set_speed_kph - pending_sync_limit_kph) <= 0.25: + pending_sync_limit_kph = None + set_speed_kph = _clamp_set_speed_kph(current_set_speed_kph or resolved_limit_kph) + else: + set_speed_kph = pending_sync_limit_kph + else: + set_speed_kph = _clamp_set_speed_kph(current_set_speed_kph or resolved_limit_kph) + + return [_float_param(ENHANCED_STOCK_LONGITUDINAL_CONTROL_SET_SPEED_KPH_KEY, set_speed_kph)], resolved_limit_kph, pending_sync_limit_kph + + +def get_set_speed_kph_from_params(params) -> float | None: + for param in params: + key = param.key if hasattr(param, "key") else param.get("key") + if key != ENHANCED_STOCK_LONGITUDINAL_CONTROL_SET_SPEED_KPH_KEY: + continue + raw_value = param.value if hasattr(param, "value") else param.get("value") + try: + raw = raw_value.decode("utf-8") if isinstance(raw_value, (bytes, bytearray)) else str(raw_value) + value = float(raw) + except (AttributeError, TypeError, ValueError): + return None + return _clamp_set_speed_kph(value) + return None diff --git a/iqpilot/selfdrive/car/gap_button_actions.py b/iqpilot/selfdrive/car/gap_button_actions.py new file mode 100644 index 000000000..3454b6851 --- /dev/null +++ b/iqpilot/selfdrive/car/gap_button_actions.py @@ -0,0 +1,48 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.cereal import car, custom +from iqdbc.car import structs +from iqpilot.common.params import Params + +_Button = car.CarState.ButtonEvent.Type +_IQEvent = custom.IQOnroadEvent.EventName +_GAP_BUTTON = _Button.gapAdjustCruise + +HOLD_FRAMES_TO_TOGGLE = 50 + + +class GapButtonActions: + def __init__(self, CP: structs.CarParams): + self._CP = CP + self._params = Params() + self._gap_hold_frames = 0 + self._already_toggled = False + # read (and cleared) by the personality-decrement handler in selfdrived so a + # release that ends a toggle-hold does not also decrement personality + self.experimental_mode_switched = False + + def update(self, CS, events, experimental_mode) -> None: + if not (self._CP.openpilotLongitudinalControl and CS.cruiseState.available): + return + self._advance_hold(CS) + self._toggle_experimental_on_long_hold(events, experimental_mode) + + def _advance_hold(self, CS) -> None: + # once counting, keep incrementing each frame the hold persists + if self._gap_hold_frames > 0: + self._gap_hold_frames += 1 + # a fresh press seeds the counter; a release zeroes it + for be in CS.buttonEvents: + if be.type.raw == _GAP_BUTTON: + self._gap_hold_frames = int(be.pressed) + if not be.pressed: + self._already_toggled = False + + def _toggle_experimental_on_long_hold(self, events, experimental_mode) -> None: + if self._already_toggled or self._gap_hold_frames < HOLD_FRAMES_TO_TOGGLE: + return + self._params.put_bool_nonblocking("ExperimentalMode", not experimental_mode) + events.add(_IQEvent.experimentalToggled) + self._already_toggled = True + self.experimental_mode_switched = True diff --git a/iqpilot/selfdrive/car/helpers.py b/iqpilot/selfdrive/car/helpers.py new file mode 100644 index 000000000..ad71560ae --- /dev/null +++ b/iqpilot/selfdrive/car/helpers.py @@ -0,0 +1,198 @@ +import capnp +from enum import Enum +from typing import Any + +from iqpilot.cereal import custom +from iqdbc.car import structs + +_FIELDS = '__dataclass_fields__' # copy of dataclasses._FIELDS + + +def is_dataclass(obj): + """Similar to dataclasses.is_dataclass without instance type check checking""" + return hasattr(obj, _FIELDS) + + +def _asdictref_inner(obj) -> dict[str, Any] | Any: + if isinstance(obj, Enum): + return _asdictref_inner(obj.value) + elif is_dataclass(obj): + ret = {} + for field in getattr(obj, _FIELDS): # similar to dataclasses.fields() + ret[field] = _asdictref_inner(getattr(obj, field)) + return ret + elif isinstance(obj, (tuple, list)): + return type(obj)(_asdictref_inner(v) for v in obj) + elif isinstance(obj, dict): + return {key: _asdictref_inner(value) for key, value in obj.items()} + else: + return obj + + +def asdictref(obj) -> dict[str, Any]: + """ + Similar to dataclasses.asdict without recursive type checking and copy.deepcopy + Note that the resulting dict will contain references to the original struct as a result + """ + if not is_dataclass(obj): + raise TypeError("asdictref() should be called on dataclass instances") + + return _asdictref_inner(obj) + + +def convert_to_capnp(struct: structs.IQCarParams | structs.IQCarState) -> capnp.lib.capnp._DynamicStructBuilder: + struct_dict = asdictref(struct) + + if isinstance(struct, structs.IQCarParams): + struct_capnp = custom.IQCarParams.new_message(**struct_dict) + elif isinstance(struct, structs.IQCarState): + struct_capnp = custom.IQCarState.new_message(**struct_dict) + else: + raise ValueError(f"Unsupported struct type: {type(struct)}") + + return struct_capnp + + +def convert_iq_car_control(struct: capnp.lib.capnp._DynamicStructReader) -> structs.IQCarControl: + # NOTE: Avoid `to_dict()` here; it can throw on fuzzed messages when capnp + # tries to resolve unknown/invalid union-like internals. Explicit mapping is + # stable and keeps this conversion deterministic for tests. + struct_dataclass = structs.IQCarControl() + + aol = struct.aol + struct_dataclass.aol = structs.AlwaysOnLateral( + state=str(aol.state), + enabled=aol.enabled, + active=aol.active, + available=aol.available, + ) + + struct_dataclass.params = [ + structs.IQCarControl.Param( + key=p.key, + value=bytes(p.value), + type=str(p.type), + ) for p in struct.params + ] + struct_dataclass.angleOffsetDeg = float(getattr(struct, "angleOffsetDeg", 0.0)) + + lead_one = struct.leadOne + struct_dataclass.leadOne = structs.LeadData( + dRel=lead_one.dRel, + yRel=lead_one.yRel, + vRel=lead_one.vRel, + aRel=lead_one.aRel, + vLead=lead_one.vLead, + dPath=lead_one.dPath, + vLat=lead_one.vLat, + vLeadK=lead_one.vLeadK, + aLeadK=lead_one.aLeadK, + fcw=lead_one.fcw, + status=lead_one.status, + aLeadTau=lead_one.aLeadTau, + modelProb=lead_one.modelProb, + radar=lead_one.radar, + radarTrackId=lead_one.radarTrackId, + ) + + lead_two = struct.leadTwo + struct_dataclass.leadTwo = structs.LeadData( + dRel=lead_two.dRel, + yRel=lead_two.yRel, + vRel=lead_two.vRel, + aRel=lead_two.aRel, + vLead=lead_two.vLead, + dPath=lead_two.dPath, + vLat=lead_two.vLat, + vLeadK=lead_two.vLeadK, + aLeadK=lead_two.aLeadK, + fcw=lead_two.fcw, + status=lead_two.status, + aLeadTau=lead_two.aLeadTau, + modelProb=lead_two.modelProb, + radar=lead_two.radar, + radarTrackId=lead_two.radarTrackId, + ) + struct_dataclass.angleOffsetDeg = struct.angleOffsetDeg + + struct_dataclass.radarBlendActive = bool(getattr(struct, "radarBlendActive", False)) + struct_dataclass.radarEngageReq = bool(getattr(struct, "radarEngageReq", False)) + struct_dataclass.radarCancelReq = bool(getattr(struct, "radarCancelReq", False)) + struct_dataclass.useRadarAccel = bool(getattr(struct, "useRadarAccel", False)) + struct_dataclass.radarSetSpeedKph = float(getattr(struct, "radarSetSpeedKph", 0.0)) + struct_dataclass.radarGapBars = int(getattr(struct, "radarGapBars", 0)) + + return struct_dataclass + + +def convert_iq_car_control_compact(struct: capnp.lib.capnp._DynamicStructReader, *, include_leads: bool) -> structs.IQCarControl: + struct_dataclass = structs.IQCarControl() + + aol = struct.aol + struct_dataclass.aol = structs.AlwaysOnLateral( + state=str(aol.state), + enabled=aol.enabled, + active=aol.active, + available=aol.available, + ) + + struct_dataclass.params = [ + structs.IQCarControl.Param( + key=p.key, + value=bytes(p.value), + type=str(p.type), + ) for p in struct.params + ] + struct_dataclass.angleOffsetDeg = float(getattr(struct, "angleOffsetDeg", 0.0)) + + if include_leads: + lead_one = struct.leadOne + struct_dataclass.leadOne = structs.LeadData( + dRel=lead_one.dRel, + yRel=lead_one.yRel, + vRel=lead_one.vRel, + aRel=lead_one.aRel, + vLead=lead_one.vLead, + dPath=lead_one.dPath, + vLat=lead_one.vLat, + vLeadK=lead_one.vLeadK, + aLeadK=lead_one.aLeadK, + fcw=lead_one.fcw, + status=lead_one.status, + aLeadTau=lead_one.aLeadTau, + modelProb=lead_one.modelProb, + radar=lead_one.radar, + radarTrackId=lead_one.radarTrackId, + ) + + lead_two = struct.leadTwo + struct_dataclass.leadTwo = structs.LeadData( + dRel=lead_two.dRel, + yRel=lead_two.yRel, + vRel=lead_two.vRel, + aRel=lead_two.aRel, + vLead=lead_two.vLead, + dPath=lead_two.dPath, + vLat=lead_two.vLat, + vLeadK=lead_two.vLeadK, + aLeadK=lead_two.aLeadK, + fcw=lead_two.fcw, + status=lead_two.status, + aLeadTau=lead_two.aLeadTau, + modelProb=lead_two.modelProb, + radar=lead_two.radar, + radarTrackId=lead_two.radarTrackId, + ) + + struct_dataclass.angleOffsetDeg = struct.angleOffsetDeg + + # VW PQ "Blend IQ.Pilot + Stock ACC Radar" intent must survive the conversion or the RadarHandler + # never sees the engage/cancel/passthrough request. + struct_dataclass.radarBlendActive = bool(getattr(struct, "radarBlendActive", False)) + struct_dataclass.radarEngageReq = bool(getattr(struct, "radarEngageReq", False)) + struct_dataclass.radarCancelReq = bool(getattr(struct, "radarCancelReq", False)) + struct_dataclass.useRadarAccel = bool(getattr(struct, "useRadarAccel", False)) + struct_dataclass.radarSetSpeedKph = float(getattr(struct, "radarSetSpeedKph", 0.0)) + struct_dataclass.radarGapBars = int(getattr(struct, "radarGapBars", 0)) + + return struct_dataclass diff --git a/iqpilot/selfdrive/car/interfaces.py b/iqpilot/selfdrive/car/interfaces.py new file mode 100644 index 000000000..d4afb38cb --- /dev/null +++ b/iqpilot/selfdrive/car/interfaces.py @@ -0,0 +1,92 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqdbc.car import structs as _dbc +from iqpilot.common.params import Params as _Store, UnknownKeyName as _UnknownKey +from iqpilot.common.swaglog import cloudlog as _log +from iqpilot.selfdrive.controls.lib.latcontrol_torque import get_nn_model_path as _resolve_nn + +import iqpilot.system.sentry as _telemetry + +_ANGLE = _dbc.CarParams.SteerControlType.angle + +# Port tunables surfaced to the fingerprint step, flat so the read is one pass. +_TUNABLES = ( + "IQHyundaiLongTune", + "IQSubaruCreepAssist", + "IQSubaruCreepAssistManualBrake", + "IQTeslaFsdVisualization", + "IQTeslaTorqueBlend", + "IQToyotaFactoryLong", + "ToyotaSnGHack", +) + + +def initialize_params(store): + return [{name: store.get(name, return_default=True)} for name in _TUNABLES] + + +def log_fingerprint(cp) -> None: + ident = cp.carFingerprint + if ident == "MOCK": + _telemetry.capture_fingerprint_mock() + else: + _telemetry.capture_fingerprint(ident, cp.brand) + + +def set_speed_limit_controller_availability(cp, cp_iq, store=None) -> bool: + """Gate the speed-limit controller off on platforms that can't run it, dropping a + stuck 'control' mode down to 'warning'.""" + store = store or _Store() + brand = cp.brand + off = (brand == "rivian" + or (brand == "tesla" and store.get_bool("IsReleaseIqBranch")) + or (not cp.openpilotLongitudinalControl and cp_iq.pcmCruiseSpeed)) + if off and store.get("IQSpeedAssistMode", return_default=True) == 3: # control -> warning + store.put("IQSpeedAssistMode", 2) + return not off + + +def _stamp_lateral_model(cp, cp_iq, store) -> bool: + where, label, precise = _resolve_nn(cp) + nn = cp_iq.iqLateralNet + nn.model.path, nn.model.name, nn.fuzzyFingerprint = where, label, not precise + if label == "MOCK": + _log.error({"nnff event": "car doesn't match any Neural Network model"}) + return False + return cp.steerControlType != _ANGLE and store.get_bool("NeuralNetworkFeedForward") + + +def _cleanup_unsupported_params(cp, cp_iq, store=None) -> None: + store = store or _Store() + doomed = { + "NeuralNetworkFeedForward": cp.steerControlType == _ANGLE, + "LongIncrementsEnabled": not cp.openpilotLongitudinalControl and cp_iq.pcmCruiseSpeed, + } + for name, gone in doomed.items(): + if gone: + _log.warning(f"unsupported on this port, clearing {name}") + store.remove(name) + set_speed_limit_controller_availability(cp, cp_iq, store) + + +def _apply_radar_scan_switch(cp, store) -> None: + if cp.brand != "honda" or cp.radarUnavailable: + return + try: + switch = store.get("IQHondaRadarScan") + except _UnknownKey: + # params store predates the key (mid-update): the switch defaults on + return + # opt-out kill switch: only an explicit "0" disables, so a never-materialized param stays on + if switch in (b"0", "0"): + _log.warning("IQHondaRadarScan disabled, running without the radar object scan") + cp.radarUnavailable = True + + +def apply_iq_car_config(ci, store=None) -> None: + store = store or _Store() + if _stamp_lateral_model(ci.CP, ci.CP_IQ, store): + ci.configure_torque_tune(ci.CP.carFingerprint, ci.CP.lateralTuning) + _cleanup_unsupported_params(ci.CP, ci.CP_IQ, store) + _apply_radar_scan_switch(ci.CP, store) diff --git a/iqpilot/selfdrive/car/long_increments.py b/iqpilot/selfdrive/car/long_increments.py new file mode 100644 index 000000000..04772ff70 --- /dev/null +++ b/iqpilot/selfdrive/car/long_increments.py @@ -0,0 +1,58 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from dataclasses import dataclass + +from iqpilot.common.params import Params + +# Cruise set-speed step (in the caller's working unit, kph or the imperial increment) +# a user is allowed to dial in for the accel/decel cruise buttons. +MIN_BUTTON_STEP = 1 +MAX_BUTTON_STEP = 10 + +# Once the resolved step reaches this size, we snap the set speed to the nearest +# multiple of the step (e.g. a step of 5 lands on 45/50/55...) instead of just +# adding it on top of whatever odd number the set speed currently sits at. +SNAP_TO_GRID_THRESHOLD = 5 + +# Stock behavior (feature disabled): tap moves by one unit, a held button moves +# five times faster. This mirrors what every other unmodified button-input car +# already does, so it's kept as the fallback rather than living in this module. +STOCK_HOLD_MULTIPLIER = 5 + + +@dataclass(frozen=True) +class LongIncrementConfig: + enabled: bool + tap_step: int + hold_step: int + + +def _clamp_step(value) -> int: + try: + step = int(value) + except (TypeError, ValueError): + return MIN_BUTTON_STEP + return min(max(step, MIN_BUTTON_STEP), MAX_BUTTON_STEP) + + +def read_long_increment_config(params: Params) -> LongIncrementConfig: + return LongIncrementConfig( + enabled=params.get_bool("LongIncrementsEnabled"), + tap_step=_clamp_step(params.get("LongIncrementTapStep", return_default=True)), + hold_step=_clamp_step(params.get("LongIncrementHoldStep", return_default=True)), + ) + + +def resolve_button_step(config: LongIncrementConfig, held: bool, unit_step: float) -> tuple[bool, float]: + """ + Turn a single tap/hold cruise button event into a (snap_to_grid, delta) pair, + where delta is expressed in the same unit as unit_step (kph, or the mph-derived + increment used for imperial cars). + """ + if not config.enabled: + return held, unit_step * (STOCK_HOLD_MULTIPLIER if held else 1) + + multiplier = config.hold_step if held else config.tap_step + snap_to_grid = multiplier >= SNAP_TO_GRID_THRESHOLD + return snap_to_grid, unit_step * multiplier diff --git a/iqpilot/selfdrive/car/refresh_car_list.py b/iqpilot/selfdrive/car/refresh_car_list.py new file mode 100644 index 000000000..5774aa9b9 --- /dev/null +++ b/iqpilot/selfdrive/car/refresh_car_list.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.car.vehicle_catalog import load_catalog + + +def refresh_car_list_param() -> None: + platforms = load_catalog() + if not platforms: + cloudlog.warning("vehicle catalog not found; leaving CarList param unchanged") + return + + params = Params() + if params.get("CarList") == platforms: + cloudlog.warning("CarList param already current, nothing to write") + return + + params.put("CarList", platforms) + cloudlog.warning("CarList param refreshed from vehicle catalog") + + +if __name__ == "__main__": + refresh_car_list_param() diff --git a/iqpilot/selfdrive/car/tests/.gitignore b/iqpilot/selfdrive/car/tests/.gitignore new file mode 100644 index 000000000..192fb0945 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/.gitignore @@ -0,0 +1 @@ +*.bz2 diff --git a/iqpilot/selfdrive/car/tests/__init__.py b/iqpilot/selfdrive/car/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/car/tests/big_cars_test.sh b/iqpilot/selfdrive/car/tests/big_cars_test.sh new file mode 100755 index 000000000..755c99fe8 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/big_cars_test.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +SCRIPT_DIR=$(dirname "$0") +BASEDIR=$(realpath "$SCRIPT_DIR/../../../../") +cd $BASEDIR + +export MAX_EXAMPLES=300 +export INTERNAL_SEG_CNT=300 +export INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt + +cd iqpilot/selfdrive/car/tests && pytest test_models.py test_car_interfaces.py diff --git a/iqpilot/selfdrive/car/tests/test_car_interfaces.py b/iqpilot/selfdrive/car/tests/test_car_interfaces.py new file mode 100644 index 000000000..a37bfa820 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_car_interfaces.py @@ -0,0 +1,152 @@ +import os +import pytest +import hypothesis.strategies as st +from hypothesis import Phase, given, settings +from parameterized import parameterized +from types import SimpleNamespace + +from iqpilot.cereal import car, custom +from iqdbc.car import DT_CTRL +from iqdbc.car.structs import CarParams +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.tests.test_car_interfaces import get_fuzzy_car_interface, get_fuzzy_strategy +from iqdbc.car.mock.values import CAR as MOCK +from iqdbc.car.values import PLATFORMS +from iqpilot.selfdrive.car.card import run_optional_pre_init +from iqpilot.selfdrive.car.helpers import convert_iq_car_control, convert_iq_car_control_compact +from iqpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle +from iqpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID +from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque +from iqpilot.selfdrive.controls.lib.longcontrol import LongControl +from iqpilot.selfdrive.test.fuzzy_generation import FuzzyGenerator + +from iqpilot.selfdrive.car import interfaces as iqpilot_interfaces + +MAX_EXAMPLES = int(os.environ.get('MAX_EXAMPLES', '60')) +VW_MLB_LONG_APPLY_EXCLUDE = {"AUDI_Q5_MK1", "PORSCHE_MACAN_MK1"} +SIGNED_RUNTIME_BRANDS = {"tesla", "volkswagen"} +SIGNED_RUNTIME_PLATFORMS = tuple(car_name for car_name in sorted(PLATFORMS) + if interfaces[car_name].__module__.split(".")[-2] in SIGNED_RUNTIME_BRANDS) +PUBLIC_INTERFACE_PLATFORMS = tuple(car_name for car_name in sorted(PLATFORMS) + if car_name not in SIGNED_RUNTIME_PLATFORMS) + + +def exercise_car_interface(car_name, draw): + car_interface = get_fuzzy_car_interface(car_name, draw) + if car_name in VW_MLB_LONG_APPLY_EXCLUDE: + car_interface.CP.openpilotLongitudinalControl = False + car_params = car_interface.CP.as_reader() + car_params_iq = car_interface.CP_IQ + iqpilot_interfaces.apply_iq_car_config(car_interface) + + cc_msg = FuzzyGenerator.get_random_msg(draw, car.CarControl, real_floats=True) + cc_sp_msg = FuzzyGenerator.get_random_msg(draw, custom.IQCarControl, real_floats=True) + now_nanos = 0 + CC = car.CarControl.new_message(**cc_msg).as_reader() + CC_IQ = convert_iq_car_control(custom.IQCarControl.new_message(**cc_sp_msg).as_reader()) + for _ in range(10): + car_interface.update([]) + car_interface.apply(CC, CC_IQ, now_nanos) + now_nanos += DT_CTRL * 1e9 + + CC = car.CarControl.new_message(**cc_msg) + CC.enabled = True + CC.latActive = True + CC.longActive = True + CC = CC.as_reader() + for _ in range(10): + car_interface.update([]) + car_interface.apply(CC, CC_IQ, now_nanos) + now_nanos += DT_CTRL * 1e9 + + LongControl(car_params, car_params_iq) + if car_params.steerControlType == CarParams.SteerControlType.angle: + LatControlAngle(car_params, car_params_iq, car_interface, DT_CTRL) + elif car_params.lateralTuning.which() == 'pid': + LatControlPID(car_params, car_params_iq, car_interface, DT_CTRL) + elif car_params.lateralTuning.which() == 'torque': + LatControlTorque(car_params, car_params_iq, car_interface, DT_CTRL) + + +@pytest.mark.car_ports +class TestCarInterfaces: + # FIXME: Due to the lists used in carParams, Phase.target is very slow and will cause + # many generated examples to overrun when max_examples > ~20, don't use it + @parameterized.expand([(car,) for car in PUBLIC_INTERFACE_PLATFORMS] + [MOCK.MOCK]) + @settings(max_examples=MAX_EXAMPLES, deadline=None, + phases=(Phase.reuse, Phase.generate, Phase.shrink)) + @given(data=st.data()) + def test_car_interfaces(self, car_name, data): + exercise_car_interface(car_name, data.draw) + + @parameterized.expand([(car,) for car in SIGNED_RUNTIME_PLATFORMS]) + @settings(max_examples=MAX_EXAMPLES, deadline=None, + phases=(Phase.reuse, Phase.generate, Phase.shrink)) + @given(data=st.data()) + def test_public_car_params(self, car_name, data): + params = data.draw(get_fuzzy_strategy()) + params['fingerprints'] |= {key + 1: params['fingerprints'][0] for key in range(6)} + car_interface = interfaces[car_name] + car_params = car_interface.get_params(car_name, params['fingerprints'], params['car_fw'], + alpha_long=params['alpha_long'], is_release=False, docs=False) + car_params_iq = car_interface.get_params_iq(car_params, car_name, params['fingerprints'], params['car_fw'], + alpha_long=params['alpha_long'], is_release_iq=False, docs=False) + assert car_params.mass > 1 + assert car_params.wheelbase > 0 + assert car_params.maxLateralAccel > 0 + assert car_params_iq is not None + + +def test_convert_iq_car_control_compact_skips_leads(): + msg = custom.IQCarControl.new_message() + msg.aol.enabled = True + msg.aol.active = True + msg.aol.available = True + param = msg.init("params", 1) + param[0].key = "enhancedStockLongitudinalControl.setSpeedKph" + param[0].type = "float" + param[0].value = b"42.0" + msg.leadOne.dRel = 42.0 + msg.leadOne.status = True + msg.leadTwo.dRel = 84.0 + msg.leadTwo.status = True + + compact = convert_iq_car_control_compact(msg.as_reader(), include_leads=False) + assert compact.aol.enabled + assert compact.aol.active + assert compact.aol.available + assert len(compact.params) == 1 + assert compact.params[0].key == "enhancedStockLongitudinalControl.setSpeedKph" + assert compact.params[0].type == "float" + assert compact.params[0].value == b"42.0" + assert compact.leadOne.dRel == 0.0 + assert not compact.leadOne.status + assert compact.leadTwo.dRel == 0.0 + assert not compact.leadTwo.status + + full = convert_iq_car_control_compact(msg.as_reader(), include_leads=True) + assert full.leadOne.dRel == 42.0 + assert full.leadOne.status + assert full.leadTwo.dRel == 84.0 + assert full.leadTwo.status + + +def test_run_optional_pre_init_skips_missing_hook(): + ci = SimpleNamespace() + run_optional_pre_init(ci, car.CarParams(), custom.IQCarParams(), (lambda wait_for_one=False: [], lambda msgs: None)) + + +def test_run_optional_pre_init_calls_hook(): + called = [] + + class CI: + @staticmethod + def pre_init(CP, CP_IQ, can_recv, can_send): + called.append((CP, CP_IQ, can_recv, can_send)) + + can_callbacks = (lambda wait_for_one=False: [], lambda msgs: None) + cp = car.CarParams() + cp_iq = custom.IQCarParams() + run_optional_pre_init(CI(), cp, cp_iq, can_callbacks) + + assert called == [(cp, cp_iq, *can_callbacks)] diff --git a/iqpilot/selfdrive/car/tests/test_car_specific_events.py b/iqpilot/selfdrive/car/tests/test_car_specific_events.py new file mode 100644 index 000000000..81aa10124 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_car_specific_events.py @@ -0,0 +1,117 @@ +from types import SimpleNamespace + +from iqpilot.cereal import log +from iqdbc.car import structs + +from iqpilot.selfdrive.car.car_specific import CarSpecificEvents + +EventName = log.OnroadEvent.EventName +GearShifter = structs.CarState.GearShifter + + +def make_car_state(**overrides): + base = dict( + doorOpen=False, + seatbeltUnlatched=False, + gearShifter=GearShifter.drive, + cruiseState=SimpleNamespace(available=True, enabled=False, nonAdaptive=False), + cruiseFaultLateralMode=False, + espDisabled=False, + espActive=False, + stockFcw=False, + stockAeb=False, + stockLkas=False, + vEgo=15.0, + brakeHoldActive=False, + parkingBrake=False, + accFaulted=False, + steeringPressed=False, + steeringDisengage=False, + brakePressed=False, + standstill=False, + gasPressed=False, + vehicleSensorsInvalid=False, + invalidLkasSetting=False, + lowSpeedAlert=False, + buttonEnable=False, + buttonEvents=[], + steerFaultTemporary=False, + steerFaultPermanent=False, + blockPcmEnable=False, + ) + base.update(overrides) + return SimpleNamespace(**base) + + +def test_pcm_disable_suppressed_during_cruise_fault_lateral_mode(): + cp = SimpleNamespace( + brand="volkswagen", + openpilotLongitudinalControl=False, + minEnableSpeed=0.0, + pcmCruise=True, + carFingerprint="MOCK", + ) + events = CarSpecificEvents(cp) + + cs = make_car_state(cruiseFaultLateralMode=True) + cs_prev = make_car_state(cruiseState=SimpleNamespace(available=True, enabled=True, nonAdaptive=False)) + + out = events.update(cs, cs_prev, SimpleNamespace(actuators=SimpleNamespace(accel=0.0))) + + assert not out.has(EventName.pcmDisable) + + +def test_cruise_fault_lateral_mode_replaces_acc_faulted_alert(): + cp = SimpleNamespace( + brand="volkswagen", + openpilotLongitudinalControl=False, + minEnableSpeed=0.0, + pcmCruise=True, + carFingerprint="MOCK", + ) + events = CarSpecificEvents(cp) + + cs = make_car_state(accFaulted=True, cruiseFaultLateralMode=True) + cs_prev = make_car_state() + + out = events.update(cs, cs_prev, SimpleNamespace(actuators=SimpleNamespace(accel=0.0))) + + assert out.has(EventName.cruiseFaultLateralAllowed) + assert not out.has(EventName.accFaulted) + + +def test_acc_faulted_still_emitted_without_cruise_fault_lateral_mode(): + cp = SimpleNamespace( + brand="volkswagen", + openpilotLongitudinalControl=False, + minEnableSpeed=0.0, + pcmCruise=True, + carFingerprint="MOCK", + ) + events = CarSpecificEvents(cp) + + cs = make_car_state(accFaulted=True) + cs_prev = make_car_state() + + out = events.update(cs, cs_prev, SimpleNamespace(actuators=SimpleNamespace(accel=0.0))) + + assert out.has(EventName.accFaulted) + assert not out.has(EventName.cruiseFaultLateralAllowed) + + +def test_pcm_disable_still_emitted_without_cruise_fault_lateral_mode(): + cp = SimpleNamespace( + brand="volkswagen", + openpilotLongitudinalControl=False, + minEnableSpeed=0.0, + pcmCruise=True, + carFingerprint="MOCK", + ) + events = CarSpecificEvents(cp) + + cs = make_car_state() + cs_prev = make_car_state(cruiseState=SimpleNamespace(available=True, enabled=True, nonAdaptive=False)) + + out = events.update(cs, cs_prev, SimpleNamespace(actuators=SimpleNamespace(accel=0.0))) + + assert out.has(EventName.pcmDisable) diff --git a/iqpilot/selfdrive/car/tests/test_cruise_speed.py b/iqpilot/selfdrive/car/tests/test_cruise_speed.py new file mode 100644 index 000000000..c5782c9f2 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_cruise_speed.py @@ -0,0 +1,175 @@ +import pytest +import itertools +import numpy as np + +from parameterized import parameterized_class +from iqpilot.cereal import log +from iqpilot.selfdrive.car.cruise import VCruiseHelper, V_CRUISE_MIN, V_CRUISE_MAX, V_CRUISE_INITIAL, IMPERIAL_INCREMENT +from iqpilot.cereal import car, custom +from iqpilot.common.constants import CV +from iqpilot.selfdrive.test.longitudinal_maneuvers.maneuver import Maneuver + +ButtonEvent = car.CarState.ButtonEvent +ButtonType = car.CarState.ButtonEvent.Type + + +def run_cruise_simulation(cruise, e2e, personality, t_end=20.): + man = Maneuver( + '', + duration=t_end, + initial_speed=max(cruise - 1., 0.0), + lead_relevancy=True, + initial_distance_lead=100, + cruise_values=[cruise], + prob_lead_values=[0.0], + breakpoints=[0.], + e2e=e2e, + personality=personality, + ) + valid, output = man.evaluate() + assert valid + return output[-1, 3] + + +@parameterized_class(("e2e", "personality", "speed"), itertools.product( + [True, False], # e2e + log.LongitudinalPersonality.schema.enumerants, # personality + [5,35])) # speed +class TestCruiseSpeed: + def test_cruise_speed(self): + print(f'Testing {self.speed} m/s') + cruise_speed = float(self.speed) + + simulation_steady_state = run_cruise_simulation(cruise_speed, self.e2e, self.personality) + assert simulation_steady_state == pytest.approx(cruise_speed, abs=.01), f'Did not reach {self.speed} m/s' + + +# TODO: test pcmCruise and pcmCruiseSpeed +@parameterized_class(('pcm_cruise', 'pcm_cruise_speed'), [(False, True)]) +class TestVCruiseHelper: + def setup_method(self): + self.CP = car.CarParams(pcmCruise=self.pcm_cruise) + self.CP_IQ = custom.IQCarParams(pcmCruiseSpeed=self.pcm_cruise_speed) + self.v_cruise_helper = VCruiseHelper(self.CP, self.CP_IQ) + self.reset_cruise_speed_state() + + def reset_cruise_speed_state(self): + self.v_cruise_helper.params.put("IQE2ESetSpeedMode", 0) + self.v_cruise_helper.params.put_bool("IQE2ESetSpeedUseCurrent", False) + self.v_cruise_helper.params.put("IQE2ESetSpeedMph", 65) + self.v_cruise_helper.read_custom_set_speed_params() + # Two resets previous cruise speed + for _ in range(2): + self.v_cruise_helper.update_v_cruise(car.CarState(cruiseState={"available": False}), enabled=False, is_metric=False) + + def enable(self, v_ego, experimental_mode, iq_dynamic_mode): + # Simulates user pressing set with a current speed + self.v_cruise_helper.initialize_v_cruise(car.CarState(vEgo=v_ego), experimental_mode, iq_dynamic_mode) + + def test_adjust_speed(self): + """ + Asserts speed changes on falling edges of buttons. + """ + + self.enable(V_CRUISE_INITIAL * CV.KPH_TO_MS, False, False) + + for btn in (ButtonType.accelCruise, ButtonType.decelCruise): + for pressed in (True, False): + CS = car.CarState(cruiseState={"available": True}) + CS.buttonEvents = [ButtonEvent(type=btn, pressed=pressed)] + + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + assert pressed == (self.v_cruise_helper.v_cruise_kph == self.v_cruise_helper.v_cruise_kph_last) + + def test_rising_edge_enable(self): + """ + Some car interfaces may enable on rising edge of a button, + ensure we don't adjust speed if enabled changes mid-press. + """ + + # NOTE: enabled is always one frame behind the result from button press in controlsd + for enabled, pressed in ((False, False), + (False, True), + (True, False)): + CS = car.CarState(cruiseState={"available": True}) + CS.buttonEvents = [ButtonEvent(type=ButtonType.decelCruise, pressed=pressed)] + self.v_cruise_helper.update_v_cruise(CS, enabled=enabled, is_metric=False) + if pressed: + self.enable(V_CRUISE_INITIAL * CV.KPH_TO_MS, False, False) + + # Expected diff on enabling. Speed should not change on falling edge of pressed + assert not pressed == self.v_cruise_helper.v_cruise_kph == self.v_cruise_helper.v_cruise_kph_last + + def test_resume_in_standstill(self): + """ + Asserts we don't increment set speed if user presses resume/accel to exit cruise standstill. + """ + + self.enable(0, False, False) + + for standstill in (True, False): + for pressed in (True, False): + CS = car.CarState(cruiseState={"available": True, "standstill": standstill}) + CS.buttonEvents = [ButtonEvent(type=ButtonType.accelCruise, pressed=pressed)] + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + # speed should only update if not at standstill and button falling edge + should_equal = standstill or pressed + assert should_equal == (self.v_cruise_helper.v_cruise_kph == self.v_cruise_helper.v_cruise_kph_last) + + def test_set_gas_pressed(self): + """ + Asserts pressing set while enabled with gas pressed sets + the speed to the maximum of vEgo and current cruise speed. + """ + + for v_ego in np.linspace(0, 100, 101): + self.reset_cruise_speed_state() + self.enable(V_CRUISE_INITIAL * CV.KPH_TO_MS, False, False) + + # first decrement speed, then perform gas pressed logic + expected_v_cruise_kph = self.v_cruise_helper.v_cruise_kph - IMPERIAL_INCREMENT + expected_v_cruise_kph = max(expected_v_cruise_kph, v_ego * CV.MS_TO_KPH) # clip to min of vEgo + expected_v_cruise_kph = float(np.clip(round(expected_v_cruise_kph, 1), V_CRUISE_MIN, V_CRUISE_MAX)) + + CS = car.CarState(vEgo=float(v_ego), gasPressed=True, cruiseState={"available": True}) + CS.buttonEvents = [ButtonEvent(type=ButtonType.decelCruise, pressed=False)] + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + # TODO: fix skipping first run due to enabled on rising edge exception + if v_ego == 0.0: + continue + assert expected_v_cruise_kph == self.v_cruise_helper.v_cruise_kph + + def test_initialize_v_cruise(self): + """ + Asserts allowed cruise speeds on enabling with SET. + """ + + for experimental_mode in (True, False): + for iq_dynamic_mode in (True, False): + for v_ego in np.linspace(0, 100, 101): + self.reset_cruise_speed_state() + assert not self.v_cruise_helper.v_cruise_initialized + + self.enable(float(v_ego), experimental_mode, iq_dynamic_mode) + assert V_CRUISE_INITIAL <= self.v_cruise_helper.v_cruise_kph <= V_CRUISE_MAX + assert self.v_cruise_helper.v_cruise_initialized + + def test_iq_mode_fixed_set_speed(self): + self.v_cruise_helper.params.put("IQE2ESetSpeedMode", 1) + self.v_cruise_helper.params.put_bool("IQE2ESetSpeedUseCurrent", False) + self.v_cruise_helper.params.put("IQE2ESetSpeedMph", 72) + self.v_cruise_helper.read_custom_set_speed_params() + + self.enable(30 * CV.MPH_TO_MS, True, False) + assert self.v_cruise_helper.v_cruise_kph == int(round(72 * CV.MPH_TO_KPH)) + + def test_iq_mode_current_speed_override(self): + self.v_cruise_helper.params.put("IQE2ESetSpeedMode", 1) + self.v_cruise_helper.params.put_bool("IQE2ESetSpeedUseCurrent", True) + self.v_cruise_helper.params.put("IQE2ESetSpeedMph", 72) + self.v_cruise_helper.read_custom_set_speed_params() + + self.enable(47 * CV.MPH_TO_MS, True, False) + assert self.v_cruise_helper.v_cruise_kph == int(round(47 * CV.MPH_TO_KPH)) diff --git a/iqpilot/selfdrive/car/tests/test_docs.py b/iqpilot/selfdrive/car/tests/test_docs.py new file mode 100644 index 000000000..ba0f57d28 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_docs.py @@ -0,0 +1,27 @@ +import os + +from iqpilot.common.basedir import BASEDIR +from iqdbc.car.docs import generate_cars_md, get_all_car_docs +from iqdbc.lvbs.car.car_catalog import build_car_catalog +from iqpilot.selfdrive.debug.dump_car_docs import dump_car_docs +from iqpilot.selfdrive.debug.print_docs_diff import print_car_docs_diff +from iqpilot.selfdrive.car.docs import CARS_MD_TEMPLATE +from iqpilot.selfdrive.car.vehicle_catalog import load_catalog + + +class TestCarDocs: + @classmethod + def setup_class(cls): + cls.all_cars = get_all_car_docs() + + def test_generator(self): + generate_cars_md(self.all_cars, CARS_MD_TEMPLATE) + + def test_docs_diff(self): + dump_path = os.path.join(BASEDIR, "iqpilot", "selfdrive", "car", "tests", "cars_dump") + dump_car_docs(dump_path) + print_car_docs_diff(dump_path) + os.remove(dump_path) + + def test_vehicle_catalog(self): + assert load_catalog() == build_car_catalog() diff --git a/iqpilot/selfdrive/car/tests/test_helpers.py b/iqpilot/selfdrive/car/tests/test_helpers.py new file mode 100644 index 000000000..6b7b0067e --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_helpers.py @@ -0,0 +1,50 @@ +from dataclasses import dataclass +from enum import Enum + +import pytest + +from iqdbc.car import structs +from iqdbc.car.hyundai.values import HyundaiFlagsIQ + +from iqpilot.selfdrive.car.helpers import asdictref, convert_to_capnp + + +class SampleEnum(Enum): + value = 7 + + +@dataclass +class SampleStruct: + enum: SampleEnum + values: tuple[int, ...] + mapping: dict[str, list[SampleEnum]] + + +def test_convert_to_capnp_normalizes_enum_values(): + params = structs.IQCarParams(flags=HyundaiFlagsIQ.HAS_LFA_BUTTON) + assert asdictref(params)["flags"] == HyundaiFlagsIQ.HAS_LFA_BUTTON.value + assert convert_to_capnp(params).flags == HyundaiFlagsIQ.HAS_LFA_BUTTON.value + + +def test_asdictref_preserves_container_types_and_resolves_enums(): + source = SampleStruct(SampleEnum.value, (1, 2), {"items": [SampleEnum.value]}) + converted = asdictref(source) + assert converted == {"enum": 7, "values": (1, 2), "mapping": {"items": [7]}} + assert isinstance(converted["values"], tuple) + assert isinstance(converted["mapping"]["items"], list) + + +def test_asdictref_rejects_non_dataclass_values(): + with pytest.raises(TypeError, match="dataclass instances"): + asdictref(object()) + + +def test_convert_to_capnp_supports_iq_car_state(): + state = convert_to_capnp(structs.IQCarState()) + assert state.speedLimit == 0 + assert not state.accelPressed + + +def test_convert_to_capnp_rejects_unknown_dataclass(): + with pytest.raises(ValueError, match="Unsupported struct type"): + convert_to_capnp(SampleStruct(SampleEnum.value, (), {})) diff --git a/iqpilot/selfdrive/car/tests/test_learned_factor_persistence.py b/iqpilot/selfdrive/car/tests/test_learned_factor_persistence.py new file mode 100644 index 000000000..ed20244f3 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_learned_factor_persistence.py @@ -0,0 +1,119 @@ +import json +from types import SimpleNamespace + +from iqpilot.selfdrive.car.card import Car + + +class DummyParams: + def __init__(self): + self.values: dict[str, object] = {} + + def get(self, key: str): + return self.values.get(key) + + def put_nonblocking(self, key: str, value) -> None: + self.values[key] = value + + +class HondaLikeController: + def __init__(self): + self.gasfactor = 1.0 + self.windfactor = 1.0 + + +def make_car(controller): + car = object.__new__(Car) + car.params = DummyParams() + car.CI = SimpleNamespace(CC=controller) + car.CP = SimpleNamespace(carFingerprint="HONDA_CRV_6G") + return car + + +class TestLearnedFactorPersistence: + def test_save_then_seed_round_trip(self): + car = make_car(HondaLikeController()) + car.CI.CC.gasfactor = 1.37 + car.CI.CC.windfactor = 0.84 + car._save_learned_factors() + + fresh = make_car(HondaLikeController()) + fresh.params.values = car.params.values + fresh._seed_learned_factors() + assert fresh.CI.CC.gasfactor == 1.37 + assert fresh.CI.CC.windfactor == 0.84 + + def test_factors_keyed_per_fingerprint(self): + car = make_car(HondaLikeController()) + car.CI.CC.gasfactor = 2.0 + car._save_learned_factors() + + other = make_car(HondaLikeController()) + other.params.values = car.params.values + other.CP = SimpleNamespace(carFingerprint="HONDA_CIVIC_BOSCH") + other._seed_learned_factors() + assert other.CI.CC.gasfactor == 1.0 + + other.CI.CC.gasfactor = 0.5 + other._save_learned_factors() + stored = other.params.values["IQLongLearnedFactors"] + assert stored["HONDA_CRV_6G"]["gasfactor"] == 2.0 + assert stored["HONDA_CIVIC_BOSCH"]["gasfactor"] == 0.5 + + def test_seed_ignores_corrupt_or_nonfinite_values(self): + car = make_car(HondaLikeController()) + car.params.values["IQLongLearnedFactors"] = "not json" + car._seed_learned_factors() + assert car.CI.CC.gasfactor == 1.0 + + car.params.values["IQLongLearnedFactors"] = json.dumps({"HONDA_CRV_6G": {"gasfactor": float("nan"), "windfactor": "x"}}) + car._seed_learned_factors() + assert car.CI.CC.gasfactor == 1.0 + assert car.CI.CC.windfactor == 1.0 + + def test_noop_for_controllers_without_factors(self): + car = make_car(SimpleNamespace()) + car._seed_learned_factors() + car._save_learned_factors() + assert "IQLongLearnedFactors" not in car.params.values + + car = make_car(None) + car._seed_learned_factors() + car._save_learned_factors() + assert "IQLongLearnedFactors" not in car.params.values + + +class TestLearnedFactorRealParams: + """Round-trips through the actual params store so the pyx JSON type marshaling is exercised: + JSON params take dicts on put and come back parsed on get.""" + + def make_real_car(self, tmp_path, controller): + from iqpilot.common.params import Params + car = object.__new__(Car) + car.params = Params(str(tmp_path)) + car.CI = SimpleNamespace(CC=controller) + car.CP = SimpleNamespace(carFingerprint="HONDA_CIVIC_2022") + return car + + def test_save_then_seed_through_real_params(self, tmp_path): + import time + car = self.make_real_car(tmp_path, HondaLikeController()) + car.CI.CC.gasfactor = 1.31 + car.CI.CC.windfactor = 0.88 + car._save_learned_factors() + time.sleep(0.3) + + fresh = self.make_real_car(tmp_path, HondaLikeController()) + fresh._seed_learned_factors() + assert fresh.CI.CC.gasfactor == 1.31 + assert fresh.CI.CC.windfactor == 0.88 + + def test_repeated_saves_through_real_params(self, tmp_path): + import time + car = self.make_real_car(tmp_path, HondaLikeController()) + for value in (1.1, 1.2, 1.3): + car.CI.CC.gasfactor = value + car._save_learned_factors() + time.sleep(0.3) + fresh = self.make_real_car(tmp_path, HondaLikeController()) + fresh._seed_learned_factors() + assert fresh.CI.CC.gasfactor == 1.3 diff --git a/iqpilot/selfdrive/car/tests/test_longitudinal_mode_persistence.py b/iqpilot/selfdrive/car/tests/test_longitudinal_mode_persistence.py new file mode 100644 index 000000000..c035d4139 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_longitudinal_mode_persistence.py @@ -0,0 +1,38 @@ +from iqpilot.cereal import custom +from iqdbc.car import structs + +from iqpilot.selfdrive.car.interfaces import _cleanup_unsupported_params + + +class DummyParams: + def __init__(self): + self.removed: list[str] = [] + self.values: dict[str, object] = {} + + def remove(self, key: str) -> None: + self.removed.append(key) + + def get_bool(self, key: str) -> bool: + return bool(self.values.get(key, False)) + + def get(self, key: str, return_default: bool = False): + return self.values.get(key) + + def put(self, key: str, value) -> None: + self.values[key] = value + + +class TestLongitudinalModePersistence: + def test_iq_dynamic_mode_is_not_removed_when_openpilot_long_is_unavailable(self): + params = DummyParams() + cp = structs.CarParams() + cp.openpilotLongitudinalControl = False + cp.steerControlType = structs.CarParams.SteerControlType.torque + + cp_iq = custom.IQCarParams() + cp_iq.pcmCruiseSpeed = True + + _cleanup_unsupported_params(cp, cp_iq, params) + + assert "IQDynamicMode" not in params.removed + assert "LongIncrementsEnabled" in params.removed diff --git a/iqpilot/selfdrive/car/tests/test_models.py b/iqpilot/selfdrive/car/tests/test_models.py new file mode 100644 index 000000000..6045a9123 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_models.py @@ -0,0 +1,547 @@ +import time +import copy +import os +import pytest +import random +import unittest # noqa: TID251 +from collections import defaultdict, Counter +import hypothesis.strategies as st +from hypothesis import Phase, given, settings + +from iqdbc.car import DT_CTRL, gen_empty_fingerprint, structs +from iqdbc.can.parser import MAX_BAD_COUNTER +from iqdbc.car.can_definitions import CanData +from iqdbc.car.car_helpers import FRAME_FINGERPRINT, interfaces +from iqdbc.car.fingerprints import MIGRATION +from iqdbc.car.honda.values import CAR as HONDA, HondaFlags +from iqdbc.car.structs import car +from iqdbc.car.tests.routes import routes, CarTestRoute +from iqdbc.car.values import Platform +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.selfdrive.pandad import can_capnp_to_list +from iqpilot.selfdrive.test.helpers import read_segment_list +from iqpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT +from iqpilot.tools.lib.logreader import LogReader, LogsUnavailable, openpilotci_source, internal_source, comma_api_source +from iqpilot.tools.lib.route import SegmentName + +SafetyModel = car.CarParams.SafetyModel +SteerControlType = structs.CarParams.SteerControlType + +NUM_JOBS = int(os.environ.get("NUM_JOBS", "1")) +JOB_ID = int(os.environ.get("JOB_ID", "0")) +INTERNAL_SEG_LIST = os.environ.get("INTERNAL_SEG_LIST", "") +INTERNAL_SEG_CNT = int(os.environ.get("INTERNAL_SEG_CNT", "0")) +MAX_EXAMPLES = int(os.environ.get("MAX_EXAMPLES", "300")) +CI = os.environ.get("CI", None) is not None +RELAY_TRANSITION_TIMEOUT_US = 10_000_000 +PRIVATE_RUNTIME_BRANDS = {"tesla", "volkswagen"} +UNSUPPORTED_ROUTE_BRANDS = {"body"} +DASHCAM_ONLY_PLATFORMS = { + "BUICK_REGAL", + "GMC_YUKON", + "MAZDA_3", + "MAZDA_6", + "MAZDA_CX5", + "MAZDA_CX9", + "PSA_PEUGEOT_208", + "SUBARU_ASCENT_2023", + "SUBARU_CROSSTREK_HYBRID", + "SUBARU_FORESTER_2022", + "SUBARU_OUTBACK_2023", +} + + +@pytest.fixture(autouse=True) +def controls_ready_params(openpilot_function_fixture, tmp_path): + root = str(tmp_path) + os.mkdir(os.path.join(root, "d_tmp")) + os.symlink("d_tmp", os.path.join(root, "d")) + os.environ["PARAMS_ROOT"] = root + Params().put_bool("ControlsReady", True) + yield + + +def normalize_can_buses(can: tuple[int, list[CanData]], raw_can_keys: set[tuple[int, int]]) -> tuple[int, list[CanData]]: + timestamp, messages = can + return timestamp, [CanData(msg.address, msg.dat, msg.src % 128) for msg in messages + if msg.src < 128 or (msg.address, msg.src % 128) not in raw_can_keys] + + +def get_test_cases() -> list[tuple[str, CarTestRoute | None]]: + test_cases = [] + if not len(INTERNAL_SEG_LIST): + for i, route in enumerate(sorted(routes, key=lambda item: (str(item.car_model), item.route, item.segment or -1))): + brand = interfaces[str(route.car_model)].__module__.split(".")[-2] + if brand not in PRIVATE_RUNTIME_BRANDS | UNSUPPORTED_ROUTE_BRANDS and i % NUM_JOBS == JOB_ID: + test_cases.append((str(route.car_model), route)) + + else: + segment_list = read_segment_list(os.path.join(BASEDIR, INTERNAL_SEG_LIST)) + segment_list = random.sample(segment_list, INTERNAL_SEG_CNT or len(segment_list)) + for platform, segment in segment_list: + platform = MIGRATION.get(platform, platform) + segment_name = SegmentName(segment) + test_cases.append((platform, CarTestRoute(segment_name.route_name.canonical_name, platform, + segment=segment_name.segment_num))) + return test_cases + + +@pytest.mark.slow +@pytest.mark.shared_download_cache +@pytest.mark.xdist_group_class_property('test_route') +class CarModelTestBase(unittest.TestCase): + __test__ = False + platform: Platform | None = None + test_route: CarTestRoute | None = None + + can_msgs: list[tuple[int, list[CanData]]] + fingerprint: dict[int, dict[int, int]] + elm_frame: int | None + car_safety_mode_frame: int | None + + @classmethod + def get_testing_data_from_logreader(cls, lr): + car_fw = [] + can_msgs = [] + cls.elm_frame = None + cls.car_safety_mode_frame = None + cls.fingerprint = gen_empty_fingerprint() + alpha_long = False + for msg in lr: + if msg.which() == "can": + can = can_capnp_to_list((msg.as_builder().to_bytes(),))[0] + can_msgs.append((can[0], [CanData(*can) for can in can[1]])) + if len(can_msgs) <= FRAME_FINGERPRINT: + for m in msg.can: + if m.src < 64: + cls.fingerprint[m.src][m.address] = len(m.dat) + + elif msg.which() == "carParams": + car_fw = msg.carParams.carFw + if msg.carParams.openpilotLongitudinalControl: + alpha_long = True + if cls.platform is None: + live_fingerprint = msg.carParams.carFingerprint + cls.platform = MIGRATION.get(live_fingerprint, live_fingerprint) + + # Log which can frame the panda safety mode left ELM327, for CAN validity checks + elif msg.which() == 'pandaStates': + for ps in msg.pandaStates: + if cls.elm_frame is None and ps.safetyModel != SafetyModel.elm327: + cls.elm_frame = len(can_msgs) + if cls.car_safety_mode_frame is None and ps.safetyModel not in \ + (SafetyModel.elm327, SafetyModel.noOutput): + cls.car_safety_mode_frame = len(can_msgs) + + elif msg.which() == 'pandaStateDEPRECATED': + if cls.elm_frame is None and msg.pandaStateDEPRECATED.safetyModel != SafetyModel.elm327: + cls.elm_frame = len(can_msgs) + if cls.car_safety_mode_frame is None and msg.pandaStateDEPRECATED.safetyModel not in \ + (SafetyModel.elm327, SafetyModel.noOutput): + cls.car_safety_mode_frame = len(can_msgs) + + assert len(can_msgs) > int(50 / DT_CTRL), "no can data found" + return car_fw, can_msgs, alpha_long + + @classmethod + def get_testing_data(cls): + test_segs = (2, 1, 0) + if cls.test_route.segment is not None: + test_segs = (cls.test_route.segment,) + + for seg in test_segs: + segment_range = f"{cls.test_route.route}/{seg}" + + try: + sources = [internal_source] if len(INTERNAL_SEG_LIST) else [openpilotci_source, comma_api_source] + lr = LogReader(segment_range, sources=sources, sort_by_time=True) + return cls.get_testing_data_from_logreader(lr) + except (LogsUnavailable, AssertionError): + pass + + raise Exception(f"Route: {repr(cls.test_route.route)} with segments: {test_segs} not found or no CAN msgs found. Is it uploaded and public?") + + + @classmethod + def setUpClass(cls): + car_fw, cls.can_msgs, alpha_long = cls.get_testing_data() + cls.raw_can_keys = {(msg.address, msg.src) for _, messages in cls.can_msgs for msg in messages if msg.src < 128} + + # if relay is expected to be open in the route + cls.openpilot_enabled = cls.car_safety_mode_frame is not None + + cls.CarInterface = interfaces[cls.platform] + cls.CP = cls.CarInterface.get_params(cls.platform, cls.fingerprint, car_fw, alpha_long, False, docs=False) + cls.CP_IQ = cls.CarInterface.get_params_iq(cls.CP, cls.platform, cls.fingerprint, car_fw, alpha_long, False, docs=False) + assert cls.CP + assert cls.CP_IQ + assert cls.CP.carFingerprint == cls.platform + + os.environ["COMMA_CACHE"] = DEFAULT_DOWNLOAD_CACHE_ROOT + + @classmethod + def tearDownClass(cls): + del cls.can_msgs + + def setUp(self): + from iqdbc.safety.tests.libsafety import libsafety_py + + self.libsafety_py = libsafety_py + self.CI = self.CarInterface(self.CP.copy(), copy.deepcopy(self.CP_IQ)) + assert self.CI + + # TODO: check safetyModel is in release panda build + self.safety = libsafety_py.libsafety + + safety_param_iq = self.CP_IQ.iqSafetyFlags + self.safety.set_current_safety_param_iq(safety_param_iq) + + cfg = self.CP.safetyConfigs[-1] + set_status = self.safety.set_safety_hooks(cfg.safetyModel.raw, cfg.safetyParam) + self.assertEqual(0, set_status, f"failed to set safetyModel {cfg}") + self.safety.init_tests() + + def test_car_params(self): + self.assertFalse(self.CP.dashcamOnly) + + # make sure car params are within a valid range + self.assertGreater(self.CP.mass, 1) + + if self.CP.steerControlType != SteerControlType.angle: + tuning = self.CP.lateralTuning.which() + if tuning == 'pid': + self.assertTrue(len(self.CP.lateralTuning.pid.kpV)) + elif tuning == 'torque': + self.assertTrue(self.CP.lateralTuning.torque.latAccelFactor > 0) + else: + raise Exception("unknown tuning") + + def test_car_interface(self): + can_invalid_cnt = 0 + invalid_reasons = Counter() + CC = structs.CarControl().as_reader() + CC_IQ = structs.IQCarControl() + + for i, msg in enumerate(self.can_msgs): + CS, _ = self.CI.update(normalize_can_buses(msg, self.raw_can_keys)) + self.CI.apply(CC, CC_IQ, msg[0]) + + # wait max of 2s for low frequency msgs to be seen + if i > 250: + can_invalid_cnt += not CS.canValid + if not CS.canValid: + for bus, cp in self.CI.can_parsers.items(): + bus_timeout = cp.bus_timeout + for state in cp.message_states.values(): + if state.counter_fail >= MAX_BAD_COUNTER: + invalid_reasons[f"{bus}:{state.name}:counter"] += 1 + if not state.valid(cp._last_update_nanos, bus_timeout): + invalid_reasons[f"{bus}:{state.name}:timeout"] += 1 + + self.assertEqual(can_invalid_cnt, 0, dict(invalid_reasons)) + + def test_radar_interface(self): + RI = self.CarInterface.RadarInterface(self.CP, self.CP_IQ) + assert RI + + # Since OBD port is multiplexed to bus 1 (commonly radar bus) while fingerprinting, + # start parsing CAN messages after we've left ELM mode and can expect CAN traffic + error_cnt = 0 + for i, msg in enumerate(self.can_msgs[self.elm_frame:]): + rr: structs.RadarData | None = RI.update(normalize_can_buses(msg, self.raw_can_keys)) + if rr is not None and i > 50: + error_cnt += rr.errors.canError + self.assertEqual(error_cnt, 0) + + def test_panda_safety_rx_checks(self): + start_ts = self.can_msgs[0][0] + + failed_addrs = Counter() + last_relay_malfunction_us = 0. + relay_open_inferred = False + for can_idx, can in enumerate(self.can_msgs): + # update panda timer + t = (can[0] - start_ts) / 1e3 + self.safety.set_timer(int(t)) + + # run all msgs through the safety RX hook + for msg in can[1]: + if msg.src >= 64: + continue + + to_send = self.libsafety_py.make_CANPacket(msg.address, msg.src % 4, msg.dat) + if self.safety.safety_rx_hook(to_send) != 1: + failed_addrs[hex(msg.address)] += 1 + + relay_malfunction = self.safety.get_relay_malfunction() + for msg in can[1]: + if msg.src >= 128 and (msg.address, msg.src % 128) not in self.raw_can_keys: + to_send = self.libsafety_py.make_CANPacket(msg.address, msg.src % 4, msg.dat) + self.safety.safety_rx_hook(to_send) + self.safety.set_relay_malfunction(relay_malfunction) + + # ensure all msgs defined in the addr checks are valid + self.safety.safety_tick_current_safety_config() + if t > 1e6: + self.assertTrue(self.safety.safety_config_valid()) + + if self.car_safety_mode_frame is not None: + if can_idx >= self.car_safety_mode_frame: + self.assertFalse(self.safety.get_relay_malfunction()) + else: + self.safety.set_relay_malfunction(False) + elif relay_open_inferred: + self.assertFalse(self.safety.get_relay_malfunction()) + elif self.safety.get_relay_malfunction(): + last_relay_malfunction_us = t + self.safety.set_relay_malfunction(False) + elif t - last_relay_malfunction_us > RELAY_TRANSITION_TIMEOUT_US: + relay_open_inferred = True + else: + self.safety.set_relay_malfunction(False) + + self.assertFalse(len(failed_addrs), f"panda safety RX check failed: {failed_addrs}") + + # ensure RX checks go invalid after small time with no traffic + self.safety.set_timer(int(t + (2*1e6))) + self.safety.safety_tick_current_safety_config() + self.assertFalse(self.safety.safety_config_valid()) + + def test_panda_safety_tx_cases(self, data=None): + """Asserts we can tx common messages""" + def test_car_controller(car_control, car_control_iq): + def run_controller(CI): + now_nanos = 0 + msgs_sent = 0 + for _ in range(round(10.0 / DT_CTRL)): + CI.update([]) + _, sendcan = CI.apply(car_control, car_control_iq, now_nanos) + now_nanos += DT_CTRL * 1e9 + msgs_sent += len(sendcan) + for addr, dat, bus in sendcan: + to_send = self.libsafety_py.make_CANPacket(addr, bus % 4, dat) + self.assertTrue(self.safety.safety_tx_hook(to_send), (addr, dat, bus)) + return msgs_sent + + CI = self.CarInterface(self.CP, self.CP_IQ) + msgs_sent = run_controller(CI) + if msgs_sent == 0: + CI = self.CarInterface(self.CP, self.CP_IQ) + for can in self.can_msgs[self.elm_frame:]: + CI.update(normalize_can_buses(can, self.raw_can_keys)) + msgs_sent = run_controller(CI) + + # Make sure we attempted to send messages + self.assertGreater(msgs_sent, 50) + + # Make sure we can send all messages while inactive + CC = structs.CarControl() + CC_IQ = structs.IQCarControl() + test_car_controller(CC.as_reader(), CC_IQ) + + # Test cancel + general messages (controls_allowed=False & cruise_engaged=True) + self.safety.set_cruise_engaged_prev(True) + CC = structs.CarControl(cruiseControl=structs.CarControl.CruiseControl(cancel=True)) + test_car_controller(CC.as_reader(), CC_IQ) + + # Test resume + general messages (controls_allowed=True & cruise_engaged=True) + self.safety.set_controls_allowed(True) + CC = structs.CarControl(cruiseControl=structs.CarControl.CruiseControl(resume=True)) + test_car_controller(CC.as_reader(), CC_IQ) + + # Skip stdout/stderr capture with pytest, causes elevated memory usage + @pytest.mark.nocapture + @settings(max_examples=MAX_EXAMPLES, deadline=None, + phases=(Phase.reuse, Phase.generate, Phase.shrink)) + @given(data=st.data()) + def test_panda_safety_carstate_fuzzy(self, data): + """ + For each example, pick a random CAN message on the bus and fuzz its data, + checking for panda state mismatches. + """ + + valid_addrs = [(addr, bus, size) for bus, addrs in self.fingerprint.items() for addr, size in addrs.items()] + address, bus, size = data.draw(st.sampled_from(valid_addrs)) + + msg_strategy = st.binary(min_size=size, max_size=size) + msgs = data.draw(st.lists(msg_strategy, min_size=20)) + + vehicle_speed_seen = self.CP.steerControlType == SteerControlType.angle and not self.CP.notCar + + for n, dat in enumerate(msgs): + # due to panda updating state selectively, only edges are expected to match + # TODO: warm up CarState with real CAN messages to check edge of both sources + # (eg. toyota's gasPressed is the inverse of a signal being set) + prev_panda_gas = self.safety.get_gas_pressed_prev() + prev_panda_brake = self.safety.get_brake_pressed_prev() + prev_panda_regen_braking = self.safety.get_regen_braking_prev() + prev_panda_steering_disengage = self.safety.get_steering_disengage_prev() + prev_panda_vehicle_moving = self.safety.get_vehicle_moving() + prev_panda_vehicle_speed_min = self.safety.get_vehicle_speed_min() + prev_panda_vehicle_speed_max = self.safety.get_vehicle_speed_max() + prev_panda_cruise_engaged = self.safety.get_cruise_engaged_prev() + prev_panda_acc_main_on = self.safety.get_acc_main_on() + + to_send = self.libsafety_py.make_CANPacket(address, bus, dat) + self.safety.safety_rx_hook(to_send) + + can = [(int(time.monotonic() * 1e9), [CanData(address=address, dat=dat, src=bus)])] + CS, _ = self.CI.update(can) + if n < 5: # CANParser warmup time + continue + + if self.safety.get_gas_pressed_prev() != prev_panda_gas: + self.assertEqual(CS.gasPressed, self.safety.get_gas_pressed_prev()) + + if self.safety.get_brake_pressed_prev() != prev_panda_brake: + # TODO: remove this exception once this mismatch is resolved + brake_pressed = CS.brakePressed + if CS.brakePressed and not self.safety.get_brake_pressed_prev(): + if self.CP.carFingerprint in (HONDA.HONDA_PILOT, HONDA.HONDA_RIDGELINE) and CS.brake > 0.05: + brake_pressed = False + + self.assertEqual(brake_pressed, self.safety.get_brake_pressed_prev()) + + if self.safety.get_regen_braking_prev() != prev_panda_regen_braking: + self.assertEqual(CS.regenBraking, self.safety.get_regen_braking_prev()) + + if self.safety.get_steering_disengage_prev() != prev_panda_steering_disengage: + self.assertEqual(CS.steeringDisengage, self.safety.get_steering_disengage_prev()) + + if self.safety.get_vehicle_moving() != prev_panda_vehicle_moving and not self.CP.notCar: + self.assertEqual(not CS.standstill, self.safety.get_vehicle_moving()) + + # check vehicle speed if angle control car or available + if self.safety.get_vehicle_speed_min() > 0 or self.safety.get_vehicle_speed_max() > 0: + vehicle_speed_seen = True + + if vehicle_speed_seen and (self.safety.get_vehicle_speed_min() != prev_panda_vehicle_speed_min or + self.safety.get_vehicle_speed_max() != prev_panda_vehicle_speed_max): + v_ego_raw = CS.vEgoRaw / self.CP.wheelSpeedFactor + self.assertFalse(v_ego_raw > (self.safety.get_vehicle_speed_max() + 1e-3) or + v_ego_raw < (self.safety.get_vehicle_speed_min() - 1e-3)) + + if not (self.CP.brand == "honda" and not (self.CP.flags & HondaFlags.BOSCH)): + if self.safety.get_cruise_engaged_prev() != prev_panda_cruise_engaged: + self.assertEqual(CS.cruiseState.enabled, self.safety.get_cruise_engaged_prev()) + + if self.CP.brand == "honda": + if self.safety.get_acc_main_on() != prev_panda_acc_main_on: + self.assertEqual(CS.cruiseState.available, self.safety.get_acc_main_on()) + + def test_panda_safety_carstate(self): + """ + Assert that panda safety matches openpilot's carState + """ + # warm up pass, as initial states may be different + for can in self.can_msgs[:300]: + self.CI.update(normalize_can_buses(can, self.raw_can_keys)) + for msg in filter(lambda m: m.src < 64, can[1]): + to_send = self.libsafety_py.make_CANPacket(msg.address, msg.src % 4, msg.dat) + self.safety.safety_rx_hook(to_send) + + controls_allowed_prev = False + CS_prev = car.CarState.new_message() + checks = defaultdict(int) + standstill_mismatches = [] + vehicle_speed_seen = self.CP.steerControlType == SteerControlType.angle and not self.CP.notCar + for idx, can in enumerate(self.can_msgs[300:]): + CS, _ = self.CI.update(normalize_can_buses(can, self.raw_can_keys)) + CS = CS.as_reader() + for msg in filter(lambda m: m.src < 64, can[1]): + to_send = self.libsafety_py.make_CANPacket(msg.address, msg.src % 4, msg.dat) + ret = self.safety.safety_rx_hook(to_send) + self.assertEqual(1, ret, f"safety rx failed ({ret=}): {(msg.address, msg.src % 4)}") + + # Skip first frame so CS_prev is properly initialized + if idx == 0: + CS_prev = CS + # Button may be left pressed in warm up period + if not self.CP.pcmCruise: + self.safety.set_controls_allowed(0) + continue + + # TODO: check rest of panda's carstate (steering, ACC main on, etc.) + + checks['gasPressed'] += CS.gasPressed != self.safety.get_gas_pressed_prev() + standstill_mismatch = CS.standstill == self.safety.get_vehicle_moving() + checks['standstill'] += standstill_mismatch and not self.CP.notCar + if standstill_mismatch and len(standstill_mismatches) < 10: + standstill_mismatches.append((idx, CS.standstill, self.safety.get_vehicle_moving(), CS.vEgoRaw, + self.safety.get_vehicle_speed_min(), self.safety.get_vehicle_speed_max())) + + # check vehicle speed if angle control car or available + if self.safety.get_vehicle_speed_min() > 0 or self.safety.get_vehicle_speed_max() > 0: + vehicle_speed_seen = True + + if vehicle_speed_seen: + v_ego_raw = CS.vEgoRaw / self.CP.wheelSpeedFactor + checks['vEgoRaw'] += (v_ego_raw > (self.safety.get_vehicle_speed_max() + 1e-3) or + v_ego_raw < (self.safety.get_vehicle_speed_min() - 1e-3)) + + # TODO: remove this exception once this mismatch is resolved + brake_pressed = CS.brakePressed + if CS.brakePressed and not self.safety.get_brake_pressed_prev(): + if self.CP.carFingerprint in (HONDA.HONDA_PILOT, HONDA.HONDA_RIDGELINE) and CS.brake > 0.05: + brake_pressed = False + checks['brakePressed'] += brake_pressed != self.safety.get_brake_pressed_prev() + checks['regenBraking'] += CS.regenBraking != self.safety.get_regen_braking_prev() + checks['steeringDisengage'] += CS.steeringDisengage != self.safety.get_steering_disengage_prev() + + if self.CP.pcmCruise: + # On most pcmCruise cars, openpilot's state is always tied to the PCM's cruise state. + # On Honda Nidec, we always engage on the rising edge of the PCM cruise state, but + # openpilot brakes to zero even if the min ACC speed is non-zero (i.e. the PCM disengages). + if self.CP.brand == "honda" and not (self.CP.flags & HondaFlags.BOSCH): + # only the rising edges are expected to match + if CS.cruiseState.enabled and not CS_prev.cruiseState.enabled: + checks['controlsAllowed'] += not self.safety.get_controls_allowed() + else: + checks['controlsAllowed'] += not CS.cruiseState.enabled and self.safety.get_controls_allowed() + + # TODO: fix notCar mismatch + if not self.CP.notCar: + checks['cruiseState'] += CS.cruiseState.enabled != self.safety.get_cruise_engaged_prev() + else: + # Check for user button enable on rising edge of controls allowed + button_enable = CS.buttonEnable and (not CS.brakePressed or CS.standstill) + mismatch = button_enable != (self.safety.get_controls_allowed() and not controls_allowed_prev) + checks['controlsAllowed'] += mismatch + controls_allowed_prev = self.safety.get_controls_allowed() + if button_enable and not mismatch: + self.safety.set_controls_allowed(False) + + if self.CP.brand == "honda": + checks['mainOn'] += CS.cruiseState.available != self.safety.get_acc_main_on() + + CS_prev = CS + + failed_checks = {k: v for k, v in checks.items() if v > 0} + self.assertFalse(len(failed_checks), + f"panda safety doesn't agree with openpilot: {failed_checks}, standstill={standstill_mismatches}") + + +class DashcamCarModelTestBase(CarModelTestBase): + __test__ = False + test_panda_safety_rx_checks = None + test_panda_safety_tx_cases = None + test_panda_safety_carstate_fuzzy = None + test_panda_safety_carstate = None + + def test_car_params(self): + self.assertTrue(self.CP.dashcamOnly) + + +for case_index, (case_platform, case_route) in enumerate(get_test_cases()): + case_name = f"TestCarModel_{case_index}_{case_platform}" + base = DashcamCarModelTestBase if case_platform in DASHCAM_ONLY_PLATFORMS else CarModelTestBase + globals()[case_name] = type(case_name, (base,), { + "__test__": True, + "platform": case_platform, + "test_route": case_route, + }) + + +if __name__ == "__main__": + unittest.main() diff --git a/iqpilot/selfdrive/car/tests/test_models_segs.txt b/iqpilot/selfdrive/car/tests/test_models_segs.txt new file mode 100644 index 000000000..d805ce7d8 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_models_segs.txt @@ -0,0 +1,3884 @@ +# HONDA ODYSSEY 2018 +0ffff9faf2699ebc|2023-06-15--14-19-40--3 +# HONDA ODYSSEY 2018 +0c21c391abd382af|2023-07-17--19-49-46--12 +# HONDA ODYSSEY 2018 +0c23034a3a1e7bf4|2023-07-22--12-15-36--37 +# HONDA ODYSSEY 2018 +1b83b62ce1e15374|2023-07-24--16-56-02--166 +# HONDA ODYSSEY 2018 +0494ab1688baf0d1|2023-07-12--12-59-45--18 +# HONDA ODYSSEY 2018 +10702b68bb2db4f7|2023-07-12--09-09-08--24 +# HONDA ODYSSEY 2018 +349a10da75da84b3|2023-07-12--05-20-10--17 +# HONDA ODYSSEY 2018 +3eb25233bf8777b2|2023-08-03--12-55-23--19 +# HONDA ODYSSEY 2018 +4480efadd4e5e9b0|2023-07-31--18-14-01--20 +# HONDA ODYSSEY 2018 +568f8a1ce998fe8c|2023-05-15--18-09-35--3 +# HONDA ODYSSEY 2018 +564e1c4005971631|2023-07-15--21-26-58--9 +# HONDA ODYSSEY 2018 +5a28fb7518234651|2023-07-16--10-05-04--20 +# HONDA ODYSSEY 2018 +5de06f504727ef4e|2023-05-16--13-44-26--76 +# HONDA ODYSSEY 2018 +6da2ceb7bf6a818c|2023-05-24--16-27-24--38 +# HONDA ODYSSEY 2018 +6d3b5e3ce824a6be|2023-07-21--09-19-25--2 +# HONDA ODYSSEY 2018 +7074dfeeffbb7f3b|2023-08-07--08-42-57--3 +# HONDA ODYSSEY 2018 +761e1503448b32d5|2023-07-04--15-25-15--9 +# HONDA ODYSSEY 2018 +76b6bcf9925e9293|2023-07-15--10-36-05--31 +# HONDA ODYSSEY 2018 +7a7eba6f9ce36254|2023-07-16--16-28-27--7 +# HONDA ODYSSEY 2018 +772b833c28f493b5|2023-06-04--10-39-28--23 +# HONDA ODYSSEY 2018 +8906faebfc695953|2023-07-01--10-35-06--1 +# HONDA ODYSSEY 2018 +89ae461c07c586a3|2023-07-21--12-55-44--4 +# HONDA ODYSSEY 2018 +8eb3d1f10274ac44|2023-05-10--05-26-26--28 +# HONDA ODYSSEY 2018 +9954025f3a2aec2d|2023-06-16--14-15-08--2 +# HONDA ODYSSEY 2018 +a3636d74d9353700|2023-08-05--11-59-10--56 +# HONDA ODYSSEY 2018 +a27fe4e91d6e73c8|2023-05-31--20-34-59--2 +# HONDA ODYSSEY 2018 +aa7176d108cb2f97|2023-05-17--11-01-55--1 +# HONDA ODYSSEY 2018 +b288b21f47092c68|2023-06-23--21-09-10--7 +# HONDA ODYSSEY 2018 +b95acf45b72e104d|2023-07-10--08-01-29--11 +# HONDA ODYSSEY 2018 +b83fc39362bdde40|2023-05-15--09-42-06--9 +# HONDA ODYSSEY 2018 +bdc4ffbeb0ae5239|2023-05-11--17-52-21--3 +# HONDA ODYSSEY 2018 +c57d8a1adaecd30e|2023-07-09--21-29-19--70 +# HONDA ODYSSEY 2018 +c7fa6fb6f4d42407|2023-07-30--21-31-47--3 +# HONDA ODYSSEY 2018 +d0d197a10408c839|2023-05-13--16-17-45--67 +# HONDA ODYSSEY 2018 +e1aa4eae17f7b626|2023-06-06--16-12-33--1 +# HONDA ODYSSEY 2018 +e462034ac9e0c71d|2023-07-28--16-31-10--37 +# HONDA ODYSSEY 2018 +e67fa35fcc6db9d5|2023-07-22--17-19-19--28 +# HONDA ODYSSEY 2018 +f30eee173ffa893d|2023-05-16--19-43-43--31 +# HONDA ODYSSEY 2018 +f77dffd74248543d|2023-06-05--21-15-01--39 +# HONDA ODYSSEY 2018 +fa0bfc645891d426|2023-06-19--15-41-01--10 +# SUBARU FORESTER 2019 +1589151a309c433c|2023-05-24--17-23-34--51 +# SUBARU FORESTER 2019 +2caa16bfdc10557f|2023-07-17--06-33-02--17 +# SUBARU FORESTER 2019 +382f4ac8109f707f|2023-06-02--17-38-42--2 +# SUBARU FORESTER 2019 +8fc4e96c0d82e152|2023-08-03--07-28-17--6 +# SUBARU FORESTER 2019 +9227902ca7eb7bba|2023-07-31--13-51-49--118 +# SUBARU FORESTER 2019 +9a3079fb5c491ea5|2023-07-24--06-10-15--22 +# SUBARU FORESTER 2019 +a447729c1d15ff89|2023-07-31--06-59-17--2 +# SUBARU FORESTER 2019 +a752a19628873b10|2023-06-23--06-07-53--7 +# SUBARU FORESTER 2019 +ace607260543d257|2023-06-25--16-30-06--38 +# SUBARU FORESTER 2019 +fe3d890194b380ae|2023-06-01--19-39-37--120 +# TOYOTA RAV4 2019 +2308c55920b6c000|2023-07-01--18-34-43--21 +# TOYOTA RAV4 2019 +23562c9692a54321|2023-06-26--20-58-17--5 +# TOYOTA RAV4 2019 +1df2464a11c3caa7|2023-07-27--11-55-45--2 +# TOYOTA RAV4 2019 +1da6142d55922568|2023-05-21--19-08-27--17 +# TOYOTA RAV4 2019 +1930f57e827a5277|2023-06-18--09-30-23--7 +# TOYOTA RAV4 2019 +1c05783affe6641f|2023-05-28--09-51-01--28 +# TOYOTA RAV4 2019 +12913b66ea1ba32c|2023-08-02--12-35-55--14 +# TOYOTA RAV4 2019 +17e30e35ce70aa27|2023-06-12--05-53-27--13 +# TOYOTA RAV4 2019 +0559b34634b98e40|2023-05-26--19-07-54--10 +# TOYOTA RAV4 2019 +1523b70b49465492|2023-07-07--15-35-52--26 +# TOYOTA RAV4 2019 +131b0198e811cbaf|2023-05-10--19-45-30--1 +# TOYOTA RAV4 2019 +1aa9f62e2da571ae|2023-06-06--16-15-53--12 +# TOYOTA RAV4 2019 +06c6a866f247ccd3|2023-07-11--17-20-33--1 +# TOYOTA RAV4 2019 +1ca69541b8d83867|2023-07-18--13-20-11--63 +# TOYOTA RAV4 2019 +1c063541db21a08a|2023-05-18--20-01-46--158 +# TOYOTA RAV4 2019 +222b4aa34efc150b|2023-07-06--07-11-01--18 +# TOYOTA RAV4 2019 +25c96345c4ae0f5f|2023-05-28--13-48-48--44 +# TOYOTA RAV4 2019 +183ed80ffd5de6df|2023-05-19--09-54-02--108 +# TOYOTA RAV4 2019 +0835a20d4c688b4b|2023-05-21--21-06-46--101 +# TOYOTA RAV4 2019 +294c4257370dcd7f|2023-07-16--22-03-45--55 +# TOYOTA RAV4 2019 +013d89e3119a61fa|2023-07-27--19-28-55--1 +# TOYOTA RAV4 2019 +0111bbc17b5fc829|2023-07-22--15-33-17--3 +# TOYOTA RAV4 2019 +27fbf8f57ad1ed35|2023-07-25--03-04-13--5 +# TOYOTA RAV4 2019 +11e905ad4a26f7cf|2023-07-19--17-16-34--2 +# TOYOTA RAV4 2019 +076e5dea58433d1b|2023-05-30--14-28-07--99 +# TOYOTA RAV4 2019 +2d76c29b8aa236f4|2023-05-10--20-14-29--5 +# TOYOTA RAV4 2019 +31a0911d03035419|2023-06-11--16-24-31--3 +# TOYOTA RAV4 2019 +33c48660a967984c|2023-07-15--12-09-46--27 +# TOYOTA RAV4 2019 +334cffe17908547f|2023-07-05--19-08-58--175 +# TOYOTA RAV4 2019 +3550e1127d042e0c|2023-05-20--07-41-42--17 +# TOYOTA RAV4 2019 +3d77767f8c063017|2023-07-26--08-07-41--3 +# TOYOTA RAV4 2019 +3ecc8a00642fb457|2023-07-07--15-00-35--1 +# TOYOTA RAV4 2019 +4031a71d2f2bbf41|2023-06-24--21-44-33--19 +# TOYOTA RAV4 2019 +3dc04fa00e9b54d4|2023-07-10--20-45-54--20 +# TOYOTA RAV4 2019 +41f0e37bcb089214|2023-05-15--16-06-13--7 +# TOYOTA RAV4 2019 +4501ab837e09a1c6|2023-07-29--10-06-44--27 +# TOYOTA RAV4 2019 +430cfb7ed591a94b|2023-05-11--09-51-06--4 +# TOYOTA RAV4 2019 +43d464c559ee7b80|2023-08-02--09-27-58--26 +# TOYOTA RAV4 2019 +45bd1475c3f373bf|2023-07-17--07-09-41--42 +# TOYOTA RAV4 2019 +4d059401f47cf0b3|2023-05-13--12-01-17--9 +# TOYOTA RAV4 2019 +59e0e393764bc46b|2023-07-02--13-33-24--40 +# TOYOTA RAV4 2019 +595291c68fb8e6ea|2023-06-08--09-48-19--28 +# TOYOTA RAV4 2019 +5a62b93c7f9af2c9|2023-06-14--20-12-16--5 +# TOYOTA RAV4 2019 +5a9c05e4b4e221ba|2023-06-30--07-08-38--33 +# TOYOTA RAV4 2019 +5ac3d4195844832a|2023-05-11--08-10-51--15 +# TOYOTA RAV4 2019 +5ce8412c1359aee9|2023-06-04--01-23-21--11 +# TOYOTA RAV4 2019 +628fd36bec15e0fb|2023-06-27--07-40-01--6 +# TOYOTA RAV4 2019 +66ec82e487f41877|2023-06-08--07-57-18--2 +# TOYOTA RAV4 2019 +643e2c33f76301ed|2023-07-13--11-28-53--1 +# TOYOTA RAV4 2019 +734696450d800618|2023-08-04--23-17-18--8 +# TOYOTA RAV4 2019 +7ca260f9516f6b11|2023-05-28--11-43-26--193 +# TOYOTA RAV4 2019 +80c09a7a12eeea03|2023-05-27--12-27-44--10 +# TOYOTA RAV4 2019 +81ef68582345921f|2023-06-18--14-19-57--13 +# TOYOTA RAV4 2019 +7a6d59eb02cb9e4f|2023-08-04--07-49-50--2 +# TOYOTA RAV4 2019 +87d791b5f816cb1a|2023-07-17--12-47-30--6 +# TOYOTA RAV4 2019 +850119b3a36f6308|2023-05-28--16-46-06--10 +# TOYOTA RAV4 2019 +8a111c9611f505e8|2023-05-14--17-09-37--3 +# TOYOTA RAV4 2019 +8a7d3987605d80d7|2023-07-11--22-11-11--98 +# TOYOTA RAV4 2019 +904ef86637af3549|2023-06-29--21-07-54--12 +# TOYOTA RAV4 2019 +8bb58ef0f2d612b7|2023-07-24--05-57-12--18 +# TOYOTA RAV4 2019 +9145fe2119f27d86|2023-05-31--08-42-48--13 +# TOYOTA RAV4 2019 +9508cd0cab46a905|2023-06-14--16-43-42--10 +# TOYOTA RAV4 2019 +95768af0ae83525e|2023-07-21--15-19-36--83 +# TOYOTA RAV4 2019 +96a8957593166ea1|2023-06-19--12-15-04--6 +# TOYOTA RAV4 2019 +973311a7d6c7d753|2023-06-13--14-17-32--108 +# TOYOTA RAV4 2019 +9c52118646f93f97|2023-07-04--23-02-46--17 +# TOYOTA RAV4 2019 +9cbbc22dbfb7be88|2023-05-30--17-24-35--18 +# TOYOTA RAV4 2019 +9b6a2386fd03ae08|2023-07-13--12-22-52--3 +# TOYOTA RAV4 2019 +9a2bcd25135b821b|2023-07-08--10-55-13--13 +# TOYOTA RAV4 2019 +97799676cedffbe5|2023-06-14--18-24-55--19 +# TOYOTA RAV4 2019 +a08761c412401005|2023-05-23--19-01-36--12 +# TOYOTA RAV4 2019 +a27c12e2a2a70e31|2023-05-16--07-59-59--4 +# TOYOTA RAV4 2019 +9d5333455b91ee89|2023-07-07--19-32-53--2 +# TOYOTA RAV4 2019 +a158f766c4caa342|2023-05-13--12-27-56--97 +# TOYOTA RAV4 2019 +a8e906dda0b7438b|2023-06-08--11-06-31--14 +# TOYOTA RAV4 2019 +a919bd078978c0ab|2023-07-28--07-52-04--11 +# TOYOTA RAV4 2019 +a9aa5c6455c86571|2023-06-20--13-48-37--9 +# TOYOTA RAV4 2019 +ad00cbe5074c4fab|2023-07-26--15-06-11--76 +# TOYOTA RAV4 2019 +a7f1bfccea36b5eb|2023-07-14--15-30-38--5 +# TOYOTA RAV4 2019 +aeeec17f13cb4cef|2023-05-30--13-12-13--23 +# TOYOTA RAV4 2019 +af355970e532a9db|2023-06-11--15-19-23--60 +# TOYOTA RAV4 2019 +b303e820b96a73e9|2023-07-19--13-45-57--11 +# TOYOTA RAV4 2019 +b86cfd7190536fee|2023-06-04--19-32-09--1 +# TOYOTA RAV4 2019 +bc0ebfc25d121b5b|2023-07-08--17-31-57--3 +# TOYOTA RAV4 2019 +b740f7b3cb9bce43|2023-07-17--07-37-05--63 +# TOYOTA RAV4 2019 +c0a876c347ffbbe9|2023-05-11--08-40-32--7 +# TOYOTA RAV4 2019 +c98b94fb47ef8195|2023-07-21--16-10-23--62 +# TOYOTA RAV4 2019 +cea26252c5847413|2023-06-19--21-03-38--21 +# TOYOTA RAV4 2019 +ccc74bf50752879f|2023-06-16--15-04-07--14 +# TOYOTA RAV4 2019 +cd79e21eac267227|2023-05-28--19-05-31--24 +# TOYOTA RAV4 2019 +ce997a6490dec120|2023-05-24--10-21-17--28 +# TOYOTA RAV4 2019 +d3cd2946dfd5c271|2023-07-10--18-33-33--17 +# TOYOTA RAV4 2019 +d66e301c2c7277e1|2023-05-10--19-31-45--2 +# TOYOTA RAV4 2019 +dc49ffbba8a3b9dc|2023-06-08--18-18-49--24 +# TOYOTA RAV4 2019 +dc25f84f7b307cc9|2023-06-17--11-51-25--13 +# TOYOTA RAV4 2019 +df79933372901026|2023-07-06--18-03-06--16 +# TOYOTA RAV4 2019 +e15949cf8f8d7249|2023-07-31--22-54-31--10 +# TOYOTA RAV4 2019 +e1f6a3b4e19955a7|2023-07-09--17-04-05--15 +# TOYOTA RAV4 2019 +e461efc72ee56215|2023-07-01--11-14-35--138 +# TOYOTA RAV4 2019 +e87a90b4e7d2cbf6|2023-05-24--14-38-43--13 +# TOYOTA RAV4 2019 +e4bc15da1e30e125|2023-06-19--14-52-41--2 +# TOYOTA RAV4 2019 +e999ea6601c35fad|2023-06-06--21-56-30--1 +# TOYOTA RAV4 2019 +eb04174d0d305a32|2023-06-14--18-34-40--2 +# TOYOTA RAV4 2019 +e2fac89340529432|2023-05-12--21-16-54--33 +# TOYOTA RAV4 2019 +edb8ec2edf00089e|2023-07-11--14-36-05--31 +# TOYOTA RAV4 2019 +e9a117016fec049d|2023-07-23--10-19-20--2 +# TOYOTA RAV4 2019 +ed70a3fe1c252cfa|2023-07-03--11-18-29--6 +# TOYOTA RAV4 2019 +f0c3362708e50e2d|2023-07-29--17-46-22--5 +# TOYOTA RAV4 2019 +f3384252b57fdfe9|2023-08-08--01-57-06--18 +# TOYOTA RAV4 2019 +ef69d3afc3c6db45|2023-07-04--12-23-05--8 +# TOYOTA RAV4 2019 +f3b7f7fe759fbfee|2023-07-09--18-08-17--1 +# TOYOTA RAV4 2019 +f43f8cf5f35d1c68|2023-05-15--12-02-55--19 +# TOYOTA RAV4 2019 +f9fcd2ad910e89db|2023-08-06--11-26-36--12 +# TOYOTA RAV4 2019 +f7fb88eece6ec686|2023-06-29--13-16-55--8 +# TOYOTA RAV4 2019 +fe70bc78933fe382|2023-06-26--13-08-03--243 +# TOYOTA RAV4 HYBRID 2017 +260738525c081f84|2023-06-07--15-56-35--13 +# TOYOTA RAV4 HYBRID 2017 +0fd770798a15a939|2023-06-29--07-57-15--19 +# TOYOTA RAV4 HYBRID 2017 +054808dce11e7aa0|2023-08-01--18-13-07--8 +# TOYOTA RAV4 HYBRID 2017 +0ae1be4d5f71ec38|2023-05-17--17-16-12--1 +# TOYOTA RAV4 HYBRID 2017 +39e928c1da9fa3d5|2023-06-15--11-58-12--24 +# TOYOTA RAV4 HYBRID 2017 +5c556eaf4a001e29|2023-06-06--08-53-51--17 +# TOYOTA RAV4 HYBRID 2017 +602b5e96b65d4762|2023-07-10--17-55-55--150 +# TOYOTA RAV4 HYBRID 2017 +694d657526334832|2023-06-11--18-18-58--9 +# TOYOTA RAV4 HYBRID 2017 +6967b97d12f377fc|2023-07-29--14-23-52--19 +# TOYOTA RAV4 HYBRID 2017 +731520c68c728363|2023-06-27--19-28-08--5 +# TOYOTA RAV4 HYBRID 2017 +76654637ecd7a147|2023-05-10--20-08-10--59 +# TOYOTA RAV4 HYBRID 2017 +71f1afdb4ec3b211|2023-05-12--09-32-27--15 +# TOYOTA RAV4 HYBRID 2017 +8db44088260c7e81|2023-08-02--19-23-22--5 +# TOYOTA RAV4 HYBRID 2017 +a809df548b49a68b|2023-07-09--18-05-37--9 +# TOYOTA RAV4 HYBRID 2017 +b4069565beef1091|2023-07-12--09-05-40--1 +# TOYOTA RAV4 HYBRID 2017 +c0ca616eaa24d73b|2023-07-21--17-29-37--65 +# TOYOTA RAV4 HYBRID 2017 +d243dcf7caee6052|2023-06-25--17-19-26--1 +# TOYOTA RAV4 HYBRID 2017 +d32dd4e182d86a39|2023-05-15--18-11-23--18 +# TOYOTA RAV4 HYBRID 2017 +fa0e4850a023f361|2023-06-14--07-46-06--19 +# HONDA ACCORD 2018 +0750f87f2b569f15|2023-07-21--22-10-13--6 +# HONDA ACCORD 2018 +2911ec305fa73239|2023-05-16--13-29-47--27 +# HONDA ACCORD 2018 +1ada25c684c79c9f|2023-06-23--19-30-03--7 +# HONDA ACCORD 2018 +03ae79f182fff0a3|2023-05-17--20-02-41--10 +# HONDA ACCORD 2018 +0c871d574e333eeb|2023-06-02--09-32-01--21 +# HONDA ACCORD 2018 +24207e2d7868334c|2023-06-29--17-12-39--9 +# HONDA ACCORD 2018 +1a74e8bc1353f9eb|2023-06-01--00-25-52--7 +# HONDA ACCORD 2018 +20761ff63dc0e2c1|2023-05-10--19-03-20--1 +# HONDA ACCORD 2018 +066f9f7cf3c7c459|2023-07-17--17-13-44--5 +# HONDA ACCORD 2018 +21c578cf98555ce9|2023-05-11--13-46-23--58 +# HONDA ACCORD 2018 +69689c771ec57486|2023-07-11--11-36-10--27 +# HONDA ACCORD 2018 +80e02967896fde0a|2023-07-23--12-04-28--20 +# HONDA ACCORD 2018 +abcb019b84d10680|2023-05-26--20-13-32--16 +# HONDA ACCORD 2018 +bbcdb91eec4efb11|2023-08-04--10-51-09--24 +# HONDA ACCORD 2018 +c40b5785213bcb5d|2023-07-07--12-22-36--15 +# HONDA ACCORD 2018 +c7d2ba6fdcf69eef|2023-07-28--14-53-45--55 +# HONDA ACCORD 2018 +e3ddeba86ad8eb59|2023-05-11--12-48-12--3 +# HONDA ACCORD 2018 +e84b9e1ed3e077d2|2023-06-15--17-59-02--30 +# HONDA ACCORD 2018 +e961d6edc8ee01d7|2023-05-26--15-23-15--10 +# HONDA ACCORD 2018 +f54b4ab5f24eb9d7|2023-07-31--10-38-00--22 +# HONDA ACCORD 2018 +f4696dfe648b7d20|2023-06-26--07-31-46--7 +# HONDA ACCORD 2018 +f68a86aa6ba710d5|2023-07-13--19-29-03--53 +# HYUNDAI SONATA 2020 +145908dabb729ad9|2023-05-14--09-50-20--3 +# HYUNDAI SONATA 2020 +053bf385cdad1079|2023-06-02--15-48-36--24 +# HYUNDAI SONATA 2020 +10b8dcf2fb80bf56|2023-08-06--02-07-08--86 +# HYUNDAI SONATA 2020 +026e1eb462c28560|2023-07-29--09-58-52--430 +# HYUNDAI SONATA 2020 +14118dc2aced6462|2023-05-15--21-05-33--13 +# HYUNDAI SONATA 2020 +12f39c1bf68b56eb|2023-07-27--17-00-21--1 +# HYUNDAI SONATA 2020 +1edd7a8340016f2c|2023-05-26--10-01-21--1 +# HYUNDAI SONATA 2020 +310cf131d28b30d8|2023-06-08--10-57-46--24 +# HYUNDAI SONATA 2020 +3f796d94e84349fd|2023-06-10--14-30-13--5 +# HYUNDAI SONATA 2020 +40812bc457628b70|2023-07-01--12-06-20--38 +# HYUNDAI SONATA 2020 +4df896aa825bd9b3|2023-08-01--19-18-48--15 +# HYUNDAI SONATA 2020 +4a612c47eb83412a|2023-05-30--18-36-08--53 +# HYUNDAI SONATA 2020 +4960a9f1dd71aad1|2023-06-07--08-42-19--2 +# HYUNDAI SONATA 2020 +4b157737c2154617|2023-07-04--12-35-21--22 +# HYUNDAI SONATA 2020 +5c49984c8efb9c9c|2023-07-21--21-41-27--22 +# HYUNDAI SONATA 2020 +5b337c203559c300|2023-07-29--15-56-17--28 +# HYUNDAI SONATA 2020 +63f7cda2244f2338|2023-06-20--10-53-16--10 +# HYUNDAI SONATA 2020 +67cafbae8ee7f156|2023-05-15--21-35-53--57 +# HYUNDAI SONATA 2020 +67cc68f0290328c2|2023-07-25--01-33-25--14 +# HYUNDAI SONATA 2020 +700d37ccd12315cf|2023-06-01--16-13-43--68 +# HYUNDAI SONATA 2020 +7dd1f8f7f731715a|2023-05-29--20-33-34--28 +# HYUNDAI SONATA 2020 +7ef7d92481ec0ace|2023-05-20--11-58-25--6 +# HYUNDAI SONATA 2020 +89f56aec25cccf29|2023-05-31--16-32-32--12 +# HYUNDAI SONATA 2020 +895ddc214c42abea|2023-07-02--18-54-14--96 +# HYUNDAI SONATA 2020 +87aed74d45ea588f|2023-07-12--10-02-13--1 +# HYUNDAI SONATA 2020 +8d162f50f95b7128|2023-08-06--22-34-03--67 +# HYUNDAI SONATA 2020 +9ea4578ee2b1abcb|2023-05-26--07-04-55--18 +# HYUNDAI SONATA 2020 +a15bf814a6e3acc1|2023-07-26--14-52-00--4 +# HYUNDAI SONATA 2020 +a8078ee810ef83d6|2023-08-06--14-35-34--6 +# HYUNDAI SONATA 2020 +aaf2f8e95bfb437f|2023-08-05--23-38-18--38 +# HYUNDAI SONATA 2020 +ad68728bc42b1357|2023-07-10--22-22-02--27 +# HYUNDAI SONATA 2020 +b0af2fff166d80fe|2023-06-10--11-51-40--1 +# HYUNDAI SONATA 2020 +c86ea37c4a66ea6e|2023-07-27--12-27-23--22 +# HYUNDAI SONATA 2020 +cb7eee5264754a21|2023-08-07--09-30-49--3 +# HYUNDAI SONATA 2020 +c22d16eacdaf890d|2023-07-16--18-51-06--49 +# HYUNDAI SONATA 2020 +d9855ccd97606ca8|2023-05-28--12-12-29--1 +# HYUNDAI SONATA 2020 +d63936f7ce28d591|2023-05-24--16-36-34--63 +# HYUNDAI SONATA 2020 +d4958b8ee5ef5cb3|2023-06-02--16-39-43--2 +# HYUNDAI SONATA 2020 +e7369387e5ed2414|2023-05-11--08-24-27--74 +# HYUNDAI SONATA 2020 +e5904ea020532291|2023-07-22--12-16-02--17 +# HYUNDAI SONATA 2020 +e8b1f9ef35c46678|2023-07-27--17-16-47--5 +# HYUNDAI SONATA 2020 +ffce4a1d578827ee|2023-06-28--06-38-06--12 +# LEXUS RX 2020 +06a5dec26667d10e|2023-07-25--17-17-48--6 +# LEXUS RX 2020 +09ca5f224952b7f6|2023-07-19--19-40-11--12 +# LEXUS RX 2020 +08c881f7590e2420|2023-07-30--13-09-14--10 +# LEXUS RX 2020 +cc988c4ab06633fb|2023-05-12--21-16-33--41 +# TOYOTA PRIUS 2017 +167e954cba293640|2023-05-21--13-46-18--149 +# TOYOTA PRIUS 2017 +0c84cb73d1fb3a8b|2023-07-26--07-13-06--13 +# TOYOTA PRIUS 2017 +07387c2cc03c9b81|2023-06-22--16-56-50--5 +# TOYOTA PRIUS 2017 +0069f91b2663b892|2023-07-22--00-39-50--24 +# TOYOTA PRIUS 2017 +201dc5bb0067f5f2|2023-05-19--12-48-00--25 +# TOYOTA PRIUS 2017 +1e5629342e716c0a|2023-07-17--06-38-37--3 +# TOYOTA PRIUS 2017 +17c6857c5789af97|2023-07-21--19-51-17--6 +# TOYOTA PRIUS 2017 +232dd0fe26a73c53|2023-05-30--18-12-34--10 +# TOYOTA PRIUS 2017 +25d5c0772e79f4db|2023-08-03--13-54-36--17 +# TOYOTA PRIUS 2017 +0028c4ef0c8f6c30|2023-05-30--09-22-40--10 +# TOYOTA PRIUS 2017 +19e0a2420a8751bf|2023-07-16--09-41-33--9 +# TOYOTA PRIUS 2017 +1f5701894610dcd1|2023-05-13--09-02-34--6 +# TOYOTA PRIUS 2017 +15b5e12b452a992e|2023-06-13--00-02-42--12 +# TOYOTA PRIUS 2017 +0cb8c50b9ee4f5ea|2023-05-12--21-04-13--3 +# TOYOTA PRIUS 2017 +0ef0d6b0644cd7a6|2023-06-09--14-40-33--1 +# TOYOTA PRIUS 2017 +21dfd2256ee0a693|2023-07-20--13-06-55--36 +# TOYOTA PRIUS 2017 +26805bfeb242559b|2023-05-14--17-59-27--12 +# TOYOTA PRIUS 2017 +2f8790e5ac2b13e0|2023-07-22--11-03-25--5 +# TOYOTA PRIUS 2017 +2f155ba65825554f|2023-07-02--11-55-59--1 +# TOYOTA PRIUS 2017 +2eab2aa4530e03ba|2023-05-13--08-48-32--3 +# TOYOTA PRIUS 2017 +2ff4529579d6e1dc|2023-06-25--21-06-34--17 +# TOYOTA PRIUS 2017 +34faeeba08c3cc97|2023-07-30--13-22-33--14 +# TOYOTA PRIUS 2017 +3684fea792cff931|2023-08-01--20-59-40--20 +# TOYOTA PRIUS 2017 +39d749cf71d12a8e|2023-08-04--22-54-18--1 +# TOYOTA PRIUS 2017 +3f559b9878a7ccad|2023-06-21--07-22-48--15 +# TOYOTA PRIUS 2017 +457cc6df3c5f2ee1|2023-07-09--12-28-54--22 +# TOYOTA PRIUS 2017 +46b651928e9cda0f|2023-07-12--17-19-44--3 +# TOYOTA PRIUS 2017 +451e03ec9ff02db4|2023-05-27--11-30-37--8 +# TOYOTA PRIUS 2017 +4ae18286107b36b0|2023-06-07--14-03-47--2 +# TOYOTA PRIUS 2017 +4617eff9ed63ea3f|2023-07-19--17-39-20--36 +# TOYOTA PRIUS 2017 +4e36531fa34978a9|2023-05-31--15-32-40--2 +# TOYOTA PRIUS 2017 +4aa5341890583ca0|2023-05-29--11-13-49--92 +# TOYOTA PRIUS 2017 +4f2e3cebc8f3c715|2023-06-01--11-51-40--21 +# TOYOTA PRIUS 2017 +4eb29c14f8b26ba3|2023-07-25--14-09-36--8 +# TOYOTA PRIUS 2017 +52f69098ec1f801b|2023-05-16--16-10-28--3 +# TOYOTA PRIUS 2017 +51898c9b8a83d1d9|2023-07-30--23-27-13--22 +# TOYOTA PRIUS 2017 +5548e173b952a76b|2023-07-28--20-16-50--14 +# TOYOTA PRIUS 2017 +55cbd4260394fa17|2023-06-25--13-33-59--11 +# TOYOTA PRIUS 2017 +553ad02d6e7fa60e|2023-07-31--17-43-57--7 +# TOYOTA PRIUS 2017 +5e5d69c771e74940|2023-06-07--12-21-34--13 +# TOYOTA PRIUS 2017 +5a466bb77d1d0050|2023-05-12--11-49-47--9 +# TOYOTA PRIUS 2017 +5f4043fdfdd41dd5|2023-05-15--16-56-34--31 +# TOYOTA PRIUS 2017 +6318c59fa2535f38|2023-06-04--08-04-19--1 +# TOYOTA PRIUS 2017 +6371ff697bb4c045|2023-08-07--03-18-49--28 +# TOYOTA PRIUS 2017 +667087bd361ef7b1|2023-06-09--13-28-53--15 +# TOYOTA PRIUS 2017 +675c0d0c13fea348|2023-07-30--21-42-40--14 +# TOYOTA PRIUS 2017 +6925b5e1f713c09a|2023-05-19--12-25-25--4 +# TOYOTA PRIUS 2017 +754d115c7e89ca90|2023-07-07--16-40-57--4 +# TOYOTA PRIUS 2017 +718c2708b8bc1078|2023-07-18--08-32-40--14 +# TOYOTA PRIUS 2017 +748cc5e00e00d2f8|2023-07-14--11-13-29--122 +# TOYOTA PRIUS 2017 +7897d61fcfd64f73|2023-08-04--22-00-59--19 +# TOYOTA PRIUS 2017 +771fcc78f0aa53f0|2023-07-05--15-37-38--35 +# TOYOTA PRIUS 2017 +7ff274e2d6e08599|2023-08-04--20-03-11--4 +# TOYOTA PRIUS 2017 +7efdefad37338f74|2023-06-21--11-35-24--6 +# TOYOTA PRIUS 2017 +8347883441d02d13|2023-07-31--09-57-00--16 +# TOYOTA PRIUS 2017 +823d9d53d4e86649|2023-07-18--11-02-27--10 +# TOYOTA PRIUS 2017 +88f9ec172917bb98|2023-07-14--05-46-09--87 +# TOYOTA PRIUS 2017 +8df89195cd79c215|2023-06-23--13-51-00--12 +# TOYOTA PRIUS 2017 +84e716ed147ae3d7|2023-07-23--13-26-35--3 +# TOYOTA PRIUS 2017 +8c753fb54c2ad8d8|2023-07-27--17-51-39--39 +# TOYOTA PRIUS 2017 +903ac8da1aa52026|2023-08-01--17-00-11--20 +# TOYOTA PRIUS 2017 +973137405a15dccb|2023-06-04--11-13-45--13 +# TOYOTA PRIUS 2017 +9ad0cccf33247e18|2023-06-22--20-29-34--2 +# TOYOTA PRIUS 2017 +982b88e8363dc93b|2023-06-04--11-23-29--34 +# TOYOTA PRIUS 2017 +a074a62144234949|2023-07-08--18-35-42--1 +# TOYOTA PRIUS 2017 +a1206dd4a0d4d083|2023-07-19--12-54-21--52 +# TOYOTA PRIUS 2017 +a0ca4450fae65c5e|2023-06-08--07-07-25--29 +# TOYOTA PRIUS 2017 +a3b7335f488f53c2|2023-05-14--12-06-21--6 +# TOYOTA PRIUS 2017 +9f913ea6594100bf|2023-06-09--10-21-06--2 +# TOYOTA PRIUS 2017 +a55e88a02483439c|2023-07-19--12-11-58--57 +# TOYOTA PRIUS 2017 +a750926c99e2b60b|2023-05-31--15-00-56--5 +# TOYOTA PRIUS 2017 +ac11bb2bc0f2a7f7|2023-08-06--16-12-30--23 +# TOYOTA PRIUS 2017 +b222271cbe10254d|2023-07-03--10-37-50--17 +# TOYOTA PRIUS 2017 +b54d8a1ef1c820d3|2023-07-05--10-17-32--7 +# TOYOTA PRIUS 2017 +afc64e738cb8a1be|2023-06-11--16-26-28--28 +# TOYOTA PRIUS 2017 +b0b65204fa492a96|2023-05-13--11-31-33--18 +# TOYOTA PRIUS 2017 +bb94f981f4431981|2023-07-03--03-15-39--2 +# TOYOTA PRIUS 2017 +ba01e1864cd4ac61|2023-07-31--19-28-56--4 +# TOYOTA PRIUS 2017 +b68db0665d641d74|2023-07-08--16-56-57--123 +# TOYOTA PRIUS 2017 +ba94ba717fccb2f0|2023-07-11--07-47-11--1 +# TOYOTA PRIUS 2017 +bb5708908e46bcba|2023-07-12--09-08-55--10 +# TOYOTA PRIUS 2017 +bef5f54503850405|2023-06-04--10-32-31--66 +# TOYOTA PRIUS 2017 +c0c02897f03b7c7b|2023-06-23--08-31-50--10 +# TOYOTA PRIUS 2017 +c155b927e07113ad|2023-07-14--20-14-18--103 +# TOYOTA PRIUS 2017 +c38f860d281bcc5e|2023-06-09--20-09-02--17 +# TOYOTA PRIUS 2017 +c67dbd0e8b4cc29d|2023-06-05--20-53-34--9 +# TOYOTA PRIUS 2017 +c02c848a64d5177c|2023-07-06--08-45-28--13 +# TOYOTA PRIUS 2017 +cc2b9c9f221f1812|2023-07-31--17-15-47--11 +# TOYOTA PRIUS 2017 +cd0e6154e0cb0484|2023-08-05--15-28-19--1 +# TOYOTA PRIUS 2017 +c848c39dfb2de30f|2023-06-23--22-44-03--1 +# TOYOTA PRIUS 2017 +d68f8916cb7adfdf|2023-06-21--06-37-56--11 +# TOYOTA PRIUS 2017 +d67f123a82aaf50e|2023-05-12--13-49-59--2 +# TOYOTA PRIUS 2017 +e057838a043251cf|2023-07-27--14-13-22--5 +# TOYOTA PRIUS 2017 +e15020c852627a0a|2023-07-26--20-49-08--4 +# TOYOTA PRIUS 2017 +e206ddb85e53cc0d|2023-07-31--11-28-07--10 +# TOYOTA PRIUS 2017 +dd311669c55d1ccf|2023-06-25--16-57-05--1 +# TOYOTA PRIUS 2017 +e31072835e1cdc73|2023-05-20--21-59-30--69 +# TOYOTA PRIUS 2017 +ea43e1e2911e37e5|2023-07-07--03-34-54--1 +# TOYOTA PRIUS 2017 +e8cb87d767f608dd|2023-07-14--19-23-30--16 +# TOYOTA PRIUS 2017 +f1c69863517027e8|2023-07-29--12-47-02--17 +# TOYOTA PRIUS 2017 +f4b656c4aaf63360|2023-06-28--18-52-46--99 +# TOYOTA PRIUS 2017 +f8046cede9c720b1|2023-08-06--18-46-48--4 +# TOYOTA PRIUS 2017 +f8e3dfca6df16c7e|2023-05-15--11-33-42--7 +# TOYOTA PRIUS 2017 +f921646c299a6d36|2023-07-01--17-16-09--119 +# TOYOTA PRIUS 2017 +ff634b088ec2db2d|2023-06-16--15-14-04--39 +# HONDA RIDGELINE 2017 +0ddc5f974851a022|2023-06-11--18-08-25--104 +# HONDA RIDGELINE 2017 +1551280de648df83|2023-06-27--19-23-19--5 +# HONDA RIDGELINE 2017 +24187316e568f2ec|2023-07-25--10-57-53--1 +# HONDA RIDGELINE 2017 +1ce42f7a69e4b11c|2023-07-03--13-09-36--28 +# HONDA RIDGELINE 2017 +263d65b0fd18f5c4|2023-07-18--16-42-57--44 +# HONDA RIDGELINE 2017 +19fe0c3f46444eeb|2023-06-12--20-07-52--1 +# HONDA RIDGELINE 2017 +3aa992e52b91bf8f|2023-07-28--15-22-10--5 +# HONDA RIDGELINE 2017 +6acf79c245a32eb3|2023-07-08--17-40-23--17 +# HONDA RIDGELINE 2017 +6e2f19b5263c9d65|2023-07-16--09-56-19--23 +# HONDA RIDGELINE 2017 +701b7d276e45a7bf|2023-07-31--15-17-26--28 +# HONDA RIDGELINE 2017 +715416e4439e555e|2023-08-03--14-53-14--1 +# HONDA RIDGELINE 2017 +732c29f8108b54a9|2023-07-30--10-59-07--35 +# HONDA RIDGELINE 2017 +758cfd09da38d125|2023-07-24--11-45-13--1 +# HONDA RIDGELINE 2017 +7fe0389b26adfb30|2023-05-12--13-55-02--3 +# HONDA RIDGELINE 2017 +7f498d0d7b378766|2023-06-08--15-18-05--47 +# HONDA RIDGELINE 2017 +805f226ab2a8b1d7|2023-07-05--14-03-54--10 +# HONDA RIDGELINE 2017 +9824e24dd1574abc|2023-06-09--19-55-12--14 +# HONDA RIDGELINE 2017 +9b29873dd03e9357|2023-05-30--10-10-24--4 +# HONDA RIDGELINE 2017 +9bdc08e34137d504|2023-05-28--13-07-50--10 +# HONDA RIDGELINE 2017 +a9648fa1431cf7a8|2023-05-13--18-40-53--33 +# HONDA RIDGELINE 2017 +aaa226a738d37659|2023-05-19--11-59-08--5 +# HONDA RIDGELINE 2017 +a7252f38a01fc213|2023-06-20--16-17-58--2 +# HONDA RIDGELINE 2017 +adbbce5339634eae|2023-08-03--17-35-47--8 +# HONDA RIDGELINE 2017 +ac97f88de8b23b6b|2023-06-26--11-44-14--6 +# HONDA RIDGELINE 2017 +b3c88ee6c378a66e|2023-07-24--08-47-23--6 +# HONDA RIDGELINE 2017 +bf0fac55013ab937|2023-07-10--10-23-24--17 +# HONDA RIDGELINE 2017 +c5e0d17adaaefd82|2023-07-22--16-12-30--58 +# HONDA RIDGELINE 2017 +d169250d735e1346|2023-06-08--16-35-51--9 +# HONDA RIDGELINE 2017 +d084ea2309575a71|2023-05-18--17-25-07--14 +# HONDA RIDGELINE 2017 +d5dd26679a932af9|2023-07-04--09-39-08--18 +# HONDA RIDGELINE 2017 +e52c055a77cac84c|2023-06-05--17-27-17--17 +# HONDA RIDGELINE 2017 +e51512df42d845d0|2023-06-05--14-27-56--53 +# HONDA RIDGELINE 2017 +e4bcdeea7c6f1fd3|2023-07-10--11-47-50--17 +# HONDA RIDGELINE 2017 +f53658bd0c1ccf07|2023-07-28--19-28-13--12 +# TOYOTA RAV4 2019 +135e1e376668a393|2023-06-25--19-00-07--36 +# TOYOTA RAV4 2019 +0de4f23a490a8502|2023-07-19--17-54-03--7 +# TOYOTA RAV4 2019 +01a8bd5caab4a678|2023-06-15--10-36-38--2 +# TOYOTA RAV4 2019 +0dcc1daec4a26b89|2023-06-12--12-15-52--4 +# TOYOTA RAV4 2019 +180ea5df0f0b4db9|2023-07-18--22-50-24--6 +# TOYOTA RAV4 2019 +28de01246b5d6401|2023-06-19--16-24-29--8 +# TOYOTA RAV4 2019 +166ed2b12f634fb7|2023-06-05--19-15-04--13 +# TOYOTA RAV4 2019 +1f623af84e701b2a|2023-06-29--16-42-01--3 +# TOYOTA RAV4 2019 +1ccd70c07ff29d9f|2023-05-17--20-26-06--5 +# TOYOTA RAV4 2019 +1199c1d31bb3a214|2023-06-13--14-23-39--16 +# TOYOTA RAV4 2019 +24b7eef92acb725c|2023-06-25--14-09-20--9 +# TOYOTA RAV4 2019 +1ab6dacda17ac28a|2023-05-22--18-38-12--11 +# TOYOTA RAV4 2019 +1da1a0519b1669c3|2023-07-01--22-29-45--18 +# TOYOTA RAV4 2019 +0f8a92e2122ea309|2023-07-26--10-46-14--3 +# TOYOTA RAV4 2019 +0f60d680150676d0|2023-06-27--05-57-53--2 +# TOYOTA RAV4 2019 +166a8fc9c484866b|2023-07-26--08-14-07--12 +# TOYOTA RAV4 2019 +2a2249f498ddc22c|2023-07-04--13-41-52--3 +# TOYOTA RAV4 2019 +28947140cc79e4cf|2023-08-05--12-17-34--41 +# TOYOTA RAV4 2019 +028a208d08a11420|2023-07-22--15-41-34--60 +# TOYOTA RAV4 2019 +336f33d84fa8d5db|2023-07-29--16-59-09--6 +# TOYOTA RAV4 2019 +3ae010558239929d|2023-05-31--19-06-35--19 +# TOYOTA RAV4 2019 +395fe23cc0a51896|2023-06-25--10-15-45--48 +# TOYOTA RAV4 2019 +3f3a48346848df21|2023-07-26--16-15-13--1 +# TOYOTA RAV4 2019 +40f6907c6b554368|2023-06-17--05-51-38--66 +# TOYOTA RAV4 2019 +41f4ae6d3b79a9b1|2023-08-03--09-20-24--6 +# TOYOTA RAV4 2019 +45edf064d369bff9|2023-06-09--12-21-08--11 +# TOYOTA RAV4 2019 +4a389c94e0a137cc|2023-05-17--17-52-33--4 +# TOYOTA RAV4 2019 +4dfda86b67cad08f|2023-08-01--12-25-44--1 +# TOYOTA RAV4 2019 +4d0c6516a05013a1|2023-05-10--17-14-40--59 +# TOYOTA RAV4 2019 +4e4a768f20ae1e96|2023-06-06--10-43-02--36 +# TOYOTA RAV4 2019 +5175d97daef0d2ce|2023-07-02--12-18-55--8 +# TOYOTA RAV4 2019 +4a4e7f053b5730d9|2023-05-31--17-00-07--20 +# TOYOTA RAV4 2019 +523a062b170f5402|2023-05-24--15-37-42--23 +# TOYOTA RAV4 2019 +4857e763b605484d|2023-07-12--15-33-09--27 +# TOYOTA RAV4 2019 +601862be98f8db50|2023-08-06--01-03-26--37 +# TOYOTA RAV4 2019 +615671030be02e4e|2023-05-23--15-20-04--21 +# TOYOTA RAV4 2019 +5f70a3bed42b7932|2023-08-06--19-00-39--2 +# TOYOTA RAV4 2019 +628ea5913838ecc2|2023-05-23--21-38-48--3 +# TOYOTA RAV4 2019 +60093534d6d04cd2|2023-06-14--12-21-58--40 +# TOYOTA RAV4 2019 +6adb1b2f007ef2e0|2023-08-03--15-57-43--8 +# TOYOTA RAV4 2019 +672d2d359ba20275|2023-08-05--22-39-34--84 +# TOYOTA RAV4 2019 +666f3e6d7f7f02ab|2023-07-21--05-45-19--3 +# TOYOTA RAV4 2019 +6b0a418312ab1345|2023-08-07--06-41-16--1 +# TOYOTA RAV4 2019 +6f74e02218e61a6d|2023-07-22--09-59-20--8 +# TOYOTA RAV4 2019 +715bdc3654d57eb0|2023-07-23--19-41-44--8 +# TOYOTA RAV4 2019 +74ef295ef2f668fd|2023-06-14--22-25-34--27 +# TOYOTA RAV4 2019 +82d5f13f2a583c11|2023-07-01--09-18-28--21 +# TOYOTA RAV4 2019 +8074c8663302e56c|2023-06-08--20-59-32--61 +# TOYOTA RAV4 2019 +8610459df75c5ac1|2023-05-20--10-16-13--14 +# TOYOTA RAV4 2019 +890069284dace3bf|2023-07-22--11-08-46--45 +# TOYOTA RAV4 2019 +8da230f47b0fef44|2023-06-09--20-19-37--27 +# TOYOTA RAV4 2019 +8aad58f199ab2bed|2023-06-08--13-17-02--3 +# TOYOTA RAV4 2019 +8e29ec646f62a1d2|2023-08-04--14-40-06--2 +# TOYOTA RAV4 2019 +84e20ddfaf4c56d8|2023-07-25--07-10-21--12 +# TOYOTA RAV4 2019 +8d99fb063bc66a26|2023-06-02--19-49-30--27 +# TOYOTA RAV4 2019 +91f940f4a03e5406|2023-08-02--12-44-05--3 +# TOYOTA RAV4 2019 +8efd4729c72a4da9|2023-06-02--16-40-33--8 +# TOYOTA RAV4 2019 +9837fffee4d677f5|2023-06-16--21-35-16--30 +# TOYOTA RAV4 2019 +96b6b95903a330a4|2023-07-08--15-45-40--19 +# TOYOTA RAV4 2019 +9d96018bfdd9ac61|2023-06-13--15-55-43--10 +# TOYOTA RAV4 2019 +9d3747d13e211f85|2023-07-04--17-51-45--1 +# TOYOTA RAV4 2019 +a28a6e3882c1cdf1|2023-05-19--12-34-50--19 +# TOYOTA RAV4 2019 +a61651a726f6bf4d|2023-06-23--12-49-05--47 +# TOYOTA RAV4 2019 +b18225558cb35a1e|2023-07-17--15-46-21--14 +# TOYOTA RAV4 2019 +add7bff9cfb270ba|2023-05-18--22-26-57--11 +# TOYOTA RAV4 2019 +b6508eacf6f008df|2023-05-21--17-31-08--3 +# TOYOTA RAV4 2019 +b97486b552c1f5e3|2023-07-30--15-17-31--26 +# TOYOTA RAV4 2019 +be98421ae126bf91|2023-06-02--16-52-56--13 +# TOYOTA RAV4 2019 +c49a105de4a54ea1|2023-07-07--21-29-40--199 +# TOYOTA RAV4 2019 +d05aaa4d42d7c441|2023-06-05--22-11-24--3 +# TOYOTA RAV4 2019 +ca9194f601494b20|2023-05-24--17-40-49--23 +# TOYOTA RAV4 2019 +d3d6397ff2e7052e|2023-05-29--15-57-39--24 +# TOYOTA RAV4 2019 +cca5f152e7f637f0|2023-05-22--11-01-03--43 +# TOYOTA RAV4 2019 +d3e27ee09a40d1fd|2023-08-02--18-21-22--7 +# TOYOTA RAV4 2019 +d935e25b7e6c725f|2023-07-15--07-36-42--45 +# TOYOTA RAV4 2019 +e1905174a6abbc3c|2023-07-18--07-13-51--2 +# TOYOTA RAV4 2019 +e7cd4ae3bee72b52|2023-07-05--20-45-50--29 +# TOYOTA RAV4 2019 +e7571e0b3674d663|2023-06-23--21-10-27--1 +# TOYOTA RAV4 2019 +e712b42b94578404|2023-05-24--11-21-11--2 +# TOYOTA RAV4 2019 +ebe4b1a7667f231a|2023-06-27--15-23-46--3 +# TOYOTA RAV4 2019 +f30a29d40aa4a4f9|2023-05-17--16-55-57--66 +# TOYOTA RAV4 2019 +f6695ef06f916f23|2023-06-09--17-44-36--14 +# TOYOTA RAV4 2019 +fbff49b354d8a801|2023-07-21--13-52-37--2 +# TOYOTA RAV4 2019 +fc6c359e0e92884f|2023-05-14--13-50-56--9 +# TOYOTA RAV4 2017 +204be5d78daf7006|2023-06-15--07-35-31--11 +# TOYOTA RAV4 2017 +1cbdc1fbae86b49f|2023-06-09--16-31-47--10 +# TOYOTA RAV4 2017 +0655a3f86baf711f|2023-05-17--18-09-14--5 +# TOYOTA RAV4 2017 +28ca2ff434583ddc|2023-06-03--10-49-10--3 +# TOYOTA RAV4 2017 +23940cdb2383e639|2023-07-07--13-06-17--19 +# TOYOTA RAV4 2017 +3932cd29d3fe4a4b|2023-07-27--13-26-25--1 +# TOYOTA RAV4 2017 +2e5de09806977462|2023-07-01--02-13-50--2 +# TOYOTA RAV4 2017 +4a0de7e463e259ef|2023-08-03--14-16-49--2 +# TOYOTA RAV4 2017 +5e9be1efcd6ca25c|2023-07-19--15-05-58--38 +# TOYOTA RAV4 2017 +5d76166971f7ee03|2023-05-22--21-51-32--24 +# TOYOTA RAV4 2017 +6c5718d5c35b6aa8|2023-07-14--23-33-06--40 +# TOYOTA RAV4 2017 +6cd3f6f236b89cbb|2023-06-04--20-29-13--1 +# TOYOTA RAV4 2017 +829a18f6611a0593|2023-07-19--17-06-18--25 +# TOYOTA RAV4 2017 +8ab2027f3c00b364|2023-07-03--15-21-24--114 +# TOYOTA RAV4 2017 +8bf48c046a7750ec|2023-06-08--13-30-25--2 +# TOYOTA RAV4 2017 +98f88292bbae4624|2023-07-21--15-07-11--90 +# TOYOTA RAV4 2017 +a099e968ef197bc0|2023-05-24--06-36-30--2 +# TOYOTA RAV4 2017 +aa332893d92ff60a|2023-07-04--22-48-05--7 +# TOYOTA RAV4 2017 +ade7b7b6f44ba9ea|2023-08-04--16-52-21--34 +# TOYOTA RAV4 2017 +c62d83d70a8ae2b3|2023-06-06--21-39-21--43 +# TOYOTA RAV4 2017 +c9d0e3690e929c02|2023-07-06--20-22-25--25 +# TOYOTA RAV4 2017 +ceacc4d097850b24|2023-05-19--00-11-34--2 +# TOYOTA RAV4 2017 +c84e969db16a7821|2023-07-04--18-50-40--1 +# TOYOTA RAV4 2017 +dccc846a6d7f0198|2023-08-04--13-38-05--6 +# TOYOTA RAV4 2017 +e54de504cefdd500|2023-05-26--13-30-47--14 +# TOYOTA RAV4 2017 +fbc6e1316bac1a40|2023-07-30--18-48-20--18 +# CHRYSLER PACIFICA HYBRID 2018 +00d247a9bb1f9196|2023-06-25--00-50-52--16 +# CHRYSLER PACIFICA HYBRID 2018 +0f53b336851e1384|2023-07-06--20-48-35--28 +# CHRYSLER PACIFICA HYBRID 2018 +19657d9411ef4f1c|2023-06-19--15-37-12--16 +# CHRYSLER PACIFICA HYBRID 2018 +05a30afc5c891372|2023-07-29--13-14-28--1 +# CHRYSLER PACIFICA HYBRID 2018 +268be6212ca01164|2023-05-26--10-55-29--20 +# CHRYSLER PACIFICA HYBRID 2018 +2fc676162569f5f0|2023-05-27--21-30-31--6 +# CHRYSLER PACIFICA HYBRID 2018 +34a660c3c3aa6310|2023-06-09--16-51-25--7 +# CHRYSLER PACIFICA HYBRID 2018 +6480130cc87ac628|2023-07-30--19-17-09--13 +# CHRYSLER PACIFICA HYBRID 2018 +796aba999d046d7d|2023-07-12--14-19-33--5 +# CHRYSLER PACIFICA HYBRID 2018 +7620ad20d3cefc64|2023-05-19--08-49-37--5 +# CHRYSLER PACIFICA HYBRID 2018 +80d3ea3484ea9cfd|2023-05-27--15-01-03--101 +# CHRYSLER PACIFICA HYBRID 2018 +ba0a98377680c14d|2023-07-19--19-00-32--2 +# CHRYSLER PACIFICA HYBRID 2018 +f87ec6de63679cb6|2023-05-29--13-01-37--1 +# LEXUS NX 2018 +21b5c2189fb5972e|2023-07-12--12-15-44--4 +# LEXUS NX 2018 +22feb9142bcc73c9|2023-08-01--17-37-30--60 +# LEXUS NX 2018 +6bd8524bfd558e75|2023-06-30--14-15-54--4 +# LEXUS NX 2018 +83ae8304745fad7e|2023-05-17--20-16-52--148 +# JEEP GRAND CHEROKEE V6 2018 +15afba6e8f2a793d|2023-07-02--09-47-25--36 +# JEEP GRAND CHEROKEE V6 2018 +0448d4c7552b98c6|2023-07-15--14-01-58--1 +# JEEP GRAND CHEROKEE V6 2018 +044cbaf7278c5761|2023-05-15--18-58-25--11 +# JEEP GRAND CHEROKEE V6 2018 +326edad388d0a5e2|2023-07-01--19-19-08--2 +# JEEP GRAND CHEROKEE V6 2018 +37f25823e3b0d3e2|2023-07-08--15-07-03--8 +# JEEP GRAND CHEROKEE V6 2018 +5ec00346ae32f57f|2023-08-01--05-39-55--26 +# JEEP GRAND CHEROKEE V6 2018 +641d9bfd161cccd7|2023-06-29--17-52-45--7 +# JEEP GRAND CHEROKEE V6 2018 +900dfa83b4addfe6|2023-05-11--15-01-42--45 +# JEEP GRAND CHEROKEE V6 2018 +9db428338427dec2|2023-07-12--21-25-15--26 +# JEEP GRAND CHEROKEE V6 2018 +aed0854cefa55533|2023-07-07--21-01-07--4 +# JEEP GRAND CHEROKEE V6 2018 +c692ccc84342a478|2023-06-24--16-40-17--14 +# JEEP GRAND CHEROKEE V6 2018 +d50ada8ee55a5e74|2023-07-03--19-45-11--9 +# JEEP GRAND CHEROKEE V6 2018 +e56b1d3147b6a8f0|2023-07-30--12-51-42--38 +# KIA NIRO EV 2020 +05b1a2556c5bc638|2023-08-07--12-47-27--7 +# KIA NIRO EV 2020 +180ead4c4c126f9d|2023-06-08--20-02-58--6 +# KIA NIRO EV 2020 +36abc44c4f296c7a|2023-05-19--16-15-28--3 +# KIA NIRO EV 2020 +400c0f76b5a1aa90|2023-06-03--21-47-52--15 +# KIA NIRO EV 2020 +561e5f3991916e4b|2023-08-05--15-06-08--15 +# KIA NIRO EV 2020 +6d2b75c2e67bf314|2023-07-29--10-55-10--16 +# KIA NIRO EV 2020 +70a73b2fbd820de4|2023-07-31--16-50-14--17 +# KIA NIRO EV 2020 +89c7460182ce76eb|2023-06-07--22-19-13--63 +# KIA NIRO EV 2020 +9b052af2986bbe3c|2023-08-07--20-11-53--9 +# KIA NIRO EV 2020 +b382b3c7a6e6c4a3|2023-05-14--12-40-13--2 +# KIA NIRO EV 2020 +b576d2ff8a193b4a|2023-07-30--17-49-23--16 +# KIA NIRO EV 2020 +b5cebe8c56d710c5|2023-05-10--20-26-44--26 +# KIA NIRO EV 2020 +c04b1653edb84818|2023-05-16--23-20-13--17 +# KIA NIRO EV 2020 +c8f86b163152d2c5|2023-05-28--10-13-22--2 +# KIA NIRO EV 2020 +d5f923604b1b2f75|2023-05-24--07-29-50--14 +# KIA NIRO EV 2020 +dbda33c67462b907|2023-05-13--12-03-22--21 +# KIA NIRO EV 2020 +e81862333a36d2f7|2023-07-13--09-59-47--19 +# KIA NIRO EV 2020 +fc4cfe20b331a575|2023-07-31--10-34-38--1 +# HONDA CIVIC 2016 +0d922f5798ae65ed|2023-08-01--14-56-54--14 +# HONDA CIVIC 2016 +20994bc5331f98c0|2023-07-26--19-09-06--4 +# HONDA CIVIC 2016 +123dce2cbb7370cd|2023-06-08--20-14-38--19 +# HONDA CIVIC 2016 +1230ef5ea53311d6|2023-05-16--22-44-05--2 +# HONDA CIVIC 2016 +242b33685ed4e03a|2023-08-02--09-29-10--7 +# HONDA CIVIC 2016 +35ca75966798efba|2023-05-23--18-42-57--18 +# HONDA CIVIC 2016 +3e1e2b62f3f2ac3d|2023-07-12--18-23-44--5 +# HONDA CIVIC 2016 +429b106d0b800755|2023-06-03--22-13-41--2 +# HONDA CIVIC 2016 +4a080fe908e25eb2|2023-05-12--20-21-48--18 +# HONDA CIVIC 2016 +52534ebb0e145937|2023-07-14--11-40-16--5 +# HONDA CIVIC 2016 +5cfa1ad8f35779d0|2023-05-10--13-31-39--7 +# HONDA CIVIC 2016 +5dfdb608ac9bc838|2023-05-22--16-58-36--43 +# HONDA CIVIC 2016 +5dedd0807e354b45|2023-08-03--16-29-27--32 +# HONDA CIVIC 2016 +675bf95ba0ce21b7|2023-06-25--12-39-50--1 +# HONDA CIVIC 2016 +7528525a29a9d9e6|2023-07-23--01-21-59--24 +# HONDA CIVIC 2016 +7496d76ba25de13f|2023-07-22--10-48-35--5 +# HONDA CIVIC 2016 +79b03b378a603ec8|2023-05-23--05-02-29--8 +# HONDA CIVIC 2016 +8d80c16a8485aaf3|2023-05-18--21-35-54--75 +# HONDA CIVIC 2016 +9098b6df85df4bab|2023-07-12--19-32-41--22 +# HONDA CIVIC 2016 +a182b0586ed5197f|2023-07-27--19-50-29--3 +# HONDA CIVIC 2016 +a3f025079c99dde7|2023-06-11--19-51-19--6 +# HONDA CIVIC 2016 +ae5111c66432dc8d|2023-07-24--14-16-50--4 +# HONDA CIVIC 2016 +b029c0f4cf2064e7|2023-07-19--07-02-46--37 +# HONDA CIVIC 2016 +b1c832ad56b6bc9d|2023-05-28--19-00-21--6 +# HONDA CIVIC 2016 +b7107213450829d2|2023-07-25--19-57-40--42 +# HONDA CIVIC 2016 +d313e54d1691a342|2023-06-20--16-22-23--37 +# HONDA CIVIC 2016 +dfae8f89bc63acf4|2023-05-21--18-14-46--6 +# VOLKSWAGEN GOLF 7TH GEN +1f032f5173c8ad99|2023-07-25--07-06-28--2 +# VOLKSWAGEN GOLF 7TH GEN +063f36154faa4921|2023-07-04--13-42-41--69 +# VOLKSWAGEN GOLF 7TH GEN +2cdded3a5da75b6a|2023-07-29--16-03-09--21 +# VOLKSWAGEN GOLF 7TH GEN +3a12e8c9983fb961|2023-06-29--16-29-48--21 +# VOLKSWAGEN GOLF 7TH GEN +3cfdec54aa035f3f|2023-07-30--16-55-43--25 +# VOLKSWAGEN GOLF 7TH GEN +434df3000c5d36ff|2023-08-07--08-16-23--15 +# VOLKSWAGEN GOLF 7TH GEN +4aa5d874f367adbc|2023-05-12--17-55-23--3 +# VOLKSWAGEN GOLF 7TH GEN +59658f79475526e4|2023-05-10--14-12-23--21 +# VOLKSWAGEN GOLF 7TH GEN +77db91ca5676dfd9|2023-05-11--12-32-36--18 +# VOLKSWAGEN GOLF 7TH GEN +7b6a4fdf7c484d0c|2023-06-02--20-28-47--1 +# VOLKSWAGEN GOLF 7TH GEN +8906f6f8c8052728|2023-07-30--17-49-47--16 +# VOLKSWAGEN GOLF 7TH GEN +8fe9ced03c94e256|2023-05-16--09-40-38--11 +# VOLKSWAGEN GOLF 7TH GEN +9806e7635acbfc4e|2023-07-30--08-52-18--4 +# VOLKSWAGEN GOLF 7TH GEN +9dfef26e8c734ff1|2023-07-21--21-17-53--12 +# VOLKSWAGEN GOLF 7TH GEN +a5ca9217d833ec9f|2023-06-03--12-07-06--1 +# VOLKSWAGEN GOLF 7TH GEN +a61c85c75dbf1c22|2023-07-03--10-14-01--9 +# VOLKSWAGEN GOLF 7TH GEN +ba232e71d028199a|2023-06-19--15-48-13--83 +# VOLKSWAGEN GOLF 7TH GEN +c2317d8d52490584|2023-05-20--15-01-59--4 +# VOLKSWAGEN GOLF 7TH GEN +dd154b34dc4d8c52|2023-07-03--20-13-03--63 +# VOLKSWAGEN GOLF 7TH GEN +e4221d4d60b6d43e|2023-05-11--18-57-30--33 +# VOLKSWAGEN GOLF 7TH GEN +e55f210ede806fde|2023-06-09--21-52-53--21 +# TOYOTA COROLLA TSS2 2019 +2526d4fd82f82868|2023-06-16--18-16-26--14 +# TOYOTA COROLLA TSS2 2019 +01febfaac7572f25|2023-06-06--19-08-52--2 +# TOYOTA COROLLA TSS2 2019 +0ba864f7f238934a|2023-07-07--15-45-46--3 +# TOYOTA COROLLA TSS2 2019 +13aa844538f5f3ea|2023-07-28--20-37-12--12 +# TOYOTA COROLLA TSS2 2019 +117fd309156bb38b|2023-07-08--19-26-59--3 +# TOYOTA COROLLA TSS2 2019 +08a1ee03695f6a19|2023-07-12--06-56-22--37 +# TOYOTA COROLLA TSS2 2019 +1febe902238e07e7|2023-07-04--11-40-53--19 +# TOYOTA COROLLA TSS2 2019 +0976603847a63139|2023-05-24--13-04-43--69 +# TOYOTA COROLLA TSS2 2019 +1d430ad170e95d66|2023-05-10--13-47-49--3 +# TOYOTA COROLLA TSS2 2019 +10f64136dcc9e6cf|2023-07-22--12-54-01--1 +# TOYOTA COROLLA TSS2 2019 +066f132fea612a43|2023-06-18--20-06-31--9 +# TOYOTA COROLLA TSS2 2019 +230649810f83e032|2023-07-24--22-23-09--21 +# TOYOTA COROLLA TSS2 2019 +13a296d002fe988d|2023-08-05--16-55-23--10 +# TOYOTA COROLLA TSS2 2019 +0ffb338268a7f57b|2023-07-08--17-15-25--71 +# TOYOTA COROLLA TSS2 2019 +2edc2c12fbb3cc34|2023-06-12--16-21-43--15 +# TOYOTA COROLLA TSS2 2019 +2653b4b309780e1a|2023-05-15--12-33-26--32 +# TOYOTA COROLLA TSS2 2019 +2ea9a9a47b4d658b|2023-08-03--17-08-37--18 +# TOYOTA COROLLA TSS2 2019 +2cd916ec939a0cdb|2023-07-29--20-09-03--29 +# TOYOTA COROLLA TSS2 2019 +36f5b57e4202d677|2023-07-19--16-07-41--20 +# TOYOTA COROLLA TSS2 2019 +375f6b7dcfa712bb|2023-07-29--00-25-41--3 +# TOYOTA COROLLA TSS2 2019 +3cb092b934c1321a|2023-07-12--14-19-10--1 +# TOYOTA COROLLA TSS2 2019 +42ff158c63048ad3|2023-06-19--12-40-18--12 +# TOYOTA COROLLA TSS2 2019 +3c755ae77207f5e6|2023-07-07--06-56-53--26 +# TOYOTA COROLLA TSS2 2019 +479477500279ec91|2023-07-15--15-08-01--13 +# TOYOTA COROLLA TSS2 2019 +4955b33f42f814ec|2023-06-19--18-19-33--10 +# TOYOTA COROLLA TSS2 2019 +4f871d414c69c6ba|2023-05-26--01-44-47--1 +# TOYOTA COROLLA TSS2 2019 +4ecfcac756318cbf|2023-05-26--09-11-43--16 +# TOYOTA COROLLA TSS2 2019 +51e32fb50a64250a|2023-07-07--20-50-11--51 +# TOYOTA COROLLA TSS2 2019 +48590e272587fc49|2023-06-02--08-36-54--48 +# TOYOTA COROLLA TSS2 2019 +4ccbc0d42d611d6e|2023-06-06--19-48-02--3 +# TOYOTA COROLLA TSS2 2019 +50c35b8d29fd7574|2023-07-12--19-36-54--2 +# TOYOTA COROLLA TSS2 2019 +51b1e5305ed717c2|2023-07-04--08-50-02--3 +# TOYOTA COROLLA TSS2 2019 +4c833174af1f11d9|2023-06-27--21-28-20--36 +# TOYOTA COROLLA TSS2 2019 +575626d3c2c61bc3|2023-07-18--17-06-03--46 +# TOYOTA COROLLA TSS2 2019 +59bbf0ec138e1bc4|2023-07-30--19-20-22--8 +# TOYOTA COROLLA TSS2 2019 +567e47e503b36408|2023-05-11--13-24-46--8 +# TOYOTA COROLLA TSS2 2019 +5d2be9f6c9bb6d59|2023-07-14--18-20-52--31 +# TOYOTA COROLLA TSS2 2019 +636f850472924d8b|2023-07-27--05-38-09--139 +# TOYOTA COROLLA TSS2 2019 +66235d23ccedf22b|2023-06-19--15-16-34--3 +# TOYOTA COROLLA TSS2 2019 +6c15cf37ba9e13af|2023-05-10--07-18-08--33 +# TOYOTA COROLLA TSS2 2019 +6439fb08910d24cb|2023-06-15--14-26-45--42 +# TOYOTA COROLLA TSS2 2019 +7472c18ac7ee970a|2023-07-30--01-05-28--2 +# TOYOTA COROLLA TSS2 2019 +7065b7a287ca6bfd|2023-06-21--16-08-50--4 +# TOYOTA COROLLA TSS2 2019 +7037f9c72bc6f964|2023-06-12--16-02-49--2 +# TOYOTA COROLLA TSS2 2019 +75e2a892240ca11a|2023-07-22--09-18-55--5 +# TOYOTA COROLLA TSS2 2019 +796a1c5804476c3f|2023-06-26--19-24-19--7 +# TOYOTA COROLLA TSS2 2019 +7848680077bfdcdc|2023-07-24--18-38-50--3 +# TOYOTA COROLLA TSS2 2019 +742af4a6e6eaa03a|2023-06-27--13-07-41--44 +# TOYOTA COROLLA TSS2 2019 +744a7144504b6e2e|2023-08-02--13-28-51--7 +# TOYOTA COROLLA TSS2 2019 +7a2f01307609c158|2023-08-06--17-30-48--12 +# TOYOTA COROLLA TSS2 2019 +772e65c4f149b380|2023-05-20--04-14-17--1 +# TOYOTA COROLLA TSS2 2019 +86d675e9d797d210|2023-05-21--21-53-30--21 +# TOYOTA COROLLA TSS2 2019 +8730608053a8d3af|2023-06-26--17-05-48--18 +# TOYOTA COROLLA TSS2 2019 +89d53004921bd239|2023-07-22--15-00-53--38 +# TOYOTA COROLLA TSS2 2019 +90a0f4e5ad469fb7|2023-08-04--11-48-13--1 +# TOYOTA COROLLA TSS2 2019 +927ee6ce294e2f25|2023-07-29--08-22-53--1 +# TOYOTA COROLLA TSS2 2019 +9285a03a79895178|2023-07-04--23-14-40--16 +# TOYOTA COROLLA TSS2 2019 +9670ceb56ecf4d79|2023-07-10--07-55-49--14 +# TOYOTA COROLLA TSS2 2019 +99846616e03e1162|2023-07-30--12-59-13--2 +# TOYOTA COROLLA TSS2 2019 +98d3152d30060750|2023-05-20--15-57-05--17 +# TOYOTA COROLLA TSS2 2019 +990a1b5f50ca3d5c|2023-05-17--10-17-05--1 +# TOYOTA COROLLA TSS2 2019 +9afac539f787a200|2023-06-30--15-05-48--14 +# TOYOTA COROLLA TSS2 2019 +9a2505595b2a3554|2023-08-07--14-46-21--59 +# TOYOTA COROLLA TSS2 2019 +a1459329fb4cd970|2023-06-28--15-44-03--19 +# TOYOTA COROLLA TSS2 2019 +a2a0ccea32023010|2023-07-26--17-19-33--11 +# TOYOTA COROLLA TSS2 2019 +9f65d75230c64fb4|2023-06-19--12-28-55--95 +# TOYOTA COROLLA TSS2 2019 +a43409b966c53d15|2023-06-29--10-11-49--4 +# TOYOTA COROLLA TSS2 2019 +a4446d3a8ae1e324|2023-06-06--11-49-40--17 +# TOYOTA COROLLA TSS2 2019 +9d5c10b6f66f736a|2023-06-18--10-48-03--191 +# TOYOTA COROLLA TSS2 2019 +a2804476419fd4f3|2023-05-30--14-13-10--2 +# TOYOTA COROLLA TSS2 2019 +ac7fa8ccceee8fe4|2023-07-21--13-50-12--14 +# TOYOTA COROLLA TSS2 2019 +ad27b5fb54426e8a|2023-07-12--16-32-18--9 +# TOYOTA COROLLA TSS2 2019 +b46ac14e96fa047d|2023-05-26--13-10-23--9 +# TOYOTA COROLLA TSS2 2019 +b292d45117041581|2023-06-22--20-59-15--34 +# TOYOTA COROLLA TSS2 2019 +b135d4bbc0ace012|2023-07-28--08-46-43--5 +# TOYOTA COROLLA TSS2 2019 +b2a420a551c95f61|2023-06-10--13-52-14--2 +# TOYOTA COROLLA TSS2 2019 +b27aabf96cf81189|2023-07-20--17-59-53--9 +# TOYOTA COROLLA TSS2 2019 +ba2c31fbceccf0a2|2023-05-26--08-28-50--19 +# TOYOTA COROLLA TSS2 2019 +b8e73c4b855918a4|2023-06-23--22-09-47--5 +# TOYOTA COROLLA TSS2 2019 +b4cce6e306466c3a|2023-06-09--13-01-32--3 +# TOYOTA COROLLA TSS2 2019 +bc30537149678ec5|2023-07-16--09-33-33--4 +# TOYOTA COROLLA TSS2 2019 +bcb2e59018be5f0e|2023-05-22--14-41-32--295 +# TOYOTA COROLLA TSS2 2019 +bb6bc8e6ac2190dc|2023-05-31--16-10-00--53 +# TOYOTA COROLLA TSS2 2019 +b7440708a5e2c796|2023-06-21--19-37-36--9 +# TOYOTA COROLLA TSS2 2019 +c0023418edc8ed7b|2023-06-04--21-14-16--36 +# TOYOTA COROLLA TSS2 2019 +c33e7ea5e01511d3|2023-07-13--12-05-30--1 +# TOYOTA COROLLA TSS2 2019 +c9315a5b08fabfb4|2023-05-17--15-45-13--7 +# TOYOTA COROLLA TSS2 2019 +d02240bb0738ae9d|2023-07-04--19-59-49--37 +# TOYOTA COROLLA TSS2 2019 +d0bef3e100712fce|2023-05-23--07-58-05--3 +# TOYOTA COROLLA TSS2 2019 +d1830450c4c43463|2023-06-24--21-57-32--2 +# TOYOTA COROLLA TSS2 2019 +cf0bbb6c86836b73|2023-07-08--18-37-43--28 +# TOYOTA COROLLA TSS2 2019 +d2a3925946654cd3|2023-06-12--16-19-24--3 +# TOYOTA COROLLA TSS2 2019 +da803e391542cb10|2023-05-29--13-49-28--35 +# TOYOTA COROLLA TSS2 2019 +dcefbc5933b0e410|2023-06-14--19-00-09--3 +# TOYOTA COROLLA TSS2 2019 +e0601ce36770a765|2023-07-25--09-12-36--55 +# TOYOTA COROLLA TSS2 2019 +dfb993cc43ba69dc|2023-06-06--06-52-08--2 +# TOYOTA COROLLA TSS2 2019 +e5bbae6d1c740ba1|2023-06-19--12-57-23--14 +# TOYOTA COROLLA TSS2 2019 +e5bfe3f909216ef6|2023-07-25--18-03-22--7 +# TOYOTA COROLLA TSS2 2019 +e514e647fc5e28d0|2023-07-10--16-11-35--1 +# TOYOTA COROLLA TSS2 2019 +e01d990b9fafc7c7|2023-06-26--04-53-20--24 +# TOYOTA COROLLA TSS2 2019 +ead14b5ba31cdb4d|2023-08-05--21-07-24--107 +# TOYOTA COROLLA TSS2 2019 +e9b1885ec511d838|2023-05-15--09-35-44--42 +# TOYOTA COROLLA TSS2 2019 +e305dea90c599b82|2023-06-20--19-39-01--6 +# TOYOTA COROLLA TSS2 2019 +e8d19bce0da0148f|2023-07-28--16-53-43--13 +# TOYOTA COROLLA TSS2 2019 +f1c4e2a016e4de93|2023-07-19--21-27-01--3 +# TOYOTA COROLLA TSS2 2019 +f1b3bb0340f9b560|2023-07-26--09-19-02--22 +# TOYOTA COROLLA TSS2 2019 +eb7ac6daa55e0823|2023-06-10--19-14-01--4 +# TOYOTA COROLLA TSS2 2019 +f5695afee48c4efe|2023-05-12--08-12-59--21 +# TOYOTA COROLLA TSS2 2019 +feee8fadcb368355|2023-07-22--21-12-52--25 +# TOYOTA COROLLA TSS2 2019 +f82bb7e095cdd66f|2023-05-10--05-19-59--9 +# TOYOTA COROLLA TSS2 2019 +fe18f736cb0d7813|2023-05-24--19-43-43--10 +# CHRYSLER PACIFICA HYBRID 2019 +0e99ed1796cf0796|2023-07-01--13-12-55--14 +# CHRYSLER PACIFICA HYBRID 2019 +1943b3d682b7f11d|2023-07-09--13-56-25--20 +# CHRYSLER PACIFICA HYBRID 2019 +120a432f63cb0de2|2023-06-24--13-48-30--7 +# CHRYSLER PACIFICA HYBRID 2019 +1a10807c60c127fd|2023-06-05--18-28-54--44 +# CHRYSLER PACIFICA HYBRID 2019 +2b964a897363fb8d|2023-07-07--16-03-35--35 +# CHRYSLER PACIFICA HYBRID 2019 +2f6f39e4b14298b8|2023-05-28--18-25-37--43 +# CHRYSLER PACIFICA HYBRID 2019 +35176353a674cbdc|2023-06-04--18-26-00--52 +# CHRYSLER PACIFICA HYBRID 2019 +37004be1e4d06893|2023-08-04--00-57-55--1 +# CHRYSLER PACIFICA HYBRID 2019 +3e5d2ea720b2ade6|2023-05-18--20-54-26--14 +# CHRYSLER PACIFICA HYBRID 2019 +4395faadf0a373f2|2023-05-13--16-36-01--12 +# CHRYSLER PACIFICA HYBRID 2019 +4b17c71e7787e92f|2023-05-16--21-51-11--12 +# CHRYSLER PACIFICA HYBRID 2019 +63b6ad8d485e56a3|2023-07-17--09-57-27--20 +# CHRYSLER PACIFICA HYBRID 2019 +644df7356b2e465d|2023-06-10--21-35-04--90 +# CHRYSLER PACIFICA HYBRID 2019 +6244bf059e173e99|2023-07-30--09-14-03--15 +# CHRYSLER PACIFICA HYBRID 2019 +6d3ff8fbb8417635|2023-07-11--18-41-27--2 +# CHRYSLER PACIFICA HYBRID 2019 +7251ba2e0f80add1|2023-05-21--20-49-01--94 +# CHRYSLER PACIFICA HYBRID 2019 +7494bdf484b714e7|2023-05-15--22-44-48--48 +# CHRYSLER PACIFICA HYBRID 2019 +86deeb65f10c3129|2023-06-08--09-04-59--1 +# CHRYSLER PACIFICA HYBRID 2019 +8b4a62384ce1dbda|2023-07-10--20-20-58--8 +# CHRYSLER PACIFICA HYBRID 2019 +91190f5999463dd8|2023-06-12--11-38-07--3 +# CHRYSLER PACIFICA HYBRID 2019 +94586e8449ef012b|2023-06-08--14-38-27--5 +# CHRYSLER PACIFICA HYBRID 2019 +a3b4d4b4cb18bdad|2023-06-11--16-20-07--62 +# CHRYSLER PACIFICA HYBRID 2019 +aadbd1a661fb4da3|2023-08-03--13-56-56--2 +# CHRYSLER PACIFICA HYBRID 2019 +acb4cd444864d759|2023-05-12--22-57-05--9 +# CHRYSLER PACIFICA HYBRID 2019 +b398a1af9eea479f|2023-06-11--19-48-36--36 +# CHRYSLER PACIFICA HYBRID 2019 +cf10bbff2c1d2c6b|2023-07-10--08-53-44--2 +# CHRYSLER PACIFICA HYBRID 2019 +d8c9e6bde1d2900f|2023-06-15--10-51-56--3 +# CHRYSLER PACIFICA HYBRID 2019 +de666a40633d13fe|2023-07-28--14-19-44--12 +# CHRYSLER PACIFICA HYBRID 2019 +e51816839229e7c6|2023-07-08--13-44-57--1 +# CHRYSLER PACIFICA HYBRID 2019 +ec62067436775681|2023-07-19--18-28-32--26 +# CHRYSLER PACIFICA HYBRID 2019 +ed624dae6fed0e6b|2023-07-16--09-21-32--35 +# CHRYSLER PACIFICA HYBRID 2019 +ef47e9b061fba593|2023-05-13--21-59-33--5 +# CHRYSLER PACIFICA HYBRID 2019 +ede4a914fcc6fb6d|2023-08-02--14-13-23--3 +# CHRYSLER PACIFICA HYBRID 2019 +f421e8c2744fed7f|2023-06-30--13-10-52--24 +# CHRYSLER PACIFICA HYBRID 2019 +f6f46c9092a35916|2023-07-15--16-38-00--3 +# CHRYSLER PACIFICA HYBRID 2019 +f800ed88a5f7fa19|2023-07-11--11-16-38--5 +# CHRYSLER PACIFICA HYBRID 2019 +fe0f36c1b6573659|2023-07-19--15-06-52--7 +# CHEVROLET BOLT EUV 2022 +2334b466b5ba9cab|2023-05-31--17-06-45--9 +# CHEVROLET BOLT EUV 2022 +276dfdea5c6a45e0|2023-05-16--11-15-03--5 +# CHEVROLET BOLT EUV 2022 +186ece45c5f7730a|2023-06-05--12-57-13--5 +# CHEVROLET BOLT EUV 2022 +0def4a390f6fe5c0|2023-06-07--20-34-57--34 +# CHEVROLET BOLT EUV 2022 +161c32b370ac8d0f|2023-07-23--09-03-44--2 +# CHEVROLET BOLT EUV 2022 +1829f1c500a2c163|2023-07-27--16-07-15--11 +# CHEVROLET BOLT EUV 2022 +0ff88cd04a49e0b8|2023-06-06--21-03-24--4 +# CHEVROLET BOLT EUV 2022 +1ad81494603f8450|2023-06-15--16-34-30--8 +# CHEVROLET BOLT EUV 2022 +10b00eb757360a96|2023-06-30--10-31-18--19 +# CHEVROLET BOLT EUV 2022 +135b91dcfd6b31b1|2023-06-17--21-01-23--3 +# CHEVROLET BOLT EUV 2022 +297302e607039e23|2023-06-06--20-28-40--9 +# CHEVROLET BOLT EUV 2022 +18dbdce81b2402b0|2023-08-07--07-34-34--7 +# CHEVROLET BOLT EUV 2022 +2b4118b61e62995e|2023-07-15--15-17-08--10 +# CHEVROLET BOLT EUV 2022 +2d6490f23b2f8592|2023-08-07--10-00-17--12 +# CHEVROLET BOLT EUV 2022 +2fd7f5f47f793c9c|2023-05-21--12-19-26--15 +# CHEVROLET BOLT EUV 2022 +3140e1c6195c880e|2023-05-10--00-08-11--8 +# CHEVROLET BOLT EUV 2022 +36abd7f7160a9a75|2023-07-05--14-20-25--13 +# CHEVROLET BOLT EUV 2022 +3b68b660a77fd80e|2023-07-16--01-08-43--11 +# CHEVROLET BOLT EUV 2022 +446478f0404c86d3|2023-07-30--11-24-22--14 +# CHEVROLET BOLT EUV 2022 +43f2df44eba11325|2023-07-02--18-10-34--1 +# CHEVROLET BOLT EUV 2022 +43d44eef740e247b|2023-07-30--16-49-25--7 +# CHEVROLET BOLT EUV 2022 +45bcfa6a1dab12b2|2023-07-03--16-44-59--1 +# CHEVROLET BOLT EUV 2022 +4fe3129b0fc9aed8|2023-06-24--12-06-07--2 +# CHEVROLET BOLT EUV 2022 +50d49a7246b883d5|2023-06-20--09-05-14--47 +# CHEVROLET BOLT EUV 2022 +4c85a75ef10f7a6a|2023-07-31--11-57-04--42 +# CHEVROLET BOLT EUV 2022 +555d4087cf86aa91|2023-05-12--15-16-07--34 +# CHEVROLET BOLT EUV 2022 +583b1612bef234ed|2023-07-22--14-24-44--10 +# CHEVROLET BOLT EUV 2022 +63a62077852a6194|2023-07-31--12-11-15--14 +# CHEVROLET BOLT EUV 2022 +63cd6284b07989a9|2023-07-07--19-48-05--7 +# CHEVROLET BOLT EUV 2022 +6b654cb3eaade30b|2023-08-01--08-12-37--16 +# CHEVROLET BOLT EUV 2022 +6afbe9126b0b488e|2023-07-29--15-32-54--1 +# CHEVROLET BOLT EUV 2022 +715792adb472e791|2023-08-07--16-02-30--19 +# CHEVROLET BOLT EUV 2022 +77360d8b4b0aa355|2023-06-09--17-54-25--24 +# CHEVROLET BOLT EUV 2022 +79c2ed37b4345620|2023-07-08--22-23-27--4 +# CHEVROLET BOLT EUV 2022 +80c623f72cae73bb|2023-06-01--21-46-15--3 +# CHEVROLET BOLT EUV 2022 +82a90d8103afed98|2023-06-12--07-52-31--23 +# CHEVROLET BOLT EUV 2022 +8490e1e599660163|2023-05-15--06-17-33--1 +# CHEVROLET BOLT EUV 2022 +894c916ba5d876c1|2023-06-06--06-55-07--15 +# CHEVROLET BOLT EUV 2022 +8ed03d21b3c15090|2023-06-22--22-10-54--33 +# CHEVROLET BOLT EUV 2022 +93fbf2642ce58ddf|2023-06-27--15-39-36--5 +# CHEVROLET BOLT EUV 2022 +988fdc2a62b72489|2023-06-29--22-43-31--15 +# CHEVROLET BOLT EUV 2022 +986c6ba7f7118db8|2023-07-03--15-12-47--7 +# CHEVROLET BOLT EUV 2022 +989d9a23ae4cbc76|2023-06-03--21-50-50--4 +# CHEVROLET BOLT EUV 2022 +9e27a5ad608f9b5d|2023-07-28--19-22-22--5 +# CHEVROLET BOLT EUV 2022 +9d07b85adb1c7959|2023-07-24--19-16-41--12 +# CHEVROLET BOLT EUV 2022 +a1c6fc5f9e1c0641|2023-07-26--18-20-50--2 +# CHEVROLET BOLT EUV 2022 +a40f0130fa3d0aaf|2023-07-25--10-57-51--89 +# CHEVROLET BOLT EUV 2022 +a8632896bc8c451f|2023-05-21--10-22-51--3 +# CHEVROLET BOLT EUV 2022 +aea39a07b9a7343f|2023-07-09--17-06-28--8 +# CHEVROLET BOLT EUV 2022 +b7709c9bd2bb88fd|2023-06-18--12-43-53--46 +# CHEVROLET BOLT EUV 2022 +b79a39df75584415|2023-07-04--22-01-28--21 +# CHEVROLET BOLT EUV 2022 +bd059400a5cde994|2023-07-04--16-14-42--4 +# CHEVROLET BOLT EUV 2022 +bf073985dfe87f7a|2023-08-04--14-12-05--11 +# CHEVROLET BOLT EUV 2022 +be4060e17a23ffdd|2023-05-20--14-36-48--3 +# CHEVROLET BOLT EUV 2022 +c401b4043ba9000a|2023-08-03--14-48-07--29 +# CHEVROLET BOLT EUV 2022 +b9a4ef3d6f3df97b|2023-08-03--05-45-23--35 +# CHEVROLET BOLT EUV 2022 +c6d15839fd14a490|2023-05-12--07-40-52--16 +# CHEVROLET BOLT EUV 2022 +d061de08f31aeed7|2023-05-30--14-22-41--75 +# CHEVROLET BOLT EUV 2022 +d1f071678ccb1920|2023-07-11--15-10-34--2 +# CHEVROLET BOLT EUV 2022 +d08af0cf79acfd74|2023-07-19--05-13-02--2 +# CHEVROLET BOLT EUV 2022 +d4dfed34943b6c7e|2023-07-20--08-10-21--20 +# CHEVROLET BOLT EUV 2022 +dbc1d04685612ecc|2023-05-15--17-57-58--3 +# CHEVROLET BOLT EUV 2022 +da4d62ee196295d4|2023-07-28--19-30-36--29 +# CHEVROLET BOLT EUV 2022 +da4f7891ae804737|2023-07-06--14-28-22--12 +# CHEVROLET BOLT EUV 2022 +dc50076c39d4257c|2023-06-01--20-16-39--1 +# CHEVROLET BOLT EUV 2022 +dda7599351b213bc|2023-06-13--05-36-42--5 +# CHEVROLET BOLT EUV 2022 +dc2696502990ee07|2023-08-05--06-27-00--8 +# CHEVROLET BOLT EUV 2022 +e340670ab48ba88a|2023-07-29--21-21-49--8 +# CHEVROLET BOLT EUV 2022 +ea4cb0f25db44a80|2023-06-14--05-18-10--19 +# CHEVROLET BOLT EUV 2022 +ed9dc2d827252019|2023-07-27--06-22-48--42 +# CHEVROLET BOLT EUV 2022 +f1ed193b05fe93b0|2023-05-11--18-47-03--3 +# CHEVROLET BOLT EUV 2022 +ef91b5c6792c0a7a|2023-07-31--20-36-50--1 +# CHEVROLET BOLT EUV 2022 +f89a0a966e54f7ff|2023-07-15--20-44-12--8 +# CHEVROLET BOLT EUV 2022 +fc55aed7a9efb49c|2023-06-08--08-01-19--23 +# TOYOTA CAMRY 2021 +093be653a841c345|2023-05-10--19-37-55--15 +# TOYOTA CAMRY 2021 +0a7615a819224eab|2023-05-18--17-00-34--181 +# TOYOTA CAMRY 2021 +1f9891d5a64661ef|2023-06-02--17-00-36--19 +# TOYOTA CAMRY 2021 +2307361bfeefee69|2023-06-08--17-48-28--70 +# TOYOTA CAMRY 2021 +06a5dbcee3ab12f1|2023-07-26--07-57-11--1 +# TOYOTA CAMRY 2021 +037c07a9b40d78a2|2023-05-18--22-31-50--21 +# TOYOTA CAMRY 2021 +3cf34a46abd8addd|2023-07-25--10-03-16--16 +# TOYOTA CAMRY 2021 +470698275bafef42|2023-07-31--06-34-13--8 +# TOYOTA CAMRY 2021 +5231cc88de0139ab|2023-06-14--13-33-32--7 +# TOYOTA CAMRY 2021 +528789e4391481cf|2023-07-27--15-16-03--16 +# TOYOTA CAMRY 2021 +552129078b970cd3|2023-07-25--09-41-30--20 +# TOYOTA CAMRY 2021 +5d4b81649a4bce56|2023-08-01--12-01-18--2 +# TOYOTA CAMRY 2021 +6f26453738f35634|2023-05-21--13-32-12--13 +# TOYOTA CAMRY 2021 +73088e067b2fb9d4|2023-05-12--08-24-31--25 +# TOYOTA CAMRY 2021 +8acd130e9e5d0cf8|2023-06-13--12-05-18--35 +# TOYOTA CAMRY 2021 +8c8ab5e2b14c51c9|2023-05-26--18-37-04--33 +# TOYOTA CAMRY 2021 +876a156a1191834d|2023-07-13--18-37-18--7 +# TOYOTA CAMRY 2021 +a092c3532573731f|2023-08-02--14-19-03--2 +# TOYOTA CAMRY 2021 +a7244a988251077d|2023-05-20--08-40-16--2 +# TOYOTA CAMRY 2021 +b7f21591ba459403|2023-06-02--18-32-59--20 +# TOYOTA CAMRY 2021 +b4f83330b2d59205|2023-05-16--18-20-35--9 +# TOYOTA CAMRY 2021 +bae56b301710cdf0|2023-05-30--07-44-31--23 +# TOYOTA CAMRY 2021 +c70d69b11bfb697d|2023-06-17--18-51-02--8 +# TOYOTA CAMRY 2021 +cc7c8c846c338570|2023-07-10--08-37-46--26 +# TOYOTA CAMRY 2021 +c4e9230919b74f75|2023-06-20--17-57-36--20 +# TOYOTA CAMRY 2021 +d45c4dcf8ea2f5d4|2023-07-18--12-10-14--71 +# TOYOTA CAMRY 2021 +d9d5a5d9f4ae2ad6|2023-05-27--10-56-51--7 +# TOYOTA CAMRY 2021 +f47661feccc29204|2023-05-13--19-57-58--11 +# TOYOTA CAMRY 2018 +043c1d59829f98e1|2023-05-15--16-39-19--18 +# TOYOTA CAMRY 2018 +2f37fc0d2ebb8cfe|2023-07-28--10-38-40--40 +# TOYOTA CAMRY 2018 +67f3731c5f3afaa2|2023-06-05--20-19-00--15 +# TOYOTA CAMRY 2018 +8dd5cd20feef7daf|2023-05-31--15-48-11--2 +# TOYOTA CAMRY 2018 +8eb7ff2f26051984|2023-05-17--10-07-44--23 +# TOYOTA CAMRY 2018 +aae51b841b955820|2023-05-21--00-01-38--3 +# TOYOTA CAMRY 2018 +b00f418d2b66cfa2|2023-05-27--16-36-37--129 +# TOYOTA CAMRY 2018 +b711d49263f20146|2023-06-23--17-30-14--137 +# TOYOTA CAMRY 2018 +c5827e54d59bdcc2|2023-08-03--18-40-21--1 +# TOYOTA CAMRY 2018 +c6503f6534bf811a|2023-08-07--14-05-15--1 +# TOYOTA CAMRY 2018 +eddf8030d2c0fbd8|2023-05-17--07-20-36--18 +# TOYOTA CAMRY 2018 +ef6bd990e34920b1|2023-07-25--08-53-09--1 +# CHEVROLET SILVERADO 1500 2020 +1092d371df987f78|2023-07-11--08-18-42--1 +# CHEVROLET SILVERADO 1500 2020 +2a3958b34246e3b7|2023-07-09--16-52-48--23 +# CHEVROLET SILVERADO 1500 2020 +25a42ae6068112ed|2023-07-19--08-46-57--6 +# CHEVROLET SILVERADO 1500 2020 +34d4e668268e0cc8|2023-06-24--18-00-35--12 +# CHEVROLET SILVERADO 1500 2020 +38aa7da107d5d252|2023-06-03--23-00-13--7 +# CHEVROLET SILVERADO 1500 2020 +3c760901e7b30fe2|2023-07-24--10-35-18--2 +# CHEVROLET SILVERADO 1500 2020 +5085c761395d1fe6|2023-05-26--18-54-08--17 +# CHEVROLET SILVERADO 1500 2020 +602051db17fb6945|2023-06-11--14-11-45--16 +# CHEVROLET SILVERADO 1500 2020 +b83dd25fd69d185a|2023-07-09--11-11-25--13 +# CHEVROLET SILVERADO 1500 2020 +c5762c796866f52b|2023-06-01--11-09-58--40 +# CHEVROLET SILVERADO 1500 2020 +cc2c095689982e90|2023-06-16--15-19-12--15 +# CHEVROLET SILVERADO 1500 2020 +d89ba4ef9ca61255|2023-06-05--20-19-55--1 +# CHEVROLET SILVERADO 1500 2020 +f04339ee7d0a4f4f|2023-07-06--12-12-45--1 +# CHEVROLET SILVERADO 1500 2020 +f1a814b2d113041b|2023-06-14--20-39-56--46 +# CHEVROLET SILVERADO 1500 2020 +f4ff60e509c0efad|2023-07-17--08-45-55--10 +# CHEVROLET SILVERADO 1500 2020 +fe80a4e1cedec853|2023-07-26--19-16-06--9 +# CHRYSLER PACIFICA 2018 +2137b01aa0ca63f9|2023-06-19--16-31-25--12 +# CHRYSLER PACIFICA 2018 +0a3e89f78b1d0071|2023-07-04--13-44-33--37 +# CHRYSLER PACIFICA 2018 +2900033dd47fa445|2023-07-19--10-02-00--5 +# CHRYSLER PACIFICA 2018 +0d67197945512e16|2023-06-02--18-33-08--186 +# CHRYSLER PACIFICA 2018 +454c31a132f2c003|2023-06-24--19-40-37--208 +# CHRYSLER PACIFICA 2018 +53f2206925c37581|2023-05-20--11-40-22--4 +# CHRYSLER PACIFICA 2018 +6732a0b0508ffc0e|2023-05-11--09-02-51--1 +# CHRYSLER PACIFICA 2018 +8363f866866f25e7|2023-05-10--06-55-11--26 +# CHRYSLER PACIFICA 2018 +87caf137ebd1c6f6|2023-07-05--12-13-27--4 +# CHRYSLER PACIFICA 2018 +89e4d9d4b8ec175c|2023-08-07--13-07-13--128 +# CHRYSLER PACIFICA 2018 +8fc6a1b72c8b1357|2023-07-31--06-08-43--18 +# CHRYSLER PACIFICA 2018 +e13cd4efc12b3ed9|2023-06-02--23-27-54--10 +# HYUNDAI SANTA FE 2019 +124457b31149107e|2023-06-11--17-33-36--39 +# HYUNDAI SANTA FE 2019 +0b2b36cf5a0789db|2023-05-30--21-15-07--17 +# HYUNDAI SANTA FE 2019 +2febc4fb44b77feb|2023-06-19--10-18-04--12 +# HYUNDAI SANTA FE 2019 +45a8ffd448481ce2|2023-06-11--11-43-42--69 +# HYUNDAI SANTA FE 2019 +47ba5e6f0490d659|2023-05-19--13-11-38--21 +# HYUNDAI SANTA FE 2019 +6af67ee8ad45b46d|2023-06-09--12-43-30--3 +# HYUNDAI SANTA FE 2019 +7effea3e618a7eff|2023-07-02--14-51-45--20 +# HYUNDAI SANTA FE 2019 +9ebc35731309da40|2023-05-15--20-55-46--5 +# HYUNDAI SANTA FE 2019 +ac34a01eff94e7d2|2023-06-09--11-20-45--1 +# HYUNDAI SANTA FE 2019 +dae9868756e02256|2023-05-24--21-02-45--14 +# HYUNDAI SANTA FE 2019 +e8a6a6776c51a45c|2023-05-14--14-07-00--6 +# HYUNDAI SANTA FE 2019 +ea9d3b13a4799604|2023-05-19--19-43-27--31 +# HYUNDAI SANTA FE 2019 +fddc8d2cbb48ec6f|2023-06-02--17-35-08--16 +# HONDA ACCORD 2018 +190b11018a714a28|2023-07-12--17-54-06--29 +# HONDA ACCORD 2018 +17a3b6806ff8e041|2023-05-19--16-04-06--24 +# HONDA ACCORD 2018 +0dacabc563f7e7d7|2023-06-04--21-45-33--4 +# HONDA ACCORD 2018 +10d6a69109431519|2023-05-28--14-21-19--19 +# HONDA ACCORD 2018 +05bcd2ee65199207|2023-07-19--18-22-21--6 +# HONDA ACCORD 2018 +0c676e287b251a20|2023-07-28--06-19-37--105 +# HONDA ACCORD 2018 +0793ebd391c355da|2023-07-20--06-35-32--19 +# HONDA ACCORD 2018 +005d4e7ceb089cfd|2023-07-13--07-22-49--18 +# HONDA ACCORD 2018 +214a25adc54636fc|2023-05-18--10-45-47--1 +# HONDA ACCORD 2018 +1ebe446c9f466f50|2023-05-16--03-37-24--1 +# HONDA ACCORD 2018 +0bbb933eda8ae17c|2023-07-01--20-27-36--179 +# HONDA ACCORD 2018 +2e08aac41ed464a6|2023-07-31--14-35-02--3 +# HONDA ACCORD 2018 +2ca8270fc59b50f3|2023-06-23--07-59-23--5 +# HONDA ACCORD 2018 +39ac3639fcffc102|2023-07-20--21-06-28--268 +# HONDA ACCORD 2018 +37b721607b521682|2023-07-20--15-09-59--25 +# HONDA ACCORD 2018 +3d151bec9fd04d09|2023-07-25--16-06-41--8 +# HONDA ACCORD 2018 +3b417dee7be1d8dd|2023-07-06--06-11-05--26 +# HONDA ACCORD 2018 +49c7b83d348197ed|2023-07-24--21-19-42--2 +# HONDA ACCORD 2018 +4ff67da1be2f4f43|2023-05-12--21-10-12--12 +# HONDA ACCORD 2018 +5e7e1a7c1d61b456|2023-06-19--19-36-24--60 +# HONDA ACCORD 2018 +69db8ee3bf677945|2023-07-24--21-17-32--74 +# HONDA ACCORD 2018 +73dbd685214c0e03|2023-06-01--12-47-34--67 +# HONDA ACCORD 2018 +7dde4489ff0a6c80|2023-06-07--20-10-09--6 +# HONDA ACCORD 2018 +82d1e3d3c754bf2a|2023-05-16--08-21-26--2 +# HONDA ACCORD 2018 +80d45cf838f8c716|2023-07-17--16-29-49--6 +# HONDA ACCORD 2018 +889163fc61871a68|2023-05-16--17-18-58--5 +# HONDA ACCORD 2018 +8b22d387ab08c5db|2023-07-15--21-35-09--2 +# HONDA ACCORD 2018 +8aaa7ccc2fc68822|2023-07-09--20-09-02--1 +# HONDA ACCORD 2018 +90d95c7fd3fa748a|2023-06-16--14-04-08--61 +# HONDA ACCORD 2018 +9d8f86b8b11b65c9|2023-06-30--19-33-48--156 +# HONDA ACCORD 2018 +a33e427bbd337300|2023-07-12--09-54-45--12 +# HONDA ACCORD 2018 +a3669d37d7fe28c2|2023-06-01--17-08-16--2 +# HONDA ACCORD 2018 +a85202e1dca5afaf|2023-06-21--11-46-10--20 +# HONDA ACCORD 2018 +a454b11d7910c242|2023-06-14--16-11-49--25 +# HONDA ACCORD 2018 +aca10b5acd89289d|2023-07-12--20-03-23--4 +# HONDA ACCORD 2018 +b3a1a214664b7d31|2023-07-28--16-21-31--23 +# HONDA ACCORD 2018 +b9028def8e733ee6|2023-05-16--18-34-52--7 +# HONDA ACCORD 2018 +bf887c016d27cca5|2023-07-31--12-34-34--1 +# HONDA ACCORD 2018 +c642bd29f2858d75|2023-06-27--08-21-19--9 +# HONDA ACCORD 2018 +c2143a4f3723576c|2023-06-21--12-51-06--16 +# HONDA ACCORD 2018 +cfb71d30183708f8|2023-07-30--12-40-33--6 +# HONDA ACCORD 2018 +d09c814b908913a2|2023-06-13--19-19-07--16 +# HONDA ACCORD 2018 +d37dc158651867ca|2023-06-03--16-03-15--2 +# HONDA ACCORD 2018 +d83010e83c7f87ea|2023-05-24--15-15-58--20 +# HONDA ACCORD 2018 +d8f44985fa82e7f5|2023-05-10--22-40-13--4 +# HONDA ACCORD 2018 +eb6f3ff143d0fac5|2023-05-23--10-51-44--7 +# HONDA ACCORD 2018 +ee1874709eb8b485|2023-05-11--17-10-40--183 +# HONDA ACCORD 2018 +ef6f577d770521e4|2023-05-10--07-44-14--32 +# TOYOTA COROLLA 2017 +00acf2e4c8c6b549|2023-07-01--20-25-46--8 +# TOYOTA COROLLA 2017 +053f594b05527a80|2023-07-26--01-47-44--33 +# TOYOTA COROLLA 2017 +16a9664d939d9efe|2023-06-24--20-10-27--5 +# TOYOTA COROLLA 2017 +364bb492aa33d7df|2023-06-06--07-47-54--23 +# TOYOTA COROLLA 2017 +39932c340e596ead|2023-06-29--21-47-38--11 +# TOYOTA COROLLA 2017 +3c3ea5134c90308a|2023-06-22--22-11-10--4 +# TOYOTA COROLLA 2017 +5a596be432c5fe53|2023-06-11--17-10-36--38 +# TOYOTA COROLLA 2017 +728c59e1123e2cf7|2023-05-16--16-05-22--9 +# TOYOTA COROLLA 2017 +718042f01647e90e|2023-06-21--22-29-28--10 +# TOYOTA COROLLA 2017 +7d48b40fb8782bda|2023-08-05--13-16-29--23 +# TOYOTA COROLLA 2017 +7ec9410b593c7d5a|2023-06-29--17-29-56--19 +# TOYOTA COROLLA 2017 +869558002728e30b|2023-08-02--14-19-46--6 +# TOYOTA COROLLA 2017 +887e76d536c1841e|2023-07-06--07-17-09--12 +# TOYOTA COROLLA 2017 +993aa9f1c1e81499|2023-07-14--19-08-45--10 +# TOYOTA COROLLA 2017 +975cdde87029652a|2023-07-04--17-39-43--4 +# TOYOTA COROLLA 2017 +a152dad3c3368320|2023-05-19--14-16-10--47 +# TOYOTA COROLLA 2017 +a61d43139939b1ac|2023-05-29--11-20-51--3 +# TOYOTA COROLLA 2017 +adb85c50d47ac0a9|2023-05-14--20-29-11--1 +# TOYOTA COROLLA 2017 +b86a9aad74db6ec7|2023-07-14--16-25-56--7 +# TOYOTA COROLLA 2017 +b9fc453e3021b7ff|2023-05-23--15-16-18--3 +# TOYOTA COROLLA 2017 +bc7a33f454ca54e8|2023-06-13--22-23-55--10 +# TOYOTA COROLLA 2017 +d29979b337e5381c|2023-06-22--21-45-44--6 +# TOYOTA COROLLA 2017 +d3faefc00d1e3660|2023-06-02--19-59-19--30 +# TOYOTA COROLLA 2017 +d1e714006749bfa5|2023-06-02--14-50-02--2 +# TOYOTA COROLLA 2017 +cf700d069c05bba8|2023-07-13--16-25-32--1 +# TOYOTA COROLLA 2017 +d9abb1b68b7289ae|2023-07-21--18-47-15--1 +# TOYOTA COROLLA 2017 +d4c10d06c1bb7800|2023-07-16--21-41-26--54 +# TOYOTA COROLLA 2017 +d89badbe085c52c1|2023-05-13--22-32-35--16 +# TOYOTA COROLLA 2017 +ea53462ef36d4315|2023-05-13--10-56-42--8 +# TOYOTA COROLLA 2017 +e831c4e62fba9a0f|2023-07-16--18-27-58--109 +# TOYOTA COROLLA 2017 +f74a24ad37ed9773|2023-06-02--17-56-50--2 +# TOYOTA COROLLA 2017 +f467e0cd91910513|2023-07-12--14-53-24--7 +# TOYOTA COROLLA 2017 +fb0d04ba394c06f2|2023-05-21--17-58-49--9 +# NISSAN LEAF 2018 +0b17985326a570c4|2023-07-24--17-13-53--44 +# NISSAN LEAF 2018 +1dd434bd0ea8aaa4|2023-05-17--06-25-44--11 +# NISSAN LEAF 2018 +29a1b6293b68f2a9|2023-05-28--14-39-04--3 +# NISSAN LEAF 2018 +02cd1b196ec17045|2023-07-25--10-07-20--55 +# NISSAN LEAF 2018 +289d318fded3221a|2023-06-18--09-36-51--109 +# NISSAN LEAF 2018 +39bf496887ea52e5|2023-05-12--07-00-53--34 +# NISSAN LEAF 2018 +4a9d0cf499314bec|2023-05-25--08-01-49--6 +# NISSAN LEAF 2018 +4ed383d0670d4b71|2023-06-18--13-09-17--29 +# NISSAN LEAF 2018 +6b51011199473e01|2023-08-04--14-10-11--7 +# NISSAN LEAF 2018 +7605de164f235364|2023-07-10--16-02-26--2 +# NISSAN LEAF 2018 +9299dd7dadb9007e|2023-06-22--14-05-43--71 +# NISSAN LEAF 2018 +962c4e8ab4396060|2023-06-24--10-43-41--5 +# NISSAN LEAF 2018 +969dd380d52937c6|2023-07-18--21-02-34--1 +# NISSAN LEAF 2018 +ba9225dd390fe75e|2023-05-27--14-19-20--12 +# NISSAN LEAF 2018 +bc12abb1f8ec2243|2023-05-23--16-17-37--4 +# NISSAN LEAF 2018 +c0516da831df9eaf|2023-07-14--16-54-04--3 +# NISSAN LEAF 2018 +bd349df2aad3c6fc|2023-07-11--08-00-00--25 +# NISSAN LEAF 2018 +b9a45053d2ded48b|2023-07-27--05-17-46--16 +# NISSAN LEAF 2018 +d045889f89a2b9a5|2023-07-21--12-27-36--13 +# ACURA RDX 2020 +1943107bbdc1070e|2023-05-14--20-02-24--108 +# ACURA RDX 2020 +23846edb2f7988e3|2023-06-09--21-02-00--65 +# ACURA RDX 2020 +9d3a5a3049d6c50d|2023-05-23--14-03-48--4 +# ACURA RDX 2020 +f8d72ec3768bc1f1|2023-07-19--19-05-48--11 +# ACURA RDX 2020 +fd5000ecde671462|2023-06-06--18-03-06--19 +# TOYOTA HIGHLANDER 2020 +144a496ccff4a0b4|2023-07-25--16-51-08--13 +# TOYOTA HIGHLANDER 2020 +0d44dc6722628b26|2023-06-19--09-17-31--8 +# TOYOTA HIGHLANDER 2020 +29e4d80dc9a37da5|2023-07-14--08-52-21--6 +# TOYOTA HIGHLANDER 2020 +2378eb8397a2b782|2023-05-13--18-10-35--48 +# TOYOTA HIGHLANDER 2020 +24bef3a2265d4af2|2023-06-05--08-39-30--4 +# TOYOTA HIGHLANDER 2020 +004e41c4761b3bf6|2023-05-11--16-02-55--15 +# TOYOTA HIGHLANDER 2020 +343e82c046c8f6dc|2023-05-30--16-07-55--21 +# TOYOTA HIGHLANDER 2020 +3ffc7b8fd385a504|2023-06-18--13-55-18--3 +# TOYOTA HIGHLANDER 2020 +41860f9bcb6f44b8|2023-07-09--12-52-21--24 +# TOYOTA HIGHLANDER 2020 +3d51bfc7ff880232|2023-05-11--17-34-52--13 +# TOYOTA HIGHLANDER 2020 +4d9d41e34fd9dd71|2023-06-18--13-21-37--15 +# TOYOTA HIGHLANDER 2020 +521a0922e3a04935|2023-05-13--18-45-20--44 +# TOYOTA HIGHLANDER 2020 +55c9f8b884d1db87|2023-06-24--09-58-10--4 +# TOYOTA HIGHLANDER 2020 +5c87f40f937ed46e|2023-06-17--23-40-13--16 +# TOYOTA HIGHLANDER 2020 +5fe239629c1a6cc6|2023-05-25--10-35-55--5 +# TOYOTA HIGHLANDER 2020 +597a8b0eb0c8853b|2023-07-12--12-38-41--2 +# TOYOTA HIGHLANDER 2020 +68863076c79b6e46|2023-07-18--18-27-05--2 +# TOYOTA HIGHLANDER 2020 +68dfa9ee803399d1|2023-06-16--16-12-34--62 +# TOYOTA HIGHLANDER 2020 +6c4eb3920653c33f|2023-06-11--17-26-48--38 +# TOYOTA HIGHLANDER 2020 +709398cb20ec2c8d|2023-07-31--11-04-29--1 +# TOYOTA HIGHLANDER 2020 +702527f5122b8600|2023-07-04--21-51-58--32 +# TOYOTA HIGHLANDER 2020 +71b0f13abdc777f0|2023-06-25--12-30-46--1 +# TOYOTA HIGHLANDER 2020 +75157fa04b7760e2|2023-06-18--14-13-08--8 +# TOYOTA HIGHLANDER 2020 +7332469da3c215b9|2023-06-30--16-06-09--23 +# TOYOTA HIGHLANDER 2020 +7a8dc1b623ec968b|2023-06-26--13-19-39--46 +# TOYOTA HIGHLANDER 2020 +7aead72b15132868|2023-08-07--15-32-55--22 +# TOYOTA HIGHLANDER 2020 +82d9c4c8a45c33d3|2023-07-16--10-29-19--6 +# TOYOTA HIGHLANDER 2020 +85f0cc9d2a7783e5|2023-07-06--15-06-13--2 +# TOYOTA HIGHLANDER 2020 +8527a913671bf82b|2023-07-29--11-52-54--36 +# TOYOTA HIGHLANDER 2020 +84050035bc8a4693|2023-06-14--09-20-16--27 +# TOYOTA HIGHLANDER 2020 +878a25353867b7e1|2023-06-04--19-13-19--5 +# TOYOTA HIGHLANDER 2020 +91eefbd00e06a375|2023-05-21--13-02-56--149 +# TOYOTA HIGHLANDER 2020 +8efd012fc8bc01ed|2023-05-13--13-33-26--16 +# TOYOTA HIGHLANDER 2020 +962482e363d8db53|2023-06-13--15-07-46--189 +# TOYOTA HIGHLANDER 2020 +9ef0941be9f8057d|2023-07-11--17-55-34--1 +# TOYOTA HIGHLANDER 2020 +a2c22070a4a86296|2023-05-17--20-50-51--1 +# TOYOTA HIGHLANDER 2020 +9dce1db48e723a7d|2023-05-22--20-05-34--4 +# TOYOTA HIGHLANDER 2020 +b39c8956c329f098|2023-07-01--15-32-06--8 +# TOYOTA HIGHLANDER 2020 +b67488601fc02963|2023-06-09--13-23-41--20 +# TOYOTA HIGHLANDER 2020 +b75bae9b9bde6210|2023-07-30--08-16-42--46 +# TOYOTA HIGHLANDER 2020 +ba14fa06ffd18df7|2023-06-10--21-16-42--6 +# TOYOTA HIGHLANDER 2020 +bf17b81eba9bf96e|2023-06-09--12-08-11--4 +# TOYOTA HIGHLANDER 2020 +b42bff5ee5d24c72|2023-08-07--17-03-15--29 +# TOYOTA HIGHLANDER 2020 +c006eb73d0b11b29|2023-07-30--12-03-27--62 +# TOYOTA HIGHLANDER 2020 +ce24faef3afe2803|2023-05-17--14-50-24--31 +# TOYOTA HIGHLANDER 2020 +d45a24d7a5a78a2f|2023-05-18--19-16-17--42 +# TOYOTA HIGHLANDER 2020 +d13b3d6d7d5529cf|2023-06-02--17-59-00--7 +# TOYOTA HIGHLANDER 2020 +e0001dc12a80b287|2023-07-05--08-10-47--31 +# TOYOTA HIGHLANDER 2020 +ec46c46b25ceac9c|2023-05-17--09-09-32--10 +# TOYOTA HIGHLANDER 2020 +eda8da0edd1c99c9|2023-07-23--13-03-07--9 +# TOYOTA HIGHLANDER 2020 +f2a06f696f9517b3|2023-07-06--13-58-37--7 +# TOYOTA HIGHLANDER 2020 +f5e4b280d1756282|2023-07-18--09-58-12--7 +# TOYOTA HIGHLANDER 2020 +f50cf090ee700251|2023-08-02--15-21-29--5 +# TOYOTA HIGHLANDER 2020 +f96a58a51695b2ce|2023-06-23--20-54-30--18 +# TOYOTA HIGHLANDER 2020 +f60c2e0e7fd95935|2023-05-15--10-15-08--2 +# TOYOTA HIGHLANDER 2020 +f9ea0ffa53d5759a|2023-06-28--10-59-17--5 +# TOYOTA HIGHLANDER 2020 +fd23445cb8537751|2023-07-30--13-32-59--17 +# TOYOTA COROLLA TSS2 2019 +09469776862f3ab8|2023-07-16--15-55-22--17 +# TOYOTA COROLLA TSS2 2019 +075b133b6181e058|2023-07-28--20-07-44--3 +# TOYOTA COROLLA TSS2 2019 +0fbfcf01e4882a83|2023-05-30--15-16-34--6 +# TOYOTA COROLLA TSS2 2019 +0e12554bfe8687d3|2023-07-04--11-36-31--2 +# TOYOTA COROLLA TSS2 2019 +0921b5e7de3ae0b5|2023-05-24--11-51-14--13 +# TOYOTA COROLLA TSS2 2019 +14a8b23f850f4d11|2023-06-12--15-23-21--34 +# TOYOTA COROLLA TSS2 2019 +0fe5135182d67910|2023-05-19--15-08-54--9 +# TOYOTA COROLLA TSS2 2019 +213b44717a9bc58e|2023-07-18--17-09-13--17 +# TOYOTA COROLLA TSS2 2019 +08d7726c5efb3caa|2023-08-01--09-27-21--20 +# TOYOTA COROLLA TSS2 2019 +182caf5dcf20ca16|2023-05-21--15-13-55--226 +# TOYOTA COROLLA TSS2 2019 +0a4445a705516261|2023-06-23--19-18-06--1 +# TOYOTA COROLLA TSS2 2019 +1d0e096df3cecedd|2023-05-31--17-44-20--25 +# TOYOTA COROLLA TSS2 2019 +21788d8d115dfff4|2023-06-02--21-11-27--18 +# TOYOTA COROLLA TSS2 2019 +2b967c9ee4146686|2023-07-04--12-18-13--76 +# TOYOTA COROLLA TSS2 2019 +2ddc8f97834a7e52|2023-06-17--13-56-27--150 +# TOYOTA COROLLA TSS2 2019 +376abd6a7d6c6fa0|2023-08-05--22-10-41--14 +# TOYOTA COROLLA TSS2 2019 +33833d235dea00c8|2023-05-10--15-37-53--27 +# TOYOTA COROLLA TSS2 2019 +39977e9eacdfebb6|2023-07-31--13-31-52--4 +# TOYOTA COROLLA TSS2 2019 +3eb4c34a2a663c37|2023-07-20--11-54-00--36 +# TOYOTA COROLLA TSS2 2019 +3d9c00d3509fd1a5|2023-05-17--12-46-23--1 +# TOYOTA COROLLA TSS2 2019 +3d2b038d1276f564|2023-07-09--12-35-09--14 +# TOYOTA COROLLA TSS2 2019 +421d8e266db99689|2023-08-07--21-14-05--17 +# TOYOTA COROLLA TSS2 2019 +4f50e44908cc46b8|2023-07-28--11-21-40--6 +# TOYOTA COROLLA TSS2 2019 +54a0066de4f6aa53|2023-05-11--07-56-38--15 +# TOYOTA COROLLA TSS2 2019 +60dcd78f23ffcb45|2023-05-31--20-57-42--216 +# TOYOTA COROLLA TSS2 2019 +669372fc0cdbad34|2023-06-22--16-48-24--69 +# TOYOTA COROLLA TSS2 2019 +6ca6cd014b18339b|2023-06-09--20-14-34--30 +# TOYOTA COROLLA TSS2 2019 +6c7b3c70cde5154a|2023-08-08--08-49-34--8 +# TOYOTA COROLLA TSS2 2019 +77bc3a1ef88b0f8c|2023-05-10--13-34-25--3 +# TOYOTA COROLLA TSS2 2019 +7fa981d6c0f04ab5|2023-05-11--07-24-47--15 +# TOYOTA COROLLA TSS2 2019 +80e58d853114e409|2023-06-21--18-02-42--11 +# TOYOTA COROLLA TSS2 2019 +8d23badbf0a9ea4b|2023-07-08--16-39-30--11 +# TOYOTA COROLLA TSS2 2019 +885386596e3eeb9d|2023-08-01--12-35-23--329 +# TOYOTA COROLLA TSS2 2019 +9d7fa9fa4e27966b|2023-07-09--06-25-37--20 +# TOYOTA COROLLA TSS2 2019 +a9e171cea6aa8261|2023-08-04--19-47-40--278 +# TOYOTA COROLLA TSS2 2019 +acd2094a4e29a830|2023-05-23--07-47-56--1 +# TOYOTA COROLLA TSS2 2019 +b4776f404cd487b0|2023-06-30--19-23-05--54 +# TOYOTA COROLLA TSS2 2019 +b0a7a22dea55a1cd|2023-05-28--12-39-18--29 +# TOYOTA COROLLA TSS2 2019 +b49892b434816269|2023-05-16--06-38-31--74 +# TOYOTA COROLLA TSS2 2019 +b41c77a268a0a16f|2023-06-11--11-51-19--2 +# TOYOTA COROLLA TSS2 2019 +bf8377a19ba31955|2023-06-10--16-34-28--28 +# TOYOTA COROLLA TSS2 2019 +c188b4341879aa18|2023-07-12--19-49-05--19 +# TOYOTA COROLLA TSS2 2019 +c1c8b3b7eaef25cc|2023-05-30--16-59-41--5 +# TOYOTA COROLLA TSS2 2019 +bb3106a9271328e3|2023-07-05--10-13-36--2 +# TOYOTA COROLLA TSS2 2019 +c7400d04331ac3ee|2023-05-26--18-06-31--74 +# TOYOTA COROLLA TSS2 2019 +c8aa3fdad5cec446|2023-05-16--12-07-55--12 +# TOYOTA COROLLA TSS2 2019 +cc379727a2ad9378|2023-07-22--19-16-50--38 +# TOYOTA COROLLA TSS2 2019 +cd34344665bc1a4a|2023-05-17--15-03-28--11 +# TOYOTA COROLLA TSS2 2019 +d20ec114453feac2|2023-05-16--17-39-43--7 +# TOYOTA COROLLA TSS2 2019 +e0aaaef2be9cd155|2023-05-25--21-22-33--63 +# TOYOTA COROLLA TSS2 2019 +edf29b3d6d15be9a|2023-06-12--20-14-03--5 +# TOYOTA COROLLA TSS2 2019 +ecebb0b63434e2f2|2023-07-06--12-35-59--76 +# TOYOTA COROLLA TSS2 2019 +f4d4cc62cc517acd|2023-06-17--12-14-02--3 +# TOYOTA RAV4 2022 +1e0487c8a03931a1|2023-07-17--17-11-07--14 +# TOYOTA RAV4 2022 +1c16ee70deee2972|2023-07-30--07-37-27--18 +# TOYOTA RAV4 2022 +23e0360acaefab4d|2023-06-22--08-05-05--44 +# TOYOTA RAV4 2022 +34fd9fa52bd9065f|2023-07-24--03-59-34--30 +# TOYOTA RAV4 2022 +3ab818cfeff024c4|2023-07-01--13-12-38--75 +# TOYOTA RAV4 2022 +3af132f650bd6b72|2023-06-02--17-34-32--33 +# TOYOTA RAV4 2022 +4d13f4feeb6a3d94|2023-07-01--11-24-38--34 +# TOYOTA RAV4 2022 +6228706487b4b0ea|2023-06-10--21-21-52--23 +# TOYOTA RAV4 2022 +6a2f4f5164a97fcd|2023-08-06--13-16-57--9 +# TOYOTA RAV4 2022 +7ac1ec97ce175121|2023-06-20--17-31-53--11 +# TOYOTA RAV4 2022 +868f770ac624c5dd|2023-06-27--09-15-06--67 +# TOYOTA RAV4 2022 +a5c341bb250ca2f0|2023-06-29--20-25-11--20 +# TOYOTA RAV4 2022 +dfb11f122b6fa282|2023-06-12--18-21-56--11 +# TOYOTA RAV4 2022 +f0a34b105563fa46|2023-08-01--15-32-05--14 +# TOYOTA RAV4 2022 +fa92d93019ed70bd|2023-07-07--01-12-37--17 +# HYUNDAI SANTA FE HYBRID 2022 +129db7c75bce8445|2023-08-05--17-41-16--24 +# HYUNDAI SANTA FE HYBRID 2022 +34397231b0958def|2023-06-10--12-21-46--18 +# HYUNDAI SANTA FE HYBRID 2022 +826b9eb4ac54a1c2|2023-07-08--19-03-34--4 +# TOYOTA HIGHLANDER 2020 +15af9b43bd0c5c76|2023-05-31--09-50-40--92 +# TOYOTA HIGHLANDER 2020 +0bf0ea192bb9cb3c|2023-07-19--13-04-59--24 +# TOYOTA HIGHLANDER 2020 +1c7b969c6660a3dd|2023-05-17--08-13-27--12 +# TOYOTA HIGHLANDER 2020 +29320b5f71353a26|2023-05-14--14-02-25--172 +# TOYOTA HIGHLANDER 2020 +2194b752a88786ac|2023-06-28--09-49-00--9 +# TOYOTA HIGHLANDER 2020 +0e9cc31bf324bed7|2023-07-16--15-18-39--110 +# TOYOTA HIGHLANDER 2020 +27444eac005fc311|2023-08-06--10-13-53--30 +# TOYOTA HIGHLANDER 2020 +2d823e45e0ba7a60|2023-07-11--17-55-38--4 +# TOYOTA HIGHLANDER 2020 +2f831f2ea3eff892|2023-07-17--18-59-16--21 +# TOYOTA HIGHLANDER 2020 +2ee40dc08b5c8680|2023-06-30--18-47-36--52 +# TOYOTA HIGHLANDER 2020 +2f475f484c7e48a4|2023-08-02--09-30-22--2 +# TOYOTA HIGHLANDER 2020 +333605df930e96c4|2023-05-27--12-18-04--1 +# TOYOTA HIGHLANDER 2020 +339a81aefecd3618|2023-08-02--07-10-36--28 +# TOYOTA HIGHLANDER 2020 +368455a0f08f4fec|2023-06-12--16-57-54--4 +# TOYOTA HIGHLANDER 2020 +3dca779f9f65c640|2023-07-26--17-31-54--19 +# TOYOTA HIGHLANDER 2020 +4868775dfada5a32|2023-06-07--09-36-34--4 +# TOYOTA HIGHLANDER 2020 +4a90db58c3f57afa|2023-07-29--17-34-55--42 +# TOYOTA HIGHLANDER 2020 +4e4e4789d5691a95|2023-07-28--18-47-17--8 +# TOYOTA HIGHLANDER 2020 +5647a5fa25085f0d|2023-08-07--14-10-54--13 +# TOYOTA HIGHLANDER 2020 +5f040438a009d6cb|2023-06-22--16-24-51--4 +# TOYOTA HIGHLANDER 2020 +6f6f526b4932d88b|2023-07-02--16-24-30--58 +# TOYOTA HIGHLANDER 2020 +6d0254ba44b664b0|2023-07-08--14-38-16--6 +# TOYOTA HIGHLANDER 2020 +76ced8f2f99250a6|2023-06-02--10-26-47--6 +# TOYOTA HIGHLANDER 2020 +8c1b23fe1568c036|2023-05-19--08-29-02--17 +# TOYOTA HIGHLANDER 2020 +9179d81377e52625|2023-06-30--16-49-47--109 +# TOYOTA HIGHLANDER 2020 +a474346bf635c3de|2023-06-10--17-49-02--17 +# TOYOTA HIGHLANDER 2020 +a023b41cc944b482|2023-06-25--08-55-36--4 +# TOYOTA HIGHLANDER 2020 +b557c584db633c06|2023-08-02--18-49-35--2 +# TOYOTA HIGHLANDER 2020 +b60de7fd1272d92c|2023-06-18--09-59-29--18 +# TOYOTA HIGHLANDER 2020 +b5e1be1336e936f9|2023-08-07--17-15-34--11 +# TOYOTA HIGHLANDER 2020 +caef64381b29fb3d|2023-07-19--17-27-45--3 +# TOYOTA HIGHLANDER 2020 +c21d5b4c2d8ac085|2023-06-29--07-51-21--1 +# TOYOTA HIGHLANDER 2020 +c7ae3dc86bba4525|2023-08-03--07-29-09--7 +# TOYOTA HIGHLANDER 2020 +ce3075423a164945|2023-05-27--10-28-48--4 +# TOYOTA HIGHLANDER 2020 +d173f04200e837a9|2023-05-13--12-34-10--4 +# TOYOTA HIGHLANDER 2020 +cf748e7031d411c8|2023-05-26--12-43-40--9 +# TOYOTA HIGHLANDER 2020 +d1fd12becb0bf3e2|2023-07-24--16-10-54--96 +# TOYOTA HIGHLANDER 2020 +d5d0b683a9a2ddf2|2023-07-24--18-36-30--9 +# TOYOTA HIGHLANDER 2020 +dc11867167a958d8|2023-06-09--18-49-38--50 +# TOYOTA HIGHLANDER 2020 +dc0f8f4f52442d48|2023-08-01--23-46-46--75 +# TOYOTA HIGHLANDER 2020 +df6ed1e430d585cc|2023-05-15--09-23-49--1 +# TOYOTA HIGHLANDER 2020 +e2ac4cd64bc32dd3|2023-07-31--20-24-01--27 +# TOYOTA HIGHLANDER 2020 +e3cf2794859fd8ea|2023-08-06--10-07-23--28 +# TOYOTA HIGHLANDER 2020 +e6f4a2f13554c77d|2023-05-19--14-17-11--3 +# TOYOTA HIGHLANDER 2020 +e01d0ee44be108b3|2023-05-16--12-17-48--9 +# TOYOTA HIGHLANDER 2020 +e8805c57d88ac65c|2023-06-26--15-03-36--47 +# TOYOTA HIGHLANDER 2020 +ea1b20c0286cb3e4|2023-07-12--09-14-26--34 +# TOYOTA HIGHLANDER 2020 +f20c2d8da930c25a|2023-07-02--16-03-24--33 +# TOYOTA HIGHLANDER 2020 +f57250843256cc1a|2023-05-24--18-01-00--2 +# TOYOTA HIGHLANDER 2020 +f5f17136be17692e|2023-05-30--14-50-39--6 +# TOYOTA HIGHLANDER 2020 +f7edb4b24e3b7321|2023-07-11--11-56-56--3 +# TOYOTA HIGHLANDER 2020 +ffe6475c53d1e78c|2023-07-11--17-56-32--55 +# TOYOTA HIGHLANDER 2020 +fe9f9a84fe26591c|2023-07-06--12-31-05--1 +# MAZDA CX-5 2022 +066b8ed7a80184fb|2023-06-13--23-33-37--62 +# MAZDA CX-5 2022 +1e11e59030d4757d|2023-07-17--12-16-44--1 +# MAZDA CX-5 2022 +05012d5566bf5275|2023-07-29--21-00-17--99 +# MAZDA CX-5 2022 +42ff4de626f8559b|2023-08-01--10-29-15--12 +# MAZDA CX-5 2022 +3b44bbb84058328a|2023-07-16--09-32-09--65 +# MAZDA CX-5 2022 +4ed535dd3ff18b2a|2023-06-05--16-36-49--3 +# MAZDA CX-5 2022 +76c17043c9df3064|2023-07-27--13-58-55--6 +# MAZDA CX-5 2022 +8c807f60018507d4|2023-07-26--09-20-15--16 +# MAZDA CX-5 2022 +8a9dac95d24c4e8d|2023-08-04--09-40-07--7 +# MAZDA CX-5 2022 +aa38b396675f5215|2023-06-28--08-47-57--8 +# MAZDA CX-5 2022 +b36f9b30a01c8521|2023-07-24--17-51-06--5 +# MAZDA CX-5 2022 +bdbbb819d8dc38ac|2023-06-09--07-48-08--63 +# MAZDA CX-5 2022 +c3ab14088c43bdf8|2023-06-30--21-42-12--1 +# MAZDA CX-5 2022 +c76c695d1b0485fe|2023-07-14--18-14-34--37 +# SUBARU IMPREZA SPORT 2020 +17250a2717728fb9|2023-07-20--07-38-29--18 +# SUBARU IMPREZA SPORT 2020 +22f2f49bcbecd829|2023-05-30--21-25-08--5 +# SUBARU IMPREZA SPORT 2020 +59755a6574d9ac67|2023-05-30--16-37-55--7 +# SUBARU IMPREZA SPORT 2020 +6024cc6844765678|2023-07-27--15-11-43--16 +# SUBARU IMPREZA SPORT 2020 +7be3f6b12cd49e4b|2023-06-20--13-50-03--93 +# SUBARU IMPREZA SPORT 2020 +d9df6f87e8feff94|2023-07-04--19-58-51--18 +# SUBARU IMPREZA SPORT 2020 +f900fccd457f495a|2023-05-26--20-18-12--36 +# HYUNDAI PALISADE 2020 +0cc137ccd450204c|2023-06-22--11-38-48--3 +# HYUNDAI PALISADE 2020 +1c5b0ef6f666062d|2023-06-02--08-57-58--2 +# HYUNDAI PALISADE 2020 +1336b7c61f4fba8b|2023-07-27--07-31-12--1 +# HYUNDAI PALISADE 2020 +2c63cbbbba450ba0|2023-06-18--23-59-14--24 +# HYUNDAI PALISADE 2020 +2f1f45af65b7b314|2023-05-30--19-30-46--12 +# HYUNDAI PALISADE 2020 +34ea9dfc9b0f9bbe|2023-05-21--12-38-47--7 +# HYUNDAI PALISADE 2020 +39070cb41aafdfc1|2023-07-05--23-15-41--2 +# HYUNDAI PALISADE 2020 +4c6b27a2c49c555e|2023-06-18--09-37-44--7 +# HYUNDAI PALISADE 2020 +4e5d75a1f3df3ae2|2023-06-09--02-25-39--74 +# HYUNDAI PALISADE 2020 +562a098bb9c7b922|2023-07-12--16-46-17--1 +# HYUNDAI PALISADE 2020 +628935d7d3e5f4f7|2023-05-24--19-48-58--8 +# HYUNDAI PALISADE 2020 +67a711f176acbbbf|2023-08-03--09-05-39--8 +# HYUNDAI PALISADE 2020 +7272d111d521a7bc|2023-05-22--09-21-09--1 +# HYUNDAI PALISADE 2020 +7b5a53e99b76e8d9|2023-06-14--14-55-32--15 +# HYUNDAI PALISADE 2020 +829fc01ecb03f524|2023-08-06--12-29-40--71 +# HYUNDAI PALISADE 2020 +7a6617bb650ac5f3|2023-06-02--14-13-59--31 +# HYUNDAI PALISADE 2020 +967360f5aae838e5|2023-05-18--23-59-21--1 +# HYUNDAI PALISADE 2020 +98025ffdb4d0d3ea|2023-06-03--02-55-53--33 +# HYUNDAI PALISADE 2020 +9a22857aff5535d8|2023-06-20--17-40-57--4 +# HYUNDAI PALISADE 2020 +9e7951200bd89ca3|2023-06-07--20-31-01--3 +# HYUNDAI PALISADE 2020 +a6e13aa41cb46ac4|2023-07-18--10-56-20--7 +# HYUNDAI PALISADE 2020 +c5f915f8d3049fd4|2023-07-15--09-57-02--1 +# HYUNDAI PALISADE 2020 +c502b178b93bcc57|2023-06-08--16-22-33--12 +# HYUNDAI PALISADE 2020 +c7d0d7dde77d49ce|2023-07-15--17-08-23--35 +# HYUNDAI PALISADE 2020 +d3bd16e6fc80062c|2023-05-11--10-24-46--4 +# HYUNDAI PALISADE 2020 +e0c6f1daf613f27e|2023-06-19--17-55-55--15 +# HYUNDAI PALISADE 2020 +ebdfcd4184611cfd|2023-08-04--12-56-10--1 +# HYUNDAI PALISADE 2020 +f4132dc91ccfa36a|2023-05-21--06-05-05--2 +# HYUNDAI PALISADE 2020 +fb3784f688906f36|2023-05-12--17-22-59--32 +# HONDA CR-V 2017 +1dd5f02533643f14|2023-06-03--12-17-36--8 +# HONDA CR-V 2017 +008d92ddb9798681|2023-06-18--12-41-21--8 +# HONDA CR-V 2017 +1b7349c28512586d|2023-07-14--18-42-54--26 +# HONDA CR-V 2017 +272caf9f22b2c59b|2023-06-18--12-51-26--22 +# HONDA CR-V 2017 +1069cd145e996003|2023-05-17--22-53-14--7 +# HONDA CR-V 2017 +2d03366246293eae|2023-05-31--17-40-01--9 +# HONDA CR-V 2017 +365b09442064886e|2023-07-24--10-34-12--9 +# HONDA CR-V 2017 +3bf8dc045bc9e677|2023-07-27--19-14-11--8 +# HONDA CR-V 2017 +40c808560e92c311|2023-07-19--17-39-48--5 +# HONDA CR-V 2017 +43e1963f8d94b15a|2023-07-15--18-32-25--8 +# HONDA CR-V 2017 +45fa8a98dc3bc264|2023-07-11--08-22-54--7 +# HONDA CR-V 2017 +50b4e56518f71489|2023-07-31--05-28-30--14 +# HONDA CR-V 2017 +562834cee8a360c0|2023-07-08--08-56-37--53 +# HONDA CR-V 2017 +5a3959d85bbde304|2023-07-18--17-04-29--31 +# HONDA CR-V 2017 +6b185836ee698c26|2023-07-07--20-52-24--7 +# HONDA CR-V 2017 +84b8b497d5e13b6a|2023-07-30--13-30-24--17 +# HONDA CR-V 2017 +846e6ba1cb8c5f85|2023-07-04--11-51-25--35 +# HONDA CR-V 2017 +89583b784eacd386|2023-06-24--23-32-36--1 +# HONDA CR-V 2017 +8faf799674fa044b|2023-07-18--19-49-14--15 +# HONDA CR-V 2017 +9732dc4fef24cf7a|2023-08-04--18-18-13--9 +# HONDA CR-V 2017 +a3fc26a4da829bb9|2023-05-28--14-21-54--39 +# HONDA CR-V 2017 +a9a580bdb154bb4d|2023-06-29--16-21-57--17 +# HONDA CR-V 2017 +b4f79d4e97360586|2023-07-29--16-32-40--16 +# HONDA CR-V 2017 +c40202b70807d4aa|2023-07-01--16-09-28--15 +# HONDA CR-V 2017 +c3d7cef4d9450951|2023-07-29--11-39-57--72 +# HONDA CR-V 2017 +c390b60ad96d2ff2|2023-07-10--16-40-16--5 +# HONDA CR-V 2017 +d33bc6acf39eb0d5|2023-08-04--10-30-07--18 +# HONDA CR-V 2017 +d360e36bf258dcd8|2023-07-20--18-11-51--29 +# HONDA CR-V 2017 +d26e907f37fcd37d|2023-06-29--07-04-20--2 +# HONDA CR-V 2017 +dcb2ee34f8c4c2be|2023-05-14--16-35-57--7 +# HONDA CR-V 2017 +e22ac98f691884e1|2023-08-02--17-22-36--3 +# HONDA CR-V 2017 +e69f2a903ed82e49|2023-06-27--19-39-46--8 +# HONDA CR-V 2017 +e8a630b87b2b0b7c|2023-07-21--16-31-16--12 +# HONDA CR-V 2017 +f1d6758277a8e2c3|2023-06-23--17-38-10--2 +# HONDA CR-V 2017 +f369374ecb30d9ad|2023-06-02--13-22-03--1 +# HONDA CR-V 2017 +ffa76986ec8e871e|2023-06-08--17-30-25--31 +# TOYOTA SIENNA 2018 +15141c10c47e840c|2023-08-06--19-46-46--2 +# TOYOTA SIENNA 2018 +033adba45e0f9e9e|2023-06-22--17-20-48--17 +# TOYOTA SIENNA 2018 +08aee1fd12dbcec9|2023-07-08--11-52-25--1 +# TOYOTA SIENNA 2018 +0401ca905fe1e3c9|2023-06-30--08-37-39--8 +# TOYOTA SIENNA 2018 +1bbce2b3aadea8fc|2023-07-04--21-48-31--12 +# TOYOTA SIENNA 2018 +13fbff4f559b022f|2023-07-28--12-53-45--76 +# TOYOTA SIENNA 2018 +336f30f83810c50a|2023-07-03--10-36-11--16 +# TOYOTA SIENNA 2018 +40a8bdeaeef71f2e|2023-07-12--09-25-54--4 +# TOYOTA SIENNA 2018 +4bd71e1011d03cb0|2023-07-31--15-09-23--8 +# TOYOTA SIENNA 2018 +5a2b996389025b8b|2023-07-09--20-07-13--168 +# TOYOTA SIENNA 2018 +66253de0fd139602|2023-08-03--17-10-18--12 +# TOYOTA SIENNA 2018 +6aa41b3f53b8dfbb|2023-07-16--11-13-32--15 +# TOYOTA SIENNA 2018 +6c4a3e1fb283f169|2023-06-15--16-59-16--2 +# TOYOTA SIENNA 2018 +78c139899b6152e7|2023-06-29--22-20-41--1 +# TOYOTA SIENNA 2018 +8624c343dda64ca1|2023-07-15--16-06-24--68 +# TOYOTA SIENNA 2018 +8c995b0a7884acaa|2023-06-01--12-29-57--40 +# TOYOTA SIENNA 2018 +96f32ba699f695d0|2023-08-02--13-17-17--9 +# TOYOTA SIENNA 2018 +a001f23b71be2971|2023-07-14--12-10-15--14 +# TOYOTA SIENNA 2018 +a5b340427848f1e3|2023-05-31--17-33-24--14 +# TOYOTA SIENNA 2018 +a8d3b0c452c29da7|2023-07-01--22-59-20--40 +# TOYOTA SIENNA 2018 +a7fde1302557afb0|2023-05-24--10-07-00--1 +# TOYOTA SIENNA 2018 +bd1e8f178842c492|2023-07-15--15-33-04--19 +# TOYOTA SIENNA 2018 +c793f2377f82673d|2023-06-10--15-19-02--5 +# TOYOTA SIENNA 2018 +ce728cfb301d0987|2023-07-23--16-23-48--38 +# TOYOTA SIENNA 2018 +dc352a2d23789b45|2023-07-19--14-12-21--106 +# TOYOTA SIENNA 2018 +e77aa024ac711986|2023-07-29--18-37-34--1 +# TOYOTA SIENNA 2018 +e7ada7e863132190|2023-06-07--11-54-54--25 +# TOYOTA SIENNA 2018 +e7831e2f6a8a1279|2023-07-18--20-20-56--10 +# TOYOTA SIENNA 2018 +efa518043b8f287e|2023-08-06--19-55-03--156 +# TOYOTA SIENNA 2018 +f258933135d07fc2|2023-07-08--12-05-44--5 +# TOYOTA SIENNA 2018 +f2a49af4f4758050|2023-08-06--08-52-58--22 +# TOYOTA SIENNA 2018 +ff4fdad9a9b183c2|2023-07-30--20-55-31--39 +# FORD EXPLORER 6TH GEN +0b91b433b9332780|2023-07-13--14-51-21--126 +# FORD EXPLORER 6TH GEN +4458bd61cf193dab|2023-07-28--12-22-12--435 +# FORD EXPLORER 6TH GEN +8e1bab39e558e773|2023-06-30--18-11-15--11 +# FORD EXPLORER 6TH GEN +f0709d2bc6ca451f|2023-05-24--12-29-22--31 +# FORD EXPLORER 6TH GEN +f166567f78fad32f|2023-06-23--22-48-43--23 +# TOYOTA HIGHLANDER 2017 +0a140f06ff5e5751|2023-06-22--17-41-43--18 +# TOYOTA HIGHLANDER 2017 +0e6f1a230ecf5dc9|2023-05-22--15-16-37--1 +# TOYOTA HIGHLANDER 2017 +1213650a719d1429|2023-08-06--16-21-48--16 +# TOYOTA HIGHLANDER 2017 +297518c3eb259e70|2023-05-15--13-27-34--2 +# TOYOTA HIGHLANDER 2017 +3a2ae9ef81244966|2023-07-20--15-56-17--65 +# TOYOTA HIGHLANDER 2017 +467419fc069b553e|2023-05-23--13-38-56--6 +# TOYOTA HIGHLANDER 2017 +4814b507cb35653c|2023-06-28--17-59-25--4 +# TOYOTA HIGHLANDER 2017 +4829a5573c5de536|2023-08-01--21-06-48--13 +# TOYOTA HIGHLANDER 2017 +4c486ce35e8dd3b4|2023-05-30--18-52-10--46 +# TOYOTA HIGHLANDER 2017 +6dabe682c1a8d437|2023-07-07--14-25-46--9 +# TOYOTA HIGHLANDER 2017 +7c8bb6201903618b|2023-07-08--08-18-26--22 +# TOYOTA HIGHLANDER 2017 +7bd25a6c7427cd3c|2023-08-06--10-56-19--20 +# TOYOTA HIGHLANDER 2017 +832d14f92ad84eb6|2023-05-17--10-51-58--18 +# TOYOTA HIGHLANDER 2017 +8a2f77d0f2d45965|2023-06-14--16-51-15--52 +# TOYOTA HIGHLANDER 2017 +8b9d7d2d35e6118c|2023-08-04--15-19-14--2 +# TOYOTA HIGHLANDER 2017 +92e13d6c269f512d|2023-05-13--19-58-04--1 +# TOYOTA HIGHLANDER 2017 +9cea9d0468eb3e96|2023-06-22--22-20-21--6 +# TOYOTA HIGHLANDER 2017 +9a6357ba59f0bc3d|2023-06-10--09-52-06--4 +# TOYOTA HIGHLANDER 2017 +a6f5c094b5b7fb33|2023-06-16--07-29-15--1 +# TOYOTA HIGHLANDER 2017 +ad8f2bf6b31dce85|2023-07-29--17-39-45--16 +# TOYOTA HIGHLANDER 2017 +aa7ed46cc8131f89|2023-05-29--07-13-22--9 +# TOYOTA HIGHLANDER 2017 +d886ae895cef77ef|2023-08-02--12-36-12--19 +# TOYOTA HIGHLANDER 2017 +d481bf9699bde1ee|2023-07-06--01-52-18--2 +# TOYOTA HIGHLANDER 2017 +dca9566a6850e4bf|2023-05-14--17-12-55--5 +# TOYOTA HIGHLANDER 2017 +dfe7ead74bb47dc8|2023-08-07--10-26-51--6 +# TOYOTA HIGHLANDER 2017 +e521d97f331b2e34|2023-07-12--13-42-10--33 +# TOYOTA HIGHLANDER 2017 +f01b5b7d7f4c5309|2023-07-01--01-34-34--23 +# TOYOTA HIGHLANDER 2017 +fe99b3a8c9ab61b9|2023-06-18--14-21-37--5 +# TOYOTA PRIUS TSS2 2021 +10a42f77b05a401f|2023-06-23--17-30-35--8 +# TOYOTA PRIUS TSS2 2021 +1a35342c8a1b558e|2023-06-26--21-28-43--18 +# TOYOTA PRIUS TSS2 2021 +0377091bf159038d|2023-06-18--17-04-20--23 +# TOYOTA PRIUS TSS2 2021 +135321a6baf43ec3|2023-07-19--06-07-57--21 +# TOYOTA PRIUS TSS2 2021 +0e511ea80aaf4931|2023-06-05--05-54-38--3 +# TOYOTA PRIUS TSS2 2021 +2061c2bef508176e|2023-06-20--17-00-45--2 +# TOYOTA PRIUS TSS2 2021 +1128edc391bf47c1|2023-05-19--18-10-40--14 +# TOYOTA PRIUS TSS2 2021 +233ef9dcd57e63d9|2023-07-27--15-19-23--10 +# TOYOTA PRIUS TSS2 2021 +1531d4305c9ebbf0|2023-05-18--14-52-53--31 +# TOYOTA PRIUS TSS2 2021 +115345214029cb8b|2023-06-25--14-58-20--2 +# TOYOTA PRIUS TSS2 2021 +283695e2bd4b03db|2023-07-18--22-52-41--5 +# TOYOTA PRIUS TSS2 2021 +305006f2b633be2d|2023-07-16--12-48-12--4 +# TOYOTA PRIUS TSS2 2021 +39a1e6521e802f2f|2023-05-24--17-16-54--1 +# TOYOTA PRIUS TSS2 2021 +3aea2f5376c16768|2023-07-17--05-21-08--25 +# TOYOTA PRIUS TSS2 2021 +449ac093304ba731|2023-05-11--11-14-03--40 +# TOYOTA PRIUS TSS2 2021 +451be4fe585fdac0|2023-06-16--16-08-55--5 +# TOYOTA PRIUS TSS2 2021 +45937213b62ce5ed|2023-05-23--15-56-35--166 +# TOYOTA PRIUS TSS2 2021 +53ecc962c9d86d50|2023-07-30--10-26-25--2 +# TOYOTA PRIUS TSS2 2021 +5b12a3ea4e95c4a5|2023-06-22--17-16-55--37 +# TOYOTA PRIUS TSS2 2021 +656a02ec772a7a4d|2023-06-30--01-33-46--34 +# TOYOTA PRIUS TSS2 2021 +60f3f8039fafd263|2023-05-18--17-30-08--16 +# TOYOTA PRIUS TSS2 2021 +698cf41e2173752f|2023-06-30--12-01-37--12 +# TOYOTA PRIUS TSS2 2021 +67344e48576a3ac2|2023-07-21--14-44-32--18 +# TOYOTA PRIUS TSS2 2021 +6ba67d5a83d831a8|2023-06-06--18-34-35--1 +# TOYOTA PRIUS TSS2 2021 +714dd3f9e708f73c|2023-06-14--14-51-51--6 +# TOYOTA PRIUS TSS2 2021 +716a982c6d0c5547|2023-07-25--11-17-26--30 +# TOYOTA PRIUS TSS2 2021 +6e90fb55f908940a|2023-05-10--17-32-34--3 +# TOYOTA PRIUS TSS2 2021 +8550ea8a4e07f761|2023-06-24--06-29-29--4 +# TOYOTA PRIUS TSS2 2021 +868ec8b032712e8c|2023-05-17--10-32-22--36 +# TOYOTA PRIUS TSS2 2021 +9048498ebc1297b3|2023-05-22--20-36-01--6 +# TOYOTA PRIUS TSS2 2021 +91ec51ef841d0fe5|2023-08-01--09-03-49--4 +# TOYOTA PRIUS TSS2 2021 +a0adc8b389da9563|2023-07-16--17-39-14--1 +# TOYOTA PRIUS TSS2 2021 +a2e5f1439e2cdf9e|2023-05-26--08-13-31--13 +# TOYOTA PRIUS TSS2 2021 +a8fec02c41697f7c|2023-07-12--16-54-45--7 +# TOYOTA PRIUS TSS2 2021 +a883325ac00c65f9|2023-05-28--18-17-32--18 +# TOYOTA PRIUS TSS2 2021 +aaf71ff1348f4b42|2023-06-09--09-09-07--4 +# TOYOTA PRIUS TSS2 2021 +a74cb70b7a19e427|2023-06-11--13-12-21--62 +# TOYOTA PRIUS TSS2 2021 +ac1a320cbefd424a|2023-06-20--15-09-25--12 +# TOYOTA PRIUS TSS2 2021 +aedf9ebed7828264|2023-05-16--18-52-09--5 +# TOYOTA PRIUS TSS2 2021 +b8622cf559d979f9|2023-06-09--14-40-58--2 +# TOYOTA PRIUS TSS2 2021 +b4ce4d1721db5c94|2023-06-18--13-33-24--32 +# TOYOTA PRIUS TSS2 2021 +bf3057bccc689886|2023-05-10--14-25-33--4 +# TOYOTA PRIUS TSS2 2021 +c1a2ba00c8f7e9d8|2023-07-31--14-06-34--2 +# TOYOTA PRIUS TSS2 2021 +ba7f87150ae0bbeb|2023-06-21--13-33-28--12 +# TOYOTA PRIUS TSS2 2021 +c363f25afff8d58e|2023-05-16--14-35-12--8 +# TOYOTA PRIUS TSS2 2021 +c3834a2fe82b632b|2023-07-18--18-50-19--8 +# TOYOTA PRIUS TSS2 2021 +cbe57b408a885627|2023-07-09--11-00-32--5 +# TOYOTA PRIUS TSS2 2021 +ccda673780fb737f|2023-05-21--12-39-40--2 +# TOYOTA PRIUS TSS2 2021 +c4e58bbe953ef5c9|2023-07-27--10-23-32--13 +# TOYOTA PRIUS TSS2 2021 +cf8446aa9d2793e8|2023-06-04--22-02-12--14 +# TOYOTA PRIUS TSS2 2021 +d2bfce9a4caff67f|2023-07-12--15-21-04--55 +# TOYOTA PRIUS TSS2 2021 +d083dc54dae836f0|2023-05-23--05-01-18--24 +# TOYOTA PRIUS TSS2 2021 +d653e1fe9aced0bb|2023-05-19--16-19-28--10 +# TOYOTA PRIUS TSS2 2021 +d67fb9ab2b635dc9|2023-05-12--21-49-32--13 +# TOYOTA PRIUS TSS2 2021 +dd39308405abab68|2023-06-03--08-04-58--51 +# TOYOTA PRIUS TSS2 2021 +e65253687b3999e0|2023-07-02--08-32-02--2 +# TOYOTA PRIUS TSS2 2021 +e921feb7a05eb6b2|2023-08-06--14-08-10--53 +# TOYOTA PRIUS TSS2 2021 +ef4fae77e5d45d9d|2023-07-23--13-18-02--4 +# TOYOTA PRIUS TSS2 2021 +f0a29b63232a3fbd|2023-07-20--07-10-56--30 +# TOYOTA PRIUS TSS2 2021 +faf6d8bcab5ae3a1|2023-07-05--16-00-03--6 +# TOYOTA PRIUS TSS2 2021 +fe2feb102f0b3824|2023-07-31--15-55-42--88 +# TOYOTA PRIUS TSS2 2021 +fed47dc1d49625ca|2023-06-11--13-37-17--5 +# TOYOTA RAV4 2022 +170e10c2cb0432dd|2023-05-17--11-35-52--52 +# TOYOTA RAV4 2022 +0dbef6854d19f908|2023-05-14--16-48-10--34 +# TOYOTA RAV4 2022 +2475fb3eb2ffcc2e|2023-08-05--15-20-42--48 +# TOYOTA RAV4 2022 +08583cb7cd02965d|2023-07-13--14-00-59--23 +# TOYOTA RAV4 2022 +255d0a53069b33c7|2023-05-16--07-12-07--33 +# TOYOTA RAV4 2022 +3507bf7e7573d50b|2023-08-05--15-18-07--44 +# TOYOTA RAV4 2022 +4c7c30edb6dffa5f|2023-08-04--18-14-42--46 +# TOYOTA RAV4 2022 +4e9c8dcbfedefc48|2023-08-07--19-19-04--1 +# TOYOTA RAV4 2022 +58138d1ad389f4d0|2023-07-24--19-33-45--11 +# TOYOTA RAV4 2022 +5374d1774eac5197|2023-06-14--11-26-16--3 +# TOYOTA RAV4 2022 +558928e2034bcef7|2023-06-09--14-26-37--14 +# TOYOTA RAV4 2022 +5bf05f6701c98d32|2023-06-30--13-01-19--22 +# TOYOTA RAV4 2022 +617492c124a692ef|2023-07-20--14-19-10--6 +# TOYOTA RAV4 2022 +6bd14dfc84131769|2023-06-22--13-55-05--82 +# TOYOTA RAV4 2022 +6fe3baa907616d50|2023-05-22--17-36-04--9 +# TOYOTA RAV4 2022 +73f49c9e89a98ff9|2023-06-03--21-51-04--5 +# TOYOTA RAV4 2022 +77f07def1eec9d4e|2023-05-20--12-35-38--58 +# TOYOTA RAV4 2022 +773c6c0313a36828|2023-08-01--12-10-22--4 +# TOYOTA RAV4 2022 +825c2be1679633af|2023-06-08--14-27-04--24 +# TOYOTA RAV4 2022 +8547882d5a9638ed|2023-05-20--16-46-23--40 +# TOYOTA RAV4 2022 +8a6df5e317cdb0f1|2023-06-22--11-48-00--7 +# TOYOTA RAV4 2022 +8c3afba96b7a5db6|2023-05-20--15-33-13--12 +# TOYOTA RAV4 2022 +91a5f9bc5181e3ba|2023-07-17--13-12-48--3 +# TOYOTA RAV4 2022 +932fa1fa23f936dd|2023-07-03--14-05-29--29 +# TOYOTA RAV4 2022 +98b8395bda1abb3d|2023-07-15--15-39-42--1 +# TOYOTA RAV4 2022 +9af9456fb41cefdc|2023-06-08--16-48-49--25 +# TOYOTA RAV4 2022 +9f7a308d4490eb77|2023-05-11--16-59-21--3 +# TOYOTA RAV4 2022 +9fd2e1d2322620c1|2023-06-22--08-20-30--149 +# TOYOTA RAV4 2022 +bc1fe643a3929103|2023-07-17--19-45-52--8 +# TOYOTA RAV4 2022 +d8117083fe3d623d|2023-07-29--18-25-35--2 +# TOYOTA RAV4 2022 +dd2ff62df396c1fc|2023-05-21--18-40-13--120 +# TOYOTA RAV4 2022 +e16e4f4ef04a4ab3|2023-07-06--07-30-04--15 +# TOYOTA RAV4 2022 +eee593d3239d7c3c|2023-07-20--07-09-40--2 +# TOYOTA RAV4 2022 +f5a63eb328699685|2023-07-02--19-58-47--1 +# TOYOTA RAV4 2022 +f2188129ca0904e2|2023-05-21--17-35-49--8 +# TOYOTA RAV4 2022 +f60772e6acef55c4|2023-06-22--20-18-39--47 +# TOYOTA RAV4 2022 +fa323424d809e22a|2023-05-13--20-15-51--24 +# TOYOTA CAMRY 2018 +06362e6a7f0b400b|2023-07-17--15-01-53--27 +# TOYOTA CAMRY 2018 +0066f60689e612ed|2023-07-26--10-32-30--15 +# TOYOTA CAMRY 2018 +098b070a8ea9766b|2023-06-16--15-23-49--11 +# TOYOTA CAMRY 2018 +02a10fdbba41d6c4|2023-05-11--05-10-43--4 +# TOYOTA CAMRY 2018 +22331374d2858074|2023-06-15--11-27-50--2 +# TOYOTA CAMRY 2018 +071f13e1cf591bd8|2023-06-09--21-07-21--30 +# TOYOTA CAMRY 2018 +1b07ad9af1629f61|2023-05-18--11-54-09--41 +# TOYOTA CAMRY 2018 +27f66d238e2daff2|2023-07-26--13-16-24--8 +# TOYOTA CAMRY 2018 +30d4248ac12fd57c|2023-05-25--11-28-46--3 +# TOYOTA CAMRY 2018 +2f37c007683e85ba|2023-05-10--18-35-29--12 +# TOYOTA CAMRY 2018 +36ad47227a8b6e0d|2023-07-11--15-03-35--16 +# TOYOTA CAMRY 2018 +3b69a15335041c72|2023-05-14--01-32-08--4 +# TOYOTA CAMRY 2018 +3cc72445faf2b595|2023-06-23--13-50-08--20 +# TOYOTA CAMRY 2018 +3f4d8c6e1329405c|2023-07-24--20-49-51--5 +# TOYOTA CAMRY 2018 +5a518984e4caef1d|2023-08-01--19-47-13--1 +# TOYOTA CAMRY 2018 +7ebcdd800f653ec4|2023-07-23--14-28-06--4 +# TOYOTA CAMRY 2018 +9a052d2d382b6896|2023-07-12--21-24-54--9 +# TOYOTA CAMRY 2018 +9c86ed5c7284733c|2023-07-29--17-35-37--8 +# TOYOTA CAMRY 2018 +a000cb5ab7ef5223|2023-05-31--21-24-48--10 +# TOYOTA CAMRY 2018 +b34be3bf345f0f5e|2023-07-12--23-12-39--124 +# TOYOTA CAMRY 2018 +b4057b71f56d1191|2023-07-31--16-16-57--4 +# TOYOTA CAMRY 2018 +b7b58a594926fa23|2023-07-27--23-28-50--4 +# TOYOTA CAMRY 2018 +ba0844983cdec847|2023-08-04--11-47-17--7 +# TOYOTA CAMRY 2018 +ba4a94169bf12f32|2023-05-11--16-50-56--4 +# TOYOTA CAMRY 2018 +be8ed458ac4879c8|2023-07-10--20-19-35--10 +# TOYOTA CAMRY 2018 +c2c9a0e4f71e20e6|2023-05-30--14-48-23--38 +# TOYOTA CAMRY 2018 +ce4328694fa2cca9|2023-05-13--02-19-59--4 +# TOYOTA CAMRY 2018 +cd42d2594be938f7|2023-07-25--07-06-01--16 +# TOYOTA CAMRY 2018 +cca80b7bda70c17a|2023-05-25--17-06-27--34 +# TOYOTA CAMRY 2018 +d76803d2dfa3a00e|2023-07-17--00-53-09--7 +# TOYOTA CAMRY 2018 +e27a03030a436e84|2023-06-20--09-23-41--117 +# TOYOTA CAMRY 2018 +ebc7fb7dfd3839d9|2023-06-14--06-06-07--10 +# TOYOTA CAMRY 2018 +ec7de7d250fdcd1d|2023-07-31--17-55-49--1 +# TOYOTA CAMRY 2018 +f71b4f559fb531ad|2023-05-10--16-47-20--31 +# AUDI A3 3RD GEN +200c952f826a6447|2023-07-02--11-55-50--7 +# AUDI A3 3RD GEN +359bcd3ea48092f6|2023-06-03--07-32-15--3 +# AUDI A3 3RD GEN +3ac7029f79711ca5|2023-06-30--07-41-35--5 +# AUDI A3 3RD GEN +76b48b05df10f05e|2023-07-08--16-05-11--4 +# AUDI A3 3RD GEN +a973e9182bc96a2c|2023-06-28--11-02-10--11 +# VOLKSWAGEN ATLAS 1ST GEN +16758e226aa2f747|2023-07-28--15-30-42--3 +# VOLKSWAGEN ATLAS 1ST GEN +16e8546287ecaada|2023-06-26--17-34-08--3 +# VOLKSWAGEN ATLAS 1ST GEN +2bbad62414dc6d9b|2023-08-05--18-02-38--9 +# VOLKSWAGEN ATLAS 1ST GEN +3174d252cec3bf6f|2023-07-04--09-24-03--11 +# VOLKSWAGEN ATLAS 1ST GEN +3737f89a2e0db063|2023-07-19--08-01-06--7 +# VOLKSWAGEN ATLAS 1ST GEN +4048de296d5207fb|2023-07-28--23-35-13--9 +# VOLKSWAGEN ATLAS 1ST GEN +58d4dfb7f4fee11d|2023-08-06--15-55-59--11 +# VOLKSWAGEN ATLAS 1ST GEN +793830b37089fe1d|2023-07-19--17-08-52--1 +# VOLKSWAGEN ATLAS 1ST GEN +d8e893cc7739f7d5|2023-06-20--09-35-18--10 +# VOLKSWAGEN ATLAS 1ST GEN +d7251ede344ff957|2023-07-21--16-32-02--61 +# VOLKSWAGEN ATLAS 1ST GEN +e415c44c77c17e15|2023-05-10--07-55-50--2 +# VOLKSWAGEN ATLAS 1ST GEN +e80066d826c705a9|2023-08-07--15-23-13--7 +# VOLKSWAGEN ATLAS 1ST GEN +f4971592598fa9a3|2023-06-10--11-08-36--7 +# VOLKSWAGEN ATLAS 1ST GEN +ffdd12beb96d5b54|2023-07-30--19-09-47--62 +# LEXUS RX 2016 +1786eaa4cc844889|2023-06-30--13-53-39--91 +# LEXUS RX 2016 +0cf857b1b13bd7cd|2023-07-28--22-10-53--3 +# LEXUS RX 2016 +0229eb43387cef7a|2023-06-15--18-47-25--11 +# LEXUS RX 2016 +2a566b7f69eb2a77|2023-05-18--18-12-09--12 +# LEXUS RX 2016 +592ae47bcb1a6658|2023-06-28--03-11-52--3 +# LEXUS RX 2016 +62b4af07ac90a8e5|2023-07-30--18-53-41--116 +# LEXUS RX 2016 +80ea6c1ff7648289|2023-07-25--18-31-23--9 +# LEXUS RX 2016 +8b196fa003fe55c9|2023-07-06--13-59-02--1 +# LEXUS RX 2016 +b04a5e7ac1c97127|2023-06-11--21-03-22--14 +# LEXUS RX 2016 +bba0a7d99d07b4d0|2023-07-17--10-47-12--16 +# LEXUS RX 2016 +c318581fb51199e6|2023-06-21--09-08-17--47 +# LEXUS RX 2016 +c8d3dd7cfe3c2bef|2023-05-16--07-49-03--21 +# LEXUS RX 2016 +d93ff944f9757e06|2023-07-04--00-28-00--4 +# LEXUS RX 2016 +e3792885a81edc65|2023-05-10--08-26-43--30 +# LEXUS RX 2016 +ea93dc40fbf84c96|2023-06-10--18-26-40--5 +# LEXUS ES 2019 +24f960aeabdd0b45|2023-07-22--22-56-58--9 +# LEXUS ES 2019 +221780419969efb8|2023-06-03--14-00-10--24 +# LEXUS ES 2019 +43000f0e5e058b22|2023-08-03--16-55-17--56 +# LEXUS ES 2019 +47724a191e0f4d9e|2023-06-24--20-39-39--28 +# LEXUS ES 2019 +5aa51c7df8ce288d|2023-07-14--07-31-51--14 +# LEXUS ES 2019 +5c0038031497257b|2023-07-11--16-58-54--45 +# LEXUS ES 2019 +5ad3c8116ceedf0e|2023-06-09--10-48-08--4 +# LEXUS ES 2019 +6d867424dc48c01b|2023-07-21--20-19-27--19 +# LEXUS ES 2019 +89c10c27e1a41814|2023-06-05--21-45-17--47 +# LEXUS ES 2019 +b9c9b1d4e4277fec|2023-07-09--10-55-55--3 +# LEXUS ES 2019 +eebb9787e66670b1|2023-06-09--13-43-21--22 +# HYUNDAI SANTA FE 2022 +1ad7728ce54a161d|2023-06-27--16-42-41--38 +# HYUNDAI SANTA FE 2022 +2d394786f239cd0d|2023-07-16--12-34-58--17 +# HYUNDAI SANTA FE 2022 +305cf2a0bda0e51c|2023-07-20--17-07-34--1 +# HYUNDAI SANTA FE 2022 +2fcc9a43453b10de|2023-06-30--10-25-43--12 +# HYUNDAI SANTA FE 2022 +782fcdb3a42ca1fa|2023-05-26--02-02-12--1 +# HYUNDAI SANTA FE 2022 +7a6ba99ba49954c0|2023-06-01--11-46-54--55 +# HYUNDAI SANTA FE 2022 +cc2f3c4ab6d7758b|2023-07-17--10-14-06--18 +# HYUNDAI SANTA FE 2022 +e37432b18654a7cc|2023-06-29--15-51-04--50 +# TOYOTA CAMRY 2021 +080fffcdcdf847e2|2023-06-17--22-09-54--16 +# TOYOTA CAMRY 2021 +256b964e662f0e39|2023-08-02--15-53-58--33 +# TOYOTA CAMRY 2021 +2422760916ecd3ed|2023-07-30--00-10-14--43 +# TOYOTA CAMRY 2021 +017772face80c94f|2023-06-22--17-04-43--15 +# TOYOTA CAMRY 2021 +1916f6660fdef56b|2023-05-22--16-31-45--50 +# TOYOTA CAMRY 2021 +171516dbc8965a98|2023-08-08--11-12-03--7 +# TOYOTA CAMRY 2021 +289cbd8c4e814c92|2023-07-24--16-08-08--60 +# TOYOTA CAMRY 2021 +2ec957d01038234b|2023-07-19--18-44-13--28 +# TOYOTA CAMRY 2021 +3ba061cbb7a708c3|2023-07-11--11-36-38--4 +# TOYOTA CAMRY 2021 +3ff411160b72e90e|2023-06-11--17-08-09--13 +# TOYOTA CAMRY 2021 +52682dee0263bc9e|2023-07-11--21-46-17--2 +# TOYOTA CAMRY 2021 +51f386982b6e8a77|2023-07-08--20-11-27--27 +# TOYOTA CAMRY 2021 +542e88ffeabefde6|2023-07-13--15-57-13--4 +# TOYOTA CAMRY 2021 +893ae4414cc33177|2023-07-17--16-27-47--44 +# TOYOTA CAMRY 2021 +914f01e43165ff12|2023-06-16--15-13-48--15 +# TOYOTA CAMRY 2021 +b8c0e1ef3bae2ae8|2023-07-06--15-56-32--1 +# TOYOTA CAMRY 2021 +bfd59919af7a9183|2023-05-22--17-06-38--3 +# TOYOTA CAMRY 2021 +c152e86589f67fa8|2023-06-09--11-26-31--8 +# TOYOTA CAMRY 2021 +ec21b3b2491e1d5b|2023-05-21--20-10-40--54 +# TOYOTA CAMRY 2021 +f56e1b6b8d3d4326|2023-06-16--16-40-59--19 +# LEXUS RX 2020 +14bae1f3b3778de2|2023-07-29--08-59-05--1 +# LEXUS RX 2020 +221bc8e55b068d8c|2023-07-22--14-09-28--5 +# LEXUS RX 2020 +284aa7812f549210|2023-07-17--13-43-52--15 +# LEXUS RX 2020 +02b50dc00776ca3c|2023-06-04--21-14-16--6 +# LEXUS RX 2020 +12f5389d0abdd2b0|2023-07-16--03-22-06--191 +# LEXUS RX 2020 +34091e43a35e6b0c|2023-07-28--15-25-20--9 +# LEXUS RX 2020 +4adbcf7b0056b7eb|2023-07-28--19-57-42--1 +# LEXUS RX 2020 +5706cbe0f8b82a15|2023-05-21--09-36-28--7 +# LEXUS RX 2020 +5eaac34b077defa9|2023-07-03--09-52-29--17 +# LEXUS RX 2020 +75b3f01a07557b7d|2023-06-14--18-57-50--7 +# LEXUS RX 2020 +b32bbd31c710d41c|2023-06-30--13-28-18--5 +# LEXUS RX 2020 +b0d686668fb49a0b|2023-07-08--14-38-02--30 +# LEXUS RX 2020 +c5c8fc431bbe68e5|2023-08-07--19-45-43--8 +# LEXUS RX 2020 +d61540bf6f3ff5fd|2023-05-26--11-18-58--4 +# TOYOTA AVALON 2022 +14f1b241a8c4e210|2023-05-14--17-14-36--75 +# TOYOTA AVALON 2022 +5cee358519141338|2023-07-31--14-50-56--15 +# TOYOTA AVALON 2022 +c417be6e8e4be4c6|2023-07-11--13-17-09--19 +# KIA EV6 2022 +2466dbded40ee302|2023-07-19--07-57-59--5 +# KIA EV6 2022 +150033b3d34ddfa3|2023-08-08--12-23-52--18 +# KIA EV6 2022 +21bbb80f61096b25|2023-05-21--05-23-18--24 +# KIA EV6 2022 +83cd83d9569526f1|2023-06-30--00-21-30--7 +# KIA EV6 2022 +879ccc014c30dbf9|2023-07-23--18-45-39--24 +# KIA EV6 2022 +b3a670efbd147ef7|2023-06-15--13-26-07--30 +# KIA EV6 2022 +cb06ac355b38798f|2023-06-11--20-29-07--30 +# KIA EV6 2022 +ff07367edd52b0d0|2023-08-06--01-47-15--51 +# CHRYSLER PACIFICA 2020 +12208e5acdc97eb3|2023-06-15--14-42-11--5 +# CHRYSLER PACIFICA 2020 +20665f9a424ada41|2023-07-31--17-11-31--8 +# CHRYSLER PACIFICA 2020 +1d59b9e6ca471788|2023-06-11--16-36-39--1 +# CHRYSLER PACIFICA 2020 +42ccfd732446a8e3|2023-05-18--08-53-58--1 +# CHRYSLER PACIFICA 2020 +5fc1717be83fc0da|2023-07-27--13-49-58--50 +# CHRYSLER PACIFICA 2020 +75564b71f403c136|2023-06-25--14-16-12--8 +# CHRYSLER PACIFICA 2020 +9cad19e0efce3650|2023-06-07--20-40-39--25 +# CHRYSLER PACIFICA 2020 +af014367f8fd3384|2023-06-04--08-57-55--5 +# CHRYSLER PACIFICA 2020 +c1feb10d20626c65|2023-06-11--15-14-18--64 +# CHRYSLER PACIFICA 2020 +f0b1085e8e45dc63|2023-05-31--17-25-38--7 +# LEXUS ES 2019 +1678ac13bc9877c8|2023-07-09--20-07-48--29 +# LEXUS ES 2019 +2844efe905d33fbd|2023-07-02--12-10-43--44 +# LEXUS ES 2019 +6ed275339186a130|2023-07-21--06-40-44--32 +# LEXUS ES 2019 +7a63be41f9cead58|2023-05-11--09-03-37--14 +# LEXUS ES 2019 +a0dc5a8ca1a5786a|2023-07-04--09-29-52--7 +# LEXUS ES 2019 +cf071db973993448|2023-07-29--18-58-05--13 +# LEXUS ES 2019 +db1c55738e630599|2023-06-09--21-03-38--3 +# LEXUS ES 2019 +ea4add78b3d29a5f|2023-05-25--06-41-18--50 +# TOYOTA AVALON 2019 +1cdab90d23115dc2|2023-05-27--21-27-46--9 +# TOYOTA AVALON 2019 +2aeb6689ee609d86|2023-05-25--17-51-03--14 +# TOYOTA AVALON 2019 +57ea94b88445973c|2023-05-24--18-27-06--7 +# TOYOTA AVALON 2019 +dfe129aad2e701b6|2023-05-11--21-08-54--3 +# TOYOTA AVALON 2019 +f02bf3c0f2ec038e|2023-07-17--12-52-56--4 +# TOYOTA AVALON 2019 +f7d1a944dc6e8789|2023-06-02--15-00-46--64 +# VOLKSWAGEN TIGUAN 2ND GEN +07ddd23c582b8e2a|2023-06-10--13-32-49--1 +# VOLKSWAGEN TIGUAN 2ND GEN +4aadfdcf6846d356|2023-07-10--20-22-59--1 +# VOLKSWAGEN TIGUAN 2ND GEN +4e144f64a2535890|2023-05-27--15-30-51--3 +# VOLKSWAGEN TIGUAN 2ND GEN +88b9fa8e179f87d8|2023-07-12--17-01-50--11 +# VOLKSWAGEN TIGUAN 2ND GEN +b08418a961021457|2023-05-15--10-51-25--4 +# VOLKSWAGEN TIGUAN 2ND GEN +c78c1972adfa10df|2023-05-20--13-11-13--8 +# VOLKSWAGEN TIGUAN 2ND GEN +d5eb604aa6ae46b7|2023-08-01--16-13-48--5 +# VOLKSWAGEN TIGUAN 2ND GEN +deb9a2546658c0ec|2023-08-07--14-53-50--1 +# VOLKSWAGEN TIGUAN 2ND GEN +f3dfef1528797a29|2023-05-25--20-36-07--8 +# HYUNDAI SONATA HYBRID 2021 +01d4ba35f8288743|2023-07-30--11-19-09--14 +# HYUNDAI SONATA HYBRID 2021 +1d08ecde44f58620|2023-06-08--19-12-14--2 +# HYUNDAI SONATA HYBRID 2021 +077309a26bf98013|2023-07-01--14-11-42--1 +# HYUNDAI SONATA HYBRID 2021 +2fdb3b00e818dfd7|2023-07-31--02-50-23--12 +# HYUNDAI SONATA HYBRID 2021 +49734429dda9bbe7|2023-07-10--14-53-29--38 +# HYUNDAI SONATA HYBRID 2021 +61ef897671a29f5c|2023-07-18--10-19-18--10 +# HYUNDAI SONATA HYBRID 2021 +6f322e987d684501|2023-07-27--17-11-53--14 +# HYUNDAI SONATA HYBRID 2021 +7a629f5c75f83fa7|2023-05-20--22-20-36--7 +# HYUNDAI SONATA HYBRID 2021 +a6c2adb491991166|2023-07-16--09-55-40--4 +# HYUNDAI SONATA HYBRID 2021 +b5374bdeea21f5ce|2023-07-15--19-31-57--13 +# HYUNDAI SONATA HYBRID 2021 +be44434f27731ff8|2023-07-02--08-00-08--240 +# HYUNDAI SONATA HYBRID 2021 +cc820fd0720354e1|2023-06-08--14-57-24--37 +# HYUNDAI SONATA HYBRID 2021 +df2433ef9f6dcaa5|2023-07-27--20-19-04--2 +# VOLKSWAGEN POLO 6TH GEN +0bbe367c98fa1538|2023-07-01--19-42-26--7 +# LEXUS NX 2020 +14f9b413ca9c2962|2023-06-30--12-09-53--5 +# LEXUS NX 2020 +436b3762e7406d9d|2023-05-28--19-54-45--18 +# LEXUS NX 2020 +9b42a9940cfd5fda|2023-06-17--19-17-40--53 +# LEXUS NX 2020 +c7a06a775d4a0b29|2023-05-16--10-36-19--1 +# LEXUS NX 2020 +e4b558dc139f76e1|2023-06-26--17-19-48--5 +# LEXUS NX 2018 +09d58cd27c493c29|2023-05-26--07-56-26--9 +# LEXUS NX 2018 +6179fc02b5ed871f|2023-06-26--15-38-35--4 +# LEXUS NX 2018 +b8dd7a23d04c522f|2023-06-15--15-43-11--33 +# HONDA CR-V HYBRID 2019 +11fa019479471a0a|2023-06-19--16-40-40--18 +# HONDA CR-V HYBRID 2019 +8f3f4683d7cfda74|2023-05-27--15-40-52--4 +# HONDA CR-V HYBRID 2019 +d6c98b1ebf9916b9|2023-07-20--09-04-29--20 +# SUBARU IMPREZA LIMITED 2019 +0744286ead2fbb96|2023-05-19--20-52-49--110 +# SUBARU IMPREZA LIMITED 2019 +283bc259f3c0fec9|2023-06-23--18-44-24--2 +# SUBARU IMPREZA LIMITED 2019 +45d40901dd17481d|2023-06-30--19-57-56--20 +# SUBARU IMPREZA LIMITED 2019 +5c3a4dc9bd0b2eaa|2023-05-16--16-43-44--22 +# SUBARU IMPREZA LIMITED 2019 +6f35adacf2529520|2023-08-01--09-20-18--12 +# SUBARU IMPREZA LIMITED 2019 +7a4ef9e9f44480ee|2023-06-17--09-29-32--3 +# SUBARU IMPREZA LIMITED 2019 +7d1607ec8698af97|2023-06-21--20-38-47--2 +# SUBARU IMPREZA LIMITED 2019 +8de015561e1ea4a0|2023-05-15--17-20-39--2 +# SUBARU IMPREZA LIMITED 2019 +9dedbd672d57fd88|2023-07-27--14-29-54--6 +# SUBARU IMPREZA LIMITED 2019 +d96660307a3000e2|2023-06-17--20-29-31--43 +# HYUNDAI IONIQ HYBRID 2017-2019 +0e13ee2b821302f4|2023-07-09--15-44-35--3 +# HYUNDAI IONIQ HYBRID 2017-2019 +8dc7b1ff3d3ce73d|2023-07-13--21-49-58--3 +# HYUNDAI GENESIS 2015-2016 +06353521b1f136dd|2023-05-12--19-40-35--48 +# HYUNDAI GENESIS 2015-2016 +61b3de3cce404316|2023-07-05--19-47-46--17 +# HYUNDAI GENESIS 2015-2016 +b6bb1d6e9e76d5c0|2023-06-26--06-28-25--4 +# KIA NIRO HYBRID 2021 +1ea7eb816544f6c0|2023-07-31--19-13-44--1 +# KIA NIRO HYBRID 2021 +92daf576a7eab465|2023-07-18--12-15-16--63 +# HONDA PILOT 2017 +11bfdda7cffeb882|2023-05-26--13-25-27--7 +# HONDA PILOT 2017 +1c8910b52e443f18|2023-05-21--20-31-29--44 +# HONDA PILOT 2017 +18bbbb7606cddb6a|2023-05-21--13-13-06--110 +# HONDA PILOT 2017 +30bdd852020fbd54|2023-06-07--09-05-51--22 +# HONDA PILOT 2017 +31e47fc2fc02c165|2023-06-02--13-31-29--13 +# HONDA PILOT 2017 +35b4e5307cce2504|2023-05-20--10-05-14--2 +# HONDA PILOT 2017 +34ff4137044da8fa|2023-05-10--22-40-43--12 +# HONDA PILOT 2017 +695826b02fd8fe16|2023-06-21--13-30-12--9 +# HONDA PILOT 2017 +83ccc4c48741b67a|2023-05-25--15-12-07--15 +# HONDA PILOT 2017 +8a9bfee29c5a277a|2023-06-01--09-20-21--70 +# HONDA PILOT 2017 +9cb432f9376cfa89|2023-05-16--16-25-22--6 +# HONDA PILOT 2017 +9bac7575fac62395|2023-05-17--06-24-54--11 +# HONDA PILOT 2017 +ad1b9150af890d9e|2023-07-31--09-13-55--15 +# HONDA PILOT 2017 +b4f429568ea81f21|2023-06-17--11-05-51--112 +# HONDA PILOT 2017 +bd80a1c23664b3b7|2023-06-12--16-44-33--4 +# HONDA PILOT 2017 +d53a9253d19264e5|2023-07-03--00-53-05--3 +# HONDA PILOT 2017 +da7d4c7c00a25e08|2023-06-22--19-20-41--15 +# HONDA PILOT 2017 +d9c43a383a53494b|2023-07-25--09-03-56--2 +# HONDA PILOT 2017 +f4e5206d7968b785|2023-06-24--22-50-01--1 +# HONDA PILOT 2017 +fff9af2c280cebe7|2023-07-15--09-10-37--5 +# HONDA CIVIC (BOSCH) 2019 +220bd1ec52459628|2023-05-14--13-38-23--117 +# HONDA CIVIC (BOSCH) 2019 +1cea7c17bf903d1d|2023-06-05--17-05-26--41 +# HONDA CIVIC (BOSCH) 2019 +2872a60fdd6a85a5|2023-06-07--23-37-19--139 +# HONDA CIVIC (BOSCH) 2019 +5123f2e42bc5c2fb|2023-07-04--17-34-47--16 +# HONDA CIVIC (BOSCH) 2019 +4ea994afc80a04cf|2023-07-01--19-47-55--2 +# HONDA CIVIC (BOSCH) 2019 +8506a4cbf74a6519|2023-06-30--12-05-04--14 +# HONDA CIVIC (BOSCH) 2019 +8c63e6150f08c5cc|2023-07-30--20-05-40--62 +# HONDA CIVIC (BOSCH) 2019 +90d56ac785678835|2023-05-28--17-28-04--1 +# HONDA CIVIC (BOSCH) 2019 +930ad2d3aa9a7438|2023-07-10--15-57-07--5 +# HONDA CIVIC (BOSCH) 2019 +9c9e7b7cb9a2d507|2023-06-16--22-18-46--8 +# HONDA CIVIC (BOSCH) 2019 +a341d8f71913b7c6|2023-07-03--11-08-08--9 +# HONDA CIVIC (BOSCH) 2019 +a9a11ee77c895117|2023-05-31--20-56-14--1 +# HONDA CIVIC (BOSCH) 2019 +addf4f63ee4758f3|2023-06-12--13-17-03--10 +# HONDA CIVIC (BOSCH) 2019 +c6d9941315763063|2023-05-26--18-06-58--47 +# HONDA CIVIC (BOSCH) 2019 +ced18df2ecb5eccd|2023-06-26--16-09-36--15 +# HONDA CIVIC (BOSCH) 2019 +d4c8df785ce7f3c5|2023-07-14--15-46-41--12 +# HONDA CIVIC (BOSCH) 2019 +dbd8a2d9977de5f5|2023-06-14--07-23-48--17 +# HONDA CIVIC (BOSCH) 2019 +e4f4282867c6a6b9|2023-07-21--11-37-55--7 +# HONDA CIVIC (BOSCH) 2019 +ee87fe694c837822|2023-07-22--10-02-27--10 +# HONDA CIVIC (BOSCH) 2019 +f27a5518b5be94da|2023-07-21--18-09-53--4 +# HONDA CIVIC (BOSCH) 2019 +f1c58b2efb96589f|2023-07-20--09-38-55--107 +# HONDA CIVIC (BOSCH) 2019 +f99ab12043ad3219|2023-07-19--17-07-43--2 +# HYUNDAI KONA ELECTRIC 2019 +15e5d08be3f89aeb|2023-05-10--05-05-16--1 +# HYUNDAI KONA ELECTRIC 2019 +39ff090a42469a72|2023-05-15--16-18-09--6 +# HYUNDAI KONA ELECTRIC 2019 +c9508b688d2009f6|2023-05-23--12-24-07--21 +# LEXUS RX 2016 +1124e8ae07941ba9|2023-06-05--15-45-48--9 +# LEXUS RX 2016 +2daa07741d66050b|2023-05-21--15-59-39--3 +# LEXUS RX 2016 +4424ddad7f805c10|2023-05-14--13-50-39--147 +# LEXUS RX 2016 +42132726c7467377|2023-07-08--17-03-46--83 +# LEXUS RX 2016 +6ecec1e8fd327774|2023-07-26--10-46-54--13 +# LEXUS RX 2016 +77cb7310f7b0e1d1|2023-05-28--20-12-02--95 +# LEXUS RX 2016 +89ee528b1eb135ed|2023-05-12--20-05-25--5 +# LEXUS RX 2016 +9cd71f2c46d99533|2023-08-02--20-53-42--17 +# LEXUS RX 2016 +ca71d21f2c04ff8e|2023-07-17--08-16-56--83 +# LEXUS RX 2016 +f4c7fca20721d4c1|2023-07-25--18-15-24--18 +# LEXUS RX 2016 +f2defa60d751d031|2023-05-17--15-27-40--91 +# JEEP GRAND CHEROKEE 2019 +06d01b4518df02ff|2023-07-05--06-29-47--46 +# JEEP GRAND CHEROKEE 2019 +2d9b6425552c52c1|2023-05-14--18-18-54--20 +# JEEP GRAND CHEROKEE 2019 +2f123609bbddbe0c|2023-07-18--17-46-35--16 +# JEEP GRAND CHEROKEE 2019 +626791454319848b|2023-07-06--02-13-50--169 +# JEEP GRAND CHEROKEE 2019 +76ec661ac0d18569|2023-08-05--16-58-53--42 +# JEEP GRAND CHEROKEE 2019 +e1dfba62a4e33f7b|2023-05-10--14-17-59--4 +# JEEP GRAND CHEROKEE 2019 +fdcd19f4434cea9d|2023-05-10--17-10-38--2 +# CHEVROLET VOLT PREMIER 2017 +20cb801701fc8237|2023-06-07--17-41-26--12 +# CHEVROLET VOLT PREMIER 2017 +08924d6a5ba4ab32|2023-07-04--06-56-44--30 +# CHEVROLET VOLT PREMIER 2017 +216776dc641516cc|2023-07-23--16-40-47--76 +# CHEVROLET VOLT PREMIER 2017 +255403b2bd0acb75|2023-05-12--08-44-56--19 +# CHEVROLET VOLT PREMIER 2017 +3189708ff522bc3a|2023-06-08--11-42-29--37 +# CHEVROLET VOLT PREMIER 2017 +3725c590ce069e78|2023-06-25--07-44-44--18 +# CHEVROLET VOLT PREMIER 2017 +3ddd64a934be4c23|2023-06-27--07-52-32--5 +# CHEVROLET VOLT PREMIER 2017 +4bd7be56a56eecaf|2023-05-10--18-17-26--7 +# CHEVROLET VOLT PREMIER 2017 +524ca9dc97ddd9a3|2023-07-25--21-32-28--5 +# CHEVROLET VOLT PREMIER 2017 +5617d19d0841b38c|2023-05-24--12-29-35--113 +# CHEVROLET VOLT PREMIER 2017 +67b9beb7b4d31cf8|2023-05-23--12-50-32--15 +# CHEVROLET VOLT PREMIER 2017 +73a06f3c204cb47a|2023-05-21--15-37-47--6 +# CHEVROLET VOLT PREMIER 2017 +90678d1470cad364|2023-06-03--14-10-34--15 +# CHEVROLET VOLT PREMIER 2017 +a3e8ad84037083ca|2023-06-02--17-10-25--13 +# CHEVROLET VOLT PREMIER 2017 +af9fc6047bf1dae2|2023-08-01--05-28-32--25 +# CHEVROLET VOLT PREMIER 2017 +b24f78641f62dd3c|2023-06-06--18-18-45--13 +# CHEVROLET VOLT PREMIER 2017 +c12c0f43a6c65515|2023-05-23--10-31-56--6 +# CHEVROLET VOLT PREMIER 2017 +d0aa4a8f195675a9|2023-06-20--19-35-14--33 +# CHEVROLET VOLT PREMIER 2017 +d44c5c17d2380d53|2023-07-27--20-23-18--9 +# CHEVROLET VOLT PREMIER 2017 +d2ccdcf33e62cfa0|2023-06-01--20-42-39--58 +# CHEVROLET VOLT PREMIER 2017 +dcaf04bb53a1f9df|2023-06-02--10-08-55--1 +# CHEVROLET VOLT PREMIER 2017 +e69bcbc2c84de4d2|2023-06-27--17-12-00--14 +# CHEVROLET VOLT PREMIER 2017 +e2b25f39da040caa|2023-07-23--12-59-47--49 +# CHEVROLET VOLT PREMIER 2017 +e4b91b0282619c79|2023-07-30--15-57-39--1 +# TOYOTA ALPHARD 2020 +09c50095f46f96cd|2023-05-21--10-27-44--20 +# TOYOTA ALPHARD 2020 +5ffe5d6678eaefb2|2023-07-04--17-18-33--96 +# HYUNDAI IONIQ PHEV 2020 +201c5aaced09a24a|2023-05-20--12-39-01--15 +# HYUNDAI IONIQ PHEV 2020 +4bcc377663bc541a|2023-05-24--14-59-59--219 +# HYUNDAI IONIQ PHEV 2020 +78fdfacf4a805561|2023-07-17--11-54-45--73 +# HYUNDAI IONIQ PHEV 2020 +93882bc7bea8b476|2023-07-30--19-56-22--7 +# HYUNDAI IONIQ PHEV 2020 +b28e9dbe4004e915|2023-06-11--19-55-28--2 +# HYUNDAI IONIQ PHEV 2020 +c447f3983314c453|2023-05-14--17-17-24--158 +# RAM 1500 5TH GEN +17fc16d840fe9d21|2023-05-18--19-28-17--11 +# VOLKSWAGEN ARTEON 1ST GEN +0662797832aac2eb|2023-07-13--09-33-52--73 +# VOLKSWAGEN ARTEON 1ST GEN +5ac586afbb236b5d|2023-07-17--22-52-19--5 +# VOLKSWAGEN ARTEON 1ST GEN +c34ef43981b6d888|2023-06-01--07-50-41--7 +# HONDA INSIGHT 2019 +0ac79efcae392b39|2023-06-29--10-57-45--8 +# HONDA INSIGHT 2019 +acdb227003c7aee1|2023-05-30--17-06-35--9 +# HONDA INSIGHT 2019 +baeb84fd6ad76707|2023-07-26--06-13-05--45 +# HONDA INSIGHT 2019 +ba9a88a070809873|2023-05-14--13-34-35--32 +# HONDA INSIGHT 2019 +bfde60a60008c36d|2023-05-24--16-51-16--24 +# HONDA INSIGHT 2019 +f7d92a003486dc37|2023-06-10--16-17-23--48 +# TOYOTA MIRAI 2021 +2611ca299b6b5939|2023-07-12--19-27-34--1 +# TOYOTA MIRAI 2021 +390a85b0f0d7a93b|2023-07-02--17-09-06--13 +# TOYOTA MIRAI 2021 +d2bd3cb8241c253c|2023-05-30--18-34-40--2 +# TOYOTA MIRAI 2021 +f4ee9d3ae1d656fb|2023-08-03--17-47-32--15 +# TOYOTA AVALON 2019 +1cf68ce8c78d6246|2023-07-02--22-42-04--9 +# TOYOTA AVALON 2019 +3e1100294929fd5f|2023-06-19--20-05-45--6 +# TOYOTA AVALON 2019 +7879897f0af9ed09|2023-07-21--12-35-20--1 +# LEXUS NX 2020 +01f31237627e0cc3|2023-08-08--09-32-39--10 +# KIA STINGER GT2 2018 +2ba5946fb25bfc1f|2023-07-29--22-48-54--40 +# KIA STINGER GT2 2018 +5ccb50cda9fba8b7|2023-07-02--12-59-48--2 +# KIA STINGER GT2 2018 +724f06bcdb81bc8e|2023-07-01--08-24-30--25 +# KIA STINGER GT2 2018 +8efe830da0568792|2023-07-07--12-21-04--14 +# KIA STINGER GT2 2018 +b5768b7348113531|2023-07-29--20-29-19--1 +# SKODA KODIAQ 1ST GEN +2696aa4107f3a534|2023-06-12--17-35-02--1 +# SKODA KODIAQ 1ST GEN +2ca49a03c8084514|2023-08-04--07-24-41--13 +# SKODA KODIAQ 1ST GEN +89b596c5edcb6dba|2023-07-15--15-38-29--1 +# SKODA KODIAQ 1ST GEN +8a5da7c1d1783730|2023-06-08--17-33-34--2 +# SKODA KODIAQ 1ST GEN +cd4c3e2031f01e61|2023-07-03--11-19-29--1 +# SKODA KODIAQ 1ST GEN +dafb0cb9e28e0249|2023-05-31--15-55-44--1 +# HONDA HRV 2019 +09c457a021a641e7|2023-07-24--20-02-45--3 +# HONDA HRV 2019 +6e9442a1c18f2abd|2023-05-26--12-52-43--4 +# HONDA HRV 2019 +78edb6a9a06e891d|2023-06-25--19-42-26--2 +# HONDA HRV 2019 +7c72f43a732e77ce|2023-07-26--21-44-12--10 +# HONDA HRV 2019 +a9203d77468a98a3|2023-05-11--21-05-37--10 +# GENESIS G80 2017 +2dcea2872df6d423|2023-06-06--19-13-28--50 +# GENESIS G80 2017 +450774a9a3ffe4c8|2023-08-05--15-07-10--11 +# GENESIS G80 2017 +a99d0d0edbedad89|2023-07-04--21-21-06--4 +# VOLKSWAGEN PASSAT 8TH GEN +2d7d87433a67c925|2023-05-14--17-05-12--21 +# VOLKSWAGEN PASSAT 8TH GEN +37e3253d2ac7c823|2023-05-30--16-09-30--26 +# VOLKSWAGEN PASSAT 8TH GEN +40443218782e5709|2023-07-11--10-44-37--14 +# VOLKSWAGEN PASSAT 8TH GEN +5405cac0c9d58c3d|2023-06-13--18-00-38--5 +# VOLKSWAGEN PASSAT 8TH GEN +7e069ec96c2da3a2|2023-07-08--14-06-11--23 +# VOLKSWAGEN PASSAT 8TH GEN +fd81eb7cc97ce831|2023-05-13--14-22-35--55 +# AUDI Q3 2ND GEN +2a7eeed5627fe50f|2023-05-26--16-00-32--42 +# AUDI Q3 2ND GEN +cdc1627feb1c82d3|2023-07-23--16-49-24--6 +# TOYOTA HIGHLANDER 2017 +30f476405b31e063|2023-07-23--11-27-50--4 +# TOYOTA HIGHLANDER 2017 +335da7758ecaf9b8|2023-06-07--06-45-19--6 +# TOYOTA HIGHLANDER 2017 +3dfa699819714d88|2023-05-23--10-21-28--15 +# TOYOTA HIGHLANDER 2017 +443fc6ac84d80c7e|2023-06-09--10-38-02--5 +# TOYOTA HIGHLANDER 2017 +69310bd073c5381d|2023-05-25--11-21-15--7 +# TOYOTA HIGHLANDER 2017 +7ebef57bc42d0ffd|2023-05-15--09-33-53--32 +# TOYOTA HIGHLANDER 2017 +90e19871a5f0753d|2023-05-30--19-41-28--30 +# TOYOTA HIGHLANDER 2017 +a2153ee04e30ac3c|2023-05-28--15-46-53--20 +# TOYOTA HIGHLANDER 2017 +a68647f2ba7092a3|2023-06-09--11-50-44--12 +# TOYOTA HIGHLANDER 2017 +d4f786dae36655f1|2023-07-08--11-46-59--31 +# TOYOTA HIGHLANDER 2017 +eb3a11981a924f0f|2023-07-29--12-16-21--12 +# CHRYSLER PACIFICA HYBRID 2017 +328eb791948dc4c4|2023-07-28--20-13-00--12 +# CHRYSLER PACIFICA HYBRID 2017 +57409982aa4a348b|2023-07-17--19-19-22--13 +# CHRYSLER PACIFICA HYBRID 2017 +62bde7c16381d8b2|2023-05-21--20-35-27--17 +# CHRYSLER PACIFICA HYBRID 2017 +949ce31b8c38095a|2023-07-11--19-03-33--37 +# TOYOTA AVALON 2022 +301800decccd6669|2023-06-10--12-18-42--12 +# TOYOTA AVALON 2022 +caa859705cd01362|2023-07-20--08-41-27--1 +# SUBARU OUTBACK 6TH GEN +33f86ddb06a656dd|2023-07-30--19-36-09--38 +# SUBARU OUTBACK 6TH GEN +46009c83d4595279|2023-07-10--18-04-48--49 +# SUBARU OUTBACK 6TH GEN +781b0068b313214f|2023-07-24--09-46-42--1 +# SUBARU OUTBACK 6TH GEN +83ce0f0dcdc42a2d|2023-07-12--11-37-21--5 +# SUBARU OUTBACK 6TH GEN +8a0a42036c8cd285|2023-07-15--12-20-41--251 +# SUBARU OUTBACK 6TH GEN +a0a54ab26674dbb9|2023-05-10--17-52-42--11 +# SUBARU OUTBACK 6TH GEN +bad6ae3584ece5b5|2023-06-06--20-47-16--1 +# SUBARU OUTBACK 6TH GEN +c726b2698bd24c5e|2023-07-22--11-45-38--2 +# SUBARU OUTBACK 6TH GEN +db94c35b2fc49a1d|2023-06-29--15-34-53--3 +# SUBARU OUTBACK 6TH GEN +eac0312bb7d371ef|2023-06-23--09-53-10--3 +# VOLKSWAGEN PASSAT NMS +398d43ca7e0c8e34|2023-06-07--21-05-24--3 +# LEXUS IS 2018 +3776c9b10eb2ab37|2023-07-17--19-38-03--12 +# LEXUS IS 2018 +5d64b83564cf5d9a|2023-07-23--15-00-46--12 +# LEXUS IS 2018 +a52787c41eced8a8|2023-07-28--00-12-38--4 +# LEXUS IS 2018 +c8c2f75d1782de03|2023-06-26--23-05-18--17 +# KIA SORENTO 4TH GEN +3c492c4530c6ad7f|2023-07-25--12-52-04--8 +# KIA SORENTO 4TH GEN +fd067a3a06f7bb3f|2023-07-18--19-05-41--2 +# HONDA CIVIC 2022 +35c004509e3057f2|2023-05-22--06-15-04--15 +# HONDA CIVIC 2022 +5130484aa8069bad|2023-05-20--17-37-41--2 +# HONDA CIVIC 2022 +8fcafab4167b8c6c|2023-06-24--15-42-50--55 +# KIA OPTIMA 4TH GEN FACELIFT +3d96bd05b5513638|2023-06-09--16-14-40--8 +# KIA OPTIMA 4TH GEN FACELIFT +fec0d754d02e943e|2023-06-19--14-54-54--144 +# HYUNDAI ELANTRA 2021 +3ea622c3c0ec3055|2023-06-22--18-40-28--15 +# HYUNDAI ELANTRA 2021 +449474d0a79c14aa|2023-07-30--15-41-03--10 +# HYUNDAI ELANTRA 2021 +5c9daa3b70d6f706|2023-08-05--15-56-10--2 +# HYUNDAI ELANTRA 2021 +5a4405495d2750ef|2023-05-13--21-13-20--16 +# HYUNDAI ELANTRA 2021 +be0bb3add22aeed0|2023-07-12--16-05-59--8 +# HYUNDAI ELANTRA 2021 +d8cd6e5e3998d306|2023-06-26--20-55-03--7 +# SKODA OCTAVIA 3RD GEN +3fa7570f2fcace3d|2023-08-02--14-13-00--2 +# SKODA OCTAVIA 3RD GEN +f5392228324cda8d|2023-07-19--09-22-26--1 +# KIA CARNIVAL 4TH GEN +409c9409979a8abc|2023-07-30--17-05-09--41 +# HYUNDAI IONIQ HYBRID 2020-2022 +452f244b23a48e9b|2023-07-19--18-49-50--5 +# KIA STINGER 2022 +47d09720bb2ccdf9|2023-06-05--20-25-36--6 +# COMMA BODY +4ae6d7a23dc12ee9|2023-07-22--18-04-32--2 +# COMMA BODY +8fb3c185d81fc85e|2023-08-06--14-57-51--5 +# COMMA BODY +efdf9af95e71cd84|2023-06-28--17-25-55--12 +# TOYOTA C-HR 2018 +482ce47555b39e90|2023-07-14--18-51-41--7 +# TOYOTA C-HR 2018 +4ff60f3f7178368b|2023-05-11--08-32-46--13 +# TOYOTA C-HR 2018 +fdf1eae234f98180|2023-05-24--09-19-26--1 +# TOYOTA AVALON 2016 +4bc88417168295f0|2023-07-28--18-04-07--71 +# TOYOTA AVALON 2016 +fe56ef3e908ceadc|2023-08-01--13-17-58--29 +# HONDA FIT 2018 +48536bafa6cabe3e|2023-06-14--14-50-06--6 +# HONDA FIT 2018 +8085a4d3c9416184|2023-07-27--15-31-59--9 +# HONDA FIT 2018 +a6883439bbd3d975|2023-05-30--17-28-13--26 +# HONDA FIT 2018 +e56002a2b1eeed4d|2023-07-04--13-32-44--4 +# MAZDA CX-9 2021 +51ffb2084fa16e13|2023-06-27--18-32-54--1 +# MAZDA CX-9 2021 +629c4aced073d15a|2023-06-13--12-03-56--5 +# MAZDA CX-9 2021 +ab2ef769ce18b0b2|2023-05-10--16-48-57--21 +# MAZDA CX-9 2021 +f04622e57618f6b8|2023-06-08--17-14-27--32 +# FORD BRONCO SPORT 1ST GEN +54827bf84c38b14f|2023-05-10--22-15-37--2 +# HYUNDAI IONIQ 5 2022 +5608f42aaece1463|2023-07-08--12-56-57--10 +# HYUNDAI IONIQ 5 2022 +57f8e21bb63728ed|2023-07-17--17-56-04--20 +# HYUNDAI IONIQ 5 2022 +534e3360c3936247|2023-08-03--10-30-38--6 +# HYUNDAI IONIQ 5 2022 +6c5e2106ca45c09f|2023-05-29--20-39-58--57 +# HYUNDAI IONIQ 5 2022 +8014970252341f77|2023-08-01--19-53-30--21 +# HYUNDAI IONIQ 5 2022 +81817870e9d2dc12|2023-06-24--21-37-09--23 +# HYUNDAI IONIQ 5 2022 +8379b28e51ceb3b1|2023-05-13--21-53-54--5 +# HYUNDAI IONIQ 5 2022 +8a53aa70d88313f1|2023-07-14--16-06-11--34 +# HYUNDAI IONIQ 5 2022 +94fb5be27a4b67b0|2023-07-02--21-38-55--55 +# HYUNDAI IONIQ 5 2022 +9a8af592c6b6b617|2023-05-18--07-24-13--121 +# HYUNDAI IONIQ 5 2022 +b70b56b76a6217f2|2023-06-02--14-53-42--63 +# HYUNDAI IONIQ 5 2022 +cb8f2450d9bc2438|2023-07-07--14-26-13--22 +# HYUNDAI IONIQ 5 2022 +cdc004f72f0192de|2023-06-20--17-46-52--10 +# HYUNDAI IONIQ 5 2022 +d172a844d3da91a4|2023-05-22--16-14-11--4 +# HYUNDAI IONIQ 5 2022 +dab2ee943375ae1f|2023-07-29--13-07-45--11 +# HYUNDAI IONIQ 5 2022 +db2f545ea314b36d|2023-07-05--16-54-15--19 +# HYUNDAI IONIQ 5 2022 +e42931599f753d96|2023-05-24--20-20-26--13 +# HYUNDAI IONIQ 5 2022 +f2a5efadd1dbf33f|2023-05-22--17-54-44--3 +# GENESIS GV70 1ST GEN +573d0052724c316d|2023-07-04--11-33-32--1 +# GENESIS GV70 1ST GEN +5d327dec6ec07b6e|2023-06-16--15-56-30--5 +# GENESIS GV70 1ST GEN +60c76f368ee05a23|2023-06-07--13-34-57--22 +# GENESIS GV70 1ST GEN +ca4de5b12321bd98|2023-05-10--08-48-48--7 +# KIA SPORTAGE 5TH GEN +5780f2cf75339e9f|2023-05-26--23-35-00--8 +# KIA SPORTAGE 5TH GEN +ce72415f25bcbf6f|2023-07-15--10-04-48--6 +# VOLKSWAGEN JETTA 7TH GEN +632ceb5cc1d7e3f3|2023-07-11--17-49-31--53 +# VOLKSWAGEN JETTA 7TH GEN +cf3717f55f9ff6bb|2023-05-21--23-17-16--13 +# TOYOTA C-HR 2021 +6719965b0e1d1737|2023-07-29--17-09-47--4 +# SKODA SUPERB 3RD GEN +6a6d9303aecc1e97|2023-07-12--09-56-43--13 +# SKODA SUPERB 3RD GEN +a7adec1fdbb46a1c|2023-07-31--22-39-06--2 +# SKODA SUPERB 3RD GEN +cd047d573cc78c34|2023-06-29--13-39-09--7 +# SKODA SUPERB 3RD GEN +d22f3f42780f2874|2023-07-11--17-43-18--45 +# NISSAN ALTIMA 2020 +62b0735d47268ec7|2023-06-23--18-44-12--11 +# NISSAN ALTIMA 2020 +742442ec7a49776d|2023-07-07--09-12-19--43 +# NISSAN ALTIMA 2020 +78daf6341d75cffb|2023-06-19--16-00-54--12 +# NISSAN ALTIMA 2020 +894145c25ba0328a|2023-06-24--14-39-55--18 +# NISSAN ALTIMA 2020 +92511c3b877c7215|2023-06-18--14-47-27--26 +# KIA SORENTO GT LINE 2018 +6b111e8e45cc2d07|2023-06-07--22-09-58--6 +# KIA SORENTO GT LINE 2018 +b78a19b557b991ab|2023-05-10--20-56-53--33 +# HYUNDAI TUCSON 4TH GEN +7173fdb19bf459f5|2023-06-02--20-50-49--14 +# HYUNDAI TUCSON 4TH GEN +8426de28ebdc65a2|2023-05-27--14-51-28--13 +# HYUNDAI TUCSON 4TH GEN +f7f6cc634ee443a9|2023-05-23--20-33-04--2 +# HYUNDAI ELANTRA 2017 +734ef96182ddf940|2023-07-12--14-31-45--34 +# SUBARU ASCENT LIMITED 2019 +72df1a0f641d5d4f|2023-06-30--17-17-26--7 +# SUBARU ASCENT LIMITED 2019 +91192c3ff5b51b64|2023-08-06--15-20-27--3 +# SUBARU ASCENT LIMITED 2019 +9936b4bbf75a5fe4|2023-05-12--14-23-02--16 +# SUBARU ASCENT LIMITED 2019 +cb9e6a98fd925948|2023-06-07--09-49-57--32 +# TESLA AP2 MODEL S +7277bddf4748e615|2023-05-10--10-30-06--11 +# HYUNDAI ELANTRA HYBRID 2021 +786fc028c014be71|2023-06-13--10-49-03--2 +# HYUNDAI ELANTRA HYBRID 2021 +8d49af2b041f8c5c|2023-07-06--17-34-04--36 +# HYUNDAI ELANTRA HYBRID 2021 +9b1bd7e1e54c6a37|2023-05-26--08-29-15--1 +# HYUNDAI ELANTRA HYBRID 2021 +d66b12aeb4ac1750|2023-08-04--14-14-48--5 +# HYUNDAI ELANTRA HYBRID 2021 +e33e369bf0cac9f5|2023-06-08--21-38-37--1 +# HYUNDAI ELANTRA HYBRID 2021 +eb5a50f9e98f50b9|2023-06-22--14-06-36--106 +# HYUNDAI ELANTRA HYBRID 2021 +f22818fb0dbd850d|2023-06-07--16-37-27--6 +# HYUNDAI SONATA 2019 +7ae1c131629d96e5|2023-06-01--18-40-26--18 +# HYUNDAI SONATA 2019 +c1fc13c1b806e536|2023-05-24--19-57-19--17 +# HYUNDAI SONATA 2019 +e3500498d01af116|2023-07-19--13-08-43--85 +# HYUNDAI TUCSON 4TH GEN +8afcf4c5d5b6d061|2023-05-14--20-29-14--9 +# HYUNDAI TUCSON 4TH GEN +a1f50efb97003e30|2023-05-17--20-13-07--1 +# HYUNDAI TUCSON 4TH GEN +c5956193b4fde1a3|2023-07-06--20-47-58--24 +# GENESIS GV60 ELECTRIC 1ST GEN +94542b2d06f7a9a6|2023-07-21--11-23-43--28 +# GENESIS GV60 ELECTRIC 1ST GEN +c9ccc00f8d7e00d2|2023-05-18--16-29-54--33 +# GENESIS G70 2018 +9238d5ce084d695e|2023-06-23--19-26-28--12 +# KIA SPORTAGE 5TH GEN +965a780ebeeed150|2023-07-25--07-16-08--40 +# KIA K5 2021 +9d4fa1c83653b90b|2023-07-10--07-30-25--14 +# ACURA RDX 2018 +a00bae406fe65d1c|2023-06-01--21-30-27--11 +# ACURA RDX 2018 +9f98fcb1aa88d319|2023-05-10--12-35-18--17 +# ACURA RDX 2018 +f41a6f453a4beb95|2023-06-25--07-00-46--23 +# FORD ESCAPE 4TH GEN +a4218e6416dfd978|2023-08-02--12-04-45--22 +# SEAT ATECA 1ST GEN +a4455cb22fa944d9|2023-05-19--16-54-51--6 +# VOLKSWAGEN TRANSPORTER T6.1 +a459f4556782eba1|2023-06-05--13-08-21--1 +# NISSAN ROGUE 2019 +ae2babeed1fe011f|2023-08-02--21-28-28--20 +# NISSAN ROGUE 2019 +b7287535e2a23992|2023-07-20--20-17-53--1 +# NISSAN ROGUE 2019 +dff9db8e8d8601f8|2023-05-14--18-00-16--30 +# KIA NIRO EV 2ND GEN +b153671049a867b3|2023-07-12--19-25-18--6 +# KIA NIRO HYBRID 2ND GEN +b1b094b91c2ceafd|2023-06-15--20-30-37--18 +# KIA NIRO HYBRID 2ND GEN +d250f6ef680e703d|2023-07-07--13-31-18--30 +# KIA NIRO HYBRID 2ND GEN +de8fc10be8a79842|2023-06-09--00-59-50--10 +# KIA NIRO HYBRID 2ND GEN +df54ba658aedc57c|2023-06-01--05-27-17--48 +# SEAT LEON 3RD GEN +aef9c04d6ec5cd57|2023-07-15--16-49-38--12 +# HYUNDAI SANTA CRUZ 1ST GEN +c00a40383605f531|2023-05-21--13-08-03--11 +# HONDA CR-V 2016 +bd96755604115d4c|2023-06-27--10-34-55--33 +# TOYOTA RAV4 2023 +c5e5740d799f017f|2023-08-08--13-23-41--7 +# FORD MAVERICK 1ST GEN +c72c220ce1de786f|2023-07-17--15-49-45--5 +# FORD MAVERICK 1ST GEN +c845bd8c366e6f3d|2023-06-29--19-03-50--12 +# CADILLAC ESCALADE 2017 +defd7f8491ad9254|2023-06-18--02-03-57--5 +# CADILLAC ESCALADE 2017 +ef8f2185104d862e|2023-07-29--18-02-25--18 +# TOYOTA C-HR 2021 +ea8fbe72b96a185c|2023-06-08--12-35-07--3 +# HYUNDAI KONA ELECTRIC 2022 +ecb854b94fdfa4d5|2023-05-27--00-04-01--45 +# KIA SORENTO HYBRID 4TH GEN +e8c813df1056766a|2023-05-26--19-01-03--34 +# NISSAN X-TRAIL 2017 +fa9224be239005c7|2023-07-30--14-28-52--18 +# NISSAN LEAF 2018 Instrument Cluster +fc10e0bf7dc6c892|2023-07-09--18-47-05--50 diff --git a/iqpilot/selfdrive/car/tests/test_speed_limit_set_speed.py b/iqpilot/selfdrive/car/tests/test_speed_limit_set_speed.py new file mode 100644 index 000000000..ea1a7d3c3 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_speed_limit_set_speed.py @@ -0,0 +1,180 @@ +from types import SimpleNamespace + +import pytest + +from iqpilot.cereal import car, custom +from iqpilot.common.constants import CV +from iqpilot.selfdrive.car.enhanced_stock_longitudinal_control import build_iq_control_params_from_plan +from iqpilot.selfdrive.car.cruise import VCruiseHelper + + +class TestSpeedLimitSetSpeedMirror: + def setup_method(self): + self.CP = car.CarParams(pcmCruise=True, openpilotLongitudinalControl=True) + self.CP_IQ = custom.IQCarParams(pcmCruiseSpeed=True) + self.v_cruise_helper = VCruiseHelper(self.CP, self.CP_IQ) + self.v_cruise_helper.set_speed_to_limit = True + + @staticmethod + def _iq_plan(limit_mps: float, state) -> SimpleNamespace: + resolver = SimpleNamespace( + speedLimitValid=limit_mps > 0, + speedLimitLastValid=limit_mps > 0, + speedLimitFinalLast=limit_mps, + ) + assist = SimpleNamespace(state=state) + return SimpleNamespace(speedLimit=SimpleNamespace(resolver=resolver, assist=assist)) + + def test_op_long_mirrors_active_speed_limit_target_into_cluster_speed(self): + self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(17.88, custom.IQPlan.SpeedLimit.AssistState.active)) + + CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35}) + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + assert self.v_cruise_helper.v_cruise_kph == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + + def test_op_long_syncs_to_new_limit_even_when_assist_not_active(self): + self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(17.88, custom.IQPlan.SpeedLimit.AssistState.inactive)) + + CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35}) + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + assert self.v_cruise_helper.v_cruise_kph == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + + def test_op_long_allows_manual_set_speed_changes_between_limit_changes(self): + self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(17.88, custom.IQPlan.SpeedLimit.AssistState.inactive)) + + # First cycle after a valid limit appears will sync to the resolved target. + CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35}) + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + # On later cycles with the same limit, manual set speed changes should be preserved. + CS = car.CarState(cruiseState={"available": True, "speed": 15.64, "speedCluster": 15.64}) + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + assert self.v_cruise_helper.v_cruise_kph == pytest.approx(15.64 * CV.MS_TO_KPH, abs=0.1) + assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(15.64 * CV.MS_TO_KPH, abs=0.1) + + def test_op_long_resyncs_when_limit_changes(self): + self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(17.88, custom.IQPlan.SpeedLimit.AssistState.inactive)) + + CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35}) + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + CS = car.CarState(cruiseState={"available": True, "speed": 15.64, "speedCluster": 15.64}) + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + self.v_cruise_helper.update_speed_limit_assist(False, self._iq_plan(13.41, custom.IQPlan.SpeedLimit.AssistState.inactive)) + self.v_cruise_helper.update_v_cruise(CS, enabled=True, is_metric=False) + + assert self.v_cruise_helper.v_cruise_kph == pytest.approx(13.41 * CV.MS_TO_KPH, abs=0.1) + assert self.v_cruise_helper.v_cruise_cluster_kph == pytest.approx(13.41 * CV.MS_TO_KPH, abs=0.1) + + +@pytest.mark.parametrize("pcm_cruise", [False, True]) +@pytest.mark.parametrize("is_metric", [False, True]) +def test_driver_increase_marker_survives_button_release(pcm_cruise, is_metric): + helper = VCruiseHelper(car.CarParams(pcmCruise=pcm_cruise), custom.IQCarParams(pcmCruiseSpeed=True)) + helper.set_speed_to_limit = False + helper.v_cruise_kph = helper.v_cruise_cluster_kph = 80.0 + state = car.CarState(cruiseState={"available": True, "speed": 80 * CV.KPH_TO_MS, "speedCluster": 80 * CV.KPH_TO_MS}) + helper.update_v_cruise(state, True, is_metric) + state.buttonEvents = [car.CarState.ButtonEvent(type="accelCruise", pressed=True)] + helper.update_v_cruise(state, True, is_metric) + assert helper.slc_set_speed_request_id == 0 + state.buttonEvents = [car.CarState.ButtonEvent(type="accelCruise", pressed=False)] + if pcm_cruise: + state.cruiseState.speed = state.cruiseState.speedCluster = 81 * CV.KPH_TO_MS + helper.update_v_cruise(state, True, is_metric) + request = custom.IQCarState.new_message( + slcSetSpeedRequestId=helper.slc_set_speed_request_id, + slcSetSpeedGestureId=helper.slc_set_speed_gesture_id, + slcSetSpeedRequestKph=helper.slc_set_speed_request_kph, + ) + assert request.slcSetSpeedRequestId == 1 + assert request.slcSetSpeedRequestKph == pytest.approx(helper.v_cruise_kph) + state.buttonEvents = [] + for _ in range(100): + helper.update_v_cruise(state, True, is_metric) + assert helper.slc_set_speed_request_id == request.slcSetSpeedRequestId + assert helper.slc_set_speed_gesture_id == request.slcSetSpeedGestureId + + +def test_stock_cruise_sync_is_not_a_driver_increase(): + helper = VCruiseHelper(car.CarParams(pcmCruise=True, openpilotLongitudinalControl=True), + custom.IQCarParams(pcmCruiseSpeed=True)) + helper.set_speed_to_limit = True + helper.update_speed_limit_assist(True, TestSpeedLimitSetSpeedMirror._iq_plan( + 50 * CV.KPH_TO_MS, custom.IQPlan.SpeedLimit.AssistState.active)) + state = car.CarState(cruiseState={"available": True, "speed": 80 * CV.KPH_TO_MS, "speedCluster": 80 * CV.KPH_TO_MS}) + for _ in range(10): + helper.update_v_cruise(state, True, True) + assert helper.slc_set_speed_request_id == 0 + state.cruiseState.speed = state.cruiseState.speedCluster = 90 * CV.KPH_TO_MS + helper.update_v_cruise(state, True, True) + assert helper.slc_set_speed_request_id == 0 + + +def test_held_increase_uses_one_gesture_and_multiple_requests(): + helper = VCruiseHelper(car.CarParams(pcmCruise=False), custom.IQCarParams(pcmCruiseSpeed=True)) + helper.set_speed_to_limit = False + helper.v_cruise_kph = 80.0 + state = car.CarState(cruiseState={"available": True}) + state.buttonEvents = [car.CarState.ButtonEvent(type="accelCruise", pressed=True)] + helper.update_v_cruise(state, True, True) + state.buttonEvents = [] + for _ in range(110): + helper.update_v_cruise(state, True, True) + assert helper.slc_set_speed_gesture_id == 1 + assert helper.slc_set_speed_request_id >= 2 + assert helper.slc_set_speed_request_kph == pytest.approx(helper.v_cruise_kph) + + +def test_set_speed_does_not_follow_limit_when_feature_off(): + # Default off: set speed must stay the driver's value (limiter-only via planner min-blend). + CP = car.CarParams(pcmCruise=True, openpilotLongitudinalControl=True) + CP_IQ = custom.IQCarParams(pcmCruiseSpeed=True) + helper = VCruiseHelper(CP, CP_IQ) + helper.set_speed_to_limit = False + helper.update_speed_limit_assist(False, TestSpeedLimitSetSpeedMirror._iq_plan( + 17.88, custom.IQPlan.SpeedLimit.AssistState.active)) + + CS = car.CarState(cruiseState={"available": True, "speed": 22.35, "speedCluster": 22.35}) + helper.update_v_cruise(CS, enabled=True, is_metric=False) + + # Set speed tracks the car's cruise speed, NOT the 17.88 m/s limit. + assert helper.v_cruise_kph == pytest.approx(22.35 * CV.MS_TO_KPH, abs=0.1) + + +def test_enhanced_stock_longitudinal_control_syncs_once_then_follows_cluster_speed(): + CP = car.CarParams(pcmCruise=True, openpilotLongitudinalControl=True) + resolver = SimpleNamespace(speedLimitFinalLast=17.88) + assist = SimpleNamespace(enabled=True) + iq_plan = SimpleNamespace(speedLimit=SimpleNamespace(resolver=resolver, assist=assist)) + + params, sync_limit, pending_limit = build_iq_control_params_from_plan( + CP, iq_plan, True, current_set_speed_kph=100.0, previous_sync_limit_kph=None, pending_sync_limit_kph=None + ) + assert sync_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + assert pending_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + assert float(params[0]["value"].decode("utf-8")) == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + + params, sync_limit, pending_limit = build_iq_control_params_from_plan( + CP, iq_plan, True, current_set_speed_kph=22.0, previous_sync_limit_kph=sync_limit, pending_sync_limit_kph=pending_limit + ) + assert sync_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + assert pending_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + assert float(params[0]["value"].decode("utf-8")) == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + + params, sync_limit, pending_limit = build_iq_control_params_from_plan( + CP, iq_plan, True, current_set_speed_kph=17.88 * CV.MS_TO_KPH, previous_sync_limit_kph=sync_limit, pending_sync_limit_kph=pending_limit + ) + assert sync_limit == pytest.approx(17.88 * CV.MS_TO_KPH, abs=0.1) + assert pending_limit is None + + params, sync_limit, pending_limit = build_iq_control_params_from_plan( + CP, iq_plan, True, current_set_speed_kph=22.0, previous_sync_limit_kph=sync_limit, pending_sync_limit_kph=pending_limit + ) + assert float(params[0]["value"].decode("utf-8")) == pytest.approx(22.0, abs=0.1) diff --git a/iqpilot/selfdrive/car/tests/test_tesla_fsd_visualization.py b/iqpilot/selfdrive/car/tests/test_tesla_fsd_visualization.py new file mode 100644 index 000000000..57ccebc34 --- /dev/null +++ b/iqpilot/selfdrive/car/tests/test_tesla_fsd_visualization.py @@ -0,0 +1,26 @@ +from iqdbc.car import structs +from iqdbc.lvbs.car.interfaces import apply_iq_car_config +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ, TeslaSafetyFlagsIQ +from iqpilot.selfdrive.car.interfaces import initialize_params + + +class ParamStore: + def get(self, name, return_default=False): + return name == "IQTeslaFsdVisualization" + + +class CarInterface: + def get_longitudinal_tuning_iq(self, CP, CP_IQ): + return None + + +def test_fsd_visualization_is_snapshotted(): + snapshot = initialize_params(ParamStore()) + params = {key: value for item in snapshot for key, value in item.items()} + assert params["IQTeslaFsdVisualization"] is True + + CP = structs.CarParams(brand="tesla") + CP_IQ = structs.IQCarParams() + apply_iq_car_config(CarInterface(), CP, CP_IQ, snapshot) + assert CP_IQ.flags & TeslaFlagsIQ.FSD_VISUALIZATION + assert CP_IQ.iqSafetyFlags & TeslaSafetyFlagsIQ.FSD_VISUALIZATION diff --git a/iqpilot/selfdrive/car/vehicle_catalog.json b/iqpilot/selfdrive/car/vehicle_catalog.json new file mode 100644 index 000000000..b3fdefead --- /dev/null +++ b/iqpilot/selfdrive/car/vehicle_catalog.json @@ -0,0 +1,5341 @@ +{ + "catalog": "iqlvbs/supported-vehicles", + "rev": 1, + "vehicles": { + "ACURA_ILX|2016-2018": { + "label": "Acura ILX 2016-18", + "id": "ACURA_ILX", + "mk": "Acura", + "grp": "honda", + "mdl": "ILX", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "Technology Plus Package or AcuraWatch Plus" + }, + "ACURA_ILX|2019": { + "label": "Acura ILX 2019", + "id": "ACURA_ILX", + "mk": "Acura", + "grp": "honda", + "mdl": "ILX", + "yrs": [ + "2019" + ], + "req": "All" + }, + "ACURA_MDX_4G_MMR|2025-2026": { + "label": "Acura MDX 2025-26", + "id": "ACURA_MDX_4G_MMR", + "mk": "Acura", + "grp": "honda", + "mdl": "MDX", + "yrs": [ + "2025", + "2026" + ], + "req": "All except Type S" + }, + "ACURA_RDX|2016-2018": { + "label": "Acura RDX 2016-18", + "id": "ACURA_RDX", + "mk": "Acura", + "grp": "honda", + "mdl": "RDX", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "AcuraWatch Plus or Advance Package" + }, + "ACURA_RDX_3G|2019-2021": { + "label": "Acura RDX 2019-21", + "id": "ACURA_RDX_3G", + "mk": "Acura", + "grp": "honda", + "mdl": "RDX", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "ACURA_TLX_2G|2021": { + "label": "Acura TLX 2021", + "id": "ACURA_TLX_2G", + "mk": "Acura", + "grp": "honda", + "mdl": "TLX", + "yrs": [ + "2021" + ], + "req": "All" + }, + "ACURA_TLX_2G_MMR|2025": { + "label": "Acura TLX 2025", + "id": "ACURA_TLX_2G_MMR", + "mk": "Acura", + "grp": "honda", + "mdl": "TLX", + "yrs": [ + "2025" + ], + "req": "All" + }, + "AUDI_A3_MK3|2014-2019": { + "label": "Audi A3 2014-19", + "id": "AUDI_A3_MK3", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "A3", + "yrs": [ + "2014", + "2015", + "2016", + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_A3_MK3|2017-2018": { + "label": "Audi A3 Sportback e-tron 2017-18", + "id": "AUDI_A3_MK3", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "A3 Sportback e-tron", + "yrs": [ + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_A4_MK4|2013-2016": { + "label": "Audi A4 2013-16", + "id": "AUDI_A4_MK4", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "A4", + "yrs": [ + "2013", + "2014", + "2015", + "2016" + ], + "req": "Cruise Control" + }, + "AUDI_Q2_MK1|2018": { + "label": "Audi Q2 2018", + "id": "AUDI_Q2_MK1", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q2", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_Q3_MK2|2019-2024": { + "label": "Audi Q3 2019-24", + "id": "AUDI_Q3_MK2", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q3", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_Q4_MK1|2021-2023": { + "label": "Audi Q4 2021-23", + "id": "AUDI_Q4_MK1", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q4", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_Q4_MK2|2024-2025": { + "label": "Audi Q4 2024-25", + "id": "AUDI_Q4_MK2", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q4", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_Q5_MK1|2013-2017": { + "label": "Audi Q5 2013-17", + "id": "AUDI_Q5_MK1", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "Q5", + "yrs": [ + "2013", + "2014", + "2015", + "2016", + "2017" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_A3_MK3|2018": { + "label": "Audi RS3 2018", + "id": "AUDI_A3_MK3", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "RS3", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "AUDI_A3_MK3|2015-2017": { + "label": "Audi S3 2015-17", + "id": "AUDI_A3_MK3", + "mk": "Audi", + "grp": "volkswagen", + "mdl": "S3", + "yrs": [ + "2015", + "2016", + "2017" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "BUICK_LACROSSE|2017-2019": { + "label": "Buick LaCrosse 2017-19", + "id": "BUICK_LACROSSE", + "mk": "Buick", + "grp": "gm", + "mdl": "LaCrosse", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "Driver Confidence Package 2" + }, + "CADILLAC_ESCALADE|2017": { + "label": "Cadillac Escalade 2017", + "id": "CADILLAC_ESCALADE", + "mk": "Cadillac", + "grp": "gm", + "mdl": "Escalade", + "yrs": [ + "2017" + ], + "req": "Driver Assist Package" + }, + "CADILLAC_ESCALADE_ESV|2016": { + "label": "Cadillac Escalade ESV 2016", + "id": "CADILLAC_ESCALADE_ESV", + "mk": "Cadillac", + "grp": "gm", + "mdl": "Escalade ESV", + "yrs": [ + "2016" + ], + "req": "Adaptive Cruise Control (ACC) & LKAS" + }, + "CADILLAC_ESCALADE_ESV_2019|2019": { + "label": "Cadillac Escalade ESV 2019", + "id": "CADILLAC_ESCALADE_ESV_2019", + "mk": "Cadillac", + "grp": "gm", + "mdl": "Escalade ESV", + "yrs": [ + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & LKAS" + }, + "CADILLAC_XT4|2023": { + "label": "Cadillac XT4 2023", + "id": "CADILLAC_XT4", + "mk": "Cadillac", + "grp": "gm", + "mdl": "XT4", + "yrs": [ + "2023" + ], + "req": "Driver Assist Package" + }, + "CHEVROLET_BOLT_EUV|2022-2023": { + "label": "Chevrolet Bolt EUV 2022-23", + "id": "CHEVROLET_BOLT_EUV", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Bolt EUV", + "yrs": [ + "2022", + "2023" + ], + "req": "Premier or Premier Redline Trim, without Super Cruise Package" + }, + "CHEVROLET_BOLT_EUV|2022-2023#2": { + "label": "Chevrolet Bolt EV 2022-23", + "id": "CHEVROLET_BOLT_EUV", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Bolt EV", + "yrs": [ + "2022", + "2023" + ], + "req": "2LT Trim with Adaptive Cruise Control Package" + }, + "CHEVROLET_BOLT_NON_ACC|2017": { + "label": "Chevrolet Bolt EV Non-ACC 2017", + "id": "CHEVROLET_BOLT_NON_ACC", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Bolt EV Non-ACC", + "yrs": [ + "2017" + ], + "req": "No Adaptive Cruise Control (Non-ACC)" + }, + "CHEVROLET_BOLT_NON_ACC_1ST_GEN|2018-2021": { + "label": "Chevrolet Bolt EV Non-ACC 2018-21", + "id": "CHEVROLET_BOLT_NON_ACC_1ST_GEN", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Bolt EV Non-ACC", + "yrs": [ + "2018", + "2019", + "2020", + "2021" + ], + "req": "No Adaptive Cruise Control (Non-ACC)" + }, + "CHEVROLET_EQUINOX|2019-2022": { + "label": "Chevrolet Equinox 2019-22", + "id": "CHEVROLET_EQUINOX", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Equinox", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHEVROLET_MALIBU_NON_ACC_9TH_GEN|2016-2023": { + "label": "Chevrolet Malibu Non-ACC 2016-23", + "id": "CHEVROLET_MALIBU_NON_ACC_9TH_GEN", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Malibu Non-ACC", + "yrs": [ + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "No Adaptive Cruise Control (Non-ACC)" + }, + "CHEVROLET_SILVERADO|2020-2021": { + "label": "Chevrolet Silverado 1500 2020-21", + "id": "CHEVROLET_SILVERADO", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Silverado 1500", + "yrs": [ + "2020", + "2021" + ], + "req": "Safety Package II" + }, + "CHEVROLET_TRAILBLAZER|2021-2022": { + "label": "Chevrolet Trailblazer 2021-22", + "id": "CHEVROLET_TRAILBLAZER", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Trailblazer", + "yrs": [ + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHEVROLET_TRAVERSE|2022-2023": { + "label": "Chevrolet Traverse 2022-23", + "id": "CHEVROLET_TRAVERSE", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Traverse", + "yrs": [ + "2022", + "2023" + ], + "req": "RS, Premier, or High Country Trim" + }, + "CHEVROLET_VOLT|2017-2018": { + "label": "Chevrolet Volt 2017-18", + "id": "CHEVROLET_VOLT", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Volt", + "yrs": [ + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHEVROLET_VOLT_2019|2019": { + "label": "Chevrolet Volt 2019", + "id": "CHEVROLET_VOLT_2019", + "mk": "Chevrolet", + "grp": "gm", + "mdl": "Volt", + "yrs": [ + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & LKAS" + }, + "CHRYSLER_PACIFICA_2018|2017-2018": { + "label": "Chrysler Pacifica 2017-18", + "id": "CHRYSLER_PACIFICA_2018", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica", + "yrs": [ + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHRYSLER_PACIFICA_2020|2019-2020": { + "label": "Chrysler Pacifica 2019-20", + "id": "CHRYSLER_PACIFICA_2020", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica", + "yrs": [ + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHRYSLER_PACIFICA_2020|2021-2023": { + "label": "Chrysler Pacifica 2021-23", + "id": "CHRYSLER_PACIFICA_2020", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "CHRYSLER_PACIFICA_2018_HYBRID|2017-2018": { + "label": "Chrysler Pacifica Hybrid 2017-18", + "id": "CHRYSLER_PACIFICA_2018_HYBRID", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica Hybrid", + "yrs": [ + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHRYSLER_PACIFICA_2019_HYBRID|2019-2025": { + "label": "Chrysler Pacifica Hybrid 2019-25", + "id": "CHRYSLER_PACIFICA_2019_HYBRID", + "mk": "Chrysler", + "grp": "chrysler", + "mdl": "Pacifica Hybrid", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "COMMA_BODY|na": { + "label": "comma body", + "id": "COMMA_BODY", + "mk": "comma", + "grp": "body", + "mdl": "body", + "yrs": [], + "req": "All" + }, + "SEAT_ATECA_MK1|2018-2023": { + "label": "CUPRA Ateca 2018-23", + "id": "SEAT_ATECA_MK1", + "mk": "CUPRA", + "grp": "volkswagen", + "mdl": "Ateca", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "CUPRA_BORN_MK1|2022-2023": { + "label": "CUPRA Born 2022-23", + "id": "CUPRA_BORN_MK1", + "mk": "CUPRA", + "grp": "volkswagen", + "mdl": "Born", + "yrs": [ + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "DODGE_DURANGO|2020-2021": { + "label": "Dodge Durango 2020-21", + "id": "DODGE_DURANGO", + "mk": "Dodge", + "grp": "chrysler", + "mdl": "Durango", + "yrs": [ + "2020", + "2021" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "FORD_BRONCO_SPORT_MK1|2021-2024": { + "label": "Ford Bronco Sport 2021-24", + "id": "FORD_BRONCO_SPORT_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Bronco Sport", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4|2020-2022": { + "label": "Ford Escape 2020-22", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4_5|2023-2024": { + "label": "Ford Escape 2023-24", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4|2020-2022#2": { + "label": "Ford Escape Hybrid 2020-22", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4_5|2023-2024#2": { + "label": "Ford Escape Hybrid 2023-24", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape Hybrid", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4|2020-2022#3": { + "label": "Ford Escape Plug-in Hybrid 2020-22", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape Plug-in Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_ESCAPE_MK4_5|2023-2024#3": { + "label": "Ford Escape Plug-in Hybrid 2023-24", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Escape Plug-in Hybrid", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_EXPEDITION_MK4|2022-2024": { + "label": "Ford Expedition 2022-24", + "id": "FORD_EXPEDITION_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Expedition", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist 2.0" + }, + "FORD_EXPLORER_MK6|2020-2024": { + "label": "Ford Explorer 2020-24", + "id": "FORD_EXPLORER_MK6", + "mk": "Ford", + "grp": "ford", + "mdl": "Explorer", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_EXPLORER_MK6|2020-2024#2": { + "label": "Ford Explorer Hybrid 2020-24", + "id": "FORD_EXPLORER_MK6", + "mk": "Ford", + "grp": "ford", + "mdl": "Explorer Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist+" + }, + "FORD_F_150_MK14|2021-2023": { + "label": "Ford F-150 2021-23", + "id": "FORD_F_150_MK14", + "mk": "Ford", + "grp": "ford", + "mdl": "F-150", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Co-Pilot360 Assist 2.0" + }, + "FORD_F_150_MK14|2021-2023#2": { + "label": "Ford F-150 Hybrid 2021-23", + "id": "FORD_F_150_MK14", + "mk": "Ford", + "grp": "ford", + "mdl": "F-150 Hybrid", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Co-Pilot360 Assist 2.0" + }, + "FORD_F_150_LIGHTNING_MK1|2022-2023": { + "label": "Ford F-150 Lightning 2022-23", + "id": "FORD_F_150_LIGHTNING_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "F-150 Lightning", + "yrs": [ + "2022", + "2023" + ], + "req": "Co-Pilot360 Assist 2.0" + }, + "FORD_FOCUS_MK4|2018": { + "label": "Ford Focus 2018", + "id": "FORD_FOCUS_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Focus", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_FOCUS_MK4|2018#2": { + "label": "Ford Focus Hybrid 2018", + "id": "FORD_FOCUS_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Focus Hybrid", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_ESCAPE_MK4|2020-2023": { + "label": "Ford Kuga 2020-23", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_ESCAPE_MK4|2020-2023#2": { + "label": "Ford Kuga Hybrid 2020-23", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_ESCAPE_MK4_5|2024": { + "label": "Ford Kuga Hybrid 2024", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga Hybrid", + "yrs": [ + "2024" + ], + "req": "All" + }, + "FORD_ESCAPE_MK4|2020-2023#3": { + "label": "Ford Kuga Plug-in Hybrid 2020-23", + "id": "FORD_ESCAPE_MK4", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga Plug-in Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "FORD_ESCAPE_MK4_5|2024#2": { + "label": "Ford Kuga Plug-in Hybrid 2024", + "id": "FORD_ESCAPE_MK4_5", + "mk": "Ford", + "grp": "ford", + "mdl": "Kuga Plug-in Hybrid", + "yrs": [ + "2024" + ], + "req": "All" + }, + "FORD_MAVERICK_MK1|2022": { + "label": "Ford Maverick 2022", + "id": "FORD_MAVERICK_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Maverick", + "yrs": [ + "2022" + ], + "req": "LARIAT Luxury" + }, + "FORD_MAVERICK_MK1|2023-2024": { + "label": "Ford Maverick 2023-24", + "id": "FORD_MAVERICK_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Maverick", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist" + }, + "FORD_MAVERICK_MK1|2022#2": { + "label": "Ford Maverick Hybrid 2022", + "id": "FORD_MAVERICK_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Maverick Hybrid", + "yrs": [ + "2022" + ], + "req": "LARIAT Luxury" + }, + "FORD_MAVERICK_MK1|2023-2024#2": { + "label": "Ford Maverick Hybrid 2023-24", + "id": "FORD_MAVERICK_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Maverick Hybrid", + "yrs": [ + "2023", + "2024" + ], + "req": "Co-Pilot360 Assist" + }, + "FORD_MUSTANG_MACH_E_MK1|2021-2024": { + "label": "Ford Mustang Mach-E 2021-24", + "id": "FORD_MUSTANG_MACH_E_MK1", + "mk": "Ford", + "grp": "ford", + "mdl": "Mustang Mach-E", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "FORD_RANGER_MK2|2024": { + "label": "Ford Ranger 2024", + "id": "FORD_RANGER_MK2", + "mk": "Ford", + "grp": "ford", + "mdl": "Ranger", + "yrs": [ + "2024" + ], + "req": "Adaptive Cruise Control with Lane Centering" + }, + "GENESIS_EQ900|2017": { + "label": "Genesis EQ900 2017", + "id": "GENESIS_EQ900", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "EQ900", + "yrs": [ + "2017" + ], + "req": "All" + }, + "GENESIS_EQ900_L|2016-2018": { + "label": "Genesis EQ900 Limousine 2016-18", + "id": "GENESIS_EQ900_L", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "EQ900 Limousine", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "All" + }, + "GENESIS_G70|2018": { + "label": "Genesis G70 2018", + "id": "GENESIS_G70", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G70", + "yrs": [ + "2018" + ], + "req": "All" + }, + "GENESIS_G70_2020|2019-2021": { + "label": "Genesis G70 2019-21", + "id": "GENESIS_G70_2020", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G70", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "GENESIS_G70_2020|2022-2023": { + "label": "Genesis G70 2022-23", + "id": "GENESIS_G70_2020", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G70", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_GENESIS|2017": { + "label": "Genesis G80 2017", + "id": "HYUNDAI_GENESIS", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G80", + "yrs": [ + "2017" + ], + "req": "All" + }, + "GENESIS_G80|2018-2019": { + "label": "Genesis G80 2018-19", + "id": "GENESIS_G80", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G80", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "GENESIS_G80_2ND_GEN_FL|2024": { + "label": "Genesis G80 (2.5T Advanced Trim, with HDA II) 2024", + "id": "GENESIS_G80_2ND_GEN_FL", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G80 (2.5T Advanced Trim, with HDA II)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "GENESIS_G90|2017-2020": { + "label": "Genesis G90 2017-20", + "id": "GENESIS_G90", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G90", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "GENESIS_G90_2019|2019": { + "label": "Genesis G90 (South Korea only) 2019", + "id": "GENESIS_G90_2019", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "G90 (South Korea only)", + "yrs": [ + "2019" + ], + "req": "All" + }, + "GENESIS_GV60_EV_1ST_GEN|2023": { + "label": "Genesis GV60 (Advanced Trim) 2023", + "id": "GENESIS_GV60_EV_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV60 (Advanced Trim)", + "yrs": [ + "2023" + ], + "req": "All" + }, + "GENESIS_GV60_EV_1ST_GEN|2022-2023": { + "label": "Genesis GV60 (Performance Trim) 2022-23", + "id": "GENESIS_GV60_EV_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV60 (Performance Trim)", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "GENESIS_GV70_1ST_GEN|2022-2024": { + "label": "Genesis GV70 (2.5T Trim, without HDA II) 2022-24", + "id": "GENESIS_GV70_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 (2.5T Trim, without HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "GENESIS_GV70_1ST_GEN|2022-2023": { + "label": "Genesis GV70 (3.5T Trim, without HDA II) 2022-23", + "id": "GENESIS_GV70_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 (3.5T Trim, without HDA II)", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "GENESIS_GV70_ELECTRIFIED_1ST_GEN|2022": { + "label": "Genesis GV70 Electrified (Australia Only) 2022", + "id": "GENESIS_GV70_ELECTRIFIED_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 Electrified (Australia Only)", + "yrs": [ + "2022" + ], + "req": "All" + }, + "GENESIS_GV70_EV_1ST_GEN|2022-2023": { + "label": "Genesis GV70 Electrified (South Korea only) 2022-23", + "id": "GENESIS_GV70_EV_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 Electrified (South Korea only)", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "GENESIS_GV70_ELECTRIFIED_1ST_GEN|2023-2024": { + "label": "Genesis GV70 Electrified (with HDA II) 2023-24", + "id": "GENESIS_GV70_ELECTRIFIED_1ST_GEN", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV70 Electrified (with HDA II)", + "yrs": [ + "2023", + "2024" + ], + "req": "Highway Driving Assist II" + }, + "GENESIS_GV80|2023": { + "label": "Genesis GV80 2023", + "id": "GENESIS_GV80", + "mk": "Genesis", + "grp": "hyundai", + "mdl": "GV80", + "yrs": [ + "2023" + ], + "req": "All" + }, + "GMC_ACADIA|2018": { + "label": "GMC Acadia 2018", + "id": "GMC_ACADIA", + "mk": "GMC", + "grp": "gm", + "mdl": "Acadia", + "yrs": [ + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "CHEVROLET_SILVERADO|2020-2021#2": { + "label": "GMC Sierra 1500 2020-21", + "id": "CHEVROLET_SILVERADO", + "mk": "GMC", + "grp": "gm", + "mdl": "Sierra 1500", + "yrs": [ + "2020", + "2021" + ], + "req": "Driver Alert Package II" + }, + "HONDA_ACCORD|2018-2022": { + "label": "Honda Accord 2018-22", + "id": "HONDA_ACCORD", + "mk": "Honda", + "grp": "honda", + "mdl": "Accord", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HONDA_ACCORD_11G|2023-2025": { + "label": "Honda Accord 2023-25", + "id": "HONDA_ACCORD_11G", + "mk": "Honda", + "grp": "honda", + "mdl": "Accord", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_ACCORD|2018-2022#2": { + "label": "Honda Accord Hybrid 2018-22", + "id": "HONDA_ACCORD", + "mk": "Honda", + "grp": "honda", + "mdl": "Accord Hybrid", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HONDA_ACCORD_11G|2023-2025#2": { + "label": "Honda Accord Hybrid 2023-25", + "id": "HONDA_ACCORD_11G", + "mk": "Honda", + "grp": "honda", + "mdl": "Accord Hybrid", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_CITY_7G|2023": { + "label": "Honda City (Brazil only) 2023", + "id": "HONDA_CITY_7G", + "mk": "Honda", + "grp": "honda", + "mdl": "City (Brazil only)", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HONDA_CIVIC|2016-2018": { + "label": "Honda Civic 2016-18", + "id": "HONDA_CIVIC", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "Honda Sensing" + }, + "HONDA_CIVIC_BOSCH|2019-2021": { + "label": "Honda Civic 2019-21", + "id": "HONDA_CIVIC_BOSCH", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2022-2024": { + "label": "Honda Civic 2022-24", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "HONDA_CIVIC_BOSCH|2017-2018": { + "label": "Honda Civic Hatchback 2017-18", + "id": "HONDA_CIVIC_BOSCH", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback", + "yrs": [ + "2017", + "2018" + ], + "req": "Honda Sensing" + }, + "HONDA_CIVIC_BOSCH|2019-2021#2": { + "label": "Honda Civic Hatchback 2019-21", + "id": "HONDA_CIVIC_BOSCH", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2022-2024#2": { + "label": "Honda Civic Hatchback 2022-24", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2025-2026": { + "label": "Honda Civic Hatchback Hybrid 2025-26", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback Hybrid", + "yrs": [ + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2023": { + "label": "Honda Civic Hatchback Hybrid (Europe only) 2023", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hatchback Hybrid (Europe only)", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HONDA_CIVIC_2022|2025-2026#2": { + "label": "Honda Civic Hybrid 2025-26", + "id": "HONDA_CIVIC_2022", + "mk": "Honda", + "grp": "honda", + "mdl": "Civic Hybrid", + "yrs": [ + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_CLARITY|2018-2021": { + "label": "Honda Clarity 2018-21", + "id": "HONDA_CLARITY", + "mk": "Honda", + "grp": "honda", + "mdl": "Clarity", + "yrs": [ + "2018", + "2019", + "2020", + "2021" + ], + "req": "Honda Sensing" + }, + "HONDA_CRV|2015-2016": { + "label": "Honda CR-V 2015-16", + "id": "HONDA_CRV", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V", + "yrs": [ + "2015", + "2016" + ], + "req": "Touring Trim" + }, + "HONDA_CRV_5G|2017-2022": { + "label": "Honda CR-V 2017-22", + "id": "HONDA_CRV_5G", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Honda Sensing" + }, + "HONDA_CRV_6G|2023-2026": { + "label": "Honda CR-V 2023-26", + "id": "HONDA_CRV_6G", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V", + "yrs": [ + "2023", + "2024", + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_CRV_HYBRID|2017-2022": { + "label": "Honda CR-V Hybrid 2017-22", + "id": "HONDA_CRV_HYBRID", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V Hybrid", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Honda Sensing" + }, + "HONDA_CRV_6G|2023-2026#2": { + "label": "Honda CR-V Hybrid 2023-26", + "id": "HONDA_CRV_6G", + "mk": "Honda", + "grp": "honda", + "mdl": "CR-V Hybrid", + "yrs": [ + "2023", + "2024", + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_E|2020": { + "label": "Honda e 2020", + "id": "HONDA_E", + "mk": "Honda", + "grp": "honda", + "mdl": "e", + "yrs": [ + "2020" + ], + "req": "All" + }, + "HONDA_FIT|2018-2020": { + "label": "Honda Fit 2018-20", + "id": "HONDA_FIT", + "mk": "Honda", + "grp": "honda", + "mdl": "Fit", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "Honda Sensing" + }, + "HONDA_FREED|2020": { + "label": "Honda Freed 2020", + "id": "HONDA_FREED", + "mk": "Honda", + "grp": "honda", + "mdl": "Freed", + "yrs": [ + "2020" + ], + "req": "Honda Sensing" + }, + "HONDA_HRV|2019-2022": { + "label": "Honda HR-V 2019-22", + "id": "HONDA_HRV", + "mk": "Honda", + "grp": "honda", + "mdl": "HR-V", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "Honda Sensing" + }, + "HONDA_HRV_3G|2023-2025": { + "label": "Honda HR-V 2023-25", + "id": "HONDA_HRV_3G", + "mk": "Honda", + "grp": "honda", + "mdl": "HR-V", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_INSIGHT|2019-2022": { + "label": "Honda Insight 2019-22", + "id": "HONDA_INSIGHT", + "mk": "Honda", + "grp": "honda", + "mdl": "Insight", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HONDA_ACCORD|2018": { + "label": "Honda Inspire 2018", + "id": "HONDA_ACCORD", + "mk": "Honda", + "grp": "honda", + "mdl": "Inspire", + "yrs": [ + "2018" + ], + "req": "All" + }, + "HONDA_NBOX_2G|2018": { + "label": "Honda N-Box 2018", + "id": "HONDA_NBOX_2G", + "mk": "Honda", + "grp": "honda", + "mdl": "N-Box", + "yrs": [ + "2018" + ], + "req": "All" + }, + "HONDA_ODYSSEY|2018-2020": { + "label": "Honda Odyssey 2018-20", + "id": "HONDA_ODYSSEY", + "mk": "Honda", + "grp": "honda", + "mdl": "Odyssey", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "Honda Sensing" + }, + "HONDA_ODYSSEY_5G_MMR|2021-2026": { + "label": "Honda Odyssey 2021-26", + "id": "HONDA_ODYSSEY_5G_MMR", + "mk": "Honda", + "grp": "honda", + "mdl": "Odyssey", + "yrs": [ + "2021", + "2022", + "2023", + "2024", + "2025", + "2026" + ], + "req": "All" + }, + "HONDA_ODYSSEY_TWN|2018-2019": { + "label": "Honda Odyssey (Taiwan) 2018-19", + "id": "HONDA_ODYSSEY_TWN", + "mk": "Honda", + "grp": "honda", + "mdl": "Odyssey (Taiwan)", + "yrs": [ + "2018", + "2019" + ], + "req": "Honda Sensing" + }, + "HONDA_PILOT|2019-2025": { + "label": "Honda Passport 2019-25", + "id": "HONDA_PILOT", + "mk": "Honda", + "grp": "honda", + "mdl": "Passport", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_PASSPORT_4G|2026": { + "label": "Honda Passport 2026", + "id": "HONDA_PASSPORT_4G", + "mk": "Honda", + "grp": "honda", + "mdl": "Passport", + "yrs": [ + "2026" + ], + "req": "All" + }, + "HONDA_PILOT|2016-2022": { + "label": "Honda Pilot 2016-22", + "id": "HONDA_PILOT", + "mk": "Honda", + "grp": "honda", + "mdl": "Pilot", + "yrs": [ + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Honda Sensing" + }, + "HONDA_PILOT_4G|2023-2025": { + "label": "Honda Pilot 2023-25", + "id": "HONDA_PILOT_4G", + "mk": "Honda", + "grp": "honda", + "mdl": "Pilot", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "HONDA_RIDGELINE|2017-2025": { + "label": "Honda Ridgeline 2017-25", + "id": "HONDA_RIDGELINE", + "mk": "Honda", + "grp": "honda", + "mdl": "Ridgeline", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "Honda Sensing" + }, + "HYUNDAI_AZERA_6TH_GEN|2022": { + "label": "Hyundai Azera 2022", + "id": "HYUNDAI_AZERA_6TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Azera", + "yrs": [ + "2022" + ], + "req": "All" + }, + "HYUNDAI_AZERA_7TH_GEN|2023-2024": { + "label": "Hyundai Azera 2023-24", + "id": "HYUNDAI_AZERA_7TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Azera", + "yrs": [ + "2023", + "2024" + ], + "req": "All" + }, + "HYUNDAI_AZERA_HEV_6TH_GEN|2019": { + "label": "Hyundai Azera Hybrid 2019", + "id": "HYUNDAI_AZERA_HEV_6TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Azera Hybrid", + "yrs": [ + "2019" + ], + "req": "All" + }, + "HYUNDAI_AZERA_HEV_6TH_GEN|2020": { + "label": "Hyundai Azera Hybrid 2020", + "id": "HYUNDAI_AZERA_HEV_6TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Azera Hybrid", + "yrs": [ + "2020" + ], + "req": "All" + }, + "HYUNDAI_CASPER|2023": { + "label": "Hyundai Casper 2023", + "id": "HYUNDAI_CASPER", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Casper", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HYUNDAI_CASPER_EV|2024": { + "label": "Hyundai Casper Electric 2024", + "id": "HYUNDAI_CASPER_EV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Casper Electric", + "yrs": [ + "2024" + ], + "req": "All" + }, + "HYUNDAI_CUSTIN_1ST_GEN|2023": { + "label": "Hyundai Custin 2023", + "id": "HYUNDAI_CUSTIN_1ST_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Custin", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HYUNDAI_ELANTRA|2017-2018": { + "label": "Hyundai Elantra 2017-18", + "id": "HYUNDAI_ELANTRA", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra", + "yrs": [ + "2017", + "2018" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_ELANTRA|2019": { + "label": "Hyundai Elantra 2019", + "id": "HYUNDAI_ELANTRA", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_ELANTRA_2021|2021-2023": { + "label": "Hyundai Elantra 2021-23", + "id": "HYUNDAI_ELANTRA_2021", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_ELANTRA_GT_I30|2017-2020": { + "label": "Hyundai Elantra GT 2017-20", + "id": "HYUNDAI_ELANTRA_GT_I30", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra GT", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_ELANTRA_HEV_2021|2021-2023": { + "label": "Hyundai Elantra Hybrid 2021-23", + "id": "HYUNDAI_ELANTRA_HEV_2021", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Elantra Hybrid", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_GENESIS|2015-2016": { + "label": "Hyundai Genesis 2015-16", + "id": "HYUNDAI_GENESIS", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Genesis", + "yrs": [ + "2015", + "2016" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_GRANDEUR_IG|2018-2019": { + "label": "Hyundai Grandeur 2018-19", + "id": "HYUNDAI_GRANDEUR_IG", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Grandeur", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "HYUNDAI_GRANDEUR_IG_HEV|2018-2019": { + "label": "Hyundai Grandeur Hybrid 2018-19", + "id": "HYUNDAI_GRANDEUR_IG_HEV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Grandeur Hybrid", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "HYUNDAI_ELANTRA_GT_I30|2017-2019": { + "label": "Hyundai i30 2017-19", + "id": "HYUNDAI_ELANTRA_GT_I30", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "i30", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_5|2022-2024": { + "label": "Hyundai Ioniq 5 (Southeast Asia and Europe only) 2022-24", + "id": "HYUNDAI_IONIQ_5", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 (Southeast Asia and Europe only)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "HYUNDAI_IONIQ_5|2022-2024#2": { + "label": "Hyundai Ioniq 5 (with HDA II) 2022-24", + "id": "HYUNDAI_IONIQ_5", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 (with HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Highway Driving Assist II" + }, + "HYUNDAI_IONIQ_5|2022-2024#3": { + "label": "Hyundai Ioniq 5 (without HDA II) 2022-24", + "id": "HYUNDAI_IONIQ_5", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 (without HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Highway Driving Assist" + }, + "HYUNDAI_IONIQ_5_N|2024": { + "label": "Hyundai Ioniq 5 N (with HDA II) 2024", + "id": "HYUNDAI_IONIQ_5_N", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 N (with HDA II)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "HYUNDAI_IONIQ_5_PE|2024": { + "label": "Hyundai Ioniq 5 PE (with HDA II) 2024", + "id": "HYUNDAI_IONIQ_5_PE", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 PE (with HDA II)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "HYUNDAI_IONIQ_5_PE|2024#2": { + "label": "Hyundai Ioniq 5 PE (without HDA II) 2024", + "id": "HYUNDAI_IONIQ_5_PE", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 5 PE (without HDA II)", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_6|2023-2024": { + "label": "Hyundai Ioniq 6 (with HDA II) 2023-24", + "id": "HYUNDAI_IONIQ_6", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 6 (with HDA II)", + "yrs": [ + "2023", + "2024" + ], + "req": "Highway Driving Assist II" + }, + "HYUNDAI_IONIQ_9|2026": { + "label": "Hyundai Ioniq 9 2026", + "id": "HYUNDAI_IONIQ_9", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq 9", + "yrs": [ + "2026" + ], + "req": "All" + }, + "HYUNDAI_IONIQ_EV_LTD|2019": { + "label": "Hyundai Ioniq Electric 2019", + "id": "HYUNDAI_IONIQ_EV_LTD", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Electric", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_EV_2020|2020": { + "label": "Hyundai Ioniq Electric 2020", + "id": "HYUNDAI_IONIQ_EV_2020", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Electric", + "yrs": [ + "2020" + ], + "req": "All" + }, + "HYUNDAI_IONIQ|2017-2019": { + "label": "Hyundai Ioniq Hybrid 2017-19", + "id": "HYUNDAI_IONIQ", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Hybrid", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_HEV_2022|2020-2022": { + "label": "Hyundai Ioniq Hybrid 2020-22", + "id": "HYUNDAI_IONIQ_HEV_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_PHEV_2019|2019": { + "label": "Hyundai Ioniq Plug-in Hybrid 2019", + "id": "HYUNDAI_IONIQ_PHEV_2019", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Plug-in Hybrid", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_IONIQ_PHEV|2020-2022": { + "label": "Hyundai Ioniq Plug-in Hybrid 2020-22", + "id": "HYUNDAI_IONIQ_PHEV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Ioniq Plug-in Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HYUNDAI_KONA|2020": { + "label": "Hyundai Kona 2020", + "id": "HYUNDAI_KONA", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona", + "yrs": [ + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_2022|2022": { + "label": "Hyundai Kona 2022", + "id": "HYUNDAI_KONA_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona", + "yrs": [ + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_EV|2018-2021": { + "label": "Hyundai Kona Electric 2018-21", + "id": "HYUNDAI_KONA_EV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Electric", + "yrs": [ + "2018", + "2019", + "2020", + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_EV_2022|2022-2023": { + "label": "Hyundai Kona Electric 2022-23", + "id": "HYUNDAI_KONA_EV_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Electric", + "yrs": [ + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_EV_2ND_GEN|2023": { + "label": "Hyundai Kona Electric (with HDA II, Korea only) 2023", + "id": "HYUNDAI_KONA_EV_2ND_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Electric (with HDA II, Korea only)", + "yrs": [ + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_HEV|2020": { + "label": "Hyundai Kona Hybrid 2020", + "id": "HYUNDAI_KONA_HEV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Hybrid", + "yrs": [ + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_KONA_HEV_2ND_GEN|2024": { + "label": "Hyundai Kona Hybrid 2024", + "id": "HYUNDAI_KONA_HEV_2ND_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Kona Hybrid", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_NEXO_1ST_GEN|2021": { + "label": "Hyundai Nexo 2021", + "id": "HYUNDAI_NEXO_1ST_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Nexo", + "yrs": [ + "2021" + ], + "req": "All" + }, + "HYUNDAI_NEXO|2018-2020": { + "label": "Hyundai Nexo (South Korea only) 2018-20", + "id": "HYUNDAI_NEXO", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Nexo (South Korea only)", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "HYUNDAI_PALISADE|2020-2022": { + "label": "Hyundai Palisade 2020-22", + "id": "HYUNDAI_PALISADE", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Palisade", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "HYUNDAI_PORTER_II_EV|2024": { + "label": "Hyundai Porter II Electric 2024", + "id": "HYUNDAI_PORTER_II_EV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Porter II Electric", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SANTA_CRUZ_1ST_GEN|2022-2024": { + "label": "Hyundai Santa Cruz 2022-24", + "id": "HYUNDAI_SANTA_CRUZ_1ST_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Cruz", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SANTA_FE|2019-2020": { + "label": "Hyundai Santa Fe 2019-20", + "id": "HYUNDAI_SANTA_FE", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe", + "yrs": [ + "2019", + "2020" + ], + "req": "All" + }, + "HYUNDAI_SANTA_FE_2022|2021-2023": { + "label": "Hyundai Santa Fe 2021-23", + "id": "HYUNDAI_SANTA_FE_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_SANTAFE_MX5|2024": { + "label": "Hyundai Santa Fe (MX5) 2024", + "id": "HYUNDAI_SANTAFE_MX5", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe (MX5)", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SANTA_FE_HEV_2022|2022-2023": { + "label": "Hyundai Santa Fe Hybrid 2022-23", + "id": "HYUNDAI_SANTA_FE_HEV_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe Hybrid", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_SANTAFE_MX5_HEV|2024": { + "label": "Hyundai Santa Fe Hybrid (MX5) 2024", + "id": "HYUNDAI_SANTAFE_MX5_HEV", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe Hybrid (MX5)", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SANTA_FE_PHEV_2022|2022-2023": { + "label": "Hyundai Santa Fe Plug-in Hybrid 2022-23", + "id": "HYUNDAI_SANTA_FE_PHEV_2022", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Santa Fe Plug-in Hybrid", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_SONATA_LF|2018-2019": { + "label": "Hyundai Sonata 2018-19", + "id": "HYUNDAI_SONATA_LF", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Sonata", + "yrs": [ + "2018", + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_SONATA|2020-2023": { + "label": "Hyundai Sonata 2020-23", + "id": "HYUNDAI_SONATA", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Sonata", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_SONATA_2024|2024-2025": { + "label": "Hyundai Sonata 2024-25", + "id": "HYUNDAI_SONATA_2024", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Sonata", + "yrs": [ + "2024", + "2025" + ], + "req": "All" + }, + "HYUNDAI_SONATA_HYBRID|2020-2023": { + "label": "Hyundai Sonata Hybrid 2020-23", + "id": "HYUNDAI_SONATA_HYBRID", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Sonata Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_STARIA_4TH_GEN|2023": { + "label": "Hyundai Staria 2023", + "id": "HYUNDAI_STARIA_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Staria", + "yrs": [ + "2023" + ], + "req": "All" + }, + "HYUNDAI_TUCSON|2021": { + "label": "Hyundai Tucson 2021", + "id": "HYUNDAI_TUCSON", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson", + "yrs": [ + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_TUCSON_4TH_GEN|2022": { + "label": "Hyundai Tucson 2022", + "id": "HYUNDAI_TUCSON_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson", + "yrs": [ + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_TUCSON_4TH_GEN|2023-2024": { + "label": "Hyundai Tucson 2023-24", + "id": "HYUNDAI_TUCSON_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson", + "yrs": [ + "2023", + "2024" + ], + "req": "All" + }, + "HYUNDAI_TUCSON|2019": { + "label": "Hyundai Tucson Diesel 2019", + "id": "HYUNDAI_TUCSON", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson Diesel", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "HYUNDAI_TUCSON_4TH_GEN|2022-2024": { + "label": "Hyundai Tucson Hybrid 2022-24", + "id": "HYUNDAI_TUCSON_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson Hybrid", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "HYUNDAI_TUCSON_4TH_GEN|2024": { + "label": "Hyundai Tucson Plug-in Hybrid 2024", + "id": "HYUNDAI_TUCSON_4TH_GEN", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Tucson Plug-in Hybrid", + "yrs": [ + "2024" + ], + "req": "All" + }, + "HYUNDAI_VELOSTER|2019-2020": { + "label": "Hyundai Veloster 2019-20", + "id": "HYUNDAI_VELOSTER", + "mk": "Hyundai", + "grp": "hyundai", + "mdl": "Veloster", + "yrs": [ + "2019", + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "JEEP_GRAND_CHEROKEE|2016-2018": { + "label": "Jeep Grand Cherokee 2016-18", + "id": "JEEP_GRAND_CHEROKEE", + "mk": "Jeep", + "grp": "chrysler", + "mdl": "Grand Cherokee", + "yrs": [ + "2016", + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "JEEP_GRAND_CHEROKEE_2019|2019-2021": { + "label": "Jeep Grand Cherokee 2019-21", + "id": "JEEP_GRAND_CHEROKEE_2019", + "mk": "Jeep", + "grp": "chrysler", + "mdl": "Grand Cherokee", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "KIA_CARNIVAL_4TH_GEN|2022-2024": { + "label": "Kia Carnival 2022-24", + "id": "KIA_CARNIVAL_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Carnival", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_CARNIVAL_4TH_GEN|2023": { + "label": "Kia Carnival (China only) 2023", + "id": "KIA_CARNIVAL_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Carnival (China only)", + "yrs": [ + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_CEED|2019-2021": { + "label": "Kia Ceed 2019-21", + "id": "KIA_CEED", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Ceed", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_EV3|2025": { + "label": "Kia EV3 (SV1) 2025", + "id": "KIA_EV3", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV3 (SV1)", + "yrs": [ + "2025" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_EV4|2025": { + "label": "Kia EV4 2025", + "id": "KIA_EV4", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV4", + "yrs": [ + "2025" + ], + "req": "All" + }, + "KIA_EV6|2022-2024": { + "label": "Kia EV6 (Southeast Asia only) 2022-24", + "id": "KIA_EV6", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 (Southeast Asia only)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "KIA_EV6|2022-2024#2": { + "label": "Kia EV6 (with HDA II) 2022-24", + "id": "KIA_EV6", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 (with HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Highway Driving Assist II" + }, + "KIA_EV6|2022-2024#3": { + "label": "Kia EV6 (without HDA II) 2022-24", + "id": "KIA_EV6", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 (without HDA II)", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Highway Driving Assist" + }, + "KIA_EV6_PE|2025": { + "label": "Kia EV6 PE (with HDA II) 2025", + "id": "KIA_EV6_PE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 PE (with HDA II)", + "yrs": [ + "2025" + ], + "req": "Highway Driving Assist II" + }, + "KIA_EV6_PE|2025#2": { + "label": "Kia EV6 PE (without HDA II) 2025", + "id": "KIA_EV6_PE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV6 PE (without HDA II)", + "yrs": [ + "2025" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_EV9|2024": { + "label": "Kia EV9 (MV) 2024", + "id": "KIA_EV9", + "mk": "Kia", + "grp": "hyundai", + "mdl": "EV9 (MV)", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_FORTE|2019-2021": { + "label": "Kia Forte 2019-21", + "id": "KIA_FORTE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Forte", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_FORTE|2022-2023": { + "label": "Kia Forte 2022-23", + "id": "KIA_FORTE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Forte", + "yrs": [ + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_K5|2016-2019": { + "label": "Kia K5 2016, 2019", + "id": "KIA_K5", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5", + "yrs": [ + "2016", + "2019" + ], + "req": "All" + }, + "KIA_K5_2021|2021-2024": { + "label": "Kia K5 2021-24", + "id": "KIA_K5_2021", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_K5_DL3_24|2024": { + "label": "Kia K5 (South Korea only) 2024", + "id": "KIA_K5_DL3_24", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 (South Korea only)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "KIA_K5_HEV|2017": { + "label": "Kia K5 Hybrid 2017", + "id": "KIA_K5_HEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 Hybrid", + "yrs": [ + "2017" + ], + "req": "All" + }, + "KIA_K5_HEV_2020|2020-2022": { + "label": "Kia K5 Hybrid 2020-22", + "id": "KIA_K5_HEV_2020", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_K5_HEV_2022|2022": { + "label": "Kia K5 Hybrid (South Korea only) 2022", + "id": "KIA_K5_HEV_2022", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 Hybrid (South Korea only)", + "yrs": [ + "2022" + ], + "req": "All" + }, + "KIA_K5_DL3_24_HEV|2024": { + "label": "Kia K5 Hybrid (South Korea only) 2024", + "id": "KIA_K5_DL3_24_HEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K5 Hybrid (South Korea only)", + "yrs": [ + "2024" + ], + "req": "Highway Driving Assist II" + }, + "KIA_K7|2016-2019": { + "label": "Kia K7 2016-19", + "id": "KIA_K7", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K7", + "yrs": [ + "2016", + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "KIA_K7_PE|2020": { + "label": "Kia K7 2020", + "id": "KIA_K7_PE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K7", + "yrs": [ + "2020" + ], + "req": "All" + }, + "KIA_K7_HEV|2016-2019": { + "label": "Kia K7 Hybrid 2016-19", + "id": "KIA_K7_HEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K7 Hybrid", + "yrs": [ + "2016", + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "KIA_K7_HEV_PE|2020": { + "label": "Kia K7 Hybrid 2020", + "id": "KIA_K7_HEV_PE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K7 Hybrid", + "yrs": [ + "2020" + ], + "req": "All" + }, + "KIA_K8_HEV_1ST_GEN|2023": { + "label": "Kia K8 Hybrid (with HDA II) 2023", + "id": "KIA_K8_HEV_1ST_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K8 Hybrid (with HDA II)", + "yrs": [ + "2023" + ], + "req": "Highway Driving Assist II" + }, + "KIA_K9|2016-2019": { + "label": "Kia K9 2016-19", + "id": "KIA_K9", + "mk": "Kia", + "grp": "hyundai", + "mdl": "K9", + "yrs": [ + "2016", + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "KIA_MOHAVE|2019": { + "label": "Kia Mohave 2019", + "id": "KIA_MOHAVE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Mohave", + "yrs": [ + "2019" + ], + "req": "All" + }, + "KIA_NIRO_EV|2019": { + "label": "Kia Niro EV 2019", + "id": "KIA_NIRO_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2019" + ], + "req": "All" + }, + "KIA_NIRO_EV|2020": { + "label": "Kia Niro EV 2020", + "id": "KIA_NIRO_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2020" + ], + "req": "All" + }, + "KIA_NIRO_EV|2021": { + "label": "Kia Niro EV 2021", + "id": "KIA_NIRO_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2021" + ], + "req": "All" + }, + "KIA_NIRO_EV|2022": { + "label": "Kia Niro EV 2022", + "id": "KIA_NIRO_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2022" + ], + "req": "All" + }, + "KIA_NIRO_EV_2ND_GEN|2023": { + "label": "Kia Niro EV 2023", + "id": "KIA_NIRO_EV_2ND_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro EV", + "yrs": [ + "2023" + ], + "req": "All" + }, + "KIA_NIRO_PHEV|2018": { + "label": "Kia Niro Hybrid 2018", + "id": "KIA_NIRO_PHEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Hybrid", + "yrs": [ + "2018" + ], + "req": "All" + }, + "KIA_NIRO_HEV_2021|2021": { + "label": "Kia Niro Hybrid 2021", + "id": "KIA_NIRO_HEV_2021", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Hybrid", + "yrs": [ + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_HEV_2021|2022": { + "label": "Kia Niro Hybrid 2022", + "id": "KIA_NIRO_HEV_2021", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Hybrid", + "yrs": [ + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_HEV_2ND_GEN|2023": { + "label": "Kia Niro Hybrid 2023", + "id": "KIA_NIRO_HEV_2ND_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Hybrid", + "yrs": [ + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_PHEV|2018-2019": { + "label": "Kia Niro Plug-in Hybrid 2018-19", + "id": "KIA_NIRO_PHEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Plug-in Hybrid", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "KIA_NIRO_PHEV|2020": { + "label": "Kia Niro Plug-in Hybrid 2020", + "id": "KIA_NIRO_PHEV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Plug-in Hybrid", + "yrs": [ + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_PHEV_2022|2021": { + "label": "Kia Niro Plug-in Hybrid 2021", + "id": "KIA_NIRO_PHEV_2022", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Plug-in Hybrid", + "yrs": [ + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_NIRO_PHEV_2022|2022": { + "label": "Kia Niro Plug-in Hybrid 2022", + "id": "KIA_NIRO_PHEV_2022", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Niro Plug-in Hybrid", + "yrs": [ + "2022" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_OPTIMA_G4|2017": { + "label": "Kia Optima 2017", + "id": "KIA_OPTIMA_G4", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Optima", + "yrs": [ + "2017" + ], + "req": "Advanced Smart Cruise Control" + }, + "KIA_OPTIMA_G4_FL|2019-2020": { + "label": "Kia Optima 2019-20", + "id": "KIA_OPTIMA_G4_FL", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Optima", + "yrs": [ + "2019", + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_OPTIMA_H|2017": { + "label": "Kia Optima Hybrid 2017", + "id": "KIA_OPTIMA_H", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Optima Hybrid", + "yrs": [ + "2017" + ], + "req": "Advanced Smart Cruise Control" + }, + "KIA_OPTIMA_H_G4_FL|2019": { + "label": "Kia Optima Hybrid 2019", + "id": "KIA_OPTIMA_H_G4_FL", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Optima Hybrid", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_PV5|2025": { + "label": "Kia PV5 (SW1) 2025", + "id": "KIA_PV5", + "mk": "Kia", + "grp": "hyundai", + "mdl": "PV5 (SW1)", + "yrs": [ + "2025" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_RAY_EV|2024": { + "label": "Kia Ray EV 2024", + "id": "KIA_RAY_EV", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Ray EV", + "yrs": [ + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SELTOS|2021": { + "label": "Kia Seltos 2021", + "id": "KIA_SELTOS", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Seltos", + "yrs": [ + "2021" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SORENTO|2018": { + "label": "Kia Sorento 2018", + "id": "KIA_SORENTO", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento", + "yrs": [ + "2018" + ], + "req": "Advanced Smart Cruise Control & LKAS" + }, + "KIA_SORENTO|2019": { + "label": "Kia Sorento 2019", + "id": "KIA_SORENTO", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SORENTO_4TH_GEN|2021-2023": { + "label": "Kia Sorento 2021-23", + "id": "KIA_SORENTO_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SORENTO_HEV_4TH_GEN|2021-2023": { + "label": "Kia Sorento Hybrid 2021-23", + "id": "KIA_SORENTO_HEV_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento Hybrid", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "KIA_SORENTO_HEV_4TH_GEN|2022-2023": { + "label": "Kia Sorento Plug-in Hybrid 2022-23", + "id": "KIA_SORENTO_HEV_4TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sorento Plug-in Hybrid", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "KIA_EV_SK3|2019": { + "label": "Kia Soul EV 2019", + "id": "KIA_EV_SK3", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Soul EV", + "yrs": [ + "2019" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SPORTAGE_5TH_GEN|2023-2024": { + "label": "Kia Sportage 2023-24", + "id": "KIA_SPORTAGE_5TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sportage", + "yrs": [ + "2023", + "2024" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_SPORTAGE_5TH_GEN|2023": { + "label": "Kia Sportage Hybrid 2023", + "id": "KIA_SPORTAGE_5TH_GEN", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Sportage Hybrid", + "yrs": [ + "2023" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_STINGER|2018-2020": { + "label": "Kia Stinger 2018-20", + "id": "KIA_STINGER", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Stinger", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "Smart Cruise Control (SCC)" + }, + "KIA_STINGER_2022|2022-2023": { + "label": "Kia Stinger 2022-23", + "id": "KIA_STINGER_2022", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Stinger", + "yrs": [ + "2022", + "2023" + ], + "req": "All" + }, + "HYUNDAI_PALISADE|2020-2022#2": { + "label": "Kia Telluride 2020-22", + "id": "HYUNDAI_PALISADE", + "mk": "Kia", + "grp": "hyundai", + "mdl": "Telluride", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "LEXUS_CTH|2017-2018": { + "label": "Lexus CT Hybrid 2017-18", + "id": "LEXUS_CTH", + "mk": "Lexus", + "grp": "toyota", + "mdl": "CT Hybrid", + "yrs": [ + "2017", + "2018" + ], + "req": "Lexus Safety System+" + }, + "LEXUS_ES|2017-2018": { + "label": "Lexus ES 2017-18", + "id": "LEXUS_ES", + "mk": "Lexus", + "grp": "toyota", + "mdl": "ES", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "LEXUS_ES_TSS2|2019-2025": { + "label": "Lexus ES 2019-25", + "id": "LEXUS_ES_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "ES", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "LEXUS_ES|2017-2018#2": { + "label": "Lexus ES Hybrid 2017-18", + "id": "LEXUS_ES", + "mk": "Lexus", + "grp": "toyota", + "mdl": "ES Hybrid", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "LEXUS_ES_TSS2|2019-2025#2": { + "label": "Lexus ES Hybrid 2019-25", + "id": "LEXUS_ES_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "ES Hybrid", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "LEXUS_GS_F|2016": { + "label": "Lexus GS F 2016", + "id": "LEXUS_GS_F", + "mk": "Lexus", + "grp": "toyota", + "mdl": "GS F", + "yrs": [ + "2016" + ], + "req": "All" + }, + "LEXUS_IS|2017-2019": { + "label": "Lexus IS 2017-19", + "id": "LEXUS_IS", + "mk": "Lexus", + "grp": "toyota", + "mdl": "IS", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_IS_TSS2|2022-2024": { + "label": "Lexus IS 2022-24", + "id": "LEXUS_IS_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "IS", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "LEXUS_LC_TSS2|2024-2025": { + "label": "Lexus LC 2024-25", + "id": "LEXUS_LC_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "LC", + "yrs": [ + "2024", + "2025" + ], + "req": "All" + }, + "LEXUS_LS|2018": { + "label": "Lexus LS 2018", + "id": "LEXUS_LS", + "mk": "Lexus", + "grp": "toyota", + "mdl": "LS", + "yrs": [ + "2018" + ], + "req": "All except Lexus Safety System+ A" + }, + "LEXUS_NX|2018-2019": { + "label": "Lexus NX 2018-19", + "id": "LEXUS_NX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "NX", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_NX_TSS2|2020-2021": { + "label": "Lexus NX 2020-21", + "id": "LEXUS_NX_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "NX", + "yrs": [ + "2020", + "2021" + ], + "req": "All" + }, + "LEXUS_NX|2018-2019#2": { + "label": "Lexus NX Hybrid 2018-19", + "id": "LEXUS_NX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "NX Hybrid", + "yrs": [ + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_NX_TSS2|2020-2021#2": { + "label": "Lexus NX Hybrid 2020-21", + "id": "LEXUS_NX_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "NX Hybrid", + "yrs": [ + "2020", + "2021" + ], + "req": "All" + }, + "LEXUS_RC|2018-2020": { + "label": "Lexus RC 2018-20", + "id": "LEXUS_RC", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RC", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "LEXUS_RC_TSS2|2023": { + "label": "Lexus RC 2023", + "id": "LEXUS_RC_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RC", + "yrs": [ + "2023" + ], + "req": "All" + }, + "LEXUS_RX|2016": { + "label": "Lexus RX 2016", + "id": "LEXUS_RX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX", + "yrs": [ + "2016" + ], + "req": "Lexus Safety System+" + }, + "LEXUS_RX|2017-2019": { + "label": "Lexus RX 2017-19", + "id": "LEXUS_RX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_RX_TSS2|2020-2022": { + "label": "Lexus RX 2020-22", + "id": "LEXUS_RX_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "LEXUS_RX|2016#2": { + "label": "Lexus RX Hybrid 2016", + "id": "LEXUS_RX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX Hybrid", + "yrs": [ + "2016" + ], + "req": "Lexus Safety System+" + }, + "LEXUS_RX|2017-2019#2": { + "label": "Lexus RX Hybrid 2017-19", + "id": "LEXUS_RX", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX Hybrid", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "LEXUS_RX_TSS2|2020-2022#2": { + "label": "Lexus RX Hybrid 2020-22", + "id": "LEXUS_RX_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "RX Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2019-2024": { + "label": "Lexus UX Hybrid 2019-24", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Lexus", + "grp": "toyota", + "mdl": "UX Hybrid", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "FORD_EXPLORER_MK6|2020-2024#3": { + "label": "Lincoln Aviator 2020-24", + "id": "FORD_EXPLORER_MK6", + "mk": "Lincoln", + "grp": "ford", + "mdl": "Aviator", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Plus" + }, + "FORD_EXPLORER_MK6|2020-2024#4": { + "label": "Lincoln Aviator Plug-in Hybrid 2020-24", + "id": "FORD_EXPLORER_MK6", + "mk": "Lincoln", + "grp": "ford", + "mdl": "Aviator Plug-in Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Co-Pilot360 Plus" + }, + "VOLKSWAGEN_CRAFTER_MK2|2020-2024": { + "label": "MAN eTGE 2020-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "MAN", + "grp": "volkswagen", + "mdl": "eTGE", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CRAFTER_MK2|2017-2024": { + "label": "MAN TGE 2017-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "MAN", + "grp": "volkswagen", + "mdl": "TGE", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "MAZDA_CX5_2022|2022-2025": { + "label": "Mazda CX-5 2022-25", + "id": "MAZDA_CX5_2022", + "mk": "Mazda", + "grp": "mazda", + "mdl": "CX-5", + "yrs": [ + "2022", + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "MAZDA_CX9_2021|2021-2023": { + "label": "Mazda CX-9 2021-23", + "id": "MAZDA_CX9_2021", + "mk": "Mazda", + "grp": "mazda", + "mdl": "CX-9", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "NISSAN_ALTIMA|2019-2024": { + "label": "Nissan Altima 2019-20, 2024", + "id": "NISSAN_ALTIMA", + "mk": "Nissan", + "grp": "nissan", + "mdl": "Altima", + "yrs": [ + "2019", + "2020", + "2024" + ], + "req": "ProPILOT Assist" + }, + "NISSAN_LEAF|2018-2023": { + "label": "Nissan Leaf 2018-23", + "id": "NISSAN_LEAF", + "mk": "Nissan", + "grp": "nissan", + "mdl": "Leaf", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "ProPILOT Assist" + }, + "NISSAN_ROGUE|2018-2020": { + "label": "Nissan Rogue 2018-20", + "id": "NISSAN_ROGUE", + "mk": "Nissan", + "grp": "nissan", + "mdl": "Rogue", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "ProPILOT Assist" + }, + "NISSAN_XTRAIL|2017": { + "label": "Nissan X-Trail 2017", + "id": "NISSAN_XTRAIL", + "mk": "Nissan", + "grp": "nissan", + "mdl": "X-Trail", + "yrs": [ + "2017" + ], + "req": "ProPILOT Assist" + }, + "PORSCHE_MACAN_MK1|2017-2024": { + "label": "Porsche Macan 2017-24", + "id": "PORSCHE_MACAN_MK1", + "mk": "Porsche", + "grp": "volkswagen", + "mdl": "Macan", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "RAM_1500_5TH_GEN|2019-2024": { + "label": "Ram 1500 2019-24", + "id": "RAM_1500_5TH_GEN", + "mk": "Ram", + "grp": "chrysler", + "mdl": "1500", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "RAM_HD_5TH_GEN|2020-2024": { + "label": "Ram 2500 2020-24", + "id": "RAM_HD_5TH_GEN", + "mk": "Ram", + "grp": "chrysler", + "mdl": "2500", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "RAM_HD_5TH_GEN|2019-2022": { + "label": "Ram 3500 2019-22", + "id": "RAM_HD_5TH_GEN", + "mk": "Ram", + "grp": "chrysler", + "mdl": "3500", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC)" + }, + "RIVIAN_R1_GEN1|2022-2024": { + "label": "Rivian R1S 2022-24", + "id": "RIVIAN_R1_GEN1", + "mk": "Rivian", + "grp": "rivian", + "mdl": "R1S", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "RIVIAN_R1_GEN1|2022-2024#2": { + "label": "Rivian R1T 2022-24", + "id": "RIVIAN_R1_GEN1", + "mk": "Rivian", + "grp": "rivian", + "mdl": "R1T", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "SEAT_ALHAMBRA_MK1|2018-2020": { + "label": "SEAT Alhambra 2018-20", + "id": "SEAT_ALHAMBRA_MK1", + "mk": "SEAT", + "grp": "volkswagen", + "mdl": "Alhambra", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SEAT_ATECA_MK1|2016-2023": { + "label": "SEAT Ateca 2016-23", + "id": "SEAT_ATECA_MK1", + "mk": "SEAT", + "grp": "volkswagen", + "mdl": "Ateca", + "yrs": [ + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SEAT_ATECA_MK1|2014-2020": { + "label": "SEAT Leon (Mk3) 2014-20", + "id": "SEAT_ATECA_MK1", + "mk": "SEAT", + "grp": "volkswagen", + "mdl": "Leon (Mk3)", + "yrs": [ + "2014", + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SEAT_LEON_MK4|2020-2025": { + "label": "SEAT Leon (Mk4) 2020-25", + "id": "SEAT_LEON_MK4", + "mk": "SEAT", + "grp": "volkswagen", + "mdl": "Leon (Mk4)", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SUBARU_ASCENT|2019-2021": { + "label": "Subaru Ascent 2019-21", + "id": "SUBARU_ASCENT", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Ascent", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "SUBARU_IMPREZA|2018-2019": { + "label": "Subaru Crosstrek 2018-19", + "id": "SUBARU_IMPREZA", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Crosstrek", + "yrs": [ + "2018", + "2019" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_IMPREZA_2020|2020-2023": { + "label": "Subaru Crosstrek 2020-23", + "id": "SUBARU_IMPREZA_2020", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Crosstrek", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_FORESTER_PREGLOBAL|2017-2018": { + "label": "Subaru Forester 2017-18", + "id": "SUBARU_FORESTER_PREGLOBAL", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Forester", + "yrs": [ + "2017", + "2018" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_FORESTER|2019-2021": { + "label": "Subaru Forester 2019-21", + "id": "SUBARU_FORESTER", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Forester", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "SUBARU_IMPREZA|2017-2019": { + "label": "Subaru Impreza 2017-19", + "id": "SUBARU_IMPREZA", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Impreza", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_IMPREZA_2020|2020-2022": { + "label": "Subaru Impreza 2020-22", + "id": "SUBARU_IMPREZA_2020", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Impreza", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_LEGACY_PREGLOBAL|2015-2018": { + "label": "Subaru Legacy 2015-18", + "id": "SUBARU_LEGACY_PREGLOBAL", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Legacy", + "yrs": [ + "2015", + "2016", + "2017", + "2018" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_LEGACY|2020-2022": { + "label": "Subaru Legacy 2020-22", + "id": "SUBARU_LEGACY", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Legacy", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "SUBARU_OUTBACK_PREGLOBAL|2015-2017": { + "label": "Subaru Outback 2015-17", + "id": "SUBARU_OUTBACK_PREGLOBAL", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Outback", + "yrs": [ + "2015", + "2016", + "2017" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_OUTBACK_PREGLOBAL_2018|2018-2019": { + "label": "Subaru Outback 2018-19", + "id": "SUBARU_OUTBACK_PREGLOBAL_2018", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Outback", + "yrs": [ + "2018", + "2019" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_OUTBACK|2020-2022": { + "label": "Subaru Outback 2020-22", + "id": "SUBARU_OUTBACK", + "mk": "Subaru", + "grp": "subaru", + "mdl": "Outback", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "SUBARU_IMPREZA|2018-2019#2": { + "label": "Subaru XV 2018-19", + "id": "SUBARU_IMPREZA", + "mk": "Subaru", + "grp": "subaru", + "mdl": "XV", + "yrs": [ + "2018", + "2019" + ], + "req": "EyeSight Driver Assistance" + }, + "SUBARU_IMPREZA_2020|2020-2021": { + "label": "Subaru XV 2020-21", + "id": "SUBARU_IMPREZA_2020", + "mk": "Subaru", + "grp": "subaru", + "mdl": "XV", + "yrs": [ + "2020", + "2021" + ], + "req": "EyeSight Driver Assistance" + }, + "SKODA_ENYAQ_MK1|2021-2023": { + "label": "Å koda Enyaq 2021-23", + "id": "SKODA_ENYAQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Enyaq", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_ENYAQ_MK2|2024-2025": { + "label": "Å koda Enyaq 2024-25", + "id": "SKODA_ENYAQ_MK2", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Enyaq", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_FABIA_MK4|2022-2023": { + "label": "Å koda Fabia 2022-23", + "id": "SKODA_FABIA_MK4", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Fabia", + "yrs": [ + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_KAMIQ_MK1|2021-2023": { + "label": "Å koda Kamiq 2021-23", + "id": "SKODA_KAMIQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Kamiq", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_KAROQ_MK1|2019-2023": { + "label": "Å koda Karoq 2019-23", + "id": "SKODA_KAROQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Karoq", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_KODIAQ_MK1|2017-2023": { + "label": "Å koda Kodiaq 2017-23", + "id": "SKODA_KODIAQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Kodiaq", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_OCTAVIA_MK3|2015-2019": { + "label": "Å koda Octavia 2015-19", + "id": "SKODA_OCTAVIA_MK3", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Octavia", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_OCTAVIA_MK3|2016": { + "label": "Å koda Octavia RS 2016", + "id": "SKODA_OCTAVIA_MK3", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Octavia RS", + "yrs": [ + "2016" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_OCTAVIA_MK3|2017-2019": { + "label": "Å koda Octavia Scout 2017-19", + "id": "SKODA_OCTAVIA_MK3", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Octavia Scout", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_KAMIQ_MK1|2020-2023": { + "label": "Å koda Scala 2020-23", + "id": "SKODA_KAMIQ_MK1", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Scala", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "SKODA_SUPERB_MK3|2015-2022": { + "label": "Å koda Superb 2015-22", + "id": "SKODA_SUPERB_MK3", + "mk": "Å koda", + "grp": "volkswagen", + "mdl": "Superb", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "TESLA_MODEL_3|2019-2023": { + "label": "Tesla Model 3 (with HW3) 2019-23", + "id": "TESLA_MODEL_3", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model 3 (with HW3)", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TESLA_MODEL_3|2024-2025": { + "label": "Tesla Model 3 (with HW4) 2024-25", + "id": "TESLA_MODEL_3", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model 3 (with HW4)", + "yrs": [ + "2024", + "2025" + ], + "req": "All" + }, + "TESLA_MODEL_X|2024": { + "label": "Tesla Model X (with HW4) 2024", + "id": "TESLA_MODEL_X", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model X (with HW4)", + "yrs": [ + "2024" + ], + "req": "All" + }, + "TESLA_MODEL_Y|2020-2023": { + "label": "Tesla Model Y (with HW3) 2020-23", + "id": "TESLA_MODEL_Y", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model Y (with HW3)", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TESLA_MODEL_Y|2024-2025": { + "label": "Tesla Model Y (with HW4) 2024-25", + "id": "TESLA_MODEL_Y", + "mk": "Tesla", + "grp": "tesla", + "mdl": "Model Y (with HW4)", + "yrs": [ + "2024", + "2025" + ], + "req": "All" + }, + "TOYOTA_ALPHARD_TSS2|2019-2020": { + "label": "Toyota Alphard 2019-20", + "id": "TOYOTA_ALPHARD_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Alphard", + "yrs": [ + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_ALPHARD_TSS2|2021": { + "label": "Toyota Alphard Hybrid 2021", + "id": "TOYOTA_ALPHARD_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Alphard Hybrid", + "yrs": [ + "2021" + ], + "req": "All" + }, + "TOYOTA_AVALON|2016": { + "label": "Toyota Avalon 2016", + "id": "TOYOTA_AVALON", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon", + "yrs": [ + "2016" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_AVALON|2017-2018": { + "label": "Toyota Avalon 2017-18", + "id": "TOYOTA_AVALON", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "TOYOTA_AVALON_2019|2019-2021": { + "label": "Toyota Avalon 2019-21", + "id": "TOYOTA_AVALON_2019", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "TOYOTA_AVALON_TSS2|2022": { + "label": "Toyota Avalon 2022", + "id": "TOYOTA_AVALON_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon", + "yrs": [ + "2022" + ], + "req": "All" + }, + "TOYOTA_AVALON_2019|2019-2021#2": { + "label": "Toyota Avalon Hybrid 2019-21", + "id": "TOYOTA_AVALON_2019", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon Hybrid", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "TOYOTA_AVALON_TSS2|2022#2": { + "label": "Toyota Avalon Hybrid 2022", + "id": "TOYOTA_AVALON_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Avalon Hybrid", + "yrs": [ + "2022" + ], + "req": "All" + }, + "TOYOTA_CHR|2017-2020": { + "label": "Toyota C-HR 2017-20", + "id": "TOYOTA_CHR", + "mk": "Toyota", + "grp": "toyota", + "mdl": "C-HR", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_CHR_TSS2|2021": { + "label": "Toyota C-HR 2021", + "id": "TOYOTA_CHR_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "C-HR", + "yrs": [ + "2021" + ], + "req": "All" + }, + "TOYOTA_CHR|2017-2020#2": { + "label": "Toyota C-HR Hybrid 2017-20", + "id": "TOYOTA_CHR", + "mk": "Toyota", + "grp": "toyota", + "mdl": "C-HR Hybrid", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_CHR_TSS2|2021-2022": { + "label": "Toyota C-HR Hybrid 2021-22", + "id": "TOYOTA_CHR_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "C-HR Hybrid", + "yrs": [ + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_CAMRY|2018-2020": { + "label": "Toyota Camry 2018-20", + "id": "TOYOTA_CAMRY", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Camry", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_CAMRY_TSS2|2021-2024": { + "label": "Toyota Camry 2021-24", + "id": "TOYOTA_CAMRY_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Camry", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "TOYOTA_CAMRY|2018-2020#2": { + "label": "Toyota Camry Hybrid 2018-20", + "id": "TOYOTA_CAMRY", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Camry Hybrid", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_CAMRY_TSS2|2021-2024#2": { + "label": "Toyota Camry Hybrid 2021-24", + "id": "TOYOTA_CAMRY_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Camry Hybrid", + "yrs": [ + "2021", + "2022", + "2023", + "2024" + ], + "req": "All" + }, + "TOYOTA_COROLLA|2017-2019": { + "label": "Toyota Corolla 2017-19", + "id": "TOYOTA_COROLLA", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2022": { + "label": "Toyota Corolla 2020-22", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2023": { + "label": "Toyota Corolla Cross (Non-US only) 2020-23", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Cross (Non-US only)", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2022#2": { + "label": "Toyota Corolla Cross Hybrid (Non-US only) 2020-22", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Cross Hybrid (Non-US only)", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2019-2022": { + "label": "Toyota Corolla Hatchback 2019-22", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Hatchback", + "yrs": [ + "2019", + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2022#3": { + "label": "Toyota Corolla Hybrid 2020-22", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Hybrid", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_COROLLA_TSS2|2020-2023#2": { + "label": "Toyota Corolla Hybrid (South America only) 2020-23", + "id": "TOYOTA_COROLLA_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Corolla Hybrid (South America only)", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_HIGHLANDER|2017-2019": { + "label": "Toyota Highlander 2017-19", + "id": "TOYOTA_HIGHLANDER", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Highlander", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "TOYOTA_HIGHLANDER_TSS2|2020-2023": { + "label": "Toyota Highlander 2020-23", + "id": "TOYOTA_HIGHLANDER_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Highlander", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_HIGHLANDER|2017-2019#2": { + "label": "Toyota Highlander Hybrid 2017-19", + "id": "TOYOTA_HIGHLANDER", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Highlander Hybrid", + "yrs": [ + "2017", + "2018", + "2019" + ], + "req": "All" + }, + "TOYOTA_HIGHLANDER_TSS2|2020-2023#2": { + "label": "Toyota Highlander Hybrid 2020-23", + "id": "TOYOTA_HIGHLANDER_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Highlander Hybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_MIRAI|2021": { + "label": "Toyota Mirai 2021", + "id": "TOYOTA_MIRAI", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Mirai", + "yrs": [ + "2021" + ], + "req": "All" + }, + "TOYOTA_PRIUS|2016": { + "label": "Toyota Prius 2016", + "id": "TOYOTA_PRIUS", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius", + "yrs": [ + "2016" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_PRIUS|2017-2020": { + "label": "Toyota Prius 2017-20", + "id": "TOYOTA_PRIUS", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_PRIUS_TSS2|2021-2022": { + "label": "Toyota Prius 2021-22", + "id": "TOYOTA_PRIUS_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius", + "yrs": [ + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_PRIUS|2017-2020#2": { + "label": "Toyota Prius Prime 2017-20", + "id": "TOYOTA_PRIUS", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius Prime", + "yrs": [ + "2017", + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_PRIUS_TSS2|2021-2022#2": { + "label": "Toyota Prius Prime 2021-22", + "id": "TOYOTA_PRIUS_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius Prime", + "yrs": [ + "2021", + "2022" + ], + "req": "All" + }, + "TOYOTA_PRIUS_V|2017": { + "label": "Toyota Prius v 2017", + "id": "TOYOTA_PRIUS_V", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Prius v", + "yrs": [ + "2017" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_RAV4|2016": { + "label": "Toyota RAV4 2016", + "id": "TOYOTA_RAV4", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2016" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_RAV4|2017-2018": { + "label": "Toyota RAV4 2017-18", + "id": "TOYOTA_RAV4", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2|2019-2021": { + "label": "Toyota RAV4 2019-21", + "id": "TOYOTA_RAV4_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2_2022|2022": { + "label": "Toyota RAV4 2022", + "id": "TOYOTA_RAV4_TSS2_2022", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2022" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2_2023|2023-2025": { + "label": "Toyota RAV4 2023-25", + "id": "TOYOTA_RAV4_TSS2_2023", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "TOYOTA_RAV4H|2016": { + "label": "Toyota RAV4 Hybrid 2016", + "id": "TOYOTA_RAV4H", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2016" + ], + "req": "Toyota Safety Sense P" + }, + "TOYOTA_RAV4H|2017-2018": { + "label": "Toyota RAV4 Hybrid 2017-18", + "id": "TOYOTA_RAV4H", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2017", + "2018" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2|2019-2021#2": { + "label": "Toyota RAV4 Hybrid 2019-21", + "id": "TOYOTA_RAV4_TSS2", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2019", + "2020", + "2021" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2_2022|2022#2": { + "label": "Toyota RAV4 Hybrid 2022", + "id": "TOYOTA_RAV4_TSS2_2022", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2022" + ], + "req": "All" + }, + "TOYOTA_RAV4_TSS2_2023|2023-2025#2": { + "label": "Toyota RAV4 Hybrid 2023-25", + "id": "TOYOTA_RAV4_TSS2_2023", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Hybrid", + "yrs": [ + "2023", + "2024", + "2025" + ], + "req": "All" + }, + "TOYOTA_RAV4_PRIME|2021-2023": { + "label": "Toyota RAV4 Prime 2021-23", + "id": "TOYOTA_RAV4_PRIME", + "mk": "Toyota", + "grp": "toyota", + "mdl": "RAV4 Prime", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_SIENNA|2018-2020": { + "label": "Toyota Sienna 2018-20", + "id": "TOYOTA_SIENNA", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Sienna", + "yrs": [ + "2018", + "2019", + "2020" + ], + "req": "All" + }, + "TOYOTA_SIENNA_4TH_GEN|2021-2023": { + "label": "Toyota Sienna 2021-23", + "id": "TOYOTA_SIENNA_4TH_GEN", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Sienna", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "All" + }, + "TOYOTA_YARIS|2020-2023": { + "label": "Toyota Yaris (Non-US only) 2020, 2023", + "id": "TOYOTA_YARIS", + "mk": "Toyota", + "grp": "toyota", + "mdl": "Yaris (Non-US only)", + "yrs": [ + "2020", + "2023" + ], + "req": "All" + }, + "VOLKSWAGEN_ARTEON_MK1|2018-2023": { + "label": "Volkswagen Arteon 2018-23", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Arteon", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ARTEON_MK1|2020-2023": { + "label": "Volkswagen Arteon eHybrid 2020-23", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Arteon eHybrid", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ARTEON_MK1|2020-2023#2": { + "label": "Volkswagen Arteon R 2020-23", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Arteon R", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ARTEON_MK1|2020-2023#3": { + "label": "Volkswagen Arteon Shooting Brake 2020-23", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Arteon Shooting Brake", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2018-2023": { + "label": "Volkswagen Atlas 2018-23", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Atlas", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2020-2022": { + "label": "Volkswagen Atlas Cross Sport 2020-22", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Atlas Cross Sport", + "yrs": [ + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CADDY_MK3|2019": { + "label": "Volkswagen Caddy 2019", + "id": "VOLKSWAGEN_CADDY_MK3", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Caddy", + "yrs": [ + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CADDY_MK3|2019#2": { + "label": "Volkswagen Caddy Maxi 2019", + "id": "VOLKSWAGEN_CADDY_MK3", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Caddy Maxi", + "yrs": [ + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TRANSPORTER_T61|2021-2023": { + "label": "Volkswagen California 2021-23", + "id": "VOLKSWAGEN_TRANSPORTER_T61", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "California", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TRANSPORTER_T61|2020": { + "label": "Volkswagen Caravelle 2020", + "id": "VOLKSWAGEN_TRANSPORTER_T61", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Caravelle", + "yrs": [ + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ARTEON_MK1|2018-2022": { + "label": "Volkswagen CC 2018-22", + "id": "VOLKSWAGEN_ARTEON_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "CC", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CRAFTER_MK2|2017-2024#2": { + "label": "Volkswagen Crafter 2017-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Crafter", + "yrs": [ + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CRAFTER_MK2|2018-2024": { + "label": "Volkswagen e-Crafter 2018-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "e-Crafter", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2014-2020": { + "label": "Volkswagen e-Golf 2014-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "e-Golf", + "yrs": [ + "2014", + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2020": { + "label": "Volkswagen Golf (Mk7) 2015-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf (Mk7)", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK8|2020-2025": { + "label": "Volkswagen Golf (Mk8) 2020-25", + "id": "VOLKSWAGEN_GOLF_MK8", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf (Mk8)", + "yrs": [ + "2020", + "2021", + "2022", + "2023", + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2019": { + "label": "Volkswagen Golf Alltrack 2015-19", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf Alltrack", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2020#2": { + "label": "Volkswagen Golf GTD 2015-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf GTD", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2020#3": { + "label": "Volkswagen Golf GTE 2015-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf GTE", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2021": { + "label": "Volkswagen Golf GTI 2015-21", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf GTI", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2019#2": { + "label": "Volkswagen Golf R 2015-19", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf R", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_GOLF_MK7|2015-2020#4": { + "label": "Volkswagen Golf SportsVan 2015-20", + "id": "VOLKSWAGEN_GOLF_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Golf SportsVan", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_CRAFTER_MK2|2019-2024": { + "label": "Volkswagen Grand California 2019-24", + "id": "VOLKSWAGEN_CRAFTER_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Grand California", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID3_MK1|2020-2023": { + "label": "Volkswagen ID.3 2020-23", + "id": "VOLKSWAGEN_ID3_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.3", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID3_MK2|2024-2025": { + "label": "Volkswagen ID.3 2024-25", + "id": "VOLKSWAGEN_ID3_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.3", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID4_MK1|2021-2023": { + "label": "Volkswagen ID.4 2021-23", + "id": "VOLKSWAGEN_ID4_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.4", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID4_MK2|2024-2025": { + "label": "Volkswagen ID.4 2024-25", + "id": "VOLKSWAGEN_ID4_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.4", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID4_MK1|2022-2023": { + "label": "Volkswagen ID.5 2022-23", + "id": "VOLKSWAGEN_ID4_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "ID.5", + "yrs": [ + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_JETTA_MK6|2015-2018": { + "label": "Volkswagen Jetta 2015-18", + "id": "VOLKSWAGEN_JETTA_MK6", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Jetta", + "yrs": [ + "2015", + "2016", + "2017", + "2018" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_JETTA_MK7|2019-2023": { + "label": "Volkswagen Jetta 2019-23", + "id": "VOLKSWAGEN_JETTA_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Jetta", + "yrs": [ + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_JETTA_MK7|2021-2023": { + "label": "Volkswagen Jetta GLI 2021-23", + "id": "VOLKSWAGEN_JETTA_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Jetta GLI", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID3_MK1|2020-2023#2": { + "label": "Volkswagen MEB Gen 1 2020-23", + "id": "VOLKSWAGEN_ID3_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "MEB Gen 1", + "yrs": [ + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ID3_MK2|2024-2025#2": { + "label": "Volkswagen MEB Gen 2 2024-25", + "id": "VOLKSWAGEN_ID3_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "MEB Gen 2", + "yrs": [ + "2024", + "2025" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_MK7|2014": { + "label": "Volkswagen Passat 2.0 TDI 2014", + "id": "VOLKSWAGEN_PASSAT_MK7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat 2.0 TDI", + "yrs": [ + "2014" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_MK8|2015-2022": { + "label": "Volkswagen Passat 2015-22", + "id": "VOLKSWAGEN_PASSAT_MK8", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_MK8|2015-2022#2": { + "label": "Volkswagen Passat Alltrack 2015-22", + "id": "VOLKSWAGEN_PASSAT_MK8", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat Alltrack", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_B7|2011-2015": { + "label": "Volkswagen Passat B7 2011-15", + "id": "VOLKSWAGEN_PASSAT_B7", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat B7", + "yrs": [ + "2011", + "2012", + "2013", + "2014", + "2015" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_MK8|2015-2022#3": { + "label": "Volkswagen Passat GTE 2015-22", + "id": "VOLKSWAGEN_PASSAT_MK8", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat GTE", + "yrs": [ + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_NMS|2015-2017": { + "label": "Volkswagen Passat NMS 2015-17", + "id": "VOLKSWAGEN_PASSAT_NMS", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat NMS", + "yrs": [ + "2015", + "2016", + "2017" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_PASSAT_NMS_PLUS|2018-2022": { + "label": "Volkswagen Passat NMS 2018-22", + "id": "VOLKSWAGEN_PASSAT_NMS_PLUS", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Passat NMS", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_POLO_MK6|2018-2023": { + "label": "Volkswagen Polo 2018-23", + "id": "VOLKSWAGEN_POLO_MK6", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Polo", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_POLO_MK6|2018-2023#2": { + "label": "Volkswagen Polo GTI 2018-23", + "id": "VOLKSWAGEN_POLO_MK6", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Polo GTI", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_SHARAN_MK2|2018-2022": { + "label": "Volkswagen Sharan 2018-22", + "id": "VOLKSWAGEN_SHARAN_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Sharan", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TCROSS_MK1|2021": { + "label": "Volkswagen T-Cross 2021", + "id": "VOLKSWAGEN_TCROSS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "T-Cross", + "yrs": [ + "2021" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TROC_MK1|2018-2023": { + "label": "Volkswagen T-Roc 2018-23", + "id": "VOLKSWAGEN_TROC_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "T-Roc", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TAOS_MK1|2022-2024": { + "label": "Volkswagen Taos 2022-24", + "id": "VOLKSWAGEN_TAOS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Taos", + "yrs": [ + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2018-2022": { + "label": "Volkswagen Teramont 2018-22", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Teramont", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2021-2022": { + "label": "Volkswagen Teramont Cross Sport 2021-22", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Teramont Cross Sport", + "yrs": [ + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_ATLAS_MK1|2021-2022#2": { + "label": "Volkswagen Teramont X 2021-22", + "id": "VOLKSWAGEN_ATLAS_MK1", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Teramont X", + "yrs": [ + "2021", + "2022" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TIGUAN_MK2|2018-2024": { + "label": "Volkswagen Tiguan 2018-24", + "id": "VOLKSWAGEN_TIGUAN_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Tiguan", + "yrs": [ + "2018", + "2019", + "2020", + "2021", + "2022", + "2023", + "2024" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TIGUAN_MK2|2021-2023": { + "label": "Volkswagen Tiguan eHybrid 2021-23", + "id": "VOLKSWAGEN_TIGUAN_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Tiguan eHybrid", + "yrs": [ + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + }, + "VOLKSWAGEN_TOURAN_MK2|2016-2023": { + "label": "Volkswagen Touran 2016-23", + "id": "VOLKSWAGEN_TOURAN_MK2", + "mk": "Volkswagen", + "grp": "volkswagen", + "mdl": "Touran", + "yrs": [ + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "req": "Adaptive Cruise Control (ACC) & Lane Assist" + } + } +} \ No newline at end of file diff --git a/iqpilot/selfdrive/car/vehicle_catalog.py b/iqpilot/selfdrive/car/vehicle_catalog.py new file mode 100644 index 000000000..790e2acf4 --- /dev/null +++ b/iqpilot/selfdrive/car/vehicle_catalog.py @@ -0,0 +1,85 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import json +import os + +from iqpilot.common.basedir import BASEDIR + +SCHEMA = "iqlvbs/supported-vehicles" +REV = 1 + +CATALOG_FILENAME = "vehicle_catalog.json" +_CANDIDATE_PARTS = ( + ("iqpilot", "selfdrive", "car", CATALOG_FILENAME), +) + +# in-memory (car-interface) field -> on-disk compact key +_ATTR_TO_KEY = ( + ("platform", "id"), + ("make", "mk"), + ("brand", "grp"), + ("model", "mdl"), + ("year", "yrs"), + ("package", "req"), +) + + +def _reference(platform: str, years: list[str], claimed: set[str]) -> str: + span = f"{years[0]}-{years[-1]}" if len(years) > 1 else (years[0] if years else "na") + stem = f"{platform}|{span}" + ref, bump = stem, 2 + while ref in claimed: + ref = f"{stem}#{bump}" + bump += 1 + claimed.add(ref) + return ref + + +def encode(vehicles: dict[str, dict]) -> dict: + records: dict[str, dict] = {} + claimed: set[str] = set() + for label, attrs in vehicles.items(): + years = list(attrs.get("year") or []) + ref = _reference(attrs.get("platform", ""), years, claimed) + record = {"label": label} + for attr, key in _ATTR_TO_KEY: + record[key] = attrs.get(attr) + records[ref] = record + return {"catalog": SCHEMA, "rev": REV, "vehicles": records} + + +def decode(envelope: dict) -> dict[str, dict]: + vehicles: dict[str, dict] = {} + for record in (envelope.get("vehicles") or {}).values(): + attrs = {attr: record.get(key) for attr, key in _ATTR_TO_KEY} + vehicles[record.get("label", "")] = attrs + return vehicles + + +def catalog_path(basedir: str = BASEDIR) -> str | None: + for parts in _CANDIDATE_PARTS: + candidate = os.path.join(basedir, *parts) + if os.path.isfile(candidate): + return candidate + return None + + +def load_catalog(basedir: str = BASEDIR) -> dict[str, dict]: + path = catalog_path(basedir) + if path is None: + return {} + with open(path) as handle: + return decode(json.load(handle)) + + +def _write(vehicles: dict[str, dict], basedir: str = BASEDIR) -> str: + out = os.path.join(basedir, "iqpilot", "selfdrive", "car", CATALOG_FILENAME) + with open(out, "w") as handle: + json.dump(encode(vehicles), handle, indent=2, ensure_ascii=False) + return out + + +if __name__ == "__main__": + from iqdbc.lvbs.car.car_catalog import build_car_catalog + print("wrote", _write(build_car_catalog())) diff --git a/iqpilot/selfdrive/constructiond.py b/iqpilot/selfdrive/constructiond.py new file mode 100644 index 000000000..22656454b --- /dev/null +++ b/iqpilot/selfdrive/constructiond.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +constructiond: work-zone detector for Speed Limit Assist. + +Samples the road camera at ~2 Hz and looks for work-zone orange (barrels, drums, +diamond signs) in the NV12 chroma plane. Sunlit yellow lane paint renders with +nearly identical hue to barrel orange on this camera, but its red chroma (V) +saturates below ~168 while retroreflective barrel orange reaches 170-190, so the +V floor is the load-bearing threshold — do not lower it without re-running the +paint/barrel separation sweep on real footage. +""" +from collections import deque + +import time + +import numpy as np + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import custom +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionIpcClient +from iqpilot.common.swaglog import cloudlog + +State = custom.IQConstructionZone.State + +ANALYSIS_PERIOD = 0.5 + +# fractions of the chroma plane; excludes sky and hood +ROI_TOP, ROI_BOTTOM = 0.40, 0.94 +ROI_LEFT, ROI_RIGHT = 0.04, 0.96 + +V_MIN = 170 # paint tops out ~168 in every DAYLIGHT condition sampled +CB_MIN = 16 +HUE_LO, HUE_HI = 0.65, 2.0 # (V-128)/(128-U): yellow paint ~0.4, barrel orange ~0.7-1.5, red ~3.0 + +# Daylight-only gate: retroreflective amber markers (guardrail chevrons, object +# markers) blaze past V_MIN under headlights at night — 137px on one chevron on +# real footage — and there is no night work-zone ground truth to tune against. +# Night ROI mean luma measured ~36-38, validated daytime footage 84-98. +LUMA_MIN = 65.0 + +# hits only accumulate at highway-approach speeds: brightly lit lots (truck +# stops) can pass the luma gate at night with orange signage, and the clamp is +# meaningless below it anyway. An already-active zone still holds while slowed. +MIN_ENTER_SPEED = 13.4 # m/s (~30 mph) + +HIT_FRAC = 3.0e-4 +WASH_FRAC = 0.10 # more orange than this is scene lighting (sunset), not objects +ENTER_HITS = 3 +ENTER_WINDOW = 10 # analyses (~5 s) +HOLD_SEC = 120.0 # barrel-free stretches inside a zone last minutes; hold through them + + +def orange_fraction(buf) -> tuple[float, float]: + """Returns (hot-orange fraction, mean luma) of the road ROI.""" + h, w, stride, uv_off = buf.height, buf.width, buf.stride, buf.uv_offset + ch, cw = h // 2, w // 2 + uv = buf.data[uv_off:uv_off + ch * stride].reshape(ch, stride) + + r0, r1 = int(ROI_TOP * ch), int(ROI_BOTTOM * ch) + c0, c1 = int(ROI_LEFT * cw), int(ROI_RIGHT * cw) + step = 2 if cw > 700 else 1 + + u = uv[r0:r1:step, 2 * c0:2 * c1:2 * step].astype(np.int16) + v = uv[r0:r1:step, 2 * c0 + 1:2 * c1:2 * step].astype(np.int16) + + cb = 128 - u + cr = v - 128 + mask = (v >= V_MIN) & (cb >= CB_MIN) & (cr >= HUE_LO * cb) & (cr <= HUE_HI * cb) + + y_plane = buf.data[:h * stride].reshape(h, stride) + luma = float(y_plane[2 * r0:2 * r1:4, 2 * c0:2 * c1:8].mean()) + + return float(mask.mean()), luma + + +class ConstructionZoneDetector: + def __init__(self): + self.recent = deque(maxlen=ENTER_WINDOW) + self.last_hit_t: float | None = None + self.active = False + self.frac = 0.0 + + @property + def state(self): + if self.active: + return State.active + if any(self.recent): + return State.pending + return State.inactive + + def seconds_since_hit(self, now: float) -> float: + if self.last_hit_t is None: + return -1.0 + return now - self.last_hit_t + + def update(self, frac: float, now: float, luma: float = 255.0, v_ego: float = 255.0) -> bool: + self.frac = frac + hit = (HIT_FRAC <= frac <= WASH_FRAC) and luma >= LUMA_MIN and v_ego >= MIN_ENTER_SPEED + self.recent.append(hit) + if hit: + self.last_hit_t = now + + if self.active: + if self.last_hit_t is None or (now - self.last_hit_t) > HOLD_SEC: + self.active = False + self.recent.clear() + elif sum(self.recent) >= ENTER_HITS: + self.active = True + return self.active + + +def main(): + pm = messaging.PubMaster(["iqConstructionZone"]) + car_state_sock = messaging.sub_sock("carState", conflate=True) + detector = ConstructionZoneDetector() + v_ego = 0.0 + + vipc = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_ROAD, True) + while not vipc.connect(False): + time.sleep(0.5) + cloudlog.info("constructiond: connected to road camera stream") + + while True: + t0 = time.monotonic() + buf = vipc.recv(200) + if buf is None: + # no publish on camera stall: SLC sees us stale and releases the clamp + continue + + cs = messaging.recv_one_or_none(car_state_sock) + if cs is not None: + v_ego = cs.carState.vEgo + + frac, luma = orange_fraction(buf) + detector.update(frac, t0, luma, v_ego) + + msg = messaging.new_message("iqConstructionZone") + msg.valid = True + cz = msg.iqConstructionZone + cz.state = detector.state + cz.active = detector.active + cz.orangeFraction = frac + cz.secondsSinceHit = detector.seconds_since_hit(t0) + pm.send("iqConstructionZone", msg) + + time.sleep(max(0.0, ANALYSIS_PERIOD - (time.monotonic() - t0))) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/controls/.gitignore b/iqpilot/selfdrive/controls/.gitignore new file mode 100644 index 000000000..22a371d8f --- /dev/null +++ b/iqpilot/selfdrive/controls/.gitignore @@ -0,0 +1,2 @@ +calibration_param +traces diff --git a/iqpilot/selfdrive/controls/__init__.py b/iqpilot/selfdrive/controls/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/controls/controlsd.py b/iqpilot/selfdrive/controls/controlsd.py new file mode 100755 index 000000000..9a6f43ff4 --- /dev/null +++ b/iqpilot/selfdrive/controls/controlsd.py @@ -0,0 +1,480 @@ +#!/usr/bin/env python3 +import math +import time +from numbers import Number + +from iqpilot.cereal import car, log +import iqpilot.cereal.messaging as messaging +from iqpilot.common.constants import CV +from iqpilot.common.iq_perf import PerfSample, PerfTraceEmitter, PerfTraceRing +from iqpilot.common.params import Params +from iqpilot.common.pt2 import PT2Filter +from iqpilot.common.realtime import config_realtime_process, lock_memory, DT_CTRL, Priority, Ratekeeper +from iqpilot.common.swaglog import cloudlog + +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.vehicle_model import VehicleModel +from iqpilot.common.steer_delay import lateral_action_delay +from iqpilot.selfdrive.controls.lib.drive_helpers import clip_curvature +from iqpilot.selfdrive.controls.lib.curvature_lookahead import get_lookahead_curvature +from iqpilot.selfdrive.controls.lib.latcontrol import LatControl +from iqpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID +from iqpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle, STEER_ANGLE_SATURATION_THRESHOLD +from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque +from iqpilot.selfdrive.controls.lib.latcontrol_torque_pq import LatControlTorquePQ +from iqpilot.selfdrive.controls.lib.latcontrol_torque_v0 import LatControlTorqueV0, is_vw_mqb_torque +from iqpilot.selfdrive.controls.lib.longcontrol import LongControl +from iqpilot.selfdrive.controls.steering_fault_recovery import SteeringFaultRecovery +from iqpilot.system.proprietary_runtime._verified_import import import_verified_module +from iqpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose + +from iqpilot.selfdrive.controls.iq_controls_layer import IQControlsLayer + +NavTurnSignalController = import_verified_module( + "iqpilot_navd_private", "iqpilot_private.navd.nav_turn_signals" +).NavTurnSignalController + +State = log.SelfdriveState.OpenpilotState +EventName = log.OnroadEvent.EventName +LaneChangeState = log.LaneChangeState +LaneChangeDirection = log.LaneChangeDirection + +ACTUATOR_FIELDS = tuple(car.CarControl.Actuators.schema.fields.keys()) +CTRL_ESSENTIAL_SERVICES = ("carState", "modelV2", "longitudinalPlan", "vehicleParameters", "selfdriveState") +CTRL_LOOP_WARN_US = 15_000 +CTRL_LOOP_BAD_US = 25_000 +CTRL_LOOP_SEVERE_US = 50_000 +CTRL_PHASE_WARN_US = 8_000 +CTRL_TAIL_WARN_US = 8_000 +CTRL_FLAG_MISSING_INPUTS = 1 << 0 +CTRL_FLAG_RK_OVERRUN = 1 << 1 +SMOOTH_STEER_W0 = 46.0 +SMOOTH_STEER_ZETA = 1.0 +SMOOTH_STEER_HOLD_FRAMES = 50 +LAT_SMOOTH_SECONDS = 0.0 + + +class Controls(IQControlsLayer): + def __init__(self) -> None: + self.params = Params() + cloudlog.info("controlsd is waiting for CarParams") + self.CP = messaging.log_from_bytes(self.params.get("CarParams", block=True), car.CarParams) + cloudlog.info("controlsd got CarParams") + + # Initialize iqpilot controlsd extension and base model state + IQControlsLayer.__init__(self, self.CP, self.params) + + self.CI = interfaces[self.CP.carFingerprint](self.CP, self.CP_IQ) + + self.sm = messaging.SubMaster(['lateralDelay', 'vehicleParameters', 'lateralTorqueParameters', 'modelV2', 'selfdriveState', + 'extrinsicsCalibration', 'deviceMotion', 'longitudinalPlan', 'lateralManeuverPlan', + 'carState', 'carOutput', 'driverMonitoringState', 'onroadEvents', + 'driverAssistance', 'lateralDelay'] + self.iq_sub_services, + poll='selfdriveState') + self.pm = messaging.PubMaster(['carControl', 'controlsState', 'iqPerfTrace'] + self.iq_pub_services) + + self.steer_limited_by_safety = False + self.steering_fault_recovery = SteeringFaultRecovery() + self.curvature = 0.0 + self.desired_curvature = 0.0 + self.roll_compensation = 0.0 + + self._perf = PerfTraceEmitter("controlsd", pubmaster=self.pm) + self._perf_ring = PerfTraceRing() + + self._param_update_time = 0.0 + self.enable_curvature_controller = False + self.enable_smooth_steer = False + self.enable_speed_limit_control = False + self.enable_speed_limit_predicative = False + self.enable_pred_react_to_speed_limits = False + self.enable_pred_react_to_curves = False + self.enable_long_comfort_mode = False + self.force_rhd_for_bsm = False + self.navigation_enabled = False + self.nav_exit_lane_change = False + self._update_params() + + self.nav_turn_signal_controller = NavTurnSignalController(self.CP) + + self.pose_calibrator = PoseCalibrator() + self.calibrated_pose: Pose | None = None + + self.LoC = LongControl(self.CP, self.CP_IQ) + self.VM = VehicleModel(self.CP) + + self.smooth_steer = PT2Filter(SMOOTH_STEER_W0, SMOOTH_STEER_ZETA, DT_CTRL) + self.smooth_steer_inactive_frames = SMOOTH_STEER_HOLD_FRAMES + self.is_curvature_car = self.CP.steerControlType == car.CarParams.SteerControlType.curvatureDEPRECATED + if self.is_curvature_car and self.params.get("EnableSmoothSteer") is None: + self.params.put_bool("EnableSmoothSteer", True) + self.LaC: LatControl + if self.CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED): + self.LaC = LatControlAngle(self.CP, self.CP_IQ, self.CI, DT_CTRL) + elif self.CP.lateralTuning.which() == 'pid': + self.LaC = LatControlPID(self.CP, self.CP_IQ, self.CI, DT_CTRL) + elif self.CP.lateralTuning.which() == 'torque': + if self._use_pq_torque(): + try: + self.LaC = LatControlTorquePQ(self.CP, self.CP_IQ, self.CI, DT_CTRL) + except Exception: + cloudlog.exception("LatControlTorquePQ init failed; using generic torque") + self.LaC = LatControlTorque(self.CP, self.CP_IQ, self.CI, DT_CTRL) + elif self._use_mqb_torque_v0(): + try: + self.LaC = LatControlTorqueV0(self.CP, self.CP_IQ, self.CI, DT_CTRL) + except Exception: + cloudlog.exception("LatControlTorqueV0 init failed; using generic torque") + self.LaC = LatControlTorque(self.CP, self.CP_IQ, self.CI, DT_CTRL) + else: + self.LaC = LatControlTorque(self.CP, self.CP_IQ, self.CI, DT_CTRL) + + def _use_pq_torque(self) -> bool: + try: + if self.CP.brand != 'volkswagen': + return False + from iqdbc.car.volkswagen.values import VolkswagenFlags + return bool(self.CP.flags & VolkswagenFlags.PQ) + except Exception: + cloudlog.exception("pq torque selection failed; using generic torque") + return False + + def _use_mqb_torque_v0(self) -> bool: + try: + return is_vw_mqb_torque(self.CP) + except Exception: + cloudlog.exception("mqb torque v0 selection failed; using generic torque") + return False + + def _update_params(self) -> None: + self.enable_curvature_controller = self.params.get_bool("EnableCurvatureController") + self.enable_smooth_steer = self.params.get_bool("EnableSmoothSteer") + self.enable_speed_limit_control = self.params.get_bool("EnableSpeedLimitControl") + self.enable_speed_limit_predicative = self.params.get_bool("EnableSpeedLimitPredicative") + self.enable_pred_react_to_speed_limits = self.params.get_bool("EnableSLPredReactToSL") + self.enable_pred_react_to_curves = self.params.get_bool("EnableSLPredReactToCurves") + self.enable_long_comfort_mode = self.params.get_bool("EnableLongComfortMode") + self.force_rhd_for_bsm = self.params.get_bool("ForceRHDForBSM") + self.navigation_enabled = self.params.get_bool("NavigationEnabled") + self.nav_exit_lane_change = self.params.get_bool("NavExitLaneChange") + + def update(self): + self.sm.update(15) + if self.sm.updated["extrinsicsCalibration"]: + self.pose_calibrator.feed_live_calib(self.sm['extrinsicsCalibration']) + if self.sm.updated["deviceMotion"]: + device_pose = Pose.from_live_pose(self.sm['deviceMotion']) + self.calibrated_pose = self.pose_calibrator.build_calibrated_pose(device_pose) + if time.monotonic() - self._param_update_time > 3: + self._update_params() + self._param_update_time = time.monotonic() + + def state_control(self): + CS = self.sm['carState'] + + # Update VehicleModel + lp = self.sm['vehicleParameters'] + x = max(lp.stiffnessFactor, 0.1) + sr = max(lp.steerRatio, 0.1) + self.VM.update_params(x, sr) + + steer_angle_without_offset = math.radians(CS.steeringAngleDeg - lp.angleOffsetDeg) + self.curvature = -self.VM.calc_curvature(steer_angle_without_offset, CS.vEgo, lp.roll) + self.roll_compensation = -self.VM.roll_compensation(lp.roll, CS.vEgo) + + lac_ext = getattr(self.LaC, "extension", None) + if self.CP.lateralTuning.which() == 'torque' and hasattr(self.LaC, "update_live_torque_params"): + torque_params = self.sm['lateralTorqueParameters'] + if self.sm.all_checks(['lateralTorqueParameters']) and torque_params.useParams: + self.LaC.update_live_torque_params(torque_params.latAccelFactorFiltered, torque_params.latAccelOffsetFiltered, + torque_params.frictionCoefficientFiltered) + + if lac_ext is not None: + lac_ext.update_limits() + + if lac_ext is not None: + lac_ext.update_model_v2(self.sm['modelV2']) + + if lac_ext is not None: + lac_ext.update_lateral_lag(self.CP.steerActuatorDelay) + + long_plan = self.sm['longitudinalPlan'] + model_v2 = self.sm['modelV2'] + + CC = car.CarControl.new_message() + CC.enabled = self.sm['selfdriveState'].enabled + + # Check which actuators can be enabled + standstill = abs(CS.vEgo) <= max(self.CP.minSteerSpeed, 0.3) or CS.standstill + + # Get which state to use for active lateral control + _lat_active = self.iq_lateral_allowed(self.sm) + + steering_fault_recovered = self.steering_fault_recovery.update(CS.steerFaultTemporary, CS.steerFaultPermanent) + CC.latActive = _lat_active and steering_fault_recovered and \ + (not standstill or self.CP.steerAtStandstill) + # long control may stay active through a gas override on platforms that opt in + override_longitudinal = any(e.overrideLongitudinal for e in self.sm['onroadEvents']) + long_through_override = self.CP_IQ.longActiveWithGasOverride and self.CP.openpilotLongitudinalControl + CC.longActive = CC.enabled and not getattr(CS, 'cruiseFaultLateralMode', False) and \ + (not override_longitudinal or long_through_override) and \ + (self.CP.openpilotLongitudinalControl or not self.CP_IQ.pcmCruiseSpeed) + + CC.leftBlinker, CC.rightBlinker = self.nav_turn_signal_controller.update( + self.sm['iqNavState'] if self.sm.alive['iqNavState'] else None, + self.navigation_enabled, + self.nav_exit_lane_change, + CC.latActive, + CS.leftBlinker, + CS.rightBlinker, + CS.vEgo, + CS.yawRate, + CS.steeringAngleDeg, + self.sm.alive['iqNavState'] and self.sm.valid['iqNavState'], + ) + + actuators = CC.actuators + actuators.longControlState = self.LoC.long_control_state + + if not CC.latActive: + self.LaC.reset() + + if not CC.longActive: + self.LoC.reset() + + # accel PID loop + pid_accel_limits = self.CI.get_pid_accel_limits(self.CP, self.CP_IQ, CS.vEgo, CS.vCruise * CV.KPH_TO_MS) + actuators.accel = float(self.LoC.update(CC.longActive, CS, long_plan.aTarget, long_plan.shouldStop, pid_accel_limits, + long_plan.leadDistance, long_plan.hasLead, gas_override=override_longitudinal)) + + # Steering PID loop and lateral MPC + # Reset desired curvature to current to avoid violating the limits on engage + if not CC.latActive: + new_desired_curvature = self.curvature + elif self.sm.valid['lateralManeuverPlan']: + new_desired_curvature = self.sm['lateralManeuverPlan'].desiredCurvature + else: + new_desired_curvature = model_v2.action.desiredCurvature + + self.smooth_steer_inactive_frames = 0 if CC.latActive else self.smooth_steer_inactive_frames + 1 + if self.is_curvature_car and self.enable_smooth_steer and self.smooth_steer_inactive_frames < SMOOTH_STEER_HOLD_FRAMES: + new_desired_curvature = self.smooth_steer.update(new_desired_curvature) + else: + self.smooth_steer.reset(new_desired_curvature) + + lat_accel_override = bool(CS.gasPressed) or bool(self.sm['iqState'].aol.active) + self.desired_curvature, curvature_limited = clip_curvature(CS.vEgo, self.desired_curvature, new_desired_curvature, lp.roll, lat_accel_override) + lat_delay = lateral_action_delay(self.params, self.CP, self.sm["lateralDelay"].lateralDelay) + LAT_SMOOTH_SECONDS + lookahead_curvature = None + if not self.sm.valid['lateralManeuverPlan']: + lookahead_curvature = get_lookahead_curvature(model_v2, CS.vEgo, lat_delay) + + actuators.curvature = self.desired_curvature + steer, steeringAngleDeg, lac_log = self.LaC.update(CC.latActive, CS, self.VM, lp, + self.steer_limited_by_safety, self.desired_curvature, + self.calibrated_pose, curvature_limited, lat_delay, lookahead_curvature) + if self.CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED): + actuators.torque = 0.0 + actuators.steeringAngleDeg = float(steeringAngleDeg) + else: + actuators.torque = float(steer) + actuators.steeringAngleDeg = float(steeringAngleDeg) + # Ensure no NaNs/Infs + for p in ACTUATOR_FIELDS: + attr = getattr(actuators, p) + if not isinstance(attr, Number): + continue + + if not math.isfinite(attr): + cloudlog.error(f"actuators.{p} not finite {actuators.to_dict()}") + setattr(actuators, p, 0.0) + + return CC, lac_log + + def publish(self, CC, lac_log): + CS = self.sm['carState'] + + CC.curvatureControllerActive = self.enable_curvature_controller + CC.steerLimited = self.steer_limited_by_safety + CC.forceRHDForBSM = self.force_rhd_for_bsm + CC.longComfortMode = self.enable_long_comfort_mode + + # Orientation and angle rates can be useful for carcontroller + # Only calibrated (car) frame is relevant for the carcontroller + CC.currentCurvature = self.curvature + CC.rollCompensation = self.roll_compensation + if self.calibrated_pose is not None: + CC.orientationNED = self.calibrated_pose.orientation.xyz.tolist() + CC.angularVelocity = self.calibrated_pose.angular_velocity.xyz.tolist() + + CC.cruiseControl.override = CC.enabled and not CC.longActive and (self.CP.openpilotLongitudinalControl or not self.CP_IQ.pcmCruiseSpeed) + dm_lockout = self.CP.pcmCruise and any(e.name == EventName.tooDistracted for e in self.sm['onroadEvents']) + CC.cruiseControl.cancel = CS.cruiseState.enabled and (not CC.enabled or not self.CP.pcmCruise) and not dm_lockout + CC.cruiseControl.resume = CC.enabled and CS.cruiseState.standstill and not self.sm['longitudinalPlan'].shouldStop + CC.cruiseControl.speedLimit = self.enable_speed_limit_control + CC.cruiseControl.speedLimitPredicative = self.enable_speed_limit_predicative + CC.cruiseControl.speedLimitPredReactToSL = self.enable_pred_react_to_speed_limits + CC.cruiseControl.speedLimitPredReactToCurves = self.enable_pred_react_to_curves + + hudControl = CC.hudControl + hudControl.setSpeed = float(CS.vCruiseCluster * CV.KPH_TO_MS) + hudControl.speedVisible = CC.enabled + hudControl.lanesVisible = CC.enabled + hudControl.leadVisible = self.sm['longitudinalPlan'].hasLead + hudControl.leadDistance = self.sm['longitudinalPlan'].leadDistance + hudControl.leadDistanceBars = self.sm['selfdriveState'].personality.raw + 1 + if self.sm['selfdriveState'].personality.raw == log.LongitudinalPersonality.relaxed: + hudControl.leadFollowTime = 1.75 + elif self.sm['selfdriveState'].personality.raw == log.LongitudinalPersonality.aggressive: + hudControl.leadFollowTime = 1.25 + else: + hudControl.leadFollowTime = 1.45 + hudControl.visualAlert = self.sm['selfdriveState'].alertHudVisual + hudControl.audibleAlert = self.sm['selfdriveState'].alertSound + hudControl.driverUnresponsive = self.sm['selfdriveState'].alertType.split('/', 1)[0] == 'driverUnresponsive' + + hudControl.rightLaneVisible = True + hudControl.leftLaneVisible = True + if self.sm.valid['driverAssistance']: + hudControl.leftLaneDepart = self.sm['driverAssistance'].leftLaneDeparture + hudControl.rightLaneDepart = self.sm['driverAssistance'].rightLaneDeparture + + if CC.latActive: + CO = self.sm['carOutput'] + if self.CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED): + self.steer_limited_by_safety = abs(CC.actuators.steeringAngleDeg - CO.actuatorsOutput.steeringAngleDeg) > \ + STEER_ANGLE_SATURATION_THRESHOLD + else: + self.steer_limited_by_safety = abs(CC.actuators.torque - CO.actuatorsOutput.torque) > 1e-2 + + # TODO: both controlsState and carControl valids should be set by + # sm.all_checks(), but this creates a circular dependency + + # controlsState + dat = messaging.new_message('controlsState') + dat.valid = CS.canValid + cs = dat.controlsState + + cs.curvature = self.curvature + cs.longitudinalPlanMonoTime = self.sm.logMonoTime['longitudinalPlan'] + cs.lateralPlanMonoTime = self.sm.logMonoTime['modelV2'] + cs.desiredCurvature = self.desired_curvature + cs.longControlState = self.LoC.long_control_state + cs.upAccelCmd = float(self.LoC.pid.p) + cs.uiAccelCmd = float(self.LoC.pid.i) + cs.ufAccelCmd = float(self.LoC.pid.f) + cs.forceDecel = bool((self.sm['driverMonitoringState'].awarenessStatus < 0.) or + (self.sm['selfdriveState'].state == State.softDisabling)) + + lat_tuning = self.CP.lateralTuning.which() + if self.CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED): + cs.lateralControlState.angleState = lac_log + elif lat_tuning == 'pid': + cs.lateralControlState.pidState = lac_log + elif lat_tuning == 'torque': + cs.lateralControlState.torqueState = lac_log + + self.pm.send('controlsState', dat) + + # carControl + cc_send = messaging.new_message('carControl') + cc_send.valid = CS.canValid + cc_send.carControl = CC + self.pm.send('carControl', cc_send) + + def _tail_work(self) -> int: + started_ns = time.monotonic_ns() + self.refresh_iq_params(self.sm) + self.publish_iq_state(self.sm, self.pm) + return (time.monotonic_ns() - started_ns) // 1000 + + def _missing_services(self) -> list[str]: + missing = [] + for service in CTRL_ESSENTIAL_SERVICES: + if not self.sm.alive[service] or not self.sm.freq_ok[service] or not self.sm.valid[service]: + missing.append(service) + return missing + + def _emit_perf_trace(self, frame_id: int, loop_dt_us: int, update_us: int, state_control_us: int, + publish_us: int, tail_work_us: int, rk_remaining_us: int) -> None: + missing_services = self._missing_services() + flags = 0 + if missing_services: + flags |= CTRL_FLAG_MISSING_INPUTS + if rk_remaining_us < 0: + flags |= CTRL_FLAG_RK_OVERRUN + + sample = PerfSample( + frame_id=frame_id, + loop_dt_us=loop_dt_us, + update_us=update_us, + state_control_us=state_control_us, + publish_us=publish_us, + tail_work_us=tail_work_us, + rk_remaining_us=rk_remaining_us, + flags=flags, + ) + self._perf_ring.push(sample) + + slow_phase = max(update_us, state_control_us, publish_us, tail_work_us) + if loop_dt_us < CTRL_LOOP_WARN_US and slow_phase < CTRL_PHASE_WARN_US and tail_work_us < CTRL_TAIL_WARN_US and flags == 0: + return + + if loop_dt_us >= CTRL_LOOP_SEVERE_US: + severity = "critical" + elif loop_dt_us >= CTRL_LOOP_BAD_US or rk_remaining_us < -10_000: + severity = "error" + else: + severity = "warning" + + detail = ( + f"update_us={update_us} state_control_us={state_control_us} publish_us={publish_us} " + f"tail_work_us={tail_work_us} rk_remaining_us={rk_remaining_us}" + ) + self._perf.emit( + "controlsd_slow_loop", + severity=severity, + frame_id=frame_id, + total_time_us=loop_dt_us, + rk_remaining_us=rk_remaining_us, + flags=flags, + samples=self._perf_ring.snapshot(), + missing_services=missing_services, + detail=detail, + min_interval_s=0.25, + ) + + def run(self): + rk = Ratekeeper(100, print_delay_threshold=None) + while True: + started_ns = time.monotonic_ns() + checkpoint_ns = started_ns + self.update() + update_us = (time.monotonic_ns() - checkpoint_ns) // 1000 + checkpoint_ns = time.monotonic_ns() + + CC, lac_log = self.state_control() + state_control_us = (time.monotonic_ns() - checkpoint_ns) // 1000 + checkpoint_ns = time.monotonic_ns() + + self.publish(CC, lac_log) + publish_us = (time.monotonic_ns() - checkpoint_ns) // 1000 + checkpoint_ns = time.monotonic_ns() + + tail_work_us = self._tail_work() + loop_dt_us = (time.monotonic_ns() - started_ns) // 1000 + rk_remaining_us = int(rk.remaining * 1_000_000) + self._emit_perf_trace(self.sm.frame, int(loop_dt_us), int(update_us), int(state_control_us), + int(publish_us), int(tail_work_us), rk_remaining_us) + rk.monitor_time() + + +def main(): + config_realtime_process(4, Priority.CTRL_HIGH) + lock_memory() + controls = Controls() + controls.run() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/controls/iq_controls_layer.py b/iqpilot/selfdrive/controls/iq_controls_layer.py new file mode 100644 index 000000000..f9064b2bf --- /dev/null +++ b/iqpilot/selfdrive/controls/iq_controls_layer.py @@ -0,0 +1,119 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +IQ.Pilot's controls-side extension layer. Controls mixes this in to gain the extra +sub/pub services, the IQ car-control message (radar blend, SLC set-speed sync, AOL +guidance continuity) and the lateral-engage gate, without touching stock controlsd. +""" +import time + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import log, custom + +from iqdbc.car import structs +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.car.enhanced_stock_longitudinal_control import build_iq_control_params_from_plan +from iqpilot.selfdrive.iqmodeld.models.inference_state import InferenceStateBase +from iqpilot.selfdrive.controls.lib.helpers.blinker_pause import IQSignalPauseController +from iqpilot.selfdrive.controls.lib.iq_dynamic.radar_manager import RadarManager + +_PARAM_REFRESH_S = 3.0 +_LEAD_FIELDS = ("dRel", "yRel", "vRel", "aRel", "vLead", "dPath", "vLat", "vLeadK", + "aLeadK", "fcw", "status", "aLeadTau", "modelProb", "radar", "radarTrackId") + + +class IQControlsLayer(InferenceStateBase): + def __init__(self, CP: structs.CarParams, params: Params): + InferenceStateBase.__init__(self) + self.CP = CP + self.params = params + self.blinker_pause_lateral = IQSignalPauseController() + + cloudlog.info("IQ controls layer waiting for IQCarParams") + self.CP_IQ = messaging.log_from_bytes(params.get("IQCarParams", block=True), custom.IQCarParams) + cloudlog.info("IQ controls layer got IQCarParams") + + self.iq_sub_services = ['radarState', 'iqState', 'iqPlan', 'iqNavState'] + self.iq_pub_services = ['iqCarControl'] + self.radar_manager = RadarManager(CP, params) + + self._next_param_refresh = 0.0 + self._needs_iq_lead_data = CP.brand == "hyundai" + self._maneuver_mode = params.get_bool("LateralManeuverMode") + self._sync_set_speed = self._want_set_speed_to_limit() + self._slc_limit_kph = None + self._slc_limit_pending_kph = None + + def _want_set_speed_to_limit(self) -> bool: + try: + return self.params.get_bool("SLCSetSpeedToLimit") + except Exception: + return False + + # --- periodic param refresh (throttled to a few Hz) -------------------------- + def refresh_iq_params(self, sm: messaging.SubMaster) -> None: + now = time.monotonic() + if now - self._next_param_refresh <= _PARAM_REFRESH_S: + return + self.blinker_pause_lateral.get_params() + if self.CP.lateralTuning.which() == 'torque': + self.lat_delay = sm["lateralDelay"].lateralDelay + self._sync_set_speed = self._want_set_speed_to_limit() + self.radar_manager.read_params() + self._next_param_refresh = now + + # --- lateral engage gate ----------------------------------------------------- + def iq_lateral_allowed(self, sm: messaging.SubMaster) -> bool: + if self.blinker_pause_lateral.update(sm['carState']): + return False + + aol = sm['iqState'].aol + stock_active = bool(sm['selfdriveState'].active) + if self._maneuver_mode: + return stock_active or bool(aol.available and aol.active) + if aol.available: + return bool(aol.active) + return stock_active + + @staticmethod + def _lead_snapshot(ld: log.RadarState.LeadData) -> dict: + return {field: getattr(ld, field) for field in _LEAD_FIELDS} + + # --- build + publish the IQ car-control message ------------------------------ + def _compose_iq_carcontrol(self, sm: messaging.SubMaster) -> custom.IQCarControl: + CC_IQ = custom.IQCarControl.new_message() + lp = sm['vehicleParameters'] + CC_IQ.angleOffsetDeg = float(getattr(lp, 'angleOffsetDeg', 0.0)) + CC_IQ.aol = sm['iqState'].aol + + if self._needs_iq_lead_data: + CC_IQ.leadOne = self._lead_snapshot(sm['radarState'].leadOne) + CC_IQ.leadTwo = self._lead_snapshot(sm['radarState'].leadTwo) + + if self.CP.openpilotLongitudinalControl: + cruise = getattr(sm['carState'], 'cruiseState', None) + set_speed_ms = float(max(getattr(cruise, 'speedCluster', 0.0), getattr(cruise, 'speed', 0.0), 0.0)) + set_speed_kph = set_speed_ms * CV.MS_TO_KPH + if self._sync_set_speed: + CC_IQ.params, self._slc_limit_kph, self._slc_limit_pending_kph = build_iq_control_params_from_plan( + self.CP, sm['iqPlan'], bool(sm['selfdriveState'].enabled), set_speed_kph, + self._slc_limit_kph, self._slc_limit_pending_kph) + else: + self._slc_limit_kph = self._slc_limit_pending_kph = None + self.radar_manager.update(CC_IQ, sm, set_speed_kph) + return CC_IQ + + @staticmethod + def _emit(CC_IQ: custom.IQCarControl, sm: messaging.SubMaster, pm: messaging.PubMaster) -> None: + envelope = messaging.new_message('iqCarControl') + envelope.valid = sm['carState'].canValid + envelope.iqCarControl = CC_IQ + pm.send('iqCarControl', envelope) + + def publish_iq_state(self, sm: messaging.SubMaster, pm: messaging.PubMaster) -> None: + fresh = sm.updated['iqState'] or sm.updated['iqPlan'] or (self._needs_iq_lead_data and sm.updated['radarState']) + if not fresh: + return + self._emit(self._compose_iq_carcontrol(sm), sm, pm) diff --git a/iqpilot/selfdrive/controls/lib/__init__.py b/iqpilot/selfdrive/controls/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/controls/lib/curvature_lookahead.py b/iqpilot/selfdrive/controls/lib/curvature_lookahead.py new file mode 100644 index 000000000..8547e2177 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/curvature_lookahead.py @@ -0,0 +1,21 @@ +import math + +from iqpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N, get_curvature_from_plan +from iqpilot.selfdrive.iqmodeld.config import ModelConstants + + +LOOKAHEAD_SECONDS = 0.20 + + +def get_lookahead_curvature(model_v2, v_ego: float, lat_delay: float) -> float | None: + try: + yaws = model_v2.orientation.z + yaw_rates = model_v2.orientationRate.z + if len(yaws) < CONTROL_N or len(yaw_rates) < CONTROL_N: + return None + if not all(math.isfinite(value) for value in yaws) or not all(math.isfinite(value) for value in yaw_rates): + return None + horizon = max(0.0, lat_delay) + LOOKAHEAD_SECONDS + return get_curvature_from_plan(yaws, yaw_rates, ModelConstants.T_IDXS, v_ego, horizon) + except (AttributeError, TypeError, ValueError): + return None diff --git a/iqpilot/selfdrive/controls/lib/custom_stop_distance.py b/iqpilot/selfdrive/controls/lib/custom_stop_distance.py new file mode 100644 index 000000000..3ff3ed176 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/custom_stop_distance.py @@ -0,0 +1,111 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Original concept ("Increased Stop Distance") by SpysyWeeb (github.com/SpysyWeeb), ported to +IQ.Pilot and made bidirectional. + +Custom Stop Distance: nudge how far back IQ.Pilot stops behind a stopped lead vehicle or a +model-held stop (red light). Independent of IQ Force Stops -- works whether Force Stops is on +or off. + +IQCustomStopDistance (meters, -2..2): positive stops further back, negative settles in closer. +0 is stock. + +Two mechanisms share the param: + +- Lead stops (radard): the reported lead distance is nudged by the offset, faded back out as the + lead gets up to speed so normal following distance is unaffected. Works in chill and end-to-end. + +- Model-held stops (planner, end-to-end mode): when the model's trajectory ends at ~zero velocity + (it plans to remain stopped, e.g. a red light), a positive offset brakes toward a point short of + its predicted stop and holds there instead of creeping forward -- it only ever adds braking on + top of the model's own plan, never relaxes below it. A negative offset is a no-op here: there's + no safe way to coax the car past the model's own conservative stop point this way. +""" +import numpy as np + +from iqdbc.car.interfaces import ACCEL_MIN +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.iqmodeld.config import ModelConstants + +CUSTOM_STOP_DISTANCE_PARAM = "IQCustomStopDistance" +MIN_DISTANCE_M = -2 +MAX_DISTANCE_M = 2 + +# Fade the offset back out as the lead gets up to speed +STOPPED_DISTANCE_FADE_BP = [0., 3.] # m/s, lead speed +MIN_ADJUSTED_D_REL = 1.0 # m + +E2E_STOP_PLAN_VEL_THRESHOLD = 1.0 # m/s, model plan ending below this implies a held stop +E2E_STOP_MIN_BRAKING = -0.1 # m/s^2, only deepen braking the model has already started +E2E_STOP_MIN_DIST = 2.0 # m, never target a stop point closer than this +E2E_STOP_HOLD_MAX_V = 0.5 # m/s, below this the car is considered stopped +E2E_STOP_HOLD_BUFFER = 2.0 # m, hold until the model's stop point moves beyond offset + buffer + + +def get_sanitize_int_param(key, min_val, max_val, params): + stored = params.get(key, return_default=True) + bounded = min(max(stored, min_val), max_val) + if bounded != stored: + params.put(key, bounded) + return bounded + + +class CustomStopDistance: + def __init__(self): + self.params = Params() + self.frame = 0 + self.distance = 0. + self.read_params() + + def read_params(self) -> None: + self.distance = float(get_sanitize_int_param(CUSTOM_STOP_DISTANCE_PARAM, MIN_DISTANCE_M, MAX_DISTANCE_M, self.params)) + + def update(self) -> None: + if self.frame % int(3 / DT_MDL) == 0: + self.read_params() + self.frame += 1 + + def apply_lead(self, lead_dict: dict) -> dict: + if self.distance == 0. or not lead_dict.get('status', False): + return lead_dict + + offset = self.distance * float(np.interp(lead_dict['vLead'], STOPPED_DISTANCE_FADE_BP, [1., 0.])) + adjusted = lead_dict['dRel'] - offset + if self.distance > 0: + # stop further back: never reduce the reported distance below the floor, and never report further than reality + lead_dict['dRel'] = min(lead_dict['dRel'], max(adjusted, MIN_ADJUSTED_D_REL)) + else: + # stop closer in: never report closer than reality + lead_dict['dRel'] = max(lead_dict['dRel'], adjusted) + return lead_dict + + def adjust_e2e_stop(self, a_target: float, should_stop: bool, v_ego: float, model_msg) -> tuple[float, bool]: + if self.distance <= 0.: + return a_target, should_stop + + x = model_msg.position.x + v = model_msg.velocity.x + if len(x) != ModelConstants.IDX_N or len(v) != ModelConstants.IDX_N: + return a_target, should_stop + + # only stops the model plans to hold (red lights) can be shifted -- stop signs are left alone: + # forcing an early stop makes the model treat the stop as completed and roll through the sign + if float(v[-1]) > E2E_STOP_PLAN_VEL_THRESHOLD: + return a_target, should_stop + + stop_distance = float(x[-1]) + + if v_ego < E2E_STOP_HOLD_MAX_V: + # stopped short of the model's stop point: hold instead of creeping up to it + if stop_distance <= self.distance + E2E_STOP_HOLD_BUFFER: + should_stop = True + elif a_target < E2E_STOP_MIN_BRAKING: + # deepen braking that has already started, targeting a stop short of the model's stop point + adjusted_distance = max(stop_distance - self.distance, E2E_STOP_MIN_DIST) + a_required = max(-(v_ego ** 2) / (2 * adjusted_distance), ACCEL_MIN) + if a_required < a_target: + a_target = float(a_required) + + return a_target, should_stop diff --git a/iqpilot/selfdrive/controls/lib/desire_helper.py b/iqpilot/selfdrive/controls/lib/desire_helper.py new file mode 100644 index 000000000..ce77ab134 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/desire_helper.py @@ -0,0 +1,294 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +from iqpilot.cereal import car, custom, log + +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.controls.lib.helpers.lane_change import ( + IQLaneSwapController, + AutoLaneChangeMode, + NavExitLaneChangeController, +) +from iqpilot.selfdrive.controls.lib.helpers.lateral_edge_guard import LateralEdgeGuard +from iqpilot.selfdrive.controls.lib.helpers.lane_turn import IQNavTurnController + +LaneChangeState = log.LaneChangeState +LaneChangeDirection = log.LaneChangeDirection +TurnDirection = custom.IQTurnSignalDirection +LateralEdgeBlock = custom.IQLateralEdgeBlock +NavManeuverPhase = custom.IQNavState.ManeuverPhase + +LANE_CHANGE_SPEED_MIN = 20 * CV.MPH_TO_MS +LANE_CHANGE_TIME_MAX = 10.0 +TURN_DESIRE_STOP_HOLD_TIME = 3.4 +TURN_DESIRE_STOP_GAP_TIME = 0.2 +TURN_DESIRE_STOP_CYCLE_TIME = TURN_DESIRE_STOP_HOLD_TIME + TURN_DESIRE_STOP_GAP_TIME +TURN_DESIRE_CYCLE_SPEED_MAX = 5 * CV.MPH_TO_MS +TURN_DESIRE_COMMIT_YAW_RATE = 0.08 + +_LANE_CHANGE_DESIRES = { + (LaneChangeDirection.none, LaneChangeState.off): log.Desire.none, + (LaneChangeDirection.none, LaneChangeState.preLaneChange): log.Desire.none, + (LaneChangeDirection.none, LaneChangeState.laneChangeStarting): log.Desire.none, + (LaneChangeDirection.none, LaneChangeState.laneChangeFinishing): log.Desire.none, + (LaneChangeDirection.left, LaneChangeState.off): log.Desire.none, + (LaneChangeDirection.left, LaneChangeState.preLaneChange): log.Desire.none, + (LaneChangeDirection.left, LaneChangeState.laneChangeStarting): log.Desire.laneChangeLeft, + (LaneChangeDirection.left, LaneChangeState.laneChangeFinishing): log.Desire.laneChangeLeft, + (LaneChangeDirection.right, LaneChangeState.off): log.Desire.none, + (LaneChangeDirection.right, LaneChangeState.preLaneChange): log.Desire.none, + (LaneChangeDirection.right, LaneChangeState.laneChangeStarting): log.Desire.laneChangeRight, + (LaneChangeDirection.right, LaneChangeState.laneChangeFinishing): log.Desire.laneChangeRight, +} + +_TURN_DESIRES = { + TurnDirection.none: log.Desire.none, + TurnDirection.turnLeft: log.Desire.turnLeft, + TurnDirection.turnRight: log.Desire.turnRight, +} + +_STOP_CYCLING_TURN_DESIRES = { + log.Desire.turnLeft, + log.Desire.turnRight, +} + + +def turn_desire(turn_direction) -> log.Desire: + return _TURN_DESIRES[getattr(turn_direction, "raw", turn_direction)] + + +def _direction_from_blinkers(carstate) -> int: + if carstate.leftBlinker: + return LaneChangeDirection.left + if carstate.rightBlinker: + return LaneChangeDirection.right + return LaneChangeDirection.none + + +def _steering_nudge_matches(carstate, direction: int) -> bool: + if not carstate.steeringPressed: + return False + return ( + (direction == LaneChangeDirection.left and carstate.steeringTorque > 0) or + (direction == LaneChangeDirection.right and carstate.steeringTorque < 0) + ) + + +def _blindspot_matches(carstate, direction: int) -> bool: + return ( + (direction == LaneChangeDirection.left and carstate.leftBlindspot) or + (direction == LaneChangeDirection.right and carstate.rightBlindspot) + ) + + +def _read_enable_bsm() -> bool: + try: + with car.CarParams.from_bytes(Params().get("CarParams")) as cp: + return bool(cp.enableBsm) + except Exception: + return False + + +class DesireHelper: + def __init__(self): + self.lane_change_state = LaneChangeState.off + self.lane_change_direction = LaneChangeDirection.none + self.lane_change_timer = 0.0 + self.lane_change_ll_prob = 1.0 + self.prev_one_blinker = False + self.prev_nav_exit_active = False + self.desire = log.Desire.none + + self.alc = IQLaneSwapController(self) + self.lane_turn_controller = IQNavTurnController(self) + self.nav_exit = NavExitLaneChangeController(_read_enable_bsm()) + self.lateral_edge_guard = LateralEdgeGuard() + self.lateral_edge_block = LateralEdgeBlock.none + self.lane_turn_direction = TurnDirection.none + self.nav_turn_direction = TurnDirection.none + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + self.turn_desire_cycle_input = log.Desire.none + self.turn_desire_committed = False + + @staticmethod + def get_lane_change_direction(carstate): + return _direction_from_blinkers(carstate) + + @staticmethod + def _nav_turn_desire(nav_state): + if nav_state is None or not getattr(nav_state, "active", False): + return TurnDirection.none + if getattr(nav_state, "maneuverPhase", NavManeuverPhase.none) != NavManeuverPhase.turnActive: + return TurnDirection.none + if not getattr(nav_state, "shouldSendTurnDesire", False): + return TurnDirection.none + return getattr(nav_state, "turnDesireDirection", TurnDirection.none) + + def _clear_lane_change(self) -> None: + self.lane_change_state = LaneChangeState.off + self.lane_change_direction = LaneChangeDirection.none + + def _refresh_turn_overrides(self, carstate, nav_state) -> bool: + speed_mps = carstate.vEgo + self.lane_turn_controller.update_params() + self.lane_turn_controller.update_lane_turn( + blindspot_left=carstate.leftBlindspot, + blindspot_right=carstate.rightBlindspot, + left_blinker=carstate.leftBlinker, + right_blinker=carstate.rightBlinker, + v_ego=speed_mps, + ) + self.lane_turn_direction = self.lane_turn_controller.get_turn_direction() + self.nav_turn_direction = self._nav_turn_desire(nav_state) + + self.nav_exit.update_params() + self.nav_exit.update(nav_state, carstate) + return bool(self.nav_exit.active) + + def _reset_required(self, lateral_active: bool, nav_exit_active: bool) -> bool: + timed_out = self.lane_change_timer > LANE_CHANGE_TIME_MAX + feature_disabled = self.alc.lane_change_set_timer == AutoLaneChangeMode.OFF and not nav_exit_active + return (not lateral_active) or timed_out or feature_disabled + + def _begin_from_idle(self, one_blinker: bool, nav_exit_active: bool, below_speed: bool) -> None: + if below_speed: + return + if one_blinker and not self.prev_one_blinker: + self.lane_change_state = LaneChangeState.preLaneChange + self.lane_change_direction = _direction_from_blinkers(self._last_carstate) + self.lane_change_ll_prob = 1.0 + return + if nav_exit_active and not self.prev_nav_exit_active: + self.lane_change_state = LaneChangeState.preLaneChange + self.lane_change_direction = self.nav_exit.direction + self.lane_change_ll_prob = 1.0 + + def _refresh_requested_direction(self, one_blinker: bool, nav_exit_active: bool) -> None: + if one_blinker: + self.lane_change_direction = _direction_from_blinkers(self._last_carstate) + elif nav_exit_active: + self.lane_change_direction = self.nav_exit.direction + + def _step_pre_lane_change(self, one_blinker: bool, nav_exit_active: bool, below_speed: bool) -> None: + self._refresh_requested_direction(one_blinker, nav_exit_active) + blindspot_detected = _blindspot_matches(self._last_carstate, self.lane_change_direction) + self.lateral_edge_block = self.lateral_edge_guard.block_for_direction(self.lane_change_direction) + lateral_edge_blocked = self.lateral_edge_block != LateralEdgeBlock.none + steering_ready = _steering_nudge_matches(self._last_carstate, self.lane_change_direction) + nav_auto_start = nav_exit_active and self.nav_exit.auto_allowed + + self.alc.update_lane_change(blindspot_detected=blindspot_detected, brake_pressed=self._last_carstate.brakePressed) + allowed_to_launch = steering_ready or self.alc.auto_lane_change_allowed or nav_auto_start + + if (not (one_blinker or nav_exit_active)) or below_speed: + self._clear_lane_change() + elif allowed_to_launch and not blindspot_detected and not lateral_edge_blocked: + self.lane_change_state = LaneChangeState.laneChangeStarting + + def _step_lane_change_starting(self, lane_change_prob: float) -> None: + self.lane_change_ll_prob = max(self.lane_change_ll_prob - (2.0 * DT_MDL), 0.0) + if lane_change_prob < 0.02 and self.lane_change_ll_prob < 0.01: + self.lane_change_state = LaneChangeState.laneChangeFinishing + + def _step_lane_change_finishing(self, one_blinker: bool) -> None: + self.lane_change_ll_prob = min(self.lane_change_ll_prob + DT_MDL, 1.0) + if self.lane_change_ll_prob <= 0.99: + return + self.lane_change_direction = LaneChangeDirection.none + self.lane_change_state = LaneChangeState.preLaneChange if one_blinker else LaneChangeState.off + + def _advance_lane_change_machine(self, one_blinker: bool, nav_exit_active: bool, below_speed: bool, lane_change_prob: float) -> None: + if self.lane_change_state == LaneChangeState.off: + self._begin_from_idle(one_blinker, nav_exit_active, below_speed) + return + if self.lane_change_state == LaneChangeState.preLaneChange: + self._step_pre_lane_change(one_blinker, nav_exit_active, below_speed) + return + if self.lane_change_state == LaneChangeState.laneChangeStarting: + self._step_lane_change_starting(lane_change_prob) + return + if self.lane_change_state == LaneChangeState.laneChangeFinishing: + self._step_lane_change_finishing(one_blinker) + + def _update_timer(self) -> None: + if self.lane_change_state in (LaneChangeState.off, LaneChangeState.preLaneChange): + self.lane_change_timer = 0.0 + else: + self.lane_change_timer += DT_MDL + + def _clear_turn_desire_stop_cycle(self) -> None: + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + self.turn_desire_cycle_input = log.Desire.none + self.turn_desire_committed = False + + def _cycle_turn_desire_when_stopped(self, desired_output: log.Desire) -> log.Desire: + if desired_output not in _STOP_CYCLING_TURN_DESIRES: + self._clear_turn_desire_stop_cycle() + return desired_output + + if desired_output != self.turn_desire_cycle_input: + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + self.turn_desire_cycle_input = desired_output + self.turn_desire_committed = False + + if abs(getattr(self._last_carstate, "yawRate", 0.0)) >= TURN_DESIRE_COMMIT_YAW_RATE: + self.turn_desire_committed = True + + if self.turn_desire_committed: + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + return desired_output + + if self._last_carstate.vEgo > TURN_DESIRE_CYCLE_SPEED_MAX: + self.turn_desire_stop_timer = 0.0 + self.turn_desire_stop_active = False + return desired_output + + if not self.turn_desire_stop_active: + self.turn_desire_stop_active = True + self.turn_desire_stop_timer = 0.0 + + cycle_phase = self.turn_desire_stop_timer % TURN_DESIRE_STOP_CYCLE_TIME + self.turn_desire_stop_timer += DT_MDL + if cycle_phase >= TURN_DESIRE_STOP_HOLD_TIME: + return log.Desire.none + return desired_output + + def _pick_desire_output(self) -> None: + desired_output = log.Desire.none + if self.nav_turn_direction != TurnDirection.none: + desired_output = turn_desire(self.nav_turn_direction) + elif self.lane_turn_direction != TurnDirection.none: + desired_output = turn_desire(self.lane_turn_direction) + else: + desired_output = _LANE_CHANGE_DESIRES[(self.lane_change_direction, self.lane_change_state)] + + self.desire = self._cycle_turn_desire_when_stopped(desired_output) + + def update(self, carstate, lateral_active, lane_change_prob, nav_state=None, modeldata=None, radar_state=None): + self._last_carstate = carstate + self.lateral_edge_guard.update(modeldata, carstate.vEgo, DT_MDL) + self.lateral_edge_block = LateralEdgeBlock.none + one_blinker = carstate.leftBlinker != carstate.rightBlinker + below_speed = carstate.vEgo < LANE_CHANGE_SPEED_MIN + nav_exit_active = self._refresh_turn_overrides(carstate, nav_state) + + self.alc.update_params() + if self._reset_required(lateral_active, nav_exit_active): + self._clear_lane_change() + else: + self._advance_lane_change_machine(one_blinker, nav_exit_active, below_speed, lane_change_prob) + + self._update_timer() + self.prev_one_blinker = one_blinker and lateral_active + self.prev_nav_exit_active = nav_exit_active + self.alc.update_state() + self._pick_desire_output() diff --git a/iqpilot/selfdrive/controls/lib/drive_helpers.py b/iqpilot/selfdrive/controls/lib/drive_helpers.py new file mode 100644 index 000000000..c89027b03 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/drive_helpers.py @@ -0,0 +1,80 @@ +import numpy as np +from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY +from iqpilot.common.realtime import DT_CTRL, DT_MDL + +MIN_SPEED = 1.0 +CONTROL_N = 17 +CAR_ROTATION_RADIUS = 0.0 +# This is a turn radius smaller than most cars can achieve +MAX_CURVATURE = 0.4 +MAX_VEL_ERR = 5.0 # m/s + +MAX_LATERAL_JERK = 5.0 # m/s^3 +MAX_LATERAL_ACCEL_NO_ROLL = 5.0 # m/s^2 +MAX_LATERAL_ACCEL_NO_ROLL_OVERRIDE = 5.0 # m/s^2 +DEFAULT_STOPPING_SPEED = 0.25 # m/s + + +def should_stop(v_ego: float, a_target: float, stopping_speed: float = DEFAULT_STOPPING_SPEED) -> bool: + return bool(v_ego < stopping_speed and a_target < 0.1) + + +def clamp(val, min_val, max_val): + clamped_val = float(np.clip(val, min_val, max_val)) + return clamped_val, clamped_val != val + +def smooth_value(val, prev_val, tau, dt=DT_MDL): + alpha = 1 - np.exp(-dt/tau) if tau > 0 else 1 + return alpha * val + (1 - alpha) * prev_val + +# "Model smoothing": when the policy's own predicted uncertainty (plan_stds) for the +# 1s-ahead lateral position spikes, temporarily lengthen the desiredCurvature smoothing +# time constant so a noisy/uncertain model output doesn't jerk the wheel. +MODEL_SMOOTHING_STD_LOW = 0.15 # m, plan y_std at 1s below which no extra smoothing is added +MODEL_SMOOTHING_STD_HIGH = 0.25 # m, plan y_std at 1s at/above which the full max_extra_seconds is added +MODEL_SMOOTHING_MAX_TOTAL_SEC = 0.60 # hard ceiling on base + dynamic lat smoothing seconds + +def dynamic_lat_smooth_extra_seconds(y_std_1s: float, max_extra_seconds: float) -> float: + if max_extra_seconds <= 0.0: + return 0.0 + return float(np.interp(y_std_1s, [MODEL_SMOOTHING_STD_LOW, MODEL_SMOOTHING_STD_HIGH], [0.0, max_extra_seconds])) + +def clip_curvature(v_ego, prev_curvature, new_curvature, roll, override=False) -> tuple[float, bool]: + # This function respects ISO lateral jerk and acceleration limits + a max curvature + v_ego = max(v_ego, MIN_SPEED) + max_curvature_rate = MAX_LATERAL_JERK / (v_ego ** 2) # inexact calculation, check https://github.com/commaai/openpilot/pull/24755 + new_curvature = np.clip(new_curvature, + prev_curvature - max_curvature_rate * DT_CTRL, + prev_curvature + max_curvature_rate * DT_CTRL) + + max_lat_accel_no_roll = MAX_LATERAL_ACCEL_NO_ROLL_OVERRIDE if override else MAX_LATERAL_ACCEL_NO_ROLL + roll_compensation = roll * ACCELERATION_DUE_TO_GRAVITY + max_lat_accel = max_lat_accel_no_roll + roll_compensation + min_lat_accel = -max_lat_accel_no_roll + roll_compensation + new_curvature, limited_accel = clamp(new_curvature, min_lat_accel / v_ego ** 2, max_lat_accel / v_ego ** 2) + + new_curvature, limited_max_curv = clamp(new_curvature, -MAX_CURVATURE, MAX_CURVATURE) + return float(new_curvature), limited_accel or limited_max_curv + + +def get_accel_from_plan(speeds, accels, t_idxs, action_t=DT_MDL, stopping_speed=DEFAULT_STOPPING_SPEED): + if len(speeds) == len(t_idxs): + v_now = speeds[0] + a_now = accels[0] + v_target = np.interp(action_t, t_idxs, speeds) + a_target = 2 * (v_target - v_now) / (action_t) - a_now + else: + v_now = 0.0 + v_target = 0.0 + a_target = 0.0 + return a_target, should_stop(v_now, a_target, stopping_speed) + +def curv_from_psis(psi_target, psi_rate, vego, action_t): + vego = np.clip(vego, MIN_SPEED, np.inf) + curv_from_psi = psi_target / (vego * action_t) + return 2*curv_from_psi - psi_rate / vego + +def get_curvature_from_plan(yaws, yaw_rates, t_idxs, vego, action_t): + psi_target = np.interp(action_t, t_idxs, yaws) + psi_rate = yaw_rates[0] + return curv_from_psis(psi_target, psi_rate, vego, action_t) diff --git a/iqpilot/selfdrive/controls/lib/helpers/__init__.py b/iqpilot/selfdrive/controls/lib/helpers/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/selfdrive/controls/lib/helpers/blinker_pause.py b/iqpilot/selfdrive/controls/lib/helpers/blinker_pause.py new file mode 100644 index 000000000..649c37a75 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/blinker_pause.py @@ -0,0 +1,82 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.cereal import car + +from iqpilot.common.constants import CV +from iqpilot.common.params import Params + + +class SignalPauseEngine: + _KEY_ON = "IQBlinkerPauseLateral" + _KEY_UNIT = "IsMetric" + _KEY_GATE = "IQBlinkerMinLateralSpeed" + + def __init__(self): + self._kv = Params() + self._state = {"on": False, "metric": False, "gate": 0.0} + self.reload_setup() + + @staticmethod + def _one_signal(cs: car.CarState) -> bool: + return bool(cs.leftBlinker) ^ bool(cs.rightBlinker) + + @staticmethod + def _as_float(raw) -> float: + try: + return float(raw) if raw is not None else 0.0 + except (TypeError, ValueError): + return 0.0 + + def _pull_setup(self) -> None: + self._state["on"] = self._kv.get_bool(self._KEY_ON) + self._state["metric"] = self._kv.get_bool(self._KEY_UNIT) + self._state["gate"] = self._as_float(self._kv.get(self._KEY_GATE)) + + def _gate_mps(self) -> float: + factor = CV.KPH_TO_MS if self._state["metric"] else CV.MPH_TO_MS + return self._state["gate"] * factor + + def reload_setup(self) -> None: + self._pull_setup() + + def heartbeat(self) -> None: + self._pull_setup() + + def is_paused(self, cs: car.CarState) -> bool: + return bool(self._state["on"] and self._one_signal(cs) and cs.vEgo < self._gate_mps()) + + @property + def enabled(self): + return self._state["on"] + + @enabled.setter + def enabled(self, value): + self._state["on"] = bool(value) + + @property + def is_metric(self): + return self._state["metric"] + + @is_metric.setter + def is_metric(self, value): + self._state["metric"] = bool(value) + + @property + def min_speed(self): + return self._state["gate"] + + @min_speed.setter + def min_speed(self, value): + self._state["gate"] = float(value) + + +class IQSignalPauseController(SignalPauseEngine): + def __init__(self): + super().__init__() + + def get_params(self) -> None: + self.reload_setup() + + def update(self, cs: car.CarState) -> bool: + return self.is_paused(cs) diff --git a/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py b/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py new file mode 100644 index 000000000..5cc183ad9 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py @@ -0,0 +1,143 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from iqpilot.cereal import messaging, custom + +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.selfdrived.iq_events import IQEvents + +PARAM_PATH = "EndToEndAlert" +PARAM_LEAD = "EndToEndLeadAlert" +PARAM_STRIDE_S = 2.0 + +SETTLE_S = 1.0 +CONFIRM_S = 0.4 +ROLL_MPS = 0.3 + +HORIZON_TAIL = 5 +PATH_SPEED_MPS = 3.0 + +LEAD_QUEUE_M = 12.0 +LEAD_SPEED_MPS = 1.0 +LEAD_GAP_M = 0.5 + + +class _Confirm: + def __init__(self, window_s: float): + self._window = window_s + self._held = 0.0 + self._spent = False + + def clear(self) -> None: + self._held = 0.0 + self._spent = False + + def poll(self, holds: bool) -> bool: + if self._spent: + return False + self._held = self._held + DT_MDL if holds else 0.0 + if self._held < self._window: + return False + self._spent = True + return True + + +class _Dwell: + def __init__(self): + self.seconds = 0.0 + self.lead_floor = float('inf') + + def clear(self) -> None: + self.seconds = 0.0 + self.lead_floor = float('inf') + + def tick(self, lead_range: float | None) -> None: + self.seconds += DT_MDL + if lead_range is not None: + self.lead_floor = min(self.lead_floor, lead_range) + + @property + def settled(self) -> bool: + return self.seconds >= SETTLE_S + + @property + def queued(self) -> bool: + return self.lead_floor < LEAD_QUEUE_M + + +class EndToEndAlertEngine: + def __init__(self): + self._params = Params() + self._on = {"path": False, "lead": False} + self._elapsed_since_read = PARAM_STRIDE_S + self._dwell = _Dwell() + self._confirm = {"path": _Confirm(CONFIRM_S), "lead": _Confirm(CONFIRM_S)} + self._fired = {"path": False, "lead": False} + + def _refresh_params(self) -> None: + self._elapsed_since_read += DT_MDL + if self._elapsed_since_read < PARAM_STRIDE_S: + return + self._elapsed_since_read = 0.0 + self._on["path"] = self._params.get_bool(PARAM_PATH) + self._on["lead"] = self._params.get_bool(PARAM_LEAD) + + @staticmethod + def _car_holds_long(sm: messaging.SubMaster) -> bool: + # AOL steers without raising selfdriveState.enabled, so the pair reads as long authority + return bool(sm['selfdriveState'].enabled or sm['carState'].cruiseState.enabled) + + @staticmethod + def _halted(cs) -> bool: + return bool(cs.standstill) or abs(cs.vEgo) < ROLL_MPS + + @staticmethod + def _horizon_speed(model) -> float: + # capnp list readers reject slices + samples = model.velocity.x + count = len(samples) + if count < HORIZON_TAIL: + return 0.0 + return sum(samples[i] for i in range(count - HORIZON_TAIL, count)) / HORIZON_TAIL + + def _rearm(self) -> None: + self._dwell.clear() + for gate in self._confirm.values(): + gate.clear() + + def update(self, sm: messaging.SubMaster, iq_events: IQEvents) -> None: + self._refresh_params() + self._fired["path"] = self._fired["lead"] = False + + cs = sm['carState'] + lead = sm['radarState'].leadOne + lead_range = float(lead.dRel) if lead.status else None + + if not self._halted(cs) or cs.gasPressed or self._car_holds_long(sm): + self._rearm() + return + + self._dwell.tick(lead_range) + if not self._dwell.settled: + return + + if self._on["path"] and lead_range is None: + opened = self._horizon_speed(sm['modelV2']) > PATH_SPEED_MPS + self._fired["path"] = self._confirm["path"].poll(opened) + + if self._on["lead"] and lead_range is not None and self._dwell.queued: + pulling = lead.vLead > LEAD_SPEED_MPS and (lead_range - self._dwell.lead_floor) > LEAD_GAP_M + self._fired["lead"] = self._confirm["lead"].poll(pulling) + + if self._fired["path"] or self._fired["lead"]: + iq_events.add(custom.IQOnroadEvent.EventName.e2eChime) + + @property + def path_alert(self) -> bool: + return self._fired["path"] + + @property + def lead_alert(self) -> bool: + return self._fired["lead"] diff --git a/iqpilot/selfdrive/controls/lib/helpers/lane_change.py b/iqpilot/selfdrive/controls/lib/helpers/lane_change.py new file mode 100644 index 000000000..58d826647 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/lane_change.py @@ -0,0 +1,293 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.cereal import custom, log + +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL + +NAV_EXIT_COMMIT_DISTANCE = 500.0 # m before a route exit to begin moving into the exit lane +_ManeuverType = custom.IQNavState.ManeuverType +_NavDirection = custom.NavDirection + + +class LaneSwapPreset: + DISABLED = -1 + STEERING_NUDGE = 0 + DIRECT = 1 + DELAY_HALF = 2 + DELAY_ONE = 3 + DELAY_TWO = 4 + DELAY_THREE = 5 + OFF = DISABLED + NUDGE = STEERING_NUDGE + NUDGELESS = DIRECT + HALF_SECOND = DELAY_HALF + ONE_SECOND = DELAY_ONE + TWO_SECONDS = DELAY_TWO + THREE_SECONDS = DELAY_THREE + + +PRESET_SECONDS = { + LaneSwapPreset.DISABLED: 0.0, + LaneSwapPreset.STEERING_NUDGE: 0.0, + LaneSwapPreset.DIRECT: 0.05, + LaneSwapPreset.DELAY_HALF: 0.5, + LaneSwapPreset.DELAY_ONE: 1.0, + LaneSwapPreset.DELAY_TWO: 2.0, + LaneSwapPreset.DELAY_THREE: 3.0, +} + +LANE_SWAP_SECONDS = dict(PRESET_SECONDS) +BLINDSPOT_WAIT_OFFSET = -1 + + +class LaneSwapEngine: + def __init__(self, desire_hub): + self._hub = desire_hub + self._kv = Params() + self._mem = { + "sec": 0.0, + "tick": 0, + "gate": 0.0, + "preset": self._kv.get("IQLaneChangeTimer", return_default=True), + "bsm_hold": False, + "braked": False, + "ready": False, + "used": False, + } + self.reload_setup() + + def _pull_setup(self) -> None: + self._mem["bsm_hold"] = self._kv.get_bool("IQLaneChangeBsmDelay") + self._mem["preset"] = self._kv.get("IQLaneChangeTimer", return_default=True) + + def _idle_phase(self) -> bool: + return ( + self._hub.lane_change_state == log.LaneChangeState.off and + self._hub.lane_change_direction == log.LaneChangeDirection.none + ) + + def _seconds_for_preset(self) -> float: + picked = self._mem["preset"] + return PRESET_SECONDS.get(picked, PRESET_SECONDS[LaneSwapPreset.STEERING_NUDGE]) + + def _auto_preset_active(self) -> bool: + picked = self._mem["preset"] + return picked not in (LaneSwapPreset.DISABLED, LaneSwapPreset.STEERING_NUDGE) + + def _advance_clock(self, blindspot_now: bool) -> None: + wait_s = self._seconds_for_preset() + self._mem["gate"] = wait_s + self._mem["sec"] += DT_MDL + if self._mem["bsm_hold"] and blindspot_now and wait_s > 0.0: + if wait_s == PRESET_SECONDS[LaneSwapPreset.DIRECT]: + self._mem["sec"] = BLINDSPOT_WAIT_OFFSET + else: + self._mem["sec"] = wait_s + BLINDSPOT_WAIT_OFFSET + + def _ready_to_fire(self) -> bool: + return ( + self._auto_preset_active() and + (not self._mem["braked"]) and + (not self._mem["used"]) and + (self._mem["sec"] > self._mem["gate"]) + ) + + def reload_setup(self) -> None: + self._pull_setup() + + def heartbeat(self) -> None: + if (self._mem["tick"] % 50) == 0: + self._pull_setup() + self._mem["tick"] += 1 + + def sample(self, blindspot_now: bool = False, brake_now: bool = False, **legacy) -> None: + blindspot_now = bool(legacy.get("blindspot_detected", blindspot_now)) + brake_now = bool(legacy.get("brake_pressed", brake_now)) + self._mem["braked"] = self._mem["braked"] or brake_now + self._advance_clock(blindspot_now) + self._mem["ready"] = self._ready_to_fire() + + def finalize(self) -> None: + started = self._hub.lane_change_state == log.LaneChangeState.laneChangeStarting + self._mem["used"] = self._mem["used"] or started + if self._idle_phase(): + self._mem["sec"] = 0.0 + self._mem["braked"] = False + self._mem["used"] = False + + @property + def ready(self): + return self._mem["ready"] + + @property + def delay(self): + return self._mem["gate"] + + @property + def elapsed(self): + return self._mem["sec"] + + @property + def preset(self): + return self._mem["preset"] + + @preset.setter + def preset(self, value): + self._mem["preset"] = value + + @property + def bsm_hold(self): + return self._mem["bsm_hold"] + + @bsm_hold.setter + def bsm_hold(self, value): + self._mem["bsm_hold"] = bool(value) + + @property + def braked(self): + return self._mem["braked"] + + @braked.setter + def braked(self, value): + self._mem["braked"] = bool(value) + + @property + def used(self): + return self._mem["used"] + + @used.setter + def used(self, value): + self._mem["used"] = bool(value) + + +class NavExitLaneChangeController: + def __init__(self, enable_bsm: bool): + self._params = Params() + self._enable_bsm = bool(enable_bsm) + self.enabled = self._read_enabled() + self._tick = 0 + self.active = False + self.direction = log.LaneChangeDirection.none + self.auto_allowed = False + + def _read_enabled(self) -> bool: + try: + return self._params.get_bool("NavExitLaneChange") + except Exception: + return False + + def update_params(self) -> None: + if self._tick % 50 == 0: + self.enabled = self._read_enabled() + self._tick += 1 + + @staticmethod + def _raw(value): + return getattr(value, "raw", value) + + def update(self, nav_state, carstate) -> None: + self.active = False + self.direction = log.LaneChangeDirection.none + self.auto_allowed = False + + if not self.enabled or nav_state is None or not getattr(nav_state, "active", False): + return + if not getattr(nav_state, "nextManeuverValid", False): + return + if self._raw(getattr(nav_state, "nextManeuverType", _ManeuverType.none)) != int(_ManeuverType.exit): + return + distance = float(getattr(nav_state, "nextManeuverDistance", 0.0)) + if not 0.0 < distance <= NAV_EXIT_COMMIT_DISTANCE: + return + + direction = self._raw(getattr(nav_state, "nextManeuverDirection", _NavDirection.none)) + if direction == int(_NavDirection.left): + self.direction = log.LaneChangeDirection.left + elif direction == int(_NavDirection.right): + self.direction = log.LaneChangeDirection.right + else: + return + + self.active = True + blindspot = carstate.leftBlindspot if self.direction == log.LaneChangeDirection.left else carstate.rightBlindspot + self.auto_allowed = (not blindspot) if self._enable_bsm else False + + +AutoLaneChangeMode = LaneSwapPreset +AUTO_LANE_CHANGE_TIMER = LANE_SWAP_SECONDS +ONE_SECOND_DELAY = BLINDSPOT_WAIT_OFFSET + + +class IQLaneSwapController(LaneSwapEngine): + def __init__(self, desire_helper): + super().__init__(desire_helper) + + def reset(self) -> None: + self.finalize() + + def update_params(self) -> None: + self.heartbeat() + + def update_lane_change(self, blindspot_detected: bool, brake_pressed: bool) -> None: + self.sample(blindspot_now=blindspot_detected, brake_now=brake_pressed) + + def update_state(self) -> None: + self.finalize() + + @property + def lane_change_wait_timer(self): + return self.elapsed + + @lane_change_wait_timer.setter + def lane_change_wait_timer(self, value): + self._mem["sec"] = float(value) + + @property + def lane_change_delay(self): + return self.delay + + @lane_change_delay.setter + def lane_change_delay(self, value): + self._mem["gate"] = float(value) + + @property + def lane_change_set_timer(self): + return self.preset + + @lane_change_set_timer.setter + def lane_change_set_timer(self, value): + self.preset = value + + @property + def lane_change_bsm_delay(self): + return self.bsm_hold + + @lane_change_bsm_delay.setter + def lane_change_bsm_delay(self, value): + self.bsm_hold = value + + @property + def prev_brake_pressed(self): + return self.braked + + @prev_brake_pressed.setter + def prev_brake_pressed(self, value): + self.braked = value + + @property + def auto_lane_change_allowed(self): + return self.ready + + @auto_lane_change_allowed.setter + def auto_lane_change_allowed(self, value): + self._mem["ready"] = bool(value) + + @property + def prev_lane_change(self): + return self.used + + @prev_lane_change.setter + def prev_lane_change(self, value): + self.used = value diff --git a/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py b/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py new file mode 100644 index 000000000..dd1c0598e --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/lane_turn.py @@ -0,0 +1,157 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +from dataclasses import dataclass + +from iqpilot.cereal import custom + +from iqpilot.common.constants import CV +from iqpilot.common.params import Params + +TurnDirection = custom.IQTurnSignalDirection + +TURN_TRIGGER_MPS = 20 * CV.MPH_TO_MS +TURN_SPEED_GATE_MPS = TURN_TRIGGER_MPS +LANE_CHANGE_SPEED_MIN = TURN_SPEED_GATE_MPS + + +@dataclass +class _TurnGateState: + active: bool = False + speed_limit_mps: float = TURN_TRIGGER_MPS + outcome: int = TurnDirection.none + refresh_tick: int = 0 + + +def _mph_param_to_mps(raw_value) -> float: + try: + return float(raw_value) * CV.MPH_TO_MS + except (TypeError, ValueError): + return TURN_TRIGGER_MPS + + +def _resolve_signal_choice(speed_mps: float, + speed_limit_mps: float, + left_signal: bool, + right_signal: bool, + left_blocked: bool, + right_blocked: bool) -> int: + if speed_mps >= speed_limit_mps: + return TurnDirection.none + if left_signal and not right_signal and not left_blocked: + return TurnDirection.turnLeft + if right_signal and not left_signal and not right_blocked: + return TurnDirection.turnRight + return TurnDirection.none + + +class TurnSignalPlanner: + _REFRESH_STRIDE = 50 + + def __init__(self, desire_hub): + self._desire_hub = desire_hub + self._params = Params() + self._state = _TurnGateState() + self.reload_setup() + + def _refresh_from_params(self) -> None: + requested_gate = _mph_param_to_mps(self._params.get("IQLaneTurnValue", return_default=True)) + self._state.active = self._params.get_bool("IQLaneTurnDesire") + self._state.speed_limit_mps = min(TURN_TRIGGER_MPS, requested_gate) + + def _consume_legacy_kwargs(self, **legacy) -> tuple[bool, bool, bool, bool, float]: + return ( + bool(legacy.get("blindspot_left", False)), + bool(legacy.get("blindspot_right", False)), + bool(legacy.get("left_blinker", False)), + bool(legacy.get("right_blinker", False)), + float(legacy.get("v_ego", 0.0)), + ) + + def reload_setup(self): + self._refresh_from_params() + + def heartbeat(self) -> None: + if self._state.refresh_tick % self._REFRESH_STRIDE == 0: + self._refresh_from_params() + self._state.refresh_tick += 1 + + def sample(self, + blocked_l: bool = False, + blocked_r: bool = False, + blink_l: bool = False, + blink_r: bool = False, + speed_mps: float = 0.0, + **legacy) -> None: + if legacy: + blocked_l, blocked_r, blink_l, blink_r, speed_mps = self._consume_legacy_kwargs(**legacy) + self._state.outcome = _resolve_signal_choice(speed_mps, + self._state.speed_limit_mps, + blink_l, + blink_r, + blocked_l, + blocked_r) + + def output(self): + return self._state.outcome if self._state.active else TurnDirection.none + + @property + def enabled(self): + return self._state.active + + @enabled.setter + def enabled(self, value): + self._state.active = bool(value) + + @property + def speed_gate(self): + return self._state.speed_limit_mps + + @speed_gate.setter + def speed_gate(self, value): + self._state.speed_limit_mps = float(value) + + @property + def turn_direction(self): + return self._state.outcome + + @turn_direction.setter + def turn_direction(self, value): + self._state.outcome = value + + +class IQNavTurnController(TurnSignalPlanner): + def __init__(self, desire_helper): + super().__init__(desire_helper) + + def read_params(self): + self.reload_setup() + + def update_params(self) -> None: + self.heartbeat() + + def update_lane_turn(self, + blindspot_left: bool, + blindspot_right: bool, + left_blinker: bool, + right_blinker: bool, + v_ego: float) -> None: + self.sample(blocked_l=blindspot_left, + blocked_r=blindspot_right, + blink_l=left_blinker, + blink_r=right_blinker, + speed_mps=v_ego) + + def get_turn_direction(self): + return self.output() + + @property + def lane_turn_value(self): + return self.speed_gate + + @lane_turn_value.setter + def lane_turn_value(self, value): + self.speed_gate = value diff --git a/iqpilot/selfdrive/controls/lib/helpers/lateral_edge_guard.py b/iqpilot/selfdrive/controls/lib/helpers/lateral_edge_guard.py new file mode 100644 index 000000000..602ca2231 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/lateral_edge_guard.py @@ -0,0 +1,268 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import math +from dataclasses import dataclass, replace +from enum import IntEnum +from typing import Any + +from iqpilot.cereal import custom, log +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog + + +MIN_ACTIVE_SPEED_MPS = 20.0 * CV.MPH_TO_MS +MAX_VALID_ROAD_EDGE_STD_M = 1.0 +EDGE_CONFIDENCE_SIGMA = 1.0 +ROAD_EDGE_LOOKAHEAD_MIN_M = 5.0 +ROAD_EDGE_LOOKAHEAD_MAX_M = 40.0 +LANE_CENTER_OFFSET_M = 3.5 +VEHICLE_LATERAL_HALF_WIDTH_M = 1.90 / 2.0 +EDGE_CLEARANCE_MARGIN_M = 0.25 +ADJACENT_LANE_LINE_PROB = 0.5 +EGO_LANE_LINE_PROB_MIN = 0.5 +MIN_MEASURED_LANE_WIDTH_M = 2.5 +MAX_MEASURED_LANE_WIDTH_M = 4.5 +OUTER_LANE_LINE_INDEX = (0, 3) +EGO_LANE_LINE_INDEX = (1, 2) +REQUIRED_ROAD_EDGE_DISTANCE_M = LANE_CENTER_OFFSET_M + VEHICLE_LATERAL_HALF_WIDTH_M + EDGE_CLEARANCE_MARGIN_M +BLOCK_DEBOUNCE_S = 0.30 +CLEAR_DEBOUNCE_S = 0.50 +UNAVAILABLE_HOLD_S = 0.50 +TIMER_EPSILON_S = 1e-9 +PARAM_REFRESH_FRAMES = 50 + +LaneChangeDirection = log.LaneChangeDirection +LateralEdgeBlock = custom.IQLateralEdgeBlock + + +class RoadEdgeDataState(IntEnum): + VALID = 0 + UNAVAILABLE = 1 + INVALID = 2 + + +@dataclass(frozen=True, slots=True) +class RoadEdgeMeasurement: + state: RoadEdgeDataState + lateral_distance_m: float | None = None + conservative_distance_m: float | None = None + should_block: bool | None = None + + +@dataclass(frozen=True, slots=True) +class _SideState: + blocked: bool = False + block_timer_s: float = 0.0 + clear_timer_s: float = 0.0 + unavailable_timer_s: float = 0.0 + fallback_reported: bool = False + + +def evaluate_road_edge(edge: Any, std_m: Any, direction: int, + lane_width_m: float = LANE_CENTER_OFFSET_M) -> RoadEdgeMeasurement: + if edge is None or std_m is None: + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + try: + xs = edge.x + ys = edge.y + count = len(xs) + y_count = len(ys) + except (AttributeError, TypeError): + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + if count == 0 or y_count != count: + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + try: + std = float(std_m) + except (TypeError, ValueError): + return RoadEdgeMeasurement(RoadEdgeDataState.INVALID) + if not math.isfinite(std) or std < 0.0 or std > MAX_VALID_ROAD_EDGE_STD_M: + return RoadEdgeMeasurement(RoadEdgeDataState.INVALID) + + lateral_distance_m: float | None = None + for idx in range(count): + try: + x_m = float(xs[idx]) + y_m = float(ys[idx]) + except (IndexError, TypeError, ValueError): + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + if not math.isfinite(x_m) or not math.isfinite(y_m): + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + if not ROAD_EDGE_LOOKAHEAD_MIN_M <= x_m <= ROAD_EDGE_LOOKAHEAD_MAX_M: + continue + if ((direction == LaneChangeDirection.left and y_m >= 0.0) or + (direction == LaneChangeDirection.right and y_m <= 0.0)): + return RoadEdgeMeasurement(RoadEdgeDataState.INVALID) + distance_m = abs(y_m) + lateral_distance_m = distance_m if lateral_distance_m is None else min(lateral_distance_m, distance_m) + + if lateral_distance_m is None: + return RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + conservative_distance_m = lateral_distance_m - EDGE_CONFIDENCE_SIGMA * std + required_distance_m = lane_width_m + VEHICLE_LATERAL_HALF_WIDTH_M + EDGE_CLEARANCE_MARGIN_M + return RoadEdgeMeasurement( + RoadEdgeDataState.VALID, + lateral_distance_m, + conservative_distance_m, + conservative_distance_m < required_distance_m, + ) + + +def step_side_guard(state: _SideState, measurement: RoadEdgeMeasurement, speed_active: bool, + dt_s: float) -> tuple[_SideState, bool]: + if not speed_active: + return _SideState(), False + + if measurement.state == RoadEdgeDataState.UNAVAILABLE: + unavailable_timer_s = state.unavailable_timer_s + dt_s + if unavailable_timer_s < UNAVAILABLE_HOLD_S - TIMER_EPSILON_S: + return _SideState(state.blocked, unavailable_timer_s=unavailable_timer_s, + fallback_reported=state.fallback_reported), False + fallback_started = not state.fallback_reported + return _SideState(unavailable_timer_s=unavailable_timer_s, fallback_reported=True), fallback_started + + should_block = bool(measurement.should_block) if measurement.state == RoadEdgeDataState.VALID else False + if should_block == state.blocked: + return _SideState(blocked=state.blocked), False + + if should_block: + block_timer_s = state.block_timer_s + dt_s + if block_timer_s >= BLOCK_DEBOUNCE_S - TIMER_EPSILON_S: + return _SideState(blocked=True), False + return _SideState(block_timer_s=block_timer_s), False + + clear_timer_s = state.clear_timer_s + dt_s + if clear_timer_s >= CLEAR_DEBOUNCE_S - TIMER_EPSILON_S: + return _SideState(), False + return _SideState(blocked=True, clear_timer_s=clear_timer_s), False + + +class LateralEdgeGuard: + def __init__(self, enabled: bool | None = None) -> None: + self._params = Params() if enabled is None else None + self._param_refresh_frame = 0 + self.enabled = self._read_enabled() if enabled is None else enabled + self._active = False + self._left = _SideState() + self._right = _SideState() + self.left_measurement = RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + self.right_measurement = RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + def _read_enabled(self) -> bool: + try: + return bool(self._params and self._params.get_bool("IQEdgeGuard")) + except Exception: + return False + + def _refresh_enabled(self) -> None: + if self._params is not None and self._param_refresh_frame % PARAM_REFRESH_FRAMES == 0: + self.enabled = self._read_enabled() + self._param_refresh_frame += 1 + + def _reset(self) -> None: + self._left = _SideState() + self._right = _SideState() + self.left_measurement = RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + self.right_measurement = RoadEdgeMeasurement(RoadEdgeDataState.UNAVAILABLE) + + @staticmethod + def _model_side(modeldata: Any, side_index: int) -> tuple[Any | None, Any | None]: + if modeldata is None: + return None, None + try: + edges = modeldata.roadEdges + stds = modeldata.roadEdgeStds + if len(edges) <= side_index or len(stds) <= side_index: + return None, None + return edges[side_index], stds[side_index] + except (AttributeError, TypeError): + return None, None + + @staticmethod + def _lane_line_prob(modeldata: Any, index: int) -> float | None: + if modeldata is None: + return None + try: + probs = modeldata.laneLineProbs + if len(probs) <= index: + return None + value = float(probs[index]) + except (AttributeError, TypeError, IndexError, ValueError): + return None + return value if math.isfinite(value) else None + + @classmethod + def _adjacent_lane_visible(cls, modeldata: Any, side_index: int) -> bool: + prob = cls._lane_line_prob(modeldata, OUTER_LANE_LINE_INDEX[side_index]) + return prob is not None and prob > ADJACENT_LANE_LINE_PROB + + @classmethod + def _measured_lane_width(cls, modeldata: Any) -> float: + left_prob = cls._lane_line_prob(modeldata, EGO_LANE_LINE_INDEX[0]) + right_prob = cls._lane_line_prob(modeldata, EGO_LANE_LINE_INDEX[1]) + if left_prob is None or right_prob is None: + return LANE_CENTER_OFFSET_M + if left_prob <= EGO_LANE_LINE_PROB_MIN or right_prob <= EGO_LANE_LINE_PROB_MIN: + return LANE_CENTER_OFFSET_M + try: + lines = modeldata.laneLines + left_y = float(lines[EGO_LANE_LINE_INDEX[0]].y[0]) + right_y = float(lines[EGO_LANE_LINE_INDEX[1]].y[0]) + except (AttributeError, TypeError, IndexError, ValueError): + return LANE_CENTER_OFFSET_M + width = abs(right_y - left_y) + if not math.isfinite(width): + return LANE_CENTER_OFFSET_M + return min(max(width, MIN_MEASURED_LANE_WIDTH_M), MAX_MEASURED_LANE_WIDTH_M) + + @staticmethod + def _apply_lane_evidence(measurement: RoadEdgeMeasurement, lane_visible: bool) -> RoadEdgeMeasurement: + if lane_visible and measurement.state == RoadEdgeDataState.VALID and measurement.should_block: + return replace(measurement, should_block=False) + return measurement + + def update(self, modeldata: Any, v_ego_mps: float, dt_s: float) -> None: + self._refresh_enabled() + if not self.enabled: + if self._active: + self._reset() + self._active = False + return + if not self._active: + self._reset() + self._active = True + + dt = max(float(dt_s), 0.0) + left_edge, left_std = self._model_side(modeldata, 0) + right_edge, right_std = self._model_side(modeldata, 1) + lane_width_m = self._measured_lane_width(modeldata) + self.left_measurement = self._apply_lane_evidence( + evaluate_road_edge(left_edge, left_std, LaneChangeDirection.left, lane_width_m), + self._adjacent_lane_visible(modeldata, 0)) + self.right_measurement = self._apply_lane_evidence( + evaluate_road_edge(right_edge, right_std, LaneChangeDirection.right, lane_width_m), + self._adjacent_lane_visible(modeldata, 1)) + speed_active = math.isfinite(v_ego_mps) and v_ego_mps >= MIN_ACTIVE_SPEED_MPS + self._left, left_fallback = step_side_guard(self._left, self.left_measurement, speed_active, dt) + self._right, right_fallback = step_side_guard(self._right, self.right_measurement, speed_active, dt) + if left_fallback: + cloudlog.warning(f"lateral edge guard: left road edge unavailable for {UNAVAILABLE_HOLD_S:.2f} s; falling back to not blocking") + if right_fallback: + cloudlog.warning(f"lateral edge guard: right road edge unavailable for {UNAVAILABLE_HOLD_S:.2f} s; falling back to not blocking") + + def block_for_direction(self, direction: int) -> custom.IQLateralEdgeBlock: + if not self.enabled: + return LateralEdgeBlock.none + if direction == LaneChangeDirection.left and self._left.blocked: + return LateralEdgeBlock.left + if direction == LaneChangeDirection.right and self._right.blocked: + return LateralEdgeBlock.right + return LateralEdgeBlock.none diff --git a/iqpilot/selfdrive/controls/lib/helpers/nav_torque_pulse.py b/iqpilot/selfdrive/controls/lib/helpers/nav_torque_pulse.py new file mode 100644 index 000000000..8e4a805ed --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/nav_torque_pulse.py @@ -0,0 +1,83 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Short, decaying steering-torque nudges that lean the car through navigation +turns and highway exits. This is a lateral-control add-on driven by iqNavState; +it is independent of the feed-forward model and is off by default. +""" +import numpy as np +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import custom + +TURN_NUDGE_TORQUE = 0.8 +EXIT_NUDGE_TORQUE = 0.6 +TURN_PULSE_FRAMES = 50 +EXIT_PULSE_FRAMES = 75 + +# Master switch — nav torque influence is experimental and shipped off. +IQP_NAV_TORQUE_INFLUENCE_ENABLED = False + +_LEFT = 1 # turnDesireDirection / lanePositioningDirection: 1 == left + + +class NavTorquePulseBrain: + def __init__(self, lac_torque): + self._controller = lac_torque + self._nav_sm = messaging.SubMaster(["iqNavState"], poll="iqNavState") + self._nav_key = "" + self._nav_pulse_sign = 0.0 + self._nav_pulse_frames = 0 + + def _lookup_nav_pulse(self): + if not IQP_NAV_TORQUE_INFLUENCE_ENABLED: + return "", 0.0, 0 + + self._nav_sm.update(0) + nav_state = self._nav_sm["iqNavState"] + phase = getattr(nav_state, "maneuverPhase", custom.IQNavState.ManeuverPhase.none) + maneuver_direction = getattr(nav_state, "maneuverDirection", custom.NavDirection.none) + + # left nudges negative, otherwise positive + def turn(tag, direction): + return f"turn{tag}:{direction}", -TURN_NUDGE_TORQUE if direction == _LEFT else TURN_NUDGE_TORQUE, TURN_PULSE_FRAMES + + def keep(tag, direction): + return f"{tag}:{direction}", -EXIT_NUDGE_TORQUE if direction == _LEFT else EXIT_NUDGE_TORQUE, EXIT_PULSE_FRAMES + + if phase == custom.IQNavState.ManeuverPhase.turnActive: + return turn("-phase", getattr(nav_state, "turnDesireDirection", 0)) + if phase == custom.IQNavState.ManeuverPhase.highwayCommit and maneuver_direction in (custom.NavDirection.left, custom.NavDirection.right): + return keep("highway-phase", getattr(nav_state, "lanePositioningDirection", 0)) + if getattr(nav_state, "shouldSendTurnDesire", False): + return turn("", getattr(nav_state, "turnDesireDirection", 0)) + if getattr(nav_state, "shouldSendLanePositioning", False): + return keep("keep", getattr(nav_state, "lanePositioningDirection", 0)) + return "", 0.0, 0 + + def nudge_output_torque(self, active: bool, car_state, output_torque: float) -> float: + if not IQP_NAV_TORQUE_INFLUENCE_ENABLED: + self._nav_pulse_frames = 0 + self._nav_key = "" + return output_torque + + nav_key, pulse_sign, pulse_frames = self._lookup_nav_pulse() + + if not active or getattr(car_state, "steeringPressed", False): + self._nav_pulse_frames = 0 + if not nav_key: + self._nav_key = "" + return output_torque + + if nav_key and nav_key != self._nav_key: + self._nav_key = nav_key + self._nav_pulse_sign = pulse_sign + self._nav_pulse_frames = pulse_frames + elif not nav_key and self._nav_pulse_frames == 0: + self._nav_key = "" + + if self._nav_pulse_frames > 0: + self._nav_pulse_frames -= 1 + steer_max = float(getattr(self._controller, "steer_max", 1.0)) + output_torque = float(np.clip(output_torque + self._nav_pulse_sign, -steer_max, steer_max)) + + return output_torque diff --git a/iqpilot/selfdrive/controls/lib/helpers/tests/__init__.py b/iqpilot/selfdrive/controls/lib/helpers/tests/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/tests/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py b/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py new file mode 100644 index 000000000..6820b5617 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py @@ -0,0 +1,133 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from types import SimpleNamespace + +import pytest + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import custom +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.controls.lib.helpers.e2e_alerts import ( + EndToEndAlertEngine, CONFIRM_S, SETTLE_S, HORIZON_TAIL, PATH_SPEED_MPS, LEAD_SPEED_MPS, LEAD_GAP_M) + +E2E_CHIME = custom.IQOnroadEvent.EventName.e2eChime + + +class _Events(list): + def add(self, name): + self.append(name) + + +def _model(horizon): + msg = messaging.new_message('modelV2') + msg.modelV2.velocity.x = [0.0] * (33 - HORIZON_TAIL) + [horizon] * HORIZON_TAIL + return msg.as_reader().modelV2 + + +def _sm(*, v_ego=0.0, standstill=True, gas=False, enabled=False, cruise=False, + horizon=0.0, lead=None): + lead = lead or SimpleNamespace(status=False, dRel=0.0, vLead=0.0) + return { + 'carState': SimpleNamespace(vEgo=v_ego, standstill=standstill, gasPressed=gas, + cruiseState=SimpleNamespace(enabled=cruise)), + 'selfdriveState': SimpleNamespace(enabled=enabled), + 'radarState': SimpleNamespace(leadOne=lead), + 'modelV2': _model(horizon), + } + + +def _engine(path=True, lead=True): + engine = EndToEndAlertEngine() + engine._refresh_params = lambda: None + engine._on = {"path": path, "lead": lead} + return engine + + +def _run(engine, sm, seconds): + events = _Events() + chimes = 0 + for _ in range(int(seconds / DT_MDL)): + engine.update(sm, events) + chimes += events.count(E2E_CHIME) + events.clear() + return chimes + + +def _lead(d_rel, v_lead=0.0): + return SimpleNamespace(status=True, dRel=d_rel, vLead=v_lead) + + +def test_path_opens_chimes_once(): + engine = _engine() + assert _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) == 0 + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1 + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), 5.0) == 0 + + +def test_path_needs_the_settle_dwell(): + engine = _engine() + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), SETTLE_S - 0.2) == 0 + + +def test_path_silent_while_openpilot_long_is_engaged(): + engine = _engine() + _run(engine, _sm(horizon=0.0, enabled=True), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, enabled=True), 5.0) == 0 + + +def test_path_silent_while_stock_acc_holds_the_car(): + engine = _engine() + _run(engine, _sm(horizon=0.0, cruise=True), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, cruise=True), 5.0) == 0 + + +def test_path_chimes_under_aol(): + engine = _engine() + _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1 + + +def test_path_ignores_a_visible_lead(): + engine = _engine(lead=False) + _run(engine, _sm(horizon=0.0, lead=_lead(6.0)), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, lead=_lead(6.0)), 5.0) == 0 + + +def test_lead_pullaway_chimes_once(): + engine = _engine() + assert _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0) == 0 + moving = _sm(lead=_lead(6.0 + LEAD_GAP_M + 0.5, LEAD_SPEED_MPS + 1.0)) + assert _run(engine, moving, CONFIRM_S + 1.0) == 1 + assert _run(engine, moving, 5.0) == 0 + + +def test_lead_creep_inside_the_gap_stays_silent(): + engine = _engine() + _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0) + assert _run(engine, _sm(lead=_lead(6.0 + LEAD_GAP_M / 2, LEAD_SPEED_MPS + 1.0)), 5.0) == 0 + + +def test_lead_far_ahead_is_not_a_queue(): + engine = _engine() + _run(engine, _sm(lead=_lead(40.0)), SETTLE_S + 1.0) + assert _run(engine, _sm(lead=_lead(44.0, LEAD_SPEED_MPS + 1.0)), 5.0) == 0 + + +def test_gas_and_motion_rearm_the_dwell(): + engine = _engine() + _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) + _run(engine, _sm(v_ego=5.0, standstill=False, horizon=8.0), 2.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), SETTLE_S - 0.2) == 0 + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1 + + +@pytest.mark.parametrize("param_off", ["path", "lead"]) +def test_each_param_gates_only_its_own_trigger(param_off): + engine = _engine(path=param_off != "path", lead=param_off != "lead") + if param_off == "path": + _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), 5.0) == 0 + else: + _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0) + assert _run(engine, _sm(lead=_lead(8.0, LEAD_SPEED_MPS + 1.0)), 5.0) == 0 diff --git a/iqpilot/selfdrive/controls/lib/helpers/tests/test_nav_torque_pulse.py b/iqpilot/selfdrive/controls/lib/helpers/tests/test_nav_torque_pulse.py new file mode 100644 index 000000000..a63450285 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/tests/test_nav_torque_pulse.py @@ -0,0 +1,105 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from types import SimpleNamespace + +import numpy as np +import pytest + +from iqpilot.cereal import custom +import iqpilot.selfdrive.controls.lib.helpers.nav_torque_pulse as nav_pulse +from iqpilot.selfdrive.controls.lib.helpers.nav_torque_pulse import ( + NavTorquePulseBrain, TURN_PULSE_FRAMES, EXIT_PULSE_FRAMES) + + +@pytest.fixture +def influence_on(): + nav_pulse.IQP_NAV_TORQUE_INFLUENCE_ENABLED = True + try: + yield + finally: + nav_pulse.IQP_NAV_TORQUE_INFLUENCE_ENABLED = False + + +def _fixed_nav_sm(**fields): + nav = SimpleNamespace( + maneuverPhase=custom.IQNavState.ManeuverPhase.none, + maneuverDirection=custom.NavDirection.none, + shouldSendTurnDesire=False, + turnDesireDirection=0, + shouldSendLanePositioning=False, + lanePositioningDirection=0, + ) + for k, v in fields.items(): + setattr(nav, k, v) + + class SM: + def update(self, _): + return None + + def __getitem__(self, _): + return nav + return SM() + + +def _brain(nav_sm=None, steer_max=1.0): + brain = NavTorquePulseBrain(SimpleNamespace(steer_max=steer_max)) + if nav_sm is not None: + brain._nav_sm = nav_sm + return brain + + +def test_passthrough_when_disabled(): + brain = _brain() + cs = SimpleNamespace(steeringPressed=False) + assert brain.nudge_output_torque(True, cs, 0.42) == 0.42 + + +class TestPulseSign: + @pytest.mark.parametrize("direction,expect_negative", [(1, True), (2, False)]) + def test_turn_desire_direction(self, influence_on, direction, expect_negative): + brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=direction)) + cs = SimpleNamespace(steeringPressed=False) + first = brain.nudge_output_torque(True, cs, 0.0) + assert (first < 0.0) == expect_negative + + def test_turn_active_phase_uses_turn_frames(self, influence_on): + brain = _brain(_fixed_nav_sm(maneuverPhase=custom.IQNavState.ManeuverPhase.turnActive, + turnDesireDirection=1)) + cs = SimpleNamespace(steeringPressed=False) + outs = [brain.nudge_output_torque(True, cs, 0.0) for _ in range(TURN_PULSE_FRAMES + 2)] + assert outs[TURN_PULSE_FRAMES - 1] < 0.0 + assert outs[TURN_PULSE_FRAMES] == 0.0 + + +class TestPulseLifecycle: + def test_pulse_expires_after_its_frame_count(self, influence_on): + brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=1)) + cs = SimpleNamespace(steeringPressed=False) + outs = [brain.nudge_output_torque(True, cs, 0.0) for _ in range(TURN_PULSE_FRAMES + 3)] + assert all(o < 0.0 for o in outs[:TURN_PULSE_FRAMES]) + assert all(o == 0.0 for o in outs[TURN_PULSE_FRAMES:]) + assert all(np.isfinite(o) for o in outs) + + def test_steering_press_suppresses_pulse(self, influence_on): + brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=1)) + cs = SimpleNamespace(steeringPressed=True) + assert brain.nudge_output_torque(True, cs, 0.4) == 0.4 + + def test_inactive_suppresses_pulse(self, influence_on): + brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=1)) + cs = SimpleNamespace(steeringPressed=False) + assert brain.nudge_output_torque(False, cs, 0.4) == 0.4 + + def test_output_clamped_to_steer_max(self, influence_on): + brain = _brain(_fixed_nav_sm(shouldSendTurnDesire=True, turnDesireDirection=2), steer_max=0.5) + cs = SimpleNamespace(steeringPressed=False) + out = brain.nudge_output_torque(True, cs, 0.4) # 0.4 + 0.8 nudge, clamped to 0.5 + assert out == pytest.approx(0.5) + + def test_lane_positioning_uses_exit_frames(self, influence_on): + brain = _brain(_fixed_nav_sm(shouldSendLanePositioning=True, lanePositioningDirection=1)) + cs = SimpleNamespace(steeringPressed=False) + outs = [brain.nudge_output_torque(True, cs, 0.0) for _ in range(EXIT_PULSE_FRAMES + 2)] + assert outs[EXIT_PULSE_FRAMES - 1] < 0.0 + assert outs[EXIT_PULSE_FRAMES] == 0.0 diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/__init__.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/engine.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/engine.py new file mode 100644 index 000000000..531217cbf --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/iq_dynamic/engine.py @@ -0,0 +1,249 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.cereal import messaging +from numpy import interp +from iqdbc.car import structs +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.controls.lib.iq_dynamic.imahelper import ( + IQConstants, + IQFilterEngine, + IQModeEngine, + IQ_DYNAMIC_CONDITIONAL_CURVES_PARAM, + IQ_DYNAMIC_CONDITIONAL_LEAD_SPEED_PARAM, + IQ_DYNAMIC_CONDITIONAL_MODEL_STOPS_PARAM, + IQ_DYNAMIC_CONDITIONAL_SLC_FALLBACK_PARAM, + IQ_DYNAMIC_CONDITIONAL_SLOWER_LEAD_PARAM, + IQ_DYNAMIC_CONDITIONAL_SPEED_PARAM, + IQ_DYNAMIC_CONDITIONAL_STOPPED_LEAD_PARAM, + IQ_DYNAMIC_MODE_PARAM, + IQ_DYNAMIC_MINIMUM_FORCE_STOP_LENGTH_PARAM, + IQ_DYNAMIC_MODEL_STOP_TIME_PARAM, + IQ_FORCE_STOPS_PARAM, + compute_slowdown_need, +) + +S_Y = 33 + + +class IQDynamicController: + def __init__(self, CP: structs.CarParams, mpc, params=None): + self.IQS = CP + self._mpc = mpc + self.IQParams = params or Params() + + self.IQDynamicStatus = False + self.IQDynamicA = False + self.IQDynamicF = 0 + self.IQDynamicU = 0.0 + self.IQEngineManager = IQModeEngine() + + self.IQFilterL = IQFilterEngine(measurement_noise=0.17, process_noise=0.04, process_decay=1.03, smoothing_floor=0.9) + self.IQFilterSDL = IQFilterEngine(measurement_noise=0.12, process_noise=0.098, process_decay=1.01, smoothing_floor=0.8) + self.IQFilterSFL = IQFilterEngine(measurement_noise=0.11, process_noise=0.06, process_decay=1.000, smoothing_floor=0.90) + self.IQFilterFCW = IQFilterEngine(measurement_noise=0.19, process_noise=0.11, process_decay=1.11, smoothing_floor=0.4) + self.IQFilterSlowLead = IQFilterEngine(measurement_noise=0.15, process_noise=0.08, process_decay=1.02, smoothing_floor=0.75) + self.IQFilterModelStop = IQFilterEngine(measurement_noise=0.15, process_noise=0.06, process_decay=1.01, smoothing_floor=0.7) + + self.hasIQFilterLED = False + self.hasIQSDL = False + self.hasIQSFL = False + self.hasIQL = False + self.curve_detected = False + self.slow_lead_detected = False + self.stop_light_detected = False + self.low_speed_detected = False + self.low_speed_lead_detected = False + self.model_stopped = False + self.tracking_lead = False + self.force_stops_enabled = True + self.slc_experimental_mode = False + + self.kph = 0.0 + self.cruise_kph = 0.0 + self.aeb = 0 + self.aeb_c = 0 + self.ss_c = 0 + self.e_x = float('inf') + self.e_d = 0.0 + self.model_length = 0.0 + self.lead_speed = 0.0 + + self.conditional_curves = True + self.conditional_slower_lead = True + self.conditional_stopped_lead = True + self.conditional_model_stops = True + self.conditional_slc_fallback = True + self.conditional_speed = IQConstants.CONDITIONAL_SPEED_DEFAULT + self.conditional_lead_speed = IQConstants.CONDITIONAL_LEAD_SPEED_DEFAULT + self.model_stop_time = IQConstants.MODEL_STOP_TIME_DEFAULT + self.minimum_force_stop_length = IQConstants.MINIMUM_FORCE_STOP_LENGTH_DEFAULT + + def _read_bool(self, key: str, default: bool) -> bool: + value = self.IQParams.get_bool(key) + return default if value is None else bool(value) + + def _read_float(self, key: str, default: float) -> float: + value = self.IQParams.get(key) + if value is None: + return default + if isinstance(value, bytes): + value = value.decode('utf-8') + try: + return float(value) + except (TypeError, ValueError): + return default + + def _readIQParams(self) -> None: + if self.IQDynamicF % int(1. / DT_MDL) != 0: + return + self.IQDynamicStatus = self._read_bool(IQ_DYNAMIC_MODE_PARAM, False) + self.conditional_curves = self._read_bool(IQ_DYNAMIC_CONDITIONAL_CURVES_PARAM, True) + self.conditional_slower_lead = self._read_bool(IQ_DYNAMIC_CONDITIONAL_SLOWER_LEAD_PARAM, True) + self.conditional_stopped_lead = self._read_bool(IQ_DYNAMIC_CONDITIONAL_STOPPED_LEAD_PARAM, True) + self.conditional_model_stops = self._read_bool(IQ_DYNAMIC_CONDITIONAL_MODEL_STOPS_PARAM, True) + self.conditional_slc_fallback = self._read_bool(IQ_DYNAMIC_CONDITIONAL_SLC_FALLBACK_PARAM, True) + self.conditional_speed = self._read_float(IQ_DYNAMIC_CONDITIONAL_SPEED_PARAM, IQConstants.CONDITIONAL_SPEED_DEFAULT) + self.conditional_lead_speed = self._read_float(IQ_DYNAMIC_CONDITIONAL_LEAD_SPEED_PARAM, IQConstants.CONDITIONAL_LEAD_SPEED_DEFAULT) + self.model_stop_time = self._read_float(IQ_DYNAMIC_MODEL_STOP_TIME_PARAM, IQConstants.MODEL_STOP_TIME_DEFAULT) + self.minimum_force_stop_length = self._read_float(IQ_DYNAMIC_MINIMUM_FORCE_STOP_LENGTH_PARAM, IQConstants.MINIMUM_FORCE_STOP_LENGTH_DEFAULT) + self.force_stops_enabled = self._read_bool(IQ_FORCE_STOPS_PARAM, True) + + def set_slc_experimental_mode(self, active: bool) -> None: + self.slc_experimental_mode = bool(active) + + def mode(self) -> str: + return self.IQEngineManager.get_mode() + + def enabled(self) -> bool: + return self.IQDynamicStatus + + def active(self) -> bool: + return self.IQDynamicA + + def force_stop_requested(self) -> bool: + return bool(self.force_stops_enabled and self.stop_light_detected and self.model_stopped and not self.tracking_lead) + + def setaeb(self) -> None: + self.aeb = self.aeb_c + + def IQDynamicEngine(self, sm: messaging.SubMaster) -> None: + car_state = sm['carState'] + radar_state = sm['radarState'] + model = sm['modelV2'] + + self.kph = car_state.vEgo * 3.6 + self.cruise_kph = car_state.vCruise + self.ss_c = min(20, self.ss_c + 1) if car_state.standstill else max(0, self.ss_c - 1) + + lead_status = float(getattr(radar_state.leadOne, "status", False)) + self.IQFilterL.push(lead_status) + self.hasIQFilterLED = (self.IQFilterL.value() or 0.0) > IQConstants.LEAD_LOCK_GATE + self.tracking_lead = self.hasIQFilterLED + self.lead_speed = float(getattr(radar_state.leadOne, "vLead", 0.0)) + + prev_fcw = self.IQFilterFCW.value() or 0.0 + self.IQFilterFCW.push(float(self.aeb > 0)) + self.hasIQL = prev_fcw > 0.5 + + valid_model = len(model.position.x) == S_Y and len(model.orientation.x) == S_Y + if valid_model: + self.model_length = float(model.position.x[S_Y - 1]) + self.e_x = self.model_length + self.e_d = interp(self.kph, IQConstants.BRAKE_CURVE_SPEED_AXIS, IQConstants.BRAKE_CURVE_DISTANCE_AXIS) + need = compute_slowdown_need(self.kph, self.model_length, self.e_d) + else: + self.model_length = 0.0 + self.e_x = float('inf') + self.e_d = 0.0 + need = 0.3 if self.kph > 20.0 else 0.0 + self.IQFilterSDL.push(need) + self.IQDynamicU = self.IQFilterSDL.value() or 0.0 + self.hasIQSDL = self.IQDynamicU > (IQConstants.BRAKE_CURVE_GATE * 0.8) + self.curve_detected = self.hasIQSDL + + if self.ss_c <= 5 and not self.hasIQSDL: + slowness_observed = float(self.kph <= (self.cruise_kph * IQConstants.CRUISE_LAG_RATIO_GATE)) + self.IQFilterSFL.push(slowness_observed) + threshold = IQConstants.CRUISE_LAG_GATE * (0.8 if self.hasIQSFL else 1.1) + self.hasIQSFL = (self.IQFilterSFL.value() or 0.0) > threshold + + v_ego = float(car_state.vEgo) + self.low_speed_detected = not self.tracking_lead and IQConstants.CRUISING_SPEED <= v_ego < self.conditional_speed + self.low_speed_lead_detected = self.tracking_lead and IQConstants.CRUISING_SPEED <= v_ego < self.conditional_lead_speed + + if self.tracking_lead: + slower_lead = (v_ego - self.lead_speed) > IQConstants.CRUISING_SPEED and self.conditional_slower_lead + stopped_lead = self.lead_speed < 1.0 and self.conditional_stopped_lead + self.IQFilterSlowLead.push(float(slower_lead or stopped_lead)) + self.slow_lead_detected = (self.IQFilterSlowLead.value() or 0.0) >= IQConstants.SLOW_LEAD_THRESHOLD + else: + self.IQFilterSlowLead.reset() + self.slow_lead_detected = False + + should_stop = bool(getattr(getattr(model, "action", None), "shouldStop", False)) + model_stopping = self.model_length > 0.0 and self.model_length < max(v_ego * self.model_stop_time, IQConstants.CRUISING_SPEED) + self.model_stopped = bool(should_stop or model_stopping) + self.IQFilterModelStop.push(float(self.model_stopped and not self.tracking_lead)) + self.stop_light_detected = (self.IQFilterModelStop.value() or 0.0) >= IQConstants.MODEL_STOP_THRESHOLD + + def _request_blended(self, urgency: float = 1.0, emergency: bool = False) -> None: + self.IQEngineManager.request('blended', urgency=urgency, emergency=emergency) + + def _request_acc(self, urgency: float = 0.8) -> None: + self.IQEngineManager.request('acc', urgency=urgency) + + def IQStateEngine(self) -> None: + if self.hasIQL: + self._request_blended(1.0, True) + elif self.stop_light_detected and self.conditional_model_stops: + self._request_blended(1.0, self.model_stopped) + elif self.low_speed_detected or self.low_speed_lead_detected: + self._request_blended(0.95) + elif self.slow_lead_detected: + self._request_blended(0.9) + elif self.conditional_curves and self.hasIQSDL: + self._request_blended(max(0.8, min(1.0, self.IQDynamicU * 1.5))) + elif self.conditional_slc_fallback and self.slc_experimental_mode: + self._request_blended(0.8) + elif self.ss_c > 3: + self._request_blended(0.9) + elif self.hasIQSFL and not self.hasIQSDL: + self._request_acc(0.8) + else: + self._request_acc(0.7) + + def IQStateEngine_R(self) -> None: + if self.hasIQL: + self._request_blended(1.0, True) + elif self.stop_light_detected and self.conditional_model_stops: + self._request_blended(1.0, self.model_stopped) + elif self.low_speed_detected or self.low_speed_lead_detected: + self._request_blended(0.95) + elif self.slow_lead_detected: + self._request_blended(0.9) + elif self.conditional_curves and self.hasIQSDL: + self._request_blended(max(0.8, min(1.0, self.IQDynamicU * 1.3))) + elif self.conditional_slc_fallback and self.slc_experimental_mode: + self._request_blended(0.8) + elif self.hasIQFilterLED and not (self.ss_c > 3): + self._request_acc(1.0) + elif self.ss_c > 3: + self._request_blended(0.9) + elif self.hasIQSFL and not self.hasIQSDL: + self._request_acc(0.8) + else: + self._request_acc(0.7) + + def update(self, sm: messaging.SubMaster) -> None: + self._readIQParams() + self.setaeb() + self.IQDynamicEngine(sm) + if self.IQS.radarUnavailable: + self.IQStateEngine() + else: + self.IQStateEngine_R() + self.IQEngineManager.update() + self.IQDynamicA = sm['selfdriveState'].experimentalMode and self.IQDynamicStatus + self.IQDynamicF += 1 diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/imahelper.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/imahelper.py new file mode 100644 index 000000000..610a046d9 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/iq_dynamic/imahelper.py @@ -0,0 +1,148 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from typing import Literal + +ModeType = Literal['acc', 'blended'] +IQ_DYNAMIC_MODE_PARAM = "IQDynamicMode" +IQ_DYNAMIC_CONDITIONAL_CURVES_PARAM = "IQDynamicConditionalCurves" +IQ_DYNAMIC_CONDITIONAL_SLOWER_LEAD_PARAM = "IQDynamicConditionalSlowerLead" +IQ_DYNAMIC_CONDITIONAL_STOPPED_LEAD_PARAM = "IQDynamicConditionalStoppedLead" +IQ_DYNAMIC_CONDITIONAL_MODEL_STOPS_PARAM = "IQDynamicConditionalModelStops" +IQ_DYNAMIC_CONDITIONAL_SLC_FALLBACK_PARAM = "IQDynamicConditionalSLCFallback" +IQ_DYNAMIC_CONDITIONAL_SPEED_PARAM = "IQDynamicConditionalSpeed" +IQ_DYNAMIC_CONDITIONAL_LEAD_SPEED_PARAM = "IQDynamicConditionalLeadSpeed" +IQ_DYNAMIC_MODEL_STOP_TIME_PARAM = "IQDynamicModelStopTime" +IQ_DYNAMIC_MINIMUM_FORCE_STOP_LENGTH_PARAM = "IQDynamicMinimumForceStopLength" +IQ_FORCE_STOPS_PARAM = "IQForceStops" + + +class IQConstants: + CRUISING_SPEED = 3.0 + SIGNAL_QUEUE_DEPTH = 6 + LEAD_LOCK_GATE = 0.45 + BRAKE_CURVE_QUEUE_DEPTH = 5 + BRAKE_CURVE_GATE = 0.3 + BRAKE_CURVE_SPEED_AXIS = [0., 10., 20., 30., 40., 50., 55., 60.] + BRAKE_CURVE_DISTANCE_AXIS = [32., 46., 64., 86., 108., 130., 145., 165.] + CRUISE_LAG_QUEUE_DEPTH = 10 + CRUISE_LAG_GATE = 0.55 + CRUISE_LAG_RATIO_GATE = 1.025 + CONDITIONAL_SPEED_DEFAULT = 18.0 + CONDITIONAL_LEAD_SPEED_DEFAULT = 24.0 + MODEL_STOP_TIME_DEFAULT = 3.0 + MODEL_STOP_THRESHOLD = 0.55 + SLOW_LEAD_THRESHOLD = 0.55 + FORCE_STOP_PLANNER_TIME = 3.0 + MINIMUM_FORCE_STOP_LENGTH_DEFAULT = 0.0 + + +def compute_slowdown_need(kph: float, horizon_dist: float, desired_dist: float) -> float: + if horizon_dist >= desired_dist or desired_dist <= 0.0: + return 0.0 + + shortage = desired_dist - horizon_dist + shortage_ratio = shortage / desired_dist + need = min(1.0, shortage_ratio * 2.0) + + if horizon_dist < desired_dist * 0.3: + need = min(1.0, need * 2.0) + + if kph > 25.0: + need = min(1.0, need * (1.0 + (kph - 25.0) / 80.0)) + + return need + + +class IQFilterEngine: + def __init__(self, initial=0.0, measurement_noise=0.1, process_noise=0.01, process_decay=1.0, smoothing_floor=0.85): + self._value = initial + self._variance = 1.0 + self._measurement_noise = measurement_noise + self._process_noise = process_noise + self._process_decay = process_decay + self._smoothing_floor = smoothing_floor + self._initialized = False + self._samples = [] + self._sample_limit = 10 + self._confidence = 0.0 + + def push(self, measurement: float) -> None: + if len(self._samples) >= self._sample_limit: + self._samples.pop(0) + self._samples.append(measurement) + + if not self._initialized: + self._value = measurement + self._initialized = True + self._confidence = 0.1 + return + + self._variance = self._process_decay * self._variance + self._process_noise + gain = self._variance / (self._variance + self._measurement_noise) + effective_gain = gain * (1.0 - self._smoothing_floor) + self._smoothing_floor * 0.1 + + innovation = measurement - self._value + self._value = self._value + effective_gain * innovation + self._variance = (1.0 - effective_gain) * self._variance + + if abs(innovation) < 0.1: + self._confidence = min(1.0, self._confidence + 0.05) + else: + self._confidence = max(0.1, self._confidence - 0.02) + + def value(self): + return self._value if self._initialized else None + + def confidence(self) -> float: + return self._confidence + + def reset(self) -> None: + self._initialized = False + self._samples = [] + self._confidence = 0.0 + + +class IQModeEngine: + def __init__(self): + self._state: ModeType = 'acc' + self._scores = {'acc': 1.0, 'blended': 0.0} + self._switching_timer = 0 + self._mode_age = 0 + self._forced_takeover = False + + def request(self, mode: ModeType, urgency: float = 1.0, emergency: bool = False) -> None: + if emergency: + self._forced_takeover = True + self._state = mode + self._switching_timer = 15 + self._mode_age = 0 + return + + self._scores[mode] = min(1.0, self._scores[mode] + 0.1 * urgency) + for key in self._scores: + if key != mode: + self._scores[key] = max(0.0, self._scores[key] - 0.05) + + if self._mode_age < 10 and not self._forced_takeover: + return + + threshold = 0.6 if mode != self._state else 0.3 + if self._scores[mode] > threshold and mode != self._state and self._switching_timer == 0: + self._switching_timer = 15 + self._state = mode + self._mode_age = 0 + + def update(self) -> None: + if self._switching_timer > 0: + self._switching_timer -= 1 + + self._mode_age += 1 + if self._forced_takeover and self._mode_age > 20: + self._forced_takeover = False + + for key in self._scores: + self._scores[key] *= 0.98 + + def get_mode(self) -> ModeType: + return self._state diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/radar_manager.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/radar_manager.py new file mode 100644 index 000000000..230d46103 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/iq_dynamic/radar_manager.py @@ -0,0 +1,68 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +RadarManager — IQ.Dynamics side of "Blend IQ.Pilot + Stock ACC Radar" (VW PQ only). + +Decides the high-level intent for the stock ACC radar and writes it onto iqCarControl for the iqdbc +PQRadarHandler to execute on CAN. It does NOT touch CAN or read radar feedback directly: the handler +(car process) owns the bus and the failure latch, and the carcontroller gates radar-accel passthrough +on the live ACS_Sta_ADR. That keeps the desync guard automatic — if chill is requested but the radar +isn't active, the carcontroller simply uses the planner's VoACC accel (standard IQ long). + +Intent produced: + radarBlendActive feature enabled + PQ + alpha long available + radarEngageReq want the radar's cruise engaged (engage same time long control engages) + radarCancelReq cancel now (1 kph stop / driver brake / long disengaged / teardown) + useRadarAccel chill (acc) mode + engaged -> carcontroller passes radar ACS_Sollbeschl through + radarSetSpeedKph OP set speed to sync the radar's ACA_V_Wunsch toward + radarGapBars OP follow-distance bars to mirror to the radar +""" +from iqpilot.common.constants import CV + +CANCEL_CEIL_MS = 1.0 * CV.KPH_TO_MS # cancel the radar at/below 1 kph (it can still see speed -> would fault) + + +class RadarManager: + def __init__(self, CP, params): + self.CP = CP + self.params = params + self.is_pq = self._detect_pq(CP) + self.enabled_param = False + + @staticmethod + def _detect_pq(CP) -> bool: + if getattr(CP, "brand", "") != "volkswagen": + return False + try: + from iqdbc.car.volkswagen.values import VolkswagenFlags + return bool(CP.flags & VolkswagenFlags.PQ) + except Exception: + return False + + def read_params(self) -> None: + if self.is_pq: + self.enabled_param = self.params.get_bool("IQDynamicBlendStockRadar") + + def update(self, CC_IQ, sm, set_speed_kph: float) -> None: + blend = bool(self.is_pq and self.enabled_param and self.CP.openpilotLongitudinalControl) + CC_IQ.radarBlendActive = blend + if not blend: + return + + ss = sm['selfdriveState'] + cs = sm['carState'] + iq = sm['iqPlan'].iqDynamic + + long_engaged = bool(ss.enabled) and self.CP.openpilotLongitudinalControl + iq_engaged = long_engaged and bool(iq.enabled) + chill = iq_engaged and bool(iq.active) and (iq.state == 'acc') + brake = bool(cs.brakePressed) + v_ego = float(cs.vEgo) + + # Engage the radar whenever IQ.Dynamics long is engaged; cancel on stop/brake/teardown. + # The handler resolves priority (cancel wins) and applies the 1->2 kph engage hysteresis. + CC_IQ.radarEngageReq = iq_engaged and not brake + CC_IQ.radarCancelReq = (not iq_engaged) or brake or (v_ego <= CANCEL_CEIL_MS) + CC_IQ.useRadarAccel = chill + CC_IQ.radarSetSpeedKph = float(max(set_speed_kph, 0.0)) + CC_IQ.radarGapBars = int(min(3, max(1, ss.personality.raw + 1))) diff --git a/iqpilot/selfdrive/controls/lib/iq_dynamic/tests/__init__.py b/iqpilot/selfdrive/controls/lib/iq_dynamic/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/controls/lib/iq_longitudinal_planner.py b/iqpilot/selfdrive/controls/lib/iq_longitudinal_planner.py new file mode 100644 index 000000000..ca81573dc --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/iq_longitudinal_planner.py @@ -0,0 +1,256 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from datetime import datetime + +import numpy as np + +from iqpilot.cereal import messaging, custom +from iqdbc.car import structs +from iqpilot.common.constants import CV +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.car.cruise import V_CRUISE_MAX +from iqpilot.selfdrive.controls.lib.custom_stop_distance import CustomStopDistance +from iqpilot.selfdrive.controls.lib.iq_dynamic.engine import IQDynamicController +from iqpilot.selfdrive.controls.lib.iq_dynamic.imahelper import IQConstants +from iqpilot.selfdrive.controls.lib.helpers.e2e_alerts import EndToEndAlertEngine +from iqpilot.selfdrive.controls.lib.slc_vcruise import SLCVCruise +from iqpilot.selfdrive.controls.lib.speed_limit_controller import LIMIT_ADAPT_ACC +from iqpilot.selfdrive.selfdrived.iq_events import IQEvents +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle + +IQDynamicState = custom.IQPlan.IQDynamicControl.IQDynamicControlState +LongitudinalPlanSource = custom.IQPlan.LongitudinalPlanSource +SpeedLimitAssistState = custom.IQPlan.SpeedLimit.AssistState +SpeedLimitSource = custom.IQPlan.SpeedLimit.Source +NavProvider = custom.IQNavState.LongitudinalProvider +NavLongitudinalState = custom.IQNavState.LongitudinalState + +class LongitudinalPlannerIQ: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams, mpc): + self.events_iq = IQEvents() + self.iq_dynamic = IQDynamicController(CP, mpc) + self.custom_stop_distance = CustomStopDistance() + self.slimit = SLCVCruise() + self.generation = int(model_bundle.generation) if (model_bundle := get_active_bundle()) else None + self.source = LongitudinalPlanSource.cruise + self.e2e_alerts = EndToEndAlertEngine() + self.output_v_target = 0. + self.output_a_target = 0. + self.speed_limit_last = 0. + self.speed_limit_final_last = 0. + self.speed_limit_source = SpeedLimitSource.none + self.nav_engaged = False + self.nav_provider = NavProvider.none + self.nav_state = NavLongitudinalState.disabled + self.nav_speed_target = 0. + self.nav_accel_target = 0. + self.nav_valid = False + self.force_stop_timer = 0.0 + self.forcing_stop = False + self.override_force_stop = False + self.override_force_stop_timer = 0.0 + self.tracked_model_length = 0.0 + + def is_e2e(self, sm: messaging.SubMaster) -> bool: + experimental_mode = sm['selfdriveState'].experimentalMode + if not self.iq_dynamic.active(): + return experimental_mode + + return experimental_mode and self.iq_dynamic.mode() == "blended" + + def update_targets(self, sm: messaging.SubMaster, v_ego: float, v_cruise: float) -> float: + CS = sm['carState'] + v_cruise_cluster_kph = min(CS.vCruiseCluster, V_CRUISE_MAX) + v_cruise_cluster = v_cruise_cluster_kph * CV.KPH_TO_MS + # SLC should apply whenever IQ.Pilot is engaged, even on stock-longitudinal cars + # where carControl.longActive stays false. + slc_apply_enabled = bool(getattr(sm['selfdriveState'], "enabled", False)) + + nav_state = sm['iqNavState'] + self.nav_engaged = bool(getattr(nav_state, "longitudinalEngaged", False)) + self.nav_provider = getattr(nav_state, "longitudinalProvider", NavProvider.none) + self.nav_state = getattr(nav_state, "longitudinalState", NavLongitudinalState.disabled) + self.nav_speed_target = float(getattr(nav_state, "speedTarget", 0.0)) + self.nav_accel_target = float(getattr(nav_state, "accelTarget", 0.0)) + self.nav_valid = bool(getattr(nav_state, "valid", False) and self.nav_engaged) + + # IQ.Pilot custom Speed Limit Controller + now = datetime.now() + if hasattr(sm, "alive"): + time_validated = sm.alive.get('clocks', False) and getattr(sm['clocks'], 'timeValid', False) + else: + clocks = sm.get('clocks', None) if isinstance(sm, dict) else None + time_validated = bool(getattr(clocks, 'timeValid', False)) + slc_v_cruise = self.slimit.update(slc_apply_enabled, now, time_validated, v_cruise, v_ego, sm) + self.iq_dynamic.set_slc_experimental_mode(self.slimit.slc_experimental_mode) + self.iq_dynamic.update(sm) + # Prefer confirmed controller output for UI/planner rendering. + # Fall back to active (policy-resolved) target/source when confirmed is unavailable. + display_speed_limit = self.slimit.slc_target if self.slimit.slc_target > 0 else self.slimit.slc_active_target + display_source = self.slimit.slc_source if self.slimit.slc_source != "None" else self.slimit.slc_active_source + + if display_speed_limit > 0: + self.speed_limit_last = display_speed_limit + self.speed_limit_final_last = display_speed_limit + self.slimit.slc_offset + elif display_source == "None": + self.speed_limit_last = 0.0 + self.speed_limit_final_last = 0.0 + # Respect user-defined max cruise speed when applying SLC. + if v_cruise_cluster > 0 and self.speed_limit_final_last > 0: + self.speed_limit_final_last = min(self.speed_limit_final_last, v_cruise_cluster) + source_map = { + "Dashboard": SpeedLimitSource.car, + "Map Data": SpeedLimitSource.map, + "Mapbox": SpeedLimitSource.map, + "None": SpeedLimitSource.none, + } + self.speed_limit_source = source_map.get(display_source, SpeedLimitSource.none) + + targets = { + LongitudinalPlanSource.cruise: v_cruise, + LongitudinalPlanSource.speedLimitAssist: slc_v_cruise, + } + if self.nav_valid: + targets[LongitudinalPlanSource.nav] = self.nav_speed_target + + self.source = min(targets, key=lambda k: targets[k]) + self.output_v_target = targets[self.source] + self.output_v_target = self._apply_force_stop(self.output_v_target, v_ego, sm, slc_apply_enabled) + # envelope shaping only in Assist mode: info/warn must never change the plan + self._envelope_enabled = (slc_apply_enabled and bool(getattr(self.slimit, "controller_enabled", False)) + and bool(getattr(self.slimit, "mode_assist", False))) + return self.output_v_target + + def cruise_envelope(self, v_target: float, v_ego: float, t_idxs) -> np.ndarray: + """Per-timestep cruise speed over the MPC horizon: the scalar target, shaped down + ahead of an upcoming lower speed limit so the solver decelerates before the sign + instead of at it.""" + env = np.full(len(t_idxs), max(float(v_target), 0.0)) + if not getattr(self, "_envelope_enabled", False): + return env + slc = getattr(self.slimit, "slc", None) + next_limit = float(getattr(slc, "next_speed_limit", 0.0) or 0.0) + next_dist = float(getattr(slc, "next_speed_distance", 0.0) or 0.0) + if next_limit <= 0.0 or next_dist <= 0.0: + return env + next_target = max(next_limit + float(getattr(self.slimit, "slc_offset", 0.0) or 0.0), 0.0) + if next_target >= env[0]: + return env + travel = np.maximum(v_ego, 1.0) * np.asarray(t_idxs) + v_allowed = np.sqrt(np.maximum(next_target ** 2 + 2.0 * abs(LIMIT_ADAPT_ACC) * (next_dist - travel), next_target ** 2)) + return np.minimum(env, v_allowed) + + def update(self, sm: messaging.SubMaster) -> None: + self.events_iq.clear() + for event_name in getattr(self.slimit, 'pending_events', []): + self.events_iq.add(event_name) + self.custom_stop_distance.update() + self.e2e_alerts.update(sm, self.events_iq) + if bool(getattr(sm["iqCarState"], "alcOverrideAlert", False)): + self.events_iq.add(custom.IQOnroadEvent.EventName.steeringOverrideReengageAlc) + + def apply_e2e_stop_distance(self, sm: messaging.SubMaster, v_ego: float, a_target: float, should_stop: bool) -> tuple[float, bool]: + if not self.is_e2e(sm): + return a_target, should_stop + return self.custom_stop_distance.adjust_e2e_stop(a_target, should_stop, v_ego, sm['modelV2']) + + def _apply_force_stop(self, v_target: float, v_ego: float, sm: messaging.SubMaster, apply_enabled: bool) -> float: + force_stop = self.iq_dynamic.force_stop_requested() and apply_enabled and self.override_force_stop_timer <= 0.0 + self.force_stop_timer = self.force_stop_timer + DT_MDL if force_stop else 0.0 + force_stop_enabled = self.force_stop_timer >= 1.0 + force_stop_ramp_time = max(float(getattr(self.iq_dynamic, "model_stop_time", IQConstants.FORCE_STOP_PLANNER_TIME)), DT_MDL) + + accel_pressed = bool(getattr(sm["iqCarState"], "accelPressed", False)) + self.override_force_stop |= sm["carState"].gasPressed or accel_pressed + self.override_force_stop &= force_stop_enabled + + if self.override_force_stop: + self.override_force_stop_timer = 10.0 + elif self.override_force_stop_timer > 0.0: + self.override_force_stop_timer = max(0.0, self.override_force_stop_timer - DT_MDL) + else: + self.override_force_stop = False + + if force_stop_enabled and not self.override_force_stop: + self.forcing_stop = True + self.tracked_model_length = max(self.tracked_model_length - (v_ego * DT_MDL), 0.0) + if sm["carState"].standstill: + return 0.0 + return min(self.tracked_model_length / force_stop_ramp_time, v_target) + + self.forcing_stop = False + self.tracked_model_length = max( + float(getattr(self.iq_dynamic, "model_length", 0.0)), + float(getattr(self.iq_dynamic, "minimum_force_stop_length", 0.0)), + 0.0, + ) + return v_target + + def publish_longitudinal_plan_iq(self, sm: messaging.SubMaster, pm: messaging.PubMaster) -> None: + def fill_plan(plan_msg) -> None: + plan_msg.longitudinalPlanSource = self.source + plan_msg.vTarget = float(self.output_v_target) + plan_msg.aTarget = float(self.output_a_target) + plan_msg.events = self.events_iq.to_msg() + + # IQ.Dynamic control state + iq_dynamic = plan_msg.iqDynamic + iq_dynamic.state = IQDynamicState.blended if self.iq_dynamic.mode() == 'blended' else IQDynamicState.acc + iq_dynamic.enabled = self.iq_dynamic.enabled() + iq_dynamic.active = self.iq_dynamic.active() + + nav_summary = plan_msg.iqNavState.nav + nav_summary.engaged = self.nav_engaged + nav_summary.provider = self.nav_provider + nav_summary.state = self.nav_state + nav_summary.speedTarget = float(self.nav_speed_target) + nav_summary.accelTarget = float(self.nav_accel_target) + nav_summary.valid = self.nav_valid + + # Speed Limit + speedLimit = plan_msg.speedLimit + resolver = speedLimit.resolver + speed_limit = float(self.slimit.slc_target if self.slimit.slc_target > 0 else self.slimit.slc_active_target) + speed_limit_offset = float(self.slimit.slc_offset) + speed_limit_final = speed_limit + speed_limit_offset if speed_limit > 0 else 0. + speed_limit_valid = speed_limit > 0. + speed_limit_last_valid = self.speed_limit_last > 0. + + resolver.speedLimit = speed_limit + resolver.speedLimitLast = float(self.speed_limit_last) + resolver.speedLimitFinal = float(speed_limit_final) + resolver.speedLimitFinalLast = float(self.speed_limit_final_last) + resolver.speedLimitValid = speed_limit_valid + resolver.speedLimitLastValid = speed_limit_last_valid + resolver.speedLimitOffset = speed_limit_offset + resolver.distToSpeedLimit = 0. + resolver.source = self.speed_limit_source + + assist = speedLimit.assist + slc_assist_state = self.slimit.assist_state + assist.enabled = bool(self.slimit.slc_target > 0 or self.slimit.slc_unconfirmed > 0) + assist.active = self.source == LongitudinalPlanSource.speedLimitAssist and self.slimit.slc_target > 0 + if slc_assist_state is not None: + assist.state = slc_assist_state + elif not assist.enabled: + assist.state = SpeedLimitAssistState.disabled + elif self.slimit.slc_unconfirmed > 0: + assist.state = SpeedLimitAssistState.preActive + elif assist.active: + assist.state = SpeedLimitAssistState.active + else: + assist.state = SpeedLimitAssistState.inactive + assist.vTarget = float(self.output_v_target if assist.active else 255.) + assist.aTarget = float(self.slimit.slc_a_target if assist.active else 0.) + + e2eAlerts = plan_msg.e2eAlerts + e2eAlerts.pathOpen = self.e2e_alerts.path_alert + e2eAlerts.leadPullaway = self.e2e_alerts.lead_alert + + valid = sm.all_checks(service_list=['carState', 'controlsState']) + + plan_iq_send = messaging.new_message('iqPlan') + plan_iq_send.valid = valid + fill_plan(plan_iq_send.iqPlan) + pm.send('iqPlan', plan_iq_send) diff --git a/iqpilot/selfdrive/controls/lib/latcontrol.py b/iqpilot/selfdrive/controls/lib/latcontrol.py new file mode 100644 index 000000000..c6f17fd01 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/latcontrol.py @@ -0,0 +1,31 @@ +import numpy as np +from abc import abstractmethod, ABC +from iqpilot.selfdrive.locationd.helpers import Pose + + +class LatControl(ABC): + def __init__(self, CP, CP_IQ, CI, dt): + self.dt = dt + self.sat_limit = CP.steerLimitTimer + self.sat_time = 0. + self.sat_check_min_speed = 10. + + # we define the steer torque scale as [-1.0...1.0] + self.steer_max = 1.0 + + @abstractmethod + def update(self, active: bool, CS, VM, params, steer_limited_by_safety: bool, desired_curvature: float, calibrated_pose: Pose, + curvature_limited: bool, lat_delay: float): + pass + + def reset(self): + self.sat_time = 0. + + def _check_saturation(self, saturated, CS, steer_limited_by_safety, curvature_limited): + # Saturated only if control output is not being limited by car torque/angle rate limits + if (saturated or curvature_limited) and CS.vEgo > self.sat_check_min_speed and not steer_limited_by_safety and not CS.steeringPressed: + self.sat_time += self.dt + else: + self.sat_time -= self.dt + self.sat_time = np.clip(self.sat_time, 0.0, self.sat_limit) + return self.sat_time > (self.sat_limit - 1e-3) diff --git a/iqpilot/selfdrive/controls/lib/latcontrol_angle.py b/iqpilot/selfdrive/controls/lib/latcontrol_angle.py new file mode 100644 index 000000000..375920242 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/latcontrol_angle.py @@ -0,0 +1,52 @@ +import math + +from iqpilot.cereal import log +from iqpilot.common.params import Params +from iqpilot.selfdrive.controls.lib.latcontrol import LatControl +from iqpilot.selfdrive.controls.lib.drive_helpers import clip_curvature + +# TODO This is speed dependent +STEER_ANGLE_SATURATION_THRESHOLD = 2.5 # Degrees + + +class LatControlAngle(LatControl): + def __init__(self, CP, CP_IQ, CI, dt): + super().__init__(CP, CP_IQ, CI, dt) + self.sat_check_min_speed = 5. + self.use_steer_limited_by_safety = CP.brand == "tesla" + self.curvature_lookahead_enabled = Params().get_bool("IQLateralCurvatureLookahead") + self.target_curvature_last = 0.0 + + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, calibrated_pose, curvature_limited, lat_delay, + lookahead_curvature=None): + angle_log = log.ControlsState.LateralAngleState.new_message() + + # the rack has ~70 ms of dead time before the wheel moves (measured on VW MQB), so track the + # curvature the path will need after lat_delay rather than the one it needs now. controlsd passes + # lookahead_curvature=None in maneuver mode, which keeps the maneuver report measuring raw response. + # controlsd only runs clip_curvature on desired_curvature, so the lookahead has to be bounded here + # or the ISO jerk/accel limits are bypassed on the way to the rack. + target_curvature = desired_curvature + if active and self.curvature_lookahead_enabled and lookahead_curvature is not None: + target_curvature, _ = clip_curvature(CS.vEgo, self.target_curvature_last, lookahead_curvature, params.roll) + self.target_curvature_last = target_curvature + + if not active: + angle_log.active = False + angle_steers_des = float(CS.steeringAngleDeg) + else: + angle_log.active = True + angle_steers_des = math.degrees(VM.get_steer_from_curvature(-target_curvature, CS.vEgo, params.roll)) + angle_steers_des += params.angleOffsetDeg + + if self.use_steer_limited_by_safety: + # these cars' carcontrollers calculate max lateral accel and jerk, so we can rely on carOutput for saturation + angle_control_saturated = steer_limited_by_safety + else: + # for cars which use a method of limiting torque such as a torque signal (Nissan and Toyota) + # or relying on EPS (Ford Q3), carOutput does not capture maxing out torque # TODO: this can be improved + angle_control_saturated = abs(angle_steers_des - CS.steeringAngleDeg) > STEER_ANGLE_SATURATION_THRESHOLD + angle_log.saturated = bool(self._check_saturation(angle_control_saturated, CS, False, curvature_limited)) + angle_log.steeringAngleDeg = float(CS.steeringAngleDeg) + angle_log.steeringAngleDesiredDeg = angle_steers_des + return 0, float(angle_steers_des), angle_log diff --git a/iqpilot/selfdrive/controls/lib/latcontrol_pid.py b/iqpilot/selfdrive/controls/lib/latcontrol_pid.py new file mode 100644 index 000000000..3142c136e --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/latcontrol_pid.py @@ -0,0 +1,50 @@ +import math + +from iqpilot.cereal import log +from iqpilot.selfdrive.controls.lib.latcontrol import LatControl +from iqpilot.common.pid import PIDController + + +class LatControlPID(LatControl): + def __init__(self, CP, CP_IQ, CI, dt): + super().__init__(CP, CP_IQ, CI, dt) + self.pid = PIDController((CP.lateralTuning.pid.kpBP, CP.lateralTuning.pid.kpV), + (CP.lateralTuning.pid.kiBP, CP.lateralTuning.pid.kiV), + pos_limit=self.steer_max, neg_limit=-self.steer_max) + self.ff_factor = CP.lateralTuning.pid.kf + self.get_steer_feedforward = CI.get_steer_feedforward_function() + + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, calibrated_pose, curvature_limited, lat_delay, + lookahead_curvature=None): + pid_log = log.ControlsState.LateralPIDState.new_message() + pid_log.steeringAngleDeg = float(CS.steeringAngleDeg) + pid_log.steeringRateDeg = float(CS.steeringRateDeg) + + angle_steers_des_no_offset = math.degrees(VM.get_steer_from_curvature(-desired_curvature, CS.vEgo, params.roll)) + angle_steers_des = angle_steers_des_no_offset + params.angleOffsetDeg + error = angle_steers_des - CS.steeringAngleDeg + + pid_log.steeringAngleDesiredDeg = angle_steers_des + pid_log.angleError = error + if not active: + output_torque = 0.0 + pid_log.active = False + + else: + # offset does not contribute to resistive torque + ff = self.ff_factor * self.get_steer_feedforward(angle_steers_des_no_offset, CS.vEgo) + freeze_integrator = steer_limited_by_safety or CS.steeringPressed or CS.vEgo < 5 + + output_torque = self.pid.update(error, + feedforward=ff, + speed=CS.vEgo, + freeze_integrator=freeze_integrator) + + pid_log.active = True + pid_log.p = float(self.pid.p) + pid_log.i = float(self.pid.i) + pid_log.f = float(self.pid.f) + pid_log.output = float(output_torque) + pid_log.saturated = bool(self._check_saturation(self.steer_max - abs(output_torque) < 1e-3, CS, steer_limited_by_safety, curvature_limited)) + + return output_torque, angle_steers_des, pid_log diff --git a/iqpilot/selfdrive/controls/lib/latcontrol_torque.py b/iqpilot/selfdrive/controls/lib/latcontrol_torque.py new file mode 100644 index 000000000..8f4eb094d --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/latcontrol_torque.py @@ -0,0 +1,666 @@ +import json +import math +import os +import tomllib +from collections import deque +from difflib import SequenceMatcher +from importlib.resources import files + +import numpy as np + +from iqpilot.cereal import log, custom # noqa: F401 (custom kept available for downstream imports) +from iqdbc.car import structs +from iqdbc.car.lateral import FRICTION_THRESHOLD, get_friction +from iqdbc.car.toyota.values import ToyotaFlags +from iqdbc.lvbs.car.interfaces import LatControlInputs +from iqdbc.lvbs.car.iq_lateral import get_friction as get_friction_in_torque_space +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.params import Params +from iqpilot.common.pid import PIDController +from iqpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N +from iqpilot.selfdrive.controls.lib.lateral_acceleration_slew_limiter import LateralAccelerationSlewLimiter +from iqpilot.selfdrive.controls.lib.latcontrol import LatControl +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.iqmodeld.parser import safe_exp +from iqpilot.selfdrive.controls.lib.helpers.nav_torque_pulse import NavTorquePulseBrain + + +# ===== locator ===== + +TORQUE_NN_MODEL_PATH = os.path.join(BASEDIR, "iqpilot", "iqpilot_iq_nnff_models", "neural_network_lateral_control") +TORQUE_NN_MODEL_SUBSTITUTE_PATH = files("iqdbc").joinpath("car", "torque_data", "substitute.toml") +MOCK_MODEL_PATH = os.path.join(TORQUE_NN_MODEL_PATH, "MOCK.json") + +# A candidate must reach this score for the fingerprint(+fw) match to count as exact. +_EXACT_THRESHOLD = 0.99 +# Below this, we fall back to the next candidate ladder rung. +_ACCEPT_THRESHOLD = 0.9 + + +def _score(a: str, b: str) -> float: + return SequenceMatcher(None, a, b).ratio() + + +def _best_model_for(candidate: str) -> tuple[str | None, float]: + """Highest-scoring model file for a candidate string; (path, score).""" + best_path, best_score = None, -1.0 + if not os.path.isdir(TORQUE_NN_MODEL_PATH): + return best_path, best_score + for entry in os.listdir(TORQUE_NN_MODEL_PATH): + if not entry.endswith(".json"): + continue + score = _score(os.path.splitext(entry)[0], candidate) + if score > best_score: + best_path, best_score = os.path.join(TORQUE_NN_MODEL_PATH, entry), score + return best_path, best_score + + +def _substitute_for(fingerprint: str) -> str: + with open(TORQUE_NN_MODEL_SUBSTITUTE_PATH, 'rb') as f: + table = tomllib.load(f) + return table.get(fingerprint, fingerprint) + + +def _eps_suffix(CP: structs.CarParams) -> str: + eps_fw = str(next((fw.fwVersion for fw in CP.carFw if fw.ecu == "eps"), "")) + return eps_fw.replace("\\", "") if len(eps_fw) > 3 else "" + + +def get_nn_model_path(CP: structs.CarParams) -> tuple[str, str, bool]: + """Pick the closest NNFF model for this car. + + Angle-steered cars always get MOCK. Otherwise walk a candidate ladder — + fingerprint+eps-fw, then fingerprint, then the substitute mapping — accepting + the first rung that clears the match threshold; the top rung landing at ~1.0 + marks an exact (non-fuzzy) match. + """ + if CP.steerControlType == structs.CarParams.SteerControlType.angle: + return MOCK_MODEL_PATH, "MOCK", False + + fingerprint = CP.carFingerprint + suffix = _eps_suffix(CP) + + # rung 1: fingerprint + eps fw (when we have a usable fw string) + if suffix: + path, score = _best_model_for(f"{fingerprint} {suffix}") + if path is not None and fingerprint in path and score >= _ACCEPT_THRESHOLD: + name = os.path.splitext(os.path.basename(path))[0] + return path, name, score >= _EXACT_THRESHOLD + + # rung 2: fingerprint alone + path, score = _best_model_for(fingerprint) + if path is not None and fingerprint in path and score >= _ACCEPT_THRESHOLD: + name = os.path.splitext(os.path.basename(path))[0] + return path, name, score >= _EXACT_THRESHOLD + + # rung 3: substitute mapping — never exact + path, _ = _best_model_for(_substitute_for(fingerprint)) + name = os.path.splitext(os.path.basename(path))[0] if path else "MOCK" + return (path or MOCK_MODEL_PATH), name, False + +# ===== network ===== + +# The JSON model format (Twilsonco NNFF) is external: unicode '΃' names the +# sigmoid activation, weights/biases live under keys suffixed _W/_b, and the +# input normalisation is (x - mean) / std. We translate names through a registry +# and keep the mean/std transposed once at load. +_MIN_INPUT_LEN = 2 +_FRICTION_PROBE = (10.0, 0.0, 0.2) +_FRICTION_THRESHOLD = 0.1 + +_ACTIVATION_ALIASES = {"΃": "sigmoid"} + + +def _sigmoid(x): + return 1.0 / (1.0 + safe_exp(-x)) + + +def _identity(x): + return x + + +_ACTIVATIONS = {"sigmoid": _sigmoid, "identity": _identity} + + +def _resolve_activation(name: str): + for symbol, canonical in _ACTIVATION_ALIASES.items(): + name = name.replace(symbol, canonical) + fn = _ACTIVATIONS.get(name) + if fn is None: + raise ValueError(f"Unknown activation: {name}") + return fn + + +def _pick(layer: dict, suffix: str): + key = next(k for k in layer if k.endswith(suffix)) + return np.array(layer[key], dtype=np.float32).T + + +class NNTorqueModel: + def __init__(self, params_file, zero_bias=False): + with open(params_file) as f: + params = json.load(f) + + self.input_size = params["input_size"] + self.output_size = params["output_size"] + self.input_mean = np.array(params["input_mean"], dtype=np.float32).T + self.input_std = np.array(params["input_std"], dtype=np.float32).T + + self._weights = [] + self._biases = [] + self._activations = [] + for layer in params["layers"]: + weight = _pick(layer, "_W") + bias = np.zeros_like(_pick(layer, "_b")) if zero_bias else _pick(layer, "_b") + self._weights.append(weight) + self._biases.append(bias) + self._activations.append(_resolve_activation(layer["activation"])) + + self.friction_override = self.evaluate(list(_FRICTION_PROBE)) < _FRICTION_THRESHOLD + + def forward(self, x): + for weight, bias, activation in zip(self._weights, self._biases, self._activations, strict=True): + x = activation(x.dot(weight) + bias) + return x + + def evaluate(self, input_array): + if len(input_array) != self.input_size: + if len(input_array) < _MIN_INPUT_LEN: + raise ValueError(f"Input array length {len(input_array)} must be length 2 or greater") + input_array = input_array + [0] * (self.input_size - len(input_array)) + x = (np.array(input_array, dtype=np.float32) - self.input_mean) / self.input_std + return float(self.forward(x)[0, 0]) + + # names kept for callers/tests that introspected the old implementation + @staticmethod + def sigmoid(x): + return _sigmoid(x) + + @staticmethod + def identity(x): + return _identity(x) + +# ===== brain ===== + +PLAN_SAMPLE_START = 5 +LAG_EXTRA_S = 0.0 +JERK_AHEAD_TAU_S = 0.15 # low-pass on the model-derived jerk feed-forward (kills big-model accel.y noise) +JERK_PARAM_REFRESH = 100 # cycles (~1s at 100Hz) + +BASE_P = 0.8 +BASE_I = 0.15 +PID_SPEED_BP = [1, 1.5, 2.0, 3.0, 5, 7.5, 10, 15, 30] +PID_P_GAIN = [250, 120, 65, 30, 11.5, 5.5, 3.5, 2.0, BASE_P] + +_JERK_FALLBACK_IDX = 16 # T_IDXS index used when nothing exceeds the lookahead horizon + + +def sign(value: float) -> float: + if value > 0.0: + return 1.0 + if value < 0.0: + return -1.0 + return 0.0 + + +polarity = sign + + +def _pointwise_jerk(accel_trace, dt_trace) -> list: + """Finite-difference jerk from an acceleration trace over per-step dt.""" + delta = np.diff(accel_trace) + span = min(len(delta), len(dt_trace)) + if span <= 0: + return [] + return (delta[:span] / np.array(dt_trace)[:span]).tolist() + + +def sign_locked_min(future_vals, seed_val): + """Smallest-magnitude jerk over the horizon, but only if the whole horizon + agrees in sign with the seed; a sign disagreement collapses to 0.""" + if not future_vals: + return seed_val + agreeing = [v for v in future_vals if sign(v) == sign(seed_val)] + if len(agreeing) < len(future_vals): + return 0.0 + return min(agreeing + [seed_val], key=abs) + + +class PilotLateralBrain: + """Shared lateral-control scaffolding: PID core, model snapshot, and the + forward-looking jerk/friction estimates the feed-forward controllers build on.""" + + def __init__(self, torque_ctrl, cp, cp_iq, car_if): + del cp_iq + self.lac_torque = torque_ctrl + self.torque_from_lateral_accel_in_torque_space = car_if.torque_from_lateral_accel_in_torque_space() + + self.model_v2 = None + self.model_valid = False + + self.jerk_now = 0.0 + self.jerk_goal = 0.0 + self.jerk_obs = 0.0 + self.jerk_ahead = 0.0 + + # per-cycle control snapshot + self._ff = 0.0 + self._pid = PIDController([PID_SPEED_BP, PID_P_GAIN], BASE_I) + self._pid_log = None + self._accel_goal = 0.0 + self._accel_obs = 0.0 + self._roll_g = 0.0 + self._deadband = 0.0 + self._want_la = 0.0 + self._have_la = 0.0 + self._want_cv = 0.0 + self._have_cv = 0.0 + self._grav_la = 0.0 + self._capped = False + self._out_tq = 0.0 + + # friction-lookahead tuning + self.friction_look_ahead_v = [1.4, 2.0] + self.friction_look_ahead_bp = [9.0, 30.0] + self.lat_jerk_friction_factor = 0.4 + self.lat_accel_friction_factor = 0.7 + # The model-derived jerk term is a frame-to-frame derivative of model_v2.acceleration.y; on + # spatial/big models that array is slightly noisy and the raw derivative drives in-lane steering + # oscillation (sunny/stock has no such term). Low-pass it, and expose a live gain so it can be + # tuned to 0 (== stock friction ff) without a software push. + self._jerk_lp = FirstOrderFilter(0.0, JERK_AHEAD_TAU_S, 0.01) + self._jerk_gain = 1.0 + self._jerk_param_frame = 0 + self._jerk_param_ok = True + self._params = Params() + + self.t_diffs = np.diff(ModelConstants.T_IDXS) + self.desired_lat_jerk_time = cp.steerActuatorDelay + LAG_EXTRA_S + + def update_model_v2(self, model_packet): + self.model_v2 = model_packet + self.model_valid = model_packet is not None and len(model_packet.orientation.x) >= CONTROL_N + + def update_lateral_lag(self, lag): + self.desired_lat_jerk_time = max(0.01, lag) + LAG_EXTRA_S + + def update_friction_input(self, target_val, measured_val): + error = target_val - measured_val + return self.lat_accel_friction_factor * error + self.lat_jerk_friction_factor * self.jerk_ahead + + def _measured_jerk(self, car_state, vehicle_model) -> float: + curvature_rate = -vehicle_model.calc_curvature(math.radians(car_state.steeringRateDeg), car_state.vEgo, 0.0) + return curvature_rate * car_state.vEgo ** 2 + + def _horizon_index(self, speed_mps: float) -> int: + lookahead = np.interp(speed_mps, self.friction_look_ahead_bp, self.friction_look_ahead_v) + return next((i for i, t in enumerate(ModelConstants.T_IDXS) if t > lookahead), _JERK_FALLBACK_IDX) + + def _reset_jerk_estimates(self, car_state, vehicle_model): + self.jerk_now = self._measured_jerk(car_state, vehicle_model) + self.jerk_goal = 0.0 + self.jerk_obs = 0.0 + self.jerk_ahead = 0.0 + + def update_calculations(self, car_state, vehicle_model, desired_lat_accel): + self._jerk_param_frame += 1 + if self._jerk_param_ok and self._jerk_param_frame % JERK_PARAM_REFRESH == 0: + try: + raw = self._params.get("IQLatJerkGain") + self._jerk_gain = float(raw) if raw not in (None, b"", "") else 1.0 + except (ValueError, TypeError): + self._jerk_gain = 1.0 + except Exception: + # param key absent (params not rebuilt) — never let a param read touch lateral control + self._jerk_param_ok = False + self._jerk_gain = 1.0 + self._reset_jerk_estimates(car_state, vehicle_model) + if not self.model_valid: + return + + accel_y = self.model_v2.acceleration.y + horizon_accel = np.interp(self.desired_lat_jerk_time, ModelConstants.T_IDXS, accel_y) + desired_jerk = (horizon_accel - desired_lat_accel) / self.desired_lat_jerk_time + + forecast = _pointwise_jerk(accel_y, self.t_diffs) + window = forecast[PLAN_SAMPLE_START:self._horizon_index(car_state.vEgo)] + self.jerk_ahead = sign_locked_min(window, desired_jerk) + self.jerk_ahead = self._jerk_lp.update(self.jerk_ahead) * self._jerk_gain + + if self.jerk_ahead == 0.0: + self.jerk_now = 0.0 + self.lat_accel_friction_factor = 1.0 + + self.jerk_goal = self.lat_jerk_friction_factor * self.jerk_ahead + self.jerk_obs = self.lat_jerk_friction_factor * self.jerk_now + + +TorqueBrainCore = PilotLateralBrain + +# ===== nnff ===== + +LOW_SPEED_X = [0, 10, 20, 30] +LOW_SPEED_Y = [12, 3, 1, 0] + +# NNFF input layout expected by the trained models (dictated by the model data): +# 4 scalars (v_ego, target, jerk, roll) + past/future target repeats + past/future rolls. +_ERROR_BLEND_BP = [1.0, 2.0] +_ERROR_BLEND_V = [0.0, 1.0] + + +def roll_pitch_adjust(roll, pitch): + return roll * math.cos(pitch) + + +class _HistoryWindow: + """Rolling past/future sample windows the NNFF vector is assembled from.""" + + def __init__(self, past_times, future_times, jerk_time): + self.past_times = past_times + self.future_times = future_times + self.jerk_time = jerk_time + self.nn_future_times = [t + jerk_time for t in future_times] + + check_frames = [int(abs(t) * 100) for t in past_times] + self.frame_offsets = [check_frames[0] - f for f in check_frames] + maxlen = check_frames[0] + self.roll = deque(maxlen=maxlen) + self.lat_accel_desired = deque(maxlen=maxlen) + self.past_future_len = len(past_times) + len(self.nn_future_times) + + def refresh_lag(self, jerk_time): + self.jerk_time = jerk_time + self.nn_future_times = [t + jerk_time for t in self.future_times] + + def push(self, roll, lat_accel_desired): + self.roll.append(roll) + self.lat_accel_desired.append(lat_accel_desired) + + def _sample(self, buf): + return [buf[min(len(buf) - 1, i)] for i in self.frame_offsets] + + def past_rolls(self): + return self._sample(self.roll) + + def past_lat_accels(self): + return self._sample(self.lat_accel_desired) + + +class NeuralNetworkFeedForward(PilotLateralBrain): + def __init__(self, lac_torque, CP, CP_IQ, CI): + super().__init__(lac_torque, CP, CP_IQ, CI) + self.params = Params() + self.enabled = self.params.get_bool("NeuralNetworkFeedForward") + # NNFF applies only when a real trained model for this car is present on disk. + # No models shipped (or no match / MOCK) -> skip NNFF entirely and fall back to + # the stock torque feed-forward. Models are re-added as they are retrained. + self.has_nn_model = (CP_IQ.iqLateralNet.model.path != MOCK_MODEL_PATH + and os.path.isfile(CP_IQ.iqLateralNet.model.path)) + self.model = NNTorqueModel(CP_IQ.iqLateralNet.model.path) if self.has_nn_model else None + self.pitch = FirstOrderFilter(0.0, 0.5, 0.01) + self.pitch_last = 0.0 + + self.future_times = [0.3, 0.6, 1.0, 1.5] + self._window = _HistoryWindow([-0.3, -0.2, -0.1], self.future_times, self.desired_lat_jerk_time) + self.nav_torque_pulse = NavTorquePulseBrain(lac_torque) + + # -- back-compat views onto the history window ------------------------------- + @property + def nn_future_times(self): + return self._window.nn_future_times + + @property + def past_future_len(self): + return self._window.past_future_len + + @property + def _nnff_enabled(self): + return self.enabled and self.model_valid and self.has_nn_model + + def update_limits(self): + if not self._nnff_enabled: + return + self._pid.set_limits(self.lac_torque.steer_max, -self.lac_torque.steer_max) + + def update_lateral_lag(self, lag): + super().update_lateral_lag(lag) + self._window.refresh_lag(self.desired_lat_jerk_time) + + # -- torque-space feedforward (non-NN path used for error scaling) ----------- + def _torque_space(self, lateral_accel, CS, gravity_adjusted): + return self.torque_from_lateral_accel_in_torque_space( + LatControlInputs(lateral_accel, self._roll_g, CS.vEgo, CS.aEgo), + self.lac_torque.torque_params, gravity_adjusted=gravity_adjusted) + + def update_feedforward_torque_space(self, CS): + torque_from_setpoint = self._torque_space(self._accel_goal, CS, gravity_adjusted=False) + torque_from_measurement = self._torque_space(self._accel_obs, CS, gravity_adjusted=False) + self._pid_log.error = float(torque_from_setpoint - torque_from_measurement) + self._ff = self._torque_space(self._grav_la, CS, gravity_adjusted=True) + self._ff += get_friction_in_torque_space(self._want_la - self._have_la, + self._deadband, FRICTION_THRESHOLD, + self.lac_torque.torque_params) + + def update_output_torque(self, CS): + freeze_integrator = self._capped or CS.steeringPressed or CS.vEgo < 5 + self._out_tq = self._pid.update(self._pid_log.error, feedforward=self._ff, + speed=CS.vEgo, freeze_integrator=freeze_integrator) + + # -- NN input assembly ------------------------------------------------------- + def _effective_roll(self, params, calibrated_pose): + roll = params.roll + if calibrated_pose is not None: + pitch = self.pitch.update(calibrated_pose.orientation.pitch) + roll = roll_pitch_adjust(roll, pitch) + self.pitch_last = pitch + return roll + + def _future_rolls(self, roll, adjusted_future_times): + return [roll_pitch_adjust(np.interp(t, ModelConstants.T_IDXS, self.model_v2.orientation.x) + roll, + np.interp(t, ModelConstants.T_IDXS, self.model_v2.orientation.y) + self.pitch_last) + for t in adjusted_future_times] + + def _future_lat_accels(self, adjusted_future_times): + return [np.interp(t, ModelConstants.T_IDXS, self.model_v2.acceleration.y) for t in adjusted_future_times] + + def _query(self, lead_scalar, jerk_scalar, tail): + """Build one model input from its 4 leading scalars + the shared tail, then + run the interpreter. `tail` is (repeat_value_or_None, extra_pairs...).""" + head = [self._v, lead_scalar, jerk_scalar, self._roll] + return self.model.evaluate(head + tail) + + def update_neural_network_feedforward(self, CS, params, calibrated_pose) -> None: + if not self._nnff_enabled: + return + + self.update_feedforward_torque_space(CS) + creep = float(np.interp(CS.vEgo, LOW_SPEED_X, LOW_SPEED_Y)) ** 2 + self._accel_goal = self._want_la + creep * self._want_cv + self._accel_obs = self._have_la + creep * self._have_cv + + # cache per-cycle scalars the query builder reads + self._v = CS.vEgo + self._roll = self._effective_roll(params, calibrated_pose) + self._window.push(self._roll, self._want_la) + + horizon = [t + 0.5 * CS.aEgo * (t / max(CS.vEgo, 1.0)) for t in self.nn_future_times] + roll_ctx = self._window.past_rolls() + self._future_rolls(self._roll, horizon) + accel_ctx = self._window.past_lat_accels() + self._future_lat_accels(horizon) + + goal_torque = self._query(self._accel_goal, self.jerk_goal, [self._accel_goal] * self.past_future_len + roll_ctx) + obs_torque = self._query(self._accel_obs, self.jerk_obs, [self._accel_obs] * self.past_future_len + roll_ctx) + self._pid_log.error = goal_torque - obs_torque + self._apply_error_blend() + + friction_input = self.update_friction_input(self._accel_goal, self._accel_obs) + self._ff = self._query(self._want_la, friction_input, accel_ctx + roll_ctx) + if self.model.friction_override: + self._pid_log.error += get_friction(friction_input, self._deadband, + FRICTION_THRESHOLD, self.lac_torque.torque_params) + + self.update_output_torque(CS) + + def _apply_error_blend(self): + blend = float(np.interp(abs(self._want_la), _ERROR_BLEND_BP, _ERROR_BLEND_V)) + if blend <= 0.0: + return + # error query carries a 0.0 roll slot (not the live roll), so build it directly + from_error = self.model.evaluate([self._v, self._accel_goal - self._accel_obs, + self.jerk_goal - self.jerk_obs, 0.0]) + live = self._pid_log.error + if sign(live) == sign(from_error) and abs(live) < abs(from_error): + self._pid_log.error = live * (1.0 - blend) + from_error * blend + + # -- per-cycle snapshot + entry point ---------------------------------------- + def _snapshot_cycle(self, feedforward_seed, pid_core, pid_trace, torque_goal, torque_actual, roll_bias, + deadzone, lat_accel_goal, lat_accel_actual, curvature_goal, curvature_actual, + gravity_lat_accel, safety_limited, torque_output) -> None: + self._ff = feedforward_seed + self._pid = pid_core + self._pid_log = pid_trace + self._accel_goal = torque_goal + self._accel_obs = torque_actual + self._roll_g = roll_bias + self._deadband = deadzone + self._want_la = lat_accel_goal + self._have_la = lat_accel_actual + self._want_cv = curvature_goal + self._have_cv = curvature_actual + self._grav_la = gravity_lat_accel + self._capped = safety_limited + self._out_tq = torque_output + + def update(self, car_state, vehicle_model, pid_core, calibrator, feedforward_seed, pid_trace, + torque_goal, torque_actual, calibrated_pose, roll_bias, lat_accel_goal, lat_accel_actual, + deadzone, gravity_lat_accel, curvature_goal, curvature_actual, safety_limited, torque_output): + self._snapshot_cycle(feedforward_seed, pid_core, pid_trace, torque_goal, torque_actual, roll_bias, + deadzone, lat_accel_goal, lat_accel_actual, curvature_goal, curvature_actual, + gravity_lat_accel, safety_limited, torque_output) + self.update_calculations(car_state, vehicle_model, lat_accel_goal) + self.update_neural_network_feedforward(car_state, calibrator, calibrated_pose) + self._out_tq = self.nav_torque_pulse.nudge_output_torque(True, car_state, self._out_tq) + return self._pid_log, self._out_tq + + +# At higher speeds (25+mph) we can assume: +# Lateral acceleration achieved by a specific car correlates to +# torque applied to the steering rack. It does not correlate to +# wheel slip, or to speed. + +# This controller applies torque to achieve desired lateral +# accelerations. To compensate for the low speed effects the +# proportional gain is increased at low speeds by the PID controller. +# Additionally, there is friction in the steering wheel that needs +# to be overcome to move it at all, this is compensated for too. + +KP = 0.8 +KI = 0.15 + +INTERP_SPEEDS = [1, 1.5, 2.0, 3.0, 5, 7.5, 10, 15, 30] +KP_INTERP = [250, 120, 65, 30, 11.5, 5.5, 3.5, 2.0, KP] + +LP_FILTER_CUTOFF_HZ = 1.2 +JERK_LOOKAHEAD_SECONDS = 0.19 +JERK_GAIN = 0.3 +LAT_ACCEL_REQUEST_BUFFER_SECONDS = 1.0 +VERSION = 1 + +class LatControlTorque(LatControl): + def __init__(self, CP, CP_IQ, CI, dt): + super().__init__(CP, CP_IQ, CI, dt) + self.torque_params = CP.lateralTuning.torque.as_builder() + self.torque_from_lateral_accel = CI.torque_from_lateral_accel() + self.lateral_accel_from_torque = CI.lateral_accel_from_torque() + self.pid = PIDController([INTERP_SPEEDS, KP_INTERP], KI, rate=1/self.dt) + self.update_limits() + self.steering_angle_deadzone_deg = self.torque_params.steeringAngleDeadzoneDeg + self.lat_accel_request_buffer_len = int(LAT_ACCEL_REQUEST_BUFFER_SECONDS / self.dt) + self.lat_accel_request_buffer = deque([0.] * self.lat_accel_request_buffer_len , maxlen=self.lat_accel_request_buffer_len) + self.lookahead_frames = int(JERK_LOOKAHEAD_SECONDS / self.dt) + self.jerk_filter = FirstOrderFilter(0.0, 1 / (2 * np.pi * LP_FILTER_CUTOFF_HZ), self.dt) + self.setpoint_lead_enabled = CP.brand == "toyota" and bool(CP.flags & ToyotaFlags.TSS2) + self.setpoint_lead_filter = FirstOrderFilter(0.0, 1 / (2 * np.pi * LP_FILTER_CUTOFF_HZ), self.dt) + self.lateral_acceleration_slew_limiter = LateralAccelerationSlewLimiter(Params().get_bool("IQLateralAccelSlew")) + self.curvature_lookahead_enabled = Params().get_bool("IQLateralCurvatureLookahead") + + self.nnff_assist = NeuralNetworkFeedForward(self, CP, CP_IQ, CI) + + def update_live_torque_params(self, latAccelFactor, latAccelOffset, friction): + self.torque_params.latAccelFactor = latAccelFactor + self.torque_params.latAccelOffset = latAccelOffset + self.torque_params.friction = friction + self.update_limits() + + def update_limits(self): + self.pid.set_limits(self.lateral_accel_from_torque(self.steer_max, self.torque_params), + self.lateral_accel_from_torque(-self.steer_max, self.torque_params)) + + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, calibrated_pose, curvature_limited, lat_delay, + lookahead_curvature=None): + pid_log = log.ControlsState.LateralTorqueState.new_message() + pid_log.version = VERSION + measured_curvature = -VM.calc_curvature(math.radians(CS.steeringAngleDeg - params.angleOffsetDeg), CS.vEgo, params.roll) + measurement = measured_curvature * CS.vEgo ** 2 + target_curvature = desired_curvature + if self.curvature_lookahead_enabled and lookahead_curvature is not None: + target_curvature = lookahead_curvature + if not active and self.lateral_acceleration_slew_limiter.enabled: + self.lateral_acceleration_slew_limiter.reset(target_curvature * CS.vEgo ** 2) + limited_curvature = self.lateral_acceleration_slew_limiter.update(target_curvature, CS.vEgo, self.dt) + future_desired_lateral_accel = limited_curvature * CS.vEgo ** 2 + self.lat_accel_request_buffer.append(future_desired_lateral_accel) + + roll_compensation = params.roll * ACCELERATION_DUE_TO_GRAVITY + curvature_deadzone = abs(VM.calc_curvature(math.radians(self.steering_angle_deadzone_deg), CS.vEgo, 0.0)) + lateral_accel_deadzone = curvature_deadzone * CS.vEgo ** 2 + + delay_frames = int(np.clip(lat_delay / self.dt + 1, 1, self.lat_accel_request_buffer_len)) + expected_lateral_accel = self.lat_accel_request_buffer[-delay_frames] + setpoint = expected_lateral_accel + if self.setpoint_lead_enabled: + # the delayed setpoint mutes P/I for lat_delay after a ramp starts; lead by the filtered ramp rate so torque-capped TSS2 EPS turns in on time + request_ramp_rate = (future_desired_lateral_accel - expected_lateral_accel) / max(lat_delay, self.dt) + setpoint += self.setpoint_lead_filter.update(request_ramp_rate) * lat_delay + error = setpoint - measurement + + lookahead_idx = int(np.clip(-delay_frames + self.lookahead_frames, -self.lat_accel_request_buffer_len+1, -2)) + raw_lateral_jerk = (self.lat_accel_request_buffer[lookahead_idx+1] - self.lat_accel_request_buffer[lookahead_idx-1]) / (2 * self.dt) + desired_lateral_jerk = self.jerk_filter.update(raw_lateral_jerk) + gravity_adjusted_future_lateral_accel = future_desired_lateral_accel - roll_compensation + ff = gravity_adjusted_future_lateral_accel + # latAccelOffset corrects roll compensation bias from device roll misalignment relative to car roll + ff -= self.torque_params.latAccelOffset + ff += get_friction(error + JERK_GAIN * desired_lateral_jerk, lateral_accel_deadzone, FRICTION_THRESHOLD, self.torque_params) + + if not active: + output_torque = 0.0 + pid_log.active = False + else: + # do error correction in lateral acceleration space, convert at end to handle non-linear torque responses correctly + pid_log.error = float(error) + + freeze_integrator = steer_limited_by_safety or CS.steeringPressed or CS.vEgo < 5 + output_lataccel = self.pid.update(pid_log.error, speed=CS.vEgo, feedforward=ff, freeze_integrator=freeze_integrator) + output_torque = self.torque_from_lateral_accel(output_lataccel, self.torque_params) + + # Lateral acceleration torque controller extension updates + # Overrides pid_log.error and output_torque + pid_log, output_torque = self.nnff_assist.update(CS, VM, self.pid, params, ff, pid_log, setpoint, measurement, calibrated_pose, roll_compensation, + future_desired_lateral_accel, measurement, lateral_accel_deadzone, gravity_adjusted_future_lateral_accel, + limited_curvature, measured_curvature, steer_limited_by_safety, output_torque) + + pid_log.active = True + pid_log.p = float(self.pid.p) + pid_log.i = float(self.pid.i) + pid_log.d = float(self.pid.d) + pid_log.f = float(self.pid.f) + pid_log.output = float(-output_torque) # TODO: log lat accel? + pid_log.actualLateralAccel = float(measurement) + pid_log.desiredLateralAccel = float(setpoint) + pid_log.desiredLateralJerk = float(desired_lateral_jerk) + pid_log.saturated = bool(self._check_saturation(self.steer_max - abs(output_torque) < 1e-3, CS, steer_limited_by_safety, curvature_limited)) + + # TODO left is positive in this convention + return -output_torque, 0.0, pid_log diff --git a/iqpilot/selfdrive/controls/lib/latcontrol_torque_pq.py b/iqpilot/selfdrive/controls/lib/latcontrol_torque_pq.py new file mode 100644 index 000000000..e3c40f781 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/latcontrol_torque_pq.py @@ -0,0 +1,131 @@ +import math +import numpy as np +from collections import deque + +from iqpilot.cereal import log +from iqdbc.car.lateral import get_friction +from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.params import Params +from iqpilot.selfdrive.controls.lib.latcontrol import LatControl +from iqpilot.selfdrive.controls.lib.lateral_acceleration_slew_limiter import LateralAccelerationSlewLimiter +from iqpilot.common.pid import PIDController + +FRICTION_THRESHOLD_PQ = 1.0 +KP = 0.8 +KI = 0.15 + +INTERP_SPEEDS = [1, 1.5, 2.0, 3.0, 5, 7.5, 10, 15, 30] +KP_INTERP = [250, 120, 65, 30, 11.5, 5.5, 3.5, 2.0, KP] + +LP_FILTER_CUTOFF_HZ = 1.5 +JERK_LOOKAHEAD_SECONDS = 0.34 +JERK_GAIN = 0.3 +LAT_ACCEL_REQUEST_BUFFER_SECONDS = 1.0 +VERSION = 1 + +DEFAULT_LAT_ACCEL_FACTOR = 2.2 +DEFAULT_LAT_ACCEL_OFFSET = -0.13 +DEFAULT_FRICTION = 0.1 +FREEZE_LIVE_TORQUE_PARAMS = True + +ASSIST_COMPENSATION = True +ASSIST_SPEEDS_KPH = [0.0, 50.0, 120.0] +ASSIST_GAIN = [0.688, 0.883, 1.211] +ASSIST_REF_KPH = 100.0 + + +def _assist_comp(v_ego_ms): + import numpy as _np + ref = _np.interp(ASSIST_REF_KPH, ASSIST_SPEEDS_KPH, ASSIST_GAIN) + g = _np.interp(v_ego_ms * 3.6, ASSIST_SPEEDS_KPH, ASSIST_GAIN) + return float(_np.clip(ref / g, 0.7, 1.6)) + + +class LatControlTorquePQ(LatControl): + def __init__(self, CP, CP_IQ, CI, dt): + super().__init__(CP, CP_IQ, CI, dt) + self.torque_params = CP.lateralTuning.torque.as_builder() + self.torque_params.latAccelFactor = DEFAULT_LAT_ACCEL_FACTOR + self.torque_params.latAccelOffset = DEFAULT_LAT_ACCEL_OFFSET + self.torque_params.friction = DEFAULT_FRICTION + self.torque_from_lateral_accel = CI.torque_from_lateral_accel() + self.lateral_accel_from_torque = CI.lateral_accel_from_torque() + self.pid = PIDController([INTERP_SPEEDS, KP_INTERP], KI, rate=1/self.dt) + self.update_limits() + self.steering_angle_deadzone_deg = self.torque_params.steeringAngleDeadzoneDeg + self.lat_accel_request_buffer_len = int(LAT_ACCEL_REQUEST_BUFFER_SECONDS / self.dt) + self.lat_accel_request_buffer = deque([0.] * self.lat_accel_request_buffer_len, maxlen=self.lat_accel_request_buffer_len) + self.lookahead_frames = int(JERK_LOOKAHEAD_SECONDS / self.dt) + self.jerk_filter = FirstOrderFilter(0.0, 1 / (2 * np.pi * LP_FILTER_CUTOFF_HZ), self.dt) + self.lateral_acceleration_slew_limiter = LateralAccelerationSlewLimiter(Params().get_bool("IQLateralAccelSlew")) + self.curvature_lookahead_enabled = Params().get_bool("IQLateralCurvatureLookahead") + + def update_live_torque_params(self, latAccelFactor, latAccelOffset, friction): + if FREEZE_LIVE_TORQUE_PARAMS: + return + self.torque_params.latAccelFactor = latAccelFactor + self.torque_params.latAccelOffset = latAccelOffset + self.torque_params.friction = friction + self.update_limits() + + def update_limits(self): + self.pid.set_limits(self.lateral_accel_from_torque(self.steer_max, self.torque_params), + self.lateral_accel_from_torque(-self.steer_max, self.torque_params)) + + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, calibrated_pose, curvature_limited, lat_delay, + lookahead_curvature=None): + pid_log = log.ControlsState.LateralTorqueState.new_message() + pid_log.version = VERSION + measured_curvature = -VM.calc_curvature(math.radians(CS.steeringAngleDeg - params.angleOffsetDeg), CS.vEgo, params.roll) + measurement = measured_curvature * CS.vEgo ** 2 + target_curvature = desired_curvature + if self.curvature_lookahead_enabled and lookahead_curvature is not None: + target_curvature = lookahead_curvature + if not active and self.lateral_acceleration_slew_limiter.enabled: + self.lateral_acceleration_slew_limiter.reset(target_curvature * CS.vEgo ** 2) + limited_curvature = self.lateral_acceleration_slew_limiter.update(target_curvature, CS.vEgo, self.dt) + future_desired_lateral_accel = limited_curvature * CS.vEgo ** 2 + self.lat_accel_request_buffer.append(future_desired_lateral_accel) + + roll_compensation = params.roll * ACCELERATION_DUE_TO_GRAVITY + curvature_deadzone = abs(VM.calc_curvature(math.radians(self.steering_angle_deadzone_deg), CS.vEgo, 0.0)) + lateral_accel_deadzone = curvature_deadzone * CS.vEgo ** 2 + + delay_frames = int(np.clip(lat_delay / self.dt + 1, 1, self.lat_accel_request_buffer_len)) + expected_lateral_accel = self.lat_accel_request_buffer[-delay_frames] + setpoint = expected_lateral_accel + error = setpoint - measurement + + lookahead_idx = int(np.clip(-delay_frames + self.lookahead_frames, -self.lat_accel_request_buffer_len + 1, -2)) + raw_lateral_jerk = (self.lat_accel_request_buffer[lookahead_idx + 1] - self.lat_accel_request_buffer[lookahead_idx - 1]) / (2 * self.dt) + desired_lateral_jerk = self.jerk_filter.update(raw_lateral_jerk) + gravity_adjusted_future_lateral_accel = future_desired_lateral_accel - roll_compensation + ff = gravity_adjusted_future_lateral_accel + ff -= self.torque_params.latAccelOffset + ff += get_friction(error + JERK_GAIN * desired_lateral_jerk, lateral_accel_deadzone, FRICTION_THRESHOLD_PQ, self.torque_params) + + if not active: + output_torque = 0.0 + pid_log.active = False + else: + pid_log.error = float(error) + freeze_integrator = steer_limited_by_safety or CS.steeringPressed or CS.vEgo < 5 + output_lataccel = self.pid.update(pid_log.error, speed=CS.vEgo, feedforward=ff, freeze_integrator=freeze_integrator) + output_torque = self.torque_from_lateral_accel(output_lataccel, self.torque_params) + if ASSIST_COMPENSATION: + output_torque = float(np.clip(output_torque * _assist_comp(CS.vEgo), + -self.steer_max, self.steer_max)) + + pid_log.active = True + pid_log.p = float(self.pid.p) + pid_log.i = float(self.pid.i) + pid_log.d = float(self.pid.d) + pid_log.f = float(self.pid.f) + pid_log.output = float(-output_torque) + pid_log.actualLateralAccel = float(measurement) + pid_log.desiredLateralAccel = float(setpoint) + pid_log.desiredLateralJerk = float(desired_lateral_jerk) + pid_log.saturated = bool(self._check_saturation(self.steer_max - abs(output_torque) < 1e-3, CS, steer_limited_by_safety, curvature_limited)) + + return -output_torque, 0.0, pid_log diff --git a/iqpilot/selfdrive/controls/lib/latcontrol_torque_v0.py b/iqpilot/selfdrive/controls/lib/latcontrol_torque_v0.py new file mode 100644 index 000000000..c76d28f38 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/latcontrol_torque_v0.py @@ -0,0 +1,118 @@ +# Copyright (c) 2018, Comma.ai, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +import math +from collections import deque + +import numpy as np + +from iqpilot.cereal import log +from iqdbc.car.lateral import FRICTION_THRESHOLD, get_friction +from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.pid import PIDController +from iqpilot.selfdrive.controls.lib.latcontrol import LatControl + + +KP = 1.0 +KI = 0.3 +KD = 0.0 +INTERP_SPEEDS = [1, 1.5, 2.0, 3.0, 5, 7.5, 10, 15, 30] +KP_INTERP = [250, 120, 65, 30, 11.5, 5.5, 3.5, 2.0, KP] + +LP_FILTER_CUTOFF_HZ = 1.2 +LAT_ACCEL_REQUEST_BUFFER_SECONDS = 1.0 +VERSION = 0 + + +def is_vw_mqb_torque(CP): + if CP.brand != 'volkswagen': + return False + from iqdbc.car.volkswagen.values import VolkswagenFlags + excluded_platforms = VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO + return not bool(CP.flags & excluded_platforms) + + +class LatControlTorqueV0(LatControl): + def __init__(self, CP, CP_IQ, CI, dt): + super().__init__(CP, CP_IQ, CI, dt) + self.torque_params = CP.lateralTuning.torque.as_builder() + self.torque_from_lateral_accel = CI.torque_from_lateral_accel() + self.lateral_accel_from_torque = CI.lateral_accel_from_torque() + self.pid = PIDController([INTERP_SPEEDS, KP_INTERP], KI, KD, rate=1 / self.dt) + self.update_limits() + self.steering_angle_deadzone_deg = self.torque_params.steeringAngleDeadzoneDeg + self.lat_accel_request_buffer_len = int(LAT_ACCEL_REQUEST_BUFFER_SECONDS / self.dt) + self.lat_accel_request_buffer = deque([0.] * self.lat_accel_request_buffer_len, maxlen=self.lat_accel_request_buffer_len) + self.previous_measurement = 0.0 + self.measurement_rate_filter = FirstOrderFilter(0.0, 1 / (2 * np.pi * LP_FILTER_CUTOFF_HZ), self.dt) + + def update_live_torque_params(self, latAccelFactor, latAccelOffset, friction): + self.torque_params.latAccelFactor = latAccelFactor + self.torque_params.latAccelOffset = latAccelOffset + self.torque_params.friction = friction + self.update_limits() + + def update_limits(self): + self.pid.set_limits(self.lateral_accel_from_torque(self.steer_max, self.torque_params), + self.lateral_accel_from_torque(-self.steer_max, self.torque_params)) + + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, calibrated_pose, curvature_limited, lat_delay, + lookahead_curvature=None): + pid_log = log.ControlsState.LateralTorqueState.new_message() + pid_log.version = VERSION + if not active: + output_torque = 0.0 + pid_log.active = False + else: + measured_curvature = -VM.calc_curvature(math.radians(CS.steeringAngleDeg - params.angleOffsetDeg), CS.vEgo, params.roll) + roll_compensation = params.roll * ACCELERATION_DUE_TO_GRAVITY + curvature_deadzone = abs(VM.calc_curvature(math.radians(self.steering_angle_deadzone_deg), CS.vEgo, 0.0)) + lateral_accel_deadzone = curvature_deadzone * CS.vEgo ** 2 + + delay_frames = int(np.clip(lat_delay / self.dt, 1, self.lat_accel_request_buffer_len)) + expected_lateral_accel = self.lat_accel_request_buffer[-delay_frames] + future_desired_lateral_accel = desired_curvature * CS.vEgo ** 2 + self.lat_accel_request_buffer.append(future_desired_lateral_accel) + gravity_adjusted_future_lateral_accel = future_desired_lateral_accel - roll_compensation + desired_lateral_jerk = (future_desired_lateral_accel - expected_lateral_accel) / lat_delay + + measurement = measured_curvature * CS.vEgo ** 2 + measurement_rate = self.measurement_rate_filter.update((measurement - self.previous_measurement) / self.dt) + self.previous_measurement = measurement + + setpoint = lat_delay * desired_lateral_jerk + expected_lateral_accel + error = setpoint - measurement + + pid_log.error = float(error) + feedforward = gravity_adjusted_future_lateral_accel + feedforward -= self.torque_params.latAccelOffset + feedforward += get_friction(error, lateral_accel_deadzone, FRICTION_THRESHOLD, self.torque_params) + + freeze_integrator = steer_limited_by_safety or CS.steeringPressed or CS.vEgo < 5 + output_lataccel = self.pid.update(pid_log.error, -measurement_rate, feedforward=feedforward, speed=CS.vEgo, + freeze_integrator=freeze_integrator) + output_torque = self.torque_from_lateral_accel(output_lataccel, self.torque_params) + + pid_log.active = True + pid_log.p = float(self.pid.p) + pid_log.i = float(self.pid.i) + pid_log.d = float(self.pid.d) + pid_log.f = float(self.pid.f) + pid_log.output = float(-output_torque) + pid_log.actualLateralAccel = float(measurement) + pid_log.desiredLateralAccel = float(setpoint) + pid_log.desiredLateralJerk = float(desired_lateral_jerk) + pid_log.saturated = bool(self._check_saturation(self.steer_max - abs(output_torque) < 1e-3, CS, steer_limited_by_safety, curvature_limited)) + + return -output_torque, 0.0, pid_log diff --git a/iqpilot/selfdrive/controls/lib/lateral_acceleration_slew_limiter.py b/iqpilot/selfdrive/controls/lib/lateral_acceleration_slew_limiter.py new file mode 100644 index 000000000..f25de8cf2 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/lateral_acceleration_slew_limiter.py @@ -0,0 +1,40 @@ +import numpy as np + + +JERK_SPEED_BP = [0.0, 8.0, 20.0, 35.0] +JERK_MAX_BP = [5.0, 4.0, 2.5, 2.0] +A_LAT_MAX = 3.0 +MIN_LIMIT_SPEED = 5.0 +AVOIDANCE_BYPASS_ACCEL_DELTA = 2.0 +CURVATURE_SPEED_FLOOR = 0.1 + + +class LateralAccelerationSlewLimiter: + def __init__(self, enabled: bool): + self.enabled = enabled + self.a_lim = 0.0 + + def reset(self, a_lat: float) -> None: + self.a_lim = float(np.clip(a_lat, -A_LAT_MAX, A_LAT_MAX)) + + def jerk_max(self, v_ego: float) -> float: + return float(np.interp(v_ego, JERK_SPEED_BP, JERK_MAX_BP)) + + def update(self, desired_curvature: float, v_ego: float, dt: float) -> float: + if not self.enabled: + return desired_curvature + + a_des = v_ego ** 2 * desired_curvature + if v_ego < MIN_LIMIT_SPEED: + self.reset(a_des) + return desired_curvature + + if abs(a_des - self.a_lim) > AVOIDANCE_BYPASS_ACCEL_DELTA: + self.reset(a_des) + else: + da_max = self.jerk_max(v_ego) * dt + self.a_lim += float(np.clip(a_des - self.a_lim, -da_max, da_max)) + self.a_lim = float(np.clip(self.a_lim, -A_LAT_MAX, A_LAT_MAX)) + + speed = max(abs(v_ego), CURVATURE_SPEED_FLOOR) + return self.a_lim / speed ** 2 diff --git a/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/.gitignore b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/.gitignore new file mode 100644 index 000000000..aff2eb082 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/.gitignore @@ -0,0 +1,2 @@ +acados_ocp_lat.json +c_generated_code/ diff --git a/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/__init__.py b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/acados_ocp_lat.json b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/acados_ocp_lat.json new file mode 100644 index 000000000..57d466ecc --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/acados_ocp_lat.json @@ -0,0 +1,538 @@ +{ + "acados_include_path": "/data/openpilot/iqpilot/third_party/acados/include", + "acados_lib_path": "/data/openpilot/iqpilot/third_party/acados/lib", + "code_export_directory": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code", + "constraints": { + "C": [], + "C_e": [], + "D": [], + "constr_type": "BGH", + "constr_type_e": "BGH", + "idxbu": [], + "idxbx": [ + 2, + 3 + ], + "idxbx_0": [ + 0, + 1, + 2, + 3 + ], + "idxbx_e": [], + "idxbxe_0": [ + 0, + 1, + 2, + 3 + ], + "idxsbu": [], + "idxsbx": [], + "idxsbx_e": [], + "idxsg": [], + "idxsg_e": [], + "idxsh": [], + "idxsh_e": [], + "idxsphi": [], + "idxsphi_e": [], + "lbu": [], + "lbx": [ + -1.5707963267948966, + -0.8726646259971648 + ], + "lbx_0": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "lbx_e": [], + "lg": [], + "lg_e": [], + "lh": [], + "lh_e": [], + "lphi": [], + "lphi_e": [], + "lsbu": [], + "lsbx": [], + "lsbx_e": [], + "lsg": [], + "lsg_e": [], + "lsh": [], + "lsh_e": [], + "lsphi": [], + "lsphi_e": [], + "ubu": [], + "ubx": [ + 1.5707963267948966, + 0.8726646259971648 + ], + "ubx_0": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ubx_e": [], + "ug": [], + "ug_e": [], + "uh": [], + "uh_e": [], + "uphi": [], + "uphi_e": [], + "usbu": [], + "usbx": [], + "usbx_e": [], + "usg": [], + "usg_e": [], + "ush": [], + "ush_e": [], + "usphi": [], + "usphi_e": [] + }, + "cost": { + "Vu": [], + "Vu_0": [], + "Vx": [], + "Vx_0": [], + "Vx_e": [], + "Vz": [], + "Vz_0": [], + "W": [ + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + ], + "W_0": [ + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + ], + "W_e": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0 + ] + ], + "Zl": [], + "Zl_e": [], + "Zu": [], + "Zu_e": [], + "cost_ext_fun_type": "casadi", + "cost_ext_fun_type_0": "casadi", + "cost_ext_fun_type_e": "casadi", + "cost_type": "NONLINEAR_LS", + "cost_type_0": "NONLINEAR_LS", + "cost_type_e": "NONLINEAR_LS", + "yref": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "yref_0": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "yref_e": [ + 0.0, + 0.0, + 0.0 + ], + "zl": [], + "zl_e": [], + "zu": [], + "zu_e": [] + }, + "cython_include_dirs": [ + "/data/openpilot/.venv/lib/python3.12/site-packages/numpy/_core/include", + "/usr/include/python3.12" + ], + "dims": { + "N": 32, + "nbu": 0, + "nbx": 2, + "nbx_0": 4, + "nbx_e": 0, + "nbxe_0": 4, + "ng": 0, + "ng_e": 0, + "nh": 0, + "nh_e": 0, + "np": 2, + "nphi": 0, + "nphi_e": 0, + "nr": 0, + "nr_e": 0, + "ns": 0, + "ns_e": 0, + "nsbu": 0, + "nsbx": 0, + "nsbx_e": 0, + "nsg": 0, + "nsg_e": 0, + "nsh": 0, + "nsh_e": 0, + "nsphi": 0, + "nsphi_e": 0, + "nu": 1, + "nx": 4, + "ny": 5, + "ny_0": 5, + "ny_e": 3, + "nz": 0 + }, + "json_file": "/data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/acados_ocp_lat.json", + "model": { + "con_h_expr": null, + "con_h_expr_e": null, + "con_phi_expr": null, + "con_phi_expr_e": null, + "con_r_expr": null, + "con_r_expr_e": null, + "con_r_in_phi": null, + "con_r_in_phi_e": null, + "cost_conl_custom_outer_hess": null, + "cost_conl_custom_outer_hess_0": null, + "cost_conl_custom_outer_hess_e": null, + "cost_expr_ext_cost": null, + "cost_expr_ext_cost_0": null, + "cost_expr_ext_cost_custom_hess": null, + "cost_expr_ext_cost_custom_hess_0": null, + "cost_expr_ext_cost_custom_hess_e": null, + "cost_expr_ext_cost_e": null, + "cost_psi_expr": null, + "cost_psi_expr_0": null, + "cost_psi_expr_e": null, + "cost_r_in_psi_expr": null, + "cost_r_in_psi_expr_0": null, + "cost_r_in_psi_expr_e": null, + "cost_y_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegjaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaajhpffghgpgegdaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgkaaaaaaaegpcaaaaaaaaaaaaaahaaaaaaaahdhjgpffghgpgegdaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaamaaaaaaaahdhjgpfchbgehfgpffghgpgegdaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaaahdhjgpfbgdgdgfgmgpffghgpgegeaaaaaaaaaaaaaaachjaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaachcaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaachkjjjjjjjjjjjjlpd", + "cost_y_expr_0": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegjaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaajhpffghgpgegdaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgkaaaaaaaegpcaaaaaaaaaaaaaahaaaaaaaahdhjgpffghgpgegdaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaamaaaaaaaahdhjgpfchbgehfgpffghgpgegdaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaaahdhjgpfbgdgdgfgmgpffghgpgegeaaaaaaaaaaaaaaachjaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaachcaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaachkjjjjjjjjjjjjlpd", + "cost_y_expr_e": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaajhpffghgpgegdaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgkaaaaaaaegpcaaaaaaaaaaaaaahaaaaaaaahdhjgpffghgpgegdaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaamaaaaaaaahdhjgpfchbgehfgpffghgpg", + "disc_dyn_expr": null, + "dyn_disc_fun": null, + "dyn_disc_fun_jac": null, + "dyn_disc_fun_jac_hess": null, + "dyn_ext_fun_type": "casadi", + "dyn_generic_source": null, + "f_expl_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegiaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegoaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaahaaaaaaaahdhjgpffghgpgegdaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaapaaaaaaachpgehbgehjgpgogpfchbgegjgfhdhegnaaaaaaaaaaaaaaachcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaamaaaaaaaahdhjgpfchbgehfgpffghgpgegbaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaachbaaaaaaaaaaaaaaaegnaaaaaaaaaaaaaaachcaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaachfaaaaaaaaaaaaaaaegoaaaaaaaaaaaaaaachcaaaaaaaaaaaaaaachiaaaaaaaaaaaaaaachiaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaaahdhjgpfbgdgdgfgmgpffghgpg", + "f_impl_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegiaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaaihpffghgpgpfegpgehegcaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegoaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaahaaaaaaaahdhjgpffghgpgegdaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaapaaaaaaachpgehbgehjgpgogpfchbgegjgfhdhegnaaaaaaaaaaaaaaachdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaamaaaaaaaahdhjgpfchbgehfgpffghgpgegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaajhpffghgpgpfegpgehegbaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaachcaaaaaaaaaaaaaaaegnaaaaaaaaaaaaaaachdaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaachgaaaaaaaaaaaaaaaegoaaaaaaaaaaaaaaachdaaaaaaaaaaaaaaachjaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaalaaaaaaaahdhjgpffghgpgpfegpgehchjaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaaabaaaaaaahdhjgpfchbgehfgpffghgpgpfegpgehegpcaaaaaaaaaaaaaanaaaaaaaahdhjgpfbgdgdgfgmgpffghgpg", + "gnsf": { + "nontrivial_f_LO": 1, + "purely_linear": 0 + }, + "name": "lat", + "p": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeggaaaaaaaaaaaaaaacaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegpcaaaaaaaaaaaaaapaaaaaaachpgehbgehjgpgogpfchbgegjgfhdh", + "u": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegfaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaaahdhjgpfbgdgdgfgmgpffghgpg", + "x": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegiaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegpcaaaaaaaaaaaaaafaaaaaaajhpffghgpgegpcaaaaaaaaaaaaaahaaaaaaaahdhjgpffghgpgegpcaaaaaaaaaaaaaamaaaaaaaahdhjgpfchbgehfgpffghgpg", + "xdot": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegiaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaaihpffghgpgpfegpgehegpcaaaaaaaaaaaaaajaaaaaaajhpffghgpgpfegpgehegpcaaaaaaaaaaaaaalaaaaaaaahdhjgpffghgpgpfegpgehegpcaaaaaaaaaaaaaaabaaaaaaahdhjgpfchbgehfgpffghgpgpfegpgeh", + "z": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "parameter_values": [ + 0.0, + 0.0 + ], + "problem_class": "OCP", + "shared_lib_ext": ".so", + "solver_options": { + "Tsim": 0.009765625, + "alpha_min": 0.05, + "alpha_reduction": 0.7, + "collocation_type": "GAUSS_LEGENDRE", + "custom_templates": [], + "custom_update_copy": true, + "custom_update_filename": "", + "custom_update_header_filename": "", + "eps_sufficient_descent": 0.0001, + "exact_hess_constr": 1, + "exact_hess_cost": 1, + "exact_hess_dyn": 1, + "ext_cost_num_hess": 0, + "ext_fun_compile_flags": "-O2", + "full_step_dual": 0, + "globalization": "FIXED_STEP", + "globalization_use_SOC": 0, + "hessian_approx": "GAUSS_NEWTON", + "hpipm_mode": "BALANCE", + "initialize_t_slacks": 0, + "integrator_type": "ERK", + "levenberg_marquardt": 0.0, + "line_search_use_sufficient_descent": 0, + "model_external_shared_lib_dir": null, + "model_external_shared_lib_name": null, + "nlp_solver_ext_qp_res": 0, + "nlp_solver_max_iter": 100, + "nlp_solver_step_length": 1.0, + "nlp_solver_tol_comp": 1e-06, + "nlp_solver_tol_eq": 1e-06, + "nlp_solver_tol_ineq": 1e-06, + "nlp_solver_tol_stat": 1e-06, + "nlp_solver_type": "SQP_RTI", + "print_level": 0, + "qp_solver": "PARTIAL_CONDENSING_HPIPM", + "qp_solver_cond_N": 1, + "qp_solver_cond_ric_alg": 1, + "qp_solver_iter_max": 1, + "qp_solver_ric_alg": 1, + "qp_solver_tol_comp": null, + "qp_solver_tol_eq": null, + "qp_solver_tol_ineq": null, + "qp_solver_tol_stat": null, + "qp_solver_warm_start": 0, + "regularize_method": null, + "shooting_nodes": [ + 0.0, + 0.009765625, + 0.0390625, + 0.087890625, + 0.15625, + 0.244140625, + 0.3515625, + 0.478515625, + 0.625, + 0.791015625, + 0.9765625, + 1.181640625, + 1.40625, + 1.650390625, + 1.9140625, + 2.197265625, + 2.5, + 2.822265625, + 3.1640625, + 3.525390625, + 3.90625, + 4.306640625, + 4.7265625, + 5.166015625, + 5.625, + 6.103515625, + 6.6015625, + 7.119140625, + 7.65625, + 8.212890625, + 8.7890625, + 9.384765625, + 10.0 + ], + "sim_method_jac_reuse": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "sim_method_newton_iter": 3, + "sim_method_newton_tol": 0.0, + "sim_method_num_stages": [ + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4 + ], + "sim_method_num_steps": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "tf": 10.0, + "time_steps": [ + 0.009765625, + 0.029296875, + 0.048828125, + 0.068359375, + 0.087890625, + 0.107421875, + 0.126953125, + 0.146484375, + 0.166015625, + 0.185546875, + 0.205078125, + 0.224609375, + 0.244140625, + 0.263671875, + 0.283203125, + 0.302734375, + 0.322265625, + 0.341796875, + 0.361328125, + 0.380859375, + 0.400390625, + 0.419921875, + 0.439453125, + 0.458984375, + 0.478515625, + 0.498046875, + 0.517578125, + 0.537109375, + 0.556640625, + 0.576171875, + 0.595703125, + 0.615234375 + ] + } +} \ No newline at end of file diff --git a/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/Makefile b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/Makefile new file mode 100644 index 000000000..ac0655ec9 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/Makefile @@ -0,0 +1,211 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + + + + + +# define sources and use make's implicit rules to generate object files (*.o) + +# model +MODEL_SRC= +MODEL_SRC+= lat_model/lat_expl_ode_fun.c +MODEL_SRC+= lat_model/lat_expl_vde_forw.c +MODEL_SRC+= lat_model/lat_expl_vde_adj.c +MODEL_OBJ := $(MODEL_SRC:.c=.o) + +# optimal control problem - mostly CasADi exports +OCP_SRC= +OCP_SRC+= lat_cost/lat_cost_y_0_fun.c +OCP_SRC+= lat_cost/lat_cost_y_0_fun_jac_ut_xt.c +OCP_SRC+= lat_cost/lat_cost_y_0_hess.c +OCP_SRC+= lat_cost/lat_cost_y_fun.c +OCP_SRC+= lat_cost/lat_cost_y_fun_jac_ut_xt.c +OCP_SRC+= lat_cost/lat_cost_y_hess.c +OCP_SRC+= lat_cost/lat_cost_y_e_fun.c +OCP_SRC+= lat_cost/lat_cost_y_e_fun_jac_ut_xt.c +OCP_SRC+= lat_cost/lat_cost_y_e_hess.c + +OCP_SRC+= acados_solver_lat.c +OCP_OBJ := $(OCP_SRC:.c=.o) + +# for sim solver +SIM_SRC= acados_sim_solver_lat.c +SIM_OBJ := $(SIM_SRC:.c=.o) + +# for target example +EX_SRC= main_lat.c +EX_OBJ := $(EX_SRC:.c=.o) +EX_EXE := $(EX_SRC:.c=) + +# for target example_sim +EX_SIM_SRC= main_sim_lat.c +EX_SIM_OBJ := $(EX_SIM_SRC:.c=.o) +EX_SIM_EXE := $(EX_SIM_SRC:.c=) + +# combine model, sim and ocp object files +OBJ= +OBJ+= $(MODEL_OBJ) +OBJ+= $(SIM_OBJ) +OBJ+= $(OCP_OBJ) + +EXTERNAL_DIR= +EXTERNAL_LIB= + +INCLUDE_PATH = /data/openpilot/iqpilot/third_party/acados/include +LIB_PATH = /data/openpilot/iqpilot/third_party/acados/lib + +# preprocessor flags for make's implicit rules +CPPFLAGS+= -I$(INCLUDE_PATH) +CPPFLAGS+= -I$(INCLUDE_PATH)/acados +CPPFLAGS+= -I$(INCLUDE_PATH)/blasfeo/include +CPPFLAGS+= -I$(INCLUDE_PATH)/hpipm/include + + +# define the c-compiler flags for make's implicit rules +CFLAGS = -fPIC -std=c99 -O2#-fno-diagnostics-show-line-numbers -g +# # Debugging +# CFLAGS += -g3 + +# linker flags +LDFLAGS+= -L$(LIB_PATH) + +# link to libraries +LDLIBS+= -lacados +LDLIBS+= -lhpipm +LDLIBS+= -lblasfeo +LDLIBS+= -lm +LDLIBS+= + +# libraries +LIBACADOS_SOLVER=libacados_solver_lat.so +LIBACADOS_OCP_SOLVER=libacados_ocp_solver_lat.so +LIBACADOS_SIM_SOLVER=lib$(SIM_SRC:.c=.so) + +# virtual targets +.PHONY : all clean + +#all: clean example_sim example shared_lib + +all: clean example_sim example +shared_lib: bundled_shared_lib ocp_shared_lib sim_shared_lib + +# some linker targets +example: $(EX_OBJ) $(OBJ) + $(CC) $^ -o $(EX_EXE) $(LDFLAGS) $(LDLIBS) + +example_sim: $(EX_SIM_OBJ) $(MODEL_OBJ) $(SIM_OBJ) + $(CC) $^ -o $(EX_SIM_EXE) $(LDFLAGS) $(LDLIBS) + +bundled_shared_lib: $(OBJ) + $(CC) -shared $^ -o $(LIBACADOS_SOLVER) $(LDFLAGS) $(LDLIBS) + +ocp_shared_lib: $(OCP_OBJ) $(MODEL_OBJ) + $(CC) -shared $^ -o $(LIBACADOS_OCP_SOLVER) $(LDFLAGS) $(LDLIBS) \ + -L$(EXTERNAL_DIR) -l$(EXTERNAL_LIB) + +sim_shared_lib: $(SIM_OBJ) $(MODEL_OBJ) + $(CC) -shared $^ -o $(LIBACADOS_SIM_SOLVER) $(LDFLAGS) $(LDLIBS) + + +# Cython targets +ocp_cython_c: ocp_shared_lib + cython \ + -o acados_ocp_solver_pyx.c \ + -I $(INCLUDE_PATH)/../interfaces/acados_template/acados_template \ + $(INCLUDE_PATH)/../interfaces/acados_template/acados_template/acados_ocp_solver_pyx.pyx \ + -I /data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code \ + +ocp_cython_o: ocp_cython_c + $(CC) $(ACADOS_FLAGS) -c -O2 \ + -fPIC \ + -o acados_ocp_solver_pyx.o \ + -I $(INCLUDE_PATH)/blasfeo/include/ \ + -I $(INCLUDE_PATH)/hpipm/include/ \ + -I $(INCLUDE_PATH) \ + -I /data/openpilot/.venv/lib/python3.12/site-packages/numpy/_core/include \ + -I /usr/include/python3.12 \ + acados_ocp_solver_pyx.c \ + +ocp_cython: ocp_cython_o + $(CC) $(ACADOS_FLAGS) -shared \ + -o acados_ocp_solver_pyx.so \ + -Wl,-rpath=$(LIB_PATH) \ + acados_ocp_solver_pyx.o \ + $(abspath .)/libacados_ocp_solver_lat.so \ + $(LDFLAGS) $(LDLIBS) + +# Sim Cython targets +sim_cython_c: sim_shared_lib + cython \ + -o acados_sim_solver_pyx.c \ + -I $(INCLUDE_PATH)/../interfaces/acados_template/acados_template \ + $(INCLUDE_PATH)/../interfaces/acados_template/acados_template/acados_sim_solver_pyx.pyx \ + -I /data/openpilot/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code \ + +sim_cython_o: sim_cython_c + $(CC) $(ACADOS_FLAGS) -c -O2 \ + -fPIC \ + -o acados_sim_solver_pyx.o \ + -I $(INCLUDE_PATH)/blasfeo/include/ \ + -I $(INCLUDE_PATH)/hpipm/include/ \ + -I $(INCLUDE_PATH) \ + -I /data/openpilot/.venv/lib/python3.12/site-packages/numpy/_core/include \ + -I /usr/include/python3.12 \ + acados_sim_solver_pyx.c \ + +sim_cython: sim_cython_o + $(CC) $(ACADOS_FLAGS) -shared \ + -o acados_sim_solver_pyx.so \ + -Wl,-rpath=$(LIB_PATH) \ + acados_sim_solver_pyx.o \ + $(abspath .)/libacados_sim_solver_lat.so \ + $(LDFLAGS) $(LDLIBS) + +clean: + $(RM) $(OBJ) $(EX_OBJ) $(EX_SIM_OBJ) + $(RM) $(LIBACADOS_SOLVER) $(LIBACADOS_OCP_SOLVER) $(LIBACADOS_SIM_SOLVER) + $(RM) $(EX_EXE) $(EX_SIM_EXE) + +clean_ocp_shared_lib: + $(RM) $(LIBACADOS_OCP_SOLVER) + $(RM) $(OCP_OBJ) + +clean_ocp_cython: + $(RM) libacados_ocp_solver_lat.so + $(RM) acados_solver_lat.o + $(RM) acados_ocp_solver_pyx.so + $(RM) acados_ocp_solver_pyx.o + +clean_sim_cython: + $(RM) libacados_sim_solver_lat.so + $(RM) acados_sim_solver_lat.o + $(RM) acados_sim_solver_pyx.so + $(RM) acados_sim_solver_pyx.o diff --git a/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.so b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.so new file mode 100755 index 000000000..400e5d879 Binary files /dev/null and b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/acados_ocp_solver_pyx.so differ diff --git a/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/libacados_ocp_solver_lat.so b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/libacados_ocp_solver_lat.so new file mode 100755 index 000000000..39c9f5418 Binary files /dev/null and b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/c_generated_code/libacados_ocp_solver_lat.so differ diff --git a/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/gen.log b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/gen.log new file mode 100644 index 000000000..25663da25 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/gen.log @@ -0,0 +1,49 @@ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_model.py:54: SyntaxWarning: invalid escape sequence '\d' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_model.py:60: SyntaxWarning: invalid escape sequence '\d' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_model.py:111: SyntaxWarning: invalid escape sequence '\p' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_model.py:116: SyntaxWarning: invalid escape sequence '\p' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_model.py:121: SyntaxWarning: invalid escape sequence '\p' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_model.py:126: SyntaxWarning: invalid escape sequence '\p' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_model.py:131: SyntaxWarning: invalid escape sequence '\p' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_model.py:136: SyntaxWarning: invalid escape sequence '\p' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:119: SyntaxWarning: invalid escape sequence '\p' + """:math:`n_{\pi}` - dimension of the image of the inner nonlinear function in positive definite constraints. +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:125: SyntaxWarning: invalid escape sequence '\p' + """:math:`n_{\pi}^e` - dimension of the image of the inner nonlinear function in positive definite constraints. +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:143: SyntaxWarning: invalid escape sequence '\p' + """:math:`n_{\phi}` - number of convex-over-nonlinear constraints. +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:149: SyntaxWarning: invalid escape sequence '\p' + """:math:`n_{\phi}^e` - number of convex-over-nonlinear constraints at terminal shooting node N. +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:227: SyntaxWarning: invalid escape sequence '\p' + """:math:`n_{{s\phi}}` - number of soft convex-over-nonlinear constraints. +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:233: SyntaxWarning: invalid escape sequence '\p' + """:math:`n_{{s\phi}^e}` - number of soft convex-over-nonlinear constraints at terminal shooting node N. +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:496: SyntaxWarning: invalid escape sequence '\D' + """ +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:1193: SyntaxWarning: invalid escape sequence '\,' + """:math:`C` - C matrix in :math:`\\underline{g} \\leq D \, u + C \, x \\leq \\bar{g}` +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:1201: SyntaxWarning: invalid escape sequence '\,' + """:math:`D` - D matrix in :math:`\\underline{g} \\leq D \, u + C \, x \\leq \\bar{g}` +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:1285: SyntaxWarning: invalid escape sequence '\p' + """:math:`\\underline{\phi}` - lower bound for convex-over-nonlinear inequalities +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:1293: SyntaxWarning: invalid escape sequence '\p' + """:math:`\\bar{\phi}` - upper bound for convex-over-nonlinear inequalities +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:1302: SyntaxWarning: invalid escape sequence '\p' + """:math:`\\underline{\phi}^e` - lower bound on convex-over-nonlinear inequalities +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:1310: SyntaxWarning: invalid escape sequence '\p' + """:math:`\\bar{\phi}^e` - upper bound on convex-over-nonlinear inequalities +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:1485: SyntaxWarning: invalid escape sequence '\p' + """:math:`J_{s, \phi}` - matrix coefficient for soft bounds on convex-over-nonlinear constraints. +/data/openpilot/iqpilot/third_party/acados/acados_template/acados_ocp.py:1572: SyntaxWarning: invalid escape sequence '\m' + """:math:`x_0 \\in \mathbb{R}^{n_x}` - initial state -- +Warning: Please note that the following versions of CasADi are officially supported: 3.5.6 or 3.5.5 or 3.5.4 or 3.5.3 or 3.5.2 or 3.5.1 or 3.4.5 or 3.4.0. + If there is an incompatibility with the CasADi generated code, please consider changing your CasADi version. +Version 3.7.2 currently in use. diff --git a/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/lat_mpc.py b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/lat_mpc.py new file mode 100755 index 000000000..a8a41f269 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/lateral_mpc_lib/lat_mpc.py @@ -0,0 +1,199 @@ +#!/usr/bin/env python3 +import os +import time +import numpy as np + +from casadi import SX, vertcat, sin, cos +# WARNING: imports outside of constants will not trigger a rebuild +from iqpilot.selfdrive.iqmodeld.config import ModelConstants + +if __name__ == '__main__': # generating code + from iqpilot.third_party.acados.acados_template import AcadosModel, AcadosOcp, AcadosOcpSolver +else: + from iqpilot.selfdrive.controls.lib.lateral_mpc_lib.c_generated_code.acados_ocp_solver_pyx import AcadosOcpSolverCython + +LAT_MPC_DIR = os.path.dirname(os.path.abspath(__file__)) +EXPORT_DIR = os.path.join(LAT_MPC_DIR, "c_generated_code") +JSON_FILE = os.path.join(LAT_MPC_DIR, "acados_ocp_lat.json") +X_DIM = 4 +P_DIM = 2 +COST_E_DIM = 3 +COST_DIM = COST_E_DIM + 2 +SPEED_OFFSET = 10.0 +MODEL_NAME = 'lat' +ACADOS_SOLVER_TYPE = 'SQP_RTI' +N = 32 + +def gen_lat_model(): + model = AcadosModel() + model.name = MODEL_NAME + + # set up states & controls + x_ego = SX.sym('x_ego') + y_ego = SX.sym('y_ego') + psi_ego = SX.sym('psi_ego') + psi_rate_ego = SX.sym('psi_rate_ego') + model.x = vertcat(x_ego, y_ego, psi_ego, psi_rate_ego) + + # parameters + v_ego = SX.sym('v_ego') + rotation_radius = SX.sym('rotation_radius') + model.p = vertcat(v_ego, rotation_radius) + + # controls + psi_accel_ego = SX.sym('psi_accel_ego') + model.u = vertcat(psi_accel_ego) + + # xdot + x_ego_dot = SX.sym('x_ego_dot') + y_ego_dot = SX.sym('y_ego_dot') + psi_ego_dot = SX.sym('psi_ego_dot') + psi_rate_ego_dot = SX.sym('psi_rate_ego_dot') + + model.xdot = vertcat(x_ego_dot, y_ego_dot, psi_ego_dot, psi_rate_ego_dot) + + # dynamics model + f_expl = vertcat(v_ego * cos(psi_ego) - rotation_radius * sin(psi_ego) * psi_rate_ego, + v_ego * sin(psi_ego) + rotation_radius * cos(psi_ego) * psi_rate_ego, + psi_rate_ego, + psi_accel_ego) + model.f_impl_expr = model.xdot - f_expl + model.f_expl_expr = f_expl + return model + + +def gen_lat_ocp(): + ocp = AcadosOcp() + ocp.model = gen_lat_model() + + Tf = np.array(ModelConstants.T_IDXS)[N] + + # set dimensions + ocp.dims.N = N + + # set cost module + ocp.cost.cost_type = 'NONLINEAR_LS' + ocp.cost.cost_type_e = 'NONLINEAR_LS' + + Q = np.diag(np.zeros(COST_E_DIM)) + QR = np.diag(np.zeros(COST_DIM)) + + ocp.cost.W = QR + ocp.cost.W_e = Q + + y_ego, psi_ego, psi_rate_ego = ocp.model.x[1], ocp.model.x[2], ocp.model.x[3] + psi_rate_ego_dot = ocp.model.u[0] + v_ego = ocp.model.p[0] + + ocp.parameter_values = np.zeros((P_DIM, )) + + ocp.cost.yref = np.zeros((COST_DIM, )) + ocp.cost.yref_e = np.zeros((COST_E_DIM, )) + # Add offset to smooth out low speed control + # TODO unclear if this right solution long term + v_ego_offset = v_ego + SPEED_OFFSET + # TODO there are two costs on psi_rate_ego_dot, one + # is correlated to jerk the other to steering wheel movement + # the steering wheel movement cost is added to prevent excessive + # wheel movements + ocp.model.cost_y_expr = vertcat(y_ego, + v_ego_offset * psi_ego, + v_ego_offset * psi_rate_ego, + v_ego_offset * psi_rate_ego_dot, + psi_rate_ego_dot / (v_ego + 0.1)) + ocp.model.cost_y_expr_e = vertcat(y_ego, + v_ego_offset * psi_ego, + v_ego_offset * psi_rate_ego) + + # set constraints + ocp.constraints.constr_type = 'BGH' + ocp.constraints.idxbx = np.array([2,3]) + ocp.constraints.ubx = np.array([np.radians(90), np.radians(50)]) + ocp.constraints.lbx = np.array([-np.radians(90), -np.radians(50)]) + x0 = np.zeros((X_DIM,)) + ocp.constraints.x0 = x0 + + ocp.solver_options.qp_solver = 'PARTIAL_CONDENSING_HPIPM' + ocp.solver_options.hessian_approx = 'GAUSS_NEWTON' + ocp.solver_options.integrator_type = 'ERK' + ocp.solver_options.nlp_solver_type = ACADOS_SOLVER_TYPE + ocp.solver_options.qp_solver_iter_max = 1 + ocp.solver_options.qp_solver_cond_N = 1 + + # set prediction horizon + ocp.solver_options.tf = Tf + ocp.solver_options.shooting_nodes = np.array(ModelConstants.T_IDXS)[:N+1] + + ocp.code_export_directory = EXPORT_DIR + return ocp + + +class LateralMpc: + def __init__(self, x0=None): + if x0 is None: + x0 = np.zeros(X_DIM) + self.solver = AcadosOcpSolverCython(MODEL_NAME, ACADOS_SOLVER_TYPE, N) + self.reset(x0) + + def reset(self, x0=None): + if x0 is None: + x0 = np.zeros(X_DIM) + self.x_sol = np.zeros((N+1, X_DIM)) + self.u_sol = np.zeros((N, 1)) + self.yref = np.zeros((N+1, COST_DIM)) + for i in range(N): + self.solver.cost_set(i, "yref", self.yref[i]) + self.solver.cost_set(N, "yref", self.yref[N][:COST_E_DIM]) + + # Somehow needed for stable init + for i in range(N+1): + self.solver.set(i, 'x', np.zeros(X_DIM)) + self.solver.set(i, 'p', np.zeros(P_DIM)) + self.solver.constraints_set(0, "lbx", x0) + self.solver.constraints_set(0, "ubx", x0) + self.solver.solve() + self.solution_status = 0 + self.solve_time = 0.0 + self.cost = 0 + + def set_weights(self, path_weight, heading_weight, + lat_accel_weight, lat_jerk_weight, + steering_rate_weight): + W = np.asfortranarray(np.diag([path_weight, heading_weight, + lat_accel_weight, lat_jerk_weight, + steering_rate_weight])) + for i in range(N): + self.solver.cost_set(i, 'W', W) + self.solver.cost_set(N, 'W', W[:COST_E_DIM,:COST_E_DIM]) + + def run(self, x0, p, y_pts, heading_pts, yaw_rate_pts): + x0_cp = np.copy(x0) + p_cp = np.copy(p) + self.solver.constraints_set(0, "lbx", x0_cp) + self.solver.constraints_set(0, "ubx", x0_cp) + self.yref[:,0] = y_pts + v_ego = p_cp[0, 0] + # rotation_radius = p_cp[1] + self.yref[:,1] = heading_pts * (v_ego + SPEED_OFFSET) + self.yref[:,2] = yaw_rate_pts * (v_ego + SPEED_OFFSET) + for i in range(N): + self.solver.cost_set(i, "yref", self.yref[i]) + self.solver.set(i, "p", p_cp[i]) + self.solver.set(N, "p", p_cp[N]) + self.solver.cost_set(N, "yref", self.yref[N][:COST_E_DIM]) + + t = time.monotonic() + self.solution_status = self.solver.solve() + self.solve_time = time.monotonic() - t + + for i in range(N+1): + self.x_sol[i] = self.solver.get(i, 'x') + for i in range(N): + self.u_sol[i] = self.solver.get(i, 'u') + self.cost = self.solver.get_cost() + + +if __name__ == "__main__": + ocp = gen_lat_ocp() + AcadosOcpSolver.generate(ocp, json_file=JSON_FILE) + # AcadosOcpSolver.build(ocp.code_export_directory, with_cython=True) diff --git a/iqpilot/selfdrive/controls/lib/ldw.py b/iqpilot/selfdrive/controls/lib/ldw.py new file mode 100644 index 000000000..f62b19d0c --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/ldw.py @@ -0,0 +1,41 @@ +from iqpilot.cereal import log +from iqpilot.common.realtime import DT_CTRL +from iqpilot.common.constants import CV + + +CAMERA_OFFSET = 0.04 +LDW_MIN_SPEED = 31 * CV.MPH_TO_MS +LANE_DEPARTURE_THRESHOLD = 0.1 + +class LaneDepartureWarning: + def __init__(self): + self.left = False + self.right = False + self.last_blinker_frame = 0 + + def update(self, frame, modelV2, CS, CC): + if CS.leftBlinker or CS.rightBlinker: + self.last_blinker_frame = frame + + recent_blinker = (frame - self.last_blinker_frame) * DT_CTRL < 5.0 # 5s blinker cooldown + ldw_allowed = CS.vEgo > LDW_MIN_SPEED and not recent_blinker and not CC.latActive + + desire_prediction = modelV2.meta.desirePrediction + if len(desire_prediction) and ldw_allowed: + right_lane_visible = modelV2.laneLineProbs[2] > 0.5 + left_lane_visible = modelV2.laneLineProbs[1] > 0.5 + l_lane_change_prob = desire_prediction[log.Desire.laneChangeLeft] + r_lane_change_prob = desire_prediction[log.Desire.laneChangeRight] + + lane_lines = modelV2.laneLines + l_lane_close = left_lane_visible and (lane_lines[1].y[0] > -(1.08 + CAMERA_OFFSET)) + r_lane_close = right_lane_visible and (lane_lines[2].y[0] < (1.08 - CAMERA_OFFSET)) + + self.left = bool(l_lane_change_prob > LANE_DEPARTURE_THRESHOLD and l_lane_close) + self.right = bool(r_lane_change_prob > LANE_DEPARTURE_THRESHOLD and r_lane_close) + else: + self.left, self.right = False, False + + @property + def warning(self) -> bool: + return bool(self.left or self.right) diff --git a/iqpilot/selfdrive/controls/lib/longcontrol.py b/iqpilot/selfdrive/controls/lib/longcontrol.py new file mode 100644 index 000000000..578ce49b4 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/longcontrol.py @@ -0,0 +1,95 @@ +import numpy as np +from iqpilot.cereal import car +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N +from iqpilot.common.pid import PIDController +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.controls.lib.smooth_stops import SmoothStopController + +CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N] + +LongCtrlState = car.CarControl.Actuators.LongControlState + + +def long_control_state_trans(CP_IQ, active, long_control_state, should_stop, brake_pressed, cruise_standstill): + # Gas Interceptor + cruise_standstill = cruise_standstill and not CP_IQ.enableGasInterceptor + + starting_condition = (not should_stop and + not cruise_standstill and + not brake_pressed) + + if not active: + long_control_state = LongCtrlState.off + + else: + if long_control_state == LongCtrlState.off: + if not starting_condition: + long_control_state = LongCtrlState.stopping + else: + long_control_state = LongCtrlState.pid + + elif long_control_state == LongCtrlState.stopping: + if starting_condition: + long_control_state = LongCtrlState.pid + + elif long_control_state == LongCtrlState.pid: + if should_stop: + long_control_state = LongCtrlState.stopping + return long_control_state + +class LongControl: + def __init__(self, CP, CP_IQ): + self.CP = CP + self.CP_IQ = CP_IQ + self.long_control_state = LongCtrlState.off + self.pid = PIDController((CP.longitudinalTuning.kpBP, CP.longitudinalTuning.kpV), + (CP.longitudinalTuning.kiBP, CP.longitudinalTuning.kiV), + rate=1 / DT_CTRL) + self.last_output_accel = 0.0 + self.stopping_decel_rate = CP_IQ.stoppingDecelRateOverride or 1.0 + self.smooth = SmoothStopController() + + def reset(self): + self.pid.reset() + + def update(self, active, CS, a_target, should_stop, accel_limits, lead_distance=0.0, has_lead=False, gas_override=False): + """Update longitudinal control. This updates the state machine and runs a PID loop""" + self.pid.neg_limit = accel_limits[0] + self.pid.pos_limit = accel_limits[1] + self.smooth.update() + + if self.smooth.enabled and active and self.long_control_state != LongCtrlState.stopping: + stop_now = self.smooth.want_hold(should_stop, CS.vEgo, CS.standstill) + else: + stop_now = should_stop + + self.long_control_state = long_control_state_trans(self.CP_IQ, active, self.long_control_state, stop_now, CS.brakePressed, + CS.cruiseState.standstill) + if self.long_control_state == LongCtrlState.off: + self.reset() + self.smooth.reset() + output_accel = 0. + + elif self.long_control_state == LongCtrlState.stopping: + output_accel = self.last_output_accel + if output_accel > self.CP.stopAccel: + output_accel = min(output_accel, 0.0) + # TODO: can we just go straight to stopAccel? + output_accel -= self.stopping_decel_rate * DT_CTRL # m/s^2/s while trying to stop + self.reset() + self.smooth.reset() + + else: # LongCtrlState.pid + if self.smooth.enabled and active and should_stop: + output_accel = self.smooth.settle(a_target, CS.vEgo, lead_distance, has_lead, self.last_output_accel) + self.reset() + else: + error = a_target - CS.aEgo + output_accel = self.pid.update(error, speed=CS.vEgo, + feedforward=a_target, + freeze_integrator=gas_override) + self.smooth.reset() + + self.last_output_accel = np.clip(output_accel, accel_limits[0], accel_limits[1]) + return self.last_output_accel diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/.gitignore b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/.gitignore new file mode 100644 index 000000000..6f09b1aa0 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/.gitignore @@ -0,0 +1,2 @@ +acados_ocp_long.json +c_generated_code/ diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/__init__.py b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/acados_ocp_long.json b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/acados_ocp_long.json new file mode 100644 index 000000000..548aae95b --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/acados_ocp_long.json @@ -0,0 +1,483 @@ +{ + "acados_include_path": "/data/openpilot/iqpilot/third_party/acados/include", + "acados_lib_path": "/data/openpilot/iqpilot/third_party/acados/lib", + "code_export_directory": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code", + "constraints": { + "C": [], + "C_e": [], + "D": [], + "constr_type": "BGH", + "constr_type_e": "BGH", + "idxbu": [], + "idxbx": [], + "idxbx_0": [ + 0, + 1, + 2 + ], + "idxbx_e": [], + "idxbxe_0": [ + 0, + 1, + 2 + ], + "idxsbu": [], + "idxsbx": [], + "idxsbx_e": [], + "idxsg": [], + "idxsg_e": [], + "idxsh": [ + 0, + 1, + 2, + 3 + ], + "idxsh_e": [], + "idxsphi": [], + "idxsphi_e": [], + "lbu": [], + "lbx": [], + "lbx_0": [ + 0.0, + 0.0, + 0.0 + ], + "lbx_e": [], + "lg": [], + "lg_e": [], + "lh": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "lh_e": [], + "lphi": [], + "lphi_e": [], + "lsbu": [], + "lsbx": [], + "lsbx_e": [], + "lsg": [], + "lsg_e": [], + "lsh": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "lsh_e": [], + "lsphi": [], + "lsphi_e": [], + "ubu": [], + "ubx": [], + "ubx_0": [ + 0.0, + 0.0, + 0.0 + ], + "ubx_e": [], + "ug": [], + "ug_e": [], + "uh": [ + 10000.0, + 10000.0, + 10000.0, + 10000.0 + ], + "uh_e": [], + "uphi": [], + "uphi_e": [], + "usbu": [], + "usbx": [], + "usbx_e": [], + "usg": [], + "usg_e": [], + "ush": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ush_e": [], + "usphi": [], + "usphi_e": [] + }, + "cost": { + "Vu": [], + "Vu_0": [], + "Vx": [], + "Vx_0": [], + "Vx_e": [], + "Vz": [], + "Vz_0": [], + "W": [ + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + ], + "W_0": [ + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + ], + "W_e": [ + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + ], + "Zl": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Zl_e": [], + "Zu": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Zu_e": [], + "cost_ext_fun_type": "casadi", + "cost_ext_fun_type_0": "casadi", + "cost_ext_fun_type_e": "casadi", + "cost_type": "NONLINEAR_LS", + "cost_type_0": "NONLINEAR_LS", + "cost_type_e": "NONLINEAR_LS", + "yref": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "yref_0": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "yref_e": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "zl": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "zl_e": [], + "zu": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "zu_e": [] + }, + "cython_include_dirs": [ + "/data/openpilot/.venv/lib/python3.12/site-packages/numpy/_core/include", + "/usr/include/python3.12" + ], + "dims": { + "N": 12, + "nbu": 0, + "nbx": 0, + "nbx_0": 3, + "nbx_e": 0, + "nbxe_0": 3, + "ng": 0, + "ng_e": 0, + "nh": 4, + "nh_e": 0, + "np": 5, + "nphi": 0, + "nphi_e": 0, + "nr": 0, + "nr_e": 0, + "ns": 4, + "ns_e": 0, + "nsbu": 0, + "nsbx": 0, + "nsbx_e": 0, + "nsg": 0, + "nsg_e": 0, + "nsh": 4, + "nsh_e": 0, + "nsphi": 0, + "nsphi_e": 0, + "nu": 1, + "nx": 3, + "ny": 5, + "ny_0": 5, + "ny_e": 4, + "nz": 0 + }, + "json_file": "/data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/acados_ocp_long.json", + "model": { + "con_h_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegiaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegpcaaaaaaaaaaaaaafaaaaaaabgpfngjgogegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpfngbgihchcaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaacbaaaaaamgfgbgegpfegbgoghgfgchpfggbgdgehpgchegbaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaeglaaaaaaaaaaaaaaachbaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgfaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhchbaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgdaaaaaaaegbaaaaaaaaaaaaaaachbaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgkaaaaaaa", + "con_h_expr_e": null, + "con_phi_expr": null, + "con_phi_expr_e": null, + "con_r_expr": null, + "con_r_expr_e": null, + "con_r_in_phi": null, + "con_r_in_phi_e": null, + "cost_conl_custom_outer_hess": null, + "cost_conl_custom_outer_hess_0": null, + "cost_conl_custom_outer_hess_e": null, + "cost_expr_ext_cost": null, + "cost_expr_ext_cost_0": null, + "cost_expr_ext_cost_custom_hess": null, + "cost_expr_ext_cost_custom_hess_0": null, + "cost_expr_ext_cost_custom_hess_e": null, + "cost_expr_ext_cost_e": null, + "cost_psi_expr": null, + "cost_psi_expr_0": null, + "cost_psi_expr_e": null, + "cost_r_in_psi_expr": null, + "cost_r_in_psi_expr_0": null, + "cost_r_in_psi_expr_e": null, + "cost_y_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegjaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegbaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaeglaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgfaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhcheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgdaaaaaaaegbaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgkaaaaaaachcaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg", + "cost_y_expr_0": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegjaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegbaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaeglaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgfaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhcheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgdaaaaaaaegbaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgkaaaaaaachcaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg", + "cost_y_expr_e": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegiaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegbaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaeglaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgfaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhcheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgdaaaaaaaegbaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgkaaaaaaachcaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpg", + "disc_dyn_expr": null, + "dyn_disc_fun": null, + "dyn_disc_fun_jac": null, + "dyn_disc_fun_jac_hess": null, + "dyn_ext_fun_type": "casadi", + "dyn_generic_source": null, + "f_expl_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg", + "f_impl_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaaihpffghgpgpfegpgehegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaaghpffghgpgpfegpgehegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaabgpffghgpgpfegpgehegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg", + "gnsf": { + "nontrivial_f_LO": 1, + "purely_linear": 0 + }, + "name": "long", + "p": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegjaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpfngjgogegpcaaaaaaaaaaaaaafaaaaaaabgpfngbgihegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhegpcaaaaaaaaaaaaaacbaaaaaamgfgbgegpfegbgoghgfgchpfggbgdgehpgch", + "u": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegfaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg", + "x": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpg", + "xdot": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaaihpffghgpgpfegpgehegpcaaaaaaaaaaaaaajaaaaaaaghpffghgpgpfegpgehegpcaaaaaaaaaaaaaajaaaaaaabgpffghgpgpfegpgeh", + "z": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "parameter_values": [ + -1.2, + 1.2, + 0.0, + 1.45, + 0.75 + ], + "problem_class": "OCP", + "shared_lib_ext": ".so", + "solver_options": { + "Tsim": 0.06944444444444445, + "alpha_min": 0.05, + "alpha_reduction": 0.7, + "collocation_type": "GAUSS_LEGENDRE", + "custom_templates": [], + "custom_update_copy": true, + "custom_update_filename": "", + "custom_update_header_filename": "", + "eps_sufficient_descent": 0.0001, + "exact_hess_constr": 1, + "exact_hess_cost": 1, + "exact_hess_dyn": 1, + "ext_cost_num_hess": 0, + "ext_fun_compile_flags": "-O2", + "full_step_dual": 0, + "globalization": "FIXED_STEP", + "globalization_use_SOC": 0, + "hessian_approx": "GAUSS_NEWTON", + "hpipm_mode": "BALANCE", + "initialize_t_slacks": 0, + "integrator_type": "ERK", + "levenberg_marquardt": 0.0, + "line_search_use_sufficient_descent": 0, + "model_external_shared_lib_dir": null, + "model_external_shared_lib_name": null, + "nlp_solver_ext_qp_res": 0, + "nlp_solver_max_iter": 100, + "nlp_solver_step_length": 1.0, + "nlp_solver_tol_comp": 1e-06, + "nlp_solver_tol_eq": 1e-06, + "nlp_solver_tol_ineq": 1e-06, + "nlp_solver_tol_stat": 1e-06, + "nlp_solver_type": "SQP_RTI", + "print_level": 0, + "qp_solver": "PARTIAL_CONDENSING_HPIPM", + "qp_solver_cond_N": 1, + "qp_solver_cond_ric_alg": 1, + "qp_solver_iter_max": 10, + "qp_solver_ric_alg": 1, + "qp_solver_tol_comp": 0.001, + "qp_solver_tol_eq": 0.001, + "qp_solver_tol_ineq": 0.001, + "qp_solver_tol_stat": 0.001, + "qp_solver_warm_start": 0, + "regularize_method": null, + "shooting_nodes": [ + 0.0, + 0.06944444444444445, + 0.2777777777777778, + 0.625, + 1.1111111111111112, + 1.7361111111111114, + 2.5, + 3.4027777777777786, + 4.444444444444445, + 5.625, + 6.9444444444444455, + 8.402777777777777, + 10.0 + ], + "sim_method_jac_reuse": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "sim_method_newton_iter": 3, + "sim_method_newton_tol": 0.0, + "sim_method_num_stages": [ + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4 + ], + "sim_method_num_steps": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "tf": 10.0, + "time_steps": [ + 0.06944444444444445, + 0.20833333333333334, + 0.3472222222222222, + 0.48611111111111116, + 0.6250000000000002, + 0.7638888888888886, + 0.9027777777777786, + 1.041666666666666, + 1.1805555555555554, + 1.3194444444444455, + 1.4583333333333313, + 1.5972222222222232 + ] + } +} \ No newline at end of file diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/Makefile b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/Makefile new file mode 100644 index 000000000..87839b1ba --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/Makefile @@ -0,0 +1,213 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + + + + + +# define sources and use make's implicit rules to generate object files (*.o) + +# model +MODEL_SRC= +MODEL_SRC+= long_model/long_expl_ode_fun.c +MODEL_SRC+= long_model/long_expl_vde_forw.c +MODEL_SRC+= long_model/long_expl_vde_adj.c +MODEL_OBJ := $(MODEL_SRC:.c=.o) + +# optimal control problem - mostly CasADi exports +OCP_SRC= +OCP_SRC+= long_constraints/long_constr_h_fun_jac_uxt_zt.c +OCP_SRC+= long_constraints/long_constr_h_fun.c +OCP_SRC+= long_cost/long_cost_y_0_fun.c +OCP_SRC+= long_cost/long_cost_y_0_fun_jac_ut_xt.c +OCP_SRC+= long_cost/long_cost_y_0_hess.c +OCP_SRC+= long_cost/long_cost_y_fun.c +OCP_SRC+= long_cost/long_cost_y_fun_jac_ut_xt.c +OCP_SRC+= long_cost/long_cost_y_hess.c +OCP_SRC+= long_cost/long_cost_y_e_fun.c +OCP_SRC+= long_cost/long_cost_y_e_fun_jac_ut_xt.c +OCP_SRC+= long_cost/long_cost_y_e_hess.c + +OCP_SRC+= acados_solver_long.c +OCP_OBJ := $(OCP_SRC:.c=.o) + +# for sim solver +SIM_SRC= acados_sim_solver_long.c +SIM_OBJ := $(SIM_SRC:.c=.o) + +# for target example +EX_SRC= main_long.c +EX_OBJ := $(EX_SRC:.c=.o) +EX_EXE := $(EX_SRC:.c=) + +# for target example_sim +EX_SIM_SRC= main_sim_long.c +EX_SIM_OBJ := $(EX_SIM_SRC:.c=.o) +EX_SIM_EXE := $(EX_SIM_SRC:.c=) + +# combine model, sim and ocp object files +OBJ= +OBJ+= $(MODEL_OBJ) +OBJ+= $(SIM_OBJ) +OBJ+= $(OCP_OBJ) + +EXTERNAL_DIR= +EXTERNAL_LIB= + +INCLUDE_PATH = /data/openpilot/iqpilot/third_party/acados/include +LIB_PATH = /data/openpilot/iqpilot/third_party/acados/lib + +# preprocessor flags for make's implicit rules +CPPFLAGS+= -I$(INCLUDE_PATH) +CPPFLAGS+= -I$(INCLUDE_PATH)/acados +CPPFLAGS+= -I$(INCLUDE_PATH)/blasfeo/include +CPPFLAGS+= -I$(INCLUDE_PATH)/hpipm/include + + +# define the c-compiler flags for make's implicit rules +CFLAGS = -fPIC -std=c99 -O2#-fno-diagnostics-show-line-numbers -g +# # Debugging +# CFLAGS += -g3 + +# linker flags +LDFLAGS+= -L$(LIB_PATH) + +# link to libraries +LDLIBS+= -lacados +LDLIBS+= -lhpipm +LDLIBS+= -lblasfeo +LDLIBS+= -lm +LDLIBS+= + +# libraries +LIBACADOS_SOLVER=libacados_solver_long.so +LIBACADOS_OCP_SOLVER=libacados_ocp_solver_long.so +LIBACADOS_SIM_SOLVER=lib$(SIM_SRC:.c=.so) + +# virtual targets +.PHONY : all clean + +#all: clean example_sim example shared_lib + +all: clean example_sim example +shared_lib: bundled_shared_lib ocp_shared_lib sim_shared_lib + +# some linker targets +example: $(EX_OBJ) $(OBJ) + $(CC) $^ -o $(EX_EXE) $(LDFLAGS) $(LDLIBS) + +example_sim: $(EX_SIM_OBJ) $(MODEL_OBJ) $(SIM_OBJ) + $(CC) $^ -o $(EX_SIM_EXE) $(LDFLAGS) $(LDLIBS) + +bundled_shared_lib: $(OBJ) + $(CC) -shared $^ -o $(LIBACADOS_SOLVER) $(LDFLAGS) $(LDLIBS) + +ocp_shared_lib: $(OCP_OBJ) $(MODEL_OBJ) + $(CC) -shared $^ -o $(LIBACADOS_OCP_SOLVER) $(LDFLAGS) $(LDLIBS) \ + -L$(EXTERNAL_DIR) -l$(EXTERNAL_LIB) + +sim_shared_lib: $(SIM_OBJ) $(MODEL_OBJ) + $(CC) -shared $^ -o $(LIBACADOS_SIM_SOLVER) $(LDFLAGS) $(LDLIBS) + + +# Cython targets +ocp_cython_c: ocp_shared_lib + cython \ + -o acados_ocp_solver_pyx.c \ + -I $(INCLUDE_PATH)/../interfaces/acados_template/acados_template \ + $(INCLUDE_PATH)/../interfaces/acados_template/acados_template/acados_ocp_solver_pyx.pyx \ + -I /data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code \ + +ocp_cython_o: ocp_cython_c + $(CC) $(ACADOS_FLAGS) -c -O2 \ + -fPIC \ + -o acados_ocp_solver_pyx.o \ + -I $(INCLUDE_PATH)/blasfeo/include/ \ + -I $(INCLUDE_PATH)/hpipm/include/ \ + -I $(INCLUDE_PATH) \ + -I /data/openpilot/.venv/lib/python3.12/site-packages/numpy/_core/include \ + -I /usr/include/python3.12 \ + acados_ocp_solver_pyx.c \ + +ocp_cython: ocp_cython_o + $(CC) $(ACADOS_FLAGS) -shared \ + -o acados_ocp_solver_pyx.so \ + -Wl,-rpath=$(LIB_PATH) \ + acados_ocp_solver_pyx.o \ + $(abspath .)/libacados_ocp_solver_long.so \ + $(LDFLAGS) $(LDLIBS) + +# Sim Cython targets +sim_cython_c: sim_shared_lib + cython \ + -o acados_sim_solver_pyx.c \ + -I $(INCLUDE_PATH)/../interfaces/acados_template/acados_template \ + $(INCLUDE_PATH)/../interfaces/acados_template/acados_template/acados_sim_solver_pyx.pyx \ + -I /data/openpilot/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code \ + +sim_cython_o: sim_cython_c + $(CC) $(ACADOS_FLAGS) -c -O2 \ + -fPIC \ + -o acados_sim_solver_pyx.o \ + -I $(INCLUDE_PATH)/blasfeo/include/ \ + -I $(INCLUDE_PATH)/hpipm/include/ \ + -I $(INCLUDE_PATH) \ + -I /data/openpilot/.venv/lib/python3.12/site-packages/numpy/_core/include \ + -I /usr/include/python3.12 \ + acados_sim_solver_pyx.c \ + +sim_cython: sim_cython_o + $(CC) $(ACADOS_FLAGS) -shared \ + -o acados_sim_solver_pyx.so \ + -Wl,-rpath=$(LIB_PATH) \ + acados_sim_solver_pyx.o \ + $(abspath .)/libacados_sim_solver_long.so \ + $(LDFLAGS) $(LDLIBS) + +clean: + $(RM) $(OBJ) $(EX_OBJ) $(EX_SIM_OBJ) + $(RM) $(LIBACADOS_SOLVER) $(LIBACADOS_OCP_SOLVER) $(LIBACADOS_SIM_SOLVER) + $(RM) $(EX_EXE) $(EX_SIM_EXE) + +clean_ocp_shared_lib: + $(RM) $(LIBACADOS_OCP_SOLVER) + $(RM) $(OCP_OBJ) + +clean_ocp_cython: + $(RM) libacados_ocp_solver_long.so + $(RM) acados_solver_long.o + $(RM) acados_ocp_solver_pyx.so + $(RM) acados_ocp_solver_pyx.o + +clean_sim_cython: + $(RM) libacados_sim_solver_long.so + $(RM) acados_sim_solver_long.o + $(RM) acados_sim_solver_pyx.so + $(RM) acados_sim_solver_pyx.o diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.so b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.so new file mode 100755 index 000000000..e97f268ce Binary files /dev/null and b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/acados_ocp_solver_pyx.so differ diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/libacados_ocp_solver_long.so b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/libacados_ocp_solver_long.so new file mode 100755 index 000000000..ba23c01a6 Binary files /dev/null and b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code/libacados_ocp_solver_long.so differ diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/gen.log b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/gen.log new file mode 100644 index 000000000..be4fa2ad9 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/gen.log @@ -0,0 +1,3 @@ +Warning: Please note that the following versions of CasADi are officially supported: 3.5.6 or 3.5.5 or 3.5.4 or 3.5.3 or 3.5.2 or 3.5.1 or 3.4.5 or 3.4.0. + If there is an incompatibility with the CasADi generated code, please consider changing your CasADi version. +Version 3.7.2 currently in use. diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py new file mode 100755 index 000000000..421cc46d4 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py @@ -0,0 +1,433 @@ +#!/usr/bin/env python3 +import os +import time +import numpy as np +from iqpilot.cereal import log +from iqdbc.car.interfaces import ACCEL_MIN, ACCEL_MAX +from iqpilot.common.realtime import DT_MDL +from iqpilot.common.swaglog import cloudlog +# WARNING: imports outside of constants will not trigger a rebuild +from iqpilot.selfdrive.iqmodeld.config import index_function, ModelConstants +from iqpilot.selfdrive.controls.radard import _LEAD_ACCEL_TAU # legacy lead extrapolation (newLeadMpc=False) +from iqpilot.common.params import Params, UnknownKeyName + +LEAD_T_IDXS_MODEL = np.array(ModelConstants.LEAD_T_IDXS) # [0, 2, 4, 6, 8, 10]s + +if __name__ == '__main__': # generating code + from iqpilot.third_party.acados.acados_template import AcadosModel, AcadosOcp, AcadosOcpSolver +else: + from iqpilot.selfdrive.controls.lib.longitudinal_mpc_lib.c_generated_code.acados_ocp_solver_pyx import AcadosOcpSolverCython + +from casadi import SX, vertcat + +MODEL_NAME = 'long' +LONG_MPC_DIR = os.path.dirname(os.path.abspath(__file__)) +EXPORT_DIR = os.path.join(LONG_MPC_DIR, "c_generated_code") +JSON_FILE = os.path.join(LONG_MPC_DIR, "acados_ocp_long.json") + +LongitudinalPlanSource = log.LongitudinalPlan.LongitudinalPlanSource +MPC_SOURCES = (LongitudinalPlanSource.lead0, LongitudinalPlanSource.lead1) + +X_DIM = 3 +U_DIM = 1 +PARAM_DIM = 5 +COST_E_DIM = 4 +COST_DIM = COST_E_DIM + 1 +CONSTR_DIM = 4 + +X_EGO_OBSTACLE_COST = 3. +X_EGO_COST = 0. +V_EGO_COST = 0. +A_EGO_COST = 0. +J_EGO_COST = 20. +DANGER_ZONE_COST = 100. +CRASH_DISTANCE = .25 +LEAD_DANGER_FACTOR = 0.75 +LIMIT_COST = 1e6 +ACADOS_SOLVER_TYPE = 'SQP_RTI' + +# Fewer timestamps don't hurt performance and lead to +# much better convergence of the MPC with low iterations +N = 12 +MAX_T = 10.0 +T_IDXS_LST = [index_function(idx, max_val=MAX_T, max_idx=N) for idx in range(N+1)] + +T_IDXS = np.array(T_IDXS_LST) +FCW_IDXS = T_IDXS < 5.0 +T_DIFFS = np.diff(T_IDXS, prepend=[0.]) +COMFORT_BRAKE = 2.5 +STOP_DISTANCE = 3.0 +MIN_X_LEAD_FACTOR = 0.5 +LEAD_PULLAWAY_VREL = 0.5 +LEAD_PULLAWAY_ABRAKE = -0.5 + +def get_jerk_factor(personality=log.LongitudinalPersonality.standard): + if personality==log.LongitudinalPersonality.relaxed: + return 1.0 + elif personality==log.LongitudinalPersonality.standard: + return 1.0 + elif personality==log.LongitudinalPersonality.aggressive: + return 0.5 + else: + raise NotImplementedError("Longitudinal personality not supported") + + +def get_T_FOLLOW(personality=log.LongitudinalPersonality.standard): + if personality==log.LongitudinalPersonality.relaxed: + return 1.75 + elif personality==log.LongitudinalPersonality.standard: + return 1.45 + elif personality==log.LongitudinalPersonality.aggressive: + return 1.25 + else: + raise NotImplementedError("Longitudinal personality not supported") + +def get_stopped_equivalence_factor(v_lead): + return (v_lead**2) / (2 * COMFORT_BRAKE) + +def get_safe_obstacle_distance(v_ego, t_follow): + return (v_ego**2) / (2 * COMFORT_BRAKE) + t_follow * v_ego + STOP_DISTANCE + +def gen_long_model(): + model = AcadosModel() + model.name = MODEL_NAME + + # states + x_ego, v_ego, a_ego = SX.sym('x_ego'), SX.sym('v_ego'), SX.sym('a_ego') + model.x = vertcat(x_ego, v_ego, a_ego) + + # controls + j_ego = SX.sym('j_ego') + model.u = vertcat(j_ego) + + # xdot + x_ego_dot = SX.sym('x_ego_dot') + v_ego_dot = SX.sym('v_ego_dot') + a_ego_dot = SX.sym('a_ego_dot') + model.xdot = vertcat(x_ego_dot, v_ego_dot, a_ego_dot) + + # live parameters + a_min = SX.sym('a_min') + a_max = SX.sym('a_max') + x_obstacle = SX.sym('x_obstacle') + lead_t_follow = SX.sym('lead_t_follow') + lead_danger_factor = SX.sym('lead_danger_factor') + model.p = vertcat(a_min, a_max, x_obstacle, lead_t_follow, lead_danger_factor) + + # dynamics model + f_expl = vertcat(v_ego, a_ego, j_ego) + model.f_impl_expr = model.xdot - f_expl + model.f_expl_expr = f_expl + return model + +def gen_long_ocp(): + ocp = AcadosOcp() + ocp.model = gen_long_model() + + Tf = T_IDXS[-1] + + # set dimensions + ocp.dims.N = N + + # set cost module + ocp.cost.cost_type = 'NONLINEAR_LS' + ocp.cost.cost_type_e = 'NONLINEAR_LS' + + QR = np.zeros((COST_DIM, COST_DIM)) + Q = np.zeros((COST_E_DIM, COST_E_DIM)) + + ocp.cost.W = QR + ocp.cost.W_e = Q + + x_ego, v_ego, a_ego = ocp.model.x[0], ocp.model.x[1], ocp.model.x[2] + j_ego = ocp.model.u[0] + + a_min, a_max = ocp.model.p[0], ocp.model.p[1] + x_obstacle = ocp.model.p[2] + lead_t_follow = ocp.model.p[3] + lead_danger_factor = ocp.model.p[4] + + ocp.cost.yref = np.zeros((COST_DIM, )) + ocp.cost.yref_e = np.zeros((COST_E_DIM, )) + + desired_dist_comfort = get_safe_obstacle_distance(v_ego, lead_t_follow) + + # The main cost in normal operation is how close you are to the "desired" distance + # from an obstacle at every timestep. This obstacle can be a lead car + # or other object. In e2e mode we can use x_position targets as a cost + # instead. + costs = [((x_obstacle - x_ego) - (desired_dist_comfort)) / (v_ego + 10.), + x_ego, + v_ego, + a_ego, + j_ego] + ocp.model.cost_y_expr = vertcat(*costs) + ocp.model.cost_y_expr_e = vertcat(*costs[:-1]) + + # Constraints on speed, acceleration and desired distance to + # the obstacle, which is treated as a slack constraint so it + # behaves like an asymmetrical cost. + constraints = vertcat(v_ego, + (a_ego - a_min), + (a_max - a_ego), + ((x_obstacle - x_ego) - lead_danger_factor * (desired_dist_comfort)) / (v_ego + 10.)) + ocp.model.con_h_expr = constraints + + x0 = np.zeros(X_DIM) + ocp.constraints.x0 = x0 + ocp.parameter_values = np.array([-1.2, 1.2, 0.0, get_T_FOLLOW(), LEAD_DANGER_FACTOR]) + + + # We put all constraint cost weights to 0 and only set them at runtime + cost_weights = np.zeros(CONSTR_DIM) + ocp.cost.zl = cost_weights + ocp.cost.Zl = cost_weights + ocp.cost.Zu = cost_weights + ocp.cost.zu = cost_weights + + ocp.constraints.lh = np.zeros(CONSTR_DIM) + ocp.constraints.uh = 1e4*np.ones(CONSTR_DIM) + ocp.constraints.idxsh = np.arange(CONSTR_DIM) + + # The HPIPM solver can give decent solutions even when it is stopped early + # Which is critical for our purpose where compute time is strictly bounded + # We use HPIPM in the SPEED_ABS mode, which ensures fastest runtime. This + # does not cause issues since the problem is well bounded. + ocp.solver_options.qp_solver = 'PARTIAL_CONDENSING_HPIPM' + ocp.solver_options.hessian_approx = 'GAUSS_NEWTON' + ocp.solver_options.integrator_type = 'ERK' + ocp.solver_options.nlp_solver_type = ACADOS_SOLVER_TYPE + ocp.solver_options.qp_solver_cond_N = 1 + + # More iterations take too much time and less lead to inaccurate convergence in + # some situations. Ideally we would run just 1 iteration to ensure fixed runtime. + ocp.solver_options.qp_solver_iter_max = 10 + ocp.solver_options.qp_tol = 1e-3 + + # set prediction horizon + ocp.solver_options.tf = Tf + ocp.solver_options.shooting_nodes = T_IDXS + + ocp.code_export_directory = EXPORT_DIR + return ocp + + +class LongitudinalMpc: + def __init__(self, dt=DT_MDL): + self.dt = dt + self._params = Params() + self.new_lead_mpc = self._read_new_lead_mpc() + self.solver = AcadosOcpSolverCython(MODEL_NAME, ACADOS_SOLVER_TYPE, N) + self.reset() + self.source = LongitudinalPlanSource.cruise + + def _read_new_lead_mpc(self) -> bool: + try: + return self._params.get_bool("newLeadMpc") + except UnknownKeyName: + return True + + def reset(self): + self.solver.reset() + + self.x_sol = np.zeros((N+1, X_DIM)) + self.u_sol = np.zeros((N, 1)) + self.v_solution = np.zeros(N+1) + self.a_solution = np.zeros(N+1) + self.j_solution = np.zeros(N) + self.yref = np.zeros((N+1, COST_DIM)) + + for i in range(N): + self.solver.cost_set(i, "yref", self.yref[i]) + self.solver.cost_set(N, "yref", self.yref[N][:COST_E_DIM]) + + self.params = np.zeros((N+1, PARAM_DIM)) + for i in range(N+1): + self.solver.set(i, 'x', np.zeros(X_DIM)) + + self.last_cloudlog_t = 0 + self.status = False + self.crash_cnt = 0.0 + self.solution_status = 0 + # timers + self.solve_time = 0.0 + self.time_qp_solution = 0.0 + self.time_linearization = 0.0 + self.time_integrator = 0.0 + self.x0 = np.zeros(X_DIM) + self.lead_xv_0 = np.zeros((N+1, 2)) + self.lead_xv_1 = np.zeros((N+1, 2)) + self.set_weights() + + def set_cost_weights(self, cost_weights, constraint_cost_weights): + W = np.asfortranarray(np.diag(cost_weights)) + for i in range(N): + self.solver.cost_set(i, 'W', W) + # Setting the slice without the copy make the array not contiguous, + # causing issues with the C interface. + self.solver.cost_set(N, 'W', np.copy(W[:COST_E_DIM, :COST_E_DIM])) + + # Set L2 slack cost on lower bound constraints + Zl = np.array(constraint_cost_weights) + for i in range(N): + self.solver.cost_set(i, 'Zl', Zl) + + def set_weights(self, personality=log.LongitudinalPersonality.standard): + jerk_factor = get_jerk_factor(personality) + cost_weights = [X_EGO_OBSTACLE_COST, X_EGO_COST, V_EGO_COST, A_EGO_COST, jerk_factor * J_EGO_COST] + constraint_cost_weights = [LIMIT_COST, LIMIT_COST, LIMIT_COST, DANGER_ZONE_COST] + self.set_cost_weights(cost_weights, constraint_cost_weights) + + def set_cur_state(self, v, a): + v_prev = self.x0[1] + self.x0[1] = v + self.x0[2] = a + if abs(v_prev - v) > 2.: # probably only helps if v < v_prev + for i in range(N+1): + self.solver.set(i, 'x', self.x0) + + @staticmethod + def extrapolate_lead(x_lead, v_lead, a_lead, a_lead_tau): + a_lead_traj = a_lead * np.exp(-a_lead_tau * (T_IDXS**2)/2.) + v_lead_traj = np.clip(v_lead + np.cumsum(T_DIFFS * a_lead_traj), 0.0, 1e8) + x_lead_traj = x_lead + np.cumsum(T_DIFFS * v_lead_traj) + lead_xv = np.column_stack((x_lead_traj, v_lead_traj)) + return lead_xv + + def process_lead_legacy(self, lead): + # behavior before PR #37824 (newLeadMpc=False): one immediate radar lead prediction + # extrapolated forward with acceleration decaying to 0 + v_ego = self.x0[1] + if lead is not None and lead.status: + x_lead = lead.dRel + v_lead = lead.vLead + a_lead = lead.aLeadK + a_lead_tau = lead.aLeadTau + else: + # Fake a fast lead car, so mpc can keep running in the same mode + x_lead = 50.0 + v_lead = v_ego + 10.0 + a_lead = 0.0 + a_lead_tau = _LEAD_ACCEL_TAU + + # MPC will not converge if immediate crash is expected + # Clip lead distance to what is still possible to brake for + min_x_lead = MIN_X_LEAD_FACTOR * (v_ego + v_lead) * (v_ego - v_lead) / (-ACCEL_MIN * 2) + x_lead = np.clip(x_lead, min_x_lead, 1e8) + v_lead = np.clip(v_lead, 0.0, 1e8) + a_lead = np.clip(a_lead, -10., 5.) + lead_xv = self.extrapolate_lead(x_lead, v_lead, a_lead, a_lead_tau) + return lead_xv + + def process_lead(self, model_lead, radar_lead): + v_ego = self.x0[1] + try: + x_model = np.asarray(model_lead.x, dtype=np.float64) + v_model = np.asarray(model_lead.v, dtype=np.float64) + valid_model_lead = (float(model_lead.prob) > 0.5 and radar_lead.status and float(radar_lead.modelProb) > 0.5 and + x_model.shape == LEAD_T_IDXS_MODEL.shape and v_model.shape == LEAD_T_IDXS_MODEL.shape and + np.all(np.isfinite(x_model)) and np.all(np.isfinite(v_model))) + except (AttributeError, TypeError, ValueError): + valid_model_lead = False + + if not valid_model_lead: + return self.process_lead_legacy(radar_lead) + + x_lead_traj = float(radar_lead.dRel) + (x_model - x_model[0]) + v_lead_traj = float(radar_lead.vLead) + (v_model - v_model[0]) + + # MPC won't converge on immediate crashes; lift h=0 to the minimum braking distance. + v_lead_0 = v_lead_traj[0] + min_x_lead = MIN_X_LEAD_FACTOR * (v_ego + v_lead_0) * (v_ego - v_lead_0) / (-ACCEL_MIN * 2) + x_lead_traj[0] = max(x_lead_traj[0], min_x_lead) + v_lead_traj = np.clip(v_lead_traj, 0.0, 1e8) + + x_lead_mpc = np.maximum.accumulate(np.interp(T_IDXS, LEAD_T_IDXS_MODEL, x_lead_traj)) + v_lead_mpc = np.interp(T_IDXS, LEAD_T_IDXS_MODEL, v_lead_traj) + if radar_lead.status and radar_lead.vRel > LEAD_PULLAWAY_VREL and radar_lead.aLeadK > LEAD_PULLAWAY_ABRAKE: + # ty spysyweeb for lead pull away fix phantom launch braking so you don't ram the lead in edge cases. + radar_velocity_floor = np.full_like(T_IDXS, float(radar_lead.vLead)) + radar_distance_floor = float(radar_lead.dRel) + float(radar_lead.vLead) * T_IDXS + v_lead_mpc = np.maximum(v_lead_mpc, radar_velocity_floor) + x_lead_mpc = np.maximum(x_lead_mpc, radar_distance_floor) + return np.column_stack((x_lead_mpc, v_lead_mpc)) + + def update(self, modelV2, radarstate, personality=log.LongitudinalPersonality.standard): + self.new_lead_mpc = self._read_new_lead_mpc() + t_follow = get_T_FOLLOW(personality) + model_leads = modelV2.leadsV3 + + if self.new_lead_mpc: + self.status = radarstate.leadOne.status or radarstate.leadTwo.status + model_lead_0 = model_leads[0] if len(model_leads) > 0 else None + model_lead_1 = model_leads[1] if len(model_leads) > 1 else None + lead_xv_0 = self.process_lead(model_lead_0, radarstate.leadOne) + lead_xv_1 = self.process_lead(model_lead_1, radarstate.leadTwo) + else: + # pre-PR behavior: radar lead extrapolated with accel decay + self.status = radarstate.leadOne.status or radarstate.leadTwo.status + lead_xv_0 = self.process_lead_legacy(radarstate.leadOne) + lead_xv_1 = self.process_lead_legacy(radarstate.leadTwo) + self.lead_xv_0 = lead_xv_0 + self.lead_xv_1 = lead_xv_1 + + # To estimate a safe distance from a moving lead, we calculate how much stopping + # distance that lead needs as a minimum. We can add that to the current distance + # and then treat that as a stopped car/obstacle at this new distance. + lead_0_obstacle = lead_xv_0[:,0] + get_stopped_equivalence_factor(lead_xv_0[:,1]) + lead_1_obstacle = lead_xv_1[:,0] + get_stopped_equivalence_factor(lead_xv_1[:,1]) + + x_obstacles = np.column_stack([lead_0_obstacle, lead_1_obstacle]) + self.source = MPC_SOURCES[np.argmin(x_obstacles[0])] + + self.yref[:,:] = 0.0 + for i in range(N): + self.solver.set(i, "yref", self.yref[i]) + self.solver.set(N, "yref", self.yref[N][:COST_E_DIM]) + + self.params[:,0] = ACCEL_MIN + self.params[:,1] = ACCEL_MAX + self.params[:,2] = np.min(x_obstacles, axis=1) + self.params[:,3] = t_follow + self.params[:,4] = LEAD_DANGER_FACTOR + + self.run() + lead_crash_prob = radarstate.leadOne.modelProb + if (np.any(lead_xv_0[FCW_IDXS,0] - self.x_sol[FCW_IDXS,0] < CRASH_DISTANCE) and + lead_crash_prob > 0.9): + self.crash_cnt += 1 + else: + self.crash_cnt = 0 + + def run(self): + for i in range(N+1): + self.solver.set(i, 'p', self.params[i]) + self.solver.constraints_set(0, "lbx", self.x0) + self.solver.constraints_set(0, "ubx", self.x0) + + self.solution_status = self.solver.solve() + self.solve_time = float(self.solver.get_stats('time_tot')[0]) + self.time_qp_solution = float(self.solver.get_stats('time_qp')[0]) + self.time_linearization = float(self.solver.get_stats('time_lin')[0]) + self.time_integrator = float(self.solver.get_stats('time_sim')[0]) + + for i in range(N+1): + self.x_sol[i] = self.solver.get(i, 'x') + for i in range(N): + self.u_sol[i] = self.solver.get(i, 'u') + + self.v_solution = self.x_sol[:,1] + self.a_solution = self.x_sol[:,2] + self.j_solution = self.u_sol[:,0] + + t = time.monotonic() + if self.solution_status != 0: + if t > self.last_cloudlog_t + 5.0: + self.last_cloudlog_t = t + cloudlog.warning(f"Long mpc reset, solution_status: {self.solution_status}") + self.reset() + + +if __name__ == "__main__": + ocp = gen_long_ocp() + AcadosOcpSolver.generate(ocp, json_file=JSON_FILE) diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_planner.py b/iqpilot/selfdrive/controls/lib/longitudinal_planner.py new file mode 100755 index 000000000..de2090456 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/longitudinal_planner.py @@ -0,0 +1,297 @@ +#!/usr/bin/env python3 +import math +import numpy as np + +import iqpilot.cereal.messaging as messaging +from iqdbc.car.interfaces import ACCEL_MIN, ACCEL_MAX +from iqpilot.common.constants import CV +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.params import Params, UnknownKeyName +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.controls.lib.longcontrol import LongCtrlState +from iqpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LongitudinalMpc, LongitudinalPlanSource +from iqpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import T_IDXS as T_IDXS_MPC +from iqpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N, DEFAULT_STOPPING_SPEED, get_accel_from_plan +from iqpilot.selfdrive.car.cruise import V_CRUISE_MAX, V_CRUISE_UNSET +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.issue_debug import log_issue_limited + +from iqpilot.selfdrive.controls.lib.iq_longitudinal_planner import LongitudinalPlannerIQ + +A_CRUISE_MAX_VALS = [2.0, 1.6, 0.8, 0.6] +A_CRUISE_MAX_BP = [0., 10.0, 25., 40.] +A_CRUISE_MIN = -1.2 +J_CRUISE = 1.0 +CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N] +ALLOW_THROTTLE_THRESHOLD = 0.4 +MIN_ALLOW_THROTTLE_SPEED = 2.5 + +LAUNCH_DISARM_SPEED = 2.0 +LAUNCH_COMMIT_T = 3.5 +LAUNCH_MOVING_SPEED = 1.2 +LAUNCH_MAX_ACCEL = 1.5 + +E2E_CRUISE_CONVERGENCE_TAU = 15.0 +E2E_CRUISE_ACCEL_MAX = 0.5 +E2E_MODEL_SPEED_HORIZON = 5.0 +E2E_ACCEL_INTENT_BP = [-0.05, 0.05] +E2E_MODEL_SPEED_INTENT_BP = [-0.5, 0.0] + +# Lookup table for turns +_A_TOTAL_MAX_V = [1.7, 3.2] +_A_TOTAL_MAX_BP = [20., 40.] + +def get_max_accel(v_ego): + return np.interp(v_ego, A_CRUISE_MAX_BP, A_CRUISE_MAX_VALS) + +def get_coast_accel(pitch): + return np.sin(pitch) * -5.65 - 0.3 # fitted from data using xx/projects/allow_throttle/compute_coast_accel.py + +def get_lead_distance(radarState): + if radarState.leadOne.status and (not radarState.leadTwo.status or radarState.leadOne.dRel < radarState.leadTwo.dRel): + return radarState.leadOne.dRel + if radarState.leadTwo.status: + return radarState.leadTwo.dRel + return 0 + +def get_cruise_accel(e2e, v_cruise, v_ego, a_cruise_prev, angle_steers, CP, dt, accel_coast, allow_throttle): + max_accel = ACCEL_MAX if e2e else get_max_accel(v_ego) + + if not e2e: + a_total_max = np.interp(v_ego, _A_TOTAL_MAX_BP, _A_TOTAL_MAX_V) + a_y = v_ego ** 2 * angle_steers * CV.DEG_TO_RAD / (CP.steerRatio * CP.wheelbase) + a_x_allowed = math.sqrt(max(a_total_max ** 2 - a_y ** 2, 0.)) + max_accel = min(max_accel, a_x_allowed) + if not allow_throttle: + clipped_accel_coast = max(accel_coast, ACCEL_MIN) + coast_limit = np.interp(v_ego, [MIN_ALLOW_THROTTLE_SPEED, MIN_ALLOW_THROTTLE_SPEED*2], [max_accel, clipped_accel_coast]) + max_accel = min(max_accel, coast_limit) + + target_accel = np.clip(v_cruise - v_ego, A_CRUISE_MIN, max_accel) + target_accel = float(np.clip(target_accel, a_cruise_prev - J_CRUISE * dt, a_cruise_prev + J_CRUISE * dt)) + + cruise_should_stop = v_cruise == 0.0 + return target_accel, cruise_should_stop + + +def get_e2e_accel(v_ego, v_cruise, model_v, a_target, should_stop): + if should_stop or v_cruise <= v_ego or len(model_v) != len(T_IDXS_MPC): + return a_target + + convergence_accel = min((v_cruise - v_ego) / E2E_CRUISE_CONVERGENCE_TAU, E2E_CRUISE_ACCEL_MAX) + if convergence_accel <= a_target: + return a_target + + # Only help the model converge to cruise when both its immediate action and + # velocity trajectory show no active deceleration intent. The lead MPC and + # cruise candidates remain hard upper bounds on the final acceleration. + accel_intent = np.interp(a_target, E2E_ACCEL_INTENT_BP, [0.0, 1.0]) + model_speed = np.interp(E2E_MODEL_SPEED_HORIZON, T_IDXS_MPC, model_v) + speed_intent = np.interp(model_speed - v_ego, E2E_MODEL_SPEED_INTENT_BP, [0.0, 1.0]) + return float(np.interp(min(accel_intent, speed_intent), [0.0, 1.0], [a_target, convergence_accel])) + + +def get_accel_candidates(e2e, has_lead, mpc_candidate, cruise_candidate, e2e_candidate): + candidates = [] + # With no lead, the MPC follows a synthetic fast lead. It remains the ACC + # policy, but must not limit the model policy in full E2E. + if not e2e or has_lead: + candidates.append(mpc_candidate) + candidates.append(cruise_candidate) + if e2e: + candidates.append(e2e_candidate) + return candidates + + +class LongitudinalPlanner(LongitudinalPlannerIQ): + def __init__(self, CP, CP_IQ, init_v=0.0, init_a=0.0, dt=DT_MDL): + self.CP = CP + self.stopping_speed = CP_IQ.longitudinalStoppingSpeedOverride or DEFAULT_STOPPING_SPEED + self.mpc = LongitudinalMpc(dt=dt) + LongitudinalPlannerIQ.__init__(self, self.CP, CP_IQ, self.mpc) + self.fcw = False + self.dt = dt + self.allow_throttle = True + + self.a_desired = init_a + self.v_desired_filter = FirstOrderFilter(init_v, 2.0, self.dt) + self.a_cruise = init_a + self.output_a_target = 0.0 + self.output_should_stop = False + self.launch_armed = False + try: + self.exp_speed_conv = Params().get_bool("expSpeedConv") + except UnknownKeyName: + self.exp_speed_conv = False + + self.v_desired_trajectory = np.zeros(CONTROL_N) + self.a_desired_trajectory = np.zeros(CONTROL_N) + self.j_desired_trajectory = np.zeros(CONTROL_N) + + @staticmethod + def parse_model(model_msg): + if (len(model_msg.position.x) == ModelConstants.IDX_N and + len(model_msg.velocity.x) == ModelConstants.IDX_N and + len(model_msg.acceleration.x) == ModelConstants.IDX_N): + x = np.interp(T_IDXS_MPC, ModelConstants.T_IDXS, model_msg.position.x) + v = np.interp(T_IDXS_MPC, ModelConstants.T_IDXS, model_msg.velocity.x) + a = np.interp(T_IDXS_MPC, ModelConstants.T_IDXS, model_msg.acceleration.x) + j = np.zeros(len(T_IDXS_MPC)) + else: + x = np.zeros(len(T_IDXS_MPC)) + v = np.zeros(len(T_IDXS_MPC)) + a = np.zeros(len(T_IDXS_MPC)) + j = np.zeros(len(T_IDXS_MPC)) + if len(model_msg.meta.disengagePredictions.gasPressProbs) > 1: + throttle_prob = model_msg.meta.disengagePredictions.gasPressProbs[1] + else: + throttle_prob = 1.0 + return x, v, a, j, throttle_prob + + def update(self, sm): + LongitudinalPlannerIQ.update(self, sm) + + if len(sm['carControl'].orientationNED) == 3: + accel_coast = get_coast_accel(sm['carControl'].orientationNED[1]) + else: + accel_coast = ACCEL_MAX + + v_ego = sm['carState'].vEgo + v_cruise_kph = min(sm['carState'].vCruise, V_CRUISE_MAX) + v_cruise = v_cruise_kph * CV.KPH_TO_MS + if sm['controlsState'].forceDecel: + v_cruise = 0.0 + + long_control_off = sm['controlsState'].longControlState == LongCtrlState.off + + # Reset current state when not engaged, or user is controlling the speed + reset_state = long_control_off if self.CP.openpilotLongitudinalControl else not sm['selfdriveState'].enabled + # PCM cruise speed may be updated a few cycles later, check if initialized + v_cruise_initialized = sm['carState'].vCruise != V_CRUISE_UNSET + reset_state = reset_state or not v_cruise_initialized + steer_angle_without_offset = sm['carState'].steeringAngleDeg - sm['vehicleParameters'].angleOffsetDeg + + if reset_state: + self.v_desired_filter.x = v_ego + self.a_desired = np.clip(sm['carState'].aEgo, ACCEL_MIN, ACCEL_MAX) + self.a_cruise = self.a_desired + + # Prevent divergence, smooth in current v_ego + self.v_desired_filter.x = max(0.0, self.v_desired_filter.update(v_ego)) + _, model_v, model_a, _, throttle_prob = self.parse_model(sm['modelV2']) + # Don't clip at low speeds since throttle_prob doesn't account for creep + self.allow_throttle = throttle_prob > ALLOW_THROTTLE_THRESHOLD or v_ego <= MIN_ALLOW_THROTTLE_SPEED + + # Get new v_cruise from Smart Cruise Control and Speed Limit Assist + v_cruise = LongitudinalPlannerIQ.update_targets(self, sm, self.v_desired_filter.x, v_cruise) + + if sm['controlsState'].forceDecel: + v_cruise = 0.0 + + personality = sm['selfdriveState'].personality + self.mpc.set_weights(personality=personality) + self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired) + self.mpc.update(sm['modelV2'], sm['radarState'], personality=personality) + + self.v_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.v_solution) + self.a_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.a_solution) + self.j_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC[:-1], self.mpc.j_solution) + + # TODO counter is only needed because radar is glitchy, remove once radar is gone + self.fcw = self.mpc.crash_cnt > 2 and not sm['carState'].standstill + if self.fcw: + cloudlog.info("FCW triggered") + + # Save starting point for next iteration + a_prev = self.a_desired + + action_t = self.CP.longitudinalActuatorDelay + DT_MDL + output_a_target_mpc, output_should_stop_mpc = get_accel_from_plan(self.v_desired_trajectory, self.a_desired_trajectory, CONTROL_N_T_IDX, + action_t=action_t, stopping_speed=self.stopping_speed) + + output_a_target_e2e = sm['modelV2'].action.desiredAcceleration + output_should_stop_e2e = sm['modelV2'].action.shouldStop + output_a_target_e2e, output_should_stop_e2e = self.apply_e2e_stop_distance(sm, v_ego, output_a_target_e2e, output_should_stop_e2e) + if self.is_e2e(sm) and self.exp_speed_conv and not self.mpc.status: + output_a_target_e2e = get_e2e_accel(v_ego, v_cruise, model_v, output_a_target_e2e, output_should_stop_e2e) + + if sm['carState'].standstill: + self.launch_armed = True + elif v_ego > LAUNCH_DISARM_SPEED: + self.launch_armed = False + if (self.launch_armed and self.is_e2e(sm) and not output_should_stop_e2e and + np.interp(LAUNCH_COMMIT_T, T_IDXS_MPC, model_v) > LAUNCH_DISARM_SPEED): + t_cut = min(float(T_IDXS_MPC[np.argmax(model_v > LAUNCH_MOVING_SPEED)]), LAUNCH_COMMIT_T) + t_shifted = T_IDXS_MPC + t_cut + v_shifted = np.interp(t_shifted, T_IDXS_MPC, model_v) + a_shifted = np.interp(t_shifted, T_IDXS_MPC, model_a) + a_launch = get_accel_from_plan(v_shifted, a_shifted, T_IDXS_MPC, action_t=action_t)[0] + a_launch_max = np.interp(v_ego, [LAUNCH_MOVING_SPEED, LAUNCH_DISARM_SPEED], [LAUNCH_MAX_ACCEL, 0.]) + output_a_target_e2e = max(output_a_target_e2e, min(a_launch, a_launch_max)) + + e2e = self.is_e2e(sm) + self.a_cruise, cruise_should_stop = get_cruise_accel(e2e, v_cruise, v_ego, self.a_cruise, + steer_angle_without_offset, self.CP, self.dt, + accel_coast, self.allow_throttle) + + candidates = get_accel_candidates( + e2e, + self.mpc.status, + (output_a_target_mpc, self.mpc.source, output_should_stop_mpc), + (self.a_cruise, LongitudinalPlanSource.cruise, cruise_should_stop), + (output_a_target_e2e, LongitudinalPlanSource.e2e, output_should_stop_e2e), + ) + + output_a_target, self.mpc.source, _ = min(candidates, key=lambda c: c[0]) + self.output_should_stop = any(should_stop for _, _, should_stop in candidates) + + self.output_should_stop = self.output_should_stop or self.forcing_stop + self.output_a_target = np.clip(output_a_target, ACCEL_MIN, ACCEL_MAX) + + self.a_desired = float(self.output_a_target) + self.v_desired_filter.x = self.v_desired_filter.x + self.dt * (self.output_a_target + a_prev) / 2.0 + + def publish(self, sm, pm): + plan_send = messaging.new_message('longitudinalPlan') + + gate_services = ['carState', 'controlsState', 'selfdriveState', 'radarState'] + plan_send.valid = sm.all_checks(service_list=gate_services) + if not plan_send.valid: + log_issue_limited( + "longitudinal_plan_invalid", + "planner", + f"longitudinalPlan invalid alive={ {s: sm.alive[s] for s in gate_services} } " + f"freq_ok={ {s: sm.freq_ok[s] for s in gate_services} } valid={ {s: sm.valid[s] for s in gate_services} } " + f"subchecks=({sm.all_alive(gate_services)},{sm.all_freq_ok(gate_services)},{sm.all_valid(gate_services)}) " + f"recheck={sm.all_checks(service_list=gate_services)}", + interval_sec=5.0, + ) + + longitudinalPlan = plan_send.longitudinalPlan + longitudinalPlan.modelMonoTime = sm.logMonoTime['modelV2'] + longitudinalPlan.processingDelay = (plan_send.logMonoTime / 1e9) - sm.logMonoTime['modelV2'] + longitudinalPlan.solverExecutionTime = self.mpc.solve_time + + longitudinalPlan.speeds = self.v_desired_trajectory.tolist() + longitudinalPlan.accels = self.a_desired_trajectory.tolist() + longitudinalPlan.jerks = self.j_desired_trajectory.tolist() + + longitudinalPlan.hasLead = sm['radarState'].leadOne.status + longitudinalPlan.leadDistance = get_lead_distance(sm['radarState']) + longitudinalPlan.longitudinalPlanSource = self.mpc.source + longitudinalPlan.fcw = self.fcw + + longitudinalPlan.leadTrajectoryX0 = self.mpc.lead_xv_0[:, 0].tolist() + longitudinalPlan.leadTrajectoryV0 = self.mpc.lead_xv_0[:, 1].tolist() + longitudinalPlan.leadTrajectoryX1 = self.mpc.lead_xv_1[:, 0].tolist() + longitudinalPlan.leadTrajectoryV1 = self.mpc.lead_xv_1[:, 1].tolist() + + longitudinalPlan.aTarget = float(self.output_a_target) + longitudinalPlan.shouldStop = bool(self.output_should_stop) + longitudinalPlan.allowBrake = True + longitudinalPlan.allowThrottle = bool(self.allow_throttle) + + pm.send('longitudinalPlan', plan_send) + + self.publish_longitudinal_plan_iq(sm, pm) diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/__init__.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/__init__.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_locator.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_locator.py new file mode 100644 index 000000000..81448326c --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_locator.py @@ -0,0 +1,101 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Candidate-ladder selection checks for get_nn_model_path, driven by a synthetic +model directory so the assertions don't depend on which cars ship a model. +""" +import json +import os + +import pytest + +from iqdbc.car import structs +import iqpilot.selfdrive.controls.lib.latcontrol_torque as locator + + +def test_packaged_substitute_table(): + assert locator.TORQUE_NN_MODEL_SUBSTITUTE_PATH.is_file() + assert locator._substitute_for("MAZDA_3") == "MAZDA_CX9_2021" + assert locator._substitute_for("UNKNOWN") == "UNKNOWN" + + +@pytest.fixture +def model_dir(tmp_path, monkeypatch): + """A fake model directory with known fingerprints + a substitute table.""" + models = tmp_path / "models" + models.mkdir() + for stem in ("HONDA_CIVIC", "HONDA_CIVIC 12345", "TOYOTA_RAV4_TSS2", "MOCK"): + (models / f"{stem}.json").write_text("{}") + + sub = tmp_path / "substitute.toml" + sub.write_text('"CHEVROLET_XX" = "TOYOTA_RAV4_TSS2"\n') + + monkeypatch.setattr(locator, "TORQUE_NN_MODEL_PATH", str(models)) + monkeypatch.setattr(locator, "TORQUE_NN_MODEL_SUBSTITUTE_PATH", str(sub)) + monkeypatch.setattr(locator, "MOCK_MODEL_PATH", str(models / "MOCK.json")) + return models + + +def make_cp(fingerprint, eps_fw=b"", angle=False): + cp = structs.CarParams() + cp.carFingerprint = fingerprint + if eps_fw: + fw = structs.CarParams.CarFw() + fw.ecu = "eps" + fw.fwVersion = eps_fw + cp.carFw = [fw] + if angle: + cp.steerControlType = structs.CarParams.SteerControlType.angle + return cp + + +def test_exact_fingerprint_match(model_dir): + path, name, exact = locator.get_nn_model_path(make_cp("TOYOTA_RAV4_TSS2")) + assert name == "TOYOTA_RAV4_TSS2" + assert exact is True + + +def test_fingerprint_plus_eps_fw_prefers_specific_file(model_dir): + # eps fw steers selection toward the fw-specific file. Note the resolved match + # is fuzzy, not exact: fwVersion is bytes and the candidate stringifies it as + # b'12345', so it never scores a perfect 1.0 against the "... 12345" filename. + path, name, exact = locator.get_nn_model_path(make_cp("HONDA_CIVIC", eps_fw=b"12345")) + assert name == "HONDA_CIVIC 12345" + assert exact is False + + +def test_fuzzy_match_flags_non_exact(model_dir): + # close but not identical to a shipped fingerprint + path, name, exact = locator.get_nn_model_path(make_cp("TOYOTA_RAV4_TSS2_XYZ")) + assert name == "TOYOTA_RAV4_TSS2" + assert exact is False + + +def test_substitute_fallback(model_dir): + # unknown fingerprint that the substitute table redirects + path, name, exact = locator.get_nn_model_path(make_cp("CHEVROLET_XX")) + assert name == "TOYOTA_RAV4_TSS2" + assert exact is False + + +def test_angle_steer_is_always_mock(model_dir): + path, name, exact = locator.get_nn_model_path(make_cp("TOYOTA_RAV4_TSS2", angle=True)) + assert name == "MOCK" + assert path == locator.MOCK_MODEL_PATH + assert exact is False + + +def test_short_eps_fw_ignored(model_dir): + # a 3-char-or-less fw string is not used to build the candidate + path, name, _ = locator.get_nn_model_path(make_cp("HONDA_CIVIC", eps_fw=b"ab")) + assert name == "HONDA_CIVIC" + + +def test_missing_model_directory_falls_back(model_dir, tmp_path, monkeypatch): + missing = tmp_path / "missing" + monkeypatch.setattr(locator, "TORQUE_NN_MODEL_PATH", str(missing)) + monkeypatch.setattr(locator, "MOCK_MODEL_PATH", str(missing / "MOCK.json")) + path, name, exact = locator.get_nn_model_path(make_cp("HONDA_CIVIC")) + assert path == locator.MOCK_MODEL_PATH + assert name == "MOCK" + assert exact is False diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_network.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_network.py new file mode 100644 index 000000000..d09b64712 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_network.py @@ -0,0 +1,98 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Unit checks for the NNFF model loader against the shipped model files. +""" +import json +import os + +import numpy as np +import pytest + +from iqpilot.selfdrive.controls.lib.latcontrol_torque import NNTorqueModel +from iqpilot.selfdrive.controls.lib.latcontrol_torque import TORQUE_NN_MODEL_PATH + +# A minimal valid NNFF model (Twilsonco format: column-vector mean/std, dense_N_W/b +# layers). Used as a fallback so the loader logic is still exercised when no trained +# models are shipped (they are removed pending retraining and re-added over time). +_SYNTHETIC_MODEL = { + "input_size": 18, + "output_size": 1, + "input_mean": [[0.0]] * 18, + "input_std": [[1.0]] * 18, + "layers": [ + {"dense_1_W": [[0.5] * 18, [0.5] * 18], "dense_1_b": [[0.0], [0.0]], "activation": "sigmoid"}, + {"dense_2_W": [[2.0, 2.0]], "dense_2_b": [[-1.0]], "activation": "identity"}, + ], +} + +MODEL_FILES = sorted(f for f in os.listdir(TORQUE_NN_MODEL_PATH) if f.endswith(".json")) if os.path.isdir(TORQUE_NN_MODEL_PATH) else [] +if MODEL_FILES: + _MODEL_DIR = TORQUE_NN_MODEL_PATH + _NAMES = MODEL_FILES +else: + import tempfile + _MODEL_DIR = tempfile.mkdtemp(prefix="nnff_synthetic_") + with open(os.path.join(_MODEL_DIR, "SYNTHETIC.json"), "w") as _f: + json.dump(_SYNTHETIC_MODEL, _f) + _NAMES = ["SYNTHETIC.json"] + +SAMPLE = [f for f in ("HYUNDAI_IONIQ_5.json", "TOYOTA_RAV4_TSS2_2022.json", "MOCK.json") if f in _NAMES] \ + or _NAMES[:3] + + +def _path(name): + return os.path.join(_MODEL_DIR, name) + + +@pytest.mark.parametrize("name", _NAMES, ids=[n[:-5] for n in _NAMES]) +def test_every_model_loads_and_is_finite(name): + m = NNTorqueModel(_path(name)) + assert m.input_size >= 2 + assert m.output_size >= 1 + assert m.input_mean.shape == m.input_std.shape + out = m.evaluate([0.0] * m.input_size) + assert np.isfinite(out) + assert isinstance(m.friction_override, (bool, np.bool_)) + + +@pytest.mark.parametrize("name", SAMPLE, ids=[n[:-5] for n in SAMPLE]) +class TestModelBehavior: + def test_short_input_is_zero_padded(self, name): + m = NNTorqueModel(_path(name)) + padded = m.evaluate([5.0, 1.0]) + explicit = m.evaluate([5.0, 1.0] + [0.0] * (m.input_size - 2)) + assert padded == explicit + + def test_too_short_input_raises(self, name): + m = NNTorqueModel(_path(name)) + with pytest.raises(ValueError): + m.evaluate([1.0]) + + def test_zero_bias_matches_manual_bias_removal(self, name): + m = NNTorqueModel(_path(name)) + mz = NNTorqueModel(_path(name), zero_bias=True) + assert all(np.allclose(b, 0.0) for b in mz._biases) + # weights and activations are unchanged + assert len(mz._weights) == len(m._weights) + + def test_deterministic(self, name): + m = NNTorqueModel(_path(name)) + vec = [float(v) for v in np.linspace(-1.5, 1.5, m.input_size)] + assert m.evaluate(vec) == m.evaluate(list(vec)) + + +def test_activation_registry_rejects_unknown(tmp_path): + with open(_path(SAMPLE[0])) as model_file: + base = json.load(model_file) + base["layers"][-1]["activation"] = "not_a_real_activation" + bad = tmp_path / "bad.json" + bad.write_text(json.dumps(base)) + with pytest.raises(ValueError): + NNTorqueModel(str(bad)) + + +def test_sigmoid_identity_helpers(): + assert NNTorqueModel.identity(3.5) == 3.5 + assert 0.0 < float(NNTorqueModel.sigmoid(np.array([0.0]))[0]) < 1.0 + assert abs(float(NNTorqueModel.sigmoid(np.array([0.0]))[0]) - 0.5) < 1e-6 diff --git a/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_nnff_assembly.py b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_nnff_assembly.py new file mode 100644 index 000000000..fa2f94031 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/neural_network_feed_forward/tests/test_nnff_assembly.py @@ -0,0 +1,103 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Off-device checks for the NNFF controller wiring and the nav torque pulse, +built on lightweight fakes so they run without a car interface. +""" +import os +from types import SimpleNamespace + +import numpy as np +import pytest + +from iqpilot.cereal import log +from iqpilot.common.params import Params +from iqpilot.common.pid import PIDController +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.controls.lib.latcontrol_torque import NeuralNetworkFeedForward +from iqpilot.selfdrive.controls.lib.neural_network_feed_forward.tests.test_network import _MODEL_DIR, _NAMES + +_REAL_MODEL = next((f for f in _NAMES if f != "MOCK.json"), _NAMES[0]) + + +def _torque_fn(): + def fn(inputs, tp, gravity_adjusted=False): + base = inputs.lateral_acceleration - (inputs.roll_compensation if gravity_adjusted else 0.0) + return base * 0.4 + return fn + + +class FakeCI: + def torque_from_lateral_accel_in_torque_space(self): + return _torque_fn() + + +class FakeVM: + @staticmethod + def calc_curvature(angle, v, roll): + return angle / (max(v, 1.0) ** 2 * 0.05 + 2.0) + + +def _model_v2(): + t = np.array(ModelConstants.T_IDXS) + return SimpleNamespace( + orientation=SimpleNamespace(x=(0.02 * np.sin(t)).tolist(), y=(0.01 * np.cos(t)).tolist()), + acceleration=SimpleNamespace(y=(0.8 * np.sin(2.0 * t)).tolist())) + + +def _make_controller(model_file): + Params().put_bool("NeuralNetworkFeedForward", True) + path = os.path.join(_MODEL_DIR, model_file) + cp = SimpleNamespace(steerActuatorDelay=0.15) + cp_iq = SimpleNamespace(iqLateralNet=SimpleNamespace( + model=SimpleNamespace(path=path, name=os.path.splitext(model_file)[0]))) + lac = SimpleNamespace(steer_max=1.0, torque_params=SimpleNamespace( + latAccelFactor=2.5, latAccelOffset=0.0, friction=0.1, steeringAngleDeadzoneDeg=0.0)) + return NeuralNetworkFeedForward(lac, cp, cp_iq, FakeCI()) + + +def _drive_once(nnff, step=1, pressed=False): + nnff.update_model_v2(_model_v2()) + v = 20.0 + dla = 1.0 + cs = SimpleNamespace(vEgo=v, aEgo=0.2, steeringPressed=pressed, steeringRateDeg=1.0) + cal = SimpleNamespace(roll=0.02) + pose = SimpleNamespace(orientation=SimpleNamespace(pitch=0.01)) + pid = PIDController([[1, 30], [10.0, 0.8]], 0.15, rate=100) + pid.set_limits(1.0, -1.0) + pt = log.ControlsState.LateralTorqueState.new_message() + return nnff.update(cs, FakeVM(), pid, cal, dla, pt, dla, 0.8 * dla, pose, 0.02 * 9.81, + dla, 0.8 * dla, 0.01, dla - 0.02 * 9.81, dla / v ** 2, 0.8 * dla / v ** 2, False, 0.3) + + +class TestControllerWiring: + def test_real_model_reports_present(self): + nnff = _make_controller(_REAL_MODEL) + assert nnff.has_nn_model is True + + def test_mock_model_reports_absent(self): + nnff = _make_controller("MOCK.json") + assert nnff.has_nn_model is False + if "MOCK.json" in _NAMES: + assert nnff.model.input_size >= 2 + else: + assert nnff.model is None + + def test_update_returns_finite_torque(self): + nnff = _make_controller(_REAL_MODEL) + pid_log, torque = _drive_once(nnff) + assert np.isfinite(torque) + assert np.isfinite(pid_log.error) + + def test_lag_update_refreshes_future_times(self): + nnff = _make_controller(_REAL_MODEL) + before = list(nnff.nn_future_times) + nnff.update_lateral_lag(0.5) + after = list(nnff.nn_future_times) + assert after != before + assert all(a == pytest.approx(f + nnff.desired_lat_jerk_time) for a, f in zip(after, nnff.future_times, strict=True)) + + def test_disabled_when_model_invalid(self): + nnff = _make_controller(_REAL_MODEL) + nnff.model_valid = False + assert nnff._nnff_enabled is False diff --git a/iqpilot/selfdrive/controls/lib/slc_vcruise.py b/iqpilot/selfdrive/controls/lib/slc_vcruise.py new file mode 100644 index 000000000..7482f6237 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/slc_vcruise.py @@ -0,0 +1,253 @@ +#!/usr/bin/env python3 +import time + +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.k3_slc_log import k3_slc_log +from iqpilot.selfdrive.controls.lib.speed_limit_controller import SpeedLimitController + +CRUISING_SPEED = 7 + + +class SLCVCruise: + + def __init__(self): + self.params = Params() + + self.slc = SpeedLimitController(self.params) + self._last_debug_log_t = 0.0 + self._last_debug_signature = None + + # Exposed SLC state (for UI/logging) + self.controller_enabled = False + self.mode_assist = False + self.slc_offset = 0 + self.slc_target = 0 + self.slc_source = "None" + self.slc_unconfirmed = 0 + self.slc_overridden_speed = 0 + self.slc_active_target = 0 + self.slc_active_source = "None" + self._user_max_speed = 0.0 + self.slc_experimental_mode = False + self.pending_events = [] + + @property + def assist_state(self): + return getattr(self.slc, 'assist_state', None) + + @property + def slc_a_target(self): + return float(getattr(self.slc, 'output_a_target', 0.0)) + + def _maybe_log_debug(self, slc_params, apply_enabled, v_cruise, v_ego, dashboard_speed_limit, applied_target, returned_v_cruise): + map_speed_limit = float(getattr(self.slc, "map_speed_limit", 0.0) or 0.0) + mapbox_limit = float(getattr(self.slc, "mapbox_limit", 0.0) or 0.0) + next_speed_limit = float(getattr(self.slc, "next_speed_limit", 0.0) or 0.0) + gps_valid = bool(getattr(self.slc, "gps_valid", False)) + signature = ( + bool(slc_params["speed_limit_controller"]), + bool(slc_params["show_speed_limits"]), + self.slc.target, + self.slc.source, + self.slc.active_target, + self.slc.active_source, + map_speed_limit, + mapbox_limit, + next_speed_limit, + self.slc.overridden_speed, + bool(apply_enabled), + float(applied_target), + float(returned_v_cruise), + ) + now_mono = time.monotonic() + if signature == self._last_debug_signature and now_mono - self._last_debug_log_t < 5.0: + return + + self._last_debug_signature = signature + self._last_debug_log_t = now_mono + + message = ( + "SLC debug: " + f"mode={int(self.params.get('IQSpeedAssistMode', return_default=True))} " + f"controller={slc_params['speed_limit_controller']} " + f"show={slc_params['show_speed_limits']} " + f"apply_enabled={bool(apply_enabled)} " + f"dashboard={round(float(dashboard_speed_limit), 2)} " + f"map_data={round(map_speed_limit, 2)} " + f"mapbox={round(mapbox_limit, 2)} " + f"next_map={round(next_speed_limit, 2)} " + f"selected_source={self.slc.source} " + f"selected_target={round(float(self.slc.target), 2)} " + f"active_source={self.slc.active_source} " + f"active_target={round(float(self.slc.active_target), 2)} " + f"offset={round(float(self.slc_offset), 2)} " + f"override={round(float(self.slc.overridden_speed), 2)} " + f"gps_valid={gps_valid} " + f"applied_target={round(float(applied_target), 2)} " + f"returned_v_cruise={round(float(returned_v_cruise), 2)} " + f"v_cruise={round(float(v_cruise), 2)} " + f"v_ego={round(float(v_ego), 2)}" + ) + cloudlog.info(message) + k3_slc_log(message) + + def _get_slc_params(self): + """ + Load SLC parameters from Params. + + Returns: + Dictionary of SLC configuration parameters + """ + def get_param_bool(key, default=False): + value = self.params.get_bool(key) + return value if value is not None else default + + def get_param_float(key, default=0.0): + value = self.params.get(key) + if value is None: + return default + if isinstance(value, bytes): + try: + return float(value.decode('utf-8')) + except (ValueError, AttributeError): + return default + return float(value) + + def get_param_str(key, default=""): + value = self.params.get(key) + if value is None: + return default + if isinstance(value, bytes): + return value.decode('utf-8') + return str(value) + + slc_policy = int(get_param_str("SLCPolicy", "1")) + + override_method = int(get_param_str("SLCOverrideMethod", "0")) + override_manual = (override_method == 0) + override_set_speed = (override_method == 1) + + speed_limit_mode = int(get_param_str("IQSpeedAssistMode", "1")) # default: SpeedLimitMode.information + speed_limit_controller = get_param_bool("SpeedLimitController") + show_speed_limits = get_param_bool("ShowSpeedLimits") + + if speed_limit_mode == 0: # SpeedLimitMode.off + speed_limit_controller = False + show_speed_limits = False + elif speed_limit_mode == 3: # SpeedLimitMode.control + speed_limit_controller = True + show_speed_limits = False + else: + speed_limit_controller = False + show_speed_limits = True + + return { + "speed_limit_controller": speed_limit_controller, + "speed_limit_mode": speed_limit_mode, + "show_speed_limits": show_speed_limits, + "slc_policy": slc_policy, + "slc_auto_confirm": get_param_bool("SLCAutoConfirm"), + "speed_limit_confirmation_higher": get_param_bool("SpeedLimitConfirmationHigher"), + "speed_limit_confirmation_lower": get_param_bool("SpeedLimitConfirmationLower"), + "map_speed_lookahead_higher": get_param_float("MapSpeedLookaheadHigher", 5.0), + "map_speed_lookahead_lower": get_param_float("MapSpeedLookaheadLower", 5.0), + "slc_fallback_experimental_mode": get_param_bool("SLCFallbackExperimentalMode"), + "slc_fallback_set_speed": get_param_bool("SLCFallbackSetSpeed"), + "slc_fallback_previous_speed_limit": get_param_bool("SLCFallbackPreviousSpeedLimit"), + "speed_limit_controller_override_manual": override_manual, + "speed_limit_controller_override_set_speed": override_set_speed, + "slc_online_filler": get_param_bool("SLCOnlineFiller"), + "is_metric": get_param_bool("IsMetric"), + "construction_zone_assist": get_param_bool("ConstructionZoneAssist"), + "construction_zone_speed": get_param_float("ConstructionZoneSpeed", 60.0), + } + + @staticmethod + def _allow_auto_raise(slc_params): + # Reuse the existing "confirm higher" toggle as the gate: + # disabled confirm => allow SLC to raise cruise to a higher accepted limit. + return not slc_params["speed_limit_confirmation_higher"] + + def update(self, apply_enabled, now, time_validated, v_cruise, v_ego, sm): + slc_params = self._get_slc_params() + self.controller_enabled = bool(slc_params["speed_limit_controller"]) + self.mode_assist = int(slc_params["speed_limit_mode"]) == 3 # SpeedLimitMode.control + is_metric = slc_params["is_metric"] + v_cruise_cluster = max(sm["carState"].vCruiseCluster * CV.KPH_TO_MS, v_cruise) + v_cruise_diff = v_cruise_cluster - v_cruise + + v_ego_cluster = max(sm["carState"].vEgoCluster, v_ego) + v_ego_diff = v_ego_cluster - v_ego + car_state_iq = sm["iqCarState"] + dashboard_speed_limit = car_state_iq.speedLimit if hasattr(car_state_iq, "speedLimit") else 0 + if apply_enabled: + if self._user_max_speed <= 0.0: + self._user_max_speed = v_cruise_cluster + elif v_cruise_cluster > self._user_max_speed: + self._user_max_speed = v_cruise_cluster + else: + self._user_max_speed = 0.0 + if not slc_params["speed_limit_controller"]: + self.slc.reset_override(sm) + if slc_params["speed_limit_controller"]: + self.slc.update_limits(dashboard_speed_limit, now, time_validated, v_cruise, v_ego, sm, slc_params) + self.pending_events = list(getattr(self.slc, 'pending_events', [])) + self.slc.update_override(v_cruise, v_cruise_diff, v_ego, v_ego_diff, sm, slc_params, is_metric) + + self.slc_offset = 0 if self.slc.source == "Construction" else self.slc.get_offset(is_metric) + self.slc_target = self.slc.target + self.slc_source = self.slc.source + self.slc_active_target = self.slc.active_target + self.slc_active_source = self.slc.active_source + self.slc_unconfirmed = self.slc.unconfirmed_speed_limit + self.slc_overridden_speed = self.slc.overridden_speed + + elif slc_params["show_speed_limits"]: + self.slc.update_limits(dashboard_speed_limit, now, time_validated, v_cruise, v_ego, sm, slc_params) + self.pending_events = [] + + self.slc_offset = 0 + self.slc_target = self.slc.target + self.slc_source = self.slc.source + self.slc_active_target = self.slc.active_target + self.slc_active_source = self.slc.active_source + self.slc_unconfirmed = self.slc.unconfirmed_speed_limit + self.slc_overridden_speed = 0 + + else: + self.pending_events = [] + self.slc_offset = 0 + self.slc_target = 0 + self.slc_source = "None" + self.slc_active_target = 0 + self.slc_active_source = "None" + self.slc_unconfirmed = 0 + self.slc_overridden_speed = 0 + + self.slc_experimental_mode = bool( + slc_params["speed_limit_controller"] and + slc_params["slc_fallback_experimental_mode"] and + self.slc_target <= 0 + ) + + applied_target = 0.0 + + if slc_params["speed_limit_controller"] and apply_enabled: + slc_target_with_offset = max(self.slc_overridden_speed, self.slc_target + self.slc_offset) + allow_auto_raise = self._allow_auto_raise(slc_params) + if self._user_max_speed > 0.0 and not allow_auto_raise: + slc_target_with_offset = min(slc_target_with_offset, self._user_max_speed) + slc_cruise_target = slc_target_with_offset - v_ego_diff + + if slc_cruise_target >= CRUISING_SPEED: + applied_target = slc_cruise_target + if allow_auto_raise and self.slc_source != "Construction": + v_cruise = slc_cruise_target + else: + v_cruise = min(v_cruise, slc_cruise_target) + + self._maybe_log_debug(slc_params, apply_enabled, v_cruise, v_ego, dashboard_speed_limit, applied_target, v_cruise) + + return v_cruise diff --git a/iqpilot/selfdrive/controls/lib/smooth_stops.py b/iqpilot/selfdrive/controls/lib/smooth_stops.py new file mode 100644 index 000000000..d1e1ef44f --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/smooth_stops.py @@ -0,0 +1,73 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Original concept and implementation by SpysyWeeb (github.com/SpysyWeeb) +""" +from iqdbc.car.interfaces import ACCEL_MIN +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_CTRL + +STANDSTILL_SPEED = 0.05 +STANDSTILL_HOLD_SPEED = 0.15 +SETTLE_DECEL = 0.80 +TAPER_SPEED = 1.0 +STOP_KISS_DECEL = 0.25 +STOP_GAP_MARGIN = 3.0 +MIN_GAP_BUDGET = 0.5 +PROGRESS_EPS = 0.02 +ANTI_CREEP_RATE = 0.50 +SETTLE_JERK = 2.5 +EMERGENCY_DECEL = 3.0 + + +def read_smooth_stops_enabled(params: Params) -> bool: + return params.get_bool("IQForceStops") + + +class SmoothStopController: + def __init__(self): + self.params = Params() + self.frame = 0 + self.enabled = False + self._v_min = float("inf") + self._stall_s = 0.0 + self.read_params() + + def read_params(self) -> None: + self.enabled = read_smooth_stops_enabled(self.params) + + def update(self) -> None: + if self.frame % int(3 / DT_CTRL) == 0: + self.read_params() + self.frame += 1 + + def reset(self) -> None: + self._v_min = float("inf") + self._stall_s = 0.0 + + def want_hold(self, should_stop: bool, v_ego: float, standstill: bool) -> bool: + return bool(should_stop and (v_ego <= STANDSTILL_SPEED or (standstill and v_ego <= STANDSTILL_HOLD_SPEED))) + + def settle(self, a_target: float, v_ego: float, lead_distance: float, has_lead: bool, last_output: float) -> float: + landing = STOP_KISS_DECEL + (SETTLE_DECEL - STOP_KISS_DECEL) * min(v_ego / TAPER_SPEED, 1.0) + a_settle = -landing + + if has_lead and lead_distance > 0.0: + gap = max(lead_distance - STOP_GAP_MARGIN, MIN_GAP_BUDGET) + a_settle = min(a_settle, -(v_ego * v_ego) / (2.0 * gap)) + + if v_ego < self._v_min - PROGRESS_EPS: + self._v_min = v_ego + self._stall_s = 0.0 + else: + self._stall_s += DT_CTRL + a_settle -= ANTI_CREEP_RATE * self._stall_s + + a_settle = max(a_settle, ACCEL_MIN) + target = min(a_settle, a_target) + + if target <= -EMERGENCY_DECEL: + return target + + step = SETTLE_JERK * DT_CTRL + return min(max(target, last_output - step), last_output + step) diff --git a/iqpilot/selfdrive/controls/lib/speed_limit_controller.py b/iqpilot/selfdrive/controls/lib/speed_limit_controller.py new file mode 100644 index 000000000..7f9251c6b --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/speed_limit_controller.py @@ -0,0 +1,872 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import calendar +import json +import math +import time +from concurrent.futures import ThreadPoolExecutor + +import numpy as np + +from iqpilot.cereal import car, custom +from iqpilot.common.constants import CV +from iqpilot.common.realtime import DT_MDL +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.k3_slc_log import k3_slc_log +from iqpilot.common.slc_utilities import calculate_bearing_offset, is_url_pingable +from iqpilot.common.slc_variables import FREE_MAPBOX_REQUESTS, OFFSET_MAP_IMPERIAL, OFFSET_MAP_METRIC, OFFSET_PERCENT_MAX + +try: + import requests +except ImportError: + requests = None + +ButtonType = car.CarState.ButtonEvent.Type +SpeedLimitAssistState = custom.IQPlan.SpeedLimit.AssistState +EventNameIQ = custom.IQOnroadEvent.EventName + +LIMIT_MIN_ACC = -1.5 +LIMIT_MAX_ACC = 1.0 +LIMIT_MIN_SPEED = 8.33 +LIMIT_SPEED_OFFSET_TH = -1.0 +LIMIT_ADAPT_ACC = -1.0 +CONTROL_HORIZON = 10.0 + +AUTO_CONFIRM_PERIOD = 5.0 +AUTO_DENY_PERIOD = 30.0 + +POLICY_MAP_DATA_ONLY = 0 +POLICY_MAP_DATA_PRIORITY = 1 +POLICY_COMBINED = 2 + +CONFIRM_LOWER_BUTTONS = frozenset({ButtonType.decelCruise, ButtonType.setCruise}) +CONFIRM_HIGHER_BUTTONS = frozenset({ButtonType.accelCruise, ButtonType.resumeCruise}) + + +class IQSpeedLimitResolver: + def __init__(self): + self.map_speed_limit = 0.0 + self.next_speed_limit = 0.0 + self.next_speed_distance = 0.0 + + @staticmethod + def _is_alive(sm, key): + if hasattr(sm, "alive"): + return bool(sm.alive.get(key, False)) + return False + + def update_map_data(self, v_ego, sm, lookahead_lower, lookahead_higher): + if not self._is_alive(sm, "iqLiveData"): + self.map_speed_limit = 0.0 + self.next_speed_limit = 0.0 + self.next_speed_distance = 0.0 + return + + map_data = sm["iqLiveData"] + current_limit = float(getattr(map_data, "speedLimit", 0)) if getattr(map_data, "speedLimitValid", False) else 0.0 + ahead_limit = float(getattr(map_data, "speedLimitAhead", 0)) if getattr(map_data, "speedLimitAheadValid", False) else 0.0 + ahead_distance = float(getattr(map_data, "speedLimitAheadDistance", 0)) + + self.next_speed_limit = ahead_limit + self.next_speed_distance = ahead_distance + + if ahead_limit > 0 and ahead_distance > 0: + if ahead_limit < v_ego: + adapt_time = (ahead_limit - v_ego) / LIMIT_ADAPT_ACC # positive (LIMIT_ADAPT_ACC negative) + adapt_distance = v_ego * adapt_time + 0.5 * LIMIT_ADAPT_ACC * adapt_time**2 + comfort_distance = lookahead_lower * v_ego + if ahead_distance <= max(adapt_distance, comfort_distance): + self.map_speed_limit = ahead_limit + return + elif ahead_limit > current_limit: + if ahead_distance <= lookahead_higher * v_ego: + self.map_speed_limit = ahead_limit + return + + self.map_speed_limit = current_limit + + def resolve(self, dashboard_limit, mapbox_limit, slc_params): + policy = slc_params.get("slc_policy", POLICY_MAP_DATA_PRIORITY) + + sources = {} + if dashboard_limit >= LIMIT_MIN_SPEED: + sources["Dashboard"] = dashboard_limit + if mapbox_limit >= LIMIT_MIN_SPEED: + sources["Mapbox"] = mapbox_limit + if self.map_speed_limit >= LIMIT_MIN_SPEED: + sources["Map Data"] = self.map_speed_limit + + if policy == POLICY_MAP_DATA_ONLY: + if "Map Data" in sources: + return sources["Map Data"], "Map Data" + return 0.0, "None" + + if policy == POLICY_MAP_DATA_PRIORITY: + for src in ("Map Data", "Dashboard", "Mapbox"): + if src in sources: + return sources[src], src + return 0.0, "None" + + if policy == POLICY_COMBINED: + if sources: + src = min(sources, key=sources.get) + return sources[src], src + return 0.0, "None" + + return 0.0, "None" + + +class IQSpeedLimitAssist: + def __init__(self, params): + self._params = params + self._state = SpeedLimitAssistState.inactive + self._prev_state = SpeedLimitAssistState.inactive + + self.target = 0.0 + self.source = "None" + + self.unconfirmed_limit = 0.0 + self.unconfirmed_source = "None" + + self.previous_target = 0.0 + self.previous_source = "None" + self.denied_target = 0.0 + + self._pre_active_timer = 0.0 + + self.pending_events = [] + + self.output_a_target = 0.0 + + self.just_confirmed = False + + @property + def state(self): + return self._state + + def update(self, enabled, v_ego, resolved_limit, resolved_source, slc_params, sm): + self.pending_events = [] + self.just_confirmed = False + self._prev_state = self._state + + if not enabled: + if self._state != SpeedLimitAssistState.disabled: + self._state = SpeedLimitAssistState.disabled + self._reset_confirmed() + self._reset_unconfirmed() + self.output_a_target = 0.0 + self._fire_transition_events() + return + + if self._state == SpeedLimitAssistState.disabled: + self._state = SpeedLimitAssistState.inactive + + has_limit = resolved_limit >= LIMIT_MIN_SPEED + v_offset = self.target - v_ego if self.target > 0 else 0.0 + + if self._state == SpeedLimitAssistState.inactive: + if has_limit: + if self._needs_confirmation(resolved_limit, slc_params): + self._enter_pre_active(resolved_limit, resolved_source) + else: + self._apply_limit(resolved_limit, resolved_source, v_ego, fire_changed_event=True) + + elif self._state == SpeedLimitAssistState.preActive: + self._pre_active_timer += DT_MDL + confirmed, denied = self._check_confirmation(sm, slc_params) + + if denied: + self.denied_target = self.unconfirmed_limit + self.previous_source = self.unconfirmed_source + self.previous_target = self.unconfirmed_limit + self._reset_unconfirmed() + self._state = SpeedLimitAssistState.inactive + elif confirmed: + self._confirm(v_ego) + elif not has_limit: + self._reset_unconfirmed() + self._state = SpeedLimitAssistState.inactive + + elif self._state in (SpeedLimitAssistState.active, SpeedLimitAssistState.adapting): + if not has_limit: + if self.target > 0: + self.previous_target = self.target + self.previous_source = self.source + self._reset_confirmed() + self._state = SpeedLimitAssistState.inactive + elif abs(resolved_limit - self.target) >= 1.0: + if self._needs_confirmation(resolved_limit, slc_params): + self._enter_pre_active(resolved_limit, resolved_source) + else: + self._apply_limit(resolved_limit, resolved_source, v_ego, fire_changed_event=True) + elif self._state == SpeedLimitAssistState.adapting: + if v_offset >= LIMIT_SPEED_OFFSET_TH: + self._state = SpeedLimitAssistState.active + elif self._state == SpeedLimitAssistState.active: + if v_offset < LIMIT_SPEED_OFFSET_TH: + self._state = SpeedLimitAssistState.adapting + + self._update_a_target(v_ego) + self._fire_transition_events() + + def _enter_pre_active(self, limit, source): + self.unconfirmed_limit = limit + self.unconfirmed_source = source + self._state = SpeedLimitAssistState.preActive + self._pre_active_timer = 0.0 + + def _confirm(self, v_ego): + self.target = self.unconfirmed_limit + self.source = self.unconfirmed_source + self.previous_target = self.target + self.previous_source = self.source + self.denied_target = 0.0 + self._reset_unconfirmed() + self._params.put_nonblocking("PreviousSpeedLimit", float(self.target)) + self.just_confirmed = True + v_offset = self.target - v_ego + self._state = SpeedLimitAssistState.adapting if v_offset < LIMIT_SPEED_OFFSET_TH else SpeedLimitAssistState.active + + def _apply_limit(self, limit, source, v_ego, fire_changed_event=False): + self.target = limit + self.source = source + self.previous_target = self.target + self.previous_source = self.source + self._params.put_nonblocking("PreviousSpeedLimit", float(self.target)) + if fire_changed_event: + self.pending_events.append(EventNameIQ.speedLimitChanged) + v_offset = self.target - v_ego + self._state = SpeedLimitAssistState.adapting if v_offset < LIMIT_SPEED_OFFSET_TH else SpeedLimitAssistState.active + + def _needs_confirmation(self, new_limit, slc_params): + if new_limit < self.target: + return slc_params.get("speed_limit_confirmation_lower", False) + return slc_params.get("speed_limit_confirmation_higher", False) + + def _check_confirmation(self, sm, slc_params): + confirmed = False + denied = False + + if slc_params.get("slc_auto_confirm", False) and self._pre_active_timer >= AUTO_CONFIRM_PERIOD: + return True, False + + if self._pre_active_timer >= AUTO_DENY_PERIOD: + return False, True + + is_lower = (self.target <= 0) or (self.unconfirmed_limit <= self.target) + try: + for btn in sm["carState"].buttonEvents: + if btn.pressed: + continue + button_type = getattr(btn.type, "raw", btn.type) + if is_lower and button_type in CONFIRM_LOWER_BUTTONS: + confirmed = True + break + elif not is_lower and button_type in CONFIRM_HIGHER_BUTTONS: + confirmed = True + break + except (AttributeError, TypeError): + pass + + return confirmed, denied + + def _update_a_target(self, v_ego): + if self._state in (SpeedLimitAssistState.adapting, SpeedLimitAssistState.active) and self.target > 0: + v_offset = self.target - v_ego + self.output_a_target = float(np.clip(v_offset / CONTROL_HORIZON, LIMIT_MIN_ACC, LIMIT_MAX_ACC)) + else: + self.output_a_target = 0.0 + + def _fire_transition_events(self): + prev = self._prev_state + curr = self._state + if prev == curr: + return + if curr == SpeedLimitAssistState.preActive: + self.pending_events.append(EventNameIQ.speedLimitPreActive) + elif curr in (SpeedLimitAssistState.adapting, SpeedLimitAssistState.active): + if prev not in (SpeedLimitAssistState.adapting, SpeedLimitAssistState.active): + self.pending_events.append(EventNameIQ.speedLimitActive) + + def _reset_confirmed(self): + self.target = 0.0 + self.source = "None" + + def _reset_unconfirmed(self): + self.unconfirmed_limit = 0.0 + self.unconfirmed_source = "None" + + +class SpeedLimitController: + def __init__(self, params): + self.params = params + self._resolver = IQSpeedLimitResolver() + self._assist = IQSpeedLimitAssist(params) + + self.calling_mapbox = False + self.mapbox_limit = 0.0 + self.segment_distance = 0.0 + + self.gps_valid = False + self.gps_position = {"bearing": 0, "latitude": 0, "longitude": 0} + + self.override_slc = False + self.overridden_speed = 0.0 + self._last_override_request_id = 0 + self._blocked_override_gesture = 0 + self._override_limit = None + self._override_set_speed = False + + self._resolved_limit = 0.0 + self._resolved_source = "None" + self._czone_was_limiting = False + + self.pending_events = [] + + mapbox_requests_raw = self.params.get("MapBoxRequests") + if isinstance(mapbox_requests_raw, dict): + self.mapbox_requests = mapbox_requests_raw + elif mapbox_requests_raw is not None: + try: + raw = mapbox_requests_raw + if isinstance(raw, bytes): + self.mapbox_requests = json.loads(raw.decode("utf-8")) + elif isinstance(raw, str): + self.mapbox_requests = json.loads(raw) + else: + self.mapbox_requests = {} + except (json.JSONDecodeError, AttributeError, TypeError): + self.mapbox_requests = {} + else: + self.mapbox_requests = {} + self.mapbox_requests.setdefault("total_requests", 0) + self.mapbox_requests.setdefault("max_requests", FREE_MAPBOX_REQUESTS - (28 * 100)) + + self.mapbox_host = "https://api.mapbox.com" + self.mapbox_token = self.params.get("MapboxToken") + if self.mapbox_token is not None and isinstance(self.mapbox_token, bytes): + self.mapbox_token = self.mapbox_token.decode("utf-8") + + previous_limit = self.params.get("PreviousSpeedLimit") + if previous_limit is not None: + try: + val = previous_limit + self._assist.previous_target = float(val.decode("utf-8") if isinstance(val, bytes) else val) + except (ValueError, AttributeError): + pass + + self.executor = ThreadPoolExecutor(max_workers=1) + self._offset_cache = {} + self._offset_cache_t = 0.0 + self._last_mapbox_log_t = 0.0 + self._last_mapbox_diag_t = 0.0 + self._last_mapbox_diag_message = None + + self.session = requests.Session() if requests is not None else None + if self.session is not None: + self.session.headers.update({"Accept-Language": "en"}) + self.session.headers.update({"User-Agent": "iqpilot-mapbox-speed-limit-retriever/1.0"}) + + self.tomtom_host = "https://api.tomtom.com" + self.tomtom_token = self._resolve_tomtom_token() + self.tomtom_limit = 0.0 + self.tomtom_segment_distance = 0.0 + self.calling_tomtom = False + self.tomtom_consecutive_failures = 0 + self.tomtom_backoff_until = 0.0 + + def _resolve_tomtom_token(self) -> str: + try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + runtime_common = import_verified_module("iqpilot_navd_private", "iqpilot_private.navd.runtime_common") + return runtime_common.resolve_tomtom_token(self.params) or "" + except Exception: + tok = self.params.get("TomTomToken") + return (tok.decode("utf-8") if isinstance(tok, bytes) else (tok or "")).strip() + + @property + def target(self): + return self._assist.target + + @property + def source(self): + return self._assist.source + + @property + def active_target(self): + return self._resolved_limit + + @property + def active_source(self): + return self._resolved_source + + @property + def unconfirmed_speed_limit(self): + return self._assist.unconfirmed_limit + + @property + def map_speed_limit(self): + return self._resolver.map_speed_limit + + @property + def next_speed_limit(self): + return self._resolver.next_speed_limit + + @property + def assist_state(self): + return self._assist.state + + @property + def output_a_target(self): + return self._assist.output_a_target + + def get_offset(self, is_metric): + target = self._assist.target + # offsets only apply to real limit sources: fallback set-speed publishes "None", + # construction clamps must never be inflated + if target <= 0 or self._assist.source in ("None", "Construction"): + return 0.0 + offset_map = OFFSET_MAP_METRIC if is_metric else OFFSET_MAP_IMPERIAL + for low, high, offset_param in offset_map: + if low <= target < high: + percent = float(np.clip(self._get_offset_percent(offset_param), -OFFSET_PERCENT_MAX, OFFSET_PERCENT_MAX)) + return target * percent / 100.0 + return 0.0 + + def _get_offset_percent(self, offset_param): + now_mono = time.monotonic() + if now_mono - self._offset_cache_t >= 5.0: + self._offset_cache.clear() + self._offset_cache_t = now_mono + if offset_param not in self._offset_cache: + offset_value = self.params.get(offset_param) + try: + if isinstance(offset_value, bytes): + offset_value = offset_value.decode("utf-8") + self._offset_cache[offset_param] = float(offset_value) if offset_value is not None else 0.0 + except (ValueError, TypeError): + self._offset_cache[offset_param] = 0.0 + return self._offset_cache[offset_param] + + @staticmethod + def _is_alive(sm, key): + if hasattr(sm, "alive"): + return bool(sm.alive.get(key, False)) + return False + + def update_gps(self, sm): + iq_loc_valid = False + iq_loc = None + if self._is_alive(sm, "iqLiveLocation"): + iq_loc = sm["iqLiveLocation"] + iq_loc_valid = bool(getattr(iq_loc, "gpsHealthy", False)) + + if self._is_alive(sm, "gpsLocationExternal"): + gps_location = sm["gpsLocationExternal"] + elif self._is_alive(sm, "gpsLocation"): + gps_location = sm["gpsLocation"] + else: + gps_location = None + + gps_has_fix = False + if gps_location is not None: + gps_has_fix = bool(getattr(gps_location, "hasFix", False)) + gps_has_fix |= bool(getattr(gps_location, "flags", 0) > 0) + + if gps_location and (gps_has_fix or iq_loc_valid): + self.gps_valid = True + self.gps_position = { + "bearing": getattr(gps_location, "bearingDeg", 0), + "latitude": getattr(gps_location, "latitude", 0), + "longitude": getattr(gps_location, "longitude", 0), + } + elif iq_loc_valid and iq_loc is not None and getattr(iq_loc, "geodeticPosition", None) and iq_loc.geodeticPosition.isValid: + self.gps_valid = True + self.gps_position = { + "bearing": math.degrees(iq_loc.alignedOrientationNed.values[2]) if getattr(iq_loc, "alignedOrientationNed", None) else 0, + "latitude": iq_loc.geodeticPosition.values[0], + "longitude": iq_loc.geodeticPosition.values[1], + } + else: + self.gps_valid = False + + def _log_mapbox_diag(self, message, force=False): + now_mono = time.monotonic() + if not force and message == self._last_mapbox_diag_message and now_mono - self._last_mapbox_diag_t < 5.0: + return + if not force and now_mono - self._last_mapbox_diag_t < 2.0: + return + self._last_mapbox_diag_t = now_mono + self._last_mapbox_diag_message = message + cloudlog.info(message) + k3_slc_log(message) + + def get_mapbox_speed_limit(self, now, time_validated, v_ego, sm): + if requests is None or self.session is None: + self._log_mapbox_diag("SLC Mapbox skipped: requests session unavailable") + self.mapbox_limit = 0.0 + self.segment_distance = 0.0 + return + + steer_angle = sm["carState"].steeringAngleDeg - sm["vehicleParameters"].angleOffsetDeg + if not self.gps_valid or not self.mapbox_token or steer_angle >= 45: + self._log_mapbox_diag(f"SLC Mapbox skipped: gps_valid={self.gps_valid} token={bool(self.mapbox_token)} steer_angle={round(float(steer_angle), 2)}") + self.mapbox_limit = 0.0 + self.segment_distance = 0.0 + return + + if v_ego < 1: + return + + if self.segment_distance > 0: + self.segment_distance -= v_ego * DT_MDL + return + + if self.calling_mapbox: + self.segment_distance = v_ego + return + + def make_request(): + try: + self.calling_mapbox = True + successful = False + + if not is_url_pingable(self.mapbox_host): + self._log_mapbox_diag("SLC Mapbox skipped: host not pingable", force=True) + self.segment_distance = 1000 + return None + + if time_validated: + current_month = now.month + if current_month != self.mapbox_requests.get("month"): + self.mapbox_requests.update( + { + "month": current_month, + "total_requests": 0, + "max_requests": FREE_MAPBOX_REQUESTS - calendar.monthrange(now.year, current_month)[1] * 100, + } + ) + + self.mapbox_requests["total_requests"] += 1 + self.params.put_nonblocking("MapBoxRequests", self.mapbox_requests) + + lat = self.gps_position.get("latitude") + lon = self.gps_position.get("longitude") + bearing = self.gps_position.get("bearing") + future_lat, future_lon = calculate_bearing_offset(lat, lon, bearing, v_ego) + + self._log_mapbox_diag( + f"SLC Mapbox request: lat={round(float(lat), 6)} lon={round(float(lon), 6)} bearing={round(float(bearing), 2)} v_ego={round(float(v_ego), 2)}", + force=True, + ) + + url = f"{self.mapbox_host}/matching/v5/mapbox/driving/{lon},{lat};{future_lon},{future_lat}.json" + mapbox_params = { + "access_token": self.mapbox_token, + "annotations": "maxspeed,distance", + "geometries": "polyline6", + "overview": "full", + "steps": "false", + "radiuses": "10;10", + "tidy": "true", + } + + response = self.session.get(url, params=mapbox_params, timeout=10) + response.raise_for_status() + successful = True + return response.json() + except Exception as exception: + now_mono = time.monotonic() + if now_mono - self._last_mapbox_log_t >= 5.0: + self._last_mapbox_log_t = now_mono + msg = f"SLC Mapbox request failed: {exception}" + cloudlog.warning(msg) + k3_slc_log(msg) + finally: + self.calling_mapbox = False + if not successful: + self.mapbox_limit = 0.0 + self.segment_distance = v_ego + + def complete_request(future): + try: + data = future.result() + if data: + matchings = data.get("matchings") or [] + if not matchings: + self.mapbox_limit = 0.0 + self.segment_distance = v_ego + return + legs = (matchings[0] or {}).get("legs") or [] + if not legs: + self.mapbox_limit = 0.0 + self.segment_distance = v_ego + return + annotation = legs[0].get("annotation") or {} + distances = annotation.get("distance") or [v_ego] + segment_distance = distances[0] + speed_data = annotation.get("maxspeed", []) + speed_limit_kph = 0 + if speed_data: + first = speed_data[0] + speed_limit_kph = (first.get("speed") if first.get("speed") != "none" else 0) or 0 + if speed_limit_kph > 0: + self.mapbox_limit = speed_limit_kph * CV.KPH_TO_MS + self.segment_distance = segment_distance + self._log_mapbox_diag( + f"SLC Mapbox callback: speed_limit_kph={round(float(speed_limit_kph), 2)} segment_distance={round(float(segment_distance), 2)}", + force=True, + ) + return + self.mapbox_limit = 0.0 + self.segment_distance = v_ego + except Exception as exception: + now_mono = time.monotonic() + if now_mono - self._last_mapbox_log_t >= 5.0: + self._last_mapbox_log_t = now_mono + msg = f"SLC Mapbox callback failed: {exception}" + cloudlog.warning(msg) + k3_slc_log(msg) + self.mapbox_limit = 0.0 + self.segment_distance = v_ego + + future = self.executor.submit(make_request) + future.add_done_callback(complete_request) + + def get_tomtom_speed_limit(self, now, time_validated, v_ego, sm): + if requests is None or self.session is None or not self.tomtom_token: + self.tomtom_limit = 0.0 + self.tomtom_segment_distance = 0.0 + return + + # backoff: an exhausted-quota key (HTTP 403 InsufficientFunds) otherwise gets + # hammered every 250 m for the rest of the drive + if time.monotonic() < self.tomtom_backoff_until: + self.tomtom_limit = 0.0 + return + + steer_angle = sm["carState"].steeringAngleDeg - sm["vehicleParameters"].angleOffsetDeg + if not self.gps_valid or steer_angle >= 45 or v_ego < 1: + self.tomtom_limit = 0.0 + return + + # re-query at most once per ~250 m of travel + if self.tomtom_segment_distance > 0: + self.tomtom_segment_distance -= v_ego * DT_MDL + return + if self.calling_tomtom: + self.tomtom_segment_distance = v_ego + return + + lat = self.gps_position.get("latitude") + lon = self.gps_position.get("longitude") + bearing = self.gps_position.get("bearing") + future_lat, future_lon = calculate_bearing_offset(lat, lon, bearing, max(v_ego, 12.0) * 12.0) + + def make_request(): + successful = False + try: + self.calling_tomtom = True + url = f"{self.tomtom_host}/routing/1/calculateRoute/{lat},{lon}:{future_lat},{future_lon}/json" + self._log_mapbox_diag( + f"SLC TomTom request: lat={round(float(lat), 6)} lon={round(float(lon), 6)} bearing={round(float(bearing), 2)} v_ego={round(float(v_ego), 2)}", + force=True, + ) + response = self.session.get(url, params={"key": self.tomtom_token, "sectionType": "speedLimit", "traffic": "false"}, timeout=10) + response.raise_for_status() + successful = True + self.tomtom_consecutive_failures = 0 + return response.json() + except Exception as exception: + status = getattr(getattr(exception, "response", None), "status_code", None) + if status in (401, 403, 429): + # dead/exhausted key: retry hourly in case credits refill, not every 250 m + self.tomtom_backoff_until = time.monotonic() + 3600.0 + else: + self.tomtom_consecutive_failures += 1 + self.tomtom_backoff_until = time.monotonic() + min(600.0, 10.0 * (2 ** min(self.tomtom_consecutive_failures, 6))) + now_mono = time.monotonic() + if now_mono - self._last_mapbox_log_t >= 5.0: + self._last_mapbox_log_t = now_mono + msg = f"SLC TomTom request failed (backoff {max(0.0, self.tomtom_backoff_until - now_mono):.0f}s): {exception}" + cloudlog.warning(msg) + k3_slc_log(msg) + finally: + self.calling_tomtom = False + if not successful: + self.tomtom_limit = 0.0 + self.tomtom_segment_distance = v_ego + + def complete_request(future): + try: + data = future.result() + kmh = 0 + if data: + sections = ((data.get("routes") or [{}])[0]).get("sections") or [] + speed_secs = [s for s in sections if s.get("sectionType") == "SPEED_LIMIT"] + at_start = next((s for s in speed_secs if s.get("startPointIndex") == 0), None) + chosen = at_start or (speed_secs[0] if speed_secs else None) + if chosen: + kmh = chosen.get("maxSpeedLimitInKmh") or 0 + if kmh and kmh > 0: + self.tomtom_limit = float(kmh) * CV.KPH_TO_MS + self._log_mapbox_diag( + f"SLC TomTom callback: speed_limit_kph={round(float(kmh), 2)}", + force=True, + ) + else: + self.tomtom_limit = 0.0 + except Exception as exception: + now_mono = time.monotonic() + if now_mono - self._last_mapbox_log_t >= 5.0: + self._last_mapbox_log_t = now_mono + cloudlog.warning(f"SLC TomTom callback failed: {exception}") + self.tomtom_limit = 0.0 + finally: + self.tomtom_segment_distance = 250.0 + + future = self.executor.submit(make_request) + future.add_done_callback(complete_request) + + def _construction_zone_limit(self, sm, slc_params): + if not slc_params.get("construction_zone_assist", False): + return 0.0 + if not self._is_alive(sm, "iqConstructionZone"): + return 0.0 + if not bool(getattr(sm["iqConstructionZone"], "active", False)): + return 0.0 + speed = slc_params.get("construction_zone_speed", 60.0) + unit = CV.KPH_TO_MS if slc_params.get("is_metric", False) else CV.MPH_TO_MS + return max(float(speed), 0.0) * unit + + def _maybe_reset_mapbox_quota(self, now, time_validated): + if time_validated: + current_month = now.month + if current_month != self.mapbox_requests.get("month"): + self.mapbox_requests.update( + { + "month": current_month, + "total_requests": 0, + "max_requests": FREE_MAPBOX_REQUESTS - calendar.monthrange(now.year, current_month)[1] * 100, + } + ) + self.params.put_nonblocking("MapBoxRequests", self.mapbox_requests) + + def update_limits(self, dashboard_speed_limit, now, time_validated, v_cruise, v_ego, sm, slc_params): + self.update_gps(sm) + + lookahead_lower = slc_params.get("map_speed_lookahead_lower", 5.0) + lookahead_higher = slc_params.get("map_speed_lookahead_higher", 5.0) + self._resolver.update_map_data(v_ego, sm, lookahead_lower, lookahead_higher) + + use_online = slc_params.get("slc_online_filler", False) + if use_online: + self._maybe_reset_mapbox_quota(now, time_validated) + if self.mapbox_requests["total_requests"] < self.mapbox_requests["max_requests"]: + self.get_mapbox_speed_limit(now, time_validated, v_ego, sm) + else: + self.mapbox_limit = 0.0 + self.segment_distance = 0.0 + self.get_tomtom_speed_limit(now, time_validated, v_ego, sm) + else: + self.mapbox_limit = 0.0 + self.tomtom_limit = 0.0 + self.segment_distance = 0.0 + self.tomtom_segment_distance = 0.0 + + nav_mapbox_limit = 0.0 + if getattr(sm, "alive", {}).get("iqNavState", False) and getattr(sm, "valid", {}).get("iqNavState", False): + nav_state = sm["iqNavState"] + if getattr(nav_state, "mapboxSpeedLimitValid", False): + candidate = float(getattr(nav_state, "mapboxSpeedLimit", 0.0)) + if math.isfinite(candidate) and candidate >= LIMIT_MIN_SPEED: + nav_mapbox_limit = candidate + mapbox_limit = nav_mapbox_limit if nav_mapbox_limit > 0 else self.mapbox_limit + online_limit = self.tomtom_limit if self.tomtom_limit > 0 else mapbox_limit + + dashboard_limit = float(dashboard_speed_limit) if dashboard_speed_limit else 0.0 + resolved_limit, resolved_source = self._resolver.resolve(dashboard_limit, online_limit, slc_params) + + enabled = bool(getattr(sm["selfdriveState"], "enabled", False)) + if resolved_limit <= 0: + if self._assist.denied_target != self._assist.previous_target > 0 and slc_params.get("slc_fallback_previous_speed_limit", False): + resolved_limit = self._assist.previous_target + resolved_source = self._assist.previous_source + elif enabled and slc_params.get("slc_fallback_set_speed", False): + resolved_limit = v_cruise + resolved_source = "None" + + # work-zone clamp: only ever lowers the resolved limit + czone_limit = self._construction_zone_limit(sm, slc_params) + if czone_limit > 0 and (resolved_limit <= 0 or resolved_limit > czone_limit): + resolved_limit = czone_limit + resolved_source = "Construction" + + self._resolved_limit = float(resolved_limit) + self._resolved_source = resolved_source + + self._assist.update(enabled, v_ego, resolved_limit, resolved_source, slc_params, sm) + + if self._assist.just_confirmed: + self.overridden_speed = 0.0 + + self.pending_events = list(self._assist.pending_events) + + czone_limiting = resolved_source == "Construction" + if czone_limiting and not self._czone_was_limiting: + self.pending_events.append(EventNameIQ.constructionZoneDetected) + self._czone_was_limiting = czone_limiting + + def reset_override(self, sm): + self.override_slc = False + self.overridden_speed = 0.0 + self._last_override_request_id = int(getattr(sm["iqCarState"], "slcSetSpeedRequestId", 0)) + self._blocked_override_gesture = int(getattr(sm["iqCarState"], "slcSetSpeedGestureId", 0)) + self._override_limit = None + + def update_override(self, v_cruise, v_cruise_diff, v_ego, v_ego_diff, sm, slc_params, is_metric): + offset = self.get_offset(is_metric) + target = self._assist.target + set_speed_override = slc_params.get("speed_limit_controller_override_set_speed", False) + mode_changed = set_speed_override != self._override_set_speed + self._override_set_speed = set_speed_override + + if set_speed_override: + request_id = int(getattr(sm["iqCarState"], "slcSetSpeedRequestId", 0)) + gesture_id = int(getattr(sm["iqCarState"], "slcSetSpeedGestureId", 0)) + request_speed = float(getattr(sm["iqCarState"], "slcSetSpeedRequestKph", 0.0)) * CV.KPH_TO_MS + new_request = request_id != self._last_override_request_id + limit = (target, self._assist.source) + reset = (mode_changed or limit != self._override_limit or self._assist.just_confirmed or + self._assist.state == SpeedLimitAssistState.preActive or + not bool(getattr(sm["selfdriveState"], "enabled", False)) or target <= 0 or self._resolved_source == "Construction") + cruise_speed = v_cruise + v_cruise_diff + above_limit = cruise_speed > target + offset + 1e-3 + if reset or (self.override_slc and not above_limit): + self.reset_override(sm) + elif above_limit: + driver_increase = new_request and gesture_id != self._blocked_override_gesture and request_speed > target + offset + 1e-3 + gas_override = sm["carState"].gasPressed and v_ego > target + offset + self.override_slc = self.override_slc or driver_increase or gas_override + self.overridden_speed = cruise_speed if self.override_slc else 0.0 + self._last_override_request_id = request_id + self._override_limit = limit + return + + if mode_changed: + self.reset_override(sm) + + self.override_slc = self.overridden_speed > target + offset > 0 + self.override_slc |= sm["carState"].gasPressed and v_ego > target + offset > 0 + self.override_slc &= bool(getattr(sm["selfdriveState"], "enabled", False)) + + if self.override_slc: + if slc_params.get("speed_limit_controller_override_manual", False): + if sm["carState"].gasPressed: + self.overridden_speed = max(v_ego + v_ego_diff, self.overridden_speed) + self.overridden_speed = float(np.clip(self.overridden_speed, target + offset, v_cruise + v_cruise_diff)) + else: + self.overridden_speed = 0.0 diff --git a/iqpilot/selfdrive/controls/lib/tests/test_curvature_lookahead.py b/iqpilot/selfdrive/controls/lib/tests/test_curvature_lookahead.py new file mode 100644 index 000000000..c23bf107e --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_curvature_lookahead.py @@ -0,0 +1,27 @@ +from types import SimpleNamespace + +import numpy as np + +from iqpilot.selfdrive.controls.lib.curvature_lookahead import LOOKAHEAD_SECONDS, get_lookahead_curvature +from iqpilot.selfdrive.controls.lib.drive_helpers import get_curvature_from_plan +from iqpilot.selfdrive.iqmodeld.config import ModelConstants + + +def test_lookahead_samples_total_delay_horizon(): + yaws = np.square(np.asarray(ModelConstants.T_IDXS)) * 0.02 + yaw_rates = np.asarray(ModelConstants.T_IDXS) * 0.04 + model_v2 = SimpleNamespace( + orientation=SimpleNamespace(z=yaws.tolist()), + orientationRate=SimpleNamespace(z=yaw_rates.tolist()), + ) + lat_delay = 0.3 + expected = get_curvature_from_plan(yaws, yaw_rates, ModelConstants.T_IDXS, 20.0, lat_delay + LOOKAHEAD_SECONDS) + assert get_lookahead_curvature(model_v2, 20.0, lat_delay) == expected + + +def test_invalid_trajectory_falls_back_to_none(): + model_v2 = SimpleNamespace( + orientation=SimpleNamespace(z=[0.0]), + orientationRate=SimpleNamespace(z=[0.0]), + ) + assert get_lookahead_curvature(model_v2, 20.0, 0.3) is None diff --git a/iqpilot/selfdrive/controls/lib/tests/test_custom_stop_distance.py b/iqpilot/selfdrive/controls/lib/tests/test_custom_stop_distance.py new file mode 100644 index 000000000..5d65f72d3 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_custom_stop_distance.py @@ -0,0 +1,118 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Original concept ("Increased Stop Distance") by SpysyWeeb (github.com/SpysyWeeb) +""" +from types import SimpleNamespace + +from iqdbc.car.interfaces import ACCEL_MIN +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.controls.lib.custom_stop_distance import ( + CustomStopDistance, + MIN_ADJUSTED_D_REL, +) + + +def _build(distance): + c = CustomStopDistance.__new__(CustomStopDistance) + c.frame = 0 + c.distance = float(distance) + return c + + +def _model_msg(stop_distance, end_velocity): + x = [0.0] * (ModelConstants.IDX_N - 1) + [stop_distance] + v = [0.0] * (ModelConstants.IDX_N - 1) + [end_velocity] + return SimpleNamespace(position=SimpleNamespace(x=x), velocity=SimpleNamespace(x=v)) + + +def test_zero_distance_is_a_no_op(): + c = _build(0) + lead = {'status': True, 'dRel': 10.0, 'vLead': 0.0} + assert c.apply_lead(dict(lead)) == lead + + +def test_positive_distance_reduces_reported_lead_distance(): + c = _build(2) + lead = {'status': True, 'dRel': 10.0, 'vLead': 0.0} + out = c.apply_lead(dict(lead)) + assert out['dRel'] == 8.0 + + +def test_negative_distance_increases_reported_lead_distance(): + c = _build(-2) + lead = {'status': True, 'dRel': 10.0, 'vLead': 0.0} + out = c.apply_lead(dict(lead)) + assert out['dRel'] == 12.0 + + +def test_positive_distance_never_reports_below_floor(): + c = _build(2) + lead = {'status': True, 'dRel': 1.5, 'vLead': 0.0} + out = c.apply_lead(dict(lead)) + assert out['dRel'] == MIN_ADJUSTED_D_REL + + +def test_positive_distance_never_reports_further_than_reality(): + c = _build(2) + lead = {'status': True, 'dRel': 0.5, 'vLead': 0.0} + out = c.apply_lead(dict(lead)) + assert out['dRel'] == 0.5 + + +def test_offset_fades_out_as_lead_speeds_up(): + c = _build(2) + lead = {'status': True, 'dRel': 10.0, 'vLead': 3.0} + out = c.apply_lead(dict(lead)) + assert out['dRel'] == 10.0 + + +def test_no_lead_is_untouched(): + c = _build(2) + lead = {'status': False, 'dRel': 10.0, 'vLead': 0.0} + out = c.apply_lead(dict(lead)) + assert out['dRel'] == 10.0 + + +def test_e2e_negative_distance_is_a_no_op(): + c = _build(-2) + a_target, should_stop = c.adjust_e2e_stop(-0.5, False, 0.2, _model_msg(3.0, 0.0)) + assert (a_target, should_stop) == (-0.5, False) + + +def test_e2e_zero_distance_is_a_no_op(): + c = _build(0) + a_target, should_stop = c.adjust_e2e_stop(-0.5, False, 0.2, _model_msg(3.0, 0.0)) + assert (a_target, should_stop) == (-0.5, False) + + +def test_e2e_stop_sign_plans_are_untouched(): + c = _build(2) + # model plan still moving at the end -> proceeding through (stop sign), not held + a_target, should_stop = c.adjust_e2e_stop(-0.5, False, 0.2, _model_msg(3.0, 5.0)) + assert (a_target, should_stop) == (-0.5, False) + + +def test_e2e_holds_short_of_model_stop_when_already_stopped(): + c = _build(2) + a_target, should_stop = c.adjust_e2e_stop(0.0, False, 0.1, _model_msg(stop_distance=3.0, end_velocity=0.0)) + assert should_stop is True + + +def test_e2e_does_not_hold_once_past_offset_and_buffer(): + c = _build(2) + a_target, should_stop = c.adjust_e2e_stop(0.0, False, 0.1, _model_msg(stop_distance=10.0, end_velocity=0.0)) + assert should_stop is False + + +def test_e2e_deepens_braking_already_in_progress(): + c = _build(2) + a_target, should_stop = c.adjust_e2e_stop(-0.5, False, 5.0, _model_msg(stop_distance=10.0, end_velocity=0.0)) + assert a_target < -0.5 + assert a_target >= ACCEL_MIN + + +def test_e2e_never_relaxes_braking(): + c = _build(2) + a_target, should_stop = c.adjust_e2e_stop(0.0, False, 5.0, _model_msg(stop_distance=10.0, end_velocity=0.0)) + assert a_target == 0.0 diff --git a/iqpilot/selfdrive/controls/lib/tests/test_iq_dynamic_force_stop.py b/iqpilot/selfdrive/controls/lib/tests/test_iq_dynamic_force_stop.py new file mode 100644 index 000000000..813d73ec9 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_iq_dynamic_force_stop.py @@ -0,0 +1,62 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from types import SimpleNamespace + +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.controls.lib.iq_longitudinal_planner import LongitudinalPlannerIQ + + +class _FakeIQDynamic: + def __init__(self, requested=True, model_length=4.0, model_stop_time=5.0, minimum_force_stop_length=15.0): + self._requested = requested + self.model_length = model_length + self.model_stop_time = model_stop_time + self.minimum_force_stop_length = minimum_force_stop_length + + def force_stop_requested(self): + return self._requested + + +def _build_planner(iq_dynamic): + planner = LongitudinalPlannerIQ.__new__(LongitudinalPlannerIQ) + planner.iq_dynamic = iq_dynamic + planner.force_stop_timer = 0.0 + planner.forcing_stop = False + planner.override_force_stop = False + planner.override_force_stop_timer = 0.0 + planner.tracked_model_length = 0.0 + return planner + + +def _build_sm(gas_pressed=False, accel_pressed=False, standstill=False): + return { + "carState": SimpleNamespace(gasPressed=gas_pressed, standstill=standstill), + "iqCarState": SimpleNamespace(accelPressed=accel_pressed), + } + + +def test_force_stop_uses_model_stop_time_as_ramp(): + planner = _build_planner(_FakeIQDynamic(model_length=20.0, model_stop_time=5.0, minimum_force_stop_length=0.0)) + sm = _build_sm() + + output = 12.0 + for _ in range(int(1.0 / DT_MDL)): + output = planner._apply_force_stop(12.0, 0.0, sm, True) + + assert planner.forcing_stop + assert output == 4.0 + + +def test_force_stop_respects_minimum_force_stop_length(): + planner = _build_planner(_FakeIQDynamic(model_length=4.0, model_stop_time=5.0, minimum_force_stop_length=15.0)) + sm = _build_sm() + + output = 12.0 + for _ in range(int(1.0 / DT_MDL)): + output = planner._apply_force_stop(12.0, 0.0, sm, True) + + assert planner.forcing_stop + assert planner.tracked_model_length == 15.0 + assert output == 3.0 diff --git a/iqpilot/selfdrive/controls/lib/tests/test_lateral_acceleration_slew_limiter.py b/iqpilot/selfdrive/controls/lib/tests/test_lateral_acceleration_slew_limiter.py new file mode 100644 index 000000000..d7de7601b --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_lateral_acceleration_slew_limiter.py @@ -0,0 +1,87 @@ +import numpy as np + +from iqpilot.selfdrive.controls.lib.lateral_acceleration_slew_limiter import ( + A_LAT_MAX, + AVOIDANCE_BYPASS_ACCEL_DELTA, + LateralAccelerationSlewLimiter, +) + + +def test_disabled_is_exact_passthrough_without_state_change(): + limiter = LateralAccelerationSlewLimiter(False) + limiter.reset(1.25) + rng = np.random.default_rng(0) + for curvature in rng.standard_normal(100): + assert limiter.update(curvature, 25.0, 0.01) is curvature + assert limiter.a_lim == 1.25 + + +def test_step_is_limited_by_speed_scheduled_jerk(): + limiter = LateralAccelerationSlewLimiter(True) + limiter.reset(0.0) + v_ego = 20.0 + dt = 0.01 + target = 1.5 / v_ego ** 2 + previous = limiter.a_lim + for _ in range(100): + limiter.update(target, v_ego, dt) + assert abs(limiter.a_lim - previous) <= limiter.jerk_max(v_ego) * dt + 1e-12 + previous = limiter.a_lim + + +def test_converges_to_held_target(): + limiter = LateralAccelerationSlewLimiter(True) + v_ego = 20.0 + target_accel = 1.0 + limiter.reset(0.0) + for _ in range(100): + limiter.update(target_accel / v_ego ** 2, v_ego, 0.01) + assert limiter.a_lim == target_accel + + +def test_reset_prevents_reengagement_jump(): + limiter = LateralAccelerationSlewLimiter(True) + v_ego = 20.0 + target_accel = 1.0 + limiter.reset(target_accel) + curvature = limiter.update(target_accel / v_ego ** 2, v_ego, 0.01) + assert curvature == target_accel / v_ego ** 2 + assert limiter.a_lim == target_accel + + +def test_low_speed_passes_through_and_resets(): + limiter = LateralAccelerationSlewLimiter(True) + limiter.reset(-1.0) + curvature = 0.2 + assert limiter.update(curvature, 4.0, 0.01) == curvature + assert limiter.a_lim == A_LAT_MAX + + +def test_speed_schedule_changes_slew_rate(): + limiter = LateralAccelerationSlewLimiter(True) + limiter.reset(0.0) + limiter.update(1.0 / 8.0 ** 2, 8.0, 0.01) + low_speed_step = limiter.a_lim + limiter.reset(0.0) + limiter.update(1.0 / 35.0 ** 2, 35.0, 0.01) + high_speed_step = limiter.a_lim + assert low_speed_step > high_speed_step + + +def test_sharp_avoidance_bypasses_limiter(): + limiter = LateralAccelerationSlewLimiter(True) + v_ego = 20.0 + limiter.reset(0.0) + target_accel = AVOIDANCE_BYPASS_ACCEL_DELTA + 0.1 + curvature = limiter.update(target_accel / v_ego ** 2, v_ego, 0.01) + assert limiter.a_lim == target_accel + assert curvature == target_accel / v_ego ** 2 + + +def test_acceleration_space_couples_speed_and_curvature_changes(): + limiter = LateralAccelerationSlewLimiter(True) + limiter.reset(0.5) + limiter.update(0.005, 10.0, 0.01) + previous = limiter.a_lim + limiter.update(0.003, 20.0, 0.01) + assert limiter.a_lim - previous <= limiter.jerk_max(20.0) * 0.01 + 1e-12 diff --git a/iqpilot/selfdrive/controls/lib/tests/test_lateral_edge_guard.py b/iqpilot/selfdrive/controls/lib/tests/test_lateral_edge_guard.py new file mode 100644 index 000000000..97a42b4e1 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_lateral_edge_guard.py @@ -0,0 +1,236 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +from dataclasses import dataclass +import math + +from iqpilot.cereal import custom, log +import iqpilot.cereal.messaging as messaging +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.controls.lib.desire_helper import DesireHelper +from iqpilot.selfdrive.controls.lib.helpers.lane_change import AutoLaneChangeMode +from iqpilot.selfdrive.controls.lib.helpers.lateral_edge_guard import ( + ADJACENT_LANE_LINE_PROB, + BLOCK_DEBOUNCE_S, + CLEAR_DEBOUNCE_S, + LANE_CENTER_OFFSET_M, + MAX_MEASURED_LANE_WIDTH_M, + MAX_VALID_ROAD_EDGE_STD_M, + MIN_ACTIVE_SPEED_MPS, + MIN_MEASURED_LANE_WIDTH_M, + REQUIRED_ROAD_EDGE_DISTANCE_M, + UNAVAILABLE_HOLD_S, + LateralEdgeGuard, + RoadEdgeDataState, + evaluate_road_edge, +) +from iqpilot.selfdrive.selfdrived.iq_events import EVENTS_IQ, ET +from iqpilot.selfdrive.selfdrived.selfdrived import SelfdriveD + + +@dataclass +class Edge: + x: list[float] + y: list[float] + + +@dataclass +class ModelData: + roadEdges: list[Edge] + roadEdgeStds: list[float] + + +@dataclass +class LaneModelData: + roadEdges: list[Edge] + roadEdgeStds: list[float] + laneLines: list[Edge] + laneLineProbs: list[float] + + +class CarState: + def __init__(self, left_blindspot: bool = False) -> None: + self.vEgo = MIN_ACTIVE_SPEED_MPS + 1.0 + self.leftBlinker = True + self.rightBlinker = False + self.leftBlindspot = left_blindspot + self.rightBlindspot = False + self.steeringPressed = True + self.steeringTorque = 1.0 + self.brakePressed = False + self.standstill = False + + +def edge_model(left_distance_m: float = 6.0, right_distance_m: float = 6.0, + left_std_m: float = 0.0, right_std_m: float = 0.0) -> ModelData: + xs = [5.0, 20.0, 40.0] + return ModelData( + [Edge(xs, [-left_distance_m] * len(xs)), Edge(xs, [right_distance_m] * len(xs))], + [left_std_m, right_std_m], + ) + + +def lane_model(left_distance_m: float = 4.0, outer_prob: float = 0.0, + ego_width_m: float = 3.5, ego_prob: float = 0.9) -> LaneModelData: + xs = [5.0, 20.0, 40.0] + base = edge_model(left_distance_m, left_distance_m) + half = ego_width_m / 2.0 + lines = [Edge(xs, [-(half + 3.0)] * 3), Edge(xs, [-half] * 3), + Edge(xs, [half] * 3), Edge(xs, [half + 3.0] * 3)] + return LaneModelData(base.roadEdges, base.roadEdgeStds, lines, + [outer_prob, ego_prob, ego_prob, outer_prob]) + + +def cycles(duration_s: float) -> int: + return math.ceil(duration_s / DT_MDL) + + +def update_for(guard: LateralEdgeGuard, modeldata: ModelData | None, duration_s: float, + speed_mps: float = MIN_ACTIVE_SPEED_MPS) -> None: + for _ in range(cycles(duration_s)): + guard.update(modeldata, speed_mps, DT_MDL) + + +def test_valid_geometry_blocks_and_clear_geometry_does_not_block() -> None: + blocked = evaluate_road_edge(edge_model(4.0).roadEdges[0], 0.2, log.LaneChangeDirection.left) + clear = evaluate_road_edge(edge_model(6.0).roadEdges[0], 0.2, log.LaneChangeDirection.left) + assert blocked.state == RoadEdgeDataState.VALID + assert blocked.should_block is True + assert clear.state == RoadEdgeDataState.VALID + assert clear.should_block is False + + +def test_unavailable_and_invalid_are_distinct() -> None: + unavailable = evaluate_road_edge(Edge([5.0], []), 0.2, log.LaneChangeDirection.left) + invalid = evaluate_road_edge(edge_model().roadEdges[0], MAX_VALID_ROAD_EDGE_STD_M + 0.01, + log.LaneChangeDirection.left) + assert unavailable.state == RoadEdgeDataState.UNAVAILABLE + assert unavailable.lateral_distance_m is None + assert invalid.state == RoadEdgeDataState.INVALID + assert invalid.should_block is None + + +def test_distance_threshold_on_either_side() -> None: + epsilon_m = 0.001 + for direction, edge_index in ((log.LaneChangeDirection.left, 0), (log.LaneChangeDirection.right, 1)): + below = edge_model(REQUIRED_ROAD_EDGE_DISTANCE_M - epsilon_m, REQUIRED_ROAD_EDGE_DISTANCE_M - epsilon_m) + above = edge_model(REQUIRED_ROAD_EDGE_DISTANCE_M + epsilon_m, REQUIRED_ROAD_EDGE_DISTANCE_M + epsilon_m) + assert evaluate_road_edge(below.roadEdges[edge_index], 0.0, direction).should_block is True + assert evaluate_road_edge(above.roadEdges[edge_index], 0.0, direction).should_block is False + + +def test_disabled_guard_never_blocks() -> None: + guard = LateralEdgeGuard(enabled=False) + update_for(guard, edge_model(4.0), BLOCK_DEBOUNCE_S * 2) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.none + + +def test_enabled_guard_blocks_after_debounce() -> None: + guard = LateralEdgeGuard(enabled=True) + update_for(guard, edge_model(4.0), BLOCK_DEBOUNCE_S) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.left + + +def test_parameter_refresh_controls_guard() -> None: + class EdgeGuardParams: + enabled = True + + def get_bool(self, key: str) -> bool: + assert key == "IQEdgeGuard" + return self.enabled + + params = EdgeGuardParams() + guard = LateralEdgeGuard(enabled=False) + guard._params = params + guard._param_refresh_frame = 0 + update_for(guard, edge_model(4.0), BLOCK_DEBOUNCE_S) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.left + + params.enabled = False + guard._param_refresh_frame = 50 + guard.update(edge_model(4.0), MIN_ACTIVE_SPEED_MPS, DT_MDL) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.none + + +def test_clear_debounce_rejects_a_single_blocking_frame() -> None: + guard = LateralEdgeGuard(enabled=True) + update_for(guard, edge_model(4.0), BLOCK_DEBOUNCE_S) + update_for(guard, edge_model(6.0), CLEAR_DEBOUNCE_S - DT_MDL) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.left + guard.update(edge_model(4.0), MIN_ACTIVE_SPEED_MPS, DT_MDL) + update_for(guard, edge_model(6.0), CLEAR_DEBOUNCE_S) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.none + + +def test_unavailable_holds_then_falls_back_to_not_blocking() -> None: + guard = LateralEdgeGuard(enabled=True) + update_for(guard, edge_model(4.0), BLOCK_DEBOUNCE_S) + update_for(guard, None, UNAVAILABLE_HOLD_S - DT_MDL) + assert guard.left_measurement.state == RoadEdgeDataState.UNAVAILABLE + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.left + guard.update(None, MIN_ACTIVE_SPEED_MPS, DT_MDL) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.none + + +def test_speed_gate_is_inactive_below_threshold() -> None: + guard = LateralEdgeGuard(enabled=True) + update_for(guard, edge_model(4.0), BLOCK_DEBOUNCE_S, MIN_ACTIVE_SPEED_MPS - 0.01) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.none + + +def test_visible_outer_lane_line_overrides_edge_block() -> None: + guard = LateralEdgeGuard(enabled=True) + update_for(guard, lane_model(4.0, outer_prob=ADJACENT_LANE_LINE_PROB + 0.2), BLOCK_DEBOUNCE_S * 4) + assert guard.block_for_direction(log.LaneChangeDirection.left) == custom.IQLateralEdgeBlock.none + + +def test_measured_lane_width_is_clamped_and_falls_back() -> None: + assert LateralEdgeGuard._measured_lane_width(None) == LANE_CENTER_OFFSET_M + assert LateralEdgeGuard._measured_lane_width(edge_model(4.0)) == LANE_CENTER_OFFSET_M + assert LateralEdgeGuard._measured_lane_width(lane_model(4.0, ego_prob=0.1)) == LANE_CENTER_OFFSET_M + assert LateralEdgeGuard._measured_lane_width(lane_model(4.0, ego_width_m=9.0)) == MAX_MEASURED_LANE_WIDTH_M + assert LateralEdgeGuard._measured_lane_width(lane_model(4.0, ego_width_m=0.5)) == MIN_MEASURED_LANE_WIDTH_M + assert LateralEdgeGuard._measured_lane_width(lane_model(4.0, ego_width_m=3.2)) == 3.2 + + +def test_desire_helper_blocks_only_when_edge_guard_is_enabled() -> None: + helper = DesireHelper() + helper.lateral_edge_guard = LateralEdgeGuard(enabled=True) + helper.alc.lane_change_set_timer = AutoLaneChangeMode.NUDGE + helper.lane_change_state = log.LaneChangeState.preLaneChange + helper.lane_change_direction = log.LaneChangeDirection.left + update_for(helper.lateral_edge_guard, edge_model(4.0), BLOCK_DEBOUNCE_S) + helper.update(CarState(), True, 1.0, modeldata=edge_model(4.0)) + assert helper.lateral_edge_block == custom.IQLateralEdgeBlock.left + assert helper.lane_change_state == log.LaneChangeState.preLaneChange + + helper.lateral_edge_guard = LateralEdgeGuard(enabled=False) + helper.update(CarState(), True, 1.0, modeldata=edge_model(4.0)) + assert helper.lateral_edge_block == custom.IQLateralEdgeBlock.none + assert helper.lane_change_state == log.LaneChangeState.laneChangeStarting + + +def test_published_edge_block_maps_to_distinct_event_and_alert() -> None: + message = messaging.new_message("iqDriveModelData") + message.iqDriveModelData.lateralEdgeBlock = custom.IQLateralEdgeBlock.right + + class SubMaster: + updated = {"iqDriveModelData": True} + + def __getitem__(self, service: str): + assert service == "iqDriveModelData" + return message.iqDriveModelData + + selfdrived = SelfdriveD.__new__(SelfdriveD) + selfdrived.sm = SubMaster() + selfdrived._cached_model_event_names = () + selfdrived._refresh_cached_model_events() + + event_name = custom.IQOnroadEvent.EventName.lateralEdgeBlocked + assert selfdrived._cached_model_event_names == (event_name,) + alert = EVENTS_IQ[event_name][ET.WARNING] + assert alert.alert_text_1 == "Lane Change Blocked" + assert alert.alert_text_2 == "Road edge detected" diff --git a/iqpilot/selfdrive/controls/lib/tests/test_longitudinal_planner_accel_state.py b/iqpilot/selfdrive/controls/lib/tests/test_longitudinal_planner_accel_state.py new file mode 100644 index 000000000..b04ea067e --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_longitudinal_planner_accel_state.py @@ -0,0 +1,190 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import numpy as np +import pytest + +from iqdbc.car.honda.interface import CarInterface +from iqdbc.car.honda.values import CAR +from iqpilot.cereal import custom, log +import iqpilot.cereal.messaging as messaging +from iqpilot.selfdrive.controls.lib.longcontrol import LongCtrlState +from iqpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner +from iqpilot.selfdrive.iqmodeld.config import ModelConstants + +CRUISE = "cruise" +SPEED_LIMIT_ASSIST = "speedLimitAssist" +NAV = "nav" +SOURCES = [CRUISE, SPEED_LIMIT_ASSIST, NAV] +PLAN_SOURCE = custom.IQPlan.LongitudinalPlanSource + +V_CRUISE_MS = 25.0 +NAV_SPEED_TARGET = 11.0 +SLC_SPEED_TARGET = 12.0 + +APPROACH_V_EGO = 11.2 +APPROACH_D_REL = 100.0 +APPROACH_STEPS = 250 +MIN_SAFE_GAP = 2.0 +COAST_THROTTLE_PROB = 0.1 + + +def build_planner(init_v=V_CRUISE_MS, init_a=0.0): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + CP_IQ = CarInterface.get_non_essential_params_iq(CP, CAR.HONDA_CIVIC) + return LongitudinalPlanner(CP, CP_IQ, init_v=init_v, init_a=init_a) + + +def build_sm(v_ego, d_rel, v_lead, source, enabled=True, throttle_prob=1.0, a_ego=0.0, v_cruise=V_CRUISE_MS): + radar = messaging.new_message('radarState') + control = messaging.new_message('controlsState') + ss = messaging.new_message('selfdriveState') + car_state = messaging.new_message('carState') + car_control = messaging.new_message('carControl') + vehicle_params = messaging.new_message('vehicleParameters') + model = messaging.new_message('modelV2') + iq_car_state = messaging.new_message('iqCarState') + iq_nav_state = messaging.new_message('iqNavState') + iq_live_data = messaging.new_message('iqLiveData') + gps = messaging.new_message('gpsLocation') + + lead = log.RadarState.LeadData.new_message() + lead.dRel = float(d_rel) + lead.vRel = float(v_lead - v_ego) + lead.vLead = float(v_lead) + lead.vLeadK = float(v_lead) + lead.status = True + lead.modelProb = 1.0 + radar.radarState.leadOne = lead + + t_idxs = np.array(ModelConstants.T_IDXS) + position = log.XYZTData.new_message() + position.x = [float(x) for x in v_ego * t_idxs] + model.modelV2.position = position + velocity = log.XYZTData.new_message() + velocity.x = [float(v_ego) for _ in t_idxs] + model.modelV2.velocity = velocity + acceleration = log.XYZTData.new_message() + acceleration.x = [0.0 for _ in t_idxs] + model.modelV2.acceleration = acceleration + model.modelV2.action.desiredAcceleration = 0.0 + model.modelV2.meta.disengagePredictions.gasPressProbs = [float(throttle_prob) for _ in range(6)] + + lead_times = np.array(ModelConstants.LEAD_T_IDXS) + for lead_prediction in model.modelV2.leadsV3: + lead_prediction.prob = 1.0 + lead_prediction.x = [float(d_rel + v_lead * t) for t in lead_times] + lead_prediction.v = [float(v_lead) for _ in lead_times] + + control.controlsState.longControlState = LongCtrlState.pid if enabled else LongCtrlState.off + ss.selfdriveState.enabled = enabled + car_state.carState.vEgo = float(v_ego) + car_state.carState.aEgo = float(a_ego) + car_state.carState.standstill = bool(v_ego < 0.01) + car_state.carState.vCruise = float(v_cruise * 3.6) + car_control.carControl.orientationNED = [0.0, 0.0, 0.0] + + if source == NAV: + iq_nav_state.iqNavState.longitudinalEngaged = True + iq_nav_state.iqNavState.valid = True + iq_nav_state.iqNavState.speedTarget = NAV_SPEED_TARGET + iq_nav_state.iqNavState.accelTarget = 0.0 + + return { + 'radarState': radar.radarState, + 'carState': car_state.carState, + 'carControl': car_control.carControl, + 'controlsState': control.controlsState, + 'selfdriveState': ss.selfdriveState, + 'vehicleParameters': vehicle_params.vehicleParameters, + 'modelV2': model.modelV2, + 'iqCarState': iq_car_state.iqCarState, + 'iqNavState': iq_nav_state.iqNavState, + 'iqLiveData': iq_live_data.iqLiveData, + 'gpsLocation': gps.gpsLocation, + } + + +def stub_speed_limit_assist(planner): + planner.slimit.update = lambda *args, **kwargs: SLC_SPEED_TARGET + + +def run_approach(planner, source, v_ego_0=APPROACH_V_EGO, d_rel_0=APPROACH_D_REL, + steps=APPROACH_STEPS, throttle_prob=COAST_THROTTLE_PROB): + if source == SPEED_LIMIT_ASSIST: + stub_speed_limit_assist(planner) + + v_ego = v_ego_0 + d_rel = d_rel_0 + prev_output_a_target = None + trace = [] + for _ in range(steps): + planner.update(build_sm(v_ego, d_rel, 0.0, source, throttle_prob=throttle_prob)) + trace.append({ + 'v_ego': v_ego, + 'd_rel': d_rel, + 'accels_0': float(planner.a_desired_trajectory[0]), + 'prev_output_a_target': prev_output_a_target, + 'output_a_target': float(planner.output_a_target), + }) + prev_output_a_target = float(planner.output_a_target) + v_ego = max(0.0, v_ego + prev_output_a_target * planner.dt) + d_rel = max(0.0, d_rel - v_ego * planner.dt) + return trace + + +@pytest.mark.parametrize("source", SOURCES) +def test_mpc_initial_accel_state_carries_previous_command(source): + planner = build_planner(init_v=APPROACH_V_EGO) + trace = run_approach(planner, source) + + for i, step in enumerate(trace): + if step['prev_output_a_target'] is None: + continue + assert step['accels_0'] == pytest.approx(step['prev_output_a_target'], abs=1e-6), ( + f"step {i} source={source}: MPC initial accel state was {step['accels_0']:.4f} " + f"but the previous commanded accel was {step['prev_output_a_target']:.4f}" + ) + + +@pytest.mark.parametrize("source", SOURCES) +def test_brakes_for_stopped_lead(source): + planner = build_planner(init_v=APPROACH_V_EGO) + trace = run_approach(planner, source) + + min_gap = min(step['d_rel'] for step in trace) + assert min_gap > MIN_SAFE_GAP, ( + f"source={source}: closed to {min_gap:.2f} m of a stopped lead first seen at " + f"{APPROACH_D_REL:.0f} m while coasting from {APPROACH_V_EGO:.1f} m/s" + ) + + +@pytest.mark.parametrize("source,expected", [ + (CRUISE, V_CRUISE_MS), + (SPEED_LIMIT_ASSIST, SLC_SPEED_TARGET), + (NAV, NAV_SPEED_TARGET), +]) +def test_speed_source_arbitration_unchanged(source, expected): + planner = build_planner(init_v=APPROACH_V_EGO) + if source == SPEED_LIMIT_ASSIST: + stub_speed_limit_assist(planner) + planner.update(build_sm(APPROACH_V_EGO, APPROACH_D_REL, 0.0, source)) + + assert planner.output_v_target == pytest.approx(expected, abs=1e-6) + assert planner.source == getattr(PLAN_SOURCE, source) + + +def test_cruise_accel_initializes_from_planner_accel(): + planner = build_planner(init_a=-0.35) + + assert planner.a_cruise == pytest.approx(-0.35) + + +def test_cruise_accel_resets_from_measured_accel(): + a_ego = -0.45 + v_ego = 20.0 + planner = build_planner(init_v=v_ego) + planner.a_cruise = 0.5 + planner.update(build_sm(v_ego, APPROACH_D_REL, v_ego, CRUISE, enabled=False, a_ego=a_ego, v_cruise=v_ego + a_ego)) + + assert planner.a_cruise == pytest.approx(a_ego, abs=1e-6) diff --git a/iqpilot/selfdrive/controls/lib/tests/test_nav_exit_lane_change.py b/iqpilot/selfdrive/controls/lib/tests/test_nav_exit_lane_change.py new file mode 100644 index 000000000..f16bb84c7 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_nav_exit_lane_change.py @@ -0,0 +1,96 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.cereal import custom, log +from iqpilot.selfdrive.controls.lib.desire_helper import DesireHelper, LaneChangeState +from iqpilot.selfdrive.controls.lib.helpers.lane_change import AutoLaneChangeMode + +ManeuverType = custom.IQNavState.ManeuverType +NavDirection = custom.NavDirection +LaneChangeDirection = log.LaneChangeDirection + + +class DummyCarState: + def __init__(self, vEgo=25.0, leftBlinker=False, rightBlinker=False, leftBlindspot=False, rightBlindspot=False, + steeringPressed=False, steeringTorque=0, brakePressed=False): + self.vEgo = vEgo + self.leftBlinker = leftBlinker + self.rightBlinker = rightBlinker + self.leftBlindspot = leftBlindspot + self.rightBlindspot = rightBlindspot + self.steeringPressed = steeringPressed + self.steeringTorque = steeringTorque + self.brakePressed = brakePressed + + +class DummyNavState: + def __init__(self, active=True, nextManeuverValid=True, nextManeuverType=int(ManeuverType.exit), + nextManeuverDistance=300.0, nextManeuverDirection=int(NavDirection.right)): + self.active = active + self.nextManeuverValid = nextManeuverValid + self.nextManeuverType = nextManeuverType + self.nextManeuverDistance = nextManeuverDistance + self.nextManeuverDirection = nextManeuverDirection + + +def _make_dh(enabled: bool, enable_bsm: bool): + dh = DesireHelper() + dh.alc.lane_change_set_timer = AutoLaneChangeMode.NUDGE + dh.nav_exit._read_enabled = lambda: enabled # bypass the (unregistered) param in tests + dh.nav_exit._enable_bsm = enable_bsm + return dh + + +def _run(dh, carstate, nav_state, n=20): + for _ in range(n): + dh.update(carstate, True, 1.0, nav_state) + return dh.desire + + +def test_feature_off_no_exit_lane_change(): + dh = _make_dh(enabled=False, enable_bsm=True) + cs = DummyCarState(rightBlindspot=False) + assert _run(dh, cs, DummyNavState()) == log.Desire.none + + +def test_no_bsm_requires_nudge_holds_without_one(): + # No blindspot monitor: nav exit must NOT auto-start; without a nudge it stays in preLaneChange. + dh = _make_dh(enabled=True, enable_bsm=False) + cs = DummyCarState(steeringPressed=False) + assert _run(dh, cs, DummyNavState()) == log.Desire.none + assert dh.lane_change_state == LaneChangeState.preLaneChange + assert dh.lane_change_direction == LaneChangeDirection.right + + +def test_no_bsm_starts_on_driver_nudge(): + # Driver nudges the wheel toward the exit (right -> negative torque) -> lane change starts. + dh = _make_dh(enabled=True, enable_bsm=False) + cs = DummyCarState(steeringPressed=True, steeringTorque=-1) + assert _run(dh, cs, DummyNavState()) == log.Desire.laneChangeRight + + +def test_bsm_auto_starts_when_clear(): + dh = _make_dh(enabled=True, enable_bsm=True) + cs = DummyCarState(rightBlindspot=False) + assert _run(dh, cs, DummyNavState()) == log.Desire.laneChangeRight + + +def test_bsm_holds_when_blindspot_occupied(): + dh = _make_dh(enabled=True, enable_bsm=True) + cs = DummyCarState(rightBlindspot=True) + assert _run(dh, cs, DummyNavState()) == log.Desire.none + + +def test_only_exit_maneuvers_trigger(): + # A turn maneuver (not an exit) must not trigger the exit lane change. + dh = _make_dh(enabled=True, enable_bsm=True) + cs = DummyCarState(rightBlindspot=False) + nav = DummyNavState(nextManeuverType=int(ManeuverType.turn)) + assert _run(dh, cs, nav) == log.Desire.none + + +def test_too_far_does_not_trigger(): + dh = _make_dh(enabled=True, enable_bsm=True) + cs = DummyCarState(rightBlindspot=False) + nav = DummyNavState(nextManeuverDistance=900.0) + assert _run(dh, cs, nav) == log.Desire.none diff --git a/iqpilot/selfdrive/controls/lib/tests/test_slc_speed_limit_control.py b/iqpilot/selfdrive/controls/lib/tests/test_slc_speed_limit_control.py new file mode 100644 index 000000000..45fe0eed2 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_slc_speed_limit_control.py @@ -0,0 +1,713 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from datetime import datetime +from types import SimpleNamespace + +import pytest + +from iqpilot.cereal import car, custom +from iqpilot.common.constants import CV +from iqpilot.common.slc_variables import OFFSET_MAP_IMPERIAL +from iqpilot.selfdrive.car.cruise import VCruiseHelper +from iqpilot.selfdrive.controls.lib.iq_longitudinal_planner import LongitudinalPlannerIQ +from iqpilot.selfdrive.controls.lib.slc_vcruise import SLCVCruise, CRUISING_SPEED +from iqpilot.selfdrive.controls.lib.speed_limit_controller import SpeedLimitController, POLICY_MAP_DATA_PRIORITY, POLICY_COMBINED + + +class FakeParams: + def __init__(self): + self.values = {} + + def get(self, key, encoding=None): + _ = encoding + return self.values.get(key) + + def get_bool(self, key): + return bool(self.values.get(key, False)) + + def put_nonblocking(self, key, value): + self.values[key] = value + + def put(self, key, value): + self.values[key] = value + + +def _build_sm(v_cruise_cluster=100.0, v_ego_cluster=27.8, gas=False, enabled=True, iq_limit=0.0): + # vCruiseCluster is in kph in carState. + return { + "carState": SimpleNamespace(vCruiseCluster=v_cruise_cluster, vEgoCluster=v_ego_cluster, gasPressed=gas, + steeringAngleDeg=0.0, buttonEvents=[]), + "iqCarState": SimpleNamespace(speedLimit=iq_limit, accelPressed=False, decelPressed=False), + "selfdriveState": SimpleNamespace(enabled=enabled), + "vehicleParameters": SimpleNamespace(angleOffsetDeg=0.0), + } + + +class _FakeSLC: + def __init__(self): + self.target = 0.0 + self.source = "None" + self.active_target = 0.0 + self.active_source = "None" + self.unconfirmed_speed_limit = 0.0 + self.overridden_speed = 0.0 + self.pending_events = [] + self.assist_state = None + self.output_a_target = 0.0 + self.update_limits_calls = 0 + self.update_override_calls = 0 + self._offset = 0.0 + + def update_limits(self, *_args, **_kwargs): + self.update_limits_calls += 1 + + def update_override(self, *_args, **_kwargs): + self.update_override_calls += 1 + + def reset_override(self, _sm): + self.overridden_speed = 0.0 + + def get_offset(self, _is_metric): + return self._offset + + +def _base_slc_params_controller(): + return { + "slc_policy": POLICY_MAP_DATA_PRIORITY, + "slc_auto_confirm": False, + "slc_fallback_previous_speed_limit": False, + "slc_fallback_set_speed": False, + "speed_limit_confirmation_higher": False, + "speed_limit_confirmation_lower": False, + "slc_online_filler": True, + "map_speed_lookahead_higher": 5.0, + "map_speed_lookahead_lower": 5.0, + } + + +def test_speed_limit_controller_resolves_source_by_priority(): + params = FakeParams() + controller = SpeedLimitController(params) + controller.update_gps = lambda _sm: None + controller._resolver.update_map_data = lambda *_args, **_kwargs: None + controller.get_mapbox_speed_limit = lambda *_args, **_kwargs: None + controller.mapbox_requests["total_requests"] = 0 + controller.mapbox_requests["max_requests"] = 999999 + controller.mapbox_limit = 22.0 + controller._resolver.map_speed_limit = 18.0 # map data wins in map_data_priority policy + + sm = _build_sm(iq_limit=25.0) + slc_params = _base_slc_params_controller() + slc_params["slc_policy"] = POLICY_MAP_DATA_PRIORITY + + controller.update_limits(25.0, datetime.now(), True, 30.0, 27.0, sm, slc_params) + assert controller.active_source == "Map Data" + assert controller.active_target == 18.0 + + +def test_speed_limit_controller_combined_mode_prefers_smallest_limit(): + params = FakeParams() + controller = SpeedLimitController(params) + controller.update_gps = lambda _sm: None + controller._resolver.update_map_data = lambda *_args, **_kwargs: None + controller.get_mapbox_speed_limit = lambda *_args, **_kwargs: None + controller.mapbox_requests["total_requests"] = 0 + controller.mapbox_requests["max_requests"] = 999999 + controller.mapbox_limit = 24.0 + controller._resolver.map_speed_limit = 16.0 # smallest of: dashboard=28, mapbox=24, map_data=16 + + sm = _build_sm(iq_limit=28.0) + slc_params = _base_slc_params_controller() + slc_params["slc_policy"] = POLICY_COMBINED + + controller.update_limits(28.0, datetime.now(), True, 31.0, 27.0, sm, slc_params) + assert controller.active_source == "Map Data" + assert controller.active_target == 16.0 + + +def test_slc_vcruise_applies_target_without_increasing_cruise(): + slc = SLCVCruise() + slc.slc = _FakeSLC() + slc.slc.target = 23.0 + slc.slc.source = "Dashboard" + slc.slc.active_target = 23.0 + slc.slc.active_source = "Dashboard" + slc.slc._offset = 1.0 + + slc._get_slc_params = lambda: { + "speed_limit_controller": True, + "speed_limit_mode": 3, + "show_speed_limits": False, + "is_metric": True, + "slc_policy": POLICY_MAP_DATA_PRIORITY, + "slc_auto_confirm": False, + "speed_limit_confirmation_higher": False, + "speed_limit_confirmation_lower": False, + "map_speed_lookahead_higher": 5.0, + "map_speed_lookahead_lower": 5.0, + "slc_fallback_experimental_mode": False, + "slc_fallback_set_speed": False, + "slc_fallback_previous_speed_limit": False, + "speed_limit_controller_override_manual": True, + "speed_limit_controller_override_set_speed": False, + "slc_online_filler": False, + } + + v_cruise = 30.0 + sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=27.0, iq_limit=23.0) + out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=27.0, sm=sm) + + assert slc.slc.update_limits_calls == 1 + assert slc.slc.update_override_calls == 1 + assert out <= v_cruise + assert out >= CRUISING_SPEED + + +def test_slc_vcruise_show_only_does_not_modify_cruise(): + slc = SLCVCruise() + slc.slc = _FakeSLC() + slc.slc.target = 21.0 + slc.slc.source = "Map Data" + slc.slc.active_target = 21.0 + slc.slc.active_source = "Map Data" + slc._get_slc_params = lambda: { + "speed_limit_controller": False, + "speed_limit_mode": 1, + "show_speed_limits": True, + "is_metric": True, + "slc_policy": POLICY_MAP_DATA_PRIORITY, + "slc_auto_confirm": False, + "speed_limit_confirmation_higher": False, + "speed_limit_confirmation_lower": False, + "map_speed_lookahead_higher": 5.0, + "map_speed_lookahead_lower": 5.0, + "slc_fallback_experimental_mode": False, + "slc_fallback_set_speed": False, + "slc_fallback_previous_speed_limit": False, + "speed_limit_controller_override_manual": True, + "speed_limit_controller_override_set_speed": False, + "slc_online_filler": False, + } + + v_cruise = 29.0 + sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=26.0, iq_limit=21.0) + out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=26.0, sm=sm) + + assert slc.slc.update_limits_calls == 1 + assert slc.slc.update_override_calls == 0 + assert out == v_cruise + + +def test_slc_vcruise_auto_raises_for_higher_limit_when_confirmation_disabled(): + slc = SLCVCruise() + slc.slc = _FakeSLC() + slc.slc.target = 20.0 + slc.slc.source = "Map Data" + slc.slc.active_target = 20.0 + slc.slc.active_source = "Map Data" + + slc._get_slc_params = lambda: { + "speed_limit_controller": True, + "speed_limit_mode": 3, + "show_speed_limits": False, + "is_metric": True, + "slc_policy": POLICY_MAP_DATA_PRIORITY, + "slc_auto_confirm": False, + "speed_limit_confirmation_higher": False, + "speed_limit_confirmation_lower": False, + "map_speed_lookahead_higher": 5.0, + "map_speed_lookahead_lower": 5.0, + "slc_fallback_experimental_mode": False, + "slc_fallback_set_speed": False, + "slc_fallback_previous_speed_limit": False, + "speed_limit_controller_override_manual": True, + "speed_limit_controller_override_set_speed": False, + "slc_online_filler": False, + } + + v_cruise = 13.5 + sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=13.5, iq_limit=20.0) + out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=13.5, sm=sm) + + assert out > v_cruise + assert out == 20.0 + + +def test_slc_vcruise_does_not_auto_raise_when_higher_confirmation_enabled(): + slc = SLCVCruise() + slc.slc = _FakeSLC() + slc.slc.target = 20.0 + slc.slc.source = "Map Data" + slc.slc.active_target = 20.0 + slc.slc.active_source = "Map Data" + + slc._get_slc_params = lambda: { + "speed_limit_controller": True, + "speed_limit_mode": 3, + "show_speed_limits": False, + "is_metric": True, + "slc_policy": POLICY_MAP_DATA_PRIORITY, + "slc_auto_confirm": False, + "speed_limit_confirmation_higher": True, + "speed_limit_confirmation_lower": False, + "map_speed_lookahead_higher": 5.0, + "map_speed_lookahead_lower": 5.0, + "slc_fallback_experimental_mode": False, + "slc_fallback_set_speed": False, + "slc_fallback_previous_speed_limit": False, + "speed_limit_controller_override_manual": True, + "speed_limit_controller_override_set_speed": False, + "slc_online_filler": False, + } + + v_cruise = 13.5 + sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=13.5, iq_limit=20.0) + out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=13.5, sm=sm) + + assert out == v_cruise + + +@pytest.fixture(params=[True, False], ids=["metric", "imperial"]) +def set_speed_slc(request, monkeypatch): + monkeypatch.setattr("iqpilot.selfdrive.controls.lib.slc_vcruise.Params", FakeParams) + slc = SLCVCruise() + slc._maybe_log_debug = lambda *_args: None + slc.slc.update_gps = lambda _sm: None + slc.slc._resolver.update_map_data = lambda *_args: None + params = _base_slc_params_controller() | { + "speed_limit_controller": True, + "speed_limit_mode": 3, + "show_speed_limits": False, + "is_metric": request.param, + "slc_online_filler": False, + "slc_fallback_experimental_mode": False, + "speed_limit_controller_override_manual": False, + "speed_limit_controller_override_set_speed": True, + } + slc._get_slc_params = lambda: params + unit = CV.KPH_TO_MS if request.param else CV.MPH_TO_MS + slc.slc._resolver.map_speed_limit = 50 * unit + sm = _FakeSM(_build_sm(v_ego_cluster=50 * unit)) + sm["iqCarState"].slcSetSpeedRequestId = 0 + sm["iqCarState"].slcSetSpeedGestureId = 0 + sm["iqCarState"].slcSetSpeedRequestKph = 0.0 + + def step(speed, increase=False, new_gesture=False): + sm["carState"].vCruiseCluster = speed * unit * CV.MS_TO_KPH + if new_gesture: + sm["iqCarState"].slcSetSpeedGestureId += 1 + if increase: + sm["iqCarState"].slcSetSpeedRequestId += 1 + sm["iqCarState"].slcSetSpeedRequestKph = sm["carState"].vCruiseCluster + target = slc.update(sm["selfdriveState"].enabled, None, True, speed * unit, 50 * unit, sm) + return min(speed * unit, target) / unit + + step(50) + return SimpleNamespace(slc=slc, params=params, sm=sm, unit=unit, step=step) + + +@pytest.mark.parametrize("confirm_higher", [False, True]) +def test_set_speed_override_tracks_driver_adjustments(set_speed_slc, confirm_higher): + system = set_speed_slc + system.params["speed_limit_confirmation_higher"] = confirm_higher + assert system.step(50, new_gesture=True) == pytest.approx(50) + assert system.step(55, increase=True) == pytest.approx(55) + assert system.step(60, increase=True) == pytest.approx(60) + assert system.step(60) == pytest.approx(60) + assert system.step(55) == pytest.approx(55) + assert system.step(50) == pytest.approx(50) + assert not system.slc.slc.override_slc + assert system.step(45) == pytest.approx(45) + assert system.step(60) == pytest.approx(50) + assert system.step(61, increase=True, new_gesture=True) == pytest.approx(61) + + +def test_set_speed_override_ignores_automatic_speed_changes(set_speed_slc): + system = set_speed_slc + assert system.step(80) == pytest.approx(50) + system.slc.slc._resolver.map_speed_limit = 60 * system.unit + assert system.step(60) == pytest.approx(60) + assert system.step(80) == pytest.approx(60) + assert system.slc.slc.overridden_speed == 0 + + +@pytest.mark.parametrize("limit", [40, 55]) +def test_set_speed_override_resets_on_accepted_limit(set_speed_slc, limit): + system = set_speed_slc + assert system.step(60, increase=True, new_gesture=True) == pytest.approx(60) + system.slc.slc._resolver.map_speed_limit = limit * system.unit + assert system.step(65, increase=True) == pytest.approx(limit) + assert system.step(70, increase=True) == pytest.approx(limit) + assert system.step(71, increase=True, new_gesture=True) == pytest.approx(71) + + +@pytest.mark.parametrize("limit,button", [(40, "decelCruise"), (55, "accelCruise")]) +def test_set_speed_override_does_not_reuse_confirmation_gesture(set_speed_slc, limit, button): + system = set_speed_slc + system.params["speed_limit_confirmation_higher"] = True + system.params["speed_limit_confirmation_lower"] = True + system.slc.slc._resolver.map_speed_limit = limit * system.unit + system.step(50, new_gesture=True) + assert system.slc.assist_state == custom.IQPlan.SpeedLimit.AssistState.preActive + assert system.step(60, increase=True) == pytest.approx(50) + system.sm["carState"].buttonEvents = [car.CarState.ButtonEvent(type=button, pressed=False)] + assert system.step(61, increase=True) == pytest.approx(limit) + system.sm["carState"].buttonEvents = [] + assert system.step(65, increase=True) == pytest.approx(limit) + assert system.step(66, increase=True, new_gesture=True) == pytest.approx(66) + + +@pytest.mark.parametrize("reset", ["disengage", "information", "off", "missing_limit"]) +def test_set_speed_override_cannot_survive_reset(set_speed_slc, reset): + system = set_speed_slc + assert system.step(60, increase=True, new_gesture=True) == pytest.approx(60) + if reset == "disengage": + system.sm["selfdriveState"].enabled = False + elif reset in ("information", "off"): + system.params["speed_limit_controller"] = False + system.params["show_speed_limits"] = reset == "information" + else: + system.slc.slc._resolver.map_speed_limit = 0 + system.step(60) + assert system.slc.slc.overridden_speed == 0 + system.sm["selfdriveState"].enabled = True + system.params["speed_limit_controller"] = True + system.slc.slc._resolver.map_speed_limit = 50 * system.unit + assert system.step(60) == pytest.approx(50) + assert system.step(65, increase=True) == pytest.approx(50) + assert system.step(66, increase=True, new_gesture=True) == pytest.approx(66) + + +def test_set_speed_override_respects_offset(set_speed_slc): + system = set_speed_slc + system.slc.slc.params.put("speed_limit_offset1", 10) + system.slc.slc.params.put("speed_limit_offset2", 10) + system.slc.slc.params.put("speed_limit_offset3", 10) + system.slc.slc._offset_cache.clear() + system.step(50, new_gesture=True) + assert system.step(52, increase=True) == pytest.approx(52) + assert not system.slc.slc.override_slc + assert system.step(56, increase=True) == pytest.approx(56) + assert system.step(55) == pytest.approx(55) + assert not system.slc.slc.override_slc + + +def test_manual_override_still_requires_accelerator(set_speed_slc): + system = set_speed_slc + system.params["speed_limit_controller_override_set_speed"] = False + system.params["speed_limit_controller_override_manual"] = True + assert system.step(60, increase=True, new_gesture=True) == pytest.approx(50) + system.sm["carState"].gasPressed = True + system.sm["carState"].vEgoCluster = 55 * system.unit + system.slc.slc.update_override(60 * system.unit, 0, 55 * system.unit, 0, system.sm, system.params, system.params["is_metric"]) + assert system.slc.slc.overridden_speed == pytest.approx(55 * system.unit) + system.sm["carState"].gasPressed = False + system.slc.slc.update_override(60 * system.unit, 0, 55 * system.unit, 0, system.sm, system.params, system.params["is_metric"]) + assert system.slc.slc.overridden_speed == pytest.approx(55 * system.unit) + + +@pytest.mark.parametrize("pcm_cruise", [False, True]) +def test_driver_increase_reaches_slc_without_transient_button_events(set_speed_slc, pcm_cruise): + system = set_speed_slc + helper = VCruiseHelper(car.CarParams(pcmCruise=pcm_cruise), custom.IQCarParams(pcmCruiseSpeed=True)) + helper.set_speed_to_limit = False + helper.v_cruise_kph = helper.v_cruise_cluster_kph = 50 * system.unit * CV.MS_TO_KPH + state = car.CarState(cruiseState={"available": True, "speed": 50 * system.unit, "speedCluster": 50 * system.unit}) + helper.update_v_cruise(state, True, system.params["is_metric"]) + state.buttonEvents = [car.CarState.ButtonEvent(type="accelCruise", pressed=True)] + helper.update_v_cruise(state, True, system.params["is_metric"]) + state.buttonEvents = [car.CarState.ButtonEvent(type="accelCruise", pressed=False)] + if pcm_cruise: + state.cruiseState.speed = state.cruiseState.speedCluster = 51 * system.unit + helper.update_v_cruise(state, True, system.params["is_metric"]) + state.buttonEvents = [] + for _ in range(5): + helper.update_v_cruise(state, True, system.params["is_metric"]) + system.sm["iqCarState"] = custom.IQCarState.new_message( + slcSetSpeedRequestId=helper.slc_set_speed_request_id, + slcSetSpeedGestureId=helper.slc_set_speed_gesture_id, + slcSetSpeedRequestKph=helper.slc_set_speed_request_kph, + ) + requested = helper.v_cruise_kph * CV.KPH_TO_MS / system.unit + assert requested > 50 + assert system.step(requested) == pytest.approx(requested) + + +def test_set_speed_override_keeps_navigation_constraint(set_speed_slc): + system = set_speed_slc + assert system.step(60, increase=True, new_gesture=True) == pytest.approx(60) + planner = LongitudinalPlannerIQ.__new__(LongitudinalPlannerIQ) + planner.slimit = system.slc + planner.iq_dynamic = SimpleNamespace( + set_slc_experimental_mode=lambda _mode: None, update=lambda _sm: None, force_stop_requested=lambda: False) + planner.force_stop_timer = 0.0 + planner.override_force_stop_timer = 0.0 + planner.override_force_stop = False + system.sm["iqNavState"] = SimpleNamespace(longitudinalEngaged=False, valid=False) + assert planner.update_targets(system.sm, 50 * system.unit, 60 * system.unit) == pytest.approx(60 * system.unit) + system.sm["iqNavState"] = SimpleNamespace(longitudinalEngaged=True, valid=True, speedTarget=40 * system.unit) + assert planner.update_targets(system.sm, 50 * system.unit, 60 * system.unit) == pytest.approx(40 * system.unit) + + +def test_set_speed_override_cannot_bypass_construction_zone(set_speed_slc): + system = set_speed_slc + assert system.step(60, increase=True, new_gesture=True) == pytest.approx(60) + system.params["construction_zone_assist"] = True + system.params["construction_zone_speed"] = 40 + system.sm["iqConstructionZone"] = SimpleNamespace(active=True) + system.sm.alive["iqConstructionZone"] = True + assert system.step(60) == pytest.approx(40) + assert system.step(65, increase=True, new_gesture=True) == pytest.approx(40) + assert not system.slc.slc.override_slc + + +class _FakeSM(dict): + def __init__(self, services, alive=None): + super().__init__(services) + self.alive = alive or {} + + +def _construction_sm(active=True, alive=True, iq_limit=0.0): + sm = _FakeSM(_build_sm(iq_limit=iq_limit)) + sm["iqConstructionZone"] = SimpleNamespace(active=active, orangeFraction=0.001, secondsSinceHit=1.0) + sm.alive = {"iqConstructionZone": alive} + return sm + + +def _construction_controller(): + params = FakeParams() + controller = SpeedLimitController(params) + controller.update_gps = lambda _sm: None + controller._resolver.update_map_data = lambda *_args, **_kwargs: None + controller.get_mapbox_speed_limit = lambda *_args, **_kwargs: None + controller.mapbox_requests["total_requests"] = 0 + controller.mapbox_requests["max_requests"] = 999999 + return controller + + +def _construction_slc_params(): + slc_params = _base_slc_params_controller() + slc_params["slc_online_filler"] = False + slc_params["construction_zone_assist"] = True + slc_params["construction_zone_speed"] = 60.0 + slc_params["is_metric"] = False + return slc_params + + +def test_construction_zone_clamps_higher_limit(): + controller = _construction_controller() + controller._resolver.map_speed_limit = 31.3 # ~70 mph + sm = _construction_sm() + + controller.update_limits(0.0, None, True, 33.0, 30.0, sm, _construction_slc_params()) + assert controller.active_source == "Construction" + assert abs(controller.active_target - 60.0 * CV.MPH_TO_MS) < 1e-6 + + +def test_construction_zone_does_not_raise_lower_limit(): + controller = _construction_controller() + controller._resolver.map_speed_limit = 20.0 # below the 60 mph clamp + sm = _construction_sm() + + controller.update_limits(0.0, None, True, 33.0, 30.0, sm, _construction_slc_params()) + assert controller.active_source == "Map Data" + assert controller.active_target == 20.0 + + +def test_construction_zone_applies_without_other_sources(): + controller = _construction_controller() + controller._resolver.map_speed_limit = 0.0 + sm = _construction_sm() + + controller.update_limits(0.0, None, True, 33.0, 30.0, sm, _construction_slc_params()) + assert controller.active_source == "Construction" + assert abs(controller.active_target - 60.0 * CV.MPH_TO_MS) < 1e-6 + + +def test_construction_zone_ignored_when_not_alive_or_inactive_or_disabled(): + for kwargs, slc_toggle in ( + (dict(alive=False), True), + (dict(active=False), True), + (dict(), False), + ): + controller = _construction_controller() + controller._resolver.map_speed_limit = 31.3 + sm = _construction_sm(**kwargs) + slc_params = _construction_slc_params() + slc_params["construction_zone_assist"] = slc_toggle + + controller.update_limits(0.0, None, True, 33.0, 30.0, sm, slc_params) + assert controller.active_source == "Map Data" + assert controller.active_target == 31.3 + + +def test_construction_zone_metric_speed_units(): + controller = _construction_controller() + controller._resolver.map_speed_limit = 33.0 + sm = _construction_sm() + slc_params = _construction_slc_params() + slc_params["is_metric"] = True + slc_params["construction_zone_speed"] = 100.0 # kph + + controller.update_limits(0.0, None, True, 36.0, 33.0, sm, slc_params) + assert controller.active_source == "Construction" + assert abs(controller.active_target - 100.0 * CV.KPH_TO_MS) < 1e-6 + + +def test_construction_zone_never_raises_cruise_even_with_auto_raise(): + slc = SLCVCruise() + slc.slc = _FakeSLC() + slc.slc.target = 60.0 * CV.MPH_TO_MS + slc.slc.source = "Construction" + slc.slc.active_target = slc.slc.target + slc.slc.active_source = "Construction" + slc.slc._offset = 2.0 # must be ignored for Construction + + slc._get_slc_params = lambda: { + "speed_limit_controller": True, + "speed_limit_mode": 3, + "show_speed_limits": False, + "is_metric": False, + "slc_policy": POLICY_MAP_DATA_PRIORITY, + "slc_auto_confirm": False, + "speed_limit_confirmation_higher": False, # auto-raise allowed + "speed_limit_confirmation_lower": False, + "map_speed_lookahead_higher": 5.0, + "map_speed_lookahead_lower": 5.0, + "slc_fallback_experimental_mode": False, + "slc_fallback_set_speed": False, + "slc_fallback_previous_speed_limit": False, + "speed_limit_controller_override_manual": True, + "speed_limit_controller_override_set_speed": False, + "slc_online_filler": False, + "construction_zone_assist": True, + "construction_zone_speed": 60.0, + } + + # user cruising below the construction clamp: must not be raised to it + v_cruise = 22.0 + sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=22.0) + out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=22.0, sm=sm) + assert out == v_cruise + assert slc.slc_offset == 0 + + # user cruising above it: clamped down + v_cruise = 33.0 + sm = _build_sm(v_cruise_cluster=v_cruise * CV.MS_TO_KPH, v_ego_cluster=33.0) + out = slc.update(apply_enabled=True, now=None, time_validated=True, v_cruise=v_cruise, v_ego=33.0, sm=sm) + assert abs(out - 60.0 * CV.MPH_TO_MS) < 1e-6 + + +def _offset_controller(pct1=10.0, pct2=5.0, pct3=8.0): + params = FakeParams() + params.put("speed_limit_offset1", pct1) + params.put("speed_limit_offset2", pct2) + params.put("speed_limit_offset3", pct3) + controller = SpeedLimitController(params) + controller._assist.source = "Map Data" + return controller + + +def test_get_offset_percent_per_zone(): + controller = _offset_controller() + + controller._assist.target = 6.7 # ~15 mph -> zone 1 + assert abs(controller.get_offset(False) - 6.7 * 0.10) < 1e-9 + + controller._assist.target = 13.4 # ~30 mph -> zone 2 + assert abs(controller.get_offset(False) - 13.4 * 0.05) < 1e-9 + + controller._assist.target = 31.3 # ~70 mph -> zone 3 (open-ended) + assert abs(controller.get_offset(False) - 31.3 * 0.08) < 1e-9 + + +def test_get_offset_zone_lower_bound_inclusive(): + controller = _offset_controller() + boundary = OFFSET_MAP_IMPERIAL[1][0] + controller._assist.target = boundary + assert abs(controller.get_offset(False) - boundary * 0.05) < 1e-9 + + +def test_get_offset_zero_without_real_limit_source(): + for source in ("None", "Construction"): + controller = _offset_controller() + controller._assist.source = source + controller._assist.target = 30.0 + assert controller.get_offset(False) == 0.0 + + +def test_get_offset_percent_clamped(): + controller = _offset_controller(pct3=500.0) + controller._assist.target = 30.0 + assert abs(controller.get_offset(False) - 30.0 * 0.50) < 1e-9 + + +def test_construction_zone_fires_event_once_per_zone_entry(): + from iqpilot.cereal import custom + event = custom.IQOnroadEvent.EventName.constructionZoneDetected + + controller = _construction_controller() + controller._resolver.map_speed_limit = 31.3 + slc_params = _construction_slc_params() + + controller.update_limits(0.0, None, True, 33.0, 30.0, _construction_sm(), slc_params) + assert event in controller.pending_events + + controller.update_limits(0.0, None, True, 33.0, 30.0, _construction_sm(), slc_params) + assert event not in controller.pending_events + + # zone releases, then a new zone: fires again + controller.update_limits(0.0, None, True, 33.0, 30.0, _construction_sm(active=False), slc_params) + assert event not in controller.pending_events + controller.update_limits(0.0, None, True, 33.0, 30.0, _construction_sm(), slc_params) + assert event in controller.pending_events + + +@pytest.mark.parametrize("alive,valid,limit_valid,limit", [ + (False, True, True, 25.0), (True, False, True, 25.0), (True, True, False, 25.0), + (True, True, True, 0.0), (True, True, True, float("nan")), (True, True, True, float("inf")), +]) +def test_navigation_mapbox_limit_requires_fresh_valid_data(alive, valid, limit_valid, limit): + controller = _construction_controller() + controller.get_tomtom_speed_limit = lambda *_args: None + controller.mapbox_limit = 20.0 + sm = _FakeSM(_build_sm()) + sm["iqNavState"] = custom.IQNavState.new_message(mapboxSpeedLimit=limit, mapboxSpeedLimitValid=limit_valid) + sm.alive["iqNavState"] = alive + sm.valid = {"iqNavState": valid} + controller.update_limits(0, datetime.now(), True, 30, 20, sm, _base_slc_params_controller()) + assert controller.target == pytest.approx(20.0) + assert controller.source == "Mapbox" + + +@pytest.mark.parametrize("policy,expected", [(0, 0.0), (1, 25.0), (2, 25.0)]) +@pytest.mark.parametrize("online_filler", [False, True]) +def test_navigation_mapbox_only_limit_obeys_slc_policy(policy, expected, online_filler): + controller = _construction_controller() + controller.get_tomtom_speed_limit = lambda *_args: None + sm = _FakeSM(_build_sm()) + sm["iqNavState"] = custom.IQNavState.new_message(mapboxSpeedLimit=25.0, mapboxSpeedLimitValid=True) + sm.alive["iqNavState"] = True + sm.valid = {"iqNavState": True} + params = _base_slc_params_controller() | {"slc_policy": policy, "slc_online_filler": online_filler} + controller.update_limits(0, datetime.now(), True, 30, 20, sm, params) + assert controller.target == pytest.approx(expected) + + +def test_navigation_mapbox_limit_requires_confirmation_before_override(set_speed_slc): + system = set_speed_slc + system.params["speed_limit_confirmation_higher"] = True + system.slc.slc._resolver.map_speed_limit = 0 + system.sm["iqNavState"] = custom.IQNavState.new_message(mapboxSpeedLimit=60 * system.unit, mapboxSpeedLimitValid=True) + system.sm.alive["iqNavState"] = True + system.sm.valid = {"iqNavState": True} + system.step(50, new_gesture=True) + assert system.slc.assist_state == custom.IQPlan.SpeedLimit.AssistState.preActive + assert system.step(70, increase=True) == pytest.approx(50) + system.sm["carState"].buttonEvents = [car.CarState.ButtonEvent(type="accelCruise", pressed=False)] + assert system.step(71, increase=True) == pytest.approx(60) + system.sm["carState"].buttonEvents = [] + assert system.step(72, increase=True) == pytest.approx(60) + assert system.step(73, increase=True, new_gesture=True) == pytest.approx(73) diff --git a/iqpilot/selfdrive/controls/lib/tests/test_smooth_stops.py b/iqpilot/selfdrive/controls/lib/tests/test_smooth_stops.py new file mode 100644 index 000000000..f8ca71654 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_smooth_stops.py @@ -0,0 +1,100 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Original concept and implementation by SpysyWeeb (github.com/SpysyWeeb) +""" +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.controls.lib.smooth_stops import ( + SmoothStopController, + read_smooth_stops_enabled, + STANDSTILL_SPEED, + STANDSTILL_HOLD_SPEED, + SETTLE_DECEL, + TAPER_SPEED, + STOP_KISS_DECEL, + SETTLE_JERK, + EMERGENCY_DECEL, +) + +JERK_STEP = SETTLE_JERK * DT_CTRL + + +def _build(enabled=True): + c = SmoothStopController.__new__(SmoothStopController) + c.enabled = enabled + c._v_min = float("inf") + c._stall_s = 0.0 + return c + + +def test_unified_toggle_reads_force_stops(): + seen = {} + + class FakeParams: + def get_bool(self, key): + seen["key"] = key + return True + + assert read_smooth_stops_enabled(FakeParams()) is True + assert seen["key"] == "IQForceStops" + + +def test_hold_only_arms_at_standstill(): + c = _build() + assert not c.want_hold(True, 0.5, False) + assert not c.want_hold(True, STANDSTILL_SPEED + 0.05, False) + assert not c.want_hold(True, 1.0, True) + assert not c.want_hold(True, STANDSTILL_HOLD_SPEED + 0.05, True) + assert c.want_hold(True, STANDSTILL_SPEED - 0.01, False) + assert c.want_hold(True, STANDSTILL_HOLD_SPEED - 0.01, True) + assert not c.want_hold(False, 0.0, True) + + +def test_settle_feathers_toward_baseline(): + c = _build() + out = c.settle(a_target=0.0, v_ego=1.0, lead_distance=0.0, has_lead=False, last_output=0.0) + assert out == -JERK_STEP + + +def test_settle_never_softer_than_mpc(): + c = _build() + out = c.settle(a_target=-2.0, v_ego=1.0, lead_distance=0.0, has_lead=False, last_output=-1.0) + assert out == -1.0 - JERK_STEP + assert out < -1.0 + + +def test_settle_emergency_bypasses_jerk_limit(): + c = _build() + out = c.settle(a_target=-3.4, v_ego=2.0, lead_distance=0.0, has_lead=False, last_output=0.0) + assert out == -3.4 + assert out <= -EMERGENCY_DECEL + + +def test_settle_lead_firms_up_when_close(): + c = _build() + assert c.settle(a_target=0.0, v_ego=1.0, lead_distance=50.0, has_lead=True, last_output=-SETTLE_DECEL) == -SETTLE_DECEL + c = _build() + assert c.settle(a_target=0.0, v_ego=1.0, lead_distance=3.0, has_lead=True, last_output=-1.0) == -1.0 + + +def test_settle_anti_creep_firms_up_when_not_slowing(): + c = _build() + out = c.settle(a_target=0.0, v_ego=0.5, lead_distance=0.0, has_lead=False, last_output=-SETTLE_DECEL) + for _ in range(60): + out = c.settle(a_target=0.0, v_ego=0.5, lead_distance=0.0, has_lead=False, last_output=out) + assert out < -SETTLE_DECEL + + +def test_settle_eases_off_near_stop(): + c = _build() + near = c.settle(a_target=0.0, v_ego=0.1, lead_distance=0.0, has_lead=False, last_output=-0.305) + c = _build() + high = c.settle(a_target=0.0, v_ego=0.9, lead_distance=0.0, has_lead=False, last_output=-0.745) + assert near > high + assert near == -(STOP_KISS_DECEL + (SETTLE_DECEL - STOP_KISS_DECEL) * (0.1 / TAPER_SPEED)) + + +def test_settle_kiss_decel_at_stop(): + c = _build() + out = c.settle(a_target=0.0, v_ego=0.0, lead_distance=0.0, has_lead=False, last_output=-STOP_KISS_DECEL) + assert out == -STOP_KISS_DECEL diff --git a/iqpilot/selfdrive/controls/lib/tests/test_turn_desire_cycling.py b/iqpilot/selfdrive/controls/lib/tests/test_turn_desire_cycling.py new file mode 100644 index 000000000..ce76fa4c8 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/tests/test_turn_desire_cycling.py @@ -0,0 +1,78 @@ +from types import SimpleNamespace + +import pytest + +from iqpilot.cereal import custom, log +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.controls.lib.desire_helper import ( + DesireHelper, + TURN_DESIRE_STOP_CYCLE_TIME, + TURN_DESIRE_STOP_HOLD_TIME, +) + + +TurnDirection = custom.IQTurnSignalDirection + + +def helper(v_ego=0.0, yaw_rate=0.0): + result = DesireHelper.__new__(DesireHelper) + result._last_carstate = SimpleNamespace(vEgo=v_ego, yawRate=yaw_rate) + result.turn_desire_stop_timer = 0.0 + result.turn_desire_stop_active = False + result.turn_desire_cycle_input = log.Desire.none + result.turn_desire_committed = False + result.nav_turn_direction = TurnDirection.none + result.lane_turn_direction = TurnDirection.none + result.lane_change_direction = log.LaneChangeDirection.none + result.lane_change_state = log.LaneChangeState.off + result.desire = log.Desire.none + return result + + +@pytest.mark.parametrize("source", ["manual", "nav"]) +def test_manual_and_nav_turn_desires_receive_rising_edges(source): + h = helper() + if source == "manual": + h.lane_turn_direction = TurnDirection.turnLeft + else: + h.nav_turn_direction = TurnDirection.turnLeft + + outputs = [] + for _ in range(round((TURN_DESIRE_STOP_CYCLE_TIME + 2 * DT_MDL) / DT_MDL)): + h._pick_desire_output() + outputs.append(h.desire) + + gap_index = next(i for i, output in enumerate(outputs) if output == log.Desire.none) + assert gap_index * DT_MDL == pytest.approx(TURN_DESIRE_STOP_HOLD_TIME, abs=DT_MDL * 1.1) + assert log.Desire.turnLeft in outputs[gap_index + 1:] + + +def test_creeping_restarts_stopped_turn_cycle(): + h = helper() + for _ in range(round(TURN_DESIRE_STOP_HOLD_TIME / DT_MDL)): + h._cycle_turn_desire_when_stopped(log.Desire.turnRight) + + h._last_carstate.vEgo = 3.0 + assert h._cycle_turn_desire_when_stopped(log.Desire.turnRight) == log.Desire.turnRight + h._last_carstate.vEgo = 0.0 + assert h._cycle_turn_desire_when_stopped(log.Desire.turnRight) == log.Desire.turnRight + assert h.turn_desire_stop_timer == pytest.approx(DT_MDL) + + +def test_measured_turn_commitment_stops_cycling(): + h = helper() + h._last_carstate.yawRate = -0.1 + assert h._cycle_turn_desire_when_stopped(log.Desire.turnLeft) == log.Desire.turnLeft + h._last_carstate.yawRate = 0.0 + + outputs = [h._cycle_turn_desire_when_stopped(log.Desire.turnLeft) for _ in range(300)] + assert set(outputs) == {log.Desire.turnLeft} + + +def test_new_turn_direction_rearms_cycle_after_commitment(): + h = helper(yaw_rate=0.1) + h._cycle_turn_desire_when_stopped(log.Desire.turnLeft) + h._last_carstate.yawRate = 0.0 + h._cycle_turn_desire_when_stopped(log.Desire.turnRight) + assert h.turn_desire_committed is False + assert h.turn_desire_cycle_input == log.Desire.turnRight diff --git a/iqpilot/selfdrive/controls/plannerd.py b/iqpilot/selfdrive/controls/plannerd.py new file mode 100755 index 000000000..d1cc81411 --- /dev/null +++ b/iqpilot/selfdrive/controls/plannerd.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +from iqpilot.cereal import car, custom +from iqpilot.common.gps import get_gps_location_service +from iqpilot.common.params import Params +from iqpilot.common.realtime import Priority, config_realtime_process +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.controls.lib.ldw import LaneDepartureWarning +from iqpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner +import iqpilot.cereal.messaging as messaging + + +def main(): + config_realtime_process(5, Priority.CTRL_LOW) + + cloudlog.info("plannerd is waiting for CarParams") + params = Params() + CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams) + cloudlog.info("plannerd got CarParams: %s", CP.brand) + + cloudlog.info("plannerd is waiting for IQCarParams") + CP_IQ = messaging.log_from_bytes(params.get("IQCarParams", block=True), custom.IQCarParams) + cloudlog.info("plannerd got IQCarParams") + + gps_location_service = get_gps_location_service(params) + + ldw = LaneDepartureWarning() + longitudinal_planner = LongitudinalPlanner(CP, CP_IQ) + pm = messaging.PubMaster(['longitudinalPlan', 'driverAssistance', 'iqPlan']) + # poll modelV2 (stock): the whole loop body is gated on sm.updated['modelV2'], so a + # carState poll only makes carState the polled service with strict 100Hz receive bounds — + # each 20Hz planner iteration (>10ms) then swallows conflated carState messages, freq_ok + # drops below 80Hz, and every published plan goes event-invalid (commIssue, long degraded). + sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'vehicleParameters', 'radarState', 'modelV2', 'selfdriveState', + 'iqLiveLocation', 'iqLiveData', 'iqNavState', 'iqCarState', 'iqConstructionZone', gps_location_service], + poll='modelV2') + + while True: + sm.update() + if sm.updated['modelV2']: + longitudinal_planner.update(sm) + longitudinal_planner.publish(sm, pm) + + ldw.update(sm.frame, sm['modelV2'], sm['carState'], sm['carControl']) + msg = messaging.new_message('driverAssistance') + msg.valid = sm.all_checks(['carState', 'carControl', 'modelV2', 'vehicleParameters']) + msg.driverAssistance.leftLaneDeparture = ldw.left + msg.driverAssistance.rightLaneDeparture = ldw.right + pm.send('driverAssistance', msg) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/controls/radard.py b/iqpilot/selfdrive/controls/radard.py new file mode 100755 index 000000000..f698ffcb4 --- /dev/null +++ b/iqpilot/selfdrive/controls/radard.py @@ -0,0 +1,465 @@ +#!/usr/bin/env python3 +import math +import numpy as np +from collections import deque +from typing import Any + +import capnp +from iqpilot.cereal import messaging, log, car, custom +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL, Priority, config_realtime_process +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.simple_kalman import KF1D + +from iqdbc.car import structs +from iqdbc.car.honda.values import HONDA_RADAR_SCAN_CAPABLE +from iqdbc.car.hyundai.values import HyundaiFlags, HyundaiFlagsIQ +from iqpilot.selfdrive.controls.lib.custom_stop_distance import CustomStopDistance + + +# Default lead acceleration decay set to 50% at 1s +_LEAD_ACCEL_TAU = 1.5 + +# radar tracks +SPEED, ACCEL = 0, 1 # Kalman filter states enum + +# stationary qualification parameters +V_EGO_STATIONARY = 4. # no stationary object flag below this speed + +RADAR_TO_CENTER = 2.7 # (deprecated) RADAR is ~ 2.7m ahead from center of car +RADAR_TO_CAMERA = 1.52 # RADAR is ~ 1.5m ahead from center of mesh frame + +# Honda radar object scan: 15Hz sweeps consumed at the 20Hz model rate, so measurement absorption is +# gated on fresh sweep data and lead selection carries continuity/staleness evidence +SCAN_SWEEP_DT = 1.0 / 15 +SCAN_LEAD_PROB = 0.35 +SCAN_LEAD_MIN_CYCLES = 3 +SCAN_CHALLENGER_STALE_CYCLES = 2 +SCAN_DISTANCE_STALE_CYCLES = 3 +SCAN_DISTANCE_STALE_M = 25.0 + + +def uses_scan_radar(CP) -> bool: + return CP.brand == "honda" and CP.carFingerprint in HONDA_RADAR_SCAN_CAPABLE and not CP.radarUnavailable + + +class KalmanParams: + def __init__(self, dt: float): + # Lead Kalman Filter params, calculating K from A, C, Q, R requires the control library. + # hardcoding a lookup table to compute K for values of radar_ts between 0.01s and 0.2s + assert dt > .01 and dt < .2, "Radar time step must be between .01s and 0.2s" + self.A = [[1.0, dt], [0.0, 1.0]] + self.C = [1.0, 0.0] + #Q = np.matrix([[10., 0.0], [0.0, 100.]]) + #R = 1e3 + #K = np.matrix([[ 0.05705578], [ 0.03073241]]) + dts = [i * 0.01 for i in range(1, 21)] + K0 = [0.12287673, 0.14556536, 0.16522756, 0.18281627, 0.1988689, 0.21372394, + 0.22761098, 0.24069424, 0.253096, 0.26491023, 0.27621103, 0.28705801, + 0.29750003, 0.30757767, 0.31732515, 0.32677158, 0.33594201, 0.34485814, + 0.35353899, 0.36200124] + K1 = [0.29666309, 0.29330885, 0.29042818, 0.28787125, 0.28555364, 0.28342219, + 0.28144091, 0.27958406, 0.27783249, 0.27617149, 0.27458948, 0.27307714, + 0.27162685, 0.27023228, 0.26888809, 0.26758976, 0.26633338, 0.26511557, + 0.26393339, 0.26278425] + self.K = [[np.interp(dt, dts, K0)], [np.interp(dt, dts, K1)]] + + +class Track: + def __init__(self, identifier: int, v_lead: float, kalman_params: KalmanParams): + self.identifier = identifier + self.cnt = 0 + self.aLeadTau = FirstOrderFilter(_LEAD_ACCEL_TAU, 0.45, DT_MDL) + self.K_A = kalman_params.A + self.K_C = kalman_params.C + self.K_K = kalman_params.K + self.kf = KF1D([[v_lead], [0.0]], self.K_A, self.K_C, self.K_K) + + def update(self, d_rel: float, y_rel: float, v_rel: float, v_lead: float, measured: float, + absorb_measurement: bool = True): + # relative values, copy + self.dRel = d_rel # LONG_DIST + self.yRel = y_rel # -LAT_DIST + self.vRel = v_rel # REL_SPEED + self.vLead = v_lead + self.measured = measured # measured or estimate + + # a repeated scan payload between 15Hz sweeps must not be absorbed as a second measurement + if absorb_measurement and self.cnt > 0: + self.kf.update(self.vLead) + + self.vLeadK = float(self.kf.x[SPEED][0]) + self.aLeadK = float(self.kf.x[ACCEL][0]) + + if absorb_measurement: + # Learn if constant acceleration + if abs(self.aLeadK) < 0.5: + self.aLeadTau.x = _LEAD_ACCEL_TAU + else: + self.aLeadTau.update(0.0) + + self.cnt += 1 + + def get_RadarState(self, model_prob: float = 0.0): + return { + "dRel": float(self.dRel), + "yRel": float(self.yRel), + "vRel": float(self.vRel), + "vLead": float(self.vLead), + "vLeadK": float(self.vLeadK), + "aLeadK": float(self.aLeadK), + "aLeadTau": float(self.aLeadTau.x), + "status": True, + "fcw": self.is_potential_fcw(model_prob), + "modelProb": model_prob, + "radar": True, + "radarTrackId": self.identifier, + } + + def potential_low_speed_lead(self, v_ego: float): + # stop for stuff in front of you and low speed, even without model confirmation + # Radar points closer than 0.75, are almost always glitches on toyota radars + return abs(self.yRel) < 1.0 and (v_ego < V_EGO_STATIONARY) and (0.75 < self.dRel < 25) + + def is_potential_fcw(self, model_prob: float): + return model_prob > .9 + + def __str__(self): + ret = f"x: {self.dRel:4.1f} y: {self.yRel:4.1f} v: {self.vRel:4.1f} a: {self.aLeadK:4.1f}" + return ret + + +def laplacian_pdf(x: float, mu: float, b: float): + b = max(b, 1e-4) + return math.exp(-abs(x-mu)/b) + + +def model_association_score(track: Track, lead: capnp._DynamicStructReader, v_ego: float) -> float: + offset_vision_dist = lead.x[0] - RADAR_TO_CAMERA + prob_d = laplacian_pdf(track.dRel, offset_vision_dist, lead.xStd[0]) + prob_y = laplacian_pdf(track.yRel, -lead.y[0], lead.yStd[0]) + prob_v = laplacian_pdf(track.vRel + v_ego, lead.v[0], lead.vStd[0]) + + # This isn't exactly right, but it's a good heuristic + return prob_d * prob_y * prob_v + + +def track_agrees_with_model(track: Track, lead: capnp._DynamicStructReader, v_ego: float, strict: bool) -> bool: + dist_scale, dist_floor, vel_limit, y_std_scale, y_floor = \ + (0.25, 5.0, 10.0, 1.0, 1.0) if strict else (0.40, 8.0, 13.0, 2.0, 1.5) + vision_dist = lead.x[0] - RADAR_TO_CAMERA + dist_ok = abs(track.dRel - vision_dist) < max(abs(vision_dist) * dist_scale, dist_floor) + vel_ok = (abs(track.vRel + v_ego - lead.v[0]) < vel_limit) or (v_ego + track.vRel > 3) + lat_ok = abs(track.yRel + lead.y[0]) < max(y_floor, y_std_scale * max(float(lead.yStd[0]), 0.2)) + return dist_ok and vel_ok and lat_ok + + +def scan_low_speed_candidate(track: Track, v_ego: float) -> bool: + # require a few real cycles before a radar-only low-speed takeover + return track.cnt >= SCAN_LEAD_MIN_CYCLES and track.potential_low_speed_lead(v_ego) + + +def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, tracks: dict[int, Track]): + offset_vision_dist = lead.x[0] - RADAR_TO_CAMERA + + track = max(tracks.values(), key=lambda c: model_association_score(c, lead, v_ego)) + + # if no 'sane' match is found return -1 + # stationary radar points can be false positives + dist_sane = abs(track.dRel - offset_vision_dist) < max([(offset_vision_dist)*.25, 5.0]) + vel_sane = (abs(track.vRel + v_ego - lead.v[0]) < 10) or (v_ego + track.vRel > 3) + if dist_sane and vel_sane: + return track + else: + return None + + +def get_RadarState_from_vision(lead_msg: capnp._DynamicStructReader, v_ego: float, model_v_ego: float): + lead_v_rel_pred = lead_msg.v[0] - model_v_ego + return { + "dRel": float(lead_msg.x[0] - RADAR_TO_CAMERA), + "yRel": float(-lead_msg.y[0]), + "vRel": float(lead_v_rel_pred), + "vLead": float(v_ego + lead_v_rel_pred), + "vLeadK": float(v_ego + lead_v_rel_pred), + "aLeadK": float(lead_msg.a[0]), + "aLeadTau": 0.3, + "fcw": False, + "modelProb": float(lead_msg.prob), + "status": True, + "radar": False, + "radarTrackId": -1, + } + + +def get_lead(v_ego: float, ready: bool, tracks: dict[int, Track], lead_msg: capnp._DynamicStructReader, + model_v_ego: float, CP: structs.CarParams, CP_IQ: structs.IQCarParams, low_speed_override: bool = True, + scan_radar: bool = False, filtered_prob: float | None = None, held_track_id: int = -1) -> dict[str, Any]: + lead_prob = float(lead_msg.prob if filtered_prob is None else filtered_prob) + prob_threshold = SCAN_LEAD_PROB if scan_radar else .5 + + # Determine leads, this is where the essential logic happens + if len(tracks) > 0 and ready and lead_prob > prob_threshold: + track = match_vision_to_track(v_ego, lead_msg, tracks) + else: + track = None + + lead_dict = {'status': False} + if track is not None: + lead_dict = track.get_RadarState(lead_prob) + lead_dict = get_custom_yrel(CP, CP_IQ, lead_dict, lead_msg) + elif (track is None) and ready and (lead_prob > prob_threshold): + lead_dict = get_RadarState_from_vision(lead_msg, v_ego, model_v_ego) + + if low_speed_override: + if scan_radar: + low_speed_tracks = [c for c in tracks.values() if scan_low_speed_candidate(c, v_ego)] + else: + low_speed_tracks = [c for c in tracks.values() if c.potential_low_speed_lead(v_ego)] + + model_lead_available = ready and lead_prob > prob_threshold + + if scan_radar: + # Keep the held radar lead through ordinary model-probability fluctuations while it stays + # coherent. With a valid model lead it must still agree with it; without one, a mature radar + # track remains eligible for continuity + held = tracks.get(held_track_id) + if held is not None and scan_low_speed_candidate(held, v_ego): + held_matches_model = (not model_lead_available or + track_agrees_with_model(held, lead_msg, v_ego, strict=True)) + held_is_current = (not lead_dict.get('status', False) or + lead_dict.get('radarTrackId', -1) == held_track_id or + (lead_dict.get('status', False) and not lead_dict.get('radar', False))) + if held_is_current and held_matches_model: + lead_dict = held.get_RadarState(lead_prob) + + def candidate_established(candidate: Track) -> bool: + if candidate.cnt < SCAN_LEAD_MIN_CYCLES: + return False + if not lead_dict.get('status', False): + # a mature centered scan point may provide the radar-only low-speed lead + return True + if lead_dict.get('radarTrackId', -1) == candidate.identifier: + return True + # never replace an established lead with an unrelated closer point without model evidence + # to arbitrate them + return model_lead_available and track_agrees_with_model(candidate, lead_msg, v_ego, strict=True) + + low_speed_tracks = [c for c in low_speed_tracks if candidate_established(c)] + + if len(low_speed_tracks) > 0: + closest_track = min(low_speed_tracks, key=lambda c: c.dRel) + + # Only choose new track if it is actually closer than the previous one + if (not lead_dict['status']) or (closest_track.dRel < lead_dict['dRel']): + lead_dict = closest_track.get_RadarState() + + return lead_dict + + +def get_custom_yrel(CP: structs.CarParams, CP_IQ: structs.IQCarParams, lead_dict: dict[str, Any], + lead_msg: capnp._DynamicStructReader) -> dict[str, Any]: + if CP.brand == "hyundai" and (CP_IQ.flags & HyundaiFlagsIQ.ENHANCED_SCC or + CP.flags & (HyundaiFlags.CANFD_CAMERA_SCC | HyundaiFlags.CAMERA_SCC)): + lead_dict['yRel'] = float(-lead_msg.y[0]) + + return lead_dict + + +class RadarD: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.CarParams, delay: float = 0.0): + self.CP = CP + self.CP_IQ = CP_IQ + + self.current_time = 0.0 + + self.tracks: dict[int, Track] = {} + self.scan_radar = uses_scan_radar(CP) + # the lead KF absorbs scan measurements at the physical 15Hz sweep cadence; lead probability + # filtering stays on model-loop timing + self.kalman_params = KalmanParams(SCAN_SWEEP_DT if self.scan_radar else DT_MDL) + self.lead_prob_filters = [FirstOrderFilter(0.0, 0.2, DT_MDL) for _ in range(2)] + self.held_lead_ids = [-1, -1] + self._held_evidence_ids = [-1, -1] + self._challenger_stale_counts = [0, 0] + self._distance_stale_counts = [0, 0] + self._last_tracks_frame = -1 + + self.v_ego = 0.0 + self.v_ego_hist = deque([0.0], maxlen=int(round(delay / DT_MDL))+1) + self.last_v_ego_frame = -1 + + self.radar_state: capnp._DynamicStructBuilder | None = None + self.radar_state_valid = False + + self.ready = False + + self.custom_stop_distance = CustomStopDistance() + + def _refresh_held_lead_evidence(self, lead_index: int, lead: capnp._DynamicStructReader, + lead_prob: float) -> None: + held_id = self.held_lead_ids[lead_index] + if self._held_evidence_ids[lead_index] != held_id: + self._reset_held_evidence(lead_index, held_id) + + held = self.tracks.get(held_id) + if held_id < 0 or held is None or not self.ready or lead_prob <= SCAN_LEAD_PROB: + self._reset_held_evidence(lead_index, held_id) + return + + strict_match = track_agrees_with_model(held, lead, self.v_ego, strict=True) + relaxed_match = track_agrees_with_model(held, lead, self.v_ego, strict=False) + + # evidence arm 1: another live track scores better against the model while the held one no + # longer passes even relaxed continuity. Releasing the hold never selects that challenger; the + # strict-match path in get_lead stays the only way it becomes the radar lead + if relaxed_match: + self._challenger_stale_counts[lead_index] = 0 + else: + best = max(self.tracks.values(), key=lambda c: model_association_score(c, lead, self.v_ego)) + if best.identifier != held_id and \ + model_association_score(best, lead, self.v_ego) > model_association_score(held, lead, self.v_ego): + self._challenger_stale_counts[lead_index] += 1 + else: + self._challenger_stale_counts[lead_index] = 0 + + # evidence arm 2: gross absolute range disagreement, with a strict match staying authoritative + # even when model uncertainty would permit the error + distance_mismatch = abs(held.dRel - (lead.x[0] - RADAR_TO_CAMERA)) + if strict_match: + self._distance_stale_counts[lead_index] = 0 + elif distance_mismatch > SCAN_DISTANCE_STALE_M: + self._distance_stale_counts[lead_index] += 1 + else: + self._distance_stale_counts[lead_index] = 0 + + if (self._challenger_stale_counts[lead_index] >= SCAN_CHALLENGER_STALE_CYCLES or + self._distance_stale_counts[lead_index] >= SCAN_DISTANCE_STALE_CYCLES): + self.held_lead_ids[lead_index] = -1 + self._reset_held_evidence(lead_index) + + def _reset_held_evidence(self, lead_index: int, held_id: int = -1) -> None: + self._held_evidence_ids[lead_index] = held_id + self._challenger_stale_counts[lead_index] = 0 + self._distance_stale_counts[lead_index] = 0 + + def update(self, sm: messaging.SubMaster, rr: car.RadarData): + self.ready = sm.seen['modelV2'] + self.current_time = 1e-9*max(sm.logMonoTime.values()) + self.custom_stop_distance.update() + + if sm.recv_frame['carState'] != self.last_v_ego_frame: + self.v_ego = sm['carState'].vEgo + self.v_ego_hist.append(self.v_ego) + self.last_v_ego_frame = sm.recv_frame['carState'] + + sweep_fresh = True + if self.scan_radar: + sweep_fresh = sm.recv_frame['radarTracks'] != self._last_tracks_frame + self._last_tracks_frame = sm.recv_frame['radarTracks'] + + ar_pts = {pt.trackId: [pt.dRel, pt.yRel, pt.vRel, pt.measured] for pt in rr.points} + + # *** remove missing points from meta data *** + for ids in list(self.tracks.keys()): + if ids not in ar_pts: + self.tracks.pop(ids, None) + + # *** compute the tracks *** + for ids in ar_pts: + rpt = ar_pts[ids] + + # align v_ego by a fixed time to align it with the radar measurement + v_lead = rpt[2] + self.v_ego_hist[0] + + # create the track if it doesn't exist or it's a new track + if ids not in self.tracks: + self.tracks[ids] = Track(ids, v_lead, self.kalman_params) + if self.scan_radar: + measured = bool(rpt[3] and sweep_fresh) + self.tracks[ids].update(rpt[0], rpt[1], rpt[2], v_lead, measured, absorb_measurement=measured) + else: + self.tracks[ids].update(rpt[0], rpt[1], rpt[2], v_lead, rpt[3]) + + # *** publish radarState *** + self.radar_state_valid = sm.all_checks() + self.radar_state = log.RadarState.new_message() + self.radar_state.mdMonoTime = sm.logMonoTime['modelV2'] + self.radar_state.radarErrors = rr.errors + self.radar_state.carStateMonoTime = sm.logMonoTime['carState'] + + if len(sm['modelV2'].velocity.x): + model_v_ego = sm['modelV2'].velocity.x[0] + else: + model_v_ego = self.v_ego + leads_v3 = sm['modelV2'].leadsV3 + if len(leads_v3) > 1: + if self.scan_radar: + for i in range(2): + lead_prob = float(leads_v3[i].prob) + # probability rises instantly, decays filtered: a one-cycle model dip must not drop the lead + if lead_prob > self.lead_prob_filters[i].x: + self.lead_prob_filters[i].x = lead_prob + else: + self.lead_prob_filters[i].update(lead_prob) + self._refresh_held_lead_evidence(i, leads_v3[i], self.lead_prob_filters[i].x) + + lead_one = get_lead(self.v_ego, self.ready, self.tracks, leads_v3[0], model_v_ego, self.CP, self.CP_IQ, + low_speed_override=True, scan_radar=True, filtered_prob=self.lead_prob_filters[0].x, + held_track_id=self.held_lead_ids[0]) + lead_two = get_lead(self.v_ego, self.ready, self.tracks, leads_v3[1], model_v_ego, self.CP, self.CP_IQ, + low_speed_override=False, scan_radar=True, filtered_prob=self.lead_prob_filters[1].x, + held_track_id=self.held_lead_ids[1]) + + for i, lead in enumerate((lead_one, lead_two)): + if lead.get('status', False) and lead.get('radar', False): + track_id = int(lead.get('radarTrackId', -1)) + if track_id != self.held_lead_ids[i]: + self._reset_held_evidence(i, track_id) + self.held_lead_ids[i] = track_id + elif (not lead.get('status', False)) or (self.held_lead_ids[i] not in self.tracks): + self.held_lead_ids[i] = -1 + else: + lead_one = get_lead(self.v_ego, self.ready, self.tracks, leads_v3[0], model_v_ego, self.CP, self.CP_IQ, low_speed_override=True) + lead_two = get_lead(self.v_ego, self.ready, self.tracks, leads_v3[1], model_v_ego, self.CP, self.CP_IQ, low_speed_override=False) + self.radar_state.leadOne = self.custom_stop_distance.apply_lead(lead_one) + self.radar_state.leadTwo = self.custom_stop_distance.apply_lead(lead_two) + + def publish(self, pm: messaging.PubMaster): + assert self.radar_state is not None + + radar_msg = messaging.new_message("radarState") + radar_msg.valid = self.radar_state_valid + radar_msg.radarState = self.radar_state + pm.send("radarState", radar_msg) + + +# fuses camera and radar data for best lead detection +def main() -> None: + config_realtime_process(5, Priority.CTRL_LOW) + + # wait for stats about the car to come in from controls + cloudlog.info("radard is waiting for CarParams") + CP = messaging.log_from_bytes(Params().get("CarParams", block=True), car.CarParams) + cloudlog.info("radard got CarParams") + + cloudlog.info("radard is waiting for IQCarParams") + CP_IQ = messaging.log_from_bytes(Params().get("IQCarParams", block=True), custom.IQCarParams) + cloudlog.info("radard got IQCarParams") + + # *** setup messaging + sm = messaging.SubMaster(['modelV2', 'carState', 'radarTracks'], poll='modelV2') + pm = messaging.PubMaster(['radarState']) + + RD = RadarD(CP, CP_IQ, CP.radarDelay) + + while 1: + sm.update() + + RD.update(sm, sm['radarTracks']) + RD.publish(pm) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/controls/steering_fault_recovery.py b/iqpilot/selfdrive/controls/steering_fault_recovery.py new file mode 100644 index 000000000..191161e3e --- /dev/null +++ b/iqpilot/selfdrive/controls/steering_fault_recovery.py @@ -0,0 +1,18 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.common.realtime import DT_CTRL + +STEER_FAULT_RECOVERY_FRAMES = int(1.0 / DT_CTRL) + + +class SteeringFaultRecovery: + def __init__(self) -> None: + self.clear_frames = STEER_FAULT_RECOVERY_FRAMES + + def update(self, temporary: bool, permanent: bool) -> bool: + if temporary or permanent: + self.clear_frames = 0 + else: + self.clear_frames = min(self.clear_frames + 1, STEER_FAULT_RECOVERY_FRAMES) + return self.clear_frames == STEER_FAULT_RECOVERY_FRAMES diff --git a/iqpilot/selfdrive/controls/tests/__init__.py b/iqpilot/selfdrive/controls/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/controls/tests/test_drive_helpers.py b/iqpilot/selfdrive/controls/tests/test_drive_helpers.py new file mode 100644 index 000000000..c022c4b01 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_drive_helpers.py @@ -0,0 +1,20 @@ +import pytest + +from iqpilot.selfdrive.controls.lib.drive_helpers import DEFAULT_STOPPING_SPEED, should_stop + + +class TestShouldStop: + @pytest.mark.parametrize("v_ego, expected", [ + (DEFAULT_STOPPING_SPEED - 0.01, True), + (DEFAULT_STOPPING_SPEED, False), + ]) + def test_upstream_default(self, v_ego, expected): + assert should_stop(v_ego, -0.1) == expected + + @pytest.mark.parametrize("stopping_speed", [0.55 / 3.6, 1.5 / 3.6]) + def test_car_override(self, stopping_speed): + assert should_stop(stopping_speed - 0.01, -0.1, stopping_speed) + assert not should_stop(stopping_speed, -0.1, stopping_speed) + + def test_requires_deceleration(self): + assert not should_stop(0.0, 0.1, 1.0) diff --git a/iqpilot/selfdrive/controls/tests/test_following_distance.py b/iqpilot/selfdrive/controls/tests/test_following_distance.py new file mode 100644 index 000000000..4b7410f06 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_following_distance.py @@ -0,0 +1,46 @@ +import pytest +import itertools +from parameterized import parameterized_class + +from iqpilot.cereal import log + +from iqpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import get_safe_obstacle_distance, get_stopped_equivalence_factor, get_T_FOLLOW +from iqpilot.selfdrive.test.longitudinal_maneuvers.maneuver import Maneuver + + +def desired_follow_distance(v_ego, v_lead, t_follow=None): + if t_follow is None: + t_follow = get_T_FOLLOW() + return get_safe_obstacle_distance(v_ego, t_follow) - get_stopped_equivalence_factor(v_lead) + +def run_following_distance_simulation(v_lead, t_end=100.0, e2e=False, personality=0): + man = Maneuver( + '', + duration=t_end, + initial_speed=float(v_lead), + lead_relevancy=True, + initial_distance_lead=100, + speed_lead_values=[v_lead], + breakpoints=[0.], + e2e=e2e, + personality=personality, + ) + valid, output = man.evaluate() + assert valid + return output[-1,2] - output[-1,1] + + +@parameterized_class(("e2e", "personality", "speed"), itertools.product( + [True, False], # e2e + [log.LongitudinalPersonality.relaxed, # personality + log.LongitudinalPersonality.standard, + log.LongitudinalPersonality.aggressive], + [0,10,35])) # speed +class TestFollowingDistance: + def test_following_distance(self): + v_lead = float(self.speed) + simulation_steady_state = run_following_distance_simulation(v_lead, e2e=self.e2e, personality=self.personality) + correct_steady_state = desired_follow_distance(v_lead, v_lead, get_T_FOLLOW(self.personality)) + err_ratio = 0.2 if self.e2e else 0.1 + abs_err_margin = 0.5 if v_lead > 0.0 else 1.15 + assert simulation_steady_state == pytest.approx(correct_steady_state, abs=err_ratio * correct_steady_state + abs_err_margin) diff --git a/iqpilot/selfdrive/controls/tests/test_lat_jerk_lowpass.py b/iqpilot/selfdrive/controls/tests/test_lat_jerk_lowpass.py new file mode 100644 index 000000000..aa847ce42 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_lat_jerk_lowpass.py @@ -0,0 +1,81 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import numpy as np + +from iqpilot.cereal import car, log +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.toyota.values import CAR as TOYOTA +from iqdbc.car.vehicle_model import VehicleModel +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque +from iqpilot.selfdrive.car.helpers import convert_to_capnp +from iqpilot.selfdrive.car import interfaces as iqpilot_interfaces +from iqpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N + +CAR_NAME = TOYOTA.TOYOTA_COROLLA_TSS2 + + +def _brain(): + CI_cls = interfaces[CAR_NAME] + CP = CI_cls.get_non_essential_params(CAR_NAME) + CP_IQ = CI_cls.get_non_essential_params_iq(CP, CAR_NAME) + CI = CI_cls(CP, CP_IQ) + iqpilot_interfaces.apply_iq_car_config(CI) + ctrl = LatControlTorque(CP.as_reader(), convert_to_capnp(CP_IQ).as_reader(), CI, DT_CTRL) + return ctrl.nnff_assist, VehicleModel(CP) + + +def _model(rng): + # same-sign accel ramp (so sign_locked_min yields a real jerk) whose slope jitters frame to + # frame the way a spatial big model's path does — this is what drives jerk_ahead to swing. + n = max(CONTROL_N, 33) + slope = abs(0.5 + rng.normal(0, 0.25)) + m = log.ModelDataV2.new_message() + m.acceleration.y = (slope * np.arange(n) * 0.1).tolist() + m.orientation.x = [0.0] * n + return m + + +def _cs(): + cs = car.CarState.new_message() + cs.vEgo = 25.0 + cs.steeringRateDeg = 0.0 + return cs + + +def _run(lp_on): + brain, VM = _brain() + rng = np.random.default_rng(7) + cs = _cs() + out = [] + for _ in range(400): + brain.update_model_v2(_model(rng)) + if not lp_on: + brain._jerk_lp.update = lambda x: x # bypass low-pass == pre-fix behavior + brain.update_calculations(cs, VM, 0.0) + out.append(brain.jerk_ahead) + return np.array(out) + + +def test_lowpass_cuts_jerk_command_swing(): + old = _run(lp_on=False) + new = _run(lp_on=True) + # the path must actually exercise the jerk feed-forward (guard against a vacuous test) + assert np.abs(np.diff(old)).mean() > 0.02, "input did not exercise jerk_ahead" + old_swing = np.abs(np.diff(old)).mean() + new_swing = np.abs(np.diff(new)).mean() + # low-pass must cut the frame-to-frame jerk swing (the wheel oscillation) by a large margin + assert new_swing < 0.3 * old_swing, (old_swing, new_swing) + + +def test_gain_zero_matches_stock(): + brain, VM = _brain() + brain._jerk_param_ok = False + brain._jerk_gain = 0.0 + rng = np.random.default_rng(1) + cs = _cs() + for _ in range(60): + brain.update_model_v2(_model(rng)) + brain.update_calculations(cs, VM, 0.0) + assert brain.jerk_ahead == 0.0 # no model-jerk term == sunny/stock feedforward diff --git a/iqpilot/selfdrive/controls/tests/test_latcontrol.py b/iqpilot/selfdrive/controls/tests/test_latcontrol.py new file mode 100644 index 000000000..7f5ee6e28 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_latcontrol.py @@ -0,0 +1,140 @@ +from parameterized import parameterized + +from iqpilot.cereal import car, log +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.honda.values import CAR as HONDA +from iqdbc.car.toyota.values import CAR as TOYOTA +from iqdbc.car.nissan.values import CAR as NISSAN +from iqdbc.car.gm.values import CAR as GM +from iqdbc.car.volkswagen.values import CAR as VOLKSWAGEN +from iqdbc.car.vehicle_model import VehicleModel +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.car.helpers import convert_to_capnp +from iqpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID +from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque +from iqpilot.selfdrive.controls.lib.latcontrol_torque_pq import LatControlTorquePQ +from iqpilot.selfdrive.controls.lib.latcontrol_torque_v0 import LatControlTorqueV0, is_vw_mqb_torque +import iqpilot.selfdrive.controls.lib.latcontrol_torque_pq as latcontrol_torque_pq +from iqpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle +from iqpilot.selfdrive.locationd.helpers import Pose +from iqpilot.common.mock.generators import generate_deviceMotion +from iqpilot.selfdrive.car import interfaces as iqpilot_interfaces + + +class TestLatControl: + + @staticmethod + def build_pq_controller(): + car_name = TOYOTA.TOYOTA_RAV4 + CarInterface = interfaces[car_name] + CP = CarInterface.get_non_essential_params(car_name) + CP_IQ = CarInterface.get_non_essential_params_iq(CP, car_name) + CI = CarInterface(CP, CP_IQ) + iqpilot_interfaces.apply_iq_car_config(CI) + return CP, LatControlTorquePQ(CP.as_reader(), convert_to_capnp(CP_IQ).as_reader(), CI, DT_CTRL) + + @staticmethod + def build_v0_controller(): + car_name = TOYOTA.TOYOTA_RAV4 + CarInterface = interfaces[car_name] + CP = CarInterface.get_non_essential_params(car_name) + CP_IQ = CarInterface.get_non_essential_params_iq(CP, car_name) + CI = CarInterface(CP, CP_IQ) + iqpilot_interfaces.apply_iq_car_config(CI) + return CP, LatControlTorqueV0(CP.as_reader(), convert_to_capnp(CP_IQ).as_reader(), CI, DT_CTRL) + + @parameterized.expand([(HONDA.HONDA_CIVIC, LatControlPID), (TOYOTA.TOYOTA_RAV4, LatControlTorque), (TOYOTA.TOYOTA_RAV4, LatControlTorqueV0), + (NISSAN.NISSAN_LEAF, LatControlAngle), (GM.CHEVROLET_BOLT_EUV, LatControlTorque)]) + def test_saturation(self, car_name, controller): + CarInterface = interfaces[car_name] + CP = CarInterface.get_non_essential_params(car_name) + CP_IQ = CarInterface.get_non_essential_params_iq(CP, car_name) + CI = CarInterface(CP, CP_IQ) + iqpilot_interfaces.apply_iq_car_config(CI) + CP_IQ = convert_to_capnp(CP_IQ) + VM = VehicleModel(CP) + + controller = controller(CP.as_reader(), CP_IQ.as_reader(), CI, DT_CTRL) + + CS = car.CarState.new_message() + CS.vEgo = 30 + CS.steeringPressed = False + + params = log.VehicleParameters.new_message() + + lp = generate_deviceMotion() + pose = Pose.from_live_pose(lp.deviceMotion) + + # Saturate for curvature limited and controller limited + for _ in range(1000): + _, _, lac_log = controller.update(True, CS, VM, params, False, 0, pose, True, 0.2) + assert lac_log.saturated + + for _ in range(1000): + _, _, lac_log = controller.update(True, CS, VM, params, False, 0, pose, False, 0.2) + assert not lac_log.saturated + + for _ in range(1000): + _, _, lac_log = controller.update(True, CS, VM, params, False, 1, pose, False, 0.2) + assert lac_log.saturated + + def test_pq_controller_update(self): + CP, controller = self.build_pq_controller() + VM = VehicleModel(CP) + + CS = car.CarState.new_message() + CS.vEgo = 30 + params = log.VehicleParameters.new_message() + pose = Pose.from_live_pose(generate_deviceMotion().deviceMotion) + + _, _, lac_log = controller.update(True, CS, VM, params, False, 0.001, pose, False, 0.2) + assert lac_log.active + + def test_v0_uses_current_lateral_acceleration_setpoint(self): + CP, controller = self.build_v0_controller() + VM = VehicleModel(CP) + CS = car.CarState.new_message(vEgo=30) + params = log.VehicleParameters.new_message() + pose = Pose.from_live_pose(generate_deviceMotion().deviceMotion) + + _, _, lac_log = controller.update(True, CS, VM, params, False, 0.001, pose, False, 0.3) + + assert lac_log.version == 0 + assert abs(lac_log.desiredLateralAccel - 0.9) < 1e-6 + + def test_v0_platform_selection(self): + mqb_interface = interfaces[VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK8] + mqb_params = mqb_interface.get_non_essential_params(VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK8) + + assert is_vw_mqb_torque(mqb_params) + for car_name in (VOLKSWAGEN.VOLKSWAGEN_PASSAT_MK7, VOLKSWAGEN.VOLKSWAGEN_GOLF_MK8, + VOLKSWAGEN.VOLKSWAGEN_ID4_MK1, VOLKSWAGEN.AUDI_A4_MK4, TOYOTA.TOYOTA_RAV4): + CarInterface = interfaces[car_name] + assert not is_vw_mqb_torque(CarInterface.get_non_essential_params(car_name)) + + def test_pq_controller_inactive_lookahead_and_slew_reset(self): + CP, controller = self.build_pq_controller() + controller.curvature_lookahead_enabled = True + controller.lateral_acceleration_slew_limiter.enabled = True + VM = VehicleModel(CP) + CS = car.CarState.new_message(vEgo=30) + params = log.VehicleParameters.new_message() + pose = Pose.from_live_pose(generate_deviceMotion().deviceMotion) + + torque, angle, lac_log = controller.update(False, CS, VM, params, False, 0.001, pose, False, 0.2, lookahead_curvature=0.002) + assert torque == 0.0 + assert angle == 0.0 + assert not lac_log.active + assert controller.lateral_acceleration_slew_limiter.a_lim == 1.8 + + def test_pq_live_torque_update_freeze_and_unfreeze(self, monkeypatch): + _, controller = self.build_pq_controller() + initial = (controller.torque_params.latAccelFactor, controller.torque_params.latAccelOffset, controller.torque_params.friction) + controller.update_live_torque_params(3.0, 0.2, 0.4) + assert (controller.torque_params.latAccelFactor, controller.torque_params.latAccelOffset, controller.torque_params.friction) == initial + + monkeypatch.setattr(latcontrol_torque_pq, "FREEZE_LIVE_TORQUE_PARAMS", False) + controller.update_live_torque_params(3.0, 0.2, 0.4) + assert controller.torque_params.latAccelFactor == 3.0 + assert abs(controller.torque_params.latAccelOffset - 0.2) < 1e-6 + assert abs(controller.torque_params.friction - 0.4) < 1e-6 diff --git a/iqpilot/selfdrive/controls/tests/test_latcontrol_torque_buffer.py b/iqpilot/selfdrive/controls/tests/test_latcontrol_torque_buffer.py new file mode 100644 index 000000000..2dc8216f0 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_latcontrol_torque_buffer.py @@ -0,0 +1,47 @@ +from parameterized import parameterized + +from iqpilot.cereal import car, log +from iqdbc.car.car_helpers import interfaces +from iqdbc.car.toyota.values import CAR as TOYOTA +from iqdbc.car.vehicle_model import VehicleModel +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque, LAT_ACCEL_REQUEST_BUFFER_SECONDS + +from iqpilot.selfdrive.car.helpers import convert_to_capnp +from iqpilot.selfdrive.locationd.helpers import Pose +from iqpilot.common.mock.generators import generate_deviceMotion +from iqpilot.selfdrive.car import interfaces as iqpilot_interfaces + +def get_controller(car_name): + CarInterface = interfaces[car_name] + CP = CarInterface.get_non_essential_params(car_name) + CP_IQ = CarInterface.get_non_essential_params_iq(CP, car_name) + CI = CarInterface(CP, CP_IQ) + iqpilot_interfaces.apply_iq_car_config(CI) + CP_IQ = convert_to_capnp(CP_IQ) + VM = VehicleModel(CP) + controller = LatControlTorque(CP.as_reader(), CP_IQ.as_reader(), CI, DT_CTRL) + return controller, VM + +class TestLatControlTorqueBuffer: + + @parameterized.expand([(TOYOTA.TOYOTA_COROLLA_TSS2,)]) + def test_request_buffer_consistency(self, car_name): + buffer_steps = int(LAT_ACCEL_REQUEST_BUFFER_SECONDS / DT_CTRL) + controller, VM = get_controller(car_name) + + CS = car.CarState.new_message() + CS.vEgo = 30 + CS.steeringPressed = False + params = log.VehicleParameters.new_message() + + lp = generate_deviceMotion() + pose = Pose.from_live_pose(lp.deviceMotion) + + for _ in range(buffer_steps): + controller.update(True, CS, VM, params, False, 0.001, pose, False, 0.2) + assert all(val != 0 for val in controller.lat_accel_request_buffer) + + for _ in range(buffer_steps): + controller.update(False, CS, VM, params, False, 0.0, pose, False, 0.2) + assert all(val == 0 for val in controller.lat_accel_request_buffer) diff --git a/iqpilot/selfdrive/controls/tests/test_lateral_mpc.py b/iqpilot/selfdrive/controls/tests/test_lateral_mpc.py new file mode 100644 index 000000000..fd05a3607 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_lateral_mpc.py @@ -0,0 +1,85 @@ +import pytest +import numpy as np +from iqpilot.selfdrive.controls.lib.lateral_mpc_lib.lat_mpc import LateralMpc +from iqpilot.selfdrive.controls.lib.drive_helpers import CAR_ROTATION_RADIUS +from iqpilot.selfdrive.controls.lib.lateral_mpc_lib.lat_mpc import N as LAT_MPC_N + + +def run_mpc(lat_mpc=None, v_ref=30., x_init=0., y_init=0., psi_init=0., curvature_init=0., + lane_width=3.6, poly_shift=0.): + + if lat_mpc is None: + lat_mpc = LateralMpc() + lat_mpc.set_weights(1., .1, 0.0, .05, 800) + + y_pts = poly_shift * np.ones(LAT_MPC_N + 1) + heading_pts = np.zeros(LAT_MPC_N + 1) + curv_rate_pts = np.zeros(LAT_MPC_N + 1) + + x0 = np.array([x_init, y_init, psi_init, curvature_init]) + p = np.column_stack([v_ref * np.ones(LAT_MPC_N + 1), + CAR_ROTATION_RADIUS * np.ones(LAT_MPC_N + 1)]) + + # converge in no more than 10 iterations + for _ in range(10): + lat_mpc.run(x0, p, + y_pts, heading_pts, curv_rate_pts) + return lat_mpc.x_sol + + +class TestLateralMpc: + + def _assert_null(self, sol, curvature=1e-6): + for i in range(len(sol)): + assert sol[0,i,1] == pytest.approx(0, abs=curvature) + assert sol[0,i,2] == pytest.approx(0, abs=curvature) + assert sol[0,i,3] == pytest.approx(0, abs=curvature) + + def _assert_simmetry(self, sol, curvature=1e-6): + for i in range(len(sol)): + assert sol[0,i,1] == pytest.approx(-sol[1,i,1], abs=curvature) + assert sol[0,i,2] == pytest.approx(-sol[1,i,2], abs=curvature) + assert sol[0,i,3] == pytest.approx(-sol[1,i,3], abs=curvature) + assert sol[0,i,0] == pytest.approx(sol[1,i,0], abs=curvature) + + def test_straight(self): + sol = run_mpc() + self._assert_null(np.array([sol])) + + def test_y_symmetry(self): + sol = [] + for y_init in [-0.5, 0.5]: + sol.append(run_mpc(y_init=y_init)) + self._assert_simmetry(np.array(sol)) + + def test_poly_symmetry(self): + sol = [] + for poly_shift in [-1., 1.]: + sol.append(run_mpc(poly_shift=poly_shift)) + self._assert_simmetry(np.array(sol)) + + def test_curvature_symmetry(self): + sol = [] + for curvature_init in [-0.1, 0.1]: + sol.append(run_mpc(curvature_init=curvature_init)) + self._assert_simmetry(np.array(sol)) + + def test_psi_symmetry(self): + sol = [] + for psi_init in [-0.1, 0.1]: + sol.append(run_mpc(psi_init=psi_init)) + self._assert_simmetry(np.array(sol)) + + def test_no_overshoot(self): + y_init = 1. + sol = run_mpc(y_init=y_init) + for y in list(sol[:,1]): + assert y_init >= abs(y) + + def test_switch_convergence(self): + lat_mpc = LateralMpc() + sol = run_mpc(lat_mpc=lat_mpc, poly_shift=3.0, v_ref=7.0) + right_psi_deg = np.degrees(sol[:,2]) + sol = run_mpc(lat_mpc=lat_mpc, poly_shift=-3.0, v_ref=7.0) + left_psi_deg = np.degrees(sol[:,2]) + np.testing.assert_almost_equal(right_psi_deg, -left_psi_deg, decimal=3) diff --git a/iqpilot/selfdrive/controls/tests/test_leads.py b/iqpilot/selfdrive/controls/tests/test_leads.py new file mode 100644 index 000000000..ba3fcca5d --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_leads.py @@ -0,0 +1,33 @@ +import iqpilot.cereal.messaging as messaging +import pytest + +from iqdbc.car.toyota.values import CAR as TOYOTA +from iqpilot.selfdrive.test.process_replay import replay_process_with_name + + +class TestLeads: + @pytest.mark.linux + def test_radar_fault(self): + # if there's no radar-related can traffic, radard should either not respond or respond with an error + # this is tightly coupled with underlying car radar_interface implementation, but it's a good sanity check + def single_iter_pkg(): + # single iter package, with meaningless cans and empty carState/modelV2 + msgs = [] + for _ in range(500): + can = messaging.new_message("can", 1) + cs = messaging.new_message("carState") + cp = messaging.new_message("carParams") + msgs.append(can.as_reader()) + msgs.append(cs.as_reader()) + msgs.append(cp.as_reader()) + model = messaging.new_message("modelV2") + msgs.append(model.as_reader()) + + return msgs + + msgs = [m for _ in range(3) for m in single_iter_pkg()] + out = replay_process_with_name("card", msgs, fingerprint=TOYOTA.TOYOTA_COROLLA_TSS2) + states = [m for m in out if m.which() == "radarTracks"] + failures = [not state.valid for state in states] + + assert len(states) == 0 or all(failures) diff --git a/iqpilot/selfdrive/controls/tests/test_longcontrol.py b/iqpilot/selfdrive/controls/tests/test_longcontrol.py new file mode 100644 index 000000000..2d0e211f7 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_longcontrol.py @@ -0,0 +1,72 @@ +from types import SimpleNamespace + +from iqpilot.cereal import custom +from iqpilot.selfdrive.controls.lib.longcontrol import LongControl, LongCtrlState, long_control_state_trans + + +class TestLongControlStateTransition: + + def test_stay_stopped(self): + CP_IQ = custom.IQCarParams.new_message() + active = True + current_state = LongCtrlState.stopping + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=True, brake_pressed=False, cruise_standstill=False) + assert next_state == LongCtrlState.stopping + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=False, brake_pressed=True, cruise_standstill=False) + assert next_state == LongCtrlState.stopping + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=False, brake_pressed=False, cruise_standstill=True) + assert next_state == LongCtrlState.stopping + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=False, brake_pressed=False, cruise_standstill=False) + assert next_state == LongCtrlState.pid + active = False + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=False, brake_pressed=False, cruise_standstill=False) + assert next_state == LongCtrlState.off + +def test_engage(): + CP_IQ = custom.IQCarParams.new_message() + active = True + current_state = LongCtrlState.off + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=True, brake_pressed=False, cruise_standstill=False) + assert next_state == LongCtrlState.stopping + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=False, brake_pressed=True, cruise_standstill=False) + assert next_state == LongCtrlState.stopping + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=False, brake_pressed=False, cruise_standstill=True) + assert next_state == LongCtrlState.stopping + next_state = long_control_state_trans(CP_IQ, active, current_state, + should_stop=False, brake_pressed=False, cruise_standstill=False) + assert next_state == LongCtrlState.pid + + +def test_gas_override_preserves_negative_accel_command(): + pid_calls = [] + control = object.__new__(LongControl) + control.CP = SimpleNamespace(stopAccel=-0.55) + control.CP_IQ = SimpleNamespace(enableGasInterceptor=False) + control.long_control_state = LongCtrlState.pid + control.pid = SimpleNamespace( + update=lambda error, **kwargs: pid_calls.append((error, kwargs)) or -0.5, + reset=lambda: None, + ) + control.last_output_accel = -0.4 + control.stopping_decel_rate = 1.0 + control.smooth = SimpleNamespace(enabled=False, update=lambda: None, reset=lambda: None) + car_state = SimpleNamespace( + vEgo=15.0, + aEgo=0.0, + brakePressed=False, + standstill=False, + cruiseState=SimpleNamespace(standstill=False), + ) + + output = control.update(True, car_state, -0.5, False, (-3.5, 2.0), gas_override=True) + + assert output == -0.5 + assert pid_calls == [(-0.5, {"speed": 15.0, "feedforward": -0.5, "freeze_integrator": True})] diff --git a/iqpilot/selfdrive/controls/tests/test_longitudinal_planner.py b/iqpilot/selfdrive/controls/tests/test_longitudinal_planner.py new file mode 100644 index 000000000..64e2253f6 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_longitudinal_planner.py @@ -0,0 +1,136 @@ +import numpy as np +import pytest +from types import SimpleNamespace + +from iqpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LEAD_T_IDXS_MODEL, T_IDXS +from iqpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LongitudinalMpc +from iqpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LongitudinalPlanSource +from iqpilot.selfdrive.controls.lib.longitudinal_planner import J_CRUISE, get_accel_candidates, get_cruise_accel, get_e2e_accel + + +def model_velocity(v_ego, v_future): + return np.interp(T_IDXS, [T_IDXS[0], T_IDXS[-1]], [v_ego, v_future]) + + +class TestCruiseAccel: + @pytest.mark.parametrize("v_cruise,v_ego,a_cruise_prev,direction", [ + (10.0, 30.0, 0.4, -1.0), + (40.0, 30.0, -0.4, 1.0), + ]) + def test_e2e_rate_limit(self, v_cruise, v_ego, a_cruise_prev, direction): + dt = 0.05 + accel, _ = get_cruise_accel(True, v_cruise, v_ego, a_cruise_prev, 0.0, SimpleNamespace(), dt, 0.0, True) + + assert accel == pytest.approx(a_cruise_prev + direction * J_CRUISE * dt) + + +class TestE2eCruiseConvergence: + def test_converges_when_model_wants_to_accelerate(self): + assert get_e2e_accel(20.0, 30.0, model_velocity(20.0, 25.0), 0.1, False) == pytest.approx(0.5) + + def test_scales_down_near_cruise_speed(self): + assert get_e2e_accel(28.5, 30.0, model_velocity(28.5, 30.0), 0.0, False) == pytest.approx(0.05) + + def test_preserves_active_model_deceleration(self): + assert get_e2e_accel(20.0, 30.0, model_velocity(20.0, 25.0), -0.05, False) == pytest.approx(-0.05) + + def test_preserves_future_model_slowdown(self): + assert get_e2e_accel(20.0, 30.0, model_velocity(20.0, 18.0), 0.1, False) == pytest.approx(0.1) + + @pytest.mark.parametrize("v_ego, v_cruise, should_stop", [ + (30.0, 30.0, False), + (31.0, 30.0, False), + (20.0, 30.0, True), + ]) + def test_never_overrides_cruise_or_stop(self, v_ego, v_cruise, should_stop): + assert get_e2e_accel(v_ego, v_cruise, model_velocity(v_ego, v_ego + 5.0), -0.2, should_stop) == pytest.approx(-0.2) + + +class TestAccelCandidates: + MPC = (-0.2, LongitudinalPlanSource.lead0, True) + CRUISE = (0.5, LongitudinalPlanSource.cruise, False) + E2E = (0.1, LongitudinalPlanSource.e2e, False) + + def test_e2e_without_lead_frees_model_from_mpc(self): + candidates = get_accel_candidates(True, False, self.MPC, self.CRUISE, self.E2E) + assert candidates == [self.CRUISE, self.E2E] + assert min(candidates, key=lambda c: c[0])[1] == LongitudinalPlanSource.e2e + assert not any(should_stop for _, _, should_stop in candidates) + + def test_e2e_with_lead_keeps_mpc_safety_constraint(self): + candidates = get_accel_candidates(True, True, self.MPC, self.CRUISE, self.E2E) + assert candidates == [self.MPC, self.CRUISE, self.E2E] + assert min(candidates, key=lambda c: c[0])[1] == LongitudinalPlanSource.lead0 + assert any(should_stop for _, _, should_stop in candidates) + + def test_acc_without_lead_keeps_mpc_policy(self): + candidates = get_accel_candidates(False, False, self.MPC, self.CRUISE, self.E2E) + assert candidates == [self.MPC, self.CRUISE] + + +class TestExperimentalLeadMpc: + @staticmethod + def mpc(v_ego=20.0): + mpc = object.__new__(LongitudinalMpc) + mpc.x0 = np.array([0.0, v_ego, 0.0]) + return mpc + + @staticmethod + def model_lead(prob=0.9, x=None, v=None): + return SimpleNamespace( + prob=prob, + x=np.asarray(x if x is not None else [30.0, 66.0, 98.0, 126.0, 150.0, 170.0]), + v=np.asarray(v if v is not None else [20.0, 18.0, 16.0, 14.0, 12.0, 10.0]), + ) + + @staticmethod + def radar_lead(status=True, model_prob=0.9, radar=True): + return SimpleNamespace( + status=status, + dRel=28.0, + vLead=19.0, + aLeadK=-0.5, + aLeadTau=1.5, + vRel=-1.0, + modelProb=model_prob, + radar=radar, + ) + + def test_uses_valid_trajectory_with_radar_anchor(self): + lead_xv = self.mpc().process_lead(self.model_lead(), self.radar_lead()) + + assert lead_xv[0, 0] == pytest.approx(28.0) + assert lead_xv[0, 1] == pytest.approx(19.0) + assert lead_xv[-1, 0] == pytest.approx(168.0) + assert lead_xv[-1, 1] == pytest.approx(9.0) + assert np.all(np.diff(lead_xv[:, 0]) >= 0.0) + + def test_uses_valid_vision_only_trajectory(self): + radar_lead = self.radar_lead(radar=False) + lead_xv = self.mpc().process_lead(self.model_lead(), radar_lead) + + assert lead_xv[-1, 0] == pytest.approx(168.0) + assert lead_xv[-1, 1] == pytest.approx(9.0) + + @pytest.mark.parametrize("model_lead, radar_lead", [ + (model_lead.__func__(prob=0.5), radar_lead.__func__()), + (model_lead.__func__(x=[30.0, 66.0]), radar_lead.__func__()), + (model_lead.__func__(v=[20.0, 18.0]), radar_lead.__func__()), + (model_lead.__func__(x=[30.0, 66.0, 98.0, np.nan, 150.0, 170.0]), radar_lead.__func__()), + (model_lead.__func__(v=[20.0, 18.0, 16.0, np.inf, 12.0, 10.0]), radar_lead.__func__()), + (model_lead.__func__(), radar_lead.__func__(model_prob=0.0)), + (None, radar_lead.__func__()), + ]) + def test_falls_back_to_radar_extrapolation(self, model_lead, radar_lead): + mpc = self.mpc() + + assert np.array_equal(mpc.process_lead(model_lead, radar_lead), mpc.process_lead_legacy(radar_lead)) + + def test_prevents_backward_position_trajectory(self): + model_lead = self.model_lead(x=[30.0, 40.0, 38.0, 60.0, 80.0, 100.0]) + lead_xv = self.mpc().process_lead(model_lead, self.radar_lead()) + + assert np.all(np.diff(lead_xv[:, 0]) >= 0.0) + + def test_model_time_shape_matches_expected_horizon(self): + assert LEAD_T_IDXS_MODEL.shape == (6,) diff --git a/iqpilot/selfdrive/controls/tests/test_scan_radar_leads.py b/iqpilot/selfdrive/controls/tests/test_scan_radar_leads.py new file mode 100644 index 000000000..dac15b219 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_scan_radar_leads.py @@ -0,0 +1,191 @@ +from types import SimpleNamespace + +import pytest + +from iqdbc.car.honda.values import CAR +from iqpilot.selfdrive.controls.radard import (SCAN_CHALLENGER_STALE_CYCLES, SCAN_DISTANCE_STALE_CYCLES, + SCAN_LEAD_MIN_CYCLES, SCAN_LEAD_PROB, SCAN_SWEEP_DT, + KalmanParams, RadarD, Track, get_lead, + scan_low_speed_candidate, track_agrees_with_model, + uses_scan_radar) + +DT_MDL = 0.05 + + +def honda_cp(fingerprint=CAR.HONDA_CIVIC_BOSCH, radar_unavailable=False, brand="honda"): + return SimpleNamespace(brand=brand, carFingerprint=fingerprint, radarUnavailable=radar_unavailable, flags=0) + + +def model_lead(x=30.0, y=0.0, v=10.0, prob=0.9, x_std=2.0, y_std=0.5, v_std=1.0): + return SimpleNamespace(x=[x], y=[y], v=[v], a=[0.0], prob=prob, xStd=[x_std], yStd=[y_std], vStd=[v_std]) + + +def make_track(identifier, d_rel, y_rel=0.0, v_rel=0.0, v_ego=10.0, cycles=SCAN_LEAD_MIN_CYCLES, measured=True): + track = Track(identifier, v_rel + v_ego, KalmanParams(SCAN_SWEEP_DT)) + for _ in range(cycles): + track.update(d_rel, y_rel, v_rel, v_rel + v_ego, measured) + return track + + +class TestScanRadarGating: + def test_capable_verified_car_uses_scan(self): + assert uses_scan_radar(honda_cp()) + + def test_radar_unavailable_disables(self): + assert not uses_scan_radar(honda_cp(radar_unavailable=True)) + + def test_non_family_car_never_scans(self): + assert not uses_scan_radar(honda_cp(fingerprint=CAR.HONDA_CIVIC)) + assert not uses_scan_radar(honda_cp(fingerprint=CAR.HONDA_CIVIC_2022)) + + def test_other_brand_never_scans(self): + assert not uses_scan_radar(honda_cp(brand="toyota")) + + +class TestTrackMeasurementGating: + def test_repeated_payload_not_absorbed_twice(self): + kp = KalmanParams(SCAN_SWEEP_DT) + absorbed = Track(1, 10.0, kp) + starved = Track(1, 10.0, kp) + absorbed.update(30.0, 0.0, 5.0, 15.0, True) + starved.update(30.0, 0.0, 5.0, 15.0, True) + v_after_first = starved.vLeadK + + for _ in range(5): + absorbed.update(30.0, 0.0, 5.0, 15.0, True, absorb_measurement=True) + starved.update(30.0, 0.0, 5.0, 15.0, False, absorb_measurement=False) + + assert starved.vLeadK == v_after_first + assert absorbed.vLeadK != v_after_first + assert starved.cnt == absorbed.cnt + + +class TestLowSpeedCandidate: + def test_needs_minimum_cycles(self): + young = make_track(1, 10.0, v_ego=2.0, cycles=SCAN_LEAD_MIN_CYCLES - 1) + mature = make_track(2, 10.0, v_ego=2.0) + assert not scan_low_speed_candidate(young, 2.0) + assert scan_low_speed_candidate(mature, 2.0) + + def test_geometry_still_applies(self): + offset = make_track(3, 10.0, y_rel=2.0, v_ego=2.0) + assert not scan_low_speed_candidate(offset, 2.0) + + +class TestModelAgreement: + def test_strict_tighter_than_relaxed(self): + track = make_track(1, 40.0, v_ego=10.0) + # ~15m disagreement: beyond the strict 25% envelope, inside the relaxed 40% one + lead = model_lead(x=56.5) + assert not track_agrees_with_model(track, lead, 10.0, strict=True) + assert track_agrees_with_model(track, lead, 10.0, strict=False) + + +class TestScanLeadSelection: + def make_cp(self): + return honda_cp(), SimpleNamespace() + + def test_held_lead_survives_probability_dip(self): + CP, CP_IQ = self.make_cp() + track = make_track(7, 10.0, v_ego=2.0) + lead = model_lead(x=11.5, v=2.0, prob=0.05) + # raw prob is below threshold, the filtered prob is passed in above it + result = get_lead(2.0, True, {7: track}, lead, 2.0, CP, CP_IQ, low_speed_override=True, + scan_radar=True, filtered_prob=0.6, held_track_id=7) + assert result['status'] and result['radarTrackId'] == 7 + + def test_unrelated_closer_point_cannot_usurp_without_model_evidence(self): + CP, CP_IQ = self.make_cp() + held = make_track(7, 10.0, v_ego=2.0) + interloper = make_track(9, 4.0, y_rel=0.5, v_ego=2.0) + lead = model_lead(x=11.5, v=2.0, prob=0.9) + result = get_lead(2.0, True, {7: held, 9: interloper}, lead, 2.0, CP, CP_IQ, low_speed_override=True, + scan_radar=True, filtered_prob=0.9, held_track_id=7) + assert result['radarTrackId'] == 7 + + def test_matching_closer_point_takes_over(self): + CP, CP_IQ = self.make_cp() + held = make_track(7, 10.0, v_ego=2.0) + closer = make_track(9, 4.0, v_ego=2.0) + lead = model_lead(x=5.5, v=2.0, prob=0.9) # model agrees with the closer car + result = get_lead(2.0, True, {7: held, 9: closer}, lead, 2.0, CP, CP_IQ, low_speed_override=True, + scan_radar=True, filtered_prob=0.9, held_track_id=7) + assert result['radarTrackId'] == 9 + + def test_radar_only_takeover_when_no_model_lead(self): + CP, CP_IQ = self.make_cp() + track = make_track(4, 8.0, v_ego=2.0) + lead = model_lead(prob=0.0) + result = get_lead(2.0, True, {4: track}, lead, 2.0, CP, CP_IQ, low_speed_override=True, + scan_radar=True, filtered_prob=0.0, held_track_id=-1) + assert result['status'] and result['radarTrackId'] == 4 + + def test_young_track_cannot_lead_alone(self): + CP, CP_IQ = self.make_cp() + track = make_track(4, 8.0, v_ego=2.0, cycles=1) + lead = model_lead(prob=0.0) + result = get_lead(2.0, True, {4: track}, lead, 2.0, CP, CP_IQ, low_speed_override=True, + scan_radar=True, filtered_prob=0.0, held_track_id=-1) + assert not result['status'] + + def test_non_scan_behavior_unchanged(self): + CP, CP_IQ = self.make_cp() + track = make_track(4, 8.0, v_ego=2.0, cycles=1) + lead = model_lead(prob=0.0) + result = get_lead(2.0, True, {4: track}, lead, 2.0, CP, CP_IQ, low_speed_override=True) + assert result['status'] # legacy path has no maturity gate + + +class TestHeldLeadStaleness: + def make_radard(self, tracks): + rd = object.__new__(RadarD) + rd.tracks = tracks + rd.ready = True + rd.v_ego = 10.0 + rd.held_lead_ids = [7, -1] + rd._held_evidence_ids = [7, -1] + rd._challenger_stale_counts = [0, 0] + rd._distance_stale_counts = [0, 0] + return rd + + def test_relaxed_match_keeps_hold(self): + held = make_track(7, 30.0, v_ego=10.0) + rd = self.make_radard({7: held}) + for _ in range(5): + rd._refresh_held_lead_evidence(0, model_lead(x=32.0), 0.9) + assert rd.held_lead_ids[0] == 7 + + def test_better_challenger_releases_hold(self): + held = make_track(7, 80.0, v_ego=10.0) + challenger = make_track(9, 30.0, v_ego=10.0) + rd = self.make_radard({7: held, 9: challenger}) + lead = model_lead(x=31.5) + for _ in range(SCAN_CHALLENGER_STALE_CYCLES): + rd._refresh_held_lead_evidence(0, lead, 0.9) + assert rd.held_lead_ids[0] == -1 + + def test_gross_distance_disagreement_releases_hold(self): + held = make_track(7, 80.0, v_ego=10.0) + rd = self.make_radard({7: held}) + lead = model_lead(x=31.5, x_std=60.0, y_std=30.0, v_std=30.0) # huge model uncertainty + for _ in range(SCAN_DISTANCE_STALE_CYCLES): + rd._refresh_held_lead_evidence(0, lead, 0.9) + assert rd.held_lead_ids[0] == -1 + + def test_low_probability_resets_evidence_without_release(self): + held = make_track(7, 80.0, v_ego=10.0) + rd = self.make_radard({7: held}) + for _ in range(10): + rd._refresh_held_lead_evidence(0, model_lead(x=31.5), SCAN_LEAD_PROB) + assert rd.held_lead_ids[0] == 7 + assert rd._distance_stale_counts[0] == 0 + + +class TestProbFilterTiming: + def test_rises_instantly_decays_slowly(self): + from iqpilot.common.filter_simple import FirstOrderFilter + f = FirstOrderFilter(0.0, 0.2, DT_MDL) + f.x = max(f.x, 0.9) + assert f.x == pytest.approx(0.9) + f.update(0.0) + assert f.x > 0.6 diff --git a/iqpilot/selfdrive/controls/tests/test_steering_fault_recovery.py b/iqpilot/selfdrive/controls/tests/test_steering_fault_recovery.py new file mode 100644 index 000000000..d6cf76ce3 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_steering_fault_recovery.py @@ -0,0 +1,28 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.selfdrive.controls.steering_fault_recovery import STEER_FAULT_RECOVERY_FRAMES, SteeringFaultRecovery + + +def test_steering_fault_recovery_starts_ready(): + recovery = SteeringFaultRecovery() + assert recovery.update(False, False) + + +def test_temporary_fault_requires_continuous_clear_interval(): + recovery = SteeringFaultRecovery() + assert not recovery.update(True, False) + for _ in range(STEER_FAULT_RECOVERY_FRAMES - 1): + assert not recovery.update(False, False) + assert recovery.update(False, False) + + +def test_repeated_fault_restarts_recovery_interval(): + recovery = SteeringFaultRecovery() + assert not recovery.update(False, True) + for _ in range(STEER_FAULT_RECOVERY_FRAMES - 1): + assert not recovery.update(False, False) + assert not recovery.update(True, False) + for _ in range(STEER_FAULT_RECOVERY_FRAMES - 1): + assert not recovery.update(False, False) + assert recovery.update(False, False) diff --git a/iqpilot/selfdrive/controls/tests/test_torqued_lat_accel_offset.py b/iqpilot/selfdrive/controls/tests/test_torqued_lat_accel_offset.py new file mode 100644 index 000000000..1c29e3140 --- /dev/null +++ b/iqpilot/selfdrive/controls/tests/test_torqued_lat_accel_offset.py @@ -0,0 +1,70 @@ +import numpy as np +from iqpilot.cereal import car, messaging +from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY +from iqdbc.car import structs +from iqdbc.car.lateral import get_friction, FRICTION_THRESHOLD +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.locationd.torqued import TorqueEstimator, MIN_BUCKET_POINTS, POINTS_PER_BUCKET, STEER_BUCKET_BOUNDS + +np.random.seed(0) + +LA_ERR_STD = 1.0 +INPUT_NOISE_STD = 0.08 +V_EGO = 30.0 + +WARMUP_BUCKET_POINTS = (1.5*MIN_BUCKET_POINTS).astype(int) +STRAIGHT_ROAD_LA_BOUNDS = (0.02, 0.03) + +ROLL_BIAS_DEG = 2.0 +ROLL_COMPENSATION_BIAS = ACCELERATION_DUE_TO_GRAVITY*float(np.sin(np.deg2rad(ROLL_BIAS_DEG))) +TORQUE_TUNE = structs.CarParams.LateralTorqueTuning(latAccelFactor=2.0, latAccelOffset=0.0, friction=0.2) +TORQUE_TUNE_BIASED = structs.CarParams.LateralTorqueTuning(latAccelFactor=2.0, latAccelOffset=-ROLL_COMPENSATION_BIAS, friction=0.2) + +def generate_inputs(torque_tune, la_err_std, input_noise_std=None): + rng = np.random.default_rng(0) + steer_torques = np.concat([rng.uniform(bnd[0], bnd[1], pts) for bnd, pts in zip(STEER_BUCKET_BOUNDS, WARMUP_BUCKET_POINTS, strict=True)]) + la_errs = rng.normal(scale=la_err_std, size=steer_torques.size) + frictions = np.array([get_friction(la_err, 0.0, FRICTION_THRESHOLD, torque_tune) for la_err in la_errs]) + lat_accels = torque_tune.latAccelFactor*steer_torques + torque_tune.latAccelOffset + frictions + if input_noise_std is not None: + steer_torques += rng.normal(scale=input_noise_std, size=steer_torques.size) + lat_accels += rng.normal(scale=input_noise_std, size=steer_torques.size) + return steer_torques, lat_accels + +def get_warmed_up_estimator(steer_torques, lat_accels): + est = TorqueEstimator(car.CarParams()) + for steer_torque, lat_accel in zip(steer_torques, lat_accels, strict=True): + est.filtered_points.add_point(steer_torque, lat_accel) + return est + +def simulate_straight_road_msgs(est): + carControl = messaging.new_message('carControl').carControl + carOutput = messaging.new_message('carOutput').carOutput + carState = messaging.new_message('carState').carState + deviceMotion = messaging.new_message('deviceMotion').deviceMotion + carControl.latActive = True + carState.vEgo = V_EGO + carState.steeringPressed = False + ts = DT_MDL*np.arange(2*POINTS_PER_BUCKET) + steer_torques = np.concat((np.linspace(-0.03, -0.02, POINTS_PER_BUCKET), np.linspace(0.02, 0.03, POINTS_PER_BUCKET))) + lat_accels = TORQUE_TUNE.latAccelFactor * steer_torques + for t, steer_torque, lat_accel in zip(ts, steer_torques, lat_accels, strict=True): + carOutput.actuatorsOutput.torque = float(-steer_torque) + deviceMotion.orientationNED.x = float(np.deg2rad(ROLL_BIAS_DEG)) + deviceMotion.angularVelocityDevice.z = float(lat_accel / V_EGO) + for which, msg in (('carControl', carControl), ('carOutput', carOutput), ('carState', carState), ('deviceMotion', deviceMotion)): + est.handle_log(t, which, msg) + +def test_estimated_offset(): + steer_torques, lat_accels = generate_inputs(TORQUE_TUNE_BIASED, la_err_std=LA_ERR_STD, input_noise_std=INPUT_NOISE_STD) + est = get_warmed_up_estimator(steer_torques, lat_accels) + msg = est.get_msg() + # TODO add lataccelfactor and friction check when we have more accurate estimates + assert abs(msg.lateralTorqueParameters.latAccelOffsetRaw - TORQUE_TUNE_BIASED.latAccelOffset) < 0.1 + +def test_straight_road_roll_bias(): + steer_torques, lat_accels = generate_inputs(TORQUE_TUNE, la_err_std=LA_ERR_STD, input_noise_std=INPUT_NOISE_STD) + est = get_warmed_up_estimator(steer_torques, lat_accels) + simulate_straight_road_msgs(est) + msg = est.get_msg() + assert (msg.lateralTorqueParameters.latAccelOffsetRaw < -0.05) and np.isfinite(msg.lateralTorqueParameters.latAccelOffsetRaw) diff --git a/iqpilot/selfdrive/debug/__init__.py b/iqpilot/selfdrive/debug/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/debug/dump_car_docs.py b/iqpilot/selfdrive/debug/dump_car_docs.py new file mode 100755 index 000000000..5f8187036 --- /dev/null +++ b/iqpilot/selfdrive/debug/dump_car_docs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +import argparse +import pickle + +from iqdbc.car.docs import get_all_car_docs + + +def dump_car_docs(path): + with open(path, 'wb') as f: + pickle.dump(get_all_car_docs(), f) + print(f'Dumping car info to {path}') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--path", required=True) + args = parser.parse_args() + dump_car_docs(args.path) diff --git a/iqpilot/selfdrive/debug/print_docs_diff.py b/iqpilot/selfdrive/debug/print_docs_diff.py new file mode 100755 index 000000000..9e1d20431 --- /dev/null +++ b/iqpilot/selfdrive/debug/print_docs_diff.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +import argparse +from collections import defaultdict +import difflib +import pickle + +from iqdbc.car.docs import get_all_car_docs +from iqdbc.car.docs_definitions import Column + +FOOTNOTE_TAG = "{}" +STAR_ICON = '' +VIDEO_ICON = '' + \ + '' +COLUMNS = "|" + "|".join([column.value for column in Column]) + "|" +COLUMN_HEADER = "|---|---|---|{}|".format("|".join([":---:"] * (len(Column) - 3))) +ARROW_SYMBOL = "âžĄī¸" + + +def load_base_car_docs(path): + with open(path, "rb") as f: + return pickle.load(f) + + +def match_cars(base_cars, new_cars): + changes = [] + additions = [] + for new in new_cars: + # Addition if no close matches or close match already used + # Change if close match and not already used + matches = difflib.get_close_matches(new.name, [b.name for b in base_cars], cutoff=0.) + if not len(matches) or matches[0] in [c[1].name for c in changes]: + additions.append(new) + else: + changes.append((new, next(car for car in base_cars if car.name == matches[0]))) + + # Removal if base car not in changes + removals = [b for b in base_cars if b.name not in [c[1].name for c in changes]] + return changes, additions, removals + + +def build_column_diff(base_car, new_car): + row_builder = [] + for column in Column: + base_column = base_car.get_column(column, STAR_ICON, VIDEO_ICON, FOOTNOTE_TAG) + new_column = new_car.get_column(column, STAR_ICON, VIDEO_ICON, FOOTNOTE_TAG) + + if base_column != new_column: + row_builder.append(f"{base_column} {ARROW_SYMBOL} {new_column}") + else: + row_builder.append(new_column) + + return format_row(row_builder) + + +def format_row(builder): + return "|" + "|".join(builder) + "|" + + +def print_car_docs_diff(path): + base_car_docs = defaultdict(list) + new_car_docs = defaultdict(list) + + for car in load_base_car_docs(path): + base_car_docs[car.car_fingerprint].append(car) + for car in get_all_car_docs(): + new_car_docs[car.car_fingerprint].append(car) + + # Add new platforms to base cars so we can detect additions and removals in one pass + base_car_docs.update({car: [] for car in new_car_docs if car not in base_car_docs}) + + changes = defaultdict(list) + for base_car_model, base_cars in base_car_docs.items(): + # Match car info changes, and get additions and removals + new_cars = new_car_docs[base_car_model] + car_changes, car_additions, car_removals = match_cars(base_cars, new_cars) + + # Removals + for car_docs in car_removals: + changes["removals"].append(format_row([car_docs.get_column(column, STAR_ICON, VIDEO_ICON, FOOTNOTE_TAG) for column in Column])) + + # Additions + for car_docs in car_additions: + changes["additions"].append(format_row([car_docs.get_column(column, STAR_ICON, VIDEO_ICON, FOOTNOTE_TAG) for column in Column])) + + for new_car, base_car in car_changes: + # Column changes + row_diff = build_column_diff(base_car, new_car) + if ARROW_SYMBOL in row_diff: + changes["column"].append(row_diff) + + # Detail sentence changes + if base_car.detail_sentence != new_car.detail_sentence: + changes["detail"].append(f"- Sentence for {base_car.name} changed!\n" + + " ```diff\n" + + f" - {base_car.detail_sentence}\n" + + f" + {new_car.detail_sentence}\n" + + " ```") + + # Print diff + if any(len(c) for c in changes.values()): + markdown_builder = ["### âš ī¸ This PR makes changes to [CARS.md](../blob/master/docs/CARS.md) âš ī¸"] + + for title, category in (("## 🔀 Column Changes", "column"), ("## ❌ Removed", "removals"), + ("## ➕ Added", "additions"), ("## 📖 Detail Sentence Changes", "detail")): + if len(changes[category]): + markdown_builder.append(title) + if category not in ("detail",): + markdown_builder.append(COLUMNS) + markdown_builder.append(COLUMN_HEADER) + markdown_builder.extend(changes[category]) + + print("\n".join(markdown_builder)) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--path", required=True) + args = parser.parse_args() + print_car_docs_diff(args.path) diff --git a/iqpilot/selfdrive/dmonitoringmodeld/__init__.py b/iqpilot/selfdrive/dmonitoringmodeld/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/dmonitoringmodeld/dmonitoringmodeld.py b/iqpilot/selfdrive/dmonitoringmodeld/dmonitoringmodeld.py new file mode 100755 index 000000000..bcaa13712 --- /dev/null +++ b/iqpilot/selfdrive/dmonitoringmodeld/dmonitoringmodeld.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +import os +from iqpilot.system.hardware import TICI +os.environ['DEV'] = 'QCOM' if TICI else 'CPU' +from tinygrad.tensor import Tensor +from tinygrad.dtype import dtypes +import time +import pickle +import numpy as np +from pathlib import Path + +from iqpilot.cereal import messaging +from iqpilot.cereal.messaging import PubMaster, SubMaster +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionIpcClient, VisionBuf +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.realtime import config_realtime_process +from iqpilot.common.transformations.model import dmonitoringmodel_intrinsics +from iqpilot.common.transformations.camera import _ar_ox_fisheye, _os_fisheye +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy +from iqpilot.selfdrive.dmonitoringmodeld.math import sigmoid, safe_exp +from iqpilot.selfdrive.dmonitoringmodeld.models.commonmodel_pyx import CLContext, MonitoringModelFrame +from iqpilot.selfdrive.iqmodeld.runtime.tinygrad import qcom_tensor_from_opencl_address + +PROCESS_NAME = "selfdrive.dmonitoringmodeld.dmonitoringmodeld" +SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') +MODEL_PKL_PATH = Path(__file__).parent / 'models/dmonitoring_model_tinygrad.pkl' +METADATA_PATH = Path(__file__).parent / 'models/dmonitoring_model_metadata.pkl' + + +class ModelState: + inputs: dict[str, np.ndarray] + output: np.ndarray + + def __init__(self, cl_ctx): + with open(METADATA_PATH, 'rb') as f: + model_metadata = pickle.load(f) + self.input_shapes = model_metadata['input_shapes'] + self.output_slices = model_metadata['output_slices'] + + self.frame = MonitoringModelFrame(cl_ctx) + self.numpy_inputs = { + 'calib': np.zeros(self.input_shapes['calib'], dtype=np.float32), + } + + self.tensor_inputs = {k: Tensor(v, device='NPY').realize() for k,v in self.numpy_inputs.items()} + with open(MODEL_PKL_PATH, "rb") as f: + self.model_run = pickle.load(f) + + def run(self, buf: VisionBuf, calib: np.ndarray, transform: np.ndarray) -> tuple[np.ndarray, float]: + self.numpy_inputs['calib'][0,:] = calib + + t1 = time.perf_counter() + + input_img_cl = self.frame.prepare(buf, transform.flatten()) + if TICI: + # The imgs tensors are backed by opencl memory, only need init once + if 'input_img' not in self.tensor_inputs: + self.tensor_inputs['input_img'] = qcom_tensor_from_opencl_address(input_img_cl.mem_address, self.input_shapes['input_img'], dtype=dtypes.uint8) + else: + self.tensor_inputs['input_img'] = Tensor(self.frame.buffer_from_cl(input_img_cl).reshape(self.input_shapes['input_img']), dtype=dtypes.uint8).realize() + + + output = self.model_run(**self.tensor_inputs).contiguous().realize().uop.base.buffer.numpy() + + t2 = time.perf_counter() + return output, t2 - t1 + +def slice_outputs(model_outputs, output_slices): + return {k: model_outputs[np.newaxis, v] for k,v in output_slices.items()} + +def parse_model_output(model_output): + parsed = {} + parsed['wheel_on_right'] = sigmoid(model_output['wheel_on_right']) + for ds_suffix in ['lhd', 'rhd']: + face_descs = model_output[f'face_descs_{ds_suffix}'] + parsed[f'face_descs_{ds_suffix}'] = face_descs[:, :-6] + parsed[f'face_descs_{ds_suffix}_std'] = safe_exp(face_descs[:, -6:]) + for key in ['face_prob', 'left_eye_prob', 'right_eye_prob','left_blink_prob', 'right_blink_prob', 'sunglasses_prob', 'using_phone_prob']: + parsed[f'{key}_{ds_suffix}'] = sigmoid(model_output[f'{key}_{ds_suffix}']) + return parsed + +def fill_driver_data(msg, model_output, ds_suffix): + msg.faceOrientation = model_output[f'face_descs_{ds_suffix}'][0, :3].tolist() + msg.faceOrientationStd = model_output[f'face_descs_{ds_suffix}_std'][0, :3].tolist() + msg.facePosition = model_output[f'face_descs_{ds_suffix}'][0, 3:5].tolist() + msg.facePositionStd = model_output[f'face_descs_{ds_suffix}_std'][0, 3:5].tolist() + msg.faceProb = model_output[f'face_prob_{ds_suffix}'][0, 0].item() + msg.leftEyeProb = model_output[f'left_eye_prob_{ds_suffix}'][0, 0].item() + msg.rightEyeProb = model_output[f'right_eye_prob_{ds_suffix}'][0, 0].item() + msg.leftBlinkProb = model_output[f'left_blink_prob_{ds_suffix}'][0, 0].item() + msg.rightBlinkProb = model_output[f'right_blink_prob_{ds_suffix}'][0, 0].item() + msg.sunglassesProb = model_output[f'sunglasses_prob_{ds_suffix}'][0, 0].item() + msg.phoneProb = model_output[f'using_phone_prob_{ds_suffix}'][0, 0].item() + +def get_driverstate_packet(model_output, frame_id: int, location_ts: int, exec_time: float, gpu_exec_time: float): + msg = messaging.new_message('driverStateV2', valid=True) + ds = msg.driverStateV2 + ds.frameId = frame_id + ds.modelExecutionTime = exec_time + ds.gpuExecutionTime = gpu_exec_time + ds.rawPredictions = model_output['raw_pred'] + ds.wheelOnRightProb = model_output['wheel_on_right'][0, 0].item() + fill_driver_data(ds.leftDriverData, model_output, 'lhd') + fill_driver_data(ds.rightDriverData, model_output, 'rhd') + return msg + + +def main(): + config_realtime_process(7, 5) + + # Set in the child, not at import: manager preimports every process module in the parent, + # so an import-time write lands in one shared env that all children inherit (and setdefault + # in a child is then a guaranteed no-op). tinygrad reads this lazily at QCOMDevice init. + # KGSL: lower value = higher priority. DM has no 50ms deadline; at the driving contexts' + # default 8 its kernels interleave with the warp and blow its submit tail 16ms -> 72ms p90. + os.environ['QCOM_PRIORITY'] = os.getenv('DMON_QCOM_PRIORITY', '12') + + cl_context = CLContext() + model = ModelState(cl_context) + cloudlog.warning("models loaded, dmonitoringmodeld starting") + + cloudlog.warning("connecting to driver stream") + vipc_client = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_DRIVER, True, cl_context) + while not vipc_client.connect(False): + time.sleep(0.1) + assert vipc_client.is_connected() + cloudlog.warning(f"connected with buffer size: {vipc_client.buffer_len}") + + sm = SubMaster(["extrinsicsCalibration"]) + pm = PubMaster(["driverStateV2"]) + + calib = np.zeros(model.numpy_inputs['calib'].size, dtype=np.float32) + model_transform = None + + while True: + buf = vipc_client.recv() + if buf is None: + continue + + if model_transform is None: + cam = _os_fisheye if buf.width == _os_fisheye.width else _ar_ox_fisheye + model_transform = np.linalg.inv(np.dot(dmonitoringmodel_intrinsics, np.linalg.inv(cam.intrinsics))).astype(np.float32) + + sm.update(0) + if sm.updated["extrinsicsCalibration"]: + calib_rpy = get_calibrated_rpy(sm["extrinsicsCalibration"]) + calib[:] = calib_rpy if calib_rpy is not None else np.zeros_like(calib) + + t1 = time.perf_counter() + model_output, gpu_execution_time = model.run(buf, calib, model_transform) + t2 = time.perf_counter() + raw_pred = model_output.tobytes() if SEND_RAW_PRED else b'' + model_output = slice_outputs(model_output, model.output_slices) + model_output = parse_model_output(model_output) + model_output['raw_pred'] = raw_pred + msg = get_driverstate_packet(model_output, vipc_client.frame_id, vipc_client.timestamp_sof, t2 - t1, gpu_execution_time) + pm.send("driverStateV2", msg) + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + cloudlog.warning("got SIGINT") diff --git a/iqpilot/selfdrive/dmonitoringmodeld/get_model_metadata.py b/iqpilot/selfdrive/dmonitoringmodeld/get_model_metadata.py new file mode 100755 index 000000000..2001d23d7 --- /dev/null +++ b/iqpilot/selfdrive/dmonitoringmodeld/get_model_metadata.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +import sys +import pathlib +import onnx +import codecs +import pickle +from typing import Any + +def get_name_and_shape(value_info:onnx.ValueInfoProto) -> tuple[str, tuple[int,...]]: + shape = tuple([int(dim.dim_value) for dim in value_info.type.tensor_type.shape.dim]) + name = value_info.name + return name, shape + +def get_metadata_value_by_name(model:onnx.ModelProto, name:str) -> str | Any: + for prop in model.metadata_props: + if prop.key == name: + return prop.value + return None + +if __name__ == "__main__": + model_path = pathlib.Path(sys.argv[1]) + model = onnx.load(str(model_path)) + output_slices = get_metadata_value_by_name(model, 'output_slices') + assert output_slices is not None, 'output_slices not found in metadata' + + metadata = { + 'model_checkpoint': get_metadata_value_by_name(model, 'model_checkpoint'), + 'output_slices': pickle.loads(codecs.decode(output_slices.encode(), "base64")), + 'input_shapes': dict([get_name_and_shape(x) for x in model.graph.input]), + 'output_shapes': dict([get_name_and_shape(x) for x in model.graph.output]) + } + + metadata_path = model_path.parent / (model_path.stem + '_metadata.pkl') + with open(metadata_path, 'wb') as f: + pickle.dump(metadata, f) + + print(f'saved metadata to {metadata_path}') diff --git a/iqpilot/selfdrive/dmonitoringmodeld/math.py b/iqpilot/selfdrive/dmonitoringmodeld/math.py new file mode 100644 index 000000000..13b724215 --- /dev/null +++ b/iqpilot/selfdrive/dmonitoringmodeld/math.py @@ -0,0 +1,9 @@ +import numpy as np + + +def safe_exp(values, out=None): + return np.exp(np.clip(values, -np.inf, 11), out=out) + + +def sigmoid(values): + return 1.0 / (1.0 + safe_exp(-values)) diff --git a/iqpilot/selfdrive/dmonitoringmodeld/models/__init__.py b/iqpilot/selfdrive/dmonitoringmodeld/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel_pyx.so b/iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel_pyx.so new file mode 100755 index 000000000..14ff3faa1 Binary files /dev/null and b/iqpilot/selfdrive/dmonitoringmodeld/models/commonmodel_pyx.so differ diff --git a/iqpilot/selfdrive/dmonitoringmodeld/models/dmonitoring_model_metadata.pkl b/iqpilot/selfdrive/dmonitoringmodeld/models/dmonitoring_model_metadata.pkl new file mode 100644 index 000000000..7869f9d66 Binary files /dev/null and b/iqpilot/selfdrive/dmonitoringmodeld/models/dmonitoring_model_metadata.pkl differ diff --git a/iqpilot/selfdrive/dmonitoringmodeld/models/dmonitoring_model_tinygrad.pkl b/iqpilot/selfdrive/dmonitoringmodeld/models/dmonitoring_model_tinygrad.pkl new file mode 100644 index 000000000..263c1b091 Binary files /dev/null and b/iqpilot/selfdrive/dmonitoringmodeld/models/dmonitoring_model_tinygrad.pkl differ diff --git a/iqpilot/selfdrive/dmonitoringmodeld/models/prebuilt_check.json b/iqpilot/selfdrive/dmonitoringmodeld/models/prebuilt_check.json new file mode 100644 index 000000000..be3d16087 --- /dev/null +++ b/iqpilot/selfdrive/dmonitoringmodeld/models/prebuilt_check.json @@ -0,0 +1,9 @@ +{ + "dmonitoring_model": { + "outputs": { + "dmonitoring_model_metadata.pkl": "31a86ab7a92dc0af088b15787a440dd3b210aa662e445a15145900e559a1b5c3", + "dmonitoring_model_tinygrad.pkl": "de991722fc93036a09595ac72f944f52afa15b097f182b3d5aa30a33d93d2d20" + }, + "signature": "696bc8453926631500feeb8f6d7baa9e8abeac06ee581e439b8edde299b24eb4" + } +} diff --git a/iqpilot/selfdrive/dmonitoringmodeld/prebuilt_models.py b/iqpilot/selfdrive/dmonitoringmodeld/prebuilt_models.py new file mode 100644 index 000000000..3b28bd944 --- /dev/null +++ b/iqpilot/selfdrive/dmonitoringmodeld/prebuilt_models.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +import functools +import hashlib +import json +import re +import sys +from pathlib import Path + +MODELD_DIR = Path(__file__).resolve().parent +MODELS_DIR = MODELD_DIR / 'models' +BASEDIR = MODELD_DIR.parents[2] +METADATA_SCRIPT = MODELD_DIR / 'get_model_metadata.py' +PYPROJECT = BASEDIR / 'pyproject.toml' +TINYGRAD_REVISION_FILE = BASEDIR / 'artifacts/package_sources/tinygrad/.iqpilot-revision' + +MODEL_NAMES = ['dmonitoring_model'] + + +def _hash_file(h, path: Path) -> None: + with open(path, 'rb') as f: + for chunk in iter(lambda: f.read(1024 * 1024), b''): + h.update(chunk) + + +def _file_sha256(path: Path) -> str: + h = hashlib.sha256() + _hash_file(h, path) + return h.hexdigest() + + +@functools.lru_cache(maxsize=1) +def _tinygrad_revision() -> str: + match = re.search(r'"tinygrad @ git\+https://[^@]+@([0-9a-f]{40})"', PYPROJECT.read_text()) + if match is not None: + return match.group(1) + + try: + revision = TINYGRAD_REVISION_FILE.read_text().strip() + except OSError as e: + raise RuntimeError("missing pinned tinygrad revision") from e + if re.fullmatch(r'[0-9a-f]{40}', revision) is None: + raise RuntimeError("invalid pinned tinygrad revision") + return revision + + +CHECK_PATH = MODELS_DIR / 'prebuilt_check.json' + + +def _load_checks() -> dict: + try: + data = json.loads(CHECK_PATH.read_text()) + except (json.JSONDecodeError, OSError): + return {} + return data if isinstance(data, dict) else {} + + +def _output_names(model_name: str) -> list[str]: + return [f'{model_name}_tinygrad.pkl', f'{model_name}_metadata.pkl'] + + +def compute_signature(model_name: str, flags: str) -> str: + h = hashlib.sha256() + h.update(flags.encode()) + h.update(_tinygrad_revision().encode()) + _hash_file(h, METADATA_SCRIPT) + _hash_file(h, MODELS_DIR / f'{model_name}.onnx') + return h.hexdigest() + + +def outputs_match(model_name: str) -> bool: + """The committed artifacts on disk are exactly the ones the check file pins.""" + data = _load_checks().get(model_name, {}) + outputs = data.get('outputs', {}) + if set(outputs) != set(_output_names(model_name)): + return False + for fn, expected in outputs.items(): + p = MODELS_DIR / fn + if not p.is_file() or _file_sha256(p) != expected: + return False + return True + + +def packaged_prebuilt_matches(model_name: str) -> bool: + return not (MODELS_DIR / f'{model_name}.onnx').is_file() and outputs_match(model_name) + + +def verify_prebuilt(model_name: str, flags: str) -> bool: + if not (MODELS_DIR / f'{model_name}.onnx').is_file(): + return False + data = _load_checks().get(model_name, {}) + if data.get('signature') != compute_signature(model_name, flags): + return False + return outputs_match(model_name) + + +def verification_details(model_name: str, flags: str) -> list[str]: + data = _load_checks().get(model_name, {}) + details = [ + f'signature expected={data.get("signature", "missing")} actual={compute_signature(model_name, flags)}', + f'tinygrad={_tinygrad_revision()}', + f'onnx={_file_sha256(MODELS_DIR / f"{model_name}.onnx")}', + f'metadata_script={_file_sha256(METADATA_SCRIPT)}', + ] + outputs = data.get('outputs', {}) + for fn in _output_names(model_name): + path = MODELS_DIR / fn + actual = _file_sha256(path) if path.is_file() else 'missing' + details.append(f'{fn} expected={outputs.get(fn, "missing")} actual={actual}') + return details + + +def write_check(model_name: str, flags: str) -> None: + outputs = {} + for fn in _output_names(model_name): + p = MODELS_DIR / fn + if not p.is_file(): + raise FileNotFoundError(f'missing build output: {p}') + outputs[fn] = _file_sha256(p) + checks = _load_checks() + checks[model_name] = {'signature': compute_signature(model_name, flags), 'outputs': outputs} + CHECK_PATH.write_text(json.dumps(checks, indent=2, sort_keys=True) + '\n') + + +def _larch64_flags() -> str: + return "DEV=QCOM IMAGE=2 FLOAT16=1 NOLOCALS=1 JIT_BATCH_SIZE=0 OPENPILOT_HACKS=1" + + +if __name__ == '__main__': + mode = sys.argv[1] if len(sys.argv) > 1 else 'verify' + flags = _larch64_flags() + for name in MODEL_NAMES: + if mode == 'write': + write_check(name, flags) + print(f'{name}: check written') + else: + valid = verify_prebuilt(name, flags) + print(f'{name}: {"OK" if valid else "STALE"}') + if not valid: + for detail in verification_details(name, flags): + print(f' {detail}') diff --git a/iqpilot/selfdrive/dmonitoringmodeld/test_prebuilt_models.py b/iqpilot/selfdrive/dmonitoringmodeld/test_prebuilt_models.py new file mode 100644 index 000000000..71acf033f --- /dev/null +++ b/iqpilot/selfdrive/dmonitoringmodeld/test_prebuilt_models.py @@ -0,0 +1,65 @@ +import hashlib +import json + +from iqpilot.selfdrive.dmonitoringmodeld import prebuilt_models + + +def write_outputs(models_dir, check_path): + outputs = {} + for name, contents in { + 'dmonitoring_model_tinygrad.pkl': b'tinygrad', + 'dmonitoring_model_metadata.pkl': b'metadata', + }.items(): + (models_dir / name).write_bytes(contents) + outputs[name] = hashlib.sha256(contents).hexdigest() + check_path.write_text(json.dumps({'dmonitoring_model': {'outputs': outputs}})) + + +def test_packaged_prebuilt_without_onnx(tmp_path, monkeypatch): + models_dir = tmp_path / 'models' + models_dir.mkdir() + check_path = models_dir / 'prebuilt_check.json' + write_outputs(models_dir, check_path) + monkeypatch.setattr(prebuilt_models, 'MODELS_DIR', models_dir) + monkeypatch.setattr(prebuilt_models, 'CHECK_PATH', check_path) + + assert prebuilt_models.packaged_prebuilt_matches('dmonitoring_model') + assert not prebuilt_models.verify_prebuilt('dmonitoring_model', 'flags') + + +def test_packaged_prebuilt_rejects_corrupt_output(tmp_path, monkeypatch): + models_dir = tmp_path / 'models' + models_dir.mkdir() + check_path = models_dir / 'prebuilt_check.json' + write_outputs(models_dir, check_path) + (models_dir / 'dmonitoring_model_tinygrad.pkl').write_bytes(b'corrupt') + monkeypatch.setattr(prebuilt_models, 'MODELS_DIR', models_dir) + monkeypatch.setattr(prebuilt_models, 'CHECK_PATH', check_path) + + assert not prebuilt_models.packaged_prebuilt_matches('dmonitoring_model') + + +def test_source_checkout_is_not_packaged_prebuilt(tmp_path, monkeypatch): + models_dir = tmp_path / 'models' + models_dir.mkdir() + check_path = models_dir / 'prebuilt_check.json' + write_outputs(models_dir, check_path) + (models_dir / 'dmonitoring_model.onnx').write_bytes(b'onnx') + monkeypatch.setattr(prebuilt_models, 'MODELS_DIR', models_dir) + monkeypatch.setattr(prebuilt_models, 'CHECK_PATH', check_path) + + assert not prebuilt_models.packaged_prebuilt_matches('dmonitoring_model') + + +def test_vendored_tinygrad_revision(tmp_path, monkeypatch): + revision = '0123456789abcdef0123456789abcdef01234567' + pyproject = tmp_path / 'pyproject.toml' + revision_file = tmp_path / '.iqpilot-revision' + pyproject.write_text('dependencies = ["tinygrad"]\n') + revision_file.write_text(f'{revision}\n') + monkeypatch.setattr(prebuilt_models, 'PYPROJECT', pyproject) + monkeypatch.setattr(prebuilt_models, 'TINYGRAD_REVISION_FILE', revision_file) + prebuilt_models._tinygrad_revision.cache_clear() + + assert prebuilt_models._tinygrad_revision() == revision + prebuilt_models._tinygrad_revision.cache_clear() diff --git a/iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.cl b/iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.cl new file mode 100644 index 000000000..2ca25920c --- /dev/null +++ b/iqpilot/selfdrive/dmonitoringmodeld/transforms/transform.cl @@ -0,0 +1,54 @@ +#define INTER_BITS 5 +#define INTER_TAB_SIZE (1 << INTER_BITS) +#define INTER_SCALE 1.f / INTER_TAB_SIZE + +#define INTER_REMAP_COEF_BITS 15 +#define INTER_REMAP_COEF_SCALE (1 << INTER_REMAP_COEF_BITS) + +__kernel void warpPerspective(__global const uchar * src, + int src_row_stride, int src_px_stride, int src_offset, int src_rows, int src_cols, + __global uchar * dst, + int dst_row_stride, int dst_offset, int dst_rows, int dst_cols, + __constant float * M) +{ + int dx = get_global_id(0); + int dy = get_global_id(1); + + if (dx < dst_cols && dy < dst_rows) + { + float X0 = M[0] * dx + M[1] * dy + M[2]; + float Y0 = M[3] * dx + M[4] * dy + M[5]; + float W = M[6] * dx + M[7] * dy + M[8]; + W = W != 0.0f ? INTER_TAB_SIZE / W : 0.0f; + int X = rint(X0 * W), Y = rint(Y0 * W); + + int sx = convert_short_sat(X >> INTER_BITS); + int sy = convert_short_sat(Y >> INTER_BITS); + + short sx_clamp = clamp(sx, 0, src_cols - 1); + short sx_p1_clamp = clamp(sx + 1, 0, src_cols - 1); + short sy_clamp = clamp(sy, 0, src_rows - 1); + short sy_p1_clamp = clamp(sy + 1, 0, src_rows - 1); + int v0 = convert_int(src[mad24(sy_clamp, src_row_stride, src_offset + sx_clamp*src_px_stride)]); + int v1 = convert_int(src[mad24(sy_clamp, src_row_stride, src_offset + sx_p1_clamp*src_px_stride)]); + int v2 = convert_int(src[mad24(sy_p1_clamp, src_row_stride, src_offset + sx_clamp*src_px_stride)]); + int v3 = convert_int(src[mad24(sy_p1_clamp, src_row_stride, src_offset + sx_p1_clamp*src_px_stride)]); + + short ay = (short)(Y & (INTER_TAB_SIZE - 1)); + short ax = (short)(X & (INTER_TAB_SIZE - 1)); + float taby = 1.f/INTER_TAB_SIZE*ay; + float tabx = 1.f/INTER_TAB_SIZE*ax; + + int dst_index = mad24(dy, dst_row_stride, dst_offset + dx); + + int itab0 = convert_short_sat_rte( (1.0f-taby)*(1.0f-tabx) * INTER_REMAP_COEF_SCALE ); + int itab1 = convert_short_sat_rte( (1.0f-taby)*tabx * INTER_REMAP_COEF_SCALE ); + int itab2 = convert_short_sat_rte( taby*(1.0f-tabx) * INTER_REMAP_COEF_SCALE ); + int itab3 = convert_short_sat_rte( taby*tabx * INTER_REMAP_COEF_SCALE ); + + int val = v0 * itab0 + v1 * itab1 + v2 * itab2 + v3 * itab3; + + uchar pix = convert_uchar_sat((val + (1 << (INTER_REMAP_COEF_BITS-1))) >> INTER_REMAP_COEF_BITS); + dst[dst_index] = pix; + } +} diff --git a/iqpilot/selfdrive/iqlocd/__init__.py b/iqpilot/selfdrive/iqlocd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/iqlocd/iqlocd b/iqpilot/selfdrive/iqlocd/iqlocd new file mode 100755 index 000000000..2f0e55327 Binary files /dev/null and b/iqpilot/selfdrive/iqlocd/iqlocd differ diff --git a/iqpilot/selfdrive/iqlocd/models/__init__.py b/iqpilot/selfdrive/iqlocd/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/iqlocd/models/car_kf.py b/iqpilot/selfdrive/iqlocd/models/car_kf.py new file mode 100644 index 000000000..9bb86b358 --- /dev/null +++ b/iqpilot/selfdrive/iqlocd/models/car_kf.py @@ -0,0 +1,94 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import math +from typing import Any + +import numpy as np + +from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY +from iqpilot.selfdrive.iqlocd.models.constants import ObservationKind +from iqpilot.selfdrive.state_estimation import EstimatorModel, ModelDefinition, StateEstimator +try: + from iqpilot.selfdrive.state_estimation.native_binding_pyx import car_predict, car_update +except ModuleNotFoundError: + car_predict = None + car_update = None + + +class States: + STIFFNESS = slice(0, 1) + STEER_RATIO = slice(1, 2) + ANGLE_OFFSET = slice(2, 3) + ANGLE_OFFSET_FAST = slice(3, 4) + VELOCITY = slice(4, 6) + YAW_RATE = slice(6, 7) + STEER_ANGLE = slice(7, 8) + ROAD_ROLL = slice(8, 9) + + +def _transition(state: np.ndarray, dt: float, values: dict[str, float]) -> np.ndarray: + result = state.copy() + stiffness = state[0] + steer_ratio = state[1] + angle = state[7] - state[2] - state[3] + speed, lateral_speed = state[4:6] + yaw_rate = state[6] + mass = values["mass"] + inertia = values["rotational_inertia"] + front = values["center_to_front"] + rear = values["center_to_rear"] + front_stiffness = stiffness * values["stiffness_front"] + rear_stiffness = stiffness * values["stiffness_rear"] + lateral_dot = -(front_stiffness + rear_stiffness) * lateral_speed / (mass * speed) + lateral_dot += (-(front_stiffness * front - rear_stiffness * rear) / (mass * speed) - speed) * yaw_rate + lateral_dot += front_stiffness * angle / (mass * steer_ratio) - ACCELERATION_DUE_TO_GRAVITY * state[8] + yaw_dot = -(front_stiffness * front - rear_stiffness * rear) * lateral_speed / (inertia * speed) + yaw_dot -= (front_stiffness * front**2 + rear_stiffness * rear**2) * yaw_rate / (inertia * speed) + yaw_dot += front_stiffness * front * angle / (inertia * steer_ratio) + result[5] += dt * lateral_dot + result[6] += dt * yaw_dot + return result + + +class CarKalman(EstimatorModel): + name = "car" + initial_x = np.array([1.0, 15.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0]) + Q = np.diag([(.05 / 100)**2, .01**2, math.radians(0.02)**2, math.radians(0.25)**2, + .1**2, .01**2, math.radians(0.1)**2, math.radians(0.1)**2, math.radians(1)**2]) + P_initial = Q.copy() + obs_noise: dict[int, Any] = { + ObservationKind.STEER_ANGLE: np.atleast_2d(math.radians(0.05)**2), + ObservationKind.ANGLE_OFFSET_FAST: np.atleast_2d(math.radians(10.0)**2), + ObservationKind.ROAD_ROLL: np.atleast_2d(math.radians(1.0)**2), + ObservationKind.STEER_RATIO: np.atleast_2d(5.0**2), + ObservationKind.STIFFNESS: np.atleast_2d(0.5**2), + ObservationKind.ROAD_FRAME_X_SPEED: np.atleast_2d(0.1**2), + } + + def __init__(self): + self.native_parameters = np.zeros(6) + measurements = { + ObservationKind.ROAD_FRAME_YAW_RATE: lambda state, _: state[6:7], + ObservationKind.ROAD_FRAME_XY_SPEED: lambda state, _: state[4:6], + ObservationKind.ROAD_FRAME_X_SPEED: lambda state, _: state[4:5], + ObservationKind.STEER_ANGLE: lambda state, _: state[7:8], + ObservationKind.ANGLE_OFFSET_FAST: lambda state, _: state[3:4], + ObservationKind.STEER_RATIO: lambda state, _: state[1:2], + ObservationKind.STIFFNESS: lambda state, _: state[0:1], + ObservationKind.ROAD_ROLL: lambda state, _: state[8:9], + } + def native_predict(state, covariance, dt, process_noise, _): + car_predict(state, covariance, process_noise, dt, self.native_parameters) + + model = ModelDefinition(9, 9, _transition, measurements, self.Q, self.obs_noise, + native_predict=native_predict if car_predict is not None else None, native_update=car_update) + super().__init__(StateEstimator(model, self.initial_x, self.P_initial, max_rewind_age=0.8)) + + def set_globals(self, mass: float, rotational_inertia: float, center_to_front: float, center_to_rear: float, + stiffness_front: float, stiffness_rear: float) -> None: + self.native_parameters[:] = mass, rotational_inertia, center_to_front, center_to_rear, stiffness_front, stiffness_rear + for name, value in locals().copy().items(): + if name != "self": + self.filter.set_global(name, value) diff --git a/iqpilot/selfdrive/iqlocd/models/constants.py b/iqpilot/selfdrive/iqlocd/models/constants.py new file mode 100644 index 000000000..8e95ff82e --- /dev/null +++ b/iqpilot/selfdrive/iqlocd/models/constants.py @@ -0,0 +1,88 @@ +class ObservationKind: + UNKNOWN = 0 + NO_OBSERVATION = 1 + GPS_NED = 2 + ODOMETRIC_SPEED = 3 + PHONE_GYRO = 4 + GPS_VEL = 5 + PSEUDORANGE_GPS = 6 + PSEUDORANGE_RATE_GPS = 7 + SPEED = 8 + NO_ROT = 9 + PHONE_ACCEL = 10 + ORB_POINT = 11 + ECEF_POS = 12 + CAMERA_ODO_TRANSLATION = 13 + CAMERA_ODO_ROTATION = 14 + ORB_FEATURES = 15 + MSCKF_TEST = 16 + FEATURE_TRACK_TEST = 17 + LANE_PT = 18 + IMU_FRAME = 19 + PSEUDORANGE_GLONASS = 20 + PSEUDORANGE_RATE_GLONASS = 21 + PSEUDORANGE = 22 + PSEUDORANGE_RATE = 23 + ECEF_VEL = 35 + ECEF_ORIENTATION_FROM_GPS = 32 + NO_ACCEL = 33 + ORB_FEATURES_WIDE = 34 + + ROAD_FRAME_XY_SPEED = 24 # (x, y) [m/s] + ROAD_FRAME_YAW_RATE = 25 # [rad/s] + STEER_ANGLE = 26 # [rad] + ANGLE_OFFSET_FAST = 27 # [rad] + STIFFNESS = 28 # [-] + STEER_RATIO = 29 # [-] + ROAD_FRAME_X_SPEED = 30 # (x) [m/s] + ROAD_ROLL = 31 # [rad] + + names = [ + 'Unknown', + 'No observation', + 'GPS NED', + 'Odometric speed', + 'Phone gyro', + 'GPS velocity', + 'GPS pseudorange', + 'GPS pseudorange rate', + 'Speed', + 'No rotation', + 'Phone acceleration', + 'ORB point', + 'ECEF pos', + 'camera odometric translation', + 'camera odometric rotation', + 'ORB features', + 'MSCKF test', + 'Feature track test', + 'Lane ecef point', + 'imu frame eulers', + 'GLONASS pseudorange', + 'GLONASS pseudorange rate', + 'pseudorange', + 'pseudorange rate', + + 'Road Frame x,y speed', + 'Road Frame yaw rate', + 'Steer Angle', + 'Fast Angle Offset', + 'Stiffness', + 'Steer Ratio', + 'Road Frame x speed', + 'Road Roll', + 'ECEF orientation from GPS', + 'NO accel', + 'ORB features wide camera', + 'ECEF_VEL', + ] + + @classmethod + def to_string(cls, kind): + return cls.names[kind] + + +SAT_OBS = [ObservationKind.PSEUDORANGE_GPS, + ObservationKind.PSEUDORANGE_RATE_GPS, + ObservationKind.PSEUDORANGE_GLONASS, + ObservationKind.PSEUDORANGE_RATE_GLONASS] diff --git a/iqpilot/selfdrive/iqlocd/tests/__init__.py b/iqpilot/selfdrive/iqlocd/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/iqlocd/tests/test_iqlocd.py b/iqpilot/selfdrive/iqlocd/tests/test_iqlocd.py new file mode 100644 index 000000000..545b5d5c1 --- /dev/null +++ b/iqpilot/selfdrive/iqlocd/tests/test_iqlocd.py @@ -0,0 +1,114 @@ +import pytest +import json +import os +import random +import subprocess +import time +import capnp +from pathlib import Path + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.params import Params +from iqpilot.common.transformations.coordinates import ecef2geodetic +from iqpilot.common.basedir import BASEDIR + + +@pytest.mark.linux +class TestIQLocdProc: + LLD_MSGS = ['gpsLocationExternal', 'cameraOdometry', 'carState', 'extrinsicsCalibration', + 'accelerometer', 'gyroscope'] + + @pytest.fixture(autouse=True) + def setup_iqlocd(self, openpilot_function_fixture): + self.pm = messaging.PubMaster(self.LLD_MSGS) + self.sm = messaging.SubMaster(['iqLiveLocation']) + self.params = Params() + assert self.params.get_param_path().endswith(os.environ['OPENPILOT_PREFIX']) + self.params.put_bool("UbloxAvailable", True) + iqlocd_dir = Path(BASEDIR) / 'iqpilot/selfdrive/iqlocd' + self.proc = subprocess.Popen(['./iqlocd'], cwd=iqlocd_dir, env=os.environ.copy()) + yield + self.proc.terminate() + self.proc.wait(timeout=5) + + def get_msg(self, name, t): + try: + msg = messaging.new_message(name) + except capnp.lib.capnp.KjException: + msg = messaging.new_message(name, 0) + + if name == "gpsLocationExternal": + gps = getattr(msg, name) + gps.flags = 1 + gps.hasFix = True + gps.source = 'ublox' + gps.horizontalAccuracy = 1.0 + gps.verticalAccuracy = 1.0 + gps.speedAccuracy = 1.0 + gps.bearingAccuracyDeg = 1.0 + gps.vNED = [0.0, 0.0, 0.0] + gps.latitude = float(self.lat) + gps.longitude = float(self.lon) + gps.unixTimestampMillis = t // 1_000_000 + gps.altitude = float(self.alt) + elif name == 'cameraOdometry': + msg.cameraOdometry.rot = [0.0, 0.0, 0.0] + msg.cameraOdometry.rotStd = [0.01, 0.01, 0.01] + msg.cameraOdometry.trans = [0.0, 0.0, 0.0] + msg.cameraOdometry.transStd = [0.01, 0.01, 0.01] + elif name == 'extrinsicsCalibration': + msg.extrinsicsCalibration.calStatus = 'calibrated' + msg.extrinsicsCalibration.rpyCalib = [0.0, 0.0, 0.0] + elif name == 'accelerometer': + msg.accelerometer.sensor = 1 + msg.accelerometer.type = 1 + msg.accelerometer.timestamp = t + msg.accelerometer.init('acceleration').v = [0.0, 0.0, 9.81] + elif name == 'gyroscope': + msg.gyroscope.sensor = 5 + msg.gyroscope.type = 16 + msg.gyroscope.timestamp = t + msg.gyroscope.init('gyroUncalibrated').v = [0.0, 0.0, 0.0] + msg.logMonoTime = t + msg.valid = True + return msg + + def test_params_gps(self): + random.seed(123489234) + self.params.remove('LastGPSPositionIQLoc') + + self.x = -2710700 + (random.random() * 1e5) + self.y = -4280600 + (random.random() * 1e5) + self.z = 3850300 + (random.random() * 1e5) + self.lat, self.lon, self.alt = ecef2geodetic([self.x, self.y, self.z]) + msgs = [] + for sec in range(1, 4): + for name in self.LLD_MSGS: + for j in range(int(SERVICE_LIST[name].frequency)): + msgs.append(self.get_msg(name, int((sec + j / SERVICE_LIST[name].frequency) * 1e9))) + + for msg in sorted(msgs, key=lambda x: x.logMonoTime): + self.pm.send(msg.which(), msg) + if msg.which() == "cameraOdometry": + self.pm.wait_for_readers_to_update(msg.which(), 0.1, dt=0.005) + self.sm.update(0) + time.sleep(0.001) + deadline = time.monotonic() + 5.0 + last_gps_raw = None + while time.monotonic() < deadline and last_gps_raw is None: + last_gps_raw = self.params.get('LastGPSPositionIQLoc') + self.sm.update(0) + time.sleep(0.05) + assert self.proc.poll() is None + location = self.sm['iqLiveLocation'] + assert last_gps_raw is not None, { + 'gpsHealthy': location.gpsHealthy, + 'inputsHealthy': location.inputsHealthy, + 'sensorsHealthy': location.sensorsHealthy, + 'isolatedPath': self.params.get_param_path(), + } + lastGPS = json.loads(last_gps_raw) + assert lastGPS['latitude'] == pytest.approx(self.lat, abs=0.001) + assert lastGPS['longitude'] == pytest.approx(self.lon, abs=0.001) + assert lastGPS['altitude'] == pytest.approx(self.alt, abs=0.2) diff --git a/iqpilot/selfdrive/iqmodeld/.gitignore b/iqpilot/selfdrive/iqmodeld/.gitignore new file mode 100644 index 000000000..742d3d120 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/.gitignore @@ -0,0 +1 @@ +*_pyx.cpp diff --git a/iqpilot/selfdrive/iqmodeld/__init__.py b/iqpilot/selfdrive/iqmodeld/__init__.py new file mode 100644 index 000000000..0b73f364a --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/__init__.py @@ -0,0 +1,23 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from pathlib import Path + + +def _models_dir() -> Path: + return Path(__file__).resolve().parent / "models" + + +def _artifact_path(stem: str, suffix: str) -> Path: + return _models_dir() / f"{stem}{suffix}" + + +MODEL_ASSETS = { + "onnx": _artifact_path("supercombo", ".onnx"), + "tinygrad": _artifact_path("supercombo", "_tinygrad.pkl"), + "metadata": _artifact_path("supercombo", "_metadata.pkl"), +} + +MODEL_PATH = MODEL_ASSETS["onnx"] +MODEL_PKL_PATH = MODEL_ASSETS["tinygrad"] +METADATA_PATH = MODEL_ASSETS["metadata"] diff --git a/iqpilot/selfdrive/iqmodeld/big_catalog.py b/iqpilot/selfdrive/iqmodeld/big_catalog.py new file mode 100644 index 000000000..972671971 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/big_catalog.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.big_catalog") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.big_catalog import * diff --git a/iqpilot/selfdrive/iqmodeld/camera.py b/iqpilot/selfdrive/iqmodeld/camera.py new file mode 100644 index 000000000..a19e6ce51 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/camera.py @@ -0,0 +1,70 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import numpy as np + +from iqpilot.common.transformations.camera import DEVICE_CAMERAS + +MAX_CAMERA_OFFSET_METERS = 0.35 + + +class _OffsetSmoother: + def __init__(self, blend: float = 0.1): + self._blend = blend + self._value = 0.0 + + def step(self, target: float) -> float: + self._value = ((1.0 - self._blend) * self._value) + (self._blend * float(target)) + return self._value + + +def _clamped_offset(raw_offset) -> float: + try: + parsed = float(raw_offset) + except (TypeError, ValueError): + parsed = 0.0 + return float(np.clip(parsed, -MAX_CAMERA_OFFSET_METERS, MAX_CAMERA_OFFSET_METERS)) + + +def _camera_profile(sm): + return DEVICE_CAMERAS[(str(sm["deviceState"].deviceType), str(sm["roadCameraState"].sensor))] + + +def _calibration_height(sm) -> float: + from iqpilot.selfdrive.locationd.calibrationd import HEIGHT_SANE_MIN, HEIGHT_SANE_MAX + h = sm["extrinsicsCalibration"].height[0] if sm["extrinsicsCalibration"].height else 1.22 + return h if HEIGHT_SANE_MIN <= h <= HEIGHT_SANE_MAX else 1.22 + + +def _sheared_transform(model_transform, intrinsics, height: float, lateral_offset: float): + optical_center_y = intrinsics[1, 2] + projection_bias = np.eye(3, dtype=np.float32) + projection_bias[0, 1] = lateral_offset / height + projection_bias[0, 2] = -(lateral_offset / height) * optical_center_y + return (projection_bias @ model_transform).astype(np.float32) + + +class CameraOffsetHelper: + def __init__(self): + self.camera_offset = 0.0 + self.actual_camera_offset = 0.0 + self._smoother = _OffsetSmoother() + + @staticmethod + def apply_camera_offset(model_transform, intrinsics, height, offset_param): + return _sheared_transform(model_transform, intrinsics, height, offset_param) + + def set_offset(self, offset): + self.camera_offset = _clamped_offset(offset) + + def update(self, model_transform_main, model_transform_extra, sm, main_wide_camera, extra_uses_wide_camera=True): + self.actual_camera_offset = self._smoother.step(self.camera_offset) + camera_bundle = _camera_profile(sm) + camera_height = _calibration_height(sm) + main_intrinsics = camera_bundle.ecam.intrinsics if main_wide_camera else camera_bundle.fcam.intrinsics + extra_intrinsics = camera_bundle.ecam.intrinsics if extra_uses_wide_camera else camera_bundle.fcam.intrinsics + + return ( + self.apply_camera_offset(model_transform_main, main_intrinsics, camera_height, self.actual_camera_offset), + self.apply_camera_offset(model_transform_extra, extra_intrinsics, camera_height, self.actual_camera_offset), + ) diff --git a/iqpilot/selfdrive/iqmodeld/config.py b/iqpilot/selfdrive/iqmodeld/config.py new file mode 100644 index 000000000..5b73c0115 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/config.py @@ -0,0 +1,133 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + + +def index_function(index: int, max_val: float = 192, max_idx: int = 32) -> float: + return max_val * ((index / max_idx) ** 2) + + +def _quadratic_series(limit: float, steps: int) -> list[float]: + return [index_function(index, max_val=limit, max_idx=steps - 1) for index in range(steps)] + + +def _probability_window(*values: float) -> np.ndarray: + return np.asarray(values, dtype=np.float32) + + +def _field_group(start: int, stop: int, stride: int) -> slice: + return slice(start, stop, stride) + + +_IDX_COUNT = 33 +_T_AXIS = _quadratic_series(10.0, _IDX_COUNT) +_X_AXIS = _quadratic_series(192.0, _IDX_COUNT) + + +class ModelConstants: + IDX_N = _IDX_COUNT + T_IDXS = _T_AXIS + X_IDXS = _X_AXIS + LEAD_T_IDXS = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0] + LEAD_T_OFFSETS = [0.0, 2.0, 4.0] + META_T_IDXS = [2.0, 4.0, 6.0, 8.0, 10.0] + + MODEL_FREQ = 20 + FEATURE_LEN = 512 + FULL_HISTORY_BUFFER_LEN = 99 + HISTORY_BUFFER_LEN = FULL_HISTORY_BUFFER_LEN + DESIRE_LEN = 8 + TRAFFIC_CONVENTION_LEN = 2 + NAV_FEATURE_LEN = 256 + NAV_INSTRUCTION_LEN = 150 + LAT_PLANNER_STATE_LEN = 4 + LATERAL_CONTROL_PARAMS_LEN = 2 + PREV_DESIRED_CURV_LEN = 1 + + FCW_THRESHOLDS_5MS2 = _probability_window(0.05, 0.05, 0.15, 0.15, 0.15) + FCW_THRESHOLDS_3MS2 = _probability_window(0.7, 0.7) + FCW_5MS2_PROBS_WIDTH = 5 + FCW_3MS2_PROBS_WIDTH = 2 + + DISENGAGE_WIDTH = 5 + POSE_WIDTH = 6 + WIDE_FROM_DEVICE_WIDTH = 3 + SIM_POSE_WIDTH = 6 + LEAD_WIDTH = 4 + LANE_LINES_WIDTH = 2 + ROAD_EDGES_WIDTH = 2 + PLAN_WIDTH = 15 + DESIRE_PRED_WIDTH = 8 + LAT_PLANNER_SOLUTION_WIDTH = 4 + DESIRED_CURV_WIDTH = 1 + + NUM_LANE_LINES = 4 + NUM_ROAD_EDGES = 2 + LEAD_TRAJ_LEN = 6 + DESIRE_PRED_LEN = 4 + + PLAN_MHP_N = 5 + LEAD_MHP_N = 2 + PLAN_MHP_SELECTION = 1 + LEAD_MHP_SELECTION = 3 + + FCW_THRESHOLD_5MS2_HIGH = 0.15 + FCW_THRESHOLD_5MS2_LOW = 0.05 + FCW_THRESHOLD_3MS2 = 0.7 + + CONFIDENCE_BUFFER_LEN = 5 + RYG_GREEN = 0.01165 + RYG_YELLOW = 0.06157 + POLY_PATH_DEGREE = 4 + + +class Plan: + POSITION = slice(0, 3) + VELOCITY = slice(3, 6) + ACCELERATION = slice(6, 9) + T_FROM_CURRENT_EULER = slice(9, 12) + ORIENTATION_RATE = slice(12, 15) + + +class Meta: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 31, 6) + BRAKE_DISENGAGE = _field_group(2, 31, 6) + STEER_OVERRIDE = _field_group(3, 31, 6) + HARD_BRAKE_3 = _field_group(4, 31, 6) + HARD_BRAKE_4 = _field_group(5, 31, 6) + HARD_BRAKE_5 = _field_group(6, 31, 6) + GAS_PRESS = _field_group(31, 55, 4) + BRAKE_PRESS = _field_group(32, 55, 4) + LEFT_BLINKER = _field_group(33, 55, 4) + RIGHT_BLINKER = _field_group(34, 55, 4) + + +class MetaTombRaider: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 41, 8) + BRAKE_DISENGAGE = _field_group(2, 41, 8) + STEER_OVERRIDE = _field_group(3, 41, 8) + HARD_BRAKE_3 = _field_group(4, 41, 8) + HARD_BRAKE_4 = _field_group(5, 41, 8) + HARD_BRAKE_5 = _field_group(6, 41, 8) + GAS_PRESS = _field_group(7, 41, 8) + BRAKE_PRESS = _field_group(8, 41, 8) + LEFT_BLINKER = _field_group(41, 53, 2) + RIGHT_BLINKER = _field_group(42, 53, 2) + + +class MetaSimPose: + ENGAGED = _field_group(0, 1, 1) + GAS_DISENGAGE = _field_group(1, 36, 7) + BRAKE_DISENGAGE = _field_group(2, 36, 7) + STEER_OVERRIDE = _field_group(3, 36, 7) + HARD_BRAKE_3 = _field_group(4, 36, 7) + HARD_BRAKE_4 = _field_group(5, 36, 7) + HARD_BRAKE_5 = _field_group(6, 36, 7) + GAS_PRESS = _field_group(7, 36, 7) + LEFT_BLINKER = _field_group(36, 48, 2) + RIGHT_BLINKER = _field_group(37, 48, 2) diff --git a/iqpilot/selfdrive/iqmodeld/daemon.py b/iqpilot/selfdrive/iqmodeld/daemon.py new file mode 100755 index 000000000..97327992f --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/daemon.py @@ -0,0 +1,767 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import sys +import time +from dataclasses import dataclass +from typing import Any + +import iqpilot.cereal.messaging as messaging +import numpy as np + +from iqpilot.cereal import car, custom, log +from iqpilot.cereal.messaging import PubMaster, SubMaster +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionBuf, VisionIpcClient +from iqdbc.car.car_helpers import get_demo_car_params +from setproctitle import setproctitle + +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.iq_perf import PerfSample, PerfTraceEmitter, PerfTraceRing +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL, config_realtime_process +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.transformations.camera import DEVICE_CAMERAS +from iqpilot.common.transformations.model import get_warp_matrix +from iqpilot.selfdrive.controls.lib.desire_helper import DesireHelper +from iqpilot.selfdrive.controls.lib.drive_helpers import ( + MODEL_SMOOTHING_MAX_TOTAL_SEC, + dynamic_lat_smooth_extra_seconds, + get_accel_from_plan, + smooth_value, +) +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy +from iqpilot.system import sentry + +from iqpilot.common.steer_delay import lateral_action_delay +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle +from iqpilot.selfdrive.iqmodeld.models.inference_state import InferenceStateBase +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import get_model_runner +from iqpilot.selfdrive.iqmodeld.camera import CameraOffsetHelper +from iqpilot.selfdrive.iqmodeld.config import Plan +from iqpilot.selfdrive.iqmodeld.messaging import ( + DrivePacketMemory, + pick_curvature, + populate_drive_messages, + populate_odometry_message, +) +from iqpilot.selfdrive.iqmodeld.metadata import select_meta_layout + +try: + from iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import RoadProjector, WarpContext +except ModuleNotFoundError: + class WarpContext: + def __init__(self, *args, **kwargs): + raise ModuleNotFoundError("iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx is not built") + + class RoadProjector: + def __init__(self, *args, **kwargs): + raise ModuleNotFoundError("iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx is not built") + + +PROCESS_NAME = "iqpilot.selfdrive.iqmodeld.daemon" +IQP_NAV_MODEL_INFLUENCE_ENABLED = False +TurnDirection = custom.IQTurnSignalDirection +IQMODEL_EVAL_WARN_US = int(DT_MDL * 1_000_000) +IQMODEL_EVAL_ERROR_US = IQMODEL_EVAL_WARN_US * 2 +_FRAME_STARVED_BACKOFF_POLLS = 5 +_FRAME_STARVED_BACKOFF_SECONDS = 0.005 +_FRAME_STARVED_LOG_EVERY = 200 + + +def _plan_y_std_1s(outputs: dict[str, np.ndarray]) -> float: + # plan_stds is (batch, IDX_N, PLAN_WIDTH); index 10 ~= 1s ahead (see ModelConstants.T_IDXS), + # POSITION is an (x, y, z) slice within PLAN_WIDTH so [1] picks the lateral (y) std. + try: + return float(outputs["plan_stds"][0, 10, Plan.POSITION][1]) + except (KeyError, IndexError): + return 0.0 + + +def _model_lat_smooth_max_sec(params: Params) -> float: + if not params.get_bool("ModelSmoothingEnabled"): + return 0.0 + try: + raw = params.get("ModelLatSmoothSec", return_default=True) + raw = 0 if raw is None else int(raw) + except (ValueError, TypeError): + raw = 0 + return min(max(raw, 0), 30) * 0.01 + + +@dataclass +class CaptureStamp: + frame_id: int = 0 + timestamp_sof: int = 0 + timestamp_eof: int = 0 + + @classmethod + def from_vipc(cls, client: VisionIpcClient) -> "CaptureStamp": + return cls(client.frame_id, client.timestamp_sof, client.timestamp_eof) + + +@dataclass(frozen=True) +class StreamLayout: + dual_camera: bool + main_is_wide: bool + primary_stream: VisionStreamType + + +class ReplayLedger: + def __init__(self, tensor_shapes: dict[str, tuple[int, ...]], frame_inputs: list[str]): + self.inputs: dict[str, np.ndarray] = {} + self.archive: dict[str, np.ndarray] = {} + self.selectors: dict[str, np.ndarray] = {} + self._frame_inputs = set(frame_inputs) + self._pulse_name: str | None = None + self._pulse_memory: np.ndarray | None = None + + feature_shape = tensor_shapes.get("features_buffer") + for tensor_name, tensor_shape in tensor_shapes.items(): + if tensor_name in self._frame_inputs: + continue + + self.inputs[tensor_name] = np.zeros(tensor_shape, dtype=np.float32) + if len(tensor_shape) != 3 or tensor_shape[1] <= 1: + continue + + history_len = self._history_length(tensor_shape, feature_shape) + self.archive[tensor_name] = np.zeros((1, history_len, tensor_shape[2]), dtype=np.float32) + export_index = self._export_index(tensor_shape, history_len, feature_shape) + if export_index is not None: + self.selectors[tensor_name] = export_index + + if tensor_name.startswith("desire"): + self._pulse_name = tensor_name + self._pulse_memory = np.zeros(tensor_shape[2], dtype=np.float32) + + @staticmethod + def _history_length(tensor_shape: tuple[int, ...], feature_shape: tuple[int, ...] | None) -> int: + if tensor_shape[1] >= 99: + return tensor_shape[1] + if tensor_shape[1] in (24, 25) and feature_shape is not None and feature_shape[1] == 24: + return (feature_shape[1] + 1) * 4 + return tensor_shape[1] * 4 + + @staticmethod + def _export_index(tensor_shape: tuple[int, ...], history_len: int, + feature_shape: tuple[int, ...] | None) -> np.ndarray | None: + if tensor_shape[1] in (24, 25) and feature_shape is not None and feature_shape[1] == 24: + stride = int(-history_len / tensor_shape[1]) + return np.arange(stride, stride * (tensor_shape[1] + 1), stride)[::-1] + if tensor_shape[1] == 25: + skip = history_len // tensor_shape[1] + return np.arange(history_len)[-1 - (skip * (tensor_shape[1] - 1))::skip] + if tensor_shape[1] >= 99: + return np.arange(tensor_shape[1]) + return None + + @property + def pulse_name(self) -> str: + if self._pulse_name is None: + raise KeyError("No desire-like pulse input present in model inputs") + return self._pulse_name + + def _shift_archive(self, tensor_name: str) -> np.ndarray: + history = self.archive[tensor_name] + history[0, :-1] = history[0, 1:] + return history + + def inject_pulse(self, pulse_values: np.ndarray) -> None: + pulse = pulse_values.copy() + pulse[0] = 0 + assert self._pulse_memory is not None + rising = np.where(pulse - self._pulse_memory > 0.99, pulse, 0) + self._pulse_memory[:] = pulse + + history = self._shift_archive(self.pulse_name) + history[0, -1] = rising + exported_shape = self.inputs[self.pulse_name].shape + if history.shape[1] > exported_shape[1]: + stride = history.shape[1] // exported_shape[1] + self.inputs[self.pulse_name][:] = history[0].reshape( + exported_shape[0], exported_shape[1], stride, -1 + ).max(axis=2) + return + self.inputs[self.pulse_name][:] = history[0, self.selectors[self.pulse_name]] + + def merge_inputs(self, fresh_inputs: dict[str, np.ndarray]) -> None: + pulse_name = self.pulse_name + for tensor_name, tensor_value in fresh_inputs.items(): + if tensor_name in self.inputs and tensor_name != pulse_name: + self.inputs[tensor_name][:] = tensor_value + + def note_hidden_state(self, hidden_state: np.ndarray) -> None: + if "features_buffer" not in self.archive: + return + history = self._shift_archive("features_buffer") + history[0, -1] = hidden_state[0] + self.inputs["features_buffer"][:] = history[0, self.selectors["features_buffer"]] + + def note_feedback(self, tensor_name: str, values: np.ndarray, zero_export: bool = False) -> None: + if tensor_name not in self.archive: + return + history = self._shift_archive(tensor_name) + history[0, -1, :] = values[0] + exported = history[0, self.selectors[tensor_name]] + self.inputs[tensor_name][:] = 0 * exported if zero_export else exported + + +def _planplus_gain(vehicle_speed: float) -> float: + return 0.75 if vehicle_speed >= 25.0 else 1.0 + + +def _merged_plan(runtime_state: "NeuralEngineState", outputs: dict[str, np.ndarray], vehicle_speed: float) -> np.ndarray: + base_plan = outputs["plan"][0] + if "planplus" not in outputs: + return base_plan + return base_plan + (runtime_state.PLANPLUS_CONTROL * _planplus_gain(vehicle_speed)) * outputs["planplus"][0] + + +class NeuralEngineState(InferenceStateBase): + frames: dict[str, RoadProjector] + + def __init__(self, gpu_context: WarpContext): + super().__init__() + runner = get_model_runner() + bundle = get_active_bundle() + + self.model_runner = runner + self.constants = runner.constants + self.generation = bundle.generation if bundle is not None else None + + knob_values = {entry.key: entry.value for entry in bundle.overrides} if bundle is not None else {} + self.LAT_SMOOTH_SECONDS = float(knob_values.get("lat", ".0")) + self.LONG_SMOOTH_SECONDS = float(knob_values.get("long", ".0")) + self.MIN_LAT_CONTROL_SPEED = 0.3 + self.PLANPLUS_CONTROL = 1.0 + self.model_smoothing_max_extra_sec = 0.0 + + context_depth = 5 if runner.is_20hz else 2 + self.frames = { + stream_name: RoadProjector(gpu_context, context_depth) + for stream_name in runner.vision_input_names + } + + self._ledger = ReplayLedger(runner.input_shapes, runner.vision_input_names) + self.numpy_inputs = self._ledger.inputs + self.temporal_buffers = self._ledger.archive + self.temporal_idxs_map = self._ledger.selectors + + @property + def mlsim(self) -> bool: + return bool(self.generation is not None and self.generation >= 11) + + @property + def desire_key(self) -> str: + return self._ledger.pulse_name + + def _warp_frames(self, vision_bufs: dict[str, VisionBuf], + transform_map: dict[str, np.ndarray]) -> dict[str, Any]: + return { + stream_name: self.frames[stream_name].stage(vision_bufs[stream_name], transform_map[stream_name].flatten()) + for stream_name in self.model_runner.vision_input_names + } + + def _run_split_model(self) -> dict[str, np.ndarray]: + if hasattr(self.model_runner, "run_vision"): + vision_packet = self.model_runner.run_vision() + self._ledger.note_hidden_state(vision_packet["hidden_state"]) + self.model_runner.refresh_policy_features(self.numpy_inputs["features_buffer"]) + return {**vision_packet, **self.model_runner.run_policy()} + + result = self.model_runner.run_model() + if "hidden_state" in result: + self._ledger.note_hidden_state(result["hidden_state"]) + return result + + def _write_curvature_memory(self, outputs: dict[str, np.ndarray]) -> None: + if "desired_curvature" not in outputs: + return + + feedback_slot = None + if "prev_desired_curvs" in self.numpy_inputs: + feedback_slot = "prev_desired_curvs" + elif "prev_desired_curv" in self.numpy_inputs: + feedback_slot = "prev_desired_curv" + + if feedback_slot is not None: + self._ledger.note_feedback(feedback_slot, outputs["desired_curvature"], zero_export=self.mlsim) + + def run(self, vision_bufs: dict[str, VisionBuf], transform_map: dict[str, np.ndarray], + fresh_inputs: dict[str, np.ndarray]) -> dict[str, np.ndarray] | None: + if not getattr(self.model_runner, "uses_opencl_warp", True): + return self.model_runner.run_fused(vision_bufs, transform_map, fresh_inputs) + + self._ledger.inject_pulse(fresh_inputs[self.desire_key]) + self._ledger.merge_inputs(fresh_inputs) + warped_frames = self._warp_frames(vision_bufs, transform_map) + self.model_runner.prepare_inputs(warped_frames, self.numpy_inputs, self.frames) + + outputs = self._run_split_model() + self._write_curvature_memory(outputs) + return outputs + + def get_action_from_model(self, outputs: dict[str, np.ndarray], previous_action: log.ModelDataV2.Action, + lat_action_t: float, long_action_t: float, vehicle_speed: float, + lat_smooth_seconds: float | None = None) -> log.ModelDataV2.Action: + if lat_smooth_seconds is None: + lat_smooth_seconds = self.LAT_SMOOTH_SECONDS + + if "action" in outputs: + curvature_cmd = outputs["action"][0, 0] / (max(1.0, vehicle_speed)) ** 2 + accel_cmd = outputs["action"][0, 1] + should_stop = bool(vehicle_speed < 0.3 and accel_cmd < 0.1) + + accel_cmd = smooth_value(accel_cmd, previous_action.desiredAcceleration, self.LONG_SMOOTH_SECONDS) + if vehicle_speed > self.MIN_LAT_CONTROL_SPEED: + curvature_cmd = smooth_value(curvature_cmd, previous_action.desiredCurvature, lat_smooth_seconds) + else: + curvature_cmd = previous_action.desiredCurvature + + return log.ModelDataV2.Action( + desiredCurvature=float(curvature_cmd), + desiredAcceleration=float(accel_cmd), + shouldStop=should_stop, + ) + + plan_rows = _merged_plan(self, outputs, vehicle_speed) + accel_cmd, should_stop = get_accel_from_plan( + plan_rows[:, Plan.VELOCITY][:, 0], + plan_rows[:, Plan.ACCELERATION][:, 0], + self.constants.T_IDXS, + action_t=long_action_t, + ) + accel_cmd = smooth_value(accel_cmd, previous_action.desiredAcceleration, self.LONG_SMOOTH_SECONDS) + + curvature_cmd = pick_curvature(outputs, plan_rows, vehicle_speed, lat_action_t, self.mlsim) + if self.generation is not None and self.generation >= 10: + if vehicle_speed > self.MIN_LAT_CONTROL_SPEED: + curvature_cmd = smooth_value(curvature_cmd, previous_action.desiredCurvature, lat_smooth_seconds) + else: + curvature_cmd = previous_action.desiredCurvature + + return log.ModelDataV2.Action( + desiredCurvature=float(curvature_cmd), + desiredAcceleration=float(accel_cmd), + shouldStop=bool(should_stop), + ) + + +class CameraIngress: + def __init__(self, gpu_context: WarpContext): + self.layout = self._discover_layout() + self._primary = VisionIpcClient("camerad", self.layout.primary_stream, True, gpu_context) + self._secondary = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_WIDE_ROAD, False, gpu_context) + + while not self._primary.connect(False): + time.sleep(0.1) + while self.layout.dual_camera and not self._secondary.connect(False): + time.sleep(0.1) + + cloudlog.warning( + f"connected main cam with buffer size: {self._primary.buffer_len} ({self._primary.width} x {self._primary.height})" + ) + if self.layout.dual_camera: + cloudlog.warning( + f"connected extra cam with buffer size: {self._secondary.buffer_len} ({self._secondary.width} x {self._secondary.height})" + ) + + @staticmethod + def _discover_layout() -> StreamLayout: + while True: + available = VisionIpcClient.available_streams("camerad", block=False) + if available: + dual_camera = ( + VisionStreamType.VISION_STREAM_WIDE_ROAD in available + and VisionStreamType.VISION_STREAM_ROAD in available + ) + main_is_wide = VisionStreamType.VISION_STREAM_ROAD not in available + primary_stream = VisionStreamType.VISION_STREAM_WIDE_ROAD if main_is_wide else VisionStreamType.VISION_STREAM_ROAD + cloudlog.warning( + f"vision stream set up, main_wide_camera: {main_is_wide}, use_extra_client: {dual_camera}" + ) + return StreamLayout(dual_camera=dual_camera, main_is_wide=main_is_wide, primary_stream=primary_stream) + time.sleep(0.1) + + def pull(self) -> tuple[VisionBuf, VisionBuf, CaptureStamp, CaptureStamp] | None: + main_buf = None + wide_buf = None + main_stamp = CaptureStamp() + wide_stamp = CaptureStamp() + + while main_stamp.timestamp_sof < wide_stamp.timestamp_sof + 25000000: + main_buf = self._primary.recv() + main_stamp = CaptureStamp.from_vipc(self._primary) + if main_buf is None: + return None + + if not self.layout.dual_camera: + return main_buf, main_buf, main_stamp, main_stamp + + while True: + wide_buf = self._secondary.recv() + wide_stamp = CaptureStamp.from_vipc(self._secondary) + if wide_buf is None or main_stamp.timestamp_sof < wide_stamp.timestamp_sof + 25000000: + break + + if wide_buf is None: + return None + + if abs(main_stamp.timestamp_sof - wide_stamp.timestamp_sof) > 10000000: + cloudlog.error( + f"frames out of sync! main: {main_stamp.frame_id} ({main_stamp.timestamp_sof / 1e9:.5f})," + f" extra: {wide_stamp.frame_id} ({wide_stamp.timestamp_sof / 1e9:.5f})" + ) + return main_buf, wide_buf, main_stamp, wide_stamp + + +class CalibrationAtlas: + def __init__(self): + self.main_warp = np.zeros((3, 3), dtype=np.float32) + self.extra_warp = np.zeros((3, 3), dtype=np.float32) + self.ready = False + self._offset_tuner = CameraOffsetHelper() + + def set_offset(self, offset_value: Any) -> None: + self._offset_tuner.set_offset(offset_value) + + def refresh(self, sm: SubMaster, main_is_wide: bool, dual_camera: bool) -> tuple[np.ndarray, np.ndarray, bool]: + if not (sm.seen["extrinsicsCalibration"] and sm.seen["roadCameraState"] and sm.seen["deviceState"]): + return self.main_warp, self.extra_warp, self.ready + + rpy = get_calibrated_rpy(sm["extrinsicsCalibration"]) + if rpy is None: + live_calib = sm["extrinsicsCalibration"] + if len(live_calib.rpyCalib) == 3: + rpy = np.array(live_calib.rpyCalib, dtype=np.float32) + else: + rpy = np.zeros(3, dtype=np.float32) + + device_key = (str(sm["deviceState"].deviceType), str(sm["roadCameraState"].sensor)) + device_camera = DEVICE_CAMERAS[device_key] + main_intrinsics = device_camera.ecam.intrinsics if main_is_wide else device_camera.fcam.intrinsics + extra_uses_wide_camera = dual_camera or main_is_wide + extra_intrinsics = device_camera.ecam.intrinsics if extra_uses_wide_camera else device_camera.fcam.intrinsics + self.main_warp = get_warp_matrix(rpy, main_intrinsics, False).astype(np.float32) + self.extra_warp = get_warp_matrix(rpy, extra_intrinsics, True).astype(np.float32) + self.main_warp, self.extra_warp = self._offset_tuner.update( + self.main_warp, self.extra_warp, sm, main_is_wide, extra_uses_wide_camera + ) + self.ready = True + return self.main_warp, self.extra_warp, self.ready + + +class FrameDropMeter: + def __init__(self, model_freq: float): + self._smoother = FirstOrderFilter(0.0, 10.0, 1.0 / model_freq) + self._warm_frames = 0 + self._last_frame_id = 0 + + def sample(self, frame_id: int) -> tuple[int, float, bool]: + dropped = max(0, frame_id - self._last_frame_id - 1) + smooth = self._smoother.update(min(dropped, 10)) + if self._warm_frames < 10: + self._smoother.x = 0.0 + smooth = 0.0 + self._warm_frames += 1 + return dropped, smooth / (1 + smooth), dropped > 0 + + def commit(self, frame_id: int) -> None: + self._last_frame_id = frame_id + + +class InferenceDaemon: + def __init__(self, demo: bool = False, channel_path: str | None = None): + cloudlog.warning("iqmodeld init") + sentry.set_tag("daemon", PROCESS_NAME) + cloudlog.bind(daemon=PROCESS_NAME) + setproctitle(PROCESS_NAME) + config_realtime_process(7, 54) + + cloudlog.warning("setting up CL context") + self._gpu = WarpContext() + cloudlog.warning("CL context ready; loading model") + self._runtime = NeuralEngineState(self._gpu) + self._meta_layout = select_meta_layout() + cloudlog.warning("models loaded, iqmodeld starting") + + self._channel = None + if channel_path is not None: + from iqpilot.selfdrive.iqmodeld.model_channel import ModelChannel + self._channel = ModelChannel(channel_path, create=True) + + self._cameras = CameraIngress(self._gpu) + pub_services = ["iqPerfTrace"] if self._channel is not None else [ + "modelV2", "drivingModelData", "cameraOdometry", "iqDriveModelData", "iqPerfTrace"] + self._pub = PubMaster(pub_services) + self._sub = SubMaster([ + "deviceState", "carState", "roadCameraState", "extrinsicsCalibration", + "driverMonitoringState", "carControl", "lateralDelay", "iqNavState", "radarState", + ]) + self._message_memory = DrivePacketMemory() + self._params = Params() + self._frame_meter = FrameDropMeter(self._runtime.constants.MODEL_FREQ) + self._warps = CalibrationAtlas() + self._perf = PerfTraceEmitter("iqmodeld", pubmaster=self._pub) + self._perf_ring = PerfTraceRing() + + self._car_params = self._load_car_params(demo) + self._long_action_delay = self._car_params.longitudinalActuatorDelay + self._runtime.LONG_SMOOTH_SECONDS + self._previous_action = log.ModelDataV2.Action() + self._desire_logic = DesireHelper() + self._lat_smooth_extra_sec = 0.0 + + def _load_car_params(self, demo: bool): + car_params = get_demo_car_params() if demo else messaging.log_from_bytes( + self._params.get("CarParams", block=True), car.CarParams) + cloudlog.info("iqmodeld got CarParams: %s", car_params.brand) + return car_params + + def _refresh_tunables(self, tick: int) -> None: + if tick % 60 != 0: + return + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + big_enabled = self._params.get_bool("IQEmacEnabled") or egpu_selected(self._params) + if big_enabled != (self._channel is not None): + # publish mode is fixed at startup: staying up would fight the selector for modelV2 + cloudlog.warning("iqmodeld: big backend toggled, restarting to switch publish mode") + sys.exit(0) + self._runtime.lat_delay = lateral_action_delay(self._params, self._car_params, self._sub["lateralDelay"].lateralDelay) + self._runtime.PLANPLUS_CONTROL = self._params.get("PlanplusControl", return_default=True) + self._runtime.model_smoothing_max_extra_sec = _model_lat_smooth_max_sec(self._params) + self._warps.set_offset(self._params.get("CameraOffset", return_default=True)) + + def _traffic_side(self) -> np.ndarray: + traffic = np.zeros(2, dtype=np.float32) + traffic[int(self._sub["driverMonitoringState"].isRHD)] = 1 + return traffic + + def _desire_pulse(self) -> np.ndarray: + pulse = np.zeros(self._runtime.constants.DESIRE_LEN, dtype=np.float32) + desire_idx = self._desire_logic.desire + if 0 <= desire_idx < self._runtime.constants.DESIRE_LEN: + pulse[desire_idx] = 1 + return pulse + + def _compose_inputs(self, vehicle_speed: float, lat_horizon: float, long_horizon: float) -> dict[str, np.ndarray]: + inputs: dict[str, np.ndarray] = { + self._runtime.desire_key: self._desire_pulse(), + "traffic_convention": self._traffic_side(), + } + if "lateral_control_params" in self._runtime.numpy_inputs: + inputs["lateral_control_params"] = np.array([vehicle_speed, lat_horizon], dtype=np.float32) + if "action_t" in self._runtime.numpy_inputs: + inputs["action_t"] = np.array([lat_horizon, long_horizon], dtype=np.float32) + return inputs + + def _publish(self, outputs: dict[str, np.ndarray], main_stamp: CaptureStamp, extra_stamp: CaptureStamp, + road_frame_id: int, frame_drop_ratio: float, dropped_frames: int, + execution_time: float, live_calib_seen: bool, + lat_horizon: float, long_horizon: float, vehicle_speed: float) -> None: + model_msg = messaging.new_message("modelV2") + driving_msg = messaging.new_message("drivingModelData") + pose_msg = messaging.new_message("cameraOdometry") + iq_msg = messaging.new_message("iqDriveModelData") + + self._lat_smooth_extra_sec = dynamic_lat_smooth_extra_seconds( + _plan_y_std_1s(outputs), self._runtime.model_smoothing_max_extra_sec + ) + lat_smooth_total_sec = min(self._runtime.LAT_SMOOTH_SECONDS + self._lat_smooth_extra_sec, MODEL_SMOOTHING_MAX_TOTAL_SEC) + action = self._runtime.get_action_from_model( + outputs, self._previous_action, lat_horizon, long_horizon, vehicle_speed, lat_smooth_total_sec + ) + self._previous_action = action + + populate_drive_messages( + driving_msg, + model_msg, + outputs, + action, + self._message_memory, + main_stamp.frame_id, + extra_stamp.frame_id, + road_frame_id, + frame_drop_ratio, + main_stamp.timestamp_eof, + execution_time, + live_calib_seen, + self._meta_layout, + ) + + desire_state = model_msg.modelV2.meta.desireState + lane_change_prob = desire_state[log.Desire.laneChangeLeft] + desire_state[log.Desire.laneChangeRight] + self._desire_logic.update( + self._sub["carState"], + self._sub["carControl"].latActive, + lane_change_prob, + self._sub["iqNavState"], + model_msg.modelV2, + self._sub["radarState"], + ) + model_msg.modelV2.meta.laneChangeState = self._desire_logic.lane_change_state + model_msg.modelV2.meta.laneChangeDirection = self._desire_logic.lane_change_direction + driving_msg.drivingModelData.meta.laneChangeState = self._desire_logic.lane_change_state + driving_msg.drivingModelData.meta.laneChangeDirection = self._desire_logic.lane_change_direction + iq_msg.iqDriveModelData.turnSignalDirection = self._desire_logic.lane_turn_direction + iq_msg.iqDriveModelData.lateralEdgeBlock = self._desire_logic.lateral_edge_block + + populate_odometry_message( + pose_msg, + outputs, + main_stamp.frame_id, + dropped_frames, + main_stamp.timestamp_eof, + live_calib_seen, + ) + + if self._channel is not None: + self._channel.write(main_stamp.frame_id, { + "source": "small", + "frame_id": main_stamp.frame_id, + "timestamp_sof": int(main_stamp.timestamp_sof), + "live_calib_seen": bool(live_calib_seen), + "model_execution_time": float(execution_time), + "msgs": { + "modelV2": model_msg.to_bytes(), + "drivingModelData": driving_msg.to_bytes(), + "cameraOdometry": pose_msg.to_bytes(), + "iqDriveModelData": iq_msg.to_bytes(), + }, + }) + return + + self._pub.send("modelV2", model_msg) + self._pub.send("drivingModelData", driving_msg) + self._pub.send("cameraOdometry", pose_msg) + self._pub.send("iqDriveModelData", iq_msg) + + def serve(self) -> None: + tick = 0 + starved_polls = 0 + while True: + frame_pair = self._cameras.pull() + if frame_pair is None: + starved_polls += 1 + if starved_polls >= _FRAME_STARVED_BACKOFF_POLLS: + time.sleep(_FRAME_STARVED_BACKOFF_SECONDS) + if starved_polls % _FRAME_STARVED_LOG_EVERY == 0: + cloudlog.error(f"visionipc delivered no frames for {starved_polls} polls; model is not running") + continue + + if starved_polls: + cloudlog.warning(f"visionipc recovered after {starved_polls} frameless polls") + starved_polls = 0 + + main_buf, extra_buf, main_stamp, extra_stamp = frame_pair + self._sub.update(0) + self._refresh_tunables(tick) + + vehicle_speed = max(self._sub["carState"].vEgo, 0.0) + lat_horizon = self._runtime.lat_delay + self._runtime.LAT_SMOOTH_SECONDS + self._lat_smooth_extra_sec + DT_MDL + long_horizon = self._long_action_delay + DT_MDL + + main_warp, extra_warp, live_calib_seen = self._warps.refresh( + self._sub, self._cameras.layout.main_is_wide, self._cameras.layout.dual_camera + ) + dropped_frames, frame_drop_ratio, prepare_only = self._frame_meter.sample(main_stamp.frame_id) + + vision_bufs = { + stream_name: extra_buf if "big" in stream_name else main_buf + for stream_name in self._runtime.model_runner.vision_input_names + } + warp_map = { + stream_name: extra_warp if "big" in stream_name else main_warp + for stream_name in self._runtime.model_runner.vision_input_names + } + fresh_inputs = self._compose_inputs(vehicle_speed, lat_horizon, long_horizon) + + started_at = time.perf_counter() + outputs = self._runtime.run(vision_bufs, warp_map, fresh_inputs) + execution_time = time.perf_counter() - started_at + execution_us = int(execution_time * 1_000_000) + + sample = PerfSample( + frame_id=main_stamp.frame_id, + model_eval_us=execution_us, + model_dropped_frames=dropped_frames, + model_backlog=max(0, dropped_frames), + ) + self._perf_ring.push(sample) + if dropped_frames > 0 or execution_us >= IQMODEL_EVAL_WARN_US: + severity = "warning" + if dropped_frames > 0 or execution_us >= IQMODEL_EVAL_ERROR_US: + severity = "error" + self._perf.emit( + "iqmodeld_dropped_frames" if dropped_frames > 0 else "iqmodeld_slow_eval", + severity=severity, + frame_id=main_stamp.frame_id, + total_time_us=execution_us, + dropped_frames=dropped_frames, + backlog=max(0, dropped_frames), + samples=self._perf_ring.snapshot(), + detail=( + f"model_eval_us={execution_us} dropped_frames={dropped_frames} prepare_only={int(prepare_only)} " + f"road_frame_id={self._sub['roadCameraState'].frameId}" + ), + min_interval_s=0.25, + ) + + if outputs is not None: + self._publish( + outputs, + main_stamp, + extra_stamp, + self._sub["roadCameraState"].frameId, + frame_drop_ratio, + dropped_frames, + execution_time, + live_calib_seen, + lat_horizon, + long_horizon, + vehicle_speed, + ) + + self._frame_meter.commit(main_stamp.frame_id) + tick += 1 + + +def main(demo: bool = False, channel_path: str | None = "auto"): + if channel_path == "auto": + channel_path = None + params = Params() + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + if params.get_bool("IQEmacEnabled") or egpu_selected(params): + from iqpilot.selfdrive.iqmodeld.model_channel import SMALL_CHANNEL + channel_path = SMALL_CHANNEL + InferenceDaemon(demo=demo, channel_path=channel_path).serve() + + +__all__ = [ + "PROCESS_NAME", + "IQP_NAV_MODEL_INFLUENCE_ENABLED", + "TurnDirection", + "CaptureStamp", + "ReplayLedger", + "NeuralEngineState", + "CameraIngress", + "CalibrationAtlas", + "FrameDropMeter", + "InferenceDaemon", + "main", +] + + +if __name__ == "__main__": + try: + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("--demo", action="store_true", help="Run iqmodeld in demo mode.") + args = parser.parse_args() + main(demo=args.demo) + except KeyboardInterrupt: + cloudlog.warning(f"child {PROCESS_NAME} got SIGINT") + except Exception: + sentry.capture_exception() + raise diff --git a/iqpilot/selfdrive/iqmodeld/default_model/bundle.json b/iqpilot/selfdrive/iqmodeld/default_model/bundle.json new file mode 100644 index 000000000..841fd472b --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/default_model/bundle.json @@ -0,0 +1,62 @@ +{ + "displayName": "Default (CD210)", + "environment": "development", + "generation": 12, + "index": 56, + "internalName": "C210M", + "is20hz": true, + "minimumSelectorVersion": 14, + "models": [ + { + "artifact": { + "downloadUri": { + "sha256": "6bcf9668455c022ccaa6443ed2daddc5b4348ffbdf68dd5abd9c37a1b17bfe98", + "uri": "https://git.konn3kt.com/teal/IQModels/raw/branch/main/models/recompiled18/model-C210M/driving_policy_c210m_tinygrad.pkl" + }, + "fileName": "driving_policy_c210m_tinygrad.pkl" + }, + "metadata": { + "downloadUri": { + "sha256": "15c8c1ad9073424ee1101b1f7170421140ed308ebaa7c917001130fb1760420b", + "uri": "https://git.konn3kt.com/teal/IQModels/raw/branch/main/models/recompiled18/model-C210M/driving_policy_c210m_metadata.pkl" + }, + "fileName": "driving_policy_c210m_metadata.pkl" + }, + "type": "policy" + }, + { + "artifact": { + "downloadUri": { + "sha256": "10fd116056fd1790553c20e09b2b640ebcb85e72418fc9685e0800a513bbe950", + "uri": "https://git.konn3kt.com/teal/IQModels/raw/branch/main/models/recompiled18/model-C210M/driving_vision_c210m_tinygrad.pkl" + }, + "fileName": "driving_vision_c210m_tinygrad.pkl" + }, + "metadata": { + "downloadUri": { + "sha256": "a2be39088d38550e818f5ac1c6300a64605ba0bd0676a27fe7bbea9fddae90a1", + "uri": "https://git.konn3kt.com/teal/IQModels/raw/branch/main/models/recompiled18/model-C210M/driving_vision_c210m_metadata.pkl" + }, + "fileName": "driving_vision_c210m_metadata.pkl" + }, + "type": "vision" + } + ], + "overrides": [ + { + "key": "folder", + "value": "Comma Models" + }, + { + "key": "lat", + "value": ".0" + }, + { + "key": "long", + "value": ".3" + } + ], + "ref": "default", + "runner": "tinygrad", + "status": "notDownloading" +} diff --git a/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_metadata.pkl b/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_metadata.pkl new file mode 100755 index 000000000..cd76d1c8d Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_metadata.pkl differ diff --git a/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_tinygrad.pkl b/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_tinygrad.pkl new file mode 100755 index 000000000..a8f82bf70 Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/default_model/driving_policy_c210m_tinygrad.pkl differ diff --git a/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_metadata.pkl b/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_metadata.pkl new file mode 100755 index 000000000..9aa8bf839 Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_metadata.pkl differ diff --git a/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_tinygrad.pkl b/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_tinygrad.pkl new file mode 100755 index 000000000..0e1981436 Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/default_model/driving_vision_c210m_tinygrad.pkl differ diff --git a/iqpilot/selfdrive/iqmodeld/driving_action.py b/iqpilot/selfdrive/iqmodeld/driving_action.py new file mode 100644 index 000000000..3e5f9750c --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/driving_action.py @@ -0,0 +1,46 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + +from iqpilot.cereal import log + +from iqpilot.selfdrive.controls.lib.drive_helpers import smooth_value + +LAT_SMOOTH_SECONDS = 0.0 +LONG_SMOOTH_SECONDS = 0.3 +MIN_LAT_CONTROL_SPEED = 0.3 +DESIRE_LEN = 8 + + +def get_action_from_model(outputs: dict[str, np.ndarray], prev_action: log.ModelDataV2.Action, + v_ego: float, lat_action_t: float, long_action_t: float, + lat_smooth_seconds: float | None = None) -> log.ModelDataV2.Action: + if "action" in outputs: + desired_accel = float(outputs["action"][0, 1]) + desired_curvature = float(outputs["action"][0, 0]) / (max(1.0, v_ego)) ** 2 + should_stop = bool(v_ego < 0.3 and desired_accel < 0.1) + else: + from iqpilot.selfdrive.controls.lib.drive_helpers import get_accel_from_plan, get_curvature_from_plan + from iqpilot.selfdrive.iqmodeld.config import ModelConstants, Plan + plan = outputs["plan"][0] + desired_accel, should_stop = get_accel_from_plan(plan[:, Plan.VELOCITY][:, 0], + plan[:, Plan.ACCELERATION][:, 0], + ModelConstants.T_IDXS, + action_t=long_action_t) + desired_curvature = get_curvature_from_plan(plan[:, Plan.T_FROM_CURRENT_EULER][:, 2], + plan[:, Plan.ORIENTATION_RATE][:, 2], + ModelConstants.T_IDXS, v_ego, lat_action_t) + desired_accel, should_stop = float(desired_accel), bool(should_stop) + desired_curvature = float(desired_curvature) + desired_accel = smooth_value(desired_accel, prev_action.desiredAcceleration, LONG_SMOOTH_SECONDS) + if v_ego > MIN_LAT_CONTROL_SPEED: + lat_smooth = LAT_SMOOTH_SECONDS if lat_smooth_seconds is None else lat_smooth_seconds + desired_curvature = smooth_value(desired_curvature, prev_action.desiredCurvature, lat_smooth) + else: + desired_curvature = prev_action.desiredCurvature + return log.ModelDataV2.Action(desiredCurvature=float(desired_curvature), + desiredAcceleration=float(desired_accel), + shouldStop=should_stop) diff --git a/iqpilot/selfdrive/iqmodeld/egpu_helpers.py b/iqpilot/selfdrive/iqmodeld/egpu_helpers.py new file mode 100644 index 000000000..1317d78be --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/egpu_helpers.py @@ -0,0 +1,209 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +import json +import os + +from iqpilot.common.swaglog import cloudlog +import urllib.request +from pathlib import Path + +from iqpilot.system.hardware.usb import egpu_dock_ready + +USB_SYSFS_ROOT = "/sys/bus/usb/devices" +FIRMWARE_MIRROR = os.getenv("IQ_EGPU_FIRMWARE_MIRROR", "/data/firmware/tinygrad") +TINYGRAD_CACHE = "/data/.cache" + +COMMA_LFS_BATCH_URL = "https://gitlab.com/commaai/openpilot-lfs.git/info/lfs/objects/batch" + +DOWNLOAD_CHUNK = 4 * 1024 * 1024 + + +def usbgpu_present(sysfs_root: str = USB_SYSFS_ROOT) -> bool: + return egpu_dock_ready(Path(sysfs_root)) + + +def egpu_present_consented(params, sysfs_root: str = USB_SYSFS_ROOT) -> bool: + try: + if params is not None and params.get_bool("IQEgpuDisabled"): + return False + except Exception: + pass + return usbgpu_present(sysfs_root) + + +def egpu_selected(params, sysfs_root: str = USB_SYSFS_ROOT) -> bool: + try: + if params is not None and params.get_bool("IQEgpuDisabled"): + return False + if params is not None and params.get_bool("IQEgpuEnabled"): + return True + except Exception: + pass + return usbgpu_present(sysfs_root) + + +def resolve_backend(emac_enabled: bool, egpu_enabled: bool, egpu_present: bool = False) -> str | None: + if egpu_present: + return "egpu" + if emac_enabled: + return "emac" + if egpu_enabled: + return "egpu" + return None + + +def egpu_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_tinygrad.pkl") + + +def egpu_policy_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_policy.pkl") + + +def egpu_oob_pkl_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_policy_oob.pkl") + + +def onnx_cache_path(meta: dict) -> str: + from iqpilot.system.hardware.hw import Paths + return os.path.join(Paths.model_root(), f"{meta['model_name']}_{meta['sha256'][:8]}.onnx") + + +def _sha256_file(path: str) -> str: + digest = hashlib.sha256() + with open(path, "rb") as f: + while chunk := f.read(DOWNLOAD_CHUNK): + digest.update(chunk) + return digest.hexdigest() + + +def quarantine_artifact(path: str, why: str) -> None: + try: + if os.path.isfile(path): + os.replace(path, path + ".unusable") + except OSError: + try: + os.remove(path) + except OSError: + pass + + +def local_onnx(meta: dict) -> str | None: + path = onnx_cache_path(meta) + if not os.path.isfile(path): + return None + size = int(meta.get("download", {}).get("size", 0)) + if size and os.path.getsize(path) != size: + quarantine_artifact(path, "onnx size mismatch") + return None + if _sha256_file(path) != meta["sha256"]: + quarantine_artifact(path, "onnx sha256 mismatch") + return None + return path + + +def resolve_download_url(download_url: str, sha256: str, size: int, timeout: float = 30.0) -> str: + if download_url.startswith("commalfs:"): + oid = download_url.split(":", 1)[1] + body = json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}).encode() + req = urllib.request.Request(COMMA_LFS_BATCH_URL, data=body, headers={ + "Accept": "application/vnd.git-lfs+json", "Content-Type": "application/vnd.git-lfs+json"}) + with urllib.request.urlopen(req, timeout=timeout) as r: + d = json.load(r) + return d["objects"][0]["actions"]["download"]["href"] + return download_url + + +def download_onnx(meta: dict, progress_cb=None) -> str: + from iqpilot.selfdrive.iqmodeld.egpu_model import download_descriptor + download_url, size = download_descriptor(meta) + if not download_url: + raise RuntimeError(f"model {meta['key']} has no download source; stage the onnx at {onnx_cache_path(meta)}") + + path = onnx_cache_path(meta) + os.makedirs(os.path.dirname(path), exist_ok=True) + try: + from iqpilot.selfdrive.iqmodeld.model_bundle_downloader import download_hf_file + return download_hf_file(f"onnx/{meta['sha256']}.onnx", path, meta["sha256"], int(size or 0), progress_cb=progress_cb) + except Exception as e: + cloudlog.warning(f"onnx {meta['key']} unavailable from HF ({e}); falling back to {download_url.split(':', 1)[0]}") + url = resolve_download_url(download_url, meta["sha256"], size) + tmp = path + ".part" + digest = hashlib.sha256() + got = 0 + with urllib.request.urlopen(url, timeout=60) as r, open(tmp, "wb") as f: + while chunk := r.read(DOWNLOAD_CHUNK): + f.write(chunk) + digest.update(chunk) + got += len(chunk) + if progress_cb is not None and size: + progress_cb(got / size) + if size and got != size: + os.remove(tmp) + raise RuntimeError(f"onnx download truncated: {got}/{size} bytes") + if digest.hexdigest() != meta["sha256"]: + os.remove(tmp) + raise RuntimeError(f"onnx sha256 mismatch for {meta['key']}") + os.replace(tmp, path) + return path + + +def download_precompiled(meta: dict, progress_cb=None, policy: bool = False, oob: bool = False) -> str | None: + field = "egpu_oob_artifact" if oob else "egpu_policy_artifact" if policy else "egpu_artifact" + art = meta.get(field) + if not art or not (art.get("objects") or art.get("hf_path")): + return None + from iqpilot.selfdrive.iqmodeld.model_bundle_downloader import download_hf_file, download_lfs_bundle + dest = egpu_oob_pkl_path(meta) if oob else egpu_policy_pkl_path(meta) if policy else egpu_pkl_path(meta) + if art.get("hf_path"): + try: + return download_hf_file(art["hf_path"], dest, art["sha256"], int(art.get("size", 0)), progress_cb=progress_cb) + except Exception as e: + cloudlog.warning(f"precompiled {meta['key']} unavailable from HF ({e}); trying LFS") + if not art.get("objects"): + raise + return download_lfs_bundle(art["objects"], dest, art["sha256"], int(art.get("size", 0)), progress_cb=progress_cb) + + +def patch_tinygrad_fetch_fw() -> None: + import pathlib + + import zstandard + from tinygrad import helpers + if getattr(helpers.fetch_fw, "_iq_patched", False): + return + _orig = helpers.fetch_fw + + def fetch_fw(path, name, sha256): + mirror = pathlib.Path(FIRMWARE_MIRROR) / path / name + if mirror.is_file(): + blob = mirror.read_bytes() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + p = pathlib.Path(f"/lib/firmware/{path}/{name}.zst") + if p.is_file(): + blob = zstandard.ZstdDecompressor().stream_reader(p.read_bytes()).read() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + blob = _orig(path, name, sha256) + # The dock's GPU firmware otherwise lives only in tinygrad's per-user download cache, which is + # a network fetch the first time a new HOME sees it; onroad the car is usually offline. + try: + mirror.parent.mkdir(parents=True, exist_ok=True) + tmp = mirror.with_suffix(mirror.suffix + ".part") + tmp.write_bytes(blob) + os.replace(tmp, mirror) + except OSError: + pass + return blob + + fetch_fw._iq_patched = True + helpers.fetch_fw = fetch_fw diff --git a/iqpilot/selfdrive/iqmodeld/egpu_model.py b/iqpilot/selfdrive/iqmodeld/egpu_model.py new file mode 100644 index 000000000..b9dc2c77e --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/egpu_model.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.egpu_model") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.egpu_model import * diff --git a/iqpilot/selfdrive/iqmodeld/egpu_pipeline.py b/iqpilot/selfdrive/iqmodeld/egpu_pipeline.py new file mode 100644 index 000000000..428b095a2 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/egpu_pipeline.py @@ -0,0 +1,52 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.egpu_policy import PolicyRunner +from iqpilot.selfdrive.iqmodeld.temporal_state import MODEL_INPUT_SPEC, TemporalInputState, spec_from_meta + + +class EgpuPipelineError(RuntimeError): + pass + + +class EgpuPipeline: + + def __init__(self, meta: dict, infer_fn): + if meta.get("split"): + raise EgpuPipelineError(f"model {meta['key']} is a split model; eGPU v1 runs fused models only") + self.meta = meta + self.infer_fn = infer_fn + self.state = TemporalInputState(meta["frame_skip"], spec_from_meta(meta) or MODEL_INPUT_SPEC) + self.hidden_slice = meta["output_slices"]["hidden_state"] + self.output_len = int(meta["output_len"]) + + def run(self, warped: np.ndarray, desire_vec: np.ndarray, traffic_convention: np.ndarray, + action_t: np.ndarray) -> np.ndarray: + if isinstance(self.infer_fn, PolicyRunner): + out = np.asarray(self.infer_fn.run(warped, desire_vec, traffic_convention, action_t), dtype=np.float32).reshape(-1) + else: + inputs = self.state.push_and_materialize(warped, desire_vec, traffic_convention, action_t) + out = np.asarray(self.infer_fn(inputs), dtype=np.float32).reshape(-1) + if out.shape[0] != self.output_len: + raise EgpuPipelineError(f"eGPU output length {out.shape[0]} != {self.output_len}") + if not np.isfinite(out).all(): + raise EgpuPipelineError("eGPU output contains non-finite values") + if not isinstance(self.infer_fn, PolicyRunner): + self.state.note_hidden_state(out, self.hidden_slice) + return out + + +def make_big_channel_payload(frame_id: int, live_calib_seen: bool, execution_time: float, + egpu_exec_ms: float, msgs: dict[str, bytes]) -> dict: + return { + "source": "egpu_big", + "frame_id": int(frame_id), + "live_calib_seen": bool(live_calib_seen), + "model_execution_time": float(execution_time), + "egpu_exec_ms": float(egpu_exec_ms), + "msgs": msgs, + } diff --git a/iqpilot/selfdrive/iqmodeld/egpu_policy.py b/iqpilot/selfdrive/iqmodeld/egpu_policy.py new file mode 100644 index 000000000..2d0b12d7a --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/egpu_policy.py @@ -0,0 +1,171 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import io +import math +import os +import pickle +import shutil +import struct +import tempfile + +import numpy as np + +POLICY_FORMAT = 2 +OOB_MAGIC = b"IQEGPUOOB1" +QUEUE_NAMES = ("img_q", "big_img_q", "feat_q", "desire_q") +PACKED_ORDER = ("desire", "traffic_convention", "action_t", "prev_feat") + + +def packed_layout(input_spec: dict) -> tuple[dict[str, tuple[int, ...]], list[int]]: + dp = input_spec["desire_pulse"][0] + fb = input_spec["features_buffer"][0] + shapes = { + "desire": (dp[2],), + "traffic_convention": tuple(input_spec["traffic_convention"][0]), + "action_t": tuple(input_spec["action_t"][0]), + "prev_feat": (fb[0], math.prod(fb[2:])), + } + return shapes, [math.prod(s) for s in shapes.values()] + + +def queue_shapes(input_spec: dict, frame_skip: int) -> dict[str, tuple[tuple[int, ...], str]]: + img = input_spec["img"][0] + fb = input_spec["features_buffer"][0] + dp = input_spec["desire_pulse"][0] + n_frames = img[1] // 6 + img_buf = (frame_skip * (n_frames - 1) + 1, 6, img[2], img[3]) + return { + "img_q": (img_buf, "uint8"), + "big_img_q": (img_buf, "uint8"), + "feat_q": ((frame_skip * fb[1], fb[0], math.prod(fb[2:])), "float32"), + "desire_q": ((frame_skip * dp[1], dp[0], dp[2]), "float32"), + } + + +def make_queues(input_spec: dict, frame_skip: int, device: str) -> dict: + from tinygrad.tensor import Tensor + return {name: Tensor(np.zeros(shape, dtype=dtype), device=device).contiguous().realize() + for name, (shape, dtype) in queue_shapes(input_spec, frame_skip).items()} + + +class PackedInputs: + def __init__(self, input_spec: dict): + from tinygrad.tensor import Tensor + self.shapes, self.sizes = packed_layout(input_spec) + self.array = np.zeros(sum(self.sizes), dtype=np.float32) + self.views = dict(zip(self.shapes, [v.reshape(s) for s, v in zip(self.shapes.values(), np.split(self.array, np.cumsum(self.sizes[:-1])))], strict=True)) + self.tensor = Tensor(self.array, device="NPY").realize() + + +def make_run_policy(model_runner, input_spec: dict, frame_skip: int, device: str): + from tinygrad.tensor import Tensor + shapes, sizes = packed_layout(input_spec) + fb = input_spec["features_buffer"][0] + + def shift_and_sample(buf, new_val, sample_fn): + buf.assign(buf[1:].cat(new_val, dim=0).contiguous()) + return sample_fn(buf) + + def sample_skip(buf): + return buf[::frame_skip].contiguous().flatten(0, 1).unsqueeze(0) + + def sample_desire(buf): + return buf.reshape(-1, frame_skip, *buf.shape[1:]).max(1).flatten(0, 1).unsqueeze(0) + + def run_policy(warped, img_q, big_img_q, feat_q, desire_q, packed_npy_inputs): + packed_npy_inputs = packed_npy_inputs.to(device) + warped = warped.to(device) + Tensor.realize(packed_npy_inputs, warped) + img = shift_and_sample(img_q, warped[0:1], sample_skip) + big_img = shift_and_sample(big_img_q, warped[1:2], sample_skip) + desire, traffic_convention, action_t, prev_feat = (t.reshape(s) for t, s in zip(packed_npy_inputs.split(sizes), shapes.values(), strict=True)) + desire_buf = shift_and_sample(desire_q, desire.reshape(1, 1, -1), sample_desire) + feat_buf = shift_and_sample(feat_q, prev_feat.reshape(1, 1, -1), sample_skip) + inputs = { + "img": img, + "big_img": big_img, + "features_buffer": feat_buf.reshape(fb), + "desire_pulse": desire_buf, + "traffic_convention": traffic_convention, + "action_t": action_t, + } + out = next(iter(model_runner(inputs).values())).cast("float32") + return out.reshape(-1), + + return run_policy + + +class PolicyRunner: + def __init__(self, jit, input_spec: dict, frame_skip: int, hidden_slice: slice, device: str): + from tinygrad.tensor import Tensor + self._Tensor = Tensor + self._jit = jit + self._queues = make_queues(input_spec, frame_skip, device) + self._packed = PackedInputs(input_spec) + self._hidden = hidden_slice + self._prev_desire = np.zeros(input_spec["desire_pulse"][0][2], dtype=np.float32) + self._warped_shape = (2, 6, *input_spec["img"][0][2:]) + + def run(self, warped: np.ndarray, desire_pulse: np.ndarray, traffic_convention: np.ndarray, + action_t: np.ndarray) -> np.ndarray: + cur = desire_pulse.astype(np.float32, copy=False) + v = self._packed.views + v["desire"][:] = np.where(cur - self._prev_desire > 0.99, cur, 0) + self._prev_desire[:] = cur + v["traffic_convention"][:] = np.asarray(traffic_convention, dtype=np.float32).reshape(v["traffic_convention"].shape) + v["action_t"][:] = np.asarray(action_t, dtype=np.float32).reshape(v["action_t"].shape) + warped_t = self._Tensor(np.ascontiguousarray(warped, dtype=np.uint8).reshape(self._warped_shape), device="NPY").realize() + out, = self._jit(warped=warped_t, packed_npy_inputs=self._packed.tensor, **self._queues) + flat = out.numpy().reshape(-1) + v["prev_feat"][:] = flat[self._hidden].reshape(v["prev_feat"].shape) + return flat + + +def dump_oob(obj, f) -> None: + # Out-of-band pickle buffers keep the host peak at one tensor while the weights stream to the + # dock; a plain pickle keeps every weight referenced in the memo until load() returns (~1.7GB). + f.write(OOB_MAGIC) + with tempfile.TemporaryFile(dir=os.path.dirname(os.path.abspath(f.name)) or ".") as tmp: + def buffer_callback(pb: pickle.PickleBuffer): + m = pb.raw() + tmp.write(struct.pack(" bool: + with open(path, "rb") as f: + return f.read(len(OOB_MAGIC)) == OOB_MAGIC + + +def load_oob(f): + if f.read(len(OOB_MAGIC)) != OOB_MAGIC: + raise ValueError("not an out-of-band bundle") + opcodes = f.read(struct.unpack(" dict | None: + key = params.get("IQEmacModel", encoding="utf8") + try: + return resolve_egpu_model(params, key) + except Exception as e: + cloudlog.warning(f"egpu_prefetch cannot resolve {key!r}: {e}") + return None + + +def _drop_stale_partials(keep: str) -> None: + root = os.path.dirname(keep) + partial_globs = ("egpu_*_amd_policy.pkl.part", "egpu_*_amd_policy_oob.pkl.part", "big_driving_supercombo_*.onnx.part") + for path in [p for g in partial_globs for p in glob.glob(os.path.join(root, g))]: + if not path.startswith(keep): + try: + os.remove(path) + except OSError: + pass + + +def prefetch_once(params: Params) -> bool: + if params.get_bool("IQEgpuDisabled"): + return False + meta = _selected_meta(params) + if meta is None: + return False + oob = bool(meta.get("egpu_oob_artifact")) + dst = egpu_oob_pkl_path(meta) if oob else egpu_policy_pkl_path(meta) + if os.path.isfile(dst): + return True + if not oob and not meta.get("egpu_policy_artifact"): + return False + _drop_stale_partials(dst) + params.put("UsbGpuSetupProgress", "0.0") + last = [-1.0] + + def _prog(p: float) -> None: + if p - last[0] >= 0.02 or p >= 1.0: + last[0] = p + params.put("UsbGpuSetupProgress", f"{p:.3f}") + + cloudlog.warning(f"egpu_prefetch downloading {meta['key']} {'streamable' if oob else 'policy'} artifact offroad") + out = download_precompiled(meta, progress_cb=_prog, policy=not oob, oob=oob) + cloudlog.warning(f"egpu_prefetch ready -> {out}") + return out is not None + + +_firmware_warm = False + + +def warm_firmware() -> None: + global _firmware_warm + if _firmware_warm or not usbgpu_present(): + return + os.environ.setdefault("DEV", "USB+AMD:LLVM") + os.environ.setdefault("GMMU", "0") + patch_tinygrad_fetch_fw() + from tinygrad.device import Device + Device["AMD"] + _firmware_warm = True + cloudlog.warning("egpu_prefetch: dock opened offroad; firmware cached and mirrored") + + +def main() -> None: + params = Params() + while True: + try: + warm_firmware() + except Exception as e: + cloudlog.warning(f"egpu_prefetch firmware warm failed: {e}") + try: + prefetch_once(params) + except Exception as e: + cloudlog.warning(f"egpu_prefetch failed: {e}") + params.put("UsbGpuLastError", str(e)[:512]) + time.sleep(RETRY_S) + continue + time.sleep(POLL_S) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/iqmodeld/egpu_telemetry.py b/iqpilot/selfdrive/iqmodeld/egpu_telemetry.py new file mode 100644 index 000000000..13936312f --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/egpu_telemetry.py @@ -0,0 +1,106 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import struct + +from iqpilot.cereal import messaging +from iqpilot.common.swaglog import cloudlog + +METRICS_REFRESH_EVERY = 100 + + +class EgpuDockTelemetry: + + def __init__(self, pm, big: bool): + self.pm = pm + self.big = big + self.valid = True + self.sends = 0 + self.metrics: dict[str, float] = {} + self._power_limit: int | None = None + self._asm_usb = None + + def _device(self): + from tinygrad.device import Device + return Device + + def _open_asm_usb(self): + import usb1 + from iqpilot.system.hardware.usb import EGPU_DOCK_USB_IDS + context = usb1.USBContext() + for vendor_id, product_id in EGPU_DOCK_USB_IDS: + handle = context.openByVendorIDAndProductID(vendor_id, product_id, skip_on_error=True) + if handle is not None: + return handle + context.close() + return None + + def _read_ina(self): + Device = self._device() + if "AMD" in Device._opened_devices and self._asm_usb is None: + try: + raw = Device["AMD"].iface.pci_dev.usb.usb.control_read(0xC0, 5) + return struct.unpack(" int: + if self._power_limit is None: + self._power_limit = smu._send_msg(smu.smu_mod.PPSMC_MSG_GetPptLimit, 0, read_back_arg=True, timeout=100) + return self._power_limit + + def send(self) -> None: + Device = self._device() + msg = messaging.new_message("egpuDockState") + state = msg.egpuDockState + self.sends += 1 + + if self.big and "AMD" in Device._opened_devices and self.sends % METRICS_REFRESH_EVERY == 1: + try: + smu = Device["AMD"].iface.dev_impl.smu + smu._send_msg(smu.smu_mod.PPSMC_MSG_TransferTableSmu2Dram, smu.smu_mod.TABLE_SMU_METRICS, timeout=100) + metrics = smu.read_table(smu.smu_mod.SmuMetricsExternal_t, smu.smu_mod.TABLE_SMU_METRICS).SmuMetrics + self.metrics = {"tempC": metrics.AvgTemperature[smu.smu_mod.TEMP_HOTSPOT], + "memoryTempC": metrics.AvgTemperature[smu.smu_mod.TEMP_MEM], + "powerDrawW": metrics.AverageSocketPower, + "powerLimitW": self.power_limit(smu), + "gpuUsagePercent": metrics.AverageGfxActivity, + "gpuClockMhz": metrics.AverageGfxclkFrequencyPostDs, + "fanSpeedRpm": metrics.AvgFanRpm} + self.valid = True + except Exception: + if self.valid: + cloudlog.exception("egpu dock state read failed") + self.valid = False + self.metrics.clear() + + if self.big: + for k, v in self.metrics.items(): + setattr(state, k, v) + + asm_valid = False + try: + state.supplyVoltage, state.supplyCurrent, state.supplyFault = self._read_ina() + asm_valid = True + except Exception: + pass + if "AMD" in Device._opened_devices: + try: + state.pcieLtssm = Device["AMD"].iface.pci_dev.usb.read(0xB450, 1)[0] + except Exception: + pass + + msg.valid = asm_valid and (not self.big or self.valid) + self.pm.send("egpuDockState", msg) diff --git a/iqpilot/selfdrive/iqmodeld/emac_input_state.py b/iqpilot/selfdrive/iqmodeld/emac_input_state.py new file mode 100644 index 000000000..698e4f639 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/emac_input_state.py @@ -0,0 +1,10 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.selfdrive.iqmodeld.temporal_state import ( + SplitTemporalState as SplitInputState, + TemporalInputState as EmacInputState, +) + +__all__ = ["EmacInputState", "SplitInputState"] diff --git a/iqpilot/selfdrive/iqmodeld/emac_model_meta.py b/iqpilot/selfdrive/iqmodeld/emac_model_meta.py new file mode 100644 index 000000000..75f405d67 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/emac_model_meta.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.emac_model_meta") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.emac_model_meta import * diff --git a/iqpilot/selfdrive/iqmodeld/iqegpumodeld.py b/iqpilot/selfdrive/iqmodeld/iqegpumodeld.py new file mode 100644 index 000000000..bc5757c49 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/iqegpumodeld.py @@ -0,0 +1,480 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import os +os.environ.setdefault("XDG_CACHE_HOME", "/data/.cache") +import pickle +import subprocess +import sys +import time + +from iqpilot.system.hardware import TICI + +os.environ.setdefault("GMMU", "0") +if TICI: + os.environ.setdefault("DEV", "QCOM") +else: + os.environ.setdefault("DEV", "CPU") + +import numpy as np +from setproctitle import setproctitle + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car, log +from iqpilot.cereal.messaging import SubMaster +from iqpilot.cereal.services import SERVICE_LIST +from iqdbc.car.car_helpers import get_demo_car_params + +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.controls.lib.desire_helper import DesireHelper +from iqpilot.system import sentry + +from iqpilot.common.steer_delay import lateral_action_delay +from iqpilot.selfdrive.iqmodeld.daemon import CalibrationAtlas, CameraIngress, FrameDropMeter +from iqpilot.selfdrive.iqmodeld.driving_action import ( + DESIRE_LEN, LAT_SMOOTH_SECONDS, LONG_SMOOTH_SECONDS, get_action_from_model, +) +from iqpilot.selfdrive.iqmodeld.egpu_helpers import ( + download_onnx, download_precompiled, egpu_oob_pkl_path, egpu_pkl_path, egpu_policy_pkl_path, egpu_present_consented, egpu_selected, local_onnx, + patch_tinygrad_fetch_fw, quarantine_artifact, resolve_backend, usbgpu_present, +) +from iqpilot.selfdrive.iqmodeld.egpu_model import resolve_egpu_model +from iqpilot.selfdrive.iqmodeld.egpu_pipeline import EgpuPipeline, EgpuPipelineError, make_big_channel_payload +from iqpilot.selfdrive.iqmodeld.egpu_telemetry import EgpuDockTelemetry +from iqpilot.selfdrive.iqmodeld.messaging import DrivePacketMemory, populate_drive_messages, populate_odometry_message +from iqpilot.selfdrive.iqmodeld.metadata import Meta20hz +from iqpilot.selfdrive.iqmodeld.model_channel import BIG_CHANNEL, ModelChannel +from iqpilot.selfdrive.iqmodeld.egpu_policy import POLICY_FORMAT, PolicyRunner, load_bundle +from iqpilot.selfdrive.iqmodeld.model_warp import FrameWarp +from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + +PROCESS_NAME = "iqpilot.selfdrive.iqmodeld.iqegpumodeld" + +PRESENCE_POLL_S = 5.0 +COMPILE_TIMEOUT_S = 3600 +LINK_UP_TIMEOUT_S = 10.0 +SETUP_EXIT_AFTER = 3 +MIN_LOAD_AVAIL_MB = 350 +MEMORY_WAIT_S = 90.0 +SETUP_RETRY_BASE_S = 3.0 +SETUP_RETRY_MAX_S = 30.0 + + +def park(reason: str) -> None: + cloudlog.warning(f"iqegpumodeld parked: {reason}") + params = Params() + params.put_bool("UsbGpuFailed", True) + params.put("UsbGpuLastError", reason[:512]) + while True: + time.sleep(1) + + +def _wait_for_egpu(params: Params) -> None: + while not usbgpu_present(): + params.put_bool("UsbGpuPresent", False) + time.sleep(PRESENCE_POLL_S) + params.put_bool("UsbGpuPresent", True) + try: + from iqpilot.system.hardware.egpu_dock.flash import link_up + except Exception: + return + deadline = time.monotonic() + LINK_UP_TIMEOUT_S + while time.monotonic() < deadline: + try: + if link_up(): + return + except Exception: + return + time.sleep(0.5) + + +def _compile_in_subprocess(meta: dict, onnx_path: str, pkl_path: str) -> None: + cmd = [sys.executable, "-m", "iqpilot.selfdrive.iqmodeld.tools.compile_egpu_model", + "--model", meta["key"], "--onnx", onnx_path, "--output", pkl_path, + "--progress-param", "UsbGpuSetupProgress", "--progress-base", "0.5", "--progress-span", "0.48"] + compile_env = {**os.environ, "DEV": "USB+AMD:LLVM", "FLOAT16": "1", + "JIT_BATCH_SIZE": "0", "GMMU": "0", "TC_OPT": "2"} + proc = subprocess.run(cmd, timeout=COMPILE_TIMEOUT_S, capture_output=True, text=True, + env=compile_env, preexec_fn=lambda: os.nice(20)) + if proc.returncode != 0: + tail = (proc.stderr or proc.stdout or "").strip()[-800:] + raise RuntimeError(f"eGPU model compile failed (rc={proc.returncode}): {tail}") + + +_precompiled_tried = False + + +def _ensure_artifact(params: Params, meta: dict) -> str: + global _precompiled_tried + oob_path = egpu_oob_pkl_path(meta) + if os.path.isfile(oob_path): + return oob_path + policy_path = egpu_policy_pkl_path(meta) + legacy_path = egpu_pkl_path(meta) + + params.put_bool("UsbGpuCompiled", False) + params.put_bool("UsbGpuReady", False) + + if meta.get("egpu_oob_artifact") and not _precompiled_tried: + _precompiled_tried = True + params.put("UsbGpuSetupProgress", "0.0") + oob_last = [-1.0] + + def _oob_prog(p: float) -> None: + if p - oob_last[0] >= 0.02 or p >= 1.0: + oob_last[0] = p + params.put("UsbGpuSetupProgress", f"{p:.3f}") + + try: + cloudlog.warning(f"iqegpumodeld downloading precompiled {meta['key']} (streamable) " + f"({int(meta['egpu_oob_artifact'].get('size', 0)) / 1e6:.0f}MB)") + precompiled = download_precompiled(meta, progress_cb=_oob_prog, oob=True) + if precompiled is not None: + cloudlog.warning(f"iqegpumodeld precompiled ready -> {precompiled}") + return precompiled + except Exception as e: + cloudlog.warning(f"iqegpumodeld streamable artifact unavailable ({e}); falling back") + + if os.path.isfile(policy_path): + return policy_path + + if meta.get("egpu_policy_artifact") and not _precompiled_tried: + _precompiled_tried = True + params.put("UsbGpuSetupProgress", "0.0") + dl_last = [-1.0] + + def _dl_prog(p: float) -> None: + if p - dl_last[0] >= 0.02 or p >= 1.0: + dl_last[0] = p + params.put("UsbGpuSetupProgress", f"{p:.3f}") + + try: + cloudlog.warning(f"iqegpumodeld downloading precompiled {meta['key']} policy " + f"({int(meta['egpu_policy_artifact'].get('size', 0)) / 1e6:.0f}MB)") + precompiled = download_precompiled(meta, progress_cb=_dl_prog, policy=True) + if precompiled is not None: + cloudlog.warning(f"iqegpumodeld precompiled ready -> {precompiled}") + return precompiled + except Exception as e: + cloudlog.warning(f"iqegpumodeld precompiled policy unavailable ({e}); falling back") + + if os.path.isfile(legacy_path): + cloudlog.warning(f"iqegpumodeld using legacy per-tensor artifact {legacy_path}; policy artifact not hosted yet") + return legacy_path + + onnx_path = local_onnx(meta) + if onnx_path is None: + params.put("UsbGpuSetupProgress", "0.0") + cloudlog.warning(f"iqegpumodeld downloading {meta['key']} onnx ({meta.get('download', {}).get('size', 0) / 1e6:.0f}MB)") + last = [-1.0] + + def _prog(p: float) -> None: + if p - last[0] >= 0.02 or p >= 1.0: + last[0] = p + params.put("UsbGpuSetupProgress", f"{p * 0.5:.3f}") + + onnx_path = download_onnx(meta, progress_cb=_prog) + + cloudlog.warning(f"iqegpumodeld compiling {meta['key']} for USB-AMD (one-time, can take minutes)") + _compile_in_subprocess(meta, onnx_path, policy_path) + cloudlog.warning(f"iqegpumodeld compiled -> {policy_path}") + return policy_path + + +def _mem_available_mb() -> int: + try: + with open("/proc/meminfo") as f: + for line in f: + if line.startswith("MemAvailable:"): + return int(line.split()[1]) // 1024 + except OSError: + pass + return 1 << 20 + + +def _wait_for_memory(need_mb: int) -> None: + deadline = time.monotonic() + MEMORY_WAIT_S + avail = _mem_available_mb() + while avail < need_mb and time.monotonic() < deadline: + cloudlog.warning(f"iqegpumodeld waiting for memory: {avail}MB available, need {need_mb}MB") + time.sleep(5.0) + avail = _mem_available_mb() + if avail < need_mb: + raise RuntimeError(f"insufficient memory to load the dock model: {avail}MB available, need {need_mb}MB") + + +def _load_infer_fn(pkl_path: str, meta: dict): + patch_tinygrad_fetch_fw() + from tinygrad.tensor import Tensor + + _wait_for_memory(MIN_LOAD_AVAIL_MB) + bundle = load_bundle(pkl_path) + if bundle.get("model_sha256") != meta["sha256"]: + quarantine_artifact(pkl_path, "pkl model sha mismatch") + raise RuntimeError(f"artifact model sha {bundle.get('model_sha256')} != {meta['sha256']}") + if int(bundle.get("output_len", -1)) != int(meta["output_len"]): + quarantine_artifact(pkl_path, "pkl output_len mismatch") + raise RuntimeError(f"artifact output_len {bundle.get('output_len')} != {meta['output_len']}") + if bundle.get("format") == POLICY_FORMAT: + runner = PolicyRunner(bundle["run_policy"], bundle["input_spec"], int(bundle["frame_skip"]), + meta["output_slices"]["hidden_state"], bundle.get("input_device", "AMD")) + return runner, bundle["input_spec"] + jit = bundle["run_model"] + input_dev = bundle.get("input_device", "AMD") + input_spec = bundle["input_spec"] + + def infer(inputs: dict[str, np.ndarray]) -> np.ndarray: + tensors = {name: Tensor(np.ascontiguousarray(inputs[name]), device=input_dev).realize() + for name in input_spec} + out, = jit(**tensors) + return out.numpy().reshape(-1) + + return infer, input_spec + + +def _warmup(infer_fn, input_spec: dict, output_len: int) -> float: + zeros = {name: np.zeros(shape, dtype=dtype) for name, (shape, dtype) in input_spec.items()} + t0 = time.perf_counter() + if isinstance(infer_fn, PolicyRunner): + img = input_spec["img"][0] + out = infer_fn.run(np.zeros((2, 6, img[2], img[3]), dtype=np.uint8), np.zeros(input_spec["desire_pulse"][0][2], dtype=np.float32), + np.zeros(2, dtype=np.float32), np.zeros(2, dtype=np.float32)) + else: + out = infer_fn(zeros) + dt = time.perf_counter() - t0 + if out.shape[0] != output_len or not np.isfinite(out).all(): + raise RuntimeError(f"warmup produced invalid output (len={out.shape[0]})") + return dt + + +def main(demo: bool = False) -> None: + cloudlog.warning("iqegpumodeld init") + sentry.set_tag("daemon", PROCESS_NAME) + cloudlog.bind(daemon=PROCESS_NAME) + setproctitle(PROCESS_NAME) + try: + os.sched_setaffinity(0, {4, 5, 6}) + os.nice(-10) + except OSError as e: + cloudlog.warning(f"iqegpumodeld affinity/nice failed ({e}); continuing at defaults") + + params = Params() + backend = resolve_backend(params.get_bool("IQEmacEnabled"), egpu_selected(params), egpu_present_consented(params)) + if backend != "egpu": + park(f"backend resolution is {backend!r}, not egpu; refusing to own the big channel") + + channel = ModelChannel(BIG_CHANNEL, create=True) + + cloudlog.warning("iqegpumodeld waiting for camerad") + cameras = CameraIngress(None) + layout = cameras.layout + + _wait_for_egpu(params) + params.put_bool("UsbGpuLoading", True) + attempt = 0 + while True: + try: + meta = resolve_egpu_model(params) + if meta is None: + raise RuntimeError("selected big model is not in the catalog; check connectivity or pick another model") + if meta.get("split"): + params.put_bool("UsbGpuLoading", False) + park(f"model {meta['key']} needs the Mac backend; the eGPU runs fused models only") + warp = FrameWarp(cameras._primary.width, cameras._primary.height, meta["frame_skip"]) + pkl_path = _ensure_artifact(params, meta) + infer_fn, input_spec = _load_infer_fn(pkl_path, meta) + warm_s = _warmup(infer_fn, input_spec, meta["output_len"]) + break + except Exception as e: + attempt += 1 + subs = "; ".join(f"{type(x).__name__}: {x}" for x in (getattr(e, "exceptions", None) or [])) + params.put("UsbGpuLastError", (f"{e} [{subs}]" if subs else str(e))[:512]) + cloudlog.warning(f"iqegpumodeld setup attempt {attempt} failed: {e}; {subs}; retrying") + if attempt >= SETUP_EXIT_AFTER: + # tinygrad keeps the dock's flock in a failed device init, so a stale process can never + # reopen it; exit and let the manager respawn a clean one. + cloudlog.error(f"iqegpumodeld giving up after {attempt} setup failures; exiting for a clean restart") + sys.exit(1) + if not usbgpu_present(): + from iqpilot.system.hardware.usb import ensure_host_role + if ensure_host_role(): + cloudlog.warning("iqegpumodeld: Type-C controller was out of host mode; restored") + time.sleep(2.0) + _wait_for_egpu(params) + time.sleep(min(SETUP_RETRY_MAX_S, SETUP_RETRY_BASE_S * attempt)) + + params.put_bool("UsbGpuLoading", False) + params.put_bool("UsbGpuCompiled", True) + params.put_bool("UsbGpuReady", True) + params.put("UsbGpuSetupProgress", "1.0") + cloudlog.warning(f"iqegpumodeld model: {meta['key']} ({meta['model_name']})") + cloudlog.warning(f"iqegpumodeld model up (warmup {warm_s * 1e3:.0f}ms)") + + pipeline = EgpuPipeline(meta, infer_fn) + telemetry_pm = messaging.PubMaster(["egpuDockState"]) + telemetry = EgpuDockTelemetry(telemetry_pm, big=True) + telemetry_every = max(1, round((1.0 / DT_MDL) / SERVICE_LIST["egpuDockState"].frequency)) + + sub = SubMaster(["deviceState", "carState", "roadCameraState", "extrinsicsCalibration", + "driverMonitoringState", "carControl", "lateralDelay", "iqNavState", "radarState"]) + if demo: + CP = get_demo_car_params() + else: + CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams) + long_delay = CP.longitudinalActuatorDelay + LONG_SMOOTH_SECONDS + + parser = PhaseParser() + memory = DrivePacketMemory() + desire_logic = DesireHelper() + frame_meter = FrameDropMeter(20.0) + warps = CalibrationAtlas() + prev_action = log.ModelDataV2.Action() + slices = {k: v for k, v in meta["output_slices"].items() if k != "pad"} + + produced = 0 + stats: dict[str, list[float]] = {k: [] for k in ("pull", "warp", "infer", "publish", "loop")} + iter_count = 0 + skip_count = 0 + last_pulled_fid = -1 + last_frame_mono = time.monotonic() + t_loop = time.perf_counter() + cloudlog.warning("iqegpumodeld starting") + + while True: + frame_pair = cameras.pull() + t_pull = time.perf_counter() + if frame_pair is None: + if time.monotonic() - last_frame_mono > 2.0: + cloudlog.warning("iqegpumodeld camera stream silent >2s; reconnecting VisionIPC") + cameras = CameraIngress(None) + last_frame_mono = time.monotonic() + continue + last_frame_mono = time.monotonic() + main_buf, extra_buf, main_stamp, extra_stamp = frame_pair + + stats["pull"].append(t_pull - t_loop) + stats["loop"].append(time.perf_counter() - t_loop) + t_loop = time.perf_counter() + if last_pulled_fid >= 0 and main_stamp.frame_id > last_pulled_fid + 1: + skip_count += main_stamp.frame_id - last_pulled_fid - 1 + last_pulled_fid = main_stamp.frame_id + iter_count += 1 + if iter_count % 200 == 0: + pcts = {k: {"p50": round(sorted(v)[len(v) // 2] * 1e3, 1), + "p90": round(sorted(v)[int(len(v) * 0.9)] * 1e3, 1)} + for k, v in stats.items() if v} + cloudlog.event("iqegpu_stats", **pcts, cam_skips=skip_count, window=iter_count) + msg = " ".join(f"{k}=p50:{v['p50']:.0f}/p90:{v['p90']:.0f}ms" for k, v in pcts.items()) + cloudlog.warning(f"iqegpumodeld stages: {msg} cam_skips={skip_count} over {iter_count}") + for v in stats.values(): + v.clear() + skip_count = 0 + + sub.update(0) + + v_ego = max(sub["carState"].vEgo, 0.0) + lat_delay = lateral_action_delay(params, CP, sub["lateralDelay"].lateralDelay) + LAT_SMOOTH_SECONDS + main_tfm, extra_tfm, live_calib_seen = warps.refresh(sub, layout.main_is_wide, layout.dual_camera) + dropped_frames, frame_drop_ratio, _ = frame_meter.sample(main_stamp.frame_id) + + traffic = np.zeros(2, dtype=np.float32) + traffic[int(sub["driverMonitoringState"].isRHD)] = 1 + desire_vec = np.zeros(DESIRE_LEN, dtype=np.float32) + if 0 <= desire_logic.desire < DESIRE_LEN: + desire_vec[desire_logic.desire] = 1 + + frame_delay = DT_MDL + action_delay = DT_MDL / 2 + lat_action_t = lat_delay + frame_delay + action_delay + long_action_t = long_delay + frame_delay + action_delay + action_t = np.array([lat_action_t, long_action_t], dtype=np.float32) + + started_at = time.perf_counter() + try: + warped = warp.run(main_buf, extra_buf, main_tfm, extra_tfm) + except Exception as e: + park(f"warp run failed: {e}") + t_warp = time.perf_counter() + stats["warp"].append(t_warp - started_at) + + try: + output = pipeline.run(warped, desire_vec, traffic, action_t) + except EgpuPipelineError as e: + park(str(e)) + except Exception as e: + park(f"eGPU inference failed: {e}") + t_infer = time.perf_counter() + stats["infer"].append(t_infer - t_warp) + + execution_time = time.perf_counter() - started_at + sliced = {k: output[np.newaxis, sl] for k, sl in slices.items()} + outputs = parser.parse_vision_outputs(sliced) + + action = get_action_from_model(outputs, prev_action, v_ego, float(lat_action_t), float(long_action_t), + lat_smooth_seconds=meta.get("lat_smooth_seconds")) + prev_action = action + + model_msg = messaging.new_message("modelV2") + driving_msg = messaging.new_message("drivingModelData") + pose_msg = messaging.new_message("cameraOdometry") + iq_msg = messaging.new_message("iqDriveModelData") + + populate_drive_messages( + driving_msg, model_msg, outputs, action, memory, + main_stamp.frame_id, extra_stamp.frame_id, sub["roadCameraState"].frameId, + frame_drop_ratio, main_stamp.timestamp_eof, execution_time, + live_calib_seen, Meta20hz, + ) + + model_msg.modelV2.big = True + + desire_state = model_msg.modelV2.meta.desireState + lane_change_prob = desire_state[log.Desire.laneChangeLeft] + desire_state[log.Desire.laneChangeRight] + desire_logic.update(sub["carState"], sub["carControl"].latActive, lane_change_prob, + sub["iqNavState"], model_msg.modelV2, sub["radarState"]) + model_msg.modelV2.meta.laneChangeState = desire_logic.lane_change_state + model_msg.modelV2.meta.laneChangeDirection = desire_logic.lane_change_direction + driving_msg.drivingModelData.meta.laneChangeState = desire_logic.lane_change_state + driving_msg.drivingModelData.meta.laneChangeDirection = desire_logic.lane_change_direction + iq_msg.iqDriveModelData.turnSignalDirection = desire_logic.lane_turn_direction + + populate_odometry_message(pose_msg, outputs, main_stamp.frame_id, dropped_frames, + main_stamp.timestamp_eof, live_calib_seen) + + channel.write(main_stamp.frame_id, make_big_channel_payload( + main_stamp.frame_id, live_calib_seen, execution_time, (t_infer - t_warp) * 1e3, { + "modelV2": model_msg.to_bytes(), + "drivingModelData": driving_msg.to_bytes(), + "cameraOdometry": pose_msg.to_bytes(), + "iqDriveModelData": iq_msg.to_bytes(), + })) + stats["publish"].append(time.perf_counter() - t_infer) + produced += 1 + if produced == 1 or produced % 100 == 0: + infer_ms = (t_infer - t_warp) * 1e3 + cloudlog.warning(f"iqegpumodeld producing: frame={main_stamp.frame_id} total={execution_time * 1e3:.0f}ms infer={infer_ms:.0f}ms count={produced}") + + if produced % telemetry_every == 0: + telemetry.send() + + frame_meter.commit(main_stamp.frame_id) + + +if __name__ == "__main__": + try: + import argparse + ap = argparse.ArgumentParser() + ap.add_argument("--demo", action="store_true") + args = ap.parse_args() + main(demo=args.demo) + except KeyboardInterrupt: + cloudlog.warning("iqegpumodeld got SIGINT") + except Exception: + import traceback + sentry.capture_exception() + cloudlog.exception("iqegpumodeld crashed, parking") + park(f"crashed: {traceback.format_exc(limit=8)}") diff --git a/iqpilot/selfdrive/iqmodeld/iqmodeld b/iqpilot/selfdrive/iqmodeld/iqmodeld new file mode 100755 index 000000000..a3f9fc1fb --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/iqmodeld @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +set -euo pipefail + +script_home() { + cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd +} + +main() { + local here + here="$(script_home)" + exec "$here/daemon.py" "$@" +} + +main "$@" diff --git a/iqpilot/selfdrive/iqmodeld/messaging.py b/iqpilot/selfdrive/iqmodeld/messaging.py new file mode 100644 index 000000000..ca43b2702 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/messaging.py @@ -0,0 +1,269 @@ +from __future__ import annotations + +import os +from dataclasses import dataclass, field + +import capnp +import numpy as np + +from iqpilot.cereal import log +from iqpilot.selfdrive.iqmodeld.models.helpers import plan_x_idxs_helper +from iqpilot.selfdrive.iqmodeld.config import ModelConstants, Plan +from iqpilot.selfdrive.controls.lib.drive_helpers import get_curvature_from_plan + +SEND_RAW_PRED = os.getenv("SEND_RAW_PRED") +ConfidenceClass = log.ModelDataV2.ConfidenceClass + + +def pick_curvature(outputs: dict[str, np.ndarray], plan_rows: np.ndarray, vehicle_speed: float, + action_horizon: float, synthetic_lane_logic: bool) -> float: + direct_signal = None if synthetic_lane_logic else outputs.get("desired_curvature") + if direct_signal is not None: + return float(direct_signal[0, 0]) + + yaw_track = plan_rows[:, Plan.T_FROM_CURRENT_EULER][:, 2] + yaw_rate_track = plan_rows[:, Plan.ORIENTATION_RATE][:, 2] + return float(get_curvature_from_plan(yaw_track, yaw_rate_track, ModelConstants.T_IDXS, vehicle_speed, action_horizon)) + + +@dataclass +class DrivePacketMemory: + disengage_rollup: np.ndarray = field(default_factory=lambda: np.zeros( + ModelConstants.CONFIDENCE_BUFFER_LEN * ModelConstants.DISENGAGE_WIDTH, dtype=np.float32)) + brake_watch_5: np.ndarray = field(default_factory=lambda: np.zeros( + ModelConstants.FCW_5MS2_PROBS_WIDTH, dtype=np.float32)) + brake_watch_3: np.ndarray = field(default_factory=lambda: np.zeros( + ModelConstants.FCW_3MS2_PROBS_WIDTH, dtype=np.float32)) + + +def _assign_xyz(builder, t_points, x_track, y_track, z_track, + x_std=None, y_std=None, z_std=None) -> None: + builder.t = t_points + builder.x = x_track.tolist() + builder.y = y_track.tolist() + builder.z = z_track.tolist() + if x_std is not None: + builder.xStd = x_std.tolist() + if y_std is not None: + builder.yStd = y_std.tolist() + if z_std is not None: + builder.zStd = z_std.tolist() + + +def _assign_xyva(builder, t_points, x_track, y_track, v_track, a_track, + x_std=None, y_std=None, v_std=None, a_std=None) -> None: + builder.t = t_points + builder.x = x_track.tolist() + builder.y = y_track.tolist() + builder.v = v_track.tolist() + builder.a = a_track.tolist() + if x_std is not None: + builder.xStd = x_std.tolist() + if y_std is not None: + builder.yStd = y_std.tolist() + if v_std is not None: + builder.vStd = v_std.tolist() + if a_std is not None: + builder.aStd = a_std.tolist() + + +def fill_xyz_poly(builder, degree: int, x_track: np.ndarray, y_track: np.ndarray, z_track: np.ndarray) -> None: + stacked = np.stack([x_track, y_track, z_track], axis=1) + coeffs = np.polynomial.polynomial.polyfit(ModelConstants.T_IDXS, stacked, deg=degree) + builder.xCoefficients = coeffs[:, 0].tolist() + builder.yCoefficients = coeffs[:, 1].tolist() + builder.zCoefficients = coeffs[:, 2].tolist() + + +def fill_lane_line_meta(builder, lane_lines, lane_probs: list[float]) -> None: + builder.leftY = lane_lines[1].y[0] + builder.leftProb = lane_probs[1] + builder.rightY = lane_lines[2].y[0] + builder.rightProb = lane_probs[2] + + +def _roll_brake_watch(outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout) -> bool: + memory.brake_watch_5[:-1] = memory.brake_watch_5[1:] + memory.brake_watch_5[-1] = outputs["meta"][0, meta_layout.HARD_BRAKE_5][0] + memory.brake_watch_3[:-1] = memory.brake_watch_3[1:] + memory.brake_watch_3[-1] = outputs["meta"][0, meta_layout.HARD_BRAKE_3][0] + return bool( + (memory.brake_watch_5 > ModelConstants.FCW_THRESHOLDS_5MS2).all() + and (memory.brake_watch_3 > ModelConstants.FCW_THRESHOLDS_3MS2).all() + ) + + +def _confidence_bucket(outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout, frame_id: int): + width = ModelConstants.DISENGAGE_WIDTH + if frame_id % (2 * ModelConstants.MODEL_FREQ) == 0: + brake_probs = outputs["meta"][0, meta_layout.BRAKE_DISENGAGE] + gas_probs = outputs["meta"][0, meta_layout.GAS_DISENGAGE] + steer_probs = outputs["meta"][0, meta_layout.STEER_OVERRIDE] + takeover_curve = 1 - ((1 - brake_probs) * (1 - gas_probs) * (1 - steer_probs)) + independent = np.r_[takeover_curve[0], np.diff(takeover_curve) / (1 - takeover_curve[:-1])] + memory.disengage_rollup[:-width] = memory.disengage_rollup[width:] + memory.disengage_rollup[-width:] = independent + + score = 0.0 + for idx in range(width): + score += memory.disengage_rollup[idx * width + width - 1 - idx].item() / width + + if score < ModelConstants.RYG_GREEN: + return ConfidenceClass.green + if score < ModelConstants.RYG_YELLOW: + return ConfidenceClass.yellow + return ConfidenceClass.red + + +def _write_plan_family(model_packet, driving_packet, outputs: dict[str, np.ndarray]) -> None: + plan_rows = outputs["plan"][0] + plan_stds = outputs["plan_stds"][0] + _assign_xyz(model_packet.position, ModelConstants.T_IDXS, *plan_rows[:, Plan.POSITION].T, *plan_stds[:, Plan.POSITION].T) + _assign_xyz(model_packet.velocity, ModelConstants.T_IDXS, *plan_rows[:, Plan.VELOCITY].T) + _assign_xyz(model_packet.acceleration, ModelConstants.T_IDXS, *plan_rows[:, Plan.ACCELERATION].T) + _assign_xyz(model_packet.orientation, ModelConstants.T_IDXS, *plan_rows[:, Plan.T_FROM_CURRENT_EULER].T) + _assign_xyz(model_packet.orientationRate, ModelConstants.T_IDXS, *plan_rows[:, Plan.ORIENTATION_RATE].T) + fill_xyz_poly(driving_packet.path, ModelConstants.POLY_PATH_DEGREE, *plan_rows[:, Plan.POSITION].T) + + +def _write_temporal_pose(model_packet, outputs: dict[str, np.ndarray]) -> None: + pose_packet = model_packet.temporalPoseDEPRECATED + if "sim_pose" in outputs: + half_width = ModelConstants.POSE_WIDTH // 2 + pose_packet.trans = outputs["sim_pose"][0, :half_width].tolist() + pose_packet.transStd = outputs["sim_pose_stds"][0, :half_width].tolist() + pose_packet.rot = outputs["sim_pose"][0, half_width:].tolist() + pose_packet.rotStd = outputs["sim_pose_stds"][0, half_width:].tolist() + return + + pose_packet.trans = outputs["plan"][0, 0, Plan.VELOCITY].tolist() + pose_packet.transStd = outputs["plan_stds"][0, 0, Plan.VELOCITY].tolist() + pose_packet.rot = outputs["plan"][0, 0, Plan.ORIENTATION_RATE].tolist() + pose_packet.rotStd = outputs["plan_stds"][0, 0, Plan.ORIENTATION_RATE].tolist() + + +def _write_lane_family(model_packet, driving_packet, outputs: dict[str, np.ndarray]) -> None: + time_axis = plan_x_idxs_helper(ModelConstants, Plan, outputs) + model_packet.init("laneLines", 4) + for lane_idx in range(4): + lane_builder = model_packet.laneLines[lane_idx] + _assign_xyz( + lane_builder, + time_axis, + np.array(ModelConstants.X_IDXS), + outputs["lane_lines"][0, lane_idx, :, 0], + outputs["lane_lines"][0, lane_idx, :, 1], + ) + model_packet.laneLineStds = outputs["lane_lines_stds"][0, :, 0, 0].tolist() + model_packet.laneLineProbs = outputs["lane_lines_prob"][0, 1::2].tolist() + fill_lane_line_meta(driving_packet.laneLineMeta, model_packet.laneLines, model_packet.laneLineProbs) + + model_packet.init("roadEdges", 2) + for edge_idx in range(2): + edge_builder = model_packet.roadEdges[edge_idx] + _assign_xyz( + edge_builder, + time_axis, + np.array(ModelConstants.X_IDXS), + outputs["road_edges"][0, edge_idx, :, 0], + outputs["road_edges"][0, edge_idx, :, 1], + ) + model_packet.roadEdgeStds = outputs["road_edges_stds"][0, :, 0, 0].tolist() + + +def _write_leads(model_packet, outputs: dict[str, np.ndarray]) -> None: + model_packet.init("leadsV3", 3) + for lead_idx in range(3): + lead_builder = model_packet.leadsV3[lead_idx] + _assign_xyva( + lead_builder, + ModelConstants.LEAD_T_IDXS, + *outputs["lead"][0, lead_idx].T, + *outputs["lead_stds"][0, lead_idx].T, + ) + lead_builder.prob = outputs["lead_prob"][0, lead_idx].tolist() + lead_builder.probTime = ModelConstants.LEAD_T_OFFSETS[lead_idx] + + +def _write_meta(model_packet, outputs: dict[str, np.ndarray], memory: DrivePacketMemory, meta_layout, frame_id: int) -> None: + meta = model_packet.meta + meta.desireState = outputs["desire_state"][0].reshape(-1).tolist() + meta.desirePrediction = outputs["desire_pred"][0].reshape(-1).tolist() + meta.engagedProb = outputs["meta"][0, meta_layout.ENGAGED].item() + meta.init("disengagePredictions") + + pred = meta.disengagePredictions + pred.t = ModelConstants.META_T_IDXS + pred.brakeDisengageProbs = outputs["meta"][0, meta_layout.BRAKE_DISENGAGE].tolist() + pred.gasDisengageProbs = outputs["meta"][0, meta_layout.GAS_DISENGAGE].tolist() + pred.steerOverrideProbs = outputs["meta"][0, meta_layout.STEER_OVERRIDE].tolist() + pred.brake3MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_3].tolist() + pred.brake4MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_4].tolist() + pred.brake5MetersPerSecondSquaredProbs = outputs["meta"][0, meta_layout.HARD_BRAKE_5].tolist() + + if hasattr(meta_layout, "GAS_PRESS") and hasattr(meta_layout, "BRAKE_PRESS"): + pred.gasPressProbs = outputs["meta"][0, meta_layout.GAS_PRESS].tolist() + pred.brakePressProbs = outputs["meta"][0, meta_layout.BRAKE_PRESS].tolist() + + meta.hardBrakePredicted = _roll_brake_watch(outputs, memory, meta_layout) + model_packet.confidence = _confidence_bucket(outputs, memory, meta_layout, frame_id) + + +def populate_drive_messages(primary_msg: capnp._DynamicStructBuilder, extended_msg: capnp._DynamicStructBuilder, + outputs: dict[str, np.ndarray], action: log.ModelDataV2.Action, + memory: DrivePacketMemory, vipc_frame_id: int, vipc_frame_id_extra: int, + frame_id: int, frame_drop: float, timestamp_eof: int, + model_execution_time: float, valid: bool, meta_layout) -> None: + frame_age = frame_id - vipc_frame_id if frame_id > vipc_frame_id else 0 + frame_drop_percent = frame_drop * 100 + primary_msg.valid = valid + extended_msg.valid = valid + + driving_packet = primary_msg.drivingModelData + driving_packet.frameId = vipc_frame_id + driving_packet.frameIdExtra = vipc_frame_id_extra + driving_packet.frameDropPerc = frame_drop_percent + driving_packet.modelExecutionTime = model_execution_time + driving_packet.action = action + + model_packet = extended_msg.modelV2 + model_packet.frameId = vipc_frame_id + model_packet.frameIdExtra = vipc_frame_id_extra + model_packet.frameAge = frame_age + model_packet.frameDropPerc = frame_drop_percent + model_packet.timestampEof = timestamp_eof + model_packet.modelExecutionTime = model_execution_time + model_packet.action = action + + _write_plan_family(model_packet, driving_packet, outputs) + _write_temporal_pose(model_packet, outputs) + _write_lane_family(model_packet, driving_packet, outputs) + _write_leads(model_packet, outputs) + _write_meta(model_packet, outputs, memory, meta_layout, vipc_frame_id) + + if SEND_RAW_PRED: + model_packet.rawPredictions = outputs["raw_pred"].tobytes() + + +def populate_odometry_message(msg: capnp._DynamicStructBuilder, outputs: dict[str, np.ndarray], + vipc_frame_id: int, vipc_dropped_frames: int, + timestamp_eof: int, live_calib_seen: bool) -> None: + msg.valid = live_calib_seen & (vipc_dropped_frames < 1) + odo = msg.cameraOdometry + odo.frameId = vipc_frame_id + odo.timestampEof = timestamp_eof + odo.trans = outputs["pose"][0, :3].tolist() + odo.rot = outputs["pose"][0, 3:].tolist() + odo.wideFromDeviceEuler = outputs["wide_from_device_euler"][0, :].tolist() + odo.roadTransformTrans = outputs["road_transform"][0, :3].tolist() + odo.transStd = outputs["pose_stds"][0, :3].tolist() + odo.rotStd = outputs["pose_stds"][0, 3:].tolist() + odo.wideFromDeviceEulerStd = outputs["wide_from_device_euler_stds"][0, :].tolist() + odo.roadTransformTransStd = outputs["road_transform_stds"][0, :3].tolist() + +__all__ = [ + "DrivePacketMemory", + "pick_curvature", + "populate_drive_messages", + "populate_odometry_message", +] diff --git a/iqpilot/selfdrive/iqmodeld/metadata.py b/iqpilot/selfdrive/iqmodeld/metadata.py new file mode 100755 index 000000000..c81ebe542 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/metadata.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +import codecs +import pathlib +import pickle +import sys +from collections.abc import Iterable +from typing import Any + +from iqpilot.cereal import custom +from tinygrad.nn.onnx import OnnxPBParser + +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle +from iqpilot.selfdrive.iqmodeld.config import Meta + + +ModelBundle = custom.IQModelManager.ModelBundle + + +def _blank_proto_doc() -> dict[str, Any]: + return {"graph": {"input": [], "output": []}, "metadata_props": []} + + +class TelemetryEnvelopeParser(OnnxPBParser): + def _parse_ModelProto(self) -> dict: + envelope = _blank_proto_doc() + for fid, wire_type in self._parse_message(self.reader.len): + if fid == 7: + envelope["graph"] = self._parse_GraphProto() + elif fid == 14: + envelope["metadata_props"].append(self._parse_StringStringEntryProto()) + else: + self.reader.skip_field(wire_type) + return envelope + + +def _shape_fingerprint(value_info: dict[str, Any]) -> tuple[str, tuple[int, ...]]: + resolved = [] + for axis in value_info["parsed_type"].shape: + resolved.append(int(axis) if isinstance(axis, int) else 0) + return value_info["name"], tuple(resolved) + + +def _lookup_metadata(props: Iterable[dict[str, Any]], wanted_key: str) -> str | Any: + for entry in props: + if entry["key"] == wanted_key: + return entry["value"] + return None + + +class Meta20hz(Meta): + ENGAGED = slice(0, 1) + GAS_DISENGAGE = slice(1, 31, 6) + BRAKE_DISENGAGE = slice(2, 31, 6) + STEER_OVERRIDE = slice(3, 31, 6) + HARD_BRAKE_3 = slice(4, 31, 6) + HARD_BRAKE_4 = slice(5, 31, 6) + HARD_BRAKE_5 = slice(6, 31, 6) + GAS_PRESS = slice(31, 55, 4) + BRAKE_PRESS = slice(32, 55, 4) + LEFT_BLINKER = slice(33, 55, 4) + RIGHT_BLINKER = slice(34, 55, 4) + + +def select_meta_layout(): + active_bundle = get_active_bundle() + return Meta20hz if active_bundle is not None and active_bundle.is20hz else Meta + + +def _decoded_slices(props: Iterable[dict[str, Any]]): + encoded = _lookup_metadata(props, "output_slices") + assert encoded is not None, "output_slices not found in metadata" + return pickle.loads(codecs.decode(encoded.encode(), "base64")) + + +def _graph_shape_table(graph_doc: dict[str, Any], field_name: str) -> dict[str, tuple[int, ...]]: + return dict(_shape_fingerprint(item) for item in graph_doc[field_name]) + + +def build_metadata_record(model_path): + parsed = TelemetryEnvelopeParser(model_path).parse() + props = parsed["metadata_props"] + graph = parsed["graph"] + return { + "model_checkpoint": _lookup_metadata(props, "model_checkpoint"), + "output_slices": _decoded_slices(props), + "input_shapes": _graph_shape_table(graph, "input"), + "output_shapes": _graph_shape_table(graph, "output"), + } + + +if __name__ == "__main__": + model_path = pathlib.Path(sys.argv[1]) + metadata_path = model_path.parent / f"{model_path.stem}_metadata.pkl" + with open(metadata_path, "wb") as handle: + pickle.dump(build_metadata_record(model_path), handle) + print(f"saved metadata to {metadata_path}") diff --git a/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py b/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py new file mode 100644 index 000000000..f71e29594 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/model_bundle_downloader.py @@ -0,0 +1,211 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +import json +import os + +MODELS_BASE_URLS = ( + "https://git.konn3kt.com/teal/IQModels/raw/branch/main", + "https://gitlvb.teallvbs.xyz/teal/IQModels/raw/branch/main", +) +CHUNK = 4 * 1024 * 1024 +HTTP_TIMEOUT_S = 60.0 +STREAM_RETRIES = 6 + + +def _requests_auth(): + import importlib + for mod in ("iqpilot_private.models.git_auth", "iqpilot.models_private_src.git_auth", + "iqpilot.selfdrive.iqmodeld.models.git_auth"): + try: + return importlib.import_module(mod).get_requests_auth() + except Exception: + continue + return None + + +def _hf(): + import importlib + for mod in ("iqpilot_private.models.git_auth", "iqpilot.selfdrive.iqmodeld.models.git_auth"): + try: + m = importlib.import_module(mod) + return m.get_hf_headers(), m.hf_resolve_url + except Exception: + continue + return None, None + + +def download_hf_file(hf_path: str, dst: str, sha256: str, size: int, progress_cb=None) -> str: + import requests + headers, resolve = _hf() + if resolve is None: + raise RuntimeError("no HF credentials available") + url = resolve(hf_path) + os.makedirs(os.path.dirname(dst), exist_ok=True) + tmp = dst + ".hfpart" + last_error: Exception | None = None + for _attempt in range(STREAM_RETRIES): + try: + have = os.path.getsize(tmp) if os.path.isfile(tmp) else 0 + if size and have > size: + os.remove(tmp) + have = 0 + if not size or have < size: + req_headers = dict(headers) + if have: + req_headers["Range"] = f"bytes={have}-" + with requests.get(url, headers=req_headers, stream=True, timeout=HTTP_TIMEOUT_S, allow_redirects=True) as r: + r.raise_for_status() + if have and r.status_code != 206: + have = 0 + with open(tmp, "ab" if have else "wb") as f: + got = have + for chunk in r.iter_content(CHUNK): + f.write(chunk) + got += len(chunk) + if progress_cb is not None and size: + progress_cb(min(1.0, got / size)) + digest = hashlib.sha256() + with open(tmp, "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + digest.update(chunk) + if size and os.path.getsize(tmp) != size: + raise RuntimeError(f"size mismatch: {os.path.getsize(tmp)}/{size} bytes") + if sha256 and digest.hexdigest() != sha256: + os.remove(tmp) + raise RuntimeError("sha256 mismatch") + os.replace(tmp, dst) + return dst + except Exception as e: + last_error = e + raise RuntimeError(f"HF download failed: {last_error}") + + +def _lfs_endpoint(base_url: str) -> str: + return base_url.split("/raw/", 1)[0] + ".git/info/lfs" + + +def _resolve_oid(session, base_url: str, oid: str, size: int, auth): + import requests + batch = session.post(f"{_lfs_endpoint(base_url)}/objects/batch", + data=json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}), + headers={"Content-Type": "application/vnd.git-lfs+json", + "Accept": "application/vnd.git-lfs+json"}, + auth=auth, timeout=HTTP_TIMEOUT_S) + batch.raise_for_status() + entry = batch.json()["objects"][0] + if "actions" not in entry: + raise requests.RequestException(f"LFS object unavailable: {entry.get('error', oid)}") + action = entry["actions"]["download"] + return action["href"], action.get("header", {}) + + +def _part_path(dst: str, oid: str) -> str: + return os.path.join(dst + ".parts", oid) + + +def _part_complete(path: str, oid: str, size: int) -> bool: + if not os.path.isfile(path) or os.path.getsize(path) != size: + return False + digest = hashlib.sha256() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + digest.update(chunk) + return digest.hexdigest() == oid + + +def _fetch_part(session, base_url: str, obj: dict, path: str, auth, progress) -> None: + size = int(obj["size"]) + have = os.path.getsize(path) if os.path.isfile(path) else 0 + if have > size: + os.remove(path) + have = 0 + href, headers = _resolve_oid(session, base_url, obj["oid"], size, auth) + obj_auth = None if headers.get("Authorization") else auth + # LFS parts are content-addressed (oid == sha256), so a half-written part can be resumed with a + # Range request and verified afterwards instead of being thrown away on every restart. + if have: + headers = {**headers, "Range": f"bytes={have}-"} + with session.get(href, headers=headers, stream=True, timeout=HTTP_TIMEOUT_S, auth=obj_auth) as r: + r.raise_for_status() + if have and r.status_code != 206: + have = 0 + with open(path, "ab" if have else "wb") as f: + for chunk in r.iter_content(CHUNK): + f.write(chunk) + progress(len(chunk)) + + +def download_lfs_bundle(objects: list, dst: str, sha256: str, size: int, progress_cb=None) -> str: + import requests + auth = _requests_auth() + session = requests.Session() + os.makedirs(dst + ".parts", exist_ok=True) + total = int(size) or sum(int(o["size"]) for o in objects) + done_bytes = sum(int(o["size"]) for o in objects if _part_complete(_part_path(dst, o["oid"]), o["oid"], int(o["size"]))) + got = [done_bytes] + + def progress(n: int) -> None: + got[0] += n + if progress_cb is not None and total: + progress_cb(min(1.0, got[0] / total)) + + last_error: Exception | None = None + for base_url in MODELS_BASE_URLS: + for _attempt in range(STREAM_RETRIES): + try: + for obj in objects: + path = _part_path(dst, obj["oid"]) + if _part_complete(path, obj["oid"], int(obj["size"])): + continue + got[0] = done_bytes + _fetch_part(session, base_url, obj, path, auth, progress) + if not _part_complete(path, obj["oid"], int(obj["size"])): + if os.path.getsize(path) >= int(obj["size"]): + os.remove(path) + raise RuntimeError(f"part {obj['oid'][:12]} incomplete or failed verification") + done_bytes += int(obj["size"]) + got[0] = done_bytes + break + except Exception as e: + last_error = e + else: + continue + break + else: + raise RuntimeError(f"model bundle download failed: {last_error}") + + tmp = dst + ".part" + digest = hashlib.sha256() + with open(tmp, "wb") as out: + for obj in objects: + with open(_part_path(dst, obj["oid"]), "rb") as f: + for chunk in iter(lambda: f.read(CHUNK), b""): + out.write(chunk) + digest.update(chunk) + if total and os.path.getsize(tmp) != total: + os.remove(tmp) + raise RuntimeError(f"size mismatch: {os.path.getsize(tmp) if os.path.exists(tmp) else 0}/{total} bytes") + if sha256 and digest.hexdigest() != sha256: + os.remove(tmp) + for obj in objects: + try: + os.remove(_part_path(dst, obj["oid"])) + except OSError: + pass + raise RuntimeError("sha256 mismatch") + os.replace(tmp, dst) + for obj in objects: + try: + os.remove(_part_path(dst, obj["oid"])) + except OSError: + pass + try: + os.rmdir(dst + ".parts") + except OSError: + pass + return dst diff --git a/iqpilot/selfdrive/iqmodeld/model_channel.py b/iqpilot/selfdrive/iqmodeld/model_channel.py new file mode 100644 index 000000000..a9fa710bc --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/model_channel.py @@ -0,0 +1,58 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import mmap +import os +import pickle +import struct + +from iqpilot.common.swaglog import cloudlog + +SMALL_CHANNEL = "/dev/shm/iqpilot_smallmodel" +BIG_CHANNEL = "/dev/shm/iqpilot_bigmodel" +SHM_SIZE = 8 * 1024 * 1024 +HEADER = struct.Struct(" None: + data = pickle.dumps(payload, protocol=pickle.HIGHEST_PROTOCOL) + if HEADER.size + len(data) > SHM_SIZE: + cloudlog.error(f"model payload {len(data)} bytes exceeds shm {SHM_SIZE}, dropping frame {frame_id}") + return + seq = HEADER.unpack(self.mm[:HEADER.size])[0] + HEADER.pack_into(self.mm, 0, seq + 1, frame_id, len(data)) + self.mm[HEADER.size:HEADER.size + len(data)] = data + HEADER.pack_into(self.mm, 0, seq + 2, frame_id, len(data)) + + def peek_frame_id(self) -> int | None: + seq, frame_id, length = HEADER.unpack(self.mm[:HEADER.size]) + if seq == 0 or seq % 2 != 0 or length == 0: + return None + return frame_id + + def read(self) -> tuple[int, dict] | None: + seq1, frame_id, length = HEADER.unpack(self.mm[:HEADER.size]) + if seq1 == 0 or seq1 % 2 != 0 or length == 0: + return None + data = bytes(self.mm[HEADER.size:HEADER.size + length]) + seq2 = HEADER.unpack(self.mm[:HEADER.size])[0] + if seq1 != seq2: + return None + try: + return frame_id, pickle.loads(data) + except Exception: + return None diff --git a/iqpilot/selfdrive/iqmodeld/model_warp.py b/iqpilot/selfdrive/iqmodeld/model_warp.py new file mode 100644 index 000000000..50697728a --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/model_warp.py @@ -0,0 +1,80 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import os +import pickle + +import numpy as np + +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware.hw import Paths + + +def _load_bundle(pkl_path: str, cam_w: int, cam_h: int, frame_skip: int) -> dict: + with open(pkl_path, "rb") as f: + bundle = pickle.load(f) + if bundle.get("frame_skip") != frame_skip: + raise RuntimeError(f"frame_skip {bundle.get('frame_skip')} != {frame_skip}") + if (cam_w, cam_h) not in bundle: + raise RuntimeError(f"missing {cam_w}x{cam_h}; has {[k for k in bundle if isinstance(k, tuple)]}") + _verify_selftest(bundle, cam_w, cam_h) + return bundle + + +def _verify_selftest(bundle: dict, cam_w: int, cam_h: int) -> None: + want = bundle.get("selftest") + if not want: + raise RuntimeError("warp artifact predates the self-test; recompiling") + from iqpilot.system.camerad.cameras.nv12_info import get_nv12_info + from iqpilot.selfdrive.iqmodeld.tools.compile_warp import selftest_digest + nv12_size = get_nv12_info(cam_w, cam_h)[3] + got = selftest_digest(bundle[(cam_w, cam_h)], cam_w, cam_h, nv12_size) + if got != want: + raise RuntimeError(f"warp self-test {got[:12]} != {want[:12]}; artifact computes differently here") + + +class FrameWarp: + + def __init__(self, cam_w: int, cam_h: int, frame_skip: int): + from tinygrad.tensor import Tensor + + pkl_path = os.path.join(Paths.model_root(), f"emac_warp_{cam_w}x{cam_h}_tinygrad.pkl") + bundle = None + if os.path.isfile(pkl_path): + try: + bundle = _load_bundle(pkl_path, cam_w, cam_h, frame_skip) + except Exception as e: + cloudlog.warning(f"warp artifact unusable ({e}); discarding and recompiling") + os.remove(pkl_path) + if bundle is None: + cloudlog.warning(f"warp artifact missing; compiling for {cam_w}x{cam_h} (one-time)") + from iqpilot.selfdrive.iqmodeld.tools.compile_warp import compile_warp + compile_warp(cam_w, cam_h, pkl_path, frame_skip=frame_skip) + cloudlog.warning(f"warp compiled -> {pkl_path}") + bundle = _load_bundle(pkl_path, cam_w, cam_h, frame_skip) + self._jit = bundle[(cam_w, cam_h)] + + self._npy = {"tfm": np.zeros((3, 3), dtype=np.float32), "big_tfm": np.zeros((3, 3), dtype=np.float32)} + self._tensors = {k: Tensor(v, device="NPY").realize() for k, v in self._npy.items()} + self._blob_cache: dict[tuple[str, int], object] = {} + self._Tensor = Tensor + + def _frame_tensor(self, key: str, buf): + from tinygrad.device import Device + arr = np.frombuffer(buf.data, dtype=np.uint8) + ck = (key, arr.ctypes.data) + t = self._blob_cache.get(ck) + if t is None: + t = self._Tensor.from_blob(arr.ctypes.data, (arr.size,), dtype="uint8", device=Device.DEFAULT) + self._blob_cache[ck] = t + return t + + def run(self, main_buf, extra_buf, main_tfm: np.ndarray, extra_tfm: np.ndarray) -> np.ndarray: + self._npy["tfm"][:] = main_tfm + self._npy["big_tfm"][:] = extra_tfm + warped = self._jit(tfm=self._tensors["tfm"], big_tfm=self._tensors["big_tfm"], + frame=self._frame_tensor("img", main_buf), + big_frame=self._frame_tensor("big_img", extra_buf)) + return warped.numpy().astype(np.uint8, copy=False) diff --git a/iqpilot/selfdrive/iqmodeld/modeld_selector.py b/iqpilot/selfdrive/iqmodeld/modeld_selector.py new file mode 100644 index 000000000..b05d2658e --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/modeld_selector.py @@ -0,0 +1,374 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import json +import os +import threading +import time +from collections import deque + +from iqpilot.cereal.messaging import PubMaster, log_from_bytes +from setproctitle import setproctitle + +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.params import Params +from iqpilot.common.realtime import config_realtime_process +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.iqmodeld.model_channel import BIG_CHANNEL, SMALL_CHANNEL, ModelChannel + +PROCESS_NAME = "iqpilot.selfdrive.iqmodeld.modeld_selector" + +BIG_MODEL_DEADLINE = float(os.getenv("IQEMAC_BIG_DEADLINE_MS", "45")) / 1000.0 +BIG_MAX_LAG_FRAMES = int(os.getenv("IQEMAC_MAX_BIG_LAG_FRAMES", "6")) +BIG_FUTURE_ACCEPT = int(os.getenv("IQEMAC_BIG_FUTURE_ACCEPT", "2")) +BIG_ANCHOR_MS = float(os.getenv("IQEMAC_BIG_ANCHOR_MS", "90")) +BIG_WAIT_FLOOR_S = 0.002 +BIG_WAIT_CEIL_S = float(os.getenv("IQEMAC_BIG_WAIT_CEIL_MS", "58")) / 1000.0 +BIG_MISS_LIMIT = int(os.getenv("IQEMAC_BIG_MISS_LIMIT", "80")) +ACTIVATE_WINDOW = int(os.getenv("IQEMAC_ACTIVATE_WINDOW", "50")) +ACTIVATE_FRAC = float(os.getenv("IQEMAC_ACTIVATE_FRAC", "0.7")) +REARM_LIMIT = int(os.getenv("IQEMAC_REARM_LIMIT", "2")) +MODEL_FREQ = 20.0 +WARMUP_FRAMES = 40 +STATUS_WINDOW = int(os.getenv("IQEMAC_STATUS_EVERY", "20")) + +SELECTOR_SERVICES = ["modelV2", "drivingModelData", "cameraOdometry", "iqDriveModelData"] + +EMAC_STATUS_KEYS = { + "active": "MacModelActive", "failed": "MacModelFailed", "last_error": "MacModelLastError", + "latency_ms": "MacModelLatencyMs", "status": "MacModelStatus", + "reachable": "MacModelReachable", "progress": "MacModelDownloadProgress", +} +EGPU_STATUS_KEYS = { + "active": "UsbGpuActive", "failed": "UsbGpuFailed", "last_error": "UsbGpuLastError", + "latency_ms": "UsbGpuLatencyMs", "status": "UsbGpuStatus", + "reachable": "UsbGpuPresent", "progress": "UsbGpuSetupProgress", +} + + +def backend_status_keys(emac_enabled: bool, egpu_enabled: bool, egpu_present: bool = False) -> dict[str, str]: + from iqpilot.selfdrive.iqmodeld.egpu_helpers import resolve_backend + return EGPU_STATUS_KEYS if resolve_backend(emac_enabled, egpu_enabled, egpu_present) == "egpu" else EMAC_STATUS_KEYS + + +def resolve_status_keys(params): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_present_consented, egpu_selected + return backend_status_keys(params.get_bool("IQEmacEnabled"), egpu_selected(params), egpu_present_consented(params)) + + +def resolve_model_name(params, keys) -> str: + if keys is EGPU_STATUS_KEYS: + from iqpilot.selfdrive.iqmodeld.egpu_model import DEFAULT_EGPU_MODEL, resolve_egpu_model + resolved = resolve_egpu_model(params, allow_refresh=False) + return resolved["key"] if resolved else DEFAULT_EGPU_MODEL + name = params.get("IQEmacModel") or b"lebrowski" + return name.decode() if isinstance(name, bytes) else name + + +class AsyncParamWriter: + + def __init__(self, params: Params): + self._params = params + self._pending: dict[str, object] = {} + self._lock = threading.Lock() + self._event = threading.Event() + threading.Thread(target=self._drain, daemon=True).start() + + def put(self, key: str, value) -> None: + with self._lock: + self._pending[key] = value + self._event.set() + + def put_bool(self, key: str, value: bool) -> None: + self.put(key, bool(value)) + + def _drain(self) -> None: + while True: + self._event.wait() + self._event.clear() + with self._lock: + batch, self._pending = self._pending, {} + for key, value in batch.items(): + try: + if isinstance(value, bool): + self._params.put_bool(key, value) + else: + self._params.put(key, value) + except Exception: + cloudlog.exception(f"async param write failed: {key}") + + +def wait_for_big(big_channel, target: int, deadline: float, min_frame: int = -1, + max_lag_frames: int = BIG_MAX_LAG_FRAMES) -> tuple[dict | None, int | None]: + big_peek = None + grab_at = deadline - 0.004 + while time.perf_counter() < deadline: + bfid = big_channel.peek_frame_id() + big_peek = bfid + if bfid == target - 1 and time.perf_counter() < grab_at: + time.sleep(0.0005) + continue + if bfid is not None and min_frame < bfid <= target + BIG_FUTURE_ACCEPT and target - bfid <= max_lag_frames: + got = big_channel.read() + if got is not None and got[0] == bfid: + return got[1], big_peek + break + if bfid is None or bfid <= min_frame or bfid > target + BIG_FUTURE_ACCEPT or target - bfid > max_lag_frames: + break + time.sleep(0.0005) + return None, big_peek + + +class BigLatch: + + def __init__(self, miss_limit: int = BIG_MISS_LIMIT, activate_window: int = ACTIVATE_WINDOW, + activate_frac: float = ACTIVATE_FRAC, rearm_limit: int = REARM_LIMIT): + self.miss_limit = miss_limit + self.activate_window = activate_window + self.activate_need = int(round(activate_window * activate_frac)) + self.rearm_limit = rearm_limit + self.active = False + self.done = False + self._miss = 0 + self._window: deque[bool] = deque(maxlen=activate_window) + self._retires = 0 + + def update(self, used_big: bool) -> tuple[bool, bool]: + if self.done: + return False, False + if not self.active: + self._window.append(used_big) + if len(self._window) >= self.activate_window and sum(self._window) >= self.activate_need: + self.active = True + self._miss = 0 + self._window.clear() + return True, False + if used_big: + self._miss = 0 + elif self.active: + self._miss += 1 + if self._miss >= self.miss_limit: + self.active = False + self._miss = 0 + self._window.clear() + self._retires += 1 + self.done = self._retires > self.rearm_limit + return False, True + return False, False + + +def _patch_and_send(pm: PubMaster, payload: dict, frame_drop_perc: float, selector_dropped: int, + target: int, source_lag: int, mismatch: bool | None = None) -> None: + msgs = payload["msgs"] + if mismatch is None: + mismatch = source_lag > 0 + + model_msg = log_from_bytes(msgs["modelV2"]).as_builder() + if mismatch: + model_msg.modelV2.frameId = target + model_msg.modelV2.frameAge = max(model_msg.modelV2.frameAge, source_lag) + model_msg.modelV2.frameDropPerc = frame_drop_perc + pm.send("modelV2", model_msg) + + driving_msg = log_from_bytes(msgs["drivingModelData"]).as_builder() + if mismatch: + driving_msg.drivingModelData.frameId = target + driving_msg.drivingModelData.frameDropPerc = frame_drop_perc + pm.send("drivingModelData", driving_msg) + + pose_msg = log_from_bytes(msgs["cameraOdometry"]).as_builder() + if mismatch: + pose_msg.cameraOdometry.frameId = target + pose_msg.valid = bool(payload["live_calib_seen"]) and selector_dropped < 1 and not mismatch + pm.send("cameraOdometry", pose_msg) + + pm.send("iqDriveModelData", msgs["iqDriveModelData"]) + + +def _read_float(params, key: str, default: float) -> float: + v = params.get(key) + try: + return float(v) if v is not None else default + except (TypeError, ValueError): + return default + + +def main() -> None: + cloudlog.warning("modeld_selector init") + cloudlog.bind(daemon=PROCESS_NAME) + setproctitle(PROCESS_NAME) + config_realtime_process([0, 1, 2, 3], 54) + + params = Params() + keys = resolve_status_keys(params) + pwriter = AsyncParamWriter(params) + pwriter.put_bool(keys["active"], False) + pwriter.put_bool(keys["failed"], False) + pm = PubMaster(SELECTOR_SERVICES) + + small_channel: ModelChannel | None = None + big_channel: ModelChannel | None = None + latch = BigLatch() + big_used_count = 0 + run_count = 0 + last_published = -1 + last_big_published = -1 + frame_dropped_filter = FirstOrderFilter(0.0, 10.0, 1.0 / MODEL_FREQ) + recent_big = deque(maxlen=STATUS_WINDOW) + model_name = resolve_model_name(params, keys) + last_backend_check = 0.0 + last_latency_ms = 0.0 + last_source_lag = 0 + miss_reasons = {"no_head": 0, "already_used": 0, "far_future": 0, + "too_stale": 0, "head_prev_timeout": 0, "read_race": 0} + + cloudlog.warning(f"modeld_selector starting (max_big_lag_frames={BIG_MAX_LAG_FRAMES})") + while True: + if small_channel is None: + try: + small_channel = ModelChannel(SMALL_CHANNEL, create=False) + except OSError: + time.sleep(0.05) + continue + if big_channel is None: + try: + big_channel = ModelChannel(BIG_CHANNEL, create=False) + except OSError: + big_channel = None + + fid = small_channel.peek_frame_id() + if fid is None or fid == last_published: + time.sleep(0.0005) + continue + if last_published >= 0 and fid < last_published - 1: + cloudlog.warning(f"modeld_selector frame reset {last_published} -> {fid}; re-arming") + last_published = -1 + last_big_published = -1 + big_used_count = 0 + run_count = 0 + latch = BigLatch() + pwriter.put_bool(keys["active"], False) + pwriter.put_bool(keys["failed"], False) + + now_mono = time.monotonic() + if now_mono - last_backend_check > 1.0: + last_backend_check = now_mono + new_keys = resolve_status_keys(params) + if new_keys is not keys: + cloudlog.warning(f"modeld_selector backend changed {keys['active']} -> {new_keys['active']}; re-arming") + pwriter.put_bool(keys["active"], False) + pwriter.put_bool(keys["failed"], False) + keys = new_keys + model_name = resolve_model_name(params, keys) + recent_big.clear() + last_big_published = -1 + big_used_count = 0 + run_count = 0 + latch = BigLatch() + pwriter.put_bool(keys["active"], False) + pwriter.put_bool(keys["failed"], False) + target = fid + t_start = time.perf_counter() + + small_payload = None + got = small_channel.read() + if got is not None and got[0] == target: + small_payload = got[1] + + payload = None + used_big = False + big_peek = None + if big_channel is not None and not latch.done: + deadline = t_start + BIG_MODEL_DEADLINE + sof_ns = (small_payload or {}).get("timestamp_sof") + if sof_ns: + remaining = (BIG_ANCHOR_MS / 1000.0) - (time.clock_gettime(time.CLOCK_BOOTTIME) - sof_ns / 1e9) + deadline = t_start + min(max(remaining, BIG_WAIT_FLOOR_S), BIG_WAIT_CEIL_S) + payload, big_peek = wait_for_big(big_channel, target, deadline, + last_big_published, BIG_MAX_LAG_FRAMES) + used_big = payload is not None + if not used_big: + if big_peek is None: + miss_reasons["no_head"] += 1 + elif big_peek <= last_big_published: + miss_reasons["already_used"] += 1 + elif big_peek > target + BIG_FUTURE_ACCEPT: + miss_reasons["far_future"] += 1 + elif target - big_peek > BIG_MAX_LAG_FRAMES: + miss_reasons["too_stale"] += 1 + elif big_peek == target - 1: + miss_reasons["head_prev_timeout"] += 1 + else: + miss_reasons["read_race"] += 1 + + if payload is None: + payload = small_payload + if payload is None: + got = small_channel.read() + if got is not None and got[0] == target: + payload = got[1] + + activated_now, failed_now = latch.update(used_big) + if activated_now: + pwriter.put_bool(keys["active"], True) + pwriter.put_bool(keys["failed"], False) + cloudlog.warning(f"modeld_selector switched to BIG model at frame {target}") + elif failed_now: + pwriter.put_bool(keys["active"], False) + pwriter.put_bool(keys["failed"], latch.done) + pwriter.put(keys["last_error"], "big model stalled onroad; local fallback latched" + if latch.done else "big model stalled onroad; small active, big may re-arm") + if latch.done: + cloudlog.warning(f"modeld_selector big stalled, staying on small until next ignition (frame {target})") + else: + cloudlog.warning(f"modeld_selector big stalled, small active; big may re-arm after a clean streak (frame {target})") + + if payload is not None: + selector_dropped = max(0, target - last_published - 1) if last_published >= 0 else 0 + frames_dropped = frame_dropped_filter.update(min(selector_dropped, 10)) + if run_count < WARMUP_FRAMES: + frame_dropped_filter.x = 0.0 + frames_dropped = 0.0 + run_count += 1 + recent_big.append(used_big) + if used_big: + big_used_count += 1 + big_fid = int(payload.get("frame_id", big_peek if big_peek is not None else target)) + last_big_published = min(big_fid, target) + last_latency_ms = float(payload.get("model_execution_time", 0.0)) * 1e3 + source_lag = max(0, target - int(payload.get("frame_id", target))) + frame_mismatch = int(payload.get("frame_id", target)) != target + last_source_lag = source_lag + if run_count % STATUS_WINDOW == 0: + hit_rate = (sum(recent_big) / len(recent_big)) if recent_big else 0.0 + pwriter.put(keys["latency_ms"], last_latency_ms) + pwriter.put(keys["status"], json.dumps({ + "active": latch.active, + "failed": latch.done, + "hit_rate": round(hit_rate, 3), + "latency_ms": round(last_latency_ms, 1), + "source_lag_frames": last_source_lag, + "model": model_name, + "reachable": params.get_bool(keys["reachable"]), + "download_progress": _read_float(params, keys["progress"], 1.0), + "ts_mono": round(time.monotonic(), 1), + })) + if run_count % 100 == 0: + cloudlog.warning(f"modeld_selector misses: {miss_reasons}") + pwriter.put_bool(keys["active"], latch.active) + cloudlog.warning(f"modeld_selector: big_used={big_used_count}/{run_count} " + f"last_big_peek={big_peek} target={target} active={latch.active} " + f"max_big_lag={BIG_MAX_LAG_FRAMES}") + + frame_drop_perc = 100.0 * frames_dropped / (1.0 + frames_dropped) + _patch_and_send(pm, payload, frame_drop_perc, selector_dropped, target, source_lag, frame_mismatch) + last_published = target + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + cloudlog.warning("modeld_selector got SIGINT") diff --git a/iqpilot/selfdrive/iqmodeld/models/__init__.py b/iqpilot/selfdrive/iqmodeld/models/__init__.py new file mode 100644 index 000000000..5ece1c074 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" diff --git a/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py b/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py new file mode 100644 index 000000000..bf17800a7 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/combined_artifact.py @@ -0,0 +1,100 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import os +import re +from pathlib import Path + +from iqpilot.system.hardware.hw import Paths + + +_MODEL_ROOT = Path(Paths.model_root()) +_OVERRIDE_KEYS = ( + "combinedRuntimeArtifact", + "combinedSplitArtifact", + "iqCombinedArtifact", +) +_SPLIT_ROLE_PATTERN = re.compile(r"^driving_(vision|policy|off_policy|on_policy)_(.+)_tinygrad\.pkl$") + + +def _bundle_models(bundle) -> list: + models = getattr(bundle, "models", None) + return list(models) if models is not None else [] + + +def _bundle_override_map(bundle) -> dict[str, str]: + result: dict[str, str] = {} + for override in getattr(bundle, "overrides", None) or []: + key = getattr(override, "key", None) + value = getattr(override, "value", None) + if key and value: + result[str(key)] = str(value) + return result + + +def _artifact_name(model) -> str: + return getattr(getattr(model, "artifact", None), "fileName", "") or "" + + +def _split_suffixes(bundle) -> list[str]: + suffixes: list[str] = [] + for model in _bundle_models(bundle): + match = _SPLIT_ROLE_PATTERN.match(_artifact_name(model)) + if match: + suffixes.append(match.group(2)) + return suffixes + + +def _derived_candidates(bundle) -> list[str]: + seen: set[str] = set() + candidates: list[str] = [] + + for suffix in _split_suffixes(bundle): + for candidate in ( + f"driving_combined_{suffix}.pkl", + f"iqmodeld_combined_{suffix}.pkl", + ): + if candidate not in seen: + seen.add(candidate) + candidates.append(candidate) + + ref = getattr(bundle, "ref", None) + if ref: + short_ref = str(ref)[:8] + for candidate in ( + f"driving_combined_{short_ref}.pkl", + f"iqmodeld_combined_{short_ref}.pkl", + ): + if candidate not in seen: + seen.add(candidate) + candidates.append(candidate) + + return candidates + + +def combined_split_artifact_candidates(bundle) -> list[Path]: + explicit_env = os.getenv("IQMODEL_COMBINED_PKL") + if explicit_env: + explicit_path = Path(explicit_env) + return [explicit_path if explicit_path.is_absolute() else _MODEL_ROOT / explicit_path] + + overrides = _bundle_override_map(bundle) + explicit_names = [overrides[key] for key in _OVERRIDE_KEYS if key in overrides] + if explicit_names: + return [_MODEL_ROOT / name for name in explicit_names] + + return [_MODEL_ROOT / name for name in _derived_candidates(bundle)] + + +def resolve_combined_split_artifact(bundle) -> Path | None: + for candidate in combined_split_artifact_candidates(bundle): + if candidate.is_file(): + return candidate + return None + + +def has_combined_split_artifact(bundle) -> bool: + return resolve_combined_split_artifact(bundle) is not None diff --git a/iqpilot/selfdrive/iqmodeld/models/fetcher.py b/iqpilot/selfdrive/iqmodeld/models/fetcher.py new file mode 100644 index 000000000..d06c7c3dd --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/fetcher.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module + +try: + load_private_module(__name__, "iqpilot_private.models.fetcher") +except ProprietaryModuleMissing: + from iqpilot.models_private_src.fetcher import * # noqa: F403 diff --git a/iqpilot/selfdrive/iqmodeld/models/helpers.py b/iqpilot/selfdrive/iqmodeld/models/helpers.py new file mode 100644 index 000000000..4b9a2f4d4 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/helpers.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python3 +""" +Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import json +import os +import shutil +from pathlib import Path + +from iqpilot.cereal import custom +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot._proprietary_loader import ProprietaryModuleMissing, load_private_module +from iqpilot.system.hardware.hw import Paths + +try: + load_private_module(__name__, "iqpilot_private.models.helpers") +except ProprietaryModuleMissing: + try: + from iqpilot.models_private_src.helpers import * # noqa: F403 + except ImportError: + pass + + +ModelBundle = custom.IQModelManager.ModelBundle +Runner = custom.IQModelManager.Runner +_MODEL_ROOT = Path(Paths.model_root()) +_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle" +_MODELS_CACHE_KEY = "ModelManager_ModelsCache" +_RUNNER_CACHE_KEY = "ModelRunnerTypeCache" +_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex" +_PENDING_INDEX_KEY = "ModelManager_PendingIndex" +_PENDING_MODEL_RESTORE_FILE = "/data/k3_pending_model_restore" +_STOCK_RUNNER = int(Runner.stock) +_TINYGRAD_RUNNER = int(Runner.tinygrad) +_SNPE_RUNNER = int(Runner.snpe) + +_DEFAULT_MODEL_DIR = Path(__file__).resolve().parents[1] / "default_model" +_DEFAULT_BUNDLE_JSON = _DEFAULT_MODEL_DIR / "bundle.json" +_DEFAULT_BUNDLE_REF = "default" + + +def get_default_model_bundle(_bundles): + return None + + +def _coerce_runner_value(value) -> int | None: + raw = getattr(value, "raw", value) + try: + return int(raw) + except (TypeError, ValueError): + return None + + +def _bundle_models(bundle) -> list: + models = getattr(bundle, "models", None) + return list(models) if models is not None else [] + + +def _bundle_needs_runtime_upgrade(bundle) -> bool: + if bundle is None: + return False + + if _coerce_runner_value(getattr(bundle, "runner", None)) == _SNPE_RUNNER: + return True + + for model in _bundle_models(bundle): + file_name = getattr(getattr(model, "artifact", None), "fileName", "") or "" + if file_name.endswith(".thneed"): + return True + + return False + + +def _load_cached_manifest_bundles(params: Params): + cached = params.get(_MODELS_CACHE_KEY) or {} + bundles = [] + for raw_bundle in cached.get("bundles", []): + try: + min_selector_version = int(raw_bundle.get("minimumSelectorVersion", raw_bundle.get("minimum_selector_version", 0))) + compatibility_view = dict(raw_bundle) + compatibility_view["minimumSelectorVersion"] = min_selector_version + is_compatible = globals().get("is_bundle_version_compatible") + if is_compatible is not None and not is_compatible(compatibility_view): + continue + + if "short_name" in raw_bundle: + from iqpilot.selfdrive.iqmodeld.models.fetcher import ManifestDecoder + bundles.append(ManifestDecoder._decode_bundle(raw_bundle)) + continue + + if "internalName" in raw_bundle: + bundles.append(ModelBundle(**raw_bundle)) + continue + + bundle = ModelBundle() + bundle.index = int(raw_bundle["index"]) + bundle.internalName = raw_bundle.get("short_name") + bundle.displayName = raw_bundle.get("display_name") + bundle.status = 0 + bundle.generation = int(raw_bundle["generation"]) + bundle.environment = raw_bundle["environment"] + bundle.runner = raw_bundle.get("runner", Runner.tinygrad) + bundle.is20hz = raw_bundle.get("is_20hz", False) + bundle.minimumSelectorVersion = int(min_selector_version) + bundle.ref = raw_bundle.get("ref") + bundle.overrides = [] + for key, value in raw_bundle.get("overrides", {}).items(): + override = custom.IQModelManager.Override() + override.key = key + override.value = value + bundle.overrides.append(override) + + bundle.models = [] + for raw_model in raw_bundle.get("models", []): + model = custom.IQModelManager.Model() + model.type = raw_model.get("type") + for attr_name in ("artifact", "metadata"): + raw_artifact = raw_model.get(attr_name) + if not raw_artifact: + continue + artifact = custom.IQModelManager.Artifact() + artifact.fileName = raw_artifact.get("file_name") + download_uri = custom.IQModelManager.DownloadUri() + download_uri.uri = raw_artifact.get("download_uri", {}).get("url") + download_uri.sha256 = raw_artifact.get("download_uri", {}).get("sha256") + artifact.downloadUri = download_uri + setattr(model, attr_name, artifact) + bundle.models.append(model) + + bundles.append(bundle) + except Exception: + continue + return bundles + + +def _bundle_match_key(bundle) -> tuple[str | None, str | None, str | None]: + return ( + getattr(bundle, "ref", None), + getattr(bundle, "internalName", None), + getattr(bundle, "displayName", None), + ) + + +def _find_runtime_upgrade(bundle, params: Params, available_bundles=None): + if not _bundle_needs_runtime_upgrade(bundle): + return bundle + + candidate_bundles = available_bundles if available_bundles is not None else _load_cached_manifest_bundles(params) + ref, internal_name, display_name = _bundle_match_key(bundle) + + for candidate in candidate_bundles: + if getattr(candidate, "ref", None) and getattr(candidate, "ref", None) == ref: + return candidate + + for candidate in candidate_bundles: + if getattr(candidate, "internalName", None) == internal_name: + return candidate + + for candidate in candidate_bundles: + if getattr(candidate, "displayName", None) == display_name: + return candidate + + return None + + +def bundle_files_ready(bundle) -> bool: + if bundle is None: + return False + + for model in _bundle_models(bundle): + artifact = getattr(model, "artifact", None) + metadata = getattr(model, "metadata", None) + for file_name in (getattr(metadata, "fileName", None), getattr(artifact, "fileName", None)): + if file_name and not (_MODEL_ROOT / file_name).is_file(): + return False + return True + + +def persist_active_bundle(params: Params, bundle) -> None: + params.put(_ACTIVE_BUNDLE_KEY, bundle.to_dict()) + params.remove(_RUNNER_CACHE_KEY) + + +def _load_default_bundle_dict() -> dict: + return json.loads(_DEFAULT_BUNDLE_JSON.read_text()) + + +def _default_bundle_filenames(bundle_dict: dict) -> list[str]: + names = [] + for model in bundle_dict.get("models", []): + for artifact in (model.get("metadata"), model.get("artifact")): + file_name = artifact.get("fileName", "") if isinstance(artifact, dict) else "" + if file_name: + names.append(file_name) + return names + + +def is_default_bundle(bundle) -> bool: + return bool(bundle is not None and getattr(bundle, "ref", None) == _DEFAULT_BUNDLE_REF) + + +def ensure_default_model_files(bundle_dict: dict = None) -> None: + bundle_dict = bundle_dict if bundle_dict is not None else _load_default_bundle_dict() + try: + _MODEL_ROOT.mkdir(parents=True, exist_ok=True) + except OSError as e: + cloudlog.exception(f"default_model: cannot create model root: {e}") + return + for file_name in _default_bundle_filenames(bundle_dict): + src = _DEFAULT_MODEL_DIR / file_name + dst = _MODEL_ROOT / file_name + if not src.is_file(): + cloudlog.error(f"default_model: shipped asset missing {src}") + continue + if dst.is_file() and dst.stat().st_size == src.stat().st_size: + continue + try: + shutil.copy2(src, dst) + cloudlog.warning(f"default_model: staged {file_name} into model root") + except OSError as e: + cloudlog.exception(f"default_model: failed staging {file_name}: {e}") + + +def select_default_model(params: Params = None) -> None: + params = Params() if params is None else params + bundle_dict = _load_default_bundle_dict() + ensure_default_model_files(bundle_dict) + params.remove(_DOWNLOAD_INDEX_KEY) + params.remove(_PENDING_INDEX_KEY) + params.put(_ACTIVE_BUNDLE_KEY, bundle_dict) + params.remove(_RUNNER_CACHE_KEY) + params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER) + try: + if os.path.isfile(_PENDING_MODEL_RESTORE_FILE): + os.remove(_PENDING_MODEL_RESTORE_FILE) + except OSError: + pass + + +def seed_default_bundle_if_unset(params: Params = None) -> None: + params = Params() if params is None else params + if params.get(_ACTIVE_BUNDLE_KEY): + return + queued_download = params.get(_DOWNLOAD_INDEX_KEY) + try: + select_default_model(params) + if queued_download is not None: + params.put(_DOWNLOAD_INDEX_KEY, queued_download) + cloudlog.warning("default_model: seeded Default (CD210) as active bundle") + except Exception as e: + cloudlog.exception(f"default_model: failed to seed default bundle: {e}") + + +def get_runtime_bundle_upgrade(bundle, params: Params = None, available_bundles=None): + params = Params() if params is None else params + return _find_runtime_upgrade(bundle, params, available_bundles) + + +def get_active_bundle(params: Params = None): + params = Params() if params is None else params + + try: + active_bundle = params.get(_ACTIVE_BUNDLE_KEY) or {} + if not active_bundle: + return None + is_compatible = globals().get("is_bundle_version_compatible") + if is_compatible is not None and not is_compatible(active_bundle): + return None + bundle = ModelBundle(**active_bundle) + except Exception: + return None + + replacement = _find_runtime_upgrade(bundle, params) + if replacement is not None and replacement is not bundle and bundle_files_ready(replacement): + persist_active_bundle(params, replacement) + return replacement + + return bundle + + +def get_active_model_runner(params: Params = None, force_check=False): + params = Params() if params is None else params + + active_bundle = get_active_bundle(params) + if not active_bundle: + seed_default_bundle_if_unset(params) + active_bundle = get_active_bundle(params) + if not active_bundle: + if params.get(_RUNNER_CACHE_KEY) != str(_TINYGRAD_RUNNER): + params.put(_RUNNER_CACHE_KEY, _TINYGRAD_RUNNER) + return _TINYGRAD_RUNNER + + cached_runner_type = params.get(_RUNNER_CACHE_KEY) + if cached_runner_type and not force_check and isinstance(cached_runner_type, str) and cached_runner_type.isdigit(): + return int(cached_runner_type) + + runner_type = _coerce_runner_value(active_bundle.runner) + if runner_type == _SNPE_RUNNER: + replacement = _find_runtime_upgrade(active_bundle, params) + if replacement is not None and replacement is not active_bundle and bundle_files_ready(replacement): + persist_active_bundle(params, replacement) + runner_type = _coerce_runner_value(replacement.runner) + else: + if replacement is not None and getattr(replacement, "index", None) is not None and params.get(_DOWNLOAD_INDEX_KEY) is None: + params.put(_DOWNLOAD_INDEX_KEY, int(replacement.index)) + cloudlog.warning(f"Queued tinygrad migration for retired bundle {getattr(active_bundle, 'internalName', '')}") + runner_type = _TINYGRAD_RUNNER + + if cached_runner_type != runner_type: + params.put(_RUNNER_CACHE_KEY, int(runner_type)) + + return runner_type diff --git a/iqpilot/selfdrive/iqmodeld/models/inference_state.py b/iqpilot/selfdrive/iqmodeld/models/inference_state.py new file mode 100644 index 000000000..1bc1a254a --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/inference_state.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.common.steer_delay import cached_steer_delay + + +class InferenceStateBase: + def __init__(self): + self.lat_delay = cached_steer_delay() diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py b/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py new file mode 100644 index 000000000..5ece1c074 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/runners/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py new file mode 100644 index 000000000..8ede5f6c4 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/runners/model_runner.py @@ -0,0 +1,231 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import os +import pickle as _pk +from dataclasses import dataclass, field +from typing import TYPE_CHECKING, Any + +import numpy as np +from iqpilot.cereal import custom +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import TICI +from iqpilot.system.hardware.hw import Paths as _hw_paths +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle as _fetch_bundle +from iqpilot.selfdrive.iqmodeld.models.combined_artifact import has_combined_split_artifact + +# ---- runtime type surface (native OpenCL/frame handles resolve to Any off-device) ---- +if TYPE_CHECKING: + from iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import GpuMemorySlot, RoadProjector +else: + def _resolve_native_types() -> tuple[Any, Any]: + try: + from iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import GpuMemorySlot as iq_clmem + from iqpilot.selfdrive.iqmodeld.native.iqmodel_pyx import RoadProjector as iq_frame + return iq_clmem, iq_frame + except (ModuleNotFoundError, ImportError): + return Any, Any + + GpuMemorySlot, RoadProjector = _resolve_native_types() + +NumpyDict = dict[str, np.ndarray] +ShapeDict = dict[str, tuple[int, ...]] +SliceDict = dict[str, slice] +CLMemDict = dict[str, GpuMemorySlot] +FrameDict = dict[str, RoadProjector] + +ModelType = custom.IQModelManager.Model.Type +Model = custom.IQModelManager.Model + +SEND_RAW_PRED = os.getenv("SEND_RAW_PRED") +CUSTOM_MODEL_PATH = _hw_paths.model_root() + +_META_FIELDS = ("input_shapes", "output_slices") + +USBGPU = "USBGPU" in os.environ + + +def _configure_accelerator(): + """Point tinygrad at the right backend. Must run before tinygrad is imported, + which is why it fires at module import.""" + backend, extra = ("QCOM" if TICI else "CPU"), {} + if USBGPU: + backend, extra = "AMD", {"AMD_IFACE": "USB"} + elif TICI: + extra = {"QCOM_PRIORITY": "8"} + os.environ["DEV"] = backend + os.environ.update(extra) + + +_configure_accelerator() + + +# real metadata pkls are a few KB; anything bigger is a model artifact wrongly +# referenced as metadata (pre-fix manifests self-referenced the artifact), and +# unpickling it here double-loads the model onto the GPU +_META_MAX_BYTES = 1 << 20 + + +def load_artifact_metadata(metadata_filename): + """Read one artifact's metadata pkl: (input shapes, output slices).""" + try: + path = os.path.join(CUSTOM_MODEL_PATH, metadata_filename) + if os.path.getsize(path) > _META_MAX_BYTES: + cloudlog.error(f"metadata pkl {metadata_filename} is artifact-sized, refusing to unpickle it") + return tuple({} for _ in _META_FIELDS) + with open(path, 'rb') as fh: + blob = _pk.load(fh) + return tuple(blob.get(field, {}) for field in _META_FIELDS) + except Exception: + cloudlog.exception(f"unreadable metadata pkl {metadata_filename}, continuing without it") + return tuple({} for _ in _META_FIELDS) + + +@dataclass +class ArtifactSpec: + """One model of the active bundle plus its unpacked metadata.""" + model: Any + metadata: Any = None + input_shapes: ShapeDict = field(default_factory=dict) + output_slices: SliceDict = field(default_factory=dict) + + def __post_init__(self): + self.metadata = self.model.metadata + if self.metadata: + self.input_shapes, self.output_slices = load_artifact_metadata(self.metadata.fileName) + + +# kept name: some runners annotate against the old alias +ModelData = ArtifactSpec + + +class RunnerRoot: + """Shared root of the runner hierarchy. + + Both ModelRunner and the per-model parser mixins (model_types.py) inherit + this, so the concrete `TinygradRunner(ModelRunner, *Tinygrad)` diamond keeps + one consistent parser registry + slice implementation. + """ + + parser_method_dict: dict + _model_data: "ArtifactSpec | None" + + def _slice_outputs(self, model_outputs): + raise NotImplementedError + + +class ModelRunner(RunnerRoot): + """Base for the tinygrad/ONNX runners. + + Owns the active bundle's ArtifactSpecs and the shared slice/parse plumbing; + subclasses provide input staging (prepare_inputs) and execution (_run_model). + """ + + # False for fused runners, which warp + manage temporal buffers inside the JIT + uses_opencl_warp = True + + def __init__(self): + active = _fetch_bundle() + if not active: + raise ValueError("runner started without an active model bundle") + + self.models = {spec.type.raw: ArtifactSpec(spec) for spec in _qcom_models(active)} + self.is_20hz_3d = False + self.is_20hz = active.is20hz + self.inputs = {} + self.parser_method_dict = {} + self._model_data = None # active spec for the current operation + self._parser = self._constants = None + + def _active_spec(self): + spec = self._model_data + if spec is None: + raise ValueError("Model data is not available. Ensure the model is loaded correctly.") + return spec + + # views proxied straight off the active artifact spec; kept out of the class + # body (served via __getattr__) so the read surface stays data-driven + _SPEC_VIEW = frozenset(("input_shapes", "output_slices")) + + def __getattr__(self, name): + if name == "constants": + return self._constants + if name == "vision_input_names": + return list(self._active_spec().input_shapes) + if name in ModelRunner._SPEC_VIEW: + return getattr(self._active_spec(), name) + raise AttributeError(name) + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + """Stage image + numpy inputs for inference; implemented per backend.""" + raise NotImplementedError + + def _run_model(self): + """Execute inference over the staged inputs; implemented per backend.""" + raise NotImplementedError + + def run_model(self): + # parsing happens inside each backend's _run_model + return self._run_model() + + def _slice_outputs(self, model_outputs): + """Split the flat output vector into named views per the artifact's slice table.""" + sliced = {} + for tag, span in self._active_spec().output_slices.items(): + sliced[tag] = model_outputs[np.newaxis, span] + if SEND_RAW_PRED: + sliced["raw_pred"] = model_outputs.copy() + return sliced + + +# ---- runner selection (which backend to build for the active bundle) ---------- + +def _qcom_models(bundle) -> list: + # usbeMac artifacts ride along in a bundle for the eGPU host; they are never + # loaded on QCOM and must not affect runner classification + return [m for m in bundle.models if m.type.raw != ModelType.usbeMac] + + +def _single_artifact_prefix(bundle, prefix: str) -> bool: + models = _qcom_models(bundle) + return len(models) == 1 and models[0].artifact.fileName.startswith(prefix) + + +def _is_fused_bundle(bundle) -> bool: + return _single_artifact_prefix(bundle, "driving_fused_") + + +def _is_supercombo_bundle(bundle) -> bool: + return _single_artifact_prefix(bundle, "driving_supercombo_") + + +def _is_split_bundle(bundle) -> bool: + present = {m.type.raw for m in _qcom_models(bundle)} + split_kinds = {ModelType.vision, ModelType.policy, ModelType.offPolicy, ModelType.onPolicy} + return not present.isdisjoint(split_kinds) + + +def get_model_runner() -> "ModelRunner": + """Build the runner backend that fits the active bundle (supercombo / fused / + combined-split / split / single). Concrete runners are imported lazily so one + backend failing to load can't take down the others at import time.""" + from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner import (TinygradRunner, + TinygradSplitRunner) + bundle = _fetch_bundle() + # an eMac-only bundle (no QCOM-loadable models) runs the stock default on + # device; the big host serves the bundle's precompiled artifact + if not (bundle and bundle.models and _qcom_models(bundle)): + return TinygradRunner(ModelType.supercombo) + + if _is_supercombo_bundle(bundle): + from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.supercombo_runner import TinygradSupercomboRunner + return TinygradSupercomboRunner() + if _is_fused_bundle(bundle): + from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.fused_runner import TinygradFusedRunner + return TinygradFusedRunner() + if _is_split_bundle(bundle) and has_combined_split_artifact(bundle): + from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.combined_split_runner import TinygradCombinedSplitRunner + return TinygradCombinedSplitRunner() + if _is_split_bundle(bundle): + return TinygradSplitRunner() + return TinygradRunner(_qcom_models(bundle)[0].type.raw) diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py new file mode 100644 index 000000000..9129d3486 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" \ No newline at end of file diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py new file mode 100644 index 000000000..71a99cd13 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/combined_split_runner.py @@ -0,0 +1,245 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import os +import pickle +from pathlib import Path +from typing import Any + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.combined_artifact import resolve_combined_split_artifact +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_bundle +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import NumpyDict, ShapeDict, SliceDict +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + + +def _tinygrad_imports(): + from tinygrad.device import Device + from tinygrad.tensor import Tensor + return Tensor, Device + + +def _phase_roles(meta_by_role: dict[str, dict]) -> list[str]: + return [name for name in meta_by_role if name != "vision"] + + +def _phase_desire_key(policy_shapes: dict[str, tuple[int, ...]]) -> str: + for key in policy_shapes: + if key.startswith("desire"): + return key + raise KeyError("No desire-like key found in policy inputs") + + +def _phase_image_keys(vision_shapes: dict[str, tuple[int, ...]]) -> tuple[str, str]: + names = sorted(name for name in vision_shapes if "img" in name) + road_key = next((name for name in names if "big" not in name), None) + wide_key = next((name for name in names if "big" in name), None) + if road_key is None or wide_key is None: + raise ValueError(f"Unable to resolve road/wide image keys from {list(vision_shapes)}") + return road_key, wide_key + + +def _base_policy_keys(policy_shapes: dict[str, tuple[int, ...]]) -> set[str]: + desired_key = _phase_desire_key(policy_shapes) + return {desired_key, "features_buffer", "traffic_convention", "action_t"} + + +def _slice_map(raw_blob: np.ndarray, slices: dict[str, slice]) -> NumpyDict: + return {name: raw_blob[np.newaxis, section] for name, section in slices.items() if name != "pad"} + + +class TinygradCombinedSplitRunner(ModelRunner): + uses_opencl_warp: bool = False + + def __init__(self): + super().__init__() + self._constants = SplitModelConstants + self._parser = PhaseParser() + self._bundle = get_active_bundle() + self._artifact_path = resolve_combined_split_artifact(self._bundle) + if self._artifact_path is None: + raise FileNotFoundError("No IQ combined split artifact is available for the active bundle") + + with open(self._artifact_path, "rb") as artifact: + runtime_package: dict[Any, Any] = pickle.load(artifact) + + self._meta_by_role = runtime_package.get("meta_by_role", runtime_package.get("metadata", {})) + self._policy_roles = runtime_package.get("roles", _phase_roles(self._meta_by_role)) + self._camera_programs = { + camera_key: spec + for camera_key, spec in runtime_package.items() + if isinstance(camera_key, tuple) and isinstance(spec, dict) + } + self._execute_bundle = runtime_package.get("execute_bundle", runtime_package.get("run_policy")) + self._frame_stride = int(runtime_package.get("frame_stride", runtime_package.get("frame_skip", 1))) + + if "vision" not in self._meta_by_role: + raise ValueError("Combined split artifact is missing vision metadata") + if not self._policy_roles: + raise ValueError("Combined split artifact is missing policy roles") + if self._execute_bundle is None: + raise ValueError("Combined split artifact is missing execute_bundle") + + self._vision_meta = self._meta_by_role["vision"] + self._primary_policy_meta = self._meta_by_role[self._policy_roles[0]] + self._desired_key = _phase_desire_key(self._primary_policy_meta["input_shapes"]) + self._road_key, self._wide_key = _phase_image_keys(self._vision_meta["input_shapes"]) + self._extra_policy_keys = [ + key for key in self._primary_policy_meta["input_shapes"] + if key not in _base_policy_keys(self._primary_policy_meta["input_shapes"]) + ] + + self._queue_tensors: dict[str, Any] | None = None + self._numpy_state: dict[str, np.ndarray] | None = None + self._camera_shape: tuple[int, int] | None = None + self._blob_cache: dict[tuple[str, int], Any] = {} + self._last_desire = np.zeros(self._primary_policy_meta["input_shapes"][self._desired_key][2], dtype=np.float32) + + @property + def vision_input_names(self) -> list[str]: + return [self._road_key, self._wide_key] + + @property + def input_shapes(self) -> ShapeDict: + merged: ShapeDict = dict(self._vision_meta["input_shapes"]) + for role in self._policy_roles: + merged.update(self._meta_by_role[role]["input_shapes"]) + return merged + + @property + def output_slices(self) -> SliceDict: + merged: SliceDict = dict(self._vision_meta["output_slices"]) + for role in self._policy_roles: + merged.update(self._meta_by_role[role]["output_slices"]) + return merged + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + raise RuntimeError("Combined split runner manages its own warp + queue state; use run_fused()") + + def _frame_blob(self, stream_name: str, buf): + Tensor, Device = _tinygrad_imports() + raw_frame = np.frombuffer(buf.data, dtype=np.uint8) + cache_key = (stream_name, raw_frame.ctypes.data) + tensor = self._blob_cache.get(cache_key) + if tensor is None: + tensor = Tensor.from_blob(raw_frame.ctypes.data, (raw_frame.size,), dtype="uint8", device=Device.DEFAULT) + self._blob_cache[cache_key] = tensor + return tensor + + def _allocate_runtime_state(self, camera_width: int, camera_height: int) -> None: + if self._queue_tensors is not None and self._camera_shape == (camera_width, camera_height): + return + if (camera_width, camera_height) not in self._camera_programs: + raise RuntimeError(f"No combined split kernels available for {camera_width}x{camera_height}") + + Tensor, Device = _tinygrad_imports() + vision_shapes = self._vision_meta["input_shapes"] + policy_shapes = self._primary_policy_meta["input_shapes"] + + image_shape = vision_shapes[self._road_key] + frame_history = image_shape[1] // 6 + queue_depth = self._frame_stride * (frame_history - 1) + 1 + frame_queue_shape = (queue_depth, 6, image_shape[2], image_shape[3]) + + feature_shape = policy_shapes["features_buffer"] + desired_shape = policy_shapes[self._desired_key] + traffic_shape = policy_shapes["traffic_convention"] + action_shape = policy_shapes.get("action_t", traffic_shape) + + numpy_state = { + "tfm": np.zeros((3, 3), dtype=np.float32), + "big_tfm": np.zeros((3, 3), dtype=np.float32), + "desire": np.zeros(desired_shape[2], dtype=np.float32), + "traffic_convention": np.zeros(traffic_shape, dtype=np.float32), + "action_t": np.zeros(action_shape, dtype=np.float32), + } + for key in self._extra_policy_keys: + numpy_state[key] = np.zeros(policy_shapes[key], dtype=np.float32) + + queue_tensors = { + "img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize(), + "big_img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize(), + "feat_q": Tensor( + np.zeros((self._frame_stride * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), dtype=np.float32), + device=Device.DEFAULT, + ).contiguous().realize(), + "desire_q": Tensor( + np.zeros((self._frame_stride * desired_shape[1], desired_shape[0], desired_shape[2]), dtype=np.float32), + device=Device.DEFAULT, + ).contiguous().realize(), + **{name: Tensor(value, device="NPY").realize() for name, value in numpy_state.items()}, + } + + self._queue_tensors = queue_tensors + self._numpy_state = numpy_state + self._camera_shape = (camera_width, camera_height) + + def _policy_inputs(self) -> dict[str, Any]: + assert self._queue_tensors is not None + tensor_names = ["feat_q", "desire_q", "desire", "traffic_convention", "action_t", *self._extra_policy_keys] + return {name: self._queue_tensors[name] for name in tensor_names if name in self._queue_tensors} + + def _merge_policy_outputs(self, raw_outputs: tuple[Any, ...]) -> NumpyDict: + outputs = self._parser.parse_vision_outputs( + _slice_map(raw_outputs[0].numpy().flatten(), self._vision_meta["output_slices"]) + ) + + has_on_policy = any(role == "on_policy" for role in self._policy_roles) + for role_name, tensor_out in zip(self._policy_roles, raw_outputs[1:], strict=True): + parsed = self._parser.parse_policy_outputs( + _slice_map(tensor_out.numpy().flatten(), self._meta_by_role[role_name]["output_slices"]) + ) + if role_name == "off_policy" and has_on_policy: + parsed.pop("plan", None) + outputs.update(parsed) + + if "planplus" in outputs and "plan" in outputs: + outputs["plan"] = outputs["plan"] + outputs["planplus"] + return outputs + + def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict: + main_buf = bufs[self._road_key] + self._allocate_runtime_state(main_buf.width, main_buf.height) + assert self._queue_tensors is not None and self._numpy_state is not None and self._camera_shape is not None + + self._numpy_state["tfm"][:] = transforms[self._road_key] + self._numpy_state["big_tfm"][:] = transforms[self._wide_key] + + current_desire = numpy_inputs[self._desired_key].copy() + current_desire[0] = 0 + self._numpy_state["desire"][:] = np.where(current_desire - self._last_desire > 0.99, current_desire, 0) + self._last_desire[:] = current_desire + + if "traffic_convention" in numpy_inputs: + self._numpy_state["traffic_convention"][:] = numpy_inputs["traffic_convention"] + if "action_t" in numpy_inputs: + self._numpy_state["action_t"][:] = numpy_inputs["action_t"] + for key in self._extra_policy_keys: + if key in numpy_inputs: + self._numpy_state[key][:] = numpy_inputs[key] + + stage_inputs = self._camera_programs[self._camera_shape].get("stage_inputs", self._camera_programs[self._camera_shape].get("warp_enqueue")) + if stage_inputs is None: + raise RuntimeError("Combined split artifact camera entry is missing stage_inputs") + + staged_main, staged_wide = stage_inputs( + img_q=self._queue_tensors["img_q"], + big_img_q=self._queue_tensors["big_img_q"], + tfm=self._queue_tensors["tfm"], + big_tfm=self._queue_tensors["big_tfm"], + frame=self._frame_blob(self._road_key, bufs[self._road_key]), + big_frame=self._frame_blob(self._wide_key, bufs[self._wide_key]), + ) + raw_outputs = self._execute_bundle(img=staged_main, big_img=staged_wide, **self._policy_inputs()) + if not isinstance(raw_outputs, tuple): + raw_outputs = (raw_outputs,) + return self._merge_policy_outputs(raw_outputs) + + def _run_model(self) -> NumpyDict: + raise RuntimeError("Combined split runner executes through run_fused()") diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py new file mode 100644 index 000000000..33beea423 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/fused_runner.py @@ -0,0 +1,178 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import os +import pickle +from typing import Any + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ( + CUSTOM_MODEL_PATH, NumpyDict, ShapeDict, SliceDict, +) +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + + +def _tinygrad_imports(): + from tinygrad.tensor import Tensor + from tinygrad.device import Device + return Tensor, Device + + +WARP_DEV = os.getenv('WARP_DEV') + + +class TinygradFusedRunner(ModelRunner): + uses_opencl_warp: bool = False + + def __init__(self): + super().__init__() + + self._constants = SplitModelConstants + self._parser = PhaseParser() + + if len(self.models) != 1: + raise ValueError(f"fused bundle must have exactly one artifact, got {list(self.models)}") + self._model_data = next(iter(self.models.values())) + + pkl_path = os.path.join(CUSTOM_MODEL_PATH, self._model_data.model.artifact.fileName) + with open(pkl_path, 'rb') as f: + self._fused: dict[Any, Any] = pickle.load(f) + + self._vision_meta = self._fused['metadata']['vision'] + self._on_meta = self._fused['metadata']['on_policy'] + self._off_meta = self._fused['metadata']['off_policy'] + self._run_policy = self._fused['run_policy'] + self._warp_jits: dict[tuple[int, int], Any] = {k: v for k, v in self._fused.items() if isinstance(k, tuple)} + if not self._warp_jits: + raise ValueError("fused pkl has no warp JITs") + + self._frame_skip: int = int(self._fused.get('frame_skip', 4)) + + self._queues: dict[str, Any] | None = None + self._npy_buffers: dict[str, np.ndarray] | None = None + self._cam_resolution: tuple[int, int] | None = None + self._blob_cache: dict[tuple[str, int], Any] = {} + + def _frame_tensor(self, key, buf): + Tensor, Device = _tinygrad_imports() + arr = np.frombuffer(buf.data, dtype=np.uint8) + ck = (key, arr.ctypes.data) + t = self._blob_cache.get(ck) + if t is None: + t = Tensor.from_blob(arr.ctypes.data, (arr.size,), dtype='uint8', device=Device.DEFAULT) + self._blob_cache[ck] = t + return t + + @property + def vision_input_names(self) -> list[str]: + return ['img', 'big_img'] + + @property + def input_shapes(self) -> ShapeDict: + return {**self._vision_meta['input_shapes'], **self._on_meta['input_shapes']} + + @property + def output_slices(self) -> SliceDict: + merged: SliceDict = {} + for src in (self._vision_meta['output_slices'], self._on_meta['output_slices'], self._off_meta['output_slices']): + merged.update({k: v for k, v in src.items() if k != 'pad'}) + return merged + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + raise RuntimeError("fused runner has no OpenCL path; use run_fused()") + + def _ensure_queues(self, cam_w: int, cam_h: int) -> None: + if self._queues is not None and self._cam_resolution == (cam_w, cam_h): + return + if (cam_w, cam_h) not in self._warp_jits: + raise RuntimeError(f"no warp JIT for {cam_w}x{cam_h}; have {sorted(self._warp_jits)}") + + Tensor, Device = _tinygrad_imports() + img_shape = self._vision_meta['input_shapes']['img'] + fb = self._on_meta['input_shapes']['features_buffer'] + dp = self._on_meta['input_shapes']['desire_pulse'] + n_frames = img_shape[1] // 6 + img_buf_shape = (self._frame_skip * (n_frames - 1) + 1, 6, img_shape[2], img_shape[3]) + + zeros_u8 = lambda shp: Tensor(np.zeros(shp, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize() + zeros_f32 = lambda shp: Tensor(np.zeros(shp, dtype=np.float32), device=Device.DEFAULT).contiguous().realize() + + self._queues = { + 'img_q': zeros_u8(img_buf_shape), + 'big_img_q': zeros_u8(img_buf_shape), + 'feat_q': zeros_f32((self._frame_skip * (fb[1] - 1) + 1, fb[0], fb[2])), + 'desire_q': zeros_f32((self._frame_skip * dp[1], dp[0], dp[2])), + } + on_shapes = self._on_meta['input_shapes'] + captured = self._run_policy.captured + jit_shapes = { + name: tuple(int(s) for s in view.shape) + for name, (view, _vars, _dtype, _device) in zip(captured.expected_names, captured.expected_input_info) + } + + def policy_input_shape(name): + shape = on_shapes.get(name, jit_shapes.get(name)) + if shape is None: + raise ValueError(f"fused pkl declares no shape for policy input {name}") + return shape + + self._npy_buffers = { + 'desire': np.zeros(dp[2], dtype=np.float32), + 'traffic_convention': np.zeros(policy_input_shape('traffic_convention'), dtype=np.float32), + 'tfm': np.zeros((3, 3), dtype=np.float32), + 'big_tfm': np.zeros((3, 3), dtype=np.float32), + } + if 'action_t' in jit_shapes: + self._npy_buffers['action_t'] = np.zeros(policy_input_shape('action_t'), dtype=np.float32) + self._cam_resolution = (cam_w, cam_h) + + def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict: + Tensor, Device = _tinygrad_imports() + + main_buf = bufs['img'] + self._ensure_queues(main_buf.width, main_buf.height) + assert self._queues is not None and self._npy_buffers is not None + + desire_key = next((k for k in numpy_inputs if k.startswith('desire')), None) + if desire_key is not None: + self._npy_buffers['desire'][:] = numpy_inputs[desire_key] + if 'traffic_convention' in numpy_inputs: + self._npy_buffers['traffic_convention'][:] = numpy_inputs['traffic_convention'] + if 'action_t' in numpy_inputs and 'action_t' in self._npy_buffers: + self._npy_buffers['action_t'][:] = numpy_inputs['action_t'] + self._npy_buffers['tfm'][:] = transforms['img'] + self._npy_buffers['big_tfm'][:] = transforms['big_img'] + + npy = lambda key: Tensor(self._npy_buffers[key], device='NPY') + + frame = self._frame_tensor('img', bufs['img']) + big_frame = self._frame_tensor('big_img', bufs['big_img']) + + warp_jit = self._warp_jits[self._cam_resolution] + img, big_img = warp_jit(img_q=self._queues['img_q'], big_img_q=self._queues['big_img_q'], + tfm=npy('tfm'), big_tfm=npy('big_tfm'), frame=frame, big_frame=big_frame) + + policy_inputs = dict( + img=img, big_img=big_img, feat_q=self._queues['feat_q'], desire_q=self._queues['desire_q'], + desire=npy('desire'), traffic_convention=npy('traffic_convention')) + if 'action_t' in self._npy_buffers: + policy_inputs['action_t'] = npy('action_t') + vision_out_t, on_out_t, off_out_t = self._run_policy(**policy_inputs) + + def _slice(tensor_out, meta) -> NumpyDict: + flat = tensor_out.numpy().flatten() + return {k: flat[np.newaxis, sl] for k, sl in meta['output_slices'].items() if k != 'pad'} + + parsed: NumpyDict = {} + parsed.update(self._parser.parse_vision_outputs(_slice(vision_out_t, self._vision_meta))) + parsed.update(self._parser.parse_policy_outputs(_slice(off_out_t, self._off_meta))) + parsed.update(self._parser.parse_policy_outputs(_slice(on_out_t, self._on_meta))) + return parsed + + def _run_model(self) -> NumpyDict: + raise RuntimeError("fused path goes through run_fused(), not _run_model()") diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py new file mode 100644 index 000000000..a2f5ec5b6 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/model_types.py @@ -0,0 +1,60 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +from abc import ABC +from collections.abc import Callable + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType, NumpyDict +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import RunnerRoot +from iqpilot.selfdrive.iqmodeld.parser import ArchiveParser, PhaseParser + + +class _ParserRole(RunnerRoot, ABC): + def _bind_parser_role(self, + selector: int, + parser_builder: Callable[[], object], + projector: Callable[[object, NumpyDict], NumpyDict]) -> None: + parser = parser_builder() + self.parser_method_dict[selector] = lambda model_blob: projector(parser, self._slice_outputs(model_blob)) + + +def _phase_policy(parser: PhaseParser, sliced_outputs: NumpyDict) -> NumpyDict: + return parser.parse_policy_outputs(sliced_outputs) + + +def _phase_vision(parser: PhaseParser, sliced_outputs: NumpyDict) -> NumpyDict: + return parser.parse_vision_outputs(sliced_outputs) + + +def _archive_combined(parser: ArchiveParser, sliced_outputs: NumpyDict) -> NumpyDict: + return parser.parse_outputs(sliced_outputs) + + +class OffPolicyTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.offPolicy, PhaseParser, _phase_policy) + + +class OnPolicyTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.onPolicy, PhaseParser, _phase_policy) + + +class PolicyTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.policy, PhaseParser, _phase_policy) + + +class VisionTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.vision, PhaseParser, _phase_vision) + + +class SupercomboTinygrad(_ParserRole, ABC): + def __init__(self): + self._bind_parser_role(ModelType.supercombo, ArchiveParser, _archive_combined) diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py new file mode 100644 index 000000000..ccd4a5b1e --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/supercombo_runner.py @@ -0,0 +1,339 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +import math +import os +import pickle +import re +from typing import Any + +import numpy as np + +from iqpilot.common.params import Params +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUSTOM_MODEL_PATH, NumpyDict, ShapeDict, SliceDict +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + + +def _tinygrad_imports(): + from tinygrad.tensor import Tensor + from tinygrad.device import Device + return Tensor, Device + + +def _captured_queue_depth(warp_jit: Any) -> int | None: + captured = getattr(warp_jit, "captured", None) + infos = getattr(captured, "expected_input_info", None) + if not infos or len(infos) < 2: + return None + + view_repr = repr(infos[1][0]) + dims = [int(val) for val in re.findall(r"arg=(\d+)", view_repr)] + return dims[0] if len(dims) >= 4 else None + + +def _captured_devices(warp_jit: Any) -> set[str]: + captured = getattr(warp_jit, "captured", None) + infos = getattr(captured, "expected_input_info", None) + if not infos: + return set() + + devices: set[str] = set() + for info in infos: + if isinstance(info, tuple) and len(info) >= 4 and isinstance(info[3], str): + devices.add(info[3]) + return devices + + +def _captured_expected_names(jit_obj: Any) -> list[str]: + captured = getattr(jit_obj, "captured", None) + names = getattr(captured, "expected_names", None) + return list(names) if names else [] + + +def _file_sha256(path: str) -> str: + digest = hashlib.sha256() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _is_jit_arg_mismatch(err: BaseException) -> bool: + return "args mismatch in JIT" in str(err) + + +class TinygradSupercomboRunner(ModelRunner): + uses_opencl_warp: bool = False + + def __init__(self): + super().__init__() + self._constants = SplitModelConstants + self._parser = PhaseParser() + + if len(self.models) != 1: + raise ValueError(f"supercombo bundle must have exactly one artifact, got {list(self.models)}") + self._model_data = next(iter(self.models.values())) + + pkl_path = os.path.join(CUSTOM_MODEL_PATH, self._model_data.model.artifact.fileName) + self._pkl_path = pkl_path + self._expected_sha256 = getattr(getattr(self._model_data.model.artifact, "downloadUri", None), "sha256", "") or "" + self._verify_artifact_file() + with open(pkl_path, 'rb') as f: + self._m: dict[Any, Any] = pickle.load(f) + + self._meta = self._m['metadata'] + self._ish = self._meta['input_shapes'] + self._slices = {k: v for k, v in self._meta['output_slices'].items() if k != 'pad'} + self._hidden_slice = self._meta['output_slices']['hidden_state'] + self._run_policy = self._m['run_policy'] + self._warp_jits: dict[tuple[int, int], Any] = {k: v for k, v in self._m.items() if isinstance(k, tuple)} + if not self._warp_jits: + raise ValueError("supercombo pkl has no warp JITs") + self._frame_skip = int(self._m.get('frame_skip', 4)) + self._validate_warp_jits(pkl_path) + self._validate_jit_names() + + self._queues: dict[str, Any] | None = None + self._npy: dict[str, np.ndarray] | None = None + self._cam: tuple[int, int] | None = None + self._prev_desire = np.zeros(self._ish['desire_pulse'][2], dtype=np.float32) + self._blob_cache: dict[tuple[str, int], Any] = {} + + def _verify_artifact_file(self) -> None: + if not self._expected_sha256: + return + + actual_sha256 = _file_sha256(self._pkl_path) + if actual_sha256 == self._expected_sha256: + return + + try: + os.remove(self._pkl_path) + except OSError: + pass + redownload_msg = self._schedule_active_bundle_redownload() + + raise RuntimeError( + "supercombo artifact SHA mismatch: " + f"expected {self._expected_sha256}, got {actual_sha256} for {self._pkl_path}. " + f"Deleted the stale cached file{redownload_msg}." + ) + + def _validate_warp_jits(self, pkl_path: str) -> None: + img = self._ish['img'] + n_frames = img[1] // 6 + expected_depth = self._frame_skip * (n_frames - 1) + 1 + expected_device = os.getenv('DEV') + + mismatches: list[str] = [] + for cam, warp_jit in sorted(self._warp_jits.items()): + captured_depth = _captured_queue_depth(warp_jit) + captured_devices = _captured_devices(warp_jit) + if captured_depth is not None and captured_depth != expected_depth: + mismatches.append( + f"{cam[0]}x{cam[1]} queue-depth captured={captured_depth} expected={expected_depth}" + ) + if expected_device and captured_devices and expected_device not in captured_devices: + mismatches.append( + f"{cam[0]}x{cam[1]} device captured={sorted(captured_devices)} expected={expected_device}" + ) + + if mismatches: + details = "; ".join(mismatches) + raise RuntimeError( + "supercombo warp JIT compatibility mismatch: " + f"{details}. Bundle {pkl_path} was compiled with the wrong backend, frame_skip, or queue shape; " + "re-download or rebuild this model artifact." + ) + + def _validate_jit_names(self) -> None: + expected_warp_names = ['big_frame', 'big_tfm', 'frame', 'tfm'] + expected_policy_names = ['big_img_q', 'desire_q', 'feat_q', 'img_q', 'packed_npy_inputs', 'warped'] + + mismatches: list[str] = [] + + policy_names = sorted(_captured_expected_names(self._run_policy)) + if policy_names and policy_names != expected_policy_names: + mismatches.append(f"run_policy captured={policy_names} expected={expected_policy_names}") + + for cam, warp_jit in sorted(self._warp_jits.items()): + warp_names = sorted(_captured_expected_names(warp_jit)) + if warp_names and warp_names != expected_warp_names: + mismatches.append(f"{cam[0]}x{cam[1]} warp captured={warp_names} expected={expected_warp_names}") + + if mismatches: + details = "; ".join(mismatches) + actual_sha = None + try: + actual_sha = _file_sha256(self._pkl_path) + except OSError: + pass + + if actual_sha and self._expected_sha256 and actual_sha != self._expected_sha256: + try: + os.remove(self._pkl_path) + except OSError: + pass + redownload_msg = self._schedule_active_bundle_redownload() + raise RuntimeError( + "supercombo artifact contract mismatch with stale cached SHA: " + f"{details}. Expected SHA {self._expected_sha256}, got {actual_sha}. " + f"Deleted the stale cached file{redownload_msg}." + ) + + raise RuntimeError( + "supercombo artifact JIT argument mismatch: " + f"{details}. This model file does not match the current IQPilot runtime contract. " + "Re-download or rebuild this model artifact." + ) + + def _handle_runtime_jit_mismatch(self, err: BaseException) -> None: + if not _is_jit_arg_mismatch(err): + raise err + + actual_sha = None + try: + actual_sha = _file_sha256(self._pkl_path) + except OSError: + pass + + if actual_sha and self._expected_sha256 and actual_sha != self._expected_sha256: + try: + os.remove(self._pkl_path) + except OSError: + pass + redownload_msg = self._schedule_active_bundle_redownload() + raise RuntimeError( + "supercombo artifact runtime JIT mismatch with stale cached SHA: " + f"expected {self._expected_sha256}, got {actual_sha} for {self._pkl_path}. " + f"Deleted the stale cached file{redownload_msg}." + ) from err + + raise RuntimeError( + "supercombo artifact runtime JIT mismatch: " + f"{err}. This model file does not match the current IQPilot runtime contract. " + "Re-download or rebuild this model artifact." + ) from err + + def _schedule_active_bundle_redownload(self) -> str: + try: + params = Params() + active_bundle = params.get("ModelManager_ActiveBundle") or {} + index = active_bundle.get("index") if isinstance(active_bundle, dict) else None + if isinstance(index, str) and index.isdigit(): + index = int(index) + if isinstance(index, int) and index >= 0: + params.put("ModelManager_DownloadIndex", str(index)) + params.remove("ModelRunnerTypeCache") + return "; scheduled automatic re-download of the active model" + except Exception: + pass + + return "; unable to schedule automatic re-download" + + def _frame_tensor(self, key: str, buf): + Tensor, Device = _tinygrad_imports() + arr = np.frombuffer(buf.data, dtype=np.uint8) + ck = (key, arr.ctypes.data) + t = self._blob_cache.get(ck) + if t is None: + t = Tensor.from_blob(arr.ctypes.data, (arr.size,), dtype='uint8', device=Device.DEFAULT) + self._blob_cache[ck] = t + return t + + @property + def vision_input_names(self) -> list[str]: + return ['img', 'big_img'] + + @property + def input_shapes(self) -> ShapeDict: + return dict(self._ish) + + @property + def output_slices(self) -> SliceDict: + return dict(self._slices) + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + raise RuntimeError("supercombo runner has no OpenCL path; use run_fused()") + + def _ensure_queues(self, cam_w: int, cam_h: int) -> None: + if self._queues is not None and self._cam == (cam_w, cam_h): + return + if (cam_w, cam_h) not in self._warp_jits: + raise RuntimeError(f"no warp JIT for {cam_w}x{cam_h}; have {sorted(self._warp_jits)}") + + Tensor, Device = _tinygrad_imports() + fs = self._frame_skip + img = self._ish['img'] + n_frames = img[1] // 6 + img_buf = (fs * (n_frames - 1) + 1, 6, img[2], img[3]) + fb = self._ish['features_buffer'] + dp = self._ish['desire_pulse'] + tc = self._ish['traffic_convention'] + at = self._ish['action_t'] + + zeros_u8 = lambda s: Tensor(np.zeros(s, dtype=np.uint8), device=Device.DEFAULT).contiguous().realize() + zeros_f32 = lambda s: Tensor(np.zeros(s, dtype=np.float32), device=Device.DEFAULT).contiguous().realize() + + shapes = {'desire': (dp[2],), 'traffic_convention': tuple(tc), 'action_t': tuple(at), 'prev_feat': (fb[0], fb[2])} + sizes = [math.prod(s) for s in shapes.values()] + packed = np.zeros(sum(sizes), dtype=np.float32) + views = {k: v.reshape(s) for (k, s), v in zip(shapes.items(), np.split(packed, np.cumsum(sizes[:-1])), strict=True)} + + self._npy = {'tfm': np.zeros((3, 3), dtype=np.float32), 'big_tfm': np.zeros((3, 3), dtype=np.float32), **views} + self._queues = { + 'img_q': zeros_u8(img_buf), + 'big_img_q': zeros_u8(img_buf), + 'feat_q': zeros_f32((fs * fb[1], fb[0], fb[2])), + 'desire_q': zeros_f32((fs * dp[1], dp[0], dp[2])), + 'tfm': Tensor(self._npy['tfm'], device='NPY'), + 'big_tfm': Tensor(self._npy['big_tfm'], device='NPY'), + 'packed_npy_inputs': Tensor(packed, device='NPY'), + } + self._cam = (cam_w, cam_h) + + def run_fused(self, bufs: dict, transforms: dict[str, np.ndarray], numpy_inputs: NumpyDict) -> NumpyDict: + Tensor, Device = _tinygrad_imports() + main_buf = bufs['img'] + self._ensure_queues(main_buf.width, main_buf.height) + assert self._queues is not None and self._npy is not None + + self._npy['tfm'][:] = transforms['img'] + self._npy['big_tfm'][:] = transforms['big_img'] + + desire_key = next((k for k in numpy_inputs if k.startswith('desire')), None) + cur = numpy_inputs[desire_key].copy() if desire_key is not None else np.zeros_like(self._prev_desire) + cur[0] = 0 + self._npy['desire'][:] = np.where(cur - self._prev_desire > .99, cur, 0) + self._prev_desire[:] = cur + if 'traffic_convention' in numpy_inputs: + self._npy['traffic_convention'][:] = numpy_inputs['traffic_convention'] + if 'action_t' in numpy_inputs: + self._npy['action_t'][:] = numpy_inputs['action_t'] + + frame = self._frame_tensor('img', bufs['img']) + big_frame = self._frame_tensor('big_img', bufs['big_img']) + + warp = self._warp_jits[self._cam] + try: + warped = warp(tfm=self._queues['tfm'], big_tfm=self._queues['big_tfm'], frame=frame, big_frame=big_frame) + out, = self._run_policy(warped=warped, img_q=self._queues['img_q'], big_img_q=self._queues['big_img_q'], + feat_q=self._queues['feat_q'], desire_q=self._queues['desire_q'], + packed_npy_inputs=self._queues['packed_npy_inputs']) + except Exception as err: + self._handle_runtime_jit_mismatch(err) + raise + flat = out.numpy().flatten() + + self._npy['prev_feat'][:] = flat[self._hidden_slice].reshape(self._npy['prev_feat'].shape) + + sliced = {k: flat[np.newaxis, sl] for k, sl in self._slices.items()} + return self._parser.parse_vision_outputs(sliced) + + def _run_model(self) -> NumpyDict: + raise RuntimeError("supercombo path goes through run_fused(), not _run_model()") diff --git a/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py new file mode 100644 index 000000000..2d91c3df1 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/runners/tinygrad/tinygrad_runner.py @@ -0,0 +1,190 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import pickle +from dataclasses import dataclass + +import numpy as np +from tinygrad.dtype import dtypes +from tinygrad.tensor import Tensor + +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ( + CLMemDict, + CUSTOM_MODEL_PATH, + FrameDict, + ModelType, + NumpyDict, + ShapeDict, + SliceDict, +) +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelRunner +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.model_types import ( + OffPolicyTinygrad, + OnPolicyTinygrad, + PolicyTinygrad, + SupercomboTinygrad, + VisionTinygrad, +) +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.iqmodeld.runtime.tinygrad import qcom_tensor_from_opencl_address +from iqpilot.system.hardware import TICI + + +@dataclass(frozen=True) +class _TensorShapePlan: + dtype: object + device: str + + +def _artifact_path(filename: str) -> str: + return f"{CUSTOM_MODEL_PATH}/{filename}" + + +def _load_program_blob(filename: str): + with open(_artifact_path(filename), "rb") as artifact: + try: + return pickle.load(artifact) + except FileNotFoundError as exc: + assert "/dev/kgsl-3d0" not in str(exc), "Model was built on C3 or C3X, but is being loaded on PC" + raise + + +def _compile_input_plan(captured) -> dict[str, _TensorShapePlan]: + plan: dict[str, _TensorShapePlan] = {} + for name, info in zip(captured.expected_names, captured.expected_input_info, strict=True): + plan[name] = _TensorShapePlan(dtype=info[2], device=info[3]) + return plan + + +def _merge_step_outputs(output_groups: list[NumpyDict]) -> NumpyDict: + stitched: NumpyDict = {} + for payload in output_groups: + stitched.update(payload) + if "planplus" in stitched and "plan" in stitched: + stitched["plan"] = stitched["plan"] + stitched["planplus"] + return stitched + + +class TinygradRunner(ModelRunner, SupercomboTinygrad, PolicyTinygrad, VisionTinygrad, OffPolicyTinygrad, OnPolicyTinygrad): + def __init__(self, model_type: int = ModelType.supercombo): + ModelRunner.__init__(self) + for initializer in (SupercomboTinygrad, PolicyTinygrad, VisionTinygrad, OffPolicyTinygrad, OnPolicyTinygrad): + initializer.__init__(self) + + self._constants = ModelConstants + self._model_data = self.models.get(model_type) + if self._model_data is None or self._model_data.model is None: + raise ValueError(f"Model data for type {model_type} not available.") + + asset_name = self._model_data.model.artifact.fileName + assert asset_name.endswith("_tinygrad.pkl"), f"Invalid model file {asset_name} for TinygradRunner" + + self.model_run = _load_program_blob(asset_name) + self._input_plan = _compile_input_plan(self.model_run.captured) + for name, spec in self._input_plan.items(): + if "img" in name and spec.dtype is not dtypes.uint8: + raise ValueError(f"{asset_name}: image input {name} expects {spec.dtype}, incompatible with uint8 warp buffer") + self.input_to_dtype = {name: spec.dtype for name, spec in self._input_plan.items()} + self.input_to_device = {name: spec.device for name, spec in self._input_plan.items()} + + @property + def vision_input_names(self) -> list[str]: + return [stream_name for stream_name in self.input_shapes if "img" in stream_name] + + def _attach_vision_tensor(self, stream_name: str, frame_buffers: CLMemDict, frame_views: FrameDict) -> None: + spec = self._input_plan[stream_name] + frame_buffer = frame_buffers[stream_name] + if TICI: + self.inputs[stream_name] = qcom_tensor_from_opencl_address(frame_buffer.mem_address, + self.input_shapes[stream_name], + dtype=spec.dtype) + return + + mirrored = frame_views[stream_name].as_numpy(frame_buffer).reshape(self.input_shapes[stream_name]) + self.inputs[stream_name] = Tensor(mirrored, device=spec.device, dtype=spec.dtype).realize() + + def _attach_state_tensor(self, tensor_name: str, tensor_value: np.ndarray) -> None: + spec = self._input_plan[tensor_name] + self.inputs[tensor_name] = Tensor(tensor_value, device=spec.device, dtype=spec.dtype).realize() + + def prepare_vision_inputs(self, imgs_cl: CLMemDict, frames: FrameDict): + for stream_name in imgs_cl: + if stream_name not in self.inputs or not TICI: + self._attach_vision_tensor(stream_name, imgs_cl, frames) + + def prepare_policy_inputs(self, numpy_inputs: NumpyDict): + for tensor_name, tensor_value in numpy_inputs.items(): + self._attach_state_tensor(tensor_name, tensor_value) + + def prepare_inputs(self, imgs_cl: CLMemDict, numpy_inputs: NumpyDict, frames: FrameDict) -> dict: + self.prepare_vision_inputs(imgs_cl, frames) + self.prepare_policy_inputs(numpy_inputs) + return self.inputs + + def _parse_outputs(self, model_outputs: np.ndarray) -> NumpyDict: + if self._model_data is None: + raise ValueError("Model data is not available. Ensure the model is loaded correctly.") + return self.parser_method_dict[self._model_data.model.type.raw](model_outputs) + + def _run_model(self) -> NumpyDict: + raw_output = self.model_run(**self.inputs).numpy().reshape(-1) + return self._parse_outputs(raw_output) + + +class TinygradSplitRunner(ModelRunner): + def __init__(self): + super().__init__() + self.is_20hz_3d = True + self._constants = SplitModelConstants + self.vision_runner = TinygradRunner(ModelType.vision) + self.policy_runner = TinygradRunner(ModelType.policy) if self.models.get(ModelType.policy) else None + self.off_policy_runner = TinygradRunner(ModelType.offPolicy) if self.models.get(ModelType.offPolicy) else None + self.on_policy_runner = TinygradRunner(ModelType.onPolicy) if self.models.get(ModelType.onPolicy) else None + + def _policy_units(self) -> list[TinygradRunner]: + return [runner for runner in (self.policy_runner, self.off_policy_runner, self.on_policy_runner) if runner is not None] + + def run_vision(self) -> NumpyDict: + return self.vision_runner.run_model() + + def run_policy(self) -> NumpyDict: + return _merge_step_outputs([runner.run_model() for runner in self._policy_units()]) + + def refresh_policy_features(self, features_buffer: np.ndarray) -> None: + for runner in self._policy_units(): + if "features_buffer" in runner._input_plan: + runner._attach_state_tensor("features_buffer", features_buffer) + + def _run_model(self) -> NumpyDict: + return _merge_step_outputs([self.run_vision(), self.run_policy()]) + + @property + def vision_input_names(self) -> list[str]: + return list(self.vision_runner.vision_input_names) + + @property + def input_shapes(self) -> ShapeDict: + composite: ShapeDict = dict(self.vision_runner.input_shapes) + for runner in self._policy_units(): + composite.update(runner.input_shapes) + return composite + + @property + def output_slices(self) -> SliceDict: + composite: SliceDict = dict(self.vision_runner.output_slices) + for runner in self._policy_units(): + composite.update(runner.output_slices) + return composite + + def prepare_inputs(self, imgs_cl: CLMemDict, numpy_inputs: NumpyDict, frames: FrameDict) -> dict: + self.vision_runner.prepare_vision_inputs(imgs_cl, frames) + assembled_inputs = dict(self.vision_runner.inputs) + for runner in self._policy_units(): + runner.prepare_policy_inputs(numpy_inputs) + assembled_inputs.update(runner.inputs) + self.inputs = assembled_inputs + return assembled_inputs diff --git a/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py b/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py new file mode 100644 index 000000000..3f83ea806 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/models/split_model_constants.py @@ -0,0 +1,89 @@ +import numpy as np + + +def index_function(idx, max_val=192, max_idx=32): + return max_val * ((idx/max_idx)**2) + + +class SplitModelConstants: + IDX_N = 33 + T_IDXS = [index_function(idx, max_val=10.0) for idx in range(IDX_N)] + X_IDXS = [index_function(idx, max_val=192.0) for idx in range(IDX_N)] + LEAD_T_IDXS = [0., 2., 4., 6., 8., 10.] + LEAD_T_OFFSETS = [0., 2., 4.] + META_T_IDXS = [2., 4., 6., 8., 10.] + + MODEL_FREQ = 20 + HISTORY_FREQ = 5 + HISTORY_LEN_SECONDS = 5 + TEMPORAL_SKIP = MODEL_FREQ // HISTORY_FREQ + FULL_HISTORY_BUFFER_LEN = MODEL_FREQ * HISTORY_LEN_SECONDS + INPUT_HISTORY_BUFFER_LEN = HISTORY_FREQ * HISTORY_LEN_SECONDS + + FEATURE_LEN = 512 + + DESIRE_LEN = 8 + TRAFFIC_CONVENTION_LEN = 2 + LAT_PLANNER_STATE_LEN = 4 + LATERAL_CONTROL_PARAMS_LEN = 2 + PREV_DESIRED_CURV_LEN = 1 + + FCW_THRESHOLDS_5MS2 = np.array([.05, .05, .15, .15, .15], dtype=np.float32) + FCW_THRESHOLDS_3MS2 = np.array([.7, .7], dtype=np.float32) + FCW_5MS2_PROBS_WIDTH = 5 + FCW_3MS2_PROBS_WIDTH = 2 + + DISENGAGE_WIDTH = 5 + POSE_WIDTH = 6 + WIDE_FROM_DEVICE_WIDTH = 3 + LEAD_WIDTH = 4 + LANE_LINES_WIDTH = 2 + ROAD_EDGES_WIDTH = 2 + PLAN_WIDTH = 15 + DESIRE_PRED_WIDTH = 8 + LAT_PLANNER_SOLUTION_WIDTH = 4 + DESIRED_CURV_WIDTH = 1 + ACTION_WIDTH = 2 + + NUM_LANE_LINES = 4 + NUM_ROAD_EDGES = 2 + + LEAD_TRAJ_LEN = 6 + DESIRE_PRED_LEN = 4 + + PLAN_MHP_N = 5 + LEAD_MHP_N = 2 + PLAN_MHP_SELECTION = 1 + LEAD_MHP_SELECTION = 3 + + FCW_THRESHOLD_5MS2_HIGH = 0.15 + FCW_THRESHOLD_5MS2_LOW = 0.05 + FCW_THRESHOLD_3MS2 = 0.7 + + CONFIDENCE_BUFFER_LEN = 5 + RYG_GREEN = 0.01165 + RYG_YELLOW = 0.06157 + + POLY_PATH_DEGREE = 4 + + +class Plan: + POSITION = slice(0, 3) + VELOCITY = slice(3, 6) + ACCELERATION = slice(6, 9) + T_FROM_CURRENT_EULER = slice(9, 12) + ORIENTATION_RATE = slice(12, 15) + + +class Meta: + ENGAGED = slice(0, 1) + GAS_DISENGAGE = slice(1, 31, 6) + BRAKE_DISENGAGE = slice(2, 31, 6) + STEER_OVERRIDE = slice(3, 31, 6) + HARD_BRAKE_3 = slice(4, 31, 6) + HARD_BRAKE_4 = slice(5, 31, 6) + HARD_BRAKE_5 = slice(6, 31, 6) + GAS_PRESS = slice(31, 55, 4) + BRAKE_PRESS = slice(32, 55, 4) + LEFT_BLINKER = slice(33, 55, 4) + RIGHT_BLINKER = slice(34, 55, 4) diff --git a/iqpilot/selfdrive/iqmodeld/native/__init__.py b/iqpilot/selfdrive/iqmodeld/native/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/native/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.so b/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.so new file mode 100755 index 000000000..67006356d Binary files /dev/null and b/iqpilot/selfdrive/iqmodeld/native/iqmodel_pyx.so differ diff --git a/iqpilot/selfdrive/iqmodeld/parser.py b/iqpilot/selfdrive/iqmodeld/parser.py new file mode 100644 index 000000000..1b382b57f --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/parser.py @@ -0,0 +1,219 @@ +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.config import ModelConstants + + +def safe_exp(values, out=None): + return np.exp(np.clip(values, -np.inf, 11), out=out) + + +def sigmoid(values): + return 1.0 / (1.0 + safe_exp(-values)) + + +def _softmax_last(values, axis=-1): + values -= np.max(values, axis=axis, keepdims=True) + if values.dtype in (np.float32, np.float64): + safe_exp(values, out=values) + else: + values = safe_exp(values) + values /= np.sum(values, axis=axis, keepdims=True) + return values + + +@dataclass(frozen=True) +class _MixtureRecipe: + input_heads: int + output_heads: int + final_shape: tuple[int, ...] + + +class _TensorKitchen: + def __init__(self, ignore_missing: bool = False): + self.ignore_missing = ignore_missing + + def _grab(self, outputs: dict[str, np.ndarray], tensor_name: str) -> np.ndarray | None: + if tensor_name not in outputs: + if not self.ignore_missing: + raise ValueError(f"Missing output {tensor_name}") + return + return outputs[tensor_name] + + def categorical(self, outputs: dict[str, np.ndarray], tensor_name: str, shape=None) -> None: + raw = self._grab(outputs, tensor_name) + if raw is None: + return + if shape is not None: + raw = raw.reshape((raw.shape[0],) + shape) + outputs[tensor_name] = _softmax_last(raw, axis=-1) + + def binary(self, outputs: dict[str, np.ndarray], tensor_name: str) -> None: + raw = self._grab(outputs, tensor_name) + if raw is None: + return + outputs[tensor_name] = sigmoid(raw) + + def mixture(self, outputs: dict[str, np.ndarray], tensor_name: str, recipe: _MixtureRecipe) -> None: + raw = self._grab(outputs, tensor_name) + if raw is None: + return + + reshaped = raw.reshape((raw.shape[0], max(recipe.input_heads, 1), -1)) + value_count = (reshaped.shape[2] - recipe.output_heads) // 2 + means = reshaped[:, :, :value_count] + stds = safe_exp(reshaped[:, :, value_count:2 * value_count]) + + if recipe.input_heads > 1: + weights = np.zeros((reshaped.shape[0], recipe.input_heads, recipe.output_heads), dtype=reshaped.dtype) + for output_idx in range(recipe.output_heads): + weights[:, :, output_idx - recipe.output_heads] = _softmax_last( + reshaped[:, :, output_idx - recipe.output_heads], axis=-1 + ) + + if recipe.output_heads == 1: + for batch_idx in range(weights.shape[0]): + order = np.argsort(weights[batch_idx][:, 0])[::-1] + weights[batch_idx] = weights[batch_idx][order] + means[batch_idx] = means[batch_idx][order] + stds[batch_idx] = stds[batch_idx][order] + + hypothesis_shape = (reshaped.shape[0], recipe.input_heads, *recipe.final_shape) + outputs[f"{tensor_name}_weights"] = weights + outputs[f"{tensor_name}_hypotheses"] = means.reshape(hypothesis_shape) + outputs[f"{tensor_name}_stds_hypotheses"] = stds.reshape(hypothesis_shape) + + picked_means = np.zeros((reshaped.shape[0], recipe.output_heads, value_count), dtype=reshaped.dtype) + picked_stds = np.zeros((reshaped.shape[0], recipe.output_heads, value_count), dtype=reshaped.dtype) + for batch_idx in range(weights.shape[0]): + for output_idx in range(recipe.output_heads): + order = np.argsort(weights[batch_idx, :, output_idx])[::-1] + picked_means[batch_idx, output_idx] = means[batch_idx, order[0]] + picked_stds[batch_idx, output_idx] = stds[batch_idx, order[0]] + else: + picked_means = means + picked_stds = stds + + final_shape = ((reshaped.shape[0], recipe.output_heads, *recipe.final_shape) + if recipe.output_heads > 1 else (reshaped.shape[0], *recipe.final_shape)) + outputs[tensor_name] = picked_means.reshape(final_shape) + outputs[f"{tensor_name}_stds"] = picked_stds.reshape(final_shape) + + +class ArchiveParser(_TensorKitchen): + def __init__(self, ignore_missing: bool = False): + super().__init__(ignore_missing=ignore_missing) + self._c = ModelConstants + + def _recipes(self) -> list[tuple[str, _MixtureRecipe]]: + c = self._c + return [ + ("plan", _MixtureRecipe(c.PLAN_MHP_N, c.PLAN_MHP_SELECTION, (c.IDX_N, c.PLAN_WIDTH))), + ("lane_lines", _MixtureRecipe(0, 0, (c.NUM_LANE_LINES, c.IDX_N, c.LANE_LINES_WIDTH))), + ("road_edges", _MixtureRecipe(0, 0, (c.NUM_ROAD_EDGES, c.IDX_N, c.LANE_LINES_WIDTH))), + ("pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))), + ("road_transform", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))), + ("wide_from_device_euler", _MixtureRecipe(0, 0, (c.WIDE_FROM_DEVICE_WIDTH,))), + ("lead", _MixtureRecipe(c.LEAD_MHP_N, c.LEAD_MHP_SELECTION, (c.LEAD_TRAJ_LEN, c.LEAD_WIDTH))), + ] + + def parse_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + c = self._c + for tensor_name, recipe in self._recipes(): + self.mixture(outputs, tensor_name, recipe) + if "sim_pose" in outputs: + self.mixture(outputs, "sim_pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))) + if "lat_planner_solution" in outputs: + self.mixture(outputs, "lat_planner_solution", _MixtureRecipe(0, 0, (c.IDX_N, c.LAT_PLANNER_SOLUTION_WIDTH))) + if "desired_curvature" in outputs: + self.mixture(outputs, "desired_curvature", _MixtureRecipe(0, 0, (c.DESIRED_CURV_WIDTH,))) + for name in ("lead_prob", "lane_lines_prob", "meta"): + self.binary(outputs, name) + self.categorical(outputs, "desire_state", shape=(c.DESIRE_PRED_WIDTH,)) + self.categorical(outputs, "desire_pred", shape=(c.DESIRE_PRED_LEN, c.DESIRE_PRED_WIDTH)) + return outputs + + +class PhaseParser(_TensorKitchen): + def __init__(self, ignore_missing: bool = False): + super().__init__(ignore_missing=ignore_missing) + self._c = SplitModelConstants + + def _has_mixture_heads(self, outputs: dict[str, np.ndarray], tensor_name: str, flat_width: int) -> bool: + raw = self._grab(outputs, tensor_name) + if raw is None: + return False + return raw.shape[1] != 2 * flat_width + + def _decode_dynamic_family(self, outputs: dict[str, np.ndarray]) -> None: + c = self._c + if "lead" in outputs: + uses_heads = self._has_mixture_heads(outputs, "lead", c.LEAD_MHP_SELECTION * c.LEAD_TRAJ_LEN * c.LEAD_WIDTH) + self.mixture(outputs, "lead", _MixtureRecipe( + c.LEAD_MHP_N if uses_heads else 0, + c.LEAD_MHP_SELECTION if uses_heads else 0, + (c.LEAD_TRAJ_LEN, c.LEAD_WIDTH) if uses_heads else (c.LEAD_MHP_SELECTION, c.LEAD_TRAJ_LEN, c.LEAD_WIDTH), + )) + + if "plan" in outputs: + uses_heads = self._has_mixture_heads(outputs, "plan", c.IDX_N * c.PLAN_WIDTH) + self.mixture(outputs, "plan", _MixtureRecipe( + c.PLAN_MHP_N if uses_heads else 0, + c.PLAN_MHP_SELECTION if uses_heads else 0, + (c.IDX_N, c.PLAN_WIDTH), + )) + + if "planplus" in outputs: + self.mixture(outputs, "planplus", _MixtureRecipe(0, 0, (c.IDX_N, c.PLAN_WIDTH))) + + def _decode_policy_family(self, outputs: dict[str, np.ndarray]) -> None: + c = self._c + if "action" in outputs: + self.mixture(outputs, "action", _MixtureRecipe(0, 0, (c.ACTION_WIDTH,))) + if "desired_curvature" in outputs: + self.mixture(outputs, "desired_curvature", _MixtureRecipe(0, 0, (c.DESIRED_CURV_WIDTH,))) + if "desire_pred" in outputs: + self.categorical(outputs, "desire_pred", shape=(c.DESIRE_PRED_LEN, c.DESIRE_PRED_WIDTH)) + if "desire_state" in outputs: + self.categorical(outputs, "desire_state", shape=(c.DESIRE_PRED_WIDTH,)) + if "lane_lines" in outputs: + self.mixture(outputs, "lane_lines", _MixtureRecipe(0, 0, (c.NUM_LANE_LINES, c.IDX_N, c.LANE_LINES_WIDTH))) + if "lane_lines_prob" in outputs: + self.binary(outputs, "lane_lines_prob") + if "lead_prob" in outputs: + self.binary(outputs, "lead_prob") + if "lat_planner_solution" in outputs: + self.mixture(outputs, "lat_planner_solution", _MixtureRecipe(0, 0, (c.IDX_N, c.LAT_PLANNER_SOLUTION_WIDTH))) + if "meta" in outputs: + self.binary(outputs, "meta") + if "road_edges" in outputs: + self.mixture(outputs, "road_edges", _MixtureRecipe(0, 0, (c.NUM_ROAD_EDGES, c.IDX_N, c.LANE_LINES_WIDTH))) + if "sim_pose" in outputs: + self.mixture(outputs, "sim_pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))) + + def parse_vision_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + c = self._c + self.mixture(outputs, "pose", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))) + self.mixture(outputs, "wide_from_device_euler", _MixtureRecipe(0, 0, (c.WIDE_FROM_DEVICE_WIDTH,))) + self.mixture(outputs, "road_transform", _MixtureRecipe(0, 0, (c.POSE_WIDTH,))) + self._decode_dynamic_family(outputs) + self._decode_policy_family(outputs) + return outputs + + def parse_policy_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + self._decode_dynamic_family(outputs) + self._decode_policy_family(outputs) + return outputs + + def parse_outputs(self, outputs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: + return self.parse_policy_outputs(self.parse_vision_outputs(outputs)) + + +__all__ = [ + "ArchiveParser", + "PhaseParser", +] diff --git a/iqpilot/selfdrive/iqmodeld/runtime/ort.py b/iqpilot/selfdrive/iqmodeld/runtime/ort.py new file mode 100644 index 000000000..fd2c85529 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/runtime/ort.py @@ -0,0 +1,62 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import itertools + +import numpy as np +import onnx +import onnxruntime as ort + + +ORT_TYPES_TO_NP_TYPES = { + "tensor(float16)": np.float16, + "tensor(float)": np.float32, + "tensor(uint8)": np.uint8, +} + + +def _promote_raw_half_blob(attribute): + float32_values = np.frombuffer(attribute.raw_data, dtype=np.float16) + attribute.data_type = 1 + attribute.raw_data = float32_values.astype(np.float32).tobytes() + + +def _rewrite_tensor_io_types(model): + for value_info in itertools.chain(model.graph.input, model.graph.output): + if value_info.type.tensor_type.elem_type == 10: + value_info.type.tensor_type.elem_type = 1 + + +def _rewrite_cast_nodes(model): + for node in model.graph.node: + if node.op_type == "Cast" and node.attribute[0].i == 10: + node.attribute[0].i = 1 + for attribute in node.attribute: + if hasattr(attribute, "t") and attribute.t.data_type == 10: + _promote_raw_half_blob(attribute.t) + + +def attributeproto_fp16_to_fp32(attr): + _promote_raw_half_blob(attr) + + +def convert_fp16_to_fp32(model): + for initializer in model.graph.initializer: + if initializer.data_type == 10: + _promote_raw_half_blob(initializer) + _rewrite_tensor_io_types(model) + _rewrite_cast_nodes(model) + return model.SerializeToString() + + +def _cpu_session_options(): + options = ort.SessionOptions() + options.intra_op_num_threads = 4 + options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL + options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL + return options + + +def make_onnx_cpu_runner(model_path): + model_blob = convert_fp16_to_fp32(onnx.load(model_path)) + return ort.InferenceSession(model_blob, _cpu_session_options(), providers=["CPUExecutionProvider"]) diff --git a/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py b/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py new file mode 100644 index 000000000..75c7e350e --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/runtime/tinygrad.py @@ -0,0 +1,23 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from tinygrad.tensor import Tensor +from tinygrad.helpers import to_mv + +_PTR_STRIDE = 8 +_RAW_GPU_PTR_SLOT = 20 +_RAW_GPU_PTR_VIEW_BYTES = 0x100 + + +def _descriptor_pointer(opencl_address: int) -> int: + return to_mv(opencl_address, _PTR_STRIDE).cast("Q")[0] + + +def _raw_gpu_pointer(descriptor_pointer: int) -> int: + return to_mv(descriptor_pointer, _RAW_GPU_PTR_VIEW_BYTES).cast("Q")[_RAW_GPU_PTR_SLOT] + + +def qcom_tensor_from_opencl_address(opencl_address, shape, dtype): + descriptor_pointer = _descriptor_pointer(opencl_address) + device_pointer = _raw_gpu_pointer(descriptor_pointer) + return Tensor.from_blob(device_pointer, shape, dtype=dtype, device="QCOM") diff --git a/iqpilot/selfdrive/iqmodeld/temporal_state.py b/iqpilot/selfdrive/iqmodeld/temporal_state.py new file mode 100644 index 000000000..70cac9f64 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/temporal_state.py @@ -0,0 +1,131 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import math + +import numpy as np + +DEFAULT_FRAME_SKIP = 4 + +MODEL_INPUT_SPEC: dict[str, tuple[tuple[int, ...], str]] = { + "img": ((1, 12, 128, 256), "uint8"), + "big_img": ((1, 12, 128, 256), "uint8"), + "desire_pulse": ((1, 25, 8), "float32"), + "traffic_convention": ((1, 2), "float32"), + "features_buffer": ((1, 24, 512), "float32"), + "action_t": ((1, 2), "float32"), +} + + +def spec_from_meta(meta: dict) -> dict[str, tuple[tuple[int, ...], str]] | None: + shapes = meta.get("input_shapes") + if not shapes: + return None + return {name: (tuple(shape), "uint8" if name in ("img", "big_img") else "float32") + for name, shape in shapes.items()} + + +class TemporalInputState: + def __init__(self, frame_skip: int, spec: dict[str, tuple[tuple[int, ...], str]] = MODEL_INPUT_SPEC): + self.frame_skip = frame_skip + img = spec["img"][0] + fb = spec["features_buffer"][0] + dp = spec["desire_pulse"][0] + + self.n_frames = img[1] // 6 + img_q_shape = (frame_skip * (self.n_frames - 1) + 1, 6, img[2], img[3]) + self._img_shape = img + self._fb_shape = fb + self._dp_shape = dp + feat_dim = math.prod(fb[2:]) + + self.img_q = np.zeros(img_q_shape, dtype=np.uint8) + self.big_img_q = np.zeros(img_q_shape, dtype=np.uint8) + self.feat_q = np.zeros((frame_skip * fb[1], fb[0], feat_dim), dtype=np.float32) + self.desire_q = np.zeros((frame_skip * dp[1], dp[0], dp[2]), dtype=np.float32) + self.prev_desire = np.zeros(dp[2], dtype=np.float32) + self.prev_feat = np.zeros((fb[0], feat_dim), dtype=np.float32) + + @staticmethod + def _shift_append(q: np.ndarray, new_val: np.ndarray) -> None: + q[:-1] = q[1:] + q[-1] = new_val + + def push_and_materialize(self, warped: np.ndarray, desire_pulse: np.ndarray, + traffic_convention: np.ndarray, action_t: np.ndarray, + ) -> dict[str, np.ndarray]: + fs = self.frame_skip + + cur = desire_pulse.astype(np.float32).copy() + cur[0] = 0 + pulse = np.where(cur - self.prev_desire > 0.99, cur, 0).astype(np.float32) + self.prev_desire[:] = cur + + self._shift_append(self.img_q, warped[0]) + self._shift_append(self.big_img_q, warped[1]) + self._shift_append(self.desire_q, pulse.reshape(self._dp_shape[0], self._dp_shape[2])) + self._shift_append(self.feat_q, self.prev_feat) + + dp = self._dp_shape + return { + "img": np.ascontiguousarray(self.img_q[::fs]).reshape(self._img_shape), + "big_img": np.ascontiguousarray(self.big_img_q[::fs]).reshape(self._img_shape), + "features_buffer": np.ascontiguousarray(self.feat_q[::fs]).reshape(self._fb_shape), + "desire_pulse": self.desire_q.reshape(dp[1], fs, dp[0], dp[2]).max(axis=1).reshape(dp), + "traffic_convention": traffic_convention.astype(np.float32).reshape(1, -1), + "action_t": action_t.astype(np.float32).reshape(1, -1), + } + + def note_hidden_state(self, model_output: np.ndarray, hidden_slice: slice) -> None: + self.prev_feat[:] = model_output[hidden_slice].reshape(self.prev_feat.shape) + + +class SplitTemporalState: + + def __init__(self, frame_skip: int, img_shape: tuple[int, ...], + feature_shape: tuple[int, ...], desire_shape: tuple[int, ...]): + self.frame_skip = frame_skip + self._img_shape = tuple(img_shape) + self._fb_shape = tuple(feature_shape) + self._dp_shape = tuple(desire_shape) + + n_frames = img_shape[1] // 6 + img_q_shape = (frame_skip * (n_frames - 1) + 1, 6, img_shape[2], img_shape[3]) + self.img_q = np.zeros(img_q_shape, dtype=np.uint8) + self.big_img_q = np.zeros(img_q_shape, dtype=np.uint8) + self.feat_q = np.zeros((frame_skip * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), + dtype=np.float32) + self.desire_q = np.zeros((frame_skip * desire_shape[1], desire_shape[0], desire_shape[2]), dtype=np.float32) + self.prev_desire = np.zeros(desire_shape[2], dtype=np.float32) + + def materialize_vision(self, warped: np.ndarray, desire: np.ndarray) -> dict[str, np.ndarray]: + fs = self.frame_skip + cur = desire.astype(np.float32).copy() + cur[0] = 0 + pulse = np.where(cur - self.prev_desire > 0.99, cur, 0).astype(np.float32) + self.prev_desire[:] = cur + + TemporalInputState._shift_append(self.img_q, warped[0]) + TemporalInputState._shift_append(self.big_img_q, warped[1]) + TemporalInputState._shift_append(self.desire_q, pulse.reshape(self._dp_shape[0], self._dp_shape[2])) + return { + "img": np.ascontiguousarray(self.img_q[::fs]).reshape(self._img_shape), + "big_img": np.ascontiguousarray(self.big_img_q[::fs]).reshape(self._img_shape), + } + + def materialize_policy(self, vision_feature: np.ndarray, traffic_convention: np.ndarray, + action_t: np.ndarray | None = None) -> dict[str, np.ndarray]: + fs = self.frame_skip + TemporalInputState._shift_append(self.feat_q, vision_feature.reshape(self._fb_shape[0], self._fb_shape[2])) + dp = self._dp_shape + out = { + "features_buffer": np.ascontiguousarray(self.feat_q[::fs]).reshape(self._fb_shape), + "desire_pulse": self.desire_q.reshape(dp[1], fs, dp[0], dp[2]).max(axis=1).reshape(dp), + "traffic_convention": traffic_convention.astype(np.float32).reshape(1, -1), + } + if action_t is not None: + out["action_t"] = action_t.astype(np.float32).reshape(1, -1) + return out diff --git a/iqpilot/selfdrive/iqmodeld/tests/__init__.py b/iqpilot/selfdrive/iqmodeld/tests/__init__.py new file mode 100644 index 000000000..9129d3486 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" \ No newline at end of file diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_action_dispatch.py b/iqpilot/selfdrive/iqmodeld/tests/test_action_dispatch.py new file mode 100644 index 000000000..047108791 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_action_dispatch.py @@ -0,0 +1,81 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +from types import SimpleNamespace + +import numpy as np +import pytest + +from iqpilot.cereal import log + +from iqpilot.selfdrive.iqmodeld.config import Plan +from iqpilot.selfdrive.iqmodeld.daemon import NeuralEngineState, _merged_plan +import iqpilot.selfdrive.iqmodeld.daemon as iqmodeld_daemon +from iqpilot.selfdrive.controls.lib.drive_helpers import smooth_value + + +def _fake_state(**overrides): + base = dict( + PLANPLUS_CONTROL=1.0, + LONG_SMOOTH_SECONDS=0.3, + LAT_SMOOTH_SECONDS=0.1, + MIN_LAT_CONTROL_SPEED=0.3, + mlsim=True, + generation=12, + constants=SimpleNamespace(T_IDXS=np.arange(100), DESIRE_LEN=8), + ) + base.update(overrides) + return SimpleNamespace(**base) + + +@pytest.mark.parametrize( + ("control", "vego", "factor"), + [ + (0.55, 20.0, 1.0), + (1.0, 25.0, 0.75), + (1.5, 25.1, 0.75), + (2.0, 20.0, 1.0), + ], +) +def test_planplus_merge_matches_speed_gate(control: float, vego: float, factor: float): + state = _fake_state(PLANPLUS_CONTROL=control) + base = np.random.rand(1, 100, 15).astype(np.float32) + extra = np.random.rand(1, 100, 15).astype(np.float32) + merged = _merged_plan(state, {"plan": base, "planplus": extra}, vego) + expected = base[0] + (control * factor) * extra[0] + np.testing.assert_allclose(merged, expected, rtol=1e-6, atol=1e-6) + + +def test_action_dispatch_uses_merged_plan_for_longitudinal_choice(monkeypatch: pytest.MonkeyPatch): + state = _fake_state() + previous = log.ModelDataV2.Action() + recorded_velocity: list[np.ndarray] = [] + + def fake_accel(plan_vel, plan_accel, t_idxs, action_t=0.0): + recorded_velocity.append(plan_vel.copy()) + return 0.0, False + + monkeypatch.setattr(iqmodeld_daemon, "get_accel_from_plan", fake_accel) + monkeypatch.setattr(iqmodeld_daemon, "pick_curvature", lambda *args: 0.0) + + plan = np.random.rand(1, 100, 15).astype(np.float32) + planplus = np.random.rand(1, 100, 15).astype(np.float32) + outputs = {"plan": plan.copy(), "planplus": planplus.copy()} + + NeuralEngineState.get_action_from_model(state, outputs, previous, 0.0, 0.0, 25.0) + expected = plan[0, :, Plan.VELOCITY][:, 0] + 0.75 * planplus[0, :, Plan.VELOCITY][:, 0] + np.testing.assert_allclose(recorded_velocity[0], expected, rtol=1e-5, atol=1e-6) + + +def test_action_dispatch_honors_direct_action_outputs(): + state = _fake_state(mlsim=False, generation=9) + previous = log.ModelDataV2.Action(desiredCurvature=0.0, desiredAcceleration=0.0, shouldStop=False) + outputs = {"action": np.array([[4.0, -0.25]], dtype=np.float32)} + action = NeuralEngineState.get_action_from_model(state, outputs, previous, 0.0, 0.0, 10.0) + expected_accel = smooth_value(-0.25, previous.desiredAcceleration, state.LONG_SMOOTH_SECONDS) + expected_curvature = smooth_value(0.04, previous.desiredCurvature, state.LAT_SMOOTH_SECONDS) + assert action.desiredAcceleration == pytest.approx(expected_accel) + assert action.desiredCurvature == pytest.approx(expected_curvature) + assert action.shouldStop is False diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_combined_split_runner.py b/iqpilot/selfdrive/iqmodeld/tests/test_combined_split_runner.py new file mode 100644 index 000000000..a45af3328 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_combined_split_runner.py @@ -0,0 +1,188 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.models.combined_artifact import resolve_combined_split_artifact +import iqpilot.selfdrive.iqmodeld.models.runners.model_runner as runner_helpers +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad import tinygrad_runner as tinygrad_runner_mod +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.combined_split_runner import TinygradCombinedSplitRunner +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad import combined_split_runner as combined_runner_mod +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType +from iqpilot.selfdrive.iqmodeld.parser import PhaseParser +from iqpilot.selfdrive.iqmodeld.tests.test_iqmodeld_contracts import _phase_sample + + +@dataclass +class _TypeWrap: + raw: int + + +@dataclass +class _Artifact: + fileName: str + + +class _Model: + def __init__(self, model_type: int, artifact_name: str): + self.type = _TypeWrap(model_type) + self.artifact = _Artifact(artifact_name) + + +class _Override: + def __init__(self, key: str, value: str): + self.key = key + self.value = value + + +class _Bundle: + def __init__(self, models: list[_Model], overrides: list[_Override] | None = None, generation: int = 10): + self.models = models + self.overrides = overrides or [] + self.generation = generation + + +class _FakeTensor: + def __init__(self, values): + self._values = np.asarray(values, dtype=np.float32) + + def numpy(self): + return self._values + + +class _FakeVisionBuf: + width = 1928 + height = 1208 + data = memoryview(b"\x00" * 64) + + +def _slice_pack(outputs: dict[str, np.ndarray]) -> tuple[np.ndarray, dict[str, slice]]: + chunks = [] + slices: dict[str, slice] = {} + cursor = 0 + for name, value in outputs.items(): + flat = value.reshape(-1) + slices[name] = slice(cursor, cursor + flat.size) + chunks.append(flat) + cursor += flat.size + return np.concatenate(chunks).astype(np.float32), slices + + +def test_resolve_combined_split_artifact_prefers_override(tmp_path: Path, monkeypatch): + bundle = _Bundle( + [_Model(ModelType.vision, "driving_vision_demo_tinygrad.pkl"), _Model(ModelType.policy, "driving_policy_demo_tinygrad.pkl")], + overrides=[_Override("combinedRuntimeArtifact", "driving_combined_demo.pkl")], + ) + expected = tmp_path / "driving_combined_demo.pkl" + expected.write_bytes(b"iq") + + monkeypatch.setattr("iqpilot.selfdrive.iqmodeld.models.combined_artifact._MODEL_ROOT", tmp_path) + + assert resolve_combined_split_artifact(bundle) == expected + + +def test_get_model_runner_prefers_combined_split_artifact(monkeypatch): + bundle = _Bundle([ + _Model(ModelType.vision, "driving_vision_demo_tinygrad.pkl"), + _Model(ModelType.policy, "driving_policy_demo_tinygrad.pkl"), + ], generation=11) + + marker = object() + monkeypatch.setattr(runner_helpers, "_fetch_bundle", lambda: bundle) + monkeypatch.setattr(runner_helpers, "has_combined_split_artifact", lambda _: True) + monkeypatch.setattr(combined_runner_mod, "TinygradCombinedSplitRunner", lambda: marker) + + assert runner_helpers.get_model_runner() is marker + + +def test_get_model_runner_keeps_split_bundle_on_existing_runner_without_combined_artifact(monkeypatch): + bundle = _Bundle([ + _Model(ModelType.vision, "driving_vision_demo_tinygrad.pkl"), + _Model(ModelType.policy, "driving_policy_demo_tinygrad.pkl"), + ], generation=12) + + marker = object() + monkeypatch.setattr(runner_helpers, "_fetch_bundle", lambda: bundle) + monkeypatch.setattr(runner_helpers, "has_combined_split_artifact", lambda _: False) + monkeypatch.setattr(tinygrad_runner_mod, "TinygradSplitRunner", lambda: marker) + + assert runner_helpers.get_model_runner() is marker + + +def test_combined_split_runner_parses_single_policy_payload(monkeypatch): + vision_raw = _phase_sample(np.random.default_rng(11)) + policy_raw = _phase_sample(np.random.default_rng(17)) + vision_blob, vision_slices = _slice_pack(vision_raw) + policy_blob, policy_slices = _slice_pack(policy_raw) + + runner = TinygradCombinedSplitRunner.__new__(TinygradCombinedSplitRunner) + runner._vision_meta = { + "input_shapes": {"img": (1, 12, 128, 256), "big_img": (1, 12, 128, 256)}, + "output_slices": vision_slices, + } + runner._meta_by_role = { + "vision": runner._vision_meta, + "policy": { + "input_shapes": { + "features_buffer": (1, 25, 512), + "desire_pulse": (1, 25, 8), + "traffic_convention": (1, 2), + "action_t": (1, 2), + }, + "output_slices": policy_slices, + }, + } + runner._policy_roles = ["policy"] + runner._desired_key = "desire_pulse" + runner._road_key = "img" + runner._wide_key = "big_img" + runner._extra_policy_keys = [] + runner._queue_tensors = { + "img_q": object(), + "big_img_q": object(), + "feat_q": object(), + "desire_q": object(), + "tfm": object(), + "big_tfm": object(), + "desire": object(), + "traffic_convention": object(), + "action_t": object(), + } + runner._numpy_state = { + "tfm": np.zeros((3, 3), dtype=np.float32), + "big_tfm": np.zeros((3, 3), dtype=np.float32), + "desire": np.zeros(8, dtype=np.float32), + "traffic_convention": np.zeros((1, 2), dtype=np.float32), + "action_t": np.zeros((1, 2), dtype=np.float32), + } + runner._camera_shape = (1928, 1208) + runner._camera_programs = { + (1928, 1208): {"stage_inputs": lambda **kwargs: ("road", "wide")}, + } + runner._execute_bundle = lambda **kwargs: (_FakeTensor(vision_blob), _FakeTensor(policy_blob)) + runner._parser = PhaseParser() + runner._last_desire = np.zeros(8, dtype=np.float32) + runner._blob_cache = {} + + monkeypatch.setattr(TinygradCombinedSplitRunner, "_allocate_runtime_state", lambda self, w, h: None) + monkeypatch.setattr(TinygradCombinedSplitRunner, "_frame_blob", lambda self, name, buf: object()) + + outputs = runner.run_fused( + {"img": _FakeVisionBuf(), "big_img": _FakeVisionBuf()}, + {"img": np.eye(3, dtype=np.float32), "big_img": np.eye(3, dtype=np.float32)}, + { + "desire_pulse": np.array([1, 0, 0, 0, 0, 0, 0, 0], dtype=np.float32), + "traffic_convention": np.zeros((1, 2), dtype=np.float32), + "action_t": np.zeros((1, 2), dtype=np.float32), + }, + ) + + assert "pose" in outputs + assert "plan" in outputs + assert outputs["plan"].shape == (1, 33, 15) + assert outputs["action"].shape == (1, 2) diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_compile_supercombo_guards.py b/iqpilot/selfdrive/iqmodeld/tests/test_compile_supercombo_guards.py new file mode 100644 index 000000000..5eb3d59fd --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_compile_supercombo_guards.py @@ -0,0 +1,47 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.tools.compile_supercombo import ( + _captured_devices, + _validate_pose_outputs, +) +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.supercombo_runner import _captured_queue_depth + + +class _Captured: + def __init__(self, expected_input_info): + self.expected_input_info = expected_input_info + + +class _FakeJit: + def __init__(self, expected_input_info): + self.captured = _Captured(expected_input_info) + + +def test_captured_queue_helpers_extract_depth_and_device(): + infos = [ + ("noop", (), "uchar", "QCOM"), + ("reshape(arg=None, src=(noop, stack(arg=None, src=(const(arg=5), const(arg=6), const(arg=128), const(arg=256)))))", (), "uchar", "QCOM"), + ("reshape(arg=None, src=(noop, const(arg=3)))", (), "float", "NPY"), + ] + fake_jit = _FakeJit(infos) + + assert _captured_queue_depth(fake_jit) == 5 + assert _captured_devices(fake_jit) == {"QCOM", "NPY"} + + +def test_validate_pose_outputs_accepts_sane_odometry_payload(): + outputs = { + "pose": np.array([[1.0, 0.5, 0.25, 0.1, 0.2, 0.3]], dtype=np.float32), + "pose_stds": np.array([[0.5, 0.4, 0.3, 0.2, 0.2, 0.2]], dtype=np.float32), + "wide_from_device_euler": np.array([[0.1, 0.2, 0.3]], dtype=np.float32), + "wide_from_device_euler_stds": np.array([[0.2, 0.2, 0.2]], dtype=np.float32), + "road_transform": np.array([[0.5, 0.4, 0.3, 0.2, 0.1, 0.0]], dtype=np.float32), + "road_transform_stds": np.array([[0.3, 0.3, 0.3, 0.2, 0.2, 0.2]], dtype=np.float32), + } + + _validate_pose_outputs(outputs) diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_egpu_firmware_mirror.py b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_firmware_mirror.py new file mode 100644 index 000000000..5d51cdfe9 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_firmware_mirror.py @@ -0,0 +1,30 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import hashlib +import os + +from iqpilot.selfdrive.iqmodeld import egpu_helpers as eh + + +def test_fetch_fw_mirrors_and_serves_offline(tmp_path, monkeypatch): + from tinygrad import helpers + blob = os.urandom(4096) + sha = hashlib.sha256(blob).hexdigest() + calls = [] + + def orig(path, name, sha256): + calls.append((path, name)) + return blob + + monkeypatch.setattr(helpers, "fetch_fw", orig, raising=False) + helpers.fetch_fw._iq_patched = False + monkeypatch.setattr(eh, "FIRMWARE_MIRROR", str(tmp_path / "mirror")) + eh.patch_tinygrad_fetch_fw() + assert helpers.fetch_fw("amdgpu", "gc.bin", sha) == blob and calls == [("amdgpu", "gc.bin")] + mirrored = tmp_path / "mirror" / "amdgpu" / "gc.bin" + assert mirrored.read_bytes() == blob + assert helpers.fetch_fw("amdgpu", "gc.bin", sha) == blob and len(calls) == 1 + mirrored.write_bytes(b"corrupt") + assert helpers.fetch_fw("amdgpu", "gc.bin", sha) == blob and len(calls) == 2 + assert mirrored.read_bytes() == blob diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_egpu_host_mock.py b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_host_mock.py new file mode 100644 index 000000000..defe68d6c --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_host_mock.py @@ -0,0 +1,34 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import os +import subprocess +import sys + +import pytest + +from iqpilot.selfdrive.iqmodeld.tools.egpu_host_mock import tinygrad_tree + +PROBE = """ +import os +os.environ["JIT_BATCH_SIZE"] = "0" +from iqpilot.selfdrive.iqmodeld.tools.egpu_host_mock import activate +activate("gfx1200") +from tinygrad import Tensor +from tinygrad.device import Device +from tinygrad.engine.jit import TinyJit +dev = Device["AMD"] +assert dev.arch == "gfx1200", dev.arch +assert type(dev.iface).__name__ == "MOCKUSBIface", type(dev.iface).__name__ +run = TinyJit(lambda x: (x * 2 + 1).sum(axis=1).realize()) +for i in range(3): + run(Tensor.ones(64, 64, device="AMD") * i) +print("MOCK_OK") +""" + + +@pytest.mark.skipif(not os.path.isdir(os.path.join(tinygrad_tree(), "test", "mockgpu")), reason="tinygrad mockgpu tree not checked out") +def test_mock_dock_captures_a_jit_without_hardware(): + out = subprocess.run([sys.executable, "-c", PROBE], capture_output=True, text=True, timeout=600) + assert out.returncode == 0, out.stderr[-2000:] + assert "MOCK_OK" in out.stdout diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_egpu_oob.py b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_oob.py new file mode 100644 index 000000000..008613e57 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_oob.py @@ -0,0 +1,62 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import os +import pickle + +import numpy as np +import pytest + +os.environ["DEV"] = "CPU" + +from iqpilot.selfdrive.iqmodeld.egpu_policy import dump_oob, is_oob, load_bundle + + +def _bundle(): + from tinygrad import Tensor + w = Tensor(np.arange(4096, dtype=np.float32).reshape(64, 64), device="CPU").realize() + return {"format": 2, "weights": w, "spec": {"a": ((1, 2), "float32")}, "blob": os.urandom(100_000)} + + +def test_oob_round_trip_matches_plain_pickle(tmp_path): + b = _bundle() + oob = tmp_path / "b.oob" + with open(oob, "wb") as f: + dump_oob(b, f) + assert is_oob(str(oob)) + got = load_bundle(str(oob)) + np.testing.assert_array_equal(got["weights"].numpy(), b["weights"].numpy()) + assert got["blob"] == b["blob"] and got["spec"] == b["spec"] and got["format"] == 2 + plain = tmp_path / "b.pkl" + with open(plain, "wb") as f: + pickle.dump({"x": 1, "blob": b["blob"]}, f, protocol=pickle.HIGHEST_PROTOCOL) + assert not is_oob(str(plain)) + assert load_bundle(str(plain))["blob"] == b["blob"] + + +def test_memory_guard_raises_when_starved(monkeypatch): + from iqpilot.selfdrive.iqmodeld import iqegpumodeld as d + monkeypatch.setattr(d, "_mem_available_mb", lambda: 90) + monkeypatch.setattr(d, "MEMORY_WAIT_S", 0.0) + with pytest.raises(RuntimeError, match="insufficient memory"): + d._wait_for_memory(350) + monkeypatch.setattr(d, "_mem_available_mb", lambda: 900) + d._wait_for_memory(350) + + +def test_opcode_rewrite_equals_oob_load(tmp_path): + from tinygrad import Tensor + from iqpilot.selfdrive.iqmodeld.tools.oob_rewrite import rewrite_oob + big = Tensor(np.random.default_rng(0).standard_normal((512, 512)).astype(np.float32), device="CPU").realize() + small = Tensor(np.arange(16, dtype=np.float32), device="CPU").realize() + b = {"format": 2, "w": big, "s": small, "meta": {"k": "v"}, "raw": os.urandom(200_000)} + plain = tmp_path / "plain.pkl" + with open(plain, "wb") as f: + pickle.dump(b, f, protocol=5) + oob = tmp_path / "oob.pkl" + moved, _ = rewrite_oob(str(plain), str(oob)) + assert moved >= 2 and is_oob(str(oob)) + got = load_bundle(str(oob)) + np.testing.assert_array_equal(got["w"].numpy(), b["w"].numpy()) + np.testing.assert_array_equal(got["s"].numpy(), b["s"].numpy()) + assert got["raw"] == b["raw"] and got["meta"] == {"k": "v"} diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_egpu_policy.py b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_policy.py new file mode 100644 index 000000000..670d9e3c6 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_policy.py @@ -0,0 +1,82 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import os + +import numpy as np + +os.environ["DEV"] = "CPU" + +from iqpilot.selfdrive.iqmodeld.egpu_policy import PolicyRunner, make_run_policy, packed_layout, queue_shapes +from iqpilot.selfdrive.iqmodeld.temporal_state import TemporalInputState + +SPEC = { + "img": ((1, 12, 8, 16), "uint8"), + "big_img": ((1, 12, 8, 16), "uint8"), + "desire_pulse": ((1, 25, 8), "float32"), + "traffic_convention": ((1, 2), "float32"), + "action_t": ((1, 2), "float32"), + "features_buffer": ((1, 24, 512), "float32"), +} +FS = 4 +OUT_LEN = 2580 +HIDDEN = slice(1064, 1576) + + +def _pack(inputs): + from tinygrad.tensor import Tensor + parts = [inputs[k].cast("float32").reshape(-1) for k in ("img", "big_img", "features_buffer", "desire_pulse", "traffic_convention", "action_t")] + flat = Tensor.cat(*parts) + hidden = (flat[:512] * 0.001).reshape(1, 512) + return flat, hidden + + +def _fake_model(inputs): + from tinygrad.tensor import Tensor + flat, hidden = _pack(inputs) + n = flat.shape[0] + head = flat[:min(n, HIDDEN.start)] + out = Tensor.cat(head.pad((0, HIDDEN.start - head.shape[0])), hidden.reshape(-1), Tensor.zeros(OUT_LEN - HIDDEN.stop, device="CPU")) + return {"outputs": out.reshape(1, -1)} + + +class _Reference: + def __init__(self): + self.state = TemporalInputState(FS, SPEC) + + def run(self, warped, desire, traffic, action_t): + inputs = self.state.push_and_materialize(warped, desire, traffic, action_t) + from tinygrad.tensor import Tensor + t = {k: Tensor(np.ascontiguousarray(v), device="CPU") for k, v in inputs.items()} + out = _fake_model(t)["outputs"].numpy().reshape(-1) + self.state.note_hidden_state(out, HIDDEN) + return out + + +def test_policy_queues_match_temporal_state(): + from tinygrad.engine.jit import TinyJit + jit = TinyJit(make_run_policy(_fake_model, SPEC, FS, "CPU"), prune=True) + runner = PolicyRunner(jit, SPEC, FS, HIDDEN, "CPU") + ref = _Reference() + rng = np.random.default_rng(3) + desire = np.zeros(8, dtype=np.float32) + for i in range(14): + warped = rng.integers(0, 256, (2, 6, 8, 16), dtype=np.int64).astype(np.uint8) + if i in (2, 3, 9): + desire[:] = 0 + desire[1 + (i % 3)] = 1 + elif i == 5: + desire[:] = 0 + traffic = np.array([1.0, 0.0], dtype=np.float32) if i % 2 else np.array([0.0, 1.0], dtype=np.float32) + action_t = np.array([0.1 * i, 0.2], dtype=np.float32) + got = runner.run(warped, desire, traffic, action_t) + want = ref.run(warped, desire, traffic, action_t) + np.testing.assert_array_equal(got, want, err_msg=f"frame {i}") + + +def test_layouts(): + shapes, sizes = packed_layout(SPEC) + assert list(shapes) == ["desire", "traffic_convention", "action_t", "prev_feat"] + assert sum(sizes) == 8 + 2 + 2 + 512 + q = queue_shapes(SPEC, FS) + assert q["img_q"][0] == (5, 6, 8, 16) and q["feat_q"][0] == (96, 1, 512) and q["desire_q"][0] == (100, 1, 8) diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_egpu_stock_parity.py b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_stock_parity.py new file mode 100644 index 000000000..3481018e1 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_stock_parity.py @@ -0,0 +1,163 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import types + +import pytest + +from iqpilot.cereal import log, messaging +from iqpilot.cereal.services import SERVICE_LIST + + +class TestTelemetryContract: + def test_service_is_published_at_stock_cadence(self): + assert "egpuDockState" in SERVICE_LIST + assert SERVICE_LIST["egpuDockState"].frequency == 10. + + def test_message_carries_every_stock_field(self): + msg = messaging.new_message("egpuDockState") + state = msg.egpuDockState + for field in ("tempC", "memoryTempC", "powerDrawW", "powerLimitW", "gpuUsagePercent", + "gpuClockMhz", "fanSpeedRpm", "pcieLtssm", "supplyVoltage", "supplyCurrent"): + setattr(state, field, 1) + assert getattr(state, field) == 1 + + def test_metrics_refresh_matches_stock(self): + from iqpilot.selfdrive.iqmodeld.egpu_telemetry import METRICS_REFRESH_EVERY + assert METRICS_REFRESH_EVERY == 100 + + def test_send_without_a_gpu_publishes_an_invalid_message(self): + from iqpilot.selfdrive.iqmodeld import egpu_telemetry + sent = [] + telemetry = egpu_telemetry.EgpuDockTelemetry(types.SimpleNamespace(send=lambda n, m: sent.append((n, m))), big=True) + telemetry._device = lambda: types.SimpleNamespace(_opened_devices=set()) + telemetry.send() + assert sent and sent[0][0] == "egpuDockState" + assert sent[0][1].valid is False + + +class TestBigFrameFlag: + def test_model_message_carries_the_big_flag(self): + msg = messaging.new_message("modelV2") + msg.modelV2.big = True + assert msg.modelV2.big + + +class TestStatusParams: + def test_loading_param_exists_and_is_cleared_like_stock(self): + from pathlib import Path + root = Path(__file__).resolve().parents[3] + keys = (root / "common" / "params_keys.h").read_text() + assert '{"UsbGpuLoading"' in keys + line = next(ln for ln in keys.splitlines() if '"UsbGpuLoading"' in ln) + for flag in ("CLEAR_ON_MANAGER_START", "CLEAR_ON_OFFROAD_TRANSITION", "CLEAR_ON_IGNITION_ON"): + assert flag in line + + +class TestAlerts: + def test_both_stock_big_model_events_exist(self): + assert hasattr(log.OnroadEvent.EventName, "bigModelLoading") + assert hasattr(log.OnroadEvent.EventName, "bigModelFailed") + + def test_alerts_are_wired_with_stock_severities(self): + from iqpilot.selfdrive.selfdrived.events import EVENTS, ET + EventName = log.OnroadEvent.EventName + loading = EVENTS[EventName.bigModelLoading] + failed = EVENTS[EventName.bigModelFailed] + assert ET.NO_ENTRY in loading + assert ET.SOFT_DISABLE in failed and ET.PERMANENT in failed + + +class TestFirmwareGate: + def test_runtime_refuses_a_dock_on_other_firmware(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import usbgpu_present + from iqpilot.system.hardware.usb import EGPU_DOCK_FW_PRODUCT, EGPU_DOCK_USB_IDS + vid, pid = EGPU_DOCK_USB_IDS[0] + d = tmp_path / "1-1" + d.mkdir() + (d / "idVendor").write_text(f"{vid:04x}\n") + (d / "idProduct").write_text(f"{pid:04x}\n") + (d / "product").write_text("custom deadbeef-CLEAN\n") + assert not usbgpu_present(str(tmp_path)) + (d / "product").write_text(EGPU_DOCK_FW_PRODUCT + "\n") + assert usbgpu_present(str(tmp_path)) + + +class TestAutoFlash: + def test_hardwared_drives_the_flasher_offroad_only(self): + from iqpilot.system.hardware.hardwared import EgpuDockFlasher + f = EgpuDockFlasher() + calls = [] + f.flash = lambda: calls.append(1) + stale = [{"vendorId": 0xADD1, "productId": 0x0001, "product": "custom deadbeef-CLEAN"}] + f.update(False, stale) + assert f.attempts == 0, "must not flash onroad" + f.update(True, stale) + assert f.attempts == 1 + if f.thread is not None: + f.thread.join(timeout=5) + + def test_matching_firmware_is_never_flashed(self): + from iqpilot.system.hardware.egpu_dock.flash import bundled_version + from iqpilot.system.hardware.hardwared import EgpuDockFlasher + f = EgpuDockFlasher() + f.flash = lambda: pytest.fail("flashed a dock that already matches") + f.update(True, [{"vendorId": 0xADD1, "productId": 0x0001, "product": bundled_version()}]) + assert f.attempts == 0 + + def test_attempts_are_bounded_like_stock(self): + from iqpilot.system.hardware.hardwared import EgpuDockFlasher + assert EgpuDockFlasher.MAX_ATTEMPTS == 3 + assert EgpuDockFlasher.RETRY_INTERVAL == 20. + + +class TestDockIsItsOwnConsent: + + def _params(self, **flags): + class P: + def get_bool(self, k): + return bool(flags.get(k, False)) + def get(self, k, *a, **kw): + return None + return P() + + def _sysfs_with_dock(self, tmp_path, product=None): + from iqpilot.system.hardware.usb import EGPU_DOCK_FW_PRODUCT, EGPU_DOCK_USB_IDS + vid, pid = EGPU_DOCK_USB_IDS[0] + d = tmp_path / "1-1" + d.mkdir() + (d / "idVendor").write_text(f"{vid:04x}\n") + (d / "idProduct").write_text(f"{pid:04x}\n") + (d / "product").write_text((product or EGPU_DOCK_FW_PRODUCT) + "\n") + return str(tmp_path) + + def test_a_plugged_in_dock_selects_itself(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + assert egpu_selected(self._params(), self._sysfs_with_dock(tmp_path)) + + def test_nothing_plugged_in_selects_nothing(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + assert not egpu_selected(self._params(), str(tmp_path)) + + def test_a_dock_on_foreign_firmware_does_not_select_itself(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + assert not egpu_selected(self._params(), self._sysfs_with_dock(tmp_path, "custom deadbeef-CLEAN")) + + def test_the_user_can_force_it_off(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + root = self._sysfs_with_dock(tmp_path) + assert not egpu_selected(self._params(IQEgpuDisabled=True), root) + + def test_the_param_can_force_it_on_without_hardware(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + assert egpu_selected(self._params(IQEgpuEnabled=True), str(tmp_path)) + + def test_present_dock_wins_even_with_emac_enabled(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected, resolve_backend, usbgpu_present + root = self._sysfs_with_dock(tmp_path) + assert resolve_backend(True, egpu_selected(self._params(), root), usbgpu_present(root)) == "egpu" + + def test_force_param_without_hardware_yields_to_emac(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected, resolve_backend, usbgpu_present + assert resolve_backend(True, egpu_selected(self._params(IQEgpuEnabled=True), str(tmp_path)), + usbgpu_present(str(tmp_path))) == "emac" diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_egpu_worker.py b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_worker.py new file mode 100644 index 000000000..96fae1a8b --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_egpu_worker.py @@ -0,0 +1,509 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import io +import json +import time +import urllib.request + +import numpy as np +import pytest + +from iqpilot.selfdrive.iqmodeld.egpu_helpers import ( + resolve_backend, resolve_download_url, usbgpu_present, +) +from iqpilot.selfdrive.iqmodeld.egpu_pipeline import ( + EgpuPipeline, EgpuPipelineError, make_big_channel_payload, +) +from iqpilot.selfdrive.iqmodeld.egpu_model import EGPU_MODELS, get_egpu_model +from iqpilot.selfdrive.iqmodeld.temporal_state import MODEL_INPUT_SPEC as INPUT_SPEC + + +class FakeParams: + def __init__(self, **flags): + self._flags = {k: bool(v) for k, v in flags.items()} + + def get_bool(self, key: str) -> bool: + return self._flags.get(key, False) + + +def _fake_usb_device(root, vid: str, pid: str, name: str = "1-1", product: str | None = None): + from iqpilot.system.hardware.usb import EGPU_DOCK_FW_PRODUCT + d = root / name + d.mkdir() + (d / "idVendor").write_text(vid + "\n") + (d / "idProduct").write_text(pid + "\n") + (d / "product").write_text((product if product is not None else EGPU_DOCK_FW_PRODUCT) + "\n") + + +class TestPresence: + def test_present(self, tmp_path): + _fake_usb_device(tmp_path, "add1", "0001") + assert usbgpu_present(str(tmp_path)) + + def test_foreign_firmware_absent(self, tmp_path): + _fake_usb_device(tmp_path, "add1", "0001", product="custom deadbeef-CLEAN") + assert not usbgpu_present(str(tmp_path)) + + def test_wrong_ids_absent(self, tmp_path): + _fake_usb_device(tmp_path, "05ac", "12a8") + assert not usbgpu_present(str(tmp_path)) + + def test_empty_bus_absent(self, tmp_path): + assert not usbgpu_present(str(tmp_path)) + + def test_unreadable_entries_skipped(self, tmp_path): + (tmp_path / "usb1").mkdir() + _fake_usb_device(tmp_path, "add1", "0001", name="1-2") + assert usbgpu_present(str(tmp_path)) + + +class TestBackendResolution: + def test_none(self): + assert resolve_backend(False, False) is None + + def test_emac_only(self): + assert resolve_backend(True, False) == "emac" + + def test_egpu_only(self): + assert resolve_backend(False, True) == "egpu" + + def test_force_param_yields_to_emac_without_hardware(self): + assert resolve_backend(True, True) == "emac" + + def test_present_dock_wins_over_emac(self): + assert resolve_backend(True, True, True) == "egpu" + + +class TestManagerGating: + @pytest.fixture + def pc(self): + return pytest.importorskip("iqpilot.system.manager.process_config") + + def test_egpu_needs_presence(self, pc, monkeypatch): + monkeypatch.setattr(pc, "usbgpu_present", lambda: True) + assert pc.egpu_enabled(True, FakeParams(IQEgpuEnabled=True), None) + assert pc.egpu_enabled(True, FakeParams(), None) + monkeypatch.setattr(pc, "usbgpu_present", lambda: False) + assert not pc.egpu_enabled(True, FakeParams(IQEgpuEnabled=True), None) + assert not pc.egpu_enabled(True, FakeParams(), None) + + def test_present_dock_wins_over_left_on_emac(self, pc, monkeypatch): + monkeypatch.setattr(pc, "usbgpu_present", lambda: True) + both = FakeParams(IQEmacEnabled=True, IQEgpuEnabled=True) + assert not pc.emac_enabled(True, both, None) + assert pc.egpu_enabled(True, both, None) + + def test_emac_runs_when_no_dock(self, pc, monkeypatch): + monkeypatch.setattr(pc, "usbgpu_present", lambda: False) + assert pc.emac_enabled(True, FakeParams(IQEmacEnabled=True), None) + + def test_disabled_dock_yields_to_emac(self, pc, monkeypatch): + monkeypatch.setattr(pc, "usbgpu_present", lambda: True) + both = FakeParams(IQEmacEnabled=True, IQEgpuDisabled=True) + assert pc.emac_enabled(True, both, None) + assert not pc.egpu_enabled(True, both, None) + + def test_disabled_dock_runs_no_backend_when_no_emac(self, pc, monkeypatch): + monkeypatch.setattr(pc, "usbgpu_present", lambda: True) + off = FakeParams(IQEgpuDisabled=True) + assert not pc.egpu_enabled(True, off, None) + assert not pc.emac_enabled(True, off, None) + + def test_selector_runs_for_either_backend(self, pc): + assert pc.big_model_enabled(True, FakeParams(IQEmacEnabled=True), None) + assert pc.big_model_enabled(True, FakeParams(IQEgpuEnabled=True), None) + assert not pc.big_model_enabled(True, FakeParams(), None) + + def test_iqegpumodeld_registered(self, pc): + assert "iqegpumodeld" in pc.managed_processes + assert "maciqmodeld" in pc.managed_processes + + +class TestDownloadResolve: + def test_direct_url_passthrough(self): + assert resolve_download_url("https://x/y.onnx", "0" * 64, 5) == "https://x/y.onnx" + + def test_commalfs_batch(self, monkeypatch): + seen = {} + + def fake_urlopen(req, timeout=0): + seen["url"] = req.full_url + seen["body"] = json.loads(req.data) + return io.BytesIO(json.dumps( + {"objects": [{"actions": {"download": {"href": "https://signed/url"}}}]}).encode()) + + monkeypatch.setattr(urllib.request, "urlopen", fake_urlopen) + sha = "a5" * 32 + url = resolve_download_url(f"commalfs:{sha}", sha, 1234) + assert url == "https://signed/url" + assert seen["body"]["objects"] == [{"oid": sha, "size": 1234}] + assert seen["url"].endswith("/info/lfs/objects/batch") + + +def _zero_infer(output_len: int, fill=None): + calls = [] + + def infer(inputs): + for name, (shape, dtype) in INPUT_SPEC.items(): + assert tuple(inputs[name].shape) == shape, name + assert inputs[name].dtype == np.dtype(dtype), name + calls.append({k: v.copy() for k, v in inputs.items()}) + out = np.zeros(output_len, dtype=np.float32) + if fill is not None: + out[:] = fill + return out + + infer.calls = calls + return infer + + +def _frame_inputs(seed=0): + rng = np.random.default_rng(seed) + warped = rng.integers(0, 256, (2, 6, 128, 256)).astype(np.uint8) + desire = np.zeros(8, dtype=np.float32) + traffic = np.array([1.0, 0.0], dtype=np.float32) + action_t = np.array([0.25, 0.55], dtype=np.float32) + return warped, desire, traffic, action_t + + +class TestEgpuPipeline: + def setup_method(self): + self.meta = get_egpu_model() + + def test_split_model_rejected(self): + split_meta = {**get_egpu_model(), "key": "some_split", "split": True} + with pytest.raises(EgpuPipelineError, match="split"): + EgpuPipeline(split_meta, _zero_infer(split_meta["output_len"])) + + def test_registry_is_fused_only(self): + assert not any(m.get("split") for m in EGPU_MODELS.values()) + + def test_run_shapes_and_output(self): + infer = _zero_infer(self.meta["output_len"]) + pipe = EgpuPipeline(self.meta, infer) + out = pipe.run(*_frame_inputs()) + assert out.shape == (self.meta["output_len"],) + assert len(infer.calls) == 1 + + def test_hidden_state_feeds_next_features_buffer(self): + output_len = self.meta["output_len"] + hidden = self.meta["output_slices"]["hidden_state"] + + def infer(inputs): + out = np.zeros(output_len, dtype=np.float32) + out[hidden] = np.arange(hidden.stop - hidden.start, dtype=np.float32) + return out + + pipe = EgpuPipeline(self.meta, infer) + pipe.run(*_frame_inputs(1)) + np.testing.assert_array_equal( + pipe.state.prev_feat.reshape(-1), np.arange(hidden.stop - hidden.start, dtype=np.float32)) + pipe.run(*_frame_inputs(2)) + np.testing.assert_array_equal( + pipe.state.feat_q[-1].reshape(-1), np.arange(hidden.stop - hidden.start, dtype=np.float32)) + + def test_desire_rising_edge_pulse(self): + infer = _zero_infer(self.meta["output_len"]) + pipe = EgpuPipeline(self.meta, infer) + warped, _, traffic, action_t = _frame_inputs() + desire_on = np.zeros(8, dtype=np.float32) + desire_on[3] = 1.0 + pipe.run(warped, desire_on, traffic, action_t) + assert infer.calls[-1]["desire_pulse"][0, -1, 3] == 1.0 + for _ in range(5): + pipe.run(warped, desire_on, traffic, action_t) + assert infer.calls[-1]["desire_pulse"][0, :, 3].sum() == 1.0 + + def test_wrong_output_len_raises(self): + pipe = EgpuPipeline(self.meta, _zero_infer(self.meta["output_len"] - 1)) + with pytest.raises(EgpuPipelineError, match="length"): + pipe.run(*_frame_inputs()) + + def test_non_finite_output_raises(self): + pipe = EgpuPipeline(self.meta, _zero_infer(self.meta["output_len"], fill=np.nan)) + with pytest.raises(EgpuPipelineError, match="finite"): + pipe.run(*_frame_inputs()) + + +class TestChannelContract: + def _real_msgs(self): + import iqpilot.cereal.messaging as messaging + msgs = {} + for svc in ("modelV2", "drivingModelData", "cameraOdometry", "iqDriveModelData"): + m = messaging.new_message(svc) + msgs[svc] = m.to_bytes() + return msgs + + def test_payload_keys_match_selector_contract(self): + payload = make_big_channel_payload(7, True, 0.031, 24.0, {"modelV2": b"x"}) + assert payload["source"] == "egpu_big" + for key in ("frame_id", "live_calib_seen", "model_execution_time", "msgs"): + assert key in payload + + def test_selector_consumes_egpu_payload(self, tmp_path): + from iqpilot.selfdrive.iqmodeld.model_channel import ModelChannel + from iqpilot.selfdrive.iqmodeld.modeld_selector import wait_for_big + + chan = ModelChannel(str(tmp_path / "big"), create=True) + payload = make_big_channel_payload(100, True, 0.03, 25.0, self._real_msgs()) + chan.write(100, payload) + + got, peek = wait_for_big(chan, 100, time.perf_counter() + 0.01) + assert peek == 100 + assert got is not None + assert got["source"] == "egpu_big" + assert got["frame_id"] == 100 + + def test_selector_patch_and_send_parses_egpu_msgs(self): + from iqpilot.selfdrive.iqmodeld.modeld_selector import _patch_and_send + + sent = {} + + class PM: + def send(self, service, msg): + sent[service] = msg + + payload = make_big_channel_payload(42, True, 0.03, 25.0, self._real_msgs()) + _patch_and_send(PM(), payload, frame_drop_perc=0.0, selector_dropped=0, target=42, source_lag=0) + assert set(sent) == {"modelV2", "drivingModelData", "cameraOdometry", "iqDriveModelData"} + assert sent["modelV2"].modelV2.frameDropPerc == 0.0 + assert sent["cameraOdometry"].valid + + def test_selector_lag_patches_frame_id(self): + from iqpilot.selfdrive.iqmodeld.modeld_selector import _patch_and_send + + sent = {} + + class PM: + def send(self, service, msg): + sent[service] = msg + + payload = make_big_channel_payload(40, True, 0.03, 25.0, self._real_msgs()) + _patch_and_send(PM(), payload, frame_drop_perc=0.0, selector_dropped=0, target=42, source_lag=2) + assert sent["modelV2"].modelV2.frameId == 42 + assert not sent["cameraOdometry"].valid + + +def _import_worker(): + try: + import iqpilot.selfdrive.iqmodeld.iqegpumodeld as w + return w + except ImportError as e: + if any(tag in str(e) for tag in ("pyx", "visionipc", "proprietary_runtime")): + pytest.skip(f"device-only import chain unavailable on this host: {e}") + raise + + +class TestWorkerModule: + def test_module_imports_off_device(self): + w = _import_worker() + assert w.PROCESS_NAME.endswith("iqegpumodeld") + assert callable(w.main) + + def test_warmup_validates_output(self): + w = _import_worker() + spec = {name: (shape, dtype) for name, (shape, dtype) in INPUT_SPEC.items()} + def good(inputs): + return np.zeros(10, dtype=np.float32) + assert w._warmup(good, spec, 10) >= 0.0 + with pytest.raises(RuntimeError, match="invalid"): + w._warmup(good, spec, 11) + + +class TestSelectorBackendKeys: + def test_emac_default(self): + from iqpilot.selfdrive.iqmodeld.modeld_selector import EMAC_STATUS_KEYS, backend_status_keys + assert backend_status_keys(False, False) is EMAC_STATUS_KEYS + assert backend_status_keys(True, False) is EMAC_STATUS_KEYS + + def test_egpu_selected(self): + from iqpilot.selfdrive.iqmodeld.modeld_selector import EGPU_STATUS_KEYS, backend_status_keys + assert backend_status_keys(False, True) is EGPU_STATUS_KEYS + assert backend_status_keys(False, True)["active"] == "UsbGpuActive" + assert backend_status_keys(False, True)["failed"] == "UsbGpuFailed" + + def test_emac_wins_when_both(self): + from iqpilot.selfdrive.iqmodeld.modeld_selector import EMAC_STATUS_KEYS, backend_status_keys + assert backend_status_keys(True, True) is EMAC_STATUS_KEYS + + def test_key_maps_cover_same_roles(self): + from iqpilot.selfdrive.iqmodeld.modeld_selector import EGPU_STATUS_KEYS, EMAC_STATUS_KEYS + assert set(EGPU_STATUS_KEYS) == set(EMAC_STATUS_KEYS) + + +class TestBackendSeparation: + EGPU_SOURCES = ( + "egpu_helpers.py", "egpu_pipeline.py", "egpu_model.py", "iqegpumodeld.py", + "big_catalog.py", "tools/compile_egpu_model.py", + ) + BANNED_IMPORTS = ("emac_input_state", "emac_model_meta", "maciqmodeld", "mac_protocol", "mac_client") + + def _sources(self): + import pathlib + root = pathlib.Path(__file__).resolve().parents[1] + return {name: (root / name).read_text() for name in self.EGPU_SOURCES} + + def test_no_emac_module_imports(self): + for name, src in self._sources().items(): + for banned in self.BANNED_IMPORTS: + assert f"import {banned}" not in src and f"iqmodeld.{banned}" not in src, f"{name} imports {banned}" + + def test_no_macmodel_params(self): + for name, src in self._sources().items(): + assert "MacModel" not in src, f"{name} references MacModel* params" + + def test_emac_shim_reexports_temporal_state(self): + from iqpilot.selfdrive.iqmodeld import emac_input_state, temporal_state + assert emac_input_state.EmacInputState is temporal_state.TemporalInputState + assert emac_input_state.SplitInputState is temporal_state.SplitTemporalState + + def test_emac_modules_are_not_in_the_public_tree(self): + import pathlib + root = pathlib.Path(__file__).resolve().parents[1] + for gone in ("mac_protocol.py", "mac_client.py", "maciqmodeld.py", "bulk_transport.py"): + assert not (root / gone).exists(), f"{gone} must live only in konn3kt_private" + + +class TestMetaDrivenInputSpec: + + def _run_one(self, meta): + seen = {} + def infer(inputs): + seen.update({k: v.shape for k, v in inputs.items()}) + return np.zeros(meta["output_len"], dtype=np.float32) + pipe = EgpuPipeline(meta, infer) + pipe.run(np.zeros((2, 6, 128, 256), np.uint8), np.zeros(8, np.float32), + np.array([1, 0], np.float32), np.zeros(2, np.float32)) + return seen + + def test_default_contract_unchanged(self): + meta = get_egpu_model() + seen = self._run_one(meta) + assert seen["features_buffer"] == (1, 24, 512) + assert seen["desire_pulse"] == (1, 25, 8) + + def test_registry_shapes_drive_the_state(self): + meta = dict(get_egpu_model()) + meta["output_len"] = 18452 + meta["output_slices"] = dict(meta["output_slices"], hidden_state=slice(2066, 18450)) + meta["input_shapes"] = { + "img": (1, 12, 128, 256), "big_img": (1, 12, 128, 256), + "desire_pulse": (1, 33, 8), "traffic_convention": (1, 2), + "action_t": (1, 2), "features_buffer": (1, 32, 32, 512), + } + seen = self._run_one(meta) + assert seen["features_buffer"] == (1, 32, 32, 512) + assert seen["desire_pulse"] == (1, 33, 8) + + +class TestCatalogResolution: + + def _params(self, model, doc=None): + class P: + def get(self, k): + if k == "IQEmacModel": + return model + if k == "IQEmacCatalogCache": + return json.dumps(doc) if doc else None + return None + return P() + + def _doc(self): + return {"schema": 1, "bundles": [{ + "short_name": "ttx", "display_name": "TTx", "index": 1, + "model_name": "big_driving_supercombo", + "wire": {"output_len": 2580, "frame_skip": 4, "pipeline": True, + "output_slices": {"plan": [917, 1907], "hidden_state": [2066, 2578], "pad": [-2, None]}, + "input_shapes": {"img": [1, 12, 128, 256], "big_img": [1, 12, 128, 256], + "desire_pulse": [1, 33, 8], "traffic_convention": [1, 2], + "action_t": [1, 2], "features_buffer": [1, 32, 512]}, + "lat_smooth_seconds": 0.1}, + "source": {"kind": "comma_lfs", "sha256": "c" * 64, "size": 1}, + }]} + + def test_unset_selection_is_the_builtin_default(self): + from iqpilot.selfdrive.iqmodeld.egpu_model import resolve_egpu_model + m = resolve_egpu_model(self._params(None)) + assert m["key"] == "lebrowski" and m["sha256"].startswith("a501760a") + + def test_catalog_selection_resolves_with_shapes_and_smoothing(self): + from iqpilot.selfdrive.iqmodeld.egpu_model import resolve_egpu_model + m = resolve_egpu_model(self._params("ttx", self._doc())) + assert m["key"] == "ttx" + assert m["input_shapes"]["features_buffer"] == (1, 32, 512) + assert m["input_shapes"]["desire_pulse"] == (1, 33, 8) + assert m["lat_smooth_seconds"] == 0.1 + assert m["output_slices"]["pad"] == slice(-2, None) + + def test_unknown_selection_is_a_park_not_a_silent_default(self): + from iqpilot.selfdrive.iqmodeld.egpu_model import resolve_egpu_model + assert resolve_egpu_model(self._params("ghost", self._doc()), allow_refresh=False) is None + + def test_bench_model_is_not_selectable(self): + from iqpilot.selfdrive.iqmodeld.egpu_model import resolve_egpu_model + assert resolve_egpu_model(self._params("comma_small", self._doc()), allow_refresh=False) is None + + def test_registry_carries_no_model_list(self): + from iqpilot.selfdrive.iqmodeld.egpu_model import EGPU_MODELS + assert set(EGPU_MODELS) == {"lebrowski", "comma_small"} + + +class TestConsentAndIntegrity: + def test_disabled_param_denies_present_dock(self, monkeypatch): + from iqpilot.selfdrive.iqmodeld import egpu_helpers + monkeypatch.setattr(egpu_helpers, "usbgpu_present", lambda sysfs_root=egpu_helpers.USB_SYSFS_ROOT: True) + assert egpu_helpers.egpu_present_consented(FakeParams()) is True + assert egpu_helpers.egpu_present_consented(FakeParams(IQEgpuDisabled=True)) is False + + def test_local_onnx_quarantines_bad_content(self, tmp_path, monkeypatch): + import hashlib + from iqpilot.selfdrive.iqmodeld import egpu_helpers + onnx = tmp_path / "m.onnx" + onnx.write_bytes(b"good") + meta = {"sha256": hashlib.sha256(b"good").hexdigest(), "download": {"size": 4}} + monkeypatch.setattr(egpu_helpers, "onnx_cache_path", lambda m: str(onnx)) + assert egpu_helpers.local_onnx(meta) == str(onnx) + onnx.write_bytes(b"bad!") + assert egpu_helpers.local_onnx(meta) is None + assert not onnx.exists() + assert (tmp_path / "m.onnx.unusable").exists() + + +class TestEgpuDockStatus: + def _run(self, seq): + from iqpilot.system.hardware.egpu_dock.status import EgpuDockStatus + st = EgpuDockStatus() + fired = {} + def set_alert(name, cond, extra=None): + fired[name] = (bool(cond), extra) + for args in seq: + st.update(*args, set_alert) + return {k: v for k, v in fired.items() if v[0]} + + def _dock(self, speed=10000, product="custom ed4e39b7-CLEAN"): + return [{"vendorId": 0xADD1, "productId": 0x0001, "product": product, "speedMbps": speed}] + + def test_no_dock_no_alerts(self): + assert self._run([(True, [], False, False, None, True, None)]) == {} + + def test_usb2_dock_warns_slow(self): + fired = self._run([(True, self._dock(speed=480), False, False, None, True, None)]) + assert fired.get("Offroad_EgpuUsbSlow") == (True, "480 Mbps") + + def test_power_fault_reports_pcie_unavailable(self): + class St: + supplyFault = True + supplyVoltage = 0 + pcieLtssm = 0x78 + tempC = memoryTempC = 40.0 + fanSpeedRpm = 1500 + d = self._dock() + fired = self._run([ + (True, d, False, False, None, True, None), + (False, d, False, True, None, True, None), + (False, d, False, False, b"1", True, St()), + ]) + assert "Offroad_EgpuPcieUnavailable" in fired diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_emac_input_state.py b/iqpilot/selfdrive/iqmodeld/tests/test_emac_input_state.py new file mode 100644 index 000000000..ac661b607 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_emac_input_state.py @@ -0,0 +1,111 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import os + +import numpy as np +import pytest + +os.environ.setdefault("DEV", "CPU") + +from iqpilot.selfdrive.iqmodeld.emac_input_state import EmacInputState +from iqpilot.selfdrive.iqmodeld.emac_model_meta import FRAME_SKIP, OUTPUT_LEN, OUTPUT_SLICES +from iqpilot.selfdrive.iqmodeld.temporal_state import MODEL_INPUT_SPEC as INPUT_SPEC + +N_FRAMES_TEST = 30 +IMG_SHAPE = INPUT_SPEC["img"][0] +DESIRE_LEN = INPUT_SPEC["desire_pulse"][0][2] + + +class _CaptureRunner: + + def __init__(self): + self.captured: dict[str, np.ndarray] | None = None + + def __call__(self, inputs): + from tinygrad import Tensor + self.captured = {k: v.numpy().copy() for k, v in inputs.items()} + return {"outputs": Tensor(np.zeros((1, OUTPUT_LEN), dtype=np.float32))} + + +@pytest.fixture(scope="module") +def reference(): + from iqpilot.selfdrive.iqmodeld.tools.compile_supercombo import ( + POLICY_INPUTS, make_input_queues, make_run_policy, + ) + + input_shapes = {name: shape for name, (shape, _) in INPUT_SPEC.items()} + metadata = {"input_shapes": input_shapes} + capture = _CaptureRunner() + run_policy = make_run_policy(capture, metadata, FRAME_SKIP) + queues, npy = make_input_queues(input_shapes, FRAME_SKIP, device="CPU") + return run_policy, queues, npy, capture, POLICY_INPUTS + + +def _rising_edge(raw_desire: np.ndarray, prev: np.ndarray) -> np.ndarray: + cur = raw_desire.astype(np.float32).copy() + cur[0] = 0 + pulse = np.where(cur - prev > 0.99, cur, 0).astype(np.float32) + prev[:] = cur + return pulse + + +def test_materialized_inputs_match_tinygrad_reference(reference): + from tinygrad import Tensor + + run_policy, queues, npy, capture, policy_inputs = reference + rng = np.random.default_rng(1234) + state = EmacInputState(FRAME_SKIP) + ref_prev_desire = np.zeros(DESIRE_LEN, dtype=np.float32) + + hidden = np.zeros((1, 512), dtype=np.float32) + for frame in range(N_FRAMES_TEST): + warped = rng.integers(0, 256, (2, 6, IMG_SHAPE[2], IMG_SHAPE[3]), dtype=np.int64).astype(np.uint8) + raw_desire = np.zeros(DESIRE_LEN, dtype=np.float32) + if frame % 3: + raw_desire[int(rng.integers(0, DESIRE_LEN))] = 1.0 + traffic = rng.standard_normal(2).astype(np.float32) + action_t = rng.standard_normal(2).astype(np.float32) + + npy["desire"][:] = _rising_edge(raw_desire, ref_prev_desire) + npy["traffic_convention"][:] = traffic + npy["action_t"][:] = action_t + npy["prev_feat"][:] = hidden + run_policy(warped=Tensor(warped), **{k: queues[k] for k in policy_inputs}) + ref_inputs = capture.captured + + state.prev_feat[:] = hidden + mat = state.push_and_materialize(warped, raw_desire, traffic, action_t) + + for name in INPUT_SPEC: + assert ref_inputs[name].shape == tuple(INPUT_SPEC[name][0]), name + np.testing.assert_array_equal( + mat[name].astype(ref_inputs[name].dtype), ref_inputs[name], + err_msg=f"frame {frame}: materialized {name} diverges from tinygrad reference") + + fake_output = rng.standard_normal(OUTPUT_LEN).astype(np.float32) + state.note_hidden_state(fake_output, OUTPUT_SLICES["hidden_state"]) + hidden = fake_output[OUTPUT_SLICES["hidden_state"]].reshape(1, 512).copy() + + +def test_note_hidden_state_slice(): + state = EmacInputState(FRAME_SKIP) + out = np.arange(OUTPUT_LEN, dtype=np.float32) + state.note_hidden_state(out, OUTPUT_SLICES["hidden_state"]) + np.testing.assert_array_equal(state.prev_feat.reshape(-1), out[OUTPUT_SLICES["hidden_state"]]) + + +def test_desire_pulse_rising_edge_only_once(): + state = EmacInputState(FRAME_SKIP) + held = np.zeros(DESIRE_LEN, dtype=np.float32) + held[3] = 1.0 + warped = np.zeros((2, 6, IMG_SHAPE[2], IMG_SHAPE[3]), dtype=np.uint8) + zeros2 = np.zeros(2, dtype=np.float32) + + first = state.push_and_materialize(warped, held, zeros2, zeros2) + assert first["desire_pulse"][0, -1, 3] == 1.0 + second = state.push_and_materialize(warped, held, zeros2, zeros2) + assert state.desire_q[-1].max() == 0.0 + assert second["desire_pulse"][0, -1, 3] == 1.0 diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_fused_runner_guards.py b/iqpilot/selfdrive/iqmodeld/tests/test_fused_runner_guards.py new file mode 100644 index 000000000..a15fcb47d --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_fused_runner_guards.py @@ -0,0 +1,128 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import pickle +from dataclasses import dataclass + +import numpy as np +import pytest + +from iqpilot.selfdrive.iqmodeld.models.runners import model_runner as model_runner_mod +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad import fused_runner as fused_mod + + +class _View: + def __init__(self, shape): + self.shape = shape + + +class _Captured: + def __init__(self, expected_names, expected_input_info): + self.expected_names = expected_names + self.expected_input_info = expected_input_info + + +class _FakeJit: + def __init__(self, expected_names, expected_input_info): + self.captured = _Captured(expected_names, expected_input_info) + + def __call__(self, **kwargs): + raise AssertionError("policy jit should not run in this test") + + +class _FakeTensor: + def __init__(self, arr, device=None): + self.shape = tuple(np.asarray(arr).shape) + + def contiguous(self): + return self + + def realize(self): + return self + + +class _FakeDevice: + DEFAULT = "FAKE" + + +@dataclass +class _Type: + raw: int + + +@dataclass +class _Artifact: + fileName: str + + +class _Model: + def __init__(self, file_name): + self.type = _Type(ModelType.vision) + self.artifact = _Artifact(file_name) + self.metadata = None + + +class _Bundle: + def __init__(self, file_name): + self.models = [_Model(file_name)] + self.is20hz = True + + +POLICY_INPUTS = ["action_t", "big_img", "desire", "desire_q", "feat_q", "img", "traffic_convention"] +POLICY_SHAPES = { + "action_t": (1, 2), "big_img": (1, 12, 128, 256), "desire": (1, 8), "desire_q": (1, 100, 8), + "feat_q": (1, 99, 512), "img": (1, 12, 128, 256), "traffic_convention": (1, 2), +} + + +def _write_fused_pkl(path, policy_inputs): + info = [(_View(POLICY_SHAPES[n]), (), None, "NPY") for n in policy_inputs] + role_meta = { + "input_shapes": {"desire_pulse": (1, 100, 8), "traffic_convention": (1, 2), "features_buffer": (1, 99, 512)}, + "output_slices": {}, + } + blob = { + "metadata": { + "vision": {"input_shapes": {"img": (1, 12, 128, 256), "big_img": (1, 12, 128, 256)}, "output_slices": {}}, + "on_policy": role_meta, + "off_policy": role_meta, + }, + "run_policy": _FakeJit(policy_inputs, info), + "frame_skip": 4, + (1928, 1208): _FakeJit(["frame"], [(_View((1,)), (), None, "NPY")]), + } + with open(path, "wb") as f: + pickle.dump(blob, f) + + +@pytest.fixture +def fused_runner(tmp_path, monkeypatch): + def _build(policy_inputs): + name = "driving_fused_test.pkl" + _write_fused_pkl(tmp_path / name, policy_inputs) + monkeypatch.setattr(model_runner_mod, "_fetch_bundle", lambda params=None: _Bundle(name)) + monkeypatch.setattr(fused_mod, "CUSTOM_MODEL_PATH", str(tmp_path)) + monkeypatch.setattr(fused_mod, "_tinygrad_imports", lambda: (_FakeTensor, _FakeDevice)) + return fused_mod.TinygradFusedRunner() + return _build + + +def test_action_t_allocated_when_only_the_jit_declares_it(fused_runner): + runner = fused_runner(POLICY_INPUTS) + assert "action_t" not in runner._on_meta["input_shapes"] + + runner._ensure_queues(1928, 1208) + + assert runner._npy_buffers["action_t"].shape == POLICY_SHAPES["action_t"] + assert runner._npy_buffers["traffic_convention"].shape == POLICY_SHAPES["traffic_convention"] + + +def test_action_t_absent_when_the_jit_does_not_take_it(fused_runner): + runner = fused_runner([n for n in POLICY_INPUTS if n != "action_t"]) + + runner._ensure_queues(1928, 1208) + + assert "action_t" not in runner._npy_buffers diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_iqmodeld_contracts.py b/iqpilot/selfdrive/iqmodeld/tests/test_iqmodeld_contracts.py new file mode 100644 index 000000000..89241c6ad --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_iqmodeld_contracts.py @@ -0,0 +1,126 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import copy + +import iqpilot.cereal.messaging as messaging +import numpy as np +from iqpilot.cereal import log + +from iqpilot.selfdrive.iqmodeld.config import Meta, ModelConstants +from iqpilot.selfdrive.iqmodeld.messaging import ( + DrivePacketMemory, + pick_curvature, + populate_drive_messages, + populate_odometry_message, +) +from iqpilot.selfdrive.iqmodeld.models.split_model_constants import SplitModelConstants +from iqpilot.selfdrive.iqmodeld.parser import ArchiveParser, PhaseParser + + +def _archive_sample(rng: np.random.Generator) -> dict[str, np.ndarray]: + return { + "plan": rng.standard_normal((1, ModelConstants.PLAN_MHP_N * (2 * ModelConstants.IDX_N * ModelConstants.PLAN_WIDTH + ModelConstants.PLAN_MHP_SELECTION)), dtype=np.float32), + "lane_lines": rng.standard_normal((1, 2 * ModelConstants.NUM_LANE_LINES * ModelConstants.IDX_N * ModelConstants.LANE_LINES_WIDTH), dtype=np.float32), + "road_edges": rng.standard_normal((1, 2 * ModelConstants.NUM_ROAD_EDGES * ModelConstants.IDX_N * ModelConstants.LANE_LINES_WIDTH), dtype=np.float32), + "pose": rng.standard_normal((1, 2 * ModelConstants.POSE_WIDTH), dtype=np.float32), + "road_transform": rng.standard_normal((1, 2 * ModelConstants.POSE_WIDTH), dtype=np.float32), + "sim_pose": rng.standard_normal((1, 2 * ModelConstants.POSE_WIDTH), dtype=np.float32), + "wide_from_device_euler": rng.standard_normal((1, 2 * ModelConstants.WIDE_FROM_DEVICE_WIDTH), dtype=np.float32), + "lead": rng.standard_normal((1, ModelConstants.LEAD_MHP_N * (2 * ModelConstants.LEAD_TRAJ_LEN * ModelConstants.LEAD_WIDTH + ModelConstants.LEAD_MHP_SELECTION)), dtype=np.float32), + "lat_planner_solution": rng.standard_normal((1, 2 * ModelConstants.IDX_N * ModelConstants.LAT_PLANNER_SOLUTION_WIDTH), dtype=np.float32), + "desired_curvature": rng.standard_normal((1, 2 * ModelConstants.DESIRED_CURV_WIDTH), dtype=np.float32), + "lead_prob": rng.standard_normal((1, ModelConstants.LEAD_MHP_SELECTION), dtype=np.float32), + "lane_lines_prob": rng.standard_normal((1, ModelConstants.NUM_LANE_LINES * 2), dtype=np.float32), + "meta": rng.standard_normal((1, 55), dtype=np.float32), + "desire_state": rng.standard_normal((1, ModelConstants.DESIRE_PRED_WIDTH), dtype=np.float32), + "desire_pred": rng.standard_normal((1, ModelConstants.DESIRE_PRED_LEN * ModelConstants.DESIRE_PRED_WIDTH), dtype=np.float32), + } + + +def _phase_sample(rng: np.random.Generator) -> dict[str, np.ndarray]: + c = SplitModelConstants + return { + "pose": rng.standard_normal((1, 2 * c.POSE_WIDTH), dtype=np.float32), + "wide_from_device_euler": rng.standard_normal((1, 2 * c.WIDE_FROM_DEVICE_WIDTH), dtype=np.float32), + "road_transform": rng.standard_normal((1, 2 * c.POSE_WIDTH), dtype=np.float32), + "lead": rng.standard_normal((1, c.LEAD_MHP_N * (2 * c.LEAD_TRAJ_LEN * c.LEAD_WIDTH + c.LEAD_MHP_SELECTION)), dtype=np.float32), + "plan": rng.standard_normal((1, c.PLAN_MHP_N * (2 * c.IDX_N * c.PLAN_WIDTH + c.PLAN_MHP_SELECTION)), dtype=np.float32), + "planplus": rng.standard_normal((1, 2 * c.IDX_N * c.PLAN_WIDTH), dtype=np.float32), + "action": rng.standard_normal((1, 2 * c.ACTION_WIDTH), dtype=np.float32), + "desired_curvature": rng.standard_normal((1, 2 * c.DESIRED_CURV_WIDTH), dtype=np.float32), + "desire_pred": rng.standard_normal((1, c.DESIRE_PRED_LEN * c.DESIRE_PRED_WIDTH), dtype=np.float32), + "desire_state": rng.standard_normal((1, c.DESIRE_PRED_WIDTH), dtype=np.float32), + "lane_lines": rng.standard_normal((1, 2 * c.NUM_LANE_LINES * c.IDX_N * c.LANE_LINES_WIDTH), dtype=np.float32), + "lane_lines_prob": rng.standard_normal((1, c.NUM_LANE_LINES * 2), dtype=np.float32), + "lead_prob": rng.standard_normal((1, c.LEAD_MHP_SELECTION), dtype=np.float32), + "lat_planner_solution": rng.standard_normal((1, 2 * c.IDX_N * c.LAT_PLANNER_SOLUTION_WIDTH), dtype=np.float32), + "meta": rng.standard_normal((1, 55), dtype=np.float32), + "road_edges": rng.standard_normal((1, 2 * c.NUM_ROAD_EDGES * c.IDX_N * c.LANE_LINES_WIDTH), dtype=np.float32), + "sim_pose": rng.standard_normal((1, 2 * c.POSE_WIDTH), dtype=np.float32), + } + + +def test_archive_parser_contract_snapshot(): + outputs = ArchiveParser().parse_outputs(copy.deepcopy(_archive_sample(np.random.default_rng(7)))) + + assert outputs["plan"].shape == (1, 33, 15) + assert outputs["lane_lines"].shape == (1, 4, 33, 2) + assert outputs["road_edges"].shape == (1, 2, 33, 2) + assert outputs["desire_pred"].shape == (1, 4, 8) + + np.testing.assert_allclose(outputs["pose"][0, 0], 0.45617363, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(outputs["lane_lines_prob"][0, 2], 0.85733712, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(outputs["desire_state"][0, 0], 0.44964141, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(outputs["lead_prob"][0, 0], 0.21613698, rtol=1e-6, atol=1e-6) + + +def test_phase_parser_contract_snapshot(): + raw = _phase_sample(np.random.default_rng(23)) + outputs = {**PhaseParser().parse_vision_outputs(copy.deepcopy(raw)), **PhaseParser().parse_policy_outputs(copy.deepcopy(raw))} + + assert outputs["plan"].shape == (1, 33, 15) + assert outputs["action"].shape == (1, 2) + assert outputs["desired_curvature"].shape == (1, 1) + assert outputs["road_edges"].shape == (1, 2, 33, 2) + + np.testing.assert_allclose(outputs["plan"][0, 0, 0], 0.09684439, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(outputs["action"][0, 0], 0.25458091, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(outputs["desired_curvature"][0, 0], -0.97072351, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(outputs["lane_lines_prob"][0, 0], 0.20073657, rtol=1e-6, atol=1e-6) + + +def test_message_population_contract_snapshot(): + raw = _phase_sample(np.random.default_rng(23)) + outputs = {**PhaseParser().parse_vision_outputs(copy.deepcopy(raw)), **PhaseParser().parse_policy_outputs(copy.deepcopy(raw))} + action = log.ModelDataV2.Action(desiredCurvature=0.031, desiredAcceleration=-0.12, shouldStop=False) + + driving_msg = messaging.new_message("drivingModelData") + model_msg = messaging.new_message("modelV2") + odometry_msg = messaging.new_message("cameraOdometry") + memory = DrivePacketMemory() + + populate_drive_messages( + driving_msg, model_msg, outputs, action, memory, + 2468, 2470, 2480, 0.05, 123456789, 0.014, True, Meta, + ) + populate_odometry_message(odometry_msg, outputs, 2468, 0, 123456789, True) + + np.testing.assert_allclose(driving_msg.drivingModelData.laneLineMeta.leftY, -0.21672775, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(model_msg.modelV2.meta.engagedProb, 0.64853197, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(odometry_msg.cameraOdometry.trans[0], 0.0360266, rtol=1e-6, atol=1e-6) + assert int(model_msg.modelV2.confidence.raw) == 2 + + +def test_curvature_selection_contract_snapshot(): + raw = _phase_sample(np.random.default_rng(23)) + outputs = {**PhaseParser().parse_vision_outputs(copy.deepcopy(raw)), **PhaseParser().parse_policy_outputs(copy.deepcopy(raw))} + plan_rows = outputs["plan"][0] + + direct = pick_curvature(outputs, plan_rows, 27.5, 0.8, synthetic_lane_logic=False) + fallback = pick_curvature(outputs, plan_rows, 27.5, 0.8, synthetic_lane_logic=True) + + np.testing.assert_allclose(direct, -0.97072351, rtol=1e-6, atol=1e-6) + np.testing.assert_allclose(fallback, -0.0689389, rtol=1e-6, atol=1e-6) diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_lat_delay_source.py b/iqpilot/selfdrive/iqmodeld/tests/test_lat_delay_source.py new file mode 100644 index 000000000..de48f580c --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_lat_delay_source.py @@ -0,0 +1,73 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from types import SimpleNamespace + +import pytest + +from iqpilot.cereal import car +from iqpilot.common.params import Params +from iqpilot.selfdrive.iqmodeld.daemon import InferenceDaemon + +LIVE_DELAY = 0.4387 +RACK_DELAY = 0.10 +OFFSET = 0.05 + + +@pytest.fixture +def params(tmp_path, monkeypatch): + monkeypatch.setenv("PARAMS_ROOT", str(tmp_path)) + p = Params() + p.put("IQSteerDelayCache", LIVE_DELAY) + p.put("IQSoftwareSteerDelay", OFFSET) + p.put_bool("ModelSmoothingEnabled", False) + p.put("ModelLatSmoothSec", 0) + p.put("PlanplusControl", 1.0) + p.put("CameraOffset", 0.0) + return p + + +def _daemon(params, steer_control_type): + car_params = car.CarParams.new_message() + car_params.steerControlType = steer_control_type + car_params.steerActuatorDelay = RACK_DELAY + return SimpleNamespace( + _params=params, + _car_params=car_params, + _channel=None, + _sub={"lateralDelay": SimpleNamespace(lateralDelay=LIVE_DELAY)}, + _runtime=SimpleNamespace(lat_delay=None, PLANPLUS_CONTROL=None, model_smoothing_max_extra_sec=None), + _warps=SimpleNamespace(set_offset=lambda _: None), + ) + + +@pytest.mark.parametrize("live_enabled, expected", [(False, RACK_DELAY + OFFSET), (True, LIVE_DELAY)]) +def test_angle_cars_honour_the_self_tuning_toggle(params, live_enabled, expected): + params.put_bool("IQLiveSteerDelay", live_enabled) + daemon = _daemon(params, car.CarParams.SteerControlType.angle) + InferenceDaemon._refresh_tunables(daemon, 0) + assert daemon._runtime.lat_delay == pytest.approx(expected) + + +def test_angle_cars_never_plan_against_the_live_estimate_when_disabled(params): + params.put_bool("IQLiveSteerDelay", False) + daemon = _daemon(params, car.CarParams.SteerControlType.angle) + InferenceDaemon._refresh_tunables(daemon, 0) + assert daemon._runtime.lat_delay != pytest.approx(LIVE_DELAY) + + +@pytest.mark.parametrize("live_enabled", [True, False]) +def test_torque_cars_keep_the_live_estimate(params, live_enabled): + params.put_bool("IQLiveSteerDelay", live_enabled) + daemon = _daemon(params, car.CarParams.SteerControlType.torque) + InferenceDaemon._refresh_tunables(daemon, 0) + assert daemon._runtime.lat_delay == pytest.approx(LIVE_DELAY) + + +def test_refresh_is_throttled_to_every_sixtieth_tick(params): + params.put_bool("IQLiveSteerDelay", False) + daemon = _daemon(params, car.CarParams.SteerControlType.angle) + InferenceDaemon._refresh_tunables(daemon, 1) + assert daemon._runtime.lat_delay is None + InferenceDaemon._refresh_tunables(daemon, 60) + assert daemon._runtime.lat_delay == pytest.approx(RACK_DELAY + OFFSET) diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_model_bundle_downloader.py b/iqpilot/selfdrive/iqmodeld/tests/test_model_bundle_downloader.py new file mode 100644 index 000000000..4e7e74e6c --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_model_bundle_downloader.py @@ -0,0 +1,133 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import hashlib +import http.server +import os +import threading + +import pytest + +from iqpilot.selfdrive.iqmodeld import model_bundle_downloader as dl + + +class _RangeHandler(http.server.BaseHTTPRequestHandler): + store: dict[str, bytes] = {} + cut_first: dict[str, int] = {} + hits: list[tuple[str, str | None]] = [] + + def log_message(self, *a): + pass + + def do_GET(self): + oid = self.path.rsplit("/", 1)[-1] + data = self.store[oid] + rng = self.headers.get("Range") + self.hits.append((oid, rng)) + start = int(rng.split("=")[1].rstrip("-")) if rng else 0 + body = data[start:] + cut = self.cut_first.pop(oid, None) + if cut is not None: + body = body[:cut] + self.send_response(206 if rng else 200) + self.send_header("Content-Length", str(len(body))) + if rng: + self.send_header("Content-Range", f"bytes {start}-{start + len(body) - 1}/{len(data)}") + self.end_headers() + self.wfile.write(body) + + +@pytest.fixture +def server(): + srv = http.server.ThreadingHTTPServer(("127.0.0.1", 0), _RangeHandler) + t = threading.Thread(target=srv.serve_forever, daemon=True) + t.start() + yield srv + srv.shutdown() + srv.server_close() + + +def _objects(parts): + return [{"oid": hashlib.sha256(p).hexdigest(), "size": len(p)} for p in parts] + + +def test_resume_continues_a_cut_part_and_reuses_finished_parts(server, tmp_path, monkeypatch): + parts = [os.urandom(300_000), os.urandom(300_000), os.urandom(120_000)] + objs = _objects(parts) + _RangeHandler.store = {o["oid"]: p for o, p in zip(objs, parts, strict=True)} + _RangeHandler.hits = [] + _RangeHandler.cut_first = {objs[1]["oid"]: 100_000} + port = server.server_address[1] + monkeypatch.setattr(dl, "_requests_auth", lambda: None) + monkeypatch.setattr(dl, "_resolve_oid", lambda session, base, oid, size, auth: (f"http://127.0.0.1:{port}/o/{oid}", {})) + monkeypatch.setattr(dl, "MODELS_BASE_URLS", ("http://unused",)) + monkeypatch.setattr(dl, "STREAM_RETRIES", 3) + monkeypatch.setattr(dl, "CHUNK", 64 * 1024) + whole = b"".join(parts) + dst = str(tmp_path / "model.pkl") + out = dl.download_lfs_bundle(objs, dst, hashlib.sha256(whole).hexdigest(), len(whole)) + with open(dst, "rb") as f: + assert out == dst and f.read() == whole + assert not os.path.exists(dst + ".parts") + ranges = [r for o, r in _RangeHandler.hits if o == objs[1]["oid"]] + assert ranges[0] is None and ranges[1] == "bytes=100000-" + assert sum(1 for o, _ in _RangeHandler.hits if o == objs[0]["oid"]) == 1 + + +def test_corrupt_finished_part_is_refetched(server, tmp_path, monkeypatch): + parts = [os.urandom(200_000), os.urandom(50_000)] + objs = _objects(parts) + _RangeHandler.store = {o["oid"]: p for o, p in zip(objs, parts, strict=True)} + _RangeHandler.hits = [] + _RangeHandler.cut_first = {} + port = server.server_address[1] + monkeypatch.setattr(dl, "_requests_auth", lambda: None) + monkeypatch.setattr(dl, "_resolve_oid", lambda session, base, oid, size, auth: (f"http://127.0.0.1:{port}/o/{oid}", {})) + monkeypatch.setattr(dl, "MODELS_BASE_URLS", ("http://unused",)) + dst = str(tmp_path / "model.pkl") + os.makedirs(dst + ".parts") + with open(dl._part_path(dst, objs[0]["oid"]), "wb") as f: + f.write(os.urandom(200_000)) + whole = b"".join(parts) + dl.download_lfs_bundle(objs, dst, hashlib.sha256(whole).hexdigest(), len(whole)) + with open(dst, "rb") as f: + assert f.read() == whole + + +def test_hf_single_file_resumes_after_cut(server, tmp_path, monkeypatch): + data = os.urandom(700_000) + oid = hashlib.sha256(data).hexdigest() + _RangeHandler.store = {oid: data} + _RangeHandler.hits = [] + _RangeHandler.cut_first = {oid: 250_000} + port = server.server_address[1] + monkeypatch.setattr(dl, "_hf", lambda: ({"Authorization": "Bearer test"}, lambda p: f"http://127.0.0.1:{port}/o/{oid}")) + monkeypatch.setattr(dl, "STREAM_RETRIES", 3) + monkeypatch.setattr(dl, "CHUNK", 64 * 1024) + dst = str(tmp_path / "policy.pkl") + out = dl.download_hf_file("egpu/policy/x.pkl", dst, oid, len(data)) + with open(dst, "rb") as f: + assert out == dst and f.read() == data + ranges = [r for o, r in _RangeHandler.hits if o == oid] + assert ranges[0] is None and ranges[1] == "bytes=250000-" + assert not os.path.exists(dst + ".hfpart") + + +def test_download_onnx_prefers_hf_then_falls_back(tmp_path, monkeypatch): + from iqpilot.selfdrive.iqmodeld import egpu_helpers as eh + meta = {"key": "m", "sha256": "ab" * 32, "download": {"kind": "comma_lfs", "size": 5}} + monkeypatch.setattr(eh, "onnx_cache_path", lambda m: str(tmp_path / "m.onnx")) + monkeypatch.setattr("iqpilot.selfdrive.iqmodeld.egpu_model.download_descriptor", lambda m: ("commalfs:" + m["sha256"], 5), raising=False) + calls = [] + import iqpilot.selfdrive.iqmodeld.model_bundle_downloader as dlm + monkeypatch.setattr(dlm, "download_hf_file", lambda path, dst, sha, size, progress_cb=None: (calls.append(("hf", path)), open(dst, "wb").close(), dst)[2]) + monkeypatch.setattr(eh, "resolve_download_url", lambda *a, **k: (calls.append(("lfs",)), "http://unused")[1]) + out = eh.download_onnx(meta) + assert calls == [("hf", "onnx/" + "ab" * 32 + ".onnx")] and out == str(tmp_path / "m.onnx") + calls.clear() + def boom(*a, **k): + calls.append(("hf-fail",)); raise RuntimeError("hf down") + monkeypatch.setattr(dlm, "download_hf_file", boom) + with pytest.raises(Exception): + eh.download_onnx(meta) + assert calls[:2] == [("hf-fail",), ("lfs",)] diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_model_runner_smoke.py b/iqpilot/selfdrive/iqmodeld/tests/test_model_runner_smoke.py new file mode 100644 index 000000000..66631a82a --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_model_runner_smoke.py @@ -0,0 +1,77 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +import pytest +from tinygrad.tensor import Tensor + +import iqpilot.selfdrive.iqmodeld.models.helpers as bundle_helpers +import iqpilot.selfdrive.iqmodeld.models.runners.model_runner as model_runner_mod +import iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner as tinygrad_runner_mod +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner import TinygradRunner + + +LOCAL_MODEL_DIR = Path(__file__).resolve().parents[1] / "default_model" + + +@dataclass +class _TypeWrap: + raw: int + + +@dataclass +class _Artifact: + fileName: str + + +class _Model: + def __init__(self, model_type: int, artifact_name: str, metadata_name: str): + self.type = _TypeWrap(model_type) + self.artifact = _Artifact(artifact_name) + self.metadata = _Artifact(metadata_name) + + +class _Bundle: + def __init__(self, models: list[_Model], is_20hz: bool = False): + self.models = models + self.is20hz = is_20hz + + +def _seed_runner_inputs(runner: TinygradRunner) -> None: + for name, shape in runner.input_shapes.items(): + runner.inputs[name] = Tensor( + np.zeros(shape, dtype=np.float32), + device=runner.input_to_device[name], + dtype=runner.input_to_dtype[name], + ).realize() + + +@pytest.mark.tici +def test_local_tinygrad_models_execute(monkeypatch): + bundle = _Bundle([ + _Model(ModelType.vision, "driving_vision_c210m_tinygrad.pkl", "driving_vision_c210m_metadata.pkl"), + _Model(ModelType.policy, "driving_policy_c210m_tinygrad.pkl", "driving_policy_c210m_metadata.pkl"), + ]) + + monkeypatch.setattr(bundle_helpers, "get_active_bundle", lambda params=None: bundle, raising=False) + monkeypatch.setattr(model_runner_mod, "_fetch_bundle", lambda params=None: bundle) + monkeypatch.setattr(tinygrad_runner_mod, "CUSTOM_MODEL_PATH", str(LOCAL_MODEL_DIR), raising=False) + monkeypatch.setattr(model_runner_mod, "CUSTOM_MODEL_PATH", str(LOCAL_MODEL_DIR), raising=False) + + vision_runner = TinygradRunner(ModelType.vision) + _seed_runner_inputs(vision_runner) + vision_outputs = vision_runner.run_model() + assert "pose" in vision_outputs + assert "lane_lines" in vision_outputs + + policy_runner = TinygradRunner(ModelType.policy) + _seed_runner_inputs(policy_runner) + policy_outputs = policy_runner.run_model() + assert "plan" in policy_outputs + assert "desire_state" in policy_outputs diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_public_surface.py b/iqpilot/selfdrive/iqmodeld/tests/test_public_surface.py new file mode 100644 index 000000000..474b49901 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_public_surface.py @@ -0,0 +1,21 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot.selfdrive.iqmodeld import metadata, messaging, parser +from iqpilot.selfdrive.iqmodeld.daemon import CaptureStamp, NeuralEngineState + + +def test_public_module_surface(): + assert hasattr(messaging, "DrivePacketMemory") + assert hasattr(messaging, "pick_curvature") + assert hasattr(messaging, "populate_drive_messages") + assert hasattr(messaging, "populate_odometry_message") + + assert hasattr(parser, "ArchiveParser") + assert hasattr(parser, "PhaseParser") + + assert hasattr(metadata, "select_meta_layout") + assert hasattr(metadata, "build_metadata_record") + + assert CaptureStamp.__name__ == "CaptureStamp" + assert NeuralEngineState.__name__ == "NeuralEngineState" diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_selector_share_smoke.py b/iqpilot/selfdrive/iqmodeld/tests/test_selector_share_smoke.py new file mode 100644 index 000000000..cfcc4d8f8 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_selector_share_smoke.py @@ -0,0 +1,171 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import os +from dataclasses import dataclass +from pathlib import Path + +import numpy as np +from tinygrad.nn.onnx import OnnxRunner +from tinygrad.tensor import Tensor + +import iqpilot.selfdrive.iqmodeld.models.helpers as bundle_helpers +import iqpilot.selfdrive.iqmodeld.models.runners.model_runner as model_runner_mod +import iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner as tinygrad_runner_mod +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import ModelType +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.tinygrad_runner import TinygradRunner + + +SHARE_ROOT = Path(os.getenv("IQPILOT_SELECTOR_SHARE", "/Volumes/New New Vault/IQModels/models/recompiled16")) + + +@dataclass +class _TypeWrap: + raw: int + + +@dataclass +class _Artifact: + fileName: str + + +class _Model: + def __init__(self, model_type: int, artifact_name: str, metadata_name: str): + self.type = _TypeWrap(model_type) + self.artifact = _Artifact(artifact_name) + self.metadata = _Artifact(metadata_name) + + +class _Bundle: + def __init__(self, models: list[_Model], is_20hz: bool = False): + self.models = models + self.is20hz = is_20hz + + +def _find_selector_dirs(limit: int = 3, require_onnx: bool = False) -> list[Path]: + found: list[Path] = [] + if not SHARE_ROOT.is_dir(): + return found + + for bundle_dir in sorted(SHARE_ROOT.iterdir()): + if not bundle_dir.is_dir(): + continue + vision = next(bundle_dir.glob("driving_vision*_tinygrad.pkl"), None) + policy = next(bundle_dir.glob("driving_policy*_tinygrad.pkl"), None) + vision_meta = next(bundle_dir.glob("driving_vision*_metadata.pkl"), None) + policy_meta = next(bundle_dir.glob("driving_policy*_metadata.pkl"), None) + has_onnx = (bundle_dir / "driving_vision.onnx").is_file() and (bundle_dir / "driving_policy.onnx").is_file() + if vision and policy and vision_meta and policy_meta and (has_onnx or not require_onnx): + found.append(bundle_dir) + if len(found) >= limit: + break + return found + + +def _seed_runner_inputs(runner: TinygradRunner) -> None: + for name, shape in runner.input_shapes.items(): + runner.inputs[name] = Tensor( + np.zeros(shape, dtype=np.float32), + device=runner.input_to_device[name], + dtype=runner.input_to_dtype[name], + ).realize() + + +def _bundle_for_dir(bundle_dir: Path) -> _Bundle: + vision = next(bundle_dir.glob("driving_vision*_tinygrad.pkl")) + policy = next(bundle_dir.glob("driving_policy*_tinygrad.pkl")) + vision_meta = next(bundle_dir.glob("driving_vision*_metadata.pkl")) + policy_meta = next(bundle_dir.glob("driving_policy*_metadata.pkl")) + return _Bundle([ + _Model(ModelType.vision, vision.name, vision_meta.name), + _Model(ModelType.policy, policy.name, policy_meta.name), + ]) + + +def _run_tinygrad_bundle(bundle_dir: Path, monkeypatch): + bundle = _bundle_for_dir(bundle_dir) + monkeypatch.setattr(bundle_helpers, "get_active_bundle", lambda params=None: bundle, raising=False) + monkeypatch.setattr(model_runner_mod, "get_active_bundle", lambda params=None: bundle, raising=False) + monkeypatch.setattr(model_runner_mod, "_fetch_bundle", lambda: bundle) + monkeypatch.setattr(tinygrad_runner_mod, "CUSTOM_MODEL_PATH", str(bundle_dir), raising=False) + monkeypatch.setattr(model_runner_mod, "CUSTOM_MODEL_PATH", str(bundle_dir), raising=False) + + vision_runner = TinygradRunner(ModelType.vision) + _seed_runner_inputs(vision_runner) + vision_outputs = vision_runner.run_model() + + policy_runner = TinygradRunner(ModelType.policy) + _seed_runner_inputs(policy_runner) + policy_outputs = policy_runner.run_model() + + return vision_outputs, policy_outputs + + +def _run_onnx_bundle(bundle_dir: Path): + vision_session = OnnxRunner(bundle_dir / "driving_vision.onnx") + policy_session = OnnxRunner(bundle_dir / "driving_policy.onnx") + + def seed_inputs(session): + seeded = {} + for name, spec in session.graph_inputs.items(): + dtype_text = str(spec.dtype).lower() + if "uchar" in dtype_text or "uint8" in dtype_text: + seeded[name] = Tensor(np.zeros(spec.shape, dtype=np.uint8)) + elif "half" in dtype_text or "float16" in dtype_text: + seeded[name] = Tensor(np.zeros(spec.shape, dtype=np.float16)) + else: + seeded[name] = Tensor(np.zeros(spec.shape, dtype=np.float32)) + return seeded + + return ( + vision_session(seed_inputs(vision_session))["outputs"].numpy().flatten(), + policy_session(seed_inputs(policy_session))["outputs"].numpy().flatten(), + ) + + +def test_three_selector_models_parse_via_share_onnx(): + if not SHARE_ROOT.is_dir(): + return + selector_dirs = _find_selector_dirs(limit=3, require_onnx=True) + assert len(selector_dirs) >= 3 + + for bundle_dir in selector_dirs: + vision_raw, policy_raw = _run_onnx_bundle(bundle_dir) + assert vision_raw.size > 0 + assert policy_raw.size > 0 + + +def test_selector_tinygrad_pkls_execute_when_host_compatible(monkeypatch): + if not SHARE_ROOT.is_dir(): + return + selector_dirs = _find_selector_dirs(limit=10) + attempted = 0 + executed = 0 + + for bundle_dir in selector_dirs: + attempted += 1 + try: + vision_outputs, policy_outputs = _run_tinygrad_bundle(bundle_dir, monkeypatch) + except AssertionError as exc: + if "Model was built on C3 or C3X" in str(exc): + continue + raise + except FileNotFoundError as exc: + if "/dev/kgsl-3d0" in str(exc): + continue + raise + except TypeError as exc: + if "DType.__init__()" in str(exc): + continue + raise + + assert "pose" in vision_outputs + assert "plan" in policy_outputs + executed += 1 + if executed >= 3: + break + + if executed == 0: + assert attempted > 0, "no selector bundles were inspected on the share" diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_selector_version_gate.py b/iqpilot/selfdrive/iqmodeld/tests/test_selector_version_gate.py new file mode 100644 index 000000000..73a9fe23b --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_selector_version_gate.py @@ -0,0 +1,31 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +The eMac bundles ship `minimum_selector_version = 17`, and the version +gate lives in the COMPILED private selector bundle, not in this repo. If that +bundle is rebuilt from stale source the gate still reads 16, every eMac bundle +is silently dropped as "too new", and the selector simply shows no eMac models +— with no error anywhere. Assert the effective gate instead, so a stale +private bundle fails here rather than on a device. +""" +from iqpilot.selfdrive.iqmodeld.emac_model_meta import EMAC_BUNDLE_MIN_SELECTOR_VERSION +from iqpilot.selfdrive.iqmodeld.models.helpers import is_bundle_version_compatible + + +def test_gate_accepts_the_version_our_emac_bundles_ship(): + assert is_bundle_version_compatible({"minimumSelectorVersion": EMAC_BUNDLE_MIN_SELECTOR_VERSION}), ( + f"the effective selector gate rejects minimumSelectorVersion=" + f"{EMAC_BUNDLE_MIN_SELECTOR_VERSION}; the private selector bundle is stale. " + f"Rebuild it from BOTH iqpilot/models_private_src/helpers.py " + f"(CURRENT_SELECTOR_VERSION) and fetcher.py (MANIFEST_VERSION)." + ) + + +def test_gate_still_accepts_older_bundles(): + # the window is a range, not a floor: bumping it must not orphan the existing catalogue + assert is_bundle_version_compatible({"minimumSelectorVersion": 12}) + assert is_bundle_version_compatible({"minimumSelectorVersion": 16}) + + +def test_gate_rejects_a_bundle_from_the_future(): + assert not is_bundle_version_compatible({"minimumSelectorVersion": EMAC_BUNDLE_MIN_SELECTOR_VERSION + 5}) diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_split_input_state.py b/iqpilot/selfdrive/iqmodeld/tests/test_split_input_state.py new file mode 100644 index 000000000..e2d54c017 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_split_input_state.py @@ -0,0 +1,131 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +eMac split-model "prepared input equivalence": SplitInputState must reproduce, +byte-exact, the queue semantics of compile_split_runtime's execute_bundle — +the real tinygrad reference graph run on CPU with stub vision/policy runners, +over a multi-frame random sequence with desire rising edges. +""" +from __future__ import annotations + +import os + +import numpy as np +import pytest + +os.environ.setdefault("DEV", "CPU") + +from iqpilot.selfdrive.iqmodeld.emac_input_state import EmacInputState, SplitInputState + +N_FRAMES_TEST = 30 +FRAME_SKIP = 4 +IMG_SHAPE = (1, 12, 16, 32) # small spatial dims: queue math is shape-generic +FB_SHAPE = (1, 25, 512) +DP_SHAPE = (1, 25, 8) +VISION_OUT_LEN = 1576 +HIDDEN_SLICE = slice(1064, 1576) + +VISION_SHAPES = {"img": IMG_SHAPE, "big_img": IMG_SHAPE} +POLICY_SHAPES = {"desire_pulse": DP_SHAPE, "traffic_convention": (1, 2), "features_buffer": FB_SHAPE} + + +class _StubRunner: + """Stands in for OnnxRunner inside execute_bundle: returns a preset output + and records the materialized inputs it was fed.""" + + def __init__(self, out_len: int): + self.out_len = out_len + self.next_output: np.ndarray | None = None + self.captured: dict[str, np.ndarray] | None = None + + def __call__(self, inputs): + from tinygrad import Tensor + self.captured = {k: v.numpy().copy() for k, v in inputs.items()} + out = self.next_output if self.next_output is not None else np.zeros((1, self.out_len), dtype=np.float32) + return {"outputs": Tensor(out.astype(np.float32))} + + +@pytest.fixture(scope="module") +def reference(): + from tinygrad import Tensor + from iqpilot.selfdrive.iqmodeld.tools.compile_split_runtime import _role_executor + + meta_by_role = { + "vision": {"input_shapes": dict(VISION_SHAPES), "output_slices": {"hidden_state": HIDDEN_SLICE}}, + "policy": {"input_shapes": dict(POLICY_SHAPES), "output_slices": {}}, + } + vision, policy = _StubRunner(VISION_OUT_LEN), _StubRunner(1000) + execute_bundle = _role_executor({"vision": vision, "policy": policy}, meta_by_role, FRAME_SKIP) + + feat_q = Tensor(np.zeros((FRAME_SKIP * (FB_SHAPE[1] - 1) + 1, FB_SHAPE[0], FB_SHAPE[2]), dtype=np.float32), + device="CPU").contiguous().realize() + desire_q = Tensor(np.zeros((FRAME_SKIP * DP_SHAPE[1], DP_SHAPE[0], DP_SHAPE[2]), dtype=np.float32), + device="CPU").contiguous().realize() + return execute_bundle, feat_q, desire_q, vision, policy + + +def test_split_inputs_match_tinygrad_reference(reference): + from tinygrad import Tensor + + execute_bundle, feat_q, desire_q, vision_stub, policy_stub = reference + rng = np.random.default_rng(4321) + state = SplitInputState(FRAME_SKIP, IMG_SHAPE, FB_SHAPE, DP_SHAPE) + ref_prev_desire = np.zeros(DP_SHAPE[2], dtype=np.float32) + + for frame in range(N_FRAMES_TEST): + warped = rng.integers(0, 256, (2, 6, IMG_SHAPE[2], IMG_SHAPE[3]), dtype=np.int64).astype(np.uint8) + raw_desire = np.zeros(DP_SHAPE[2], dtype=np.float32) + if frame % 3: + raw_desire[int(rng.integers(0, DP_SHAPE[2]))] = 1.0 + traffic = rng.standard_normal((1, 2)).astype(np.float32) + vision_out = rng.standard_normal((1, VISION_OUT_LEN)).astype(np.float32) + vision_stub.next_output = vision_out + + # --- ours --- + vis_inputs = state.materialize_vision(warped, raw_desire) + pol_inputs = state.materialize_policy(vision_out[0, HIDDEN_SLICE], traffic[0]) + + # --- reference graph: rising edge happens outside execute_bundle (run_fused) --- + cur = raw_desire.copy() + cur[0] = 0 + ref_pulse = np.where(cur - ref_prev_desire > 0.99, cur, 0).astype(np.float32) + ref_prev_desire[:] = cur + + execute_bundle( + img=Tensor(vis_inputs["img"], device="CPU").realize(), + big_img=Tensor(vis_inputs["big_img"], device="CPU").realize(), + feat_q=feat_q, desire_q=desire_q, + desire=Tensor(ref_pulse, device="CPU").realize(), + traffic_convention=Tensor(traffic, device="CPU").realize(), + action_t=Tensor(np.zeros((1, 2), dtype=np.float32), device="CPU").realize(), + ) + ref = policy_stub.captured + assert ref is not None + + assert ref["features_buffer"].tobytes() == pol_inputs["features_buffer"].tobytes(), f"features frame {frame}" + assert ref["desire_pulse"].tobytes() == pol_inputs["desire_pulse"].tobytes(), f"desire frame {frame}" + assert ref["traffic_convention"].tobytes() == pol_inputs["traffic_convention"].tobytes() + # vision saw exactly what our img queues materialized + vref = vision_stub.captured + assert vref["img"].tobytes() == vis_inputs["img"].tobytes(), f"img frame {frame}" + assert vref["big_img"].tobytes() == vis_inputs["big_img"].tobytes(), f"big_img frame {frame}" + + +def test_split_img_queue_matches_fused_state(): + # img/desire mechanics are shared with the fused mirror: same warps must + # materialize identical img/big_img in both states + rng = np.random.default_rng(7) + fused_spec = { + "img": (IMG_SHAPE, "uint8"), "big_img": (IMG_SHAPE, "uint8"), + "desire_pulse": (DP_SHAPE, "float32"), "traffic_convention": ((1, 2), "float32"), + "features_buffer": ((1, 24, 512), "float32"), "action_t": ((1, 2), "float32"), + } + fused = EmacInputState(FRAME_SKIP, fused_spec) + split = SplitInputState(FRAME_SKIP, IMG_SHAPE, FB_SHAPE, DP_SHAPE) + for _ in range(12): + warped = rng.integers(0, 256, (2, 6, IMG_SHAPE[2], IMG_SHAPE[3]), dtype=np.int64).astype(np.uint8) + desire = np.zeros(DP_SHAPE[2], dtype=np.float32) + f = fused.push_and_materialize(warped, desire, np.zeros(2, dtype=np.float32), np.zeros(2, dtype=np.float32)) + s = split.materialize_vision(warped, desire) + assert f["img"].tobytes() == s["img"].tobytes() + assert f["big_img"].tobytes() == s["big_img"].tobytes() diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_supercombo_runner_guards.py b/iqpilot/selfdrive/iqmodeld/tests/test_supercombo_runner_guards.py new file mode 100644 index 000000000..66b74f1ba --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_supercombo_runner_guards.py @@ -0,0 +1,254 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import hashlib +from pathlib import Path + +import pytest + +from iqpilot.cereal import custom +from iqpilot.selfdrive.iqmodeld.models import helpers as model_helpers +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad import supercombo_runner as supercombo_runner_mod +from iqpilot.selfdrive.iqmodeld.models.runners.tinygrad.supercombo_runner import ( + TinygradSupercomboRunner, +) + + +class _Captured: + def __init__(self, expected_names): + self.expected_names = expected_names + + +class _FakeJit: + def __init__(self, expected_names): + self.captured = _Captured(expected_names) + + +class _Boom: + def __init__(self, err: Exception): + self.err = err + + def __call__(self, *args, **kwargs): + raise self.err + + +class _FakeParams: + def __init__(self, active_bundle=None): + self.store = {} + if active_bundle is not None: + self.store["ModelManager_ActiveBundle"] = active_bundle + + def get(self, key): + return self.store.get(key) + + def put(self, key, value): + self.store[key] = value + + def remove(self, key): + self.store.pop(key, None) + + +def test_verify_artifact_file_deletes_stale_cached_pkl(tmp_path: Path): + pkl_path = tmp_path / "driving_supercombo_guard.pkl" + pkl_path.write_bytes(b"stale-pkl") + + runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner) + runner._pkl_path = str(pkl_path) + runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest() + + with pytest.raises(RuntimeError, match="SHA mismatch"): + runner._verify_artifact_file() + + assert not pkl_path.exists() + + +def test_validate_jit_names_accepts_current_runtime_contract(): + runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner) + runner._pkl_path = "/tmp/does-not-matter.pkl" + runner._expected_sha256 = "" + runner._run_policy = _FakeJit(['warped', 'img_q', 'big_img_q', 'feat_q', 'desire_q', 'packed_npy_inputs']) + runner._warp_jits = { + (1344, 760): _FakeJit(['tfm', 'big_tfm', 'frame', 'big_frame']), + } + + runner._validate_jit_names() + + +def test_validate_jit_names_raises_clear_error_for_contract_mismatch(): + runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner) + runner._pkl_path = "/tmp/does-not-matter.pkl" + runner._expected_sha256 = "" + runner._run_policy = _FakeJit(['img', 'big_img', 'feat_q', 'desire_q', 'desire', 'traffic_convention', 'action_t']) + runner._warp_jits = { + (1344, 760): _FakeJit(['img_q', 'big_img_q', 'tfm', 'big_tfm', 'frame', 'big_frame']), + } + + with pytest.raises(RuntimeError, match="JIT argument mismatch"): + runner._validate_jit_names() + + +def test_handle_runtime_jit_mismatch_deletes_stale_cached_pkl(tmp_path: Path): + pkl_path = tmp_path / "driving_supercombo_guard.pkl" + pkl_path.write_bytes(b"stale-pkl") + + runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner) + runner._pkl_path = str(pkl_path) + runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest() + + with pytest.raises(RuntimeError, match="runtime JIT mismatch with stale cached SHA"): + runner._handle_runtime_jit_mismatch(RuntimeError("args mismatch in JIT: stale bundle")) + + assert not pkl_path.exists() + + +def test_handle_runtime_jit_mismatch_raises_clear_error_without_sha_mismatch(tmp_path: Path): + pkl_path = tmp_path / "driving_supercombo_guard.pkl" + pkl_path.write_bytes(b"fresh-pkl") + + runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner) + runner._pkl_path = str(pkl_path) + runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest() + + with pytest.raises(RuntimeError, match="runtime JIT mismatch"): + runner._handle_runtime_jit_mismatch(RuntimeError("args mismatch in JIT: wrong contract")) + + +def test_schedule_active_bundle_redownload_sets_download_index(monkeypatch: pytest.MonkeyPatch): + params = _FakeParams({"index": 81}) + monkeypatch.setattr(supercombo_runner_mod, "Params", lambda: params) + + runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner) + msg = runner._schedule_active_bundle_redownload() + + assert params.get("ModelManager_DownloadIndex") == "81" + assert msg == "; scheduled automatic re-download of the active model" + + +def test_no_active_bundle_seeds_default_tinygrad(monkeypatch: pytest.MonkeyPatch): + monkeypatch.setattr(model_helpers, "ensure_default_model_files", lambda *a, **k: None) + params = _FakeParams() + + runner = model_helpers.get_active_model_runner(params) + + assert runner == custom.IQModelManager.Runner.tinygrad + active = params.get("ModelManager_ActiveBundle") + assert active is not None and active.get("ref") == "default" + + +def test_select_default_model_clears_custom_download_state(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): + pending_restore = tmp_path / "pending_model_restore" + pending_restore.write_text("Pop") + monkeypatch.setattr(model_helpers, "_PENDING_MODEL_RESTORE_FILE", str(pending_restore)) + monkeypatch.setattr(model_helpers, "ensure_default_model_files", lambda *a, **k: None) + + params = _FakeParams({"index": 81, "ref": "pop"}) + params.put("ModelManager_DownloadIndex", "81") + params.put("ModelRunnerTypeCache", int(custom.IQModelManager.Runner.tinygrad)) + + model_helpers.select_default_model(params) + + assert params.get("ModelManager_DownloadIndex") is None + active = params.get("ModelManager_ActiveBundle") + assert active is not None and active.get("ref") == "default" + assert int(params.get("ModelRunnerTypeCache")) == int(custom.IQModelManager.Runner.tinygrad) + assert not pending_restore.exists() + + +def test_seed_default_bundle_runs_while_a_download_is_queued(monkeypatch: pytest.MonkeyPatch): + monkeypatch.setattr(model_helpers, "ensure_default_model_files", lambda *a, **k: None) + + params = _FakeParams() + params.put("ModelManager_DownloadIndex", "81") + + model_helpers.seed_default_bundle_if_unset(params) + + active = params.get("ModelManager_ActiveBundle") + assert active is not None and active.get("ref") == "default" + assert params.get("ModelManager_DownloadIndex") == "81" + + +def test_seed_default_bundle_leaves_an_existing_active_bundle_alone(monkeypatch: pytest.MonkeyPatch): + monkeypatch.setattr(model_helpers, "ensure_default_model_files", lambda *a, **k: None) + + params = _FakeParams({"index": 81, "ref": "pop"}) + params.put("ModelManager_DownloadIndex", "81") + + model_helpers.seed_default_bundle_if_unset(params) + + assert params.get("ModelManager_ActiveBundle").get("ref") == "pop" + assert params.get("ModelManager_DownloadIndex") == "81" + + +def test_default_model_is_not_resolved_to_manifest_pop_bundle(): + pop_bundle = type("Bundle", (), {"internalName": "Pop (Default)", "displayName": "Pop (Default)"})() + + assert model_helpers.get_default_model_bundle([pop_bundle]) is None + + +def test_verify_artifact_file_schedules_redownload_for_stale_cached_pkl(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): + params = _FakeParams({"index": 81}) + monkeypatch.setattr(supercombo_runner_mod, "Params", lambda: params) + + pkl_path = tmp_path / "driving_supercombo_guard.pkl" + pkl_path.write_bytes(b"stale-pkl") + + runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner) + runner._pkl_path = str(pkl_path) + runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest() + + with pytest.raises(RuntimeError, match="scheduled automatic re-download"): + runner._verify_artifact_file() + + assert params.get("ModelManager_DownloadIndex") == "81" + assert not pkl_path.exists() + + +def test_run_fused_converts_raw_warp_jit_mismatch_to_runtime_error(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): + pkl_path = tmp_path / "driving_supercombo_guard.pkl" + pkl_path.write_bytes(b"fresh-pkl") + + runner = TinygradSupercomboRunner.__new__(TinygradSupercomboRunner) + runner._pkl_path = str(pkl_path) + runner._expected_sha256 = hashlib.sha256(b"fresh-pkl").hexdigest() + runner._frame_skip = 4 + runner._cam = (1344, 760) + runner._queues = { + "tfm": object(), + "big_tfm": object(), + "img_q": object(), + "big_img_q": object(), + "feat_q": object(), + "desire_q": object(), + "packed_npy_inputs": object(), + } + runner._npy = { + "tfm": [0.0], + "big_tfm": [0.0], + "desire": [0.0], + "prev_feat": [0.0], + } + runner._prev_desire = [0.0] + runner._warp_jits = { + (1344, 760): _Boom(RuntimeError("args mismatch in JIT: self.captured.expected_names=['big_frame'] != ['frame']")), + } + runner._run_policy = _FakeJit(["warped", "img_q", "big_img_q", "feat_q", "desire_q", "packed_npy_inputs"]) + runner._hidden_slice = slice(0, 1) + runner._slices = {"out": slice(0, 1)} + runner._parser = type("P", (), {"parse_vision_outputs": staticmethod(lambda sliced: sliced)})() + runner._frame_tensor = lambda *args, **kwargs: object() + + monkeypatch.setattr(TinygradSupercomboRunner, "_ensure_queues", lambda self, cam_w, cam_h: None) + + class _Buf: + width = 1344 + height = 760 + data = memoryview(b"\x00") + + with pytest.raises(RuntimeError, match="runtime JIT mismatch"): + runner.run_fused( + {"img": _Buf(), "big_img": _Buf()}, + {"img": [0.0], "big_img": [0.0]}, + {}, + ) diff --git a/iqpilot/selfdrive/iqmodeld/tests/test_temporal_replay.py b/iqpilot/selfdrive/iqmodeld/tests/test_temporal_replay.py new file mode 100644 index 000000000..b73b17f4e --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/test_temporal_replay.py @@ -0,0 +1,155 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +from dataclasses import dataclass +from types import SimpleNamespace + +import numpy as np +import pytest + +import iqpilot.selfdrive.iqmodeld.models.helpers as bundle_helpers +import iqpilot.selfdrive.iqmodeld.models.runners.model_runner as runner_helpers +import iqpilot.selfdrive.iqmodeld.daemon as iqmodeld_daemon + + +@dataclass +class StubOverride: + key: str + value: str + + +class StubBundle: + def __init__(self, generation: int = 10): + self.overrides = [StubOverride("lat", ".1"), StubOverride("long", ".3")] + self.generation = generation + + +class StubRunner: + def __init__(self, input_shapes: dict[str, tuple[int, ...]]) -> None: + self.input_shapes = input_shapes + self.constants = SimpleNamespace( + FULL_HISTORY_BUFFER_LEN=100, + FEATURE_LEN=512, + DESIRE_LEN=8, + PREV_DESIRED_CURV_LEN=1, + INPUT_HISTORY_BUFFER_LEN=25, + TEMPORAL_SKIP=4, + ) + self.vision_input_names: list[str] = [] + self.is_20hz = input_shapes.get(next(iter(input_shapes)), (1, 0, 0))[1] == 25 + + def prepare_inputs(self, imgs_cl, numpy_inputs, frames): + return None + + def run_model(self): + return { + "hidden_state": np.zeros((1, self.constants.FEATURE_LEN), dtype=np.float32), + "desired_curvature": np.zeros((1, 1), dtype=np.float32), + } + + +def _install_runtime(monkeypatch: pytest.MonkeyPatch, shapes: dict[str, tuple[int, ...]], generation: int = 10): + bundle = StubBundle(generation=generation) + runner = StubRunner(shapes) + monkeypatch.setattr(bundle_helpers, "get_active_bundle", lambda params=None: bundle, raising=False) + monkeypatch.setattr(runner_helpers, "get_model_runner", lambda: runner, raising=False) + monkeypatch.setattr(iqmodeld_daemon, "get_active_bundle", lambda params=None: bundle, raising=False) + monkeypatch.setattr(iqmodeld_daemon, "get_model_runner", lambda: runner, raising=False) + return iqmodeld_daemon.NeuralEngineState(None), runner + + +def _expected_selector_indices(shape: tuple[int, ...], mode: str) -> np.ndarray | None: + if mode == "split": + full = 100 + return np.arange(full)[-1 - (4 * (25 - 1))::4] + if mode == "20hz": + step = int(-100 / shape[1]) + return np.arange(step, step * (shape[1] + 1), step)[::-1] + if mode == "dense": + return np.arange(shape[1]) + return None + + +@pytest.mark.parametrize( + ("shapes", "mode"), + [ + ({"desire": (1, 100, 8), "features_buffer": (1, 99, 512), "prev_desired_curv": (1, 100, 1)}, "dense"), + ({"desire": (1, 25, 8), "features_buffer": (1, 24, 512)}, "20hz"), + ({"desire_pulse": (1, 25, 8), "features_buffer": (1, 25, 512)}, "split"), + ], +) +def test_replay_ledger_layout_matches_expected_history(monkeypatch: pytest.MonkeyPatch, + shapes: dict[str, tuple[int, ...]], + mode: str): + state, _runner = _install_runtime(monkeypatch, shapes) + + for tensor_name, tensor_shape in shapes.items(): + history = state.temporal_buffers.get(tensor_name) + selector = state.temporal_idxs_map.get(tensor_name) + if history is None: + continue + + if mode == "dense": + expected_shape = (1, tensor_shape[1], tensor_shape[2]) + else: + expected_shape = (1, 100, tensor_shape[2]) + + assert history.shape == expected_shape + expected_selector = _expected_selector_indices(tensor_shape, mode) + if expected_selector is None: + assert selector is None or selector.size == 0 + else: + assert np.array_equal(selector, expected_selector) + + +def test_replay_ledger_rising_edge_and_hidden_state_updates(monkeypatch: pytest.MonkeyPatch): + state, runner = _install_runtime(monkeypatch, { + "desire": (1, 100, 8), + "features_buffer": (1, 99, 512), + "prev_desired_curv": (1, 100, 1), + }) + + pulse = np.zeros(8, dtype=np.float32) + pulse[3] = 1.0 + state.run({}, {}, {"desire": pulse}) + first_export = state.numpy_inputs["desire"].copy() + assert np.count_nonzero(first_export) == 1 + + state.run({}, {}, {"desire": pulse}) + second_export = state.numpy_inputs["desire"].copy() + assert np.count_nonzero(second_export) == 1 + assert second_export[0, -1, 3] == 0.0 + + hidden_value = np.arange(runner.constants.FEATURE_LEN, dtype=np.float32) + + def hidden_state_run(): + return { + "hidden_state": hidden_value.reshape(1, -1), + "desired_curvature": np.array([[0.25]], dtype=np.float32), + } + + state.model_runner.run_model = hidden_state_run + state.run({}, {}, {"desire": np.zeros(8, dtype=np.float32)}) + + np.testing.assert_allclose(state.numpy_inputs["features_buffer"][0, -1], hidden_value, rtol=0, atol=0) + assert state.numpy_inputs["prev_desired_curv"][0, -1, 0] == pytest.approx(0.25) + + +def test_replay_ledger_zeroes_feedback_for_mlsim_generation(monkeypatch: pytest.MonkeyPatch): + state, _runner = _install_runtime(monkeypatch, { + "desire": (1, 100, 8), + "features_buffer": (1, 99, 512), + "prev_desired_curv": (1, 100, 1), + }, generation=11) + + def ml_run(): + return { + "hidden_state": np.zeros((1, 512), dtype=np.float32), + "desired_curvature": np.array([[1.5]], dtype=np.float32), + } + + state.model_runner.run_model = ml_run + state.run({}, {}, {"desire": np.zeros(8, dtype=np.float32)}) + assert np.count_nonzero(state.numpy_inputs["prev_desired_curv"]) == 0 diff --git a/iqpilot/selfdrive/iqmodeld/tests/tf_test/build.sh b/iqpilot/selfdrive/iqmodeld/tests/tf_test/build.sh new file mode 100755 index 000000000..27a80bb65 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/tf_test/build.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +set -euo pipefail + +TF_ROOT="${TF_ROOT:-/home/batman/one/external/tensorflow}" +TF_INCLUDE_DIR="${TF_INCLUDE_DIR:-$TF_ROOT/include}" +TF_LIB_DIR="${TF_LIB_DIR:-$TF_ROOT/lib}" +CXX="${CXX:-clang++}" + +exec "$CXX" \ + -std=c++17 \ + -I "$TF_INCLUDE_DIR" \ + -L "$TF_LIB_DIR" \ + -Wl,-rpath="$TF_LIB_DIR" \ + main.cc \ + -ltensorflow diff --git a/iqpilot/selfdrive/iqmodeld/tests/tf_test/pb_loader.py b/iqpilot/selfdrive/iqmodeld/tests/tf_test/pb_loader.py new file mode 100755 index 000000000..11a78693c --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/tf_test/pb_loader.py @@ -0,0 +1,32 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import tensorflow as tf + + +def _load_graph_bytes(graph_path: Path) -> bytes: + return graph_path.read_bytes() + + +def _parse_graph(graph_path: Path) -> tf.compat.v1.GraphDef: + graph = tf.compat.v1.GraphDef() + graph.ParseFromString(_load_graph_bytes(graph_path)) + return graph + + +def main(argv: list[str]) -> int: + if len(argv) < 2: + print("Usage: pb_loader.py ") + return 1 + _parse_graph(Path(argv[1])) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) diff --git a/iqpilot/selfdrive/iqmodeld/tests/timing/benchmark.py b/iqpilot/selfdrive/iqmodeld/tests/timing/benchmark.py new file mode 100755 index 000000000..cf3a23417 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tests/timing/benchmark.py @@ -0,0 +1,54 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import os +import time + +import numpy as np + +import iqpilot.cereal.messaging as messaging +from iqpilot.system.manager.process_config import managed_processes + +RUN_COUNT = int(os.getenv("N", "5")) +WINDOW_SECONDS = int(os.getenv("TIME", "30")) +WARMUP_MESSAGES = 10 + + +def _collect_execution_samples(sock, duration_s: int) -> np.ndarray: + samples: list[float] = [] + deadline = time.monotonic() + duration_s + while time.monotonic() < deadline: + for message in messaging.drain_sock(sock, wait_for_one=True): + samples.append(message.modelV2.modelExecutionTime) + return np.array(samples[WARMUP_MESSAGES:]) * 1000.0 + + +def _single_benchmark_pass(sock) -> np.ndarray: + os.environ["LOGPRINT"] = "debug" + managed_processes["modeld"].start() + time.sleep(5) + try: + return _collect_execution_samples(sock, WINDOW_SECONDS) + finally: + managed_processes["modeld"].stop() + + +def _report_run(index: int, values_ms: np.ndarray) -> None: + print( + f"run {index}: avg={values_ms.mean():0.2f}ms " + f"min={values_ms.min():0.2f}ms max={values_ms.max():0.2f}ms" + ) + + +if __name__ == "__main__": + subscriber = messaging.sub_sock("modelV2", conflate=False, timeout=1000) + all_runs = [_single_benchmark_pass(subscriber) for _ in range(RUN_COUNT)] + + print("\n") + print(f"ran modeld {RUN_COUNT} times for {WINDOW_SECONDS}s each") + for index, values_ms in enumerate(all_runs, start=1): + _report_run(index, values_ms) + print("\n") diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_daemon.py b/iqpilot/selfdrive/iqmodeld/tools/compile_daemon.py new file mode 100644 index 000000000..13da9374e --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/compile_daemon.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +from iqpilot.selfdrive.iqmodeld.tools.daemon_jit_compiler import main + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_egpu_model.py b/iqpilot/selfdrive/iqmodeld/tools/compile_egpu_model.py new file mode 100644 index 000000000..873a7b498 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/compile_egpu_model.py @@ -0,0 +1,333 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import argparse +import gc +import os +import pickle +import sys +import time + +os.environ.setdefault("FLOAT16", "1") +os.environ.setdefault("JIT_BATCH_SIZE", "0") +os.environ.setdefault("GMMU", "0") +# TC_OPT=2 lets tinygrad pick tensor-core kernels; on some models a TC kernel miscompiles and biases +# the output (documented on Metal). A parity gate below catches it and re-compiles with TC off. +os.environ.setdefault("TC_OPT", "0" if ("--tc-off" in sys.argv or os.environ.get("IQ_EGPU_TC_OFF")) else "2") + +HOST = "--host" in sys.argv +if HOST: + from iqpilot.selfdrive.iqmodeld.tools.egpu_host_mock import DEFAULT_ARCH, activate + activate(sys.argv[sys.argv.index("--arch") + 1] if "--arch" in sys.argv else DEFAULT_ARCH) +os.environ.setdefault("DEV", "USB+AMD:LLVM") + +import numpy as np + +from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_pkl_path, local_onnx, patch_tinygrad_fetch_fw +from iqpilot.selfdrive.iqmodeld.egpu_model import EGPU_MODELS, get_egpu_model, resolve_egpu_model +from iqpilot.selfdrive.iqmodeld.temporal_state import MODEL_INPUT_SPEC, spec_from_meta + +INPUT_SPEC = dict(MODEL_INPUT_SPEC) + +patch_tinygrad_fetch_fw() + +SEED = 42 + + +class _ParityFail(RuntimeError): + pass +KERNEL_PROGRESS_SCALE = 260.0 + + +def _progress_sampler(param: str, base: float, span: float, stop) -> None: + import math + + from iqpilot.common.params import Params + from tinygrad.helpers import GlobalCounters + pm = Params() + last = -1.0 + while not stop.wait(0.5): + kernels = float(getattr(GlobalCounters, "kernel_count", 0)) + value = base + span * (1.0 - math.exp(-kernels / KERNEL_PROGRESS_SCALE)) + if value - last >= 0.01: + last = value + pm.put(param, f"{min(base + span, value):.3f}") + + +def set_input_spec(meta: dict) -> None: + spec = spec_from_meta(meta) + if spec is not None: + INPUT_SPEC.clear() + INPUT_SPEC.update(spec) + + +def make_run_model(model_runner): + def run_model(**inputs): + out = next(iter(model_runner({k: inputs[k] for k in INPUT_SPEC}).values())).cast("float32") + return out.reshape(-1), + return run_model + + +def _random_inputs(seed: int): + from tinygrad.device import Device + from tinygrad.tensor import Tensor + rng = np.random.default_rng(seed) + out = {} + for name, (shape, dtype) in INPUT_SPEC.items(): + if dtype == "uint8": + arr = rng.integers(0, 256, shape).astype(np.uint8) + else: + arr = rng.standard_normal(shape).astype(np.float32) + out[name] = Tensor(arr, device=Device.DEFAULT).realize() + return out + + +def _run(fn, seed: int) -> np.ndarray: + from tinygrad.device import Device + st = time.perf_counter() + outs = fn(**_random_inputs(seed)) + Device.default.synchronize() + print(f" run(seed={seed}) {(time.perf_counter() - st) * 1e3:6.1f} ms") + return outs[0].numpy().reshape(-1) + + +def compile_model(meta: dict, onnx_path: str, out_path: str) -> str: + from tinygrad.device import Device + from tinygrad.engine.jit import TinyJit + from tinygrad.nn.onnx import OnnxRunner + + if meta.get("split"): + raise RuntimeError(f"model {meta['key']} is a split model; eGPU v1 compiles fused models only") + + jit = TinyJit(make_run_model(OnnxRunner(onnx_path)), prune=True) + + print("capture + replay") + for _ in range(2): + baseline = _run(jit, SEED) + if baseline.shape[0] != meta["output_len"]: + raise RuntimeError(f"model output length {baseline.shape[0]} != registry {meta['output_len']}") + if not np.isfinite(baseline).all(): + raise RuntimeError("compiled model produced non-finite outputs") + + bundle = { + "run_model": jit, + "model_key": meta["key"], + "model_sha256": meta["sha256"], + "output_len": int(meta["output_len"]), + "frame_skip": int(meta["frame_skip"]), + "input_spec": {name: (tuple(shape), dtype) for name, (shape, dtype) in INPUT_SPEC.items()}, + "input_device": Device.DEFAULT, + } + os.makedirs(os.path.dirname(out_path), exist_ok=True) + tmp = out_path + ".part" + print("serialize") + with open(tmp, "wb") as f: + pickle.dump(bundle, f, protocol=pickle.HIGHEST_PROTOCOL) + + del bundle, jit + gc.collect() + + print("reload + validate") + with open(tmp, "rb") as f: + jit = pickle.load(f)["run_model"] + if not np.array_equal(_run(jit, SEED), baseline): + raise RuntimeError("outputs differ from baseline after pickle round trip") + if np.array_equal(_run(jit, SEED + 1), baseline): + raise RuntimeError("outputs insensitive to inputs after pickle round trip") + + from tinygrad.tensor import Tensor + zeros = {name: Tensor(np.zeros(shape, dtype=dtype), device=Device.DEFAULT).realize() + for name, (shape, dtype) in INPUT_SPEC.items()} + flat = jit(**zeros)[0].numpy().reshape(-1) + from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + from iqpilot.selfdrive.iqmodeld.tools.compile_supercombo import _slice_outputs, _validate_pose_outputs + _validate_pose_outputs(PhaseParser().parse_vision_outputs(_slice_outputs(flat, meta["output_slices"]))) + + os.replace(tmp, out_path) + return out_path + + +def _policy_frame(seed: int, input_spec: dict): + from tinygrad.tensor import Tensor + rng = np.random.default_rng(seed) + img = input_spec["img"][0] + warped = Tensor(rng.integers(0, 256, (2, 6, img[2], img[3])).astype(np.uint8), device="NPY").realize() + return warped + + +def _tc_off_reference(onnx_path: str, meta: dict): + """Compile+run the model with tensor cores OFF in a child process and return the last of 3 + policy frames. This is the trusted reference: TC-off kernels are the conservative path the + eMac gate also trusts. Used to catch a TC kernel miscompile that would bias steering.""" + import subprocess + import tempfile + with tempfile.TemporaryDirectory() as td: + ref = os.path.join(td, "ref.npy") + env = {k: v for k, v in os.environ.items() if k not in ("TC_OPT", "BEAM")} + env["TC_OPT"] = "0" + env["IQ_EGPU_REFERENCE"] = ref + r = subprocess.run([sys.executable, "-m", "iqpilot.selfdrive.iqmodeld.tools.compile_egpu_model", + "--model", meta["key"], "--onnx", onnx_path, "--tc-off"], + env=env, capture_output=True, text=True, timeout=14400) + if r.returncode != 0 or not os.path.isfile(ref): + raise RuntimeError(f"parity reference compile failed:\n{r.stderr[-2000:]}") + return np.load(ref) + + +def compile_policy_model(meta: dict, onnx_path: str, out_path: str) -> str: + from tinygrad.device import Device + from tinygrad.engine.jit import TinyJit + from tinygrad.nn.onnx import OnnxRunner + + from iqpilot.selfdrive.iqmodeld.egpu_policy import POLICY_FORMAT, PackedInputs, dump_oob, load_bundle, make_queues, make_run_policy + + if meta.get("split"): + raise RuntimeError(f"model {meta['key']} is a split model; eGPU compiles fused models only") + input_spec = {name: (tuple(shape), dtype) for name, (shape, dtype) in INPUT_SPEC.items()} + frame_skip = int(meta["frame_skip"]) + device = Device.DEFAULT + jit = TinyJit(make_run_policy(OnnxRunner(onnx_path), input_spec, frame_skip, device), prune=True) + queues = make_queues(input_spec, frame_skip, device) + packed = PackedInputs(input_spec) + + def step(seed: int) -> np.ndarray: + packed.views["traffic_convention"][:] = [1, 0] + packed.views["action_t"][:] = [0.2, 0.3] + st = time.perf_counter() + out, = jit(warped=_policy_frame(seed, input_spec), packed_npy_inputs=packed.tensor, **queues) + flat = out.numpy().reshape(-1) + print(f" policy step(seed={seed}) {(time.perf_counter() - st) * 1e3:6.1f} ms") + packed.views["prev_feat"][:] = flat[meta["output_slices"]["hidden_state"]].reshape(packed.views["prev_feat"].shape) + return flat + + print("capture + replay") + for i in range(3): + baseline = step(SEED + i) + if baseline.shape[0] != meta["output_len"]: + raise RuntimeError(f"model output length {baseline.shape[0]} != registry {meta['output_len']}") + if not HOST and not np.isfinite(baseline).all(): + raise RuntimeError("compiled policy produced non-finite outputs") + + bundle = { + "format": POLICY_FORMAT, + "run_policy": jit, + "model_key": meta["key"], + "model_sha256": meta["sha256"], + "output_len": int(meta["output_len"]), + "frame_skip": frame_skip, + "input_spec": input_spec, + "input_device": device, + } + os.makedirs(os.path.dirname(out_path), exist_ok=True) + tmp = out_path + ".part" + print("serialize (out-of-band buffers)") + with open(tmp, "wb") as f: + dump_oob(bundle, f) + + del bundle, jit, queues, packed + gc.collect() + + print("reload + validate") + jit = load_bundle(tmp)["run_policy"] + queues = make_queues(input_spec, frame_skip, device) + packed = PackedInputs(input_spec) + outs = [] + for i in range(3): + packed.views["traffic_convention"][:] = [1, 0] + packed.views["action_t"][:] = [0.2, 0.3] + out, = jit(warped=_policy_frame(SEED + i, input_spec), packed_npy_inputs=packed.tensor, **queues) + flat = out.numpy().reshape(-1) + packed.views["prev_feat"][:] = flat[meta["output_slices"]["hidden_state"]].reshape(packed.views["prev_feat"].shape) + outs.append(flat) + ref_target = os.environ.get("IQ_EGPU_REFERENCE") + if ref_target: + np.save(ref_target, outs[-1]) + return out_path + if HOST: + os.replace(tmp, out_path) + return out_path + if not np.array_equal(outs[-1], baseline): + raise RuntimeError("policy outputs differ from baseline after pickle round trip") + if np.array_equal(outs[0], outs[-1]): + raise RuntimeError("policy outputs insensitive to inputs after pickle round trip") + if not all(np.isfinite(o).all() for o in outs): + raise RuntimeError("reloaded policy produced non-finite outputs") + from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + from iqpilot.selfdrive.iqmodeld.tools.compile_supercombo import _slice_outputs, _validate_pose_outputs + _validate_pose_outputs(PhaseParser().parse_vision_outputs(_slice_outputs(outs[-1], meta["output_slices"]))) + + if os.environ.get("TC_OPT") != "0" and not os.environ.get("IQ_EGPU_SKIP_PARITY"): + ref = _tc_off_reference(onnx_path, meta) + rel = float(np.abs(outs[-1] - ref).mean() / max(1e-3, float(np.abs(ref).mean()))) + if rel > 0.01: + raise _ParityFail(f"PARITY FAIL: TC kernels miscompiled {meta['key']} (rel={rel:.4f} vs TC-off); recompiling with tensor cores disabled") + print(f" parity vs TC-off reference: rel={rel:.6f} OK") + + os.replace(tmp, out_path) + return out_path + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--model", default=None, help=f"registry key, one of {sorted(EGPU_MODELS)}") + p.add_argument("--onnx", default=None) + p.add_argument("--output", default=None) + p.add_argument("--progress-param", default=None) + p.add_argument("--progress-base", type=float, default=None) + p.add_argument("--progress-span", type=float, default=0.0) + p.add_argument("--format", type=int, default=2, choices=(1, 2)) + p.add_argument("--host", action="store_true", help="compile on a mock dock (no AMD hardware); outputs need a dock parity gate") + p.add_argument("--arch", default=None, help="target gfx arch for --host") + p.add_argument("--tc-off", action="store_true", help="disable tensor-core kernels (conservative; auto-set on parity failure)") + args = p.parse_args() + if args.host and args.format != 2: + raise SystemExit("--host supports format 2 only") + + if args.model is not None: + if args.model in EGPU_MODELS: + meta = get_egpu_model(args.model) + else: + from iqpilot.common.params import Params + meta = resolve_egpu_model(Params(), args.model) + if meta is None: + raise SystemExit(f"unknown model {args.model!r}: not a built-in ({sorted(EGPU_MODELS)}) and not in the synced catalog") + else: + meta = get_egpu_model() + set_input_spec(meta) + + onnx_path = args.onnx or local_onnx(meta) + if onnx_path is None or not os.path.isfile(onnx_path): + raise SystemExit(f"onnx not found for {meta['key']}; pass --onnx or let iqegpumodeld download it first") + + stop = None + sampler = None + if args.progress_param and args.progress_base is not None: + import threading + stop = threading.Event() + sampler = threading.Thread(target=_progress_sampler, + args=(args.progress_param, args.progress_base, args.progress_span, stop), + daemon=True) + sampler.start() + try: + build = compile_policy_model if args.format == 2 else compile_model + try: + out = build(meta, onnx_path, args.output or egpu_pkl_path(meta)) + except _ParityFail as e: + if os.environ.get("TC_OPT") == "0" or args.format != 2: + raise + print(f"{e}\nretrying compile with tensor cores disabled", flush=True) + os.environ["TC_OPT"] = "0" + os.environ["IQ_EGPU_TC_OFF"] = "1" + out = compile_policy_model(meta, onnx_path, args.output or egpu_pkl_path(meta)) + finally: + if stop is not None: + stop.set() + if sampler is not None: + sampler.join(timeout=2) + print(f"saved eGPU jit to {out} ({os.path.getsize(out) / 1e6:.2f} MB)") + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_emac_warp.py b/iqpilot/selfdrive/iqmodeld/tools/compile_emac_warp.py new file mode 100644 index 000000000..4da3425e1 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/compile_emac_warp.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot.selfdrive.iqmodeld.tools.compile_warp import MODEL_SIZE, compile_warp, main + +__all__ = ["MODEL_SIZE", "compile_warp", "main"] + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_model.py b/iqpilot/selfdrive/iqmodeld/tools/compile_model.py new file mode 100644 index 000000000..721a94bc3 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/compile_model.py @@ -0,0 +1,125 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import os +import pickle +import re +import shutil +import sys +import time + +import numpy as np + +if "JIT_BATCH_SIZE" not in os.environ: + os.environ["JIT_BATCH_SIZE"] = "0" + +from tinygrad import Context, Device, GlobalCounters, Tensor, TinyJit, dtypes +from tinygrad.helpers import DEBUG, getenv +from tinygrad.nn.onnx import OnnxRunner +from tinygrad.uop.ops import Ops + + +def compile_model(onnx_file, output): + run_onnx = OnnxRunner(onnx_file) + print("loaded model") + + input_shapes = {name: spec.shape for name, spec in run_onnx.graph_inputs.items()} + input_types = {name: spec.dtype for name, spec in run_onnx.graph_inputs.items()} + input_types = {key: dtypes.float32 if value is dtypes.float16 else value for key, value in input_types.items()} + input_shapes = {key: tuple(value if isinstance(value, int) else 1 for value in shape) for key, shape in input_shapes.items()} + + Tensor.manual_seed(100) + inputs = { + key: Tensor(Tensor.randn(*shape, dtype=input_types[key]).mul(8).realize().numpy(), device="NPY") + for key, shape in sorted(input_shapes.items()) + } + if not getenv("NPY_IMG"): + inputs = {key: Tensor(value.numpy(), device=Device.DEFAULT).realize() if "img" in key else value for key, value in inputs.items()} + print("created tensors") + + run_onnx_jit = TinyJit( + lambda **kwargs: next(iter(run_onnx({key: value.to(Device.DEFAULT) for key, value in kwargs.items()}).values())).cast("float32"), + prune=True, + ) + test_value = None + for iteration in range(3): + GlobalCounters.reset() + print(f"run {iteration}") + with Context(DEBUG=max(DEBUG.value, 2 if iteration == 2 else 1), OPENPILOT_HACKS=1): + result = run_onnx_jit(**inputs).numpy() + if iteration == 1: + test_value = np.copy(result) + + kernel_asts = {Ops.PROGRAM} + kernel_calls = [ + node for node in run_onnx_jit.captured.linear.toposort(gate=lambda value: value.op not in kernel_asts) + if node.op is Ops.CALL and node.src[0].op in kernel_asts + ] + print(f"captured {len(kernel_calls)} kernels") + np.testing.assert_equal(test_value, result, "JIT run failed") + print("jit run validated") + + kernel_count = 0 + read_image_count = 0 + gated_read_image_count = 0 + for call in kernel_calls: + _, _, source, _ = call.src[0].src + rendered = source.arg + kernel_count += 1 + read_image_count += rendered.count("read_image") + gated_read_image_count += rendered.count("?read_image") + for value in (match.group(1) for match in re.finditer(r"(val\d+)\s*=\s*read_imagef\(", rendered)): + if re.search(fr"[?:]{value}\.[xyzw]", rendered): + gated_read_image_count += 1 + + print(f"{kernel_count=}, {read_image_count=}, {gated_read_image_count=}") + expected = { + "kernel count": (kernel_count, getenv("ALLOWED_KERNEL_COUNT", -1)), + "read image count": (read_image_count, getenv("ALLOWED_READ_IMAGE", -1)), + "gated read image count": (gated_read_image_count, getenv("ALLOWED_GATED_READ_IMAGE", -1)), + } + for name, (actual, allowed) in expected.items(): + if allowed != -1: + assert actual == allowed, f"different {name}: {actual}, expected {allowed}" + + with open(output, "wb") as handle: + pickle.dump(run_onnx_jit, handle) + print(f"model size is {os.path.getsize(onnx_file) / 1e6:.2f}M") + print(f"pkl size is {os.path.getsize(output) / 1e6:.2f}M") + return run_onnx_jit, inputs, test_value + + +def test_compiled(run, inputs, test_value): + step_times = [] + for _ in range(20): + start = time.perf_counter() + output = run(**inputs) + queued = time.perf_counter() + value = output.numpy() + end = time.perf_counter() + step_times.append((end - start) * 1e3) + print(f"enqueue {(queued - start) * 1e3:6.2f} ms -- total run {step_times[-1]:6.2f} ms") + + minimum = getenv("ASSERT_MIN_STEP_TIME", 0.0) + if minimum: + assert min(step_times) < minimum, f"expected minimum step time below {minimum} ms, got {min(step_times)} ms" + np.testing.assert_equal(test_value, value) + changed_inputs = {key: Tensor(item.numpy() * 2, device=item.device) for key, item in inputs.items()} + changed_value = run(**changed_inputs).numpy() + np.testing.assert_raises(AssertionError, np.testing.assert_array_equal, value, changed_value) + + +if __name__ == "__main__": + model_path = sys.argv[1] + output_path = sys.argv[2] + if stash := os.environ.get("IQPILOT_MODEL_STASH"): + stashed_model = os.path.join(stash, os.path.basename(output_path)) + if os.path.isfile(stashed_model) and os.path.getsize(stashed_model) > 0: + os.makedirs(os.path.dirname(output_path) or ".", exist_ok=True) + shutil.copyfile(stashed_model, output_path) + print(f"restored device-compiled model: {output_path}") + sys.exit(0) + _, input_values, expected_value = compile_model(model_path, output_path) + with open(output_path, "rb") as compiled_file: + compiled_model = pickle.load(compiled_file) + test_compiled(compiled_model, input_values, expected_value) diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_split_runtime.py b/iqpilot/selfdrive/iqmodeld/tools/compile_split_runtime.py new file mode 100644 index 000000000..ef0ee05c6 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/compile_split_runtime.py @@ -0,0 +1,417 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import argparse +import atexit +import os +import pickle +import time +from dataclasses import dataclass +from functools import partial + +import numpy as np + + +def _patch_firmware_fetch() -> None: + import hashlib + import pathlib + + import zstandard + from tinygrad import helpers + + if not hasattr(helpers, "fetch_fw"): + return + + original_fetch = helpers.fetch_fw + + def fetch_fw(path, name, sha256): + archive_path = pathlib.Path(f"/lib/firmware/{path}/{name}.zst") + if archive_path.is_file(): + blob = zstandard.ZstdDecompressor().stream_reader(archive_path.read_bytes()).read() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + return original_fetch(path, name, sha256) + + helpers.fetch_fw = fetch_fw + + +_patch_firmware_fetch() + +from tinygrad.device import Device +from tinygrad.engine.jit import TinyJit +from tinygrad.helpers import Context +from tinygrad.nn.onnx import OnnxRunner +from tinygrad.tensor import Tensor + + +@dataclass(frozen=True) +class CameraGeometry: + width: int + height: int + stride: int + y_height: int + uv_height: int + size: int + + +WARP_DEVICE = os.getenv("WARP_DEV") + + +def _read_shared_copy(path: str) -> str: + from iqpilot.common.file_chunker import read_file_chunked + from iqpilot.system.hardware.hw import Paths + + shm_path = os.path.join(Paths.shm_path(), os.path.basename(path)) + atexit.register(lambda: os.path.exists(shm_path) and os.remove(shm_path)) + with open(shm_path, "wb") as handle: + handle.write(read_file_chunked(path)) + return shm_path + + +def _parse_size(text: str) -> tuple[int, int]: + width, height = text.lower().split("x") + return int(width), int(height) + + +def _rand_u8_inputs(keys: list[str], shape, device=None): + return {key: Tensor.randint(shape, low=0, high=256, dtype="uint8", device=device).realize() for key in keys} + + +def _phase_desire_key(policy_shapes: dict[str, tuple[int, ...]]) -> str: + for key in policy_shapes: + if key.startswith("desire"): + return key + raise KeyError("No desire-like key found in policy shapes") + + +def _phase_image_keys(vision_shapes: dict[str, tuple[int, ...]]) -> tuple[str, str]: + names = sorted(name for name in vision_shapes if "img" in name) + road_key = next((name for name in names if "big" not in name), None) + wide_key = next((name for name in names if "big" in name), None) + if road_key is None or wide_key is None: + raise ValueError(f"Unable to resolve road/wide image keys from {list(vision_shapes)}") + return road_key, wide_key + + +def _base_policy_keys(policy_shapes: dict[str, tuple[int, ...]]) -> set[str]: + return { + _phase_desire_key(policy_shapes), + "features_buffer", + "traffic_convention", + "action_t", + } + + +def _common_policy_shapes(role_shapes: dict[str, dict[str, tuple[int, ...]]]) -> dict[str, tuple[int, ...]]: + first_role = next(iter(role_shapes)) + baseline = role_shapes[first_role] + for role_name, shape_map in role_shapes.items(): + if shape_map != baseline: + raise ValueError(f"Policy input shapes differ for role {role_name}") + return baseline + + +def _phase_frame_skip(policy_shapes: dict[str, tuple[int, ...]]) -> int: + feature_shape = policy_shapes.get("features_buffer") + if feature_shape is None: + return 1 + history_length = feature_shape[1] + return 1 if history_length >= 99 else 4 + + +def _project_pixels(src_flat, inverse_matrix, dst_shape, src_shape, stride_pad, border_fill_val=None): + dst_w, dst_h = dst_shape + src_h, src_w = src_shape + + x_coords = Tensor.arange(dst_w).to(WARP_DEVICE).reshape(1, dst_w).expand(dst_h, dst_w).reshape(-1) + y_coords = Tensor.arange(dst_h).to(WARP_DEVICE).reshape(dst_h, 1).expand(dst_h, dst_w).reshape(-1) + + src_x = inverse_matrix[0, 0] * x_coords + inverse_matrix[0, 1] * y_coords + inverse_matrix[0, 2] + src_y = inverse_matrix[1, 0] * x_coords + inverse_matrix[1, 1] * y_coords + inverse_matrix[1, 2] + scale = inverse_matrix[2, 0] * x_coords + inverse_matrix[2, 1] * y_coords + inverse_matrix[2, 2] + + src_x = src_x / scale + src_y = src_y / scale + + rounded_x = Tensor.round(src_x) + rounded_y = Tensor.round(src_y) + gather_x = rounded_x.clip(0, src_w - 1).cast("int") + gather_y = rounded_y.clip(0, src_h - 1).cast("int") + gather_index = gather_y * (src_w + stride_pad) + gather_x + sampled = src_flat[gather_index] + + if border_fill_val is None: + return sampled + + inside = ((rounded_x >= 0) & (rounded_x <= src_w - 1) & (rounded_y >= 0) & (rounded_y <= src_h - 1)).cast(sampled.dtype) + return sampled * inside + Tensor(border_fill_val, dtype=sampled.dtype) * (1 - inside) + + +def _pack_nv12_planes(stacked_frame): + y_height = (stacked_frame.shape[0] * 2) // 3 + frame_width = stacked_frame.shape[1] + return Tensor.cat( + stacked_frame[0:y_height:2, 0::2], + stacked_frame[1:y_height:2, 0::2], + stacked_frame[0:y_height:2, 1::2], + stacked_frame[1:y_height:2, 1::2], + stacked_frame[y_height:y_height + y_height // 4].reshape((y_height // 2, frame_width // 2)), + stacked_frame[y_height + y_height // 4:y_height + y_height // 2].reshape((y_height // 2, frame_width // 2)), + dim=0, + ).reshape((6, y_height // 2, frame_width // 2)) + + +def _warp_program(camera: CameraGeometry, model_w: int, model_h: int): + uv_offset = camera.stride * camera.y_height + stride_pad = camera.stride - camera.width + + def prepare_frame(nv12_blob, inverse_matrix): + uv_matrix = inverse_matrix * Tensor([[1.0, 1.0, 0.5], [1.0, 1.0, 0.5], [2.0, 2.0, 1.0]], device=WARP_DEVICE) + uv_plane = nv12_blob[uv_offset:uv_offset + camera.uv_height * camera.stride].reshape(camera.uv_height, camera.stride) + with Context(SPLIT_REDUCEOP=0): + y_plane = _project_pixels(nv12_blob[:camera.height * camera.stride], inverse_matrix, (model_w, model_h), (camera.height, camera.width), stride_pad).realize() + u_plane = _project_pixels(uv_plane[:camera.height // 2, :camera.width:2].flatten(), uv_matrix, (model_w // 2, model_h // 2), (camera.height // 2, camera.width // 2), 0).realize() + v_plane = _project_pixels(uv_plane[:camera.height // 2, 1:camera.width:2].flatten(), uv_matrix, (model_w // 2, model_h // 2), (camera.height // 2, camera.width // 2), 0).realize() + return _pack_nv12_planes(y_plane.cat(u_plane).cat(v_plane).reshape((model_h * 3 // 2, model_w))) + + return prepare_frame + + +def _sample_sparse(queue_tensor, frame_stride): + return queue_tensor[::frame_stride].contiguous().flatten(0, 1).unsqueeze(0) + + +def _sample_desire(queue_tensor, frame_stride): + return queue_tensor.reshape(-1, frame_stride, *queue_tensor.shape[1:]).max(1).flatten(0, 1).unsqueeze(0) + + +def _roll_queue(queue_tensor, incoming, sampler): + queue_tensor.assign(queue_tensor[1:].cat(incoming, dim=0).contiguous()) + return sampler(queue_tensor) + + +def _vision_queue_buffers(vision_shapes: dict[str, tuple[int, ...]], frame_stride: int, device): + road_key, _ = _phase_image_keys(vision_shapes) + image_shape = vision_shapes[road_key] + frame_history = image_shape[1] // 6 + queue_depth = frame_stride * (frame_history - 1) + 1 + frame_queue_shape = (queue_depth, 6, image_shape[2], image_shape[3]) + + numpy_state = { + "tfm": np.zeros((3, 3), dtype=np.float32), + "big_tfm": np.zeros((3, 3), dtype=np.float32), + } + tensor_state = { + "img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=device).contiguous().realize(), + "big_img_q": Tensor(np.zeros(frame_queue_shape, dtype=np.uint8), device=device).contiguous().realize(), + **{name: Tensor(value, device="NPY").realize() for name, value in numpy_state.items()}, + } + return tensor_state, numpy_state + + +def _policy_queue_buffers(vision_shapes: dict[str, tuple[int, ...]], policy_shapes: dict[str, tuple[int, ...]], frame_stride: int, device): + tensor_state, numpy_state = _vision_queue_buffers(vision_shapes, frame_stride, device) + desired_key = _phase_desire_key(policy_shapes) + feature_shape = policy_shapes["features_buffer"] + desired_shape = policy_shapes[desired_key] + traffic_shape = policy_shapes["traffic_convention"] + action_shape = policy_shapes.get("action_t", traffic_shape) + + numpy_policy = { + "desire": np.zeros(desired_shape[2], dtype=np.float32), + "traffic_convention": np.zeros(traffic_shape, dtype=np.float32), + "action_t": np.zeros(action_shape, dtype=np.float32), + } + for key, shape in policy_shapes.items(): + if key not in _base_policy_keys(policy_shapes): + numpy_policy[key] = np.zeros(shape, dtype=np.float32) + + numpy_state.update(numpy_policy) + tensor_state.update({ + "feat_q": Tensor(np.zeros((frame_stride * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), dtype=np.float32), device=device).contiguous().realize(), + "desire_q": Tensor(np.zeros((frame_stride * desired_shape[1], desired_shape[0], desired_shape[2]), dtype=np.float32), device=device).contiguous().realize(), + **{name: Tensor(value, device="NPY").realize() for name, value in numpy_policy.items()}, + }) + return tensor_state, numpy_state + + +def _stage_program(camera: CameraGeometry, model_w: int, model_h: int, frame_stride: int): + prepare_frame = _warp_program(camera, model_w, model_h) + sparse_sampler = partial(_sample_sparse, frame_stride=frame_stride) + + def stage_inputs(img_q, big_img_q, tfm, big_tfm, frame, big_frame): + tfm = tfm.to(WARP_DEVICE) + big_tfm = big_tfm.to(WARP_DEVICE) + Tensor.realize(tfm, big_tfm) + staged_main = prepare_frame(frame, tfm).unsqueeze(0).to(Device.DEFAULT) + staged_wide = prepare_frame(big_frame, big_tfm).unsqueeze(0).to(Device.DEFAULT) + return ( + _roll_queue(img_q, staged_main, sparse_sampler), + _roll_queue(big_img_q, staged_wide, sparse_sampler), + ) + + return stage_inputs + + +def _role_executor(model_runners: dict[str, OnnxRunner], meta_by_role: dict[str, dict], frame_stride: int): + desired_sampler = partial(_sample_desire, frame_stride=frame_stride) + sparse_sampler = partial(_sample_sparse, frame_stride=frame_stride) + vision_hidden_slice = meta_by_role["vision"]["output_slices"]["hidden_state"] + policy_roles = [name for name in meta_by_role if name != "vision"] + policy_shapes = _common_policy_shapes({name: meta_by_role[name]["input_shapes"] for name in policy_roles}) + desired_key = _phase_desire_key(policy_shapes) + road_key, wide_key = _phase_image_keys(meta_by_role["vision"]["input_shapes"]) + extra_keys = [key for key in policy_shapes if key not in _base_policy_keys(policy_shapes)] + + def execute_bundle(img, big_img, feat_q, desire_q, desire, traffic_convention, action_t, **extra): + desired_tensor = desire.to(Device.DEFAULT) + traffic_tensor = traffic_convention.to(Device.DEFAULT) + action_tensor = action_t.to(Device.DEFAULT) + extra_tensors = {key: extra[key].to(Device.DEFAULT) for key in extra_keys if key in extra} + Tensor.realize(desired_tensor, traffic_tensor, action_tensor, *extra_tensors.values()) + + desire_buffer = _roll_queue(desire_q, desired_tensor.reshape(1, 1, -1), desired_sampler) + vision_output = next(iter(model_runners["vision"]({road_key: img, wide_key: big_img}).values())).cast("float32") + hidden_state = vision_output[:, vision_hidden_slice].reshape(1, -1).unsqueeze(0) + feature_buffer = _roll_queue(feat_q, hidden_state, sparse_sampler) + + common_inputs = { + "features_buffer": feature_buffer, + desired_key: desire_buffer, + "traffic_convention": traffic_tensor, + "action_t": action_tensor, + **extra_tensors, + } + + role_outputs = [] + for role_name in policy_roles: + role_outputs.append(next(iter(model_runners[role_name](common_inputs).values())).cast("float32")) + return (vision_output, *role_outputs) + + return execute_bundle + + +def _capture_and_freeze(jit_runner, random_inputs_factory, queue_keys, queue_factory): + seed_value = 42 + + def validate(fn, baseline_outputs=None, baseline_buffers=None, expect_match=True, replay_seed=seed_value): + queue_tensors, numpy_values = queue_factory(Device.DEFAULT) + np.random.seed(replay_seed) + Tensor.manual_seed(replay_seed) + + replay_count = 1 if (baseline_outputs is not None or baseline_buffers is not None) else 3 + for pass_index in range(replay_count): + for value in numpy_values.values(): + value[:] = np.random.randn(*value.shape).astype(value.dtype) + Device.default.synchronize() + random_inputs = random_inputs_factory() + start_time = time.perf_counter() + outputs = fn(**{name: queue_tensors[name] for name in queue_keys}, **random_inputs) + enqueue_time = time.perf_counter() + Device.default.synchronize() + total_time = time.perf_counter() + print(f" [{pass_index + 1}/{replay_count}] enqueue {(enqueue_time - start_time) * 1e3:6.2f} ms -- total {(total_time - start_time) * 1e3:6.2f} ms") + + if pass_index == 0: + output_snapshot = [np.copy(value.numpy()) for value in outputs] + buffer_snapshot = [np.copy(value.numpy().copy()) for value in queue_tensors.values()] + + if baseline_outputs is not None: + matches = all(np.array_equal(current, reference) for current, reference in zip(output_snapshot, baseline_outputs, strict=True)) + assert matches == expect_match, f"outputs {'differ from' if expect_match else 'match'} baseline" + if baseline_buffers is not None: + matches = all(np.array_equal(current, reference) for current, reference in zip(buffer_snapshot, baseline_buffers, strict=True)) + assert matches == expect_match, f"buffers {'differ from' if expect_match else 'match'} baseline" + + return output_snapshot, buffer_snapshot + + print("capture + replay") + baseline_outputs, baseline_buffers = validate(jit_runner) + print("pickle round trip") + frozen = pickle.loads(pickle.dumps(jit_runner)) + validate(frozen, baseline_outputs, baseline_buffers, expect_match=True) + validate(frozen, baseline_outputs, baseline_buffers, expect_match=False, replay_seed=seed_value + 1) + return frozen + + +def _arg_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser() + parser.add_argument("--model-size", type=_parse_size, required=True, help="model input WxH") + parser.add_argument("--camera-resolutions", type=_parse_size, nargs="+", required=True, help="camera resolutions WxH") + parser.add_argument("--vision-onnx", required=True) + parser.add_argument("--policy-onnx") + parser.add_argument("--off-policy-onnx") + parser.add_argument("--on-policy-onnx") + parser.add_argument("--output", required=True) + parser.add_argument("--frame-skip", type=int) + return parser + + +def main(argv: list[str] | None = None) -> int: + from iqpilot.selfdrive.iqmodeld.metadata import build_metadata_record + from iqpilot.system.camerad.cameras.nv12_info import get_nv12_info + + args = _arg_parser().parse_args(argv) + model_w, model_h = args.model_size + + policy_specs = [ + ("policy", args.policy_onnx), + ("off_policy", args.off_policy_onnx), + ("on_policy", args.on_policy_onnx), + ] + active_policy_specs = [(role, path) for role, path in policy_specs if path] + if not active_policy_specs: + raise SystemExit("At least one policy ONNX must be provided") + + model_paths = {"vision": _read_shared_copy(args.vision_onnx)} + for role_name, onnx_path in active_policy_specs: + model_paths[role_name] = _read_shared_copy(onnx_path) + + model_runners = {role_name: OnnxRunner(path) for role_name, path in model_paths.items()} + meta_by_role = {role_name: build_metadata_record(path) for role_name, path in model_paths.items()} + + shared_policy_shapes = _common_policy_shapes({ + role_name: meta_by_role[role_name]["input_shapes"] for role_name, _ in active_policy_specs + }) + frame_stride = args.frame_skip if args.frame_skip is not None else _phase_frame_skip(shared_policy_shapes) + + package: dict[Any, Any] = { + "meta_by_role": meta_by_role, + "roles": [role_name for role_name, _ in active_policy_specs], + "frame_stride": frame_stride, + } + + executor_jit = TinyJit(_role_executor(model_runners, meta_by_role, frame_stride), prune=True) + queue_factory = partial(_policy_queue_buffers, meta_by_role["vision"]["input_shapes"], shared_policy_shapes, frame_stride) + image_shape = meta_by_role["vision"]["input_shapes"][_phase_image_keys(meta_by_role["vision"]["input_shapes"])[0]] + package["execute_bundle"] = _capture_and_freeze( + executor_jit, + partial(_rand_u8_inputs, keys=["img", "big_img"], shape=image_shape), + ["feat_q", "desire_q", "desire", "traffic_convention", "action_t", *[k for k in shared_policy_shapes if k not in _base_policy_keys(shared_policy_shapes)]], + queue_factory, + ) + + for camera_width, camera_height in args.camera_resolutions: + camera = CameraGeometry(camera_width, camera_height, *get_nv12_info(camera_width, camera_height)) + stage_jit = TinyJit(_stage_program(camera, model_w, model_h, frame_stride), prune=True) + package[(camera_width, camera_height)] = { + "stage_inputs": _capture_and_freeze( + stage_jit, + partial(_rand_u8_inputs, keys=["frame", "big_frame"], shape=camera.size, device=WARP_DEVICE), + ["img_q", "big_img_q", "tfm", "big_tfm"], + partial(_vision_queue_buffers, meta_by_role["vision"]["input_shapes"], frame_stride), + ) + } + + with open(args.output, "wb") as handle: + pickle.dump(package, handle) + print(f"Saved combined split runtime to {args.output} ({os.path.getsize(args.output) / 1e6:.2f} MB)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py b/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py new file mode 100644 index 000000000..56ce00b2e --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/compile_supercombo.py @@ -0,0 +1,422 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import argparse +import atexit +import math +import os +import pickle +import re +import tempfile +import time +from functools import partial +from collections import namedtuple + +import numpy as np + +def _patch_tinygrad_fetch_fw(): + import hashlib + import pathlib + import zstandard + from tinygrad import helpers + _orig = helpers.fetch_fw + def fetch_fw(path, name, sha256): + p = pathlib.Path(f"/lib/firmware/{path}/{name}.zst") + if p.is_file(): + blob = zstandard.ZstdDecompressor().stream_reader(p.read_bytes()).read() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + return _orig(path, name, sha256) + helpers.fetch_fw = fetch_fw +_patch_tinygrad_fetch_fw() + +from tinygrad.tensor import Tensor +from tinygrad.helpers import Context +from tinygrad.device import Device +from tinygrad.engine.jit import TinyJit + + +NV12Frame = namedtuple("NV12Frame", ['width', 'height', 'stride', 'y_height', 'uv_height', 'size']) +WARP_INPUTS = ['tfm', 'big_tfm'] +POLICY_INPUTS = ['img_q', 'big_img_q', 'feat_q', 'desire_q', 'packed_npy_inputs'] + +UV_SCALE_MATRIX = np.array([[0.5, 0, 0], [0, 0.5, 0], [0, 0, 1]], dtype=np.float32) +UV_SCALE_MATRIX_INV = np.linalg.inv(UV_SCALE_MATRIX) + +WARP_DEV = os.getenv('WARP_DEV') + + +def make_random_images(keys, shape, device=None): + return {k: Tensor.randint(shape, low=0, high=256, dtype='uint8', device=device).realize() for k in keys} + + +def warp_perspective_tinygrad(src_flat, M_inv, dst_shape, src_shape, stride_pad, border_fill_val=None): + w_dst, h_dst = dst_shape + h_src, w_src = src_shape + + x = Tensor.arange(w_dst).reshape(1, w_dst).expand(h_dst, w_dst).reshape(-1) + y = Tensor.arange(h_dst).reshape(h_dst, 1).expand(h_dst, w_dst).reshape(-1) + + src_x = M_inv[0, 0] * x + M_inv[0, 1] * y + M_inv[0, 2] + src_y = M_inv[1, 0] * x + M_inv[1, 1] * y + M_inv[1, 2] + src_w = M_inv[2, 0] * x + M_inv[2, 1] * y + M_inv[2, 2] + + src_x = src_x / src_w + src_y = src_y / src_w + + x_round = Tensor.round(src_x) + y_round = Tensor.round(src_y) + x_nn_clipped = x_round.clip(0, w_src - 1).cast('int') + y_nn_clipped = y_round.clip(0, h_src - 1).cast('int') + idx = y_nn_clipped * (w_src + stride_pad) + x_nn_clipped + sampled = src_flat[idx] + + if border_fill_val is None: + return sampled + + in_bounds = ((x_round >= 0) & (x_round <= w_src - 1) & + (y_round >= 0) & (y_round <= h_src - 1)).cast(sampled.dtype) + return sampled * in_bounds + Tensor(border_fill_val, dtype=sampled.dtype) * (1 - in_bounds) + + +def frames_to_tensor(frames): + H = (frames.shape[0] * 2) // 3 + W = frames.shape[1] + in_img1 = Tensor.cat(frames[0:H:2, 0::2], + frames[1:H:2, 0::2], + frames[0:H:2, 1::2], + frames[1:H:2, 1::2], + frames[H:H+H//4].reshape((H//2, W//2)), + frames[H+H//4:H+H//2].reshape((H//2, W//2)), dim=0).reshape((6, H//2, W//2)) + return in_img1 + + +def make_frame_prepare(nv12: NV12Frame, model_w, model_h): + cam_w, cam_h, stride, y_height, uv_height, _ = nv12 + uv_offset = stride * y_height + stride_pad = stride - cam_w + + def frame_prepare_tinygrad(input_frame, M_inv): + M_inv_uv = M_inv * Tensor([[1.0, 1.0, 0.5], [1.0, 1.0, 0.5], [2.0, 2.0, 1.0]], device=WARP_DEV) + uv = input_frame[uv_offset:uv_offset + uv_height * stride].reshape(uv_height, stride) + with Context(SPLIT_REDUCEOP=0): + y = warp_perspective_tinygrad(input_frame[:cam_h*stride], + M_inv, (model_w, model_h), + (cam_h, cam_w), stride_pad).realize() + u = warp_perspective_tinygrad(uv[:cam_h//2, :cam_w:2].flatten(), + M_inv_uv, (model_w//2, model_h//2), + (cam_h//2, cam_w//2), 0).realize() + v = warp_perspective_tinygrad(uv[:cam_h//2, 1:cam_w:2].flatten(), + M_inv_uv, (model_w//2, model_h//2), + (cam_h//2, cam_w//2), 0).realize() + yuv = y.cat(u).cat(v).reshape((model_h * 3 // 2, model_w)) + tensor = frames_to_tensor(yuv) + return tensor + return frame_prepare_tinygrad + + +def make_warp_input_queues(vision_input_shapes, frame_skip, device): + img = vision_input_shapes['img'] # (1, 12, 128, 256) + n_frames = img[1] // 6 + img_buf_shape = (frame_skip * (n_frames - 1) + 1, 6, img[2], img[3]) + + npy = { + 'tfm': np.zeros((3, 3), dtype=np.float32), + 'big_tfm': np.zeros((3, 3), dtype=np.float32), + } + input_queues = { + 'img_q': Tensor(np.zeros(img_buf_shape, dtype=np.uint8), device=device).contiguous().realize(), + 'big_img_q': Tensor(np.zeros(img_buf_shape, dtype=np.uint8), device=device).contiguous().realize(), + **{k: Tensor(v, device='NPY').realize() for k, v in npy.items()}, + } + return input_queues, npy + + +def get_policy_npy_shapes(input_shapes): + dp = input_shapes['desire_pulse'] # (1, 25, 8) + tc = input_shapes['traffic_convention'] # (1, 2) + at = input_shapes['action_t'] # (1, 2) + fb = input_shapes['features_buffer'] # (1, 24, 512) + shapes = {'desire': (dp[2],), 'traffic_convention': tuple(tc), 'action_t': tuple(at), 'prev_feat': (fb[0], fb[2])} + return shapes, [math.prod(s) for s in shapes.values()] + + +def make_input_queues(input_shapes, frame_skip, device): + input_queues, npy = make_warp_input_queues(input_shapes, frame_skip, device) + + fb = input_shapes['features_buffer'] # (1, 24, 512), past features only; the model appends the current frame's feature + dp = input_shapes['desire_pulse'] # (1, 25, 8) + + shapes, sizes = get_policy_npy_shapes(input_shapes) + packed_npy_inputs = np.zeros(sum(sizes), dtype=np.float32) + npy.update({k: v.reshape(s) for (k, s), v in zip(shapes.items(), np.split(packed_npy_inputs, np.cumsum(sizes[:-1])), strict=True)}) + input_queues.update({ + 'feat_q': Tensor(np.zeros((frame_skip * fb[1], fb[0], fb[2]), dtype=np.float32), device=device).contiguous().realize(), + 'desire_q': Tensor(np.zeros((frame_skip * dp[1], dp[0], dp[2]), dtype=np.float32), device=device).contiguous().realize(), + 'packed_npy_inputs': Tensor(packed_npy_inputs, device='NPY').realize(), + }) + return input_queues, npy + + +def shift_and_sample(buf, new_val, sample_fn): + buf.assign(buf[1:].cat(new_val, dim=0).contiguous()) + return sample_fn(buf) + + +def sample_skip(buf, frame_skip): + return buf[::frame_skip].contiguous().flatten(0, 1).unsqueeze(0) + + +def sample_desire(buf, frame_skip): + return buf.reshape(-1, frame_skip, *buf.shape[1:]).max(1).flatten(0, 1).unsqueeze(0) + + +def make_warp(nv12, model_w, model_h, frame_skip): + frame_prepare = make_frame_prepare(nv12, model_w, model_h) + + def warp(tfm, big_tfm, frame, big_frame): + tfm = tfm.to(WARP_DEV) + big_tfm = big_tfm.to(WARP_DEV) + Tensor.realize(tfm, big_tfm) + + warped_frame = frame_prepare(frame, tfm).unsqueeze(0) + warped_big_frame = frame_prepare(big_frame, big_tfm).unsqueeze(0) + return Tensor.cat(warped_frame, warped_big_frame) + + return warp + + +def make_run_policy(model_runner, model_metadata, frame_skip): + sample_desire_fn = partial(sample_desire, frame_skip=frame_skip) + sample_skip_fn = partial(sample_skip, frame_skip=frame_skip) + npy_shapes, npy_sizes = get_policy_npy_shapes(model_metadata['input_shapes']) + + def run_policy(warped, img_q, big_img_q, feat_q, desire_q, packed_npy_inputs): + packed_npy_inputs = packed_npy_inputs.to(Device.DEFAULT) + warped = warped.to(Device.DEFAULT) + Tensor.realize(packed_npy_inputs, warped) + + img = shift_and_sample(img_q, warped[0:1], sample_skip_fn) + big_img = shift_and_sample(big_img_q, warped[1:2], sample_skip_fn) + + desire, traffic_convention, action_t, prev_feat = (t.reshape(s) for t, s in zip(packed_npy_inputs.split(npy_sizes), npy_shapes.values(), strict=True)) + desire_buf = shift_and_sample(desire_q, desire.reshape(1, 1, -1), sample_desire_fn) + feat_buf = shift_and_sample(feat_q, prev_feat.reshape(1, 1, -1), sample_skip_fn) + + inputs = { + 'img': img, + 'big_img': big_img, + 'features_buffer': feat_buf, + 'desire_pulse': desire_buf, + 'traffic_convention': traffic_convention, + 'action_t': action_t, + } + out = next(iter(model_runner(inputs).values())).cast('float32') + return out, + return run_policy + + +def compile_jit(jit, make_random_inputs, input_keys, make_queues): + SEED = 42 + def random_inputs_run(fn, seed, test_val=None, test_buffers=None, expect_match=True): + input_queues, npy = make_queues(Device.DEFAULT) + np.random.seed(seed) + Tensor.manual_seed(seed) + + testing = test_val is not None or test_buffers is not None + n_runs = 1 if testing else 3 + + for i in range(n_runs): + for v in npy.values(): + v[:] = np.random.randn(*v.shape).astype(v.dtype) + Device.default.synchronize() + random_inputs = make_random_inputs() + st = time.perf_counter() + outs = fn(**{k: input_queues[k] for k in input_keys}, **random_inputs) + mt = time.perf_counter() + Device.default.synchronize() + et = time.perf_counter() + print(f" [{i+1}/{n_runs}] enqueue {(mt-st)*1e3:6.2f} ms -- total {(et-st)*1e3:6.2f} ms") + + if i == 0: + val = [np.copy(v.numpy()) for v in outs] + buffers = [np.copy(v.numpy().copy()) for v in input_queues.values()] + + if test_val is not None: + match = all(np.array_equal(a, b) for a, b in zip(val, test_val, strict=True)) + assert match == expect_match, f"outputs {'differ from' if expect_match else 'match'} baseline (seed={seed})" + if test_buffers is not None: + match = all(np.array_equal(a, b) for a, b in zip(buffers, test_buffers, strict=True)) + assert match == expect_match, f"buffers {'differ from' if expect_match else 'match'} baseline (seed={seed})" + return val, buffers + + print('capture + replay') + test_val, test_buffers = random_inputs_run(jit, SEED) + print('pickle round trip') + jit = pickle.loads(pickle.dumps(jit)) + random_inputs_run(jit, SEED, test_val, test_buffers, expect_match=True) + random_inputs_run(jit, SEED+1, test_val, test_buffers, expect_match=False) + return jit + + +def _captured_devices(jit) -> set[str]: + captured = getattr(jit, 'captured', None) + infos = getattr(captured, 'expected_input_info', None) + if not infos: + return set() + + devices: set[str] = set() + for info in infos: + if isinstance(info, tuple) and len(info) >= 4 and isinstance(info[3], str): + devices.add(info[3]) + return devices + + +def _slice_outputs(model_outputs: np.ndarray, output_slices: dict[str, slice]) -> dict[str, np.ndarray]: + return {name: model_outputs[np.newaxis, tensor_slice] for name, tensor_slice in output_slices.items() if name != 'pad'} + + +def _validate_pose_outputs(parsed_outputs: dict[str, np.ndarray]) -> None: + from iqpilot.selfdrive.locationd.locationd import MIN_STD_SANITY_CHECK, ROTATION_SANITY_CHECK, TRANS_SANITY_CHECK + + required = ( + 'pose', 'pose_stds', 'wide_from_device_euler', 'wide_from_device_euler_stds', + 'road_transform', 'road_transform_stds', + ) + missing = [name for name in required if name not in parsed_outputs] + if missing: + raise AssertionError(f"parsed supercombo outputs missing required odometry tensors: {missing}") + + for name in required: + values = parsed_outputs[name] + if not np.isfinite(values).all(): + raise AssertionError(f"parsed supercombo output {name} contains non-finite values") + + pose = parsed_outputs['pose'][0] + pose_stds = parsed_outputs['pose_stds'][0] + road_transform_stds = parsed_outputs['road_transform_stds'][0] + wide_stds = parsed_outputs['wide_from_device_euler_stds'][0] + + if pose_stds.min() <= MIN_STD_SANITY_CHECK: + raise AssertionError(f"pose_stds min {pose_stds.min()} <= {MIN_STD_SANITY_CHECK}") + if road_transform_stds.min() <= MIN_STD_SANITY_CHECK: + raise AssertionError(f"road_transform_stds min {road_transform_stds.min()} <= {MIN_STD_SANITY_CHECK}") + if wide_stds.min() <= MIN_STD_SANITY_CHECK: + raise AssertionError(f"wide_from_device_euler_stds min {wide_stds.min()} <= {MIN_STD_SANITY_CHECK}") + + if np.linalg.norm(pose[:3]) > TRANS_SANITY_CHECK: + raise AssertionError(f"pose translation norm {np.linalg.norm(pose[:3])} exceeds {TRANS_SANITY_CHECK}") + if np.linalg.norm(pose[3:]) > ROTATION_SANITY_CHECK: + raise AssertionError(f"pose rotation norm {np.linalg.norm(pose[3:])} exceeds {ROTATION_SANITY_CHECK}") + if np.linalg.norm(pose_stds[:3]) > 10 * TRANS_SANITY_CHECK: + raise AssertionError( + f"pose translation std norm {np.linalg.norm(pose_stds[:3])} exceeds {10 * TRANS_SANITY_CHECK}" + ) + if np.linalg.norm(pose_stds[3:]) > 10 * ROTATION_SANITY_CHECK: + raise AssertionError( + f"pose rotation std norm {np.linalg.norm(pose_stds[3:])} exceeds {10 * ROTATION_SANITY_CHECK}" + ) + + +def validate_supercombo_release(run_policy_jit, model_runner, model_metadata, frame_skip, expected_device: str) -> None: + from iqpilot.selfdrive.iqmodeld.parser import PhaseParser + + direct_fn = make_run_policy(model_runner, model_metadata, frame_skip) + parser = PhaseParser() + queue_factory = partial(make_input_queues, model_metadata['input_shapes'], frame_skip) + image_shape = model_metadata['input_shapes']['img'] + + jit_queues, jit_npy = queue_factory(Device.DEFAULT) + direct_queues, direct_npy = queue_factory(Device.DEFAULT) + + for payload in (jit_npy, direct_npy): + for name, value in payload.items(): + value[:] = 0 if value.dtype.kind in ('i', 'u') else 0.0 + + zero_inputs = { + 'warped': Tensor(np.zeros((2, 6, *image_shape[2:]), dtype=np.uint8), device=Device.DEFAULT).realize(), + } + + direct_outs, = direct_fn(**{k: direct_queues[k] for k in POLICY_INPUTS}, **zero_inputs) + jit_outs, = run_policy_jit(**{k: jit_queues[k] for k in POLICY_INPUTS}, **zero_inputs) + + direct_flat = direct_outs.numpy().astype(np.float32).reshape(-1) + jit_flat = jit_outs.numpy().astype(np.float32).reshape(-1) + + if not np.allclose(direct_flat, jit_flat, atol=1e-4, rtol=1e-4): + max_delta = float(np.max(np.abs(direct_flat - jit_flat))) + raise AssertionError(f"JIT supercombo output diverges from direct ONNX execution; max abs delta {max_delta}") + + parsed = parser.parse_vision_outputs(_slice_outputs(jit_flat, model_metadata['output_slices'])) + _validate_pose_outputs(parsed) + + captured_devices = _captured_devices(run_policy_jit) + if expected_device and captured_devices and expected_device not in captured_devices: + raise AssertionError( + f"compiled run_policy backend mismatch: captured {sorted(captured_devices)} expected {expected_device}" + ) + + +def _parse_size(s): + w, h = s.lower().split('x') + return int(w), int(h) + + +def read_file_chunked_to_shm(path): + from iqpilot.common.file_chunker import read_file_chunked + from iqpilot.system.hardware.hw import Paths + with tempfile.NamedTemporaryFile(prefix='compile_modeld_', dir=Paths.shm_path(), delete=False) as f: + f.write(read_file_chunked(path)) + tmp_path = f.name + atexit.register(lambda: os.path.exists(tmp_path) and os.remove(tmp_path)) + return tmp_path + + +if __name__ == "__main__": + from tinygrad.nn.onnx import OnnxRunner + from iqpilot.system.camerad.cameras.nv12_info import get_nv12_info + from iqpilot.selfdrive.iqmodeld.metadata import build_metadata_record + p = argparse.ArgumentParser() + p.add_argument('--model-size', type=_parse_size, required=True, help='model input WxH') + p.add_argument('--camera-resolutions', type=_parse_size, nargs='+', required=True, + help='camera resolutions WxH (one or more)') + p.add_argument('--onnx', required=True) + p.add_argument('--output', required=True) + p.add_argument('--frame-skip', type=int, required=True) + p.add_argument('--expected-device', default='QCOM', help='expected tinygrad backend baked into the JIT') + args = p.parse_args() + + model_path = read_file_chunked_to_shm(args.onnx) + model_w, model_h = args.model_size + + model_runner = OnnxRunner(model_path) + out = { + 'metadata': build_metadata_record(model_path), + 'frame_skip': args.frame_skip, + } + + run_policy_jit = TinyJit(make_run_policy(model_runner, out['metadata'], args.frame_skip), prune=True) + + make_policy_queues = partial(make_input_queues, out['metadata']['input_shapes'], args.frame_skip) + make_random_model_inputs = partial(make_random_images, keys=['warped'], shape=(2, 6, *out['metadata']['input_shapes']['img'][2:])) + out['run_policy'] = compile_jit(run_policy_jit, make_random_model_inputs, POLICY_INPUTS, + make_policy_queues) + validate_supercombo_release(out['run_policy'], model_runner, out['metadata'], args.frame_skip, args.expected_device) + + for cam_w, cam_h in args.camera_resolutions: + nv12 = NV12Frame(cam_w, cam_h, *get_nv12_info(cam_w, cam_h)) + make_random_warp_inputs = partial(make_random_images, keys=['frame', 'big_frame'], shape=nv12.size, device=WARP_DEV) + warp_enqueue = TinyJit(make_warp(nv12, model_w, model_h, args.frame_skip), prune=True) + make_warp_queues = partial(make_warp_input_queues, out['metadata']['input_shapes'], args.frame_skip) + out[(cam_w,cam_h)] = compile_jit(warp_enqueue, make_random_warp_inputs, WARP_INPUTS, make_warp_queues) + captured_devices = _captured_devices(out[(cam_w,cam_h)]) + if args.expected_device and captured_devices and args.expected_device not in captured_devices: + raise AssertionError( + f"compiled warp backend mismatch for {cam_w}x{cam_h}: captured {sorted(captured_devices)} expected {args.expected_device}" + ) + + with open(args.output, "wb") as f: + pickle.dump(out, f) + print(f"Saved JITs to {args.output} ({os.path.getsize(args.output) / 1e6:.2f} MB)") diff --git a/iqpilot/selfdrive/iqmodeld/tools/compile_warp.py b/iqpilot/selfdrive/iqmodeld/tools/compile_warp.py new file mode 100644 index 000000000..07e4886eb --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/compile_warp.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +Compile the backend-neutral warp-only artifact: NV12 camera frames + 3x3 +transforms -> (2, 6, model_h/2, model_w/2) uint8 warped tensor, on the device +GPU (QCOM). maciqmodeld runs this locally +and feed the output to their backend, so the big model's image pipeline is +bit-identical to comma's fused pkl warp stage. + +Run ON the device (needs the QCOM backend): + cd /data/openpilot && DEV=QCOM WARP_DEV=QCOM IMAGE=1 FLOAT16=1 NOLOCALS=1 JIT_BATCH_SIZE=0 \ + python3 iqpilot/selfdrive/iqmodeld/tools/compile_warp.py \ + --camera-resolutions 1928x1208 --output /data/models/emac_warp.pkl +The artifact is then split per-resolution into Paths.model_root(). +""" +from __future__ import annotations + +import argparse +import hashlib +import os +import pickle +from functools import partial + +import numpy as np + +SELFTEST_SEED = 20260817 + +from iqpilot.selfdrive.iqmodeld.temporal_state import DEFAULT_FRAME_SKIP, MODEL_INPUT_SPEC +from iqpilot.selfdrive.iqmodeld.tools.compile_supercombo import ( + NV12Frame, WARP_INPUTS, compile_jit, make_random_images, make_warp, make_warp_input_queues, +) + +MODEL_SIZE = (MODEL_INPUT_SPEC["img"][0][3] * 2, MODEL_INPUT_SPEC["img"][0][2] * 2) # (512, 256) + + +def _parse_size(s: str) -> tuple[int, int]: + w, h = s.lower().split("x") + return int(w), int(h) + + +def compile_warp(cam_w: int, cam_h: int, out_path: str | None = None, + frame_skip: int = DEFAULT_FRAME_SKIP) -> str: + """Compile the warp-only QCOM JIT for one camera resolution and write the pkl. + Returns the artifact path. Callable from the workers so a fresh device + self-provisions the warp instead of erroring — needs the QCOM backend.""" + # the QCOM warp env must be set before tinygrad is imported here + os.environ.setdefault("DEV", "QCOM") + os.environ.setdefault("WARP_DEV", "QCOM") + os.environ.setdefault("IMAGE", "1") + os.environ.setdefault("FLOAT16", "1") + os.environ.setdefault("NOLOCALS", "1") + os.environ.setdefault("JIT_BATCH_SIZE", "0") + from tinygrad.engine.jit import TinyJit + from iqpilot.system.camerad.cameras.nv12_info import get_nv12_info + from iqpilot.system.hardware.hw import Paths + + model_w, model_h = MODEL_SIZE + input_shapes = {name: shape for name, (shape, _) in MODEL_INPUT_SPEC.items()} + nv12 = NV12Frame(cam_w, cam_h, *get_nv12_info(cam_w, cam_h)) + make_random_warp_inputs = partial(make_random_images, keys=["frame", "big_frame"], + shape=nv12.size, device=os.getenv("WARP_DEV")) + warp_jit = TinyJit(make_warp(nv12, model_w, model_h, frame_skip), prune=True) + make_warp_queues = partial(make_warp_input_queues, input_shapes, frame_skip) + compiled = compile_jit(warp_jit, make_random_warp_inputs, WARP_INPUTS, make_warp_queues) + + # historical artifact name: already-provisioned devices keep their warp + out_path = out_path or os.path.join(Paths.model_root(), f"emac_warp_{cam_w}x{cam_h}_tinygrad.pkl") + os.makedirs(os.path.dirname(out_path), exist_ok=True) + tmp = out_path + ".part" + bundle = {(cam_w, cam_h): compiled, "frame_skip": frame_skip, "model_size": MODEL_SIZE} + bundle["selftest"] = selftest_digest(compiled, cam_w, cam_h, nv12.size) + with open(tmp, "wb") as f: + pickle.dump(bundle, f) + os.replace(tmp, out_path) # atomic: a reader never sees a half-written pkl + return out_path + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--camera-resolutions", type=_parse_size, nargs="+", default=[(1928, 1208)]) + p.add_argument("--output", default=None) + p.add_argument("--frame-skip", type=int, default=DEFAULT_FRAME_SKIP) + args = p.parse_args() + for cam_w, cam_h in args.camera_resolutions: + out = compile_warp(cam_w, cam_h, args.output, frame_skip=args.frame_skip) + print(f"saved warp JIT to {out} ({os.path.getsize(out) / 1e6:.2f} MB)") + + +if __name__ == "__main__": + main() + + +def selftest_inputs(cam_w: int, cam_h: int, nv12_size: int): + """A fixed synthetic frame pair and pair of matrices. Deterministic so the + digest is reproducible on the device that compiled the artifact.""" + rng = np.random.default_rng(SELFTEST_SEED) + frame = rng.integers(0, 256, nv12_size, dtype=np.uint8) + big_frame = rng.integers(0, 256, nv12_size, dtype=np.uint8) + tfm = np.array([[0.7, 0.02, 300.0], [0.01, 0.7, 240.0], [0.0, 0.0, 1.0]], dtype=np.float32) + big_tfm = np.array([[0.5, 0.01, 380.0], [0.02, 0.5, 300.0], [0.0, 0.0, 1.0]], dtype=np.float32) + return frame, big_frame, tfm, big_tfm + + +def selftest_digest(compiled, cam_w: int, cam_h: int, nv12_size: int) -> str: + """Hash the warp's output for a fixed input. + + A warp artifact pinned to one tinygrad can still unpickle under another and + then compute silently wrong, which reaches the model as a garbage image and + looks like a bad model rather than a stale artifact. A version string cannot + see that; running it can.""" + from tinygrad.tensor import Tensor + frame, big_frame, tfm, big_tfm = selftest_inputs(cam_w, cam_h, nv12_size) + dev = os.getenv("WARP_DEV") or "QCOM" + out = compiled(tfm=Tensor(tfm, device="NPY").realize(), + big_tfm=Tensor(big_tfm, device="NPY").realize(), + frame=Tensor(frame, device=dev).realize(), + big_frame=Tensor(big_frame, device=dev).realize()) + return hashlib.sha256(out.numpy().astype(np.uint8).tobytes()).hexdigest() diff --git a/iqpilot/selfdrive/iqmodeld/tools/convert_egpu_oob.py b/iqpilot/selfdrive/iqmodeld/tools/convert_egpu_oob.py new file mode 100644 index 000000000..3efa0b08e --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/convert_egpu_oob.py @@ -0,0 +1,44 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import argparse +import gc +import os + +os.environ.setdefault("DEV", "USB+AMD:LLVM") +os.environ.setdefault("GMMU", "0") + +from iqpilot.selfdrive.iqmodeld.egpu_helpers import patch_tinygrad_fetch_fw +from iqpilot.selfdrive.iqmodeld.egpu_policy import dump_oob, is_oob, load_bundle + + +def convert(src: str, dst: str) -> str: + patch_tinygrad_fetch_fw() + if is_oob(src): + if src != dst: + os.replace(src, dst) + return dst + bundle = load_bundle(src) + tmp = dst + ".part" + with open(tmp, "wb") as f: + dump_oob(bundle, f) + del bundle + gc.collect() + load_bundle(tmp) + os.replace(tmp, dst) + return dst + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("src") + p.add_argument("--out", default=None) + args = p.parse_args() + out = convert(args.src, args.out or args.src) + print(f"converted -> {out} ({os.path.getsize(out) / 1e6:.1f} MB)") + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/iqmodeld/tools/daemon_jit_compiler.py b/iqpilot/selfdrive/iqmodeld/tools/daemon_jit_compiler.py new file mode 100644 index 000000000..3d451e746 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/daemon_jit_compiler.py @@ -0,0 +1,331 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import argparse +import atexit +import os +import pickle +import time +from dataclasses import dataclass +from functools import partial +from pathlib import Path + +import numpy as np + + +def _install_firmware_fetch_patch() -> None: + import hashlib + import pathlib + + import zstandard + from tinygrad import helpers + + if not hasattr(helpers, "fetch_fw"): + return + + original_fetch = helpers.fetch_fw + + def fetch_fw(path, name, sha256): + archive_path = pathlib.Path(f"/lib/firmware/{path}/{name}.zst") + if archive_path.is_file(): + blob = zstandard.ZstdDecompressor().stream_reader(archive_path.read_bytes()).read() + if hashlib.sha256(blob).hexdigest() == sha256: + return blob + return original_fetch(path, name, sha256) + + helpers.fetch_fw = fetch_fw + + +_install_firmware_fetch_patch() + +from tinygrad.device import Device +from tinygrad.engine.jit import TinyJit +from tinygrad.helpers import Context +from tinygrad.nn.onnx import OnnxRunner +from tinygrad.tensor import Tensor + + +@dataclass(frozen=True) +class FrameGeometry: + width: int + height: int + stride: int + y_height: int + uv_height: int + size: int + + +WARP_INPUT_NAMES = ["img_q", "big_img_q", "tfm", "big_tfm"] +POLICY_INPUT_NAMES = ["feat_q", "desire_q", "desire", "traffic_convention", "action_t"] +WARP_DEV = os.getenv("WARP_DEV") + + +def _random_tensor_inputs(keys: list[str], shape, device=None): + return {key: Tensor.randint(shape, low=0, high=256, dtype="uint8", device=device).realize() for key in keys} + + +def _project_frame(src_flat, inverse_matrix, dst_shape, src_shape, stride_pad, border_fill_val=None): + dst_w, dst_h = dst_shape + src_h, src_w = src_shape + + x = Tensor.arange(dst_w, device=WARP_DEV).reshape(1, dst_w).expand(dst_h, dst_w).reshape(-1) + y = Tensor.arange(dst_h, device=WARP_DEV).reshape(dst_h, 1).expand(dst_h, dst_w).reshape(-1) + + src_x = inverse_matrix[0, 0] * x + inverse_matrix[0, 1] * y + inverse_matrix[0, 2] + src_y = inverse_matrix[1, 0] * x + inverse_matrix[1, 1] * y + inverse_matrix[1, 2] + src_w_scale = inverse_matrix[2, 0] * x + inverse_matrix[2, 1] * y + inverse_matrix[2, 2] + + src_x = src_x / src_w_scale + src_y = src_y / src_w_scale + + rounded_x = Tensor.round(src_x) + rounded_y = Tensor.round(src_y) + clipped_x = rounded_x.clip(0, src_w - 1).cast("int") + clipped_y = rounded_y.clip(0, src_h - 1).cast("int") + gather_index = clipped_y * (src_w + stride_pad) + clipped_x + sampled = src_flat[gather_index] + + if border_fill_val is None: + return sampled + + inside = ((rounded_x >= 0) & (rounded_x <= src_w - 1) & (rounded_y >= 0) & (rounded_y <= src_h - 1)).cast(sampled.dtype) + return sampled * inside + Tensor(border_fill_val, dtype=sampled.dtype) * (1 - inside) + + +def _nv12_to_model_planes(yuv_frame): + y_height = (yuv_frame.shape[0] * 2) // 3 + frame_width = yuv_frame.shape[1] + return Tensor.cat( + yuv_frame[0:y_height:2, 0::2], + yuv_frame[1:y_height:2, 0::2], + yuv_frame[0:y_height:2, 1::2], + yuv_frame[1:y_height:2, 1::2], + yuv_frame[y_height:y_height + y_height // 4].reshape((y_height // 2, frame_width // 2)), + yuv_frame[y_height + y_height // 4:y_height + y_height // 2].reshape((y_height // 2, frame_width // 2)), + dim=0, + ).reshape((6, y_height // 2, frame_width // 2)) + + +def _warp_kernel_factory(nv12: FrameGeometry, model_w: int, model_h: int): + uv_offset = nv12.stride * nv12.y_height + stride_pad = nv12.stride - nv12.width + + def prepare_frame(nv12_blob, inverse_matrix): + inverse_uv = inverse_matrix * Tensor([[1.0, 1.0, 0.5], [1.0, 1.0, 0.5], [2.0, 2.0, 1.0]], device=WARP_DEV) + uv_plane = nv12_blob[uv_offset:uv_offset + nv12.uv_height * nv12.stride].reshape(nv12.uv_height, nv12.stride) + with Context(SPLIT_REDUCEOP=0): + y_plane = _project_frame(nv12_blob[:nv12.height * nv12.stride], inverse_matrix, (model_w, model_h), (nv12.height, nv12.width), stride_pad).realize() + u_plane = _project_frame(uv_plane[:nv12.height // 2, :nv12.width:2].flatten(), inverse_uv, (model_w // 2, model_h // 2), (nv12.height // 2, nv12.width // 2), 0).realize() + v_plane = _project_frame(uv_plane[:nv12.height // 2, 1:nv12.width:2].flatten(), inverse_uv, (model_w // 2, model_h // 2), (nv12.height // 2, nv12.width // 2), 0).realize() + return _nv12_to_model_planes(y_plane.cat(u_plane).cat(v_plane).reshape((model_h * 3 // 2, model_w))) + + return prepare_frame + + +def _vision_queue_state(vision_shapes, frame_skip, device): + img_shape = vision_shapes["img"] + frame_history = img_shape[1] // 6 + queue_shape = (frame_skip * (frame_history - 1) + 1, 6, img_shape[2], img_shape[3]) + numpy_state = { + "tfm": np.zeros((3, 3), dtype=np.float32), + "big_tfm": np.zeros((3, 3), dtype=np.float32), + } + tensor_state = { + "img_q": Tensor(np.zeros(queue_shape, dtype=np.uint8), device=device).contiguous().realize(), + "big_img_q": Tensor(np.zeros(queue_shape, dtype=np.uint8), device=device).contiguous().realize(), + **{name: Tensor(value, device="NPY").realize() for name, value in numpy_state.items()}, + } + return tensor_state, numpy_state + + +def _policy_queue_state(vision_shapes, policy_shapes, frame_skip, device): + tensor_state, numpy_state = _vision_queue_state(vision_shapes, frame_skip, device) + feature_shape = policy_shapes["features_buffer"] + desire_shape = policy_shapes["desire_pulse"] + traffic_shape = policy_shapes["traffic_convention"] + action_shape = traffic_shape + + policy_numpy = { + "desire": np.zeros(desire_shape[2], dtype=np.float32), + "traffic_convention": np.zeros(traffic_shape, dtype=np.float32), + "action_t": np.zeros(action_shape, dtype=np.float32), + } + numpy_state.update(policy_numpy) + tensor_state.update({ + "feat_q": Tensor(np.zeros((frame_skip * (feature_shape[1] - 1) + 1, feature_shape[0], feature_shape[2]), dtype=np.float32), device=device).contiguous().realize(), + "desire_q": Tensor(np.zeros((frame_skip * desire_shape[1], desire_shape[0], desire_shape[2]), dtype=np.float32), device=device).contiguous().realize(), + **{name: Tensor(value, device="NPY").realize() for name, value in policy_numpy.items()}, + }) + return tensor_state, numpy_state + + +def _roll_queue(queue_tensor, incoming, sampler): + queue_tensor.assign(queue_tensor[1:].cat(incoming, dim=0).contiguous()) + return sampler(queue_tensor) + + +def _sample_sparse(queue_tensor, frame_skip): + return queue_tensor[::frame_skip].contiguous().flatten(0, 1).unsqueeze(0) + + +def _sample_desire(queue_tensor, frame_skip): + return queue_tensor.reshape(-1, frame_skip, *queue_tensor.shape[1:]).max(1).flatten(0, 1).unsqueeze(0) + + +def _build_warp_enqueuer(nv12: FrameGeometry, model_w: int, model_h: int, frame_skip: int): + prepare_frame = _warp_kernel_factory(nv12, model_w, model_h) + sparse_sampler = partial(_sample_sparse, frame_skip=frame_skip) + + def enqueue(img_q, big_img_q, tfm, big_tfm, frame, big_frame): + tfm = tfm.to(WARP_DEV) + big_tfm = big_tfm.to(WARP_DEV) + Tensor.realize(tfm, big_tfm) + + warped_main = prepare_frame(frame, tfm).unsqueeze(0).to(Device.DEFAULT) + warped_big = prepare_frame(big_frame, big_tfm).unsqueeze(0).to(Device.DEFAULT) + return ( + _roll_queue(img_q, warped_main, sparse_sampler), + _roll_queue(big_img_q, warped_big, sparse_sampler), + ) + + return enqueue + + +def _policy_executor(model_runners, model_metadata, frame_skip): + desire_sampler = partial(_sample_desire, frame_skip=frame_skip) + sparse_sampler = partial(_sample_sparse, frame_skip=frame_skip) + hidden_slice = model_metadata["vision"]["output_slices"]["hidden_state"] + + def execute(img, big_img, feat_q, desire_q, desire, traffic_convention, action_t): + desire = desire.to(Device.DEFAULT) + traffic_convention = traffic_convention.to(Device.DEFAULT) + action_t = action_t.to(Device.DEFAULT) + Tensor.realize(desire, traffic_convention, action_t) + + desire_buffer = _roll_queue(desire_q, desire.reshape(1, 1, -1), desire_sampler) + vision_output = next(iter(model_runners["vision"]({"img": img, "big_img": big_img}).values())).cast("float32") + + hidden_state = vision_output[:, hidden_slice].reshape(1, -1).unsqueeze(0) + feature_buffer = _roll_queue(feat_q, hidden_state, sparse_sampler) + + on_inputs = { + "features_buffer": feature_buffer, + "desire_pulse": desire_buffer, + "traffic_convention": traffic_convention, + "action_t": action_t, + } + on_output = next(iter(model_runners["on_policy"](on_inputs).values())).cast("float32") + off_output = next(iter(model_runners["off_policy"](on_inputs).values())).cast("float32") + return vision_output, on_output, off_output + + return execute + + +def _replay_and_freeze(jit_runner, random_inputs_factory, queue_keys, queue_factory): + seed = 42 + + def validate(fn, seed_value, baseline_output=None, baseline_buffers=None, expect_match=True): + queue_tensors, numpy_values = queue_factory(Device.DEFAULT) + np.random.seed(seed_value) + Tensor.manual_seed(seed_value) + + replay_count = 1 if (baseline_output is not None or baseline_buffers is not None) else 3 + for run_index in range(replay_count): + for value in numpy_values.values(): + value[:] = np.random.randn(*value.shape).astype(value.dtype) + Device.default.synchronize() + random_inputs = random_inputs_factory() + start = time.perf_counter() + outputs = fn(**{key: queue_tensors[key] for key in queue_keys}, **random_inputs) + enqueue_done = time.perf_counter() + Device.default.synchronize() + total_done = time.perf_counter() + print(f" [{run_index + 1}/{replay_count}] enqueue {(enqueue_done - start) * 1e3:6.2f} ms -- total {(total_done - start) * 1e3:6.2f} ms") + + if run_index == 0: + output_snapshot = [np.copy(value.numpy()) for value in outputs] + buffer_snapshot = [np.copy(value.numpy().copy()) for value in queue_tensors.values()] + + if baseline_output is not None: + matches = all(np.array_equal(current, reference) for current, reference in zip(output_snapshot, baseline_output, strict=True)) + assert matches == expect_match, f"outputs {'differ from' if expect_match else 'match'} baseline (seed={seed_value})" + if baseline_buffers is not None: + matches = all(np.array_equal(current, reference) for current, reference in zip(buffer_snapshot, baseline_buffers, strict=True)) + assert matches == expect_match, f"buffers {'differ from' if expect_match else 'match'} baseline (seed={seed_value})" + return output_snapshot, buffer_snapshot + + print("capture + replay") + first_output, first_buffers = validate(jit_runner, seed) + print("pickle round trip") + frozen = pickle.loads(pickle.dumps(jit_runner)) + validate(frozen, seed, first_output, first_buffers, expect_match=True) + validate(frozen, seed + 1, first_output, first_buffers, expect_match=False) + return frozen + + +def _parse_size(text: str) -> tuple[int, int]: + width, height = text.lower().split("x") + return int(width), int(height) + + +def _read_file_to_shared_memory(path: str) -> str: + from iqpilot.common.file_chunker import read_file_chunked + from iqpilot.system.hardware.hw import Paths + + shm_path = os.path.join(Paths.shm_path(), os.path.basename(path)) + atexit.register(lambda: os.path.exists(shm_path) and os.remove(shm_path)) + with open(shm_path, "wb") as handle: + handle.write(read_file_chunked(path)) + return shm_path + + +def _arg_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser() + parser.add_argument("--model-size", type=_parse_size, required=True, help="model input WxH") + parser.add_argument("--camera-resolutions", type=_parse_size, nargs="+", required=True, help="camera resolutions WxH (one or more)") + parser.add_argument("--vision-onnx", required=True) + parser.add_argument("--off-policy-onnx", required=True) + parser.add_argument("--on-policy-onnx", required=True) + parser.add_argument("--output", required=True) + parser.add_argument("--frame-skip", type=int, required=True) + return parser + + +def main(argv: list[str] | None = None) -> int: + from iqpilot.selfdrive.iqmodeld.metadata import build_metadata_record + from iqpilot.system.camerad.cameras.nv12_info import get_nv12_info + + args = _arg_parser().parse_args(argv) + model_w, model_h = args.model_size + + model_paths = { + "vision": _read_file_to_shared_memory(args.vision_onnx), + "off_policy": _read_file_to_shared_memory(args.off_policy_onnx), + "on_policy": _read_file_to_shared_memory(args.on_policy_onnx), + } + model_runners = {name: OnnxRunner(path) for name, path in model_paths.items()} + metadata = {name: build_metadata_record(path) for name, path in model_paths.items()} + + assert metadata["off_policy"]["input_shapes"] == metadata["on_policy"]["input_shapes"] + + output_package: dict = {"metadata": metadata} + policy_jit = TinyJit(_policy_executor(model_runners, metadata, args.frame_skip), prune=True) + policy_queue_factory = partial(_policy_queue_state, metadata["vision"]["input_shapes"], metadata["on_policy"]["input_shapes"], args.frame_skip) + random_model_inputs = partial(_random_tensor_inputs, keys=["img", "big_img"], shape=metadata["vision"]["input_shapes"]["img"]) + output_package["run_policy"] = _replay_and_freeze(policy_jit, random_model_inputs, POLICY_INPUT_NAMES, policy_queue_factory) + + for cam_w, cam_h in args.camera_resolutions: + nv12 = FrameGeometry(cam_w, cam_h, *get_nv12_info(cam_w, cam_h)) + warp_jit = TinyJit(_build_warp_enqueuer(nv12, model_w, model_h, args.frame_skip), prune=True) + warp_queue_factory = partial(_vision_queue_state, metadata["vision"]["input_shapes"], args.frame_skip) + random_warp_inputs = partial(_random_tensor_inputs, keys=["frame", "big_frame"], shape=nv12.size, device=WARP_DEV) + output_package[(cam_w, cam_h)] = _replay_and_freeze(warp_jit, random_warp_inputs, WARP_INPUT_NAMES, warp_queue_factory) + + output_package["frame_skip"] = args.frame_skip + with open(args.output, "wb") as handle: + pickle.dump(output_package, handle) + print(f"Saved JITs to {args.output} ({os.path.getsize(args.output) / 1e6:.2f} MB)") + return 0 diff --git a/iqpilot/selfdrive/iqmodeld/tools/egpu_host_mock.py b/iqpilot/selfdrive/iqmodeld/tools/egpu_host_mock.py new file mode 100644 index 000000000..3b43dd8e4 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/egpu_host_mock.py @@ -0,0 +1,64 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import os +import sys +import tempfile + +DEFAULT_ARCH = "gfx1200" +MOCK_DEV = "MOCKUSB+AMD:LLVM" + + +def tinygrad_tree() -> str: + override = os.environ.get("IQ_TINYGRAD_TREE") + if override: + return override + here = os.path.dirname(os.path.abspath(__file__)) + root = os.path.abspath(os.path.join(here, "..", "..", "..", "..")) + return os.path.join(root, "components", "tinygrad") + + +def activate(arch: str = DEFAULT_ARCH, execute: bool = False) -> None: + assert "tinygrad" not in sys.modules, "egpu_host_mock.activate must run before tinygrad is imported" + os.environ["DEV"] = f"{MOCK_DEV}:{arch}" + tree = tinygrad_tree() + if tree not in sys.path: + sys.path.insert(0, tree) + from test.mockgpu.am import amgpu + + # The mock dock models 512MB VRAM; big-model weights alone exceed that. Must be set before amdriver binds it. + amgpu.VRAM_SIZE = int(os.environ.get("IQ_MOCK_VRAM_GB", "4")) << 30 + from tinygrad.runtime.autogen import libc + if sys.platform == "darwin": + # A Homebrew-LLVM gfx1200 kernel (no s_code_end padding) hung a real dock; ship only container-built artifacts. + print("egpu_host_mock: native macOS LLVM output is for tests only; use scripts/iqpilot/host_egpu_compile_docker.sh for artifacts", + file=sys.stderr) + + def memfd_create(name, flags): + fd, path = tempfile.mkstemp(prefix=b"iq_mock_" + bytes(name) + b"_") + os.unlink(path) + return fd + libc.memfd_create = memfd_create + if not hasattr(libc, "MFD_CLOEXEC"): + libc.MFD_CLOEXEC = 1 + if not execute: + import ctypes + from test.mockgpu.amd import amdgpu + amdgpu.remu.run_asm = lambda *args, **kwargs: 0 + pm4_wait = amdgpu.PM4Executor._exec_wait_reg_mem + sdma_poll = amdgpu.SDMAExecutor._execute_poll_regmem + + # Without kernel execution no memory wait carries information; a blocked wait would need a host write to re-poll it. + def pm4_wait_passthrough(self, n): + if not pm4_wait(self, n): + self.rptr[0] += 7 + return True + + def sdma_poll_passthrough(self): + if not sdma_poll(self): + self.rptr[0] += ctypes.sizeof(amdgpu.sdma_pkts.poll_regmem) + return True + amdgpu.PM4Executor._exec_wait_reg_mem = pm4_wait_passthrough + amdgpu.SDMAExecutor._execute_poll_regmem = sdma_poll_passthrough diff --git a/iqpilot/selfdrive/iqmodeld/tools/install_models_pc.py b/iqpilot/selfdrive/iqmodeld/tools/install_models_pc.py new file mode 100755 index 000000000..e82325b97 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/install_models_pc.py @@ -0,0 +1,128 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import base64 +import pickle +import shutil +import sys +from dataclasses import dataclass +from pathlib import Path + +import onnx + +from iqpilot.system.hardware.hw import Paths + +_MODEL_STEMS = ("driving_off_policy", "driving_on_policy", "driving_policy", "driving_vision") + + +@dataclass(frozen=True) +class _ModelBundle: + stem: str + onnx_path: Path + artifact_path: Path + metadata_path: Path + + +def _tensor_shape(value_info) -> tuple[int, ...]: + return tuple(int(dim.dim_value) for dim in value_info.type.tensor_type.shape.dim) + + +def _metadata_property(graph_model, key: str) -> str | None: + for property_item in graph_model.metadata_props: + if property_item.key == key: + return property_item.value + return None + + +def _decode_output_slices(encoded_value: str): + return pickle.loads(base64.b64decode(encoded_value.encode())) + + +def _metadata_record(graph_model) -> dict: + encoded_slices = _metadata_property(graph_model, "output_slices") + if encoded_slices is None: + raise ValueError("output_slices metadata missing") + return { + "model_checkpoint": _metadata_property(graph_model, "model_checkpoint"), + "output_slices": _decode_output_slices(encoded_slices), + "input_shapes": {item.name: _tensor_shape(item) for item in graph_model.graph.input}, + "output_shapes": {item.name: _tensor_shape(item) for item in graph_model.graph.output}, + } + + +def generate_metadata_pkl(model_path, output_path): + try: + graph_model = onnx.load(str(model_path)) + metadata = _metadata_record(graph_model) + except Exception: + return False + + with open(output_path, "wb") as handle: + pickle.dump(metadata, handle) + return True + + +def _discover_model_bundles(model_dir: Path) -> list[_ModelBundle]: + bundles: list[_ModelBundle] = [] + for stem in _MODEL_STEMS: + onnx_path = model_dir / f"{stem}.onnx" + if not onnx_path.exists(): + continue + bundles.append(_ModelBundle( + stem=stem, + onnx_path=onnx_path, + artifact_path=model_dir / f"{stem}_tinygrad.pkl", + metadata_path=model_dir / f"{stem}_metadata.pkl", + )) + return bundles + + +def _prompt_short_name(found_stems: list[str]) -> str | None: + try: + response = input(f"Found models ({', '.join(found_stems)}). Enter model short name (e.g. wmiv4): ").strip() + except EOFError: + return None + return response or None + + +def _ensure_metadata_file(bundle: _ModelBundle) -> None: + if bundle.metadata_path.exists(): + return + generate_metadata_pkl(bundle.onnx_path, bundle.metadata_path) + + +def _install_bundle(bundle: _ModelBundle, suffix: str, destination_root: Path) -> None: + _ensure_metadata_file(bundle) + renamed_artifact = destination_root / f"{bundle.stem}_{suffix}_tinygrad.pkl" + renamed_metadata = destination_root / f"{bundle.stem}_{suffix}_metadata.pkl" + if bundle.artifact_path.exists(): + shutil.move(str(bundle.artifact_path), str(renamed_artifact)) + if bundle.metadata_path.exists(): + shutil.move(str(bundle.metadata_path), str(renamed_metadata)) + + +def install_models(model_dir): + source_root = Path(model_dir) + bundles = _discover_model_bundles(source_root) + if not bundles: + return + + short_name = _prompt_short_name([bundle.stem for bundle in bundles]) + if short_name is None: + print("No name provided, skipping installation.") + return + + destination_root = Path(Paths.model_root()) + destination_root.mkdir(parents=True, exist_ok=True) + for bundle in bundles: + _install_bundle(bundle, short_name, destination_root) + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Usage: install_models_pc.py ") + sys.exit(1) + install_models(sys.argv[1]) diff --git a/iqpilot/selfdrive/iqmodeld/tools/oob_rewrite.py b/iqpilot/selfdrive/iqmodeld/tools/oob_rewrite.py new file mode 100644 index 000000000..3f109669f --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/tools/oob_rewrite.py @@ -0,0 +1,64 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import argparse +import os +import pickletools +import struct + +from iqpilot.selfdrive.iqmodeld.egpu_policy import OOB_MAGIC + +MIN_OOB_BYTES = 1 << 16 +NEXT_BUFFER = b"\x97" +READONLY_BUFFER = b"\x98" + + +def rewrite_oob(src: str, dst: str, min_bytes: int = MIN_OOB_BYTES) -> tuple[int, int]: + # tinygrad pickles device buffers as PickleBuffers, which land in-band as BYTEARRAY8/BINBYTES8 + # without a buffer_callback; moving those opcodes out-of-band is byte-for-byte what a protocol-5 + # dump with a buffer_callback produces, so nothing has to be unpickled (no dock needed). + with open(src, "rb") as f: + data = f.read() + ops = list(pickletools.genops(data)) + proto = next((arg for op, arg, _ in ops if op.name == "PROTO"), 0) + if proto < 5: + raise ValueError(f"{src} is pickle protocol {proto}; out-of-band buffers need protocol 5") + moved = 0 + tmp = dst + ".part" + with open(tmp, "wb") as out, open(tmp + ".buf", "wb") as bufs: + ops_stream = bytearray() + for i, (op, arg, pos) in enumerate(ops): + end = ops[i + 1][2] if i + 1 < len(ops) else len(data) + if op.name in ("BYTEARRAY8", "BINBYTES8", "BINBYTES") and len(arg) >= min_bytes: + ops_stream += NEXT_BUFFER + if op.name != "BYTEARRAY8": + ops_stream += READONLY_BUFFER + bufs.write(struct.pack(" None: + p = argparse.ArgumentParser() + p.add_argument("src") + p.add_argument("dst") + args = p.parse_args() + moved, total = rewrite_oob(args.src, args.dst) + print(f"{args.dst}: moved {moved} buffers out-of-band ({total} opcodes, {os.path.getsize(args.dst) / 1e6:.1f} MB)") + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl b/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl new file mode 100644 index 000000000..810e916a2 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.cl @@ -0,0 +1,57 @@ +/* +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +*/ +#define INTER_BITS 5 +#define INTER_TAB_SIZE (1 << INTER_BITS) +#define INTER_REMAP_COEF_BITS 15 +#define INTER_REMAP_COEF_SCALE (1 << INTER_REMAP_COEF_BITS) + +__kernel void projectPlaneBilinear(__global const uchar * src, + int src_row_stride, int src_px_stride, int src_offset, int src_rows, int src_cols, + __global uchar * dst, + int dst_row_stride, int dst_offset, int dst_rows, int dst_cols, + __constant float * M) +{ + int dx = get_global_id(0); + int dy = get_global_id(1); + + if (dx < dst_cols && dy < dst_rows) { + float x0 = M[0] * dx + M[1] * dy + M[2]; + float y0 = M[3] * dx + M[4] * dy + M[5]; + float w = M[6] * dx + M[7] * dy + M[8]; + w = w != 0.0f ? INTER_TAB_SIZE / w : 0.0f; + + int x = rint(x0 * w); + int y = rint(y0 * w); + short sx = convert_short_sat(x >> INTER_BITS); + short sy = convert_short_sat(y >> INTER_BITS); + short min_col = (short)0; + short max_col = convert_short_sat(src_cols - 1); + short min_row = (short)0; + short max_row = convert_short_sat(src_rows - 1); + + short sx_clamp = clamp(sx, min_col, max_col); + short sx_p1_clamp = clamp((short)(sx + 1), min_col, max_col); + short sy_clamp = clamp(sy, min_row, max_row); + short sy_p1_clamp = clamp((short)(sy + 1), min_row, max_row); + + int top_left = convert_int(src[mad24(sy_clamp, src_row_stride, src_offset + sx_clamp * src_px_stride)]); + int top_right = convert_int(src[mad24(sy_clamp, src_row_stride, src_offset + sx_p1_clamp * src_px_stride)]); + int bottom_left = convert_int(src[mad24(sy_p1_clamp, src_row_stride, src_offset + sx_clamp * src_px_stride)]); + int bottom_right = convert_int(src[mad24(sy_p1_clamp, src_row_stride, src_offset + sx_p1_clamp * src_px_stride)]); + + short ay = (short)(y & (INTER_TAB_SIZE - 1)); + short ax = (short)(x & (INTER_TAB_SIZE - 1)); + float taby = 1.f / INTER_TAB_SIZE * ay; + float tabx = 1.f / INTER_TAB_SIZE * ax; + + int coeff0 = convert_short_sat_rte((1.0f - taby) * (1.0f - tabx) * INTER_REMAP_COEF_SCALE); + int coeff1 = convert_short_sat_rte((1.0f - taby) * tabx * INTER_REMAP_COEF_SCALE); + int coeff2 = convert_short_sat_rte(taby * (1.0f - tabx) * INTER_REMAP_COEF_SCALE); + int coeff3 = convert_short_sat_rte(taby * tabx * INTER_REMAP_COEF_SCALE); + + int blended = top_left * coeff0 + top_right * coeff1 + bottom_left * coeff2 + bottom_right * coeff3; + int dst_index = mad24(dy, dst_row_stride, dst_offset + dx); + dst[dst_index] = convert_uchar_sat((blended + (1 << (INTER_REMAP_COEF_BITS - 1))) >> INTER_REMAP_COEF_BITS); + } +} diff --git a/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl b/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl new file mode 100644 index 000000000..187a98fa3 --- /dev/null +++ b/iqpilot/selfdrive/iqmodeld/transforms/yuv.cl @@ -0,0 +1,46 @@ +/* +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +*/ +#define UV_SIZE ((TRANSFORMED_WIDTH/2)*(TRANSFORMED_HEIGHT/2)) + +__kernel void packLumaHalves(__global uchar8 const * const in_luma, + __global uchar * out_frame, + int out_offset) +{ + const int gid = get_global_id(0); + const int output_index_start = gid * 8; + const int row = output_index_start / TRANSFORMED_WIDTH; + const int col = output_index_start % TRANSFORMED_WIDTH; + const uchar8 luma_block = in_luma[gid]; + + __global uchar *top_or_left; + __global uchar *bottom_or_right; + if ((row & 1) == 0) { + top_or_left = out_frame + out_offset; + bottom_or_right = out_frame + out_offset + UV_SIZE * 2; + } else { + top_or_left = out_frame + out_offset + UV_SIZE; + bottom_or_right = out_frame + out_offset + UV_SIZE * 3; + } + + const int row_stride = (row / 2) * (TRANSFORMED_WIDTH / 2) + col / 2; + vstore4(luma_block.s0246, 0, top_or_left + row_stride); + vstore4(luma_block.s1357, 0, bottom_or_right + row_stride); +} + +__kernel void packChromaPlane(__global uchar8 const * const in_plane, + __global uchar8 * out_frame, + int out_offset) +{ + const int gid = get_global_id(0); + out_frame[gid + out_offset / 8] = in_plane[gid]; +} + +__kernel void copyPlaneBytes(__global uchar8 * in_plane, + __global uchar8 * out_plane, + int in_offset, + int out_offset) +{ + const int gid = get_global_id(0); + out_plane[gid + out_offset / 8] = in_plane[gid + in_offset / 8]; +} diff --git a/iqpilot/selfdrive/locationd/.gitignore b/iqpilot/selfdrive/locationd/.gitignore new file mode 100644 index 000000000..11b9f127b --- /dev/null +++ b/iqpilot/selfdrive/locationd/.gitignore @@ -0,0 +1,3 @@ +params_learner +paramsd +locationd diff --git a/iqpilot/selfdrive/locationd/__init__.py b/iqpilot/selfdrive/locationd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/locationd/calibration_helpers.py b/iqpilot/selfdrive/locationd/calibration_helpers.py new file mode 100644 index 000000000..11e39af3e --- /dev/null +++ b/iqpilot/selfdrive/locationd/calibration_helpers.py @@ -0,0 +1,32 @@ +import math + +import numpy as np +from iqpilot.cereal import log + +from iqpilot.selfdrive.locationd.calibrationd import HEIGHT_INIT, HEIGHT_SANE_MIN, HEIGHT_SANE_MAX + + +def get_calibrated_rpy(live_calib: log.ExtrinsicsCalibration) -> np.ndarray | None: + if live_calib.calStatus != log.ExtrinsicsCalibration.Status.calibrated: + return None + + if len(live_calib.rpyCalib) != 3: + return None + + calib_rpy = np.asarray(live_calib.rpyCalib, dtype=np.float32) + return calib_rpy if np.isfinite(calib_rpy).all() else None + + +def get_render_path_height(live_calib: log.ExtrinsicsCalibration) -> float: + if live_calib.calStatus != log.ExtrinsicsCalibration.Status.calibrated: + return float(HEIGHT_INIT[0]) + + if len(live_calib.height) != 1: + return float(HEIGHT_INIT[0]) + + height = float(live_calib.height[0]) + if not math.isfinite(height): + return float(HEIGHT_INIT[0]) + if not (HEIGHT_SANE_MIN <= height <= HEIGHT_SANE_MAX): + return float(HEIGHT_INIT[0]) + return height diff --git a/iqpilot/selfdrive/locationd/calibrationd.py b/iqpilot/selfdrive/locationd/calibrationd.py new file mode 100755 index 000000000..3e3ec6d45 --- /dev/null +++ b/iqpilot/selfdrive/locationd/calibrationd.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +''' +This process finds calibration values. More info on what these calibration values +are can be found here https://github.com/commaai/openpilot/tree/master/common/transformations +While the roll calibration is a real value that can be estimated, here we assume it's zero, +and the image input into the neural network is not corrected for roll. +''' + +import os +import capnp +import numpy as np +from typing import NoReturn + +from iqpilot.cereal import log, car +import iqpilot.cereal.messaging as messaging +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.issue_debug import log_issue_limited +from iqpilot.common.realtime import config_realtime_process +from iqpilot.common.transformations.orientation import rot_from_euler, euler_from_rot +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import HARDWARE + +MIN_SPEED_FILTER = 15 * CV.MPH_TO_MS +MAX_VEL_ANGLE_STD = np.radians(0.25) +MAX_YAW_RATE_FILTER = np.radians(2) # per second + +MAX_HEIGHT_STD = np.exp(-3.5) + +# This is at model frequency, blocks needed for efficiency +SMOOTH_CYCLES = 10 +BLOCK_SIZE = 100 +INPUTS_NEEDED = 5 # Minimum blocks needed for valid calibration +INPUTS_WANTED = 50 # We want a little bit more than we need for stability +MAX_ALLOWED_YAW_SPREAD = np.radians(2) +MAX_ALLOWED_PITCH_SPREAD = np.radians(4) +TICI_FAMILY_PITCH_SPREAD_RESET = np.radians(3) +RPY_INIT = np.array([0.0,0.0,0.0]) +WIDE_FROM_DEVICE_EULER_INIT = np.array([0.0, 0.0, 0.0]) +HEIGHT_INIT = np.array([1.22]) +HEIGHT_SANE_MIN, HEIGHT_SANE_MAX = 0.9, 2.0 +DEVICE_IS_TICI_FAMILY = HARDWARE.get_device_type() in ("tici", "tizi") + +# These values are needed to accommodate the model frame in the narrow cam +if HARDWARE.get_device_type() == 'mici': + PITCH_LIMITS = np.array([-0.143101, 0.22235988]) +else: + PITCH_LIMITS = np.array([-0.09074112085129739, 0.17]) +YAW_LIMITS = np.array([-0.06912048084718224, 0.06912048084718235]) +DEBUG = os.getenv("DEBUG") is not None + +def is_calibration_valid(rpy: np.ndarray) -> bool: + return (PITCH_LIMITS[0] < rpy[1] < PITCH_LIMITS[1]) and (YAW_LIMITS[0] < rpy[2] < YAW_LIMITS[1]) + + +def sanity_clip(rpy: np.ndarray) -> np.ndarray: + if np.isnan(rpy).any(): + rpy = RPY_INIT + return np.array([rpy[0], + np.clip(rpy[1], PITCH_LIMITS[0] - .005, PITCH_LIMITS[1] + .005), + np.clip(rpy[2], YAW_LIMITS[0] - .005, YAW_LIMITS[1] + .005)]) + +def moving_avg_with_linear_decay(prev_mean: np.ndarray, new_val: np.ndarray, idx: int, block_size: float) -> np.ndarray: + return (idx*prev_mean + (block_size - idx) * new_val) / block_size + +class Calibrator: + def __init__(self, param_put: bool = False): + self.param_put = param_put + + self.not_car = False + self.stable_rpy = RPY_INIT.copy() + self.stable_wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT.copy() + self.stable_height = HEIGHT_INIT.copy() + self.has_stable_snapshot = False + + # Read saved calibration + self.params = Params() + calibration_params = self.params.get("CalibrationParams") + rpy_init = RPY_INIT + wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT + height = HEIGHT_INIT + valid_blocks = 0 + self.cal_status = log.ExtrinsicsCalibration.Status.uncalibrated + + if param_put and calibration_params: + try: + with log.Event.from_bytes(calibration_params) as msg: + rpy_init = np.array(msg.extrinsicsCalibration.rpyCalib) + valid_blocks = msg.extrinsicsCalibration.validBlocks + wide_from_device_euler = np.array(msg.extrinsicsCalibration.wideFromDeviceEuler) + height = np.array(msg.extrinsicsCalibration.height) + except Exception: + cloudlog.exception("Error reading cached CalibrationParams") + + self.reset(rpy_init, valid_blocks, wide_from_device_euler, height) + self.update_status() + + # If saved calibration is immediately invalid (e.g. bad params from a previous + # bootstrap bug or device remount), auto-clear it so we recalibrate from scratch + # instead of getting permanently stuck in the "Calibration Invalid" state. + if self.cal_status == log.ExtrinsicsCalibration.Status.invalid: + cloudlog.warning("calibrationd: saved CalibrationParams are invalid, clearing and starting fresh") + if param_put: + self.params.remove("CalibrationParams") + self.reset() + self.update_status() + + def _remember_stable_solution(self) -> None: + self.stable_rpy = self.rpy.copy() + self.stable_wide_from_device_euler = self.wide_from_device_euler.copy() + self.stable_height = self.height.copy() + self.has_stable_snapshot = True + + def reset(self, rpy_init: np.ndarray = RPY_INIT, + valid_blocks: int = 0, + wide_from_device_euler_init: np.ndarray = WIDE_FROM_DEVICE_EULER_INIT, + height_init: np.ndarray = HEIGHT_INIT, + smooth_from: np.ndarray | None = None) -> None: + if not np.isfinite(rpy_init).all(): + self.rpy = RPY_INIT.copy() + else: + self.rpy = rpy_init.copy() + + if not np.isfinite(height_init).all() or len(height_init) != 1: + self.height = HEIGHT_INIT.copy() + else: + self.height = height_init.copy() + + if not np.isfinite(wide_from_device_euler_init).all() or len(wide_from_device_euler_init) != 3: + self.wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT.copy() + else: + self.wide_from_device_euler = wide_from_device_euler_init.copy() + + if not np.isfinite(valid_blocks) or valid_blocks < 0: + self.valid_blocks = 0 + else: + self.valid_blocks = valid_blocks + + self.rpys = np.tile(self.rpy, (INPUTS_WANTED, 1)) + self.wide_from_device_eulers = np.tile(self.wide_from_device_euler, (INPUTS_WANTED, 1)) + self.heights = np.tile(self.height, (INPUTS_WANTED, 1)) + + self.idx = 0 + self.block_idx = 0 + self.v_ego = 0.0 + + if smooth_from is None: + self.old_rpy = RPY_INIT + self.old_rpy_weight = 0.0 + else: + self.old_rpy = smooth_from + self.old_rpy_weight = 1.0 + + def get_valid_idxs(self) -> list[int]: + # exclude current block_idx from validity window + before_current = list(range(self.block_idx)) + after_current = list(range(min(self.valid_blocks, self.block_idx + 1), self.valid_blocks)) + return before_current + after_current + + def update_status(self) -> None: + valid_idxs = self.get_valid_idxs() + if valid_idxs: + self.wide_from_device_euler = np.mean(self.wide_from_device_eulers[valid_idxs], axis=0) + self.height = np.mean(self.heights[valid_idxs], axis=0) + rpys = self.rpys[valid_idxs] + self.rpy = np.mean(rpys, axis=0) + max_rpy_calib = np.array(np.max(rpys, axis=0)) + min_rpy_calib = np.array(np.min(rpys, axis=0)) + self.calib_spread = np.abs(max_rpy_calib - min_rpy_calib) + else: + self.calib_spread = np.zeros(3) + + if self.valid_blocks < INPUTS_NEEDED: + if self.cal_status == log.ExtrinsicsCalibration.Status.recalibrating: + self.cal_status = log.ExtrinsicsCalibration.Status.recalibrating + else: + self.cal_status = log.ExtrinsicsCalibration.Status.uncalibrated + elif is_calibration_valid(self.rpy): + self.cal_status = log.ExtrinsicsCalibration.Status.calibrated + else: + self.cal_status = log.ExtrinsicsCalibration.Status.invalid + + # If spread is too high, assume mounting was changed and reset to last block. + # Make the transition smooth. Abrupt transitions are not good for feedback loop through supercombo model. + # TODO: add height spread check with smooth transition too + pitch_spread_limit = TICI_FAMILY_PITCH_SPREAD_RESET if DEVICE_IS_TICI_FAMILY else MAX_ALLOWED_PITCH_SPREAD + spread_too_high = self.calib_spread[1] > pitch_spread_limit or self.calib_spread[2] > MAX_ALLOWED_YAW_SPREAD + if self.cal_status == log.ExtrinsicsCalibration.Status.calibrated and not spread_too_high: + self._remember_stable_solution() + + if spread_too_high and self.cal_status == log.ExtrinsicsCalibration.Status.calibrated: + use_stable_snapshot = DEVICE_IS_TICI_FAMILY and self.has_stable_snapshot + if use_stable_snapshot: + reset_rpy = self.stable_rpy + reset_wide = self.stable_wide_from_device_euler + reset_height = self.stable_height + else: + reset_rpy = self.rpys[self.block_idx - 1] + reset_wide = self.wide_from_device_eulers[self.block_idx - 1] + reset_height = self.heights[self.block_idx - 1] + + log_issue_limited( + "calibrationd_reset_spread", + "calibration", + f"calibrationd reset unstable solution pitchSpread={self.calib_spread[1]:.6f} " + f"yawSpread={self.calib_spread[2]:.6f} pitchLimit={pitch_spread_limit:.6f} " + f"use_stable_snapshot={use_stable_snapshot} rpy={self.rpy.tolist()}", + interval_sec=0.5, + ) + self.reset(reset_rpy, valid_blocks=1, wide_from_device_euler_init=reset_wide, + height_init=reset_height, smooth_from=self.stable_rpy if use_stable_snapshot else self.rpy) + self.cal_status = log.ExtrinsicsCalibration.Status.recalibrating + + write_this_cycle = (self.idx == 0) and (self.block_idx % (INPUTS_WANTED//5) == 5) + if self.param_put and write_this_cycle: + self.params.put_nonblocking("CalibrationParams", self.get_msg(True).to_bytes()) + + def handle_v_ego(self, v_ego: float) -> None: + self.v_ego = v_ego + + def get_smooth_rpy(self) -> np.ndarray: + if self.old_rpy_weight > 0: + return self.old_rpy_weight * self.old_rpy + (1.0 - self.old_rpy_weight) * self.rpy + else: + return self.rpy + + def handle_cam_odom(self, trans: list[float], + rot: list[float], + wide_from_device_euler: list[float], + trans_std: list[float], + road_transform_trans: list[float], + road_transform_trans_std: list[float]) -> np.ndarray | None: + self.old_rpy_weight = max(0.0, self.old_rpy_weight - 1/SMOOTH_CYCLES) + + fast_enough = self.v_ego > MIN_SPEED_FILTER + motion_speed = max(float(self.v_ego), float(trans[0])) + cam_fast_enough = motion_speed > MIN_SPEED_FILTER + yaw_ok = abs(rot[2]) < MAX_YAW_RATE_FILTER + straight_and_fast = fast_enough and cam_fast_enough and yaw_ok + angle_std_threshold = MAX_VEL_ANGLE_STD + height_std_threshold = MAX_HEIGHT_STD + rpy_certain = np.arctan2(trans_std[1], motion_speed) < angle_std_threshold + if len(road_transform_trans_std) == 3: + height_certain = road_transform_trans_std[2] < height_std_threshold + else: + height_certain = True + + certain_if_calib = rpy_certain + if not (straight_and_fast and certain_if_calib): + log_issue_limited( + "calibrationd_rejected_sample", + "calibration", + f"calibrationd rejected sample vEgo={self.v_ego:.2f} trans0={trans[0]:.2f} yawRate={rot[2]:.4f} " + f"fast_enough={fast_enough} cam_fast_enough={cam_fast_enough} motion_speed={motion_speed:.2f} yaw_ok={yaw_ok} " + f"rpy_certain={rpy_certain} height_certain={height_certain} valid_blocks={self.valid_blocks} idx={self.idx}", + interval_sec=1.0, + ) + return None + + observed_rpy = np.array([0, + -np.arctan2(trans[2], trans[0]), + np.arctan2(trans[1], trans[0])]) + new_rpy = euler_from_rot(rot_from_euler(self.get_smooth_rpy()).dot(rot_from_euler(observed_rpy))) + new_rpy = sanity_clip(new_rpy) + + if len(wide_from_device_euler) == 3: + new_wide_from_device_euler = np.array(wide_from_device_euler) + else: + new_wide_from_device_euler = WIDE_FROM_DEVICE_EULER_INIT + + if len(road_transform_trans) == 3 and HEIGHT_SANE_MIN <= road_transform_trans[2] <= HEIGHT_SANE_MAX: + new_height = np.array([road_transform_trans[2]]) + else: + new_height = HEIGHT_INIT + + self.rpys[self.block_idx] = moving_avg_with_linear_decay(self.rpys[self.block_idx], new_rpy, self.idx, float(BLOCK_SIZE)) + self.wide_from_device_eulers[self.block_idx] = moving_avg_with_linear_decay(self.wide_from_device_eulers[self.block_idx], + new_wide_from_device_euler, self.idx, float(BLOCK_SIZE)) + self.heights[self.block_idx] = moving_avg_with_linear_decay(self.heights[self.block_idx], new_height, self.idx, float(BLOCK_SIZE)) + + self.idx = (self.idx + 1) % BLOCK_SIZE + if self.idx == 0: + self.block_idx += 1 + self.valid_blocks = max(self.block_idx, self.valid_blocks) + self.block_idx = self.block_idx % INPUTS_WANTED + + self.update_status() + + if self.idx == 0: + log_issue_limited( + "calibrationd_progress_block", + "calibration", + f"calibrationd progress status={int(self.cal_status)} valid_blocks={self.valid_blocks} " + f"calPerc={min(100 * (self.valid_blocks * BLOCK_SIZE + self.idx) // (INPUTS_NEEDED * BLOCK_SIZE), 100)} " + f"rpy={self.rpy.tolist()} spread={self.calib_spread.tolist()}", + interval_sec=0.5, + ) + + return new_rpy + + def get_msg(self, valid: bool) -> capnp.lib.capnp._DynamicStructBuilder: + smooth_rpy = self.get_smooth_rpy() + + msg = messaging.new_message('extrinsicsCalibration') + msg.valid = valid + + extrinsicsCalibration = msg.extrinsicsCalibration + extrinsicsCalibration.validBlocks = self.valid_blocks + extrinsicsCalibration.calStatus = self.cal_status + extrinsicsCalibration.calPerc = min(100 * (self.valid_blocks * BLOCK_SIZE + self.idx) // (INPUTS_NEEDED * BLOCK_SIZE), 100) + extrinsicsCalibration.rpyCalib = smooth_rpy.tolist() + extrinsicsCalibration.rpyCalibSpread = self.calib_spread.tolist() + extrinsicsCalibration.wideFromDeviceEuler = self.wide_from_device_euler.tolist() + extrinsicsCalibration.height = self.height.tolist() + + return msg + + def send_data(self, pm: messaging.PubMaster, valid: bool) -> None: + pm.send('extrinsicsCalibration', self.get_msg(valid)) + + +def main() -> NoReturn: + config_realtime_process([0, 1, 2, 3], 5) + + pm = messaging.PubMaster(['extrinsicsCalibration']) + sm = messaging.SubMaster(['cameraOdometry', 'carState'], poll='cameraOdometry') + + params_reader = Params() + CP = messaging.log_from_bytes(params_reader.get("CarParams", block=True), car.CarParams) + + calibrator = Calibrator(param_put=True) + calibrator.not_car = CP.notCar + + while 1: + timeout = 0 if sm.frame == -1 else 100 + sm.update(timeout) + + if sm.updated['cameraOdometry']: + calibrator.handle_v_ego(sm['carState'].vEgo) + new_rpy = calibrator.handle_cam_odom(sm['cameraOdometry'].trans, + sm['cameraOdometry'].rot, + sm['cameraOdometry'].wideFromDeviceEuler, + sm['cameraOdometry'].transStd, + sm['cameraOdometry'].roadTransformTrans, + sm['cameraOdometry'].roadTransformTransStd) + + if DEBUG and new_rpy is not None: + print('got new rpy', new_rpy) + + # 4Hz driven by cameraOdometry + if sm.frame % 5 == 0: + checks_ok = sm.all_checks() + if not checks_ok: + ft = sm.freq_tracker + recv_hz = {s: (round(1.0 / ft[s].avg_dt.get_average(), 2) if ft[s].avg_dt.count else None) for s in sm.services} + log_issue_limited( + "calibrationd_checks_failed", + "calibration", + f"calibrationd all_checks failed alive={sm.alive} freq_ok={sm.freq_ok} valid={sm.valid} " + f"seen={sm.seen} recv_hz={recv_hz}", + interval_sec=5.0, + ) + calibrator.send_data(pm, checks_ok) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/locationd/estimatord.py b/iqpilot/selfdrive/locationd/estimatord.py new file mode 100755 index 000000000..e22669af6 --- /dev/null +++ b/iqpilot/selfdrive/locationd/estimatord.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +import os + +import numpy as np + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.params import Params +from iqpilot.common.realtime import config_realtime_process +from iqpilot.common.steer_delay import SteerDelayPublisher +from iqpilot.selfdrive.locationd.lagd import LateralLagEstimator, retrieve_initial_lag +from iqpilot.selfdrive.locationd.paramsd import ( + VehicleParamsEstimator, + migrate_cached_vehicle_params_if_needed, + retrieve_initial_vehicle_params, +) +from iqpilot.selfdrive.locationd.torqued import TorqueEstimator + + +PARAMS_SERVICES = ['deviceMotion', 'extrinsicsCalibration', 'carState'] +LAG_SERVICES = ['deviceMotion', 'extrinsicsCalibration', 'carState', 'controlsState', 'carControl'] +TORQUE_SERVICES = ['carControl', 'carOutput', 'carState', 'extrinsicsCalibration', 'deviceMotion'] +SUBSCRIBED_SERVICES = list(dict.fromkeys(PARAMS_SERVICES + LAG_SERVICES + TORQUE_SERVICES)) + + +def main() -> None: + config_realtime_process([0, 1, 2, 3], 5) + + debug = bool(int(os.getenv('DEBUG', '0'))) + replay = bool(int(os.getenv('REPLAY', '0'))) + + pm = messaging.PubMaster(['vehicleParameters', 'lateralDelay', 'lateralTorqueParameters']) + sm = messaging.SubMaster(SUBSCRIBED_SERVICES, poll='deviceMotion') + + params = Params() + CP = messaging.log_from_bytes(params.get('CarParams', block=True), car.CarParams) + + migrate_cached_vehicle_params_if_needed(params) + steer_ratio, stiffness_factor, angle_offset_deg, p_initial = retrieve_initial_vehicle_params(params, CP, replay, debug) + params_estimator = VehicleParamsEstimator(CP, steer_ratio, stiffness_factor, np.radians(angle_offset_deg), p_initial) + + lag_estimator = LateralLagEstimator(CP, 1. / SERVICE_LIST['deviceMotion'].frequency) + if (initial_lag_params := retrieve_initial_lag(params, CP)) is not None: + lag, valid_blocks = initial_lag_params + lag_estimator.reset(lag, valid_blocks) + + torque_estimator = TorqueEstimator(CP) + steer_delay_publisher = SteerDelayPublisher(CP) + estimators = ( + (params_estimator, PARAMS_SERVICES), + (lag_estimator, LAG_SERVICES), + (torque_estimator, TORQUE_SERVICES), + ) + + while True: + sm.update() + valid = sm.all_checks() + + if valid: + for which in sorted(sm.updated, key=lambda x: sm.logMonoTime[x]): + if not sm.updated[which]: + continue + + t = sm.logMonoTime[which] * 1e-9 + for estimator, services in estimators: + if which in services: + estimator.handle_log(t, which, sm[which]) + lag_estimator.update_points() + + if not sm.updated['deviceMotion']: + continue + + params_msg = params_estimator.get_msg(valid, debug=debug) + params_msg_dat = params_msg.to_bytes() + if sm.frame % 1200 == 0: + params.put_nonblocking('LiveParametersV2', params_msg_dat) + pm.send('vehicleParameters', params_msg_dat) + + if sm.frame % 5 != 0: + continue + + lag_estimator.update_estimate() + lag_msg = lag_estimator.get_msg(valid, debug) + lag_msg_dat = lag_msg.to_bytes() + pm.send('lateralDelay', lag_msg_dat) + + torque_estimator.handle_log(sm.logMonoTime['deviceMotion'] * 1e-9, 'lateralDelay', lag_msg.lateralDelay) + pm.send('lateralTorqueParameters', torque_estimator.get_msg(valid=valid, with_points=debug)) + + if sm.frame % 1200 == 0: + params.put_nonblocking('LiveDelay', lag_msg_dat) + + if sm.frame % 60 == 0: + steer_delay_publisher.update(lag_msg) + + if sm.frame % 240 == 0: + torque_msg = torque_estimator.get_msg(valid=valid, with_points=True) + params.put_nonblocking('LiveTorqueParameters', torque_msg.to_bytes()) + + +if __name__ == '__main__': + main() diff --git a/iqpilot/selfdrive/locationd/helpers.py b/iqpilot/selfdrive/locationd/helpers.py new file mode 100644 index 000000000..56a1c9039 --- /dev/null +++ b/iqpilot/selfdrive/locationd/helpers.py @@ -0,0 +1,188 @@ +import numpy as np +from typing import Any +from functools import cache + +from iqpilot.cereal import log +from iqpilot.common.transformations.orientation import rot_from_euler, euler_from_rot +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy + + +@cache +def fft_next_good_size(n: int) -> int: + """ + smallest composite of 2, 3, 5, 7, 11 that is >= n + inspired by pocketfft + """ + if n <= 6: + return n + best, f2 = 2 * n, 1 + while f2 < best: + f23 = f2 + while f23 < best: + f235 = f23 + while f235 < best: + f2357 = f235 + while f2357 < best: + f235711 = f2357 + while f235711 < best: + best = f235711 if f235711 >= n else best + f235711 *= 11 + f2357 *= 7 + f235 *= 5 + f23 *= 3 + f2 *= 2 + return best + + +def parabolic_peak_interp(R, max_index): + if max_index == 0 or max_index == len(R) - 1: + return max_index + + y_m1, y_0, y_p1 = R[max_index - 1], R[max_index], R[max_index + 1] + offset = 0.5 * (y_p1 - y_m1) / (2 * y_0 - y_p1 - y_m1) + + return max_index + offset + + +def rotate_cov(rot_matrix, cov_in): + return rot_matrix @ cov_in @ rot_matrix.T + + +def rotate_std(rot_matrix, std_in): + return np.sqrt(np.diag(rotate_cov(rot_matrix, np.diag(std_in**2)))) + + +class NPQueue: + def __init__(self, maxlen: int, rowsize: int) -> None: + self.maxlen = maxlen + self.arr = np.empty((0, rowsize)) + + def __len__(self) -> int: + return len(self.arr) + + def append(self, pt: list[float]) -> None: + if len(self.arr) < self.maxlen: + self.arr = np.append(self.arr, [pt], axis=0) + else: + self.arr[:-1] = self.arr[1:] + self.arr[-1] = pt + + +class PointBuckets: + def __init__(self, x_bounds: list[tuple[float, float]], min_points: list[float], min_points_total: int, points_per_bucket: int, rowsize: int) -> None: + self.x_bounds = x_bounds + self.buckets = {bounds: NPQueue(maxlen=points_per_bucket, rowsize=rowsize) for bounds in x_bounds} + self.buckets_min_points = dict(zip(x_bounds, min_points, strict=True)) + self.min_points_total = min_points_total + + def __len__(self) -> int: + return sum([len(v) for v in self.buckets.values()]) + + def is_valid(self) -> bool: + individual_buckets_valid = all(len(v) >= min_pts for v, min_pts in zip(self.buckets.values(), self.buckets_min_points.values(), strict=True)) + total_points_valid = self.__len__() >= self.min_points_total + return individual_buckets_valid and total_points_valid + + def get_valid_percent(self) -> int: + total_points_perc = min(self.__len__() / self.min_points_total * 100, 100) + individual_buckets_perc = min(min(len(v) / min_pts * 100 for v, min_pts in + zip(self.buckets.values(), self.buckets_min_points.values(), strict=True)), 100) + return int((total_points_perc + individual_buckets_perc) / 2) + + def is_calculable(self) -> bool: + return all(len(v) > 0 for v in self.buckets.values()) + + def add_point(self, x: float, y: float) -> None: + raise NotImplementedError + + def get_points(self, num_points: int | None = None) -> Any: + points = np.vstack([x.arr for x in self.buckets.values()]) + if num_points is None: + return points + return points[np.random.choice(np.arange(len(points)), min(len(points), num_points), replace=False)] + + def load_points(self, points: list[list[float]]) -> None: + for point in points: + self.add_point(*point) + + +class ParameterEstimator: + """ Base class for parameter estimators """ + def reset(self) -> None: + raise NotImplementedError + + def handle_log(self, t: int, which: str, msg: log.Event) -> None: + raise NotImplementedError + + def get_msg(self, valid: bool, with_points: bool) -> log.Event: + raise NotImplementedError + + +class Measurement: + x, y, z = (property(lambda self: self.xyz[0]), property(lambda self: self.xyz[1]), property(lambda self: self.xyz[2])) + x_std, y_std, z_std = (property(lambda self: self.xyz_std[0]), property(lambda self: self.xyz_std[1]), property(lambda self: self.xyz_std[2])) + roll, pitch, yaw = x, y, z + roll_std, pitch_std, yaw_std = x_std, y_std, z_std + + def __init__(self, xyz: np.ndarray, xyz_std: np.ndarray): + self.xyz: np.ndarray = xyz + self.xyz_std: np.ndarray = xyz_std + + @classmethod + def from_measurement_xyz(cls, measurement: log.DeviceMotion.XYZMeasurement) -> 'Measurement': + return cls( + xyz=np.array([measurement.x, measurement.y, measurement.z]), + xyz_std=np.array([measurement.xStd, measurement.yStd, measurement.zStd]) + ) + + +class Pose: + def __init__(self, orientation: Measurement, velocity: Measurement, acceleration: Measurement, angular_velocity: Measurement): + self.orientation = orientation + self.velocity = velocity + self.acceleration = acceleration + self.angular_velocity = angular_velocity + + @classmethod + def from_live_pose(cls, live_pose: log.DeviceMotion) -> 'Pose': + return Pose( + orientation=Measurement.from_measurement_xyz(live_pose.orientationNED), + velocity=Measurement.from_measurement_xyz(live_pose.velocityDevice), + acceleration=Measurement.from_measurement_xyz(live_pose.accelerationDevice), + angular_velocity=Measurement.from_measurement_xyz(live_pose.angularVelocityDevice) + ) + + +class PoseCalibrator: + def __init__(self): + self.calib_valid = False + self.calib_from_device = np.eye(3) + + def _transform_calib_from_device(self, meas: Measurement): + new_xyz = self.calib_from_device @ meas.xyz + new_xyz_std = rotate_std(self.calib_from_device, meas.xyz_std) + return Measurement(new_xyz, new_xyz_std) + + def _ned_from_calib(self, orientation: Measurement): + ned_from_device = rot_from_euler(orientation.xyz) + ned_from_calib = ned_from_device @ self.calib_from_device.T + ned_from_calib_euler_meas = Measurement(euler_from_rot(ned_from_calib), np.full(3, np.nan)) + return ned_from_calib_euler_meas + + def build_calibrated_pose(self, pose: Pose) -> Pose: + ned_from_calib_euler = self._ned_from_calib(pose.orientation) + angular_velocity_calib = self._transform_calib_from_device(pose.angular_velocity) + acceleration_calib = self._transform_calib_from_device(pose.acceleration) + velocity_calib = self._transform_calib_from_device(pose.velocity) + + return Pose(ned_from_calib_euler, velocity_calib, acceleration_calib, angular_velocity_calib) + + def feed_live_calib(self, live_calib: log.ExtrinsicsCalibration): + calib_rpy = get_calibrated_rpy(live_calib) + if calib_rpy is not None: + self.calib_from_device = rot_from_euler(calib_rpy).T + self.calib_valid = True + else: + if not self.calib_valid: + self.calib_from_device = np.eye(3) + self.calib_valid = False diff --git a/iqpilot/selfdrive/locationd/lagd.py b/iqpilot/selfdrive/locationd/lagd.py new file mode 100755 index 000000000..40d69871b --- /dev/null +++ b/iqpilot/selfdrive/locationd/lagd.py @@ -0,0 +1,381 @@ +#!/usr/bin/env python3 +import numpy as np +import capnp +from collections import deque +from functools import partial + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car, log +from iqpilot.common.params import Params +from iqpilot.common.constants import CV +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose, fft_next_good_size, parabolic_peak_interp + +BLOCK_SIZE = 100 +BLOCK_NUM = 50 +BLOCK_NUM_NEEDED = 5 +MOVING_WINDOW_SEC = 60.0 +MIN_OKAY_WINDOW_SEC = 25.0 +MIN_RECOVERY_BUFFER_SEC = 2.0 +MIN_VEGO = 50.0 * CV.MPH_TO_MS +MIN_ABS_YAW_RATE = 0.0 +MAX_YAW_RATE_SANITY_CHECK = 1.0 +MIN_NCC = 0.95 +MAX_LAG = 0.65 +MIN_LAG = 0.15 +MAX_LAG_STD = 0.1 +MAX_LAT_ACCEL = 2.0 +MAX_LAT_ACCEL_DIFF = 0.6 +MIN_LAT_ACCEL_RANGE = 0.5 +MIN_CONFIDENCE = 0.7 +CORR_BORDER_OFFSET = 5 +LAG_CANDIDATE_CORR_THRESHOLD = 0.9 +SMOOTH_K = 5 +SMOOTH_SIGMA = 1.0 + +VERSION = 1 # bump this to invalidate old parameter caches + + +def masked_symmetric_moving_average(x: np.ndarray, mask: np.ndarray, k: int, sigma: float) -> np.ndarray: + assert k >= 1 and k % 2 == 1, "k must be positive and odd" + pad = k // 2 + i = np.arange(k) - pad + w = np.exp(-0.5 * (i / sigma) ** 2) + w /= w.sum() + xp = np.pad(x * mask, pad, mode="edge") + mp = np.pad(mask, pad, mode="edge") + num = np.convolve(xp, w, mode="valid") + den = np.convolve(mp, w, mode="valid") + return np.divide(num, den, out=np.full_like(num, np.nan, dtype=np.float64), where=den != 0) + + +def masked_normalized_cross_correlation(expected_sig: np.ndarray, actual_sig: np.ndarray, mask: np.ndarray, n: int): + """ + References: + D. Padfield. "Masked FFT registration". In Proc. Computer Vision and + Pattern Recognition, pp. 2918-2925 (2010). + :DOI:`10.1109/CVPR.2010.5540032` + """ + + eps = np.finfo(np.float64).eps + expected_sig = np.asarray(expected_sig, dtype=np.float64) + actual_sig = np.asarray(actual_sig, dtype=np.float64) + + expected_sig[~mask] = 0.0 + actual_sig[~mask] = 0.0 + + rotated_expected_sig = expected_sig[::-1] + rotated_mask = mask[::-1] + + fft = partial(np.fft.fft, n=n) + + actual_sig_fft = fft(actual_sig) + rotated_expected_sig_fft = fft(rotated_expected_sig) + actual_mask_fft = fft(mask.astype(np.float64)) + rotated_mask_fft = fft(rotated_mask.astype(np.float64)) + + number_overlap_masked_samples = np.fft.ifft(rotated_mask_fft * actual_mask_fft).real + number_overlap_masked_samples[:] = np.round(number_overlap_masked_samples) + number_overlap_masked_samples[:] = np.fmax(number_overlap_masked_samples, eps) + masked_correlated_actual_fft = np.fft.ifft(rotated_mask_fft * actual_sig_fft).real + masked_correlated_expected_fft = np.fft.ifft(actual_mask_fft * rotated_expected_sig_fft).real + + numerator = np.fft.ifft(rotated_expected_sig_fft * actual_sig_fft).real + numerator -= masked_correlated_actual_fft * masked_correlated_expected_fft / number_overlap_masked_samples + + actual_squared_fft = fft(actual_sig ** 2) + actual_sig_denom = np.fft.ifft(rotated_mask_fft * actual_squared_fft).real + actual_sig_denom -= masked_correlated_actual_fft ** 2 / number_overlap_masked_samples + actual_sig_denom[:] = np.fmax(actual_sig_denom, 0.0) + + rotated_expected_squared_fft = fft(rotated_expected_sig ** 2) + expected_sig_denom = np.fft.ifft(actual_mask_fft * rotated_expected_squared_fft).real + expected_sig_denom -= masked_correlated_expected_fft ** 2 / number_overlap_masked_samples + expected_sig_denom[:] = np.fmax(expected_sig_denom, 0.0) + + denom = np.sqrt(actual_sig_denom * expected_sig_denom) + + # zero-out samples with very small denominators + tol = 1e3 * eps * np.max(np.abs(denom), keepdims=True) + nonzero_indices = denom > tol + + ncc = np.zeros_like(denom, dtype=np.float64) + ncc[nonzero_indices] = numerator[nonzero_indices] / denom[nonzero_indices] + np.clip(ncc, -1, 1, out=ncc) + + return ncc + + +class Points: + def __init__(self, num_points: int): + self.times = deque[float]([0.0] * num_points, maxlen=num_points) + self.okay = deque[bool]([False] * num_points, maxlen=num_points) + self.desired = deque[float]([0.0] * num_points, maxlen=num_points) + self.actual = deque[float]([0.0] * num_points, maxlen=num_points) + + @property + def num_points(self): + return len(self.desired) + + @property + def num_okay(self): + return np.count_nonzero(self.okay) + + def update(self, t: float, desired: float, actual: float, okay: bool): + self.times.append(t) + self.okay.append(okay) + self.desired.append(desired) + self.actual.append(actual) + + def get(self) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: + return np.array(self.times), np.array(self.desired), np.array(self.actual), np.array(self.okay) + + +class BlockAverage: + def __init__(self, num_blocks: int, block_size: int, valid_blocks: int, initial_value: float): + self.num_blocks = num_blocks + self.block_size = block_size + self.block_idx = valid_blocks % num_blocks + self.idx = 0 + + self.values = np.tile(initial_value, (num_blocks, 1)) + self.valid_blocks = valid_blocks + + def update(self, value: float): + self.values[self.block_idx] = (self.idx * self.values[self.block_idx] + value) / (self.idx + 1) + self.idx = (self.idx + 1) % self.block_size + if self.idx == 0: + self.block_idx = (self.block_idx + 1) % self.num_blocks + self.valid_blocks = min(self.valid_blocks + 1, self.num_blocks) + + def get(self) -> tuple[float, float, float, float]: + valid_block_idx = [i for i in range(self.valid_blocks) if i != self.block_idx] + valid_and_current_idx = valid_block_idx + ([self.block_idx] if self.idx > 0 else []) + + if len(valid_block_idx) > 0: + valid_mean = float(np.mean(self.values[valid_block_idx], axis=0).item()) + valid_std = float(np.std(self.values[valid_block_idx], axis=0).item()) + else: + valid_mean, valid_std = float('nan'), float('nan') + + if len(valid_and_current_idx) > 0: + current_mean = float(np.mean(self.values[valid_and_current_idx], axis=0).item()) + current_std = float(np.std(self.values[valid_and_current_idx], axis=0).item()) + else: + current_mean, current_std = float('nan'), float('nan') + + return valid_mean, valid_std, current_mean, current_std + + +class LateralLagEstimator: + inputs = {"carControl", "carState", "controlsState", "extrinsicsCalibration", "deviceMotion"} + + def __init__(self, CP: car.CarParams, dt: float, + block_count: int = BLOCK_NUM, min_valid_block_count: int = BLOCK_NUM_NEEDED, block_size: int = BLOCK_SIZE, + window_sec: float = MOVING_WINDOW_SEC, okay_window_sec: float = MIN_OKAY_WINDOW_SEC, min_recovery_buffer_sec: float = MIN_RECOVERY_BUFFER_SEC, + min_vego: float = MIN_VEGO, min_yr: float = MIN_ABS_YAW_RATE, min_ncc: float = MIN_NCC, + max_lat_accel: float = MAX_LAT_ACCEL, max_lat_accel_diff: float = MAX_LAT_ACCEL_DIFF, min_confidence: float = MIN_CONFIDENCE): + self.dt = dt + self.window_sec = window_sec + self.okay_window_sec = okay_window_sec + self.min_recovery_buffer_sec = min_recovery_buffer_sec + self.initial_lag = CP.steerActuatorDelay + 0.2 + self.block_size = block_size + self.block_count = block_count + self.min_valid_block_count = min_valid_block_count + self.min_vego = min_vego + self.min_yr = min_yr + self.min_ncc = min_ncc + self.min_confidence = min_confidence + self.max_lat_accel = max_lat_accel + self.max_lat_accel_diff = max_lat_accel_diff + + self.t = 0.0 + self.lat_active = False + self.steering_pressed = False + self.steering_saturated = False + self.desired_curvature = 0.0 + self.v_ego = 0.0 + self.yaw_rate = 0.0 + self.yaw_rate_std = 0.0 + self.pose_valid = False + + self.last_lat_inactive_t = 0.0 + self.last_steering_pressed_t = 0.0 + self.last_steering_saturated_t = 0.0 + self.last_pose_invalid_t = 0.0 + self.last_estimate_t = 0.0 + + self.calibrator = PoseCalibrator() + + self.reset(self.initial_lag, 0) + + def reset(self, initial_lag: float, valid_blocks: int): + window_len = int(self.window_sec / self.dt) + self.points = Points(window_len) + self.block_avg = BlockAverage(self.block_count, self.block_size, valid_blocks, initial_lag) + + def get_msg(self, valid: bool, debug: bool = False) -> capnp._DynamicStructBuilder: + msg = messaging.new_message('lateralDelay') + + msg.valid = valid + + lateralDelay = msg.lateralDelay + + valid_mean_lag, valid_std, current_mean_lag, current_std = self.block_avg.get() + if self.block_avg.valid_blocks >= self.min_valid_block_count and not np.isnan(valid_mean_lag) and not np.isnan(valid_std): + if valid_std > MAX_LAG_STD: + lateralDelay.status = log.LateralDelay.Status.invalid + else: + lateralDelay.status = log.LateralDelay.Status.estimated + else: + lateralDelay.status = log.LateralDelay.Status.unestimated + + if lateralDelay.status == log.LateralDelay.Status.estimated: + lateralDelay.lateralDelay = min(MAX_LAG, max(MIN_LAG, valid_mean_lag)) + else: + lateralDelay.lateralDelay = self.initial_lag + + if not np.isnan(current_mean_lag) and not np.isnan(current_std): + lateralDelay.lateralDelayEstimate = current_mean_lag + lateralDelay.lateralDelayEstimateStd = current_std + else: + lateralDelay.lateralDelayEstimate = self.initial_lag + lateralDelay.lateralDelayEstimateStd = 0.0 + + lateralDelay.validBlocks = self.block_avg.valid_blocks + lateralDelay.calPerc = min(100 * (self.block_avg.valid_blocks * self.block_size + self.block_avg.idx) // + (self.min_valid_block_count * self.block_size), 100) + if debug: + lateralDelay.points = self.block_avg.values.flatten().tolist() + lateralDelay.version = VERSION + + return msg + + def handle_log(self, t: float, which: str, msg: capnp._DynamicStructReader): + if which == "carControl": + self.lat_active = msg.latActive + elif which == "carState": + self.steering_pressed = msg.steeringPressed + self.v_ego = msg.vEgo + elif which == "controlsState": + self.steering_saturated = getattr(msg.lateralControlState, msg.lateralControlState.which()).saturated + self.desired_curvature = msg.desiredCurvature + elif which == "extrinsicsCalibration": + self.calibrator.feed_live_calib(msg) + elif which == "deviceMotion": + device_pose = Pose.from_live_pose(msg) + calibrated_pose = self.calibrator.build_calibrated_pose(device_pose) + self.yaw_rate = calibrated_pose.angular_velocity.yaw + self.yaw_rate_std = calibrated_pose.angular_velocity.yaw_std + self.pose_valid = msg.angularVelocityDevice.valid and msg.posenetOK and msg.inputsOK + self.t = t + + def points_enough(self): + return self.points.num_points >= int(self.okay_window_sec / self.dt) + + def points_valid(self): + return self.points.num_okay >= int(self.okay_window_sec / self.dt) + + def update_points(self): + la_desired = self.desired_curvature * self.v_ego * self.v_ego + la_actual_pose = self.yaw_rate * self.v_ego + + fast = self.v_ego > self.min_vego + turning = np.abs(self.yaw_rate) >= self.min_yr + sensors_valid = self.pose_valid and np.abs(self.yaw_rate) < MAX_YAW_RATE_SANITY_CHECK and self.yaw_rate_std < MAX_YAW_RATE_SANITY_CHECK + la_valid = np.abs(la_actual_pose) <= self.max_lat_accel and np.abs(la_desired - la_actual_pose) <= self.max_lat_accel_diff + calib_valid = self.calibrator.calib_valid + + if not self.lat_active: + self.last_lat_inactive_t = self.t + if self.steering_pressed: + self.last_steering_pressed_t = self.t + if self.steering_saturated: + self.last_steering_saturated_t = self.t + if not sensors_valid or not la_valid: + self.last_pose_invalid_t = self.t + + has_recovered = all( # wait for recovery after !lat_active, steering_pressed, steering_saturated, !sensors/la_valid + self.t - last_t >= self.min_recovery_buffer_sec + for last_t in [self.last_lat_inactive_t, self.last_steering_pressed_t, self.last_steering_saturated_t, self.last_pose_invalid_t] + ) + okay = self.lat_active and not self.steering_pressed and not self.steering_saturated and \ + fast and turning and has_recovered and calib_valid and sensors_valid and la_valid + + self.points.update(self.t, la_desired, la_actual_pose, okay) + + def update_estimate(self): + if not self.points_enough(): + return + + times, desired, actual, okay = self.points.get() + # check if there are any new valid data points since the last update + is_valid = self.points_valid() and (actual.max() - actual.min() >= MIN_LAT_ACCEL_RANGE) + if self.last_estimate_t != 0 and times[0] <= self.last_estimate_t: + new_values_start_idx = next(-i for i, t in enumerate(reversed(times)) if t <= self.last_estimate_t) + is_valid = is_valid and not (new_values_start_idx == 0 or not np.any(okay[new_values_start_idx:])) + + desired = masked_symmetric_moving_average(desired, okay, SMOOTH_K, SMOOTH_SIGMA) + actual = masked_symmetric_moving_average(actual, okay, SMOOTH_K, SMOOTH_SIGMA) + + delay, corr, confidence = self.actuator_delay(desired, actual, okay, self.dt, MIN_LAG, MAX_LAG) + if corr < self.min_ncc or confidence < self.min_confidence or not is_valid: + return + + self.block_avg.update(delay) + self.last_estimate_t = self.t + + @staticmethod + def actuator_delay(expected_sig: np.ndarray, actual_sig: np.ndarray, mask: np.ndarray, + dt: float, min_lag: float, max_lag: float) -> tuple[float, float, float]: + assert len(expected_sig) == len(actual_sig) + min_lag_samples, max_lag_samples, one_sec_samples = int(round(min_lag / dt)), int(round(max_lag / dt)), int(round(1.0 / dt)) + padded_size = fft_next_good_size(len(expected_sig) + max(max_lag_samples, one_sec_samples)) + + ncc = masked_normalized_cross_correlation(expected_sig, actual_sig, mask, padded_size) + + # only consider lags from ranges: + roi = np.s_[len(expected_sig) - 1 + min_lag_samples: len(expected_sig) - 1 + max_lag_samples] # min_lag - max_lag range + threshold_roi = np.s_[len(expected_sig) - 1: len(expected_sig) - 1 + one_sec_samples] # 0 - 1 second range + confidence_roi = np.s_[threshold_roi.start - CORR_BORDER_OFFSET: threshold_roi.stop + CORR_BORDER_OFFSET] # threshold range +/- border + roi_ncc, confidence_roi_ncc, threshold_roi_ncc = ncc[roi], ncc[confidence_roi], ncc[threshold_roi] + + max_corr_index = np.argmax(roi_ncc) + corr = roi_ncc[max_corr_index] + lag = parabolic_peak_interp(roi_ncc, max_corr_index) * dt + min_lag + + # to estimate lag confidence, gather all high-correlation candidates and see how spread they are + # if e.g. 0.8 and 0.4 are both viable, this is an ambiguous case + ncc_thresh = (threshold_roi_ncc.max() - threshold_roi_ncc.min()) * LAG_CANDIDATE_CORR_THRESHOLD + threshold_roi_ncc.min() + good_lag_candidate_mask = confidence_roi_ncc >= ncc_thresh + good_lag_candidate_edges = np.diff(good_lag_candidate_mask.astype(int), prepend=0, append=0) + starts, ends = np.where(good_lag_candidate_edges == 1)[0], np.where(good_lag_candidate_edges == -1)[0] - 1 + run_idx = np.searchsorted(starts, max_corr_index + CORR_BORDER_OFFSET, side='right') - 1 + width = ends[run_idx] - starts[run_idx] + 1 + confidence = np.clip(1 - width * dt, 0, 1) + + return lag, corr, confidence + + +def retrieve_initial_lag(params: Params, CP: car.CarParams): + last_lag_data = params.get("LiveDelay") + last_carparams_data = params.get("CarParamsPrevRoute") + + if last_lag_data is not None: + try: + with log.Event.from_bytes(last_lag_data) as last_lag_msg, car.CarParams.from_bytes(last_carparams_data) as last_CP: + ld = last_lag_msg.lateralDelay + if last_CP.carFingerprint != CP.carFingerprint: + raise Exception("Car model mismatch") + + lag, valid_blocks, status, version = ld.lateralDelayEstimate, ld.validBlocks, ld.status, ld.version + assert valid_blocks <= BLOCK_NUM, "Invalid number of valid blocks" + assert status != log.LateralDelay.Status.invalid, "Lag estimate is invalid" + assert version == VERSION, f"Lag estimate is from a different version (got {version}, expected {VERSION})" + return lag, valid_blocks + except Exception as e: + cloudlog.error(f"Failed to retrieve initial lag: {e}") + params.remove("LiveDelay") + + return None diff --git a/iqpilot/selfdrive/locationd/locationd.py b/iqpilot/selfdrive/locationd/locationd.py new file mode 100755 index 000000000..bd7864b82 --- /dev/null +++ b/iqpilot/selfdrive/locationd/locationd.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +import os +import time +import capnp +import numpy as np +from enum import Enum +from collections import defaultdict + +from iqpilot.cereal import log, messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.transformations.orientation import rot_from_euler +from iqpilot.common.realtime import config_realtime_process +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy +from iqpilot.selfdrive.locationd.helpers import rotate_std +from iqpilot.selfdrive.locationd.models.pose_kf import PoseKalman, States +from iqpilot.selfdrive.locationd.models.constants import ObservationKind + +ACCEL_SANITY_CHECK = 100.0 # m/s^2 +ROTATION_SANITY_CHECK = 10.0 # rad/s +TRANS_SANITY_CHECK = 200.0 # m/s +CALIB_RPY_SANITY_CHECK = 0.5 # rad (+- 30 deg) +MIN_STD_SANITY_CHECK = 1e-5 # m or rad +MAX_FILTER_REWIND_TIME = 0.8 # s +MAX_SENSOR_TIME_DIFF = 0.1 # s +YAWRATE_CROSS_ERR_CHECK_FACTOR = 30 +INPUT_INVALID_LIMIT = 2.0 # 1 (camodo) / 9 (sensor) bad input[s] ignored +INPUT_INVALID_RECOVERY = 10.0 # ~10 secs to resume after exceeding allowed bad inputs by one +POSENET_STD_INITIAL_VALUE = 10.0 +POSENET_STD_HIST_HALF = 20 + + +def calculate_invalid_input_decay(invalid_limit, recovery_time, frequency): + return (1 - 1 / (2 * invalid_limit)) ** (1 / (recovery_time * frequency)) + + +def init_xyz_measurement(measurement: capnp._DynamicStructBuilder, values: np.ndarray, stds: np.ndarray, valid: bool): + assert len(values) == len(stds) == 3 + measurement.x, measurement.y, measurement.z = map(float, values) + measurement.xStd, measurement.yStd, measurement.zStd = map(float, stds) + measurement.valid = valid + + +class HandleLogResult(Enum): + SUCCESS = 0 + TIMING_INVALID = 1 + INPUT_INVALID = 2 + SENSOR_SOURCE_INVALID = 3 + + +class LocationEstimator: + def __init__(self, debug: bool): + self.kf = PoseKalman(MAX_FILTER_REWIND_TIME) + + self.debug = debug + + self.posenet_stds = np.array([POSENET_STD_INITIAL_VALUE] * (POSENET_STD_HIST_HALF * 2)) + self.car_speed = 0.0 + self.camodo_yawrate_distribution = np.array([0.0, 10.0]) # mean, std + self.device_from_calib = np.eye(3) + + obs_kinds = [ObservationKind.PHONE_ACCEL, ObservationKind.PHONE_GYRO, ObservationKind.CAMERA_ODO_ROTATION, ObservationKind.CAMERA_ODO_TRANSLATION] + self.observations = {kind: np.zeros(3, dtype=np.float32) for kind in obs_kinds} + self.observation_errors = {kind: np.zeros(3, dtype=np.float32) for kind in obs_kinds} + + def reset(self, t: float, x_initial: np.ndarray = PoseKalman.initial_x, P_initial: np.ndarray = PoseKalman.initial_P): + self.kf.init_state(x_initial, covs=P_initial, filter_time=t) + + def _validate_sensor_source(self, source: log.SensorEventData.SensorSource): + # some segments have two IMUs, ignore the second one + return source != log.SensorEventData.SensorSource.bmx055 + + def _validate_sensor_time(self, sensor_time: float, t: float): + # ignore empty readings + if sensor_time == 0: + return False + + # sensor time and log time should be close + sensor_time_invalid = abs(sensor_time - t) > MAX_SENSOR_TIME_DIFF + if sensor_time_invalid: + cloudlog.warning("Sensor reading ignored, sensor timestamp more than 100ms off from log time") + return not sensor_time_invalid + + def _validate_timestamp(self, t: float): + kf_t = self.kf.t + invalid = not np.isnan(kf_t) and (kf_t - t) > MAX_FILTER_REWIND_TIME + if invalid: + cloudlog.warning("Observation timestamp is older than the max rewind threshold of the filter") + return not invalid + + def _finite_check(self, t: float, new_x: np.ndarray, new_P: np.ndarray): + all_finite = np.isfinite(new_x).all() and np.isfinite(new_P).all() + if not all_finite: + cloudlog.error("Non-finite values detected, kalman reset") + self.reset(t) + + def handle_log(self, t: float, which: str, msg: capnp._DynamicStructReader) -> HandleLogResult: + new_x, new_P = None, None + if which == "accelerometer" and msg.which() == "acceleration": + sensor_time = msg.timestamp * 1e-9 + + if not self._validate_sensor_time(sensor_time, t) or not self._validate_timestamp(sensor_time): + return HandleLogResult.TIMING_INVALID + + if not self._validate_sensor_source(msg.source): + return HandleLogResult.SENSOR_SOURCE_INVALID + + v = msg.acceleration.v + meas = np.array([-v[2], -v[1], -v[0]]) + if np.linalg.norm(meas) >= ACCEL_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + acc_res = self.kf.predict_and_observe(sensor_time, ObservationKind.PHONE_ACCEL, meas) + if acc_res is not None: + _, new_x, _, new_P, _, _, (acc_err,), _, _ = acc_res + self.observation_errors[ObservationKind.PHONE_ACCEL] = np.array(acc_err) + self.observations[ObservationKind.PHONE_ACCEL] = meas + + elif which == "gyroscope" and msg.which() == "gyroUncalibrated": + sensor_time = msg.timestamp * 1e-9 + + if not self._validate_sensor_time(sensor_time, t) or not self._validate_timestamp(sensor_time): + return HandleLogResult.TIMING_INVALID + + if not self._validate_sensor_source(msg.source): + return HandleLogResult.SENSOR_SOURCE_INVALID + + v = msg.gyroUncalibrated.v + meas = np.array([-v[2], -v[1], -v[0]]) + + gyro_bias = self.kf.x[States.GYRO_BIAS] + gyro_camodo_yawrate_err = np.abs((meas[2] - gyro_bias[2]) - self.camodo_yawrate_distribution[0]) + gyro_camodo_yawrate_err_threshold = YAWRATE_CROSS_ERR_CHECK_FACTOR * self.camodo_yawrate_distribution[1] + gyro_valid = gyro_camodo_yawrate_err < gyro_camodo_yawrate_err_threshold + + if np.linalg.norm(meas) >= ROTATION_SANITY_CHECK or not gyro_valid: + return HandleLogResult.INPUT_INVALID + + gyro_res = self.kf.predict_and_observe(sensor_time, ObservationKind.PHONE_GYRO, meas) + if gyro_res is not None: + _, new_x, _, new_P, _, _, (gyro_err,), _, _ = gyro_res + self.observation_errors[ObservationKind.PHONE_GYRO] = np.array(gyro_err) + self.observations[ObservationKind.PHONE_GYRO] = meas + + elif which == "carState": + self.car_speed = abs(msg.vEgo) + + elif which == "extrinsicsCalibration": + # Note that we use this message during calibration + calib = get_calibrated_rpy(msg) + if calib is None and len(msg.rpyCalib) > 0: + calib = np.array(msg.rpyCalib) + + if calib is not None: + if calib.min() < -CALIB_RPY_SANITY_CHECK or calib.max() > CALIB_RPY_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + self.device_from_calib = rot_from_euler(calib) + + elif which == "cameraOdometry": + if not self._validate_timestamp(t): + return HandleLogResult.TIMING_INVALID + + rot_device = np.matmul(self.device_from_calib, np.array(msg.rot)) + trans_device = np.matmul(self.device_from_calib, np.array(msg.trans)) + + if np.linalg.norm(rot_device) > ROTATION_SANITY_CHECK or np.linalg.norm(trans_device) > TRANS_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + rot_calib_std = np.array(msg.rotStd) + trans_calib_std = np.array(msg.transStd) + + if rot_calib_std.min() <= MIN_STD_SANITY_CHECK or trans_calib_std.min() <= MIN_STD_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + if np.linalg.norm(rot_calib_std) > 10 * ROTATION_SANITY_CHECK or np.linalg.norm(trans_calib_std) > 10 * TRANS_SANITY_CHECK: + return HandleLogResult.INPUT_INVALID + + self.posenet_stds = np.roll(self.posenet_stds, -1) + self.posenet_stds[-1] = trans_calib_std[0] + + # Multiply by N to avoid to high certainty in kalman filter because of temporally correlated noise + rot_calib_std *= 10 + trans_calib_std *= 2 + + rot_device_std = rotate_std(self.device_from_calib, rot_calib_std) + trans_device_std = rotate_std(self.device_from_calib, trans_calib_std) + rot_device_noise = rot_device_std ** 2 + trans_device_noise = trans_device_std ** 2 + + cam_odo_rot_res = self.kf.predict_and_observe(t, ObservationKind.CAMERA_ODO_ROTATION, rot_device, np.array([np.diag(rot_device_noise)])) + cam_odo_trans_res = self.kf.predict_and_observe(t, ObservationKind.CAMERA_ODO_TRANSLATION, trans_device, np.array([np.diag(trans_device_noise)])) + self.camodo_yawrate_distribution = np.array([rot_device[2], rot_device_std[2]]) + if cam_odo_rot_res is not None: + _, new_x, _, new_P, _, _, (cam_odo_rot_err,), _, _ = cam_odo_rot_res + self.observation_errors[ObservationKind.CAMERA_ODO_ROTATION] = np.array(cam_odo_rot_err) + self.observations[ObservationKind.CAMERA_ODO_ROTATION] = rot_device + if cam_odo_trans_res is not None: + _, new_x, _, new_P, _, _, (cam_odo_trans_err,), _, _ = cam_odo_trans_res + self.observation_errors[ObservationKind.CAMERA_ODO_TRANSLATION] = np.array(cam_odo_trans_err) + self.observations[ObservationKind.CAMERA_ODO_TRANSLATION] = trans_device + + if new_x is not None and new_P is not None: + self._finite_check(t, new_x, new_P) + return HandleLogResult.SUCCESS + + def get_msg(self, sensors_valid: bool, inputs_valid: bool, filter_valid: bool): + state, cov = self.kf.x, self.kf.P + std = np.sqrt(np.diag(cov)) + + orientation_ned, orientation_ned_std = state[States.NED_ORIENTATION], std[States.NED_ORIENTATION] + velocity_device, velocity_device_std = state[States.DEVICE_VELOCITY], std[States.DEVICE_VELOCITY] + angular_velocity_device, angular_velocity_device_std = state[States.ANGULAR_VELOCITY], std[States.ANGULAR_VELOCITY] + acceleration_device, acceleration_device_std = state[States.ACCELERATION], std[States.ACCELERATION] + + msg = messaging.new_message("deviceMotion") + msg.valid = filter_valid + + deviceMotion = msg.deviceMotion + init_xyz_measurement(deviceMotion.orientationNED, orientation_ned, orientation_ned_std, filter_valid) + init_xyz_measurement(deviceMotion.velocityDevice, velocity_device, velocity_device_std, filter_valid) + init_xyz_measurement(deviceMotion.angularVelocityDevice, angular_velocity_device, angular_velocity_device_std, filter_valid) + init_xyz_measurement(deviceMotion.accelerationDevice, acceleration_device, acceleration_device_std, filter_valid) + if self.debug: + deviceMotion.debugFilterState.value = state.tolist() + deviceMotion.debugFilterState.std = std.tolist() + deviceMotion.debugFilterState.valid = filter_valid + deviceMotion.debugFilterState.observations = [ + {'kind': k, 'value': self.observations[k].tolist(), 'error': self.observation_errors[k].tolist()} + for k in self.observations.keys() + ] + + old_mean = np.mean(self.posenet_stds[:POSENET_STD_HIST_HALF]) + new_mean = np.mean(self.posenet_stds[POSENET_STD_HIST_HALF:]) + std_spike = (new_mean / old_mean) > 4.0 and new_mean > 7.0 + + deviceMotion.inputsOK = inputs_valid + deviceMotion.posenetOK = not std_spike or self.car_speed <= 5.0 + deviceMotion.sensorsOK = sensors_valid + + return msg + + +def sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, simulation): + cur_time = time.monotonic() + for which, msgs in [("accelerometer", acc_msgs), ("gyroscope", gyro_msgs)]: + if len(msgs) > 0: + sensor_valid[which] = msgs[-1].valid + sensor_recv_time[which] = cur_time + + if not simulation: + sensor_alive[which] = (cur_time - sensor_recv_time[which]) < 0.1 + else: + sensor_alive[which] = len(msgs) > 0 + + return all(sensor_alive.values()) and all(sensor_valid.values()) + + +def main(): + config_realtime_process([0, 1, 2, 3], 5) + + DEBUG = bool(int(os.getenv("DEBUG", "0"))) + SIMULATION = bool(int(os.getenv("SIMULATION", "0"))) + + pm = messaging.PubMaster(['deviceMotion']) + sm = messaging.SubMaster(['carState', 'extrinsicsCalibration', 'cameraOdometry'], poll='cameraOdometry') + # separate sensor sockets for efficiency + sensor_sockets = [messaging.sub_sock(which, timeout=20) for which in ['accelerometer', 'gyroscope']] + sensor_alive, sensor_valid, sensor_recv_time = defaultdict(bool), defaultdict(bool), defaultdict(float) + + params = Params() + + estimator = LocationEstimator(DEBUG) + + filter_initialized = False + critcal_services = ["accelerometer", "gyroscope", "cameraOdometry"] + observation_input_invalid = defaultdict(int) + + input_invalid_limit = {s: round(INPUT_INVALID_LIMIT * (SERVICE_LIST[s].frequency / 20.)) for s in critcal_services} + input_invalid_threshold = {s: input_invalid_limit[s] - 0.5 for s in critcal_services} + input_invalid_decay = {s: calculate_invalid_input_decay(input_invalid_limit[s], INPUT_INVALID_RECOVERY, SERVICE_LIST[s].frequency) for s in critcal_services} + + initial_pose_data = params.get("LocationFilterInitialState") + if initial_pose_data is not None: + with log.Event.from_bytes(initial_pose_data) as lp_msg: + filter_state = lp_msg.deviceMotion.debugFilterState + x_initial = np.array(filter_state.value, dtype=np.float64) if len(filter_state.value) != 0 else PoseKalman.initial_x + P_initial = np.diag(np.array(filter_state.std, dtype=np.float64)) if len(filter_state.std) != 0 else PoseKalman.initial_P + estimator.reset(None, x_initial, P_initial) + + while True: + sm.update() + + acc_msgs, gyro_msgs = (messaging.drain_sock(sock) for sock in sensor_sockets) + + if filter_initialized: + msgs = [] + for msg in acc_msgs + gyro_msgs: + t, valid, which, data = msg.logMonoTime, msg.valid, msg.which(), getattr(msg, msg.which()) + msgs.append((t, valid, which, data)) + for which, updated in sm.updated.items(): + if not updated: + continue + t, valid, data = sm.logMonoTime[which], sm.valid[which], sm[which] + msgs.append((t, valid, which, data)) + + for log_mono_time, valid, which, msg in sorted(msgs, key=lambda x: x[0]): + if valid: + t = log_mono_time * 1e-9 + res = estimator.handle_log(t, which, msg) + if which not in critcal_services: + continue + + if res == HandleLogResult.TIMING_INVALID: + cloudlog.warning(f"Observation {which} ignored due to failed timing check") + observation_input_invalid[which] += 1 + elif res == HandleLogResult.INPUT_INVALID: + cloudlog.warning(f"Observation {which} ignored due to failed sanity check") + observation_input_invalid[which] += 1 + elif res == HandleLogResult.SUCCESS: + observation_input_invalid[which] *= input_invalid_decay[which] + else: + filter_initialized = sm.all_checks() and sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, SIMULATION) + + if sm.updated["cameraOdometry"]: + critical_service_inputs_valid = all(observation_input_invalid[s] < input_invalid_threshold[s] for s in critcal_services) + inputs_valid = sm.all_valid() and critical_service_inputs_valid + sensors_valid = sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, SIMULATION) + + msg = estimator.get_msg(sensors_valid, inputs_valid, filter_initialized) + pm.send("deviceMotion", msg) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/locationd/models/.gitignore b/iqpilot/selfdrive/locationd/models/.gitignore new file mode 100644 index 000000000..9ab870da8 --- /dev/null +++ b/iqpilot/selfdrive/locationd/models/.gitignore @@ -0,0 +1 @@ +generated/ diff --git a/iqpilot/selfdrive/locationd/models/__init__.py b/iqpilot/selfdrive/locationd/models/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/locationd/models/car_kf.py b/iqpilot/selfdrive/locationd/models/car_kf.py new file mode 100644 index 000000000..387799bda --- /dev/null +++ b/iqpilot/selfdrive/locationd/models/car_kf.py @@ -0,0 +1,94 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import math +from typing import Any + +import numpy as np + +from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY +from iqpilot.selfdrive.locationd.models.constants import ObservationKind +from iqpilot.selfdrive.state_estimation import EstimatorModel, ModelDefinition, StateEstimator +try: + from iqpilot.selfdrive.state_estimation.native_binding_pyx import car_predict, car_update +except ModuleNotFoundError: + car_predict = None + car_update = None + + +class States: + STIFFNESS = slice(0, 1) + STEER_RATIO = slice(1, 2) + ANGLE_OFFSET = slice(2, 3) + ANGLE_OFFSET_FAST = slice(3, 4) + VELOCITY = slice(4, 6) + YAW_RATE = slice(6, 7) + STEER_ANGLE = slice(7, 8) + ROAD_ROLL = slice(8, 9) + + +def _transition(state: np.ndarray, dt: float, values: dict[str, float]) -> np.ndarray: + result = state.copy() + stiffness = state[0] + steer_ratio = state[1] + angle = state[7] - state[2] - state[3] + speed, lateral_speed = state[4:6] + yaw_rate = state[6] + mass = values["mass"] + inertia = values["rotational_inertia"] + front = values["center_to_front"] + rear = values["center_to_rear"] + front_stiffness = stiffness * values["stiffness_front"] + rear_stiffness = stiffness * values["stiffness_rear"] + lateral_dot = -(front_stiffness + rear_stiffness) * lateral_speed / (mass * speed) + lateral_dot += (-(front_stiffness * front - rear_stiffness * rear) / (mass * speed) - speed) * yaw_rate + lateral_dot += front_stiffness * angle / (mass * steer_ratio) - ACCELERATION_DUE_TO_GRAVITY * state[8] + yaw_dot = -(front_stiffness * front - rear_stiffness * rear) * lateral_speed / (inertia * speed) + yaw_dot -= (front_stiffness * front**2 + rear_stiffness * rear**2) * yaw_rate / (inertia * speed) + yaw_dot += front_stiffness * front * angle / (inertia * steer_ratio) + result[5] += dt * lateral_dot + result[6] += dt * yaw_dot + return result + + +class CarKalman(EstimatorModel): + name = "car" + initial_x = np.array([1.0, 15.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0]) + Q = np.diag([(.05 / 100)**2, .01**2, math.radians(0.02)**2, math.radians(0.25)**2, + .1**2, .01**2, math.radians(0.1)**2, math.radians(0.1)**2, math.radians(1)**2]) + P_initial = Q.copy() + obs_noise: dict[int, Any] = { + ObservationKind.STEER_ANGLE: np.atleast_2d(math.radians(0.05)**2), + ObservationKind.ANGLE_OFFSET_FAST: np.atleast_2d(math.radians(10.0)**2), + ObservationKind.ROAD_ROLL: np.atleast_2d(math.radians(1.0)**2), + ObservationKind.STEER_RATIO: np.atleast_2d(5.0**2), + ObservationKind.STIFFNESS: np.atleast_2d(0.5**2), + ObservationKind.ROAD_FRAME_X_SPEED: np.atleast_2d(0.1**2), + } + + def __init__(self): + self.native_parameters = np.zeros(6) + measurements = { + ObservationKind.ROAD_FRAME_YAW_RATE: lambda state, _: state[6:7], + ObservationKind.ROAD_FRAME_XY_SPEED: lambda state, _: state[4:6], + ObservationKind.ROAD_FRAME_X_SPEED: lambda state, _: state[4:5], + ObservationKind.STEER_ANGLE: lambda state, _: state[7:8], + ObservationKind.ANGLE_OFFSET_FAST: lambda state, _: state[3:4], + ObservationKind.STEER_RATIO: lambda state, _: state[1:2], + ObservationKind.STIFFNESS: lambda state, _: state[0:1], + ObservationKind.ROAD_ROLL: lambda state, _: state[8:9], + } + def native_predict(state, covariance, dt, process_noise, _): + car_predict(state, covariance, process_noise, dt, self.native_parameters) + + model = ModelDefinition(9, 9, _transition, measurements, self.Q, self.obs_noise, + native_predict=native_predict if car_predict is not None else None, native_update=car_update) + super().__init__(StateEstimator(model, self.initial_x, self.P_initial, max_rewind_age=0.8)) + + def set_globals(self, mass: float, rotational_inertia: float, center_to_front: float, center_to_rear: float, + stiffness_front: float, stiffness_rear: float) -> None: + self.native_parameters[:] = mass, rotational_inertia, center_to_front, center_to_rear, stiffness_front, stiffness_rear + for name, value in locals().copy().items(): + if name not in {"self"}: + self.filter.set_global(name, value) diff --git a/iqpilot/selfdrive/locationd/models/constants.py b/iqpilot/selfdrive/locationd/models/constants.py new file mode 100644 index 000000000..8e95ff82e --- /dev/null +++ b/iqpilot/selfdrive/locationd/models/constants.py @@ -0,0 +1,88 @@ +class ObservationKind: + UNKNOWN = 0 + NO_OBSERVATION = 1 + GPS_NED = 2 + ODOMETRIC_SPEED = 3 + PHONE_GYRO = 4 + GPS_VEL = 5 + PSEUDORANGE_GPS = 6 + PSEUDORANGE_RATE_GPS = 7 + SPEED = 8 + NO_ROT = 9 + PHONE_ACCEL = 10 + ORB_POINT = 11 + ECEF_POS = 12 + CAMERA_ODO_TRANSLATION = 13 + CAMERA_ODO_ROTATION = 14 + ORB_FEATURES = 15 + MSCKF_TEST = 16 + FEATURE_TRACK_TEST = 17 + LANE_PT = 18 + IMU_FRAME = 19 + PSEUDORANGE_GLONASS = 20 + PSEUDORANGE_RATE_GLONASS = 21 + PSEUDORANGE = 22 + PSEUDORANGE_RATE = 23 + ECEF_VEL = 35 + ECEF_ORIENTATION_FROM_GPS = 32 + NO_ACCEL = 33 + ORB_FEATURES_WIDE = 34 + + ROAD_FRAME_XY_SPEED = 24 # (x, y) [m/s] + ROAD_FRAME_YAW_RATE = 25 # [rad/s] + STEER_ANGLE = 26 # [rad] + ANGLE_OFFSET_FAST = 27 # [rad] + STIFFNESS = 28 # [-] + STEER_RATIO = 29 # [-] + ROAD_FRAME_X_SPEED = 30 # (x) [m/s] + ROAD_ROLL = 31 # [rad] + + names = [ + 'Unknown', + 'No observation', + 'GPS NED', + 'Odometric speed', + 'Phone gyro', + 'GPS velocity', + 'GPS pseudorange', + 'GPS pseudorange rate', + 'Speed', + 'No rotation', + 'Phone acceleration', + 'ORB point', + 'ECEF pos', + 'camera odometric translation', + 'camera odometric rotation', + 'ORB features', + 'MSCKF test', + 'Feature track test', + 'Lane ecef point', + 'imu frame eulers', + 'GLONASS pseudorange', + 'GLONASS pseudorange rate', + 'pseudorange', + 'pseudorange rate', + + 'Road Frame x,y speed', + 'Road Frame yaw rate', + 'Steer Angle', + 'Fast Angle Offset', + 'Stiffness', + 'Steer Ratio', + 'Road Frame x speed', + 'Road Roll', + 'ECEF orientation from GPS', + 'NO accel', + 'ORB features wide camera', + 'ECEF_VEL', + ] + + @classmethod + def to_string(cls, kind): + return cls.names[kind] + + +SAT_OBS = [ObservationKind.PSEUDORANGE_GPS, + ObservationKind.PSEUDORANGE_RATE_GPS, + ObservationKind.PSEUDORANGE_GLONASS, + ObservationKind.PSEUDORANGE_RATE_GLONASS] diff --git a/iqpilot/selfdrive/locationd/models/pose_kf.py b/iqpilot/selfdrive/locationd/models/pose_kf.py new file mode 100644 index 000000000..6dbf0f091 --- /dev/null +++ b/iqpilot/selfdrive/locationd/models/pose_kf.py @@ -0,0 +1,67 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import numpy as np + +from iqpilot.common.transformations.orientation import euler_from_rot, rot_from_euler +from iqpilot.selfdrive.locationd.models.constants import ObservationKind +from iqpilot.selfdrive.state_estimation import EstimatorModel, ModelDefinition, StateEstimator +try: + from iqpilot.selfdrive.state_estimation.native_binding_pyx import pose_predict, pose_update +except ModuleNotFoundError: + pose_predict = None + pose_update = None + + +EARTH_G = 9.81 + + +class States: + NED_ORIENTATION = slice(0, 3) + DEVICE_VELOCITY = slice(3, 6) + ANGULAR_VELOCITY = slice(6, 9) + GYRO_BIAS = slice(9, 12) + ACCELERATION = slice(12, 15) + ACCEL_BIAS = slice(15, 18) + + +def _transition(state: np.ndarray, dt: float, _: dict[str, float]) -> np.ndarray: + result = state.copy() + result[States.DEVICE_VELOCITY] += dt * state[States.ACCELERATION] + rotation = rot_from_euler(state[States.NED_ORIENTATION]) @ rot_from_euler(dt * state[States.ANGULAR_VELOCITY]) + result[States.NED_ORIENTATION] = euler_from_rot(rotation) + return result + + +def _phone_acceleration(state: np.ndarray, _: dict[str, float]) -> np.ndarray: + device_from_ned = rot_from_euler(state[States.NED_ORIENTATION]).T + centripetal = np.cross(state[States.ANGULAR_VELOCITY], state[States.DEVICE_VELOCITY]) + return device_from_ned @ np.array([0.0, 0.0, -EARTH_G]) + state[States.ACCELERATION] + centripetal + state[States.ACCEL_BIAS] + + +class PoseKalman(EstimatorModel): + name = "pose" + initial_x = np.zeros(18) + initial_P = np.diag([0.01**2] * 3 + [10**2] * 3 + [1**2] * 6 + [100**2] * 3 + [0.01**2] * 3) + Q = np.diag([0.001**2] * 3 + [0.01**2] * 3 + [0.1**2] * 3 + [(0.005 / 100)**2] * 3 + [3**2] * 3 + [0.005**2] * 3) + obs_noise = { + ObservationKind.PHONE_GYRO: np.diag([0.025**2] * 3), + ObservationKind.PHONE_ACCEL: np.diag([0.5**2] * 3), + ObservationKind.CAMERA_ODO_TRANSLATION: np.diag([0.5**2] * 3), + ObservationKind.CAMERA_ODO_ROTATION: np.diag([0.05**2] * 3), + } + + def __init__(self, max_rewind_age: float): + measurements = { + ObservationKind.PHONE_GYRO: lambda state, _: state[States.ANGULAR_VELOCITY] + state[States.GYRO_BIAS], + ObservationKind.PHONE_ACCEL: _phone_acceleration, + ObservationKind.CAMERA_ODO_TRANSLATION: lambda state, _: state[States.DEVICE_VELOCITY], + ObservationKind.CAMERA_ODO_ROTATION: lambda state, _: state[States.ANGULAR_VELOCITY], + } + def native_predict(state, covariance, dt, process_noise, _): + pose_predict(state, covariance, process_noise, dt) + + model = ModelDefinition(18, 18, _transition, measurements, self.Q, self.obs_noise, + native_predict=native_predict if pose_predict is not None else None, native_update=pose_update) + super().__init__(StateEstimator(model, self.initial_x, self.initial_P, max_rewind_age=max_rewind_age)) diff --git a/iqpilot/selfdrive/locationd/paramsd.py b/iqpilot/selfdrive/locationd/paramsd.py new file mode 100755 index 000000000..8a42de568 --- /dev/null +++ b/iqpilot/selfdrive/locationd/paramsd.py @@ -0,0 +1,267 @@ +#!/usr/bin/env python3 +import numpy as np +import capnp + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car, log +from iqpilot.common.issue_debug import log_issue_limited +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.locationd.models.car_kf import CarKalman, ObservationKind, States +from iqpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose +from iqpilot.common.swaglog import cloudlog + +MAX_ANGLE_OFFSET_DELTA = 20 * DT_MDL # Max 20 deg/s +ROLL_MAX_DELTA = np.radians(20.0) * DT_MDL # 20deg in 1 second is well within curvature limits +ROLL_MIN, ROLL_MAX = np.radians(-10), np.radians(10) +ROLL_LOWERED_MAX = np.radians(8) +ROLL_STD_MAX = np.radians(1.5) +LATERAL_ACC_SENSOR_THRESHOLD = 4.0 +OFFSET_MAX = 16.0 # angle +OFFSET_LOWERED_MAX = 14.0 # angle +MIN_ACTIVE_SPEED = 1.0 +LOW_ACTIVE_SPEED = 10.0 + + +class VehicleParamsEstimator: + def __init__(self, CP: car.CarParams, steer_ratio: float, stiffness_factor: float, angle_offset: float, P_initial: np.ndarray | None = None): + self.kf = CarKalman() + + self.x_initial = CarKalman.initial_x.copy() + self.x_initial[States.STEER_RATIO] = steer_ratio + self.x_initial[States.STIFFNESS] = stiffness_factor + self.x_initial[States.ANGLE_OFFSET] = angle_offset + self.P_initial = P_initial if P_initial is not None else CarKalman.P_initial + + self.kf.set_globals( + mass=CP.mass, + rotational_inertia=CP.rotationalInertia, + center_to_front=CP.centerToFront, + center_to_rear=CP.wheelbase - CP.centerToFront, + stiffness_front=CP.tireStiffnessFront, + stiffness_rear=CP.tireStiffnessRear + ) + + self.min_sr, self.max_sr = 0.5 * CP.steerRatio, 2.0 * CP.steerRatio + + self.calibrator = PoseCalibrator() + + self.observed_speed = 0.0 + self.observed_yaw_rate = 0.0 + self.observed_roll = 0.0 + + self.avg_offset_valid = True + self.total_offset_valid = True + self.roll_valid = True + + self.reset(None) + + def reset(self, t: float | None): + self.kf.init_state(self.x_initial, covs=self.P_initial, filter_time=t) + + self.angle_offset, self.roll, self.active = np.degrees(self.x_initial[States.ANGLE_OFFSET].item()), 0.0, False + self.avg_angle_offset = self.angle_offset + + def handle_log(self, t: float, which: str, msg: capnp._DynamicStructReader): + if which == 'deviceMotion': + device_pose = Pose.from_live_pose(msg) + calibrated_pose = self.calibrator.build_calibrated_pose(device_pose) + + yaw_rate, yaw_rate_std = calibrated_pose.angular_velocity.z, calibrated_pose.angular_velocity.z_std + yaw_rate_valid = msg.angularVelocityDevice.valid + yaw_rate_valid = yaw_rate_valid and 0 < yaw_rate_std < 10 # rad/s + yaw_rate_valid = yaw_rate_valid and abs(yaw_rate) < 1 # rad/s + if not yaw_rate_valid: + # This is done to bound the yaw rate estimate when localizer values are invalid or calibrating + yaw_rate, yaw_rate_std = 0.0, np.radians(10.0) + self.observed_yaw_rate = yaw_rate + + localizer_roll, localizer_roll_std = device_pose.orientation.x, device_pose.orientation.x_std + localizer_roll_std = np.radians(1) if np.isnan(localizer_roll_std) else localizer_roll_std + roll_valid = (localizer_roll_std < ROLL_STD_MAX) and (ROLL_MIN < localizer_roll < ROLL_MAX) and msg.sensorsOK + if roll_valid: + roll = localizer_roll + # Experimentally found multiplier of 2 to be best trade-off between stability and accuracy or similar? + roll_std = 2 * localizer_roll_std + else: + # This is done to bound the road roll estimate when localizer values are invalid + roll = 0.0 + roll_std = np.radians(10.0) + self.observed_roll = np.clip(roll, self.observed_roll - ROLL_MAX_DELTA, self.observed_roll + ROLL_MAX_DELTA) + + if self.active: + if msg.posenetOK: + self.kf.predict_and_observe(t, + ObservationKind.ROAD_FRAME_YAW_RATE, + np.array([[-self.observed_yaw_rate]]), + np.array([np.atleast_2d(yaw_rate_std**2)])) + + self.kf.predict_and_observe(t, + ObservationKind.ROAD_ROLL, + np.array([[self.observed_roll]]), + np.array([np.atleast_2d(roll_std**2)])) + self.kf.predict_and_observe(t, ObservationKind.ANGLE_OFFSET_FAST, np.array([[0]])) + + # We observe the current stiffness and steer ratio (with a high observation noise) to bound + # the respective estimate STD. Otherwise the STDs keep increasing, causing rapid changes in the + # states in longer routes (especially straight stretches). + stiffness = float(self.kf.x[States.STIFFNESS].item()) + steer_ratio = float(self.kf.x[States.STEER_RATIO].item()) + self.kf.predict_and_observe(t, ObservationKind.STIFFNESS, np.array([[stiffness]])) + self.kf.predict_and_observe(t, ObservationKind.STEER_RATIO, np.array([[steer_ratio]])) + + elif which == 'extrinsicsCalibration': + self.calibrator.feed_live_calib(msg) + + elif which == 'carState': + steering_angle = msg.steeringAngleDeg + + in_linear_region = abs(steering_angle) < 45 + self.observed_speed = msg.vEgo + self.active = self.observed_speed > MIN_ACTIVE_SPEED and in_linear_region + + if self.active: + self.kf.predict_and_observe(t, ObservationKind.STEER_ANGLE, np.array([[np.radians(steering_angle)]])) + self.kf.predict_and_observe(t, ObservationKind.ROAD_FRAME_X_SPEED, np.array([[self.observed_speed]])) + + if not self.active: + # Reset time when stopped so uncertainty doesn't grow + self.kf.filter.set_filter_time(t) + self.kf.filter.reset_rewind() + + def get_msg(self, valid: bool, debug: bool = False) -> capnp._DynamicStructBuilder: + x = self.kf.x + P = np.sqrt(self.kf.P.diagonal()) + if not np.all(np.isfinite(x)): + cloudlog.error("NaN in vehicleParameters estimate. Resetting to default values") + self.reset(self.kf.t) + x = self.kf.x + + self.avg_angle_offset = np.clip(np.degrees(x[States.ANGLE_OFFSET].item()), + self.avg_angle_offset - MAX_ANGLE_OFFSET_DELTA, self.avg_angle_offset + MAX_ANGLE_OFFSET_DELTA) + self.angle_offset = np.clip(np.degrees(x[States.ANGLE_OFFSET].item() + x[States.ANGLE_OFFSET_FAST].item()), + self.angle_offset - MAX_ANGLE_OFFSET_DELTA, self.angle_offset + MAX_ANGLE_OFFSET_DELTA) + self.roll = np.clip(float(x[States.ROAD_ROLL].item()), self.roll - ROLL_MAX_DELTA, self.roll + ROLL_MAX_DELTA) + roll_std = float(P[States.ROAD_ROLL].item()) + if self.active and self.observed_speed > LOW_ACTIVE_SPEED: + # Account for the opposite signs of the yaw rates + # At low speeds, bumping into a curb can cause the yaw rate to be very high + sensors_valid = bool(abs(self.observed_speed * (x[States.YAW_RATE].item() + self.observed_yaw_rate)) < LATERAL_ACC_SENSOR_THRESHOLD) + else: + sensors_valid = True + self.avg_offset_valid = check_valid_with_hysteresis(self.avg_offset_valid, self.avg_angle_offset, OFFSET_MAX, OFFSET_LOWERED_MAX) + self.total_offset_valid = check_valid_with_hysteresis(self.total_offset_valid, self.angle_offset, OFFSET_MAX, OFFSET_LOWERED_MAX) + self.roll_valid = check_valid_with_hysteresis(self.roll_valid, self.roll, ROLL_MAX, ROLL_LOWERED_MAX) + + if not self.total_offset_valid: + log_issue_limited( + "paramsd_angle_offset_invalid", + "calibration", + f"paramsd angle offset invalid angleOffsetDeg={self.angle_offset:.2f} " + f"angleOffsetAverageDeg={self.avg_angle_offset:.2f} speed={self.observed_speed:.2f}", + interval_sec=2.0, + ) + + msg = messaging.new_message('vehicleParameters') + + msg.valid = valid + + vehicleParameters = msg.vehicleParameters + vehicleParameters.posenetValid = True + vehicleParameters.sensorValid = sensors_valid + vehicleParameters.steerRatio = float(x[States.STEER_RATIO].item()) + vehicleParameters.stiffnessFactor = float(x[States.STIFFNESS].item()) + vehicleParameters.roll = float(self.roll) + vehicleParameters.angleOffsetAverageDeg = float(self.avg_angle_offset) + vehicleParameters.angleOffsetDeg = float(self.angle_offset) + vehicleParameters.steerRatioValid = self.min_sr <= vehicleParameters.steerRatio <= self.max_sr + vehicleParameters.stiffnessFactorValid = 0.2 <= vehicleParameters.stiffnessFactor <= 5.0 + vehicleParameters.angleOffsetAverageValid = bool(self.avg_offset_valid) + vehicleParameters.angleOffsetValid = bool(self.total_offset_valid) + vehicleParameters.valid = all(( + vehicleParameters.angleOffsetAverageValid, + vehicleParameters.angleOffsetValid , + self.roll_valid, + roll_std < ROLL_STD_MAX, + vehicleParameters.stiffnessFactorValid, + vehicleParameters.steerRatioValid, + )) + vehicleParameters.steerRatioStd = float(P[States.STEER_RATIO].item()) + vehicleParameters.stiffnessFactorStd = float(P[States.STIFFNESS].item()) + vehicleParameters.angleOffsetAverageStd = float(P[States.ANGLE_OFFSET].item()) + vehicleParameters.angleOffsetFastStd = float(P[States.ANGLE_OFFSET_FAST].item()) + if debug: + vehicleParameters.debugFilterState = log.VehicleParameters.FilterState.new_message() + vehicleParameters.debugFilterState.value = x.tolist() + vehicleParameters.debugFilterState.std = P.tolist() + + return msg + + +def check_valid_with_hysteresis(current_valid: bool, val: float, threshold: float, lowered_threshold: float): + if current_valid: + current_valid = abs(val) < threshold + else: + current_valid = abs(val) < lowered_threshold + return current_valid + + +# TODO: Remove this function after few releases (added in 0.9.9) +def migrate_cached_vehicle_params_if_needed(params: Params): + last_parameters_data_old = params.get("LiveParameters") + last_parameters_data = params.get("LiveParametersV2") + if last_parameters_data_old is None or last_parameters_data is not None: + return + + try: + last_parameters_msg = messaging.new_message('vehicleParameters') + last_parameters_msg.vehicleParameters.valid = True + last_parameters_msg.vehicleParameters.steerRatio = last_parameters_data_old['steerRatio'] + last_parameters_msg.vehicleParameters.stiffnessFactor = last_parameters_data_old['stiffnessFactor'] + last_parameters_msg.vehicleParameters.angleOffsetAverageDeg = last_parameters_data_old['angleOffsetAverageDeg'] + params.put("LiveParametersV2", last_parameters_msg.to_bytes()) + except Exception as e: + cloudlog.error(f"Failed to perform parameter migration: {e}") + params.remove("LiveParameters") + + +def retrieve_initial_vehicle_params(params: Params, CP: car.CarParams, replay: bool, debug: bool): + last_parameters_data = params.get("LiveParametersV2") + last_carparams_data = params.get("CarParamsPrevRoute") + + steer_ratio, stiffness_factor, angle_offset_deg, p_initial = CP.steerRatio, 1.0, 0.0, None + + retrieve_success = False + if last_parameters_data is not None and last_carparams_data is not None: + try: + with log.Event.from_bytes(last_parameters_data) as last_lp_msg, car.CarParams.from_bytes(last_carparams_data) as last_CP: + lp = last_lp_msg.vehicleParameters + # Check if car model matches + if last_CP.carFingerprint != CP.carFingerprint: + raise Exception("Car model mismatch") + + # Check if starting values are sane + min_sr, max_sr = 0.5 * CP.steerRatio, 2.0 * CP.steerRatio + steer_ratio_sane = min_sr <= lp.steerRatio <= max_sr + if not steer_ratio_sane: + raise Exception(f"Invalid starting values found {lp}") + + initial_filter_std = np.array(lp.debugFilterState.std) + if debug and len(initial_filter_std) != 0: + p_initial = np.diag(initial_filter_std) + + steer_ratio, stiffness_factor, angle_offset_deg = lp.steerRatio, lp.stiffnessFactor, lp.angleOffsetAverageDeg + retrieve_success = True + except Exception as e: + cloudlog.error(f"Failed to retrieve initial values: {e}") + params.remove("LiveParametersV2") + + if not replay: + # When driving in wet conditions the stiffness can go down, and then be too low on the next drive + # Without a way to detect this we have to reset the stiffness every drive + stiffness_factor = 1.0 + + if not retrieve_success: + cloudlog.info("Vehicle parameter estimator resetting to default values") + + return steer_ratio, stiffness_factor, angle_offset_deg, p_initial diff --git a/iqpilot/selfdrive/locationd/test/.gitignore b/iqpilot/selfdrive/locationd/test/.gitignore new file mode 100644 index 000000000..89f9ac04a --- /dev/null +++ b/iqpilot/selfdrive/locationd/test/.gitignore @@ -0,0 +1 @@ +out/ diff --git a/iqpilot/selfdrive/locationd/test/__init__.py b/iqpilot/selfdrive/locationd/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/locationd/test/test_calibration_helpers.py b/iqpilot/selfdrive/locationd/test/test_calibration_helpers.py new file mode 100644 index 000000000..233841f0f --- /dev/null +++ b/iqpilot/selfdrive/locationd/test/test_calibration_helpers.py @@ -0,0 +1,61 @@ +import numpy as np +import pytest + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import log + +from iqpilot.selfdrive.locationd.calibrationd import HEIGHT_INIT +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy, get_render_path_height +from iqpilot.selfdrive.locationd.helpers import PoseCalibrator + + +def build_live_calibration(status: log.ExtrinsicsCalibration.Status, + rpy: tuple[float, float, float] = (0.0, 0.0, 0.0), + height: tuple[float, ...] = (1.22,)): + msg = messaging.new_message("extrinsicsCalibration") + msg.extrinsicsCalibration.calStatus = status + msg.extrinsicsCalibration.rpyCalib = list(rpy) + msg.extrinsicsCalibration.height = list(height) + return msg.extrinsicsCalibration + + +def test_get_calibrated_rpy_requires_calibrated_status(): + live_calib = build_live_calibration(log.ExtrinsicsCalibration.Status.uncalibrated, rpy=(0.1, 0.2, 0.3)) + assert get_calibrated_rpy(live_calib) is None + + live_calib = build_live_calibration(log.ExtrinsicsCalibration.Status.calibrated, rpy=(0.1, 0.2, 0.3)) + np.testing.assert_allclose(get_calibrated_rpy(live_calib), np.array([0.1, 0.2, 0.3], dtype=np.float32)) + + +def test_get_render_path_height_uses_default_until_calibrated(): + live_calib = build_live_calibration(log.ExtrinsicsCalibration.Status.uncalibrated, height=(1.5,)) + assert get_render_path_height(live_calib) == float(HEIGHT_INIT[0]) + + live_calib = build_live_calibration(log.ExtrinsicsCalibration.Status.calibrated, height=(1.5,)) + assert get_render_path_height(live_calib) == 1.5 + + +def test_calibrated_values_are_used_even_when_identity_override_is_disabled(): + live_calib = build_live_calibration(log.ExtrinsicsCalibration.Status.calibrated, rpy=(0.3, -0.2, 0.1), height=(1.6,)) + np.testing.assert_allclose(get_calibrated_rpy(live_calib), np.array([0.3, -0.2, 0.1], dtype=np.float32)) + assert get_render_path_height(live_calib) == pytest.approx(1.6) + + +def test_pose_calibrator_holds_identity_until_calibrated(): + calibrator = PoseCalibrator() + + uncalibrated = build_live_calibration(log.ExtrinsicsCalibration.Status.uncalibrated, rpy=(0.1, 0.2, 0.3)) + calibrator.feed_live_calib(uncalibrated) + np.testing.assert_allclose(calibrator.calib_from_device, np.eye(3)) + assert not calibrator.calib_valid + + calibrated = build_live_calibration(log.ExtrinsicsCalibration.Status.calibrated, rpy=(0.0, 0.1, 0.0)) + calibrator.feed_live_calib(calibrated) + assert not np.allclose(calibrator.calib_from_device, np.eye(3)) + assert calibrator.calib_valid + + recalibrating = build_live_calibration(log.ExtrinsicsCalibration.Status.recalibrating, rpy=(0.2, 0.2, 0.2)) + frozen_transform = calibrator.calib_from_device.copy() + calibrator.feed_live_calib(recalibrating) + np.testing.assert_allclose(calibrator.calib_from_device, frozen_transform) + assert not calibrator.calib_valid diff --git a/iqpilot/selfdrive/locationd/test/test_calibrationd.py b/iqpilot/selfdrive/locationd/test/test_calibrationd.py new file mode 100644 index 000000000..3e3b78928 --- /dev/null +++ b/iqpilot/selfdrive/locationd/test/test_calibrationd.py @@ -0,0 +1,117 @@ +import random + +import numpy as np + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import log +from iqpilot.common.params import Params +from iqpilot.selfdrive.locationd.calibrationd import Calibrator, INPUTS_NEEDED, INPUTS_WANTED, BLOCK_SIZE, MIN_SPEED_FILTER, \ + MAX_YAW_RATE_FILTER, SMOOTH_CYCLES, HEIGHT_INIT, MAX_ALLOWED_PITCH_SPREAD, MAX_ALLOWED_YAW_SPREAD + + +def process_messages(c, cam_odo_calib, cycles, + cam_odo_speed=MIN_SPEED_FILTER + 1, + carstate_speed=MIN_SPEED_FILTER + 1, + cam_odo_yr=0.0, + cam_odo_speed_std=1e-3, + cam_odo_height_std=1e-3): + old_rpy_weight_prev = 0.0 + for _ in range(cycles): + assert (old_rpy_weight_prev - c.old_rpy_weight < 1/SMOOTH_CYCLES + 1e-3) + old_rpy_weight_prev = c.old_rpy_weight + c.handle_v_ego(carstate_speed) + c.handle_cam_odom([cam_odo_speed, + np.sin(cam_odo_calib[2]) * cam_odo_speed, + -np.sin(cam_odo_calib[1]) * cam_odo_speed], + [0.0, 0.0, cam_odo_yr], + [0.0, 0.0, 0.0], + [cam_odo_speed_std, cam_odo_speed_std, cam_odo_speed_std], + [0.0, 0.0, HEIGHT_INIT.item()], + [cam_odo_height_std, cam_odo_height_std, cam_odo_height_std]) + +class TestCalibrationd: + def test_read_saved_params(self): + msg = messaging.new_message('extrinsicsCalibration') + msg.extrinsicsCalibration.validBlocks = random.randint(1, 10) + msg.extrinsicsCalibration.rpyCalib = [0.0, 0.01, 0.01] + msg.extrinsicsCalibration.height = HEIGHT_INIT.tolist() + Params().put("CalibrationParams", msg.to_bytes()) + c = Calibrator(param_put=True) + + np.testing.assert_allclose(msg.extrinsicsCalibration.rpyCalib, c.rpy) + np.testing.assert_allclose(msg.extrinsicsCalibration.height, c.height) + assert msg.extrinsicsCalibration.validBlocks == c.valid_blocks + + + def test_calibration_basics(self): + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_WANTED) + assert c.valid_blocks == INPUTS_WANTED + np.testing.assert_allclose(c.rpy, np.zeros(3)) + np.testing.assert_allclose(c.height, HEIGHT_INIT) + c.reset() + + + def test_calibration_low_speed_reject(self): + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_WANTED, carstate_speed=MIN_SPEED_FILTER - 1) + assert c.valid_blocks == 0 + np.testing.assert_allclose(c.rpy, np.zeros(3)) + np.testing.assert_allclose(c.height, HEIGHT_INIT) + + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_WANTED, + cam_odo_speed=MIN_SPEED_FILTER - 10, carstate_speed=MIN_SPEED_FILTER + 5) + assert c.valid_blocks == INPUTS_WANTED + np.testing.assert_allclose(c.rpy[1:], np.zeros(2), atol=1e-6) + np.testing.assert_allclose(c.height, HEIGHT_INIT) + + + def test_calibration_yaw_rate_reject(self): + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_WANTED, cam_odo_yr=MAX_YAW_RATE_FILTER) + assert c.valid_blocks == 0 + np.testing.assert_allclose(c.rpy, np.zeros(3)) + np.testing.assert_allclose(c.height, HEIGHT_INIT) + + + def test_calibration_speed_std_reject(self): + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_WANTED, cam_odo_speed_std=1e3) + assert c.valid_blocks == 0 + np.testing.assert_allclose(c.rpy, np.zeros(3)) + + + def test_calibration_speed_std_height_reject(self): + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_WANTED, cam_odo_height_std=1e3) + assert c.valid_blocks == INPUTS_WANTED + np.testing.assert_allclose(c.rpy, np.zeros(3)) + + + def test_calibration_auto_reset(self): + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_NEEDED) + assert c.valid_blocks == INPUTS_NEEDED + np.testing.assert_allclose(c.rpy, [0.0, 0.0, 0.0], atol=1e-3) + process_messages(c, [0.0, MAX_ALLOWED_PITCH_SPREAD*0.9, MAX_ALLOWED_YAW_SPREAD*0.9], BLOCK_SIZE + 10) + assert c.valid_blocks == INPUTS_NEEDED + 1 + assert c.cal_status == log.ExtrinsicsCalibration.Status.calibrated + + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_NEEDED) + assert c.valid_blocks == INPUTS_NEEDED + np.testing.assert_allclose(c.rpy, [0.0, 0.0, 0.0]) + process_messages(c, [0.0, MAX_ALLOWED_PITCH_SPREAD*1.1, 0.0], BLOCK_SIZE + 10) + assert c.valid_blocks == 1 + assert c.cal_status == log.ExtrinsicsCalibration.Status.recalibrating + np.testing.assert_allclose(c.rpy, [0.0, MAX_ALLOWED_PITCH_SPREAD*1.1, 0.0], atol=1e-2) + + c = Calibrator(param_put=False) + process_messages(c, [0.0, 0.0, 0.0], BLOCK_SIZE * INPUTS_NEEDED) + assert c.valid_blocks == INPUTS_NEEDED + np.testing.assert_allclose(c.rpy, [0.0, 0.0, 0.0]) + process_messages(c, [0.0, 0.0, MAX_ALLOWED_YAW_SPREAD*1.1], BLOCK_SIZE + 10) + assert c.valid_blocks == 1 + assert c.cal_status == log.ExtrinsicsCalibration.Status.recalibrating + np.testing.assert_allclose(c.rpy, [0.0, 0.0, MAX_ALLOWED_YAW_SPREAD*1.1], atol=1e-2) diff --git a/iqpilot/selfdrive/locationd/test/test_helpers.py b/iqpilot/selfdrive/locationd/test/test_helpers.py new file mode 100644 index 000000000..3374bff9d --- /dev/null +++ b/iqpilot/selfdrive/locationd/test/test_helpers.py @@ -0,0 +1,43 @@ +import numpy as np +import pytest + +from iqpilot.selfdrive.locationd.helpers import ParameterEstimator, PointBuckets, fft_next_good_size + + +class ScalarBuckets(PointBuckets): + def add_point(self, x, y): + for bounds, bucket in self.buckets.items(): + if bounds[0] <= x < bounds[1]: + bucket.append([x, y]) + return + raise ValueError(x) + + +def test_fft_next_good_size_small_input(): + assert fft_next_good_size(6) == 6 + + +def test_point_buckets_base_requires_an_insertion_policy(): + buckets = PointBuckets([(0, 1)], [1], 1, 2, 2) + with pytest.raises(NotImplementedError): + buckets.add_point(0.5, 1.0) + + +def test_point_buckets_load_and_retrieve(): + buckets = ScalarBuckets([(0, 1), (1, 2)], [1, 1], 2, 3, 2) + points = [[0.25, 10.0], [1.25, 20.0], [0.75, 30.0]] + buckets.load_points(points) + assert buckets.is_valid() + assert buckets.is_calculable() + np.testing.assert_allclose(buckets.get_points(), [[0.25, 10.0], [0.75, 30.0], [1.25, 20.0]]) + assert buckets.get_points(2).shape == (2, 2) + + +@pytest.mark.parametrize("method,args", [ + ("reset", ()), + ("handle_log", (0, "carState", None)), + ("get_msg", (True, False)), +]) +def test_parameter_estimator_requires_an_implementation(method, args): + with pytest.raises(NotImplementedError): + getattr(ParameterEstimator(), method)(*args) diff --git a/iqpilot/selfdrive/locationd/test/test_lagd.py b/iqpilot/selfdrive/locationd/test/test_lagd.py new file mode 100644 index 000000000..0b4cfc51e --- /dev/null +++ b/iqpilot/selfdrive/locationd/test/test_lagd.py @@ -0,0 +1,136 @@ +import random +import numpy as np +import time +import pytest + +from iqpilot.cereal import messaging, log, car +from iqpilot.selfdrive.locationd.lagd import LateralLagEstimator, retrieve_initial_lag, masked_normalized_cross_correlation, \ + BLOCK_NUM_NEEDED, BLOCK_SIZE, MIN_OKAY_WINDOW_SEC, VERSION, MIN_LAG, MAX_LAG +from iqpilot.selfdrive.test.process_replay.migration import migrate, migrate_carParams +from iqpilot.selfdrive.locationd.test.test_locationd_scenarios import TEST_ROUTE +from iqpilot.common.params import Params +from iqpilot.tools.lib.logreader import LogReader + +MAX_ERR_FRAMES = 1 +DT = 0.05 +LAGD_MIN_LAG_FRAMES, LAGD_MAX_LAG_FRAMES = int(round(MIN_LAG / DT)), int(round(MAX_LAG / DT)) + + +def process_messages(estimator, lag_frames, n_frames, vego=25.0, rejection_threshold=0.0): + for i in range(n_frames): + t = i * estimator.dt + desired_la = np.cos(10 * t) * 0.3 + actual_la = np.cos(10 * (t - lag_frames * estimator.dt)) * 0.3 + + # if sample is masked out, set it to desired value (no lag) + rejected = random.uniform(0, 1) < rejection_threshold + if rejected: + actual_la = desired_la + + desired_cuvature = float(desired_la / (vego ** 2)) + actual_yr = float(actual_la / vego) + msgs = [ + (t, "carControl", car.CarControl(latActive=not rejected)), + (t, "carState", car.CarState(vEgo=vego, steeringPressed=False)), + (t, "controlsState", log.ControlsState(desiredCurvature=desired_cuvature)), + (t, "deviceMotion", log.DeviceMotion(angularVelocityDevice=log.DeviceMotion.XYZMeasurement(z=actual_yr, valid=True), + posenetOK=True, inputsOK=True)), + (t, "extrinsicsCalibration", log.ExtrinsicsCalibration(rpyCalib=[0, 0, 0], calStatus=log.ExtrinsicsCalibration.Status.calibrated)), + ] + for t, w, m in msgs: + estimator.handle_log(t, w, m) + estimator.update_points() + estimator.update_estimate() + + +class TestLagd: + def test_read_saved_params(self): + params = Params() + + lr = migrate(LogReader(TEST_ROUTE), [migrate_carParams]) + CP = next(m for m in lr if m.which() == "carParams").carParams + + msg = messaging.new_message('lateralDelay') + msg.lateralDelay.lateralDelayEstimate = random.random() + msg.lateralDelay.validBlocks = random.randint(1, 10) + msg.lateralDelay.version = VERSION + params.put("LiveDelay", msg.to_bytes()) + params.put("CarParamsPrevRoute", CP.as_builder().to_bytes()) + + saved_lag_params = retrieve_initial_lag(params, CP) + assert saved_lag_params is not None + + lag, valid_blocks = saved_lag_params + assert lag == msg.lateralDelay.lateralDelayEstimate + assert valid_blocks == msg.lateralDelay.validBlocks + + def test_ncc(self): + lag_frames = random.randint(1, 19) + + desired_sig = np.sin(np.arange(0.0, 10.0, 0.1)) + actual_sig = np.sin(np.arange(0.0, 10.0, 0.1) - lag_frames * 0.1) + mask = np.ones(len(desired_sig), dtype=bool) + + corr = masked_normalized_cross_correlation(desired_sig, actual_sig, mask, 200)[len(desired_sig) - 1:len(desired_sig) + 20] + assert np.argmax(corr) == lag_frames + + # add some noise + desired_sig += np.random.normal(0, 0.05, len(desired_sig)) + actual_sig += np.random.normal(0, 0.05, len(actual_sig)) + corr = masked_normalized_cross_correlation(desired_sig, actual_sig, mask, 200)[len(desired_sig) - 1:len(desired_sig) + 20] + assert np.argmax(corr) in range(lag_frames - MAX_ERR_FRAMES, lag_frames + MAX_ERR_FRAMES + 1) + + # mask out 40% of the values, and make them noise + mask = np.random.choice([True, False], size=len(desired_sig), p=[0.6, 0.4]) + desired_sig[~mask] = np.random.normal(0, 1, size=np.sum(~mask)) + actual_sig[~mask] = np.random.normal(0, 1, size=np.sum(~mask)) + corr = masked_normalized_cross_correlation(desired_sig, actual_sig, mask, 200)[len(desired_sig) - 1:len(desired_sig) + 20] + assert np.argmax(corr) in range(lag_frames - MAX_ERR_FRAMES, lag_frames + MAX_ERR_FRAMES + 1) + + def test_empty_estimator(self): + mocked_CP = car.CarParams(steerActuatorDelay=0.5) + estimator = LateralLagEstimator(mocked_CP, DT) + msg = estimator.get_msg(True) + assert msg.lateralDelay.status == 'unestimated' + assert np.allclose(msg.lateralDelay.lateralDelay, estimator.initial_lag) + assert np.allclose(msg.lateralDelay.lateralDelayEstimate, estimator.initial_lag) + assert msg.lateralDelay.validBlocks == 0 + assert msg.lateralDelay.calPerc == 0 + + def test_estimator_basics(self, subtests): + for lag_frames in range(LAGD_MIN_LAG_FRAMES, LAGD_MAX_LAG_FRAMES - 1): + with subtests.test(msg=f"lag_frames={lag_frames}"): + mocked_CP = car.CarParams(steerActuatorDelay=0.5) + estimator = LateralLagEstimator(mocked_CP, DT, min_recovery_buffer_sec=0.0, min_yr=0.0) + process_messages(estimator, lag_frames, int(MIN_OKAY_WINDOW_SEC / DT) + BLOCK_NUM_NEEDED * BLOCK_SIZE) + msg = estimator.get_msg(True) + assert msg.lateralDelay.status == 'estimated' + assert np.allclose(msg.lateralDelay.lateralDelay, lag_frames * DT, atol=0.01) + assert np.allclose(msg.lateralDelay.lateralDelayEstimate, lag_frames * DT, atol=0.01) + assert np.allclose(msg.lateralDelay.lateralDelayEstimateStd, 0.0, atol=0.01) + assert msg.lateralDelay.validBlocks == BLOCK_NUM_NEEDED + assert msg.lateralDelay.calPerc == 100 + + def test_estimator_masking(self): + mocked_CP, lag_frames = car.CarParams(steerActuatorDelay=0.5), random.randint(LAGD_MIN_LAG_FRAMES, LAGD_MAX_LAG_FRAMES - 1) + estimator = LateralLagEstimator(mocked_CP, DT, min_recovery_buffer_sec=0.0, min_yr=0.0, min_valid_block_count=1) + process_messages(estimator, lag_frames, (int(MIN_OKAY_WINDOW_SEC / DT) + BLOCK_SIZE) * 2, rejection_threshold=0.4) + msg = estimator.get_msg(True) + assert np.allclose(msg.lateralDelay.lateralDelayEstimate, lag_frames * DT, atol=0.01) + assert np.allclose(msg.lateralDelay.lateralDelayEstimateStd, 0.0, atol=0.01) + assert msg.lateralDelay.calPerc == 100 + + @pytest.mark.timeout(60) + def test_estimator_performance(self): + mocked_CP = car.CarParams(steerActuatorDelay=0.5) + estimator = LateralLagEstimator(mocked_CP, DT) + + ds = [] + for _ in range(1000): + st = time.perf_counter() + estimator.update_points() + estimator.update_estimate() + d = time.perf_counter() - st + ds.append(d) + + assert np.mean(ds) < DT diff --git a/iqpilot/selfdrive/locationd/test/test_locationd_scenarios.py b/iqpilot/selfdrive/locationd/test/test_locationd_scenarios.py new file mode 100644 index 000000000..0db905f88 --- /dev/null +++ b/iqpilot/selfdrive/locationd/test/test_locationd_scenarios.py @@ -0,0 +1,193 @@ +import numpy as np +import pytest +from collections import defaultdict +from enum import Enum + +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.selfdrive.test.process_replay.migration import migrate_all +from iqpilot.selfdrive.test.process_replay.process_replay import replay_process_with_name + +# TODO find a new segment to test +TEST_ROUTE = "4019fff6e54cf1c7|00000123--4bc0d95ef6/5" +GPS_MESSAGES = ['gpsLocationExternal', 'gpsLocation'] +SELECT_COMPARE_FIELDS = { + 'yaw_rate': ['angularVelocityDevice', 'z'], + 'roll': ['orientationNED', 'x'], + 'inputs_flag': ['inputsOK'], + 'sensors_flag': ['sensorsOK'], +} +JUNK_IDX = 100 +CONSISTENT_SPIKES_COUNT = 10 + + +class Scenario(Enum): + BASE = 'base' + GYRO_OFF = 'gyro_off' + GYRO_SPIKE_MIDWAY = 'gyro_spike_midway' + GYRO_CONSISTENT_SPIKES = 'gyro_consistent_spikes' + ACCEL_OFF = 'accel_off' + ACCEL_SPIKE_MIDWAY = 'accel_spike_midway' + ACCEL_CONSISTENT_SPIKES = 'accel_consistent_spikes' + SENSOR_TIMING_SPIKE_MIDWAY = 'timing_spikes' + SENSOR_TIMING_CONSISTENT_SPIKES = 'timing_consistent_spikes' + + +def get_select_fields_data(logs): + def get_nested_keys(msg, keys): + val = None + for key in keys: + val = getattr(msg if val is None else val, key) if isinstance(key, str) else val[key] + return val + lp = [x.deviceMotion for x in logs if x.which() == 'deviceMotion'] + data = defaultdict(list) + for msg in lp: + for key, fields in SELECT_COMPARE_FIELDS.items(): + data[key].append(get_nested_keys(msg, fields)) + for key in data: + data[key] = np.array(data[key][JUNK_IDX:], dtype=float) + return data + + +def modify_logs_midway(logs, which, count, fn): + non_which = [x for x in logs if x.which() != which] + which = [x for x in logs if x.which() == which] + temps = which[len(which) // 2:len(which) // 2 + count] + for i, temp in enumerate(temps): + temp = temp.as_builder() + fn(temp) + which[len(which) // 2 + i] = temp.as_reader() + return sorted(non_which + which, key=lambda x: x.logMonoTime) + + +def run_scenarios(scenario, logs): + if scenario == Scenario.BASE: + pass + + elif scenario == Scenario.GYRO_OFF: + logs = sorted([x for x in logs if x.which() != 'gyroscope'], key=lambda x: x.logMonoTime) + + elif scenario == Scenario.GYRO_SPIKE_MIDWAY or scenario == Scenario.GYRO_CONSISTENT_SPIKES: + def gyro_spike(msg): + msg.gyroscope.gyroUncalibrated.v[0] += 3.0 + count = 1 if scenario == Scenario.GYRO_SPIKE_MIDWAY else CONSISTENT_SPIKES_COUNT + logs = modify_logs_midway(logs, 'gyroscope', count, gyro_spike) + + elif scenario == Scenario.ACCEL_OFF: + logs = sorted([x for x in logs if x.which() != 'accelerometer'], key=lambda x: x.logMonoTime) + + elif scenario == Scenario.ACCEL_SPIKE_MIDWAY or scenario == Scenario.ACCEL_CONSISTENT_SPIKES: + def acc_spike(msg): + msg.accelerometer.acceleration.v[0] += 100.0 + count = 1 if scenario == Scenario.ACCEL_SPIKE_MIDWAY else CONSISTENT_SPIKES_COUNT + logs = modify_logs_midway(logs, 'accelerometer', count, acc_spike) + + elif scenario == Scenario.SENSOR_TIMING_SPIKE_MIDWAY or scenario == Scenario.SENSOR_TIMING_CONSISTENT_SPIKES: + def timing_spike(msg): + msg.accelerometer.timestamp -= int(0.150 * 1e9) + count = 1 if scenario == Scenario.SENSOR_TIMING_SPIKE_MIDWAY else CONSISTENT_SPIKES_COUNT + logs = modify_logs_midway(logs, 'accelerometer', count, timing_spike) + + replayed_logs = replay_process_with_name(name='locationd', lr=logs) + return get_select_fields_data(logs), get_select_fields_data(replayed_logs) + + +@pytest.mark.linux +@pytest.mark.slow +class TestLocationdScenarios: + """ + Test locationd with different scenarios. In all these scenarios, we expect the following: + - locationd kalman filter should never go unstable (we care mostly about yaw_rate, roll, gpsOK, inputsOK, sensorsOK) + - faulty values should be ignored, with appropriate flags set + """ + + @classmethod + def setup_class(cls): + cls.logs = migrate_all(LogReader(TEST_ROUTE)) + + def test_base(self): + """ + Test: unchanged log + Expected Result: + - yaw_rate: unchanged + - roll: unchanged + """ + orig_data, replayed_data = run_scenarios(Scenario.BASE, self.logs) + assert np.allclose(orig_data['yaw_rate'], replayed_data['yaw_rate'], atol=np.radians(0.35)) + assert np.allclose(orig_data['roll'], replayed_data['roll'], atol=np.radians(0.55)) + + def test_gyro_off(self): + """ + Test: no gyroscope message for the entire segment + Expected Result: + - yaw_rate: 0 + - roll: 0 + - sensorsOK: False + """ + _, replayed_data = run_scenarios(Scenario.GYRO_OFF, self.logs) + assert np.allclose(replayed_data['yaw_rate'], 0.0) + assert np.allclose(replayed_data['roll'], 0.0) + assert np.all(replayed_data['sensors_flag'] == 0.0) + + def test_gyro_spike(self): + """ + Test: a gyroscope spike in the middle of the segment + Expected Result: + - yaw_rate: unchanged + - roll: unchanged + - inputsOK: False for some time after the spike, True for the rest + """ + orig_data, replayed_data = run_scenarios(Scenario.GYRO_SPIKE_MIDWAY, self.logs) + assert np.allclose(orig_data['yaw_rate'], replayed_data['yaw_rate'], atol=np.radians(0.35)) + assert np.allclose(orig_data['roll'], replayed_data['roll'], atol=np.radians(0.55)) + assert np.all(replayed_data['inputs_flag'] == orig_data['inputs_flag']) + assert np.all(replayed_data['sensors_flag'] == orig_data['sensors_flag']) + + def test_consistent_gyro_spikes(self): + """ + Test: consistent timing spikes for N gyroscope messages in the middle of the segment + Expected Result: inputsOK becomes False after N of bad measurements + """ + orig_data, replayed_data = run_scenarios(Scenario.GYRO_CONSISTENT_SPIKES, self.logs) + assert np.diff(replayed_data['inputs_flag'])[501] == -1.0 + assert np.diff(replayed_data['inputs_flag'])[708] == 1.0 + + def test_accel_off(self): + """ + Test: no accelerometer message for the entire segment + Expected Result: + - yaw_rate: 0 + - roll: 0 + - sensorsOK: False + """ + _, replayed_data = run_scenarios(Scenario.ACCEL_OFF, self.logs) + assert np.allclose(replayed_data['yaw_rate'], 0.0) + assert np.allclose(replayed_data['roll'], 0.0) + assert np.all(replayed_data['sensors_flag'] == 0.0) + + def test_accel_spike(self): + """ + ToDo: + Test: an accelerometer spike in the middle of the segment + Expected Result: Right now, the kalman filter is not robust to small spikes like it is to gyroscope spikes. + """ + orig_data, replayed_data = run_scenarios(Scenario.ACCEL_SPIKE_MIDWAY, self.logs) + assert np.allclose(orig_data['yaw_rate'], replayed_data['yaw_rate'], atol=np.radians(0.35)) + assert np.allclose(orig_data['roll'], replayed_data['roll'], atol=np.radians(0.55)) + + def test_single_timing_spike(self): + """ + Test: timing of 150ms off for the single accelerometer message in the middle of the segment + Expected Result: the message is ignored, and inputsOK is False for that time + """ + orig_data, replayed_data = run_scenarios(Scenario.SENSOR_TIMING_SPIKE_MIDWAY, self.logs) + assert np.all(replayed_data['inputs_flag'] == orig_data['inputs_flag']) + assert np.all(replayed_data['sensors_flag'] == orig_data['sensors_flag']) + + def test_consistent_timing_spikes(self): + """ + Test: consistent timing spikes for N accelerometer messages in the middle of the segment + Expected Result: inputsOK becomes False after N of bad measurements + """ + orig_data, replayed_data = run_scenarios(Scenario.SENSOR_TIMING_CONSISTENT_SPIKES, self.logs) + assert np.diff(replayed_data['inputs_flag'])[501] == -1.0 + assert np.diff(replayed_data['inputs_flag'])[707] == 1.0 diff --git a/iqpilot/selfdrive/locationd/test/test_paramsd.py b/iqpilot/selfdrive/locationd/test/test_paramsd.py new file mode 100644 index 000000000..a22f42b54 --- /dev/null +++ b/iqpilot/selfdrive/locationd/test/test_paramsd.py @@ -0,0 +1,71 @@ +import random +import numpy as np + +from iqpilot.cereal import messaging +from iqpilot.selfdrive.locationd.paramsd import retrieve_initial_vehicle_params, migrate_cached_vehicle_params_if_needed +from iqpilot.selfdrive.locationd.models.car_kf import CarKalman +from iqpilot.selfdrive.locationd.test.test_locationd_scenarios import TEST_ROUTE +from iqpilot.selfdrive.test.process_replay.migration import migrate, migrate_carParams +from iqpilot.common.params import Params +from iqpilot.tools.lib.logreader import LogReader + + +def get_random_live_parameters(CP): + msg = messaging.new_message("vehicleParameters") + msg.vehicleParameters.steerRatio = (random.random() + 0.5) * CP.steerRatio + msg.vehicleParameters.stiffnessFactor = random.random() + msg.vehicleParameters.angleOffsetAverageDeg = random.random() + msg.vehicleParameters.debugFilterState.std = [random.random() for _ in range(CarKalman.P_initial.shape[0])] + return msg + + +class TestParamsd: + def test_read_saved_params(self): + params = Params() + + lr = migrate(LogReader(TEST_ROUTE), [migrate_carParams]) + CP = next(m for m in lr if m.which() == "carParams").carParams + + msg = get_random_live_parameters(CP) + params.put("LiveParametersV2", msg.to_bytes()) + params.put("CarParamsPrevRoute", CP.as_builder().to_bytes()) + + migrate_cached_vehicle_params_if_needed(params) # this is not tested here but should not mess anything up or throw an error + sr, sf, offset, p_init = retrieve_initial_vehicle_params(params, CP, replay=True, debug=True) + np.testing.assert_allclose(sr, msg.vehicleParameters.steerRatio) + np.testing.assert_allclose(sf, msg.vehicleParameters.stiffnessFactor) + np.testing.assert_allclose(offset, msg.vehicleParameters.angleOffsetAverageDeg) + np.testing.assert_equal(p_init.shape, CarKalman.P_initial.shape) + np.testing.assert_allclose(np.diagonal(p_init), msg.vehicleParameters.debugFilterState.std) + + # TODO Remove this test after the support for old format is removed + def test_read_saved_params_old_format(self): + params = Params() + + lr = migrate(LogReader(TEST_ROUTE), [migrate_carParams]) + CP = next(m for m in lr if m.which() == "carParams").carParams + + msg = get_random_live_parameters(CP) + params.put("LiveParameters", { + "steerRatio": msg.vehicleParameters.steerRatio, + "stiffnessFactor": msg.vehicleParameters.stiffnessFactor, + "angleOffsetAverageDeg": msg.vehicleParameters.angleOffsetAverageDeg, + }) + params.put("CarParamsPrevRoute", CP.as_builder().to_bytes()) + params.remove("LiveParametersV2") + + migrate_cached_vehicle_params_if_needed(params) + sr, sf, offset, _ = retrieve_initial_vehicle_params(params, CP, replay=True, debug=True) + np.testing.assert_allclose(sr, msg.vehicleParameters.steerRatio) + np.testing.assert_allclose(sf, msg.vehicleParameters.stiffnessFactor) + np.testing.assert_allclose(offset, msg.vehicleParameters.angleOffsetAverageDeg) + assert params.get("LiveParametersV2") is not None + + def test_read_saved_params_corrupted_old_format(self): + params = Params() + params.put("LiveParameters", {}) + params.remove("LiveParametersV2") + + migrate_cached_vehicle_params_if_needed(params) + assert params.get("LiveParameters") is None + assert params.get("LiveParametersV2") is None diff --git a/iqpilot/selfdrive/locationd/test/test_torqued.py b/iqpilot/selfdrive/locationd/test/test_torqued.py new file mode 100644 index 000000000..7ae743ca0 --- /dev/null +++ b/iqpilot/selfdrive/locationd/test/test_torqued.py @@ -0,0 +1,25 @@ +from iqpilot.cereal import car +from iqpilot.selfdrive.locationd.torqued import TorqueEstimator + + +def test_cal_percent(): + est = TorqueEstimator(car.CarParams()) + msg = est.get_msg() + assert msg.lateralTorqueParameters.calPerc == 0 + + for (low, high), min_pts in zip(est.filtered_points.buckets.keys(), + est.filtered_points.buckets_min_points.values(), strict=True): + for _ in range(int(min_pts)): + est.filtered_points.add_point((low + high) / 2.0, 0.0) + + # enough bucket points, but not enough total points + msg = est.get_msg() + assert msg.lateralTorqueParameters.calPerc == (len(est.filtered_points) / est.min_points_total * 100 + 100) / 2 + + # add enough points to bucket with most capacity + key = list(est.filtered_points.buckets)[0] + for _ in range(est.min_points_total - len(est.filtered_points)): + est.filtered_points.add_point((key[0] + key[1]) / 2.0, 0.0) + + msg = est.get_msg() + assert msg.lateralTorqueParameters.calPerc == 100 diff --git a/iqpilot/selfdrive/locationd/torqued.py b/iqpilot/selfdrive/locationd/torqued.py new file mode 100755 index 000000000..eab08828d --- /dev/null +++ b/iqpilot/selfdrive/locationd/torqued.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python3 +import numpy as np +from collections import deque, defaultdict + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car, log +from iqpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.locationd.helpers import PointBuckets, ParameterEstimator, PoseCalibrator, Pose + +HISTORY = 5 # secs +POINTS_PER_BUCKET = 1500 +MIN_POINTS_TOTAL = 4000 +MIN_POINTS_TOTAL_QLOG = 600 +FIT_POINTS_TOTAL = 2000 +FIT_POINTS_TOTAL_QLOG = 600 +MIN_VEL = 15 # m/s +FRICTION_FACTOR = 1.5 # ~85% of data coverage +FACTOR_SANITY = 0.3 +FACTOR_SANITY_QLOG = 0.5 +FRICTION_SANITY = 0.5 +FRICTION_SANITY_QLOG = 0.8 +STEER_MIN_THRESHOLD = 0.02 +MIN_FILTER_DECAY = 50 +MAX_FILTER_DECAY = 250 +LAT_ACC_THRESHOLD = 1 +STEER_BUCKET_BOUNDS = [(-0.5, -0.3), (-0.3, -0.2), (-0.2, -0.1), (-0.1, 0), (0, 0.1), (0.1, 0.2), (0.2, 0.3), (0.3, 0.5)] +MIN_BUCKET_POINTS = np.array([100, 300, 500, 500, 500, 500, 300, 100]) +MIN_ENGAGE_BUFFER = 2 # secs + +VERSION = 1 # bump this to invalidate old parameter caches + + +def slope2rot(slope): + sin = np.sqrt(slope ** 2 / (slope ** 2 + 1)) + cos = np.sqrt(1 / (slope ** 2 + 1)) + return np.array([[cos, -sin], [sin, cos]]) + + +class TorqueBuckets(PointBuckets): + def add_point(self, x, y): + for bound_min, bound_max in self.x_bounds: + if (x >= bound_min) and (x < bound_max): + self.buckets[(bound_min, bound_max)].append([x, 1.0, y]) + break + + +class TorqueEstimator(ParameterEstimator): + def __init__(self, CP, decimated=False, track_all_points=False): + ParameterEstimator.__init__(self) + self.CP = CP + self.hist_len = int(HISTORY / DT_MDL) + self.lag = 0.0 + self.track_all_points = track_all_points # for offline analysis, without max lateral accel or max steer torque filters + if decimated: + self.min_bucket_points = MIN_BUCKET_POINTS / 10 + self.min_points_total = MIN_POINTS_TOTAL_QLOG + self.fit_points = FIT_POINTS_TOTAL_QLOG + self.factor_sanity = FACTOR_SANITY_QLOG + self.friction_sanity = FRICTION_SANITY_QLOG + + else: + self.min_bucket_points = MIN_BUCKET_POINTS + self.min_points_total = MIN_POINTS_TOTAL + self.fit_points = FIT_POINTS_TOTAL + self.factor_sanity = FACTOR_SANITY + self.friction_sanity = FRICTION_SANITY + + self.offline_friction = 0.0 + self.offline_latAccelFactor = 0.0 + self.resets = 0.0 + self.use_params = CP.lateralTuning.which() == 'torque' + + if CP.lateralTuning.which() == 'torque': + self.offline_friction = CP.lateralTuning.torque.friction + self.offline_latAccelFactor = CP.lateralTuning.torque.latAccelFactor + + self.calibrator = PoseCalibrator() + + self.reset() + + initial_params = { + 'latAccelFactor': self.offline_latAccelFactor, + 'latAccelOffset': 0.0, + 'frictionCoefficient': self.offline_friction, + 'points': [] + } + self.decay = MIN_FILTER_DECAY + self.min_lataccel_factor = (1.0 - self.factor_sanity) * self.offline_latAccelFactor + self.max_lataccel_factor = (1.0 + self.factor_sanity) * self.offline_latAccelFactor + self.min_friction = (1.0 - self.friction_sanity) * self.offline_friction + self.max_friction = (1.0 + self.friction_sanity) * self.offline_friction + + # try to restore cached params + params = Params() + params_cache = params.get("CarParamsPrevRoute") + torque_cache = params.get("LiveTorqueParameters") + if params_cache is not None and torque_cache is not None: + try: + with log.Event.from_bytes(torque_cache) as log_evt: + cache_ltp = log_evt.lateralTorqueParameters + with car.CarParams.from_bytes(params_cache) as msg: + cache_CP = msg + if self.get_restore_key(cache_CP, cache_ltp.version) == self.get_restore_key(CP, VERSION): + if cache_ltp.valid: + initial_params = { + 'latAccelFactor': cache_ltp.latAccelFactorFiltered, + 'latAccelOffset': cache_ltp.latAccelOffsetFiltered, + 'frictionCoefficient': cache_ltp.frictionCoefficientFiltered + } + initial_params['points'] = cache_ltp.points + self.decay = cache_ltp.decay + self.filtered_points.load_points(initial_params['points']) + cloudlog.info("restored torque params from cache") + except Exception: + cloudlog.exception("failed to restore cached torque params") + params.remove("LiveTorqueParameters") + + self.filtered_params = {} + for param in initial_params: + self.filtered_params[param] = FirstOrderFilter(initial_params[param], self.decay, DT_MDL) + + @staticmethod + def get_restore_key(CP, version): + a, b = None, None + if CP.lateralTuning.which() == 'torque': + a = CP.lateralTuning.torque.friction + b = CP.lateralTuning.torque.latAccelFactor + return (CP.carFingerprint, CP.lateralTuning.which(), a, b, version) + + def reset(self): + self.resets += 1.0 + self.decay = MIN_FILTER_DECAY + self.raw_points = defaultdict(lambda: deque(maxlen=self.hist_len)) + self.filtered_points = TorqueBuckets(x_bounds=STEER_BUCKET_BOUNDS, + min_points=self.min_bucket_points, + min_points_total=self.min_points_total, + points_per_bucket=POINTS_PER_BUCKET, + rowsize=3) + self.all_torque_points = [] + + def estimate_params(self): + points = self.filtered_points.get_points(self.fit_points) + # total least square solution as both x and y are noisy observations + # this is empirically the slope of the hysteresis parallelogram as opposed to the line through the diagonals + try: + _, _, v = np.linalg.svd(points, full_matrices=False) + slope, offset = -v.T[0:2, 2] / v.T[2, 2] + _, spread = np.matmul(points[:, [0, 2]], slope2rot(slope)).T + friction_coeff = np.std(spread) * FRICTION_FACTOR + except np.linalg.LinAlgError as e: + cloudlog.exception(f"Error computing live torque params: {e}") + slope = offset = friction_coeff = np.nan + return slope, offset, friction_coeff + + def update_params(self, params): + self.decay = min(self.decay + DT_MDL, MAX_FILTER_DECAY) + for param, value in params.items(): + self.filtered_params[param].update(value) + self.filtered_params[param].update_alpha(self.decay) + + def handle_log(self, t, which, msg): + if which == "carControl": + self.raw_points["carControl_t"].append(t + self.lag) + self.raw_points["lat_active"].append(msg.latActive) + elif which == "carOutput": + self.raw_points["carOutput_t"].append(t + self.lag) + self.raw_points["steer_torque"].append(-msg.actuatorsOutput.torque) + elif which == "carState": + self.raw_points["carState_t"].append(t + self.lag) + # TODO: check if high aEgo affects resulting lateral accel + self.raw_points["vego"].append(msg.vEgo) + self.raw_points["steer_override"].append(msg.steeringPressed) + elif which == "extrinsicsCalibration": + self.calibrator.feed_live_calib(msg) + elif which == "lateralDelay": + self.lag = msg.lateralDelay + # calculate lateral accel from past steering torque + elif which == "deviceMotion": + if len(self.raw_points['steer_torque']) == self.hist_len: + device_pose = Pose.from_live_pose(msg) + calibrated_pose = self.calibrator.build_calibrated_pose(device_pose) + angular_velocity_calibrated = calibrated_pose.angular_velocity + + yaw_rate = angular_velocity_calibrated.yaw + roll = device_pose.orientation.roll + # check lat active up to now (without lag compensation) + lat_active = np.interp(np.arange(t - MIN_ENGAGE_BUFFER, t + self.lag, DT_MDL), + self.raw_points['carControl_t'], self.raw_points['lat_active']).astype(bool) + steer_override = np.interp(np.arange(t - MIN_ENGAGE_BUFFER, t + self.lag, DT_MDL), + self.raw_points['carState_t'], self.raw_points['steer_override']).astype(bool) + vego = np.interp(t, self.raw_points['carState_t'], self.raw_points['vego']) + steer = np.interp(t, self.raw_points['carOutput_t'], self.raw_points['steer_torque']).item() + lateral_acc = (vego * yaw_rate) - (np.sin(roll) * ACCELERATION_DUE_TO_GRAVITY).item() + if all(lat_active) and not any(steer_override) and (vego > MIN_VEL) and (abs(steer) > STEER_MIN_THRESHOLD): + if abs(lateral_acc) <= LAT_ACC_THRESHOLD: + self.filtered_points.add_point(steer, lateral_acc) + + if self.track_all_points: + self.all_torque_points.append([steer, lateral_acc]) + + def get_msg(self, valid=True, with_points=False): + msg = messaging.new_message('lateralTorqueParameters') + msg.valid = valid + lateralTorqueParameters = msg.lateralTorqueParameters + lateralTorqueParameters.version = VERSION + lateralTorqueParameters.useParams = self.use_params + + # Calculate raw estimates when possible, only update filters when enough points are gathered + if self.filtered_points.is_calculable(): + latAccelFactor, latAccelOffset, frictionCoeff = self.estimate_params() + lateralTorqueParameters.latAccelFactorRaw = float(latAccelFactor) + lateralTorqueParameters.latAccelOffsetRaw = float(latAccelOffset) + lateralTorqueParameters.frictionCoefficientRaw = float(frictionCoeff) + + if self.filtered_points.is_valid(): + if any(val is None or np.isnan(val) for val in [latAccelFactor, latAccelOffset, frictionCoeff]): + cloudlog.exception("Live torque parameters are invalid.") + lateralTorqueParameters.valid = False + self.reset() + else: + lateralTorqueParameters.valid = True + latAccelFactor = np.clip(latAccelFactor, self.min_lataccel_factor, self.max_lataccel_factor) + frictionCoeff = np.clip(frictionCoeff, self.min_friction, self.max_friction) + self.update_params({'latAccelFactor': latAccelFactor, 'latAccelOffset': latAccelOffset, 'frictionCoefficient': frictionCoeff}) + + if with_points: + lateralTorqueParameters.points = self.filtered_points.get_points()[:, [0, 2]].tolist() + + lateralTorqueParameters.latAccelFactorFiltered = float(self.filtered_params['latAccelFactor'].x) + lateralTorqueParameters.latAccelOffsetFiltered = float(self.filtered_params['latAccelOffset'].x) + lateralTorqueParameters.frictionCoefficientFiltered = float(self.filtered_params['frictionCoefficient'].x) + lateralTorqueParameters.totalBucketPoints = len(self.filtered_points) + lateralTorqueParameters.calPerc = self.filtered_points.get_valid_percent() + lateralTorqueParameters.decay = self.decay + lateralTorqueParameters.maxResets = self.resets + return msg diff --git a/iqpilot/selfdrive/longitudinal_settings.py b/iqpilot/selfdrive/longitudinal_settings.py new file mode 100644 index 000000000..9041f8b5a --- /dev/null +++ b/iqpilot/selfdrive/longitudinal_settings.py @@ -0,0 +1,80 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.cereal import log + + +LONGITUDINAL_MODE_STOCK = 0 +LONGITUDINAL_MODE_CHILL = 1 +LONGITUDINAL_MODE_DYNAMIC = 2 +LONGITUDINAL_MODE_PILOT = 3 + +PERSONALITY_AGGRESSIVE = log.LongitudinalPersonality.schema.enumerants["aggressive"] +PERSONALITY_STANDARD = log.LongitudinalPersonality.schema.enumerants["standard"] +PERSONALITY_RELAXED = log.LongitudinalPersonality.schema.enumerants["relaxed"] +PERSONALITY_VALUES = (PERSONALITY_AGGRESSIVE, PERSONALITY_STANDARD, PERSONALITY_RELAXED) + + +def get_longitudinal_mode(params) -> int: + if not params.get_bool("AlphaLongitudinalEnabled"): + return LONGITUDINAL_MODE_STOCK + if not params.get_bool("ExperimentalMode"): + return LONGITUDINAL_MODE_CHILL + return LONGITUDINAL_MODE_DYNAMIC if params.get_bool("IQDynamicMode") else LONGITUDINAL_MODE_PILOT + + +def get_valid_personality(params) -> int: + personality = params.get("LongitudinalPersonality", return_default=True) + if personality not in PERSONALITY_VALUES: + personality = min(max(personality, PERSONALITY_AGGRESSIVE), PERSONALITY_RELAXED) + params.put("LongitudinalPersonality", personality) + return personality + + +def set_valid_personality(params, personality: int) -> None: + if personality not in PERSONALITY_VALUES: + raise ValueError(f"invalid longitudinal personality: {personality}") + params.put("LongitudinalPersonality", personality) + + +def apply_longitudinal_mode(params, mode: int) -> None: + if mode == LONGITUDINAL_MODE_STOCK: + params.put_bool("AlphaLongitudinalEnabled", False) + params.put_bool("ExperimentalMode", False) + params.put_bool("IQDynamicMode", False) + elif mode == LONGITUDINAL_MODE_CHILL: + params.put_bool("AlphaLongitudinalEnabled", True) + params.put_bool("ExperimentalMode", False) + params.put_bool("IQDynamicMode", False) + set_valid_personality(params, PERSONALITY_RELAXED) + elif mode == LONGITUDINAL_MODE_DYNAMIC: + params.put_bool("AlphaLongitudinalEnabled", True) + params.put_bool("ExperimentalMode", True) + params.put_bool("IQDynamicMode", True) + elif mode == LONGITUDINAL_MODE_PILOT: + params.put_bool("AlphaLongitudinalEnabled", True) + params.put_bool("ExperimentalMode", True) + params.put_bool("IQDynamicMode", False) + else: + raise ValueError(f"invalid longitudinal mode: {mode}") + + +def get_follow_distance_state(params) -> tuple[int | None, bool]: + mode = get_longitudinal_mode(params) + if mode == LONGITUDINAL_MODE_STOCK: + get_valid_personality(params) + return None, False + if mode == LONGITUDINAL_MODE_CHILL: + if get_valid_personality(params) != PERSONALITY_RELAXED: + set_valid_personality(params, PERSONALITY_RELAXED) + return PERSONALITY_RELAXED, False + return get_valid_personality(params), True + + +def get_runtime_personality(params) -> int: + if get_longitudinal_mode(params) == LONGITUDINAL_MODE_CHILL: + if get_valid_personality(params) != PERSONALITY_RELAXED: + set_valid_personality(params, PERSONALITY_RELAXED) + return PERSONALITY_RELAXED + return get_valid_personality(params) diff --git a/iqpilot/selfdrive/monitoring/README.md b/iqpilot/selfdrive/monitoring/README.md new file mode 100644 index 000000000..2a29ea06b --- /dev/null +++ b/iqpilot/selfdrive/monitoring/README.md @@ -0,0 +1,15 @@ +# driver monitoring (DM) + +Uploading driver-facing camera footage is opt-in, but it is encouraged to opt-in to improve the DM model. You can always change your preference using the "Record and Upload Driver Camera" toggle. + +## Troubleshooting + +Before creating a bug report, go through these troubleshooting steps. + +* Ensure the driver-facing camera has a good view of the driver in normal driving positions. + * This can be checked in Settings -> Device -> Preview Driver Camera (when car is off). +* If the camera can't see the driver, the device should be re-mounted. + +## Bug report + +In order for us to look into DM bug reports, we'll need the driver-facing camera footage. If you don't normally have this enabled, simply enable the toggle for a single drive. Also ensure the "Upload Raw Logs" toggle is enabled before going for a drive. diff --git a/iqpilot/selfdrive/monitoring/dmonitoringd.py b/iqpilot/selfdrive/monitoring/dmonitoringd.py new file mode 100755 index 000000000..16a686dec --- /dev/null +++ b/iqpilot/selfdrive/monitoring/dmonitoringd.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +import iqpilot.cereal.messaging as messaging +from iqpilot.common.params import Params +from iqpilot.common.realtime import config_realtime_process +from iqpilot.selfdrive.monitoring.helpers import DriverMonitoring + + +def dmonitoringd_thread(): + config_realtime_process([0, 1, 2, 3], 5) + + params = Params() + pm = messaging.PubMaster(['driverMonitoringState']) + sm = messaging.SubMaster(['driverStateV2', 'extrinsicsCalibration', 'carState', 'selfdriveState', 'modelV2', + 'carControl'], poll='driverStateV2') + + DM = DriverMonitoring(rhd_saved=params.get_bool("IsRhdDetected"), always_on=params.get_bool("AlwaysOnDM"), + force_rhd=params.get_bool("ForceRHDForBSM")) + demo_mode=False + + # 20Hz <- dmonitoringmodeld + while True: + sm.update() + if not sm.updated['driverStateV2']: + # iterate when model has new output + continue + + valid = sm.all_checks() + if demo_mode and sm.valid['driverStateV2']: + DM.run_step(sm, demo=demo_mode) + elif valid: + DM.run_step(sm, demo=demo_mode) + + # publish + dat = DM.get_state_packet(valid=valid) + pm.send('driverMonitoringState', dat) + + # load live always-on toggle + if sm['driverStateV2'].frameId % 40 == 1: + DM.always_on = params.get_bool("AlwaysOnDM") + DM.force_rhd = params.get_bool("ForceRHDForBSM") + demo_mode = params.get_bool("IsDriverViewEnabled") + + # save rhd virtual toggle every 5 mins + if (sm['driverStateV2'].frameId % 6000 == 0 and not demo_mode and not DM.force_rhd and + DM.wheelpos.prob_offseter.filtered_stat.n > DM.settings._WHEELPOS_FILTER_MIN_COUNT and + DM.wheel_on_right == (DM.wheelpos.prob_offseter.filtered_stat.M > DM.settings._WHEELPOS_THRESHOLD)): + params.put_bool_nonblocking("IsRhdDetected", DM.wheel_on_right) + +def main(): + dmonitoringd_thread() + + +if __name__ == '__main__': + main() diff --git a/iqpilot/selfdrive/monitoring/helpers.py b/iqpilot/selfdrive/monitoring/helpers.py new file mode 100644 index 000000000..46a5b612e --- /dev/null +++ b/iqpilot/selfdrive/monitoring/helpers.py @@ -0,0 +1,477 @@ +from math import atan2 +import numpy as np + +from iqpilot.cereal import car, log +import iqpilot.cereal.messaging as messaging +from iqpilot.selfdrive.selfdrived.events import Events +from iqpilot.common.realtime import DT_DMON +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.params import Params +from iqpilot.common.stat_live import RunningStatFilter +from iqpilot.common.transformations.camera import DEVICE_CAMERAS +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy +from iqpilot.system.hardware import HARDWARE + +EventName = log.OnroadEvent.EventName + +# ****************************************************************************************** +# NOTE: To fork maintainers. +# Disabling or nerfing safety features will get you and your users banned from our servers. +# We recommend that you do not change these numbers from the defaults. +# ****************************************************************************************** + +class DRIVER_MONITOR_SETTINGS: + def __init__(self, device_type): + self._DT_DMON = DT_DMON + # ref (page15-16): https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:42018X1947&rid=2 + self._AWARENESS_TIME = 30. # passive wheeltouch total timeout + self._AWARENESS_PRE_TIME_TILL_TERMINAL = 15. + self._AWARENESS_PROMPT_TIME_TILL_TERMINAL = 6. + self._DISTRACTED_TIME = 11. # active monitoring total timeout + self._DISTRACTED_PRE_TIME_TILL_TERMINAL = 8. + self._DISTRACTED_PROMPT_TIME_TILL_TERMINAL = 6. + + self._FACE_THRESHOLD = 0.7 + self._EYE_THRESHOLD = 0.65 + self._SG_THRESHOLD = 0.9 + self._BLINK_THRESHOLD = 0.865 + + self._PHONE_THRESH = 0.75 if device_type == 'mici' else 0.4 + self._PHONE_THRESH2 = 15.0 + self._PHONE_MAX_OFFSET = 0.06 + self._PHONE_MIN_OFFSET = 0.025 + self._PHONE_DATA_AVG = 0.05 + self._PHONE_DATA_VAR = 3*0.005 + self._PHONE_MAX_COUNT = int(360 / self._DT_DMON) + + self._POSE_PITCH_THRESHOLD = 0.3133 + self._POSE_PITCH_THRESHOLD_SLACK = 0.3237 + self._POSE_PITCH_THRESHOLD_STRICT = self._POSE_PITCH_THRESHOLD + self._POSE_YAW_THRESHOLD = 0.4020 + self._POSE_YAW_THRESHOLD_SLACK = 0.5042 + self._POSE_YAW_THRESHOLD_STRICT = self._POSE_YAW_THRESHOLD + self._PITCH_NATURAL_OFFSET = 0.011 # initial value before offset is learned + self._PITCH_NATURAL_THRESHOLD = 0.449 + self._YAW_NATURAL_OFFSET = 0.075 # initial value before offset is learned + self._PITCH_NATURAL_VAR = 3*0.01 + self._YAW_NATURAL_VAR = 3*0.05 + self._PITCH_MAX_OFFSET = 0.124 + self._PITCH_MIN_OFFSET = -0.0881 + self._YAW_MAX_OFFSET = 0.289 + self._YAW_MIN_OFFSET = -0.0246 + + self._DCAM_UNCERTAIN_ALERT_THRESHOLD = 0.1 + self._DCAM_UNCERTAIN_RESET_COUNT = int(20 / self._DT_DMON) + self._POSESTD_THRESHOLD = 0.3 + self._HI_STD_FALLBACK_TIME = int(10 / self._DT_DMON) # fall back to wheel touch if model is uncertain for 10s + self._DISTRACTED_FILTER_TS = 0.25 # 0.6Hz + self._ALWAYS_ON_ALERT_MIN_SPEED = 11 + + self._POSE_CALIB_MIN_SPEED = 13 # 30 mph + self._POSE_OFFSET_MIN_COUNT = int(60 / self._DT_DMON) # valid data counts before calibration completes, 1min cumulative + self._POSE_OFFSET_MAX_COUNT = int(360 / self._DT_DMON) # stop deweighting new data after 6 min, aka "short term memory" + + self._WHEELPOS_CALIB_MIN_SPEED = 11 + self._WHEELPOS_THRESHOLD = 0.5 + self._WHEELPOS_FILTER_MIN_COUNT = int(15 / self._DT_DMON) # allow 15 seconds to converge wheel side + self._WHEELPOS_DATA_AVG = 0.03 + self._WHEELPOS_DATA_VAR = 3*5.5e-5 + self._WHEELPOS_MAX_COUNT = -1 + + self._RECOVERY_FACTOR_MAX = 5. # relative to minus step change + self._RECOVERY_FACTOR_MIN = 1.25 # relative to minus step change + + self._MAX_TERMINAL_ALERTS = 3 # not allowed to engage after 3 terminal alerts + self._MAX_TERMINAL_DURATION = int(30 / self._DT_DMON) # not allowed to engage after 30s of terminal alerts + +class DistractedType: + + NOT_DISTRACTED = 0 + DISTRACTED_POSE = 1 << 0 + DISTRACTED_BLINK = 1 << 1 + DISTRACTED_PHONE = 1 << 2 + +class DriverPose: + def __init__(self, settings): + pitch_filter_raw_priors = (settings._PITCH_NATURAL_OFFSET, settings._PITCH_NATURAL_VAR, 2) + yaw_filter_raw_priors = (settings._YAW_NATURAL_OFFSET, settings._YAW_NATURAL_VAR, 2) + self.yaw = 0. + self.pitch = 0. + self.roll = 0. + self.yaw_std = 0. + self.pitch_std = 0. + self.roll_std = 0. + self.pitch_offseter = RunningStatFilter(raw_priors=pitch_filter_raw_priors, max_trackable=settings._POSE_OFFSET_MAX_COUNT) + self.yaw_offseter = RunningStatFilter(raw_priors=yaw_filter_raw_priors, max_trackable=settings._POSE_OFFSET_MAX_COUNT) + self.calibrated = False + self.low_std = True + self.cfactor_pitch = 1. + self.cfactor_yaw = 1. + +class DriverProb: + def __init__(self, raw_priors, max_trackable): + self.prob = 0. + self.prob_offseter = RunningStatFilter(raw_priors=raw_priors, max_trackable=max_trackable) + self.prob_calibrated = False + +class DriverBlink: + def __init__(self): + self.left = 0. + self.right = 0. + + +# model output refers to center of undistorted+leveled image +EFL = 598.0 # focal length in K +cam = DEVICE_CAMERAS[("tici", "ar0231")] # corrected image has same size as raw +W, H = (cam.dcam.width, cam.dcam.height) # corrected image has same size as raw + +def face_orientation_from_net(angles_desc, pos_desc, rpy_calib): + # the output of these angles are in device frame + # so from driver's perspective, pitch is up and yaw is right + + pitch_net, yaw_net, roll_net = angles_desc + + face_pixel_position = ((pos_desc[0]+0.5)*W, (pos_desc[1]+0.5)*H) + yaw_focal_angle = atan2(face_pixel_position[0] - W//2, EFL) + pitch_focal_angle = atan2(face_pixel_position[1] - H//2, EFL) + + pitch = pitch_net + pitch_focal_angle + yaw = -yaw_net + yaw_focal_angle + + # no calib for roll + pitch -= rpy_calib[1] + yaw -= rpy_calib[2] + return roll_net, pitch, yaw + + +class DriverMonitoring: + def __init__(self, rhd_saved=False, settings=None, always_on=False, force_rhd=False): + # init policy settings + self.settings = settings if settings is not None else DRIVER_MONITOR_SETTINGS(device_type=HARDWARE.get_device_type()) + + # init driver status + wheelpos_filter_raw_priors = (self.settings._WHEELPOS_DATA_AVG, self.settings._WHEELPOS_DATA_VAR, 2) + phone_filter_raw_priors = (self.settings._PHONE_DATA_AVG, self.settings._PHONE_DATA_VAR, 2) + self.wheelpos = DriverProb(raw_priors=wheelpos_filter_raw_priors, max_trackable=self.settings._WHEELPOS_MAX_COUNT) + self.phone = DriverProb(raw_priors=phone_filter_raw_priors, max_trackable=self.settings._PHONE_MAX_COUNT) + self.pose = DriverPose(settings=self.settings) + self.blink = DriverBlink() + + self.always_on = always_on + self.force_rhd = force_rhd + self.distracted_types = [] + self.driver_distracted = False + self.driver_distraction_filter = FirstOrderFilter(0., self.settings._DISTRACTED_FILTER_TS, self.settings._DT_DMON) + self.wheel_on_right = False + self.wheel_on_right_last = None + self.wheel_on_right_default = rhd_saved + self.face_detected = False + self.terminal_alert_cnt = 0 + self.terminal_time = 0 + self.step_change = 0. + self.active_monitoring_mode = True + self.is_model_uncertain = False + self.hi_stds = 0 + self.threshold_pre = self.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL / self.settings._DISTRACTED_TIME + self.threshold_prompt = self.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL / self.settings._DISTRACTED_TIME + self.dcam_uncertain_cnt = 0 + self.dcam_reset_cnt = 0 + + self.params = Params() + self.too_distracted = self.params.get_bool("DriverTooDistracted") + + self._reset_awareness() + self._set_timers(active_monitoring=True) + self._reset_events() + + def _reset_awareness(self): + self.awareness = 1. + self.awareness_active = 1. + self.awareness_passive = 1. + + def _reset_events(self): + self.current_events = Events() + + def _set_timers(self, active_monitoring): + if self.active_monitoring_mode and self.awareness <= self.threshold_prompt: + if active_monitoring: + self.step_change = self.settings._DT_DMON / self.settings._DISTRACTED_TIME + else: + self.step_change = 0. + return # no exploit after orange alert + elif self.awareness <= 0.: + return + + if active_monitoring: + # when falling back from passive mode to active mode, reset awareness to avoid false alert + if not self.active_monitoring_mode: + self.awareness_passive = self.awareness + self.awareness = self.awareness_active + + self.threshold_pre = self.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL / self.settings._DISTRACTED_TIME + self.threshold_prompt = self.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL / self.settings._DISTRACTED_TIME + self.step_change = self.settings._DT_DMON / self.settings._DISTRACTED_TIME + self.active_monitoring_mode = True + else: + if self.active_monitoring_mode: + self.awareness_active = self.awareness + self.awareness = self.awareness_passive + + self.threshold_pre = self.settings._AWARENESS_PRE_TIME_TILL_TERMINAL / self.settings._AWARENESS_TIME + self.threshold_prompt = self.settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL / self.settings._AWARENESS_TIME + self.step_change = self.settings._DT_DMON / self.settings._AWARENESS_TIME + self.active_monitoring_mode = False + + def _set_policy(self, brake_disengage_prob, car_speed): + bp = brake_disengage_prob + k1 = max(-0.00156*((car_speed-16)**2)+0.6, 0.2) + bp_normal = max(min(bp / k1, 0.5),0) + self.pose.cfactor_pitch = np.interp(bp_normal, [0, 0.5], + [self.settings._POSE_PITCH_THRESHOLD_SLACK, + self.settings._POSE_PITCH_THRESHOLD_STRICT]) / self.settings._POSE_PITCH_THRESHOLD + self.pose.cfactor_yaw = np.interp(bp_normal, [0, 0.5], + [self.settings._POSE_YAW_THRESHOLD_SLACK, + self.settings._POSE_YAW_THRESHOLD_STRICT]) / self.settings._POSE_YAW_THRESHOLD + + def _get_distracted_types(self): + distracted_types = [] + + if not self.pose.calibrated: + pitch_error = self.pose.pitch - self.settings._PITCH_NATURAL_OFFSET + yaw_error = self.pose.yaw - self.settings._YAW_NATURAL_OFFSET + else: + pitch_error = self.pose.pitch - min(max(self.pose.pitch_offseter.filtered_stat.mean(), + self.settings._PITCH_MIN_OFFSET), self.settings._PITCH_MAX_OFFSET) + yaw_error = self.pose.yaw - min(max(self.pose.yaw_offseter.filtered_stat.mean(), + self.settings._YAW_MIN_OFFSET), self.settings._YAW_MAX_OFFSET) + pitch_error = 0 if pitch_error > 0 else abs(pitch_error) # no positive pitch limit + yaw_error = abs(yaw_error) + + pitch_threshold = self.settings._POSE_PITCH_THRESHOLD * self.pose.cfactor_pitch if self.pose.calibrated else self.settings._PITCH_NATURAL_THRESHOLD + yaw_threshold = self.settings._POSE_YAW_THRESHOLD * self.pose.cfactor_yaw + + if pitch_error > pitch_threshold or yaw_error > yaw_threshold: + distracted_types.append(DistractedType.DISTRACTED_POSE) + + if (self.blink.left + self.blink.right)*0.5 > self.settings._BLINK_THRESHOLD: + distracted_types.append(DistractedType.DISTRACTED_BLINK) + + if self.phone.prob_calibrated: + using_phone = self.phone.prob > max(min(self.phone.prob_offseter.filtered_stat.M, self.settings._PHONE_MAX_OFFSET), self.settings._PHONE_MIN_OFFSET) \ + * self.settings._PHONE_THRESH2 + else: + using_phone = self.phone.prob > self.settings._PHONE_THRESH + if using_phone: + distracted_types.append(DistractedType.DISTRACTED_PHONE) + + return distracted_types + + def _update_states(self, driver_state, cal_rpy, car_speed, op_engaged, standstill, demo_mode=False): + rhd_pred = driver_state.wheelOnRightProb + # calibrates only when there's movement and either face detected + if not self.force_rhd and car_speed > self.settings._WHEELPOS_CALIB_MIN_SPEED and (driver_state.leftDriverData.faceProb > self.settings._FACE_THRESHOLD or + driver_state.rightDriverData.faceProb > self.settings._FACE_THRESHOLD): + self.wheelpos.prob_offseter.push_and_update(rhd_pred) + + self.wheelpos.prob_calibrated = self.wheelpos.prob_offseter.filtered_stat.n > self.settings._WHEELPOS_FILTER_MIN_COUNT + + if self.force_rhd: + self.wheel_on_right = True + elif self.wheelpos.prob_calibrated or demo_mode: + self.wheel_on_right = self.wheelpos.prob_offseter.filtered_stat.M > self.settings._WHEELPOS_THRESHOLD + else: + self.wheel_on_right = self.wheel_on_right_default # use default/saved if calibration is unfinished + # make sure no switching when engaged + if not self.force_rhd and op_engaged and self.wheel_on_right_last is not None and self.wheel_on_right_last != self.wheel_on_right and not demo_mode: + self.wheel_on_right = self.wheel_on_right_last + driver_data = driver_state.rightDriverData if self.wheel_on_right else driver_state.leftDriverData + if not all(len(x) > 0 for x in (driver_data.faceOrientation, driver_data.facePosition, + driver_data.faceOrientationStd, driver_data.facePositionStd)): + return + + self.face_detected = driver_data.faceProb > self.settings._FACE_THRESHOLD + self.pose.roll, self.pose.pitch, self.pose.yaw = face_orientation_from_net(driver_data.faceOrientation, driver_data.facePosition, cal_rpy) + if self.wheel_on_right: + self.pose.yaw *= -1 + self.wheel_on_right_last = self.wheel_on_right + self.pose.pitch_std = driver_data.faceOrientationStd[0] + self.pose.yaw_std = driver_data.faceOrientationStd[1] + model_std_max = max(self.pose.pitch_std, self.pose.yaw_std) + self.pose.low_std = model_std_max < self.settings._POSESTD_THRESHOLD + self.blink.left = driver_data.leftBlinkProb * (driver_data.leftEyeProb > self.settings._EYE_THRESHOLD) \ + * (driver_data.sunglassesProb < self.settings._SG_THRESHOLD) + self.blink.right = driver_data.rightBlinkProb * (driver_data.rightEyeProb > self.settings._EYE_THRESHOLD) \ + * (driver_data.sunglassesProb < self.settings._SG_THRESHOLD) + self.phone.prob = driver_data.phoneProb + + self.distracted_types = self._get_distracted_types() + self.driver_distracted = (DistractedType.DISTRACTED_PHONE in self.distracted_types + or DistractedType.DISTRACTED_POSE in self.distracted_types + or DistractedType.DISTRACTED_BLINK in self.distracted_types) \ + and driver_data.faceProb > self.settings._FACE_THRESHOLD and self.pose.low_std + self.driver_distraction_filter.update(self.driver_distracted) + + # update offseter + # only update when driver is actively driving the car above a certain speed + if self.face_detected and car_speed > self.settings._POSE_CALIB_MIN_SPEED and self.pose.low_std and (not op_engaged or not self.driver_distracted): + self.pose.pitch_offseter.push_and_update(self.pose.pitch) + self.pose.yaw_offseter.push_and_update(self.pose.yaw) + self.phone.prob_offseter.push_and_update(self.phone.prob) + + self.pose.calibrated = self.pose.pitch_offseter.filtered_stat.n > self.settings._POSE_OFFSET_MIN_COUNT and \ + self.pose.yaw_offseter.filtered_stat.n > self.settings._POSE_OFFSET_MIN_COUNT + self.phone.prob_calibrated = self.phone.prob_offseter.filtered_stat.n > self.settings._POSE_OFFSET_MIN_COUNT + + if self.face_detected and not self.driver_distracted: + if model_std_max > self.settings._DCAM_UNCERTAIN_ALERT_THRESHOLD: + if not standstill: + self.dcam_uncertain_cnt += 1 + self.dcam_reset_cnt = 0 + else: + self.dcam_reset_cnt += 1 + if self.dcam_reset_cnt > self.settings._DCAM_UNCERTAIN_RESET_COUNT: + self.dcam_uncertain_cnt = 0 + + self.is_model_uncertain = self.hi_stds > self.settings._HI_STD_FALLBACK_TIME + self._set_timers(self.face_detected and not self.is_model_uncertain) + if self.face_detected and not self.pose.low_std and not self.driver_distracted: + self.hi_stds += 1 + elif self.face_detected and self.pose.low_std: + self.hi_stds = 0 + + def _update_events(self, driver_engaged, op_engaged, standstill, wrong_gear, car_speed): + self._reset_events() + # Block engaging until ignition cycle after max number or time of distractions + if self.terminal_alert_cnt >= self.settings._MAX_TERMINAL_ALERTS or \ + self.terminal_time >= self.settings._MAX_TERMINAL_DURATION: + if not self.too_distracted: + self.params.put_bool_nonblocking("DriverTooDistracted", True) + self.too_distracted = True + + # Always-on distraction lockout is temporary + if self.too_distracted or (self.always_on and self.awareness <= self.threshold_prompt): + self.current_events.add(EventName.tooDistracted) + + always_on_valid = self.always_on and not wrong_gear + if (driver_engaged and self.awareness > 0 and not self.active_monitoring_mode) or \ + (not always_on_valid and not op_engaged) or \ + (always_on_valid and not op_engaged and self.awareness <= 0): + # always reset on disengage with normal mode; disengage resets only on red if always on + self._reset_awareness() + return + + driver_attentive = self.driver_distraction_filter.x < 0.37 + awareness_prev = self.awareness + + if (driver_attentive and self.face_detected and self.pose.low_std and self.awareness > 0): + if driver_engaged: + self._reset_awareness() + return + # only restore awareness when paying attention and alert is not red + self.awareness = min(self.awareness + ((self.settings._RECOVERY_FACTOR_MAX-self.settings._RECOVERY_FACTOR_MIN)* + (1.-self.awareness)+self.settings._RECOVERY_FACTOR_MIN)*self.step_change, 1.) + if self.awareness == 1.: + self.awareness_passive = min(self.awareness_passive + self.step_change, 1.) + # don't display alert banner when awareness is recovering and has cleared orange + if self.awareness > self.threshold_prompt: + return + + _reaching_audible = self.awareness - self.step_change <= self.threshold_prompt + _reaching_terminal = self.awareness - self.step_change <= 0 + standstill_orange_exemption = standstill and _reaching_audible + always_on_red_exemption = always_on_valid and not op_engaged and _reaching_terminal + always_on_lowspeed_exemption = always_on_valid and not op_engaged and car_speed < self.settings._ALWAYS_ON_ALERT_MIN_SPEED + + certainly_distracted = self.driver_distraction_filter.x > 0.63 and self.driver_distracted and self.face_detected + maybe_distracted = self.hi_stds > self.settings._HI_STD_FALLBACK_TIME or not self.face_detected + + if certainly_distracted or maybe_distracted: + # should always be counting if distracted unless at standstill (lowspeed for always-on) and reaching orange + # also will not be reaching 0 if DM is active when not engaged + if not (standstill_orange_exemption or always_on_red_exemption or (always_on_lowspeed_exemption and _reaching_audible)): + self.awareness = max(self.awareness - self.step_change, -0.1) + + alert = None + if self.awareness <= 0.: + # terminal red alert: disengagement required + alert = EventName.driverDistracted if self.active_monitoring_mode else EventName.driverUnresponsive + self.terminal_time += 1 + if awareness_prev > 0.: + self.terminal_alert_cnt += 1 + elif self.awareness <= self.threshold_prompt: + # prompt orange alert + alert = EventName.promptDriverDistracted if self.active_monitoring_mode else EventName.promptDriverUnresponsive + elif self.awareness <= self.threshold_pre and not always_on_lowspeed_exemption: + # pre green alert + alert = EventName.preDriverDistracted if self.active_monitoring_mode else EventName.preDriverUnresponsive + + if alert is not None: + self.current_events.add(alert) + + def get_state_packet(self, valid=True): + # build driverMonitoringState packet + dat = messaging.new_message('driverMonitoringState', valid=valid) + dat.driverMonitoringState = { + "events": self.current_events.to_msg(), + "faceDetected": self.face_detected, + "isDistracted": self.driver_distracted, + "distractedType": sum(self.distracted_types), + "awarenessStatus": self.awareness, + "posePitchOffset": self.pose.pitch_offseter.filtered_stat.mean(), + "posePitchValidCount": self.pose.pitch_offseter.filtered_stat.n, + "poseYawOffset": self.pose.yaw_offseter.filtered_stat.mean(), + "poseYawValidCount": self.pose.yaw_offseter.filtered_stat.n, + "phoneProbOffset": self.phone.prob_offseter.filtered_stat.mean(), + "phoneProbValidCount": self.phone.prob_offseter.filtered_stat.n, + "stepChange": self.step_change, + "awarenessActive": self.awareness_active, + "awarenessPassive": self.awareness_passive, + "isLowStd": self.pose.low_std, + "hiStdCount": self.hi_stds, + "isActiveMode": self.active_monitoring_mode, + "isRHD": self.wheel_on_right, + "uncertainCount": self.dcam_uncertain_cnt, + } + return dat + + def run_step(self, sm, demo=False): + if demo: + highway_speed = 30 + enabled = True + wrong_gear = False + standstill = False + driver_engaged = False + brake_disengage_prob = 1.0 + rpyCalib = [0., 0., 0.] + else: + highway_speed = sm['carState'].vEgo + enabled = sm['selfdriveState'].enabled or sm['carControl'].latActive + wrong_gear = sm['carState'].gearShifter not in (car.CarState.GearShifter.drive, car.CarState.GearShifter.low) + standstill = sm['carState'].standstill + driver_engaged = sm['carState'].steeringPressed or sm['carState'].gasPressed + brake_disengage_prob = sm['modelV2'].meta.disengagePredictions.brakeDisengageProbs[0] # brake disengage prob in next 2s + calib_rpy = get_calibrated_rpy(sm['extrinsicsCalibration']) + rpyCalib = calib_rpy.tolist() if calib_rpy is not None else [0., 0., 0.] + self._set_policy( + brake_disengage_prob=brake_disengage_prob, + car_speed=highway_speed, + ) + + # Parse data from dmonitoringmodeld + self._update_states( + driver_state=sm['driverStateV2'], + cal_rpy=rpyCalib, + car_speed=highway_speed, + op_engaged=enabled, + standstill=standstill, + demo_mode=demo, + ) + + # Update distraction events + self._update_events( + driver_engaged=driver_engaged, + op_engaged=enabled, + standstill=standstill, + wrong_gear=wrong_gear, + car_speed=highway_speed + ) diff --git a/iqpilot/selfdrive/monitoring/test_monitoring.py b/iqpilot/selfdrive/monitoring/test_monitoring.py new file mode 100644 index 000000000..606d2f60b --- /dev/null +++ b/iqpilot/selfdrive/monitoring/test_monitoring.py @@ -0,0 +1,342 @@ +import numpy as np +import pytest + +from iqpilot.cereal import log, car +from iqpilot.common.realtime import DT_DMON +from iqpilot.selfdrive.monitoring.helpers import DriverMonitoring, DRIVER_MONITOR_SETTINGS +from iqpilot.system.hardware import HARDWARE + +EventName = log.OnroadEvent.EventName +dm_settings = DRIVER_MONITOR_SETTINGS(device_type=HARDWARE.get_device_type()) + +TEST_TIMESPAN = 120 # seconds +DISTRACTED_SECONDS_TO_ORANGE = dm_settings._DISTRACTED_TIME - dm_settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL + 1 +DISTRACTED_SECONDS_TO_RED = dm_settings._DISTRACTED_TIME + 1 +INVISIBLE_SECONDS_TO_ORANGE = dm_settings._AWARENESS_TIME - dm_settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL + 1 +INVISIBLE_SECONDS_TO_RED = dm_settings._AWARENESS_TIME + 1 + +def make_msg(face_detected, distracted=False, model_uncertain=False): + ds = log.DriverStateV2.new_message() + ds.leftDriverData.faceOrientation = [0., 0., 0.] + ds.leftDriverData.facePosition = [0., 0.] + ds.leftDriverData.faceProb = 1. * face_detected + ds.leftDriverData.leftEyeProb = 1. + ds.leftDriverData.rightEyeProb = 1. + ds.leftDriverData.leftBlinkProb = 1. * distracted + ds.leftDriverData.rightBlinkProb = 1. * distracted + ds.leftDriverData.faceOrientationStd = [1.*model_uncertain, 1.*model_uncertain, 1.*model_uncertain] + ds.leftDriverData.facePositionStd = [1.*model_uncertain, 1.*model_uncertain] + # TODO: test both separately when e2e is used + ds.leftDriverData.phoneProb = 0. + return ds + + +def set_driver_data(data, face_prob=1.0, phone_prob=0.0): + data.faceOrientation = [0., 0., 0.] + data.facePosition = [0., 0.] + data.faceProb = face_prob + data.leftEyeProb = 1. + data.rightEyeProb = 1. + data.leftBlinkProb = 0. + data.rightBlinkProb = 0. + data.faceOrientationStd = [0., 0., 0.] + data.facePositionStd = [0., 0.] + data.phoneProb = phone_prob + + +# driver state from neural net, 10Hz +msg_NO_FACE_DETECTED = make_msg(False) +msg_ATTENTIVE = make_msg(True) +msg_DISTRACTED = make_msg(True, distracted=True) +msg_ATTENTIVE_UNCERTAIN = make_msg(True, model_uncertain=True) +msg_DISTRACTED_UNCERTAIN = make_msg(True, distracted=True, model_uncertain=True) +msg_DISTRACTED_BUT_SOMEHOW_UNCERTAIN = make_msg(True, distracted=True, model_uncertain=dm_settings._POSESTD_THRESHOLD*1.5) + +# driver interaction with car +car_interaction_DETECTED = True +car_interaction_NOT_DETECTED = False + +# some common state vectors +always_no_face = [msg_NO_FACE_DETECTED] * int(TEST_TIMESPAN / DT_DMON) +always_attentive = [msg_ATTENTIVE] * int(TEST_TIMESPAN / DT_DMON) +always_distracted = [msg_DISTRACTED] * int(TEST_TIMESPAN / DT_DMON) +always_true = [True] * int(TEST_TIMESPAN / DT_DMON) +always_false = [False] * int(TEST_TIMESPAN / DT_DMON) + +class TestMonitoring: + def _run_seq(self, msgs, interaction, engaged, standstill): + DM = DriverMonitoring() + events = [] + for idx in range(len(msgs)): + DM._update_states(msgs[idx], [0, 0, 0], 0, engaged[idx], standstill[idx]) + # cal_rpy and car_speed don't matter here + + # evaluate events at 10Hz for tests + DM._update_events(interaction[idx], engaged[idx], standstill[idx], 0, 0) + events.append(DM.current_events) + assert len(events) == len(msgs), f"got {len(events)} for {len(msgs)} driverState input msgs" + return events, DM + + def _assert_no_events(self, events): + assert all(not len(e) for e in events) + + # engaged, driver is attentive all the time + def test_fully_aware_driver(self): + events, _ = self._run_seq(always_attentive, always_false, always_true, always_false) + self._assert_no_events(events) + + # engaged, driver is distracted and does nothing + def test_fully_distracted_driver(self): + events, d_status = self._run_seq(always_distracted, always_false, always_true, always_false) + assert len(events[int((d_status.settings._DISTRACTED_TIME-d_status.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL)/2/DT_DMON)]) == 0 + assert events[int((d_status.settings._DISTRACTED_TIME-d_status.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL + \ + ((d_status.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL-d_status.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == \ + EventName.preDriverDistracted + assert events[int((d_status.settings._DISTRACTED_TIME-d_status.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL + \ + ((d_status.settings._DISTRACTED_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == EventName.promptDriverDistracted + assert events[int((d_status.settings._DISTRACTED_TIME + \ + ((TEST_TIMESPAN-10-d_status.settings._DISTRACTED_TIME)/2))/DT_DMON)].names[0] == EventName.driverDistracted + assert isinstance(d_status.awareness, float) + + # engaged, no face detected the whole time, no action + def test_fully_invisible_driver(self): + events, d_status = self._run_seq(always_no_face, always_false, always_true, always_false) + assert len(events[int((d_status.settings._AWARENESS_TIME-d_status.settings._AWARENESS_PRE_TIME_TILL_TERMINAL)/2/DT_DMON)]) == 0 + assert events[int((d_status.settings._AWARENESS_TIME-d_status.settings._AWARENESS_PRE_TIME_TILL_TERMINAL + \ + ((d_status.settings._AWARENESS_PRE_TIME_TILL_TERMINAL-d_status.settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == \ + EventName.preDriverUnresponsive + assert events[int((d_status.settings._AWARENESS_TIME-d_status.settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL + \ + ((d_status.settings._AWARENESS_PROMPT_TIME_TILL_TERMINAL)/2))/DT_DMON)].names[0] == EventName.promptDriverUnresponsive + assert events[int((d_status.settings._AWARENESS_TIME + \ + ((TEST_TIMESPAN-10-d_status.settings._AWARENESS_TIME)/2))/DT_DMON)].names[0] == EventName.driverUnresponsive + + # engaged, down to orange, driver pays attention, back to normal; then down to orange, driver touches wheel + # - should have short orange recovery time and no green afterwards; wheel touch only recovers when paying attention + def test_normal_driver(self): + ds_vector = [msg_DISTRACTED] * int(DISTRACTED_SECONDS_TO_ORANGE/DT_DMON) + \ + [msg_ATTENTIVE] * int(DISTRACTED_SECONDS_TO_ORANGE/DT_DMON) + \ + [msg_DISTRACTED] * int((DISTRACTED_SECONDS_TO_ORANGE+2)/DT_DMON) + \ + [msg_ATTENTIVE] * (int(TEST_TIMESPAN/DT_DMON)-int((DISTRACTED_SECONDS_TO_ORANGE*3+2)/DT_DMON)) + interaction_vector = [car_interaction_NOT_DETECTED] * int(DISTRACTED_SECONDS_TO_ORANGE*3/DT_DMON) + \ + [car_interaction_DETECTED] * (int(TEST_TIMESPAN/DT_DMON)-int(DISTRACTED_SECONDS_TO_ORANGE*3/DT_DMON)) + events, _ = self._run_seq(ds_vector, interaction_vector, always_true, always_false) + assert len(events[int(DISTRACTED_SECONDS_TO_ORANGE*0.5/DT_DMON)]) == 0 + assert events[int((DISTRACTED_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.promptDriverDistracted + assert len(events[int(DISTRACTED_SECONDS_TO_ORANGE*1.5/DT_DMON)]) == 0 + assert events[int((DISTRACTED_SECONDS_TO_ORANGE*3-0.1)/DT_DMON)].names[0] == EventName.promptDriverDistracted + assert events[int((DISTRACTED_SECONDS_TO_ORANGE*3+0.1)/DT_DMON)].names[0] == EventName.promptDriverDistracted + assert len(events[int((DISTRACTED_SECONDS_TO_ORANGE*3+2.5)/DT_DMON)]) == 0 + + # engaged, down to orange, driver dodges camera, then comes back still distracted, down to red, \ + # driver dodges, and then touches wheel to no avail, disengages and reengages + # - orange/red alert should remain after disappearance, and only disengaging clears red + def test_biggest_comma_fan(self): + _invisible_time = 2 # seconds + ds_vector = always_distracted[:] + interaction_vector = always_false[:] + op_vector = always_true[:] + ds_vector[int(DISTRACTED_SECONDS_TO_ORANGE/DT_DMON):int((DISTRACTED_SECONDS_TO_ORANGE+_invisible_time)/DT_DMON)] \ + = [msg_NO_FACE_DETECTED] * int(_invisible_time/DT_DMON) + ds_vector[int((DISTRACTED_SECONDS_TO_RED+_invisible_time)/DT_DMON):int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time)/DT_DMON)] \ + = [msg_NO_FACE_DETECTED] * int(_invisible_time/DT_DMON) + interaction_vector[int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+0.5)/DT_DMON):int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+1.5)/DT_DMON)] \ + = [True] * int(1/DT_DMON) + op_vector[int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+2.5)/DT_DMON):int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+3)/DT_DMON)] \ + = [False] * int(0.5/DT_DMON) + events, _ = self._run_seq(ds_vector, interaction_vector, op_vector, always_false) + assert events[int((DISTRACTED_SECONDS_TO_ORANGE+0.5*_invisible_time)/DT_DMON)].names[0] == EventName.promptDriverDistracted + assert events[int((DISTRACTED_SECONDS_TO_RED+1.5*_invisible_time)/DT_DMON)].names[0] == EventName.driverDistracted + assert events[int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+1.5)/DT_DMON)].names[0] == EventName.driverDistracted + assert len(events[int((DISTRACTED_SECONDS_TO_RED+2*_invisible_time+3.5)/DT_DMON)]) == 0 + + # engaged, invisible driver, down to orange, driver touches wheel; then down to orange again, driver appears + # - both actions should clear the alert, but momentary appearance should not + def test_sometimes_transparent_commuter(self): + _visible_time = np.random.choice([0.5, 10]) + ds_vector = always_no_face[:]*2 + interaction_vector = always_false[:]*2 + ds_vector[int((2*INVISIBLE_SECONDS_TO_ORANGE+1)/DT_DMON):int((2*INVISIBLE_SECONDS_TO_ORANGE+1+_visible_time)/DT_DMON)] = \ + [msg_ATTENTIVE] * int(_visible_time/DT_DMON) + interaction_vector[int((INVISIBLE_SECONDS_TO_ORANGE)/DT_DMON):int((INVISIBLE_SECONDS_TO_ORANGE+1)/DT_DMON)] = [True] * int(1/DT_DMON) + events, _ = self._run_seq(ds_vector, interaction_vector, 2*always_true, 2*always_false) + assert len(events[int(INVISIBLE_SECONDS_TO_ORANGE*0.5/DT_DMON)]) == 0 + assert events[int((INVISIBLE_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.promptDriverUnresponsive + assert len(events[int((INVISIBLE_SECONDS_TO_ORANGE+0.1)/DT_DMON)]) == 0 + if _visible_time == 0.5: + assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1-0.1)/DT_DMON)].names[0] == EventName.promptDriverUnresponsive + assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1+0.1+_visible_time)/DT_DMON)].names[0] == EventName.preDriverUnresponsive + elif _visible_time == 10: + assert events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1-0.1)/DT_DMON)].names[0] == EventName.promptDriverUnresponsive + assert len(events[int((INVISIBLE_SECONDS_TO_ORANGE*2+1+0.1+_visible_time)/DT_DMON)]) == 0 + + # engaged, invisible driver, down to red, driver appears and then touches wheel, then disengages/reengages + # - only disengage will clear the alert + def test_last_second_responder(self): + _visible_time = 2 # seconds + ds_vector = always_no_face[:] + interaction_vector = always_false[:] + op_vector = always_true[:] + ds_vector[int(INVISIBLE_SECONDS_TO_RED/DT_DMON):int((INVISIBLE_SECONDS_TO_RED+_visible_time)/DT_DMON)] = [msg_ATTENTIVE] * int(_visible_time/DT_DMON) + interaction_vector[int((INVISIBLE_SECONDS_TO_RED+_visible_time)/DT_DMON):int((INVISIBLE_SECONDS_TO_RED+_visible_time+1)/DT_DMON)] = [True] * int(1/DT_DMON) + op_vector[int((INVISIBLE_SECONDS_TO_RED+_visible_time+1)/DT_DMON):int((INVISIBLE_SECONDS_TO_RED+_visible_time+0.5)/DT_DMON)] = [False] * int(0.5/DT_DMON) + events, _ = self._run_seq(ds_vector, interaction_vector, op_vector, always_false) + assert len(events[int(INVISIBLE_SECONDS_TO_ORANGE*0.5/DT_DMON)]) == 0 + assert events[int((INVISIBLE_SECONDS_TO_ORANGE-0.1)/DT_DMON)].names[0] == EventName.promptDriverUnresponsive + assert events[int((INVISIBLE_SECONDS_TO_RED-0.1)/DT_DMON)].names[0] == EventName.driverUnresponsive + assert events[int((INVISIBLE_SECONDS_TO_RED+0.5*_visible_time)/DT_DMON)].names[0] == EventName.driverUnresponsive + assert events[int((INVISIBLE_SECONDS_TO_RED+_visible_time+0.5)/DT_DMON)].names[0] == EventName.driverUnresponsive + assert len(events[int((INVISIBLE_SECONDS_TO_RED+_visible_time+1+0.1)/DT_DMON)]) == 0 + + # disengaged, always distracted driver + # - dm should stay quiet when not engaged + def test_pure_dashcam_user(self): + events, _ = self._run_seq(always_distracted, always_false, always_false, always_false) + assert sum(len(event) for event in events) == 0 + + # engaged, car stops at traffic light, down to orange, no action, then car starts moving + # - should only reach green when stopped, but continues counting down on launch + def test_long_traffic_light_victim(self): + _redlight_time = 60 # seconds + standstill_vector = always_true[:] + standstill_vector[int(_redlight_time/DT_DMON):] = [False] * int((TEST_TIMESPAN-_redlight_time)/DT_DMON) + events, d_status = self._run_seq(always_distracted, always_false, always_true, standstill_vector) + assert events[int((d_status.settings._DISTRACTED_TIME-d_status.settings._DISTRACTED_PRE_TIME_TILL_TERMINAL+1)/DT_DMON)].names[0] == \ + EventName.preDriverDistracted + assert events[int((_redlight_time-0.1)/DT_DMON)].names[0] == EventName.preDriverDistracted + assert events[int((_redlight_time+0.5)/DT_DMON)].names[0] == EventName.promptDriverDistracted + + # engaged, model is somehow uncertain and driver is distracted + # - should fall back to wheel touch after uncertain alert + def test_somehow_indecisive_model(self): + ds_vector = [msg_DISTRACTED_BUT_SOMEHOW_UNCERTAIN] * int(TEST_TIMESPAN/DT_DMON) + interaction_vector = always_false[:] + events, d_status = self._run_seq(ds_vector, interaction_vector, always_true, always_false) + assert EventName.preDriverUnresponsive in \ + events[int((INVISIBLE_SECONDS_TO_ORANGE-1+DT_DMON*d_status.settings._HI_STD_FALLBACK_TIME-0.1)/DT_DMON)].names + assert EventName.promptDriverUnresponsive in \ + events[int((INVISIBLE_SECONDS_TO_ORANGE-1+DT_DMON*d_status.settings._HI_STD_FALLBACK_TIME+0.1)/DT_DMON)].names + assert EventName.driverUnresponsive in \ + events[int((INVISIBLE_SECONDS_TO_RED-1+DT_DMON*d_status.settings._HI_STD_FALLBACK_TIME+0.1)/DT_DMON)].names + + def test_calibrated_pose_blink_and_phone_distraction(self): + dm = DriverMonitoring() + dm.pose.calibrated = True + dm.pose.pitch = -1.0 + dm.pose.yaw = 1.0 + dm.blink.left = 1.0 + dm.blink.right = 1.0 + dm.phone.prob_calibrated = True + dm.phone.prob = 1.0 + assert set(dm._get_distracted_types()) == {1, 2, 4} + + def test_state_update_calibrates_pose_and_preserves_rhd_while_engaged(self): + dm = DriverMonitoring() + dm.wheelpos.prob_offseter.filtered_stat.M = 1.0 + dm.wheelpos.prob_offseter.filtered_stat.n = dm.settings._WHEELPOS_FILTER_MIN_COUNT + 1 + ds = log.DriverStateV2.new_message() + ds.wheelOnRightProb = 1.0 + set_driver_data(ds.rightDriverData) + + dm._update_states(ds, [0., 0., 0.], 20.0, False, False) + assert dm.wheel_on_right + assert dm.pose.pitch_offseter.filtered_stat.n > 0 + assert dm.pose.yaw_offseter.filtered_stat.n > 0 + assert dm.phone.prob_offseter.filtered_stat.n > 0 + + dm.wheelpos.prob_offseter.filtered_stat.M = 0.0 + dm._update_states(ds, [0., 0., 0.], 20.0, True, False) + assert dm.wheel_on_right + + def test_state_update_forces_rhd(self): + dm = DriverMonitoring(force_rhd=True) + dm.wheel_on_right_last = False + dm.wheelpos.prob_offseter.filtered_stat.M = 0.0 + dm.wheelpos.prob_offseter.filtered_stat.n = dm.settings._WHEELPOS_FILTER_MIN_COUNT + 1 + ds = log.DriverStateV2.new_message() + ds.wheelOnRightProb = 0.0 + set_driver_data(ds.rightDriverData) + + dm._update_states(ds, [0., 0., 0.], 20.0, True, False) + + assert dm.wheel_on_right + assert dm.face_detected + assert dm.wheelpos.prob_offseter.filtered_stat.n == dm.settings._WHEELPOS_FILTER_MIN_COUNT + 1 + assert dm.get_state_packet().driverMonitoringState.isRHD + + def test_state_update_rejects_incomplete_driver_data(self): + dm = DriverMonitoring() + dm._update_states(log.DriverStateV2.new_message(), [0., 0., 0.], 0.0, False, False) + assert not dm.face_detected + + def test_demo_step_and_state_packet(self): + dm = DriverMonitoring() + ds = log.DriverStateV2.new_message() + set_driver_data(ds.leftDriverData) + dm.run_step({"driverStateV2": ds}, demo=True) + packet = dm.get_state_packet(valid=False) + assert not packet.valid + assert packet.driverMonitoringState.faceDetected + assert packet.driverMonitoringState.isActiveMode + + +@pytest.mark.parametrize("enabled_state, lat_active_state, expected", [ + (False, False, False), # Both Disabled + (True, False, True), # OP Enabled, Lat Inactive + (False, True, True), # OP Disabled, Lat Active (e.g. AOL) + (True, True, True) # Both Active +]) +def test_enabled_states(enabled_state, lat_active_state, expected): + """ + Test DriverMonitoring.run_step with all 4 combinations of: + - selfdriveState.enabled (True/False) + - carControl.latActive (True/False) + """ + cs = car.CarState.new_message() + cs.vEgo = 30.0 + cs.gearShifter = car.CarState.GearShifter.drive + cs.standstill = False + cs.steeringPressed = False + cs.gasPressed = False + + ss = log.SelfdriveState.new_message() + ss.enabled = enabled_state + + cc = car.CarControl.new_message() + cc.latActive = lat_active_state + + mv2 = log.ModelDataV2.new_message() + mv2.meta.disengagePredictions.brakeDisengageProbs = [0.0] + + lc = log.ExtrinsicsCalibration.new_message() + lc.rpyCalib = [0.0, 0.0, 0.0] + + ds = make_msg(False) + + sm = { + 'carState': cs, + 'selfdriveState': ss, + 'carControl': cc, + 'modelV2': mv2, + 'extrinsicsCalibration': lc, + 'driverStateV2': ds + } + + driver_monitoring = DriverMonitoring() + + # run_test doesn't assign enabled to a variable, so we need to spy on _update_events to see its value + captured_args = [] + original_update_events = driver_monitoring._update_events + + def spy_update_events(driver_engaged, op_engaged, standstill, wrong_gear, car_speed): + captured_args.append(op_engaged) + return original_update_events(driver_engaged, op_engaged, standstill, wrong_gear, car_speed) + + driver_monitoring._update_events = spy_update_events + + driver_monitoring.run_step(sm, demo=False) + + # Assertion + assert len(captured_args) == 1, "Expected _update_events to be called exactly once" + actual_enabled = captured_args[0] + + assert actual_enabled == expected, f"Expected op_engaged={expected}, but got {actual_enabled}" diff --git a/iqpilot/selfdrive/pandad/.gitignore b/iqpilot/selfdrive/pandad/.gitignore new file mode 100644 index 000000000..f7226cdb8 --- /dev/null +++ b/iqpilot/selfdrive/pandad/.gitignore @@ -0,0 +1,3 @@ +pandad +pandad_api_impl.cpp +tests/test_pandad_usbprotocol diff --git a/iqpilot/selfdrive/pandad/__init__.py b/iqpilot/selfdrive/pandad/__init__.py new file mode 100644 index 000000000..642013e50 --- /dev/null +++ b/iqpilot/selfdrive/pandad/__init__.py @@ -0,0 +1,3 @@ +from iqpilot.selfdrive.pandad.pandad_api_impl import can_list_to_can_capnp, can_capnp_to_list +assert can_list_to_can_capnp +assert can_capnp_to_list diff --git a/iqpilot/selfdrive/pandad/pandad b/iqpilot/selfdrive/pandad/pandad new file mode 100755 index 000000000..5ae18467d Binary files /dev/null and b/iqpilot/selfdrive/pandad/pandad differ diff --git a/iqpilot/selfdrive/pandad/pandad.py b/iqpilot/selfdrive/pandad/pandad.py new file mode 100755 index 000000000..ca7a7e47b --- /dev/null +++ b/iqpilot/selfdrive/pandad/pandad.py @@ -0,0 +1,199 @@ +#!/usr/bin/env python3 +# simple pandad wrapper that updates the panda first +import os +import usb1 +import time +import signal +import subprocess + +from panda import Panda, PandaDFU, PandaProtocolMismatch, FW_PATH +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.system.hardware import HARDWARE +from iqpilot.common.swaglog import cloudlog + + +def get_expected_signature(panda: Panda) -> bytes: + try: + fn = os.path.join(FW_PATH, panda.get_mcu_type().config.app_fn) + return Panda.get_signature_from_firmware(fn) + except Exception: + cloudlog.exception("Error computing expected signature") + return b"" + +def flash_panda(panda_serial: str) -> Panda: + try: + panda = Panda(panda_serial) + except PandaProtocolMismatch: + cloudlog.warning("detected protocol mismatch, reflashing panda") + HARDWARE.recover_internal_panda() + raise + + # skip flashing if the detected panda is not supported + supported_panda = check_panda_support(panda) + if not supported_panda: + cloudlog.warning(f"Panda {panda_serial} is not supported (hw_type: {panda.get_type()}), skipping flash...") + return panda + + fw_signature = get_expected_signature(panda) + internal_panda = panda.is_internal() + + panda_version = "bootstub" if panda.bootstub else panda.get_version() + panda_signature = b"" if panda.bootstub else panda.get_signature() + cloudlog.warning(f"Panda {panda_serial} connected, version: {panda_version}, signature {panda_signature.hex()[:16]}, expected {fw_signature.hex()[:16]}") + + if panda.bootstub or panda_signature != fw_signature: + cloudlog.info("Panda firmware out of date, update required") + panda.flash() + cloudlog.info("Done flashing") + + if panda.bootstub: + bootstub_version = panda.get_version() + cloudlog.info(f"Flashed firmware not booting, flashing development bootloader. {bootstub_version=}, {internal_panda=}") + if internal_panda: + HARDWARE.recover_internal_panda() + panda.recover(reset=(not internal_panda)) + cloudlog.info("Done flashing bootstub") + + if panda.bootstub: + cloudlog.info("Panda still not booting, exiting") + raise AssertionError + + panda_signature = panda.get_signature() + if panda_signature != fw_signature: + cloudlog.info("Version mismatch after flashing, exiting") + raise AssertionError + + return panda + + +def check_panda_support(panda) -> bool: + hw_type = panda.get_type() + if hw_type in Panda.SUPPORTED_DEVICES: + return True + if hw_type == Panda.HW_TYPE_UNKNOWN and (os.environ.get('LITE') == '1' or os.path.exists('/tmp/lite_hw')): + return True + return False + + +def main() -> None: + os.environ["IQPILOT_PANDA_FW_PATH"] = FW_PATH + + # signal pandad to close the relay and exit + def signal_handler(signum, frame): + cloudlog.info(f"Caught signal {signum}, exiting") + nonlocal do_exit + do_exit = True + if process is not None: + process.send_signal(signal.SIGINT) + + process = None + do_exit = False + signal.signal(signal.SIGINT, signal_handler) + + count = 0 + first_run = True + params = Params() + no_internal_panda_count = 0 + + while not do_exit: + try: + count += 1 + cloudlog.event("pandad.flash_and_connect", count=count) + params.remove("PandaSignatures") + + # Handle missing internal panda + if time.monotonic() < 60.: + no_internal_panda_count = 0 + if no_internal_panda_count > 0: + if no_internal_panda_count == 3: + cloudlog.info("No pandas found, putting internal panda into DFU") + HARDWARE.recover_internal_panda() + else: + cloudlog.info("No pandas found, resetting internal panda") + HARDWARE.reset_internal_panda() + time.sleep(3) # wait to come back up + + # Flash all Pandas in DFU mode + dfu_serials = PandaDFU.list() + if len(dfu_serials) > 0: + for serial in dfu_serials: + cloudlog.info(f"Panda in DFU mode found, flashing recovery {serial}") + PandaDFU(serial).recover() + time.sleep(1) + + panda_serials = Panda.list() + if len(panda_serials) == 0: + no_internal_panda_count += 1 + continue + + cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}") + + # Flash pandas + pandas: list[Panda] = [] + for serial in panda_serials: + pandas.append(flash_panda(serial)) + + # Ensure internal panda is present if expected + internal_pandas = [panda for panda in pandas if panda.is_internal()] + if HARDWARE.has_internal_panda() and len(internal_pandas) == 0: + cloudlog.error("Internal panda is missing, trying again") + no_internal_panda_count += 1 + continue + no_internal_panda_count = 0 + + # sort pandas to have deterministic order + # * the internal one is always first + # * then sort by hardware type + # * as a last resort, sort by serial number + pandas.sort(key=lambda x: (not x.is_internal(), x.get_type(), x.get_usb_serial())) + panda_serials = [p.get_usb_serial() for p in pandas] + + # log panda fw versions + params.put("PandaSignatures", b','.join(p.get_signature() for p in pandas)) + + for panda in pandas: + # skip health check if the detected panda is not supported + supported_panda = check_panda_support(panda) + if not supported_panda: + cloudlog.warning(f"Panda {panda.get_usb_serial()} is not supported (hw_type: {panda.get_type()}), skipping health check...") + continue + + # check health for lost heartbeat + health = panda.health() + if health["heartbeat_lost"]: + params.put_bool("PandaHeartbeatLost", True) + cloudlog.event("heartbeat lost", deviceState=health, serial=panda.get_usb_serial()) + if health["som_reset_triggered"]: + params.put_bool("PandaSomResetTriggered", True) + cloudlog.event("panda.som_reset_triggered", health=health, serial=panda.get_usb_serial()) + + if first_run: + # reset panda to ensure we're in a good state + cloudlog.info(f"Resetting panda {panda.get_usb_serial()}") + panda.reset(reconnect=True) + + for p in pandas: + p.close() + # TODO: wrap all panda exceptions in a base panda exception + except (usb1.USBErrorNoDevice, usb1.USBErrorPipe): + # a panda was disconnected while setting everything up. let's try again + cloudlog.exception("Panda USB exception while setting up") + continue + except PandaProtocolMismatch: + cloudlog.exception("pandad.protocol_mismatch") + continue + except Exception: + cloudlog.exception("pandad.uncaught_exception") + continue + + first_run = False + + # run pandad with all connected serials as arguments + os.environ['MANAGER_DAEMON'] = 'pandad' + process = subprocess.Popen(["./pandad", *panda_serials], cwd=os.path.join(BASEDIR, "iqpilot/selfdrive/pandad")) + process.wait() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/pandad/pandad_api_impl.py b/iqpilot/selfdrive/pandad/pandad_api_impl.py new file mode 100644 index 000000000..a4b4bed06 --- /dev/null +++ b/iqpilot/selfdrive/pandad/pandad_api_impl.py @@ -0,0 +1,88 @@ +import time +from iqpilot.cereal import log + +NO_TRAVERSAL_LIMIT = 2**64 - 1 + +# Cache schema fields for faster access (avoids string lookup on each field access) +_cached_reader_fields = None # (address_field, dat_field, src_field) for reading +_cached_writer_fields = None # (address_field, dat_field, src_field) for writing + + +def _get_reader_fields(schema): + """Get cached schema field objects for reading.""" + global _cached_reader_fields + if _cached_reader_fields is None: + fields = schema.fields + _cached_reader_fields = (fields['address'], fields['dat'], fields['src']) + return _cached_reader_fields + + +def _get_writer_fields(schema): + """Get cached schema field objects for writing.""" + global _cached_writer_fields + if _cached_writer_fields is None: + fields = schema.fields + _cached_writer_fields = (fields['address'], fields['dat'], fields['src']) + return _cached_writer_fields + + +def can_list_to_can_capnp(can_msgs, msgtype='can', valid=True): + """Convert list of CAN messages to Cap'n Proto serialized bytes. + + Args: + can_msgs: List of tuples [(address, data_bytes, src), ...] + msgtype: 'can' or 'sendcan' + valid: Whether the event is valid + + Returns: + Cap'n Proto serialized bytes + """ + global _cached_writer_fields + + dat = log.Event.new_message(valid=valid, logMonoTime=int(time.monotonic() * 1e9)) + can_data = dat.init(msgtype, len(can_msgs)) + + # Cache schema fields on first call + if _cached_writer_fields is None and len(can_msgs) > 0: + _cached_writer_fields = _get_writer_fields(can_data[0].schema) + + if _cached_writer_fields is not None: + addr_f, dat_f, src_f = _cached_writer_fields + for i, msg in enumerate(can_msgs): + f = can_data[i] + f._set_by_field(addr_f, msg[0]) + f._set_by_field(dat_f, msg[1]) + f._set_by_field(src_f, msg[2]) + + return dat.to_bytes() + + +def can_capnp_to_list(strings, msgtype='can'): + """Convert Cap'n Proto serialized bytes to list of CAN messages. + + Args: + strings: Tuple/list of serialized Cap'n Proto bytes + msgtype: 'can' or 'sendcan' + + Returns: + List of tuples [(nanos, [(address, data, src), ...]), ...] + """ + global _cached_reader_fields + result = [] + + for s in strings: + with log.Event.from_bytes(s, traversal_limit_in_words=NO_TRAVERSAL_LIMIT) as event: + frames = getattr(event, msgtype) + + # Cache schema fields on first frame for faster access + if _cached_reader_fields is None and len(frames) > 0: + _cached_reader_fields = _get_reader_fields(frames[0].schema) + + if _cached_reader_fields is not None: + addr_f, dat_f, src_f = _cached_reader_fields + frame_list = [(f._get_by_field(addr_f), f._get_by_field(dat_f), f._get_by_field(src_f)) for f in frames] + else: + frame_list = [] + + result.append((event.logMonoTime, frame_list)) + return result diff --git a/iqpilot/selfdrive/pandad/tests/__init__.py b/iqpilot/selfdrive/pandad/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/pandad/tests/bootstub.panda.bin b/iqpilot/selfdrive/pandad/tests/bootstub.panda.bin new file mode 100755 index 000000000..43db53706 Binary files /dev/null and b/iqpilot/selfdrive/pandad/tests/bootstub.panda.bin differ diff --git a/iqpilot/selfdrive/pandad/tests/bootstub.panda_h7.bin b/iqpilot/selfdrive/pandad/tests/bootstub.panda_h7.bin new file mode 100755 index 000000000..1d9445004 Binary files /dev/null and b/iqpilot/selfdrive/pandad/tests/bootstub.panda_h7.bin differ diff --git a/iqpilot/selfdrive/pandad/tests/bootstub.panda_h7_spiv0.bin b/iqpilot/selfdrive/pandad/tests/bootstub.panda_h7_spiv0.bin new file mode 100755 index 000000000..5cf2fa451 Binary files /dev/null and b/iqpilot/selfdrive/pandad/tests/bootstub.panda_h7_spiv0.bin differ diff --git a/iqpilot/selfdrive/pandad/tests/test_pandad.py b/iqpilot/selfdrive/pandad/tests/test_pandad.py new file mode 100644 index 000000000..f4ced3137 --- /dev/null +++ b/iqpilot/selfdrive/pandad/tests/test_pandad.py @@ -0,0 +1,114 @@ +import os +import pytest +import time + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import log +from iqpilot.common.gpio import gpio_set, gpio_init +from panda import Panda, PandaDFU +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.hardware.tici.pins import GPIO + +HERE = os.path.dirname(os.path.realpath(__file__)) + + +@pytest.mark.tici +class TestPandad: + + def setup_method(self): + # ensure panda is up + if len(Panda.list()) == 0: + self._run_test(60) + + def teardown_method(self): + managed_processes['pandad'].stop() + + def _run_test(self, timeout=30) -> float: + st = time.monotonic() + sm = messaging.SubMaster(['pandaStates']) + + managed_processes['pandad'].start() + while (time.monotonic() - st) < timeout: + sm.update(100) + if len(sm['pandaStates']) and sm['pandaStates'][0].pandaType != log.PandaState.PandaType.unknown: + break + dt = time.monotonic() - st + managed_processes['pandad'].stop() + + if len(sm['pandaStates']) == 0 or sm['pandaStates'][0].pandaType == log.PandaState.PandaType.unknown: + raise Exception("pandad failed to start") + + return dt + + def _go_to_dfu(self): + HARDWARE.recover_internal_panda() + assert Panda.wait_for_dfu(None, 10) + + def _assert_no_panda(self): + assert not Panda.wait_for_dfu(None, 3) + assert not Panda.wait_for_panda(None, 3) + + def _flash_bootstub(self, fn): + self._go_to_dfu() + pd = PandaDFU(None) + if fn is None: + fn = os.path.join(HERE, pd.get_mcu_type().config.bootstub_fn) + with open(fn, "rb") as f: + pd.program_bootstub(f.read()) + pd.reset() + HARDWARE.reset_internal_panda() + + def test_in_dfu(self): + HARDWARE.recover_internal_panda() + self._run_test(60) + + def test_in_bootstub(self): + with Panda() as p: + p.reset(enter_bootstub=True) + assert p.bootstub + self._run_test() + + def test_internal_panda_reset(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_set(GPIO.STM_RST_N, 1) + time.sleep(0.5) + assert all(not Panda(s).is_internal() for s in Panda.list()) + self._run_test() + + assert any(Panda(s).is_internal() for s in Panda.list()) + + def test_best_case_startup_time(self): + # run once so we're up to date + self._run_test(60) + + ts = [] + for _ in range(10): + # should be nearly instant this time + dt = self._run_test(5) + ts.append(dt) + + # 5s for USB (due to enumeration) + # - 0.2s pandad -> pandad + # - plus some buffer + print("startup times", ts, sum(ts) / len(ts)) + assert 0.1 < (sum(ts)/len(ts)) < 0.7 + + def test_old_spi_protocol(self): + # flash firmware with old SPI protocol + self._flash_bootstub(os.path.join(HERE, "bootstub.panda_h7_spiv0.bin")) + self._run_test(45) + + def test_release_to_devel_bootstub(self): + self._flash_bootstub(None) + self._run_test(45) + + def test_recover_from_bad_bootstub(self): + self._go_to_dfu() + with PandaDFU(None) as pd: + pd.program_bootstub(b"\x00"*1024) + pd.reset() + HARDWARE.reset_internal_panda() + self._assert_no_panda() + + self._run_test(60) diff --git a/iqpilot/selfdrive/pandad/tests/test_pandad_loopback.py b/iqpilot/selfdrive/pandad/tests/test_pandad_loopback.py new file mode 100644 index 000000000..ca60b2c23 --- /dev/null +++ b/iqpilot/selfdrive/pandad/tests/test_pandad_loopback.py @@ -0,0 +1,113 @@ +import os +import copy +import random +import time +import pytest +from collections import defaultdict +from pprint import pprint + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car, log +from iqdbc.car.can_definitions import CanData +from iqpilot.common.utils import retry +from iqpilot.common.params import Params +from iqpilot.common.timeout import Timeout +from iqpilot.selfdrive.pandad import can_list_to_can_capnp +from iqpilot.system.hardware import TICI +from iqpilot.selfdrive.test.helpers import with_processes + + +@retry(attempts=3) +def setup_pandad(num_pandas): + params = Params() + params.clear_all() + params.put_bool("IsOnroad", False) + + sm = messaging.SubMaster(['pandaStates']) + with Timeout(90, "pandad didn't start"): + while sm.recv_frame['pandaStates'] < 1 or len(sm['pandaStates']) == 0 or \ + any(ps.pandaType == log.PandaState.PandaType.unknown for ps in sm['pandaStates']): + sm.update(1000) + + found_pandas = len(sm['pandaStates']) + assert num_pandas == found_pandas, "connected pandas ({found_pandas}) doesn't match expected panda count ({num_pandas}). \ + connect another panda for multipanda tests." + + # pandad safety setting relies on these params + cp = car.CarParams.new_message() + + safety_config = car.CarParams.SafetyConfig.new_message() + safety_config.safetyModel = car.CarParams.SafetyModel.allOutput + cp.safetyConfigs = [safety_config]*num_pandas + + params.put_bool("IsOnroad", True) + params.put_bool("FirmwareQueryDone", True) + params.put_bool("ControlsReady", True) + params.put("CarParams", cp.to_bytes()) + + with Timeout(90, "pandad didn't set safety mode"): + while any(ps.safetyModel != car.CarParams.SafetyModel.allOutput for ps in sm['pandaStates']): + sm.update(1000) + +def send_random_can_messages(sendcan, count, num_pandas=1): + sent_msgs = defaultdict(set) + for _ in range(count): + to_send = [] + for __ in range(random.randrange(20)): + bus = random.choice([b for b in range(3*num_pandas) if b % 4 != 3]) + addr = random.randrange(1, 1<<29) + dat = bytes(random.getrandbits(8) for _ in range(random.randrange(1, 9))) + if (addr, dat) in sent_msgs[bus]: + continue + sent_msgs[bus].add((addr, dat)) + to_send.append(CanData(addr, dat, bus)) + sendcan.send(can_list_to_can_capnp(to_send, msgtype='sendcan')) + return sent_msgs + + +@pytest.mark.tici +class TestBoarddLoopback: + @classmethod + def setup_class(cls): + os.environ['STARTED'] = '1' + os.environ['BOARDD_LOOPBACK'] = '1' + + @with_processes(['pandad']) + def test_loopback(self): + num_pandas = 2 if TICI and "SINGLE_PANDA" not in os.environ else 1 + setup_pandad(num_pandas) + + sendcan = messaging.pub_sock('sendcan') + can = messaging.sub_sock('can', conflate=False, timeout=100) + sm = messaging.SubMaster(['pandaStates']) + time.sleep(1) + + n = 200 + for i in range(n): + print(f"pandad loopback {i}/{n}") + + sent_msgs = send_random_can_messages(sendcan, random.randrange(20, 100), num_pandas) + + sent_loopback = copy.deepcopy(sent_msgs) + sent_loopback.update({k+128: copy.deepcopy(v) for k, v in sent_msgs.items()}) + sent_total = {k: len(v) for k, v in sent_loopback.items()} + for _ in range(100 * 5): + sm.update(0) + recvd = messaging.drain_sock(can, wait_for_one=True) + for msg in recvd: + for m in msg.can: + key = (m.address, m.dat) + assert key in sent_loopback[m.src], f"got unexpected msg: {m.src=} {m.address=} {m.dat=}" + sent_loopback[m.src].discard(key) + + if all(len(v) == 0 for v in sent_loopback.values()): + break + + # if a set isn't empty, messages got dropped + pprint(sent_msgs) + pprint(sent_loopback) + print({k: len(x) for k, x in sent_loopback.items()}) + print(sum([len(x) for x in sent_loopback.values()])) + pprint(sm['pandaStates']) # may drop messages due to RX buffer overflow + for bus in sent_loopback.keys(): + assert not len(sent_loopback[bus]), f"loop {i}: bus {bus} missing {len(sent_loopback[bus])} out of {sent_total[bus]} messages" diff --git a/iqpilot/selfdrive/pandad/tests/test_pandad_spi.py b/iqpilot/selfdrive/pandad/tests/test_pandad_spi.py new file mode 100644 index 000000000..24edafd39 --- /dev/null +++ b/iqpilot/selfdrive/pandad/tests/test_pandad_spi.py @@ -0,0 +1,102 @@ +import os +import time +import numpy as np +import pytest +import random + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.selfdrive.test.helpers import with_processes +from iqpilot.selfdrive.pandad.tests.test_pandad_loopback import setup_pandad, send_random_can_messages + +JUNGLE_SPAM = "JUNGLE_SPAM" in os.environ + +@pytest.mark.tici +class TestBoarddSpi: + @classmethod + def setup_class(cls): + os.environ['STARTED'] = '1' + os.environ['SPI_ERR_PROB'] = '0.001' + if not JUNGLE_SPAM: + os.environ['BOARDD_LOOPBACK'] = '1' + + @with_processes(['pandad']) + def test_spi_corruption(self, subtests): + setup_pandad(1) + + sendcan = messaging.pub_sock('sendcan') + socks = {s: messaging.sub_sock(s, conflate=False, timeout=100) for s in ('can', 'pandaStates', 'peripheralState')} + time.sleep(2) + for s in socks.values(): + messaging.drain_sock_raw(s) + + total_recv_count = 0 + total_sent_count = 0 + sent_msgs = {bus: list() for bus in range(3)} + + st = time.monotonic() + ts = {s: list() for s in socks.keys()} + for _ in range(int(os.getenv("TEST_TIME", "20"))): + # send some CAN messages + if not JUNGLE_SPAM: + sent = send_random_can_messages(sendcan, random.randrange(2, 20)) + for k, v in sent.items(): + sent_msgs[k].extend(list(v)) + total_sent_count += len(v) + + for service, sock in socks.items(): + for m in messaging.drain_sock(sock): + ts[service].append(m.logMonoTime) + + # sanity check for corruption + assert m.valid or (service == "can") + if service == "can": + for msg in m.can: + if JUNGLE_SPAM: + # PandaJungle.set_generated_can(True) + i = msg.address - 0x200 + assert msg.address >= 0x200 + assert msg.src == (i%3) + assert msg.dat == b"\xff"*(i%8) + total_recv_count += 1 + continue + + if msg.src > 4: + continue + key = (msg.address, msg.dat) + assert key in sent_msgs[msg.src], f"got unexpected msg: {msg.src=} {msg.address=} {msg.dat=}" + # TODO: enable this + #sent_msgs[msg.src].remove(key) + total_recv_count += 1 + elif service == "pandaStates": + assert len(m.pandaStates) == 1 + ps = m.pandaStates[0] + assert ps.uptime < 1000 + assert ps.pandaType == "tres" + assert ps.ignitionLine + assert not ps.ignitionCan + assert 4000 < ps.voltage < 14000 + elif service == "peripheralState": + ps = m.peripheralState + assert ps.pandaType == "tres" + assert 4000 < ps.voltage < 14000 + assert 50 < ps.current < 1000 + assert ps.fanSpeedRpm < 10000 + + time.sleep(0.5) + et = time.monotonic() - st + + print("\n======== timing report ========") + for service, times in ts.items(): + dts = np.diff(times)/1e6 + print(service.ljust(17), f"{np.mean(dts):7.2f} {np.min(dts):7.2f} {np.max(dts):7.2f}") + with subtests.test(msg="timing check", service=service): + edt = 1e3 / SERVICE_LIST[service].frequency + assert edt*0.9 < np.mean(dts) < edt*1.1 + assert np.max(dts) < edt*8 + assert np.min(dts) < edt + assert len(dts) >= ((et-0.5)*SERVICE_LIST[service].frequency*0.8) + + with subtests.test(msg="CAN traffic"): + print(f"Sent {total_sent_count} CAN messages, got {total_recv_count} back. {total_recv_count/(total_sent_count+1e-4):.2%} received") + assert total_recv_count > 20 diff --git a/iqpilot/selfdrive/selfdrived/__init__.py b/iqpilot/selfdrive/selfdrived/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/selfdrived/alertmanager.py b/iqpilot/selfdrive/selfdrived/alertmanager.py new file mode 100644 index 000000000..0ffe29431 --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/alertmanager.py @@ -0,0 +1,68 @@ +import copy +import os +import json +from collections import defaultdict +from dataclasses import dataclass + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.selfdrive.selfdrived.events import Alert +from iqpilot.common.atlas_alerts import NULL_ALERT as EmptyAlert + + +with open(os.path.join(BASEDIR, "iqpilot/selfdrive/selfdrived/alerts_offroad.json")) as f: + OFFROAD_ALERTS = json.load(f) + + +def set_offroad_alert(alert: str, show_alert: bool, extra_text: str | None = None) -> None: + if show_alert: + a = copy.copy(OFFROAD_ALERTS[alert]) + a['extra'] = extra_text or '' + Params().put(alert, a) + else: + Params().remove(alert) + + +@dataclass +class AlertEntry: + alert: Alert | None = None + start_frame: int = -1 + end_frame: int = -1 + added_frame: int = -1 + + def active(self, frame: int) -> bool: + return frame <= self.end_frame + + def just_added(self, frame: int) -> bool: + return self.active(frame) and frame == (self.added_frame + 1) + +class AlertManager: + def __init__(self): + self.alerts: dict[str, AlertEntry] = defaultdict(AlertEntry) + self.current_alert = EmptyAlert + + def add_many(self, frame: int, alerts: list[Alert]) -> None: + for alert in alerts: + entry = self.alerts[alert.alert_type] + entry.alert = alert + if not entry.just_added(frame): + entry.start_frame = frame + min_end_frame = entry.start_frame + alert.duration + entry.end_frame = max(frame + 1, min_end_frame) + entry.added_frame = frame + + def process_alerts(self, frame: int, clear_event_types: set): + ae = AlertEntry() + for v in self.alerts.values(): + if not v.alert: + continue + + if v.alert.event_type in clear_event_types: + v.end_frame = -1 + + # sort by priority first and then by start_frame + greater = ae.alert is None or (v.alert.priority, v.start_frame) > (ae.alert.priority, ae.start_frame) + if v.active(frame) and greater: + ae = v + + self.current_alert = ae.alert if ae.alert is not None else EmptyAlert diff --git a/iqpilot/selfdrive/selfdrived/alerts_offroad.json b/iqpilot/selfdrive/selfdrived/alerts_offroad.json new file mode 100644 index 000000000..6fcc7fe6f --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/alerts_offroad.json @@ -0,0 +1,86 @@ +{ + "Offroad_TemperatureTooHigh": { + "text": "Device temperature too high. System cooling down before starting. Current internal component temperature: %1", + "severity": 0 + }, + "Offroad_ConnectivityNeededPrompt": { + "text": "Immediately connect to the internet to check for updates. If you do not connect to the internet, iqpilot won't engage in %1", + "severity": 0, + "_comment": "Set extra field to number of days" + }, + "Offroad_ConnectivityNeeded": { + "text": "Connect to internet to check for updates. iqpilot won't automatically start until it connects to internet to check for updates.", + "severity": 1 + }, + "Offroad_UpdateFailed": { + "text": "Unable to download updates\n%1", + "severity": 1, + "_comment": "Set extra field to the failed reason." + }, + "Offroad_IsTakingSnapshot": { + "text": "Taking camera snapshots. System won't start until finished.", + "severity": 0 + }, + "Offroad_NeosUpdate": { + "text": "An update to your device's operating system is downloading in the background. You will be prompted to update when it's ready to install.", + "severity": 0 + }, + "Offroad_UnregisteredHardware": { + "text": "Failed to register device with konn3kt. If you need assistance, contact IQ.Pilot support.", + "severity": 1 + }, + "Offroad_StorageMissing": { + "text": "NVMe drive not mounted.", + "severity": 1 + }, + "Offroad_CarUnrecognized": { + "text": "iqpilot was unable to identify your car. Your car is either unsupported or its ECUs are not recognized. Please submit a pull request to add the firmware versions to the proper vehicle.", + "severity": 0 + }, + "Offroad_Recalibration": { + "text": "iqpilot detected a change in the device's mounting position. Ensure the device is fully seated in the mount and the mount is firmly secured to the windshield.", + "severity": 0 + }, + "Offroad_OSMUpdateRequired": { + "text": "OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display.\n\n%1", + "severity": 0 + }, + "Offroad_ExcessiveActuation": { + "text": "Excessive %1 actuation detected on your last drive. Please contact IQ.Pilot support and share your device ID for troubleshooting.", + "severity": 1, + "_comment": "Set extra field to lateral or longitudinal." + }, + "Offroad_TiciSupport": { + "text": "Unsupported branch! - The current version of %1 is not marked as compatible with the Comma Three (3|tici). Please go to [Device > Software] and install a supported branch such as release or beta for the comma three.", + "severity": 1, + "_comment": "Set extra field to the current branch name." + }, + "Offroad_EgpuNotDetected": { + "text": "eGPU dock not detected. Check USB and 12V connections.", + "severity": 0 + }, + "Offroad_EgpuFansObstructed": { + "text": "eGPU dock fans obstructed. Check the fans.", + "severity": 0 + }, + "Offroad_EgpuOverheated": { + "text": "eGPU dock overheated. Allow it to cool.", + "severity": 0 + }, + "Offroad_EgpuPcieUnavailable": { + "text": "eGPU dock PCIe unavailable. %1", + "severity": 0 + }, + "Offroad_EgpuUncompiled": { + "text": "eGPU big model not compiled. Keep ignition on and reboot the device.", + "severity": 0 + }, + "Offroad_EgpuUpdateFailed": { + "text": "eGPU dock update failed. Check the USB cable.", + "severity": 0 + }, + "Offroad_EgpuUsbSlow": { + "text": "eGPU dock USB link is slow. Check the USB cable. The current speed is %1.", + "severity": 0 + } +} diff --git a/iqpilot/selfdrive/selfdrived/events.py b/iqpilot/selfdrive/selfdrived/events.py new file mode 100755 index 000000000..f296a9744 --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/events.py @@ -0,0 +1,991 @@ +#!/usr/bin/env python3 +import math + +from iqpilot.cereal import log, car +import iqpilot.cereal.messaging as messaging +from iqpilot.common.constants import CV +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.locationd.calibrationd import MIN_SPEED_FILTER +from iqpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER +from iqpilot.selfdrive.ui.feedback.feedbackd import FEEDBACK_MAX_DURATION +from iqpilot.system.hardware import HARDWARE + +from iqpilot.common.atlas_alerts import EventBook as EventsBase, Tier as Priority, Tags as ET, AlertCard as Alert, \ + NoEntryCard as NoEntryAlert, GentleDisableCard as SoftDisableAlert, PendingDisableCard as UserSoftDisableAlert, \ + HardDisableCard as ImmediateDisableAlert, ChimeCard as EngagementAlert, BannerCard as NormalPermanentAlert, \ + BootCard as StartupAlert, AlertFactory as AlertCallbackType, car_mode_entry_alert as wrong_car_mode_alert + + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus +VisualAlert = car.CarControl.HUDControl.VisualAlert +AudibleAlert = car.CarControl.HUDControl.AudibleAlert +EventName = log.OnroadEvent.EventName + + +# get event name from enum +EVENT_NAME = {v: k for k, v in EventName.schema.enumerants.items()} + + +class Events(EventsBase): + def __init__(self): + super().__init__() + self.event_counters = dict.fromkeys(EVENTS.keys(), 0) + + def get_events_mapping(self) -> dict[int, dict[str, Alert | AlertCallbackType]]: + return EVENTS + + def get_event_name(self, event: int): + return EVENT_NAME[event] + + def get_event_msg_type(self): + return log.OnroadEvent + + + +# ********** helper functions ********** +def get_display_speed(speed_ms: float, metric: bool) -> str: + speed = int(round(speed_ms * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH))) + unit = 'km/h' if metric else 'mph' + return f"{speed} {unit}" + + +# ********** alert callback functions ********** + + +def soft_disable_alert(alert_text_2: str) -> AlertCallbackType: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if soft_disable_time < int(0.5 / DT_CTRL): + return ImmediateDisableAlert(alert_text_2) + return SoftDisableAlert(alert_text_2) + return func + +def user_soft_disable_alert(alert_text_2: str) -> AlertCallbackType: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if soft_disable_time < int(0.5 / DT_CTRL): + return ImmediateDisableAlert(alert_text_2) + return UserSoftDisableAlert(alert_text_2) + return func + +def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NoEntryAlert(f"Drive above {get_display_speed(CP.minEnableSpeed, metric)} to engage") + + +def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return Alert( + f"Steer Assist Unavailable Below {get_display_speed(CP.minSteerSpeed, metric)}", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 0.4) + + +def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + first_word = 'Recalibrating' if sm['extrinsicsCalibration'].calStatus == log.ExtrinsicsCalibration.Status.recalibrating else 'Calibrating' + return Alert( + f"{first_word}: {sm['extrinsicsCalibration'].calPerc:.0f}%", + f"Drive Above {get_display_speed(MIN_SPEED_FILTER, metric)}", + AlertStatus.normal, AlertSize.mid, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) + + +def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + duration = FEEDBACK_MAX_DURATION - ((sm['audioFeedback'].blockNum + 1) * SAMPLE_BUFFER / SAMPLE_RATE) + return NormalPermanentAlert( + "Recording Audio Feedback", + f"{round(duration)} second{'s' if round(duration) != 1 else ''} remaining. Press again to save early.", + priority=Priority.LOW) + + +# *** debug alerts *** + +def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + full_perc = round(100. - sm['deviceState'].freeSpacePercent) + return NormalPermanentAlert("Out of Storage", f"{full_perc}% full") + + +def posenet_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if sm.frame * DT_CTRL < 10.: + return NoEntryAlert("IQModel is starting up", alert_text_1="Please Wait") + mdl = sm['modelV2'].velocity.x[0] if len(sm['modelV2'].velocity.x) else math.nan + err = CS.vEgo - mdl + msg = f"Speed Error: {err:.1f} m/s" + return NoEntryAlert(msg, alert_text_1="Posenet Speed Invalid") + + +def process_not_running_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + not_running = [p.name for p in sm['managerState'].processes if not p.running and p.shouldBeRunning] + msg = ', '.join(not_running) + return NoEntryAlert(msg, alert_text_1="Process Not Running") + + +def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + bs = [s for s in sm.data.keys() if not sm.all_checks([s, ])] + msg = ', '.join(bs[:4]) # can't fit too many on one line + return NoEntryAlert(msg, alert_text_1="Communication Issue Between Processes") + + +def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + all_cams = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState') + bad_cams = [s.replace('State', '') for s in all_cams if s in sm.data.keys() and not sm.all_checks([s, ])] + return NormalPermanentAlert("Camera Malfunction", ', '.join(bad_cams)) + + +def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + rpy = sm['extrinsicsCalibration'].rpyCalib + yaw = math.degrees(rpy[2] if len(rpy) == 3 else math.nan) + pitch = math.degrees(rpy[1] if len(rpy) == 3 else math.nan) + angles = f"Remount Device (Pitch: {pitch:.1f}°, Yaw: {yaw:.1f}°)" + return NormalPermanentAlert("Calibration Invalid", angles) + + +def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + if not sm['vehicleParameters'].angleOffsetValid: + angle_offset_deg = sm['vehicleParameters'].angleOffsetDeg + title = "Steering misalignment detected" + text = f"Angle offset too high (Offset: {angle_offset_deg:.1f}°)" + elif not sm['vehicleParameters'].steerRatioValid: + steer_ratio = sm['vehicleParameters'].steerRatio + title = "Steer ratio mismatch" + text = f"Steering rack geometry may be off (Ratio: {steer_ratio:.1f})" + elif not sm['vehicleParameters'].stiffnessFactorValid: + stiffness_factor = sm['vehicleParameters'].stiffnessFactor + title = "Abnormal tire stiffness" + text = f"Check tires, pressure, or alignment (Factor: {stiffness_factor:.1f})" + else: + return NoEntryAlert("paramsd Temporary Error") + + return NoEntryAlert(alert_text_1=title, alert_text_2=text) + +def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + cpu = max(sm['deviceState'].cpuTempC, default=0.) + gpu = max(sm['deviceState'].gpuTempC, default=0.) + temp = max((cpu, gpu, sm['deviceState'].memoryTempC)) + return NormalPermanentAlert("System Overheated", f"{temp:.0f} °C") + + +def low_memory_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NormalPermanentAlert("Low Memory", f"{sm['deviceState'].memoryUsagePercent}% used") + + +def high_cpu_usage_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + x = max(sm['deviceState'].cpuUsagePercent, default=0.) + return NormalPermanentAlert("High CPU Usage", f"{x}% used") + + +def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + return NormalPermanentAlert("Driving Model Lagging", f"{sm['modelV2'].frameDropPerc:.1f}% frames dropped") + + +def _joystick_axes(sm: messaging.SubMaster) -> tuple[float, float] | None: + if 'testJoystick' not in sm.data or sm.recv_frame['testJoystick'] == 0: + return None + + axes = list(sm['testJoystick'].axes) + if len(axes) < 2: + return None + + return float(axes[0]), float(axes[1]) + + +def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + gb = sm['carControl'].actuators.accel / 4. + if CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED): + steer = sm['carControl'].actuators.steeringAngleDeg + vals = f"Gas: {round(gb * 100.)}%, Angle: {round(steer, 1)}°" + else: + steer = sm['carControl'].actuators.torque + vals = f"Gas: {round(gb * 100.)}%, Steer: {round(steer * 100.)}%" + return NormalPermanentAlert("Joystick Mode", vals) + + +def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + ad = sm['alertDebug'] + audible_alert = AudibleAlert.prompt if 'Active' in ad.alertText1 else AudibleAlert.none + alert_status = AlertStatus.userPrompt if 'Active' in ad.alertText1 else AlertStatus.normal + alert_size = AlertSize.mid if ad.alertText2 else AlertSize.small + return Alert(ad.alertText1, ad.alertText2, + alert_status, alert_size, + Priority.LOW, VisualAlert.none, audible_alert, 0.2) + + +def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + personality = str(personality).title() + return NormalPermanentAlert(f"Driving Personality: {personality}", duration=1.5) + + +def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + title = "Invalid LKAS setting" + text = "Toggle stock LKAS on or off to engage" + if CP.brand == "tesla": + title = "Dashcam Mode" + text = "FSD / Autosteer is active" + elif CP.brand == "mazda": + text = "Enable your car's LKAS to engage" + elif CP.brand == "nissan": + text = "Disable your car's stock LKAS to engage" + return NormalPermanentAlert(title, text) + + +def invalid_lkas_setting_no_entry_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, + metric: bool, soft_disable_time: int, personality) -> Alert: + if CP.brand == "tesla": + return NoEntryAlert("FSD / Autosteer is active", alert_text_1="Dashcam Mode") + return NoEntryAlert("Invalid LKAS setting") + + + +EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { + # ********** events with no alerts ********** + + EventName.stockFcw: {}, + EventName.actuatorsApiUnavailable: {}, + + # ********** events only containing alerts displayed in all states ********** + + EventName.joystickDebug: { + ET.WARNING: joystick_alert, + ET.PERMANENT: NormalPermanentAlert("Joystick Mode"), + }, + + EventName.longitudinalManeuver: { + ET.WARNING: longitudinal_maneuver_alert, + ET.PERMANENT: NormalPermanentAlert("Longitudinal Maneuver Mode", + "Ensure road ahead is clear"), + }, + + EventName.bigModelLoading: { + ET.NO_ENTRY: NoEntryAlert("Big Model Loading"), + }, + + EventName.bigModelFailed: { + ET.SOFT_DISABLE: soft_disable_alert("Big Model Failed"), + ET.PERMANENT: NormalPermanentAlert("Big Model Failed ", "Restart the car to retry,\nsmall model is still available", duration=20.), + }, + + EventName.lateralManeuver: { + ET.WARNING: longitudinal_maneuver_alert, + ET.PERMANENT: NormalPermanentAlert("Lateral Maneuver Mode"), + }, + + EventName.selfdriveInitializing: { + ET.NO_ENTRY: NoEntryAlert("IQ.Pilot Initializing"), + }, + + EventName.startup: { + ET.PERMANENT: StartupAlert("Welcome to IQ.Pilot!") + }, + + EventName.startupMaster: { + ET.PERMANENT: StartupAlert("Welcome to IQ.Pilot!"), + }, + + EventName.startupNoControl: { + ET.PERMANENT: StartupAlert("Dashcam mode"), + ET.NO_ENTRY: NoEntryAlert("Dashcam mode"), + }, + + EventName.startupNoCar: { + ET.PERMANENT: StartupAlert("IQ.Pilot Dashcam mode: car unrecognized"), + }, + + EventName.startupNoSecOcKey: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + "TSK Security Key Not Available", + priority=Priority.HIGH), + }, + + EventName.dashcamMode: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + priority=Priority.LOWEST), + }, + + EventName.invalidLkasSetting: { + ET.PERMANENT: invalid_lkas_setting_alert, + ET.NO_ENTRY: invalid_lkas_setting_no_entry_alert, + }, + + EventName.cruiseMismatch: { + #ET.PERMANENT: ImmediateDisableAlert("openpilot failed to cancel cruise"), + }, + + # openpilot doesn't recognize the car. This switches openpilot into a + # read-only mode. This can be solved by adding your fingerprint. + # See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information + EventName.carUnrecognized: { + ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", + "Car Unrecognized", + priority=Priority.LOWEST), + }, + + EventName.aeb: { + ET.PERMANENT: Alert( + "BRAKE!", + "Emergency Braking: Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.), + ET.NO_ENTRY: NoEntryAlert("AEB: Risk of Collision"), + }, + + EventName.stockAeb: { + ET.PERMANENT: Alert( + "BRAKE!", + "Stock AEB: Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.), + ET.NO_ENTRY: NoEntryAlert("Stock AEB: Risk of Collision"), + }, + + EventName.stockLkas: { + ET.PERMANENT: Alert( + "Stock LKAS: Lane Departure Detected", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.), + ET.NO_ENTRY: NoEntryAlert("Stock LKAS: Lane Departure Detected"), + }, + + EventName.fcw: { + ET.PERMANENT: Alert( + "BRAKE!", + "Risk of Collision", + AlertStatus.critical, AlertSize.full, + Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.warningSoft, 2.), + }, + + EventName.ldw: { + ET.PERMANENT: Alert( + "Lane Departure Detected", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.), + }, + + # ********** events only containing alerts that display while engaged ********** + + EventName.steerTempUnavailableSilent: { + ET.WARNING: Alert( + "Steering Assist Temporarily Unavailable", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 1.8), + }, + + EventName.preDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "", + AlertStatus.normal, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.promptDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "Driver Distracted", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1), + }, + + EventName.driverDistracted: { + ET.PERMANENT: Alert( + "DISENGAGE IMMEDIATELY", + "Driver Distracted", + AlertStatus.critical, AlertSize.full, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1), + }, + + EventName.preDriverUnresponsive: { + ET.PERMANENT: Alert( + "Touch Steering Wheel: No Face Detected", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1), + }, + + EventName.promptDriverUnresponsive: { + ET.PERMANENT: Alert( + "Touch Steering Wheel", + "Driver Unresponsive", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1), + }, + + EventName.driverUnresponsive: { + ET.PERMANENT: Alert( + "DISENGAGE IMMEDIATELY", + "Driver Unresponsive", + AlertStatus.critical, AlertSize.full, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1), + }, + + EventName.manualRestart: { + ET.WARNING: Alert( + "TAKE CONTROL", + "Resume Driving Manually", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.resumeRequired: { + ET.WARNING: Alert( + "Press Resume to Exit Standstill", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.belowSteerSpeed: { + ET.WARNING: below_steer_speed_alert, + }, + + EventName.preLaneChangeLeft: { + ET.WARNING: Alert( + "Steer Left to Start Lane Change Once Safe", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.preLaneChangeRight: { + ET.WARNING: Alert( + "Steer Right to Start Lane Change Once Safe", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.laneChangeBlocked: { + ET.WARNING: Alert( + "Car Detected in Blindspot", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1), + }, + + EventName.laneChange: { + ET.WARNING: Alert( + "Changing Lanes", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.steerSaturated: { + ET.WARNING: Alert( + "Take Control", + "Turn Exceeds Steering Limit", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.), + }, + + # Thrown when the fan is driven at >50% but is not rotating + EventName.fanMalfunction: { + ET.PERMANENT: NormalPermanentAlert("Fan Malfunction", "Likely Hardware Issue"), + }, + + # Camera is not outputting frames + EventName.cameraMalfunction: { + ET.PERMANENT: camera_malfunction_alert, + ET.SOFT_DISABLE: soft_disable_alert("Camera Malfunction"), + ET.NO_ENTRY: NoEntryAlert("Camera Malfunction: Reboot Your Device"), + }, + # Camera framerate too low + EventName.cameraFrameRate: { + ET.PERMANENT: NormalPermanentAlert("Camera Frame Rate Low", "Reboot your Device"), + ET.SOFT_DISABLE: soft_disable_alert("Camera Frame Rate Low"), + ET.NO_ENTRY: NoEntryAlert("Camera Frame Rate Low: Reboot Your Device"), + }, + + # Unused + + EventName.locationdTemporaryError: { + ET.NO_ENTRY: NoEntryAlert("locationd Temporary Error"), + ET.SOFT_DISABLE: soft_disable_alert("locationd Temporary Error"), + }, + + EventName.locationdPermanentError: { + ET.NO_ENTRY: NoEntryAlert("locationd Permanent Error"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("locationd Permanent Error"), + ET.PERMANENT: NormalPermanentAlert("locationd Permanent Error"), + }, + + # openpilot tries to learn certain parameters about your car by observing + # how the car behaves to steering inputs from both human and openpilot driving. + # This includes: + # - steer ratio: gear ratio of the steering rack. Steering angle divided by tire angle + # - tire stiffness: how much grip your tires have + # - angle offset: most steering angle sensors are offset and measure a non zero angle when driving straight + # This alert is thrown when any of these values exceed a sanity check. This can be caused by + # bad alignment or bad sensor data. If this happens consistently consider creating an issue on GitHub + EventName.paramsdTemporaryError: { + ET.NO_ENTRY: paramsd_invalid_alert, + ET.SOFT_DISABLE: soft_disable_alert("paramsd Temporary Error"), + }, + + EventName.paramsdPermanentError: { + ET.NO_ENTRY: NoEntryAlert("paramsd Permanent Error"), + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("paramsd Permanent Error"), + ET.PERMANENT: NormalPermanentAlert("paramsd Permanent Error"), + }, + + # ********** events that affect controls state transitions ********** + + EventName.pcmEnable: { + ET.ENABLE: EngagementAlert(AudibleAlert.engage), + }, + + EventName.buttonEnable: { + ET.ENABLE: EngagementAlert(AudibleAlert.engage), + }, + + EventName.pcmDisable: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + }, + + EventName.buttonCancel: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Cancel Pressed"), + }, + + EventName.brakeHold: { + ET.WARNING: Alert( + "Press Resume to Exit Brake Hold", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + + EventName.parkBrake: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Parking Brake Engaged"), + }, + + EventName.pedalPressed: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Pedal Pressed", + visual_alert=VisualAlert.brakePressed), + }, + + EventName.steerDisengage: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Steering Pressed"), + }, + + EventName.preEnableStandstill: { + ET.PRE_ENABLE: Alert( + "Release Brake to Engage", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1, creation_delay=1.), + }, + + EventName.gasPressedOverride: { + ET.OVERRIDE_LONGITUDINAL: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.steerOverride: { + ET.OVERRIDE_LATERAL: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), + }, + + EventName.wrongCarMode: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: wrong_car_mode_alert, + }, + + EventName.resumeBlocked: { + ET.NO_ENTRY: NoEntryAlert("Press Set to Engage"), + }, + + EventName.wrongCruiseMode: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + ET.NO_ENTRY: NoEntryAlert("Adaptive Cruise Disabled"), + }, + + EventName.steerTempUnavailable: { + ET.SOFT_DISABLE: soft_disable_alert("Steering Assist Temporarily Unavailable"), + ET.NO_ENTRY: NoEntryAlert("Steering Temporarily Unavailable"), + }, + + EventName.steerTimeLimit: { + ET.SOFT_DISABLE: soft_disable_alert("Vehicle Steering Time Limit"), + ET.NO_ENTRY: NoEntryAlert("Vehicle Steering Time Limit"), + }, + + EventName.outOfSpace: { + ET.PERMANENT: out_of_space_alert, + ET.NO_ENTRY: NoEntryAlert("Out of Storage"), + }, + + EventName.belowEngageSpeed: { + ET.NO_ENTRY: below_engage_speed_alert, + }, + + EventName.sensorDataInvalid: { + ET.PERMANENT: Alert( + "Sensor Data Invalid", + "Possible Hardware Issue", + AlertStatus.normal, AlertSize.mid, + Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2, creation_delay=1.), + ET.NO_ENTRY: NoEntryAlert("Sensor Data Invalid"), + ET.SOFT_DISABLE: soft_disable_alert("Sensor Data Invalid"), + }, + + EventName.noGps: { + }, + + EventName.tooDistracted: { + ET.NO_ENTRY: NoEntryAlert("Distraction Level Too High"), + }, + + EventName.excessiveActuation: { + ET.SOFT_DISABLE: soft_disable_alert("Excessive Actuation"), + ET.NO_ENTRY: NoEntryAlert("Excessive Actuation"), + }, + + EventName.overheat: { + ET.PERMANENT: overheat_alert, + ET.SOFT_DISABLE: soft_disable_alert("System Overheated"), + ET.NO_ENTRY: NoEntryAlert("System Overheated"), + }, + + EventName.wrongGear: { + ET.SOFT_DISABLE: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + ET.NO_ENTRY: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + }, + + # This alert is thrown when the calibration angles are outside of the acceptable range. + # For example if the device is pointed too much to the left or the right. + # Usually this can only be solved by removing the mount from the windshield completely, + # and attaching while making sure the device is pointed straight forward and is level. + # See https://comma.ai/setup for more information + EventName.calibrationInvalid: { + ET.PERMANENT: calibration_invalid_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Invalid: Remount Device & Recalibrate"), + ET.NO_ENTRY: NoEntryAlert("Calibration Invalid: Remount Device & Recalibrate"), + }, + + EventName.calibrationIncomplete: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"), + ET.NO_ENTRY: NoEntryAlert("Calibration in Progress"), + }, + + EventName.calibrationRecalibrating: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Device Remount Detected: Recalibrating"), + ET.NO_ENTRY: NoEntryAlert("Remount Detected: Recalibrating"), + }, + + EventName.doorOpen: { + ET.SOFT_DISABLE: user_soft_disable_alert("Door Open"), + ET.NO_ENTRY: NoEntryAlert("Door Open"), + }, + + EventName.seatbeltNotLatched: { + ET.SOFT_DISABLE: user_soft_disable_alert("Seatbelt Unlatched"), + ET.NO_ENTRY: NoEntryAlert("Seatbelt Unlatched"), + }, + + EventName.espDisabled: { + ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Disabled"), + ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Disabled"), + }, + + EventName.lowBattery: { + ET.SOFT_DISABLE: soft_disable_alert("Low Battery"), + ET.NO_ENTRY: NoEntryAlert("Low Battery"), + }, + + # Different openpilot services communicate between each other at a certain + # interval. If communication does not follow the regular schedule this alert + # is thrown. This can mean a service crashed, did not broadcast a message for + # ten times the regular interval, or the average interval is more than 10% too high. + # Soft warnings — no disable, no entry block. UI shows a silent yellow triangle instead. + EventName.commIssue: { + }, + EventName.commIssueAvgFreq: { + }, + + EventName.selfdrivedLagging: { + }, + + # Thrown when manager detects a service exited unexpectedly while driving + EventName.processNotRunning: { + ET.NO_ENTRY: process_not_running_alert, + ET.SOFT_DISABLE: soft_disable_alert("Process Not Running"), + }, + + EventName.radarFault: { + ET.SOFT_DISABLE: soft_disable_alert("Radar Error: Restart the Car"), + ET.NO_ENTRY: NoEntryAlert("Radar Error: Restart the Car"), + }, + + EventName.radarTempUnavailable: { + ET.SOFT_DISABLE: soft_disable_alert("Radar Temporarily Unavailable"), + ET.NO_ENTRY: NoEntryAlert("Radar Temporarily Unavailable"), + }, + + # Every frame from the camera should be processed by the model. If modeld + # is not processing frames fast enough they have to be dropped. This alert is + # thrown when over 20% of frames are dropped. + EventName.modeldLagging: { + ET.SOFT_DISABLE: soft_disable_alert("Driving Model Lagging"), + ET.NO_ENTRY: NoEntryAlert("Driving Model Lagging"), + ET.PERMANENT: modeld_lagging_alert, + }, + + # Besides predicting the path, lane lines and lead car data the model also + # predicts the current velocity and rotation speed of the car. If the model is + # very uncertain about the current velocity while the car is moving, this + # usually means the model has trouble understanding the scene. This is used + # as a heuristic to warn the driver. + EventName.posenetInvalid: { + ET.SOFT_DISABLE: soft_disable_alert("Posenet Speed Invalid"), + ET.NO_ENTRY: posenet_invalid_alert, + }, + + # When the localizer detects an acceleration of more than 40 m/s^2 (~4G) we + # alert the driver the device might have fallen from the windshield. + EventName.deviceFalling: { + ET.SOFT_DISABLE: soft_disable_alert("Device Fell Off Mount"), + ET.NO_ENTRY: NoEntryAlert("Device Fell Off Mount"), + }, + + EventName.lowMemory: { + ET.SOFT_DISABLE: soft_disable_alert("Low Memory: Reboot Your Device"), + ET.PERMANENT: low_memory_alert, + ET.NO_ENTRY: NoEntryAlert("Low Memory: Reboot Your Device"), + }, + + EventName.accFaulted: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"), + ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"), + ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"), + }, + + EventName.cruiseFaultLateralAllowed: { + ET.PERMANENT: NormalPermanentAlert("Cruise Faulted", "Lane Assist will continue to work", priority=Priority.LOWEST), + }, + + EventName.espActive: { + ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Active"), + ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Active"), + }, + + EventName.controlsMismatch: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch"), + ET.NO_ENTRY: NoEntryAlert("Controls Mismatch"), + }, + + # Sometimes the USB stack on the device can get into a bad state + # causing the connection to the panda to be lost + EventName.usbError: { + ET.SOFT_DISABLE: soft_disable_alert("USB Error: Reboot Your Device"), + ET.PERMANENT: NormalPermanentAlert("USB Error: Reboot Your Device"), + ET.NO_ENTRY: NoEntryAlert("USB Error: Reboot Your Device"), + }, + + # This alert can be thrown for the following reasons: + # - No CAN data received at all + # - CAN data is received, but some message are not received at the right frequency + # If you're not writing a new car port, this is usually cause by faulty wiring + # Minor canError: low-priority silent HUD badge only — no disable, no entry block, no audible/visual alert + EventName.canError: { + ET.PERMANENT: Alert( + "CAN Error", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.), + }, + + EventName.canBusMissing: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Bus Disconnected"), + ET.PERMANENT: Alert( + "CAN Bus Disconnected: Likely Faulty Cable", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.), + ET.NO_ENTRY: NoEntryAlert("CAN Bus Disconnected: Check Connections"), + }, + + EventName.steerUnavailable: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"), + ET.PERMANENT: NormalPermanentAlert("LKAS Fault: Restart the car to engage"), + ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"), + }, + + EventName.reverseGear: { + ET.PERMANENT: Alert( + "Reverse\nGear", + "", + AlertStatus.normal, AlertSize.full, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), + ET.USER_DISABLE: ImmediateDisableAlert("Reverse Gear"), + ET.NO_ENTRY: NoEntryAlert("Reverse Gear"), + }, + + # On cars that use stock ACC the car can decide to cancel ACC for various reasons. + # When this happens we can no long control the car so the user needs to be warned immediately. + EventName.cruiseDisabled: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Is Off"), + }, + + # When the relay in the harness box opens the CAN bus between the LKAS camera + # and the rest of the car is separated. When messages from the LKAS camera + # are received on the car side this usually means the relay hasn't opened correctly + # and this alert is thrown. + EventName.relayMalfunction: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Harness Relay Malfunction"), + ET.PERMANENT: NormalPermanentAlert("Harness Relay Malfunction", "Check Hardware"), + ET.NO_ENTRY: NoEntryAlert("Harness Relay Malfunction"), + }, + + EventName.speedTooLow: { + ET.IMMEDIATE_DISABLE: Alert( + "IQ.Pilot Canceled", + "Speed too low", + AlertStatus.normal, AlertSize.mid, + Priority.HIGH, VisualAlert.none, AudibleAlert.disengage, 3.), + }, + + # When the car is driving faster than most cars in the training data, the model outputs can be unpredictable. + EventName.speedTooHigh: { + ET.WARNING: Alert( + "Speed Too High", + "Model uncertain at this speed", + AlertStatus.userPrompt, AlertSize.mid, + Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 4.), + ET.NO_ENTRY: NoEntryAlert("Slow down to engage"), + }, + + EventName.vehicleSensorsInvalid: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Vehicle Sensors Invalid"), + ET.PERMANENT: NormalPermanentAlert("Vehicle Sensors Calibrating", "Drive to Calibrate"), + ET.NO_ENTRY: NoEntryAlert("Vehicle Sensors Calibrating"), + }, + + EventName.personalityChanged: { + ET.WARNING: personality_changed_alert, + }, + + EventName.userBookmark: { + ET.PERMANENT: NormalPermanentAlert("Bookmark Saved", duration=1.5), + }, + + EventName.audioFeedback: { + ET.PERMANENT: audio_feedback_alert, + }, +} + + +if HARDWARE.get_device_type() == 'mici': + EVENTS.update({ + EventName.preDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "", + AlertStatus.normal, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlert.none, 2), + }, + EventName.promptDriverDistracted: { + ET.PERMANENT: Alert( + "Pay Attention", + "Driver Distracted", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, 1), + }, + EventName.resumeRequired: { + ET.WARNING: Alert( + "Press Resume", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .2), + }, + EventName.preLaneChangeLeft: { + ET.WARNING: Alert( + "Steer Left", + "Confirm Lane Change", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + EventName.preLaneChangeRight: { + ET.WARNING: Alert( + "Steer Right", + "Confirm Lane Change", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, .1), + }, + EventName.laneChangeBlocked: { + ET.WARNING: Alert( + "Car in Blindspot", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1), + }, + EventName.steerSaturated: { + ET.WARNING: Alert( + "take control", + "turn exceeds limit", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.), + }, + EventName.calibrationIncomplete: { + ET.PERMANENT: calibration_incomplete_alert, + ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"), + ET.NO_ENTRY: NoEntryAlert("Calibrating"), + }, + EventName.reverseGear: { + ET.PERMANENT: Alert( + "Reverse", + "", + AlertStatus.normal, AlertSize.full, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), + ET.USER_DISABLE: ImmediateDisableAlert("Reverse"), + ET.NO_ENTRY: NoEntryAlert("Reverse"), + }, + }) + + +if __name__ == '__main__': + # print all alerts by type and priority + from iqpilot.cereal.services import SERVICE_LIST + from collections import defaultdict + + event_names = {v: k for k, v in EventName.schema.enumerants.items()} + alerts_by_type: dict[str, dict[Priority, list[str]]] = defaultdict(lambda: defaultdict(list)) + + CP = car.CarParams.new_message() + CS = car.CarState.new_message() + sm = messaging.SubMaster(list(SERVICE_LIST.keys())) + + for i, alerts in EVENTS.items(): + for et, alert in alerts.items(): + if callable(alert): + alert = alert(CP, CS, sm, False, 1, log.LongitudinalPersonality.standard) + alerts_by_type[et][alert.priority].append(event_names[i]) + + all_alerts: dict[str, list[tuple[Priority, list[str]]]] = {} + for et, priority_alerts in alerts_by_type.items(): + all_alerts[et] = sorted(priority_alerts.items(), key=lambda x: x[0], reverse=True) + + for status, evs in sorted(all_alerts.items(), key=lambda x: x[0]): + print(f"**** {status} ****") + for p, alert_list in evs: + print(f" {repr(p)}:") + print(" ", ', '.join(alert_list), "\n") diff --git a/iqpilot/selfdrive/selfdrived/helpers.py b/iqpilot/selfdrive/selfdrived/helpers.py new file mode 100644 index 000000000..ca0f30d21 --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/helpers.py @@ -0,0 +1,55 @@ +import math +from enum import StrEnum, auto + +from iqpilot.cereal import car, messaging +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.locationd.helpers import Pose +from iqdbc.car import ACCELERATION_DUE_TO_GRAVITY +from iqdbc.car.lateral import ISO_LATERAL_ACCEL +from iqdbc.car.interfaces import ACCEL_MIN, ACCEL_MAX + +MIN_EXCESSIVE_ACTUATION_COUNT = int(0.25 / DT_CTRL) +MIN_LATERAL_ENGAGE_BUFFER = int(1 / DT_CTRL) + + +class ExcessiveActuationType(StrEnum): + LONGITUDINAL = auto() + LATERAL = auto() + + +class ExcessiveActuationCheck: + def __init__(self): + self._excessive_counter = 0 + self._engaged_counter = 0 + + def update(self, sm: messaging.SubMaster, CS: car.CarState, calibrated_pose: Pose) -> ExcessiveActuationType | None: + # CS.aEgo can be noisy to bumps in the road, transitioning from standstill, losing traction, etc. + # longitudinal + accel_calibrated = calibrated_pose.acceleration.x + excessive_long_actuation = sm['carControl'].longActive and ((not CS.gasPressed and accel_calibrated > ACCEL_MAX * 2) or + accel_calibrated < ACCEL_MIN * 2) + + # lateral + yaw_rate = calibrated_pose.angular_velocity.yaw + roll = sm['vehicleParameters'].roll + roll_compensated_lateral_accel = (CS.vEgo * yaw_rate) - (math.sin(roll) * ACCELERATION_DUE_TO_GRAVITY) + + # Prevent false positives after overriding + excessive_lat_actuation = False + self._engaged_counter = self._engaged_counter + 1 if sm['carControl'].latActive and not CS.steeringPressed else 0 + if self._engaged_counter > MIN_LATERAL_ENGAGE_BUFFER: + if abs(roll_compensated_lateral_accel) > ISO_LATERAL_ACCEL * 2: + excessive_lat_actuation = True + + # deviceMotion acceleration can be noisy due to bad mounting or aliased deviceMotion measurements + livepose_valid = abs(CS.aEgo - accel_calibrated) < 2 + self._excessive_counter = self._excessive_counter + 1 if livepose_valid and (excessive_long_actuation or excessive_lat_actuation) else 0 + + excessive_type = None + if self._excessive_counter > MIN_EXCESSIVE_ACTUATION_COUNT: + if excessive_long_actuation: + excessive_type = ExcessiveActuationType.LONGITUDINAL + else: + excessive_type = ExcessiveActuationType.LATERAL + + return excessive_type diff --git a/iqpilot/selfdrive/selfdrived/iq_events.py b/iqpilot/selfdrive/selfdrived/iq_events.py new file mode 100644 index 000000000..f9951ea5b --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/iq_events.py @@ -0,0 +1,399 @@ +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import log, car, custom +from iqpilot.common.params import Params +from iqpilot.common.constants import CV +from iqpilot.common.atlas_alerts import EventBook as EventsBase, Tier as Priority, Tags as ET, AlertCard as Alert, \ + NoEntryCard as NoEntryAlert, HardDisableCard as ImmediateDisableAlert, ChimeCard as EngagementAlert, \ + BannerCard as NormalPermanentAlert, AlertFactory as AlertCallbackType, car_mode_entry_alert as wrong_car_mode_alert +from iqpilot.selfdrive.controls.lib.speed_limit_controller import SpeedLimitAssistState + + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus +VisualAlert = car.CarControl.HUDControl.VisualAlert +AudibleAlert = car.CarControl.HUDControl.AudibleAlert +AudibleAlertIQ = custom.IQState.AudibleAlert +EventNameIQ = custom.IQOnroadEvent.EventName + + +# get event name from enum +EVENT_NAME_IQ = {v: k for k, v in EventNameIQ.schema.enumerants.items()} + + +def _get_longitudinal_plan_ext(sm: messaging.SubMaster): + return sm['iqPlan'] + + +def speed_limit_adjust_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + plan = _get_longitudinal_plan_ext(sm) + resolver = plan.speedLimit.resolver + assist = plan.speedLimit.assist + speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH + speed = round(resolver.speedLimit * speed_conv) + unit = "km/h" if metric else "mph" + if assist.state == SpeedLimitAssistState.adapting: + message = f"Speed Limit: Adjusting to {speed} {unit}" + else: + message = f"Speed Limit: Active at {speed} {unit}" + return Alert( + message, + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 4.) + + +def speed_limit_pre_active_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + plan = _get_longitudinal_plan_ext(sm) + resolver = plan.speedLimit.resolver + speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH + unit = "km/h" if metric else "mph" + pending_speed = round(resolver.speedLimit * speed_conv) + last_speed = resolver.speedLimitFinalLast * speed_conv + is_lower = pending_speed < last_speed or last_speed <= 0 + confirm_hint = "SET" if is_lower else "RES" + return Alert( + f"Speed Limit: {pending_speed} {unit}", + f"Press {confirm_hint} to apply", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlertIQ.promptSingleLow, .1) + + +def speed_limit_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + resolver = _get_longitudinal_plan_ext(sm).speedLimit.resolver + speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH + speed = round(resolver.speedLimit * speed_conv) + unit = "km/h" if metric else "mph" + return Alert( + f"Speed Limit changed to {speed} {unit}", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlertIQ.promptSingleHigh, 3.) + + +def construction_zone_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + resolver = _get_longitudinal_plan_ext(sm).speedLimit.resolver + speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH + speed = round(resolver.speedLimit * speed_conv) + unit = "KM/H" if metric else "MPH" + return Alert( + f"Construction Zone Detected: Speed {speed} {unit}", + "", + AlertStatus.userPrompt, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlertIQ.promptSingleHigh, 4.) + + +_CAMERA_LABELS = { + int(custom.IQNavState.CameraType.fixedSpeed): "Speed Camera", + int(custom.IQNavState.CameraType.mobileSpeed): "Mobile Speed Camera", + int(custom.IQNavState.CameraType.sectionStart): "Average-Speed Zone", + int(custom.IQNavState.CameraType.sectionEnd): "Average-Speed Zone Ends", + int(custom.IQNavState.CameraType.averageZone): "Average-Speed Zone", + int(custom.IQNavState.CameraType.redLight): "Red-Light Camera", + int(custom.IQNavState.CameraType.bump): "Speed Bump", + int(custom.IQNavState.CameraType.alpr): "Flock / ALPR Camera", + int(custom.IQNavState.CameraType.police): "Police Reported Ahead", +} + +_POLICE_CHIMED_IDS: set[str] = set() +_USA_REGION_CODES = frozenset(("US", "USA", "UNITED STATES", "UNITED STATES OF AMERICA")) + + +def _configured_country_code() -> str: + try: + value = Params().get("OsmLocationName") + except Exception: + return "" + if isinstance(value, bytes): + value = value.decode("utf-8", "ignore") + return str(value or "").strip().upper() + + +def _alpr_alert_labels(country_code: str) -> tuple[str, str]: + is_row = bool(country_code) and country_code not in _USA_REGION_CODES + if is_row: + return "Traffic / ALPR Camera", "Traffic / ALPR Camera Detected" + return "Flock / ALPR Camera", "Flock Camera Detected" + + +def speed_camera_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert: + nav = sm['iqNavState'] + ctype = int(getattr(nav.cameraType, "raw", nav.cameraType)) + label = _CAMERA_LABELS.get(ctype, "Speed Camera") + distance = float(nav.cameraDistance) + alpr_detected_label = "Flock Camera Detected" + if ctype == int(custom.IQNavState.CameraType.alpr): + label, alpr_detected_label = _alpr_alert_labels(_configured_country_code()) + # RF (BLE/WiFi) Flock detection is a live proximity hit with no meaningful + # distance — flockd/navd flag it with distance 0 on the alpr camera type. + if ctype == int(custom.IQNavState.CameraType.alpr) and distance <= 0.0: + return Alert( + alpr_detected_label, + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .2) + if metric: + dist_str = f"{distance:.0f} m" if distance < 1000.0 else f"{distance / 1000.0:.1f} km" + else: + feet = distance * 3.28084 + dist_str = f"{int(round(feet / 10.0) * 10)} ft" if feet < 1000.0 else f"{distance * 0.000621371:.1f} mi" + detail = dist_str + if float(nav.cameraSpeedLimit) > 0.0: + speed_conv = CV.MS_TO_KPH if metric else CV.MS_TO_MPH + unit = "km/h" if metric else "mph" + detail += f" â€ĸ {round(float(nav.cameraSpeedLimit) * speed_conv)} {unit}" + audible = AudibleAlert.prompt + if ctype == int(custom.IQNavState.CameraType.police): + report_id = str(getattr(nav, "cameraAlertId", "")) + should_chime = bool(getattr(nav, "cameraChime", False)) and bool(report_id) and report_id not in _POLICE_CHIMED_IDS + if should_chime: + _POLICE_CHIMED_IDS.add(report_id) + if len(_POLICE_CHIMED_IDS) > 256: + _POLICE_CHIMED_IDS.clear() + _POLICE_CHIMED_IDS.add(report_id) + else: + audible = AudibleAlert.none + return Alert( + f"{label} â€ĸ {detail}", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW if ctype == int(custom.IQNavState.CameraType.alpr) else Priority.HIGH, + VisualAlert.none, audible, .2) + + +class IQEvents(EventsBase): + def __init__(self): + super().__init__() + self.event_counters = dict.fromkeys(EVENTS_IQ.keys(), 0) + + def get_events_mapping(self) -> dict[int, dict[str, Alert | AlertCallbackType]]: + return EVENTS_IQ + + def get_event_name(self, event: int): + return EVENT_NAME_IQ[event] + + def get_event_msg_type(self): + return custom.IQOnroadEvent.Event + + +EVENTS_IQ_TYPE = dict[int, dict[str, Alert | AlertCallbackType]] + +_GUIDANCE_EVENTS: EVENTS_IQ_TYPE = { + EventNameIQ.lateralEdgeBlocked: { + ET.WARNING: Alert( + "Lane Change Blocked", + "Road edge detected", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1), + }, + + EventNameIQ.speedLimitActive: { + ET.WARNING: speed_limit_adjust_alert, + }, + + EventNameIQ.speedLimitPreActive: { + ET.WARNING: speed_limit_pre_active_alert, + }, + + EventNameIQ.speedLimitChanged: { + ET.WARNING: speed_limit_changed_alert, + }, + + EventNameIQ.speedCameraAhead: { + ET.WARNING: speed_camera_alert, + }, + + EventNameIQ.constructionZoneDetected: { + ET.WARNING: construction_zone_alert, + }, + + EventNameIQ.navExitLeft: { + ET.WARNING: Alert( + "Navigation: Exit Maneuver", + "Nudge the wheel left to change lanes", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.none, AudibleAlert.prompt, 1.5), + }, + + EventNameIQ.navExitRight: { + ET.WARNING: Alert( + "Navigation: Exit Maneuver", + "Nudge the wheel right to change lanes", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.none, AudibleAlert.prompt, 1.5), + }, + + EventNameIQ.navTurnLeft: { + ET.WARNING: Alert( + "Navigation: Turning Left", + "", + AlertStatus.normal, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlert.none, 1.5), + }, + + EventNameIQ.navTurnRight: { + ET.WARNING: Alert( + "Navigation: Turning Right", + "", + AlertStatus.normal, AlertSize.small, + Priority.MID, VisualAlert.none, AudibleAlert.none, 1.5), + }, + + EventNameIQ.modelTurnLeft: { + ET.WARNING: Alert( + "Lane Turn Left", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.), + }, + + EventNameIQ.modelTurnRight: { + ET.WARNING: Alert( + "Lane Turn Right", + "", + AlertStatus.normal, AlertSize.small, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.), + }, + +} + +_ENGAGE_EVENTS: EVENTS_IQ_TYPE = { + EventNameIQ.alcEngaged: { + ET.ENABLE: EngagementAlert(AudibleAlert.engage), + }, + + EventNameIQ.alcEngagedSilent: { + ET.ENABLE: EngagementAlert(AudibleAlert.none), + }, + + EventNameIQ.alcDisengaged: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage), + }, + + EventNameIQ.alcDisengagedSilent: { + ET.USER_DISABLE: EngagementAlert(AudibleAlert.none), + }, + + EventNameIQ.steerManually: { + ET.USER_DISABLE: Alert( + "Lane Centering Off", + "Steer Manually", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.disengage, 1.), + }, + + EventNameIQ.speedManually: { + ET.WARNING: Alert( + "Adaptive Cruise Off", + "Control Speed Manually", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.), + }, + + EventNameIQ.steeringOverrideReengageAlc: { + ET.WARNING: Alert( + "Steering Overridden By Driver", + "Double Tap SET or Cycle the Cruise Main to Re-Engage ALC", + AlertStatus.userPrompt, AlertSize.mid, + Priority.MID, VisualAlert.none, AudibleAlert.prompt, 2.0), + }, + + EventNameIQ.latMismatch: { + ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Lateral Controls Mismatch"), + ET.NO_ENTRY: NoEntryAlert("Lateral Controls Mismatch"), + }, + +} + +_CABIN_BLOCK_EVENTS: EVENTS_IQ_TYPE = { + EventNameIQ.brakeHoldSilent: { + ET.WARNING: EngagementAlert(AudibleAlert.none), + ET.NO_ENTRY: NoEntryAlert("Brake Hold Engaged"), + }, + + EventNameIQ.gearNotDriveSilent: { + ET.WARNING: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + ET.NO_ENTRY: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 0.), + }, + + EventNameIQ.parkBrakeSilent: { + ET.WARNING: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + ET.NO_ENTRY: NoEntryAlert("Parking Brake On"), + }, + + EventNameIQ.doorAjarSilent: { + ET.WARNING: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + ET.NO_ENTRY: NoEntryAlert("Door Ajar"), + }, + + EventNameIQ.seatbeltUnbuckledSilent: { + ET.WARNING: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.), + ET.NO_ENTRY: NoEntryAlert("Seatbelt Unbuckled"), + }, + + EventNameIQ.reverseSilent: { + ET.PERMANENT: Alert( + "In\nReverse", + "", + AlertStatus.normal, AlertSize.full, + Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5), + ET.NO_ENTRY: NoEntryAlert("In Reverse"), + }, + +} + +_NOTICE_EVENTS: EVENTS_IQ_TYPE = { + EventNameIQ.carModeMismatchNotice: { + ET.WARNING: wrong_car_mode_alert, + }, + + EventNameIQ.pedalHeldNotice: { + ET.WARNING: NoEntryAlert("Brake Pedal Held") + }, + + EventNameIQ.experimentalToggled: { + ET.WARNING: NormalPermanentAlert("Switched to IQ.Pilot End to End Control", duration=1.5) + }, + + EventNameIQ.e2eChime: { + ET.PERMANENT: Alert( + "", + "", + AlertStatus.normal, AlertSize.none, + Priority.MID, VisualAlert.none, AudibleAlert.prompt, 3.), + }, + + EventNameIQ.wideCamFaulty: { + ET.PERMANENT: NormalPermanentAlert("Wide Cam Faulty", + "IQ.Pilot still available, degraded via road cam only", + priority=Priority.LOW), + }, + + EventNameIQ.modelUpdating: { + ET.NO_ENTRY: NoEntryAlert("Update finishes while parked with internet", + alert_text_1="Driving Model Updating", + priority=Priority.MID), + }, + +} + +EVENTS_IQ: EVENTS_IQ_TYPE = {**_GUIDANCE_EVENTS, **_ENGAGE_EVENTS, **_CABIN_BLOCK_EVENTS, **_NOTICE_EVENTS} diff --git a/iqpilot/selfdrive/selfdrived/selfdrived.py b/iqpilot/selfdrive/selfdrived/selfdrived.py new file mode 100755 index 000000000..3a7e7bec2 --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/selfdrived.py @@ -0,0 +1,807 @@ +#!/usr/bin/env python3 +import os +import time +import threading + +import iqpilot.cereal.messaging as messaging + +from iqpilot.cereal import car, log, custom +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionIpcClient + + +from iqpilot.common.params import Params +from iqpilot.common.issue_debug import log_issue_limited +from iqpilot.common.realtime import config_background_thread, config_realtime_process, lock_memory, Priority, Ratekeeper, DT_CTRL +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.gps import get_gps_location_service + +from iqpilot.selfdrive.car.car_specific import CarSpecificEvents +from iqpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose +from iqpilot.selfdrive.selfdrived.events import Events, ET +from iqpilot.selfdrive.selfdrived.helpers import ExcessiveActuationCheck +from iqpilot.selfdrive.selfdrived.state import StateMachine +from iqpilot.selfdrive.selfdrived.alertmanager import AlertManager, set_offroad_alert +from iqpilot.selfdrive.longitudinal_settings import get_runtime_personality + +from iqpilot.system.version import get_build_metadata +from iqpilot.system.hardware import HARDWARE + +from iqpilot.sab.behavior import SteeringAssistanceBehavior +from iqpilot.selfdrive.controls.lib.helpers.lane_change import NAV_EXIT_COMMIT_DISTANCE +from iqpilot.vehicle.vehicle import VehicleEvents +from iqpilot.selfdrive.car.gap_button_actions import GapButtonActions +from iqpilot.selfdrive.selfdrived.iq_events import IQEvents + +REPLAY = "REPLAY" in os.environ +SIMULATION = "SIMULATION" in os.environ +TESTING_CLOSET = "TESTING_CLOSET" in os.environ + +WIDE_CAM_FAULTY_ALERT_FRAMES = int(300. / DT_CTRL) + +LONGITUDINAL_PERSONALITY_MAP = {v: k for k, v in log.LongitudinalPersonality.schema.enumerants.items()} + +ThermalStatus = log.DeviceState.ThermalStatus +State = log.SelfdriveState.OpenpilotState +PandaType = log.PandaState.PandaType +LaneChangeState = log.LaneChangeState +LaneChangeDirection = log.LaneChangeDirection +EventName = log.OnroadEvent.EventName +ButtonType = car.CarState.ButtonEvent.Type +SafetyModel = car.CarParams.SafetyModel +TurnDirection = custom.IQTurnSignalDirection + +IGNORED_SAFETY_MODES = (SafetyModel.silent, SafetyModel.noOutput) + +NON_BLOCKING_PROCESSES = {'mapd', 'iqmapd', 'navd', 'navincidentd', 'navrenderd'} + + +def _cleanup_startup_params(CP: car.CarParams, params: Params) -> None: + if not CP.alphaLongitudinalAvailable or not CP.openpilotLongitudinalControl: + return + + +class SelfdriveD(GapButtonActions): + def __init__(self, CP=None, CP_IQ=None): + self.params = Params() + + # Ensure the current branch is cached, otherwise the first cycle lags + build_metadata = get_build_metadata() + + if CP is None: + cloudlog.info("selfdrived is waiting for CarParams") + self.CP = messaging.log_from_bytes(self.params.get("CarParams", block=True), car.CarParams) + cloudlog.info("selfdrived got CarParams") + else: + self.CP = CP + + if CP_IQ is None: + cloudlog.info("selfdrived is waiting for IQCarParams") + self.CP_IQ = messaging.log_from_bytes(self.params.get("IQCarParams", block=True), custom.IQCarParams) + cloudlog.info("selfdrived got IQCarParams") + else: + self.CP_IQ = CP_IQ + + self.car_events = CarSpecificEvents(self.CP) + + self.pose_calibrator = PoseCalibrator() + self.calibrated_pose: Pose | None = None + self.excessive_actuation_check = ExcessiveActuationCheck() + self.excessive_actuation = self.params.get("Offroad_ExcessiveActuation") is not None + + # Setup sockets + self.pm = messaging.PubMaster(['selfdriveState', 'onroadEvents'] + ['iqState', 'iqOnroadEvents']) + + self.gps_location_service = get_gps_location_service(self.params) + self.gps_packets = [self.gps_location_service] + self.sensor_packets = ["accelerometer", "gyroscope"] + self.camera_packets = ["roadCameraState", "driverCameraState", "wideRoadCameraState"] + if os.path.exists('/tmp/lite_hw'): + self.camera_packets.remove("driverCameraState") + + # TODO: de-couple selfdrived with card/conflate on carState without introducing controls mismatches + self.car_state_sock = messaging.sub_sock('carState', timeout=20) + + ignore = self.sensor_packets + self.gps_packets + ['alertDebug', 'lateralManeuverPlan', 'iqDriveModelData', 'iqNavState', 'vehicleParameters', 'driverAssistance', 'testJoystick'] + if os.path.exists('/tmp/lite_hw'): + ignore += ['driverCameraState', 'driverMonitoringState'] + if SIMULATION: + ignore += ['driverCameraState', 'managerState'] + if REPLAY: + # no vipc in replay will make them ignored anyways + ignore += ['roadCameraState', 'wideRoadCameraState', 'userBookmark', 'iqPlan'] + self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'extrinsicsCalibration', + 'carOutput', 'driverMonitoringState', 'longitudinalPlan', 'deviceMotion', 'lateralDelay', + 'managerState', 'vehicleParameters', 'radarState', 'lateralTorqueParameters', + 'controlsState', 'carControl', 'driverAssistance', 'alertDebug', 'userBookmark', 'audioFeedback', + 'lateralManeuverPlan', + 'iqDriveModelData', 'iqNavState', 'iqPlan', 'testJoystick'] + \ + self.camera_packets + self.sensor_packets + self.gps_packets, + ignore_alive=ignore, ignore_avg_freq=ignore, + ignore_valid=ignore, frequency=int(1/DT_CTRL)) + + # read params + self.is_metric = self.params.get_bool("IsMetric") + self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled") + self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") + self.nav_exit_lane_change = self._read_nav_exit_lane_change() + self.model_download_pending = self.params.get("ModelManager_DownloadIndex") is not None + + car_recognized = self.CP.brand != 'mock' + + _cleanup_startup_params(self.CP, self.params) + + self.CS_prev = car.CarState.new_message() + self.AM = AlertManager() + self.events = Events() + + self.initialized = False + self.big_model_loading = False + self.big_model_active = False + self.big_model_failed = False + self.enabled = False + self.active = False + self.mismatch_counter = 0 + self.cruise_mismatch_counter = 0 + self.last_steering_pressed_frame = 0 + self.distance_traveled = 0 + self.last_functional_fan_frame = 0 + self.events_prev = [] + self.logged_comm_issue = None + self.not_running_prev = None + self.wide_cam_faulty = False + self.experimental_mode = False + self.personality = get_runtime_personality(self.params) + self.recalibrating_seen = False + self.state_machine = StateMachine() + self.rk = Ratekeeper(100, print_delay_threshold=None) + + self.ignored_processes = set(NON_BLOCKING_PROCESSES) + nvme_expected = os.path.exists('/dev/nvme0n1') or (not os.path.isfile("/persist/comma/living-in-the-moment")) + if HARDWARE.get_device_type() == 'tici' and nvme_expected: + self.ignored_processes.add('loggerd') + + # Determine startup event + is_remote = build_metadata.openpilot.comma_remote or build_metadata.openpilot.iqpilot_remote + self.startup_event = EventName.startup if is_remote and build_metadata.tested_channel else EventName.startupMaster + if HARDWARE.get_device_type() == 'mici': + self.startup_event = None + if not car_recognized: + self.startup_event = EventName.startupNoCar + elif car_recognized and self.CP.passive: + self.startup_event = EventName.startupNoControl + elif self.CP.secOcRequired and not self.CP.secOcKeyAvailable: + self.startup_event = EventName.startupNoSecOcKey + + if not car_recognized: + self.events.add(EventName.carUnrecognized, static=True) + set_offroad_alert("Offroad_CarUnrecognized", True) + elif self.CP.passive: + self.events.add(EventName.dashcamMode, static=True) + + self.events_iq = IQEvents() + self.events_iq_prev = [] + self._cached_dm_event_names: tuple[int, ...] = () + self._cached_plan_event_names: tuple[int, ...] = () + self._cached_model_event_names: tuple[int, ...] = () + self._cached_nav_event_names: tuple[int, ...] = () + + self.aol = SteeringAssistanceBehavior(self) + self.car_events_iq = VehicleEvents(self.CP, self.CP_IQ) + + GapButtonActions.__init__(self, self.CP) + + def _add_iq_event_names(self, event_names: tuple[int, ...] | list[int]) -> None: + for event_name in event_names: + self.events_iq.add(event_name) + + def _add_event_names(self, event_names: tuple[int, ...] | list[int]) -> None: + for event_name in event_names: + self.events.add(event_name) + + def _refresh_cached_plan_events(self) -> None: + if self.sm.updated['iqPlan']: + self._cached_plan_event_names = tuple(event.name.raw for event in self._get_longitudinal_plan_ext().events) + + def _refresh_cached_dm_events(self) -> None: + if self.sm.updated['driverMonitoringState']: + self._cached_dm_event_names = tuple(event.name.raw for event in self.sm['driverMonitoringState'].events) + + def _refresh_cached_model_events(self) -> None: + if not self.sm.updated['iqDriveModelData']: + return + + model_data = self._get_model_data_ext() + model_events = [] + if model_data.lateralEdgeBlock != custom.IQLateralEdgeBlock.none: + model_events.append(custom.IQOnroadEvent.EventName.lateralEdgeBlocked) + + lane_turn_direction = model_data.turnSignalDirection + if lane_turn_direction == TurnDirection.turnLeft: + model_events.append(custom.IQOnroadEvent.EventName.modelTurnLeft) + elif lane_turn_direction == TurnDirection.turnRight: + model_events.append(custom.IQOnroadEvent.EventName.modelTurnRight) + self._cached_model_event_names = tuple(model_events) + + def _read_nav_exit_lane_change(self) -> bool: + try: + return self.params.get_bool("NavExitLaneChange") + except Exception: + return False + + def _refresh_cached_nav_events(self) -> None: + if not self.sm.updated['iqNavState']: + return + + nav_state = self.sm['iqNavState'] + nav_events: list[int] = [] + if getattr(nav_state, 'active', False): + if getattr(nav_state, 'navTurnDesireDirection', 0) == 1: + nav_events.append(custom.IQOnroadEvent.EventName.navTurnLeft) + elif getattr(nav_state, 'navTurnDesireDirection', 0) == 2: + nav_events.append(custom.IQOnroadEvent.EventName.navTurnRight) + elif self.nav_exit_lane_change and \ + getattr(nav_state, 'nextManeuverValid', False) and \ + getattr(nav_state, 'nextManeuverType', custom.IQNavState.ManeuverType.none) == custom.IQNavState.ManeuverType.exit and \ + 0.0 < float(getattr(nav_state, 'nextManeuverDistance', 0.0)) <= NAV_EXIT_COMMIT_DISTANCE: + if getattr(nav_state, 'nextManeuverDirection', 0) == 1: + nav_events.append(custom.IQOnroadEvent.EventName.navExitLeft) + elif getattr(nav_state, 'nextManeuverDirection', 0) == 2: + nav_events.append(custom.IQOnroadEvent.EventName.navExitRight) + + if getattr(nav_state, 'cameraValid', False): + nav_events.append(custom.IQOnroadEvent.EventName.speedCameraAhead) + + self._cached_nav_event_names = tuple(nav_events) + + def update_events(self, CS): + """Compute onroadEvents from carState""" + + self.events.clear() + self.events_iq.clear() + + if self.sm['controlsState'].lateralControlState.which() == 'debugState': + self.events.add(EventName.joystickDebug) + self.startup_event = None + + if self.sm['deviceState'].egpuDockPresent or self.params.get_bool("IQEgpuEnabled") or self.big_model_active: + loading = self.params.get_bool("UsbGpuLoading") + self.big_model_loading = loading + if self.big_model_loading: + self.events.add(EventName.bigModelLoading) + + big_active = self.params.get("UsbGpuActive") + dock_present = self.sm['deviceState'].egpuDockPresent + mac_active = self.params.get_bool("MacModelActive") + model_unavailable = big_active is True and self.sm.seen['modelV2'] and not self.sm.alive['modelV2'] + # an explicit False before this session's first activation is just the selector arming + # (it pre-clears the param on startup); alerting on it pops "big model failed" on every + # return to the road until the latch warms up + big_failed = ((self.big_model_active and big_active is False) or model_unavailable + or (self.big_model_active and not dock_present)) and not mac_active + if big_failed: + self.events.add(EventName.bigModelFailed) + self.big_model_failed = big_failed + + # soft disable if the big model fails + if big_active: + self.big_model_active = True + if mac_active or (not self.enabled and not model_unavailable): + self.big_model_active = False + + if self.sm.recv_frame['lateralManeuverPlan'] > 0: + self.events.add(EventName.lateralManeuver) + self.startup_event = None + elif self.sm.recv_frame['alertDebug'] > 0: + self.events.add(EventName.longitudinalManeuver) + self.startup_event = None + + # Add startup event + if self.startup_event is not None: + self.events.add(self.startup_event) + self.startup_event = None + + # Don't add any more events if not initialized + if not self.initialized: + self.events.add(EventName.selfdriveInitializing) + return + + # Check for user bookmark press (bookmark button or end of LKAS button feedback) + if self.sm.updated['userBookmark']: + self.events.add(EventName.userBookmark) + + if self.sm.updated['audioFeedback']: + self.events.add(EventName.audioFeedback) + + # Don't add any more events while in dashcam mode + if self.CP.passive: + return + + # Block resume if cruise never previously enabled + resume_pressed = any(be.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for be in CS.buttonEvents) + volkswagen_op_long = self.CP.brand == "volkswagen" and self.CP.openpilotLongitudinalControl + if not self.CP.pcmCruise and CS.vCruise > 250 and resume_pressed and not volkswagen_op_long: + self.events.add(EventName.resumeBlocked) + + if not self.CP.notCar: + self._refresh_cached_dm_events() + self._add_event_names(self._cached_dm_event_names) + self._refresh_cached_plan_events() + self._add_iq_event_names(self._cached_plan_event_names) + + # Add car events, ignore if CAN isn't valid + if CS.canValid: + car_events = self.car_events.update(CS, self.CS_prev, self.sm['carControl']).to_msg() + self.events.add_from_msg(car_events) + + car_events_iq = self.car_events_iq.update(CS, self.events) + self._add_iq_event_names(car_events_iq.names) + + if self.CP.notCar: + # wait for everything to init first + if self.sm.frame > int(5. / DT_CTRL) and self.initialized: + # body always wants to enable + self.events.add(EventName.pcmEnable) + + # Disable on rising edge of accelerator or brake. Also disable on brake when speed > 0 + if (CS.gasPressed and not self.CS_prev.gasPressed and self.disengage_on_accelerator) or \ + (CS.brakePressed and (not self.CS_prev.brakePressed or not CS.standstill)) or \ + (CS.regenBraking and (not self.CS_prev.regenBraking or not CS.standstill)): + self.events.add(EventName.pedalPressed) + + # Create events for temperature, disk space, and memory + if self.sm['deviceState'].thermalStatus >= ThermalStatus.red: + self.events.add(EventName.overheat) + if self.sm['deviceState'].freeSpacePercent < 7 and not SIMULATION: + self.events.add(EventName.outOfSpace) + if self.sm['deviceState'].memoryUsagePercent > 95 and not SIMULATION: + self.events.add(EventName.lowMemory) + + # Alert if fan isn't spinning for 5 seconds + if self.sm['peripheralState'].pandaType != log.PandaState.PandaType.unknown: + if self.sm['peripheralState'].fanSpeedRpm < 500 and self.sm['deviceState'].fanSpeedPercentDesired > 50: + # allow enough time for the fan controller in the panda to recover from stalls + if (self.sm.frame - self.last_functional_fan_frame) * DT_CTRL > 15.0: + self.events.add(EventName.fanMalfunction) + else: + self.last_functional_fan_frame = self.sm.frame + + # Handle calibration status + cal_status = self.sm['extrinsicsCalibration'].calStatus + if cal_status != log.ExtrinsicsCalibration.Status.calibrated: + if cal_status == log.ExtrinsicsCalibration.Status.uncalibrated: + self.events.add(EventName.calibrationIncomplete) + elif cal_status == log.ExtrinsicsCalibration.Status.recalibrating: + if not self.recalibrating_seen: + set_offroad_alert("Offroad_Recalibration", True) + self.recalibrating_seen = True + self.events.add(EventName.calibrationRecalibrating) + else: + self.events.add(EventName.calibrationInvalid) + + # Lane departure warning + if self.is_ldw_enabled and self.sm.valid['driverAssistance']: + if self.sm['driverAssistance'].leftLaneDeparture or self.sm['driverAssistance'].rightLaneDeparture: + self.events.add(EventName.ldw) + + # ****************************************************************************************** + # NOTE: To fork maintainers. + # Disabling or nerfing safety features will get you and your users banned from our servers. + # We recommend that you do not change these numbers from the defaults. + if self.sm.updated['extrinsicsCalibration']: + self.pose_calibrator.feed_live_calib(self.sm['extrinsicsCalibration']) + if self.sm.updated['deviceMotion']: + device_pose = Pose.from_live_pose(self.sm['deviceMotion']) + self.calibrated_pose = self.pose_calibrator.build_calibrated_pose(device_pose) + + if self.calibrated_pose is not None: + excessive_actuation = self.excessive_actuation_check.update(self.sm, CS, self.calibrated_pose) + if not self.excessive_actuation and excessive_actuation is not None: + set_offroad_alert("Offroad_ExcessiveActuation", True, extra_text=str(excessive_actuation)) + self.excessive_actuation = True + + if self.excessive_actuation: + self.events.add(EventName.excessiveActuation) + # ****************************************************************************************** + + # Handle lane change + if self.sm['modelV2'].meta.laneChangeState == LaneChangeState.preLaneChange: + direction = self.sm['modelV2'].meta.laneChangeDirection + if (CS.leftBlindspot and direction == LaneChangeDirection.left) or \ + (CS.rightBlindspot and direction == LaneChangeDirection.right): + self.events.add(EventName.laneChangeBlocked) + else: + if direction == LaneChangeDirection.left: + self.events.add(EventName.preLaneChangeLeft) + else: + self.events.add(EventName.preLaneChangeRight) + elif self.sm['modelV2'].meta.laneChangeState in (LaneChangeState.laneChangeStarting, + LaneChangeState.laneChangeFinishing): + self.events.add(EventName.laneChange) + + # Handle lane turn + self._refresh_cached_model_events() + self._add_iq_event_names(self._cached_model_event_names) + + self._refresh_cached_nav_events() + self._add_iq_event_names(self._cached_nav_event_names) + + for i, pandaState in enumerate(self.sm['pandaStates']): + # All pandas must match the list of safetyConfigs, and if outside this list, must be silent or noOutput + if i < len(self.CP.safetyConfigs): + safety_mismatch = pandaState.safetyModel != self.CP.safetyConfigs[i].safetyModel or \ + pandaState.safetyParam != self.CP.safetyConfigs[i].safetyParam or \ + pandaState.alternativeExperience != self.CP.alternativeExperience + else: + safety_mismatch = pandaState.safetyModel not in IGNORED_SAFETY_MODES + + # safety mismatch allows some time for pandad to set the safety mode and publish it back from panda + if (safety_mismatch and self.sm.frame*DT_CTRL > 10.) or \ + pandaState.safetyRxChecksInvalid or \ + self.mismatch_counter >= 200: + self.events.add(EventName.controlsMismatch) + + if log.PandaState.FaultType.relayMalfunction in pandaState.faults: + self.events.add(EventName.relayMalfunction) + + # Handle HW and system malfunctions + # Order is very intentional here. Be careful when modifying this. + # All events here should at least have NO_ENTRY and SOFT_DISABLE. + num_events = len(self.events) + + not_running = {p.name for p in self.sm['managerState'].processes if not p.running and p.shouldBeRunning} + if self.sm.recv_frame['managerState'] and len(not_running): + if not_running != self.not_running_prev: + cloudlog.event("process_not_running", not_running=not_running, error=True) + self.not_running_prev = not_running + if self.sm.recv_frame['managerState'] and (not_running - self.ignored_processes): + self.events.add(EventName.processNotRunning) + if 'iqmodeld' in not_running and self.model_download_pending: + self.events_iq.add(custom.IQOnroadEvent.EventName.modelUpdating) + else: + if not SIMULATION and not self.rk.lagging: + if not self.sm.all_alive(self.camera_packets): + self.events.add(EventName.cameraMalfunction) + elif not self.sm.all_freq_ok(self.camera_packets): + self.events.add(EventName.cameraFrameRate) + + if self.sm.frame < WIDE_CAM_FAULTY_ALERT_FRAMES: + if self.sm.frame % int(1. / DT_CTRL) == 0: + self.wide_cam_faulty = self.params.get_bool("WideCamFaulty") + if self.wide_cam_faulty: + self.events_iq.add(custom.IQOnroadEvent.EventName.wideCamFaulty) + + if not REPLAY and self.rk.lagging: + log_issue_limited( + "selfdrived_lagging", + "lag", + f"selfdrived lagging avg_dt={self.rk.avg_dt.get_average() * 1000:.2f}ms frame={self.sm.frame}", + interval_sec=1.0, + ) + self.events.add(EventName.selfdrivedLagging) + if self.sm['radarState'].radarErrors.canError: + self.events.add(EventName.canError) + elif self.sm['radarState'].radarErrors.radarUnavailableTemporary: + self.events.add(EventName.radarTempUnavailable) + elif any(self.sm['radarState'].radarErrors.to_dict().values()): + self.events.add(EventName.radarFault) + if not self.sm.valid['pandaStates']: + self.events.add(EventName.usbError) + if CS.canTimeout: + self.events.add(EventName.canBusMissing) + elif not CS.canValid: + self.events.add(EventName.canError) + + # generic catch-all. ideally, a more specific event should be added above instead + has_disable_events = self.events.contains(ET.NO_ENTRY) and (self.events.contains(ET.SOFT_DISABLE) or self.events.contains(ET.IMMEDIATE_DISABLE)) + no_system_errors = (not has_disable_events) or (len(self.events) == num_events) + logs = self._comm_issue_logs() + has_not_alive = len(logs['not_alive']) > 0 + has_not_freq = len(logs['not_freq_ok']) > 0 + comm_issue_state = (tuple(logs['not_alive']), tuple(logs['not_freq_ok'])) + if (has_not_alive or has_not_freq) and no_system_errors: + if has_not_alive: + self.events.add(EventName.commIssue) + else: + self.events.add(EventName.commIssueAvgFreq) + + if comm_issue_state != self.logged_comm_issue: + cloudlog.event("commIssue", error=True, **logs) + self.logged_comm_issue = comm_issue_state + else: + self.logged_comm_issue = None + + if not self.CP.notCar: + if not self.sm['deviceMotion'].posenetOK: + self.events.add(EventName.posenetInvalid) + if not self.sm['vehicleParameters'].valid and cal_status == log.ExtrinsicsCalibration.Status.calibrated and not TESTING_CLOSET and (not SIMULATION or REPLAY): + self.events.add(EventName.paramsdTemporaryError) + + # conservative HW alert. if the data or frequency are off, locationd will throw an error + if any((self.sm.frame - self.sm.recv_frame[s])*DT_CTRL > 10. for s in self.sensor_packets): + self.events.add(EventName.sensorDataInvalid) + + if not REPLAY: + # Check for mismatch between openpilot and car's PCM + cruise_mismatch = CS.cruiseState.enabled and (not self.enabled or not self.CP.pcmCruise) + self.cruise_mismatch_counter = self.cruise_mismatch_counter + 1 if cruise_mismatch else 0 + if self.cruise_mismatch_counter > int(6. / DT_CTRL): + self.events.add(EventName.cruiseMismatch) + + # Send a "steering required alert" if saturation count has reached the limit + if CS.steeringPressed: + self.last_steering_pressed_frame = self.sm.frame + recent_steer_pressed = (self.sm.frame - self.last_steering_pressed_frame)*DT_CTRL < 2.0 + controlstate = self.sm['controlsState'] + lac = getattr(controlstate.lateralControlState, controlstate.lateralControlState.which()) + if lac.active and not recent_steer_pressed and not self.CP.notCar: + clipped_speed = max(CS.vEgo, 0.3) + actual_lateral_accel = controlstate.curvature * (clipped_speed**2) + desired_lateral_accel = self.sm['modelV2'].action.desiredCurvature * (clipped_speed**2) + undershooting = abs(desired_lateral_accel) / abs(1e-3 + actual_lateral_accel) > 1.2 + turning = abs(desired_lateral_accel) > 1.0 + # TODO: lac.saturated includes speed and other checks, should be pulled out + if undershooting and turning and lac.saturated: + self.events.add(EventName.steerSaturated) + + # Check for FCW + stock_long_is_braking = self.enabled and not self.CP.openpilotLongitudinalControl and CS.aEgo < -1.25 + model_fcw = self.sm['modelV2'].meta.hardBrakePredicted and not CS.brakePressed and not stock_long_is_braking + planner_fcw = self.sm['longitudinalPlan'].fcw and self.enabled + if (planner_fcw or model_fcw) and not self.CP.notCar: + self.events.add(EventName.fcw) + + # GPS checks + gps_ok = self.sm.recv_frame[self.gps_location_service] > 0 and (self.sm.frame - self.sm.recv_frame[self.gps_location_service]) * DT_CTRL < 2.0 + if not gps_ok and self.sm['deviceMotion'].inputsOK and (self.distance_traveled > 1500): + self.events.add(EventName.noGps) + if gps_ok: + self.distance_traveled = 0 + self.distance_traveled += abs(CS.vEgo) * DT_CTRL + + # TODO: fix simulator + if not SIMULATION or REPLAY: + if self.sm['modelV2'].frameDropPerc > 20: + log_issue_limited( + "modeld_frame_drop", + "lag", + f"modeld frame drops={self.sm['modelV2'].frameDropPerc:.1f}% frame={self.sm.frame}", + interval_sec=1.0, + ) + self.events.add(EventName.modeldLagging) + + # Mute canBusMissing in Park so standby guidance suppression does not create a false alarm. + if CS.gearShifter == car.CarState.GearShifter.park and self.aol.enabled: + self.events.remove(EventName.canBusMissing) + + GapButtonActions.update(self, CS, self.events_iq, self.experimental_mode) + + # decrement personality on distance button press + if self.CP.openpilotLongitudinalControl: + if any(not be.pressed and be.type == ButtonType.gapAdjustCruise for be in CS.buttonEvents): + if not self.experimental_mode_switched: + self.personality = (self.personality - 1) % 3 + self.params.put_nonblocking('LongitudinalPersonality', self.personality) + self.events.add(EventName.personalityChanged) + self.experimental_mode_switched = False + + def _get_model_data_ext(self): + return self.sm['iqDriveModelData'] + + def _get_longitudinal_plan_ext(self): + return self.sm['iqPlan'] + + def _comm_issue_logs(self): + ignore_freq = getattr(self.sm, "ignore_average_freq", []) + return { + 'invalid': [s for s, valid in self.sm.valid.items() if not valid and s not in self.sm.ignore_valid], + 'not_alive': [s for s, alive in self.sm.alive.items() if not alive and s not in self.sm.ignore_alive], + 'not_freq_ok': [s for s, freq_ok in self.sm.freq_ok.items() if not freq_ok and s not in ignore_freq], + } + + def data_sample(self): + started = time.monotonic() + _car_state = messaging.recv_one(self.car_state_sock) + car_state_wait_ms = (time.monotonic() - started) * 1000 + + started = time.monotonic() + CS = _car_state.carState if _car_state else self.CS_prev + + self.sm.update(0) + sm_update_ms = (time.monotonic() - started) * 1000 + + if not self.initialized: + all_valid = CS.canValid and self.sm.all_checks() + timed_out = self.sm.frame * DT_CTRL > 6. + if all_valid or timed_out or (SIMULATION and not REPLAY): + available_streams = VisionIpcClient.available_streams("camerad", block=False) + if VisionStreamType.VISION_STREAM_ROAD not in available_streams: + self.sm.ignore_alive.append('roadCameraState') + self.sm.ignore_valid.append('roadCameraState') + if VisionStreamType.VISION_STREAM_WIDE_ROAD not in available_streams: + self.sm.ignore_alive.append('wideRoadCameraState') + self.sm.ignore_valid.append('wideRoadCameraState') + + if REPLAY and any(ps.controlsAllowed for ps in self.sm['pandaStates']): + self.state_machine.state = State.enabled + + self.initialized = True + comm_issue_logs = self._comm_issue_logs() + cloudlog.event( + "selfdrived.initialized", + dt=self.sm.frame*DT_CTRL, + timeout=timed_out, + canValid=CS.canValid, + invalid=comm_issue_logs['invalid'], + not_alive=comm_issue_logs['not_alive'], + not_freq_ok=comm_issue_logs['not_freq_ok'], + error=True, + ) + + # When the panda and selfdrived do not agree on controls_allowed + # we want to disengage openpilot. However the status from the panda goes through + # another socket other than the CAN messages and one can arrive earlier than the other. + # Therefore we allow a mismatch for two samples, then we trigger the disengagement. + if not self.enabled: + self.mismatch_counter = 0 + + # All pandas not in silent mode must have controlsAllowed when openpilot is enabled. + if self.enabled and any(not ps.controlsAllowed for ps in self.sm['pandaStates'] + if ps.safetyModel not in IGNORED_SAFETY_MODES): + self.mismatch_counter += 1 + + sample_total_ms = car_state_wait_ms + sm_update_ms + if sample_total_ms > 7.0 or car_state_wait_ms > 5.0 or sm_update_ms > 2.0: + log_issue_limited( + "selfdrived_sample_breakdown", + "lag", + f"selfdrived sample slow total_ms={sample_total_ms:.2f} car_state_wait_ms={car_state_wait_ms:.2f} " + f"sm_update_ms={sm_update_ms:.2f}", + interval_sec=1.0, + ) + + return CS + + def update_alerts(self, CS): + clear_event_types = set() + if ET.WARNING not in self.state_machine.current_alert_types: + clear_event_types.add(ET.WARNING) + if self.enabled: + clear_event_types.add(ET.NO_ENTRY) + + pers = LONGITUDINAL_PERSONALITY_MAP[self.personality] + callback_args = [self.CP, CS, self.sm, self.is_metric, + self.state_machine.soft_disable_timer, pers] + + alerts = self.events.create_alerts(self.state_machine.current_alert_types, callback_args) + alerts_iq = self.events_iq.create_alerts(self.state_machine.current_alert_types, callback_args) + + self.AM.add_many(self.sm.frame, alerts + alerts_iq) + self.AM.process_alerts(self.sm.frame, clear_event_types) + + def publish_selfdriveState(self, CS): + # selfdriveState + ss_msg = messaging.new_message('selfdriveState') + ss_msg.valid = True + ss = ss_msg.selfdriveState + ss.enabled = self.enabled + ss.active = self.active + ss.state = self.state_machine.state + ss.engageable = not self.events.contains(ET.NO_ENTRY) + ss.experimentalMode = self.experimental_mode + ss.personality = self.personality + + ss.alertText1 = self.AM.current_alert.alert_text_1 + ss.alertText2 = self.AM.current_alert.alert_text_2 + ss.alertSize = self.AM.current_alert.alert_size + ss.alertStatus = self.AM.current_alert.alert_status + ss.alertType = self.AM.current_alert.alert_type + ss.alertSound = self.AM.current_alert.audible_alert + ss.alertHudVisual = self.AM.current_alert.visual_alert + + self.pm.send('selfdriveState', ss_msg) + + # onroadEvents - logged every second or on change + if (self.sm.frame % int(1. / DT_CTRL) == 0) or (self.events.names != self.events_prev): + ce_send = messaging.new_message('onroadEvents', len(self.events)) + ce_send.valid = True + ce_send.onroadEvents = self.events.to_msg() + self.pm.send('onroadEvents', ce_send) + self.events_prev = self.events.names.copy() + + # iqState + iq_state_msg = messaging.new_message('iqState') + iq_state_msg.valid = True + iq_state = iq_state_msg.iqState + aol = iq_state.aol + aol.state = self.aol.state_machine.state + aol.enabled = self.aol.enabled + aol.active = self.aol.active + aol.available = self.aol.enabled_toggle + self.pm.send('iqState', iq_state_msg) + + # iqOnroadEvents - logged every second or on change + if (self.sm.frame % int(1. / DT_CTRL) == 0) or (self.events_iq.names != self.events_iq_prev): + iq_events_msg = messaging.new_message('iqOnroadEvents') + iq_events_msg.valid = True + iq_events_msg.iqOnroadEvents.events = self.events_iq.to_msg() + self.pm.send('iqOnroadEvents', iq_events_msg) + self.events_iq_prev = self.events_iq.names.copy() + + def step(self): + started = time.monotonic() + checkpoint = started + + CS = self.data_sample() + sample_ms = (time.monotonic() - checkpoint) * 1000 + checkpoint = time.monotonic() + + self.update_events(CS) + events_ms = (time.monotonic() - checkpoint) * 1000 + checkpoint = time.monotonic() + + if not self.CP.passive and self.initialized: + self.enabled, self.active = self.state_machine.update(self.events) + state_ms = (time.monotonic() - checkpoint) * 1000 + checkpoint = time.monotonic() + + if not self.CP.notCar: + self.aol.update(CS) + aol_ms = (time.monotonic() - checkpoint) * 1000 + checkpoint = time.monotonic() + + self.update_alerts(CS) + alerts_ms = (time.monotonic() - checkpoint) * 1000 + checkpoint = time.monotonic() + + self.publish_selfdriveState(CS) + publish_ms = (time.monotonic() - checkpoint) * 1000 + + self.CS_prev = CS + + total_ms = (time.monotonic() - started) * 1000 + if total_ms > 8.0 or events_ms > 4.0 or publish_ms > 3.0: + log_issue_limited( + "selfdrived_step_slow", + "lag", + f"selfdrived step slow total_ms={total_ms:.2f} sample_ms={sample_ms:.2f} events_ms={events_ms:.2f} " + f"state_ms={state_ms:.2f} aol_ms={aol_ms:.2f} alerts_ms={alerts_ms:.2f} publish_ms={publish_ms:.2f} " + f"nav_active={getattr(self.sm['iqNavState'], 'active', False)}", + interval_sec=1.0, + ) + + def params_thread(self, evt): + config_background_thread() + while not evt.is_set(): + self.is_metric = self.params.get_bool("IsMetric") + self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled") + self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") + self.experimental_mode = self.params.get_bool("ExperimentalMode") and self.CP.openpilotLongitudinalControl + self.personality = get_runtime_personality(self.params) + self.nav_exit_lane_change = self._read_nav_exit_lane_change() + self.model_download_pending = self.params.get("ModelManager_DownloadIndex") is not None + + self.aol.read_params() + time.sleep(0.1) + + def run(self): + e = threading.Event() + t = threading.Thread(target=self.params_thread, args=(e, )) + try: + t.start() + while True: + self.step() + self.rk.monitor_time() + finally: + e.set() + t.join() + + +def main(): + config_realtime_process(4, Priority.CTRL_HIGH) + lock_memory() + s = SelfdriveD() + s.run() + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/selfdrived/state.py b/iqpilot/selfdrive/selfdrived/state.py new file mode 100644 index 000000000..2b5029a36 --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/state.py @@ -0,0 +1,98 @@ +from iqpilot.cereal import log +from iqpilot.selfdrive.selfdrived.events import Events, ET +from iqpilot.common.realtime import DT_CTRL + +State = log.SelfdriveState.OpenpilotState + +SOFT_DISABLE_TIME = 3 # seconds +ACTIVE_STATES = (State.enabled, State.softDisabling, State.overriding) +ENABLED_STATES = (State.preEnabled, *ACTIVE_STATES) + +class StateMachine: + def __init__(self): + self.current_alert_types = [ET.PERMANENT] + self.state = State.disabled + self.soft_disable_timer = 0 + + def update(self, events: Events): + # decrement the soft disable timer at every step, as it's reset on + # entrance in SOFT_DISABLING state + self.soft_disable_timer = max(0, self.soft_disable_timer - 1) + + self.current_alert_types = [ET.PERMANENT] + + # ENABLED, SOFT DISABLING, PRE ENABLING, OVERRIDING + if self.state != State.disabled: + # user and immediate disable always have priority in a non-disabled state + if events.contains(ET.USER_DISABLE): + self.state = State.disabled + self.current_alert_types.append(ET.USER_DISABLE) + + elif events.contains(ET.IMMEDIATE_DISABLE): + self.state = State.disabled + self.current_alert_types.append(ET.IMMEDIATE_DISABLE) + + else: + # ENABLED + if self.state == State.enabled: + if events.contains(ET.SOFT_DISABLE): + self.state = State.softDisabling + self.soft_disable_timer = int(SOFT_DISABLE_TIME / DT_CTRL) + self.current_alert_types.append(ET.SOFT_DISABLE) + + elif events.contains(ET.OVERRIDE_LATERAL) or events.contains(ET.OVERRIDE_LONGITUDINAL): + self.state = State.overriding + self.current_alert_types += [ET.OVERRIDE_LATERAL, ET.OVERRIDE_LONGITUDINAL] + + # SOFT DISABLING + elif self.state == State.softDisabling: + if not events.contains(ET.SOFT_DISABLE): + # no more soft disabling condition, so go back to ENABLED + self.state = State.enabled + + elif self.soft_disable_timer > 0: + self.current_alert_types.append(ET.SOFT_DISABLE) + + elif self.soft_disable_timer <= 0: + self.state = State.disabled + + # PRE ENABLING + elif self.state == State.preEnabled: + if not events.contains(ET.PRE_ENABLE): + self.state = State.enabled + else: + self.current_alert_types.append(ET.PRE_ENABLE) + + # OVERRIDING + elif self.state == State.overriding: + if events.contains(ET.SOFT_DISABLE): + self.state = State.softDisabling + self.soft_disable_timer = int(SOFT_DISABLE_TIME / DT_CTRL) + self.current_alert_types.append(ET.SOFT_DISABLE) + elif not (events.contains(ET.OVERRIDE_LATERAL) or events.contains(ET.OVERRIDE_LONGITUDINAL)): + self.state = State.enabled + else: + self.current_alert_types += [ET.OVERRIDE_LATERAL, ET.OVERRIDE_LONGITUDINAL] + + # DISABLED + elif self.state == State.disabled: + if events.contains(ET.ENABLE): + if events.contains(ET.NO_ENTRY): + self.current_alert_types.append(ET.NO_ENTRY) + + else: + if events.contains(ET.PRE_ENABLE): + self.state = State.preEnabled + elif events.contains(ET.OVERRIDE_LATERAL) or events.contains(ET.OVERRIDE_LONGITUDINAL): + self.state = State.overriding + else: + self.state = State.enabled + self.current_alert_types.append(ET.ENABLE) + + # Check if openpilot is engaged and actuators are enabled + enabled = self.state in ENABLED_STATES + active = self.state in ACTIVE_STATES + if active: + self.current_alert_types.append(ET.WARNING) + return enabled, active + diff --git a/iqpilot/selfdrive/selfdrived/tests/test_alertmanager.py b/iqpilot/selfdrive/selfdrived/tests/test_alertmanager.py new file mode 100644 index 000000000..6da95419e --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/tests/test_alertmanager.py @@ -0,0 +1,60 @@ +import random + +from iqpilot.selfdrive.selfdrived.events import Alert, EVENTS +from iqpilot.selfdrive.selfdrived.alertmanager import AlertManager + +from iqpilot.common.atlas_alerts import NULL_ALERT as EmptyAlert + + +class TestAlertManager: + + def test_duration(self): + """ + Enforce that an alert lasts for max(alert duration, duration the alert is added) + """ + for duration in range(1, 100): + alert = None + while not isinstance(alert, Alert): + event = random.choice([e for e in EVENTS.values() if len(e)]) + alert = random.choice(list(event.values())) + + alert.duration = duration + + # check two cases: + # - alert is added to AM for <= the alert's duration + # - alert is added to AM for > alert's duration + for greater in (True, False): + if greater: + add_duration = duration + random.randint(1, 10) + else: + add_duration = random.randint(1, duration) + show_duration = max(duration, add_duration) + + AM = AlertManager() + for frame in range(duration+10): + if frame < add_duration: + AM.add_many(frame, [alert, ]) + AM.process_alerts(frame, set()) + + shown = AM.current_alert != EmptyAlert + should_show = frame <= show_duration + assert shown == should_show, f"{frame=} {add_duration=} {duration=}" + + # check one case: + # - if alert is re-added to AM before it ends the duration is extended + if duration > 1: + AM = AlertManager() + show_duration = duration * 2 + for frame in range(duration * 2 + 10): + if frame == 0: + AM.add_many(frame, [alert, ]) + + if frame == duration: + # add alert one frame before it ends + assert AM.current_alert == alert + AM.add_many(frame, [alert, ]) + AM.process_alerts(frame, set()) + + shown = AM.current_alert != EmptyAlert + should_show = frame <= show_duration + assert shown == should_show, f"{frame=} {duration=}" diff --git a/iqpilot/selfdrive/selfdrived/tests/test_alerts.py b/iqpilot/selfdrive/selfdrived/tests/test_alerts.py new file mode 100644 index 000000000..8757a1a63 --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/tests/test_alerts.py @@ -0,0 +1,163 @@ +import copy +import json +import os +import random +from PIL import Image, ImageDraw, ImageFont + +from iqpilot.cereal import log, car, custom +from iqpilot.cereal.messaging import SubMaster +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.selfdrive.selfdrived.events import Alert, EVENTS, ET +from iqpilot.selfdrive.selfdrived.iq_events import EVENTS_IQ +from iqpilot.selfdrive.selfdrived.events import invalid_lkas_setting_alert, invalid_lkas_setting_no_entry_alert +from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert +from iqpilot.selfdrive.test.process_replay.process_replay import CONFIGS + +AlertSize = log.SelfdriveState.AlertSize + +OFFROAD_ALERTS_PATH = os.path.join(BASEDIR, "iqpilot/selfdrive/selfdrived/alerts_offroad.json") + +# TODO: add callback alerts +ALERTS = [] +for event_types in EVENTS.values(): + for alert in event_types.values(): + ALERTS.append(alert) + + +class TestAlerts: + + def test_wrong_gear_alerts_are_silent_and_invisible(self): + wrong_gear_alerts = (EVENTS[log.OnroadEvent.EventName.wrongGear][ET.SOFT_DISABLE], + EVENTS[log.OnroadEvent.EventName.wrongGear][ET.NO_ENTRY], + EVENTS_IQ[custom.IQOnroadEvent.EventName.gearNotDriveSilent][ET.NO_ENTRY]) + + for alert in wrong_gear_alerts: + assert alert.alert_size == AlertSize.none + assert alert.audible_alert == car.CarControl.HUDControl.AudibleAlert.none + assert alert.alert_text_1 == "" + assert alert.alert_text_2 == "" + + @classmethod + def setup_class(cls): + with open(OFFROAD_ALERTS_PATH) as f: + cls.offroad_alerts = json.loads(f.read()) + + # Create fake objects for callback + cls.CS = car.CarState.new_message() + cls.CP = car.CarParams.new_message() + cfg = [c for c in CONFIGS if c.proc_name == 'selfdrived'][0] + cls.sm = SubMaster(cfg.pubs) + + def test_events_defined(self): + # Ensure all events in capnp schema are defined in events.py + events = log.OnroadEvent.EventName.schema.enumerants + + for name, e in events.items(): + if not name.endswith("DEPRECATED") and not name.startswith("eventReserved"): + fail_msg = f"{name} @{e} not in EVENTS" + assert e in EVENTS.keys(), fail_msg + + # ensure alert text doesn't exceed allowed width + def test_alert_text_length(self): + font_path = os.path.join(BASEDIR, "iqpilot/selfdrive/assets/fonts") + regular_font_path = os.path.join(font_path, "Inter-SemiBold.ttf") + bold_font_path = os.path.join(font_path, "Inter-Bold.ttf") + semibold_font_path = os.path.join(font_path, "Inter-SemiBold.ttf") + + max_text_width = 2160 - 300 # full screen width is usable, minus sidebar + draw = ImageDraw.Draw(Image.new('RGB', (0, 0))) + + fonts = { + AlertSize.small: [ImageFont.truetype(semibold_font_path, 74)], + AlertSize.mid: [ImageFont.truetype(bold_font_path, 88), + ImageFont.truetype(regular_font_path, 66)], + } + + for alert in ALERTS: + if not isinstance(alert, Alert): + alert = alert(self.CP, self.CS, self.sm, metric=False, soft_disable_time=100, personality=log.LongitudinalPersonality.standard) + + # for full size alerts, both text fields wrap the text, + # so it's unlikely that they would go past the max width + if alert.alert_size in (AlertSize.none, AlertSize.full): + continue + + for i, txt in enumerate([alert.alert_text_1, alert.alert_text_2]): + if i >= len(fonts[alert.alert_size]): + break + + font = fonts[alert.alert_size][i] + left, _, right, _ = draw.textbbox((0, 0), txt, font) + width = right - left + msg = f"type: {alert.alert_type} msg: {txt}" + assert width <= max_text_width, msg + + def test_alert_sanity_check(self): + for event_types in EVENTS.values(): + for event_type, a in event_types.items(): + # TODO: add callback alerts + if not isinstance(a, Alert): + continue + + if a.alert_size == AlertSize.none: + assert len(a.alert_text_1) == 0 + assert len(a.alert_text_2) == 0 + elif a.alert_size == AlertSize.small: + assert len(a.alert_text_1) > 0 + assert len(a.alert_text_2) == 0 + elif a.alert_size == AlertSize.mid: + assert len(a.alert_text_1) > 0 + assert len(a.alert_text_2) > 0 + else: + assert len(a.alert_text_1) > 0 + + assert a.duration >= 0. + + if event_type not in (ET.WARNING, ET.PERMANENT, ET.PRE_ENABLE): + assert a.creation_delay == 0. + + def test_offroad_alerts(self): + params = Params() + for a in self.offroad_alerts: + # set the alert + alert = copy.copy(self.offroad_alerts[a]) + set_offroad_alert(a, True) + alert['extra'] = '' + assert alert == params.get(a) + + # then delete it + set_offroad_alert(a, False) + assert params.get(a) is None + + def test_offroad_alerts_extra_text(self): + params = Params() + for i in range(50): + # set the alert + a = random.choice(list(self.offroad_alerts)) + alert = self.offroad_alerts[a] + set_offroad_alert(a, True, extra_text="a"*i) + + written_alert = params.get(a) + assert "a"*i == written_alert['extra'] + assert alert["text"] == written_alert['text'] + + def test_invalid_lkas_setting_alert_tesla_dashcam_mode(self): + self.CP.brand = "tesla" + alert = invalid_lkas_setting_alert(self.CP, self.CS, self.sm, metric=False, soft_disable_time=100, personality=log.LongitudinalPersonality.standard) + no_entry = invalid_lkas_setting_no_entry_alert(self.CP, self.CS, self.sm, metric=False, soft_disable_time=100, personality=log.LongitudinalPersonality.standard) + + assert alert.alert_text_1 == "Dashcam Mode" + assert alert.alert_text_2 == "FSD / Autosteer is active" + assert no_entry.alert_text_1 == "Dashcam Mode" + assert no_entry.alert_text_2 == "FSD / Autosteer is active" + + def test_invalid_lkas_setting_alert_non_tesla_unchanged(self): + self.CP.brand = "mazda" + alert = invalid_lkas_setting_alert(self.CP, self.CS, self.sm, metric=False, soft_disable_time=100, personality=log.LongitudinalPersonality.standard) + no_entry = invalid_lkas_setting_no_entry_alert(self.CP, self.CS, self.sm, metric=False, soft_disable_time=100, personality=log.LongitudinalPersonality.standard) + + assert alert.alert_text_1 == "Invalid LKAS setting" + assert alert.alert_text_2 == "Enable your car's LKAS to engage" + assert no_entry.alert_text_1 == "IQ.Pilot Unavailable" + assert no_entry.alert_text_2 == "Invalid LKAS setting" diff --git a/iqpilot/selfdrive/selfdrived/tests/test_iq_camera_alerts.py b/iqpilot/selfdrive/selfdrived/tests/test_iq_camera_alerts.py new file mode 100644 index 000000000..42f6b149c --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/tests/test_iq_camera_alerts.py @@ -0,0 +1,79 @@ +import copy +from types import SimpleNamespace + +from iqpilot.cereal import car, custom, log +from iqpilot.common.atlas_alerts import HardDisableCard, Tags as ET, Tier as Priority +from iqpilot.selfdrive.selfdrived.alertmanager import AlertManager +from iqpilot.selfdrive.selfdrived.events import EVENTS +from iqpilot.selfdrive.selfdrived import iq_events + + +def alert(camera_type, *, report_id="", chime=False, distance=300.0): + nav = SimpleNamespace( + cameraType=camera_type, + cameraDistance=distance, + cameraSpeedLimit=25.0, + cameraAlertId=report_id, + cameraChime=chime, + ) + return iq_events.speed_camera_alert(None, None, {"iqNavState": nav}, False, 0, None) + + +def test_existing_camera_audio_is_unchanged(): + result = alert(custom.IQNavState.CameraType.fixedSpeed) + assert result.audible_alert == car.CarControl.HUDControl.AudibleAlert.prompt + + +def test_police_visual_mode_is_silent(): + result = alert(custom.IQNavState.CameraType.police, report_id="visual", chime=False) + assert result.audible_alert == car.CarControl.HUDControl.AudibleAlert.none + + +def test_police_chime_is_deduplicated_by_report(): + iq_events._POLICE_CHIMED_IDS.clear() + first = alert(custom.IQNavState.CameraType.police, report_id="police-a", chime=True) + second = alert(custom.IQNavState.CameraType.police, report_id="police-a", chime=True) + assert first.audible_alert == car.CarControl.HUDControl.AudibleAlert.prompt + assert second.audible_alert == car.CarControl.HUDControl.AudibleAlert.none + + +def test_alpr_wording_uses_configured_region(monkeypatch): + monkeypatch.setattr(iq_events, "_configured_country_code", lambda: "US") + assert alert(custom.IQNavState.CameraType.alpr).alert_text_1.startswith("Flock / ALPR Camera") + assert alert(custom.IQNavState.CameraType.alpr, distance=0.0).alert_text_1 == "Flock Camera Detected" + + monkeypatch.setattr(iq_events, "_configured_country_code", lambda: "DE") + assert alert(custom.IQNavState.CameraType.alpr).alert_text_1.startswith("Traffic / ALPR Camera") + assert alert(custom.IQNavState.CameraType.alpr, distance=0.0).alert_text_1 == "Traffic / ALPR Camera Detected" + + +def test_missing_region_is_safe_and_preserves_flock_wording(monkeypatch): + class UnavailableParams: + def get(self, key): + raise OSError(key) + + monkeypatch.setattr(iq_events, "Params", UnavailableParams) + assert iq_events._configured_country_code() == "" + assert alert(custom.IQNavState.CameraType.alpr, distance=0.0).alert_text_1 == "Flock Camera Detected" + + +def test_driver_attention_and_takeover_alerts_preempt_alpr(): + flock = alert(custom.IQNavState.CameraType.alpr, distance=0.0) + pre_attention = copy.copy(EVENTS[log.OnroadEvent.EventName.preDriverDistracted][ET.PERMANENT]) + prompt_attention = copy.copy(EVENTS[log.OnroadEvent.EventName.promptDriverDistracted][ET.PERMANENT]) + takeover = copy.copy(EVENTS[log.OnroadEvent.EventName.driverDistracted][ET.PERMANENT]) + immediate_disable = HardDisableCard("Regression Test") + + assert flock.priority == Priority.LOW + assert pre_attention.priority == flock.priority + 1 + assert prompt_attention.priority == flock.priority + 1 + assert takeover.priority > flock.priority + assert immediate_disable.priority > flock.priority + + for expected in (pre_attention, prompt_attention, takeover, immediate_disable): + manager = AlertManager() + flock.alert_type = "flock/warning" + expected.alert_type = f"expected/{expected.alert_text_1}" + manager.add_many(0, [flock, expected]) + manager.process_alerts(0, set()) + assert manager.current_alert is expected diff --git a/iqpilot/selfdrive/selfdrived/tests/test_longitudinal_pref_persistence.py b/iqpilot/selfdrive/selfdrived/tests/test_longitudinal_pref_persistence.py new file mode 100644 index 000000000..11b83ac4c --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/tests/test_longitudinal_pref_persistence.py @@ -0,0 +1,41 @@ +from iqpilot.cereal import car + +from iqpilot.selfdrive.longitudinal_settings import get_valid_personality +from iqpilot.selfdrive.selfdrived.selfdrived import _cleanup_startup_params + + +class DummyParams: + def __init__(self): + self.removed: list[str] = [] + + def remove(self, key: str) -> None: + self.removed.append(key) + + +class TestLongitudinalPrefPersistence: + def test_startup_cleanup_preserves_persistent_longitudinal_preferences(self): + params = DummyParams() + cp = car.CarParams() + cp.alphaLongitudinalAvailable = False + cp.openpilotLongitudinalControl = False + + _cleanup_startup_params(cp, params) + + assert params.removed == [] + + def test_invalid_personality_is_clamped_before_use(self): + class ParamsWithInvalidPersonality: + def __init__(self): + self.value = 3 + + def get(self, key: str, return_default: bool = False) -> int: + assert key == "LongitudinalPersonality" + return self.value + + def put(self, key: str, value: int) -> None: + assert key == "LongitudinalPersonality" + self.value = value + + params = ParamsWithInvalidPersonality() + assert get_valid_personality(params) == 2 + assert params.value == 2 diff --git a/iqpilot/selfdrive/selfdrived/tests/test_longitudinal_settings.py b/iqpilot/selfdrive/selfdrived/tests/test_longitudinal_settings.py new file mode 100644 index 000000000..7c57338da --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/tests/test_longitudinal_settings.py @@ -0,0 +1,110 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import pytest + +from iqpilot.selfdrive.longitudinal_settings import ( + LONGITUDINAL_MODE_CHILL, + LONGITUDINAL_MODE_DYNAMIC, + LONGITUDINAL_MODE_STOCK, + PERSONALITY_AGGRESSIVE, + PERSONALITY_RELAXED, + PERSONALITY_STANDARD, + PERSONALITY_VALUES, + apply_longitudinal_mode, + get_follow_distance_state, + get_longitudinal_mode, + get_runtime_personality, + set_valid_personality, +) + + +class Params: + def __init__(self, personality=PERSONALITY_STANDARD): + self.values = { + "AlphaLongitudinalEnabled": True, + "ExperimentalMode": True, + "IQDynamicMode": True, + "LongitudinalPersonality": personality, + } + self.personality_writes = [] + + def get(self, key, return_default=False): + return self.values[key] + + def get_bool(self, key): + return bool(self.values[key]) + + def put(self, key, value): + self.values[key] = value + if key == "LongitudinalPersonality": + self.personality_writes.append(value) + + def put_bool(self, key, value): + self.values[key] = bool(value) + + +def test_personality_writer_rejects_stock_value(): + params = Params() + + with pytest.raises(ValueError): + set_valid_personality(params, 3) + + assert params.personality_writes == [] + + +def test_mode_paths_only_write_valid_personalities(): + params = Params(PERSONALITY_AGGRESSIVE) + + for mode in range(4): + apply_longitudinal_mode(params, mode) + + assert all(value in PERSONALITY_VALUES for value in params.personality_writes) + + +def test_stock_mode_preserves_personality_and_dynamic_restores_it(): + params = Params(PERSONALITY_AGGRESSIVE) + + apply_longitudinal_mode(params, LONGITUDINAL_MODE_STOCK) + + assert get_follow_distance_state(params) == (None, False) + assert get_runtime_personality(params) == PERSONALITY_AGGRESSIVE + assert params.values["LongitudinalPersonality"] == PERSONALITY_AGGRESSIVE + assert params.personality_writes == [] + + apply_longitudinal_mode(params, LONGITUDINAL_MODE_DYNAMIC) + + assert get_longitudinal_mode(params) == LONGITUDINAL_MODE_DYNAMIC + assert get_follow_distance_state(params) == (PERSONALITY_AGGRESSIVE, True) + + +def test_stock_mode_sanitizes_legacy_stock_personality_value(): + params = Params(3) + + apply_longitudinal_mode(params, LONGITUDINAL_MODE_STOCK) + + assert get_follow_distance_state(params) == (None, False) + assert params.values["LongitudinalPersonality"] == PERSONALITY_RELAXED + assert params.personality_writes == [PERSONALITY_RELAXED] + + +def test_chill_mode_forces_relaxed_personality(): + params = Params(PERSONALITY_AGGRESSIVE) + + apply_longitudinal_mode(params, LONGITUDINAL_MODE_CHILL) + + assert get_follow_distance_state(params) == (PERSONALITY_RELAXED, False) + assert get_runtime_personality(params) == PERSONALITY_RELAXED + assert params.values["LongitudinalPersonality"] == PERSONALITY_RELAXED + assert params.personality_writes == [PERSONALITY_RELAXED] + + +def test_dynamic_and_pilot_enable_valid_personality_selection(): + params = Params(PERSONALITY_STANDARD) + + assert get_follow_distance_state(params) == (PERSONALITY_STANDARD, True) + + params.values["IQDynamicMode"] = False + + assert get_follow_distance_state(params) == (PERSONALITY_STANDARD, True) diff --git a/iqpilot/selfdrive/selfdrived/tests/test_state_machine.py b/iqpilot/selfdrive/selfdrived/tests/test_state_machine.py new file mode 100644 index 000000000..b3d37a133 --- /dev/null +++ b/iqpilot/selfdrive/selfdrived/tests/test_state_machine.py @@ -0,0 +1,92 @@ +from iqpilot.cereal import log +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.selfdrived.state import StateMachine, SOFT_DISABLE_TIME +from iqpilot.selfdrive.selfdrived.events import Events, ET, EVENTS, NormalPermanentAlert + +State = log.SelfdriveState.OpenpilotState + +# The event types that maintain the current state +MAINTAIN_STATES = {State.enabled: (None,), State.disabled: (None,), State.softDisabling: (ET.SOFT_DISABLE,), + State.preEnabled: (ET.PRE_ENABLE,), State.overriding: (ET.OVERRIDE_LATERAL, ET.OVERRIDE_LONGITUDINAL)} +ALL_STATES = tuple(State.schema.enumerants.values()) +# The event types checked in DISABLED section of state machine +ENABLE_EVENT_TYPES = (ET.ENABLE, ET.PRE_ENABLE, ET.OVERRIDE_LATERAL, ET.OVERRIDE_LONGITUDINAL) + + +def make_event(event_types): + event = {} + for ev in event_types: + event[ev] = NormalPermanentAlert("alert") + EVENTS[0] = event + return 0 + + +class TestStateMachine: + def setup_method(self): + self.events = Events() + self.state_machine = StateMachine() + self.state_machine.soft_disable_timer = int(SOFT_DISABLE_TIME / DT_CTRL) + + def test_immediate_disable(self): + for state in ALL_STATES: + for et in MAINTAIN_STATES[state]: + self.events.add(make_event([et, ET.IMMEDIATE_DISABLE])) + self.state_machine.state = state + self.state_machine.update(self.events) + assert State.disabled == self.state_machine.state + self.events.clear() + + def test_user_disable(self): + for state in ALL_STATES: + for et in MAINTAIN_STATES[state]: + self.events.add(make_event([et, ET.USER_DISABLE])) + self.state_machine.state = state + self.state_machine.update(self.events) + assert State.disabled == self.state_machine.state + self.events.clear() + + def test_soft_disable(self): + for state in ALL_STATES: + if state == State.preEnabled: # preEnabled considers NO_ENTRY instead + continue + for et in MAINTAIN_STATES[state]: + self.events.add(make_event([et, ET.SOFT_DISABLE])) + self.state_machine.state = state + self.state_machine.update(self.events) + assert self.state_machine.state == State.disabled if state == State.disabled else State.softDisabling + self.events.clear() + + def test_soft_disable_timer(self): + self.state_machine.state = State.enabled + self.events.add(make_event([ET.SOFT_DISABLE])) + self.state_machine.update(self.events) + for _ in range(int(SOFT_DISABLE_TIME / DT_CTRL)): + assert self.state_machine.state == State.softDisabling + self.state_machine.update(self.events) + + assert self.state_machine.state == State.disabled + + def test_no_entry(self): + # Make sure noEntry keeps us disabled + for et in ENABLE_EVENT_TYPES: + self.events.add(make_event([ET.NO_ENTRY, et])) + self.state_machine.update(self.events) + assert self.state_machine.state == State.disabled + self.events.clear() + + def test_no_entry_pre_enable(self): + # preEnabled with noEntry event + self.state_machine.state = State.preEnabled + self.events.add(make_event([ET.NO_ENTRY, ET.PRE_ENABLE])) + self.state_machine.update(self.events) + assert self.state_machine.state == State.preEnabled + + def test_maintain_states(self): + # Given current state's event type, we should maintain state + for state in ALL_STATES: + for et in MAINTAIN_STATES[state]: + self.state_machine.state = state + self.events.add(make_event([et])) + self.state_machine.update(self.events) + assert self.state_machine.state == state + self.events.clear() diff --git a/iqpilot/selfdrive/state_estimation/__init__.py b/iqpilot/selfdrive/state_estimation/__init__.py new file mode 100644 index 000000000..958a822d4 --- /dev/null +++ b/iqpilot/selfdrive/state_estimation/__init__.py @@ -0,0 +1,7 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from iqpilot.selfdrive.state_estimation.estimator import EstimatorModel, ModelDefinition, Observation, StateEstimator + +__all__ = ["EstimatorModel", "ModelDefinition", "Observation", "StateEstimator"] diff --git a/iqpilot/selfdrive/state_estimation/benchmark.py b/iqpilot/selfdrive/state_estimation/benchmark.py new file mode 100644 index 000000000..9db7fabf3 --- /dev/null +++ b/iqpilot/selfdrive/state_estimation/benchmark.py @@ -0,0 +1,38 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import json +import time + +import numpy as np + +from iqpilot.selfdrive.locationd.models.car_kf import CarKalman +from iqpilot.selfdrive.locationd.models.constants import ObservationKind +from iqpilot.selfdrive.locationd.models.pose_kf import PoseKalman + + +def measure(function, count: int) -> dict[str, float]: + samples = np.empty(count) + for index in range(count): + started = time.perf_counter_ns() + function(index) + samples[index] = (time.perf_counter_ns() - started) / 1000.0 + return {"p50_us": float(np.percentile(samples, 50)), "p99_us": float(np.percentile(samples, 99)), "mean_us": float(samples.mean())} + + +def main() -> None: + car = CarKalman() + car.set_globals(1800.0, 2500.0, 1.2, 1.6, 90000.0, 100000.0) + car.init_state(CarKalman.initial_x, CarKalman.P_initial, 0.0) + pose = PoseKalman(0.8) + pose.init_state(PoseKalman.initial_x, PoseKalman.initial_P, 0.0) + result = { + "car": measure(lambda index: car.predict_and_observe(index * 0.01, ObservationKind.ROAD_FRAME_X_SPEED, np.array([15.0])), 1000), + "pose": measure(lambda index: pose.predict_and_observe(index * 0.01, ObservationKind.PHONE_GYRO, np.zeros(3)), 1000), + } + print(json.dumps(result, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/state_estimation/estimator.py b/iqpilot/selfdrive/state_estimation/estimator.py new file mode 100644 index 000000000..696bdd737 --- /dev/null +++ b/iqpilot/selfdrive/state_estimation/estimator.py @@ -0,0 +1,311 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from collections.abc import Callable +from dataclasses import dataclass +import math + +import numpy as np + + +Array = np.ndarray +Prediction = Callable[[Array, float, dict[str, float]], Array] +Measurement = Callable[[Array, dict[str, float]], Array] +Injection = Callable[[Array, Array], Array] +NativePrediction = Callable[[Array, Array, float, Array, dict[str, float]], None] +NativeUpdate = Callable[[Array, Array, int, Array, Array], Array] + + +@dataclass(frozen=True) +class Observation: + kind: int + values: Array + noise: Array + + +@dataclass(frozen=True) +class ModelDefinition: + state_size: int + error_size: int + transition: Prediction + measurements: dict[int, Measurement] + process_noise: Array + observation_noise: dict[int, Array] + inject_error: Injection | None = None + error_projection: Callable[[Array], Array] | None = None + normalize: Callable[[Array], Array] | None = None + native_predict: NativePrediction | None = None + native_update: NativeUpdate | None = None + + +@dataclass +class _Snapshot: + time: float + state: Array + covariance: Array + + +@dataclass +class _Event: + time: float + observation: Observation + order: int + + +class StateEstimator: + def __init__(self, model: ModelDefinition, initial_state: Array, initial_covariance: Array, + max_rewind_age: float = 0.0): + self.model = model + self.parameters: dict[str, float] = {} + self.max_rewind_age = max_rewind_age + self._order = 0 + self.init_state(initial_state, initial_covariance, None) + + @property + def x(self) -> Array: + return self._state.copy() + + @property + def P(self) -> Array: + return self._covariance.copy() + + @property + def t(self) -> float: + return self._time + + def set_global(self, name: str, value: float) -> None: + self.parameters[name] = float(value) + + def init_state(self, state: Array, covs: Array, filter_time: float | None) -> None: + state = np.asarray(state, dtype=np.float64).reshape(-1) + covariance = np.asarray(covs, dtype=np.float64) + self._validate_state(state, covariance) + self._state = self._normalize(state.copy()) + self._covariance = self._stabilize(covariance.copy()) + self._time = math.nan if filter_time is None else float(filter_time) + self._events: list[_Event] = [] + self._snapshots = [_Snapshot(self._time, self._state.copy(), self._covariance.copy())] + + def set_filter_time(self, filter_time: float | None) -> None: + self._time = math.nan if filter_time is None else float(filter_time) + + def reset_rewind(self) -> None: + self._events.clear() + self._snapshots = [_Snapshot(self._time, self._state.copy(), self._covariance.copy())] + + def predict(self, time: float) -> None: + time = float(time) + if math.isnan(self._time): + self._time = time + return + if time < self._time: + raise ValueError("prediction time precedes estimator time") + dt = time - self._time + if dt == 0.0: + return + if self.model.native_predict is not None: + self.model.native_predict(self._state, self._covariance, dt, self.model.process_noise, self.parameters) + self._time = time + return + previous = self._state.copy() + transition_jacobian = self._jacobian(lambda value: self.model.transition(value, dt, self.parameters), previous) + predicted = self.model.transition(previous, dt, self.parameters) + projection = self._error_projection(previous) + if self.model.error_size == self.model.state_size: + error_transition = transition_jacobian + else: + error_transition = np.linalg.pinv(self._error_projection(predicted)) @ transition_jacobian @ projection + self._state = self._normalize(predicted) + self._covariance = self._stabilize(error_transition @ self._covariance @ error_transition.T + dt * self.model.process_noise) + self._time = time + + def predict_and_observe(self, time: float, kind: int, measurements: Array, noise: Array | None = None): + values = self._measurement_batch(kind, measurements) + noises = self._noise_batch(kind, len(values), noise) + event = _Event(float(time), Observation(kind, values, noises), self._order) + self._order += 1 + if not math.isnan(self._time) and event.time < self._time: + if self.max_rewind_age <= 0.0 or self._time - event.time > self.max_rewind_age: + return None + return self._rewind(event) + result = self._apply_event(event) + self._events.append(event) + self._snapshots.append(_Snapshot(self._time, self._state.copy(), self._covariance.copy())) + self._trim_history() + return result + + def _apply_event(self, event: _Event): + self.predict(event.time) + prior_state = self._state.copy() + prior_covariance = self._covariance.copy() + innovations = [] + for measurement, noise in zip(event.observation.values, event.observation.noise, strict=True): + innovations.append(self._update(event.observation.kind, measurement, noise)) + return (event.time, self.x, prior_state, self.P, prior_covariance, event.observation.kind, + tuple(innovations), event.observation.values.copy(), event.observation.noise.copy()) + + def _update(self, kind: int, measurement: Array, noise: Array) -> Array: + measurement_function = self.model.measurements.get(kind) + if measurement_function is None: + raise KeyError(f"unknown observation kind {kind}") + measurement = np.asarray(measurement, dtype=np.float64).reshape(-1) + if noise.shape != (measurement.size, measurement.size): + raise ValueError("observation noise dimension mismatch") + if self.model.native_update is not None: + innovation = self.model.native_update(self._state, self._covariance, kind, measurement, noise) + return innovation + predicted = np.asarray(measurement_function(self._state, self.parameters), dtype=np.float64).reshape(-1) + if predicted.shape != measurement.shape: + raise ValueError("measurement dimension mismatch") + innovation = measurement - predicted + state_jacobian = self._jacobian(lambda value: measurement_function(value, self.parameters), self._state) + observation_jacobian = state_jacobian @ self._error_projection(self._state) + innovation_covariance = observation_jacobian @ self._covariance @ observation_jacobian.T + noise + gain = np.linalg.solve(innovation_covariance, observation_jacobian @ self._covariance).T + delta = gain @ innovation + self._state = self._normalize(self._inject(self._state, delta)) + identity = np.eye(self.model.error_size) + residual = identity - gain @ observation_jacobian + self._covariance = self._stabilize(residual @ self._covariance @ residual.T + gain @ noise @ gain.T) + self._require_finite() + return innovation + + def _rewind(self, new_event: _Event): + events = sorted(self._events + [new_event], key=lambda event: (event.time, event.order)) + base_index = max(i for i, snapshot in enumerate(self._snapshots) if math.isnan(snapshot.time) or snapshot.time <= new_event.time) + base = self._snapshots[base_index] + retained = self._events[:base_index] + retained_orders = {event.order for event in retained} + replay = [event for event in events if event.order not in retained_orders] + self._state = base.state.copy() + self._covariance = base.covariance.copy() + self._time = base.time + self._events = retained.copy() + self._snapshots = self._snapshots[:base_index + 1] + result = None + for event in replay: + current = self._apply_event(event) + self._events.append(event) + self._snapshots.append(_Snapshot(self._time, self._state.copy(), self._covariance.copy())) + if event is new_event: + result = current + self._trim_history() + return result + + def _trim_history(self) -> None: + if self.max_rewind_age <= 0.0 or math.isnan(self._time): + return + cutoff = self._time - self.max_rewind_age + remove = 0 + while remove < len(self._events) and self._events[remove].time < cutoff: + remove += 1 + if remove: + self._events = self._events[remove:] + self._snapshots = self._snapshots[remove:] + + def _measurement_batch(self, kind: int, measurements: Array) -> Array: + measurement_function = self.model.measurements.get(kind) + if measurement_function is None: + raise KeyError(f"unknown observation kind {kind}") + if self.model.native_update is not None and kind in self.model.observation_noise: + expected = self.model.observation_noise[kind].shape[0] + else: + expected = np.asarray(measurement_function(self._state, self.parameters)).size + values = np.asarray(measurements, dtype=np.float64) + if values.ndim == 1: + values = values.reshape(1, -1) + elif values.ndim != 2: + raise ValueError("measurements must be one or two dimensional") + if values.shape[1] != expected: + raise ValueError("measurement dimension mismatch") + return values + + def _noise_batch(self, kind: int, count: int, noise: Array | None) -> Array: + if noise is None: + base = self.model.observation_noise.get(kind) + if base is None: + raise KeyError(f"missing observation noise for kind {kind}") + return np.repeat(np.asarray(base, dtype=np.float64)[None, :, :], count, axis=0) + noises = np.asarray(noise, dtype=np.float64) + if noises.ndim == 2: + noises = noises[None, :, :] + if noises.shape[0] == 1 and count > 1: + noises = np.repeat(noises, count, axis=0) + if noises.shape[0] != count: + raise ValueError("observation noise batch mismatch") + return noises + + def _jacobian(self, function: Callable[[Array], Array], value: Array) -> Array: + output = np.asarray(function(value), dtype=np.float64).reshape(-1) + result = np.empty((output.size, value.size), dtype=np.float64) + for index in range(value.size): + step = np.cbrt(np.finfo(np.float64).eps) * max(1.0, abs(value[index])) + upper = value.copy() + lower = value.copy() + upper[index] += step + lower[index] -= step + result[:, index] = (np.asarray(function(upper)).reshape(-1) - np.asarray(function(lower)).reshape(-1)) / (2.0 * step) + return result + + def _inject(self, state: Array, delta: Array) -> Array: + if self.model.inject_error is None: + return state + delta + return self.model.inject_error(state, delta) + + def _error_projection(self, state: Array) -> Array: + if self.model.error_projection is None: + return np.eye(self.model.state_size, self.model.error_size) + return np.asarray(self.model.error_projection(state), dtype=np.float64) + + def _normalize(self, state: Array) -> Array: + if self.model.normalize is None: + return np.asarray(state, dtype=np.float64).reshape(-1) + return np.asarray(self.model.normalize(state), dtype=np.float64).reshape(-1) + + def _stabilize(self, covariance: Array) -> Array: + covariance = (covariance + covariance.T) * 0.5 + eigenvalues, eigenvectors = np.linalg.eigh(covariance) + if eigenvalues[0] < -1e-10: + raise FloatingPointError("covariance is not positive semidefinite") + return (eigenvectors * np.maximum(eigenvalues, 0.0)) @ eigenvectors.T + + def _validate_state(self, state: Array, covariance: Array) -> None: + if state.shape != (self.model.state_size,): + raise ValueError("state dimension mismatch") + if covariance.shape != (self.model.error_size, self.model.error_size): + raise ValueError("covariance dimension mismatch") + if self.model.process_noise.shape != covariance.shape: + raise ValueError("process noise dimension mismatch") + if not np.isfinite(state).all() or not np.isfinite(covariance).all(): + raise ValueError("state and covariance must be finite") + + def _require_finite(self) -> None: + if not np.isfinite(self._state).all() or not np.isfinite(self._covariance).all(): + raise FloatingPointError("estimator produced non-finite values") + + +class EstimatorModel: + def __init__(self, estimator: StateEstimator): + self.filter = estimator + + @property + def x(self) -> Array: + return self.filter.x + + @property + def P(self) -> Array: + return self.filter.P + + @property + def t(self) -> float: + return self.filter.t + + def init_state(self, state: Array, covs: Array, filter_time: float | None) -> None: + self.filter.init_state(state, covs, filter_time) + + def predict(self, time: float) -> None: + self.filter.predict(time) + + def predict_and_observe(self, time: float, kind: int, measurements: Array, noise: Array | None = None): + return self.filter.predict_and_observe(time, kind, measurements, noise) diff --git a/iqpilot/selfdrive/state_estimation/native_binding_pyx.so b/iqpilot/selfdrive/state_estimation/native_binding_pyx.so new file mode 100755 index 000000000..ec14c6652 Binary files /dev/null and b/iqpilot/selfdrive/state_estimation/native_binding_pyx.so differ diff --git a/iqpilot/selfdrive/state_estimation/test_estimator.py b/iqpilot/selfdrive/state_estimation/test_estimator.py new file mode 100644 index 000000000..a0adb83d6 --- /dev/null +++ b/iqpilot/selfdrive/state_estimation/test_estimator.py @@ -0,0 +1,92 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import numpy as np +import pytest + +from iqpilot.selfdrive.state_estimation import ModelDefinition, StateEstimator + + +def linear_model(process_noise: float = 0.2, observation_noise: float = 0.5) -> ModelDefinition: + return ModelDefinition( + state_size=2, + error_size=2, + transition=lambda state, dt, _: np.array([state[0] + dt * state[1], state[1]]), + measurements={1: lambda state, _: state[:1]}, + process_noise=np.eye(2) * process_noise, + observation_noise={1: np.array([[observation_noise]])}, + ) + + +def test_linear_prediction_matches_closed_form() -> None: + estimator = StateEstimator(linear_model(), np.array([2.0, 3.0]), np.diag([4.0, 5.0])) + estimator.init_state(np.array([2.0, 3.0]), np.diag([4.0, 5.0]), 1.0) + estimator.predict(1.25) + transition = np.array([[1.0, 0.25], [0.0, 1.0]]) + np.testing.assert_allclose(estimator.x, np.array([2.75, 3.0]), atol=1e-10) + np.testing.assert_allclose(estimator.P, transition @ np.diag([4.0, 5.0]) @ transition.T + 0.25 * np.eye(2) * 0.2, atol=1e-10) + + +def test_linear_update_matches_closed_form() -> None: + estimator = StateEstimator(linear_model(), np.array([0.0, 0.0]), np.diag([2.0, 3.0])) + estimator.init_state(np.array([0.0, 0.0]), np.diag([2.0, 3.0]), 0.0) + estimator.predict_and_observe(0.0, 1, np.array([4.0])) + gain = 2.0 / 2.5 + np.testing.assert_allclose(estimator.x, np.array([gain * 4.0, 0.0]), atol=1e-10) + np.testing.assert_allclose(estimator.P, np.diag([(1.0 - gain) * 2.0, 3.0]), atol=1e-10) + + +def test_zero_innovation_does_not_change_state() -> None: + estimator = StateEstimator(linear_model(), np.array([4.0, 2.0]), np.eye(2)) + estimator.init_state(np.array([4.0, 2.0]), np.eye(2), 0.0) + estimator.predict_and_observe(0.0, 1, np.array([4.0])) + np.testing.assert_array_equal(estimator.x, np.array([4.0, 2.0])) + + +def test_larger_observation_noise_reduces_correction() -> None: + low = StateEstimator(linear_model(observation_noise=0.1), np.zeros(2), np.eye(2)) + high = StateEstimator(linear_model(observation_noise=10.0), np.zeros(2), np.eye(2)) + low.predict_and_observe(0.0, 1, np.array([1.0])) + high.predict_and_observe(0.0, 1, np.array([1.0])) + assert abs(low.x[0]) > abs(high.x[0]) + + +def test_larger_process_noise_increases_uncertainty() -> None: + low = StateEstimator(linear_model(process_noise=0.1), np.zeros(2), np.eye(2)) + high = StateEstimator(linear_model(process_noise=2.0), np.zeros(2), np.eye(2)) + low.init_state(np.zeros(2), np.eye(2), 0.0) + high.init_state(np.zeros(2), np.eye(2), 0.0) + low.predict(1.0) + high.predict(1.0) + assert np.all(np.diag(high.P) > np.diag(low.P)) + + +def test_batch_update_preserves_covariance_properties() -> None: + estimator = StateEstimator(linear_model(), np.zeros(2), np.eye(2)) + estimator.predict_and_observe(0.0, 1, np.array([[1.0], [0.5], [-0.2]])) + np.testing.assert_allclose(estimator.P, estimator.P.T, atol=1e-12) + assert np.linalg.eigvalsh(estimator.P).min() >= -1e-10 + assert np.isfinite(estimator.x).all() + assert np.isfinite(estimator.P).all() + + +def test_delayed_observation_replays_deterministically() -> None: + chronological = StateEstimator(linear_model(), np.zeros(2), np.eye(2), max_rewind_age=2.0) + delayed = StateEstimator(linear_model(), np.zeros(2), np.eye(2), max_rewind_age=2.0) + chronological.init_state(np.zeros(2), np.eye(2), 0.0) + delayed.init_state(np.zeros(2), np.eye(2), 0.0) + chronological.predict_and_observe(0.5, 1, np.array([1.0])) + chronological.predict_and_observe(1.0, 1, np.array([2.0])) + delayed.predict_and_observe(1.0, 1, np.array([2.0])) + delayed.predict_and_observe(0.5, 1, np.array([1.0])) + np.testing.assert_allclose(delayed.x, chronological.x, atol=1e-10) + np.testing.assert_allclose(delayed.P, chronological.P, atol=1e-10) + + +def test_invalid_dimensions_fail_deterministically() -> None: + with pytest.raises(ValueError, match="state dimension mismatch"): + StateEstimator(linear_model(), np.zeros(3), np.eye(2)) + estimator = StateEstimator(linear_model(), np.zeros(2), np.eye(2)) + with pytest.raises(ValueError, match="measurement dimension mismatch"): + estimator.predict_and_observe(0.0, 1, np.zeros(2)) diff --git a/iqpilot/selfdrive/state_estimation/test_models.py b/iqpilot/selfdrive/state_estimation/test_models.py new file mode 100644 index 000000000..c6717e2c8 --- /dev/null +++ b/iqpilot/selfdrive/state_estimation/test_models.py @@ -0,0 +1,58 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import numpy as np + +from iqpilot.selfdrive.locationd.models.car_kf import CarKalman, States as CarStates +from iqpilot.selfdrive.locationd.models.constants import ObservationKind +from iqpilot.selfdrive.locationd.models.pose_kf import PoseKalman, States as PoseStates + + +def configured_car() -> CarKalman: + estimator = CarKalman() + estimator.set_globals(1800.0, 2500.0, 1.2, 1.6, 90000.0, 100000.0) + estimator.init_state(CarKalman.initial_x, CarKalman.P_initial, 0.0) + return estimator + + +def test_car_mutable_parameters_affect_prediction() -> None: + light = configured_car() + heavy = configured_car() + heavy.set_globals(3600.0, 5000.0, 1.2, 1.6, 90000.0, 100000.0) + state = CarKalman.initial_x.copy() + state[CarStates.STEER_ANGLE] = 0.1 + light.init_state(state, CarKalman.P_initial, 0.0) + heavy.init_state(state, CarKalman.P_initial, 0.0) + light.predict(0.01) + heavy.predict(0.01) + assert abs(light.x[CarStates.YAW_RATE].item()) > abs(heavy.x[CarStates.YAW_RATE].item()) + + +def test_car_long_sequence_stays_finite() -> None: + estimator = configured_car() + for index in range(500): + time = index * 0.01 + estimator.predict_and_observe(time, ObservationKind.STEER_ANGLE, np.array([0.02 * np.sin(time)])) + estimator.predict_and_observe(time, ObservationKind.ROAD_FRAME_X_SPEED, np.array([15.0])) + assert np.isfinite(estimator.x).all() + assert np.isfinite(estimator.P).all() + assert np.linalg.eigvalsh(estimator.P).min() >= -1e-10 + + +def test_pose_delayed_sensor_sequence_is_stable() -> None: + estimator = PoseKalman(0.8) + estimator.init_state(PoseKalman.initial_x, PoseKalman.initial_P, 0.0) + estimator.predict_and_observe(0.02, ObservationKind.PHONE_GYRO, np.array([0.01, -0.02, 0.03])) + estimator.predict_and_observe(0.04, ObservationKind.PHONE_ACCEL, np.array([0.0, 0.0, -9.81])) + estimator.predict_and_observe(0.03, ObservationKind.CAMERA_ODO_ROTATION, np.array([0.01, -0.02, 0.03])) + assert np.isfinite(estimator.x).all() + assert np.isfinite(estimator.P).all() + np.testing.assert_allclose(estimator.P, estimator.P.T, atol=1e-12) + + +def test_pose_zero_rotation_preserves_orientation() -> None: + estimator = PoseKalman(0.8) + estimator.init_state(PoseKalman.initial_x, PoseKalman.initial_P, 0.0) + estimator.predict(1.0) + np.testing.assert_allclose(estimator.x[PoseStates.NED_ORIENTATION], np.zeros(3), atol=1e-12) diff --git a/iqpilot/selfdrive/test/.gitignore b/iqpilot/selfdrive/test/.gitignore new file mode 100644 index 000000000..5801faadf --- /dev/null +++ b/iqpilot/selfdrive/test/.gitignore @@ -0,0 +1,9 @@ +out/ +docker_out/ + +process_replay/diff.txt +process_replay/model_diff.txt +valgrind_logs.txt + +*.bz2 +*.hevc diff --git a/iqpilot/selfdrive/test/__init__.py b/iqpilot/selfdrive/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/test/cpp_harness.py b/iqpilot/selfdrive/test/cpp_harness.py new file mode 100755 index 000000000..95cbfbe88 --- /dev/null +++ b/iqpilot/selfdrive/test/cpp_harness.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +import subprocess +import sys +from pathlib import Path + +from iqpilot.common.prefix import OpenpilotPrefix + +command = [str(Path(sys.argv[1]).resolve()), *sys.argv[2:]] +with OpenpilotPrefix(): + ret = subprocess.call(command) + +sys.exit(ret) diff --git a/iqpilot/selfdrive/test/docker_build.sh b/iqpilot/selfdrive/test/docker_build.sh new file mode 100755 index 000000000..c4dcf9033 --- /dev/null +++ b/iqpilot/selfdrive/test/docker_build.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -e + +# To build sim and docs, you can run the following to mount the scons cache to the same place as in CI: +# mkdir -p .ci_cache/scons_cache +# sudo mount --bind /tmp/scons_cache/ .ci_cache/scons_cache + +SCRIPT_DIR=$(dirname "$0") +OPENPILOT_DIR=$SCRIPT_DIR/../../../ +if [ -n "$TARGET_ARCHITECTURE" ]; then + PLATFORM="linux/$TARGET_ARCHITECTURE" + TAG_SUFFIX="-$TARGET_ARCHITECTURE" +else + PLATFORM="linux/$(uname -m)" + TAG_SUFFIX="" +fi + +source $SCRIPT_DIR/docker_common.sh $1 "$TAG_SUFFIX" + +DOCKER_BUILDKIT=1 docker buildx build --provenance false --pull --platform $PLATFORM --load --cache-to type=inline --cache-from type=registry,ref=$REMOTE_TAG -t $DOCKER_IMAGE:latest -t $REMOTE_TAG -t $LOCAL_TAG -f $OPENPILOT_DIR/$DOCKER_FILE $OPENPILOT_DIR + +if [ -n "$PUSH_IMAGE" ]; then + docker push $REMOTE_TAG + docker tag $REMOTE_TAG $REMOTE_SHA_TAG + docker push $REMOTE_SHA_TAG +fi diff --git a/iqpilot/selfdrive/test/docker_common.sh b/iqpilot/selfdrive/test/docker_common.sh new file mode 100644 index 000000000..2887fff74 --- /dev/null +++ b/iqpilot/selfdrive/test/docker_common.sh @@ -0,0 +1,18 @@ +if [ "$1" = "base" ]; then + export DOCKER_IMAGE=openpilot-base + export DOCKER_FILE=Dockerfile.openpilot_base +elif [ "$1" = "prebuilt" ]; then + export DOCKER_IMAGE=openpilot-prebuilt + export DOCKER_FILE=Dockerfile.openpilot +else + echo "Invalid docker build image: '$1'" + exit 1 +fi + +export DOCKER_REGISTRY=ghcr.io/commaai +export COMMIT_SHA=$(git rev-parse HEAD) + +TAG_SUFFIX=$2 +LOCAL_TAG=$DOCKER_IMAGE$TAG_SUFFIX +REMOTE_TAG=$DOCKER_REGISTRY/$LOCAL_TAG +REMOTE_SHA_TAG=$DOCKER_REGISTRY/$LOCAL_TAG:$COMMIT_SHA diff --git a/iqpilot/selfdrive/test/fuzzy_generation.py b/iqpilot/selfdrive/test/fuzzy_generation.py new file mode 100644 index 000000000..19d3fbb92 --- /dev/null +++ b/iqpilot/selfdrive/test/fuzzy_generation.py @@ -0,0 +1,81 @@ +import capnp +import hypothesis.strategies as st +from typing import Any +from collections.abc import Callable +from functools import cache + +from iqpilot.cereal import log + +DrawType = Callable[[st.SearchStrategy], Any] + + +class FuzzyGenerator: + def __init__(self, draw: DrawType, real_floats: bool): + self.draw = draw + self.native_type_map = FuzzyGenerator._get_native_type_map(real_floats) + + def generate_native_type(self, field: str) -> st.SearchStrategy[bool | int | float | str | bytes]: + value_func = self.native_type_map.get(field) + if value_func is not None: + return value_func + else: + raise NotImplementedError(f'Invalid type: {field}') + + def generate_field(self, field: capnp.lib.capnp._StructSchemaField) -> st.SearchStrategy: + def rec(field_type: capnp.lib.capnp._DynamicStructReader) -> st.SearchStrategy: + type_which = field_type.which() + if type_which == 'struct': + return self.generate_struct(field.schema.elementType if base_type == 'list' else field.schema) + elif type_which == 'list': + return st.lists(rec(field_type.list.elementType)) + elif type_which == 'enum': + schema = field.schema.elementType if base_type == 'list' else field.schema + return st.sampled_from(list(schema.enumerants.keys())) + else: + return self.generate_native_type(type_which) + + try: + if hasattr(field.proto, 'slot'): + slot_type = field.proto.slot.type + base_type = slot_type.which() + return rec(slot_type) + else: + return self.generate_struct(field.schema) + except capnp.lib.capnp.KjException: + return self.generate_struct(field.schema) + + def generate_struct(self, schema: capnp.lib.capnp._StructSchema, event: str | None = None) -> st.SearchStrategy[dict[str, Any]]: + single_fill: tuple[str, ...] = (event,) if event else (self.draw(st.sampled_from(schema.union_fields)),) if schema.union_fields else () + fields_to_generate = schema.non_union_fields + single_fill + return st.fixed_dictionaries({field: self.generate_field(schema.fields[field]) for field in fields_to_generate if not field.endswith('DEPRECATED')}) + + @staticmethod + @cache + def _get_native_type_map(real_floats: bool) -> dict[str, st.SearchStrategy]: + return { + 'bool': st.booleans(), + 'int8': st.integers(min_value=-2**7, max_value=2**7-1), + 'int16': st.integers(min_value=-2**15, max_value=2**15-1), + 'int32': st.integers(min_value=-2**31, max_value=2**31-1), + 'int64': st.integers(min_value=-2**63, max_value=2**63-1), + 'uint8': st.integers(min_value=0, max_value=2**8-1), + 'uint16': st.integers(min_value=0, max_value=2**16-1), + 'uint32': st.integers(min_value=0, max_value=2**32-1), + 'uint64': st.integers(min_value=0, max_value=2**64-1), + 'float32': st.floats(width=32, allow_nan=not real_floats, allow_infinity=not real_floats), + 'float64': st.floats(width=64, allow_nan=not real_floats, allow_infinity=not real_floats), + 'text': st.text(max_size=1000), + 'data': st.binary(max_size=1000), + 'anyPointer': st.text(), # Note: No need to define a separate function for anyPointer + } + + @classmethod + def get_random_msg(cls, draw: DrawType, struct: capnp.lib.capnp._StructModule, real_floats: bool = False) -> dict[str, Any]: + fg = cls(draw, real_floats=real_floats) + data: dict[str, Any] = draw(fg.generate_struct(struct.schema)) + return data + + @classmethod + def get_random_event_msg(cls, draw: DrawType, events: list[str], real_floats: bool = False) -> list[dict[str, Any]]: + fg = cls(draw, real_floats=real_floats) + return [draw(fg.generate_struct(log.Event.schema, e)) for e in sorted(events)] diff --git a/iqpilot/selfdrive/test/helpers.py b/iqpilot/selfdrive/test/helpers.py new file mode 100644 index 000000000..638c1b844 --- /dev/null +++ b/iqpilot/selfdrive/test/helpers.py @@ -0,0 +1,123 @@ +import contextlib +import http.server +import os +import threading +import time +import pytest + +from functools import wraps + +import iqpilot.cereal.messaging as messaging +from iqpilot.common.params import Params +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.system.version import training_version, terms_version + + +def set_params_enabled(): + os.environ['FINGERPRINT'] = "TOYOTA_COROLLA_TSS2" + os.environ['LOGPRINT'] = "debug" + + params = Params() + params.put("HasAcceptedTerms", terms_version) + params.put("CompletedTrainingVersion", training_version) + params.put_bool("OpenpilotEnabledToggle", True) + + # valid calib + msg = messaging.new_message('extrinsicsCalibration') + msg.extrinsicsCalibration.validBlocks = 20 + msg.extrinsicsCalibration.rpyCalib = [0.0, 0.0, 0.0] + params.put("CalibrationParams", msg.to_bytes()) + +def release_only(f): + return pytest.mark.release(f) + + +@contextlib.contextmanager +def processes_context(processes, init_time=0, ignore_stopped=None): + ignore_stopped = [] if ignore_stopped is None else ignore_stopped + + # start and assert started + for n, p in enumerate(processes): + managed_processes[p].start() + if n < len(processes) - 1: + time.sleep(init_time) + + assert all(managed_processes[name].proc.exitcode is None for name in processes) + + try: + yield [managed_processes[name] for name in processes] + # assert processes are still started + assert all(managed_processes[name].proc.exitcode is None for name in processes if name not in ignore_stopped) + finally: + for p in processes: + managed_processes[p].stop() + + +def with_processes(processes, init_time=0, ignore_stopped=None): + def wrapper(func): + @wraps(func) + def wrap(*args, **kwargs): + with processes_context(processes, init_time, ignore_stopped): + return func(*args, **kwargs) + + return wrap + return wrapper + + +def noop(*args, **kwargs): + pass + + +def read_segment_list(segment_list_path): + with open(segment_list_path) as f: + seg_list = f.read().splitlines() + + return [(platform[2:], segment) for platform, segment in zip(seg_list[::2], seg_list[1::2], strict=True)] + + +@contextlib.contextmanager +def http_server_context(handler, setup=None): + host = '127.0.0.1' + server = http.server.HTTPServer((host, 0), handler) + port = server.server_port + t = threading.Thread(target=server.serve_forever) + t.start() + + if setup is not None: + setup(host, port) + + try: + yield (host, port) + finally: + server.shutdown() + server.server_close() + t.join() + + +def with_http_server(func, handler=http.server.BaseHTTPRequestHandler, setup=None): + @wraps(func) + def inner(*args, **kwargs): + with http_server_context(handler, setup) as (host, port): + return func(*args, f"http://{host}:{port}", **kwargs) + return inner + + +def DirectoryHttpServer(directory) -> type[http.server.SimpleHTTPRequestHandler]: + # creates an http server that serves files from directory + class Handler(http.server.SimpleHTTPRequestHandler): + API_NO_RESPONSE = False + API_BAD_RESPONSE = False + + def do_GET(self): + if self.API_NO_RESPONSE: + return + + if self.API_BAD_RESPONSE: + self.send_response(500, "") + return + super().do_GET() + + def __init__(self, *args, **kwargs): + super().__init__(*args, directory=str(directory), **kwargs) + + return Handler diff --git a/iqpilot/selfdrive/test/longitudinal_maneuvers/.gitignore b/iqpilot/selfdrive/test/longitudinal_maneuvers/.gitignore new file mode 100644 index 000000000..d42ab353a --- /dev/null +++ b/iqpilot/selfdrive/test/longitudinal_maneuvers/.gitignore @@ -0,0 +1 @@ +out/* diff --git a/iqpilot/selfdrive/test/longitudinal_maneuvers/__init__.py b/iqpilot/selfdrive/test/longitudinal_maneuvers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/test/longitudinal_maneuvers/maneuver.py b/iqpilot/selfdrive/test/longitudinal_maneuvers/maneuver.py new file mode 100644 index 000000000..39aca63ef --- /dev/null +++ b/iqpilot/selfdrive/test/longitudinal_maneuvers/maneuver.py @@ -0,0 +1,88 @@ +import numpy as np +from iqpilot.selfdrive.test.longitudinal_maneuvers.plant import Plant + + +class Maneuver: + def __init__(self, title, duration, **kwargs): + # Was tempted to make a builder class + self.distance_lead = kwargs.get("initial_distance_lead", 200.0) + self.speed = kwargs.get("initial_speed", 0.0) + self.lead_relevancy = kwargs.get("lead_relevancy", 0) + + self.breakpoints = kwargs.get("breakpoints", [0.0, duration]) + self.speed_lead_values = kwargs.get("speed_lead_values", [0.0 for i in range(len(self.breakpoints))]) + self.prob_lead_values = kwargs.get("prob_lead_values", [1.0 for i in range(len(self.breakpoints))]) + self.prob_throttle_values = kwargs.get("prob_throttle_values", [1.0 for i in range(len(self.breakpoints))]) + self.cruise_values = kwargs.get("cruise_values", [50.0 for i in range(len(self.breakpoints))]) + self.pitch_values = kwargs.get("pitch_values", [0.0 for i in range(len(self.breakpoints))]) + + self.only_lead2 = kwargs.get("only_lead2", False) + self.only_radar = kwargs.get("only_radar", False) + self.ensure_start = kwargs.get("ensure_start", False) + self.ensure_slowdown = kwargs.get("ensure_slowdown", False) + self.enabled = kwargs.get("enabled", True) + self.e2e = kwargs.get("e2e", False) + self.personality = kwargs.get("personality", 0) + self.force_decel = kwargs.get("force_decel", False) + + self.duration = duration + self.title = title + + def evaluate(self): + plant = Plant( + lead_relevancy=self.lead_relevancy, + speed=self.speed, + distance_lead=self.distance_lead, + enabled=self.enabled, + only_lead2=self.only_lead2, + only_radar=self.only_radar, + e2e=self.e2e, + personality=self.personality, + force_decel=self.force_decel, + ) + + valid = True + started = not self.ensure_start + logs = [] + while plant.current_time < self.duration: + speed_lead = np.interp(plant.current_time, self.breakpoints, self.speed_lead_values) + prob_lead = np.interp(plant.current_time, self.breakpoints, self.prob_lead_values) + cruise = np.interp(plant.current_time, self.breakpoints, self.cruise_values) + pitch = np.interp(plant.current_time, self.breakpoints, self.pitch_values) + prob_throttle = np.interp(plant.current_time, self.breakpoints, self.prob_throttle_values) + log = plant.step(speed_lead, prob_lead, cruise, pitch, prob_throttle) + + d_rel = log['distance_lead'] - log['distance'] if self.lead_relevancy else 200. + v_rel = speed_lead - log['speed'] if self.lead_relevancy else 0. + log['d_rel'] = d_rel + log['v_rel'] = v_rel + logs.append(np.array([plant.current_time, + log['distance'], + log['distance_lead'], + log['speed'], + speed_lead, + log['acceleration'], + log['d_rel']])) + + if d_rel < .4 and (self.only_radar or prob_lead > 0.5): + print("Crashed!!!!") + valid = False + + if self.ensure_start and log['v_rel'] > 0 and log['acceleration'] >= 1e-3: + started = True + + if self.ensure_slowdown and log['speed'] > 5.5: + print('LongitudinalPlanner not slowing down!') + valid = False + + if not started: + print('LongitudinalPlanner not starting!') + valid = False + + if self.force_decel and log['speed'] > 1e-1 and log['acceleration'] > -0.04: + print('Not stopping with force decel') + valid = False + + + print("maneuver end", valid) + return valid, np.array(logs) diff --git a/iqpilot/selfdrive/test/longitudinal_maneuvers/plant.py b/iqpilot/selfdrive/test/longitudinal_maneuvers/plant.py new file mode 100755 index 000000000..5e39cffb2 --- /dev/null +++ b/iqpilot/selfdrive/test/longitudinal_maneuvers/plant.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 +import time +import numpy as np + +from iqpilot.cereal import log +import iqpilot.cereal.messaging as messaging +from iqpilot.common.realtime import Ratekeeper, DT_MDL +from iqpilot.selfdrive.controls.lib.longcontrol import LongCtrlState +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner +from iqpilot.selfdrive.controls.radard import _LEAD_ACCEL_TAU + + +class Plant: + messaging_initialized = False + + def __init__(self, lead_relevancy=False, speed=0.0, distance_lead=2.0, + enabled=True, only_lead2=False, only_radar=False, e2e=False, personality=0, force_decel=False): + self.rate = 1. / DT_MDL + + if not Plant.messaging_initialized: + Plant.radar = messaging.pub_sock('radarState') + Plant.controls_state = messaging.pub_sock('controlsState') + Plant.selfdrive_state = messaging.pub_sock('selfdriveState') + Plant.car_state = messaging.pub_sock('carState') + Plant.plan = messaging.sub_sock('longitudinalPlan') + Plant.messaging_initialized = True + + self.v_lead_prev = 0.0 + + self.distance = 0. + self.speed = speed + self.should_stop = False + self.acceleration = 0.0 + + # lead car + self.lead_relevancy = lead_relevancy + self.distance_lead = distance_lead + self.enabled = enabled + self.only_lead2 = only_lead2 + self.only_radar = only_radar + self.e2e = e2e + self.personality = personality + self.force_decel = force_decel + + self.rk = Ratekeeper(self.rate, print_delay_threshold=100.0) + self.ts = 1. / self.rate + time.sleep(0.1) + self.sm = messaging.SubMaster(['longitudinalPlan']) + + from iqdbc.car.honda.values import CAR + from iqdbc.car.honda.interface import CarInterface + + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + CP_IQ = CarInterface.get_non_essential_params_iq(CP, CAR.HONDA_CIVIC) + self.planner = LongitudinalPlanner(CP, CP_IQ, init_v=self.speed) + + @property + def current_time(self): + return float(self.rk.frame) / self.rate + + def step(self, v_lead=0.0, prob_lead=1.0, v_cruise=50., pitch=0.0, prob_throttle=1.0): + # ******** publish a fake model going straight and fake calibration ******** + # note that this is worst case for MPC, since model will delay long mpc by one time step + radar = messaging.new_message('radarState') + control = messaging.new_message('controlsState') + ss = messaging.new_message('selfdriveState') + car_state = messaging.new_message('carState') + lp = messaging.new_message('vehicleParameters') + car_control = messaging.new_message('carControl') + model = messaging.new_message('modelV2') + iq_car_state = messaging.new_message('iqCarState') + iq_nav_state = messaging.new_message('iqNavState') + live_map_data_iq = messaging.new_message('iqLiveData') + gps_data = messaging.new_message('gpsLocation') + a_lead = (v_lead - self.v_lead_prev)/self.ts + self.v_lead_prev = v_lead + + if self.lead_relevancy: + d_rel = np.maximum(0., self.distance_lead - self.distance) + v_rel = v_lead - self.speed + if self.only_radar: + status = True + elif prob_lead > .5: + status = True + else: + status = False + else: + d_rel = 200. + v_rel = 0. + prob_lead = 0.0 + status = False + + lead = log.RadarState.LeadData.new_message() + lead.dRel = float(d_rel) + lead.yRel = 0.0 + lead.vRel = float(v_rel) + lead.aRel = float(a_lead - self.acceleration) + lead.vLead = float(v_lead) + lead.vLeadK = float(v_lead) + lead.aLeadK = float(a_lead) + # TODO use real radard logic for this + lead.aLeadTau = float(_LEAD_ACCEL_TAU) + lead.status = status + lead.modelProb = float(prob_lead) + if not self.only_lead2: + radar.radarState.leadOne = lead + radar.radarState.leadTwo = lead + + # Simulate model predicting slightly faster speed + # this is to ensure lead policy is effective when model + # does not predict slowdown in e2e mode + position = log.XYZTData.new_message() + position.x = [float(x) for x in (self.speed + 0.5) * np.array(ModelConstants.T_IDXS)] + model.modelV2.position = position + model.modelV2.action.desiredAcceleration = float(self.acceleration + 0.5) + velocity = log.XYZTData.new_message() + velocity.x = [float(x) for x in (self.speed + 0.5) * np.ones_like(ModelConstants.T_IDXS)] + velocity.x[0] = float(self.speed) # always start at current speed + model.modelV2.velocity = velocity + acceleration = log.XYZTData.new_message() + acceleration.x = [float(x) for x in np.zeros_like(ModelConstants.T_IDXS)] + model.modelV2.acceleration = acceleration + model.modelV2.meta.disengagePredictions.gasPressProbs = [float(prob_throttle) for _ in range(6)] + lead_times = np.asarray(ModelConstants.LEAD_T_IDXS) + lead_accel = np.clip(a_lead, -10.0, 5.0) + stop_time = -v_lead / lead_accel if lead_accel < 0.0 else np.inf + motion_times = np.minimum(lead_times, stop_time) + lead_positions = d_rel + v_lead * motion_times + 0.5 * lead_accel * motion_times**2 + lead_velocities = np.maximum(v_lead + lead_accel * lead_times, 0.0) + for lead_prediction in model.modelV2.leadsV3: + lead_prediction.prob = float(prob_lead) + lead_prediction.x = [float(x) for x in lead_positions] + lead_prediction.v = [float(v) for v in lead_velocities] + + control.controlsState.longControlState = LongCtrlState.pid if self.enabled else LongCtrlState.off + ss.selfdriveState.experimentalMode = self.e2e + ss.selfdriveState.personality = self.personality + control.controlsState.forceDecel = self.force_decel + car_state.carState.vEgo = float(self.speed) + car_state.carState.standstill = bool(self.speed < 0.01) + car_state.carState.vCruise = float(v_cruise * 3.6) + car_control.carControl.orientationNED = [0., float(pitch), 0.] + + # ******** get controlsState messages for plotting *** + sm = {'radarState': radar.radarState, + 'carState': car_state.carState, + 'carControl': car_control.carControl, + 'controlsState': control.controlsState, + 'selfdriveState': ss.selfdriveState, + 'vehicleParameters': lp.vehicleParameters, + 'modelV2': model.modelV2, + 'iqCarState': iq_car_state.iqCarState, + 'iqNavState': iq_nav_state.iqNavState, + 'iqLiveData': live_map_data_iq.iqLiveData, + 'gpsLocation': gps_data.gpsLocation} + self.planner.update(sm) + self.acceleration = self.planner.output_a_target + if self.planner.output_should_stop: + self.acceleration = min(-0.5, self.acceleration) + self.speed = self.speed + self.acceleration * self.ts + self.should_stop = self.planner.output_should_stop + fcw = self.planner.fcw + self.distance_lead = self.distance_lead + v_lead * self.ts + + # ******** run the car ******** + #print(self.distance, speed) + if self.speed <= 0: + self.speed = 0 + self.acceleration = 0 + self.distance = self.distance + self.speed * self.ts + + # *** radar model *** + if self.lead_relevancy: + d_rel = np.maximum(0., self.distance_lead - self.distance) + v_rel = v_lead - self.speed + else: + d_rel = 200. + v_rel = 0. + + # print at 5hz + # if (self.rk.frame % (self.rate // 5)) == 0: + # print("%2.2f sec %6.2f m %6.2f m/s %6.2f m/s2 lead_rel: %6.2f m %6.2f m/s" + # % (self.current_time, self.distance, self.speed, self.acceleration, d_rel, v_rel)) + + + # ******** update prevs ******** + self.rk.monitor_time() + + return { + "distance": self.distance, + "speed": self.speed, + "acceleration": self.acceleration, + "should_stop": self.should_stop, + "distance_lead": self.distance_lead, + "fcw": fcw, + } + +# simple engage in standalone mode +def plant_thread(): + plant = Plant() + while 1: + plant.step() + + +if __name__ == "__main__": + plant_thread() diff --git a/iqpilot/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py b/iqpilot/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py new file mode 100644 index 000000000..017f294fd --- /dev/null +++ b/iqpilot/selfdrive/test/longitudinal_maneuvers/test_longitudinal.py @@ -0,0 +1,191 @@ +import itertools +from parameterized import parameterized_class + +from iqpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import STOP_DISTANCE +from iqpilot.selfdrive.test.longitudinal_maneuvers.maneuver import Maneuver + + +# TODO: make new FCW tests +def create_maneuvers(kwargs): + maneuvers = [ + Maneuver( + 'approach stopped car at 25m/s, initial distance: 120m', + duration=20., + initial_speed=25., + lead_relevancy=True, + initial_distance_lead=120., + speed_lead_values=[30., 0.], + breakpoints=[0., 1.], + **kwargs, + ), + Maneuver( + 'approach stopped car at 20m/s, initial distance 90m', + duration=20., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=90., + speed_lead_values=[20., 0.], + breakpoints=[0., 1.], + **kwargs, + ), + Maneuver( + 'steady state following a car at 20m/s, then lead decel to 0mph at 1m/s^2', + duration=50., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=35., + speed_lead_values=[20., 20., 0.], + breakpoints=[0., 15., 35.0], + **kwargs, + ), + Maneuver( + 'steady state following a car at 20m/s, then lead decel to 0mph at 2m/s^2', + duration=50., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=35., + speed_lead_values=[20., 20., 0.], + breakpoints=[0., 15., 25.0], + **kwargs, + ), + Maneuver( + 'steady state following a car at 20m/s, then lead decel to 0mph at 3m/s^2', + duration=50., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=35., + speed_lead_values=[20., 20., 0.], + breakpoints=[0., 15., 21.66], + **kwargs, + ), + Maneuver( + 'steady state following a car at 20m/s, then lead decel to 0mph at 3+m/s^2', + duration=40., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=35., + speed_lead_values=[20., 20., 0.], + prob_lead_values=[0., 1., 1.], + cruise_values=[20., 20., 20.], + breakpoints=[2., 2.01, 8.8], + **kwargs, + ), + Maneuver( + "approach stopped car at 20m/s, with prob_lead_values", + duration=30., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=120., + speed_lead_values=[0.0, 0., 0.], + prob_lead_values=[0.0, 0., 1.], + cruise_values=[20., 20., 20.], + breakpoints=[0.0, 2., 2.01], + **kwargs, + ), + Maneuver( + "approach stopped car at 20m/s, with prob_throttle_values and pitch = -0.1", + duration=30., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=120., + speed_lead_values=[0.0, 0., 0.], + prob_throttle_values=[1., 0., 0.], + cruise_values=[20., 20., 20.], + pitch_values=[0., -0.1, -0.1], + breakpoints=[0.0, 2., 2.01], + **kwargs, + ), + Maneuver( + "approach stopped car at 20m/s, with prob_throttle_values and pitch = +0.1", + duration=30., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=120., + speed_lead_values=[0.0, 0., 0.], + prob_throttle_values=[1., 0., 0.], + cruise_values=[20., 20., 20.], + pitch_values=[0., 0.1, 0.1], + breakpoints=[0.0, 2., 2.01], + **kwargs, + ), + Maneuver( + "approach slower cut-in car at 20m/s", + duration=20., + initial_speed=20., + lead_relevancy=True, + initial_distance_lead=50., + speed_lead_values=[15., 15.], + breakpoints=[1., 11.], + only_lead2=True, + **kwargs, + ), + Maneuver( + "stay stopped behind radar override lead", + duration=20., + initial_speed=0., + lead_relevancy=True, + initial_distance_lead=10., + speed_lead_values=[0., 0.], + prob_lead_values=[0., 0.], + breakpoints=[1., 11.], + only_radar=True, + **kwargs, + ), + Maneuver( + "NaN recovery", + duration=30., + initial_speed=15., + lead_relevancy=True, + initial_distance_lead=60., + speed_lead_values=[0., 0., 0.0], + breakpoints=[1., 1.01, 11.], + cruise_values=[float("nan"), 15., 15.], + **kwargs, + ), + Maneuver( + 'cruising at 25 m/s while disabled', + duration=20., + initial_speed=25., + lead_relevancy=False, + enabled=False, + **kwargs, + ), + Maneuver( + "slow to 5m/s with allow_throttle = False and pitch = +0.1", + duration=30., + initial_speed=20., + lead_relevancy=False, + prob_throttle_values=[1., 0., 0.], + cruise_values=[20., 20., 20.], + pitch_values=[0., 0.1, 0.1], + breakpoints=[0.0, 2., 2.01], + ensure_slowdown=True, + **kwargs, + )] + if not kwargs['force_decel']: + # controls relies on planner commanding to move for stock-ACC resume spamming + maneuvers.append(Maneuver( + "resume from a stop", + duration=20., + initial_speed=0., + lead_relevancy=True, + initial_distance_lead=STOP_DISTANCE, + speed_lead_values=[0., 0., 2.], + breakpoints=[1., 10., 15.], + ensure_start=True, + **kwargs, + )) + return maneuvers + + +@parameterized_class(("e2e", "force_decel"), itertools.product([True, False], repeat=2)) +class TestLongitudinalControl: + e2e: bool + force_decel: bool + + def test_maneuver(self, subtests): + for maneuver in create_maneuvers({"e2e": self.e2e, "force_decel": self.force_decel}): + with subtests.test(title=maneuver.title, e2e=maneuver.e2e, force_decel=maneuver.force_decel): + print(maneuver.title, f'in {"e2e" if maneuver.e2e else "acc"} mode') + valid, _ = maneuver.evaluate() + assert valid diff --git a/iqpilot/selfdrive/test/process_replay/.gitignore b/iqpilot/selfdrive/test/process_replay/.gitignore new file mode 100644 index 000000000..a35cd58d4 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/.gitignore @@ -0,0 +1 @@ +fakedata/ diff --git a/iqpilot/selfdrive/test/process_replay/README.md b/iqpilot/selfdrive/test/process_replay/README.md new file mode 100644 index 000000000..3ea5a1ba3 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/README.md @@ -0,0 +1,122 @@ +# Process replay + +Process replay is a regression test designed to identify any changes in the output of a process. This test replays a segment through individual processes and compares the output to a known good replay. Each make is represented in the test with a segment. + +If the test fails, make sure that you didn't unintentionally change anything. If there are intentional changes, the reference logs will be updated. + +Use `test_processes.py` to run the test locally. +Log files are cached by default. Use `DISABLE_FILEREADER_CACHE='1' test_processes.py` to disable caching. + +Currently the following processes are tested: + +* controlsd +* radard +* plannerd +* calibrationd +* dmonitoringd +* locationd +* ubloxd + +### Usage +``` +Usage: test_processes.py [-h] [--whitelist-procs PROCS] [--whitelist-cars CARS] [--blacklist-procs PROCS] + [--blacklist-cars CARS] [--ignore-fields FIELDS] [--ignore-msgs MSGS] [--update-refs] [--upload-only] +Regression test to identify changes in a process's output +optional arguments: + -h, --help show this help message and exit + --whitelist-procs PROCS Whitelist given processes from the test (e.g. controlsd) + --whitelist-cars WHITELIST_CARS Whitelist given cars from the test (e.g. HONDA) + --blacklist-procs BLACKLIST_PROCS Blacklist given processes from the test (e.g. controlsd) + --blacklist-cars BLACKLIST_CARS Blacklist given cars from the test (e.g. HONDA) + --ignore-fields IGNORE_FIELDS Extra fields or msgs to ignore (e.g. driverMonitoringState.events) + --ignore-msgs IGNORE_MSGS Msgs to ignore (e.g. onroadEvents) + --update-refs Updates reference logs using current commit + --upload-only Skips testing processes and uploads logs from previous test run +``` + +## Forks + +openpilot forks can use this test with their own reference logs, by default `test_proccesses.py` saves logs locally. + +To generate new logs: + +`./test_processes.py` + +Then, check in the new logs using git-lfs. Make sure to also update the `ref_commit` file to the current commit. + +## API + +Process replay test suite exposes programmatic APIs for simultaneously running processes or groups of processes on provided logs. + +```py +def replay_process_with_name(name: Union[str, Iterable[str]], lr: LogIterable, *args, **kwargs) -> List[capnp._DynamicStructReader]: + +def replay_process( + cfg: Union[ProcessConfig, Iterable[ProcessConfig]], lr: LogIterable, frs: Optional[Dict[str, Any]] = None, + fingerprint: Optional[str] = None, return_all_logs: bool = False, custom_params: Optional[Dict[str, Any]] = None, disable_progress: bool = False +) -> List[capnp._DynamicStructReader]: +``` + +Example usage: +```py +from iqpilot.selfdrive.test.process_replay import replay_process_with_name +from iqpilot.tools.lib.logreader import LogReader + +lr = LogReader(...) + +# provide a name of the process to replay +output_logs = replay_process_with_name('locationd', lr) + +# or list of names +output_logs = replay_process_with_name(['ubloxd', 'locationd'], lr) +``` + +Supported processes: +* controlsd +* radard +* plannerd +* calibrationd +* dmonitoringd +* locationd +* ubloxd +* modeld +* dmonitoringmodeld + +Certain processes may require an initial state, which is usually supplied within `Params` and persisting from segment to segment (e.g CalibrationParams, LiveParameters). The `custom_params` is dictionary used to prepopulate `Params` with arbitrary values. The `get_custom_params_from_lr` helper is provided to fetch meaningful values from log files. + +```py +from iqpilot.selfdrive.test.process_replay import get_custom_params_from_lr + +previous_segment_lr = LogReader(...) +current_segment_lr = LogReader(...) + +custom_params = get_custom_params_from_lr(previous_segment_lr, 'last') + +output_logs = replay_process_with_name('calibrationd', lr, custom_params=custom_params) +``` + +Replaying processes that use VisionIPC (e.g. modeld, dmonitoringmodeld) require additional `frs` dictionary with camera states as keys and `FrameReader` objects as values. + +```py +from iqpilot.tools.lib.framereader import FrameReader + +frs = { + 'roadCameraState': FrameReader(...), + 'wideRoadCameraState': FrameReader(...), + 'driverCameraState': FrameReader(...), +} + +output_logs = replay_process_with_name(['modeld', 'dmonitoringmodeld'], lr, frs=frs) +``` + +To capture stdout/stderr of the replayed process, `captured_output_store` can be provided. + +```py +output_store = dict() +# pass dictionary by reference, it will be filled with standard outputs - even if process replay fails +output_logs = replay_process_with_name(['radard', 'plannerd'], lr, captured_output_store=output_store) + +# entries with captured output in format { 'out': '...', 'err': '...' } will be added to provided dictionary for each replayed process +print(output_store['radard']['out']) # radard stdout +print(output_store['radard']['err']) # radard stderr +``` diff --git a/iqpilot/selfdrive/test/process_replay/__init__.py b/iqpilot/selfdrive/test/process_replay/__init__.py new file mode 100644 index 000000000..b3082100d --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/__init__.py @@ -0,0 +1,2 @@ +from iqpilot.selfdrive.test.process_replay.process_replay import CONFIGS, get_process_config, get_custom_params_from_lr, \ + replay_process, replay_process_with_name # noqa: F401 diff --git a/iqpilot/selfdrive/test/process_replay/capture.py b/iqpilot/selfdrive/test/process_replay/capture.py new file mode 100644 index 000000000..90c279ef3 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/capture.py @@ -0,0 +1,59 @@ +import os +import sys + +from typing import no_type_check + +class FdRedirect: + def __init__(self, file_prefix: str, fd: int): + fname = os.path.join("/tmp", f"{file_prefix}.{fd}") + if os.path.exists(fname): + os.unlink(fname) + self.dest_fd = os.open(fname, os.O_WRONLY | os.O_CREAT) + self.dest_fname = fname + self.source_fd = fd + os.set_inheritable(self.dest_fd, True) + + def __del__(self): + os.close(self.dest_fd) + + def purge(self) -> None: + os.unlink(self.dest_fname) + + def read(self) -> bytes: + with open(self.dest_fname, "rb") as f: + return f.read() or b"" + + def link(self) -> None: + os.dup2(self.dest_fd, self.source_fd) + + +class ProcessOutputCapture: + def __init__(self, proc_name: str, prefix: str): + prefix = f"{proc_name}_{prefix}" + self.stdout_redirect = FdRedirect(prefix, 1) + self.stderr_redirect = FdRedirect(prefix, 2) + + def __del__(self): + self.stdout_redirect.purge() + self.stderr_redirect.purge() + + @no_type_check # ipython classes have incompatible signatures + def link_with_current_proc(self) -> None: + try: + # prevent ipykernel from redirecting stdout/stderr of python subprocesses + from ipykernel.iostream import OutStream + if isinstance(sys.stdout, OutStream): + sys.stdout = sys.__stdout__ + if isinstance(sys.stderr, OutStream): + sys.stderr = sys.__stderr__ + except ImportError: + pass + + # link stdout/stderr to the fifo + self.stdout_redirect.link() + self.stderr_redirect.link() + + def read_outerr(self) -> tuple[str, str]: + out_str = self.stdout_redirect.read().decode() + err_str = self.stderr_redirect.read().decode() + return out_str, err_str diff --git a/iqpilot/selfdrive/test/process_replay/compare_logs.py b/iqpilot/selfdrive/test/process_replay/compare_logs.py new file mode 100755 index 000000000..4c5672ab2 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/compare_logs.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +import sys +import math +import capnp +import numbers +import dictdiffer +from collections import Counter + +from iqpilot.tools.lib.logreader import LogReader + +EPSILON = sys.float_info.epsilon + + +def remove_ignored_fields(msg, ignore): + msg = msg.as_builder() + for key in ignore: + attr = msg + keys = key.split(".") + if msg.which() != keys[0] and len(keys) > 1: + continue + + for k in keys[:-1]: + # indexing into list + if k.isdigit(): + attr = attr[int(k)] + else: + attr = getattr(attr, k) + + v = getattr(attr, keys[-1]) + if isinstance(v, bool): + val = False + elif isinstance(v, numbers.Number): + val = 0 + elif isinstance(v, (list, capnp.lib.capnp._DynamicListBuilder)): + val = [] + elif isinstance(v, str): + val = "" + elif isinstance(v, capnp.lib.capnp._DynamicEnum): + val = 0 + else: + raise NotImplementedError(f"Unknown type: {type(v)}") + setattr(attr, keys[-1], val) + return msg + + +def compare_logs(log1, log2, ignore_fields=None, ignore_msgs=None, tolerance=None,): + if ignore_fields is None: + ignore_fields = [] + if ignore_msgs is None: + ignore_msgs = [] + tolerance = EPSILON if tolerance is None else tolerance + + log1, log2 = ( + [m for m in log if m.which() not in ignore_msgs] + for log in (log1, log2) + ) + + if len(log1) != len(log2): + cnt1 = Counter(m.which() for m in log1) + cnt2 = Counter(m.which() for m in log2) + raise Exception(f"logs are not same length: {len(log1)} VS {len(log2)}\n\t\t{cnt1}\n\t\t{cnt2}") + + diff = [] + for msg1, msg2 in zip(log1, log2, strict=True): + if msg1.which() != msg2.which(): + raise Exception("msgs not aligned between logs") + + msg1 = remove_ignored_fields(msg1, ignore_fields) + msg2 = remove_ignored_fields(msg2, ignore_fields) + + if msg1.to_bytes() != msg2.to_bytes(): + msg1_dict = msg1.as_reader().to_dict(verbose=True) + msg2_dict = msg2.as_reader().to_dict(verbose=True) + + dd = dictdiffer.diff(msg1_dict, msg2_dict, ignore=ignore_fields) + + # Dictdiffer only supports relative tolerance, we also want to check for absolute + # TODO: add this to dictdiffer + def outside_tolerance(diff): + try: + if diff[0] == "change": + a, b = diff[2] + finite = math.isfinite(a) and math.isfinite(b) + if finite and isinstance(a, numbers.Number) and isinstance(b, numbers.Number): + return abs(a - b) > max(tolerance, tolerance * max(abs(a), abs(b))) + except TypeError: + pass + return True + + dd = list(filter(outside_tolerance, dd)) + + diff.extend(dd) + return diff + + +def format_process_diff(diff): + diff_short, diff_long = "", "" + + if isinstance(diff, str): + diff_short += f" {diff}\n" + diff_long += f"\t{diff}\n" + else: + cnt: dict[str, int] = {} + for d in diff: + diff_long += f"\t{str(d)}\n" + + k = str(d[1]) + cnt[k] = 1 if k not in cnt else cnt[k] + 1 + + for k, v in sorted(cnt.items()): + diff_short += f" {k}: {v}\n" + + return diff_short, diff_long + + +def format_diff(results, log_paths, ref_commit): + diff_short, diff_long = "", "" + diff_long += f"***** tested against commit {ref_commit} *****\n" + + failed = False + for segment, result in list(results.items()): + diff_short += f"***** results for segment {segment} *****\n" + diff_long += f"***** differences for segment {segment} *****\n" + + for proc, diff in list(result.items()): + diff_long += f"*** process: {proc} ***\n" + diff_long += f"\tref: {log_paths[segment][proc]['ref']}\n" + diff_long += f"\tnew: {log_paths[segment][proc]['new']}\n\n" + + diff_short += f" {proc}\n" + + if isinstance(diff, str) or len(diff): + diff_short += f" ref: {log_paths[segment][proc]['ref']}\n" + diff_short += f" new: {log_paths[segment][proc]['new']}\n\n" + failed = True + + proc_diff_short, proc_diff_long = format_process_diff(diff) + + diff_long += proc_diff_long + diff_short += proc_diff_short + + return diff_short, diff_long, failed + + +if __name__ == "__main__": + log1 = list(LogReader(sys.argv[1])) + log2 = list(LogReader(sys.argv[2])) + ignore_fields = sys.argv[3:] or ["logMonoTime"] + results = {"segment": {"proc": compare_logs(log1, log2, ignore_fields)}} + log_paths = {"segment": {"proc": {"ref": sys.argv[1], "new": sys.argv[2]}}} + diff_short, diff_long, failed = format_diff(results, log_paths, None) + + print(diff_long) + print(diff_short) diff --git a/iqpilot/selfdrive/test/process_replay/migration.py b/iqpilot/selfdrive/test/process_replay/migration.py new file mode 100644 index 000000000..a32bc5485 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/migration.py @@ -0,0 +1,477 @@ +from collections import defaultdict +from collections.abc import Callable +from typing import cast +import capnp +import functools +import traceback + +from iqpilot.cereal import messaging, car, log +from iqdbc.car.fingerprints import MIGRATION +from iqdbc.car.toyota.values import EPS_SCALE, ToyotaSafetyFlags +from iqdbc.car.ford.values import CAR as FORD, FordFlags, FordSafetyFlags +from iqdbc.car.hyundai.values import HyundaiSafetyFlags +from iqdbc.car.gm.values import GMSafetyFlags +from iqpilot.selfdrive.iqmodeld.config import ModelConstants +from iqpilot.selfdrive.iqmodeld.messaging import fill_xyz_poly, fill_lane_line_meta +from iqpilot.selfdrive.test.process_replay.vision_meta import meta_from_encode_index +from iqpilot.selfdrive.controls.lib.longitudinal_planner import get_accel_from_plan, CONTROL_N_T_IDX +from iqpilot.tools.lib.logreader import LogIterable + +MessageWithIndex = tuple[int, capnp.lib.capnp._DynamicStructReader] +MigrationOps = tuple[list[tuple[int, capnp.lib.capnp._DynamicStructReader]], list[capnp.lib.capnp._DynamicStructReader], list[int]] +MigrationFunc = Callable[[list[MessageWithIndex]], MigrationOps] + + +# rules for migration functions +# 1. must use the decorator @migration(inputs=[...], product="...") and MigrationFunc signature +# 2. it only gets the messages that are in the inputs list +# 3. product is the message type created by the migration function, and the function will be skipped if product type already exists in lr +# 4. it must return a list of operations to be applied to the logreader (replace, add, delete) +# 5. all migration functions must be independent of each other +def migrate_all(lr: LogIterable, manager_states: bool = False, panda_states: bool = False, camera_states: bool = False, + live_location_kalman: bool = True): + migrations = [ + migrate_sensorEvents, + migrate_carParams, + migrate_gpsLocation, + migrate_deviceState, + migrate_carOutput, + migrate_controlsState, + migrate_carState, + migrate_radarTracks, + migrate_driverAssistance, + migrate_drivingModelData, + migrate_onroadEvents, + migrate_driverMonitoringState, + migrate_longitudinalPlan, + ] + if manager_states: + migrations.append(migrate_managerState) + if panda_states: + migrations.extend([migrate_pandaStates, migrate_peripheralState]) + if camera_states: + migrations.append(migrate_cameraStates) + if live_location_kalman: + migrations.append(migrate_liveLocationKalman) + + return migrate(lr, migrations) + + +def migrate(lr: LogIterable, migration_funcs: list[MigrationFunc]): + lr = list(lr) + grouped = defaultdict(list) + for i, msg in enumerate(lr): + grouped[msg.which()].append(i) + + replace_ops, add_ops, del_ops = [], [], [] + for migration in migration_funcs: + assert hasattr(migration, "inputs") and hasattr(migration, "product"), "Migration functions must use @migration decorator" + if migration.product in grouped: # skip if product already exists + continue + + sorted_indices = sorted(ii for i in cast(list[str], migration.inputs) for ii in grouped.get(i, [])) + msg_gen = [(i, lr[i]) for i in sorted_indices] + r_ops, a_ops, d_ops = migration(msg_gen) + replace_ops.extend(r_ops) + add_ops.extend(a_ops) + del_ops.extend(d_ops) + + for index, msg in replace_ops: + lr[index] = msg + for index in sorted(del_ops, reverse=True): + del lr[index] + for msg in add_ops: + lr.append(msg) + lr = sorted(lr, key=lambda x: x.logMonoTime) + + return lr + + +def migration(inputs: list[str], product: str|None=None): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + wrapper.inputs = inputs + wrapper.product = product + return wrapper + return decorator + + +@migration(inputs=["longitudinalPlan", "carParams"]) +def migrate_longitudinalPlan(msgs): + ops = [] + + needs_migration = all(msg.longitudinalPlan.aTarget == 0.0 for _, msg in msgs if msg.which() == 'longitudinalPlan') + CP = next((m.carParams for _, m in msgs if m.which() == 'carParams'), None) + if not needs_migration or CP is None: + return [], [], [] + + for index, msg in msgs: + if msg.which() != 'longitudinalPlan': + continue + new_msg = msg.as_builder() + a_target, should_stop = get_accel_from_plan(msg.longitudinalPlan.speeds, msg.longitudinalPlan.accels, CONTROL_N_T_IDX) + new_msg.longitudinalPlan.aTarget, new_msg.longitudinalPlan.shouldStop = float(a_target), bool(should_stop) + ops.append((index, new_msg.as_reader())) + return ops, [], [] + + +@migration(inputs=["longitudinalPlan"], product="driverAssistance") +def migrate_driverAssistance(msgs): + add_ops = [] + for _, msg in msgs: + new_msg = messaging.new_message('driverAssistance', valid=True, logMonoTime=msg.logMonoTime) + add_ops.append(new_msg.as_reader()) + return [], add_ops, [] + + +@migration(inputs=["modelV2"], product="drivingModelData") +def migrate_drivingModelData(msgs): + add_ops = [] + for _, msg in msgs: + dmd = messaging.new_message('drivingModelData', valid=msg.valid, logMonoTime=msg.logMonoTime) + for field in ["frameId", "frameIdExtra", "frameDropPerc", "modelExecutionTime", "action"]: + setattr(dmd.drivingModelData, field, getattr(msg.modelV2, field)) + for meta_field in ["laneChangeState", "laneChangeState"]: + setattr(dmd.drivingModelData.meta, meta_field, getattr(msg.modelV2.meta, meta_field)) + lane_lines = msg.modelV2.laneLines + lane_probs = msg.modelV2.laneLineProbs + if len(lane_lines) > 2 and len(lane_probs) > 2 and len(lane_lines[1].y) and len(lane_lines[2].y): + fill_lane_line_meta(dmd.drivingModelData.laneLineMeta, msg.modelV2.laneLines, msg.modelV2.laneLineProbs) + if all(len(a) for a in [msg.modelV2.position.x, msg.modelV2.position.y, msg.modelV2.position.z]): + fill_xyz_poly(dmd.drivingModelData.path, ModelConstants.POLY_PATH_DEGREE, msg.modelV2.position.x, msg.modelV2.position.y, msg.modelV2.position.z) + add_ops.append( dmd.as_reader()) + return [], add_ops, [] + + +@migration(inputs=["radarTracksDEPRECATED"], product="radarTracks") +def migrate_radarTracks(msgs): + ops = [] + for index, msg in msgs: + new_msg = messaging.new_message('radarTracks') + new_msg.valid = msg.valid + new_msg.logMonoTime = msg.logMonoTime + + pts = [] + for track in msg.radarTracksDEPRECATED: + pt = car.RadarData.RadarPoint() + pt.trackId = track.trackId + + pt.dRel = track.dRel + pt.yRel = track.yRel + pt.vRel = track.vRel + pt.aRel = track.aRel + pt.measured = True + pts.append(pt) + + new_msg.radarTracks.points = pts + ops.append((index, new_msg.as_reader())) + return ops, [], [] + + +@migration(inputs=["liveLocationKalmanDEPRECATED"], product="deviceMotion") +def migrate_liveLocationKalman(msgs): + nans = [float('nan')] * 3 + ops = [] + for index, msg in msgs: + m = messaging.new_message('deviceMotion') + m.valid = msg.valid + m.logMonoTime = msg.logMonoTime + for field in ["orientationNED", "velocityDevice", "accelerationDevice", "angularVelocityDevice"]: + lp_field, llk_field = getattr(m.deviceMotion, field), getattr(msg.liveLocationKalmanDEPRECATED, field) + lp_field.x, lp_field.y, lp_field.z = llk_field.value or nans + lp_field.xStd, lp_field.yStd, lp_field.zStd = llk_field.std or nans + lp_field.valid = llk_field.valid + for flag in ["inputsOK", "posenetOK", "sensorsOK"]: + setattr(m.deviceMotion, flag, getattr(msg.liveLocationKalmanDEPRECATED, flag)) + ops.append((index, m.as_reader())) + return ops, [], [] + + +@migration(inputs=["controlsState"], product="selfdriveState") +def migrate_controlsState(msgs): + add_ops = [] + for _, msg in msgs: + m = messaging.new_message('selfdriveState') + m.valid = msg.valid + m.logMonoTime = msg.logMonoTime + ss = m.selfdriveState + for field in ("enabled", "active", "state", "engageable", "alertText1", "alertText2", + "alertStatus", "alertSize", "alertType", "experimentalMode", + "personality"): + setattr(ss, field, getattr(msg.controlsState, field+"DEPRECATED")) + add_ops.append(m.as_reader()) + return [], add_ops, [] + + +@migration(inputs=["carState", "controlsState"]) +def migrate_carState(msgs): + ops = [] + last_cs = None + for index, msg in msgs: + if msg.which() == 'controlsState': + last_cs = msg + elif msg.which() == 'carState' and last_cs is not None: + if last_cs.controlsState.vCruiseDEPRECATED - msg.carState.vCruise > 0.1: + msg = msg.as_builder() + msg.carState.vCruise = last_cs.controlsState.vCruiseDEPRECATED + msg.carState.vCruiseCluster = last_cs.controlsState.vCruiseClusterDEPRECATED + ops.append((index, msg.as_reader())) + return ops, [], [] + + +@migration(inputs=["managerState"]) +def migrate_managerState(msgs): + ops = [] + for index, msg in msgs: + new_msg = msg.as_builder() + for process in new_msg.managerState.processes: + process.running = True + ops.append((index, new_msg.as_reader())) + return ops, [], [] + + +@migration(inputs=["gpsLocation", "gpsLocationExternal"]) +def migrate_gpsLocation(msgs): + ops = [] + for index, msg in msgs: + new_msg = msg.as_builder() + g = getattr(new_msg, new_msg.which()) + # hasFix is a newer field + if not g.hasFix and g.flags == 1: + g.hasFix = True + ops.append((index, new_msg.as_reader())) + return ops, [], [] + + +@migration(inputs=["deviceState", "initData"]) +def migrate_deviceState(msgs): + init_data = next((m.initData for _, m in msgs if m.which() == 'initData'), None) + device_state = next((m.deviceState for _, m in msgs if m.which() == 'deviceState'), None) + if init_data is None or device_state is None: + return [], [], [] + + ops = [] + for i, msg in msgs: + if msg.which() == 'deviceState': + n = msg.as_builder() + n.deviceState.deviceType = init_data.deviceType + ops.append((i, n.as_reader())) + return ops, [], [] + + +@migration(inputs=["carControl"], product="carOutput") +def migrate_carOutput(msgs): + add_ops = [] + for _, msg in msgs: + co = messaging.new_message('carOutput') + co.valid = msg.valid + co.logMonoTime = msg.logMonoTime + co.carOutput.actuatorsOutput = msg.carControl.actuatorsOutputDEPRECATED + add_ops.append(co.as_reader()) + return [], add_ops, [] + + +@migration(inputs=["pandaStates", "pandaStateDEPRECATED", "carParams"]) +def migrate_pandaStates(msgs): + # TODO: safety param migration should be handled automatically + safety_param_migration = { + "TOYOTA_PRIUS": EPS_SCALE["TOYOTA_PRIUS"] | ToyotaSafetyFlags.STOCK_LONGITUDINAL, + "TOYOTA_RAV4": EPS_SCALE["TOYOTA_RAV4"] | ToyotaSafetyFlags.ALT_BRAKE, + "KIA_EV6": HyundaiSafetyFlags.EV_GAS | HyundaiSafetyFlags.CANFD_LKA_STEERING, + "CHEVROLET_VOLT": GMSafetyFlags.EV, + "CHEVROLET_BOLT_EUV": GMSafetyFlags.EV | GMSafetyFlags.HW_CAM, + } + # TODO: get new Ford route + safety_param_migration |= dict.fromkeys((set(FORD) - FORD.with_flags(FordFlags.CANFD)), FordSafetyFlags.LONG_CONTROL) + + # Migrate safety param base on carParams + CP = next((m.carParams for _, m in msgs if m.which() == 'carParams'), None) + assert CP is not None, "carParams message not found" + fingerprint = MIGRATION.get(CP.carFingerprint, CP.carFingerprint) + if fingerprint in safety_param_migration: + safety_param = safety_param_migration[fingerprint].value + elif len(CP.safetyConfigs): + safety_param = CP.safetyConfigs[0].safetyParam + if CP.safetyConfigs[0].safetyParamDEPRECATED != 0: + safety_param = CP.safetyConfigs[0].safetyParamDEPRECATED + else: + safety_param = CP.safetyParamDEPRECATED + + ops = [] + for index, msg in msgs: + if msg.which() == 'pandaStateDEPRECATED': + new_msg = messaging.new_message('pandaStates', 1) + new_msg.valid = msg.valid + new_msg.logMonoTime = msg.logMonoTime + new_msg.pandaStates[0] = msg.pandaStateDEPRECATED + new_msg.pandaStates[0].safetyParam = safety_param + ops.append((index, new_msg.as_reader())) + elif msg.which() == 'pandaStates': + new_msg = msg.as_builder() + new_msg.pandaStates[-1].safetyParam = safety_param + # Clear DISABLE_DISENGAGE_ON_GAS bit to fix controls mismatch + new_msg.pandaStates[-1].alternativeExperience &= ~1 + ops.append((index, new_msg.as_reader())) + return ops, [], [] + + +@migration(inputs=["pandaStates", "pandaStateDEPRECATED"], product="peripheralState") +def migrate_peripheralState(msgs): + add_ops = [] + + which = "pandaStates" if any(msg.which() == "pandaStates" for _, msg in msgs) else "pandaStateDEPRECATED" + for _, msg in msgs: + if msg.which() != which: + continue + new_msg = messaging.new_message("peripheralState") + new_msg.valid = msg.valid + new_msg.logMonoTime = msg.logMonoTime + add_ops.append(new_msg.as_reader()) + return [], add_ops, [] + + +@migration(inputs=["roadEncodeIdx", "wideRoadEncodeIdx", "driverEncodeIdx", "roadCameraState", "wideRoadCameraState", "driverCameraState"]) +def migrate_cameraStates(msgs): + add_ops, del_ops = [], [] + frame_to_encode_id = defaultdict(dict) + # just for encodeId fallback mechanism + min_frame_id = defaultdict(lambda: float('inf')) + + for _, msg in msgs: + if msg.which() not in ["roadEncodeIdx", "wideRoadEncodeIdx", "driverEncodeIdx"]: + continue + + encode_index = getattr(msg, msg.which()) + meta = meta_from_encode_index(msg.which()) + + assert encode_index.segmentId < 1200, f"Encoder index segmentId greater that 1200: {msg.which()} {encode_index.segmentId}" + frame_to_encode_id[meta.camera_state][encode_index.frameId] = encode_index.segmentId + + for index, msg in msgs: + if msg.which() not in ["roadCameraState", "wideRoadCameraState", "driverCameraState"]: + continue + + camera_state = getattr(msg, msg.which()) + min_frame_id[msg.which()] = min(min_frame_id[msg.which()], camera_state.frameId) + + encode_id = frame_to_encode_id[msg.which()].get(camera_state.frameId) + if encode_id is None: + print(f"Missing encoded frame for camera feed {msg.which()} with frameId: {camera_state.frameId}") + if len(frame_to_encode_id[msg.which()]) != 0: + del_ops.append(index) + continue + + # fallback mechanism for logs without encodeIdx (e.g. logs from before 2022 with dcamera recording disabled) + # try to fake encode_id by subtracting lowest frameId + encode_id = camera_state.frameId - min_frame_id[msg.which()] + print(f"Faking encodeId to {encode_id} for camera feed {msg.which()} with frameId: {camera_state.frameId}") + + new_msg = messaging.new_message(msg.which()) + new_camera_state = getattr(new_msg, new_msg.which()) + new_camera_state.sensor = camera_state.sensor + new_camera_state.frameId = encode_id + new_camera_state.encodeId = encode_id + # timestampSof was added later so it might be missing on some old segments + if camera_state.timestampSof == 0 and camera_state.timestampEof > 25000000: + new_camera_state.timestampSof = camera_state.timestampEof - 18000000 + else: + new_camera_state.timestampSof = camera_state.timestampSof + new_camera_state.timestampEof = camera_state.timestampEof + new_msg.logMonoTime = msg.logMonoTime + new_msg.valid = msg.valid + + del_ops.append(index) + add_ops.append(new_msg.as_reader()) + return [], add_ops, del_ops + + +@migration(inputs=["carParams"]) +def migrate_carParams(msgs): + ops = [] + for index, msg in msgs: + CP = msg.as_builder() + CP.carParams.carFingerprint = MIGRATION.get(CP.carParams.carFingerprint, CP.carParams.carFingerprint) + for car_fw in CP.carParams.carFw: + car_fw.brand = CP.carParams.brand + ops.append((index, CP.as_reader())) + return ops, [], [] + + +@migration(inputs=["sensorEventsDEPRECATED"], product="sensorEvents") +def migrate_sensorEvents(msgs): + add_ops, del_ops = [], [] + for index, msg in msgs: + # migrate to split sensor events + for evt in msg.sensorEventsDEPRECATED: + # build new message for each sensor type + sensor_service = '' + if evt.which() == 'acceleration': + sensor_service = 'accelerometer' + elif evt.which() == 'gyro' or evt.which() == 'gyroUncalibrated': + sensor_service = 'gyroscope' + elif evt.which() == 'light' or evt.which() == 'proximity': + sensor_service = 'lightSensor' + elif evt.which() == 'magnetic' or evt.which() == 'magneticUncalibrated': + sensor_service = 'magnetometer' + elif evt.which() == 'temperature': + sensor_service = 'temperatureSensor' + + m = messaging.new_message(sensor_service) + m.valid = True + m.logMonoTime = msg.logMonoTime + + m_dat = getattr(m, sensor_service) + m_dat.version = evt.version + m_dat.sensor = evt.sensor + m_dat.type = evt.type + m_dat.source = evt.source + m_dat.timestamp = evt.timestamp + setattr(m_dat, evt.which(), getattr(evt, evt.which())) + + add_ops.append(m.as_reader()) + del_ops.append(index) + return [], add_ops, del_ops + + +@migration(inputs=["onroadEventsDEPRECATED"], product="onroadEvents") +def migrate_onroadEvents(msgs): + ops = [] + for index, msg in msgs: + onroadEvents = [] + for event in msg.onroadEventsDEPRECATED: + try: + if not str(event.name).endswith('DEPRECATED'): + # dict converts name enum into string representation + onroadEvents.append(log.OnroadEvent(**event.to_dict())) + except RuntimeError: # Member was null + traceback.print_exc() + + new_msg = messaging.new_message('onroadEvents', len(msg.onroadEventsDEPRECATED)) + new_msg.valid = msg.valid + new_msg.logMonoTime = msg.logMonoTime + new_msg.onroadEvents = onroadEvents + ops.append((index, new_msg.as_reader())) + + return ops, [], [] + + +@migration(inputs=["driverMonitoringState"]) +def migrate_driverMonitoringState(msgs): + ops = [] + for index, msg in msgs: + msg = msg.as_builder() + events = [] + for event in msg.driverMonitoringState.eventsDEPRECATED: + try: + if not str(event.name).endswith('DEPRECATED'): + # dict converts name enum into string representation + events.append(log.OnroadEvent(**event.to_dict())) + except RuntimeError: # Member was null + traceback.print_exc() + + msg.driverMonitoringState.events = events + ops.append((index, msg.as_reader())) + + return ops, [], [] diff --git a/iqpilot/selfdrive/test/process_replay/model_replay.py b/iqpilot/selfdrive/test/process_replay/model_replay.py new file mode 100755 index 000000000..f37cad481 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/model_replay.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python3 +import os +import pickle +import sys +from collections import defaultdict +from typing import Any + +import numpy as np +from tabulate import tabulate + +from iqpilot.system.hardware import PC +from iqpilot.tools.lib.logreader import get_url +from iqpilot.selfdrive.test.process_replay.compare_logs import compare_logs, format_diff +from iqpilot.selfdrive.test.process_replay.process_replay import get_process_config, replay_process +from iqpilot.tools.lib.framereader import FrameReader +from iqpilot.tools.lib.logreader import LogReader, save_log + +TEST_ROUTE = "8494c69d3c710e81|000001d4--2648a9a404" +SEGMENT = 4 +START_FRAME = 0 +END_FRAME = 60 + +SEND_EXTRA_INPUTS = bool(int(os.getenv("SEND_EXTRA_INPUTS", "0"))) + +MODEL_REPLAY_BUCKET="model_replay_master" + +EXEC_TIMINGS = [ + # model, instant max, average max + ("modelV2", 0.035, 0.025), + ("driverStateV2", 0.02, 0.015), +] + +def get_log_fn(test_route, ref="master"): + return f"{test_route}_model_tici_{ref}.zst" + +def get_model_replay_url(filename): + return f"https://raw.githubusercontent.com/commaai/ci-artifacts/refs/heads/{MODEL_REPLAY_BUCKET}/{filename}" + +def trim_logs(logs, start_frame, end_frame, frs_types, include_all_types): + all_msgs = [] + cam_state_counts = defaultdict(int) + for msg in sorted(logs, key=lambda m: m.logMonoTime): + if msg.which() in frs_types: + cam_state_counts[msg.which()] += 1 + if any(cam_state_counts[state] >= start_frame for state in frs_types): + all_msgs.append(msg) + if all(cam_state_counts[state] == end_frame for state in frs_types): + break + + if len(include_all_types) != 0: + other_msgs = [m for m in logs if m.which() in include_all_types] + all_msgs.extend(other_msgs) + + return all_msgs + + +def model_replay(lr, frs): + # modeld is using frame pairs + modeld_logs = trim_logs(lr, START_FRAME, END_FRAME, {"roadCameraState", "wideRoadCameraState"}, + {"roadEncodeIdx", "wideRoadEncodeIdx", "carParams", "carState", "carControl", "can"}) + dmodeld_logs = trim_logs(lr, START_FRAME, END_FRAME, {"driverCameraState"}, {"driverEncodeIdx", "carParams", "can"}) + + if not SEND_EXTRA_INPUTS: + modeld_logs = [msg for msg in modeld_logs if msg.which() != 'extrinsicsCalibration'] + dmodeld_logs = [msg for msg in dmodeld_logs if msg.which() != 'extrinsicsCalibration'] + + # initial setup + for s in ('extrinsicsCalibration', 'deviceState'): + msg = next(msg for msg in lr if msg.which() == s).as_builder() + msg.logMonoTime = lr[0].logMonoTime + modeld_logs.insert(1, msg.as_reader()) + dmodeld_logs.insert(1, msg.as_reader()) + + modeld = get_process_config("modeld") + dmonitoringmodeld = get_process_config("dmonitoringmodeld") + + modeld_msgs = replay_process(modeld, modeld_logs, frs) + dmonitoringmodeld_msgs = replay_process(dmonitoringmodeld, dmodeld_logs, frs) + + msgs = modeld_msgs + dmonitoringmodeld_msgs + + header = ['model', 'max instant', 'max instant allowed', 'average', 'max average allowed', 'test result'] + rows = [] + timings_ok = True + for (s, instant_max, avg_max) in EXEC_TIMINGS: + ts = [getattr(m, s).modelExecutionTime for m in msgs if m.which() == s] + # TODO some init can happen in first iteration + ts = ts[1:] + + errors = [] + if np.max(ts) > instant_max: + errors.append("❌ FAILED MAX TIMING CHECK ❌") + if np.mean(ts) > avg_max: + errors.append("❌ FAILED AVG TIMING CHECK ❌") + + timings_ok = not errors and timings_ok + rows.append([s, np.max(ts), instant_max, np.mean(ts), avg_max, "\n".join(errors) or "✅"]) + + print("------------------------------------------------") + print("----------------- Model Timing -----------------") + print("------------------------------------------------") + print(tabulate(rows, header, tablefmt="simple_grid", stralign="center", numalign="center", floatfmt=".4f")) + assert timings_ok or PC + + return msgs + + +def get_frames(): + regen_cache = "--regen-cache" in sys.argv + frames_cache = '/tmp/model_replay_cache' if PC else '/data/model_replay_cache' + os.makedirs(frames_cache, exist_ok=True) + + cache_name = f'{frames_cache}/{TEST_ROUTE}_{SEGMENT}_{START_FRAME}_{END_FRAME}.pkl' + if os.path.isfile(cache_name) and not regen_cache: + try: + print(f"Loading frames from cache {cache_name}") + return pickle.load(open(cache_name, "rb")) + except Exception as e: + print(f"Failed to load frames from cache {cache_name}: {e}") + + frs = { + 'roadCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, "fcamera.hevc"), pix_fmt='nv12', cache_size=END_FRAME - START_FRAME), + 'driverCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, "dcamera.hevc"), pix_fmt='nv12', cache_size=END_FRAME - START_FRAME), + 'wideRoadCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, "ecamera.hevc"), pix_fmt='nv12', cache_size=END_FRAME - START_FRAME), + } + for fr in frs.values(): + for fidx in range(START_FRAME, END_FRAME): + fr.get(fidx) + fr.it = None + print(f"Dumping frame cache {cache_name}") + pickle.dump(frs, open(cache_name, "wb")) + return frs + +if __name__ == "__main__": + update = "--update" in sys.argv or (os.getenv("GIT_BRANCH", "") == 'master') + replay_dir = os.path.dirname(os.path.abspath(__file__)) + + # load logs + lr = list(LogReader(get_url(TEST_ROUTE, SEGMENT, "rlog.zst"))) + frs = get_frames() + + log_msgs = [] + # run replays + log_msgs += model_replay(lr, frs) + + # get diff + failed = False + if not update: + log_fn = get_log_fn(TEST_ROUTE) + try: + all_logs = list(LogReader(get_model_replay_url(log_fn))) + cmp_log = [] + model_start_index = next(i for i, m in enumerate(all_logs) if m.which() in ("modelV2", "drivingModelData", "cameraOdometry")) + cmp_log += all_logs[model_start_index+START_FRAME*3:model_start_index + END_FRAME*3] + dmon_start_index = next(i for i, m in enumerate(all_logs) if m.which() == "driverStateV2") + cmp_log += all_logs[dmon_start_index+START_FRAME:dmon_start_index + END_FRAME] + + ignore = [ + 'logMonoTime', + 'drivingModelData.frameDropPerc', + 'drivingModelData.modelExecutionTime', + 'modelV2.frameDropPerc', + 'modelV2.modelExecutionTime', + 'driverStateV2.modelExecutionTime', + 'driverStateV2.gpuExecutionTime' + ] + if PC: + # TODO We ignore whole bunch so we can compare important stuff + # like posenet with reasonable tolerance + ignore += ['modelV2.acceleration.x', + 'modelV2.position.x', + 'modelV2.position.xStd', + 'modelV2.position.y', + 'modelV2.position.yStd', + 'modelV2.position.z', + 'modelV2.position.zStd', + 'drivingModelData.path.xCoefficients',] + for i in range(3): + for field in ('x', 'y', 'v', 'a'): + ignore.append(f'modelV2.leadsV3.{i}.{field}') + ignore.append(f'modelV2.leadsV3.{i}.{field}Std') + for i in range(4): + for field in ('x', 'y', 'z', 't'): + ignore.append(f'modelV2.laneLines.{i}.{field}') + for i in range(2): + for field in ('x', 'y', 'z', 't'): + ignore.append(f'modelV2.roadEdges.{i}.{field}') + tolerance = .3 if PC else None + results: Any = {TEST_ROUTE: {}} + log_paths: Any = {TEST_ROUTE: {"models": {'ref': log_fn, 'new': log_fn}}} + results[TEST_ROUTE]["models"] = compare_logs(cmp_log, log_msgs, tolerance=tolerance, ignore_fields=ignore) + diff_short, diff_long, failed = format_diff(results, log_paths, 'master') + + if "CI" in os.environ: + failed = False + print(diff_long) + print('-------------\n'*5) + print(diff_short) + with open("model_diff.txt", "w") as f: + f.write(diff_long) + except Exception as e: + print(str(e)) + failed = True + + if update and not PC: + log_fn = get_log_fn(TEST_ROUTE) + save_log(log_fn, log_msgs) + + sys.exit(int(failed)) diff --git a/iqpilot/selfdrive/test/process_replay/process_replay.py b/iqpilot/selfdrive/test/process_replay/process_replay.py new file mode 100755 index 000000000..5c5451074 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/process_replay.py @@ -0,0 +1,779 @@ +#!/usr/bin/env python3 +import os +import time +import copy +import heapq +import signal +from collections import Counter +from dataclasses import dataclass, field +from itertools import islice +from typing import Any +from collections.abc import Callable, Iterable +from tqdm import tqdm +import capnp +from iqpilot.system.hardware.hw import Paths + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car +from iqpilot.cereal.services import SERVICE_LIST +from msgq.visionipc import VisionIpcServer, get_endpoint_name as vipc_get_endpoint_name +from iqdbc.car.can_definitions import CanData +from iqdbc.car.car_helpers import get_car, interfaces +from iqpilot.common.params import Params +from iqpilot.common.prefix import OpenpilotPrefix +from iqpilot.common.timeout import Timeout +from iqpilot.common.realtime import DT_CTRL +from iqpilot.selfdrive.car.card import convert_to_capnp +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.selfdrive.test.process_replay.vision_meta import meta_from_camera_state, available_streams +from iqpilot.selfdrive.test.process_replay.migration import migrate_all +from iqpilot.selfdrive.test.process_replay.capture import ProcessOutputCapture +from iqpilot.tools.lib.logreader import LogIterable +from iqpilot.tools.lib.framereader import FrameReader + +# Numpy gives different results based on CPU features after version 19 +NUMPY_TOLERANCE = 1e-2 +PROC_REPLAY_DIR = os.path.dirname(os.path.abspath(__file__)) +FAKEDATA = os.path.join(PROC_REPLAY_DIR, "fakedata/") + + +class LauncherWithCapture: + def __init__(self, capture: ProcessOutputCapture, launcher: Callable): + self.capture = capture + self.launcher = launcher + + def __call__(self, *args, **kwargs): + self.capture.link_with_current_proc() + self.launcher(*args, **kwargs) + + +class ReplayContext: + def __init__(self, cfg): + self.proc_name = cfg.proc_name + self.pubs = cfg.pubs + self.main_pub = cfg.main_pub + self.main_pub_drained = cfg.main_pub_drained + assert len(self.pubs) != 0 or self.main_pub is not None + + def __enter__(self): + self.open_context() + + return self + + def __exit__(self, exc_type, exc_obj, exc_tb): + self.close_context() + + def open_context(self): + messaging.toggle_fake_events(True) + messaging.set_fake_prefix(self.proc_name) + + if self.main_pub is None: + self.events = {} + for pub in self.pubs: + self.events[pub] = messaging.fake_event_handle(pub, enable=True) + else: + self.events = {self.main_pub: messaging.fake_event_handle(self.main_pub, enable=True)} + + def close_context(self): + del self.events + + messaging.toggle_fake_events(False) + messaging.delete_fake_prefix() + + @property + def all_recv_called_events(self): + return [man.recv_called_event for man in self.events.values()] + + @property + def all_recv_ready_events(self): + return [man.recv_ready_event for man in self.events.values()] + + def send_sync(self, pm, endpoint, dat): + self.events[endpoint].recv_called_event.wait() + self.events[endpoint].recv_called_event.clear() + pm.send(endpoint, dat) + self.events[endpoint].recv_ready_event.set() + + def unlock_sockets(self): + expected_sets = len(self.events) + while expected_sets > 0: + index = messaging.wait_for_one_event(self.all_recv_called_events) + self.all_recv_called_events[index].clear() + self.all_recv_ready_events[index].set() + expected_sets -= 1 + + def wait_for_recv_called(self): + messaging.wait_for_one_event(self.all_recv_called_events) + + def wait_for_next_recv(self, trigger_empty_recv): + index = messaging.wait_for_one_event(self.all_recv_called_events) + if self.main_pub is not None and self.main_pub_drained and trigger_empty_recv: + self.all_recv_called_events[index].clear() + self.all_recv_ready_events[index].set() + self.all_recv_called_events[index].wait() + + +@dataclass +class ProcessConfig: + proc_name: str + pubs: list[str] + subs: list[str] + ignore: list[str] + config_callback: Callable | None = None + init_callback: Callable | None = None + should_recv_callback: Callable | None = None + tolerance: float | None = None + processing_time: float = 0.001 + timeout: int = 30 + simulation: bool = True + # Set to service process receives on first + main_pub: str | None = None + main_pub_drained: bool = False + vision_pubs: list[str] = field(default_factory=list) + ignore_alive_pubs: list[str] = field(default_factory=list) + + def __post_init__(self): + # If the process is polling a service, we can just lock that one to speed up replay + if self.main_pub is None and isinstance(self.should_recv_callback, MessageBasedRcvCallback): + self.main_pub = self.should_recv_callback.trigger_msg_type + + +class ProcessContainer: + def __init__(self, cfg: ProcessConfig): + self.prefix = OpenpilotPrefix(create_dirs_on_enter=False, clean_dirs_on_exit=False) + self.cfg = copy.deepcopy(cfg) + self.process = copy.deepcopy(managed_processes[cfg.proc_name]) + self.msg_queue: list[capnp._DynamicStructReader] = [] + self.cnt = 0 + self.pm: messaging.PubMaster | None = None + self.sockets: list[messaging.SubSocket] | None = None + self.rc: ReplayContext | None = None + self.vipc_server: VisionIpcServer | None = None + self.environ_config: dict[str, Any] | None = None + self.capture: ProcessOutputCapture | None = None + + @property + def has_empty_queue(self) -> bool: + return len(self.msg_queue) == 0 + + @property + def pubs(self) -> list[str]: + return self.cfg.pubs + + @property + def subs(self) -> list[str]: + return self.cfg.subs + + def _clean_env(self): + for k in self.environ_config.keys(): + if k in os.environ: + del os.environ[k] + + for k in ["PROC_NAME", "SIMULATION"]: + if k in os.environ: + del os.environ[k] + + def _setup_env(self, params_config: dict[str, Any], environ_config: dict[str, Any]): + for k, v in environ_config.items(): + if len(v) != 0: + os.environ[k] = v + elif k in os.environ: + del os.environ[k] + + os.environ["PROC_NAME"] = self.cfg.proc_name + if self.cfg.simulation: + os.environ["SIMULATION"] = "1" + elif "SIMULATION" in os.environ: + del os.environ["SIMULATION"] + + params = Params() + for k, v in params_config.items(): + if isinstance(v, bool): + params.put_bool(k, v) + else: + params.put(k, v) + + self.environ_config = environ_config + + def _setup_vision_ipc(self, all_msgs: LogIterable, frs: dict[str, Any]): + assert len(self.cfg.vision_pubs) != 0 + + vipc_server = VisionIpcServer("camerad") + streams_metas = available_streams(all_msgs) + for meta in streams_metas: + if meta.camera_state in self.cfg.vision_pubs: + assert frs[meta.camera_state].pix_fmt == 'nv12' + frame_size = (frs[meta.camera_state].w, frs[meta.camera_state].h) + vipc_server.create_buffers(meta.stream, 2, *frame_size) + vipc_server.start_listener() + + self.vipc_server = vipc_server + self.cfg.vision_pubs = [meta.camera_state for meta in streams_metas if meta.camera_state in self.cfg.vision_pubs] + + def _start_process(self): + if self.capture is not None: + self.process.launcher = LauncherWithCapture(self.capture, self.process.launcher) + self.process.prepare() + self.process.start() + + def start( + self, params_config: dict[str, Any], environ_config: dict[str, Any], + all_msgs: LogIterable, frs: dict[str, FrameReader] | None, + fingerprint: str | None, capture_output: bool + ): + with self.prefix as p: + self.prefix.create_dirs() + self._setup_env(params_config, environ_config) + + if self.cfg.config_callback is not None: + params = Params() + self.cfg.config_callback(params, self.cfg, all_msgs) + + self.rc = ReplayContext(self.cfg) + self.rc.open_context() + + self.pm = messaging.PubMaster(self.cfg.pubs) + self.sockets = [messaging.sub_sock(s, timeout=100) for s in self.cfg.subs] + + if len(self.cfg.vision_pubs) != 0: + assert frs is not None + self._setup_vision_ipc(all_msgs, frs) + assert self.vipc_server is not None + + if capture_output: + self.capture = ProcessOutputCapture(self.cfg.proc_name, p.prefix) + + self._start_process() + + if self.cfg.init_callback is not None: + self.cfg.init_callback(self.rc, self.pm, all_msgs, fingerprint) + + def stop(self): + with self.prefix: + self.process.signal(signal.SIGKILL) + self.process.stop() + self.rc.close_context() + self.prefix.clean_dirs() + self._clean_env() + + def get_output_msgs(self, start_time: int): + assert self.rc and self.sockets + + output_msgs = [] + self.rc.wait_for_recv_called() + for socket in self.sockets: + ms = messaging.drain_sock(socket) + for m in ms: + m = m.as_builder() + m.logMonoTime = start_time + int(self.cfg.processing_time * 1e9) + output_msgs.append(m.as_reader()) + return output_msgs + + def run_step(self, msg: capnp._DynamicStructReader, frs: dict[str, FrameReader] | None) -> list[capnp._DynamicStructReader]: + assert self.rc and self.pm and self.sockets and self.process.proc + + output_msgs = [] + end_of_cycle = True + if self.cfg.should_recv_callback is not None: + end_of_cycle = self.cfg.should_recv_callback(msg, self.cfg, self.cnt) + + self.msg_queue.append(msg) + if end_of_cycle: + with self.prefix, Timeout(self.cfg.timeout, error_msg=f"timed out testing process {repr(self.cfg.proc_name)}"): + # call recv to let sub-sockets reconnect, after we know the process is ready + if self.cnt == 0: + for s in self.sockets: + messaging.recv_one_or_none(s) + + # certain processes use drain_sock. need to cause empty recv to break from this loop + trigger_empty_recv = False + if self.cfg.main_pub and self.cfg.main_pub_drained: + trigger_empty_recv = any(m.which() == self.cfg.main_pub for m in self.msg_queue) + + # get output msgs from previous inputs + output_msgs = self.get_output_msgs(msg.logMonoTime) + + for m in self.msg_queue: + self.pm.send(m.which(), m.as_builder()) + # send frames if needed + if self.vipc_server is not None and m.which() in self.cfg.vision_pubs: + camera_state = getattr(m, m.which()) + camera_meta = meta_from_camera_state(m.which()) + assert frs is not None + img = frs[m.which()].get(camera_state.frameId) + self.vipc_server.send(camera_meta.stream, img.flatten().tobytes(), + camera_state.frameId, camera_state.timestampSof, camera_state.timestampEof) + self.msg_queue = [] + + self.rc.unlock_sockets() + if trigger_empty_recv: + self.rc.unlock_sockets() + self.cnt += 1 + assert self.process.proc.is_alive() + + return output_msgs + + +def card_fingerprint_callback(rc, pm, msgs, fingerprint): + print("start fingerprinting") + params = Params() + canmsgs = list(islice((m for m in msgs if m.which() == "can"), 300)) + + # card expects one arbitrary can and pandaState + rc.send_sync(pm, "can", messaging.new_message("can", 1)) + pm.send("pandaStates", messaging.new_message("pandaStates", 1)) + rc.send_sync(pm, "can", messaging.new_message("can", 1)) + rc.wait_for_next_recv(True) + + # fingerprinting is done, when CarParams is set + while params.get("CarParams") is None: + if len(canmsgs) == 0: + raise ValueError("Fingerprinting failed. Run out of can msgs") + + m = canmsgs.pop(0) + rc.send_sync(pm, "can", m.as_builder().to_bytes()) + rc.wait_for_next_recv(True) + + +def get_car_params_callback(rc, pm, msgs, fingerprint): + params = Params() + if fingerprint: + CarInterface = interfaces[fingerprint] + CP = CarInterface.get_non_essential_params(fingerprint) + CP_IQ = CarInterface.get_non_essential_params_iq(CP, fingerprint) + else: + can_msgs = ([CanData(can.address, can.dat, can.src) for can in m.can] for m in msgs if m.which() == "can") + cached_params_raw = params.get("CarParamsCache") + assert next(can_msgs, None), "CAN messages are required for fingerprinting" + assert os.environ.get("SKIP_FW_QUERY", False) or cached_params_raw is not None, \ + "CarParamsCache is required for fingerprinting. Make sure to keep carParams msgs in the logs." + + def can_recv(wait_for_one: bool = False) -> list[list[CanData]]: + return [next(can_msgs, [])] + + cached_params = None + if cached_params_raw is not None: + with car.CarParams.from_bytes(cached_params_raw) as _cached_params: + cached_params = _cached_params + + _CI = get_car(can_recv, lambda _msgs: None, lambda obd: None, params.get_bool("AlphaLongitudinalEnabled"), False, cached_params=cached_params) + CP, CP_IQ = _CI.CP, _CI.CP_IQ + + params.put("CarParams", CP.to_bytes()) + params.put("IQCarParams", convert_to_capnp(CP_IQ).to_bytes()) + + +def card_rcv_callback(msg, cfg, frame): + # no sendcan until card is initialized + if msg.which() != "can": + return False + + socks = [ + s for s in cfg.subs if + frame % int(SERVICE_LIST[msg.which()].frequency / SERVICE_LIST[s].frequency) == 0 + ] + if "sendcan" in socks and (frame - 1) < 2000: + socks.remove("sendcan") + return len(socks) > 0 + + +class ModeldCameraSyncRcvCallback: + def __init__(self): + self.road_present = False + self.wide_road_present = False + self.is_dual_camera = True + + def __call__(self, msg, cfg, frame): + self.is_dual_camera = len(cfg.vision_pubs) == 2 + if msg.which() == "roadCameraState": + self.road_present = True + elif msg.which() == "wideRoadCameraState": + self.wide_road_present = True + + if self.road_present and self.wide_road_present: + self.road_present, self.wide_road_present = False, False + return True + elif self.road_present and not self.is_dual_camera: + self.road_present = False + return True + else: + return False + + +class MessageBasedRcvCallback: + def __init__(self, trigger_msg_type: str, first_frame: bool = False): + self.trigger_msg_type = trigger_msg_type + self.first_frame = first_frame + + def __call__(self, msg, cfg, frame): + # publish on first frame or trigger msg + return ((frame - 1) == 0 and self.first_frame) or msg.which() == self.trigger_msg_type + + +def selfdrived_config_callback(params, cfg, lr): + ublox = params.get_bool("UbloxAvailable") + sub_keys = ({"gpsLocation", } if ublox else {"gpsLocationExternal", }) + + cfg.pubs = set(cfg.pubs) - sub_keys + + +CONFIGS = [ + ProcessConfig( + proc_name="selfdrived", + pubs=[ + "carState", "deviceState", "pandaStates", "peripheralState", "extrinsicsCalibration", "driverMonitoringState", + "longitudinalPlan", "deviceMotion", "lateralDelay", "vehicleParameters", "radarState", "modelV2", + "driverCameraState", "roadCameraState", "wideRoadCameraState", "managerState", "lateralTorqueParameters", + "accelerometer", "gyroscope", "carOutput", "gpsLocationExternal", "gpsLocation", "controlsState", + "carControl", "driverAssistance", "alertDebug", "audioFeedback", + ], + subs=["selfdriveState", "onroadEvents"], + ignore=["logMonoTime", "selfdriveState.alertText1", "selfdriveState.alertText2", "selfdriveState.alertStatus"], + config_callback=selfdrived_config_callback, + init_callback=get_car_params_callback, + should_recv_callback=MessageBasedRcvCallback("carState", True), + tolerance=NUMPY_TOLERANCE, + processing_time=0.004, + ), + ProcessConfig( + proc_name="controlsd", + pubs=["vehicleParameters", "lateralTorqueParameters", "modelV2", "selfdriveState", + "extrinsicsCalibration", "deviceMotion", "longitudinalPlan", "carState", "carOutput", + "driverMonitoringState", "onroadEvents", "driverAssistance"], + subs=["carControl", "controlsState"], + ignore=["logMonoTime", ], + init_callback=get_car_params_callback, + should_recv_callback=MessageBasedRcvCallback("selfdriveState"), + tolerance=NUMPY_TOLERANCE, + ), + ProcessConfig( + proc_name="card", + pubs=["pandaStates", "carControl", "onroadEvents", "can"], + subs=["sendcan", "carState", "carParams", "carOutput", "radarTracks"], + ignore=["logMonoTime", "carState.cumLagMs"], + init_callback=card_fingerprint_callback, + should_recv_callback=card_rcv_callback, + tolerance=NUMPY_TOLERANCE, + processing_time=0.004, + main_pub="can", + main_pub_drained=True, + ), + ProcessConfig( + proc_name="radard", + pubs=["radarTracks", "carState", "modelV2"], + subs=["radarState"], + ignore=["logMonoTime"], + init_callback=get_car_params_callback, + should_recv_callback=MessageBasedRcvCallback("modelV2"), + ), + ProcessConfig( + proc_name="plannerd", + pubs=["modelV2", "carControl", "carState", "controlsState", "vehicleParameters", "radarState", "selfdriveState"], + subs=["longitudinalPlan", "driverAssistance"], + ignore=["logMonoTime", "longitudinalPlan.processingDelay", "longitudinalPlan.solverExecutionTime"], + init_callback=get_car_params_callback, + should_recv_callback=MessageBasedRcvCallback("modelV2"), + tolerance=NUMPY_TOLERANCE, + ), + ProcessConfig( + proc_name="calibrationd", + pubs=["carState", "cameraOdometry"], + subs=["extrinsicsCalibration"], + ignore=["logMonoTime"], + init_callback=get_car_params_callback, + should_recv_callback=MessageBasedRcvCallback("cameraOdometry", True), + ), + ProcessConfig( + proc_name="dmonitoringd", + pubs=["driverStateV2", "extrinsicsCalibration", "carState", "modelV2", "selfdriveState"], + subs=["driverMonitoringState"], + ignore=["logMonoTime"], + should_recv_callback=MessageBasedRcvCallback("driverStateV2"), + tolerance=NUMPY_TOLERANCE, + ), + ProcessConfig( + proc_name="locationd", + pubs=[ + "cameraOdometry", "accelerometer", "gyroscope", "extrinsicsCalibration", "carState" + ], + subs=["liveLocationKalman", "deviceMotion"], + ignore=["logMonoTime"], + should_recv_callback=MessageBasedRcvCallback("cameraOdometry"), + tolerance=NUMPY_TOLERANCE, + ), + ProcessConfig( + proc_name="ubloxd", + pubs=["ubloxRaw"], + subs=["ubloxGnss", "gpsLocationExternal"], + ignore=["logMonoTime"], + ), + ProcessConfig( + proc_name="modeld", + pubs=["deviceState", "roadCameraState", "wideRoadCameraState", "extrinsicsCalibration", "lateralDelay", "driverMonitoringState", "carState", "carControl"], + subs=["modelV2", "drivingModelData", "cameraOdometry"], + ignore=["logMonoTime", "modelV2.frameDropPerc", "modelV2.modelExecutionTime", "drivingModelData.frameDropPerc", "drivingModelData.modelExecutionTime"], + should_recv_callback=ModeldCameraSyncRcvCallback(), + tolerance=NUMPY_TOLERANCE, + processing_time=0.020, + main_pub=vipc_get_endpoint_name("camerad", meta_from_camera_state("roadCameraState").stream), + vision_pubs=["roadCameraState", "wideRoadCameraState"], + ignore_alive_pubs=["wideRoadCameraState"], + init_callback=get_car_params_callback, + ), + ProcessConfig( + proc_name="dmonitoringmodeld", + pubs=["extrinsicsCalibration", "driverCameraState"], + subs=["driverStateV2"], + ignore=["logMonoTime", "driverStateV2.modelExecutionTime", "driverStateV2.gpuExecutionTime"], + should_recv_callback=MessageBasedRcvCallback("driverCameraState"), + tolerance=NUMPY_TOLERANCE, + processing_time=0.020, + main_pub=vipc_get_endpoint_name("camerad", meta_from_camera_state("driverCameraState").stream), + vision_pubs=["driverCameraState"], + ignore_alive_pubs=["driverCameraState"], + ), +] + + +def get_process_config(name: str) -> ProcessConfig: + try: + return copy.deepcopy(next(c for c in CONFIGS if c.proc_name == name)) + except StopIteration as ex: + raise Exception(f"Cannot find process config with name: {name}") from ex + + +def get_custom_params_from_lr(lr: LogIterable, initial_state: str = "first") -> dict[str, Any]: + """ + Use this to get custom params dict based on provided logs. + Useful when replaying calibrationd. + The params may be based on first or last message of given type (carParams, extrinsicsCalibration, vehicleParameters, lateralTorqueParameters) in the logs. + """ + + car_params = [m for m in lr if m.which() == "carParams"] + live_calibration = [m for m in lr if m.which() == "extrinsicsCalibration"] + live_parameters = [m for m in lr if m.which() == "vehicleParameters"] + live_torque_parameters = [m for m in lr if m.which() == "lateralTorqueParameters"] + + assert initial_state in ["first", "last"] + msg_index = 0 if initial_state == "first" else -1 + + assert len(car_params) > 0, "carParams required for initial state of vehicleParameters and CarParamsPrevRoute" + CP = car_params[msg_index].carParams + + custom_params = { + "CarParamsPrevRoute": CP.as_builder().to_bytes() + } + + if len(live_calibration) > 0: + custom_params["CalibrationParams"] = live_calibration[msg_index].as_builder().to_bytes() + if len(live_parameters) > 0: + custom_params["LiveParametersV2"] = live_parameters[msg_index].as_builder().to_bytes() + if len(live_torque_parameters) > 0: + custom_params["LiveTorqueParameters"] = live_torque_parameters[msg_index].as_builder().to_bytes() + + return custom_params + + +def replay_process_with_name(name: str | Iterable[str], lr: LogIterable, *args, **kwargs) -> list[capnp._DynamicStructReader]: + if isinstance(name, str): + cfgs = [get_process_config(name)] + elif isinstance(name, Iterable): + cfgs = [get_process_config(n) for n in name] + else: + raise ValueError("name must be str or collections of strings") + + return replay_process(cfgs, lr, *args, **kwargs) + + +def replay_process( + cfg: ProcessConfig | Iterable[ProcessConfig], lr: LogIterable, frs: dict[str, FrameReader] | None = None, + fingerprint: str | None = None, return_all_logs: bool = False, custom_params: dict[str, Any] | None = None, + captured_output_store: dict[str, dict[str, str]] | None = None, disable_progress: bool = False +) -> list[capnp._DynamicStructReader]: + if isinstance(cfg, Iterable): + cfgs = list(cfg) + else: + cfgs = [cfg] + + all_msgs = migrate_all(lr, + manager_states=True, + panda_states=any("pandaStates" in cfg.pubs for cfg in cfgs), + camera_states=any(len(cfg.vision_pubs) != 0 for cfg in cfgs)) + process_logs = _replay_multi_process(cfgs, all_msgs, frs, fingerprint, custom_params, captured_output_store, disable_progress) + + if return_all_logs: + keys = {m.which() for m in process_logs} + modified_logs = [m for m in all_msgs if m.which() not in keys] + modified_logs.extend(process_logs) + modified_logs.sort(key=lambda m: int(m.logMonoTime)) + log_msgs = modified_logs + else: + log_msgs = process_logs + + return log_msgs + + +def _replay_multi_process( + cfgs: list[ProcessConfig], lr: LogIterable, frs: dict[str, FrameReader] | None, fingerprint: str | None, + custom_params: dict[str, Any] | None, captured_output_store: dict[str, dict[str, str]] | None, disable_progress: bool +) -> list[capnp._DynamicStructReader]: + if fingerprint is not None: + params_config = generate_params_config(lr=lr, fingerprint=fingerprint, custom_params=custom_params) + env_config = generate_environ_config(fingerprint=fingerprint) + else: + CP = next((m.carParams for m in lr if m.which() == "carParams"), None) + params_config = generate_params_config(lr=lr, CP=CP, custom_params=custom_params) + env_config = generate_environ_config(CP=CP) + + # validate frs and vision pubs + all_vision_pubs = [pub for cfg in cfgs for pub in cfg.vision_pubs] + if len(all_vision_pubs) != 0: + assert frs is not None, "frs must be provided when replaying process using vision streams" + assert all(meta_from_camera_state(st) is not None for st in all_vision_pubs), \ + f"undefined vision stream spotted, probably misconfigured process: (vision pubs: {all_vision_pubs})" + required_vision_pubs = {m.camera_state for m in available_streams(lr)} & set(all_vision_pubs) + assert all(st in frs for st in required_vision_pubs), f"frs for this process must contain following vision streams: {required_vision_pubs}" + + all_msgs = sorted(lr, key=lambda msg: msg.logMonoTime) + log_msgs = [] + containers = [] + try: + for cfg in cfgs: + container = ProcessContainer(cfg) + containers.append(container) + container.start(params_config, env_config, all_msgs, frs, fingerprint, captured_output_store is not None) + + all_pubs = {pub for container in containers for pub in container.pubs} + all_subs = {sub for container in containers for sub in container.subs} + lr_pubs = all_pubs - all_subs + pubs_to_containers = {pub: [container for container in containers if pub in container.pubs] for pub in all_pubs} + + pub_msgs = [msg for msg in all_msgs if msg.which() in lr_pubs] + # external queue for messages taken from logs; internal queue for messages generated by processes, which will be republished + external_pub_queue: list[capnp._DynamicStructReader] = pub_msgs.copy() + internal_pub_queue: list[capnp._DynamicStructReader] = [] + # heap for maintaining the order of messages generated by processes, where each element: (logMonoTime, index in internal_pub_queue) + internal_pub_index_heap: list[tuple[int, int]] = [] + + pbar = tqdm(total=len(external_pub_queue), disable=disable_progress) + while len(external_pub_queue) != 0 or (len(internal_pub_index_heap) != 0 and not all(c.has_empty_queue for c in containers)): + if len(internal_pub_index_heap) == 0 or (len(external_pub_queue) != 0 and external_pub_queue[0].logMonoTime < internal_pub_index_heap[0][0]): + msg = external_pub_queue.pop(0) + pbar.update(1) + else: + _, index = heapq.heappop(internal_pub_index_heap) + msg = internal_pub_queue[index] + + target_containers = pubs_to_containers[msg.which()] + for container in target_containers: + output_msgs = container.run_step(msg, frs) + for m in output_msgs: + if m.which() in all_pubs: + internal_pub_queue.append(m) + heapq.heappush(internal_pub_index_heap, (m.logMonoTime, len(internal_pub_queue) - 1)) + log_msgs.extend(output_msgs) + + # flush last set of messages from each process + for container in containers: + last_time = log_msgs[-1].logMonoTime if len(log_msgs) > 0 else int(time.monotonic() * 1e9) + log_msgs.extend(container.get_output_msgs(last_time)) + finally: + for container in containers: + container.stop() + if captured_output_store is not None: + assert container.capture is not None + out, err = container.capture.read_outerr() + captured_output_store[container.cfg.proc_name] = {"out": out, "err": err} + + return log_msgs + + +def generate_params_config(lr=None, CP=None, fingerprint=None, custom_params=None) -> dict[str, Any]: + params_dict = { + "OpenpilotEnabledToggle": True, + "DisengageOnAccelerator": True, + "DisableLogging": False, + } + + if custom_params is not None: + params_dict.update(custom_params) + if lr is not None: + has_ublox = any(msg.which() == "ubloxGnss" for msg in lr) + params_dict["UbloxAvailable"] = has_ublox + is_rhd = next((msg.driverMonitoringState.isRHD for msg in lr if msg.which() == "driverMonitoringState"), False) + params_dict["IsRhdDetected"] = is_rhd + + if CP is not None: + if fingerprint is None: + if CP.fingerprintSource == "fw": + params_dict["CarParamsCache"] = CP.as_builder().to_bytes() + + if CP.openpilotLongitudinalControl: + params_dict["AlphaLongitudinalEnabled"] = True + + if CP.notCar: + params_dict["JoystickDebugMode"] = True + + return params_dict + + +def generate_environ_config(CP=None, fingerprint=None, log_dir=None) -> dict[str, Any]: + environ_dict = {} + environ_dict["PARAMS_ROOT"] = f"{Paths.shm_path()}/params" + if log_dir is not None: + environ_dict["LOG_ROOT"] = log_dir + + environ_dict["REPLAY"] = "1" + + # Regen or python process + if CP is not None and fingerprint is None: + if CP.fingerprintSource == "fw": + environ_dict['SKIP_FW_QUERY'] = "" + environ_dict['FINGERPRINT'] = "" + else: + environ_dict['SKIP_FW_QUERY'] = "1" + environ_dict['FINGERPRINT'] = CP.carFingerprint + elif fingerprint is not None: + environ_dict['SKIP_FW_QUERY'] = "1" + environ_dict['FINGERPRINT'] = fingerprint + else: + environ_dict["SKIP_FW_QUERY"] = "" + environ_dict["FINGERPRINT"] = "" + + return environ_dict + + +def check_openpilot_enabled(msgs: LogIterable) -> bool: + cur_enabled_count = 0 + max_enabled_count = 0 + for msg in msgs: + if msg.which() == "carParams": + if msg.carParams.notCar: + return True + elif msg.which() == "selfdriveState": + if msg.selfdriveState.active: + cur_enabled_count += 1 + else: + cur_enabled_count = 0 + max_enabled_count = max(max_enabled_count, cur_enabled_count) + + return max_enabled_count > int(10. / DT_CTRL) + + +def check_most_messages_valid(msgs: LogIterable, threshold: float = 0.9) -> bool: + relevant_services = {sock for cfg in CONFIGS for sock in cfg.subs} + msgs_counts = Counter(msg.which() for msg in msgs) + msgs_valid_counts = Counter(msg.which() for msg in msgs if msg.valid) + + most_valid_for_service = {} + for msg_type in msgs_counts.keys(): + if msg_type not in relevant_services: + continue + + valid_share = msgs_valid_counts.get(msg_type, 0) / msgs_counts[msg_type] + ok = valid_share >= threshold + if not ok: + print(f"WARNING: Service {msg_type} has {valid_share * 100:.2f}% valid messages, which is below threshold of {threshold * 100:.2f}%") + most_valid_for_service[msg_type] = ok + + return all(most_valid_for_service.values()) diff --git a/iqpilot/selfdrive/test/process_replay/ref_commit b/iqpilot/selfdrive/test/process_replay/ref_commit new file mode 100644 index 000000000..85b79391c --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/ref_commit @@ -0,0 +1 @@ +67f3daf309dc6cbb6844fcbaeb83e6596637e551 \ No newline at end of file diff --git a/iqpilot/selfdrive/test/process_replay/regen.py b/iqpilot/selfdrive/test/process_replay/regen.py new file mode 100755 index 000000000..9abcf0a57 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/regen.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +import os +import argparse +import time +import capnp + +from typing import Any +from collections.abc import Iterable + +from iqpilot.selfdrive.test.process_replay.process_replay import CONFIGS, FAKEDATA, ProcessConfig, replay_process, get_process_config, \ + check_openpilot_enabled, check_most_messages_valid, get_custom_params_from_lr +from iqpilot.selfdrive.test.update_ci_routes import upload_route +from iqpilot.tools.lib.framereader import FrameReader +from iqpilot.tools.lib.logreader import LogReader, LogIterable, save_log +from iqpilot.tools.lib.logreader import get_url + + +def regen_segment( + lr: LogIterable, frs: dict[str, Any] | None = None, + processes: Iterable[ProcessConfig] = CONFIGS, disable_tqdm: bool = False +) -> list[capnp._DynamicStructReader]: + all_msgs = sorted(lr, key=lambda m: m.logMonoTime) + custom_params = get_custom_params_from_lr(all_msgs) + + print("Replayed processes:", [p.proc_name for p in processes]) + print("\n\n", "*"*30, "\n\n", sep="") + + output_logs = replay_process(processes, all_msgs, frs, return_all_logs=True, custom_params=custom_params, disable_progress=disable_tqdm) + + return output_logs + + +def setup_data_readers( + route: str, sidx: int, needs_driver_cam: bool = True, needs_road_cam: bool = True, dummy_driver_cam: bool = False +) -> tuple[LogReader, dict[str, Any]]: + lr = LogReader(f"{route}/{sidx}/r") + frs = {} + if needs_road_cam: + frs['roadCameraState'] = FrameReader(get_url(route, str(sidx), "fcamera.hevc")) + if next((True for m in lr if m.which() == "wideRoadCameraState"), False): + frs['wideRoadCameraState'] = FrameReader(get_url(route, str(sidx), "ecamera.hevc")) + if needs_driver_cam: + if dummy_driver_cam: + frs['driverCameraState'] = FrameReader(get_url(route, str(sidx), "fcamera.hevc")) # Use fcam as dummy + else: + device_type = next(str(msg.initData.deviceType) for msg in lr if msg.which() == "initData") + assert device_type != "neo", "Driver camera not supported on neo segments. Use dummy dcamera." + frs['driverCameraState'] = FrameReader(get_url(route, str(sidx), "dcamera.hevc")) + + return lr, frs + + +def regen_and_save( + route: str, sidx: int, processes: str | Iterable[str] = "all", outdir: str = FAKEDATA, + upload: bool = False, disable_tqdm: bool = False, dummy_driver_cam: bool = False +) -> str: + if not isinstance(processes, str) and not hasattr(processes, "__iter__"): + raise ValueError("whitelist_proc must be a string or iterable") + + if processes != "all": + if isinstance(processes, str): + raise ValueError(f"Invalid value for processes: {processes}") + + replayed_processes = [] + for d in processes: + cfg = get_process_config(d) + replayed_processes.append(cfg) + else: + replayed_processes = CONFIGS + + all_vision_pubs = {pub for cfg in replayed_processes for pub in cfg.vision_pubs} + lr, frs = setup_data_readers(route, sidx, + needs_driver_cam="driverCameraState" in all_vision_pubs, + needs_road_cam="roadCameraState" in all_vision_pubs or "wideRoadCameraState" in all_vision_pubs, + dummy_driver_cam=dummy_driver_cam) + output_logs = regen_segment(lr, frs, replayed_processes, disable_tqdm=disable_tqdm) + + log_dir = os.path.join(outdir, time.strftime("%Y-%m-%d--%H-%M-%S--0", time.gmtime())) + rel_log_dir = os.path.relpath(log_dir) + rpath = os.path.join(log_dir, "rlog.zst") + + os.makedirs(log_dir) + save_log(rpath, output_logs, compress=True) + + print("\n\n", "*"*30, "\n\n", sep="") + print("New route:", rel_log_dir, "\n") + + if not check_openpilot_enabled(output_logs): + raise Exception("Route did not engage for long enough") + if not check_most_messages_valid(output_logs): + raise Exception("Route has too many invalid messages") + + if upload: + upload_route(rel_log_dir) + + return rel_log_dir + + +if __name__ == "__main__": + def comma_separated_list(string): + return string.split(",") + + all_procs = [p.proc_name for p in CONFIGS] + parser = argparse.ArgumentParser(description="Generate new segments from old ones") + parser.add_argument("--upload", action="store_true", help="Upload the new segment to the CI bucket") + parser.add_argument("--outdir", help="log output dir", default=FAKEDATA) + parser.add_argument("--dummy-dcamera", action='store_true', help="Use dummy blank driver camera") + parser.add_argument("--whitelist-procs", type=comma_separated_list, default=all_procs, + help="Comma-separated whitelist of processes to regen (e.g. controlsd,radard)") + parser.add_argument("--blacklist-procs", type=comma_separated_list, default=[], + help="Comma-separated blacklist of processes to regen (e.g. controlsd,radard)") + parser.add_argument("route", type=str, help="The source route") + parser.add_argument("seg", type=int, help="Segment in source route") + args = parser.parse_args() + + blacklist_set = set(args.blacklist_procs) + processes = [p for p in args.whitelist_procs if p not in blacklist_set] + regen_and_save(args.route, args.seg, processes=processes, upload=args.upload, outdir=args.outdir, dummy_driver_cam=args.dummy_dcamera) diff --git a/iqpilot/selfdrive/test/process_replay/regen_all.py b/iqpilot/selfdrive/test/process_replay/regen_all.py new file mode 100755 index 000000000..4c74d7939 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/regen_all.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +import argparse +import concurrent.futures +import os +import random +import traceback +from tqdm import tqdm + +from iqpilot.common.prefix import OpenpilotPrefix +from iqpilot.selfdrive.test.process_replay.regen import regen_and_save +from iqpilot.selfdrive.test.process_replay.test_processes import FAKEDATA, source_segments as segments +from iqpilot.tools.lib.route import SegmentName + + +def regen_job(segment, upload, disable_tqdm): + with OpenpilotPrefix(): + sn = SegmentName(segment[1]) + fake_dongle_id = 'regen' + ''.join(random.choice('0123456789ABCDEF') for _ in range(11)) + try: + relr = regen_and_save(sn.route_name.canonical_name, sn.segment_num, upload=upload, + outdir=os.path.join(FAKEDATA, fake_dongle_id), disable_tqdm=disable_tqdm, dummy_driver_cam=True) + relr = '|'.join(relr.split('/')[-2:]) + return f' ("{segment[0]}", "{relr}"), ' + except Exception as e: + err = f" {segment} failed: {str(e)}" + err += traceback.format_exc() + err += "\n\n" + return err + + +if __name__ == "__main__": + all_cars = {car for car, _ in segments} + + parser = argparse.ArgumentParser(description="Generate new segments from old ones") + parser.add_argument("-j", "--jobs", type=int, default=1) + parser.add_argument("--no-upload", action="store_true") + parser.add_argument("--whitelist-cars", type=str, nargs="*", default=all_cars, + help="Whitelist given cars from the test (e.g. HONDA)") + parser.add_argument("--blacklist-cars", type=str, nargs="*", default=[], + help="Blacklist given cars from the test (e.g. HONDA)") + args = parser.parse_args() + + tested_cars = set(args.whitelist_cars) - set(args.blacklist_cars) + tested_cars = {c.upper() for c in tested_cars} + tested_segments = [(car, segment) for car, segment in segments if car in tested_cars] + + with concurrent.futures.ProcessPoolExecutor(max_workers=args.jobs) as pool: + p = pool.map(regen_job, tested_segments, [not args.no_upload] * len(tested_segments), [args.jobs > 1] * len(tested_segments)) + msg = "Copy these new segments into test_processes.py:" + for seg in tqdm(p, desc="Generating segments", total=len(tested_segments)): + msg += "\n" + str(seg) + print() + print() + print(msg) diff --git a/iqpilot/selfdrive/test/process_replay/test_compare_logs.py b/iqpilot/selfdrive/test/process_replay/test_compare_logs.py new file mode 100644 index 000000000..5ba7923cb --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/test_compare_logs.py @@ -0,0 +1,16 @@ +import iqpilot.cereal.messaging as messaging +from iqpilot.selfdrive.test.process_replay.compare_logs import remove_ignored_fields + + +def test_remove_ignored_text_field(): + msg = messaging.new_message("selfdriveState") + msg.selfdriveState.alertText1 = "IQ.Pilot" + cleared = remove_ignored_fields(msg.as_reader(), ["selfdriveState.alertText1"]) + assert cleared.selfdriveState.alertText1 == "" + + +def test_remove_ignored_enum_field(): + msg = messaging.new_message("selfdriveState") + msg.selfdriveState.alertStatus = "userPrompt" + cleared = remove_ignored_fields(msg.as_reader(), ["selfdriveState.alertStatus"]) + assert str(cleared.selfdriveState.alertStatus) == "normal" diff --git a/iqpilot/selfdrive/test/process_replay/test_fuzzy.py b/iqpilot/selfdrive/test/process_replay/test_fuzzy.py new file mode 100644 index 000000000..1a321874c --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/test_fuzzy.py @@ -0,0 +1,34 @@ +import copy +import os +from hypothesis import given, HealthCheck, Phase, settings +import hypothesis.strategies as st +from parameterized import parameterized +import pytest + +from iqpilot.cereal import log +from iqdbc.car.toyota.values import CAR as TOYOTA +from iqpilot.selfdrive.test.fuzzy_generation import FuzzyGenerator +import iqpilot.selfdrive.test.process_replay.process_replay as pr + +pytestmark = [pytest.mark.linux, pytest.mark.slow] + +# These processes currently fail because of unrealistic data breaking assumptions +# that openpilot makes causing error with NaN, inf, int size, array indexing ... +# TODO: Make each one testable +NOT_TESTED = ['selfdrived', 'controlsd', 'card', 'plannerd', 'calibrationd', 'dmonitoringd', 'estimatord', 'dmonitoringmodeld', 'modeld'] + +TEST_CASES = [(cfg.proc_name, copy.deepcopy(cfg)) for cfg in pr.CONFIGS if cfg.proc_name not in NOT_TESTED] +MAX_EXAMPLES = int(os.environ.get("MAX_EXAMPLES", "10")) + +class TestFuzzProcesses: + + # TODO: make this faster and increase examples + @parameterized.expand(TEST_CASES) + @given(st.data()) + @settings(phases=[Phase.generate, Phase.target], max_examples=MAX_EXAMPLES, deadline=1000, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large]) + def test_fuzz_process(self, proc_name, cfg, data): + msgs = FuzzyGenerator.get_random_event_msg(data.draw, events=cfg.pubs, real_floats=True) + lr = [log.Event.new_message(**m).as_reader() for m in msgs] + cfg.timeout = 5 + pr.replay_process(cfg, lr, fingerprint=TOYOTA.TOYOTA_COROLLA_TSS2, disable_progress=True) diff --git a/iqpilot/selfdrive/test/process_replay/test_migration.py b/iqpilot/selfdrive/test/process_replay/test_migration.py new file mode 100644 index 000000000..68261faea --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/test_migration.py @@ -0,0 +1,19 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.cereal import messaging +from iqpilot.selfdrive.test.process_replay.migration import migrate_drivingModelData + + +def test_driving_model_migration_ignores_incomplete_lane_metadata(): + msg = messaging.new_message("modelV2") + msg.modelV2.init("laneLines", 4) + for lane_line in msg.modelV2.laneLines: + lane_line.y = [1.0] + msg.modelV2.laneLineProbs = [0.5] + + _, added, _ = migrate_drivingModelData([(0, msg.as_reader())]) + + assert len(added) == 1 + assert added[0].drivingModelData.laneLineMeta.leftProb == 0.0 + assert added[0].drivingModelData.laneLineMeta.rightProb == 0.0 diff --git a/iqpilot/selfdrive/test/process_replay/test_processes.py b/iqpilot/selfdrive/test/process_replay/test_processes.py new file mode 100755 index 000000000..5c25a5809 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/test_processes.py @@ -0,0 +1,299 @@ +#!/usr/bin/env python3 +import argparse +import concurrent.futures +import os +import sys +from collections import defaultdict +from tqdm import tqdm +from typing import Any + +from iqdbc.car.car_helpers import interface_names +from iqpilot.common.git import get_commit +from iqpilot.tools.lib.logreader import get_url, upload_file +from iqpilot.selfdrive.test.process_replay.compare_logs import compare_logs, format_diff +from iqpilot.selfdrive.test.process_replay.process_replay import CONFIGS, PROC_REPLAY_DIR, FAKEDATA, replay_process, \ + check_most_messages_valid +from iqpilot.tools.lib.filereader import FileReader +from iqpilot.tools.lib.logreader import LogReader, save_log + +IS_AZURE_TOKEN_DEFINED = os.getenv("AZURE_TOKEN") + +source_segments = [ + ("HYUNDAI", "02c45f73a2e5c6e9|2021-01-01--19-08-22--1"), # HYUNDAI.HYUNDAI_SONATA + ("HYUNDAI2", "d545129f3ca90f28|2022-11-07--20-43-08--3"), # HYUNDAI.HYUNDAI_KIA_EV6 (+ QCOM GPS) + ("TOYOTA", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.TOYOTA_PRIUS + ("TOYOTA2", "0982d79ebb0de295|2021-01-03--20-03-36--6"), # TOYOTA.TOYOTA_RAV4 + ("TOYOTA3", "8011d605be1cbb77|000000cc--8e8d8ec716--6"), # TOYOTA.TOYOTA_COROLLA_TSS2 + ("HONDA", "eb140f119469d9ab|2021-06-12--10-46-24--27"), # HONDA.HONDA_CIVIC (NIDEC) + ("HONDA2", "7d2244f34d1bbcda|2021-06-25--12-25-37--26"), # HONDA.HONDA_ACCORD (BOSCH) + ("CHRYSLER", "4deb27de11bee626|2021-02-20--11-28-55--8"), # CHRYSLER.CHRYSLER_PACIFICA_2018_HYBRID + ("RAM", "17fc16d840fe9d21|2023-04-26--13-28-44--5"), # CHRYSLER.RAM_1500_5TH_GEN + ("SUBARU", "341dccd5359e3c97|2022-09-12--10-35-33--3"), # SUBARU.SUBARU_OUTBACK + ("GM", "376bf99325883932|2022-10-27--13-41-22--1"), # GM.CHEVROLET_BOLT_EUV + ("NISSAN", "35336926920f3571|2021-02-12--18-38-48--46"), # NISSAN.NISSAN_XTRAIL + ("VOLKSWAGEN", "de9592456ad7d144|2021-06-29--11-00-15--6"), # VOLKSWAGEN.VOLKSWAGEN_GOLF + # FIXME the sensor timings are bad in mazda segment, we're not fully testing it, but it should be replaced + ("MAZDA", "bd6a637565e91581|2021-10-30--15-14-53--4"), # MAZDA.MAZDA_CX9_2021 + ("FORD", "54827bf84c38b14f|2023-01-26--21-59-07--4"), # FORD.FORD_BRONCO_SPORT_MK1 + ("RIVIAN", "bc095dc92e101734|000000db--ee9fe46e57--1"), # RIVIAN.RIVIAN_R1_GEN1 + ("TESLA", "2c912ca5de3b1ee9|0000025d--6eb6bcbca4--4"), # TESLA.TESLA_MODEL_Y + + # Enable when port is tested and dashcamOnly is no longer set + #("VOLKSWAGEN2", "3cfdec54aa035f3f|2022-07-19--23-45-10--2"), # VOLKSWAGEN.VOLKSWAGEN_PASSAT_NMS +] + +segments = [ + ("HYUNDAI", "regenAA0FC4ED71E|2025-04-08--22-57-50--0"), + ("HYUNDAI2", "regenAFB9780D823|2025-04-08--23-00-34--0"), + ("TOYOTA", "regen218A4DCFAA1|2025-04-08--22-57-51--0"), + # TODO: get new RAV4 route without enableDsu + # ("TOYOTA2", "regen107352E20EB|2025-04-08--22-57-46--0"), + ("TOYOTA3", "regen1455E3B4BDF|2025-04-09--03-26-06--0"), + ("HONDA", "regenB328FF8BA0A|2025-04-08--22-57-45--0"), + ("HONDA2", "regen6170C8C9A35|2025-04-08--22-57-46--0"), + ("CHRYSLER", "regen5B28FC2A437|2025-04-08--23-04-24--0"), + ("RAM", "regenBF81EA96E08|2025-04-08--23-06-54--0"), + ("SUBARU", "regen7366F13F6A1|2025-04-08--23-07-07--0"), + ("GM", "regen1271097D038|2025-04-09--03-26-00--0"), + ("NISSAN", "regen15D60604EAB|2025-04-08--23-06-59--0"), + ("VOLKSWAGEN", "regen0F2F06C9539|2025-04-08--23-06-56--0"), + ("MAZDA", "regenACF84CCF482|2024-08-30--03-21-55--0"), + ("FORD", "regen755D8CB1E1F|2025-04-08--23-13-43--0"), + ("RIVIAN", "regen5FCAC896BBE|2025-04-08--23-13-35--0"), + ("TESLA", "2c912ca5de3b1ee9|0000025d--6eb6bcbca4--4"), +] + +# dashcamOnly makes don't need to be tested until a full port is done +excluded_interfaces = ["mock", "body", "psa"] + +BASE_URL = "https://commadataci.blob.core.windows.net/openpilotci/" +REF_COMMIT_FN = os.path.join(PROC_REPLAY_DIR, "ref_commit") +EXCLUDED_PROCS = {"modeld", "dmonitoringmodeld"} + + +def preserve_only_specified_files_from_ref_commit(*commits_to_keep): + """Keep only files in fakedata that contain any of the specified commit hashes.""" + removed = 0 + for f in os.listdir(FAKEDATA): + if not any(commit in f for commit in commits_to_keep): + os.remove(os.path.join(FAKEDATA, f)) + removed += 1 + if removed > 0: + print(f"Removed {removed} old files from {FAKEDATA}") + + +def handle_output_file(cur_log_fn, local): + """Handle the output file based on whether we're using remote or local storage.""" + assert os.path.exists(cur_log_fn), f"Cannot find log to upload: {cur_log_fn}" + + if local: + os.system(f"git add '{os.path.realpath(cur_log_fn)}'") + else: + upload_file(cur_log_fn, os.path.basename(cur_log_fn)) + os.remove(cur_log_fn) + + +def run_test_process(data): + segment, cfg, args, cur_log_fn, ref_log_path, lr_dat = data + res = None + if not args.upload_only: + lr = LogReader.from_bytes(lr_dat) + res, log_msgs = test_process(cfg, lr, segment, ref_log_path, cur_log_fn, args.ignore_fields, args.ignore_msgs) + # save logs so we can upload when updating refs + save_log(cur_log_fn, log_msgs) + + if args.update_refs or args.upload_only: + print(f'Processing: {os.path.basename(cur_log_fn)}') + handle_output_file(cur_log_fn, args.local) + + return (segment, cfg.proc_name, res) + + +def get_log_data(segment): + r, n = segment.rsplit("--", 1) + with FileReader(get_url(r, n, "rlog.zst")) as f: + return (segment, f.read()) + + +def test_process(cfg, lr, segment, ref_log_path, new_log_path, ignore_fields=None, ignore_msgs=None): + if ignore_fields is None: + ignore_fields = [] + if ignore_msgs is None: + ignore_msgs = [] + + ref_log_msgs = list(LogReader(ref_log_path)) + + try: + log_msgs = replay_process(cfg, lr, disable_progress=True) + except Exception as e: + raise Exception("failed on segment: " + segment) from e + + if not check_most_messages_valid(log_msgs): + return f"Route did not have enough valid messages: {new_log_path}", log_msgs + + # skip this check if the segment is using qcom gps + if cfg.proc_name != 'ubloxd' or any(m.which() in cfg.pubs for m in lr): + seen_msgs = {m.which() for m in log_msgs} + expected_msgs = set(cfg.subs) + if seen_msgs != expected_msgs: + return f"Expected messages: {expected_msgs}, but got: {seen_msgs}", log_msgs + + try: + return compare_logs(ref_log_msgs, log_msgs, ignore_fields + cfg.ignore, ignore_msgs, cfg.tolerance), log_msgs + except Exception as e: + return str(e), log_msgs + + +def finalize_git_updates(cur_commit, ref_commit_fn): + """Finalize git updates and create commit.""" + try: + # Add all new files first + os.system(f"git add {os.path.realpath(ref_commit_fn)}") + os.system(f"git add {os.path.realpath(FAKEDATA)}/*.zst") + + # Clean up old files - keep only new ref files since they're becoming the reference + preserve_only_specified_files_from_ref_commit(cur_commit) + + # Add the deletions to git + os.system(f"git add -u {os.path.realpath(FAKEDATA)}") + + # Create the commit + commit_msg = f"test_processes: update ref logs to {cur_commit[:7]}" + os.system(f'git commit -m "{commit_msg}"') + print("Successfully committed reference log updates") + except Exception as e: + print(f"Failed to commit changes: {e}") + + +if __name__ == "__main__": + all_cars = {car for car, _ in segments} + all_procs = {cfg.proc_name for cfg in CONFIGS if cfg.proc_name not in EXCLUDED_PROCS} + + cpu_count = os.cpu_count() or 1 + + parser = argparse.ArgumentParser(description="Regression test to identify changes in a process's output") + parser.add_argument("--whitelist-procs", type=str, nargs="*", default=all_procs, + help="Whitelist given processes from the test (e.g. controlsd)") + parser.add_argument("--whitelist-cars", type=str, nargs="*", default=all_cars, + help="Whitelist given cars from the test (e.g. HONDA)") + parser.add_argument("--blacklist-procs", type=str, nargs="*", default=[], + help="Blacklist given processes from the test (e.g. controlsd)") + parser.add_argument("--blacklist-cars", type=str, nargs="*", default=[], + help="Blacklist given cars from the test (e.g. HONDA)") + parser.add_argument("--ignore-fields", type=str, nargs="*", default=[], + help="Extra fields or msgs to ignore (e.g. driverMonitoringState.events)") + parser.add_argument("--ignore-msgs", type=str, nargs="*", default=[], + help="Msgs to ignore (e.g. carEvents)") + parser.add_argument("--update-refs", action="store_true", + help="Updates reference logs using current commit") + parser.add_argument("--upload-only", action="store_true", + help="Skips testing processes and uploads logs from previous test run") + parser.add_argument("--local", action="store_true", + help="Use local git/ storage instead of remote (Azure for Comma)") + parser.add_argument("-j", "--jobs", type=int, default=max(cpu_count - 2, 1), + help="Max amount of parallel jobs") + args = parser.parse_args() + + tested_procs = set(args.whitelist_procs) - set(args.blacklist_procs) + tested_cars = set(args.whitelist_cars) - set(args.blacklist_cars) + tested_cars = {c.upper() for c in tested_cars} + + full_test = (tested_procs == all_procs) and (tested_cars == all_cars) and all(len(x) == 0 for x in (args.ignore_fields, args.ignore_msgs)) + upload = args.update_refs or args.upload_only + os.makedirs(os.path.dirname(FAKEDATA), exist_ok=True) + + if upload: + assert full_test, "Need to run full test when updating refs" + + try: + with open(REF_COMMIT_FN) as f: + ref_commit = f.read().strip() + except FileNotFoundError: + print("Couldn't find reference commit") + sys.exit(1) + + cur_commit = get_commit() + if not cur_commit: + raise Exception("Couldn't get current commit") + + # Could be set as default in args, but wanted to be more explicit on the flow. + if upload and not args.local and not IS_AZURE_TOKEN_DEFINED: + print("***** Warning: local/git run was used by default since AZURE_TOKEN was NOT found on the env variables! *****") + args.local = True + + # Clean up old files before starting + if upload and args.local: + print("***** Cleaning up old fakedata for local/git tracked refs *****") + preserve_only_specified_files_from_ref_commit(cur_commit, ref_commit) + + print(f"***** testing against commit {ref_commit} *****") + + # check to make sure all car brands are tested + if full_test: + untested = (set(interface_names) - set(excluded_interfaces)) - {c.lower() for c in tested_cars} + assert len(untested) == 0, f"Cars missing routes: {str(untested)}" + + log_paths: defaultdict[str, dict[str, dict[str, str]]] = defaultdict(lambda: defaultdict(dict)) + with concurrent.futures.ProcessPoolExecutor(max_workers=args.jobs) as pool: + if not args.upload_only: + download_segments = [seg for car, seg in segments if car in tested_cars] + log_data: dict[str, LogReader] = {} + p1 = pool.map(get_log_data, download_segments) + for segment, lr in tqdm(p1, desc="Getting Logs", total=len(download_segments)): + log_data[segment] = lr + + pool_args: Any = [] + for car_brand, segment in segments: + if car_brand not in tested_cars: + continue + + for cfg in CONFIGS: + if cfg.proc_name not in tested_procs: + continue + + # to speed things up, we only test all segments on card + if cfg.proc_name not in ('card', 'controlsd') and car_brand not in ('HYUNDAI', 'TOYOTA'): + continue + + cur_log_fn = os.path.join(FAKEDATA, f"{segment}_{cfg.proc_name}_{cur_commit}.zst") + if args.update_refs: # reference logs will not exist if routes were just regenerated + ref_log_path = get_url(*segment.rsplit("--", 1,), "rlog.zst") + else: + ref_log_fn = os.path.join(FAKEDATA, f"{segment}_{cfg.proc_name}_{ref_commit}.zst") + ref_log_path = ref_log_fn if os.path.exists(ref_log_fn) else BASE_URL + os.path.basename(ref_log_fn) + + dat = None if args.upload_only else log_data[segment] + pool_args.append((segment, cfg, args, cur_log_fn, ref_log_path, dat)) + + log_paths[segment][cfg.proc_name]['ref'] = ref_log_path + log_paths[segment][cfg.proc_name]['new'] = cur_log_fn + + results: Any = defaultdict(dict) + p2 = pool.map(run_test_process, pool_args) + for (segment, proc, result) in tqdm(p2, desc="Running Tests", total=len(pool_args)): + if not args.upload_only: + results[segment][proc] = result + + diff_short, diff_long, failed = format_diff(results, log_paths, ref_commit) + if not upload: + with open(os.path.join(PROC_REPLAY_DIR, "diff.txt"), "w") as f: + f.write(diff_long) + print(diff_short) + + if failed: + print("TEST FAILED") + print("\n\nTo push the new reference logs for this commit run:") + print("./test_processes.py --upload-only") + else: + print("TEST SUCCEEDED") + + else: + with open(REF_COMMIT_FN, "w") as f: + f.write(cur_commit) + print(f"\n\nUpdated reference logs for commit: {cur_commit}") + + # Only do git operations if we're in local mode + if upload and args.local: + finalize_git_updates(cur_commit, REF_COMMIT_FN) + + sys.exit(int(failed)) diff --git a/iqpilot/selfdrive/test/process_replay/test_regen.py b/iqpilot/selfdrive/test/process_replay/test_regen.py new file mode 100644 index 000000000..cfe73b664 --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/test_regen.py @@ -0,0 +1,37 @@ +from parameterized import parameterized + +from iqpilot.selfdrive.test.process_replay.regen import regen_segment +from iqpilot.selfdrive.test.process_replay.process_replay import check_openpilot_enabled +from iqpilot.tools.lib.logreader import get_url +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.tools.lib.framereader import FrameReader + +TESTED_SEGMENTS = [ + ("PRIUS_C2", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.TOYOTA_PRIUS: NEO, pandaStateDEPRECATED, no peripheralState, sensorEventsDEPRECATED + # Enable these once regen on CI becomes faster or use them for different tests running controlsd in isolation + # ("MAZDA_C3", "bd6a637565e91581|2021-10-30--15-14-53--4"), # MAZDA.CX9_2021: TICI, incomplete managerState + # ("FORD_C3", "54827bf84c38b14f|2023-01-26--21-59-07--4"), # FORD.BRONCO_SPORT_MK1: TICI +] + + +def ci_setup_data_readers(route, sidx): + lr = LogReader(get_url(route, sidx, "rlog.bz2")) + frs = { + 'roadCameraState': FrameReader(get_url(route, sidx, "fcamera.hevc")), + 'driverCameraState': FrameReader(get_url(route, sidx, "fcamera.hevc")), + } + if next((True for m in lr if m.which() == "wideRoadCameraState"), False): + frs["wideRoadCameraState"] = FrameReader(get_url(route, sidx, "ecamera.hevc")) + + return lr, frs + + +class TestRegen: + @parameterized.expand(TESTED_SEGMENTS) + def test_engaged(self, case_name, segment): + route, sidx = segment.rsplit("--", 1) + lr, frs = ci_setup_data_readers(route, sidx) + output_logs = regen_segment(lr, frs, disable_tqdm=True) + + engaged = check_openpilot_enabled(output_logs) + assert engaged, f"openpilot not engaged in {case_name}" diff --git a/iqpilot/selfdrive/test/process_replay/vision_meta.py b/iqpilot/selfdrive/test/process_replay/vision_meta.py new file mode 100644 index 000000000..941421dbe --- /dev/null +++ b/iqpilot/selfdrive/test/process_replay/vision_meta.py @@ -0,0 +1,43 @@ +from collections import namedtuple +from iqpilot.cereal.visionipc import VisionStreamType +from iqpilot.common.realtime import DT_MDL, DT_DMON +from iqpilot.common.transformations.camera import DEVICE_CAMERAS + +VideoStreamMeta = namedtuple("VideoStreamMeta", ["camera_state", "encode_index", "stream", "dt", "frame_sizes"]) +ROAD_CAMERA_FRAME_SIZES = {k: (v.dcam.width, v.dcam.height) for k, v in DEVICE_CAMERAS.items()} +WIDE_ROAD_CAMERA_FRAME_SIZES = {k: (v.ecam.width, v.ecam.height) for k, v in DEVICE_CAMERAS.items() if v.ecam is not None} +DRIVER_CAMERA_FRAME_SIZES = {k: (v.dcam.width, v.dcam.height) for k, v in DEVICE_CAMERAS.items()} +VIPC_STREAM_METADATA = [ + # metadata: (state_msg_type, encode_msg_type, stream_type, dt, frame_sizes) + ("roadCameraState", "roadEncodeIdx", VisionStreamType.VISION_STREAM_ROAD, DT_MDL, ROAD_CAMERA_FRAME_SIZES), + ("wideRoadCameraState", "wideRoadEncodeIdx", VisionStreamType.VISION_STREAM_WIDE_ROAD, DT_MDL, WIDE_ROAD_CAMERA_FRAME_SIZES), + ("driverCameraState", "driverEncodeIdx", VisionStreamType.VISION_STREAM_DRIVER, DT_DMON, DRIVER_CAMERA_FRAME_SIZES), +] + + +def meta_from_camera_state(state): + meta = next((VideoStreamMeta(*meta) for meta in VIPC_STREAM_METADATA if meta[0] == state), None) + return meta + + +def meta_from_encode_index(encode_index): + meta = next((VideoStreamMeta(*meta) for meta in VIPC_STREAM_METADATA if meta[1] == encode_index), None) + return meta + + +def meta_from_stream_type(stream_type): + meta = next((VideoStreamMeta(*meta) for meta in VIPC_STREAM_METADATA if meta[2] == stream_type), None) + return meta + + +def available_streams(lr=None): + if lr is None: + return [VideoStreamMeta(*meta) for meta in VIPC_STREAM_METADATA] + + result = [] + for meta in VIPC_STREAM_METADATA: + has_cam_state = next((True for m in lr if m.which() == meta[0]), False) + if has_cam_state: + result.append(VideoStreamMeta(*meta)) + + return result diff --git a/iqpilot/selfdrive/test/scons_build_test.sh b/iqpilot/selfdrive/test/scons_build_test.sh new file mode 100755 index 000000000..c75b648bc --- /dev/null +++ b/iqpilot/selfdrive/test/scons_build_test.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -e + +SCRIPT_DIR=$(dirname "$0") +BASEDIR=$(realpath "$SCRIPT_DIR/../../../") +cd $BASEDIR + +# tests that our build system's dependencies are configured properly, +# needs a machine with lots of cores + +# helpful commands: +# scons -Q --tree=derived + +scons --clean +scons --no-cache --random -j$(nproc) +if ! scons -q; then + echo "FAILED: all build products not up to date after first pass." + exit 1 +fi diff --git a/iqpilot/selfdrive/test/setup_device_ci.sh b/iqpilot/selfdrive/test/setup_device_ci.sh new file mode 100755 index 000000000..4445a74fd --- /dev/null +++ b/iqpilot/selfdrive/test/setup_device_ci.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash + +set -e +set -x + +if [ -z "$SOURCE_DIR" ]; then + echo "SOURCE_DIR must be set" + exit 1 +fi + +if [ -z "$GIT_COMMIT" ]; then + echo "GIT_COMMIT must be set" + exit 1 +fi + +if [ -z "$TEST_DIR" ]; then + echo "TEST_DIR must be set" + exit 1 +fi + +# prevent storage from filling up +rm -rf /data/media/0/realdata/* + +rm -rf /data/safe_staging/ || true +if [ -d /data/safe_staging/ ]; then + sudo umount /data/safe_staging/merged/ || true + rm -rf /data/safe_staging/ || true +fi + +CONTINUE_PATH="/data/continue.sh" +tee $CONTINUE_PATH << EOF +#!/usr/bin/env bash + +sudo abctl --set_success + +# patch sshd config +sudo mount -o rw,remount / +sudo sed -i "s,/data/params/d/GithubSshKeys,/usr/comma/setup_keys," /etc/ssh/sshd_config +sudo systemctl daemon-reload +sudo systemctl restart ssh +sudo systemctl restart NetworkManager +sudo systemctl disable ssh-param-watcher.path +sudo systemctl disable ssh-param-watcher.service +sudo mount -o ro,remount / +sudo systemctl stop power_monitor + +while true; do + if ! sudo systemctl is-active -q ssh; then + sudo systemctl start ssh + fi + + #if ! pgrep -f 'ciui.py' > /dev/null 2>&1; then + # echo 'starting UI' + # cp $SOURCE_DIR/selfdrive/test/ciui.py /data/ + # /data/ciui.py & + #fi + + sleep 5s +done + +sleep infinity +EOF +chmod +x $CONTINUE_PATH + +safe_checkout() { + # completely clean TEST_DIR + + cd $SOURCE_DIR + + # cleanup orphaned locks + find .git -type f -name "*.lock" -exec rm {} + + + git reset --hard + git fetch --no-tags -j4 --verbose --depth 1 origin $GIT_COMMIT + find . -maxdepth 1 -not -path './.git' -not -name '.' -not -name '..' -exec rm -rf '{}' \; + git reset --hard $GIT_COMMIT + git checkout $GIT_COMMIT + git clean -xdff + git lfs pull + (ulimit -n 65535 && git lfs prune) + + echo "git checkout done, t=$SECONDS" + du -hs $SOURCE_DIR $SOURCE_DIR/.git + + rsync -a --delete $SOURCE_DIR $TEST_DIR +} + +unsafe_checkout() {( set -e + # checkout directly in test dir, leave old build products + + cd $TEST_DIR + + # cleanup orphaned locks + find .git -type f -name "*.lock" -exec rm {} + + + git fetch --no-tags -j8 --verbose --depth 1 origin $GIT_COMMIT + git checkout --force $GIT_COMMIT + git reset --hard $GIT_COMMIT + git clean -dff + git lfs pull + (ulimit -n 65535 && git lfs prune) +)} + +export GIT_PACK_THREADS=8 + +# set up environment +if [ ! -d "$SOURCE_DIR" ]; then + git clone https://github.com/commaai/openpilot.git $SOURCE_DIR +fi + +if [ ! -z "$UNSAFE" ]; then + echo "trying unsafe checkout" + set +e + unsafe_checkout + if [[ "$?" -ne 0 ]]; then + safe_checkout + fi + set -e +else + echo "doing safe checkout" + safe_checkout +fi + +echo "$TEST_DIR synced with $GIT_COMMIT, t=$SECONDS" diff --git a/iqpilot/selfdrive/test/setup_vsound.sh b/iqpilot/selfdrive/test/setup_vsound.sh new file mode 100755 index 000000000..aab149974 --- /dev/null +++ b/iqpilot/selfdrive/test/setup_vsound.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +{ + #start pulseaudio daemon + sudo pulseaudio -D + + # create a virtual null audio and set it to default device + sudo pactl load-module module-null-sink sink_name=virtual_audio + sudo pactl set-default-sink virtual_audio +} > /dev/null 2>&1 diff --git a/iqpilot/selfdrive/test/setup_xvfb.sh b/iqpilot/selfdrive/test/setup_xvfb.sh new file mode 100755 index 000000000..692b84d65 --- /dev/null +++ b/iqpilot/selfdrive/test/setup_xvfb.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +# Sets up a virtual display for running map renderer and simulator without an X11 display + +DISP_ID=99 +export DISPLAY=:$DISP_ID + +sudo Xvfb $DISPLAY -screen 0 2160x1080x24 2>/dev/null & + +# check for x11 socket for the specified display ID +while [ ! -S /tmp/.X11-unix/X$DISP_ID ] +do + echo "Waiting for Xvfb..." + sleep 1 +done + +touch ~/.Xauthority +export XDG_SESSION_TYPE="x11" +xset -q \ No newline at end of file diff --git a/iqpilot/selfdrive/test/test_onroad.py b/iqpilot/selfdrive/test/test_onroad.py new file mode 100644 index 000000000..ac8f5a836 --- /dev/null +++ b/iqpilot/selfdrive/test/test_onroad.py @@ -0,0 +1,452 @@ +import math +import json +import os +import pytest +import shutil +import subprocess +import time +import numpy as np +from collections import Counter, defaultdict +from pathlib import Path +from tabulate import tabulate + +from iqpilot.cereal import log +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.timeout import Timeout +from iqpilot.common.params import Params +from iqpilot.selfdrive.selfdrived.events import EVENTS, ET +from iqpilot.selfdrive.test.helpers import set_params_enabled, release_only +from iqpilot.system.hardware.hw import Paths +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.tools.lib.logreader import msgs_to_time_series + +""" +CPU usage budget +* each process is entitled to at least 8% +* total CPU usage of openpilot (sum(PROCS.values()) + should not exceed MAX_TOTAL_CPU +""" + +TEST_DURATION = 25 +LOG_OFFSET = 8 + +MAX_TOTAL_CPU = 350. # total for all 8 cores +PROCS = { + # Baseline CPU usage by process + "selfdrive.controls.controlsd": 16.0, + "selfdrive.selfdrived.selfdrived": 16.0, + "selfdrive.car.card": 26.0, + "./loggerd": 14.0, + "./encoderd": 13.0, + "./camerad": 10.0, + "selfdrive.controls.plannerd": 8.0, + "selfdrive.ui.ui": 40.0, + "system.sensord.sensord": 13.0, + "selfdrive.controls.radard": 2.0, + "selfdrive.iqmodeld.daemon": 22.0, + "selfdrive.dmonitoringmodeld.dmonitoringmodeld": 18.0, + "system.hardware.hardwared": 4.0, + "selfdrive.locationd.calibrationd": 2.0, + "selfdrive.locationd.locationd": 25.0, + "selfdrive.locationd.estimatord": 22.0, + "selfdrive.ui.soundd": 3.0, + "selfdrive.ui.feedback.feedbackd": 1.0, + "selfdrive.monitoring.dmonitoringd": 4.0, + "system.proclogd": 3.0, + "system.logmessaged": 1.0, + "system.tombstoned": 0, + "system.journald": 1.0, + "system.micd": 5.0, + "system.timed": 0, + "selfdrive.pandad.pandad": 0, + "iqpilot_private.konn3kt.uploaderd.iquploaderd": 15.0, + "system.loggerd.deleter": 1.0, + "./pandad": 19.0, + "system.qcomgpsd.qcomgpsd": 1.0, +} + +TIMINGS = { + # rtols: max/min, rsd + "can": [2.5, 0.35], + "pandaStates": [2.5, 0.35], + "peripheralState": [2.5, 0.35], + "sendcan": [2.5, 0.35], + "carState": [2.5, 0.35], + "carControl": [2.5, 0.35], + "controlsState": [2.5, 0.35], + "longitudinalPlan": [2.5, 0.5], + "driverAssistance": [2.5, 0.5], + "roadCameraState": [2.5, 0.35], + "driverCameraState": [2.5, 0.35], + "modelV2": [2.5, 0.35], + "driverStateV2": [2.5, 0.40], + "deviceMotion": [2.5, 0.35], + "vehicleParameters": [2.5, 0.35], + "wideRoadCameraState": [1.5, 0.35], +} + +LOGS_SIZE = { # MB per segment + "qlog.zst": 0.5, + "rlog.zst": 8.1, + "qcamera.ts": 2.3, +} +LOGS_SIZE.update(dict.fromkeys(['ecamera.hevc', 'fcamera.hevc', 'dcamera.hevc'], 76.5)) + + +def cputime_total(ct): + return ct.cpuUser + ct.cpuSystem + ct.cpuChildrenUser + ct.cpuChildrenSystem + + +@pytest.mark.tici +@pytest.mark.skip_tici_setup +class TestOnroad: + + @classmethod + def setup_class(cls): + if "DEBUG" in os.environ: + segs = filter(lambda x: os.path.exists(os.path.join(x, "rlog.zst")), Path(Paths.log_root()).iterdir()) + segs = sorted(segs, key=lambda x: x.stat().st_mtime) + cls.lr = list(LogReader(os.path.join(segs[-1], "rlog.zst"))) + cls.ts = msgs_to_time_series(cls.lr) + return + + # setup env + params = Params() + params.remove("CurrentRoute") + params.put_bool("RecordFront", True) + set_params_enabled() + os.environ['REPLAY'] = '1' + os.environ['MSGQ_PREALLOC'] = '1' + os.environ['TESTING_CLOSET'] = '1' + if os.path.exists(Paths.log_root()): + shutil.rmtree(Paths.log_root()) + + # start manager and run openpilot for TEST_DURATION + proc = None + try: + manager_path = os.path.join(BASEDIR, "iqpilot/system/manager/manager.py") + cls.manager_st = time.monotonic() + proc = subprocess.Popen(["python", manager_path]) + + sm = messaging.SubMaster(['carState']) + with Timeout(30, "controls didn't start"): + while not sm.seen['carState']: + sm.update(1000) + + route = params.get("CurrentRoute") + assert route is not None + + segs = list(Path(Paths.log_root()).glob(f"{route}--*")) + assert len(segs) == 1 + + time.sleep(TEST_DURATION) + finally: + if proc is not None: + proc.terminate() + if proc.wait(60) is None: + proc.kill() + + cls.lr = list(LogReader(os.path.join(str(segs[0]), "rlog.zst"))) + st = time.monotonic() + cls.ts = msgs_to_time_series(cls.lr) + print("msgs to time series", time.monotonic() - st) + log_path = segs[0] + + cls.log_sizes = {} + for f in log_path.iterdir(): + assert f.is_file() + cls.log_sizes[f] = f.stat().st_size / 1e6 + + cls.msgs = defaultdict(list) + for m in cls.lr: + cls.msgs[m.which()].append(m) + + def test_service_frequencies(self, subtests): + for s, msgs in self.msgs.items(): + if s in ('initData', 'sentinel'): + continue + + # skip gps services for now + if s in ('ubloxGnss', 'ubloxRaw', 'gnssMeasurements', 'gpsLocation', 'gpsLocationExternal', 'qcomGnss'): + continue + + with subtests.test(service=s): + assert len(msgs) >= math.floor(SERVICE_LIST[s].frequency*int(TEST_DURATION*0.8)) + + def test_manager_starting_time(self): + st = self.ts['managerState']['t'][0] + assert (st - self.manager_st) < 15.0, f"manager.py took {st - self.manager_st}s to publish the first 'managerState' msg" + + def test_cloudlog_size(self): + msgs = self.msgs['logMessage'] + + total_size = sum(len(m.as_builder().to_bytes()) for m in msgs) + assert total_size < 3.5e5 + + cnt = Counter(json.loads(m.logMessage)['filename'] for m in msgs) + big_logs = [f for f, n in cnt.most_common(3) if n / sum(cnt.values()) > 30.] + assert len(big_logs) == 0, f"Log spam: {big_logs}" + + def test_log_sizes(self, subtests): + # TODO: this isn't super stable between different devices + for f, sz in self.log_sizes.items(): + rate = LOGS_SIZE[f.name]/60. + minn = rate * TEST_DURATION * 0.5 + maxx = rate * TEST_DURATION * 1.5 + with subtests.test(file=f.name): + assert minn < sz < maxx + + def test_ui_timings(self): + result = "\n" + result += "------------------------------------------------\n" + result += "-------------- UI Draw Timing ------------------\n" + result += "------------------------------------------------\n" + + # other processes preempt ui while starting up + offset = int(20 * LOG_OFFSET) + ts = self.ts['uiDebug']['drawTimeMillis'][offset:] + result += f"min {min(ts):.2f}ms\n" + result += f"max {max(ts):.2f}ms\n" + result += f"std {np.std(ts):.2f}ms\n" + result += f"mean {np.mean(ts):.2f}ms\n" + result += "------------------------------------------------\n" + print(result) + + assert max(ts) < 250. + assert np.mean(ts) < 20. # TODO: ~6-11ms, increase consistency + #self.assertLess(np.std(ts), 5.) + + # some slow frames are expected since camerad/modeld can preempt ui + veryslow = [x for x in ts if x > 40.] + assert len(veryslow) < 5, f"Too many slow frame draw times: {veryslow}" + + def test_cpu_usage(self, subtests): + print("\n------------------------------------------------") + print("------------------ CPU Usage -------------------") + print("------------------------------------------------") + + plogs_by_proc = defaultdict(list) + for pl in self.msgs['procLog']: + for x in pl.procLog.procs: + if len(x.cmdline) > 0: + n = list(x.cmdline)[0] + plogs_by_proc[n].append(x) + + cpu_ok = True + dt = (self.msgs['procLog'][-1].logMonoTime - self.msgs['procLog'][0].logMonoTime) / 1e9 + header = ['process', 'usage', 'expected', 'max allowed', 'test result'] + rows = [] + for proc_name, expected in PROCS.items(): + + error = "" + usage = 0. + x = plogs_by_proc[proc_name] + if len(x) > 2: + cpu_time = cputime_total(x[-1]) - cputime_total(x[0]) + usage = cpu_time / dt * 100. + + max_allowed = max(expected * 1.8, expected + 5.0) + if usage > max_allowed: + error = "❌ USING MORE CPU THAN EXPECTED ❌" + cpu_ok = False + + else: + error = "❌ NO METRICS FOUND ❌" + cpu_ok = False + + rows.append([proc_name, usage, expected, max_allowed, error or "✅"]) + print(tabulate(rows, header, tablefmt="simple_grid", stralign="center", numalign="center", floatfmt=".2f")) + + # Ensure there's no missing procs + all_procs = {p.name for p in self.msgs['managerState'][0].managerState.processes if p.shouldBeRunning} + for p in all_procs: + with subtests.test(proc=p): + assert any(p in pp for pp in PROCS.keys()), f"Expected CPU usage missing for {p}" + + # total CPU check + procs_tot = sum([(max(x) if isinstance(x, tuple) else x) for x in PROCS.values()]) + with subtests.test(name="total CPU"): + assert procs_tot < MAX_TOTAL_CPU, "Total CPU budget exceeded" + print("------------------------------------------------") + print(f"Total allocated CPU usage is {procs_tot}%, budget is {MAX_TOTAL_CPU}%, {MAX_TOTAL_CPU-procs_tot:.1f}% left") + print("------------------------------------------------") + + assert cpu_ok + + def test_memory_usage(self): + print("\n------------------------------------------------") + print("--------------- Memory Usage -------------------") + print("------------------------------------------------") + offset = int(SERVICE_LIST['deviceState'].frequency * LOG_OFFSET) + mems = [m.deviceState.memoryUsagePercent for m in self.msgs['deviceState'][offset:]] + print("Overall memory usage: ", mems) + print("MSGQ (/dev/shm/) usage: ", subprocess.check_output(["du", "-hs", "/dev/shm"]).split()[0].decode()) + + # check for big leaks. note that memory usage is + # expected to go up while the MSGQ buffers fill up + assert np.average(mems) <= 80, "Average memory usage too high" + assert np.max(np.diff(mems)) <= 4, "Max memory increase too high" + assert np.average(np.diff(mems)) <= 1, "Average memory increase too high" + + def test_camera_frame_timings(self, subtests): + # test timing within a single camera + result = "\n" + result += "------------------------------------------------\n" + result += "----------------- SOF Timing ------------------\n" + result += "------------------------------------------------\n" + for name in ['roadCameraState', 'wideRoadCameraState', 'driverCameraState']: + ts = self.ts[name]['timestampSof'] + d_ms = np.diff(ts) / 1e6 + d50 = np.abs(d_ms-50) + result += f"{name} sof delta vs 50ms: min {min(d50):.2f}ms\n" + result += f"{name} sof delta vs 50ms: max {max(d50):.2f}ms\n" + result += f"{name} sof delta vs 50ms: mean {d50.mean():.2f}ms\n" + with subtests.test(camera=name): + assert max(d50) < 5.0, f"high SOF delta vs 50ms: {max(d50)}" + result += "------------------------------------------------\n" + print(result) + + def test_camera_sync(self, subtests): + cam_states = ['roadCameraState', 'wideRoadCameraState', 'driverCameraState'] + encode_cams = ['roadEncodeIdx', 'wideRoadEncodeIdx', 'driverEncodeIdx'] + for cams in (cam_states, encode_cams): + with subtests.test(cams=cams): + # sanity checks within a single cam + for cam in cams: + with subtests.test(test="frame_skips", camera=cam): + assert set(np.diff(self.ts[cam]['frameId'])) == {1, }, "Frame ID skips" + + # EOF > SOF + eof_sof_diff = self.ts[cam]['timestampEof'] - self.ts[cam]['timestampSof'] + assert np.all(eof_sof_diff > 0) + assert np.all(eof_sof_diff < 50*1e6) + + first_fid = {min(self.ts[c]['frameId']) for c in cams} + assert len(first_fid) == 1, "Cameras don't start on same frame ID" + if cam.endswith('CameraState'): + # camerad guarantees that all cams start on frame ID 0 + # (note loggerd also needs to start up fast enough to catch it) + assert next(iter(first_fid)) < 100, "Cameras start on frame ID too high" + + # we don't do a full segment rotation, so these might not match exactly + last_fid = {max(self.ts[c]['frameId']) for c in cams} + assert max(last_fid) - min(last_fid) < 10 + + start, end = min(first_fid), min(last_fid) + for i in range(end-start): + ts = {c: round(self.ts[c]['timestampSof'][i]/1e6, 1) for c in cams} + diff = (max(ts.values()) - min(ts.values())) + assert diff < 2, f"Cameras not synced properly: frame_id={start+i}, {diff=:.1f}ms, {ts=}" + + def test_camera_encoder_matches(self, subtests): + # sanity check that the frame metadata is consistent with the encoded frames + pairs = [('roadCameraState', 'roadEncodeIdx'), + ('wideRoadCameraState', 'wideRoadEncodeIdx'), + ('driverCameraState', 'driverEncodeIdx')] + for cam, enc in pairs: + with subtests.test(camera=cam, encoder=enc): + cam_frames = {fid: (sof, eof) for fid, sof, eof in zip( + self.ts[cam]['frameId'], + self.ts[cam]['timestampSof'], + self.ts[cam]['timestampEof'], + strict=True, + )} + for i, fid in enumerate(self.ts[enc]['frameId']): + cam_sof, cam_eof = cam_frames[fid] + enc_sof, enc_eof = self.ts[enc]['timestampSof'][i], self.ts[enc]['timestampEof'][i] + assert enc_sof == cam_sof, f"SOF mismatch: frameId={fid}, enc_sof={enc_sof}, cam_sof={cam_sof}" + assert enc_eof == cam_eof, f"EOF mismatch: frameId={fid}, enc_eof={enc_eof}, cam_eof={cam_eof}" + + def test_mpc_execution_timings(self): + result = "\n" + result += "------------------------------------------------\n" + result += "----------------- MPC Timing ------------------\n" + result += "------------------------------------------------\n" + + cfgs = [("longitudinalPlan", 0.05, 0.05),] + for (s, instant_max, avg_max) in cfgs: + ts = [getattr(m, s).solverExecutionTime for m in self.msgs[s]] + assert max(ts) < instant_max, f"high '{s}' execution time: {max(ts)}" + assert np.mean(ts) < avg_max, f"high avg '{s}' execution time: {np.mean(ts)}" + result += f"'{s}' execution time: min {min(ts):.5f}s\n" + result += f"'{s}' execution time: max {max(ts):.5f}s\n" + result += f"'{s}' execution time: mean {np.mean(ts):.5f}s\n" + result += "------------------------------------------------\n" + print(result) + + @pytest.mark.model_validation + def test_model_execution_timings(self, subtests): + result = "\n" + result += "------------------------------------------------\n" + result += "----------------- Model Timing -----------------\n" + result += "------------------------------------------------\n" + cfgs = [ + # since multiple processes use the GPU and can preempt each other, + # these numbers are not fully self-contained. + ("modelV2", 0.06, 0.040), + + # can miss cycles here and there, just important the avg frequency is 20Hz + ("driverStateV2", 0.3, 0.05), + ] + for (s, instant_max, avg_max) in cfgs: + ts = [getattr(m, s).modelExecutionTime for m in self.msgs[s]] + # TODO some init can happen in first iteration + ts = ts[1:] + result += f"'{s}' execution time: min {min(ts):.5f}s\n" + result += f"'{s}' execution time: max {max(ts):.5f}s\n" + result += f"'{s}' execution time: mean {np.mean(ts):.5f}s\n" + with subtests.test(s): + assert max(ts) < instant_max, f"high '{s}' execution time: {max(ts)}" + assert np.mean(ts) < avg_max, f"high avg '{s}' execution time: {np.mean(ts)}" + result += "------------------------------------------------\n" + print(result) + + def test_timings(self): + passed = True + print("\n------------------------------------------------") + print("----------------- Service Timings --------------") + print("------------------------------------------------") + + header = ['service', 'max', 'min', 'mean', 'expected mean', 'rsd', 'max allowed rsd', 'test result'] + rows = [] + for s, (maxmin, rsd) in TIMINGS.items(): + offset = int(SERVICE_LIST[s].frequency * LOG_OFFSET) + msgs = [m.logMonoTime for m in self.msgs[s][offset:]] + if not len(msgs): + raise Exception(f"missing {s}") + + ts = np.diff(msgs) / 1e9 + dt = 1 / SERVICE_LIST[s].frequency + + errors = [] + if not np.allclose(np.mean(ts), dt, rtol=0.03, atol=0): + errors.append("❌ FAILED MEAN TIMING CHECK ❌") + if not np.allclose([np.max(ts), np.min(ts)], dt, rtol=maxmin, atol=0): + errors.append("❌ FAILED MAX/MIN TIMING CHECK ❌") + if (np.std(ts)/dt) > rsd: + errors.append("❌ FAILED RSD TIMING CHECK ❌") + passed = not errors and passed + rows.append([s, *(np.array([np.max(ts), np.min(ts), np.mean(ts), dt])*1e3), np.std(ts)/dt, rsd, "\n".join(errors) or "✅"]) + + print(tabulate(rows, header, tablefmt="simple_grid", stralign="center", numalign="center", floatfmt=".2f")) + assert passed + + @release_only + def test_startup(self): + startup_alert = self.ts['selfdriveState']['alertText1'][0] + expected = EVENTS[log.OnroadEvent.EventName.startup][ET.PERMANENT].alert_text_1 + assert startup_alert == expected, "wrong startup alert" + + def test_engagable(self): + no_entries = Counter() + for m in self.msgs['onroadEvents']: + for evt in m.onroadEvents: + if evt.noEntry: + no_entries[evt.name] += 1 + + offset = int(SERVICE_LIST['selfdriveState'].frequency * LOG_OFFSET) + eng = [m.selfdriveState.engageable for m in self.msgs['selfdriveState'][offset:]] + assert all(eng), \ + f"Not engageable for whole segment:\n- selfdriveState.engageable: {Counter(eng)}\n- No entry events: {no_entries}" diff --git a/iqpilot/selfdrive/test/update_ci_routes.py b/iqpilot/selfdrive/test/update_ci_routes.py new file mode 100755 index 000000000..0780ab025 --- /dev/null +++ b/iqpilot/selfdrive/test/update_ci_routes.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +import os +import re +import subprocess +import sys +from collections.abc import Iterable +from datetime import datetime, timedelta, UTC +from functools import lru_cache +from pathlib import Path +from typing import IO + +from tqdm import tqdm + +from iqdbc.car.tests.routes import routes as test_car_models_routes +from iqpilot.selfdrive.test.process_replay.test_processes import source_segments as replay_segments + +TOKEN_PATH = Path("/data/azure_token") + + +@lru_cache +def get_azure_credential(): + if "AZURE_TOKEN" in os.environ: + return os.environ["AZURE_TOKEN"] + if TOKEN_PATH.is_file(): + return TOKEN_PATH.read_text().strip() + from azure.identity import AzureCliCredential + return AzureCliCredential() + + +@lru_cache +def get_container_sas(account_name: str, container_name: str): + from azure.storage.blob import BlobServiceClient, ContainerSasPermissions, generate_container_sas + start_time = datetime.now(UTC).replace(tzinfo=None) + expiry_time = start_time + timedelta(hours=1) + blob_service = BlobServiceClient(account_url=f"https://{account_name}.blob.core.windows.net", credential=get_azure_credential()) + return generate_container_sas(account_name, container_name, + user_delegation_key=blob_service.get_user_delegation_key(start_time, expiry_time), + permission=ContainerSasPermissions(read=True, write=True, list=True), expiry=expiry_time) + + +class AzureContainer: + def __init__(self, account, container): + self.ACCOUNT = account + self.CONTAINER = container + + @property + def ACCOUNT_URL(self) -> str: + return f"https://{self.ACCOUNT}.blob.core.windows.net" + + @property + def BASE_URL(self) -> str: + return f"{self.ACCOUNT_URL}/{self.CONTAINER}/" + + def get_client_and_key(self): + from azure.storage.blob import ContainerClient + return ContainerClient(self.ACCOUNT_URL, self.CONTAINER, credential=get_azure_credential()), get_container_sas(self.ACCOUNT, self.CONTAINER) + + def upload_bytes(self, data: bytes | IO, blob_name: str, overwrite=False) -> str: + from azure.storage.blob import BlobClient + client = BlobClient(account_url=self.ACCOUNT_URL, container_name=self.CONTAINER, blob_name=blob_name, credential=get_azure_credential()) + client.upload_blob(data, overwrite=overwrite) + return self.BASE_URL + blob_name + + def upload_file(self, path: str | os.PathLike, blob_name: str, overwrite=False) -> str: + with open(path, "rb") as f: + return self.upload_bytes(f, blob_name, overwrite) + + +DataCIContainer = AzureContainer("commadataci", "commadataci") +DataProdContainer = AzureContainer("commadata2", "commadata2") +OpenpilotCIContainer = AzureContainer("commadataci", "openpilotci") + +SOURCES: list[AzureContainer] = [ + DataProdContainer, + DataCIContainer +] + +DEST = OpenpilotCIContainer + +def upload_route(path: str, exclude_patterns: Iterable[str] | None = None) -> None: + if exclude_patterns is None: + exclude_patterns = [r'dcamera\.hevc'] + + r, n = path.rsplit("--", 1) + r = '/'.join(r.split('/')[-2:]) # strip out anything extra in the path + destpath = f"{r}/{n}" + for file in os.listdir(path): + if any(re.search(pattern, file) for pattern in exclude_patterns): + continue + DEST.upload_file(os.path.join(path, file), f"{destpath}/{file}") + + +def sync_to_ci_public(route: str) -> bool: + dest_container, dest_key = DEST.get_client_and_key() + key_prefix = route.replace('|', '/') + dongle_id = key_prefix.split('/')[0] + + if next(dest_container.list_blob_names(name_starts_with=key_prefix), None) is not None: + return True + + print(f"Uploading {route}") + for source_container in SOURCES: + # assumes az login has been run + print(f"Trying {source_container.ACCOUNT}/{source_container.CONTAINER}") + _, source_key = source_container.get_client_and_key() + cmd = [ + "azcopy", + "copy", + f"{source_container.BASE_URL}{key_prefix}?{source_key}", + f"{DEST.BASE_URL}{dongle_id}?{dest_key}", + "--recursive=true", + "--overwrite=false", + "--exclude-pattern=*/dcamera.hevc", + ] + + try: + result = subprocess.call(cmd, stdout=subprocess.DEVNULL) + if result == 0: + print("Success") + return True + except subprocess.CalledProcessError: + print("Failed") + + return False + + +if __name__ == "__main__": + failed_routes = [] + + to_sync = sys.argv[1:] + + if not len(to_sync): + # sync routes from the car tests routes and process replay + to_sync.extend([rt.route for rt in test_car_models_routes]) + to_sync.extend([s[1].rsplit('--', 1)[0] for s in replay_segments]) + + for r in tqdm(to_sync): + if not sync_to_ci_public(r): + failed_routes.append(r) + + if len(failed_routes): + print("failed routes:", failed_routes) diff --git a/iqpilot/selfdrive/tests/test_constructiond.py b/iqpilot/selfdrive/tests/test_constructiond.py new file mode 100644 index 000000000..476e6437f --- /dev/null +++ b/iqpilot/selfdrive/tests/test_constructiond.py @@ -0,0 +1,123 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +from types import SimpleNamespace + +import numpy as np + +from iqpilot.selfdrive.constructiond import ( + ANALYSIS_PERIOD, + ENTER_HITS, + HIT_FRAC, + HOLD_SEC, + LUMA_MIN, + WASH_FRAC, + ConstructionZoneDetector, + State, + orange_fraction, +) + +# barrel orange / yellow paint chroma as measured on-device (see module docstring) +BARREL_U, BARREL_V = 88, 178 +PAINT_U, PAINT_V = 84, 159 + + +def _nv12_buf(width=1928, height=1208, patches=()): + stride = width + uv_offset = stride * height + data = np.full(uv_offset + stride * (height // 2), 128, dtype=np.uint8) + data[:uv_offset] = 120 # mid luma + uv = data[uv_offset:].reshape(height // 2, stride) + for r0, r1, c0, c1, u, v in patches: + uv[r0:r1, 2 * c0:2 * c1:2] = u + uv[r0:r1, 2 * c0 + 1:2 * c1:2] = v + return SimpleNamespace(data=data, width=width, height=height, stride=stride, uv_offset=uv_offset) + + +def test_orange_fraction_fires_on_barrel_chroma(): + ch, cw = 1208 // 2, 1928 // 2 + buf = _nv12_buf(patches=[(int(0.6 * ch), int(0.6 * ch) + 20, int(0.5 * cw), int(0.5 * cw) + 20, BARREL_U, BARREL_V)]) + assert orange_fraction(buf)[0] > HIT_FRAC + + +def test_orange_fraction_rejects_yellow_paint_chroma(): + ch, cw = 1208 // 2, 1928 // 2 + buf = _nv12_buf(patches=[(int(0.6 * ch), int(0.9 * ch), int(0.2 * cw), int(0.4 * cw), PAINT_U, PAINT_V)]) + assert orange_fraction(buf)[0] == 0.0 + + +def test_orange_fraction_ignores_sky_region(): + buf = _nv12_buf(patches=[(0, 100, 100, 300, BARREL_U, BARREL_V)]) + assert orange_fraction(buf)[0] == 0.0 + + +def test_detector_enters_after_persistent_hits_and_holds(): + det = ConstructionZoneDetector() + t = 0.0 + assert not det.update(0.0, t) + for _ in range(ENTER_HITS - 1): + t += ANALYSIS_PERIOD + assert not det.update(2 * HIT_FRAC, t) + assert det.state == State.pending + + t += ANALYSIS_PERIOD + assert det.update(2 * HIT_FRAC, t) + assert det.state == State.active + + # barrel-free stretch inside the zone: stays active through the hold window + t += HOLD_SEC - 1.0 + assert det.update(0.0, t) + + # past the hold: releases + t += HOLD_SEC + 1.0 + assert not det.update(0.0, t) + assert det.state == State.inactive + + +def test_detector_single_hit_does_not_enter(): + det = ConstructionZoneDetector() + det.update(2 * HIT_FRAC, 0.0) + for i in range(20): + assert not det.update(0.0, 1.0 + i * ANALYSIS_PERIOD) + + +def test_detector_ignores_global_orange_wash(): + det = ConstructionZoneDetector() + for i in range(10): + assert not det.update(2 * WASH_FRAC, i * ANALYSIS_PERIOD) + assert det.state == State.inactive + + +def test_orange_fraction_reports_roi_luma(): + buf = _nv12_buf() + frac, luma = orange_fraction(buf) + assert abs(luma - 120.0) < 1.0 # _nv12_buf fills Y with 120 + + +def test_detector_night_luma_gates_hits(): + det = ConstructionZoneDetector() + # night: retroreflective amber markers pass the chroma test but must not enter + for i in range(20): + assert not det.update(2 * HIT_FRAC, i * ANALYSIS_PERIOD, luma=LUMA_MIN - 30.0) + assert det.state == State.inactive + # same signal in daylight enters + for i in range(ENTER_HITS): + det.update(2 * HIT_FRAC, 100.0 + i * ANALYSIS_PERIOD, luma=LUMA_MIN + 30.0) + assert det.state == State.active + + +def test_detector_low_speed_gates_entry_but_not_hold(): + from iqpilot.selfdrive.constructiond import MIN_ENTER_SPEED + det = ConstructionZoneDetector() + # parked/lot speeds: orange never enters + for i in range(20): + assert not det.update(2 * HIT_FRAC, i * ANALYSIS_PERIOD, luma=120.0, v_ego=3.0) + assert det.state == State.inactive + # at speed: enters + t = 100.0 + for i in range(ENTER_HITS): + det.update(2 * HIT_FRAC, t + i * ANALYSIS_PERIOD, luma=120.0, v_ego=MIN_ENTER_SPEED + 5.0) + assert det.state == State.active + # slowing inside the zone: still held + assert det.update(0.0, t + 30.0, luma=120.0, v_ego=2.0) diff --git a/iqpilot/selfdrive/ui/.gitignore b/iqpilot/selfdrive/ui/.gitignore new file mode 100644 index 000000000..945928f61 --- /dev/null +++ b/iqpilot/selfdrive/ui/.gitignore @@ -0,0 +1 @@ +installer/installers/* diff --git a/iqpilot/selfdrive/ui/__init__.py b/iqpilot/selfdrive/ui/__init__.py new file mode 100644 index 000000000..30746770e --- /dev/null +++ b/iqpilot/selfdrive/ui/__init__.py @@ -0,0 +1 @@ +UI_BORDER_SIZE = 30 # diff --git a/iqpilot/selfdrive/ui/alert_sound_filter.py b/iqpilot/selfdrive/ui/alert_sound_filter.py new file mode 100644 index 000000000..e87f5b70e --- /dev/null +++ b/iqpilot/selfdrive/ui/alert_sound_filter.py @@ -0,0 +1,35 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Sound-suppression policy for Soundd. The driver's "IQAlertSilence" param, when set, +mutes routine chimes and keeps only a named allow-list of safety-critical cues +audible. The param is re-sampled on a fixed poll interval rather than every frame. +""" +from iqpilot.cereal import car +from iqpilot.common.params import Params + +# policy expressed as data: names resolved against the enum at construction so the +# allow-list reads as configuration instead of a hardcoded wall of enum accesses +_KEEP_AUDIBLE_WHEN_QUIET = ("warningSoft", "warningImmediate", "promptDistracted", "promptRepeat") +_SUPPRESS_PARAM = "IQAlertSilence" +_POLL_INTERVAL = 50 + + +class AlertSoundFilter: + def __init__(self): + self._store = Params() + self._cue = car.CarControl.HUDControl.AudibleAlert + self._allow_when_quiet = frozenset(getattr(self._cue, n) for n in _KEEP_AUDIBLE_WHEN_QUIET) + self._suppressing = self._store.get_bool(_SUPPRESS_PARAM) + self._poll = 0 + + def refresh(self) -> None: + self._poll = (self._poll + 1) % _POLL_INTERVAL + if self._poll == 0: + self._suppressing = self._store.get_bool(_SUPPRESS_PARAM) + + def permits(self, alert) -> bool: + has_cue = alert != self._cue.none + if not self._suppressing: + return has_cue + return has_cue and alert in self._allow_when_quiet diff --git a/iqpilot/selfdrive/ui/feedback/feedbackd.py b/iqpilot/selfdrive/ui/feedback/feedbackd.py new file mode 100755 index 000000000..0412edd32 --- /dev/null +++ b/iqpilot/selfdrive/ui/feedback/feedbackd.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +import iqpilot.cereal.messaging as messaging +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.cereal import car +from iqpilot.system.micd import SAMPLE_RATE, SAMPLE_BUFFER + +FEEDBACK_MAX_DURATION = 10.0 +ButtonType = car.CarState.ButtonEvent.Type + + +def main(): + params = Params() + pm = messaging.PubMaster(['userBookmark', 'audioFeedback']) + sm = messaging.SubMaster(['rawAudioData', 'bookmarkButton']) + should_record_audio = False + block_num = 0 + waiting_for_release = False + early_stop_triggered = False + + while True: + sm.update() + should_send_bookmark = False + + if False and sm.updated['carState'] and sm['carState'].canValid and not sm['iqState'].aol.available: + for be in sm['carState'].buttonEvents: + if be.type == ButtonType.lkas: + if be.pressed: + if not should_record_audio: + if params.get_bool("RecordAudioFeedback"): + should_record_audio = True + block_num = 0 + waiting_for_release = False + early_stop_triggered = False + cloudlog.info("LKAS button pressed - starting 10-second audio feedback") + else: + should_send_bookmark = True + cloudlog.info("LKAS button pressed - bookmarking") + elif should_record_audio and not waiting_for_release: + waiting_for_release = True + elif waiting_for_release: + waiting_for_release = False + early_stop_triggered = True + cloudlog.info("LKAS button released - ending recording early") + + if should_record_audio and sm.updated['rawAudioData']: + raw_audio = sm['rawAudioData'] + msg = messaging.new_message('audioFeedback', valid=True) + msg.audioFeedback.audio.data = raw_audio.data + msg.audioFeedback.audio.sampleRate = raw_audio.sampleRate + msg.audioFeedback.blockNum = block_num + block_num += 1 + if (block_num * SAMPLE_BUFFER / SAMPLE_RATE) >= FEEDBACK_MAX_DURATION or early_stop_triggered: + should_send_bookmark = True + should_record_audio = False + early_stop_triggered = False + cloudlog.info("10-second recording completed or second button press - stopping audio feedback") + pm.send('audioFeedback', msg) + + if sm.updated['bookmarkButton']: + cloudlog.info("Bookmark button pressed!") + should_send_bookmark = True + + if should_send_bookmark: + msg = messaging.new_message('userBookmark', valid=True) + pm.send('userBookmark', msg) + + +if __name__ == '__main__': + main() diff --git a/iqpilot/selfdrive/ui/installer/continue_openpilot.sh b/iqpilot/selfdrive/ui/installer/continue_openpilot.sh new file mode 100755 index 000000000..ed41ab6f3 --- /dev/null +++ b/iqpilot/selfdrive/ui/installer/continue_openpilot.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +cd /data/openpilot +exec ./launch_openpilot.sh diff --git a/iqpilot/selfdrive/ui/installer/inter-ascii.ttf b/iqpilot/selfdrive/ui/installer/inter-ascii.ttf new file mode 100644 index 000000000..6ca06dd0c Binary files /dev/null and b/iqpilot/selfdrive/ui/installer/inter-ascii.ttf differ diff --git a/iqpilot/selfdrive/ui/layouts/__init__.py b/iqpilot/selfdrive/ui/layouts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/ui/layouts/home.py b/iqpilot/selfdrive/ui/layouts/home.py new file mode 100644 index 000000000..a150a01a5 --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/home.py @@ -0,0 +1,957 @@ +import time +import os +import pyray as rl +from collections.abc import Callable +from enum import IntEnum +from iqpilot.cereal import log +from iqpilot.common.params import Params +from iqpilot.common.basedir import BASEDIR +from iqpilot.selfdrive.ui.widgets.offroad_alerts import UpdateAlert, OffroadAlert +from iqpilot.selfdrive.ui.widgets.setup import SetupWidget +from iqpilot.selfdrive.ui.widgets.inspire_widget import InspireWidget +from iqpilot.selfdrive.ui.widgets.map_panel_widget import MapPanelWidget +from iqpilot.ui.layouts.settings.drive_history import TripsLayout +from iqpilot.selfdrive.ui.layouts.sidebar import NETWORK_TYPES +from iqpilot.selfdrive.ui.lib.wifi_ssid import current_ssid +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MouseEvent, MousePos +from iqpilot.system.ui.lib.multilang import tr, trn +from iqpilot.system.ui.lib.wrap_text import wrap_text +from iqpilot.system.ui.widgets.label import gui_label, UnifiedLabel +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle + +STATUS_BAR_HEIGHT = 120 +HEAD_BUTTON_FONT_SIZE = 40 +CONTENT_MARGIN = 40 +SPACING = 25 +TILE_GAP = 24 +STATS_PANEL_VERTICAL_INSET = TILE_GAP +REFRESH_INTERVAL = 10.0 +CHANGELOG_REFRESH_INTERVAL = 15.0 +HOLD_THRESHOLD = 0.6 # seconds to trigger the panel picker + +PANEL_KEY = "HomePanelWidget" +PANEL_CHANGELOG = "changelog" +PANEL_STATS = "stats" +PANEL_MAP = "map" +PANEL_INSPIRE = "inspire" + +PICKER_BG = rl.Color(20, 21, 26, 230) +PICKER_CARD = rl.Color(34, 36, 44, 255) +PICKER_CARD_HOVER = rl.Color(48, 51, 60, 255) +PICKER_BORDER = rl.Color(255, 255, 255, 30) +PICKER_TEAL = rl.Color(16, 185, 169, 255) +PICKER_SEL_BORDER = rl.Color(16, 185, 169, 200) + +ThermalStatus = log.DeviceState.ThermalStatus +NetworkType = log.DeviceState.NetworkType + +# Status-light severity colors +STATUS_GOOD = rl.Color(16, 185, 169, 255) # teal +STATUS_WARN = rl.Color(245, 166, 35, 255) # orange +STATUS_DANGER = rl.Color(226, 72, 58, 255) # red + + +class ChangelogWidget(Widget): + PANEL_BG_COLOR = rl.Color(34, 36, 42, 255) + PANEL_BORDER = rl.Color(255, 255, 255, 26) + BODY_COLOR = rl.Color(235, 235, 235, 255) + HEADING_COLOR = rl.Color(255, 255, 255, 255) + + def __init__(self): + super().__init__() + self._show_all = False + self._latest_text = "" + self._all_text = "" + self._render_latest: list[dict] = [] + self._render_all: list[dict] = [] + self._wrap_width = 0 + self._last_load = 0.0 + self._scroll_px = 0.0 + self._max_scroll = 0.0 + self._is_dragging = False + self._drag_last_y = 0.0 + self._text_rect = rl.Rectangle(0, 0, 0, 0) + self._btn_rect = rl.Rectangle(0, 0, 0, 0) + self._latest_btn = Button("Latest", self._show_latest, button_style=ButtonStyle.PRIMARY, font_size=28) + self._all_btn = Button("All", self._show_all_logs, button_style=ButtonStyle.NORMAL, font_size=28) + self._load_changelog(force=True) + + def show_event(self): + self._load_changelog(force=True) + + def _show_latest(self) -> None: + self._show_all = False + self._scroll_px = 0.0 + self._is_dragging = False + + def _show_all_logs(self) -> None: + self._show_all = True + self._scroll_px = 0.0 + self._is_dragging = False + + def _load_changelog(self, force: bool = False) -> None: + now = time.monotonic() + if not force and (now - self._last_load) < CHANGELOG_REFRESH_INTERVAL: + return + self._last_load = now + + paths = [os.path.join(BASEDIR, "iqpilot", "docs", "CHANGELOG.md")] + content = "" + for p in paths: + try: + with open(p, encoding="utf-8") as f: + content = f.read().strip() + if content: + break + except OSError: + pass + + if not content: + content = "No changelog found.\n\nAdd iqpilot/docs/CHANGELOG.md." + + ordered = self._reorder_sections_newest_first(content) + self._latest_text = self._build_latest_text(ordered) + self._all_text = ordered + self._render_latest = [] + self._render_all = [] + self._wrap_width = 0 + + def _reorder_sections_newest_first(self, content: str) -> str: + lines = content.splitlines() + intro: list[str] = [] + sections: list[list[str]] = [] + current: list[str] | None = None + + for line in lines: + if line.startswith("## "): + if current is not None: + sections.append(current) + current = [line] + else: + if current is None: + intro.append(line) + else: + current.append(line) + + if current is not None: + sections.append(current) + + out: list[str] = [] + if intro: + out.extend(intro) + out.append("") + + for i, section in enumerate(reversed(sections)): + out.extend(section) + if i != len(sections) - 1: + out.append("") + + return "\n".join(out).strip() + + def _build_latest_text(self, content: str) -> str: + lines = content.splitlines() + if not lines: + return "No updates available." + + out: list[str] = [] + section_count = 0 + for line in lines: + if line.startswith("## "): + section_count += 1 + if section_count > 2: + break + out.append(line) + return "\n".join(out).strip() or content + + @staticmethod + def _clean_inline_markdown(text: str) -> str: + return text.replace("**", "").replace("`", "").strip() + + def _build_render_lines(self, text: str, width: int) -> list[dict]: + lines: list[dict] = [] + for raw in text.splitlines(): + stripped = raw.strip() + if not stripped: + lines.append({"text": "", "font_size": 16, "font_weight": FontWeight.NORMAL, "indent": 0, "color": self.BODY_COLOR, "height": 18}) + continue + + font_size = 34 + font_weight = FontWeight.NORMAL + indent = 0 + color = self.BODY_COLOR + text_line = stripped + extra_spacing = 0 + + if stripped.startswith("### "): + text_line = self._clean_inline_markdown(stripped[4:]) + font_size = 34 + font_weight = FontWeight.BOLD + color = self.HEADING_COLOR + extra_spacing = 8 + elif stripped.startswith("## "): + text_line = self._clean_inline_markdown(stripped[3:]) + font_size = 38 + font_weight = FontWeight.BOLD + color = self.HEADING_COLOR + extra_spacing = 10 + elif stripped.startswith("# "): + text_line = self._clean_inline_markdown(stripped[2:]) + font_size = 42 + font_weight = FontWeight.BOLD + color = self.HEADING_COLOR + extra_spacing = 12 + elif stripped.startswith(("- ", "* ")): + text_line = "â€ĸ " + self._clean_inline_markdown(stripped[2:]) + font_size = 34 + indent = 8 + else: + text_line = self._clean_inline_markdown(stripped) + + font = gui_app.font(font_weight) + wrapped = wrap_text(font, text_line, font_size, max(50, width - indent)) + if not wrapped: + wrapped = [text_line] + + for i, w in enumerate(wrapped): + line_indent = indent if i == 0 else indent + 18 + line_h = int(font_size * 1.15) + lines.append({ + "text": w, + "font_size": font_size, + "font_weight": font_weight, + "indent": line_indent, + "color": color, + "height": line_h, + }) + + if extra_spacing > 0: + lines.append({"text": "", "font_size": extra_spacing, "font_weight": FontWeight.NORMAL, "indent": 0, "color": self.BODY_COLOR, "height": extra_spacing}) + + return lines + + def _ensure_wrapped(self, text_w: int): + if text_w <= 0: + return + if self._wrap_width == text_w and self._render_latest and self._render_all: + return + self._wrap_width = text_w + self._render_latest = self._build_render_lines(self._latest_text, text_w) + self._render_all = self._build_render_lines(self._all_text, text_w) + + @staticmethod + def _total_height(lines: list[dict]) -> int: + return sum(line["height"] for line in lines) + + def _clamp_scroll(self): + self._scroll_px = max(0.0, min(self._max_scroll, self._scroll_px)) + + def _handle_mouse_press(self, mouse_pos: MousePos): + if rl.check_collision_point_rec(mouse_pos, self._text_rect): + self._is_dragging = True + self._drag_last_y = mouse_pos.y + + def _handle_mouse_event(self, mouse_event): + if not self._is_dragging or not mouse_event.left_down: + return + dy = mouse_event.pos.y - self._drag_last_y + self._drag_last_y = mouse_event.pos.y + self._scroll_px -= dy + self._clamp_scroll() + + def _handle_mouse_release(self, mouse_pos: MousePos): + self._is_dragging = False + + def _render(self, rect: rl.Rectangle): + self._load_changelog() + rl.draw_rectangle_rounded(rect, 0.06, 24, self.PANEL_BG_COLOR) + rl.draw_rectangle_rounded_lines_ex(rect, 0.06, 24, 2, self.PANEL_BORDER) + + title_rect = rl.Rectangle(rect.x + 36, rect.y + 24, rect.width - 72, 50) + gui_label(title_rect, "Latest Updates", 44, rl.WHITE, font_weight=FontWeight.BOLD, alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT) + + btn_w = 150 + btn_h = 54 + btn_gap = 12 + self._btn_rect = rl.Rectangle(rect.x + rect.width - (btn_w * 2) - btn_gap - 36, rect.y + 84, (btn_w * 2) + btn_gap, btn_h) + latest_rect = rl.Rectangle(self._btn_rect.x, self._btn_rect.y, btn_w, btn_h) + all_rect = rl.Rectangle(self._btn_rect.x + btn_w + btn_gap, self._btn_rect.y, btn_w, btn_h) + + self._latest_btn.set_button_style(ButtonStyle.PRIMARY if not self._show_all else ButtonStyle.NORMAL) + self._all_btn.set_button_style(ButtonStyle.PRIMARY if self._show_all else ButtonStyle.NORMAL) + self._latest_btn.render(latest_rect) + self._all_btn.render(all_rect) + + self._text_rect = rl.Rectangle(rect.x + 36, rect.y + 154, rect.width - 72, rect.height - 182) + self._ensure_wrapped(int(self._text_rect.width)) + + lines = self._render_all if self._show_all else self._render_latest + total_h = self._total_height(lines) + self._max_scroll = max(0.0, total_h - self._text_rect.height) + self._clamp_scroll() + + # Clip content region and draw formatted lines + rl.begin_scissor_mode(int(self._text_rect.x), int(self._text_rect.y), int(self._text_rect.width), int(self._text_rect.height)) + y = self._text_rect.y - self._scroll_px + for line in lines: + line_h = line["height"] + if line["text"] and (y + line_h) >= self._text_rect.y and y <= (self._text_rect.y + self._text_rect.height): + font = gui_app.font(line["font_weight"]) + x = self._text_rect.x + line["indent"] + rl.draw_text_ex(font, line["text"], rl.Vector2(x, y), line["font_size"], 0, line["color"]) + y += line_h + rl.end_scissor_mode() + + if self._max_scroll > 0.0: + hint = "Drag to scroll" + hint_size = measure_text_cached(gui_app.font(FontWeight.NORMAL), hint, 24) + hint_x = self._text_rect.x + self._text_rect.width - hint_size.x + hint_y = rect.y + rect.height - 12 - hint_size.y + rl.draw_text_ex(gui_app.font(FontWeight.NORMAL), hint, rl.Vector2(hint_x, hint_y), 24, 0, rl.Color(180, 180, 180, 220)) + + +def _format_updater_description(description: str | None) -> str: + brand = "IQ.Pilot" + if not description: + return brand + + cleaned = description.strip() + lower = cleaned.lower() + if lower.startswith("iqpilot"): + cleaned = cleaned[len("iqpilot"):].lstrip(" -:/") + + if cleaned.lower().startswith(brand.lower()): + return cleaned + return f"{brand} {cleaned}" if cleaned else brand + + +class LauncherTile(Widget): + """A large offroad launcher tile: teal-gradient icon over a dark rounded card, label beneath.""" + + BG = rl.Color(34, 36, 42, 255) + BG_PRESSED = rl.Color(50, 53, 61, 255) + BORDER = rl.Color(255, 255, 255, 26) + + def __init__(self, icon_path: str, label: str | Callable[[], str], on_click: Callable[[], None] | None = None): + super().__init__() + self._label = label + self._icon_path = icon_path + self._icon = gui_app.texture(icon_path, 256, 256, keep_aspect_ratio=True) + if on_click is not None: + self.set_click_callback(on_click) + + def set_label(self, label: str | Callable[[], str]) -> None: + self._label = label + + def set_icon_path(self, icon_path: str) -> None: + if icon_path != self._icon_path: + self._icon_path = icon_path + self._icon = gui_app.texture(icon_path, 256, 256, keep_aspect_ratio=True) + + def _render(self, rect: rl.Rectangle): + pressed = self.is_pressed + rl.draw_rectangle_rounded(rect, 0.16, 24, self.BG_PRESSED if pressed else self.BG) + rl.draw_rectangle_rounded_lines_ex(rect, 0.16, 24, 2, self.BORDER) + + # Icon centered in the upper portion of the tile + icon_size = min(rect.width, rect.height) * 0.44 + cx = rect.x + rect.width / 2 + cy = rect.y + rect.height * 0.40 + icon_dst = rl.Rectangle(cx - icon_size / 2, cy - icon_size / 2, icon_size, icon_size) + src = rl.Rectangle(0, 0, self._icon.width, self._icon.height) + rl.draw_texture_pro(self._icon, src, icon_dst, rl.Vector2(0, 0), 0, rl.WHITE) + + # Label, centered beneath the icon + font = gui_app.font(FontWeight.MEDIUM) + label_size = 48 + label = self._label() if callable(self._label) else self._label + ts = measure_text_cached(font, label, label_size) + label_x = rect.x + (rect.width - ts.x) / 2 + label_y = rect.y + rect.height * 0.75 + rl.draw_text_ex(font, label, rl.Vector2(int(label_x), int(label_y)), label_size, 0, rl.WHITE) + + +class HomeLayoutState(IntEnum): + HOME = 0 + UPDATE = 1 + ALERTS = 2 + + +class HomeLayout(Widget): + def __init__(self): + super().__init__() + self.params = Params() + + self.update_alert = UpdateAlert() + self.offroad_alert = OffroadAlert() + + self._layout_widgets = {HomeLayoutState.UPDATE: self.update_alert, HomeLayoutState.ALERTS: self.offroad_alert} + + self.current_state = HomeLayoutState.HOME + self.last_refresh = 0 + self.settings_callback: Callable[[], None] | None = None + self.stats_callback: Callable[[], None] | None = None + self.nav_callback: Callable[[], None] | None = None + self.routes_callback: Callable[[], None] | None = None + + self.update_available = False + self.alert_count = 0 + self._version_text = "" + self._version_commit_text = "" + self._status_version_label = UnifiedLabel("", font_size=44, font_weight=FontWeight.MEDIUM, + text_color=rl.Color(185, 185, 190, 255), + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + wrap_text=False, scroll=True) + self._prev_update_available = False + self._prev_alerts_present = False + + # Status-bar state + self._status_color = STATUS_GOOD + self._status_word = tr("READY") + self._expanded = False + self._expanded_metrics: list[tuple[str, str, rl.Color]] = [] + self._net_type = NETWORK_TYPES.get(NetworkType.none) + self._on_wifi = False + self._battery_pct: int | None = None + self._battery_charging = False + + self.status_bar_rect = rl.Rectangle(0, 0, 0, 0) + self.content_rect = rl.Rectangle(0, 0, 0, 0) + self.left_column_rect = rl.Rectangle(0, 0, 0, 0) + self.right_column_rect = rl.Rectangle(0, 0, 0, 0) + self._tile_rects: list[rl.Rectangle] = [] + + self.update_notif_rect = rl.Rectangle(0, 0, 200, 60) + self.alert_notif_rect = rl.Rectangle(0, 0, 220, 60) + + self._setup_widget = SetupWidget() + self._changelog_widget = ChangelogWidget() + self._inspire_widget = InspireWidget() + self._map_panel_widget = MapPanelWidget() + self._stats_panel_widget = TripsLayout() + + # Right-panel widget selection + saved = self.params.get(PANEL_KEY) or "" + self._panel_widget = saved if saved in (PANEL_CHANGELOG, PANEL_STATS, PANEL_MAP, PANEL_INSPIRE) else PANEL_CHANGELOG + + # Hold-to-pick + self._press_start: float | None = None + self._press_origin: tuple[float, float] = (0.0, 0.0) + self._press_scrolled = False # True once the current press moved — don't restart timer + self._show_picker = False + self._picker_hover: str | None = None + self._picker_ignore_release = False # swallow the release that opened the picker + + # Status-bar icons (white, tinted at draw time) + self._icon_wifi = gui_app.texture("icons/iq/wifi.png", 64, 64, keep_aspect_ratio=True) + self._icon_battery = gui_app.texture("icons/iq/battery.png", 72, 72, keep_aspect_ratio=True) + + _net_base = "icons_mici/settings/network/" + self._cell_strength_icons = [ + gui_app.texture(f"{_net_base}cell_strength_none.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_low.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_low.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_medium.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_high.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_full.png", 64, 64, keep_aspect_ratio=True), + ] + # wifi has no "high" variant: none/low/medium/full only + self._wifi_strength_icons = [ + gui_app.texture(f"{_net_base}wifi_strength_none.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_low.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_low.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_medium.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_full.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_full.png", 64, 64, keep_aspect_ratio=True), + ] + self._net_strength = 0 + + # Launcher tiles + self._tiles = [ + LauncherTile("icons/iq/tile_settings.png", lambda: tr("Settings"), self._on_settings_tile), + LauncherTile("icons/iq/tile_stats.png", lambda: tr("Stats"), self._on_stats_tile), + LauncherTile("icons/iq/tile_nav.png", lambda: tr("Navigation"), self._on_nav_tile), + LauncherTile("icons/iq/tile_routes.png", lambda: tr("Routes"), self._on_routes_tile), + ] + + self._setup_callbacks() + + def show_event(self): + self._changelog_widget.show_event() + self.last_refresh = time.monotonic() + self._refresh() + + def _setup_callbacks(self): + self.update_alert.set_dismiss_callback(lambda: self._set_state(HomeLayoutState.HOME)) + self.offroad_alert.set_dismiss_callback(lambda: self._set_state(HomeLayoutState.HOME)) + + def set_settings_callback(self, callback: Callable): + self.settings_callback = callback + + def set_stats_callback(self, callback: Callable): + self.stats_callback = callback + + def set_nav_callback(self, callback: Callable): + self.nav_callback = callback + + def set_routes_callback(self, callback: Callable): + self.routes_callback = callback + + # Tile actions + def _on_settings_tile(self): + if self.settings_callback: + self.settings_callback() + + def _on_stats_tile(self): + if self.stats_callback: + self.stats_callback() + + def _on_nav_tile(self): + if self.nav_callback: + self.nav_callback() + + def _on_routes_tile(self): + if self.routes_callback: + self.routes_callback() + + def _set_state(self, state: HomeLayoutState): + # propagate show/hide events + if state != self.current_state: + if state in self._layout_widgets: + self._layout_widgets[state].show_event() + if self.current_state in self._layout_widgets: + self._layout_widgets[self.current_state].hide_event() + + self.current_state = state + + def _render(self, rect: rl.Rectangle): + current_time = time.monotonic() + if current_time - self.last_refresh >= REFRESH_INTERVAL: + self._refresh() + self.last_refresh = current_time + + self._render_status_bar() + + if self.current_state == HomeLayoutState.HOME: + self._render_home_content() + elif self.current_state == HomeLayoutState.UPDATE: + self.update_alert.render(self.content_rect) + elif self.current_state == HomeLayoutState.ALERTS: + self.offroad_alert.render(self.content_rect) + + def _update_state(self): + self.status_bar_rect = rl.Rectangle( + self._rect.x + CONTENT_MARGIN, self._rect.y + CONTENT_MARGIN, + self._rect.width - 2 * CONTENT_MARGIN, STATUS_BAR_HEIGHT + ) + + content_y = self._rect.y + CONTENT_MARGIN + STATUS_BAR_HEIGHT + SPACING + content_height = self._rect.height - CONTENT_MARGIN - STATUS_BAR_HEIGHT - SPACING - CONTENT_MARGIN + self.content_rect = rl.Rectangle( + self._rect.x + CONTENT_MARGIN, content_y, self._rect.width - 2 * CONTENT_MARGIN, content_height + ) + + right_width = min(820, self.content_rect.width * 0.46) + left_width = self.content_rect.width - right_width - SPACING + self.left_column_rect = rl.Rectangle(self.content_rect.x, self.content_rect.y, left_width, self.content_rect.height) + self.right_column_rect = rl.Rectangle( + self.content_rect.x + left_width + SPACING, self.content_rect.y, right_width, self.content_rect.height + ) + + # 2x2 tile grid + tile_w = (self.left_column_rect.width - TILE_GAP) / 2 + tile_h = (self.left_column_rect.height - TILE_GAP) / 2 + self._tile_rects = [] + for i in range(4): + col = i % 2 + row = i // 2 + tx = self.left_column_rect.x + col * (tile_w + TILE_GAP) + ty = self.left_column_rect.y + row * (tile_h + TILE_GAP) + self._tile_rects.append(rl.Rectangle(tx, ty, tile_w, tile_h)) + + self._update_status_info() + self._update_hold() + + def _clear_panel_hold(self): + self._press_start = None + self._press_scrolled = False + + def _update_hold(self): + if not ui_state.prime_state.is_paired() or self._show_picker: + self._clear_panel_hold() + return + if self._press_start is None or self._press_scrolled: + return + if time.monotonic() - self._press_start >= HOLD_THRESHOLD: + self._show_picker = True + self._press_start = None + self._picker_ignore_release = True + + def _update_status_info(self): + # Read the expanded-status toggle every frame (not gated by deviceState updates) + self._expanded = self.params.get_bool("IQExpandedStatus") + + sm = ui_state.sm + # Network + battery — updated from cached state every frame so values are never stale + _ds_cached = sm['deviceState'] + self._net_type = NETWORK_TYPES.get(_ds_cached.networkType.raw, self._net_type) + self._on_wifi = _ds_cached.networkType.raw in (NetworkType.wifi, NetworkType.ethernet) + _strength = _ds_cached.networkStrength + self._net_strength = max(0, min(5, _strength.raw + 1)) if _strength.raw > 0 else 0 + if sm.updated['deviceState']: + ds = sm['deviceState'] + # Battery (not present on all hardware/messages) + try: + self._battery_pct = int(ds.batteryPercent) + self._battery_charging = bool(ds.batteryStatus == "Charging") + except (AttributeError, ValueError): + self._battery_pct = None + + # Status pill — computed every frame from cached state so it's always current. + # severity: 1 = warning (orange), 2 = error (red). No issues -> READY (teal). + _ds = sm['deviceState'] + issues: list[tuple[int, str]] = [] + + _ts = _ds.thermalStatus + if _ts == ThermalStatus.red: + issues.append((2, tr("TEMP HIGH"))) + elif _ts == ThermalStatus.yellow: + issues.append((1, tr("TEMP OK"))) + + if ui_state.panda_type == log.PandaState.PandaType.unknown: + issues.append((2, tr("UNAVAILABLE"))) + + _last_ping = _ds.lastAthenaPingTime + if _last_ping == 0: + issues.append((1, tr("KONN3KT OFFLINE"))) + elif time.monotonic_ns() - _last_ping >= 80_000_000_000: + issues.append((2, tr("KONN3KT ERROR"))) + + if issues: + severity, word = max(issues, key=lambda i: i[0]) + else: + severity, word = 0, tr("READY") + + self._status_color = (STATUS_GOOD, STATUS_WARN, STATUS_DANGER)[severity] + self._status_word = word + + # Expanded status (classic-UI style) — rebuilt every frame from cached state + if self._expanded: + ds = sm['deviceState'] + ts = ds.thermalStatus + if ts == ThermalStatus.green: + temp = (tr("TEMP"), tr("GOOD"), STATUS_GOOD) + elif ts == ThermalStatus.yellow: + temp = (tr("TEMP"), tr("OK"), STATUS_WARN) + else: + temp = (tr("TEMP"), tr("HIGH"), STATUS_DANGER) + if ui_state.panda_type == log.PandaState.PandaType.unknown: + veh = (tr("VEHICLE"), tr("NO PANDA"), STATUS_DANGER) + else: + veh = (tr("VEHICLE"), tr("ONLINE"), STATUS_GOOD) + last_ping = ds.lastAthenaPingTime + if last_ping == 0: + kon = (tr("KONN3KT"), tr("OFFLINE"), STATUS_WARN) + elif time.monotonic_ns() - last_ping < 80_000_000_000: + kon = (tr("KONN3KT"), tr("ONLINE"), STATUS_GOOD) + else: + kon = (tr("KONN3KT"), tr("ERROR"), STATUS_DANGER) + self._expanded_metrics = [temp, veh, kon] + else: + self._expanded_metrics = [] + + def _handle_mouse_press(self, mouse_pos: MousePos): + if (self.current_state == HomeLayoutState.HOME and ui_state.prime_state.is_paired() + and not self._show_picker and rl.check_collision_point_rec(mouse_pos, self.right_column_rect)): + self._press_start = time.monotonic() + self._press_origin = (mouse_pos.x, mouse_pos.y) + self._press_scrolled = False + + def _handle_mouse_event(self, mouse_event: MouseEvent): + if self._press_start is None or self._press_scrolled or not mouse_event.left_down: + return + + dx = mouse_event.pos.x - self._press_origin[0] + dy = mouse_event.pos.y - self._press_origin[1] + if dx * dx + dy * dy > 18 * 18: + self._press_start = None + self._press_scrolled = True + + def _handle_mouse_release(self, mouse_pos: MousePos): + self._clear_panel_hold() + + if self._show_picker: + if self._picker_ignore_release: + self._picker_ignore_release = False + return + if self._picker_hover is not None: + self._panel_widget = self._picker_hover + self.params.put(PANEL_KEY, self._panel_widget) + if self._panel_widget == PANEL_INSPIRE: + self._inspire_widget.show_event() + elif self._panel_widget == PANEL_CHANGELOG: + self._changelog_widget.show_event() + self._show_picker = False + self._picker_hover = None + return + + super()._handle_mouse_release(mouse_pos) + + if self.update_available and rl.check_collision_point_rec(mouse_pos, self.update_notif_rect): + self._set_state(HomeLayoutState.UPDATE) + elif self.alert_count > 0 and rl.check_collision_point_rec(mouse_pos, self.alert_notif_rect): + self._set_state(HomeLayoutState.ALERTS) + + def _render_status_bar(self): + rect = self.status_bar_rect + cy = rect.y + rect.height / 2 + font_bold = gui_app.font(FontWeight.BOLD) + font = gui_app.font(FontWeight.MEDIUM) + + word_fs = 50 + text_fs = 44 + pad = 36 + gap = 26 + light_d = 54 # status light region width + + # --- measure the left cluster so we can wrap it in a rounded pill --- + # The summary word (READY / KONN3KT ERROR / ...) duplicates the expanded TEMP/VEHICLE/KONN3KT + # chips, so drop it when expanded — the color-coded status dot still conveys severity. + show_word = not (self._expanded and self._expanded_metrics) + word_w = measure_text_cached(font_bold, self._status_word, word_fs).x if show_word else 0 + net_text = current_ssid(self._on_wifi) or tr(self._net_type) + net_w = measure_text_cached(font, net_text, text_fs).x + _sig_icons = self._wifi_strength_icons if self._on_wifi else self._cell_strength_icons + _icon_signal = _sig_icons[min(self._net_strength, len(_sig_icons) - 1)] + cluster_w = pad + light_d + gap + (word_w + gap if show_word else 0) + _icon_signal.width + 14 + net_w + batt_text = None + if self._battery_pct is not None: + batt_text = f"{self._battery_pct}%" + cluster_w += gap + self._icon_battery.width + 10 + measure_text_cached(font, batt_text, text_fs).x + cluster_w += pad + + pill = rl.Rectangle(rect.x, rect.y, cluster_w, rect.height) + rl.draw_rectangle_rounded(pill, 0.5, 20, rl.Color(28, 30, 36, 255)) + rl.draw_rectangle_rounded_lines_ex(pill, 0.5, 20, 2, rl.Color(255, 255, 255, 28)) + + # status light dot with a faint halo + x = rect.x + pad + halo = rl.Color(self._status_color.r, self._status_color.g, self._status_color.b, 70) + rl.draw_circle(int(x + light_d / 2), int(cy), 32, halo) + rl.draw_circle(int(x + light_d / 2), int(cy), 22, self._status_color) + x += light_d + gap + + # status word (summary) — hidden when the expanded chips already show the breakdown + if show_word: + word_size = measure_text_cached(font_bold, self._status_word, word_fs) + rl.draw_text_ex(font_bold, self._status_word, rl.Vector2(int(x), int(cy - word_size.y / 2)), word_fs, 0, rl.WHITE) + x += word_w + gap + + # network: signal icon (strength-aware) + type + rl.draw_texture(_icon_signal, int(x), int(cy - _icon_signal.height / 2), rl.WHITE) + x += _icon_signal.width + 14 + net_size = measure_text_cached(font, net_text, text_fs) + rl.draw_text_ex(font, net_text, rl.Vector2(int(x), int(cy - net_size.y / 2)), text_fs, 0, rl.Color(215, 215, 215, 255)) + x += net_w + gap + + # battery, if available + if batt_text is not None: + rl.draw_texture(self._icon_battery, int(x), int(cy - self._icon_battery.height / 2), rl.WHITE) + x += self._icon_battery.width + 10 + batt_size = measure_text_cached(font, batt_text, text_fs) + rl.draw_text_ex(font, batt_text, rl.Vector2(int(x), int(cy - batt_size.y / 2)), text_fs, 0, rl.Color(215, 215, 215, 255)) + + right_x = rect.x + rect.width + version_fs = 44 + version_text = self._version_commit_text if self._expanded else self._version_text + version_size = measure_text_cached(font, version_text, version_fs) + version_available = max(1.0, right_x - x - gap) + version_w = min(version_size.x, version_available) + version_rect = rl.Rectangle(right_x - version_w, rect.y, version_w, rect.height) + + # --- expanded status chips (classic-UI style), gated by the Visuals toggle --- + if self._expanded and self._expanded_metrics: + chip_x = rect.x + cluster_w + gap + chip_h = rect.height - 16 + chip_pad = 22 + dot_r = 11 + label_fs = 30 + max_x = version_rect.x - 30 + for label, value, color in self._expanded_metrics: + ctext = f"{label} {value}" + tw = measure_text_cached(font, ctext, label_fs).x + chip_w = chip_pad + dot_r * 2 + 14 + tw + chip_pad + if chip_x + chip_w > max_x: + break + chip = rl.Rectangle(chip_x, rect.y + 8, chip_w, chip_h) + rl.draw_rectangle_rounded(chip, 0.5, 16, rl.Color(28, 30, 36, 255)) + rl.draw_rectangle_rounded_lines_ex(chip, 0.5, 16, 2, rl.Color(255, 255, 255, 22)) + ccx = chip.x + chip_pad + dot_r + rl.draw_circle(int(ccx), int(cy), dot_r, color) + rl.draw_text_ex(font, ctext, rl.Vector2(int(ccx + dot_r + 14), int(cy - label_fs / 2 - 3)), label_fs, 0, rl.WHITE) + chip_x += chip_w + 16 + + # --- right cluster: version (small), then notification chips to its left --- + if version_size.x <= version_rect.width: + rl.draw_text_ex(font, version_text, rl.Vector2(int(right_x - version_size.x), int(cy - version_size.y / 2)), + version_fs, 0, rl.Color(185, 185, 190, 255)) + else: + self._status_version_label.set_text(version_text) + self._status_version_label.render(version_rect) + chip_x = version_rect.x - 30 + + if self.alert_count > 0: + self.alert_notif_rect = rl.Rectangle(chip_x - self.alert_notif_rect.width, cy - 30, self.alert_notif_rect.width, 60) + self._draw_chip(self.alert_notif_rect, trn("{} ALERT", "{} ALERTS", self.alert_count).format(self.alert_count), + rl.Color(226, 72, 58, 255) if self.current_state != HomeLayoutState.ALERTS else rl.Color(245, 92, 78, 255)) + chip_x = self.alert_notif_rect.x - 16 + + if self.update_available: + self.update_notif_rect = rl.Rectangle(chip_x - self.update_notif_rect.width, cy - 30, self.update_notif_rect.width, 60) + self._draw_chip(self.update_notif_rect, tr("UPDATE"), + rl.Color(54, 77, 239, 255) if self.current_state != HomeLayoutState.UPDATE else rl.Color(75, 95, 255, 255)) + + def _draw_chip(self, chip_rect: rl.Rectangle, text: str, color: rl.Color): + rl.draw_rectangle_rounded(chip_rect, 0.4, 10, color) + font = gui_app.font(FontWeight.MEDIUM) + text_size = measure_text_cached(font, text, HEAD_BUTTON_FONT_SIZE) + text_x = chip_rect.x + (chip_rect.width - text_size.x) / 2 + text_y = chip_rect.y + (chip_rect.height - text_size.y) / 2 + rl.draw_text_ex(font, text, rl.Vector2(int(text_x), int(text_y)), HEAD_BUTTON_FONT_SIZE, 0, rl.WHITE) + + def _render_home_content(self): + # left: 2x2 launcher tiles + for tile, tile_rect in zip(self._tiles, self._tile_rects, strict=False): + tile.render(tile_rect) + + # right: setup until paired, then the user-chosen widget + if not ui_state.prime_state.is_paired(): + self._setup_widget.render(self.right_column_rect) + return + + self._render_right_panel() + + if self._show_picker: + self._render_picker() + + def _render_right_panel(self): + rect = self.right_column_rect + if self._panel_widget == PANEL_STATS: + stats_rect = rl.Rectangle( + rect.x, + rect.y + STATS_PANEL_VERTICAL_INSET, + rect.width, + max(1, rect.height - STATS_PANEL_VERTICAL_INSET * 2), + ) + self._stats_panel_widget.render(stats_rect) + elif self._panel_widget == PANEL_MAP: + self._map_panel_widget.render(rect) + elif self._panel_widget == PANEL_INSPIRE: + self._inspire_widget.render(rect) + else: + self._changelog_widget.render(rect) + + # Hold-progress ring drawn over the panel while user is holding + if self._press_start is not None and not self._show_picker: + held = time.monotonic() - self._press_start + progress = min(1.0, held / HOLD_THRESHOLD) + cx = int(rect.x + rect.width / 2) + cy = int(rect.y + rect.height / 2) + rl.draw_ring(rl.Vector2(cx, cy), 34, 42, -90, -90 + 360 * progress, 40, rl.Color(16, 185, 169, 180)) + + def _render_picker(self): + rect = self.right_column_rect + rl.draw_rectangle_rounded(rect, 0.06, 24, PICKER_BG) + + options = [ + (PANEL_CHANGELOG, "Changelog", "Latest updates"), + (PANEL_STATS, "Stats", "Your drive history"), + (PANEL_MAP, "Map", "Last known location"), + (PANEL_INSPIRE, "Inspiration", "Daily message"), + ] + + TITLE_FS = 58 + SUB_FS = 38 + CARD_PAD_V = 36 + CARD_PAD_H = 32 + DOT_MARGIN = 24 + card_h = TITLE_FS + 12 + SUB_FS + CARD_PAD_V * 2 + outer_pad = 20 + gap = 12 + n = len(options) + total_cards_h = n * card_h + (n - 1) * gap + start_y = rect.y + (rect.height - total_cards_h) / 2 + + mp = rl.get_mouse_position() + self._picker_hover = None + + font_title = gui_app.font(FontWeight.BOLD) + font_sub = gui_app.font(FontWeight.MEDIUM) + + for i, (key, title, sub) in enumerate(options): + cy_card = start_y + i * (card_h + gap) + card = rl.Rectangle(rect.x + outer_pad, cy_card, rect.width - outer_pad * 2, card_h) + hovered = rl.check_collision_point_rec(mp, card) + if hovered: + self._picker_hover = key + is_sel = key == self._panel_widget + + bg = PICKER_CARD_HOVER if hovered else PICKER_CARD + rl.draw_rectangle_rounded(card, 0.14, 16, bg) + border = PICKER_SEL_BORDER if is_sel else PICKER_BORDER + rl.draw_rectangle_rounded_lines_ex(card, 0.14, 16, 2 if is_sel else 1, border) + + dot_cx = int(card.x + CARD_PAD_H) + dot_cy = int(card.y + card_h / 2) + if is_sel: + rl.draw_circle(dot_cx, dot_cy, 8, PICKER_TEAL) + else: + rl.draw_circle(dot_cx, dot_cy, 8, rl.Color(255, 255, 255, 35)) + rl.draw_ring(rl.Vector2(dot_cx, dot_cy), 5.5, 8, 0, 360, 24, rl.Color(255, 255, 255, 55)) + + tx = int(card.x + CARD_PAD_H + DOT_MARGIN + 6) + title_y = int(card.y + CARD_PAD_V) + sub_y = int(title_y + TITLE_FS + 8) + title_col = rl.WHITE if is_sel else rl.Color(210, 210, 215, 255) + sub_col = PICKER_TEAL if is_sel else rl.Color(130, 130, 138, 255) + rl.draw_text_ex(font_title, title, rl.Vector2(tx, title_y), TITLE_FS, 0, title_col) + rl.draw_text_ex(font_sub, sub, rl.Vector2(tx, sub_y), SUB_FS, 0, sub_col) + + # Hint centered below the cards + hint = "Tap a widget to switch â€ĸ tap outside to dismiss" + font_hint = gui_app.font(FontWeight.MEDIUM) + hw = measure_text_cached(font_hint, hint, 24).x + hint_y = int(start_y + total_cards_h + 18) + rl.draw_text_ex(font_hint, hint, + rl.Vector2(int(rect.x + (rect.width - hw) / 2), hint_y), + 24, 0, rl.Color(110, 110, 118, 220)) + + def _refresh(self): + self._version_text, self._version_commit_text = self._get_version_texts() + update_available = self.update_alert.refresh() + alert_count = self.offroad_alert.refresh() + alerts_present = alert_count > 0 + + # Show panels on transition from no alert/update to any alerts/update + if not update_available and not alerts_present: + self._set_state(HomeLayoutState.HOME) + elif update_available and ((not self._prev_update_available) or (not alerts_present and self.current_state == HomeLayoutState.ALERTS)): + self._set_state(HomeLayoutState.UPDATE) + elif alerts_present and ((not self._prev_alerts_present) or (not update_available and self.current_state == HomeLayoutState.UPDATE)): + self._set_state(HomeLayoutState.ALERTS) + + self.update_available = update_available + self.alert_count = alert_count + self._prev_update_available = update_available + self._prev_alerts_present = alerts_present + + def _get_version_texts(self) -> tuple[str, str]: + description = self.params.get("UpdaterCurrentDescription") + version_text = _format_updater_description(description) + if description: + parts = [part.strip() for part in description.split(" / ")] + if len(parts) >= 3 and parts[2]: + return version_text, parts[2] + return version_text, version_text diff --git a/iqpilot/selfdrive/ui/layouts/main.py b/iqpilot/selfdrive/ui/layouts/main.py new file mode 100644 index 000000000..9e6bec527 --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/main.py @@ -0,0 +1,484 @@ +import pyray as rl +from dataclasses import dataclass +from enum import Enum, IntEnum, auto +import iqpilot.cereal.messaging as messaging +from iqpilot.system.ui.lib.application import gui_app, MouseEvent +from iqpilot.selfdrive.ui.layouts.sidebar import Sidebar, SIDEBAR_WIDTH +from iqpilot.selfdrive.ui.layouts.home import HomeLayout +from iqpilot.selfdrive.ui.layouts.stats import StatsLayout +from iqpilot.selfdrive.ui.layouts.nav import NavLayout +from iqpilot.selfdrive.ui.layouts.routes import RoutesLayout +from iqpilot.selfdrive.ui.layouts.video_player import VideoPlayerLayout +from iqpilot.selfdrive.ui.layouts.settings_hub import SettingsHubLayout +from iqpilot.selfdrive.ui.layouts.settings.settings import PanelType +from iqpilot.selfdrive.ui.onroad.augmented_road_view import AugmentedRoadView +from iqpilot.selfdrive.ui.ui_state import device, ui_state +from iqpilot.system.ui.widgets import Widget +from iqpilot.selfdrive.ui.layouts.onboarding import OnboardingWindow + + +class MainState(IntEnum): + HOME = 0 + SETTINGS = 1 + ONROAD = 2 + STATS = 3 + NAV = 4 + ROUTES = 5 + VIDEO = 6 + + +OFFROAD_TRANSITION_SECONDS = 0.30 +TRANSITION_SURFACE_OVERSCAN = 4 +TRANSITION_SURFACE_BG = rl.Color(10, 10, 10, 255) + +# iOS-style swipe-from-the-left-edge-to-go-back, generalized across the whole offroad UI (settings +# hub still owns its own panel->grid swipe; this covers the top-level pages). +EDGE_SWIPE_ZONE = 80 # px from the left edge a swipe-back must start within +EDGE_SWIPE_ARM_DISTANCE = 8 # px of rightward movement before we commit to a swipe +EDGE_SWIPE_BLOCK_VERTICAL = 60 # px of vertical movement (under arm distance) that cancels it +EDGE_SWIPE_COMPLETE_FRACTION = 0.3 # fraction of width dragged to complete the pop on release +SWIPE_SETTLE_SECONDS = 0.16 # animate from the release point to done/cancelled (no snap) + + +class MenuTransitionState(Enum): + IDLE = auto() + PUSHING = auto() + POPPING = auto() + + +@dataclass +class MenuTransition: + state: MenuTransitionState = MenuTransitionState.IDLE + t: float = 0.0 + duration: float = OFFROAD_TRANSITION_SECONDS + from_screen: object | None = None + to_screen: object | None = None + + @property + def active(self) -> bool: + return self.state != MenuTransitionState.IDLE + + +def _clamp(x: float, lo: float = 0.0, hi: float = 1.0) -> float: + return max(lo, min(hi, x)) + + +def _lerp(a: float, b: float, t: float) -> float: + return a + (b - a) * t + + +def _ease_out_cubic(x: float) -> float: + x = _clamp(x) + return 1.0 - pow(1.0 - x, 3.0) + + +def _ease_emphasized(x: float) -> float: + # ease-in-out-cubic: gentle acceleration into the slide, graceful deceleration into place + x = _clamp(x) + if x < 0.5: + return 4.0 * x * x * x + return 1.0 - pow(-2.0 * x + 2.0, 3.0) / 2.0 + + +# Depth cues for the page push/pop (iOS-style): the underneath page parallaxes a fraction of the +# way, dims into the background, and the top card casts a soft shadow off its leading edge. +TRANSITION_PARALLAX = 0.28 +TRANSITION_MAX_DIM = 0.5 +TRANSITION_SHADOW_W = 32 + + +class MainLayout(Widget): + def __init__(self): + super().__init__() + + self._pm = messaging.PubMaster(['bookmarkButton']) + + self._sidebar = Sidebar() + # The offroad launcher owns the full screen; the sidebar is reserved for onroad. + self._sidebar.set_visible(False) + self._current_mode = MainState.HOME + self._prev_onroad = False + + # Initialize layouts + self._layouts = { + MainState.HOME: HomeLayout(), + MainState.SETTINGS: SettingsHubLayout(), + MainState.ONROAD: AugmentedRoadView(), + MainState.STATS: StatsLayout(), + MainState.NAV: NavLayout(), + MainState.ROUTES: RoutesLayout(), + MainState.VIDEO: VideoPlayerLayout(), + } + + self._sidebar_rect = rl.Rectangle(0, 0, 0, 0) + self._content_rect = rl.Rectangle(0, 0, 0, 0) + self._transition = MenuTransition() + + # Edge-swipe-back drag state + self._swipe_start_pos = None + self._swipe_active = False + self._swipe_blocked = False + self._swipe_dx = 0.0 + # Release-settle animation (glide to done/cancelled instead of snapping) + self._swipe_settling = False + self._swipe_settle_from = 0.0 + self._swipe_settle_to = 0.0 + self._swipe_settle_t = 0.0 + self._swipe_render_target: MainState | None = None + self._swipe_completing = False + # Set callbacks + self._setup_callbacks() + + self._onboarding_window = OnboardingWindow() + if not self._onboarding_window.completed: + gui_app.set_modal_overlay(self._onboarding_window) + + def _render(self, _): + self._handle_onroad_transition() + self._render_main_content() + + def _setup_callbacks(self): + self._sidebar.set_callbacks(on_settings=self._on_settings_clicked, + on_flag=self._on_bookmark_clicked, + open_settings=lambda: self.open_settings(PanelType.TOGGLES)) + self._layouts[MainState.HOME].set_settings_callback(self.open_settings) + self._layouts[MainState.HOME].set_stats_callback(self.open_stats) + self._layouts[MainState.HOME].set_nav_callback(self.open_nav) + self._layouts[MainState.HOME].set_routes_callback(self.open_routes) + self._layouts[MainState.SETTINGS].set_callbacks(on_close=self._set_mode_for_state) + self._layouts[MainState.STATS].set_on_back(self._set_mode_for_state) + self._layouts[MainState.NAV].set_on_back(self._set_mode_for_state) + self._layouts[MainState.ROUTES].set_on_back(self._set_mode_for_state) + self._layouts[MainState.ROUTES].set_on_play(self.open_video) + self._layouts[MainState.VIDEO].set_on_back(self.open_routes) + self._layouts[MainState.ONROAD].set_click_callback(self._on_onroad_clicked) + device.add_interactive_timeout_callback(self._on_interactive_timeout) + + def _update_layout_rects(self): + self._sidebar_rect = rl.Rectangle(self._rect.x, self._rect.y, SIDEBAR_WIDTH, self._rect.height) + + x_offset = SIDEBAR_WIDTH if self._sidebar.is_visible else 0 + self._content_rect = rl.Rectangle(self._rect.x + x_offset, self._rect.y, self._rect.width - x_offset, self._rect.height) + + def _handle_onroad_transition(self): + if ui_state.started != self._prev_onroad: + self._prev_onroad = ui_state.started + + self._set_mode_for_state() + + def _car_stationary(self) -> bool: + if not ui_state.sm.valid["carState"]: + return False + return ui_state.sm["carState"].vEgo < 0.1 + + def _on_interactive_timeout(self): + # The idle timeout normally returns the UI to the road view. Don't yank the user out of Settings + # while the car is stationary - e.g. a hybrid parked with the engine running to charge reads as + # onroad (ignition tracks the ICE), so this would otherwise make Settings unusable while parked. + # A moving car still returns to the road view. + if self._current_mode == MainState.SETTINGS and ui_state.started and self._car_stationary(): + return + self._set_mode_for_state() + + def _set_mode_for_state(self): + if ui_state.started: + # Don't hide sidebar from interactive timeout + if self._current_mode != MainState.ONROAD: + self._set_sidebar_visible(False) + self._set_current_layout(MainState.ONROAD) + else: + # Offroad launcher owns the full screen; the sidebar is reserved for onroad. + self._set_current_layout(MainState.HOME) + self._set_sidebar_visible(False) + + def _set_current_layout(self, layout: MainState): + if self._transition.active: + if layout == MainState.ONROAD or ui_state.started: + self._cancel_transition() + elif layout == self._current_mode: + self._cancel_transition() + return + else: + return + + if layout == self._current_mode: + return + + old_mode = self._current_mode + if self._should_animate_transition(old_mode, layout): + self._start_transition(old_mode, layout) + return + + self._layouts[old_mode].hide_event() + self._current_mode = layout + self._layouts[self._current_mode].show_event() + + def _should_animate_transition(self, old_mode: MainState, new_mode: MainState) -> bool: + return ( + not ui_state.started + and old_mode != MainState.ONROAD + and new_mode != MainState.ONROAD + and (old_mode == MainState.HOME or new_mode == MainState.HOME) + ) + + def _start_transition(self, old_mode: MainState, new_mode: MainState): + state = MenuTransitionState.PUSHING if old_mode == MainState.HOME else MenuTransitionState.POPPING + self._transition = MenuTransition( + state=state, + t=0.0, + duration=OFFROAD_TRANSITION_SECONDS, + from_screen=old_mode, + to_screen=new_mode, + ) + self._layouts[new_mode].show_event() + + def _cancel_transition(self): + pending_mode = self._transition.to_screen + if pending_mode is not None and pending_mode != self._current_mode: + self._layouts[pending_mode].hide_event() + self._transition = MenuTransition() + + def _finish_transition(self): + old_mode = self._transition.from_screen + new_mode = self._transition.to_screen + if old_mode is not None: + self._layouts[old_mode].hide_event() + if new_mode is not None: + self._current_mode = new_mode + self._transition = MenuTransition() + + def _render_layout(self, layout: Widget, rect: rl.Rectangle, interactive: bool = True): + if interactive: + layout.render(rect) + return + + enabled = layout._enabled + layout.set_enabled(False) + try: + layout.render(rect) + finally: + layout.set_enabled(enabled) + + def _render_layout_surface(self, layout: Widget, rect: rl.Rectangle, interactive: bool = True): + bg_rect = rl.Rectangle( + rect.x - TRANSITION_SURFACE_OVERSCAN, + rect.y - TRANSITION_SURFACE_OVERSCAN, + rect.width + TRANSITION_SURFACE_OVERSCAN * 2, + rect.height + TRANSITION_SURFACE_OVERSCAN * 2, + ) + rl.draw_rectangle_rec(bg_rect, TRANSITION_SURFACE_BG) + self._render_layout(layout, rect, interactive) + + def _render_layout_surface_translated(self, layout: Widget, rect: rl.Rectangle, x_offset: float): + translated_rect = rl.Rectangle(round(rect.x + x_offset), rect.y, rect.width, rect.height) + self._render_layout_surface(layout, translated_rect, interactive=False) + + def _render_transition(self, content_rect: rl.Rectangle) -> bool: + if not self._transition.active: + return False + + from_mode = self._transition.from_screen + to_mode = self._transition.to_screen + if from_mode is None or to_mode is None: + self._finish_transition() + return False + + self._transition.t += rl.get_frame_time() + if self._transition.t >= self._transition.duration: + self._finish_transition() + return False + + p = _clamp(self._transition.t / self._transition.duration) + e = _ease_emphasized(p) + w = content_rect.width + pushing = self._transition.state == MenuTransitionState.PUSHING + + # The incoming card slides its full width on top; the other page parallaxes a fraction and dims. + if pushing: + top_mode, back_mode = to_mode, from_mode + top_x = _lerp(w, 0.0, e) + back_x = _lerp(0.0, -w * TRANSITION_PARALLAX, e) + back_dim = int(_lerp(0.0, TRANSITION_MAX_DIM, e) * 255) + else: + top_mode, back_mode = from_mode, to_mode + top_x = _lerp(0.0, w, e) + back_x = _lerp(-w * TRANSITION_PARALLAX, 0.0, e) + back_dim = int(_lerp(TRANSITION_MAX_DIM, 0.0, e) * 255) + + back_rect = rl.Rectangle(round(content_rect.x + back_x), content_rect.y, content_rect.width, content_rect.height) + + rl.draw_rectangle_rec(content_rect, TRANSITION_SURFACE_BG) + self._render_layout_surface_translated(self._layouts[back_mode], content_rect, back_x) + if back_dim > 0: + rl.draw_rectangle_rec(back_rect, rl.Color(0, 0, 0, back_dim)) + # soft shadow cast by the top card's leading edge onto the page behind + edge_x = round(content_rect.x + top_x) + if edge_x > content_rect.x: + sh = int(min(TRANSITION_SHADOW_W, edge_x - content_rect.x)) + rl.draw_rectangle_gradient_h(edge_x - sh, int(content_rect.y), sh, int(content_rect.height), + rl.Color(0, 0, 0, 0), rl.Color(0, 0, 0, 120)) + self._render_layout_surface_translated(self._layouts[top_mode], content_rect, top_x) + return True + + def open_settings(self, panel_type: PanelType | None = None): + self._set_current_layout(MainState.SETTINGS) + if panel_type is None: + self._layouts[MainState.SETTINGS].show_grid() + else: + self._layouts[MainState.SETTINGS].set_current_panel(panel_type) + self._set_sidebar_visible(False) + + def open_stats(self): + self._set_current_layout(MainState.STATS) + self._set_sidebar_visible(False) + + def open_nav(self): + self._set_current_layout(MainState.NAV) + self._set_sidebar_visible(False) + + def open_routes(self): + self._set_current_layout(MainState.ROUTES) + self._set_sidebar_visible(False) + + def open_video(self, route: str): + self._layouts[MainState.VIDEO].set_route(route) + self._set_current_layout(MainState.VIDEO) + self._set_sidebar_visible(False) + + def _on_settings_clicked(self): + self.open_settings() + + def _on_bookmark_clicked(self): + user_bookmark = messaging.new_message('bookmarkButton') + user_bookmark.valid = True + self._pm.send('bookmarkButton', user_bookmark) + + def _set_sidebar_visible(self, visible: bool): + self._sidebar.set_visible(visible) + self._update_layout_rects() + + def _on_onroad_clicked(self): + self._set_sidebar_visible(not self._sidebar.is_visible) + + def _back_target(self) -> MainState | None: + """The page an edge-swipe-back should return to, or None if there's nowhere to go back.""" + if ui_state.started: + return None + mode = self._current_mode + if mode == MainState.VIDEO: + return MainState.ROUTES + if mode in (MainState.SETTINGS, MainState.STATS, MainState.NAV, MainState.ROUTES): + # The settings hub owns its own panel->grid swipe; only take over once it's back at the grid. + if mode == MainState.SETTINGS and getattr(self._layouts[MainState.SETTINGS], "_mode", "grid") == "panel": + return None + return MainState.HOME + return None + + def _reset_swipe(self): + self._swipe_start_pos = None + self._swipe_active = False + self._swipe_blocked = False + self._swipe_dx = 0.0 + + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + super()._handle_mouse_event(mouse_event) + + if self._swipe_settling: + return # let the release animation finish before accepting a new gesture + + if mouse_event.slot != 0 or self._transition.active or self._back_target() is None: + self._reset_swipe() + return + + if mouse_event.left_pressed: + if mouse_event.pos.x - self._rect.x <= EDGE_SWIPE_ZONE: + self._swipe_start_pos = mouse_event.pos + self._swipe_active = False + self._swipe_blocked = False + self._swipe_dx = 0.0 + else: + self._reset_swipe() + + elif self._swipe_start_pos is not None: + if mouse_event.left_down: + dx = mouse_event.pos.x - self._swipe_start_pos.x + dy = abs(mouse_event.pos.y - self._swipe_start_pos.y) + if not self._swipe_active and not self._swipe_blocked: + if dy > EDGE_SWIPE_BLOCK_VERTICAL and dy > dx: + self._swipe_blocked = True # user is scrolling, not swiping back + elif dx > EDGE_SWIPE_ARM_DISTANCE: + self._swipe_active = True + if self._swipe_active: + self._swipe_dx = max(0.0, dx) + + elif mouse_event.left_released: + if self._swipe_active: + target = self._back_target() + complete = target is not None and self._swipe_dx > self._rect.width * EDGE_SWIPE_COMPLETE_FRACTION + self._begin_swipe_settle(target, complete) + self._reset_swipe() + + def _complete_back(self, target: MainState): + # The finger already dragged the page most of the way across, so switch instantly (matching the + # settings hub's swipe) rather than replaying the eased transition. + old_mode = self._current_mode + if old_mode == target: + return + self._layouts[old_mode].hide_event() + self._current_mode = target + self._layouts[target].show_event() + + def _begin_swipe_settle(self, target: MainState | None, complete: bool): + # On release, glide from where the finger let go to fully-open (complete) or closed (cancel) + # instead of snapping. Needs a back page to slide behind; if there's none, just drop the drag. + if target is None: + return + self._swipe_settle_from = self._swipe_dx + self._swipe_settle_to = self._rect.width if complete else 0.0 + self._swipe_render_target = target + self._swipe_completing = complete + self._swipe_settle_t = 0.0 + self._swipe_settling = True + + def _update_swipe_settle(self) -> bool: + """Advance the release animation. Returns True while still animating.""" + self._swipe_settle_t += rl.get_frame_time() + p = _clamp(self._swipe_settle_t / SWIPE_SETTLE_SECONDS) + self._swipe_dx = _lerp(self._swipe_settle_from, self._swipe_settle_to, _ease_out_cubic(p)) + if p < 1.0: + return True + self._swipe_settling = False + target, completing = self._swipe_render_target, self._swipe_completing + self._swipe_render_target = None + self._swipe_completing = False + self._swipe_dx = 0.0 + if completing and target is not None: + self._complete_back(target) + return False + + def _render_swipe_drag(self, rect: rl.Rectangle, target: MainState): + # Live finger-following pop: the destination sits behind, the current page slides out right. + dx = min(self._swipe_dx, rect.width) + rl.draw_rectangle_rec(rect, TRANSITION_SURFACE_BG) + self._render_layout_surface_translated(self._layouts[target], rect, dx - rect.width) + self._render_layout_surface_translated(self._layouts[self._current_mode], rect, dx) + + def _render_main_content(self): + # Render sidebar (onroad only) + if self._sidebar.is_visible: + self._sidebar.render(self._sidebar_rect) + + content_rect = self._content_rect if self._sidebar.is_visible else self._rect + if self._render_transition(content_rect): + return + if self._swipe_settling: + if self._update_swipe_settle(): + self._render_swipe_drag(content_rect, self._swipe_render_target) + return + # settled this frame; fall through to render the (possibly switched) current page + elif self._swipe_active: + target = self._back_target() + if target is not None: + self._render_swipe_drag(content_rect, target) + return + self._layouts[self._current_mode].render(content_rect) diff --git a/iqpilot/selfdrive/ui/layouts/nav.py b/iqpilot/selfdrive/ui/layouts/nav.py new file mode 100644 index 000000000..810af849a --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/nav.py @@ -0,0 +1,562 @@ +import threading +import time +import pyray as rl +from collections.abc import Callable + +import requests + +from iqpilot.common.params import Params +from iqpilot.selfdrive.ui.lib.nav_helpers import (has_mapbox_token, resolve_mapbox_token, + current_or_last_gps_position) +from iqpilot.ui.onroad.nav_map_panel import NavMapPanel +from iqpilot.ui.onroad.nav_map_utils import build_mapbox_static_url +from iqpilot.selfdrive.ui.widgets.screen_header import ScreenHeader, HEADER_HEIGHT +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos, GL_VERSION +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.keyboard import Keyboard +from iqpilot.selfdrive.ui.lib import nav_search +from iqpilot.selfdrive.ui.lib.nav_search import NavSearch, SearchResult +from iqpilot.selfdrive.ui.widgets.interactive_map import InteractiveNavMap + +MARGIN = 40 +SPACING = 25 +SEARCH_HEIGHT = 120 +PILL_HEIGHT = 120 +MAP_ZOOM = 15.0 +MAP_RETRY_INTERVAL = 5.0 + +PANEL_BG = rl.Color(38, 40, 46, 255) +PANEL_BORDER = rl.Color(255, 255, 255, 38) +MUTED = rl.Color(165, 165, 170, 255) + +ROUNDED_TEXTURE_VERTEX_SHADER = GL_VERSION + """ +in vec3 vertexPosition; +in vec2 vertexTexCoord; +uniform mat4 mvp; +out vec2 fragTexCoord; + +void main() { + fragTexCoord = vertexTexCoord; + gl_Position = mvp * vec4(vertexPosition, 1.0); +} +""" + +ROUNDED_TEXTURE_FRAGMENT_SHADER = GL_VERSION + """ +in vec2 fragTexCoord; +uniform sampler2D texture0; +uniform vec4 clipRect; +uniform float cornerRadius; +uniform float viewportHeight; +out vec4 fragColor; + +float roundedRectDistance(vec2 p, vec2 center, vec2 halfSize, float radius) { + vec2 d = abs(p - center) - (halfSize - vec2(radius)); + return length(max(d, vec2(0.0))) + min(max(d.x, d.y), 0.0) - radius; +} + +void main() { + vec2 p = vec2(gl_FragCoord.x, viewportHeight - gl_FragCoord.y); + vec2 center = clipRect.xy + clipRect.zw * 0.5; + vec2 halfSize = clipRect.zw * 0.5; + float radius = min(cornerRadius, min(halfSize.x, halfSize.y)); + float dist = roundedRectDistance(p, center, halfSize, radius); + float alpha = 1.0 - smoothstep(0.0, 1.25, dist); + vec4 sampled = texture(texture0, fragTexCoord); + fragColor = vec4(sampled.rgb, sampled.a * alpha); +} +""" + + +class _MapPreview: + """Fetches a Mapbox static map (background thread) and caches it as a texture.""" + + def __init__(self): + self._params = Params() + self._session = requests.Session() + self._texture: rl.Texture | None = None + self._pending: tuple[tuple, bytes] | None = None + self._fetching = False + self._key: tuple | None = None + self._status = "idle" + self._last_attempt = 0.0 + self._rounded_shader = None + self._rounded_shader_locs: dict[str, int] = {} + self._clip_rect = rl.ffi.new("float[]", [0.0, 0.0, 0.0, 0.0]) + self._corner_radius = rl.ffi.new("float[]", [0.0]) + self._viewport_height = rl.ffi.new("float[]", [0.0]) + + def has_token(self) -> bool: + return has_mapbox_token(self._params) + + def _fetch(self, url: str, token: str, key: tuple): + try: + r = self._session.get(url, params={"access_token": token}, timeout=4.0) + if r.status_code == 200 and r.content: + self._pending = (key, r.content) + self._status = "ready" + else: + self._key = None + self._status = "error" + except requests.RequestException: + self._key = None + self._status = "error" + finally: + self._fetching = False + + def request(self, lat: float, lon: float, bearing: float, w: float, h: float): + token = resolve_mapbox_token(self._params) + if not token or w < 20 or h < 20: + self._status = "token_missing" if not token else "idle" + return + key = (round(lat, 4), round(lon, 4)) + if self._fetching or key == self._key: + return + now = time.monotonic() + if self._status == "error" and now - self._last_attempt < MAP_RETRY_INTERVAL: + return + self._last_attempt = now + self._key = key + self._fetching = True + self._status = "loading" + scale = min(1.0, 1000.0 / max(w, h)) + url = build_mapbox_static_url(lat, lon, MAP_ZOOM, bearing, max(1, int(w * scale)), max(1, int(h * scale))) + threading.Thread(target=self._fetch, args=(url, token, key), daemon=True).start() + + def _consume(self): + if self._pending is None: + return + _key, data = self._pending + self._pending = None + try: + ext = ".png" if data[:4] == b"\x89PNG" else ".jpg" + img = rl.load_image_from_memory(ext, data, len(data)) + tex = rl.load_texture_from_image(img) + rl.unload_image(img) + rl.set_texture_filter(tex, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + if self._texture is not None: + rl.unload_texture(self._texture) + self._texture = tex + except Exception: + pass + + def _ensure_rounded_shader(self): + if self._rounded_shader is not None: + return + self._rounded_shader = rl.load_shader_from_memory(ROUNDED_TEXTURE_VERTEX_SHADER, ROUNDED_TEXTURE_FRAGMENT_SHADER) + self._rounded_shader_locs = { + "clipRect": rl.get_shader_location(self._rounded_shader, "clipRect"), + "cornerRadius": rl.get_shader_location(self._rounded_shader, "cornerRadius"), + "viewportHeight": rl.get_shader_location(self._rounded_shader, "viewportHeight"), + } + + def _draw_texture(self, src: rl.Rectangle, rect: rl.Rectangle, roundness: float): + if roundness <= 0: + rl.draw_texture_pro(self._texture, src, rect, rl.Vector2(0, 0), 0, rl.WHITE) + return + + self._ensure_rounded_shader() + self._clip_rect[0:4] = [rect.x, rect.y, rect.width, rect.height] + self._corner_radius[0] = max(0.0, min(rect.width, rect.height) * roundness * 0.5) + self._viewport_height[0] = gui_app.height + rl.set_shader_value( + self._rounded_shader, + self._rounded_shader_locs["clipRect"], + self._clip_rect, + rl.ShaderUniformDataType.SHADER_UNIFORM_VEC4, + ) + rl.set_shader_value( + self._rounded_shader, + self._rounded_shader_locs["cornerRadius"], + self._corner_radius, + rl.ShaderUniformDataType.SHADER_UNIFORM_FLOAT, + ) + rl.set_shader_value( + self._rounded_shader, + self._rounded_shader_locs["viewportHeight"], + self._viewport_height, + rl.ShaderUniformDataType.SHADER_UNIFORM_FLOAT, + ) + + rl.begin_shader_mode(self._rounded_shader) + rl.draw_texture_pro(self._texture, src, rect, rl.Vector2(0, 0), 0, rl.WHITE) + rl.end_shader_mode() + + def draw(self, rect: rl.Rectangle, roundness: float = 0.0) -> bool: + self._consume() + if self._texture is None or self._texture.id == 0: + return False + rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height)) + src = rl.Rectangle(0, 0, self._texture.width, self._texture.height) + self._draw_texture(src, rect, roundness) + rl.end_scissor_mode() + return True + + def status(self) -> str: + if self._fetching: + return "loading" + return self._status + + +class _Pill(Widget): + """A rounded destination shortcut: icon + label (Home / Work / Recent).""" + + BG = rl.Color(38, 40, 46, 255) + BG_PRESSED = rl.Color(54, 57, 65, 255) + + def __init__(self, icon_path: str, label: str, on_click: Callable[[], None] | None = None): + super().__init__() + self._label = label + self._icon = gui_app.texture(icon_path, 56, 56, keep_aspect_ratio=True) + if on_click is not None: + self.set_click_callback(on_click) + + def _render(self, rect: rl.Rectangle): + rl.draw_rectangle_rounded(rect, 0.5, 20, self.BG_PRESSED if self.is_pressed else self.BG) + rl.draw_rectangle_rounded_lines_ex(rect, 0.5, 20, 2, PANEL_BORDER) + cy = rect.y + rect.height / 2 + x = rect.x + 32 + rl.draw_texture(self._icon, int(x), int(cy - self._icon.height / 2), rl.WHITE) + x += self._icon.width + 20 + font = gui_app.font(FontWeight.MEDIUM) + ts = measure_text_cached(font, self._label, 40) + rl.draw_text_ex(font, self._label, rl.Vector2(int(x), int(cy - ts.y / 2)), 40, 0, rl.WHITE) + + +ROW_HEIGHT = 116 +ROW_GAP = 16 +RESULT_NAME = rl.Color(240, 240, 244, 255) +SEARCH_DEBOUNCE = 0.25 + + +class NavLayout(Widget): + """Offroad Navigate screen: destination search with live Mapbox autocomplete, Home/Work/Recent + shortcuts, and a location map preview. Picking a place writes NavigationDestination (navd routes).""" + + def __init__(self): + super().__init__() + self._header = self._child(ScreenHeader(lambda: tr("Navigation"))) + self._search_icon = gui_app.texture("icons/iq/search.png", 52, 52, keep_aspect_ratio=True) + self._pin_icon = gui_app.texture("icons/iq/pin.png", 90, 90, keep_aspect_ratio=True) + self._home_icon = gui_app.texture("icons/iq/home.png", 52, 52, keep_aspect_ratio=True) + self._work_icon = gui_app.texture("icons/iq/work.png", 52, 52, keep_aspect_ratio=True) + self._recent_icon = gui_app.texture("icons/iq/recent.png", 52, 52, keep_aspect_ratio=True) + + self._keyboard = Keyboard(max_text_size=128, min_text_size=0) + self._map = _MapPreview() + self._imap = self._child(InteractiveNavMap()) + self._search = NavSearch() + + self._on_back_cb: Callable[[], None] | None = None + self._mode = "browse" # "browse" | "results" + self._purpose = "navigate" # "navigate" | "set_home" | "set_work" + self._query = "" + self._selecting = False + self._status_ts = 0.0 + self._pending_exit = False + self._status_msg = "" + + self._home: SearchResult | None = None + self._work: SearchResult | None = None + self._recents: list[SearchResult] = [] + + self._tap_targets: list[tuple[rl.Rectangle, Callable[[], None]]] = [] + self._reload_favorites() + + def _reload_favorites(self): + self._home = nav_search.get_home() + self._work = nav_search.get_work() + self._recents = nav_search.get_recents() + + def set_on_back(self, cb: Callable[[], None]) -> None: + self._on_back_cb = cb + self._header.set_on_back(self._handle_back) + + def show_event(self): + super().show_event() + self._mode = "browse" + self._status_msg = "" + self._reload_favorites() + + def hide_event(self): + super().hide_event() + # Free the tile cache's GPU memory while the screen is away. + self._imap.release() + + def _handle_back(self): + if self._mode == "results": + self._exit_search() + elif self._on_back_cb is not None: + self._on_back_cb() + + # --- search lifecycle ------------------------------------------------------- + def _open_search(self, purpose: str = "navigate"): + # Full-screen modal keyboard (same as before) — search runs when you hit Done. + self._purpose = purpose + self._search.new_session() + self._keyboard.reset(min_text_size=1) + title = {"set_home": tr("Set Home"), "set_work": tr("Set Work")}.get(purpose, tr("Search")) + self._keyboard.set_title(title, tr("Enter an address or place")) + self._keyboard.set_text(self._query if purpose == "navigate" else "") + gui_app.set_modal_overlay(self._keyboard, callback=self._on_search_done) + + def _on_search_done(self, result: int): + if result != 1: + return + self._query = self._keyboard.text.strip() + if not self._query: + return + self._search.search(self._query) + self._mode = "results" + self._status_msg = "" + self._selecting = False + + def _exit_search(self): + self._mode = "browse" + self._selecting = False + self._status_msg = "" + self._reload_favorites() + + # --- selection (threaded: retrieve coords, then persist) -------------------- + def _select_result(self, r: SearchResult): + if self._selecting: + return + self._selecting = True + self._status_msg = tr("Locating...") + threading.Thread(target=self._finish_select, args=(r, self._purpose), daemon=True).start() + + def _finish_select(self, r: SearchResult, purpose: str): + full = self._search.retrieve(r) + if full is None or not full.has_coords: + self._status_msg = tr("Couldn't locate that place") + self._selecting = False + return + if purpose == "set_home": + nav_search.save_home(full) + elif purpose == "set_work": + nav_search.save_work(full) + else: + nav_search.set_destination(full.lat, full.lon, full.name) + nav_search.add_recent(full) + self._selecting = False + self._pending_exit = True + + def _navigate_place(self, place: SearchResult): + if place is not None and place.has_coords: + nav_search.set_destination(place.lat, place.lon, place.name) + nav_search.add_recent(place) + self._reload_favorites() + self._dest_check_time = 0.0 + self._set_status(tr("Destination set")) + + def _set_status(self, msg: str): + self._status_msg = msg + self._status_ts = time.monotonic() + + def _cancel_nav(self): + nav_search.cancel_navigation() + self._dest_check_time = 0.0 + self._set_status(tr("Navigation canceled")) + + def _remove_home(self): + nav_search.remove_home() + self._reload_favorites() + + def _remove_work(self): + nav_search.remove_work() + self._reload_favorites() + + def _remove_recent(self, r: SearchResult): + nav_search.remove_recent(r) + self._reload_favorites() + + def _on_home(self): + self._navigate_place(self._home) if self._home is not None else self._open_search("set_home") + + def _on_work(self): + self._navigate_place(self._work) if self._work is not None else self._open_search("set_work") + + # --- render ----------------------------------------------------------------- + def _render(self, rect: rl.Rectangle): + self._tap_targets = [] + if self._pending_exit: + self._pending_exit = False + self._exit_search() + header_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - 2 * MARGIN, HEADER_HEIGHT) + self._header.render(header_rect) + body = rl.Rectangle(rect.x + MARGIN, header_rect.y + HEADER_HEIGHT + SPACING, + rect.width - 2 * MARGIN, rect.y + rect.height - (header_rect.y + HEADER_HEIGHT + SPACING) - MARGIN) + if self._mode == "results": + self._render_results(body) + else: + self._render_browse(body) + + def _row(self, rect: rl.Rectangle, icon, title: str, subtitle: str, on_tap, on_delete=None, pressed_hint=True): + hit = rl.check_collision_point_rec(rl.get_mouse_position(), rect) + bg = rl.Color(54, 57, 65, 255) if (hit and pressed_hint and rl.is_mouse_button_down(0)) else PANEL_BG + rl.draw_rectangle_rounded(rect, 0.35, 20, bg) + rl.draw_rectangle_rounded_lines_ex(rect, 0.35, 20, 2, PANEL_BORDER) + x = rect.x + 32 + if icon is not None: + rl.draw_texture(icon, int(x), int(rect.y + rect.height / 2 - icon.height / 2), rl.WHITE) + x += icon.width + 24 + text_w = rect.width - (x - rect.x) - (110 if on_delete is not None else 32) + font = gui_app.font(FontWeight.MEDIUM) + if subtitle: + rl.draw_text_ex(font, title, rl.Vector2(int(x), int(rect.y + 22)), 40, 0, RESULT_NAME) + sub = self._ellipsize(font, subtitle, 30, text_w) + rl.draw_text_ex(font, sub, rl.Vector2(int(x), int(rect.y + 66)), 30, 0, MUTED) + else: + ts = measure_text_cached(font, title, 42) + rl.draw_text_ex(font, title, rl.Vector2(int(x), int(rect.y + rect.height / 2 - ts.y / 2)), 42, 0, RESULT_NAME) + # Delete (×) button — appended first so a tap on it wins over the row's navigate tap. + if on_delete is not None: + cx, cy = rect.x + rect.width - 60, rect.y + rect.height / 2 + del_r = rl.Rectangle(cx - 34, cy - 34, 68, 68) + dhit = rl.check_collision_point_rec(rl.get_mouse_position(), del_r) + rl.draw_circle(int(cx), int(cy), 30, rl.Color(90, 62, 66, 255) if dhit else rl.Color(60, 62, 70, 255)) + rl.draw_line_ex(rl.Vector2(cx - 13, cy - 13), rl.Vector2(cx + 13, cy + 13), 4, rl.Color(230, 120, 120, 255)) + rl.draw_line_ex(rl.Vector2(cx - 13, cy + 13), rl.Vector2(cx + 13, cy - 13), 4, rl.Color(230, 120, 120, 255)) + self._tap_targets.append((del_r, on_delete)) + if on_tap is not None: + self._tap_targets.append((rect, on_tap)) + + @staticmethod + def _ellipsize(font, text: str, size: int, max_w: float) -> str: + if measure_text_cached(font, text, size).x <= max_w: + return text + while text and measure_text_cached(font, text + "â€Ļ", size).x > max_w: + text = text[:-1] + return text + "â€Ļ" + + def _render_browse(self, rect: rl.Rectangle): + font = gui_app.font(FontWeight.MEDIUM) + x, w = rect.x, rect.width + y = rect.y + # Search bar + bar = rl.Rectangle(x, y, w, SEARCH_HEIGHT) + rl.draw_rectangle_rounded(bar, 0.4, 20, PANEL_BG) + rl.draw_rectangle_rounded_lines_ex(bar, 0.4, 20, 2, PANEL_BORDER) + cy = bar.y + bar.height / 2 + rl.draw_texture(self._search_icon, int(bar.x + 36), int(cy - self._search_icon.height / 2), MUTED) + ph = tr("Search address or place") + rl.draw_text_ex(font, ph, rl.Vector2(int(bar.x + 36 + self._search_icon.width + 24), + int(cy - 22)), 44, 0, MUTED) + self._tap_targets.append((bar, lambda: self._open_search("navigate"))) + y += SEARCH_HEIGHT + SPACING + + # Cancel active route (param read throttled) + now = time.monotonic() + if now - getattr(self, "_dest_check_time", 0.0) > 1.0: + self._has_dest = nav_search.has_active_destination() + self._dest_check_time = now + if getattr(self, "_has_dest", False): + cr = rl.Rectangle(x, y, w, ROW_HEIGHT) + chit = rl.check_collision_point_rec(rl.get_mouse_position(), cr) + rl.draw_rectangle_rounded(cr, 0.35, 20, rl.Color(96, 46, 48, 255) if chit else rl.Color(74, 40, 42, 255)) + rl.draw_rectangle_rounded_lines_ex(cr, 0.35, 20, 2, rl.Color(210, 90, 90, 120)) + label = tr("Cancel navigation") + ls = measure_text_cached(font, label, 42) + rl.draw_text_ex(font, label, rl.Vector2(int(x + 32), int(cr.y + cr.height / 2 - ls.y / 2)), 42, 0, + rl.Color(240, 180, 180, 255)) + self._tap_targets.append((cr, self._cancel_nav)) + y += ROW_HEIGHT + SPACING + + # Home / Work + hw_gap = ROW_GAP + hw_w = (w - hw_gap) / 2 + self._row(rl.Rectangle(x, y, hw_w, ROW_HEIGHT), self._home_icon, tr("Home"), + self._home.address if self._home else tr("Set home address"), self._on_home, + on_delete=(self._remove_home if self._home else None)) + self._row(rl.Rectangle(x + hw_w + hw_gap, y, hw_w, ROW_HEIGHT), self._work_icon, tr("Work"), + self._work.address if self._work else tr("Set work address"), self._on_work, + on_delete=(self._remove_work if self._work else None)) + y += ROW_HEIGHT + SPACING + + # Recents (fit as many as room allows, leaving space for the map) + map_min = 300 + for r in self._recents: + if y + ROW_HEIGHT > rect.y + rect.height - map_min - SPACING: + break + self._row(rl.Rectangle(x, y, w, ROW_HEIGHT), self._recent_icon, r.name, r.address, + (lambda r=r: self._navigate_place(r)), on_delete=(lambda r=r: self._remove_recent(r))) + y += ROW_HEIGHT + ROW_GAP + + # Map preview of current location + map_rect = rl.Rectangle(x, y, w, rect.y + rect.height - y) + if map_rect.height > 120: + self._imap.render(map_rect) + if self._status_msg and time.monotonic() - self._status_ts < 2.5: + self._draw_toast(map_rect, self._status_msg) + + def _draw_toast(self, area: rl.Rectangle, text: str): + font = gui_app.font(FontWeight.MEDIUM) + ts = measure_text_cached(font, text, 36) + pad = 32 + pw = ts.x + pad * 2 + pill = rl.Rectangle(area.x + (area.width - pw) / 2, area.y + 24, pw, 66) + rl.draw_rectangle_rounded(pill, 0.5, 20, rl.Color(20, 22, 26, 235)) + rl.draw_rectangle_rounded_lines_ex(pill, 0.5, 20, 2, PANEL_BORDER) + rl.draw_text_ex(font, text, rl.Vector2(int(pill.x + pad), int(pill.y + 33 - ts.y / 2)), 36, 0, rl.WHITE) + + def _render_map(self, rect: rl.Rectangle): + lat, lon, bearing, fix = current_or_last_gps_position() + if fix and self._map.has_token: + self._map.request(lat, lon, 0.0, rect.width, rect.height) + if self._map.draw(rect, roundness=0.03): + # The static map is centered on the fix, so the current location is the panel center. + cx, cy = int(rect.x + rect.width / 2), int(rect.y + rect.height / 2) + rl.draw_circle(cx, cy, 26, rl.Color(255, 255, 255, 235)) + rl.draw_circle(cx, cy, 18, rl.Color(23, 134, 246, 255)) # blue location dot + return + rl.draw_rectangle_rounded(rect, 0.03, 20, rl.Color(18, 18, 20, 255)) + rl.draw_rectangle_rounded_lines_ex(rect, 0.03, 20, 2, PANEL_BORDER) + pin_x = int(rect.x + (rect.width - self._pin_icon.width) / 2) + rl.draw_texture(self._pin_icon, pin_x, int(rect.y + rect.height / 2 - self._pin_icon.height), MUTED) + self._draw_center_note(rect, tr("Waiting for GPS fix..."), dy=16) + + def _draw_center_note(self, rect: rl.Rectangle, text: str, dy: float = 0): + font = gui_app.font(FontWeight.MEDIUM) + ns = measure_text_cached(font, text, 40) + rl.draw_text_ex(font, text, rl.Vector2(int(rect.x + (rect.width - ns.x) / 2), + int(rect.y + rect.height / 2 + dy)), 40, 0, MUTED) + + def _render_results(self, rect: rl.Rectangle): + font = gui_app.font(FontWeight.MEDIUM) + x, w = rect.x, rect.width + y = rect.y + # Query bar — tap to reopen the keyboard and refine the search. + bar = rl.Rectangle(x, y, w, SEARCH_HEIGHT) + rl.draw_rectangle_rounded(bar, 0.4, 20, PANEL_BG) + rl.draw_rectangle_rounded_lines_ex(bar, 0.4, 20, 2, PANEL_BORDER) + cy = bar.y + bar.height / 2 + rl.draw_texture(self._search_icon, int(bar.x + 36), int(cy - self._search_icon.height / 2), MUTED) + rl.draw_text_ex(font, self._query or tr("Search"), + rl.Vector2(int(bar.x + 36 + self._search_icon.width + 24), int(cy - 22)), 44, 0, rl.WHITE) + self._tap_targets.append((bar, lambda: self._open_search(self._purpose))) + y += SEARCH_HEIGHT + SPACING + + list_rect = rl.Rectangle(x, y, w, rect.y + rect.height - y) + results = self._search.results() + if self._selecting: + self._draw_center_note(list_rect, self._status_msg or tr("Locating...")) + return + if not results: + note = tr("Searching...") if self._search.searching else (self._status_msg or tr("No results")) + self._draw_center_note(list_rect, note) + return + for r in results: + if y + ROW_HEIGHT > list_rect.y + list_rect.height: + break + dist = f"{r.distance_m / 1609.34:.1f} mi" if r.distance_m else "" + sub = f"{r.address} ¡ {dist}" if dist else r.address + self._row(rl.Rectangle(x, y, w, ROW_HEIGHT), self._pin_icon, r.name, sub, + (lambda r=r: self._select_result(r))) + y += ROW_HEIGHT + ROW_GAP + + def _handle_mouse_release(self, mouse_pos: MousePos): + for rect, cb in self._tap_targets: + if rl.check_collision_point_rec(mouse_pos, rect): + cb() + return diff --git a/iqpilot/selfdrive/ui/layouts/onboarding.py b/iqpilot/selfdrive/ui/layouts/onboarding.py new file mode 100644 index 000000000..4468f2837 --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/onboarding.py @@ -0,0 +1,113 @@ +from enum import IntEnum + +import pyray as rl +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.widgets.label import Label +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.version import terms_version + +DEBUG = False + + +class OnboardingState(IntEnum): + TERMS = 0 + DECLINE = 1 + + +class TermsPage(Widget): + def __init__(self, on_accept=None, on_decline=None): + super().__init__() + self._on_accept = on_accept + self._on_decline = on_decline + + self._title = Label(tr("Welcome to IQ.Pilot"), font_size=90, font_weight=FontWeight.BOLD, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT) + self._desc = Label(tr("You must accept the Terms of Service to use IQ.Pilot. Read the latest terms before continuing at https://iqlvbs.com/tos."), + font_size=90, font_weight=FontWeight.MEDIUM, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT) + + self._decline_btn = Button(tr("Decline"), click_callback=on_decline) + self._accept_btn = Button(tr("Agree"), button_style=ButtonStyle.PRIMARY, click_callback=on_accept) + + def _render(self, _): + welcome_x = self._rect.x + 95 + welcome_y = self._rect.y + 165 + welcome_rect = rl.Rectangle(welcome_x, welcome_y, self._rect.width - welcome_x, 90) + self._title.render(welcome_rect) + + desc_x = welcome_x + # TODO: Label doesn't top align when wrapping + desc_y = welcome_y - 100 + desc_rect = rl.Rectangle(desc_x, desc_y, self._rect.width - desc_x, self._rect.height - desc_y - 250) + self._desc.render(desc_rect) + + btn_y = self._rect.y + self._rect.height - 160 - 45 + btn_width = (self._rect.width - 45 * 3) / 2 + self._decline_btn.render(rl.Rectangle(self._rect.x + 45, btn_y, btn_width, 160)) + self._accept_btn.render(rl.Rectangle(self._rect.x + 45 * 2 + btn_width, btn_y, btn_width, 160)) + + if DEBUG: + rl.draw_rectangle_lines_ex(welcome_rect, 3, rl.RED) + rl.draw_rectangle_lines_ex(desc_rect, 3, rl.RED) + + return -1 + + +class DeclinePage(Widget): + def __init__(self, back_callback=None): + super().__init__() + self._text = Label(tr("You must accept the Terms of Service in order to use IQ.Pilot."), + font_size=90, font_weight=FontWeight.MEDIUM, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT) + self._back_btn = Button(tr("Back"), click_callback=back_callback) + self._uninstall_btn = Button(tr("Decline, uninstall IQ.Pilot"), button_style=ButtonStyle.DANGER, + click_callback=self._on_uninstall_clicked) + + def _on_uninstall_clicked(self): + ui_state.params.put_bool("DoUninstall", True) + gui_app.request_close() + + def _render(self, _): + btn_y = self._rect.y + self._rect.height - 160 - 45 + btn_width = (self._rect.width - 45 * 3) / 2 + self._back_btn.render(rl.Rectangle(self._rect.x + 45, btn_y, btn_width, 160)) + self._uninstall_btn.render(rl.Rectangle(self._rect.x + 45 * 2 + btn_width, btn_y, btn_width, 160)) + + # text rect in middle of top and button + text_height = btn_y - (200 + 45) + text_rect = rl.Rectangle(self._rect.x + 165, self._rect.y + (btn_y - text_height) / 2 + 10, self._rect.width - (165 * 2), text_height) + if DEBUG: + rl.draw_rectangle_lines_ex(text_rect, 3, rl.RED) + self._text.render(text_rect) + + +class OnboardingWindow(Widget): + def __init__(self): + super().__init__() + self._accepted_terms: bool = ui_state.params.get("HasAcceptedTerms") == terms_version + self._state = OnboardingState.TERMS + + self._terms = TermsPage(on_accept=self._on_terms_accepted, on_decline=self._on_terms_declined) + self._decline_page = DeclinePage(back_callback=self._on_decline_back) + + @property + def completed(self) -> bool: + return self._accepted_terms + + def _on_terms_declined(self): + self._state = OnboardingState.DECLINE + + def _on_decline_back(self): + self._state = OnboardingState.TERMS + + def _on_terms_accepted(self): + ui_state.params.put("HasAcceptedTerms", terms_version) + self._accepted_terms = True + gui_app.set_modal_overlay(None) + + def _render(self, _): + if self._state == OnboardingState.TERMS: + self._terms.render(self._rect) + elif self._state == OnboardingState.DECLINE: + self._decline_page.render(self._rect) + return -1 diff --git a/iqpilot/selfdrive/ui/layouts/routes.py b/iqpilot/selfdrive/ui/layouts/routes.py new file mode 100644 index 000000000..273ccef3b --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/routes.py @@ -0,0 +1,194 @@ +import threading +import pyray as rl +from collections.abc import Callable + +from iqpilot.selfdrive.ui.widgets.screen_header import ScreenHeader, HEADER_HEIGHT +from iqpilot.selfdrive.ui.lib.local_routes import list_local_routes, CAMERA_LABELS, format_local_time +from iqpilot.selfdrive.ui.lib import cloud_routes_shim as cloud +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.scroll_panel import GuiScrollPanel +from iqpilot.system.ui.widgets import Widget + +MARGIN = 40 +SPACING = 25 +ROW_HEIGHT = 156 +ROW_GAP = 22 +BTN_SIZE = 120 + +ROW_BG = rl.Color(38, 40, 46, 255) +ROW_BORDER = rl.Color(255, 255, 255, 26) +PLAY_BG = rl.Color(16, 185, 169, 255) +SUBTEXT = rl.Color(158, 162, 170, 255) + +# Upload-status badge colors. +BADGE_UPLOADED = rl.Color(16, 185, 129, 255) +BADGE_UPLOADING = rl.Color(234, 179, 8, 255) +BADGE_CLOUD = rl.Color(96, 132, 214, 255) +BADGE_LOCAL = rl.Color(90, 96, 108, 255) +BADGE_TEXT = rl.Color(10, 14, 18, 255) + + +class RoutesLayout(Widget): + """Offroad Routes screen: local recorded routes + konn3kt cloud upload status / cloud-only routes.""" + + def __init__(self): + super().__init__() + self._header = self._child(ScreenHeader(lambda: tr("Routes"))) + self._play_icon = gui_app.texture("icons/iq/play.png", 56, 56, keep_aspect_ratio=True) + self._on_play: Callable[[str], None] | None = None + self._scroll_panel = GuiScrollPanel() + self._entries: list = [] + self._row_hitboxes: list[tuple[rl.Rectangle, object]] = [] + self._cloud_thread: threading.Thread | None = None + self._cloud_generation = 0 + + def set_on_back(self, cb: Callable[[], None]) -> None: + self._header.set_on_back(cb) + + def set_on_play(self, cb: Callable[[str], None]) -> None: + self._on_play = cb + + def show_event(self): + super().show_event() + local_routes = list_local_routes() + # Show local routes immediately, then fold in cloud upload status / cloud-only routes async. + self._entries = cloud.merge_routes(local_routes, []) + self._start_cloud_fetch(local_routes) + + def _start_cloud_fetch(self, local_routes: list) -> None: + if not cloud.cloud_available(): + return + self._cloud_generation += 1 + generation = self._cloud_generation + + def _worker(): + dongle_id = cloud.get_dongle_id() + cloud_routes = cloud.list_cloud_routes(dongle_id) if dongle_id else [] + if generation == self._cloud_generation: + self._entries = cloud.merge_routes(local_routes, cloud_routes) + + self._cloud_thread = threading.Thread(target=_worker, daemon=True) + self._cloud_thread.start() + + @staticmethod + def _entry_title(entry) -> str: + if entry.local is not None: + return entry.local.label + if entry.cloud is not None and entry.cloud.start_time > 0: + return format_local_time(entry.cloud.start_time) + return entry.name + + @staticmethod + def _fmt_duration(seconds: float) -> str: + s = max(0, int(round(seconds))) + h, rem = divmod(s, 3600) + m, sec = divmod(rem, 60) + return f"{h}h {m:02d}m" if h else f"{m}:{sec:02d}" + + def _entry_subtitle_parts(self, entry) -> list[str]: + if entry.local is not None: + parts = [self._fmt_duration(entry.local.duration_s)] + cams = ", ".join(CAMERA_LABELS.get(c, c).replace(" Cam", "") for c in entry.local.cameras) + if cams: + parts.append(cams) + return parts + if entry.cloud is not None: + parts = [] + if entry.cloud.length_miles > 0: + parts.append(f"{entry.cloud.length_miles:.1f} mi") + parts.append(tr("Cloud only")) + return parts + return [] + + @staticmethod + def _draw_dotted(font, parts: list[str], x: float, y: float, size: int, color) -> None: + cx = x + for i, part in enumerate(parts): + if i > 0: + cx += 10 + rl.draw_circle(int(cx), int(y + size / 2), 3, rl.Color(color.r, color.g, color.b, 150)) + cx += 16 + rl.draw_text_ex(font, part, rl.Vector2(int(cx), int(y)), size, 0, color) + cx += measure_text_cached(font, part, size).x + + def _render(self, rect: rl.Rectangle): + header_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - 2 * MARGIN, HEADER_HEIGHT) + self._header.render(header_rect) + + x = rect.x + MARGIN + w = rect.width - 2 * MARGIN + list_top = header_rect.y + HEADER_HEIGHT + SPACING + list_rect = rl.Rectangle(x, list_top, w, rect.y + rect.height - list_top - MARGIN) + + self._row_hitboxes = [] + font = gui_app.font(FontWeight.MEDIUM) + if not self._entries: + note = tr("No routes recorded") + ns = measure_text_cached(font, note, 44) + rl.draw_text_ex(font, note, rl.Vector2(int(rect.x + (rect.width - ns.x) / 2), int(list_top + 80)), 44, 0, + rl.Color(150, 150, 155, 255)) + return + + row_stride = ROW_HEIGHT + ROW_GAP + content_rect = rl.Rectangle(list_rect.x, list_rect.y, list_rect.width, len(self._entries) * row_stride) + offset = self._scroll_panel.update(list_rect, content_rect) + + rl.begin_scissor_mode(int(list_rect.x), int(list_rect.y), int(list_rect.width), int(list_rect.height)) + for i, entry in enumerate(self._entries): + ry = list_rect.y + i * row_stride + offset + row = rl.Rectangle(x, ry, w, ROW_HEIGHT) + if not rl.check_collision_recs(row, list_rect): + continue + + rl.draw_rectangle_rounded(row, 0.3, 20, ROW_BG) + rl.draw_rectangle_rounded_lines_ex(row, 0.3, 20, 2, ROW_BORDER) + + title_size = 46 + subtitle_size = 30 + title = self._entry_title(entry) + subtitle_parts = self._entry_subtitle_parts(entry) + title_ts = measure_text_cached(font, title, title_size) + text_y = ry + (ROW_HEIGHT - title_ts.y - subtitle_size - 10) / 2 + rl.draw_text_ex(font, title, rl.Vector2(int(x + 40), int(text_y)), title_size, 0, rl.WHITE) + self._draw_dotted(font, subtitle_parts, x + 40, text_y + title_ts.y + 10, subtitle_size, SUBTEXT) + + cy = ry + ROW_HEIGHT / 2 + self._draw_status_badge(entry, x + w - 40 - BTN_SIZE - 24, cy, font) + + play_rect = rl.Rectangle(x + w - 40 - BTN_SIZE, cy - BTN_SIZE / 2, BTN_SIZE, BTN_SIZE) + rl.draw_circle(int(play_rect.x + BTN_SIZE / 2), int(cy), BTN_SIZE / 2, PLAY_BG) + rl.draw_texture(self._play_icon, int(play_rect.x + (BTN_SIZE - self._play_icon.width) / 2 + 4), + int(cy - self._play_icon.height / 2), rl.Color(8, 16, 16, 255)) + + self._row_hitboxes.append((play_rect, entry)) + rl.end_scissor_mode() + + def _draw_status_badge(self, entry, right_x: float, cy: float, font) -> None: + if entry.is_local and entry.upload_state == cloud.UPLOAD_UPLOADED: + label, color = tr("Uploaded"), BADGE_UPLOADED + elif entry.is_local and entry.upload_state == cloud.UPLOAD_UPLOADING: + label, color = tr("Uploading"), BADGE_UPLOADING + elif not entry.is_local and entry.is_cloud: + label, color = tr("Cloud"), BADGE_CLOUD + elif entry.is_local: + label, color = tr("On device"), BADGE_LOCAL + else: + return + + fs = 24 + pad = 18 + tw = measure_text_cached(font, label, fs).x + pad * 2 + badge = rl.Rectangle(right_x - tw, cy - 20, tw, 40) + rl.draw_rectangle_rounded(badge, 0.5, 12, color) + rl.draw_text_ex(font, label, rl.Vector2(int(badge.x + pad), int(cy - fs / 2)), fs, 0, BADGE_TEXT) + + def _handle_mouse_release(self, mouse_pos: MousePos): + if not self._scroll_panel.is_touch_valid(): + return + for play_rect, entry in self._row_hitboxes: + if rl.check_collision_point_rec(mouse_pos, play_rect): + if self._on_play: + self._on_play(entry.name) + return diff --git a/iqpilot/selfdrive/ui/layouts/settings/common.py b/iqpilot/selfdrive/ui/layouts/settings/common.py new file mode 100644 index 000000000..c70fb5ff7 --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/settings/common.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.selfdrive.ui.ui_state import ui_state + + +def restart_needed_callback(_=None): + ui_state.params.put_bool("OnroadCycleRequested", True) diff --git a/iqpilot/selfdrive/ui/layouts/settings/developer.py b/iqpilot/selfdrive/ui/layouts/settings/developer.py new file mode 100644 index 000000000..14e1c3d5f --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/settings/developer.py @@ -0,0 +1,155 @@ +from iqpilot.common.params import Params +from iqpilot.selfdrive.ui.widgets.ssh_key import ssh_key_item +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.hardware.tici.usb_storage import apply_usb_storage_state +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.list_view import toggle_item +from iqpilot.system.ui.widgets.scroller_tici import Scroller +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.multilang import tr, tr_noop + +if gui_app.iqpilot_ui(): + from iqpilot.system.ui.iqwidgets.widgets.list_view import toggle_item + +# Description constants +DESCRIPTIONS = { + 'enable_adb': tr_noop( + "ADB (Android Debug Bridge) allows connecting to your device over USB or over the network." + ), + 'ssh_key': tr_noop( + "Warning: This grants SSH access to all public keys in your GitHub settings. Never enter a GitHub username " + + "other than your own. An IQ.Pilot employee will NEVER ask you to add their GitHub username." + ), + 'usb_storage': tr_noop( + "Exposes a snapshot of recent dashcam clips and logs as a USB drive when connected to a computer. " + + "IQ.Pilot keeps running while this is enabled." + ), + 'long_maneuver': tr_noop( + "Commands a scripted sequence of acceleration steps to measure longitudinal actuator response. " + + "Requires IQ.Pilot longitudinal control. Only use on a clear, closed road." + ), + 'lat_maneuver': tr_noop( + "Commands a scripted sequence of lateral acceleration steps to measure steering actuator response. " + + "Only use on a straight, flat, clear road." + ), +} + + +class DeveloperLayout(Widget): + def __init__(self): + super().__init__() + self._params = Params() + self._is_release = self._params.get_bool("IsReleaseBranch") + + # Build items and keep references for callbacks/state updates + self._adb_toggle = toggle_item( + lambda: tr("Enable ADB"), + description=lambda: tr(DESCRIPTIONS["enable_adb"]), + initial_state=self._params.get_bool("AdbEnabled"), + callback=self._on_enable_adb, + enabled=ui_state.is_offroad, + ) + + self._usb_storage_toggle = toggle_item( + lambda: tr("USB Storage"), + description=lambda: tr(DESCRIPTIONS["usb_storage"]), + initial_state=self._params.get_bool("UsbStorageEnabled"), + callback=self._on_enable_usb_storage, + enabled=ui_state.is_offroad, + ) + + # SSH enable toggle + SSH key management + self._ssh_toggle = toggle_item( + lambda: tr("Enable SSH"), + description="", + initial_state=self._params.get_bool("SshEnabled"), + callback=self._on_enable_ssh, + ) + self._ssh_keys = ssh_key_item(lambda: tr("SSH Keys"), description=lambda: tr(DESCRIPTIONS["ssh_key"])) + + self._long_maneuver_toggle = toggle_item( + lambda: tr("Longitudinal Maneuver Mode"), + description=lambda: tr(DESCRIPTIONS["long_maneuver"]), + initial_state=self._params.get_bool("LongitudinalManeuverMode"), + callback=self._on_long_maneuver_mode, + ) + + self._lat_maneuver_toggle = toggle_item( + lambda: tr("Lateral Maneuver Mode"), + description=lambda: tr(DESCRIPTIONS["lat_maneuver"]), + initial_state=self._params.get_bool("LateralManeuverMode"), + callback=self._on_lat_maneuver_mode, + ) + + self._on_enable_ui_debug(self._params.get_bool("ShowDebugInfo")) + + self._scroller = Scroller([ + self._adb_toggle, + self._usb_storage_toggle, + self._ssh_toggle, + self._ssh_keys, + self._long_maneuver_toggle, + self._lat_maneuver_toggle, + ], line_separator=True, spacing=0) + + # Toggles should be not available to change in onroad state + ui_state.add_offroad_transition_callback(self._update_toggles) + + def _render(self, rect): + self._scroller.render(rect) + + def show_event(self): + self._scroller.show_event() + self._update_toggles() + + def _update_toggles(self): + ui_state.update_params() + + for item in (self._long_maneuver_toggle, self._lat_maneuver_toggle): + item.set_visible(not self._is_release) + + if ui_state.CP is not None: + self._long_maneuver_toggle.action_item.set_enabled(ui_state.has_longitudinal_control and ui_state.is_offroad()) + self._lat_maneuver_toggle.action_item.set_enabled(ui_state.is_offroad()) + else: + self._long_maneuver_toggle.action_item.set_enabled(False) + self._lat_maneuver_toggle.action_item.set_enabled(False) + + # TODO: make a param control list item so we don't need to manage internal state as much here + # refresh toggles from params to mirror external changes + for key, item in ( + ("AdbEnabled", self._adb_toggle), + ("UsbStorageEnabled", self._usb_storage_toggle), + ("SshEnabled", self._ssh_toggle), + ("LongitudinalManeuverMode", self._long_maneuver_toggle), + ("LateralManeuverMode", self._lat_maneuver_toggle), + ): + item.action_item.set_state(self._params.get_bool(key)) + + def _on_enable_ui_debug(self, state: bool): + self._params.put_bool("ShowDebugInfo", state) + gui_app.set_show_touches(state) + gui_app.set_show_fps(state) + gui_app.set_show_mouse_coords(state) + + def _on_enable_adb(self, state: bool): + self._params.put_bool("AdbEnabled", state) + + def _on_enable_usb_storage(self, state: bool): + apply_usb_storage_state(state) + + def _on_enable_ssh(self, state: bool): + self._params.put_bool("SshEnabled", state) + + def _on_long_maneuver_mode(self, state: bool): + self._params.put_bool("LongitudinalManeuverMode", state) + self._params.put_bool("JoystickDebugMode", False) + self._params.put_bool("LateralManeuverMode", False) + self._lat_maneuver_toggle.action_item.set_state(False) + + def _on_lat_maneuver_mode(self, state: bool): + self._params.put_bool("LateralManeuverMode", state) + self._params.put_bool("JoystickDebugMode", False) + self._params.put_bool("ExperimentalMode", False) + self._params.put_bool("LongitudinalManeuverMode", False) + self._long_maneuver_toggle.action_item.set_state(False) diff --git a/iqpilot/selfdrive/ui/layouts/settings/device.py b/iqpilot/selfdrive/ui/layouts/settings/device.py new file mode 100644 index 000000000..46d284405 --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/settings/device.py @@ -0,0 +1,201 @@ +import os +import math + +from iqpilot.cereal import messaging, log +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.ui.onroad.driver_camera_dialog import DriverCameraDialog +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.ui.widgets.pairing_dialog import PairingDialog +from iqpilot.konn3kt.registration import get_cached_dongle_id +from iqpilot.system.hardware import TICI +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.lib.multilang import multilang, tr, tr_noop +from iqpilot.system.ui.widgets import Widget, DialogResult +from iqpilot.system.ui.widgets.confirm_dialog import ConfirmDialog, alert_dialog +from iqpilot.system.ui.widgets.html_render import HtmlModal +from iqpilot.system.ui.widgets.list_view import text_item, button_item, dual_button_item +from iqpilot.system.ui.widgets.option_dialog import MultiOptionDialog +from iqpilot.system.ui.widgets.scroller_tici import Scroller + +if gui_app.iqpilot_ui(): + from iqpilot.system.ui.iqwidgets.widgets.list_view import button_item + +# Description constants +DESCRIPTIONS = { + 'pair_device': tr_noop("Pair your device in the Konn3kt app."), + 'driver_camera': tr_noop("Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"), + 'reset_calibration': tr_noop("IQ.Pilot requires the device to be mounted within 4° left or right and within 5° up or 9° down."), +} + + +class DeviceLayout(Widget): + def __init__(self): + super().__init__() + + self._params = Params() + self._select_language_dialog: MultiOptionDialog | None = None + self._driver_camera: DriverCameraDialog | None = None + self._pair_device_dialog: PairingDialog | None = None + self._fcc_dialog: HtmlModal | None = None + + items = self._initialize_items() + self._scroller = Scroller(items, line_separator=True, spacing=0) + + ui_state.add_offroad_transition_callback(self._offroad_transition) + + def _initialize_items(self): + self._pair_device_btn = button_item(lambda: tr("Pair Device"), lambda: tr("PAIR"), lambda: tr(DESCRIPTIONS['pair_device']), callback=self._pair_device) + self._pair_device_btn.set_visible(lambda: not ui_state.prime_state.is_paired()) + + self._reset_calib_btn = button_item(lambda: tr("Reset Calibration"), lambda: tr("RESET"), lambda: tr(DESCRIPTIONS['reset_calibration']), + callback=self._reset_calibration_prompt) + self._reset_calib_btn.set_description_opened_callback(self._update_calib_description) + + self._power_off_btn = dual_button_item(lambda: tr("Reboot"), lambda: tr("Power Off"), + left_callback=self._reboot_prompt, right_callback=self._power_off_prompt) + + items = [ + text_item(lambda: tr("Dongle ID"), lambda: get_cached_dongle_id(self._params, prefer_readonly=True) or tr("N/A")), + text_item(lambda: tr("Serial"), self._params.get("HardwareSerial") or (lambda: tr("N/A"))), + self._pair_device_btn, + button_item(lambda: tr("Driver Camera"), lambda: tr("PREVIEW"), lambda: tr(DESCRIPTIONS['driver_camera']), + callback=self._show_driver_camera, enabled=ui_state.is_offroad), + self._reset_calib_btn, + regulatory_btn := button_item(lambda: tr("Regulatory"), lambda: tr("VIEW"), callback=self._on_regulatory, enabled=ui_state.is_offroad), + button_item(lambda: tr("Change Language"), lambda: tr("CHANGE"), callback=self._show_language_dialog), + self._power_off_btn, + ] + regulatory_btn.set_visible(TICI) + return items + + def _offroad_transition(self): + self._power_off_btn.action_item.right_button.set_visible(ui_state.is_offroad()) + + def show_event(self): + self._scroller.show_event() + + def _render(self, rect): + self._scroller.render(rect) + + def _show_language_dialog(self): + def handle_language_selection(result: int): + if result == 1 and self._select_language_dialog: + selected_language = multilang.languages[self._select_language_dialog.selection] + multilang.change_language(selected_language) + self._update_calib_description() + self._select_language_dialog = None + + self._select_language_dialog = MultiOptionDialog(tr("Select a language"), multilang.languages, multilang.codes[multilang.language], + option_font_weight=FontWeight.UNIFONT) + gui_app.set_modal_overlay(self._select_language_dialog, callback=handle_language_selection) + + def _show_driver_camera(self): + if not self._driver_camera: + self._driver_camera = DriverCameraDialog() + + gui_app.set_modal_overlay(self._driver_camera, callback=lambda result: setattr(self, '_driver_camera', None)) + + def _reset_calibration_prompt(self): + if ui_state.engaged: + gui_app.set_modal_overlay(alert_dialog(tr("Disengage to Reset Calibration"))) + return + + def reset_calibration(result: int): + # Check engaged again in case it changed while the dialog was open + if ui_state.engaged or result != DialogResult.CONFIRM: + return + + self._params.remove("CalibrationParams") + self._params.remove("LiveTorqueParameters") + self._params.remove("LiveParameters") + self._params.remove("LiveParametersV2") + self._params.remove("LiveDelay") + self._params.put_bool("OnroadCycleRequested", True) + self._update_calib_description() + + dialog = ConfirmDialog(tr("Are you sure you want to reset calibration?"), tr("Reset")) + gui_app.set_modal_overlay(dialog, callback=reset_calibration) + + def _update_calib_description(self): + desc = tr(DESCRIPTIONS['reset_calibration']) + + calib_bytes = self._params.get("CalibrationParams") + if calib_bytes: + try: + calib = messaging.log_from_bytes(calib_bytes, log.Event).extrinsicsCalibration + + if calib.calStatus != log.ExtrinsicsCalibration.Status.uncalibrated: + pitch = math.degrees(calib.rpyCalib[1]) + yaw = math.degrees(calib.rpyCalib[2]) + desc += tr(" Your device is pointed {:.1f}° {} and {:.1f}° {}.").format(abs(pitch), tr("down") if pitch > 0 else tr("up"), + abs(yaw), tr("left") if yaw > 0 else tr("right")) + except Exception: + cloudlog.exception("invalid CalibrationParams") + + lag_perc = 0 + lag_bytes = self._params.get("LiveDelay") + if lag_bytes: + try: + lag_perc = messaging.log_from_bytes(lag_bytes, log.Event).lateralDelay.calPerc + except Exception: + cloudlog.exception("invalid LiveDelay") + if lag_perc < 100: + desc += tr("

    Steering lag calibration is {}% complete.").format(lag_perc) + else: + desc += tr("

    Steering lag calibration is complete.") + + torque_bytes = self._params.get("LiveTorqueParameters") + if torque_bytes: + try: + torque = messaging.log_from_bytes(torque_bytes, log.Event).lateralTorqueParameters + # don't add for non-torque cars + if torque.useParams: + torque_perc = torque.calPerc + if torque_perc < 100: + desc += tr(" Steering torque response calibration is {}% complete.").format(torque_perc) + else: + desc += tr(" Steering torque response calibration is complete.") + except Exception: + cloudlog.exception("invalid LiveTorqueParameters") + + desc += "

    " + desc += tr("IQ.Pilot is continuously calibrating, resetting is rarely required. " + + "Resetting calibration will restart IQ.Pilot if the car is powered on.") + + self._reset_calib_btn.set_description(desc) + + def _reboot_prompt(self): + if ui_state.engaged: + gui_app.set_modal_overlay(alert_dialog(tr("Disengage to Reboot"))) + return + + dialog = ConfirmDialog(tr("Are you sure you want to reboot?"), tr("Reboot")) + gui_app.set_modal_overlay(dialog, callback=self._perform_reboot) + + def _perform_reboot(self, result: int): + if not ui_state.engaged and result == DialogResult.CONFIRM: + self._params.put_bool_nonblocking("DoReboot", True) + + def _power_off_prompt(self): + if ui_state.engaged: + gui_app.set_modal_overlay(alert_dialog(tr("Disengage to Power Off"))) + return + + dialog = ConfirmDialog(tr("Are you sure you want to power off?"), tr("Power Off")) + gui_app.set_modal_overlay(dialog, callback=self._perform_power_off) + + def _perform_power_off(self, result: int): + if not ui_state.engaged and result == DialogResult.CONFIRM: + self._params.put_bool_nonblocking("DoShutdown", True) + + def _pair_device(self): + if not self._pair_device_dialog: + self._pair_device_dialog = PairingDialog() + gui_app.set_modal_overlay(self._pair_device_dialog, callback=lambda result: setattr(self, '_pair_device_dialog', None)) + + def _on_regulatory(self): + if not self._fcc_dialog: + self._fcc_dialog = HtmlModal(os.path.join(BASEDIR, "iqpilot/selfdrive/assets/offroad/fcc.html")) + gui_app.set_modal_overlay(self._fcc_dialog) diff --git a/iqpilot/selfdrive/ui/layouts/settings/settings.py b/iqpilot/selfdrive/ui/layouts/settings/settings.py new file mode 100644 index 000000000..0612320ed --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/settings/settings.py @@ -0,0 +1,170 @@ +import pyray as rl +from dataclasses import dataclass +from enum import IntEnum +from collections.abc import Callable +from iqpilot.selfdrive.ui.layouts.settings.developer import DeveloperLayout +from iqpilot.selfdrive.ui.layouts.settings.device import DeviceLayout +from iqpilot.selfdrive.ui.layouts.settings.software import SoftwareLayout +from iqpilot.selfdrive.ui.layouts.settings.toggles import TogglesLayout +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.multilang import tr, tr_noop +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.wifi_manager import WifiManager +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.network import NetworkUI + +# Constants +SIDEBAR_WIDTH = 500 +CLOSE_BTN_SIZE = 200 +CLOSE_ICON_SIZE = 70 +NAV_BTN_HEIGHT = 110 +PANEL_MARGIN = 50 + +# Colors +SIDEBAR_COLOR = rl.BLACK +PANEL_COLOR = rl.Color(41, 41, 41, 255) +CLOSE_BTN_COLOR = rl.Color(41, 41, 41, 255) +CLOSE_BTN_PRESSED = rl.Color(59, 59, 59, 255) +TEXT_NORMAL = rl.Color(128, 128, 128, 255) +TEXT_SELECTED = rl.WHITE + + +class PanelType(IntEnum): + DEVICE = 0 + NETWORK = 1 + TOGGLES = 2 + SOFTWARE = 3 + DEVELOPER = 5 + + +@dataclass +class PanelInfo: + name: str + instance: Widget + button_rect: rl.Rectangle = rl.Rectangle(0, 0, 0, 0) + + +class SettingsLayout(Widget): + def __init__(self): + super().__init__() + self._current_panel = PanelType.DEVICE + + # Panel configuration + wifi_manager = WifiManager() + wifi_manager.set_active(False) + + self._panels = { + PanelType.DEVICE: PanelInfo(tr_noop("Device"), DeviceLayout()), + PanelType.NETWORK: PanelInfo(tr_noop("Network"), NetworkUI(wifi_manager)), + PanelType.TOGGLES: PanelInfo(tr_noop("Toggles"), TogglesLayout()), + PanelType.SOFTWARE: PanelInfo(tr_noop("Software"), SoftwareLayout()), + PanelType.DEVELOPER: PanelInfo(tr_noop("Developer"), DeveloperLayout()), + } + + self._font_medium = gui_app.font(FontWeight.MEDIUM) + self._close_icon = gui_app.texture("icons/close2.png", CLOSE_ICON_SIZE, CLOSE_ICON_SIZE) + + # Callbacks + self._close_callback: Callable | None = None + + def set_callbacks(self, on_close: Callable): + self._close_callback = on_close + + def _render(self, rect: rl.Rectangle): + # Calculate layout + sidebar_rect = rl.Rectangle(rect.x, rect.y, SIDEBAR_WIDTH, rect.height) + panel_rect = rl.Rectangle(rect.x + SIDEBAR_WIDTH, rect.y, rect.width - SIDEBAR_WIDTH, rect.height) + + # Draw components + self._draw_sidebar(sidebar_rect) + self._draw_current_panel(panel_rect) + + def _draw_sidebar(self, rect: rl.Rectangle): + rl.draw_rectangle_rec(rect, SIDEBAR_COLOR) + + # Close button + close_btn_rect = rl.Rectangle( + rect.x + (rect.width - CLOSE_BTN_SIZE) / 2, rect.y + 60, CLOSE_BTN_SIZE, CLOSE_BTN_SIZE + ) + + pressed = (rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT) and + rl.check_collision_point_rec(rl.get_mouse_position(), close_btn_rect)) + close_color = CLOSE_BTN_PRESSED if pressed else CLOSE_BTN_COLOR + rl.draw_rectangle_rounded(close_btn_rect, 1.0, 20, close_color) + + icon_color = rl.Color(255, 255, 255, 255) if not pressed else rl.Color(220, 220, 220, 255) + icon_dest = rl.Rectangle( + close_btn_rect.x + (close_btn_rect.width - self._close_icon.width) / 2, + close_btn_rect.y + (close_btn_rect.height - self._close_icon.height) / 2, + self._close_icon.width, + self._close_icon.height, + ) + rl.draw_texture_pro( + self._close_icon, + rl.Rectangle(0, 0, self._close_icon.width, self._close_icon.height), + icon_dest, + rl.Vector2(0, 0), + 0, + icon_color, + ) + + # Store close button rect for click detection + self._close_btn_rect = close_btn_rect + + # Navigation buttons + y = rect.y + 300 + for panel_type, panel_info in self._panels.items(): + button_rect = rl.Rectangle(rect.x + 50, y, rect.width - 150, NAV_BTN_HEIGHT) + + # Button styling + is_selected = panel_type == self._current_panel + text_color = TEXT_SELECTED if is_selected else TEXT_NORMAL + # Draw button text (right-aligned) + panel_name = tr(panel_info.name) + text_size = measure_text_cached(self._font_medium, panel_name, 65) + text_pos = rl.Vector2( + button_rect.x + button_rect.width - text_size.x, button_rect.y + (button_rect.height - text_size.y) / 2 + ) + rl.draw_text_ex(self._font_medium, panel_name, text_pos, 65, 0, text_color) + + # Store button rect for click detection + panel_info.button_rect = button_rect + + y += NAV_BTN_HEIGHT + + def _draw_current_panel(self, rect: rl.Rectangle): + rl.draw_rectangle_rounded( + rl.Rectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20), 0.04, 30, PANEL_COLOR + ) + content_rect = rl.Rectangle(rect.x + PANEL_MARGIN, rect.y + 25, rect.width - (PANEL_MARGIN * 2), rect.height - 50) + # rl.draw_rectangle_rounded(content_rect, 0.03, 30, PANEL_COLOR) + panel = self._panels[self._current_panel] + if panel.instance: + panel.instance.render(content_rect) + + def _handle_mouse_release(self, mouse_pos: MousePos) -> None: + # Check close button + if rl.check_collision_point_rec(mouse_pos, self._close_btn_rect): + if self._close_callback: + self._close_callback() + return + + # Check navigation buttons + for panel_type, panel_info in self._panels.items(): + if rl.check_collision_point_rec(mouse_pos, panel_info.button_rect): + self.set_current_panel(panel_type) + return + + def set_current_panel(self, panel_type: PanelType): + if panel_type != self._current_panel: + self._panels[self._current_panel].instance.hide_event() + self._current_panel = panel_type + self._panels[self._current_panel].instance.show_event() + + def show_event(self): + super().show_event() + self._panels[self._current_panel].instance.show_event() + + def hide_event(self): + super().hide_event() + self._panels[self._current_panel].instance.hide_event() diff --git a/iqpilot/selfdrive/ui/layouts/settings/software.py b/iqpilot/selfdrive/ui/layouts/settings/software.py new file mode 100644 index 000000000..c7594a8af --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/settings/software.py @@ -0,0 +1,262 @@ +import os +import time +import datetime +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.multilang import tr, trn +from iqpilot.system.ui.widgets import Widget, DialogResult +from iqpilot.system.ui.widgets.confirm_dialog import ConfirmDialog +from iqpilot.system.ui.widgets.list_view import button_item, text_item, ListItem +from iqpilot.system.ui.widgets.option_dialog import MultiOptionDialog +from iqpilot.system.ui.widgets.scroller_tici import Scroller + +if gui_app.iqpilot_ui(): + from iqpilot.system.ui.iqwidgets.widgets.list_view import button_item + +# TODO: remove this. updater fails to respond on startup if time is not correct +UPDATED_TIMEOUT = 10 # seconds to wait for updated to respond +BRAND_NAME = "IQ.Pilot" + +# Mapping updater internal states to translated display strings +STATE_TO_DISPLAY_TEXT = { + "checking...": tr("checking..."), + "downloading...": tr("downloading..."), + "finalizing update...": tr("finalizing update..."), +} + + +def format_updater_description(description: str | None) -> str: + if not description: + return BRAND_NAME + + cleaned = description.strip() + lower = cleaned.lower() + if lower.startswith("iqpilot"): + cleaned = cleaned[len("iqpilot"):].lstrip(" -:/") + + if cleaned.lower().startswith(BRAND_NAME.lower()): + return cleaned + return f"{BRAND_NAME} {cleaned}" if cleaned else BRAND_NAME + + +def time_ago(date: datetime.datetime | None) -> str: + if not date: + return tr("never") + + if not system_time_valid(): + return date.strftime("%a %b %d %Y") + + now = datetime.datetime.now(datetime.UTC) + if date.tzinfo is None: + date = date.replace(tzinfo=datetime.UTC) + + diff_seconds = int((now - date).total_seconds()) + if diff_seconds < 60: + return tr("now") + if diff_seconds < 3600: + m = diff_seconds // 60 + return trn("{} minute ago", "{} minutes ago", m).format(m) + if diff_seconds < 86400: + h = diff_seconds // 3600 + return trn("{} hour ago", "{} hours ago", h).format(h) + if diff_seconds < 604800: + d = diff_seconds // 86400 + return trn("{} day ago", "{} days ago", d).format(d) + return date.strftime("%a %b %d %Y") + + +class SoftwareLayout(Widget): + def __init__(self): + super().__init__() + + self._onroad_label = ListItem(lambda: tr("Updates are only downloaded while the car is off.")) + self._version_item = text_item(lambda: tr("Current Version"), format_updater_description(ui_state.params.get("UpdaterCurrentDescription"))) + self._download_btn = button_item(lambda: tr("Download"), lambda: tr("CHECK"), callback=self._on_download_update) + + # Install button is initially hidden + self._install_btn = button_item(lambda: tr("Install Update"), lambda: tr("INSTALL"), callback=self._on_install_update) + self._install_btn.set_visible(False) + + # Track waiting-for-updater transition to avoid brief re-enable while still idle + self._waiting_for_updater = False + self._waiting_start_ts: float = 0.0 + + # Branch switcher + self._branch_btn = button_item(lambda: tr("Target Branch"), lambda: tr("SELECT"), callback=self._on_select_branch) + self._branch_btn.set_visible(not ui_state.params.get_bool("IsTestedBranch")) + self._branch_btn.action_item.set_value(ui_state.params.get("UpdaterTargetBranch") or "") + self._branch_dialog: MultiOptionDialog | None = None + + # Git auth for private-branch updates (sits with the Target Branch section) + self._auth_btn = button_item(lambda: tr("Git Auth"), lambda: tr("AUTH"), callback=self._on_auth_branch) + self._auth_btn.set_visible(not ui_state.params.get_bool("IsTestedBranch")) + + self._scroller = Scroller([ + self._onroad_label, + self._version_item, + self._download_btn, + self._install_btn, + self._branch_btn, + self._auth_btn, + button_item(lambda: tr("Uninstall"), lambda: tr("UNINSTALL"), callback=self._on_uninstall), + ], line_separator=True, spacing=0) + + def show_event(self): + self._refresh_auth_value() + self._scroller.show_event() + + def _refresh_auth_value(self): + try: + from iqpilot.common.git_creds import has_credentials + configured = has_credentials() + except Exception: + configured = False + self._auth_btn.action_item.set_value(tr("configured") if configured else "") + + def _render(self, rect): + self._scroller.render(rect) + + def _update_state(self): + # Show/hide onroad warning + self._onroad_label.set_visible(ui_state.is_onroad()) + + # Update current version and release notes + current_desc = format_updater_description(ui_state.params.get("UpdaterCurrentDescription")) + current_release_notes = (ui_state.params.get("UpdaterCurrentReleaseNotes") or b"").decode("utf-8", "replace") + self._version_item.action_item.set_text(current_desc) + self._version_item.set_description(current_release_notes) + + # Update download button visibility and state + self._download_btn.set_visible(ui_state.is_offroad()) + + updater_state = ui_state.params.get("UpdaterState") or "idle" + failed_count = ui_state.params.get("UpdateFailedCount") or 0 + fetch_available = ui_state.params.get_bool("UpdaterFetchAvailable") + update_available = ui_state.params.get_bool("UpdateAvailable") + + if updater_state != "idle": + # Updater responded + self._waiting_for_updater = False + self._download_btn.action_item.set_enabled(False) + # Use the mapping, with a fallback to the original state string + display_text = STATE_TO_DISPLAY_TEXT.get(updater_state, updater_state) + self._download_btn.action_item.set_value(display_text) + else: + if failed_count > 0: + self._download_btn.action_item.set_value(tr("failed to check for update")) + self._download_btn.action_item.set_text(tr("CHECK")) + elif fetch_available: + self._download_btn.action_item.set_value(tr("update available")) + self._download_btn.action_item.set_text(tr("DOWNLOAD")) + else: + last_update = ui_state.params.get("LastUpdateTime") + if last_update: + formatted = time_ago(last_update) + self._download_btn.action_item.set_value(tr("up to date, last checked {}").format(formatted)) + else: + self._download_btn.action_item.set_value(tr("up to date, last checked never")) + self._download_btn.action_item.set_text(tr("CHECK")) + + # If we've been waiting too long without a state change, reset state + if self._waiting_for_updater and (time.monotonic() - self._waiting_start_ts > UPDATED_TIMEOUT): + self._waiting_for_updater = False + + # Only enable if we're not waiting for updater to flip out of idle + self._download_btn.action_item.set_enabled(not self._waiting_for_updater) + + # Update target branch button value + current_branch = ui_state.params.get("UpdaterTargetBranch") or "" + self._branch_btn.action_item.set_value(current_branch) + + # Update install button + self._install_btn.set_visible(ui_state.is_offroad() and update_available) + if update_available: + new_desc = format_updater_description(ui_state.params.get("UpdaterNewDescription")) + new_release_notes = (ui_state.params.get("UpdaterNewReleaseNotes") or b"").decode("utf-8", "replace") + self._install_btn.action_item.set_text(tr("INSTALL")) + self._install_btn.action_item.set_value(new_desc) + self._install_btn.set_description(new_release_notes) + # Enable install button for testing (like Qt showEvent) + self._install_btn.action_item.set_enabled(True) + else: + self._install_btn.set_visible(False) + + def _on_download_update(self): + # Check if we should start checking or start downloading + self._download_btn.action_item.set_enabled(False) + if self._download_btn.action_item.text == tr("CHECK"): + # Start checking for updates + self._waiting_for_updater = True + self._waiting_start_ts = time.monotonic() + os.system("pkill -SIGUSR1 -f system.updated.updated") + else: + # Start downloading + self._waiting_for_updater = True + self._waiting_start_ts = time.monotonic() + os.system("pkill -SIGHUP -f system.updated.updated") + + def _on_uninstall(self): + def handle_uninstall_confirmation(result): + if result == DialogResult.CONFIRM: + ui_state.params.put_bool("DoUninstall", True) + + dialog = ConfirmDialog(tr("Are you sure you want to uninstall?"), tr("Uninstall")) + gui_app.set_modal_overlay(dialog, callback=handle_uninstall_confirmation) + + def _on_install_update(self): + # Trigger reboot to install update + self._install_btn.action_item.set_enabled(False) + ui_state.params.put_bool("DoReboot", True) + + def _on_select_branch(self): + # Get available branches and order + current_git_branch = ui_state.params.get("GitBranch") or "" + branches_str = ui_state.params.get("UpdaterAvailableBranches") or "" + branches = [b for b in branches_str.split(",") if b] + + for b in [current_git_branch, "devel-staging", "devel", "nightly", "nightly-dev", "master"]: + if b in branches: + branches.remove(b) + branches.insert(0, b) + + current_target = ui_state.params.get("UpdaterTargetBranch") or "" + self._branch_dialog = MultiOptionDialog(tr("Select a branch"), branches, current_target) + + def handle_selection(result): + # Confirmed selection + if result == DialogResult.CONFIRM and self._branch_dialog is not None and self._branch_dialog.selection: + selection = self._branch_dialog.selection + ui_state.params.put("UpdaterTargetBranch", selection) + self._branch_btn.action_item.set_value(selection) + os.system("pkill -SIGUSR1 -f system.updated.updated") + self._branch_dialog = None + + gui_app.set_modal_overlay(self._branch_dialog, callback=handle_selection) + + def _on_auth_branch(self): + # Collect username then token; store encrypted and signal the updater to + # re-check (refreshing the available-branch list for private repos). + from iqpilot.system.ui.iqwidgets.widgets.list_view import open_text_prompt + from iqpilot.common import git_creds + + creds = git_creds.get_credentials() + current_user = creds[0] if creds else "" + + def on_username(result, username): + if result != DialogResult.CONFIRM: + return + + def on_token(token_result, token): + if token_result != DialogResult.CONFIRM: + return + git_creds.set_credentials(username, token) + self._refresh_auth_value() + os.system("pkill -SIGUSR1 -f system.updated.updated") + + open_text_prompt(tr("Git token / password"), + tr("leave username and token blank to clear"), + password=True, on_done=on_token) + + open_text_prompt(tr("Git username"), tr("for private branch updates"), + initial=current_user, on_done=on_username) diff --git a/iqpilot/selfdrive/ui/layouts/settings/toggles.py b/iqpilot/selfdrive/ui/layouts/settings/toggles.py new file mode 100644 index 000000000..db5adac32 --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/settings/toggles.py @@ -0,0 +1,343 @@ +from iqpilot.cereal import log +from iqpilot.common.params import Params, UnknownKeyName +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.list_view import multiple_button_item, toggle_item +from iqpilot.system.ui.widgets.scroller_tici import Scroller +from iqpilot.system.ui.widgets.confirm_dialog import ConfirmDialog +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.multilang import tr, tr_noop +from iqpilot.system.ui.widgets import DialogResult +from iqpilot.selfdrive.ui.ui_state import ui_state + +if gui_app.iqpilot_ui(): + from iqpilot.system.ui.iqwidgets.widgets.list_view import toggle_item + from iqpilot.system.ui.iqwidgets.widgets.list_view import multiple_button_item + from iqpilot.ui.layouts.settings.iq_dynamic import IQDynamicLayout + +PERSONALITY_TO_INT = log.LongitudinalPersonality.schema.enumerants +PERSONALITY_DISPLAY_TO_PARAM = [PERSONALITY_TO_INT["relaxed"], PERSONALITY_TO_INT["standard"], PERSONALITY_TO_INT["aggressive"]] +PERSONALITY_PARAM_TO_DISPLAY = {param: idx for idx, param in enumerate(PERSONALITY_DISPLAY_TO_PARAM)} + +# Description constants +DESCRIPTIONS = { + "OpenpilotEnabledToggle": tr_noop( + "Use the IQ.Pilot system for adaptive cruise control and lane keep driver assistance. " + + "Your attention is required at all times to use this feature." + ), + "DisengageOnAccelerator": tr_noop("When enabled, pressing the accelerator pedal will disengage IQ.Pilot."), + "LongitudinalPersonality": tr_noop( + "Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars closer and be more aggressive with the gas and brake. " + + "In relaxed mode IQ.Pilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with " + + "your steering wheel distance button." + ), + "IQSpeedAssistMode": tr_noop( + "Controls IQ.Pilot speed limit behavior. Off disables speed limit features, Information only displays limits, Warning highlights overspeed, and Control adjusts set speed using detected limits." + ), + "IsLdwEnabled": tr_noop( + "Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line " + + "without a turn signal activated while driving over 31 mph (50 km/h)." + ), + "AlwaysOnDM": tr_noop("Enable driver monitoring even when IQ.Pilot is not engaged."), + "DashcamEnabled": tr_noop("Record and upload driving data and video. Disabling this stops all recording! No logs, no video, no audio."), + 'RecordFront': tr_noop("Upload data from the driver facing camera and help improve the driver monitoring algorithm."), + "IsMetric": tr_noop("Display speed in km/h instead of mph."), + "IQAutoUnits": tr_noop( + "Set the units from the device location. Speeds switch to km/h everywhere except the United States, " + + "the United Kingdom and Liberia, and are re-checked when you cross a border." + ), + "RecordAudio": tr_noop("Record and store microphone audio while driving. The audio will be included in the dashcam video in Konn3kt."), + "LongitudinalControlMode": tr_noop( + "Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " + "IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + relaxed personality), " + "or Stock ACC." + ), +} + + +class TogglesLayout(Widget): + def __init__(self): + super().__init__() + self._params = Params() + # Keep IQ.Pilot enabled by default; the UI no longer exposes this toggle. + self._params.put_bool("OpenpilotEnabledToggle", True) + + # param, title, desc, icon, needs_restart + self._toggle_defs = { + "DisengageOnAccelerator": ( + lambda: tr("Disengage on Accelerator Pedal"), + DESCRIPTIONS["DisengageOnAccelerator"], + "disengage_on_accelerator.png", + False, + ), + "IsLdwEnabled": ( + lambda: tr("Enable Lane Departure Warnings"), + DESCRIPTIONS["IsLdwEnabled"], + "warning.png", + False, + ), + "DashcamEnabled": ( + lambda: tr("Enable Dashcam"), + DESCRIPTIONS["DashcamEnabled"], + "camera.png", + True, + ), + "RecordFront": ( + lambda: tr("Record and Upload Driver Camera"), + DESCRIPTIONS["RecordFront"], + "monitoring.png", + True, + ), + "RecordAudio": ( + lambda: tr("Record and Upload Microphone Audio"), + DESCRIPTIONS["RecordAudio"], + "microphone.png", + True, + ), + "IsMetric": ( + lambda: tr("Use Metric System"), + DESCRIPTIONS["IsMetric"], + "metric.png", + False, + ), + "IQAutoUnits": ( + lambda: tr("Set Units From Location"), + DESCRIPTIONS["IQAutoUnits"], + "metric.png", + False, + ), + } + + self._long_personality_setting = multiple_button_item( + lambda: tr("Driving Personality"), + lambda: tr(DESCRIPTIONS["LongitudinalPersonality"]), + buttons=[lambda: tr("Relaxed"), lambda: tr("Standard"), lambda: tr("Aggressive")], + button_width=300, + callback=self._set_longitudinal_personality, + selected_index=PERSONALITY_PARAM_TO_DISPLAY.get(self._params.get("LongitudinalPersonality", return_default=True), 1), + icon="speed_limit.png" + ) + self._speed_limit_mode_setting = multiple_button_item( + lambda: tr("Speed Limit"), + lambda: tr(DESCRIPTIONS["IQSpeedAssistMode"]), + buttons=[lambda: tr("Off"), lambda: tr("Info"), lambda: tr("Warning"), lambda: tr("Control")], + button_width=220, + callback=self._set_speed_limit_mode, + selected_index=self._params.get("IQSpeedAssistMode", return_default=True), + icon="speed_limit.png", + ) + self._longitudinal_control_mode_setting = multiple_button_item( + lambda: tr("Longitudinal Control"), + lambda: tr(DESCRIPTIONS["LongitudinalControlMode"]), + buttons=[lambda: tr("Stock ACC"), lambda: tr("IQ.Chill"), lambda: tr("IQ.Dynamic"), lambda: tr("IQ.Pilot")], + button_width=250, + callback=self._set_longitudinal_control_mode, + selected_index=self._get_longitudinal_control_mode_index(), + icon="experimental_white.png", + ) + + self._toggles = {} + self._locked_toggles = set() + self._toggles["LongitudinalControlMode"] = self._longitudinal_control_mode_setting + self._toggles["LongitudinalPersonality"] = self._long_personality_setting + self._toggles["IQSpeedAssistMode"] = self._speed_limit_mode_setting + + for param, (title, desc, icon, needs_restart) in self._toggle_defs.items(): + initial_state = self._params.get_bool(param) + toggle = toggle_item( + title, + desc, + initial_state, + callback=lambda state, p=param: self._toggle_callback(state, p), + icon=icon, + ) + + try: + locked = self._params.get_bool(param + "Lock") + except UnknownKeyName: + locked = False + toggle.action_item.set_enabled(not locked) + + # Make description callable for live translation + additional_desc = "" + if needs_restart and not locked: + additional_desc = tr("Changing this setting will restart IQ.Pilot if the car is powered on.") + toggle.set_description(lambda og_desc=toggle.description, add_desc=additional_desc: tr(og_desc) + (" " + tr(add_desc) if add_desc else "")) + + # track for engaged state updates + if locked: + self._locked_toggles.add(param) + + self._toggles[param] = toggle + + self._scroller = Scroller(list(self._toggles.values()), line_separator=True, spacing=0) + + self._iq_dynamic_panel: "IQDynamicLayout | None" = None + self._show_iq_dynamic = False + if gui_app.iqpilot_ui(): + self._iq_dynamic_panel = IQDynamicLayout(self._close_iq_dynamic_panel) + + ui_state.add_engaged_transition_callback(self._update_toggles) + + def _update_state(self): + if ui_state.sm.updated["selfdriveState"]: + personality = PERSONALITY_TO_INT[ui_state.sm["selfdriveState"].personality] + if personality != ui_state.personality and ui_state.started: + self._long_personality_setting.action_item.set_selected_button(PERSONALITY_PARAM_TO_DISPLAY.get(personality, 1)) + ui_state.personality = personality + self._speed_limit_mode_setting.action_item.set_selected_button(self._params.get("IQSpeedAssistMode", return_default=True)) + + def _close_iq_dynamic_panel(self): + self._show_iq_dynamic = False + + def set_cruise_panel_callback(self, callback: "Callable") -> None: + """Register callback invoked on double-click of IQ.Dynamic (button index 2).""" + action = self._longitudinal_control_mode_setting.action_item + if hasattr(action, 'set_double_click_callback'): + action.set_double_click_callback(2, callback) + + def show_event(self): + self._show_iq_dynamic = False + self._scroller.show_event() + self._update_toggles() + + def _update_toggles(self): + ui_state.update_params() + + e2e_description = tr( + "Longitudinal Control modes:
    " + + "IQ.Pilot features are listed below:
    " + + "

    IQ.Pilot End-to-End Longitudinal Control


    " + + "Let the driving model control the gas and brakes. IQ.Pilot will drive as it thinks a human would, including stopping for red lights and stop signs. " + + "Since the driving model decides the speed to drive, the set speed will only act as an upper bound. This feature is still being improved; " + + "mistakes should be expected.
    " + + "

    IQ.Dynamic


    " + + "Dynamically blends between adaptive cruise behavior and end-to-end behavior based on scene/context.
    " + + "

    IQ.Chill


    " + + "Uses standard traffic-aware cruise behavior for longitudinal control.
    " + + "

    New Driving Visualization


    " + + "The driving visualization will transition to the road-facing wide-angle camera at low speeds to better show some turns. " + + "The IQ.Pilot logo will also be shown in the top right corner." + ) + + alpha_available = bool(ui_state.CP is not None and ui_state.CP.alphaLongitudinalAvailable) + alpha_requested = self._params.get_bool("AlphaLongitudinalEnabled") + toyota_stock_long_forced = bool( + ui_state.CP is not None and + ui_state.CP.brand == "toyota" and + self._params.get_bool("IQToyotaFactoryLong") + ) + iq_modes_selectable = alpha_available or alpha_requested or toyota_stock_long_forced + availability_note = "" + if ui_state.CP is None: + availability_note = tr("Vehicle longitudinal capability has not been detected yet. Start the car once to detect support.") + elif toyota_stock_long_forced: + availability_note = tr("Factory Toyota longitudinal control is currently enforced. Choose an IQ longitudinal mode to disable it.") + elif not alpha_available: + availability_note = tr("IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the only available option.") + + self._toggles["LongitudinalControlMode"].set_visible(True) + self._long_personality_setting.set_visible(True) + + mode_index = self._get_longitudinal_control_mode_index() + longitudinal_control_item = self._toggles["LongitudinalControlMode"] + longitudinal_control_item.action_item.set_selected_button(mode_index) + longitudinal_control_item.action_item.set_enabled(not ui_state.engaged) + longitudinal_control_item.action_item.set_enabled_buttons([True, iq_modes_selectable, iq_modes_selectable, iq_modes_selectable]) + + description = tr(DESCRIPTIONS["LongitudinalControlMode"]) + "

    " + e2e_description + if availability_note: + description += "

    " + availability_note + "" + longitudinal_control_item.set_description(description) + + personality_enabled = iq_modes_selectable and mode_index in (2, 3) + self._long_personality_setting.action_item.set_enabled(personality_enabled) + + # TODO: make a param control list item so we don't need to manage internal state as much here + # refresh toggles from params to mirror external changes + for param in self._toggle_defs: + self._toggles[param].action_item.set_state(self._params.get_bool(param)) + + # these toggles need restart, block while engaged + for toggle_def in self._toggle_defs: + if self._toggle_defs[toggle_def][3] and toggle_def not in self._locked_toggles: + self._toggles[toggle_def].action_item.set_enabled(not ui_state.engaged) + + def _render(self, rect): + if self._show_iq_dynamic and self._iq_dynamic_panel is not None: + self._iq_dynamic_panel.render(rect) + else: + self._scroller.render(rect) + + def _get_longitudinal_control_mode_index(self) -> int: + if not self._params.get_bool("AlphaLongitudinalEnabled"): + return 0 # Stock ACC + if not self._params.get_bool("ExperimentalMode"): + return 1 # IQ.Chill + return 2 if self._params.get_bool("IQDynamicMode") else 3 # IQ.Dynamic / IQ.Pilot + + def _apply_longitudinal_control_mode(self, button_index: int): + # 0 = Stock ACC, 1 = IQ.Chill, 2 = IQ.Dynamic, 3 = IQ.Pilot + previous_alpha = self._params.get_bool("AlphaLongitudinalEnabled") + previous_toyota_stock_long = self._params.get_bool("IQToyotaFactoryLong") + + if button_index == 0: + self._params.put_bool("AlphaLongitudinalEnabled", False) + self._params.put_bool("ExperimentalMode", False) + self._params.put_bool("IQDynamicMode", False) + elif button_index == 1: + self._params.put_bool("AlphaLongitudinalEnabled", True) + self._params.put_bool("ExperimentalMode", False) + self._params.put_bool("IQDynamicMode", False) + self._params.put("LongitudinalPersonality", PERSONALITY_TO_INT["relaxed"]) + elif button_index == 2: + self._params.put_bool("AlphaLongitudinalEnabled", True) + self._params.put_bool("ExperimentalMode", True) + self._params.put_bool("IQDynamicMode", True) + else: + self._params.put_bool("AlphaLongitudinalEnabled", True) + self._params.put_bool("ExperimentalMode", True) + self._params.put_bool("IQDynamicMode", False) + + if button_index != 0 and previous_toyota_stock_long: + self._params.put_bool("IQToyotaFactoryLong", False) + + if previous_alpha != self._params.get_bool("AlphaLongitudinalEnabled") or previous_toyota_stock_long != self._params.get_bool("IQToyotaFactoryLong"): + self._params.put_bool("OnroadCycleRequested", True) + + def _toggle_callback(self, state: bool, param: str): + self._params.put_bool(param, state) + if param == "IQAutoUnits" and state: + self._params.remove("IQAutoUnitsRegion") + if self._toggle_defs[param][3]: + self._params.put_bool("OnroadCycleRequested", True) + + def _set_longitudinal_personality(self, button_index: int): + self._params.put("LongitudinalPersonality", PERSONALITY_DISPLAY_TO_PARAM[button_index]) + + def _set_speed_limit_mode(self, button_index: int): + self._params.put("IQSpeedAssistMode", button_index) + + def _set_longitudinal_control_mode(self, button_index: int): + # 0 = Stock ACC, 1 = IQ.Chill, 2 = IQ.Dynamic, 3 = IQ.Pilot + if button_index == self._get_longitudinal_control_mode_index(): + if button_index == 2 and self._iq_dynamic_panel is not None: + self._show_iq_dynamic = True + return + + # IQ.Pilot and IQ.Dynamic both require ExperimentalMode confirmation. + if button_index in (2, 3) and not self._params.get_bool("ExperimentalModeConfirmed"): + def confirm_callback(result: int): + if result == DialogResult.CONFIRM: + self._apply_longitudinal_control_mode(button_index) + self._params.put_bool("ExperimentalModeConfirmed", True) + else: + self._toggles["LongitudinalControlMode"].action_item.set_selected_button(self._get_longitudinal_control_mode_index()) + self._update_toggles() + + content = (f"

    {self._toggles['LongitudinalControlMode'].title}


    " + + f"

    {self._toggles['LongitudinalControlMode'].description}

    ") + dlg = ConfirmDialog(content, tr("Enable"), rich=True) + gui_app.set_modal_overlay(dlg, callback=confirm_callback) + else: + self._apply_longitudinal_control_mode(button_index) + self._update_toggles() diff --git a/iqpilot/selfdrive/ui/layouts/settings_hub.py b/iqpilot/selfdrive/ui/layouts/settings_hub.py new file mode 100644 index 000000000..e04d51d4b --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/settings_hub.py @@ -0,0 +1,557 @@ +import pyray as rl +from collections.abc import Callable +from dataclasses import dataclass +from enum import Enum, auto + +from iqpilot.common.params import Params +from iqpilot.ui.layouts.settings.iq_panels import IQSettingsLayout +from iqpilot.selfdrive.ui.layouts.home import _format_updater_description +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.ui.widgets.screen_header import ScreenHeader, HEADER_HEIGHT, BACK_BTN_SIZE +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MouseEvent, MousePos +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget, DialogResult +from iqpilot.system.ui.widgets.confirm_dialog import ConfirmDialog, alert_dialog +from iqpilot.system.ui.widgets.label import UnifiedLabel + +# iOS-style swipe-from-the-left-edge-to-go-back, for panel -> grid only (the one place +# this layout already has a from/to slide transition to reuse for the live drag). +EDGE_SWIPE_ZONE = 80 # px from the left edge a swipe-back touch must start within +EDGE_SWIPE_ARM_DISTANCE = 8 # px of rightward movement before we commit to "this is a swipe" +EDGE_SWIPE_BLOCK_VERTICAL = 60 # px of vertical movement (while still under arm distance) that cancels it +EDGE_SWIPE_COMPLETE_FRACTION = 0.3 # fraction of screen width dragged to complete the pop on release +SWIPE_SETTLE_SECONDS = 0.16 # glide from the release point to done/cancelled (no snap) + +MARGIN = 40 +SPACING = 25 +COLUMNS = 3 +PILL_GAP = 24 +PILL_MIN_HEIGHT = 150 +BUBBLE_SIZE = 86 +BUBBLE_RED = rl.Color(226, 60, 52, 255) +BUBBLE_RED_PRESSED = rl.Color(245, 92, 82, 255) +BUBBLE_GREY = rl.Color(70, 72, 78, 255) +BUBBLE_GREY_PRESSED = rl.Color(95, 98, 106, 255) +BUBBLE_TEAL = rl.Color(16, 185, 169, 255) +BUBBLE_TEAL_PRESSED = rl.Color(22, 210, 192, 255) +SETTINGS_TRANSITION_SECONDS = 0.28 +TRANSITION_SURFACE_OVERSCAN = 4 +TRANSITION_SURFACE_BG = rl.Color(10, 10, 10, 255) + + +class MenuTransitionState(Enum): + IDLE = auto() + PUSHING = auto() + POPPING = auto() + + +@dataclass +class MenuTransition: + state: MenuTransitionState = MenuTransitionState.IDLE + t: float = 0.0 + duration: float = SETTINGS_TRANSITION_SECONDS + from_screen: object | None = None + to_screen: object | None = None + + @property + def active(self) -> bool: + return self.state != MenuTransitionState.IDLE + + +def _clamp(x: float, lo: float = 0.0, hi: float = 1.0) -> float: + return max(lo, min(hi, x)) + + +def _lerp(a: float, b: float, t: float) -> float: + return a + (b - a) * t + + +def _ease_out_cubic(x: float) -> float: + x = _clamp(x) + return 1.0 - pow(1.0 - x, 3.0) + + +def _ease_emphasized(x: float) -> float: + # ease-in-out-cubic: gentle acceleration into the slide, graceful deceleration into place + x = _clamp(x) + if x < 0.5: + return 4.0 * x * x * x + return 1.0 - pow(-2.0 * x + 2.0, 3.0) / 2.0 + + +# Depth cues for the grid<->panel push/pop (see main.py for the same treatment). +TRANSITION_PARALLAX = 0.28 +TRANSITION_MAX_DIM = 0.5 +TRANSITION_SHADOW_W = 32 + + +class SettingsPill(Widget): + """A settings-grid button: icon + label on a rounded card, opens a sub-panel.""" + + BG = rl.Color(38, 40, 46, 255) + BG_PRESSED = rl.Color(54, 57, 65, 255) + BORDER = rl.Color(255, 255, 255, 38) + + def __init__(self, icon_path: str, label: str | Callable[[], str], on_click: Callable[[], None]): + super().__init__() + self._label = label + self._icon = gui_app.texture(icon_path, 80, 80, keep_aspect_ratio=True) if icon_path else None + self.set_click_callback(on_click) + + def _render(self, rect: rl.Rectangle): + rl.draw_rectangle_rounded(rect, 0.25, 20, self.BG_PRESSED if self.is_pressed else self.BG) + rl.draw_rectangle_rounded_lines_ex(rect, 0.25, 20, 2, self.BORDER) + + font = gui_app.font(FontWeight.MEDIUM) + label_size = 50 + label = self._label() if callable(self._label) else self._label + ts = measure_text_cached(font, label, label_size) + icon_w = self._icon.width if self._icon else 0 + gap = 24 if self._icon else 0 + group_w = icon_w + gap + ts.x + x = rect.x + (rect.width - group_w) / 2 + cy = rect.y + rect.height / 2 + + if self._icon: + rl.draw_texture(self._icon, int(x), int(cy - self._icon.height / 2), rl.WHITE) + x += icon_w + gap + rl.draw_text_ex(font, label, rl.Vector2(int(x), int(cy - ts.y / 2)), label_size, 0, rl.WHITE) + + +class SettingsHubLayout(Widget): + """Offroad Settings: a grid of pill buttons (the mockup look) that open the existing + IQ settings sub-panels. Back from a panel returns to the grid; back from the grid goes home. + """ + + def __init__(self): + super().__init__() + self._params = Params() + self._settings = IQSettingsLayout() # one instance: reuse its configured panels + wiring + self._header = self._child(ScreenHeader(lambda: tr("Settings"))) + self._on_close: Callable[[], None] | None = None + + self._mode = "grid" # "grid" | "panel" + self._cur_panel = None + + # Edge-swipe-back drag state (panel -> grid only) + self._swipe_start_pos: MousePos | None = None + self._swipe_active = False # past EDGE_SWIPE_ARM_DISTANCE, now tracking finger 1:1 + self._swipe_blocked = False # vertical movement won out before we armed; ignore rest of this touch + self._swipe_dx = 0.0 + # Release-settle animation (glide to grid/panel instead of snapping) + self._swipe_settling = False + self._swipe_settle_from = 0.0 + self._swipe_settle_to = 0.0 + self._swipe_settle_t = 0.0 + self._swipe_completing = False + self._version_text = _format_updater_description(self._params.get("UpdaterCurrentDescription")) + self._version_label = UnifiedLabel("", font_size=44, font_weight=FontWeight.MEDIUM, + text_color=rl.Color(185, 185, 190, 255), + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + wrap_text=False, scroll=True) + self._transition = MenuTransition() + + # Restart / power-off / always-offroad / night-mode bubbles in the grid header + self._restart_icon = gui_app.texture("icons/iq/restart.png", 48, 48, keep_aspect_ratio=True) + self._power_icon = gui_app.texture("icons/iq/power.png", 48, 48, keep_aspect_ratio=True) + self._offroad_icon = gui_app.texture("icons/iq/square-parking.png", 48, 48, keep_aspect_ratio=True) + self._night_icon = gui_app.texture("icons/iq/moon.png", 48, 48, keep_aspect_ratio=True) + self._bell_icon = gui_app.texture("icons/iq/bell.png", 48, 48, keep_aspect_ratio=True) + self._bell_slash_icon = gui_app.texture("icons/iq/bell-slash.png", 48, 48, keep_aspect_ratio=True) + self._restart_rect = rl.Rectangle(0, 0, 0, 0) + self._power_rect = rl.Rectangle(0, 0, 0, 0) + self._offroad_rect = rl.Rectangle(0, 0, 0, 0) + self._night_rect = rl.Rectangle(0, 0, 0, 0) + self._silent_rect = rl.Rectangle(0, 0, 0, 0) + + # Build the grid from the settings panels, skipping ones hidden from navigation (e.g. Cruise). + panels = self._settings._panels + hidden = self._settings._hidden_from_sidebar + self._grid_panels = [pt for pt in panels if pt not in hidden] + self._pills = [ + SettingsPill(panels[pt].icon, lambda p=pt: tr(panels[p].name), (lambda p=pt: self._open_panel(p))) + for pt in self._grid_panels + ] + + # Route the Toggles -> Cruise shortcut into this hub's panel view. + cruise_pt = next((pt for pt in panels if pt.name == "CRUISE"), None) + toggles_pt = next((pt for pt in panels if pt.name == "TOGGLES"), None) + if cruise_pt is not None and toggles_pt is not None: + toggles = panels[toggles_pt].instance + if hasattr(toggles, "set_cruise_panel_callback"): + toggles.set_cruise_panel_callback(lambda: self._open_panel(cruise_pt)) + + def set_callbacks(self, on_close: Callable[[], None] | None = None): + self._on_close = on_close + + def show_grid(self): + self._mode = "grid" + self._transition = MenuTransition() + + def set_current_panel(self, panel_type): + self._open_panel(panel_type) + + def show_event(self): + super().show_event() + self._mode = "grid" + self._transition = MenuTransition() + self._version_text = _format_updater_description(self._params.get("UpdaterCurrentDescription")) + + def _open_panel(self, panel_type): + if self._transition.active: + return + + from_grid = self._mode == "grid" + self._settings.set_current_panel(panel_type) + self._cur_panel = panel_type + if from_grid and not ui_state.started: + self._start_transition("grid", "panel", MenuTransitionState.PUSHING) + else: + self._mode = "panel" + + def _back_to_grid(self): + if self._mode == "panel" and not self._transition.active: + self._start_transition("panel", "grid", MenuTransitionState.POPPING) + + def _reset_swipe(self): + self._swipe_start_pos = None + self._swipe_active = False + self._swipe_blocked = False + self._swipe_dx = 0.0 + + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + super()._handle_mouse_event(mouse_event) + + if self._swipe_settling: + return # let the release animation finish before accepting a new gesture + + if mouse_event.slot != 0 or self._mode != "panel" or self._transition.active: + self._reset_swipe() + return + + if mouse_event.left_pressed: + if mouse_event.pos.x - self._rect.x <= EDGE_SWIPE_ZONE: + self._swipe_start_pos = mouse_event.pos + self._swipe_active = False + self._swipe_blocked = False + self._swipe_dx = 0.0 + else: + self._reset_swipe() + + elif self._swipe_start_pos is not None: + if mouse_event.left_down: + dx = mouse_event.pos.x - self._swipe_start_pos.x + dy = abs(mouse_event.pos.y - self._swipe_start_pos.y) + if not self._swipe_active and not self._swipe_blocked: + if dy > EDGE_SWIPE_BLOCK_VERTICAL and dy > dx: + self._swipe_blocked = True + elif dx > EDGE_SWIPE_ARM_DISTANCE: + self._swipe_active = True + if self._swipe_active: + self._swipe_dx = max(0.0, dx) + + elif mouse_event.left_released: + if self._swipe_active: + complete = self._swipe_dx > self._rect.width * EDGE_SWIPE_COMPLETE_FRACTION + self._begin_swipe_settle(complete) + self._reset_swipe() + + def _start_transition(self, from_mode: str, to_mode: str, state: MenuTransitionState): + self._transition = MenuTransition( + state=state, + t=0.0, + duration=SETTINGS_TRANSITION_SECONDS, + from_screen=from_mode, + to_screen=to_mode, + ) + + def _render(self, rect: rl.Rectangle): + if self._render_transition(rect): + return + + if self._swipe_settling: + if self._update_swipe_settle(): + self._render_swipe_drag(rect) + return + # settled this frame; fall through to render the (possibly switched) mode + elif self._swipe_active and self._mode == "panel": + self._render_swipe_drag(rect) + return + + self._render_mode(self._mode, rect) + + def _begin_swipe_settle(self, complete: bool): + # On release, glide from where the finger let go to fully-open (complete -> grid) or closed + # (cancel -> stay on panel) instead of snapping. + self._swipe_settle_from = self._swipe_dx + self._swipe_settle_to = self._rect.width if complete else 0.0 + self._swipe_completing = complete + self._swipe_settle_t = 0.0 + self._swipe_settling = True + + def _update_swipe_settle(self) -> bool: + """Advance the release animation. Returns True while still animating.""" + self._swipe_settle_t += rl.get_frame_time() + p = _clamp(self._swipe_settle_t / SWIPE_SETTLE_SECONDS) + self._swipe_dx = _lerp(self._swipe_settle_from, self._swipe_settle_to, _ease_out_cubic(p)) + if p < 1.0: + return True + self._swipe_settling = False + completing = self._swipe_completing + self._swipe_completing = False + self._swipe_dx = 0.0 + if completing: + self._mode = "grid" + self._transition = MenuTransition() + return False + + def _render_swipe_drag(self, rect: rl.Rectangle): + # Live, finger-following preview of the panel -> grid pop, mirroring _render_transition's + # POPPING geometry but driven 1:1 by touch position instead of eased elapsed time. + dx = min(self._swipe_dx, rect.width) + rl.draw_rectangle_rec(rect, TRANSITION_SURFACE_BG) + self._render_mode_surface_translated("grid", rect, dx - rect.width) + self._render_mode_surface_translated("panel", rect, dx) + + def _layout_rects(self, rect: rl.Rectangle) -> tuple[rl.Rectangle, rl.Rectangle]: + header_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - 2 * MARGIN, HEADER_HEIGHT) + content_y = header_rect.y + HEADER_HEIGHT + SPACING + content_rect = rl.Rectangle(rect.x + MARGIN, content_y, rect.width - 2 * MARGIN, + rect.y + rect.height - content_y - MARGIN) + return header_rect, content_rect + + def _render_mode(self, mode: str, rect: rl.Rectangle, interactive: bool = True): + if mode == "panel" and self._cur_panel is not None: + self._render_panel(rect, interactive) + else: + self._render_grid(rect, interactive) + + def _render_mode_surface(self, mode: str, rect: rl.Rectangle, interactive: bool = True): + bg_rect = rl.Rectangle( + rect.x - TRANSITION_SURFACE_OVERSCAN, + rect.y - TRANSITION_SURFACE_OVERSCAN, + rect.width + TRANSITION_SURFACE_OVERSCAN * 2, + rect.height + TRANSITION_SURFACE_OVERSCAN * 2, + ) + rl.draw_rectangle_rec(bg_rect, TRANSITION_SURFACE_BG) + self._render_mode(mode, rect, interactive) + + def _render_mode_surface_translated(self, mode: str, rect: rl.Rectangle, x_offset: float): + translated_rect = rl.Rectangle(round(rect.x + x_offset), rect.y, rect.width, rect.height) + self._render_mode_surface(mode, translated_rect, interactive=False) + + def _render_transition(self, rect: rl.Rectangle) -> bool: + if not self._transition.active: + return False + + from_mode = self._transition.from_screen + to_mode = self._transition.to_screen + if from_mode is None or to_mode is None: + self._finish_transition() + return False + from_mode = str(from_mode) + to_mode = str(to_mode) + + self._transition.t += rl.get_frame_time() + if self._transition.t >= self._transition.duration: + self._finish_transition() + return False + + p = _clamp(self._transition.t / self._transition.duration) + e = _ease_emphasized(p) + w = rect.width + pushing = self._transition.state == MenuTransitionState.PUSHING + + # The incoming card slides its full width on top; the other page parallaxes a fraction and dims. + if pushing: + top_mode, back_mode = to_mode, from_mode + top_x = _lerp(w, 0.0, e) + back_x = _lerp(0.0, -w * TRANSITION_PARALLAX, e) + back_dim = int(_lerp(0.0, TRANSITION_MAX_DIM, e) * 255) + else: + top_mode, back_mode = from_mode, to_mode + top_x = _lerp(0.0, w, e) + back_x = _lerp(-w * TRANSITION_PARALLAX, 0.0, e) + back_dim = int(_lerp(TRANSITION_MAX_DIM, 0.0, e) * 255) + + back_rect = rl.Rectangle(round(rect.x + back_x), rect.y, rect.width, rect.height) + + rl.draw_rectangle_rec(rect, TRANSITION_SURFACE_BG) + self._render_mode_surface_translated(back_mode, rect, back_x) + if back_dim > 0: + rl.draw_rectangle_rec(back_rect, rl.Color(0, 0, 0, back_dim)) + # soft shadow cast by the top card's leading edge onto the page behind + edge_x = round(rect.x + top_x) + if edge_x > rect.x: + sh = int(min(TRANSITION_SHADOW_W, edge_x - rect.x)) + rl.draw_rectangle_gradient_h(edge_x - sh, int(rect.y), sh, int(rect.height), + rl.Color(0, 0, 0, 0), rl.Color(0, 0, 0, 120)) + self._render_mode_surface_translated(top_mode, rect, top_x) + return True + + def _finish_transition(self): + if self._transition.to_screen is not None: + self._mode = str(self._transition.to_screen) + self._transition = MenuTransition() + + def _render_widget(self, widget: Widget, rect: rl.Rectangle, interactive: bool): + if interactive: + widget.render(rect) + return + + enabled = widget._enabled + widget.set_enabled(False) + try: + widget.render(rect) + finally: + widget.set_enabled(enabled) + + def _render_panel(self, rect: rl.Rectangle, interactive: bool = True): + header_rect, content_rect = self._layout_rects(rect) + + self._header.set_title(tr(self._settings._panels[self._cur_panel].name)) + self._header.set_on_back(self._back_to_grid) + self._header.set_title_offset(0) + self._render_widget(self._header, header_rect, interactive) + + panel = self._settings._panels[self._settings._current_panel].instance + enabled = panel._enabled + if not interactive: + panel.set_enabled(False) + try: + self._settings._draw_current_panel(content_rect) + finally: + if not interactive: + panel.set_enabled(enabled) + + def _render_grid(self, rect: rl.Rectangle, interactive: bool = True): + header_rect, content_rect = self._layout_rects(rect) + + # Grid landing + title = tr("Settings") + title_offset = 5 * BUBBLE_SIZE + 4 * 18 + 36 + self._header.set_title(title) + self._header.set_on_back(self._on_close) + self._header.set_title_offset(title_offset) # make room for the bubbles + self._render_widget(self._header, header_rect, interactive) + + # Restart / power-off / always-offroad bubbles, just right of the back button + cy = header_rect.y + HEADER_HEIGHT / 2 + bx = header_rect.x + BACK_BTN_SIZE + 24 + self._restart_rect = rl.Rectangle(bx, cy - BUBBLE_SIZE / 2, BUBBLE_SIZE, BUBBLE_SIZE) + self._power_rect = rl.Rectangle(bx + BUBBLE_SIZE + 18, cy - BUBBLE_SIZE / 2, BUBBLE_SIZE, BUBBLE_SIZE) + self._offroad_rect = rl.Rectangle(bx + 2 * (BUBBLE_SIZE + 18), cy - BUBBLE_SIZE / 2, BUBBLE_SIZE, BUBBLE_SIZE) + self._night_rect = rl.Rectangle(bx + 3 * (BUBBLE_SIZE + 18), cy - BUBBLE_SIZE / 2, BUBBLE_SIZE, BUBBLE_SIZE) + self._silent_rect = rl.Rectangle(bx + 4 * (BUBBLE_SIZE + 18), cy - BUBBLE_SIZE / 2, BUBBLE_SIZE, BUBBLE_SIZE) + mouse = rl.get_mouse_position() + for r, icon in ((self._restart_rect, self._restart_icon), (self._power_rect, self._power_icon)): + pressed = self.is_pressed and rl.check_collision_point_rec(mouse, r) + rl.draw_circle(int(r.x + BUBBLE_SIZE / 2), int(cy), BUBBLE_SIZE / 2, BUBBLE_RED_PRESSED if pressed else BUBBLE_RED) + rl.draw_texture(icon, int(r.x + (BUBBLE_SIZE - icon.width) / 2), int(cy - icon.height / 2), rl.WHITE) + # Always Offroad bubble (grey when off, teal when on) + offroad_active = ui_state.params.get_bool("IQAlwaysOffroad") + pressed = self.is_pressed and rl.check_collision_point_rec(mouse, self._offroad_rect) + offroad_color = (BUBBLE_TEAL_PRESSED if pressed else BUBBLE_TEAL) if offroad_active else (BUBBLE_GREY_PRESSED if pressed else BUBBLE_GREY) + rl.draw_circle(int(self._offroad_rect.x + BUBBLE_SIZE / 2), int(cy), BUBBLE_SIZE / 2, offroad_color) + rl.draw_texture(self._offroad_icon, + int(self._offroad_rect.x + (BUBBLE_SIZE - self._offroad_icon.width) / 2), + int(cy - self._offroad_icon.height / 2), rl.WHITE) + # Night Mode bubble (grey when off, teal when on) + night_active = ui_state.params.get_bool("NightMode") + pressed = self.is_pressed and rl.check_collision_point_rec(mouse, self._night_rect) + night_color = (BUBBLE_TEAL_PRESSED if pressed else BUBBLE_TEAL) if night_active else (BUBBLE_GREY_PRESSED if pressed else BUBBLE_GREY) + rl.draw_circle(int(self._night_rect.x + BUBBLE_SIZE / 2), int(cy), BUBBLE_SIZE / 2, night_color) + rl.draw_texture(self._night_icon, + int(self._night_rect.x + (BUBBLE_SIZE - self._night_icon.width) / 2), + int(cy - self._night_icon.height / 2), rl.WHITE) + + # Silent Mode bubble (grey bell when off, red bell-with-slash when on) + silent_active = ui_state.params.get_bool("IQAlertSilence") + pressed = self.is_pressed and rl.check_collision_point_rec(mouse, self._silent_rect) + silent_color = (BUBBLE_RED_PRESSED if pressed else BUBBLE_RED) if silent_active else (BUBBLE_GREY_PRESSED if pressed else BUBBLE_GREY) + silent_icon = self._bell_slash_icon if silent_active else self._bell_icon + rl.draw_circle(int(self._silent_rect.x + BUBBLE_SIZE / 2), int(cy), BUBBLE_SIZE / 2, silent_color) + rl.draw_texture(silent_icon, + int(self._silent_rect.x + (BUBBLE_SIZE - silent_icon.width) / 2), + int(cy - silent_icon.height / 2), rl.WHITE) + + # Small version label, top-right of the header row. Its scroll viewport + # starts after the title, so long branch text does not clip at the bubbles. + font = gui_app.font(FontWeight.MEDIUM) + title_font = gui_app.font(FontWeight.BOLD) + ver_fs = 44 + title_size = measure_text_cached(title_font, title, 64) + ver_size = measure_text_cached(font, self._version_text, ver_fs) + title_x = header_rect.x + BACK_BTN_SIZE + 36 + title_offset + version_left = title_x + title_size.x + 36 + version_right = header_rect.x + header_rect.width + version_rect = rl.Rectangle(version_left, header_rect.y, max(0, version_right - version_left), HEADER_HEIGHT) + if version_rect.width > 0: + if ver_size.x <= version_rect.width: + rl.draw_text_ex(font, self._version_text, + rl.Vector2(int(header_rect.x + header_rect.width - ver_size.x), + int(header_rect.y + (HEADER_HEIGHT - ver_size.y) / 2)), + ver_fs, 0, rl.Color(185, 185, 190, 255)) + else: + self._version_label.set_text(self._version_text) + self._version_label.render(version_rect) + + rows = (len(self._pills) + COLUMNS - 1) // COLUMNS + pill_w = (content_rect.width - PILL_GAP * (COLUMNS - 1)) / COLUMNS + pill_h = max(PILL_MIN_HEIGHT, (content_rect.height - PILL_GAP * (rows - 1)) / rows) + for i, pill in enumerate(self._pills): + col = i % COLUMNS + row = i // COLUMNS + px = content_rect.x + col * (pill_w + PILL_GAP) + py = content_rect.y + row * (pill_h + PILL_GAP) + self._render_widget(pill, rl.Rectangle(px, py, pill_w, pill_h), interactive) + + def _handle_mouse_release(self, mouse_pos: MousePos): + if self._mode != "grid" or self._transition.active: + return + if rl.check_collision_point_rec(mouse_pos, self._restart_rect): + self._reboot_prompt() + elif rl.check_collision_point_rec(mouse_pos, self._power_rect): + self._power_off_prompt() + elif rl.check_collision_point_rec(mouse_pos, self._offroad_rect): + self._toggle_offroad_prompt() + elif rl.check_collision_point_rec(mouse_pos, self._night_rect): + ui_state.params.put_bool("NightMode", not ui_state.params.get_bool("NightMode")) + elif rl.check_collision_point_rec(mouse_pos, self._silent_rect): + ui_state.params.put_bool("IQAlertSilence", not ui_state.params.get_bool("IQAlertSilence")) + + def _reboot_prompt(self): + if ui_state.engaged: + gui_app.set_modal_overlay(alert_dialog(tr("Disengage to Reboot"))) + return + dialog = ConfirmDialog(tr("Are you sure you want to reboot?"), tr("Reboot")) + gui_app.set_modal_overlay(dialog, callback=self._perform_reboot) + + def _perform_reboot(self, result: int): + if not ui_state.engaged and result == DialogResult.CONFIRM: + self._params.put_bool_nonblocking("DoReboot", True) + + def _power_off_prompt(self): + if ui_state.engaged: + gui_app.set_modal_overlay(alert_dialog(tr("Disengage to Power Off"))) + return + dialog = ConfirmDialog(tr("Are you sure you want to power off?"), tr("Power Off")) + gui_app.set_modal_overlay(dialog, callback=self._perform_power_off) + + def _perform_power_off(self, result: int): + if not ui_state.engaged and result == DialogResult.CONFIRM: + self._params.put_bool_nonblocking("DoShutdown", True) + + def _toggle_offroad_prompt(self): + if ui_state.engaged: + gui_app.set_modal_overlay(alert_dialog(tr("Disengage before forcing offroad"))) + return + active = ui_state.params.get_bool("IQAlwaysOffroad") + msg = tr("Leave forced-offroad mode now?") if active else tr("Switch the device into forced-offroad mode?") + + def _confirm(result: int): + if result == DialogResult.CONFIRM and not ui_state.engaged: + ui_state.params.put_bool("IQAlwaysOffroad", not active) + + gui_app.set_modal_overlay(ConfirmDialog(msg, tr("Confirm")), callback=_confirm) diff --git a/iqpilot/selfdrive/ui/layouts/sidebar.py b/iqpilot/selfdrive/ui/layouts/sidebar.py new file mode 100644 index 000000000..147beab4d --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/sidebar.py @@ -0,0 +1,325 @@ +import pyray as rl +import time +from dataclasses import dataclass +from collections.abc import Callable +from iqpilot.cereal import log +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.ui.lib.wifi_ssid import current_ssid +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.multilang import tr, tr_noop +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +SIDEBAR_WIDTH = 300 +METRIC_HEIGHT = 120 +METRIC_WIDTH = 252 +METRIC_MARGIN = 24 + +CARD_GAP = 16 +STATUS_DOT_CENTER_X = 36 +STATUS_TEXT_X = 66 +STATUS_TEXT_RIGHT_MARGIN = 20 +STATUS_LABEL_SIZE = 26 +STATUS_VALUE_SIZE = 36 +STATUS_LINE_GAP = 2 +NETWORK_RECT = rl.Rectangle(24, 18, 252, 76) +SETTINGS_BTN = rl.Rectangle(24, 112, 252, 112) +HOME_BTN = rl.Rectangle(60, 860, 180, 180) + +ThermalStatus = log.DeviceState.ThermalStatus +NetworkType = log.DeviceState.NetworkType + + +# Color scheme +class Colors: + WHITE = rl.WHITE + WHITE_DIM = rl.Color(255, 255, 255, 85) + GRAY = rl.Color(84, 84, 84, 255) + + # Keep these in parity with the offroad home status indicators. + GOOD = rl.Color(16, 185, 169, 255) + WARNING = rl.Color(245, 166, 35, 255) + DANGER = rl.Color(226, 72, 58, 255) + + # UI elements + CARD_BG = rl.Color(28, 30, 36, 255) + CARD_BG_PRESSED = rl.Color(50, 53, 61, 255) + METRIC_BORDER = rl.Color(255, 255, 255, 22) + BOOKMARK_BG = CARD_BG + BOOKMARK_BG_PRESSED = CARD_BG_PRESSED + BUTTON_NORMAL = rl.WHITE + BUTTON_PRESSED = rl.Color(255, 255, 255, 166) + + +NETWORK_TYPES = { + NetworkType.none: tr_noop("--"), + NetworkType.wifi: tr_noop("Wi-Fi"), + NetworkType.ethernet: tr_noop("ETH"), + NetworkType.cell2G: tr_noop("2G"), + NetworkType.cell3G: tr_noop("3G"), + NetworkType.cell4G: tr_noop("LTE"), + NetworkType.cell5G: tr_noop("5G"), +} + + +@dataclass(slots=True) +class MetricData: + label: str + value: str + color: rl.Color + + def update(self, label: str, value: str, color: rl.Color): + self.label = label + self.value = value + self.color = color + + +class Sidebar(Widget): + def __init__(self): + Widget.__init__(self) + self._net_type = NETWORK_TYPES.get(NetworkType.none) + self._net_strength = 0 + + self._temp_status = MetricData(tr_noop("TEMP"), tr_noop("GOOD"), Colors.GOOD) + self._panda_status = MetricData(tr_noop("VEHICLE"), tr_noop("ONLINE"), Colors.GOOD) + self._connect_status = MetricData(tr_noop("KONN3KT"), tr_noop("OFFLINE"), Colors.WARNING) + self._recording_audio = False + + self._home_img = gui_app.texture("images/button_home.png", HOME_BTN.width, HOME_BTN.height) + self._konn3kt_home_logo = gui_app.texture("icons_mici/settings/konn3kt_icon.png", 104, 104) + self._settings_img = gui_app.texture("icons/iq/tile_settings.png", 92, 92, keep_aspect_ratio=True) + self._mic_img = gui_app.texture("icons_mici/microphone.png", 26, 30, keep_aspect_ratio=True) + self._live_view_img = gui_app.texture("icons/live_view.png", 38, 32, keep_aspect_ratio=True) + self._live_streaming = False + _net_base = "icons_mici/settings/network/" + self._cell_strength_icons = [ + gui_app.texture(f"{_net_base}cell_strength_none.png", 56, 56, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_low.png", 56, 56, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_low.png", 56, 56, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_medium.png", 56, 56, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_high.png", 56, 56, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}cell_strength_full.png", 56, 56, keep_aspect_ratio=True), + ] + self._wifi_strength_icons = [ + gui_app.texture(f"{_net_base}wifi_strength_none.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_low.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_low.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_medium.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_full.png", 64, 64, keep_aspect_ratio=True), + gui_app.texture(f"{_net_base}wifi_strength_full.png", 64, 64, keep_aspect_ratio=True), + ] + self._mic_indicator_rect = rl.Rectangle(0, 0, 0, 0) + self._font_regular = gui_app.font(FontWeight.MEDIUM) + self._font_bold = gui_app.font(FontWeight.BOLD) + + # Callbacks + self._on_settings_click: Callable | None = None + self._on_flag_click: Callable | None = None + self._open_settings_callback: Callable | None = None + + def set_callbacks(self, on_settings: Callable | None = None, on_flag: Callable | None = None, + open_settings: Callable | None = None): + self._on_settings_click = on_settings + self._on_flag_click = on_flag + self._open_settings_callback = open_settings + + def _render(self, rect: rl.Rectangle): + # Background + rl.draw_rectangle_rec(rect, rl.BLACK) + + self._draw_buttons(rect) + self._draw_network_indicator(rect) + self._draw_metrics(rect) + + def _update_state(self): + sm = ui_state.sm + device_state = sm['deviceState'] + + self._recording_audio = ui_state.recording_audio + # Konn3kt Live View is streaming to a viewer (hephaestusd sets this while a session is live) + self._live_streaming = ui_state.params.get_bool("IsLiveStreaming") + self._update_network_status(device_state) + self._update_temperature_status(device_state) + self._update_connection_status(device_state) + self._update_panda_status() + + def _update_network_status(self, device_state): + self._net_type = NETWORK_TYPES.get(device_state.networkType.raw, tr_noop("Unknown")) + strength = device_state.networkStrength + self._net_strength = max(0, min(5, strength.raw + 1)) if strength.raw > 0 else 0 + + def _update_temperature_status(self, device_state): + thermal_status = device_state.thermalStatus + + if thermal_status == ThermalStatus.green: + self._temp_status.update(tr_noop("TEMP"), tr_noop("GOOD"), Colors.GOOD) + elif thermal_status == ThermalStatus.yellow: + self._temp_status.update(tr_noop("TEMP"), tr_noop("OK"), Colors.WARNING) + else: + self._temp_status.update(tr_noop("TEMP"), tr_noop("HIGH"), Colors.DANGER) + + def _update_connection_status(self, device_state): + last_ping = device_state.lastAthenaPingTime + if last_ping == 0: + self._connect_status.update(tr_noop("KONN3KT"), tr_noop("OFFLINE"), Colors.WARNING) + elif time.monotonic_ns() - last_ping < 80_000_000_000: # 80 seconds in nanoseconds + self._connect_status.update(tr_noop("KONN3KT"), tr_noop("ONLINE"), Colors.GOOD) + else: + self._connect_status.update(tr_noop("KONN3KT"), tr_noop("ERROR"), Colors.DANGER) + + def _update_panda_status(self): + if ui_state.panda_type == log.PandaState.PandaType.unknown: + self._panda_status.update(tr_noop("VEHICLE"), tr_noop("NO PANDA"), Colors.DANGER) + else: + self._panda_status.update(tr_noop("VEHICLE"), tr_noop("ONLINE"), Colors.GOOD) + + def _handle_mouse_release(self, mouse_pos: MousePos): + if rl.check_collision_point_rec(mouse_pos, SETTINGS_BTN): + if self._on_settings_click: + self._on_settings_click() + elif rl.check_collision_point_rec(mouse_pos, HOME_BTN) and ui_state.started: + if self._on_flag_click: + self._on_flag_click() + elif self._recording_audio and rl.check_collision_point_rec(mouse_pos, self._mic_indicator_rect): + if self._open_settings_callback: + self._open_settings_callback() + + def _draw_buttons(self, rect: rl.Rectangle): + mouse_pos = rl.get_mouse_position() + mouse_down = self.is_pressed and rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT) + + # Settings button + settings_down = mouse_down and rl.check_collision_point_rec(mouse_pos, SETTINGS_BTN) + rl.draw_rectangle_rounded(SETTINGS_BTN, 0.28, 18, Colors.CARD_BG_PRESSED if settings_down else Colors.CARD_BG) + rl.draw_rectangle_rounded_lines_ex(SETTINGS_BTN, 0.28, 18, 2, rl.Color(255, 255, 255, 28)) + tint = Colors.BUTTON_PRESSED if settings_down else Colors.BUTTON_NORMAL + rl.draw_texture(self._settings_img, + int(SETTINGS_BTN.x + (SETTINGS_BTN.width - self._settings_img.width) / 2), + int(SETTINGS_BTN.y + (SETTINGS_BTN.height - self._settings_img.height) / 2), + tint) + + # Home/Flag button + flag_pressed = mouse_down and rl.check_collision_point_rec(mouse_pos, HOME_BTN) + if ui_state.started: + center_x = HOME_BTN.x + HOME_BTN.width / 2 + center_y = HOME_BTN.y + HOME_BTN.height / 2 + radius = min(HOME_BTN.width, HOME_BTN.height) * 0.5 + fill = Colors.BOOKMARK_BG_PRESSED if flag_pressed else Colors.BOOKMARK_BG + tint = Colors.BUTTON_PRESSED if flag_pressed else Colors.BUTTON_NORMAL + rl.draw_circle(int(center_x), int(center_y), radius, fill) + self._draw_bookmark_icon(center_x, center_y, tint, fill) + else: + center_x = HOME_BTN.x + HOME_BTN.width / 2 + center_y = HOME_BTN.y + HOME_BTN.height / 2 + radius = min(HOME_BTN.width, HOME_BTN.height) * 0.47 + circle_color = Colors.BUTTON_PRESSED if mouse_down and rl.check_collision_point_rec(mouse_pos, HOME_BTN) else Colors.BUTTON_NORMAL + rl.draw_circle(int(center_x), int(center_y), radius, circle_color) + + logo_x = center_x - self._konn3kt_home_logo.width / 2 + logo_y = center_y - self._konn3kt_home_logo.height / 2 + rl.draw_texture(self._konn3kt_home_logo, int(logo_x), int(logo_y), rl.WHITE) + + # Status indicators (right-anchored row): Live View (when streaming to konn3kt) sits to the LEFT + # of the Microphone (when recording audio). Each shows independently. Mic keeps its tap target. + slot_w, slot_h, gap = 70, 38, 12 + slot_y = rect.y + 240 + row_right = rect.x + rect.width - 36 # right edge of the rightmost slot + indicators = [] + if self._live_streaming: + indicators.append(("live", self._live_view_img)) + if self._recording_audio: + indicators.append(("mic", self._mic_img)) + + total_w = len(indicators) * slot_w + max(0, len(indicators) - 1) * gap + slot_x = row_right - total_w + for kind, img in indicators: + slot = rl.Rectangle(slot_x, slot_y, slot_w, slot_h) + icon_x = int(slot.x + (slot_w - img.width) / 2) + icon_y = int(slot.y + (slot_h - img.height) / 2) + if kind == "mic": + self._mic_indicator_rect = slot + mic_pressed = mouse_down and rl.check_collision_point_rec(mouse_pos, slot) + tint = rl.Color(255, 255, 255, 150) if mic_pressed else rl.WHITE + rl.draw_texture(img, icon_x, icon_y, tint) + else: + rl.draw_texture(img, icon_x, icon_y, rl.WHITE) + slot_x += slot_w + gap + + def _draw_network_indicator(self, rect: rl.Rectangle): + on_wifi = self._net_type == NETWORK_TYPES[NetworkType.wifi] + net_text = current_ssid(on_wifi) or tr(self._net_type) + icon_list = self._wifi_strength_icons if self._net_type in (NETWORK_TYPES[NetworkType.wifi], NETWORK_TYPES[NetworkType.ethernet]) else self._cell_strength_icons + signal_icon = icon_list[min(self._net_strength, len(icon_list) - 1)] + text_size = measure_text_cached(self._font_regular, net_text, 44) + content_w = signal_icon.width + 14 + text_size.x + + icon_x = NETWORK_RECT.x + (NETWORK_RECT.width - content_w) / 2 + icon_y = NETWORK_RECT.y + (NETWORK_RECT.height - signal_icon.height) / 2 + rl.draw_texture(signal_icon, int(icon_x), int(icon_y), Colors.WHITE) + + text_x = icon_x + signal_icon.width + 14 + text_y = NETWORK_RECT.y + (NETWORK_RECT.height - text_size.y) / 2 + rl.draw_text_ex(self._font_regular, net_text, rl.Vector2(int(text_x), int(text_y)), 44, 0, rl.Color(215, 215, 215, 255)) + + def _draw_metrics(self, rect: rl.Rectangle): + metric_count = 3 + metrics_height = metric_count * METRIC_HEIGHT + (metric_count - 1) * CARD_GAP + available_top = SETTINGS_BTN.y + SETTINGS_BTN.height + available_height = HOME_BTN.y - available_top + first_metric_y = available_top + max(0, (available_height - metrics_height) / 2) + metrics = [ + (self._temp_status, first_metric_y), + (self._panda_status, first_metric_y + METRIC_HEIGHT + CARD_GAP), + (self._connect_status, first_metric_y + 2 * (METRIC_HEIGHT + CARD_GAP)), + ] + + for metric, y_offset in metrics: + self._draw_metric(rect, metric, rect.y + y_offset) + + def _draw_metric(self, rect: rl.Rectangle, metric: MetricData, y: float): + metric_rect = rl.Rectangle(rect.x + METRIC_MARGIN, y, METRIC_WIDTH, METRIC_HEIGHT) + rl.draw_rectangle_rounded(metric_rect, 0.28, 16, Colors.CARD_BG) + rl.draw_rectangle_rounded_lines_ex(metric_rect, 0.28, 16, 2, Colors.METRIC_BORDER) + + dot_r = 11 + label = tr(metric.label) + value = tr(metric.value) + dot_x = metric_rect.x + STATUS_DOT_CENTER_X + text_x = metric_rect.x + STATUS_TEXT_X + text_col_w = metric_rect.width - STATUS_TEXT_X - STATUS_TEXT_RIGHT_MARGIN + + label_size = STATUS_LABEL_SIZE + value_size = STATUS_VALUE_SIZE + label_text_size = measure_text_cached(self._font_regular, label, label_size) + value_text_size = measure_text_cached(self._font_bold, value, value_size) + while value_text_size.x > text_col_w and value_size > 30: + value_size -= 2 + value_text_size = measure_text_cached(self._font_bold, value, value_size) + + text_h = label_text_size.y + value_text_size.y + STATUS_LINE_GAP + label_y = metric_rect.y + (metric_rect.height - text_h) / 2 + value_y = label_y + label_text_size.y + STATUS_LINE_GAP + dot_y = label_y + text_h / 2 + rl.draw_circle(int(dot_x), int(dot_y), dot_r, metric.color) + + rl.begin_scissor_mode(int(text_x), int(metric_rect.y), int(text_col_w), int(metric_rect.height)) + rl.draw_text_ex(self._font_regular, label, rl.Vector2(int(text_x), int(label_y)), label_size, 0, rl.Color(185, 185, 190, 255)) + rl.draw_text_ex(self._font_bold, value, rl.Vector2(int(text_x), int(value_y)), value_size, 0, Colors.WHITE) + rl.end_scissor_mode() + + def _draw_bookmark_icon(self, center_x: float, center_y: float, tint: rl.Color, cutout_color: rl.Color): + icon_w = 78 + icon_h = 96 + icon_rect = rl.Rectangle(center_x - icon_w / 2, center_y - icon_h / 2, icon_w, icon_h) + rl.draw_rectangle_rounded(icon_rect, 0.18, 14, tint) + + notch_top = icon_rect.y + icon_rect.height - 31 + notch_left = icon_rect.x + 10 + notch_right = icon_rect.x + icon_rect.width - 10 + notch_bottom = icon_rect.y + icon_rect.height + rl.draw_triangle( + rl.Vector2(center_x, notch_top), + rl.Vector2(notch_left, notch_bottom), + rl.Vector2(notch_right, notch_bottom), + cutout_color, + ) diff --git a/iqpilot/selfdrive/ui/layouts/stats.py b/iqpilot/selfdrive/ui/layouts/stats.py new file mode 100644 index 000000000..e7f771e30 --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/stats.py @@ -0,0 +1,32 @@ +import pyray as rl +from collections.abc import Callable + +from iqpilot.ui.layouts.settings.drive_history import TripsLayout +from iqpilot.selfdrive.ui.widgets.screen_header import ScreenHeader, HEADER_HEIGHT +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import Widget + +MARGIN = 40 +SPACING = 25 + + +class StatsLayout(Widget): + """Offroad Stats screen: drive stats (miles / time / routes) with a back header.""" + + def __init__(self): + super().__init__() + self._header = self._child(ScreenHeader(lambda: tr("Stats"))) + self._trips = self._child(TripsLayout()) + + def set_on_back(self, cb: Callable[[], None]) -> None: + self._header.set_on_back(cb) + + def _render(self, rect: rl.Rectangle): + header_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - 2 * MARGIN, HEADER_HEIGHT) + self._header.render(header_rect) + + content_y = header_rect.y + HEADER_HEIGHT + SPACING + content_rect = rl.Rectangle( + rect.x + MARGIN, content_y, rect.width - 2 * MARGIN, rect.y + rect.height - content_y - MARGIN + ) + self._trips.render(content_rect) diff --git a/iqpilot/selfdrive/ui/layouts/video_player.py b/iqpilot/selfdrive/ui/layouts/video_player.py new file mode 100644 index 000000000..3fba9e328 --- /dev/null +++ b/iqpilot/selfdrive/ui/layouts/video_player.py @@ -0,0 +1,1017 @@ +from __future__ import annotations + +import os +import shutil +import signal +import subprocess +import tempfile +import threading +import time +import numpy as np +import pyray as rl +from collections.abc import Callable +from dataclasses import dataclass + +from iqpilot.selfdrive.ui.lib.local_routes import local_route_audio_paths +from iqpilot.selfdrive.ui.lib import cloud_routes_shim as cloud +from iqpilot.selfdrive.ui.ui_state import device + +from iqpilot.selfdrive.ui.widgets.screen_header import ScreenHeader, HEADER_HEIGHT +from iqpilot.selfdrive.ui.lib.local_routes import ( + CAMERA_LABELS, + compute_route_distance_miles, + get_local_route, + local_route_camera_paths, +) +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +MARGIN = 40 +SPACING = 25 +PLAY_R = 70 +SKIP_R = 56 +SKIP_OFFSET = PLAY_R + 64 + SKIP_R +SHARE_R = 40 +CAM_TAB_H = 66 +CAM_TAB_GAP = 14 +AUTOHIDE_S = 3.0 # seconds of no touch before the transport + scrubber fade out +STALE_FRAME_TOL = 120 # frames: accept a decoded frame only if within this of the playhead + +SCREEN_BG = rl.Color(14, 15, 18, 255) +SCREEN_BORDER = rl.Color(255, 255, 255, 26) +TEAL = rl.Color(16, 185, 169, 255) +GLYPH_DARK = rl.Color(8, 16, 16, 255) +MUTED = rl.Color(160, 160, 165, 255) +TRACK_BG = rl.Color(50, 53, 60, 255) +BTN_BG = rl.Color(38, 40, 46, 255) +SKIP_BG = rl.Color(26, 28, 33, 210) +VIDEO_FPS = 20.0 +NOMINAL_SEGMENT_FRAMES = int(VIDEO_FPS * 60) + + +def _find_bin(name: str) -> str | None: + """Locate a helper binary robustly — the UI process's PATH may not include /usr/local/bin.""" + found = shutil.which(name) + if found: + return found + for p in (f"/usr/local/bin/{name}", f"/usr/bin/{name}"): + if os.path.exists(p): + return p + return None + + +def _find_hwdec() -> str | None: + """The Venus HW HEVC decoder (built only on-device). Absent on PC/open-source -> ffmpeg SW.""" + try: + from iqpilot.common.basedir import BASEDIR + path = os.path.join(BASEDIR, "iqpilot", "system", "loggerd", "encoder", "v4l_decode") + return path if os.path.exists(path) else None + except Exception: + return None + + +@dataclass +class _DecodedFrame: + global_frame: int + frame: np.ndarray + + +# Cap the read-ahead buffer. Kept modest (~64MB, ~1.5s at 20fps) rather than large: this device's +# offroad memory headroom is thin, and an oversized buffer left playback prone to stalling when a +# periodic background task spiked memory during long sessions. +PREBUFFER_BYTES = 64_000_000 +SEEK_AHEAD_FRAMES = 150 # target jumps beyond this restart ffmpeg instead of waiting + + +class _CloudProxy: + """Local TLS-terminating proxy for cloud playback: the device ffmpeg has no https/tls protocol, + so signed konn3kt segment URLs are served to it as http://127.0.0.1:{port}/{index} and this proxy + streams the upstream https body through (Range passthrough for seeks).""" + + def __init__(self, urls: list[str]): + import http.server + import requests + + proxy = self + self._session = requests.Session() # TLS/conn reuse across range requests (seek bisection) + + class Handler(http.server.BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + + def log_message(self, *a): + pass + + def do_GET(self): + try: + idx = int(self.path.strip("/").split("?")[0]) + url = proxy._urls[idx] + except Exception: + self.send_error(404) + return + headers = {} + rng = self.headers.get("Range") + if rng: + headers["Range"] = rng + try: + up = proxy._session.get(url, headers=headers, stream=True, timeout=20) + except Exception: + self.send_error(502) + return + try: + self.send_response(up.status_code) + for h in ("Content-Length", "Content-Range", "Accept-Ranges", "Content-Type"): + if h in up.headers: + self.send_header(h, up.headers[h]) + self.end_headers() + for chunk in up.iter_content(chunk_size=65536): + if chunk: + self.wfile.write(chunk) + except Exception: + pass + finally: + up.close() + + self._urls = list(urls) + self._server = http.server.ThreadingHTTPServer(("127.0.0.1", 0), Handler) + self._server.daemon_threads = True + self.port = self._server.server_address[1] + threading.Thread(target=self._server.serve_forever, daemon=True).start() + + def local_urls(self) -> list[str]: + return [f"http://127.0.0.1:{self.port}/{i}" for i in range(len(self._urls))] + + def stop(self) -> None: + try: + self._server.shutdown() + self._server.server_close() + except Exception: + pass + + +class _StreamFrameWorker: + """Streams decoded frames sequentially from ffmpeg into a prebuffer for smooth playback. + + Handles any source — road qcamera.ts (small, software-decodes at hundreds of fps), wide/driver + full-res .hevc, or cloud HTTP URLs — through ffmpeg's concat demuxer. One long-lived ffmpeg + decodes forward from the playhead while a reader thread fills a bounded frame buffer a few seconds + ahead; small forward moves are served from the buffer, a backward or far-forward seek restarts + ffmpeg at the new offset. Replaces the old per-frame FrameReader/HTTP-seek workers (4s stalls).""" + + def __init__(self, sources: list[str], status: str | None = None): + self._proxy: _CloudProxy | None = None + if sources and sources[0].startswith(("http://", "https://")): + self._proxy = _CloudProxy(sources) + sources = self._proxy.local_urls() + self._sources = list(sources) + self._ffmpeg = _find_bin("ffmpeg") + self._ffprobe = _find_bin("ffprobe") + # Hardware-decode full-res .hevc (wide/driver) via the Venus decoder; road qcam .ts stays SW + # (already 270fps). Offroad the Venus decoder + GPU are idle. + self._hwdec = _find_hwdec() if self._sources and self._sources[0].endswith(".hevc") else None + self.total_frames = max(1, len(self._sources) * NOMINAL_SEGMENT_FRAMES) + self._dims: tuple[int, int] | None = None + self._prebuffer = 60 + self._playlist = self._write_playlist() + self._hw_playlist: str | None = None # per-seek playlist starting at the target segment (HW path) + + self._cv = threading.Condition() + self._status_lock = threading.Lock() + self._buf: dict[int, np.ndarray] = {} + self._base = 0 # global index of the next frame ffmpeg will emit + self._run_start = 0 # global index where the current ffmpeg run began + self._target = 0 + self._need_seek = True + self._seek_to = 0 + self._stop = False + self._status = status or tr("Loading video") + self._thread = threading.Thread(target=self._run, daemon=True) + self._thread.start() + + def _write_playlist(self, start_idx: int = 0) -> str | None: + srcs = self._sources[start_idx:] + if not srcs: + return None + fd, path = tempfile.mkstemp(suffix=".txt", prefix="iqroute_") + with os.fdopen(fd, "w") as f: + for s in srcs: + f.write("file '%s'\n" % s.replace("'", "'\\''")) + # Tell the concat demuxer each segment's duration so a seek can jump straight to the right + # segment instead of opening every earlier one to measure it (the large-route lag). + f.write("duration %.3f\n" % (NOMINAL_SEGMENT_FRAMES / VIDEO_FPS)) + return path + + def stop(self) -> None: + with self._cv: + self._stop = True + self._cv.notify_all() + self._thread.join(timeout=1.5) + if self._proxy is not None: + self._proxy.stop() + for pl in (self._playlist, self._hw_playlist): + if pl: + try: + os.unlink(pl) + except OSError: + pass + + def request_frame(self, frame_idx: int) -> None: + frame_idx = max(0, min(self.total_frames - 1, int(frame_idx))) + with self._cv: + self._target = frame_idx + # Seek (restart ffmpeg) on a backward move or a big forward jump; otherwise let the + # sequential decode catch up from the buffer. + if frame_idx < self._run_start or frame_idx > self._base + SEEK_AHEAD_FRAMES: + self._need_seek = True + self._seek_to = frame_idx + self._cv.notify_all() + + def pop_result(self) -> _DecodedFrame | None: + # Return the newest decoded frame at or before the playhead; if none yet (just after a seek), + # the earliest buffered frame. Lets slow (full-res) cams display their latest frame instead of + # stalling waiting for the exact index. + with self._cv: + if not self._buf: + return None + target = self._target + le = [k for k in self._buf if k <= target] + key = max(le) if le else min(self._buf) + frame = self._buf[key] + return _DecodedFrame(key, frame) + + def status(self) -> str: + with self._status_lock: + return self._status + + def _set_status(self, status: str) -> None: + with self._status_lock: + self._status = status + + def _probe_dims(self) -> tuple[int, int] | None: + if self._dims is not None or self._ffprobe is None or not self._sources: + return self._dims + try: + out = subprocess.run( + [self._ffprobe, "-v", "quiet", "-select_streams", "v:0", "-show_entries", + "stream=width,height", "-of", "csv=p=0:s=x", self._sources[0]], + capture_output=True, text=True, timeout=20).stdout.strip() + # A TS can report the stream twice; take the first non-empty line. + line = next((ln for ln in out.splitlines() if "x" in ln), "") + w, h = (int(v) for v in line.split("x")[:2]) + self._dims = (w, h) + except Exception: + self._dims = None + return self._dims + + def _spawn(self, start_frame: int) -> subprocess.Popen: + start_s = max(0.0, start_frame / VIDEO_FPS) + if self._hwdec: + # ffmpeg concats + seeks the raw .hevc (bitstream copy, fast), the Venus decoder turns it + # into rgb24 at ~30fps (vs ~12fps software). Seeking a raw-hevc concat to 0 needs no -ss. + import shlex + # Seek on raw HEVC: INPUT -ss is erratic (no real timestamps) and OUTPUT -ss on the whole + # route reads every packet up to the target (minutes on long routes). So start the concat at + # the TARGET SEGMENT (never reads earlier segments) and OUTPUT -ss only the <60s offset within + # it — fast and frame-accurate. dump_extra re-inserts the parameter sets on every keyframe so + # a mid-stream start is decodable. + seg_idx = min(len(self._sources) - 1, int(start_frame // NOMINAL_SEGMENT_FRAMES)) + local_s = max(0.0, (start_frame - seg_idx * NOMINAL_SEGMENT_FRAMES) / VIDEO_FPS) + if self._hw_playlist: + try: + os.unlink(self._hw_playlist) + except OSError: + pass + self._hw_playlist = self._write_playlist(seg_idx) + ff = [self._ffmpeg, "-hide_banner", "-loglevel", "error", + "-f", "concat", "-safe", "0", "-i", self._hw_playlist] + if local_s > 0.05: + ff += ["-ss", f"{local_s:.3f}"] + ff += ["-c:v", "copy", "-bsf:v", "dump_extra", "-f", "hevc", "pipe:1"] + cmd = " ".join(shlex.quote(a) for a in ff) + " | " + shlex.quote(self._hwdec) + " pipe:0" + try: + from iqpilot.common.swaglog import cloudlog + cloudlog.warning(f"video_player: HW decode path ({self._hwdec})") + except Exception: + pass + # New session so we can kill the WHOLE pipe (ffmpeg + v4l_decode) as a group; killing just + # the shell would orphan them and leave v4l_decode holding /dev/video32 (-> next decode hangs). + return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, + bufsize=0, start_new_session=True) + + cmd = [self._ffmpeg, "-hide_banner", "-loglevel", "error"] + playlist = self._playlist + if self._proxy is not None: + # concat playlists only open local files by default; allow the proxy's http entries. + # Seeking over http bisects with many high-latency range requests, so start the playlist at + # the target segment and only -ss the in-segment remainder (same trick as the HW path). + cmd += ["-protocol_whitelist", "file,http,tcp"] + seg_idx = min(len(self._sources) - 1, int(start_frame // NOMINAL_SEGMENT_FRAMES)) + start_s = max(0.0, (start_frame - seg_idx * NOMINAL_SEGMENT_FRAMES) / VIDEO_FPS) + if seg_idx > 0: + if self._hw_playlist: + try: + os.unlink(self._hw_playlist) + except OSError: + pass + self._hw_playlist = self._write_playlist(seg_idx) + playlist = self._hw_playlist + # Seeking a concat of timestamp-less raw .hevc to exactly 0 yields no output; only add -ss for + # real (non-zero) seeks. + if start_s > 0.05: + cmd += ["-ss", f"{start_s:.3f}"] + cmd += ["-f", "concat", "-safe", "0", "-i", playlist, + "-f", "rawvideo", "-pix_fmt", "rgb24", "-"] + return subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, bufsize=0, + start_new_session=True) + + @staticmethod + def _kill(proc) -> None: + if proc is None: + return + try: + os.killpg(os.getpgid(proc.pid), signal.SIGKILL) # whole pipe group + except Exception: + try: + proc.kill() + except Exception: + pass + try: + proc.wait(timeout=1.0) # reap so it doesn't linger as a zombie + except Exception: + pass + + @staticmethod + def _read_into(pipe, arr) -> bool: + # Read one frame straight into the numpy buffer — no bytes concat/copy (a ~7MB memcpy/frame + # otherwise, which halved decode throughput). + mv = memoryview(arr).cast("B") # flat byte view so slicing is by bytes, not rows + n = arr.nbytes + got = 0 + while got < n: + r = pipe.readinto(mv[got:]) + if not r: + return False + got += r + return True + + def _run(self) -> None: + if self._ffmpeg is None or self._playlist is None: + self._set_status(tr("Unable to load video")) + return + dims = self._probe_dims() + # retry a couple of times: over cloud streaming a single probe can fail transiently + # (flaky LTE/hotspot), and giving up permanently shows "Unable to load video" + for _ in range(2): + if dims is not None or self._stop: + break + time.sleep(2.0) + dims = self._probe_dims() + if dims is None: + self._set_status(tr("Unable to load video")) + return + w, h = dims + frame_bytes = w * h * 3 + self._prebuffer = max(8, min(30, PREBUFFER_BYTES // max(1, frame_bytes))) + proc: subprocess.Popen | None = None + try: + while not self._stop: + with self._cv: + restart = self._need_seek or proc is None + if restart: + self._need_seek = False + seek_to = self._seek_to + if restart: + self._kill(proc) + proc = None + with self._cv: + self._buf.clear() + self._base = seek_to + self._run_start = seek_to + proc = self._spawn(seek_to) + + with self._cv: + while (not self._stop and not self._need_seek + and self._base - self._target > self._prebuffer): + self._cv.wait(0.1) + if self._stop or self._need_seek: + continue + + frame = np.empty((h, w, 3), dtype=np.uint8) + if not self._read_into(proc.stdout, frame): # end of the concatenated stream + self._set_status("") + with self._cv: + while not self._stop and not self._need_seek: + self._cv.wait(0.2) + continue + + with self._cv: + if self._need_seek or self._stop: + continue # a seek landed mid-read; drop this frame and restart + self._buf[self._base] = frame + # Keep the buffer bounded to the most recently decoded frames (they arrive in order). + over = len(self._buf) - (self._prebuffer + 16) + if over > 0: + for k in sorted(self._buf)[:over]: + del self._buf[k] + self._base += 1 + self._cv.notify_all() + self._set_status("") + finally: + self._kill(proc) + + +class _RouteAudioPlayer: + """Plays a route's audio (from the qcamera.ts segments) synced to the scrubber. + + raylib's audio device won't initialize on the comma, so we decode the qcam AAC track with + ffmpeg and pipe raw PCM to aplay (ALSA) — the only working output path on device. Multi-segment + audio is stitched gaplessly with the MPEG-TS `concat:` protocol. Pause/seek tear the pipe down + and (on resume) respawn ffmpeg at the new offset; frame-exact sync isn't needed for a dashcam.""" + + SAMPLE_RATE = 48000 + CHANNELS = 2 + + def __init__(self, ts_paths: list[str]): + self._ts_paths = list(ts_paths) + self._ffmpeg = _find_bin("ffmpeg") + self._aplay = _find_bin("aplay") + self._ff: subprocess.Popen | None = None + self._ap: subprocess.Popen | None = None + self._lock = threading.Lock() + + @property + def available(self) -> bool: + return bool(self._ts_paths and self._ffmpeg and self._aplay) + + def _kill(self) -> None: + for proc in (self._ap, self._ff): + if proc is not None: + try: + proc.kill() + except Exception: + pass + self._ff = self._ap = None + + def stop(self) -> None: + with self._lock: + self._kill() + + def play_from(self, start_s: float) -> None: + if not self.available: + return + with self._lock: + self._kill() + concat = "concat:" + "|".join(self._ts_paths) + try: + self._ff = subprocess.Popen( + [self._ffmpeg, "-v", "quiet", "-ss", f"{max(0.0, start_s):.3f}", "-i", concat, + "-vn", "-f", "s16le", "-ar", str(self.SAMPLE_RATE), "-ac", str(self.CHANNELS), "-"], + stdout=subprocess.PIPE) + self._ap = subprocess.Popen( + [self._aplay, "-q", "-f", "S16_LE", "-c", str(self.CHANNELS), "-r", str(self.SAMPLE_RATE)], + stdin=self._ff.stdout) + if self._ff.stdout is not None: + self._ff.stdout.close() # aplay owns the read end of the pipe now + except Exception: + self._kill() + + +class VideoPlayerLayout(Widget): + """Offroad route video player for local road-camera recordings.""" + + def __init__(self): + super().__init__() + self._header = self._child(ScreenHeader(lambda: tr("Video Player"))) + self._play_icon = gui_app.texture("icons/iq/play.png", 70, 70, keep_aspect_ratio=True) + self._skip_back_icon = gui_app.texture("icons/iq/rotate-ccw.png", 78, 78, keep_aspect_ratio=True) + self._skip_fwd_icon = gui_app.texture("icons/iq/rotate-cw.png", 78, 78, keep_aspect_ratio=True) + self._route: str | None = None + self._playing = False + self._progress = 0.0 + self._duration = 1.0 + + # Camera selection (Road / Wide / Driver) — only cameras actually recorded are shown. + self._cameras: tuple[str, ...] = () + self._camera: str = "road" + self._cam_tab_rects: list[tuple[rl.Rectangle, str]] = [] + + # Cloud streaming (routes overwritten/deleted on device): road cam only, decoded over HTTP. + self._is_cloud: bool = False + self._cloud_fullname: str = "" + self._dongle: str | None = None + + # Route metadata for the info line (date/time from the header, plus length + miles here). + self._meta_label: str = "" + self._distance_miles: float | None = None + self._miles_thread: threading.Thread | None = None + self._miles_route: str | None = None + + self._speed = 1.0 + self._speed_rect = rl.Rectangle(0, 0, 0, 0) + self._play_rect = rl.Rectangle(0, 0, 0, 0) + self._skip_back_rect = rl.Rectangle(0, 0, 0, 0) + self._skip_fwd_rect = rl.Rectangle(0, 0, 0, 0) + self._share_rect = rl.Rectangle(0, 0, 0, 0) + self._track_x0 = 0.0 + self._track_w = 1.0 + self._track_rect = rl.Rectangle(0, 0, 0, 0) + self._dragging = False + self._was_down = False + self._on_share_cb: Callable[[], None] | None = None + self._audio: _RouteAudioPlayer | None = None + self._worker: _StreamFrameWorker | None = None + self._texture: rl.Texture | None = None + self._texture_size: tuple[int, int] = (0, 0) + self._status = "" + self._last_playback_t = 0.0 + # Auto-hide overlay controls (center transport + scrubber) after a few seconds of no touch. + self._last_interaction = 0.0 + self._press_revealed = False + # Loading state for the current camera (fresh full-res HEVC takes a beat to open/index). + self._loading = False + # Newest decoded global frame index — used to pace playback to the decoder (so a slow full-res + # cam plays at its real rate instead of the scrubber racing ahead of the picture). + self._last_decoded_idx = -1 + self._last_uploaded_idx = -1 + + def set_on_back(self, cb: Callable[[], None]) -> None: + self._header.set_on_back(cb) + + def set_on_share(self, cb: Callable[[], None]) -> None: + self._on_share_cb = cb + + def set_route(self, route: str | None) -> None: + self._stop_worker() + self._stop_audio() + self._clear_texture() + self._route = route + self._playing = False + self._progress = 0.0 + self._status = "" + self._last_playback_t = rl.get_time() + self._cameras = () + self._cam_tab_rects = [] + self._distance_miles = None + + if not route: + self._header.set_title(tr("Video Player")) + self._meta_label = "" + return + + info = get_local_route(route) + self._is_cloud = info is None + if info is not None: + self._cameras = info.cameras + self._header.set_title(info.label) + self._meta_label = self._fmt(info.duration_s) + self._duration = max(1.0, info.duration_s) + self._audio = _RouteAudioPlayer(local_route_audio_paths(route)) + self._start_miles_computation(route) + else: + # Not on device — stream the road cam from konn3kt. Reconstruct the cloud fullname + # (dongle|count--uid) from the canonical route name. + self._dongle = cloud.get_dongle_id() + self._cloud_fullname = f"{self._dongle}|{route}" if self._dongle else route + self._cameras = ("road",) + self._header.set_title(route) + self._meta_label = tr("Cloud only") + self._audio = None # cloud audio streaming is a follow-up + + self._camera = "road" if "road" in self._cameras else (self._cameras[0] if self._cameras else "road") + self._load_camera(preserve_progress=False) + + def _stop_audio(self) -> None: + if self._audio is not None: + self._audio.stop() + + def _sync_audio(self) -> None: + """Start/stop audio to match play state + position. Only called at state transitions + (play/pause, seek, drag end) — never per-frame — since each start respawns ffmpeg.""" + if self._audio is None: + return + if self._playing and not self._dragging: + self._audio.play_from(self._progress * self._duration) + else: + self._audio.stop() + + def _load_camera(self, preserve_progress: bool = True) -> None: + self._stop_worker() + self._last_decoded_idx = -1 + self._last_uploaded_idx = -1 + if not preserve_progress: + self._progress = 0.0 + if not self._route: + return + + if self._is_cloud: + urls = cloud.cloud_route_camera_urls(self._dongle, self._cloud_fullname, self._camera) if self._dongle else [] + if not urls: + self._status = tr("Cloud video unavailable") + return + self._status = "" + self._loading = True + self._worker = _StreamFrameWorker(urls, status=tr("Streaming from cloud")) + self._duration = max(1.0, self._worker.total_frames / VIDEO_FPS) + self._request_current_frame() + return + + camera_paths = local_route_camera_paths(self._route, self._camera) + if not camera_paths: + self._status = tr("No video for this camera") + return + + self._status = "" + self._loading = True + self._worker = _StreamFrameWorker(camera_paths) + self._duration = max(1.0, self._worker.total_frames / VIDEO_FPS) + self._request_current_frame() + + def _select_camera(self, camera: str) -> None: + if camera == self._camera or camera not in self._cameras: + return + self._camera = camera + self._clear_texture() + self._loading = True + self._load_camera(preserve_progress=True) + + def _start_miles_computation(self, route: str) -> None: + # Integrating vEgo over the qlogs is slow (reads every segment), so compute off the UI thread. + self._miles_route = route + + def _worker(): + try: + miles = compute_route_distance_miles(route) + except Exception: + miles = None + if self._miles_route == route: + self._distance_miles = miles + + self._miles_thread = threading.Thread(target=_worker, daemon=True) + self._miles_thread.start() + + def show_event(self): + super().show_event() + # Watching a recording is active use — suppress the offroad inactivity timeout that would + # otherwise blank the screen / bounce back to home mid-playback. + device.set_override_interactive_timeout(24 * 60 * 60) + + def hide_event(self): + super().hide_event() + self._stop_worker() + self._stop_audio() + device.set_override_interactive_timeout(None) + + def _stop_worker(self) -> None: + if self._worker is not None: + self._worker.stop() + self._worker = None + + def _clear_texture(self) -> None: + if self._texture is not None: + rl.unload_texture(self._texture) + self._texture = None + self._texture_size = (0, 0) + + def _request_current_frame(self) -> None: + if self._worker is None: + return + frame_idx = int(round(self._progress * max(0, self._worker.total_frames - 1))) + self._worker.request_frame(frame_idx) + + def _consume_decoded_frame(self) -> None: + if self._worker is None: + return + result = self._worker.pop_result() + if result is None: + return + + # Ignore stale frames from before a seek (the worker briefly still holds the old position's + # buffer). Accepting them would drag _last_decoded_idx — and the pace clamp — back, which made + # the scrubber snap to where it was. Only accept frames near the current playhead. + total = max(1, self._worker.total_frames) + target_frame = self._progress * (total - 1) + if abs(result.global_frame - target_frame) > STALE_FRAME_TOL: + return + + # Don't re-upload the same frame: _render runs at 60fps but frames only change ~15-20x/sec. + # Uploading a ~7MB texture every render frame was ~400MB/s of wasted GPU bandwidth, starving + # the decode. Only upload when the frame actually advances. + if result.global_frame == self._last_uploaded_idx: + return + + frame = result.frame + height, width = frame.shape[:2] + if self._texture is None or self._texture_size != (width, height): + if self._texture is not None: + rl.unload_texture(self._texture) + image = rl.Image(None, width, height, 1, rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_R8G8B8) + self._texture = rl.load_texture_from_image(image) + rl.set_texture_filter(self._texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + self._texture_size = (width, height) + + rl.update_texture(self._texture, rl.ffi.cast("void *", frame.ctypes.data)) + self._loading = False + self._last_decoded_idx = result.global_frame + self._last_uploaded_idx = result.global_frame + + def _advance_playback(self) -> None: + now = rl.get_time() + if not self._playing or self._dragging: + self._last_playback_t = now + return + + dt = max(0.0, now - self._last_playback_t) * self._speed + self._last_playback_t = now + self._progress = min(1.0, self._progress + dt / max(1.0, self._duration)) + # Don't let the playhead outrun the decoder (keeps the picture in step on slow full-res cams). + if self._worker is not None and self._last_decoded_idx >= 0: + cap = (self._last_decoded_idx + 12) / max(1, self._worker.total_frames) + if self._progress > cap: + self._progress = cap + if self._progress >= 1.0: + self._playing = False + self._stop_audio() + self._request_current_frame() + + @staticmethod + def _fmt(seconds: float) -> str: + s = max(0, int(seconds)) + return f"{s // 60}:{s % 60:02d}" + + def _controls_visible(self, now: float) -> bool: + # Transport + scrubber stay up while paused or shortly after the last touch, then fade away. + return (not self._playing) or (now - self._last_interaction < AUTOHIDE_S) + + def _note_interaction(self) -> None: + self._last_interaction = rl.get_time() + + @staticmethod + def _draw_dotted(font, parts: list[str], x: float, y: float, size: int, color) -> None: + """Draw text segments joined by a small drawn dot (the font atlas lacks the '¡' glyph).""" + cx = x + for i, part in enumerate(parts): + if i > 0: + cx += 10 + rl.draw_circle(int(cx), int(y + size / 2), 3, rl.Color(color.r, color.g, color.b, 150)) + cx += 16 + rl.draw_text_ex(font, part, rl.Vector2(int(cx), int(y)), size, 0, color) + cx += measure_text_cached(font, part, size).x + + def _meta_parts(self) -> list[str]: + parts: list[str] = [] + if self._meta_label: + parts.append(self._meta_label) + if self._distance_miles is not None and self._distance_miles >= 0.05: + parts.append(f"{self._distance_miles:.1f} mi") + elif self._distance_miles is None and self._route and not self._is_cloud: + parts.append(tr("calculating miles...")) + return parts + + def _render(self, rect: rl.Rectangle): + now = rl.get_time() + # Keep the screen awake the whole time the viewer is on screen — reset every frame because the + # offroad wakefulness timer only otherwise resets on a physical touch (show_event alone wasn't + # enough). Restored to the normal timeout in hide_event. + device.set_override_interactive_timeout(24 * 60 * 60) + self._advance_playback() + self._consume_decoded_frame() + + # 1. Full-bleed video (cover the whole surface, crop overflow). + rl.draw_rectangle_rec(rect, rl.Color(6, 7, 9, 255)) + self._draw_video_cover(rect) + + controls = self._controls_visible(now) + + # 2. Top scrim + header (back / date / share) + metadata + camera tabs. Always visible so the + # user can navigate; the scrim keeps text legible over bright footage. + rl.draw_rectangle_gradient_v(int(rect.x), int(rect.y), int(rect.width), 240, + rl.Color(0, 0, 0, 200), rl.Color(0, 0, 0, 0)) + header_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - 2 * MARGIN, HEADER_HEIGHT) + self._header.render(header_rect) + self._render_share(header_rect) + self._render_speed(header_rect) + + meta_y = header_rect.y + HEADER_HEIGHT + 6 + parts = self._meta_parts() + if parts: + self._draw_dotted(gui_app.font(FontWeight.MEDIUM), parts, rect.x + MARGIN + 4, meta_y, 28, MUTED) + self._render_cam_tabs(rect.x + MARGIN, meta_y + 40) + + # 3. Loading spinner while the (fresh full-res) camera opens. + if self._texture is None: + self._draw_center_spinner(rect, now) + + # 4. Center transport (auto-hides) — only once there's video to control. + cx = rect.x + rect.width / 2 + cy = rect.y + rect.height / 2 + self._skip_back_rect = self._circle_rect(cx - SKIP_OFFSET, cy, SKIP_R) + self._skip_fwd_rect = self._circle_rect(cx + SKIP_OFFSET, cy, SKIP_R) + self._play_rect = self._circle_rect(cx, cy, PLAY_R) + if controls and self._texture is not None: + self._draw_skip(cx - SKIP_OFFSET, cy, SKIP_R, forward=False) + self._draw_skip(cx + SKIP_OFFSET, cy, SKIP_R, forward=True) + self._draw_play(cx, cy) + + # 5. Bottom scrim + scrubber (auto-hides). + bar_y = rect.y + rect.height - MARGIN - 20 + if controls: + rl.draw_rectangle_gradient_v(int(rect.x), int(rect.y + rect.height - 200), int(rect.width), 200, + rl.Color(0, 0, 0, 0), rl.Color(0, 0, 0, 210)) + self._render_scrub(rect.x + MARGIN, rect.width - 2 * MARGIN, bar_y) + else: + # Keep the hit-track current so a drag can still start, just don't paint it. + self._track_rect = rl.Rectangle(0, 0, 0, 0) + self._update_drag() + + def _circle_rect(self, cx, cy, r): + return rl.Rectangle(cx - r, cy - r, r * 2, r * 2) + + def _draw_video_cover(self, rect: rl.Rectangle) -> None: + if self._texture is None: + return + width, height = self._texture_size + if width <= 0 or height <= 0: + return + # Cover: scale so the frame fills the surface, cropping the overflow instead of letterboxing. + scale = max(rect.width / width, rect.height / height) + crop_w = rect.width / scale + crop_h = rect.height / scale + src = rl.Rectangle((width - crop_w) / 2, (height - crop_h) / 2, crop_w, crop_h) + rl.draw_texture_pro(self._texture, src, rect, rl.Vector2(0, 0), 0.0, rl.WHITE) + + def _draw_center_spinner(self, rect: rl.Rectangle, now: float) -> None: + cx = rect.x + rect.width / 2 + cy = rect.y + rect.height / 2 + a = (now * 280) % 360 + rl.draw_ring(rl.Vector2(cx, cy), 34, 42, 0, 360, 48, rl.Color(255, 255, 255, 35)) + rl.draw_ring(rl.Vector2(cx, cy), 34, 42, a, a + 90, 24, TEAL) + label = self._status or (self._worker.status() if self._worker is not None else "") \ + or tr("Loading %s") % CAMERA_LABELS.get(self._camera, "") + if label: + f = gui_app.font(FontWeight.MEDIUM) + ts = measure_text_cached(f, label, 30) + rl.draw_text_ex(f, label, rl.Vector2(int(cx - ts.x / 2), int(cy + 64)), 30, 0, rl.Color(220, 224, 230, 255)) + + def _render_cam_tabs(self, x: float, y: float) -> None: + self._cam_tab_rects = [] + if len(self._cameras) <= 1: + return + font = gui_app.font(FontWeight.MEDIUM) + fs = 28 + pad = 24 + tx = x + for cam in self._cameras: + label = CAMERA_LABELS.get(cam, cam) + tw = measure_text_cached(font, label, fs).x + pad * 2 + tab = rl.Rectangle(tx, y, tw, CAM_TAB_H) + selected = cam == self._camera + rl.draw_rectangle_rounded(tab, 0.5, 16, TEAL if selected else rl.Color(30, 32, 38, 220)) + rl.draw_text_ex(font, label, rl.Vector2(int(tx + pad), int(y + (CAM_TAB_H - fs) / 2)), fs, 0, + GLYPH_DARK if selected else rl.Color(226, 230, 236, 255)) + self._cam_tab_rects.append((tab, cam)) + tx += tw + CAM_TAB_GAP + + def _draw_play(self, cx, cy): + rl.draw_circle(int(cx), int(cy), PLAY_R + 4, rl.Color(0, 0, 0, 70)) + rl.draw_circle(int(cx), int(cy), PLAY_R, TEAL) + if self._playing: + bar_w, bar_h, gap = 15, 58, 15 + rl.draw_rectangle_rounded(rl.Rectangle(cx - gap / 2 - bar_w, cy - bar_h / 2, bar_w, bar_h), 0.4, 6, GLYPH_DARK) + rl.draw_rectangle_rounded(rl.Rectangle(cx + gap / 2, cy - bar_h / 2, bar_w, bar_h), 0.4, 6, GLYPH_DARK) + else: + rl.draw_texture(self._play_icon, int(cx - self._play_icon.width / 2 + 5), int(cy - self._play_icon.height / 2), + GLYPH_DARK) + + def _draw_skip(self, cx, cy, r, forward: bool): + rl.draw_circle(int(cx), int(cy), r, rl.Color(20, 22, 27, 190)) + icon = self._skip_fwd_icon if forward else self._skip_back_icon + rl.draw_texture(icon, int(cx - icon.width / 2), int(cy - icon.height / 2), rl.WHITE) + f = gui_app.font(FontWeight.BOLD) + ts = measure_text_cached(f, "10", 26) + rl.draw_text_ex(f, "10", rl.Vector2(cx - ts.x / 2, cy - ts.y / 2 + 2), 26, 0, rl.WHITE) + + def _render_speed(self, header_rect: rl.Rectangle): + # Speed / fast-forward pill, left of the share button. Tap to cycle 1x -> 2x -> 4x -> 8x. + cy = header_rect.y + HEADER_HEIGHT / 2 + font = gui_app.font(FontWeight.BOLD) + label = f"{self._speed:g}x" + fs = 30 + w = measure_text_cached(font, label, fs).x + 44 + x = header_rect.x + header_rect.width - 2 * SHARE_R - 20 - w + self._speed_rect = rl.Rectangle(x, cy - 34, w, 68) + active = self._speed > 1.0 + rl.draw_rectangle_rounded(self._speed_rect, 0.5, 12, TEAL if active else rl.Color(32, 34, 40, 210)) + tw = measure_text_cached(font, label, fs).x + rl.draw_text_ex(font, label, rl.Vector2(int(x + (w - tw) / 2), int(cy - fs / 2)), fs, 0, + GLYPH_DARK if active else rl.WHITE) + + def _render_share(self, header_rect: rl.Rectangle): + sx = header_rect.x + header_rect.width - SHARE_R + sy = header_rect.y + HEADER_HEIGHT / 2 + self._share_rect = self._circle_rect(sx, sy, SHARE_R) + is_pressed = rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT) and rl.check_collision_point_rec(rl.get_mouse_position(), self._share_rect) + rl.draw_circle(int(sx), int(sy), SHARE_R, rl.Color(50, 53, 61, 235) if is_pressed else rl.Color(32, 34, 40, 200)) + nr = 6 + left = rl.Vector2(sx - 13, sy) + top = rl.Vector2(sx + 13, sy - 14) + bot = rl.Vector2(sx + 13, sy + 14) + rl.draw_line_ex(left, top, 3, TEAL) + rl.draw_line_ex(left, bot, 3, TEAL) + for p in (left, top, bot): + rl.draw_circle(int(p.x), int(p.y), nr, TEAL) + + def _render_scrub(self, x, w, bar_y): + font = gui_app.font(FontWeight.MEDIUM) + fs = 30 + left = self._fmt(self._progress * self._duration) + right = "-" + self._fmt((1.0 - self._progress) * self._duration) + lw = measure_text_cached(font, left, fs) + rw = measure_text_cached(font, right, fs) + + self._track_x0 = x + lw.x + 24 + track_x1 = x + w - rw.x - 24 + self._track_w = max(1.0, track_x1 - self._track_x0) + + rl.draw_text_ex(font, left, rl.Vector2(x, bar_y - fs / 2), fs, 0, rl.WHITE) + rl.draw_text_ex(font, right, rl.Vector2(x + w - rw.x, bar_y - fs / 2), fs, 0, rl.Color(200, 204, 210, 255)) + + rl.draw_rectangle_rounded(rl.Rectangle(self._track_x0, bar_y - 4, self._track_w, 8), 1.0, 8, rl.Color(255, 255, 255, 60)) + fill = self._track_w * self._progress + if fill > 0: + rl.draw_rectangle_rounded(rl.Rectangle(self._track_x0, bar_y - 4, fill, 8), 1.0, 8, TEAL) + hx = int(self._track_x0 + fill) + if self._dragging: + rl.draw_circle(hx, int(bar_y), 22, rl.Color(16, 185, 169, 70)) + rl.draw_circle(hx, int(bar_y), 17, rl.WHITE) + else: + rl.draw_circle(hx, int(bar_y), 13, rl.WHITE) + self._track_rect = rl.Rectangle(self._track_x0 - 20, bar_y - 34, self._track_w + 40, 68) + + def _reset_pace_anchor(self) -> None: + # After an explicit seek, move the decode-pace anchor to the new spot so _advance_playback + # doesn't clamp the playhead back to the pre-seek frame (made scrubbing feel stuck). + if self._worker is not None: + self._last_decoded_idx = int(self._progress * max(0, self._worker.total_frames - 1)) + + def _seek(self, delta_s: float): + self._progress = min(1.0, max(0.0, self._progress + delta_s / self._duration)) + self._reset_pace_anchor() + self._request_current_frame() + self._sync_audio() + + def _update_drag(self): + down = rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT) + mp = rl.get_mouse_position() + if down and not self._was_down and rl.check_collision_point_rec(mp, self._track_rect): + self._dragging = True + self._note_interaction() + self._stop_audio() + if not down: + was_dragging = self._dragging + self._dragging = False + if was_dragging: + # Seek once on release — re-seeking every drag frame just thrashes ffmpeg so nothing decodes. + self._note_interaction() + self._reset_pace_anchor() + self._request_current_frame() + self._sync_audio() + if self._dragging: + # Move the handle live for feedback; the actual seek happens on release. + self._progress = min(1.0, max(0.0, (mp.x - self._track_x0) / self._track_w)) + self._note_interaction() + self._was_down = down + + def _handle_mouse_press(self, mouse_pos: MousePos): + # A tap while the transport is hidden just reveals it; it shouldn't also fire a control. + self._press_revealed = not self._controls_visible(rl.get_time()) + self._note_interaction() + + def _handle_mouse_release(self, mouse_pos: MousePos): + if self._dragging: + return + self._note_interaction() + # Camera tabs and header controls are always live. + for tab, cam in self._cam_tab_rects: + if rl.check_collision_point_rec(mouse_pos, tab): + self._select_camera(cam) + return + if rl.check_collision_point_rec(mouse_pos, self._share_rect): + if self._on_share_cb is not None: + self._on_share_cb() + return + if rl.check_collision_point_rec(mouse_pos, self._speed_rect): + speeds = [1.0, 2.0, 4.0, 8.0] + idx = speeds.index(self._speed) if self._speed in speeds else 0 + self._speed = speeds[(idx + 1) % len(speeds)] + return + # If this tap only revealed the hidden transport, don't also trigger it. + if self._press_revealed: + return + if rl.check_collision_point_rec(mouse_pos, self._play_rect): + self._playing = not self._playing + self._sync_audio() + elif rl.check_collision_point_rec(mouse_pos, self._skip_back_rect): + self._seek(-10) + elif rl.check_collision_point_rec(mouse_pos, self._skip_fwd_rect): + self._seek(10) diff --git a/iqpilot/selfdrive/ui/lib/api_helpers.py b/iqpilot/selfdrive/ui/lib/api_helpers.py new file mode 100644 index 000000000..7efaa01ee --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/api_helpers.py @@ -0,0 +1,18 @@ +import time +from functools import lru_cache +from iqpilot.common.api import Api +from iqpilot.common.time_helpers import system_time_valid + +TOKEN_EXPIRY_HOURS = 2 + + +@lru_cache(maxsize=1) +def _get_token(dongle_id: str, t: int): + if not system_time_valid(): + raise RuntimeError("System time is not valid, cannot generate token") + + return Api(dongle_id).get_token(expiry_hours=TOKEN_EXPIRY_HOURS) + + +def get_token(dongle_id: str): + return _get_token(dongle_id, int(time.monotonic() / (TOKEN_EXPIRY_HOURS / 2 * 60 * 60))) diff --git a/iqpilot/selfdrive/ui/lib/cloud_routes_shim.py b/iqpilot/selfdrive/ui/lib/cloud_routes_shim.py new file mode 100644 index 000000000..9b9efaee8 --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/cloud_routes_shim.py @@ -0,0 +1,101 @@ +"""Public, konn3kt-agnostic shim to the private cloud route client. +""" +from __future__ import annotations + +from functools import cache + +UPLOAD_NONE = "none" +UPLOAD_UPLOADING = "uploading" +UPLOAD_UPLOADED = "uploaded" + +@cache +def _load_cloud(): + try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + return import_verified_module("iqpilot_hephaestusd_private", + "iqpilot_private.konn3kt.hephaestus.cloud_routes") + except Exception: + return None + +def cloud_available() -> bool: + return _load_cloud() is not None + + +def get_dongle_id() -> str | None: + cloud = _load_cloud() + if cloud is None: + return None + try: + return cloud.get_dongle_id() + except Exception: + return None + + +def list_cloud_routes(dongle_id: str) -> list: + cloud = _load_cloud() + if cloud is None: + return [] + try: + return cloud.list_cloud_routes(dongle_id) + except Exception: + return [] + + +def cloud_route_road_segments(dongle_id: str, fullname: str) -> list: + cloud = _load_cloud() + if cloud is None: + return [] + try: + return cloud.cloud_route_road_segments(dongle_id, fullname) + except Exception: + return [] + + +def cloud_route_camera_urls(dongle_id: str, fullname: str, camera: str = "road") -> list: + cloud = _load_cloud() + if cloud is None: + return [] + try: + return cloud.cloud_route_camera_urls(dongle_id, fullname, camera) + except Exception: + return [] + + +def request_mp4_conversion(dongle_id: str, segment_canonical_name: str, camera: str): + cloud = _load_cloud() + if cloud is None: + return None + try: + return cloud.request_mp4_conversion(dongle_id, segment_canonical_name, camera) + except Exception: + return None + + +def get_mp4_conversion(dongle_id: str, segment_canonical_name: str, camera: str): + cloud = _load_cloud() + if cloud is None: + return None + try: + return cloud.get_mp4_conversion(dongle_id, segment_canonical_name, camera) + except Exception: + return None + + +def merge_routes(local_routes: list, cloud_routes: list) -> list: + cloud = _load_cloud() + if cloud is not None: + try: + return cloud.merge_routes(local_routes, cloud_routes) + except Exception: + pass + return [_LocalOnly(local) for local in local_routes] + + +class _LocalOnly: + def __init__(self, local): + self.name = local.name + self.local = local + self.cloud = None + self.is_local = True + self.is_cloud = False + self.upload_state = UPLOAD_NONE diff --git a/iqpilot/selfdrive/ui/lib/local_routes.py b/iqpilot/selfdrive/ui/lib/local_routes.py new file mode 100644 index 000000000..0072d90fa --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/local_routes.py @@ -0,0 +1,243 @@ +from __future__ import annotations + +import re +from dataclasses import dataclass +from datetime import datetime, timedelta, timezone +from pathlib import Path + +from iqpilot.system.hardware.hw import Paths + +_utc_offset_cache: int | None = None + + +def utc_offset_hours() -> int: + """Approximate local UTC offset from the device's last GPS longitude (comma devices run in UTC + with no timezone configured). ~1h imprecise (ignores DST/political borders) but auto and close; + cached for the session.""" + global _utc_offset_cache + if _utc_offset_cache is not None: + return _utc_offset_cache + offset = 0 + try: + from iqpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position + lat, lon, _, have_fix = current_or_last_gps_position() + if have_fix: + offset = int(round(lon / 15.0)) # solar offset ≈ standard-time zone + # Crude DST: add an hour in the local warm season (northern spring–autumn, southern inverse). + month = datetime.now(timezone.utc).month + northern_dst = 3 <= month <= 10 + if (lat >= 0 and northern_dst) or (lat < 0 and not northern_dst): + offset += 1 + offset = max(-12, min(14, offset)) + except Exception: + offset = 0 + _utc_offset_cache = offset + return offset + + +def format_local_time(epoch_seconds: float) -> str: + if epoch_seconds <= 0: + return "Recorded route" + dt = datetime.fromtimestamp(epoch_seconds, timezone(timedelta(hours=utc_offset_hours()))) + return f"{dt.strftime('%b')} {dt.day} {dt.strftime('%I:%M %p').lstrip('0').lower()}" + +# Dongleless on-device segment directory, e.g. "00000051--3141cf1d76--6". +# The stock tools/lib Route + RE parsers require a 16-hex dongle id + '|' delimiter (cloud naming) +# and reject these, which is why the Routes page was empty. We parse them directly instead. +SEGMENT_DIR_RE = re.compile(r"^(?P[0-9a-f]{8}--[0-9a-z]{10})--(?P\d+)$") + +# Logical camera -> on-disk VIDEO file. Order defines the player's selector order. +# Road uses qcamera.ts (H.264, ~1052x660): small enough to software-decode at hundreds of fps and +# it carries the audio track. Wide/Driver are full-res HEVC (hardware-decoded offroad). The +# streaming decoder handles both containers via ffmpeg's concat demuxer. +CAMERA_FILES: dict[str, str] = { + "road": "qcamera.ts", + "wide": "ecamera.hevc", + "driver": "dcamera.hevc", +} +CAMERA_LABELS: dict[str, str] = { + "road": "Road Cam", + "wide": "Wide Cam", + "driver": "Driver Cam", +} +# The road preview (qcamera.ts) is the only file with an audio track, and the smaller +# cloud-streamable road video. It is not a FrameReader source (TS container). +AUDIO_CAMERA_FILE = "qcamera.ts" +NOMINAL_SEGMENT_SECONDS = 60.0 + + +@dataclass(frozen=True) +class LocalRouteInfo: + name: str + label: str + subtitle: str + segment_count: int + cameras: tuple[str, ...] + modified_at: float + duration_s: float + distance_miles: float | None = None + + +def _scan_segments(root: Path) -> dict[str, dict[int, Path]]: + """Group dongleless segment dirs under `root` by route id -> {segment_num: dir}.""" + routes: dict[str, dict[int, Path]] = {} + if not root.exists(): + return routes + for child in root.iterdir(): + try: + if not child.is_dir(): + continue + except OSError: + continue + m = SEGMENT_DIR_RE.match(child.name) + if m is None: + continue + routes.setdefault(m.group("route"), {})[int(m.group("seg"))] = child + return routes + + +def _cameras_present(seg_dir: Path) -> tuple[str, ...]: + present = [] + for cam, filename in CAMERA_FILES.items(): + try: + if (seg_dir / filename).exists(): + present.append(cam) + except OSError: + continue + return tuple(present) + + +def _format_route_time(ts: float) -> str: + return format_local_time(ts) + + +def _format_duration(seconds: float) -> str: + s = max(0, int(round(seconds))) + h, rem = divmod(s, 3600) + m, sec = divmod(rem, 60) + if h: + return f"{h}h {m:02d}m" + return f"{m}:{sec:02d}" + + +def local_route_camera_paths(route_name: str, camera: str = "road", log_root: str | Path | None = None) -> list[str]: + """Ordered per-segment file paths for one camera of a local route (for FrameReader).""" + root = Path(log_root or Paths.log_root()) + segments = _scan_segments(root).get(route_name, {}) + filename = CAMERA_FILES.get(camera, CAMERA_FILES["road"]) + paths: list[str] = [] + for seg_num in sorted(segments): + path = segments[seg_num] / filename + try: + if path.exists(): + paths.append(path.as_posix()) + except OSError: + continue + return paths + + +def local_route_audio_paths(route_name: str, log_root: str | Path | None = None) -> list[str]: + """Ordered per-segment qcamera.ts paths (the only files with an audio track).""" + root = Path(log_root or Paths.log_root()) + segments = _scan_segments(root).get(route_name, {}) + paths: list[str] = [] + for seg_num in sorted(segments): + path = segments[seg_num] / AUDIO_CAMERA_FILE + try: + if path.exists(): + paths.append(path.as_posix()) + except OSError: + continue + return paths + + +def local_route_qlog_paths(route_name: str, log_root: str | Path | None = None) -> list[str]: + """Ordered per-segment qlog paths for a local route.""" + root = Path(log_root or Paths.log_root()) + segments = _scan_segments(root).get(route_name, {}) + paths: list[str] = [] + for seg_num in sorted(segments): + for name in ("qlog.zst", "qlog"): + path = segments[seg_num] / name + try: + if path.exists(): + paths.append(path.as_posix()) + break + except OSError: + continue + return paths + + +def compute_route_distance_miles(route_name: str, log_root: str | Path | None = None) -> float: + """Total driven distance (miles) by integrating carState.vEgo over the route's qlogs. + + Uses vEgo (not GPS) so it still works on cars with broken GPS. Decimated qlog cadence is + plenty for a distance total. This reads every segment's qlog, so callers should run it off the + UI thread.""" + from iqpilot.tools.lib.logreader import LogReader + + total_m = 0.0 + for qlog_path in local_route_qlog_paths(route_name, log_root): + last_t: float | None = None + try: + for msg in LogReader(qlog_path): + if msg.which() != "carState": + continue + t = msg.logMonoTime * 1e-9 + v = float(msg.carState.vEgo) + # Guard against segment boundaries / gaps: only integrate contiguous samples. + if last_t is not None and 0.0 < t - last_t < 1.0: + total_m += v * (t - last_t) + last_t = t + except Exception: + continue + return total_m * 0.000621371 + + +def get_local_route(route_name: str, log_root: str | Path | None = None) -> LocalRouteInfo | None: + root = Path(log_root or Paths.log_root()) + segments = _scan_segments(root).get(route_name) + if not segments: + return None + return _build_info(route_name, segments) + + +def _build_info(route_name: str, segments: dict[int, Path]) -> LocalRouteInfo: + seg_nums = sorted(segments) + mtimes = [] + for seg_num in seg_nums: + try: + mtimes.append(segments[seg_num].stat().st_mtime) + except OSError: + pass + modified_at = max(mtimes) if mtimes else 0.0 + started_at = min(mtimes) if mtimes else 0.0 + + # Cameras available anywhere in the route (union across segments). + cameras: list[str] = [] + for cam in CAMERA_FILES: + if any((segments[s] / CAMERA_FILES[cam]).exists() for s in seg_nums): + cameras.append(cam) + + segment_count = len(seg_nums) + duration_s = segment_count * NOMINAL_SEGMENT_SECONDS + cam_names = ", ".join(CAMERA_LABELS[c] for c in cameras) if cameras else "no cameras" + subtitle = f"{_format_duration(duration_s)} ¡ {cam_names}" + + return LocalRouteInfo( + name=route_name, + label=_format_route_time(started_at), + subtitle=subtitle, + segment_count=segment_count, + cameras=tuple(cameras), + modified_at=modified_at, + duration_s=duration_s, + ) + + +def list_local_routes(log_root: str | Path | None = None, limit: int = 100) -> list[LocalRouteInfo]: + root = Path(log_root or Paths.log_root()) + routes = _scan_segments(root) + infos = [_build_info(name, segs) for name, segs in routes.items()] + infos.sort(key=lambda info: info.modified_at, reverse=True) + return infos[:limit] diff --git a/iqpilot/selfdrive/ui/lib/motd.py b/iqpilot/selfdrive/ui/lib/motd.py new file mode 100644 index 000000000..e1ed33941 --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/motd.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +from collections.abc import Iterable + + +FALLBACK_MOTDS = ("Drive safely. Stay focused.",) +_BUNDLE_NAME = "iqpilot_hephaestusd_private" +_MODULE_NAME = "iqpilot_private.konn3kt.hephaestus.motd" + + +def _dongle_id() -> str | None: + try: + from iqpilot.common.params import Params + return Params().get("DongleId", encoding="utf-8") + except Exception: + return None + + +def _clean_messages(messages: object) -> list[str]: + if not isinstance(messages, Iterable) or isinstance(messages, (str, bytes)): + return [] + return [message.strip() for message in messages if isinstance(message, str) and message.strip()] + + +def load_motds(dongle_id: str | None = None) -> list[str]: + try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + module = import_verified_module(_BUNDLE_NAME, _MODULE_NAME) + messages = module.messages_for_dongle(_dongle_id() if dongle_id is None else dongle_id) + cleaned = _clean_messages(messages) + if cleaned: + return cleaned + except Exception: + pass + return list(FALLBACK_MOTDS) diff --git a/iqpilot/selfdrive/ui/lib/nav_helpers.py b/iqpilot/selfdrive/ui/lib/nav_helpers.py new file mode 100644 index 000000000..9ae267b6b --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/nav_helpers.py @@ -0,0 +1,151 @@ +import json +import platform +from pathlib import Path + +from iqpilot.common.params import Params + +_MAPBOX_DEFAULT_HELPER_UNAVAILABLE = False +_GPS_SERVICES = ("gpsLocationExternal", "gpsLocation") +_POSITION_PARAM_KEYS = ("LastGPSPosition", "LastGPSPositionIQLoc") + + +def _decode_param(value) -> str: + if isinstance(value, bytes): + return value.decode("utf-8", errors="ignore").strip() + if isinstance(value, str): + return value.strip() + return "" + + +def resolve_mapbox_token(params: Params | None = None) -> str: + global _MAPBOX_DEFAULT_HELPER_UNAVAILABLE + + params = params or Params() + token = _decode_param(params.get("MapboxToken")) + if token: + return token + + if _MAPBOX_DEFAULT_HELPER_UNAVAILABLE: + return "" + + try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + runtime_common = import_verified_module("iqpilot_navd_private", "iqpilot_private.navd.runtime_common") + except Exception: + _MAPBOX_DEFAULT_HELPER_UNAVAILABLE = True + return "" + + for args in ((params,), ()): + try: + token = _decode_param(runtime_common.ensure_default_mapbox_token(*args)) + except TypeError: + continue + except Exception: + token = "" + + if not token: + token = _decode_param(params.get("MapboxToken")) + if token: + return token + + return _decode_param(params.get("MapboxToken")) + + +def has_mapbox_token(params: Params | None = None) -> bool: + return bool(resolve_mapbox_token(params)) + + +def _valid_lat_lon(lat: float, lon: float) -> bool: + return abs(lat) <= 90.0 and abs(lon) <= 180.0 and (abs(lat) > 1e-4 or abs(lon) > 1e-4) + + +def _float_field(data: dict, *names: str) -> float: + for name in names: + if name in data: + return float(data.get(name) or 0.0) + return 0.0 + + +def _position_from_json(raw) -> tuple[float, float, float, bool]: + text = _decode_param(raw) + if not text: + return 0.0, 0.0, 0.0, False + try: + data = json.loads(text) + if not isinstance(data, dict): + return 0.0, 0.0, 0.0, False + lat = _float_field(data, "latitude", "lat") + lon = _float_field(data, "longitude", "lon", "lng") + if _valid_lat_lon(lat, lon): + return lat, lon, _float_field(data, "bearing", "bearingDeg"), True + except (TypeError, ValueError, json.JSONDecodeError): + pass + return 0.0, 0.0, 0.0, False + + +def _position_from_msg(msg, lat_name: str = "latitude", lon_name: str = "longitude", + bearing_name: str = "bearingDeg") -> tuple[float, float, float, bool]: + try: + lat = float(getattr(msg, lat_name, 0.0)) + lon = float(getattr(msg, lon_name, 0.0)) + if _valid_lat_lon(lat, lon): + return lat, lon, float(getattr(msg, bearing_name, 0.0)), True + except Exception: + pass + return 0.0, 0.0, 0.0, False + + +def _position_from_params(params: Params) -> tuple[float, float, float, bool]: + for key in _POSITION_PARAM_KEYS: + lat, lon, bearing, valid = _position_from_json(params.get(key)) + if valid: + return lat, lon, bearing, True + return 0.0, 0.0, 0.0, False + + +def current_or_last_gps_position(params: Params | None = None) -> tuple[float, float, float, bool]: + # ui_state is imported lazily AND guarded: night-mode init constructs the ui_state singleton, + # which calls in here before the module finishes importing. In that window the import raises + # (partially initialized module) — fall back to the params path (Night Mode passes self.params), + # since there's no live GPS during boot anyway. + try: + from iqpilot.selfdrive.ui.ui_state import ui_state + except ImportError: + ui_state = None + + if ui_state is not None: + for service in _GPS_SERVICES: + try: + lat, lon, bearing, valid = _position_from_msg(ui_state.sm[service]) + if valid: + return lat, lon, bearing, True + except Exception: + pass + + try: + lat, lon, bearing, valid = _position_from_msg( + ui_state.sm["iqNavRenderState"], + lat_name="currentLatitude", + lon_name="currentLongitude", + bearing_name="bearingDeg", + ) + if valid: + return lat, lon, bearing, True + except Exception: + pass + + explicit_params = params is not None + params = params or (ui_state.params if ui_state is not None else Params()) + lat, lon, bearing, valid = _position_from_params(params) + if valid: + return lat, lon, bearing, True + + if not explicit_params and platform.system() != "Darwin" and Path("/dev/shm/params/d").exists(): + try: + lat, lon, bearing, valid = _position_from_params(Params("/dev/shm/params")) + if valid: + return lat, lon, bearing, True + except Exception: + pass + + return 0.0, 0.0, 0.0, False diff --git a/iqpilot/selfdrive/ui/lib/nav_search.py b/iqpilot/selfdrive/ui/lib/nav_search.py new file mode 100644 index 000000000..00fb0a120 --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/nav_search.py @@ -0,0 +1,319 @@ +"""Destination search + persistence for the offroad Navigate screen. + +Uses Mapbox's Search Box API (the same public Mapbox service the nav map preview already calls) for +POI-and-address autocomplete biased to the device's location — so "Walmart" returns the nearest +Walmart store, not a street named Walmart, and partial addresses complete as you type. Selecting a +result writes NavigationDestination, which navd picks up to build the route. + +Home/Work/Recents live in a small JSON file on /data (persistent, no new param key needed). +""" +from __future__ import annotations + +import json +import threading +import uuid +from dataclasses import dataclass +from types import SimpleNamespace + +import requests + +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.ui.lib.nav_helpers import resolve_mapbox_token, current_or_last_gps_position + +SEARCHBOX = "https://api.mapbox.com/search/searchbox/v1" +FAVORITES_PATH = "/data/nav_favorites.json" +MAX_RESULTS = 6 +MAX_RECENTS = 8 + + +def _load_amap_client(): + try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + return import_verified_module("iqpilot_navd_private", "iqpilot_private.navd.amap_client") + except Exception: + return None + + +_amap_client = _load_amap_client() + + +@dataclass +class SearchResult: + name: str + address: str + mapbox_id: str = "" + distance_m: float | None = None + lat: float | None = None + lon: float | None = None + provider: str = "mapbox" + + @property + def has_coords(self) -> bool: + return self.lat is not None and self.lon is not None + + +class NavSearch: + """Threaded, debounced Search Box autocomplete. The UI calls search() as the user types and reads + results()/searching each frame; a stale query's results are dropped so only the latest shows.""" + + def __init__(self): + self._params = Params() + self._session = str(uuid.uuid4()) + self._lock = threading.Lock() + self._results: list[SearchResult] = [] + self._seq = 0 + self._last_query = "" + self._searching = False + self._amap_adcode = "" + + def new_session(self) -> None: + # A Search Box "session" groups suggest+retrieve for billing; start one per search visit. + self._session = str(uuid.uuid4()) + with self._lock: + self._results = [] + self._last_query = "" + self._amap_adcode = "" + + def results(self) -> list[SearchResult]: + with self._lock: + return list(self._results) + + @property + def searching(self) -> bool: + return self._searching + + def search(self, query: str) -> None: + query = query.strip() + if query == self._last_query: + return + self._last_query = query + self._seq += 1 + seq = self._seq + if len(query) < 2: + with self._lock: + self._results = [] + self._searching = False + return + self._searching = True + threading.Thread(target=self._do_search, args=(query, seq), daemon=True).start() + + def _do_search(self, query: str, seq: int) -> None: + try: + lat, lon, _, fix = current_or_last_gps_position(self._params) + position = SimpleNamespace(latitude=lat, longitude=lon) if fix else None + use_amap = _amap_client is not None and _amap_client.is_mainland_china_configured(self._params, position) + if use_amap: + key = _amap_client.get_key(self._params) + if not self._amap_adcode and position is not None: + self._amap_adcode = _amap_client.reverse_adcode(position, key) + amap_results = _amap_client.autocomplete( + query, + key, + city=self._amap_adcode, + position=position, + ) + try: + self._params.put("AmapStatus", _amap_client.status()) + except Exception: + pass + results = [ + SearchResult( + name=item.name, + address=item.address, + mapbox_id=item.provider_id, + lat=item.latitude, + lon=item.longitude, + provider="amap", + ) + for item in amap_results[:MAX_RESULTS] + ] + if seq == self._seq: + with self._lock: + self._results = results + return + + token = resolve_mapbox_token(self._params) + params = {"q": query, "access_token": token, "session_token": self._session, + "limit": MAX_RESULTS, "language": "en"} + if fix: + params["proximity"] = f"{lon},{lat}" + resp = requests.get(f"{SEARCHBOX}/suggest", params=params, timeout=8) + resp.raise_for_status() + results = [] + for s in resp.json().get("suggestions", []): + mid = s.get("mapbox_id") + addr = s.get("full_address") or s.get("place_formatted") or "" + # Skip brand/category refinement rows (e.g. "Walmart ¡ Brand") — not a single routable place. + if not mid or not addr or s.get("feature_type") in ("category", "brand"): + continue + results.append(SearchResult(name=s.get("name", ""), address=addr, mapbox_id=mid, + distance_m=s.get("distance"))) + if seq == self._seq: + with self._lock: + self._results = results + except Exception as e: + cloudlog.event("nav_search.suggest_failed", error=str(e)) + if seq == self._seq: + with self._lock: + self._results = [] + finally: + if seq == self._seq: + self._searching = False + + def retrieve(self, result: SearchResult) -> SearchResult | None: + """Resolve a suggestion's coordinates (Search Box suggest omits them by design).""" + if result.has_coords: + return result + try: + if result.provider == "amap": + if _amap_client is None: + return None + item = _amap_client.place_detail(result.mapbox_id, _amap_client.get_key(self._params)) + try: + self._params.put("AmapStatus", _amap_client.status()) + except Exception: + pass + if item is None or item.latitude is None or item.longitude is None: + return None + result.lat, result.lon = item.latitude, item.longitude + result.name = item.name or result.name + result.address = item.address or result.address + return result + + token = resolve_mapbox_token(self._params) + resp = requests.get(f"{SEARCHBOX}/retrieve/{result.mapbox_id}", + params={"access_token": token, "session_token": self._session}, timeout=8) + resp.raise_for_status() + feats = resp.json().get("features", []) + if not feats: + return None + coords = feats[0]["geometry"]["coordinates"] + props = feats[0].get("properties", {}) + result.lon, result.lat = float(coords[0]), float(coords[1]) + result.name = props.get("name") or result.name + result.address = props.get("full_address") or result.address + return result + except Exception as e: + cloudlog.event("nav_search.retrieve_failed", error=str(e)) + return None + + +# --- destination + favorites persistence ------------------------------------------------------- + +def set_destination(lat: float, lon: float, name: str) -> None: + """Hand a destination to navd (it routes off NavigationDestination). Mirrors hephaestusd's + setNavDestination so a fresh route is always recomputed.""" + params = Params() + params.remove("AthenaNavigationRoute") + params.put_bool("NavigationActive", False) + # NavigationDestination is a JSON-typed param: pass the object, not a pre-serialized string. + params.put("NavigationDestination", {"latitude": float(lat), "longitude": float(lon), "name": name or ""}) + + +def cancel_navigation() -> None: + """Clear the active route/destination so navd stops navigating.""" + params = Params() + params.remove("NavigationDestination") + params.remove("AthenaNavigationRoute") + params.put_bool("NavigationActive", False) + + +def has_active_destination() -> bool: + try: + return bool(Params().get("NavigationDestination")) + except Exception: + return False + + +def _load_favorites() -> dict: + try: + with open(FAVORITES_PATH) as f: + data = json.load(f) + return data if isinstance(data, dict) else {} + except Exception: + return {} + + +def _save_favorites(data: dict) -> None: + try: + tmp = FAVORITES_PATH + ".tmp" + with open(tmp, "w") as f: + json.dump(data, f) + import os + os.replace(tmp, FAVORITES_PATH) + except Exception as e: + cloudlog.event("nav_search.save_favorites_failed", error=str(e)) + + +def _place_to_result(place: dict | None) -> SearchResult | None: + if not place: + return None + try: + return SearchResult(name=place.get("name", ""), address=place.get("address", ""), + lat=float(place["lat"]), lon=float(place["lon"])) + except Exception: + return None + + +def get_home() -> SearchResult | None: + return _place_to_result(_load_favorites().get("home")) + + +def get_work() -> SearchResult | None: + return _place_to_result(_load_favorites().get("work")) + + +def _place_dict(r: SearchResult) -> dict: + return {"name": r.name, "address": r.address, "lat": r.lat, "lon": r.lon} + + +def save_home(r: SearchResult) -> None: + data = _load_favorites() + data["home"] = _place_dict(r) + _save_favorites(data) + + +def save_work(r: SearchResult) -> None: + data = _load_favorites() + data["work"] = _place_dict(r) + _save_favorites(data) + + +def remove_home() -> None: + data = _load_favorites() + data.pop("home", None) + _save_favorites(data) + + +def remove_work() -> None: + data = _load_favorites() + data.pop("work", None) + _save_favorites(data) + + +def remove_recent(r: SearchResult) -> None: + data = _load_favorites() + data["recents"] = [p for p in data.get("recents", []) + if not (abs(p.get("lat", 0) - (r.lat or 0)) < 1e-5 and abs(p.get("lon", 0) - (r.lon or 0)) < 1e-5)] + _save_favorites(data) + + +def get_recents() -> list[SearchResult]: + out = [] + for p in _load_favorites().get("recents", []): + r = _place_to_result(p) + if r is not None: + out.append(r) + return out + + +def add_recent(r: SearchResult) -> None: + if not r.has_coords: + return + data = _load_favorites() + recents = [p for p in data.get("recents", []) + if not (abs(p.get("lat", 0) - r.lat) < 1e-5 and abs(p.get("lon", 0) - r.lon) < 1e-5)] + recents.insert(0, _place_dict(r)) + data["recents"] = recents[:MAX_RECENTS] + _save_favorites(data) diff --git a/iqpilot/selfdrive/ui/lib/prime_state.py b/iqpilot/selfdrive/ui/lib/prime_state.py new file mode 100644 index 000000000..d3b4ede62 --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/prime_state.py @@ -0,0 +1,144 @@ +from enum import IntEnum +import os +import threading +import time +from pathlib import Path + +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.konn3kt.cloud_client import Konn3ktApi +from iqpilot.konn3kt.registration import UNREGISTERED_DONGLE_ID, get_cached_dongle_id, ensure_dev_pairing_identity +from iqpilot.system.hardware import PC +from iqpilot.system.hardware.hw import Paths + + +class PairState(IntEnum): + UNKNOWN = -2 + UNPAIRED = -1 + PAIRED = 0 + + +class PrimeState: + FETCH_INTERVAL = 5.0 # seconds between konn3kt pairing checks + API_TIMEOUT = 10.0 # seconds for konn3kt API requests + SLEEP_INTERVAL = 0.5 # seconds to sleep between checks in the worker thread + + def __init__(self): + self._params = Params() + self._lock = threading.Lock() + # Must be computed at runtime (OPENPILOT_PREFIX can change paths). + # Keep a writable fallback in /tmp in case /persist becomes read-only. + self._konn3kt_state_paths = [ + Path(Paths.persist_root()) / "comma" / "konn3kt_prime_type", + Path(Paths.config_root()) / "konn3kt_prime_type", + ] + + if PC and os.getenv("KONN3KT_DEV_PAIRING") == "1": + try: + ensure_dev_pairing_identity(self._params, force_reset=os.getenv("KONN3KT_DEV_PAIRING_RESET") == "1") + self._write_cached_state(PairState.UNPAIRED) + except Exception as e: + cloudlog.error(f"dev pairing identity setup failed: {e}") + + self.pair_state: PairState = self._load_initial_state() + + self._running = False + self._thread = None + + def _write_cached_state(self, pair_state: PairState) -> None: + payload = str(int(pair_state)) + for path in self._konn3kt_state_paths: + try: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(payload) + return + except OSError: + continue + except Exception: + cloudlog.exception("failed to write konn3kt pairing cache") + return + cloudlog.warning("failed to write konn3kt pairing cache to any path") + + def _coerce(self, value: int | None) -> PairState: + if value is None: + return PairState.UNKNOWN + if value >= 0: + return PairState.PAIRED + if value == PairState.UNPAIRED: + return PairState.UNPAIRED + return PairState.UNKNOWN + + def _load_initial_state(self) -> PairState: + env_val = os.getenv("PRIME_TYPE") + if env_val is not None: + try: + return self._coerce(int(env_val)) + except (ValueError, TypeError): + pass + for path in self._konn3kt_state_paths: + try: + if path.is_file(): + return self._coerce(int(path.read_text().strip())) + except Exception: + cloudlog.exception("failed to read konn3kt pairing cache") + return PairState.UNKNOWN + + def _refresh_pair_status(self) -> None: + dongle_id = get_cached_dongle_id(self._params, prefer_readonly=True) + if not dongle_id or dongle_id == UNREGISTERED_DONGLE_ID: + return + + # the JWT can't be minted until the clock is NTP-synced; at boot skip + # quietly instead of error-spamming every retry + if not system_time_valid(): + return + + try: + api = Konn3ktApi(dongle_id) + resp = api.get(f"v1.1/devices/{dongle_id}", timeout=self.API_TIMEOUT, access_token=api.get_token()) + if resp.status_code == 200: + paired = bool(resp.json().get("is_paired", False)) + self.set_paired(paired) + elif resp.status_code == 404: + self.set_paired(False) + except Exception as e: + cloudlog.error(f"failed to fetch konn3kt pairing status: {e}") + + def set_paired(self, paired: bool) -> None: + new_state = PairState.PAIRED if paired else PairState.UNPAIRED + with self._lock: + if new_state != self.pair_state: + self.pair_state = new_state + self._write_cached_state(new_state) + cloudlog.info(f"konn3kt pairing updated to {new_state}") + + def _worker_thread(self) -> None: + from iqpilot.selfdrive.ui.ui_state import ui_state, device + while self._running: + if not ui_state.started and device._awake: + self._refresh_pair_status() + + for _ in range(int(self.FETCH_INTERVAL / self.SLEEP_INTERVAL)): + if not self._running: + break + time.sleep(self.SLEEP_INTERVAL) + + def start(self) -> None: + if self._thread and self._thread.is_alive(): + return + self._running = True + self._thread = threading.Thread(target=self._worker_thread, daemon=True) + self._thread.start() + + def stop(self) -> None: + self._running = False + if self._thread and self._thread.is_alive(): + self._thread.join(timeout=1.0) + + def is_paired(self) -> bool: + with self._lock: + return self.pair_state > PairState.UNPAIRED + + def __del__(self): + self.stop() diff --git a/iqpilot/selfdrive/ui/lib/solar.py b/iqpilot/selfdrive/ui/lib/solar.py new file mode 100644 index 000000000..2d0eb6aaf --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/solar.py @@ -0,0 +1,36 @@ +import math +from datetime import UTC, datetime + +_J2000 = datetime(2000, 1, 1, 12, 0, 0, tzinfo=UTC) +SUNSET_ELEVATION_DEG = -0.833 # standard sunset/sunrise threshold, corrected for atmospheric refraction + + +def sun_elevation_deg(lat: float, lon: float, dt_utc: datetime | None = None) -> float: + """Low-precision solar elevation angle (accurate to well under a degree), per the + standard Meeus-derived approximation. lat/lon in degrees (lon positive east).""" + dt_utc = dt_utc or datetime.now(UTC) + n = (dt_utc - _J2000).total_seconds() / 86400.0 + + mean_lon = math.radians((280.460 + 0.9856474 * n) % 360) + mean_anomaly = math.radians((357.528 + 0.9856003 * n) % 360) + ecliptic_lon = (mean_lon + math.radians(1.915) * math.sin(mean_anomaly) + + math.radians(0.020) * math.sin(2 * mean_anomaly)) + obliquity = math.radians(23.439 - 0.0000004 * n) + + declination = math.asin(math.sin(obliquity) * math.sin(ecliptic_lon)) + right_ascension = math.atan2(math.cos(obliquity) * math.sin(ecliptic_lon), math.cos(ecliptic_lon)) + + equation_of_time_deg = math.degrees(mean_lon - right_ascension) + equation_of_time_deg = (equation_of_time_deg + 180) % 360 - 180 + + utc_hours = dt_utc.hour + dt_utc.minute / 60 + dt_utc.second / 3600 + hour_angle = math.radians(15 * (utc_hours - 12) + lon + equation_of_time_deg) + + lat_rad = math.radians(lat) + elevation = math.asin(math.sin(lat_rad) * math.sin(declination) + + math.cos(lat_rad) * math.cos(declination) * math.cos(hour_angle)) + return math.degrees(elevation) + + +def is_after_sunset(lat: float, lon: float, dt_utc: datetime | None = None) -> bool: + return sun_elevation_deg(lat, lon, dt_utc) < SUNSET_ELEVATION_DEG diff --git a/iqpilot/selfdrive/ui/lib/wifi_ssid.py b/iqpilot/selfdrive/ui/lib/wifi_ssid.py new file mode 100644 index 000000000..5d398850a --- /dev/null +++ b/iqpilot/selfdrive/ui/lib/wifi_ssid.py @@ -0,0 +1,55 @@ +import time +import threading +import subprocess + +# Shared, throttled current-Wi-Fi-SSID lookup for the status bars (home pill + onroad sidebar). +# The SSID isn't in deviceState, so we shell out to NetworkManager on a background thread and cache +# the result; the render thread only ever reads the cached string. + +_ssid = "" +_last_fetch = 0.0 +_fetching = False +_lock = threading.Lock() +REFRESH_SECONDS = 10.0 + + +def _read_ssid() -> str: + try: + out = subprocess.run(["nmcli", "-t", "-f", "active,ssid", "dev", "wifi"], + capture_output=True, text=True, timeout=4).stdout + for line in out.splitlines(): + if line.startswith("yes:"): + name = line.split(":", 1)[1].strip() + if name: + return name + except Exception: + pass + try: + name = subprocess.run(["iwgetid", "-r"], capture_output=True, text=True, timeout=4).stdout.strip() + if name: + return name + except Exception: + pass + return "" + + +def _fetch() -> None: + global _ssid, _last_fetch, _fetching + name = _read_ssid() + with _lock: + _ssid = name + _last_fetch = time.monotonic() + _fetching = False + + +def current_ssid(on_wifi: bool) -> str: + """Return the connected SSID (or "" if unknown / not on Wi-Fi). Kicks a throttled background + refresh; never blocks the caller.""" + global _fetching + if not on_wifi: + return "" + with _lock: + if not _fetching and time.monotonic() - _last_fetch > REFRESH_SECONDS: + _fetching = True + threading.Thread(target=_fetch, daemon=True).start() + return _ssid diff --git a/iqpilot/selfdrive/ui/mici/layouts/__init__.py b/iqpilot/selfdrive/ui/mici/layouts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/ui/mici/layouts/home.py b/iqpilot/selfdrive/ui/mici/layouts/home.py new file mode 100644 index 000000000..5eef75427 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/home.py @@ -0,0 +1,422 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import time + +from iqpilot.cereal import log +import pyray as rl +from collections.abc import Callable +from iqpilot.system.ui.widgets.label import gui_label, MiciLabel, UnifiedLabel +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.lib.application import gui_app, FontWeight, DEFAULT_TEXT_COLOR, MousePos +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.text import wrap_text +from iqpilot.system.version import training_version, RELEASE_IQ_BRANCHES + +HEAD_BUTTON_FONT_SIZE = 40 +HOME_PADDING = 8 +HOME_TITLE_MAX_FONT_SIZE = 72 +HOME_TITLE_MIN_FONT_SIZE = 36 +HOME_TITLE_TEXT = "IQ.Pilot" + +NetworkType = log.DeviceState.NetworkType + +NETWORK_TYPES = { + NetworkType.none: "Offline", + NetworkType.wifi: "WiFi", + NetworkType.cell2G: "2G", + NetworkType.cell3G: "3G", + NetworkType.cell4G: "LTE", + NetworkType.cell5G: "5G", + NetworkType.ethernet: "Ethernet", +} + + +class DeviceStatus(Widget): + def __init__(self): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, 300, 175)) + self._update_state() + self._version_text = self._get_version_text() + + self._do_welcome() + + def _do_welcome(self): + ui_state.params.put("CompletedTrainingVersion", training_version) + + def refresh(self): + self._update_state() + self._version_text = self._get_version_text() + + def _get_version_text(self) -> str: + brand = "IQ.Pilot" + description = ui_state.params.get("UpdaterCurrentDescription") + return f"{brand} {description}" if description else brand + + def _update_state(self): + # TODO: refresh function that can be called periodically, not at 60 fps, so we can update version + # update system status + self._system_status = "SYSTEM READY ✓" if ui_state.panda_type != log.PandaState.PandaType.unknown else "BOOTING UP..." + + # update network status + strength = ui_state.sm['deviceState'].networkStrength.raw + strength_text = "● " * strength + "○ " * (4 - strength) # ◌ also works + network_type = NETWORK_TYPES[ui_state.sm['deviceState'].networkType.raw] + self._network_status = f"{network_type} {strength_text}" + + def _render(self, _): + # draw status + status_rect = rl.Rectangle(self._rect.x, self._rect.y, self._rect.width, 40) + gui_label(status_rect, self._system_status, font_size=HEAD_BUTTON_FONT_SIZE, color=DEFAULT_TEXT_COLOR, + font_weight=FontWeight.BOLD, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + + # draw network status + network_rect = rl.Rectangle(self._rect.x, self._rect.y + 60, self._rect.width, 40) + gui_label(network_rect, self._network_status, font_size=40, color=DEFAULT_TEXT_COLOR, + font_weight=FontWeight.MEDIUM, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + + # draw version + version_font_size = 30 + version_rect = rl.Rectangle(self._rect.x, self._rect.y + 140, self._rect.width + 20, 40) + wrapped_text = '\n'.join(wrap_text(self._version_text, version_font_size, version_rect.width)) + gui_label(version_rect, wrapped_text, font_size=version_font_size, color=DEFAULT_TEXT_COLOR, + font_weight=FontWeight.MEDIUM, alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT) + + +class MiciHomeLayout(Widget): + def __init__(self): + super().__init__() + self._on_settings_click: Callable | None = None + + self._last_refresh = 0 + self._mouse_down_t: None | float = None + self._did_long_press = False + self._is_pressed_prev = False + + self._version_text = None + self._experimental_mode = False + + self._settings_txt = gui_app.texture("icons_mici/settings.png", 48, 48) + self._experimental_txt = gui_app.texture("icons_mici/experimental_mode_mici.png", 48, 48) + self._iqdynamic_txt = gui_app.texture("icons_mici/iqdynamic_mode_mici.png", 48, 48) + self._iqstandard_txt = gui_app.texture("icons_mici/iqstandard_mode_mici.png", 48, 48) + self._mode_txt = None + self._mic_txt = gui_app.texture("icons_mici/microphone.png", 32, 46) + self._egpu_txt = gui_app.texture("icons_mici/egpu.png", 62, 46) + self._egpu_green_txt = gui_app.texture("icons_mici/egpu_green.png", 62, 46) + self._egpu_orange_txt = gui_app.texture("icons_mici/egpu_orange.png", 78, 46) + self._mac_txt = gui_app.texture("icons_mici/mac.png", 62, 46) + self._mac_green_txt = gui_app.texture("icons_mici/mac_green.png", 62, 46) + self._mac_orange_txt = gui_app.texture("icons_mici/mac_orange.png", 78, 46) + self._egpu_state: str | None = None + self._mac_state: str | None = None + self._egpu_progress = 0.0 + self._mac_progress = 0.0 + + self._net_type = NETWORK_TYPES.get(NetworkType.none) + self._net_strength = 0 + + self._wifi_slash_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_slash.png", 50, 44) + self._wifi_none_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_none.png", 50, 37) + self._wifi_low_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_low.png", 50, 37) + self._wifi_medium_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_medium.png", 50, 37) + self._wifi_full_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_full.png", 50, 37) + + self._cell_none_txt = gui_app.texture("icons_mici/settings/network/cell_strength_none.png", 54, 36) + self._cell_low_txt = gui_app.texture("icons_mici/settings/network/cell_strength_low.png", 54, 36) + self._cell_medium_txt = gui_app.texture("icons_mici/settings/network/cell_strength_medium.png", 54, 36) + self._cell_high_txt = gui_app.texture("icons_mici/settings/network/cell_strength_high.png", 54, 36) + self._cell_full_txt = gui_app.texture("icons_mici/settings/network/cell_strength_full.png", 54, 36) + self._lte_label = UnifiedLabel("LTE", font_size=22, text_color=rl.Color(255, 255, 255, int(255 * 0.82)), + font_weight=FontWeight.BOLD) + + self._openpilot_label = MiciLabel(HOME_TITLE_TEXT, font_size=HOME_TITLE_MAX_FONT_SIZE, color=rl.Color(255, 255, 255, int(255 * 0.9)), + font_weight=FontWeight.SYNCOPATE) + self._version_label = MiciLabel("", font_size=36, font_weight=FontWeight.ROMAN) + self._large_version_label = MiciLabel("", font_size=64, color=rl.GRAY, font_weight=FontWeight.ROMAN) + self._date_label = MiciLabel("", font_size=36, color=rl.GRAY, font_weight=FontWeight.ROMAN) + self._branch_label = UnifiedLabel("", font_size=36, text_color=rl.GRAY, font_weight=FontWeight.ROMAN, scroll=True) + self._version_commit_label = UnifiedLabel("", font_size=36, text_color=rl.GRAY, + font_weight=FontWeight.ROMAN, wrap_text=False, scroll=True) + + def show_event(self): + self._version_text = self._get_version_text() + self._update_network_status(ui_state.sm['deviceState']) + self._update_params() + + def _update_params(self): + p = ui_state.params + self._experimental_mode = p.get_bool("ExperimentalMode") + if not p.get_bool("AlphaLongitudinalEnabled"): + self._mode_txt = None + elif not self._experimental_mode: + self._mode_txt = self._iqstandard_txt + elif p.get_bool("IQDynamicMode"): + self._mode_txt = self._iqdynamic_txt + else: + self._mode_txt = self._experimental_txt + + def _update_state(self): + if self.is_pressed and not self._is_pressed_prev: + self._mouse_down_t = time.monotonic() + elif not self.is_pressed and self._is_pressed_prev: + self._mouse_down_t = None + self._did_long_press = False + self._is_pressed_prev = self.is_pressed + + if self._mouse_down_t is not None: + if time.monotonic() - self._mouse_down_t > 0.5: + # long gating for experimental mode - only allow toggle if longitudinal control is available + if ui_state.has_longitudinal_control: + self._experimental_mode = not self._experimental_mode + ui_state.params.put("ExperimentalMode", self._experimental_mode) + if not self._experimental_mode: + ui_state.params.put_bool("IQDynamicMode", False) + self._update_params() + self._mouse_down_t = None + self._did_long_press = True + + if rl.get_time() - self._last_refresh > 5.0: + device_state = ui_state.sm['deviceState'] + self._update_network_status(device_state) + + # Update version text + self._version_text = self._get_version_text() + self._last_refresh = rl.get_time() + self._update_params() + self._update_dock_status() + + def _update_dock_status(self): + p = ui_state.params + egpu_present = bool(getattr(ui_state.sm['deviceState'], "egpuDockPresent", False)) + if not egpu_present: + self._egpu_state = None + elif any(p.get_bool(k) for k in ("Offroad_EgpuPcieUnavailable", "Offroad_EgpuOverheated", + "Offroad_EgpuFansObstructed", "Offroad_EgpuUpdateFailed", + "Offroad_EgpuNotDetected")): + self._egpu_state = "orange" + elif p.get_bool("UsbGpuLoading") and not p.get_bool("UsbGpuCompiled"): + self._egpu_state = "compiling" + try: + self._egpu_progress = max(0.0, min(1.0, float(p.get("UsbGpuSetupProgress") or 0.0))) + except (TypeError, ValueError): + self._egpu_progress = 0.0 + elif p.get_bool("Offroad_EgpuUsbSlow") or p.get_bool("Offroad_EgpuUncompiled"): + self._egpu_state = "grey" + else: + self._egpu_state = "green" + + mac_present = p.get_bool("MacModelPresent") or p.get_bool("MacModelReachable") + if not mac_present: + self._mac_state = None + elif p.get_bool("MacModelFault"): + self._mac_state = "orange" + elif p.get_bool("MacModelReady") or p.get_bool("MacModelActive"): + self._mac_state = "green" + else: + self._mac_state = "grey" + + def _update_network_status(self, device_state): + self._net_type = device_state.networkType + strength = device_state.networkStrength + self._net_strength = max(0, min(5, strength.raw + 1)) if strength.raw > 0 else 0 + + def set_callbacks(self, on_settings: Callable | None = None): + self._on_settings_click = on_settings + + def _handle_mouse_release(self, mouse_pos: MousePos): + if not self._did_long_press: + if self._on_settings_click: + self._on_settings_click() + self._did_long_press = False + + def _get_version_text(self) -> tuple[str, str, str, str] | None: + description = ui_state.params.get("UpdaterCurrentDescription") + + if description is not None and len(description) > 0: + # Expect "version / branch / commit / date"; be tolerant of other formats + try: + version, branch, commit, date = description.split(" / ") + # version/date/branch share one 536px line: the brand prefix and clock time push the branch off screen + return version.removeprefix(HOME_TITLE_TEXT).strip() or version, branch, commit, date.split(" ")[0] + except Exception: + return None + + return None + + def _fit_title_font(self, title_x: float) -> None: + font = gui_app.font(FontWeight.SYNCOPATE) + viewport_width = min(w for w in (self.rect.width, gui_app.width, rl.get_screen_width()) if w > 0) + max_width = max(100, int(viewport_width - title_x - HOME_PADDING - 16)) + fit_width = max_width * 0.9 + text_width = measure_text_cached(font, HOME_TITLE_TEXT, HOME_TITLE_MAX_FONT_SIZE).x + if text_width <= fit_width: + target_size = HOME_TITLE_MAX_FONT_SIZE + else: + target_size = int(HOME_TITLE_MAX_FONT_SIZE * (fit_width / text_width)) + target_size = max(HOME_TITLE_MIN_FONT_SIZE, min(HOME_TITLE_MAX_FONT_SIZE, target_size)) + + if target_size != self._openpilot_label.font_size: + self._openpilot_label.set_font_size(target_size) + + def _render_title_gradient(self, x: float, y: float) -> None: + """Render HOME_TITLE_TEXT with a left-to-right gradient (#7400b8 → #80ffdb). + + Technique: render white text to an offscreen RenderTexture, then draw it + tinted by sampling the gradient per-column using draw_texture_pro with a + tint. Since draw_texture_pro only supports a single tint color, we use the + BLEND_MULTIPLIED trick: + 1. Draw white text normally onto the framebuffer. + 2. Draw gradient rect with BLEND_MULTIPLIED on top — this multiplies each + existing pixel by the gradient color, turning white text into the gradient + while the dark background (near-zero RGB) stays dark. + """ + font = gui_app.font(FontWeight.SYNCOPATE) + font_size = self._openpilot_label.font_size + text = HOME_TITLE_TEXT + + text_size = measure_text_cached(font, text, font_size) + tw = int(text_size.x) + 4 + th = int(text_size.y) + 4 + + # Step 1: draw white text at full opacity + rl.draw_text_ex(font, text, rl.Vector2(x + 2, y + 2), font_size, 0, + rl.Color(255, 255, 255, 230)) + + # Step 2: multiply gradient over the text region — white → gradient color, + # black background → stays black (0 × anything = 0) + rl.begin_blend_mode(rl.BlendMode.BLEND_MULTIPLIED) + rl.draw_rectangle_gradient_h( + int(x), int(y), tw, th, + rl.Color(0x80, 0xff, 0xdb, 255), # #80ffdb — left + rl.Color(0x74, 0x00, 0xb8, 255), # #7400b8 — right + ) + rl.end_blend_mode() + + def _render(self, _): + text_pos = rl.Vector2(self.rect.x - 2 + HOME_PADDING, self.rect.y + HOME_PADDING) + self._fit_title_font(text_pos.x) + self._render_title_gradient(text_pos.x, text_pos.y) + + if self._version_text is not None: + # release branch + release_branch = self._version_text[1] in RELEASE_IQ_BRANCHES + version_pos = rl.Rectangle(text_pos.x, text_pos.y + self._openpilot_label.font_size + 16, 100, 44) + self._version_label.set_text(self._version_text[0]) + self._version_label.set_position(version_pos.x, version_pos.y) + self._version_label.render() + + self._date_label.set_text(" " + self._version_text[3]) + self._date_label.set_position(version_pos.x + self._version_label.rect.width + 10, version_pos.y) + self._date_label.render() + + viewport_right = min(w for w in (self.rect.x + self.rect.width, gui_app.width, rl.get_screen_width()) if w > 0) + branch_x = version_pos.x + self._version_label.rect.width + self._date_label.rect.width + 20 + self._branch_label.set_max_width(max(80, int(viewport_right - branch_x - HOME_PADDING))) + self._branch_label.set_text(" " + ("release" if release_branch else self._version_text[1])) + self._branch_label.set_position(branch_x, version_pos.y) + self._branch_label.render() + + if not release_branch: + # 2nd line + self._version_commit_label.set_text(self._version_text[2]) + commit_y = version_pos.y + self._date_label.font_size + 7 + commit_rect = rl.Rectangle(version_pos.x, commit_y, max(100, viewport_right - version_pos.x - HOME_PADDING), 44) + self._version_commit_label.render(commit_rect) + + self._render_bottom_status_bar() + + def _render_bottom_status_bar(self): + # ***** Center-aligned bottom section icons ***** + + # TODO: refactor repeated icon drawing into a small loop + ITEM_SPACING = 18 + Y_CENTER = 24 + + last_x = self.rect.x + HOME_PADDING + + # Draw settings icon in bottom left corner + rl.draw_texture(self._settings_txt, int(last_x), int(self._rect.y + self.rect.height - self._settings_txt.height / 2 - Y_CENTER), + rl.Color(255, 255, 255, int(255 * 0.9))) + last_x = last_x + self._settings_txt.width + ITEM_SPACING + + # draw network + if self._net_type == NetworkType.wifi: + # There is no 1 + draw_net_txt = {0: self._wifi_none_txt, + 2: self._wifi_low_txt, + 3: self._wifi_medium_txt, + 4: self._wifi_full_txt, + 5: self._wifi_full_txt}.get(self._net_strength, self._wifi_low_txt) + rl.draw_texture(draw_net_txt, int(last_x), + int(self._rect.y + self.rect.height - draw_net_txt.height / 2 - Y_CENTER), rl.Color(255, 255, 255, int(255 * 0.9))) + last_x += draw_net_txt.width + ITEM_SPACING + + elif self._net_type in (NetworkType.cell2G, NetworkType.cell3G, NetworkType.cell4G, NetworkType.cell5G): + last_x = self._draw_cellular_cluster(last_x, ITEM_SPACING, Y_CENTER, connected=True) + + else: + last_x = self._draw_cellular_cluster(last_x, ITEM_SPACING, Y_CENTER, connected=False) + + if self._mode_txt is not None: + rl.draw_texture(self._mode_txt, int(last_x), + int(self._rect.y + self.rect.height - self._mode_txt.height / 2 - Y_CENTER), rl.Color(255, 255, 255, 255)) + last_x += self._mode_txt.width + ITEM_SPACING + + # draw microphone icon when recording audio is enabled + if ui_state.recording_audio: + rl.draw_texture(self._mic_txt, int(last_x), + int(self._rect.y + self.rect.height - self._mic_txt.height / 2 - Y_CENTER), rl.Color(255, 255, 255, 255)) + last_x += self._mic_txt.width + ITEM_SPACING + + for state, base, green, orange, progress in ( + (self._egpu_state, self._egpu_txt, self._egpu_green_txt, self._egpu_orange_txt, self._egpu_progress), + (self._mac_state, self._mac_txt, self._mac_green_txt, self._mac_orange_txt, self._mac_progress)): + if state is None: + continue + y_top = int(self._rect.y + self.rect.height - base.height / 2 - Y_CENTER) + if state == "compiling": + self._draw_compile_gauge(int(last_x), y_top, base, green, progress) + last_x += base.width + ITEM_SPACING + continue + if state == "green": + tex, tint = green, rl.Color(255, 255, 255, 255) + elif state == "orange": + tex, tint = orange, rl.Color(255, 255, 255, 255) + else: + tex, tint = base, rl.Color(165, 165, 170, 235) + rl.draw_texture(tex, int(last_x), y_top, tint) + last_x += tex.width + ITEM_SPACING + + def _draw_compile_gauge(self, x: int, y_top: int, base, fill, progress: float): + rl.draw_texture(base, x, y_top, rl.Color(165, 165, 170, 235)) + fill_h = int(base.height * max(0.0, min(1.0, progress))) + if fill_h > 0: + rl.begin_scissor_mode(x, y_top + base.height - fill_h, base.width, fill_h) + rl.draw_texture(fill, x, y_top, rl.Color(255, 255, 255, 255)) + rl.end_scissor_mode() + + def _draw_cellular_cluster(self, start_x: float, spacing: int, y_center: int, connected: bool) -> float: + draw_net_txt = {0: self._cell_none_txt, + 2: self._cell_low_txt, + 3: self._cell_medium_txt, + 4: self._cell_high_txt, + 5: self._cell_full_txt}.get(self._net_strength, self._cell_none_txt) + + icon_y = int(self._rect.y + self.rect.height - draw_net_txt.height / 2 - y_center) + rl.draw_texture(draw_net_txt, int(start_x), icon_y, rl.Color(255, 255, 255, int(255 * 0.9))) + + label_x = start_x + draw_net_txt.width + 12 + label_y = self._rect.y + self.rect.height - 37 + label_rect = rl.Rectangle(label_x, label_y, 44, 24) + self._lte_label.render(label_rect) + + if not connected: + slash_start = rl.Vector2(start_x + 8, icon_y + draw_net_txt.height - 3) + slash_end = rl.Vector2(start_x + draw_net_txt.width - 2, icon_y + 3) + rl.draw_line_ex(slash_start, slash_end, 8, rl.Color(255, 255, 255, int(255 * 0.22))) + rl.draw_line_ex(slash_start, slash_end, 5, rl.Color(255, 255, 255, int(255 * 0.82))) + + return label_x + label_rect.width + spacing diff --git a/iqpilot/selfdrive/ui/mici/layouts/main.py b/iqpilot/selfdrive/ui/mici/layouts/main.py new file mode 100644 index 000000000..695fa9103 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/main.py @@ -0,0 +1,134 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import pyray as rl +import iqpilot.cereal.messaging as messaging +from iqpilot.selfdrive.ui.mici.layouts.home import MiciHomeLayout +from iqpilot.selfdrive.ui.mici.layouts.settings.settings import SettingsLayout +from iqpilot.selfdrive.ui.mici.layouts.offroad_alerts import MiciOffroadAlerts +from iqpilot.selfdrive.ui.mici.onroad.augmented_road_view import AugmentedRoadView +from iqpilot.selfdrive.ui.ui_state import device, ui_state +from iqpilot.selfdrive.ui.mici.layouts.onboarding import OnboardingWindow +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.scroller import Scroller +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.multilang import multilang +from iqpilot.system.version import training_version + + +ONROAD_DELAY = 2.5 # seconds + + +class MiciMainLayout(Widget): + """Root mici layout. Lives at the bottom of the nav stack; settings push on top. + + Keeps the IQ.Pilot custom home + onroad as horizontally-scrolled pages, while + the (stock) settings open as a swipe-to-dismiss NavWidget on the nav stack. + """ + def __init__(self): + super().__init__() + + self._pm = messaging.PubMaster(['bookmarkButton']) + + self._prev_onroad = False + self._prev_standstill = False + self._onroad_time_delay: float | None = None + self._setup = False + self._rebuild_settings = False + + self._home_layout = MiciHomeLayout() + self._alerts_layout = MiciOffroadAlerts() + self._settings_layout = SettingsLayout() + self._onroad_layout = AugmentedRoadView(bookmark_callback=self._on_bookmark_clicked) + + for widget in (self._home_layout, self._settings_layout, self._alerts_layout, self._onroad_layout): + widget.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + + self._scroller = Scroller([ + self._alerts_layout, + self._home_layout, + self._onroad_layout, + ], spacing=0, pad_start=0, pad_end=0) + self._scroller.set_reset_scroll_at_show(False) + + # Disable scrolling when onroad is interacting with bookmark + self._scroller.set_scrolling_enabled(lambda: not self._onroad_layout.is_swiping_left()) + + self._setup_callbacks() + + if ui_state.params.get("CompletedTrainingVersion") != training_version: + ui_state.params.put("CompletedTrainingVersion", training_version) + + gui_app.add_nav_stack_tick(self._handle_transitions) + gui_app.push_widget(self) + + self._onboarding_window = OnboardingWindow() + if not self._onboarding_window.completed: + gui_app.set_modal_overlay(self._onboarding_window) + + def _setup_callbacks(self): + self._home_layout.set_callbacks(on_settings=self._on_settings_clicked) + self._onroad_layout.set_click_callback(lambda: self._scroll_to(self._home_layout)) + device.add_interactive_timeout_callback(self._on_interactive_timeout) + multilang.add_change_callback(self._on_language_changed) + + def _on_language_changed(self): + self._rebuild_settings = True + + def _scroll_to(self, layout: Widget): + self._scroller.scroll_to(int(layout.rect.x), smooth=True) + + def show_event(self): + super().show_event() + self._scroller.show_event() + + def _render(self, _): + if not self._setup: + if self._alerts_layout.active_alerts() > 0: + self._scroller.scroll_to(self._alerts_layout.rect.x) + else: + self._scroller.scroll_to(self._rect.width) + self._setup = True + + self._scroller.render(self._rect) + + def _handle_transitions(self): + if ui_state.started != self._prev_onroad: + self._prev_onroad = ui_state.started + + if ui_state.started: + self._onroad_time_delay = rl.get_time() + else: + self._scroll_to(self._home_layout) + + if self._onroad_time_delay is not None and rl.get_time() - self._onroad_time_delay >= ONROAD_DELAY: + gui_app.pop_widgets_to(self, lambda: self._scroll_to(self._onroad_layout)) + self._onroad_time_delay = None + + CS = ui_state.sm["carState"] + if not CS.standstill and self._prev_standstill: + gui_app.pop_widgets_to(self, lambda: self._scroll_to(self._onroad_layout)) + self._prev_standstill = CS.standstill + + if self._rebuild_settings: + self._rebuild_settings = False + gui_app.pop_widgets_to(self, instant=True) + self._settings_layout = SettingsLayout() + self._settings_layout.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + + def _on_interactive_timeout(self): + if ui_state.started: + if not ui_state.sm["carState"].standstill: + gui_app.pop_widgets_to(self, lambda: self._scroll_to(self._onroad_layout)) + else: + gui_app.pop_widgets_to(self, instant=True) + self._scroll_to(self._home_layout) + + def _on_settings_clicked(self): + gui_app.push_widget(self._settings_layout) + + def _on_bookmark_clicked(self): + user_bookmark = messaging.new_message('bookmarkButton') + user_bookmark.valid = True + self._pm.send('bookmarkButton', user_bookmark) diff --git a/iqpilot/selfdrive/ui/mici/layouts/offroad_alerts.py b/iqpilot/selfdrive/ui/mici/layouts/offroad_alerts.py new file mode 100644 index 000000000..0796b2115 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/offroad_alerts.py @@ -0,0 +1,309 @@ +import pyray as rl +import re +import time +from dataclasses import dataclass +from enum import IntEnum +from iqpilot.common.params import Params +from iqpilot.selfdrive.selfdrived.alertmanager import OFFROAD_ALERTS +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.widgets.scroller import Scroller +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr + +REFRESH_INTERVAL = 5.0 # seconds + + +class AlertSize(IntEnum): + SMALL = 0 + MEDIUM = 1 + BIG = 2 + + +@dataclass +class AlertData: + key: str + text: str + severity: int + visible: bool = False + + +class AlertItem(Widget): + # TODO: click should always go somewhere: home or specific settings pane + """Individual alert item widget with background image and text.""" + ALERT_WIDTH = 520 + ALERT_HEIGHT_SMALL = 212 + ALERT_HEIGHT_MED = 240 + ALERT_HEIGHT_BIG = 324 + ALERT_PADDING = 28 + ICON_SIZE = 64 + ICON_MARGIN = 12 + TEXT_COLOR = rl.Color(255, 255, 255, int(255 * 0.9)) + TITLE_BODY_SPACING = 24 + + def __init__(self, alert_data: AlertData): + super().__init__() + self.alert_data = alert_data + + # Load background textures + self._bg_small = gui_app.texture("icons_mici/offroad_alerts/small_alert.png", self.ALERT_WIDTH, self.ALERT_HEIGHT_SMALL) + self._bg_small_pressed = gui_app.texture("icons_mici/offroad_alerts/small_alert_pressed.png", self.ALERT_WIDTH, self.ALERT_HEIGHT_SMALL) + self._bg_medium = gui_app.texture("icons_mici/offroad_alerts/medium_alert.png", self.ALERT_WIDTH, self.ALERT_HEIGHT_MED) + self._bg_medium_pressed = gui_app.texture("icons_mici/offroad_alerts/medium_alert_pressed.png", self.ALERT_WIDTH, self.ALERT_HEIGHT_MED) + self._bg_big = gui_app.texture("icons_mici/offroad_alerts/big_alert.png", self.ALERT_WIDTH, self.ALERT_HEIGHT_BIG) + self._bg_big_pressed = gui_app.texture("icons_mici/offroad_alerts/big_alert_pressed.png", self.ALERT_WIDTH, self.ALERT_HEIGHT_BIG) + + # Load warning icons + self._icon_orange = gui_app.texture("icons_mici/offroad_alerts/orange_warning.png", self.ICON_SIZE, self.ICON_SIZE) + self._icon_red = gui_app.texture("icons_mici/offroad_alerts/red_warning.png", self.ICON_SIZE, self.ICON_SIZE) + self._icon_green = gui_app.texture("icons_mici/offroad_alerts/green_wheel.png", self.ICON_SIZE, self.ICON_SIZE) + + self._title_label = UnifiedLabel(text="", font_size=32, font_weight=FontWeight.SEMI_BOLD, text_color=self.TEXT_COLOR, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP, line_height=0.95) + + self._body_label = UnifiedLabel(text="", font_size=28, font_weight=FontWeight.ROMAN, text_color=self.TEXT_COLOR, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM, line_height=0.95) + + self._title_text = "" + self._body_text = "" + self._alert_size = AlertSize.SMALL + + self._update_content() + + def _split_text(self, text: str) -> tuple[str, str]: + """Split text into title (first sentence) and body (remaining text).""" + # Find the end of the first sentence (period, exclamation, or question mark followed by space or end) + match = re.search(r'[.!?](?:\s+|$)', text) + if match: + # Found a sentence boundary - split at the end of the sentence + title = text[:match.start()].strip() + body = text[match.end():].strip() + return title, body + else: + # No sentence boundary found, return full text as title + return "", text + + def _update_content(self): + """Update text and calculate height.""" + if not self.alert_data.visible or not self.alert_data.text: + self.set_visible(False) + return + + self.set_visible(True) + + # Split text into title and body + self._title_text, self._body_text = self._split_text(self.alert_data.text) + + # Calculate text width (alert width minus padding and icon space on right) + title_width = self.ALERT_WIDTH - (self.ALERT_PADDING * 2) - self.ICON_SIZE - self.ICON_MARGIN + body_width = self.ALERT_WIDTH - (self.ALERT_PADDING * 2) + + # Update labels + self._title_label.set_text(self._title_text) + self._body_label.set_text(self._body_text) + + # Calculate content height + title_height = self._title_label.get_content_height(title_width) if self._title_text else 0 + body_height = self._body_label.get_content_height(body_width) if self._body_text else 0 + spacing = self.TITLE_BODY_SPACING if (self._title_text and self._body_text) else 0 + total_text_height = title_height + spacing + body_height + + # Determine which background size to use based on content height + min_height_with_padding = total_text_height + (self.ALERT_PADDING * 2) + if min_height_with_padding > self.ALERT_HEIGHT_MED: + self._alert_size = AlertSize.BIG + height = self.ALERT_HEIGHT_BIG + elif min_height_with_padding > self.ALERT_HEIGHT_SMALL: + self._alert_size = AlertSize.MEDIUM + height = self.ALERT_HEIGHT_MED + else: + self._alert_size = AlertSize.SMALL + height = self.ALERT_HEIGHT_SMALL + + # Set rect size + self.set_rect(rl.Rectangle(0, 0, self.ALERT_WIDTH, height)) + + def update_alert_data(self, alert_data: AlertData): + """Update alert data and refresh display.""" + self.alert_data = alert_data + self._update_content() + + def _render(self, _): + if not self.alert_data.visible or not self.alert_data.text: + return + + # Choose background based on size + if self._alert_size == AlertSize.BIG: + bg_texture = self._bg_big_pressed if self.is_pressed else self._bg_big + elif self._alert_size == AlertSize.MEDIUM: + bg_texture = self._bg_medium_pressed if self.is_pressed else self._bg_medium + else: # AlertSize.SMALL + bg_texture = self._bg_small_pressed if self.is_pressed else self._bg_small + + # Draw background + rl.draw_texture(bg_texture, int(self._rect.x), int(self._rect.y), rl.WHITE) + + # Calculate text area (left side, avoiding icon on right) + title_width = self.ALERT_WIDTH - (self.ALERT_PADDING * 2) - self.ICON_SIZE - self.ICON_MARGIN + body_width = self.ALERT_WIDTH - (self.ALERT_PADDING * 2) + text_x = self._rect.x + self.ALERT_PADDING + text_y = self._rect.y + self.ALERT_PADDING + + # Draw title label + if self._title_text: + title_rect = rl.Rectangle( + text_x, + text_y, + title_width, + self._title_label.get_content_height(title_width), + ) + self._title_label.render(title_rect) + text_y += title_rect.height + self.TITLE_BODY_SPACING + + # Draw body label + if self._body_text: + body_rect = rl.Rectangle( + text_x, + text_y, + body_width, + self._rect.height - text_y + self._rect.y - self.ALERT_PADDING, + ) + self._body_label.render(body_rect) + + # Draw warning icon on the right side + # Use green icon for update alerts (severity = -1), red for high severity, orange for low severity + if self.alert_data.severity == -1: + icon_texture = self._icon_green + elif self.alert_data.severity > 0: + icon_texture = self._icon_red + else: + icon_texture = self._icon_orange + icon_x = self._rect.x + self.ALERT_WIDTH - self.ALERT_PADDING - self.ICON_SIZE + icon_y = self._rect.y + self.ALERT_PADDING + rl.draw_texture(icon_texture, int(icon_x), int(icon_y), rl.WHITE) + + +class MiciOffroadAlerts(Widget): + """Offroad alerts layout with vertical scrolling.""" + + def __init__(self): + super().__init__() + self.params = Params() + self.sorted_alerts: list[AlertData] = [] + self.alert_items: list[AlertItem] = [] + self._last_refresh = 0.0 + + # Create vertical scroller + self._scroller = Scroller([], horizontal=False, spacing=12, pad_start=0, pad_end=0, snap_items=False) + + # Create empty state label + self._empty_label = UnifiedLabel(tr("no alerts"), 65, FontWeight.DISPLAY, rl.WHITE, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + + # Build initial alert list + self._build_alerts() + + def active_alerts(self) -> int: + return sum(alert.visible for alert in self.sorted_alerts) + + def scrolling(self): + return self._scroller.scroll_panel.is_touch_valid() + + def _build_alerts(self): + """Build sorted list of alerts from OFFROAD_ALERTS.""" + self.sorted_alerts = [] + + # Add UpdateAvailable alert at the top (severity = -1 to indicate special handling) + update_alert_data = AlertData(key="UpdateAvailable", text="", severity=-1) + self.sorted_alerts.append(update_alert_data) + update_alert_item = AlertItem(update_alert_data) + update_alert_item.set_click_callback(lambda: HARDWARE.reboot()) + self.alert_items.append(update_alert_item) + self._scroller.add_widget(update_alert_item) + + # Add regular alerts sorted by severity + for key, config in sorted(OFFROAD_ALERTS.items(), key=lambda x: x[1].get("severity", 0), reverse=True): + severity = config.get("severity", 0) + alert_data = AlertData(key=key, text="", severity=severity) + self.sorted_alerts.append(alert_data) + + # Create alert item widget + alert_item = AlertItem(alert_data) + self.alert_items.append(alert_item) + self._scroller.add_widget(alert_item) + + def refresh(self) -> int: + """Refresh alerts from params and return active count.""" + active_count = 0 + + # Handle UpdateAvailable alert specially + update_available = self.params.get_bool("UpdateAvailable") + update_alert_data = next((alert_data for alert_data in self.sorted_alerts if alert_data.key == "UpdateAvailable"), None) + + if update_alert_data: + if update_available: + version_string = "" + + # Get new version description and parse version and date + new_desc = self.params.get("UpdaterNewDescription") or "" + if new_desc: + # format: "version / branch / commit / date" + parts = new_desc.split(" / ") + if len(parts) > 3: + version, date = parts[0], parts[3] + version_string = f"\nIQ.Pilot {version}, {date}\n" + + update_alert_data.text = f"Update available {version_string}. Click to update." + update_alert_data.visible = True + active_count += 1 + else: + update_alert_data.text = "" + update_alert_data.visible = False + + # Handle regular alerts + for alert_data in self.sorted_alerts: + if alert_data.key == "UpdateAvailable": + continue # Skip, already handled above + + text = "" + alert_json = self.params.get(alert_data.key) + + if alert_json: + text = alert_json.get("text", "").replace("%1", alert_json.get("extra", "")) + + alert_data.text = text + alert_data.visible = bool(text) + + if alert_data.visible: + active_count += 1 + + # Update alert items (they reference the same alert_data objects) + for alert_item in self.alert_items: + alert_item.update_alert_data(alert_item.alert_data) + + return active_count + + def show_event(self): + """Reset scroll position when shown and refresh alerts.""" + self._scroller.show_event() + self._last_refresh = time.monotonic() + self.refresh() + + def _update_state(self): + """Periodically refresh alerts.""" + # Refresh alerts periodically, not every frame + current_time = time.monotonic() + if current_time - self._last_refresh >= REFRESH_INTERVAL: + self.refresh() + self._last_refresh = current_time + + def _render(self, rect: rl.Rectangle): + """Render the alerts scroller or empty state.""" + if self.active_alerts() == 0: + self._empty_label.render(rect) + else: + self._scroller.render(rect) diff --git a/iqpilot/selfdrive/ui/mici/layouts/onboarding.py b/iqpilot/selfdrive/ui/mici/layouts/onboarding.py new file mode 100644 index 000000000..05970b25c --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/onboarding.py @@ -0,0 +1,533 @@ +from enum import IntEnum + +import weakref +import math +import os +import numpy as np +import pyray as rl +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.system.hardware import HARDWARE, PC +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import SmallButton, SmallCircleIconButton +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.widgets.slider import SmallSlider +from iqpilot.system.ui.mici_setup import TermsHeader, TermsPage as SetupTermsPage +from iqpilot.selfdrive.ui.ui_state import ui_state, device +from iqpilot.selfdrive.ui.mici.onroad.driver_state import DriverStateRenderer +from iqpilot.selfdrive.ui.mici.onroad.driver_camera_dialog import DriverCameraDialog +from iqpilot.system.ui.widgets.label import gui_label +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.version import terms_version, training_version + + +class OnboardingState(IntEnum): + TERMS = 0 + ONBOARDING = 1 + DECLINE = 2 + + +class DriverCameraSetupDialog(DriverCameraDialog): + def __init__(self): + super().__init__(no_escape=True) + self.driver_state_renderer = DriverStateRenderer(inset=True) + self.driver_state_renderer.set_rect(rl.Rectangle(0, 0, 120, 120)) + self.driver_state_renderer.load_icons() + self.driver_state_renderer.set_force_active(True) + + def _render(self, rect): + rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height)) + self._camera_view._render(rect) + + if not self._camera_view.frame: + gui_label(rect, tr("camera starting"), font_size=64, font_weight=FontWeight.BOLD, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + rl.end_scissor_mode() + return -1 + + # Position dmoji on opposite side from driver + is_rhd = self.driver_state_renderer.is_rhd + self.driver_state_renderer.set_position( + rect.x + 8 if is_rhd else rect.x + rect.width - self.driver_state_renderer.rect.width - 8, + rect.y + 8, + ) + self.driver_state_renderer.render() + + self._draw_face_detection(rect) + + rl.end_scissor_mode() + return -1 + + +class TrainingGuidePreDMTutorial(SetupTermsPage): + def __init__(self, continue_callback): + super().__init__(continue_callback, continue_text=tr("continue")) + self._title_header = TermsHeader("driver monitoring setup", gui_app.texture("icons_mici/setup/green_dm.png", 60, 60)) + + self._dm_label = UnifiedLabel("Next, we'll ensure comma four is mounted properly.\n\nIf it does not have a clear view of the driver, " + + "unplug and remount before continuing.", 42, + FontWeight.ROMAN) + + def show_event(self): + super().show_event() + # Get driver monitoring model ready for next step + ui_state.params.put_bool("IsDriverViewEnabled", True) + + @property + def _content_height(self): + return self._dm_label.rect.y + self._dm_label.rect.height - self._scroll_panel.get_offset() + + def _render_content(self, scroll_offset): + self._title_header.render(rl.Rectangle( + self._rect.x + 16, + self._rect.y + 16 + scroll_offset, + self._title_header.rect.width, + self._title_header.rect.height, + )) + + self._dm_label.render(rl.Rectangle( + self._rect.x + 16, + self._title_header.rect.y + self._title_header.rect.height + 16, + self._rect.width - 32, + self._dm_label.get_content_height(int(self._rect.width - 32)), + )) + + +class DMBadFaceDetected(SetupTermsPage): + def __init__(self, continue_callback, back_callback): + super().__init__(continue_callback, back_callback, continue_text=tr("power off")) + self._title_header = TermsHeader("make sure comma four can see your face", gui_app.texture("icons_mici/setup/orange_dm.png", 60, 60)) + self._dm_label = UnifiedLabel(tr("Re-mount if your face is occluded or driver monitoring has difficulty tracking your face."), 42, FontWeight.ROMAN) + + @property + def _content_height(self): + return self._dm_label.rect.y + self._dm_label.rect.height - self._scroll_panel.get_offset() + + def _render_content(self, scroll_offset): + self._title_header.render(rl.Rectangle( + self._rect.x + 16, + self._rect.y + 16 + scroll_offset, + self._title_header.rect.width, + self._title_header.rect.height, + )) + + self._dm_label.render(rl.Rectangle( + self._rect.x + 16, + self._title_header.rect.y + self._title_header.rect.height + 16, + self._rect.width - 32, + self._dm_label.get_content_height(int(self._rect.width - 32)), + )) + + +class TrainingGuideDMTutorial(Widget): + PROGRESS_DURATION = 4 + LOOKING_THRESHOLD_DEG = 30.0 + NO_CAMERA_BYPASS_DELAY_SEC = 2.0 + + def __init__(self, continue_callback): + super().__init__() + self._back_button = SmallCircleIconButton(gui_app.texture("icons_mici/setup/driver_monitoring/dm_question.png", 28, 48)) + self._back_button.set_click_callback(self._show_bad_face_page) + self._good_button = SmallCircleIconButton(gui_app.texture("icons_mici/setup/driver_monitoring/dm_check.png", 42, 42)) + + # Wrap the continue callback to restore settings + def wrapped_continue_callback(): + device.set_offroad_brightness(None) + continue_callback() + + self._good_button.set_click_callback(wrapped_continue_callback) + self._good_button.set_enabled(False) + + self._progress = FirstOrderFilter(0.0, 0.5, 1 / gui_app.target_fps) + self._dialog = DriverCameraSetupDialog() + self._bad_face_page = DMBadFaceDetected(HARDWARE.shutdown, self._hide_bad_face_page) + self._should_show_bad_face_page = False + self._no_camera_elapsed_sec = 0.0 + self._allow_no_camera_bypass = PC or os.getenv("IQPILOT_ALLOW_DM_NO_CAMERA", "0") == "1" + + # Disable driver monitoring model when device times out for inactivity + def inactivity_callback(): + ui_state.params.put_bool("IsDriverViewEnabled", False) + + device.add_interactive_timeout_callback(inactivity_callback) + + def _show_bad_face_page(self): + self._bad_face_page.show_event() + self.hide_event() + self._should_show_bad_face_page = True + + def _hide_bad_face_page(self): + self._bad_face_page.hide_event() + self.show_event() + self._should_show_bad_face_page = False + + def show_event(self): + super().show_event() + self._dialog.show_event() + self._progress.x = 0.0 + self._no_camera_elapsed_sec = 0.0 + + device.set_offroad_brightness(100) + + def _update_state(self): + super()._update_state() + if device.awake and not ui_state.params.get_bool("IsDriverViewEnabled"): + ui_state.params.put_bool_nonblocking("IsDriverViewEnabled", True) + + has_camera_frame = self._dialog._camera_view.frame is not None + if has_camera_frame: + self._no_camera_elapsed_sec = 0.0 + else: + self._no_camera_elapsed_sec += 1.0 / gui_app.target_fps + + # Dev-mode fallback: allow progressing onboarding even when no camera frames are available. + if self._allow_no_camera_bypass and not has_camera_frame: + self._good_button.set_enabled(self._no_camera_elapsed_sec >= self.NO_CAMERA_BYPASS_DELAY_SEC) + return + + sm = ui_state.sm + if sm.recv_frame.get("driverMonitoringState", 0) == 0: + self._good_button.set_enabled(False) + return + + dm_state = sm["driverMonitoringState"] + driver_data = self._dialog.driver_state_renderer.get_driver_data() + + if len(driver_data.faceOrientation) == 3: + pitch, yaw, _ = driver_data.faceOrientation + looking_center = abs(math.degrees(pitch)) < self.LOOKING_THRESHOLD_DEG and abs(math.degrees(yaw)) < self.LOOKING_THRESHOLD_DEG + else: + looking_center = False + + # stay at 100% once reached + if (dm_state.faceDetected and looking_center) or self._progress.x > 0.99: + slow = self._progress.x < 0.25 + duration = self.PROGRESS_DURATION * 2 if slow else self.PROGRESS_DURATION + self._progress.x += 1.0 / (duration * gui_app.target_fps) + self._progress.x = min(1.0, self._progress.x) + else: + self._progress.update(0.0) + + self._good_button.set_enabled(self._progress.x >= 0.999) + + def _render(self, _): + if self._should_show_bad_face_page: + return self._bad_face_page.render(self._rect) + + self._dialog.render(self._rect) + + rl.draw_rectangle_gradient_v(int(self._rect.x), int(self._rect.y + self._rect.height - 80), + int(self._rect.width), 80, rl.BLANK, rl.BLACK) + + # draw white ring around dm icon to indicate progress + ring_thickness = 8 + + # DM icon is 120x120, positioned on opposite side from driver + dm_size = 120 + is_rhd = self._dialog.driver_state_renderer._is_rhd + dm_center_x = (self._rect.x + dm_size / 2 + 8) if is_rhd else (self._rect.x + self._rect.width - dm_size / 2 - 8) + dm_center_y = self._rect.y + dm_size / 2 + 8 + icon_edge_radius = dm_size / 2 + outer_radius = icon_edge_radius + 1 # 2px outward from icon edge + inner_radius = outer_radius - ring_thickness # Inset by ring_thickness + start_angle = 90.0 # Start from bottom + end_angle = start_angle + self._progress.x * 360.0 # Clockwise + + # Fade in alpha + current_angle = end_angle - start_angle + alpha = int(np.interp(current_angle, [0.0, 45.0], [0, 255])) + + # White to green + color_t = np.clip(np.interp(current_angle, [45.0, 360.0], [0.0, 1.0]), 0.0, 1.0) + r = int(np.interp(color_t, [0.0, 1.0], [255, 0])) + g = int(np.interp(color_t, [0.0, 1.0], [255, 255])) + b = int(np.interp(color_t, [0.0, 1.0], [255, 64])) + ring_color = rl.Color(r, g, b, alpha) + + rl.draw_ring( + rl.Vector2(dm_center_x, dm_center_y), + inner_radius, + outer_radius, + start_angle, + end_angle, + 36, + ring_color, + ) + + has_camera_frame = self._dialog._camera_view.frame is not None + show_no_camera_bypass = self._allow_no_camera_bypass and not has_camera_frame + if has_camera_frame or show_no_camera_bypass: + self._back_button.render(rl.Rectangle( + self._rect.x + 8, + self._rect.y + self._rect.height - self._back_button.rect.height, + self._back_button.rect.width, + self._back_button.rect.height, + )) + + self._good_button.render(rl.Rectangle( + self._rect.x + self._rect.width - self._good_button.rect.width - 8, + self._rect.y + self._rect.height - self._good_button.rect.height, + self._good_button.rect.width, + self._good_button.rect.height, + )) + + if show_no_camera_bypass: + gui_label( + rl.Rectangle(self._rect.x + 20, self._rect.y + self._rect.height - 140, self._rect.width - 40, 60), + tr("No camera detected in dev mode. Tap check to continue."), + font_size=34, + font_weight=FontWeight.MEDIUM, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + ) + + # rounded border + rl.draw_rectangle_rounded_lines_ex(self._rect, 0.2 * 1.02, 10, 50, rl.BLACK) + + +class TrainingGuideRecordFront(SetupTermsPage): + def __init__(self, continue_callback): + def on_back(): + ui_state.params.put_bool("RecordFront", False) + continue_callback() + + def on_continue(): + ui_state.params.put_bool("RecordFront", True) + continue_callback() + + super().__init__(on_continue, back_callback=on_back, back_text=tr("no"), continue_text=tr("yes")) + self._title_header = TermsHeader("improve driver monitoring", gui_app.texture("icons_mici/setup/green_dm.png", 60, 60)) + + self._dm_label = UnifiedLabel(tr("Do you want to upload driver camera data?"), 42, + FontWeight.ROMAN) + + def show_event(self): + super().show_event() + # Disable driver monitoring model after last step + ui_state.params.put_bool("IsDriverViewEnabled", False) + + @property + def _content_height(self): + return self._dm_label.rect.y + self._dm_label.rect.height - self._scroll_panel.get_offset() + + def _render_content(self, scroll_offset): + self._title_header.render(rl.Rectangle( + self._rect.x + 16, + self._rect.y + 16 + scroll_offset, + self._title_header.rect.width, + self._title_header.rect.height, + )) + + self._dm_label.render(rl.Rectangle( + self._rect.x + 16, + self._title_header.rect.y + self._title_header.rect.height + 16, + self._rect.width - 32, + self._dm_label.get_content_height(int(self._rect.width - 32)), + )) + + +class TrainingGuideAttentionNotice(SetupTermsPage): + def __init__(self, continue_callback): + super().__init__(continue_callback, continue_text=tr("continue")) + self._title_header = TermsHeader("driver assistance", gui_app.texture("icons_mici/setup/warning.png", 60, 60)) + self._warning_label = UnifiedLabel("1. IQ.Pilot is a driver assistance system.\n\n" + + "2. You must pay attention at all times.\n\n" + + "3. You must be ready to take over at any time.\n\n" + + "4. You are fully responsible for driving the car.", 42, + FontWeight.ROMAN) + + @property + def _content_height(self): + return self._warning_label.rect.y + self._warning_label.rect.height - self._scroll_panel.get_offset() + + def _render_content(self, scroll_offset): + self._title_header.render(rl.Rectangle( + self._rect.x + 16, + self._rect.y + 16 + scroll_offset, + self._title_header.rect.width, + self._title_header.rect.height, + )) + + self._warning_label.render(rl.Rectangle( + self._rect.x + 16, + self._title_header.rect.y + self._title_header.rect.height + 16, + self._rect.width - 32, + self._warning_label.get_content_height(int(self._rect.width - 32)), + )) + + +class TrainingGuide(Widget): + def __init__(self, completed_callback=None): + super().__init__() + self._completed_callback = completed_callback + self._step = 0 + + self_ref = weakref.ref(self) + + def on_continue(): + if obj := self_ref(): + obj._advance_step() + + self._steps = [ + TrainingGuideAttentionNotice(continue_callback=on_continue), + TrainingGuidePreDMTutorial(continue_callback=on_continue), + TrainingGuideDMTutorial(continue_callback=on_continue), + TrainingGuideRecordFront(continue_callback=on_continue), + ] + + def show_event(self): + super().show_event() + device.set_override_interactive_timeout(300) + + def hide_event(self): + super().hide_event() + device.set_override_interactive_timeout(None) + + def _advance_step(self): + if self._step < len(self._steps) - 1: + self._step += 1 + self._steps[self._step].show_event() + else: + self._step = 0 + if self._completed_callback: + self._completed_callback() + + def _render(self, _): + if self._step < len(self._steps): + self._steps[self._step].render(self._rect) + return -1 + + +class DeclinePage(Widget): + def __init__(self, back_callback=None): + super().__init__() + self._uninstall_slider = SmallSlider(tr("uninstall IQ.Pilot"), self._on_uninstall) + + self._back_button = SmallButton(tr("back")) + self._back_button.set_click_callback(back_callback) + + self._warning_header = TermsHeader("you must accept the\nterms to use IQ.Pilot", + gui_app.texture("icons_mici/setup/red_warning.png", 66, 60)) + + def _on_uninstall(self): + ui_state.params.put_bool("DoUninstall", True) + gui_app.request_close() + + def _render(self, _): + self._warning_header.render(rl.Rectangle( + self._rect.x + 16, + self._rect.y + 16, + self._warning_header.rect.width, + self._warning_header.rect.height, + )) + + self._back_button.set_opacity(1 - self._uninstall_slider.slider_percentage) + self._back_button.render(rl.Rectangle( + self._rect.x + 8, + self._rect.y + self._rect.height - self._back_button.rect.height, + self._back_button.rect.width, + self._back_button.rect.height, + )) + + self._uninstall_slider.render(rl.Rectangle( + self._rect.x + self._rect.width - self._uninstall_slider.rect.width, + self._rect.y + self._rect.height - self._uninstall_slider.rect.height, + self._uninstall_slider.rect.width, + self._uninstall_slider.rect.height, + )) + + +class TermsPage(SetupTermsPage): + def __init__(self, on_accept=None, on_decline=None): + super().__init__(on_accept, on_decline, tr("decline")) + + info_txt = gui_app.texture("icons_mici/setup/green_info.png", 60, 60) + self._title_header = TermsHeader("terms of service", info_txt) + + self._terms_label = UnifiedLabel("You must accept the Terms of Service to use IQ.Pilot. " + + "Read the latest terms before continuing at https://iqlvbs.com/tos", 36, + FontWeight.ROMAN) + + @property + def _content_height(self): + return self._terms_label.rect.y + self._terms_label.rect.height - self._scroll_panel.get_offset() + + def _render_content(self, scroll_offset): + self._title_header.set_position(self._rect.x + 16, self._rect.y + 12 + scroll_offset) + self._title_header.render() + + self._terms_label.render(rl.Rectangle( + self._rect.x + 16, + self._title_header.rect.y + self._title_header.rect.height + self.ITEM_SPACING, + self._rect.width - 100, + self._terms_label.get_content_height(int(self._rect.width - 100)), + )) + + +class OnboardingWindow(Widget): + def __init__(self): + super().__init__() + self._accepted_terms: bool = ui_state.params.get("HasAcceptedTerms") == terms_version + self._training_done: bool = ui_state.params.get("CompletedTrainingVersion") == training_version + + self._state = OnboardingState.TERMS if not self._accepted_terms else OnboardingState.ONBOARDING + + self.set_rect(rl.Rectangle(0, 0, 458, gui_app.height)) + + # Windows + self._terms = TermsPage(on_accept=self._on_terms_accepted, on_decline=self._on_terms_declined) + self._training_guide = TrainingGuide(completed_callback=self._on_completed_training) + self._decline_page = DeclinePage(back_callback=self._on_decline_back) + + if not self._accepted_terms: + self._state = OnboardingState.TERMS + elif not self._training_done: + self._state = OnboardingState.ONBOARDING + else: + self._state = OnboardingState.ONBOARDING + + def show_event(self): + super().show_event() + device.set_override_interactive_timeout(300) + + def hide_event(self): + super().hide_event() + device.set_override_interactive_timeout(None) + + @property + def completed(self) -> bool: + return self._accepted_terms and self._training_done + + def _on_terms_declined(self): + self._state = OnboardingState.DECLINE + + def _on_decline_back(self): + self._state = OnboardingState.TERMS + + def close(self): + ui_state.params.put_bool("IsDriverViewEnabled", False) + gui_app.set_modal_overlay(None) + + def _on_terms_accepted(self): + ui_state.params.put("HasAcceptedTerms", terms_version) + if not self._training_done: + self._state = OnboardingState.ONBOARDING + else: + self.close() + + def _on_completed_training(self): + ui_state.params.put("CompletedTrainingVersion", training_version) + self.close() + + def _render(self, _): + # opaque full-screen background so the home/onroad underneath doesn't show through + rl.draw_rectangle_rec(rl.Rectangle(0, 0, gui_app.width, gui_app.height), rl.BLACK) + if self._state == OnboardingState.TERMS: + self._terms.render(self._rect) + elif self._state == OnboardingState.ONBOARDING: + if not self._training_done: + self._training_guide.render(self._rect) + else: + self.close() + elif self._state == OnboardingState.DECLINE: + self._decline_page.render(self._rect) + return -1 diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/cruise.py b/iqpilot/selfdrive/ui/mici/layouts/settings/cruise.py new file mode 100644 index 000000000..d5173478d --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/cruise.py @@ -0,0 +1,101 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigParamControl +from iqpilot.selfdrive.ui.mici.layouts.settings.iq_widgets import FollowDistanceSelector, MappedParamToggle, IQModeSelector, SafeParamControl +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.system.ui.lib.multilang import tr + +MS_TO_MPH = 2.23694 +_SPEED_MPH = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80] +_SPEED_OPTIONS = [f"{s} mph" for s in _SPEED_MPH] +_SPEED_VALUES = [round(s / MS_TO_MPH, 2) for s in _SPEED_MPH] + +_LEAD_SPEED_MPH = [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85] +_LEAD_SPEED_OPTIONS = [f"{s} mph" for s in _LEAD_SPEED_MPH] +_LEAD_SPEED_VALUES = [round(s / MS_TO_MPH, 2) for s in _LEAD_SPEED_MPH] + +_STOP_TIME_OPTIONS = ["1.0s", "1.5s", "2.0s", "2.5s", "3.0s", "3.5s", "4.0s", "4.5s", "5.0s", "5.5s", "6.0s"] +_STOP_TIME_VALUES = [1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0] + +_LOOKAHEAD_OPTIONS = ["1.0s", "2.0s", "3.0s", "4.0s", "5.0s", "6.0s", "7.0s", "8.0s", "9.0s", "10.0s"] +_LOOKAHEAD_VALUES = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0] + + +class DynamicSettingsPanel(NavScroller): + def __init__(self): + super().__init__() + self._items = [ + BigParamControl(tr("IQ.Dynamic Curves"), "IQDynamicConditionalCurves"), + BigParamControl(tr("IQ.Dynamic Slower Lead"), "IQDynamicConditionalSlowerLead"), + BigParamControl(tr("IQ.Dynamic Stopped Lead"), "IQDynamicConditionalStoppedLead"), + BigParamControl(tr("IQ.Dynamic Model Stops"), "IQDynamicConditionalModelStops"), + BigParamControl(tr("IQ.Dynamic SLC Fallback"), "IQDynamicConditionalSLCFallback"), + MappedParamToggle(tr("IQ.Dynamic Low Speed"), "IQDynamicConditionalSpeed", _SPEED_OPTIONS, _SPEED_VALUES), + MappedParamToggle(tr("IQ.Dynamic Lead Speed"), "IQDynamicConditionalLeadSpeed", _LEAD_SPEED_OPTIONS, _LEAD_SPEED_VALUES), + MappedParamToggle(tr("Model Stop Time"), "IQDynamicModelStopTime", _STOP_TIME_OPTIONS, _STOP_TIME_VALUES), + BigParamControl(tr("IQ Force Stops"), "IQForceStops"), + ] + self._scroller.add_widgets(self._items) + + def show_event(self): + super().show_event() + for w in self._items: + w.refresh() + + +class SlcSettingsPanel(NavScroller): + def __init__(self): + super().__init__() + self._items = [ + MappedParamToggle(tr("SLC Policy"), "SLCPolicy", [tr("map only"), tr("map priority"), tr("combined")], [0, 1, 2]), + MappedParamToggle(tr("SLC Override"), "SLCOverrideMethod", [tr("manual"), tr("set speed")], [0, 1]), + BigParamControl(tr("SLC Confirm Higher"), "SpeedLimitConfirmationHigher"), + BigParamControl(tr("SLC Confirm Lower"), "SpeedLimitConfirmationLower"), + BigParamControl(tr("SLC Auto Confirm"), "SLCAutoConfirm"), + BigParamControl(tr("SLC Fallback IQ.Pilot"), "SLCFallbackExperimentalMode"), + BigParamControl(tr("SLC Online Filler"), "SLCOnlineFiller"), + MappedParamToggle(tr("Lookahead Higher"), "MapSpeedLookaheadHigher", _LOOKAHEAD_OPTIONS, _LOOKAHEAD_VALUES), + MappedParamToggle(tr("Lookahead Lower"), "MapSpeedLookaheadLower", _LOOKAHEAD_OPTIONS, _LOOKAHEAD_VALUES), + ] + self._scroller.add_widgets(self._items) + + def show_event(self): + super().show_event() + for w in self._items: + w.refresh() + + +class CruiseLayoutMici(NavScroller): + def __init__(self): + super().__init__() + + self._dynamic_panel = DynamicSettingsPanel() + self._slc_panel = SlcSettingsPanel() + + self._follow_dist = FollowDistanceSelector() + self._mode = IQModeSelector(self._follow_dist.refresh) + self._dynamic_settings = BigButton(tr("iq.dynamic settings")) + self._dynamic_settings.set_click_callback(lambda: gui_app.push_widget(self._dynamic_panel)) + self._dynamic_settings.set_visible(self._mode.is_dynamic) + self._speed_limit = MappedParamToggle(tr("Speed Limit"), "IQSpeedAssistMode", + [tr("off"), tr("info"), tr("warning"), tr("control")]) + self._slc_settings = BigButton(tr("speed limit settings")) + self._slc_settings.set_click_callback(lambda: gui_app.push_widget(self._slc_panel)) + self._new_lead_mpc = SafeParamControl(tr("Experimental Lead MPC"), "newLeadMpc", default_on=True) + + self._main = [self._mode, self._dynamic_settings, self._follow_dist, self._speed_limit, + self._new_lead_mpc, self._slc_settings] + self._scroller.add_widgets(self._main) + + def _refresh(self): + self._mode.refresh() + self._follow_dist.refresh() + self._speed_limit.refresh() + self._new_lead_mpc.refresh() + + def show_event(self): + super().show_event() + self._refresh() diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/dashcam.py b/iqpilot/selfdrive/ui/mici/layouts/settings/dashcam.py new file mode 100644 index 000000000..f25d2c7b0 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/dashcam.py @@ -0,0 +1,38 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigParamControl +from iqpilot.selfdrive.ui.layouts.settings.common import restart_needed_callback +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.multilang import tr + + +class DashcamLayoutMici(NavScroller): + def __init__(self): + super().__init__() + self._dashcam = BigParamControl(tr("enable dashcam"), "DashcamEnabled", toggle_callback=restart_needed_callback) + self._record_front = BigParamControl(tr("record driver camera"), "RecordFront", toggle_callback=restart_needed_callback) + self._record_audio = BigParamControl(tr("record microphone audio"), "RecordAudio", toggle_callback=restart_needed_callback) + + self._scroller.add_widgets([self._dashcam, self._record_front, self._record_audio]) + + self._refresh_toggles = ( + ("DashcamEnabled", self._dashcam), + ("RecordFront", self._record_front), + ("RecordAudio", self._record_audio), + ) + + self._record_front.set_enabled(False if ui_state.params.get_bool("RecordFrontLock") else (lambda: not ui_state.engaged)) + self._record_audio.set_enabled(lambda: not ui_state.engaged) + ui_state.add_engaged_transition_callback(self._update_toggles) + + def show_event(self): + super().show_event() + self._update_toggles() + + def _update_toggles(self): + ui_state.update_params() + for key, item in self._refresh_toggles: + item.set_checked(ui_state.params.get_bool(key)) diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/developer.py b/iqpilot/selfdrive/ui/mici/layouts/settings/developer.py new file mode 100644 index 000000000..fc7cc7cd4 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/developer.py @@ -0,0 +1,129 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.system.hardware.tici.usb_storage import apply_usb_storage_state +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigToggle, BigCircleParamControl +from iqpilot.selfdrive.ui.mici.widgets.stock_dialog import BigDialog, BigInputDialog +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.selfdrive.ui.layouts.settings.common import restart_needed_callback +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.ui.widgets.ssh_key import SshKeyFetcher +from iqpilot.system.ui.lib.multilang import tr + + +class DeveloperLayoutMici(NavScroller): + def __init__(self): + super().__init__() + self._ssh_fetcher = SshKeyFetcher(ui_state.params) + + def github_username_callback(username: str): + if username: + self._ssh_keys_btn.set_value(tr("Loading...")) + self._ssh_keys_btn.set_enabled(False) + + def on_response(error): + self._ssh_keys_btn.set_enabled(True) + if error is None: + self._ssh_keys_btn.set_value(username) + else: + self._ssh_keys_btn.set_value(tr("Not set")) + gui_app.push_widget(BigDialog("", error)) + + self._ssh_fetcher.fetch(username, on_response) + else: + self._ssh_fetcher.clear() + self._ssh_keys_btn.set_value(tr("Not set")) + + def ssh_keys_callback(): + github_username = ui_state.params.get("GithubUsername") or "" + dlg = BigInputDialog(tr("enter GitHub username..."), github_username, minimum_length=0, confirm_callback=github_username_callback) + if not system_time_valid(): + dlg = BigDialog("", tr("Please connect to Wi-Fi to fetch your key.")) + gui_app.push_widget(dlg) + return + gui_app.push_widget(dlg) + + txt_ssh = gui_app.texture("icons_mici/settings/developer/ssh.png", 56, 64) + github_username = ui_state.params.get("GithubUsername") or "" + self._ssh_keys_btn = BigButton(tr("SSH keys"), tr("Not set") if not github_username else github_username, icon=txt_ssh) + self._ssh_keys_btn.set_click_callback(ssh_keys_callback) + + self._adb_toggle = BigCircleParamControl(gui_app.texture("icons_mici/adb_short.png", 82, 82), "AdbEnabled", icon_offset=(0, 12)) + self._usb_storage_toggle = BigCircleParamControl(gui_app.texture("icons_mici/adb_short.png", 82, 82), "UsbStorageEnabled", + toggle_callback=apply_usb_storage_state, icon_offset=(0, 12)) + self._ssh_toggle = BigCircleParamControl(gui_app.texture("icons_mici/ssh_short.png", 82, 82), "SshEnabled", icon_offset=(0, 12)) + self._long_maneuver_toggle = BigToggle(tr("longitudinal maneuver mode"), + initial_state=ui_state.params.get_bool("LongitudinalManeuverMode"), + toggle_callback=self._on_long_maneuver_mode) + self._lat_maneuver_toggle = BigToggle(tr("lateral maneuver mode"), + initial_state=ui_state.params.get_bool("LateralManeuverMode"), + toggle_callback=self._on_lat_maneuver_mode) + + self._scroller.add_widgets([ + self._adb_toggle, + self._usb_storage_toggle, + self._ssh_toggle, + self._ssh_keys_btn, + self._long_maneuver_toggle, + self._lat_maneuver_toggle, + ]) + + self._refresh_toggles = ( + ("AdbEnabled", self._adb_toggle), + ("UsbStorageEnabled", self._usb_storage_toggle), + ("SshEnabled", self._ssh_toggle), + ("LongitudinalManeuverMode", self._long_maneuver_toggle), + ("LateralManeuverMode", self._lat_maneuver_toggle), + ) + onroad_blocked_toggles = (self._adb_toggle, self._usb_storage_toggle) + release_blocked_toggles = (self._long_maneuver_toggle, self._lat_maneuver_toggle) + engaged_blocked_toggles = (self._long_maneuver_toggle, self._lat_maneuver_toggle) + + for item in release_blocked_toggles: + item.set_visible(not ui_state.is_release) + + for item in onroad_blocked_toggles: + item.set_enabled(lambda: ui_state.is_offroad()) + + for item in engaged_blocked_toggles: + item.set_enabled(lambda: not ui_state.engaged) + + ui_state.add_offroad_transition_callback(self._update_toggles) + + def _update_state(self): + super()._update_state() + self._ssh_fetcher.update() + + def show_event(self): + super().show_event() + self._update_toggles() + + def _update_toggles(self): + ui_state.update_params() + + if ui_state.CP is not None: + long_man_enabled = ui_state.has_longitudinal_control and ui_state.is_offroad() + self._long_maneuver_toggle.set_enabled(long_man_enabled) + self._lat_maneuver_toggle.set_enabled(ui_state.is_offroad()) + else: + self._long_maneuver_toggle.set_enabled(False) + self._lat_maneuver_toggle.set_enabled(False) + + for key, item in self._refresh_toggles: + item.set_checked(ui_state.params.get_bool(key)) + + def _on_long_maneuver_mode(self, state: bool): + ui_state.params.put_bool("LongitudinalManeuverMode", state) + ui_state.params.put_bool("LateralManeuverMode", False) + self._lat_maneuver_toggle.set_checked(False) + restart_needed_callback() + + def _on_lat_maneuver_mode(self, state: bool): + ui_state.params.put_bool("LateralManeuverMode", state) + ui_state.params.put_bool("ExperimentalMode", False) + ui_state.params.put_bool("LongitudinalManeuverMode", False) + self._long_maneuver_toggle.set_checked(False) + restart_needed_callback() diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/device.py b/iqpilot/selfdrive/ui/mici/layouts/settings/device.py new file mode 100644 index 000000000..2a177b4a0 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/device.py @@ -0,0 +1,278 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import os +import time +import pyray as rl +from collections.abc import Callable + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.system.ui.widgets.scroller import NavRawScrollPanel, NavScroller +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigCircleButton +from iqpilot.selfdrive.ui.mici.widgets.stock_dialog import BigDialog, BigConfirmationDialog +from iqpilot.selfdrive.ui.mici.widgets.dialog import BigMultiOptionDialog +from iqpilot.selfdrive.ui.mici.widgets.stock_pairing_dialog import PairingDialog +from iqpilot.selfdrive.ui.mici.onroad.driver_camera_dialog import DriverCameraDialog +from iqpilot.selfdrive.ui.mici.layouts.onboarding import TrainingGuide, TermsPage +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.multilang import multilang, tr +from iqpilot.system.ui.widgets import Widget +from iqpilot.selfdrive.ui.ui_state import device, ui_state +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.widgets.html_render import HtmlModal, HtmlRenderer +from iqpilot.konn3kt.registration import UNREGISTERED_DONGLE_ID + + +class ReviewTermsPage(TermsPage, NavScroller): + """TermsPage with NavWidget swipe-to-dismiss for reviewing in device settings.""" + def __init__(self): + super().__init__(on_accept=self.dismiss, on_decline=self.dismiss) + self._continue_button.set_visible(False) + self._back_button.set_visible(False) + + +class ReviewTrainingGuide(TrainingGuide): + def show_event(self): + super().show_event() + device.set_override_interactive_timeout(300) + + def hide_event(self): + super().hide_event() + device.set_override_interactive_timeout(None) + ui_state.params.put_bool("IsDriverViewEnabled", False) + + +class MiciFccModal(NavRawScrollPanel): + def __init__(self, file_path: str | None = None, text: str | None = None): + super().__init__() + self._content = HtmlRenderer(file_path=file_path, text=text) + self._fcc_logo = gui_app.texture("icons_mici/settings/device/fcc_logo.png", 76, 64) + + def _render(self, rect: rl.Rectangle): + content_height = self._content.get_total_height(int(rect.width)) + content_height += self._fcc_logo.height + 20 + + scroll_content_rect = rl.Rectangle(rect.x, rect.y, rect.width, content_height) + scroll_offset = round(self._scroll_panel.update(rect, scroll_content_rect.height)) + + fcc_pos = rl.Vector2(rect.x + 20, rect.y + 20 + scroll_offset) + + scroll_content_rect.y += scroll_offset + self._fcc_logo.height + 20 + self._content.render(scroll_content_rect) + + rl.draw_texture_ex(self._fcc_logo, fcc_pos, 0.0, 1.0, rl.WHITE) + + +def _engaged_confirmation_click(callback: Callable, action_text: str, icon: rl.Texture, exit_on_confirm: bool = True, red: bool = False): + if not ui_state.engaged: + def confirm_callback(): + # Check engaged again in case it changed while the dialog was open + # TODO: if true, we stay on the dialog if not exit_on_confirm until normal onroad timeout + if not ui_state.engaged: + callback() + + gui_app.push_widget(BigConfirmationDialog(tr("slide to\n{}").format(action_text.lower()), icon, confirm_callback, exit_on_confirm=exit_on_confirm, red=red)) + else: + gui_app.push_widget(BigDialog("", tr("Disengage to {}").format(action_text))) + + +class EngagedConfirmationCircleButton(BigCircleButton): + def __init__(self, title: str, icon: rl.Texture, callback: Callable[[], None], exit_on_confirm: bool = True, + red: bool = False, icon_offset: tuple[int, int] = (0, 0)): + super().__init__(icon, red, icon_offset) + self.set_click_callback(lambda: _engaged_confirmation_click(callback, title, icon, exit_on_confirm=exit_on_confirm, red=red)) + + +class EngagedConfirmationButton(BigButton): + def __init__(self, text: str, action_text: str, icon: rl.Texture, callback: Callable[[], None], + exit_on_confirm: bool = True, red: bool = False): + super().__init__(text, "", icon) + self.set_click_callback(lambda: _engaged_confirmation_click(callback, action_text, icon, exit_on_confirm=exit_on_confirm, red=red)) + + +class ForceOffroadButton(BigButton): + def __init__(self): + self._offroad_icon = gui_app.texture("icons/iq/square-parking.png", 64, 64) + super().__init__(tr("force\noffroad"), "", self._offroad_icon) + self.set_press_effect_enabled(False) + self._label.set_font_size(40) + self._label.set_line_height(0.95) + self.set_click_callback(self._on_click) + self._sync_from_params() + + def _forced(self) -> bool: + return ui_state.params.get_bool("IQAlwaysOffroad") + + def _on_click(self): + forced = self._forced() + action = tr("disable force offroad") if forced else tr("force offroad") + _engaged_confirmation_click(lambda: ui_state.params.put_bool("IQAlwaysOffroad", not forced), + action, self._offroad_icon, exit_on_confirm=False) + + def _sync_from_params(self): + self.set_text(tr("disable\nforce offroad") if self._forced() else tr("force\noffroad")) + + def _update_state(self): + super()._update_state() + self._sync_from_params() + + +class DeviceInfoLayoutMici(Widget): + def __init__(self): + super().__init__() + + self.set_rect(rl.Rectangle(0, 0, 360, 180)) + + params = Params() + subheader_color = rl.Color(255, 255, 255, int(255 * 0.9 * 0.65)) + max_width = int(self._rect.width - 20) + self._dongle_id_label = UnifiedLabel(tr("device ID"), 48, max_width=max_width, font_weight=FontWeight.DISPLAY, wrap_text=False) + self._dongle_id_text_label = UnifiedLabel(params.get("DongleId") or 'N/A', 32, max_width=max_width, text_color=subheader_color, + font_weight=FontWeight.ROMAN, wrap_text=False) + + self._serial_number_label = UnifiedLabel(tr("serial"), 48, max_width=max_width, font_weight=FontWeight.DISPLAY, wrap_text=False) + self._serial_number_text_label = UnifiedLabel(params.get("HardwareSerial") or 'N/A', 32, max_width=max_width, text_color=subheader_color, + font_weight=FontWeight.ROMAN, wrap_text=False) + + def _render(self, _): + self._dongle_id_label.set_position(self._rect.x + 20, self._rect.y - 10) + self._dongle_id_label.render() + + self._dongle_id_text_label.set_position(self._rect.x + 20, self._rect.y + 68 - 25) + self._dongle_id_text_label.render() + + self._serial_number_label.set_position(self._rect.x + 20, self._rect.y + 114 - 30) + self._serial_number_label.render() + + self._serial_number_text_label.set_position(self._rect.x + 20, self._rect.y + 161 - 25) + self._serial_number_text_label.render() + + +class PairBigButton(BigButton): + """Konn3kt connect button: logo + live connection-status dot. Uses the new accent box style.""" + KONN3KT_ONLINE_NS = 80_000_000_000 # 80 seconds in nanoseconds + STATUS_ONLINE = rl.Color(0x86, 0xFF, 0x4E, 255) + STATUS_OFFLINE = rl.Color(0xC9, 0x22, 0x31, 255) + + def __init__(self): + super().__init__("konn3kt", tr("pair in app"), gui_app.texture("icons_mici/settings/konn3kt_icon.png", 56, 56)) + + def _get_label_font_size(self): + return 64 + + def _is_konn3kt_online(self) -> bool: + last_ping = ui_state.sm['deviceState'].lastAthenaPingTime + return last_ping != 0 and (time.monotonic_ns() - last_ping) < self.KONN3KT_ONLINE_NS + + def _update_state(self): + super()._update_state() + if ui_state.prime_state.is_paired(): + self.set_value(tr("online") if self._is_konn3kt_online() else tr("offline")) + else: + self.set_value(tr("pair in app")) + + def _render(self, _): + super()._render(_) + if ui_state.prime_state.is_paired(): + color = self.STATUS_ONLINE if self._is_konn3kt_online() else self.STATUS_OFFLINE + rl.draw_circle(int(self._rect.x + 30), int(self._rect.y + 30), 9, color) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + if ui_state.prime_state.is_paired(): + return + dlg: BigDialog | PairingDialog + if not system_time_valid(): + dlg = BigDialog("", tr("Please connect to Wi-Fi to complete initial pairing.")) + elif UNREGISTERED_DONGLE_ID == (ui_state.params.get("DongleId") or UNREGISTERED_DONGLE_ID): + dlg = BigDialog("", tr("Device must be registered with Konn3kt to pair.")) + else: + dlg = PairingDialog() + gui_app.push_widget(dlg) + + +class DeviceLayoutMici(NavScroller): + def __init__(self): + super().__init__() + + self._fcc_dialog: HtmlModal | None = None + + def power_off_callback(): + ui_state.params.put_bool("DoShutdown", True) + + def reboot_callback(): + ui_state.params.put_bool("DoReboot", True) + + def reset_calibration_callback(): + params = ui_state.params + params.remove("CalibrationParams") + params.remove("LiveTorqueParameters") + params.remove("LiveParameters") + params.remove("LiveParametersV2") + params.remove("LiveDelay") + params.put_bool("OnroadCycleRequested", True) + + reset_calibration_btn = EngagedConfirmationButton(tr("reset calibration"), tr("reset"), gui_app.texture("icons_mici/settings/device/lkas.png", 122, 64), + reset_calibration_callback) + + reboot_btn = EngagedConfirmationCircleButton(tr("reboot"), gui_app.texture("icons_mici/settings/device/reboot.png", 64, 70), + reboot_callback, exit_on_confirm=False) + + self._power_off_btn = EngagedConfirmationCircleButton(tr("power off"), gui_app.texture("icons_mici/settings/device/power.png", 64, 66), + power_off_callback, exit_on_confirm=False, red=True) + self._power_off_btn.set_visible(lambda: not ui_state.ignition) + + regulatory_btn = BigButton(tr("regulatory info"), "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) + regulatory_btn.set_click_callback(self._on_regulatory) + + driver_cam_btn = BigButton(tr("driver\ncamera preview"), "", gui_app.texture("icons_mici/settings/device/cameras.png", 64, 64)) + driver_cam_btn.set_click_callback(lambda: gui_app.push_widget(DriverCameraDialog())) + driver_cam_btn.set_enabled(lambda: ui_state.is_offroad()) + + review_training_guide_btn = BigButton(tr("review\ntraining guide"), "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) + review_training_guide_btn.set_click_callback(lambda: gui_app.push_widget(ReviewTrainingGuide(completed_callback=lambda: gui_app.pop_widgets_to(self)))) + review_training_guide_btn.set_enabled(lambda: ui_state.is_offroad()) + + terms_btn = BigButton(tr("terms &\nconditions"), "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64)) + terms_btn.set_click_callback(lambda: gui_app.push_widget(ReviewTermsPage())) + + language_btn = BigButton(tr("change\nlanguage"), multilang.codes.get(multilang.language, ""), + gui_app.texture("icons_mici/settings/device/language.png", 64, 64)) + language_btn.set_click_callback(self._on_change_language) + + self._scroller.add_widgets([ + DeviceInfoLayoutMici(), + PairBigButton(), + review_training_guide_btn, + driver_cam_btn, + language_btn, + terms_btn, + regulatory_btn, + reset_calibration_btn, + ForceOffroadButton(), + reboot_btn, + self._power_off_btn, + ]) + + def _on_change_language(self): + names = list(multilang.languages.keys()) + if not names: + return + current = multilang.codes.get(multilang.language) + dlg = BigMultiOptionDialog(names, current if current in names else names[0], right_btn="check", + right_btn_callback=lambda: self._apply_language(dlg.get_selected_option())) + gui_app.push_widget(dlg) + + def _apply_language(self, name: str): + code = multilang.languages.get(name) + if code and code != multilang.language: + multilang.change_language(code) + + def _on_regulatory(self): + if not self._fcc_dialog: + self._fcc_dialog = MiciFccModal(os.path.join(BASEDIR, "iqpilot/selfdrive/assets/offroad/mici_fcc.html")) + gui_app.push_widget(self._fcc_dialog) diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/display.py b/iqpilot/selfdrive/ui/mici/layouts/settings/display.py new file mode 100644 index 000000000..b291839d6 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/display.py @@ -0,0 +1,56 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigParamControl +from iqpilot.selfdrive.ui.mici.layouts.settings.iq_widgets import MappedParamToggle +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.system.ui.lib.multilang import tr + +_BRIGHT_PERCENTS = [f"{p}%" for p in range(5, 101, 5)] +_DISPLAY_BRIGHT_VALUES = [0] + list(range(5, 101, 5)) + +_ONROAD_BRIGHT_OPTIONS = ["auto", "auto dark"] + _BRIGHT_PERCENTS +_ONROAD_BRIGHT_VALUES = list(range(len(_ONROAD_BRIGHT_OPTIONS))) + +_DELAY_OPTIONS = ["15s", "30s", "1m", "2m", "3m", "4m", "5m", "6m", "7m", "8m", "9m", "10m"] +_DELAY_VALUES = [15, 30, 60, 120, 180, 240, 300, 360, 420, 480, 540, 600] + +_INTERACT_SUFFIX = ["10s", "20s", "30s", "40s", "50s", "1m", "70s", "80s", "90s", "100s", "110s", "2m"] +_INTERACT_VALUES = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120] + + +class DisplayLayoutMici(NavScroller): + def __init__(self): + super().__init__() + self._force_mici = BigParamControl(tr("force mici UI"), "ForceSmallUI") + self._display_bright = MappedParamToggle(tr("display brightness"), "Brightness", + [tr("default")] + _BRIGHT_PERCENTS, _DISPLAY_BRIGHT_VALUES) + self._onroad_bright = MappedParamToggle(tr("driving brightness"), "OnroadScreenOffBrightness", + [tr("auto"), tr("auto dark")] + _BRIGHT_PERCENTS, _ONROAD_BRIGHT_VALUES) + self._delay = MappedParamToggle(tr("brightness delay"), "OnroadScreenOffTimer", + _DELAY_OPTIONS, _DELAY_VALUES) + self._interact = MappedParamToggle(tr("interactivity"), "InteractivityTimeout", + [tr("default")] + _INTERACT_SUFFIX, _INTERACT_VALUES) + + self._items = [self._display_bright, self._onroad_bright, self._delay, self._interact] + if HARDWARE.get_device_type() != "mici": + self._items.insert(0, self._force_mici) + self._scroller.add_widgets(self._items) + + def _refresh(self): + for w in self._items: + w.refresh() + bval = int(float(ui_state.params.get("OnroadScreenOffBrightness", return_default=True) or 0)) + self._delay.set_enabled(bval not in (0, 1)) + + def _update_state(self): + super()._update_state() + bval = int(float(ui_state.params.get("OnroadScreenOffBrightness", return_default=True) or 0)) + self._delay.set_enabled(bval not in (0, 1)) + + def show_event(self): + super().show_event() + self._refresh() diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/drive_history.py b/iqpilot/selfdrive/ui/mici/layouts/settings/drive_history.py new file mode 100644 index 000000000..30232fae8 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/drive_history.py @@ -0,0 +1,89 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import threading +import time + +import pyray as rl + +from iqpilot.common.api import api_get +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.ui.lib.api_helpers import get_token +from iqpilot.selfdrive.ui.ui_state import ui_state, device +from iqpilot.konn3kt.registration import UNREGISTERED_DONGLE_ID +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets.nav_widget import NavWidget + +_ACCENT = rl.Color(0x3A, 0xDD, 0xC6, 255) +_CARD_BG = rl.Color(26, 27, 30, 255) +_LABEL = rl.Color(150, 150, 150, 255) + + +class TripsLayoutMici(NavWidget): + PARAM_KEY = "ApiCache_DriveStats" + UPDATE_INTERVAL = 30 + + def __init__(self): + super().__init__() + self._params = Params() + self._stats = self._params.get(self.PARAM_KEY) or {} + self._bold = gui_app.font(FontWeight.BOLD) + self._medium = gui_app.font(FontWeight.MEDIUM) + self._running = True + self._thread = threading.Thread(target=self._update_loop, daemon=True) + self._thread.start() + + def __del__(self): + self._running = False + + def _fetch(self): + try: + dongle_id = self._params.get("DongleId") + if not dongle_id or dongle_id == UNREGISTERED_DONGLE_ID: + return + resp = api_get(f"v1.1/devices/{dongle_id}/stats", access_token=get_token(dongle_id)) + if resp.status_code == 200: + data = resp.json() + self._stats = data + self._params.put(self.PARAM_KEY, data) + except Exception as e: + cloudlog.error(f"trips: failed to fetch drive stats: {e}") + + def _update_loop(self): + while self._running: + if not ui_state.started and device._awake: + self._fetch() + time.sleep(self.UPDATE_INTERVAL) + + def _render_group(self, x, y, w, h, title, data, is_metric): + rl.draw_rectangle_rounded(rl.Rectangle(x, y, w, h), 0.16, 8, _CARD_BG) + rl.draw_text_ex(self._bold, title, rl.Vector2(x + 22, y + 12), 24, 0, _ACCENT) + + routes = int(data.get("routes", 0) or 0) + distance = data.get("distance", 0) or 0 + dist = int(distance * CV.MPH_TO_KPH) if is_metric else int(distance) + hours = int((data.get("minutes", 0) or 0) / 60) + cols = [(str(routes), "drives"), (str(dist), "km" if is_metric else "mi"), (str(hours), "hours")] + + col_w = w / 3 + for i, (val, lbl) in enumerate(cols): + cx = x + col_w * i + col_w / 2 + vs = measure_text_cached(self._bold, val, 46) + rl.draw_text_ex(self._bold, val, rl.Vector2(cx - vs.x / 2, y + h / 2 - 28), 46, 0, rl.WHITE) + ls = measure_text_cached(self._medium, lbl, 22) + rl.draw_text_ex(self._medium, lbl, rl.Vector2(cx - ls.x / 2, y + h / 2 + 24), 22, 0, _LABEL) + + def _render(self, _): + rect = self._rect + is_metric = self._params.get_bool("IsMetric") + stats = self._stats if isinstance(self._stats, dict) else {} + pad = 12 + h = (rect.height - 3 * pad) / 2 + w = rect.width - 2 * pad + x = rect.x + pad + self._render_group(x, rect.y + pad, w, h, "ALL TIME", stats.get("all", {}), is_metric) + self._render_group(x, rect.y + 2 * pad + h, w, h, "PAST WEEK", stats.get("week", {}), is_metric) diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py b/iqpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py new file mode 100644 index 000000000..c48e7c42f --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py @@ -0,0 +1,161 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.common.params import Params, UnknownKeyName +from iqpilot.selfdrive.longitudinal_settings import ( + LONGITUDINAL_MODE_DYNAMIC, + LONGITUDINAL_MODE_PILOT, + PERSONALITY_VALUES, + apply_longitudinal_mode, + get_follow_distance_state, + get_longitudinal_mode, + set_valid_personality, +) +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigMultiToggle, BigToggle, BigParamControl +from iqpilot.system.ui.lib.multilang import tr + + +class SafeParamControl(BigParamControl): + """BigParamControl that tolerates a param missing from the COMPILED params registry. + + A key added to params_keys.h only exists at runtime once params_pyx.so is rebuilt; a + .py-only / stale prebuilt deploy leaves get_bool/put_bool raising UnknownKeyName, which + would crash the UI on construction. Default to `default_on` for display and no-op the + write instead of crashing — mirrors the plannerd defensive read in long_mpc.py. + """ + + def __init__(self, text: str, param: str, default_on: bool = True, toggle_callback=None): + self._default_on = default_on + BigToggle.__init__(self, text, "", toggle_callback=toggle_callback) + self.param = param + self.params = Params() + self.set_checked(self._safe_get()) + + def _safe_get(self) -> bool: + try: + return self.params.get_bool(self.param) + except UnknownKeyName: + return self._default_on + + def refresh(self): + self.set_checked(self._safe_get()) + + def _handle_mouse_release(self, mouse_pos): + BigToggle._handle_mouse_release(self, mouse_pos) + try: + self.params.put_bool(self.param, self._checked) + except UnknownKeyName: + pass + + +class MappedParamToggle(BigMultiToggle): + """Multi-option toggle whose options map to arbitrary param values (int or float, drum-style). + + Up to PILL_LIMIT options render as the stock vertical pill column; more options would + overflow the box, so they instead show the current value as a sub-label and cycle on tap. + """ + PILL_LIMIT = 4 + + def __init__(self, text: str, param: str, options: list[str], values: list | None = None): + super().__init__(text, options) + self._param = param + self._values = values if values is not None else list(range(len(options))) + self._params = Params() + self.refresh() + + def _value_only(self) -> bool: + return len(self._options) > self.PILL_LIMIT + + def _width_hint(self) -> int: + if self._value_only(): + return BigButton._width_hint(self) + return super()._width_hint() + + def _draw_content(self, btn_x: float, btn_y: float, btn_width: float, btn_height: float): + if self._value_only(): + BigButton._draw_content(self, btn_x, btn_y, btn_width, btn_height) + else: + super()._draw_content(btn_x, btn_y, btn_width, btn_height) + + def refresh(self): + try: + raw = self._params.get(self._param, return_default=True) + except UnknownKeyName: + raw = self._values[0] + try: + cur = float(raw) + except (TypeError, ValueError): + cur = float(self._values[0]) + idx = min(range(len(self._values)), key=lambda i: abs(float(self._values[i]) - cur)) + self.set_value(self._options[idx]) + + def _handle_mouse_release(self, mouse_pos): + super()._handle_mouse_release(mouse_pos) + idx = self._options.index(self.value) + try: + self._params.put(self._param, self._values[idx]) + except UnknownKeyName: + pass + + +class FollowDistanceSelector(BigMultiToggle): + OPTIONS = ["aggressive", "standard", "relaxed", "stock"] + + def __init__(self): + self._display_options = [tr(option) for option in self.OPTIONS] + super().__init__(tr("Follow Distance"), self._display_options) + self._params = Params() + self.refresh() + + def refresh(self): + selection, enabled = get_follow_distance_state(self._params) + self.set_value(self._display_options[3 if selection is None else selection]) + self.set_enabled(enabled) + + def _handle_mouse_release(self, mouse_pos): + if get_longitudinal_mode(self._params) not in (LONGITUDINAL_MODE_DYNAMIC, LONGITUDINAL_MODE_PILOT): + return + BigButton._handle_mouse_release(self, mouse_pos) + selection, _ = get_follow_distance_state(self._params) + if selection is None: + self.refresh() + return + next_selection = PERSONALITY_VALUES[(PERSONALITY_VALUES.index(selection) + 1) % len(PERSONALITY_VALUES)] + set_valid_personality(self._params, next_selection) + self.set_value(self._display_options[next_selection]) + + +class IQModeSelector(BigMultiToggle): + """Longitudinal mode selector: Stock ACC / IQ.Chill / IQ.Dynamic / IQ.Pilot. + + A single tap cycles to the next mode and applies the matching param combo immediately. + """ + OPTIONS = ["Stock ACC", "IQ.Chill", "IQ.Dynamic", "IQ.Pilot"] + + def __init__(self, mode_callback=None): + self._display_options = [tr(option) for option in self.OPTIONS] + super().__init__(tr("IQ Mode"), self._display_options) + self._params = Params() + self._mode_callback = mode_callback + self.refresh() + + def _index(self) -> int: + return get_longitudinal_mode(self._params) + + def is_dynamic(self) -> bool: + return self._index() == 2 + + def refresh(self): + self.set_value(self._display_options[self._index()]) + + def _apply(self, idx: int): + apply_longitudinal_mode(self._params, idx) + self._params.put_bool("OnroadCycleRequested", True) + + def _handle_mouse_release(self, mouse_pos): + nxt = (self._index() + 1) % len(self.OPTIONS) + self._apply(nxt) + self.set_value(self._display_options[nxt]) + if self._mode_callback: + self._mode_callback() diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/models.py b/iqpilot/selfdrive/ui/mici/layouts/settings/models.py new file mode 100644 index 000000000..d0ce457c0 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/models.py @@ -0,0 +1,581 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import os +import re +import threading +import time + +import pyray as rl + +from iqpilot.cereal import custom + +from iqpilot.system.ui.iqwidgets.widgets.helpers.glyphs import draw_star + +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigParamControl, GreyBigButton +from iqpilot.selfdrive.ui.mici.widgets.stock_dialog import BigConfirmationDialog +from iqpilot.selfdrive.ui.mici.layouts.settings.iq_widgets import MappedParamToggle + +from iqpilot.selfdrive.iqmodeld.models.helpers import select_default_model, is_default_bundle +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUSTOM_MODEL_PATH +from iqpilot.system.ui.lib.multilang import tr + +_DELAY_OPTIONS = ["0.05s", "0.10s", "0.15s", "0.20s", "0.25s", "0.30s", "0.35s", "0.40s", "0.45s", "0.50s"] +_DELAY_VALUES = [0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50] + +_LANE_TURN_VALUES = [15.0, 19.0, 20.0] + +_DL = custom.IQModelManager.DownloadStatus +_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle" +_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex" +_RUNNER_CACHE_KEY = "ModelRunnerTypeCache" + + +def _display_model_name(bundle) -> str: + return bundle.internalName if getattr(bundle, "internalName", "") else bundle.displayName + + +def _big_options() -> list[tuple[str, str]]: + try: + from iqpilot.selfdrive.iqmodeld.emac_model_meta import big_models + return big_models(ui_state.params) + except Exception: + return [] + + +def _big_label(key: str) -> str: + for name, display in _big_options(): + if name == key: + return display + return key or "lebrowski" + + +def _refresh_big_catalog() -> None: + def worker(): + try: + from iqpilot.selfdrive.iqmodeld.emac_model_meta import refresh_catalog + refresh_catalog(ui_state.params) + except Exception: + pass + threading.Thread(target=worker, daemon=True).start() + + +class _ModelSelectPanel(NavScroller): + """A throwaway scroller panel (folder list or bundle list) pushed onto the nav stack.""" + def __init__(self, items): + super().__init__() + self._scroller.add_widgets(items) + + +class _ModelButton(BigButton): + """A bundle in the model list: single tap selects (download), double tap toggles favorite. + + A golden star is drawn in the corner when the model is favorited. + """ + THRESHOLD = 0.4 + _STAR_GOLD = rl.Color(0xFF, 0xC1, 0x07, 255) + + def __init__(self, bundle, on_select, on_favorite, is_favorite): + super().__init__(bundle.displayName) + self._bundle = bundle + self._on_select = on_select + self._on_favorite = on_favorite + self._is_favorite = is_favorite + self._pending_t = 0.0 + self._pending_pos = None + + def _handle_mouse_release(self, mouse_pos): + now = time.monotonic() + if self._pending_pos is not None and now - self._pending_t < self.THRESHOLD: + self._pending_pos = None + self._pending_t = 0.0 + self._is_favorite = self._on_favorite(self._bundle) + return + self._pending_t = now + self._pending_pos = mouse_pos + + def _update_state(self): + super()._update_state() + if self._pending_pos is not None and time.monotonic() - self._pending_t >= self.THRESHOLD: + self._pending_pos = None + self._on_select(self._bundle) + + def _render(self, _): + super()._render(_) + if self._is_favorite: + cx = self._rect.x + self._rect.width - 46 + cy = self._rect.y + 46 + draw_star(cx, cy, 24, True, self._STAR_GOLD) + + +class ModelsLayoutMici(NavScroller): + def __init__(self): + super().__init__() + self._last_cache_t = 0.0 + self._download_status = None + self._prev_download_status = None + self._clear_icon = gui_app.texture("icons_mici/settings/developer_icon.png", 56, 56) + self._redownload_icon = gui_app.texture("icons_mici/settings/device/update.png", 56, 56, keep_aspect_ratio=True) + self._reset_icon = gui_app.texture("icons_mici/wheel.png", 56, 56) + + self._current = BigButton(tr("active model")) + self._current.set_click_callback(self._show_folders) + + self._big = BigButton(tr("big model")) + self._big.set_click_callback(self._show_big_models) + + self._cancel = BigButton(tr("stop download")) + self._cancel.set_click_callback(self._cancel_model_request) + self._cancel.set_visible(self._is_downloading) + + self._redownload = BigButton(tr("redownload model")) + self._redownload.set_click_callback(self._confirm_redownload_model) + self._redownload.set_enabled(self._can_redownload) + + self._refresh = BigButton(tr("reload model list")) + self._refresh.set_click_callback(self._reload_model_lists) + + self._supercombo = GreyBigButton(tr("combined model")) + self._supercombo.set_visible(False) + self._vision = GreyBigButton(tr("vision weights")) + self._vision.set_visible(False) + self._policy = GreyBigButton(tr("policy weights")) + self._policy.set_visible(False) + + self._clear = BigButton(tr("purge model cache")) + self._clear.set_click_callback(self._confirm_clear_cache) + self._clear.set_enabled(lambda: ui_state.is_offroad()) + + self._steer_delay = BigParamControl(tr("self-tuning steer delay"), "IQLiveSteerDelay") + self._sw_delay = MappedParamToggle(tr("manual delay offset"), "IQSoftwareSteerDelay", _DELAY_OPTIONS, _DELAY_VALUES) + self._sw_delay.set_visible(lambda: not self._steer_delay._checked) + + self._lane_turn = BigParamControl(tr("low-speed turn planning"), "IQLaneTurnDesire") + self._lane_speed = MappedParamToggle(tr("lane turn speed"), "IQLaneTurnValue", [tr("slow"), tr("normal"), tr("fast")], _LANE_TURN_VALUES) + self._lane_speed.set_visible(lambda: self._lane_turn._checked) + + self._main_items = [self._current, self._big, self._cancel, self._supercombo, self._vision, self._policy, self._redownload, self._refresh, self._clear, + self._steer_delay, self._sw_delay, self._lane_turn, self._lane_speed] + self._scroller.add_widgets(self._main_items) + + @property + def model_manager(self): + return ui_state.sm["iqModelManager"] + + @staticmethod + def _has_download_request() -> bool: + try: + return int(ui_state.params.get(_DOWNLOAD_INDEX_KEY)) >= 0 + except (TypeError, ValueError): + return False + + @staticmethod + def _has_active_bundle_param() -> bool: + return bool(ui_state.params.get(_ACTIVE_BUNDLE_KEY)) + + def _has_model_request(self) -> bool: + return self._has_download_request() + + def _is_downloading(self) -> bool: + try: + return bool(self.model_manager.selectedBundle and self.model_manager.selectedBundle.status == _DL.downloading) + except Exception: + return False + + @staticmethod + def _calculate_cache_size() -> float: + if os.path.exists(CUSTOM_MODEL_PATH): + return sum(os.path.getsize(os.path.join(CUSTOM_MODEL_PATH, f)) for f in os.listdir(CUSTOM_MODEL_PATH)) / (1024 ** 2) + return 0.0 + + @staticmethod + def _bundle_index(bundle) -> int | None: + try: + return int(getattr(bundle, "index", -1)) + except (TypeError, ValueError): + return None + + @classmethod + def _bundle_matches(cls, left, right) -> bool: + if left is None or right is None: + return False + + left_index = cls._bundle_index(left) + right_index = cls._bundle_index(right) + if left_index is not None and right_index is not None and left_index == right_index: + return True + + for attr in ("ref", "internalName", "displayName"): + left_value = getattr(left, attr, None) + if left_value and left_value == getattr(right, attr, None): + return True + return False + + @staticmethod + def _safe_model_path(filename: str) -> str | None: + if not filename or os.path.basename(filename) != filename: + return None + + root = os.path.realpath(CUSTOM_MODEL_PATH) + path = os.path.realpath(os.path.join(root, filename)) + try: + if os.path.commonpath([root, path]) != root: + return None + except ValueError: + return None + return path + + def _remove_bundle_files(self, bundle) -> None: + for model in getattr(bundle, "models", []) or []: + for artifact in (getattr(model, "metadata", None), getattr(model, "artifact", None)): + filename = getattr(artifact, "fileName", "") if artifact is not None else "" + path = self._safe_model_path(filename) + if path is None: + continue + for candidate in (path, f"{path}.download"): + try: + if os.path.isfile(candidate): + os.remove(candidate) + except OSError: + pass + + def _group_folders(self, bundles): + folders: dict = {} + for bundle in bundles: + folder = next((ov.value for ov in bundle.overrides if ov.key == "folder"), "") + folders.setdefault(folder, []).append(bundle) + return folders + + @staticmethod + def _read_favorites() -> set: + favs = ui_state.params.get("IQModelFavorites") + return set(favs.split(';')) if favs else set() + + def _toggle_favorite(self, bundle) -> bool: + favs = self._read_favorites() + if bundle.ref in favs: + favs.discard(bundle.ref) + else: + favs.add(bundle.ref) + ui_state.params.put("IQModelFavorites", ';'.join(sorted(favs))) + return bundle.ref in favs + + def _confirm_clear_cache(self): + gui_app.push_widget(BigConfirmationDialog(tr("slide to\nclear cache"), self._clear_icon, + lambda: ui_state.params.put_bool("ModelManager_ClearCache", True), + red=True)) + + def _redownload_target_bundle(self): + try: + selected = self.model_manager.selectedBundle + if selected and selected.status == _DL.failed: + return selected + active = self.model_manager.activeBundle + if self._has_active_bundle_param() and active and active.ref: + return active + except Exception: + pass + return None + + def _redownload_target_index(self) -> int | None: + target = self._redownload_target_bundle() + if not target: + return None + + try: + return int(target.index) + except (TypeError, ValueError): + pass + + try: + for bundle in self.model_manager.availableBundles: + if bundle.ref and bundle.ref == target.ref: + return int(bundle.index) + if bundle.internalName and bundle.internalName == target.internalName: + return int(bundle.index) + except Exception: + pass + return None + + def _can_redownload(self) -> bool: + return bool(ui_state.is_offroad() and not self._is_downloading() and not self._has_model_request() and self._redownload_target_index() is not None) + + def _cancel_model_request(self): + ui_state.params.remove(_DOWNLOAD_INDEX_KEY) + + def _confirm_redownload_model(self): + index = self._redownload_target_index() + if index is None: + return + + def _redownload(): + target = self._redownload_target_bundle() + if target is not None: + self._remove_bundle_files(target) + if self._bundle_matches(getattr(self.model_manager, "activeBundle", None), target): + ui_state.params.remove(_ACTIVE_BUNDLE_KEY) + ui_state.params.remove(_RUNNER_CACHE_KEY) + ui_state.params.put(_DOWNLOAD_INDEX_KEY, index) + self._redownload.set_value(tr("queued")) + + gui_app.push_widget(BigConfirmationDialog(tr("slide to\nredownload"), self._redownload_icon, _redownload, red=True)) + + def _show_folders(self): + bundles = list(self.model_manager.availableBundles) + favorites = self._read_favorites() + btns = [] + + default_btn = BigButton(tr("Default (CD210)")) + default_btn.set_click_callback(self._select_default) + btns.append(default_btn) + + if favorites and (fav_bundles := [b for b in bundles if b.ref in favorites]): + fav_btn = BigButton(tr("Favorites"), str(len(fav_bundles))) + fav_btn.set_click_callback(lambda fb=fav_bundles: self._show_bundles(fb)) + btns.append(fav_btn) + + folders = self._group_folders(bundles) + for folder in sorted(folders, key=lambda f: max((b.index for b in folders[f]), default=-1), reverse=True): + name = folder if folder else "Other" + folder_bundles = sorted(folders[folder], key=lambda b: b.index, reverse=True) + if folder_bundles and (m := re.search(r'\(([^)]*)\)[^(]*$', folder_bundles[0].displayName)): + name += f" ({m.group(1)})" + btn = BigButton(name) + btn.set_click_callback(lambda fb=folder_bundles: self._show_bundles(fb)) + btns.append(btn) + + gui_app.push_widget(_ModelSelectPanel(btns)) + + def _show_bundles(self, bundles): + favorites = self._read_favorites() + btns = [_ModelButton(b, self._select_model, self._toggle_favorite, b.ref in favorites) for b in bundles] + gui_app.push_widget(_ModelSelectPanel(btns)) + + def _reload_model_lists(self): + ui_state.params.put("ModelManager_LastSyncTime", 0) + _refresh_big_catalog() + + def _show_big_models(self): + _refresh_big_catalog() + options = _big_options() + off = BigButton(tr("Off")) + off.set_click_callback(lambda: self._select_big(None)) + btns = [off] + for key, display in options: + btn = BigButton(display) + btn.set_click_callback(lambda k=key: self._select_big(k)) + btns.append(btn) + gui_app.push_widget(_ModelSelectPanel(btns)) + + def _select_big(self, key): + if key is None: + ui_state.params.put_bool("IQEmacEnabled", False) + else: + ui_state.params.put("IQEmacModel", key) + ui_state.params.put_bool("IQEmacEnabled", True) + gui_app.pop_widgets_to(self) + + def _big_setup_progress(self) -> float | None: + p = ui_state.params + if p.get_bool("IQEmacEnabled"): + raw = p.get("MacModelDownloadProgress") + loading = not p.get_bool("MacModelReady") + else: + raw = p.get("UsbGpuSetupProgress") + loading = p.get_bool("UsbGpuLoading") and not p.get_bool("UsbGpuCompiled") + if not loading: + return None + try: + return max(0.0, min(1.0, float(raw))) + except (TypeError, ValueError): + return None + + def _big_model_value(self) -> str: + p = ui_state.params + dock = bool(getattr(ui_state.sm["deviceState"], "egpuDockPresent", False)) + if not p.get_bool("IQEmacEnabled") and not dock: + return tr("Off") + key = p.get("IQEmacModel") + key = key.decode() if isinstance(key, bytes) else (key or "") + label = _big_label(key) + progress = self._big_setup_progress() + if progress is not None and progress < 1.0: + return f"{label} {int(progress * 100)}%" + return label + + def _generation_changed(self, bundle) -> bool: + try: + active = self.model_manager.activeBundle + return bool(active and active.ref and bundle.generation != active.generation) + except Exception: + return False + + def _select_model(self, bundle): + ui_state.params.put(_DOWNLOAD_INDEX_KEY, bundle.index) + cb = self._show_reset_calibration_prompt if self._generation_changed(bundle) else lambda: None + gui_app.pop_widgets_to(self, callback=cb) + + def _select_default(self): + try: + active = self.model_manager.activeBundle + had_custom_model = bool(active and active.ref and not is_default_bundle(active)) + except Exception: + had_custom_model = False + + select_default_model(ui_state.params) + gui_app.pop_widgets_to(self, callback=self._show_reset_calibration_prompt if had_custom_model else (lambda: None)) + + def _show_reset_calibration_prompt(self): + def _reset(): + ui_state.params.remove("CalibrationParams") + ui_state.params.remove("LiveTorqueParameters") + gui_app.push_widget(BigConfirmationDialog(tr("slide to\nreset calibration"), self._reset_icon, _reset)) + + def _update_state(self): + super()._update_state() + + self._handle_bundle_download_progress() + self._current.set_value(self._current_model_value()) + self._current.set_enabled(ui_state.is_offroad()) + self._big.set_value(self._big_model_value()) + target = self._redownload_target_bundle() + self._redownload.set_value(_display_model_name(target) if target else "") + + now = time.monotonic() + if now - self._last_cache_t > 1.0: + self._last_cache_t = now + self._clear.set_value(f"{self._calculate_cache_size():.1f} MB") + + self._update_steer_delay_subtext() + + def _progress_target_bundle(self): + try: + selected = self.model_manager.selectedBundle + active = self.model_manager.activeBundle + except Exception: + return None + + if selected and (selected.status == _DL.downloading or selected.status == _DL.failed): + return selected + return active if self._has_active_bundle_param() else None + + def _handle_bundle_download_progress(self): + labels = { + custom.IQModelManager.Model.Type.supercombo: self._supercombo, + custom.IQModelManager.Model.Type.vision: self._vision, + custom.IQModelManager.Model.Type.policy: self._policy, + } + for label in labels.values(): + label.set_visible(False) + label.set_value("") + + self._cancel.set_visible(False) + + bundle = self._progress_target_bundle() + if not bundle: + self._download_status = None + self._prev_download_status = None + return + + self._download_status = bundle.status + status_changed = self._download_status != self._prev_download_status + self._prev_download_status = self._download_status + + self._cancel.set_visible(bool(getattr(self.model_manager, "selectedBundle", None)) and self._has_download_request()) + + if self._download_status not in (_DL.downloading, _DL.failed): + return + + if self._download_status == _DL.downloading: + try: + from iqpilot.selfdrive.ui.ui_state import device + device._reset_interactive_timeout() + except Exception: + pass + + for model in bundle.models: + label = labels.get(getattr(model.type, "raw", model.type)) + if label is None: + continue + label.set_visible(True) + label.set_value(self._download_label_text(bundle, model, status_changed)) + + def _download_label_text(self, bundle, model, status_changed: bool) -> str: + p = model.artifact.downloadProgress + if p.status == _DL.downloading: + return f"{int(p.progress)}% downloading {_display_model_name(bundle)}" + if p.status in (_DL.downloaded, _DL.cached): + if self._download_status == _DL.downloading: + return f"{_display_model_name(bundle)} ready" + return f"{_display_model_name(bundle)} {'downloaded' if status_changed else 'ready'}" + if p.status == _DL.failed: + return f"download failed {_display_model_name(bundle)}" + return f"pending {_display_model_name(bundle)}" + + def _current_model_value(self) -> str: + bundle = self._progress_target_bundle() + if not bundle: + return self._active_model_name() + + if self._download_status == _DL.downloading: + return self._download_progress_text(bundle) + if self._download_status == _DL.failed: + return f"failed: {_display_model_name(bundle)}" + return self._active_model_name() + + def _update_steer_delay_subtext(self): + if self._steer_delay._checked: + try: + self._steer_delay.set_value(f"measured {ui_state.sm['lateralDelay'].lateralDelay:.3f} s") + except Exception: + self._steer_delay.set_value("") + return + try: + sw = float(ui_state.params.get("IQSoftwareSteerDelay", return_default=True)) + except (TypeError, ValueError): + sw = 0.2 + if ui_state.CP is not None: + self._steer_delay.set_value(f"total {ui_state.CP.steerActuatorDelay + sw:.2f} s") + else: + self._steer_delay.set_value(f"+{sw:.2f} s offset") + + def _active_model_name(self) -> str: + if not self._has_active_bundle_param(): + return "Default (CD210)" + + try: + active = self.model_manager.activeBundle + if is_default_bundle(active): + return active.displayName or "Default (CD210)" + if active and active.ref: + return _display_model_name(active) + except Exception: + pass + return "Default (CD210)" + + def _download_progress_text(self, bundle=None) -> str: + bundle = bundle or getattr(self.model_manager, "selectedBundle", None) + if not bundle: + return "downloading..." + try: + parts = [] + for model in bundle.models: + p = model.artifact.downloadProgress + if p.status == _DL.downloading: + parts.append(f"{int(p.progress)}%") + elif p.status in (_DL.downloaded, _DL.cached): + parts.append("ready") + elif p.status == _DL.failed: + parts.append("failed") + return f"{_display_model_name(bundle)} {' '.join(parts)}".strip() or "downloading..." + except Exception: + return "downloading..." + + def show_event(self): + super().show_event() + for w in (self._steer_delay, self._sw_delay, self._lane_turn, self._lane_speed): + w.refresh() diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/network/__init__.py b/iqpilot/selfdrive/ui/mici/layouts/settings/network/__init__.py new file mode 100644 index 000000000..5ece1c074 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/network/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py b/iqpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py new file mode 100644 index 000000000..532d72f51 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py @@ -0,0 +1,189 @@ +from __future__ import annotations + +from collections.abc import Callable + +import pyray as rl + +from iqpilot.system.hardware.base import Profile +from iqpilot.system.hardware.tici.esim_manager import EsimManager, EsimUiState, get_esim_manager +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets import DialogResult, NavWidget +from iqpilot.system.ui.widgets.esim_scanner import EsimQrScannerDialog +from iqpilot.selfdrive.ui.mici.widgets.button import NeonBigButton +from iqpilot.selfdrive.ui.mici.widgets.dialog import BigDialog, BigInputDialog, BigMultiOptionDialog, BigConfirmationDialogV2 +from iqpilot.system.ui.widgets.scroller import Scroller +from iqpilot.system.ui.lib.multilang import tr + + +class EsimUIMici(NavWidget): + def __init__(self, back_callback: Callable): + super().__init__() + self._manager: EsimManager = get_esim_manager() + self._state = EsimUiState() + self._callback_registered = False + self._scroller = Scroller([], snap_items=False) + self._rebuild_scroller() + self.set_back_callback(back_callback) + + def show_event(self): + super().show_event() + self._scroller.show_event() + if not self._callback_registered: + self._manager.add_callback(self._on_state_update) + self._callback_registered = True + self._manager.refresh_profiles() + + def hide_event(self): + super().hide_event() + if self._callback_registered: + self._manager.remove_callback(self._on_state_update) + self._callback_registered = False + + def _is_busy(self) -> bool: + return self._state.busy + + def _status_text(self) -> str: + if self._state.message: + return self._state.message + return self._state.state.value + + def _on_state_update(self, state: EsimUiState): + self._state = state + self._rebuild_scroller() + + def _show_choice_dialog(self, title: str, options: list[str], callback: Callable[[str], None]) -> None: + if not options: + return + dlg = BigMultiOptionDialog( + options, + options[0], + right_btn="check", + right_btn_callback=lambda: callback(dlg.get_selected_option()), + ) + gui_app.set_modal_overlay(dlg) + + def _rebuild_scroller(self): + widgets = [] + + status_btn = NeonBigButton(tr("status"), chips=[self._status_text()]) + status_btn.set_enabled(False) + widgets.append(status_btn) + + refresh_btn = NeonBigButton(tr("refresh profiles")) + refresh_btn.set_enabled(lambda: not self._is_busy()) + refresh_btn.set_click_callback(lambda: self._manager.refresh_profiles()) + widgets.append(refresh_btn) + + add_btn = NeonBigButton(tr("add profile"), chips=[tr("scan qr / enter code")]) + add_btn.set_enabled(lambda: not self._is_busy()) + add_btn.set_click_callback(self._on_add_profile) + widgets.append(add_btn) + + profiles = self._state.profiles or [] + for p in profiles: + widgets.append(self._make_profile_button(p)) + + self._scroller = Scroller(widgets, snap_items=False) + + def _make_profile_button(self, profile: Profile) -> NeonBigButton: + title = profile.nickname if profile.nickname else profile.iccid + provider = profile.provider or tr("provider unknown") + value = f"{provider}{' â€ĸ ' + tr('active') if profile.enabled else ''}" + btn = NeonBigButton(title, chips=[value]) + btn.set_enabled(lambda: not self._is_busy()) + btn.set_click_callback(lambda profile=profile: self._on_profile_selected(profile)) + return btn + + def _on_add_profile(self): + options = [tr("scan qr"), tr("enter code")] + + def _selected(option: str): + if option == options[0]: + self._scan_qr() + elif option == options[1]: + self._manual_entry() + + self._show_choice_dialog(tr("add esim profile"), options, _selected) + + def _scan_qr(self): + scanner = EsimQrScannerDialog() + self._manager.set_scanning_state(True) + + def _done(result: int): + self._manager.set_scanning_state(False) + if result != DialogResult.CONFIRM or not scanner.code: + return + self._prompt_nickname_and_add(scanner.code) + + gui_app.set_modal_overlay(scanner, _done) + + def _manual_entry(self): + dlg = BigInputDialog(tr("enter LPA activation code..."), "", minimum_length=1, + confirm_callback=lambda code: self._prompt_nickname_and_add(code.strip()) if code.strip() else None) + gui_app.set_modal_overlay(dlg) + + def _prompt_nickname_and_add(self, code: str): + dlg = BigInputDialog(tr("optional nickname..."), "", minimum_length=0, + confirm_callback=lambda nickname: self._manager.add_profile(code, nickname.strip() or None)) + gui_app.set_modal_overlay(dlg) + + def _on_profile_selected(self, profile: Profile): + options = [] + if not profile.enabled: + options.append(tr("activate")) + options.append(tr("rename")) + if self._manager.is_comma_profile(profile.iccid): + options.append(tr("remove comma psim")) + elif not profile.enabled: + options.append(tr("delete")) + + def _selected(option: str): + if option == tr("activate"): + self._manager.switch_profile(profile.iccid) + elif option == tr("rename"): + self._rename_profile(profile) + elif option == tr("remove comma psim"): + self._remove_comma_profile() + elif option == tr("delete"): + self._manager.delete_profile(profile.iccid) + + self._show_choice_dialog(tr("profile actions"), options, _selected) + + def _rename_profile(self, profile: Profile): + dlg = BigInputDialog(tr("rename profile..."), profile.nickname or "", minimum_length=1, + confirm_callback=lambda nickname: self._manager.rename_profile(profile.iccid, nickname.strip()) if nickname.strip() else None) + gui_app.set_modal_overlay(dlg) + + def _remove_comma_profile(self): + dlg = BigDialog( + tr("Warning"), + tr("This will permanently wipe the Comma pSIM profile from the SIM."), + right_btn="check", + right_btn_callback=self._remove_comma_profile_final_warning, + ) + gui_app.set_modal_overlay(dlg) + + def _remove_comma_profile_final_warning(self): + dlg = BigDialog( + tr("Final Warning"), + tr("You must use your own eSIM profile after this. You cannot use Comma Prime again unless you buy a new SIM from comma."), + right_btn="check", + right_btn_callback=self._confirm_remove_comma_profile, + ) + gui_app.set_modal_overlay(dlg) + + def _confirm_remove_comma_profile(self): + dlg = BigConfirmationDialogV2( + tr("slide to remove\ncomma psim"), + "icons_mici/settings/network/new/trash.png", + red=True, + confirm_callback=self._manager.bootstrap, + ) + gui_app.set_modal_overlay(dlg) + + def _render(self, rect: rl.Rectangle): + if not self._manager.is_supported(): + from iqpilot.system.ui.widgets.label import gui_label + gui_label(rect, tr("Insert the original comma SIM card that came with the device to use eSIM"), 48, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + return + self._scroller.render(rect) diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py b/iqpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py new file mode 100644 index 000000000..e3d0fd18d --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py @@ -0,0 +1,233 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import pyray as rl +from enum import IntEnum +from collections.abc import Callable + +from iqpilot.system.ui.widgets.scroller import Scroller, draw_scroller_edge_fades, draw_scroller_page_slider +from iqpilot.selfdrive.ui.mici.layouts.settings.network.wifi_ui import WifiUIMici +from iqpilot.selfdrive.ui.mici.layouts.settings.network.esim_ui import EsimUIMici +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigParamControl, BigMultiToggle +from iqpilot.selfdrive.ui.mici.widgets.stock_dialog import BigInputDialog +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets.nav_widget import NavWidget +from iqpilot.system.ui.lib.wifi_manager import WifiManager, Network, MeteredType +from iqpilot.system.hardware.tici.esim_manager import get_esim_manager +from iqpilot.system.ui.lib.multilang import tr + + +class NetworkPanelType(IntEnum): + NONE = 0 + WIFI = 1 + ESIM = 2 + + +class NetworkLayoutMici(NavWidget): + CALLBACK_INTERVAL_FRAMES = 3 + + def __init__(self, back_callback: Callable): + super().__init__() + + self._current_panel = NetworkPanelType.WIFI + self._callback_frame = 0 + self._esim_profile_count: str | None = None + self._esim_profile_frame = 0 + + self._wifi_manager = WifiManager() + self._wifi_manager.set_active(False) + self._wifi_ui = WifiUIMici(self._wifi_manager) + self._esim_ui = EsimUIMici(back_callback=lambda: self._switch_to_panel(NetworkPanelType.NONE)) + self._esim_manager = get_esim_manager() + + self._wifi_manager.add_callbacks( + networks_updated=self._on_network_updated, + ) + + # ******** Tethering ******** + def tethering_toggle_callback(checked: bool): + self._tethering_toggle_btn.set_enabled(False) + self._network_metered_btn.set_enabled(False) + self._wifi_manager.set_tethering_active(checked) + + self._tethering_checked = False + self._tethering_toggle_btn = BigButton(tr("tethering"), tr("disabled")) + self._tethering_toggle_btn.set_click_callback(lambda: self._on_tethering_clicked(tethering_toggle_callback)) + + def tethering_password_callback(password: str): + if password: + self._wifi_manager.set_tethering_password(password) + + def tethering_password_clicked(): + tethering_password = self._wifi_manager.tethering_password + dlg = BigInputDialog(tr("enter password..."), tethering_password, minimum_length=8, + confirm_callback=tethering_password_callback) + gui_app.push_widget(dlg) + + self._tethering_password_btn = BigButton(tr("tethering password")) + self._tethering_password_btn.set_click_callback(tethering_password_clicked) + + # ******** IP Address ******** + self._ip_address_btn = BigButton(tr("IP Address"), tr("Not connected")) + + # ******** Network Metered ******** + self._metered_options = [tr("default"), tr("metered"), tr("unmetered")] + + def network_metered_callback(value: str): + self._network_metered_btn.set_enabled(False) + metered = { + self._metered_options[0]: MeteredType.UNKNOWN, + self._metered_options[1]: MeteredType.YES, + self._metered_options[2]: MeteredType.NO + }.get(value, MeteredType.UNKNOWN) + self._wifi_manager.set_current_network_metered(metered) + + # TODO: signal for current network metered type when changing networks, this is wrong until you press it once + # TODO: disable when not connected + self._network_metered_btn = BigMultiToggle(tr("network usage"), self._metered_options, select_callback=network_metered_callback) + self._network_metered_btn.set_enabled(False) + + wifi_button = BigButton(tr("wi-fi")) + wifi_button.set_click_callback(lambda: gui_app.push_widget(self._wifi_ui)) + self._esim_button = BigButton(tr("eSIM"), tr("manage profiles")) + self._esim_button.set_click_callback(lambda: self._switch_to_panel(NetworkPanelType.ESIM)) + self._esim_button.set_visible(lambda: self._esim_manager.is_supported()) + + # ******** Advanced settings ******** + # ******** Roaming toggle ******** + self._roaming_btn = BigParamControl(tr("enable roaming"), "GsmRoaming", toggle_callback=self._toggle_roaming) + + # ******** APN settings ******** + self._apn_btn = BigButton(tr("apn settings")) + self._apn_btn.set_click_callback(self._edit_apn) + + # ******** Cellular metered toggle ******** + self._cellular_metered_btn = BigParamControl(tr("cellular metered"), "GsmMetered", toggle_callback=self._toggle_cellular_metered) + + # Main scroller ---------------------------------- + self._scroller = Scroller([ + wifi_button, + self._esim_button, + self._network_metered_btn, + self._tethering_toggle_btn, + self._tethering_password_btn, + # /* Advanced settings + self._roaming_btn, + self._apn_btn, + self._cellular_metered_btn, + # */ + self._ip_address_btn, + ], snap_items=False) + + # Set initial config + roaming_enabled = ui_state.params.get_bool("GsmRoaming") + metered = ui_state.params.get_bool("GsmMetered") + self._wifi_manager.update_gsm_settings(roaming_enabled, ui_state.params.get("GsmApn") or "", metered) + + # Set up back navigation + self.set_back_callback(back_callback) + + def _back_enabled(self) -> bool: + # Only allow swipe-to-dismiss back to settings when no sub-panel (eSIM) is open. + return self._current_panel == NetworkPanelType.NONE + + def _update_state(self): + super()._update_state() + + # konn3kt has no managed cellular SIM, so always expose the GSM/APN settings. + show_cell_settings = True + self._wifi_manager.set_ipv4_forward(show_cell_settings) + self._roaming_btn.set_visible(show_cell_settings) + self._apn_btn.set_visible(show_cell_settings) + self._cellular_metered_btn.set_visible(show_cell_settings) + + self._esim_profile_frame += 1 + if self._esim_profile_frame % 30 == 0: + esim_profiles = (self._esim_manager.get_state().profiles or []) if self._esim_manager.is_supported() else [] + count = f"{len(esim_profiles)} profiles" + if count != self._esim_profile_count: + self._esim_profile_count = count + self._esim_button.set_value(count) + + def show_event(self): + super().show_event() + self._current_panel = NetworkPanelType.NONE + self._esim_profile_frame = 0 + self._esim_profile_count = None + self._roaming_btn.refresh() + self._cellular_metered_btn.refresh() + self._scroller.show_event() + + def hide_event(self): + super().hide_event() + if self._current_panel == NetworkPanelType.ESIM: + self._esim_ui.hide_event() + + def _toggle_roaming(self, checked: bool): + self._wifi_manager.update_gsm_settings(checked, ui_state.params.get("GsmApn") or "", ui_state.params.get_bool("GsmMetered")) + + def _edit_apn(self): + def update_apn(apn: str): + apn = apn.strip() + if apn == "": + ui_state.params.remove("GsmApn") + else: + ui_state.params.put("GsmApn", apn) + + self._wifi_manager.update_gsm_settings(ui_state.params.get_bool("GsmRoaming"), apn, ui_state.params.get_bool("GsmMetered")) + + current_apn = ui_state.params.get("GsmApn") or "" + dlg = BigInputDialog(tr("enter APN"), current_apn, minimum_length=0, confirm_callback=update_apn) + gui_app.push_widget(dlg) + + def _toggle_cellular_metered(self, checked: bool): + self._wifi_manager.update_gsm_settings(ui_state.params.get_bool("GsmRoaming"), ui_state.params.get("GsmApn") or "", checked) + + def _on_tethering_clicked(self, toggle_callback): + self._tethering_checked = not self._tethering_checked + self._tethering_toggle_btn.set_value(tr("enabled") if self._tethering_checked else tr("disabled")) + toggle_callback(self._tethering_checked) + + def _on_network_updated(self, networks: list[Network]): + # Update tethering state + tethering_active = self._wifi_manager.is_tethering_active() + self._tethering_toggle_btn.set_enabled(True) + self._network_metered_btn.set_enabled(lambda: not tethering_active and bool(self._wifi_manager.ipv4_address)) + self._tethering_checked = tethering_active + self._tethering_toggle_btn.set_value(tr("enabled") if tethering_active else tr("disabled")) + + # Update IP address + self._ip_address_btn.set_value(self._wifi_manager.ipv4_address or tr("Not connected")) + + # Update network metered + self._network_metered_btn.set_value( + { + MeteredType.UNKNOWN: self._metered_options[0], + MeteredType.YES: self._metered_options[1], + MeteredType.NO: self._metered_options[2] + }.get(self._wifi_manager.current_network_metered, self._metered_options[0])) + + def _switch_to_panel(self, panel_type: NetworkPanelType): + if panel_type == NetworkPanelType.ESIM: + if not self._esim_manager.is_supported(): + return + self._esim_ui.show_event() + elif self._current_panel == NetworkPanelType.ESIM: + self._esim_ui.hide_event() + + self._current_panel = panel_type + + def _render(self, rect: rl.Rectangle): + rl.draw_rectangle_rec(rect, rl.BLACK) + if self._callback_frame % self.CALLBACK_INTERVAL_FRAMES == 0: + self._wifi_manager.process_callbacks() + self._callback_frame += 1 + + if self._current_panel == NetworkPanelType.ESIM: + self._esim_ui.render(rect) + else: + self._scroller.render(rect) + draw_scroller_edge_fades(rect) + draw_scroller_page_slider(self._scroller, rect) diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/network/test_wifi_sort.py b/iqpilot/selfdrive/ui/mici/layouts/settings/network/test_wifi_sort.py new file mode 100644 index 000000000..beb1faa47 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/network/test_wifi_sort.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +""" +Small standalone check for the mici WiFi menu sort order. + +Run with: + uv run python selfdrive/ui/mici/layouts/settings/network/test_wifi_sort.py +""" + +from iqpilot.system.ui.lib.wifi_manager import Network, SecurityType, wifi_network_sort_key + + +def _network(ssid: str, strength: int, connected: bool = False) -> Network: + return Network(ssid, strength, connected, SecurityType.WPA2, True) + + +def main() -> None: + cafe = _network("cafe", 35) + home = _network("home", 75) + connected = _network("connected", 20, connected=True) + missing_saved = _network("missing-saved", 90) + zero_strength = _network("zero-strength", 0) + + entries = [ + (cafe, False), + (missing_saved, True), + (zero_strength, False), + (connected, False), + (home, False), + ] + + ordered = [network.ssid for network, missing in sorted(entries, key=lambda entry: wifi_network_sort_key(*entry))] + assert ordered == ["connected", "home", "cafe", "missing-saved", "zero-strength"], ordered + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py b/iqpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py new file mode 100644 index 000000000..dd244c82b --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py @@ -0,0 +1,443 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import math +import numpy as np +import pyray as rl +from collections.abc import Callable + +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.ui.mici.widgets.stock_dialog import BigInputDialog, BigConfirmationDialog +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, LABEL_COLOR +from iqpilot.system.ui.lib.application import gui_app, MousePos, FontWeight +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.system.ui.lib.wifi_manager import WifiManager, Network, SecurityType, normalize_ssid, wifi_network_sort_key +from iqpilot.system.ui.lib.multilang import tr + + +def _wifi_network_signature(networks: list[Network]) -> tuple[tuple[str, int, bool, int, bool], ...]: + return tuple(sorted((n.ssid, n.strength, n.is_connected, int(n.security_type), n.is_saved) for n in networks)) + + +class LoadingAnimation(Widget): + RADIUS = 8 + SPACING = 24 + Y_MAG = 11.2 + + def __init__(self): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, self.SPACING * 2 + self.RADIUS * 2, self.RADIUS * 2 + int(self.Y_MAG))) + + def _render(self, _): + base_x = int(self._rect.x + self._rect.width / 2) + base_y = int(self._rect.y + self._rect.height - self.RADIUS) + for i in range(3): + x = base_x + (i - 1) * self.SPACING + y = int(base_y + min(math.sin((rl.get_time() - i * 0.2) * 4) * self.Y_MAG, 0)) + alpha = int(np.interp(base_y - y, [0, self.Y_MAG], [255 * 0.45, 255 * 0.9])) + rl.draw_circle(x, y, self.RADIUS, rl.Color(255, 255, 255, alpha)) + + +class WifiIcon(Widget): + def __init__(self, network: Network): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, 48 + 5, 36 + 5)) + self._wifi_slash_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_slash.png", 48, 42) + self._wifi_low_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_low.png", 48, 36) + self._wifi_medium_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_medium.png", 48, 36) + self._wifi_full_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_full.png", 48, 36) + self._lock_txt = gui_app.texture("icons_mici/settings/network/new/lock.png", 21, 27) + self._network = network + self._network_missing = False + + def update_network(self, network: Network): + self._network = network + + def set_network_missing(self, missing: bool): + self._network_missing = missing + + def _render(self, _): + strength = round(self._network.strength / 100 * 2) + if self._network_missing: + strength_icon = self._wifi_slash_txt + elif strength == 2: + strength_icon = self._wifi_full_txt + elif strength == 1: + strength_icon = self._wifi_medium_txt + else: + strength_icon = self._wifi_low_txt + rl.draw_texture_ex(strength_icon, (self._rect.x, self._rect.y + self._rect.height - strength_icon.height), 0.0, 1.0, rl.WHITE) + if self._network.security_type not in (SecurityType.OPEN, SecurityType.UNSUPPORTED): + lock_x = self._rect.x + self._rect.width - self._lock_txt.width + lock_y = self._rect.y + self._rect.height - self._lock_txt.height + 6 + rl.draw_texture_ex(self._lock_txt, (lock_x, lock_y), 0.0, 1.0, rl.WHITE) + + +class ForgetButton(Widget): + MARGIN = 12 + + def __init__(self, forget_network: Callable): + super().__init__() + self._forget_network = forget_network + self._bg_txt = gui_app.texture("icons_mici/settings/network/new/forget_button.png", 84, 84) + self._bg_pressed_txt = gui_app.texture("icons_mici/settings/network/new/forget_button_pressed.png", 84, 84) + self._trash_txt = gui_app.texture("icons_mici/settings/network/new/trash.png", 29, 35) + self.set_rect(rl.Rectangle(0, 0, 84 + self.MARGIN * 2, 84 + self.MARGIN * 2)) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + dlg = BigConfirmationDialog(tr("slide to\nforget"), gui_app.texture("icons_mici/settings/network/new/trash.png", 54, 64), + self._forget_network, red=True) + gui_app.push_widget(dlg) + + def _render(self, _): + bg_txt = self._bg_pressed_txt if self.is_pressed else self._bg_txt + rl.draw_texture_ex(bg_txt, (self._rect.x + (self._rect.width - self._bg_txt.width) / 2, + self._rect.y + (self._rect.height - self._bg_txt.height) / 2), 0, 1.0, rl.WHITE) + trash_x = self._rect.x + (self._rect.width - self._trash_txt.width) / 2 + trash_y = self._rect.y + (self._rect.height - self._trash_txt.height) / 2 + rl.draw_texture_ex(self._trash_txt, (trash_x, trash_y), 0, 1.0, rl.WHITE) + + +class DisconnectButton(Widget): + MARGIN = 12 + RADIUS = 42 + # the only round button art is the destructive red one, and dropping a connection is not destructive + BG = rl.Color(56, 56, 61, 255) + BG_PRESSED = rl.Color(84, 84, 90, 255) + + def __init__(self, disconnect_network: Callable): + super().__init__() + self._disconnect_network = disconnect_network + self._slash_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_slash.png", 38, 38) + self.set_rect(rl.Rectangle(0, 0, 84 + self.MARGIN * 2, 84 + self.MARGIN * 2)) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + dlg = BigConfirmationDialog(tr("slide to\ndisconnect"), gui_app.texture("icons_mici/settings/network/wifi_strength_slash.png", 54, 54), + self._disconnect_network) + gui_app.push_widget(dlg) + + def _render(self, _): + center = rl.Vector2(self._rect.x + self._rect.width / 2, self._rect.y + self._rect.height / 2) + rl.draw_circle_v(center, self.RADIUS, self.BG_PRESSED if self.is_pressed else self.BG) + rl.draw_texture_ex(self._slash_txt, (center.x - self._slash_txt.width / 2, center.y - self._slash_txt.height / 2), + 0, 1.0, rl.WHITE) + + +class WifiButton(BigButton): + LABEL_PADDING = 98 + LABEL_WIDTH = 402 - 98 - 28 + SUB_LABEL_WIDTH = 402 - BigButton.LABEL_HORIZONTAL_PADDING * 2 + + def __init__(self, network: Network, wifi_manager: WifiManager, connecting_ssid: Callable[[], str | None]): + super().__init__(normalize_ssid(network.ssid), scroll=True) + self._network = network + self._wifi_manager = wifi_manager + self._connecting_ssid = connecting_ssid + self._wifi_icon = WifiIcon(network) + self._forget_btn = ForgetButton(self._forget_network) + self._disconnect_btn = DisconnectButton(self._disconnect_network) + self._check_txt = gui_app.texture("icons_mici/setup/driver_monitoring/dm_check.png", 32, 32) + self._network_missing = False + self._network_forgetting = False + self._network_disconnecting = False + self._wrong_password = False + + @property + def network(self) -> Network: + return self._network + + def update_network(self, network: Network): + self._network = network + self._wifi_icon.update_network(network) + self._network_missing = False + self._wifi_icon.set_network_missing(False) + if self._is_connected or self._is_connecting: + self._wrong_password = False + + @property + def network_forgetting(self) -> bool: + return self._network_forgetting + + @property + def network_missing(self) -> bool: + return self._network_missing + + def _forget_network(self): + if self._network_forgetting: + return + self._network_forgetting = True + self._wifi_manager.forget_connection(self._network.ssid) + + def _disconnect_network(self): + if self._network_disconnecting: + return + self._network_disconnecting = True + self._wifi_manager.disconnect_connection(self._network.ssid) + + def on_forgotten(self): + self._network_forgetting = False + + def on_disconnected(self): + self._network_disconnecting = False + + def set_network_missing(self, missing: bool): + self._network_missing = missing + self._wifi_icon.set_network_missing(missing) + + def set_wrong_password(self): + self._wrong_password = True + self.trigger_shake() + + @property + def _is_saved(self) -> bool: + return self._network.is_saved + + @property + def _is_connecting(self) -> bool: + return self._connecting_ssid() == self._network.ssid + + @property + def _is_connected(self) -> bool: + return self._network.is_connected + + @property + def _is_tethering(self) -> bool: + return getattr(self._network, "is_tethering", False) + + @property + def _show_forget_btn(self) -> bool: + if self._is_tethering or self._network_forgetting or self._show_disconnect_btn: + return False + return (self._is_saved and not self._wrong_password) or self._is_connecting + + @property + def _show_disconnect_btn(self) -> bool: + # 402 units of row cannot hold both buttons plus the status word, so the slot is contextual: + # disconnect while connected, forget once it is only saved + if self._is_tethering or self._network_forgetting or self._network_disconnecting: + return False + return self._is_connected + + def _handle_mouse_release(self, mouse_pos: MousePos): + if self._show_forget_btn and rl.check_collision_point_rec(mouse_pos, self._forget_btn.rect): + return + if self._show_disconnect_btn and rl.check_collision_point_rec(mouse_pos, self._disconnect_btn.rect): + return + super()._handle_mouse_release(mouse_pos) + + def _get_label_font_size(self): + return 48 + + def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: + super().set_touch_valid_callback(lambda: touch_callback() and not self._forget_btn.is_pressed and not self._disconnect_btn.is_pressed) + self._forget_btn.set_touch_valid_callback(touch_callback) + self._disconnect_btn.set_touch_valid_callback(touch_callback) + + def _update_state(self): + super()._update_state() + if any((self._network_missing, self._is_connecting, self._is_connected, self._network_forgetting, + self._network_disconnecting, self._network.security_type == SecurityType.UNSUPPORTED)): + self.set_enabled(False) + self._sub_label.set_color(rl.Color(255, 255, 255, int(255 * 0.585))) + self._sub_label.set_font_weight(FontWeight.ROMAN) + if self._network_forgetting: + self.set_value(tr("forgetting...")) + elif self._network_disconnecting: + self.set_value(tr("disconnecting...")) + elif self._is_connecting: + self.set_value(tr("starting...") if self._is_tethering else tr("connecting...")) + elif self._is_connected: + self.set_value(tr("tethering") if self._is_tethering else tr("connected")) + elif self._network_missing: + self.set_value(tr("not in range")) + else: + self.set_value(tr("unsupported")) + else: + self.set_value(tr("wrong password") if self._wrong_password else tr("connect")) + self.set_enabled(True) + self._sub_label.set_color(rl.Color(255, 255, 255, int(255 * 0.9))) + self._sub_label.set_font_weight(FontWeight.SEMI_BOLD) + + def _draw_content(self, btn_x: float, btn_y: float, btn_width: float, btn_height: float): + self._label.set_color(LABEL_COLOR) + label_rect = rl.Rectangle(btn_x + self.LABEL_PADDING, btn_y + self.LABEL_VERTICAL_PADDING, + self.LABEL_WIDTH, btn_height - self.LABEL_VERTICAL_PADDING * 2) + self._label.render(label_rect) + + if self.value: + sub_label_x = self._rect.x + self.LABEL_HORIZONTAL_PADDING + label_y = btn_y + self._rect.height - self.LABEL_VERTICAL_PADDING + sub_label_w = self.SUB_LABEL_WIDTH - (self._forget_btn.rect.width if self._show_forget_btn else 0) \ + - (self._disconnect_btn.rect.width if self._show_disconnect_btn else 0) + sub_label_height = self._sub_label.get_content_height(sub_label_w) + if self._is_connected and not self._network_forgetting and not self._network_disconnecting: + check_y = int(label_y - sub_label_height + (sub_label_height - self._check_txt.height) / 2) + rl.draw_texture_ex(self._check_txt, rl.Vector2(sub_label_x, check_y), 0.0, 1.0, rl.Color(255, 255, 255, int(255 * 0.9 * 0.65))) + sub_label_x += self._check_txt.width + 14 + sub_label_rect = rl.Rectangle(sub_label_x, label_y - sub_label_height, sub_label_w, sub_label_height) + self._sub_label.render(sub_label_rect) + + self._wifi_icon.render(rl.Rectangle(self._rect.x + 30, btn_y + 30, self._wifi_icon.rect.width, self._wifi_icon.rect.height)) + + btn_right = self._rect.x + self._rect.width + if self._show_forget_btn: + self._forget_btn.render(rl.Rectangle( + btn_right - self._forget_btn.rect.width, + btn_y + self._rect.height - self._forget_btn.rect.height, + self._forget_btn.rect.width, self._forget_btn.rect.height)) + btn_right -= self._forget_btn.rect.width + + if self._show_disconnect_btn: + self._disconnect_btn.render(rl.Rectangle( + btn_right - self._disconnect_btn.rect.width, + btn_y + self._rect.height - self._disconnect_btn.rect.height, + self._disconnect_btn.rect.width, self._disconnect_btn.rect.height)) + + +class ScanningButton(BigButton): + def __init__(self, is_scanning: Callable[[], bool]): + super().__init__("", tr("searching for networks")) + self.set_enabled(False) + self._loading_animation = LoadingAnimation() + self._is_scanning = is_scanning + + def _draw_content(self, btn_x: float, btn_y: float, btn_width: float, btn_height: float): + super()._draw_content(btn_x, btn_y, btn_width, btn_height) + if not self._is_scanning(): + return + anim = self._loading_animation + anim.set_position(btn_x + btn_width - anim.rect.width - 40, btn_y + btn_height - anim.rect.height - 30) + anim.render() + + +class WifiUIMici(NavScroller): + CALLBACK_INTERVAL_FRAMES = 3 + + def __init__(self, wifi_manager: WifiManager): + super().__init__() + self._wifi_manager = wifi_manager + self._scanning_btn = ScanningButton(lambda: self._wifi_manager.is_scanning) + self._networks: dict[str, Network] = {} + self._network_signature: tuple[tuple[str, int, bool, int, bool], ...] = () + self._connecting: str | None = None + self._callback_frame = 0 + self._wifi_manager.add_callbacks( + need_auth=self._on_need_auth, + activated=self._on_activated, + forgotten=self._on_forgotten, + networks_updated=self._on_network_updated, + disconnected=self._on_disconnected, + ) + + def _connecting_ssid(self) -> str | None: + return self._connecting + + def show_event(self): + super().show_event() + self._wifi_manager.set_active(True) + self._callback_frame = 0 + self._update_buttons(re_sort=True) + + def hide_event(self): + super().hide_event() + self._wifi_manager.set_active(False) + + def _on_network_updated(self, networks: list[Network]): + signature = _wifi_network_signature(networks) + if signature == self._network_signature: + return + self._network_signature = signature + self._networks = {n.ssid: n for n in networks} + self._update_buttons() + + def _on_activated(self): + self._connecting = None + + def _on_disconnected(self): + self._connecting = None + for btn in self._scroller.items: + if isinstance(btn, WifiButton): + btn.on_disconnected() + + def _on_forgotten(self, ssid=None): + self._connecting = None + for btn in self._scroller.items: + if isinstance(btn, WifiButton) and (ssid is None or btn.network.ssid == ssid): + btn.on_forgotten() + + def _update_buttons(self, re_sort: bool = False): + sorted_networks = sorted(self._networks.values(), key=wifi_network_sort_key) + existing = {btn.network.ssid: btn for btn in self._scroller.items if isinstance(btn, WifiButton)} + for network in sorted_networks: + if network.ssid in existing: + existing[network.ssid].update_network(network) + else: + btn = WifiButton(network, self._wifi_manager, self._connecting_ssid) + btn.set_click_callback(lambda ssid=network.ssid: self._connect_to_network(ssid)) + self._scroller.add_widget(btn) + + current_ssids = set(self._networks) + for btn in self._scroller.items: + if isinstance(btn, WifiButton): + btn.set_network_missing(btn.network.ssid not in current_ssids) + + if re_sort or sorted_networks: + order = {btn.network.ssid: idx for idx, btn in enumerate(self._scroller.items) if isinstance(btn, WifiButton)} + wifi_buttons = [btn for btn in self._scroller.items if isinstance(btn, WifiButton)] + other_items = [btn for btn in self._scroller.items if not isinstance(btn, WifiButton) and btn is not self._scanning_btn] + wifi_buttons.sort(key=lambda btn: (*wifi_network_sort_key(btn.network, btn.network_missing), order[btn.network.ssid])) + self._scroller.items[:] = [*wifi_buttons, *other_items] + + items = self._scroller.items + if self._scanning_btn in items: + items.append(items.pop(items.index(self._scanning_btn))) + else: + self._scroller.add_widget(self._scanning_btn) + + def _connect_with_password(self, ssid: str, password: str): + self._connecting = ssid + self._wifi_manager.connect_to_network(ssid, password) + self._move_network_to_front(ssid) + + def _connect_to_network(self, ssid: str): + network = self._networks.get(ssid) + if network is None: + cloudlog.warning(f"Trying to connect to unknown network: {ssid}") + return + if network.is_saved: + self._connecting = ssid + self._wifi_manager.activate_connection(ssid) + elif network.security_type == SecurityType.OPEN: + self._connecting = ssid + self._wifi_manager.connect_to_network(ssid, "") + else: + self._on_need_auth(ssid, False) + return + self._move_network_to_front(ssid) + + def _on_need_auth(self, ssid, incorrect_password=True): + if incorrect_password: + self._connecting = None + for btn in self._scroller.items: + if isinstance(btn, WifiButton) and btn.network.ssid == ssid: + btn.set_wrong_password() + break + return + dlg = BigInputDialog(tr("enter password..."), "", minimum_length=8, + confirm_callback=lambda _password: self._connect_with_password(ssid, _password)) + gui_app.push_widget(dlg) + + def _move_network_to_front(self, ssid: str | None): + idx = next((i for i, btn in enumerate(self._scroller.items) + if isinstance(btn, WifiButton) and btn.network.ssid == ssid), None) if ssid else None + if idx is not None and idx > 0: + self._scroller.move_item(idx, 0) + + def _update_state(self): + super()._update_state() + if self._callback_frame % self.CALLBACK_INTERVAL_FRAMES == 0: + self._wifi_manager.process_callbacks() + self._callback_frame += 1 diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/settings.py b/iqpilot/selfdrive/ui/mici/layouts/settings/settings.py new file mode 100644 index 000000000..9852b090b --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/settings.py @@ -0,0 +1,131 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.common.params import Params +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton +from iqpilot.selfdrive.ui.mici.layouts.settings.toggles import TogglesLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.steering import SteeringLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.cruise import CruiseLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.visuals import VisualsLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.models import ModelsLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.display import DisplayLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.drive_history import TripsLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.vehicle import VehicleLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.dashcam import DashcamLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.network.network_layout import NetworkLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.device import DeviceLayoutMici, PairBigButton +from iqpilot.selfdrive.ui.mici.layouts.settings.developer import DeveloperLayoutMici +from iqpilot.selfdrive.ui.mici.layouts.settings.software import SoftwareLayoutMici +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr + + +class SettingsBigButton(BigButton): + def _get_label_font_size(self): + return 64 + + +class CruiseModeButton(SettingsBigButton): + """Cruise menu button whose icon reflects the active longitudinal mode.""" + _ICON_SIZE = 60 + + def __init__(self): + super().__init__(tr("cruise"), "", gui_app.texture("icons_mici/speedometer.png", self._ICON_SIZE, self._ICON_SIZE)) + self._p = Params() + self._icons = [ + gui_app.texture("icons_mici/speedometer.png", self._ICON_SIZE, self._ICON_SIZE), + gui_app.texture("icons_mici/iqstandard_mode_mici.png", self._ICON_SIZE, self._ICON_SIZE), + gui_app.texture("icons_mici/iqdynamic_mode_mici.png", self._ICON_SIZE, self._ICON_SIZE), + gui_app.texture("icons_mici/experimental_mode_mici.png", self._ICON_SIZE, self._ICON_SIZE), + ] + + def _mode_index(self) -> int: + if not self._p.get_bool("AlphaLongitudinalEnabled"): + return 0 + if not self._p.get_bool("ExperimentalMode"): + return 1 + return 2 if self._p.get_bool("IQDynamicMode") else 3 + + def _update_state(self): + super()._update_state() + self.set_icon(self._icons[self._mode_index()]) + + +class SettingsLayout(NavScroller): + def __init__(self): + super().__init__() + self._params = Params() + + toggles_panel = TogglesLayoutMici() + toggles_btn = SettingsBigButton(tr("toggles"), "", gui_app.texture("icons_mici/settings.png", 64, 64)) + toggles_btn.set_click_callback(lambda: gui_app.push_widget(toggles_panel)) + + steering_panel = SteeringLayoutMici() + steering_btn = SettingsBigButton(tr("steering"), "", gui_app.texture("icons_mici/wheel.png", 64, 64)) + steering_btn.set_click_callback(lambda: gui_app.push_widget(steering_panel)) + + cruise_panel = CruiseLayoutMici() + cruise_btn = CruiseModeButton() + cruise_btn.set_click_callback(lambda: gui_app.push_widget(cruise_panel)) + + visuals_panel = VisualsLayoutMici() + visuals_btn = SettingsBigButton(tr("visuals"), "", gui_app.texture("icons_mici/onroad/eye_fill.png", 64, 46)) + visuals_btn.set_click_callback(lambda: gui_app.push_widget(visuals_panel)) + + models_panel = ModelsLayoutMici() + models_btn = SettingsBigButton(tr("models"), "", gui_app.texture("icons_mici/models.png", 60, 60)) + models_btn.set_click_callback(lambda: gui_app.push_widget(models_panel)) + + display_panel = DisplayLayoutMici() + display_btn = SettingsBigButton(tr("display"), "", gui_app.texture("icons_mici/settings/brightness.png", 62, 62)) + display_btn.set_click_callback(lambda: gui_app.push_widget(display_panel)) + + trips_panel = TripsLayoutMici() + trips_btn = SettingsBigButton(tr("trips"), "", gui_app.texture("icons_mici/settings/trips.png", 62, 56)) + trips_btn.set_click_callback(lambda: gui_app.push_widget(trips_panel)) + + vehicle_panel = VehicleLayoutMici() + vehicle_btn = SettingsBigButton(tr("vehicle"), "", gui_app.texture("icons_mici/settings/vehicle.png", 70, 56)) + vehicle_btn.set_click_callback(lambda: gui_app.push_widget(vehicle_panel)) + + dashcam_panel = DashcamLayoutMici() + dashcam_btn = SettingsBigButton(tr("dashcam"), "", gui_app.texture("icons_mici/settings/camera.png", 64, 56)) + dashcam_btn.set_click_callback(lambda: gui_app.push_widget(dashcam_panel)) + + network_panel = NetworkLayoutMici(back_callback=lambda: gui_app.pop_widget()) + network_btn = SettingsBigButton(tr("network"), "", gui_app.texture("icons_mici/settings/network/wifi_strength_full.png", 76, 56)) + network_btn.set_click_callback(lambda: gui_app.push_widget(network_panel)) + + + device_panel = DeviceLayoutMici() + device_btn = SettingsBigButton(tr("device"), "", gui_app.texture("icons_mici/settings/device_icon.png", 72, 58)) + device_btn.set_click_callback(lambda: gui_app.push_widget(device_panel)) + + software_panel = SoftwareLayoutMici() + software_btn = SettingsBigButton(tr("software"), "", gui_app.texture("icons_mici/settings/sd_card.png", 60, 72)) + software_btn.set_click_callback(lambda: gui_app.push_widget(software_panel)) + + developer_panel = DeveloperLayoutMici() + developer_btn = SettingsBigButton(tr("developer"), "", gui_app.texture("icons_mici/settings/developer_icon.png", 64, 60)) + developer_btn.set_click_callback(lambda: gui_app.push_widget(developer_panel)) + + self._scroller.add_widgets([ + device_btn, + network_btn, + PairBigButton(), + models_btn, + software_btn, + steering_btn, + cruise_btn, + visuals_btn, + display_btn, + dashcam_btn, + vehicle_btn, + toggles_btn, + trips_btn, + developer_btn, + ]) + + self._font_medium = gui_app.font(FontWeight.MEDIUM) diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/software.py b/iqpilot/selfdrive/ui/mici/layouts/settings/software.py new file mode 100644 index 000000000..b29ad6cb0 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/software.py @@ -0,0 +1,365 @@ +import os +import threading +import pyray as rl +from enum import IntEnum +from collections.abc import Callable + +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.selfdrive.ui.mici.layouts.settings.device import EngagedConfirmationButton +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton +from iqpilot.selfdrive.ui.mici.widgets.stock_dialog import BigDialog +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.widgets.scroller import NavScroller + +UPDATER_TIMEOUT = 10.0 # seconds to wait for updater to respond + + +def _split_description(desc: str) -> tuple[str, str, str, str] | None: + # UpdaterCurrentDescription/UpdaterNewDescription format: "version / branch / commit / date" + parts = [p.strip() for p in desc.split(" / ")] + if len(parts) != 4: + return None + version, branch, commit, date = parts + return version, branch, commit, date + + +class UpdaterState(IntEnum): + IDLE = 0 + WAITING_FOR_UPDATER = 1 + UPDATER_RESPONDING = 2 + + +class SoftwareInfoLayoutMici(Widget): + def __init__(self): + super().__init__() + + self.set_rect(rl.Rectangle(0, 0, 360, 180)) + + subheader_color = rl.Color(255, 255, 255, int(255 * 0.9 * 0.65)) + max_width = int(self._rect.width - 20) + self._version_label = UnifiedLabel(tr("version"), 48, max_width=max_width, font_weight=FontWeight.DISPLAY, wrap_text=False) + self._version_text_label = UnifiedLabel("", 32, max_width=max_width, text_color=subheader_color, + font_weight=FontWeight.ROMAN, wrap_text=False, scroll=True) + + self._branch_label = UnifiedLabel(tr("branch"), 48, max_width=max_width, font_weight=FontWeight.DISPLAY, wrap_text=False) + self._branch_text_label = UnifiedLabel("", 32, max_width=max_width, text_color=subheader_color, + font_weight=FontWeight.ROMAN, wrap_text=False, scroll=True) + + def _update_state(self): + desc = _split_description(ui_state.params.get("UpdaterCurrentDescription") or "") + if desc is not None: + version, branch, commit, date = desc + self._version_text_label.set_text(f"{version} ({date})") + self._branch_text_label.set_text(f"{branch} ({commit})") + else: + self._version_text_label.set_text(ui_state.params.get("Version") or "N/A") + self._branch_text_label.set_text(ui_state.params.get("GitBranch") or "N/A") + + def _render(self, _): + self._version_label.set_position(self._rect.x + 20, self._rect.y - 10) + self._version_label.render() + + self._version_text_label.set_position(self._rect.x + 20, self._rect.y + 68 - 25) + self._version_text_label.render() + + self._branch_label.set_position(self._rect.x + 20, self._rect.y + 114 - 30) + self._branch_label.render() + + self._branch_text_label.set_position(self._rect.x + 20, self._rect.y + 161 - 25) + self._branch_text_label.render() + + +class CheckUpdateButton(BigButton): + def __init__(self): + self._txt_update_icon = gui_app.texture("icons_mici/settings/device/update.png", 64, 75) + self._txt_up_to_date_icon = gui_app.texture("icons_mici/settings/device/up_to_date.png", 64, 64) + super().__init__(tr("check for update"), "", self._txt_update_icon) + self.set_press_effect_enabled(False) + + self._waiting_for_updater_t: float | None = None + self._hide_value_t: float | None = None + self._state: UpdaterState = UpdaterState.IDLE + + ui_state.add_offroad_transition_callback(self.offroad_transition) + + def offroad_transition(self): + if ui_state.is_offroad(): + self.set_enabled(True) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + if not system_time_valid(): + dlg = BigDialog("", tr("Please connect to Wi-Fi to update.")) + gui_app.push_widget(dlg) + return + + self.set_enabled(False) + self._state = UpdaterState.WAITING_FOR_UPDATER + self.set_icon(self._txt_update_icon) + + def run(): + if self.get_value() == "download update": + os.system("pkill -SIGHUP -f system.updated.updated") + else: + os.system("pkill -SIGUSR1 -f system.updated.updated") + + threading.Thread(target=run, daemon=True).start() + + def set_value(self, value: str): + super().set_value(value) + if value: + self.set_text("") + else: + self.set_text(tr("check for update")) + + def _update_state(self): + super()._update_state() + + if ui_state.started: + self.set_enabled(False) + return + + updater_state = ui_state.params.get("UpdaterState") or "" + failed_count = ui_state.params.get("UpdateFailedCount") or 0 + failed = int(failed_count) > 0 + update_available = ui_state.params.get_bool("UpdateAvailable") + fetch_available = ui_state.params.get_bool("UpdaterFetchAvailable") + cur_desc = ui_state.params.get("UpdaterCurrentDescription") or "" + new_desc = ui_state.params.get("UpdaterNewDescription") or "" + + # Ignore a stale failure marker once the updater is idle and already agrees there is + # nothing new to install. Otherwise mici can get stuck on "failed to update" forever + # even after a later successful fetch. + stale_failure = failed and updater_state == "idle" and not fetch_available and not update_available and cur_desc == new_desc + + if self._state == UpdaterState.WAITING_FOR_UPDATER: + self.set_rotate_icon(True) + if updater_state != "idle": + self._state = UpdaterState.UPDATER_RESPONDING + + # Recover from updater not responding (time invalid shortly after boot) + if self._waiting_for_updater_t is None: + self._waiting_for_updater_t = rl.get_time() + + if self._waiting_for_updater_t is not None and rl.get_time() - self._waiting_for_updater_t > UPDATER_TIMEOUT: + self.set_rotate_icon(False) + self.set_value(tr("updater failed\nto respond")) + self._state = UpdaterState.IDLE + self._hide_value_t = rl.get_time() + + elif self._state == UpdaterState.UPDATER_RESPONDING: + if updater_state == "idle": + self.set_rotate_icon(False) + self._state = UpdaterState.IDLE + self._hide_value_t = rl.get_time() + else: + if self.get_value() != tr(updater_state): + self.set_value(tr(updater_state)) + + elif self._state == UpdaterState.IDLE: + self.set_rotate_icon(False) + if failed and not stale_failure: + self.set_enabled(True) # allow retry when failure came from updater param + if self.get_value() != tr("failed to update"): + self.set_value(tr("failed to update")) + + elif fetch_available: + self.set_enabled(True) + if self.get_value() != tr("download update"): + self.set_value(tr("download update")) + + elif self._hide_value_t is not None: + self.set_enabled(True) + if self.get_value() == tr("checking..."): + self.set_value(tr("up to date")) + self.set_icon(self._txt_up_to_date_icon) + + # Hide previous text after short amount of time (up to date or failed) + if rl.get_time() - self._hide_value_t > 3.0: + self._hide_value_t = None + self.set_value("") + self.set_icon(self._txt_update_icon) + else: + self.set_enabled(True) + if self.get_value() != "": + self.set_value("") + + if self._state != UpdaterState.WAITING_FOR_UPDATER: + self._waiting_for_updater_t = None + + +class InstallUpdateButton(BigButton): + def __init__(self): + super().__init__(tr("install update"), "", gui_app.texture("icons_mici/settings/device/reboot.png", 64, 70)) + self.set_press_effect_enabled(False) + self.set_visible(lambda: ui_state.is_offroad() and ui_state.params.get_bool("UpdateAvailable")) + + def _update_state(self): + super()._update_state() + + desc = _split_description(ui_state.params.get("UpdaterNewDescription") or "") + value = f"{desc[0]} ({desc[1]})" if desc is not None else "" + if self.get_value() != value: + self.set_value(value) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + self.set_enabled(False) + + def run(): + ui_state.params.put_bool("DoReboot", True) + + threading.Thread(target=run, daemon=True).start() + + +class InstallModePage(NavScroller): + MODES = [ + ("download_only", "predownload only"), + ("download_and_install", "predownload + preinstall"), + ] + + def __init__(self, on_select: Callable[[str], None]): + super().__init__() + + current_mode = ui_state.params.get("UpdaterInstallMode") or "download_and_install" + check_icon = gui_app.texture("icons_mici/settings/device/up_to_date.png", 64, 64) + + buttons = [] + for mode, label in self.MODES: + btn = BigButton(tr(label), "", check_icon if mode == current_mode else None, scroll=True) + btn.set_click_callback(lambda m=mode: self.dismiss(lambda: on_select(m))) + buttons.append(btn) + self._scroller.add_widgets(buttons) + + +class InstallModeButton(BigButton): + MODE_LABELS = { + "download_only": "predownload only", + "download_and_install": "predownload + preinstall", + } + + def __init__(self): + super().__init__(tr("update\ninstall mode"), "") + self.set_press_effect_enabled(False) + self._label.set_font_size(40) + self._label.set_line_height(0.95) + self.set_click_callback(self._on_click) + self.set_enabled(lambda: ui_state.is_offroad()) + + def _current_mode(self) -> str: + mode = ui_state.params.get("UpdaterInstallMode") or "download_and_install" + if mode not in self.MODE_LABELS: + return "download_and_install" + return mode + + def _update_state(self): + super()._update_state() + self.set_value(tr(self.MODE_LABELS[self._current_mode()])) + + def _on_click(self): + gui_app.push_widget(InstallModePage(self._on_select)) + + def _on_select(self, mode: str): + ui_state.params.put("UpdaterInstallMode", mode) + self.set_value(tr(self.MODE_LABELS[self._current_mode()])) + + +class BranchSelectPage(NavScroller): + def __init__(self, on_select: Callable[[str], None]): + super().__init__() + + params = ui_state.params + current_git_branch = params.get("GitBranch") or "" + branches_str = params.get("UpdaterAvailableBranches") or "" + branches = [b for b in branches_str.split(",") if b] + + for b in [current_git_branch, "devel-staging", "devel", "nightly", "nightly-dev", "master"]: + if b in branches: + branches.remove(b) + branches.insert(0, b) + + current_target = params.get("UpdaterTargetBranch") or "" + check_icon = gui_app.texture("icons_mici/settings/device/up_to_date.png", 64, 64) + + buttons = [] + for branch in branches: + btn = BigButton(branch, "", check_icon if branch == current_target else None, scroll=True) + btn.set_click_callback(lambda b=branch: self.dismiss(lambda: on_select(b))) + buttons.append(btn) + self._scroller.add_widgets(buttons) + + +class TargetBranchButton(BigButton): + def __init__(self): + super().__init__(tr("target branch"), ui_state.params.get("UpdaterTargetBranch") or "") + self.set_press_effect_enabled(False) + self.set_click_callback(self._on_click) + self.set_visible(not ui_state.params.get_bool("IsTestedBranch")) + self.set_enabled(lambda: ui_state.is_offroad()) + + def _update_state(self): + super()._update_state() + + target = ui_state.params.get("UpdaterTargetBranch") or "" + if self.get_value() != target: + self.set_value(target) + + def _on_click(self): + gui_app.push_widget(BranchSelectPage(self._on_select)) + + def _on_select(self, branch: str): + ui_state.params.put("UpdaterTargetBranch", branch) + self.set_value(branch) + os.system("pkill -SIGUSR1 -f system.updated.updated") + + +class DisableUpdatesButton(BigButton): + def __init__(self): + super().__init__(tr("automatic\nupdates"), tr("on")) + self.set_enabled(lambda: ui_state.is_offroad()) + self.set_press_effect_enabled(False) + self._label.set_font_size(40) + self._label.set_line_height(0.95) + self.set_click_callback(self._on_pressed) + + def _on_pressed(self): + disabled = ui_state.params.get_bool("DisableUpdates") + ui_state.params.put_bool("DisableUpdates", not disabled) + self._sync_from_params() + + def _sync_from_params(self): + disabled = ui_state.params.get_bool("DisableUpdates") + self.set_value(tr("off") if disabled else tr("on")) + + def _update_state(self): + super()._update_state() + self._sync_from_params() + + +class SoftwareLayoutMici(NavScroller): + def __init__(self): + super().__init__() + + def uninstall_openpilot_callback(): + ui_state.params.put_bool("DoUninstall", True) + + uninstall_openpilot_btn = EngagedConfirmationButton(tr("uninstall IQ.Pilot"), tr("uninstall"), + gui_app.texture("icons_mici/settings/device/uninstall.png", 64, 64), + uninstall_openpilot_callback, exit_on_confirm=False) + uninstall_openpilot_btn.set_press_effect_enabled(False) + + self._scroller.add_widgets([ + SoftwareInfoLayoutMici(), + CheckUpdateButton(), + InstallUpdateButton(), + InstallModeButton(), + DisableUpdatesButton(), + TargetBranchButton(), + uninstall_openpilot_btn, + ]) diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/steering.py b/iqpilot/selfdrive/ui/mici/layouts/settings/steering.py new file mode 100644 index 000000000..9d49c2754 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/steering.py @@ -0,0 +1,154 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.cereal import car +from iqpilot.common.params import Params +from iqpilot.selfdrive.controls.lib.helpers.lane_change import AutoLaneChangeMode +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigParamControl +from iqpilot.selfdrive.ui.mici.layouts.settings.iq_widgets import MappedParamToggle +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.system.ui.lib.multilang import tr + + +def _aol_modes() -> list[str]: + return [tr("stay engaged"), tr("standby"), tr("disengage")] + + +class SabBrakeToggle(BigParamControl): + """Driver-intervention toggle backed by AolSteeringMode == 2.""" + def __init__(self): + super().__init__(tr("Driver Intervention Handling"), "AolEnabled") + + def refresh(self): + self.set_checked(int(self.params.get("AolSteeringMode", return_default=True)) == 2) + + def _handle_mouse_release(self, mouse_pos): + super(BigParamControl, self)._handle_mouse_release(mouse_pos) + enabled = self._checked + current_mode = int(self.params.get("AolSteeringMode", return_default=True)) + if enabled: + self.params.put("AolSteeringMode", 2) + elif current_mode == 2: + self.params.put("AolSteeringMode", 1) + + +def _has_limited_sab_options() -> bool: + brand = "" + if ui_state.is_offroad(): + bundle = ui_state.params.get("CarPlatformBundle") + if bundle: + brand = bundle.get("brand", "") + if not brand: + brand = ui_state.CP.brand if ui_state.CP else "" + return brand == "rivian" + + +class SabSettingsPanel(NavScroller): + def __init__(self): + super().__init__() + self._main_cruise = BigParamControl(tr("Availability While Cruise Changes"), "AolMainCruiseAllowed") + self._brake = SabBrakeToggle() + self._mode = MappedParamToggle(tr("Brake Response Mode"), "AolSteeringMode", + _aol_modes(), [0, 1, 2]) + self._steer_override = BigParamControl(tr("Pause While You Steer"), "AolPauseOnSteeringOverride") + self._scroller.add_widgets([self._main_cruise, self._brake, self._mode, self._steer_override]) + + def show_event(self): + super().show_event() + limited = _has_limited_sab_options() + if limited: + ui_state.params.remove("AolMainCruiseAllowed") + ui_state.params.put_bool("AolUnifiedEngagementMode", True) + ui_state.params.put("AolSteeringMode", 2) + offroad = ui_state.is_offroad() + for w in (self._main_cruise, self._brake, self._mode): + w.refresh() + w.set_enabled(offroad and not limited) + self._steer_override.refresh() + self._steer_override.set_enabled(offroad) + + +class LaneChangePanel(NavScroller): + def __init__(self): + super().__init__() + self._timer = MappedParamToggle(tr("Auto Lane Change"), "IQLaneChangeTimer", + [tr("off"), tr("nudge"), tr("no nudge"), "0.5 s", "1 s", "2 s", "3 s"], + [-1, 0, 1, 2, 3, 4, 5]) + self._bsm_delay = BigParamControl(tr("Delay with Blind Spot"), "IQLaneChangeBsmDelay") + self._edge_guard = BigParamControl(tr("Lane Edge Guard"), "IQEdgeGuard") + self._edge_guard.set_value(tr("Blocks lane changes when a road edge is detected on the target side.")) + self._continuous = BigParamControl(tr("Continuous Changes"), "LaneChangeContinuous") + self._scroller.add_widgets([self._timer, self._bsm_delay, self._edge_guard, self._continuous]) + + def show_event(self): + super().show_event() + self._timer.refresh() + enable_bsm = bool(ui_state.CP and ui_state.CP.enableBsm) + if not enable_bsm and ui_state.params.get_bool("IQLaneChangeBsmDelay"): + ui_state.params.remove("IQLaneChangeBsmDelay") + self._bsm_delay.refresh() + self._bsm_delay.set_enabled( + enable_bsm and int(ui_state.params.get("IQLaneChangeTimer", return_default=True)) > AutoLaneChangeMode.NUDGE + ) + self._edge_guard.refresh() + self._continuous.refresh() + + +class SteeringLayoutMici(NavScroller): + def __init__(self): + super().__init__() + + self._sab_panel = SabSettingsPanel() + self._lc_panel = LaneChangePanel() + + self._aol = BigParamControl(tr("AOL"), "AolEnabled", toggle_callback=self._on_aol_toggled) + self._sab_settings_button = BigButton(tr("steering assistance behavior")) + self._sab_settings_button.set_click_callback(lambda: gui_app.push_widget(self._sab_panel)) + self._lane_change = BigButton(tr("lane change")) + self._lane_change.set_click_callback(lambda: gui_app.push_widget(self._lc_panel)) + self._nnff = BigParamControl(tr("Neural Net FF"), "NeuralNetworkFeedForward", toggle_callback=self._on_nnff_toggled) + + self._scroller.add_widgets([ + self._aol, self._sab_settings_button, self._lane_change, + self._nnff, + ]) + + def _aol_mode_str(self) -> str: + try: + return _aol_modes()[int(ui_state.params.get("AolSteeringMode", return_default=True))] + except (TypeError, ValueError, IndexError): + return _aol_modes()[0] + + def _on_aol_toggled(self, checked: bool): + if checked: + ui_state.params.put_bool("AolUnifiedEngagementMode", True) + + def _on_nnff_toggled(self, checked: bool): + return None + + def _refresh(self): + offroad = ui_state.is_offroad() + self._aol.refresh() + self._aol.set_value(self._aol_mode_str()) + self._nnff.refresh() + + steering_supported = (ui_state.CP is not None and + ui_state.CP.steerControlType != car.CarParams.SteerControlType.angle) + if not steering_supported: + ui_state.params.remove("NeuralNetworkFeedForward") + self._nnff.refresh() + + self._aol.set_enabled(offroad) + self._sab_settings_button.set_enabled(offroad and self._aol._checked) + self._nnff.set_enabled(offroad and steering_supported) + + def _update_state(self): + super()._update_state() + self._refresh() + + def show_event(self): + super().show_event() + self._refresh() diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/toggles.py b/iqpilot/selfdrive/ui/mici/layouts/settings/toggles.py new file mode 100644 index 000000000..93d26c497 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/toggles.py @@ -0,0 +1,48 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigParamControl +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.multilang import tr + + +class TogglesLayoutMici(NavScroller): + """Equivalent to the BIG UI toggles page, minus cruise items (personality / speed limit / + longitudinal control live in Cruise) and dashcam items (dashcam / driver-cam / mic live in Dashcam).""" + def __init__(self): + super().__init__() + ui_state.params.put_bool("OpenpilotEnabledToggle", True) + + disengage = BigParamControl(tr("disengage on accelerator"), "DisengageOnAccelerator") + ldw = BigParamControl(tr("lane departure warnings"), "IsLdwEnabled") + is_metric = BigParamControl(tr("use metric units"), "IsMetric") + auto_units = BigParamControl(tr("set units from location"), "IQAutoUnits", toggle_callback=self._auto_units_callback) + + self._scroller.add_widgets([disengage, ldw, is_metric, auto_units]) + + self._refresh_toggles = ( + ("DisengageOnAccelerator", disengage), + ("IsLdwEnabled", ldw), + ("IsMetric", is_metric), + ("IQAutoUnits", auto_units), + ) + + if ui_state.params.get_bool("ShowDebugInfo"): + gui_app.set_show_touches(True) + gui_app.set_show_fps(True) + + def show_event(self): + super().show_event() + self._update_toggles() + + def _auto_units_callback(self, state: bool): + if state: + ui_state.params.remove("IQAutoUnitsRegion") + + def _update_toggles(self): + ui_state.update_params() + for key, item in self._refresh_toggles: + item.set_checked(ui_state.params.get_bool(key)) diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/vehicle.py b/iqpilot/selfdrive/ui/mici/layouts/settings/vehicle.py new file mode 100644 index 000000000..25c89566e --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/vehicle.py @@ -0,0 +1,227 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import unicodedata + +import pyray as rl + +from iqpilot.selfdrive.car.vehicle_catalog import load_catalog +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigParamControl +from iqpilot.selfdrive.ui.mici.layouts.settings.iq_widgets import MappedParamToggle +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.system.ui.lib.multilang import tr + + +def _ascii_safe(text: str) -> str: + return unicodedata.normalize("NFD", text).encode("ascii", "ignore").decode("ascii") + + +def _load_platforms() -> dict: + try: + return load_catalog() + except Exception: + return {} + + +class _PickerRow(Widget): + HEIGHT = 92 + + def __init__(self, label: str, on_tap): + super().__init__() + self._label = label + self._on_tap = on_tap + self.set_rect(rl.Rectangle(0, 0, gui_app.width, self.HEIGHT)) + self._font = gui_app.font(FontWeight.MEDIUM) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + self._on_tap(self._label) + + def _render(self, _): + color = rl.Color(255, 255, 255, 255) if self.is_pressed else rl.Color(255, 255, 255, 200) + ts = measure_text_cached(self._font, self._label, 46) + rl.draw_text_ex(self._font, self._label, rl.Vector2(self._rect.x + 44, self._rect.y + (self.HEIGHT - ts.y) / 2), 46, 0, color) + + +class _VerticalPicker(NavScroller): + def __init__(self, options: list[str], on_pick): + super().__init__(horizontal=False, snap_items=False, pad_start=20, pad_end=20) + self._on_pick = on_pick + rows = [_PickerRow(o, self._pick) for o in options] + for row in rows: + row.set_touch_valid_callback(lambda: self._scroller.scroll_panel.is_touch_valid()) + self._scroller.add_widgets(rows) + + def _pick(self, option: str): + gui_app.pop_widget() + self._on_pick(option) + + +class VehicleLayoutMici(NavScroller): + def __init__(self): + super().__init__() + self._platforms = _load_platforms() + + self._vehicle_btn = BigButton(tr("vehicle")) + self._vehicle_btn.set_click_callback(self._on_vehicle_clicked) + + self._toyota_long = BigParamControl(tr("enforce factory long."), "IQToyotaFactoryLong", + toggle_callback=self._on_toyota_long) + self._hyundai_tuning = MappedParamToggle(tr("hyundai long. tuning"), "IQHyundaiLongTune", + [tr("off"), tr("dynamic"), tr("predictive")], [0, 1, 2]) + self._subaru_snag = BigParamControl(tr("creep from standstill (beta)"), "IQSubaruCreepAssist") + self._subaru_manual = BigParamControl(tr("stop and go manual brake"), "IQSubaruCreepAssistManualBrake") + self._vw_pq_hca = BigParamControl(tr("PQ HCA status 7 mode"), "pqhca5or7Toggle") + self._vw_lateral = BigParamControl(tr("lateral when cruise faulted"), "AllowLateralWhenLongUnavailable") + self._vw_mqb_acc_resume = BigParamControl(tr("MQB ACC resume"), "iqMqbAccResume") + self._vw_mqb_steering_lockout = BigParamControl(tr("MQB steering lockout"), "iqMqbSteeringLockout") + self._vw_curvature_controller = BigParamControl(tr("curvature controller"), "EnableCurvatureController") + self._vw_smooth_steer = BigParamControl(tr("smooth steering"), "EnableSmoothSteer") + self._tesla_vtb = BigParamControl(tr("virtual torque blending"), "IQTeslaTorqueBlend") + self._tesla_fsd_visualization = BigParamControl(tr("FSD visuals"), "IQTeslaFsdVisualization") + + self._brand_widgets = { + "toyota": [self._toyota_long], + "hyundai": [self._hyundai_tuning], + "subaru": [self._subaru_snag, self._subaru_manual], + "volkswagen": [self._vw_pq_hca, self._vw_lateral, self._vw_mqb_acc_resume, self._vw_mqb_steering_lockout, + self._vw_curvature_controller, self._vw_smooth_steer], + "tesla": [self._tesla_vtb, self._tesla_fsd_visualization], + } + self._all_brand_widgets = [w for ws in self._brand_widgets.values() for w in ws] + + self._scroller.add_widgets([self._vehicle_btn] + self._all_brand_widgets) + + def _get_current_brand(self) -> str: + bundle = ui_state.params.get("CarPlatformBundle") + if bundle: + return bundle.get("brand", "") + if ui_state.CP: + return getattr(ui_state.CP, "brand", "") + return "" + + def _vw_flags(self): + try: + from iqdbc.car.volkswagen.values import CAR + bundle = ui_state.params.get("CarPlatformBundle") + if bundle and (platform := bundle.get("platform")): + return CAR[platform].config.flags + if ui_state.CP: + return ui_state.CP.flags + except Exception: + pass + return 0 + + def _uses_vw_hca_status_toggle(self) -> bool: + from iqdbc.car.volkswagen.values import VolkswagenFlags + return bool(self._vw_flags() & (VolkswagenFlags.PQ | VolkswagenFlags.MLB)) + + def _is_vw_mqb(self) -> bool: + from iqdbc.car.volkswagen.values import VolkswagenFlags + flags = self._vw_flags() + return not bool(flags & (VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlags.MEB | VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO)) + + def _is_vw_curvature_car(self) -> bool: + from iqdbc.car.volkswagen.values import VolkswagenFlags + return bool(self._vw_flags() & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO)) + + def _supports_vw_lateral_when_faulted(self) -> bool: + from iqdbc.car.volkswagen.values import VolkswagenFlags + # PQ, MEB, MQB_EVO and base MQB all implement cruiseFaultLateralMode in carstate.py. + # MLB does not. + return not bool(self._vw_flags() & VolkswagenFlags.MLB) + + def _pretty_name(self, platform: str) -> str: + for name, v in self._platforms.items(): + if v.get("platform") == platform: + make = v.get("make", "") + if make and name.lower().startswith(make.lower() + " "): + return name[len(make) + 1:] + return name + return _ascii_safe(platform).replace("_", " ").title() + + def _vehicle_status(self) -> str: + bundle = ui_state.params.get("CarPlatformBundle") + if bundle: + name = _ascii_safe(bundle.get("name", "?")) + make = bundle.get("make", "") + if make and name.lower().startswith(make.lower() + " "): + name = name[len(make) + 1:] + return name[:1].upper() + name[1:] + if ui_state.CP and ui_state.CP.carFingerprint not in ("", "MOCK"): + return self._pretty_name(ui_state.CP.carFingerprint) + return "tap to select" + + def _on_vehicle_clicked(self): + if ui_state.params.get("CarPlatformBundle"): + ui_state.params.remove("CarPlatformBundle") + self._refresh() + else: + self._open_make_picker() + + def _open_make_picker(self): + makes = sorted({v.get("make", "") for v in self._platforms.values() if v.get("make")}) + label_to_make = {_ascii_safe(m): m for m in makes} + gui_app.push_widget(_VerticalPicker(list(label_to_make.keys()), + lambda lbl: self._open_model_picker(label_to_make.get(lbl, "")))) + + def _open_model_picker(self, make: str): + if not make: + return + prefix = make + " " + label_to_key: dict = {} + for key in sorted(p for p, v in self._platforms.items() if v.get("make") == make): + label = key[len(prefix):] if key.lower().startswith(prefix.lower()) else key + label_to_key[_ascii_safe(label)] = key + gui_app.push_widget(_VerticalPicker(list(label_to_key.keys()), + lambda lbl: self._select_platform(label_to_key.get(lbl, "")))) + + def _select_platform(self, key: str): + if key and (data := self._platforms.get(key)): + ui_state.params.put("CarPlatformBundle", {**data, "name": key}) + gui_app.pop_widgets_to(self) + self._refresh() + + def _on_toyota_long(self, checked: bool): + if checked and ui_state.params.get_bool("AlphaLongitudinalEnabled"): + ui_state.params.put_bool("AlphaLongitudinalEnabled", False) + ui_state.params.put_bool("OnroadCycleRequested", True) + + def _refresh(self): + self._vehicle_btn.set_value(self._vehicle_status()) + + brand = self._get_current_brand() + offroad = ui_state.is_offroad() + uses_hca_status_toggle = self._uses_vw_hca_status_toggle() + is_mqb = self._is_vw_mqb() + supports_lateral_when_faulted = self._supports_vw_lateral_when_faulted() + is_curvature_car = self._is_vw_curvature_car() + visible = set(self._brand_widgets.get(brand, [])) + for w in self._all_brand_widgets: + show = w in visible + if w is self._vw_pq_hca: + show = show and uses_hca_status_toggle + elif w in (self._vw_mqb_acc_resume, self._vw_mqb_steering_lockout): + show = show and is_mqb + elif w is self._vw_lateral: + show = show and supports_lateral_when_faulted + elif w in (self._vw_curvature_controller, self._vw_smooth_steer): + show = show and is_curvature_car + w.set_visible(show) + if show: + w.refresh() + for w in (self._toyota_long, self._subaru_snag, self._subaru_manual, self._tesla_vtb, self._tesla_fsd_visualization): + w.set_enabled(offroad) + + def _update_state(self): + super()._update_state() + self._vehicle_btn.set_value(self._vehicle_status()) + + def show_event(self): + super().show_event() + self._refresh() diff --git a/iqpilot/selfdrive/ui/mici/layouts/settings/visuals.py b/iqpilot/selfdrive/ui/mici/layouts/settings/visuals.py new file mode 100644 index 000000000..a45a4809e --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/layouts/settings/visuals.py @@ -0,0 +1,26 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigParamControl +from iqpilot.system.ui.widgets.scroller import NavScroller +from iqpilot.system.ui.lib.multilang import tr + + +class VisualsLayoutMici(NavScroller): + def __init__(self): + super().__init__() + self._blind_spot = BigParamControl(tr("Blind Spot Warnings"), "IQBlindSpotAlerts") + self._steering_arc = BigParamControl(tr("Steering Effort Arc"), "IQSteerEffortArc") + self._road_name = BigParamControl(tr("Road Name"), "IQRoadNameOverlay") + self._turn_signals = BigParamControl(tr("Turn Signals"), "IQBlinkerIndicators") + self._accel_bar = BigParamControl(tr("Acceleration Bar"), "IQAccelMeter") + + self._toggles = [self._blind_spot, self._steering_arc, self._road_name, + self._turn_signals, self._accel_bar] + self._scroller.add_widgets(self._toggles) + + def show_event(self): + super().show_event() + for w in self._toggles: + w.refresh() diff --git a/iqpilot/selfdrive/ui/mici/onroad/__init__.py b/iqpilot/selfdrive/ui/mici/onroad/__init__.py new file mode 100644 index 000000000..bb45117b9 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/__init__.py @@ -0,0 +1,12 @@ +import pyray as rl + +SIDE_PANEL_WIDTH = 60 + + +def blend_colors(a: rl.Color, b: rl.Color, f: float) -> rl.Color: + h0, s0, v0 = (hsv0 := rl.color_to_hsv(a)).x, hsv0.y, hsv0.z + h1, s1, v1 = (hsv1 := rl.color_to_hsv(b)).x, hsv1.y, hsv1.z + dh = ((h1 - h0 + 180) % 360) - 180 # shortest hue delta + return rl.color_from_hsv((h0 + f * dh) % 360, + s0 + f * (s1 - s0), + v0 + f * (v1 - v0)) diff --git a/iqpilot/selfdrive/ui/mici/onroad/alert_renderer.py b/iqpilot/selfdrive/ui/mici/onroad/alert_renderer.py new file mode 100644 index 000000000..c75375bce --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/alert_renderer.py @@ -0,0 +1,369 @@ +import time +from enum import StrEnum +from typing import NamedTuple +import pyray as rl +import random +import string +from dataclasses import dataclass +from iqpilot.cereal import messaging, log, car +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.common.filter_simple import BounceFilter, FirstOrderFilter +from iqpilot.system.hardware import TICI +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import UnifiedLabel + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus + +ALERT_MARGIN = 18 + +ALERT_FONT_SMALL = 66 - 50 +ALERT_FONT_BIG = 88 - 40 + +SELFDRIVE_STATE_TIMEOUT = 5 # Seconds +SELFDRIVE_UNRESPONSIVE_TIMEOUT = 10 # Seconds + +# Constants +ALERT_COLORS = { + AlertStatus.normal: rl.Color(0, 0, 0, 255), + AlertStatus.userPrompt: rl.Color(255, 115, 0, 255), + AlertStatus.critical: rl.Color(255, 0, 21, 255), +} + +TURN_SIGNAL_BLINK_PERIOD = 1 / (80 / 60) # Mazda heartbeat turn signal BPM + +DEBUG = False + + +class IconSide(StrEnum): + left = 'left' + right = 'right' + + +class IconLayout(NamedTuple): + texture: rl.Texture + side: IconSide + margin_x: int + margin_y: int + + +class AlertLayout(NamedTuple): + text_rect: rl.Rectangle + icon: IconLayout | None + + +@dataclass +class Alert: + text1: str = "" + text2: str = "" + size: int = 0 + status: int = 0 + visual_alert: int = car.CarControl.HUDControl.VisualAlert.none + alert_type: str = "" + + +# Pre-defined alert instances +ALERT_STARTUP_PENDING = Alert( + text1="IQ.Pilot Unavailable", + text2="Waiting to start", + size=AlertSize.mid, + status=AlertStatus.normal, +) + +ALERT_CRITICAL_TIMEOUT = Alert( + text1="TAKE CONTROL IMMEDIATELY", + text2="System Unresponsive", + size=AlertSize.full, + status=AlertStatus.critical, +) + +ALERT_CRITICAL_REBOOT = Alert( + text1="System Unresponsive", + text2="Reboot Device", + size=AlertSize.full, + status=AlertStatus.critical, +) + + +class AlertRenderer(Widget): + def __init__(self): + super().__init__() + + self._alert_text1_label = UnifiedLabel(text="", font_size=ALERT_FONT_BIG, font_weight=FontWeight.DISPLAY, line_height=0.86, + letter_spacing=-0.02) + self._alert_text2_label = UnifiedLabel(text="", font_size=ALERT_FONT_SMALL, font_weight=FontWeight.ROMAN, line_height=0.86, + letter_spacing=0.025) + + self._prev_alert: Alert | None = None + self._text_gen_time = 0 + self._alert_text2_gen = '' + + # animation filters + # TODO: use 0.1 but with proper alert height calculation + self._alert_y_filter = BounceFilter(0, 0.1, 1 / gui_app.target_fps) + self._alpha_filter = FirstOrderFilter(0, 0.05, 1 / gui_app.target_fps) + + self._turn_signal_timer = 0.0 + self._turn_signal_alpha_filter = FirstOrderFilter(0.0, 0.3, 1 / gui_app.target_fps) + self._last_icon_side: IconSide | None = None + + self._load_icons() + + def _load_icons(self): + self._txt_turn_signal_left = gui_app.texture('icons_mici/onroad/turn_signal_left.png', 104, 96) + self._txt_turn_signal_right = gui_app.texture('icons_mici/onroad/turn_signal_right.png', 104, 96) + self._txt_blind_spot_left = gui_app.texture('icons_mici/onroad/blind_spot_left.png', 134, 150) + self._txt_blind_spot_right = gui_app.texture('icons_mici/onroad/blind_spot_right.png', 134, 150) + + def get_alert(self, sm: messaging.SubMaster) -> Alert | None: + """Generate the current alert based on selfdrive state.""" + ss = sm['selfdriveState'] + + # Check if selfdriveState messages have stopped arriving + if not sm.updated['selfdriveState']: + recv_frame = sm.recv_frame['selfdriveState'] + time_since_onroad = time.monotonic() - ui_state.started_time + + # 1. Never received selfdriveState since going onroad + waiting_for_startup = recv_frame < ui_state.started_frame + if waiting_for_startup and time_since_onroad > 5: + return ALERT_STARTUP_PENDING + + # 2. Lost communication with selfdriveState after receiving it + if TICI and not waiting_for_startup: + ss_missing = time.monotonic() - sm.recv_time['selfdriveState'] + if ss_missing > SELFDRIVE_STATE_TIMEOUT: + if ss.enabled and (ss_missing - SELFDRIVE_STATE_TIMEOUT) < SELFDRIVE_UNRESPONSIVE_TIMEOUT: + return ALERT_CRITICAL_TIMEOUT + return ALERT_CRITICAL_REBOOT + + # No alert if size is none + if ss.alertSize == 0: + return None + + event_name = ss.alertType.split('/')[0] if ss.alertType else '' + if event_name in {'selfdrivedLagging', 'commIssue', 'commIssueAvgFreq'}: + return None + + # Return current alert + ret = Alert(text1=ss.alertText1, text2=ss.alertText2, size=ss.alertSize.raw, status=ss.alertStatus.raw, + visual_alert=ss.alertHudVisual, alert_type=ss.alertType) + self._prev_alert = ret + return ret + + def will_render(self) -> tuple[Alert | None, bool]: + alert = self.get_alert(ui_state.sm) + return alert or self._prev_alert, alert is None + + def _icon_helper(self, alert: Alert) -> AlertLayout: + icon_side = None + txt_icon = None + icon_margin_x = 20 + icon_margin_y = 18 + + # alert_type format is "EventName/eventType" (e.g., "preLaneChangeLeft/warning") + event_name = alert.alert_type.split('/')[0] if alert.alert_type else '' + + if event_name == 'preLaneChangeLeft': + icon_side = IconSide.left + txt_icon = self._txt_turn_signal_left + icon_margin_x = 2 + icon_margin_y = 5 + + elif event_name == 'preLaneChangeRight': + icon_side = IconSide.right + txt_icon = self._txt_turn_signal_right + icon_margin_x = 2 + icon_margin_y = 5 + + elif event_name == 'laneChange': + icon_side = self._last_icon_side + txt_icon = self._txt_turn_signal_left if self._last_icon_side == 'left' else self._txt_turn_signal_right + icon_margin_x = 2 + icon_margin_y = 5 + + elif event_name == 'laneChangeBlocked': + CS = ui_state.sm['carState'] + if CS.leftBlinker: + icon_side = IconSide.left + elif CS.rightBlinker: + icon_side = IconSide.right + else: + icon_side = self._last_icon_side + txt_icon = self._txt_blind_spot_left if icon_side == 'left' else self._txt_blind_spot_right + icon_margin_x = 8 + icon_margin_y = 0 + + else: + self._turn_signal_timer = 0.0 + + self._last_icon_side = icon_side + + # create text rect based on icon presence + text_x = self._rect.x + ALERT_MARGIN + text_width = self._rect.width - ALERT_MARGIN + if icon_side == 'left': + text_x = self._rect.x + self._txt_turn_signal_right.width + text_width = self._rect.width - ALERT_MARGIN - self._txt_turn_signal_right.width + elif icon_side == 'right': + text_x = self._rect.x + ALERT_MARGIN + text_width = self._rect.width - ALERT_MARGIN - self._txt_turn_signal_right.width + + text_rect = rl.Rectangle( + text_x, + self._alert_y_filter.x, + text_width, + self._rect.height, + ) + icon_layout = IconLayout(txt_icon, icon_side, icon_margin_x, icon_margin_y) if txt_icon is not None and icon_side is not None else None + return AlertLayout(text_rect, icon_layout) + + def _render(self, rect: rl.Rectangle) -> bool: + alert = self.get_alert(ui_state.sm) + + # Animate fade and slide in/out + self._alert_y_filter.update(self._rect.y - 50 if alert is None else self._rect.y) + self._alpha_filter.update(0 if alert is None else 1) + + if gui_app.iqpilot_ui(): + ui_state.onroad_brightness_handle_alerts(ui_state.started, alert) + + if alert is None: + # If still animating out, keep the previous alert + if self._alpha_filter.x > 0.01 and self._prev_alert is not None: + alert = self._prev_alert + else: + self._prev_alert = None + return False + + self._draw_background(alert) + + alert_layout = self._icon_helper(alert) + self._draw_text(alert, alert_layout) + self._draw_icons(alert_layout) + + return True + + def _draw_icons(self, alert_layout: AlertLayout) -> None: + if alert_layout.icon is None: + return + + # re-derive dt every frame: this filter is constructed at offroad startup (60fps) but onroad + # runs at a lower target_fps, and a dt frozen from construction decays far too slowly against + # the real frame cadence, so the icon never dims and reads as static-on instead of blinking. + self._turn_signal_alpha_filter.dt = 1 / gui_app.target_fps + self._turn_signal_alpha_filter.update_alpha(0.3) + if time.monotonic() - self._turn_signal_timer > TURN_SIGNAL_BLINK_PERIOD: + self._turn_signal_timer = time.monotonic() + self._turn_signal_alpha_filter.x = 255 * 2 + else: + self._turn_signal_alpha_filter.update(255 * 0.2) + + if alert_layout.icon.side == 'left': + pos_x = int(self._rect.x + alert_layout.icon.margin_x) + else: + pos_x = int(self._rect.x + self._rect.width - alert_layout.icon.margin_x - alert_layout.icon.texture.width) + + if alert_layout.icon.texture not in (self._txt_turn_signal_left, self._txt_turn_signal_right): + icon_alpha = 255 + else: + icon_alpha = int(min(self._turn_signal_alpha_filter.x, 255)) + + rl.draw_texture(alert_layout.icon.texture, pos_x, int(self._rect.y + alert_layout.icon.margin_y), + rl.Color(255, 255, 255, int(icon_alpha * self._alpha_filter.x))) + + def _draw_background(self, alert: Alert) -> None: + # draw top gradient for alert text at top + color = ALERT_COLORS.get(alert.status, ALERT_COLORS[AlertStatus.normal]) + color = rl.Color(color.r, color.g, color.b, int(255 * 0.90 * self._alpha_filter.x)) + translucent_color = rl.Color(color.r, color.g, color.b, int(0 * self._alpha_filter.x)) + + small_alert_height = round(self._rect.height * 0.583) # 140px at mici height + medium_alert_height = round(self._rect.height * 0.833) # 200px at mici height + + # alert_type format is "EventName/eventType" (e.g., "preLaneChangeLeft/warning") + event_name = alert.alert_type.split('/')[0] if alert.alert_type else '' + + if event_name == 'preLaneChangeLeft': + bg_height = small_alert_height + elif event_name == 'preLaneChangeRight': + bg_height = small_alert_height + elif event_name == 'laneChange': + bg_height = small_alert_height + elif event_name == 'laneChangeBlocked': + bg_height = medium_alert_height + else: + bg_height = int(self._rect.height) + + solid_height = round(bg_height * 0.2) + rl.draw_rectangle(int(self._rect.x), int(self._rect.y), int(self._rect.width), solid_height, color) + rl.draw_rectangle_gradient_v(int(self._rect.x), int(self._rect.y + solid_height), int(self._rect.width), + int(bg_height - solid_height), + color, translucent_color) + + def _draw_text(self, alert: Alert, alert_layout: AlertLayout) -> None: + icon_side = alert_layout.icon.side if alert_layout.icon is not None else None + + # TODO: hack + alert_text1 = alert.text1.lower().replace('calibrating: ', 'calibrating:\n') + can_draw_second_line = False + # TODO: there should be a common way to determine font size based on text length to maximize rect + if len(alert_text1) <= 12: + can_draw_second_line = True + font_size = 92 - 10 + elif len(alert_text1) <= 16: + can_draw_second_line = True + font_size = 70 + else: + font_size = 64 - 10 + + if icon_side is not None: + font_size -= 10 + + color = rl.Color(255, 255, 255, int(255 * 0.9 * self._alpha_filter.x)) + + text1_y_offset = 11 if font_size >= 70 else 4 + text_rect1 = rl.Rectangle( + alert_layout.text_rect.x, + alert_layout.text_rect.y - text1_y_offset, + alert_layout.text_rect.width, + alert_layout.text_rect.height, + ) + self._alert_text1_label.set_text(alert_text1) + self._alert_text1_label.set_text_color(color) + self._alert_text1_label.set_font_size(font_size) + self._alert_text1_label.set_alignment(rl.GuiTextAlignment.TEXT_ALIGN_LEFT if icon_side != 'left' else rl.GuiTextAlignment.TEXT_ALIGN_RIGHT) + self._alert_text1_label.render(text_rect1) + + alert_text2 = alert.text2.lower() + + # randomize chars and length for testing + if DEBUG: + if time.monotonic() - self._text_gen_time > 0.5: + self._alert_text2_gen = ''.join(random.choices(string.ascii_lowercase + ' ', k=random.randint(0, 40))) + self._text_gen_time = time.monotonic() + alert_text2 = self._alert_text2_gen or alert_text2 + + if can_draw_second_line and alert_text2: + last_line_h = self._alert_text1_label.rect.y + self._alert_text1_label.get_content_height(int(alert_layout.text_rect.width)) + last_line_h -= 4 + if len(alert_text2) > 18: + small_font_size = 36 + elif len(alert_text2) > 24: + small_font_size = 32 + else: + small_font_size = 40 + text_rect2 = rl.Rectangle( + alert_layout.text_rect.x, + last_line_h, + alert_layout.text_rect.width, + alert_layout.text_rect.height - last_line_h + ) + color = rl.Color(255, 255, 255, int(255 * 0.65 * self._alpha_filter.x)) + + self._alert_text2_label.set_text(alert_text2) + self._alert_text2_label.set_text_color(color) + self._alert_text2_label.set_font_size(small_font_size) + self._alert_text2_label.set_alignment(rl.GuiTextAlignment.TEXT_ALIGN_LEFT if icon_side != 'left' else rl.GuiTextAlignment.TEXT_ALIGN_RIGHT) + self._alert_text2_label.render(text_rect2) diff --git a/iqpilot/selfdrive/ui/mici/onroad/augmented_road_view.py b/iqpilot/selfdrive/ui/mici/onroad/augmented_road_view.py new file mode 100644 index 000000000..73802dfd9 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/augmented_road_view.py @@ -0,0 +1,493 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import time +import numpy as np +import pyray as rl +from iqpilot.cereal import messaging, car, log +from iqpilot.common.params import Params +from iqpilot.cereal.visionipc import VisionStreamType +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus +from iqpilot.selfdrive.ui.mici.onroad import SIDE_PANEL_WIDTH +from iqpilot.selfdrive.ui.mici.onroad.alert_renderer import AlertRenderer +from iqpilot.selfdrive.ui.mici.onroad.driver_state import DriverStateRenderer +from iqpilot.selfdrive.ui.mici.onroad.hud_renderer import HudRenderer +from iqpilot.selfdrive.ui.mici.onroad.model_renderer import ModelRenderer +from iqpilot.selfdrive.ui.mici.onroad.confidence_ball import ConfidenceBall +from iqpilot.selfdrive.ui.mici.onroad.cameraview import CameraView +from iqpilot.system.ui.lib.application import FontWeight, gui_app, MousePos, MouseEvent +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.widgets import Widget +from iqpilot.common.issue_debug import log_issue_limited +from iqpilot.common.filter_simple import BounceFilter +from iqpilot.common.transformations.camera import DEVICE_CAMERAS, DeviceCameraConfig, view_frame_from_device_frame +from iqpilot.common.transformations.orientation import rot_from_euler +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy +from enum import IntEnum +from iqpilot.ui.onroad.augmented_road_view import BORDER_COLORS_IQ +from iqpilot.system.ui.lib.multilang import tr + +if gui_app.iqpilot_ui(): + from iqpilot.ui.mici.onroad.hud_renderer import IQMiciHudRenderer as HudRenderer + from iqpilot.ui.mici.onroad.road_label import RoadNameRendererMici + from iqpilot.selfdrive.ui.ui_state import OnroadTimerStatus + +OpState = log.SelfdriveState.OpenpilotState +CALIBRATED = log.ExtrinsicsCalibration.Status.calibrated +ROAD_CAM = VisionStreamType.VISION_STREAM_ROAD +WIDE_CAM = VisionStreamType.VISION_STREAM_WIDE_ROAD +DEFAULT_DEVICE_CAMERA = DEVICE_CAMERAS["tici", "ar0231"] + + +class BookmarkState(IntEnum): + HIDDEN = 0 + DRAGGING = 1 + TRIGGERED = 2 + +WIDE_CAM_MAX_SPEED = 5.0 # m/s (10 mph) +ROAD_CAM_MIN_SPEED = 10 # m/s (25 mph) + +CAM_Y_OFFSET = 20 +MICI_BORDER_COLOR = rl.Color(0x0C, 0x94, 0x96, 0xFF) +MICI_BORDER_THICKNESS = 50 +MICI_BORDER_ROUNDNESS = 0.2 * 1.02 +MICI_BORDER_BOTTOM_ONLY_HEIGHT = 95 +MICI_EXPERIMENTAL_ICON_SIZE = 28 +MICI_EXPERIMENTAL_ICON_SPACING = 8 + + +class BookmarkIcon(Widget): + PEEK_THRESHOLD = 50 # If icon peeks out this much, snap it fully visible + FULL_VISIBLE_OFFSET = 200 # How far onscreen when fully visible + HIDDEN_OFFSET = -50 # How far offscreen when hidden + + def __init__(self, bookmark_callback): + super().__init__() + self._bookmark_callback = bookmark_callback + self._icon = gui_app.texture("icons_mici/onroad/bookmark.png", 180, 180) + self._icon_fill = gui_app.texture("icons_mici/onroad/bookmark_fill.png", 180, 180) + self._active_icon = self._icon + self._offset_filter = BounceFilter(0.0, 0.1, 1 / gui_app.target_fps) + + # State + self._interacting = False + self._state = BookmarkState.HIDDEN + self._swipe_start_x = 0.0 + self._swipe_current_x = 0.0 + self._is_swiping = False + self._is_swiping_left: bool = False + self._triggered_time: float = 0.0 + + def is_swiping_left(self) -> bool: + """Check if currently swiping left (for scroller to disable).""" + return self._is_swiping_left + + def interacting(self): + interacting, self._interacting = self._interacting, False + return interacting + + def _update_state(self): + if self._state == BookmarkState.DRAGGING: + # Allow pulling past activated position with rubber band effect + swipe_offset = self._swipe_start_x - self._swipe_current_x + swipe_offset = min(swipe_offset, self.FULL_VISIBLE_OFFSET + 50) + self._offset_filter.update(swipe_offset) + + elif self._state == BookmarkState.TRIGGERED: + # Continue animating to fully visible + self._offset_filter.update(self.FULL_VISIBLE_OFFSET) + # Stay in TRIGGERED state for 1 second + if rl.get_time() - self._triggered_time >= 1.5: + self._state = BookmarkState.HIDDEN + + elif self._state == BookmarkState.HIDDEN: + self._offset_filter.update(self.HIDDEN_OFFSET) + + if self._offset_filter.x < 1e-3: + self._interacting = False + self._active_icon = self._icon + + def _handle_mouse_event(self, mouse_event: MouseEvent): + if not ui_state.started: + return + + if mouse_event.left_pressed: + # Store relative position within widget + self._swipe_start_x = mouse_event.pos.x + self._swipe_current_x = mouse_event.pos.x + self._is_swiping = True + self._is_swiping_left = False + self._state = BookmarkState.DRAGGING + self._active_icon = self._icon + + elif mouse_event.left_down and self._is_swiping: + self._swipe_current_x = mouse_event.pos.x + swipe_offset = self._swipe_start_x - self._swipe_current_x + self._is_swiping_left = swipe_offset > 0 + if self._is_swiping_left: + self._interacting = True + + elif mouse_event.left_released: + if self._is_swiping: + swipe_distance = self._swipe_start_x - self._swipe_current_x + + # If peeking past threshold, transition to animating to fully visible and bookmark + if swipe_distance > self.PEEK_THRESHOLD: + self._state = BookmarkState.TRIGGERED + self._triggered_time = rl.get_time() + self._active_icon = self._icon_fill + self._bookmark_callback() + else: + # Otherwise, transition back to hidden + self._state = BookmarkState.HIDDEN + + # Reset swipe state + self._is_swiping = False + self._is_swiping_left = False + + def _render(self, _): + """Render the bookmark icon.""" + if self._offset_filter.x > 0: + icon_x = self.rect.x + self.rect.width - round(self._offset_filter.x) + icon_y = self.rect.y + (self.rect.height - self._active_icon.height) / 2 # Vertically centered + rl.draw_texture(self._active_icon, int(icon_x), int(icon_y), rl.WHITE) + + +class AugmentedRoadView(CameraView): + def __init__(self, bookmark_callback=None, stream_type: VisionStreamType = VisionStreamType.VISION_STREAM_ROAD): + super().__init__("camerad", stream_type) + self._bookmark_callback = bookmark_callback + self._set_placeholder_color(rl.BLACK) + + self.device_camera: DeviceCameraConfig | None = None + self.view_from_calib = view_frame_from_device_frame.copy() + self.view_from_wide_calib = view_frame_from_device_frame.copy() + + self._matrix_cache_key: tuple | None = None + self._cached_matrix: np.ndarray | None = None + self._content_rect = rl.Rectangle() + self._last_click_time = 0.0 + + # Bookmark icon with swipe gesture + self._bookmark_icon = BookmarkIcon(bookmark_callback) + self._params = Params() + self._iq_dynamic_mode: bool = False + self._iq_dynamic_refresh: int = 0 + + self._model_renderer = ModelRenderer() + self._hud_renderer = HudRenderer() + self._alert_renderer = AlertRenderer() + self._driver_state_renderer = DriverStateRenderer() + self._confidence_ball = ConfidenceBall() + self._road_name = RoadNameRendererMici() if gui_app.iqpilot_ui() else None + self._experimental_txt = gui_app.texture("icons_mici/experimental_mode_mici.png", + MICI_EXPERIMENTAL_ICON_SIZE, + MICI_EXPERIMENTAL_ICON_SIZE) + self._iqdynamic_txt = gui_app.texture("icons_mici/iqdynamic_mode_mici.png", + MICI_EXPERIMENTAL_ICON_SIZE, + MICI_EXPERIMENTAL_ICON_SIZE) + self._iqstandard_txt = gui_app.texture("icons_mici/iqstandard_mode_mici.png", + MICI_EXPERIMENTAL_ICON_SIZE, + MICI_EXPERIMENTAL_ICON_SIZE) + self._offroad_label = UnifiedLabel(tr("start the car to\nuse IQ.Pilot"), 54, FontWeight.DISPLAY, + text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + + # debug + self._pm = messaging.PubMaster(['uiDebug']) + + def is_swiping_left(self) -> bool: + """Check if currently swiping left (for scroller to disable).""" + return self._bookmark_icon.is_swiping_left() + + def _update_state(self): + super()._update_state() + # IQDynamicMode only changes from the settings UI; don't pay a Params syscall every frame on + # the onroad hot path. Refresh ~1s (60 frames), matching model_renderer's throttled reads. + self._iq_dynamic_refresh -= 1 + if self._iq_dynamic_refresh <= 0: + self._iq_dynamic_refresh = 60 + self._iq_dynamic_mode = self._params.get_bool("IQDynamicMode") + + # update offroad label + if ui_state.panda_type == log.PandaState.PandaType.unknown: + self._offroad_label.set_text(tr("system booting")) + else: + self._offroad_label.set_text(tr("start the car to\nuse IQ.Pilot")) + + def _handle_mouse_release(self, mouse_pos: MousePos): + # Don't trigger click callback if bookmark was triggered + if not self._bookmark_icon.interacting(): + super()._handle_mouse_release(mouse_pos) + + def _render(self, _): + start_draw = time.monotonic() + self._switch_stream_if_needed(ui_state.sm) + + # Update calibration before rendering + self._update_calibration() + + # Create inner content area with border padding + self._content_rect = rl.Rectangle( + self.rect.x, + self.rect.y, + self.rect.width - SIDE_PANEL_WIDTH, + self.rect.height, + ) + + # Enable scissor mode to clip all rendering within content rectangle boundaries + # This creates a rendering viewport that prevents graphics from drawing outside the border + rl.begin_scissor_mode( + int(self._content_rect.x), + int(self._content_rect.y), + int(self._content_rect.width), + int(self._content_rect.height) + ) + + # Render the base camera view + super()._render(self._content_rect) + + # Draw all UI overlays + self._model_renderer.render(self._content_rect) + + alert_to_render, not_animating_out = self._alert_renderer.will_render() + + # Hide DMoji when disengaged unless AlwaysOnDM is enabled + should_draw_dmoji = (not self._hud_renderer.drawing_top_icons() and ui_state.is_onroad() and + (ui_state.status != UIStatus.DISENGAGED or ui_state.always_on_dm)) + self._driver_state_renderer.set_should_draw(should_draw_dmoji) + self._driver_state_renderer.set_position(self._rect.x + 16, self._rect.y + 10) + self._driver_state_renderer.render() + + self._hud_renderer.set_can_draw_top_icons(alert_to_render is None) + self._hud_renderer.set_wheel_critical_icon(alert_to_render is not None and not not_animating_out and + alert_to_render.visual_alert == car.CarControl.HUDControl.VisualAlert.steerRequired) + # TODO: have alert renderer draw offroad mici label below + if ui_state.started: + self._alert_renderer.render(self._content_rect) + self._hud_renderer.render(self._content_rect) + if self._road_name is not None and alert_to_render is None: + self._road_name.update() + self._road_name.render(self._content_rect) + # don't draw the experimental/IQ.Dynamic icon over alert text (it falls back to the + # top-left alert anchor when the DMoji is hidden while disengaged) + if alert_to_render is None: + self._draw_experimental_icon(should_draw_dmoji) + + # End clipping region + rl.end_scissor_mode() + + self._draw_border() + + # Custom UI extension point - add custom overlays here + # Use self._content_rect for positioning within camera bounds + self._confidence_ball.render(self.rect) + + self._bookmark_icon.render(self.rect) + + draw_time_ms = (time.monotonic() - start_draw) * 1000 + if draw_time_ms > 40.0: + log_issue_limited( + "ui_draw_slow_mici", + "ui", + f"mici onroad draw slow drawTimeMillis={draw_time_ms:.2f} navActive={getattr(ui_state.sm['iqNavState'], 'active', False)}", + interval_sec=1.0, + ) + msg = messaging.new_message('uiDebug') + msg.uiDebug.drawTimeMillis = draw_time_ms + self._pm.send('uiDebug', msg) + + # Draw darkened background and text if not onroad + if not ui_state.started: + rl.draw_rectangle(int(self.rect.x), int(self.rect.y), int(self.rect.width), int(self.rect.height), rl.Color(0, 0, 0, 175)) + self._offroad_label.render(self._content_rect) + + def _draw_experimental_icon(self, draw_below_driver_state: bool) -> None: + if not ui_state.started: + return + + if not ui_state.sm['carParams'].openpilotLongitudinalControl: + return + + if ui_state.sm['selfdriveState'].experimentalMode: + icon = self._iqdynamic_txt if self._iq_dynamic_mode else self._experimental_txt + else: + icon = self._iqstandard_txt + + if draw_below_driver_state: + pos_x = self._rect.x + 16 + (self._driver_state_renderer.rect.width - icon.width) / 2 + pos_y = self._rect.y + 10 + self._driver_state_renderer.rect.height + MICI_EXPERIMENTAL_ICON_SPACING + else: + pos_x = self._rect.x + 18 + pos_y = self._rect.y + 18 + + rl.draw_texture(icon, int(pos_x), int(pos_y), rl.WHITE) + + def _draw_border(self): + rl.draw_rectangle_rounded_lines_ex(self._content_rect, MICI_BORDER_ROUNDNESS, 10, MICI_BORDER_THICKNESS, rl.BLACK) + + aol = ui_state.sm["iqState"].aol + ss_enabled = ui_state.sm["selfdriveState"].enabled + if aol.active and ss_enabled: + rl.draw_rectangle_rounded_lines_ex(self._content_rect, MICI_BORDER_ROUNDNESS, 10, MICI_BORDER_THICKNESS, MICI_BORDER_COLOR) + self._reblacken_border_edges() + elif aol.active and not ss_enabled: + clip_y = int(self._content_rect.y + self._content_rect.height - MICI_BORDER_BOTTOM_ONLY_HEIGHT) + rl.begin_scissor_mode(int(self._content_rect.x), clip_y, + int(self._content_rect.width), MICI_BORDER_BOTTOM_ONLY_HEIGHT) + border_color = BORDER_COLORS_IQ[UIStatus.LAT_ONLY] if ui_state.status != UIStatus.OVERRIDE else rl.Color(0x89, 0x92, 0x8D, 0xFF) + rl.draw_rectangle_rounded_lines_ex(self._content_rect, MICI_BORDER_ROUNDNESS, 10, MICI_BORDER_THICKNESS, border_color) + rl.end_scissor_mode() + self._reblacken_border_edges() + + def _reblacken_border_edges(self): + cr = self._content_rect + r = int(MICI_BORDER_ROUNDNESS * min(cr.width, cr.height) / 2) + MICI_BORDER_THICKNESS + 6 + regions = ( + (cr.x, cr.y, r, r), # top-left corner + (cr.x, cr.y + cr.height - r, r, r), # bottom-left corner + (cr.x + cr.width - r, cr.y, r + SIDE_PANEL_WIDTH, cr.height), # right edge + both right corners + ) + for rx, ry, rw, rh in regions: + rl.begin_scissor_mode(int(rx), int(ry), int(rw), int(rh)) + rl.draw_rectangle_rounded_lines_ex(cr, MICI_BORDER_ROUNDNESS, 10, MICI_BORDER_THICKNESS, rl.BLACK) + rl.end_scissor_mode() + + def _switch_stream_if_needed(self, sm): + if sm['selfdriveState'].experimentalMode and WIDE_CAM in self.available_streams: + v_ego = sm['carState'].vEgo + if v_ego < WIDE_CAM_MAX_SPEED: + target = WIDE_CAM + elif v_ego > ROAD_CAM_MIN_SPEED: + target = ROAD_CAM + else: + # Hysteresis zone - keep current stream + target = self.stream_type + else: + target = ROAD_CAM + + if self.stream_type != target: + self.switch_stream(target) + + def _update_calibration(self): + # Update device camera if not already set + sm = ui_state.sm + if not self.device_camera and sm.seen['roadCameraState'] and sm.seen['deviceState']: + self.device_camera = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['roadCameraState'].sensor))] + + if not sm.seen["extrinsicsCalibration"]: + return + + calib = sm['extrinsicsCalibration'] + calib_rpy = get_calibrated_rpy(calib) + if calib_rpy is None: + return + + # Update view_from_calib matrix + prev_view_from_calib = self.view_from_calib.copy() + prev_view_from_wide_calib = self.view_from_wide_calib.copy() + device_from_calib = rot_from_euler(calib_rpy) + self.view_from_calib = view_frame_from_device_frame @ device_from_calib + + # Update wide calibration if available + if hasattr(calib, 'wideFromDeviceEuler') and len(calib.wideFromDeviceEuler) == 3: + wide_from_device = rot_from_euler(calib.wideFromDeviceEuler) + self.view_from_wide_calib = view_frame_from_device_frame @ wide_from_device @ device_from_calib + + if (not np.allclose(self.view_from_calib, prev_view_from_calib) or + not np.allclose(self.view_from_wide_calib, prev_view_from_wide_calib)): + self._matrix_cache_key = (0, 0, 0, self.stream_type, 0.0) + self._cached_matrix = None + + def _calc_frame_matrix(self, rect: rl.Rectangle) -> np.ndarray: + # Early-return the cached matrix when nothing that affects it changed. The key deliberately + # excludes rect.x/y — those are applied as a draw-time offset in ModelRenderer (below), so the + # cache stays hot while the onroad view translates during a scroll/transition (stock PR #37948). + cache_key = ( + ui_state.sm.recv_frame['extrinsicsCalibration'], + int(self._content_rect.width), + int(self._content_rect.height), + self.stream_type, + round(ui_state.sm['carState'].vEgo, 1), + ) + if cache_key == self._matrix_cache_key and self._cached_matrix is not None: + return self._cached_matrix + + # Get camera configuration + device_camera = self.device_camera or DEFAULT_DEVICE_CAMERA + is_wide_camera = self.stream_type == WIDE_CAM + intrinsic = device_camera.ecam.intrinsics if is_wide_camera else device_camera.fcam.intrinsics + calibration = self.view_from_wide_calib if is_wide_camera else self.view_from_calib + if is_wide_camera: + zoom = 0.7 * 1.5 + else: + zoom = np.interp(ui_state.sm['carState'].vEgo, [10, 30], [0.8, 1.0]) + + # Calculate transforms for vanishing point + inf_point = np.array([1000.0, 0.0, 0.0]) + calib_transform = intrinsic @ calibration + kep = calib_transform @ inf_point + + # Calculate center points and dimensions (rect.x/y are NOT used here — applied at draw time) + w, h = self._content_rect.width, self._content_rect.height + cx, cy = intrinsic[0, 2], intrinsic[1, 2] + + # Calculate max allowed offsets with margins + margin = 5 + max_x_offset = cx * zoom - w / 2 - margin + max_y_offset = cy * zoom - h / 2 - margin + + # Calculate and clamp offsets to prevent out-of-bounds issues + try: + if abs(kep[2]) > 1e-6: + x_offset = np.clip((kep[0] / kep[2] - cx) * zoom, -max_x_offset, max_x_offset) + y_offset = np.clip((kep[1] / kep[2] - cy) * zoom + CAM_Y_OFFSET, -max_y_offset, max_y_offset) + else: + x_offset, y_offset = 0, 0 + except (ZeroDivisionError, OverflowError): + x_offset, y_offset = 0, 0 + + # Cache the computed transformation matrix to avoid recalculations + self._matrix_cache_key = cache_key + self._cached_matrix = np.array([ + [zoom * 2 * cx / w, 0, -x_offset / w * 2], + [0, zoom * 2 * cy / h, -y_offset / h * 2], + [0, 0, 1.0] + ]) + + # Built WITHOUT rect.x/y so the matrix (and the model_renderer projection it drives) stays + # cache-stable while the view slides; ModelRenderer adds (rect.x, rect.y) as a draw-time offset. + video_transform = np.array([ + [zoom, 0.0, (w / 2 - x_offset) - (cx * zoom)], + [0.0, zoom, (h / 2 - y_offset) - (cy * zoom)], + [0.0, 0.0, 1.0] + ]) + self._model_renderer.set_transform(video_transform @ calib_transform) + + return self._cached_matrix + + def show_event(self): + if gui_app.iqpilot_ui(): + ui_state.reset_onroad_sleep_timer(OnroadTimerStatus.RESUME) + + def hide_event(self): + if gui_app.iqpilot_ui(): + ui_state.reset_onroad_sleep_timer(OnroadTimerStatus.PAUSE) + + +if __name__ == "__main__": + gui_app.init_window("OnRoad Camera View") + road_camera_view = AugmentedRoadView(ROAD_CAM) + print("***press space to switch camera view***") + try: + for _ in gui_app.render(): + ui_state.update() + if rl.is_key_released(rl.KeyboardKey.KEY_SPACE): + if WIDE_CAM in road_camera_view.available_streams: + stream = ROAD_CAM if road_camera_view.stream_type == WIDE_CAM else WIDE_CAM + road_camera_view.switch_stream(stream) + road_camera_view.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + finally: + road_camera_view.close() diff --git a/iqpilot/selfdrive/ui/mici/onroad/cameraview.py b/iqpilot/selfdrive/ui/mici/onroad/cameraview.py new file mode 100644 index 000000000..c1275d408 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/cameraview.py @@ -0,0 +1,418 @@ +import platform +import numpy as np +import pyray as rl + +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionIpcClient, VisionBuf +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import EGL_DMA_BUF_SUPPORTED +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.egl import init_egl, create_egl_image, destroy_egl_image, bind_egl_image_to_texture, EGLImage +from iqpilot.system.ui.widgets import Widget +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus + +CONNECTION_RETRY_INTERVAL = 0.2 # seconds between connection attempts + +VERSION = """ +#version 300 es +precision mediump float; +""" +if platform.system() == "Darwin": + VERSION = """ + #version 330 core + """ + + +VERTEX_SHADER = VERSION + """ +in vec3 vertexPosition; +in vec2 vertexTexCoord; +in vec3 vertexNormal; +in vec4 vertexColor; +uniform mat4 mvp; +out vec2 fragTexCoord; +out vec4 fragColor; +void main() { + fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + gl_Position = mvp * vec4(vertexPosition, 1.0); +} +""" + +# Choose fragment shader based on platform capabilities +if EGL_DMA_BUF_SUPPORTED: + FRAME_FRAGMENT_SHADER = """ + #version 300 es + #extension GL_OES_EGL_image_external_essl3 : enable + precision mediump float; + in vec2 fragTexCoord; + uniform samplerExternalOES texture0; + out vec4 fragColor; + uniform int engaged; + uniform int enhance_driver; + + void main() { + vec4 color = texture(texture0, fragTexCoord); + if (engaged == 1) { + float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114)); // Luma + color.rgb = mix(vec3(gray), color.rgb, 0.2); // 20% saturation + color.rgb = clamp((color.rgb - 0.5) * 1.2 + 0.5, 0.0, 1.0); // +20% contrast + color.rgb = pow(color.rgb, vec3(1.0/1.28)); + fragColor = vec4(color.rgb, color.a); + } else { + color.rgb *= 0.85; // 85% opacity + } + if (enhance_driver == 1) { + float brightness = 1.1; + color.rgb = color.rgb + 0.15; + color.rgb = clamp((color.rgb - 0.5) * (brightness * 0.8) + 0.5, 0.0, 1.0); + color.rgb = color.rgb * color.rgb * (3.0 - 2.0 * color.rgb); + color.rgb = pow(color.rgb, vec3(0.8)); + } + fragColor = vec4(color.rgb, color.a); + } + """ +else: + FRAME_FRAGMENT_SHADER = VERSION + """ + in vec2 fragTexCoord; + uniform sampler2D texture0; + uniform sampler2D texture1; + out vec4 fragColor; + uniform int engaged; + uniform int enhance_driver; + + void main() { + float y = texture(texture0, fragTexCoord).r; + vec2 uv = texture(texture1, fragTexCoord).ra - 0.5; + vec3 rgb = vec3(y + 1.402*uv.y, y - 0.344*uv.x - 0.714*uv.y, y + 1.772*uv.x); + if (engaged == 1) { + float gray = dot(rgb, vec3(0.299, 0.587, 0.114)); + rgb = mix(vec3(gray), rgb, 0.2); // 20% saturation + rgb = clamp((rgb - 0.5) * 1.2 + 0.5, 0.0, 1.0); // +20% contrast + } else { + rgb *= 0.85; // 85% opacity + } + // TODO: the images out of camerad need some more correction and + // the ui should apply a gamma curve for the device display + if (enhance_driver == 1) { + float brightness = 1.1; + rgb = rgb + 0.15; + rgb = clamp((rgb - 0.5) * (brightness * 0.8) + 0.5, 0.0, 1.0); + rgb = rgb * rgb * (3.0 - 2.0 * rgb); + rgb = pow(rgb, vec3(0.8)); + } + fragColor = vec4(rgb, 1.0); + } + """ + + +class CameraView(Widget): + def __init__(self, name: str, stream_type: VisionStreamType): + super().__init__() + self._name = name + # Primary stream + self.client = VisionIpcClient(name, stream_type, conflate=True) + self._stream_type = stream_type + self.available_streams: list[VisionStreamType] = [] + + # Target stream for switching + self._target_client: VisionIpcClient | None = None + self._target_stream_type: VisionStreamType | None = None + self._switching: bool = False + + self._texture_needs_update = True + self.last_connection_attempt: float = 0.0 + self.shader = rl.load_shader_from_memory(VERTEX_SHADER, FRAME_FRAGMENT_SHADER) + self._texture1_loc: int = rl.get_shader_location(self.shader, "texture1") if not EGL_DMA_BUF_SUPPORTED else -1 + self._engaged_loc = rl.get_shader_location(self.shader, "engaged") + self._engaged_val = rl.ffi.new("int[1]", [1]) + self._enhance_driver_loc = rl.get_shader_location(self.shader, "enhance_driver") + self._enhance_driver_val = rl.ffi.new("int[1]", [1 if stream_type == VisionStreamType.VISION_STREAM_DRIVER else 0]) + + self.frame: VisionBuf | None = None + self.texture_y: rl.Texture | None = None + self.texture_uv: rl.Texture | None = None + + # EGL resources + self.egl_images: dict[int, EGLImage] = {} + self.egl_texture: rl.Texture | None = None + + self._placeholder_color: rl.Color | None = None + + # Initialize EGL for zero-copy rendering on comma 3/3X. + if EGL_DMA_BUF_SUPPORTED: + if not init_egl(): + raise RuntimeError("Failed to initialize EGL") + + # Create a 1x1 pixel placeholder texture for EGL image binding + temp_image = rl.gen_image_color(1, 1, rl.BLACK) + self.egl_texture = rl.load_texture_from_image(temp_image) + rl.unload_image(temp_image) + + ui_state.add_offroad_transition_callback(self._offroad_transition) + + def _offroad_transition(self): + # Reconnect if not first time going onroad + if ui_state.is_onroad() and self.frame is not None: + # Prevent old frames from showing when going onroad. Qt has a separate thread + # which drains the VisionIpcClient SubSocket for us. Re-connecting is not enough + # and only clears internal buffers, not the message queue. + self.frame = None + self.available_streams.clear() + if self.client: + del self.client + self.client = VisionIpcClient(self._name, self._stream_type, conflate=True) + + def _set_placeholder_color(self, color: rl.Color): + """Set a placeholder color to be drawn when no frame is available.""" + self._placeholder_color = color + + def switch_stream(self, stream_type: VisionStreamType) -> None: + if self._stream_type == stream_type: + return + + if self._switching and self._target_stream_type == stream_type: + return + + cloudlog.debug(f'Preparing switch from {self._stream_type} to {stream_type}') + + if self._target_client: + del self._target_client + + self._target_stream_type = stream_type + self._target_client = VisionIpcClient(self._name, stream_type, conflate=True) + self._switching = True + + @property + def stream_type(self) -> VisionStreamType: + return self._stream_type + + def close(self) -> None: + self._clear_textures() + + # Clean up EGL texture + if EGL_DMA_BUF_SUPPORTED and self.egl_texture: + rl.unload_texture(self.egl_texture) + self.egl_texture = None + + # Clean up shader + if self.shader and self.shader.id: + rl.unload_shader(self.shader) + self.shader.id = 0 + + self.frame = None + self.available_streams.clear() + self.client = None + + def __del__(self): + self.close() + + def _calc_frame_matrix(self, rect: rl.Rectangle) -> np.ndarray: + if not self.frame: + return np.eye(3) + + # Calculate aspect ratios + widget_aspect_ratio = rect.width / rect.height + frame_aspect_ratio = self.frame.width / self.frame.height + + # Calculate scaling factors to maintain aspect ratio + zx = min(frame_aspect_ratio / widget_aspect_ratio, 1.0) + zy = min(widget_aspect_ratio / frame_aspect_ratio, 1.0) + + return np.array([ + [zx, 0.0, 0.0], + [0.0, zy, 0.0], + [0.0, 0.0, 1.0] + ]) + + def _render(self, rect: rl.Rectangle): + if self._switching: + self._handle_switch() + + if not self._ensure_connection(): + self._draw_placeholder(rect) + return + + # Try to get a new buffer without blocking + buffer = self.client.recv(timeout_ms=0) + if buffer: + self._texture_needs_update = True + self.frame = buffer + elif not self.client.is_connected(): + # ensure we clear the displayed frame when the connection is lost + self.frame = None + + if not self.frame: + self._draw_placeholder(rect) + return + + transform = self._calc_frame_matrix(rect) + src_rect = rl.Rectangle(0, 0, float(self.frame.width), float(self.frame.height)) + # Flip driver camera horizontally + if self._stream_type == VisionStreamType.VISION_STREAM_DRIVER: + src_rect.width = -src_rect.width + + # Calculate scale + scale_x = rect.width * transform[0, 0] # zx + scale_y = rect.height * transform[1, 1] # zy + + # Calculate base position (centered) + x_offset = rect.x + (rect.width - scale_x) / 2 + y_offset = rect.y + (rect.height - scale_y) / 2 + + x_offset += transform[0, 2] * rect.width / 2 + y_offset += transform[1, 2] * rect.height / 2 + + dst_rect = rl.Rectangle(x_offset, y_offset, scale_x, scale_y) + + # Render with appropriate method + if EGL_DMA_BUF_SUPPORTED: + self._render_egl(src_rect, dst_rect) + else: + self._render_textures(src_rect, dst_rect) + + def _draw_placeholder(self, rect: rl.Rectangle): + if self._placeholder_color: + rl.draw_rectangle_rec(rect, self._placeholder_color) + + def _render_egl(self, src_rect: rl.Rectangle, dst_rect: rl.Rectangle) -> None: + """Render using EGL for direct buffer access""" + if self.frame is None or self.egl_texture is None: + return + + idx = self.frame.idx + egl_image = self.egl_images.get(idx) + + # Create EGL image if needed + if egl_image is None: + egl_image = create_egl_image(self.frame.width, self.frame.height, self.frame.stride, self.frame.fd, self.frame.uv_offset) + if egl_image: + self.egl_images[idx] = egl_image + else: + return + + # Update texture dimensions to match current frame + self.egl_texture.width = self.frame.width + self.egl_texture.height = self.frame.height + + # Bind the EGL image to our texture + bind_egl_image_to_texture(self.egl_texture.id, egl_image) + + # Render with shader + rl.begin_shader_mode(self.shader) + self._update_texture_color_filtering() + rl.draw_texture_pro(self.egl_texture, src_rect, dst_rect, rl.Vector2(0, 0), 0.0, rl.WHITE) + rl.end_shader_mode() + + def _render_textures(self, src_rect: rl.Rectangle, dst_rect: rl.Rectangle) -> None: + """Render using texture copies""" + if not self.texture_y or not self.texture_uv or self.frame is None: + return + + # Update textures with new frame data + if self._texture_needs_update: + y_data = self.frame.data[: self.frame.uv_offset] + uv_data = self.frame.data[self.frame.uv_offset:] + + rl.update_texture(self.texture_y, rl.ffi.cast("void *", y_data.ctypes.data)) + rl.update_texture(self.texture_uv, rl.ffi.cast("void *", uv_data.ctypes.data)) + self._texture_needs_update = False + + # Render with shader + rl.begin_shader_mode(self.shader) + self._update_texture_color_filtering() + rl.set_shader_value_texture(self.shader, self._texture1_loc, self.texture_uv) + rl.draw_texture_pro(self.texture_y, src_rect, dst_rect, rl.Vector2(0, 0), 0.0, rl.WHITE) + rl.end_shader_mode() + + def _update_texture_color_filtering(self): + self._engaged_val[0] = 1 if ui_state.status != UIStatus.DISENGAGED else 0 + rl.set_shader_value(self.shader, self._engaged_loc, self._engaged_val, rl.ShaderUniformDataType.SHADER_UNIFORM_INT) + rl.set_shader_value(self.shader, self._enhance_driver_loc, self._enhance_driver_val, rl.ShaderUniformDataType.SHADER_UNIFORM_INT) + + def _ensure_connection(self) -> bool: + if not self.client.is_connected(): + self.frame = None + self.available_streams.clear() + + # Throttle connection attempts + current_time = rl.get_time() + if current_time - self.last_connection_attempt < CONNECTION_RETRY_INTERVAL: + return False + self.last_connection_attempt = current_time + + if not self.client.connect(False) or not self.client.num_buffers: + return False + + cloudlog.debug(f"Connected to {self._name} stream: {self._stream_type}, buffers: {self.client.num_buffers}") + self._initialize_textures() + self.available_streams = self.client.available_streams(self._name, block=False) + + return True + + def _handle_switch(self) -> None: + """Check if target stream is ready and switch immediately.""" + if not self._target_client or not self._switching: + return + + # Try to connect target if needed + if not self._target_client.is_connected(): + if not self._target_client.connect(False) or not self._target_client.num_buffers: + return + + cloudlog.debug(f"Target stream connected: {self._target_stream_type}") + + # Check if target has frames ready + target_frame = self._target_client.recv(timeout_ms=0) + if target_frame: + self.frame = target_frame # Update current frame to target frame + self._complete_switch() + + def _complete_switch(self) -> None: + """Instantly switch to target stream.""" + cloudlog.debug(f"Switching to {self._target_stream_type}") + # Clean up current resources + if self.client: + del self.client + + # Switch to target + self.client = self._target_client + self._stream_type = self._target_stream_type + self._texture_needs_update = True + + # Reset state + self._target_client = None + self._target_stream_type = None + self._switching = False + + # Initialize textures for new stream + self._initialize_textures() + + def _initialize_textures(self): + self._clear_textures() + if not EGL_DMA_BUF_SUPPORTED: + self.texture_y = rl.load_texture_from_image(rl.Image(None, int(self.client.stride), + int(self.client.height), 1, rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_GRAYSCALE)) + self.texture_uv = rl.load_texture_from_image(rl.Image(None, int(self.client.stride // 2), + int(self.client.height // 2), 1, rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA)) + + def _clear_textures(self): + if self.texture_y and self.texture_y.id: + rl.unload_texture(self.texture_y) + self.texture_y = None + + if self.texture_uv and self.texture_uv.id: + rl.unload_texture(self.texture_uv) + self.texture_uv = None + + # Clean up EGL resources + if EGL_DMA_BUF_SUPPORTED: + for data in self.egl_images.values(): + destroy_egl_image(data) + self.egl_images = {} + + +if __name__ == "__main__": + gui_app.init_window("camera view") + road = CameraView("camerad", VisionStreamType.VISION_STREAM_ROAD) + for _ in gui_app.render(): + road.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) diff --git a/iqpilot/selfdrive/ui/mici/onroad/confidence_ball.py b/iqpilot/selfdrive/ui/mici/onroad/confidence_ball.py new file mode 100644 index 000000000..9776f7439 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/confidence_ball.py @@ -0,0 +1,86 @@ +import math +import pyray as rl +from iqpilot.selfdrive.ui.mici.onroad import SIDE_PANEL_WIDTH +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.common.filter_simple import FirstOrderFilter + +from iqpilot.ui.mici.onroad.confidence_ball import IQConfidenceBall + + +def draw_circle_gradient(center_x: float, center_y: float, radius: int, + top: rl.Color, bottom: rl.Color) -> None: + # Draw a square with the gradient + rl.draw_rectangle_gradient_v(int(center_x - radius), int(center_y - radius), + radius * 2, radius * 2, + top, bottom) + + # Paint over square with a ring + outer_radius = math.ceil(radius * math.sqrt(2)) + 1 + rl.draw_ring(rl.Vector2(int(center_x), int(center_y)), radius, outer_radius, + 0.0, 360.0, + 20, rl.BLACK) + + +class ConfidenceBall(Widget, IQConfidenceBall): + def __init__(self, demo: bool = False): + Widget.__init__(self) + IQConfidenceBall.__init__(self) + self._demo = demo + self._confidence_filter = FirstOrderFilter(-0.5, 0.5, 1 / gui_app.target_fps) + + def update_filter(self, value: float): + self._confidence_filter.update(value) + + def _update_state(self): + if self._demo: + return + + # animate status dot in from bottom + if ui_state.status == UIStatus.DISENGAGED: + self._confidence_filter.update(-0.5) + elif ui_state.status in (UIStatus.LAT_ONLY, UIStatus.LONG_ONLY): + self._confidence_filter.update(1 - max(self.get_animate_status_probs() or [1])) + else: + self._confidence_filter.update((1 - max(ui_state.sm['modelV2'].meta.disengagePredictions.brakeDisengageProbs or [1])) * + (1 - max(ui_state.sm['modelV2'].meta.disengagePredictions.steerOverrideProbs or [1]))) + + def _render(self, _): + content_rect = rl.Rectangle( + self.rect.x + self.rect.width - SIDE_PANEL_WIDTH, + self.rect.y, + SIDE_PANEL_WIDTH, + self.rect.height, + ) + + status_dot_radius = 24 + dot_height = (1 - self._confidence_filter.x) * (content_rect.height - 2 * status_dot_radius) + status_dot_radius + dot_height = self._rect.y + dot_height + + # confidence zones + if ui_state.status == UIStatus.ENGAGED or self._demo: + if self._confidence_filter.x > 0.5: + top_dot_color = rl.Color(0, 255, 204, 255) + bottom_dot_color = rl.Color(0, 255, 38, 255) + elif self._confidence_filter.x > 0.2: + top_dot_color = rl.Color(255, 200, 0, 255) + bottom_dot_color = rl.Color(255, 115, 0, 255) + else: + top_dot_color = rl.Color(255, 0, 21, 255) + bottom_dot_color = rl.Color(255, 0, 89, 255) + + elif ui_state.status in (UIStatus.LAT_ONLY, UIStatus.LONG_ONLY): + top_dot_color, bottom_dot_color = self.get_lat_long_dot_colors(self._confidence_filter.x) + + elif ui_state.status == UIStatus.OVERRIDE: + top_dot_color = rl.Color(255, 255, 255, 255) + bottom_dot_color = rl.Color(82, 82, 82, 255) + + else: + top_dot_color = rl.Color(50, 50, 50, 255) + bottom_dot_color = rl.Color(13, 13, 13, 255) + + draw_circle_gradient(content_rect.x + content_rect.width - status_dot_radius, + dot_height, status_dot_radius, + top_dot_color, bottom_dot_color) diff --git a/iqpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py b/iqpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py new file mode 100644 index 000000000..6bb319442 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py @@ -0,0 +1,246 @@ +import pyray as rl +from iqpilot.cereal import log, messaging +from iqpilot.cereal.visionipc import VisionStreamType +from iqpilot.selfdrive.ui.mici.onroad.cameraview import CameraView +from iqpilot.selfdrive.ui.mici.onroad.driver_state import DriverStateRenderer +from iqpilot.selfdrive.ui.ui_state import ui_state, device +from iqpilot.selfdrive.selfdrived.events import EVENTS, ET +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets.nav_widget import NavWidget +from iqpilot.system.ui.widgets.label import gui_label + +EventName = log.OnroadEvent.EventName + +EVENT_TO_INT = EventName.schema.enumerants + + +class DriverCameraView(CameraView): + def _calc_frame_matrix(self, rect: rl.Rectangle): + base = super()._calc_frame_matrix(rect) + driver_view_ratio = 1.5 + base[0, 0] *= driver_view_ratio + base[1, 1] *= driver_view_ratio + return base + + +class DriverCameraDialog(NavWidget): + def __init__(self, no_escape=False): + super().__init__() + self._no_escape = no_escape + self._camera_view = DriverCameraView("camerad", VisionStreamType.VISION_STREAM_DRIVER) + self.driver_state_renderer = DriverStateRenderer(lines=True) + self.driver_state_renderer.set_rect(rl.Rectangle(0, 0, 200, 200)) + self.driver_state_renderer.load_icons() + self._pm: messaging.PubMaster | None = None + if not no_escape: + # TODO: this can grow unbounded, should be given some thought + device.add_interactive_timeout_callback(lambda: gui_app.set_modal_overlay(None)) + self.set_back_callback(lambda: gui_app.set_modal_overlay(None)) + + # Load eye icons + self._eye_fill_texture = None + self._eye_orange_texture = None + self._eye_size = 74 + self._glasses_texture = None + self._glasses_size = 171 + + self._load_eye_textures() + + def _back_enabled(self) -> bool: + return not self._no_escape + + def show_event(self): + super().show_event() + ui_state.params.put_bool("IsDriverViewEnabled", True) + self._publish_alert_sound(None) + device.set_override_interactive_timeout(300) + ui_state.params.remove("DriverTooDistracted") + self._pm = messaging.PubMaster(['selfdriveState']) + + def hide_event(self): + super().hide_event() + ui_state.params.put_bool("IsDriverViewEnabled", False) + device.set_override_interactive_timeout(None) + + def _handle_mouse_release(self, _): + ui_state.params.remove("DriverTooDistracted") + + def __del__(self): + self.close() + + def close(self): + if self._camera_view: + self._camera_view.close() + + def _update_state(self): + if self._camera_view: + self._camera_view._update_state() + # Enable driver state renderer to show Dmoji in preview + self.driver_state_renderer.set_should_draw(True) + self.driver_state_renderer.set_force_active(True) + super()._update_state() + + def _render(self, rect): + rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height)) + self._camera_view._render(rect) + + if not self._camera_view.frame: + gui_label(rect, tr("camera starting"), font_size=54, font_weight=FontWeight.BOLD, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + rl.end_scissor_mode() + self._publish_alert_sound(None) + return -1 + + driver_data = self._draw_face_detection(rect) + if driver_data is not None: + self._draw_eyes(rect, driver_data) + + # Position dmoji on opposite side from driver + driver_state_rect = ( + rect.x if self.driver_state_renderer.is_rhd else rect.x + rect.width - self.driver_state_renderer.rect.width, + rect.y + (rect.height - self.driver_state_renderer.rect.height) / 2, + ) + self.driver_state_renderer.set_position(*driver_state_rect) + self.driver_state_renderer.render() + + # Render driver monitoring alerts + self._render_dm_alerts(rect) + + rl.end_scissor_mode() + return -1 + + def _publish_alert_sound(self, dm_state): + """Publish selfdriveState with only alertSound field set""" + if self._pm is None: + return + + msg = messaging.new_message('selfdriveState') + if dm_state is not None and len(dm_state.events): + event_name = EVENT_TO_INT[dm_state.events[0].name] + if event_name is not None and event_name in EVENTS and ET.PERMANENT in EVENTS[event_name]: + msg.selfdriveState.alertSound = EVENTS[event_name][ET.PERMANENT].audible_alert + self._pm.send('selfdriveState', msg) + + def _render_dm_alerts(self, rect: rl.Rectangle): + """Render driver monitoring event names""" + dm_state = ui_state.sm["driverMonitoringState"] + self._publish_alert_sound(dm_state) + + gui_label(rl.Rectangle(rect.x + 2, rect.y + 2, rect.width, rect.height), + f"Awareness: {dm_state.awarenessStatus * 100:.0f}%", font_size=44, font_weight=FontWeight.MEDIUM, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_RIGHT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP, + color=rl.Color(0, 0, 0, 180)) + gui_label(rect, f"Awareness: {dm_state.awarenessStatus * 100:.0f}%", font_size=44, font_weight=FontWeight.MEDIUM, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_RIGHT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP, + color=rl.Color(255, 255, 255, int(255 * 0.9))) + + if not dm_state.events: + return + + # Show first event (only one should be active at a time) + event_name_str = str(dm_state.events[0].name).split('.')[-1] + alignment = rl.GuiTextAlignment.TEXT_ALIGN_RIGHT if self.driver_state_renderer.is_rhd else rl.GuiTextAlignment.TEXT_ALIGN_LEFT + + shadow_rect = rl.Rectangle(rect.x + 2, rect.y + 2, rect.width, rect.height) + gui_label(shadow_rect, event_name_str, font_size=40, font_weight=FontWeight.BOLD, + alignment=alignment, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM, + color=rl.Color(0, 0, 0, 180)) + gui_label(rect, event_name_str, font_size=40, font_weight=FontWeight.BOLD, + alignment=alignment, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM, + color=rl.Color(255, 255, 255, int(255 * 0.9))) + + def _load_eye_textures(self): + """Lazy load eye textures""" + if self._eye_fill_texture is None: + self._eye_fill_texture = gui_app.texture("icons_mici/onroad/eye_fill.png", self._eye_size, self._eye_size) + if self._eye_orange_texture is None: + self._eye_orange_texture = gui_app.texture("icons_mici/onroad/eye_orange.png", self._eye_size, self._eye_size) + if self._glasses_texture is None: + self._glasses_texture = gui_app.texture("icons_mici/onroad/glasses.png", self._glasses_size, self._glasses_size) + + def _draw_face_detection(self, rect: rl.Rectangle): + dm_state = ui_state.sm["driverMonitoringState"] + driver_data = self.driver_state_renderer.get_driver_data() + if not dm_state.faceDetected: + return + + # Get face position and orientation + face_x, face_y = driver_data.facePosition + face_std = max(driver_data.faceOrientationStd[0], driver_data.faceOrientationStd[1]) + alpha = 0.7 + if face_std > 0.15: + alpha = max(0.7 - (face_std - 0.15) * 3.5, 0.0) + + # use approx instead of distort_points + # TODO: replace with distort_points + tici_x = 1080.0 - 1714.0 * face_x + tici_y = -135.0 + (504.0 + abs(face_x) * 112.0) + (1205.0 - abs(face_x) * 724.0) * face_y + + # Tici coords are relative to center, scale offset + offset_x = (tici_x - 1080.0) * 1.25 + offset_y = (tici_y - 540.0) * 1.25 + + # Map to mici screen (scale from 2160x1080 to rect dimensions) + scale_x = rect.width / 2160.0 + scale_y = rect.height / 1080.0 + fbox_x = rect.x + rect.width / 2 + offset_x * scale_x + fbox_y = rect.y + rect.height / 2 + offset_y * scale_y + box_size = 75 + line_thickness = 3 + + line_color = rl.Color(255, 255, 255, int(alpha * 255)) + rl.draw_rectangle_rounded_lines_ex( + rl.Rectangle(fbox_x - box_size / 2, fbox_y - box_size / 2, box_size, box_size), + 35.0 / box_size / 2, + line_thickness, + line_thickness, + line_color, + ) + return driver_data + + def _draw_eyes(self, rect: rl.Rectangle, driver_data): + # Draw eye indicators based on eye probabilities + eye_offset_x = 10 + eye_offset_y = 10 + eye_spacing = self._eye_size + 15 + + left_eye_x = rect.x + eye_offset_x + left_eye_y = rect.y + eye_offset_y + left_eye_prob = driver_data.leftEyeProb + + right_eye_x = rect.x + eye_offset_x + eye_spacing + right_eye_y = rect.y + eye_offset_y + right_eye_prob = driver_data.rightEyeProb + + # Draw eyes with opacity based on probability + for eye_x, eye_y, eye_prob in [(left_eye_x, left_eye_y, left_eye_prob), (right_eye_x, right_eye_y, right_eye_prob)]: + fill_opacity = eye_prob + orange_opacity = 1.0 - eye_prob + + rl.draw_texture_v(self._eye_orange_texture, (eye_x, eye_y), rl.Color(255, 255, 255, int(255 * orange_opacity))) + rl.draw_texture_v(self._eye_fill_texture, (eye_x, eye_y), rl.Color(255, 255, 255, int(255 * fill_opacity))) + + # Draw sunglasses indicator based on sunglasses probability + # Position glasses centered between the two eyes at top left + glasses_x = rect.x + eye_offset_x - 4 + glasses_y = rect.y + glasses_pos = rl.Vector2(glasses_x, glasses_y) + glasses_prob = driver_data.sunglassesProb + rl.draw_texture_v(self._glasses_texture, glasses_pos, rl.Color(70, 80, 161, int(255 * glasses_prob))) + + +if __name__ == "__main__": + gui_app.init_window("Driver Camera View (mici)") + + driver_camera_view = DriverCameraDialog() + try: + for _ in gui_app.render(): + ui_state.update() + driver_camera_view.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + finally: + driver_camera_view.close() diff --git a/iqpilot/selfdrive/ui/mici/onroad/driver_state.py b/iqpilot/selfdrive/ui/mici/onroad/driver_state.py new file mode 100644 index 000000000..95b249bc0 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/driver_state.py @@ -0,0 +1,213 @@ +import pyray as rl +import numpy as np +import math +from iqpilot.cereal import log +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets import Widget +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.monitoring.helpers import face_orientation_from_net + +AlertSize = log.SelfdriveState.AlertSize + +DEBUG = False +ACTIVE_ACCENT = rl.Color(0x0C, 0x94, 0x96, 0xFF) + +LOOKING_CENTER_THRESHOLD_UPPER = math.radians(6) +LOOKING_CENTER_THRESHOLD_LOWER = math.radians(3) + + +class DriverStateRenderer(Widget): + BASE_SIZE = 60 + LINES_ANGLE_INCREMENT = 5 + LINES_STALE_ANGLES = 3.0 # seconds + + def __init__(self, lines: bool = False, inset: bool = False): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, self.BASE_SIZE, self.BASE_SIZE)) + self._lines = lines + self._inset = inset + + # In line mode, track smoothed angles + assert 360 % self.LINES_ANGLE_INCREMENT == 0 + self._head_angles = {i * self.LINES_ANGLE_INCREMENT: FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) for i in range(360 // self.LINES_ANGLE_INCREMENT)} + + self._is_active = False + self._is_rhd = False + self._face_detected = False + self._should_draw = False + self._force_active = False + self._looking_center = False + + self._fade_filter = FirstOrderFilter(0.0, 0.05, 1 / gui_app.target_fps) + self._pitch_filter = FirstOrderFilter(0.0, 0.05, 1 / gui_app.target_fps, initialized=False) + self._yaw_filter = FirstOrderFilter(0.0, 0.05, 1 / gui_app.target_fps, initialized=False) + self._rotation_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps, initialized=False) + self._looking_center_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + + # Load the driver face icons + self.load_icons() + + def load_icons(self): + cone_and_person_size = round(56 / self.BASE_SIZE * self._rect.width) + + if self._inset: + current_inset = (self._rect.width - cone_and_person_size) / 2 + cone_and_person_size = round(cone_and_person_size - current_inset * 2) + + self._dm_person = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_person.png", cone_and_person_size, cone_and_person_size) + self._dm_cone = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_cone.png", cone_and_person_size, cone_and_person_size) + self._dm_background = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_background.png", self._rect.width, self._rect.height) + + def set_should_draw(self, should_draw: bool): + self._should_draw = should_draw + + @property + def should_draw(self): + return (self._should_draw and ui_state.sm["selfdriveState"].alertSize == AlertSize.none and + ui_state.sm.recv_frame["driverStateV2"] > ui_state.started_frame) + + def set_force_active(self, force_active: bool): + """Force the dmoji to always appear active (green) regardless of actual state""" + self._force_active = force_active + + @property + def effective_active(self) -> bool: + """Returns True if dmoji should appear active (either actually active or forced)""" + return bool(self._force_active or self._is_active) + + @property + def is_rhd(self) -> bool: + return self._is_rhd + + def _render(self, _): + if DEBUG: + rl.draw_rectangle_lines_ex(self._rect, 1, rl.RED) + + rl.draw_texture(self._dm_background, + int(self._rect.x), + int(self._rect.y), + rl.Color(255, 255, 255, int(255 * self._fade_filter.x))) + + rl.draw_texture(self._dm_person, + int(self._rect.x + (self._rect.width - self._dm_person.width) / 2), + int(self._rect.y + (self._rect.height - self._dm_person.height) / 2), + rl.Color(255, 255, 255, int(255 * 0.9 * self._fade_filter.x))) + + if self.effective_active: + source_rect = rl.Rectangle(0, 0, self._dm_cone.width, self._dm_cone.height) + dest_rect = rl.Rectangle( + self._rect.x + self._rect.width / 2, + self._rect.y + self._rect.height / 2, + self._dm_cone.width, + self._dm_cone.height, + ) + + if not self._lines: + rl.draw_texture_pro( + self._dm_cone, + source_rect, + dest_rect, + rl.Vector2(dest_rect.width / 2, dest_rect.height / 2), + self._rotation_filter.x - 90, + rl.Color(ACTIVE_ACCENT.r, ACTIVE_ACCENT.g, ACTIVE_ACCENT.b, int(255 * self._fade_filter.x)), + ) + + else: + # remove old angles + for angle, f in self._head_angles.items(): + dst_from_current = ((angle - self._rotation_filter.x) % 360) - 180 + target = 1.0 if abs(dst_from_current) <= self.LINES_ANGLE_INCREMENT * 5 else 0.0 + if not self._face_detected: + target = 0.0 + + # Reduce all line lengths when looking center + if self._looking_center: + target = np.interp(self._looking_center_filter.x, [0.0, 1.0], [target, 0.45]) + + f.update(target) + self._draw_line(angle, f, self._looking_center) + + def _draw_line(self, angle: int, f: FirstOrderFilter, grey: bool): + line_length = self._rect.width / 6 + line_length = round(np.interp(f.x, [0.0, 1.0], [0, line_length])) + line_offset = self._rect.width / 2 - line_length * 2 # ensure line ends within rect + center_x = self._rect.x + self._rect.width / 2 + center_y = self._rect.y + self._rect.height / 2 + start_x = center_x + (line_offset + line_length) * math.cos(math.radians(angle)) + start_y = center_y + (line_offset + line_length) * math.sin(math.radians(angle)) + end_x = start_x + line_length * math.cos(math.radians(angle)) + end_y = start_y + line_length * math.sin(math.radians(angle)) + color = ACTIVE_ACCENT + + if grey: + color = rl.Color(166, 166, 166, 255) + + if f.x > 0.01: + rl.draw_line_ex((start_x, start_y), (end_x, end_y), 12, color) + + def get_driver_data(self): + sm = ui_state.sm + + dm_state = sm["driverMonitoringState"] + self._is_active = dm_state.isActiveMode + self._is_rhd = dm_state.isRHD + self._face_detected = dm_state.faceDetected + + driverstate = sm["driverStateV2"] + driver_data = driverstate.rightDriverData if self._is_rhd else driverstate.leftDriverData + return driver_data + + def _update_state(self): + # Get monitoring state + driver_data = self.get_driver_data() + driver_orient = driver_data.faceOrientation + + if len(driver_orient) != 3: + return + + # Calibrate orientation so looking straight ahead at the road (instead of at the device) reads + # (0, 0), using live calibration. Makes the cone point in the correct direction. (stock PR #37149) + sm = ui_state.sm + if sm.valid['extrinsicsCalibration'] and len(sm['extrinsicsCalibration'].rpyCalib) == 3: + cal_rpy = sm['extrinsicsCalibration'].rpyCalib + else: + cal_rpy = [0.0, 0.0, 0.0] + _, pitch, yaw = face_orientation_from_net(driver_orient, driver_data.facePosition, cal_rpy) + yaw = -yaw # undo sign flip in face_orientation_from_net to match UI convention + + pitch = self._pitch_filter.update(pitch) + yaw = self._yaw_filter.update(yaw) + + # hysteresis on looking center + if abs(pitch) < LOOKING_CENTER_THRESHOLD_LOWER and abs(yaw) < LOOKING_CENTER_THRESHOLD_LOWER: + self._looking_center = True + elif abs(pitch) > LOOKING_CENTER_THRESHOLD_UPPER or abs(yaw) > LOOKING_CENTER_THRESHOLD_UPPER: + self._looking_center = False + self._looking_center_filter.update(1 if self._looking_center else 0) + + if DEBUG: + pitchd = math.degrees(pitch) + yawd = math.degrees(yaw) + + rl.draw_line_ex((0, 100), (200, 100), 3, rl.RED) + rl.draw_line_ex((0, 120), (200, 120), 3, rl.RED) + + pitch_x = 100 + pitchd + yaw_x = 100 + yawd + rl.draw_circle(int(pitch_x), 100, 5, rl.GREEN) + rl.draw_circle(int(yaw_x), 120, 5, rl.GREEN) + + # filter head rotation, handling wrap-around (bias pitch up since calib/DM pose isn't exact, + # and halve yaw sensitivity) + rotation = math.degrees(math.atan2((pitch + math.radians(6)) * 2, yaw)) + angle_diff = rotation - self._rotation_filter.x + angle_diff = ((angle_diff + 180) % 360) - 180 + self._rotation_filter.update(self._rotation_filter.x + angle_diff) + + if not self.should_draw: + self._fade_filter.update(0.0) + elif not self.effective_active: + self._fade_filter.update(0.35) + else: + self._fade_filter.update(1.0) diff --git a/iqpilot/selfdrive/ui/mici/onroad/hud_renderer.py b/iqpilot/selfdrive/ui/mici/onroad/hud_renderer.py new file mode 100644 index 000000000..202dce331 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/hud_renderer.py @@ -0,0 +1,279 @@ +import pyray as rl +from dataclasses import dataclass +from iqpilot.common.constants import CV +from iqpilot.selfdrive.ui.mici.onroad.torque_bar import TorqueBar +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.raylib_compat import draw_circle_gradient +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.cereal import log + +EventName = log.OnroadEvent.EventName + +# Constants +SET_SPEED_NA = 255 +KM_TO_MILE = 0.621371 +CRUISE_DISABLED_CHAR = '–' + +SET_SPEED_PERSISTENCE = 2.5 # seconds + + +@dataclass(frozen=True) +class FontSizes: + current_speed: int = 176 + speed_unit: int = 66 + max_speed: int = 36 + set_speed: int = 112 + + +@dataclass(frozen=True) +class Colors: + WHITE = rl.WHITE + WHITE_TRANSLUCENT = rl.Color(255, 255, 255, 200) + + +FONT_SIZES = FontSizes() +COLORS = Colors() + + +class TurnIntent(Widget): + FADE_IN_ANGLE = 30 # degrees + + def __init__(self): + super().__init__() + self._pre = False + self._turn_intent_direction: int = 0 + + self._turn_intent_alpha_filter = FirstOrderFilter(0, 0.05, 1 / gui_app.target_fps) + self._turn_intent_rotation_filter = FirstOrderFilter(0, 0.1, 1 / gui_app.target_fps) + + self._txt_turn_intent_left: rl.Texture = gui_app.texture('icons_mici/turn_intent_left.png', 50, 20) + self._txt_turn_intent_right: rl.Texture = gui_app.texture('icons_mici/turn_intent_right.png', 50, 20) + + def _render(self, _): + if self._turn_intent_alpha_filter.x > 1e-2: + turn_intent_texture = self._txt_turn_intent_right if self._turn_intent_direction == 1 else self._txt_turn_intent_left + src_rect = rl.Rectangle(0, 0, turn_intent_texture.width, turn_intent_texture.height) + dest_rect = rl.Rectangle(self._rect.x + self._rect.width / 2, self._rect.y + self._rect.height / 2, + turn_intent_texture.width, turn_intent_texture.height) + + origin = (turn_intent_texture.width / 2, self._rect.height / 2) + color = rl.Color(255, 255, 255, int(255 * self._turn_intent_alpha_filter.x)) + rl.draw_texture_pro(turn_intent_texture, src_rect, dest_rect, origin, self._turn_intent_rotation_filter.x, color) + + def _update_state(self) -> None: + sm = ui_state.sm + + left = any(e.name == EventName.preLaneChangeLeft for e in sm['onroadEvents']) + right = any(e.name == EventName.preLaneChangeRight for e in sm['onroadEvents']) + if left or right: + # pre lane change + if not self._pre: + self._turn_intent_rotation_filter.x = self.FADE_IN_ANGLE if left else -self.FADE_IN_ANGLE + + self._pre = True + self._turn_intent_direction = -1 if left else 1 + self._turn_intent_alpha_filter.update(1) + self._turn_intent_rotation_filter.update(0) + elif any(e.name == EventName.laneChange for e in sm['onroadEvents']): + # fade out and rotate away + self._pre = False + self._turn_intent_alpha_filter.update(0) + + if self._turn_intent_direction == 0: + # unknown. missed pre frame? + self._turn_intent_rotation_filter.update(0) + else: + self._turn_intent_rotation_filter.update(self._turn_intent_direction * self.FADE_IN_ANGLE) + else: + # didn't complete lane change, just hide + self._pre = False + self._turn_intent_direction = 0 + self._turn_intent_alpha_filter.update(0) + self._turn_intent_rotation_filter.update(0) + + +class HudRenderer(Widget): + def __init__(self): + super().__init__() + """Initialize the HUD renderer.""" + self.is_cruise_set: bool = False + self.is_cruise_available: bool = True + self.set_speed: float = SET_SPEED_NA + self._set_speed_changed_time: float = 0 + self.speed: float = 0.0 + self.v_ego_cluster_seen: bool = False + self._engaged: bool = False + + self._can_draw_top_icons = True + self._show_wheel_critical = False + + self._font_bold: rl.Font = gui_app.font(FontWeight.BOLD) + self._font_medium: rl.Font = gui_app.font(FontWeight.MEDIUM) + self._font_semi_bold: rl.Font = gui_app.font(FontWeight.SEMI_BOLD) + self._font_display: rl.Font = gui_app.font(FontWeight.DISPLAY) + + self._turn_intent = TurnIntent() + self._torque_bar = TorqueBar() + + self._txt_wheel: rl.Texture = gui_app.texture('icons_mici/wheel.png', 50, 50) + self._txt_wheel_critical: rl.Texture = gui_app.texture('icons_mici/wheel_critical.png', 50, 50) + self._txt_exclamation_point: rl.Texture = gui_app.texture('icons_mici/exclamation_point.png', 44, 44) + + self._wheel_alpha_filter = FirstOrderFilter(0, 0.05, 1 / gui_app.target_fps) + self._wheel_y_filter = FirstOrderFilter(0, 0.1, 1 / gui_app.target_fps) + + self._set_speed_alpha_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + + def set_wheel_critical_icon(self, critical: bool): + """Set the wheel icon to critical or normal state.""" + self._show_wheel_critical = critical + + def set_can_draw_top_icons(self, can_draw_top_icons: bool): + """Set whether to draw the top part of the HUD.""" + self._can_draw_top_icons = can_draw_top_icons + + def drawing_top_icons(self) -> bool: + # whether we're drawing any top icons currently + return bool(self._set_speed_alpha_filter.x > 1e-2) + + def _update_state(self) -> None: + """Update HUD state based on car state and controls state.""" + sm = ui_state.sm + if sm.recv_frame["carState"] < ui_state.started_frame: + self.is_cruise_set = False + self.set_speed = SET_SPEED_NA + self.speed = 0.0 + return + + controls_state = sm['controlsState'] + car_state = sm['carState'] + + v_cruise_cluster = car_state.vCruiseCluster + set_speed = ( + controls_state.vCruiseDEPRECATED if v_cruise_cluster == 0.0 else v_cruise_cluster + ) + engaged = sm['selfdriveState'].enabled + if (set_speed != self.set_speed and engaged) or (engaged and not self._engaged): + self._set_speed_changed_time = rl.get_time() + self._engaged = engaged + self.set_speed = set_speed + self.is_cruise_set = 0 < self.set_speed < SET_SPEED_NA + self.is_cruise_available = self.set_speed != -1 + + v_ego_cluster = car_state.vEgoCluster + self.v_ego_cluster_seen = self.v_ego_cluster_seen or v_ego_cluster != 0.0 + v_ego = v_ego_cluster if self.v_ego_cluster_seen else car_state.vEgo + speed_conversion = CV.MS_TO_KPH if ui_state.is_metric else CV.MS_TO_MPH + self.speed = max(0.0, v_ego * speed_conversion) + + def _render(self, rect: rl.Rectangle) -> None: + """Render HUD elements to the screen.""" + + self._torque_bar.render(rect) + + if self.is_cruise_set: + self._draw_set_speed(rect) + + self._draw_steering_wheel(rect) + + def _draw_steering_wheel(self, rect: rl.Rectangle) -> None: + wheel_txt = self._txt_wheel_critical if self._show_wheel_critical else self._txt_wheel + + bsm_detected = self._has_blind_spot_detected() if gui_app.iqpilot_ui() else False + + if self._show_wheel_critical: + self._wheel_alpha_filter.update(255) + self._wheel_y_filter.update(0) + else: + if ui_state.status == UIStatus.DISENGAGED or bsm_detected: + self._wheel_alpha_filter.update(0) + self._wheel_y_filter.update(wheel_txt.height / 2) + else: + self._wheel_alpha_filter.update(255 * 0.9) + self._wheel_y_filter.update(0) + + # pos + pos_x = int(rect.x + 21 + wheel_txt.width / 2) + pos_y = int(rect.y + rect.height - 14 - wheel_txt.height / 2 + self._wheel_y_filter.x) + rotation = -ui_state.sm['carState'].steeringAngleDeg + + turn_intent_margin = 25 + self._turn_intent.render(rl.Rectangle( + pos_x - wheel_txt.width / 2 - turn_intent_margin, + pos_y - wheel_txt.height / 2 - turn_intent_margin, + wheel_txt.width + turn_intent_margin * 2, + wheel_txt.height + turn_intent_margin * 2, + )) + + src_rect = rl.Rectangle(0, 0, wheel_txt.width, wheel_txt.height) + dest_rect = rl.Rectangle(pos_x, pos_y, wheel_txt.width, wheel_txt.height) + origin = (wheel_txt.width / 2, wheel_txt.height / 2) + + # color and draw + color = rl.Color(255, 255, 255, int(self._wheel_alpha_filter.x)) + rl.draw_texture_pro(wheel_txt, src_rect, dest_rect, origin, rotation, color) + + if self._show_wheel_critical: + # Draw exclamation point icon + EXCLAMATION_POINT_SPACING = 10 + exclamation_pos_x = pos_x - self._txt_exclamation_point.width / 2 + wheel_txt.width / 2 + EXCLAMATION_POINT_SPACING + exclamation_pos_y = pos_y - self._txt_exclamation_point.height / 2 + rl.draw_texture(self._txt_exclamation_point, int(exclamation_pos_x), int(exclamation_pos_y), rl.WHITE) + + def _draw_set_speed(self, rect: rl.Rectangle) -> None: + """Draw the MAX speed indicator box.""" + alpha = self._set_speed_alpha_filter.update(0 < rl.get_time() - self._set_speed_changed_time < SET_SPEED_PERSISTENCE and + self._can_draw_top_icons and self._engaged) + if alpha < 1e-2: + return + + x = rect.x + y = rect.y + + # draw drop shadow + circle_radius = 162 // 2 + draw_circle_gradient(int(x + circle_radius), int(y + circle_radius), circle_radius, + rl.Color(0, 0, 0, int(255 / 2 * alpha)), rl.BLANK) + + set_speed_color = rl.Color(255, 255, 255, int(255 * 0.9 * alpha)) + max_color = rl.Color(255, 255, 255, int(255 * 0.9 * alpha)) + + set_speed = self.set_speed + if self.is_cruise_set and not ui_state.is_metric: + set_speed *= KM_TO_MILE + + set_speed_text = CRUISE_DISABLED_CHAR if not self.is_cruise_set else str(round(set_speed)) + rl.draw_text_ex( + self._font_display, + set_speed_text, + rl.Vector2(x + 13 + 4, y + 3 - 8 - 3 + 4), + FONT_SIZES.set_speed, + 0, + set_speed_color, + ) + + max_text = tr("MAX") + rl.draw_text_ex( + self._font_semi_bold, + max_text, + rl.Vector2(x + 25, y + FONT_SIZES.set_speed - 7 + 4), + FONT_SIZES.max_speed, + 0, + max_color, + ) + + def _draw_current_speed(self, rect: rl.Rectangle) -> None: + """Draw the current vehicle speed and unit.""" + speed_text = str(round(self.speed)) + speed_text_size = measure_text_cached(self._font_bold, speed_text, FONT_SIZES.current_speed) + speed_pos = rl.Vector2(rect.x + rect.width / 2 - speed_text_size.x / 2, 180 - speed_text_size.y / 2) + rl.draw_text_ex(self._font_bold, speed_text, speed_pos, FONT_SIZES.current_speed, 0, COLORS.WHITE) + + unit_text = tr("km/h") if ui_state.is_metric else tr("mph") + unit_text_size = measure_text_cached(self._font_medium, unit_text, FONT_SIZES.speed_unit) + unit_pos = rl.Vector2(rect.x + rect.width / 2 - unit_text_size.x / 2, 290 - unit_text_size.y / 2) + rl.draw_text_ex(self._font_medium, unit_text, unit_pos, FONT_SIZES.speed_unit, 0, COLORS.WHITE_TRANSLUCENT) diff --git a/iqpilot/selfdrive/ui/mici/onroad/model_renderer.py b/iqpilot/selfdrive/ui/mici/onroad/model_renderer.py new file mode 100644 index 000000000..b4169be20 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/model_renderer.py @@ -0,0 +1,501 @@ +import colorsys +import numpy as np +import pyray as rl +from iqpilot.cereal import car +from dataclasses import dataclass, field +from iqpilot.common.params import Params +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.selfdrive.locationd.calibrationd import HEIGHT_INIT +from iqpilot.ui.onroad.hud_overlays import ChevronMetrics +from iqpilot.ui.onroad.lead_confidence import driving_confidence +from iqpilot.selfdrive.locationd.calibration_helpers import get_render_path_height +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus, log_param_from_bytes +from iqpilot.selfdrive.ui.mici.onroad import blend_colors +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.shader_polygon import draw_polygon, Gradient +from iqpilot.system.ui.widgets import Widget + +CLIP_MARGIN = 500 +MIN_DRAW_DISTANCE = 10.0 +MAX_DRAW_DISTANCE = 100.0 + +THROTTLE_COLORS = [ + rl.Color(13, 248, 122, 102), # HSLF(148/360, 0.94, 0.51, 0.4) + rl.Color(114, 255, 92, 89), # HSLF(112/360, 1.0, 0.68, 0.35) + rl.Color(114, 255, 92, 0), # HSLF(112/360, 1.0, 0.68, 0.0) +] + +NO_THROTTLE_COLORS = [ + rl.Color(242, 242, 242, 102), # HSLF(148/360, 0.0, 0.95, 0.4) + rl.Color(242, 242, 242, 89), # HSLF(112/360, 0.0, 0.95, 0.35) + rl.Color(242, 242, 242, 0), # HSLF(112/360, 0.0, 0.95, 0.0) +] + +LANE_LINE_COLORS = { + UIStatus.DISENGAGED: rl.Color(200, 200, 200, 255), + UIStatus.OVERRIDE: rl.Color(255, 255, 255, 255), + UIStatus.ENGAGED: rl.Color(0, 255, 64, 255), +} + + +@dataclass +class ModelPoints: + raw_points: np.ndarray = field(default_factory=lambda: np.empty((0, 3), dtype=np.float32)) + projected_points: np.ndarray = field(default_factory=lambda: np.empty((0, 2), dtype=np.float32)) + + +@dataclass +class LeadVehicle: + center: tuple[float, float] | None = None + radius: float = 0.0 + sz: float = 0.0 + fill_alpha: int = 0 + + +class ModelRenderer(Widget): + def __init__(self): + super().__init__() + self.chevron_metrics = ChevronMetrics() + self._lead_orb = gui_app.texture("icons/lead_orb.png", 256, 256) + self._longitudinal_control = False + self._experimental_mode = False + self._blend_filter = FirstOrderFilter(1.0, 0.25, 1 / gui_app.target_fps) + self._prev_allow_throttle = True + self._lane_line_probs = np.zeros(4, dtype=np.float32) + self._road_edge_stds = np.zeros(2, dtype=np.float32) + self._lead_vehicles = [LeadVehicle(), LeadVehicle()] + self._path_offset_z = HEIGHT_INIT[0] + + # Initialize ModelPoints objects + self._path = ModelPoints() + self._lane_lines = [ModelPoints() for _ in range(4)] + self._road_edges = [ModelPoints() for _ in range(2)] + self._acceleration_x = np.empty((0,), dtype=np.float32) + + self._acceleration_x_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + self._acceleration_x_filter2 = FirstOrderFilter(0.0, 1, 1 / gui_app.target_fps) + + self._torque_filter = FirstOrderFilter(0, 0.1, 1 / gui_app.target_fps) + self._ll_color_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + + # Transform matrix (3x3 for car space to screen space) + self._car_space_transform = np.zeros((3, 3), dtype=np.float32) + self._transform_dirty = True + self._clip_region = None + + self._counter = -1 + self._camera_offset = ui_state.params.get("CameraOffset", return_default=True) if ui_state.active_bundle else 0.0 + + self._exp_gradient = Gradient( + start=(0.0, 1.0), # Bottom of path + end=(0.0, 0.0), # Top of path + colors=[], + stops=[], + ) + + # Get longitudinal control setting from car parameters + if (cp := log_param_from_bytes(Params(), "CarParams", car.CarParams)) is not None: + self._longitudinal_control = cp.openpilotLongitudinalControl + + def set_transform(self, transform: np.ndarray): + self._car_space_transform = transform.astype(np.float32) + self._transform_dirty = True + + def _render(self, rect: rl.Rectangle): + sm = ui_state.sm + driving_confidence.update() + + if self._counter % 180 == 0: # This runs at 60fps, so we query every 3 seconds + self._camera_offset = ui_state.params.get("CameraOffset", return_default=True) if ui_state.active_bundle else 0.0 + self._counter += 1 + + self._torque_filter.update(-ui_state.sm['carOutput'].actuatorsOutput.torque) + + # Check if data is up-to-date + if (sm.recv_frame["extrinsicsCalibration"] < ui_state.started_frame or + sm.recv_frame["modelV2"] < ui_state.started_frame): + return + + # Set up clipping region + self._clip_region = rl.Rectangle( + rect.x - CLIP_MARGIN, rect.y - CLIP_MARGIN, rect.width + 2 * CLIP_MARGIN, rect.height + 2 * CLIP_MARGIN + ) + + # Update state + self._experimental_mode = sm['selfdriveState'].experimentalMode + + live_calib = sm['extrinsicsCalibration'] + self._path_offset_z = get_render_path_height(live_calib) + + if sm.updated['carParams']: + self._longitudinal_control = sm['carParams'].openpilotLongitudinalControl + + model = sm['modelV2'] + radar_state = sm['radarState'] if sm.valid['radarState'] else None + lead_one = radar_state.leadOne if radar_state else None + render_lead_indicator = self._longitudinal_control and radar_state is not None + + # Update model data when needed + model_updated = sm.updated['modelV2'] + if model_updated or sm.updated['radarState'] or self._transform_dirty: + if model_updated: + self._update_raw_points(model) + + path_x_array = self._path.raw_points[:, 0] + if path_x_array.size == 0: + return + + self._update_model(lead_one, path_x_array) + if render_lead_indicator: + self._update_leads(radar_state, path_x_array) + self._transform_dirty = False + + # Draw elements (hide when disengaged) + if ui_state.status != UIStatus.DISENGAGED: + self._draw_lane_lines() + self._draw_path(sm) + + if render_lead_indicator and radar_state: + self._draw_lead_indicator() + self.chevron_metrics.draw_lead_status(sm, radar_state, self._rect, self._lead_vehicles) + + def _update_raw_points(self, model): + """Update raw 3D points from model data""" + self._path.raw_points = np.array([model.position.x, np.array(model.position.y) + self._camera_offset, model.position.z], dtype=np.float32).T + + for i, lane_line in enumerate(model.laneLines): + self._lane_lines[i].raw_points = np.array([lane_line.x, np.array(lane_line.y) + self._camera_offset, lane_line.z], dtype=np.float32).T + + for i, road_edge in enumerate(model.roadEdges): + self._road_edges[i].raw_points = np.array([road_edge.x, np.array(road_edge.y) + self._camera_offset, road_edge.z], dtype=np.float32).T + + self._lane_line_probs = np.array(model.laneLineProbs, dtype=np.float32) + self._road_edge_stds = np.array(model.roadEdgeStds, dtype=np.float32) + self._acceleration_x = np.array(model.acceleration.x, dtype=np.float32) + + def _update_leads(self, radar_state, path_x_array): + """Update positions of lead vehicles""" + self._lead_vehicles = [LeadVehicle(), LeadVehicle()] + leads = [radar_state.leadOne, radar_state.leadTwo] + + for i, lead_data in enumerate(leads): + if lead_data and lead_data.status: + d_rel, y_rel, v_rel = lead_data.dRel, lead_data.yRel, lead_data.vRel + idx = self._get_path_length_idx(path_x_array, d_rel) + + # Get z-coordinate from path at the lead vehicle position + z = self._path.raw_points[idx, 2] if idx < len(self._path.raw_points) else 0.0 + point = self._map_to_screen(d_rel, -y_rel + self._camera_offset, z + self._path_offset_z) + if point: + self._lead_vehicles[i] = self._update_lead_vehicle(d_rel, v_rel, point, self._rect) + + def _update_model(self, lead, path_x_array): + """Update model visualization data based on model message""" + max_distance = np.clip(path_x_array[-1], MIN_DRAW_DISTANCE, MAX_DRAW_DISTANCE) + max_idx = self._get_path_length_idx(self._lane_lines[0].raw_points[:, 0], max_distance) + + # Update lane lines using raw points + line_width_factor = 0.12 + for i, lane_line in enumerate(self._lane_lines): + if i in (1, 2): + line_width_factor = 0.16 + lane_line.projected_points = self._map_line_to_polygon( + lane_line.raw_points, line_width_factor * self._lane_line_probs[i], 0.0, max_idx + ) + + # Update road edges using raw points + for road_edge in self._road_edges: + road_edge.projected_points = self._map_line_to_polygon(road_edge.raw_points, line_width_factor, 0.0, max_idx) + + # Update path using raw points + if lead and lead.status: + lead_d = lead.dRel * 2.0 + max_distance = np.clip(lead_d - min(lead_d * 0.35, 10.0), 0.0, max_distance) + + soon_acceleration = self._acceleration_x[len(self._acceleration_x) // 4] if len(self._acceleration_x) > 0 else 0 + self._acceleration_x_filter.update(soon_acceleration) + self._acceleration_x_filter2.update(soon_acceleration) + + # make path width wider/thinner when initially braking/accelerating + if self._experimental_mode and False: + high_pass_acceleration = self._acceleration_x_filter.x - self._acceleration_x_filter2.x + y_off = np.interp(high_pass_acceleration, [-1, 0, 1], [0.9 * 2, 0.9, 0.9 / 2]) + else: + y_off = 0.9 + + max_idx = self._get_path_length_idx(path_x_array, max_distance) + self._path.projected_points = self._map_line_to_polygon( + self._path.raw_points, y_off, self._path_offset_z, max_idx, allow_invert=False + ) + + self._update_experimental_gradient() + + def _update_experimental_gradient(self): + """Pre-calculate experimental mode gradient colors""" + if not self._experimental_mode: + return + + # reconstruct absolute (screen) points so the rect-space cull below stays correct + path_pts = self._path.projected_points + np.array([self._rect.x, self._rect.y], dtype=np.float32) + max_len = min(len(path_pts) // 2, len(self._acceleration_x)) + + segment_colors = [] + gradient_stops = [] + + i = 0 + while i < max_len: + # Some points (screen space) are out of frame (rect space) + track_y = path_pts[i][1] + if track_y < self._rect.y or track_y > (self._rect.y + self._rect.height): + i += 1 + continue + + # Calculate color based on acceleration (0 is bottom, 1 is top) + lin_grad_point = 1 - (track_y - self._rect.y) / self._rect.height + + # speed up: 120, slow down: 0 + path_hue = np.clip(60 + self._acceleration_x[i] * 35, 0, 120) + + saturation = min(abs(self._acceleration_x[i] * 1.5), 1) + lightness = np.interp(saturation, [0.0, 1.0], [0.95, 0.62]) + alpha = np.interp(lin_grad_point, [0.75 / 2.0, 0.75], [0.4, 0.0]) + + # Use HSL to RGB conversion + color = self._hsla_to_color(path_hue / 360.0, saturation, lightness, alpha) + + gradient_stops.append(lin_grad_point) + segment_colors.append(color) + + # Skip a point, unless next is last + i += 1 + (1 if (i + 2) < max_len else 0) + + # Store the gradient in the path object + self._exp_gradient.colors = segment_colors + self._exp_gradient.stops = gradient_stops + + def _update_lead_vehicle(self, d_rel, v_rel, point, rect): + speed_buff, lead_buff = 10.0, 40.0 + + # Calculate fill alpha + fill_alpha = 0 + if d_rel < lead_buff: + fill_alpha = 255 * (1.0 - (d_rel / lead_buff)) + if v_rel < 0: + fill_alpha += 255 * (-1 * (v_rel / speed_buff)) + fill_alpha = min(fill_alpha, 255) + + # Calculate size and position. Distance-scaled orb radius (closer lead -> bigger orb). + sz = np.clip((25 * 30) / (d_rel / 3 + 30), 15.0, 30.0) * 1 + radius = sz * 1.1 + # point is in absolute screen coords; clamp against the rect's absolute bounds so the orb stays + # fully on-screen (rect-relative bounds mis-placed it when the camera pane is offset, e.g. split nav) + x = np.clip(point[0], rect.x + radius, rect.x + rect.width - radius) + y = np.clip(point[1], rect.y + radius, rect.y + rect.height - radius) + + return LeadVehicle(center=(float(x), float(y)), radius=float(radius), sz=float(sz), fill_alpha=int(fill_alpha)) + + def _get_ll_color(self, prob: float, adjacent: bool, left: bool): + alpha = np.clip(prob, 0.0, 0.7) + if adjacent: + _base_color = LANE_LINE_COLORS.get(ui_state.status, LANE_LINE_COLORS[UIStatus.DISENGAGED]) + color = rl.Color(_base_color.r, _base_color.g, _base_color.b, int(alpha * 255)) + + # turn adjacent lls orange if torque is high + torque = self._torque_filter.x + high_torque = abs(torque) > 0.6 + if high_torque and (left == (torque > 0)): + color = blend_colors( + color, + rl.Color(255, 115, 0, int(alpha * 255)), # orange + np.interp(abs(torque), [0.6, 0.8], [0.0, 1.0]) + ) + else: + color = rl.Color(255, 255, 255, int(alpha * 255)) + + if ui_state.status == UIStatus.DISENGAGED: + color = rl.Color(0, 0, 0, int(alpha * 255)) + + return color + + def _draw_lane_lines(self): + """Draw lane lines and road edges""" + """Two closest lines should be green (lane line or road edges)""" + # projected_points are origin-relative (rect.x/y kept out of the transform so it stays cached); + # translate to the view's screen position here. + offset = np.array([self._rect.x, self._rect.y], dtype=np.float32) + for i, lane_line in enumerate(self._lane_lines): + if lane_line.projected_points.size == 0: + continue + + color = self._get_ll_color(float(self._lane_line_probs[i]), i in (1, 2), i in (0, 1)) + draw_polygon(self._rect, lane_line.projected_points + offset, color) + + for i, road_edge in enumerate(self._road_edges): + if road_edge.projected_points.size == 0: + continue + + # if closest lane lines are not confident, make road edges green + color = self._get_ll_color(float(1.0 - self._road_edge_stds[i]), float(self._lane_line_probs[i + 1]) < 0.25, i == 0) + draw_polygon(self._rect, road_edge.projected_points + offset, color) + + def _draw_path(self, sm): + """Draw path with dynamic coloring based on mode and throttle state.""" + if not self._path.projected_points.size: + return + + # projected_points are origin-relative; translate to the view's screen position + path_pts = self._path.projected_points + np.array([self._rect.x, self._rect.y], dtype=np.float32) + + allow_throttle = sm['longitudinalPlan'].allowThrottle or not self._longitudinal_control + self._blend_filter.update(int(allow_throttle)) + + if self._experimental_mode: + # Draw with acceleration coloring + if ui_state.status == UIStatus.DISENGAGED: + draw_polygon(self._rect, path_pts, rl.Color(0, 0, 0, 90)) + elif len(self._exp_gradient.colors) > 1: + draw_polygon(self._rect, path_pts, gradient=self._exp_gradient) + else: + draw_polygon(self._rect, path_pts, rl.Color(255, 255, 255, 30)) + else: + # Blend throttle/no throttle colors based on transition + blend_factor = round(self._blend_filter.x * 100) / 100 + blended_colors = self._blend_colors(NO_THROTTLE_COLORS, THROTTLE_COLORS, blend_factor) + gradient = Gradient( + start=(0.0, 1.0), # Bottom of path + end=(0.0, 0.0), # Top of path + colors=blended_colors, + stops=[0.0, 0.5, 1.0], + ) + + if ui_state.status == UIStatus.DISENGAGED: + draw_polygon(self._rect, path_pts, rl.Color(0, 0, 0, 90)) + else: + draw_polygon(self._rect, path_pts, gradient=gradient) + + def _draw_lead_indicator(self): + tint, _ = driving_confidence.colors() + src = rl.Rectangle(0, 0, self._lead_orb.width, self._lead_orb.height) + for lead in self._lead_vehicles: + if lead.center is None: + continue + cx, cy = lead.center + r = lead.radius + alpha = int(np.clip(140 + 115 * (lead.fill_alpha / 255.0), 0, 255)) + dest = rl.Rectangle(cx, cy, r * 2.0, r * 2.0) + rl.draw_texture_pro(self._lead_orb, src, dest, rl.Vector2(r, r), 0.0, rl.Color(tint.r, tint.g, tint.b, alpha)) + + @staticmethod + def _get_path_length_idx(pos_x_array: np.ndarray, path_height: float) -> int: + """Get the index corresponding to the given path height""" + if len(pos_x_array) == 0: + return 0 + indices = np.where(pos_x_array <= path_height)[0] + return indices[-1] if indices.size > 0 else 0 + + def _map_to_screen(self, in_x, in_y, in_z): + """Project a point in car space to screen space""" + input_pt = np.array([in_x, in_y, in_z]) + pt = self._car_space_transform @ input_pt + + if abs(pt[2]) < 1e-6: + return None + + x, y = pt[0] / pt[2], pt[1] / pt[2] + + clip = self._clip_region + if not (clip.x <= x <= clip.x + clip.width and clip.y <= y <= clip.y + clip.height): + return None + + return (x, y) + + def _map_line_to_polygon(self, line: np.ndarray, y_off: float, z_off: float, max_idx: int, allow_invert: bool = True) -> np.ndarray: + """Convert 3D line to 2D polygon for rendering.""" + if line.shape[0] == 0: + return np.empty((0, 2), dtype=np.float32) + + # Slice points and filter non-negative x-coordinates + points = line[:max_idx + 1] + points = points[points[:, 0] >= 0] + if points.shape[0] == 0: + return np.empty((0, 2), dtype=np.float32) + + N = points.shape[0] + # Generate left and right 3D points in one array using broadcasting + offsets = np.array([[0, -y_off, z_off], [0, y_off, z_off]], dtype=np.float32) + points_3d = points[None, :, :] + offsets[:, None, :] # Shape: 2xNx3 + points_3d = points_3d.reshape(2 * N, 3) # Shape: (2*N)x3 + + # Transform all points to projected space in one operation + proj = self._car_space_transform @ points_3d.T # Shape: 3x(2*N) + proj = proj.reshape(3, 2, N) + left_proj = proj[:, 0, :] + right_proj = proj[:, 1, :] + + # Filter points where z is sufficiently large + valid_proj = (np.abs(left_proj[2]) >= 1e-6) & (np.abs(right_proj[2]) >= 1e-6) + if not np.any(valid_proj): + return np.empty((0, 2), dtype=np.float32) + + # Compute screen coordinates + left_screen = left_proj[:2, valid_proj] / left_proj[2, valid_proj][None, :] + right_screen = right_proj[:2, valid_proj] / right_proj[2, valid_proj][None, :] + + # Define clip region bounds + clip = self._clip_region + x_min, x_max = clip.x, clip.x + clip.width + y_min, y_max = clip.y, clip.y + clip.height + + # Filter points within clip region + left_in_clip = ( + (left_screen[0] >= x_min) & (left_screen[0] <= x_max) & + (left_screen[1] >= y_min) & (left_screen[1] <= y_max) + ) + right_in_clip = ( + (right_screen[0] >= x_min) & (right_screen[0] <= x_max) & + (right_screen[1] >= y_min) & (right_screen[1] <= y_max) + ) + both_in_clip = left_in_clip & right_in_clip + + if not np.any(both_in_clip): + return np.empty((0, 2), dtype=np.float32) + + # Select valid and clipped points + left_screen = left_screen[:, both_in_clip] + right_screen = right_screen[:, both_in_clip] + + # Handle Y-coordinate inversion on hills + if not allow_invert and left_screen.shape[1] > 1: + y = left_screen[1, :] # y-coordinates + keep = y == np.minimum.accumulate(y) + if not np.any(keep): + return np.empty((0, 2), dtype=np.float32) + left_screen = left_screen[:, keep] + right_screen = right_screen[:, keep] + + return np.vstack((left_screen.T, right_screen[:, ::-1].T)).astype(np.float32) + + @staticmethod + def _hsla_to_color(h, s, l, a): + rgb = colorsys.hls_to_rgb(h, l, s) + return rl.Color( + int(rgb[0] * 255), + int(rgb[1] * 255), + int(rgb[2] * 255), + int(a * 255) + ) + + @staticmethod + def _blend_colors(begin_colors, end_colors, t): + if t >= 1.0: + return end_colors + if t <= 0.0: + return begin_colors + + inv_t = 1.0 - t + return [rl.Color( + int(inv_t * start.r + t * end.r), + int(inv_t * start.g + t * end.g), + int(inv_t * start.b + t * end.b), + int(inv_t * start.a + t * end.a) + ) for start, end in zip(begin_colors, end_colors, strict=True)] diff --git a/iqpilot/selfdrive/ui/mici/onroad/torque_bar.py b/iqpilot/selfdrive/ui/mici/onroad/torque_bar.py new file mode 100644 index 000000000..3ba2f9690 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/onroad/torque_bar.py @@ -0,0 +1,270 @@ +import math +import time +from functools import wraps +from collections import OrderedDict + +import numpy as np +import pyray as rl +from iqpilot.selfdrive.ui.mici.onroad import blend_colors +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.shader_polygon import draw_polygon, Gradient +from iqpilot.system.ui.widgets import Widget +from iqpilot.common.filter_simple import FirstOrderFilter + +# TODO: arc_bar_pts doesn't consider rounded end caps part of the angle span +TORQUE_ANGLE_SPAN = 12.7 +ANGLE_ARC_MAX_DEG = 45.0 +TORQUE_REST_OFFSET = 22 +TORQUE_REST_HEIGHT = 14 + +DEBUG = False + + +def quantized_lru_cache(maxsize=128): + def decorator(func): + cache = OrderedDict() + @wraps(func) + def wrapper(r_mid, thickness, a0_deg, a1_deg, **kwargs): + # Quantize inputs: balanced for smoothness vs cache effectiveness. The arc is computed at + # the origin and translated at the call site, so cx/cy are NOT part of the key — that keeps + # the cache hot while the bar translates during a scroll/transition (stock PR #37946). + key = (round(r_mid), + round(thickness), # 1px precision for smoother height transitions + round(a0_deg * 10) / 10, # 0.1° precision for smoother angle transitions + round(a1_deg * 10) / 10, + tuple(sorted(kwargs.items()))) + + if key in cache: + cache.move_to_end(key) + else: + if len(cache) >= maxsize: + cache.popitem(last=False) + + result = func(r_mid, thickness, a0_deg, a1_deg, **kwargs) + cache[key] = result + return cache[key] + return wrapper + return decorator + + +@quantized_lru_cache(maxsize=256) +def arc_bar_pts(r_mid: float, thickness: float, + a0_deg: float, a1_deg: float, + *, max_points: int = 100, cap_segs: int = 10, + cap_radius: float = 7, px_per_seg: float = 2.0) -> np.ndarray: + """Return Nx2 np.float32 points for a single closed polygon (rounded thick arc), centered at origin. + The caller translates the returned points by (cx, cy) so this can stay cached while the bar moves.""" + + def get_cap(left: bool, a_deg: float): + # end cap at a1: center (a1), sweep a1→a1+180 (skip endpoints to avoid dupes) + # quarter arc (outer corner) at a1 with fixed pixel radius cap_radius + + nx, ny = math.cos(math.radians(a_deg)), math.sin(math.radians(a_deg)) # outward normal + tx, ty = -ny, nx # tangent (CCW) + + mx, my = nx * r_mid, ny * r_mid # mid-point at a1 (origin-centered) + if DEBUG: + rl.draw_circle(int(mx), int(my), 4, rl.PURPLE) + + ex = mx + nx * (half - cap_radius) + ey = my + ny * (half - cap_radius) + + if DEBUG: + rl.draw_circle(int(ex), int(ey), 2, rl.WHITE) + + # sweep 90° in the local (t,n) frame: from outer edge toward inside + if not left: + alpha = np.deg2rad(np.linspace(90, 0, cap_segs + 2))[1:-1] + else: + alpha = np.deg2rad(np.linspace(180, 90, cap_segs + 2))[1:-1] + cap_end = np.c_[ex + np.cos(alpha) * cap_radius * tx + np.sin(alpha) * cap_radius * nx, + ey + np.cos(alpha) * cap_radius * ty + np.sin(alpha) * cap_radius * ny] + + # bottom quarter (inner corner) at a1 + ex2 = mx + nx * (-half + cap_radius) + ey2 = my + ny * (-half + cap_radius) + if DEBUG: + rl.draw_circle(int(ex2), int(ey2), 2, rl.WHITE) + + if not left: + alpha2 = np.deg2rad(np.linspace(0, -90, cap_segs + 1))[:-1] # include 0 once, exclude -90 + else: + alpha2 = np.deg2rad(np.linspace(90 - 90 - 90, 0 - 90 - 90, cap_segs + 1))[:-1] + cap_end_bot = np.c_[ex2 + np.cos(alpha2) * cap_radius * tx + np.sin(alpha2) * cap_radius * nx, + ey2 + np.cos(alpha2) * cap_radius * ty + np.sin(alpha2) * cap_radius * ny] + + # append to the top quarter + if not left: + cap_end = np.vstack((cap_end, cap_end_bot)) + else: + cap_end = np.vstack((cap_end_bot, cap_end)) + + return cap_end + + if a1_deg < a0_deg: + a0_deg, a1_deg = a1_deg, a0_deg + half = thickness * 0.5 + + cap_radius = min(cap_radius, half) + + span = max(1e-3, a1_deg - a0_deg) + + # pick arc segment count from arc length, clamp to shader points[] budget + arc_len = r_mid * math.radians(span) + arc_segs = max(6, int(arc_len / px_per_seg)) + max_arc = (max_points - (4 * cap_segs + 3)) // 2 + arc_segs = max(6, min(arc_segs, max_arc)) + + # outer arc a0→a1 + ang_o = np.deg2rad(np.linspace(a0_deg, a1_deg, arc_segs + 1)) + outer = np.c_[np.cos(ang_o) * (r_mid + half), + np.sin(ang_o) * (r_mid + half)] + + # end cap at a1 + cap_end = get_cap(False, a1_deg) + + # inner arc a1→a0 + ang_i = np.deg2rad(np.linspace(a1_deg, a0_deg, arc_segs + 1)) + inner = np.c_[np.cos(ang_i) * (r_mid - half), + np.sin(ang_i) * (r_mid - half)] + + # start cap at a0 + cap_start = get_cap(True, a0_deg) + + pts = np.vstack((outer, cap_end, inner, cap_start, outer[:1])).astype(np.float32) + + # Rotate to start from middle of cap for proper triangulation + pts = np.roll(pts, cap_segs, axis=0) + + if DEBUG: + n = len(pts) + idx = int(time.monotonic() * 12) % max(1, n) # speed: 12 pts/sec + for i, (x, y) in enumerate(pts): + j = (i - idx) % n # rotate the gradient + t = j / n + color = rl.Color(255, int(255 * (1 - t)), int(255 * t), 255) + rl.draw_circle(int(x), int(y), 2, color) + + return pts + + +class TorqueBar(Widget): + def __init__(self, demo: bool = False, scale: float = 1.0, always: bool = False): + super().__init__() + self._demo = demo + self._scale = scale + self._always = always + self._torque_filter = FirstOrderFilter(0, 0.1, 1 / gui_app.target_fps) + self._torque_line_alpha_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + + @staticmethod + def resting_bottom(rect: rl.Rectangle, scale: float = 1.0) -> float: + """Lower edge of the arc at zero torque, the bar's lowest resting position.""" + return rect.y + rect.height - TORQUE_REST_OFFSET * scale + + def update_filter(self, value: float): + """Update the torque filter value (for demo mode).""" + self._torque_filter.update(value) + + def _update_state(self): + if self._demo: + return + + # torque line + if ui_state.sm['controlsState'].lateralControlState.which() == 'angleState': + controls_state = ui_state.sm['controlsState'] + car_control = ui_state.sm['carControl'] + + if not car_control.latActive: + self._torque_filter.update(0.0) + else: + desired_angle = controls_state.lateralControlState.angleState.steeringAngleDesiredDeg + angle_offset = ui_state.sm['vehicleParameters'].angleOffsetAverageDeg + # Angle-control cars should render the steering arc from the requested angle + # directly, not from curvature/lateral acceleration, which collapses at low speed. + # Subtract the vehicleParameters angle offset so the bar reads zero when going straight + # despite sensor misalignment. + self._torque_filter.update(np.clip(-(desired_angle - angle_offset) / ANGLE_ARC_MAX_DEG, -1, 1)) + else: + self._torque_filter.update(-ui_state.sm['carOutput'].actuatorsOutput.torque) + + def _render(self, rect: rl.Rectangle) -> None: + # adjust y pos with torque + torque_line_offset = np.interp(abs(self._torque_filter.x), [0.5, 1], [TORQUE_REST_OFFSET * self._scale, 26 * self._scale]) + torque_line_height = np.interp(abs(self._torque_filter.x), [0.5, 1], [TORQUE_REST_HEIGHT * self._scale, 56 * self._scale]) + + # animate alpha and angle span + if not self._demo: + self._torque_line_alpha_filter.update(ui_state.status not in (UIStatus.DISENGAGED, UIStatus.LONG_ONLY)) + else: + self._torque_line_alpha_filter.update(1.0) + + torque_line_bg_alpha = np.interp(abs(self._torque_filter.x), [0.5, 1.0], [0.25, 0.5]) + torque_line_bg_color = rl.Color(255, 255, 255, int(255 * torque_line_bg_alpha * self._torque_line_alpha_filter.x)) + if ui_state.status not in (UIStatus.ENGAGED, UIStatus.LAT_ONLY) and not self._demo: + torque_line_bg_color = rl.Color(255, 255, 255, int(255 * 0.15 * self._torque_line_alpha_filter.x)) + + # draw curved line polygon torque bar + torque_line_radius = 1200 * self._scale + top_angle = -90 + torque_bg_angle_span = self._torque_line_alpha_filter.x * TORQUE_ANGLE_SPAN + torque_start_angle = top_angle - torque_bg_angle_span / 2 + torque_end_angle = top_angle + torque_bg_angle_span / 2 + # centerline radius & center (you already have these values) + mid_r = torque_line_radius + torque_line_height / 2 + + cx = rect.x + rect.width / 2 + 8 # offset 8px to right of camera feed + cy = rect.y + rect.height + torque_line_radius - torque_line_offset + # arc_bar_pts is origin-centered + cached; translate to (cx, cy) here so the cache stays hot + # while the bar slides during a scroll/transition. + offset = np.array([cx, cy], dtype=np.float32) + + # draw bg torque indicator line + bg_pts = arc_bar_pts(mid_r, torque_line_height, torque_start_angle, torque_end_angle, cap_radius=7 * self._scale) + offset + draw_polygon(rect, bg_pts, color=torque_line_bg_color) + + # draw torque indicator line + a0s = top_angle + a1s = a0s + torque_bg_angle_span / 2 * self._torque_filter.x + sl_pts = arc_bar_pts(mid_r, torque_line_height, a0s, a1s, cap_radius=7 * self._scale) + offset + + # draw beautiful gradient from center to 65% of the bg torque bar width + start_grad_pt = cx / rect.width + if self._torque_filter.x < 0: + end_grad_pt = (cx * (1 - 0.65) + (min(bg_pts[:, 0]) * 0.65)) / rect.width + else: + end_grad_pt = (cx * (1 - 0.65) + (max(bg_pts[:, 0]) * 0.65)) / rect.width + + # Fade to the requested accent colors as we approach max torque. + start_color = blend_colors( + rl.Color(255, 255, 255, int(255 * 0.9 * self._torque_line_alpha_filter.x)), + rl.Color(255, 200, 0, int(255 * self._torque_line_alpha_filter.x)), # yellow (match stock) + max(0, abs(self._torque_filter.x) - 0.75) * 4, + ) + end_color = blend_colors( + rl.Color(255, 255, 255, int(255 * 0.9 * self._torque_line_alpha_filter.x)), + rl.Color(255, 115, 0, int(255 * self._torque_line_alpha_filter.x)), # orange (match stock) + max(0, abs(self._torque_filter.x) - 0.75) * 4, + ) + + if ui_state.status not in (UIStatus.ENGAGED, UIStatus.LAT_ONLY) and not self._demo: + start_color = end_color = rl.Color(255, 255, 255, int(255 * 0.35 * self._torque_line_alpha_filter.x)) + + gradient = Gradient( + start=(start_grad_pt, 0), + end=(end_grad_pt, 0), + colors=[ + start_color, + end_color, + ], + stops=[0.0, 1.0], + ) + + draw_polygon(rect, sl_pts, gradient=gradient) + + # draw center torque bar dot + if abs(self._torque_filter.x) < 0.5: + dot_y = self._rect.y + self._rect.height - torque_line_offset - torque_line_height / 2 + rl.draw_circle(int(cx), int(dot_y), (10 // 2 * self._scale), + rl.Color(182, 182, 182, int(255 * 0.9 * self._torque_line_alpha_filter.x))) diff --git a/iqpilot/selfdrive/ui/mici/widgets/button.py b/iqpilot/selfdrive/ui/mici/widgets/button.py new file mode 100644 index 000000000..e0630455b --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/widgets/button.py @@ -0,0 +1,834 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import math +import time +import pyray as rl +from typing import Union +from enum import Enum +from collections.abc import Callable +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import MiciLabel +from iqpilot.system.ui.widgets.scroller import DO_ZOOM +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.common.filter_simple import BounceFilter +from iqpilot.system.ui.lib.multilang import tr + +try: + from iqpilot.common.params import Params +except ImportError: + Params = None + +try: + from iqpilot.ui.theme import NeonTheme +except ImportError: + # Fallback theme if iqpilot layer not available + class _FallbackTheme: + def glow(self, alpha=255): return rl.Color(0, 255, 245, alpha) + def glow_mid(self, alpha=130): return rl.Color(0, 255, 245, alpha) + def glow_outer(self, alpha=45): return rl.Color(0, 255, 245, alpha) + def bg(self): return rl.Color(0, 26, 25, 255) + def bg_pressed(self): return rl.Color(0, 33, 32, 255) + NeonTheme = _FallbackTheme() + +SCROLLING_SPEED_PX_S = 50 +COMPLICATION_SIZE = 36 +LABEL_COLOR = rl.Color(255, 255, 255, int(255 * 0.9)) +LABEL_HORIZONTAL_PADDING = 40 +COMPLICATION_GREY = rl.Color(0xAA, 0xAA, 0xAA, 255) +PRESSED_SCALE = 1.15 if DO_ZOOM else 1.07 + + +class ScrollState(Enum): + PRE_SCROLL = 0 + SCROLLING = 1 + POST_SCROLL = 2 + + +class BigCircleButton(Widget): + def __init__(self, icon: str, red: bool = False, icon_size: tuple[int, int] = (64, 53), icon_offset: tuple[int, int] = (0, 0)): + super().__init__() + self._red = red + self._icon_offset = icon_offset + + # State + self.set_rect(rl.Rectangle(0, 0, 180, 180)) + self._press_state_enabled = True + self._scale_filter = BounceFilter(1.0, 0.1, 1 / gui_app.target_fps) + + # Icons + self._txt_icon = gui_app.texture(icon, *icon_size) + self._txt_btn_disabled_bg = gui_app.texture("icons_mici/buttons/button_circle_disabled.png", 180, 180) + + self._txt_btn_bg = gui_app.texture("icons_mici/buttons/button_circle.png", 180, 180) + self._txt_btn_pressed_bg = gui_app.texture("icons_mici/buttons/button_circle_hover.png", 180, 180) + + self._txt_btn_red_bg = gui_app.texture("icons_mici/buttons/button_circle_red.png", 180, 180) + self._txt_btn_red_pressed_bg = gui_app.texture("icons_mici/buttons/button_circle_red_hover.png", 180, 180) + + def set_enable_pressed_state(self, pressed: bool): + self._press_state_enabled = pressed + + def _render(self, _): + # draw background + txt_bg = self._txt_btn_bg if not self._red else self._txt_btn_red_bg + if not self.enabled: + txt_bg = self._txt_btn_disabled_bg + elif self.is_pressed and self._press_state_enabled: + txt_bg = self._txt_btn_pressed_bg if not self._red else self._txt_btn_red_pressed_bg + + scale = self._scale_filter.update(PRESSED_SCALE if self.is_pressed and self._press_state_enabled else 1.0) + btn_x = self._rect.x + (self._rect.width * (1 - scale)) / 2 + btn_y = self._rect.y + (self._rect.height * (1 - scale)) / 2 + rl.draw_texture_ex(txt_bg, (btn_x, btn_y), 0, scale, rl.WHITE) + + # draw icon + icon_color = rl.WHITE if self.enabled else rl.Color(255, 255, 255, int(255 * 0.35)) + rl.draw_texture(self._txt_icon, int(self._rect.x + (self._rect.width - self._txt_icon.width) / 2 + self._icon_offset[0]), + int(self._rect.y + (self._rect.height - self._txt_icon.height) / 2 + self._icon_offset[1]), icon_color) + + +class BigCircleToggle(BigCircleButton): + def __init__(self, icon: str, toggle_callback: Callable | None = None, icon_size: tuple[int, int] = (64, 53), icon_offset: tuple[int, int] = (0, 0)): + super().__init__(icon, False, icon_size=icon_size, icon_offset=icon_offset) + self._toggle_callback = toggle_callback + + # State + self._checked = False + + # Icons + self._txt_toggle_enabled = gui_app.texture("icons_mici/buttons/toggle_dot_enabled.png", 66, 66) + self._txt_toggle_disabled = gui_app.texture("icons_mici/buttons/toggle_dot_disabled.png", 66, 66) + + def set_checked(self, checked: bool): + self._checked = checked + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + self._checked = not self._checked + if self._toggle_callback: + self._toggle_callback(self._checked) + + def _render(self, _): + super()._render(_) + + # draw status icon + rl.draw_texture(self._txt_toggle_enabled if self._checked else self._txt_toggle_disabled, + int(self._rect.x + (self._rect.width - self._txt_toggle_enabled.width) / 2), + int(self._rect.y + 5), rl.WHITE) + + +class BigButton(Widget): + """A lightweight stand-in for the Qt BigButton, drawn & updated each frame.""" + + def __init__(self, text: str, value: str = "", icon: Union[str, rl.Texture] = "", icon_size: tuple[int, int] = (64, 64)): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, 402, 180)) + self.text = text + self.value = value + self._icon_size = icon_size + self.set_icon(icon) + + self._scale_filter = BounceFilter(1.0, 0.1, 1 / gui_app.target_fps) + + self._rotate_icon_t: float | None = None + + self._label_font = gui_app.font(FontWeight.DISPLAY) + self._value_font = gui_app.font(FontWeight.ROMAN) + + self._label = MiciLabel(text, font_size=self._get_label_font_size(), width=int(self._rect.width - LABEL_HORIZONTAL_PADDING * 2), + font_weight=FontWeight.DISPLAY, color=LABEL_COLOR, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM, wrap_text=True) + self._sub_label = MiciLabel(value, font_size=COMPLICATION_SIZE, width=int(self._rect.width - LABEL_HORIZONTAL_PADDING * 2), + font_weight=FontWeight.ROMAN, color=COMPLICATION_GREY, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM, wrap_text=True) + + self._load_images() + + # internal state + self._scroll_offset = 0 # in pixels + self._needs_scroll = measure_text_cached(self._label_font, text, self._get_label_font_size()).x + 25 > self._rect.width + self._scroll_timer = 0 + self._scroll_state = ScrollState.PRE_SCROLL + + def set_icon(self, icon: Union[str, rl.Texture]): + self._txt_icon = gui_app.texture(icon, *self._icon_size) if isinstance(icon, str) and len(icon) else icon + + def set_rotate_icon(self, rotate: bool): + if rotate and self._rotate_icon_t is not None: + return + self._rotate_icon_t = rl.get_time() if rotate else None + + def _load_images(self): + self._txt_default_bg = gui_app.texture("icons_mici/buttons/button_rectangle.png", 402, 180) + self._txt_pressed_bg = gui_app.texture("icons_mici/buttons/button_rectangle_pressed.png", 402, 180) + self._txt_disabled_bg = gui_app.texture("icons_mici/buttons/button_rectangle_disabled.png", 402, 180) + self._txt_hover_bg = gui_app.texture("icons_mici/buttons/button_rectangle_hover.png", 402, 180) + + def _get_label_font_size(self): + if len(self.text) < 12: + font_size = 64 + elif len(self.text) < 17: + font_size = 48 + elif len(self.text) < 20: + font_size = 42 + else: + font_size = 36 + + if self.value: + font_size -= 20 + + return font_size + + def set_text(self, text: str): + self.text = text + self._label.set_text(text) + + def set_value(self, value: str): + self.value = value + self._sub_label.set_text(value) + + def get_value(self) -> str: + return self.value + + def get_text(self): + return self.text + + def _update_state(self): + # hold on text for a bit, scroll, hold again, reset + if self._needs_scroll: + """`dt` should be seconds since last frame (rl.get_frame_time()).""" + # TODO: this comment is generated by GPT, prob wrong and misused + dt = rl.get_frame_time() + + self._scroll_timer += dt + if self._scroll_state == ScrollState.PRE_SCROLL: + if self._scroll_timer < 0.5: + return + self._scroll_state = ScrollState.SCROLLING + self._scroll_timer = 0 + + elif self._scroll_state == ScrollState.SCROLLING: + self._scroll_offset -= SCROLLING_SPEED_PX_S * dt + # reset when text has completely left the button + 50 px gap + # TODO: use global constant for 30+30 px gap + # TODO: add std Widget padding option integrated into the self._rect + full_len = measure_text_cached(self._label_font, self.text, self._get_label_font_size()).x + 30 + 30 + if self._scroll_offset < (self._rect.width - full_len): + self._scroll_state = ScrollState.POST_SCROLL + self._scroll_timer = 0 + + elif self._scroll_state == ScrollState.POST_SCROLL: + # wait for a bit before starting to scroll again + if self._scroll_timer < 0.75: + return + self._scroll_state = ScrollState.PRE_SCROLL + self._scroll_timer = 0 + self._scroll_offset = 0 + + def _render(self, _): + # draw _txt_default_bg + txt_bg = self._txt_default_bg + if not self.enabled: + txt_bg = self._txt_disabled_bg + elif self.is_pressed: + txt_bg = self._txt_hover_bg + + scale = self._scale_filter.update(PRESSED_SCALE if self.is_pressed else 1.0) + btn_x = self._rect.x + (self._rect.width * (1 - scale)) / 2 + btn_y = self._rect.y + (self._rect.height * (1 - scale)) / 2 + rl.draw_texture_ex(txt_bg, (btn_x, btn_y), 0, scale, rl.WHITE) + + # LABEL ------------------------------------------------------------------ + lx = self._rect.x + LABEL_HORIZONTAL_PADDING + ly = btn_y + self._rect.height - 33 # - 40# - self._get_label_font_size() / 2 + + if self.value: + self._sub_label.set_position(lx, ly) + ly -= self._sub_label.font_size + 9 + self._sub_label.render() + + label_color = LABEL_COLOR if self.enabled else rl.Color(255, 255, 255, int(255 * 0.35)) + self._label.set_color(label_color) + self._label.set_position(lx, ly) + self._label.render() + + # ICON ------------------------------------------------------------------- + if self._txt_icon: + rotation = 0 + if self._rotate_icon_t is not None: + rotation = (rl.get_time() - self._rotate_icon_t) * 180 + + # drop top right with 30px padding + x = self._rect.x + self._rect.width - 30 - self._txt_icon.width / 2 + y = self._rect.y + 30 + self._txt_icon.height / 2 + source_rec = rl.Rectangle(0, 0, self._txt_icon.width, self._txt_icon.height) + dest_rec = rl.Rectangle(int(x), int(y), self._txt_icon.width, self._txt_icon.height) + origin = rl.Vector2(self._txt_icon.width / 2, self._txt_icon.height / 2) + rl.draw_texture_pro(self._txt_icon, source_rec, dest_rec, origin, rotation, rl.WHITE) + + +class BigToggle(BigButton): + def __init__(self, text: str, value: str = "", initial_state: bool = False, toggle_callback: Callable | None = None): + super().__init__(text, value, "") + self._checked = initial_state + self._toggle_callback = toggle_callback + + self._label.set_font_size(48) + + def _load_images(self): + super()._load_images() + self._txt_enabled_toggle = gui_app.texture("icons_mici/buttons/toggle_pill_enabled.png", 84, 66) + self._txt_disabled_toggle = gui_app.texture("icons_mici/buttons/toggle_pill_disabled.png", 84, 66) + + def set_checked(self, checked: bool): + self._checked = checked + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + self._checked = not self._checked + if self._toggle_callback: + self._toggle_callback(self._checked) + + def _draw_pill(self, x: float, y: float, checked: bool): + # draw toggle icon top right + if checked: + rl.draw_texture(self._txt_enabled_toggle, int(x), int(y), rl.WHITE) + else: + rl.draw_texture(self._txt_disabled_toggle, int(x), int(y), rl.WHITE) + + def _render(self, _): + super()._render(_) + + x = self._rect.x + self._rect.width - self._txt_enabled_toggle.width + y = self._rect.y + self._draw_pill(x, y, self._checked) + + +class BigMultiToggle(BigToggle): + def __init__(self, text: str, options: list[str], toggle_callback: Callable | None = None, + select_callback: Callable | None = None): + super().__init__(text, "", toggle_callback=toggle_callback) + assert len(options) > 0 + self._options = options + self._select_callback = select_callback + + self._label.set_width(int(self._rect.width - LABEL_HORIZONTAL_PADDING * 2 - self._txt_enabled_toggle.width)) + # TODO: why isn't this automatic? + self._label.set_font_size(self._get_label_font_size()) + + self.set_value(self._options[0]) + + def _get_label_font_size(self): + font_size = super()._get_label_font_size() + return font_size - 6 + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + cur_idx = self._options.index(self.value) + new_idx = (cur_idx + 1) % len(self._options) + self.set_value(self._options[new_idx]) + if self._select_callback: + self._select_callback(self.value) + + def _render(self, _): + BigButton._render(self, _) + + checked_idx = self._options.index(self.value) + + x = self._rect.x + self._rect.width - self._txt_enabled_toggle.width + y = self._rect.y + + for i in range(len(self._options)): + self._draw_pill(x, y, checked_idx == i) + y += 35 + + +class BigMultiParamToggle(BigMultiToggle): + def __init__(self, text: str, param: str, options: list[str], toggle_callback: Callable | None = None, + select_callback: Callable | None = None): + super().__init__(text, options, toggle_callback, select_callback) + self._param = param + + self._params = Params() + self._load_value() + + def _load_value(self): + self.set_value(self._options[self._params.get(self._param) or 0]) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + new_idx = self._options.index(self.value) + self._params.put_nonblocking(self._param, new_idx) + + +class BigParamControl(BigToggle): + def __init__(self, text: str, param: str, toggle_callback: Callable | None = None): + super().__init__(text, "", toggle_callback=toggle_callback) + self.param = param + self.params = Params() + self.set_checked(self.params.get_bool(self.param, False)) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + self.params.put_bool(self.param, self._checked) + + def refresh(self): + self.set_checked(self.params.get_bool(self.param, False)) + + +# TODO: param control base class +class BigCircleParamControl(BigCircleToggle): + def __init__(self, icon: str, param: str, toggle_callback: Callable | None = None, icon_size: tuple[int, int] = (64, 53), + icon_offset: tuple[int, int] = (0, 0)): + super().__init__(icon, toggle_callback, icon_size=icon_size, icon_offset=icon_offset) + self._param = param + self.params = Params() + self.set_checked(self.params.get_bool(self._param, False)) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + self.params.put_bool(self._param, self._checked) + + def refresh(self): + self.set_checked(self.params.get_bool(self._param, False)) + + +_CHIP_BG = rl.Color(0x30, 0x30, 0x30, 230) +_CHIP_TEXT_COLOR = rl.Color(0xDD, 0xDD, 0xDD, 255) +_CHIP_H = 28 +_CHIP_FONT_SIZE = 18 +_CHIP_H_PAD = 10 +_CHIP_V_PAD = 5 +_CHIP_RADIUS = 0.5 +_CHIP_SPACING = 8 +_NEON_CORNER_ROUND = 0.28 +_NEON_CARD_PAD = 18 + + +def _draw_neon_glow_halo(rect: rl.Rectangle, intensity: float = 1.0): + segs = 8 + roundness = _NEON_CORNER_ROUND + for expand, alpha in [ + (14, int(18 * intensity)), + (12, int(28 * intensity)), + (10, int(40 * intensity)), + (8, int(55 * intensity)), + (6, int(72 * intensity)), + (4, int(95 * intensity)), + (2, int(120 * intensity)), + ]: + ex = rl.Rectangle( + rect.x - expand, rect.y - expand, + rect.width + expand * 2, rect.height + expand * 2, + ) + rl.draw_rectangle_rounded(ex, roundness, segs, NeonTheme.glow_outer(alpha)) + + +def _draw_neon_glow_border(rect: rl.Rectangle, intensity: float = 1.0): + segs = 8 + roundness = _NEON_CORNER_ROUND + rl.draw_rectangle_rounded_lines_ex(rect, roundness, segs, 2.5, + NeonTheme.glow(int(255 * intensity))) + rl.draw_rectangle_rounded_lines_ex(rect, roundness, segs, 1.0, + rl.Color(255, 255, 255, int(180 * intensity))) + + +def _neon_title_font_size(text: str, has_chips: bool) -> int: + if len(text) < 10: + size = 52 + elif len(text) < 14: + size = 42 + elif len(text) < 18: + size = 36 + else: + size = 30 + if has_chips: + size = min(size, 36) + return size + + +class NeonBigButton(Widget): + + CARD_W = 310 + CARD_H = 160 + + def __init__(self, title: str, chips: list[str] | None = None, + click_callback: Callable | None = None): + super().__init__() + self._title_text = title + self._chips: list[str] = chips or [] + self._click_callback = click_callback + self._born: float = time.monotonic() + + self.set_rect(rl.Rectangle(0, 0, self.CARD_W, self.CARD_H)) + + self._label = MiciLabel( + title, + font_size=_neon_title_font_size(title, bool(chips)), + width=self.CARD_W - _NEON_CARD_PAD * 2, + font_weight=FontWeight.DISPLAY, + color=LABEL_COLOR, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP, + wrap_text=True, + elide_right=False, + ) + self._chip_font = gui_app.font(FontWeight.MEDIUM) + + def set_chips(self, chips: list[str]): + self._chips = chips + # Re-size title now that we know if chips are present + self._label.set_font_size(_neon_title_font_size(self._title_text, bool(chips))) + + def set_click_callback(self, cb: Callable | None): + self._click_callback = cb + + def _glow_intensity(self) -> float: + t = time.monotonic() - self._born + return 0.65 + 0.35 * (0.5 + 0.5 * math.sin(t * 5.0)) + + def _render_chips(self, start_x: float, start_y: float): + x = start_x + for chip in self._chips: + text_w = int(measure_text_cached(self._chip_font, chip, _CHIP_FONT_SIZE).x) + w = text_w + _CHIP_H_PAD * 2 + rl.draw_rectangle_rounded(rl.Rectangle(x, start_y, w, _CHIP_H), + _CHIP_RADIUS, 4, _CHIP_BG) + text_y = start_y + (_CHIP_H - _CHIP_FONT_SIZE) // 2 + rl.draw_text_ex( + self._chip_font, + chip, + rl.Vector2(x + _CHIP_H_PAD, text_y), + _CHIP_FONT_SIZE, + 0, + _CHIP_TEXT_COLOR, + ) + x += w + _CHIP_SPACING + + def _render(self, rect: rl.Rectangle) -> None: + intensity = self._glow_intensity() + _draw_neon_glow_halo(rect, intensity) + bg = NeonTheme.bg_pressed() if self.is_pressed else NeonTheme.bg() + rl.draw_rectangle_rounded(rect, _NEON_CORNER_ROUND, 6, bg) + _draw_neon_glow_border(rect, intensity) + chips_h = (_CHIP_H + 6) if self._chips else 0 + title_rect = rl.Rectangle( + rect.x + _NEON_CARD_PAD, + rect.y + _NEON_CARD_PAD, + rect.width - _NEON_CARD_PAD * 2, + rect.height - _NEON_CARD_PAD - chips_h, + ) + label_color = LABEL_COLOR if self.enabled else rl.Color(255, 255, 255, int(255 * 0.35)) + self._label.set_color(label_color) + self._label.render(title_rect) + if self._chips: + chip_y = rect.y + rect.height - _CHIP_H - _NEON_CARD_PAD // 2 + self._render_chips(rect.x + _NEON_CARD_PAD, chip_y) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + if self._click_callback: + self._click_callback() + + +class NeonBigParamToggle(NeonBigButton): + def __init__(self, title: str, param: str, + sub_chips: list[str] | None = None, + toggle_callback: Callable | None = None): + super().__init__(title, chips=[tr("disabled")]) # pre-set so layout reserves chip space + self._param = param + self._params = Params() if Params else None + self._sub_chips: list[str] = sub_chips or [] + self._toggle_callback = toggle_callback + self._checked: bool = False + + self._load_value() + self._rebuild_chips() + + def set_sub_chips(self, sub_chips: list[str]): + self._sub_chips = sub_chips + self._rebuild_chips() + + def _load_value(self): + if self._params: + self._checked = self._params.get_bool(self._param, False) + + def _rebuild_chips(self): + state = "enabled" if self._checked else "disabled" + self.set_chips([state] + self._sub_chips) + + def _glow_intensity(self) -> float: + return super()._glow_intensity() if self._checked else 0.25 + + def _render(self, rect: rl.Rectangle) -> None: + super()._render(rect) + if not self._checked: + rl.draw_rectangle_rounded(rect, _NEON_CORNER_ROUND, 6, rl.Color(0, 0, 0, 120)) + + def _handle_mouse_release(self, mouse_pos: MousePos): + self._checked = not self._checked + if self._params: + self._params.put_bool(self._param, self._checked) + self._rebuild_chips() + if self._toggle_callback: + self._toggle_callback(self._checked) + + def refresh(self): + self._load_value() + self._rebuild_chips() + + +class NeonBigCircleParamControl(BigCircleParamControl): + def __init__(self, icon: str, param: str, + toggle_callback: Callable | None = None, + icon_size: tuple[int, int] = (64, 53), + icon_offset: tuple[int, int] = (0, 0)): + super().__init__(icon, param, toggle_callback=toggle_callback, + icon_size=icon_size, icon_offset=icon_offset) + self._born = time.monotonic() + + def _glow_intensity(self) -> float: + if not self._checked: + return 0.25 + t = time.monotonic() - self._born + return 0.65 + 0.35 * (0.5 + 0.5 * math.sin(t * 5.0)) + + def _render(self, rect: rl.Rectangle): + intensity = self._glow_intensity() + roundness = 1.0 + segs = 12 + + for expand, alpha in [ + (12, int(14 * intensity)), + (10, int(22 * intensity)), + (8, int(35 * intensity)), + (6, int(50 * intensity)), + (4, int(70 * intensity)), + (2, int(95 * intensity)), + ]: + ex = rl.Rectangle(rect.x - expand, rect.y - expand, + rect.width + expand * 2, rect.height + expand * 2) + rl.draw_rectangle_rounded(ex, roundness, segs, NeonTheme.glow_outer(alpha)) + super()._render(rect) + rl.draw_rectangle_rounded_lines_ex(rect, roundness, segs, 2.5, + NeonTheme.glow(int(255 * intensity))) + rl.draw_rectangle_rounded_lines_ex(rect, roundness, segs, 1.0, + rl.Color(255, 255, 255, int(160 * intensity))) + +class NeonBigMultiToggle(NeonBigButton): + def __init__(self, title: str, options: list[str], + select_callback: Callable | None = None): + assert len(options) > 0 + super().__init__(title, chips=[options[0]]) + self._options = options + self._value = options[0] + self._select_callback = select_callback + + def set_value(self, value: str): + if value in self._options: + self._value = value + else: + self._value = self._options[0] + self.set_chips([self._value]) + + def get_value(self) -> str: + return self._value + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + idx = self._options.index(self._value) + self._value = self._options[(idx + 1) % len(self._options)] + self.set_chips([self._value]) + if self._select_callback: + self._select_callback(self._value) + + +class NeonBigMultiParamToggle(NeonBigMultiToggle): + + def __init__(self, title: str, param: str, options: list[str], + select_callback: Callable | None = None): + super().__init__(title, options, select_callback) + self._param = param + self._params = Params() if Params else None + self._load_value() + + def _load_value(self): + if self._params: + try: + idx = int(self._params.get(self._param) or 0) + idx = max(0, min(idx, len(self._options) - 1)) + except (TypeError, ValueError): + idx = 0 + self.set_value(self._options[idx]) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + idx = self._options.index(self._value) + if self._params: + self._params.put_nonblocking(self._param, idx) + + def refresh(self): + self._load_value() + + +class NeonMappedParamToggle(NeonBigMultiToggle): + def __init__(self, title: str, param: str, options: list[str], values: list[int], + select_callback: Callable | None = None): + super().__init__(title, options, select_callback) + assert len(options) == len(values) + self._param = param + self._values = values + self._params = Params() if Params else None + self._load_value() + + def _load_value(self): + if self._params: + try: + current = int(self._params.get(self._param, return_default=True) or 0) + idx = self._values.index(current) + except (TypeError, ValueError): + idx = 0 + self.set_value(self._options[idx]) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + idx = self._options.index(self._value) + if self._params: + self._params.put_nonblocking(self._param, self._values[idx]) + + def refresh(self): + self._load_value() + + +class NeonFloatMappedParamToggle(NeonBigMultiToggle): + + def __init__(self, title: str, param: str, options: list[str], values: list[float], + select_callback: Callable | None = None): + super().__init__(title, options, select_callback) + assert len(options) == len(values) + self._param = param + self._values = values + self._params = Params() if Params else None + self._load_value() + + def _load_value(self): + if self._params: + try: + current_val = float(self._params.get(self._param, return_default=True) or 0) + idx = min(range(len(self._values)), key=lambda i: abs(self._values[i] - current_val)) + except (TypeError, ValueError): + idx = 1 if len(self._values) > 1 else 0 + self.set_value(self._options[idx]) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + idx = self._options.index(self._value) + if self._params: + self._params.put_nonblocking(self._param, str(self._values[idx])) + + def refresh(self): + self._load_value() + + + +class DrumPickerButton(NeonBigButton): + def __init__(self, title: str, options: list[str]): + super().__init__(title, chips=[""]) + self._options = options + + def _read_current(self) -> str: + raise NotImplementedError + + def _write_value(self, value: str): + raise NotImplementedError + + def refresh(self): + self.set_chips([self._read_current()]) + + def _on_picked(self, value: str): + self._write_value(value) + self.set_chips([value]) + + def _handle_mouse_release(self, mouse_pos: MousePos): + # Bypass NeonBigButton cycle — open drum picker instead + Widget._handle_mouse_release(self, mouse_pos) + if getattr(self, '_swiping_away', False): + return + from iqpilot.selfdrive.ui.mici.widgets.drum_picker import DrumPickerDialog + from iqpilot.system.ui.lib.application import gui_app as _app + dlg = DrumPickerDialog( + title=self._title_text.lower(), + options=self._options, + current=self._read_current(), + confirm_callback=self._on_picked, + ) + _app.set_modal_overlay(dlg) + + +class DrumParamButton(DrumPickerButton): + def __init__(self, title: str, param: str, options: list[str]): + self._param = param + self._params = Params() if Params else None + super().__init__(title, options) + self.refresh() + + def _read_current(self) -> str: + try: + idx = int(self._params.get(self._param, return_default=True) or 0) + idx = max(0, min(idx, len(self._options) - 1)) + except (TypeError, ValueError): + idx = 0 + return self._options[idx] + + def _write_value(self, value: str): + if value in self._options and self._params: + self._params.put_nonblocking(self._param, self._options.index(value)) + + +class DrumMappedParamButton(DrumPickerButton): + def __init__(self, title: str, param: str, options: list[str], values: list[int]): + assert len(options) == len(values) + self._param = param + self._values = values + self._params = Params() if Params else None + super().__init__(title, options) + self.refresh() + + def _read_current(self) -> str: + try: + raw = int(self._params.get(self._param, return_default=True) or 0) + idx = min(range(len(self._values)), key=lambda i: abs(self._values[i] - raw)) + except (TypeError, ValueError): + idx = 0 + return self._options[idx] + + def _write_value(self, value: str): + if value in self._options and self._params: + idx = self._options.index(value) + self._params.put_nonblocking(self._param, int(self._values[idx])) + + +class DrumFloatMappedParamButton(DrumPickerButton): + def __init__(self, title: str, param: str, options: list[str], values: list[float]): + assert len(options) == len(values) + self._param = param + self._values = values + self._params = Params() if Params else None + super().__init__(title, options) + self.refresh() + + def _read_current(self) -> str: + try: + raw = float(self._params.get(self._param, return_default=True) or 0) + idx = min(range(len(self._values)), key=lambda i: abs(self._values[i] - raw)) + except (TypeError, ValueError): + idx = 0 + return self._options[idx] + + def _write_value(self, value: str): + if value in self._options and self._params: + idx = self._options.index(value) + self._params.put_nonblocking(self._param, float(self._values[idx])) diff --git a/iqpilot/selfdrive/ui/mici/widgets/dialog.py b/iqpilot/selfdrive/ui/mici/widgets/dialog.py new file mode 100644 index 000000000..137f8474d --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/widgets/dialog.py @@ -0,0 +1,417 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import abc +import math +import pyray as rl +from typing import Union +from collections.abc import Callable +from typing import cast +from iqpilot.system.ui.widgets import Widget, NavWidget +from iqpilot.system.ui.widgets.label import UnifiedLabel, gui_label +from iqpilot.system.ui.widgets.mici_keyboard import MiciKeyboard +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.wrap_text import wrap_text +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos, MouseEvent +from iqpilot.system.ui.widgets.scroller import Scroller +from iqpilot.system.ui.widgets.slider import RedBigSlider, BigSlider +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.selfdrive.ui.mici.widgets.button import BigButton +from iqpilot.selfdrive.ui.mici.widgets.side_button import SideButton + +DEBUG = False + +PADDING = 20 + + +class BigDialogBase(NavWidget, abc.ABC): + def __init__(self, right_btn: str | None = None, right_btn_callback: Callable | None = None): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + self.set_back_callback(gui_app.pop_widget) + + self._right_btn = None + if right_btn: + def right_btn_callback_wrapper(): + gui_app.pop_widget() + if right_btn_callback: + right_btn_callback() + + self._right_btn = SideButton(right_btn) + self._right_btn.set_click_callback(right_btn_callback_wrapper) + # move to right side + self._right_btn._rect.x = self._rect.x + self._rect.width - self._right_btn._rect.width + + def _layout(self) -> None: + rl.draw_rectangle_rec(rl.Rectangle(0, 0, gui_app.width, gui_app.height), rl.Color(8, 9, 10, 255)) + + def _render(self, _): + if self._right_btn: + self._right_btn.set_position(self._right_btn._rect.x, self._rect.y) + self._right_btn.render() + + +class BigDialog(BigDialogBase): + def __init__(self, + title: str, + description: str, + right_btn: str | None = None, + right_btn_callback: Callable | None = None): + super().__init__(right_btn, right_btn_callback) + self._title = title + self._description = description + + def _render(self, _): + super()._render(_) + + # draw title + # TODO: we desperately need layouts + # TODO: coming up with these numbers manually is a pain and not scalable + # TODO: no clue what any of these numbers mean. VBox and HBox would remove all of this shite + max_width = self._rect.width - PADDING * 2 + if self._right_btn: + max_width -= self._right_btn._rect.width + + title_wrapped = '\n'.join(wrap_text(gui_app.font(FontWeight.BOLD), self._title, 50, int(max_width))) + title_size = measure_text_cached(gui_app.font(FontWeight.BOLD), title_wrapped, 50) + text_x_offset = 0 + title_rect = rl.Rectangle(int(self._rect.x + text_x_offset + PADDING), + int(self._rect.y + PADDING), + int(max_width), + int(title_size.y)) + gui_label(title_rect, title_wrapped, 50, font_weight=FontWeight.BOLD, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + + # draw description + desc_wrapped = '\n'.join(wrap_text(gui_app.font(FontWeight.MEDIUM), self._description, 30, int(max_width))) + desc_size = measure_text_cached(gui_app.font(FontWeight.MEDIUM), desc_wrapped, 30) + desc_rect = rl.Rectangle(int(self._rect.x + text_x_offset + PADDING), + int(self._rect.y + self._rect.height / 3), + int(max_width), + int(desc_size.y)) + # TODO: text align doesn't seem to work properly with newlines + gui_label(desc_rect, desc_wrapped, 30, font_weight=FontWeight.MEDIUM, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + +class BigConfirmationDialogV2(BigDialogBase): + def __init__(self, title: str, icon: str, red: bool = False, + exit_on_confirm: bool = True, + confirm_callback: Callable | None = None): + super().__init__() + self._confirm_callback = confirm_callback + self._exit_on_confirm = exit_on_confirm + + icon_txt = gui_app.texture(icon, 64, 53) + self._slider: BigSlider | RedBigSlider + if red: + self._slider = RedBigSlider(title, icon_txt, confirm_callback=self._on_confirm) + else: + self._slider = BigSlider(title, icon_txt, confirm_callback=self._on_confirm) + self._slider.set_enabled(lambda: self.enabled and not self._swiping_away) # self.enabled for nav stack + + def _on_confirm(self): + if self._exit_on_confirm: + gui_app.pop_widget() + if self._confirm_callback: + self._confirm_callback() + + def _update_state(self): + super()._update_state() + if self._swiping_away and not self._slider.confirmed: + self._slider.reset() + + def _render(self, _): + self._slider.render(self._rect) + + +class BigInputDialog(BigDialogBase): + BACK_TOUCH_AREA_PERCENTAGE = 0.2 + BACKSPACE_RATE = 25 # hz + TEXT_INPUT_SIZE = 35 + + def __init__(self, + hint: str, + default_text: str = "", + minimum_length: int = 1, + confirm_callback: Callable[[str], None] | None = None): + super().__init__(None, None) + self._hint_label = UnifiedLabel(hint, font_size=35, text_color=rl.Color(255, 255, 255, int(255 * 0.35)), + font_weight=FontWeight.MEDIUM) + self._keyboard = MiciKeyboard() + self._keyboard.set_text(default_text) + self._keyboard.set_enabled(lambda: self.enabled) # for nav stack + self._minimum_length = minimum_length + + self._backspace_held_time: float | None = None + + self._backspace_img = gui_app.texture("icons_mici/settings/keyboard/backspace.png", 42, 36) + self._backspace_img_alpha = FirstOrderFilter(0, 0.05, 1 / gui_app.target_fps) + + self._enter_img = gui_app.texture("icons_mici/settings/keyboard/confirm.png", 42, 36) + self._enter_img_alpha = FirstOrderFilter(0, 0.05, 1 / gui_app.target_fps) + + # rects for top buttons + self._top_left_button_rect = rl.Rectangle(0, 0, 0, 0) + self._top_right_button_rect = rl.Rectangle(0, 0, 0, 0) + + def confirm_callback_wrapper(): + text = self._keyboard.text() + gui_app.pop_widget() + if confirm_callback: + confirm_callback(text) + self._confirm_callback = confirm_callback_wrapper + + def _update_state(self): + super()._update_state() + + last_mouse_event = gui_app.last_mouse_event + if last_mouse_event.left_down and rl.check_collision_point_rec(last_mouse_event.pos, self._top_right_button_rect) and self._backspace_img_alpha.x > 1: + if self._backspace_held_time is None: + self._backspace_held_time = rl.get_time() + + if rl.get_time() - self._backspace_held_time > 0.5: + if gui_app.frame % round(gui_app.target_fps / self.BACKSPACE_RATE) == 0: + self._keyboard.backspace() + + else: + self._backspace_held_time = None + + def _render(self, _): + # draw current text so far below everything. text floats left but always stays in view + text = self._keyboard.text() + candidate_char = self._keyboard.get_candidate_character() + text_size = measure_text_cached(gui_app.font(FontWeight.ROMAN), text + candidate_char or self._hint_label.text, self.TEXT_INPUT_SIZE) + + bg_block_margin = 5 + text_x = PADDING * 2 + self._enter_img.width + bg_block_margin + text_field_rect = rl.Rectangle(text_x, int(self._rect.y + PADDING) - bg_block_margin, + int(self._rect.width - text_x - PADDING * 2 - self._enter_img.width) - bg_block_margin * 2, + int(text_size.y)) + + # draw text input + # push text left with a gradient on left side if too long + if text_size.x > text_field_rect.width: + text_x -= text_size.x - text_field_rect.width + + rl.begin_scissor_mode(int(text_field_rect.x), int(text_field_rect.y), int(text_field_rect.width), int(text_field_rect.height)) + rl.draw_text_ex(gui_app.font(FontWeight.ROMAN), text, rl.Vector2(text_x, text_field_rect.y), self.TEXT_INPUT_SIZE, 0, rl.WHITE) + + # draw grayed out character user is hovering over + if candidate_char: + candidate_char_size = measure_text_cached(gui_app.font(FontWeight.ROMAN), candidate_char, self.TEXT_INPUT_SIZE) + rl.draw_text_ex(gui_app.font(FontWeight.ROMAN), candidate_char, + rl.Vector2(min(text_x + text_size.x, text_field_rect.x + text_field_rect.width) - candidate_char_size.x, text_field_rect.y), + self.TEXT_INPUT_SIZE, 0, rl.Color(255, 255, 255, 128)) + + rl.end_scissor_mode() + + # draw gradient on left side to indicate more text + if text_size.x > text_field_rect.width: + rl.draw_rectangle_gradient_h(int(text_field_rect.x), int(text_field_rect.y), 80, int(text_field_rect.height), + rl.BLACK, rl.BLANK) + + # draw cursor + if text: + blink_alpha = (math.sin(rl.get_time() * 6) + 1) / 2 + cursor_x = min(text_x + text_size.x + 3, text_field_rect.x + text_field_rect.width) + rl.draw_rectangle_rounded(rl.Rectangle(int(cursor_x), int(text_field_rect.y), 4, int(text_size.y)), + 1, 4, rl.Color(255, 255, 255, int(255 * blink_alpha))) + + # draw backspace icon with nice fade + self._backspace_img_alpha.update(255 * bool(text)) + if self._backspace_img_alpha.x > 1: + color = rl.Color(255, 255, 255, int(self._backspace_img_alpha.x)) + rl.draw_texture(self._backspace_img, int(self._rect.width - self._enter_img.width - 15), int(text_field_rect.y), color) + + if not text and self._hint_label.text and not candidate_char: + # draw description if no text entered yet and not drawing candidate char + self._hint_label.render(text_field_rect) + + # TODO: move to update state + # make rect take up entire area so it's easier to click + self._top_left_button_rect = rl.Rectangle(self._rect.x, self._rect.y, text_field_rect.x, self._rect.height - self._keyboard.get_keyboard_height()) + self._top_right_button_rect = rl.Rectangle(text_field_rect.x + text_field_rect.width, self._rect.y, + self._rect.width - (text_field_rect.x + text_field_rect.width), self._top_left_button_rect.height) + + self._enter_img_alpha.update(255 if (len(text) >= self._minimum_length) else 255 * 0.35) + if self._enter_img_alpha.x > 1: + color = rl.Color(255, 255, 255, int(self._enter_img_alpha.x)) + rl.draw_texture(self._enter_img, int(self._rect.x + 15), int(text_field_rect.y), color) + + # keyboard goes over everything + self._keyboard.render(self._rect) + + # draw debugging rect bounds + if DEBUG: + rl.draw_rectangle_lines_ex(text_field_rect, 1, rl.Color(100, 100, 100, 255)) + rl.draw_rectangle_lines_ex(self._top_right_button_rect, 1, rl.Color(0x12, 0x97, 0x91, 0xFF)) + rl.draw_rectangle_lines_ex(self._top_left_button_rect, 1, rl.Color(0x12, 0x97, 0x91, 0xFF)) + + def _handle_mouse_press(self, mouse_pos: MousePos): + super()._handle_mouse_press(mouse_pos) + # TODO: need to track where press was so enter and back can activate on release rather than press + # or turn into icon widgets :eyes_open: + # handle backspace icon click + if rl.check_collision_point_rec(mouse_pos, self._top_right_button_rect) and self._backspace_img_alpha.x > 254: + self._keyboard.backspace() + elif rl.check_collision_point_rec(mouse_pos, self._top_left_button_rect) and self._enter_img_alpha.x > 254: + # handle enter icon click + self._confirm_callback() + + +class BigDialogOptionButton(Widget): + HEIGHT = 64 + SELECTED_HEIGHT = 74 + + def __init__(self, option: str): + super().__init__() + self.option = option + self.set_rect(rl.Rectangle(0, 0, int(gui_app.width / 2 + 220), self.HEIGHT)) + + self._selected = False + + self._label = UnifiedLabel(option, font_size=70, text_color=rl.Color(255, 255, 255, int(255 * 0.58)), + font_weight=FontWeight.DISPLAY_REGULAR, alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + scroll=True) + + def show_event(self): + super().show_event() + self._label.reset_scroll() + + def set_selected(self, selected: bool): + self._selected = selected + self._rect.height = self.SELECTED_HEIGHT if selected else self.HEIGHT + + def _render(self, _): + if DEBUG: + rl.draw_rectangle_lines_ex(self._rect, 1, rl.Color(0x12, 0x97, 0x91, 0xFF)) + + # FIXME: offset x by -45 because scroller centers horizontally + if self._selected: + self._label.set_font_size(self.SELECTED_HEIGHT) + self._label.set_color(rl.Color(255, 255, 255, int(255 * 0.9))) + self._label.set_font_weight(FontWeight.DISPLAY) + else: + self._label.set_font_size(self.HEIGHT) + self._label.set_color(rl.Color(255, 255, 255, int(255 * 0.58))) + self._label.set_font_weight(FontWeight.DISPLAY_REGULAR) + + self._label.render(self._rect) + + +class BigMultiOptionDialog(BigDialogBase): + BACK_TOUCH_AREA_PERCENTAGE = 0.1 + + def __init__(self, options: list[str], default: str | None, + right_btn: str | None = 'check', right_btn_callback: Callable[[], None] | None = None): + super().__init__(right_btn, right_btn_callback=right_btn_callback) + self._options = options + if default is not None: + assert default in options + + self._default_option: str | None = default + self._selected_option: str = self._default_option or (options[0] if len(options) > 0 else "") + self._last_selected_option: str = self._selected_option + + # Widget doesn't differentiate between click and drag + self._can_click = True + + self._scroller = Scroller([], horizontal=False, pad_start=100, pad_end=100, spacing=0, snap_items=True) + if self._right_btn is not None: + self._scroller.set_enabled(lambda: not cast(Widget, self._right_btn).is_pressed) + + for option in options: + self._scroller.add_widget(BigDialogOptionButton(option)) + + def show_event(self): + super().show_event() + self._scroller.show_event() + if self._default_option is not None: + self._on_option_selected(self._default_option) + + def get_selected_option(self) -> str: + return self._selected_option + + def _on_option_selected(self, option: str): + y_pos = 0.0 + for btn in self._scroller._items: + btn = cast(BigDialogOptionButton, btn) + if btn.option == option: + rect_center_y = self._rect.y + self._rect.height / 2 + if btn._selected: + height = btn.rect.height + else: + # when selecting an option under current, account for changing heights + btn_center_y = btn.rect.y + btn.rect.height / 2 # not accurate, just to determine direction + height_offset = BigDialogOptionButton.SELECTED_HEIGHT - BigDialogOptionButton.HEIGHT + height = (BigDialogOptionButton.HEIGHT - height_offset) if rect_center_y < btn_center_y else BigDialogOptionButton.SELECTED_HEIGHT + y_pos = rect_center_y - (btn.rect.y + height / 2) + break + + self._scroller.scroll_to(-y_pos) + + def _selected_option_changed(self): + pass + + def _handle_mouse_press(self, mouse_pos: MousePos): + super()._handle_mouse_press(mouse_pos) + self._can_click = True + + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + super()._handle_mouse_event(mouse_event) + + # # TODO: add generic _handle_mouse_click handler to Widget + if not self._scroller.scroll_panel.is_touch_valid(): + self._can_click = False + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + if not self._can_click: + return + + # select current option + for btn in self._scroller._items: + btn = cast(BigDialogOptionButton, btn) + if btn.option == self._selected_option: + self._on_option_selected(btn.option) + break + + def _update_state(self): + super()._update_state() + + # get selection by whichever button is closest to center + center_y = self._rect.y + self._rect.height / 2 + closest_btn = (None, float('inf')) + for btn in self._scroller._items: + dist_y = abs((btn.rect.y + btn.rect.height / 2) - center_y) + if dist_y < closest_btn[1]: + closest_btn = (btn, dist_y) + + if closest_btn[0]: + for btn in self._scroller._items: + btn.set_selected(btn.option == closest_btn[0].option) + self._selected_option = closest_btn[0].option + + # Signal to subclasses if selection changed + if self._selected_option != self._last_selected_option: + self._selected_option_changed() + self._last_selected_option = self._selected_option + + def _render(self, _): + super()._render(_) + self._scroller.render(self._rect) + + + +class BigDialogButton(BigButton): + def __init__(self, text: str, value: str = "", icon: Union[str, rl.Texture] = "", description: str = ""): + super().__init__(text, value, icon) + self._description = description + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + dlg = BigDialog(self.text, self._description) + gui_app.push_widget(dlg) diff --git a/iqpilot/selfdrive/ui/mici/widgets/drum_picker.py b/iqpilot/selfdrive/ui/mici/widgets/drum_picker.py new file mode 100644 index 000000000..d79c0ae82 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/widgets/drum_picker.py @@ -0,0 +1,265 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +DrumPickerDialog — iOS-style drum-roll value selector. + +Layout (matches concept image): + - Title label centred at top with a white underline + - 5 visible values: [n-2] [n-1] [ N ] [n+1] [n+2] + - Centre value: large bold white, flanked by two thin vertical bars + - Outer values fade with distance (alpha 0.35 → 0.22 → 0.10) + - Optional unit label below centre + - Drag left/right or tap arrows to change value; confirm on release / tap elsewhere +""" +import pyray as rl +from collections.abc import Callable + +from iqpilot.common.filter_simple import BounceFilter, FirstOrderFilter +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos, MouseEvent +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import DialogResult +from iqpilot.selfdrive.ui.mici.widgets.dialog import BigDialogBase + +try: + from iqpilot.ui.theme import NeonTheme +except ImportError: + class _FT: + def glow(self, a=255): return rl.Color(0, 255, 245, a) + def glow_outer(self, a=45): return rl.Color(0, 255, 245, a) + NeonTheme = _FT() + + +# ── Visual constants ─────────────────────────────────────────────────────────── +_CENTRE_FONT_SIZE = 36 # fits comfortably inside the slot walls +_SIDE1_FONT_SIZE = 30 # one step away +_SIDE2_FONT_SIZE = 20 # two steps away +_UNIT_FONT_SIZE = 18 +_TITLE_FONT_SIZE = 24 + +_CENTRE_ALPHA = 255 +_SIDE1_ALPHA = int(255 * 0.45) +_SIDE2_ALPHA = int(255 * 0.18) + +_BAR_W = 2 # vertical separator bar width +_BAR_H_FRAC = 0.55 # bar height as fraction of dialog height +_SLOT_W = 90 # width of the centre slot (determines bar positions) +_SLOT_SPACING = 115 # horizontal distance between adjacent value centres +# 1 index = 1 slot spacing in pixels — drag exactly one slot width to move one step +_DRAG_SCALE = 1.0 / _SLOT_SPACING + + +class DrumPickerDialog(BigDialogBase): + """ + Full-screen drum-roll value picker. + Drag left/right to scroll values; releasing snaps and calls confirm_callback + immediately (live preview) but keeps the dialog open. + Swipe down (back gesture) to dismiss. + """ + + def __init__(self, + title: str, + options: list[str], + current: str, + unit: str = "", + confirm_callback: Callable[[str], None] | None = None): + super().__init__() + assert len(options) > 0 + self._title = title + self._options = options + self._unit = unit + self._confirm_callback = confirm_callback + + # Current index with a smooth bounce filter for animation + try: + idx = options.index(current) + except ValueError: + idx = 0 + dt = 1 / gui_app.target_fps + self._idx: float = float(idx) + self._idx_filter = BounceFilter(float(idx), 0.06, dt, bounce=3) + self._idx_filter.x = float(idx) + + # Press/release zoom scale — smoothly goes 1.0 → 1.12 on touch-down, + # back to 1.0 on release, giving a tactile "grab" feel. + self._scale_target: float = 1.0 + self._scale_filter = FirstOrderFilter(1.0, 0.04, dt) + + # Drag state + self._drag_start_x: float | None = None + self._drag_start_idx: float = float(idx) + self._dragging: bool = False + + # Pre-load fonts + self._font_display = gui_app.font(FontWeight.DISPLAY) + self._font_medium = gui_app.font(FontWeight.MEDIUM) + self._font_roman = gui_app.font(FontWeight.ROMAN) + + # ── Helpers ──────────────────────────────────────────────────────────────── + + def _current_idx(self) -> int: + return max(0, min(round(self._idx_filter.x), len(self._options) - 1)) + + def selected_value(self) -> str: + return self._options[self._current_idx()] + + def _clamp_idx(self, v: float) -> float: + return max(0.0, min(v, float(len(self._options) - 1))) + + # ── Input ────────────────────────────────────────────────────────────────── + + def _handle_mouse_press(self, mouse_pos: MousePos): + super()._handle_mouse_press(mouse_pos) + # Kill any in-progress bounce so the grab starts from exactly + # where the value visually is right now — no jump on first drag. + snapped = float(round(self._idx_filter.x)) + self._idx = snapped + self._idx_filter.x = snapped + self._idx_filter.velocity.x = 0.0 # kill bounce velocity + self._drag_start_x = mouse_pos.x + self._drag_start_idx = snapped + self._dragging = False + self._scale_target = 1.12 # zoom in on touch-down + + def _handle_mouse_event(self, mouse_event: MouseEvent): + super()._handle_mouse_event(mouse_event) + if self._drag_start_x is None: + return + delta = self._drag_start_x - mouse_event.pos.x # drag left = higher idx + if abs(delta) > 8: + self._dragging = True + if self._dragging: + self._idx = self._clamp_idx(self._drag_start_idx + delta * _DRAG_SCALE) + self._idx_filter.x = self._idx # snap immediately while dragging + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + # Swipe-down = dismiss, calling callback with final value first + if self._swiping_away: + self._idx = float(round(self._idx_filter.x)) + if self._confirm_callback: + self._confirm_callback(self.selected_value()) + self._drag_start_x = None + self._dragging = False + self._ret = DialogResult.CONFIRM + return + # Normal release: set the snap target and let BounceFilter glide there. + # Do NOT hard-set _idx_filter.x — that would teleport instead of animate. + self._idx = float(round(self._idx_filter.x)) + self._drag_start_x = None + self._dragging = False + self._scale_target = 1.0 # zoom back out on release + if self._confirm_callback: + self._confirm_callback(self.selected_value()) + + # ── Update ───────────────────────────────────────────────────────────────── + + def _update_state(self): + super()._update_state() + # While dragging, filter is slaved directly to _idx (instant follow). + # On release, _dragging=False so filter animates toward _idx with bounce. + if self._dragging: + self._idx_filter.x = self._idx + self._idx_filter.velocity.x = 0.0 + else: + self._idx_filter.update(self._idx) + self._scale_filter.update(self._scale_target) + + # ── Render ───────────────────────────────────────────────────────────────── + + def _render(self, _) -> DialogResult: + rect = self._rect + cx = rect.x + rect.width / 2 + cy = rect.y + rect.height / 2 + + # ── Dark background ─────────────────────────────────────────────────────── + rl.draw_rectangle(int(rect.x), int(rect.y), int(rect.width), int(rect.height), + rl.Color(0, 0, 0, 230)) + + # ── Vertical separator bars (drawn first so title renders above) ────────── + bar_h = int(rect.height * _BAR_H_FRAC) + bar_y = int(cy - bar_h / 2) + bar_col = NeonTheme.glow(60) + rl.draw_rectangle(int(cx - _SLOT_W / 2), bar_y, _BAR_W, bar_h, bar_col) + rl.draw_rectangle(int(cx + _SLOT_W / 2), bar_y, _BAR_W, bar_h, bar_col) + + # ── Title — centred above the bars, no underline ────────────────────────── + title_w = int(measure_text_cached(self._font_medium, self._title, _TITLE_FONT_SIZE).x) + tx = int(cx - title_w / 2) + ty = int(rect.y + (bar_y - rect.y) / 2 - _TITLE_FONT_SIZE / 2) + rl.draw_text_ex(self._font_medium, self._title, + rl.Vector2(tx, ty), _TITLE_FONT_SIZE, 0, + rl.Color(255, 255, 255, 220)) + + # ── Value row ───────────────────────────────────────────────────────────── + animated_idx = self._idx_filter.x + n = len(self._options) + + # centre_int is always the settled target — never flips mid-animation. + # frac drives pixel offset only (how far filter still needs to travel). + centre_int = int(self._idx) + frac = animated_idx - centre_int + + for offset in [-2, -1, 0, 1, 2]: + # Which option index lives in this visual slot? + opt_idx = centre_int + offset + if opt_idx < 0 or opt_idx >= n: + continue + + # Pixel offset from screen centre: slot position minus fractional drift + draw_x_off = (offset - frac) * _SLOT_SPACING + + label = self._options[opt_idx] + abs_offset = abs(offset - frac) # fractional distance from visual centre + + # Font size and alpha interpolated by distance + if abs_offset < 0.5: + font_sz = int(_SIDE1_FONT_SIZE + (_CENTRE_FONT_SIZE - _SIDE1_FONT_SIZE) * (1 - abs_offset * 2)) + alpha = int(_SIDE1_ALPHA + (_CENTRE_ALPHA - _SIDE1_ALPHA) * (1 - abs_offset * 2)) + weight = FontWeight.DISPLAY + elif abs_offset < 1.5: + t = abs_offset - 0.5 + font_sz = int(_SIDE2_FONT_SIZE + (_SIDE1_FONT_SIZE - _SIDE2_FONT_SIZE) * (1 - t)) + alpha = int(_SIDE2_ALPHA + (_SIDE1_ALPHA - _SIDE2_ALPHA) * (1 - t)) + weight = FontWeight.DISPLAY + else: + font_sz = _SIDE2_FONT_SIZE + alpha = _SIDE2_ALPHA + weight = FontWeight.DISPLAY + + # Apply press-zoom scale to the centre value only + scale = 1.0 + (self._scale_filter.x - 1.0) * max(0.0, 1.0 - abs_offset * 2) + font_sz = max(8, int(font_sz * scale)) + + font = gui_app.font(weight) + tw = int(measure_text_cached(font, label, font_sz).x) + th = font_sz + draw_x = int(cx + draw_x_off - tw / 2) + draw_y = int(cy - th / 2) + + rl.draw_text_ex(font, label, + rl.Vector2(draw_x, draw_y), + font_sz, 0, + rl.Color(255, 255, 255, alpha)) + + # ── Unit label below centre ─────────────────────────────────────────────── + if self._unit: + uw = int(measure_text_cached(self._font_roman, self._unit, _UNIT_FONT_SIZE).x) + rl.draw_text_ex(self._font_roman, self._unit, + rl.Vector2(int(cx - uw / 2), int(cy + _CENTRE_FONT_SIZE / 2 + 8)), + _UNIT_FONT_SIZE, 0, + rl.Color(255, 255, 255, 140)) + + # ── Subtle neon glow on centre slot ─────────────────────────────────────── + slot_rect = rl.Rectangle(cx - _SLOT_W / 2 - 1, bar_y, _SLOT_W + 2, bar_h) + rl.draw_rectangle_gradient_h( + int(slot_rect.x), int(slot_rect.y), + int(slot_rect.width // 2), int(slot_rect.height), + rl.BLANK, NeonTheme.glow_outer(40), + ) + rl.draw_rectangle_gradient_h( + int(slot_rect.x + slot_rect.width // 2), int(slot_rect.y), + int(slot_rect.width // 2), int(slot_rect.height), + NeonTheme.glow_outer(40), rl.BLANK, + ) + + return self._ret diff --git a/iqpilot/selfdrive/ui/mici/widgets/pairing_dialog.py b/iqpilot/selfdrive/ui/mici/widgets/pairing_dialog.py new file mode 100644 index 000000000..0c76e3beb --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/widgets/pairing_dialog.py @@ -0,0 +1,196 @@ +import pyray as rl +import qrcode +import numpy as np +import time +import jwt +import os +from datetime import datetime, timedelta, UTC + +from iqpilot.common.api.base import BaseApi +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.params import Params +from iqpilot.konn3kt.registration import get_or_create_dongle_id, ensure_dev_pairing_identity +from iqpilot.system.hardware import HARDWARE, PC +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.widgets import NavWidget +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.widgets.label import MiciLabel +from iqpilot.system.ui.lib.multilang import tr + + +class PairingDialog(NavWidget): + """Dialog for device pairing with QR code.""" + + QR_REFRESH_INTERVAL = 300 # 5 minutes in seconds + + def __init__(self): + super().__init__() + self.set_back_callback(lambda: gui_app.set_modal_overlay(None)) + self._params = Params() + self._qr_texture: rl.Texture | None = None + self._last_qr_generation = float("-inf") + + self._txt_pair = gui_app.texture("icons_mici/settings/device/pair.png", 84, 64) + self._pair_label = MiciLabel(tr("pair with Konn3kt"), 48, font_weight=FontWeight.BOLD, + color=rl.Color(255, 255, 255, int(255 * 0.9)), line_height=40, wrap_text=True) + + def _get_pairing_url(self) -> str: + dev_pairing = PC and os.getenv("KONN3KT_DEV_PAIRING") == "1" + if dev_pairing: + try: + ensure_dev_pairing_identity(self._params, force_reset=os.getenv("KONN3KT_DEV_PAIRING_RESET") == "1") + except Exception: + return "error://dev_identity_setup_failed" + + try: + imei1 = HARDWARE.get_imei(0) or "" + except Exception as e: + cloudlog.warning(f"Failed to get imei1: {e}") + imei1 = "" + + try: + imei2 = HARDWARE.get_imei(1) or "" + except Exception as e: + cloudlog.warning(f"Failed to get imei2: {e}") + imei2 = "" + + try: + algorithm, private_key, public_key = BaseApi.get_key_pair() + if not private_key or not algorithm: + cloudlog.error("No device keys found") + return "error://keys_not_found" + + dongle_id = get_or_create_dongle_id(self._params, prefer_readonly=True) + + try: + serial = HARDWARE.get_serial() or "" + except Exception as e: + cloudlog.warning(f"Failed to get serial: {e}") + serial = "" + if not serial: + serial = (self._params.get("HardwareSerial") or "") if dev_pairing else "" + if not serial: + cloudlog.error("No hardware serial found, cannot generate pairing token") + return "error://serial_not_found" + + now = datetime.now(UTC).replace(tzinfo=None) + payload = { + 'identity': dongle_id, + 'nbf': now, + 'iat': now, + 'imei': imei1, + 'imei2': imei2, + 'serial': serial, + 'public_key': public_key, + 'register': True, + 'exp': now + timedelta(hours=1), + } + + try: + token = jwt.encode(payload, private_key, algorithm=algorithm) + except Exception as e: + cloudlog.warning(f"jwt.encode failed ({e}), retrying with normalized key") + try: + from cryptography.hazmat.primitives import serialization + key_bytes = private_key.encode("utf-8") if isinstance(private_key, str) else private_key + try: + key_obj = serialization.load_pem_private_key(key_bytes, password=None) + except Exception: + key_obj = serialization.load_ssh_private_key(key_bytes, password=None) + token = jwt.encode(payload, key_obj, algorithm=algorithm) + except Exception as e2: + cloudlog.error(f"Failed to generate pairing token: {e2}") + return "error://token_generation_failed" + if isinstance(token, bytes): + token = token.decode('utf8') + return f"https://konn3kt.com/?pair={token}" + except FileNotFoundError as e: + cloudlog.error(f"Key files not found: {e}") + return "error://keys_not_found" + except Exception as e: + cloudlog.error(f"Failed to generate pairing token: {e}") + return "error://token_generation_failed" + + def _generate_qr_code(self) -> None: + try: + url = self._get_pairing_url() + if url.startswith("error://"): + cloudlog.warning(f"Cannot generate QR code: {url}") + self._qr_texture = None + return + + qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=0) + qr.add_data(url) + qr.make(fit=True) + + pil_img = qr.make_image(fill_color="white", back_color="black").convert('RGBA') + img_array = np.array(pil_img, dtype=np.uint8) + + if self._qr_texture and self._qr_texture.id != 0: + rl.unload_texture(self._qr_texture) + + rl_image = rl.Image() + rl_image.data = rl.ffi.cast("void *", img_array.ctypes.data) + rl_image.width = pil_img.width + rl_image.height = pil_img.height + rl_image.mipmaps = 1 + rl_image.format = rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 + + self._qr_texture = rl.load_texture_from_image(rl_image) + except Exception as e: + cloudlog.warning(f"QR code generation failed: {e}") + self._qr_texture = None + + def _check_qr_refresh(self) -> None: + current_time = time.monotonic() + if current_time - self._last_qr_generation >= self.QR_REFRESH_INTERVAL: + self._generate_qr_code() + self._last_qr_generation = current_time + + def _update_state(self): + super()._update_state() + if ui_state.prime_state.is_paired(): + self._playing_dismiss_animation = True + + def _render(self, rect: rl.Rectangle) -> int: + self._check_qr_refresh() + + self._render_qr_code() + + label_x = self._rect.x + 8 + self._rect.height + 24 + self._pair_label.set_width(int(self._rect.width - label_x)) + self._pair_label.set_position(label_x, self._rect.y + 16) + self._pair_label.render() + + rl.draw_texture_ex(self._txt_pair, rl.Vector2(label_x, self._rect.y + self._rect.height - self._txt_pair.height - 16), + 0.0, 1.0, rl.Color(255, 255, 255, int(255 * 0.35))) + + return -1 + + def _render_qr_code(self) -> None: + if not self._qr_texture: + error_font = gui_app.font(FontWeight.BOLD) + rl.draw_text_ex( + error_font, "QR Code Error", rl.Vector2(self._rect.x + 20, self._rect.y + self._rect.height // 2 - 15), 30, 0.0, rl.RED + ) + return + + scale = self._rect.height / self._qr_texture.height + pos = rl.Vector2(self._rect.x + 8, self._rect.y) + rl.draw_texture_ex(self._qr_texture, pos, 0.0, scale, rl.WHITE) + + def __del__(self): + if self._qr_texture and self._qr_texture.id != 0: + rl.unload_texture(self._qr_texture) + + +if __name__ == "__main__": + gui_app.init_window("pairing device") + pairing = PairingDialog() + try: + for _ in gui_app.render(): + result = pairing.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + if result != -1: + break + finally: + del pairing diff --git a/iqpilot/selfdrive/ui/mici/widgets/side_button.py b/iqpilot/selfdrive/ui/mici/widgets/side_button.py new file mode 100644 index 000000000..ad1d557a7 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/widgets/side_button.py @@ -0,0 +1,31 @@ +import pyray as rl +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.lib.application import gui_app + +# --------------------------------------------------------------------------- +# Constants extracted from the original Qt style +# --------------------------------------------------------------------------- +# TODO: this should be corrected, but Scroller relies on this being incorrect :/ +WIDTH, HEIGHT = 112, 240 + + +class SideButton(Widget): + def __init__(self, btn_type: str): + super().__init__() + self.type = btn_type + self.set_rect(rl.Rectangle(0, 0, WIDTH, HEIGHT)) + + # load pre-rendered button images + if btn_type not in ("check", "back"): + btn_type = "back" + btn_img_path = f"icons_mici/buttons/button_side_{btn_type}.png" + btn_img_pressed_path = f"icons_mici/buttons/button_side_{btn_type}_pressed.png" + self._txt_btn, self._txt_btn_back = gui_app.texture(btn_img_path, 100, 224), gui_app.texture(btn_img_pressed_path, 100, 224) + + def _render(self, _) -> bool: + x = int(self._rect.x + 12) + y = int(self._rect.y + (self._rect.height - self._txt_btn.height) / 2) + rl.draw_texture(self._txt_btn if not self.is_pressed else self._txt_btn_back, + x, y, rl.WHITE) + + return False diff --git a/iqpilot/selfdrive/ui/mici/widgets/stock_button.py b/iqpilot/selfdrive/ui/mici/widgets/stock_button.py new file mode 100644 index 000000000..9aa73f4ae --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/widgets/stock_button.py @@ -0,0 +1,538 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import math +import pyray as rl +from typing import Union +from enum import Enum +from collections.abc import Callable +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.widgets.scroller import DO_ZOOM +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.common.filter_simple import BounceFilter +from iqpilot.ui.theme import NeonTheme + +try: + from iqpilot.common.params import Params, UnknownKeyName +except ImportError: + Params = None + class UnknownKeyName(Exception): + pass + +SCROLLING_SPEED_PX_S = 50 +COMPLICATION_SIZE = 36 +LABEL_COLOR = rl.Color(255, 255, 255, int(255 * 0.9)) +COMPLICATION_GREY = rl.Color(0xAA, 0xAA, 0xAA, 255) +PRESSED_SCALE = 1.15 if DO_ZOOM else 1.07 + +_FORCE_ACCENT_RGB = None + +_ACCENT_ROUND = 0.34 +_ACCENT_INSET = 6 +_GLOW_OUT = 3 +_GLOW_IN = 12 +_GLOW_IN_IDLE = 4 +_GLOW_OUT_ALPHA = 32 +_GLOW_IN_ALPHA = 80 +_RIM_ALPHA = 200 +_GLOW_SEGS = 16 +_GLOW_CORNER_SEGS = 16 + + +def _accent_rgb() -> tuple[int, int, int]: + if _FORCE_ACCENT_RGB is not None: + return _FORCE_ACCENT_RGB + c = NeonTheme.glow(255) + return (c.r, c.g, c.b) + + +def _inset(rect: rl.Rectangle, px: float) -> rl.Rectangle: + return rl.Rectangle(rect.x + px, rect.y + px, rect.width - 2 * px, rect.height - 2 * px) + + +_BOX_BG = rl.Color(0x08, 0x09, 0x0A, 255) +_BOX_BG_PRESSED = rl.Color(0x16, 0x18, 0x1A, 255) +_BOX_BG_DISABLED = rl.Color(0x05, 0x06, 0x07, 255) + + +def _draw_accent_box(rect: rl.Rectangle, enabled: bool, pressed: bool): + """Clean dark rounded box + smooth teal glow (matches the concept). Same roundness + for box and glow → no seam. `rect` is the final box rect.""" + base = 1.0 if enabled else 0.4 + r, g, b = _accent_rgb() + + # keep every concentric ring's corner radius offset by exactly its inset, so the + # rings stay parallel at the corners too (a fixed roundness fraction would shrink + # the corner radius unevenly and leave a dark seam in each corner) + shorter = min(rect.width, rect.height) + base_radius = _ACCENT_ROUND * shorter / 2.0 + + def _round_for(short_side: float, radius: float) -> float: + return max(0.0, min(1.0, 2.0 * radius / short_side)) if short_side > 0 else 0.0 + + for px in range(_GLOW_OUT, 0, -1): + f = px / _GLOW_OUT + a = int(_GLOW_OUT_ALPHA * base * (1.0 - f) ** 2.0) + if a <= 0: + continue + ex = rl.Rectangle(rect.x - px, rect.y - px, rect.width + 2 * px, rect.height + 2 * px) + rl.draw_rectangle_rounded(ex, _round_for(shorter + 2 * px, base_radius + px), _GLOW_SEGS, rl.Color(r, g, b, a)) + + bg = _BOX_BG_PRESSED if pressed else (_BOX_BG if enabled else _BOX_BG_DISABLED) + rl.draw_rectangle_rounded(rect, _round_for(shorter, base_radius), _GLOW_SEGS, bg) + + for px in range(_GLOW_IN, 0, -1): + f = px / _GLOW_IN + a = int(_GLOW_IN_ALPHA * base * (1.0 - f) ** 1.8) + if a <= 0: + continue + rl.draw_rectangle_rounded_lines_ex(_inset(rect, px), _round_for(shorter - 2 * px, base_radius - px), + _GLOW_CORNER_SEGS, 3, rl.Color(r, g, b, a)) + + rl.draw_rectangle_rounded_lines_ex(rect, _round_for(shorter, base_radius), _GLOW_CORNER_SEGS, 2, + rl.Color(r, g, b, int(_RIM_ALPHA * base))) + + +_CIRCLE_RED_RGB = (0xE0, 0x3A, 0x3A) + + +def _draw_accent_circle(cx: float, cy: float, radius: float, enabled: bool, red: bool = False, pressed: bool = False): + """Circular version of the box accent: teal (or red) rim + inward glow, matching the boxes.""" + base = 1.0 if enabled else 0.4 + r, g, b = _CIRCLE_RED_RGB if red else _accent_rgb() + c = rl.Vector2(cx, cy) + segs = _GLOW_CORNER_SEGS * 2 + for px in range(_GLOW_OUT, 0, -1): + a = int(_GLOW_OUT_ALPHA * base * (1.0 - px / _GLOW_OUT) ** 2.0) + if a > 0: + rl.draw_ring(c, radius + px - 1.0, radius + px + 1.0, 0, 360, segs, rl.Color(r, g, b, a)) + glow_in = _GLOW_IN if pressed else _GLOW_IN_IDLE + for px in range(glow_in, 0, -1): + a = int(_GLOW_IN_ALPHA * base * (1.0 - px / glow_in) ** 1.8) + if a > 0: + rl.draw_ring(c, radius - px - 1.5, radius - px + 1.5, 0, 360, segs, rl.Color(r, g, b, a)) + rl.draw_ring(c, radius - 1.5, radius + 1.5, 0, 360, segs, rl.Color(r, g, b, int(_RIM_ALPHA * base))) + + +class ScrollState(Enum): + PRE_SCROLL = 0 + SCROLLING = 1 + POST_SCROLL = 2 + + +class BigCircleButton(Widget): + def __init__(self, icon: rl.Texture, red: bool = False, icon_offset: tuple[int, int] = (0, 0)): + super().__init__() + self._red = red + self._icon_offset = icon_offset + + self.set_rect(rl.Rectangle(0, 0, 180, 180)) + self._scale_filter = BounceFilter(1.0, 0.1, 1 / gui_app.target_fps) + self._click_delay = 0.075 + + self._txt_icon = icon + self._txt_btn_disabled_bg = gui_app.texture("icons_mici/buttons/button_circle_disabled.png", 180, 180) + + self._txt_btn_bg = gui_app.texture("icons_mici/buttons/button_circle.png", 180, 180) + self._txt_btn_pressed_bg = gui_app.texture("icons_mici/buttons/button_circle_pressed.png", 180, 180) + + self._txt_btn_red_bg = gui_app.texture("icons_mici/buttons/button_circle_red.png", 180, 180) + self._txt_btn_red_pressed_bg = gui_app.texture("icons_mici/buttons/button_circle_red_pressed.png", 180, 180) + + def _draw_content(self, btn_x: float, btn_y: float, btn_width: float, btn_height: float): + icon_color = rl.Color(255, 255, 255, int(255 * 0.9)) if self.enabled else rl.Color(255, 255, 255, int(255 * 0.35)) + rl.draw_texture_ex(self._txt_icon, (btn_x + (btn_width - self._txt_icon.width) / 2 + self._icon_offset[0], + btn_y + (btn_height - self._txt_icon.height) / 2 + self._icon_offset[1]), 0, 1.0, icon_color) + + def _render(self, _): + txt_bg = self._txt_btn_bg if not self._red else self._txt_btn_red_bg + if not self.enabled: + txt_bg = self._txt_btn_disabled_bg + elif self.is_pressed: + txt_bg = self._txt_btn_pressed_bg if not self._red else self._txt_btn_red_pressed_bg + + scale = self._scale_filter.update(PRESSED_SCALE if self.is_pressed else 1.0) + btn_x = self._rect.x + (self._rect.width * (1 - scale)) / 2 + btn_y = self._rect.y + (self._rect.height * (1 - scale)) / 2 + rl.draw_texture_ex(txt_bg, (btn_x, btn_y), 0, scale, rl.WHITE) + + cx = btn_x + self._rect.width * scale / 2.0 + cy = btn_y + self._rect.height * scale / 2.0 + _draw_accent_circle(cx, cy, self._rect.width * scale / 2.0 - _ACCENT_INSET, self.enabled, self._red, self.is_pressed) + + self._draw_content(btn_x, btn_y, self._rect.width * scale, self._rect.height * scale) + + +class BigCircleToggle(BigCircleButton): + def __init__(self, icon: rl.Texture, toggle_callback: Callable | None = None, icon_offset: tuple[int, int] = (0, 0)): + super().__init__(icon, False, icon_offset=icon_offset) + self._toggle_callback = toggle_callback + + self._checked = False + + self._txt_toggle_enabled = gui_app.texture("icons_mici/buttons/toggle_dot_enabled.png", 66, 66) + self._txt_toggle_disabled = gui_app.texture("icons_mici/buttons/toggle_dot_disabled.png", 66, 66) + + def set_checked(self, checked: bool): + self._checked = checked + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + self._checked = not self._checked + if self._toggle_callback: + self._toggle_callback(self._checked) + + def _draw_content(self, btn_x: float, btn_y: float, btn_width: float, btn_height: float): + super()._draw_content(btn_x, btn_y, btn_width, btn_height) + + rl.draw_texture_ex(self._txt_toggle_enabled if self._checked else self._txt_toggle_disabled, + (btn_x + (btn_width - self._txt_toggle_enabled.width) / 2, btn_y + 5), + 0, 1.0, rl.WHITE) + + +class BigButton(Widget): + LABEL_HORIZONTAL_PADDING = 40 + LABEL_VERTICAL_PADDING = 23 + + """A lightweight stand-in for the Qt BigButton, drawn & updated each frame.""" + + def __init__(self, text: str, value: str = "", icon: Union[rl.Texture, None] = None, scroll: bool = False): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, 402, 180)) + self.text = text + self.value = value + self._txt_icon = icon + self._scroll = scroll + self._press_effect_enabled = True + + self._scale_filter = BounceFilter(1.0, 0.1, 1 / gui_app.target_fps) + self._click_delay = 0.075 + self._shake_start: float | None = None + self._grow_animation_until: float | None = None + + self._rotate_icon_t: float | None = None + + self._label = UnifiedLabel(text, font_size=self._get_label_font_size(), font_weight=FontWeight.BOLD, + text_color=LABEL_COLOR, alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM, scroll=scroll, + line_height=0.9) + self._sub_label = UnifiedLabel(value, font_size=COMPLICATION_SIZE, font_weight=FontWeight.ROMAN, + text_color=COMPLICATION_GREY, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM, + wrap_text=False, scroll=True) + self._update_label_layout() + + self._load_images() + + def set_icon(self, icon: Union[rl.Texture, None]): + self._txt_icon = icon + + def set_rotate_icon(self, rotate: bool): + if rotate and self._rotate_icon_t is not None: + return + self._rotate_icon_t = rl.get_time() if rotate else None + + def set_press_effect_enabled(self, enabled: bool) -> None: + self._press_effect_enabled = enabled + + def set_scroll_active(self, active: bool) -> None: + self._label.set_scroll_active(active) + + def _load_images(self): + self._txt_default_bg = gui_app.texture("icons_mici/buttons/button_rectangle.png", 402, 180) + self._txt_pressed_bg = gui_app.texture("icons_mici/buttons/button_rectangle_pressed.png", 402, 180) + self._txt_disabled_bg = gui_app.texture("icons_mici/buttons/button_rectangle_disabled.png", 402, 180) + + def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: + super().set_touch_valid_callback(lambda: touch_callback() and self._grow_animation_until is None) + + def _width_hint(self) -> int: + icon_size = self._txt_icon.width if self._txt_icon and self._scroll and self.value else 0 + return int(self._rect.width - self.LABEL_HORIZONTAL_PADDING * 2 - icon_size) + + def _get_label_font_size(self): + if len(self.text) <= 18: + return 48 + else: + return 42 + + def _update_label_layout(self): + self._label.set_font_size(self._get_label_font_size()) + if self.value: + self._label.set_alignment_vertical(rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP) + else: + self._label.set_alignment_vertical(rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM) + + def set_text(self, text: str): + self.text = text + self._label.set_text(text) + self._update_label_layout() + + def set_value(self, value: str): + self.value = value + self._sub_label.set_text(value) + self._update_label_layout() + + def get_value(self) -> str: + return self.value + + def get_text(self): + return self.text + + def trigger_shake(self): + self._shake_start = rl.get_time() + + def trigger_grow_animation(self, duration: float = 0.65): + self._grow_animation_until = rl.get_time() + duration + + @property + def _shake_offset(self) -> float: + SHAKE_DURATION = 0.5 + SHAKE_AMPLITUDE = 24.0 + SHAKE_FREQUENCY = 32.0 + if self._shake_start is None: + return 0.0 + t = rl.get_time() - self._shake_start + if t > SHAKE_DURATION: + return 0.0 + decay = 1.0 - t / SHAKE_DURATION + return decay * SHAKE_AMPLITUDE * math.sin(t * SHAKE_FREQUENCY) + + def set_position(self, x: float, y: float) -> None: + super().set_position(x + self._shake_offset, y) + + def _handle_background(self) -> tuple[rl.Texture, float, float, float]: + if self._grow_animation_until is not None: + if rl.get_time() >= self._grow_animation_until: + self._grow_animation_until = None + + txt_bg = self._txt_default_bg + if not self.enabled: + txt_bg = self._txt_disabled_bg + elif self.is_pressed and self._press_effect_enabled: + txt_bg = self._txt_pressed_bg + + pressed_scale = self.is_pressed and self._press_effect_enabled + animate_scale = pressed_scale or self._grow_animation_until is not None + scale = self._scale_filter.update(PRESSED_SCALE if animate_scale else 1.0) + btn_x = self._rect.x + (self._rect.width * (1 - scale)) / 2 + btn_y = self._rect.y + (self._rect.height * (1 - scale)) / 2 + return txt_bg, btn_x, btn_y, scale + + def _draw_content(self, btn_x: float, btn_y: float, btn_width: float, btn_height: float): + label_x = btn_x + self.LABEL_HORIZONTAL_PADDING + + label_color = LABEL_COLOR if self.enabled else rl.Color(255, 255, 255, int(255 * 0.35)) + self._label.set_color(label_color) + label_rect = rl.Rectangle(label_x, btn_y + self.LABEL_VERTICAL_PADDING, self._width_hint(), + btn_height - self.LABEL_VERTICAL_PADDING * 2) + self._label.render(label_rect) + + if self.value: + label_y = btn_y + self.LABEL_VERTICAL_PADDING + self._label.get_content_height(self._width_hint()) + sub_label_height = btn_y + btn_height - self.LABEL_VERTICAL_PADDING - label_y + sub_label_rect = rl.Rectangle(label_x, label_y, self._width_hint(), sub_label_height) + self._sub_label.render(sub_label_rect) + + if self._txt_icon: + rotation = 0 + if self._rotate_icon_t is not None: + rotation = (rl.get_time() - self._rotate_icon_t) * 180 + + x = btn_x + btn_width - 30 - self._txt_icon.width / 2 + y = btn_y + 30 + self._txt_icon.height / 2 + source_rec = rl.Rectangle(0, 0, self._txt_icon.width, self._txt_icon.height) + dest_rec = rl.Rectangle(x, y, self._txt_icon.width, self._txt_icon.height) + origin = rl.Vector2(self._txt_icon.width / 2, self._txt_icon.height / 2) + rl.draw_texture_pro(self._txt_icon, source_rec, dest_rec, origin, rotation, rl.Color(255, 255, 255, int(255 * 0.9))) + + def _render(self, _): + txt_bg, btn_x, btn_y, scale = self._handle_background() + + cell = rl.Rectangle(btn_x, btn_y, self._rect.width * scale, self._rect.height * scale) + box_rect = _inset(cell, _ACCENT_INSET) + _draw_accent_box(box_rect, self.enabled, self.is_pressed) + + # Clip each card's content to its own bounds so long/scrolling labels from one + # tile cannot bleed into neighboring tiles in the horizontal scroller. + content_rect = _inset(box_rect, 2) + rl.begin_scissor_mode(int(content_rect.x), int(content_rect.y), int(content_rect.width), int(content_rect.height)) + self._draw_content(btn_x, btn_y, cell.width, cell.height) + rl.end_scissor_mode() + + +class BigToggle(BigButton): + def __init__(self, text: str, value: str = "", initial_state: bool = False, toggle_callback: Callable | None = None): + super().__init__(text, value, "") + self._checked = initial_state + self._toggle_callback = toggle_callback + + def _load_images(self): + super()._load_images() + self._txt_enabled_toggle = gui_app.texture("icons_mici/buttons/toggle_pill_enabled.png", 84, 66) + self._txt_disabled_toggle = gui_app.texture("icons_mici/buttons/toggle_pill_disabled.png", 84, 66) + + def set_checked(self, checked: bool): + self._checked = checked + + def _width_hint(self) -> int: + return int(self._rect.width - self.LABEL_HORIZONTAL_PADDING * 2 - self._txt_enabled_toggle.width) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + self._checked = not self._checked + if self._toggle_callback: + self._toggle_callback(self._checked) + + def _draw_pill(self, x: float, y: float, checked: bool): + if checked: + rl.draw_texture_ex(self._txt_enabled_toggle, (x, y), 0, 1.0, rl.WHITE) + else: + rl.draw_texture_ex(self._txt_disabled_toggle, (x, y), 0, 1.0, rl.WHITE) + + def _draw_content(self, btn_x: float, btn_y: float, btn_width: float, btn_height: float): + super()._draw_content(btn_x, btn_y, btn_width, btn_height) + + x = btn_x + btn_width - self._txt_enabled_toggle.width + y = btn_y + self._draw_pill(x, y, self._checked) + + +class BigMultiToggle(BigToggle): + def __init__(self, text: str, options: list[str], toggle_callback: Callable | None = None, + select_callback: Callable | None = None): + super().__init__(text, "", toggle_callback=toggle_callback) + assert len(options) > 0 + self._options = options + self._select_callback = select_callback + + self.set_value(self._options[0]) + + def _width_hint(self) -> int: + return int(self._rect.width - self.LABEL_HORIZONTAL_PADDING * 2 - self._txt_enabled_toggle.width) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + cur_idx = self._options.index(self.value) + new_idx = (cur_idx + 1) % len(self._options) + self.set_value(self._options[new_idx]) + if self._select_callback: + self._select_callback(self.value) + + def _draw_content(self, btn_x: float, btn_y: float, btn_width: float, btn_height: float): + BigButton._draw_content(self, btn_x, btn_y, btn_width, btn_height) + + checked_idx = self._options.index(self.value) + + x = btn_x + btn_width - self._txt_enabled_toggle.width + y = btn_y + + for i in range(len(self._options)): + self._draw_pill(x, y, checked_idx == i) + y += 35 + + +class GreyBigButton(BigButton): + """Users should manage newlines with this class themselves""" + + LABEL_HORIZONTAL_PADDING = 30 + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.set_touch_valid_callback(lambda: False) + + self._rect.width = 476 + + self._label.set_font_size(36) + self._label.set_font_weight(FontWeight.BOLD) + self._label.set_line_height(1.0) + + self._sub_label.set_font_size(36) + self._sub_label.set_text_color(rl.Color(255, 255, 255, int(255 * 0.9))) + self._sub_label.set_font_weight(FontWeight.DISPLAY_REGULAR) + self._sub_label.set_alignment_vertical(rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE if not self._label.text else + rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM) + self._sub_label.set_line_height(0.95) + + @property + def LABEL_VERTICAL_PADDING(self): + return BigButton.LABEL_VERTICAL_PADDING if self._label.text else 18 + + def _width_hint(self) -> int: + return int(self._rect.width - self.LABEL_HORIZONTAL_PADDING * 2) + + def _get_label_font_size(self): + return 36 + + def _render(self, _): + rl.draw_rectangle_rounded(self._rect, 0.4, 10, rl.Color(255, 255, 255, int(255 * 0.15))) + self._draw_content(self._rect.x, self._rect.y, self._rect.width, self._rect.height) + + +class BigMultiParamToggle(BigMultiToggle): + def __init__(self, text: str, param: str, options: list[str], toggle_callback: Callable | None = None, + select_callback: Callable | None = None): + super().__init__(text, options, toggle_callback, select_callback) + self._param = param + + self._params = Params() + self._load_value() + + def _load_value(self): + self.set_value(self._options[self._params.get(self._param) or 0]) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + new_idx = self._options.index(self.value) + self._params.put(self._param, new_idx) + + +class BigParamControl(BigToggle): + def __init__(self, text: str, param: str, toggle_callback: Callable | None = None): + super().__init__(text, "", toggle_callback=toggle_callback) + self.param = param + self.params = Params() + self.set_checked(self._read_bool()) + + def _read_bool(self) -> bool: + try: + return self.params.get_bool(self.param) + except UnknownKeyName: + return False + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + try: + self.params.put_bool(self.param, self._checked) + except UnknownKeyName: + pass + + def refresh(self): + self.set_checked(self._read_bool()) + + +class BigCircleParamControl(BigCircleToggle): + def __init__(self, icon: rl.Texture, param: str, toggle_callback: Callable | None = None, + icon_offset: tuple[int, int] = (0, 0)): + super().__init__(icon, toggle_callback, icon_offset=icon_offset) + self._param = param + self.params = Params() + self.set_checked(self._read_bool()) + + def _read_bool(self) -> bool: + try: + return self.params.get_bool(self._param) + except UnknownKeyName: + return False + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + try: + self.params.put_bool(self._param, self._checked) + except UnknownKeyName: + pass + + def refresh(self): + self.set_checked(self._read_bool()) diff --git a/iqpilot/selfdrive/ui/mici/widgets/stock_dialog.py b/iqpilot/selfdrive/ui/mici/widgets/stock_dialog.py new file mode 100644 index 000000000..2d69bedb5 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/widgets/stock_dialog.py @@ -0,0 +1,264 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import abc +import math +import pyray as rl +from typing import Union +from collections.abc import Callable +from iqpilot.system.ui.widgets.nav_widget import NavWidget +from iqpilot.system.ui.lib.raylib_compat import draw_rectangle_gradient_ex +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.widgets.mici_keyboard import MiciKeyboard +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.widgets.slider import RedBigSlider, BigSlider +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigCircleButton, BigButton, GreyBigButton + +DEBUG = False + +PADDING = 20 + + +class BigDialogBase(NavWidget, abc.ABC): + def __init__(self): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + + +class BigDialog(BigDialogBase): + def __init__(self, title: str, description: str, icon: Union[rl.Texture, None] = None): + super().__init__() + self._card = GreyBigButton(title, description, icon) + + def _render(self, _): + self._card.render(rl.Rectangle( + self._rect.x + self._rect.width / 2 - self._card.rect.width / 2, + self._rect.y + self._rect.height / 2 - self._card.rect.height / 2, + self._card.rect.width, + self._card.rect.height, + )) + + +class BigConfirmationDialog(BigDialogBase): + def __init__(self, title: str, icon: rl.Texture, confirm_callback: Callable[[], None], + exit_on_confirm: bool = True, red: bool = False): + super().__init__() + self._confirm_callback = confirm_callback + self._exit_on_confirm = exit_on_confirm + + self._slider: BigSlider | RedBigSlider + if red: + self._slider = self._child(RedBigSlider(title, icon, confirm_callback=self._on_confirm)) + else: + self._slider = self._child(BigSlider(title, icon, confirm_callback=self._on_confirm)) + self._slider.set_enabled(lambda: self.enabled and not self.is_dismissing) # for nav stack + NavWidget + + def _on_confirm(self): + if self._exit_on_confirm: + self.dismiss(self._confirm_callback) + elif self._confirm_callback: + self._confirm_callback() + + def _update_state(self): + super()._update_state() + if self.is_dismissing and not self._slider.confirmed: + self._slider.reset() + + def _render(self, _): + self._slider.render(self._rect) + + +class BigInputDialog(BigDialogBase): + BACK_TOUCH_AREA_PERCENTAGE = 1.0 + BACKSPACE_RATE = 25 # hz + TEXT_INPUT_SIZE = 35 + INTRO_DURATION_S = 0.14 + INTRO_OFFSET_Y = 20 + + def __init__(self, + hint: str, + default_text: str = "", + minimum_length: int = 1, + confirm_callback: Callable[[str], None] | None = None, + auto_return_to_letters: str = ""): + super().__init__() + self._hint_label = UnifiedLabel(hint, font_size=35, text_color=rl.Color(255, 255, 255, int(255 * 0.35)), + font_weight=FontWeight.MEDIUM) + self._keyboard = MiciKeyboard(auto_return_to_letters=auto_return_to_letters) + self._keyboard.set_text(default_text) + self._keyboard.set_enabled(lambda: self.enabled and not self.is_dismissing) # for nav stack + NavWidget + self._minimum_length = minimum_length + + self._backspace_held_time: float | None = None + + self._backspace_img = gui_app.texture("icons_mici/settings/keyboard/backspace.png", 42, 36) + self._backspace_img_alpha = FirstOrderFilter(0, 0.05, 1 / gui_app.target_fps) + + self._enter_img = gui_app.texture("icons_mici/settings/keyboard/enter.png", 76, 62) + self._enter_disabled_img = gui_app.texture("icons_mici/settings/keyboard/enter_disabled.png", 76, 62) + self._enter_img_alpha = FirstOrderFilter(0, 0.05, 1 / gui_app.target_fps) + + # rects for top buttons + self._top_left_button_rect = rl.Rectangle(0, 0, 0, 0) + self._top_right_button_rect = rl.Rectangle(0, 0, 0, 0) + self._intro_started_at = 0.0 + + def confirm_callback_wrapper(): + text = self._keyboard.text() + self.dismiss((lambda: confirm_callback(text)) if confirm_callback else None) + self._confirm_callback = confirm_callback_wrapper + + def show_event(self): + super().show_event() + self.settle_to_top() + self._intro_started_at = rl.get_time() + + def _intro_progress(self) -> float: + if self._intro_started_at <= 0.0: + return 1.0 + return min(max((rl.get_time() - self._intro_started_at) / self.INTRO_DURATION_S, 0.0), 1.0) + + def _update_state(self): + super()._update_state() + + if self.is_dismissing: + self._backspace_held_time = None + return + + last_mouse_event = gui_app.last_mouse_event + if last_mouse_event.left_down and rl.check_collision_point_rec(last_mouse_event.pos, self._top_right_button_rect) and self._backspace_img_alpha.x > 1: + if self._backspace_held_time is None: + self._backspace_held_time = rl.get_time() + + if rl.get_time() - self._backspace_held_time > 0.5: + if gui_app.frame % round(gui_app.target_fps / self.BACKSPACE_RATE) == 0: + self._keyboard.backspace() + + else: + self._backspace_held_time = None + + def _render(self, _): + intro_progress = self._intro_progress() + intro_offset_y = (1.0 - intro_progress) * self.INTRO_OFFSET_Y + intro_alpha = max(int(255 * intro_progress), 1) + + # draw current text so far below everything. text floats left but always stays in view + text = self._keyboard.text() + candidate_char = self._keyboard.get_candidate_character() + text_size = measure_text_cached(gui_app.font(FontWeight.ROMAN), text + candidate_char or self._hint_label.text, self.TEXT_INPUT_SIZE) + + bg_block_margin = 5 + text_x = PADDING / 2 + self._enter_img.width + PADDING + text_field_rect = rl.Rectangle(text_x, self._rect.y + PADDING - bg_block_margin + intro_offset_y, + self._rect.width - text_x * 2, + text_size.y) + + # draw text input + # push text left with a gradient on left side if too long + if text_size.x > text_field_rect.width: + text_x -= text_size.x - text_field_rect.width + + rl.begin_scissor_mode(int(text_field_rect.x), int(text_field_rect.y), int(text_field_rect.width), int(text_field_rect.height)) + rl.draw_text_ex(gui_app.font(FontWeight.ROMAN), text, rl.Vector2(text_x, text_field_rect.y), self.TEXT_INPUT_SIZE, 0, + rl.Color(255, 255, 255, intro_alpha)) + + # draw grayed out character user is hovering over + if candidate_char: + candidate_char_size = measure_text_cached(gui_app.font(FontWeight.ROMAN), candidate_char, self.TEXT_INPUT_SIZE) + rl.draw_text_ex(gui_app.font(FontWeight.ROMAN), candidate_char, + rl.Vector2(min(text_x + text_size.x, text_field_rect.x + text_field_rect.width) - candidate_char_size.x, text_field_rect.y), + self.TEXT_INPUT_SIZE, 0, rl.Color(255, 255, 255, int(128 * intro_progress))) + + rl.end_scissor_mode() + + # draw gradient on left side to indicate more text + if text_size.x > text_field_rect.width: + draw_rectangle_gradient_ex(rl.Rectangle(text_field_rect.x, text_field_rect.y, 80, text_field_rect.height), + rl.BLACK, rl.BLANK, rl.BLANK, rl.BLACK) + + # draw cursor + blink_alpha = (math.sin(rl.get_time() * 6) + 1) / 2 + if text: + cursor_x = min(text_x + text_size.x + 3, text_field_rect.x + text_field_rect.width) + else: + cursor_x = text_field_rect.x - 6 + rl.draw_rectangle_rounded(rl.Rectangle(cursor_x, text_field_rect.y, 4, text_size.y), + 1, 4, rl.Color(255, 255, 255, int(255 * blink_alpha * intro_progress))) + + # draw backspace icon with nice fade + self._backspace_img_alpha.update(255 * bool(text)) + if self._backspace_img_alpha.x > 1: + color = rl.Color(255, 255, 255, int(self._backspace_img_alpha.x * intro_progress)) + rl.draw_texture_ex(self._backspace_img, rl.Vector2(self._rect.width - self._backspace_img.width - 27, self._rect.y + 14 + intro_offset_y), 0.0, 1.0, color) + + if not text and self._hint_label.text and not candidate_char: + # draw description if no text entered yet and not drawing candidate char + hint_rect = rl.Rectangle(text_field_rect.x, text_field_rect.y, + self._rect.width - text_field_rect.x - PADDING, + text_field_rect.height) + self._hint_label.set_color(rl.Color(255, 255, 255, int(255 * 0.35 * intro_progress))) + self._hint_label.render(hint_rect) + + # TODO: move to update state + # make rect take up entire area so it's easier to click + self._top_left_button_rect = rl.Rectangle(self._rect.x, self._rect.y, text_field_rect.x, self._rect.height - self._keyboard.get_keyboard_height()) + self._top_right_button_rect = rl.Rectangle(text_field_rect.x + text_field_rect.width, self._rect.y, + self._rect.width - (text_field_rect.x + text_field_rect.width), self._top_left_button_rect.height) + + # draw enter button + self._enter_img_alpha.update(255 if len(text) >= self._minimum_length else 0) + color = rl.Color(255, 255, 255, int(self._enter_img_alpha.x * intro_progress)) + rl.draw_texture_ex(self._enter_img, rl.Vector2(self._rect.x + PADDING / 2, self._rect.y + intro_offset_y), 0.0, 1.0, color) + color = rl.Color(255, 255, 255, int((255 - self._enter_img_alpha.x) * intro_progress)) + rl.draw_texture_ex(self._enter_disabled_img, rl.Vector2(self._rect.x + PADDING / 2, self._rect.y + intro_offset_y), 0.0, 1.0, color) + + # keyboard goes over everything + self._keyboard.render(rl.Rectangle(self._rect.x, self._rect.y + intro_offset_y, self._rect.width, self._rect.height)) + + # draw debugging rect bounds + if DEBUG: + rl.draw_rectangle_lines_ex(text_field_rect, 1, rl.Color(100, 100, 100, 255)) + rl.draw_rectangle_lines_ex(self._top_right_button_rect, 1, rl.Color(0, 255, 0, 255)) + rl.draw_rectangle_lines_ex(self._top_left_button_rect, 1, rl.Color(0, 255, 0, 255)) + + def _handle_mouse_press(self, mouse_pos: MousePos): + super()._handle_mouse_press(mouse_pos) + # TODO: need to track where press was so enter and back can activate on release rather than press + # or turn into icon widgets :eyes_open: + + if self.is_dismissing: + return + + # handle backspace icon click + if rl.check_collision_point_rec(mouse_pos, self._top_right_button_rect) and self._backspace_img_alpha.x > 254: + self._keyboard.backspace() + elif rl.check_collision_point_rec(mouse_pos, self._top_left_button_rect) and self._enter_img_alpha.x > 254: + # handle enter icon click + self._confirm_callback() + + +class BigDialogButton(BigButton): + def __init__(self, text: str, value: str = "", icon: Union[str, rl.Texture] = "", description: str = ""): + super().__init__(text, value, icon) + self._description = description + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + dlg = BigDialog(self.text, self._description) + gui_app.push_widget(dlg) + + +class BigConfirmationCircleButton(BigCircleButton): + def __init__(self, title: str, icon: rl.Texture, confirm_callback: Callable[[], None], exit_on_confirm: bool = True, + red: bool = False, icon_offset: tuple[int, int] = (0, 0)): + super().__init__(icon, red, icon_offset) + + def show_confirm_dialog(): + gui_app.push_widget(BigConfirmationDialog(title, icon, confirm_callback, + exit_on_confirm=exit_on_confirm, red=red)) + + self.set_click_callback(show_confirm_dialog) diff --git a/iqpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py b/iqpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py new file mode 100644 index 000000000..f4a731a44 --- /dev/null +++ b/iqpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py @@ -0,0 +1,195 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import os +import pyray as rl +import qrcode +import numpy as np +import time +import jwt +from datetime import datetime, timedelta, UTC + +from iqpilot.common.api.base import BaseApi +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.params import Params +from iqpilot.konn3kt.registration import get_or_create_dongle_id, ensure_dev_pairing_identity +from iqpilot.system.hardware import HARDWARE, PC +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.widgets.nav_widget import NavWidget +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.lib.multilang import tr + + +class PairingDialog(NavWidget): + """Dialog for device pairing with QR code.""" + + QR_REFRESH_INTERVAL = 300 # 5 minutes in seconds + + def __init__(self): + super().__init__() + self._params = Params() + self._qr_texture: rl.Texture | None = None + self._last_qr_generation = float("-inf") + + self._txt_pair = gui_app.texture("icons_mici/settings/device/pair.png", 33, 60) + self._pair_label = UnifiedLabel(tr("pair with Konn3kt"), font_size=48, font_weight=FontWeight.BOLD, line_height=0.8) + + def _get_pairing_url(self) -> str: + dev_pairing = PC and os.getenv("KONN3KT_DEV_PAIRING") == "1" + if dev_pairing: + try: + ensure_dev_pairing_identity(self._params, force_reset=os.getenv("KONN3KT_DEV_PAIRING_RESET") == "1") + except Exception: + return "error://dev_identity_setup_failed" + + try: + imei1 = HARDWARE.get_imei(0) or "" + except Exception as e: + cloudlog.warning(f"Failed to get imei1: {e}") + imei1 = "" + + try: + imei2 = HARDWARE.get_imei(1) or "" + except Exception as e: + cloudlog.warning(f"Failed to get imei2: {e}") + imei2 = "" + + try: + algorithm, private_key, public_key = BaseApi.get_key_pair() + if not private_key or not algorithm: + cloudlog.error("No device keys found") + return "error://keys_not_found" + + dongle_id = get_or_create_dongle_id(self._params, prefer_readonly=True) + + try: + serial = HARDWARE.get_serial() or "" + except Exception as e: + cloudlog.warning(f"Failed to get serial: {e}") + serial = "" + if not serial: + serial = (self._params.get("HardwareSerial") or "") if dev_pairing else "" + if not serial: + cloudlog.error("No hardware serial found, cannot generate pairing token") + return "error://serial_not_found" + + now = datetime.now(UTC).replace(tzinfo=None) + payload = { + 'identity': dongle_id, + 'nbf': now, + 'iat': now, + 'imei': imei1, + 'imei2': imei2, + 'serial': serial, + 'public_key': public_key, + 'register': True, + 'exp': now + timedelta(hours=1), + } + + try: + token = jwt.encode(payload, private_key, algorithm=algorithm) + except Exception as e: + cloudlog.warning(f"jwt.encode failed ({e}), retrying with normalized key") + try: + from cryptography.hazmat.primitives import serialization + key_bytes = private_key.encode("utf-8") if isinstance(private_key, str) else private_key + try: + key_obj = serialization.load_pem_private_key(key_bytes, password=None) + except Exception: + key_obj = serialization.load_ssh_private_key(key_bytes, password=None) + token = jwt.encode(payload, key_obj, algorithm=algorithm) + except Exception as e2: + cloudlog.error(f"Failed to generate pairing token: {e2}") + return "error://token_generation_failed" + if isinstance(token, bytes): + token = token.decode('utf8') + return f"https://konn3kt.com/?pair={token}" + except FileNotFoundError as e: + cloudlog.error(f"Key files not found: {e}") + return "error://keys_not_found" + except Exception as e: + cloudlog.error(f"Failed to generate pairing token: {e}") + return "error://token_generation_failed" + + def _generate_qr_code(self) -> None: + try: + url = self._get_pairing_url() + if url.startswith("error://"): + cloudlog.warning(f"Cannot generate QR code: {url}") + self._qr_texture = None + return + + qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=0) + qr.add_data(url) + qr.make(fit=True) + + pil_img = qr.make_image(fill_color="white", back_color="black").convert('RGBA') + img_array = np.array(pil_img, dtype=np.uint8) + + if self._qr_texture and self._qr_texture.id != 0: + rl.unload_texture(self._qr_texture) + + rl_image = rl.Image() + rl_image.data = rl.ffi.cast("void *", img_array.ctypes.data) + rl_image.width = pil_img.width + rl_image.height = pil_img.height + rl_image.mipmaps = 1 + rl_image.format = rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 + + self._qr_texture = rl.load_texture_from_image(rl_image) + except Exception as e: + cloudlog.warning(f"QR code generation failed: {e}") + self._qr_texture = None + + def _check_qr_refresh(self) -> None: + current_time = time.monotonic() + if current_time - self._last_qr_generation >= self.QR_REFRESH_INTERVAL: + self._generate_qr_code() + self._last_qr_generation = current_time + + def _update_state(self): + super()._update_state() + if ui_state.prime_state.is_paired() and not self.is_dismissing: + self.dismiss() + + def _render(self, rect: rl.Rectangle): + self._check_qr_refresh() + + self._render_qr_code() + + label_x = self._rect.x + 8 + self._rect.height + 24 + self._pair_label.set_max_width(int(self._rect.width - label_x)) + self._pair_label.set_position(label_x, self._rect.y + 16) + self._pair_label.render() + + rl.draw_texture_ex(self._txt_pair, rl.Vector2(label_x, self._rect.y + self._rect.height - self._txt_pair.height - 16), + 0.0, 1.0, rl.Color(255, 255, 255, int(255 * 0.35))) + + def _render_qr_code(self) -> None: + if not self._qr_texture: + error_font = gui_app.font(FontWeight.BOLD) + rl.draw_text_ex( + error_font, "QR Code Error", rl.Vector2(self._rect.x + 20, self._rect.y + self._rect.height // 2 - 15), 30, 0.0, rl.RED + ) + return + + scale = self._rect.height / self._qr_texture.height + pos = rl.Vector2(round(self._rect.x + 8), round(self._rect.y)) + rl.draw_texture_ex(self._qr_texture, pos, 0.0, scale, rl.WHITE) + + def __del__(self): + if self._qr_texture and self._qr_texture.id != 0: + rl.unload_texture(self._qr_texture) + + +if __name__ == "__main__": + gui_app.init_window("pairing device") + pairing = PairingDialog() + gui_app.push_widget(pairing) + try: + for _ in gui_app.render(): + pass + finally: + del pairing diff --git a/iqpilot/selfdrive/ui/onroad/__init__.py b/iqpilot/selfdrive/ui/onroad/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/ui/onroad/alert_renderer.py b/iqpilot/selfdrive/ui/onroad/alert_renderer.py new file mode 100644 index 000000000..0765d198d --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/alert_renderer.py @@ -0,0 +1,186 @@ +import time +import pyray as rl +from dataclasses import dataclass +from iqpilot.cereal import messaging, log +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.hardware import TICI +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import Label + +AlertSize = log.SelfdriveState.AlertSize +AlertStatus = log.SelfdriveState.AlertStatus + +ALERT_MARGIN = 40 +ALERT_PADDING = 60 +ALERT_LINE_SPACING = 45 +ALERT_BORDER_RADIUS = 30 + +ALERT_FONT_SMALL = 66 +ALERT_FONT_MEDIUM = 74 +ALERT_FONT_BIG = 88 + +ALERT_HEIGHTS = { + AlertSize.small: 271, + AlertSize.mid: 420, +} + +SELFDRIVE_STATE_TIMEOUT = 5 # Seconds +SELFDRIVE_UNRESPONSIVE_TIMEOUT = 10 # Seconds + +# Constants +ALERT_COLORS = { + AlertStatus.normal: rl.Color(0x15, 0x15, 0x15, 0xF1), # #151515 with alpha 0xF1 + AlertStatus.userPrompt: rl.Color(0xDA, 0x6F, 0x25, 0xF1), # #DA6F25 with alpha 0xF1 + AlertStatus.critical: rl.Color(0xC9, 0x22, 0x31, 0xF1), # #C92231 with alpha 0xF1 +} + + +@dataclass +class Alert: + text1: str = "" + text2: str = "" + size: int = 0 + status: int = 0 + + +# Pre-defined alert instances +ALERT_STARTUP_PENDING = Alert( + text1=tr("IQ.Pilot Unavailable"), + text2=tr("Waiting to start"), + size=AlertSize.mid, + status=AlertStatus.normal, +) + +ALERT_CRITICAL_TIMEOUT = Alert( + text1=tr("TAKE CONTROL IMMEDIATELY"), + text2=tr("System Unresponsive"), + size=AlertSize.full, + status=AlertStatus.critical, +) + +ALERT_CRITICAL_REBOOT = Alert( + text1=tr("System Unresponsive"), + text2=tr("Reboot Device"), + size=AlertSize.mid, + status=AlertStatus.normal, +) + + +class AlertRenderer(Widget): + def __init__(self): + super().__init__() + self.font_regular: rl.Font = gui_app.font(FontWeight.NORMAL) + self.font_bold: rl.Font = gui_app.font(FontWeight.BOLD) + + # font size is set dynamically + self._full_text1_label = Label("", font_size=0, font_weight=FontWeight.BOLD, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + text_alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP) + self._full_text2_label = Label("", font_size=ALERT_FONT_BIG, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + text_alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP) + + def get_alert(self, sm: messaging.SubMaster) -> Alert | None: + """Generate the current alert based on selfdrive state.""" + ss = sm['selfdriveState'] + + # Check if selfdriveState messages have stopped arriving + recv_frame = sm.recv_frame['selfdriveState'] + if not sm.updated['selfdriveState']: + time_since_onroad = time.monotonic() - ui_state.started_time + + # 1. Never received selfdriveState since going onroad + waiting_for_startup = recv_frame < ui_state.started_frame + if waiting_for_startup and time_since_onroad > 5: + return ALERT_STARTUP_PENDING + + # 2. Lost communication with selfdriveState after receiving it + if TICI and not waiting_for_startup: + ss_missing = time.monotonic() - sm.recv_time['selfdriveState'] + if ss_missing > SELFDRIVE_STATE_TIMEOUT: + if ss.enabled and (ss_missing - SELFDRIVE_STATE_TIMEOUT) < SELFDRIVE_UNRESPONSIVE_TIMEOUT: + return ALERT_CRITICAL_TIMEOUT + return ALERT_CRITICAL_REBOOT + + # No alert if size is none + if ss.alertSize == 0: + return None + + # Don't get old alert + if recv_frame < ui_state.started_frame: + return None + + event_name = ss.alertType.split('/')[0] if ss.alertType else '' + if event_name in {'selfdrivedLagging', 'commIssue', 'commIssueAvgFreq'}: + return None + + # Return current alert + return Alert(text1=ss.alertText1, text2=ss.alertText2, size=ss.alertSize.raw, status=ss.alertStatus.raw) + + def _render(self, rect: rl.Rectangle): + alert = self.get_alert(ui_state.sm) + + if gui_app.iqpilot_ui(): + ui_state.onroad_brightness_handle_alerts(ui_state.started, alert) + + if not alert: + return + + alert_rect = self._get_alert_rect(rect, alert.size) + self._draw_background(alert_rect, alert) + + text_rect = rl.Rectangle( + alert_rect.x + ALERT_PADDING, + alert_rect.y + ALERT_PADDING, + alert_rect.width - 2 * ALERT_PADDING, + alert_rect.height - 2 * ALERT_PADDING + ) + self._draw_text(text_rect, alert) + + def _get_alert_rect(self, rect: rl.Rectangle, size: int) -> rl.Rectangle: + if size == AlertSize.full: + return rect + + h = ALERT_HEIGHTS.get(size, rect.height) + return rl.Rectangle(rect.x + ALERT_MARGIN, rect.y + rect.height - h + ALERT_MARGIN, + rect.width - ALERT_MARGIN * 2, h - ALERT_MARGIN * 2) + + def _draw_background(self, rect: rl.Rectangle, alert: Alert) -> None: + color = ALERT_COLORS.get(alert.status, ALERT_COLORS[AlertStatus.normal]) + + if alert.size != AlertSize.full: + roundness = ALERT_BORDER_RADIUS / (min(rect.width, rect.height) / 2) + rl.draw_rectangle_rounded(rect, roundness, 10, color) + else: + rl.draw_rectangle_rec(rect, color) + + def _draw_text(self, rect: rl.Rectangle, alert: Alert) -> None: + if alert.size == AlertSize.small: + self._draw_centered(alert.text1, rect, self.font_bold, ALERT_FONT_MEDIUM) + + elif alert.size == AlertSize.mid: + self._draw_centered(alert.text1, rect, self.font_bold, ALERT_FONT_BIG, center_y=False) + rect.y += ALERT_FONT_BIG + ALERT_LINE_SPACING + self._draw_centered(alert.text2, rect, self.font_regular, ALERT_FONT_SMALL, center_y=False) + + else: + is_long = len(alert.text1) > 15 + font_size1 = 132 if is_long else 177 + + top_offset = 200 if is_long or '\n' in alert.text1 else 270 + title_rect = rl.Rectangle(rect.x, rect.y + top_offset, rect.width, 600) + self._full_text1_label.set_font_size(font_size1) + self._full_text1_label.set_text(alert.text1) + self._full_text1_label.render(title_rect) + + bottom_offset = 361 if is_long else 420 + subtitle_rect = rl.Rectangle(rect.x, rect.y + rect.height - bottom_offset, rect.width, 300) + self._full_text2_label.set_text(alert.text2) + self._full_text2_label.render(subtitle_rect) + + def _draw_centered(self, text, rect, font, font_size, center_y=True, color=rl.WHITE) -> None: + text_size = measure_text_cached(font, text, font_size) + x = rect.x + (rect.width - text_size.x) / 2 + y = rect.y + ((rect.height - text_size.y) / 2 if center_y else 0) + rl.draw_text_ex(font, text, rl.Vector2(x, y), font_size, 0, color) diff --git a/iqpilot/selfdrive/ui/onroad/augmented_road_view.py b/iqpilot/selfdrive/ui/onroad/augmented_road_view.py new file mode 100644 index 000000000..5602e32b6 --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/augmented_road_view.py @@ -0,0 +1,312 @@ +import time +import numpy as np +import pyray as rl +from iqpilot.cereal import log, messaging +from iqpilot.cereal.visionipc import VisionStreamType +from iqpilot.selfdrive.ui import UI_BORDER_SIZE +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus +from iqpilot.selfdrive.ui.onroad.alert_renderer import AlertRenderer +from iqpilot.selfdrive.ui.onroad.driver_state import DriverStateRenderer as BaseDriverStateRenderer, BTN_SIZE +from iqpilot.selfdrive.ui.onroad.hud_renderer import HudRenderer as BaseHudRenderer +from iqpilot.selfdrive.ui.onroad.model_renderer import ModelRenderer +from iqpilot.selfdrive.ui.onroad.environment_renderer import EnvironmentRenderer +from iqpilot.selfdrive.ui.onroad.cameraview import CameraView +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.common.issue_debug import log_issue_limited +from iqpilot.common.transformations.camera import DEVICE_CAMERAS, DeviceCameraConfig, view_frame_from_device_frame +from iqpilot.common.transformations.orientation import rot_from_euler +from iqpilot.selfdrive.locationd.calibration_helpers import get_calibrated_rpy + +from iqpilot.ui.onroad.augmented_road_view import BORDER_COLORS_IQ, AugmentedRoadViewIQ +from iqpilot.ui.onroad.driver_state import DriverStateRendererIQ +from iqpilot.ui.onroad.hud_renderer import IQHudRenderer +from iqpilot.selfdrive.ui.ui_state import OnroadTimerStatus + +OpState = log.SelfdriveState.OpenpilotState +CALIBRATED = log.ExtrinsicsCalibration.Status.calibrated +ROAD_CAM = VisionStreamType.VISION_STREAM_ROAD +WIDE_CAM = VisionStreamType.VISION_STREAM_WIDE_ROAD +DEFAULT_DEVICE_CAMERA = DEVICE_CAMERAS["tici", "ar0231"] + +BORDER_COLORS = { + UIStatus.DISENGAGED: rl.Color(0x12, 0x28, 0x39, 0xFF), # Blue for disengaged state + UIStatus.OVERRIDE: rl.Color(0x89, 0x92, 0x8D, 0xFF), # Gray for override state + UIStatus.ENGAGED: rl.Color(0x0C, 0x94, 0x96, 0xFF), + **BORDER_COLORS_IQ, +} + +WIDE_CAM_MAX_SPEED = 10.0 # m/s (22 mph) +ROAD_CAM_MIN_SPEED = 15.0 # m/s (34 mph) +INF_POINT = np.array([1000.0, 0.0, 0.0]) + + +class AugmentedRoadView(CameraView, AugmentedRoadViewIQ): + def __init__(self, stream_type: VisionStreamType = VisionStreamType.VISION_STREAM_ROAD): + CameraView.__init__(self, "camerad", stream_type) + AugmentedRoadViewIQ.__init__(self) + self._set_placeholder_color(BORDER_COLORS[UIStatus.DISENGAGED]) + + self.device_camera: DeviceCameraConfig | None = None + self.view_from_calib = view_frame_from_device_frame.copy() + self.view_from_wide_calib = view_frame_from_device_frame.copy() + + self._matrix_cache_key = (0, 0.0, 0.0, stream_type) + self._cached_matrix: np.ndarray | None = None + self._content_rect = rl.Rectangle() + self._split_nav_available = False + + self.model_renderer = ModelRenderer() + self.environment_renderer = EnvironmentRenderer() + self.alert_renderer = AlertRenderer() + self._hud_renderer = IQHudRenderer() + self.driver_state_renderer = DriverStateRendererIQ() + self._split_nav_available = hasattr(self._hud_renderer, "render_split_nav") + + # debug + self._pm = messaging.PubMaster(['uiDebug']) + + def _render(self, rect): + # Only render when system is started to avoid invalid data access + start_draw = time.monotonic() + if not ui_state.started: + return + + self._switch_stream_if_needed(ui_state.sm) + + # Update calibration before rendering + self._update_calibration() + + # Create inner content area with border padding + full_content_rect = rl.Rectangle( + rect.x + UI_BORDER_SIZE, + rect.y + UI_BORDER_SIZE, + rect.width - 2 * UI_BORDER_SIZE, + rect.height - 2 * UI_BORDER_SIZE, + ) + split_nav_enabled = bool(getattr(self._hud_renderer, "split_nav_enabled", lambda: False)()) + if split_nav_enabled: + split_width = full_content_rect.width * 0.5 + camera_rect = rl.Rectangle(full_content_rect.x, full_content_rect.y, split_width, full_content_rect.height) + map_rect = rl.Rectangle(full_content_rect.x + split_width, full_content_rect.y, full_content_rect.width - split_width, full_content_rect.height) + else: + camera_rect = full_content_rect + map_rect = None + self._content_rect = camera_rect + + if map_rect is not None: + self._hud_renderer.render_split_nav(map_rect) + rl.draw_line_ex( + rl.Vector2(map_rect.x, map_rect.y + 20), + rl.Vector2(map_rect.x, map_rect.y + map_rect.height - 20), + 2.0, + rl.Color(255, 255, 255, 20), + ) + + # Enable scissor mode to clip all rendering within content rectangle boundaries + # This creates a rendering viewport that prevents graphics from drawing outside the border + rl.begin_scissor_mode( + int(camera_rect.x), + int(camera_rect.y), + int(camera_rect.width), + int(camera_rect.height) + ) + + # Render the base camera view + super()._render(camera_rect) + + # Draw all UI overlays + self.model_renderer.render(camera_rect) + self.environment_renderer.render(camera_rect) + AugmentedRoadViewIQ.update_fade_out_bottom_overlay(self, camera_rect) + self._hud_renderer.render(camera_rect) + + # Custom UI extension point - add custom overlays here + # Use self._content_rect for positioning within camera bounds + + # End clipping region + rl.end_scissor_mode() + + if hasattr(self._hud_renderer, "render_full_width_overlays"): + self._hud_renderer.render_full_width_overlays(full_content_rect) + + self.alert_renderer.render(full_content_rect) + self.driver_state_renderer.render(full_content_rect) + + # Draw colored border based on driving state + self._draw_border(rect) + + # publish uiDebug + draw_time_ms = (time.monotonic() - start_draw) * 1000 + if draw_time_ms > 40.0: + log_issue_limited( + "ui_draw_slow", + "ui", + f"onroad draw slow drawTimeMillis={draw_time_ms:.2f} navActive={getattr(ui_state.sm['iqNavState'], 'active', False)}", + interval_sec=1.0, + ) + msg = messaging.new_message('uiDebug') + msg.uiDebug.drawTimeMillis = draw_time_ms + self._pm.send('uiDebug', msg) + + def _handle_mouse_press(self, mouse_pos): + dm = self.driver_state_renderer + if ui_state.has_longitudinal_control and dm.is_visible: + dx = mouse_pos.x - dm.position_x + dy = mouse_pos.y - dm.position_y + if dx * dx + dy * dy <= (BTN_SIZE / 2) ** 2: + dm.cycle_personality() + return + + if not self._hud_renderer.user_interacting() and self._click_callback is not None: + self._click_callback() + + def _handle_mouse_release(self, _): + # We only call click callback on press if not interacting with HUD + pass + + def _draw_border(self, rect: rl.Rectangle): + rl.draw_rectangle_lines_ex(rect, UI_BORDER_SIZE, rl.BLACK) + border_roundness = 0.12 + border_color = BORDER_COLORS.get(ui_state.status, BORDER_COLORS[UIStatus.DISENGAGED]) + border_rect = rl.Rectangle(rect.x + UI_BORDER_SIZE, rect.y + UI_BORDER_SIZE, + rect.width - 2 * UI_BORDER_SIZE, rect.height - 2 * UI_BORDER_SIZE) + aol = ui_state.sm["iqState"].aol + if aol.active and not ui_state.sm["selfdriveState"].enabled: + bottom_only_height = max(int(UI_BORDER_SIZE * 4), 60) + clip_y = int(rect.y + rect.height - bottom_only_height) + rl.begin_scissor_mode(int(rect.x), clip_y, int(rect.width), bottom_only_height) + rl.draw_rectangle_rounded_lines_ex(border_rect, border_roundness, 10, UI_BORDER_SIZE, border_color) + rl.end_scissor_mode() + else: + rl.draw_rectangle_rounded_lines_ex(border_rect, border_roundness, 10, UI_BORDER_SIZE, border_color) + + def _switch_stream_if_needed(self, sm): + if sm['selfdriveState'].experimentalMode and WIDE_CAM in self.available_streams: + v_ego = sm['carState'].vEgo + if v_ego < WIDE_CAM_MAX_SPEED: + target = WIDE_CAM + elif v_ego > ROAD_CAM_MIN_SPEED: + target = ROAD_CAM + else: + # Hysteresis zone - keep current stream + target = self.stream_type + else: + target = ROAD_CAM + + if self.stream_type != target: + self.switch_stream(target) + + def _update_calibration(self): + # Update device camera if not already set + sm = ui_state.sm + if not self.device_camera and sm.seen['roadCameraState'] and sm.seen['deviceState']: + self.device_camera = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['roadCameraState'].sensor))] + + if not sm.seen["extrinsicsCalibration"]: + return + + calib = sm['extrinsicsCalibration'] + calib_rpy = get_calibrated_rpy(calib) + if calib_rpy is None: + return + + # Update view_from_calib matrix + prev_view_from_calib = self.view_from_calib.copy() + prev_view_from_wide_calib = self.view_from_wide_calib.copy() + device_from_calib = rot_from_euler(calib_rpy) + self.view_from_calib = view_frame_from_device_frame @ device_from_calib + + # Update wide calibration if available + if hasattr(calib, 'wideFromDeviceEuler') and len(calib.wideFromDeviceEuler) == 3: + wide_from_device = rot_from_euler(calib.wideFromDeviceEuler) + self.view_from_wide_calib = view_frame_from_device_frame @ wide_from_device @ device_from_calib + + if (not np.allclose(self.view_from_calib, prev_view_from_calib) or + not np.allclose(self.view_from_wide_calib, prev_view_from_wide_calib)): + self._matrix_cache_key = (0, 0.0, 0.0, self.stream_type) + self._cached_matrix = None + + def _calc_frame_matrix(self, rect: rl.Rectangle) -> np.ndarray: + # Check if we can use cached matrix + cache_key = ( + ui_state.sm.recv_frame['extrinsicsCalibration'], + self._content_rect.width, + self._content_rect.height, + self.stream_type + ) + if cache_key == self._matrix_cache_key and self._cached_matrix is not None: + return self._cached_matrix + + # Get camera configuration + device_camera = self.device_camera or DEFAULT_DEVICE_CAMERA + is_wide_camera = self.stream_type == WIDE_CAM + intrinsic = device_camera.ecam.intrinsics if is_wide_camera else device_camera.fcam.intrinsics + calibration = self.view_from_wide_calib if is_wide_camera else self.view_from_calib + zoom = 2.0 if is_wide_camera else 1.1 + + # Calculate transforms for vanishing point + calib_transform = intrinsic @ calibration + kep = calib_transform @ INF_POINT + + # Calculate center points and dimensions + x, y = self._content_rect.x, self._content_rect.y + w, h = self._content_rect.width, self._content_rect.height + cx, cy = intrinsic[0, 2], intrinsic[1, 2] + + # Calculate max allowed offsets with margins + margin = 5 + max_x_offset = cx * zoom - w / 2 - margin + max_y_offset = cy * zoom - h / 2 - margin + + # Calculate and clamp offsets to prevent out-of-bounds issues + try: + if abs(kep[2]) > 1e-6: + x_offset = np.clip((kep[0] / kep[2] - cx) * zoom, -max_x_offset, max_x_offset) + y_offset = np.clip((kep[1] / kep[2] - cy) * zoom, -max_y_offset, max_y_offset) + else: + x_offset, y_offset = 0, 0 + except (ZeroDivisionError, OverflowError): + x_offset, y_offset = 0, 0 + + # Cache the computed transformation matrix to avoid recalculations + self._matrix_cache_key = cache_key + self._cached_matrix = np.array([ + [zoom * 2 * cx / w, 0, -x_offset / w * 2], + [0, zoom * 2 * cy / h, -y_offset / h * 2], + [0, 0, 1.0] + ]) + + video_transform = np.array([ + [zoom, 0.0, (w / 2 + x - x_offset) - (cx * zoom)], + [0.0, zoom, (h / 2 + y - y_offset) - (cy * zoom)], + [0.0, 0.0, 1.0] + ]) + self.model_renderer.set_transform(video_transform @ calib_transform) + self.model_renderer.set_frame_transform(video_transform, is_wide_camera) + self.environment_renderer.set_transform(video_transform @ calib_transform) + + return self._cached_matrix + + def show_event(self): + if gui_app.iqpilot_ui(): + ui_state.reset_onroad_sleep_timer(OnroadTimerStatus.RESUME) + + def hide_event(self): + if gui_app.iqpilot_ui(): + ui_state.reset_onroad_sleep_timer(OnroadTimerStatus.PAUSE) + + +if __name__ == "__main__": + gui_app.init_window("OnRoad Camera View") + road_camera_view = AugmentedRoadView(ROAD_CAM) + print("***press space to switch camera view***") + try: + for _ in gui_app.render(): + ui_state.update() + if rl.is_key_released(rl.KeyboardKey.KEY_SPACE): + if WIDE_CAM in road_camera_view.available_streams: + stream = ROAD_CAM if road_camera_view.stream_type == WIDE_CAM else WIDE_CAM + road_camera_view.switch_stream(stream) + road_camera_view.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + finally: + road_camera_view.close() diff --git a/iqpilot/selfdrive/ui/onroad/cameraview.py b/iqpilot/selfdrive/ui/onroad/cameraview.py new file mode 100644 index 000000000..8e281d366 --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/cameraview.py @@ -0,0 +1,367 @@ +import platform +import numpy as np +import pyray as rl + +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionIpcClient, VisionBuf +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import EGL_DMA_BUF_SUPPORTED +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.egl import init_egl, create_egl_image, destroy_egl_image, bind_egl_image_to_texture, EGLImage +from iqpilot.system.ui.widgets import Widget +from iqpilot.selfdrive.ui.ui_state import ui_state + +CONNECTION_RETRY_INTERVAL = 0.2 # seconds between connection attempts + +VERSION = """ +#version 300 es +precision mediump float; +""" +if platform.system() == "Darwin": + VERSION = """ + #version 330 core + """ + + +VERTEX_SHADER = VERSION + """ +in vec3 vertexPosition; +in vec2 vertexTexCoord; +in vec3 vertexNormal; +in vec4 vertexColor; +uniform mat4 mvp; +out vec2 fragTexCoord; +out vec4 fragColor; +void main() { + fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + gl_Position = mvp * vec4(vertexPosition, 1.0); +} +""" + +# Choose fragment shader based on platform capabilities +if EGL_DMA_BUF_SUPPORTED: + FRAME_FRAGMENT_SHADER = """ + #version 300 es + #extension GL_OES_EGL_image_external_essl3 : enable + precision mediump float; + in vec2 fragTexCoord; + uniform samplerExternalOES texture0; + out vec4 fragColor; + void main() { + vec4 color = texture(texture0, fragTexCoord); + fragColor = vec4(pow(color.rgb, vec3(1.0/1.28)), color.a); + } + """ +else: + FRAME_FRAGMENT_SHADER = VERSION + """ + in vec2 fragTexCoord; + uniform sampler2D texture0; + uniform sampler2D texture1; + out vec4 fragColor; + void main() { + float y = texture(texture0, fragTexCoord).r; + vec2 uv = texture(texture1, fragTexCoord).ra - 0.5; + fragColor = vec4(y + 1.402*uv.y, y - 0.344*uv.x - 0.714*uv.y, y + 1.772*uv.x, 1.0); + } + """ + + +class CameraView(Widget): + def __init__(self, name: str, stream_type: VisionStreamType): + super().__init__() + self._name = name + # Primary stream + self.client = VisionIpcClient(name, stream_type, conflate=True) + self._stream_type = stream_type + self.available_streams: list[VisionStreamType] = [] + + # Target stream for switching + self._target_client: VisionIpcClient | None = None + self._target_stream_type: VisionStreamType | None = None + self._switching: bool = False + + self._texture_needs_update = True + self.last_connection_attempt: float = 0.0 + self.shader = rl.load_shader_from_memory(VERTEX_SHADER, FRAME_FRAGMENT_SHADER) + self._texture1_loc: int = rl.get_shader_location(self.shader, "texture1") if not EGL_DMA_BUF_SUPPORTED else -1 + + self.frame: VisionBuf | None = None + self.texture_y: rl.Texture | None = None + self.texture_uv: rl.Texture | None = None + + # EGL resources + self.egl_images: dict[int, EGLImage] = {} + self.egl_texture: rl.Texture | None = None + + self._placeholder_color: rl.Color | None = None + + # Initialize EGL for zero-copy rendering on comma 3/3X. + if EGL_DMA_BUF_SUPPORTED: + if not init_egl(): + raise RuntimeError("Failed to initialize EGL") + + # Create a 1x1 pixel placeholder texture for EGL image binding + temp_image = rl.gen_image_color(1, 1, rl.BLACK) + self.egl_texture = rl.load_texture_from_image(temp_image) + rl.unload_image(temp_image) + + ui_state.add_offroad_transition_callback(self._offroad_transition) + + def _offroad_transition(self): + # Reconnect if not first time going onroad + if ui_state.is_onroad() and self.frame is not None: + # Prevent old frames from showing when going onroad. Qt has a separate thread + # which drains the VisionIpcClient SubSocket for us. Re-connecting is not enough + # and only clears internal buffers, not the message queue. + self.frame = None + self.available_streams.clear() + if self.client: + del self.client + self.client = VisionIpcClient(self._name, self._stream_type, conflate=True) + + def _set_placeholder_color(self, color: rl.Color): + """Set a placeholder color to be drawn when no frame is available.""" + self._placeholder_color = color + + def switch_stream(self, stream_type: VisionStreamType) -> None: + if self._stream_type == stream_type: + return + + if self._switching and self._target_stream_type == stream_type: + return + + cloudlog.debug(f'Preparing switch from {self._stream_type} to {stream_type}') + + if self._target_client: + del self._target_client + + self._target_stream_type = stream_type + self._target_client = VisionIpcClient(self._name, stream_type, conflate=True) + self._switching = True + + @property + def stream_type(self) -> VisionStreamType: + return self._stream_type + + def close(self) -> None: + self._clear_textures() + + # Clean up EGL texture + if EGL_DMA_BUF_SUPPORTED and self.egl_texture: + rl.unload_texture(self.egl_texture) + self.egl_texture = None + + # Clean up shader + if self.shader and self.shader.id: + rl.unload_shader(self.shader) + + self.frame = None + self.available_streams.clear() + self.client = None + + def __del__(self): + self.close() + + def _calc_frame_matrix(self, rect: rl.Rectangle) -> np.ndarray: + if not self.frame: + return np.eye(3) + + # Calculate aspect ratios + widget_aspect_ratio = rect.width / rect.height + frame_aspect_ratio = self.frame.width / self.frame.height + + # Calculate scaling factors to maintain aspect ratio + zx = min(frame_aspect_ratio / widget_aspect_ratio, 1.0) + zy = min(widget_aspect_ratio / frame_aspect_ratio, 1.0) + + return np.array([ + [zx, 0.0, 0.0], + [0.0, zy, 0.0], + [0.0, 0.0, 1.0] + ]) + + def _render(self, rect: rl.Rectangle): + if self._switching: + self._handle_switch() + + if not self._ensure_connection(): + self._draw_placeholder(rect) + return + + # Try to get a new buffer without blocking + buffer = self.client.recv(timeout_ms=0) + if buffer: + self._texture_needs_update = True + self.frame = buffer + elif not self.client.is_connected(): + # ensure we clear the displayed frame when the connection is lost + self.frame = None + + if not self.frame: + self._draw_placeholder(rect) + return + + transform = self._calc_frame_matrix(rect) + src_rect = rl.Rectangle(0, 0, float(self.frame.width), float(self.frame.height)) + # Flip driver camera horizontally + if self._stream_type == VisionStreamType.VISION_STREAM_DRIVER: + src_rect.width = -src_rect.width + + # Calculate scale + scale_x = rect.width * transform[0, 0] # zx + scale_y = rect.height * transform[1, 1] # zy + + # Calculate base position (centered) + x_offset = rect.x + (rect.width - scale_x) / 2 + y_offset = rect.y + (rect.height - scale_y) / 2 + + x_offset += transform[0, 2] * rect.width / 2 + y_offset += transform[1, 2] * rect.height / 2 + + dst_rect = rl.Rectangle(x_offset, y_offset, scale_x, scale_y) + + # Render with appropriate method + if EGL_DMA_BUF_SUPPORTED: + self._render_egl(src_rect, dst_rect) + else: + self._render_textures(src_rect, dst_rect) + + def _draw_placeholder(self, rect: rl.Rectangle): + if self._placeholder_color: + rl.draw_rectangle_rec(rect, self._placeholder_color) + + def _render_egl(self, src_rect: rl.Rectangle, dst_rect: rl.Rectangle) -> None: + """Render using EGL for direct buffer access""" + if self.frame is None or self.egl_texture is None: + return + + idx = self.frame.idx + egl_image = self.egl_images.get(idx) + + # Create EGL image if needed + if egl_image is None: + egl_image = create_egl_image(self.frame.width, self.frame.height, self.frame.stride, self.frame.fd, self.frame.uv_offset) + if egl_image: + self.egl_images[idx] = egl_image + else: + return + + # Update texture dimensions to match current frame + self.egl_texture.width = self.frame.width + self.egl_texture.height = self.frame.height + + # Bind the EGL image to our texture + bind_egl_image_to_texture(self.egl_texture.id, egl_image) + + # Render with shader + rl.begin_shader_mode(self.shader) + rl.draw_texture_pro(self.egl_texture, src_rect, dst_rect, rl.Vector2(0, 0), 0.0, rl.WHITE) + rl.end_shader_mode() + + def _render_textures(self, src_rect: rl.Rectangle, dst_rect: rl.Rectangle) -> None: + """Render using texture copies""" + if not self.texture_y or not self.texture_uv or self.frame is None: + return + + # Update textures with new frame data + if self._texture_needs_update: + y_data = self.frame.data[: self.frame.uv_offset] + uv_data = self.frame.data[self.frame.uv_offset:] + + rl.update_texture(self.texture_y, rl.ffi.cast("void *", y_data.ctypes.data)) + rl.update_texture(self.texture_uv, rl.ffi.cast("void *", uv_data.ctypes.data)) + self._texture_needs_update = False + + # Render with shader + rl.begin_shader_mode(self.shader) + rl.set_shader_value_texture(self.shader, self._texture1_loc, self.texture_uv) + rl.draw_texture_pro(self.texture_y, src_rect, dst_rect, rl.Vector2(0, 0), 0.0, rl.WHITE) + rl.end_shader_mode() + + def _ensure_connection(self) -> bool: + if not self.client.is_connected(): + self.frame = None + self.available_streams.clear() + + # Throttle connection attempts + current_time = rl.get_time() + if current_time - self.last_connection_attempt < CONNECTION_RETRY_INTERVAL: + return False + self.last_connection_attempt = current_time + + if not self.client.connect(False) or not self.client.num_buffers: + return False + + cloudlog.debug(f"Connected to {self._name} stream: {self._stream_type}, buffers: {self.client.num_buffers}") + self._initialize_textures() + self.available_streams = self.client.available_streams(self._name, block=False) + + return True + + def _handle_switch(self) -> None: + """Check if target stream is ready and switch immediately.""" + if not self._target_client or not self._switching: + return + + # Try to connect target if needed + if not self._target_client.is_connected(): + if not self._target_client.connect(False) or not self._target_client.num_buffers: + return + + cloudlog.debug(f"Target stream connected: {self._target_stream_type}") + + # Check if target has frames ready + target_frame = self._target_client.recv(timeout_ms=0) + if target_frame: + self.frame = target_frame # Update current frame to target frame + self._complete_switch() + + def _complete_switch(self) -> None: + """Instantly switch to target stream.""" + cloudlog.debug(f"Switching to {self._target_stream_type}") + # Clean up current resources + if self.client: + del self.client + + # Switch to target + self.client = self._target_client + self._stream_type = self._target_stream_type + self._texture_needs_update = True + + # Reset state + self._target_client = None + self._target_stream_type = None + self._switching = False + + # Initialize textures for new stream + self._initialize_textures() + + def _initialize_textures(self): + self._clear_textures() + if not EGL_DMA_BUF_SUPPORTED: + self.texture_y = rl.load_texture_from_image(rl.Image(None, int(self.client.stride), + int(self.client.height), 1, rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_GRAYSCALE)) + self.texture_uv = rl.load_texture_from_image(rl.Image(None, int(self.client.stride // 2), + int(self.client.height // 2), 1, rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA)) + + def _clear_textures(self): + if self.texture_y and self.texture_y.id: + rl.unload_texture(self.texture_y) + self.texture_y = None + + if self.texture_uv and self.texture_uv.id: + rl.unload_texture(self.texture_uv) + self.texture_uv = None + + # Clean up EGL resources + if EGL_DMA_BUF_SUPPORTED: + for data in self.egl_images.values(): + destroy_egl_image(data) + self.egl_images = {} + + +if __name__ == "__main__": + gui_app.init_window("camera view") + road = CameraView("camerad", VisionStreamType.VISION_STREAM_ROAD) + for _ in gui_app.render(): + road.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) diff --git a/iqpilot/selfdrive/ui/onroad/driver_camera_dialog.py b/iqpilot/selfdrive/ui/onroad/driver_camera_dialog.py new file mode 100644 index 000000000..b4bf91af3 --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/driver_camera_dialog.py @@ -0,0 +1,111 @@ +import numpy as np +import pyray as rl +from iqpilot.cereal.visionipc import VisionStreamType +from iqpilot.selfdrive.ui.onroad.cameraview import CameraView +from iqpilot.selfdrive.ui.onroad.driver_state import DriverStateRenderer +from iqpilot.selfdrive.ui.ui_state import ui_state, device +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets.label import gui_label + + +class DriverCameraDialog(CameraView): + def __init__(self): + super().__init__("camerad", VisionStreamType.VISION_STREAM_DRIVER) + self.driver_state_renderer = DriverStateRenderer() + # TODO: this can grow unbounded, should be given some thought + device.add_interactive_timeout_callback(lambda: gui_app.set_modal_overlay(None)) + ui_state.params.put_bool("IsDriverViewEnabled", True) + + def hide_event(self): + super().hide_event() + ui_state.params.put_bool("IsDriverViewEnabled", False) + self.close() + + def _handle_mouse_release(self, _): + super()._handle_mouse_release(_) + gui_app.set_modal_overlay(None) + + def __del__(self): + self.close() + + def _render(self, rect): + super()._render(rect) + + if not self.frame: + gui_label( + rect, + tr("camera starting"), + font_size=100, + font_weight=FontWeight.BOLD, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + ) + return -1 + + self._draw_face_detection(rect) + self.driver_state_renderer.render(rect) + + return -1 + + def _draw_face_detection(self, rect: rl.Rectangle) -> None: + driver_state = ui_state.sm["driverStateV2"] + is_rhd = driver_state.wheelOnRightProb > 0.5 + driver_data = driver_state.rightDriverData if is_rhd else driver_state.leftDriverData + face_detect = driver_data.faceProb > 0.7 + if not face_detect: + return + + # Get face position and orientation + face_x, face_y = driver_data.facePosition + face_std = max(driver_data.faceOrientationStd[0], driver_data.faceOrientationStd[1]) + alpha = 0.7 + if face_std > 0.15: + alpha = max(0.7 - (face_std - 0.15) * 3.5, 0.0) + + # use approx instead of distort_points + # TODO: replace with distort_points + fbox_x = int(1080.0 - 1714.0 * face_x) + fbox_y = int(-135.0 + (504.0 + abs(face_x) * 112.0) + (1205.0 - abs(face_x) * 724.0) * face_y) + box_size = 220 + + line_color = rl.Color(255, 255, 255, int(alpha * 255)) + rl.draw_rectangle_rounded_lines_ex( + rl.Rectangle(fbox_x - box_size / 2, fbox_y - box_size / 2, box_size, box_size), + 35.0 / box_size / 2, + 10, + 10, + line_color, + ) + + def _calc_frame_matrix(self, rect: rl.Rectangle) -> np.ndarray: + driver_view_ratio = 2.0 + + # Get stream dimensions + if self.frame: + stream_width = self.frame.width + stream_height = self.frame.height + else: + # Default values if frame not available + stream_width = 1928 + stream_height = 1208 + + yscale = stream_height * driver_view_ratio / stream_width + xscale = yscale * rect.height / rect.width * stream_width / stream_height + + return np.array([ + [xscale, 0.0, 0.0], + [0.0, yscale, 0.0], + [0.0, 0.0, 1.0] + ]) + + +if __name__ == "__main__": + gui_app.init_window("Driver Camera View") + + driver_camera_view = DriverCameraDialog() + try: + for _ in gui_app.render(): + ui_state.update() + driver_camera_view.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + finally: + driver_camera_view.close() diff --git a/iqpilot/selfdrive/ui/onroad/driver_state.py b/iqpilot/selfdrive/ui/onroad/driver_state.py new file mode 100644 index 000000000..ca98fa2d0 --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/driver_state.py @@ -0,0 +1,231 @@ +import numpy as np +import pyray as rl +from iqpilot.cereal import log +from dataclasses import dataclass +from iqpilot.selfdrive.ui import UI_BORDER_SIZE +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets import Widget + +AlertSize = log.SelfdriveState.AlertSize + +# Default 3D coordinates for face keypoints as a NumPy array +DEFAULT_FACE_KPTS_3D = np.array([ + [-5.98, -51.20, 8.00], [-17.64, -49.14, 8.00], [-23.81, -46.40, 8.00], [-29.98, -40.91, 8.00], + [-32.04, -37.49, 8.00], [-34.10, -32.00, 8.00], [-36.16, -21.03, 8.00], [-36.16, 6.40, 8.00], + [-35.47, 10.51, 8.00], [-32.73, 19.43, 8.00], [-29.30, 26.29, 8.00], [-24.50, 33.83, 8.00], + [-19.01, 41.37, 8.00], [-14.21, 46.17, 8.00], [-12.16, 47.54, 8.00], [-4.61, 49.60, 8.00], + [4.99, 49.60, 8.00], [12.53, 47.54, 8.00], [14.59, 46.17, 8.00], [19.39, 41.37, 8.00], + [24.87, 33.83, 8.00], [29.67, 26.29, 8.00], [33.10, 19.43, 8.00], [35.84, 10.51, 8.00], + [36.53, 6.40, 8.00], [36.53, -21.03, 8.00], [34.47, -32.00, 8.00], [32.42, -37.49, 8.00], + [30.36, -40.91, 8.00], [24.19, -46.40, 8.00], [18.02, -49.14, 8.00], [6.36, -51.20, 8.00], + [-5.98, -51.20, 8.00], +], dtype=np.float32) + +# UI constants +BTN_SIZE = 192 +IMG_SIZE = 144 +ARC_LENGTH = 133 +ARC_THICKNESS_DEFAULT = 6.7 +ARC_THICKNESS_EXTEND = 12.0 + +SCALES_POS = np.array([0.9, 0.4, 0.4], dtype=np.float32) +SCALES_NEG = np.array([0.7, 0.4, 0.4], dtype=np.float32) + +ARC_POINT_COUNT = 37 # Number of points in the arc +ARC_ANGLES = np.linspace(0.0, np.pi, ARC_POINT_COUNT, dtype=np.float32) + + +@dataclass +class ArcData: + """Data structure for arc rendering parameters.""" + x: float + y: float + width: float + height: float + thickness: float + + +class DriverStateRenderer(Widget): + def __init__(self): + super().__init__() + # Initial state with NumPy arrays + self.face_kpts_draw = DEFAULT_FACE_KPTS_3D.copy() + self.is_active = False + self.is_rhd = False + self.dm_fade_state = 0.0 + self.driver_pose_vals = np.zeros(3, dtype=np.float32) + self.driver_pose_diff = np.zeros(3, dtype=np.float32) + self.driver_pose_sins = np.zeros(3, dtype=np.float32) + self.driver_pose_coss = np.zeros(3, dtype=np.float32) + self.face_keypoints_transformed = np.zeros((DEFAULT_FACE_KPTS_3D.shape[0], 2), dtype=np.float32) + self.position_x: float = 0.0 + self.position_y: float = 0.0 + self.h_arc_data = None + self.v_arc_data = None + + # Pre-allocate drawing arrays + self.face_lines = [rl.Vector2(0, 0) for _ in range(len(DEFAULT_FACE_KPTS_3D))] + self.h_arc_lines = [rl.Vector2(0, 0) for _ in range(ARC_POINT_COUNT)] + self.v_arc_lines = [rl.Vector2(0, 0) for _ in range(ARC_POINT_COUNT)] + + # Load the driver face icon + self.dm_img = gui_app.texture("icons/driver_face.png", IMG_SIZE, IMG_SIZE) + + # Colors + self.white_color = rl.Color(255, 255, 255, 255) + self.arc_color = rl.Color(26, 242, 66, 255) + self.engaged_color = rl.Color(0x0C, 0x94, 0x96, 0xFF) + self.disengaged_color = rl.Color(139, 139, 139, 255) + + self.set_visible(lambda: (ui_state.sm["selfdriveState"].alertSize == AlertSize.none and + ui_state.sm.recv_frame["driverStateV2"] > ui_state.started_frame)) + + def _render(self, rect): + # Set opacity based on active state + opacity = 0.65 if self.is_active else 0.2 + + # Draw background circle + rl.draw_circle(int(self.position_x), int(self.position_y), BTN_SIZE // 2, rl.Color(0, 0, 0, 70)) + + # Draw face icon + icon_pos = rl.Vector2(self.position_x - self.dm_img.width // 2, self.position_y - self.dm_img.height // 2) + rl.draw_texture_v(self.dm_img, icon_pos, rl.Color(255, 255, 255, int(255 * opacity))) + + # Draw face outline + self.white_color.a = int(255 * opacity) + rl.draw_spline_linear(self.face_lines, len(self.face_lines), 5.2, self.white_color) + + # Set arc color based on engaged state + self.arc_color = self.engaged_color if ui_state.engaged else self.disengaged_color + self.arc_color.a = int(0.4 * 255 * (1.0 - self.dm_fade_state)) # Fade out when inactive + + # Draw arcs + if self.h_arc_data: + rl.draw_spline_linear(self.h_arc_lines, len(self.h_arc_lines), self.h_arc_data.thickness, self.arc_color) + if self.v_arc_data: + rl.draw_spline_linear(self.v_arc_lines, len(self.v_arc_lines), self.v_arc_data.thickness, self.arc_color) + + def _update_state(self): + """Update the driver monitoring state based on model data""" + sm = ui_state.sm + if not self.is_visible: + return + + # Get monitoring state + dm_state = sm["driverMonitoringState"] + self.is_active = dm_state.isActiveMode + self.is_rhd = dm_state.isRHD + + # Update fade state (smoother transition between active/inactive) + fade_target = 0.0 if self.is_active else 0.5 + self.dm_fade_state = np.clip(self.dm_fade_state + 0.2 * (fade_target - self.dm_fade_state), 0.0, 1.0) + + # Get driver orientation data from appropriate camera + driverstate = sm["driverStateV2"] + driver_data = driverstate.rightDriverData if self.is_rhd else driverstate.leftDriverData + driver_orient = driver_data.faceOrientation + + # Update pose values with scaling and smoothing + driver_orient = np.array(driver_orient) + scales = np.where(driver_orient < 0, SCALES_NEG, SCALES_POS) + v_this = driver_orient * scales + self.driver_pose_diff = np.abs(self.driver_pose_vals - v_this) + self.driver_pose_vals = 0.8 * v_this + 0.2 * self.driver_pose_vals # Smooth changes + + # Apply fade to rotation and compute sin/cos + rotation_amount = self.driver_pose_vals * (1.0 - self.dm_fade_state) + self.driver_pose_sins = np.sin(rotation_amount) + self.driver_pose_coss = np.cos(rotation_amount) + + # Create rotation matrix for 3D face model + sin_y, sin_x, sin_z = self.driver_pose_sins + cos_y, cos_x, cos_z = self.driver_pose_coss + r_xyz = np.array( + [ + [cos_x * cos_z, cos_x * sin_z, -sin_x], + [-sin_y * sin_x * cos_z - cos_y * sin_z, -sin_y * sin_x * sin_z + cos_y * cos_z, -sin_y * cos_x], + [cos_y * sin_x * cos_z - sin_y * sin_z, cos_y * sin_x * sin_z + sin_y * cos_z, cos_y * cos_x], + ] + ) + + # Transform face keypoints using vectorized matrix multiplication + self.face_kpts_draw = DEFAULT_FACE_KPTS_3D @ r_xyz.T + self.face_kpts_draw[:, 2] = self.face_kpts_draw[:, 2] * (1.0 - self.dm_fade_state) + 8 * self.dm_fade_state + + # Pre-calculate the transformed keypoints + kp_depth = (self.face_kpts_draw[:, 2] - 8) / 120.0 + 1.0 + self.face_keypoints_transformed = self.face_kpts_draw[:, :2] * kp_depth[:, None] + + # Pre-calculate all drawing elements + self._pre_calculate_drawing_elements() + + def _pre_calculate_drawing_elements(self): + """Pre-calculate all drawing elements based on the current rectangle""" + # Calculate icon position (bottom-left or bottom-right) + width, height = self._rect.width, self._rect.height + offset = UI_BORDER_SIZE + BTN_SIZE // 2 + self.position_x = self._rect.x + (width - offset if self.is_rhd else offset) + self.position_y = self._rect.y + height - offset + + # Pre-calculate the face lines positions + positioned_keypoints = self.face_keypoints_transformed + np.array([self.position_x, self.position_y]) + for i in range(len(positioned_keypoints)): + self.face_lines[i].x = positioned_keypoints[i][0] + self.face_lines[i].y = positioned_keypoints[i][1] + + # Calculate arc dimensions based on head rotation + delta_x = -self.driver_pose_sins[1] * ARC_LENGTH / 2.0 # Horizontal movement + delta_y = -self.driver_pose_sins[0] * ARC_LENGTH / 2.0 # Vertical movement + + # Horizontal arc + h_width = abs(delta_x) + self.h_arc_data = self._calculate_arc_data( + delta_x, h_width, self.position_x, self.position_y - ARC_LENGTH / 2, + self.driver_pose_sins[1], self.driver_pose_diff[1], is_horizontal=True + ) + + # Vertical arc + v_height = abs(delta_y) + self.v_arc_data = self._calculate_arc_data( + delta_y, v_height, self.position_x - ARC_LENGTH / 2, self.position_y, + self.driver_pose_sins[0], self.driver_pose_diff[0], is_horizontal=False + ) + + def _calculate_arc_data( + self, delta: float, size: float, x: float, y: float, sin_val: float, diff_val: float, is_horizontal: bool + ): + """Calculate arc data and pre-compute arc points.""" + if size <= 0: + return None + + thickness = ARC_THICKNESS_DEFAULT + ARC_THICKNESS_EXTEND * min(1.0, diff_val * 5.0) + start_angle = (90 if sin_val > 0 else -90) if is_horizontal else (0 if sin_val > 0 else 180) + x = min(x + delta, x) if is_horizontal else x + y = y if is_horizontal else min(y + delta, y) + + arc_data = ArcData( + x=x, + y=y, + width=size if is_horizontal else ARC_LENGTH, + height=ARC_LENGTH if is_horizontal else size, + thickness=thickness, + ) + + # Pre-calculate arc points + angles = ARC_ANGLES + np.deg2rad(start_angle) + + center_x = x + arc_data.width / 2 + center_y = y + arc_data.height / 2 + radius_x = arc_data.width / 2 + radius_y = arc_data.height / 2 + + x_coords = center_x + np.cos(angles) * radius_x + y_coords = center_y - np.sin(angles) * radius_y + + arc_lines = self.h_arc_lines if is_horizontal else self.v_arc_lines + for i, (x_coord, y_coord) in enumerate(zip(x_coords, y_coords, strict=True)): + arc_lines[i].x = x_coord + arc_lines[i].y = y_coord + + return arc_data diff --git a/iqpilot/selfdrive/ui/onroad/environment_renderer.py b/iqpilot/selfdrive/ui/onroad/environment_renderer.py new file mode 100644 index 000000000..33111498e --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/environment_renderer.py @@ -0,0 +1,141 @@ +import numpy as np +import pyray as rl +from iqpilot.cereal import custom + +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets import Widget + +MODE_OFF = 0 +MODE_OVERLAY = 1 +MODE_REPLACE = 2 + +_ENV_LABEL = custom.IQEnvironment.Object.Label +_OBJECT_COLORS = { + _ENV_LABEL.car: (40, 210, 200), + _ENV_LABEL.truck: (40, 210, 200), + _ENV_LABEL.bus: (40, 210, 200), + _ENV_LABEL.motorcycle: (90, 220, 255), + _ENV_LABEL.bicycle: (90, 220, 255), + _ENV_LABEL.person: (255, 210, 90), + _ENV_LABEL.stopSign: (255, 60, 45), + _ENV_LABEL.trafficLight: (255, 190, 0), +} + +_BOX_EDGES = ( + (0, 1), (1, 3), (3, 2), (2, 0), + (4, 5), (5, 7), (7, 6), (6, 4), + (0, 4), (1, 5), (2, 6), (3, 7), +) + +GRID_HALF_WIDTH = 12.0 +GRID_MAX_DISTANCE = 90.0 +GRID_STEP = 6.0 + + +class EnvironmentRenderer(Widget): + def __init__(self): + Widget.__init__(self) + self._car_space_transform = np.zeros((3, 3), dtype=np.float32) + self._mode = MODE_OFF + self._counter = 0 + + def set_transform(self, transform: np.ndarray): + self._car_space_transform = transform.astype(np.float32) + + def _project(self, pt: np.ndarray): + p = self._car_space_transform @ pt + if abs(p[2]) < 1e-6: + return None + return p[0] / p[2], p[1] / p[2] + + def _in_rect(self, x: float, y: float) -> bool: + r = self._rect + return r.x - 400 <= x <= r.x + r.width + 400 and r.y - 400 <= y <= r.y + r.height + 400 + + def _render(self, rect: rl.Rectangle): + sm = ui_state.sm + if self._counter % 30 == 0: + self._mode = int(ui_state.params.get("EnvironmentView", return_default=True) or 0) if ui_state.active_bundle else 0 + self._counter += 1 + + if self._mode == MODE_OFF: + return + if sm.recv_frame["extrinsicsCalibration"] < ui_state.started_frame: + return + + if self._mode == MODE_REPLACE: + self._draw_backdrop(rect) + self._draw_ground_grid() + if sm.valid["modelV2"]: + self._draw_model_scene(sm["modelV2"]) + + if sm.alive["iqEnvironment"] and sm.valid["iqEnvironment"]: + self._draw_objects(sm["iqEnvironment"]) + + def _draw_backdrop(self, rect: rl.Rectangle): + rl.draw_rectangle_gradient_v(int(rect.x), int(rect.y), int(rect.width), int(rect.height), + rl.Color(14, 17, 22, 255), rl.Color(6, 8, 11, 255)) + + def _draw_ground_grid(self): + col = rl.Color(60, 70, 82, 90) + dist = GRID_STEP + while dist <= GRID_MAX_DISTANCE: + a = self._project(np.array([dist, -GRID_HALF_WIDTH, 0.0])) + b = self._project(np.array([dist, GRID_HALF_WIDTH, 0.0])) + if a and b and self._in_rect(*a) and self._in_rect(*b): + rl.draw_line_ex(rl.Vector2(*a), rl.Vector2(*b), 1.5, col) + dist += GRID_STEP + for off in np.arange(-GRID_HALF_WIDTH, GRID_HALF_WIDTH + 0.1, 3.0): + a = self._project(np.array([GRID_STEP, float(off), 0.0])) + b = self._project(np.array([GRID_MAX_DISTANCE, float(off), 0.0])) + if a and b and self._in_rect(*a) and self._in_rect(*b): + rl.draw_line_ex(rl.Vector2(*a), rl.Vector2(*b), 1.5, col) + + def _draw_polyline(self, xs, ys, zs, color, thick): + pts = [] + for x, y, z in zip(xs, ys, zs, strict=False): + if x < 0: + continue + s = self._project(np.array([x, y, z], dtype=np.float32)) + if s and self._in_rect(*s): + pts.append(rl.Vector2(*s)) + for i in range(len(pts) - 1): + rl.draw_line_ex(pts[i], pts[i + 1], thick, color) + + def _draw_model_scene(self, model): + for i, lane in enumerate(model.laneLines): + a = int(np.clip(model.laneLineProbs[i], 0.0, 0.9) * 255) + self._draw_polyline(lane.x, lane.y, lane.z, rl.Color(235, 235, 235, a), 3.0) + for edge in model.roadEdges: + self._draw_polyline(edge.x, edge.y, edge.z, rl.Color(230, 70, 70, 180), 3.0) + pos = model.position + self._draw_polyline(pos.x, pos.y, pos.z, rl.Color(40, 210, 200, 220), 6.0) + + def _draw_objects(self, env): + for obj in env.objects: + self._draw_box(obj) + + def _draw_box(self, obj): + hx, hy = obj.length / 2.0, obj.width / 2.0 + base = np.array([ + [obj.x - hx, obj.y - hy, obj.z], [obj.x - hx, obj.y + hy, obj.z], + [obj.x + hx, obj.y - hy, obj.z], [obj.x + hx, obj.y + hy, obj.z], + [obj.x - hx, obj.y - hy, obj.z + obj.height], [obj.x - hx, obj.y + hy, obj.z + obj.height], + [obj.x + hx, obj.y - hy, obj.z + obj.height], [obj.x + hx, obj.y + hy, obj.z + obj.height], + ], dtype=np.float32) + + screen = [] + for corner in base: + s = self._project(corner) + if s is None or not self._in_rect(*s): + return + screen.append(s) + + r, g, b = _OBJECT_COLORS.get(obj.label, (40, 210, 200)) + a = int(np.clip(obj.prob, 0.3, 1.0) * 210) + floor = [rl.Vector2(*screen[i]) for i in (0, 1, 3, 2)] + rl.draw_triangle(floor[0], floor[1], floor[2], rl.Color(r, g, b, a // 5)) + rl.draw_triangle(floor[0], floor[2], floor[3], rl.Color(r, g, b, a // 5)) + for i, j in _BOX_EDGES: + rl.draw_line_ex(rl.Vector2(*screen[i]), rl.Vector2(*screen[j]), 2.0, rl.Color(r, g, b, a)) diff --git a/iqpilot/selfdrive/ui/onroad/exp_button.py b/iqpilot/selfdrive/ui/onroad/exp_button.py new file mode 100644 index 000000000..c24c747d1 --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/exp_button.py @@ -0,0 +1,87 @@ +import time +import pyray as rl +from iqpilot.common.params import Params +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.widgets import Widget + + +class ExpButton(Widget): + def __init__(self, button_size: int, icon_size: int): + super().__init__() + self._params = Params() + self._experimental_mode: bool = False + self._iq_dynamic_mode: bool = False + self._engageable: bool = False + + # State hold mechanism + self._hold_duration = 2.0 # seconds + self._held_mode: tuple | None = None # (experimental, iq_dynamic) or None + self._hold_end_time: float | None = None + + self._white_color: rl.Color = rl.Color(255, 255, 255, 255) + self._black_bg: rl.Color = rl.Color(0, 0, 0, 166) + self._txt_wheel: rl.Texture = gui_app.texture('icons/chffr_wheel.png', icon_size, icon_size) + self._txt_standard: rl.Texture = gui_app.texture('icons_mici/iqstandard_mode_tizi.png', icon_size, icon_size) + self._txt_pilot: rl.Texture = gui_app.texture('icons_mici/experimental_mode_tizi.png', icon_size, icon_size) + self._txt_dyn: rl.Texture = gui_app.texture('icons_mici/iqdynamic_mode_tizi.png', icon_size, icon_size) + self._rect = rl.Rectangle(0, 0, button_size, button_size) + + def set_rect(self, rect: rl.Rectangle) -> None: + self._rect.x, self._rect.y = rect.x, rect.y + + def _update_state(self) -> None: + selfdrive_state = ui_state.sm["selfdriveState"] + self._experimental_mode = selfdrive_state.experimentalMode + self._iq_dynamic_mode = self._params.get_bool("IQDynamicMode") + self._engageable = selfdrive_state.engageable or selfdrive_state.enabled + + def _handle_mouse_release(self, _): + super()._handle_mouse_release(_) + if not self._is_toggle_allowed(): + return + + exp, dyn = self._current_mode() + # Cycle: IQ.Chill → IQ.Dynamic → IQ.Pilot → IQ.Chill + if not exp: + new_exp, new_dyn = True, True + elif dyn: + new_exp, new_dyn = True, False + else: + new_exp, new_dyn = False, False + + self._params.put_bool("ExperimentalMode", new_exp) + self._params.put_bool("IQDynamicMode", new_dyn) + self._held_mode = (new_exp, new_dyn) + self._hold_end_time = time.monotonic() + self._hold_duration + + def _render(self, rect: rl.Rectangle) -> None: + center_x = int(self._rect.x + self._rect.width // 2) + center_y = int(self._rect.y + self._rect.height // 2) + + self._white_color.a = 180 if self.is_pressed or not self._engageable else 255 + + exp, dyn = self._current_mode() + if not ui_state.has_longitudinal_control: + texture = self._txt_wheel + elif exp and dyn: + texture = self._txt_dyn + elif exp: + texture = self._txt_pilot + else: + texture = self._txt_standard + rl.draw_circle(center_x, center_y, self._rect.width / 2, self._black_bg) + rl.draw_texture(texture, center_x - texture.width // 2, center_y - texture.height // 2, self._white_color) + + def _current_mode(self) -> tuple: + now = time.monotonic() + if self._hold_end_time and now < self._hold_end_time: + return self._held_mode + if self._hold_end_time and now >= self._hold_end_time: + self._hold_end_time = self._held_mode = None + return (self._experimental_mode, self._iq_dynamic_mode) + + def _is_toggle_allowed(self): + if not self._params.get_bool("ExperimentalModeConfirmed"): + return False + return ui_state.has_longitudinal_control diff --git a/iqpilot/selfdrive/ui/onroad/hud_renderer.py b/iqpilot/selfdrive/ui/onroad/hud_renderer.py new file mode 100644 index 000000000..db8a53795 --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/hud_renderer.py @@ -0,0 +1,251 @@ +import pyray as rl +from dataclasses import dataclass +from iqpilot.common.constants import CV +from iqpilot.selfdrive.ui.onroad.exp_button import ExpButton +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +# Constants +SET_SPEED_NA = 255 +KM_TO_MILE = 0.621371 +CRUISE_DISABLED_CHAR = '–' + + +@dataclass(frozen=True) +class UIConfig: + header_height: int = 300 + border_size: int = 30 + button_size: int = 192 + set_speed_width_metric: int = 186 + set_speed_width_imperial: int = 174 + set_speed_height: int = 228 + wheel_icon_size: int = 144 + + +@dataclass(frozen=True) +class FontSizes: + current_speed: int = 176 + speed_unit: int = 66 + max_speed: int = 28 + set_speed: int = 74 + limit_speed: int = 64 + limit_offset: int = 30 + limit_unit: int = 22 + limit_label: int = 24 + + +@dataclass(frozen=True) +class Colors: + WHITE = rl.WHITE + DISENGAGED = rl.Color(145, 155, 149, 255) + OVERRIDE = rl.Color(145, 155, 149, 255) # Added + ENGAGED = rl.Color(0x0C, 0x94, 0x96, 0xFF) + LIMIT_ENGAGED = rl.Color(0x27, 0xF5, 0xD3, 0xFF) + DISENGAGED_BG = rl.Color(0, 0, 0, 153) + OVERRIDE_BG = rl.Color(145, 155, 149, 204) + ENGAGED_BG = rl.Color(128, 216, 166, 204) + GREY = rl.Color(166, 166, 166, 255) + DARK_GREY = rl.Color(114, 114, 114, 255) + BLACK_TRANSLUCENT = rl.Color(0, 0, 0, 166) + WHITE_TRANSLUCENT = rl.Color(255, 255, 255, 200) + BORDER_TRANSLUCENT = rl.Color(255, 255, 255, 75) + HEADER_GRADIENT_START = rl.Color(0, 0, 0, 114) + HEADER_GRADIENT_END = rl.BLANK + + +UI_CONFIG = UIConfig() +FONT_SIZES = FontSizes() +COLORS = Colors() + + +class HudRenderer(Widget): + def __init__(self): + super().__init__() + """Initialize the HUD renderer.""" + self.is_cruise_set: bool = False + self.is_cruise_available: bool = True + self.set_speed: float = SET_SPEED_NA + self.speed: float = 0.0 + self.v_ego_cluster_seen: bool = False + self.limit_speed_text: str = "---" + self.limit_offset_text: str = "" + self.limit_available: bool = False + + self._font_semi_bold: rl.Font = gui_app.font(FontWeight.SEMI_BOLD) + self._font_bold: rl.Font = gui_app.font(FontWeight.BOLD) + self._font_medium: rl.Font = gui_app.font(FontWeight.MEDIUM) + + self._exp_button: ExpButton = ExpButton(UI_CONFIG.button_size, UI_CONFIG.wheel_icon_size) + + def _update_state(self) -> None: + """Update HUD state based on car state and controls state.""" + sm = ui_state.sm + if sm.recv_frame["carState"] < ui_state.started_frame: + self.is_cruise_set = False + self.set_speed = SET_SPEED_NA + self.speed = 0.0 + return + + controls_state = sm['controlsState'] + car_state = sm['carState'] + + v_cruise_cluster = car_state.vCruiseCluster + self.set_speed = ( + controls_state.vCruiseDEPRECATED if v_cruise_cluster == 0.0 else v_cruise_cluster + ) + self.is_cruise_set = 0 < self.set_speed < SET_SPEED_NA + self.is_cruise_available = self.set_speed != -1 + + if self.is_cruise_set and not ui_state.is_metric: + self.set_speed *= KM_TO_MILE + + v_ego_cluster = car_state.vEgoCluster + self.v_ego_cluster_seen = self.v_ego_cluster_seen or v_ego_cluster != 0.0 + v_ego = v_ego_cluster if self.v_ego_cluster_seen else car_state.vEgo + speed_conversion = CV.MS_TO_KPH if ui_state.is_metric else CV.MS_TO_MPH + self.speed = max(0.0, v_ego * speed_conversion) + + def _render(self, rect: rl.Rectangle) -> None: + """Render HUD elements to the screen.""" + # Draw the header background + rl.draw_rectangle_gradient_v( + int(rect.x), + int(rect.y), + int(rect.width), + UI_CONFIG.header_height, + COLORS.HEADER_GRADIENT_START, + COLORS.HEADER_GRADIENT_END, + ) + + if self.is_cruise_available: + self._draw_set_speed(rect) + + self._draw_current_speed(rect) + + button_x = rect.x + rect.width - UI_CONFIG.border_size - UI_CONFIG.button_size + button_y = rect.y + UI_CONFIG.border_size + self._exp_button.render(rl.Rectangle(button_x, button_y, UI_CONFIG.button_size, UI_CONFIG.button_size)) + + def user_interacting(self) -> bool: + return self._exp_button.is_pressed + + def _draw_set_speed(self, rect: rl.Rectangle) -> None: + """Draw the compact stacked LIMIT / MAX speed indicator box.""" + set_speed_width = UI_CONFIG.set_speed_width_metric if ui_state.is_metric else UI_CONFIG.set_speed_width_imperial + x = rect.x + 60 + (UI_CONFIG.set_speed_width_imperial - set_speed_width) // 2 + y = rect.y + 45 + + set_speed_rect = rl.Rectangle(x, y, set_speed_width, UI_CONFIG.set_speed_height) + rl.draw_rectangle_rounded(set_speed_rect, 0.35, 10, COLORS.BLACK_TRANSLUCENT) + rl.draw_rectangle_rounded_lines_ex(set_speed_rect, 0.35, 10, 6, COLORS.BORDER_TRANSLUCENT) + split_y = y + 112 + rl.draw_line_ex( + rl.Vector2(x + 18, split_y), + rl.Vector2(x + set_speed_width - 18, split_y), + 3, + COLORS.BORDER_TRANSLUCENT, + ) + + max_color = COLORS.DARK_GREY + set_speed_color = COLORS.WHITE + limit_value_color = COLORS.WHITE if self.limit_available else COLORS.DARK_GREY + if self.is_cruise_set: + if ui_state.status == UIStatus.ENGAGED: + max_color = COLORS.ENGAGED + if self.limit_available: + limit_value_color = COLORS.LIMIT_ENGAGED + elif ui_state.status == UIStatus.DISENGAGED: + max_color = COLORS.DISENGAGED + elif ui_state.status == UIStatus.OVERRIDE: + max_color = COLORS.OVERRIDE + + limit_value_text = self.limit_speed_text + if len(limit_value_text) <= 2: + limit_value_size = FONT_SIZES.limit_speed + elif len(limit_value_text) == 3: + limit_value_size = 56 + else: + limit_value_size = 48 + limit_value_width = measure_text_cached(self._font_bold, limit_value_text, limit_value_size).x + limit_offset_text = self.limit_offset_text if self.limit_available else "" + limit_offset_width = 0.0 + if limit_offset_text: + limit_offset_width = measure_text_cached(self._font_semi_bold, limit_offset_text, FONT_SIZES.limit_offset).x + 8 + limit_value_x = x + (set_speed_width - limit_value_width - limit_offset_width) / 2 + rl.draw_text_ex( + self._font_bold, + limit_value_text, + rl.Vector2(limit_value_x, y + 14), + limit_value_size, + 0, + limit_value_color, + ) + if limit_offset_text: + rl.draw_text_ex( + self._font_semi_bold, + limit_offset_text, + rl.Vector2(limit_value_x + limit_value_width + 8, y + 22), + FONT_SIZES.limit_offset, + 0, + COLORS.WHITE_TRANSLUCENT, + ) + + if self.limit_available: + limit_unit_text = tr("LIMIT") + limit_unit_width = measure_text_cached(self._font_medium, limit_unit_text, FONT_SIZES.limit_unit).x + rl.draw_text_ex( + self._font_medium, + limit_unit_text, + rl.Vector2(x + (set_speed_width - limit_unit_width) / 2, y + 78), + FONT_SIZES.limit_unit, + 0, + COLORS.WHITE_TRANSLUCENT, + ) + else: + limit_label_text = tr("LIMIT") + limit_label_width = measure_text_cached(self._font_semi_bold, limit_label_text, FONT_SIZES.limit_label).x + rl.draw_text_ex( + self._font_semi_bold, + limit_label_text, + rl.Vector2(x + (set_speed_width - limit_label_width) / 2, y + 74), + FONT_SIZES.limit_label, + 0, + COLORS.GREY, + ) + + max_text = tr("MAX") + max_text_width = measure_text_cached(self._font_semi_bold, max_text, FONT_SIZES.max_speed).x + rl.draw_text_ex( + self._font_semi_bold, + max_text, + rl.Vector2(x + (set_speed_width - max_text_width) / 2, y + 118), + FONT_SIZES.max_speed, + 0, + max_color, + ) + + set_speed_text = CRUISE_DISABLED_CHAR if not self.is_cruise_set else str(round(self.set_speed)) + speed_text_width = measure_text_cached(self._font_bold, set_speed_text, FONT_SIZES.set_speed).x + rl.draw_text_ex( + self._font_bold, + set_speed_text, + rl.Vector2(x + (set_speed_width - speed_text_width) / 2, y + 136), + FONT_SIZES.set_speed, + 0, + set_speed_color, + ) + + def _draw_current_speed(self, rect: rl.Rectangle) -> None: + """Draw the current vehicle speed and unit.""" + speed_text = str(round(self.speed)) + speed_text_size = measure_text_cached(self._font_bold, speed_text, FONT_SIZES.current_speed) + speed_pos = rl.Vector2(rect.x + rect.width / 2 - speed_text_size.x / 2, 180 - speed_text_size.y / 2) + rl.draw_text_ex(self._font_bold, speed_text, speed_pos, FONT_SIZES.current_speed, 0, COLORS.WHITE) + + unit_text = tr("km/h") if ui_state.is_metric else tr("mph") + unit_text_size = measure_text_cached(self._font_medium, unit_text, FONT_SIZES.speed_unit) + unit_pos = rl.Vector2(rect.x + rect.width / 2 - unit_text_size.x / 2, 290 - unit_text_size.y / 2) + rl.draw_text_ex(self._font_medium, unit_text, unit_pos, FONT_SIZES.speed_unit, 0, COLORS.WHITE_TRANSLUCENT) diff --git a/iqpilot/selfdrive/ui/onroad/model_renderer.py b/iqpilot/selfdrive/ui/onroad/model_renderer.py new file mode 100644 index 000000000..6b4462a7b --- /dev/null +++ b/iqpilot/selfdrive/ui/onroad/model_renderer.py @@ -0,0 +1,612 @@ +import colorsys +import numpy as np +import pyray as rl +from iqpilot.cereal import car, custom +from dataclasses import dataclass, field +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.params import Params +from iqpilot.selfdrive.locationd.calibrationd import HEIGHT_INIT +from iqpilot.selfdrive.locationd.calibration_helpers import get_render_path_height +from iqpilot.selfdrive.ui.ui_state import ui_state, log_param_from_bytes +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.shader_polygon import draw_polygon, Gradient +from iqpilot.system.ui.widgets import Widget + +from iqpilot.ui.onroad.hud_overlays import ChevronMetrics +from iqpilot.ui.onroad.lead_confidence import driving_confidence + +CLIP_MARGIN = 500 +MIN_DRAW_DISTANCE = 10.0 +MAX_DRAW_DISTANCE = 100.0 + +_VT_LABEL = custom.IQVehicleTracks.Track.Label +VEHICLE_TRACK_LABELS = (_VT_LABEL.car, _VT_LABEL.motorcycle, _VT_LABEL.bus, _VT_LABEL.truck) +SIGN_TRACK_COLORS = { + _VT_LABEL.stopSign: rl.Color(255, 60, 45, 200), + _VT_LABEL.trafficLight: rl.Color(255, 190, 0, 200), +} + +THROTTLE_COLORS = [ + rl.Color(13, 248, 122, 102), # HSLF(148/360, 0.94, 0.51, 0.4) + rl.Color(114, 255, 92, 89), # HSLF(112/360, 1.0, 0.68, 0.35) + rl.Color(114, 255, 92, 0), # HSLF(112/360, 1.0, 0.68, 0.0) +] + +NO_THROTTLE_COLORS = [ + rl.Color(242, 242, 242, 102), # HSLF(148/360, 0.0, 0.95, 0.4) + rl.Color(242, 242, 242, 89), # HSLF(112/360, 0.0, 0.95, 0.35) + rl.Color(242, 242, 242, 0), # HSLF(112/360, 0.0, 0.95, 0.0) +] + +@dataclass +class ModelPoints: + raw_points: np.ndarray = field(default_factory=lambda: np.empty((0, 3), dtype=np.float32)) + projected_points: np.ndarray = field(default_factory=lambda: np.empty((0, 2), dtype=np.float32)) + + +@dataclass +class LeadVehicle: + center: tuple[float, float] | None = None + radius: float = 0.0 + sz: float = 0.0 + fill_alpha: int = 0 + + +@dataclass +class VisionDot: + x: float + y: float + tx: float + ty: float + radius: float + tradius: float + alpha: float = 0.0 + talpha: float = 1.0 + rgb: tuple[int, int, int] | None = None + + +_VD_EASE = 0.4 + + +class ModelRenderer(Widget): + def __init__(self): + Widget.__init__(self) + self.chevron_metrics = ChevronMetrics() + self._lead_orb = gui_app.texture("icons/lead_orb.png", 256, 256) + self._longitudinal_control = False + self._experimental_mode = False + self._blend_filter = FirstOrderFilter(1.0, 0.25, 1 / gui_app.target_fps) + self._prev_allow_throttle = True + self._lane_line_probs = np.zeros(4, dtype=np.float32) + self._road_edge_stds = np.zeros(2, dtype=np.float32) + self._lead_vehicles = [LeadVehicle(), LeadVehicle()] + self._track_dots: list[LeadVehicle] = [] + self._vision_dots: list[VisionDot] = [] + self._vt_frame = -1 + self._frame_transform: np.ndarray | None = None + self._frame_transform_wide = False + self._path_offset_z = HEIGHT_INIT[0] + self._counter = -1 + self._camera_offset = ui_state.params.get("CameraOffset", return_default=True) if ui_state.active_bundle else 0.0 + self._ambient_dots = bool(ui_state.params.get("AmbientTrackDots", return_default=True)) + # Initialize ModelPoints objects + self._path = ModelPoints() + self._lane_lines = [ModelPoints() for _ in range(4)] + self._road_edges = [ModelPoints() for _ in range(2)] + self._acceleration_x = np.empty((0,), dtype=np.float32) + + # Transform matrix (3x3 for car space to screen space) + self._car_space_transform = np.zeros((3, 3), dtype=np.float32) + self._transform_dirty = True + self._clip_region = None + + self._exp_gradient = Gradient( + start=(0.0, 1.0), # Bottom of path + end=(0.0, 0.0), # Top of path + colors=[], + stops=[], + ) + + # Get longitudinal control setting from car parameters + if (cp := log_param_from_bytes(Params(), "CarParams", car.CarParams)) is not None: + self._longitudinal_control = cp.openpilotLongitudinalControl + + def set_transform(self, transform: np.ndarray): + self._car_space_transform = transform.astype(np.float32) + self._transform_dirty = True + + def set_frame_transform(self, transform: np.ndarray, is_wide: bool): + self._frame_transform = transform.astype(np.float32) + self._frame_transform_wide = is_wide + + def _render(self, rect: rl.Rectangle): + sm = ui_state.sm + driving_confidence.update() + + # Check if data is up-to-date + if (sm.recv_frame["extrinsicsCalibration"] < ui_state.started_frame or + sm.recv_frame["modelV2"] < ui_state.started_frame): + return + + # Set up clipping region + self._clip_region = rl.Rectangle( + rect.x - CLIP_MARGIN, rect.y - CLIP_MARGIN, rect.width + 2 * CLIP_MARGIN, rect.height + 2 * CLIP_MARGIN + ) + + # Update state + self._experimental_mode = sm['selfdriveState'].experimentalMode + + live_calib = sm['extrinsicsCalibration'] + self._path_offset_z = get_render_path_height(live_calib) + + if self._counter % 60 == 0: + self._camera_offset = ui_state.params.get("CameraOffset", return_default=True) if ui_state.active_bundle else 0.0 + self._ambient_dots = bool(ui_state.params.get("AmbientTrackDots", return_default=True)) + self._counter += 1 + + if sm.updated['carParams']: + self._longitudinal_control = sm['carParams'].openpilotLongitudinalControl + + model = sm['modelV2'] + radar_state = sm['radarState'] if sm.valid['radarState'] else None + lead_one = radar_state.leadOne if radar_state else None + render_lead_indicator = self._longitudinal_control and radar_state is not None + + # Update model data when needed + model_updated = sm.updated['modelV2'] + if model_updated or sm.updated['radarState'] or self._transform_dirty: + if model_updated: + self._update_raw_points(model) + + path_x_array = self._path.raw_points[:, 0] + if path_x_array.size == 0: + return + + self._update_model(lead_one, path_x_array) + if render_lead_indicator: + self._update_leads(radar_state, path_x_array) + if self._ambient_dots: + self._update_track_dots(sm, radar_state, path_x_array) + else: + self._track_dots = [] + self._transform_dirty = False + + # Draw elements + self._draw_lane_lines() + self._draw_path(sm) + + if self._ambient_dots: + self._update_vision_dots(sm) + self._draw_vision_dots() + + if render_lead_indicator and radar_state: + if self._ambient_dots: + self._draw_track_dots() + self._draw_lead_indicator() + self.chevron_metrics.draw_lead_status(sm, radar_state, self._rect, self._lead_vehicles) + + def _update_raw_points(self, model): + """Update raw 3D points from model data""" + self._path.raw_points = np.array([model.position.x, np.array(model.position.y) + self._camera_offset, model.position.z], dtype=np.float32).T + + for i, lane_line in enumerate(model.laneLines): + self._lane_lines[i].raw_points = np.array([lane_line.x, np.array(lane_line.y) + self._camera_offset, lane_line.z], dtype=np.float32).T + + for i, road_edge in enumerate(model.roadEdges): + self._road_edges[i].raw_points = np.array([road_edge.x, np.array(road_edge.y) + self._camera_offset, road_edge.z], dtype=np.float32).T + + self._lane_line_probs = np.array(model.laneLineProbs, dtype=np.float32) + self._road_edge_stds = np.array(model.roadEdgeStds, dtype=np.float32) + self._acceleration_x = np.array(model.acceleration.x, dtype=np.float32) + + def _update_leads(self, radar_state, path_x_array): + """Update positions of lead vehicles""" + self._lead_vehicles = [LeadVehicle(), LeadVehicle()] + leads = [radar_state.leadOne, radar_state.leadTwo] + + for i, lead_data in enumerate(leads): + if lead_data and lead_data.status: + d_rel, y_rel, v_rel = lead_data.dRel, lead_data.yRel, lead_data.vRel + idx = self._get_path_length_idx(path_x_array, d_rel) + + # Get z-coordinate from path at the lead vehicle position + z = self._path.raw_points[idx, 2] if idx < len(self._path.raw_points) else 0.0 + point = self._map_to_screen(d_rel, -y_rel + self._camera_offset, z + self._path_offset_z) + if point: + self._lead_vehicles[i] = self._update_lead_vehicle(d_rel, v_rel, point, self._rect) + + def _update_track_dots(self, sm, radar_state, path_x_array): + self._track_dots = [] + if not sm.valid['radarTracks']: + return + + lead_track_ids = {lead.radarTrackId for lead in (radar_state.leadOne, radar_state.leadTwo) + if lead.status and lead.radarTrackId >= 0} + + for pt in sm['radarTracks'].points: + if pt.trackId in lead_track_ids or pt.dRel < 1.0 or abs(pt.yRel) > 10.0: + continue + + idx = self._get_path_length_idx(path_x_array, pt.dRel) + z = self._path.raw_points[idx, 2] if idx < len(self._path.raw_points) else 0.0 + point = self._map_to_screen(pt.dRel, -pt.yRel + self._camera_offset, z + self._path_offset_z) + if point is None: + continue + + sz = np.clip((25 * 30) / (pt.dRel / 3 + 30), 15.0, 30.0) * 1.1 + radius = sz * 1.1 + x, y = point + if not (self._rect.x <= x <= self._rect.x + self._rect.width and + self._rect.y <= y <= self._rect.y + self._rect.height): + continue + + self._track_dots.append(LeadVehicle(center=(float(x), float(y)), radius=float(radius), sz=float(sz))) + + def _update_vision_dots(self, sm): + # iqVehicleTracks arrives at a few Hz; the dots are eased toward the latest + # detection every render frame so they glide instead of teleporting. + hidden = (self._frame_transform is None or + not sm.alive['iqVehicleTracks'] or not sm.valid['iqVehicleTracks']) + if not hidden: + vt = sm['iqVehicleTracks'] + hidden = bool(vt.wide) != self._frame_transform_wide or vt.frameWidth == 0 or vt.frameHeight == 0 + + if hidden: + for d in self._vision_dots: + d.talpha = 0.0 + elif vt.frameId != self._vt_frame: + self._vt_frame = vt.frameId + self._retarget_vision_dots(vt) + + for d in self._vision_dots: + d.x += (d.tx - d.x) * _VD_EASE + d.y += (d.ty - d.y) * _VD_EASE + d.radius += (d.tradius - d.radius) * _VD_EASE + d.alpha += (d.talpha - d.alpha) * _VD_EASE + self._vision_dots = [d for d in self._vision_dots if d.alpha > 0.02 or d.talpha > 0.0] + + def _retarget_vision_dots(self, vt): + fw, fh = vt.frameWidth, vt.frameHeight + m = self._frame_transform + occupied = [d.center for d in self._lead_vehicles + self._track_dots if d.center is not None] + + targets = [] + for t in vt.tracks: + is_vehicle = t.label in VEHICLE_TRACK_LABELS + sign_color = SIGN_TRACK_COLORS.get(t.label) + if not is_vehicle and sign_color is None: + continue + cx_f = (t.x1 + t.x2) / 2.0 * fw + cy_f = (t.y1 + t.y2) / 2.0 * fh + x = m[0, 0] * cx_f + m[0, 2] + y = m[1, 1] * cy_f + m[1, 2] + if not (self._rect.x <= x <= self._rect.x + self._rect.width and + self._rect.y <= y <= self._rect.y + self._rect.height): + continue + box_h = (t.y2 - t.y1) * fh * m[1, 1] + radius = float(np.clip(box_h * 0.35, 14.0, 40.0)) + if sign_color is not None: + targets.append((x, y, min(radius, 22.0), (sign_color.r, sign_color.g, sign_color.b))) + elif not any((x - ox) ** 2 + (y - oy) ** 2 < (radius * 2.2) ** 2 for ox, oy in occupied): + targets.append((x, y, radius, None)) + + dots = self._vision_dots + used = [False] * len(dots) + for tx, ty, tr, rgb in targets: + best, best_d2 = -1, 1e18 + for i, d in enumerate(dots): + if used[i] or (d.rgb is None) != (rgb is None): + continue + d2 = (d.x - tx) ** 2 + (d.y - ty) ** 2 + if d2 < best_d2: + best, best_d2 = i, d2 + if best >= 0 and best_d2 <= (max(tr, dots[best].radius) * 3.0) ** 2: + d = dots[best] + used[best] = True + d.tx, d.ty, d.tradius, d.talpha, d.rgb = tx, ty, tr, 1.0, rgb + else: + dots.append(VisionDot(x=tx, y=ty, tx=tx, ty=ty, radius=tr, tradius=tr, alpha=0.0, talpha=1.0, rgb=rgb)) + used.append(True) + + for i, d in enumerate(dots): + if not used[i]: + d.talpha = 0.0 + + def _update_model(self, lead, path_x_array): + """Update model visualization data based on model message""" + max_distance = np.clip(path_x_array[-1], MIN_DRAW_DISTANCE, MAX_DRAW_DISTANCE) + max_idx = self._get_path_length_idx(self._lane_lines[0].raw_points[:, 0], max_distance) + + # Update lane lines using raw points + for i, lane_line in enumerate(self._lane_lines): + lane_line.projected_points = self._map_line_to_polygon( + lane_line.raw_points, 0.025 * self._lane_line_probs[i], 0.0, max_idx, max_distance + ) + + # Update road edges using raw points + for road_edge in self._road_edges: + road_edge.projected_points = self._map_line_to_polygon(road_edge.raw_points, 0.025, 0.0, max_idx, max_distance) + + # Update path using raw points + if lead and lead.status: + lead_d = lead.dRel * 2.0 + max_distance = np.clip(lead_d - min(lead_d * 0.35, 10.0), 0.0, max_distance) + + max_idx = self._get_path_length_idx(path_x_array, max_distance) + self._path.projected_points = self._map_line_to_polygon( + self._path.raw_points, 0.9, self._path_offset_z, max_idx, max_distance, allow_invert=False + ) + + self._update_experimental_gradient() + + def _update_experimental_gradient(self): + """Pre-calculate experimental mode gradient colors""" + if not self._experimental_mode: + return + + max_len = min(len(self._path.projected_points) // 2, len(self._acceleration_x)) + + segment_colors = [] + gradient_stops = [] + + i = 0 + while i < max_len: + # Some points (screen space) are out of frame (rect space) + track_y = self._path.projected_points[i][1] + if track_y < self._rect.y or track_y > (self._rect.y + self._rect.height): + i += 1 + continue + + # Calculate color based on acceleration (0 is bottom, 1 is top) + lin_grad_point = 1 - (track_y - self._rect.y) / self._rect.height + + # speed up: 120, slow down: 0 + path_hue = np.clip(60 + self._acceleration_x[i] * 35, 0, 120) + + saturation = min(abs(self._acceleration_x[i] * 1.5), 1) + lightness = np.interp(saturation, [0.0, 1.0], [0.95, 0.62]) + alpha = np.interp(lin_grad_point, [0.75 / 2.0, 0.75], [0.4, 0.0]) + + # Use HSL to RGB conversion + color = self._hsla_to_color(path_hue / 360.0, saturation, lightness, alpha) + + gradient_stops.append(lin_grad_point) + segment_colors.append(color) + + # Skip a point, unless next is last + i += 1 + (1 if (i + 2) < max_len else 0) + + # Store the gradient in the path object + self._exp_gradient = Gradient( + start=(0.0, 1.0), # Bottom of path + end=(0.0, 0.0), # Top of path + colors=segment_colors, + stops=gradient_stops, + ) + + def _update_lead_vehicle(self, d_rel, v_rel, point, rect): + speed_buff, lead_buff = 10.0, 40.0 + + # Calculate fill alpha + fill_alpha = 0 + if d_rel < lead_buff: + fill_alpha = 255 * (1.0 - (d_rel / lead_buff)) + if v_rel < 0: + fill_alpha += 255 * (-1 * (v_rel / speed_buff)) + fill_alpha = min(fill_alpha, 255) + + # Calculate size and position. Distance-scaled orb radius (closer lead -> bigger orb). + sz = np.clip((25 * 30) / (d_rel / 3 + 30), 15.0, 30.0) * 2.35 + radius = sz * 1.1 + # point is in absolute screen coords; clamp against the rect's absolute bounds so the orb stays + # fully on-screen (rect-relative bounds mis-placed it when the camera pane is offset, e.g. split nav) + x = np.clip(point[0], rect.x + radius, rect.x + rect.width - radius) + y = np.clip(point[1], rect.y + radius, rect.y + rect.height - radius) + + return LeadVehicle(center=(float(x), float(y)), radius=float(radius), sz=float(sz), fill_alpha=int(fill_alpha)) + + def _draw_lane_lines(self): + """Draw lane lines and road edges""" + for i, lane_line in enumerate(self._lane_lines): + if lane_line.projected_points.size == 0: + continue + + alpha = np.clip(self._lane_line_probs[i], 0.0, 0.7) + color = rl.Color(255, 255, 255, int(alpha * 255)) + draw_polygon(self._rect, lane_line.projected_points, color) + + for i, road_edge in enumerate(self._road_edges): + if road_edge.projected_points.size == 0: + continue + + alpha = np.clip(1.0 - self._road_edge_stds[i], 0.0, 1.0) + color = rl.Color(255, 0, 0, int(alpha * 255)) + draw_polygon(self._rect, road_edge.projected_points, color) + + def _draw_path(self, sm): + """Draw path with dynamic coloring based on mode and throttle state.""" + if not self._path.projected_points.size: + return + + allow_throttle = sm['longitudinalPlan'].allowThrottle or not self._longitudinal_control + self._blend_filter.update(int(allow_throttle)) + + + if self._experimental_mode: + # Draw with acceleration coloring + if len(self._exp_gradient.colors) > 1: + draw_polygon(self._rect, self._path.projected_points, gradient=self._exp_gradient) + else: + draw_polygon(self._rect, self._path.projected_points, rl.Color(255, 255, 255, 30)) + else: + # Blend throttle/no throttle colors based on transition + blend_factor = round(self._blend_filter.x * 100) / 100 + blended_colors = self._blend_colors(NO_THROTTLE_COLORS, THROTTLE_COLORS, blend_factor) + gradient = Gradient( + start=(0.0, 1.0), # Bottom of path + end=(0.0, 0.0), # Top of path + colors=blended_colors, + stops=[0.0, 0.5, 1.0], + ) + draw_polygon(self._rect, self._path.projected_points, gradient=gradient) + + # concentric layers (outer faint -> inner bright) build a soft center-out glow using only + # draw_circle, which is signature-stable across raylib versions (draw_circle_gradient is not) + _VD_GLOW = ((1.0, 26), (0.72, 38), (0.48, 54), (0.26, 78)) + + def _draw_vision_dots(self): + for dot in self._vision_dots: + a = dot.alpha + if a <= 0.02: + continue + x, y = int(dot.x), int(dot.y) + cr, cg, cb = (40, 210, 200) if dot.rgb is None else dot.rgb + for frac, base in self._VD_GLOW: + rl.draw_circle(x, y, dot.radius * frac, rl.Color(cr, cg, cb, int(base * a))) + + def _draw_track_dots(self): + src = rl.Rectangle(0, 0, self._lead_orb.width, self._lead_orb.height) + for dot in self._track_dots: + cx, cy = dot.center + r = dot.radius + dest = rl.Rectangle(cx, cy, r * 2.0, r * 2.0) + rl.draw_texture_pro(self._lead_orb, src, dest, rl.Vector2(r, r), 0.0, rl.Color(255, 255, 255, 90)) + + def _draw_lead_indicator(self): + tint, _ = driving_confidence.colors() + src = rl.Rectangle(0, 0, self._lead_orb.width, self._lead_orb.height) + for lead in self._lead_vehicles: + if lead.center is None: + continue + cx, cy = lead.center + r = lead.radius + alpha = int(np.clip(140 + 115 * (lead.fill_alpha / 255.0), 0, 255)) + dest = rl.Rectangle(cx, cy, r * 2.0, r * 2.0) + rl.draw_texture_pro(self._lead_orb, src, dest, rl.Vector2(r, r), 0.0, rl.Color(tint.r, tint.g, tint.b, alpha)) + + @staticmethod + def _get_path_length_idx(pos_x_array: np.ndarray, path_distance: float) -> int: + """Get the index corresponding to the given path distance""" + if len(pos_x_array) == 0: + return 0 + indices = np.where(pos_x_array <= path_distance)[0] + return indices[-1] if indices.size > 0 else 0 + + def _map_to_screen(self, in_x, in_y, in_z): + """Project a point in car space to screen space""" + input_pt = np.array([in_x, in_y, in_z]) + pt = self._car_space_transform @ input_pt + + if abs(pt[2]) < 1e-6: + return None + + x, y = pt[0] / pt[2], pt[1] / pt[2] + + clip = self._clip_region + if not (clip.x <= x <= clip.x + clip.width and clip.y <= y <= clip.y + clip.height): + return None + + return (x, y) + + def _map_line_to_polygon(self, line: np.ndarray, y_off: float, z_off: float, max_idx: int, max_distance: float, allow_invert: bool = True) -> np.ndarray: + """Convert 3D line to 2D polygon for rendering.""" + if line.shape[0] == 0: + return np.empty((0, 2), dtype=np.float32) + + # Slice points and filter non-negative x-coordinates + points = line[:max_idx + 1] + + # Interpolate around max_idx so path end is smooth. Only when max_distance genuinely + if 0 < max_idx < line.shape[0] - 1: + p0 = line[max_idx] + p1 = line[max_idx + 1] + x0, x1 = p0[0], p1[0] + if x0 <= max_distance <= x1: + interp_y = np.interp(max_distance, [x0, x1], [p0[1], p1[1]]) + interp_z = np.interp(max_distance, [x0, x1], [p0[2], p1[2]]) + interp_point = np.array([max_distance, interp_y, interp_z], dtype=points.dtype) + points = np.concatenate((points, interp_point[None, :]), axis=0) + + points = points[points[:, 0] >= 0.5] + if points.shape[0] == 0: + return np.empty((0, 2), dtype=np.float32) + + N = points.shape[0] + # Generate left and right 3D points in one array using broadcasting + offsets = np.array([[0, -y_off, z_off], [0, y_off, z_off]], dtype=np.float32) + points_3d = points[None, :, :] + offsets[:, None, :] # Shape: 2xNx3 + points_3d = points_3d.reshape(2 * N, 3) # Shape: (2*N)x3 + + # Transform all points to projected space in one operation + proj = self._car_space_transform @ points_3d.T # Shape: 3x(2*N) + proj = proj.reshape(3, 2, N) + left_proj = proj[:, 0, :] + right_proj = proj[:, 1, :] + + # Filter points where z is sufficiently large + valid_proj = (np.abs(left_proj[2]) >= 1e-6) & (np.abs(right_proj[2]) >= 1e-6) + if not np.any(valid_proj): + return np.empty((0, 2), dtype=np.float32) + + # Compute screen coordinates + left_screen = left_proj[:2, valid_proj] / left_proj[2, valid_proj][None, :] + right_screen = right_proj[:2, valid_proj] / right_proj[2, valid_proj][None, :] + + # Define clip region bounds + clip = self._clip_region + x_min, x_max = clip.x, clip.x + clip.width + y_min, y_max = clip.y, clip.y + clip.height + + # Filter points within clip region + left_in_clip = ( + (left_screen[0] >= x_min) & (left_screen[0] <= x_max) & + (left_screen[1] >= y_min) & (left_screen[1] <= y_max) + ) + right_in_clip = ( + (right_screen[0] >= x_min) & (right_screen[0] <= x_max) & + (right_screen[1] >= y_min) & (right_screen[1] <= y_max) + ) + both_in_clip = left_in_clip & right_in_clip + + if not np.any(both_in_clip): + return np.empty((0, 2), dtype=np.float32) + + # Select valid and clipped points + left_screen = left_screen[:, both_in_clip] + right_screen = right_screen[:, both_in_clip] + + # Handle Y-coordinate inversion on hills + if not allow_invert and left_screen.shape[1] > 1: + y = left_screen[1, :] # y-coordinates + keep = y == np.minimum.accumulate(y) + if not np.any(keep): + return np.empty((0, 2), dtype=np.float32) + left_screen = left_screen[:, keep] + right_screen = right_screen[:, keep] + + return np.vstack((left_screen.T, right_screen[:, ::-1].T)).astype(np.float32) + + @staticmethod + def _hsla_to_color(h, s, l, a): + rgb = colorsys.hls_to_rgb(h, l, s) + return rl.Color( + int(rgb[0] * 255), + int(rgb[1] * 255), + int(rgb[2] * 255), + int(a * 255) + ) + + @staticmethod + def _blend_colors(begin_colors, end_colors, t): + if t >= 1.0: + return end_colors + if t <= 0.0: + return begin_colors + + inv_t = 1.0 - t + return [rl.Color( + int(inv_t * start.r + t * end.r), + int(inv_t * start.g + t * end.g), + int(inv_t * start.b + t * end.b), + int(inv_t * start.a + t * end.a) + ) for start, end in zip(begin_colors, end_colors, strict=True)] diff --git a/iqpilot/selfdrive/ui/soundd.py b/iqpilot/selfdrive/ui/soundd.py new file mode 100644 index 000000000..d002bb662 --- /dev/null +++ b/iqpilot/selfdrive/ui/soundd.py @@ -0,0 +1,265 @@ +from collections import deque +import math +import numpy as np +import time +import threading +import wave + + +from iqpilot.cereal import car, messaging, custom +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.realtime import Ratekeeper +from iqpilot.common.utils import retry +from iqpilot.common.swaglog import cloudlog + +from iqpilot.system import micd +from iqpilot.system.hardware import HARDWARE + +from iqpilot.selfdrive.ui.alert_sound_filter import AlertSoundFilter + +SAMPLE_RATE = 48000 +SAMPLE_BUFFER = 4096 # (approx 100ms) +WEBRTC_AUDIO_BUFFER_FRAMES = SAMPLE_RATE # 1s max queued remote audio +WEBRTC_AUDIO_PREBUFFER_FRAMES = SAMPLE_RATE // 5 # 200ms before starting remote audio playback +MAX_VOLUME = 1.0 +MIN_VOLUME = 0.1 +ALERT_RAMP_TIME = 4 # seconds to ramp to max volume for warningImmediate +SELFDRIVE_STATE_TIMEOUT = 5 # 5 seconds +FILTER_DT = 1. / (micd.SAMPLE_RATE / micd.FFT_SAMPLES) + +AMBIENT_DB = 30 # DB where MIN_VOLUME is applied +DB_SCALE = 30 # AMBIENT_DB + DB_SCALE is where MAX_VOLUME is applied + +VOLUME_BASE = 20 +if HARDWARE.get_device_type() == "tizi": + VOLUME_BASE = 10 + +AudibleAlert = car.CarControl.HUDControl.AudibleAlert +AudibleAlertIQ = custom.IQState.AudibleAlert + + +sound_list_iq: dict[int, tuple[str, int | None, float]] = { + # AudibleAlertIQ, file name, play count (none for infinite) + AudibleAlertIQ.promptSingleLow: ("prompt_single_low.wav", 1, MAX_VOLUME), + AudibleAlertIQ.promptSingleHigh: ("prompt_single_high.wav", 1, MAX_VOLUME), +} + +sound_list: dict[int, tuple[str, int | None, float]] = { + # AudibleAlert, file name, play count (none for infinite) + AudibleAlert.engage: ("engage.wav", 1, MAX_VOLUME), + AudibleAlert.disengage: ("disengage.wav", 1, MAX_VOLUME), + AudibleAlert.refuse: ("refuse.wav", 1, MAX_VOLUME), + + AudibleAlert.prompt: ("prompt.wav", 1, MAX_VOLUME), + AudibleAlert.promptRepeat: ("prompt.wav", None, MAX_VOLUME), + AudibleAlert.promptDistracted: ("prompt_distracted.wav", None, MAX_VOLUME), + + AudibleAlert.warningSoft: ("warning_soft.wav", None, MAX_VOLUME), + AudibleAlert.warningImmediate: ("warning_immediate.wav", None, MAX_VOLUME), + + **sound_list_iq, +} + +def check_selfdrive_timeout_alert(sm): + ss_missing = time.monotonic() - sm.recv_time['selfdriveState'] + + if ss_missing > SELFDRIVE_STATE_TIMEOUT: + if sm['selfdriveState'].enabled and (ss_missing - SELFDRIVE_STATE_TIMEOUT) < 10: + return True + + return False + + +class Soundd(AlertSoundFilter): + def __init__(self): + super().__init__() + + self.load_sounds() + + self.current_alert = AudibleAlert.none + self.current_volume = MIN_VOLUME + self.current_sound_frame = 0 + + self.ramp_start_volume = MIN_VOLUME + self.ramp_start_time = 0. + + self.selfdrive_timeout_alert = False + + self.spl_filter_weighted = FirstOrderFilter(0, 2.5, FILTER_DT, initialized=False) + self.webrtc_audio: deque[np.ndarray] = deque() + self.webrtc_audio_frames = 0 + self.webrtc_audio_lock = threading.Lock() + self.webrtc_audio_playing = False + + def load_sounds(self): + self.loaded_sounds: dict[int, np.ndarray] = {} + + # Load all sounds + for sound in sound_list: + filename, play_count, volume = sound_list[sound] + + with wave.open(BASEDIR + "/iqpilot/selfdrive/assets/sounds/" + filename, 'r') as wavefile: + assert wavefile.getnchannels() == 1 + assert wavefile.getsampwidth() == 2 + assert wavefile.getframerate() == SAMPLE_RATE + + length = wavefile.getnframes() + self.loaded_sounds[sound] = np.frombuffer(wavefile.readframes(length), dtype=np.int16).astype(np.float32) / (2**16/2) + + def get_sound_data(self, frames): # get "frames" worth of data from the current alert sound, looping when required + + ret = np.zeros(frames, dtype=np.float32) + + if self.permits(self.current_alert): + num_loops = sound_list[self.current_alert][1] + sound_data = self.loaded_sounds[self.current_alert] + written_frames = 0 + + current_sound_frame = self.current_sound_frame % len(sound_data) + loops = self.current_sound_frame // len(sound_data) + + while written_frames < frames and (num_loops is None or loops < num_loops): + available_frames = sound_data.shape[0] - current_sound_frame + frames_to_write = min(available_frames, frames - written_frames) + ret[written_frames:written_frames+frames_to_write] = sound_data[current_sound_frame:current_sound_frame+frames_to_write] + written_frames += frames_to_write + self.current_sound_frame += frames_to_write + current_sound_frame = self.current_sound_frame % len(sound_data) + loops = self.current_sound_frame // len(sound_data) + + return ret * self.current_volume + + def add_webrtc_audio(self, audio_data) -> None: + data = np.frombuffer(audio_data.data, dtype=np.int16).astype(np.float32) / 32768.0 + if data.size == 0: + return + + with self.webrtc_audio_lock: + self.webrtc_audio.append(data) + self.webrtc_audio_frames += data.size + while self.webrtc_audio_frames > WEBRTC_AUDIO_BUFFER_FRAMES: + self.webrtc_audio_frames -= self.webrtc_audio.popleft().size + + def get_webrtc_audio_data(self, frames: int) -> np.ndarray: + ret = np.zeros(frames, dtype=np.float32) + + with self.webrtc_audio_lock: + if not self.webrtc_audio_playing: + if self.webrtc_audio_frames < WEBRTC_AUDIO_PREBUFFER_FRAMES: + return ret + self.webrtc_audio_playing = True + + written_frames = 0 + while written_frames < frames and self.webrtc_audio: + data = self.webrtc_audio[0] + frames_to_write = min(data.size, frames - written_frames) + ret[written_frames:written_frames+frames_to_write] = data[:frames_to_write] + written_frames += frames_to_write + self.webrtc_audio_frames -= frames_to_write + + if frames_to_write == data.size: + self.webrtc_audio.popleft() + else: + self.webrtc_audio[0] = data[frames_to_write:] + + if written_frames < frames: + self.webrtc_audio_playing = False + + return ret + + def webrtc_audio_thread(self) -> None: + webrtc_audio_sock = messaging.sub_sock('webrtcAudioData') + while True: + msg = messaging.recv_one(webrtc_audio_sock) + if msg is not None: + self.add_webrtc_audio(msg.webrtcAudioData) + + def callback(self, data_out: np.ndarray, frames: int, time, status) -> None: + if status: + cloudlog.warning(f"soundd stream over/underflow: {status}") + audio = self.get_sound_data(frames) + self.get_webrtc_audio_data(frames) + data_out[:frames, 0] = np.clip(audio, -1.0, 1.0) + + def update_alert(self, new_alert): + current_alert_played_once = self.current_alert == AudibleAlert.none or self.current_sound_frame >= len(self.loaded_sounds[self.current_alert]) + if self.current_alert != new_alert and (new_alert != AudibleAlert.none or current_alert_played_once): + if new_alert == AudibleAlert.warningImmediate: + self.ramp_start_volume = self.current_volume + self.ramp_start_time = time.monotonic() + self.current_alert = new_alert + self.current_sound_frame = 0 + + def get_audible_alert(self, sm): + if sm.updated['selfdriveState']: + new_alert = sm['selfdriveState'].alertSound.raw + self.update_alert(new_alert) + elif check_selfdrive_timeout_alert(sm): + self.update_alert(AudibleAlert.warningImmediate) + self.selfdrive_timeout_alert = True + elif self.selfdrive_timeout_alert: + self.update_alert(AudibleAlert.none) + self.selfdrive_timeout_alert = False + + def calculate_volume(self, weighted_db): + volume = ((weighted_db - AMBIENT_DB) / DB_SCALE) * (MAX_VOLUME - MIN_VOLUME) + MIN_VOLUME + return math.pow(VOLUME_BASE, (np.clip(volume, MIN_VOLUME, MAX_VOLUME) - 1)) + + @retry(attempts=10, delay=3) + def get_stream(self, sd): + # reload sounddevice to reinitialize portaudio + sd._terminate() + sd._initialize() + return sd.OutputStream(channels=1, samplerate=SAMPLE_RATE, callback=self.callback, blocksize=SAMPLE_BUFFER) + + def soundd_thread(self): + # sounddevice must be imported after forking processes + import sounddevice as sd + + sm = messaging.SubMaster(['selfdriveState', 'soundPressure']) + threading.Thread(target=self.webrtc_audio_thread, daemon=True).start() + + while True: + try: + self._stream_loop(sd, sm) + except Exception: + # Some A1s wedge the audio DSP (ALSA EINVAL / ADSP_EFAILED until reboot). Dying here + # crash-loops the process and selfdrived raises a takeover alert mid-drive over alert + # sounds - stay alive and keep retrying instead; recovers if the DSP comes back. + cloudlog.exception("soundd: audio stream unavailable, retrying") + time.sleep(10) + + def _stream_loop(self, sd, sm): + with self.get_stream(sd) as stream: + rk = Ratekeeper(20) + + cloudlog.info(f"soundd stream started: {stream.samplerate=} {stream.channels=} {stream.dtype=} {stream.device=}, {stream.blocksize=}") + while True: + sm.update(0) + + self.refresh() + + if sm.updated['soundPressure'] and self.current_alert == AudibleAlert.none: # only update volume filter when not playing alert + self.spl_filter_weighted.update(sm["soundPressure"].soundPressureWeightedDb) + self.current_volume = self.calculate_volume(float(self.spl_filter_weighted.x)) + + self.get_audible_alert(sm) + + # Ramp up immediate warning sound over 4s + if self.current_alert == AudibleAlert.warningImmediate: + elapsed = time.monotonic() - self.ramp_start_time + ramp_vol = float(np.interp(elapsed, [0, ALERT_RAMP_TIME], [self.ramp_start_volume, MAX_VOLUME])) + self.current_volume = max(self.current_volume, ramp_vol) + + rk.keep_time() + + assert stream.active + + +def main(): + s = Soundd() + s.soundd_thread() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/ui/tests/.gitignore b/iqpilot/selfdrive/ui/tests/.gitignore new file mode 100644 index 000000000..98f2a5e8c --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/.gitignore @@ -0,0 +1,9 @@ +test +test_translations +test_ui/report_1 +test_ui/raylib_report + +diff/*.mp4 +diff/*.html +diff/.coverage +diff/htmlcov/ diff --git a/iqpilot/selfdrive/ui/tests/__init__.py b/iqpilot/selfdrive/ui/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/ui/tests/cycle_offroad_alerts.py b/iqpilot/selfdrive/ui/tests/cycle_offroad_alerts.py new file mode 100755 index 000000000..223f2a10c --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/cycle_offroad_alerts.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +import os +import sys +import time +import json + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert +from iqpilot.system.updated.updated import parse_release_notes + +if __name__ == "__main__": + params = Params() + + with open(os.path.join(BASEDIR, "iqpilot/selfdrive/selfdrived/alerts_offroad.json")) as f: + offroad_alerts = json.load(f) + + t = 10 if len(sys.argv) < 2 else int(sys.argv[1]) + while True: + print("setting alert update") + params.put_bool("UpdateAvailable", True) + params.put("UpdaterNewReleaseNotes", parse_release_notes(BASEDIR)) + + time.sleep(t) + params.put_bool("UpdateAvailable", False) + + # cycle through normal alerts + for a in offroad_alerts: + print("setting alert:", a) + set_offroad_alert(a, True) + time.sleep(t) + set_offroad_alert(a, False) + + print("no alert") + time.sleep(t) diff --git a/iqpilot/selfdrive/ui/tests/test_feedbackd.py b/iqpilot/selfdrive/ui/tests/test_feedbackd.py new file mode 100644 index 000000000..d1cb4787d --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_feedbackd.py @@ -0,0 +1,23 @@ +import time + +import pytest + +import iqpilot.cereal.messaging as messaging +from iqpilot.system.manager.process_config import managed_processes + + +@pytest.mark.linux +def test_feedbackd_publishes_bookmark(): + publisher = messaging.PubMaster(["bookmarkButton"]) + subscriber = messaging.SubMaster(["userBookmark"]) + process = managed_processes["feedbackd"] + process.start() + try: + assert publisher.wait_for_readers_to_update("bookmarkButton", timeout=5) + deadline = time.monotonic() + 5 + while time.monotonic() < deadline and not subscriber.updated["userBookmark"]: + publisher.send("bookmarkButton", messaging.new_message("bookmarkButton")) + subscriber.update(100) + assert subscriber.updated["userBookmark"] + finally: + process.stop() diff --git a/iqpilot/selfdrive/ui/tests/test_local_routes.py b/iqpilot/selfdrive/ui/tests/test_local_routes.py new file mode 100644 index 000000000..ed9c4004b --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_local_routes.py @@ -0,0 +1,38 @@ +from pathlib import Path + +from iqpilot.selfdrive.ui.lib.local_routes import list_local_routes + + +def _touch(path: Path) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(b"") + + +def test_list_local_routes_from_segment_directories(tmp_path): + route_name = "00000051--3141cf1d76" + _touch(tmp_path / f"{route_name}--0" / "qcamera.ts") + _touch(tmp_path / f"{route_name}--1" / "qlog.zst") + + routes = list_local_routes(tmp_path) + + assert len(routes) == 1 + assert routes[0].name == route_name + assert routes[0].segment_count == 2 + assert routes[0].cameras == ("road",) + + +def test_list_local_routes_from_single_segment_directory(tmp_path): + route_name = "00000052--3141cf1d77" + _touch(tmp_path / f"{route_name}--0" / "qcamera.ts") + + routes = list_local_routes(tmp_path) + + assert len(routes) == 1 + assert routes[0].name == route_name + assert routes[0].subtitle == "1:00 ¡ Road Cam" + + +def test_list_local_routes_ignores_invalid_entries(tmp_path): + _touch(tmp_path / "not-a-route" / "fcamera.hevc") + + assert list_local_routes(tmp_path) == [] diff --git a/iqpilot/selfdrive/ui/tests/test_nav_helpers.py b/iqpilot/selfdrive/ui/tests/test_nav_helpers.py new file mode 100644 index 000000000..be6c45597 --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_nav_helpers.py @@ -0,0 +1,71 @@ +import json + +from iqpilot.common.params import Params +from iqpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position, resolve_mapbox_token + + +def test_resolve_mapbox_token_reads_param(tmp_path): + params = Params(tmp_path.as_posix()) + params.put("MapboxToken", "pk.test-token") + + assert resolve_mapbox_token(params) == "pk.test-token" + + +def test_resolve_mapbox_token_missing_returns_empty(tmp_path): + params = Params(tmp_path.as_posix()) + + assert resolve_mapbox_token(params) == "" + + +def test_current_or_last_gps_position_uses_last_position_param(tmp_path): + params = Params(tmp_path.as_posix()) + params.put("LastGPSPosition", json.dumps({ + "latitude": 37.7749, + "longitude": -122.4194, + "bearing": 91.5, + })) + + lat, lon, bearing, valid = current_or_last_gps_position(params) + + assert valid + assert lat == 37.7749 + assert lon == -122.4194 + assert bearing == 91.5 + + +def test_current_or_last_gps_position_uses_iqloc_position_param(tmp_path): + params = Params(tmp_path.as_posix()) + params.put("LastGPSPositionIQLoc", json.dumps({ + "latitude": 34.0522, + "longitude": -118.2437, + "bearingDeg": 12.0, + })) + + lat, lon, bearing, valid = current_or_last_gps_position(params) + + assert valid + assert lat == 34.0522 + assert lon == -118.2437 + assert bearing == 12.0 + + +def test_current_or_last_gps_position_accepts_lat_lon_aliases(tmp_path): + params = Params(tmp_path.as_posix()) + params.put("LastGPSPosition", json.dumps({ + "lat": 40.7128, + "lng": -74.006, + })) + + lat, lon, bearing, valid = current_or_last_gps_position(params) + + assert valid + assert lat == 40.7128 + assert lon == -74.006 + assert bearing == 0.0 + + +def test_current_or_last_gps_position_rejects_zero_position(tmp_path): + params = Params(tmp_path.as_posix()) + params.put("LastGPSPosition", "{}") + + assert current_or_last_gps_position(params) == (0.0, 0.0, 0.0, False) diff --git a/iqpilot/selfdrive/ui/tests/test_nav_map_utils.py b/iqpilot/selfdrive/ui/tests/test_nav_map_utils.py new file mode 100644 index 000000000..d02f07d38 --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_nav_map_utils.py @@ -0,0 +1,72 @@ +from types import SimpleNamespace + +from iqpilot.ui.onroad.nav_map_utils import ( + build_mapbox_static_url, + build_mapbox_tile_url, + choose_nav_camera, + mercator_world_px, + mercator_world_px_at_zoom, + project_nav_point, + project_nav_polyline, + tile_world_size, +) + + +def test_mercator_world_px_changes_with_longitude(): + x1, y1 = mercator_world_px(41.8826, -87.6393, 16.0) + x2, y2 = mercator_world_px(41.8826, -87.6293, 16.0) + + assert x2 > x1 + assert abs(y2 - y1) < 1.0 + + +def test_project_nav_point_centers_current_position(): + x, y = project_nav_point(41.8826, -87.6393, 41.8826, -87.6393, 16.0, 90.0, 420.0, 420.0) + + assert round(x, 3) == 210.0 + assert round(y, 3) == 210.0 + + +def test_project_nav_polyline_preserves_point_count(): + points = [ + SimpleNamespace(latitude=41.8826, longitude=-87.6422), + SimpleNamespace(latitude=41.8826, longitude=-87.6393), + SimpleNamespace(latitude=41.8830, longitude=-87.6366), + ] + + projected = project_nav_polyline(points, 41.8826, -87.6393, 16.0, 90.0, 420.0, 420.0) + + assert len(projected) == len(points) + + +def test_choose_nav_camera_looks_ahead_of_vehicle(): + points = [ + SimpleNamespace(latitude=41.8826, longitude=-87.6393), + SimpleNamespace(latitude=41.8835, longitude=-87.6355), + ] + + center_lat, center_lon, zoom = choose_nav_camera(41.8826, -87.6393, 90.0, points, 420.0, 420.0, 16.2) + + assert center_lon > -87.6393 + assert 16.0 <= zoom <= 17.8 + + +def test_build_mapbox_static_url_contains_expected_components(): + url = build_mapbox_static_url(41.8826, -87.6393, 16.2, 90.0, 420, 420) + + assert "navigation-night-v1/static/" in url + assert "-87.639300,41.882600,16.20,90.0,0/420x420@2x" in url + + +def test_build_mapbox_tile_url_contains_expected_components(): + url = build_mapbox_tile_url(16, 10619, 24322) + + assert "navigation-night-v1/tiles/256/16/10619/24322@2x" in url + + +def test_world_size_and_world_px_align_at_integer_zoom(): + world_size = tile_world_size(16) + x, y = mercator_world_px_at_zoom(41.8826, -87.6393, 16) + + assert 0.0 <= x <= world_size + assert 0.0 <= y <= world_size diff --git a/iqpilot/selfdrive/ui/tests/test_nav_search.py b/iqpilot/selfdrive/ui/tests/test_nav_search.py new file mode 100644 index 000000000..792379513 --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_nav_search.py @@ -0,0 +1,95 @@ +""" +Copyright (c) IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from types import SimpleNamespace + +from iqpilot.selfdrive.ui.lib import nav_search + + +class FakeParams: + def get(self, key, *args, **kwargs): + return { + "AmapWebServiceKey": "amap-key", + "OsmLocationName": "CN", + "MapboxToken": "mapbox-key", + }.get(key) + + +def test_china_search_uses_amap_without_calling_mapbox(monkeypatch): + search = nav_search.NavSearch.__new__(nav_search.NavSearch) + search._params = FakeParams() + search._seq = 1 + search._results = [] + search._searching = True + search._amap_adcode = "" + import threading + search._lock = threading.Lock() + + amap_client = SimpleNamespace( + is_mainland_china_configured=lambda *args, **kwargs: True, + get_key=lambda *args, **kwargs: "amap-key", + status=lambda: "ok", + reverse_adcode=lambda *args, **kwargs: "", + autocomplete=lambda *args, **kwargs: [], + ) + monkeypatch.setattr(nav_search, "_amap_client", amap_client) + monkeypatch.setattr(nav_search, "current_or_last_gps_position", lambda *_: (39.9, 116.4, 0.0, True)) + monkeypatch.setattr(amap_client, "reverse_adcode", lambda *args, **kwargs: "110000") + monkeypatch.setattr(amap_client, "autocomplete", lambda *args, **kwargs: [ + SimpleNamespace( + name="Tiananmen", + address="Dongcheng, Beijing", + provider_id="B000A83M61", + latitude=39.9087, + longitude=116.3975, + ), + ]) + monkeypatch.setattr(nav_search.requests, "get", lambda *args, **kwargs: (_ for _ in ()).throw(AssertionError("Mapbox called"))) + + search._do_search("Tiananmen", 1) + + assert len(search._results) == 1 + assert search._results[0].provider == "amap" + assert search._results[0].has_coords + + +def test_non_china_search_preserves_mapbox_request(monkeypatch): + search = nav_search.NavSearch.__new__(nav_search.NavSearch) + search._params = FakeParams() + search._session = "session" + search._seq = 1 + search._results = [] + search._searching = True + search._amap_adcode = "" + import threading + search._lock = threading.Lock() + captured = {} + + class Response: + def raise_for_status(self): + return None + + def json(self): + return {"suggestions": []} + + def get(url, *, params, timeout): + captured.update(url=url, params=params, timeout=timeout) + return Response() + + monkeypatch.setattr(nav_search, "current_or_last_gps_position", lambda *_: (41.3, -90.2, 0.0, True)) + monkeypatch.setattr(nav_search, "resolve_mapbox_token", lambda *_: "mapbox-key") + monkeypatch.setattr(nav_search, "_amap_client", None) + monkeypatch.setattr(nav_search.requests, "get", get) + + search._do_search("Home", 1) + + assert captured["url"] == f"{nav_search.SEARCHBOX}/suggest" + assert captured["params"] == { + "q": "Home", + "access_token": "mapbox-key", + "session_token": "session", + "limit": nav_search.MAX_RESULTS, + "language": "en", + "proximity": "-90.2,41.3", + } + assert captured["timeout"] == 8 diff --git a/iqpilot/selfdrive/ui/tests/test_offline_raster_pipeline.py b/iqpilot/selfdrive/ui/tests/test_offline_raster_pipeline.py new file mode 100644 index 000000000..19bd6f757 --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_offline_raster_pipeline.py @@ -0,0 +1,39 @@ +import sqlite3 + +from scripts.iqpilot.package_xyz_tiles_to_mbtiles import build_mbtiles +from scripts.iqpilot.render_raster_tiles_from_vector_mbtiles import tile_range_for_bounds + + +PNG_1X1 = ( + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01" + b"\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\rIDATx\x9cc\xf8\xcf" + b"\xc0\xf0\x1f\x00\x05\x00\x01\xff\x89\x99=\x1d\x00\x00\x00\x00IEND\xaeB`\x82" +) + + +def test_tile_range_for_bounds_returns_non_empty_ranges(): + x_range, y_range = tile_range_for_bounds((-88.15, 41.65, -88.02, 41.76), 14) + assert len(list(x_range)) > 0 + assert len(list(y_range)) > 0 + + +def test_build_mbtiles_from_xyz_tiles(tmp_path): + source = tmp_path / "xyz" + tile_dir = source / "14" / "2625" + tile_dir.mkdir(parents=True) + (tile_dir / "6335@2x.png").write_bytes(PNG_1X1) + + output = tmp_path / "offline.mbtiles" + build_mbtiles(source, output, bounds="-88.15,41.65,-88.02,41.76") + + conn = sqlite3.connect(output) + try: + fmt = conn.execute("SELECT value FROM metadata WHERE name='format'").fetchone()[0] + bounds = conn.execute("SELECT value FROM metadata WHERE name='bounds'").fetchone()[0] + count = conn.execute("SELECT COUNT(*) FROM tiles").fetchone()[0] + finally: + conn.close() + + assert fmt == "png" + assert bounds == "-88.15,41.65,-88.02,41.76" + assert count == 1 diff --git a/iqpilot/selfdrive/ui/tests/test_offline_tiles.py b/iqpilot/selfdrive/ui/tests/test_offline_tiles.py new file mode 100644 index 000000000..b70356dde --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_offline_tiles.py @@ -0,0 +1,128 @@ +import os +import sqlite3 +import json + +from iqpilot.ui.onroad import offline_tiles + + +PNG_1X1 = ( + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01" + b"\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\rIDATx\x9cc\xf8\xcf" + b"\xc0\xf0\x1f\x00\x05\x00\x01\xff\x89\x99=\x1d\x00\x00\x00\x00IEND\xaeB`\x82" +) + + +def _write_mbtiles(path): + conn = sqlite3.connect(path) + conn.execute("CREATE TABLE metadata (name text, value text)") + conn.execute("CREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob)") + conn.execute("INSERT INTO metadata (name, value) VALUES ('format', 'png')") + conn.execute("INSERT INTO metadata (name, value) VALUES ('minzoom', '1')") + conn.execute("INSERT INTO metadata (name, value) VALUES ('maxzoom', '3')") + conn.execute( + "INSERT INTO tiles (zoom_level, tile_column, tile_row, tile_data) VALUES (?, ?, ?, ?)", + (1, 1, offline_tiles.xyz_to_tms_y(1, 0), PNG_1X1), + ) + conn.commit() + conn.close() + + +def test_xyz_to_tms_y(): + assert offline_tiles.xyz_to_tms_y(1, 0) == 1 + assert offline_tiles.xyz_to_tms_y(1, 1) == 0 + + +def test_find_offline_mbtiles_path_from_env(tmp_path, monkeypatch): + mbtiles = tmp_path / "demo.mbtiles" + _write_mbtiles(mbtiles) + monkeypatch.setenv(offline_tiles.OFFLINE_MBTILES_ENV, str(mbtiles)) + assert offline_tiles.find_offline_mbtiles_path() == mbtiles + + +def test_find_offline_xyz_root(tmp_path, monkeypatch): + root = tmp_path / "tiles" + (root / "15" / "10500").mkdir(parents=True) + monkeypatch.setenv(offline_tiles.OFFLINE_TILE_ROOT_ENV, str(root)) + assert offline_tiles.find_offline_xyz_root() == root + + +def test_load_raster_tile_blob_from_mbtiles(tmp_path): + mbtiles = tmp_path / "offline.mbtiles" + _write_mbtiles(mbtiles) + conn = offline_tiles.open_mbtiles(mbtiles) + try: + assert offline_tiles.mbtiles_is_raster(conn) is True + assert offline_tiles.mbtiles_zoom_bounds(conn) == (1, 3) + assert offline_tiles.load_raster_tile_blob(conn, 1, 1, 0) == PNG_1X1 + finally: + conn.close() + + +def test_load_raster_tile_blob_from_xyz_dir(tmp_path, monkeypatch): + root = tmp_path / "offline_tiles" + tile_path = root / "14" / "2625" + tile_path.mkdir(parents=True) + (tile_path / "6335@2x.png").write_bytes(PNG_1X1) + monkeypatch.setenv(offline_tiles.OFFLINE_TILE_ROOT_ENV, str(root)) + assert offline_tiles.xyz_zoom_bounds(root) == (14, 14) + assert offline_tiles.load_raster_xyz_tile_blob(root, 14, 2625, 6335) == PNG_1X1 + + +def test_find_offline_region_root_by_bounds(tmp_path, monkeypatch): + root = tmp_path / "offline_maps" + il = root / "regions" / "illinois" + ca = root / "regions" / "california" + (il / "tiles").mkdir(parents=True) + (ca / "tiles").mkdir(parents=True) + (il / "manifest.json").write_text(json.dumps({"mbtiles": {"bounds": "-91.6,36.9,-87.4,42.6"}})) + (ca / "manifest.json").write_text(json.dumps({"mbtiles": {"bounds": "-124.5,32.4,-114.1,42.1"}})) + + monkeypatch.setenv(offline_tiles.OFFLINE_TILE_ROOT_ENV, str(root / "tiles")) + assert offline_tiles.find_offline_region_root(41.88, -87.63) == il + assert offline_tiles.find_offline_region_root(34.05, -118.24) == ca + + +def test_find_offline_mbtiles_path_uses_selected_region(tmp_path, monkeypatch): + root = tmp_path / "offline_maps" + il = root / "regions" / "illinois" + ca = root / "regions" / "california" + (il / "tiles").mkdir(parents=True) + (ca / "tiles").mkdir(parents=True) + (il / "manifest.json").write_text(json.dumps({"mbtiles": {"bounds": "-91.6,36.9,-87.4,42.6"}})) + (ca / "manifest.json").write_text(json.dumps({"mbtiles": {"bounds": "-124.5,32.4,-114.1,42.1"}})) + _write_mbtiles(il / "tiles" / "offline.mbtiles") + _write_mbtiles(ca / "tiles" / "offline.mbtiles") + + monkeypatch.setenv(offline_tiles.OFFLINE_TILE_ROOT_ENV, str(root / "tiles")) + assert offline_tiles.find_offline_mbtiles_path(41.88, -87.63) == il / "tiles" / "offline.mbtiles" + assert offline_tiles.find_offline_mbtiles_path(34.05, -118.24) == ca / "tiles" / "offline.mbtiles" + + +def test_day_variant_selection(tmp_path, monkeypatch): + root = tmp_path / "offline_maps" + region = root / "regions" / "us_state.IL" + (region / "tiles").mkdir(parents=True) + (region / "manifest.json").write_text(json.dumps({"mbtiles": {"bounds": "-88.3,41.5,-87.8,41.9"}})) + _write_mbtiles(region / "tiles" / "offline.mbtiles") + monkeypatch.setenv(offline_tiles.OFFLINE_TILE_ROOT_ENV, str(root / "tiles")) + offline_tiles._region_roots_cache = None + offline_tiles._region_bounds_cache.clear() + + # no day variant yet: day request falls back to the night set + night = region / "tiles" / "offline.mbtiles" + assert offline_tiles.find_offline_mbtiles_path(41.7, -88.0, day=True) == night + assert offline_tiles.find_offline_mbtiles_path(41.7, -88.0, day=False) == night + + # day variant installed: day requests prefer it, night unchanged + _write_mbtiles(region / "tiles" / "offline_day.mbtiles") + assert offline_tiles.find_offline_mbtiles_path(41.7, -88.0, day=True) == region / "tiles" / "offline_day.mbtiles" + assert offline_tiles.find_offline_mbtiles_path(41.7, -88.0, day=False) == night + + +def test_solar_elevation_day_night(): + from iqpilot.ui.onroad.nav_map_utils import solar_elevation_deg + # Chicago 2026-07-11: 18:00 UTC (1pm CDT) is day; 06:00 UTC (1am CDT) is night + noon_utc = 1783792800.0 # 2026-07-11 18:00:00 UTC + night_utc = noon_utc - 12 * 3600 + assert solar_elevation_deg(41.88, -87.63, noon_utc) > 30.0 + assert solar_elevation_deg(41.88, -87.63, night_utc) < -10.0 diff --git a/iqpilot/selfdrive/ui/tests/test_raylib_ui.py b/iqpilot/selfdrive/ui/tests/test_raylib_ui.py new file mode 100644 index 000000000..934bb14b0 --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_raylib_ui.py @@ -0,0 +1,27 @@ +import time +import pytest +from iqpilot.selfdrive.test.helpers import with_processes +from iqpilot.system.ui.lib import application +from iqpilot.system.ui.lib.utils import gui_style_color + + +@pytest.mark.linux +@with_processes(["ui"]) +def test_raylib_ui(): + """Test initialization of the UI widgets is successful.""" + time.sleep(1) + + +def test_style_colors_match_gui_style_abi(monkeypatch): + calls = [] + monkeypatch.setattr(application.rl, "gui_set_style", lambda *args: calls.append(args)) + monkeypatch.setattr(application, "gui_style_color", lambda color: 27) + application.GuiApplication._set_styles(None) + assert [call[2] for call in calls[-3:]] == [27, 27, 27] + + +def test_gui_style_color_uses_binding_value_type(): + color = application.rl.Color(229, 229, 229, 255) + value_type = application.rl.ffi.typeof(application.rl.raylib.GuiSetStyle).args[2] + expected = int(application.rl.ffi.cast(value_type, application.rl.color_to_int(color))) + assert gui_style_color(color) == expected diff --git a/iqpilot/selfdrive/ui/tests/test_settings_interactive_timeout.py b/iqpilot/selfdrive/ui/tests/test_settings_interactive_timeout.py new file mode 100644 index 000000000..cdc8ee41c --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_settings_interactive_timeout.py @@ -0,0 +1,56 @@ +from types import SimpleNamespace + +import pytest + +from iqpilot.selfdrive.ui.layouts.main import MainLayout, MainState + + +def make_layout(current_mode): + layout = object.__new__(MainLayout) + layout._current_mode = current_mode + layout._set_mode_calls = [] + layout._set_mode_for_state = lambda: layout._set_mode_calls.append(current_mode) + return layout + + +class FakeSm: + def __init__(self, v_ego, carstate_valid): + self.valid = {"carState": carstate_valid} + self._v_ego = v_ego + + def __getitem__(self, key): + return SimpleNamespace(vEgo=self._v_ego) + + +class TestSettingsInteractiveTimeout: + def _run(self, current_mode, started, v_ego, carstate_valid=True): + layout = make_layout(current_mode) + fake = SimpleNamespace(started=started, sm=FakeSm(v_ego, carstate_valid)) + monkeypatch = pytest.MonkeyPatch() + monkeypatch.setattr("iqpilot.selfdrive.ui.layouts.main.ui_state", fake) + try: + layout._on_interactive_timeout() + finally: + monkeypatch.undo() + return layout._set_mode_calls + + def test_stationary_in_settings_stays(self): + # parked/charging hybrid reads onroad; the timeout must not eject from Settings + assert self._run(MainState.SETTINGS, started=True, v_ego=0.0) == [] + + def test_moving_in_settings_returns_to_road(self): + assert self._run(MainState.SETTINGS, started=True, v_ego=5.0) == [MainState.SETTINGS] + + def test_onroad_layout_always_handled(self): + assert self._run(MainState.ONROAD, started=True, v_ego=0.0) == [MainState.ONROAD] + + def test_home_layout_always_handled(self): + assert self._run(MainState.HOME, started=True, v_ego=0.0) == [MainState.HOME] + + def test_offroad_in_settings_handled(self): + # car off (offroad): existing behavior is unchanged + assert self._run(MainState.SETTINGS, started=False, v_ego=0.0) == [MainState.SETTINGS] + + def test_invalid_carstate_treated_as_moving(self): + # if speed is unknown, fail safe to the road view rather than trapping in settings + assert self._run(MainState.SETTINGS, started=True, v_ego=0.0, carstate_valid=False) == [MainState.SETTINGS] diff --git a/iqpilot/selfdrive/ui/tests/test_soundd.py b/iqpilot/selfdrive/ui/tests/test_soundd.py new file mode 100644 index 000000000..499ea6d35 --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_soundd.py @@ -0,0 +1,34 @@ +from types import SimpleNamespace + +from iqpilot.cereal import car +from iqpilot.selfdrive.ui import soundd + +AudibleAlert = car.CarControl.HUDControl.AudibleAlert + + +class TestSoundd: + def test_check_selfdrive_timeout_alert(self, monkeypatch): + class FakeSubMaster: + recv_time = {'selfdriveState': 100.0} + + def __init__(self, enabled): + self.state = SimpleNamespace(enabled=enabled) + + def __getitem__(self, service): + assert service == 'selfdriveState' + return self.state + + enabled = FakeSubMaster(True) + disabled = FakeSubMaster(False) + + monkeypatch.setattr(soundd.time, "monotonic", lambda: 100.0 + soundd.SELFDRIVE_STATE_TIMEOUT) + assert not soundd.check_selfdrive_timeout_alert(enabled) + + monkeypatch.setattr(soundd.time, "monotonic", lambda: 101.0 + soundd.SELFDRIVE_STATE_TIMEOUT) + assert soundd.check_selfdrive_timeout_alert(enabled) + assert not soundd.check_selfdrive_timeout_alert(disabled) + + monkeypatch.setattr(soundd.time, "monotonic", lambda: 110.0 + soundd.SELFDRIVE_STATE_TIMEOUT) + assert not soundd.check_selfdrive_timeout_alert(enabled) + + # TODO: add test with micd for checking that soundd actually outputs sounds diff --git a/iqpilot/selfdrive/ui/tests/test_translations.py b/iqpilot/selfdrive/ui/tests/test_translations.py new file mode 100644 index 000000000..13877d66b --- /dev/null +++ b/iqpilot/selfdrive/ui/tests/test_translations.py @@ -0,0 +1,48 @@ +import gettext +import json +import re + +import pytest + +from iqpilot.system.ui.lib.multilang import LANGUAGES_FILE, TRANSLATIONS_DIR + + +FORMAT_ARG = re.compile(r"%(?:\([^)]+\))?[#0+\-]?(?:\d+|\*)?(?:\.\d+|\.\*)?[hlL]?[diouxXeEfFgGcrsa%]") + + +with LANGUAGES_FILE.open(encoding="utf-8") as stream: + LANGUAGES = json.load(stream) + + +def load_catalog(language_code: str) -> dict[str | tuple[str, int], str]: + with TRANSLATIONS_DIR.joinpath(f"app_{language_code}.mo").open("rb") as stream: + return gettext.GNUTranslations(stream)._catalog + + +def message_keys(catalog: dict[str | tuple[str, int], str]) -> set[str]: + return {key for key in catalog if isinstance(key, str) and key} + + +def format_args(text: str) -> list[str]: + return sorted(match for match in FORMAT_ARG.findall(text) if match != "%%") + + +def test_language_codes_are_unique(): + assert len(LANGUAGES) == len(set(LANGUAGES.values())) + + +@pytest.mark.parametrize("language_code", LANGUAGES.values(), ids=LANGUAGES.keys()) +def test_translation_catalog_is_complete(language_code): + source = load_catalog("en") + translated = load_catalog(language_code) + assert message_keys(translated) == message_keys(source) + + +@pytest.mark.parametrize("language_code", LANGUAGES.values(), ids=LANGUAGES.keys()) +def test_translation_catalog_entries(language_code): + catalog = load_catalog(language_code) + for source, translated in catalog.items(): + if not isinstance(source, str) or not source: + continue + assert translated + assert format_args(translated) == format_args(source) diff --git a/iqpilot/selfdrive/ui/translations/README.md b/iqpilot/selfdrive/ui/translations/README.md new file mode 100644 index 000000000..433eb7d64 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/README.md @@ -0,0 +1,3 @@ +# Multilanguage + +[![languages](https://raw.githubusercontent.com/commaai/openpilot/badges/translation_badge.svg)](#) diff --git a/iqpilot/selfdrive/ui/translations/app.pot b/iqpilot/selfdrive/ui/translations/app.pot new file mode 100644 index 000000000..03dff9f15 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app.pot @@ -0,0 +1,4128 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "" + +#: system/ui/widgets/confirm_dialog.py:35 system/ui/widgets/option_dialog.py:61 +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:206 +#: system/ui/widgets/esim.py:217 system/ui/widgets/esim.py:230 +#: system/ui/widgets/network.py:380 system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "" + +#: system/ui/widgets/confirm_dialog.py:113 system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "" + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "" + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "" + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "" + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "" + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "" + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "" + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "" + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "" + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "" + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "" +msgstr[1] "" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph " +"(50 km/h)." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked " +"when you cross a border." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed below:" +"

    IQ.Pilot End-to-End Longitudinal Control


    Let the driving " +"model control the gas and brakes. IQ.Pilot will drive as it thinks a human " +"would, including stopping for red lights and stop signs. Since the driving " +"model decides the speed to drive, the set speed will only act as an upper " +"bound. This feature is still being improved; mistakes should be expected." +"

    IQ.Dynamic


    Dynamically blends between adaptive cruise " +"behavior and end-to-end behavior based on scene/context.

    IQ.Chill
    Uses standard traffic-aware cruise behavior for longitudinal control." +"

    New Driving Visualization


    The driving visualization will " +"transition to the road-facing wide-angle camera at low speeds to better show " +"some turns. The IQ.Pilot logo will also be shown in the top right corner." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over " +"the network." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will " +"NEVER ask you to add their GitHub username." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "" +msgstr[1] "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "" +msgstr[1] "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "How long the settings screen may sit untouched before it closes itself." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car " +"ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle, " +"and Konn3kt state at a glance." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up " +"still wants a wheel nudge." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior options." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the " +"car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take " +"effect." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like " +"to do that now?" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel " +"it." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control fault." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended " +"Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "" diff --git a/iqpilot/selfdrive/ui/translations/app_ar.mo b/iqpilot/selfdrive/ui/translations/app_ar.mo new file mode 100644 index 000000000..dd43ec781 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_ar.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_ar.po b/iqpilot/selfdrive/ui/translations/app_ar.po new file mode 100644 index 000000000..d480d5008 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_ar.po @@ -0,0 +1,4640 @@ +# Arabic translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-22 16:32-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0?0:n==1?1:n==2?2:(n%100>=3 && n%100<=10)?3:(n%100>=11 && n%100<=99)?4:5;\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (Ø§ŲØĒØąØ§Øļ؊)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " Ø§ŲƒØĒŲ…Ų„ØĒ Ų…ØšØ§ŲŠØąØŠ Ø§ØŗØĒØŦاب؊ ØšØ˛Ų… Ø§Ų„ØĒ؈ØŦŲŠŲ‡." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " Ø§ŲƒØĒŲ…Ų„ØĒ Ų…ØšØ§ŲŠØąØŠ Ø§ØŗØĒØŦاب؊ ØšØ˛Ų… Ø§Ų„ØĒ؈ØŦŲŠŲ‡ Ø¨Ų†ØŗØ¨ØŠ {}ŲĒ." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " ØŦŲ‡Ø§Ø˛Ųƒ Ų…ŲˆØŦŲ‡ Ø¨Ų…Ų‚Ø¯Ø§Øą {:.1f}° {} ؈ {:.1f}° {}." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    Ø§ŲƒØĒŲ…Ų„ØĒ Ų…ØšØ§ŲŠØąØŠ ØĒØŖØŽØą Ø§Ų„ØĒ؈ØŦŲŠŲ‡." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    Ø§ŲƒØĒŲ…Ų„ØĒ Ų…ØšØ§ŲŠØąØŠ ØĒØŖØŽØą Ø§Ų„ØĒ؈ØŦŲŠŲ‡ Ø¨Ų†ØŗØ¨ØŠ {}ŲĒ." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "Ų†Ø´Øˇ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"؊ØĒŲŠØ­ ADB (ØŦØŗØą ØĒØĩØ­ŲŠØ­ ØŖØŽØˇØ§ØĄ Android) Ø§Ų„Ø§ØĒØĩØ§Ų„ بØŦŲ‡Ø§Ø˛Ųƒ ØšØ¨Øą USB ØŖŲˆ ØšØ¨Øą Ø§Ų„Ø´Ø¨ŲƒØŠ." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "ØĨØļØ§ŲØŠ" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "Ų…Ų†Ø° Ø§Ų„Ø¨Ø¯Ø§ŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "ØĨؚداد APN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "Ų…ØĩØ§Ø¯Ų‚ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "ØĒŲ„Ų‚Ø§ØĻ؊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "Ø´ØąŲŠØˇ Ø§Ų„ØĒØŗØ§ØąØš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "Ų…Ų‚ŲŠØ§Øŗ Ø§Ų„ØĒØŗØ§ØąØš" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "ØĒØŖŲƒŲŠØ¯ Ø§Ų„ØĒØ´ØēŲŠŲ„ Ø§Ų„Ų…ŲØąØˇ" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "ØĒŲØšŲŠŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų†Ø´Øˇ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "Ų†Ø´Øˇ ŲŲˆŲ‚ {} ŲŲ‚Øˇ." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "ØĨØļØ§ŲØŠ ؅؄؁" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "ØĨØļØ§ŲØŠ ؅؄؁ eSIM" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "ØļØ¨Øˇ ØŗØąØšØŠ ØąØēب؊ Ø§Ų„Ø§Ų†ØšØˇØ§Ų" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "Ų…ØĒŲ‚Ø¯Ų…" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"بؚد Ø°Ų„Ųƒ ؊ØŦب Ø§ØŗØĒØŽØ¯Ø§Ų… ؅؄؁ eSIM Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ.\n" +"\n" +"Ų„Ų† ØĒØĒŲ…ŲƒŲ† Ų…Ų† Ø§ØŗØĒØŽØ¯Ø§Ų… Comma Prime Ų…ØąØŠ ØŖØŽØąŲ‰ Ų…Ø§ Ų„Ų… ØĒØ´ØĒØąŲ Ø´ØąŲŠØ­ØŠ ØŦØ¯ŲŠØ¯ØŠ Ų…Ų† comma." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "ØšØ¯ŲˆØ§Ų†ŲŠ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "Ų…ŲˆØ§ŲŲ‚ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "Ø§Ų„ŲƒŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "ØŦŲ…ŲŠØš Ø§Ų„ŲˆŲ„Ø§ŲŠØ§ØĒ (~6.0 Øē؊ØēØ§Ø¨Ø§ŲŠØĒ)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"ŲŠØŗŲ…Ø­ Ų„Ų€ IQ.Pilot Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… ØŗŲ„ŲˆŲƒ Ø§ØŗØĒØĻŲ†Ø§Ų ACC ؁؊ MQB ØšŲ„Ų‰ Ų…ØąŲƒØ¨Ø§ØĒ Volkswagen MQB " +"Ø§Ų„Ų…Ø¯ØšŲˆŲ…ØŠ ذاØĒ FtS Ų…Øš ØĒØĢØ¨ŲŠØĒ Ų…Ų…ØĒد Ø¯ŲˆŲ† Ø§ØŗØĒØĻŲ†Ø§Ų ØĒŲ„Ų‚Ø§ØĻ؊." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"ŲŠØŗŲ…Ø­ Ų„Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ (Ø§Ų„ØĒ؈ØŦŲŠŲ‡) Ø¨Ø§Ų„Ø¨Ų‚Ø§ØĄ Ų†Ø´ØˇŲ‹Ø§ Ø­ØĒŲ‰ ØšŲ†Ø¯Ų…Ø§ ŲŠŲƒŲˆŲ† Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ " +"(Ø§Ų„ŲˆŲ‚ŲˆØ¯/Ø§Ų„ŲØąØ§Ų…Ų„) ØēŲŠØą Ų…ØĒاح Ų…Ø¤Ų‚ØĒŲ‹Ø§ Ø¨ØŗØ¨Ø¨ ØšØˇŲ„ ؁؊ Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ Ø§Ų„Ø¯Ø§ØĻŲ… (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "ŲˆØ§Ų„ŲƒØĢŲŠØą ØēŲŠØą Ø°Ų„Ųƒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "ŲŠŲØˇØ¨ŲŽŲ‘Ų‚ ŲŲˆØąŲ‹Ø§." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "ŲŠŲØˇØ¨ŲŽŲ‘Ų‚ ؁؊ Ø§Ų„Ų…ØąØŠ Ø§Ų„ØĒØ§Ų„ŲŠØŠ Ø§Ų„ØĒ؊ ŲŠŲ†ØĒŲ‚Ų„ ŲŲŠŲ‡Ø§ Ø§Ų„ØŦŲ‡Ø§Ø˛ ØĨŲ„Ų‰ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„ØŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„ØŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"Ų‡Ų„ ØĒØąŲŠØ¯ Ø¨Ø§Ų„ØĒØŖŲƒŲŠØ¯ ØĨؚاد؊ ØļØ¨Øˇ ØŦŲ…ŲŠØš ØĨؚداداØĒ IQ.Pilot ØĨŲ„Ų‰ Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠØŸ بؚد ØĨؚاد؊ " +"Ø§Ų„ØļØ¨Øˇ Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§Ų„ØąØŦŲˆØš." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĨؚاد؊ ØļØ¨Øˇ Ø§Ų„Ų…ØšØ§ŲŠØąØŠØŸ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ ØŖŲ†Ųƒ ØĒØąŲŠØ¯ ØĨŲ„ØēØ§ØĄ Ø§Ų„ØĒØĢØ¨ŲŠØĒ؟" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "ØĒŲ„Ų‚Ø§ØĻ؊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊: ØĒØēŲŠŲŠØąØ§ØĒ Ų…ØĒØĒØ§Ų„ŲŠØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "ØĒŲ„Ų‚Ø§ØĻ؊ — ØŽØ§ŲØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "ØĨØēŲ„Ø§Ų‚ Ø§Ų„ØĨؚداداØĒ ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"ŲŠØŗØĒØŖŲ†Ų ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§ بؚد Ø§Ų„ØĒŲˆŲ‚Ų ØŖØĢŲ†Ø§ØĄ Ų…ØĒابؚ؊ Ø­ØąŲƒØŠ Ø§Ų„Ų…ØąŲˆØąØŒ ØšŲ„Ų‰ Ų…Ų†ØĩاØĒ Subaru Ø§Ų„ØĒ؊ " +"ŲŠŲ†ØˇØ¨Ų‚ ØšŲ„ŲŠŲ‡Ø§ Ø§Ų„ØĒŲ†ŲŲŠØ° Ø§Ų„ØĒØŦØąŲŠØ¨ŲŠ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "Ø§Ų„ØĒŲˆŲØą ØŖØĢŲ†Ø§ØĄ ØĒØēŲŠŲ‘ØąØ§ØĒ Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "ØąØŦŲˆØš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "ØĒŲ†Ø¨ŲŠŲ‡Ø§ØĒ Ø§Ų„Ų†Ų‚ØˇØŠ Ø§Ų„ØšŲ…ŲŠØ§ØĄ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "ØĒŲ†Ø¨ŲŠŲ‡Ø§ØĒ Ø§Ų„Ų†Ų‚ØˇØŠ Ø§Ų„ØšŲ…ŲŠØ§ØĄ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "Ų…Ø¤Ø´ØąØ§ØĒ Ø§Ų„ØĨØ´Ø§ØąØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą Ø¨Ø¨Ø¯ØĄ Ų…Ų† Ø§Ų„ØĨØ´Ø§ØąØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "Ø§Ų„Ø­Ø§Ų„ØŠ ØšŲ†Ø¯ Ø§Ų„ØĨŲ‚Ų„Ø§Øš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "؈ØļØš Ø§Ų„Ø§ØŗØĒØŦاب؊ Ų„Ų„ŲƒØ¨Ø­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"ŲŠØšŲŠØ¯ Ø´ØąŲŠØˇ Ø­Ø§Ų„ØŠ Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„ØšØąŲŠØļ Ų…Ų† Ø§Ų„ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„ŲƒŲ„Ø§ØŗŲŠŲƒŲŠØŠ: Ø§Ų„Ø­ØąØ§ØąØŠ ŲˆØ§Ų„Ų…ØąŲƒØ¨ØŠ ŲˆØ­Ø§Ų„ØŠ " +"Konn3kt Ø¨Ų†Ø¸ØąØŠ ŲˆØ§Ø­Ø¯ØŠ." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "ØĒØēŲŠŲŠØą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "ØĒØ­Ų‚Ų‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "Ų…ØŗØ­" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "اØĒØĩØ§Ų„" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "ØŦØ§ØąŲ Ø§Ų„Ø§ØĒØĩØ§Ų„..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "ØĨŲ„ØēØ§ØĄ" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "ØĨŲ„ØēØ§ØĄ Ø§Ų„Ų…Ų„Ø§Ø­ØŠ" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "ØŽŲ„ŲˆŲŠ بØĒØšØąŲØŠ Ų…Ø­Ø¯ŲˆØ¯ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "ØĒØēŲŠŲŠØą Ø§Ų„Ų„ØēØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" +"ØŗŲŠØ¤Ø¯ŲŠ ØĒØēŲŠŲŠØą Ų‡Ø°Ø§ Ø§Ų„ØĨؚداد ØĨŲ„Ų‰ ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ IQ.Pilot ØĨذا ŲƒØ§Ų†ØĒ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų‚ŲŠØ¯ " +"Ø§Ų„ØĒØ´ØēŲŠŲ„." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "ØĒŲ… Ø§Ų„ØĒØ­Ų‚Ų‚ {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "ا؎ØĒØą Ų†Ų…ŲˆØ°ØŦŲ‹Ø§" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"ا؎ØĒØą Ø§Ų„ØŗŲ„ŲˆŲƒ Ø§Ų„ØˇŲˆŲ„ŲŠ: IQ.Pilot (ØĒØ­ŲƒŲ‘Ų… ØˇŲˆŲ„ŲŠ Ų…Ų† IQ + Ø´Ø§Ų…Ų„)، ØŖŲˆ IQ.Dynamic (ØĒØ­ŲƒŲ‘Ų…" +" ØˇŲˆŲ„ŲŠ Ų…Ų† IQ + ؈ØļØš Ø¯ŲŠŲ†Ø§Ų…ŲŠŲƒŲŠ)، ØŖŲˆ IQ.Chill (ØĒØ­ŲƒŲ‘Ų… ØˇŲˆŲ„ŲŠ Ų…Ų† IQ + Ų†Ų…Øˇ Ų‡Ø§Ø¯ØĻ)، " +"ØŖŲˆ Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ Ø§Ų„ØŖØĩŲ„ŲŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "ØĒŲ… Ø§Ų„Ø§ØŽØĒŲŠØ§Øą ŲŠØ¯ŲˆŲŠŲ‹Ø§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "Ų…ØŗØ­ Ø§Ų„Ø°Ø§ŲƒØąØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "Ų…ØŗØ­ Ø°Ø§ŲƒØąØŠ Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų…Ø­Ø¯Ø¯ ؈ØĒŲ†Ø˛ŲŠŲ„Ų‡ Ų…ØąØŠ ØŖØŽØąŲ‰ØŸ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "ØĨØēŲ„Ø§Ų‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"؊ØēŲ„Ų‚ Ø­Ų„Ų‚ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ؁؊ Ų…ØąŲƒØ¨Ø§ØĒ MEB ؈MQB Evo. ؊ØĩØ­Ų‘Ø­ IQ.Pilot ØŖŲ…Øą Ø§Ų„ØĒ؈ØŦŲŠŲ‡ Ø¨Ų†Ø§ØĄŲ‹ " +"ØšŲ„Ų‰ Ø§Ų„Ø§Ų†Ø­Ų†Ø§ØĄ Ø§Ų„ŲØšŲ„ŲŠ Ų„Ų„ØŗŲŠØ§ØąØŠ Ø¨Ø¯Ų„Ø§Ų‹ Ų…Ų† ØĨØąØŗØ§Ų„ Ø§Ų„Ø§Ų†Ø­Ų†Ø§ØĄ Ø§Ų„Ų…ØŽØˇØˇ Ų…Ø¨Ø§Ø´ØąØŠŲ‹." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "Ø§Ų„ØŗØ­Ø§Ø¨ØŠ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "Ø§Ų„ØŗØ­Ø§Ø¨ØŠ ŲŲ‚Øˇ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "ŲŲŠØ¯ŲŠŲˆ Ø§Ų„ØŗØ­Ø§Ø¨ØŠ ØēŲŠØą Ų…ØĒاح" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "Ø¯Ų„ŲŠŲ„ ØŖŲ„ŲˆØ§Ų† Ø­Ø§Ų„ØŠ Ø§Ų„Ø¨ØĩŲ…ØŠ:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų…Ø¯Ų…ØŦ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"ŲŠŲ†ŲŲ‘Ø° ØĒØŗŲ„ØŗŲ„Ų‹Ø§ Ų…Ø¨ØąŲ…ØŦŲ‹Ø§ Ų…Ų† ØŽØˇŲˆØ§ØĒ Ø§Ų„ØĒØŗØ§ØąØš Ų„Ų‚ŲŠØ§Øŗ Ø§ØŗØĒØŦاب؊ Ø§Ų„Ų…Ø´ØēŲ‘Ų„ Ø§Ų„ØˇŲˆŲ„ŲŠ. ؊ØĒØˇŲ„Ø¨ " +"Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų…Ų† IQ.Pilot. Ø§ØŗØĒØŽØ¯Ų…Ų‡ ŲŲ‚Øˇ ØšŲ„Ų‰ ØˇØąŲŠŲ‚ ØŽØ§Ų„Ų ŲˆŲ…ØēŲ„Ų‚." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"ŲŠŲ†ŲŲ‘Ø° ØĒØŗŲ„ØŗŲ„Ų‹Ø§ Ų…Ø¨ØąŲ…ØŦŲ‹Ø§ Ų…Ų† ØŽØˇŲˆØ§ØĒ Ø§Ų„ØĒØŗØ§ØąØš Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ Ų„Ų‚ŲŠØ§Øŗ Ø§ØŗØĒØŦاب؊ Ų†Ø¸Ø§Ų… Ø§Ų„ØĒ؈ØŦŲŠŲ‡. " +"Ø§ØŗØĒØŽØ¯Ų…Ų‡ ŲŲ‚Øˇ ØšŲ„Ų‰ ØˇØąŲŠŲ‚ Ų…ØŗØĒŲ‚ŲŠŲ… ŲˆŲ…ØŗØĒŲˆŲ ŲˆØŽØ§Ų„Ų." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "ØĒØŖŲƒŲŠØ¯" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "Ų…ØĒابؚ؊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "ØĒØēŲŠŲŠØąØ§ØĒ Ų…ØĒØĒØ§Ų„ŲŠØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "ØĒØ­ŲƒŲ‘Ų…" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"؊ØĒØ­ŲƒŲ… ؁؊ ØŗŲ„ŲˆŲƒ IQ.Pilot ØĒØŦØ§Ų‡ Ø­Ø¯ŲˆØ¯ Ø§Ų„ØŗØąØšØŠ. ØĨŲŠŲ‚Ø§Ų ŲŠØšØˇŲ‘Ų„ Ų…ŲŠØ˛Ø§ØĒ Ø­Ø¯ŲˆØ¯ Ø§Ų„ØŗØąØšØŠØŒ " +"ŲˆŲ…ØšŲ„ŲˆŲ…Ø§ØĒ ŲŠØšØąØļ Ø§Ų„Ø­Ø¯ŲˆØ¯ ŲŲ‚ØˇØŒ ؈ØĒØ­Ø°ŲŠØą ŲŠØ¨ØąØ˛ ØĒØŦØ§ŲˆØ˛ Ø§Ų„ØŗØąØšØŠØŒ ؈ØĒØ­ŲƒŲ‘Ų… ؊ØļØ¨Øˇ Ø§Ų„ØŗØąØšØŠ " +"Ø§Ų„Ų…Ø­Ø¯Ø¯ØŠ ŲˆŲŲ‚ Ø§Ų„Ø­Ø¯ŲˆØ¯ Ø§Ų„Ų…ŲƒØĒØ´ŲØŠ." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "ØĒØšØ°Ų‘Øą ØŦŲ„Ø¨ Ų…ŲØ§ØĒŲŠØ­ SSH - ØąØ§ØŦØš Ø§Ų„ØŗØŦŲ„Ø§ØĒ" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "ØĒØšØ°Ų‘Øą ØĒØ­Ø¯ŲŠØ¯ Ø°Ų„Ųƒ Ø§Ų„Ų…ŲƒØ§Ų†" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "ØĒØšØ°Ų‘Øą Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„Ų‰ GitHub - ØĒØ­Ų‚Ų‚ Ų…Ų† Ø§Ų„Ø§ØĒØĩØ§Ų„" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "ØĒØšØ°Ų‘Øą Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† GitHub - ØĒØ­Ų‚Ų‚ Ų…Ų† ŲˆŲ‚ØĒ Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "Ø§Ų„Ø¯ŲˆŲ„ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "ØŗØŦŲ„ Ø§Ų„ØŖØšØˇØ§Ų„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "Ø§Ų„Ø§Ų†ØˇŲ„Ø§Ų‚ Ų…Ų† Ø§Ų„ØĢباØĒ (ØĒØŦØąŲŠØ¨ŲŠ)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "Ø§Ų„Ø§Ų†ØˇŲ„Ø§Ų‚ Ų…Ų† Ø§Ų„ØĢباØĒ — ŲØąØ§Ų…Ų„ ŲŠØ¯ŲˆŲŠØŠ (ØĒØŦØąŲŠØ¨ŲŠ)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "Ø§Ų„ØĨØĩØ¯Ø§Øą Ø§Ų„Ø­Ø§Ų„ŲŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "Ų…ØĒØ­ŲƒŲ… Ø§Ų„Ø§Ų†Ø­Ų†Ø§ØĄ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "Ø­Ø°Ų" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "ØŦØ§ØąŲ Ų‚ØˇØš Ø§Ų„Ø§ØĒØĩØ§Ų„..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "ØĒŲ†Ø˛ŲŠŲ„" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "ØąŲØļ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "ØąŲØļ، ؈ØĨŲ„ØēØ§ØĄ ØĒØĢØ¨ŲŠØĒ IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "Ø§ŲØĒØąØ§Øļ؊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "Ø§ŲØĒØąØ§Øļ؊ (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "Ø§ŲØĒØąØ§Øļ؊: ŲŠØ¨Ø¯ØŖ ØŦØ§Ų‡Ø˛Ų‹Ø§ Ų„Ų„Ų‚ŲŠØ§Ø¯ØŠØŒ ŲˆØ§Ų„ØĒŲØšŲŠŲ„ Ų…ØĒاح ŲŲˆØąŲ‹Ø§." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"Ø§Ų„ØĒØŖØŽŲŠØą Ų‚Ø¨Ų„ ØŖŲ† ŲŠØ¨Ø¯ØŖ ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą Ø§Ų„Ų†Ø§ØĒØŦ ØšŲ† Ø§Ų„ØĨØ´Ø§ØąØŠ Ų…Ų† ØĒŲ„Ų‚Ø§ØĄ Ų†ŲØŗŲ‡ — Ų„Ø§ حاØŦØŠ " +"Ų„Ų„Ų…ØŗØŠ ØšŲ„Ų‰ Ø§Ų„Ų…Ų‚ŲˆØ¯ بؚد ØļØ¨Øˇ Ø§Ų„ØĒØŖØŽŲŠØą (Ø§Ų„Ø§ŲØĒØąØ§Øļ؊ Ų‡Ųˆ Ų„Ų…ØŗØŠ ØšŲ„Ų‰ Ø§Ų„Ų…Ų‚ŲˆØ¯).
    Ø§ØŗØĒØŽØ¯Ų… " +"Ø§Ų„ØĨØ´Ø§ØąØŠ Ų„Ø°Ų„Ųƒ ŲŲ‚Øˇ ØšŲ†Ø¯Ų…Ø§ ØĒØŗŲ…Ø­ Ø­ØąŲƒØŠ Ø§Ų„Ų…ØąŲˆØą ŲˆØ§Ų„ØˇØąŲŠŲ‚ ŲØšŲ„Ų‹Ø§ Ø¨Ø§Ų„Ų…Ų†Ø§ŲˆØąØŠ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "ØĒØŖØŽŲŠØą ØšŲ†Ø¯ Ø§Ų„Ų†Ų‚ØˇØŠ Ø§Ų„ØšŲ…ŲŠØ§ØĄ" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "Ø­Ø°Ų" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "Ø­Ø°Ų Ø§Ų„Ų…Ų„Ų Ø§Ų„Ų…ØšØˇŲ‘Ų„ \"{}\"؟" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "Ø­Ø°Ų Ų‡Ø°Ø§ Ø§Ų„ØŗØŦŲ„ØŸ" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "ØĒŲ… ØĒØšŲŠŲŠŲ† Ø§Ų„ŲˆØŦŲ‡ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "ØĒŲ… Ø§Ų„Ø§ŲƒØĒØ´Ø§Ų ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "Ø§Ų„Ų…ØˇŲˆØą" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "؊ØŦب ØŖŲ† ŲŠŲƒŲˆŲ† Ø§Ų„ØŦŲ‡Ø§Ø˛ Ų…ØŗØŦŲ‘Ų„Ų‹Ø§ Ų„Ø¯Ų‰ Konn3kt Ų„ŲŠØĒŲ… Ø§Ų‚ØĒØąØ§Ų†Ų‡." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "ØĒØŖØŽŲŠØą Ø§Ų„ØŽŲŲˆØĒ" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "Ų‚ØˇØš Ø§Ų„Ø§ØĒØĩØ§Ų„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "ØŖŲˆŲ‚Ų Ø§Ų„ØĒØ´ØēŲŠŲ„ Ų‚Ø¨Ų„ ŲØąØļ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "ØŖŲˆŲ‚Ų Ø§Ų„ØĒØ´ØēŲŠŲ„ Ų‚Ø¨Ų„ ŲØąØļ ؈ØļØš Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "؁ØĩŲ„ ØšŲ†Ø¯ Ø§Ų„ØļØēØˇ ØšŲ„Ų‰ Ø¯ŲˆØ§ØŗØŠ Ø§Ų„ŲˆŲ‚ŲˆØ¯" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "Ø§ŲØĩŲ„ Ų„ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "Ø§ŲØĩŲ„ Ų„ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "Ø§ŲØĩŲ„ Ų„ØĨؚاد؊ ØļØ¨Øˇ Ø§Ų„Ų…ØšØ§ŲŠØąØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "ØŖŲˆŲ‚Ų Ø§Ų„ØĒØ´ØēŲŠŲ„ Ų„Ų€ {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„: Ø§Ų„ŲƒØ¨Ø­ ŲŠŲˆŲ‚Ų Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ØĒŲ…Ø§Ų…Ų‹Ø§." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "Ø§Ų„Ø´Ø§Ø´ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "ØŗØˇŲˆØš Ø§Ų„Ø´Ø§Ø´ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "ØšØąØļ Ø§Ų„ØŗØąØšØŠ Ø¨Ø§Ų„ŲƒŲŠŲ„ŲˆŲ…ØĒØą/ØŗØ§ØšØŠ Ø¨Ø¯Ų„Ø§Ų‹ Ų…Ų† Ø§Ų„Ų…ŲŠŲ„/ØŗØ§ØšØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "Ø§Ų„Ų…ØŗØ§ŲØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "Ų‡Ų„ ØĒØąŲŠØ¯ ØąŲØš Ø¨ŲŠØ§Ų†Ø§ØĒ ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØŗØ§ØĻŲ‚ØŸ" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "ØĒŲ…" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "Ų…ØšØąŲ‘Ų Ø§Ų„Ø¯ŲˆŲ†ØŦŲ„" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "ØĒŲ†Ø˛ŲŠŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "ŲØ´Ų„ Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„ — Ø­Ø§ŲˆŲ„ Ų…ØąØŠ ØŖØŽØąŲ‰." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "ØŦØ§ØąŲ ØĒŲ†Ø˛ŲŠŲ„ Ų…ØąØ¨ØšØ§ØĒ Ø§Ų„ØŽØąŲŠØˇØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"ŲŠØąØŗŲ… Ø´ØąŲŠØˇŲ‹Ø§ ØšŲ„Ų‰ Ø§Ų„Ø­Ø§ŲØŠ Ø§Ų„ŲŠØŗØąŲ‰ ؊ØĒØĒبؚ Ø§Ų„ØĒØŗØ§ØąØš ŲˆØ§Ų„ŲƒØ¨Ø­ Ø§Ų„Ų…Ų‚Ø§ØŗŲŠŲ† — Ų…Ø§ ØĒŲØšŲ„Ų‡ " +"Ø§Ų„ØŗŲŠØ§ØąØŠ ŲØšŲ„ŲŠŲ‹Ø§ Ø§Ų„ØĸŲ†ØŒ ŲˆŲ„ŲŠØŗ Ų…Ø§ ŲŠØˇŲ„Ø¨Ų‡ Ø§Ų„Ų…ØŽØˇŲ‘Øˇ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"ŲŠØąØŗŲ… ØŽØąŲŠØˇØŠ Ø§Ų„Ø´Ø§Ø´ØŠ Ų…Ų† Ø§Ų„Ų…ØąØ¨ØšØ§ØĒ Ø§Ų„Ų…ØŽØ˛Ų†ØŠ ØšŲ„Ų‰ Ø§Ų„ØŦŲ‡Ø§Ø˛. ŲˆØ¨Ø¯Ų…ØŦŲ‡Ø§ Ų…Øš ؈ØļØš Ø§Ų„ØĨŲ†ØĒØąŲ†ØĒ، " +"ØĒØĒŲˆŲ„Ų‰ Ø§Ų„Ų…ØąØ¨ØšØ§ØĒ Ø§Ų„Ų…ØŽØ˛Ų†ØŠ Ø§Ų„Ų…Ų‡Ų…ØŠ Ų„Ø­Ø¸ØŠ Ø§Ų†Ų‚ØˇØ§Øš Ø§Ų„Ø§ØĒØĩØ§Ų„. ØĒŲŲ†Ø˛ŲŽŲ‘Ų„ Ø§Ų„Ų…ØąØ¨ØšØ§ØĒ Ų„Ų„Ų…Ų†ØˇŲ‚ØŠ " +"Ø§Ų„ØĒ؊ ØĒØŽØĒØ§ØąŲ‡Ø§." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØŗØ§ØĻŲ‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "ŲØ­Øĩ ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØŗØ§ØĻŲ‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "Ø§Ų„ØĒØšØ§Ų…Ų„ Ų…Øš ØĒØ¯ØŽŲ„ Ø§Ų„ØŗØ§ØĻŲ‚" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "Ø§Ų„ØąØ­Ų„Ø§ØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "Ø§Ų„ØŗØˇŲˆØš ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "Ø´ØŽØĩŲŠØŠ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "Ø¯ŲŠŲ†Ø§Ų…ŲŠŲƒŲŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "ØļØ¨Øˇ Ø¯ŲŠŲ†Ø§Ų…ŲŠŲƒŲŠ: Ø§ØŗØĒØŦاب؊ ØŖØŗØąØš Ų„Ų„ŲˆŲ‚ŲˆØ¯ ŲˆØ§Ų„ŲØąØ§Ų…Ų„." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "ØĒØšØ¯ŲŠŲ„" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "ØŽØˇØŖ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "ØĒŲ…ŲƒŲŠŲ†" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "ØĒŲ…ŲƒŲŠŲ† ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"ØĒŲØšŲŠŲ„ Always on Lateral (AOL). ØšØˇŲ‘Ų„ Ų‡Ø°Ø§ Ø§Ų„Ų…ŲØĒاح Ų„Ų„ØšŲˆØ¯ØŠ ØĨŲ„Ų‰ ØŗŲ„ŲˆŲƒ ØĒŲØšŲŠŲ„ " +"Ø§Ų„ØĒ؈ØŦŲŠŲ‡ Ø§Ų„ØŖØĩŲ„ŲŠ ؁؊ IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "ØĒŲØšŲŠŲ„ ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØĒØŗØŦŲŠŲ„" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "ØĒŲ…ŲƒŲŠŲ† ØĒØ­Ø°ŲŠØąØ§ØĒ Ų…ØēØ§Ø¯ØąØŠ Ø§Ų„Ų…ØŗØ§Øą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"ŲŠŲØšŲ‘Ų„ Ø§Ų„ØĒØšØ§Ų…Ų„ Ų…Øš ؂؁؄ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ؁؊ MQB ØšŲ„Ų‰ Ų…ØąŲƒØ¨Ø§ØĒ Volkswagen MQB Ø§Ų„ØĒ؊ ØĒØšØ§Ų†ŲŠ " +"ØŖØšØˇØ§Ų„ LKAS ØšŲ†Ø¯ Ø§Ų„ØŗØąØšØ§ØĒ Ø§Ų„Ų…Ų†ØŽŲØļØŠ." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "ØĒŲ…ŲƒŲŠŲ† Ø§Ų„ØĒØŦŲˆØ§Ų„" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "ØĒŲ…ŲƒŲŠŲ† SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "ØĒŲ…ŲƒŲŠŲ† Ø§Ų„ØąØ¨Øˇ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "ØĒŲ…ŲƒŲŠŲ† Ų…ØąØ§Ų‚Ø¨ØŠ Ø§Ų„ØŗØ§ØĻŲ‚ Ø­ØĒŲ‰ ØšŲ†Ø¯Ų…Ø§ Ų„Ø§ ŲŠŲƒŲˆŲ† IQ.Pilot Ų…ŲØ´ØēŲ„Ø§Ų‹." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "ØŖØ¯ØŽŲ„ APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "ØŖØ¯ØŽŲ„ ØąŲ…Ø˛ Ø§Ų„ØĒŲØšŲŠŲ„" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "ØĨØ¯ØŽØ§Ų„ Ø§Ų„ØąŲ…Ø˛" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "ØŖØ¯ØŽŲ„ SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "ØŖØ¯ØŽŲ„ ØšŲ†ŲˆØ§Ų†Ų‹Ø§ ØŖŲˆ Ų…ŲƒØ§Ų†Ų‹Ø§" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "ØŖØ¯ØŽŲ„ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ø§Ų„ØąØ¨Øˇ Ø§Ų„ØŦØ¯ŲŠØ¯ØŠ" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "ØŖØ¯ØŽŲ„ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "ØŖØ¯ØŽŲ„ Ø§ØŗŲ… Ų…ØŗØĒØŽØ¯Ų… GitHub Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "ØŽØˇØŖ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "Ø§Ų„ØŽØąŲˆØŦ Ų…Ų† ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Ø´ØąŲŠØˇ Ø­Ø§Ų„ØŠ Ų…ŲˆØŗŲ‘Øš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "MPC ØĒØŦØąŲŠØ¨ŲŠ Ų„Ų„Ų…ØąŲƒØ¨ØŠ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"ŲŠØšØąØļ Ų†ØŗØŽØŠ Ų…Ų† Ų…Ų‚Ø§ØˇØš ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØĒØŗØŦŲŠŲ„ ŲˆØ§Ų„ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØŖØŽŲŠØąØŠ ŲƒŲ‚ØąØĩ USB ØšŲ†Ø¯ Ø§Ų„ØĒ؈ØĩŲŠŲ„ " +"Ø¨Ø­Ø§ØŗŲˆØ¨. ŲŠØŗØĒŲ…Øą IQ.Pilot ؁؊ Ø§Ų„ØšŲ…Ų„ ØŖØĢŲ†Ø§ØĄ ØĒŲØšŲŠŲ„ Ų‡Ø°Ø§." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "ØŦØ§ØąŲ Ø§Ų„Ų†ØŗŲŠØ§Ų†..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ø§Ų„ØŖØĩŲ„ŲŠ Ų…Ų† Toyota Ų…ŲØąŲˆØļ Ø­Ø§Ų„ŲŠŲ‹Ø§. ا؎ØĒØą ؈ØļØšŲ‹Ø§ ØˇŲˆŲ„ŲŠŲ‹Ø§ Ų…Ų† IQ " +"Ų„ØĒØšØˇŲŠŲ„Ų‡." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "ØļØ¨Øˇ ØˇŲˆŲ„ŲŠ Ø§ŲØĒØąØ§Øļ؊ Ų…Ų† Ø§Ų„Ų…ØĩŲ†Øš." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "Ø§Ų„Ų…ŲØļŲ„ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "ØŦØ§ØąŲ ØŦŲ„Ø¨ Ø§Ų„ØŽØąŲŠØˇØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "ØŦØ§ØąŲ ØŦŲ„Ø¨ Ø§Ų„ØŽØąØ§ØĻØˇ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "ØĒØ­Ø°ŲŠØą ØŖØŽŲŠØą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "اؚØĢØą ØšŲ„Ų‰ Ų…ØąŲƒØ¨ØĒ؃" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "ØĨŲ†Ų‡Ø§ØĄ Ø§Ų„ØĨؚداد" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"ŲŠØšØąØļ ØĒØ­Ø°ŲŠØąŲ‹Ø§ ØŦØ§Ų†Ø¨ŲŠŲ‹Ø§ ŲƒŲ„Ų…Ø§ ØŖØ¨Ų„ØēØĒ Ø§Ų„ØŗŲŠØ§ØąØŠ ØšŲ† ؈ØŦŲˆØ¯ Ø´ŲŠØĄ ؁؊ Ų†Ų‚ØˇØĒ؃ Ø§Ų„ØšŲ…ŲŠØ§ØĄ " +"(Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ Ø§Ų„Ų…Ø˛ŲˆØ¯ØŠ Ø¨Ų†Ø¸Ø§Ų… BSM ŲŲ‚Øˇ)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "ŲØšŲ‘Ų„ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ø¯Ø§ØĻŲ… Ų…Ų† Ų„ŲˆØ­ØŠ Ø§Ų„ØŦŲ‡Ø§Ø˛ØŒ ØŖŲˆ ØŖØˇŲØĻ Ø§Ų„ØŗŲŠØ§ØąØŠØŒ Ų„ØĒØēŲŠŲŠØą Ų‡Ø°Ø§." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "Ų…ØŗØ§ŲØŠ Ø§Ų„Ų…ØĒابؚ؊" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "اØĒبؚ Ø§Ų„ØĒØšŲ„ŲŠŲ…Ø§ØĒ ؁؊ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ų„ØĨØĒŲ…Ø§Ų… Ø§Ų„Ø§Ų‚ØĒØąØ§Ų†" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"ŲØąØļ ؈ØļØš Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ØšŲ„Ų‰ IQ.Pilot Ų„Ų…Ø¯ØŠ 10 Ø¯Ų‚Ø§ØĻŲ‚ØŸ ØŗŲŠŲŲØšŲŽŲ‘Ų„ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ø¯Ø§ØĻŲ… " +"ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§ ŲˆØŗŲŠØšŲˆØ¯ Ø§Ų„ØŦŲ‡Ø§Ø˛ ØĨŲ„Ų‰ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų بؚد Ø§Ų†ØĒŲ‡Ø§ØĄ Ø§Ų„Ų…Ø¤Ų‚Ų‘ØĒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "ŲØąØļ ŲˆØ§ØŦŲ‡ØŠ Mici" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "ŲØąØļ ؈ØļØš Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ (10 Ø¯Ų‚Ø§ØĻŲ‚)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø¨Ø¯ØĄ ŲØąØļ ؈ØļØš Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ØĨŲ„Ø§ ØŖØĢŲ†Ø§ØĄ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "ŲØąØļ ؈ØļØš Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ Ų…ŲØšŲ‘Ų„ Ø¨Ø§Ų„ŲØšŲ„. ØĨؚاد؊ ØļØ¨Øˇ Ø§Ų„Ų…Ø¤Ų‚Ų‘ØĒ ØĨŲ„Ų‰ 10 Ø¯Ų‚Ø§ØĻŲ‚ØŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "؈ØļØš Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ Ø§Ų„Ų…ŲØąŲˆØļ Ų†Ø´Øˇ" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Ų†ØŗŲŠØ§Ų†" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "Ų‡Ų„ ØĒØąŲŠØ¯ Ų†ØŗŲŠØ§Ų† Ø´Ø¨ŲƒØŠ Wi‑Fi \"{}\"؟" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "ØŦŲŠØ¯" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Ų…ØĩØ§Ø¯Ų‚ØŠ Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "ØąŲ…Ø˛ / ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Ø§ØŗŲ… Ų…ØŗØĒØŽØ¯Ų… Git" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "ØŽØˇØŖ ؁؊ GitHub ({}) ØŖØĢŲ†Ø§ØĄ ØŦŲ„Ø¨ Ø§Ų„Ų…ŲØ§ØĒŲŠØ­" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "Ų…ØąØĒŲØš" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "Ø´Ø¨ŲƒØŠ Ų…ØŽŲŲŠØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "ØĒØšŲ„ŲŠŲ‚ ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą Ø¨ØŗØ¨Ø¨ Ø§Ų„Ų†Ų‚ØˇØŠ Ø§Ų„ØšŲ…ŲŠØ§ØĄ" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "ØĢØ¨Ų‘ØĒ Ø§Ų„ØŦŲ‡Ø§Ø˛..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"ŲŠØšŲ„Ų‘Ų‚ ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ ØˇØ§Ų„Ų…Ø§ ØŖØ¨Ų„ØēØĒ Ų…ØąØ§Ų‚Ø¨ØŠ Ø§Ų„Ų†Ų‚ØˇØŠ Ø§Ų„ØšŲ…ŲŠØ§ØĄ ØšŲ† ØŗŲŠØ§ØąØŠ ؁؊ " +"Ø§Ų„Ų…ØŗØ§Øą Ø§Ų„Ų‡Ø¯ŲØŒ ŲˆŲŠØ­ØąØąŲ‡ Ø¨Ų…ØŦØąØ¯ ØŽŲ„Ųˆ Ø§Ų„Ų…ØŗØ§Øą." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Ø§Ų„Ų…Ų†Ø˛Ų„" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "ØŗØ§ØšØ§ØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"Ø§Ų„Ų…Ø¯ØŠ Ø§Ų„ØĒ؊ ŲŠŲ…ŲƒŲ† ØŖŲ† ØĒØ¨Ų‚Ų‰ ŲŲŠŲ‡Ø§ شاش؊ Ø§Ų„ØĨؚداداØĒ Ø¯ŲˆŲ† Ų„Ų…Øŗ Ų‚Ø¨Ų„ ØŖŲ† ØĒŲØēŲ„Ų‚ Ų†ŲØŗŲ‡Ø§." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"Ų…Ų‚Ø¯Ø§Øą ŲˆŲ‚ØĒ Ø§Ų„Ø§ØŗØĒØ¨Ø§Ų‚ Ø§Ų„Ø°ŲŠ ŲŠŲØļØ§Ų ŲŲˆŲ‚ ØĒØŖØŽŲŠØą ØšŲ„Ø¨ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ؁؊ Ø§Ų„ØŗŲŠØ§ØąØŠ ØŖØĢŲ†Ø§ØĄ ØĨŲŠŲ‚Ø§Ų " +"Ø§Ų„ØļØ¨Øˇ Ø§Ų„Ø°Ø§ØĒ؊. Ø§Ų„Ų‚ŲŠŲ…ØŠ Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ 0.2 ØĢØ§Ų†ŲŠØŠ." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "ØĒØĢØ¨ŲŠØĒ" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "ØšŲ†ŲˆØ§Ų† IP" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "ØĒŲˆŲ‚ŲØ§ØĒ IQ Ø§Ų„ØĨØŦØ¨Ø§ØąŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "؈ØļØš IQ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"ØŖŲˆØļاؚ IQ Ø§Ų„ØˇŲˆŲ„ŲŠØŠ ØēŲŠØą Ų…ØĒاح؊ Ų„Ų‡Ø°Ų‡ Ø§Ų„Ų…ØąŲƒØ¨ØŠ. Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ Ø§Ų„ØŖØĩŲ„ŲŠ Ų‡Ųˆ Ø§Ų„ØŽŲŠØ§Øą " +"Ø§Ų„ŲˆØ­ŲŠØ¯ Ø§Ų„Ų…ØĒاح." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic Ø§Ų„Ų…Ų†ØšØˇŲØ§ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic ØŗØąØšØŠ Ø§Ų„Ų…ØąŲƒØ¨ØŠ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic Ø§Ų„ØŗØąØšØŠ Ø§Ų„Ų…Ų†ØŽŲØļØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic ØĒŲˆŲ‚ŲØ§ØĒ Ø§Ų„Ų†Ų…ŲˆØ°ØŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic احØĒŲŠØ§ØˇŲŠ SLC" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic Ų…ØąŲƒØ¨ØŠ ØŖŲ…Ø§Ų…ŲŠØŠ ØŖØ¨ØˇØŖ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic Ų…ØąŲƒØ¨ØŠ ØŖŲ…Ø§Ų…ŲŠØŠ Ų…ØĒŲˆŲ‚ŲØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "ØĨØĩØ¯Ø§Øą IQ.OS" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot ØēŲŠØą Ų…ØĒاح" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"ŲŠŲ‚ŲˆŲ… IQ.Pilot Ø¨Ø§Ų„Ų…ØšØ§ŲŠØąØŠ Ø¨Ø´ŲƒŲ„ Ų…ØŗØĒŲ…ØąØŒ ŲˆŲ†Ø§Ø¯ØąØ§Ų‹ Ų…Ø§ ØĒØĒØˇŲ„Ø¨ ØĨؚاد؊ Ø§Ų„ØļØ¨Øˇ. ØŗØĒØ¤Ø¯ŲŠ " +"ØĨؚاد؊ ØļØ¨Øˇ Ø§Ų„Ų…ØšØ§ŲŠØąØŠ ØĨŲ„Ų‰ ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ IQ.Pilot ØĨذا ŲƒØ§Ų†ØĒ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų‚ŲŠØ¯ Ø§Ų„ØĒØ´ØēŲŠŲ„." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"؊ØĒØˇŲ„Ø¨ IQ.Pilot ØĒØąŲƒŲŠØ¨ Ø§Ų„ØŦŲ‡Ø§Ø˛ ØļŲ…Ų† 4° ŲŠØŗØ§ØąØ§Ų‹ ØŖŲˆ ŲŠŲ…ŲŠŲ†Ø§Ų‹ ؈ØļŲ…Ų† 5° Ų„Ų„ØŖØšŲ„Ų‰ ØŖŲˆ 9° " +"Ų„Ų„ØŖØŗŲŲ„." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"ØĨذا ŲƒŲ†ØĒ ØĒŲ‚ŲˆØ¯ Ø¨ØŗØąØšØŠ 20 Ų…ŲŠŲ„Ų‹Ø§/Øŗ (32 ŲƒŲ…/Øŗ) ØŖŲˆ ØŖŲ‚Ų„ Ų…Øš ØĒØ´ØēŲŠŲ„ Ø§Ų„ØĨØ´Ø§ØąØŠØŒ ŲØŗØĒØŽØˇØˇ " +"Ø§Ų„ØŗŲŠØ§ØąØŠ Ų„Ų„Ø§Ų†ØšØˇØ§Ų ؁؊ Ø°Ų„Ųƒ Ø§Ų„Ø§ØĒØŦØ§Ų‡ ØšŲ†Ø¯ ØŖŲ‚ØąØ¨ Ų…ØŗØ§Øą Ų‚Ø§Ø¨Ų„ Ų„Ų„Ų‚ŲŠØ§Ø¯ØŠ. ŲŠŲ…Ų†Øš Ų‡Ø°Ø§ Ø§Ų„Ø­Ø§Ų„Ø§ØĒ" +" (Ų…ØĢŲ„ Ø§Ų„ØĨØ´Ø§ØąØ§ØĒ Ø§Ų„Ø­Ų…ØąØ§ØĄ) Ø§Ų„ØĒ؊ Ų‚Ø¯ ØĒØŽØˇØˇ ŲŲŠŲ‡Ø§ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų„Ų„Ø§Ų†ØšØˇØ§Ų ؁؊ Ø§Ų„Ø§ØĒØŦØ§Ų‡ " +"Ø§Ų„ØŽØ§ØˇØĻ." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "Ų…ØšŲ„ŲˆŲ…Ø§ØĒ" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "ØŖØ¯ØŽŲ„ Ø´ØąŲŠØ­ØŠ comma Ø§Ų„ØŖØĩŲ„ŲŠØŠ Ø§Ų„Ų…ØąŲŲ‚ØŠ Ų…Øš Ø§Ų„ØŦŲ‡Ø§Ø˛ Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "ØĒØĢØ¨ŲŠØĒ Ø§Ų„ØĒØ­Ø¯ŲŠØĢ" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "ØąŲ…Ø˛ QR ØēŲŠØą ØĩØ§Ų„Ø­" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "ŲƒŲ…" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "ØŽØˇØŖ ؁؊ KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT ØēŲŠØą Ų…ØĒØĩŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "ØĨØ¨Ų‚Ø§ØĄ Ø§Ų„ØŦŲ‡Ø§Ø˛ ؁؊ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "Ø§Ų„ØĨØ¨Ų‚Ø§ØĄ ØšŲ„Ų‰ Ø§Ų„ŲˆŲ‚ŲˆØ¯ ŲˆØ§Ų„ŲØąØ§Ų…Ų„ Ø§Ų„ØŖØĩŲ„ŲŠŲŠŲ†" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"؊ØĒØąŲƒ Ø§Ų„ŲˆŲ‚ŲˆØ¯ ŲˆØ§Ų„ŲØąØ§Ų…Ų„ Ų„Ų†Ø¸Ø§Ų… Toyota Ø§Ų„ØŖØĩŲ„ŲŠØ› ؈؊ØĒŲˆŲ„Ų‰ IQ.Pilot Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ŲŲ‚Øˇ." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Ų…Ø˛Ø§ŲŠØ§ Konn3kt:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Ø­Ø§Ų„ØŠ Konn3kt:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "Ø§Ų„Ø­Ø¯" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "ØŦØ§ØąŲ Ø§Ų„ØĒØ­Ų…ŲŠŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "ØŦØ§ØąŲ Ø§Ų„ØĒØ­Ų…ŲŠŲ„..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "ØŽŲŠØ§ØąØ§ØĒ ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ ØšŲ†Ø¯ ØšØˇŲ„ Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "؈ØļØš Ø§Ų„Ų…Ų†Ø§ŲˆØąØŠ Ø§Ų„ØŦØ§Ų†Ø¨ŲŠØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "Ų‚ØąØ§ØĄØ§ØĒ Ø§Ų„Ų…ØąŲƒØ¨ØŠ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "Ø§Ų„ØŽØąŲˆØŦ Ų…Ų† ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ø¯Ø§ØĻŲ… Ø§Ų„ØĸŲ†ØŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "Ø§Ų„ØŽØąŲˆØŦ Ų…Ų† ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ų…ŲØąŲˆØļ Ø§Ų„ØĸŲ†ØŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"دؚ IQ.Pilot ŲŠŲ‚ŲŠØŗ Ø§Ų„Ų…Ø¯ØŠ Ø§Ų„ØĒ؊ ŲŠØŗØĒØēØąŲ‚Ų‡Ø§ ØĒ؈ØŦŲŠŲ‡Ųƒ Ų„Ų„Ø§ØŗØĒØŦاب؊ ŲˆŲŠØ¨Ų‚ŲŠ Ų‡Ø°Ų‡ Ø§Ų„Ų‚ŲŠŲ…ØŠ " +"Ų…Ø­Ø¯Ų‘ØĢØŠ. ØŖŲˆŲ‚ŲŲ‡ Ų„ØĒØ­Ø¯ŲŠØ¯ Ø§Ų„ØĒŲˆŲ‚ŲŠØĒ Ø¨Ų†ŲØŗŲƒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "؊ØĒŲŠØ­ Ų„Ųƒ ØĒØ­ØąŲŠŲƒ Ø§Ų„Ų…Ų‚ŲˆØ¯ ØŖØĢŲ†Ø§ØĄ Ø§Ų„ØĒŲØšŲŠŲ„ Ø¯ŲˆŲ† ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒ؈ØŦŲŠŲ‡ Ø¨Ø§Ų„ŲƒØ§Ų…Ų„." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "بØĢ Ų…Ø¨Ø§Ø´Øą" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "ØŦØ§ØąŲ ØĒØ­Ų…ŲŠŲ„ %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "ØŦØ§ØąŲ ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "ØŦØ§ØąŲ Ø§Ų„ØĒØ­Ų…ŲŠŲ„..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "ØŦØ§ØąŲ ØĒØ­Ø¯ŲŠØ¯ Ø§Ų„Ų…ŲˆŲ‚Øš..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "؅؂؁؄ ØšŲ„Ų‰ ØĨŲŠŲ‚Ø§Ų ؁؊ Ų‡Ø°Ų‡ Ø§Ų„Ų…Ų†ØĩØŠØ› Ø§Ų„Ų…ØąŲƒØ¨ØŠ Ų„Ø§ ØĒØ¯ØšŲ… ØŽŲŠØ§ØąØ§ØĒ ØŖØŽØąŲ‰." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"ØŖŲˆØļاؚ Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ:
    Ų…ŲŠØ˛Ø§ØĒ IQ.Pilot Ų…Ø°ŲƒŲˆØąØŠ ØŖØ¯Ų†Ø§Ų‡:

    Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ " +"Ø§Ų„Ø´Ø§Ų…Ų„ Ų…Ų† IQ.Pilot


    دؚ Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ؊ØĒØ­ŲƒŲ… ؁؊ Ø§Ų„ŲˆŲ‚ŲˆØ¯ ŲˆØ§Ų„ŲØąØ§Ų…Ų„. ØŗŲŠŲ‚ŲˆØ¯ " +"IQ.Pilot ŲƒŲ…Ø§ ŲŠØ¸Ų† ØŖŲ† Ø§Ų„ØĨŲ†ØŗØ§Ų† ØŗŲŠŲ‚ŲˆØ¯ØŒ Ø¨Ų…Ø§ ؁؊ Ø°Ų„Ųƒ Ø§Ų„ØĒŲˆŲ‚Ų ØšŲ†Ø¯ Ø§Ų„ØĨØ´Ø§ØąØ§ØĒ Ø§Ų„Ø­Ų…ØąØ§ØĄ " +"ŲˆØšŲ„Ø§Ų…Ø§ØĒ Ø§Ų„ØĒŲˆŲ‚Ų. ŲˆØ¨Ų…Ø§ ØŖŲ† Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ų‡Ųˆ Ų…Ų† ŲŠØ­Ø¯Ø¯ Ø§Ų„ØŗØąØšØŠØŒ ؁ØĨŲ† Ø§Ų„ØŗØąØšØŠ Ø§Ų„Ų…Ø­Ø¯Ø¯ØŠ ØĒØšŲ…Ų„ " +"ŲƒØ­Ø¯ ØŖØšŲ„Ų‰ ŲŲ‚Øˇ. Ų„Ø§ ØĒØ˛Ø§Ų„ Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ Ų‚ŲŠØ¯ Ø§Ų„ØĒØ­ØŗŲŠŲ†Ø› ؈؊ØŦب ØĒŲˆŲ‚Ų‘Øš " +"Ø§Ų„ØŖØŽØˇØ§ØĄ.

    IQ.Dynamic


    ŲŠŲ…Ø˛ØŦ Ø¯ŲŠŲ†Ø§Ų…ŲŠŲƒŲŠŲ‹Ø§ Ø¨ŲŠŲ† ØŗŲ„ŲˆŲƒ Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ " +"Ø§Ų„ØĒ؃؊؁؊ ŲˆØ§Ų„ØŗŲ„ŲˆŲƒ Ø§Ų„Ø´Ø§Ų…Ų„ Ø­ØŗØ¨ Ø§Ų„Ų…Ø´Ų‡Ø¯ ŲˆØ§Ų„ØŗŲŠØ§Ų‚.

    IQ.Chill


    ŲŠØŗØĒØŽØ¯Ų…" +" ØŗŲ„ŲˆŲƒ Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ Ø§Ų„Ų…ØĒŲØ§ØšŲ„ Ų…Øš Ø­ØąŲƒØŠ Ø§Ų„Ų…ØąŲˆØą Ų„Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ.

    ØšØąØļ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ" +" Ø§Ų„ØŦØ¯ŲŠØ¯


    ØŗŲŠŲ†ØĒŲ‚Ų„ ØšØąØļ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ØĨŲ„Ų‰ Ø§Ų„ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ ŲˆØ§ØŗØšØŠ Ø§Ų„Ø˛Ø§ŲˆŲŠØŠ ØšŲ†Ø¯ " +"Ø§Ų„ØŗØąØšØ§ØĒ Ø§Ų„Ų…Ų†ØŽŲØļØŠ Ų„ØĨØ¸Ų‡Ø§Øą بؚØļ Ø§Ų„Ų…Ų†ØšØˇŲØ§ØĒ Ø¨ŲˆØļŲˆØ­ ØŖŲƒØ¨Øą. ŲƒŲ…Ø§ ØŗŲŠØ¸Ų‡Øą Ø´ØšØ§Øą IQ.Pilot ؁؊" +" Ø§Ų„Ø˛Ø§ŲˆŲŠØŠ Ø§Ų„ØšŲ„ŲˆŲŠØŠ Ø§Ų„ŲŠŲ…Ų†Ų‰." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "؈ØļØš Ø§Ų„Ų…Ų†Ø§ŲˆØąØŠ Ø§Ų„ØˇŲˆŲ„ŲŠØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "Ų†Ų…Øˇ Ø§Ų„ØļØ¨Øˇ Ø§Ų„ØˇŲˆŲ„ŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "Ø§ØŗØĒØ¨Ø§Ų‚ ØŖØšŲ„Ų‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "Ø§ØŗØĒØ¨Ø§Ų‚ ØŖØ¯Ų†Ų‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "ØĒØŽØˇŲŠØˇ Ø§Ų„Ø§Ų†ØšØˇØ§Ų ØšŲ†Ø¯ Ø§Ų„ØŗØąØšØ§ØĒ Ø§Ų„Ų…Ų†ØŽŲØļØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"ŲŠŲ…ØąŲ‘Øą Ø§Ų„Ø§Ų†Ø­Ų†Ø§ØĄ Ø§Ų„Ų…ØŽØˇØˇ ØšØ¨Øą Ų…ØąØ´Ų‘Ø­ ØĒŲ…ØąŲŠØą Ų…Ų†ØŽŲØļ Ų‚Ø¨Ų„ ؈ØĩŲˆŲ„Ų‡ ØĨŲ„Ų‰ ØĩŲ†Ø¯ŲˆŲ‚ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ؁؊ " +"Ų…ØąŲƒØ¨Ø§ØĒ MEB ؈MQB Evo، Ų…Ø§ ŲŠØŽŲŲ‘Ų Ø§Ų„ØĒذبذب Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ. Ų…ŲØšŲ‘Ų„ Ø§ŲØĒØąØ§ØļŲŠŲ‹Ø§ Ų„Ų‡Ø°Ų‡ " +"Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "ŲŠØ¯ŲˆŲŠ" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "ØŖŲ‚ØĩŲ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "Ø§ØŗØĒØĻŲ†Ø§Ų ACC ؁؊ MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "Ø§ØŗØĒØĻŲ†Ø§Ų ACC ؁؊ MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "؂؁؄ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ؁؊ MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "؂؁؄ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ؁؊ MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "Ø§Ų„ØĩŲŠØ§Ų†ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "ØĨØ˛Ø§Ø­ØŠ Ø§Ų„ØĒØŖØŽŲŠØą Ø§Ų„ŲŠØ¯ŲˆŲŠØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "Ų‚Ø§ØšØ¯ØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØŽØąØ§ØĻØˇ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "Ø§Ų„Ų…Ų‚Ø§Øŗ:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "ØŖŲ…ŲŠØ§Ų„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "ŲŠØšŲƒØŗ ØĨØ´Ø§ØąØ§ØĒ Ø§Ų„ØŗŲŠØ§ØąØŠ ØšŲ„Ų‰ Ø´ŲƒŲ„ ØŖØŗŲ‡Ų… ØšŲ„Ų‰ شاش؊ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "Ø˛Ų…Ų† ØĒŲˆŲ‚Ų Ø§Ų„Ų†Ų…ŲˆØ°ØŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "Ø§Ų„Ų†Ų…Ø§Ø°ØŦ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "ØēŲŠØą Ų…ØĒŲˆŲØą" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "Ų„Ø§ ؊؈ØŦد PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "Ų„Ø§ Ø´ŲŠØĄ" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "Ø§Ų„Ų…Ų„Ø§Ø­ØŠ" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "ØĒŲ… ØĨŲ„ØēØ§ØĄ Ø§Ų„Ų…Ų„Ø§Ø­ØŠ" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "Ų‚ØąŲŠØ¨" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "Ø§Ų„Ø´Ø¨ŲƒØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "Ø§Ų„Ø´Ø¨ŲƒØŠ Ø§Ų„ØšØĩØ¨ŲŠØŠ FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "Ø§Ų„ØĒØēØ°ŲŠØŠ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ Ø¨Ø§Ų„Ø´Ø¨ŲƒØŠ Ø§Ų„ØšØĩØ¨ŲŠØŠ (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "ØšØ¯Ų… Ø§Ų„ØŗŲƒŲˆŲ† ØŖØ¨Ø¯Ų‹Ø§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "Ų„Ø§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "Ø¨Ø¯ŲˆŲ† Ų„Ų…ØŗØŠ" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "Ų„Ų… ؊ØĒŲ… Ø§ŲƒØĒØ´Ø§Ų ØąŲ…Ø˛ QR" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ Ų…ŲØ§ØĒŲŠØ­ SSH Ų„Ų„Ų…ØŗØĒØŽØ¯Ų… '{}'" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ Ø´Ø¨ŲƒØ§ØĒ Wi-Fi" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "Ų„Ų… ؊ØĒŲ… Ø§ŲƒØĒØ´Ø§Ų ŲƒØ§Ų…ŲŠØąØ§ ؁؊ ؈ØļØš Ø§Ų„Ų…ØˇŲˆŲ‘Øą. اØļØēØˇ ØšŲ„Ų‰ ØĒØ­Ų‚Ų‚ Ų„Ų„Ų…ØĒابؚ؊." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "Ų„Ø§ ØĒ؈ØŦد Ų…Ų„Ø§Ø­Ø¸Ø§ØĒ ØĨØĩØ¯Ø§Øą Ų…ØĒاح؊." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "Ų„Ø§ ØĒ؈ØŦد Ų†ØĒاØĻØŦ" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "Ų„Ø§ ØĒ؈ØŦد ØąØ­Ų„Ø§ØĒ Ų…ØŗØŦŲ„ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "Ų„Ų… ØĒŲØ­Ø¯ŲŽŲ‘Ø¯ Ų…ØąŲƒØ¨ØŠ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "Ų„Ø§ ؊؈ØŦد ŲŲŠØ¯ŲŠŲˆ Ų„Ų‡Ø°Ų‡ Ø§Ų„ŲƒØ§Ų…ŲŠØąØ§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"ØšØ§Ø¯ØŠŲ‹ ØĒŲ†Ų‡ŲŠ Ų…Ų†Ø§ŲˆØąØŠ ŲˆØ§Ø­Ø¯ØŠ ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą Ø­ØĒŲ‰ Ų…Øš Ø§ØŗØĒŲ…ØąØ§Øą Ø§Ų„ØĨØ´Ø§ØąØŠ. ŲØšŲ‘Ų„ Ų‡Ø°Ø§ Ų„ØĒØŗŲ„ØŗŲ„" +" ØĒØēŲŠŲŠØąØ§ØĒ ØĨØļØ§ŲŲŠØŠ ØˇØ§Ų„Ų…Ø§ Ø¨Ų‚ŲŠØĒ Ø§Ų„ØĨØ´Ø§ØąØŠ Ų…ŲØšŲ‘Ų„ØŠ — ŲˆŲƒŲ„ ØĒØēŲŠŲŠØą ØĒØ§Ų„Ų ؊ØĒØˇŲ„Ø¨ Ų„Ų…ØŗØŠ ØšŲ„Ų‰ " +"Ø§Ų„Ų…Ų‚ŲˆØ¯." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "ØēŲŠØą Ų…ØĒاح ØšŲ„Ų‰ Ų…Ų†ØĩØŠ Subaru Ų‡Ø°Ų‡." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "ØēŲŠØą Ų…ØĒØĩŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "ØēŲŠØą Ų…Ø­Ø¯Ø¯" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"Ų…Ų„Ø§Ø­Ø¸ØŠ: ؁؊ Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ Ø§Ų„ØĒ؊ Ų„Ø§ ØĒØ­ØĒ؈؊ ØšŲ„Ų‰ Ø˛Øą LFA/LKAS، ŲŠŲ…Ų†Øš ØĨŲŠŲ‚Ø§Ų Ų‡Ø°Ø§ ØĒØŦŲ‡ŲŠØ˛ " +"Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ØšŲ†Ø¯ ØĒØēŲŠŲ‘Øą ØĒŲˆŲØą Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "Ų„Ų…ØŗØŠ ØšŲ„Ų‰ Ø§Ų„Ų…Ų‚ŲˆØ¯" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "ØēŲŠØą Ų…ØĒØĩŲ„" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "Ų…ŲˆØ§ŲŲ‚" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "Ų…ØĒØĩŲ„" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "ØĨŲŠŲ‚Ø§Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "ØŽØąØ§ØĻØˇ Ø§Ų„Ø´Ø§Ø´ØŠ Ø¯ŲˆŲ† اØĒØĩØ§Ų„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "Ų…Ø¤Ų‚Ų‘ØĒ Ø§Ų„ØĨØˇŲØ§ØĄ ؁؊ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų: ŲŠØ¯ØŽŲ„ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ø¯Ø§ØĻŲ… ؁؊ ŲƒŲ„ Ų…ØąØŠ ŲŠŲ‚Ų„Øš ŲŲŠŲ‡Ø§ ØŖŲˆ ŲŠØŗØĒŲŠŲ‚Ø¸." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "Ø§Ų„ØĨØ˛Ø§Ø­ØŠ:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "ØšŲ„Ų‰ Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "ØŽØąØ§ØĻØˇ Ø§Ų„Ø´Ø§Ø´ØŠ ØšØ¨Øą Ø§Ų„ØĨŲ†ØĒØąŲ†ØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„Ų…ØˇŲˆŲ‘Øą ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "Ø§ŲØĒØ­ ØĒØˇØ¨ŲŠŲ‚ Konn3kt ØšŲ„Ų‰ Ų‡Ø§ØĒ؁؃" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "Ø§ØŗŲ… Ų…ØŗØĒØšØ§Øą ا؎ØĒŲŠØ§ØąŲŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"ŲŠØšØąØļ ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ Ø´ØąŲŠØˇŲ‹Ø§ Ø¨Ų…Ų‚Ø§ŲŠŲŠØŗ Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„Ø­ŲŠØŠ (Ø§Ų„ØĒ؈ØŦŲŠŲ‡ØŒ Ø§Ų„ØĒØŗØ§ØąØš Ø§Ų„ØŦØ§Ų†Ø¨ŲŠØŒ " +"Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų…ØąŲƒØ¨ØŠ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "ØĨŲ‚ØąØ§Ų†" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "Ø§Ų„ØŖØŗØ¨ŲˆØš Ø§Ų„Ų…Ø§Øļ؊" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "؈ØļØš PQ HCA Status 7" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "؈ØļØš PQ HCA status 7" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "Ų…ØšØ§ŲŠŲ†ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "ØĨŲ‚ØąØ§Ų† Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "Ø§Ų„ØĒØąŲ‚ŲŠØŠ Ø§Ų„ØĸŲ†" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "ØĨŲ‚ØąØ§Ų† Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Ø§Ų‚ØąŲ† ØŦŲ‡Ø§Ø˛Ųƒ ؁؊ ØĒØˇØ¨ŲŠŲ‚ Konn3kt" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Ø§Ų‚ØąŲ† ØŦŲ‡Ø§Ø˛Ųƒ ؁؊ ØĒØˇØ¨ŲŠŲ‚ Konn3kt." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "Ų‚Ų… بØĨŲ‚ØąØ§Ų† ØŦŲ‡Ø§Ø˛Ųƒ Ø¨Ø­ØŗØ§Ø¨ comma" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ­Ø¯ŲŠØĢاØĒ Ų…Ø¤Ų‚ØĒŲ‹Ø§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "ØĨØŦØąØ§ØĄ بحØĢ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "ا؎ØĒØą ؃؊؁ ØĒØĒŲØ§ØšŲ„ Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ØšŲ†Ø¯Ų…Ø§ ŲŠŲƒØ¨Ø­ Ø§Ų„ØŗØ§ØĻŲ‚ ؁؊ IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "ا؎ØĒØą Ų…Ø§ ŲŠŲØšŲ„Ų‡ Ø§Ų„ØļØēØˇ ØšŲ„Ų‰ Ø¯ŲˆØ§ØŗØŠ Ø§Ų„ŲØąØ§Ų…Ų„ Ø¨Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"ا؎ØĒØą Ų…Ø§ ØĨذا ŲƒØ§Ų† Ø§Ų„ØĒØ­Ø¯ŲŠØĢ Ø§Ų„ØŦØ§Ų‡Ø˛ ŲŠŲ†ØĒØ¸Øą Ų…ŲˆØ§ŲŲ‚ØĒ؃ ŲŲ‚ØˇØŒ ØŖŲ… ŲŠŲŲ†Ø˛ŲŽŲ‘Ų„ ŲˆŲŠŲØĢØ¨ŲŽŲ‘ØĒ Ų…Ų† " +"ØĒŲ„Ų‚Ø§ØĄ Ų†ŲØŗŲ‡." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "ا؎ØĒØą Ų…ØąŲƒØ¨ØĒ؃" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "ØĢØ¨Ų‘ØĒ Ų…ØąŲƒØ¨ØŠ Ų„ØĒØŽØˇŲŠ Ø§Ų„Ø§ŲƒØĒØ´Ø§Ų Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"؊ØĢØ¨Ų‘ØĒ Ø§Ų„Ų‚ØąØ§ØĄØ§ØĒ Ø§Ų„Ø­ŲŠØŠ (Ø§Ų„Ų…ØŗØ§ŲØŠØŒ Ø§Ų„ØŗØąØšØŠØŒ Ø§Ų„Ø˛Ų…Ų† Ø­ØĒŲ‰ Ø§Ų„Ų…ØąŲƒØ¨ØŠ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ) ØšŲ„Ų‰ " +"Ø§Ų„ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØĒ؊ ØĒحدد Ø§Ų„ØŗŲŠØ§ØąØŠ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ. ؊ØĒØˇŲ„Ø¨ ØŖŲ† ŲŠŲƒŲˆŲ† IQ.Pilot Ų‡Ųˆ Ø§Ų„Ų…ØĒØ­ŲƒŲ… ؁؊ " +"Ø§Ų„ŲˆŲ‚ŲˆØ¯ ŲˆØ§Ų„ŲØąØ§Ų…Ų„." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "ŲŠØąØŦŲ‰ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø¨Ø´Ø¨ŲƒØŠ Wi‑Fi Ų„ØĨŲƒŲ…Ø§Ų„ Ø§Ų„Ø§Ų‚ØĒØąØ§Ų† Ø§Ų„ØŖŲˆŲ„ŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "ŲŠØąØŦŲ‰ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø¨Ø´Ø¨ŲƒØŠ Wi-Fi Ų„ØĨØĒŲ…Ø§Ų… Ø§Ų„Ø§Ų‚ØĒØąØ§Ų† Ø§Ų„ØŖŲˆŲ„ŲŠ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "ŲŠØąØŦŲ‰ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø¨Ø´Ø¨ŲƒØŠ Wi-Fi Ų„ØŦŲ„Ø¨ ؅؁ØĒØ§Ø­Ųƒ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "ŲŠØąØŦŲ‰ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø¨Ø´Ø¨ŲƒØŠ Wi-Fi Ų„Ų„ØĒØ­Ø¯ŲŠØĢ." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "؈ØŦŲ‘Ų‡ ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØŗØ§ØĻŲ‚ ØĨŲ„Ų‰ ØąŲ…Ø˛ QR Ų„Ų€ eSIM Ų…Ų† Ø§Ų„Ų…Ø´ØēŲ‘Ų„ (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "ØŖŲˆØ˛Ø§Ų† Ø§Ų„ØŗŲŠØ§ØŗØŠ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"ŲŠŲØˇŲØĻ Ø§Ų„ØŦŲ‡Ø§Ø˛ بؚد Ø¨Ų‚Ø§ØĻŲ‡ Ų‡Ø°Ų‡ Ø§Ų„Ų…Ø¯ØŠ ŲˆØ§Ų„Ų…Ø­ØąŲƒ Ų…ØĒŲˆŲ‚Ų.\n" +"(30 ØŗØ§ØšØŠ Ø§ŲØĒØąØ§ØļŲŠŲ‹Ø§)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "ØĒŲ†Ø¨Ø¤ŲŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "ØļØ¨Øˇ ØĒŲ†Ø¨Ø¤ŲŠ: ؊ØĒŲˆŲ‚Øš ØĒØēŲŠŲ‘ØąØ§ØĒ Ø§Ų„ØĒØŗØ§ØąØš ؈؊ØŦØšŲ„Ų‡Ø§ ØŖŲƒØĢØą ØŗŲ„Ø§ØŗØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "ØĒŲ†Ø˛ŲŠŲ„ Ų…ØŗØ¨Ų‚ + ØĒØĢØ¨ŲŠØĒ Ų…ØŗØ¨Ų‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„ Ø§Ų„Ų…ØŗØ¨Ų‚ ŲŲ‚Øˇ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "ØŦØ§ØąŲ ØĒØ­ØļŲŠØą Ų…ØąØ¨ØšØ§ØĒ Ø§Ų„ØŽØąŲŠØˇØŠ..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "Ų…Ų†Øš ØąŲØš Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ŲƒØ¨ŲŠØąØŠ ØšŲ†Ø¯ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø¨Ø´Ø¨ŲƒØŠ Wi‑Fi Ų…Ø­Ø¯ŲˆØ¯ØŠ Ø§Ų„ØĒØšØąŲØŠ" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "Ų…Ų†Øš ØąŲØš Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ŲƒØ¨ŲŠØąØŠ ØšŲ†Ø¯ Ø§Ų„Ø§ØĒØĩØ§Ų„ Ø§Ų„ØŽŲ„ŲˆŲŠ Ų…Ø­Ø¯ŲˆØ¯ Ø§Ų„ØĒØšØąŲØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"ØšØ§ŲŠŲ† ŲƒØ§Ų…ŲŠØąØ§ Ų…ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„ØŗØ§ØĻŲ‚ Ų„Ų„ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ† Ų…ØąØ§Ų‚Ø¨ØŠ Ø§Ų„ØŗØ§ØĻŲ‚ ØĒØĒŲ… Ø¨ØąØ¤ŲŠØŠ ØŦŲŠØ¯ØŠ. (؊ØŦب ØŖŲ†" +" ØĒŲƒŲˆŲ† Ø§Ų„Ų…ØąŲƒØ¨ØŠ Ų…ØĒŲˆŲ‚ŲØŠ)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "ØĨØŦØąØ§ØĄØ§ØĒ Ø§Ų„Ų…Ų„Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "؊ØŦŲ„Ø¨ Ų…ØąØ¨ØšØ§ØĒ Mapbox Ø§Ų„Ø­ŲŠØŠ Ų„ØŽØąŲŠØˇØŠ Ø§Ų„Ø´Ø§Ø´ØŠ ŲƒŲ„Ų…Ø§ ØĒŲˆŲØą ØĨŲ†ØĒØąŲ†ØĒ Ų„Ų„ØŦŲ‡Ø§Ø˛." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "Ų…ØŗØ­ Ø°Ø§ŲƒØąØŠ Ø§Ų„Ų†Ų…Ø§Ø°ØŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"ØļØš Ø§Ų„ØŦŲ‡Ø§Ø˛ ؁؊ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ø¯Ø§ØĻŲ…ØŒ ØŖŲˆ ØŖØˇŲØĻ Ø§Ų„ØŗŲŠØ§ØąØŠØŒ Ų‚Ø¨Ų„ ØĒØēŲŠŲŠØą ØˇØąŲŠŲ‚ØŠ ØĒØĢØ¨ŲŠØĒ " +"Ø§Ų„ØĒØ­Ø¯ŲŠØĢاØĒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"ØļØš Ø§Ų„ØŦŲ‡Ø§Ø˛ ؁؊ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ø¯Ø§ØĻŲ…ØŒ ØŖŲˆ ØŖØˇŲØĻ Ø§Ų„ØŗŲŠØ§ØąØŠØŒ Ų‚Ø¨Ų„ ØĒØēŲŠŲŠØą Ų‡Ø°Ų‡ Ø§Ų„ØŽŲŠØ§ØąØ§ØĒ." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "ØŽØˇØŖ ؁؊ ØąŲ…Ø˛ QR" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "ØĒŲ… Ų‚Ø¨ŲˆŲ„ ØąŲ…Ø˛ QR" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "ØŦØ§Ų‡Ø˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "ØĨؚاد؊ Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "ØĒØ­Ø¯ŲŠØĢ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "ØĨØ˛Ø§Ų„ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "ØŦØ§ØąŲ Ø§Ų„ØĨØ˛Ø§Ų„ØŠ..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "ØĨؚاد؊ ØļØ¨Øˇ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "Ų…ØąØ§ØŦؚ؊" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "ØšŲ„Ø¨ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "ØŖØšØ¯ ØĒØąŲƒŲŠØ¨ Ø§Ų„ØŦŲ‡Ø§Ø˛ ØĨذا ŲƒØ§Ų† ؈ØŦŲ‡Ųƒ Ų…Ø­ØŦŲˆØ¨Ų‹Ø§ ØŖŲˆ ŲƒØ§Ų† ØĒØĒبؚ Ø§Ų„ØŗØ§ØĻŲ‚ ŲŠŲˆØ§ØŦŲ‡ ØĩØšŲˆØ¨ØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "ŲŠŲ…ŲƒŲ† Ø§Ų„ŲˆØĩŲˆŲ„ ØĨŲ„ŲŠŲ‡ ŲŲ‚Øˇ ŲˆØ§Ų„ØŗŲŠØ§ØąØŠ Ų…ØˇŲØŖØŠ ØŖŲˆ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ø¯Ø§ØĻŲ… Ų…ŲØšŲ‘Ų„." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„ ŲˆØ§Ų„ØĒØ­Ø¯ŲŠØĢ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"Ø§ØŗØĒŲ‚Ø¨Ø§Ų„ ØĒŲ†Ø¨ŲŠŲ‡Ø§ØĒ Ų„Ų„ØĒ؈ØŦŲŠŲ‡ Ų„Ų„ØšŲˆØ¯ØŠ ØĨŲ„Ų‰ Ø§Ų„Ų…ØŗØ§Øą ØšŲ†Ø¯ Ø§Ų†Ø­ØąØ§Ų Ø§Ų„Ų…ØąŲƒØ¨ØŠ ŲŲˆŲ‚ ØŽØˇ Ø§Ų„Ų…ØŗØ§Øą " +"Ø§Ų„Ų…ŲŲƒØĒØ´Ų Ø¨Ø¯ŲˆŲ† ØĨØ´Ø§ØąØŠ Ø§Ų†ØšØˇØ§Ų Ų…ŲØšŲ‘Ų„ØŠ ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ŲŲˆŲ‚ 31 Ų…ŲŠŲ„/Øŗ (50 ŲƒŲ…/Øŗ)." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "ØĒØŗØŦŲŠŲ„ ŲˆØąŲØš ŲŲŠØ¯ŲŠŲˆ ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØŗØ§ØĻŲ‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "ØĒØŗØŦŲŠŲ„ ŲˆØąŲØš Øĩ؈ØĒ Ø§Ų„Ų…ŲŠŲƒØąŲˆŲŲˆŲ†" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"ØĒØŗØŦŲŠŲ„ ؈ØĒØŽØ˛ŲŠŲ† Øĩ؈ØĒ Ø§Ų„Ų…ŲŠŲƒØąŲˆŲŲˆŲ† ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ. ØŗŲŠŲØ¯ØąØŦ Ø§Ų„Øĩ؈ØĒ ؁؊ ŲŲŠØ¯ŲŠŲˆ Ø§Ų„ŲƒØ§Ų…ŲŠØąØ§ " +"Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ ؁؊ Konn3kt." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"ØĒØŗØŦŲŠŲ„ ŲˆØąŲØš Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ŲˆØ§Ų„ŲŲŠØ¯ŲŠŲˆ. ØĒØšØˇŲŠŲ„ Ų‡Ø°Ø§ ŲŠŲˆŲ‚Ų ŲƒŲ„ Ø§Ų„ØĒØŗØŦŲŠŲ„! Ų„Ø§ ØŗØŦŲ„Ø§ØĒ ŲˆŲ„Ø§ " +"ŲŲŠØ¯ŲŠŲˆ ŲˆŲ„Ø§ Øĩ؈ØĒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "ØĨؚاد؊ Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "ØĨؚاد؊ ØĒŲ†Ø˛ŲŠŲ„ Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ø­Ø§Ų„ŲŠ" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "ØĒØ­Ø¯ŲŠØĢ Ø§Ų„Ų…Ų„ŲØ§ØĒ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "Ų„ŲˆØ§ØĻØ­" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "Ų…ØŗØĒØąØŽŲ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "ØĨؚاد؊ ØĒØ­Ų…ŲŠŲ„ Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ų†Ų…Ø§Ø°ØŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "Ø§Ų„Ø¨Ų‚Ø§ØĄ Ų†Ø´ØˇŲ‹Ø§: Ø§Ų„ŲƒØ¨Ø­ Ų„Ø§ ŲŠŲ‚Ø§ØˇØš Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ØŖØ¨Ø¯Ų‹Ø§." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "؈ØĩŲˆŲ„ ØšŲ† Ø¨ŲØšØ¯" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "ØĨØ˛Ø§Ų„ØŠ" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "ØĨØ˛Ø§Ų„ØŠ pSIM Ų…Ų† Comma" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "ØĨؚاد؊ ØĒØŗŲ…ŲŠØŠ" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "ØĨؚاد؊ ØĒØŗŲ…ŲŠØŠ Ø§Ų„Ų…Ų„Ų" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "Ø§Ų†ØĒŲ‡ØĒ Ų…Ų‡Ų„ØŠ Ø§Ų„ØˇŲ„Ø¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "؊ØĒØˇŲ„Ø¨ ØĒŲØšŲŠŲ„ Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų…Ų† IQ.Pilot (ØŖŲ„ŲØ§)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "ØĨؚاد؊ ØļØ¨Øˇ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "ØĨؚاد؊ ØļØ¨Øˇ Ø§Ų„Ų…ØšØ§ŲŠØąØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "Ø§ØŗØĒؚاد؊ Ø§Ų„ØĨؚداداØĒ Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "Ų…ØąØ§ØŦؚ؊ Ø¯Ų„ŲŠŲ„ Ø§Ų„ØĒØ¯ØąŲŠØ¨" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "Ų…ØąØ§ØŦؚ؊ Ų‚ŲˆØ§ØšØ¯ ŲˆŲ…ŲŠØ˛Ø§ØĒ ŲˆØ­Ø¯ŲˆØ¯ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "Ø§ØŗŲ… Ø§Ų„ØˇØąŲŠŲ‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "ØšØąØļ Ø§ØŗŲ… Ø§Ų„ØˇØąŲŠŲ‚" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "Ø§Ų„ØąØ­Ų„Ø§ØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "ØĨØĩØ¯Ø§Øą Ų…Ø­ØąŲƒ ØĒØ­Ø¯ŲŠØ¯ Ø§Ų„Ų…ØŗØ§ØąØ§ØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "ØĒØ´ØēŲŠŲ„ ŲˆØ§ØŦŲ‡ØŠ comma 4 Ø§Ų„Ų…Ø¯Ų…ØŦØŠ (mici) ØšŲ„Ų‰ Ų‡Ø°Ø§ Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "ا؎ØĒŲŠØ§Øą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC ØĒØŖŲƒŲŠØ¯ ØĒŲ„Ų‚Ø§ØĻ؊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC ØĒØŖŲƒŲŠØ¯ Ø§Ų„ØŖØšŲ„Ų‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC ØĒØŖŲƒŲŠØ¯ Ø§Ų„ØŖØ¯Ų†Ų‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC احØĒŲŠØ§ØˇŲŠ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC ØĒؚبØĻØŠ ØšØ¨Øą Ø§Ų„ØĨŲ†ØĒØąŲ†ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC ØĒØŦØ§ŲˆØ˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC Ø§Ų„ØŗŲŠØ§ØŗØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "Ų…ŲØ§ØĒŲŠØ­ SSH" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "Ų…ŲØ§ØĒŲŠØ­ SSH" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ Ø§Ų„ØŖØĩŲ„ŲŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "Ų…ØŗØ­" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "Ų…ØŗØ­ QR" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "Ø§Ų…ØŗØ­ ØąŲ…Ø˛ QR ØŖŲˆ ØŖØ¯ØŽŲ„ ØąŲ…Ø˛ Ø§Ų„ØĒŲØšŲŠŲ„" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "ØŦØ§ØąŲ Ų…ØŗØ­ Ø´Ø¨ŲƒØ§ØĒ Wi‑Fi..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "بحØĢ" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "ابحØĢ ØšŲ† ØšŲ†ŲˆØ§Ų† ØŖŲˆ Ų…ŲƒØ§Ų†" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "ابحØĢ ØšŲ† Ø§Ų„Ų…Ø§ØąŲƒØŠ ØŖŲˆ Ø§Ų„ØˇØąØ§Ø˛" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "ØŦØ§ØąŲ Ø§Ų„Ø¨Ø­ØĢ..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "ا؎ØĒŲŠØ§Øą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "ا؎ØĒØą ŲØąØšØ§Ų‹" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "ا؎ØĒØą Ų„ØēØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "ØļØ¨Øˇ ذاØĒ؊ Ų„ØĒØŖØŽŲŠØą Ø§Ų„ØĒ؈ØŦŲŠŲ‡" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "Ø§Ų„ØąŲ‚Ų… Ø§Ų„ØĒØŗŲ„ØŗŲ„ŲŠ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "ØĒØšŲŠŲŠŲ† Ø§Ų„Ų…Ų†Ø˛Ų„" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "ØĒØšŲŠŲŠŲ† Ø§Ų„ŲˆØ­Ø¯Ø§ØĒ Ø­ØŗØ¨ Ø§Ų„Ų…ŲˆŲ‚Øš" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "ØĒØšŲŠŲŠŲ† Ø§Ų„ØšŲ…Ų„" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "ØĒØšŲŠŲŠŲ† ØšŲ†ŲˆØ§Ų† Ø§Ų„Ų…Ų†Ø˛Ų„" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"ØĒØšŲŠŲŠŲ† Ø§Ų„ŲˆØ­Ø¯Ø§ØĒ Ø­ØŗØ¨ Ų…ŲˆŲ‚Øš Ø§Ų„ØŦŲ‡Ø§Ø˛. ØĒØĒØ­ŲˆŲ„ Ø§Ų„ØŗØąØšØ§ØĒ ØĨŲ„Ų‰ ŲƒŲ…/Øŗ ؁؊ ŲƒŲ„ Ų…ŲƒØ§Ų† ؚدا " +"Ø§Ų„ŲˆŲ„Ø§ŲŠØ§ØĒ Ø§Ų„Ų…ØĒحد؊ ŲˆØ§Ų„Ų…Ų…Ų„ŲƒØŠ Ø§Ų„Ų…ØĒحد؊ ŲˆŲ„ŲŠØ¨ŲŠØąŲŠØ§ØŒ ŲˆŲŠŲØšØ§Ø¯ ŲØ­ØĩŲ‡Ø§ ØšŲ†Ø¯ ØšØ¨ŲˆØą Ø§Ų„Ø­Ø¯ŲˆØ¯." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "ØĒØšŲŠŲŠŲ† ØšŲ†ŲˆØ§Ų† Ø§Ų„ØšŲ…Ų„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"ŲŠØ­Ø¯Ø¯ ØšØĒب؊ Ø§Ų„ØŗØąØšØŠ Ø§Ų„ØĒ؊ ØĒØŗØĒØŽØ¯Ų…Ų‡Ø§ ØąØēباØĒ Ø§Ų„Ø§Ų†ØšØˇØ§Ų. ØĒØ­ØĒ Ų‡Ø°Ų‡ Ø§Ų„Ų‚ŲŠŲ…ØŠ ŲŠŲ…ŲƒŲ† Ų„ØąØēباØĒ " +"Ø§Ų„Ø§Ų†ØšØˇØ§Ų Ø§Ų„ØĒØŽØˇŲŠØˇ Ų„ØŖŲ‚ØąØ¨ Ų…ØŗØ§Øą Ø§Ų†ØšØˇØ§Ų Ų‚Ø§Ø¨Ų„ Ų„Ų„Ų‚ŲŠØ§Ø¯ØŠ. Ø§Ų„Ų‚ŲŠŲ…ØŠ Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ 19 " +"Ų…ŲŠŲ„Ų‹Ø§/Øŗ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"ŲŠØ­Ø¯Ø¯ Ø§Ų„Ø­Ø§Ų„ØŠ Ø§Ų„ØĒ؊ ŲŠØŗØĒŲ‚Øą ØšŲ„ŲŠŲ‡Ø§ Ø§Ų„ØŦŲ‡Ø§Ø˛ بؚد Ø§Ų„ØĨŲ‚Ų„Ø§Øš ØŖŲˆ Ø§Ų„Ø§ØŗØĒŲŠŲ‚Ø§Ø¸ Ų…Ų† Ø§Ų„ØŗŲƒŲˆŲ†." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "Ø§Ų„ØĨؚداداØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"ŲŠØšØąØļ Ø§ØŗŲ… Ø§Ų„ØˇØąŲŠŲ‚ Ø§Ų„Ø­Ø§Ų„ŲŠ ŲŲˆŲ‚ ØšØąØļ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ.
    ؊ØĒØˇŲ„Ø¨ ØĒØĢØ¨ŲŠØĒ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØŽØąØ§ØĻØˇ Ø¯ŲˆŲ† " +"اØĒØĩØ§Ų„ Ų„Ų…Ų†ØˇŲ‚ØĒ؃." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "ØĒ؈ØŦŲŠŲ‡ ØŗŲ„Øŗ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "ØĒØŖØŦŲŠŲ„ Ø§Ų„ØĒØ­Ø¯ŲŠØĢ" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "Ø§Ų„Ø¨ØąŲ…ØŦŲŠØ§ØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "Ø§Ų„ØŗØąØšØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "حد Ø§Ų„ØŗØąØšØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "Ø§Ų„ØĒØ­ŲƒŲ… ؁؊ حد Ø§Ų„ØŗØąØšØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "Ų‚ŲŠØ§ØŗŲŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"؊؈ØĩŲ‰ Ø¨Ø§Ų„ŲˆØļØš Ø§Ų„Ų‚ŲŠØ§ØŗŲŠ. ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ØšØ¯ŲˆØ§Ų†ŲŠØŒ ØŗŲŠØĒبؚ IQ.Pilot Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ ØšŲ† " +"Ų‚ØąØ¨ ŲˆØŗŲŠŲƒŲˆŲ† ØŖŲƒØĢØą شد؊ ؁؊ Ø§Ų„ŲˆŲ‚ŲˆØ¯ ŲˆØ§Ų„ŲØąØ§Ų…Ų„. ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„Ų…ØŗØĒØąØŽŲŠ ØŗŲŠØ¨Ų‚Ų‰ Ø¨ØšŲŠØ¯Ø§Ų‹ ØŖŲƒØĢØą " +"ØšŲ† Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ. ؁؊ Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ Ø§Ų„Ų…Ø¯ØšŲˆŲ…ØŠØŒ ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØĒŲ†Ų‚Ų„ Ø¨ŲŠŲ† Ų‡Ø°Ų‡ Ø§Ų„Ø´ØŽØĩŲŠØ§ØĒ " +"Ø¨Ø˛Øą Ų…ØŗØ§ŲØŠ Ø§Ų„Ų…Ų‚ŲˆØ¯." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "؈ØļØš Ø§Ų„Ø§ØŗØĒؚداد" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"Ø§Ų„Ø§ØŗØĒؚداد: Ø§Ų„ŲƒØ¨Ø­ ŲŠŲˆŲ‚Ų Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ Ų…Ø¤Ų‚ØĒŲ‹Ø§Ø› ؈ØĒØšŲˆØ¯ Ø¨Ų…ØŦØąØ¯ ØąŲØš Ų‚Ø¯Ų…Ųƒ ØšŲ† " +"Ø§Ų„Ø¯ŲˆØ§ØŗØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "Ø¨Ø¯ØĄ Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "Ø´ØēŲ‘Ų„ Ø§Ų„Ų…ØąŲƒØ¨ØŠ Ų„Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† ØĒŲˆØ§ŲŲ‚ ØŗŲ„ŲˆŲƒ Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "Ø§Ų„ŲˆŲ„Ø§ŲŠØŠ" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "Ø§Ų„ØĨØ­ØĩاØĻŲŠØ§ØĒ" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "Ø§Ų„Ø­Ø§Ų„ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Ø§Ų„Ø¨Ų‚Ø§ØĄ Ų…ŲØšŲ‘Ų„Ų‹Ø§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "Ø§Ų„ØĒ؈ØŦŲŠŲ‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "ØŗŲ„ŲˆŲƒ Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Ų‚ŲˆØŗ ØŦŲ‡Ø¯ Ø§Ų„ØĒ؈ØŦŲŠŲ‡" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ Ø§Ų„ØŖØĩŲ„ŲŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Ų†ØŗØŽØŠ Ø§Ų„ØĒŲˆŲ‚Ų ŲˆØ§Ų„Ø§Ų†ØˇŲ„Ø§Ų‚ Ų„ØŗŲŠØ§ØąØ§ØĒ Subaru Global ذاØĒ Ø§Ų„ŲØąØ§Ų…Ų„ Ø§Ų„ŲŠØ¯ŲˆŲŠØŠ. اØĒØąŲƒŲ‡ " +"Ų…ØšØˇŲ‘Ų„Ų‹Ø§ ؁؊ Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ ذاØĒ ŲØąØ§Ų…Ų„ Ø§Ų„ØąŲƒŲ† Ø§Ų„ŲƒŲ‡ØąØ¨Ø§ØĻŲŠØŠ. Ø´ŲƒØąŲ‹Ø§ Ų„Ų€ martinl ØšŲ„Ų‰ Ų‡Ø°Ø§ " +"Ø§Ų„ØĒŲ†ŲŲŠØ°!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "Ø§Ų„ØŽØąØ§ØĻØˇ Ø§Ų„Ų…ØŽØ˛Ų†ØŠ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "بØĢ Ų…Ų† Ø§Ų„ØŗØ­Ø§Ø¨ØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "ØĒØ­ŲˆŲŠŲ„ Ø§Ų„ØŦŲ‡Ø§Ø˛ ØĨŲ„Ų‰ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ø¯Ø§ØĻŲ…ØŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "ØĒØ­ŲˆŲŠŲ„ Ø§Ų„ØŦŲ‡Ø§Ø˛ ØĨŲ„Ų‰ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų Ø§Ų„Ų…ŲØąŲˆØļ؟" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "Ø§Ų„Ų†Ø¸Ø§Ų…" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "Ø§Ų„Ų†Ø¸Ø§Ų… Ų„Ø§ ŲŠØŗØĒØŦŲŠØ¨" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "ØĒŲˆŲ„Ų‘ŲŽ Ø§Ų„ØŗŲŠØˇØąØŠ ŲŲˆØąØ§Ų‹" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "Ø§Ų„Ø­ØąØ§ØąØŠ" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "Ø­ØąØ§ØąØŠ Ų…ØąØĒŲØšØŠ" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "Ø§Ų„Ø­ØąØ§ØąØŠ ØŦŲŠØ¯ØŠ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "اØļØēØˇ ØšŲ„Ų‰ \"Add Device\" ŲˆØ§Ų…ØŗØ­ ØąŲ…Ø˛ QR ØšŲ„Ų‰ Ø§Ų„ŲŠŲ…ŲŠŲ†" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "Ø§Ų„ŲØąØš Ø§Ų„Ų…ØŗØĒŲ‡Ø¯Ų" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ø§Ų„ØąØ¨Øˇ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "ØĒØēŲŠŲ‘Øą Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų…Ø­Ø¯Ø¯. Ų†Ų†ØĩØ­ بØĨؚاد؊ ØļØ¨Øˇ Ø§Ų„Ų…ØšØ§ŲŠØąØŠ. Ų‡Ų„ ØĒØąŲŠØ¯ ŲØšŲ„ Ø°Ų„Ųƒ Ø§Ų„ØĸŲ†ØŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§Ų„ØĒØąØ§ØŦØš بؚد ØĒŲ†ŲŲŠØ° Ų‡Ø°Ø§ — ŲØąØĩØŠ ØŖØŽŲŠØąØŠ Ų„Ų„ØšØ¯ŲˆŲ„." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "؊ØĒØˇŲ„Ø¨ Ų‡Ø°Ø§ ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ Ų„ŲŠŲØˇØ¨ŲŽŲ‘Ų‚. ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„ Ø§Ų„ØĸŲ†ØŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "Ų‡Ø°Ų‡ Ø§Ų„Ų…Ų†ØĩØŠ Ų…Ų‚ØĩŲˆØąØŠ ØšŲ„Ų‰ ؈ØļØš ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "ØĒØ¯ØšŲ… Ų‡Ø°Ų‡ Ø§Ų„Ų…Ų†ØĩØŠ Ų…ØŦŲ…ŲˆØšØŠ Ų…Ø­Ø¯ŲˆØ¯ØŠ Ų…Ų† ØŽŲŠØ§ØąØ§ØĒ ØŗŲ„ŲˆŲƒ Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "ØĒØ¯ØšŲ… Ų‡Ø°Ų‡ Ø§Ų„Ų…Ų†ØĩØŠ Ø§Ų„ØĨؚداد Ø§Ų„ŲƒØ§Ų…Ų„ Ų„ØŗŲ„ŲˆŲƒ Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"ØŗŲŠØ¤Ø¯ŲŠ Ų‡Ø°Ø§ ØĨŲ„Ų‰ Ø­Ø°Ų ŲƒŲ„ Ø§Ų„ØŽØąØ§ØĻØˇ Ø§Ų„Ų…Ų†Ø˛ŲŽŲ‘Ų„ØŠ\n" +"\n" +"Ų‡Ų„ ØĒØąŲŠØ¯ Ø¨Ø§Ų„ØĒØŖŲƒŲŠØ¯ Ø­Ø°Ų ØŦŲ…ŲŠØš Ø§Ų„ØŽØąØ§ØĻØˇØŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"ØŗŲŠØ¤Ø¯ŲŠ Ų‡Ø°Ø§ ØĨŲ„Ų‰ Ø­Ø°Ų ŲƒŲ„ Ø§Ų„Ų†Ų…Ø§Ø°ØŦ Ø§Ų„Ų…Ų†Ø˛ŲŽŲ‘Ų„ØŠ Ų…Ų† Ø§Ų„Ø°Ø§ŲƒØąØŠ ؚدا Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų†Ø´Øˇ Ø­Ø§Ų„ŲŠŲ‹Ø§. " +"Ų‡Ų„ ØŖŲ†ØĒ Ų…ØĒØŖŲƒØ¯ØŸ" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "ØŗŲŠØ¤Ø¯ŲŠ Ų‡Ø°Ø§ ØĨŲ„Ų‰ Ų…ØŗØ­ ؅؄؁ pSIM Ų…Ų† Comma Ų†Ų‡Ø§ØĻŲŠŲ‹Ø§ Ų…Ų† Ø§Ų„Ø´ØąŲŠØ­ØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "ØŗŲŠØ¨Ø¯ØŖ Ų‡Ø°Ø§ ØšŲ…Ų„ŲŠØŠ Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„ ŲˆŲ‚Ø¯ ŲŠØŗØĒØēØąŲ‚ ØĨØĒŲ…Ø§Ų…Ų‡Ø§ بؚØļ Ø§Ų„ŲˆŲ‚ØĒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "Ø§Ų„ŲˆŲ‚ØĒ" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "Ų…ŲØ§ØĒŲŠØ­ Ø§Ų„ØĒØ¨Ø¯ŲŠŲ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "Ø§Ų„ØĨØŦŲ…Ø§Ų„ŲŠ:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"ŲŠØąØŗŲ… Ų‚ŲˆØŗŲ‹Ø§ ŲŲˆŲ‚ ØšØąØļ Ø§Ų„ØˇØąŲŠŲ‚ ؊؈ØļØ­ Ų…Ų‚Ø¯Ø§Øą Ø§Ų„ØĒ؈ØŦŲŠŲ‡ Ø§Ų„Ø°ŲŠ ŲŠØˇØ¨Ų‘Ų‚Ų‡ IQ.Pilot ØŖØĢŲ†Ø§ØĄ ØšŲ…Ų„ " +"Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "Ø¯Ų„ŲŠŲ„ Ø§Ų„ØĒØ¯ØąŲŠØ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "ØĨØ´Ø§ØąØ§ØĒ Ø§Ų„Ø§Ų†ØšØˇØ§Ų" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"ŲŠŲˆŲ‚Ų ØĒŲ…Ø§Ų…Ų‹Ø§ ŲØ­Øĩ Ø§Ų„ØĒØ­Ø¯ŲŠØĢاØĒ ØšØ¨Øą Ø§Ų„Ø´Ø¨ŲƒØŠ.
    ØŖØšØ¯ Ø§Ų„ØĒØ´ØēŲŠŲ„ Ų„ŲŠØŗØąŲŠ Ų‡Ø°Ø§." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "Ø§ŲƒØĒب ØŗŲ†ØŠ ØĢŲ… ØˇØąØ§Ø˛Ų‹Ø§ — ØšŲ„Ų‰ ØŗØ¨ŲŠŲ„ Ø§Ų„Ų…ØĢØ§Ų„ØŒ 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "Ø§ŲƒØĒب Ų„Ų„Ø¨Ø­ØĢ" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "ØēŲŠØą Ų…ØĒاح" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "ØĨŲ„ØēØ§ØĄ Ø§Ų„ØĒØĢØ¨ŲŠØĒ" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "ØĒØ­Ø¯ŲŠØĢ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "ØĒØŽØ˛ŲŠŲ† USB" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "Ø§ØŗØĒØŽØ¯Ø§Ų…" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "ØĒØšØ°Ų‘Øą ØĒØ­Ų…ŲŠŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "ØēŲŠØą Ų…ØĒاح ØŖØĢŲ†Ø§ØĄ ؈ØŦŲˆØ¯ Ø§Ų„ØŗŲŠØ§ØąØŠ ؁؊ ؈ØļØš Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "ØēŲŠØą Ų…ØĒاح — Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų…Ų† IQ.Pilot ØēŲŠØą Ų†Ø´Øˇ ؁؊ Ų‡Ø°Ų‡ Ø§Ų„ØŗŲŠØ§ØąØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "ØēŲŠØą Ų…ŲƒØĒØ´Ų ؈ØēŲŠØą Ų…Ø­Ø¯Ø¯" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "ØĨŲ„ØēØ§ØĄ Ø§Ų„ØĒØĢØ¨ŲŠØĒ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "ØēŲŠØą Ų…ØšØąŲˆŲ" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "Ų…Ø´ØēŲ‘Ų„ ØēŲŠØą Ų…ØšØąŲˆŲ" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "ØĒØŽØ˛ŲŠŲ† ØēŲŠØą Ų…Ø­Ø¯ŲˆØ¯ Ų„Ų„ØąØ­Ų„Ø§ØĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "؈ØļØš ØĒØĢØ¨ŲŠØĒ Ø§Ų„ØĒØ­Ø¯ŲŠØĢاØĒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "؊ØĒŲ… ØĒŲ†Ø˛ŲŠŲ„ Ø§Ų„ØĒØ­Ø¯ŲŠØĢاØĒ ŲŲ‚Øˇ ØšŲ†Ø¯Ų…Ø§ ØĒŲƒŲˆŲ† Ø§Ų„ØŗŲŠØ§ØąØŠ Ų…ØĒŲˆŲ‚ŲØŠ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "Ø§Ų„ØąŲØš ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"Ø§ØąŲØš Ø¨ŲŠØ§Ų†Ø§ØĒ Ų…Ų† ŲƒØ§Ų…ŲŠØąØ§ Ų…ŲˆØ§ØŦŲ‡ØŠ Ø§Ų„ØŗØ§ØĻŲ‚ ŲˆØŗØ§ØšØ¯ ؁؊ ØĒØ­ØŗŲŠŲ† ØŽŲˆØ§ØąØ˛Ų…ŲŠØŠ Ų…ØąØ§Ų‚Ø¨ØŠ Ø§Ų„ØŗØ§ØĻŲ‚." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "ØĒŲ… Ø§Ų„ØąŲØš" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "ØŦØ§ØąŲ Ø§Ų„ØąŲØš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"ŲŠØŗØĒØŽØ¯Ų… HCA Status 7 Ø¨Ø¯Ų„Ų‹Ø§ Ų…Ų† Status 5 Ų„Ų„ØĒØ­ŲƒŲ… ؁؊ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ؁؊ Ų…ØąŲƒØ¨Ø§ØĒ Ų…Ų†ØĩØŠ PQ. " +"Ų‚Ø¯ ŲŠØŗØ§ØšØ¯ Ø°Ų„Ųƒ ؁؊ Ø§Ų„ØĒŲˆØ§ŲŲ‚ Ų…Øš بؚØļ ØˇØąØ§Ø˛Ø§ØĒ Volkswagen Ø§Ų„ØŖŲ‚Ø¯Ų…." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ų†Ø¸Ø§Ų… Ø§Ų„Ų…ØĒØąŲŠ" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"Ø§ØŗØĒØŽØ¯Ø§Ų… ØąŲ…Ø˛ Ø§Ų„ØĒŲØšŲŠŲ„:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"Ø§ØŗØĒØŽØ¯Ų… Ų†Ø¸Ø§Ų… IQ.Pilot Ų„Ų„ØĒØ­ŲƒŲ… Ø§Ų„Ø°ŲƒŲŠ Ø¨Ø§Ų„ØŗØąØšØŠ ŲˆØ§Ų„Ų…ØŗØ§ØšØ¯ØŠ ØšŲ„Ų‰ Ø§Ų„Ø¨Ų‚Ø§ØĄ Ø¯Ø§ØŽŲ„ Ø§Ų„Ų…ØŗØ§Øą. " +"؊ØĒØˇŲ„Ø¨ Ø§ØŗØĒØŽØ¯Ø§Ų… Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ Ø§Ų†ØĒØ¨Ø§Ų‡Ųƒ Ø§Ų„ŲƒØ§Ų…Ų„ ؁؊ ØŦŲ…ŲŠØš Ø§Ų„ØŖŲˆŲ‚Ø§ØĒ." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "Ø§Ų„Ų…ØąŲƒØ¨ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "ØšØąØļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (Ø§Ų„Ų…Ø˛ØŦ Ø§Ų„Ø§ŲØĒØąØ§Øļ؊ Ų„ØšØ˛Ų… Ø§Ų„Ø¯ŲˆØąØ§Ų†)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "Ø§Ų„Ų…ØąŲƒØ¨ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"Ų„Ų… ؊ØĒŲ… بؚد Ø§ŲƒØĒØ´Ø§Ų Ų‚Ø¯ØąØŠ Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ ؁؊ Ø§Ų„Ų…ØąŲƒØ¨ØŠ. Ø´ØēŲ‘Ų„ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų…ØąØŠ ŲˆØ§Ø­Ø¯ØŠ " +"Ų„Ø§ŲƒØĒØ´Ø§Ų Ø§Ų„Ø¯ØšŲ…." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Ų…Ø´ØēŲ‘Ų„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "ØšØąØļ ØŗØŦŲ„ ØŖØŽØˇØ§ØĄ ØŖØšØˇØ§Ų„ IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "ØŖŲˆØ˛Ø§Ų† Ø§Ų„ØąØ¤ŲŠØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "Ø§Ų„Ų…Ø¸Ų‡Øą" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "؁؊ Ø§Ų†ØĒØ¸Ø§Øą ØĨØ´Ø§ØąØŠ GPS..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"؁؊ Ø§Ų†ØĒØ¸Ø§Øą ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØŗØ§ØĻŲ‚. Ø§ØŗØĒØŽØ¯Ų… ØąŲ…Ø˛ QR Ų„Ų€ eSIM Ų…Ų† Ø§Ų„Ų…Ø´ØēŲ‘Ų„ ØŖŲˆ ØŖØ¯ØŽŲ„ ØąŲ…Ø˛ LPA " +"ŲŠØ¯ŲˆŲŠŲ‹Ø§." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "Ø¨Ø§Ų†ØĒØ¸Ø§Øą Ø§Ų„Ø¨Ø¯ØĄ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "ØĒØ­Ø°ŲŠØą" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"ØĒØ­Ø°ŲŠØą: ŲŠŲ…Ų†Ø­ Ų‡Ø°Ø§ ؈ØĩŲˆŲ„ SSH Ų„ØŦŲ…ŲŠØš Ø§Ų„Ų…ŲØ§ØĒŲŠØ­ Ø§Ų„ØšØ§Ų…ØŠ ؁؊ ØĨؚداداØĒ GitHub Ø§Ų„ØŽØ§ØĩØŠ Ø¨Ųƒ. " +"Ų„Ø§ ØĒŲØ¯ØŽŲ„ ØŖØ¨Ø¯Ų‹Ø§ Ø§ØŗŲ… Ų…ØŗØĒØŽØ¯Ų… GitHub ØēŲŠØą Ø§ØŗŲ…Ųƒ. Ų„Ų† ŲŠØˇŲ„Ø¨ Ų…Ų†Ųƒ Ų…ŲˆØ¸Ų ؁؊ IQ.Pilot " +"ØŖØ¨Ø¯Ų‹Ø§ ØĨØļØ§ŲØŠ Ø§ØŗŲ… Ų…ØŗØĒØŽØ¯Ų… GitHub Ø§Ų„ØŽØ§Øĩ Ø¨Ų‡." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "ØĒØ­Ø°ŲŠØą: Ų‚Ø¯ ؊ØĒذبذب Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ؁؊ Ø§Ų„Ų…Ų†ØšØˇŲØ§ØĒ ØĒØ­ØĒ {}؛ ØŖŲˆŲ‚Ų Ų‡Ø°Ø§ ØĨذا Ø´ØšØąØĒ Ø¨Ų‡." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "Ų…ØąØ­Ø¨Ø§Ų‹ Ø¨Ųƒ ؁؊ IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "ØšŲ†Ø¯ Ø§Ų„ØĒŲ…ŲƒŲŠŲ†ØŒ ØŗŲŠØ¤Ø¯ŲŠ Ø§Ų„ØļØēØˇ ØšŲ„Ų‰ Ø¯ŲˆØ§ØŗØŠ Ø§Ų„ŲˆŲ‚ŲˆØ¯ ØĨŲ„Ų‰ ؁ØĩŲ„ IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Ø´Ø¨ŲƒØŠ Wi‑Fi Ų…Ø­Ø¯ŲˆØ¯ØŠ Ø§Ų„ØĒØšØąŲØŠ" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "Ø§Ų„ØšŲ…Ų„" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØŽØ§ØˇØĻØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "Ų†ØšŲ…" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "Ų†ØšŲ…ØŒ Ø§Ø­Ø°Ų ØŦŲ…ŲŠØš Ø§Ų„ØŽØąØ§ØĻØˇ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "؊ØŦب Ų‚Ø¨ŲˆŲ„ Ø´ØąŲˆØˇ Ø§Ų„ØŽØ¯Ų…ØŠ Ų„ØĒØĒŲ…ŲƒŲ† Ų…Ų† Ø§ØŗØĒØŽØ¯Ø§Ų… IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"؊ØŦب Ų‚Ø¨ŲˆŲ„ Ø´ØąŲˆØˇ Ø§Ų„ØŽØ¯Ų…ØŠ Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… IQ.Pilot. Ø§Ų‚ØąØŖ ØŖØ­Ø¯ØĢ Ø§Ų„Ø´ØąŲˆØˇ Ų‚Ø¨Ų„ Ø§Ų„Ų…ØĒابؚ؊ ØšŲ„Ų‰ " +"https://iqlvbs.com/tos." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"بؚد Ø°Ų„Ųƒ ؊ØŦب Ø§ØŗØĒØŽØ¯Ø§Ų… ؅؄؁ eSIM Ø§Ų„ØŽØ§Øĩ Ø¨Ųƒ. Ų„Ų† ØĒØĒŲ…ŲƒŲ† Ų…Ų† Ø§ØŗØĒØŽØ¯Ø§Ų… Comma Prime Ų…ØąØŠ " +"ØŖØŽØąŲ‰ Ų…Ø§ Ų„Ų… ØĒØ´ØĒØąŲ Ø´ØąŲŠØ­ØŠ ØŦØ¯ŲŠØ¯ØŠ Ų…Ų† comma." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "ØĒŲØšŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "Ų†Ø´Øˇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų†Ø´Øˇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "ØĨØļØ§ŲØŠ ؅؄؁ eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "ØĨØļØ§ŲØŠ ؅؄؁" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "ØšØ¯ŲˆØ§Ų†ŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "ØĨؚداداØĒ APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "ØĒŲ„Ų‚Ø§ØĻ؊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "ØĒŲ„Ų‚Ø§ØĻ؊ Ø¯Ø§ŲƒŲ†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"Ø§Ų„ØĒØ­Ø¯ŲŠØĢاØĒ\n" +"Ø§Ų„ØĒŲ„Ų‚Ø§ØĻŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "ØąØŦŲˆØš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "Ø§Ų„ŲØąØš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "ØĒØŖØŽŲŠØą Ø§Ų„ØŽŲŲˆØĒ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "ØŦØ§ØąŲ Ø­ØŗØ§Ø¨ Ø§Ų„ØŖŲ…ŲŠØ§Ų„..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "Ø¨Ø¯ØĄ ØĒØ´ØēŲŠŲ„ Ø§Ų„ŲƒØ§Ų…ŲŠØąØ§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "ØŽŲ„ŲˆŲŠ Ų…Ø­Ø¯ŲˆØ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"ØĒØēŲŠŲŠØą\n" +"Ø§Ų„Ų„ØēØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "Ø§Ų„Ø¨Ø­ØĢ ØšŲ† ØĒØ­Ø¯ŲŠØĢ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "ØŦØ§ØąŲ Ø§Ų„ØĒØ­Ų‚Ų‚..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "Ų…Ø¯Ų…ØŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "Ø§Ų„Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų…Ø¯Ų…ØŦ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "ØĒŲ… Ø§Ų„ØļØ¨Øˇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "اØĒØĩØ§Ų„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "Ų…ØĒØĩŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "ØŦØ§ØąŲ Ø§Ų„Ø§ØĒØĩØ§Ų„..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "Ų…ØĒابؚ؊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "ØĒØ­ŲƒŲ‘Ų…" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "Ø§Ų„Ø§Ų†ØˇŲ„Ø§Ų‚ Ų…Ų† Ø§Ų„ØĢباØĒ (ØĒØŦØąŲŠØ¨ŲŠ)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "Ų…ØĒØ­ŲƒŲ… Ø§Ų„Ø§Ų†Ø­Ų†Ø§ØĄ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØĒØŗØŦŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "ØąŲØļ" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "Ø§ŲØĒØąØ§Øļ؊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "Ø­Ø°Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "Ø§Ų„Ų…ØˇŲˆŲ‘Øą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "Ų…ØšØąŲ‘Ų Ø§Ų„ØŦŲ‡Ø§Ø˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"ØĨŲ„ØēØ§ØĄ\n" +"ŲØąØļ Ø§Ų„ØĒŲˆŲ‚Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "ØĨŲ„ØēØ§ØĄ ŲØąØļ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "Ų…ØšØˇŲ‘Ų„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "ØŦØ§ØąŲ Ų‚ØˇØš Ø§Ų„Ø§ØĒØĩØ§Ų„..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "Ø§Ų„ØĨŲŠŲ‚Ø§Ų ØšŲ†Ø¯ Ø¯ŲˆØ§ØŗØŠ Ø§Ų„ŲˆŲ‚ŲˆØ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "Ø§Ų„Ø´Ø§Ø´ØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "ØŗØˇŲˆØš Ø§Ų„Ø´Ø§Ø´ØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "ØŖØŗŲŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "ØĒŲ†Ø˛ŲŠŲ„ Ø§Ų„ØĒØ­Ø¯ŲŠØĢ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "ØŦØ§ØąŲ Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "ØŦØ§ØąŲ Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"Ų…ØšØ§ŲŠŲ†ØŠ ŲƒØ§Ų…ŲŠØąØ§\n" +"Ø§Ų„ØŗØ§ØĻŲ‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "Ø§Ų„ØŗØˇŲˆØš ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "Ø¯ŲŠŲ†Ø§Ų…ŲŠŲƒŲŠ" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "ØĒŲØšŲŠŲ„ ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØĒØŗØŦŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "ØĒŲØšŲŠŲ„ Ø§Ų„ØĒØŦŲˆØ§Ų„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "Ų…ŲØšŲ‘Ų„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "ŲØąØļ Ø§Ų„ØˇŲˆŲ„ŲŠ Ø§Ų„Ų…ØĩŲ†ØšŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "ØŖØ¯ØŽŲ„ APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "ØŖØ¯ØŽŲ„ Ø§ØŗŲ… Ų…ØŗØĒØŽØ¯Ų… GitHub..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "ØŖØ¯ØŽŲ„ ØąŲ…Ø˛ ØĒŲØšŲŠŲ„ LPA..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "ØŖØ¯ØŽŲ„ Ø§Ų„ØąŲ…Ø˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "ØŖØ¯ØŽŲ„ ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ØąŲˆØą..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "ŲØ´Ų„ Ø§Ų„ØĒØ­Ų‚Ų‚ Ų…Ų† ؈ØŦŲˆØ¯ ØĒØ­Ø¯ŲŠØĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "ŲØ´Ų„ Ø§Ų„ØĒØ­Ø¯ŲŠØĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "ØŗØąŲŠØš" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "ØŦØ§ØąŲ ØĨŲ†Ų‡Ø§ØĄ Ø§Ų„ØĒØ­Ø¯ŲŠØĢ..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "Ų„Ų€ \"{}\"" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "Ų„ØĒØ­Ø¯ŲŠØĢاØĒ Ø§Ų„ŲØąŲˆØš Ø§Ų„ØŽØ§ØĩØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"ŲØąØļ\n" +"؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "ŲØąØļ ŲˆØ§ØŦŲ‡ØŠ mici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "ŲØąØļ ؈ØļØš Ø§Ų„ØĒŲˆŲ‚Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "ØŦØ§ØąŲ Ø§Ų„Ų†ØŗŲŠØ§Ų†..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "Ø§Ų„Øĩ؊ØēØŠ: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "Ų…Ų† Ø§Ų„Ø°Ø§ŲƒØąØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "Øŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "ØļØ¨Øˇ Ų‡ŲŠŲˆŲ†Ø¯Ø§ŲŠ Ø§Ų„ØˇŲˆŲ„ŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "Ų…ØšŲ„ŲˆŲ…Ø§ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "ØĒØĢØ¨ŲŠØĒ Ø§Ų„ØĒØ­Ø¯ŲŠØĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "Ø§Ų„ØĒŲØ§ØšŲ„ŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "ØĨؚداداØĒ iq.dynamic" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "ŲƒŲ…/Øŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "ØĒØēŲŠŲŠØą Ø§Ų„Ų…ØŗØ§Øą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "ØĒŲ†Ø¨ŲŠŲ‡Ø§ØĒ Ų…ØēØ§Ø¯ØąØŠ Ø§Ų„Ų…ØŗØ§Øą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "ØŗØąØšØŠ Ø§Ų„Ø§Ų†ØšØˇØ§Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "؈ØļØš Ø§Ų„Ų…Ų†Ø§ŲˆØąØŠ Ø§Ų„ØŦØ§Ų†Ø¨ŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "Ø§Ų„ØŦØ§Ų†Ø¨ŲŠ ØšŲ†Ø¯ ØšØˇŲ„ Ų…ØĢØ¨Ų‘ØĒ Ø§Ų„ØŗØąØšØŠ" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "اØĒØąŲƒŲ‡ ŲØ§ØąØēØ§Ų‹ Ų„Ų„ØĨؚداد Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "اØĒØąŲƒŲ‡ ŲØ§ØąØēŲ‹Ø§ Ų„Ų„ØĒØŽØˇŲŠ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "اØĒØąŲƒ Ø§ØŗŲ… Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… ŲˆØ§Ų„ØąŲ…Ø˛ ŲØ§ØąØēŲŠŲ† Ų„Ų„Ų…ØŗØ­" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "ŲŠØŗØ§Øą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "؈ØļØš Ø§Ų„Ų…Ų†Ø§ŲˆØąØŠ Ø§Ų„ØˇŲˆŲ„ŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "ØĒØŽØˇŲŠØˇ Ø§Ų„Ø§Ų†ØšØˇØ§Ų ØšŲ†Ø¯ Ø§Ų„ØŗØąØšØŠ Ø§Ų„Ų…Ų†ØŽŲØļØŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "د" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "ØĨØ¯Ø§ØąØŠ Ø§Ų„Ų…Ų„ŲØ§ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "ŲŠØ¯ŲˆŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "ØĨØ˛Ø§Ø­ØŠ Ø§Ų„ØĒØŖØŽŲŠØą Ø§Ų„ŲŠØ¯ŲˆŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "Ø§Ų„ØŽØąŲŠØˇØŠ ŲŲ‚Øˇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "ØŖŲˆŲ„ŲˆŲŠØŠ Ø§Ų„ØŽØąŲŠØˇØŠ" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "Ų…Ø­Ø¯ŲˆØ¯ Ø§Ų„ØĒØšØąŲØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "Ø§Ų„Ų†Ų…Ø§Ø°ØŦ" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "Ų…ŲŠŲ„/Øŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "Ø§Ų„Ø´Ø¨ŲƒØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Ø´Ø¨ŲƒØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "ØŖØ¨Ø¯Ø§Ų‹" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "Ų„Ø§" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "Ų„Ø§ ØĒ؈ØŦد ØĒŲ†Ø¨ŲŠŲ‡Ø§ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "Ø¨Ø¯ŲˆŲ† Ų„Ų…ØŗØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "ØšØ§Ø¯ŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "ØŽØ§ØąØŦ Ø§Ų„Ų†ØˇØ§Ų‚" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "Ø§Ų„ØĸŲ†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "Ų„Ų…ØŗØŠ ØšŲ„Ų‰ Ø§Ų„Ų…Ų‚ŲˆØ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "ØĨŲŠŲ‚Ø§Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "ØēŲŠØą Ų…ØĒØĩŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "ØĒØ´ØēŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "Ų…ØĒØĩŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "Ø§ØŗŲ… ا؎ØĒŲŠØ§ØąŲŠ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "Ø§Ų„Ø§Ų‚ØĒØąØ§Ų† ؁؊ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "Ø§Ų„Ø§Ų‚ØĒØąØ§Ų† Ø¨Ų€ Konn3kt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "ØŖŲˆØ˛Ø§Ų† Ø§Ų„ØŗŲŠØ§ØŗØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "ØĒŲ†Ø¨Ø¤ŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "ØĨØŦØąØ§ØĄØ§ØĒ Ø§Ų„Ų…Ų„Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "Ų…Ø´ØēŲ‘Ų„ ØēŲŠØą Ų…ØšØąŲˆŲ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "Ų…ØŗØ­ Ø°Ø§ŲƒØąØŠ Ø§Ų„Ų†Ų…Ø§Ø°ØŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "؁؊ Ø§Ų„Ø§Ų†ØĒØ¸Ø§Øą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "ØŦØ§Ų‡Ø˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "ØĒØŗØŦŲŠŲ„ ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ØŗØ§ØĻŲ‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ų…ŲŠŲƒØąŲˆŲŲˆŲ†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "ØĨؚاد؊ ØĒŲ†Ø˛ŲŠŲ„ Ø§Ų„Ų†Ų…ŲˆØ°ØŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "ØĒØ­Ø¯ŲŠØĢ Ø§Ų„Ų…Ų„ŲØ§ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "Ų…ØšŲ„ŲˆŲ…Ø§ØĒ ØĒŲ†Ø¸ŲŠŲ…ŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "Ų‡Ø§Ø¯ØĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "ØĨؚاد؊ ØĒØ­Ų…ŲŠŲ„ Ų‚Ø§ØĻŲ…ØŠ Ø§Ų„Ų†Ų…Ø§Ø°ØŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "ØĨØ˛Ø§Ų„ØŠ pSIM Ų…Ų† comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "ØĨؚاد؊ ØĒØŗŲ…ŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "ØĨؚاد؊ ØĒØŗŲ…ŲŠØŠ Ø§Ų„Ų…Ų„Ų..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "ØĨؚاد؊ ØļØ¨Øˇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "ØĨؚاد؊ ØļØ¨Øˇ Ø§Ų„Ų…ØšØ§ŲŠØąØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"Ų…ØąØ§ØŦؚ؊ Ø¯Ų„ŲŠŲ„\n" +"Ø§Ų„ØĒØ¯ØąŲŠØ¨" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "ŲŠŲ…ŲŠŲ†" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "ØĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "Ų…ØŗØ­ QR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "Ų…ØŗØ­ QR / ØĨØ¯ØŽØ§Ų„ ØąŲ…Ø˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "ØŦØ§ØąŲ Ø§Ų„Ø¨Ø­ØĢ ØšŲ† Ø´Ø¨ŲƒØ§ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "ØļØ¨Øˇ ذاØĒ؊ Ų„ØĒØŖØŽŲŠØą Ø§Ų„ØĒ؈ØŦŲŠŲ‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "Ø§Ų„ØąŲ‚Ų… Ø§Ų„ØĒØŗŲ„ØŗŲ„ŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "Ø§Ų„ØŗØąØšØŠ Ø§Ų„Ų…Ø­Ø¯Ø¯ØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "Ø§Ų„ŲˆØ­Ø¯Ø§ØĒ Ø­ØŗØ¨ Ø§Ų„Ų…ŲˆŲ‚Øš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"Ø§ØŗØ­Ø¨ Ų„Ų…ØŗØ­\n" +"Ø§Ų„Ø°Ø§ŲƒØąØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"Ø§ØŗØ­Ø¨ Ų„Ų‚ØˇØš\n" +"Ø§Ų„Ø§ØĒØĩØ§Ų„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"Ø§ØŗØ­Ø¨\n" +"Ų„Ų„Ų†ØŗŲŠØ§Ų†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"Ø§ØŗØ­Ø¨ Ų„ØĨؚاد؊\n" +"Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"Ø§ØŗØ­Ø¨ Ų„ØĨؚاد؊ ØļØ¨Øˇ\n" +"Ø§Ų„Ų…ØšØ§ŲŠØąØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"Ø§ØŗØ­Ø¨ Ų„Ų€\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"Ø§ØŗØ­Ø¨ Ų„ØĨØ˛Ø§Ų„ØŠ\n" +"pSIM Ų…Ų† comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "Ø¨ØˇŲŠØĄ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "ØĒ؈ØŦŲŠŲ‡ ØŗŲ„Øŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "Ø§Ų„Ø¨ØąŲ†Ø§Ų…ØŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "ØĨؚداداØĒ حد Ø§Ų„ØŗØąØšØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "Ų‚ŲŠØ§ØŗŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "؈ØļØš Ø§Ų„Ø§ØŗØĒؚداد" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"Ø´ØēŲ‘Ų„ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų„Ø§ØŗØĒØŽØ¯Ø§Ų…\n" +"IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "ØŦØ§ØąŲ Ø§Ų„Ø¨Ø¯ØĄ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "Ø§Ų„Ø­Ø§Ų„ØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "Ø§Ų„Ø¨Ų‚Ø§ØĄ Ų…ŲØšŲ‘Ų„Ų‹Ø§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "Ø§Ų„ØĒ؈ØŦŲŠŲ‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "ØŗŲ„ŲˆŲƒ Ų…ØŗØ§ØšØ¯ØŠ Ø§Ų„ØĒ؈ØŦŲŠŲ‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "ØŖØĩŲ„ŲŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "Ø§Ų„ØĒŲˆŲ‚Ų ŲˆØ§Ų„Ø§Ų†ØˇŲ„Ø§Ų‚ Ø¨ŲØąØ§Ų…Ų„ ŲŠØ¯ŲˆŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒŲ†Ø˛ŲŠŲ„" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "ØŦØ§ØąŲ ØĨŲ‚Ų„Ø§Øš Ø§Ų„Ų†Ø¸Ø§Ų…" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "Ø§Ų„ŲØąØš Ø§Ų„Ų‡Ø¯Ų" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"Ø§Ų„Ø´ØąŲˆØˇ\n" +"ŲˆØ§Ų„ØŖØ­ŲƒØ§Ų…" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "Ų†Ų‚ØˇØŠ Ø§Ų„Ø§ØĒØĩØ§Ų„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ų†Ų‚ØˇØŠ Ø§Ų„Ø§ØĒØĩØ§Ų„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "Ø§Ų„ØŽŲŠØ§ØąØ§ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "Ø§Ų„ØąØ­Ų„Ø§ØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "ØĨŲ„ØēØ§ØĄ Ø§Ų„ØĒØĢØ¨ŲŠØĒ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "ØĨŲ„ØēØ§ØĄ ØĒØĢØ¨ŲŠØĒ IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "ØēŲŠØą Ų…Ø­Ø¯ŲˆØ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "ØēŲŠØą Ų…Ø¯ØšŲˆŲ…" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "ØŖØšŲ„Ų‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "Ų…Ø­Ø¯Ų‘ØĢ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "Ų…Ø­Ø¯Ų‘ØĢ، ØĸØŽØą ØĒØ­Ų‚Ų‚: ØŖØ¨Ø¯Ø§Ų‹" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "Ų…Ø­Ø¯Ų‘ØĢ، ØĸØŽØą ØĒØ­Ų‚Ų‚ {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"؈ØļØš ØĒØĢØ¨ŲŠØĒ\n" +"Ø§Ų„ØĒØ­Ø¯ŲŠØĢاØĒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "ØĒØ­Ø¯ŲŠØĢ Ų…ØĒاح" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"Ø§Ų„Ų…Ø­Ø¯Ų‘ØĢ Ų„Ø§\n" +"ŲŠØŗØĒØŦŲŠØ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "ŲˆØ­Ø¯Ø§ØĒ Ų…ØĒØąŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "Ø§Ų„Ų…ØąŲƒØ¨ØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "Ø§Ų„ØĨØĩØ¯Ø§Øą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "Ø§Ų„Ų…Ø˛ØŦ Ø§Ų„Ø§ŲØĒØąØ§Øļ؊ Ų„ØšØ˛Ų… Ø§Ų„Ø¯ŲˆØąØ§Ų†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "ØŖŲˆØ˛Ø§Ų† Ø§Ų„ØąØ¤ŲŠØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "Ø§Ų„Ų…Ø¸Ų‡Øą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "ØĒØ­Ø°ŲŠØą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØŽØ§ØˇØĻØŠ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "Ų†ØšŲ…" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} ØĒŲ†Ø¨ŲŠŲ‡" +msgstr[1] "{} ØĒŲ†Ø¨ŲŠŲ‡" +msgstr[2] "{} ØĒŲ†Ø¨ŲŠŲ‡Ø§Ų†" +msgstr[3] "{} ØĒŲ†Ø¨ŲŠŲ‡Ø§ØĒ" +msgstr[4] "{} ØĒŲ†Ø¨ŲŠŲ‡Ø§ØĒ" +msgstr[5] "{} ØĒŲ†Ø¨ŲŠŲ‡" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "Ų‚Ø¨Ų„ {} ŲŠŲˆŲ…" +msgstr[1] "Ų‚Ø¨Ų„ {} ŲŠŲˆŲ…" +msgstr[2] "Ų‚Ø¨Ų„ {} ŲŠŲˆŲ…ŲŠŲ†" +msgstr[3] "Ų‚Ø¨Ų„ {} ØŖŲŠØ§Ų…" +msgstr[4] "Ų‚Ø¨Ų„ {} ØŖŲŠØ§Ų…" +msgstr[5] "Ų‚Ø¨Ų„ {} ŲŠŲˆŲ…" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "Ų‚Ø¨Ų„ {} ØŗØ§ØšØŠ" +msgstr[1] "Ų‚Ø¨Ų„ {} ØŗØ§ØšØŠ" +msgstr[2] "Ų‚Ø¨Ų„ {} ØŗØ§ØšØĒŲŠŲ†" +msgstr[3] "Ų‚Ø¨Ų„ {} ØŗØ§ØšØ§ØĒ" +msgstr[4] "Ų‚Ø¨Ų„ {} ØŗØ§ØšØ§ØĒ" +msgstr[5] "Ų‚Ø¨Ų„ {} ØŗØ§ØšØŠ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "Ų‚Ø¨Ų„ {} Ø¯Ų‚ŲŠŲ‚ØŠ" +msgstr[1] "Ų‚Ø¨Ų„ {} Ø¯Ų‚ŲŠŲ‚ØŠ" +msgstr[2] "Ų‚Ø¨Ų„ {} Ø¯Ų‚ŲŠŲ‚ØĒŲŠŲ†" +msgstr[3] "Ų‚Ø¨Ų„ {} Ø¯Ų‚Ø§ØĻŲ‚" +msgstr[4] "Ų‚Ø¨Ų„ {} Ø¯Ų‚Ø§ØĻŲ‚" +msgstr[5] "Ų‚Ø¨Ų„ {} Ø¯Ų‚ŲŠŲ‚ØŠ" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "ØŗŲ†ØŠ ŲˆØ§Ø­Ø¯ØŠ Ų…Ų† ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "اØĒØĩØ§Ų„ LTE ØšŲ„Ų‰ Ų…Ø¯Ø§Øą Ø§Ų„ØŗØ§ØšØŠ" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "ØĒØ­Ø°ŲŠØą: Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų„Ų€ openpilot ؁؊ Ų…ØąØ­Ų„ØŠ ØŖŲ„ŲØ§ Ų„Ų‡Ø°Ų‡ Ø§Ų„ØŗŲŠØ§ØąØŠ ŲˆØŗŲŠŲØšØˇŲ‘Ų„ " +#~ "Ų†Ø¸Ø§Ų… Ø§Ų„ŲƒØ¨Ø­ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ ؁؊ Ø­Ø§Ų„Ø§ØĒ Ø§Ų„ØˇŲˆØ§ØąØĻ (AEB).

    ؁؊ Ų‡Ø°Ų‡ Ø§Ų„ØŗŲŠØ§ØąØŠØŒ ŲŠØšØĒŲ…Ø¯" +#~ " openpilot Ø§ŲØĒØąØ§ØļŲŠØ§Ų‹ ØšŲ„Ų‰ Ų†Ø¸Ø§Ų… ACC Ø§Ų„Ų…Ø¯Ų…ØŦ Ø¨Ø¯Ų„Ø§Ų‹ Ų…Ų† Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų„Ų€ " +#~ "openpilot. ŲØšŲ‘Ų„ Ų‡Ø°Ø§ Ø§Ų„ØŽŲŠØ§Øą Ų„Ų„ØĒØ¨Ø¯ŲŠŲ„ ØĨŲ„Ų‰ Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų„Ų€ openpilot. ŲŠŲŲ†ØĩØ­ " +#~ "بØĒŲ…ŲƒŲŠŲ† ؈ØļØš Ø§Ų„ØĒØŦØąØ¨ØŠ ØšŲ†Ø¯ ØĒŲØšŲŠŲ„ Ų†ØŗØŽØŠ ØŖŲ„ŲØ§ Ų…Ų† Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ. ØĒØēŲŠŲŠØą Ų‡Ø°Ø§ Ø§Ų„ØĨؚداد " +#~ "ØŗŲŠØšŲŠØ¯ ØĒØ´ØēŲŠŲ„ openpilot ØĨذا ŲƒØ§Ų†ØĒ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų‚ŲŠØ¯ Ø§Ų„ØĒØ´ØēŲŠŲ„." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "؊ØĒŲŠØ­ ADB (Android Debug Bridge) Ø§Ų„Ø§ØĒØĩØ§Ų„ بØŦŲ‡Ø§Ø˛Ųƒ ØšØ¨Øą USB ØŖŲˆ ØšØ¨Øą Ø§Ų„Ø´Ø¨ŲƒØŠ. ØąØ§ØŦØš " +#~ "https://docs.comma.ai/how-to/connect-to-comma Ų„Ų…Ø˛ŲŠØ¯ Ų…Ų† Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "Ų…ØąØ§Ų‚Ø¨ØŠ Ø§Ų„ØŗØ§ØĻŲ‚ داØĻŲ…Ø§Ų‹" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "" +#~ "ŲŠŲ…ŲƒŲ† ا؎ØĒØ¨Ø§Øą Ų†ØŗØŽØŠ ØŖŲ„ŲØ§ Ų…Ų† Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų„Ų€ openpilot، Ų…Øš ؈ØļØš Ø§Ų„ØĒØŦØąØ¨ØŠØŒ ØšŲ„Ų‰ " +#~ "Ø§Ų„ŲØąŲˆØš ØēŲŠØą Ø§Ų„ØĨØĩØ¯Ø§ØąŲŠØŠ." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "ØĢØ¨Ų‘ØĒ konn3kt.com ØšŲ„Ų‰ شاشØĒ؃ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ų„Ø§ØŗØĒØŽØ¯Ø§Ų…Ų‡ ؃ØĒØˇØ¨ŲŠŲ‚" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "؈ØļØš Ø§Ų„Ų‡Ø¯ŲˆØĄ Ų…ŲŲØšŲ„" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "ØŗŲŠØ¤Ø¯ŲŠ ØĒØēŲŠŲŠØą Ų‡Ø°Ø§ Ø§Ų„ØĨؚداد ØĨŲ„Ų‰ ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ openpilot ØĨذا ŲƒØ§Ų†ØĒ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų‚ŲŠØ¯ " +#~ "Ø§Ų„ØĒØ´ØēŲŠŲ„." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "اØļØēØˇ \"ØĨØļØ§ŲØŠ ØŦŲ‡Ø§Ø˛ ØŦØ¯ŲŠØ¯\" ØĢŲ… Ø§Ų…ØŗØ­ ØąŲ…Ø˛ QR ØšŲ„Ų‰ Ø§Ų„ŲŠŲ…ŲŠŲ†" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "ØąŲØļ، ؈ØĨŲ„ØēØ§ØĄ ØĒØĢØ¨ŲŠØĒ openpilot" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "؈ØļØš Ø§Ų„ØĒØŦØąØ¨ØŠ Ų…ŲŲØšŲ„" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "ØĒŲ…ŲƒŲŠŲ† Ų…ØąØ§Ų‚Ø¨ØŠ Ø§Ų„ØŗØ§ØĻŲ‚ Ø­ØĒŲ‰ ØšŲ†Ø¯Ų…Ø§ Ų„Ø§ ŲŠŲƒŲˆŲ† openpilot Ų…ŲØ´ØēŲ„Ø§Ų‹." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "ØĒŲ…ŲƒŲŠŲ† openpilot" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "ŲØšŲ‘Ų„ ØĒØ¨Ø¯ŲŠŲ„ Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ (ØŖŲ„ŲØ§) Ų„Ų€ openpilot Ų„Ų„ØŗŲ…Ø§Ø­ Ø¨ŲˆØļØš Ø§Ų„ØĒØŦØąØ¨ØŠ." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "؈ØļØš Ø§Ų„ØĒØŦØąØ¨ØŠ" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "" +#~ "؈ØļØš Ø§Ų„ØĒØŦØąØ¨ØŠ ØēŲŠØą Ų…ØĒاح Ø­Ø§Ų„ŲŠØ§Ų‹ ؁؊ Ų‡Ø°Ų‡ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų„ØŖŲ† Ų†Ø¸Ø§Ų… ACC Ø§Ų„ØŖØĩŲ„ŲŠ ŲŠŲØŗØĒØŽØ¯Ų… " +#~ "Ų„Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "Ų…ŲŠØ˛Ø§ØĒ PRIME:" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "؈ØļØš Firehose" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "Ų„ØŖŲ‚ØĩŲ‰ ŲØšØ§Ų„ŲŠØŠØŒ ØŖØ­ØļØą ØŦŲ‡Ø§Ø˛Ųƒ ØĨŲ„Ų‰ Ø§Ų„Ø¯Ø§ØŽŲ„ ŲˆØ§ØĒØĩŲ„ Ø¨Ų…Ø­ŲˆŲ‘Ų„ USB‑C ØŦŲŠØ¯ ŲˆØ¨Ø´Ø¨ŲƒØŠ Wi‑Fi ØŖØŗØ¨ŲˆØšŲŠØ§Ų‹.\n" +#~ "\n" +#~ "ŲŠŲ…ŲƒŲ† ØŖŲ† ŲŠØšŲ…Ų„ ؈ØļØš Firehose ØŖŲŠØļØ§Ų‹ ØŖØĢŲ†Ø§ØĄ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ØĨذا ŲƒŲ†ØĒ Ų…ØĒØĩŲ„Ø§Ų‹ Ø¨Ų†Ų‚ØˇØŠ اØĒØĩØ§Ų„ ØŖŲˆ Ø¨Ø´ØąŲŠØ­ØŠ ØēŲŠØą Ų…Ø­Ø¯ŲˆØ¯ØŠ.\n" +#~ "\n" +#~ "\n" +#~ "Ø§Ų„ØŖØŗØĻŲ„ØŠ Ø§Ų„Ø´Ø§ØĻؚ؊\n" +#~ "\n" +#~ "Ų‡Ų„ ŲŠŲ‡Ų… ؃؊؁ ØŖŲˆ ØŖŲŠŲ† ØŖŲ‚ŲˆØ¯ØŸ Ų„Ø§ØŒ Ų‚Ø¯ Ø¨Ų‚Ø¯Øą Ø§Ų„Ų…ØšØĒاد.\n" +#~ "\n" +#~ "Ų‡Ų„ ؊ØĒŲ… ØŗØ­Ø¨ ŲƒŲ„ Ų…Ų‚Ø§ØˇØšŲŠ ؁؊ ؈ØļØš Firehose؟ Ų„Ø§ØŒ Ų†Ų‚ŲˆŲ… Ø¨ØŗØ­Ø¨ Ų…ØŦŲ…ŲˆØšØŠ ŲØąØšŲŠØŠ Ų…Ų† Ø§Ų„Ų…Ų‚Ø§ØˇØš.\n" +#~ "\n" +#~ "Ų…Ø§ Ų‡Ųˆ Ų…Ø­ŲˆŲ„ USB‑C Ø§Ų„ØŦŲŠØ¯ØŸ ØŖŲŠ Ø´Ø§Ø­Ų† Ų‡Ø§ØĒ؁ ØŖŲˆ Ø­Ø§ØŗØ¨ Ų…Ø­Ų…ŲˆŲ„ ØŗØąŲŠØš ØŗŲŠŲƒŲˆŲ† Ų…Ų†Ø§ØŗØ¨Ø§Ų‹.\n" +#~ "\n" +#~ "Ų‡Ų„ ŲŠŲ‡Ų… ØŖŲŠ Ø¨ØąŲ†Ø§Ų…ØŦ ØŖØ´ØēŲ‘Ų„ØŸ Ų†ØšŲ…ØŒ ŲŲ‚Øˇ openpilot Ø§Ų„ØŖØĩŲ„ŲŠ (ŲˆØ¨ØšØļ Ø§Ų„ØĒŲØąØšØ§ØĒ Ø§Ų„Ų…Ø­Ø¯Ø¯ØŠ) ŲŠŲ…ŲƒŲ† Ø§ØŗØĒØŽØ¯Ø§Ų…Ų‡ Ų„Ų„ØĒØ¯ØąŲŠØ¨." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "Ø§Ø°Ų‡Ø¨ ØĨŲ„Ų‰ https://konn3kt.com ØšŲ„Ų‰ Ų‡Ø§ØĒ؁؃" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "ØēŲŠØą Ų†Ø´Øˇ: اØĒØĩŲ„ Ø¨Ø´Ø¨ŲƒØŠ ØēŲŠØą Ų…Ø­Ø¯ŲˆØ¯ØŠ Ø§Ų„ØĒØšØąŲØŠ" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "؈ØļØš ØĒØĩØ­ŲŠØ­ ØšØĩا Ø§Ų„ØĒØ­ŲƒŲ…" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "Ø˛Ø¯ Ų…Ų† ØĒØ­Ų…ŲŠŲ„ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØ¯ØąŲŠØ¨ Ų„ØĒØ­ØŗŲŠŲ† Ų†Ų…Ø§Ø°ØŦ Ų‚ŲŠØ§Ø¯ØŠ openpilot." + +#~ msgid "NO" +#~ msgstr "Ų„Ø§" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "Ų„Ų… ؊ØĒŲ… Ø§Ų„ØšØĢŲˆØą ØšŲ„Ų‰ Ų…ŲØ§ØĒŲŠØ­ SSH" + +#, python-format +#~ msgid "Open" +#~ msgstr "؁ØĒØ­" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "ØŖŲ‚ØąŲŲ† ØŦŲ‡Ø§Ø˛Ųƒ Ų…Øš Konn3kt (konn3kt.com) ŲˆØ§Ø­ØĩŲ„ ØšŲ„Ų‰ ØšØąØļ Konn3kt." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "Ø§Ų†ØļŲ… ØĨŲ„Ų‰ Konn3kt ØšØ¨Øą konn3kt.com" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "Ų„Ų‚ØˇØ§ØĒ ØšŲ† Ø¨ŲØšØ¯" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "Ų…ØąØ§ØŦؚ؊ Ų‚ŲˆØ§ØšØ¯ ŲˆŲ…ŲŠØ˛Ø§ØĒ ŲˆØ­Ø¯ŲˆØ¯ openpilot" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "؊؈ØĩŲ‰ Ø¨Ø§Ų„ŲˆØļØš Ø§Ų„Ų‚ŲŠØ§ØŗŲŠ. ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ØšØ¯ŲˆØ§Ų†ŲŠØŒ ØŗŲŠØĒبؚ openpilot Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ ØšŲ†" +#~ " Ų‚ØąØ¨ ŲˆØŗŲŠŲƒŲˆŲ† ØŖŲƒØĢØą شد؊ ؁؊ Ø§Ų„ŲˆŲ‚ŲˆØ¯ ŲˆØ§Ų„ŲØąØ§Ų…Ų„. ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„Ų…ØŗØĒØąØŽŲŠ ØŗŲŠØ¨Ų‚Ų‰ Ø¨ØšŲŠØ¯Ø§Ų‹ ØŖŲƒØĢØą" +#~ " ØšŲ† Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ Ø§Ų„ØŖŲ…Ø§Ų…ŲŠØŠ. ؁؊ Ø§Ų„ØŗŲŠØ§ØąØ§ØĒ Ø§Ų„Ų…Ø¯ØšŲˆŲ…ØŠØŒ ŲŠŲ…ŲƒŲ†Ųƒ Ø§Ų„ØĒŲ†Ų‚Ų„ Ø¨ŲŠŲ† Ų‡Ø°Ų‡ Ø§Ų„Ø´ØŽØĩŲŠØ§ØĒ " +#~ "Ø¨Ø˛Øą Ų…ØŗØ§ŲØŠ Ø§Ų„Ų…Ų‚ŲˆØ¯." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "" +#~ "Ø§ØŗØĒØŽØ¯Ų… Ų†Ø¸Ø§Ų… openpilot Ų„Ų„ØĒØ­ŲƒŲ… Ø§Ų„Ø°ŲƒŲŠ Ø¨Ø§Ų„ØŗØąØšØŠ ŲˆØ§Ų„Ų…ØŗØ§ØšØ¯ØŠ ØšŲ„Ų‰ Ø§Ų„Ø¨Ų‚Ø§ØĄ Ø¯Ø§ØŽŲ„ Ø§Ų„Ų…ØŗØ§Øą." +#~ " ؊ØĒØˇŲ„Ø¨ Ø§ØŗØĒØŽØ¯Ø§Ų… Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ Ø§Ų†ØĒØ¨Ø§Ų‡Ųƒ Ø§Ų„ŲƒØ§Ų…Ų„ ؁؊ ØŦŲ…ŲŠØš Ø§Ų„ØŖŲˆŲ‚Ø§ØĒ." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "ØĒØ­Ø°ŲŠØą: ŲŠŲ…Ų†Ø­ Ų‡Ø°Ø§ ؈ØĩŲˆŲ„ SSH ØĨŲ„Ų‰ ØŦŲ…ŲŠØš Ø§Ų„Ų…ŲØ§ØĒŲŠØ­ Ø§Ų„ØšØ§Ų…ØŠ ؁؊ ØĨؚداداØĒ GitHub Ø§Ų„ØŽØ§ØĩØŠ " +#~ "Ø¨Ųƒ. Ų„Ø§ ØĒŲØ¯ØŽŲ„ Ų…ØˇŲ„Ų‚Ø§Ų‹ Ø§ØŗŲ… Ų…ØŗØĒØŽØ¯Ų… GitHub ØēŲŠØą Ø§ØŗŲ…Ųƒ. Ų„Ų† ŲŠØˇŲ„Ø¨ Ų…Ų†Ųƒ Ų…ŲˆØ¸Ų ؁؊ comma " +#~ "ØŖØ¨Ø¯Ø§Ų‹ ØĨØļØ§ŲØŠ Ø§ØŗŲ… Ų…ØŗØĒØŽØ¯Ų…Ų‡Ų…." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "Ų…ØąØ­Ø¨Ø§Ų‹ Ø¨Ųƒ ؁؊ openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "ØšŲ†Ø¯ Ø§Ų„ØĒŲ…ŲƒŲŠŲ†ØŒ ØŗŲŠØ¤Ø¯ŲŠ Ø§Ų„ØļØēØˇ ØšŲ„Ų‰ Ø¯ŲˆØ§ØŗØŠ Ø§Ų„ŲˆŲ‚ŲˆØ¯ ØĨŲ„Ų‰ ؁ØĩŲ„ openpilot." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "؊ØŦب ØšŲ„ŲŠŲƒ Ų‚Ø¨ŲˆŲ„ Ø§Ų„Ø´ØąŲˆØˇ ŲˆØ§Ų„ØŖØ­ŲƒØ§Ų… Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… openpilot." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "؊ØŦب ØšŲ„ŲŠŲƒ Ų‚Ø¨ŲˆŲ„ Ø§Ų„Ø´ØąŲˆØˇ ŲˆØ§Ų„ØŖØ­ŲƒØ§Ų… Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… openpilot. Ø§Ų‚ØąØŖ ØŖØ­Ø¯ØĢ Ø§Ų„Ø´ØąŲˆØˇ ØšŲ„Ų‰ " +#~ "https://comma.ai/terms Ų‚Ø¨Ų„ Ø§Ų„Ų…ØĒابؚ؊." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų„Ų€ openpilot (ØŖŲ„ŲØ§)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot ØēŲŠØą Ų…ØĒاح" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "ŲŠØšŲ…Ų„ openpilot Ø§ŲØĒØąØ§ØļŲŠØ§Ų‹ ؁؊ ؈ØļØš Ø§Ų„Ų‡Ø¯ŲˆØĄ. ŲŠŲØšŲ‘Ų„ ؈ØļØš Ø§Ų„ØĒØŦØąØ¨ØŠ Ų…ŲŠØ˛Ø§ØĒ Ø¨Ų…ØŗØĒŲˆŲ‰ ØŖŲ„ŲØ§ " +#~ "ØēŲŠØą Ø§Ų„ØŦØ§Ų‡Ø˛ØŠ Ų„ŲˆØļØš Ø§Ų„Ų‡Ø¯ŲˆØĄ. Ø§Ų„Ų…ŲŠØ˛Ø§ØĒ Ø§Ų„ØĒØŦØąŲŠØ¨ŲŠØŠ Ų…Ø¯ØąØŦØŠ ØŖØ¯Ų†Ø§Ų‡:

    Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ" +#~ " Ų…Ų† ØˇØąŲ Ų„ØˇØąŲ


    دؚ Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ؊ØĒØ­ŲƒŲ… ؁؊ Ø§Ų„ŲˆŲ‚ŲˆØ¯ ŲˆØ§Ų„ŲØąØ§Ų…Ų„. ØŗŲŠŲ‚ŲˆØ¯ " +#~ "openpilot ŲƒŲ…Ø§ ŲŠØ¸Ų† ØŖŲ† Ø§Ų„ØĨŲ†ØŗØ§Ų† ØŗŲŠŲ‚ŲˆØ¯ØŒ Ø¨Ų…Ø§ ؁؊ Ø°Ų„Ųƒ Ø§Ų„ØĒŲˆŲ‚Ų ØšŲ†Ø¯ Ø§Ų„ØĨØ´Ø§ØąØ§ØĒ Ø§Ų„Ø­Ų…ØąØ§ØĄ " +#~ "ŲˆØšŲ„Ø§Ų…Ø§ØĒ Ø§Ų„ØĒŲˆŲ‚Ų. Ø¨Ų…Ø§ ØŖŲ† Ų†Ų…ŲˆØ°ØŦ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ŲŠŲ‚ØąØą Ø§Ų„ØŗØąØšØŠØŒ ؁ØĨŲ† Ø§Ų„ØŗØąØšØŠ Ø§Ų„Ų…ØļØ¨ŲˆØˇØŠ ØĒØšŲ…Ų„ " +#~ "ŲƒØ­Ø¯ ØŖØšŲ„Ų‰ ŲŲ‚Øˇ. Ų‡Ø°Ų‡ Ų…ŲŠØ˛ØŠ بØŦŲˆØ¯ØŠ ØŖŲ„ŲØ§Ø› ŲŠŲØĒŲˆŲ‚Øš Ø­Ø¯ŲˆØĢ ØŖØŽØˇØ§ØĄ.

    ØĒØĩŲˆŲŠØą Ų‚ŲŠØ§Ø¯ØŠ " +#~ "ØŦØ¯ŲŠØ¯


    ØŗŲŠŲ†ØĒŲ‚Ų„ ØšØąØļ Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ ØĨŲ„Ų‰ Ø§Ų„ŲƒØ§Ų…ŲŠØąØ§ Ø§Ų„ŲˆØ§ØŗØšØŠ Ø§Ų„Ų…ŲˆØ§ØŦŲ‡ØŠ Ų„Ų„ØˇØąŲŠŲ‚ ØšŲ†Ø¯ " +#~ "Ø§Ų„ØŗØąØšØ§ØĒ Ø§Ų„Ų…Ų†ØŽŲØļØŠ Ų„ØĨØ¸Ų‡Ø§Øą بؚØļ Ø§Ų„Ų…Ų†ØšØˇŲØ§ØĒ Ø¨Ø´ŲƒŲ„ ØŖŲØļŲ„. ŲƒŲ…Ø§ ØŗŲŠØ¸Ų‡Øą Ø´ØšØ§Øą ؈ØļØš Ø§Ų„ØĒØŦØąØ¨ØŠ " +#~ "؁؊ Ø§Ų„Ø˛Ø§ŲˆŲŠØŠ Ø§Ų„ØšŲ„ŲˆŲŠØŠ Ø§Ų„ŲŠŲ…Ų†Ų‰." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "ŲŠŲ‚ŲˆŲ… openpilot Ø¨Ø§Ų„Ų…ØšØ§ŲŠØąØŠ Ø¨Ø´ŲƒŲ„ Ų…ØŗØĒŲ…ØąØŒ ŲˆŲ†Ø§Ø¯ØąØ§Ų‹ Ų…Ø§ ØĒØĒØˇŲ„Ø¨ ØĨؚاد؊ Ø§Ų„ØļØ¨Øˇ. ØŗØĒØ¤Ø¯ŲŠ " +#~ "ØĨؚاد؊ ØļØ¨Øˇ Ø§Ų„Ų…ØšØ§ŲŠØąØŠ ØĨŲ„Ų‰ ØĨؚاد؊ ØĒØ´ØēŲŠŲ„ openpilot ØĨذا ŲƒØ§Ų†ØĒ Ø§Ų„ØŗŲŠØ§ØąØŠ Ų‚ŲŠØ¯ Ø§Ų„ØĒØ´ØēŲŠŲ„." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "؊ØĒØšŲ„Ų… openpilot Ø§Ų„Ų‚ŲŠØ§Ø¯ØŠ Ø¨Ų…Ø´Ø§Ų‡Ø¯ØŠ Ø§Ų„Ø¨Ø´ØąØŒ Ų…ØĢŲ„ŲƒØŒ ŲŠŲ‚ŲˆØ¯ŲˆŲ†.\n" +#~ "\n" +#~ "؊ØĒŲŠØ­ ؈ØļØš Firehose Ø˛ŲŠØ§Ø¯ØŠ ØĒØ­Ų…ŲŠŲ„ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØ¯ØąŲŠØ¨ Ų„ØĒØ­ØŗŲŠŲ† Ų†Ų…Ø§Ø°ØŦ Ų‚ŲŠØ§Ø¯ØŠ openpilot. Ø§Ų„Ų…Ø˛ŲŠØ¯ Ų…Ų† Ø§Ų„Ø¨ŲŠØ§Ų†Ø§ØĒ ŲŠØšŲ†ŲŠ Ų†Ų…Ø§Ø°ØŦ ØŖŲƒØ¨ØąØŒ Ų…Ų…Ø§ ŲŠØšŲ†ŲŠ ؈ØļØš ØĒØŦØąØ¨ØŠ ØŖŲØļŲ„." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "Ų‚Ø¯ ŲŠØŖØĒ؊ Ø§Ų„ØĒØ­ŲƒŲ… Ø§Ų„ØˇŲˆŲ„ŲŠ Ų„Ų€ openpilot ؁؊ ØĒØ­Ø¯ŲŠØĢ Ų…ØŗØĒŲ‚Ø¨Ų„ŲŠ." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "" +#~ "؊ØĒØˇŲ„Ø¨ openpilot ØĒØąŲƒŲŠØ¨ Ø§Ų„ØŦŲ‡Ø§Ø˛ ØļŲ…Ų† 4° ŲŠØŗØ§ØąØ§Ų‹ ØŖŲˆ ŲŠŲ…ŲŠŲ†Ø§Ų‹ ؈ØļŲ…Ų† 5° Ų„Ų„ØŖØšŲ„Ų‰ ØŖŲˆ 9° " +#~ "Ų„Ų„ØŖØŗŲŲ„." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "{} Ų…Ų‚ØˇØš Ų…Ų† Ų‚ŲŠØ§Ø¯ØĒ؃ ØļŲ…Ų† Ų…ØŦŲ…ŲˆØšØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØ¯ØąŲŠØ¨ Ø­ØĒŲ‰ Ø§Ų„ØĸŲ†." +#~ msgstr[1] "{} Ų…Ų‚ØˇØš Ų…Ų† Ų‚ŲŠØ§Ø¯ØĒ؃ ØļŲ…Ų† Ų…ØŦŲ…ŲˆØšØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØ¯ØąŲŠØ¨ Ø­ØĒŲ‰ Ø§Ų„ØĸŲ†." +#~ msgstr[2] "{} Ų…Ų‚ØˇØšØ§Ų† Ų…Ų† Ų‚ŲŠØ§Ø¯ØĒ؃ ØļŲ…Ų† Ų…ØŦŲ…ŲˆØšØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØ¯ØąŲŠØ¨ Ø­ØĒŲ‰ Ø§Ų„ØĸŲ†." +#~ msgstr[3] "{} Ų…Ų‚Ø§ØˇØš Ų…Ų† Ų‚ŲŠØ§Ø¯ØĒ؃ ØļŲ…Ų† Ų…ØŦŲ…ŲˆØšØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØ¯ØąŲŠØ¨ Ø­ØĒŲ‰ Ø§Ų„ØĸŲ†." +#~ msgstr[4] "{} Ų…Ų‚Ø§ØˇØš Ų…Ų† Ų‚ŲŠØ§Ø¯ØĒ؃ ØļŲ…Ų† Ų…ØŦŲ…ŲˆØšØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØ¯ØąŲŠØ¨ Ø­ØĒŲ‰ Ø§Ų„ØĸŲ†." +#~ msgstr[5] "{} Ų…Ų‚ØˇØš Ų…Ų† Ų‚ŲŠØ§Ø¯ØĒ؃ ØļŲ…Ų† Ų…ØŦŲ…ŲˆØšØŠ Ø¨ŲŠØ§Ų†Ø§ØĒ Ø§Ų„ØĒØ¯ØąŲŠØ¨ Ø­ØĒŲ‰ Ø§Ų„ØĸŲ†." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ Ų…Ø´ØĒØąŲƒ" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ ؈ØļØš Firehose đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_de.mo b/iqpilot/selfdrive/ui/translations/app_de.mo new file mode 100644 index 000000000..4fe3bf35d Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_de.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_de.po b/iqpilot/selfdrive/ui/translations/app_de.po new file mode 100644 index 000000000..532ca234b --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_de.po @@ -0,0 +1,4707 @@ +# German translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-20 16:35-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (Standard)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " Die Lenkmoment-Reaktionskalibrierung ist abgeschlossen." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " Die Lenkmoment-Reaktionskalibrierung ist zu {}% abgeschlossen." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " Ihr Gerät ist um {:.1f}° {} und {:.1f}° {} ausgerichtet." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    Kalibrierung der LenkverzÃļgerung abgeschlossen." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    Kalibrierung der LenkverzÃļgerung zu {}% abgeschlossen." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "AKTIV" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"ADB (Android Debug Bridge) ermÃļglicht die Verbindung mit deinem Gerät Ãŧber " +"USB oder das Netzwerk." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "HINZUFÜGEN" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "GESAMT" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "APN‑Einstellung" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "ANMELDEN" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "AUTO" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "beschleunigungsbalken" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "Beschleunigungsanzeige" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "Übermäßige Betätigung bestätigen" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "Aktivieren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "Aktives Modell" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "Nur oberhalb von {} aktiv." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "Profil hinzufÃŧgen" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "eSIM-Profil hinzufÃŧgen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "Geschwindigkeit fÃŧr Abbiegewunsch anpassen" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "Erweitert" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"Danach musst du dein eigenes eSIM-Profil verwenden.\n" +"\n" +"Comma Prime kann nicht erneut genutzt werden, es sei denn, du kaufst eine neue SIM von comma." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "Aggressiv" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "Zustimmen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "Alle" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "Alle Bundesstaaten (~6,0 GB)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"Erlaubt IQ.Pilot, das MQB-ACC-Wiederanfahrverhalten bei unterstÃŧtzten " +"Volkswagen-MQB-Fahrzeugen mit FtS mit verlängertem Halten ohne automatisches" +" Wiederanfahren zu verwenden." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"Erlaubt der Querregelung (Lenkung), aktiv zu bleiben, auch wenn die " +"Längsregelung (Gas/Bremse) wegen einer Tempomat-StÃļrung vorÃŧbergehend nicht " +"verfÃŧgbar ist." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "Dauerhafte QuerfÃŧhrung (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "Und vieles mehr" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "Wird sofort Ãŧbernommen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "" +"Wird Ãŧbernommen, sobald das Gerät das nächste Mal in den Parkmodus geht." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "Sind Sie sicher, dass Sie ausschalten mÃļchten?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "Sind Sie sicher, dass Sie neu starten mÃļchten?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"MÃļchtest du wirklich alle IQ.Pilot-Einstellungen auf die Standardwerte " +"zurÃŧcksetzen? Nach dem ZurÃŧcksetzen gibt es kein ZurÃŧck." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "Sind Sie sicher, dass Sie die Kalibrierung zurÃŧcksetzen mÃļchten?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "Sind Sie sicher, dass Sie deinstallieren mÃļchten?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "Auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "automatischer spurwechsel" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "Automatischer Spurwechsel: fortlaufende Wechsel" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "Auto — gedimmt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "Einstellungen automatisch schließen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"Fährt im folgenden Verkehr automatisch aus dem Stand wieder an, auf Subaru-" +"Plattformen, fÃŧr die die Beta-Implementierung gilt." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "VerfÃŧgbarkeit bei Tempomat-Wechseln" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "ZurÃŧck" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "Totwinkel-Warnungen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "totwinkel-warnungen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "Blinkeranzeigen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "Blinker-gesteuerter Spurwechsel" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "Zustand nach dem Start" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "Reaktion auf Bremsen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"Holt die breite Parkmodus-Statusleiste der klassischen Oberfläche zurÃŧck: " +"Temperatur, Fahrzeug und Konn3kt-Status auf einen Blick." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "ÄNDERN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "PRÜFEN" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "LEEREN" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "VERBINDUNG" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "VERBINDUNG" + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "Abbrechen" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "Navigation abbrechen" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "Getaktete Mobilfunkverbindung" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "Sprache ändern" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" +" Durch Ändern dieser Einstellung wird IQ.Pilot neu gestartet, wenn das Auto " +"eingeschaltet ist." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "GeprÃŧft {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "Modell auswählen" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"Längsverhalten wählen: IQ.Pilot (IQ-Längsregelung + End-to-End), IQ.Dynamic " +"(IQ-Längsregelung + dynamischer Modus), IQ.Chill (IQ-Längsregelung + " +"entspanntes Profil) oder Serien-ACC." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "Manuell gewählt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "Cache leeren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "Cache des gewählten Modells leeren und erneut herunterladen?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "Schließen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"Schließt den Lenkregelkreis bei MEB- und MQB-Evo-Fahrzeugen. IQ.Pilot " +"korrigiert seinen Lenkbefehl anhand der KrÃŧmmung, die das Fahrzeug " +"tatsächlich fährt, statt die geplante KrÃŧmmung direkt durchzureichen." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "Cloud" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "Nur Cloud" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "Cloud-Video nicht verfÃŧgbar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "Farblegende fÃŧr den Fingerprint-Status:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "Kombiniertes Modell" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"FÃŧhrt eine vorgegebene Abfolge von Beschleunigungsschritten aus, um die " +"Reaktion des Längsaktuators zu messen. Erfordert die IQ.Pilot-Längsregelung." +" Nur auf einer freien, abgesperrten Straße verwenden." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"FÃŧhrt eine vorgegebene Abfolge von Querbeschleunigungsschritten aus, um die " +"Reaktion der Lenkung zu messen. Nur auf einer geraden, ebenen und freien " +"Straße verwenden." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "Bestätigen" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "Weiter" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "fortlaufende wechsel" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "Steuerung" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"Steuert das Verhalten von IQ.Pilot bei Tempolimits. Aus deaktiviert die " +"Tempolimit-Funktionen, Info zeigt Limits nur an, Warnung hebt " +"GeschwindigkeitsÃŧberschreitungen hervor und Steuerung passt die " +"Sollgeschwindigkeit anhand erkannter Limits an." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "SSH-SchlÃŧssel konnten nicht abgerufen werden - siehe Logs" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "Dieser Ort konnte nicht gefunden werden" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "GitHub nicht erreichbar - Verbindung prÃŧfen" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "GitHub konnte nicht verifiziert werden - Gerätezeit prÃŧfen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "Land" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "Absturzprotokoll" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "Anfahren aus dem Stand (Beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "Anfahren aus dem Stand — manuelle Handbremse (Beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "Tempomat" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "Aktuelle Version" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "KrÃŧmmungsregler" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "LÖSCHEN" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "TRENNE..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "HERUNTERLADEN" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "Ablehnen" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "Ablehnen, IQ.Pilot deinstallieren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "Standard" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "Standard (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "Standard: startet fahrbereit, das Einschalten ist sofort mÃļglich." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"VerzÃļgerung, bis ein per Blinker ausgelÃļster Spurwechsel von selbst startet " +"— nach dem Festlegen einer VerzÃļgerung ist kein Lenkimpuls mehr nÃļtig " +"(Standard: Lenkimpuls).
    Nutze den Blinker dafÃŧr nur, wenn Verkehr und " +"Straße das ManÃļver tatsächlich zulassen." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "verzÃļgerung bei totem winkel" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "LÃļschen" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "Deaktiviertes Profil „{}“ lÃļschen?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "Dieses Protokoll lÃļschen?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "Ziel festgelegt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "Automatisch erkannt" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "Entwickler" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "Gerät" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "Das Gerät muss bei Konn3kt registriert sein, um gekoppelt zu werden." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "VerzÃļgerung bis zum Dimmen" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "Trennen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "Deaktivieren" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "Vor dem Erzwingen des Parkmodus deaktivieren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "Vor dem Erzwingen des Fahrmodus deaktivieren" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "Beim Gaspedal deaktivieren" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "Zum Ausschalten deaktivieren" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "Zum Neustart deaktivieren" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "Zum ZurÃŧcksetzen der Kalibrierung deaktivieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "zum {} deaktivieren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "Deaktivieren: Bremsen schaltet die LenkunterstÃŧtzung vollständig ab." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "Anzeige" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "Bildschirmhelligkeit" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "Geschwindigkeit in km/h statt mph anzeigen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "Abstand" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "MÃļchtest du Fahrerkameradaten hochladen?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "Fertig" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "Dongle-ID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "Herunterladen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "Download fehlgeschlagen — bitte erneut versuchen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "Kartenkacheln werden geladen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"Zeichnet am linken Rand einen Balken, der gemessene Beschleunigung und " +"Bremsung anzeigt — was das Fahrzeug gerade tatsächlich tut, nicht die " +"Anforderung des Planers." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"Zeichnet die Bildschirmkarte aus auf dem Gerät gespeicherten Kacheln. In " +"Kombination mit Online Ãŧbernehmen die gespeicherten Kacheln, sobald die " +"Verbindung abbricht. Die Kacheln werden fÃŧr die gewählte Region geladen." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "Fahrerkamera" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "PrÃŧfung der Fahrerkamera" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "Umgang mit Fahrereingriffen" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "Fahrten" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "Helligkeit während der Fahrt" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "Fahrstil" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "Dynamisch" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "Dynamische Abstimmung: lebhaftere Reaktion von Gas und Bremse." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "BEARBEITEN" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "FEHLER" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "Aktivieren" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "ADB aktivieren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Always on Lateral (AOL) aktivieren. Deaktiviere diesen Schalter, um zum " +"serienmäßigen Einschaltverhalten der IQ.Pilot-Lenkung zurÃŧckzukehren." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "Dashcam aktivieren" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "Spurverlassenswarnungen aktivieren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"Aktiviert die Behandlung der MQB-Lenksperre bei Volkswagen-MQB-Fahrzeugen " +"mit LKAS-StÃļrungen bei niedriger Geschwindigkeit." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "Roaming aktivieren" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "SSH aktivieren" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "Spurverlassenswarnungen aktivieren" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "FahrerÃŧberwachung auch aktivieren, wenn IQ.Pilot nicht aktiv ist." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "APN eingeben" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "Aktivierungscode eingeben" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "Code eingeben" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "SSID eingeben" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "Adresse oder Ort eingeben" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "Neues Tethering‑Passwort eingeben" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "Passwort eingeben" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "Geben Sie Ihren GitHub‑Benutzernamen ein" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "Fehler" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "Parkmodus verlassen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Erweiterte Statusleiste" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "experimenteller lead-MPC" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"Stellt eine Momentaufnahme aktueller Dashcam-Clips und Logs als USB-Laufwerk" +" bereit, wenn das Gerät mit einem Computer verbunden ist. IQ.Pilot läuft " +"weiter, solange dies aktiviert ist." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "WIRD VERGESSEN..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"Die werkseitige Toyota-Längsregelung ist derzeit erzwungen. Wähle einen IQ-" +"Längsmodus, um sie zu deaktivieren." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "Werkseitige Abstimmung der Längsregelung." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "favoriten" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "Karte wird abgerufen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "Karten werden abgerufen..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "Letzte Warnung" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "Finde dein Fahrzeug" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "Einrichtung abschließen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"Zeigt eine seitliche Warnung, wenn das Fahrzeug etwas in deinem toten Winkel" +" meldet (nur Fahrzeuge mit BSM)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" +"Aktiviere „Dauerparken“ im Gerätebereich oder schalte das Fahrzeug aus, um " +"dies zu ändern." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "folgeabstand" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "Folge den Anweisungen in der App, um die Kopplung abzuschließen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"IQ.Pilot fÃŧr 10 Minuten in den Fahrmodus zwingen? „Dauerparken“ wird " +"automatisch aktiviert und das Gerät kehrt nach Ablauf der Zeit in den " +"Parkmodus zurÃŧck." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Mici-Oberfläche erzwingen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "Fahrmodus erzwingen (10 Min.)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "Fahrmodus erzwingen ist nur im Parkmodus mÃļglich" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "" +"Fahrmodus erzwingen ist bereits aktiv. Timer auf 10 Minuten zurÃŧcksetzen?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "Erzwungener Fahrmodus aktiv" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Vergessen" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "WLAN‑Netz „{}“ vergessen?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "GUT" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Git-Authentifizierung" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Git-Token / Passwort" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Git-Benutzername" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "GitHub-Fehler ({}) beim Abrufen der SchlÃŧssel" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "HOCH" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "Netzwerk" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "Spurwechsel bei totem Winkel zurÃŧckhalten" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "Ruhig halten..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"Hält den automatischen Spurwechsel zurÃŧck, solange die TotwinkelÃŧberwachung " +"ein Fahrzeug auf der Zielspur meldet, und gibt ihn frei, sobald die Spur " +"frei ist." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Zuhause" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "Stunden" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"Wie lange der Einstellungsbildschirm unberÃŧhrt bleiben darf, bevor er sich " +"selbst schließt." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"Wie viel Vorlaufzeit zusätzlich zur eigenen VerzÃļgerung des Lenkgetriebes " +"hinzugefÃŧgt wird, solange die Selbstabstimmung aus ist. Standard ist 0,2 s." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "INSTALLIEREN" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "IP‑Adresse" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "IQ erzwungene stopps" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "IQ-modus" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"IQ-Längsmodi sind fÃŧr dieses Fahrzeug nicht verfÃŧgbar. Serien-ACC ist die " +"einzige verfÃŧgbare Option." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic kurven" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic vorderfahrzeug-tempo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic niedriges tempo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic modell-stopps" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic SLC-rÃŧckfall" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic langsameres vorderfahrzeug" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic stehendes vorderfahrzeug" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "IQ.OS-Version" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot nicht verfÃŧgbar" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +" Durch Ändern dieser Einstellung wird IQ.Pilot neu gestartet, wenn das Auto " +"eingeschaltet ist." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"IQ.Pilot erfordert, dass das Gerät innerhalb von 4° nach links oder rechts " +"und innerhalb von 5° nach oben oder 9° nach unten montiert ist." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"Wenn du mit 20 mph (32 km/h) oder langsamer fährst und der Blinker gesetzt " +"ist, plant das Fahrzeug an der nächsten befahrbaren Stelle eine Abbiegung in" +" diese Richtung. Das verhindert Situationen (etwa an roten Ampeln), in denen" +" das Fahrzeug die falsche Abbiegerichtung planen kÃļnnte." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "Info" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" +"Lege die originale comma-SIM-Karte ein, die mit dem Gerät geliefert wurde, " +"um eSIM zu nutzen" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "Update installieren" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "UngÃŧltiger QR-Code" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "KM" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "KONN3KT-FEHLER" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT OFFLINE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "Gerät im Parkmodus halten" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "Werkseitiges Gas und Bremse behalten" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"Überlässt Gas und Bremse dem werkseitigen Toyota-System; IQ.Pilot lenkt nur." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Konn3kt-Funktionen:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Konn3kt-Status:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "LIMIT" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "LADEN" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "LADEN..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "Spurwechsel-Optionen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "Querregelung bei Tempomat-StÃļrung" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "QuermanÃļver-Modus" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "Anzeigen zum Vorderfahrzeug" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "„Dauerparken“ jetzt verlassen?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "Erzwungenen Parkmodus jetzt verlassen?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"Lass IQ.Pilot messen, wie lange deine Lenkung zum Reagieren braucht, und " +"diesen Wert aktuell halten. Schalte es aus, um den Wert selbst festzulegen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" +"Erlaubt dir, das Lenkrad im aktiven Zustand zu bewegen, ohne die Lenkung " +"vollständig zu deaktivieren." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "Live-Streaming" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "Lade %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "Video wird geladen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "Lädt..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "Suche Standort..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "" +"Auf dieser Plattform fest AUS; das Fahrzeug unterstÃŧtzt keine anderen " +"Optionen." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "Längsregelung" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"Modi der Längsregelung:
    Die IQ.Pilot-Funktionen sind unten " +"aufgefÃŧhrt:

    IQ.Pilot End-to-End-Längsregelung


    Lass das " +"Fahrmodell Gas und Bremse steuern. IQ.Pilot fährt so, wie es meint, dass ein" +" Mensch fahren wÃŧrde, einschließlich Anhalten an roten Ampeln und " +"Stoppschildern. Da das Fahrmodell die Geschwindigkeit bestimmt, dient die " +"eingestellte Geschwindigkeit nur als Obergrenze. Diese Funktion wird " +"weiterentwickelt; Fehler sind zu " +"erwarten.

    IQ.Dynamic


    Wechselt je nach Situation und Umfeld " +"dynamisch zwischen adaptivem Tempomatverhalten und End-to-End-" +"Verhalten.

    IQ.Chill


    Nutzt fÃŧr die Längsregelung das " +"Ãŧbliche verkehrsabhängige Tempomatverhalten.

    Neue " +"Fahrvisualisierung


    Die Fahrvisualisierung wechselt bei niedrigen " +"Geschwindigkeiten zur nach vorn gerichteten Weitwinkelkamera, um manche " +"Kurven besser zu zeigen. Außerdem erscheint oben rechts das IQ.Pilot-Logo." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "LängsmanÃļvermodus" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "Abstimmungsprofil der Längsregelung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "vorausschau hÃļher" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "vorausschau niedriger" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "Abbiegeplanung bei niedriger Geschwindigkeit" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"Filtert die geplante KrÃŧmmung bei MEB- und MQB-Evo-Fahrzeugen tiefpass, " +"bevor sie die Lenkung erreicht, und dämpft so seitliches Pendeln. FÃŧr " +"diese Fahrzeuge standardmäßig an." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "MANUELL" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "MAX" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "MQB-ACC-Wiederanfahren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "MQB ACC-wiederanfahren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "MQB-Lenksperre" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "MQB lenksperre" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "Wartung" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "Manueller VerzÃļgerungs-Offset" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "Kartendatenbank" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "Gemessen:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "Meilen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "Spiegelt die Blinker des Fahrzeugs als Pfeile auf dem Fahrbildschirm." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "modell-stoppzeit" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "Modelle" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "k. A." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "KEIN PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "KEINE" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "Navigation" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "Navigation abgebrochen" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "Nah" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "Netzwerk" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "neuronales netz FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "Neuronale Netz-Vorsteuerung (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "Nie schlafen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "Nein" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "Ohne Lenkimpuls" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "Kein QR-Code erkannt" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "Keine SSH‑SchlÃŧssel fÃŧr Benutzer '{}' gefunden" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "Keine WLAN-Netzwerke gefunden" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "" +"Keine Kamera im Entwicklermodus erkannt. Zum Fortfahren auf PrÃŧfen tippen." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "Keine Versionshinweise verfÃŧgbar." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "Keine Ergebnisse" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "Keine Routen aufgezeichnet" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "Kein Fahrzeug festgelegt" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "Kein Video fÃŧr diese Kamera" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"Normalerweise beendet ein ManÃļver den Spurwechsel, selbst wenn der Blinker " +"gesetzt bleibt. Aktiviere dies, um weitere Wechsel aneinanderzureihen, " +"solange der Blinker an ist — jeder weitere verlangt weiterhin einen " +"Lenkimpuls." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "Auf dieser Subaru-Plattform nicht verfÃŧgbar." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "Nicht verbunden" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "Nicht gesetzt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"Hinweis: Bei Fahrzeugen ohne LFA/LKAS-Taste verhindert das Deaktivieren, " +"dass sich die LenkunterstÃŧtzung beim Wechsel der Tempomat-VerfÃŧgbarkeit " +"scharf schaltet." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "Lenkimpuls" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "OFFLINE" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "ONLINE" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "Aus" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "Offline-Karten auf dem Bildschirm" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "Geparkt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "Abschalt-Timer im Parkmodus" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "Geparkt: landet bei jedem Start und Aufwachen in „Dauerparken“." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "Offset:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "Auf dem Gerät" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "Online-Karten auf dem Bildschirm" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "Entwickler-Oberfläche während der Fahrt" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "Öffne die Konn3kt-App auf deinem Telefon" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "Optionaler Name" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"Blendet während der Fahrt eine Leiste mit Live-Regelwerten ein (Lenkung, " +"Querbeschleunigung, Daten zum Vorderfahrzeug)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "KOPPELN" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "LETZTE WOCHE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "PQ-HCA-Status-7-Modus" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "PQ HCA status 7 modus" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "VORSCHAU" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "Gerät koppeln" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "Jetzt abonnieren" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "Gerät koppeln" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Verbinde dein Gerät in der Konn3kt-App" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Verbinde dein Gerät in der Konn3kt-App." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "Koppeln Sie Ihr Gerät mit Ihrem comma‑Konto" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "Updates pausieren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "Suche durchfÃŧhren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" +"Lege fest, wie die LenkunterstÃŧtzung reagiert, wenn der Fahrer in IQ.Pilot " +"bremst." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "" +"Lege fest, was ein Tritt auf das Bremspedal mit der LenkunterstÃŧtzung macht." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"Lege fest, ob ein bereitstehendes Update auf deine Freigabe wartet oder sich" +" selbst herunterlädt und installiert." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "Fahrzeug auswählen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "" +"Lege ein Fahrzeug fest, um die automatische Erkennung zu Ãŧberspringen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"Heftet Live-Werte (Abstand, Geschwindigkeit, Zeit zum Vorderfahrzeug) an die" +" Markierung des vorausfahrenden Autos. Erfordert, dass IQ.Pilot Gas und " +"Bremse steuert." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "Bitte mit WLAN verbinden, um das erste Koppeln abzuschließen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "Bitte mit dem WLAN verbinden, um die erste Kopplung abzuschließen." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "Bitte mit dem WLAN verbinden, um deinen SchlÃŧssel zu laden." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "Bitte mit dem WLAN verbinden, um zu aktualisieren." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "" +"Richte die Fahrerkamera auf einen eSIM-QR-Code des Anbieters (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "Policy-Gewichte" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "Ausschalten" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"Schaltet das Gerät ab, nachdem es so lange bei ausgeschaltetem Motor gestanden hat.\n" +"(Standard: 30 Std.)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "Vorausschauend" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "" +"Vorausschauende Abstimmung: antizipiert und glättet " +"Beschleunigungsänderungen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "Vorab herunterladen + vorinstallieren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "Nur vorab herunterladen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "Kartenkacheln werden vorbereitet..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "Große Datenuploads bei getakteter WLAN-Verbindung verhindern" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "Große Datenuploads bei getakteter Mobilfunkverbindung verhindern" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"Vorschau der Fahrer‑Kamera, um sicherzustellen, dass die FahrerÃŧberwachung " +"gute Sicht hat. (Fahrzeug muss ausgeschaltet sein)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "Profilaktionen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"Lädt laufend Mapbox-Kacheln fÃŧr die Bildschirmkarte, sobald das Gerät " +"Internet hat." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "Modell-Cache leeren" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"Versetze das Gerät in „Dauerparken“ oder schalte das Fahrzeug aus, bevor du " +"änderst, wie Updates installiert werden." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"Versetze das Gerät in „Dauerparken“ oder schalte das Fahrzeug aus, bevor du " +"diese änderst." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "QR‑Code‑Fehler" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "QR-Code akzeptiert" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "BEREIT" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "ERNEUT LADEN" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "AKTUALISIEREN" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "ENTFERNEN" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "ENTFERNE..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "ZURÜCKSETZEN" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "ANSEHEN" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "Lenkgetriebe:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"Neu montieren, wenn dein Gesicht verdeckt ist oder die FahrerÃŧberwachung es " +"schwer erfassen kann." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "" +"Nur erreichbar, wenn das Fahrzeug ausgeschaltet oder „Dauerparken“ aktiviert" +" ist." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "Neustart" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "Gerät neu starten" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "Neustarten und aktualisieren" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"Erhalten Sie Warnungen, um zurÃŧck in die Spur zu lenken, wenn Ihr Fahrzeug " +"ohne Blinker Ãŧber eine erkannte Spurlinie driftet und Ãŧber 31 mph (50 km/h) " +"fährt." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "Fahrerkamera aufzeichnen und hochladen" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "Mikrofonton aufzeichnen und hochladen" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"Mikrofonton während der Fahrt aufzeichnen und speichern. Die Audiospur wird " +"im Dashcam‑Video in Konn3kt enthalten sein." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"Fahrdaten und Videos aufzeichnen und hochladen. Deaktivieren stoppt jede " +"Aufzeichnung! Keine Logs, kein Video, kein Ton." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "Erneut herunterladen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "Aktuelles Modell erneut laden" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "Profile aktualisieren" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "Vorschriften" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "Entspannt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "Modellliste neu laden" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "Aktiv bleiben: Bremsen unterbricht die LenkunterstÃŧtzung nie." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "Fernzugriff" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "Entfernen" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Comma pSIM entfernen" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "Umbenennen" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "Profil umbenennen" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "ZeitÃŧberschreitung bei der Anfrage" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "Erfordert die aktivierte IQ.Pilot-Längsregelung (Alpha)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "ZurÃŧcksetzen" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "Kalibrierung zurÃŧcksetzen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "Standard wiederherstellen" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "Trainingsanleitung ansehen" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "" +"ÜberprÃŧfen Sie die Regeln, Funktionen und Einschränkungen von IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "straßenname" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "Straßenname einblenden" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "Routen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "Version der Routing-Engine" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "Die kompakte comma-4-Oberfläche (mici) auf diesem Gerät ausfÃŧhren" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "AUSWÄHLEN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC auto-bestätigung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC hÃļheres bestätigen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC niedrigeres bestätigen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC rÃŧckfall IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC online-fÃŧller" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC Ãŧberschreibung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC richtlinie" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "SSH‑SchlÃŧssel" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "SSH-schlÃŧssel" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "SERIEN-ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "Scannen" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "QR scannen" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "QR-Code scannen oder Aktivierungscode eingeben" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "WLAN‑Netzwerke werden gesucht..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "Suchen" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "Adresse oder Ort suchen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "Marke oder Modell suchen" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "Suche..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "Auswählen" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "Branch auswählen" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "Sprache auswählen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "Selbstlernende LenkverzÃļgerung" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "Seriennummer" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "Zuhause festlegen" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "Einheiten nach Standort" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "Arbeit festlegen" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "Heimatadresse festlegen" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"Einheiten anhand des Gerätestandorts festlegen. Geschwindigkeiten wechseln " +"Ãŧberall auf km/h außer in den USA, dem Vereinigten KÃļnigreich und Liberia " +"und werden beim GrenzÃŧbertritt erneut geprÃŧft." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "Arbeitsadresse festlegen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"Legt die Geschwindigkeitsschwelle fÃŧr AbbiegewÃŧnsche fest. Unterhalb dieses " +"Werts kÃļnnen AbbiegewÃŧnsche den nächstgelegenen befahrbaren Abbiegeweg " +"planen. Standard ist 19 mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"Legt fest, in welchen Zustand das Gerät nach einem Start oder dem Aufwachen " +"aus dem Ruhezustand geht." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "Einstellungen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"Zeigt den Namen der aktuellen Straße Ãŧber der Fahransicht.
    Erfordert " +"installierte Offline-Kartendaten fÃŧr deine Region." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "Sanfte Lenkung" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "Update verschieben" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "Software" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "Geschwindigkeit" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "Tempolimit" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "Tempolimit-Steuerung" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "Standard" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"Standard wird empfohlen. Im aggressiven Modus folgt IQ.Pilot vorausfahrenden" +" Fahrzeugen näher und ist beim Gasgeben und Bremsen aggressiver. Im " +"entspannten Modus bleibt IQ.Pilot weiter entfernt. Bei unterstÃŧtzten " +"Fahrzeugen kÃļnnen Sie mit der Abstandstaste am Lenkrad zwischen diesen " +"Profilen wechseln." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "Bereitschaft" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"Bereitschaft: Bremsen setzt die LenkunterstÃŧtzung aus; sie kehrt zurÃŧck, " +"sobald du vom Pedal gehst." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "Download starten" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" +"Starte das Fahrzeug, um die Kompatibilität des LenkunterstÃŧtzungsverhaltens " +"zu prÃŧfen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "Bundesstaat" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "Statistiken" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "Status" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Aktiv bleiben" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "Lenkung" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "Verhalten der LenkunterstÃŧtzung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Lenkkraft-Bogen" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "Serien-ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "Download stoppen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Stop-and-Go-Variante fÃŧr Subaru-Global-Fahrzeuge mit manueller Handbremse. " +"Bei Fahrzeugen mit elektrischer Feststellbremse ausgeschaltet lassen. Danke " +"an martinl fÃŧr diese Umsetzung!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "Gespeicherte Karten" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "Streaming aus der Cloud" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "Gerät in den Modus „Dauerparken“ schalten?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "Gerät in den erzwungenen Parkmodus schalten?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "System" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "System reagiert nicht" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "SOFORT DIE KONTROLLE ÜBERNEHMEN" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "TEMP" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "TEMP HOCH" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "TEMP OK" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "Tippe auf „Add Device“ und scanne den QR-Code rechts" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "Ziel-Branch" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "Tethering‑Passwort" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"Das gewählte Modell hat sich geändert. Wir empfehlen, die Kalibrierung " +"zurÃŧckzusetzen. MÃļchtest du das jetzt tun?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "Danach gibt es kein ZurÃŧck — letzte Gelegenheit abzubrechen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "Dies erfordert einen Neustart. Jetzt neu starten?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "Diese Plattform ist auf den Modus „Deaktivieren“ beschränkt." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "" +"Diese Plattform unterstÃŧtzt nur einen eingeschränkten Satz an Optionen fÃŧr " +"das Verhalten der LenkunterstÃŧtzung." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" +"Diese Plattform unterstÃŧtzt die vollständige Konfiguration des " +"LenkunterstÃŧtzungsverhaltens." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"Dadurch werden ALLE heruntergeladenen Karten gelÃļscht\n" +"\n" +"MÃļchtest du wirklich alle Karten lÃļschen?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"Dadurch werden ALLE heruntergeladenen Modelle außer dem aktiven aus dem " +"Cache gelÃļscht. Bist du sicher?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "Dadurch wird das Comma-pSIM-Profil dauerhaft von der SIM gelÃļscht." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "Dies startet den Download, der eine Weile dauern kann." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "Zeit" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "Schalter" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "Gesamt:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"Zeichnet einen Bogen Ãŧber die Straßenansicht, der zeigt, wie stark IQ.Pilot " +"lenkt, während die Querregelung aktiv ist." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "EinfÃŧhrung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "blinker" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"Schaltet die Suche nach Over-the-Air-Updates vollständig ab.
    Neustart " +"erforderlich, damit dies wirksam wird." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "" +"Gib ein Jahr und dann ein Modell ein — zum Beispiel 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "Zum Suchen tippen" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "NICHT VERFÜGBAR" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "DEINSTALLIEREN" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "UPDATE" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "USB-Speicher" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "NUTZEN" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "Video konnte nicht geladen werden" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "Nicht verfÃŧgbar, solange das Fahrzeug fährt." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "" +"Nicht verfÃŧgbar — die IQ.Pilot-Längsregelung ist in diesem Fahrzeug nicht " +"aktiv." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "Nicht erkannt und nicht festgelegt" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "Deinstallieren" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "Unbekannt" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "Unbekannter Anbieter" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "Unbegrenzter Routenspeicher" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "Installationsmodus fÃŧr Updates" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "Updates werden nur heruntergeladen, wenn das Auto aus ist." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "Während der Fahrt hochladen" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"Daten von der Fahrer‑Kamera hochladen und den FahrerÃŧberwachungs‑Algorithmus" +" verbessern." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "Hochgeladen" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "Wird hochgeladen" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"Verwendet HCA-Status 7 statt Status 5 fÃŧr die Lenkungssteuerung bei " +"Fahrzeugen der PQ-Plattform. Das kann die Kompatibilität mit einigen älteren" +" Volkswagen-Modellen verbessern." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "Metersystem verwenden" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"Aktivierungscode verwenden:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"Verwenden Sie IQ.Pilot fÃŧr adaptive Geschwindigkeitsregelung und " +"Spurhalteassistenz. Ihre Aufmerksamkeit ist jederzeit erforderlich, um diese" +" Funktion zu nutzen." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "FAHRZEUG" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "ANSEHEN" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (virtuelle Drehmomentmischung)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "Fahrzeug" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"Die Längsregelungsfähigkeit des Fahrzeugs wurde noch nicht erkannt. Starte " +"das Auto einmal, um die UnterstÃŧtzung zu erkennen." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Videoplayer" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "Fehlerprotokoll fÃŧr IQ.Pilot-AbstÃŧrze anzeigen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "Vision-Gewichte" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "Darstellung" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "Warte auf GPS-Fix..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"Warte auf die Fahrerkamera. Nutze den eSIM-QR-Code des Anbieters oder gib " +"den LPA-Code manuell ein." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "Warten auf Start" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "Warnung" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"Warnung: Dies gewährt SSH-Zugriff fÃŧr alle Ãļffentlichen SchlÃŧssel in deinen " +"GitHub-Einstellungen. Gib niemals einen anderen GitHub-Benutzernamen als " +"deinen eigenen ein. Ein IQ.Pilot-Mitarbeiter wird dich NIEMALS bitten, " +"seinen GitHub-Benutzernamen hinzuzufÃŧgen." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"Warnung: Die Lenkung kann in Kurven unterhalb von {} schwingen; schalte dies" +" aus, wenn du es spÃŧrst." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "Willkommen bei IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "Wenn aktiviert, deaktiviert das DrÃŧcken des Gaspedals IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "WLAN" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Getaktetes WLAN‑Netzwerk" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "Arbeit" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "Falsches Passwort" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "Ja" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "Ja, alle Karten lÃļschen" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "" +"Du musst die Nutzungsbedingungen akzeptieren, um IQ.Pilot zu verwenden." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"Du musst die Nutzungsbedingungen akzeptieren, um IQ.Pilot zu verwenden. Lies" +" die aktuellen Bedingungen vor dem Fortfahren unter https://iqlvbs.com/tos." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"Danach musst du dein eigenes eSIM-Profil verwenden. Comma Prime kann nicht " +"erneut genutzt werden, es sei denn, du kaufst eine neue SIM von comma." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "aktivieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "aktiv" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "aktives modell" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "eSIM-profil hinzufÃŧgen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "profil hinzufÃŧgen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "aggressiv" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "APN-einstellungen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "auto dunkel" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"automatische\n" +"Updates" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "zurÃŧck" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "branch" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "dimm-verzÃļgerung" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "berechne Meilen..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "Kamera startet" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "mobilfunk getaktet" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"sprache\n" +"ändern" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "nach update suchen" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "prÃŧfe..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "kombiniert" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "kombiniertes modell" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "konfiguriert" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "verbinden" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "verbunden" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "verbinde..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "weiter" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "steuerung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "anfahren aus dem stand (beta)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "tempomat" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "krÃŧmmungsregler" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "ablehnen" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "Standard" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "lÃļschen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "entwickler" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "gerät" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "geräte-ID" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"parkmodus\n" +"freigeben" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "parkmodus freigeben" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "deaktiviert" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "trenne..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "deaktivieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "bei gaspedal deaktivieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "anzeige" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "bildschirmhelligkeit" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "unten" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "update laden" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "wird geladen" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "lade herunter..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"fahrerkamera-\n" +"vorschau" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "helligkeit beim fahren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "dynamisch" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "dashcam aktivieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "roaming aktivieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "aktiviert" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "werks-längsregelung erzwingen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "APN eingeben" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "GitHub-benutzernamen eingeben..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "LPA-aktivierungscode eingeben..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "code eingeben" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "passwort eingeben..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "ÜberprÃŧfung auf Updates fehlgeschlagen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "update fehlgeschlagen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "schnell" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "schließe Update ab..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "fÃŧr „{}“" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "fÃŧr Updates aus privaten Branches" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"parkmodus\n" +"erzwingen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "mici-oberfläche erzwingen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "parkmodus erzwingen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "vergesse..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "Format: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "aus dem Cache" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "hyundai längs-abstimmung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "info" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "update installieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "interaktivität" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "iq.dynamic einstellungen" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "spurwechsel" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "spurverlassenswarnung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "abbiegetempo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "quermanÃļver-modus" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "quer bei tempomat-stÃļrung" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "fÃŧr automatische Konfiguration leer lassen" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "leer lassen zum Überspringen" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "Benutzernamen und Token leer lassen zum LÃļschen" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "links" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "längsmanÃļver-modus" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "abbiegeplanung bei niedrigem tempo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "m" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "profile verwalten" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "manuell" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "manueller verzÃļgerungs-offset" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "nur karte" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "karte bevorzugt" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "getaktet" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "modelle" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "netzwerk" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "netzwerknutzung" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "nie" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "nein" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "keine Warnungen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "ohne lenkimpuls" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "normal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "nicht in reichweite" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "jetzt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "lenkimpuls" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "aus" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "offline" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "an" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "online" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "optionaler name..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "in app koppeln" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "mit Konn3kt koppeln" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "policy-gewichte" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "ausschalten" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "vorausschauend" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "profilaktionen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "anbieter unbekannt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "modell-cache leeren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "in warteschlange" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "bereit" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "neu starten" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "fahrerkamera aufnehmen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "mikrofonton aufnehmen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "modell neu laden" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "profile aktualisieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "zulassungsinfos" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "entspannt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "modellliste neu laden" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "comma pSIM entfernen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "umbenennen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "profil umbenennen..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "zurÃŧcksetzen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "kalibrierung zurÃŧcksetzen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"einfÃŧhrung\n" +"ansehen" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "rechts" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "s" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "QR scannen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "QR scannen / code eingeben" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "suche netzwerke" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "selbstlernende lenkverzÃļgerung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "seriennummer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "sollgeschwindigkeit" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "einheiten nach standort" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"wischen zum\n" +"cache leeren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"wischen zum\n" +"trennen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"wischen zum\n" +"vergessen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"wischen zum\n" +"neu laden" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"wischen zum\n" +"kalibrieren" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"wischen zum\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"wischen zum entfernen\n" +"der comma pSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "langsam" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "sanfte lenkung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "software" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "tempolimit-einstellungen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "standard" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "bereitschaft" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"starte das auto, um\n" +"IQ.Pilot zu nutzen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "starte..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "status" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "aktiv bleiben" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "lenkung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "verhalten der lenkunterstÃŧtzung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "serie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "stop-and-go handbremse" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "download stoppen" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "system startet" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "ziel-branch" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"nutzungs-\n" +"bedingungen" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "tethering" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "tethering-passwort" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "schalter" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "fahrten" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "deinstallieren" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "IQ.Pilot deinstallieren" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "unbegrenzt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "nicht unterstÃŧtzt" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "oben" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "aktuell" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "Aktuell, zuletzt geprÃŧft: nie" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "Aktuell, zuletzt geprÃŧft: {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"update-\n" +"installationsmodus" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "Update verfÃŧgbar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"updater antwortet\n" +"nicht" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "metrische einheiten" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "fahrzeug" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "version" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "virtuelle drehmomentmischung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "vision-gewichte" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "darstellung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "warnung" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wlan" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "falsches passwort" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "ja" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} WARNUNG" +msgstr[1] "{} WARNUNGEN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "vor {} Tag" +msgstr[1] "vor {} Tagen" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "vor {} Stunde" +msgstr[1] "vor {} Stunden" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "vor {} Minute" +msgstr[1] "vor {} Minuten" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 Jahr Fahrtdatenspeicherung" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "24/7 LTE‑Verbindung" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "WARNUNG: Die Längsregelung von openpilot befindet sich fÃŧr dieses " +#~ "Fahrzeug in der Alpha-Phase und deaktiviert das automatische Notbremssystem " +#~ "(AEB).

    Auf diesem Fahrzeug verwendet openpilot standardmäßig den " +#~ "integrierten ACC statt der openpilot-Längsregelung. Aktivieren Sie dies, um " +#~ "auf die openpilot-Längsregelung umzuschalten. Das Aktivieren des " +#~ "Experimentalmodus wird empfohlen, wenn Sie die openpilot-Längsregelung " +#~ "(Alpha) aktivieren." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB (Android Debug Bridge) ermÃļglicht die Verbindung mit Ihrem Gerät Ãŧber " +#~ "USB oder Ãŧber das Netzwerk. Siehe https://docs.comma.ai/how-to/connect-to-" +#~ "comma fÃŧr weitere Informationen." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "Immer aktive FahrerÃŧberwachung" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "" +#~ "Eine Alpha-Version der openpilot-Längsregelung kann zusammen mit dem " +#~ "Experimentalmodus auf Nicht-Release-Zweigen getestet werden." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "" +#~ "FÃŧgen Sie konn3kt.com Ihrem Startbildschirm hinzu, um es wie eine App zu " +#~ "verwenden" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "CHILL‑MODUS AKTIV" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "" +#~ " Durch Ändern dieser Einstellung wird openpilot neu gestartet, wenn das Auto" +#~ " eingeschaltet ist." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "Klicken Sie auf \"add new device\" und scannen Sie den QR‑Code rechts" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "Ablehnen, openpilot deinstallieren" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "EXPERIMENTALMODUS AKTIV" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "FahrerÃŧberwachung auch aktivieren, wenn openpilot nicht aktiv ist." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "openpilot aktivieren" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "" +#~ "Den Schalter fÃŧr die openpilot-Längsregelung (Alpha) aktivieren, um den " +#~ "Experimentalmodus zu erlauben." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "Experimentalmodus" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "" +#~ "Der Experimentalmodus ist derzeit auf diesem Fahrzeug nicht verfÃŧgbar, da " +#~ "der serienmäßige ACC fÃŧr die Längsregelung verwendet wird." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "PRIME‑FUNKTIONEN:" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Firehose‑Modus" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "FÃŧr maximale Wirksamkeit bringen Sie Ihr Gerät regelmäßig ins Haus und verbinden es wÃļchentlich mit einem guten USB‑C‑Adapter und WLAN.\n" +#~ "\n" +#~ "Der Firehose‑Modus kann auch während der Fahrt funktionieren, wenn eine Verbindung zu einem Hotspot oder einer unbegrenzten SIM besteht.\n" +#~ "\n" +#~ "\n" +#~ "Häufig gestellte Fragen\n" +#~ "\n" +#~ "Spielt es eine Rolle, wie oder wo ich fahre? Nein, fahren Sie einfach wie gewÃļhnlich.\n" +#~ "\n" +#~ "Werden alle meine Segmente im Firehose‑Modus abgeholt? Nein, wir ziehen selektiv eine Teilmenge Ihrer Segmente.\n" +#~ "\n" +#~ "Was ist ein guter USB‑C‑Adapter? Jeder schnelle Telefon‑ oder Laptoplader sollte ausreichen.\n" +#~ "\n" +#~ "Spielt es eine Rolle, welche Software ich verwende? Ja, nur Upstream‑openpilot (und bestimmte Forks) kÃļnnen fÃŧr das Training verwendet werden." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "Gehen Sie auf Ihrem Telefon zu https://konn3kt.com" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "INAKTIV: Mit einem unlimitierten Netzwerk verbinden" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "Joystick‑Debugmodus" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "" +#~ "Maximieren Sie Ihre Trainingsdaten‑Uploads, um die Fahrmodelle von openpilot" +#~ " zu verbessern." + +#~ msgid "NO" +#~ msgstr "KEIN" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "Keine SSH‑SchlÃŧssel gefunden" + +#, python-format +#~ msgid "Open" +#~ msgstr "Öffnen" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "" +#~ "Koppeln Sie Ihr Gerät mit Konn3kt (konn3kt.com) und lÃļsen Sie Ihr " +#~ "comma‑prime‑Angebot ein." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "Werden Sie Konn3kt Mitglied auf konn3kt.com" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "Remote‑SchnappschÃŧsse" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "" +#~ "ÜberprÃŧfen Sie die Regeln, Funktionen und Einschränkungen von openpilot" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "Standard wird empfohlen. Im aggressiven Modus folgt openpilot " +#~ "vorausfahrenden Fahrzeugen näher und ist beim Gasgeben und Bremsen " +#~ "aggressiver. Im entspannten Modus bleibt openpilot weiter entfernt. Bei " +#~ "unterstÃŧtzten Fahrzeugen kÃļnnen Sie mit der Abstandstaste am Lenkrad " +#~ "zwischen diesen Profilen wechseln." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "" +#~ "Verwenden Sie openpilot fÃŧr adaptive Geschwindigkeitsregelung und " +#~ "Spurhalteassistenz. Ihre Aufmerksamkeit ist jederzeit erforderlich, um diese" +#~ " Funktion zu nutzen." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "Warnung: Dies gewährt SSH‑Zugriff auf alle Ãļffentlichen SchlÃŧssel in Ihren " +#~ "GitHub‑Einstellungen. Geben Sie niemals einen anderen GitHub‑Benutzernamen " +#~ "als Ihren eigenen ein. Ein comma‑Mitarbeiter wird Sie NIEMALS bitten, seinen" +#~ " GitHub‑Benutzernamen hinzuzufÃŧgen." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "Willkommen bei openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "Wenn aktiviert, deaktiviert das DrÃŧcken des Gaspedals openpilot." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "" +#~ "Sie mÃŧssen die Nutzungsbedingungen akzeptieren, um openpilot zu verwenden." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "Sie mÃŧssen die Nutzungsbedingungen akzeptieren, um openpilot zu verwenden. " +#~ "Lesen Sie die aktuellen Bedingungen unter https://comma.ai/terms, bevor Sie " +#~ "fortfahren." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "openpilot Längsregelung (Alpha)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot nicht verfÃŧgbar" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilot fährt standardmäßig im Chill‑Modus. Der Experimentalmodus " +#~ "aktiviert Funktionen im Alpha‑Status, die fÃŧr den Chill‑Modus noch nicht " +#~ "bereit sind. Die experimentellen Funktionen sind unten " +#~ "aufgefÃŧhrt:

    End-to‑End‑Längsregelung


    Das Fahrmodell steuert " +#~ "Gas und Bremse. openpilot fährt so, wie es einen Menschen einschätzt, " +#~ "einschließlich Anhalten an roten Ampeln und Stoppschildern. Da das Modell " +#~ "die Geschwindigkeit bestimmt, dient die eingestellte Geschwindigkeit nur als" +#~ " Obergrenze. Dies ist eine Alpha‑Funktion; Fehler sind zu " +#~ "erwarten.

    Neue Fahrvisualisierung


    Die Visualisierung wechselt" +#~ " bei niedriger Geschwindigkeit auf die nach vorn gerichtete " +#~ "Weitwinkelkamera, um manche Kurven besser zu zeigen. Das " +#~ "Experimentalmodus‑Logo wird außerdem oben rechts angezeigt." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ " Durch Ändern dieser Einstellung wird openpilot neu gestartet, wenn das Auto" +#~ " eingeschaltet ist." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilot lernt das Fahren, indem es Menschen wie Sie beobachtet.\n" +#~ "\n" +#~ "Der Firehose‑Modus ermÃļglicht es Ihnen, Ihre Trainingsdaten‑Uploads zu maximieren, um die Fahrmodelle von openpilot zu verbessern. Mehr Daten bedeuten grÃļßere Modelle – und damit einen besseren Experimentalmodus." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "" +#~ "Die openpilot‑Längsregelung kÃļnnte in einem zukÃŧnftigen Update kommen." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "" +#~ "openpilot erfordert, dass das Gerät innerhalb von 4° nach links oder rechts " +#~ "und innerhalb von 5° nach oben oder 9° nach unten montiert ist." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "{} Segment Ihrer Fahrten ist bisher im Trainingsdatensatz." +#~ msgstr[1] "{} Segmente Ihrer Fahrten sind bisher im Trainingsdatensatz." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ ABONNIERT" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Firehose‑Modus đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_en.mo b/iqpilot/selfdrive/ui/translations/app_en.mo new file mode 100644 index 000000000..b12773ae2 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_en.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_en.po b/iqpilot/selfdrive/ui/translations/app_en.po new file mode 100644 index 000000000..666d50ef0 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_en.po @@ -0,0 +1,4654 @@ +# English translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-21 18:18-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (Default)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " Steering torque response calibration is complete." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " Steering torque response calibration is {}% complete." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " Your device is pointed {:.1f}° {} and {:.1f}° {}." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    Steering lag calibration is complete." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    Steering lag calibration is {}% complete." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "ACTIVE" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "ADD" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "ALL TIME" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "APN Setting" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "AUTH" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "AUTO" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "Acceleration Bar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "Acceleration Meter" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "Acknowledge Excessive Actuation" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "Activate" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "Active Model" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "Active above {} only." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "Add Profile" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "Add eSIM Profile" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "Adjust Lane Turn Desire Speed" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "Advanced" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "Aggressive" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "Agree" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "All" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "All states (~6.0 GB)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "Always on Lateral (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "And so much more" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "Applies right away." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "Applies the next time the device goes offroad." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "Are you sure you want to power off?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "Are you sure you want to reboot?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "Are you sure you want to reset calibration?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "Are you sure you want to uninstall?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "Auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "Auto Lane Change" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "Auto Lane Change: Continuous Changes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "Auto — Dim" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "Auto-Close Settings" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "Availability While Cruise Changes" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "Back" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "Blind Spot Alerts" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "Blind Spot Warnings" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "Blinker Indicators" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "Blinker-Initiated Lane Change" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "Boot State" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "Brake Response Mode" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "CHANGE" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "CHECK" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "CLEAR" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "CONNECT" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "CONNECTING..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "Cancel" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "Cancel navigation" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "Cellular Metered" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "Change Language" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "Changing this setting will restart IQ.Pilot if the car is powered on." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "Checked {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "Choose a Model" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "Chosen manually" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "Clear Cache" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "Clear the selected model cache and download it again?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "Close" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "Cloud" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "Cloud only" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "Cloud video unavailable" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "Colour key for fingerprint state:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "Combined Model" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "Confirm" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "Continue" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "Continuous Changes" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "Control" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "Couldn't fetch SSH keys - see logs" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "Couldn't locate that place" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "Couldn't reach GitHub - check connection" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "Couldn't verify GitHub - check device time" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "Country" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "Crash Log" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "Creep from Standstill (Beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "Creep from Standstill — Manual Handbrake (Beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "Cruise" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "Current Version" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "Curvature Controller" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "DELETE" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "DISCONNECTING..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "DOWNLOAD" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "Decline" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "Decline, uninstall IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "Default" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "Default (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "Default: comes up ready to drive, engagement available straight away." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "Delay with Blind Spot" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "Delete" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "Delete disabled profile \"{}\"?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "Delete this log?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "Destination set" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "Detected automatically" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "Developer" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "Device" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "Device must be registered with Konn3kt to pair." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "Dim Delay" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "Disconnect" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "Disengage" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "Disengage before forcing offroad" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "Disengage before forcing on-road" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "Disengage on Accelerator Pedal" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "Disengage to Power Off" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "Disengage to Reboot" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "Disengage to Reset Calibration" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "Disengage to {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "Disengage: braking shuts steering assistance off entirely." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "Display" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "Display Brightness" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "Display speed in km/h instead of mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "Distance" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "Do you want to upload driver camera data?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "Done" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "Dongle ID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "Download" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "Download failed — try again." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "Downloading Map Tiles" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "Driver Camera" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "Driver Camera Check" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "Driver Intervention Handling" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "Drives" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "Driving Brightness" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "Driving Personality" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "Dynamic" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "Dynamic tuning: livelier gas/brake response." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "EDIT" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "ERROR" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "Enable" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "Enable ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "Enable Dashcam" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "Enable Lane Departure Warnings" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "Enable Roaming" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "Enable SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "Enable Tethering" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "Enable driver monitoring even when IQ.Pilot is not engaged." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "Enter APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "Enter Activation Code" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "Enter Code" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "Enter SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "Enter an address or place" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "Enter new tethering password" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "Enter password" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "Enter your GitHub username" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "Error" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "Exit Offroad Mode" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Expanded Status Bar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "Experimental Lead MPC" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "FORGETTING..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "Factory-default longitudinal tuning." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "Favorites" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "Fetching Map" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "Fetching Maps..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "Final Warning" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "Find your vehicle" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "Finish Setup" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "Follow Distance" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "Follow the prompts in the app to finish pairing" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Force Mici UI" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "Force On-Road (10 min)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "Force On-Road can only be started while offroad" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "Force On-Road is already active. Reset the timer to 10 minutes?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "Forced On-Road Active" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Forget" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "Forget Wi-Fi Network \"{}\"?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "GOOD" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Git Auth" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Git token / password" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Git username" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "GitHub error ({}) fetching keys" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "HIGH" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "Hidden Network" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "Hold Lane Change for Blind Spot" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "Hold steady..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Home" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "Hours" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"How long the settings screen may sit untouched before it closes itself." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "INSTALL" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "IP Address" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "IQ Force Stops" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "IQ Mode" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic Curves" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic Lead Speed" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic Low Speed" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic Model Stops" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic SLC Fallback" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic Slower Lead" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic Stopped Lead" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "IQ.OS Version" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot Unavailable" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "Info" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" +"Insert the original comma SIM card that came with the device to use eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "Install Update" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "Invalid QR code" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "KM" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "KONN3KT ERROR" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT OFFLINE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "Keep Device Offroad" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "Keep Factory Gas and Brake" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Konn3kt Features:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Konn3kt Status:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "LIMIT" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "LOADING" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "LOADING..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "Lane Change Options" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "Lateral Control When Cruise Faulted" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "Lateral Maneuver Mode" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "Lead Vehicle Readouts" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "Leave Always Offroad mode now?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "Leave forced-offroad mode now?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" +"Lets you nudge the wheel while engaged without fully disengaging steering." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "Live streaming" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "Loading %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "Loading video" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "Loading..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "Locating..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "Locked OFF on this platform; the vehicle can't support other choices." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "Longitudinal Control" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "Longitudinal Maneuver Mode" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "Longitudinal Tune Profile" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "Lookahead Higher" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "Lookahead Lower" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "Low-Speed Turn Planning" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "MANUAL" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "MAX" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "MQB ACC Resume" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "MQB ACC resume" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "MQB Steering Lockout" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "MQB steering lockout" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "Maintenance" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "Manual Delay Offset" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "Map Database" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "Measured:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "Miles" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "Mirror the car's blinkers as arrows on the driving screen." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "Model Stop Time" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "Models" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "N/A" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "NO PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "NONE" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "Navigation" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "Navigation canceled" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "Near" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "Network" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "Neural Net FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "Neural Network Feed Forward (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "Never Sleep" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "No" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "No Nudge" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "No QR detected" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "No SSH keys found for user '{}'" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "No Wi-Fi networks found" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "No camera detected in dev mode. Tap check to continue." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "No release notes available." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "No results" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "No routes recorded" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "No vehicle set" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "No video for this camera" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "Not available on this Subaru platform." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "Not connected" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "Not set" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "Nudge" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "OFFLINE" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "ONLINE" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "Off" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "Offline On-Screen Maps" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "Offroad" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "Offroad Shutdown Timer" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "Offroad: lands in Always Offroad every time it boots or wakes." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "Offset:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "On device" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "Online On-Screen Maps" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "Onroad Developer UI" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "Open the Konn3kt app on your phone" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "Optional Nickname" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "PAIR" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "PAST WEEK" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "PQ HCA Status 7 Mode" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "PQ HCA status 7 mode" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "PREVIEW" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "Pair Device" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "Pair Your Device" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "Pair device" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Pair your device in the Konn3kt app" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Pair your device in the Konn3kt app." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "Pair your device to your Konn3kt account" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "Pause Updates" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "Perform a search" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "Pick what a brake-pedal press does to steering assistance." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "Pick your vehicle" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "Pin a vehicle to skip auto-detection." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "Please connect to Wi-Fi to complete initial pairing" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "Please connect to Wi-Fi to complete initial pairing." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "Please connect to Wi-Fi to fetch your key." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "Please connect to Wi-Fi to update." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "Point the driver camera at a carrier eSIM QR code (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "Policy Weights" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "Power Off" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "Predictive" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "Predictive tuning: anticipates and smooths accel changes." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "Predownload + Preinstall" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "Predownload Only" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "Preparing Map Tiles..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "Prevent large data uploads when on a metered Wi-Fi connection" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "Prevent large data uploads when on a metered cellular connection" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "Profile Actions" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "Purge Model Cache" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "QR Code Error" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "QR accepted" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "READY" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "REDOWNLOAD" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "REFRESH" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "REMOVE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "REMOVING..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "RESET" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "REVIEW" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "Rack:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "Reachable only with the car switched off or Always Offroad turned on." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "Reboot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "Reboot Device" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "Reboot and Update" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "Record and Upload Driver Camera" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "Record and Upload Microphone Audio" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "Redownload" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "Redownload Current Model" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "Refresh Profiles" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "Regulatory" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "Relaxed" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "Reload Model List" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "Remain Active: braking never interrupts steering assistance." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "Remote access" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "Remove" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Remove Comma pSIM" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "Rename" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "Rename Profile" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "Request timed out" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "Reset" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "Reset Calibration" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "Restore Defaults" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "Review Training Guide" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "Review the rules, features, and limitations of IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "Road Name" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "Road Name Overlay" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "Routes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "Routing Engine Version" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "Run the compact comma 4 (mici) interface on this device" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "SELECT" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC Auto Confirm" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC Confirm Higher" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC Confirm Lower" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC Fallback IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC Online Filler" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC Override" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC Policy" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "SSH Keys" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "SSH keys" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "STOCK ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "Scan" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "Scan QR" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "Scan QR or enter activation code" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "Scanning Wi-Fi networks..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "Search" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "Search address or place" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "Search make or model" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "Searching..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "Select" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "Select a branch" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "Select a language" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "Self-Tuning Steer Delay" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "Serial" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "Set Home" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "Set Units From Location" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "Set Work" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "Set home address" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "Set work address" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"Sets which state the device settles into after a boot or a wake from sleep." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "Settings" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "Smooth Steering" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "Snooze Update" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "Software" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "Speed" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "Speed Limit" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "Speed Limit Control" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "Standard" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "Standby" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "Start Download" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" +"Start the vehicle to check steering assistance behavior compatibility." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "State" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "Stats" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "Status" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Stay Engaged" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "Steering" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "Steering Assistance Behavior" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Steering Effort Arc" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "Stock ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "Stop Download" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "Stored Maps" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "Streaming from cloud" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "Switch the device into Always Offroad mode?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "Switch the device into forced-offroad mode?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "System" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "System Unresponsive" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "TAKE CONTROL IMMEDIATELY" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "TEMP" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "TEMP HIGH" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "TEMP OK" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "Tap \"Add Device\" and scan the QR code on the right" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "Target Branch" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "Tethering Password" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "There's no undo once this runs — last chance to back out." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "This needs a reboot to apply. Restart now?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "This platform is limited to Disengage mode." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "" +"This platform supports a limited set of steering assistance behavior " +"options." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" +"This platform supports the full steering assistance behavior configuration." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "This will permanently wipe the Comma pSIM profile from the SIM." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "" +"This will start the download process and it might take a while to complete." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "Time" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "Toggles" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "Total:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "Training Guide" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "Turn Signals" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "Type a year then a model — for example, 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "Type to search" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "UNAVAILABLE" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "UNINSTALL" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "UPDATE" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "USB Storage" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "USE" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "Unable to load video" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "Unavailable while the car is onroad." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "" +"Unavailable — IQ.Pilot longitudinal control is not active on this car." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "Undetected and unset" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "Uninstall" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "Unknown" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "Unknown provider" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "Unlimited route storage" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "Update Install Mode" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "Updates are only downloaded while the car is off." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "Upload While Driving" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "Uploaded" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "Uploading" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "Use Metric System" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"Use activation code:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "VEHICLE" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "VIEW" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (Virtual Torque Blending)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "Vehicle" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Video Player" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "View the error log for IQ.Pilot crashes." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "Vision Weights" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "Visuals" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "Waiting for GPS fix..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "Waiting to start" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "Warning" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "Welcome to IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi-Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Wi-Fi Network Metered" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "Work" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "Wrong password" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "Yes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "Yes, delete all maps" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "You must accept the Terms of Service in order to use IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "activate" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "active" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "active model" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "add esim profile" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "add profile" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "aggressive" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "apn settings" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "auto dark" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"automatic\n" +"updates" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "back" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "branch" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "brightness delay" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "calculating miles..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "camera starting" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "cellular metered" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"change\n" +"language" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "check for update" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "checking..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "combined" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "combined model" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "configured" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "connect" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "connected" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "connecting..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "continue" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "control" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "creep from standstill (beta)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "cruise" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "curvature controller" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "decline" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "default" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "delete" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "developer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "device" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "device ID" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"disable\n" +"force offroad" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "disable force offroad" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "disabled" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "disconnecting..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "disengage" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "disengage on accelerator" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "display" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "display brightness" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "down" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "download update" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "downloading" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "downloading..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"driver\n" +"camera preview" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "driving brightness" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "dynamic" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "enable dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "enable roaming" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "enabled" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "enforce factory long." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "enter APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "enter GitHub username..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "enter LPA activation code..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "enter code" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "enter password..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "failed to check for update" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "failed to update" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "fast" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "finalizing update..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "for \"{}\"" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "for private branch updates" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"force\n" +"offroad" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "force mici UI" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "force offroad" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "forgetting..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "format: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "from cache" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "hyundai long. tuning" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "info" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "install update" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "interactivity" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "iq.dynamic settings" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "lane change" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "lane departure warnings" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "lane turn speed" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "lateral maneuver mode" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "lateral when cruise faulted" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "leave blank for automatic configuration" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "leave blank to skip" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "leave username and token blank to clear" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "left" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "longitudinal maneuver mode" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "low-speed turn planning" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "m" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "manage profiles" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "manual" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "manual delay offset" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "map only" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "map priority" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "metered" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "models" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "network" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "network usage" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "never" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "no" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "no alerts" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "no nudge" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "normal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "not in range" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "now" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "nudge" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "off" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "offline" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "on" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "online" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "optional nickname..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "pair in app" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "pair with Konn3kt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "policy weights" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "power off" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "predictive" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "profile actions" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "provider unknown" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "purge model cache" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "queued" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "ready" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "reboot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "record driver camera" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "record microphone audio" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "redownload model" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "refresh profiles" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "regulatory info" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "relaxed" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "reload model list" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "remove comma psim" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "rename" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "rename profile..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "reset" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "reset calibration" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"review\n" +"training guide" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "right" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "s" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "scan qr" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "scan qr / enter code" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "searching for networks" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "self-tuning steer delay" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "serial" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "set speed" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "set units from location" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"slide to\n" +"clear cache" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"slide to\n" +"disconnect" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"slide to\n" +"forget" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"slide to\n" +"redownload" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"slide to\n" +"reset calibration" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"slide to\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"slide to remove\n" +"comma psim" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "slow" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "smooth steering" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "software" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "speed limit settings" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "standard" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "standby" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"start the car to\n" +"use IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "starting..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "status" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "stay engaged" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "steering" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "steering assistance behavior" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "stock" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "stop and go manual brake" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "stop download" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "system booting" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "target branch" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"terms &\n" +"conditions" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "tethering" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "tethering password" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "toggles" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "trips" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "uninstall" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "uninstall IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "unmetered" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "unsupported" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "up" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "up to date" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "up to date, last checked never" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "up to date, last checked {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"update\n" +"install mode" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "update available" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"updater failed\n" +"to respond" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "use metric units" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "vehicle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "version" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "virtual torque blending" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "vision weights" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "visuals" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "warning" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "wrong password" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "yes" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} ALERT" +msgstr[1] "{} ALERTS" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{} day ago" +msgstr[1] "{} days ago" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{} hour ago" +msgstr[1] "{} hours ago" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{} minute ago" +msgstr[1] "{} minutes ago" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 year of drive storage" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "24/7 LTE connectivity" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "Always-On Driver Monitoring" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "Bookmark konn3kt.com to your home screen to use it like an app" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "CHILL MODE ON" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "Changing this setting will restart openpilot if the car is powered on." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "Click \"add new device\" and scan the QR code on the right" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "Decline, uninstall openpilot" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "EXPERIMENTAL MODE ON" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "Enable driver monitoring even when openpilot is not engaged." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "Enable openpilot" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "Experimental Mode" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "PRIME FEATURES:" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Firehose Mode" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "Go to https://konn3kt.com on your phone" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "INACTIVE: connect to an unmetered network" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "Joystick Debug Mode" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "" +#~ "Maximize your training data uploads to improve openpilot's driving models." + +#~ msgid "NO" +#~ msgstr "NO" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "No SSH keys found" + +#, python-format +#~ msgid "Open" +#~ msgstr "Open" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "Pair your device with Konn3kt at konn3kt.com" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "Remote snapshots" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "Review the rules, features, and limitations of openpilot" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "Welcome to openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "" +#~ "When enabled, pressing the accelerator pedal will disengage openpilot." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "You must accept the Terms and Conditions in order to use openpilot." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "openpilot Longitudinal Control (Alpha)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot Unavailable" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "openpilot longitudinal control may come in a future update." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "{} segment of your driving is in the training dataset so far." +#~ msgstr[1] "{} segments of your driving is in the training dataset so far." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ PAIRED" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Firehose Mode đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_es.mo b/iqpilot/selfdrive/ui/translations/app_es.mo new file mode 100644 index 000000000..24cf3a286 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_es.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_es.po b/iqpilot/selfdrive/ui/translations/app_es.po new file mode 100644 index 000000000..ea9c83265 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_es.po @@ -0,0 +1,4716 @@ +# Spanish translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-20 16:35-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (predeterminado)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " La calibraciÃŗn de respuesta de par de direcciÃŗn estÃĄ completa." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " La calibraciÃŗn de respuesta de par de direcciÃŗn estÃĄ {}% completa." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " Tu dispositivo estÃĄ orientado {:.1f}° {} y {:.1f}° {}." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    La calibraciÃŗn del retardo de direcciÃŗn se ha completado." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "" +"

    La calibraciÃŗn del retardo de direcciÃŗn estÃĄ completada al {}%." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "ACTIVO" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"ADB (Android Debug Bridge) permite conectarse a tu dispositivo por USB o por" +" la red." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "AÑADIR" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "DESDE SIEMPRE" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "Ajuste de APN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "AUTENTICAR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "AUTO" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "barra de aceleraciÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "Medidor de aceleraciÃŗn" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "Reconocer actuaciÃŗn excesiva" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "Activar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "Modelo activo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "Activo solo por encima de {}." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "AÃąadir perfil" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "AÃąadir perfil eSIM" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "Ajustar la velocidad de intenciÃŗn de giro" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "Avanzado" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"DespuÊs de esto, deberÃĄs usar tu propio perfil eSIM.\n" +"\n" +"No podrÃĄs volver a usar Comma Prime a menos que compres una SIM nueva de comma." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "Agresivo" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "Aceptar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "Todo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "Todos los estados (~6,0 GB)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"Permite que IQ.Pilot use el comportamiento de reanudaciÃŗn del ACC MQB en " +"vehículos Volkswagen MQB compatibles con FtS con retenciÃŗn extendida sin " +"reanudaciÃŗn automÃĄtica." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"Permite que el control lateral (direcciÃŗn) siga activo incluso cuando el " +"control longitudinal (acelerador/freno) no estÃĄ disponible temporalmente por" +" un fallo del control de crucero." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "Control lateral siempre activo (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "Y mucho mÃĄs" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "Se aplica de inmediato." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "Se aplica la prÃŗxima vez que el dispositivo pase a modo aparcado." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "ÂŋSeguro que quieres apagar?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "ÂŋSeguro que quieres reiniciar?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"ÂŋSeguro que quieres restablecer todos los ajustes de IQ.Pilot a sus valores " +"predeterminados? Una vez restablecidos, no hay vuelta atrÃĄs." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "ÂŋSeguro que quieres restablecer la calibraciÃŗn?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "ÂŋSeguro que quieres desinstalar?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "Auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "cambio de carril automÃĄtico" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "Cambio de carril automÃĄtico: cambios continuos" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "Auto — atenuado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "Cierre automÃĄtico de los ajustes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"Reanuda automÃĄticamente tras una parada al seguir al trÃĄfico, en las " +"plataformas Subaru en las que se aplica la implementaciÃŗn beta." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "Disponibilidad durante los cambios del crucero" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "AtrÃĄs" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "Alertas de ÃĄngulo muerto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "alertas de ÃĄngulo muerto" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "Indicadores de intermitentes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "Cambio de carril iniciado por el intermitente" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "Estado al arrancar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "Modo de respuesta al freno" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"Recupera la franja ancha de estado de aparcado de la interfaz clÃĄsica: " +"temperatura, vehículo y estado de Konn3kt de un vistazo." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "CAMBIAR" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "COMPROBAR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "VACIAR" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "CONECTAR" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "CONECTAR" + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "Cancelar" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "Cancelar navegaciÃŗn" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "Datos mÃŗviles con límite" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "Cambiar idioma" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" +" Cambiar esta configuraciÃŗn reiniciarÃĄ IQ.Pilot si el coche estÃĄ encendido." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "Comprobado {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "Elegir un modelo" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"Elige el comportamiento longitudinal: IQ.Pilot (longitudinal IQ + extremo a " +"extremo), IQ.Dynamic (longitudinal IQ + modo dinÃĄmico), IQ.Chill " +"(longitudinal IQ + perfil relajado) o ACC de fÃĄbrica." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "Elegido manualmente" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "Vaciar la cachÊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "ÂŋVaciar la cachÊ del modelo seleccionado y volver a descargarlo?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "Cerrar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"Cierra el lazo de direcciÃŗn en vehículos MEB y MQB Evo. IQ.Pilot corrige " +"su comando de direcciÃŗn segÃēn la curvatura que el coche mantiene " +"realmente, en lugar de enviar la curvatura planificada directamente." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "Nube" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "Solo nube" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "Vídeo en la nube no disponible" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "Leyenda de colores del estado de identificaciÃŗn:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "Modelo combinado" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"Ejecuta una secuencia programada de escalones de aceleraciÃŗn para medir la " +"respuesta del actuador longitudinal. Requiere el control longitudinal de " +"IQ.Pilot. Úsalo solo en una carretera despejada y cerrada." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"Ejecuta una secuencia programada de escalones de aceleraciÃŗn lateral para " +"medir la respuesta de la direcciÃŗn. Úsalo solo en una carretera recta, llana" +" y despejada." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "Confirmar" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "Continuar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "cambios continuos" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "Control" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"Controla el comportamiento de IQ.Pilot ante los límites de velocidad. " +"Desactivado apaga las funciones de límite, Info solo muestra los límites, " +"Aviso resalta el exceso de velocidad y Control ajusta la velocidad fijada " +"segÃēn los límites detectados." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "No se pudieron obtener las claves SSH - consulta los registros" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "No se pudo localizar ese lugar" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "No se pudo conectar con GitHub - comprueba la conexiÃŗn" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "No se pudo verificar GitHub - comprueba la hora del dispositivo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "País" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "Registro de fallos" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "Arranque suave desde parado (beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "Arranque suave desde parado — freno de mano manual (beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "Crucero" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "VersiÃŗn actual" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "Controlador de curvatura" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "ELIMINAR" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "DESCONECTANDO..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "DESCARGAR" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "Rechazar" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "Rechazar, desinstalar IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "Predeterminado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "Predeterminado (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "" +"Predeterminado: arranca listo para conducir, la activaciÃŗn estÃĄ disponible " +"de inmediato." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"Retardo antes de que un cambio de carril activado por el intermitente " +"empiece por sí solo: una vez fijado un retardo no hace falta tocar el " +"volante (por defecto es Toque de volante).
    Usa el intermitente para esto " +"solo cuando el trÃĄfico y la vía permitan realmente la maniobra." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "retardo por ÃĄngulo muerto" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "Eliminar" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "ÂŋEliminar el perfil desactivado ÂĢ{}Âģ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "ÂŋEliminar este registro?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "Destino definido" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "Detectado automÃĄticamente" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "Desarrollador" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "Dispositivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "El dispositivo debe estar registrado en Konn3kt para vincularse." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "Retardo de atenuaciÃŗn" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "Desconectar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "Desactivar" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "Desactiva antes de forzar el modo aparcado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "Desactiva antes de forzar el modo en marcha" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "Desactivar con el pedal del acelerador" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "Desactivar para apagar" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "Desactivar para reiniciar" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "Desactivar para restablecer la calibraciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "desactiva para {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "Desactivar: frenar apaga por completo la asistencia de direcciÃŗn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "Pantalla" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "Brillo de la pantalla" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "Mostrar la velocidad en km/h en lugar de mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "Distancia" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "ÂŋQuieres subir los datos de la cÃĄmara del conductor?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "Hecho" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "ID del dongle" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "Descargar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "Error en la descarga — intÊntalo de nuevo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "Descargando teselas del mapa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"Dibuja una barra en el borde izquierdo que sigue la aceleraciÃŗn y la frenada" +" medidas: lo que el coche estÃĄ haciendo realmente ahora mismo, no lo que " +"pide el planificador." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"Dibuja el mapa en pantalla a partir de teselas almacenadas en el " +"dispositivo. Combinado con el modo en línea, las teselas almacenadas toman " +"el relevo en cuanto se pierde la conexiÃŗn. Las teselas se descargan para la " +"regiÃŗn seleccionada." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "CÃĄmara del conductor" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "ComprobaciÃŗn de la cÃĄmara del conductor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "GestiÃŗn de la intervenciÃŗn del conductor" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "Viajes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "Brillo al conducir" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "Estilo de conducciÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "DinÃĄmico" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "Ajuste dinÃĄmico: respuesta mÃĄs viva del acelerador y el freno." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "EDITAR" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "ERROR" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "Activar" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "Activar ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Activar Always on Lateral (AOL). Desactiva este interruptor para volver al " +"comportamiento de activaciÃŗn de la direcciÃŗn original de IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "Activar dashcam" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "Activar advertencias de salida de carril" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"Activa la gestiÃŗn del bloqueo de direcciÃŗn MQB en vehículos Volkswagen MQB " +"con fallos de LKAS a baja velocidad." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "Activar roaming" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "Activar SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "Activar advertencias de salida de carril" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "" +"Activar la supervisiÃŗn del conductor incluso cuando IQ.Pilot no estÊ " +"activado." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "Introduce el APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "Introduce el cÃŗdigo de activaciÃŗn" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "Introducir cÃŗdigo" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "Introduce el SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "Introduce una direcciÃŗn o un lugar" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "Introduce la nueva contraseÃąa de anclaje a red" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "Introduce la contraseÃąa" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "Introduce tu nombre de usuario de GitHub" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "Error" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "Salir del modo aparcado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Barra de estado ampliada" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "MPC de vehículo delantero experimental" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"Expone una instantÃĄnea de los clips recientes de la dashcam y los registros " +"como una unidad USB al conectarse a un ordenador. IQ.Pilot sigue funcionando" +" mientras esto estÃĄ activado." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "OLVIDANDO..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"Actualmente se impone el control longitudinal de fÃĄbrica de Toyota. Elige un" +" modo longitudinal IQ para desactivarlo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "Ajuste longitudinal de fÃĄbrica." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "favoritos" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "Obteniendo mapa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "Obteniendo mapas..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "Último aviso" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "Encuentra tu vehículo" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "Finalizar configuraciÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"Muestra un aviso lateral cuando el coche detecta algo en tu ÃĄngulo muerto " +"(solo coches con BSM)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" +"Activa Siempre Aparcado en el panel Dispositivo, o apaga el coche, para " +"cambiar esto." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "distancia de seguimiento" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "Sigue las indicaciones de la aplicaciÃŗn para completar la vinculaciÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"ÂŋForzar IQ.Pilot en modo en marcha durante 10 minutos? Siempre Aparcado se " +"activarÃĄ automÃĄticamente y volverÃĄ al modo aparcado cuando acabe el " +"temporizador." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Forzar interfaz Mici" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "Forzar modo en marcha (10 min)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "Forzar modo en marcha solo puede iniciarse estando aparcado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "" +"Forzar modo en marcha ya estÃĄ activo. ÂŋReiniciar el temporizador a 10 " +"minutos?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "Modo en marcha forzado activo" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Olvidar" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "ÂŋOlvidar la red Wi-Fi ÂĢ{}Âģ?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "BUENO" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "AutenticaciÃŗn de Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Token / contraseÃąa de Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Usuario de Git" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "Error de GitHub ({}) al obtener las claves" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "ALTO" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "Red" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "Retener el cambio de carril por ÃĄngulo muerto" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "MantÊn firme..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"Retiene el cambio de carril automÃĄtico mientras la vigilancia de ÃĄngulo " +"muerto detecte un coche en el carril de destino, y lo libera en cuanto el " +"carril queda libre." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Casa" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "Horas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"CuÃĄnto tiempo puede permanecer la pantalla de ajustes sin tocarse antes de " +"cerrarse sola." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"CuÃĄnto tiempo de anticipaciÃŗn aÃąadir al retardo propio de la cremallera " +"mientras el autoajuste estÃĄ desactivado. El valor por defecto es 0,2 s." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "INSTALAR" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "DirecciÃŗn IP" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "paradas forzadas IQ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "modo IQ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"Los modos longitudinales IQ no estÃĄn disponibles para este vehículo. El ACC " +"de fÃĄbrica es la Ãēnica opciÃŗn disponible." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic curvas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic velocidad del delantero" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic velocidad baja" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic paradas del modelo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic respaldo SLC" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic delantero mÃĄs lento" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic delantero detenido" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "VersiÃŗn de IQ.OS" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot no disponible" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +" Cambiar esta configuraciÃŗn reiniciarÃĄ IQ.Pilot si el coche estÃĄ encendido." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"IQ.Pilot requiere que el dispositivo estÊ montado dentro de 4° a izquierda o" +" derecha y dentro de 5° hacia arriba o 9° hacia abajo." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"Si circulas a 20 mph (32 km/h) o menos con el intermitente puesto, el coche " +"planificarÃĄ un giro en esa direcciÃŗn por el camino transitable mÃĄs cercano. " +"Esto evita situaciones (como en los semÃĄforos en rojo) en las que el coche " +"podría planificar el giro en la direcciÃŗn equivocada." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "Info" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" +"Inserta la tarjeta SIM original de comma que venía con el dispositivo para " +"usar eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "Instalar actualizaciÃŗn" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "CÃŗdigo QR no vÃĄlido" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "KM" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "ERROR DE KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT SIN CONEXIÓN" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "Mantener el dispositivo aparcado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "Mantener acelerador y freno de fÃĄbrica" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"Deja el acelerador y los frenos al sistema Toyota de fÃĄbrica; IQ.Pilot solo " +"dirige." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Funciones de Konn3kt:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Estado de Konn3kt:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "LÍMITE" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "CARGANDO" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "CARGANDO..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "Opciones de cambio de carril" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "Control lateral con fallo del crucero" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "Modo de maniobra lateral" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "Lecturas del vehículo delantero" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "ÂŋSalir ahora del modo Siempre Aparcado?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "ÂŋSalir ahora del modo aparcado forzado?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"Deja que IQ.Pilot mida cuÃĄnto tarda tu direcciÃŗn en responder y mantenga ese" +" valor actualizado. Desactívalo para fijar tÃē mismo ese tiempo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" +"Te permite mover el volante con el sistema activado sin desactivar del todo " +"la direcciÃŗn." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "TransmisiÃŗn en vivo" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "Cargando %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "Cargando vídeo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "Cargando..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "Localizando..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "" +"Bloqueado en APAGADO en esta plataforma; el vehículo no admite otras " +"opciones." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "Control longitudinal" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"Modos de control longitudinal:
    Las funciones de IQ.Pilot se enumeran a " +"continuaciÃŗn:

    Control longitudinal extremo a extremo de " +"IQ.Pilot


    Deja que el modelo de conducciÃŗn controle el acelerador y " +"los frenos. IQ.Pilot conducirÃĄ como cree que lo haría una persona, " +"incluyendo detenerse en semÃĄforos en rojo y seÃąales de stop. Como el modelo " +"decide la velocidad, la velocidad fijada solo actÃēa como límite superior. " +"Esta funciÃŗn sigue mejorando; es de esperar que haya " +"errores.

    IQ.Dynamic


    Combina dinÃĄmicamente el comportamiento " +"del control de crucero adaptativo y el de extremo a extremo segÃēn la escena " +"y el contexto.

    IQ.Chill


    Usa el comportamiento habitual del" +" crucero adaptativo al trÃĄfico para el control longitudinal.

    Nueva " +"visualizaciÃŗn de conducciÃŗn


    La visualizaciÃŗn de conducciÃŗn pasarÃĄ a " +"la cÃĄmara gran angular orientada a la carretera a baja velocidad para " +"mostrar mejor algunas curvas. El logotipo de IQ.Pilot tambiÊn aparecerÃĄ en " +"la esquina superior derecha." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "Modo de maniobra longitudinal" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "Perfil de ajuste longitudinal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "anticipaciÃŗn mayor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "anticipaciÃŗn menor" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "PlanificaciÃŗn de giros a baja velocidad" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"Filtra la curvatura planificada con un paso bajo antes de que llegue a la " +"cremallera en vehículos MEB y MQB Evo, lo que amortigua la oscilaciÃŗn " +"lateral. Activado por defecto en estos coches." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "MANUAL" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "MÁX" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "ReanudaciÃŗn del ACC MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "reanudaciÃŗn ACC MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "Bloqueo de direcciÃŗn MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "bloqueo de direcciÃŗn MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "Mantenimiento" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "CompensaciÃŗn manual del retardo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "Base de datos de mapas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "Medido:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "Millas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "" +"Refleja los intermitentes del coche como flechas en la pantalla de " +"conducciÃŗn." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "tiempo de parada del modelo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "Modelos" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "N/D" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "SIN PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "NINGUNO" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "NavegaciÃŗn" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "NavegaciÃŗn cancelada" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "Cerca" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "Red" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "red neuronal FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "PrealimentaciÃŗn por red neuronal (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "No dormir nunca" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "No" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "Sin toque de volante" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "No se detectÃŗ ningÃēn QR" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "No se encontraron claves SSH para el usuario '{}'" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "No se encontraron redes Wi-Fi" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "" +"No se detectÃŗ ninguna cÃĄmara en modo dev. Toca comprobar para continuar." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "No hay notas de versiÃŗn disponibles." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "Sin resultados" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "No hay rutas grabadas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "No hay vehículo definido" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "No hay vídeo de esta cÃĄmara" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"Normalmente una maniobra termina el cambio de carril aunque se mantenga el " +"intermitente. Actívalo para encadenar mÃĄs cambios mientras el intermitente " +"siga puesto: cada uno siguiente sigue pidiendo un toque de volante." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "No disponible en esta plataforma de Subaru." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "Sin conexiÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "Sin definir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"Nota: en coches sin botÃŗn LFA/LKAS, desactivar esto evita que la asistencia " +"de direcciÃŗn se arme cuando cambia la disponibilidad del control de crucero." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "Toque de volante" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "SIN CONEXIÓN" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "EN LÍNEA" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "Desactivado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "Mapas en pantalla sin conexiÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "Aparcado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "Temporizador de apagado en aparcado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "" +"Aparcado: entra en Siempre Aparcado cada vez que arranca o se despierta." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "CompensaciÃŗn:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "En el dispositivo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "Mapas en pantalla en línea" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "Interfaz de desarrollador en marcha" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "Abre la aplicaciÃŗn Konn3kt en tu telÊfono" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "Nombre opcional" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"Muestra durante la conducciÃŗn una barra con mÊtricas de control en vivo " +"(direcciÃŗn, aceleraciÃŗn lateral, datos del vehículo delantero)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "EMPAREJAR" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "SEMANA PASADA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "Modo PQ HCA estado 7" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "modo PQ HCA estado 7" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "VISTA PREVIA" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "Emparejar dispositivo" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "Mejorar ahora" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "Emparejar dispositivo" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Vincula tu dispositivo en la aplicaciÃŗn Konn3kt" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Vincula tu dispositivo en la aplicaciÃŗn Konn3kt." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "Empareja tu dispositivo con tu cuenta de comma" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "Pausar actualizaciones" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "Realizar una bÃēsqueda" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" +"Elige cÃŗmo reacciona la asistencia de direcciÃŗn cuando el conductor frena en" +" IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "" +"Elige quÊ hace una pisada del pedal de freno con la asistencia de direcciÃŗn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"Elige si una actualizaciÃŗn lista solo espera tu visto bueno o si se descarga" +" e instala por su cuenta." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "Elige tu vehículo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "Fija un vehículo para omitir la detecciÃŗn automÃĄtica." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"Fija lecturas en vivo (distancia, velocidad, tiempo al vehículo delantero) " +"en el marcador del coche de delante. Requiere que sea IQ.Pilot quien " +"controle acelerador y freno." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "ConÊctate a Wi‑Fi para completar el emparejamiento inicial" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "ConÊctate al Wi-Fi para completar la vinculaciÃŗn inicial." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "ConÊctate al Wi-Fi para obtener tu clave." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "ConÊctate al Wi-Fi para actualizar." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "" +"Apunta la cÃĄmara del conductor a un cÃŗdigo QR de eSIM del operador (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "Pesos de política" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "Apagar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"Apaga el dispositivo cuando lleva este tiempo parado con el motor apagado.\n" +"(30 h por defecto)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "Predictivo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "Ajuste predictivo: anticipa y suaviza los cambios de aceleraciÃŗn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "Descarga previa + preinstalaciÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "Solo descarga previa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "Preparando teselas del mapa..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "Evitar subidas de datos grandes en una conexiÃŗn Wi-Fi con límite" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "Evitar subidas de datos grandes en una conexiÃŗn mÃŗvil con límite" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"Previsualiza la cÃĄmara hacia el conductor para asegurarte de que la " +"supervisiÃŗn del conductor tenga buena visibilidad. (el vehículo debe estar " +"apagado)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "Acciones del perfil" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"Descarga teselas de Mapbox en directo para el mapa en pantalla siempre que " +"el dispositivo tenga internet." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "Vaciar la cachÊ de modelos" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"Pon el dispositivo en Siempre Aparcado, o apaga el coche, antes de cambiar " +"cÃŗmo se instalan las actualizaciones." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"Pon el dispositivo en Siempre Aparcado, o apaga el coche, antes de tocar " +"esto." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "Error de cÃŗdigo QR" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "CÃŗdigo QR aceptado" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "LISTO" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "VOLVER A DESCARGAR" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "ACTUALIZAR" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "ELIMINAR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "ELIMINANDO..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "RESTABLECER" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "REVISAR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "Cremallera:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"Vuelve a montar el dispositivo si tu cara queda tapada o la monitorizaciÃŗn " +"tiene dificultades para seguirla." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "Solo accesible con el coche apagado o con Siempre Aparcado activado." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "Reiniciar" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "Reiniciar dispositivo" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "Reiniciar y actualizar" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"Recibe alertas para volver al carril cuando tu vehículo se desvíe sobre una " +"línea de carril detectada sin la direccional activada mientras conduces a " +"mÃĄs de 31 mph (50 km/h)." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "Grabar y subir cÃĄmara del conductor" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "Grabar y subir audio del micrÃŗfono" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"Grabar y almacenar audio del micrÃŗfono mientras conduces. El audio se " +"incluirÃĄ en el video de la dashcam en Konn3kt." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"Grabar y subir datos de conducciÃŗn y vídeo. ÂĄDesactivarlo detiene toda la " +"grabaciÃŗn! Sin registros, sin vídeo, sin audio." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "Volver a descargar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "Volver a descargar el modelo actual" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "Actualizar perfiles" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "Reglamentario" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "Relajado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "Recargar la lista de modelos" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "Seguir activo: frenar nunca interrumpe la asistencia de direcciÃŗn." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "Acceso remoto" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "Quitar" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Quitar pSIM de Comma" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "Renombrar" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "Renombrar perfil" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "Se agotÃŗ el tiempo de espera de la solicitud" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "" +"Requiere que el control longitudinal de IQ.Pilot (alfa) estÊ activado." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "Restablecer" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "Restablecer calibraciÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "Restaurar valores predeterminados" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "Revisar guía de entrenamiento" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "Revisa las reglas, funciones y limitaciones de IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "nombre de la vía" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "Nombre de la vía en pantalla" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "Rutas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "VersiÃŗn del motor de rutas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "Ejecutar la interfaz compacta de comma 4 (mici) en este dispositivo" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "SELECCIONAR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC confirmaciÃŗn automÃĄtica" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC confirmar mayor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC confirmar menor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC respaldo IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC relleno en línea" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC anulaciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC política" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "Claves SSH" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "claves SSH" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "ACC DE FÁBRICA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "Escanear" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "Escanear QR" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "Escanea el QR o introduce el cÃŗdigo de activaciÃŗn" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "Buscando redes Wi-Fi..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "Buscar" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "Buscar direcciÃŗn o lugar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "Buscar marca o modelo" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "Buscando..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "Seleccionar" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "Selecciona una rama" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "Selecciona un idioma" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "Retardo de direcciÃŗn autoajustable" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "NÃēmero de serie" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "Definir casa" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "Unidades segÃēn la ubicaciÃŗn" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "Definir trabajo" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "Definir la direcciÃŗn de casa" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"Definir las unidades segÃēn la ubicaciÃŗn del dispositivo. Las velocidades " +"cambian a km/h en todas partes excepto en Estados Unidos, el Reino Unido y " +"Liberia, y se vuelven a comprobar al cruzar una frontera." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "Definir la direcciÃŗn del trabajo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"Fija el umbral de velocidad que usan las intenciones de giro. Por debajo de " +"este valor pueden planificar el camino de giro transitable mÃĄs cercano. El " +"valor por defecto es 19 mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"Define en quÊ estado queda el dispositivo tras un arranque o al despertar " +"del reposo." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "Ajustes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"Muestra el nombre de la vía actual sobre la vista de conducciÃŗn.
    Requiere" +" tener instalados los mapas sin conexiÃŗn de tu regiÃŗn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "DirecciÃŗn suave" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "Posponer actualizaciÃŗn" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "Software" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "Velocidad" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "Límite de velocidad" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "Control del límite de velocidad" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "EstÃĄndar" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"Se recomienda EstÃĄndar. En modo agresivo, IQ.Pilot seguirÃĄ mÃĄs de cerca a " +"los coches delanteros y serÃĄ mÃĄs agresivo con el acelerador y el freno. En " +"modo relajado, IQ.Pilot se mantendrÃĄ mÃĄs lejos de los coches delanteros. En " +"coches compatibles, puedes cambiar entre estas personalidades con el botÃŗn " +"de distancia del volante." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "En espera" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"En espera: frenar pausa la asistencia de direcciÃŗn; vuelve en cuanto sueltas" +" el pedal." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "Iniciar descarga" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" +"Arranca el vehículo para comprobar la compatibilidad del comportamiento de " +"la asistencia de direcciÃŗn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "Estado" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "Estadísticas" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "Estado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Seguir activado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "DirecciÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "Comportamiento de la asistencia de direcciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Arco de esfuerzo de direcciÃŗn" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "ACC de fÃĄbrica" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "Detener la descarga" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Variante stop-and-go para coches Subaru Global con freno de mano manual. " +"DÊjalo desactivado en coches con freno de estacionamiento elÊctrico. " +"ÂĄGracias a martinl por esta implementaciÃŗn!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "Mapas almacenados" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "Transmitiendo desde la nube" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "ÂŋPoner el dispositivo en modo Siempre Aparcado?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "ÂŋPoner el dispositivo en modo aparcado forzado?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "Sistema" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "Sistema sin respuesta" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "TOME EL CONTROL INMEDIATAMENTE" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "TEMP" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "TEMP ALTA" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "TEMP OK" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "Toca ÂĢAdd DeviceÂģ y escanea el cÃŗdigo QR de la derecha" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "Rama de destino" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "ContraseÃąa de anclaje a red" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"El modelo seleccionado ha cambiado. Sugerimos restablecer la calibraciÃŗn. " +"ÂŋQuieres hacerlo ahora?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "" +"No hay vuelta atrÃĄs una vez que se ejecute: Ãēltima oportunidad para echarse " +"atrÃĄs." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "Esto necesita un reinicio para aplicarse. ÂŋReiniciar ahora?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "Esta plataforma estÃĄ limitada al modo Desactivar." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "" +"Esta plataforma admite un conjunto limitado de opciones de comportamiento de" +" la asistencia de direcciÃŗn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" +"Esta plataforma admite la configuraciÃŗn completa del comportamiento de la " +"asistencia de direcciÃŗn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"Esto eliminarÃĄ TODOS los mapas descargados\n" +"\n" +"ÂŋSeguro que quieres eliminar todos los mapas?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"Esto eliminarÃĄ de la cachÊ TODOS los modelos descargados salvo el modelo " +"activo. ÂŋSeguro?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "Esto borrarÃĄ permanentemente el perfil pSIM de Comma de la SIM." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "Esto iniciarÃĄ la descarga, que puede tardar un rato en completarse." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "Tiempo" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "Interruptores" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "Total:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"Traza un arco sobre la vista de la carretera que muestra cuÃĄnta direcciÃŗn " +"aplica IQ.Pilot mientras funciona el control lateral." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "Guía de iniciaciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "intermitentes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"Desactiva por completo la bÃēsqueda de actualizaciones por la " +"red.
    Reinicia para que surta efecto." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "Escribe un aÃąo y luego un modelo — por ejemplo, 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "Escribe para buscar" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "NO DISPONIBLE" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "DESINSTALAR" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "ACTUALIZAR" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "Almacenamiento USB" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "USAR" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "No se pudo cargar el vídeo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "No disponible mientras el coche estÃĄ en marcha." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "" +"No disponible — el control longitudinal de IQ.Pilot no estÃĄ activo en este " +"coche." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "Sin detectar y sin definir" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "Desinstalar" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "Desconocido" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "Operador desconocido" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "Almacenamiento ilimitado de rutas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "Modo de instalaciÃŗn de actualizaciones" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "Las actualizaciones solo se descargan cuando el coche estÃĄ apagado." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "Subir mientras se conduce" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"Sube datos de la cÃĄmara orientada al conductor y ayuda a mejorar el " +"algoritmo de supervisiÃŗn del conductor." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "Subido" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "Subiendo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"Usa el estado HCA 7 en lugar del estado 5 para el control de la direcciÃŗn en" +" vehículos de plataforma PQ. Esto puede ayudar con la compatibilidad en " +"algunos modelos Volkswagen mÃĄs antiguos." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "Usar sistema mÊtrico" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"Usar cÃŗdigo de activaciÃŗn:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"Usa el sistema IQ.Pilot para control de crucero adaptativo y asistencia de " +"mantenimiento de carril. Tu atenciÃŗn se requiere en todo momento para usar " +"esta funciÃŗn." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "VEHÍCULO" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "VER" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (mezcla virtual de par)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "Vehículo" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"AÃēn no se ha detectado la capacidad longitudinal del vehículo. Arranca el " +"coche una vez para detectar la compatibilidad." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Reproductor de vídeo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "Ver el registro de errores de los fallos de IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "Pesos de visiÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "Aspecto" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "Esperando seÃąal de GPS..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"Esperando la cÃĄmara del conductor. Usa el cÃŗdigo QR de eSIM del operador o " +"introduce el cÃŗdigo LPA manualmente." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "Esperando para iniciar" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "Aviso" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"Aviso: esto concede acceso SSH a todas las claves pÃēblicas de tus ajustes de" +" GitHub. Nunca introduzcas un nombre de usuario de GitHub que no sea el " +"tuyo. Un empleado de IQ.Pilot NUNCA te pedirÃĄ que aÃąadas su nombre de " +"usuario de GitHub." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"Aviso: la direcciÃŗn puede oscilar en curvas por debajo de {}; desactiva esto" +" si lo notas." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "Bienvenido a IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "" +"Cuando estÃĄ activado, al presionar el pedal del acelerador se desactivarÃĄ " +"IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Red Wi-Fi con límite" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "Trabajo" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "ContraseÃąa incorrecta" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "Sí" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "Sí, eliminar todos los mapas" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "Debes aceptar las Condiciones del servicio para poder usar IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"Debes aceptar las Condiciones del servicio para usar IQ.Pilot. Lee las " +"condiciones mÃĄs recientes antes de continuar en https://iqlvbs.com/tos." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"DespuÊs de esto deberÃĄs usar tu propio perfil eSIM. No podrÃĄs volver a usar " +"Comma Prime a menos que compres una SIM nueva de comma." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "activar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "activo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "modelo activo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "aÃąadir perfil eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "aÃąadir perfil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "agresivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "ajustes de APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "auto oscuro" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"actualizaciones\n" +"automÃĄticas" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "atrÃĄs" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "rama" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "retardo de atenuaciÃŗn" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "calculando millas..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "iniciando cÃĄmara" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "mÃŗvil con límite" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"cambiar\n" +"idioma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "buscar actualizaciÃŗn" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "comprobando..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "combinado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "modelo combinado" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "configurado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "conectar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "conectado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "conectando..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "continuar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "control" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "arranque suave (beta)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "crucero" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "controlador de curvatura" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "rechazar" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "predeterminado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "eliminar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "desarrollador" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "dispositivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "ID del dispositivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"salir de\n" +"aparcado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "desactivar aparcado forzado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "desactivado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "desconectando..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "desactivar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "desactivar con acelerador" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "pantalla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "brillo de pantalla" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "abajo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "descargar actualizaciÃŗn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "descargando" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "descargando..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"vista previa cÃĄmara\n" +"del conductor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "brillo al conducir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "dinÃĄmico" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "activar dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "activar itinerancia" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "activado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "forzar long. de fÃĄbrica" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "introducir APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "introducir usuario de GitHub..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "introducir cÃŗdigo LPA..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "introducir cÃŗdigo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "introducir contraseÃąa..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "Error al buscar actualizaciones" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "error al actualizar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "rÃĄpido" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "finalizando la actualizaciÃŗn..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "para ÂĢ{}Âģ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "para actualizaciones de ramas privadas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"forzar\n" +"aparcado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "forzar interfaz mici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "forzar aparcado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "olvidando..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "formato: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "desde la cachÊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "ajuste long. hyundai" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "info" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "instalar actualizaciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "interactividad" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "ajustes de iq.dynamic" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "cambio de carril" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "avisos de salida de carril" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "velocidad de giro" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "modo maniobra lateral" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "lateral con fallo del crucero" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "dÊjalo en blanco para la configuraciÃŗn automÃĄtica" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "dÊjalo en blanco para omitir" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "deja el usuario y el token en blanco para borrarlos" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "izquierda" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "modo maniobra longitudinal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "giros a baja velocidad" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "m" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "gestionar perfiles" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "manual" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "compensaciÃŗn manual del retardo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "solo mapa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "prioridad del mapa" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "con límite" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "modelos" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "red" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "uso de la red" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "nunca" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "no" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "sin alertas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "sin toque" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "normal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "fuera de alcance" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "ahora" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "toque de volante" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "apagado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "sin conexiÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "encendido" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "en línea" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "nombre opcional..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "vincular en la app" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "vincular con Konn3kt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "pesos de política" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "apagar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "predictivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "acciones del perfil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "operador desconocido" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "vaciar cachÊ de modelos" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "en cola" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "listo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "reiniciar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "grabar cÃĄmara del conductor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "grabar micrÃŗfono" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "volver a descargar modelo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "actualizar perfiles" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "informaciÃŗn legal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "relajado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "recargar lista de modelos" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "quitar pSIM de comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "renombrar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "renombrar perfil..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "restablecer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "restablecer calibraciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"ver guía\n" +"de iniciaciÃŗn" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "derecha" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "s" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "escanear QR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "escanear QR / introducir cÃŗdigo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "buscando redes" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "retardo de direcciÃŗn autoajustable" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "nÃēmero de serie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "velocidad fijada" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "unidades segÃēn ubicaciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"desliza para\n" +"vaciar la cachÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"desliza para\n" +"desconectar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"desliza para\n" +"olvidar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"desliza para\n" +"volver a descargar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"desliza para\n" +"restablecer calibraciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"desliza para\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"desliza para quitar\n" +"la pSIM de comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "lento" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "direcciÃŗn suave" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "software" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "ajustes de límite de velocidad" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "estÃĄndar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "en espera" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"arranca el coche para\n" +"usar IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "iniciando..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "estado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "seguir activado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "direcciÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "comportamiento de la asistencia" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "de fÃĄbrica" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "stop-and-go freno de mano" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "detener descarga" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "iniciando sistema" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "rama de destino" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"tÊrminos y\n" +"condiciones" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "conexiÃŗn compartida" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "contraseÃąa de la conexiÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "opciones" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "viajes" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "desinstalar" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "desinstalar IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "sin límite" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "no compatible" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "arriba" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "actualizado" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "actualizado, Ãēltima comprobaciÃŗn: nunca" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "actualizado, Ãēltima comprobaciÃŗn: {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"modo de instalaciÃŗn\n" +"de actualizaciones" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "actualizaciÃŗn disponible" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"el actualizador no\n" +"responde" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "unidades mÊtricas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "vehículo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "versiÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "mezcla virtual de par" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "pesos de visiÃŗn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "aspecto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "aviso" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "contraseÃąa incorrecta" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "sí" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} ALERTA" +msgstr[1] "{} ALERTAS" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "hace {} día" +msgstr[1] "hace {} días" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "hace {} hora" +msgstr[1] "hace {} horas" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "hace {} minuto" +msgstr[1] "hace {} minutos" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 aÃąo de almacenamiento de conducciÃŗn" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "Conectividad LTE 24/7" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "ADVERTENCIA: el control longitudinal de openpilot estÃĄ en alpha para este" +#~ " coche y deshabilitarÃĄ el Frenado AutomÃĄtico de Emergencia " +#~ "(AEB).

    En este coche, openpilot usa por defecto el ACC integrado " +#~ "del coche en lugar del control longitudinal de openpilot. Activa esto para " +#~ "cambiar al control longitudinal de openpilot. Se recomienda activar el modo " +#~ "Experimental al habilitar el control longitudinal de openpilot (alpha)." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB (Android Debug Bridge) permite conectar tu dispositivo por USB o por la " +#~ "red. Consulta https://docs.comma.ai/how-to/connect-to-comma para mÃĄs " +#~ "informaciÃŗn." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "SupervisiÃŗn del conductor siempre activa" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "" +#~ "Se puede probar una versiÃŗn alpha del control longitudinal de openpilot, " +#~ "junto con el modo Experimental, en ramas que no son de lanzamiento." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "AÃąade konn3kt.com a tu pantalla de inicio para usarlo como una app" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "MODO CHILL ACTIVADO" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "" +#~ " Cambiar esta configuraciÃŗn reiniciarÃĄ openpilot si el coche estÃĄ encendido." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "" +#~ "Haz clic en \"aÃąadir nuevo dispositivo\" y escanea el cÃŗdigo QR de la " +#~ "derecha" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "Rechazar, desinstalar openpilot" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "MODO EXPERIMENTAL ACTIVADO" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "" +#~ "Activar la supervisiÃŗn del conductor incluso cuando openpilot no estÊ " +#~ "activado." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "Activar openpilot" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "" +#~ "Activa el interruptor de control longitudinal de openpilot (alpha) para " +#~ "permitir el modo Experimental." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "Modo experimental" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "" +#~ "El modo experimental no estÃĄ disponible actualmente en este coche, ya que se" +#~ " usa el ACC de fÃĄbrica para el control longitudinal." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "FUNCIONES PRIME:" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Modo Firehose" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "Para la mÃĄxima efectividad, lleva tu dispositivo al interior y conÊctalo semanalmente a un buen adaptador USB‑C y Wi‑Fi.\n" +#~ "\n" +#~ "El Modo Firehose tambiÊn puede funcionar mientras conduces si estÃĄ conectado a un hotspot o a una SIM ilimitada.\n" +#~ "\n" +#~ "\n" +#~ "Preguntas frecuentes\n" +#~ "\n" +#~ "ÂŋImporta cÃŗmo o dÃŗnde conduzco? No, conduce como normalmente lo harías.\n" +#~ "\n" +#~ "ÂŋSe suben todos mis segmentos en el Modo Firehose? No, seleccionamos un subconjunto de tus segmentos.\n" +#~ "\n" +#~ "ÂŋQuÊ es un buen adaptador USB‑C? Cualquier cargador rÃĄpido de telÊfono o laptop sirve.\n" +#~ "\n" +#~ "ÂŋImporta quÊ software ejecuto? Sí, solo openpilot upstream (y forks particulares) pueden usarse para entrenamiento." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "Ve a https://konn3kt.com en tu telÊfono" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "INACTIVO: conÊctate a una red sin límites" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "Modo de depuraciÃŗn de joystick" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "" +#~ "Maximiza tus cargas de datos de entrenamiento para mejorar los modelos de " +#~ "conducciÃŗn de openpilot." + +#~ msgid "NO" +#~ msgstr "NO" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "No se encontraron claves SSH" + +#, python-format +#~ msgid "Open" +#~ msgstr "Abrir" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "" +#~ "Empareja tu dispositivo con Konn3kt (konn3kt.com) y reclama tu oferta de " +#~ "Konn3kt." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "Hazte miembro de Konn3kt en konn3kt.com" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "Capturas remotas" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "Revisa las reglas, funciones y limitaciones de openpilot" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "Se recomienda EstÃĄndar. En modo agresivo, openpilot seguirÃĄ mÃĄs de cerca a " +#~ "los coches delanteros y serÃĄ mÃĄs agresivo con el acelerador y el freno. En " +#~ "modo relajado, openpilot se mantendrÃĄ mÃĄs lejos de los coches delanteros. En" +#~ " coches compatibles, puedes cambiar entre estas personalidades con el botÃŗn " +#~ "de distancia del volante." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "" +#~ "Usa el sistema openpilot para control de crucero adaptativo y asistencia de " +#~ "mantenimiento de carril. Tu atenciÃŗn se requiere en todo momento para usar " +#~ "esta funciÃŗn." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "Advertencia: Esto otorga acceso SSH a todas las claves pÃēblicas en tu " +#~ "configuraciÃŗn de GitHub. Nunca introduzcas un nombre de usuario de GitHub " +#~ "que no sea el tuyo. Un empleado de comma NUNCA te pedirÃĄ que agregues su " +#~ "nombre de usuario de GitHub." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "Bienvenido a openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "" +#~ "Cuando estÃĄ activado, al presionar el pedal del acelerador se desactivarÃĄ " +#~ "openpilot." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "Debes aceptar los TÊrminos y Condiciones para poder usar openpilot." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "Debes aceptar los TÊrminos y Condiciones para usar openpilot. Lee los " +#~ "tÊrminos mÃĄs recientes en https://comma.ai/terms antes de continuar." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "Control longitudinal de openpilot (Alpha)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot no disponible" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilot conduce por defecto en modo chill. El modo Experimental habilita " +#~ "funciones de nivel alpha que no estÃĄn listas para el modo chill. Las " +#~ "funciones experimentales se enumeran a continuaciÃŗn:

    Control " +#~ "longitudinal de extremo a extremo


    Deja que el modelo de conducciÃŗn " +#~ "controle el acelerador y los frenos. openpilot conducirÃĄ como piensa que lo " +#~ "haría un humano, incluyendo detenerse en luces rojas y seÃąales de alto. Dado" +#~ " que el modelo decide la velocidad a la que conducir, la velocidad " +#~ "establecida solo actuarÃĄ como límite superior. Esta es una funciÃŗn de " +#~ "calidad alpha; se deben esperar errores.

    Nueva visualizaciÃŗn de " +#~ "conducciÃŗn


    La visualizaciÃŗn de conducciÃŗn harÃĄ la transiciÃŗn a la " +#~ "cÃĄmara gran angular orientada a la carretera a bajas velocidades para " +#~ "mostrar mejor algunos giros. El logotipo del modo Experimental tambiÊn se " +#~ "mostrarÃĄ en la esquina superior derecha." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ " Cambiar esta configuraciÃŗn reiniciarÃĄ openpilot si el coche estÃĄ encendido." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilot aprende a conducir observando a humanos, como tÃē, conducir.\n" +#~ "\n" +#~ "El Modo Firehose te permite maximizar tus cargas de datos de entrenamiento para mejorar los modelos de conducciÃŗn de openpilot. MÃĄs datos significan modelos mÃĄs grandes, lo que significa un mejor Modo Experimental." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "" +#~ "El control longitudinal de openpilot podría llegar en una actualizaciÃŗn " +#~ "futura." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "" +#~ "openpilot requiere que el dispositivo estÊ montado dentro de 4° a izquierda " +#~ "o derecha y dentro de 5° hacia arriba o 9° hacia abajo." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "" +#~ "{} segmento de tu conducciÃŗn estÃĄ en el conjunto de entrenamiento hasta " +#~ "ahora." +#~ msgstr[1] "" +#~ "{} segmentos de tu conducciÃŗn estÃĄn en el conjunto de entrenamiento hasta " +#~ "ahora." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ SUSCRITO" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Modo Firehose đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_fr.mo b/iqpilot/selfdrive/ui/translations/app_fr.mo new file mode 100644 index 000000000..08bf81960 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_fr.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_fr.po b/iqpilot/selfdrive/ui/translations/app_fr.po new file mode 100644 index 000000000..c8bb3c83b --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_fr.po @@ -0,0 +1,4734 @@ +# French translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2026-01-24 12:37+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.8\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (par dÊfaut)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " L'Êtalonnage de la rÊponse du couple de direction est terminÊ." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " L'Êtalonnage de la rÊponse du couple de direction est terminÊ à {}%." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " Votre appareil est orientÊ {:.1f}° {} et {:.1f}° {}." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    L'Êtalonnage du dÊlai de rÊponse de la direction est terminÊ." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "" +"

    L'Êtalonnage du dÊlai de rÊponse de la direction est terminÊ à {}%." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "ACTIF" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"ADB (Android Debug Bridge) permet de se connecter à votre appareil via USB " +"ou via le rÊseau." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "AJOUTER" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "DEPUIS TOUJOURS" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "Paramètres APN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "AUTH" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "AUTO" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "barre d'accÊlÊration" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "Indicateur d'accÊlÊration" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "Accuser rÊception d'actionnement excessif" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "Activer" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "Modèle actif" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "Actif uniquement au-dessus de {}." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "Ajouter un profil" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "Ajouter un profil eSIM" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "Ajuster la vitesse des intentions de virage" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "AvancÊ" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"Ensuite, vous devrez utiliser votre propre profil eSIM.\n" +"\n" +"Vous ne pourrez plus utiliser Comma Prime, sauf si vous achetez une nouvelle carte SIM chez comma." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "Agressif" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "Accepter" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "Tout" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "Tous les États (~6,0 Go)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"Permet à IQ.Pilot d'utiliser le comportement de reprise ACC MQB sur les " +"vÊhicules Volkswagen MQB compatibles avec FtS à maintien prolongÊ sans " +"reprise automatique." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"Permet au contrôle latÊral (direction) de rester actif mÃĒme lorsque le " +"contrôle longitudinal (accÊlÊrateur/frein) est temporairement indisponible " +"en raison d'un dÊfaut du rÊgulateur." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "Assistance latÊrale permanente (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "Et bien plus encore" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "S'applique immÊdiatement." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "S'applique au prochain passage hors route de l'appareil." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "Êtes-vous sÃģr de vouloir Êteindre ?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "Êtes-vous sÃģr de vouloir redÊmarrer ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"Voulez-vous vraiment rÊinitialiser tous les paramètres d'IQ.Pilot ? Une fois" +" les paramètres rÊinitialisÊs, il n'y a pas de retour en arrière." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "Êtes-vous sÃģr de vouloir rÊinitialiser la calibration ?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "Êtes-vous sÃģr de vouloir dÊsinstaller ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "Auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "changement de voie auto" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "Changement de voie automatique : changements continus" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "Auto — attÊnuÊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "Fermeture automatique des paramètres" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"RedÊmarre automatiquement après un arrÃĒt en suivant le trafic, sur les " +"plateformes Subaru concernÊes par l'implÊmentation bÃĒta." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "DisponibilitÊ lors des changements du rÊgulateur" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "Retour" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "Alertes d'angle mort" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "alertes d'angle mort" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "Indicateurs de clignotants" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "Changement de voie dÊclenchÊ par le clignotant" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "État au dÊmarrage" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "Mode de rÊponse au freinage" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"RÊtablit le large bandeau d'Êtat hors route de l'interface classique : " +"tempÊrature, vÊhicule et Êtat Konn3kt en un coup d'œil." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "CHANGER" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "VÉRIFIER" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "VIDER" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "CONNECTER" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "CONNECTER..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "Annuler" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "Annuler la navigation" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "DonnÊes cellulaire limitÊes" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "Changer la langue" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" +"La modification de ce rÊglage redÊmarrera IQ.Pilot si la voiture est sous " +"tension." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "VÊrifiÊ {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "Choisir un modèle" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"Choisissez le comportement longitudinal : IQ.Pilot (longitudinal IQ + bout " +"en bout), IQ.Dynamic (longitudinal IQ + mode dynamique), IQ.Chill " +"(longitudinal IQ + profil dÊtendu) ou ACC d'origine." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "Choisi manuellement" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "Vider le cache" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "Vider le cache du modèle sÊlectionnÊ et le retÊlÊcharger ?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "Fermer" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"Ferme la boucle de direction sur les vÊhicules MEB et MQB Evo. IQ.Pilot " +"corrige sa commande de direction en fonction de la courbure rÊellement " +"suivie par la voiture, au lieu d'envoyer directement la courbure planifiÊe." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "Cloud" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "Cloud uniquement" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "VidÊo cloud indisponible" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "LÊgende des couleurs de l'Êtat d'empreinte :" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "Modèle combinÊ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"ExÊcute une sÊquence programmÊe de paliers d'accÊlÊration pour mesurer la " +"rÊponse de l'actionneur longitudinal. NÊcessite le contrôle longitudinal " +"IQ.Pilot. À n'utiliser que sur une route dÊgagÊe et fermÊe." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"ExÊcute une sÊquence programmÊe de paliers d'accÊlÊration latÊrale pour " +"mesurer la rÊponse de la direction. À n'utiliser que sur une route droite, " +"plate et dÊgagÊe." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "Confirmer" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "Continuer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "changements continus" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "Contrôle" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"Contrôle le comportement d'IQ.Pilot face aux limitations de vitesse. " +"DÊsactivÊ coupe les fonctions de limitation, Info affiche seulement les " +"limites, Avertissement met en Êvidence les excès de vitesse et Contrôle " +"ajuste la vitesse de consigne selon les limites dÊtectÊes." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "Impossible de rÊcupÊrer les clÊs SSH - consultez les journaux" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "Impossible de localiser ce lieu" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "Impossible de joindre GitHub - vÊrifiez la connexion" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "Impossible de vÊrifier GitHub - vÊrifiez l'heure de l'appareil" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "Pays" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "Journal des plantages" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "DÊmarrage en douceur à l'arrÃĒt (bÃĒta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "DÊmarrage en douceur à l'arrÃĒt — frein à main manuel (bÃĒta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "RÊgulateur" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "Version actuelle" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "Contrôleur de courbure" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "SUPPRIMER" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "DÉCONNEXION..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "TÉLÉCHARGER" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "Refuser" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "Refuser, dÊsinstaller IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "Par dÊfaut" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "Par dÊfaut (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "" +"Par dÊfaut : dÊmarre prÃĒt à conduire, l'engagement est disponible " +"immÊdiatement." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"DÊlai avant qu'un changement de voie dÊclenchÊ par le clignotant ne dÊmarre " +"de lui-mÃĒme — aucune impulsion au volant n'est nÊcessaire une fois un dÊlai " +"dÊfini (par dÊfaut : impulsion au volant).
    N'utilisez le clignotant pour " +"cela que lorsque le trafic et la route permettent rÊellement la manœuvre." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "dÊlai si angle mort" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "Supprimer" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "Supprimer le profil dÊsactivÊ ÂĢ {} Âģ ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "Supprimer ce journal ?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "Destination dÊfinie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "DÊtectÊ automatiquement" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "DÊveloppeur" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "Appareil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "L'appareil doit ÃĒtre enregistrÊ auprès de Konn3kt pour ÃĒtre associÊ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "DÊlai avant attÊnuation" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "DÊconnecter" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "DÊsengager" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "DÊsengagez avant de forcer le mode hors route" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "DÊsengagez avant de forcer le mode route" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "DÊsengager à l'appui sur l'accÊlÊrateur" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "DÊsengager pour Êteindre" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "DÊsengager pour redÊmarrer" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "DÊsengager pour rÊinitialiser la calibration" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "dÊsengagez pour {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "" +"DÊsengager : le freinage coupe entièrement l'assistance à la direction." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "Affichage" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "LuminositÊ de l'Êcran" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "Afficher la vitesse en km/h au lieu de mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "Distance" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "Voulez-vous envoyer les donnÊes de la camÊra conducteur ?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "TerminÊ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "ID du dongle" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "TÊlÊcharger" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "Échec du tÊlÊchargement — rÊessayez." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "TÊlÊchargement des tuiles" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"Trace une barre le long du bord gauche suivant l'accÊlÊration et le freinage" +" mesurÊs — ce que la voiture fait rÊellement en ce moment, et non ce que " +"demande le planificateur." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"Dessine la carte à l'Êcran à partir des tuiles stockÊes sur l'appareil. " +"CombinÊes au mode en ligne, les tuiles stockÊes prennent le relais dès que " +"la connexion est perdue. Les tuiles sont tÊlÊchargÊes pour la rÊgion " +"sÊlectionnÊe." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "CamÊra conducteur" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "VÊrification de la camÊra conducteur" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "Gestion de l'intervention du conducteur" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "Trajets" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "LuminositÊ en conduite" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "PersonnalitÊ de conduite" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "Dynamique" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "RÊglage dynamique : rÊponse plus vive de l'accÊlÊrateur et du frein." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "EDITER" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "ERREUR" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "Activer" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "Activer ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Activer Always on Lateral (AOL). DÊsactivez ce commutateur pour revenir au " +"comportement d'engagement de la direction d'origine d'IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "Activer la dashcam" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "Activer les alertes de sortie de voie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"Active la gestion du verrouillage de direction MQB sur les vÊhicules " +"Volkswagen MQB prÊsentant des dÊfauts LKAS à basse vitesse." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "Activer l'itinÊrance" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "Activer SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "Activer les alertes de sortie de voie" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "" +"Activer la surveillance du conducteur mÃĒme lorsque IQ.Pilot n'est pas " +"engagÊ." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "Saisir l'APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "Saisir le code d'activation" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "Saisir le code" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "Entrer le SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "Saisissez une adresse ou un lieu" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "Saisir le mot de passe du partage de connexion" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "Saisir le mot de passe" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "Entrez votre nom d'utilisateur GitHub" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "Erreur" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "Quitter le mode hors route" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Barre d'Êtat Êtendue" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "MPC vÊhicule avant expÊrimental" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"Expose un instantanÊ des clips dashcam et des journaux rÊcents sous forme de" +" clÊ USB lors de la connexion à un ordinateur. IQ.Pilot continue de " +"fonctionner tant que cette option est activÊe." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "OUBLIER..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"Le contrôle longitudinal Toyota d'origine est actuellement imposÊ. " +"Choisissez un mode longitudinal IQ pour le dÊsactiver." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "RÊglage longitudinal d'origine." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "favoris" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "RÊcupÊration de la carte" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "RÊcupÊration des cartes..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "Dernier avertissement" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "Trouvez votre vÊhicule" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "Terminer la configuration" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"Affiche un avertissement latÊral dès que la voiture signale quelque chose " +"dans votre angle mort (vÊhicules ÊquipÊs du BSM uniquement)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" +"Activez Toujours hors route depuis le panneau Appareil, ou coupez le " +"contact, pour modifier ceci." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "distance de suivi" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "Suivez les instructions de l'application pour terminer l'association" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"Forcer IQ.Pilot en mode route pendant 10 minutes ? Le mode Toujours hors " +"route sera activÊ automatiquement et l'appareil reviendra hors route à la " +"fin du dÊlai." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Forcer l'interface Mici" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "Forcer le mode route (10 min)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "Le mode route forcÊ ne peut ÃĒtre lancÊ que hors route" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "" +"Le mode route forcÊ est dÊjà actif. RÊinitialiser la minuterie à 10 minutes " +"?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "Mode route forcÊ actif" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Oublier" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "Oublier le rÊseau Wi-Fi \"{}\" ?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "BON" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Authentification Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Jeton / mot de passe Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Nom d'utilisateur Git" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "Erreur GitHub ({}) lors de la rÊcupÊration des clÊs" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "ÉLEVÉ" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "RÊseau" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "Retenir le changement de voie en cas d'angle mort" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "Maintenez stable..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"Retient le changement de voie automatique tant que la surveillance d'angle " +"mort signale une voiture sur la voie cible, puis le libère dès que la voie " +"est dÊgagÊe." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Domicile" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "Heures" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"DurÊe pendant laquelle l'Êcran des paramètres peut rester inactif avant de " +"se fermer tout seul." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"Temps d'anticipation à ajouter au dÊlai propre de la crÊmaillère lorsque " +"l'auto-ajustement est dÊsactivÊ. La valeur par dÊfaut est 0,2 s." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "INSTALLER" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "Adresse IP" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "arrÃĒts forcÊs IQ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "mode IQ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"Les modes longitudinaux IQ ne sont pas disponibles pour ce vÊhicule. L'ACC " +"d'origine est la seule option disponible." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic virages" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic vitesse du vÊhicule avant" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic basse vitesse" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic arrÃĒts du modèle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic repli SLC" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic vÊhicule avant plus lent" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic vÊhicule avant à l'arrÃĒt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "Version d'IQ.OS" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot indisponible" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"La modification de ce rÊglage redÊmarrera IQ.Pilot si la voiture est sous " +"tension." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"IQ.Pilot exige que l'appareil soit montÊ à moins de 4° à gauche ou à droite " +"et à moins de 5° vers le haut ou 9° vers le bas." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"Si vous roulez à 20 mph (32 km/h) ou moins avec le clignotant allumÊ, la " +"voiture planifiera un virage dans cette direction sur le chemin praticable " +"le plus proche. Cela Êvite les situations (comme aux feux rouges) oÚ la " +"voiture pourrait planifier le virage dans le mauvais sens." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "Info" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" +"InsÊrez la carte SIM comma d'origine fournie avec l'appareil pour utiliser " +"l'eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "Installer la mise à jour" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "QR code invalide" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "KM" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "ERREUR KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT HORS LIGNE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "Garder l'appareil hors route" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "Conserver l'accÊlÊrateur et le frein d'origine" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"Laisse l'accÊlÊrateur et les freins au système Toyota d'origine ; IQ.Pilot " +"ne fait que diriger." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "FonctionnalitÊs Konn3kt :" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Statut Konn3kt :" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "LIMITE" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "CHARGEMENT" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "CHARGEMENT..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "Options de changement de voie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "Contrôle latÊral en cas de dÊfaut du rÊgulateur" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "Mode manœuvre latÊrale" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "Indications sur le vÊhicule prÊcÊdent" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "Quitter le mode Toujours hors route maintenant ?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "Quitter le mode hors route forcÊ maintenant ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"Laissez IQ.Pilot mesurer le temps de rÊponse de votre direction et maintenir" +" cette valeur à jour. DÊsactivez pour fixer vous-mÃĒme cette valeur." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" +"Vous permet de bouger le volant pendant l'engagement sans dÊsengager " +"complètement la direction." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "Diffusion en direct" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "Chargement de %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "Chargement de la vidÊo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "Chargement..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "Localisation..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "" +"VerrouillÊ sur DÉSACTIVÉ sur cette plateforme ; le vÊhicule ne prend pas en " +"charge d'autres choix." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "Contrôle longitudinal" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"Modes de contrôle longitudinal :
    Les fonctionnalitÊs d'IQ.Pilot sont " +"listÊes ci-dessous :

    Contrôle longitudinal bout en bout " +"d'IQ.Pilot


    Laissez le modèle de conduite gÊrer l'accÊlÊrateur et les" +" freins. IQ.Pilot conduira comme il pense qu'un humain le ferait, y compris " +"en s'arrÃĒtant aux feux rouges et aux stops. Comme le modèle dÊcide de la " +"vitesse, la vitesse de consigne ne sert que de limite supÊrieure. Cette " +"fonction est encore en cours d'amÊlioration ; des erreurs sont à " +"prÊvoir.

    IQ.Dynamic


    MÊlange dynamiquement le comportement du " +"rÊgulateur adaptatif et le comportement bout en bout selon la scène et le " +"contexte.

    IQ.Chill


    Utilise le comportement classique du " +"rÊgulateur adaptatif au trafic pour le contrôle " +"longitudinal.

    Nouvelle visualisation de conduite


    La " +"visualisation de conduite passera à la camÊra grand angle orientÊe vers la " +"route à basse vitesse afin de mieux montrer certains virages. Le logo " +"IQ.Pilot apparaÃŽtra Êgalement en haut à droite." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "Mode de manœuvre longitudinale" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "Profil de rÊglage longitudinal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "anticipation plus haute" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "anticipation plus basse" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "Planification des virages à basse vitesse" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"Filtre la courbure planifiÊe en passe-bas avant qu'elle n'atteigne la " +"crÊmaillère sur les vÊhicules MEB et MQB Evo, ce qui amortit les " +"oscillations latÊrales. ActivÊ par dÊfaut sur ces voitures." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "MANUEL" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "MAX" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "Reprise ACC MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "reprise ACC MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "Verrouillage de direction MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "verrouillage direction MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "Maintenance" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "DÊcalage manuel du dÊlai" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "Base de donnÊes cartographique" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "MesurÊ :" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "Miles" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "" +"Reproduit les clignotants de la voiture sous forme de flèches sur l'Êcran de" +" conduite." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "durÊe d'arrÃĒt du modèle" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "Modèles" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "NC" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "PAS DE PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "AUCUN" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "Navigation" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "Navigation annulÊe" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "Proche" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "RÊseau" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "rÊseau neuronal FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "Anticipation par rÊseau neuronal (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "Ne jamais dormir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "Non" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "Sans impulsion" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "Aucun QR dÊtectÊ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "Aucune clÊ SSH trouvÊe pour l'utilisateur '{}'" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "Aucun rÊseau Wi-Fi trouvÊ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "" +"Aucune camÊra dÊtectÊe en mode dev. Appuyez sur vÊrifier pour continuer." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "Aucune note de version disponible." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "Aucun rÊsultat" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "Aucun trajet enregistrÊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "Aucun vÊhicule dÊfini" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "Aucune vidÊo pour cette camÊra" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"Normalement, une seule manœuvre met fin au changement de voie, mÃĒme en " +"gardant le clignotant. Activez cette option pour enchaÃŽner d'autres " +"changements tant que le clignotant reste allumÊ — chaque suivant demande " +"toujours une impulsion au volant." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "Non disponible sur cette plateforme Subaru." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "Non connectÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "Non dÊfini" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"Remarque : sur les voitures dÊpourvues de bouton LFA/LKAS, dÊsactiver cette " +"option empÃĒche l'assistance à la direction de s'armer lorsque la " +"disponibilitÊ du rÊgulateur change." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "Impulsion au volant" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "HORS LIGNE" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "EN LIGNE" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "DÊsactivÊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "Cartes à l'Êcran hors ligne" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "Hors route" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "Minuterie d'extinction hors route" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "" +"Hors route : passe en Toujours hors route à chaque dÊmarrage ou rÊveil." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "DÊcalage :" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "Sur l'appareil" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "Cartes à l'Êcran en ligne" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "Interface dÊveloppeur en conduite" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "Ouvrez l'application Konn3kt sur votre tÊlÊphone" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "Nom facultatif" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"Affiche pendant la conduite une barre de mesures de contrôle en direct " +"(direction, accÊlÊration latÊrale, donnÊes du vÊhicule prÊcÊdent)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "ASSOCIER" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "SEMAINE PASSÉE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "Mode PQ HCA statut 7" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "mode PQ HCA statut 7" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "APERÇU" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "Associer l'appareil" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "Mettre à niveau maintenant" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "Associer l'appareil" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Associez votre appareil dans l'application Konn3kt" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Associez votre appareil dans l'application Konn3kt." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "Associez votre appareil à votre compte comma" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "Suspendre les mises à jour" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "Effectuer une recherche" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" +"Choisissez comment l'assistance à la direction rÊagit lorsque le conducteur " +"freine dans IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "" +"Choisissez l'effet d'un appui sur la pÊdale de frein sur l'assistance à la " +"direction." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"Choisissez si une mise à jour prÃĒte doit attendre votre accord ou se " +"tÊlÊcharger et s'installer toute seule." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "Choisissez votre vÊhicule" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "Épinglez un vÊhicule pour ignorer la dÊtection automatique." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"Épingle les valeurs en direct (Êcart, vitesse, temps au vÊhicule prÊcÊdent) " +"sur le chevron qui marque la voiture devant. NÊcessite qu'IQ.Pilot gère " +"l'accÊlÊrateur et les freins." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "Veuillez vous connecter au Wi‑Fi pour terminer l'association initiale" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "" +"Veuillez vous connecter au Wi-Fi pour terminer l'association initiale." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "Connectez-vous au Wi-Fi pour rÊcupÊrer votre clÊ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "Veuillez vous connecter au Wi-Fi pour mettre à jour." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "" +"Pointez la camÊra conducteur vers un QR code eSIM de l'opÊrateur (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "Poids de politique" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "Éteindre" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"Éteint l'appareil une fois qu'il est restÊ aussi longtemps moteur coupÊ.\n" +"(30 h par dÊfaut)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "PrÊdictif" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "RÊglage prÊdictif : anticipe et lisse les variations d'accÊlÊration." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "TÊlÊchargement + prÊinstallation" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "TÊlÊchargement prÊalable uniquement" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "PrÊparation des tuiles..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "" +"Eviter les transferts de donnÊes volumineux lorsque vous ÃĒtes connectÊ à un " +"rÊseau Wi-Fi limitÊ" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "" +"Eviter les transferts de donnÊes volumineux lors d'une connexion à un rÊseau" +" cellulaire limitÊ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"PrÊvisualisez la camÊra orientÊe conducteur pour vous assurer que la " +"surveillance du conducteur a une bonne visibilitÊ. (le vÊhicule doit ÃĒtre " +"Êteint)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "Actions sur le profil" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"RÊcupère les tuiles Mapbox en direct pour la carte à l'Êcran dès que " +"l'appareil dispose d'Internet." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "Vider le cache des modèles" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"Mettez l'appareil en mode Toujours hors route, ou coupez le contact, avant " +"de changer le mode d'installation des mises à jour." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"Mettez l'appareil en mode Toujours hors route, ou coupez le contact, avant " +"d'y toucher." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "Erreur de code QR" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "QR code acceptÊ" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "PRÊT" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "RETÉLÉCHARGER" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "ACTUALISER" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "SUPPRIMER" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "SUPPRESSION..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "RÉINITIALISER" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "CONSULTER" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "CrÊmaillère :" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"Remontez l'appareil si votre visage est masquÊ ou si la surveillance du " +"conducteur a du mal à le suivre." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "" +"Accessible uniquement lorsque la voiture est Êteinte ou que Toujours hors " +"route est activÊ." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "RedÊmarrer" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "RedÊmarrer l'appareil" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "RedÊmarrer et mettre à jour" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"Recevez des alertes pour revenir dans la voie lorsque votre vÊhicule dÊpasse" +" une ligne de voie dÊtectÊe sans clignotant activÊ en roulant au-delà de 31 " +"mph (50 km/h)." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "Enregistrer et tÊlÊverser la camÊra conducteur" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "Enregistrer et tÊlÊverser l'audio du microphone" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"Enregistrer et stocker l'audio du microphone pendant la conduite. L'audio " +"sera inclus dans la vidÊo dashcam dans Konn3kt." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"Enregistrer et envoyer les donnÊes de conduite et les vidÊos. DÊsactiver " +"arrÃĒte tout enregistrement ! Aucun journal, aucune vidÊo, aucun son." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "RetÊlÊcharger" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "RetÊlÊcharger le modèle actuel" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "Actualiser les profils" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "RÊglementaire" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "DÊtendu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "Recharger la liste des modèles" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "" +"Rester actif : le freinage n'interrompt jamais l'assistance à la direction." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "Accès à distance" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "Retirer" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Retirer la pSIM Comma" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "Renommer" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "Renommer le profil" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "DÊlai de la requÃĒte dÊpassÊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "NÊcessite l'activation du contrôle longitudinal IQ.Pilot (alpha)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "RÊinitialiser" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "RÊinitialiser la calibration" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "RÊtablir les valeurs par dÊfaut" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "Consulter le guide d'entraÃŽnement" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "Consultez les règles, fonctionnalitÊs et limitations d'IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "nom de la route" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "Nom de la route affichÊ" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "Trajets" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "Version du moteur d'itinÊraire" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "ExÊcuter l'interface compacte comma 4 (mici) sur cet appareil" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "SELECTIONNER" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC confirmation auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC confirmer plus haut" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC confirmer plus bas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC repli IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC remplissage en ligne" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC dÊrogation" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC politique" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "Clefs SSH" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "clÊs SSH" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "ACC D'ORIGINE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "Scanner" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "Scanner le QR" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "Scannez le QR ou saisissez le code d'activation" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "Analyse des rÊseaux Wi-Fi..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "Rechercher" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "Rechercher une adresse ou un lieu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "Rechercher une marque ou un modèle" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "Recherche..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "SÊlectionner" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "SÊlectionner une branche" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "SÊlectionner un langage" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "DÊlai de direction auto-ajustÊ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "NumÊro de sÊrie" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "DÊfinir le domicile" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "UnitÊs selon la position" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "DÊfinir le travail" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "DÊfinir l'adresse du domicile" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"DÊfinir les unitÊs selon la position de l'appareil. Les vitesses passent en " +"km/h partout sauf aux États-Unis, au Royaume-Uni et au Liberia, et sont " +"revÊrifiÊes au passage d'une frontière." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "DÊfinir l'adresse du travail" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"DÊfinit le seuil de vitesse utilisÊ par les intentions de virage. En dessous" +" de cette valeur, elles peuvent planifier le virage praticable le plus " +"proche. La valeur par dÊfaut est 19 mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"DÊfinit l'Êtat dans lequel l'appareil se place après un dÊmarrage ou une " +"sortie de veille." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "Paramètres" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"Affiche le nom de la route actuelle sur la vue de conduite.
    NÊcessite " +"l'installation des cartes hors ligne de votre rÊgion." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "Direction douce" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "Reporter la mise à jour" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "Logiciel" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "Vitesse" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "Limitation de vitesse" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "Contrôle de la limitation de vitesse" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "Standard" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"Le mode standard est recommandÊ. En mode agressif, IQ.Pilot suivra les " +"vÊhicules de tÃĒte de plus près et sera plus agressif avec l'accÊlÊrateur et " +"le frein. En mode dÊtendu, IQ.Pilot restera plus ÊloignÊ des vÊhicules de " +"tÃĒte. Sur les voitures compatibles, vous pouvez parcourir ces personnalitÊs " +"avec le bouton de distance du volant." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "Veille" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"Veille : le freinage met l'assistance à la direction en pause ; elle reprend" +" dès que vous relÃĸchez la pÊdale." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "DÊmarrer le tÊlÊchargement" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" +"DÊmarrez le vÊhicule pour vÊrifier la compatibilitÊ du comportement de " +"l'assistance à la direction." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "État" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "Statistiques" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "Statut" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Rester engagÊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "Direction" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "Comportement de l'assistance à la direction" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Arc d'effort de direction" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "ACC d'origine" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "ArrÃĒter le tÊlÊchargement" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Variante stop-and-go pour les Subaru Global à frein à main manuel. Laissez " +"cette option dÊsactivÊe sur les voitures à frein de stationnement " +"Êlectrique. Merci à martinl pour cette implÊmentation !" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "Cartes stockÊes" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "Diffusion depuis le cloud" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "Basculer l'appareil en mode Toujours hors route ?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "Basculer l'appareil en mode hors route forcÊ ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "Système" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "Système non rÊactif" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "REPRENEZ IMMÉDIATEMENT LE CONTRÔLE" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "TEMPÉRATURE" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "TEMP ÉLEVÉE" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "TEMP OK" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "Appuyez sur ÂĢ Add Device Âģ et scannez le QR code à droite" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "Branche cible" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "Mot de passe du partage de connexion" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"Le modèle sÊlectionnÊ a changÊ. Nous vous conseillons de rÊinitialiser la " +"calibration. Voulez-vous le faire maintenant ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "Aucun retour en arrière une fois lancÊ — dernière chance de renoncer." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "Un redÊmarrage est nÊcessaire. RedÊmarrer maintenant ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "Cette plateforme est limitÊe au mode DÊsengager." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "" +"Cette plateforme prend en charge un ensemble limitÊ d'options de " +"comportement de l'assistance à la direction." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" +"Cette plateforme prend en charge la configuration complète du comportement " +"de l'assistance à la direction." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"Cela supprimera TOUTES les cartes tÊlÊchargÊes\n" +"\n" +"Voulez-vous vraiment supprimer toutes les cartes ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"Cela supprimera du cache TOUS les modèles tÊlÊchargÊs sauf le modèle actif. " +"Êtes-vous sÃģr ?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "Cela effacera dÊfinitivement le profil pSIM Comma de la carte SIM." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "Cela lancera le tÊlÊchargement, qui peut prendre un certain temps." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "Temps" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "Options" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "Total :" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"Trace un arc sur la vue de la route indiquant l'intensitÊ de la direction " +"appliquÊe par IQ.Pilot pendant le contrôle latÊral." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "Guide de prise en main" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "clignotants" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"DÊsactive entièrement la recherche de mises à jour par le " +"rÊseau.
    RedÊmarrez pour que cela prenne effet." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "" +"Saisissez une annÊe puis un modèle — par exemple, 2021 Toyota Corolla :" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "Saisir pour rechercher" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "INDISPONIBLE" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "DÉSINSTALLER" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "METTRE À JOUR" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "Stockage USB" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "UTILISER" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "Impossible de charger la vidÊo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "Indisponible lorsque la voiture est en mode route." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "" +"Indisponible — le contrôle longitudinal IQ.Pilot n'est pas actif sur cette " +"voiture." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "Non dÊtectÊ et non dÊfini" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "DÊsinstaller" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "Inconnu" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "OpÊrateur inconnu" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "Stockage illimitÊ des trajets" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "Mode d'installation des mises à jour" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "" +"Les mises à jour ne sont tÊlÊchargÊes que lorsque la voiture est Êteinte." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "Envoyer pendant la conduite" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"TÊlÊverser les donnÊes de la camÊra orientÊe conducteur et aider à amÊliorer" +" l'algorithme de surveillance du conducteur." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "EnvoyÊ" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "Envoi en cours" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"Utilise le statut HCA 7 au lieu du statut 5 pour le contrôle de la direction" +" sur les vÊhicules de plateforme PQ. Cela peut amÊliorer la compatibilitÊ " +"avec certains anciens modèles Volkswagen." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "Utiliser le système mÊtrique" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"Utiliser le code d'activation :\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"Utilisez le système IQ.Pilot pour l'ACC et l'assistance au maintien de voie." +" Votre attention est requise en permanence pour utiliser cette " +"fonctionnalitÊ." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "VÉHICULE" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "VOIR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (mÊlange de couple virtuel)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "VÊhicule" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"La capacitÊ longitudinale du vÊhicule n'a pas encore ÊtÊ dÊtectÊe. DÊmarrez " +"la voiture une fois pour dÊtecter la prise en charge." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Lecteur vidÊo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "Afficher le journal des erreurs des plantages d'IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "Poids de vision" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "Visuels" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "En attente du signal GPS..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"En attente de la camÊra conducteur. Utilisez le QR code eSIM de l'opÊrateur " +"ou saisissez le code LPA manuellement." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "En attente de dÊmarrage" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "Avertissement" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"Avertissement : cela accorde un accès SSH à toutes les clÊs publiques de vos" +" paramètres GitHub. N'entrez jamais un nom d'utilisateur GitHub autre que le" +" vôtre. Un employÊ d'IQ.Pilot ne vous demandera JAMAIS d'ajouter son nom " +"d'utilisateur GitHub." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"Avertissement : la direction peut osciller dans les virages en dessous de {}" +" ; dÊsactivez cette option si vous le ressentez." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "Bienvenue sur IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "" +"Lorsque activÊ, appuyer sur la pÊdale d'accÊlÊrateur dÊsengagera IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "RÊseau Wi-Fi limitÊ" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "Travail" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "Mauvais mot de passe" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "Oui" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "Oui, supprimer toutes les cartes" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "" +"Vous devez accepter les conditions d'utilisation pour pouvoir utiliser " +"IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"Vous devez accepter les conditions d'utilisation pour utiliser IQ.Pilot. " +"Consultez les dernières conditions avant de continuer sur " +"https://iqlvbs.com/tos." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"Vous devrez ensuite utiliser votre propre profil eSIM. Vous ne pourrez plus " +"utiliser Comma Prime, sauf si vous achetez une nouvelle carte SIM chez " +"comma." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "activer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "actif" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "modèle actif" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "ajouter un profil eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "ajouter un profil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "agressif" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "rÊglages APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "auto sombre" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"mises à jour\n" +"automatiques" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "retour" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "branche" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "dÊlai d'attÊnuation" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "calcul des miles..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "dÊmarrage de la camÊra" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "mobile limitÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"changer\n" +"de langue" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "chercher une mise à jour" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "vÊrification..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "combinÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "modèle combinÊ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "configurÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "connecter" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "connectÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "connexion..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "continuer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "contrôle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "dÊmarrage en douceur (bÃĒta)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "rÊgulateur" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "contrôleur de courbure" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "refuser" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "dÊfaut" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "supprimer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "dÊveloppeur" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "appareil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "ID appareil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"quitter\n" +"hors route" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "dÊsactiver hors route forcÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "dÊsactivÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "dÊconnexion..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "dÊsengager" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "dÊsengager à l'accÊlÊrateur" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "affichage" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "luminositÊ de l'Êcran" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "bas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "tÊlÊcharger la mise à jour" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "tÊlÊchargement" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "tÊlÊchargement..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"aperçu camÊra\n" +"conducteur" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "luminositÊ en conduite" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "dynamique" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "activer la dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "activer l'itinÊrance" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "activÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "forcer le long. d'origine" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "saisir l'APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "saisir le nom GitHub..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "saisir le code LPA..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "saisir le code" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "saisir le mot de passe..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "Êchec de la vÊrification de mise à jour" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "Êchec de la mise à jour" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "rapide" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "finalisation de la mise à jour..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "pour \"{}\"" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "pour les mises à jour de branches privÊes" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"forcer\n" +"hors route" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "forcer l'interface mici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "forcer hors route" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "oubli en cours..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "format : LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "depuis le cache" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "rÊglage long. hyundai" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "info" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "installer la mise à jour" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "interactivitÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "rÊglages iq.dynamic" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "changement de voie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "alertes de sortie de voie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "vitesse de virage" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "mode manœuvre latÊrale" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "latÊral si rÊgulateur en dÊfaut" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "ne pas remplir pour une configuration automatique" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "laisser vide pour ignorer" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "laissez le nom d'utilisateur et le jeton vides pour effacer" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "gauche" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "mode manœuvre longitudinale" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "virages à basse vitesse" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "m" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "gÊrer les profils" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "manuel" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "dÊcalage manuel du dÊlai" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "carte seule" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "prioritÊ carte" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "limitÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "modèles" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "rÊseau" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "usage du rÊseau" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "jamais" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "non" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "aucune alerte" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "sans impulsion" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "normal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "hors de portÊe" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "maintenant" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "impulsion" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "arrÃĒt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "hors ligne" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "marche" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "en ligne" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "nom facultatif..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "associer dans l'app" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "associer à Konn3kt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "poids de politique" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "Êteindre" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "prÊdictif" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "actions du profil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "opÊrateur inconnu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "vider le cache des modèles" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "en attente" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "prÃĒt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "redÊmarrer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "enregistrer la camÊra conducteur" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "enregistrer le micro" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "retÊlÊcharger le modèle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "actualiser les profils" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "infos rÊglementaires" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "dÊtendu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "recharger la liste" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "retirer la pSIM comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "renommer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "renommer le profil..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "rÊinitialiser" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "rÊinitialiser la calibration" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"voir le guide\n" +"de prise en main" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "droite" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "s" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "scanner QR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "scanner QR / saisir code" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "recherche de rÊseaux" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "dÊlai de direction auto-ajustÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "numÊro de sÊrie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "vitesse de consigne" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "unitÊs selon la position" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"glissez pour\n" +"vider le cache" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"glissez pour\n" +"dÊconnecter" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"glissez pour\n" +"oublier" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"glissez pour\n" +"retÊlÊcharger" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"glissez pour\n" +"rÊinitialiser" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"glissez pour\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"glissez pour retirer\n" +"la pSIM comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "lent" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "direction douce" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "logiciel" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "rÊglages de limitation" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "standard" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "veille" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"dÊmarrez la voiture pour\n" +"utiliser IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "dÊmarrage..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "statut" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "rester engagÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "direction" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "comportement de l'assistance" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "d'origine" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "stop-and-go frein à main" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "arrÃĒter le tÊlÊchargement" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "dÊmarrage du système" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "branche cible" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"conditions\n" +"d'utilisation" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "partage de connexion" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "mot de passe du partage" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "options" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "trajets" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "dÊsinstaller" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "dÊsinstaller IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "non limitÊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "non pris en charge" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "haut" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "à jour" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "à jour, dernière vÊrification jamais" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "à jour, dernière vÊrification {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"mode d'installation\n" +"des mises à jour" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "mise à jour disponible" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"le service ne\n" +"rÊpond pas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "unitÊs mÊtriques" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "vÊhicule" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "version" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "mÊlange de couple virtuel" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "poids de vision" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "visuels" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "avertissement" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "mot de passe incorrect" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "oui" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} ALERTE" +msgstr[1] "{} ALERTES" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "il y a {} jour" +msgstr[1] "il y a {} jours" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "il y a {} heure" +msgstr[1] "il y a {} heures" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "il y a {} minute" +msgstr[1] "il y a {} minutes" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 an de stockage de trajets" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "Connexion LTE 24/7" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "ATTENTION : le contrôle longitudinal openpilot est en alpha pour cette " +#~ "voiture et dÊsactivera le freinage d'urgence automatique " +#~ "(AEB).

    Sur cette voiture, openpilot utilise par dÊfaut le " +#~ "rÊgulateur de vitesse adaptatif intÊgrÊ au vÊhicule plutôt que le contrôle " +#~ "longitudinal d'openpilot. Activez ceci pour passer au contrôle longitudinal " +#~ "openpilot. Il est recommandÊ d'activer le mode expÊrimental lors de " +#~ "l'activation du contrôle longitudinal openpilot alpha." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB (Android Debug Bridge) permet de connecter votre appareil via USB ou via" +#~ " le rÊseau. Voir https://docs.comma.ai/how-to/connect-to-comma pour plus " +#~ "d'informations." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "Surveillance continue du conducteur" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "" +#~ "Une version alpha du contrôle longitudinal openpilot peut ÃĒtre testÊe, avec " +#~ "le mode expÊrimental, sur des branches non publiÊes." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "" +#~ "Ajoutez konn3kt.com à votre Êcran d'accueil pour l'utiliser comme une " +#~ "application" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "MODE CHILL ACTIVÉ" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "La modification de ce rÊglage redÊmarrera openpilot si la voiture est sous " +#~ "tension." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "Cliquez sur \"add new device\" et scannez le code QR à droite" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "Refuser, dÊsinstaller openpilot" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "MODE EXPÉRIMENTAL ACTIVÉ" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "" +#~ "Activer la surveillance du conducteur mÃĒme lorsque openpilot n'est pas " +#~ "engagÊ." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "Activer openpilot" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "" +#~ "Activez l'option de contrôle longitudinal openpilot (alpha) pour autoriser " +#~ "le mode expÊrimental." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "Mode expÊrimental" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "" +#~ "Le mode expÊrimental est actuellement indisponible sur cette voiture car " +#~ "l'ACC d'origine est utilisÊ pour le contrôle longitudinal." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "FONCTIONNALITÉS PRIME :" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Mode Firehose" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "Pour une efficacitÊ maximale, rentrez votre appareil et connectez-le chaque semaine à un bon adaptateur USB-C et au Wi‑Fi.\n" +#~ "\n" +#~ "Le Mode Firehose peut aussi fonctionner pendant que vous conduisez si vous ÃĒtes connectÊ à un hotspot ou à une carte SIM illimitÊe.\n" +#~ "\n" +#~ "\n" +#~ "Foire aux questions\n" +#~ "\n" +#~ "Est-ce que la manière ou l'endroit oÚ je conduis compte ? Non, conduisez normalement.\n" +#~ "\n" +#~ "Tous mes segments sont-ils rÊcupÊrÊs en Mode Firehose ? Non, nous rÊcupÊrons de façon sÊlective un sous-ensemble de vos segments.\n" +#~ "\n" +#~ "Quel est un bon adaptateur USB-C ? Tout chargeur rapide de tÊlÊphone ou d'ordinateur portable convient.\n" +#~ "\n" +#~ "Le logiciel utilisÊ importe-t-il ? Oui, seul openpilot amont (et certains forks) peut ÃĒtre utilisÊ pour l'entraÃŽnement." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "Allez sur https://konn3kt.com sur votre tÊlÊphone" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "INACTIF : connectez-vous à un rÊseau non limitÊ" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "Mode dÊbogage joystick" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "" +#~ "Maximisez vos envois de donnÊes d'entraÃŽnement pour amÊliorer les modèles de" +#~ " conduite d'openpilot." + +#~ msgid "NO" +#~ msgstr "NON" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "Aucune clÊ SSH trouvÊe" + +#, python-format +#~ msgid "Open" +#~ msgstr "Ouvrir" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "" +#~ "Associez votre appareil à Konn3kt (konn3kt.com) et rÊclamez votre offre " +#~ "Konn3kt." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "Devenez membre Konn3kt sur konn3kt.com" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "Captures à distance" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "Consultez les règles, fonctionnalitÊs et limitations d'openpilot" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "Le mode standard est recommandÊ. En mode agressif, openpilot suivra les " +#~ "vÊhicules de tÃĒte de plus près et sera plus agressif avec l'accÊlÊrateur et " +#~ "le frein. En mode dÊtendu, openpilot restera plus ÊloignÊ des vÊhicules de " +#~ "tÃĒte. Sur les voitures compatibles, vous pouvez parcourir ces personnalitÊs " +#~ "avec le bouton de distance du volant." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "" +#~ "Utilisez le système openpilot pour l'ACC et l'assistance au maintien de " +#~ "voie. Votre attention est requise en permanence pour utiliser cette " +#~ "fonctionnalitÊ." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "Avertissement : Ceci accorde un accès SSH à toutes les clÊs publiques dans " +#~ "vos paramètres GitHub. N'entrez jamais un nom d'utilisateur GitHub autre que" +#~ " le vôtre. Un employÊ comma ne vous demandera JAMAIS d'ajouter son nom " +#~ "d'utilisateur GitHub." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "Bienvenue sur openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "" +#~ "Lorsque activÊ, appuyer sur la pÊdale d'accÊlÊrateur dÊsengagera openpilot." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "Vous devez accepter les conditions gÊnÊrales pour utiliser openpilot." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "Vous devez accepter les conditions gÊnÊrales pour utiliser openpilot. Lisez " +#~ "les dernières conditions sur https://comma.ai/terms avant de continuer." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "Contrôle longitudinal openpilot (Alpha)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot indisponible" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilot roule par dÊfaut en mode chill. Le mode expÊrimental active des " +#~ "fonctionnalitÊs de niveau alpha qui ne sont pas prÃĒtes pour le mode chill. " +#~ "Les fonctionnalitÊs expÊrimentales sont listÊes ci‑dessous:

    Contrôle " +#~ "longitudinal de bout en bout


    Laissez le modèle de conduite contrôler" +#~ " l'accÊlÊrateur et les freins. openpilot conduira comme il pense qu'un " +#~ "humain le ferait, y compris s'arrÃĒter aux feux rouges et aux panneaux stop. " +#~ "Comme le modèle dÊcide de la vitesse à adopter, la vitesse rÊglÊe n'agira " +#~ "que comme une limite supÊrieure. C'est une fonctionnalitÊ de qualitÊ alpha ;" +#~ " des erreurs sont à prÊvoir.

    Nouvelle visualisation de " +#~ "conduite


    La visualisation passera à la camÊra grand angle orientÊe " +#~ "route à basse vitesse pour mieux montrer certains virages. Le logo du mode " +#~ "expÊrimental sera Êgalement affichÊ en haut à droite." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "La modification de ce rÊglage redÊmarrera openpilot si la voiture est sous " +#~ "tension." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilot apprend à conduire en regardant des humains, comme vous, conduire.\n" +#~ "\n" +#~ "Le Mode Firehose vous permet de maximiser vos envois de donnÊes d'entraÃŽnement pour amÊliorer les modèles de conduite d'openpilot. Plus de donnÊes signifie des modèles plus grands, ce qui signifie un meilleur Mode expÊrimental." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "" +#~ "Le contrôle longitudinal openpilot pourra arriver dans une future mise à " +#~ "jour." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "" +#~ "openpilot exige que l'appareil soit montÊ à moins de 4° à gauche ou à droite" +#~ " et à moins de 5° vers le haut ou 9° vers le bas." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "" +#~ "{} segment de votre conduite est dans l'ensemble d'entraÃŽnement jusqu'à " +#~ "prÊsent." +#~ msgstr[1] "" +#~ "{} segments de votre conduite sont dans l'ensemble d'entraÃŽnement jusqu'à " +#~ "prÊsent." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ ABONNÉ" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Mode Firehose đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_ja.mo b/iqpilot/selfdrive/ui/translations/app_ja.mo new file mode 100644 index 000000000..b82a35338 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_ja.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_ja.po b/iqpilot/selfdrive/ui/translations/app_ja.po new file mode 100644 index 000000000..d7323da9c --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_ja.po @@ -0,0 +1,4483 @@ +# Japanese translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-22 16:32-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr "īŧˆæ—ĸ厚īŧ‰" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " ゚テã‚ĸãƒĒãƒŗã‚°ãƒˆãƒĢクåŋœį­”ãŽã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗãŒåŽŒäē†ã—ぞした。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " ゚テã‚ĸãƒĒãƒŗã‚°ãƒˆãƒĢクåŋœį­”ãŽã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã¯{}%厌äē†ã—ぞした。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " デバイ゚は{:.1f}°{}、{:.1f}°{}ぎ向きです。" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    ゚テã‚ĸãƒĒãƒŗã‚°é…åģļãŽã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗãŒåŽŒäē†ã—ぞした。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    ゚テã‚ĸãƒĒãƒŗã‚°é…åģļãŽã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã¯{}%厌äē†ã—ぞした。" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "ADBīŧˆAndroid Debug Bridgeīŧ‰ã‚’äŊŋうと、USBぞたはネットワãƒŧクįĩŒį”ąã§ãƒ‡ãƒã‚¤ã‚šãĢæŽĨįļšã§ããžã™ã€‚" + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "čŋŊ加" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "ᴝ荈" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "APNč¨­åŽš" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "čĒč¨ŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "č‡Ē動" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "加速バãƒŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "åŠ é€ŸãƒĄãƒŧã‚ŋãƒŧ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "過åēĻãĒäŊœå‹•ã‚’æ‰ŋčĒ" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "有劚化" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "äŊŋį”¨ä¸­ãŽãƒĸデãƒĢ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "{} をčļ…えるときぎãŋ有劚です。" + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "eSIMãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "čģŠįˇščģĸ回ぎ希望速åēĻをčĒŋ整" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "čŠŗį´°č¨­åŽš" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"こぎ垌は、ごč‡ĒčēĢぎeSIMãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢをäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚\n" +"\n" +"commaから新しいSIMをčŗŧå…ĨしãĒい限り、Comma Primeã‚’å†ãŗåˆŠį”¨ã™ã‚‹ã“ã¨ã¯ã§ããžã›ã‚“ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "ã‚ĸグãƒŦãƒƒã‚ˇãƒ–" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "同意する" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "すずãĻ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "å…¨åˇžīŧˆį´„6.0 GBīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"č‡Ē動再į™ēé€˛ãŽãĒいåģļé•ˇãƒ›ãƒŧãƒĢドäģ˜ãFtSãĢ寞åŋœã™ã‚‹ãƒ•りãƒĢク゚ワãƒŧã‚˛ãƒŗMQBčģŠã§ã€IQ.PilotがMQBぎACC再開動äŊœã‚’äŊŋį”¨ã§ãã‚‹ã‚ˆã†ãĢしぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "クãƒĢãƒŧã‚ēã‚ŗãƒŗãƒˆãƒ­ãƒŧãƒĢãŽį•°å¸¸ãĢよりį¸Ļ斚向åˆļåžĄīŧˆã‚ĸクã‚ģãƒĢīŧãƒ–ãƒŦãƒŧキīŧ‰ãŒä¸€æ™‚įš„ãĢäŊŋえãĒい場合でも、æ¨Ē斚向åˆļåžĄīŧˆæ“čˆĩīŧ‰ã‚’äŊœå‹•させたぞぞãĢしぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "常時æ¨Ē斚向åˆļåžĄ (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "そぎäģ–多数" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "すぐãĢéŠį”¨ã•ã‚Œãžã™ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "æŦĄãĢデバイ゚がã‚ĒフロãƒŧドãĢãĒãŖãŸã¨ããĢéŠį”¨ã•ã‚Œãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "æœŦåŊ“ãĢé›ģæēã‚’ã‚ĒフãĢしぞすかīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "æœŦåŊ“ãĢ再čĩˇå‹•しぞすかīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "IQ.PilotぎすずãĻãŽč¨­åŽšã‚’åˆæœŸå€¤ãĢæˆģしぞすかīŧŸč¨­åŽšã‚’ãƒĒã‚ģットすると元ãĢはæˆģせぞせん。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "æœŦåŊ“ãĢã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’ãƒĒã‚ģットしぞすかīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "æœŦåŊ“ãĢã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢしぞすかīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "č‡Ē動" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "č‡Ē動čģŠįˇšå¤‰æ›´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "č‡Ē動čģŠįˇšå¤‰æ›´: 逪įļšå¤‰æ›´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "č‡Ē動 — 減光" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "č¨­åŽšį”ģéĸぎč‡Ē動クロãƒŧã‚ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "ベãƒŧã‚ŋåŽŸčŖ…ãŒéŠį”¨ã•ã‚Œã‚‹Subaruぎプナットフりãƒŧムで、前čģŠčŋŊ垓中ãĢ停æ­ĸからč‡Ē動で再į™ēé€˛ã—ãžã™ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "クãƒĢãƒŧã‚ē切æ›ŋæ™‚ãŽåˆŠį”¨å¯åĻ" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "æˆģる" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "æ­ģ角č­Ļ告" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "æ­ģ角č­Ļ告" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "ã‚Ļã‚¤ãƒŗã‚Ģãƒŧ襨į¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "ã‚Ļã‚¤ãƒŗã‚ĢãƒŧãĢよるčģŠįˇšå¤‰æ›´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "čĩˇå‹•時ぎįŠļ態" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "ブãƒŦãƒŧキ時ぎåŋœį­”ãƒĸãƒŧド" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "ã‚¯ãƒŠã‚ˇãƒƒã‚¯UIぎ嚅åēƒãĒã‚Ēフロãƒŧド゚テãƒŧã‚ŋã‚ščĄ¨į¤ēを垊æ´ģさせぞす。渊åēĻ、čģŠä¸Ąã€Konn3ktぎįŠļæ…‹ãŒã˛ã¨į›Žã§åˆ†ã‹ã‚Šãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "変更" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "įĸēčĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "æļˆåŽģ" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "æŽĨįļš" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "æŽĨįļšä¸­..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "ã‚­ãƒŖãƒŗã‚ģãƒĢ" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "ãƒŠãƒ“ã‚˛ãƒŧã‚ˇãƒ§ãƒŗã‚’ã‚­ãƒŖãƒŗã‚ģãƒĢ" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "垓量čĒ˛é‡‘ãŽæēå¸¯å›žįˇš" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "言čĒžã‚’å¤‰æ›´" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "čģŠãŒčĩˇå‹•ä¸­ãŽå ´åˆã€ã“ãŽč¨­åŽšã‚’å¤‰æ›´ã™ã‚‹ã¨IQ.Pilotが再čĩˇå‹•しぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "įĸēčĒæ¸ˆãŋ {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "ãƒĸデãƒĢを選択" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"į¸Ļ斚向ぎ挙動を選択しぞす: " +"IQ.PilotīŧˆIQį¸ĻåˆļåžĄīŧ‹ã‚¨ãƒŗãƒ‰ãƒ„ãƒŧã‚¨ãƒŗãƒ‰īŧ‰ã€IQ.DynamicīŧˆIQį¸ĻåˆļåžĄīŧ‹ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ãƒĸãƒŧドīŧ‰ã€IQ.ChillīŧˆIQį¸ĻåˆļåžĄīŧ‹ã‚†ãŖãŸã‚Šãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢīŧ‰ã€ãžãŸã¯į´”æ­ŖACC。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "手動で選択" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "ã‚­ãƒŖãƒƒã‚ˇãƒĨをæļˆåŽģ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "選択したãƒĸデãƒĢãŽã‚­ãƒŖãƒƒã‚ˇãƒĨをæļˆåŽģしãĻ再ダã‚Ļãƒŗãƒ­ãƒŧドしぞすかīŧŸ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "閉じる" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"MEB ãŠã‚ˆãŗ MQB Evo čģŠä¸Ąã§ã‚šãƒ†ã‚ĸãƒĒãƒŗã‚°åˆļåžĄã‚’é–‰ãƒĢãƒŧプãĢしぞす。IQ.Pilot " +"ã¯č¨ˆį”ģã—ãŸæ›˛įŽ‡ã‚’ããŽãžãžé€ã‚‹ãŽã§ã¯ãĒく、čģŠä¸ĄãŒåŽŸéš›ãĢ描いãĻã„ã‚‹æ›˛įŽ‡ãĢ合わせãĻ操čˆĩ指äģ¤ã‚’čŖœæ­Ŗã—ãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "クナã‚Ļド" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "クナã‚Ļドぎãŋ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "クナã‚Ļド動į”ģã¯åˆŠį”¨ã§ããžã›ã‚“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "ãƒ•ã‚Ŗãƒŗã‚ŦãƒŧプãƒĒãƒŗãƒˆįŠļæ…‹ãŽč‰˛åˆ†ã‘:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "įĩąåˆãƒĸデãƒĢ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"į¸Ļ斚向ã‚ĸクチãƒĨエãƒŧã‚ŋãƒŧぎåŋœį­”ã‚’æ¸ŦåŽšã™ã‚‹ãŸã‚ã€ã‚ã‚‰ã‹ã˜ã‚åŽšã‚ãŸåŠ é€Ÿã‚šãƒ†ãƒƒãƒ—ãŽæ‰‹é †ã‚’åŽŸčĄŒã—ãžã™ã€‚IQ.Pilotぎį¸Ļ斚向åˆļåžĄãŒåŋ…čĻã§ã™ã€‚čĻ‹é€šã—ãŽč‰¯ã„é–‰éŽ–čˇ¯ã§ãŽãŋäŊŋį”¨ã—ãĻください。" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸクチãƒĨエãƒŧã‚ŋãƒŧぎåŋœį­”ã‚’æ¸Ŧ厚するため、あらかじめ厚めたæ¨ĒåŠ é€Ÿã‚šãƒ†ãƒƒãƒ—ãŽæ‰‹é †ã‚’åŽŸčĄŒã—ãžã™ã€‚į›´įˇšã§åšŗåĻãĒ、čĻ‹é€šã—ãŽč‰¯ã„é“čˇ¯ã§ãŽãŋäŊŋį”¨ã—ãĻください。" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "įĸēčĒ" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "įļšã‘ã‚‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "逪įļšå¤‰æ›´" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "åˆļåžĄ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"速åēĻåˆļ限ãĢ寞するIQ.Pilotぎ動äŊœã‚’åˆļåžĄã—ãžã™ã€‚ã‚Ēフは速åēĻåˆļ限抟čƒŊã‚’į„ĄåŠšãĢã—ã€æƒ…å ąã¯åˆļé™ã‚’čĄ¨į¤ēするだけ、č­Ļ告は速åēĻčļ…過をåŧˇčĒŋし、åˆļåžĄã¯æ¤œå‡ēしたåˆļ限ãĢ合わせãĻč¨­åŽšé€ŸåēĻをčĒŋ整しぞす。" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "SSHキãƒŧを取垗できぞせん - ログをįĸēčĒã—ãĻください" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "ããŽå ´æ‰€ã‚’į‰šåŽšã§ããžã›ã‚“ã§ã—ãŸ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "GitHubãĢæŽĨįļšã§ããžã›ã‚“ - æŽĨįļšã‚’įĸēčĒã—ãĻください" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "GitHubを検č¨ŧできぞせん - デバイ゚ぎ時åˆģをįĸēčĒã—ãĻください" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "å›Ŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "ã‚¯ãƒŠãƒƒã‚ˇãƒĨログ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "停æ­ĸįŠļ態からぎクãƒĒãƒŧプīŧˆãƒ™ãƒŧã‚ŋīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "停æ­ĸįŠļ態からぎクãƒĒãƒŧプ — æ‰‹å‹•ãƒãƒŗãƒ‰ãƒ–ãƒŦãƒŧキīŧˆãƒ™ãƒŧã‚ŋīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "クãƒĢãƒŧã‚ē" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "įžåœ¨ãŽãƒãƒŧã‚¸ãƒ§ãƒŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "æ›˛įŽ‡ã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "削除" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "切断中..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧド" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "拒åĻする" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "拒åĻしãĻIQ.Pilotをã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "デフりãƒĢト" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "デフりãƒĢトīŧˆCD210īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "デフりãƒĢト: čĩ°čĄŒå¯čƒŊãĒįŠļ態でčĩˇå‹•し、すぐãĢäŊœå‹•できぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"ã‚Ļã‚¤ãƒŗã‚ĢãƒŧãĢよるčģŠįˇšå¤‰æ›´ãŒč‡Ē動で始ぞるぞでぎ遅åģļæ™‚間です。遅åģļã‚’č¨­åŽšã™ã‚‹ã¨ã€ãƒãƒŗãƒ‰ãƒĢを動かすåŋ…čĻã¯ã‚ã‚Šãžã›ã‚“īŧˆæ—ĸåŽšã¯ãƒãƒŗãƒ‰ãƒĢ操äŊœīŧ‰ã€‚
    äē¤é€šįŠļæŗã¨é“čˇ¯ãŒåŽŸéš›ãĢそぎ操äŊœã‚’č¨ąã™å ´åˆãĢぎãŋ、ã‚Ļã‚¤ãƒŗã‚ĢãƒŧをäŊŋãŖãĻください。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "æ­ģč§’æ™‚ãŽé…åģļ" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "削除" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "į„ĄåŠšãĒãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢ「{}」を削除しぞすかīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "こぎログを削除しぞすかīŧŸ" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "į›Žįš„åœ°ã‚’č¨­åŽšã—ãžã—ãŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "č‡Ēå‹•įš„ãĢ検å‡ē" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "開į™ē者" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "デバイ゚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "ペã‚ĸãƒĒãƒŗã‚°ã™ã‚‹ãĢは、デバイ゚がKonn3ktãĢį™ģéŒ˛ã•ã‚ŒãĻいるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "減光ぞでぎ時間" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "切断" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "觪除" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "ã‚Ēフロãƒŧドをåŧˇåˆļする前ãĢč§Ŗé™¤ã—ãĻください" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "ã‚Ēãƒŗãƒ­ãƒŧドをåŧˇåˆļする前ãĢč§Ŗé™¤ã—ãĻください" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "ã‚ĸクã‚ģãƒĢã§č§Ŗé™¤" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "č§Ŗé™¤ã—ãĻé›ģæēã‚Ēフ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "č§Ŗé™¤ã—ãĻ再čĩˇå‹•" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "č§Ŗé™¤ã—ãĻã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’ãƒĒã‚ģット" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "{}するãĢã¯č§Ŗé™¤ã—ãĻください" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "觪除: ブãƒŦãƒŧキで゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆãŒåŽŒå…¨ãĢã‚ĒフãĢãĒりぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "ãƒ‡ã‚Ŗã‚šãƒ—ãƒŦイ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "į”ģéĸぎ明るさ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "速åēĻをmphではãĒくkm/hã§čĄ¨į¤ēしぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "距é›ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "ドナイバãƒŧã‚ĢãƒĄãƒŠãŽãƒ‡ãƒŧã‚ŋをã‚ĸップロãƒŧドしぞすかīŧŸ" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "厌äē†" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "ãƒ‰ãƒŗã‚°ãƒĢID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧド" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧドãĢå¤ąæ•—ã—ãžã—ãŸ — もう一åēĻおčŠĻしください。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "åœ°å›ŗã‚ŋイãƒĢをダã‚Ļãƒŗãƒ­ãƒŧド中" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "į”ģéĸåˇĻį̝ãĢ、原æ¸Ŧした加速と減速をį¤ēすバãƒŧを描į”ģã—ãžã™ã€‚ãƒ—ãƒŠãƒŗãƒŠãƒŧぎčĻæą‚ã§ã¯ãĒく、čģŠãŒäģŠåŽŸéš›ãĢčĄŒãŖãĻいる動きです。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"デバイ゚ãĢäŋå­˜ã—たã‚ŋイãƒĢからį”ģéĸåœ°å›ŗã‚’æį”ģしぞす。ã‚ĒãƒŗãƒŠã‚¤ãƒŗã¨äŊĩį”¨ã™ã‚‹ã¨ã€æŽĨįļšãŒåˆ‡ã‚ŒãŸįžŦ間ãĢäŋå­˜æ¸ˆãŋã‚ŋイãƒĢがåŧ•きįļ™ãŽãžã™ã€‚ã‚ŋイãƒĢは選択した地域ぎ分がダã‚Ļãƒŗãƒ­ãƒŧドされぞす。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "ドナイバãƒŧã‚ĢãƒĄãƒŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "ドナイバãƒŧã‚ĢãƒĄãƒŠãŽįĸēčĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "ドナイバãƒŧäģ‹å…Ĩæ™‚ãŽæ‰ąã„" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "čĩ°čĄŒå›žæ•°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "čĩ°čĄŒä¸­ãŽæ˜Žã‚‹ã•" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "čĩ°čĄŒæ€§æ ŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "ダイナミック" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "ダイナミックチãƒĨãƒŧãƒ‹ãƒŗã‚°: ã‚ĸクã‚ģãƒĢとブãƒŦãƒŧキぎåŋœį­”がより抟敏ãĢãĒりぞす。" + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "ᎍ集" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "エナãƒŧ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "有劚化" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "ADBを有劚化" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Always on LateralīŧˆAOLīŧ‰ã‚’有劚ãĢしぞす。こぎ゚イッチをã‚ĒフãĢすると、IQ.Pilot標æē–ぎ゚テã‚ĸãƒĒãƒŗã‚°äŊœå‹•å‹•äŊœãĢæˆģりぞす。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "ドナイブãƒŦã‚ŗãƒŧダãƒŧを有劚化" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "čģŠįˇšé€¸č„ąč­Ļå ąã‚’æœ‰åŠšåŒ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "äŊŽé€Ÿã§LKASãŽį•°å¸¸ãŒå‡ēるフりãƒĢク゚ワãƒŧã‚˛ãƒŗMQBčģŠã§ã€MQBぎ操čˆĩロックã‚ĸã‚Ļトå‡Ļį†ã‚’æœ‰åŠšãĢしぞす。" + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "ロãƒŧãƒŸãƒŗã‚°ã‚’æœ‰åŠšåŒ–" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "SSHを有劚化" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "テã‚ļãƒĒãƒŗã‚°ã‚’æœ‰åŠšåŒ–" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "IQ.PilotがæœĒäŊœå‹•でもドナイバãƒŧãƒĸニã‚ŋãƒĒãƒŗã‚°ã‚’æœ‰åŠšãĢしぞす。" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "APNをå…Ĩ力" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ™ãƒŧã‚ˇãƒ§ãƒŗã‚ŗãƒŧドをå…Ĩ力" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "ã‚ŗãƒŧドをå…Ĩ力" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "SSIDをå…Ĩ力" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "äŊæ‰€ãžãŸã¯å ´æ‰€ã‚’å…Ĩ力" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "新しいテã‚ļãƒĒãƒŗã‚°ãŽãƒ‘ã‚šãƒ¯ãƒŧドをå…Ĩ力" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "パ゚ワãƒŧドをå…Ĩ力" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "GitHubãƒĻãƒŧã‚ļãƒŧ名をå…Ĩ力" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "エナãƒŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "ã‚Ēフロãƒŧドãƒĸãƒŧドをįĩ‚äē†" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "æ‹Ąåŧĩ゚テãƒŧã‚ŋ゚バãƒŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "åŽŸé¨“įš„ãĒ前čĩ°čģŠMPC" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"ã‚ŗãƒŗãƒ”ãƒĨãƒŧã‚ŋãƒŧãĢæŽĨįļšã™ã‚‹ã¨ã€æœ€čŋ‘ぎドナイブãƒŦã‚ŗãƒŧダãƒŧæ˜ åƒã¨ãƒ­ã‚°ãŽã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆã‚’USBドナイブとしãĻå…Ŧ開しぞす。これが有劚ãĒ間もIQ.Pilotは動äŊœã‚’įļšã‘ぞす。" + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "削除中..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "įžåœ¨ã€ãƒˆãƒ¨ã‚ŋį´”æ­ŖãŽį¸Ļ斚向åˆļåžĄãŒåŧˇåˆļされãĻã„ãžã™ã€‚į„ĄåŠšãĢするãĢはIQぎį¸Ļ斚向ãƒĸãƒŧドを選択しãĻください。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "åˇĨå ´å‡ēčˇæ™‚ãŽį¸Ļ斚向チãƒĨãƒŧãƒ‹ãƒŗã‚°ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "お気ãĢå…Ĩり" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "åœ°å›ŗã‚’å–åž—ä¸­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "åœ°å›ŗã‚’å–åž—ä¸­..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "最įĩ‚č­Ļ告" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "おäŊŋいぎčģŠä¸Ąã‚’æŽĸす" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "ã‚ģットã‚ĸップを厌äē†" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "æ­ģ角ãĢäŊ•かがあるとčģŠãŒå ąå‘Šã™ã‚‹ãŸãŗãĢ、側斚ãĢč­Ļå‘Šã‚’čĄ¨į¤ēしぞすīŧˆBSM搭čŧ‰čģŠãŽãŋīŧ‰ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "これを変更するãĢは、デバイ゚パネãƒĢから常時ã‚Ēフロãƒŧドをã‚ĒãƒŗãĢするか、čģŠãŽé›ģæēã‚’åˆ‡ãŖãĻください。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "čģŠé–“距é›ĸ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "ã‚ĸプãƒĒãŽæĄˆå†…ãĢåž“ãŖãĻペã‚ĸãƒĒãƒŗã‚°ã‚’åŽŒäē†ã—ぞす" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "IQ.Pilotを10分間ã‚Ēãƒŗãƒ­ãƒŧドãĢåŧˇåˆļしぞすかīŧŸå¸¸æ™‚ã‚Ēフロãƒŧドがč‡Ēå‹•įš„ãĢ有劚ãĢãĒり、ã‚ŋイマãƒŧįĩ‚äē†åžŒã¯ã‚ĒフロãƒŧドãĢæˆģりぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Mici UIをåŧˇåˆļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "ã‚Ēãƒŗãƒ­ãƒŧドをåŧˇåˆļīŧˆ10分īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "ã‚Ēãƒŗãƒ­ãƒŧドぎåŧˇåˆļはã‚Ēフロãƒŧド中ãĢぎãŋ開始できぞす" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "ã‚Ēãƒŗãƒ­ãƒŧドぎåŧˇåˆļはすでãĢ有劚です。ã‚ŋイマãƒŧを10分ãĢãƒĒã‚ģットしぞすかīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "åŧˇåˆļã‚Ēãƒŗãƒ­ãƒŧドが有劚" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "削除" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "Wi‑Fiネットワãƒŧク「{}」を削除しぞすかīŧŸ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "艝åĨŊ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "GitčĒč¨ŧ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Gitトãƒŧã‚¯ãƒŗ / パ゚ワãƒŧド" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "GitãƒĻãƒŧã‚ļãƒŧ名" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "キãƒŧぎ取垗中ãĢGitHubエナãƒŧīŧˆ{}īŧ‰" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "éĢ˜æ¸Š" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "非å…Ŧ開ネットワãƒŧク" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "æ­ģč§’æ¤œįŸĨ中はčģŠįˇšå¤‰æ›´ã‚’äŋį•™" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "動かさãĒいでください..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "æ­ģ角ãƒĸニã‚ŋãƒĒãƒŗã‚°ãŒå¯žčąĄčģŠįˇšãĢčģŠã‚’検įŸĨしãĻいる間はč‡Ē動čģŠįˇšå¤‰æ›´ã‚’äŋį•™ã—、čģŠįˇšãŒįŠēきæŦĄįŦŦã€åŽŸčĄŒã—ãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "č‡Ē厅" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "時間" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "č¨­åŽšį”ģéĸが操äŊœã•れãĒいぞぞ、č‡Ēå‹•įš„ãĢ閉じるぞでぎ時間です。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "č‡Ē動čĒŋ整がã‚Ēフぎとき、čģŠč‡ĒäŊ“ぎ゚テã‚ĸãƒĒãƒŗã‚°ãƒŠãƒƒã‚¯é…åģļãĢãŠã‚Œã ã‘å…ˆčĄŒæ™‚é–“ã‚’åŠ ãˆã‚‹ã‹ã‚’æŒ‡åŽšã—ãžã™ã€‚æ—ĸ厚は0.2į§’ã§ã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "IPã‚ĸドãƒŦ゚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "IQ åŧˇåˆļ停æ­ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "IQãƒĸãƒŧド" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "こぎčģŠä¸Ąã§ã¯IQぎį¸Ļ斚向ãƒĸãƒŧãƒ‰ã‚’åˆŠį”¨ã§ããžã›ã‚“ã€‚į´”æ­ŖACCが唯一ぎ選択č‚ĸです。" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic ã‚Ģãƒŧブ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic 前čĩ°čģŠãŽé€ŸåēĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic äŊŽé€Ÿ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic ãƒĸデãƒĢ停æ­ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic SLCフりãƒŧãƒĢバック" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic 前čĩ°čģŠãŒäŊŽé€Ÿ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic 前čĩ°čģŠãŒåœæ­ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "IQ.OSぎバãƒŧã‚¸ãƒ§ãƒŗ" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilotã¯åˆŠį”¨ã§ããžã›ã‚“" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"IQ.Pilotはįļ™įļšįš„ãĢã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’čĄŒãŖãĻおり、ãƒĒã‚ģットがåŋ…čρãĢãĒã‚‹ã“ã¨ã¯į¨€ã§ã™ã€‚čģŠãŒčĩˇå‹•中ãĢã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’ãƒĒã‚ģットするとIQ.Pilotが再čĩˇå‹•しぞす。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "IQ.Pilotでは、デバイ゚ぎ取りäģ˜ã‘č§’åēĻがåˇĻåŗÂą4°、上斚向5°äģĨ内、下斚向9°äģĨ内であるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"時速20マイãƒĢīŧˆ32 " +"km/hīŧ‰äģĨ下でčĩ°čĄŒä¸­ãĢã‚Ļã‚¤ãƒŗã‚Ģãƒŧをå‡ēしãĻいると、čģŠã¯æœ€ã‚‚čŋ‘いčĩ°čĄŒå¯čƒŊãĒé€˛čˇ¯ã§ããŽæ–šå‘ã¸ãŽæ›˛ãŒã‚Šã‚’ãƒ—ãƒŠãƒŗãƒ‹ãƒŗã‚°ã—ãžã™ã€‚ã“ã‚ŒãĢより、čĩ¤äŋĄåˇãĒおでčģŠãŒčĒ¤ãŖãŸæ–šå‘ãŽæ›˛ãŒã‚Šã‚’ãƒ—ãƒŠãƒŗãƒ‹ãƒŗã‚°ã™ã‚‹ä狿…‹ã‚’é˜˛ãŽãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "æƒ…å ą" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "eSIMをäŊŋį”¨ã™ã‚‹ãĢは、デバイ゚ãĢäģ˜åąžã—ãĻã„ãŸį´”æ­ŖãŽcomma SIMã‚ĢãƒŧドをæŒŋå…ĨしãĻください" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "ã‚ĸップデãƒŧãƒˆã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "į„ĄåŠšãĒQRã‚ŗãƒŧド" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "km" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "KONN3KTエナãƒŧ" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KTã‚Ēãƒ•ãƒŠã‚¤ãƒŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "デバイ゚をã‚ĒフロãƒŧドぎぞぞãĢする" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "į´”æ­ŖãŽã‚ĸクã‚ģãƒĢとブãƒŦãƒŧキをįļ­æŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "ã‚ĸクã‚ģãƒĢとブãƒŦãƒŧã‚­ã¯į´”æ­ŖãŽãƒˆãƒ¨ã‚ŋčŖŊã‚ˇã‚šãƒ†ãƒ ãĢäģģせ、IQ.Pilotは操čˆĩぎãŋã‚’čĄŒã„ãžã™ã€‚" + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Konn3ktぎ抟čƒŊ:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Konn3ktぎ゚テãƒŧã‚ŋ゚:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "åˆļ限" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "čĒ­ãŋčžŧãŋ中" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "čĒ­ãŋčžŧãŋ中..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "čģŠįˇšå¤‰æ›´ãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "クãƒĢãƒŧã‚ēį•°å¸¸æ™‚ãŽæ¨Ē斚向åˆļåžĄ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "æ¨Ē斚向マニãƒĨãƒŧバãƒŧãƒĸãƒŧド" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "前斚čģŠä¸ĄãŽčĄ¨į¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "常時ã‚ĒフロãƒŧドãƒĸãƒŧドをäģŠã™ãįĩ‚äē†ã—ぞすかīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "åŧˇåˆļã‚ĒフロãƒŧドãƒĸãƒŧドをäģŠã™ãįĩ‚äē†ã—ぞすかīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "゚テã‚ĸãƒĒãƒŗã‚°ãŽåŋœį­”時間をIQ.PilotãĢ計æ¸Ŧさせ、そぎ値を最新ãĢäŋãĄãžã™ã€‚ã‚ĒフãĢすると、値をč‡Ē分でå›ē厚できぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "äŊœå‹•中ãĢ゚テã‚ĸãƒĒãƒŗã‚°ã‚’åŽŒå…¨ãĢč§Ŗé™¤ã™ã‚‹ã“ã¨ãĒãã€ãƒãƒŗãƒ‰ãƒĢを動かせるようãĢしぞす。" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "ナイブ配äŋĄ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "%s をčĒ­ãŋčžŧãŋ中" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "動į”ģをčĒ­ãŋčžŧãŋ中" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "čĒ­ãŋčžŧãŋ中..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "äŊįŊŽã‚’į‰šåޚ䏭..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "こぎプナットフりãƒŧムではã‚ĒフãĢå›ē厚されãĻいぞす。čģŠä¸ĄãŒäģ–ぎ選択č‚ĸãĢ寞åŋœã—ãĻいぞせん。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "į¸Ļ斚向åˆļåžĄ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"į¸Ļ斚向åˆļåžĄãŽãƒĸãƒŧド:
    IQ.Pilotぎ抟čƒŊはäģĨ下ぎとおりです:

    IQ.Pilot " +"ã‚¨ãƒŗãƒ‰ãƒ„ãƒŧã‚¨ãƒŗãƒ‰į¸Ļ斚向åˆļåžĄ


    čĩ°čĄŒãƒĸデãƒĢãĢã‚ĸクã‚ģãƒĢとブãƒŦãƒŧキをäģģせぞす。IQ.Pilotは、čĩ¤äŋĄåˇã‚„一時停æ­ĸæ¨™č­˜ã§ãŽåœæ­ĸをåĢめ、äēē間ãĒらこう運čģĸã™ã‚‹ã ã‚ã†ã¨č€ƒãˆã‚‹ã¨ãŠã‚ŠãĢčĩ°čĄŒã—ぞす。速åēĻはčĩ°čĄŒãƒĸデãƒĢがæąēã‚ã‚‹ãŸã‚ã€č¨­åŽšé€ŸåēĻは上限としãĻぎãŋ抟čƒŊしぞす。こぎ抟čƒŊã¯ãžã æ”šč‰¯ä¸­ã§ã€čĒ¤ã‚ŠãŒčĩˇã“り垗ぞす。

    IQ.Dynamic


    įŠļæŗã‚„å ´éĸãĢåŋœã˜ãĻ、ã‚ĸãƒ€ãƒ—ãƒ†ã‚Ŗãƒ–ã‚¯ãƒĢãƒŧã‚ēãŽæŒ™å‹•ã¨ã‚¨ãƒŗãƒ‰ãƒ„ãƒŧã‚¨ãƒŗãƒ‰ãŽæŒ™å‹•ã‚’å‹•įš„ãĢæˇˇãœåˆã‚ã›ãžã™ã€‚

    IQ.Chill


    į¸Ļ斚向åˆļåžĄãĢ、äē¤é€šįŠļæŗãĢåŋœã˜ãŸæ¨™æē–įš„ãĒクãƒĢãƒŧã‚ēぎ挙動をäŊŋį”¨ã—ãžã™ã€‚

    新しいčĩ°čĄŒãƒ“ジãƒĨã‚ĸナイã‚ŧãƒŧã‚ˇãƒ§ãƒŗ


    äŊŽé€Ÿæ™‚ãĢは、一部ぎã‚ĢãƒŧブをよりčĻ‹ã‚„ã™ãã™ã‚‹ãŸã‚ã€čĩ°čĄŒãƒ“ジãƒĨã‚ĸナイã‚ŧãƒŧã‚ˇãƒ§ãƒŗãŒå‰æ–šåēƒč§’ã‚ĢãƒĄãƒŠãĢ切りæ›ŋã‚ã‚Šãžã™ã€‚åŗä¸ŠãĢはIQ.PilotãŽãƒ­ã‚´ã‚‚čĄ¨į¤ēされぞす。" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "į¸ĻåˆļåžĄãƒžãƒŒãƒŧバãƒŧãƒĸãƒŧド" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "į¸Ļ斚向チãƒĨãƒŧãƒ‹ãƒŗã‚°ãŽãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "先čĒ­ãŋã‚’é•ˇã" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "先čĒ­ãŋã‚’įŸ­ã" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "äŊŽé€Ÿæ™‚ãŽåŗåˇĻæŠ˜ãƒ—ãƒŠãƒŗãƒ‹ãƒŗã‚°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"MEB ãŠã‚ˆãŗ MQB Evo " +"čģŠä¸Ąã§ã€č¨ˆį”ģã—ãŸæ›˛įŽ‡ã‚’ã‚šãƒ†ã‚ĸãƒĒãƒŗã‚°ãƒŠãƒƒã‚¯ãĢ送る前ãĢロãƒŧãƒ‘ã‚šãƒ•ã‚ŖãƒĢã‚ŋでå‡Ļį†ã—ã€æ¨Ē斚向ぎãĩらつきを抑えぞす。これらぎčģŠã§ã¯æ—ĸ厚で有劚です。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "手動" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "最大" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "MQB ACC再開" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "MQB ACC再開" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "MQB操čˆĩロックã‚ĸã‚Ļト" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "MQB操čˆĩロックã‚ĸã‚Ļト" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "ãƒĄãƒŗãƒ†ãƒŠãƒŗã‚š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "手動ぎ遅åģļã‚Ēフã‚ģット" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "åœ°å›ŗãƒ‡ãƒŧã‚ŋベãƒŧ゚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "原æ¸Ŧ:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "マイãƒĢ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "čģŠãŽã‚Ļã‚¤ãƒŗã‚Ģãƒŧをčĩ°čĄŒį”ģéĸ上ãĢįŸĸ印としãĻ襨į¤ēしぞす。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "ãƒĸデãƒĢ停æ­ĸ時間" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "ãƒĸデãƒĢ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "芲åŊ“ãĒし" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "PANDAãĒし" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "ãĒし" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "ãƒŠãƒ“ã‚˛ãƒŧã‚ˇãƒ§ãƒŗ" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "ãƒŠãƒ“ã‚˛ãƒŧã‚ˇãƒ§ãƒŗã‚’ã‚­ãƒŖãƒŗã‚ģãƒĢしぞした" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "čŋ‘い" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "ネットワãƒŧク" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "ニãƒĨãƒŧナãƒĢネットFF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "ニãƒĨãƒŧナãƒĢネットワãƒŧクãƒģãƒ•ã‚Ŗãƒŧドフりワãƒŧド (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "゚ãƒĒãƒŧプしãĒい" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "いいえ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "ãƒãƒŗãƒ‰ãƒĢ操äŊœãĒし" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "QRã‚ŗãƒŧドを検å‡ēできぞせん" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "ãƒĻãƒŧã‚ļãƒŧ'{}'ぎSSHéĩがčĻ‹ã¤ã‹ã‚Šãžã›ã‚“" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "Wi-FiネットワãƒŧクがčĻ‹ã¤ã‹ã‚Šãžã›ã‚“" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "開į™ēãƒĸãƒŧドでã‚ĢãƒĄãƒŠãŒæ¤œå‡ēされぞせん。įļščĄŒã™ã‚‹ãĢはįĸēčĒã‚’ã‚ŋップしãĻください。" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "ãƒĒãƒĒãƒŧ゚ノãƒŧトはありぞせん。" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "įĩæžœãŒã‚りぞせん" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "č¨˜éŒ˛ã•ã‚ŒãŸãƒĢãƒŧトはありぞせん" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "čģŠä¸ĄãŒæœĒč¨­åŽšã§ã™" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "こぎã‚ĢãƒĄãƒŠãŽå‹•į”ģはありぞせん" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"通常はã‚Ļã‚¤ãƒŗã‚Ģãƒŧをå‡ēしたぞぞでも、1回ぎ操äŊœã§čģŠįˇšå¤‰æ›´ãŒįĩ‚äē†ã—ぞす。これをã‚ĒãƒŗãĢすると、ã‚Ļã‚¤ãƒŗã‚Ģãƒŧがå‡ēãĻいる間はįļšã‘ãĻ変更できぞす。ただし、æŦĄãŽå¤‰æ›´ãĢã‚‚ãƒãƒŗãƒ‰ãƒĢ操äŊœãŒåŋ…čĻã§ã™ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "こぎSubaruプナットフりãƒŧãƒ ã§ã¯åˆŠį”¨ã§ããžã›ã‚“ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "æœĒæŽĨįļš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "æœĒč¨­åŽš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"æŗ¨æ„: LFA/LKASボã‚ŋãƒŗãŽãĒいčģŠã§ã¯ã€ã“れをã‚ĒフãĢすると、クãƒĢãƒŧã‚ēãŽåˆŠį”¨å¯åĻが切りæ›ŋわる際ãĢ゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆãŒåž…æŠŸįŠļ態ãĢãĒらãĒくãĒりぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "ãƒãƒŗãƒ‰ãƒĢ操äŊœ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "ã‚Ēãƒ•ãƒŠã‚¤ãƒŗ" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "ã‚ĒãƒŗãƒŠã‚¤ãƒŗ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "ã‚Ēフ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "ã‚Ēãƒ•ãƒŠã‚¤ãƒŗį”ģéĸåœ°å›ŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "ã‚Ēフロãƒŧド" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "ã‚Ēフロãƒŧãƒ‰æ™‚ãŽã‚ˇãƒŖãƒƒãƒˆãƒ€ã‚Ļãƒŗã‚ŋイマãƒŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "ã‚Ēフロãƒŧド: čĩˇå‹•時や垊帰時ãĢåŋ…ず常時ã‚ĒフロãƒŧドãĢãĒりぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "ã‚Ēフã‚ģット:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "デバイ゚内" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "ã‚ĒãƒŗãƒŠã‚¤ãƒŗį”ģéĸåœ°å›ŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "čĩ°čĄŒä¸­ãŽé–‹į™ē者UI" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "゚マãƒŧãƒˆãƒ•ã‚Šãƒŗã§Konn3ktã‚ĸプãƒĒを開きぞす" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "ニックネãƒŧムīŧˆäģģæ„īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "čĩ°čĄŒä¸­ãĢ、åˆļåžĄãŽãƒŠã‚¤ãƒ–æŒ‡æ¨™īŧˆæ“čˆĩ、æ¨Ē加速åēĻ、前斚čģŠä¸Ąãƒ‡ãƒŧã‚ŋīŧ‰ãŽãƒãƒŧを重ねãĻ襨į¤ēしぞす。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "ペã‚ĸãƒĒãƒŗã‚°" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "å…ˆé€ą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "PQ HCA Status 7ãƒĸãƒŧド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "PQ HCA ゚テãƒŧã‚ŋ゚7ãƒĸãƒŧド" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "プãƒŦビãƒĨãƒŧ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "デバイ゚をペã‚ĸãƒĒãƒŗã‚°" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "äģŠã™ãã‚ĸップグãƒŦãƒŧド" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "デバイ゚をペã‚ĸãƒĒãƒŗã‚°" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Konn3ktã‚ĸプãƒĒでデバイ゚をペã‚ĸãƒĒãƒŗã‚°ã—ãĻください" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Konn3ktã‚ĸプãƒĒでデバイ゚をペã‚ĸãƒĒãƒŗã‚°ã—ãĻください。" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "デバイ゚をあãĒたぎ comma ã‚ĸã‚Ģã‚ĻãƒŗãƒˆãĢペã‚ĸãƒĒãƒŗã‚°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "ã‚ĸップデãƒŧトを一時停æ­ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "検į´ĸã‚’åŽŸčĄŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "IQ.PilotでドナイバãƒŧがブãƒŦãƒŧã‚­ã‚’č¸ã‚“ã ã¨ãã€ã‚šãƒ†ã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆãŒãŠã†ååŋœã™ã‚‹ã‹ã‚’選択しぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "ブãƒŦãƒŧキペダãƒĢã‚’č¸ã‚“ã ã¨ããĢ゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆãŒãŠã†ãĒるかを選択しぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "æē–備できたã‚ĸップデãƒŧトをæ‰ŋčĒåž…ãĄãĢするか、č‡Ē動でダã‚Ļãƒŗãƒ­ãƒŧドしãĻã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢするかを選択しぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "čģŠä¸Ąã‚’選択しãĻください" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "č‡Ē動検å‡ēを゚キップするãĢはčģŠä¸Ąã‚’å›ē厚しãĻください。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "前斚čģŠä¸Ąã‚’į¤ēすマãƒŧã‚ĢãƒŧãĢãƒŠã‚¤ãƒ–čĄ¨į¤ēīŧˆčģŠé–“、速åēĻ、到達時間īŧ‰ã‚’å›ē厚しぞす。ã‚ĸクã‚ģãƒĢとブãƒŦãƒŧキをIQ.PilotがåˆļåžĄã—ãĻいるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "初回ペã‚ĸãƒĒãƒŗã‚°ã‚’åŽŒäē†ã™ã‚‹ãĢはWi‑FiãĢæŽĨįļšã—ãĻください" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "初回ぎペã‚ĸãƒĒãƒŗã‚°ã‚’åŽŒäē†ã™ã‚‹ãĢはWi-FiãĢæŽĨįļšã—ãĻください。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "キãƒŧを取垗するãĢはWi-FiãĢæŽĨįļšã—ãĻください。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "ã‚ĸップデãƒŧトするãĢはWi-FiãĢæŽĨįļšã—ãĻください。" + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "ドナイバãƒŧã‚ĢãƒĄãƒŠã‚’é€šäŋĄä狿Ĩ­č€…ぎeSIM QRã‚ŗãƒŧドīŧˆLPA:...īŧ‰ãĢ向けãĻください" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "ポãƒĒã‚ˇãƒŧぎ重ãŋ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "é›ģæēã‚Ēフ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"ã‚¨ãƒŗã‚¸ãƒŗã‚’åˆ‡ãŖãŸãžãžã“ãŽæ™‚é–“ãŒįĩŒéŽã™ã‚‹ã¨ã€ãƒ‡ãƒã‚¤ã‚šãŽé›ģæēã‚’切りぞす。\n" +"īŧˆæ—ĸ厚は30時間īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "ä爿¸Ŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "ä爿¸ŦチãƒĨãƒŧãƒ‹ãƒŗã‚°: 加速ぎ変化を先čĒ­ãŋしãĻæģ‘らかãĢしぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "äē‹å‰ãƒ€ã‚Ļãƒŗãƒ­ãƒŧドīŧ‹äē‹å‰ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "äē‹å‰ãƒ€ã‚Ļãƒŗãƒ­ãƒŧドぎãŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "åœ°å›ŗã‚ŋイãƒĢをæē–備中..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "垓量čĒ˛é‡‘ãŽWi‑FiæŽĨį™‚は大きãĒデãƒŧã‚ŋぎã‚ĸップロãƒŧドを抑åˆļ" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "垓量čĒ˛é‡‘ãŽæēå¸¯å›žįˇšæŽĨį™‚は大きãĒデãƒŧã‚ŋぎã‚ĸップロãƒŧドを抑åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "ドナイバãƒŧ向きã‚ĢãƒĄãƒŠãŽãƒ—ãƒŦビãƒĨãƒŧでãƒĸニã‚ŋãƒĒãƒŗã‚°ãŽčĻ–į•Œã‚’įĸēčĒã—ãžã™ã€‚īŧˆčģŠä¸Ąã¯åœæ­ĸįŠļ態であるåŋ…čĻãŒã‚ã‚Šãžã™īŧ‰" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢぎ操äŊœ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "ãƒ‡ãƒã‚¤ã‚šãŒã‚¤ãƒŗã‚ŋãƒŧネットãĢæŽĨįļšã•れãĻいるときは、į”ģéĸåœ°å›ŗį”¨ãŽMapboxã‚ŋイãƒĢをãƒĒã‚ĸãƒĢã‚ŋイムで取垗しぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "ãƒĸデãƒĢã‚­ãƒŖãƒƒã‚ˇãƒĨを削除" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "ã‚ĸップデãƒŧãƒˆãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢæ–šæŗ•ã‚’å¤‰æ›´ã™ã‚‹å‰ãĢ、デバイ゚を常時ã‚ĒフロãƒŧドãĢするか、čģŠãŽé›ģæēã‚’åˆ‡ãŖãĻください。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "これらを変更する前ãĢ、デバイ゚を常時ã‚ĒフロãƒŧドãĢするか、čģŠãŽé›ģæēã‚’åˆ‡ãŖãĻください。" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "QRã‚ŗãƒŧドエナãƒŧ" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "QRã‚ŗãƒŧドを受けäģ˜ã‘ぞした" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "æē–å‚™åތäē†" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "再ダã‚Ļãƒŗãƒ­ãƒŧド" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "更新" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "削除" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "削除中..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "ãƒĒã‚ģット" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "įĸēčĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "ナック:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "éĄ”ãŒéš ã‚ŒãĻいたり、ドナイバãƒŧãƒĸニã‚ŋãƒĒãƒŗã‚°ãŒčŋŊčˇĄã—ãĢくい場合は取りäģ˜ã‘į›´ã—ãĻください。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "čģŠãŽé›ģæēãŒåˆ‡ã‚ŒãĻいるか、常時ã‚Ēフロãƒŧドが有劚ãĒときぎãŋåˆŠį”¨ã§ããžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "再čĩˇå‹•" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "デバイ゚を再čĩˇå‹•" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "再čĩˇå‹•しãĻ更新" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "時速31mphīŧˆ50km/hīŧ‰ã‚’čļ…えãĻčĩ°čĄŒä¸­ãĢã‚Ļã‚¤ãƒŗã‚Ģãƒŧをå‡ēさず検å‡ēされたčģŠįˇšã‚’外れた場合、čģŠįˇšå†…ãĢæˆģるようč­Ļ告を受け取りぞす。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "ドナイバãƒŧã‚ĢãƒĄãƒŠã‚’č¨˜éŒ˛ã—ãĻã‚ĸップロãƒŧド" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "ãƒžã‚¤ã‚¯éŸŗåŖ°ã‚’č¨˜éŒ˛ã—ãĻã‚ĸップロãƒŧド" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "čĩ°čĄŒä¸­ãĢãƒžã‚¤ã‚¯éŸŗåŖ°ã‚’č¨˜éŒ˛ãƒģäŋå­˜ã—ãžã™ã€‚éŸŗåŖ°ã¯ Konn3kt ぎドナイブãƒŦã‚ŗãƒŧダãƒŧ動į”ģãĢåĢぞれぞす。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "čĩ°čĄŒãƒ‡ãƒŧã‚ŋã¨æ˜ åƒã‚’č¨˜éŒ˛ã—ãĻã‚ĸップロãƒŧãƒ‰ã—ãžã™ã€‚į„ĄåŠšãĢするとすずãĻãŽč¨˜éŒ˛ãŒåœæ­ĸã—ãžã™ã€‚ãƒ­ã‚°ã‚‚æ˜ åƒã‚‚éŸŗåŖ°ã‚‚ã‚ã‚Šãžã›ã‚“ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "再ダã‚Ļãƒŗãƒ­ãƒŧド" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "įžåœ¨ãŽãƒĸデãƒĢを再ダã‚Ļãƒŗãƒ­ãƒŧド" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢを更新" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "čĻåˆļæƒ…å ą" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "ãƒĒナック゚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "ãƒĸデãƒĢ一čĻ§ã‚’å†čĒ­ãŋčžŧãŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "äŊœå‹•ã‚’įļ­æŒ: ブãƒŦãƒŧã‚­ã‚’č¸ã‚“ã§ã‚‚ã‚šãƒ†ã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆã¯ä¸­æ–­ã•ã‚Œãžã›ã‚“ã€‚" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "ãƒĒãƒĸãƒŧトã‚ĸクã‚ģ゚" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "削除" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Comma pSIMを削除" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "名前を変更" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢ名を変更" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "ãƒĒクエ゚トがã‚ŋイムã‚ĸã‚Ļトしぞした" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "IQ.Pilotぎį¸Ļ斚向åˆļåžĄīŧˆã‚ĸãƒĢãƒ•ã‚Ąīŧ‰ã‚’有劚ãĢするåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "ãƒĒã‚ģット" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "ã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’ãƒĒã‚ģット" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "åˆæœŸč¨­åŽšãĢæˆģす" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "トãƒŦãƒŧãƒ‹ãƒŗã‚°ã‚ŦイドをįĸēčĒ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "IQ.PilotぎãƒĢãƒŧãƒĢ、抟čƒŊ、åˆļ限をįĸēčĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "é“čˇ¯å" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "é“čˇ¯åãŽčĄ¨į¤ē" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "ãƒĢãƒŧト" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "ãƒĢãƒŧãƒ†ã‚Ŗãƒŗã‚°ã‚¨ãƒŗã‚¸ãƒŗãŽãƒãƒŧã‚¸ãƒ§ãƒŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "ã“ãŽãƒ‡ãƒã‚¤ã‚šã§ã‚ŗãƒŗãƒ‘ã‚¯ãƒˆãĒcomma 4īŧˆmiciīŧ‰ã‚¤ãƒŗã‚ŋãƒŧフェãƒŧã‚šã‚’åŽŸčĄŒã—ãžã™" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "選択" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC č‡Ē動įĸēčĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC 上げをįĸēčĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC 下げをįĸēčĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC フりãƒŧãƒĢバック IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC ã‚ĒãƒŗãƒŠã‚¤ãƒŗčŖœåŽŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC 上書き" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC ポãƒĒã‚ˇãƒŧ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "SSHéĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "SSHキãƒŧ" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "į´”æ­ŖACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "ã‚šã‚­ãƒŖãƒŗ" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "QRã‚’ã‚šã‚­ãƒŖãƒŗ" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "QRã‚ŗãƒŧãƒ‰ã‚’ã‚šã‚­ãƒŖãƒŗã™ã‚‹ã‹ã€ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ™ãƒŧã‚ˇãƒ§ãƒŗã‚ŗãƒŧドをå…Ĩ力しãĻください" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "Wi‑Fiネットワãƒŧクを検į´ĸ中..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "検į´ĸ" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "äŊæ‰€ãžãŸã¯å ´æ‰€ã‚’検į´ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "ãƒĄãƒŧã‚ĢãƒŧぞたはčģŠį¨Žã‚’検į´ĸ" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "検į´ĸ中..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "選択" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "ãƒ–ãƒŠãƒŗãƒã‚’é¸æŠž" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "言čĒžã‚’é¸æŠž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "゚テã‚ĸãƒĒãƒŗã‚°é…åģļぎč‡Ē動čĒŋ整" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "ã‚ˇãƒĒã‚ĸãƒĢ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "č‡ĒåŽ…ã‚’č¨­åŽš" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "äŊįŊŽæƒ…å ąã‹ã‚‰å˜äŊã‚’設åޚ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "čˇå ´ã‚’č¨­åŽš" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "č‡Ē厅ぎäŊæ‰€ã‚’設åޚ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "デバイ゚ぎäŊįŊŽæƒ…å ąã‹ã‚‰å˜äŊã‚’č¨­åŽšã—ãžã™ã€‚é€ŸåēĻã¯įąŗå›Ŋã€č‹ąå›Ŋ、ãƒĒベãƒĒã‚ĸを除くすずãĻぎ地域でkm/hãĢ切りæ›ŋわり、å›Ŋåĸƒã‚’čļŠãˆã‚‹ã¨å†åˆ¤åŽšã•ã‚Œãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "čˇå ´ãŽäŊæ‰€ã‚’設åޚ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"čģŠįˇščģĸ回ぎ希望がäŊŋう速åēĻãŽã—ãã„å€¤ã‚’č¨­åŽšã—ãžã™ã€‚ã“ãŽå€¤ã‚’ä¸‹å›žã‚‹ã¨ã€æœ€ã‚‚čŋ‘いčĩ°čĄŒå¯čƒŊãĒčģĸ回įĩŒčˇ¯ã‚’ãƒ—ãƒŠãƒŗãƒ‹ãƒŗã‚°ã§ããžã™ã€‚æ—ĸ厚は時速19マイãƒĢです。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "čĩˇå‹•垌や゚ãƒĒãƒŧプからぎ垊帰垌ãĢ、デバイ゚がおぎįŠļ態ãĢčŊãĄį€ãã‹ã‚’č¨­åŽšã—ãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "č¨­åŽš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "įžåœ¨ãŽé“čˇ¯åã‚’čĩ°čĄŒį”ģéĸ上ãĢ襨į¤ēしぞす。
    おäŊŋいぎ地域ぎã‚Ēãƒ•ãƒŠã‚¤ãƒŗåœ°å›ŗãƒ‡ãƒŧã‚ŋãŒã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢされãĻいるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "゚ムãƒŧã‚ē゚テã‚ĸãƒĒãƒŗã‚°" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "更新を垌で通įŸĨ" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "ã‚Ŋフトã‚Ļェã‚ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "速åēĻ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "速åēĻåˆļ限" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "速åēĻåˆļ限åˆļåžĄ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "゚ã‚ŋãƒŗãƒ€ãƒŧド" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"標æē–を推åĨ¨ã—ぞす。ã‚ĸグãƒŦãƒƒã‚ˇãƒ–ã§ã¯å‰čĩ°čģŠãĢčŋ‘ãĨãã€åŠ æ¸›é€Ÿã‚‚įŠæĨĩįš„ãĢãĒりぞす。ãƒĒナック゚では前čĩ°čģŠã¨ãŽčˇé›ĸをäŋãĄãžã™ã€‚寞åŋœčģŠį¨Žã§ã¯ã‚šãƒ†ã‚ĸãƒĒãƒŗã‚°ãŽčģŠé–“ボã‚ŋãƒŗã§ã“ã‚Œã‚‰ãŽæ€§æ ŧを切りæ›ŋえられぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "垅抟" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "垅抟: ブãƒŦãƒŧキで゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆãŒä¸€æ™‚åœæ­ĸし、ペダãƒĢからčļŗã‚’é›ĸすと垊帰しぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧドを開始" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆå‹•äŊœãŽå¯žåŋœįŠļæŗã‚’įĸēčĒã™ã‚‹ãĢは、čģŠä¸Ąã‚’始動しãĻください。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "åˇž" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "įĩąč¨ˆ" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "゚テãƒŧã‚ŋ゚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "äŊœå‹•ã‚’įļ­æŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "゚テã‚ĸãƒĒãƒŗã‚°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆãŽå‹•äŊœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "゚テã‚ĸãƒĒãƒŗã‚°æ“äŊœé‡ã‚ĸãƒŧク" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "į´”æ­ŖACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧドを停æ­ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"æ‰‹å‹•ãƒãƒŗãƒ‰ãƒ–ãƒŦãƒŧキを備えたSubaru " +"GlobalčģŠå‘けぎ゚トップīŧ†ã‚´ãƒŧį‰ˆã§ã™ã€‚é›ģ動パãƒŧã‚­ãƒŗã‚°ãƒ–ãƒŦãƒŧキぎčģŠã§ã¯ã‚ĒフぎぞぞãĢしãĻãã ã•ã„ã€‚ã“ãŽåŽŸčŖ…ã¯martinl氏ãĢよるもぎです。ありがとうございぞすīŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "äŋå­˜æ¸ˆãŋãŽåœ°å›ŗ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "クナã‚Ļドから配äŋĄä¸­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "デバイ゚を常時ã‚ĒフロãƒŧドãƒĸãƒŧドãĢ切りæ›ŋえぞすかīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "デバイ゚をåŧˇåˆļã‚ĒフロãƒŧドãƒĸãƒŧドãĢ切りæ›ŋえぞすかīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "ã‚ˇã‚šãƒ†ãƒ " + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "ã‚ˇã‚šãƒ†ãƒ ãŒåŋœį­”しぞせん" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "すぐãĢ手動äģ‹å…ĨしãĻください" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "渊åēĻ" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "渊åēĻがéĢ˜ã„" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "渊åēĻã¯æ­Ŗå¸¸" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "「Add Device」をã‚ŋãƒƒãƒ—ã—ã€åŗãŽQRã‚ŗãƒŧãƒ‰ã‚’ã‚šã‚­ãƒŖãƒŗã—ãžã™" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "å¯žčąĄãƒ–ãƒŠãƒŗãƒ" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "テã‚ļãƒĒãƒŗã‚°ãŽãƒ‘ã‚šãƒ¯ãƒŧド" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "選択したãƒĸデãƒĢãŒå¤‰æ›´ã•ã‚Œãžã—ãŸã€‚ã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗãŽãƒĒã‚ģットをおすすめしぞす。äģŠã™ãåŽŸčĄŒã—ãžã™ã‹īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "åŽŸčĄŒã™ã‚‹ã¨å…ƒãĢæˆģせぞせん — 中æ­ĸする最垌ぎ抟äŧšã§ã™ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "反映ãĢは再čĩˇå‹•がåŋ…čĻã§ã™ã€‚äģŠã™ãå†čĩˇå‹•しぞすかīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "こぎプナットフりãƒŧãƒ ã¯č§Ŗé™¤ãƒĸãƒŧドぎãŋãĢ限厚されãĻいぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "こぎプナットフりãƒŧムは、゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆå‹•äŊœãŽé¸æŠžč‚ĸが一部ãĢ限られぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "こぎプナットフりãƒŧムは、゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆå‹•äŊœãŽč¨­åޚãĢすずãĻ寞åŋœã—ãĻいぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"ダã‚Ļãƒŗãƒ­ãƒŧド済ãŋぎすずãĻãŽåœ°å›ŗãŒå‰Šé™¤ã•ã‚Œãžã™\n" +"\n" +"æœŦåŊ“ãĢすずãĻãŽåœ°å›ŗã‚’å‰Šé™¤ã—ãžã™ã‹īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "įžåœ¨äŊŋį”¨ä¸­ãŽãƒĸデãƒĢを除き、ダã‚Ļãƒŗãƒ­ãƒŧド済ãŋぎすずãĻぎãƒĸデãƒĢã‚’ã‚­ãƒŖãƒƒã‚ˇãƒĨから削除しぞす。よろしいですかīŧŸ" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "SIMからComma pSIMãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢが厌全ãĢæļˆåŽģされぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧドを開始しぞす。厌äē†ãžã§ã—ばらくかかる場合がありぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "時間" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "トグãƒĢ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "合荈:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "æ¨Ē斚向åˆļåžĄãŽå‹•äŊœä¸­ãĢ、IQ.Pilotがおれだけ操čˆĩしãĻいるかをį¤ēす円åŧ§ã‚’é“čˇ¯æ˜ åƒä¸ŠãĢ描į”ģしぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "トãƒŦãƒŧãƒ‹ãƒŗã‚°ã‚Ŧイド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "ã‚Ļã‚¤ãƒŗã‚Ģãƒŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "į„ĄįˇšįĩŒį”ąãŽã‚ĸップデãƒŧトįĸēčĒã‚’åŽŒå…¨ãĢ停æ­ĸしぞす。
    反映するãĢは再čĩˇå‹•しãĻください。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "åš´åŧãĢįļšã‘ãĻčģŠį¨Žã‚’å…Ĩ力しãĻください — 例: 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "å…Ĩ力しãĻ検į´ĸ" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "åˆŠį”¨ä¸å¯" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "ã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "更新" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "USB゚トãƒŦãƒŧジ" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "äŊŋᔍ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "動į”ģをčĒ­ãŋčžŧめぞせん" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "čģŠãŒã‚Ēãƒŗãƒ­ãƒŧãƒ‰ãŽé–“ã¯åˆŠį”¨ã§ããžã›ã‚“ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "åˆŠį”¨ä¸å¯ — こぎčģŠã§ã¯IQ.Pilotぎį¸Ļ斚向åˆļåžĄãŒå‹•äŊœã—ãĻいぞせん。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "æœĒ検å‡ēかつæœĒč¨­åŽš" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "ã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "不明" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "不明ãĒ通äŋĄä狿Ĩ­č€…" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "į„Ąåˆļ限ぎãƒĢãƒŧトäŋå­˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "ã‚ĸップデãƒŧãƒˆãŽã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢãƒĸãƒŧド" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "ã‚ĸップデãƒŧトはčģŠä¸ĄãŽé›ģæēãŒåˆ‡ã‚ŒãĻいる間ぎãŋダã‚Ļãƒŗãƒ­ãƒŧドされぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "čĩ°čĄŒä¸­ãĢã‚ĸップロãƒŧド" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "ドナイバãƒŧ向きã‚ĢãƒĄãƒŠãŽãƒ‡ãƒŧã‚ŋをã‚ĸップロãƒŧドしãĻãƒĸニã‚ŋãƒĒãƒŗã‚°ã‚ĸãƒĢゴãƒĒã‚ēムぎ攚善ãĢ協力しãĻください。" + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "ã‚ĸップロãƒŧド済ãŋ" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "ã‚ĸップロãƒŧド中" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"PQプナットフりãƒŧムčģŠãŽæ“čˆĩåˆļåžĄãĢ、Status 5ではãĒくHCA Status " +"7をäŊŋį”¨ã—ãžã™ã€‚ä¸€éƒ¨ãŽå¤ã„ãƒ•ã‚ŠãƒĢク゚ワãƒŧã‚˛ãƒŗčģŠã§äē’æ›æ€§ãŒæ”šå–„する場合がありぞす。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "ãƒĄãƒŧトãƒĢæŗ•ã‚’äŊŋᔍ" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ™ãƒŧã‚ˇãƒ§ãƒŗã‚ŗãƒŧドをäŊŋᔍ:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "ACCとčģŠįˇšįļ­æŒæ”¯æ´ãĢIQ.PilotをäŊŋį”¨ã—ãžã™ã€‚æœŦ抟čƒŊぎäŊŋį”¨ä¸­ã¯å¸¸ãĢæŗ¨æ„ãŒåŋ…čĻã§ã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "čģŠä¸Ą" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "襨į¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTBīŧˆãƒãƒŧãƒãƒŖãƒĢトãƒĢクブãƒŦãƒŗãƒ‰īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "čģŠä¸Ą" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "čģŠä¸ĄãŽį¸Ļ斚向åˆļåžĄå¯žåŋœã¯ãžã æ¤œå‡ēされãĻいぞせん。一åēĻã‚¨ãƒŗã‚¸ãƒŗã‚’å§‹å‹•ã—ãĻ寞åŋœįŠļæŗã‚’æ¤œå‡ēしãĻください。" + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "動į”ģプãƒŦãƒŧヤãƒŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "IQ.PilotãŽã‚¯ãƒŠãƒƒã‚ˇãƒĨãĢé–ĸするエナãƒŧãƒ­ã‚°ã‚’čĄ¨į¤ēしぞす。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "ãƒ“ã‚¸ãƒ§ãƒŗãŽé‡ãŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "襨į¤ē" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "GPSæ¸ŦäŊã‚’垅抟中..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "ドナイバãƒŧã‚ĢãƒĄãƒŠã‚’åž…æŠŸä¸­ã§ã™ã€‚é€šäŋĄä狿Ĩ­č€…ぎeSIM QRã‚ŗãƒŧドをäŊŋうか、LPAã‚ŗãƒŧドを手動でå…Ĩ力しãĻください。" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "開始垅抟中" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "č­Ļ告" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"č­Ļ告: " +"これはGitHubč¨­åŽšå†…ãŽã™ãšãĻぎå…Ŧ開éĩãĢSSHã‚ĸクã‚ģã‚šã‚’č¨ąå¯ã—ãžã™ã€‚č‡Ē分äģĨ外ぎGitHubãƒĻãƒŧã‚ļãƒŧ名はįĩļ寞ãĢå…Ĩ力しãĒいでください。IQ.Pilotぎ垓æĨ­å“ĄãŒč‡Ē分ぎGitHubãƒĻãƒŧã‚ļãƒŧ名ぎčŋŊåŠ ã‚’æą‚ã‚ã‚‹ã“ã¨ã¯æąēしãĻありぞせん。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "č­Ļ告: {} æœĒæē€ãŽã‚Ģãƒŧブで゚テã‚ĸãƒĒãƒŗã‚°ãŒæŒ¯å‹•ã™ã‚‹ã“ã¨ãŒã‚ã‚Šãžã™ã€‚æ„Ÿã˜ã‚‰ã‚Œã‚‹å ´åˆã¯ã‚ĒフãĢしãĻください。" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "IQ.Pilotへようこそ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "有劚ãĢすると、ã‚ĸクã‚ģãƒĢã‚’č¸ã‚€ã¨IQ.PilotãŒč§Ŗé™¤ã•ã‚Œãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Wi‑Fiネットワãƒŧクīŧˆåž“量čǞ金īŧ‰" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "聎場" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "パ゚ワãƒŧドが違いぞす" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "はい" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "はい、すずãĻãŽåœ°å›ŗã‚’å‰Šé™¤ã—ãžã™" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "IQ.PilotをäŊŋį”¨ã™ã‚‹ãĢã¯åˆŠį”¨čĻį´„ãĢ同意するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"IQ.PilotをäŊŋį”¨ã™ã‚‹ãĢã¯åˆŠį”¨čĻį´„ãĢ同意するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚įļščĄŒã™ã‚‹å‰ãĢ https://iqlvbs.com/tos " +"で最新ぎčĻį´„ã‚’ãŠčĒ­ãŋください。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"こぎ垌はごč‡ĒčēĢぎeSIMãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢをäŊŋį”¨ã™ã‚‹åŋ…čĻãŒã‚ã‚Šãžã™ã€‚commaから新しいSIMをčŗŧå…ĨしãĒい限り、Comma " +"Primeã‚’å†ãŗåˆŠį”¨ã™ã‚‹ã“ã¨ã¯ã§ããžã›ã‚“ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "有劚化" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "äŊŋᔍ䏭" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "äŊŋį”¨ä¸­ãŽãƒĸデãƒĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "eSIMãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢをčŋŊ加" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "įŠæĨĩįš„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "APNč¨­åŽš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "č‡Ē動" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "č‡Ē動īŧˆæš—īŧ‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"č‡Ē動\n" +"ã‚ĸップデãƒŧト" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "æˆģる" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "ãƒ–ãƒŠãƒŗãƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "減光ぞでぎ遅åģļ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "čĩ°čĄŒčˇé›ĸã‚’č¨ˆįŽ—ä¸­..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "ã‚ĢãƒĄãƒŠã‚’čĩˇå‹•中" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "ãƒĸバイãƒĢ垓量åˆļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"言čĒžã‚’\n" +"変更" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "ã‚ĸップデãƒŧトをįĸēčĒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "įĸēčĒä¸­..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "įĩ„ãŋ合わせ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "įĩąåˆãƒĸデãƒĢ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "č¨­åŽšæ¸ˆãŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "æŽĨįļš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "æŽĨį¸ˆãŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "æŽĨįļšä¸­..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "įļšã‘ã‚‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "åˆļåžĄ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "停æ­ĸからぎクãƒĒãƒŧプīŧˆãƒ™ãƒŧã‚ŋīŧ‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "クãƒĢãƒŧã‚ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "æ›˛įŽ‡ã‚ŗãƒŗãƒˆãƒ­ãƒŧナãƒŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "ドナイブãƒŦã‚ŗãƒŧダãƒŧ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "拒åĻ" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "æ—ĸ厚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "削除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "開į™ē者" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "デバイ゚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "デバイ゚ID" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"åŧˇåˆļã‚Ēフロãƒŧド\n" +"觪除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "åŧˇåˆļã‚Ēフロãƒŧãƒ‰ã‚’č§Ŗé™¤" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "į„ĄåŠš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "切断中..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "觪除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "ã‚ĸクã‚ģãƒĢã§č§Ŗé™¤" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "į”ģéĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "į”ģéĸぎ明るさ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "下" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "ã‚ĸップデãƒŧトをダã‚Ļãƒŗãƒ­ãƒŧド" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧド中" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧド中..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"ドナイバãƒŧã‚ĢãƒĄãƒŠ\n" +"プãƒŦビãƒĨãƒŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "čĩ°čĄŒä¸­ãŽæ˜Žã‚‹ã•" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "ダイナミック" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "ドナイブãƒŦã‚ŗãƒŧダãƒŧを有劚化" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "ロãƒŧãƒŸãƒŗã‚°ã‚’æœ‰åŠšåŒ–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "有劚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "į´”æ­ŖãŽį¸ĻåˆļåžĄã‚’åŧˇåˆļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "APNをå…Ĩ力" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "GitHubãƒĻãƒŧã‚ļãƒŧ名をå…Ĩ力..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "LPAã‚ĸã‚¯ãƒ†ã‚Ŗãƒ™ãƒŧã‚ˇãƒ§ãƒŗã‚ŗãƒŧドをå…Ĩ力..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "ã‚ŗãƒŧドをå…Ĩ力" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "パ゚ワãƒŧドをå…Ĩ力..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "ã‚ĸップデãƒŧトぎįĸēčĒãĢå¤ąæ•—ã—ãžã—ãŸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "ã‚ĸップデãƒŧãƒˆå¤ąæ•—" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "速い" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "ã‚ĸップデãƒŧトを厌äē†ä¸­..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "「{}」向け" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "プナイベãƒŧãƒˆãƒ–ãƒŠãƒŗãƒãŽæ›´æ–°į”¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"åŧˇåˆļ\n" +"ã‚Ēフロãƒŧド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "mici UIをåŧˇåˆļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "åŧˇåˆļã‚Ēフロãƒŧド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "削除中..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "åŊĸåŧ: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "ã‚­ãƒŖãƒƒã‚ˇãƒĨから" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "時間" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "ヒãƒĨãƒŗãƒ€ã‚¤į¸Ļ斚向チãƒĨãƒŧãƒ‹ãƒŗã‚°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "æƒ…å ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "ã‚ĸップデãƒŧãƒˆã‚’ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "操äŊœã‚ŋイムã‚ĸã‚Ļト" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "iq.dynamic č¨­åŽš" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "čģŠįˇšå¤‰æ›´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "čģŠįˇšé€¸č„ąč­Ļå ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "æ›˛ãŒã‚‹é€ŸåēĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "æ¨Ē斚向マニãƒĨãƒŧバãƒŧãƒĸãƒŧド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "クãƒĢãƒŧã‚ēį•°å¸¸æ™‚ãŽæ¨Ē斚向åˆļåžĄ" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "č‡Ēå‹•č¨­åŽšãŽå ´åˆã¯įŠēæŦ„ぎぞぞãĢしãĻください" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "゚キップする場合はįŠēæŦ„ぎぞぞ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "æļˆåŽģするãĢはãƒĻãƒŧã‚ļãƒŧ名とトãƒŧã‚¯ãƒŗã‚’įŠēæŦ„ãĢしãĻください" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "åˇĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "į¸Ļ斚向マニãƒĨãƒŧバãƒŧãƒĸãƒŧド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "äŊŽé€Ÿæ™‚ãŽåŗåˇĻæŠ˜ãƒ—ãƒŠãƒŗãƒ‹ãƒŗã‚°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "分" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢã‚’įŽĄį†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "手動" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "手動ぎ遅åģļã‚Ēフã‚ģット" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "åœ°å›ŗãŽãŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "åœ°å›ŗå„Ē先" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "垓量" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "ãƒĸデãƒĢ" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "ネットワãƒŧク" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "ネットワãƒŧクäŊŋᔍ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "ãĒし" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "いいえ" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "ã‚ĸナãƒŧトãĒし" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "ãƒãƒŗãƒ‰ãƒĢ操äŊœãĒし" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "標æē–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "圏外" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "äģŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "ãƒãƒŗãƒ‰ãƒĢ操äŊœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "ã‚Ēフ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "ã‚Ēãƒ•ãƒŠã‚¤ãƒŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "ã‚Ēãƒŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "ã‚ĒãƒŗãƒŠã‚¤ãƒŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "ニックネãƒŧムīŧˆäģģæ„īŧ‰..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "ã‚ĸプãƒĒでペã‚ĸãƒĒãƒŗã‚°" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "Konn3ktとペã‚ĸãƒĒãƒŗã‚°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "ポãƒĒã‚ˇãƒŧ重ãŋ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "é›ģæēã‚Ēフ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "ä爿¸Ŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢ操äŊœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "通äŋĄä狿Ĩ­č€…不明" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "ãƒĸデãƒĢã‚­ãƒŖãƒƒã‚ˇãƒĨを削除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "垅抟中" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "æē–å‚™åތäē†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "再čĩˇå‹•" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "ドナイバãƒŧã‚ĢãƒĄãƒŠã‚’č¨˜éŒ˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "ãƒžã‚¤ã‚¯ã‚’č¨˜éŒ˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "ãƒĸデãƒĢを再ダã‚Ļãƒŗãƒ­ãƒŧド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢを更新" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "čĒč¨ŧæƒ…å ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "ã‚†ãŖãŸã‚Š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "ãƒĸデãƒĢ一čĻ§ã‚’å†čĒ­ãŋčžŧãŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "comma pSIMを削除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "名前を変更" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢ名を変更..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "ãƒĒã‚ģット" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "ã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’ãƒĒã‚ģット" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"トãƒŦãƒŧãƒ‹ãƒŗã‚°\n" +"ã‚ŦイドをčĻ‹ã‚‹" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "åŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "į§’" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "QRã‚’ã‚šã‚­ãƒŖãƒŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "QRã‚šã‚­ãƒŖãƒŗ / ã‚ŗãƒŧドå…Ĩ力" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "ネットワãƒŧクを検į´ĸ中" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "゚テã‚ĸãƒĒãƒŗã‚°é…åģļぎč‡Ē動čĒŋ整" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "ã‚ˇãƒĒã‚ĸãƒĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "č¨­åŽšé€ŸåēĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "äŊįŊŽã‹ã‚‰å˜äŊã‚’設åޚ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"゚ワイプしãĻ\n" +"ã‚­ãƒŖãƒƒã‚ˇãƒĨ削除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"゚ワイプしãĻ\n" +"切断" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"゚ワイプしãĻ\n" +"削除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"゚ワイプしãĻ\n" +"再ダã‚Ļãƒŗãƒ­ãƒŧド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"゚ワイプしãĻ\n" +"ã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’ãƒĒã‚ģット" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"゚ワイプしãĻ\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"゚ワイプしãĻ\n" +"comma pSIMを削除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "遅い" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "゚ムãƒŧã‚ē゚テã‚ĸãƒĒãƒŗã‚°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "ã‚Ŋフトã‚Ļェã‚ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "速åēĻåˆļé™ãŽč¨­åŽš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "標æē–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "垅抟" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"IQ.PilotをäŊŋうãĢは\n" +"čģŠã‚’始動しãĻください" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "čĩˇå‹•中..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "゚テãƒŧã‚ŋ゚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "äŊœå‹•ã‚’įļ­æŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "゚テã‚ĸãƒĒãƒŗã‚°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "゚テã‚ĸãƒĒãƒŗã‚°ã‚ĸã‚ˇã‚šãƒˆãŽå‹•äŊœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "į´”æ­Ŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "æ‰‹å‹•ãƒãƒŗãƒ‰ãƒ–ãƒŦãƒŧキぎ゚トップīŧ†ã‚´ãƒŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "ダã‚Ļãƒŗãƒ­ãƒŧドを停æ­ĸ" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "ã‚ˇã‚šãƒ†ãƒ čĩˇå‹•中" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "å¯žčąĄãƒ–ãƒŠãƒŗãƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"åˆŠį”¨\n" +"čĻį´„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "テã‚ļãƒĒãƒŗã‚°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "テã‚ļãƒĒãƒŗã‚°ãŽãƒ‘ã‚šãƒ¯ãƒŧド" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "トグãƒĢ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "čĩ°čĄŒåąĨæ­´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "ã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "IQ.Pilotをã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "非垓量" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "非寞åŋœ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "上" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "最新です" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "最新です。最įĩ‚įĸēčĒ: ãĒし" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "最新です。最įĩ‚įĸēčĒ: {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"ã‚ĸップデãƒŧトぎ\n" +"ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢæ–šæŗ•" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "更新がありぞす" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"ã‚ĸップデãƒŧã‚ŋãƒŧが\n" +"åŋœį­”しぞせん" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "ãƒĄãƒŧトãƒĢæŗ•ã‚’äŊŋᔍ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "čģŠä¸Ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "バãƒŧã‚¸ãƒ§ãƒŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "バãƒŧãƒãƒŖãƒĢトãƒĢクブãƒŦãƒŗãƒ‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "ãƒ“ã‚¸ãƒ§ãƒŗé‡ãŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "襨į¤ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "č­Ļ告" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "パ゚ワãƒŧドが違いぞす" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "はい" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{}äģļぎã‚ĸナãƒŧト" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{}æ—Ĩ前" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{}時間前" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{}分前" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "čĩ°čĄŒãƒ‡ãƒŧã‚ŋを1åš´é–“äŋå­˜" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "24時間365æ—ĨぎLTEæŽĨįļš" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "č­Ļ告: " +#~ "こぎčģŠãĢおけるopenpilotぎį¸ĻåˆļåžĄã¯ã‚ĸãƒĢãƒ•ã‚Ąį‰ˆã§ã‚ã‚Šã€č‡Ēå‹•įˇŠæ€ĨブãƒŦãƒŧキīŧˆAEBīŧ‰ã‚’į„ĄåŠšãĢしぞす。

    こぎčģŠã§ã¯ã€openpilotはį¸ĻåˆļåžĄã¨ã—ãĻopenpilotではãĒくčģŠä¸ĄãŽå†…č”ĩACCをæ—ĸ厚でäŊŋį”¨ã—ãžã™ã€‚openpilotぎį¸ĻåˆļåžĄãĢ切りæ›ŋえるãĢã¯ã“ãŽč¨­åŽšã‚’æœ‰åŠšãĢしãĻください。openpilotį¸ĻåˆļåžĄã‚ĸãƒĢãƒ•ã‚Ąã‚’æœ‰åŠšãĢする場合は原験ãƒĸãƒŧドぎ有劚化を推åĨ¨ã—ãžã™ã€‚ã“ãŽč¨­åŽšã‚’å¤‰æ›´ã™ã‚‹ã¨ã€čģŠãŒčĩˇå‹•中ぎ場合はopenpilotが再čĩˇå‹•しぞす。" + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADBīŧˆAndroid Debug Bridgeīŧ‰ã‚’äŊŋį”¨ã™ã‚‹ã¨ã€USBぞたはネットワãƒŧクįĩŒį”ąã§ãƒ‡ãƒã‚¤ã‚šãĢæŽĨįļšã§ããžã™ã€‚čŠŗã—ãã¯ " +#~ "https://docs.comma.ai/how-to/connect-to-comma ã‚’å‚į…§ã—ãĻください。" + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "常時ドナイバãƒŧãƒĸニã‚ŋãƒĒãƒŗã‚°" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "openpilotぎį¸ĻåˆļåžĄã‚ĸãƒĢãƒ•ã‚Ąį‰ˆã¯ã€åŽŸé¨“ãƒĸãƒŧドとäŊĩせãĻ非ãƒĒãƒĒãƒŧã‚šãƒ–ãƒŠãƒŗãƒã§ãƒ†ã‚šãƒˆã§ããžã™ã€‚" + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "konn3kt.comをホãƒŧムį”ģéĸãĢčŋŊ加しãĻã‚ĸプãƒĒぎようãĢäŊŋいぞしょう" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "チãƒĢãƒĸãƒŧドON" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "čģŠãŒčĩˇå‹•ä¸­ãŽå ´åˆã€ã“ãŽč¨­åŽšã‚’å¤‰æ›´ã™ã‚‹ã¨openpilotが再čĩˇå‹•しぞす。" + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "\"add new device\"をæŠŧしãĻåŗå´ãŽQRã‚ŗãƒŧãƒ‰ã‚’ã‚šã‚­ãƒŖãƒŗ" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "拒åĻしãĻopenpilotをã‚ĸãƒŗã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "原験ãƒĸãƒŧドON" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "openpilotがæœĒäŊœå‹•でもドナイバãƒŧãƒĸニã‚ŋãƒĒãƒŗã‚°ã‚’æœ‰åŠšãĢしぞす。" + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "openpilotを有劚化" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "openpilotį¸ĻåˆļåžĄīŧˆã‚ĸãƒĢãƒ•ã‚Ąīŧ‰ãŽãƒˆã‚°ãƒĢを有劚ãĢすると原験ãƒĸãƒŧドがäŊŋį”¨ã§ããžã™ã€‚" + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "原験ãƒĸãƒŧド" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "こぎčģŠã§ã¯į¸ĻåˆļåžĄãĢį´”æ­ŖACCをäŊŋį”¨ã™ã‚‹ãŸã‚ã€įžåœ¨åŽŸé¨“ãƒĸãƒŧãƒ‰ã¯åˆŠį”¨ã§ããžã›ã‚“ã€‚" + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "prime ãŽį‰šå…¸:" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Firehoseãƒĸãƒŧド" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "æœ€å¤§é™ãŽåŠšæžœã‚’åž—ã‚‹ãŸã‚ã€ãƒ‡ãƒã‚¤ã‚šã‚’åą‹å†…ãĢæŒãĄčžŧãŋã€é€ąãĢ一åēĻは品čŗĒãŽč‰¯ã„USB-Cã‚ĸダプã‚ŋãƒŧとWi‑FiãĢæŽĨįļšã—ãĻください。\n" +#~ "\n" +#~ "Firehoseãƒĸãƒŧãƒ‰ã¯ã€ãƒ›ãƒƒãƒˆã‚šãƒãƒƒãƒˆã‚„į„Ąåˆļ限SIMãĢæŽĨįļšã—ãĻいればčĩ°čĄŒä¸­ã§ã‚‚å‹•äŊœã—ぞす。\n" +#~ "\n" +#~ "\n" +#~ "よくあるčŗĒ問\n" +#~ "\n" +#~ "運čģĸぎä앿–šã‚„場所はé–ĸäŋ‚ありぞすかīŧŸ いいえ。晎æŽĩおおりãĢ運čģĸしãĻください。\n" +#~ "\n" +#~ "FirehoseãƒĸãƒŧドではすずãĻぎã‚ģã‚°ãƒĄãƒŗãƒˆãŒå–åž—ã•ã‚Œãžã™ã‹īŧŸ いいえ。ã‚ģã‚°ãƒĄãƒŗãƒˆãŽä¸€éƒ¨ã‚’é¸æŠžįš„ãĢ取垗しぞす。\n" +#~ "\n" +#~ "č‰¯ã„USB‑Cã‚ĸダプã‚ŋãƒŧとはīŧŸ éĢ˜é€ŸãĒ゚マホぞたはノãƒŧトPCᔍ充é›ģå™¨ã§å•éĄŒã‚ã‚Šãžã›ã‚“ã€‚\n" +#~ "\n" +#~ "おぎã‚Ŋフトã‚Ļェã‚ĸをäŊŋうかは重čĻã§ã™ã‹īŧŸ はい。å­Ļįŋ’ãĢäŊŋえるぎは上æĩãŽopenpilotīŧˆãŠã‚ˆãŗį‰šåŽšãŽãƒ•ã‚Šãƒŧクīŧ‰ãŽãŋです。" + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "゚マãƒŧãƒˆãƒ•ã‚Šãƒŗã§ https://konn3kt.com ãĢã‚ĸクã‚ģ゚" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "非ã‚ĸã‚¯ãƒ†ã‚Ŗãƒ–īŧšéžåž“量ぎネットワãƒŧクãĢæŽĨįļšã—ãĻください" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "ã‚¸ãƒ§ã‚¤ã‚šãƒ†ã‚Ŗãƒƒã‚¯ãƒ‡ãƒãƒƒã‚°ãƒĸãƒŧド" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "å­Ļįŋ’デãƒŧã‚ŋぎã‚ĸップロãƒŧドを最大化しãĻopenpilotぎ運čģĸãƒĸデãƒĢを攚善しぞしょう。" + +#~ msgid "NO" +#~ msgstr "いいえ" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "SSHéĩがčĻ‹ã¤ã‹ã‚Šãžã›ã‚“" + +#, python-format +#~ msgid "Open" +#~ msgstr "開く" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "デバイ゚を Konn3ktīŧˆkonn3kt.comīŧ‰ã¨ãƒšã‚ĸãƒĒãƒŗã‚°ã—ãĻ、Konn3kt į‰šå…¸ã‚’å—ã‘å–ã‚Šãžã—ã‚‡ã†ã€‚" + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "konn3kt.comで Konn3kt ãĢ加å…Ĩ" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "ãƒĒãƒĸãƒŧãƒˆã‚šãƒŠãƒƒãƒ—ã‚ˇãƒ§ãƒƒãƒˆ" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "openpilotぎãƒĢãƒŧãƒĢ、抟čƒŊ、åˆļ限をįĸēčĒ" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "標æē–を推åĨ¨ã—ぞす。ã‚ĸグãƒŦãƒƒã‚ˇãƒ–ã§ã¯å‰čĩ°čģŠãĢčŋ‘ãĨãã€åŠ æ¸›é€Ÿã‚‚įŠæĨĩįš„ãĢãĒりぞす。ãƒĒナック゚では前čĩ°čģŠã¨ãŽčˇé›ĸをäŋãĄãžã™ã€‚寞åŋœčģŠį¨Žã§ã¯ã‚šãƒ†ã‚ĸãƒĒãƒŗã‚°ãŽčģŠé–“ボã‚ŋãƒŗã§ã“ã‚Œã‚‰ãŽæ€§æ ŧを切りæ›ŋえられぞす。" + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "ACCとčģŠįˇšįļ­æŒæ”¯æ´ãĢopenpilotをäŊŋį”¨ã—ãžã™ã€‚æœŦ抟čƒŊぎäŊŋį”¨ä¸­ã¯å¸¸ãĢæŗ¨æ„ãŒåŋ…čĻã§ã™ã€‚" + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "č­Ļ告: これはGitHubč¨­åŽšå†…ãŽã™ãšãĻぎå…Ŧ開éĩãĢSSHã‚ĸクã‚ģ゚を与えぞす。č‡Ē分äģĨ外ぎGitHubãƒĻãƒŧã‚ļãƒŧ名をįĩļ寞ãĢå…Ĩ力しãĒいでください。comma " +#~ "ぎ垓æĨ­å“ĄãŒč‡Ē分ぎGitHubãƒĻãƒŧã‚ļãƒŧ名をčŋŊåŠ ã™ã‚‹ã‚ˆã†æą‚ã‚ã‚‹ã“ã¨ã¯æąēしãĻありぞせん。" + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "openpilotへようこそ" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "有劚ãĢすると、ã‚ĸクã‚ģãƒĢã‚’č¸ã‚€ã¨openpilotãŒč§Ŗé™¤ã•ã‚Œãžã™ã€‚" + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "openpilotをäŊŋį”¨ã™ã‚‹ãĢã¯ã€åˆŠį”¨čĻį´„ãĢ同意するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "openpilotをäŊŋį”¨ã™ã‚‹ãĢã¯åˆŠį”¨čĻį´„ãĢ同意するåŋ…čĻãŒã‚ã‚Šãžã™ã€‚įļščĄŒã™ã‚‹å‰ãĢ https://comma.ai/terms " +#~ "ぎ最新ぎčĻį´„ã‚’ãŠčĒ­ãŋください。" + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "openpilot į¸ĻåˆļåžĄīŧˆã‚ĸãƒĢãƒ•ã‚Ąīŧ‰" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilotã¯åˆŠį”¨ã§ããžã›ã‚“" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilotはæ—ĸ厚でチãƒĢãƒĸãƒŧドでčĩ°čĄŒã—ぞす。原験ãƒĸãƒŧドでは、チãƒĢãƒĸãƒŧドãĢはぞだæē–備ができãĻいãĒいã‚ĸãƒĢãƒ•ã‚ĄãƒŦベãƒĢぎ抟čƒŊが有劚ãĢãĒã‚Šãžã™ã€‚åŽŸé¨“įš„ãĒ抟čƒŊはäģĨ下ぎとおりです:

    ã‚¨ãƒŗãƒ‰ãƒ„ãƒŧã‚¨ãƒŗãƒ‰į¸ĻåˆļåžĄ


    運čģĸãƒĸデãƒĢがã‚ĸクã‚ģãƒĢとブãƒŦãƒŧキをåˆļåžĄã—ãžã™ã€‚openpilotはäēē間ぎようãĢčĩ°čĄŒã—、čĩ¤äŋĄåˇã‚„一時停æ­ĸでも停æ­ĸしぞす。čĩ°čĄŒé€ŸåēĻは運čģĸãƒĸデãƒĢがæąēã‚ã‚‹ãŸã‚ã€č¨­åŽšé€ŸåēĻは上限としãĻぎãŋ抟čƒŊしぞす。これはã‚ĸãƒĢãƒ•ã‚Ąå“čŗĒぎ抟čƒŊであり、čǤ動äŊœãŒį™ēį”Ÿã™ã‚‹å¯čƒŊ性がありぞす。

    新しい運čģĸビジãƒĨã‚ĸナイã‚ŧãƒŧã‚ˇãƒ§ãƒŗ


    äŊŽé€Ÿæ™‚ãĢã¯é“čˇ¯å‘ããŽåēƒč§’ã‚ĢãƒĄãƒŠãĢ切りæ›ŋã‚ã‚Šã€ä¸€éƒ¨ãŽæ›˛ãŒã‚Šã‚’ã‚ˆã‚Šč‰¯ãčĄ¨į¤ēしぞす。į”ģéĸåŗä¸ŠãĢは原験ãƒĸãƒŧãƒ‰ãŽãƒ­ã‚´ã‚‚čĄ¨į¤ēされぞす。" + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "openpilotはįļ™įļšįš„ãĢã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’čĄŒãŖãĻおり、ãƒĒã‚ģットがåŋ…čρãĢãĒã‚‹ã“ã¨ã¯į¨€ã§ã™ã€‚čģŠãŒčĩˇå‹•中ãĢã‚­ãƒŖãƒĒブãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚’ãƒĒã‚ģットするとopenpilotが再čĩˇå‹•しぞす。" + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilotは、あãĒたぎようãĒäēē間ぎ運čģĸをčĻ‹ãĻ運čģĸをå­Ļįŋ’しぞす。\n" +#~ "\n" +#~ "FirehoseãƒĸãƒŧドをäŊŋうと、å­Ļįŋ’デãƒŧã‚ŋぎã‚ĸップロãƒŧドを最大化しãĻopenpilotぎ運čģĸãƒĸデãƒĢを攚善できぞす。デãƒŧã‚ŋがåĸ—えるãģおãƒĸデãƒĢが大きくãĒり、原験ãƒĸãƒŧãƒ‰ãŒã‚ˆã‚Šč‰¯ããĒりぞす。" + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "openpilotぎį¸ĻåˆļåžĄã¯å°†æĨぎã‚ĸップデãƒŧトで提䞛される可čƒŊ性がありぞす。" + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "openpilotでは、デバイ゚ぎ取りäģ˜ã‘č§’åēĻがåˇĻåŗÂą4°、上斚向5°äģĨ内、下斚向9°äģĨ内であるåŋ…čĻãŒã‚ã‚Šãžã™ã€‚" + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "これぞでãĢあãĒたぎčĩ°čĄŒãŽ{}ã‚ģã‚°ãƒĄãƒŗãƒˆãŒå­Ļįŋ’デãƒŧã‚ŋã‚ģットãĢåĢぞれãĻいぞす。" + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ į™ģéŒ˛æ¸ˆãŋ" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Firehoseãƒĸãƒŧド đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_ko.mo b/iqpilot/selfdrive/ui/translations/app_ko.mo new file mode 100644 index 000000000..ab28cc1a1 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_ko.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_ko.po b/iqpilot/selfdrive/ui/translations/app_ko.po new file mode 100644 index 000000000..336d4bcc2 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_ko.po @@ -0,0 +1,4514 @@ +# Korean translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-22 16:32-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr "(ę¸°ëŗ¸ę°’)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " ėŠ¤í‹°ė–´ë§ 토íŦ ė‘ë‹ĩ ëŗ´ė •ė´ ė™„ëŖŒë˜ė—ˆėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " ėŠ¤í‹°ė–´ë§ 토íŦ ė‘ë‹ĩ ëŗ´ė •ė´ {}% ė™„ëŖŒë˜ė—ˆėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " ėžĨėš˜ëŠ” {:.1f}° {} 및 {:.1f}° {} ë°Ší–Ĩė„ 가ëĻŦí‚¤ęŗ  ėžˆėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    ėŠ¤í‹°ė–´ë§ 맀뗰 ëŗ´ė •ė´ ė™„ëŖŒë˜ė—ˆėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    ėŠ¤í‹°ė–´ë§ 맀뗰 ëŗ´ė •ė´ {}% ė™„ëŖŒë˜ė—ˆėŠĩ니다." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "í™œė„ą" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "ADB(Android Debug Bridge)ëĨŧ ė‚ŦėšŠí•˜ëŠ´ USB 또는 ë„¤íŠ¸ė›ŒíŦëĨŧ í†ĩ해 揰揰뗐 ė—°ę˛°í•  눘 ėžˆėŠĩ니다." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "ėļ”ę°€" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "렄랴 기간" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "APN 네렕" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "ė¸ėĻ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "ėžë™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "ę°€ė†ë„ 막대" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "ę°€ė† 미터" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "ęŗŧ도한 ėž‘ë™ė„ í™•ė¸" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "í™œė„ąí™”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "ė‚ŦėšŠ ė¤‘ė¸ ëĒ¨ë¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "{} ė´ėƒė—ė„œë§Œ ėž‘ë™í•Šë‹ˆë‹¤." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "프로필 ėļ”ę°€" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "eSIM 프로필 ėļ”ę°€" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "ė°¨ëĄœ íšŒė „ ė˜ë„ ė†ë„ ėĄ°ė •" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "溠揉" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"ė´í›„ė—ëŠ” ëŗ¸ė¸ė˜ eSIM í”„ëĄœí•„ė„ ė‚ŦėšŠí•´ė•ŧ 합니다.\n" +"\n" +"commaė—ė„œ 냈 SIMė„ ęĩŦėž…í•˜ė§€ ė•ŠëŠ” 한 Comma Primeė„ ë‹¤ė‹œ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "ęŗĩę˛Šė " + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "ë™ė˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "렄랴" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "ëĒ¨ë“  ėŖŧ(ė•Ŋ 6.0 GB)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"ėžë™ ėžŦėļœë°œė´ ė—†ëŠ” ė—°ėžĨ 홀드 FtSëĨŧ ė§€ė›í•˜ëŠ” í­ėŠ¤ë°”ę˛ MQB ė°¨ëŸ‰ė—ė„œ IQ.Pilotė´ MQB ACC ėžŦ氜 ë™ėž‘ė„ ė‚ŦėšŠí•˜ë„ëĄ " +"í—ˆėšŠí•Šë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"íŦëŖ¨ėψ ėģ¨íŠ¸ëĄ¤ 똤ëĨ˜ëĄœ ėĸ…ë°Ší–Ĩ ė œė–´(ę°€ė†/ė œë™)ëĨŧ ėŧė‹œė ėœŧ로 ė‚ŦėšŠí•  눘 ė—†ė„ ë•Œė—ë„ 횡방í–Ĩ ė œė–´(ėĄ°í–Ĩ)가 ęŗ„ė† ėž‘ë™í•˜ë„ëĄ í—ˆėšŠí•Šë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "ėƒė‹œ ėĄ°í–Ĩ ëŗ´ėĄ° (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "꡸ ë°–ė—ë„ ë‹¤ė–‘í•œ 기ëŠĨ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "ėĻ‰ė‹œ ė ėšŠëŠë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "기기가 ë‹¤ėŒė— ė˜¤í”„ëĄœë“œëĄœ ė „í™˜ë  때 ė ėšŠëŠë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "ė •ë§ ė „ė›ė„ ë„ė‹œę˛ ėŠĩ니까?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "ė •ë§ ėžŦė‹œėž‘í•˜ė‹œę˛ ėŠĩ니까?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "IQ.Pilotė˜ ëĒ¨ë“  ė„¤ė •ė„ ę¸°ëŗ¸ę°’ėœŧ로 되돌ëĻ´ęšŒėš”? ė„¤ė •ė„ ė´ˆę¸°í™”í•˜ëŠ´ 되돌ëĻ´ 눘 ė—†ėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "ė •ë§ ëŗ´ė •ė„ ėžŦė„¤ė •í•˜ė‹œę˛ ėŠĩ니까?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "ė •ë§ ė œęą°í•˜ė‹œę˛ ėŠĩ니까?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "ėžë™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "ėžë™ ė°¨ëĄœ ëŗ€ę˛Ŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "ėžë™ ė°¨ëĄœ ëŗ€ę˛Ŋ: ė—°ė† ëŗ€ę˛Ŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "ėžë™ — ė–´ë‘Ąę˛Œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "네렕 ėžë™ ë‹Ģ기" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "베타 ęĩŦí˜„ė´ ė ėšŠë˜ëŠ” Subaru 플ëžĢíŧė—ė„œ, ė•žė°¨ëĨŧ 따ëŧ가다 ė •ė§€í•œ 뒤 ėžë™ėœŧ로 ë‹¤ė‹œ ėļœë°œí•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "íŦëŖ¨ėψ ė „í™˜ ė‹œ ė‚ŦėšŠ 가ëŠĨ ė—Ŧëļ€" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "뒤로" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "ė‚Ŧę°ė§€ëŒ€ ę˛Ŋęŗ " + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "ė‚Ŧę°ė§€ëŒ€ ę˛Ŋęŗ " + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "ë°Ší–Ĩė§€ė‹œë“ą í‘œė‹œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "ë°Ší–Ĩė§€ė‹œë“ąėœŧ로 ė‹œėž‘í•˜ëŠ” ė°¨ëĄœ ëŗ€ę˛Ŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "ëļ€íŒ… ėƒíƒœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "ė œë™ ë°˜ė‘ ëĒ¨ë“œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "í´ëž˜ė‹ UIė˜ ë„“ė€ ė˜¤í”„ëĄœë“œ ėƒíƒœ í‘œė‹œė¤„ė„ ë˜ė‚´ëĻŊ니다. ė˜¨ë„, ė°¨ëŸ‰, Konn3kt ėƒíƒœëĨŧ í•œëˆˆė— ëŗŧ 눘 ėžˆėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "ëŗ€ę˛Ŋ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "í™•ė¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "ė§€ėš°ę¸°" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "뗰枰" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "뗰枰 뤑..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "ėˇ¨ė†Œ" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "ë‚´ëš„ę˛Œė´ė…˜ ėˇ¨ė†Œ" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "ėĸ…ëŸ‰ė œ ė…€ëŖ°ëŸŦ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "떏떴 ëŗ€ę˛Ŋ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "ė°¨ëŸ‰ ė „ė›ė´ ėŧœė ¸ ėžˆėœŧ늴 ė´ ė„¤ė •ė„ ëŗ€ę˛Ŋ할 때 IQ.Pilotė´ ėžŦė‹œėž‘ëŠë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "í™•ė¸í•¨ {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "ëĒ¨ë¸ ė„ íƒ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"ėĸ…ë°Ší–Ĩ ë™ėž‘ė„ ė„ íƒí•˜ė„¸ėš”: IQ.Pilot(IQ ėĸ…ë°Ší–Ĩ + ė—”ë“œíˆŦė—”ë“œ), IQ.Dynamic(IQ ėĸ…ë°Ší–Ĩ + ë‹¤ė´ë‚´ë¯š ëĒ¨ë“œ), " +"IQ.Chill(IQ ėĸ…ë°Ší–Ĩ + ė—Ŧėœ ëĄœėš´ 프로필) 또는 ėˆœė • ACC." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "ėˆ˜ë™ėœŧ로 ė„ íƒë¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "ėēė‹œ ëš„ėš°ę¸°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "ė„ íƒí•œ ëĒ¨ë¸ė˜ ėēė‹œëĨŧ ëš„ėš°ęŗ  ë‹¤ė‹œ ë‹¤ėš´ëĄœë“œí• ęšŒėš”?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "ë‹Ģ기" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"MEB 및 MQB Evo ė°¨ëŸ‰ė—ė„œ ėĄ°í–Ĩ ė œė–´ëĨŧ íëŖ¨í”„ëĄœ ë™ėž‘ė‹œí‚ĩ니다. IQ.Pilotė´ ęŗ„íší•œ ęŗĄëĨ ė„ 그대로 ëŗ´ë‚´ė§€ ė•Šęŗ  ė°¨ëŸ‰ė´ " +"ė‹¤ė œëĄœ ėœ ė§€í•˜ëŠ” ęŗĄëĨ ė— 맞ėļ° ėĄ°í–Ĩ ëĒ…ë šė„ ëŗ´ė •í•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "클ëŧėš°ë“œ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "클ëŧėš°ë“œ ė „ėšŠ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "클ëŧėš°ë“œ ė˜ėƒė„ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "ė§€ëŦ¸ ėƒíƒœ ėƒ‰ėƒ ė•ˆë‚´:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "í†ĩ합 ëĒ¨ë¸" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"ėĸ…ë°Ší–Ĩ ė•Ąėļ”ė—ė´í„°ė˜ ė‘ë‹ĩė„ ė¸Ąė •í•˜ę¸° ėœ„í•´ 미ëĻŦ ė •í•´ė§„ ę°€ė† ë‹¨ęŗ„ëĨŧ ė‹¤í–‰í•Šë‹ˆë‹¤. IQ.Pilot ėĸ…ë°Ší–Ĩ ė œė–´ę°€ í•„ėš”í•Šë‹ˆë‹¤. í†ĩė œëœ 뚈 " +"ë„ëĄœė—ė„œë§Œ ė‚ŦėšŠí•˜ė„¸ėš”." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"ėĄ°í–Ĩ ė•Ąėļ”ė—ė´í„°ė˜ ė‘ë‹ĩė„ ė¸Ąė •í•˜ę¸° ėœ„í•´ 미ëĻŦ ė •í•´ė§„ íšĄę°€ė† ë‹¨ęŗ„ëĨŧ ė‹¤í–‰í•Šë‹ˆë‹¤. ė§ė„ ė˜ í‰íƒ„í•˜ęŗ  ëš„ė–´ ėžˆëŠ” ë„ëĄœė—ė„œë§Œ ė‚ŦėšŠí•˜ė„¸ėš”." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "í™•ė¸" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "ęŗ„ė†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "ė—°ė† ëŗ€ę˛Ŋ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "ė œė–´" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"ė œí•œ ė†ë„ė— 대한 IQ.Pilotė˜ ë™ėž‘ė„ ė œė–´í•Šë‹ˆë‹¤. 끄기는 ė œí•œ ė†ë„ 기ëŠĨė„ ëš„í™œė„ąí™”í•˜ęŗ , ė •ëŗ´ëŠ” ė œí•œë§Œ í‘œė‹œí•˜ëŠ°, ę˛Ŋęŗ ëŠ” ęŗŧė†ė„ " +"ę°•ėĄ°í•˜ęŗ , ė œė–´ëŠ” ę°ė§€ëœ ė œí•œė— 맞ėļ° ė„¤ė • ė†ë„ëĨŧ ėĄ°ė •í•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "SSH 키ëĨŧ 氀렏ė˜Ŧ 눘 ė—†ėŠĩ니다 - 로그ëĨŧ í™•ė¸í•˜ė„¸ėš”" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "해당 ėžĨė†ŒëĨŧ ė°žė„ 눘 ė—†ėŠĩ니다" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "GitHub뗐 ė—°ę˛°í•  눘 ė—†ėŠĩ니다 - ė—°ę˛°ė„ í™•ė¸í•˜ė„¸ėš”" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "GitHubė„ í™•ė¸í•  눘 ė—†ėŠĩ니다 - 기기 ė‹œę°„ė„ í™•ė¸í•˜ė„¸ėš”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "ęĩ­ę°€" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "ėļŠëŒ 로그" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "ė •ė§€ ėƒíƒœė—ė„œ ė„œė„œížˆ ėļœë°œ(베타)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "ė •ė§€ ėƒíƒœė—ė„œ ė„œė„œížˆ ėļœë°œ — ėˆ˜ë™ í•¸ë“œë¸Œë ˆė´íŦ(베타)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "íŦëŖ¨ėψ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "현ėžŦ ë˛„ė „" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "ęŗĄëĨ  ėģ¨íŠ¸ëĄ¤ëŸŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "ė‚­ė œ" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "뗰枰 í•´ė œ 뤑..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "ë‹¤ėš´ëĄœë“œ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "ęą°ëļ€" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "ęą°ëļ€í•˜ęŗ  IQ.Pilot ė œęą°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "ę¸°ëŗ¸ę°’" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "ę¸°ëŗ¸ę°’(CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "ę¸°ëŗ¸ę°’: ėŖŧ행 ė¤€ëš„ę°€ 된 ėƒíƒœëĄœ ėŧœė§€ëа 바로 ėž‘ë™í•  눘 ėžˆėŠĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"ë°Ší–Ĩė§€ė‹œë“ąėœŧ로 ė‹œėž‘ëœ ė°¨ëĄœ ëŗ€ę˛Ŋė´ ėŠ¤ėŠ¤ëĄœ ė‹œėž‘ë˜ę¸°ęšŒė§€ė˜ 맀뗰 ė‹œę°„ėž…ë‹ˆë‹¤. ė§€ė—°ė„ ė„¤ė •í•˜ëŠ´ í•¸ë“¤ė„ 뛀링ėŧ í•„ėš”ę°€ ė—†ėŠĩ니다(ę¸°ëŗ¸ę°’ė€ 핸들 " +"ėĄ°ėž‘).
    ęĩí†ĩ ėƒí™Šęŗŧ 도로가 ė‹¤ė œëĄœ ꡸ ėĄ°ėž‘ė„ í—ˆėšŠí•  때만 ë°Ší–Ĩė§€ė‹œë“ąė„ ė‚ŦėšŠí•˜ė„¸ėš”." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "ė‚Ŧę°ė§€ëŒ€ 맀뗰" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "ė‚­ė œ" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "ëš„í™œė„ąí™”ëœ 프로필 \"{}\"ė„(ëĨŧ) ė‚­ė œí• ęšŒėš”?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "ė´ 로그ëĨŧ ė‚­ė œí• ęšŒėš”?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "ëĒŠė ė§€ę°€ ė„¤ė •ë¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "ėžë™ėœŧ로 ę°ė§€ë¨" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "ę°œë°œėž" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "ėžĨėš˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "íŽ˜ė–´ë§í•˜ë ¤ëŠ´ 기기가 Konn3kt뗐 ë“ąëĄë˜ė–´ ėžˆė–´ė•ŧ 합니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "ė–´ë‘ė›Œė§€ę¸°ęšŒė§€ 맀뗰" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "뗰枰 í•´ė œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "í•´ė œ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "ė˜¤í”„ëĄœë“œëĨŧ ę°•ė œí•˜ę¸° 렄뗐 í•´ė œí•˜ė„¸ėš”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "ė˜¨ëĄœë“œëĨŧ ę°•ė œí•˜ę¸° 렄뗐 í•´ė œí•˜ė„¸ėš”" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "ę°€ė† 페ë‹Ŧ로 í•´ė œ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "í•´ė œ 후 렄뛐 끄기" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "í•´ė œ 후 ėžŦė‹œėž‘" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "í•´ė œ 후 ėē˜ëĻŦë¸Œë ˆė´ė…˜ ėžŦ네렕" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "{} 하려면 í•´ė œí•˜ė„¸ėš”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "í•´ė œ: ė œë™í•˜ëŠ´ ėĄ°í–Ĩ ëŗ´ėĄ°ę°€ ė™„ė „ížˆ ęēŧė§‘ë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "화면" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "화면 밝기" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "ė†ë„ëĨŧ mph ëŒ€ė‹  km/h로 í‘œė‹œí•Šë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "ęą°ëĻŦ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "ėš´ė „ėž ėš´ëŠ”ëŧ ë°ė´í„°ëĨŧ ė—…ëĄœë“œí• ęšŒėš”?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "ė™„ëŖŒ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "동글 ID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "ë‹¤ėš´ëĄœë“œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "ë‹¤ėš´ëĄœë“œ ė‹¤íŒ¨ — ë‹¤ė‹œ ė‹œë„í•˜ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "ė§€ë„ 타ėŧ ë‹¤ėš´ëĄœë“œ 뤑" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"ė™ŧėĒŊ 가ėžĨėžëĻŦëĨŧ 따ëŧ ė¸Ąė •ëœ ę°€ė†ęŗŧ ė œë™ė„ 나타내는 막대ëĨŧ ꡸ëĻŊ니다. í”Œëž˜ë„ˆė˜ ėš”ė˛­ė´ ė•„ë‹ˆëŧ ė°¨ëŸ‰ė´ ė§€ę¸ˆ ė‹¤ė œëĄœ í•˜ęŗ  ėžˆëŠ” ë™ėž‘ėž…ë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"揰揰뗐 ė €ėžĨ된 타ėŧ로 화면 ė§€ë„ëĨŧ ꡸ëĻŊ니다. 똍ëŧė¸ęŗŧ 함ęģ˜ ė‚ŦėšŠí•˜ëŠ´ ė—°ę˛°ė´ 끊기는 ėˆœę°„ ė €ėžĨ된 타ėŧė´ ė´ė–´ë°›ėŠĩ니다. 타ėŧė€ ė„ íƒí•œ 맀뗭뗐" +" 대해 내려받ėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "ėš´ė „ėž ėš´ëŠ”ëŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "ėš´ė „ėž ėš´ëŠ”ëŧ í™•ė¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "ėš´ė „ėž ę°œėž… 래ëĻŦ" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "ėŖŧ행" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "ėŖŧ행 뤑 밝기" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "ėŖŧ행 ė„ąí–Ĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "ë‹¤ė´ë‚´ë¯š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "ë‹¤ė´ë‚´ë¯š 튜닝: ę°€ė†ęŗŧ ė œë™ ë°˜ė‘ė´ 더 ë¯ŧė˛Ší•Šë‹ˆë‹¤." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "íŽ¸ė§‘" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "똤ëĨ˜" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "ė‚ŦėšŠ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "ADB ė‚ŦėšŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Always on Lateral(AOL)ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ė´ ėŠ¤ėœ„ėš˜ëĨŧ 끄면 IQ.Pilot ę¸°ëŗ¸ ėĄ°í–Ĩ ėž‘ë™ ë°Šė‹ėœŧ로 ëŒė•„ę°‘ë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "ë¸”ëž™ë°•ėŠ¤ ė‚ŦėšŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "밍넠 ė´íƒˆ ę˛Ŋęŗ  ė‚ŦėšŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "ė €ė†ė—ė„œ LKAS 똤ëĨ˜ę°€ ë°œėƒí•˜ëŠ” í­ėŠ¤ë°”ę˛ MQB ė°¨ëŸ‰ė—ė„œ MQB ėĄ°í–Ĩ ėž ę¸ˆ 래ëĻŦëĨŧ í™œė„ąí™”í•Šë‹ˆë‹¤." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "로밍 ė‚ŦėšŠ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "SSH ė‚ŦėšŠ" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "테더링 ė‚ŦėšŠ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "IQ.Pilotė´ ėž‘ë™ ė¤‘ė´ ė•„ë‹ 때도 ėš´ė „ėž ëĒ¨ë‹ˆí„°ë§ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "APN ėž…ë Ĩ" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "í™œė„ąí™” ėŊ”드 ėž…ë Ĩ" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "ėŊ”드 ėž…ë Ĩ" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "SSID ėž…ë Ĩ" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "ėŖŧė†Œ 또는 ėžĨė†ŒëĨŧ ėž…ë Ĩí•˜ė„¸ėš”" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "냈 테더링 비밀번호 ėž…ë Ĩ" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "비밀번호 ėž…ë Ĩ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "GitHub ė‚ŦėšŠėž ė´ëĻ„ ėž…ë Ĩ" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "똤ëĨ˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "ė˜¤í”„ëĄœë“œ ëĒ¨ë“œ ėĸ…ëŖŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "확ėžĨ ėƒíƒœ í‘œė‹œė¤„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "ė‹¤í—˜ė  ė•žė°¨ MPC" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"ėģ´í“¨í„°ė— ė—°ę˛°í•˜ëŠ´ ėĩœęˇŧ ë¸”ëž™ë°•ėŠ¤ 똁냁ęŗŧ ëĄœęˇ¸ė˜ ėŠ¤ëƒ…ėƒˇė„ USB 드ëŧė´ë¸ŒëĄœ 렜ęŗĩ합니다. ė´ 기ëŠĨė´ ėŧœė ¸ ėžˆė–´ë„ IQ.Pilotė€ ęŗ„ė† " +"ë™ėž‘í•Šë‹ˆë‹¤." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "ė‚­ė œ 뤑..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "현ėžŦ í† ėš”íƒ€ ėˆœė • ėĸ…ë°Ší–Ĩ ė œė–´ę°€ ė ėšŠë˜ęŗ  ėžˆėŠĩ니다. ė´ëĨŧ í•´ė œí•˜ë ¤ëŠ´ IQ ėĸ…ë°Ší–Ĩ ëĒ¨ë“œëĨŧ ė„ íƒí•˜ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "ęŗĩėžĨ ėļœęŗ  ėƒíƒœė˜ ėĸ…ë°Ší–Ĩ íŠœë‹ėž…ë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "ėĻę˛¨ė°žę¸°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "ė§€ë„ ę°€ė ¸ė˜¤ëŠ” 뤑" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "ė§€ë„ ę°€ė ¸ė˜¤ëŠ” 뤑..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "ë§ˆė§€ë§‰ ę˛Ŋęŗ " + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "ė°¨ëŸ‰ ė°žę¸°" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "네렕 ė™„ëŖŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "ė°¨ëŸ‰ė´ ė‚Ŧę°ė§€ëŒ€ė— ëŦ´ė–¸ę°€ ėžˆë‹¤ęŗ  ė•ŒëĻ´ 때마다 ė¸ĄëŠ´ ę˛Ŋęŗ ëĨŧ í‘œė‹œí•Šë‹ˆë‹¤(BSM ėžĨė°Š ė°¨ëŸ‰ ė „ėšŠ)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "ė´ ė„¤ė •ė„ ëŗ€ę˛Ŋ하려면 기기 íŒ¨ë„ė—ė„œ í•­ėƒ ė˜¤í”„ëĄœë“œëĨŧ ėŧœęą°ë‚˜ ė°¨ëŸ‰ ė „ė›ė„ ë„ė„¸ėš”." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "ėļ”ėĸ… ęą°ëĻŦ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "ė•ąė˜ ė•ˆë‚´ė— 따ëŧ íŽ˜ė–´ë§ė„ ė™„ëŖŒí•˜ė„¸ėš”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "IQ.Pilotė„ 10ëļ„ ë™ė•ˆ ė˜¨ëĄœë“œëĄœ ę°•ė œí• ęšŒėš”? í•­ėƒ ė˜¤í”„ëĄœë“œę°€ ėžë™ėœŧ로 ėŧœė§€ęŗ , íƒ€ė´ë¨¸ę°€ 끝나면 ė˜¤í”„ëĄœë“œëĄœ ëŒė•„ę°‘ë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Mici UI ę°•ė œ ė‚ŦėšŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "ė˜¨ëĄœë“œ ę°•ė œ(10ëļ„)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "ė˜¨ëĄœë“œ ę°•ė œëŠ” ė˜¤í”„ëĄœë“œ ėƒíƒœė—ė„œë§Œ ė‹œėž‘í•  눘 ėžˆėŠĩ니다" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "ė˜¨ëĄœë“œ ę°•ė œę°€ ė´ë¯¸ ėŧœė ¸ ėžˆėŠĩ니다. íƒ€ė´ë¨¸ëĨŧ 10ëļ„ėœŧ로 ėžŦė„¤ė •í• ęšŒėš”?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "ę°•ė œ ė˜¨ëĄœë“œ ėž‘ë™ 뤑" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "ė‚­ė œ" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "Wi‑Fi ë„¤íŠ¸ė›ŒíŦ \"{}\"ëĨŧ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "ė–‘í˜¸" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Git ė¸ėĻ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Git 토큰 / 비밀번호" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Git ė‚ŦėšŠėž ė´ëĻ„" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "키ëĨŧ ę°€ė ¸ė˜¤ëŠ” 뤑 GitHub 똤ëĨ˜({})" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "ë†’ėŒ" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "ėˆ¨ę˛¨ė§„ ë„¤íŠ¸ė›ŒíŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "ė‚Ŧę°ė§€ëŒ€ 氐맀 ė‹œ ė°¨ëĄœ ëŗ€ę˛Ŋ ëŗ´ëĨ˜" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "ė›€ė§ė´ė§€ ë§ˆė„¸ėš”..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "ė‚Ŧę°ė§€ëŒ€ ëĒ¨ë‹ˆí„°ë§ė´ ëĒŠí‘œ ė°¨ëĄœė— ė°¨ëŸ‰ė´ ėžˆë‹¤ęŗ  ė•ŒëĻŦ는 ë™ė•ˆ ėžë™ ė°¨ëĄœ ëŗ€ę˛Ŋė„ ëŗ´ëĨ˜í•˜ęŗ , ė°¨ëĄœę°€ 비면 ė‹¤í–‰í•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "ė§‘" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "ė‹œę°„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "네렕 í™”ëŠ´ė´ ėĄ°ėž‘ ė—†ė´ ėœ ė§€ë˜ë‹¤ę°€ ėŠ¤ėŠ¤ëĄœ ë‹Ģížˆę¸°ęšŒė§€ė˜ ė‹œę°„ėž…ë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "ėžë™ ėĄ°ė •ė´ ęēŧė ¸ ėžˆė„ 때 ė°¨ëŸ‰ ėžė˛´ ėĄ°í–Ĩ ę¸°ė–´ė˜ 맀뗰뗐 ė–ŧ마나 ė•žė„  ė‹œę°„ė„ ë”í• ė§€ ė§€ė •í•Šë‹ˆë‹¤. ę¸°ëŗ¸ę°’ė€ 0.2ė´ˆėž…ë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "ė„¤ėš˜" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "IP ėŖŧė†Œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "IQ ę°•ė œ ė •ė§€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "IQ ëĒ¨ë“œ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "ė´ ė°¨ëŸ‰ė—ė„œëŠ” IQ ėĸ…ë°Ší–Ĩ ëĒ¨ë“œëĨŧ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다. ėˆœė • ACC만 ė„ íƒí•  눘 ėžˆėŠĩ니다." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic ęŗĄė„ ëĄœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic ė•žė°¨ ė†ë„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic ė €ė†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic ëĒ¨ë¸ ė •ė§€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic SLC ëŒ€ė˛´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic 느ëϰ ė•žė°¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic ė •ė§€í•œ ė•žė°¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "IQ.OS ë˛„ė „" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot ė‚ŦėšŠ ëļˆę°€" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"IQ.Pilotė€ ė§€ė†ė ėœŧ로 ëŗ´ė •ė„ ė§„í–‰í•˜ë¯€ëĄœ ėžŦė„¤ė •ė´ í•„ėš”í•œ ę˛Ŋėš°ëŠ” 드뭅니다. ė°¨ëŸ‰ ė „ė›ė´ ėŧœė ¸ ėžˆė„ 때 ëŗ´ė •ė„ ėžŦė„¤ė •í•˜ëŠ´ " +"IQ.Pilotė´ ėžŦė‹œėž‘ëŠë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "IQ.Pilotė€ ėžĨėš˜ëĨŧ ėĸŒėš° 4°, ėœ„ėĒŊ 5°, ė•„ëž˜ėĒŊ 9° ė´ë‚´ëĄœ ėžĨė°Ší•´ė•ŧ 합니다." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"ė‹œė† 20마ėŧ(32 km/h) ė´í•˜ëĄœ ėŖŧí–‰í•˜ëŠ´ė„œ ë°Ší–Ĩė§€ė‹œë“ąė„ ėŧœëŠ´, ė°¨ëŸ‰ė´ 가ėžĨ ę°€ęšŒėš´ ėŖŧ행 가ëŠĨ ę˛ŊëĄœė—ė„œ ꡸ ë°Ší–ĨėœŧëĄœė˜ íšŒė „ė„ " +"ęŗ„íší•Šë‹ˆë‹¤. ė´ëŠ” 빨간ëļˆ ë“ąė—ė„œ ė°¨ëŸ‰ė´ ėž˜ëĒģ된 ë°Ší–Ĩė˜ íšŒė „ė„ ęŗ„íší•˜ëŠ” ėƒí™Šė„ ë§‰ė•„ ė¤ë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "ė •ëŗ´" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "eSIMė„ ė‚ŦėšŠí•˜ë ¤ëŠ´ 揰揰뗐 함ęģ˜ ė œęŗĩ된 ė •í’ˆ comma SIM ėš´ë“œëĨŧ ë„Ŗėœŧė„¸ėš”" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "ė—…ë°ė´íŠ¸ ė„¤ėš˜" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "ėž˜ëĒģ된 QR ėŊ”드" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "km" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "KONN3KT 똤ëĨ˜" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT ė˜¤í”„ëŧė¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "기기ëĨŧ ė˜¤í”„ëĄœë“œëĄœ ėœ ė§€" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "ėˆœė • ę°€ė†Âˇė œë™ ėœ ė§€" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "ę°€ė†ęŗŧ ė œë™ė€ ėˆœė • í† ėš”íƒ€ ė‹œėŠ¤í…œė— ë§Ąę¸°ęŗ , IQ.Pilotė€ ėĄ°í–Ĩ만 담당합니다." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "comma 프ëŧėž„" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Konn3kt 기ëŠĨ:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Konn3kt ėƒíƒœ:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "ė œí•œ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "로딩 뤑" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "ëļˆëŸŦė˜¤ëŠ” 뤑..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "ė°¨ëĄœ ëŗ€ę˛Ŋ ė˜ĩė…˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "íŦëŖ¨ėψ 똤ëĨ˜ ė‹œ 횡방í–Ĩ ė œė–´" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "횡방í–Ĩ 기동 ëĒ¨ë“œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "ė•žė°¨ ė •ëŗ´ í‘œė‹œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "í•­ėƒ ė˜¤í”„ëĄœë“œ ëĒ¨ë“œëĨŧ ė§€ę¸ˆ ėĸ…ëŖŒí• ęšŒėš”?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "ę°•ė œ ė˜¤í”„ëĄœë“œ ëĒ¨ë“œëĨŧ ė§€ę¸ˆ ėĸ…ëŖŒí• ęšŒėš”?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"ėĄ°í–Ĩė´ ë°˜ė‘í•˜ëŠ” 데 깸ëĻŦ는 ė‹œę°„ė„ IQ.Pilotė´ ė¸Ąė •í•˜ęŗ  ꡸ ę°’ė„ ėĩœė‹ ėœŧ로 ėœ ė§€í•˜ë„ëĄ 합니다. 링렑 ę°’ė„ ęŗ ė •í•˜ë ¤ëŠ´ ë„ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "ėž‘ë™ 뤑뗐 ėĄ°í–Ĩė„ ė™„ė „ížˆ í•´ė œí•˜ė§€ ė•Šęŗ ë„ í•¸ë“¤ė„ 뛀링ėŧ 눘 ėžˆę˛Œ 합니다." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "ëŧė´ë¸Œ ėŠ¤íŠ¸ëĻŦ밍" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "%s ëļˆëŸŦė˜¤ëŠ” 뤑" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "똁냁 ëļˆëŸŦė˜¤ëŠ” 뤑" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "ëļˆëŸŦė˜¤ëŠ” 뤑..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "ėœ„ėš˜ í™•ė¸ 뤑..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "ė´ 플ëžĢíŧė—ė„œëŠ” ęēŧ말ėœŧ로 ęŗ ė •ë˜ė–´ ėžˆėŠĩ니다. ė°¨ëŸ‰ė´ 다ëĨ¸ ė„ íƒė§€ëĨŧ ė§€ė›í•˜ė§€ ė•ŠėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "ėĸ…ë°Ší–Ĩ ė œė–´" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"ėĸ…ë°Ší–Ĩ ė œė–´ ëĒ¨ë“œ:
    IQ.Pilot 기ëŠĨė€ ė•„ëž˜ė™€ 같ėŠĩ니다:

    IQ.Pilot ė—”ë“œíˆŦė—”ë“œ ėĸ…ë°Ší–Ĩ ė œė–´


    ėŖŧ행" +" ëĒ¨ë¸ė´ ę°€ė†ęŗŧ ė œë™ė„ ė œė–´í•˜ë„ëĄ 합니다. IQ.Pilotė€ 빨간ëļˆęŗŧ ė •ė§€ í‘œė§€íŒė—ė„œ 늈ėļ”는 ę˛ƒė„ íŦ함해, ė‚ŦëžŒė´ëŧ늴 ė´ë ‡ę˛Œ ėš´ė „í•  " +"ę˛ƒė´ëŧęŗ  판단한 대로 ėŖŧ행합니다. ė†ë„ëŠ” ėŖŧ행 ëĒ¨ë¸ė´ ę˛°ė •í•˜ë¯€ëĄœ 네렕 ė†ë„ëŠ” ėƒí•œėœŧ로만 ėž‘ë™í•Šë‹ˆë‹¤. ė´ 기ëŠĨė€ 땄링 ę°œė„  ė¤‘ė´ëŠ° 똤ëĨ˜ę°€ " +"ë°œėƒí•  눘 ėžˆėŠĩ니다.

    IQ.Dynamic


    ėƒí™Šęŗŧ ë§ĨëŊ뗐 따ëŧ ė–´ëŒ‘í‹°ë¸Œ íŦëŖ¨ėψ ë™ėž‘ęŗŧ ė—”ë“œíˆŦė—”ë“œ ë™ėž‘ė„ ë™ė ėœŧ로" +" í˜ŧ합합니다.

    IQ.Chill


    ėĸ…ë°Ší–Ĩ ė œė–´ė— ęĩí†ĩ 흐ëĻ„ė„ ë°˜ė˜í•œ í‘œė¤€ íŦëŖ¨ėψ ë™ėž‘ė„ " +"ė‚ŦėšŠí•Šë‹ˆë‹¤.

    ėƒˆëĄœėš´ ėŖŧ행 ė‹œę°í™”


    ė €ė†ė—ė„œëŠ” ėŧëļ€ ėģ¤ë¸ŒëĨŧ 더 ėž˜ ëŗ´ė—ŦėŖŧ기 ėœ„í•´ ėŖŧ행 í™”ëŠ´ė´ ė „ë°Š 광각 ėš´ëŠ”ëŧ로 " +"ė „í™˜ëŠë‹ˆë‹¤. 똤ëĨ¸ėĒŊ ėœ„ė—ëŠ” IQ.Pilot ëĄœęŗ ë„ í‘œė‹œëŠë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "륹ėģ¨ ę¸°ë™ ëĒ¨ë“œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "ėĸ…ë°Ší–Ĩ 튜닝 프로필" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "ė˜ˆė¸Ą ęą°ëĻŦ 늘ëĻŦ기" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "ė˜ˆė¸Ą ęą°ëĻŦ ė¤„ė´ę¸°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "ė €ė† íšŒė „ ę˛Ŋ로 ęŗ„íš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"MEB 및 MQB Evo ė°¨ëŸ‰ė—ė„œ ęŗ„íší•œ ęŗĄëĨ ė„ ėŠ¤í‹°ė–´ë§ ëž™ė— ëŗ´ë‚´ę¸° 렄뗐 렀뗭 í†ĩęŗŧ 필터로 래ëĻŦ해 ėĸŒėš° 흔들ëĻŧė„ ė¤„ėž…ë‹ˆë‹¤. 해당 " +"ė°¨ëŸ‰ė—ė„œëŠ” ę¸°ëŗ¸ėœŧ로 ėŧœė§‘니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "ėˆ˜ë™" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "ėĩœëŒ€" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "MQB ACC ėžŦ氜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "MQB ACC ėžŦ氜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "MQB ėĄ°í–Ĩ ėž ę¸ˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "MQB ėĄ°í–Ĩ ėž ę¸ˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "ėœ ė§€ 관ëĻŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "ėˆ˜ë™ 맀뗰 ëŗ´ė •ę°’" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "ė§€ë„ ë°ė´í„°ë˛ ė´ėŠ¤" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "ė¸Ąė •ę°’:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "마ėŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "ė°¨ëŸ‰ė˜ ë°Ší–Ĩė§€ė‹œë“ąė„ ėŖŧ행 í™”ëŠ´ė— í™”ė‚´í‘œëĄœ í‘œė‹œí•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "ëĒ¨ë¸ ė •ė§€ ė‹œę°„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "ëĒ¨ë¸" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "해당 ė—†ėŒ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "PANDA ė—†ėŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "ė—†ėŒ" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "ë‚´ëš„ę˛Œė´ė…˜" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "ë‚´ëš„ę˛Œė´ė…˜ė´ ėˇ¨ė†Œë¨" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "ę°€ęšŒė›€" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "ë„¤íŠ¸ė›ŒíŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "ė‹ ę˛Ŋ망 FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "ė‹ ę˛Ŋ망 í”ŧ드íŦė›Œë“œ (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "ė ˆė „ ė•ˆ 함" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "ė•„ë‹ˆėš”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "핸들 ėĄ°ėž‘ ė—†ėŒ" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "QR ėŊ”ë“œę°€ ę°ė§€ë˜ė§€ ė•ŠėŒ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "ė‚ŦėšŠėž '{}'ė˜ SSH 키ëĨŧ ė°žė„ 눘 ė—†ėŠĩ니다" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "Wi-Fi ë„¤íŠ¸ė›ŒíŦëĨŧ ė°žė„ 눘 ė—†ėŠĩ니다" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "개발 ëĒ¨ë“œė—ė„œ ėš´ëŠ”ëŧ가 ę°ė§€ë˜ė§€ ė•Šė•˜ėŠĩ니다. ęŗ„ė†í•˜ë ¤ëŠ´ í™•ė¸ė„ 누ëĨ´ė„¸ėš”." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "ëĻ´ëĻŦ늤 노트가 ė—†ėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "결ęŗŧ ė—†ėŒ" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "기록된 ėŖŧí–‰ė´ ė—†ėŠĩ니다" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "ė„¤ė •ëœ ė°¨ëŸ‰ ė—†ėŒ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "ė´ ėš´ëŠ”ëŧė˜ ė˜ėƒė´ ė—†ėŠĩ니다" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"ëŗ´í†ĩė€ ë°Ší–Ĩė§€ė‹œë“ąė„ ėŧœ ë‘ė–´ë„ 한 ë˛ˆė˜ ėĄ°ėž‘ėœŧ로 ė°¨ëĄœ ëŗ€ę˛Ŋė´ 끝납니다. ė´ ė˜ĩė…˜ė„ ėŧœëŠ´ ë°Ší–Ĩė§€ė‹œë“ąė´ ėŧœė ¸ ėžˆëŠ” ë™ė•ˆ ęŗ„ė† ëŗ€ę˛Ŋ할 눘 " +"ėžˆėŠĩ니다. 다만 ë‹¤ėŒ ëŗ€ę˛Ŋ마다 핸들 ėĄ°ėž‘ė´ í•„ėš”í•Šë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "ė´ Subaru 플ëžĢíŧė—ė„œëŠ” ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "ė—°ę˛°ë˜ė§€ ė•ŠėŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "ė„¤ė •ë˜ė§€ ė•ŠėŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"및溠: LFA/LKAS 버íŠŧė´ ė—†ëŠ” ė°¨ëŸ‰ė—ė„œëŠ” ė´ ė˜ĩė…˜ė„ 끄면 íŦëŖ¨ėψ ė‚ŦėšŠ 가ëŠĨ ė—Ŧëļ€ę°€ 바뀔 때 ėĄ°í–Ĩ ëŗ´ėĄ°ę°€ ė¤€ëš„ ėƒíƒœëĄœ ë“¤ė–´ę°€ė§€ " +"ė•ŠėŠĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "핸들 ėĄ°ėž‘" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "ė˜¤í”„ëŧė¸" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "í™•ė¸" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "똍ëŧė¸" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "끄기" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "ė˜¤í”„ëŧė¸ 화면 ė§€ë„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "ė˜¤í”„ëĄœë“œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "ė˜¤í”„ëĄœë“œ ėĸ…ëŖŒ íƒ€ė´ë¨¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "ė˜¤í”„ëĄœë“œ: ëļ€íŒ…í•˜ęą°ë‚˜ ęš¨ė–´ë‚  때마다 í•­ėƒ ė˜¤í”„ëĄœë“œ ėƒíƒœę°€ 됩니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "ëŗ´ė •ę°’:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "揰揰뗐 ė €ėžĨ됨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "똍ëŧė¸ 화면 ė§€ë„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "ėŖŧ행 뤑 ę°œë°œėž UI" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "íœ´ëŒ€í°ė—ė„œ Konn3kt ė•ąė„ ė—Ŧė„¸ėš”" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "ëŗ„ëĒ…(ė„ íƒ ė‚Ŧ항)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "ėŖŧ행 뤑뗐 ė‹¤ė‹œę°„ ė œė–´ ė§€í‘œ(ėĄ°í–Ĩ, íšĄę°€ė†ë„, ė•žė°¨ ë°ė´í„°) 막대ëĨŧ ë§ė”Œė›Œ í‘œė‹œí•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "íŽ˜ė–´ë§" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "ė§€ë‚œėŖŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "PQ HCA Status 7 ëĒ¨ë“œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "PQ HCA ėƒíƒœ 7 ëĒ¨ë“œ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "미ëĻŦëŗ´ę¸°" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "ėžĨėš˜ íŽ˜ė–´ë§" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "ė§€ę¸ˆ ė—…ęˇ¸ë ˆė´ë“œ" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "ėžĨėš˜ íŽ˜ė–´ë§" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Konn3kt ė•ąė—ė„œ 기기ëĨŧ íŽ˜ė–´ë§í•˜ė„¸ėš”" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Konn3kt ė•ąė—ė„œ 기기ëĨŧ íŽ˜ė–´ë§í•˜ė„¸ėš”." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "ėžĨėš˜ëĨŧ ęˇ€í•˜ė˜ comma 溄렕뗐 íŽ˜ė–´ë§í•˜ė„¸ėš”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "ė—…ë°ė´íŠ¸ ėŧė‹œ 뤑맀" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "ę˛€ėƒ‰ ė‹¤í–‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "IQ.Pilotė—ė„œ ėš´ė „ėžę°€ ė œë™í•  때 ėĄ°í–Ĩ ëŗ´ėĄ°ę°€ ė–´ë–ģ枌 ë°˜ė‘í• ė§€ ė„ íƒí•˜ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "ë¸Œë ˆė´íŦ 페ë‹Ŧė„ ë°Ÿė•˜ė„ 때 ėĄ°í–Ĩ ëŗ´ėĄ°ę°€ ė–´ë–ģ枌 ë ė§€ ė„ íƒí•˜ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "ė¤€ëš„ëœ ė—…ë°ė´íŠ¸ę°€ ėŠšė¸ë§Œ 기다ëĻ´ė§€, ėŠ¤ėŠ¤ëĄœ ë‚´ë ¤ë°›ė•„ ė„¤ėš˜í• ė§€ ė„ íƒí•˜ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "ė°¨ëŸ‰ė„ ė„ íƒí•˜ė„¸ėš”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "ėžë™ 氐맀ëĨŧ 건너뛰려면 ė°¨ëŸ‰ė„ ęŗ ė •í•˜ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"ė•žė°¨ëĨŧ í‘œė‹œí•˜ëŠ” í‘œė‹ė— ė‹¤ė‹œę°„ ėˆ˜ėš˜(밍氄, ė†ë„, 도ë‹Ŧ ė‹œę°„)ëĨŧ ęŗ ė •í•Šë‹ˆë‹¤. IQ.Pilotė´ ę°€ė†ęŗŧ ė œë™ė„ ė œė–´í•˜ęŗ  ėžˆė–´ė•ŧ 합니다." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "봈揰 íŽ˜ė–´ë§ė„ ė™„ëŖŒí•˜ë ¤ëŠ´ Wi‑Fi뗐 ė—°ę˛°í•˜ė„¸ėš”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "ėĩœė´ˆ íŽ˜ė–´ë§ė„ ė™„ëŖŒí•˜ë ¤ëŠ´ Wi-Fi뗐 ė—°ę˛°í•˜ė„¸ėš”." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "키ëĨŧ ę°€ė ¸ė˜¤ë ¤ëŠ´ Wi-Fi뗐 ė—°ę˛°í•˜ė„¸ėš”." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "ė—…ë°ė´íŠ¸í•˜ë ¤ëŠ´ Wi-Fi뗐 ė—°ę˛°í•˜ė„¸ėš”." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "ėš´ė „ėž ėš´ëŠ”ëŧëĨŧ í†ĩė‹ ė‚Ŧ eSIM QR ėŊ”드(LPA:...)뗐 맞ėļ”ė„¸ėš”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "폴ëĻŦė‹œ ę°€ė¤‘ėš˜" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "렄뛐 끄기" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"ė—”ė§„ė´ ęēŧė§„ ėƒíƒœëĄœ ė´ ė‹œę°„ë§Œíŧ ė§€ë‚˜ëŠ´ 기기 ė „ė›ė„ 끕니다.\n" +"(ę¸°ëŗ¸ę°’ 30ė‹œę°„)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "ė˜ˆė¸Ą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "ė˜ˆė¸Ą 튜닝: ę°€ė† ëŗ€í™”ëĨŧ 미ëĻŦ ë‚´ë‹¤ëŗ´ęŗ  ëļ€ë“œëŸŊ枌 만듭니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "미ëĻŦ ë‹¤ėš´ëĄœë“œ + 미ëĻŦ ė„¤ėš˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "미ëĻŦ ë‹¤ėš´ëĄœë“œë§Œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "ė§€ë„ 타ėŧ ė¤€ëš„ 뤑..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "ėĸ…ëŸ‰ė œ Wi‑Fi 뗰枰 ė‹œ ëŒ€ėšŠëŸ‰ ė—…ëĄœë“œ ë°Šė§€" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "ėĸ…ëŸ‰ė œ ė…€ëŖ°ëŸŦ 뗰枰 ė‹œ ëŒ€ėšŠëŸ‰ ė—…ëĄœë“œ ë°Šė§€" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "ėš´ė „ėž ëĒ¨ë‹ˆí„°ë§ė˜ ę°€ė‹œė„ąė„ í™•ė¸í•˜ę¸° ėœ„í•´ ėš´ė „ėž ėš´ëŠ”ëŧëĨŧ 미ëĻŦ 봅니다. (ė°¨ëŸ‰ė€ ęēŧė ¸ ėžˆė–´ė•ŧ 합니다)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "프로필 ėž‘ė—…" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "기기가 ė¸í„°ë„ˇė— ė—°ę˛°ë  때마다 화면 ė§€ë„ėšŠ Mapbox 타ėŧė„ ė‹¤ė‹œę°„ėœŧ로 氀렏ė˜ĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "ëĒ¨ë¸ ėēė‹œ ëš„ėš°ę¸°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "ė—…ë°ė´íŠ¸ ė„¤ėš˜ ë°Šė‹ė„ ëŗ€ę˛Ŋ하기 렄뗐 기기ëĨŧ í•­ėƒ ė˜¤í”„ëĄœë“œëĄœ 두거나 ė°¨ëŸ‰ ė „ė›ė„ ë„ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "ė´ 항ëĒŠė„ ëŗ€ę˛Ŋ하기 렄뗐 기기ëĨŧ í•­ėƒ ė˜¤í”„ëĄœë“œëĄœ 두거나 ė°¨ëŸ‰ ė „ė›ė„ ë„ė„¸ėš”." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "QR ėŊ”드 똤ëĨ˜" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "QR ėŊ”ë“œę°€ ė¸ė‹ë¨" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "ė¤€ëš„ë¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "ë‹¤ė‹œ ë‹¤ėš´ëĄœë“œ" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "ėƒˆëĄœęŗ ėš¨" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "ė œęą°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "ė œęą° 뤑..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "ėžŦ네렕" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "검토" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "ėĄ°í–Ĩ 揰떴:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "ė–ŧęĩ´ė´ ę°€ë ¤ė§€ęą°ë‚˜ ėš´ė „ėž ëĒ¨ë‹ˆí„°ë§ė´ ėļ”ė í•˜ę¸° ė–´ë ¤ėš°ëŠ´ ėžĨė°Šė„ ë‹¤ė‹œ í•˜ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "ė°¨ëŸ‰ ė „ė›ė´ ęēŧė ¸ ėžˆęą°ë‚˜ í•­ėƒ ė˜¤í”„ëĄœë“œę°€ ėŧœė ¸ ėžˆė„ 때만 ė´ėšŠí•  눘 ėžˆėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "ėžŦė‹œėž‘" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "ėžĨėš˜ ėžŦė‹œėž‘" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "ėžŦė‹œėž‘ 및 ė—…ë°ė´íŠ¸" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "ė‹œė† 31mph(50km/h) ė´ėƒė—ė„œ ë°Ší–Ĩė§€ė‹œë“ą ė—†ė´ ę°ė§€ëœ 밍넠 밖ėœŧ로 ë˛—ė–´ë‚˜ëŠ´ 밍넠ėœŧ로 ëŗĩ귀하ëŧ는 ę˛Ŋęŗ ëĨŧ 받ėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "ėš´ė „ėž ėš´ëŠ”ëŧ 기록 및 ė—…ëĄœë“œ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "ë§ˆė´íŦ ė˜¤ë””ė˜¤ 기록 및 ė—…ëĄœë“œ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "ėŖŧ행 뤑 ë§ˆė´íŦ ė˜¤ë””ė˜¤ëĨŧ ę¸°ëĄí•˜ęŗ  ė €ėžĨ합니다. ė˜¤ë””ė˜¤ëŠ” Konn3ktė˜ ëŒ€ė‹œėē  ė˜ėƒė— íŦ함됩니다." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "ėŖŧ행 ë°ė´í„°ė™€ ė˜ėƒė„ ę¸°ëĄí•˜ęŗ  ė—…ëĄœë“œí•Šë‹ˆë‹¤. 끄면 ëĒ¨ë“  ę¸°ëĄė´ ė¤‘ë‹¨ëŠë‹ˆë‹¤! 로그도, ė˜ėƒë„, ė†ŒëĻŦ도 ė—†ėŠĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "ë‹¤ė‹œ ë‹¤ėš´ëĄœë“œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "현ėžŦ ëĒ¨ë¸ ë‹¤ė‹œ ë‹¤ėš´ëĄœë“œ" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "프로필 ėƒˆëĄœęŗ ėš¨" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "掜렜 ė •ëŗ´" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "íŽ¸ė•ˆí•œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "ëĒ¨ë¸ ëĒŠëĄ ėƒˆëĄœęŗ ėš¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "ėž‘ë™ ėœ ė§€: ė œë™í•´ë„ ėĄ°í–Ĩ ëŗ´ėĄ°ę°€ ė¤‘ë‹¨ë˜ė§€ ė•ŠėŠĩ니다." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "ė›ę˛Š ė•Ąė„¸ėŠ¤" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "ė œęą°" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Comma pSIM ė œęą°" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "ė´ëĻ„ ëŗ€ę˛Ŋ" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "프로필 ė´ëĻ„ ëŗ€ę˛Ŋ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "ėš”ė˛­ ė‹œę°„ė´ 봈ęŗŧë˜ė—ˆėŠĩ니다" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "IQ.Pilot ėĸ…ë°Ší–Ĩ ė œė–´(ė•ŒíŒŒ)ëĨŧ ėŧœė•ŧ 합니다." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "ėžŦ네렕" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "ėē˜ëĻŦë¸Œë ˆė´ė…˜ ėžŦ네렕" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "ę¸°ëŗ¸ę°’ ëŗĩ뛐" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "학ėŠĩ ę°€ė´ë“œ 검토" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "IQ.Pilotė˜ ęˇœėš™, 기ëŠĨ 및 ė œí•œė„ 검토" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "도로ëĒ…" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "도로ëĒ… í‘œė‹œ" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "ėŖŧ행 기록" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "ę˛Ŋ로 뗔맄 ë˛„ė „" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "ė´ ę¸°ę¸°ė—ė„œ ė†Œí˜• comma 4(mici) ė¸í„°íŽ˜ė´ėŠ¤ëĨŧ ė‹¤í–‰í•Šë‹ˆë‹¤" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "ė„ íƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC ėžë™ í™•ė¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC 냁í–Ĩ í™•ė¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC 하í–Ĩ í™•ė¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC ëŒ€ė˛´ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC 똍ëŧė¸ ëŗ´ė™„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC ėžŦė •ė˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC ė •ėą…" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "SSH 키" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "SSH 키" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "ėˆœė • ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "늤ėē”" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "QR 늤ėē”" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "QR ėŊ”드ëĨŧ 늤ėē”í•˜ęą°ë‚˜ í™œė„ąí™” ėŊ”드ëĨŧ ėž…ë Ĩí•˜ė„¸ėš”" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "Wi‑Fi ë„¤íŠ¸ė›ŒíŦ ę˛€ėƒ‰ 뤑..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "ę˛€ėƒ‰" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "ėŖŧė†Œ 또는 ėžĨė†Œ ę˛€ėƒ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "ė œėĄ°ė‚Ŧ 또는 ëĒ¨ë¸ ę˛€ėƒ‰" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "ę˛€ėƒ‰ 뤑..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "ė„ íƒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "ë¸Œëžœėš˜ ė„ íƒ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "떏떴 ė„ íƒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "ėĄ°í–Ĩ 맀뗰 ėžë™ ėĄ°ė •" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "ė‹œëĻŦė–ŧ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "ė§‘ 네렕" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "ėœ„ėš˜ 揰뤀ėœŧ로 ë‹¨ėœ„ 네렕" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "링ėžĨ 네렕" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "ė§‘ ėŖŧė†Œ 네렕" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"기기 ėœ„ėš˜ëĨŧ 揰뤀ėœŧ로 ë‹¨ėœ„ëĨŧ ė„¤ė •í•Šë‹ˆë‹¤. 미ęĩ­, 똁ęĩ­, ëŧė´ë˛ ëĻŦė•„ëĨŧ ė œė™¸í•œ ëĒ¨ë“  ęŗŗė—ė„œ ė†ë„ę°€ km/h로 바뀌며, ęĩ­ę˛Ŋė„ ë„˜ė„ 때 ë‹¤ė‹œ " +"í™•ė¸í•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "링ėžĨ ėŖŧė†Œ 네렕" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"ė°¨ëĄœ íšŒė „ ė˜ë„ę°€ ė‚ŦėšŠí•˜ëŠ” ė†ë„ ėž„ęŗ„ę°’ė„ ė„¤ė •í•Šë‹ˆë‹¤. ė´ ę°’ëŗ´ë‹¤ 낮ėœŧ늴 íšŒė „ ė˜ë„ę°€ 가ėžĨ ę°€ęšŒėš´ ėŖŧ행 가ëŠĨ íšŒė „ ę˛Ŋ로ëĨŧ ęŗ„íší•  눘 " +"ėžˆėŠĩ니다. ę¸°ëŗ¸ę°’ė€ ė‹œė† 19마ėŧėž…ë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "ëļ€íŒ… 후 또는 ė ˆė „ė—ė„œ ęš¨ė–´ë‚œ 뒤 기기가 ė–´ë–¤ ėƒíƒœę°€ ë ė§€ ė„¤ė •í•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "네렕" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "현ėžŦ 도로 ė´ëĻ„ė„ ėŖŧ행 화면 ėœ„ė— í‘œė‹œí•Šë‹ˆë‹¤.
    해당 ė§€ė—­ė˜ ė˜¤í”„ëŧė¸ ė§€ë„ ë°ė´í„°ę°€ ė„¤ėš˜ë˜ė–´ ėžˆė–´ė•ŧ 합니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "ëļ€ë“œëŸŦ뚴 ėĄ°í–Ĩ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "ė—…ë°ė´íŠ¸ ë‚˜ė¤‘ė— ė•ŒëĻŧ" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "ė†Œí”„íŠ¸ė›¨ė–´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "ė†ë„" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "ė œí•œ ė†ë„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "ė œí•œ ė†ë„ ė œė–´" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "í‘œė¤€" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"í‘œė¤€ė„ ęļŒėžĨ합니다. ęŗĩę˛Šė  ëĒ¨ë“œė—ė„œëŠ” ė•žė°¨ëĨŧ 더 가깝게 따ëŧ氀溠 ę°€ę°ė†ė´ 더 ė ęˇšė ėž…ë‹ˆë‹¤. íŽ¸ė•ˆí•œ ëĒ¨ë“œė—ė„œëŠ” ė•žė°¨ė™€ ęą°ëĻŦëĨŧ 더 둡니다. " +"맀뛐 ė°¨ëŸ‰ė—ė„œëŠ” ėŠ¤í‹°ė–´ë§ė˜ 밍氄 버íŠŧėœŧ로 ė´ ė„ąí–Ĩë“¤ė„ ė „í™˜í•  눘 ėžˆėŠĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "대기" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "대기: ė œë™í•˜ëŠ´ ėĄ°í–Ĩ ëŗ´ėĄ°ę°€ 늈ėļ”ęŗ , 페ë‹Ŧė—ė„œ ë°œė„ ë–ŧ늴 ë‹¤ė‹œ ėž‘ë™í•Šë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "ë‹¤ėš´ëĄœë“œ ė‹œėž‘" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "ėĄ°í–Ĩ ëŗ´ėĄ° ë™ėž‘ í˜¸í™˜ė„ąė„ í™•ė¸í•˜ë ¤ëŠ´ ė°¨ëŸ‰ė— ė‹œë™ė„ ęą°ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "ėŖŧ" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "í†ĩęŗ„" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "ėƒíƒœ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "ėž‘ë™ ėœ ė§€" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "ėĄ°í–Ĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "ėĄ°í–Ĩ ëŗ´ėĄ° ë™ėž‘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "ėĄ°í–Ĩë Ĩ 호" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "ėˆœė • ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "ë‹¤ėš´ëĄœë“œ 뤑맀" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"ėˆ˜ë™ í•¸ë“œë¸Œë ˆė´íŦ가 ėžˆëŠ” Subaru Global ė°¨ëŸ‰ėšŠ ėŠ¤í†ą 땤 ęŗ  ë°Šė‹ėž…ë‹ˆë‹¤. ė „ėžė‹ ėŖŧė°¨ ë¸Œë ˆė´íŦ가 ėžˆëŠ” ė°¨ëŸ‰ė—ė„œëŠ” ęēŧ ë‘ė„¸ėš”. ė´" +" ęĩŦí˜„ė„ 렜ęŗĩ한 martinl 님ęģ˜ ę°ė‚Ŧ드ëĻŊ니다!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "ė €ėžĨ된 ė§€ë„" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "클ëŧėš°ë“œė—ė„œ ėŠ¤íŠ¸ëĻŦ밍 뤑" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "기기ëĨŧ í•­ėƒ ė˜¤í”„ëĄœë“œ ëĒ¨ë“œëĄœ ė „í™˜í• ęšŒėš”?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "기기ëĨŧ ę°•ė œ ė˜¤í”„ëĄœë“œ ëĒ¨ë“œëĄœ ė „í™˜í• ęšŒėš”?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "ė‹œėŠ¤í…œ" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "ė‹œėŠ¤í…œ ė‘ë‹ĩ ė—†ėŒ" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "ėĻ‰ė‹œ ėˆ˜ë™ ėĄ°ėž‘í•˜ė„¸ėš”" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "ė˜¨ë„" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "ė˜¨ë„ ë†’ėŒ" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "ė˜¨ë„ ė •ėƒ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "\"Add Device\"ëĨŧ 누ëĨ´ęŗ  똤ëĨ¸ėĒŊ QR ėŊ”드ëĨŧ 늤ėē”í•˜ė„¸ėš”" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "ëŒ€ėƒ ë¸Œëžœėš˜" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "테더링 비밀번호" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "ė„ íƒí•œ ëĒ¨ë¸ė´ ëŗ€ę˛Ŋë˜ė—ˆėŠĩ니다. ėē˜ëĻŦë¸Œë ˆė´ė…˜ ė´ˆę¸°í™”ëĨŧ ęļŒėžĨ합니다. ė§€ę¸ˆ ė‹¤í–‰í• ęšŒėš”?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "ė‹¤í–‰í•˜ëŠ´ 되돌ëĻ´ 눘 ė—†ėŠĩ니다 — ėˇ¨ė†Œí•  ë§ˆė§€ë§‰ ę¸°íšŒėž…ë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "ė ėšŠí•˜ë ¤ëŠ´ ėžŦëļ€íŒ…ė´ í•„ėš”í•Šë‹ˆë‹¤. ė§€ę¸ˆ ėžŦė‹œėž‘í• ęšŒėš”?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "ė´ 플ëžĢíŧė€ í•´ė œ ëĒ¨ë“œëĄœë§Œ ė œí•œëŠë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "ė´ 플ëžĢíŧė€ ėĄ°í–Ĩ ëŗ´ėĄ° ë™ėž‘ ė˜ĩė…˜ 뤑 ėŧëļ€ë§Œ ė§€ė›í•Šë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "ė´ 플ëžĢíŧė€ ėĄ°í–Ĩ ëŗ´ėĄ° ë™ėž‘ ė„¤ė •ė„ ëĒ¨ë‘ ė§€ė›í•Šë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"ë‹¤ėš´ëĄœë“œí•œ ëĒ¨ë“  ė§€ë„ę°€ ė‚­ė œëŠë‹ˆë‹¤\n" +"\n" +"ė •ë§ ëĒ¨ë“  ė§€ë„ëĨŧ ė‚­ė œí• ęšŒėš”?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "현ėžŦ ė‚ŦėšŠ ė¤‘ė¸ ëĒ¨ë¸ė„ ė œė™¸í•œ, ë‹¤ėš´ëĄœë“œëœ ëĒ¨ë“  ëĒ¨ë¸ė„ ėēė‹œė—ė„œ ė‚­ė œí•Šë‹ˆë‹¤. ęŗ„ė†í• ęšŒėš”?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "SIMė—ė„œ Comma pSIM í”„ëĄœí•„ė´ 똁ęĩŦ렁ėœŧ로 ė‚­ė œëŠë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "ë‹¤ėš´ëĄœë“œëĨŧ ė‹œėž‘í•˜ëŠ°, ė™„ëŖŒęšŒė§€ ė‹œę°„ė´ 깸ëĻ´ 눘 ėžˆėŠĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "ė‹œę°„" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "토글" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "í•Šęŗ„:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "횡방í–Ĩ ė œė–´ę°€ ėž‘ë™í•˜ëŠ” ë™ė•ˆ IQ.Pilotė´ ė–ŧ마나 ėĄ°í–Ĩí•˜ęŗ  ėžˆëŠ”ė§€ëĨŧ 도로 화면 ėœ„ė— 호로 ꡸ëĻŊ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "ė‚ŦėšŠ ė•ˆë‚´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "ë°Ší–Ĩė§€ė‹œë“ą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "ëŦ´ė„  ė—…ë°ė´íŠ¸ í™•ė¸ė„ ė™„ė „ížˆ 끕니다.
    ė ėšŠí•˜ë ¤ëŠ´ ėžŦëļ€íŒ…í•˜ė„¸ėš”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "ė—°ė‹ė— ė´ė–´ ëĒ¨ë¸ė„ ėž…ë Ĩí•˜ė„¸ėš” — 똈: 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "ę˛€ėƒ‰ė–´ëĨŧ ėž…ë Ĩí•˜ė„¸ėš”" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "ė‚ŦėšŠ ëļˆę°€" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "ė œęą°" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "ė—…ë°ė´íŠ¸" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "USB ė €ėžĨė†Œ" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "ė‚ŦėšŠ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "ė˜ėƒė„ ëļˆëŸŦė˜Ŧ 눘 ė—†ėŠĩ니다" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "ė°¨ëŸ‰ė´ ė˜¨ëĄœë“œ ėƒíƒœė¸ ë™ė•ˆė—ëŠ” ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "ė‚ŦėšŠ ëļˆę°€ — ė´ ė°¨ëŸ‰ė—ė„œëŠ” IQ.Pilot ėĸ…ë°Ší–Ĩ ė œė–´ę°€ ėž‘ë™í•˜ė§€ ė•ŠėŠĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "ę°ė§€ë˜ė§€ ė•Šė•˜ęŗ  ė„¤ė •ë„ ė—†ėŒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "ė œęą°" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "ė•Œėˆ˜ė—†ėŒ" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "ė•Œ 눘 ė—†ëŠ” í†ĩė‹ ė‚Ŧ" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "ëŦ´ė œí•œ ėŖŧ행 기록 ė €ėžĨ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "ė—…ë°ė´íŠ¸ ė„¤ėš˜ ëĒ¨ë“œ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "ė—…ë°ė´íŠ¸ëŠ” ė°¨ëŸ‰ ė „ė›ė´ ęēŧė ¸ ėžˆė„ 때만 ë‹¤ėš´ëĄœë“œëŠë‹ˆë‹¤." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "ėŖŧ행 뤑 ė—…ëĄœë“œ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "ėš´ė „ėž ë°Ší–Ĩ ėš´ëŠ”ëŧ ë°ė´í„°ëĨŧ ė—…ëĄœë“œí•˜ė—Ŧ ėš´ė „ėž ëĒ¨ë‹ˆí„°ë§ ė•Œęŗ ëĻŦėϘ ę°œė„ ė— ë„ė›€ė„ ėŖŧė„¸ėš”." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "ė—…ëĄœë“œë¨" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "ė—…ëĄœë“œ 뤑" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"PQ 플ëžĢíŧ ė°¨ëŸ‰ė˜ ėĄ°í–Ĩ ė œė–´ė— Status 5 ëŒ€ė‹  HCA Status 7ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ėŧëļ€ ęĩŦ형 í­ėŠ¤ë°”ę˛ ëĒ¨ë¸ė—ė„œ í˜¸í™˜ė„ąė´ ę°œė„ ë  " +"눘 ėžˆėŠĩ니다." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "ë¯¸í„°ë˛• ė‚ŦėšŠ" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"í™œė„ąí™” ėŊ”드 ė‚ŦėšŠ:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "ACC 및 밍넠 ėœ ė§€ ëŗ´ėĄ°ė— IQ.Pilotė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ė´ 기ëŠĨė„ ė‚ŦėšŠí•  때는 í•­ėƒ ėŖŧė˜ę°€ í•„ėš”í•Šë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "ė°¨ëŸ‰" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "ëŗ´ę¸°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (ę°€ėƒ 토íŦ 블렌딩)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "ė°¨ëŸ‰" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "ė°¨ëŸ‰ė˜ ėĸ…ë°Ší–Ĩ ė œė–´ ė§€ė›ė´ 땄링 ę°ė§€ë˜ė§€ ė•Šė•˜ėŠĩ니다. 맀뛐 ė—Ŧëļ€ëĨŧ í™•ė¸í•˜ë ¤ëŠ´ ė‹œë™ė„ 한 번 ęą¸ė–´ėŖŧė„¸ėš”." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "똁냁 í”Œë ˆė´ė–´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "IQ.Pilot ėļŠëŒė— 대한 똤ëĨ˜ 로그ëĨŧ 봅니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "ëš„ė „ ę°€ė¤‘ėš˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "화면 í‘œė‹œ" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "GPS ė‹ í˜¸ëĨŧ 기다ëĻŦ는 뤑..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "ėš´ė „ėž ėš´ëŠ”ëŧëĨŧ 기다ëĻŦ는 ė¤‘ėž…ë‹ˆë‹¤. í†ĩė‹ ė‚Ŧ eSIM QR ėŊ”드ëĨŧ ė‚ŦėšŠí•˜ęą°ë‚˜ LPA ėŊ”드ëĨŧ 링렑 ėž…ë Ĩí•˜ė„¸ėš”." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "ė‹œėž‘ 대기 뤑" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "ę˛Ŋęŗ " + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"ę˛Ŋęŗ : ė´ ė„¤ė •ė€ GitHub 네렕뗐 ėžˆëŠ” ëĒ¨ë“  ęŗĩ氜 í‚¤ė— SSH ė ‘ęˇŧė„ í—ˆėšŠí•Šë‹ˆë‹¤. ëŗ¸ė¸ ė™¸ė˜ GitHub ė‚ŦėšŠėž ė´ëĻ„ė€ ė ˆëŒ€ ėž…ë Ĩí•˜ė§€" +" ë§ˆė„¸ėš”. IQ.Pilot ė§ė›ė´ ėžė‹ ė˜ GitHub ė‚ŦėšŠėž ė´ëĻ„ė„ ėļ”가해 ë‹Ŧëŧęŗ  ėš”ė˛­í•˜ëŠ” ėŧė€ 결ėŊ” ė—†ėŠĩ니다." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "ę˛Ŋęŗ : {} ë¯¸ë§Œė˜ ėģ¤ë¸Œė—ė„œ ėĄ°í–Ĩė´ 흔들ëĻ´ 눘 ėžˆėŠĩ니다. 그런 ëŠë‚Œė´ 들면 ė´ ė˜ĩė…˜ė„ ë„ė„¸ėš”." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "IQ.Pilot뗐 ė˜¤ė‹  ę˛ƒė„ í™˜ė˜í•Šë‹ˆë‹¤" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "ė´ ė˜ĩė…˜ė„ ėŧœëŠ´ ę°€ė† 페ë‹Ŧė„ ë°Ÿė„ 때 IQ.Pilotė´ í•´ė œëŠë‹ˆë‹¤." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Wi‑Fi ë„¤íŠ¸ė›ŒíŦ ėĸ…ëŸ‰ė œ" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "링ėžĨ" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "비밀번호가 ė˜Ŧ바ëĨ´ė§€ ė•ŠėŠĩ니다" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "똈" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "똈, ëĒ¨ë“  ė§€ë„ëĨŧ ė‚­ė œí•Šë‹ˆë‹¤" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "IQ.Pilotė„ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė„œëš„ėŠ¤ ė•Ŋ洀뗐 ë™ė˜í•´ė•ŧ 합니다." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"IQ.Pilotė„ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė„œëš„ėŠ¤ ė•Ŋ洀뗐 ë™ė˜í•´ė•ŧ 합니다. ęŗ„ė†í•˜ę¸° 렄뗐 https://iqlvbs.com/tos ė—ė„œ ėĩœė‹  ė•Ŋę´€ė„ " +"ėŊė–´ëŗ´ė„¸ėš”." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"ė´í›„ė—ëŠ” ëŗ¸ė¸ė˜ eSIM í”„ëĄœí•„ė„ ė‚ŦėšŠí•´ė•ŧ 합니다. commaė—ė„œ 냈 SIMė„ ęĩŦėž…í•˜ė§€ ė•ŠëŠ” 한 Comma Primeė„ ë‹¤ė‹œ ė‚ŦėšŠí•  눘 " +"ė—†ėŠĩ니다." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "í™œė„ąí™”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "ė‚ŦėšŠ 뤑" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "ė‚ŦėšŠ ė¤‘ė¸ ëĒ¨ë¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "eSIM 프로필 ėļ”ę°€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "프로필 ėļ”ę°€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "ė ęˇšė " + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "APN 네렕" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "ėžë™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "ėžë™ ė–´ë‘Ąę˛Œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"ėžë™\n" +"ė—…ë°ė´íŠ¸" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "뒤로" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "ë¸Œëžœėš˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "ė–´ë‘ė›Œė§ 맀뗰" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "ėŖŧ행 ęą°ëĻŦ ęŗ„ė‚° 뤑..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "ėš´ëŠ”ëŧ ė‹œėž‘ 뤑" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "ėĸ…ëŸ‰ė œ ė…€ëŖ°ëŸŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"떏떴\n" +"ëŗ€ę˛Ŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "ė—…ë°ė´íŠ¸ í™•ė¸" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "í™•ė¸ 뤑..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "결합" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "í†ĩ합 ëĒ¨ë¸" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "ė„¤ė •ë¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "뗰枰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "ė—°ę˛°ë¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "뗰枰 뤑..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "ęŗ„ė†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "ė œė–´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "ė •ė§€ ėƒíƒœė—ė„œ ėļœë°œ (베타)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "íŦëŖ¨ėψ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "ęŗĄëĨ  ėģ¨íŠ¸ëĄ¤ëŸŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "ë¸”ëž™ë°•ėŠ¤" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "ęą°ëļ€" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "ę¸°ëŗ¸ę°’" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "ė‚­ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "ę°œë°œėž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "기기" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "기기 ID" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"ę°•ė œ ė˜¤í”„ëĄœë“œ\n" +"í•´ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "ę°•ė œ ė˜¤í”„ëĄœë“œ í•´ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "ęēŧ말" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "뗰枰 í•´ė œ 뤑..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "í•´ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "ę°€ė† 페ë‹Ŧ로 í•´ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "화면" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "화면 밝기" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "ė•„ëž˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "ė—…ë°ė´íŠ¸ ë‹¤ėš´ëĄœë“œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "ë‹¤ėš´ëĄœë“œ 뤑" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "ë‹¤ėš´ëĄœë“œ 뤑..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"ėš´ė „ėž ėš´ëŠ”ëŧ\n" +"미ëĻŦëŗ´ę¸°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "ėŖŧ행 뤑 밝기" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "ë‹¤ė´ë‚´ë¯š" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "ë¸”ëž™ë°•ėŠ¤ ėŧœę¸°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "로밍 ėŧœę¸°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "ėŧœė§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "ėˆœė • ėĸ…ë°Ší–Ĩ ę°•ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "APN ėž…ë Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "GitHub ė‚ŦėšŠėž ė´ëĻ„ ėž…ë Ĩ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "LPA í™œė„ąí™” ėŊ”드 ėž…ë Ĩ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "ėŊ”드 ėž…ë Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "비밀번호 ėž…ë Ĩ..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "ė—…ë°ė´íŠ¸ í™•ė¸ ė‹¤íŒ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "ė—…ë°ė´íŠ¸ ė‹¤íŒ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "ëš ëĻ„" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "ė—…ë°ė´íŠ¸ 마ëŦ´ëĻŦ 뤑..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "\"{}\"ėšŠ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "비ęŗĩ氜 ë¸Œëžœėš˜ ė—…ë°ė´íŠ¸ėšŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"ę°•ė œ\n" +"ė˜¤í”„ëĄœë“œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "mici UI ę°•ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "ę°•ė œ ė˜¤í”„ëĄœë“œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "ė‚­ė œ 뤑..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "í˜•ė‹: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "ėēė‹œė—ė„œ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "ė‹œę°„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "현대 ėĸ…ë°Ší–Ĩ 튜닝" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "ė •ëŗ´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "ė—…ë°ė´íŠ¸ ė„¤ėš˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "ėƒí˜¸ėž‘ėšŠ ė‹œę°„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "iq.dynamic 네렕" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "ė°¨ëĄœ ëŗ€ę˛Ŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "밍넠 ė´íƒˆ ę˛Ŋęŗ " + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "íšŒė „ ė†ë„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "횡방í–Ĩ 기동 ëĒ¨ë“œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "íŦëŖ¨ėψ 똤ëĨ˜ ė‹œ 횡방í–Ĩ" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "ėžë™ ęĩŦė„ąė„ ė‚ŦėšŠí•˜ë ¤ëŠ´ ëš„ė›Œ ë‘ė„¸ėš”" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "건너뛰려면 ëš„ė›Œ ë‘ė„¸ėš”" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "ė§€ėš°ë ¤ëŠ´ ė‚ŦėšŠėž ė´ëĻ„ęŗŧ í† í°ė„ ëš„ė›Œ ë‘ė„¸ėš”" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "ė™ŧėĒŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "ėĸ…ë°Ší–Ĩ 기동 ëĒ¨ë“œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "ė €ė† íšŒė „ ęŗ„íš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "ëļ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "프로필 관ëĻŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "ėˆ˜ë™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "ėˆ˜ë™ 맀뗰 ëŗ´ė •" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "ė§€ë„ë§Œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "ė§€ë„ ėš°ė„ " + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "ėĸ…ëŸ‰ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "ëĒ¨ë¸" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "ë„¤íŠ¸ė›ŒíŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "ë„¤íŠ¸ė›ŒíŦ ė‚ŦėšŠ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "ė—†ėŒ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "ė•„ë‹ˆėš”" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "ė•ŒëĻŧ ė—†ėŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "핸들 ėĄ°ėž‘ ė—†ėŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "ëŗ´í†ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "ë˛”ėœ„ 밖" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "ė§€ę¸ˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "핸들 ėĄ°ėž‘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "끄기" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "ė˜¤í”„ëŧė¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "ėŧœę¸°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "똍ëŧė¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "ëŗ„ëĒ… (ė„ íƒ ė‚Ŧ항)..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "ė•ąė—ė„œ íŽ˜ė–´ë§" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "Konn3kt뙀 íŽ˜ė–´ë§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "폴ëĻŦė‹œ ę°€ė¤‘ėš˜" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "렄뛐 끄기" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "ė˜ˆė¸Ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "프로필 ėž‘ė—…" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "ė•Œ 눘 ė—†ëŠ” í†ĩė‹ ė‚Ŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "ëĒ¨ë¸ ėēė‹œ ëš„ėš°ę¸°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "대기 뤑" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "ė¤€ëš„ë¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "ėžŦëļ€íŒ…" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "ėš´ė „ėž ėš´ëŠ”ëŧ 녹화" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "ë§ˆė´íŦ ë…šėŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "ëĒ¨ë¸ ë‹¤ė‹œ ë‹¤ėš´ëĄœë“œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "프로필 ėƒˆëĄœęŗ ėš¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "掜렜 ė •ëŗ´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "ė—Ŧėœ ëĄ­ę˛Œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "ëĒ¨ë¸ ëĒŠëĄ ėƒˆëĄœęŗ ėš¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "comma pSIM ė œęą°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "ė´ëĻ„ ëŗ€ę˛Ŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "프로필 ė´ëĻ„ ëŗ€ę˛Ŋ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "ė´ˆę¸°í™”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "ėē˜ëĻŦë¸Œë ˆė´ė…˜ ė´ˆę¸°í™”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"ė‚ŦėšŠ ė•ˆë‚´\n" +"ëŗ´ę¸°" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "똤ëĨ¸ėĒŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "봈" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "QR 늤ėē”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "QR 늤ėē” / ėŊ”드 ėž…ë Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "ë„¤íŠ¸ė›ŒíŦ ę˛€ėƒ‰ 뤑" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "ėĄ°í–Ĩ 맀뗰 ėžë™ ėĄ°ė •" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "ė‹œëĻŦė–ŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "네렕 ė†ë„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "ėœ„ėš˜ 揰뤀 ë‹¨ėœ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"ë°€ė–´ė„œ\n" +"ėēė‹œ ëš„ėš°ę¸°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"ë°€ė–´ė„œ\n" +"뗰枰 í•´ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"ë°€ė–´ė„œ\n" +"ë„¤íŠ¸ė›ŒíŦ ė‚­ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"ë°€ė–´ė„œ\n" +"ë‹¤ė‹œ ë‹¤ėš´ëĄœë“œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"ë°€ė–´ė„œ\n" +"ėē˜ëĻŦë¸Œë ˆė´ė…˜ ė´ˆę¸°í™”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"ë°€ė–´ė„œ\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"ë°€ė–´ė„œ comma\n" +"pSIM ė œęą°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "느ëĻŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "ëļ€ë“œëŸŦ뚴 ėĄ°í–Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "ė†Œí”„íŠ¸ė›¨ė–´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "ė œí•œ ė†ë„ 네렕" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "í‘œė¤€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "대기" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"IQ.Pilotė„ ė‚ŦėšŠí•˜ë ¤ëŠ´\n" +"ė°¨ëŸ‰ė— ė‹œë™ė„ ęą°ė„¸ėš”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "ė‹œėž‘ 뤑..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "ėƒíƒœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "ėž‘ë™ ėœ ė§€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "ėĄ°í–Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "ėĄ°í–Ĩ ëŗ´ėĄ° ë™ėž‘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "ėˆœė •" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "ėˆ˜ë™ í•¸ë“œë¸Œë ˆė´íŦ ėŠ¤í†ą 땤 ęŗ " + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "ë‹¤ėš´ëĄœë“œ 뤑맀" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "ė‹œėŠ¤í…œ ëļ€íŒ… 뤑" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "ëŒ€ėƒ ë¸Œëžœėš˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"ė´ėšŠ\n" +"ė•Ŋ관" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "테더링" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "테더링 비밀번호" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "토글" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "ėŖŧ행 기록" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "ė œęą°" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "IQ.Pilot ė œęą°" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "비ėĸ…ëŸ‰ė œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "ė§€ė›ë˜ė§€ ė•ŠėŒ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "ėœ„" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "ėĩœė‹  ėƒíƒœ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "ėĩœė‹ ėž…니다. ë§ˆė§€ë§‰ í™•ė¸: ė—†ėŒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "ėĩœė‹ ėž…니다. ë§ˆė§€ë§‰ í™•ė¸: {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"ė—…ë°ė´íŠ¸ ė„¤ėš˜\n" +"ëĒ¨ë“œ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "ė—…ë°ė´íŠ¸ 가ëŠĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"ė—…ë°ė´í„°ę°€ ė‘ë‹ĩí•˜ė§€\n" +"ė•ŠėŠĩ니다" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "ë¯¸í„°ë˛• ė‚ŦėšŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "ė°¨ëŸ‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "ë˛„ė „" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "ę°€ėƒ 토íŦ 블렌딩" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "ëš„ė „ ę°€ė¤‘ėš˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "화면 í‘œė‹œ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "ę˛Ŋęŗ " + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "비밀번호 똤ëĨ˜" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "똈" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{}ęą´ė˜ ė•ŒëĻŧ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{}ėŧ ė „" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{}ė‹œę°„ ė „" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{}ëļ„ ė „" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "ėŖŧ행 ë°ė´í„° 1년 ëŗ´ę´€" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "뗰뤑ëŦ´íœ´ LTE 뗰枰" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "ę˛Ŋęŗ : ė´ ė°¨ëŸ‰ė—ė„œ openpilotė˜ 륹ėģ¨ ė œė–´ëŠ” ė•ŒíŒŒ ë˛„ė „ė´ëŠ° ėžë™ 긴급 ė œë™(AEB)ė„ ëš„í™œė„ąí™”í•Šë‹ˆë‹¤.

    ė´" +#~ " ė°¨ëŸ‰ė—ė„œëŠ” openpilot 륹ėģ¨ ė œė–´ ëŒ€ė‹  ė°¨ëŸ‰ 내ėžĨ ACC가 ę¸°ëŗ¸ėœŧ로 ė‚ŦėšŠëŠë‹ˆë‹¤. openpilot 륹ėģ¨ ė œė–´ëĄœ ė „í™˜í•˜ë ¤ëŠ´ ė´ " +#~ "ė„¤ė •ė„ ėŧœė„¸ėš”. 륹ėģ¨ ė œė–´ ė•ŒíŒŒëĨŧ ėŧ¤ 때는 ė‹¤í—˜ ëĒ¨ë“œ ė‚ŦėšŠė„ ęļŒėžĨ합니다. ė°¨ëŸ‰ ė „ė›ė´ ėŧœė ¸ ėžˆëŠ” ę˛Ŋ뚰 ė´ ė„¤ė •ė„ ëŗ€ę˛Ŋ하면 " +#~ "openpilotė´ ėžŦė‹œėž‘ëŠë‹ˆë‹¤." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB(Android Debug Bridge)ëĨŧ ė‚ŦėšŠí•˜ëŠ´ USB 또는 ë„¤íŠ¸ė›ŒíŦ로 ėžĨėš˜ė— ė—°ę˛°í•  눘 ėžˆėŠĩ니다. ėžė„¸í•œ ë‚´ėšŠė€ " +#~ "https://docs.comma.ai/how-to/connect-to-comma ëĨŧ ė°¸ęŗ í•˜ė„¸ėš”." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "ėš´ė „ėž ëĒ¨ë‹ˆí„°ë§ í•­ėƒ ėŧœė§" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "openpilot 륹ėģ¨ ė œė–´ ė•ŒíŒŒ ë˛„ė „ė€ ė‹¤í—˜ ëĒ¨ë“œė™€ 함ęģ˜ ëš„ëĻ´ëĻŦ늤 ë¸Œëžœėš˜ė—ė„œ í…ŒėŠ¤íŠ¸í•  눘 ėžˆėŠĩ니다." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "konn3kt.comëĨŧ 홈 í™”ëŠ´ė— ėļ”ę°€í•˜ė—Ŧ ė•ąė˛˜ëŸŧ ė‚ŦėšŠí•˜ė„¸ėš”" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "ė•ˆė •ė  ëĒ¨ë“œ ėŧœė§" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "ė°¨ëŸ‰ ė „ė›ė´ ėŧœė ¸ ėžˆėœŧ늴 ė´ ė„¤ė •ė„ ëŗ€ę˛Ŋ할 때 openpilotė´ ėžŦė‹œėž‘ëŠë‹ˆë‹¤." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "\"add new device\"ëĨŧ 눌ëŸŦ 똤ëĨ¸ėĒŊė˜ QR ėŊ”드ëĨŧ 늤ėē”í•˜ė„¸ėš”" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "ęą°ëļ€í•˜ęŗ  openpilot ė œęą°" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "ė‹¤í—˜ ëĒ¨ë“œ ėŧœė§" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "openpilotė´ ėž‘ë™ ė¤‘ė´ ė•„ë‹ 때도 ėš´ė „ėž ëĒ¨ë‹ˆí„°ë§ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "openpilot ė‚ŦėšŠ" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "ė‹¤í—˜ ëĒ¨ë“œëĨŧ ė‚ŦėšŠí•˜ë ¤ëŠ´ openpilot 륹ėģ¨ ė œė–´(ė•ŒíŒŒ) í† ę¸€ė„ ėŧœė„¸ėš”." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "ė‹¤í—˜ ëĒ¨ë“œ" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "ė´ ė°¨ëŸ‰ė€ 륹ėģ¨ ė œė–´ė— ėˆœė • ACCëĨŧ ė‚ŦėšŠí•˜ë¯€ëĄœ 현ėžŦ ė‹¤í—˜ ëĒ¨ë“œëĨŧ ė‚ŦėšŠí•  눘 ė—†ėŠĩ니다." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "프ëŧėž„ 기ëŠĨ:" + +#~ msgid "Firehose" +#~ msgstr "íŒŒė´ė–´í˜¸ėŠ¤" + +#~ msgid "Firehose Mode" +#~ msgstr "íŒŒė´ė–´í˜¸ėŠ¤ ëĒ¨ë“œ" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "ėĩœëŒ€ė˜ 효ęŗŧëĨŧ ėœ„í•´ ėŖŧ 1회는 ėžĨėš˜ëĨŧ ė‹¤ë‚´ëĄœ 氀렏뙀 í’ˆė§ˆ ėĸ‹ė€ USB‑C ė–´ëŒ‘í„°ė™€ Wi‑Fi뗐 ė—°ę˛°í•˜ė„¸ėš”.\n" +#~ "\n" +#~ "í•ĢėŠ¤íŒŸė´ë‚˜ ëŦ´ė œí•œ SIM뗐 ė—°ę˛°ë˜ė–´ ėžˆë‹¤ëŠ´ ėŖŧ행 ė¤‘ė—ë„ íŒŒė´ė–´í˜¸ėŠ¤ ëĒ¨ë“œę°€ ë™ėž‘í•Šë‹ˆë‹¤.\n" +#~ "\n" +#~ "\n" +#~ "ėžėŖŧ ëŦģ는 마ëŦ¸\n" +#~ "\n" +#~ "ė–´ë–ģ枌, ė–´ë””ė„œ ėš´ė „í•˜ëŠ”ė§€ę°€ ė¤‘ėš”í•œę°€ėš”? ė•„ë‹ˆėš”. í‰ė†Œė˛˜ëŸŧ ėš´ė „í•˜ė„¸ėš”.\n" +#~ "\n" +#~ "íŒŒė´ė–´í˜¸ėŠ¤ ëĒ¨ë“œė—ė„œ ëĒ¨ë“  ęĩŦę°„ė„ ę°€ė ¸ę°€ė§€ë‚˜ėš”? ė•„ë‹ˆėš”. ėŧëļ€ ęĩŦ간만 ė„ íƒė ėœŧ로 ę°€ė ¸ę°‘ë‹ˆë‹¤.\n" +#~ "\n" +#~ "ėĸ‹ė€ USB‑C ė–´ëŒ‘í„°ëŠ” ëŦ´ė—‡ė¸ę°€ėš”? ëš ëĨ¸ 휴대폰 또는 노트ëļ ėļŠė „기늴 ėļŠëļ„핊니다.\n" +#~ "\n" +#~ "ė–´ë–¤ ė†Œí”„íŠ¸ė›¨ė–´ëĨŧ ė‹¤í–‰í•˜ëŠ”ė§€ę°€ ė¤‘ėš”í•œę°€ėš”? 똈. 학ėŠĩė—ëŠ” ė—…ėŠ¤íŠ¸ëĻŧ openpilot(및 ėŧëļ€ íŦíŦ)만 ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "íœ´ëŒ€í°ė—ė„œ https://konn3kt.com 뗐 ė ‘ė†í•˜ė„¸ėš”" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "ëš„í™œė„ą: 비ėĸ…ëŸ‰ė œ ë„¤íŠ¸ė›ŒíŦ뗐 ė—°ę˛°í•˜ė„¸ėš”" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "ėĄ°ė´ėŠ¤í‹ą 디버그 ëĒ¨ë“œ" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "학ėŠĩ ë°ė´í„° ė—…ëĄœë“œëĨŧ ėĩœëŒ€í™”하ė—Ŧ openpilotė˜ ėŖŧ행 ëĒ¨ë¸ė„ ę°œė„ í•˜ė„¸ėš”." + +#~ msgid "NO" +#~ msgstr "ė•„ë‹ˆė˜¤" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "SSH 키ëĨŧ ė°žė„ 눘 ė—†ėŠĩ니다" + +#, python-format +#~ msgid "Open" +#~ msgstr "뗴揰" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "ėžĨėš˜ëĨŧ Konn3kt(konn3kt.com)뙀 íŽ˜ė–´ë§í•˜ęŗ  comma 프ëŧėž„ í˜œíƒė„ 받ėœŧė„¸ėš”." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "konn3kt.comė—ė„œ Konn3kt íšŒė›ė´ ë˜ė„¸ėš”" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "ė›ę˛Š ėŠ¤ëƒ…ėƒˇ" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "openpilotė˜ ęˇœėš™, 기ëŠĨ 및 ė œí•œė„ 검토" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "í‘œė¤€ė„ ęļŒėžĨ합니다. ęŗĩę˛Šė  ëĒ¨ë“œė—ė„œëŠ” ė•žė°¨ëĨŧ 더 가깝게 따ëŧ氀溠 ę°€ę°ė†ė´ 더 ė ęˇšė ėž…ë‹ˆë‹¤. íŽ¸ė•ˆí•œ ëĒ¨ë“œė—ė„œëŠ” ė•žė°¨ė™€ ęą°ëĻŦëĨŧ 더 둡니다. " +#~ "맀뛐 ė°¨ëŸ‰ė—ė„œëŠ” ėŠ¤í‹°ė–´ë§ė˜ 밍氄 버íŠŧėœŧ로 ė´ ė„ąí–Ĩë“¤ė„ ė „í™˜í•  눘 ėžˆėŠĩ니다." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "ACC 및 밍넠 ėœ ė§€ ëŗ´ėĄ°ė— openpilotė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ė´ 기ëŠĨė„ ė‚ŦėšŠí•  때는 í•­ėƒ ėŖŧė˜ę°€ í•„ėš”í•Šë‹ˆë‹¤." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "ę˛Ŋęŗ : ė´ëŠ” GitHub ė„¤ė •ė˜ ëĒ¨ë“  ęŗĩ氜 í‚¤ė— SSH ė•Ąė„¸ėŠ¤ëĨŧ ëļ€ė—Ŧ합니다. ėžė‹ ė˜ ę˛ƒė´ ė•„ë‹Œ GitHub ė‚ŦėšŠėž ė´ëĻ„ė„ ė ˆëŒ€ ėž…ë Ĩí•˜ė§€ " +#~ "ë§ˆė„¸ėš”. comma ė§ė›ė´ ëŗ¸ė¸ė˜ GitHub ė‚ŦėšŠėž ė´ëĻ„ ėļ”ę°€ëĨŧ ėš”ęĩŦ하는 ėŧė€ 결ėŊ” ė—†ėŠĩ니다." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "openpilot뗐 ė˜¤ė‹  ę˛ƒė„ í™˜ė˜í•Šë‹ˆë‹¤" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "ė´ ė˜ĩė…˜ė„ ėŧœëŠ´ ę°€ė† 페ë‹Ŧė„ ë°Ÿė„ 때 openpilotė´ í•´ė œëŠë‹ˆë‹¤." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "openpilotė„ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė•Ŋ洀뗐 ë™ė˜í•´ė•ŧ 합니다." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "openpilotė„ ė‚ŦėšŠí•˜ë ¤ëŠ´ ė•Ŋ洀뗐 ë™ė˜í•´ė•ŧ 합니다. ęŗ„ė†í•˜ę¸° 렄뗐 https://comma.ai/terms ė—ė„œ ėĩœė‹  ė•Ŋę´€ė„ " +#~ "ėŊė–´ėŖŧė„¸ėš”." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "openpilot 륹ėģ¨ ė œė–´(ė•ŒíŒŒ)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot ė‚ŦėšŠ ëļˆę°€" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilotė€ ę¸°ëŗ¸ė ėœŧ로 ė•ˆė •ė  ëĒ¨ë“œëĄœ ėŖŧ행합니다. ė‹¤í—˜ ëĒ¨ë“œëĨŧ ė‚ŦėšŠí•˜ëŠ´ ė•ˆė •ė  ëĒ¨ë“œė— 땄링 ė¤€ëš„ë˜ė§€ ė•Šė€ ė•ŒíŒŒ ėˆ˜ė¤€ė˜ 기ëŠĨė´ " +#~ "í™œė„ąí™”ëŠë‹ˆë‹¤. ė‹¤í—˜ 기ëŠĨė€ ė•„ëž˜ė™€ 같ėŠĩ니다:

    ė—”ë“œíˆŦė—”ë“œ 륹ėģ¨ ė œė–´


    ėŖŧ행 ëĒ¨ë¸ė´ ę°€ė†ęŗŧ ė œë™ė„ ė œė–´í•Šë‹ˆë‹¤. " +#~ "openpilotė€ 빨간 ė‹ í˜¸ 및 ė •ė§€ í‘œė§€ė—ė„œė˜ ė •ė§€ëĨŧ íŦ함해 ė‚ŦëžŒė´ ėš´ė „í•œë‹¤ęŗ  판단하는 ë°Šė‹ėœŧ로 ėŖŧ행합니다. ėŖŧ행 ė†ë„ëŠ” ëĒ¨ë¸ė´ " +#~ "ę˛°ė •í•˜ë¯€ëĄœ 네렕 ė†ë„ëŠ” ėƒí•œėœŧ로만 ë™ėž‘í•Šë‹ˆë‹¤. ė•ŒíŒŒ í’ˆė§ˆ 기ëŠĨė´ë¯€ëĄœ ė˜¤ėž‘ë™ė´ ë°œėƒí•  눘 ėžˆėŠĩ니다.

    ėƒˆëĄœėš´ ėŖŧ행 " +#~ "ė‹œę°í™”


    ė €ė†ė—ė„œëŠ” 도로 ë°Ší–Ĩė˜ 광각 ėš´ëŠ”ëŧ로 ė „í™˜ë˜ė–´ ėŧëļ€ íšŒė „ė„ 더 ėž˜ ëŗ´ė—Ŧė¤ë‹ˆë‹¤. 화면 똤ëĨ¸ėĒŊ ėœ„ė—ëŠ” ė‹¤í—˜ ëĒ¨ë“œ ëĄœęŗ ë„" +#~ " í‘œė‹œëŠë‹ˆë‹¤." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "openpilotė€ ė§€ė†ė ėœŧ로 ëŗ´ė •ė„ ė§„í–‰í•˜ë¯€ëĄœ ėžŦė„¤ė •ė´ í•„ėš”í•œ ę˛Ŋėš°ëŠ” 드뭅니다. ė°¨ëŸ‰ ė „ė›ė´ ėŧœė ¸ ėžˆė„ 때 ëŗ´ė •ė„ ėžŦė„¤ė •í•˜ëŠ´ " +#~ "openpilotė´ ėžŦė‹œėž‘ëŠë‹ˆë‹¤." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilotė€ ë‹šė‹ ęŗŧ ę°™ė€ ė‚ŦëžŒė˜ ėš´ė „ė„ ëŗ´ëŠ° ėš´ė „ė„ 학ėŠĩ합니다.\n" +#~ "\n" +#~ "Firehose ëĒ¨ë“œëŠ” 학ėŠĩ ë°ė´í„° ė—…ëĄœë“œëĨŧ ėĩœëŒ€í™”하ė—Ŧ openpilotė˜ ėŖŧ행 ëĒ¨ë¸ė„ ę°œė„ í•  눘 ėžˆę˛Œ í•´ė¤ë‹ˆë‹¤. ë°ė´í„°ę°€ ë§Žė„ėˆ˜ëĄ ëĒ¨ë¸ė€ ėģ¤ė§€ęŗ , ė‹¤í—˜ ëĒ¨ë“œëŠ” 더 ėĸ‹ė•„ė§‘ë‹ˆë‹¤." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "openpilot 륹ėģ¨ ė œė–´ëŠ” í–Ĩ후 ė—…ë°ė´íŠ¸ė—ė„œ 렜ęŗĩ될 눘 ėžˆėŠĩ니다." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "openpilotė€ ėžĨėš˜ëĨŧ ėĸŒėš° 4°, ėœ„ėĒŊ 5°, ė•„ëž˜ėĒŊ 9° ė´ë‚´ëĄœ ėžĨė°Ší•´ė•ŧ 합니다." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "현ėžŦęšŒė§€ ęˇ€í•˜ė˜ ėŖŧ행 {}ęĩŦę°„ė´ 학ėŠĩ ë°ė´í„°ė…‹ė— íŦí•¨ë˜ė—ˆėŠĩ니다." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ ęĩŦ독됨" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ íŒŒė´ė–´í˜¸ėŠ¤ ëĒ¨ë“œ đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_pl.mo b/iqpilot/selfdrive/ui/translations/app_pl.mo new file mode 100644 index 000000000..2b7616f89 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_pl.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_pl.po b/iqpilot/selfdrive/ui/translations/app_pl.po new file mode 100644 index 000000000..db4bd1bc1 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_pl.po @@ -0,0 +1,4384 @@ +# Polish translations for PACKAGE package. +# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2026. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2026-08-09 16:59-0500\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (domyślnie)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " Kalibracja odpowiedzi momentu kierowniczego zakończona." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " Kalibracja odpowiedzi momentu kierowniczego ukończona w {}%." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " Urządzenie jest skierowane {:.1f}° {} i {:.1f}° {}." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    Kalibracja opÃŗÅēnienia układu kierowniczego zakończona." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    Kalibracja opÃŗÅēnienia układu kierowniczego ukończona w {}%." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "AKTYWNY" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"ADB (Android Debug Bridge) umoÅŧliwia połączenie z urządzeniem przez USB lub " +"przez sieć." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "DODAJ" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "OD POCZĄTKU" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "Ustawienie APN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "LOGOWANIE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "AUTO" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "pasek przyspieszenia" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "Miernik przyspieszenia" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "PotwierdÅē nadmierne sterowanie" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "Aktywuj" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "Aktywny model" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "Aktywne tylko powyÅŧej {}." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "Dodaj profil" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "Dodaj profil eSIM" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "Dostosuj prędkość dla intencji skrętu" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "Zaawansowane" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"Następnie musisz korzystać z własnego profilu eSIM.\n" +"\n" +"Nie będzie moÅŧna ponownie uÅŧyć Comma Prime, chyba Åŧe kupisz nową kartę SIM od comma." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "Agresywny" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "Akceptuję" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "Wszystko" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "Wszystkie stany (~6,0 GB)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"Pozwala IQ.Pilot uÅŧywać zachowania wznowienia ACC MQB w obsługiwanych " +"pojazdach Volkswagen MQB z FtS z przedłuÅŧonym przytrzymaniem bez " +"automatycznego wznowienia." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"Pozwala, aby sterowanie boczne (kierowanie) pozostało aktywne nawet wtedy, " +"gdy sterowanie wzdłuÅŧne (gaz/hamulec) jest chwilowo niedostępne z powodu " +"usterki tempomatu." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "Stałe wspomaganie kierowania (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "I wiele więcej" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "Stosowane natychmiast." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "" +"Zostanie zastosowane, gdy urządzenie następnym razem przejdzie w tryb " +"postoju." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "Czy na pewno chcesz wyłączyć urządzenie?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "Czy na pewno chcesz uruchomić ponownie?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"Czy na pewno chcesz przywrÃŗcić wszystkie ustawienia IQ.Pilot do wartości " +"domyślnych? Po zresetowaniu ustawień nie ma odwrotu." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "Czy na pewno chcesz zresetować kalibrację?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "Czy na pewno chcesz odinstalować?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "Auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "automatyczna zmiana pasa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "Automatyczna zmiana pasa: zmiany ciągłe" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "Auto — przyciemnione" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "Automatyczne zamykanie ustawień" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"Automatycznie rusza po zatrzymaniu podczas jazdy w ruchu, na platformach " +"Subaru objętych implementacją beta." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "Dostępność przy zmianach tempomatu" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "Wstecz" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "Alerty martwego pola" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "ostrzeÅŧenia o martwym polu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "WskaÅēniki kierunkowskazÃŗw" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "Zmiana pasa inicjowana kierunkowskazem" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "Stan po uruchomieniu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "Reakcja na hamowanie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"Przywraca szeroki pasek stanu postoju z klasycznego interfejsu: temperatura," +" pojazd i stan Konn3kt na pierwszy rzut oka." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "ZMIEŃ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "SPRAWDÅš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "WYCZYŚĆ" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "POŁĄCZ" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "ŁĄCZENIE..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "Anuluj" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "Anuluj nawigację" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "Sieć komÃŗrkowa z limitem" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "Zmień język" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" +"Zmiana tego ustawienia spowoduje ponowne uruchomienie IQ.Pilot, jeśli " +"samochÃŗd jest włączony." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "Sprawdzono {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "Wybierz model" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"Wybierz zachowanie wzdłuÅŧne: IQ.Pilot (sterowanie wzdłuÅŧne IQ + end-to-end)," +" IQ.Dynamic (sterowanie wzdłuÅŧne IQ + tryb dynamiczny), IQ.Chill " +"(sterowanie wzdłuÅŧne IQ + profil spokojny) lub fabryczny ACC." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "Wybrano ręcznie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "Wyczyść pamięć" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "Wyczyścić pamięć wybranego modelu i pobrać go ponownie?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "Zamknij" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"Zamyka pętlę sterowania kierownicą w pojazdach MEB i MQB Evo. IQ.Pilot " +"koryguje polecenie skrętu względem krzywizny, ktÃŗrą samochÃŗd faktycznie " +"utrzymuje, zamiast wysyłać zaplanowaną krzywiznę wprost." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "Chmura" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "Tylko chmura" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "Wideo w chmurze niedostępne" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "Legenda kolorÃŗw stanu identyfikacji:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "Model połączony" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"Wykonuje zaprogramowaną sekwencję zmian przyspieszenia, aby zmierzyć " +"odpowiedÅē układu wzdłuÅŧnego. Wymaga sterowania wzdłuÅŧnego IQ.Pilot. UÅŧywaj " +"wyłącznie na pustej, zamkniętej drodze." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"Wykonuje zaprogramowaną sekwencję zmian przyspieszenia bocznego, aby " +"zmierzyć odpowiedÅē układu kierowniczego. UÅŧywaj wyłącznie na prostej, " +"płaskiej i pustej drodze." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "PotwierdÅē" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "Kontynuuj" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "zmiany ciągłe" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "Sterowanie" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"Steruje zachowaniem IQ.Pilot wobec ograniczeń prędkości. Wył. wyłącza " +"funkcje ograniczeń prędkości, Info tylko wyświetla ograniczenia, OstrzeÅŧenie" +" podświetla przekroczenie prędkości, a Sterowanie dostosowuje zadaną " +"prędkość do wykrytych ograniczeń." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "Nie udało się pobrać kluczy SSH - sprawdÅē logi" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "Nie udało się zlokalizować tego miejsca" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "Nie udało się połączyć z GitHub - sprawdÅē połączenie" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "Nie udało się zweryfikować GitHub - sprawdÅē czas urządzenia" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "Kraj" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "Dziennik awarii" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "Ruszanie z postoju (Beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "Ruszanie z postoju — ręczny hamulec postojowy (Beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "Tempomat" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "BieÅŧąca wersja" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "Regulator krzywizny" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "USUŃ" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "ROZŁĄCZANIE..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "POBIERZ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "Odrzuć" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "Odrzuć, odinstaluj IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "Domyślna" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "Domyślny (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "Domyślnie: uruchamia się gotowy do jazdy, aktywacja dostępna od razu." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"OpÃŗÅēnienie, po ktÃŗrym zmiana pasa wywołana kierunkowskazem rozpocznie się " +"samoczynnie — po ustawieniu opÃŗÅēnienia poruszenie kierownicą nie jest " +"wymagane (domyślnie: Poruszenie).
    UÅŧywaj do tego kierunkowskazu tylko " +"wtedy, gdy ruch i droga rzeczywiście pozwalają na ten manewr." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "opÃŗÅēnienie przy martwym polu" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "Usuń" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "Usunąć wyłączony profil „{}”?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "Usunąć ten dziennik?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "Cel ustawiony" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "Wykryto automatycznie" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "Deweloper" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "Urządzenie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "Urządzenie musi być zarejestrowane w Konn3kt, aby je sparować." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "OpÃŗÅēnienie przyciemnienia" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "Rozłącz" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "Rozłącz" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "Rozłącz przed wymuszeniem trybu postoju" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "Rozłącz przed wymuszeniem trybu jazdy" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "Rozłączanie pedałem gazu" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "Rozłącz, aby wyłączyć" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "Rozłącz, aby uruchomić ponownie" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "Rozłącz, aby zresetować kalibrację" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "rozłącz, aby {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "Rozłącz: hamowanie całkowicie wyłącza wspomaganie kierowania." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "Ekran" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "Jasność ekranu" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "Wyświetlaj prędkość w km/h zamiast mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "Odległość" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "Czy chcesz przesyłać dane z kamery kierowcy?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "Gotowe" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "Dongle ID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "Pobierz" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "Pobieranie nie powiodło się — sprÃŗbuj ponownie." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "Pobieranie kafelkÃŗw mapy" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"Rysuje pasek przy lewej krawędzi pokazujący zmierzone przyspieszenie i " +"hamowanie — to, co samochÃŗd faktycznie robi w danej chwili, a nie to, o co " +"prosi planer." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"Rysuje mapę na ekranie z kafelkÃŗw zapisanych na urządzeniu. W połączeniu z " +"trybem online zapisane kafelki przejmują pracę w chwili utraty łączności. " +"Kafelki są pobierane dla wybranego regionu." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "Kamera kierowcy" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "Sprawdzenie kamery kierowcy" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "Obsługa interwencji kierowcy" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "Przejazdy" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "Jasność podczas jazdy" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "Profil jazdy" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "Dynamiczny" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "Strojenie dynamiczne: Åŧywsza reakcja gazu i hamulca." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "EDYTUJ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "BŁĄD" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "Włącz" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "Włącz ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Włącz Always on Lateral (AOL). Wyłącz ten przełącznik, aby wrÃŗcić do " +"standardowego zachowania włączania kierowania w IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "Włącz wideorejestrator" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "Włącz ostrzeÅŧenia o zjechaniu z pasa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"Włącza obsługę blokady kierowania MQB w pojazdach Volkswagen MQB z usterkami" +" LKAS przy niskiej prędkości." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "Włącz roaming" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "Włącz SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "Włącz tethering" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "" +"Włącz monitorowanie kierowcy nawet wtedy, gdy IQ.Pilot nie jest aktywny." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "WprowadÅē APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "WprowadÅē kod aktywacyjny" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "WprowadÅē kod" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "WprowadÅē SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "WprowadÅē adres lub miejsce" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "WprowadÅē nowe hasło tetheringu" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "WprowadÅē hasło" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "WprowadÅē swoją nazwę uÅŧytkownika GitHub" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "Błąd" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "WyjdÅē z trybu postoju" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Rozszerzony pasek stanu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "eksperymentalny MPC pojazdu z przodu" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"Udostępnia kopię ostatnich nagrań wideorejestratora i logÃŗw jako dysk USB po" +" podłączeniu do komputera. IQ.Pilot działa dalej, gdy ta opcja jest " +"włączona." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "ZAPOMINANIE..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"Obecnie wymuszone jest fabryczne sterowanie wzdłuÅŧne Toyoty. Wybierz tryb " +"wzdłuÅŧny IQ, aby je wyłączyć." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "Fabryczne ustawienia sterowania wzdłuÅŧnego." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "ulubione" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "Pobieranie mapy" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "Pobieranie map..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "Ostatnie ostrzeÅŧenie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "ZnajdÅē swÃŗj pojazd" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "Zakończ konfigurację" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"Wyświetla boczne ostrzeÅŧenie, gdy samochÃŗd zgłosi obiekt w martwym polu " +"(tylko samochody z systemem BSM)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" +"Włącz tryb Zawsze PostÃŗj w panelu Urządzenie lub wyłącz samochÃŗd, aby to " +"zmienić." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "odstęp od poprzedzającego" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "Postępuj zgodnie z instrukcjami w aplikacji, aby zakończyć parowanie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"Wymusić tryb jazdy IQ.Pilot na 10 minut? Tryb Zawsze PostÃŗj zostanie " +"włączony automatycznie, a urządzenie wrÃŗci do trybu postoju po upływie " +"czasu." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Wymuś interfejs Mici" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "Wymuś tryb jazdy (10 min)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "Wymuszenie trybu jazdy moÅŧna uruchomić tylko w trybie postoju" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "" +"Wymuszony tryb jazdy jest juÅŧ aktywny. Zresetować licznik do 10 minut?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "Wymuszony tryb jazdy aktywny" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Zapomnij" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "Zapomnieć sieć Wi-Fi „{}”?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "DOBRA" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Uwierzytelnianie Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Token / hasło Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Nazwa uÅŧytkownika Git" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "Błąd GitHub ({}) podczas pobierania kluczy" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "WYSOKA" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "Sieć ukryta" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "Wstrzymaj zmianę pasa przy martwym polu" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "Trzymaj nieruchomo..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"Wstrzymuje automatyczną zmianę pasa, dopÃŗki monitorowanie martwego pola " +"zgłasza pojazd na docelowym pasie, i zwalnia ją, gdy pas jest wolny." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Dom" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "Godziny" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"Jak długo ekran ustawień moÅŧe pozostać nietknięty, zanim sam się zamknie." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"Ile czasu wyprzedzenia dodać do własnego opÃŗÅēnienia przekładni kierowniczej," +" gdy samostrojenie jest wyłączone. Domyślnie 0,2 s." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "ZAINSTALUJ" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "Adres IP" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "wymuszone zatrzymania IQ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "tryb IQ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"Tryby wzdłuÅŧne IQ są niedostępne dla tego pojazdu. Fabryczny ACC to jedyna " +"dostępna opcja." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamiczny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic zakręty" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic prędkość poprzedzającego" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic niska prędkość" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic zatrzymania modelu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic zapas SLC" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic wolniejszy poprzedzający" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic zatrzymany poprzedzający" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "Wersja IQ.OS" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot niedostępny" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"IQ.Pilot kalibruje się w sposÃŗb ciągły, reset jest rzadko potrzebny. " +"Zresetowanie kalibracji spowoduje ponowne uruchomienie IQ.Pilot, jeśli " +"samochÃŗd jest włączony." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"IQ.Pilot wymaga zamontowania urządzenia w zakresie 4° w lewo lub w prawo " +"oraz 5° w gÃŗrę lub 9° w dÃŗÅ‚." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"Jeśli jedziesz z prędkością 20 mph (32 km/h) lub niÅŧszą i masz włączony " +"kierunkowskaz, samochÃŗd zaplanuje skręt w tym kierunku na najbliÅŧszej " +"przejezdnej trasie. Zapobiega to sytuacjom (np. na czerwonym świetle), w " +"ktÃŗrych samochÃŗd mÃŗgłby zaplanować skręt w złym kierunku." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "Info" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" +"WÅ‚ÃŗÅŧ oryginalną kartę SIM comma dołączoną do urządzenia, aby korzystać z " +"eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "Zainstaluj aktualizację" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "Nieprawidłowy kod QR" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "KM" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "BŁĄD KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT OFFLINE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "Utrzymuj urządzenie w trybie postoju" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "Zachowaj fabryczny gaz i hamulec" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"Pozostawia gaz i hamulce fabrycznemu systemowi Toyoty; IQ.Pilot tylko " +"kieruje." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Funkcje Konn3kt:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Status Konn3kt:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "LIMIT" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "ŁADOWANIE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "ŁADOWANIE..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "Opcje zmiany pasa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "Sterowanie boczne przy usterce tempomatu" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "Tryb manewrÃŗw bocznych" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "Odczyty poprzedzającego pojazdu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "Opuścić tryb Zawsze PostÃŗj teraz?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "Opuścić wymuszony tryb postoju teraz?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"PozwÃŗl IQ.Pilot mierzyć czas reakcji układu kierowniczego i utrzymywać tę " +"wartość na bieÅŧąco. Wyłącz, aby samodzielnie ustalić tę wartość." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" +"Pozwala poruszyć kierownicą przy aktywnym systemie bez całkowitego " +"rozłączenia kierowania." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "Transmisja na Åŧywo" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "Ładowanie %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "Ładowanie wideo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "Ładowanie..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "Lokalizowanie..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "" +"Zablokowane w pozycji WYŁ. na tej platformie; pojazd nie obsługuje innych " +"opcji." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "Sterowanie wzdłuÅŧne" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"Tryby sterowania wzdłuÅŧnego:
    Funkcje IQ.Pilot wymieniono " +"poniÅŧej:

    Sterowanie wzdłuÅŧne IQ.Pilot End-to-End


    PozwÃŗl " +"modelowi jazdy sterować gazem i hamulcami. IQ.Pilot będzie prowadził tak, " +"jak jego zdaniem zrobiłby to człowiek, w tym zatrzymywał się na czerwonych " +"światłach i znakach stop. PoniewaÅŧ to model jazdy decyduje o prędkości, " +"prędkość zadana działa jedynie jako gÃŗrny limit. Ta funkcja jest wciąÅŧ " +"rozwijana; naleÅŧy spodziewać się " +"błędÃŗw.

    IQ.Dynamic


    Dynamicznie łączy zachowanie aktywnego " +"tempomatu z zachowaniem end-to-end w zaleÅŧności od sytuacji i " +"otoczenia.

    IQ.Chill


    UÅŧywa standardowego tempomatu " +"reagującego na ruch do sterowania wzdłuÅŧnego.

    Nowa wizualizacja " +"jazdy


    Wizualizacja jazdy będzie przełączać się na szerokokątną " +"kamerę drogową przy niskich prędkościach, aby lepiej pokazać niektÃŗre " +"zakręty. W prawym gÃŗrnym rogu pojawi się rÃŗwnieÅŧ logo IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "Tryb manewrÃŗw wzdłuÅŧnych" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "Profil strojenia wzdłuÅŧnego" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "wyprzedzenie w gÃŗrę" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "wyprzedzenie w dÃŗÅ‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "Planowanie skrętu przy niskiej prędkości" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"Filtruje dolnoprzepustowo zaplanowaną krzywiznę, zanim trafi do " +"przekładni, w pojazdach MEB i MQB Evo, co tłumi boczne kołysanie. " +"Domyślnie włączone w tych autach." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "RĘCZNY" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "MAKS" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "Wznowienie ACC MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "wznowienie ACC MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "Blokada kierowania MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "blokada kierowania MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "Konserwacja" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "Ręczna korekta opÃŗÅēnienia" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "Baza map" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "Zmierzone:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "Mile" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "Odwzorowuje kierunkowskazy samochodu jako strzałki na ekranie jazdy." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "czas zatrzymania modelu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "Modele" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "Nd." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "BRAK PANDY" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "BRAK" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "Nawigacja" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "Nawigacja anulowana" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "Blisko" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "Sieć" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "sieć neuronowa FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "SprzęÅŧenie wyprzedzające sieci neuronowej (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "Nigdy nie usypiaj" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "Nie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "Bez poruszenia" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "Nie wykryto kodu QR" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "Nie znaleziono kluczy SSH dla uÅŧytkownika „{}”" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "Nie znaleziono sieci Wi-Fi" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "" +"Nie wykryto kamery w trybie deweloperskim. Naciśnij sprawdÅē, aby " +"kontynuować." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "Brak informacji o wydaniu." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "Brak wynikÃŗw" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "Brak zapisanych tras" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "Nie ustawiono pojazdu" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "Brak wideo z tej kamery" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"Zwykle jeden manewr kończy zmianę pasa, nawet przy włączonym " +"kierunkowskazie. Włącz tę opcję, aby łączyć kolejne zmiany, dopÃŗki " +"kierunkowskaz pozostaje włączony — kaÅŧda następna nadal wymaga poruszenia " +"kierownicą." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "Niedostępne na tej platformie Subaru." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "Brak połączenia" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "Nie ustawiono" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"Uwaga: w samochodach bez przycisku LFA/LKAS wyłączenie tej opcji " +"uniemoÅŧliwia uzbrojenie wspomagania kierowania przy zmianach dostępności " +"tempomatu." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "Poruszenie" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "OFFLINE" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "ONLINE" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "Wył." + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "Mapy na ekranie offline" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "PostÃŗj" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "Czas do wyłączenia w trybie postoju" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "" +"PostÃŗj: po kaÅŧdym uruchomieniu lub wybudzeniu trafia w tryb Zawsze PostÃŗj." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "Korekta:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "Na urządzeniu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "Mapy na ekranie online" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "Deweloperski interfejs podczas jazdy" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "OtwÃŗrz aplikację Konn3kt na telefonie" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "Nazwa (opcjonalnie)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"Wyświetla podczas jazdy pasek z bieÅŧącymi danymi sterowania (kierowanie, " +"przyspieszenie boczne, dane o poprzedzającym pojeÅēdzie)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "SPARUJ" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "OSTATNI TYDZIEŃ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "Tryb PQ HCA Status 7" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "tryb PQ HCA status 7" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "PODGLĄD" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "Sparuj urządzenie" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "Sparuj urządzenie" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "Sparuj urządzenie" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Sparuj urządzenie w aplikacji Konn3kt" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Sparuj urządzenie w aplikacji Konn3kt." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "Sparuj urządzenie ze swoim kontem Konn3kt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "Wstrzymaj aktualizacje" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "Wyszukaj" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" +"Wybierz, jak wspomaganie kierowania reaguje, gdy kierowca hamuje w IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "" +"Wybierz, co naciśnięcie pedału hamulca robi ze wspomaganiem kierowania." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"Wybierz, czy gotowa aktualizacja ma tylko czekać na Twoją zgodę, czy " +"pobierać się i instalować samodzielnie." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "Wybierz swÃŗj pojazd" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "Przypnij pojazd, aby pominąć automatyczne wykrywanie." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"Przypina odczyty na Åŧywo (odstęp, prędkość, czas do poprzedzającego pojazdu)" +" do znacznika samochodu z przodu. Wymaga, aby to IQ.Pilot sterował gazem i " +"hamulcem." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "Połącz się z Wi-Fi, aby zakończyć wstępne parowanie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "Połącz się z Wi-Fi, aby zakończyć wstępne parowanie." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "Połącz się z Wi-Fi, aby pobrać swÃŗj klucz." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "Połącz się z Wi-Fi, aby zaktualizować." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "Skieruj kamerę kierowcy na kod QR eSIM operatora (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "Wagi polityki" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "Wyłącz" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"Wyłącza urządzenie po tym czasie postoju z wyłączonym silnikiem.\n" +"(domyślnie 30 h)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "Predykcyjny" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "Strojenie predykcyjne: przewiduje i wygładza zmiany przyspieszenia." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "Pobieranie + wstępna instalacja" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "Tylko pobieranie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "Przygotowywanie kafelkÃŗw mapy..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "Blokuj duÅŧe transfery danych przy połączeniu Wi-Fi z limitem" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "Blokuj duÅŧe transfery danych przy połączeniu komÃŗrkowym z limitem" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"Wyświetl podgląd kamery skierowanej na kierowcę, aby upewnić się, Åŧe " +"monitorowanie kierowcy ma dobrą widoczność. (pojazd musi być wyłączony)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "Działania na profilu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"Pobiera na bieÅŧąco kafelki Mapbox do mapy na ekranie, gdy urządzenie ma " +"internet." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "Wyczyść pamięć modeli" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"Przełącz urządzenie w tryb Zawsze PostÃŗj lub wyłącz samochÃŗd, zanim zmienisz" +" sposÃŗb instalowania aktualizacji." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"Przełącz urządzenie w tryb Zawsze PostÃŗj lub wyłącz samochÃŗd, zanim to " +"zmienisz." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "Błąd kodu QR" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "Kod QR zaakceptowany" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "GOTOWY" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "POBIERZ PONOWNIE" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "ODŚWIEÅģ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "USUŃ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "USUWANIE..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "RESETUJ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "PRZEJRZYJ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "Przekładnia:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"Zamontuj ponownie, jeśli twarz jest zasłonięta lub monitorowanie kierowcy ma" +" trudności ze śledzeniem twarzy." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "" +"Dostępne tylko przy wyłączonym samochodzie lub włączonym trybie Zawsze " +"PostÃŗj." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "Uruchom ponownie" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "Uruchom ponownie urządzenie" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "Uruchom ponownie i zaktualizuj" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"Otrzymuj ostrzeÅŧenia o powrocie na pas ruchu, gdy pojazd przekroczy wykrytą " +"linię pasa bez włączonego kierunkowskazu przy prędkości powyÅŧej 31 mph (50 " +"km/h)." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "Nagrywaj i przesyłaj obraz z kamery kierowcy" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "Nagrywaj i przesyłaj dÅēwięk z mikrofonu" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"Nagrywaj i zapisuj dÅēwięk z mikrofonu podczas jazdy. DÅēwięk zostanie " +"dołączony do nagrania wideorejestratora w Konn3kt." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"Nagrywaj i przesyłaj dane jazdy oraz wideo. Wyłączenie zatrzymuje całe " +"nagrywanie! Bez logÃŗw, bez wideo, bez dÅēwięku." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "Pobierz ponownie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "Pobierz ponownie bieÅŧący model" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "OdświeÅŧ profile" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "Informacje prawne" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "Spokojny" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "OdświeÅŧ listę modeli" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "" +"Pozostań aktywny: hamowanie nigdy nie przerywa wspomagania kierowania." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "Zdalny dostęp" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "Usuń" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Usuń pSIM comma" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "Zmień nazwę" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "Zmień nazwę profilu" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "Przekroczono limit czasu Åŧądania" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "Wymaga włączonego sterowania wzdłuÅŧnego IQ.Pilot (Alfa)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "Resetuj" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "Zresetuj kalibrację" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "PrzywrÃŗÄ‡ domyślne" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "Przejrzyj przewodnik szkoleniowy" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "Zapoznaj się z zasadami, funkcjami i ograniczeniami IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "nazwa drogi" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "Nazwa drogi na ekranie" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "Trasy" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "Wersja silnika wyznaczania tras" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "Uruchom kompaktowy interfejs comma 4 (mici) na tym urządzeniu" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "WYBIERZ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC auto potwierdzanie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC potwierdÅē wyÅŧsze" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC potwierdÅē niÅŧsze" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC zapas IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC uzupełnianie online" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC nadpisanie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC zasady" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "Klucze SSH" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "klucze SSH" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "FABRYCZNY ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "Skanuj" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "Skanuj QR" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "Zeskanuj kod QR lub wprowadÅē kod aktywacyjny" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "Skanowanie sieci Wi-Fi..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "Szukaj" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "Szukaj adresu lub miejsca" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "Szukaj marki lub modelu" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "Wyszukiwanie..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "Wybierz" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "Wybierz gałąÅē" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "Wybierz język" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "Samostrojenie opÃŗÅēnienia kierowania" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "Numer seryjny" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "Ustaw dom" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "Ustaw jednostki wg lokalizacji" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "Ustaw pracę" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "Ustaw adres domu" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"Ustaw jednostki na podstawie lokalizacji urządzenia. Prędkości przełączają " +"się na km/h wszędzie poza Stanami Zjednoczonymi, Wielką Brytanią i Liberią, " +"i są sprawdzane ponownie po przekroczeniu granicy." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "Ustaw adres pracy" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"Ustawia prÃŗg prędkości uÅŧywany przez intencje skrętu. PoniÅŧej tej wartości " +"intencje skrętu mogą planować najbliÅŧszą przejezdną trasę skrętu. Domyślnie " +"19 mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"Określa, w jakim stanie urządzenie ląduje po uruchomieniu lub wybudzeniu ze " +"snu." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "Ustawienia" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"Pokazuje nazwę bieÅŧącej drogi na widoku jazdy.
    Wymaga zainstalowanych map" +" offline dla Twojego regionu." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "Płynne kierowanie" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "OdÅ‚ÃŗÅŧ aktualizację" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "Oprogramowanie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "Prędkość" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "Ograniczenie prędkości" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "Sterowanie ograniczeniem prędkości" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "Standardowy" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"Zalecany jest tryb Standardowy. W trybie Agresywnym IQ.Pilot jedzie bliÅŧej " +"poprzedzających pojazdÃŗw i mocniej operuje gazem oraz hamulcem. W trybie " +"Spokojnym IQ.Pilot utrzymuje większy dystans od poprzedzających pojazdÃŗw. W " +"obsługiwanych samochodach moÅŧesz przełączać te profile przyciskiem " +"odległości na kierownicy." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "Czuwanie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"Czuwanie: hamowanie wstrzymuje wspomaganie kierowania; wraca ono po zdjęciu " +"nogi z pedału." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "Rozpocznij pobieranie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" +"Uruchom pojazd, aby sprawdzić zgodność zachowania wspomagania kierowania." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "Stan" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "Statystyki" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "Status" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Pozostań aktywny" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "Kierowanie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "Zachowanie wspomagania kierowania" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Łuk siły kierowania" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "Fabryczny ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "Zatrzymaj pobieranie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Wariant stop-and-go dla samochodÃŗw Subaru Global z ręcznym hamulcem " +"postojowym. Pozostaw wyłączone w samochodach z elektrycznym hamulcem " +"postojowym. Podziękowania dla martinl za tę implementację!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "Zapisane mapy" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "Przesyłanie strumieniowe z chmury" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "Przełączyć urządzenie w tryb Zawsze PostÃŗj?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "Przełączyć urządzenie w wymuszony tryb postoju?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "System" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "System nie odpowiada" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "NATYCHMIAST PRZEJMIJ KONTROLĘ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "TEMP" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "TEMP WYSOKA" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "TEMP OK" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "Naciśnij „Add Device” i zeskanuj kod QR po prawej" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "GałąÅē docelowa" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "Hasło tetheringu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"Wybrany model uległ zmianie. Zalecamy zresetowanie kalibracji. Czy chcesz to" +" zrobić teraz?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "" +"Po uruchomieniu nie da się tego cofnąć — ostatnia szansa na rezygnację." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "Ta zmiana wymaga ponownego uruchomienia. Uruchomić teraz?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "Ta platforma jest ograniczona do trybu Rozłącz." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "" +"Ta platforma obsługuje ograniczony zestaw opcji zachowania wspomagania " +"kierowania." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" +"Ta platforma obsługuje pełną konfigurację zachowania wspomagania kierowania." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"Spowoduje to usunięcie WSZYSTKICH pobranych map\n" +"\n" +"Czy na pewno chcesz usunąć wszystkie mapy?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"Spowoduje to usunięcie z pamięci WSZYSTKICH pobranych modeli poza aktualnie " +"aktywnym. Czy na pewno?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "Spowoduje to trwałe usunięcie profilu pSIM comma z karty SIM." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "Rozpocznie to proces pobierania, ktÃŗry moÅŧe chwilę potrwać." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "Czas" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "Przełączniki" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "Razem:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"Rysuje łuk na widoku drogi pokazujący, jak mocno IQ.Pilot skręca kierownicą " +"podczas sterowania bocznego." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "Przewodnik szkoleniowy" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "kierunkowskazy" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"Całkowicie wyłącza sprawdzanie aktualizacji przez sieć.
    Uruchom " +"ponownie, aby zastosować zmianę." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "Wpisz rok, a następnie model — na przykład 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "Wpisz, aby wyszukać" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "NIEDOSTĘPNE" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "ODINSTALUJ" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "AKTUALIZACJA" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "Pamięć USB" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "UÅģYJ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "Nie moÅŧna załadować wideo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "Niedostępne, gdy samochÃŗd jest w trybie jazdy." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "" +"Niedostępne — sterowanie wzdłuÅŧne IQ.Pilot nie jest aktywne w tym " +"samochodzie." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "Niewykryty i nieustawiony" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "Odinstaluj" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "Nieznany" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "Nieznany operator" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "Nieograniczone przechowywanie tras" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "Tryb instalacji aktualizacji" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "Aktualizacje są pobierane tylko wtedy, gdy samochÃŗd jest wyłączony." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "Przesyłanie podczas jazdy" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"Przesyłaj dane z kamery skierowanej na kierowcę i pomÃŗÅŧ ulepszyć algorytm " +"monitorowania kierowcy." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "Przesłane" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "Przesyłanie" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"UÅŧywa HCA Status 7 zamiast Status 5 do sterowania kierowaniem w pojazdach " +"platformy PQ. MoÅŧe to poprawić zgodność w niektÃŗrych starszych modelach " +"Volkswagena." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "UÅŧywaj systemu metrycznego" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"UÅŧyj kodu aktywacyjnego:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"UÅŧywaj systemu IQ.Pilot do aktywnego tempomatu i asystenta utrzymania pasa " +"ruchu. Korzystanie z tej funkcji wymaga nieustannej uwagi kierowcy." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "POJAZD" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "POKAÅģ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (wirtualne mieszanie momentu)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "Pojazd" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"Nie wykryto jeszcze moÅŧliwości sterowania wzdłuÅŧnego w tym pojeÅēdzie. " +"Uruchom samochÃŗd raz, aby wykryć wsparcie." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Odtwarzacz wideo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "Wyświetl dziennik błędÃŗw awarii IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "Wagi wizji" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "Wygląd" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "Oczekiwanie na sygnał GPS..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"Oczekiwanie na kamerę kierowcy. UÅŧyj kodu QR eSIM operatora lub wprowadÅē kod" +" LPA ręcznie." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "Oczekiwanie na start" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "OstrzeÅŧenie" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"OstrzeÅŧenie: To przyznaje dostęp SSH wszystkim kluczom publicznym z Twoich " +"ustawień GitHub. Nigdy nie wpisuj nazwy uÅŧytkownika GitHub innej niÅŧ własna." +" Pracownik IQ.Pilot NIGDY nie poprosi Cię o dodanie swojej nazwy uÅŧytkownika" +" GitHub." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"OstrzeÅŧenie: kierownica moÅŧe oscylować na zakrętach poniÅŧej {}; wyłącz tę " +"opcję, jeśli to odczuwasz." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "Witamy w IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "Gdy włączone, naciśnięcie pedału gazu rozłączy IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi-Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Sieć Wi-Fi z limitem" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "Praca" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "Nieprawidłowe hasło" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "Tak" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "Tak, usuń wszystkie mapy" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "" +"Aby korzystać z IQ.Pilot, musisz zaakceptować Warunki korzystania z usługi." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"Aby korzystać z IQ.Pilot, musisz zaakceptować Warunki korzystania z usługi. " +"Przed kontynuowaniem zapoznaj się z najnowszymi warunkami na " +"https://iqlvbs.com/tos." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"Po tym musisz uÅŧywać własnego profilu eSIM. Nie będzie moÅŧna ponownie uÅŧyć " +"Comma Prime, chyba Åŧe kupisz nową kartę SIM od comma." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "aktywuj" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "aktywny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "aktywny model" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "dodaj profil eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "dodaj profil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "agresywny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "ustawienia APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "auto ciemny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"automatyczne\n" +"aktualizacje" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "wstecz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "gałąÅē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "opÃŗÅēnienie przyciemnienia" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "obliczanie przebiegu..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "uruchamianie kamery" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "komÃŗrkowa z limitem" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"zmień\n" +"język" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "sprawdÅē aktualizacje" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "sprawdzanie..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "połączone" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "model połączony" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "skonfigurowano" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "połącz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "połączono" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "łączenie..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "kontynuuj" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "sterowanie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "ruszanie z postoju (beta)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "tempomat" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "regulator krzywizny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "wideorejestrator" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "odrzuć" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "domyślne" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "usuń" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "deweloper" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "urządzenie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "ID urządzenia" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"wyłącz\n" +"wymuszenie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "wyłącz wymuszony postÃŗj" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "wyłączone" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "rozłączanie..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "rozłącz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "rozłączanie pedałem gazu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "ekran" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "jasność ekranu" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "w dÃŗÅ‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "pobierz aktualizację" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "pobieranie" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "pobieranie..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"podgląd kamery\n" +"kierowcy" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "jasność podczas jazdy" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "dynamiczny" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "włącz wideorejestrator" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "włącz roaming" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "włączone" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "wymuś fabryczne wzdłuÅŧne" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "wprowadÅē APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "wprowadÅē nazwę uÅŧytkownika GitHub..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "wprowadÅē kod aktywacyjny LPA..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "wprowadÅē kod" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "wprowadÅē hasło..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "nie udało się sprawdzić aktualizacji" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "aktualizacja nie powiodła się" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "szybko" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "finalizowanie aktualizacji..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "dla „{}”" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "do aktualizacji z prywatnych gałęzi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"wymuś\n" +"postÃŗj" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "wymuś interfejs mici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "wymuś postÃŗj" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "zapominanie..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "format: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "z pamięci" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "strojenie wzdłuÅŧne hyundai" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "info" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "zainstaluj aktualizację" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "interaktywność" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "ustawienia iq.dynamic" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "zmiana pasa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "ostrzeÅŧenia o zjechaniu z pasa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "prędkość skrętu na pasie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "tryb manewrÃŗw bocznych" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "boczne przy usterce tempomatu" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "pozostaw puste, aby skonfigurować automatycznie" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "pozostaw puste, aby pominąć" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "pozostaw nazwę uÅŧytkownika i token puste, aby wyczyścić" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "w lewo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "tryb manewrÃŗw wzdłuÅŧnych" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "planowanie skrętu przy niskiej prędkości" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "m" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "zarządzaj profilami" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "ręcznie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "ręczna korekta opÃŗÅēnienia" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "tylko mapa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "priorytet mapy" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "z limitem" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "modele" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "sieć" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "uÅŧycie sieci" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "nigdy" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "nie" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "brak alertÃŗw" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "bez poruszenia" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "normalnie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "poza zasięgiem" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "teraz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "poruszenie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "wył." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "offline" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "wł." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "online" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "nazwa (opcjonalnie)..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "sparuj w aplikacji" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "sparuj z Konn3kt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "wagi polityki" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "wyłącz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "predykcyjny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "działania na profilu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "nieznany operator" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "wyczyść pamięć modeli" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "w kolejce" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "gotowy" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "uruchom ponownie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "nagrywaj kamerę kierowcy" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "nagrywaj dÅēwięk mikrofonu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "pobierz model ponownie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "odświeÅŧ profile" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "informacje prawne" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "spokojny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "odświeÅŧ listę modeli" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "usuń pSIM comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "zmień nazwę" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "zmień nazwę profilu..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "resetuj" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "zresetuj kalibrację" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"przejrzyj\n" +"przewodnik" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "w prawo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "s" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "skanuj QR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "skanuj QR / wprowadÅē kod" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "wyszukiwanie sieci" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "samostrojenie opÃŗÅēnienia" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "numer seryjny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "zadana prędkość" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "jednostki wg lokalizacji" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"przesuń, aby\n" +"wyczyścić pamięć" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"przesuń, aby\n" +"rozłączyć" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"przesuń, aby\n" +"zapomnieć" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"przesuń, aby\n" +"pobrać ponownie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"przesuń, aby\n" +"zresetować kalibrację" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"przesuń, aby\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"przesuń, aby usunąć\n" +"pSIM comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "wolno" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "płynne kierowanie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "oprogramowanie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "ustawienia ograniczeń prędkości" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "standardowy" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "czuwanie" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"uruchom samochÃŗd, aby\n" +"uÅŧyć IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "uruchamianie..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "status" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "pozostań aktywny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "kierowanie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "zachowanie wspomagania kierowania" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "fabryczny" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "stop-and-go ręczny hamulec" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "zatrzymaj pobieranie" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "uruchamianie systemu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "gałąÅē docelowa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"warunki\n" +"korzystania" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "tethering" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "hasło tetheringu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "przełączniki" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "przejazdy" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "odinstaluj" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "odinstaluj IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "bez limitu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "nieobsługiwane" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "w gÃŗrę" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "aktualne" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "aktualne, nigdy nie sprawdzano" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "aktualne, ostatnio sprawdzano {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"tryb instalacji\n" +"aktualizacji" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "dostępna aktualizacja" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"brak odpowiedzi\n" +"aktualizatora" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "jednostki metryczne" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "pojazd" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "wersja" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "wirtualne mieszanie momentu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "wagi wizji" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "wygląd" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "ostrzeÅŧenie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "błędne hasło" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "tak" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} ALERT" +msgstr[1] "{} ALERTY" +msgstr[2] "{} ALERTÓW" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{} dzień temu" +msgstr[1] "{} dni temu" +msgstr[2] "{} dni temu" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{} godzinę temu" +msgstr[1] "{} godziny temu" +msgstr[2] "{} godzin temu" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{} minutę temu" +msgstr[1] "{} minuty temu" +msgstr[2] "{} minut temu" diff --git a/iqpilot/selfdrive/ui/translations/app_pt-BR.mo b/iqpilot/selfdrive/ui/translations/app_pt-BR.mo new file mode 100644 index 000000000..2313018dd Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_pt-BR.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_pt-BR.po b/iqpilot/selfdrive/ui/translations/app_pt-BR.po new file mode 100644 index 000000000..c9e80fc3c --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_pt-BR.po @@ -0,0 +1,4704 @@ +# Language pt-BR translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-21 00:00-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt-BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Language: pt_BR\n" +"X-Source-Language: C\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (padrÃŖo)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " A calibraÃ§ÃŖo da resposta de torque da direÃ§ÃŖo foi concluída." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " A calibraÃ§ÃŖo da resposta de torque da direÃ§ÃŖo estÃĄ {}% concluída." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " Seu dispositivo estÃĄ apontado {:.1f}° {} e {:.1f}° {}." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    A calibraÃ§ÃŖo da latÃĒncia da direÃ§ÃŖo estÃĄ concluída." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    A calibraÃ§ÃŖo da latÃĒncia da direÃ§ÃŖo estÃĄ {}% concluída." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "ATIVO" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"O ADB (Android Debug Bridge) permite conectar-se ao seu dispositivo por USB " +"ou pela rede." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "ADICIONAR" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "DESDE O INÍCIO" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "ConfiguraÃ§ÃŖo de APN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "AUTENTICAR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "AUTO" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "barra de aceleraÃ§ÃŖo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "Medidor de aceleraÃ§ÃŖo" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "Reconhecer AtuaÃ§ÃŖo Excessiva" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "Ativar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "Modelo ativo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "Ativo apenas acima de {}." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "Adicionar perfil" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "Adicionar perfil eSIM" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "Ajustar velocidade da intenÃ§ÃŖo de curva" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "Avançado" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"Depois disso, vocÃĒ precisarÃĄ usar seu prÃŗprio perfil eSIM.\n" +"\n" +"VocÃĒ nÃŖo poderÃĄ usar o Comma Prime novamente, a menos que compre um novo chip da comma." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "Agressivo" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "Concordo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "Tudo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "Todos os estados (~6,0 GB)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"Permite que o IQ.Pilot use o comportamento de retomada do ACC MQB em " +"veículos Volkswagen MQB compatíveis com FtS com retenÃ§ÃŖo estendida sem " +"retomada automÃĄtica." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"Permite que o controle lateral (direÃ§ÃŖo) continue ativo mesmo quando o " +"controle longitudinal (acelerador/freio) fica temporariamente indisponível " +"por uma falha do piloto automÃĄtico." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "Controle lateral sempre ativo (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "E muito mais" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "Aplica-se imediatamente." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "" +"Aplica-se na prÃŗxima vez que o dispositivo entrar em modo estacionado." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "Tem certeza de que deseja desligar?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "Tem certeza de que deseja reiniciar?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"Tem certeza de que deseja redefinir todas as configuraçÃĩes do IQ.Pilot para " +"o padrÃŖo? Depois de redefinidas, nÃŖo hÃĄ como voltar atrÃĄs." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "Tem certeza de que deseja redefinir a calibraÃ§ÃŖo?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "Tem certeza de que deseja desinstalar?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "Auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "troca de faixa automÃĄtica" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "Mudança de faixa automÃĄtica: mudanças contínuas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "Auto — escurecido" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "Fechar configuraçÃĩes automaticamente" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"Retoma automaticamente apÃŗs uma parada ao seguir o trÃĄfego, nas plataformas " +"Subaru em que a implementaÃ§ÃŖo beta se aplica." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "Disponibilidade durante mudanças do piloto automÃĄtico" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "Voltar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "Alertas de ponto cego" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "alertas de ponto cego" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "Indicadores de seta" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "Mudança de faixa iniciada pela seta" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "Estado ao iniciar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "Modo de resposta ao freio" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"Traz de volta a faixa larga de status de estacionamento da interface " +"clÃĄssica: temperatura, veículo e estado do Konn3kt de relance." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "ALTERAR" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "VERIFICAR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "LIMPAR" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "CONECTAR" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "CONECTANDO..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "Cancelar" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "Cancelar navegaÃ§ÃŖo" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "Dados mÃŗveis limitados" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "Alterar Idioma" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" +"Alterar esta configuraÃ§ÃŖo reiniciarÃĄ o IQ.Pilot se o carro estiver ligado." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "Verificado {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "Escolher um modelo" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"Escolha o comportamento longitudinal: IQ.Pilot (longitudinal IQ + ponta a " +"ponta), IQ.Dynamic (longitudinal IQ + modo dinÃĸmico), IQ.Chill " +"(longitudinal IQ + perfil relaxado) ou ACC original." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "Escolhido manualmente" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "Limpar cache" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "Limpar o cache do modelo selecionado e baixÃĄ-lo novamente?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "Fechar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"Fecha a malha de direÃ§ÃŖo em veículos MEB e MQB Evo. O IQ.Pilot corrige o " +"comando de direÃ§ÃŖo com base na curvatura que o carro realmente mantÊm, em " +"vez de enviar a curvatura planejada diretamente." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "Nuvem" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "Somente nuvem" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "Vídeo na nuvem indisponível" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "Legenda de cores do estado de identificaÃ§ÃŖo:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "Modelo combinado" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"Executa uma sequÃĒncia programada de degraus de aceleraÃ§ÃŖo para medir a " +"resposta do atuador longitudinal. Requer o controle longitudinal do " +"IQ.Pilot. Use apenas em uma via livre e fechada." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"Executa uma sequÃĒncia programada de degraus de aceleraÃ§ÃŖo lateral para medir" +" a resposta da direÃ§ÃŖo. Use apenas em uma via reta, plana e livre." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "Confirmar" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "Continuar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "trocas contínuas" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "Controle" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"Controla o comportamento do IQ.Pilot em relaÃ§ÃŖo aos limites de velocidade. " +"Desligado desativa os recursos de limite, Info apenas exibe os limites, " +"Aviso destaca o excesso de velocidade e Controle ajusta a velocidade " +"definida conforme os limites detectados." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "NÃŖo foi possível buscar as chaves SSH - veja os logs" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "NÃŖo foi possível localizar esse local" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "NÃŖo foi possível acessar o GitHub - confira a conexÃŖo" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "NÃŖo foi possível verificar o GitHub - confira a hora do dispositivo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "País" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "Registro de falhas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "Arrancada suave da imobilidade (beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "Arrancada suave da imobilidade — freio de mÃŖo manual (beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "Piloto automÃĄtico" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "VersÃŖo Atual" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "Controlador de curvatura" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "EXCLUIR" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "DESCONECTANDO..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "BAIXAR" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "Recusar" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "Recusar, desinstalar o IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "PadrÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "PadrÃŖo (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "" +"PadrÃŖo: inicia pronto para dirigir, com o engate disponível de imediato." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"Atraso atÊ que uma mudança de faixa acionada pela seta comece sozinha — " +"nenhum toque no volante Ê necessÃĄrio depois que um atraso Ê definido (o " +"padrÃŖo Ê Toque no volante).
    Use a seta para isso apenas quando o trÃĸnsito" +" e a via realmente permitirem a manobra." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "atraso com ponto cego" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "Excluir" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "Excluir o perfil desativado \"{}\"?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "Excluir este registro?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "Destino definido" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "Detectado automaticamente" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "Desenvolv" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "Dispositivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "O dispositivo precisa estar registrado no Konn3kt para ser pareado." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "Atraso para escurecer" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "Desconectar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "Desengatar" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "Desengate antes de forçar o modo estacionado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "Desengate antes de forçar o modo em marcha" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "Desativar ao pressionar o acelerador" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "Desativar para Desligar" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "Desativar para Reiniciar" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "Desativar para Redefinir CalibraÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "desengate para {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "Desengatar: frear desliga completamente a assistÃĒncia de direÃ§ÃŖo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "Tela" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "Brilho da tela" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "Exibir velocidade em km/h em vez de mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "DistÃĸncia" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "Deseja enviar os dados da cÃĸmera do motorista?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "Concluído" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "ID do Dongle" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "Baixar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "Falha no download — tente novamente." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "Baixando blocos do mapa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"Desenha uma barra na borda esquerda acompanhando a aceleraÃ§ÃŖo e a frenagem " +"medidas — o que o carro estÃĄ realmente fazendo agora, nÃŖo o que o planejador" +" pediu." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"Desenha o mapa na tela a partir de blocos armazenados no dispositivo. " +"Combinado com o modo on-line, os blocos armazenados assumem no momento em " +"que a conexÃŖo cai. Os blocos sÃŖo baixados para a regiÃŖo selecionada." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "CÃĸmera do Motorista" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "VerificaÃ§ÃŖo da cÃĸmera do motorista" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "Tratamento da intervenÃ§ÃŖo do motorista" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "Viagens" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "Brilho ao dirigir" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "Personalidade" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "DinÃĸmico" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "Ajuste dinÃĸmico: resposta mais viva de acelerador e freio." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "EDITAR" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "ERRO" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "Ativar" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "Ativar ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Ativar o Always on Lateral (AOL). Desative esta chave para voltar ao " +"comportamento original de engate da direÃ§ÃŖo do IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "Ativar dashcam" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "Ativar alertas de saída de faixa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"Ativa o tratamento do bloqueio de direÃ§ÃŖo MQB em veículos Volkswagen MQB com" +" falhas de LKAS em baixa velocidade." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "Ativar roaming" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "Ativar SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "Ativar alertas de saída de faixa" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "" +"Ativar monitoramento do motorista mesmo quando o IQ.Pilot nÃŖo estÃĄ engajado." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "Digite APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "Digite o cÃŗdigo de ativaÃ§ÃŖo" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "Digitar cÃŗdigo" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "Digite SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "Digite um endereço ou local" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "Digite nova senha tethering" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "Digite a senha" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "Digite seu nome de usuÃĄrio do GitHub" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "Erro" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "Sair do modo estacionado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Barra de status expandida" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "MPC do veículo à frente experimental" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"ExpÃĩe um instantÃĸneo dos clipes recentes da dashcam e dos logs como uma " +"unidade USB quando conectado a um computador. O IQ.Pilot continua " +"funcionando enquanto isso estÃĄ ativado." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "ESQUECENDO..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"O controle longitudinal original da Toyota estÃĄ sendo imposto no momento. " +"Escolha um modo longitudinal IQ para desativÃĄ-lo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "Ajuste longitudinal padrÃŖo de fÃĄbrica." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "favoritos" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "Obtendo mapa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "Obtendo mapas..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "Aviso final" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "Encontre seu veículo" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "Configure" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"Exibe um aviso lateral sempre que o carro detecta algo no seu ponto cego " +"(apenas carros com BSM)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" +"Ative o Sempre Estacionado no painel Dispositivo, ou desligue o carro, para " +"mudar isso." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "distÃĸncia de seguimento" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "Siga as instruçÃĩes do aplicativo para concluir o pareamento" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"Forçar o IQ.Pilot em modo em marcha por 10 minutos? O Sempre Estacionado " +"serÃĄ ativado automaticamente e o dispositivo voltarÃĄ ao modo estacionado " +"quando o tempo acabar." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Forçar interface Mici" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "Forçar modo em marcha (10 min)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "Forçar modo em marcha sÃŗ pode ser iniciado quando estacionado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "" +"Forçar modo em marcha jÃĄ estÃĄ ativo. Redefinir o temporizador para 10 " +"minutos?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "Modo em marcha forçado ativo" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Esquecer" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "Esquecer rede Wi-Fi \"{}\"?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "BOM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "AutenticaÃ§ÃŖo Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Token / senha do Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "UsuÃĄrio do Git" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "Erro do GitHub ({}) ao buscar as chaves" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "ALTO" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "Rede" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "Segurar mudança de faixa por ponto cego" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "Mantenha firme..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"Segura a mudança de faixa automÃĄtica enquanto o monitoramento de ponto cego " +"indicar um carro na faixa de destino, liberando-a assim que a faixa estiver " +"livre." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Casa" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "Horas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"Por quanto tempo a tela de configuraçÃĩes pode ficar sem toques antes de se " +"fechar sozinha." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"Quanto tempo de antecipaÃ§ÃŖo adicionar ao atraso da prÃŗpria caixa de direÃ§ÃŖo " +"enquanto o autoajuste estiver desligado. O padrÃŖo Ê 0,2 s." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "INSTALAR" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "Endereço IP" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "paradas forçadas IQ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "modo IQ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"Os modos longitudinais IQ nÃŖo estÃŖo disponíveis para este veículo. O ACC " +"original Ê a Ãēnica opÃ§ÃŖo disponível." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic curvas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic velocidade do veículo à frente" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic baixa velocidade" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic paradas do modelo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic reserva SLC" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic veículo à frente mais lento" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic veículo à frente parado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "VersÃŖo do IQ.OS" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot Indisponível" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"O IQ.Pilot estÃĄ continuamente calibrando, resetar Ê raramente solicitado. " +"Alterar esta configuraÃ§ÃŖo reiniciarÃĄ o IQ.Pilot se o carro estiver ligado." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"o IQ.Pilot requer que o dispositivo seja montado dentro de 4° para a " +"esquerda ou direita e dentro de 5° para cima ou 9° para baixo." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"Se vocÃĒ estiver a 20 mph (32 km/h) ou menos com a seta ligada, o carro " +"planejarÃĄ uma curva nessa direÃ§ÃŖo no caminho trafegÃĄvel mais prÃŗximo. Isso " +"evita situaçÃĩes (como em semÃĄforos vermelhos) em que o carro poderia " +"planejar a curva na direÃ§ÃŖo errada." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "Info" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" +"Insira o chip comma original que veio com o dispositivo para usar o eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "Instalar AtualizaÃ§ÃŖo" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "QR code invÃĄlido" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "KM" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "ERRO DO KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT OFFLINE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "Manter dispositivo estacionado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "Manter acelerador e freio de fÃĄbrica" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"MantÊm acelerador e freios com o sistema Toyota de fÃĄbrica; o IQ.Pilot " +"apenas dirige." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Recursos do Konn3kt:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Status do Konn3kt:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "LIMITE" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "CARREGANDO" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "CARREGANDO..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "OpçÃĩes de mudança de faixa" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "Controle lateral com falha do piloto automÃĄtico" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "Modo de manobra lateral" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "Leituras do veículo à frente" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "Sair do modo Sempre Estacionado agora?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "Sair do modo estacionado forçado agora?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"Deixe o IQ.Pilot medir quanto tempo sua direÃ§ÃŖo leva para responder e manter" +" esse valor atualizado. Desligue para definir vocÃĒ mesmo esse tempo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" +"Permite mover o volante com o sistema engatado sem desengatar totalmente a " +"direÃ§ÃŖo." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "TransmissÃŖo ao vivo" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "Carregando %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "Carregando vídeo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "Carregando..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "Localizando..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "" +"Travado em DESLIGADO nesta plataforma; o veículo nÃŖo suporta outras opçÃĩes." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "Controle longitudinal" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"Modos de controle longitudinal:
    Os recursos do IQ.Pilot estÃŖo listados " +"abaixo:

    Controle longitudinal ponta a ponta do IQ.Pilot


    Deixe" +" o modelo de conduÃ§ÃŖo controlar o acelerador e os freios. O IQ.Pilot " +"dirigirÃĄ como acha que um humano dirigiria, inclusive parando em semÃĄforos " +"vermelhos e placas de pare. Como o modelo decide a velocidade, a velocidade " +"definida atua apenas como limite superior. Este recurso ainda estÃĄ sendo " +"aprimorado; erros sÃŖo esperados.

    IQ.Dynamic


    Mescla " +"dinamicamente o comportamento do piloto automÃĄtico adaptativo com o " +"comportamento ponta a ponta conforme a cena e o " +"contexto.

    IQ.Chill


    Usa o comportamento padrÃŖo de piloto " +"automÃĄtico adaptativo ao trÃĄfego para o controle longitudinal.

    Nova " +"visualizaÃ§ÃŖo de conduÃ§ÃŖo


    A visualizaÃ§ÃŖo de conduÃ§ÃŖo passarÃĄ para a " +"cÃĸmera grande angular voltada para a estrada em baixas velocidades, para " +"mostrar melhor algumas curvas. O logo do IQ.Pilot tambÊm aparecerÃĄ no canto " +"superior direito." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "Modo de Manobra Longitudinal" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "Perfil de ajuste longitudinal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "antecipaÃ§ÃŖo maior" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "antecipaÃ§ÃŖo menor" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "Planejamento de curva em baixa velocidade" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"Filtra a curvatura planejada com um passa-baixa antes de chegar à " +"cremalheira em veículos MEB e MQB Evo, amortecendo a oscilaÃ§ÃŖo lateral. " +"Ligado por padrÃŖo nesses carros." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "MANUAL" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "MÁX" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "Retomada do ACC MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "retomada ACC MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "Bloqueio de direÃ§ÃŖo MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "bloqueio de direÃ§ÃŖo MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "ManutenÃ§ÃŖo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "CompensaÃ§ÃŖo manual de atraso" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "Banco de dados de mapas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "Medido:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "Milhas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "Espelha as setas do carro como flechas na tela de conduÃ§ÃŖo." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "tempo de parada do modelo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "Modelos" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "N/A" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "SEM PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "NENHUM" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "NavegaÃ§ÃŖo" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "NavegaÃ§ÃŖo cancelada" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "Perto" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "Rede" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "rede neural FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "PrÊ-alimentaÃ§ÃŖo por rede neural (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "Nunca dormir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "NÃŖo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "Sem toque no volante" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "Nenhum QR detectado" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "Nenhuma chave SSH encontrada para o usuÃĄrio '{}'" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "Nenhuma rede Wi-Fi encontrada" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "" +"Nenhuma cÃĸmera detectada no modo dev. Toque em verificar para continuar." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "Sem notas de versÃŖo disponíveis." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "Nenhum resultado" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "Nenhuma rota gravada" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "Nenhum veículo definido" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "Nenhum vídeo para esta cÃĸmera" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"Normalmente, uma manobra encerra a mudança de faixa mesmo com a seta ligada." +" Ative isto para encadear outras mudanças enquanto a seta permanecer ligada " +"— cada uma seguinte ainda pede um toque no volante." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "NÃŖo disponível nesta plataforma Subaru." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "NÃŖo conectado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "NÃŖo definido" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"ObservaÃ§ÃŖo: em carros sem botÃŖo LFA/LKAS, desativar isso impede que a " +"assistÃĒncia de direÃ§ÃŖo se arme quando a disponibilidade do piloto automÃĄtico" +" muda." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "Toque no volante" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "OFFLINE" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "ONLINE" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "Desligado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "Mapas na tela off-line" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "Estacionado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "Temporizador de desligamento quando estacionado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "" +"Estacionado: entra em Sempre Estacionado toda vez que inicia ou desperta." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "CompensaÃ§ÃŖo:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "No dispositivo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "Mapas na tela on-line" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "Interface de desenvolvedor ao dirigir" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "Abra o aplicativo Konn3kt no seu celular" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "Apelido opcional" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"Exibe durante a conduÃ§ÃŖo uma barra com mÊtricas de controle ao vivo " +"(direÃ§ÃŖo, aceleraÃ§ÃŖo lateral, dados do veículo à frente)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "EMPARELHAR" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "SEMANA PASSADA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "Modo PQ HCA Status 7" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "modo PQ HCA status 7" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "PRÉVIA" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "Emparelhar Dispositivo" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "Atualizar Agora" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "Emparelhar dispositivo" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Pareie seu dispositivo no aplicativo Konn3kt" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Pareie seu dispositivo no aplicativo Konn3kt." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "Emparelhe seu dispositivo à sua conta comma" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "Pausar atualizaçÃĩes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "Fazer uma busca" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" +"Escolha como a assistÃĒncia de direÃ§ÃŖo reage quando o motorista freia no " +"IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "" +"Escolha o que um toque no pedal do freio faz com a assistÃĒncia de direÃ§ÃŖo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"Escolha se uma atualizaÃ§ÃŖo pronta apenas aguarda sua permissÃŖo ou se baixa e" +" instala sozinha." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "Escolha seu veículo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "Fixe um veículo para pular a detecÃ§ÃŖo automÃĄtica." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"Fixa leituras ao vivo (distÃĸncia, velocidade, tempo atÊ o veículo à frente) " +"no marcador do carro da frente. Requer que o IQ.Pilot esteja controlando " +"acelerador e freio." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "Conecte-se ao Wi‑Fi para concluir o emparelhamento inicial" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "Conecte-se ao Wi-Fi para concluir o pareamento inicial." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "Conecte-se ao Wi-Fi para buscar sua chave." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "Conecte-se ao Wi-Fi para atualizar." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "" +"Aponte a cÃĸmera do motorista para um QR code eSIM da operadora (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "Pesos de política" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "Desligar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"Desliga o dispositivo depois que ele ficar esse tempo parado com o motor desligado.\n" +"(30 h por padrÃŖo)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "Preditivo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "Ajuste preditivo: antecipa e suaviza mudanças de aceleraÃ§ÃŖo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "PrÊ-download + prÊ-instalaÃ§ÃŖo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "Apenas prÊ-download" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "Preparando blocos do mapa..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "Evitar uploads grandes de dados em conexÃĩes Wi-Fi limitadas" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "Evitar uploads grandes de dados em conexÃĩes mÃŗveis limitadas" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"PrÊ-visualize a cÃĸmera voltada para o motorista para garantir que o " +"monitoramento do motorista tenha boa visibilidade. (veículo deve estar " +"desligado)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "AçÃĩes do perfil" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"Baixa blocos do Mapbox ao vivo para o mapa na tela sempre que o dispositivo " +"tiver internet." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "Limpar cache de modelos" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"Coloque o dispositivo em Sempre Estacionado, ou desligue o carro, antes de " +"mudar como as atualizaçÃĩes sÃŖo instaladas." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"Coloque o dispositivo em Sempre Estacionado, ou desligue o carro, antes de " +"mexer nisso." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "Erro no QR Code" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "QR code aceito" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "PRONTO" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "BAIXAR NOVAMENTE" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "ATUALIZAR" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "REMOVER" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "REMOVENDO..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "REDEFINIR" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "REVISAR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "Caixa de direÃ§ÃŖo:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"Remonte o dispositivo se seu rosto estiver encoberto ou se o monitoramento " +"tiver dificuldade em rastreÃĄ-lo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "" +"Acessível apenas com o carro desligado ou com o Sempre Estacionado ativado." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "Reiniciar" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "Reiniciar Dispositivo" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "Reiniciar e Atualizar" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"Receba alertas para voltar à faixa quando seu veículo cruzar uma linha de " +"faixa detectada sem seta ativada ao dirigir acima de 31 mph (50 km/h)." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "Gravar e Enviar CÃĸmera do Motorista" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "Gravar e Enviar Áudio do Microfone" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"Grave e armazene o ÃĄudio do microfone enquanto dirige. O ÃĄudio serÃĄ incluído" +" no vídeo da dashcam no Konn3kt." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"Gravar e enviar dados de conduÃ§ÃŖo e vídeo. Desativar interrompe toda a " +"gravaÃ§ÃŖo! Sem logs, sem vídeo, sem ÃĄudio." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "Baixar novamente" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "Baixar novamente o modelo atual" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "Atualizar perfis" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "RegulatÃŗrio" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "Relaxado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "Recarregar lista de modelos" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "Permanecer ativo: frear nunca interrompe a assistÃĒncia de direÃ§ÃŖo." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "Acesso remoto" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "Remover" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Remover pSIM Comma" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "Renomear" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "Renomear perfil" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "Tempo da solicitaÃ§ÃŖo esgotado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "Requer que o controle longitudinal do IQ.Pilot (alfa) esteja ativado." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "Redefinir" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "Redefinir CalibraÃ§ÃŖo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "Restaurar padrÃĩes" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "Revisar Guia de Treinamento" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "Revise as regras, recursos e limitaçÃĩes do IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "nome da via" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "Nome da via na tela" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "Rotas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "VersÃŖo do motor de rotas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "Executar a interface compacta do comma 4 (mici) neste dispositivo" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "SELECIONAR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC confirmaÃ§ÃŖo automÃĄtica" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC confirmar maior" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC confirmar menor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC reserva IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC preenchimento on-line" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC substituiÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC política" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "Chaves SSH" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "chaves SSH" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "ACC ORIGINAL" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "Escanear" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "Escanear QR" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "Escaneie o QR ou digite o cÃŗdigo de ativaÃ§ÃŖo" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "Procurando redes Wi-Fi..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "Buscar" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "Buscar endereço ou local" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "Buscar marca ou modelo" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "Buscando..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "Selecione" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "Selecione uma branch" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "Selecione um idioma" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "Atraso de direÃ§ÃŖo autoajustÃĄvel" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "NÃēmero de sÊrie" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "Definir casa" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "Unidades pela localizaÃ§ÃŖo" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "Definir trabalho" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "Definir endereço de casa" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"Definir as unidades pela localizaÃ§ÃŖo do dispositivo. As velocidades mudam " +"para km/h em todos os lugares, exceto Estados Unidos, Reino Unido e LibÊria," +" e sÃŖo verificadas novamente ao cruzar uma fronteira." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "Definir endereço do trabalho" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"Define o limite de velocidade usado pelas intençÃĩes de curva. Abaixo desse " +"valor, elas podem planejar o caminho de curva trafegÃĄvel mais prÃŗximo. O " +"padrÃŖo Ê 19 mph." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"Define em qual estado o dispositivo fica apÃŗs iniciar ou despertar do modo " +"de espera." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "ConfiguraçÃĩes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"Mostra o nome da via atual sobre a visÃŖo de conduÃ§ÃŖo.
    Requer mapas " +"offline da sua regiÃŖo instalados." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "DireÃ§ÃŖo suave" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "Adiar AtualizaÃ§ÃŖo" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "Software" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "Velocidade" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "Limite de velocidade" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "Controle de limite de velocidade" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "PadrÃŖo" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"PadrÃŖo Ê recomendado. No modo agressivo, o IQ.Pilot seguirÃĄ veículos à " +"frente mais de perto e serÃĄ mais agressivo com acelerador e freio. No modo " +"relaxado, o IQ.Pilot ficarÃĄ mais longe dos veículos à frente. Em carros " +"compatíveis, vocÃĒ pode alternar essas personalidades com o botÃŖo de " +"distÃĸncia do volante." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "Em espera" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"Em espera: frear pausa a assistÃĒncia de direÃ§ÃŖo; ela retorna assim que vocÃĒ " +"tira o pÊ do pedal." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "Iniciar download" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" +"Ligue o veículo para verificar a compatibilidade do comportamento da " +"assistÃĒncia de direÃ§ÃŖo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "Estado" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "Estatísticas" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "Status" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Permanecer engatado" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "DireÃ§ÃŖo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "Comportamento da assistÃĒncia de direÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Arco de esforço da direÃ§ÃŖo" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "ACC original" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "Parar download" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Variante stop-and-go para carros Subaru Global com freio de mÃŖo manual. " +"Deixe desativado em carros com freio de estacionamento elÊtrico. Obrigado ao" +" martinl por esta implementaÃ§ÃŖo!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "Mapas armazenados" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "Transmitindo da nuvem" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "Colocar o dispositivo em modo Sempre Estacionado?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "Colocar o dispositivo em modo estacionado forçado?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "Sistema" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "Sistema sem resposta" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "ASSUMA O CONTROLE IMEDIATAMENTE" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "TEMP" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "TEMP ALTA" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "TEMP OK" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "Toque em \"Add Device\" e escaneie o QR code à direita" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "Branch Alvo" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "Senha Tethering" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"O modelo selecionado mudou. Sugerimos redefinir a calibraÃ§ÃŖo. Deseja fazer " +"isso agora?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "" +"NÃŖo hÃĄ como desfazer depois que isso rodar — Ãēltima chance de voltar atrÃĄs." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "" +"Isso precisa de uma reinicializaÃ§ÃŖo para ser aplicado. Reiniciar agora?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "Esta plataforma Ê limitada ao modo Desengatar." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "" +"Esta plataforma suporta um conjunto limitado de opçÃĩes de comportamento da " +"assistÃĒncia de direÃ§ÃŖo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" +"Esta plataforma suporta a configuraÃ§ÃŖo completa do comportamento da " +"assistÃĒncia de direÃ§ÃŖo." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"Isso excluirÃĄ TODOS os mapas baixados\n" +"\n" +"Tem certeza de que deseja excluir todos os mapas?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"Isso excluirÃĄ do cache TODOS os modelos baixados, exceto o modelo ativo. Tem" +" certeza?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "Isso apagarÃĄ permanentemente o perfil pSIM Comma do chip." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "Isso iniciarÃĄ o download, que pode levar um tempo para concluir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "Tempo" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "OpçÃĩes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "Total:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"Desenha um arco sobre a visÃŖo da estrada mostrando quanta direÃ§ÃŖo o IQ.Pilot" +" estÃĄ aplicando enquanto o controle lateral funciona." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "Guia de treinamento" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "setas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"Desativa completamente a verificaÃ§ÃŖo de atualizaçÃĩes pela " +"rede.
    Reinicie para que isso tenha efeito." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "Digite um ano e depois um modelo — por exemplo, 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "Digite para buscar" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "INDISPONÍVEL" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "DESINSTALAR" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "ATUALIZAR" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "Armazenamento USB" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "USAR" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "NÃŖo foi possível carregar o vídeo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "Indisponível enquanto o carro estÃĄ em marcha." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "" +"Indisponível — o controle longitudinal do IQ.Pilot nÃŖo estÃĄ ativo neste " +"carro." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "NÃŖo detectado e nÃŖo definido" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "Desinstalar" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "Desconhecido" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "Operadora desconhecida" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "Armazenamento ilimitado de rotas" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "Modo de instalaÃ§ÃŖo de atualizaçÃĩes" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "AtualizaçÃĩes sÃŖo baixadas apenas com o carro desligado." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "Enviar durante a conduÃ§ÃŖo" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"Envie dados da cÃĸmera voltada para o motorista e ajude a melhorar o " +"algoritmo de monitoramento do motorista." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "Enviado" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "Enviando" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"Usa o HCA Status 7 em vez do Status 5 para o controle de direÃ§ÃŖo em veículos" +" da plataforma PQ. Isso pode ajudar na compatibilidade com alguns modelos " +"Volkswagen mais antigos." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "Usar Sistema MÊtrico" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"Usar cÃŗdigo de ativaÃ§ÃŖo:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"Use o sistema IQ.Pilot para controle de cruzeiro adaptativo e assistÃĒncia de" +" permanÃĒncia em faixa. Sua atenÃ§ÃŖo Ê necessÃĄria o tempo todo para usar este " +"recurso." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "VEÍCULO" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "VER" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (mesclagem virtual de torque)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "Veículo" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"A capacidade longitudinal do veículo ainda nÃŖo foi detectada. Ligue o carro " +"uma vez para detectar o suporte." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Reprodutor de vídeo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "Ver o registro de erros de falhas do IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "Pesos de visÃŖo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "Visual" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "Aguardando sinal de GPS..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"Aguardando a cÃĸmera do motorista. Use o QR code eSIM da operadora ou digite " +"o cÃŗdigo LPA manualmente." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "Aguardando para iniciar" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "Aviso" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"Aviso: isso concede acesso SSH a todas as chaves pÃēblicas nas suas " +"configuraçÃĩes do GitHub. Nunca informe um nome de usuÃĄrio do GitHub que nÃŖo " +"seja o seu. Um funcionÃĄrio do IQ.Pilot NUNCA pedirÃĄ que vocÃĒ adicione o nome" +" de usuÃĄrio dele." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"Aviso: a direÃ§ÃŖo pode oscilar em curvas abaixo de {}; desative isto se vocÃĒ " +"sentir." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "Bem-vindo ao IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "" +"Quando ativado, pressionar o pedal do acelerador desengajarÃĄ o IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Rede Wi-Fi limitada" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "Trabalho" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "Senha errada" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "Sim" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "Sim, excluir todos os mapas" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "VocÃĒ precisa aceitar os Termos de Serviço para poder usar o IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"VocÃĒ precisa aceitar os Termos de Serviço para usar o IQ.Pilot. Leia os " +"termos mais recentes antes de continuar em https://iqlvbs.com/tos." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"Depois disso, vocÃĒ precisarÃĄ usar seu prÃŗprio perfil eSIM. NÃŖo poderÃĄ usar o" +" Comma Prime novamente, a menos que compre um novo chip da comma." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "ativar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "ativo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "modelo ativo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "adicionar perfil eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "adicionar perfil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "agressivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "configuraçÃĩes de APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "auto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "auto escuro" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"atualizaçÃĩes\n" +"automÃĄticas" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "voltar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "branch" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "atraso para escurecer" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "calculando milhas..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "cÃĸmera iniciando" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "celular com limite" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"mudar\n" +"idioma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "verificar atualizaÃ§ÃŖo" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "verificando..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "combinado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "modelo combinado" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "configurado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "conectar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "conectado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "conectando..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "continuar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "controle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "arrancada suave (beta)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "piloto automÃĄtico" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "controlador de curvatura" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "recusar" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "padrÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "excluir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "desenvolvedor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "dispositivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "ID do dispositivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"sair de\n" +"estacionado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "desativar estacionado forçado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "desativado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "desconectando..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "desengatar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "desengatar no acelerador" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "tela" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "brilho da tela" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "para baixo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "baixar atualizaÃ§ÃŖo" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "baixando" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "baixando..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"prÊvia da cÃĸmera\n" +"do motorista" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "brilho ao dirigir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "dinÃĸmico" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "ativar dashcam" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "ativar roaming" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "ativado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "forçar long. de fÃĄbrica" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "inserir APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "inserir usuÃĄrio do GitHub..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "inserir cÃŗdigo LPA..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "inserir cÃŗdigo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "inserir senha..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "falha ao verificar atualizaÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "falha ao atualizar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "rÃĄpido" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "finalizando atualizaÃ§ÃŖo..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "para \"{}\"" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "para atualizaçÃĩes de branches privadas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"forçar\n" +"estacionado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "forçar interface mici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "forçar estacionado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "esquecendo..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "formato: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "do cache" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "ajuste long. hyundai" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "info" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "instalar atualizaÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "interatividade" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "configuraçÃĩes iq.dynamic" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "troca de faixa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "alertas de saída de faixa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "velocidade de conversÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "modo de manobra lateral" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "lateral com falha do piloto" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "deixe em branco para configuraÃ§ÃŖo automÃĄtica" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "deixe em branco para pular" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "deixe usuÃĄrio e token em branco para limpar" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "à esquerda" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "modo de manobra longitudinal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "conversÃŖo em baixa velocidade" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "m" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "gerenciar perfis" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "manual" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "compensaÃ§ÃŖo manual de atraso" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "somente mapa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "prioridade do mapa" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "limitados" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "modelos" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "rede" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "uso da rede" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "nunca" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "nÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "sem alertas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "sem toque" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "normal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "fora de alcance" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "agora" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "toque no volante" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "desl." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "offline" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "lig." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "online" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "apelido opcional..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "parear no app" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "parear com Konn3kt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "pesos de política" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "desligar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "preditivo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "açÃĩes do perfil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "operadora desconhecida" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "limpar cache de modelos" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "na fila" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "pronto" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "reiniciar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "gravar cÃĸmera do motorista" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "gravar microfone" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "baixar modelo novamente" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "atualizar perfis" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "informaçÃĩes regulatÃŗrias" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "relaxado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "recarregar lista de modelos" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "remover pSIM comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "renomear" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "renomear perfil..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "redefinir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "redefinir calibraÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"ver guia\n" +"de treinamento" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "à direita" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "s" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "escanear QR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "escanear QR / inserir cÃŗdigo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "procurando redes" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "atraso de direÃ§ÃŖo autoajustÃĄvel" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "nÃēmero de sÊrie" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "velocidade definida" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "unidades pela localizaÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"deslize para\n" +"limpar o cache" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"deslize para\n" +"desconectar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"deslize para\n" +"esquecer" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"deslize para\n" +"baixar de novo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"deslize para\n" +"redefinir calibraÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"deslize para\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"deslize para remover\n" +"pSIM comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "lento" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "direÃ§ÃŖo suave" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "software" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "config. de limite de velocidade" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "padrÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "em espera" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"ligue o carro para\n" +"usar o IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "iniciando..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "status" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "permanecer engatado" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "direÃ§ÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "comportamento da assistÃĒncia" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "de fÃĄbrica" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "stop-and-go freio manual" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "parar download" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "sistema iniciando" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "branch de destino" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"termos e\n" +"condiçÃĩes" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "roteamento" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "senha do roteamento" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "opçÃĩes" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "viagens" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "desinstalar" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "desinstalar IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "ilimitados" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "nÃŖo suportado" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "para cima" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "atualizado" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "atualizado, Ãēltima verificaÃ§ÃŖo: nunca" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "atualizado, Ãēltima verificaÃ§ÃŖo: {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"modo de instalaÃ§ÃŖo\n" +"de atualizaçÃĩes" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "atualizaÃ§ÃŖo disponível" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"atualizador nÃŖo\n" +"respondeu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "unidades mÊtricas" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "veículo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "versÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "mesclagem virtual de torque" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "pesos de visÃŖo" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "visual" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "aviso" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "senha incorreta" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "sim" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} ALERTA" +msgstr[1] "{} ALERTAS" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{} dia atrÃĄs" +msgstr[1] "{} dias atrÃĄs" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{} hora atrÃĄs" +msgstr[1] "{} horas atrÃĄs" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{} minuto atrÃĄs" +msgstr[1] "{} minutos atrÃĄs" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 ano de armazenamento de conduÃ§ÃŖo" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "Conectividade LTE 24/7" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "AVISO: o controle longitudinal do openpilot estÃĄ em alpha para este carro" +#~ " e desativarÃĄ a Frenagem AutomÃĄtica de EmergÃĒncia (AEB).

    Neste " +#~ "carro, o openpilot usa por padrÃŖo o ACC integrado do carro em vez do " +#~ "controle longitudinal do openpilot. Ative isto para alternar para o controle" +#~ " longitudinal do openpilot. Recomenda-se ativar o Modo Experimental ao " +#~ "ativar o controle longitudinal do openpilot em alpha." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB (Android Debug Bridge) permite conectar ao seu dispositivo via USB ou " +#~ "pela rede. Veja https://docs.comma.ai/how-to/connect-to-comma para mais " +#~ "informaçÃĩes." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "Monitoramento de Motorista Sempre Ativo" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "" +#~ "Uma versÃŖo alpha do controle longitudinal do openpilot pode ser testada, " +#~ "junto com o Modo Experimental, em ramificaçÃĩes fora de release." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "Adicione konn3kt.com à tela inicial para usÃĄ-lo como um app" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "MODO CHILL ATIVO" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "Alterar esta configuraÃ§ÃŖo reiniciarÃĄ o openpilot se o carro estiver ligado." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "Toque em \"adicionar novo dispositivo\" e escaneie o QR code à direita" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "Recusar, desinstalar o openpilot" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "MODO EXPERIMENTAL ATIVO" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "" +#~ "Ativar monitoramento do motorista mesmo quando o openpilot nÃŖo estÃĄ " +#~ "engajado." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "Ativar openpilot" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "" +#~ "Ative a opÃ§ÃŖo de controle longitudinal do openpilot (alpha) para permitir o " +#~ "Modo Experimental." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "Modo Experimental" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "" +#~ "O Modo Experimental estÃĄ indisponível neste carro pois o ACC original do " +#~ "carro Ê usado para controle longitudinal." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "RECURSOS PRIME:" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Modo Firehose" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "Para mÃĄxima efetividade, leve seu dispositivo para dentro e conecte a um bom adaptador USB-C e Wi‑Fi semanalmente.\n" +#~ "\n" +#~ "O Modo Firehose tambÊm pode funcionar enquanto vocÃĒ dirige se estiver conectado a um hotspot ou a um SIM ilimitado.\n" +#~ "\n" +#~ "\n" +#~ "Perguntas Frequentes\n" +#~ "\n" +#~ "Importa como ou onde eu dirijo? NÃŖo, apenas dirija como normalmente.\n" +#~ "\n" +#~ "Todos os meus segmentos sÃŖo puxados no Modo Firehose? NÃŖo, puxamos seletivamente um subconjunto dos seus segmentos.\n" +#~ "\n" +#~ "Qual Ê um bom adaptador USB‑C? Qualquer carregador rÃĄpido de telefone ou laptop serve.\n" +#~ "\n" +#~ "Importa qual software eu executo? Sim, apenas o openpilot upstream (e forks específicos) podem ser usados para treinamento." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "Acesse https://konn3kt.com no seu telefone" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "INATIVO: conecte a uma rede sem franquia" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "Modo de DepuraÃ§ÃŖo do Joystick" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "" +#~ "Maximize seus envios de dados de treinamento para melhorar os modelos de " +#~ "conduÃ§ÃŖo do openpilot." + +#~ msgid "NO" +#~ msgstr "NÃO" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "Nenhuma chave SSH encontrada" + +#, python-format +#~ msgid "Open" +#~ msgstr "Abrir" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "" +#~ "Emparelhe seu dispositivo com o Konn3kt (konn3kt.com) e resgate sua oferta " +#~ "Konn3kt." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "Torne-se membro Konn3kt em konn3kt.com" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "Capturas remotas" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "Revise as regras, recursos e limitaçÃĩes do openpilot" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "PadrÃŖo Ê recomendado. No modo agressivo, o openpilot seguirÃĄ veículos à " +#~ "frente mais de perto e serÃĄ mais agressivo com acelerador e freio. No modo " +#~ "relaxado, o openpilot ficarÃĄ mais longe dos veículos à frente. Em carros " +#~ "compatíveis, vocÃĒ pode alternar essas personalidades com o botÃŖo de " +#~ "distÃĸncia do volante." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "" +#~ "Use o sistema openpilot para controle de cruzeiro adaptativo e assistÃĒncia " +#~ "de permanÃĒncia em faixa. Sua atenÃ§ÃŖo Ê necessÃĄria o tempo todo para usar " +#~ "este recurso." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "Aviso: Isso concede acesso SSH a todas as chaves pÃēblicas nas suas " +#~ "configuraçÃĩes do GitHub. Nunca informe um nome de usuÃĄrio do GitHub que nÃŖo " +#~ "seja o seu. Um funcionÃĄrio da comma NUNCA pedirÃĄ para vocÃĒ adicionar o nome " +#~ "de usuÃĄrio do GitHub dele." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "Bem-vindo ao openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "" +#~ "Quando ativado, pressionar o pedal do acelerador desengajarÃĄ o openpilot." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "VocÃĒ deve aceitar os Termos e CondiçÃĩes para usar o openpilot." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "VocÃĒ deve aceitar os Termos e CondiçÃĩes para usar o openpilot. Leia os " +#~ "termos mais recentes em https://comma.ai/terms antes de continuar." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "Controle Longitudinal do openpilot (Alpha)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot Indisponível" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "o openpilot dirige por padrÃŖo no modo chill. O Modo Experimental habilita " +#~ "recursos em nível alpha que nÃŖo estÃŖo prontos para o modo chill. Os recursos" +#~ " experimentais sÃŖo listados abaixo:

    Controle Longitudinal End-to-" +#~ "End


    Permita que o modelo de conduÃ§ÃŖo controle o acelerador e os " +#~ "freios. O openpilot dirigirÃĄ como acha que um humano faria, incluindo parar " +#~ "em sinais e semÃĄforos vermelhos. Como o modelo decide a velocidade, a " +#~ "velocidade definida atuarÃĄ apenas como limite superior. Este Ê um recurso de" +#~ " qualidade alpha; erros devem ser esperados.

    Nova VisualizaÃ§ÃŖo de " +#~ "ConduÃ§ÃŖo


    A visualizaÃ§ÃŖo de conduÃ§ÃŖo mudarÃĄ para a cÃĸmera grande-" +#~ "angular voltada para a estrada em baixas velocidades para mostrar melhor " +#~ "algumas curvas. O logotipo do Modo Experimental tambÊm serÃĄ exibido no canto" +#~ " superior direito." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "O openpilot estÃĄ continuamente calibrando, resetar Ê raramente solicitado. " +#~ "Alterar esta configuraÃ§ÃŖo reiniciarÃĄ o openpilot se o carro estiver ligado." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "o openpilot aprende a dirigir observando humanos, como vocÃĒ, dirigirem.\n" +#~ "\n" +#~ "O Modo Firehose permite maximizar seus envios de dados de treinamento para melhorar os modelos de conduÃ§ÃŖo do openpilot. Mais dados significam modelos maiores, o que significa um Modo Experimental melhor." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "" +#~ "o controle longitudinal do openpilot pode vir em uma atualizaÃ§ÃŖo futura." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "" +#~ "o openpilot requer que o dispositivo seja montado dentro de 4° para a " +#~ "esquerda ou direita e dentro de 5° para cima ou 9° para baixo." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "" +#~ "{} segmento da sua conduÃ§ÃŖo estÃĄ no conjunto de treinamento atÊ agora." +#~ msgstr[1] "" +#~ "{} segmentos da sua conduÃ§ÃŖo estÃŖo no conjunto de treinamento atÊ agora." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ ASSINADO" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Modo Firehose đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_th.mo b/iqpilot/selfdrive/ui/translations/app_th.mo new file mode 100644 index 000000000..e7861fd64 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_th.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_th.po b/iqpilot/selfdrive/ui/translations/app_th.po new file mode 100644 index 000000000..6a3aa7144 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_th.po @@ -0,0 +1,4318 @@ +# Thai translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-22 16:32-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸā¸šā¸ā¸˛ā¸Ŗā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡āšā¸Ŗā¸‡ā¸šā¸´ā¸”ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸Ąā¸šā¸šā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸā¸šā¸ā¸˛ā¸Ŗā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡āšā¸Ŗā¸‡ā¸šā¸´ā¸”ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāš€ā¸Ēā¸Ŗāš‡ā¸ˆāšā¸Ĩāš‰ā¸§ {}%" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸Ģā¸ąā¸™āš„ā¸› {:.1f}° {} āšā¸Ĩ⏰ {:.1f}° {}" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸā¸šā¸„ā¸§ā¸˛ā¸Ąā¸Ģā¸™āšˆā¸§ā¸‡ā¸‚ā¸­ā¸‡ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸Ąā¸šā¸šā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸā¸šā¸„ā¸§ā¸˛ā¸Ąā¸Ģā¸™āšˆā¸§ā¸‡ā¸‚ā¸­ā¸‡ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāš€ā¸Ēā¸Ŗāš‡ā¸ˆāšā¸Ĩāš‰ā¸§ {}%" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸­ā¸ĸā¸šāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"ADB (Android Debug Bridge) āšƒā¸Ģāš‰ā¸„ā¸¸ā¸“āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ā¸ā¸ąā¸šā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸œāšˆā¸˛ā¸™ USB " +"ā¸Ģā¸Ŗā¸ˇā¸­ā¸œāšˆā¸˛ā¸™āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ" + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "āš€ā¸žā¸´āšˆā¸Ą" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ APN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸•ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "āšā¸–ā¸šā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāšˆā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "ā¸Ąā¸˛ā¸•ā¸Ŗā¸§ā¸ąā¸”ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāšˆā¸‡" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "ā¸Ŗā¸ąā¸šā¸—ā¸Ŗā¸˛ā¸šā¸ā¸˛ā¸Ŗā¸Ēā¸ąāšˆā¸‡ā¸‡ā¸˛ā¸™ā¸—ā¸ĩāšˆā¸Ąā¸˛ā¸āš€ā¸ā¸´ā¸™āš„ā¸›" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "āš‚ā¸Ąāš€ā¸”ā¸Ĩ⏗ā¸ĩāšˆāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸­ā¸ĸā¸šāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "ā¸—ā¸ŗā¸‡ā¸˛ā¸™āš€ā¸‰ā¸žā¸˛ā¸°āš€ā¸Ģ⏙⏎⏭ {} āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™" + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "āš€ā¸žā¸´āšˆā¸Ąāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "āš€ā¸žā¸´āšˆā¸Ąāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ eSIM" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸„ā¸§ā¸˛ā¸Ąā¸•ā¸ąāš‰ā¸‡āšƒā¸ˆāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "ā¸‚ā¸ąāš‰ā¸™ā¸Ēā¸šā¸‡" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"ā¸Ģā¸Ĩā¸ąā¸‡ā¸ˆā¸˛ā¸ā¸™ā¸ĩāš‰ ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡āšƒā¸Šāš‰āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ eSIM ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš€ā¸­ā¸‡\n" +"\n" +"ā¸„ā¸¸ā¸“ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšƒā¸Šāš‰ Comma Prime āš„ā¸”āš‰ā¸­ā¸ĩ⏁ āš€ā¸§āš‰ā¸™āšā¸•āšˆā¸ˆā¸°ā¸‹ā¸ˇāš‰ā¸­ā¸‹ā¸´ā¸Ąāšƒā¸Ģā¸Ąāšˆā¸ˆā¸˛ā¸ comma" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "ā¸”ā¸¸ā¸”ā¸ąā¸™" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "ā¸ĸā¸­ā¸Ąā¸Ŗā¸ąā¸š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "ā¸—ā¸¸ā¸ā¸Ŗā¸ąā¸ (~6.0 GB)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āšƒā¸Ģāš‰ IQ.Pilot āšƒā¸Šāš‰ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸ā¸˛ā¸Ŗā¸ā¸Ĩā¸ąā¸šā¸Ąā¸˛ā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸‚ā¸­ā¸‡ ACC āšā¸šā¸š MQB āšƒā¸™ā¸Ŗā¸– Volkswagen " +"MQB ⏗ā¸ĩāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸š FtS ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸ā¸˛ā¸Ŗā¸Ģā¸ĸā¸¸ā¸”ā¸„āš‰ā¸˛ā¸‡āšā¸šā¸šā¸‚ā¸ĸ⏞ā¸ĸāš€ā¸§ā¸Ĩā¸˛āš‚ā¸”ā¸ĸāš„ā¸Ąāšˆā¸Ąā¸ĩ⏁⏞⏪⏁ā¸Ĩā¸ąā¸šā¸Ąā¸˛ā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"ā¸­ā¸™ā¸¸ā¸ā¸˛ā¸•āšƒā¸Ģāš‰ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡ (ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧) ā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸•āšˆā¸­āš„ā¸› " +"āšā¸Ąāš‰ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧ (ā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡/āš€ā¸šā¸Ŗā¸) " +"ā¸ˆā¸°āšƒā¸Šāš‰āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸Šā¸ąāšˆā¸§ā¸„ā¸Ŗā¸˛ā¸§āš€ā¸žā¸Ŗā¸˛ā¸°ā¸„ā¸Ŗā¸šā¸‹ā¸„ā¸­ā¸™āš‚ā¸—ā¸Ŗā¸Ĩā¸‚ā¸ąā¸”ā¸‚āš‰ā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩ⏞ (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "āšā¸Ĩ⏰⏭ā¸ĩā¸ā¸Ąā¸˛ā¸ā¸Ąā¸˛ā¸ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "ā¸Ąā¸ĩ⏜ā¸Ĩā¸—ā¸ąā¸™ā¸—ā¸ĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "ā¸ˆā¸°ā¸Ąā¸ĩ⏜ā¸Ĩāš€ā¸Ąā¸ˇāšˆā¸­ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆāš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸„ā¸Ŗā¸ąāš‰ā¸‡ā¸–ā¸ąā¸”āš„ā¸›" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ŗā¸ĩā¸šā¸šā¸•ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸‚ā¸­ā¸‡ IQ.Pilot āš€ā¸›āš‡ā¸™ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™" +" āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•āšā¸Ĩāš‰ā¸§ā¸ˆā¸°ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šāš„ā¸Ąāšˆāš„ā¸”āš‰" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸ⏚ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸–ā¸­ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´: āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸•āšˆā¸­āš€ā¸™ā¸ˇāšˆā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ — ā¸Ģ⏪ā¸ĩāšˆāšā¸Ē⏇" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "⏛⏴⏔ā¸Ģā¸™āš‰ā¸˛ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"āš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™ā¸•ā¸ąā¸§ā¸•āšˆā¸­ā¸ˆā¸˛ā¸ā¸ˆā¸¸ā¸”ā¸Ģā¸ĸā¸¸ā¸”āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ā¸‚ā¸“ā¸°ā¸‚ā¸ąā¸šā¸•ā¸˛ā¸Ąā¸ā¸˛ā¸Ŗā¸ˆā¸Ŗā¸˛ā¸ˆā¸Ŗ ā¸šā¸™āšā¸žā¸Ĩā¸•ā¸Ÿā¸­ā¸ŖāšŒā¸Ą Subaru " +"⏗ā¸ĩāšˆā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āš€ā¸šā¸•ā¸˛ā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "ā¸„ā¸§ā¸˛ā¸Ąā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸‚ā¸“ā¸°ā¸„ā¸Ŗā¸šā¸‹ā¸„ā¸­ā¸™āš‚ā¸—ā¸Ŗā¸Ĩāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙ā¸Ē⏖⏞⏙⏰" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "ā¸ā¸˛ā¸Ŗāš€ā¸•ā¸ˇā¸­ā¸™ā¸ˆā¸¸ā¸”ā¸­ā¸ąā¸šā¸Ē⏞ā¸ĸ⏕⏞" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "āš€ā¸•ā¸ˇā¸­ā¸™ā¸ˆā¸¸ā¸”ā¸­ā¸ąā¸šā¸Ē⏞ā¸ĸ⏕⏞" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "ā¸Ēā¸ąā¸ā¸Ĩā¸ąā¸ā¸Šā¸“āšŒāš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ā¸—ā¸ĩāšˆāš€ā¸Ŗā¸´āšˆā¸Ąā¸”āš‰ā¸§ā¸ĸāš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "ā¸Ēā¸–ā¸˛ā¸™ā¸°āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "āš‚ā¸Ģā¸Ąā¸”ā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡ā¸•āšˆā¸­ā¸ā¸˛ā¸Ŗāš€ā¸šā¸Ŗā¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"ā¸™ā¸ŗāšā¸–ā¸šā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸ā¸˛ā¸Ŗā¸ˆā¸­ā¸”āšā¸šā¸šā¸ā¸§āš‰ā¸˛ā¸‡ā¸‚ā¸­ā¸‡ā¸­ā¸´ā¸™āš€ā¸—ā¸­ā¸ŖāšŒāš€ā¸Ÿā¸‹ā¸„ā¸Ĩ⏞ā¸Ēā¸Ē⏴⏁⏁ā¸Ĩā¸ąā¸šā¸Ąā¸˛: ⏭⏏⏓ā¸Ģā¸ ā¸šā¸Ąā¸´ ā¸ĸā¸˛ā¸™ā¸žā¸˛ā¸Ģ⏙⏰ " +"āšā¸Ĩ⏰ā¸Ē⏖⏞⏙⏰ Konn3kt āšƒā¸™ā¸žā¸Ŗā¸´ā¸šā¸•ā¸˛" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "ā¸Ĩāš‰ā¸˛ā¸‡" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "ā¸ĸā¸āš€ā¸Ĩ⏴⏁" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "ā¸ĸā¸āš€ā¸Ĩ⏴⏁⏁⏞⏪⏙⏺⏗⏞⏇" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸā¸Ąā¸ˇā¸­ā¸–ā¸ˇā¸­āšā¸šā¸šā¸ˆā¸ŗā¸ā¸ąā¸”ā¸›ā¸Ŗā¸´ā¸Ąā¸˛ā¸“" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸ ā¸˛ā¸Šā¸˛" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸Ŗā¸ĩā¸Ēā¸•ā¸˛ā¸ŖāšŒā¸— IQ.Pilot ā¸Ģā¸˛ā¸ā¸Ŗā¸–āš€ā¸›ā¸´ā¸”ā¸­ā¸ĸā¸šāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šāšā¸Ĩāš‰ā¸§ {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "āš€ā¸Ĩā¸ˇā¸­ā¸āš‚ā¸Ąāš€ā¸”ā¸Ĩ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"āš€ā¸Ĩā¸ˇā¸­ā¸ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧: IQ.Pilot (ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇ IQ + āšā¸šā¸šā¸„ā¸Ŗā¸šā¸§ā¸‡ā¸ˆā¸Ŗ), " +"IQ.Dynamic (ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇ IQ + āš‚ā¸Ģā¸Ąā¸”āš„ā¸”ā¸™ā¸˛ā¸Ąā¸´ā¸), IQ.Chill " +"(ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇ IQ + ā¸šā¸¸ā¸„ā¸Ĩā¸´ā¸ā¸œāšˆā¸­ā¸™ā¸„ā¸Ĩ⏞ā¸ĸ) ā¸Ģ⏪⏎⏭ ACC āš€ā¸”ā¸´ā¸Ąā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸”āš‰ā¸§ā¸ĸā¸•ā¸™āš€ā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Šā¸‚ā¸­ā¸‡āš‚ā¸Ąāš€ā¸”ā¸Ĩ⏗ā¸ĩāšˆāš€ā¸Ĩā¸ˇā¸­ā¸āšā¸Ĩāš‰ā¸§ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āšƒā¸Ģā¸Ąāšˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "⏛⏴⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"⏛⏴⏔ā¸Ĩā¸šā¸›ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāšƒā¸™ā¸Ŗā¸– MEB āšā¸Ĩ⏰ MQB Evo āš‚ā¸”ā¸ĸ IQ.Pilot " +"ā¸ˆā¸°āšā¸āš‰āš„ā¸‚ā¸„ā¸ŗā¸Ēā¸ąāšˆā¸‡ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸•ā¸˛ā¸Ąā¸„ā¸§ā¸˛ā¸Ąāš‚ā¸„āš‰ā¸‡ā¸—ā¸ĩāšˆā¸Ŗā¸–ā¸—ā¸ŗāš„ā¸”āš‰ā¸ˆā¸Ŗā¸´ā¸‡ " +"āšā¸—ā¸™ā¸ā¸˛ā¸Ŗā¸Ēāšˆā¸‡ā¸„ā¸§ā¸˛ā¸Ąāš‚ā¸„āš‰ā¸‡ā¸—ā¸ĩāšˆā¸§ā¸˛ā¸‡āšā¸œā¸™āš„ā¸§āš‰ā¸­ā¸­ā¸āš„ā¸›ā¸•ā¸Ŗā¸‡ āš†" + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "⏄ā¸Ĩā¸˛ā¸§ā¸”āšŒ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "⏄ā¸Ĩā¸˛ā¸§ā¸”āšŒāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "⏧⏴⏔ā¸ĩāš‚ā¸­ā¸šā¸™ā¸„ā¸Ĩā¸˛ā¸§ā¸”āšŒāš„ā¸Ąāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "ā¸„ā¸ŗā¸­ā¸˜ā¸´ā¸šā¸˛ā¸ĸā¸Ēā¸ĩ⏂⏭⏇ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸ā¸˛ā¸Ŗā¸Ŗā¸°ā¸šā¸¸ā¸Ŗā¸¸āšˆā¸™:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "āš‚ā¸Ąāš€ā¸”ā¸Ĩā¸Ŗā¸§ā¸Ą" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"ā¸Ēā¸ąāšˆā¸‡ā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸‚ā¸ąāš‰ā¸™ā¸ā¸˛ā¸Ŗāš€ā¸Ŗāšˆā¸‡ā¸•ā¸˛ā¸Ąā¸Ēā¸„ā¸Ŗā¸´ā¸›ā¸•āšŒāš€ā¸žā¸ˇāšˆā¸­ā¸§ā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡ā¸‚ā¸­ā¸‡ā¸•ā¸ąā¸§ā¸‚ā¸ąā¸šāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™ā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧ " +"ā¸•āš‰ā¸­ā¸‡āšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇ IQ.Pilot āšƒā¸Šāš‰āš€ā¸‰ā¸žā¸˛ā¸°ā¸šā¸™ā¸–ā¸™ā¸™ā¸—ā¸ĩāšˆāš‚ā¸Ĩāšˆā¸‡āšā¸Ĩā¸°ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸ˆā¸Ŗā¸˛ā¸ˆā¸Ŗ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"ā¸Ēā¸ąāšˆā¸‡ā¸Ĩā¸ŗā¸”ā¸ąā¸šā¸‚ā¸ąāš‰ā¸™ā¸ā¸˛ā¸Ŗāš€ā¸Ŗāšˆā¸‡ā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡ā¸•ā¸˛ā¸Ąā¸Ēā¸„ā¸Ŗā¸´ā¸›ā¸•āšŒāš€ā¸žā¸ˇāšˆā¸­ā¸§ā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡ā¸‚ā¸­ā¸‡ā¸•ā¸ąā¸§ā¸‚ā¸ąā¸šāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ" +" āšƒā¸Šāš‰āš€ā¸‰ā¸žā¸˛ā¸°ā¸šā¸™ā¸–ā¸™ā¸™ā¸•ā¸Ŗā¸‡ ā¸Ŗā¸˛ā¸šāš€ā¸Ŗā¸ĩā¸ĸ⏚ āšā¸Ĩā¸°āš‚ā¸Ĩāšˆā¸‡" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸•āšˆā¸­āš€ā¸™ā¸ˇāšˆā¸­ā¸‡" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ą" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸‚ā¸­ā¸‡ IQ.Pilot ā¸•āšˆā¸­ā¸ā¸˛ā¸Ŗā¸ˆā¸ŗā¸ā¸ąā¸”ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ " +"ā¸›ā¸´ā¸”ā¸ˆā¸°ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸„ā¸¸ā¸“ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸ā¸˛ā¸Ŗā¸ˆā¸ŗā¸ā¸ąā¸”ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸ˆā¸°āšā¸Ēā¸”ā¸‡āš€ā¸‰ā¸žā¸˛ā¸°ā¸‚ā¸ĩā¸”ā¸ˆā¸ŗā¸ā¸ąā¸” " +"ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™ā¸ˆā¸°āš€ā¸™āš‰ā¸™ā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸šāš€ā¸Ŗāš‡ā¸§āš€ā¸ā¸´ā¸™ " +"āšā¸Ĩā¸°ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸ˆā¸°ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸—ā¸ĩāšˆā¸•ā¸ąāš‰ā¸‡āš„ā¸§āš‰ā¸•ā¸˛ā¸Ąā¸‚ā¸ĩā¸”ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸§ā¸ˆā¸žā¸š" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "⏔ā¸ļ⏇⏄ā¸ĩā¸ĸāšŒ SSH āš„ā¸Ąāšˆāš„ā¸”āš‰ - ā¸”ā¸šā¸šā¸ąā¸™ā¸—ā¸ļ⏁" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "āš„ā¸Ąāšˆā¸žā¸šā¸Ē⏖⏞⏙⏗ā¸ĩāšˆā¸”ā¸ąā¸‡ā¸ā¸Ĩāšˆā¸˛ā¸§" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ GitHub āš„ā¸Ąāšˆāš„ā¸”āš‰ - ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ GitHub āš„ā¸Ąāšˆāš„ā¸”āš‰ - ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šāš€ā¸§ā¸Ĩā¸˛ā¸‚ā¸­ā¸‡ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "ā¸›ā¸Ŗā¸°āš€ā¸—ā¸¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "ā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸”ā¸‚āš‰ā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "ā¸„āšˆā¸­ā¸ĸ āš† āš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™ā¸•ā¸ąā¸§ā¸ˆā¸˛ā¸ā¸ˆā¸¸ā¸”ā¸Ģā¸ĸā¸¸ā¸”ā¸™ā¸´āšˆā¸‡ (āš€ā¸šā¸•ā¸˛)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "ā¸„āšˆā¸­ā¸ĸ āš† āš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™ā¸•ā¸ąā¸§ā¸ˆā¸˛ā¸ā¸ˆā¸¸ā¸”ā¸Ģā¸ĸā¸¸ā¸”ā¸™ā¸´āšˆā¸‡ — āš€ā¸šā¸Ŗā¸ā¸Ąā¸ˇā¸­āšā¸šā¸šāšā¸Ąā¸™ā¸§ā¸Ĩ (āš€ā¸šā¸•ā¸˛)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "ā¸„ā¸Ŗā¸šā¸‹ā¸„ā¸­ā¸™āš‚ā¸—ā¸Ŗā¸Ĩ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "ā¸•ā¸ąā¸§ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸„ā¸§ā¸˛ā¸Ąāš‚ā¸„āš‰ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "ā¸Ĩ⏚" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸•ā¸ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "ā¸›ā¸ā¸´āš€ā¸Ē⏘" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "ā¸›ā¸ā¸´āš€ā¸Ēā¸˜āšā¸Ĩā¸°ā¸–ā¸­ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™: āš€ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ąā¸˛ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸Ŗā¸°ā¸šā¸šāš„ā¸”āš‰ā¸—ā¸ąā¸™ā¸—ā¸ĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"⏪⏰ā¸ĸ⏰ā¸Ģā¸™āšˆā¸§ā¸‡ā¸āšˆā¸­ā¸™ā¸—ā¸ĩāšˆā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ā¸‹ā¸ļāšˆā¸‡ā¸Ēā¸ąāšˆā¸‡ā¸”āš‰ā¸§ā¸ĸāš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸ˆā¸°āš€ā¸Ŗā¸´āšˆā¸Ąā¸‚ā¸ļāš‰ā¸™āš€ā¸­ā¸‡ — " +"āš€ā¸Ąā¸ˇāšˆā¸­ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ģā¸™āšˆā¸§ā¸‡āšā¸Ĩāš‰ā¸§āš„ā¸Ąāšˆā¸•āš‰ā¸­ā¸‡ā¸‚ā¸ĸā¸ąā¸šā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ " +"(ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ā¸„ā¸ˇā¸­ā¸‚ā¸ĸā¸ąā¸šā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ)
    āšƒā¸Šāš‰āš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āš€ā¸žā¸ˇāšˆā¸­ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰āš€ā¸‰ā¸žā¸˛ā¸°āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ēā¸ ā¸˛ā¸žā¸ˆā¸Ŗā¸˛ā¸ˆā¸Ŗāšā¸Ĩā¸°ā¸–ā¸™ā¸™āš€ā¸­ā¸ˇāš‰ā¸­āšƒā¸Ģāš‰ā¸—ā¸ŗāš„ā¸”āš‰ā¸ˆā¸Ŗā¸´ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "ā¸Ģā¸™āšˆā¸§ā¸‡āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ąā¸ĩā¸Ŗā¸–āšƒā¸™ā¸ˆā¸¸ā¸”ā¸­ā¸ąā¸šā¸Ē⏞ā¸ĸ⏕⏞" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "ā¸Ĩ⏚" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "ā¸Ĩā¸šāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒā¸—ā¸ĩāšˆā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ \"{}\" ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "ā¸Ĩā¸šā¸šā¸ąā¸™ā¸—ā¸ļ⏁⏙ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ˆā¸¸ā¸”ā¸Ģā¸Ąā¸˛ā¸ĸāšā¸Ĩāš‰ā¸§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "ā¸•ā¸Ŗā¸§ā¸ˆā¸žā¸šāš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "ā¸™ā¸ąā¸ā¸žā¸ąā¸’ā¸™ā¸˛" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸•āš‰ā¸­ā¸‡ā¸Ĩā¸‡ā¸—ā¸°āš€ā¸šā¸ĩā¸ĸā¸™ā¸ā¸ąā¸š Konn3kt ⏈ā¸ļā¸‡ā¸ˆā¸°ā¸ˆā¸ąā¸šā¸„ā¸šāšˆāš„ā¸”āš‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "ā¸Ģā¸™āšˆā¸§ā¸‡āš€ā¸§ā¸Ĩā¸˛ā¸āšˆā¸­ā¸™ā¸Ģ⏪ā¸ĩāšˆāšā¸Ē⏇" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "ā¸•ā¸ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ą" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸āšˆā¸­ā¸™ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸‚āš‰ā¸˛āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸āšˆā¸­ā¸™ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸‚āš‰ā¸˛āš‚ā¸Ģā¸Ąā¸”ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąāš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸Ģā¸ĸā¸ĩā¸ĸā¸šā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąāš€ā¸žā¸ˇāšˆā¸­ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąāš€ā¸žā¸ˇāšˆā¸­ā¸Ŗā¸ĩā¸šā¸šā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąāš€ā¸žā¸ˇāšˆā¸­ā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸ⏚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąāš€ā¸žā¸ˇāšˆā¸­{}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ą: ā¸ā¸˛ā¸Ŗāš€ā¸šā¸Ŗā¸ā¸ˆā¸°ā¸›ā¸´ā¸”ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "āšā¸Ēā¸”ā¸‡ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§āš€ā¸›āš‡ā¸™ ā¸ā¸Ą./ā¸Šā¸Ą. āšā¸—ā¸™āš„ā¸Ąā¸ĨāšŒ/ā¸Šā¸Ą." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "⏪⏰ā¸ĸ⏰⏗⏞⏇" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏁ā¸Ĩāš‰ā¸­ā¸‡ā¸œā¸šāš‰ā¸‚ā¸ąā¸šā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "Dongle ID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ — ā¸Ĩ⏭⏇⏭ā¸ĩā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āš„ā¸—ā¸ĨāšŒāšā¸œā¸™ā¸—ā¸ĩāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"ā¸§ā¸˛ā¸”āšā¸–ā¸šā¸•ā¸˛ā¸Ąā¸‚ā¸­ā¸šā¸‹āš‰ā¸˛ā¸ĸāš€ā¸žā¸ˇāšˆā¸­ā¸•ā¸´ā¸”ā¸•ā¸˛ā¸Ąā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāšˆā¸‡āšā¸Ĩā¸°ā¸ā¸˛ā¸Ŗāš€ā¸šā¸Ŗā¸ā¸—ā¸ĩāšˆā¸§ā¸ąā¸”āš„ā¸”āš‰ — " +"ā¸Ēā¸´āšˆā¸‡ā¸—ā¸ĩāšˆā¸Ŗā¸–ā¸ā¸ŗā¸Ĩā¸ąā¸‡ā¸—ā¸ŗā¸ˆā¸Ŗā¸´ā¸‡āšƒā¸™ā¸‚ā¸“ā¸°ā¸™ā¸ĩāš‰ āš„ā¸Ąāšˆāšƒā¸Šāšˆā¸„ā¸ŗā¸Ēā¸ąāšˆā¸‡ā¸ˆā¸˛ā¸ā¸•ā¸ąā¸§ā¸§ā¸˛ā¸‡āšā¸œā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"ā¸§ā¸˛ā¸”āšā¸œā¸™ā¸—ā¸ĩāšˆā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­ā¸ˆā¸˛ā¸āš„ā¸—ā¸ĨāšŒā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šāš„ā¸§āš‰āšƒā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ āš€ā¸Ąā¸ˇāšˆā¸­āšƒā¸Šāš‰ā¸Ŗāšˆā¸§ā¸Ąā¸ā¸ąā¸šāšā¸šā¸šā¸­ā¸­ā¸™āš„ā¸Ĩā¸™āšŒ " +"āš„ā¸—ā¸ĨāšŒā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šāš„ā¸§āš‰ā¸ˆā¸°ā¸—ā¸ŗā¸‡ā¸˛ā¸™āšā¸—ā¸™ā¸—ā¸ąā¸™ā¸—ā¸ĩ⏗ā¸ĩāšˆā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ā¸Ģā¸Ĩ⏏⏔ " +"āš„ā¸—ā¸ĨāšŒā¸ˆā¸°ā¸–ā¸šā¸ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”ā¸•ā¸˛ā¸Ąā¸ ā¸šā¸Ąā¸´ā¸ ā¸˛ā¸„ā¸—ā¸ĩāšˆā¸„ā¸¸ā¸“āš€ā¸Ĩ⏎⏭⏁" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "⏁ā¸Ĩāš‰ā¸­ā¸‡ā¸œā¸šāš‰ā¸‚ā¸ąā¸š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚⏁ā¸Ĩāš‰ā¸­ā¸‡ā¸œā¸šāš‰ā¸‚ā¸ąā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸Ąā¸ˇāšˆā¸­ā¸œā¸šāš‰ā¸‚ā¸ąā¸šāš€ā¸‚āš‰ā¸˛āšā¸—ā¸Ŗā¸" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "ā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡ā¸‚ā¸“ā¸°ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "ā¸šā¸¸ā¸„ā¸Ĩā¸´ā¸ā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "āš„ā¸”ā¸™ā¸˛ā¸Ąā¸´ā¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šā¸ˆā¸šā¸™āšā¸šā¸šāš„ā¸”ā¸™ā¸˛ā¸Ąā¸´ā¸: ā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡ā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡āšā¸Ĩā¸°āš€ā¸šā¸Ŗā¸ā¸‰ā¸ąā¸šāš„ā¸§ā¸‚ā¸ļāš‰ā¸™" + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "āšā¸āš‰āš„ā¸‚" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ Always on Lateral (AOL) " +"⏛⏴⏔ā¸Ēā¸§ā¸´ā¸•ā¸ŠāšŒā¸™ā¸ĩāš‰āš€ā¸žā¸ˇāšˆā¸­ā¸ā¸Ĩā¸ąā¸šāš„ā¸›āšƒā¸Šāš‰ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸ā¸˛ā¸Ŗāš€ā¸Ŗā¸´āšˆā¸Ąā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āš€ā¸”ā¸´ā¸Ąā¸‚ā¸­ā¸‡ IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "āš€ā¸›ā¸´ā¸”ā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸•ā¸´ā¸”ā¸Ŗā¸–ā¸ĸā¸™ā¸•āšŒ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāš€ā¸•ā¸ˇā¸­ā¸™ā¸­ā¸­ā¸ā¸™ā¸­ā¸ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸Ĩāš‡ā¸­ā¸ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāšā¸šā¸š MQB āšƒā¸™ā¸Ŗā¸– Volkswagen MQB ⏗ā¸ĩāšˆā¸Ąā¸ĩ⏭⏞⏁⏞⏪ LKAS " +"ā¸‚ā¸ąā¸”ā¸‚āš‰ā¸­ā¸‡ā¸—ā¸ĩāšˆā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸•āšˆā¸ŗ" + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "āš€ā¸›ā¸´ā¸”āš‚ā¸Ŗā¸Ąā¸Ąā¸´āšˆā¸‡" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸›ā¸Ĩāšˆā¸­ā¸ĸā¸Ēā¸ąā¸ā¸ā¸˛ā¸“" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸œā¸šāš‰ā¸‚ā¸ąā¸šāšā¸Ąāš‰āšƒā¸™ā¸‚ā¸“ā¸°ā¸—ā¸ĩāšˆ IQ.Pilot āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "ā¸›āš‰ā¸­ā¸™ APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēāš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ē" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "ā¸›āš‰ā¸­ā¸™ SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "ā¸›āš‰ā¸­ā¸™ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸Ģ⏪⏎⏭ā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸ā¸˛ā¸Ŗā¸›ā¸Ĩāšˆā¸­ā¸ĸā¸Ēā¸ąā¸ā¸ā¸˛ā¸“āšƒā¸Ģā¸Ąāšˆ" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰ GitHub ⏂⏭⏇⏄⏏⏓" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "āšā¸–ā¸šā¸Ēā¸–ā¸˛ā¸™ā¸°āšā¸šā¸šā¸‚ā¸ĸ⏞ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "MPC ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛āšā¸šā¸šā¸—ā¸”ā¸Ĩ⏭⏇" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"āšā¸Ē⏔⏇ā¸Ēā¸ŗāš€ā¸™ā¸˛ā¸„ā¸Ĩ⏴⏛⏁ā¸Ĩāš‰ā¸­ā¸‡ā¸•ā¸´ā¸”ā¸Ŗā¸–ā¸ĸā¸™ā¸•āšŒāšā¸Ĩā¸°ā¸šā¸ąā¸™ā¸—ā¸ļ⏁ā¸Ĩāšˆā¸˛ā¸Ēā¸¸ā¸”āš€ā¸›āš‡ā¸™āš„ā¸”ā¸Ŗā¸ŸāšŒ USB " +"āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ā¸ā¸ąā¸šā¸„ā¸­ā¸Ąā¸žā¸´ā¸§āš€ā¸•ā¸­ā¸ŖāšŒ IQ.Pilot ā¸ĸā¸ąā¸‡ā¸„ā¸‡ā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸•āšˆā¸­ā¸‚ā¸“ā¸°āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁⏙ā¸ĩāš‰" + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ĩā¸ˇā¸Ąāš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"⏂⏓⏰⏙ā¸ĩāš‰ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸā¸˛ā¸§āš€ā¸”ā¸´ā¸Ąā¸‚ā¸­ā¸‡ Toyota āš€ā¸Ĩā¸ˇā¸­ā¸āš‚ā¸Ģā¸Ąā¸”ā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇ IQ " +"āš€ā¸žā¸ˇāšˆā¸­ā¸›ā¸´ā¸”āšƒā¸Šāš‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šā¸ˆā¸šā¸™ā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸā¸˛ā¸§ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸ļā¸‡āšā¸œā¸™ā¸—ā¸ĩāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸ļā¸‡āšā¸œā¸™ā¸—ā¸ĩāšˆ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™ā¸Ēā¸¸ā¸”ā¸—āš‰ā¸˛ā¸ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "ā¸„āš‰ā¸™ā¸Ģ⏞ā¸ĸā¸˛ā¸™ā¸žā¸˛ā¸Ģ⏙⏰⏂⏭⏇⏄⏏⏓" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšƒā¸Ģāš‰āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"āšā¸Ēā¸”ā¸‡ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™ā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡ā¸—ā¸¸ā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡ā¸—ā¸ĩāšˆā¸Ŗā¸–ā¸Ŗā¸˛ā¸ĸā¸‡ā¸˛ā¸™ā¸§āšˆā¸˛ā¸Ąā¸ĩā¸Ēā¸´āšˆā¸‡āšƒā¸”ā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸ˆā¸¸ā¸”ā¸­ā¸ąā¸šā¸Ē⏞ā¸ĸ⏕⏞⏂⏭⏇⏄⏏⏓ " +"(āš€ā¸‰ā¸žā¸˛ā¸°ā¸Ŗā¸–ā¸—ā¸ĩāšˆā¸Ąā¸ĩ BSM)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "āš€ā¸›ā¸´ā¸”āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩā¸˛ā¸ˆā¸˛ā¸āšā¸œā¸‡ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ ā¸Ģā¸Ŗā¸ˇā¸­ā¸”ā¸ąā¸šāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ŗā¸– āš€ā¸žā¸ˇāšˆā¸­āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "⏪⏰ā¸ĸā¸°ā¸•ā¸˛ā¸Ąā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "ā¸—ā¸ŗā¸•ā¸˛ā¸Ąā¸„ā¸ŗāšā¸™ā¸°ā¸™ā¸ŗāšƒā¸™āšā¸­ā¸›āš€ā¸žā¸ˇāšˆā¸­ā¸ˆā¸ąā¸šā¸„ā¸šāšˆāšƒā¸Ģāš‰āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāšƒā¸Ģāš‰ IQ.Pilot āš€ā¸‚āš‰ā¸˛āš‚ā¸Ģā¸Ąā¸”ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆāš€ā¸›āš‡ā¸™āš€ā¸§ā¸Ĩ⏞ 10 ⏙⏞⏗ā¸ĩā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ " +"ā¸Ŗā¸°ā¸šā¸šā¸ˆā¸°āš€ā¸›ā¸´ā¸”āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩā¸˛āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ āšā¸Ĩ⏰⏈⏰⏁ā¸Ĩā¸ąā¸šā¸Ēā¸šāšˆāš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ģā¸Ąā¸”āš€ā¸§ā¸Ĩ⏞" + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāšƒā¸Šāš‰ā¸­ā¸´ā¸™āš€ā¸—ā¸­ā¸ŖāšŒāš€ā¸Ÿā¸‹ Mici" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸‚āš‰ā¸˛āš‚ā¸Ģā¸Ąā¸”ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ (10 ⏙⏞⏗ā¸ĩ)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸‚āš‰ā¸˛āš‚ā¸Ģā¸Ąā¸”ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆāš„ā¸”āš‰āš€ā¸‰ā¸žā¸˛ā¸°ā¸‚ā¸“ā¸°ā¸­ā¸ĸā¸šāšˆāšƒā¸™āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "" +"ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸‚āš‰ā¸˛āš‚ā¸Ģā¸Ąā¸”ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸­ā¸ĸā¸šāšˆāšā¸Ĩāš‰ā¸§ ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸•ā¸ąā¸§ā¸ˆā¸ąā¸šāš€ā¸§ā¸Ĩā¸˛āš€ā¸›āš‡ā¸™ 10 ⏙⏞⏗ā¸ĩā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸‚āš‰ā¸˛āš‚ā¸Ģā¸Ąā¸”ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆā¸ā¸ŗā¸Ĩā¸ąā¸‡ā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "ā¸Ĩā¸ˇā¸Ąāš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "ā¸Ĩā¸ˇā¸Ąāš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ Wi-Fi \"{}\" ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "⏛⏁⏕⏴" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "⏁⏞⏪ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸•ā¸ąā¸§ā¸•ā¸™ Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "āš‚ā¸—āš€ā¸„āš‡ā¸™ / ⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "ā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰ Git" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "āš€ā¸ā¸´ā¸”ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”ā¸ˆā¸˛ā¸ GitHub ({}) ⏂⏓⏰⏔ā¸ļ⏇⏄ā¸ĩā¸ĸāšŒ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "ā¸Ēā¸šā¸‡" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ⏗ā¸ĩāšˆā¸‹āšˆā¸­ā¸™ā¸­ā¸ĸā¸šāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "⏊⏰ā¸Ĩā¸­ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ąā¸ĩā¸Ŗā¸–āšƒā¸™ā¸ˆā¸¸ā¸”ā¸­ā¸ąā¸šā¸Ē⏞ā¸ĸ⏕⏞" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "ā¸–ā¸ˇā¸­āšƒā¸Ģāš‰ā¸™ā¸´āšˆā¸‡..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"⏊⏰ā¸Ĩā¸­ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ā¸‚ā¸“ā¸°ā¸—ā¸ĩāšˆā¸Ŗā¸°ā¸šā¸šā¸•ā¸Ŗā¸§ā¸ˆā¸ˆā¸ąā¸šā¸ˆā¸¸ā¸”ā¸­ā¸ąā¸šā¸Ē⏞ā¸ĸ⏕⏞⏪⏞ā¸ĸā¸‡ā¸˛ā¸™ā¸§āšˆā¸˛ā¸Ąā¸ĩ⏪⏖⏭ā¸ĸā¸šāšˆāšƒā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡āš€ā¸›āš‰ā¸˛ā¸Ģā¸Ąā¸˛ā¸ĸ" +" āšā¸Ĩ⏰⏛ā¸Ĩāšˆā¸­ā¸ĸāšƒā¸Ģāš‰ā¸—ā¸ŗā¸‡ā¸˛ā¸™āš€ā¸Ąā¸ˇāšˆā¸­ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ā¸§āšˆā¸˛ā¸‡" + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "ā¸šāš‰ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "ā¸Šā¸ąāšˆā¸§āš‚ā¸Ąā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "⏪⏰ā¸ĸā¸°āš€ā¸§ā¸Ĩ⏞⏗ā¸ĩāšˆā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ˆā¸°ā¸­ā¸ĸā¸šāšˆā¸™ā¸´āšˆā¸‡āš„ā¸”āš‰ā¸āšˆā¸­ā¸™ā¸›ā¸´ā¸”ā¸•ā¸ąā¸§āš€ā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"āš€ā¸§ā¸Ĩ⏞ā¸Ĩāšˆā¸§ā¸‡ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆā¸ˆā¸°āš€ā¸žā¸´āšˆā¸Ąā¸ˆā¸˛ā¸ā¸„ā¸§ā¸˛ā¸Ąā¸Ģā¸™āšˆā¸§ā¸‡ā¸‚ā¸­ā¸‡āšā¸Ŗāš‡ā¸„ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸā¸‚ā¸­ā¸‡ā¸Ŗā¸–āš€ā¸­ā¸‡ā¸‚ā¸“ā¸°ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" +" ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ā¸„ā¸ˇā¸­ 0.2 ⏧⏴⏙⏞⏗ā¸ĩ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "⏗ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆ IP" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "⏁⏞⏪ā¸Ģā¸ĸā¸¸ā¸”ā¸šā¸ąā¸‡ā¸„ā¸ąā¸š IQ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "āš‚ā¸Ģā¸Ąā¸” IQ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"āš‚ā¸Ģā¸Ąā¸”ā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇ IQ āš„ā¸Ąāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸™ā¸ĩāš‰ ACC " +"āš€ā¸”ā¸´ā¸Ąā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™āš€ā¸›āš‡ā¸™ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸āš€ā¸”ā¸ĩā¸ĸ⏧⏗ā¸ĩāšˆāšƒā¸Šāš‰āš„ā¸”āš‰" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic ā¸—ā¸˛ā¸‡āš‚ā¸„āš‰ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸•āšˆā¸ŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic ⏁⏞⏪ā¸Ģā¸ĸā¸¸ā¸”ā¸‚ā¸­ā¸‡āš‚ā¸Ąāš€ā¸”ā¸Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic ā¸Ē⏺⏪⏭⏇ SLC" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛ā¸Šāš‰ā¸˛ā¸ā¸§āšˆā¸˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛ā¸Ģā¸ĸā¸¸ā¸”ā¸™ā¸´āšˆā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ IQ.OS" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot āš„ā¸Ąāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"IQ.Pilot ā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸ⏚⏭ā¸ĸāšˆā¸˛ā¸‡ā¸•āšˆā¸­āš€ā¸™ā¸ˇāšˆā¸­ā¸‡ ⏈ā¸ļā¸‡āšā¸—ā¸šāš„ā¸Ąāšˆā¸ˆā¸ŗāš€ā¸›āš‡ā¸™ā¸•āš‰ā¸­ā¸‡ā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸• " +"⏁⏞⏪⏪ā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸ⏚⏈⏰⏪ā¸ĩā¸Ēā¸•ā¸˛ā¸ŖāšŒā¸— IQ.Pilot ā¸Ģā¸˛ā¸ā¸Ŗā¸–āš€ā¸›ā¸´ā¸”ā¸­ā¸ĸā¸šāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"IQ.Pilot ā¸•āš‰ā¸­ā¸‡ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāšƒā¸Ģāš‰ā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸Ŗā¸°ā¸ĸ⏰ 4° ā¸—ā¸˛ā¸‡ā¸‹āš‰ā¸˛ā¸ĸā¸Ģ⏪⏎⏭⏂⏧⏞ āšā¸Ĩ⏰ 5° ⏂ā¸ļāš‰ā¸™ā¸Ģ⏪⏎⏭ " +"9° ā¸Ĩ⏇" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"ā¸Ģā¸˛ā¸ā¸„ā¸¸ā¸“ā¸‚ā¸ąā¸šā¸—ā¸ĩāšˆā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ 20 āš„ā¸Ąā¸ĨāšŒ/ā¸Šā¸Ą. (32 ā¸ā¸Ą./ā¸Šā¸Ą.) ā¸Ģā¸Ŗā¸ˇā¸­ā¸•āšˆā¸ŗā¸ā¸§āšˆā¸˛ āšā¸Ĩā¸°āš€ā¸›ā¸´ā¸”āš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āš„ā¸§āš‰" +" ā¸Ŗā¸–ā¸ˆā¸°ā¸§ā¸˛ā¸‡āšā¸œā¸™āš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āš„ā¸›āšƒā¸™ā¸—ā¸´ā¸¨ā¸—ā¸˛ā¸‡ā¸™ā¸ąāš‰ā¸™ā¸—ā¸ĩāšˆāš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸‹ā¸ļāšˆā¸‡ā¸‚ā¸ąā¸šā¸œāšˆā¸˛ā¸™āš„ā¸”āš‰āšƒā¸ā¸Ĩāš‰ā¸—ā¸ĩāšˆā¸Ē⏏⏔ " +"ā¸Šāšˆā¸§ā¸ĸā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸Ēā¸–ā¸˛ā¸™ā¸ā¸˛ā¸Ŗā¸“āšŒ (āš€ā¸Šāšˆā¸™ ⏗ā¸ĩāšˆāš„ā¸Ÿāšā¸”ā¸‡) ⏗ā¸ĩāšˆā¸Ŗā¸–ā¸­ā¸˛ā¸ˆā¸§ā¸˛ā¸‡āšā¸œā¸™āš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸œā¸´ā¸”ā¸—ā¸´ā¸¨ā¸—ā¸˛ā¸‡" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "āšƒā¸Ēāšˆā¸‹ā¸´ā¸Ąā¸ā¸˛ā¸ŖāšŒā¸” comma ā¸‚ā¸­ā¸‡āšā¸—āš‰ā¸—ā¸ĩāšˆā¸Ąā¸˛ā¸žā¸Ŗāš‰ā¸­ā¸Ąā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "QR āš‚ā¸„āš‰ā¸”āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "ā¸ā¸Ą." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "KONN3KT ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT ā¸­ā¸­ā¸Ÿāš„ā¸Ĩā¸™āšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "āšƒā¸Ģāš‰ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸­ā¸ĸā¸šāšˆāšƒā¸™āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "ā¸„ā¸‡ā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡āšā¸Ĩā¸°āš€ā¸šā¸Ŗā¸āš€ā¸”ā¸´ā¸Ąā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"⏛ā¸Ĩāšˆā¸­ā¸ĸāšƒā¸Ģāš‰ā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡āšā¸Ĩā¸°āš€ā¸šā¸Ŗā¸āš€ā¸›āš‡ā¸™ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆā¸‚ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸š Toyota āš€ā¸”ā¸´ā¸Ąā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™ IQ.Pilot " +"⏗⏺ā¸Ģā¸™āš‰ā¸˛ā¸—ā¸ĩāšˆā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™" + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸‚ā¸­ā¸‡ Konn3kt:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "ā¸Ē⏖⏞⏙⏰ Konn3kt:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "⏂ā¸ĩā¸”ā¸ˆā¸ŗā¸ā¸ąā¸”" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "ā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡āš€ā¸Ąā¸ˇāšˆā¸­ā¸„ā¸Ŗā¸šā¸‹ā¸„ā¸­ā¸™āš‚ā¸—ā¸Ŗā¸Ĩā¸‚ā¸ąā¸”ā¸‚āš‰ā¸­ā¸‡" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "āš‚ā¸Ģā¸Ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģā¸§ā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸­āšˆā¸˛ā¸™āš„ā¸”āš‰ā¸‚ā¸­ā¸‡ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩ⏞⏕⏭⏙⏙ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”āšā¸šā¸šā¸šā¸ąā¸‡ā¸„ā¸ąā¸šā¸•ā¸­ā¸™ā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"āšƒā¸Ģāš‰ IQ.Pilot ā¸§ā¸ąā¸”ā¸§āšˆā¸˛ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āšƒā¸Šāš‰āš€ā¸§ā¸Ĩā¸˛ā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡ā¸™ā¸˛ā¸™āš€ā¸—āšˆā¸˛āšƒā¸” " +"āšā¸Ĩ⏰⏄⏭ā¸ĸā¸›ā¸Ŗā¸ąā¸šā¸„āšˆā¸˛ā¸™ā¸ĩāš‰āšƒā¸Ģāš‰āš€ā¸›āš‡ā¸™ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™ ā¸›ā¸´ā¸”āš€ā¸žā¸ˇāšˆā¸­ā¸ā¸ŗā¸Ģā¸™ā¸”ā¸„āšˆā¸˛āš€ā¸§ā¸Ĩā¸˛ā¸”āš‰ā¸§ā¸ĸā¸•ā¸™āš€ā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "āšƒā¸Ģāš‰ā¸„ā¸¸ā¸“ā¸‚ā¸ĸā¸ąā¸šā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸā¸‚ā¸“ā¸°ā¸Ŗā¸°ā¸šā¸šā¸—ā¸ŗā¸‡ā¸˛ā¸™āš„ā¸”āš‰āš‚ā¸”ā¸ĸāš„ā¸Ąāšˆā¸›ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "ā¸ā¸˛ā¸Ŗā¸–āšˆā¸˛ā¸ĸ⏗⏭⏔ā¸Ē⏔" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔ %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔⏧⏴⏔ā¸ĩāš‚ā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš‚ā¸Ģā¸Ĩ⏔..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ŗā¸°ā¸šā¸¸ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "ā¸Ĩāš‡ā¸­ā¸āš€ā¸›āš‡ā¸™ā¸›ā¸´ā¸”ā¸šā¸™āšā¸žā¸Ĩā¸•ā¸Ÿā¸­ā¸ŖāšŒā¸Ąā¸™ā¸ĩāš‰ ā¸Ŗā¸–āš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸­ā¸ˇāšˆā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"āš‚ā¸Ģā¸Ąā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧:
    ⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸‚ā¸­ā¸‡ IQ.Pilot " +"ā¸Ąā¸ĩā¸”ā¸ąā¸‡ā¸™ā¸ĩāš‰:

    ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸā¸˛ā¸§āšā¸šā¸šā¸„ā¸Ŗā¸šā¸§ā¸‡ā¸ˆā¸Ŗā¸‚ā¸­ā¸‡ " +"IQ.Pilot


    āšƒā¸Ģāš‰āš‚ā¸Ąāš€ā¸”ā¸Ĩā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡āšā¸Ĩā¸°āš€ā¸šā¸Ŗā¸ IQ.Pilot " +"ā¸ˆā¸°ā¸‚ā¸ąā¸šā¸•ā¸˛ā¸Ąā¸—ā¸ĩāšˆā¸„ā¸´ā¸”ā¸§āšˆā¸˛ā¸Ąā¸™ā¸¸ā¸Šā¸ĸāšŒā¸ˆā¸°ā¸‚ā¸ąā¸š ā¸Ŗā¸§ā¸Ąā¸–ā¸ļ⏇⏁⏞⏪ā¸Ģā¸ĸ⏏⏔⏗ā¸ĩāšˆāš„ā¸Ÿāšā¸”ā¸‡āšā¸Ĩā¸°ā¸›āš‰ā¸˛ā¸ĸā¸Ģā¸ĸ⏏⏔ " +"āš€ā¸™ā¸ˇāšˆā¸­ā¸‡ā¸ˆā¸˛ā¸āš‚ā¸Ąāš€ā¸”ā¸Ĩā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆāš€ā¸›āš‡ā¸™ā¸œā¸šāš‰ā¸ā¸ŗā¸Ģā¸™ā¸”ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ " +"ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸—ā¸ĩāšˆā¸•ā¸ąāš‰ā¸‡āš„ā¸§āš‰ā¸ˆā¸ļā¸‡āš€ā¸›āš‡ā¸™āš€ā¸žā¸ĩā¸ĸ⏇⏂ā¸ĩā¸”ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸Ēā¸šā¸‡ā¸Ēā¸¸ā¸”āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ " +"⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸™ā¸ĩāš‰ā¸ĸā¸ąā¸‡ā¸­ā¸ĸā¸šāšˆā¸Ŗā¸°ā¸Ģā¸§āšˆā¸˛ā¸‡ā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ " +"⏈ā¸ļā¸‡ā¸­ā¸˛ā¸ˆāš€ā¸ā¸´ā¸”ā¸„ā¸§ā¸˛ā¸Ąā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”āš„ā¸”āš‰

    IQ.Dynamic


    ⏜ā¸Ēā¸Ąā¸œā¸Ēā¸˛ā¸™ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸‚ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸šā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āšā¸šā¸šā¸›ā¸Ŗā¸ąā¸šāš„ā¸”āš‰ā¸ā¸ąā¸šā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąāšā¸šā¸šā¸„ā¸Ŗā¸šā¸§ā¸‡ā¸ˆā¸Ŗā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸ĸ⏎⏔ā¸Ģā¸ĸā¸¸āšˆā¸™ā¸•ā¸˛ā¸Ąā¸Ēā¸ ā¸˛ā¸žāšā¸§ā¸”ā¸Ĩāš‰ā¸­ā¸Ąāšā¸Ĩā¸°ā¸šā¸Ŗā¸´ā¸šā¸—

    IQ.Chill


    āšƒā¸Šāš‰ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸„ā¸Ŗā¸šā¸‹ā¸„ā¸­ā¸™āš‚ā¸—ā¸Ŗā¸Ĩā¸Ąā¸˛ā¸•ā¸Ŗā¸ā¸˛ā¸™ā¸—ā¸ĩāšˆā¸•ā¸­ā¸šā¸Ēā¸™ā¸­ā¸‡ā¸•āšˆā¸­ā¸ā¸˛ā¸Ŗā¸ˆā¸Ŗā¸˛ā¸ˆā¸Ŗā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧

    ā¸ā¸˛ā¸Ŗāšā¸Ēā¸”ā¸‡ā¸œā¸Ĩā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆāšā¸šā¸šāšƒā¸Ģā¸Ąāšˆ


    ā¸ā¸˛ā¸Ŗāšā¸Ēā¸”ā¸‡ā¸œā¸Ĩā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆā¸ˆā¸°āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš„ā¸›āšƒā¸Šāš‰ā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸Ąā¸¸ā¸Ąā¸ā¸§āš‰ā¸˛ā¸‡ā¸—ā¸ĩāšˆā¸Ģā¸ąā¸™āš„ā¸›ā¸—ā¸˛ā¸‡ā¸–ā¸™ā¸™āš€ā¸Ąā¸ˇāšˆā¸­ā¸‚ā¸ąā¸šā¸”āš‰ā¸§ā¸ĸā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸•āšˆā¸ŗ" +" āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰āš€ā¸Ģāš‡ā¸™ā¸—ā¸˛ā¸‡āš‚ā¸„āš‰ā¸‡ā¸šā¸˛ā¸‡āšā¸Ģāšˆā¸‡āš„ā¸”āš‰ā¸Šā¸ąā¸”āš€ā¸ˆā¸™ā¸‚ā¸ļāš‰ā¸™ āšā¸Ĩā¸°ā¸ˆā¸°āšā¸Ēā¸”ā¸‡āš‚ā¸Ĩāš‚ā¸āš‰ IQ.Pilot " +"⏗ā¸ĩāšˆā¸Ąā¸¸ā¸Ąā¸‚ā¸§ā¸˛ā¸šā¸™ā¸”āš‰ā¸§ā¸ĸ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "āš‚ā¸Ģā¸Ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģā¸§ā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šā¸ˆā¸šā¸™ā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "ā¸Ąā¸­ā¸‡ā¸Ĩāšˆā¸§ā¸‡ā¸Ģā¸™āš‰ā¸˛ā¸Ąā¸˛ā¸ā¸‚ā¸ļāš‰ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "ā¸Ąā¸­ā¸‡ā¸Ĩāšˆā¸§ā¸‡ā¸Ģā¸™āš‰ā¸˛ā¸™āš‰ā¸­ā¸ĸā¸Ĩ⏇" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "ā¸ā¸˛ā¸Ŗā¸§ā¸˛ā¸‡āšā¸œā¸™āš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧⏗ā¸ĩāšˆā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸•āšˆā¸ŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"ā¸ā¸Ŗā¸­ā¸‡ā¸„ā¸§ā¸˛ā¸Ąāš‚ā¸„āš‰ā¸‡ā¸—ā¸ĩāšˆā¸§ā¸˛ā¸‡āšā¸œā¸™āš„ā¸§āš‰ā¸”āš‰ā¸§ā¸ĸā¸•ā¸ąā¸§ā¸ā¸Ŗā¸­ā¸‡ā¸„ā¸§ā¸˛ā¸Ąā¸–ā¸ĩāšˆā¸•āšˆā¸ŗā¸āšˆā¸­ā¸™ā¸Ēāšˆā¸‡āš„ā¸›ā¸ĸā¸ąā¸‡āšā¸Ŗāš‡ā¸„ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāšƒā¸™ā¸Ŗā¸– " +"MEB āšā¸Ĩ⏰ MQB Evo āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩ⏔⏭⏞⏁⏞⏪ā¸Ēāšˆā¸˛ā¸ĸā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡ " +"āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āš‚ā¸”ā¸ĸā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ŗā¸–āš€ā¸Ģā¸Ĩāšˆā¸˛ā¸™ā¸ĩāš‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "ā¸”āš‰ā¸§ā¸ĸā¸•ā¸™āš€ā¸­ā¸‡" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "ā¸Ēā¸šā¸‡ā¸Ē⏏⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "⏁⏞⏪⏁ā¸Ĩā¸ąā¸šā¸Ąā¸˛ā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸‚ā¸­ā¸‡ ACC āšā¸šā¸š MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "⏁⏞⏪⏁ā¸Ĩā¸ąā¸šā¸Ąā¸˛ā¸—ā¸ŗā¸‡ā¸˛ā¸™ā¸‚ā¸­ā¸‡ ACC MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "⏁⏞⏪ā¸Ĩāš‡ā¸­ā¸ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāšā¸šā¸š MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "⏁⏞⏪ā¸Ĩāš‡ā¸­ā¸ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "ā¸ā¸˛ā¸Ŗā¸šā¸ŗā¸Ŗā¸¸ā¸‡ā¸Ŗā¸ąā¸ā¸Šā¸˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "ā¸„āšˆā¸˛ā¸Šā¸”āš€ā¸Šā¸ĸā¸„ā¸§ā¸˛ā¸Ąā¸Ģā¸™āšˆā¸§ā¸‡āšā¸šā¸šā¸ā¸ŗā¸Ģā¸™ā¸”āš€ā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "ā¸ā¸˛ā¸™ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸œā¸™ā¸—ā¸ĩāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸§ā¸ąā¸”āš„ā¸”āš‰:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "āš„ā¸Ąā¸ĨāšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "āšā¸Ēā¸”ā¸‡āš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸‚ā¸­ā¸‡ā¸Ŗā¸–āš€ā¸›āš‡ā¸™ā¸Ĩā¸šā¸ā¸¨ā¸Ŗā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "āš€ā¸§ā¸Ĩ⏞ā¸Ģā¸ĸā¸¸ā¸”ā¸‚ā¸­ā¸‡āš‚ā¸Ąāš€ā¸”ā¸Ĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "āš‚ā¸Ąāš€ā¸”ā¸Ĩ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "āš„ā¸Ąāšˆā¸Ąā¸ĩ PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "āš„ā¸Ąāšˆā¸Ąā¸ĩ" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "⏁⏞⏪⏙⏺⏗⏞⏇" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "ā¸ĸā¸āš€ā¸Ĩā¸´ā¸ā¸ā¸˛ā¸Ŗā¸™ā¸ŗā¸—ā¸˛ā¸‡āšā¸Ĩāš‰ā¸§" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "āšƒā¸ā¸Ĩāš‰" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "āš‚ā¸„ā¸Ŗā¸‡ā¸‚āšˆā¸˛ā¸ĸ⏛⏪⏰ā¸Ē⏞⏗ FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "ā¸ā¸˛ā¸Ŗā¸›āš‰ā¸­ā¸™āš„ā¸›ā¸‚āš‰ā¸˛ā¸‡ā¸Ģā¸™āš‰ā¸˛ā¸”āš‰ā¸§ā¸ĸāš‚ā¸„ā¸Ŗā¸‡ā¸‚āšˆā¸˛ā¸ĸ⏛⏪⏰ā¸Ē⏞⏗ (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "āš„ā¸Ąāšˆā¸žā¸ąā¸āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡āš€ā¸Ĩā¸ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "āš„ā¸Ąāšˆā¸•āš‰ā¸­ā¸‡ā¸‚ā¸ĸā¸ąā¸šā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "āš„ā¸Ąāšˆā¸žā¸š QR āš‚ā¸„āš‰ā¸”" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "āš„ā¸Ąāšˆā¸žā¸šā¸„ā¸ĩā¸ĸāšŒ SSH ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸œā¸šāš‰āšƒā¸Šāš‰ '{}'" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "āš„ā¸Ąāšˆā¸žā¸šāš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ Wi-Fi" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "āš„ā¸Ąāšˆā¸žā¸šā¸ā¸Ĩāš‰ā¸­ā¸‡āšƒā¸™āš‚ā¸Ģā¸Ąā¸”ā¸™ā¸ąā¸ā¸žā¸ąā¸’ā¸™ā¸˛ āšā¸•ā¸°ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šāš€ā¸žā¸ˇāšˆā¸­ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸­" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩ⏇" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "āš„ā¸Ąāšˆā¸Ąā¸ĩ⏜ā¸Ĩā¸Ĩā¸ąā¸žā¸˜āšŒ" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "āš„ā¸Ąāšˆā¸Ąā¸ĩāš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸—ā¸ĩāšˆā¸šā¸ąā¸™ā¸—ā¸ļā¸āš„ā¸§āš‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ĸā¸˛ā¸™ā¸žā¸˛ā¸Ģ⏙⏰" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "āš„ā¸Ąāšˆā¸Ąā¸ĩ⏧⏴⏔ā¸ĩāš‚ā¸­ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸™ā¸ĩāš‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"āš‚ā¸”ā¸ĸā¸›ā¸ā¸•ā¸´ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģ⏧ā¸Ģ⏙ā¸ļāšˆā¸‡ā¸„ā¸Ŗā¸ąāš‰ā¸‡ā¸ˆā¸°ā¸ˆā¸šā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ " +"āšā¸Ąāš‰ā¸ĸā¸ąā¸‡āš€ā¸›ā¸´ā¸”āš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸„āš‰ā¸˛ā¸‡āš„ā¸§āš‰ " +"āš€ā¸›ā¸´ā¸”ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁⏙ā¸ĩāš‰āš€ā¸žā¸ˇāšˆā¸­āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ā¸•āšˆā¸­āš€ā¸™ā¸ˇāšˆā¸­ā¸‡ā¸‚ā¸“ā¸°ā¸—ā¸ĩāšˆāš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧ā¸ĸā¸ąā¸‡āš€ā¸›ā¸´ā¸”ā¸­ā¸ĸā¸šāšˆ — " +"āšā¸•āšˆā¸Ĩā¸°ā¸„ā¸Ŗā¸ąāš‰ā¸‡ā¸–ā¸ąā¸”āš„ā¸›ā¸ĸā¸ąā¸‡ā¸„ā¸‡ā¸•āš‰ā¸­ā¸‡ā¸‚ā¸ĸā¸ąā¸šā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "āšƒā¸Šāš‰āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸šā¸™āšā¸žā¸Ĩā¸•ā¸Ÿā¸­ā¸ŖāšŒā¸Ą Subaru ⏙ā¸ĩāš‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "āš„ā¸Ąāšˆāš„ā¸”āš‰āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ģ⏕⏏: āšƒā¸™ā¸Ŗā¸–ā¸—ā¸ĩāšˆāš„ā¸Ąāšˆā¸Ąā¸ĩā¸›ā¸¸āšˆā¸Ą LFA/LKAS " +"ā¸ā¸˛ā¸Ŗā¸›ā¸´ā¸”ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁⏙ā¸ĩāš‰ā¸ˆā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āš„ā¸Ąāšˆāš€ā¸•ā¸Ŗā¸ĩā¸ĸā¸Ąā¸žā¸Ŗāš‰ā¸­ā¸Ąāš€ā¸Ąā¸ˇāšˆā¸­ā¸Ēā¸–ā¸˛ā¸™ā¸°ā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸‚ā¸­ā¸‡ā¸„ā¸Ŗā¸šā¸‹ā¸„ā¸­ā¸™āš‚ā¸—ā¸Ŗā¸Ĩāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš„ā¸›" + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "⏂ā¸ĸā¸ąā¸šā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "ā¸­ā¸­ā¸Ÿāš„ā¸Ĩā¸™āšŒ" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "⏕⏁ā¸Ĩ⏇" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "ā¸­ā¸­ā¸™āš„ā¸Ĩā¸™āšŒ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "⏛⏴⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "āšā¸œā¸™ā¸—ā¸ĩāšˆā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­āšā¸šā¸šā¸­ā¸­ā¸Ÿāš„ā¸Ĩā¸™āšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "ā¸ˆā¸­ā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "ā¸•ā¸ąā¸§ā¸ˆā¸ąā¸šāš€ā¸§ā¸Ĩā¸˛ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡āšƒā¸™āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "ā¸ˆā¸­ā¸”: āš€ā¸‚āš‰ā¸˛ā¸Ēā¸šāšˆāš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩā¸˛ā¸—ā¸¸ā¸ā¸„ā¸Ŗā¸ąāš‰ā¸‡ā¸—ā¸ĩāšˆāš€ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģ⏪⏎⏭⏛ā¸Ĩā¸¸ā¸āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "ā¸„āšˆā¸˛ā¸Šā¸”āš€ā¸Šā¸ĸ:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "ā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "āšā¸œā¸™ā¸—ā¸ĩāšˆā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­āšā¸šā¸šā¸­ā¸­ā¸™āš„ā¸Ĩā¸™āšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "ā¸­ā¸´ā¸™āš€ā¸—ā¸­ā¸ŖāšŒāš€ā¸Ÿā¸‹ā¸™ā¸ąā¸ā¸žā¸ąā¸’ā¸™ā¸˛ā¸‚ā¸“ā¸°ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "āš€ā¸›ā¸´ā¸”āšā¸­ā¸› Konn3kt ā¸šā¸™āš‚ā¸—ā¸Ŗā¸¨ā¸ąā¸žā¸—āšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "ā¸Šā¸ˇāšˆā¸­āš€ā¸Ĩāšˆā¸™ (āš„ā¸Ąāšˆā¸šā¸ąā¸‡ā¸„ā¸ąā¸š)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"āšā¸Ēā¸”ā¸‡āšā¸–ā¸šā¸„āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąāšā¸šā¸šāš€ā¸Ŗā¸ĩā¸ĸā¸Ĩāš„ā¸—ā¸ĄāšŒ (ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧ ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāšˆā¸‡ā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡ " +"ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛) ā¸‚ā¸“ā¸°ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆ" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "ā¸Ēā¸ąā¸›ā¸”ā¸˛ā¸ĢāšŒā¸—ā¸ĩāšˆā¸œāšˆā¸˛ā¸™ā¸Ąā¸˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "āš‚ā¸Ģā¸Ąā¸” PQ HCA Status 7" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "āš‚ā¸Ģā¸Ąā¸” PQ HCA status 7" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "ā¸”ā¸šā¸•ā¸ąā¸§ā¸­ā¸ĸāšˆā¸˛ā¸‡" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāšƒā¸™āšā¸­ā¸› Konn3kt" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāšƒā¸™āšā¸­ā¸› Konn3kt" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸ā¸ąā¸šā¸šā¸ąā¸ā¸Šā¸ĩ Konn3kt ⏂⏭⏇⏄⏏⏓" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "ā¸Ģā¸ĸā¸¸ā¸”ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸Šā¸ąāšˆā¸§ā¸„ā¸Ŗā¸˛ā¸§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "ā¸—ā¸ŗā¸ā¸˛ā¸Ŗā¸„āš‰ā¸™ā¸Ģ⏞" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" +"āš€ā¸Ĩā¸ˇā¸­ā¸ā¸§āšˆā¸˛ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸ˆā¸°ā¸•ā¸­ā¸šā¸Ē⏙⏭⏇⏭ā¸ĸāšˆā¸˛ā¸‡āš„ā¸Ŗāš€ā¸Ąā¸ˇāšˆā¸­ā¸œā¸šāš‰ā¸‚ā¸ąā¸šāš€ā¸šā¸Ŗā¸āšƒā¸™ IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸§āšˆā¸˛ā¸ā¸˛ā¸Ŗāš€ā¸Ģā¸ĸā¸ĩā¸ĸā¸šāšā¸›āš‰ā¸™āš€ā¸šā¸Ŗā¸ā¸ˆā¸°ā¸Ēāšˆā¸‡ā¸œā¸Ĩ⏭ā¸ĸāšˆā¸˛ā¸‡āš„ā¸Ŗā¸•āšˆā¸­ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"āš€ā¸Ĩā¸ˇā¸­ā¸ā¸§āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸—ā¸ĩāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšā¸Ĩāš‰ā¸§ā¸ˆā¸°ā¸Ŗā¸­ā¸ā¸˛ā¸Ŗā¸­ā¸™ā¸¸ā¸Ąā¸ąā¸•ā¸´ā¸ˆā¸˛ā¸ā¸„ā¸¸ā¸“ ā¸Ģā¸Ŗā¸ˇā¸­ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āšā¸Ĩā¸°ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡āš€ā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "āš€ā¸Ĩ⏎⏭⏁ā¸ĸā¸˛ā¸™ā¸žā¸˛ā¸Ģ⏙⏰⏂⏭⏇⏄⏏⏓" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "⏕⏪ā¸ļ⏇ā¸ĸā¸˛ā¸™ā¸žā¸˛ā¸Ģā¸™ā¸°āš„ā¸§āš‰āš€ā¸žā¸ˇāšˆā¸­ā¸‚āš‰ā¸˛ā¸Ąā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ģā¸˛ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"⏕⏪ā¸ļā¸‡ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸­āšˆā¸˛ā¸™āš„ā¸”āš‰āšā¸šā¸šāš€ā¸Ŗā¸ĩā¸ĸā¸Ĩāš„ā¸—ā¸ĄāšŒ (⏪⏰ā¸ĸ⏰ā¸Ģāšˆā¸˛ā¸‡ ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ āš€ā¸§ā¸Ĩ⏞⏖ā¸ļā¸‡ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛) " +"āš„ā¸§āš‰ā¸—ā¸ĩāšˆāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģā¸Ąā¸˛ā¸ĸā¸šā¸­ā¸ā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛ ā¸•āš‰ā¸­ā¸‡āšƒā¸Ģāš‰ IQ.Pilot " +"āš€ā¸›āš‡ā¸™ā¸œā¸šāš‰ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡āšā¸Ĩā¸°āš€ā¸šā¸Ŗā¸" + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "āš‚ā¸›ā¸Ŗā¸”āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ Wi-Fi āš€ā¸žā¸ˇāšˆā¸­ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸„ā¸Ŗā¸ąāš‰ā¸‡āšā¸Ŗā¸āšƒā¸Ģāš‰āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "āš‚ā¸›ā¸Ŗā¸”āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ Wi-Fi āš€ā¸žā¸ˇāšˆā¸­ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸„ā¸Ŗā¸ąāš‰ā¸‡āšā¸Ŗā¸āšƒā¸Ģāš‰āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "āš‚ā¸›ā¸Ŗā¸”āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ Wi-Fi āš€ā¸žā¸ˇāšˆā¸­ā¸”ā¸ļ⏇⏄ā¸ĩā¸ĸāšŒā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "āš‚ā¸›ā¸Ŗā¸”āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­ Wi-Fi āš€ā¸žā¸ˇāšˆā¸­ā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "āš€ā¸Ĩāš‡ā¸‡ā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸œā¸šāš‰ā¸‚ā¸ąā¸šāš„ā¸›ā¸—ā¸ĩāšˆ QR āš‚ā¸„āš‰ā¸” eSIM ā¸‚ā¸­ā¸‡ā¸œā¸šāš‰āšƒā¸Ģāš‰ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗ (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "ā¸™āš‰ā¸ŗā¸Ģā¸™ā¸ąā¸ā¸Ēāšˆā¸§ā¸™ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡āš€ā¸Ąā¸ˇāšˆā¸­ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸ˆā¸­ā¸”ā¸­ā¸ĸā¸šāšˆā¸™ā¸˛ā¸™āš€ā¸—āšˆā¸˛ā¸™ā¸ĩāš‰āš‚ā¸”ā¸ĸā¸”ā¸ąā¸šāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸ĸā¸™ā¸•āšŒ\n" +"(ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ 30 ā¸Šā¸Ą.)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "ā¸„ā¸˛ā¸”ā¸ā¸˛ā¸Ŗā¸“āšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "" +"ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šā¸ˆā¸šā¸™āšā¸šā¸šā¸„ā¸˛ā¸”ā¸ā¸˛ā¸Ŗā¸“āšŒ: ā¸„ā¸˛ā¸”ā¸ā¸˛ā¸Ŗā¸“āšŒā¸Ĩāšˆā¸§ā¸‡ā¸Ģā¸™āš‰ā¸˛āšā¸Ĩā¸°ā¸—ā¸ŗāšƒā¸Ģāš‰ā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāšˆā¸‡ā¸™ā¸¸āšˆā¸Ąā¸™ā¸§ā¸Ĩ⏂ā¸ļāš‰ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔ā¸Ĩāšˆā¸§ā¸‡ā¸Ģā¸™āš‰ā¸˛ + ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ā¸Ĩāšˆā¸§ā¸‡ā¸Ģā¸™āš‰ā¸˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔ā¸Ĩāšˆā¸§ā¸‡ā¸Ģā¸™āš‰ā¸˛āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸•ā¸Ŗā¸ĩā¸ĸā¸Ąāš„ā¸—ā¸ĨāšŒāšā¸œā¸™ā¸—ā¸ĩāšˆ..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆāš€ā¸Ąā¸ˇāšˆā¸­āšƒā¸Šāš‰ Wi-Fi āšā¸šā¸šā¸ˆā¸ŗā¸ā¸ąā¸”ā¸›ā¸Ŗā¸´ā¸Ąā¸˛ā¸“" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "ā¸›āš‰ā¸­ā¸‡ā¸ā¸ąā¸™ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆāš€ā¸Ąā¸ˇāšˆā¸­āšƒā¸Šāš‰āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸā¸Ąā¸ˇā¸­ā¸–ā¸ˇā¸­āšā¸šā¸šā¸ˆā¸ŗā¸ā¸ąā¸”ā¸›ā¸Ŗā¸´ā¸Ąā¸˛ā¸“" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"ā¸”ā¸šā¸ ā¸˛ā¸žā¸ˆā¸˛ā¸ā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸—ā¸ĩāšˆā¸Ģā¸ąā¸™āš€ā¸‚āš‰ā¸˛ā¸Ģā¸˛ā¸œā¸šāš‰ā¸‚ā¸ąā¸šāš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰āšā¸™āšˆāšƒā¸ˆā¸§āšˆā¸˛ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸œā¸šāš‰ā¸‚ā¸ąā¸šā¸Ąā¸­ā¸‡āš€ā¸Ģāš‡ā¸™āš„ā¸”āš‰ā¸”ā¸ĩ " +"(ā¸•āš‰ā¸­ā¸‡ā¸”ā¸ąā¸šāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸ĸā¸™ā¸•āšŒ)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"⏔ā¸ļā¸‡āš„ā¸—ā¸ĨāšŒ Mapbox āšā¸šā¸šāš€ā¸Ŗā¸ĩā¸ĸā¸Ĩāš„ā¸—ā¸ĄāšŒā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šāšā¸œā¸™ā¸—ā¸ĩāšˆā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­āš€ā¸Ąā¸ˇāšˆā¸­ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸Ąā¸ĩā¸­ā¸´ā¸™āš€ā¸—ā¸­ā¸ŖāšŒāš€ā¸™āš‡ā¸•" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Šāš‚ā¸Ąāš€ā¸”ā¸Ĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāš€ā¸›āš‡ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩ⏞ ā¸Ģā¸Ŗā¸ˇā¸­ā¸”ā¸ąā¸šāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ŗā¸– " +"ā¸āšˆā¸­ā¸™āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸§ā¸´ā¸˜ā¸ĩā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāš€ā¸›āš‡ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩ⏞ ā¸Ģā¸Ŗā¸ˇā¸­ā¸”ā¸ąā¸šāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ŗā¸– ā¸āšˆā¸­ā¸™āšā¸āš‰āš„ā¸‚ā¸„āšˆā¸˛āš€ā¸Ģā¸Ĩāšˆā¸˛ā¸™ā¸ĩāš‰" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩ⏞⏔⏂⏭⏇ QR āš‚ā¸„āš‰ā¸”" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "ā¸ĸā¸­ā¸Ąā¸Ŗā¸ąā¸š QR āš‚ā¸„āš‰ā¸”āšā¸Ĩāš‰ā¸§" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "ā¸žā¸Ŗāš‰ā¸­ā¸Ą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āšƒā¸Ģā¸Ąāšˆ" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Š" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "⏙⏺⏭⏭⏁" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸™ā¸ŗā¸­ā¸­ā¸..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "⏪ā¸ĩāš€ā¸‹āš‡ā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "ā¸”ā¸š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "āšā¸Ŗāš‡ā¸„ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡āšƒā¸Ģā¸Ąāšˆā¸Ģā¸˛ā¸āšƒā¸šā¸Ģā¸™āš‰ā¸˛ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“ā¸–ā¸šā¸ā¸šā¸ąā¸‡ ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ŗā¸°ā¸šā¸šā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸œā¸šāš‰ā¸‚ā¸ąā¸šā¸•ā¸´ā¸”ā¸•ā¸˛ā¸Ąāšƒā¸šā¸Ģā¸™āš‰ā¸˛āš„ā¸”āš‰ā¸ĸ⏞⏁" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "āš€ā¸‚āš‰ā¸˛ā¸–ā¸ļā¸‡āš„ā¸”āš‰āš€ā¸‰ā¸žā¸˛ā¸°āš€ā¸Ąā¸ˇāšˆā¸­ā¸”ā¸ąā¸šāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ŗā¸–ā¸Ģā¸Ŗā¸ˇā¸­āš€ā¸›ā¸´ā¸”āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩ⏞" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "⏪ā¸ĩā¸šā¸šā¸•" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "⏪ā¸ĩā¸šā¸šā¸•ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "⏪ā¸ĩā¸šā¸šā¸•āšā¸Ĩā¸°ā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™āšƒā¸Ģāš‰ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šā¸Ŗā¸–ā¸ā¸Ĩā¸ąā¸šāš€ā¸‚āš‰ā¸˛ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ŗā¸–ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš€ā¸šā¸ĩāšˆā¸ĸā¸‡ā¸‚āš‰ā¸˛ā¸Ąāš€ā¸Ēāš‰ā¸™āšā¸šāšˆā¸‡ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡ā¸—ā¸ĩāšˆā¸•ā¸Ŗā¸§ā¸ˆā¸žā¸šāš‚ā¸”ā¸ĸāš„ā¸Ąāšˆāš€ā¸›ā¸´ā¸”āš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" +" ā¸‚ā¸“ā¸°ā¸‚ā¸ąā¸šāš€ā¸Ŗāš‡ā¸§ā¸ā¸§āšˆā¸˛ 31 āš„ā¸Ąā¸ĨāšŒ/ā¸Šā¸Ą. (50 ā¸ā¸Ą./ā¸Šā¸Ą.)" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "ā¸šā¸ąā¸™ā¸—ā¸ļā¸āšā¸Ĩā¸°ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸ ā¸˛ā¸žā¸ˆā¸˛ā¸ā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸œā¸šāš‰ā¸‚ā¸ąā¸š" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "ā¸šā¸ąā¸™ā¸—ā¸ļā¸āšā¸Ĩā¸°ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āš€ā¸Ēā¸ĩā¸ĸā¸‡ā¸ˆā¸˛ā¸āš„ā¸Ąāš‚ā¸„ā¸Ŗāš‚ā¸Ÿā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"ā¸šā¸ąā¸™ā¸—ā¸ļā¸āšā¸Ĩā¸°ā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šāš€ā¸Ēā¸ĩā¸ĸā¸‡ā¸ˆā¸˛ā¸āš„ā¸Ąāš‚ā¸„ā¸Ŗāš‚ā¸Ÿā¸™ā¸‚ā¸“ā¸°ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ " +"āš€ā¸Ēā¸ĩā¸ĸā¸‡ā¸ˆā¸°ā¸Ŗā¸§ā¸Ąā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­ā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸•ā¸´ā¸”ā¸Ŗā¸–ā¸ĸā¸™ā¸•āšŒāšƒā¸™ Konn3kt" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"ā¸šā¸ąā¸™ā¸—ā¸ļā¸āšā¸Ĩā¸°ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆāšā¸Ĩ⏰⏧⏴⏔ā¸ĩāš‚ā¸­ ā¸ā¸˛ā¸Ŗā¸›ā¸´ā¸”ā¸ˆā¸°ā¸Ģā¸ĸā¸¸ā¸”ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”! " +"āš„ā¸Ąāšˆā¸Ąā¸ĩā¸šā¸ąā¸™ā¸—ā¸ļ⏁ āš„ā¸Ąāšˆā¸Ąā¸ĩ⏧⏴⏔ā¸ĩāš‚ā¸­ āš„ā¸Ąāšˆā¸Ąā¸ĩāš€ā¸Ēā¸ĩā¸ĸ⏇" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āšƒā¸Ģā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āš‚ā¸Ąāš€ā¸”ā¸Ĩā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™āšƒā¸Ģā¸Ąāšˆ" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Šāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸•ā¸˛ā¸Ąā¸ā¸Žā¸Ģā¸Ąā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "ā¸œāšˆā¸­ā¸™ā¸„ā¸Ĩ⏞ā¸ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "āš‚ā¸Ģā¸Ĩ⏔⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸Ąāš€ā¸”ā¸Ĩāšƒā¸Ģā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "⏄⏇⏁⏞⏪⏗⏺⏇⏞⏙: ā¸ā¸˛ā¸Ŗāš€ā¸šā¸Ŗā¸ā¸ˆā¸°āš„ā¸Ąāšˆā¸‚ā¸ąā¸”ā¸ˆā¸ąā¸‡ā¸Ģā¸§ā¸°ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "ā¸ā¸˛ā¸Ŗāš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇⏪⏰ā¸ĸā¸°āš„ā¸ā¸Ĩ" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "⏙⏺⏭⏭⏁" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "ā¸Ĩ⏚ pSIM ⏂⏭⏇ Comma" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "⏄⏺⏂⏭ā¸Ģā¸Ąā¸”āš€ā¸§ā¸Ĩ⏞" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "ā¸•āš‰ā¸­ā¸‡āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇ IQ.Pilot (ā¸­ā¸ąā¸Ĩ⏟⏞)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "⏪ā¸ĩāš€ā¸‹āš‡ā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "⏪ā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸ⏚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "ā¸„ā¸ˇā¸™ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "ā¸”ā¸šā¸„ā¸šāšˆā¸Ąā¸ˇā¸­ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "ā¸”ā¸šā¸ā¸Ž ⏄⏏⏓ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ āšā¸Ĩā¸°ā¸‚āš‰ā¸­ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸‚ā¸­ā¸‡ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "ā¸Šā¸ˇāšˆā¸­ā¸–ā¸™ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "āšā¸Ēā¸”ā¸‡ā¸Šā¸ˇāšˆā¸­ā¸–ā¸™ā¸™ā¸šā¸™ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ąā¸ˇā¸­ā¸„ā¸ŗā¸™ā¸§ā¸“āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "āš€ā¸Ŗā¸ĩā¸ĸā¸āšƒā¸Šāš‰ā¸­ā¸´ā¸™āš€ā¸—ā¸­ā¸ŖāšŒāš€ā¸Ÿā¸‹ comma 4 (mici) āšā¸šā¸šā¸ā¸°ā¸—ā¸ąā¸”ā¸Ŗā¸ąā¸”ā¸šā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸™ā¸ĩāš‰" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "āš€ā¸Ĩ⏎⏭⏁" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸„āšˆā¸˛ā¸Ēā¸šā¸‡ā¸ā¸§āšˆā¸˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC ā¸ĸ⏎⏙ā¸ĸā¸ąā¸™ā¸„āšˆā¸˛ā¸•āšˆā¸ŗā¸ā¸§āšˆā¸˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC ā¸Ē⏺⏪⏭⏇ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC āš€ā¸•ā¸´ā¸Ąā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸­ā¸­ā¸™āš„ā¸Ĩā¸™āšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC ā¸ā¸˛ā¸Ŗāšā¸—ā¸™ā¸—ā¸ĩāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "⏄ā¸ĩā¸ĸāšŒ SSH" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "⏄ā¸ĩā¸ĸāšŒ SSH" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "ACC āš€ā¸”ā¸´ā¸Ąā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "ā¸Ēāšā¸ā¸™" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "ā¸Ēāšā¸ā¸™ QR" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "ā¸Ēāšā¸ā¸™ QR ā¸Ģā¸Ŗā¸ˇā¸­ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēāš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸„āš‰ā¸™ā¸Ģā¸˛āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ Wi-Fi..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "ā¸„āš‰ā¸™ā¸Ģ⏞" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "ā¸„āš‰ā¸™ā¸Ģ⏞⏗ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸Ģ⏪⏎⏭ā¸Ē⏖⏞⏙⏗ā¸ĩāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "ā¸„āš‰ā¸™ā¸Ģ⏞ā¸ĸā¸ĩāšˆā¸Ģāš‰ā¸­ā¸Ģā¸Ŗā¸ˇā¸­ā¸Ŗā¸¸āšˆā¸™" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸„āš‰ā¸™ā¸Ģ⏞..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "āš€ā¸Ĩ⏎⏭⏁" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "āš€ā¸Ĩ⏎⏭⏁ā¸Ē⏞⏂⏞" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "āš€ā¸Ĩā¸ˇā¸­ā¸ā¸ ā¸˛ā¸Šā¸˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸§ā¸˛ā¸Ąā¸Ģā¸™āšˆā¸§ā¸‡ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩā¸‚āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸šāš‰ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸Ģā¸™āšˆā¸§ā¸ĸā¸•ā¸˛ā¸Ąā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸šāš‰ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ģā¸™āšˆā¸§ā¸ĸā¸•ā¸˛ā¸Ąā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡ā¸‚ā¸­ā¸‡ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸ˆā¸°āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸›āš‡ā¸™ ā¸ā¸Ą./ā¸Šā¸Ą. ⏗⏏⏁⏗ā¸ĩāšˆ " +"ā¸ĸā¸āš€ā¸§āš‰ā¸™ā¸Ēā¸Ģā¸Ŗā¸ąā¸ā¸­āš€ā¸Ąā¸Ŗā¸´ā¸ā¸˛ ā¸Ēā¸Ģā¸Ŗā¸˛ā¸Šā¸­ā¸˛ā¸“ā¸˛ā¸ˆā¸ąā¸ā¸Ŗ āšā¸Ĩā¸°āš„ā¸Ĩ⏚ā¸ĩāš€ā¸Ŗā¸ĩā¸ĸ " +"āšā¸Ĩā¸°ā¸ˆā¸°ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šāšƒā¸Ģā¸Ąāšˆāš€ā¸Ąā¸ˇāšˆā¸­ā¸„ā¸¸ā¸“ā¸‚āš‰ā¸˛ā¸Ąā¸žā¸Ŗā¸Ąāšā¸”ā¸™" + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆā¸­ā¸ĸā¸šāšˆā¸—ā¸ĩāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"⏁⏺ā¸Ģā¸™ā¸”āš€ā¸ā¸“ā¸‘āšŒā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸—ā¸ĩāšˆā¸„ā¸§ā¸˛ā¸Ąā¸•ā¸ąāš‰ā¸‡āšƒā¸ˆāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āšƒā¸Šāš‰ ā¸•āšˆā¸ŗā¸ā¸§āšˆā¸˛ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰ " +"ā¸„ā¸§ā¸˛ā¸Ąā¸•ā¸ąāš‰ā¸‡āšƒā¸ˆāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸ˆā¸°ā¸§ā¸˛ā¸‡āšā¸œā¸™āš„ā¸›ā¸ĸā¸ąā¸‡āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡āš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧⏗ā¸ĩāšˆā¸‚ā¸ąā¸šā¸œāšˆā¸˛ā¸™āš„ā¸”āš‰āšƒā¸ā¸Ĩāš‰ā¸—ā¸ĩāšˆā¸Ē⏏⏔ " +"ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™ā¸„ā¸ˇā¸­ 19 āš„ā¸Ąā¸ĨāšŒ/ā¸Šā¸Ą." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "⏁⏺ā¸Ģā¸™ā¸”ā¸§āšˆā¸˛ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒā¸ˆā¸°ā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸Ēā¸–ā¸˛ā¸™ā¸°āšƒā¸”ā¸Ģā¸Ĩā¸ąā¸‡āš€ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸Ģ⏪⏎⏭⏛ā¸Ĩā¸¸ā¸ā¸ˆā¸˛ā¸āš‚ā¸Ģā¸Ąā¸”ā¸žā¸ąā¸" + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"āšā¸Ēā¸”ā¸‡ā¸Šā¸ˇāšˆā¸­ā¸–ā¸™ā¸™ā¸›ā¸ąā¸ˆā¸ˆā¸¸ā¸šā¸ąā¸™ā¸—ā¸ąā¸šā¸ ā¸˛ā¸žā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ
    ā¸•āš‰ā¸­ā¸‡ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩāšā¸œā¸™ā¸—ā¸ĩāšˆā¸­ā¸­ā¸Ÿāš„ā¸Ĩā¸™āšŒā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ ā¸šā¸Ąā¸´ā¸ ā¸˛ā¸„ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧⏗ā¸ĩāšˆā¸™ā¸¸āšˆā¸Ąā¸™ā¸§ā¸Ĩ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "āš€ā¸Ĩā¸ˇāšˆā¸­ā¸™ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "ā¸‹ā¸­ā¸Ÿā¸•āšŒāšā¸§ā¸ŖāšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "ā¸ā¸˛ā¸Ŗā¸ˆā¸ŗā¸ā¸ąā¸”ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸ā¸˛ā¸Ŗā¸ˆā¸ŗā¸ā¸ąā¸”ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "ā¸Ąā¸˛ā¸•ā¸Ŗā¸ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"āšā¸™ā¸°ā¸™ā¸ŗāšƒā¸Ģāš‰āšƒā¸Šāš‰āšā¸šā¸šā¸Ąā¸˛ā¸•ā¸Ŗā¸ā¸˛ā¸™ āšƒā¸™āš‚ā¸Ģā¸Ąā¸”ā¸”ā¸¸ā¸”ā¸ąā¸™ IQ.Pilot " +"ā¸ˆā¸°ā¸‚ā¸ąā¸šā¸•ā¸˛ā¸Ąā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛āšƒā¸ā¸Ĩāš‰ā¸‚ā¸ļāš‰ā¸™āšā¸Ĩā¸°āšƒā¸Šāš‰ā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡ā¸ā¸ąā¸šāš€ā¸šā¸Ŗā¸ā¸Ģā¸™ā¸ąā¸āšā¸™āšˆā¸™ā¸‚ā¸ļāš‰ā¸™ ā¸Ēāšˆā¸§ā¸™āšƒā¸™āš‚ā¸Ģā¸Ąā¸”ā¸œāšˆā¸­ā¸™ā¸„ā¸Ĩ⏞ā¸ĸ" +" IQ.Pilot ā¸ˆā¸°āš€ā¸§āš‰ā¸™ā¸Ŗā¸°ā¸ĸ⏰ā¸Ģāšˆā¸˛ā¸‡ā¸ˆā¸˛ā¸ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸Ģā¸™āš‰ā¸˛ā¸Ąā¸˛ā¸ā¸‚ā¸ļāš‰ā¸™ āšƒā¸™ā¸Ŗā¸–ā¸—ā¸ĩāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸š " +"⏄⏏⏓ā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸Ēā¸Ĩā¸ąā¸šā¸šā¸¸ā¸„ā¸Ĩā¸´ā¸āš€ā¸Ģā¸Ĩāšˆā¸˛ā¸™ā¸ĩāš‰āš„ā¸”āš‰ā¸”āš‰ā¸§ā¸ĸā¸›ā¸¸āšˆā¸Ąā¸›ā¸Ŗā¸ąā¸šā¸Ŗā¸°ā¸ĸ⏰ā¸Ģāšˆā¸˛ā¸‡ā¸šā¸™ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "ā¸žā¸ąā¸ā¸ā¸˛ā¸Ŗā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"ā¸žā¸ąā¸ā¸ā¸˛ā¸Ŗā¸—ā¸ŗā¸‡ā¸˛ā¸™: ā¸ā¸˛ā¸Ŗāš€ā¸šā¸Ŗā¸ā¸ˆā¸°ā¸Ģā¸ĸā¸¸ā¸”ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸Šā¸ąāšˆā¸§ā¸„ā¸Ŗā¸˛ā¸§ " +"āšā¸Ĩ⏰⏁ā¸Ĩā¸ąā¸šā¸Ąā¸˛ā¸—ā¸ŗā¸‡ā¸˛ā¸™āš€ā¸Ąā¸ˇāšˆā¸­ā¸„ā¸¸ā¸“ā¸–ā¸­ā¸™āš€ā¸—āš‰ā¸˛ā¸ˆā¸˛ā¸āšā¸›āš‰ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "āš€ā¸Ŗā¸´āšˆā¸Ąā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "ā¸Ēā¸•ā¸˛ā¸ŖāšŒā¸—ā¸Ŗā¸–āš€ā¸žā¸ˇāšˆā¸­ā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸„ā¸§ā¸˛ā¸Ąāš€ā¸‚āš‰ā¸˛ā¸ā¸ąā¸™āš„ā¸”āš‰ā¸‚ā¸­ā¸‡ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "ā¸Ŗā¸ąā¸" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "ā¸Ē⏖⏴⏕⏴" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "ā¸Ē⏖⏞⏙⏰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "⏄⏇⏁⏞⏪⏗⏺⏇⏞⏙" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸‚ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "āš€ā¸Ēāš‰ā¸™āš‚ā¸„āš‰ā¸‡āšā¸Ŗā¸‡ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "ACC āš€ā¸”ā¸´ā¸Ąā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "ā¸Ģā¸ĸā¸¸ā¸”ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"ā¸Ŗā¸šā¸›āšā¸šā¸šā¸Ģā¸ĸā¸¸ā¸”āšā¸Ĩā¸°āš„ā¸›ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ŗā¸– Subaru Global ⏗ā¸ĩāšˆā¸Ąā¸ĩāš€ā¸šā¸Ŗā¸ā¸Ąā¸ˇā¸­āšā¸šā¸šāšā¸Ąā¸™ā¸§ā¸Ĩ " +"ā¸›ā¸´ā¸”āš„ā¸§āš‰ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ŗā¸–ā¸—ā¸ĩāšˆāšƒā¸Šāš‰āš€ā¸šā¸Ŗā¸ā¸ˆā¸­ā¸”āšā¸šā¸šāš„ā¸Ÿā¸Ÿāš‰ā¸˛ ā¸‚ā¸­ā¸šā¸„ā¸¸ā¸“ martinl ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸žā¸ąā¸’ā¸™ā¸˛ā¸™ā¸ĩāš‰!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "āšā¸œā¸™ā¸—ā¸ĩāšˆā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šāš„ā¸§āš‰" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ē⏕⏪ā¸ĩā¸Ąā¸ˆā¸˛ā¸ā¸„ā¸Ĩā¸˛ā¸§ā¸”āšŒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāš€ā¸›āš‡ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩ⏞ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒāš€ā¸›āš‡ā¸™āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”āšā¸šā¸šā¸šā¸ąā¸‡ā¸„ā¸ąā¸šā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "⏪⏰⏚⏚" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "ā¸Ŗā¸°ā¸šā¸šāš„ā¸Ąāšˆā¸•ā¸­ā¸šā¸Ē⏙⏭⏇" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "āš€ā¸‚āš‰ā¸˛ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸—ā¸ąā¸™ā¸—ā¸ĩ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "⏭⏏⏓ā¸Ģā¸ ā¸šā¸Ąā¸´" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "⏭⏏⏓ā¸Ģā¸ ā¸šā¸Ąā¸´ā¸Ēā¸šā¸‡" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "⏭⏏⏓ā¸Ģā¸ ā¸šā¸Ąā¸´ā¸›ā¸ā¸•ā¸´" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "āšā¸•ā¸° \"Add Device\" āšā¸Ĩāš‰ā¸§ā¸Ēāšā¸ā¸™ QR āš‚ā¸„āš‰ā¸”ā¸—ā¸˛ā¸‡ā¸”āš‰ā¸˛ā¸™ā¸‚ā¸§ā¸˛" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "ā¸Ēā¸˛ā¸‚ā¸˛āš€ā¸›āš‰ā¸˛ā¸Ģā¸Ąā¸˛ā¸ĸ" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸ā¸˛ā¸Ŗā¸›ā¸Ĩāšˆā¸­ā¸ĸā¸Ēā¸ąā¸ā¸ā¸˛ā¸“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"āš‚ā¸Ąāš€ā¸”ā¸Ĩ⏗ā¸ĩāšˆāš€ā¸Ĩā¸ˇā¸­ā¸ā¸Ąā¸ĩā¸ā¸˛ā¸Ŗāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āšā¸›ā¸Ĩ⏇ āš€ā¸Ŗā¸˛āšā¸™ā¸°ā¸™ā¸ŗāšƒā¸Ģāš‰ā¸Ŗā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸ⏚ " +"ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸—ā¸ŗā¸•ā¸­ā¸™ā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸Ŗā¸´āšˆā¸Ąāšā¸Ĩāš‰ā¸§ā¸ˆā¸°ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸šāš„ā¸Ąāšˆāš„ā¸”āš‰ — āš‚ā¸­ā¸ā¸˛ā¸Ēā¸Ēā¸¸ā¸”ā¸—āš‰ā¸˛ā¸ĸ⏗ā¸ĩāšˆā¸ˆā¸°ā¸ĸā¸āš€ā¸Ĩ⏴⏁" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "ā¸•āš‰ā¸­ā¸‡ā¸Ŗā¸ĩā¸šā¸šā¸•āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰ā¸Ąā¸ĩ⏜ā¸Ĩ ⏪ā¸ĩā¸Ēā¸•ā¸˛ā¸ŖāšŒā¸—ā¸•ā¸­ā¸™ā¸™ā¸ĩāš‰ā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "āšā¸žā¸Ĩā¸•ā¸Ÿā¸­ā¸ŖāšŒā¸Ąā¸™ā¸ĩāš‰ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸­ā¸ĸā¸šāšˆā¸—ā¸ĩāšˆāš‚ā¸Ģā¸Ąā¸”ā¸›ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "āšā¸žā¸Ĩā¸•ā¸Ÿā¸­ā¸ŖāšŒā¸Ąā¸™ā¸ĩāš‰ā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸•ā¸ąā¸§āš€ā¸Ĩā¸ˇā¸­ā¸ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸‚ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āš€ā¸žā¸ĩā¸ĸā¸‡ā¸šā¸˛ā¸‡ā¸Ēāšˆā¸§ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "āšā¸žā¸Ĩā¸•ā¸Ÿā¸­ā¸ŖāšŒā¸Ąā¸™ā¸ĩāš‰ā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸‚ā¸­ā¸‡ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§āš„ā¸”āš‰ā¸„ā¸Ŗā¸šā¸–āš‰ā¸§ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸Ĩā¸šāšā¸œā¸™ā¸—ā¸ĩāšˆā¸—ā¸ĩāšˆā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āš„ā¸§āš‰ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”\n" +"\n" +"ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆā¸§āšˆā¸˛ā¸•āš‰ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸Ĩā¸šāšā¸œā¸™ā¸—ā¸ĩāšˆā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸Ĩā¸šāš‚ā¸Ąāš€ā¸”ā¸Ĩ⏗ā¸ĩāšˆā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āš„ā¸§āš‰ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸āšā¸„ā¸Š " +"ā¸ĸā¸āš€ā¸§āš‰ā¸™āš‚ā¸Ąāš€ā¸”ā¸Ĩ⏗ā¸ĩāšˆāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸­ā¸ĸā¸šāšˆ ā¸„ā¸¸ā¸“āšā¸™āšˆāšƒā¸ˆā¸Ģā¸Ŗā¸ˇā¸­āš„ā¸Ąāšˆ" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰ā¸ˆā¸°ā¸Ĩā¸šāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ pSIM ⏂⏭⏇ Comma ā¸­ā¸­ā¸ā¸ˆā¸˛ā¸ā¸‹ā¸´ā¸Ąā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸–ā¸˛ā¸§ā¸Ŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "ā¸ā¸˛ā¸Ŗā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸™ā¸ĩāš‰ā¸ˆā¸°āš€ā¸Ŗā¸´āšˆā¸Ąā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āšā¸Ĩā¸°ā¸­ā¸˛ā¸ˆāšƒā¸Šāš‰āš€ā¸§ā¸Ĩ⏞ā¸Ēā¸ąā¸ā¸„ā¸Ŗā¸šāšˆā¸ˆā¸ļā¸‡ā¸ˆā¸°āš€ā¸Ēā¸Ŗāš‡ā¸ˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "āš€ā¸§ā¸Ĩ⏞" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "ā¸Ŗā¸§ā¸Ą:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"ā¸§ā¸˛ā¸”āš€ā¸Ēāš‰ā¸™āš‚ā¸„āš‰ā¸‡ā¸—ā¸ąā¸šā¸ ā¸˛ā¸žā¸–ā¸™ā¸™āš€ā¸žā¸ˇāšˆā¸­āšā¸Ēā¸”ā¸‡ā¸§āšˆā¸˛ IQ.Pilot " +"⏁⏺ā¸Ĩā¸ąā¸‡ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸā¸§ā¸Ąā¸˛ā¸āš€ā¸žā¸ĩā¸ĸā¸‡āšƒā¸”ā¸‚ā¸“ā¸°ā¸—ā¸ĩāšˆā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡ā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "ā¸„ā¸šāšˆā¸Ąā¸ˇā¸­ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "āš„ā¸Ÿāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ģā¸˛ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸œāšˆā¸˛ā¸™āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”
    ⏪ā¸ĩā¸šā¸šā¸•āš€ā¸žā¸ˇāšˆā¸­āšƒā¸Ģāš‰ā¸Ąā¸ĩ⏜ā¸Ĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "ā¸žā¸´ā¸Ąā¸žāšŒā¸›ā¸ĩāšā¸Ĩāš‰ā¸§ā¸•ā¸˛ā¸Ąā¸”āš‰ā¸§ā¸ĸā¸Ŗā¸¸āšˆā¸™ — ā¸•ā¸ąā¸§ā¸­ā¸ĸāšˆā¸˛ā¸‡āš€ā¸Šāšˆā¸™ 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "ā¸žā¸´ā¸Ąā¸žāšŒāš€ā¸žā¸ˇāšˆā¸­ā¸„āš‰ā¸™ā¸Ģ⏞" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "āš„ā¸Ąāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "ā¸–ā¸­ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "ā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ USB" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "āšƒā¸Šāš‰" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "āš‚ā¸Ģā¸Ĩ⏔⏧⏴⏔ā¸ĩāš‚ā¸­āš„ā¸Ąāšˆāš„ā¸”āš‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "āšƒā¸Šāš‰āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸‚ā¸“ā¸°ā¸—ā¸ĩāšˆā¸Ŗā¸–ā¸­ā¸ĸā¸šāšˆāšƒā¸™āš‚ā¸Ģā¸Ąā¸”ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "āš„ā¸Ąāšˆā¸žā¸Ŗāš‰ā¸­ā¸Ąāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ — ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇ IQ.Pilot āš„ā¸Ąāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™āšƒā¸™ā¸Ŗā¸–ā¸„ā¸ąā¸™ā¸™ā¸ĩāš‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "ā¸•ā¸Ŗā¸§ā¸ˆāš„ā¸Ąāšˆā¸žā¸šāšā¸Ĩ⏰ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "ā¸–ā¸­ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "āš„ā¸Ąāšˆā¸—ā¸Ŗā¸˛ā¸š" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "āš„ā¸Ąāšˆā¸—ā¸Ŗā¸˛ā¸šā¸œā¸šāš‰āšƒā¸Ģāš‰ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗ" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆāš€ā¸āš‡ā¸šāš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡āš„ā¸Ąāšˆā¸ˆā¸ŗā¸ā¸ąā¸”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "āš‚ā¸Ģā¸Ąā¸”ā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•āš€ā¸‰ā¸žā¸˛ā¸°ā¸•ā¸­ā¸™ā¸—ā¸ĩāšˆā¸Ŗā¸–ā¸”ā¸ąā¸šāš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡āš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸‚ā¸“ā¸°ā¸‚ā¸ąā¸šā¸‚ā¸ĩāšˆ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ⏈⏞⏁⏁ā¸Ĩāš‰ā¸­ā¸‡ā¸—ā¸ĩāšˆā¸Ģā¸ąā¸™āš€ā¸‚āš‰ā¸˛ā¸Ģā¸˛ā¸œā¸šāš‰ā¸‚ā¸ąā¸šāš€ā¸žā¸ˇāšˆā¸­ā¸Šāšˆā¸§ā¸ĸā¸›ā¸Ŗā¸ąā¸šā¸›ā¸Ŗā¸¸ā¸‡ā¸­ā¸ąā¸Ĩ⏁⏭⏪⏴⏗ā¸ļā¸Ąā¸ā¸˛ā¸Ŗā¸•ā¸Ŗā¸§ā¸ˆā¸Ēā¸­ā¸šā¸œā¸šāš‰ā¸‚ā¸ąā¸š" + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩā¸”āšā¸Ĩāš‰ā¸§" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸­ā¸ąā¸›āš‚ā¸Ģā¸Ĩ⏔" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"āšƒā¸Šāš‰ HCA Status 7 āšā¸—ā¸™ Status 5 ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸāšƒā¸™ā¸Ŗā¸–āšā¸žā¸Ĩā¸•ā¸Ÿā¸­ā¸ŖāšŒā¸Ą PQ " +"⏋ā¸ļāšˆā¸‡ā¸­ā¸˛ā¸ˆā¸Šāšˆā¸§ā¸ĸāš€ā¸Ŗā¸ˇāšˆā¸­ā¸‡ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸‚āš‰ā¸˛ā¸ā¸ąā¸™āš„ā¸”āš‰ā¸ā¸ąā¸šā¸Ŗā¸– Volkswagen ā¸Ŗā¸¸āšˆā¸™āš€ā¸āšˆā¸˛ā¸šā¸˛ā¸‡ā¸Ŗā¸¸āšˆā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "āšƒā¸Šāš‰ā¸Ŗā¸°ā¸šā¸šāš€ā¸Ąā¸•ā¸Ŗā¸´ā¸" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"āšƒā¸Šāš‰ā¸Ŗā¸Ģā¸ąā¸Ēāš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"āšƒā¸Šāš‰ā¸Ŗā¸°ā¸šā¸š IQ.Pilot " +"ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ŗā¸°ā¸šā¸šā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āšā¸šā¸šā¸›ā¸Ŗā¸ąā¸šāš„ā¸”āš‰āšā¸Ĩā¸°ā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡āš€ā¸”ā¸´ā¸™ā¸Ŗā¸– " +"ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸„ā¸­ā¸ĸā¸Ŗā¸°ā¸§ā¸ąā¸‡ā¸•ā¸Ĩā¸­ā¸”āš€ā¸§ā¸Ĩā¸˛ā¸‚ā¸“ā¸°āšƒā¸Šāš‰ā¸„ā¸¸ā¸“ā¸Ēā¸Ąā¸šā¸ąā¸•ā¸´ā¸™ā¸ĩāš‰" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "ā¸ĸā¸˛ā¸™ā¸žā¸˛ā¸Ģ⏙⏰" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "ā¸”ā¸š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (⏁⏞⏪⏜ā¸Ēā¸Ąāšā¸Ŗā¸‡ā¸šā¸´ā¸”āš€ā¸Ēā¸Ąā¸ˇā¸­ā¸™)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "ā¸ĸā¸˛ā¸™ā¸žā¸˛ā¸Ģ⏙⏰" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆāš„ā¸”āš‰ā¸•ā¸Ŗā¸§ā¸ˆā¸žā¸šā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸•ā¸˛ā¸Ąāšā¸™ā¸§ā¸ĸ⏞⏧⏂⏭⏇⏪⏖ " +"ā¸Ēā¸•ā¸˛ā¸ŖāšŒā¸—ā¸Ŗā¸–ā¸Ģ⏙ā¸ļāšˆā¸‡ā¸„ā¸Ŗā¸ąāš‰ā¸‡āš€ā¸žā¸ˇāšˆā¸­ā¸•ā¸Ŗā¸§ā¸ˆā¸Ģā¸˛ā¸ā¸˛ā¸Ŗā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸š" + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "āš‚ā¸›ā¸Ŗāšā¸ā¸Ŗā¸Ąāš€ā¸Ĩāšˆā¸™ā¸§ā¸´ā¸”ā¸ĩāš‚ā¸­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "ā¸”ā¸šā¸šā¸ąā¸™ā¸—ā¸ļā¸ā¸‚āš‰ā¸­ā¸œā¸´ā¸”ā¸žā¸Ĩā¸˛ā¸”ā¸‚ā¸­ā¸‡ā¸ā¸˛ā¸Ŗā¸‚ā¸ąā¸”ā¸‚āš‰ā¸­ā¸‡āšƒā¸™ IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "ā¸™āš‰ā¸ŗā¸Ģā¸™ā¸ąā¸ā¸Ēāšˆā¸§ā¸™ā¸ā¸˛ā¸Ŗā¸Ąā¸­ā¸‡āš€ā¸Ģāš‡ā¸™" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "ā¸ā¸˛ā¸Ŗāšā¸Ēā¸”ā¸‡ā¸œā¸Ĩ" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ŗā¸­ā¸Ēā¸ąā¸ā¸ā¸˛ā¸“ GPS..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ŗā¸­ā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸œā¸šāš‰ā¸‚ā¸ąā¸š āšƒā¸Šāš‰ QR āš‚ā¸„āš‰ā¸” eSIM ā¸‚ā¸­ā¸‡ā¸œā¸šāš‰āšƒā¸Ģāš‰ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗ ā¸Ģā¸Ŗā¸ˇā¸­ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ē LPA " +"ā¸”āš‰ā¸§ā¸ĸā¸•ā¸™āš€ā¸­ā¸‡" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ŗā¸­āš€ā¸Ŗā¸´āšˆā¸Ąā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™: ⏁⏞⏪⏁⏪⏰⏗⏺⏙ā¸ĩāš‰āšƒā¸Ģāš‰ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒāš€ā¸‚āš‰ā¸˛ā¸–ā¸ļ⏇ SSH āšā¸āšˆā¸„ā¸ĩā¸ĸāšŒā¸Ēā¸˛ā¸˜ā¸˛ā¸Ŗā¸“ā¸°ā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”āšƒā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ " +"GitHub ⏂⏭⏇⏄⏏⏓ ⏭ā¸ĸāšˆā¸˛ā¸›āš‰ā¸­ā¸™ā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰ GitHub ā¸­ā¸ˇāšˆā¸™ā¸™ā¸­ā¸ā¸ˆā¸˛ā¸ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš€ā¸­ā¸‡ ā¸žā¸™ā¸ąā¸ā¸‡ā¸˛ā¸™ā¸‚ā¸­ā¸‡ " +"IQ.Pilot ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ąā¸ĩā¸§ā¸ąā¸™ā¸‚ā¸­āšƒā¸Ģāš‰ā¸„ā¸¸ā¸“āš€ā¸žā¸´āšˆā¸Ąā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰ GitHub ā¸‚ā¸­ā¸‡ā¸žā¸§ā¸āš€ā¸‚ā¸˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™: ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸā¸­ā¸˛ā¸ˆāšā¸ā¸§āšˆā¸‡āšƒā¸™āš‚ā¸„āš‰ā¸‡ā¸—ā¸ĩāšˆā¸•āšˆā¸ŗā¸ā¸§āšˆā¸˛ {} ā¸›ā¸´ā¸”ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁⏙ā¸ĩāš‰ā¸Ģā¸˛ā¸ā¸„ā¸¸ā¸“ā¸Ŗā¸šāš‰ā¸Ēā¸ļā¸āš„ā¸”āš‰" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "ā¸ĸ⏴⏙⏔ā¸ĩā¸•āš‰ā¸­ā¸™ā¸Ŗā¸ąā¸šā¸Ēā¸šāšˆ IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ ā¸ā¸˛ā¸Ŗāš€ā¸Ģā¸ĸā¸ĩā¸ĸā¸šā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡ā¸ˆā¸°ā¸›ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸‚ā¸­ā¸‡ IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi-Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ Wi-Fi āšā¸šā¸šā¸ˆā¸ŗā¸ā¸ąā¸”ā¸›ā¸Ŗā¸´ā¸Ąā¸˛ā¸“" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "⏗ā¸ĩāšˆā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "āšƒā¸Šāšˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "āšƒā¸Šāšˆ ā¸Ĩā¸šāšā¸œā¸™ā¸—ā¸ĩāšˆā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ĸā¸­ā¸Ąā¸Ŗā¸ąā¸šā¸‚āš‰ā¸­ā¸ā¸ŗā¸Ģā¸™ā¸”āšƒā¸™ā¸ā¸˛ā¸Ŗāšƒā¸Ģāš‰ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗāš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡ā¸ĸā¸­ā¸Ąā¸Ŗā¸ąā¸šā¸‚āš‰ā¸­ā¸ā¸ŗā¸Ģā¸™ā¸”āšƒā¸™ā¸ā¸˛ā¸Ŗāšƒā¸Ģāš‰ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗāš€ā¸žā¸ˇāšˆā¸­āšƒā¸Šāš‰ IQ.Pilot " +"ā¸­āšˆā¸˛ā¸™ā¸‚āš‰ā¸­ā¸ā¸ŗā¸Ģ⏙⏔ā¸Ĩāšˆā¸˛ā¸Ēā¸¸ā¸”ā¸āšˆā¸­ā¸™ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸­āš„ā¸”āš‰ā¸—ā¸ĩāšˆ https://iqlvbs.com/tos" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"ā¸Ģā¸Ĩā¸ąā¸‡ā¸ˆā¸˛ā¸ā¸™ā¸ĩāš‰ā¸„ā¸¸ā¸“ā¸•āš‰ā¸­ā¸‡āšƒā¸Šāš‰āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ eSIM ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš€ā¸­ā¸‡ ā¸„ā¸¸ā¸“ā¸ˆā¸°āš„ā¸Ąāšˆā¸Ēā¸˛ā¸Ąā¸˛ā¸Ŗā¸–āšƒā¸Šāš‰ Comma Prime " +"āš„ā¸”āš‰ā¸­ā¸ĩ⏁ āš€ā¸§āš‰ā¸™āšā¸•āšˆā¸ˆā¸°ā¸‹ā¸ˇāš‰ā¸­ā¸‹ā¸´ā¸Ąāšƒā¸Ģā¸Ąāšˆā¸ˆā¸˛ā¸ comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "āš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸­ā¸ĸā¸šāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "āš‚ā¸Ąāš€ā¸”ā¸Ĩ⏗ā¸ĩāšˆāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "āš€ā¸žā¸´āšˆā¸Ąāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "āš€ā¸žā¸´āšˆā¸Ąāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "ā¸”ā¸¸ā¸”ā¸ąā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´ā¸Ąā¸ˇā¸”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"ā¸­ā¸ąā¸›āš€ā¸”ā¸•\n" +"ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "ā¸ĸāš‰ā¸­ā¸™ā¸ā¸Ĩā¸ąā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "ā¸Ē⏞⏂⏞" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "ā¸Ģā¸™āšˆā¸§ā¸‡ā¸āšˆā¸­ā¸™ā¸Ģ⏪ā¸ĩāšˆāšā¸Ē⏇" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸„ā¸ŗā¸™ā¸§ā¸“ā¸Ŗā¸°ā¸ĸ⏰⏗⏞⏇..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸Ŗā¸´āšˆā¸Ąā¸ā¸Ĩāš‰ā¸­ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "ā¸Ąā¸ˇā¸­ā¸–ā¸ˇā¸­āšā¸šā¸šā¸ˆā¸ŗā¸ā¸ąā¸”ā¸›ā¸Ŗā¸´ā¸Ąā¸˛ā¸“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸ⏙\n" +"ā¸ ā¸˛ā¸Šā¸˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ģā¸˛ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "ā¸Ŗā¸§ā¸Ąā¸ā¸ąā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "āš‚ā¸Ąāš€ā¸”ā¸Ĩā¸Ŗā¸§ā¸Ą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛āšā¸Ĩāš‰ā¸§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­āšā¸Ĩāš‰ā¸§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸•āšˆā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "ā¸„āšˆā¸­ā¸ĸ āš† āš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™ā¸ˆā¸˛ā¸ā¸ˆā¸¸ā¸”ā¸Ģā¸ĸ⏏⏔ (āš€ā¸šā¸•ā¸˛)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "ā¸„ā¸Ŗā¸šā¸‹ā¸„ā¸­ā¸™āš‚ā¸—ā¸Ŗā¸Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "ā¸•ā¸ąā¸§ā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ąā¸„ā¸§ā¸˛ā¸Ąāš‚ā¸„āš‰ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "⏁ā¸Ĩāš‰ā¸­ā¸‡ā¸•ā¸´ā¸”ā¸Ŗā¸–" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "ā¸›ā¸ā¸´āš€ā¸Ē⏘" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "ā¸„āšˆā¸˛āš€ā¸Ŗā¸´āšˆā¸Ąā¸•āš‰ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "ā¸Ĩ⏚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "ā¸™ā¸ąā¸ā¸žā¸ąā¸’ā¸™ā¸˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "ā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "⏪ā¸Ģā¸ąā¸Ēā¸­ā¸¸ā¸›ā¸ā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"ā¸›ā¸´ā¸”āš‚ā¸Ģā¸Ąā¸”\n" +"ā¸ˆā¸­ā¸”ā¸šā¸ąā¸‡ā¸„ā¸ąā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "ā¸›ā¸´ā¸”āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”āšā¸šā¸šā¸šā¸ąā¸‡ā¸„ā¸ąā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "⏛⏴⏔⏭ā¸ĸā¸šāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸•ā¸ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "⏛ā¸Ĩā¸”ā¸ā¸˛ā¸Ŗā¸„ā¸§ā¸šā¸„ā¸¸ā¸Ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "⏛ā¸Ĩā¸”āš€ā¸Ąā¸ˇāšˆā¸­āš€ā¸Ģā¸ĸā¸ĩā¸ĸā¸šā¸„ā¸ąā¸™āš€ā¸Ŗāšˆā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡ā¸Ģā¸™āš‰ā¸˛ā¸ˆā¸­" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "ā¸Ĩ⏇" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”ā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"ā¸”ā¸šā¸ ā¸˛ā¸žā¸ā¸Ĩāš‰ā¸­ā¸‡\n" +"ā¸œā¸šāš‰ā¸‚ā¸ąā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸§āšˆā¸˛ā¸‡ā¸‚ā¸“ā¸°ā¸‚ā¸ąā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "āš„ā¸”ā¸™ā¸˛ā¸Ąā¸´ā¸" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "āš€ā¸›ā¸´ā¸”ā¸ā¸Ĩāš‰ā¸­ā¸‡ā¸•ā¸´ā¸”ā¸Ŗā¸–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "āš€ā¸›ā¸´ā¸”āš‚ā¸Ŗā¸Ąā¸Ąā¸´āšˆā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "āš€ā¸›ā¸´ā¸”ā¸­ā¸ĸā¸šāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāšƒā¸Šāš‰ā¸Ŗā¸°ā¸šā¸šāš€ā¸”ā¸´ā¸Ąā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "ā¸›āš‰ā¸­ā¸™ APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰ GitHub..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēāš€ā¸›ā¸´ā¸”āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ LPA..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "ā¸•ā¸Ŗā¸§ā¸ˆā¸Ģā¸˛ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•āš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "ā¸­ā¸ąā¸›āš€ā¸”ā¸•āš„ā¸Ąāšˆā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "āš€ā¸Ŗāš‡ā¸§" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸”ā¸ŗāš€ā¸™ā¸´ā¸™ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•āšƒā¸Ģāš‰āš€ā¸Ēā¸Ŗāš‡ā¸ˆā¸Ēā¸´āš‰ā¸™..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸š \"{}\"" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•ā¸ˆā¸˛ā¸ā¸Ē⏞⏂⏞ā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"ā¸šā¸ąā¸‡ā¸„ā¸ąā¸š\n" +"āš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāšƒā¸Šāš‰ā¸­ā¸´ā¸™āš€ā¸—ā¸­ā¸ŖāšŒāš€ā¸Ÿā¸‹ mici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "ā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš‚ā¸Ģā¸Ąā¸”ā¸ˆā¸­ā¸”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸Ĩā¸ˇā¸Ąāš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "ā¸Ŗā¸šā¸›āšā¸šā¸š: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "ā¸ˆā¸˛ā¸āšā¸„ā¸Š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "ā¸Šā¸Ą." + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šā¸ˆā¸šā¸™ā¸•ā¸˛ā¸Ąā¸ĸ⏞⏧ hyundai" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "ā¸ā¸˛ā¸Ŗāš‚ā¸•āš‰ā¸•ā¸­ā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ iq.dynamic" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "ā¸ā¸Ą./ā¸Šā¸Ą." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "āš€ā¸•ā¸ˇā¸­ā¸™ā¸­ā¸­ā¸ā¸™ā¸­ā¸ā¸Šāšˆā¸­ā¸‡ā¸—ā¸˛ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§āšƒā¸™ā¸ā¸˛ā¸Ŗāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "āš‚ā¸Ģā¸Ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģā¸§ā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "ā¸”āš‰ā¸˛ā¸™ā¸‚āš‰ā¸˛ā¸‡āš€ā¸Ąā¸ˇāšˆā¸­ā¸„ā¸Ŗā¸šā¸‹ā¸‚ā¸ąā¸”ā¸‚āš‰ā¸­ā¸‡" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "āš€ā¸§āš‰ā¸™ā¸§āšˆā¸˛ā¸‡āš€ā¸žā¸ˇāšˆā¸­ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "āš€ā¸§āš‰ā¸™ā¸§āšˆā¸˛ā¸‡āš€ā¸žā¸ˇāšˆā¸­ā¸‚āš‰ā¸˛ā¸Ą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "āš€ā¸§āš‰ā¸™ā¸Šā¸ˇāšˆā¸­ā¸œā¸šāš‰āšƒā¸Šāš‰āšā¸Ĩā¸°āš‚ā¸—āš€ā¸„āš‡ā¸™āšƒā¸Ģāš‰ā¸§āšˆā¸˛ā¸‡āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩāš‰ā¸˛ā¸‡ā¸„āšˆā¸˛" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "ā¸‹āš‰ā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "āš‚ā¸Ģā¸Ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸„ā¸Ĩā¸ˇāšˆā¸­ā¸™āš„ā¸Ģā¸§ā¸•ā¸˛ā¸Ąā¸ĸ⏞⏧" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "ā¸§ā¸˛ā¸‡āšā¸œā¸™āš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧⏗ā¸ĩāšˆā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸•āšˆā¸ŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "⏙." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "ā¸”āš‰ā¸§ā¸ĸā¸•ā¸™āš€ā¸­ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "ā¸Šā¸”āš€ā¸Šā¸ĸā¸„ā¸§ā¸˛ā¸Ąā¸Ģā¸™āšˆā¸§ā¸‡āš€ā¸­ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "āšā¸œā¸™ā¸—ā¸ĩāšˆāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "āšƒā¸Ģāš‰āšā¸œā¸™ā¸—ā¸ĩāšˆā¸Ąā¸˛ā¸āšˆā¸­ā¸™" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸›ā¸Ŗā¸´ā¸Ąā¸˛ā¸“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "āš‚ā¸Ąāš€ā¸”ā¸Ĩ" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "āš„ā¸Ąā¸ĨāšŒ/ā¸Šā¸Ą." + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "āš„ā¸Ąāšˆāš€ā¸„ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "āš„ā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "āš„ā¸Ąāšˆā¸Ąā¸ĩā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "āš„ā¸Ąāšˆā¸•āš‰ā¸­ā¸‡ā¸‚ā¸ĸā¸ąā¸šā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "⏛⏁⏕⏴" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "⏭ā¸ĸā¸šāšˆā¸™ā¸­ā¸ā¸Ŗā¸°ā¸ĸ⏰" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "⏕⏭⏙⏙ā¸ĩāš‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "⏂ā¸ĸā¸ąā¸šā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "⏛⏴⏔" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "ā¸­ā¸­ā¸Ÿāš„ā¸Ĩā¸™āšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "āš€ā¸›ā¸´ā¸”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "ā¸­ā¸­ā¸™āš„ā¸Ĩā¸™āšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "ā¸Šā¸ˇāšˆā¸­āš€ā¸Ĩāšˆā¸™ (āš„ā¸Ąāšˆā¸šā¸ąā¸‡ā¸„ā¸ąā¸š)..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆāšƒā¸™āšā¸­ā¸›" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "ā¸ˆā¸ąā¸šā¸„ā¸šāšˆā¸ā¸ąā¸š Konn3kt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "ā¸™āš‰ā¸ŗā¸Ģā¸™ā¸ąā¸ā¸™āš‚ā¸ĸ⏚⏞ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "ā¸›ā¸´ā¸”āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "ā¸„ā¸˛ā¸”ā¸ā¸˛ā¸Ŗā¸“āšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "ā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "āš„ā¸Ąāšˆā¸—ā¸Ŗā¸˛ā¸šā¸œā¸šāš‰āšƒā¸Ģāš‰ā¸šā¸Ŗā¸´ā¸ā¸˛ā¸Ŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Šāš‚ā¸Ąāš€ā¸”ā¸Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "⏭ā¸ĸā¸šāšˆāšƒā¸™ā¸„ā¸´ā¸§" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "ā¸žā¸Ŗāš‰ā¸­ā¸Ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "⏪ā¸ĩā¸šā¸šā¸•" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "ā¸šā¸ąā¸™ā¸—ā¸ļ⏁⏁ā¸Ĩāš‰ā¸­ā¸‡ā¸œā¸šāš‰ā¸‚ā¸ąā¸š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "ā¸šā¸ąā¸™ā¸—ā¸ļā¸āš„ā¸Ąāš‚ā¸„ā¸Ŗāš‚ā¸Ÿā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āš‚ā¸Ąāš€ā¸”ā¸Ĩāšƒā¸Ģā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "⏪ā¸ĩāš€ā¸Ÿā¸Ŗā¸Šāš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "ā¸‚āš‰ā¸­ā¸Ąā¸šā¸Ĩā¸•ā¸˛ā¸Ąā¸ā¸Žā¸Ģā¸Ąā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "ā¸œāšˆā¸­ā¸™ā¸„ā¸Ĩ⏞ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "āš‚ā¸Ģā¸Ĩ⏔⏪⏞ā¸ĸā¸ā¸˛ā¸Ŗāš‚ā¸Ąāš€ā¸”ā¸Ĩāšƒā¸Ģā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "ā¸Ĩ⏚ pSIM ⏂⏭⏇ comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸Šā¸ˇāšˆā¸­āš‚ā¸›ā¸Ŗāš„ā¸Ÿā¸ĨāšŒ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "⏪ā¸ĩāš€ā¸‹āš‡ā¸•" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "⏪ā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸ⏚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"ā¸”ā¸šā¸„ā¸šāšˆā¸Ąā¸ˇā¸­\n" +"ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "⏂⏧⏞" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "⏧⏴" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "ā¸Ēāšā¸ā¸™ QR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "ā¸Ēāšā¸ā¸™ QR / ā¸›āš‰ā¸­ā¸™ā¸Ŗā¸Ģā¸ąā¸Ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡ā¸„āš‰ā¸™ā¸Ģā¸˛āš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "ā¸›ā¸Ŗā¸ąā¸šā¸„ā¸§ā¸˛ā¸Ąā¸Ģā¸™āšˆā¸§ā¸‡ā¸žā¸§ā¸‡ā¸Ąā¸˛ā¸Ĩā¸ąā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "ā¸Ģā¸Ąā¸˛ā¸ĸāš€ā¸Ĩā¸‚āš€ā¸„ā¸Ŗā¸ˇāšˆā¸­ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§ā¸—ā¸ĩāšˆā¸•ā¸ąāš‰ā¸‡āš„ā¸§āš‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "ā¸Ģā¸™āšˆā¸§ā¸ĸā¸•ā¸˛ā¸Ąā¸•ā¸ŗāšā¸Ģā¸™āšˆā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"āš€ā¸Ĩā¸ˇāšˆā¸­ā¸™āš€ā¸žā¸ˇāšˆā¸­\n" +"ā¸Ĩāš‰ā¸˛ā¸‡āšā¸„ā¸Š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"āš€ā¸Ĩā¸ˇāšˆā¸­ā¸™āš€ā¸žā¸ˇāšˆā¸­\n" +"ā¸•ā¸ąā¸”ā¸ā¸˛ā¸Ŗāš€ā¸Šā¸ˇāšˆā¸­ā¸Ąā¸•āšˆā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"āš€ā¸Ĩā¸ˇāšˆā¸­ā¸™āš€ā¸žā¸ˇāšˆā¸­\n" +"ā¸Ĩā¸ˇā¸Ąāš€ā¸„ā¸Ŗā¸ˇā¸­ā¸‚āšˆā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"āš€ā¸Ĩā¸ˇāšˆā¸­ā¸™āš€ā¸žā¸ˇāšˆā¸­\n" +"ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩā¸”āšƒā¸Ģā¸Ąāšˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"āš€ā¸Ĩā¸ˇāšˆā¸­ā¸™āš€ā¸žā¸ˇāšˆā¸­\n" +"⏪ā¸ĩāš€ā¸‹āš‡ā¸•ā¸ā¸˛ā¸Ŗā¸›ā¸Ŗā¸ąā¸šāš€ā¸—ā¸ĩā¸ĸ⏚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"āš€ā¸Ĩā¸ˇāšˆā¸­ā¸™āš€ā¸žā¸ˇāšˆā¸­\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"āš€ā¸Ĩā¸ˇāšˆā¸­ā¸™āš€ā¸žā¸ˇāšˆā¸­ā¸Ĩ⏚\n" +"pSIM ⏂⏭⏇ comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "ā¸Šāš‰ā¸˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧⏗ā¸ĩāšˆā¸™ā¸¸āšˆā¸Ąā¸™ā¸§ā¸Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "ā¸‹ā¸­ā¸Ÿā¸•āšŒāšā¸§ā¸ŖāšŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "ā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸ˆā¸ŗā¸ā¸ąā¸”ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸Ŗāš‡ā¸§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "ā¸Ąā¸˛ā¸•ā¸Ŗā¸ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "ā¸žā¸ąā¸ā¸ā¸˛ā¸Ŗā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"ā¸Ēā¸•ā¸˛ā¸ŖāšŒā¸—ā¸Ŗā¸–āš€ā¸žā¸ˇāšˆā¸­\n" +"āšƒā¸Šāš‰ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸Ŗā¸´āšˆā¸Ą..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "ā¸Ē⏖⏞⏙⏰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "⏄⏇⏁⏞⏪⏗⏺⏇⏞⏙" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "ā¸ā¸˛ā¸Ŗā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "ā¸žā¸¤ā¸•ā¸´ā¸ā¸Ŗā¸Ŗā¸Ąā¸Ŗā¸°ā¸šā¸šā¸Šāšˆā¸§ā¸ĸā¸šā¸ąā¸‡ā¸„ā¸ąā¸šāš€ā¸Ĩā¸ĩāš‰ā¸ĸ⏧" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "ā¸ˆā¸˛ā¸āš‚ā¸Ŗā¸‡ā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "ā¸Ģā¸ĸā¸¸ā¸”āšā¸Ĩā¸°āš„ā¸›ā¸”āš‰ā¸§ā¸ĸāš€ā¸šā¸Ŗā¸ā¸Ąā¸ˇā¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "ā¸Ģā¸ĸā¸¸ā¸”ā¸”ā¸˛ā¸§ā¸™āšŒāš‚ā¸Ģā¸Ĩ⏔" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "⏪⏰⏚⏚⏁⏺ā¸Ĩā¸ąā¸‡āš€ā¸Ŗā¸´āšˆā¸Ąā¸—ā¸ŗā¸‡ā¸˛ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "ā¸Ēā¸˛ā¸‚ā¸˛āš€ā¸›āš‰ā¸˛ā¸Ģā¸Ąā¸˛ā¸ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"ā¸‚āš‰ā¸­ā¸ā¸ŗā¸Ģā¸™ā¸”āšā¸Ĩ⏰\n" +"āš€ā¸‡ā¸ˇāšˆā¸­ā¸™āš„ā¸‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "⏛ā¸Ĩāšˆā¸­ā¸ĸā¸Ēā¸ąā¸ā¸ā¸˛ā¸“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™ā¸ā¸˛ā¸Ŗā¸›ā¸Ĩāšˆā¸­ā¸ĸā¸Ēā¸ąā¸ā¸ā¸˛ā¸“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "ā¸•ā¸ąā¸§āš€ā¸Ĩ⏎⏭⏁" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "ā¸ā¸˛ā¸Ŗāš€ā¸”ā¸´ā¸™ā¸—ā¸˛ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "ā¸–ā¸­ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "ā¸–ā¸­ā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡ IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "āš„ā¸Ąāšˆā¸ˆā¸ŗā¸ā¸ąā¸”ā¸›ā¸Ŗā¸´ā¸Ąā¸˛ā¸“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "āš„ā¸Ąāšˆā¸Ŗā¸­ā¸‡ā¸Ŗā¸ąā¸š" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "⏂ā¸ļāš‰ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "āš€ā¸›āš‡ā¸™āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "āš€ā¸›āš‡ā¸™āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔ ā¸ĸā¸ąā¸‡āš„ā¸Ąāšˆāš€ā¸„ā¸ĸā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "āš€ā¸›āš‡ā¸™āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔ ā¸•ā¸Ŗā¸§ā¸ˆā¸Ē⏭⏚ā¸Ĩāšˆā¸˛ā¸Ē⏏⏔ {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"āš‚ā¸Ģā¸Ąā¸”ā¸•ā¸´ā¸”ā¸•ā¸ąāš‰ā¸‡\n" +"ā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "ā¸Ąā¸ĩā¸ā¸˛ā¸Ŗā¸­ā¸ąā¸›āš€ā¸”ā¸•" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"ā¸•ā¸ąā¸§ā¸­ā¸ąā¸›āš€ā¸”ā¸•āš„ā¸Ąāšˆ\n" +"ā¸•ā¸­ā¸šā¸Ē⏙⏭⏇" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "ā¸Ģā¸™āšˆā¸§ā¸ĸāš€ā¸Ąā¸•ā¸Ŗā¸´ā¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "ā¸ĸā¸˛ā¸™ā¸žā¸˛ā¸Ģ⏙⏰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "āš€ā¸§ā¸­ā¸ŖāšŒā¸Šā¸ąā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "⏁⏞⏪⏜ā¸Ēā¸Ąāšā¸Ŗā¸‡ā¸šā¸´ā¸”āš€ā¸Ēā¸Ąā¸ˇā¸­ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "ā¸™āš‰ā¸ŗā¸Ģā¸™ā¸ąā¸ā¸ā¸˛ā¸Ŗā¸Ąā¸­ā¸‡āš€ā¸Ģāš‡ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "ā¸ā¸˛ā¸Ŗāšā¸Ēā¸”ā¸‡ā¸œā¸Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "ā¸„ā¸ŗāš€ā¸•ā¸ˇā¸­ā¸™" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "⏪ā¸Ģā¸ąā¸Ēā¸œāšˆā¸˛ā¸™āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "āšƒā¸Šāšˆ" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} ā¸ā¸˛ā¸Ŗāšā¸ˆāš‰ā¸‡āš€ā¸•ā¸ˇā¸­ā¸™" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{} ā¸§ā¸ąā¸™ā¸—ā¸ĩāšˆāšā¸Ĩāš‰ā¸§" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{} ā¸Šā¸ąāšˆā¸§āš‚ā¸Ąā¸‡ā¸—ā¸ĩāšˆāšā¸Ĩāš‰ā¸§" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{} ⏙⏞⏗ā¸ĩ⏗ā¸ĩāšˆāšā¸Ĩāš‰ā¸§" diff --git a/iqpilot/selfdrive/ui/translations/app_tr.mo b/iqpilot/selfdrive/ui/translations/app_tr.mo new file mode 100644 index 000000000..8861e340b Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_tr.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_tr.po b/iqpilot/selfdrive/ui/translations/app_tr.po new file mode 100644 index 000000000..97f7df612 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_tr.po @@ -0,0 +1,4670 @@ +# Turkish translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-20 18:19-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (varsayÄąlan)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " Direksiyon tork tepkisi kalibrasyonu tamamlandÄą." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " Direksiyon tork tepkisi kalibrasyonu {}% tamamlandÄą." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " CihazÄąnÄąz {:.1f}° {} ve {:.1f}° {} yÃļnÃŧnde konumlandÄąrÄąlmÄąÅŸ." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    Direksiyon gecikmesi kalibrasyonu tamamlandÄą." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    Direksiyon gecikmesi kalibrasyonu %{} tamamlandÄą." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "AKTİF" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"ADB (Android Debug Bridge), cihazÄąnÄąza USB Ãŧzerinden veya ağ Ãŧzerinden " +"bağlanmayÄą sağlar." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "EKLE" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "TÜM ZAMANLAR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "APN ayarÄą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "GİRİŞ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "OTOMATİK" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "ivme çubuğu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "İvme gÃļstergesi" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "AÅŸÄąrÄą MÃŧdahaleyi Onayla" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "Etkinleştir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "Etkin model" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "YalnÄązca {} Ãŧzerinde etkin." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "Profil ekle" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "eSIM profili ekle" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "Şerit dÃļnÃŧş isteği hÄązÄąnÄą ayarla" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "Gelişmiş" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"Bundan sonra kendi eSIM profilinizi kullanmanÄąz gerekir.\n" +"\n" +"Comma'dan yeni bir SIM almadığınÄąz sÃŧrece Comma Prime'Äą tekrar kullanamazsÄąnÄąz." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "Agresif" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "Kabul et" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "TÃŧmÃŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "TÃŧm eyaletler (~6,0 GB)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"IQ.Pilot'un, otomatik devam etmeyen uzatÄąlmÄąÅŸ tutmalÄą FtS'ye sahip " +"desteklenen Volkswagen MQB araçlarda MQB ACC devam etme davranÄąÅŸÄąnÄą " +"kullanmasÄąna izin verir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"HÄąz sabitleyici arÄązasÄą nedeniyle boylamsal kontrol (gaz/fren) geçici olarak" +" kullanÄąlamadığında bile yanal kontrolÃŧn (direksiyon) etkin kalmasÄąna izin " +"verir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "SÃŧrekli yanal kontrol (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "Ve çok daha fazlasÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "Hemen uygulanÄąr." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "Cihaz bir sonraki kez park moduna geçtiğinde uygulanÄąr." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "Kapatmak istediğinizden emin misiniz?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "Yeniden başlatmak istediğinizden emin misiniz?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"TÃŧm IQ.Pilot ayarlarÄąnÄą varsayÄąlana sÄąfÄąrlamak istediğinizden emin misiniz? " +"Ayarlar sÄąfÄąrlandÄąktan sonra geri dÃļnÃŧş yoktur." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "Kalibrasyonu sÄąfÄąrlamak istediğinizden emin misiniz?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "KaldÄąrmak istediğinizden emin misiniz?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "Otomatik" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "otomatik şerit değişimi" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "Otomatik şerit değişimi: sÃŧrekli değişimler" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "Otomatik — kÄąsÄąk" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "AyarlarÄą otomatik kapat" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"Beta uygulamasÄąnÄąn geçerli olduğu Subaru platformlarÄąnda, trafiği izlerken " +"duraktan otomatik olarak kalkar." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "HÄąz sabitleyici değişirken kullanÄąlabilirlik" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "Geri" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "KÃļr nokta uyarÄąlarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "kÃļr nokta uyarÄąlarÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "Sinyal gÃļstergeleri" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "Sinyalle başlatÄąlan şerit değişimi" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "AÃ§ÄąlÄąÅŸ durumu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "Fren tepki modu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"Klasik arayÃŧzÃŧn geniş park durum şeridini geri getirir: sÄącaklÄąk, araç ve " +"Konn3kt durumu bir bakÄąÅŸta." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "DEĞİŞTİR" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "KONTROL ET" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "TEMİZLE" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "BAĞLAN" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "BAĞLAN" + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "İptal" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "Navigasyonu iptal et" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "KotalÄą mobil veri" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "Dili Değiştir" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" +" Bu ayarÄą değiştirmek, araç çalÄąÅŸÄąyorsa IQ.Pilot'u yeniden başlatacaktÄąr." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "Denetlendi {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "Bir model seçin" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"Boylamsal davranÄąÅŸÄą seçin: IQ.Pilot (IQ boylamsal + uçtan uca), IQ.Dynamic " +"(IQ boylamsal + dinamik mod), IQ.Chill (IQ boylamsal + sakin profil) veya" +" orijinal ACC." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "Elle seçildi" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "Önbelleği temizle" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "Seçili modelin Ãļnbelleği temizlenip yeniden indirilsin mi?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "Kapat" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"MEB ve MQB Evo araçlarda direksiyon kontrolÃŧnÃŧ kapalÄą çevrim yapar. " +"IQ.Pilot planlanan eğriliği doğrudan gÃļndermek yerine, aracÄąn gerçekte " +"tuttuğu eğriliğe gÃļre direksiyon komutunu dÃŧzeltir." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "Bulut" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "YalnÄązca bulut" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "Bulut videosu kullanÄąlamÄąyor" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "Parmak izi durumu için renk anahtarÄą:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "Birleşik model" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"Boylamsal aktÃŧatÃļr tepkisini Ãļlçmek için betikle tanÄąmlÄą bir ivmelenme " +"dizisi uygular. IQ.Pilot boylamsal kontrolÃŧ gerektirir. YalnÄązca aÃ§Äąk ve " +"trafiğe kapalÄą bir yolda kullanÄąn." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"Direksiyon aktÃŧatÃļrÃŧnÃŧn tepkisini Ãļlçmek için betikle tanÄąmlÄą bir yanal " +"ivmelenme dizisi uygular. YalnÄązca dÃŧz, dÃŧzgÃŧn ve aÃ§Äąk bir yolda kullanÄąn." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "Onayla" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "Devam" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "sÃŧrekli değişimler" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "Kontrol" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"IQ.Pilot'un hÄąz sÄąnÄąrÄą davranÄąÅŸÄąnÄą denetler. KapalÄą hÄąz sÄąnÄąrÄą Ãļzelliklerini" +" devre dÄąÅŸÄą bÄąrakÄąr, Bilgi yalnÄązca sÄąnÄąrlarÄą gÃļsterir, UyarÄą hÄąz aÅŸÄąmÄąnÄą " +"vurgular, Kontrol ise ayarlanan hÄązÄą algÄąlanan sÄąnÄąrlara gÃļre dÃŧzenler." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "SSH anahtarlarÄą alÄąnamadÄą - gÃŧnlÃŧklere bakÄąn" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "Bu yer bulunamadÄą" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "GitHub'a ulaÅŸÄąlamadÄą - bağlantÄąyÄą kontrol edin" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "GitHub doğrulanamadÄą - cihaz saatini kontrol edin" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "Ülke" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "ÇÃļkme gÃŧnlÃŧğÃŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "Duraktan yavaş kalkÄąÅŸ (Beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "Duraktan yavaş kalkÄąÅŸ — elle el freni (Beta)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "HÄąz sabitleyici" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "Geçerli SÃŧrÃŧm" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "Eğrilik Denetleyicisi" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "SİL" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "BAĞLANTI KESİLİYOR..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "İNDİR" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "Reddet" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "Reddet, IQ.Pilot'u kaldÄąr" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "VarsayÄąlan" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "VarsayÄąlan (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "VarsayÄąlan: sÃŧrÃŧşe hazÄąr aÃ§ÄąlÄąr, devreye alma hemen kullanÄąlabilir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"Sinyalle tetiklenen bir şerit değişiminin kendiliğinden başlamasÄąndan Ãļnceki" +" gecikme — bir gecikme ayarlandığında direksiyona dokunmak gerekmez " +"(varsayÄąlan: Direksiyon dokunuşu).
    Bunun için sinyali yalnÄązca trafik ve " +"yol manevraya gerçekten izin verdiğinde kullanÄąn." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "kÃļr noktada gecikme" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "Sil" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "Devre dÄąÅŸÄą profil \"{}\" silinsin mi?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "Bu gÃŧnlÃŧk silinsin mi?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "VarÄąÅŸ noktasÄą ayarlandÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "Otomatik algÄąlandÄą" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "Geliştirici" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "Cihaz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "Eşleştirmek için cihazÄąn Konn3kt'e kayÄątlÄą olmasÄą gerekir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "KÄąsma gecikmesi" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "BağlantÄąyÄą kes" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "Devre dÄąÅŸÄą bÄąrak" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "Park modunu zorlamadan Ãļnce devre dÄąÅŸÄą bÄąrakÄąn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "Yolu zorlamadan Ãļnce devre dÄąÅŸÄą bÄąrakÄąn" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "Gaz PedalÄąnda Devreden Ã‡Äąk" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "Kapatmak için Devreden Ã‡ÄąkÄąn" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "Yeniden Başlatmak için Devreden Ã‡ÄąkÄąn" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "Kalibrasyonu SÄąfÄąrlamak için Devreden Ã‡ÄąkÄąn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "{} için devre dÄąÅŸÄą bÄąrakÄąn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "Devre dÄąÅŸÄą bÄąrak: frenleme direksiyon desteğini tamamen kapatÄąr." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "Ekran" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "Ekran parlaklığı" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "HÄązÄą mph yerine km/h olarak gÃļster." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "Mesafe" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "SÃŧrÃŧcÃŧ kamerasÄą verilerini yÃŧklemek ister misiniz?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "Tamam" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "Dongle ID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "İndir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "İndirme başarÄąsÄąz — tekrar deneyin." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "Harita karolarÄą indiriliyor" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"Sol kenar boyunca ÃļlçÃŧlen ivmelenme ve frenlemeyi izleyen bir çubuk çizer — " +"planlayÄącÄąnÄąn isteği değil, aracÄąn şu anda gerçekten yaptığı şey." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"Ekran haritasÄąnÄą cihazda saklanan karolardan çizer. Çevrimiçi ile birlikte " +"kullanÄąldığında, bağlantÄą koptuğu anda saklanan karolar devreye girer. " +"Karolar seçtiğiniz bÃļlge için indirilir." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "SÃŧrÃŧcÃŧ KamerasÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "SÃŧrÃŧcÃŧ kamerasÄą denetimi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "SÃŧrÃŧcÃŧ mÃŧdahalesinin ele alÄąnmasÄą" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "SÃŧrÃŧşler" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "SÃŧrÃŧş parlaklığı" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "SÃŧrÃŧş Kişiliği" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "Dinamik" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "Dinamik ayar: daha canlÄą gaz/fren tepkisi." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "DÜZENLE" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "HATA" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "Etkinleştir" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "ADB'yi Etkinleştir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"Always on Lateral (AOL) Ãļzelliğini etkinleştir. Orijinal IQ.Pilot direksiyon" +" devreye girme davranÄąÅŸÄąna dÃļnmek için bu anahtarÄą kapatÄąn." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "KamerayÄą etkinleştir" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "Şerit Terk UyarÄąlarÄąnÄą Etkinleştir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"DÃŧşÃŧk hÄązda LKAS arÄązalarÄą olan Volkswagen MQB araçlarda MQB direksiyon " +"kilidi işlemesini etkinleştirir." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "DolaÅŸÄąmÄą etkinleştir" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "SSH'yi Etkinleştir" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "Şerit Terk UyarÄąlarÄąnÄą Etkinleştir" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "IQ.Pilot devrede değilken bile sÃŧrÃŧcÃŧ izlemesini etkinleştir." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "APN girin" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "Etkinleştirme kodunu girin" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "Kod gir" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "SSID girin" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "Bir adres veya yer girin" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "Yeni bağlantÄą noktasÄą parolasÄąnÄą girin" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "ParolayÄą girin" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "GitHub kullanÄącÄą adÄąnÄązÄą girin" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "Hata" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "Park modundan Ã§Äąk" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Genişletilmiş durum çubuğu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "deneysel Ãļndeki araç MPC" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"Bir bilgisayara bağlandığında son kamera kliplerinin ve gÃŧnlÃŧklerin bir " +"anlÄąk gÃļrÃŧntÃŧsÃŧnÃŧ USB sÃŧrÃŧcÃŧ olarak sunar. Bu etkinken IQ.Pilot çalÄąÅŸmaya " +"devam eder." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "UNUTULUYOR..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"Şu anda fabrika Toyota boylamsal kontrolÃŧ zorunlu kÄąlÄąnÄąyor. Devre dÄąÅŸÄą " +"bÄąrakmak için bir IQ boylamsal modu seçin." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "Fabrika varsayÄąlanÄą boylamsal ayar." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "favoriler" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "Harita alÄąnÄąyor" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "Haritalar alÄąnÄąyor..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "Son uyarÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "AracÄąnÄązÄą bulun" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "Kurulumu Bitir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"Araç kÃļr noktanÄązda bir şey bildirdiğinde yandan bir uyarÄą gÃļsterir " +"(yalnÄązca BSM donanÄąmlÄą araçlar)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" +"Bunu değiştirmek için Cihaz panelinden Her Zaman Park'Äą aÃ§Äąn veya aracÄą " +"kapatÄąn." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "takip mesafesi" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "Eşleştirmeyi tamamlamak için uygulamadaki yÃļnergeleri izleyin" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"IQ.Pilot 10 dakika boyunca yola zorlansÄąn mÄą? Her Zaman Park otomatik olarak" +" etkinleştirilir ve sÃŧre dolunca cihaz park moduna dÃļner." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "Mici arayÃŧzÃŧnÃŧ zorla" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "Yolu zorla (10 dk)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "Yolu zorla yalnÄązca park modundayken başlatÄąlabilir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "Yolu zorla zaten etkin. ZamanlayÄącÄą 10 dakikaya sÄąfÄąrlansÄąn mÄą?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "ZorlanmÄąÅŸ yol modu etkin" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Unut" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "\"{}\" Wi-Fi ağı unutulsun mu?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "İYİ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Git kimlik doğrulamasÄą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Git belirteci / parolasÄą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Git kullanÄącÄą adÄą" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "Anahtarlar alÄąnÄąrken GitHub hatasÄą ({})" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "YÜKSEK" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "Ağ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "KÃļr nokta için şerit değişimini beklet" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "Sabit tutun..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"KÃļr nokta izleme hedef şeritte bir araç bildirdiği sÃŧrece otomatik şerit " +"değişimini bekletir ve şerit boşaldığında serbest bÄąrakÄąr." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Ev" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "Saat" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"Ayarlar ekranÄąnÄąn kendiliğinden kapanmadan Ãļnce dokunulmadan ne kadar " +"kalabileceği." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"Kendi kendini ayarlama kapalÄąyken aracÄąn kendi direksiyon kutusu gecikmesine" +" ne kadar ÃļngÃļrÃŧ sÃŧresi ekleneceği. VarsayÄąlan 0,2 sn'dir." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "YÜKLE" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "IP adresi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "IQ zorunlu duruşlar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "IQ modu" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"IQ boylamsal modlarÄą bu araç için kullanÄąlamÄąyor. Tek kullanÄąlabilir seçenek" +" orijinal ACC'dir." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic virajlar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic Ãļndeki araç hÄązÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic dÃŧşÃŧk hÄąz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic model duruşlarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic SLC yedeği" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic daha yavaş Ãļndeki araç" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic duran Ãļndeki araç" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "IQ.OS sÃŧrÃŧmÃŧ" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot KullanÄąlamÄąyor" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +" Bu ayarÄą değiştirmek, araç çalÄąÅŸÄąyorsa IQ.Pilot'u yeniden başlatacaktÄąr." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"IQ.Pilot, cihazÄąn sağa/sola 4° ve yukarÄą 5° veya aşağı 9° içinde monte " +"edilmesini gerektirir." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"20 mil/s (32 km/s) veya altÄąnda sÃŧrÃŧyorsanÄąz ve sinyaliniz aÃ§Äąksa, araç en " +"yakÄąn sÃŧrÃŧlebilir yolda o yÃļne bir dÃļnÃŧş planlar. Bu, aracÄąn yanlÄąÅŸ dÃļnÃŧş " +"yÃļnÃŧnÃŧ planlayabileceği durumlarÄą (kÄąrmÄązÄą ÄąÅŸÄąklarda olduğu gibi) Ãļnler." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "Bilgi" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" +"eSIM kullanmak için cihazla birlikte gelen orijinal comma SIM kartÄąnÄą takÄąn" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "GÃŧncellemeyi YÃŧkle" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "Geçersiz QR kodu" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "KM" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "KONN3KT HATASI" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT ÇEVRİMDIŞI" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "CihazÄą park modunda tut" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "Fabrika gaz ve frenini koru" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "" +"Gaz ve frenleri fabrika Toyota sistemine bÄąrakÄąr; IQ.Pilot yalnÄązca " +"direksiyonu kullanÄąr." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Konn3kt Ãļzellikleri:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Konn3kt durumu:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "SINIR" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "YÜKLENİYOR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "YÜKLENİYOR..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "Şerit değişimi seçenekleri" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "HÄąz sabitleyici arÄązalÄąyken yanal kontrol" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "Yanal manevra modu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "Öndeki araç okumalarÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "Her Zaman Park modundan şimdi Ã§ÄąkÄąlsÄąn mÄą?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "ZorlanmÄąÅŸ park modundan şimdi Ã§ÄąkÄąlsÄąn mÄą?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"IQ.Pilot'un direksiyonunuzun tepki sÃŧresini Ãļlçmesine ve bu değeri gÃŧncel " +"tutmasÄąna izin verin. SÃŧreyi kendiniz sabitlemek için kapatÄąn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" +"Sistem devredeyken direksiyonu tamamen devre dÄąÅŸÄą bÄąrakmadan hafifçe " +"oynatmanÄąza izin verir." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "CanlÄą yayÄąn" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "%s yÃŧkleniyor" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "Video yÃŧkleniyor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "YÃŧkleniyor..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "Konum bulunuyor..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "" +"Bu platformda KAPALI olarak kilitli; araç başka seçenekleri desteklemiyor." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "Boylamsal kontrol" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"Boylamsal kontrol modlarÄą:
    IQ.Pilot Ãļzellikleri aşağıda " +"listelenmiştir:

    IQ.Pilot Uçtan Uca Boylamsal Kontrol


    Gaz ve " +"frenleri sÃŧrÃŧş modelinin kontrol etmesine izin verin. IQ.Pilot, kÄąrmÄązÄą " +"ÄąÅŸÄąklarda ve dur tabelalarÄąnda durmak dÃĸhil, bir insanÄąn sÃŧreceğini " +"dÃŧşÃŧndÃŧğÃŧ gibi sÃŧrer. HÄązÄą sÃŧrÃŧş modeli belirlediğinden, ayarlanan hÄąz " +"yalnÄązca Ãŧst sÄąnÄąr işlevi gÃļrÃŧr. Bu Ãļzellik hÃĸlÃĸ geliştiriliyor; hatalar " +"beklenmelidir.

    IQ.Dynamic


    Sahneye ve bağlama gÃļre uyarlamalÄą " +"hÄąz sabitleyici davranÄąÅŸÄą ile uçtan uca davranÄąÅŸÄą dinamik olarak " +"harmanlar.

    IQ.Chill


    Boylamsal kontrol için standart, " +"trafiğe duyarlÄą hÄąz sabitleyici davranÄąÅŸÄąnÄą kullanÄąr.

    Yeni sÃŧrÃŧş " +"gÃļrselleştirmesi


    SÃŧrÃŧş gÃļrselleştirmesi, bazÄą dÃļnÃŧşleri daha iyi " +"gÃļstermek için dÃŧşÃŧk hÄązlarda yola bakan geniş aÃ§ÄąlÄą kameraya geçer. AyrÄąca " +"sağ Ãŧst kÃļşede IQ.Pilot logosu gÃļrÃŧnÃŧr." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "Boylamsal Manevra Modu" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "Boylamsal ayar profili" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "daha yÃŧksek ÃļngÃļrÃŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "daha dÃŧşÃŧk ÃļngÃļrÃŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "DÃŧşÃŧk hÄązda dÃļnÃŧş planlamasÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"MEB ve MQB Evo araçlarda planlanan eğriliği direksiyon kutusuna ulaşmadan " +"Ãļnce alçak geçiren filtreden geçirir ve yanal salÄąnÄąmÄą sÃļndÃŧrÃŧr. Bu " +"araçlarda varsayÄąlan olarak aÃ§ÄąktÄąr." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "ELLE" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "MAKS" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "MQB ACC devam etme" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "MQB ACC devam etme" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "MQB direksiyon kilidi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "MQB direksiyon kilidi" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "BakÄąm" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "Elle gecikme sapmasÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "Harita veritabanÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "ÖlçÃŧlen:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "Mil" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "AracÄąn sinyallerini sÃŧrÃŧş ekranÄąnda oklar olarak yansÄątÄąr." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "model durma sÃŧresi" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "Modeller" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "Yok" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "PANDA YOK" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "YOK" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "Navigasyon" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "Navigasyon iptal edildi" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "YakÄąn" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "Ağ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "sinir ağı FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "Sinir ağı ileri beslemesi (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "Asla uyuma" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "HayÄąr" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "Dokunuşsuz" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "QR algÄąlanmadÄą" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "'{}' için SSH anahtarÄą bulunamadÄą" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "Wi-Fi ağı bulunamadÄą" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "" +"Geliştirici modunda kamera algÄąlanmadÄą. Devam etmek için denetle'ye dokunun." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "SÃŧrÃŧm notu mevcut değil." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "Sonuç yok" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "Kaydedilmiş rota yok" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "Araç ayarlanmadÄą" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "Bu kamera için video yok" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"Normalde sinyal aÃ§Äąk kalsa bile tek bir manevra şerit değişimini bitirir. " +"Sinyal aÃ§Äąk kaldığı sÃŧrece ardÄąÅŸÄąk değişimler yapmak için bunu aÃ§Äąn — " +"sonraki her biri yine de direksiyon dokunuşu ister." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "Bu Subaru platformunda kullanÄąlamaz." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "BağlÄą değil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "AyarlanmadÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"Not: LFA/LKAS dÃŧğmesi olmayan araçlarda bunu kapatmak, hÄąz sabitleyici " +"kullanÄąlabilirliği değişirken direksiyon desteğinin hazÄąrlanmasÄąnÄą Ãļnler." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "Direksiyon dokunuşu" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "ÇEVRİMDIŞI" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "ÇEVRİMİÇİ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "KapalÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "ÇevrimdÄąÅŸÄą ekran haritalarÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "Park" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "Park modu kapanma zamanlayÄącÄąsÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "Park: her aÃ§ÄąlÄąÅŸta veya uyanÄąÅŸta Her Zaman Park moduna girer." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "Sapma:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "Cihazda" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "Çevrimiçi ekran haritalarÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "SÃŧrÃŧşte geliştirici arayÃŧzÃŧ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "Telefonunuzda Konn3kt uygulamasÄąnÄą aÃ§Äąn" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "İsteğe bağlÄą takma ad" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"SÃŧrÃŧş sÄąrasÄąnda canlÄą kontrol ÃļlçÃŧmlerinden oluşan bir çubuk gÃļsterir " +"(direksiyon, yanal ivme, Ãļndeki araç verileri)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "EŞLE" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "GEÇEN HAFTA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "PQ HCA Status 7 modu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "PQ HCA status 7 modu" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "ÖNİZLEME" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "CihazÄą Eşle" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "Şimdi YÃŧkselt" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "CihazÄą eşle" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "CihazÄąnÄązÄą Konn3kt uygulamasÄąnda eşleştirin" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "CihazÄąnÄązÄą Konn3kt uygulamasÄąnda eşleştirin." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "CihazÄąnÄązÄą comma hesabÄąnÄązla eşleştirin" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "GÃŧncellemeleri duraklat" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "Bir arama yapÄąn" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "" +"IQ.Pilot'ta sÃŧrÃŧcÃŧ fren yaptığında direksiyon desteğinin nasÄąl tepki " +"vereceğini seçin." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "Fren pedalÄąna basmanÄąn direksiyon desteğine ne yapacağınÄą seçin." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"HazÄąr bir gÃŧncellemenin yalnÄązca onayÄąnÄązÄą mÄą bekleyeceğini yoksa " +"kendiliğinden indirilip kurulacağınÄą mÄą seçin." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "AracÄąnÄązÄą seçin" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "Otomatik algÄąlamayÄą atlamak için bir araç sabitleyin." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"CanlÄą okumalarÄą (mesafe, hÄąz, Ãļndeki araca kalan sÃŧre) Ãļndeki aracÄą " +"işaretleyen imlece sabitler. Gaz ve freni IQ.Pilot'un kontrol etmesini " +"gerektirir." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "İlk eşleştirmeyi tamamlamak için lÃŧtfen Wi‑Fi'a bağlanÄąn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "İlk eşleştirmeyi tamamlamak için lÃŧtfen Wi-Fi'ye bağlanÄąn." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "AnahtarÄąnÄązÄą almak için lÃŧtfen Wi-Fi'ye bağlanÄąn." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "GÃŧncellemek için lÃŧtfen Wi-Fi'ye bağlanÄąn." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "SÃŧrÃŧcÃŧ kamerasÄąnÄą operatÃļrÃŧn eSIM QR koduna doğrultun (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "Politika ağırlÄąklarÄą" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "Kapat" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"Motor kapalÄąyken bu kadar sÃŧre beklediğinde cihazÄą kapatÄąr.\n" +"(varsayÄąlan 30 sa)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "ÖngÃļrÃŧlÃŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "ÖngÃļrÃŧlÃŧ ayar: ivme değişimlerini Ãļnceden tahmin edip yumuşatÄąr." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "Önceden indir + Ãļnceden kur" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "YalnÄązca Ãļnceden indir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "Harita karolarÄą hazÄąrlanÄąyor..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "KotalÄą Wi-Fi bağlantÄąsÄąnda bÃŧyÃŧk veri yÃŧklemelerini engelle" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "KotalÄą mobil bağlantÄąda bÃŧyÃŧk veri yÃŧklemelerini engelle" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"SÃŧrÃŧcÃŧ izleme gÃļrÃŧnÃŧrlÃŧğÃŧnÃŧn iyi olduğundan emin olmak için sÃŧrÃŧcÃŧye bakan " +"kamerayÄą Ãļnizleyin. (araç kapalÄą olmalÄądÄąr)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "Profil işlemleri" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"CihazÄąn interneti olduğunda ekran haritasÄą için canlÄą Mapbox karolarÄąnÄą " +"indirir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "Model Ãļnbelleğini temizle" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"GÃŧncellemelerin nasÄąl kurulacağınÄą değiştirmeden Ãļnce cihazÄą Her Zaman Park " +"moduna alÄąn veya aracÄą kapatÄąn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"Bunlara dokunmadan Ãļnce cihazÄą Her Zaman Park moduna alÄąn veya aracÄą " +"kapatÄąn." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "QR Kod HatasÄą" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "QR kodu kabul edildi" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "HAZIR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "YENİDEN İNDİR" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "YENİLE" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "KALDIR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "KALDIRILIYOR..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "SIFIRLA" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "GÖZDEN GEÇİR" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "Direksiyon kutusu:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"YÃŧzÃŧnÃŧz kapalÄąysa veya sÃŧrÃŧcÃŧ izleme yÃŧzÃŧnÃŧzÃŧ takip etmekte zorlanÄąyorsa " +"cihazÄą yeniden monte edin." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "YalnÄązca araç kapalÄąyken veya Her Zaman Park aÃ§Äąkken erişilebilir." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "Yeniden Başlat" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "CihazÄą Yeniden Başlat" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "Yeniden Başlat ve GÃŧncelle" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"Araç 31 mph (50 km/h) Ãŧzerindeyken sinyal verilmeden algÄąlanan şerit " +"çizgisini aştığınÄązda şeride geri dÃļnmeniz için uyarÄąlar alÄąn." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "SÃŧrÃŧcÃŧ KamerasÄąnÄą Kaydet ve YÃŧkle" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "Mikrofon Sesini Kaydet ve YÃŧkle" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"SÃŧrÃŧş sÄąrasÄąnda mikrofon sesini kaydedip saklayÄąn. Ses, Konn3kt'teki Ãļn " +"kamera videosuna dahil edilecektir." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"SÃŧrÃŧş verilerini ve videoyu kaydedip yÃŧkle. Bunu kapatmak tÃŧm kaydÄą " +"durdurur! GÃŧnlÃŧk yok, video yok, ses yok." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "Yeniden indir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "Geçerli modeli yeniden indir" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "Profilleri yenile" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "Mevzuat" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "Rahat" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "Model listesini yeniden yÃŧkle" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "Etkin kal: frenleme direksiyon desteğini asla kesmez." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "Uzaktan erişim" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "KaldÄąr" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "Comma pSIM'i kaldÄąr" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "Yeniden adlandÄąr" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "Profili yeniden adlandÄąr" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "İstek zaman aÅŸÄąmÄąna uğradÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "" +"IQ.Pilot Boylamsal Kontrol (Alfa) Ãļzelliğinin etkin olmasÄąnÄą gerektirir." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "SÄąfÄąrla" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "Kalibrasyonu SÄąfÄąrla" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "VarsayÄąlanlarÄą geri yÃŧkle" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "Eğitim KÄąlavuzunu İncele" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "" +"IQ.Pilot'un kurallarÄąnÄą, Ãļzelliklerini ve sÄąnÄąrlamalarÄąnÄą gÃļzden geçirin" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "yol adÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "Yol adÄą yerleşimi" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "Rotalar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "Rota motoru sÃŧrÃŧmÃŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "Bu cihazda kompakt comma 4 (mici) arayÃŧzÃŧnÃŧ çalÄąÅŸtÄąr" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "SEÇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC otomatik onay" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC yÃŧkseği onayla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC dÃŧşÃŧğÃŧ onayla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC yedeği IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC çevrimiçi doldurma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC geçersiz kÄąlma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC politikasÄą" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "SSH anahtarlarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "SSH anahtarlarÄą" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "ORİJİNAL ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "Tara" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "QR tara" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "QR kodu tarayÄąn veya etkinleştirme kodunu girin" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "Wi-Fi ağlarÄą taranÄąyor..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "Ara" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "Adres veya yer ara" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "Marka veya model ara" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "AranÄąyor..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "Seç" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "Bir dal seçin" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "Bir dil seçin" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "Kendi kendini ayarlayan direksiyon gecikmesi" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "Seri" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "Ev'i ayarla" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "Birimleri konuma gÃļre ayarla" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "İş'i ayarla" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "Ev adresini ayarla" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"Birimleri cihazÄąn konumuna gÃļre ayarla. HÄązlar, Amerika Birleşik Devletleri," +" Birleşik KrallÄąk ve Liberya dÄąÅŸÄąnda her yerde km/s'ye geçer ve bir sÄąnÄąrÄą " +"geçtiğinizde yeniden denetlenir." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "İş adresini ayarla" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"Şerit dÃļnÃŧş isteklerinin kullandığı hÄąz eşiğini belirler. Bu değerin altÄąnda" +" dÃļnÃŧş istekleri en yakÄąn sÃŧrÃŧlebilir dÃļnÃŧş yolunu planlayabilir. VarsayÄąlan" +" 19 mil/s'dir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"CihazÄąn bir aÃ§ÄąlÄąÅŸtan veya uykudan uyanmadan sonra hangi duruma geçeceğini " +"belirler." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "Ayarlar" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"Geçerli yolun adÄąnÄą sÃŧrÃŧş gÃļrÃŧnÃŧmÃŧnÃŧn Ãŧzerinde gÃļsterir.
    BÃļlgeniz için " +"çevrimdÄąÅŸÄą harita verisinin kurulu olmasÄąnÄą gerektirir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "Yumuşak Direksiyon" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "GÃŧncellemeyi Ertele" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "YazÄąlÄąm" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "HÄąz" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "HÄąz sÄąnÄąrÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "HÄąz sÄąnÄąrÄą kontrolÃŧ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "Standart" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"Standart Ãļnerilir. Agresif modda IQ.Pilot Ãļndeki aracÄą daha yakÄąndan takip " +"eder ve gaz/fren kullanÄąmÄąnda daha ataktÄąr. Rahat modda IQ.Pilot Ãļndeki " +"araçlardan daha uzak durur. Desteklenen araçlarda bu kişilikler arasÄąnda " +"direksiyon mesafe dÃŧğmesiyle geçiş yapabilirsiniz." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "Beklemede" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"Beklemede: frenleme direksiyon desteğini duraklatÄąr; pedaldan ayağınÄązÄą " +"çektiğinizde geri dÃļner." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "İndirmeyi başlat" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" +"Direksiyon desteği davranÄąÅŸ uyumluluğunu denetlemek için aracÄą çalÄąÅŸtÄąrÄąn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "Eyalet" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "İstatistikler" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "Durum" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Etkin kal" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "Direksiyon" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "Direksiyon desteği davranÄąÅŸÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Direksiyon kuvveti yayÄą" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "Orijinal ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "İndirmeyi durdur" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Elle el freni bulunan Subaru Global araçlar için dur-kalk çeşidi. Elektrikli" +" park freni olan araçlarda kapalÄą bÄąrakÄąn. Bu uygulama için martinl'e " +"teşekkÃŧrler!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "Saklanan haritalar" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "Buluttan aktarÄąlÄąyor" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "Cihaz Her Zaman Park moduna alÄąnsÄąn mÄą?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "Cihaz zorlanmÄąÅŸ park moduna alÄąnsÄąn mÄą?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "Sistem" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "Sistem YanÄąt Vermiyor" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "HEMEN KONTROLÜ DEVRALIN" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "TEMP" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "SICAKLIK YÜKSEK" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "SICAKLIK İYİ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "\"Add Device\"a dokunun ve sağdaki QR kodu tarayÄąn" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "Hedef dal" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "BağlantÄą noktasÄą parolasÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"Seçili model değişti. Kalibrasyonu sÄąfÄąrlamanÄązÄą Ãļneririz. Bunu şimdi yapmak" +" ister misiniz?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "Bu çalÄąÅŸtÄąktan sonra geri alÄąnamaz — vazgeçmek için son şans." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "" +"Bunun uygulanmasÄą için yeniden başlatma gerekir. Şimdi yeniden başlatÄąlsÄąn " +"mÄą?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "Bu platform yalnÄązca Devre dÄąÅŸÄą bÄąrak moduyla sÄąnÄąrlÄądÄąr." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "" +"Bu platform, direksiyon desteği davranÄąÅŸ seçeneklerinin sÄąnÄąrlÄą bir kÃŧmesini" +" destekler." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" +"Bu platform, direksiyon desteği davranÄąÅŸÄąnÄąn tam yapÄąlandÄąrmasÄąnÄą destekler." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"Bu, indirilen TÜM haritalarÄą siler\n" +"\n" +"TÃŧm haritalarÄą silmek istediğinizden emin misiniz?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"Bu, etkin model dÄąÅŸÄąnda indirilen TÜM modelleri Ãļnbellekten siler. Emin " +"misiniz?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "Bu, Comma pSIM profilini SIM'den kalÄącÄą olarak siler." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "Bu, indirme işlemini başlatÄąr ve tamamlanmasÄą biraz zaman alabilir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "SÃŧre" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "Seçenekler" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "Toplam:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"Yanal kontrol çalÄąÅŸÄąrken IQ.Pilot'un ne kadar direksiyon uyguladığınÄą " +"gÃļsteren bir yayÄą yol gÃļrÃŧnÃŧmÃŧnÃŧn Ãŧzerine çizer." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "Eğitim kÄąlavuzu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "sinyaller" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"Kablosuz gÃŧncelleme denetimlerini tamamen kapatÄąr.
    Etkili olmasÄą için " +"yeniden başlatÄąn." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "Bir yÄąl, ardÄąndan bir model yazÄąn — Ãļrneğin, 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "Aramak için yazÄąn" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "KULLANILAMIYOR" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "KALDIR" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "GÜNCELLE" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "USB depolama" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "KULLAN" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "Video yÃŧklenemedi" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "Araç yoldayken kullanÄąlamaz." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "KullanÄąlamÄąyor — bu araçta IQ.Pilot boylamsal kontrolÃŧ etkin değil." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "AlgÄąlanmadÄą ve ayarlanmadÄą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "KaldÄąr" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "Bilinmiyor" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "Bilinmeyen operatÃļr" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "SÄąnÄąrsÄąz rota depolama" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "GÃŧncelleme kurulum modu" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "GÃŧncellemeler yalnÄązca araç kapalÄąyken indirilir." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "SÃŧrÃŧş sÄąrasÄąnda yÃŧkle" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"SÃŧrÃŧcÃŧye bakan kameradan veri yÃŧkleyin ve sÃŧrÃŧcÃŧ izleme algoritmasÄąnÄą " +"geliştirmeye yardÄąmcÄą olun." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "YÃŧklendi" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "YÃŧkleniyor" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"PQ platformu araçlarda direksiyon kontrolÃŧ için Status 5 yerine HCA Status 7" +" kullanÄąr. Bu, bazÄą eski Volkswagen modellerinde uyumluluğa yardÄąmcÄą " +"olabilir." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "Metrik Sistemi Kullan" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"Etkinleştirme kodunu kullan:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"Uyarlanabilir hÄąz sabitleyici ve şerit koruma sÃŧrÃŧcÃŧ yardÄąmÄąnda IQ.Pilot " +"sistemini kullanÄąn. Bu Ãļzelliği kullanÄąrken her zaman dikkatli olmanÄąz " +"gerekir." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "ARAÇ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "GÖRÜNTÜLE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (sanal tork harmanlama)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "Araç" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"AracÄąn boylamsal kontrol yeteneği henÃŧz algÄąlanmadÄą. Desteği algÄąlamak için " +"aracÄą bir kez çalÄąÅŸtÄąrÄąn." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Video oynatÄącÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "IQ.Pilot çÃļkmelerinin hata gÃŧnlÃŧğÃŧnÃŧ gÃļrÃŧntÃŧle." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "GÃļrÃŧş ağırlÄąklarÄą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "GÃļrseller" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "GPS sinyali bekleniyor..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"SÃŧrÃŧcÃŧ kamerasÄą bekleniyor. OperatÃļrÃŧn eSIM QR kodunu kullanÄąn veya LPA " +"kodunu elle girin." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "Başlatma bekleniyor" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "UyarÄą" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"UyarÄą: Bu, GitHub ayarlarÄąnÄązdaki tÃŧm genel anahtarlara SSH erişimi verir. " +"Kendinizinki dÄąÅŸÄąnda asla bir GitHub kullanÄącÄą adÄą girmeyin. Bir IQ.Pilot " +"çalÄąÅŸanÄą sizden ASLA kendi GitHub kullanÄącÄą adÄąnÄą eklemenizi istemez." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"UyarÄą: {} altÄąndaki dÃļnÃŧşlerde direksiyon salÄąnÄąm yapabilir; bunu " +"hissederseniz kapatÄąn." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "IQ.Pilot'a hoş geldiniz" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "" +"Etkinleştirildiğinde, gaz pedalÄąna basmak IQ.Pilot'u devreden Ã§ÄąkarÄąr." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "KotalÄą Wi-Fi ağı" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "İş" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "YanlÄąÅŸ parola" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "Evet" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "Evet, tÃŧm haritalarÄą sil" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "IQ.Pilot'u kullanabilmek için Hizmet ŞartlarÄą'nÄą kabul etmelisiniz." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"IQ.Pilot'u kullanmak için Hizmet ŞartlarÄą'nÄą kabul etmelisiniz. Devam " +"etmeden Ãļnce en gÃŧncel şartlarÄą https://iqlvbs.com/tos adresinde okuyun." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"Bundan sonra kendi eSIM profilinizi kullanmanÄąz gerekir. Comma'dan yeni bir " +"SIM almadÄąkça Comma Prime'Äą tekrar kullanamazsÄąnÄąz." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "etkinleştir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "etkin" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "etkin model" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "eSIM profili ekle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "profil ekle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "agresif" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "APN ayarlarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "otomatik" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "otomatik koyu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"otomatik\n" +"gÃŧncellemeler" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "geri" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "dal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "kÄąsma gecikmesi" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "mil hesaplanÄąyor..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "kamera başlatÄąlÄąyor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "kotalÄą mobil veri" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"dil\n" +"değiştir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "gÃŧncelleme denetle" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "denetleniyor..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "birleşik" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "birleşik model" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "yapÄąlandÄąrÄąldÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "bağlan" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "bağlandÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "bağlanÄąyor..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "devam" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "kontrol" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "duraktan yavaş kalkÄąÅŸ (beta)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "hÄąz sabitleyici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "eğrilik denetleyicisi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "kamera" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "reddet" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "varsayÄąlan" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "sil" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "geliştirici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "cihaz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "cihaz kimliği" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"zorlamayÄą\n" +"kapat" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "park zorlamasÄąnÄą kapat" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "devre dÄąÅŸÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "bağlantÄą kesiliyor..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "devre dÄąÅŸÄą bÄąrak" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "gaz pedalÄąnda devre dÄąÅŸÄą bÄąrak" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "ekran" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "ekran parlaklığı" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "aşağı" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "gÃŧncellemeyi indir" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "indiriliyor" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "indiriliyor..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"sÃŧrÃŧcÃŧ kamerasÄą\n" +"Ãļnizleme" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "sÃŧrÃŧş parlaklığı" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "dinamik" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "kamerayÄą etkinleştir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "dolaÅŸÄąmÄą aç" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "etkin" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "fabrika boylamsalÄą zorla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "APN girin" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "GitHub kullanÄącÄą adÄą girin..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "LPA etkinleştirme kodu girin..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "kod girin" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "parola girin..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "gÃŧncelleme kontrolÃŧ başarÄąsÄąz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "gÃŧncelleme başarÄąsÄąz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "hÄązlÄą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "gÃŧncelleme tamamlanÄąyor..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "\"{}\" için" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "Ãļzel dal gÃŧncellemeleri için" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"park modunu\n" +"zorla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "mici arayÃŧzÃŧnÃŧ zorla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "park modunu zorla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "unutuluyor..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "biçim: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "Ãļnbellekten" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "sa" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "hyundai boylamsal ayarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "bilgi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "gÃŧncellemeyi kur" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "etkileşim" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "iq.dynamic ayarlarÄą" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "şerit değişimi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "şerit ihlali uyarÄąlarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "dÃļnÃŧş hÄązÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "yanal manevra modu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "hÄąz sabitleyici arÄązalÄąyken yanal" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "otomatik yapÄąlandÄąrma için boş bÄąrakÄąn" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "atlamak için boş bÄąrakÄąn" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "temizlemek için kullanÄącÄą adÄąnÄą ve belirteci boş bÄąrakÄąn" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "sol" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "boylamsal manevra modu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "dÃŧşÃŧk hÄązda dÃļnÃŧş planlama" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "dk" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "profilleri yÃļnet" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "elle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "elle gecikme sapmasÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "yalnÄązca harita" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "harita Ãļnceliği" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "kotalÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "modeller" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "ağ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "ağ kullanÄąmÄą" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "asla" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "hayÄąr" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "uyarÄą yok" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "dokunuşsuz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "normal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "menzil dÄąÅŸÄąnda" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "şimdi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "direksiyon dokunuşu" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "kapalÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "çevrimdÄąÅŸÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "aÃ§Äąk" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "çevrimiçi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "isteğe bağlÄą ad..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "uygulamada eşleştir" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "Konn3kt ile eşleştir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "politika ağırlÄąklarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "kapat" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "ÃļngÃļrÃŧlÃŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "profil işlemleri" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "operatÃļr bilinmiyor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "model Ãļnbelleğini temizle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "sÄąrada" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "hazÄąr" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "yeniden başlat" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "sÃŧrÃŧcÃŧ kamerasÄąnÄą kaydet" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "mikrofonu kaydet" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "modeli yeniden indir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "profilleri yenile" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "yasal bilgiler" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "sakin" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "model listesini yenile" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "comma pSIM'i kaldÄąr" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "yeniden adlandÄąr" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "profili yeniden adlandÄąr..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "sÄąfÄąrla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "kalibrasyonu sÄąfÄąrla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"eğitim kÄąlavuzunu\n" +"gÃļzden geçir" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "sağ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "sn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "QR tara" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "QR tara / kod gir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "ağlar aranÄąyor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "kendi kendine ayarlanan gecikme" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "seri numarasÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "ayarlanan hÄąz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "birimleri konuma gÃļre ayarla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"kaydÄąrarak\n" +"Ãļnbelleği temizle" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"kaydÄąrarak\n" +"bağlantÄąyÄą kes" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"kaydÄąrarak\n" +"unut" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"kaydÄąrarak\n" +"yeniden indir" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"kaydÄąrarak\n" +"kalibrasyonu sÄąfÄąrla" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"kaydÄąrarak\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"kaydÄąrarak comma\n" +"pSIM'i kaldÄąr" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "yavaş" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "yumuşak direksiyon" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "yazÄąlÄąm" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "hÄąz sÄąnÄąrÄą ayarlarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "standart" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "beklemede" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"IQ.Pilot'u kullanmak için\n" +"aracÄą çalÄąÅŸtÄąrÄąn" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "başlatÄąlÄąyor..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "durum" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "etkin kal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "direksiyon" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "direksiyon desteği davranÄąÅŸÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "orijinal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "dur-kalk el freni" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "indirmeyi durdur" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "sistem başlatÄąlÄąyor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "hedef dal" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"şartlar ve\n" +"koşullar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "bağlantÄą noktasÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "bağlantÄą noktasÄą parolasÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "seçenekler" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "yolculuklar" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "kaldÄąr" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "IQ.Pilot'u kaldÄąr" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "kotasÄąz" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "desteklenmiyor" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "yukarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "gÃŧncel" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "gÃŧncel, son kontrol asla" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "gÃŧncel, son kontrol {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"gÃŧncelleme kurulum\n" +"modu" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "gÃŧncelleme mevcut" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"gÃŧncelleyici yanÄąt\n" +"vermiyor" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "metrik birimler" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "araç" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "sÃŧrÃŧm" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "sanal tork harmanlama" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "gÃļrÃŧş ağırlÄąklarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "gÃļrseller" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "uyarÄą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "yanlÄąÅŸ parola" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "evet" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} UYARI" +msgstr[1] "{} UYARILAR" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{} gÃŧn Ãļnce" +msgstr[1] "{} gÃŧn Ãļnce" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{} saat Ãļnce" +msgstr[1] "{} saat Ãļnce" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{} dakika Ãļnce" +msgstr[1] "{} dakika Ãļnce" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 yÄąl sÃŧrÃŧş depolamasÄą" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "7/24 LTE bağlantÄąsÄą" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "UYARI: Bu araç için openpilot boylamsal kontrolÃŧ alfa aşamasÄąndadÄąr ve " +#~ "Otomatik Acil Frenlemeyi (AEB) devre dÄąÅŸÄą bÄąrakacaktÄąr.

    Bu araçta" +#~ " openpilot, openpilot'un boylamsal kontrolÃŧ yerine aracÄąn yerleşik ACC'sini " +#~ "varsayÄąlan olarak kullanÄąr. openpilot boylamsal kontrolÃŧne geçmek için bunu " +#~ "etkinleştirin. openpilot boylamsal kontrol alfayÄą etkinleştirirken Deneysel " +#~ "modu etkinleştirmeniz Ãļnerilir." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB (Android Debug Bridge), cihazÄąnÄąza USB veya ağ Ãŧzerinden bağlanmayÄą " +#~ "sağlar. Daha fazla bilgi için https://docs.comma.ai/how-to/connect-to-comma " +#~ "adresine bakÄąn." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "SÃŧrekli SÃŧrÃŧcÃŧ İzleme" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "" +#~ "openpilot boylamsal kontrolÃŧnÃŧn alfa sÃŧrÃŧmÃŧ, Deneysel mod ile birlikte, " +#~ "yayÄąn dÄąÅŸÄą dallarda test edilebilir." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "konn3kt.com'yi ana ekranÄąnÄąza ekleyerek bir uygulama gibi kullanÄąn" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "CHILL MODU AÇIK" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "" +#~ " Bu ayarÄą değiştirmek, araç çalÄąÅŸÄąyorsa openpilot'u yeniden başlatacaktÄąr." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "\"yeni cihaz ekle\"ye tÄąklayÄąn ve sağdaki QR kodunu tarayÄąn" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "Reddet, openpilot'u kaldÄąr" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "DENEYSEL MOD AÇIK" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "openpilot devrede değilken bile sÃŧrÃŧcÃŧ izlemesini etkinleştir." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "openpilot'u etkinleştir" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "" +#~ "Deneysel modu etkinleştirmek için openpilot boylamsal kontrolÃŧnÃŧ (alfa) " +#~ "aÃ§Äąn." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "Deneysel Mod" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "" +#~ "Bu araçta boylamsal kontrol için stok ACC kullanÄąldığından şu anda Deneysel " +#~ "mod kullanÄąlamÄąyor." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "PRIME ÖZELLİKLERİ:" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Firehose Modu" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "Maksimum verim için cihazÄąnÄązÄą içeri alÄąn ve haftalÄąk olarak iyi bir USB-C adaptÃļrÃŧne ve Wi‑Fi'a bağlayÄąn.\n" +#~ "\n" +#~ "Firehose Modu, bir hotspot'a veya sÄąnÄąrsÄąz SIM karta bağlÄąyken sÃŧrÃŧş sÄąrasÄąnda da çalÄąÅŸabilir.\n" +#~ "\n" +#~ "\n" +#~ "SÄąkça Sorulan Sorular\n" +#~ "\n" +#~ "NasÄąl veya nerede sÃŧrdÃŧğÃŧm Ãļnemli mi? HayÄąr, normalde nasÄąl sÃŧrÃŧyorsanÄąz Ãļyle sÃŧrÃŧn.\n" +#~ "\n" +#~ "Firehose Modu'nda tÃŧm segmentlerim çekiliyor mu? HayÄąr, segmentlerinizin bir alt kÃŧmesini seçerek çekiyoruz.\n" +#~ "\n" +#~ "İyi bir USB‑C adaptÃļrÃŧ nedir? HÄązlÄą bir telefon veya dizÃŧstÃŧ şarj cihazÄą uygundur.\n" +#~ "\n" +#~ "Hangi yazÄąlÄąmÄą çalÄąÅŸtÄąrdığım Ãļnemli mi? Evet, yalnÄązca upstream openpilot (ve bazÄą fork'lar) eğitim için kullanÄąlabilir." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "Telefonunuzda https://konn3kt.com adresine gidin" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "PASİF: sÄąnÄąrsÄąz bir ağa bağlanÄąn" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "Joystick Hata AyÄąklama Modu" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "" +#~ "openpilot'un sÃŧrÃŧş modellerini iyileştirmek için eğitim veri yÃŧklemelerinizi" +#~ " en Ãŧst dÃŧzeye Ã§ÄąkarÄąn." + +#~ msgid "NO" +#~ msgstr "HAYIR" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "SSH anahtarÄą bulunamadÄą" + +#, python-format +#~ msgid "Open" +#~ msgstr "Aç" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "" +#~ "CihazÄąnÄązÄą Konn3kt (konn3kt.com) ile eşleştirin ve Konn3kt teklifinizi alÄąn." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "konn3kt.com adresinde Konn3kt Ãŧyesi olun" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "Uzaktan anlÄąk gÃļrÃŧntÃŧler" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "" +#~ "openpilot'un kurallarÄąnÄą, Ãļzelliklerini ve sÄąnÄąrlamalarÄąnÄą gÃļzden geçirin" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "Standart Ãļnerilir. Agresif modda openpilot Ãļndeki aracÄą daha yakÄąndan takip " +#~ "eder ve gaz/fren kullanÄąmÄąnda daha ataktÄąr. Rahat modda openpilot Ãļndeki " +#~ "araçlardan daha uzak durur. Desteklenen araçlarda bu kişilikler arasÄąnda " +#~ "direksiyon mesafe dÃŧğmesiyle geçiş yapabilirsiniz." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "" +#~ "Uyarlanabilir hÄąz sabitleyici ve şerit koruma sÃŧrÃŧcÃŧ yardÄąmÄąnda openpilot " +#~ "sistemini kullanÄąn. Bu Ãļzelliği kullanÄąrken her zaman dikkatli olmanÄąz " +#~ "gerekir." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "UyarÄą: Bu, GitHub ayarlarÄąnÄązdaki tÃŧm aÃ§Äąk anahtarlara SSH erişimi verir. " +#~ "Kendi adÄąnÄąz dÄąÅŸÄąnda asla bir GitHub kullanÄącÄą adÄą girmeyin. Bir comma " +#~ "çalÄąÅŸanÄą sizden asla GitHub kullanÄącÄą adlarÄąnÄą eklemenizi İSTEMEZ." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "openpilot'a hoş geldiniz" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "" +#~ "Etkinleştirildiğinde, gaz pedalÄąna basmak openpilot'u devreden Ã§ÄąkarÄąr." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "openpilot'u kullanmak için Şartlar ve KoşullarÄą kabul etmelisiniz." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "openpilot'u kullanmak için Şartlar ve KoşullarÄą kabul etmelisiniz. Devam " +#~ "etmeden Ãļnce en gÃŧncel şartlarÄą https://comma.ai/terms adresinde okuyun." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "openpilot Boylamsal Kontrol (Alfa)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot KullanÄąlamÄąyor" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilot varsayÄąlan olarak chill modunda sÃŧrer. Deneysel mod, chill moduna " +#~ "hazÄąr olmayan alfa seviyesindeki Ãļzellikleri etkinleştirir. Deneysel " +#~ "Ãļzellikler aşağıda listelenmiştir:

    Uçtan Uca Boylamsal " +#~ "Kontrol


    SÃŧrÃŧş modelinin gaz ve frenleri kontrol etmesine izin verin." +#~ " openpilot, kÄąrmÄązÄą ÄąÅŸÄąklarda ve dur işaretlerinde durmak dahil, bir insan " +#~ "nasÄąl sÃŧrer diye dÃŧşÃŧndÃŧğÃŧne gÃļre sÃŧrer. HÄązÄą sÃŧrÃŧş modeli belirlediğinden, " +#~ "ayarlanan hÄąz yalnÄązca Ãŧst sÄąnÄąr olarak işlev gÃļrÃŧr. Bu bir alfa kalitesinde" +#~ " Ãļzelliktir; hatalar beklenmelidir.

    Yeni SÃŧrÃŧş " +#~ "GÃļrselleştirmesi


    SÃŧrÃŧş gÃļrselleştirmesi, dÃŧşÃŧk hÄązlarda bazÄą " +#~ "dÃļnÃŧşleri daha iyi gÃļstermek için yola bakan geniş aÃ§ÄąlÄą kameraya geçer. " +#~ "Deneysel mod logosu sağ Ãŧst kÃļşede de gÃļsterilecektir." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ " Bu ayarÄą değiştirmek, araç çalÄąÅŸÄąyorsa openpilot'u yeniden başlatacaktÄąr." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilot, sizin gibi insanlarÄąn nasÄąl sÃŧrdÃŧğÃŧnÃŧ izleyerek sÃŧrmeyi Ãļğrenir.\n" +#~ "\n" +#~ "Firehose Modu, openpilot'un sÃŧrÃŧş modellerini geliştirmek için eğitim veri yÃŧklemelerinizi en Ãŧst dÃŧzeye Ã§ÄąkarmanÄąza olanak tanÄąr. Daha fazla veri, daha bÃŧyÃŧk modeller demektir; bu da daha iyi Deneysel Mod anlamÄąna gelir." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "openpilot boylamsal kontrolÃŧ gelecekteki bir gÃŧncellemede gelebilir." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "" +#~ "openpilot, cihazÄąn sağa/sola 4° ve yukarÄą 5° veya aşağı 9° içinde monte " +#~ "edilmesini gerektirir." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "{} segment sÃŧrÃŧşÃŧnÃŧz eğitim veri setinde." +#~ msgstr[1] "{} segment sÃŧrÃŧşÃŧnÃŧz eğitim veri setinde." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ ABONE" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Firehose Modu đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_uk.mo b/iqpilot/selfdrive/ui/translations/app_uk.mo new file mode 100644 index 000000000..4f6dd7149 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_uk.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_uk.po b/iqpilot/selfdrive/ui/translations/app_uk.po new file mode 100644 index 000000000..9ce50fe47 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_uk.po @@ -0,0 +1,4695 @@ +# Ukrainian translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-11-19 13:27+0200\n" +"Last-Translator: KeeFeeRe \n" +"Language-Team: none\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 3.8\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr " (Ņ‚Đ¸ĐŋОвО)" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " КаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ€ĐĩаĐē҆Җҗ ĐēŅ€ŅƒŅ‚ĐŊĐžĐŗĐž ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐēĐĩŅ€Đŧа СавĐĩŅ€ŅˆĐĩĐŊĐž." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr "КаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ€ĐĩаĐē҆Җҗ ĐēŅ€ŅƒŅ‚ĐŊĐžĐŗĐž ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ ĐēĐĩŅ€Đŧа СавĐĩŅ€ŅˆĐĩĐŊĐž ĐŊа {}%." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " Đ’Đ°Ņˆ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŊĐ°Ņ…Đ¸ĐģĐĩĐŊĐž ĐŊа {:.1f}° {} Ņ‚Đ° {:.1f}° {}." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    КаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēи ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ СавĐĩŅ€ŅˆĐĩĐŊĐž." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    КаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēи ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ СавĐĩŅ€ŅˆĐĩĐŊĐž ĐŊа {}%." + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "АКĐĸИВНИЙ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "" +"ADB (Android Debug Bridge) дОСвОĐģŅŅ” ĐŋŅ–Đ´â€™Ņ”Đ´ĐŊŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ Đ´Đž ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ҇ĐĩŅ€ĐĩС USB айО" +" ĐŧĐĩŅ€ĐĩĐļ҃." + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "ДОДАĐĸИ" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "ЗА ВЕСĐŦ ЧАХ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ APN" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "ВĐĨІД" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "АВĐĸО" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "ҁĐŧŅƒĐŗĐ° ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "ІĐŊдиĐēĐ°Ņ‚ĐžŅ€ ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "ВизĐŊĐ°ĐšŅ‚Đĩ ĐŊадĐŧŅ–Ņ€ĐŊĐĩ ҁĐŋŅ€Đ°Ņ†ŅŒĐžĐ˛ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "АĐēŅ‚Đ¸Đ˛ŅƒĐ˛Đ°Ņ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "АĐēŅ‚Đ¸Đ˛ĐŊа ĐŧОдĐĩĐģҌ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "АĐēŅ‚Đ¸Đ˛ĐŊĐž ĐģĐ¸ŅˆĐĩ Đ˛Đ¸Ņ‰Đĩ {}." + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģҌ" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "Đ”ĐžĐ´Đ°Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģҌ eSIM" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ ĐŊаĐŧŅ–Ņ€Ņƒ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņƒ" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "Đ ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊŅ–" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"ĐŸŅ–ŅĐģŅ Ņ†ŅŒĐžĐŗĐž дОвĐĩĐ´ĐĩŅ‚ŅŒŅŅ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ вĐģĐ°ŅĐŊиĐŧ ĐŋŅ€ĐžŅ„Ņ–ĐģĐĩĐŧ eSIM.\n" +"\n" +"Ви ĐŊĐĩ СĐŧĐžĐļĐĩŅ‚Đĩ СĐŊĐžĐ˛Ņƒ ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ Comma Prime, ŅĐēŅ‰Đž ĐŊĐĩ ĐŋŅ€Đ¸Đ´ĐąĐ°Ņ”Ņ‚Đĩ ĐŊĐžĐ˛Ņƒ SIM-ĐēĐ°Ņ€Ņ‚Đē҃ Đ˛Ņ–Đ´ comma." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "ĐĐŗŅ€ĐĩŅĐ¸Đ˛ĐŊ." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "ĐŸĐžĐŗĐžĐ´Đ¸Ņ‚Đ¸ŅŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "ĐŖŅĐĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "ĐŖŅŅ– ŅˆŅ‚Đ°Ņ‚Đ¸ (~6,0 ГБ)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "" +"ДозвоĐģŅŅ” IQ.Pilot виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃ Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ACC MQB ĐŊа " +"ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°ĐŊĐ¸Ņ… Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅŅ… Volkswagen MQB Ņ–Đˇ FtS Ņ–Đˇ ĐŋОдОвĐļĐĩĐŊиĐŧ ŅƒŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅĐŧ ĐąĐĩС" +" Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžĐŗĐž Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "" +"ДозвоĐģŅŅ” ĐąŅ–Ņ‡ĐŊĐžĐŧ҃ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅŽ (ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅŽ) ĐģĐ¸ŅˆĐ°Ņ‚Đ¸ŅŅ аĐēŅ‚Đ¸Đ˛ĐŊиĐŧ, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐēĐžĐģи " +"ĐŋОСдОвĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ (ĐŗĐ°Đˇ/ĐŗĐ°ĐģҌĐŧĐž) Ņ‚Đ¸ĐŧŅ‡Đ°ŅĐžĐ˛Đž ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐĩ ҇ĐĩŅ€ĐĩС ĐŊĐĩҁĐŋŅ€Đ°Đ˛ĐŊŅ–ŅŅ‚ŅŒ " +"ĐēŅ€ŅƒŅ—Đˇ-ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅŽ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "ĐŸĐžŅŅ‚Ņ–ĐšĐŊĐĩ ĐąŅ–Ņ‡ĐŊĐĩ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "І ĐąĐ°ĐŗĐ°Ņ‚Đž Ņ–ĐŊŅˆĐžĐŗĐž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "Đ—Đ°ŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ĐžĐ´Ņ€Đ°ĐˇŅƒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "Đ—Đ°ŅŅ‚ĐžŅŅƒŅ”Ņ‚ŅŒŅŅ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊĐžĐŗĐž Ņ€Đ°ĐˇŅƒ, ĐēĐžĐģи ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŋĐĩŅ€ĐĩКдĐĩ в ĐžŅ„Ņ€ĐžŅƒĐ´." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ виĐŧĐēĐŊŅƒŅ‚Đ¸?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŋĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "" +"ĐĄĐŋŅ€Đ°Đ˛Đ´Ņ– ҁĐēиĐŊŅƒŅ‚Đ¸ Đ˛ŅŅ– ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ IQ.Pilot Đ´Đž Ņ‚Đ¸ĐŋĐžĐ˛Đ¸Ņ…? ĐŸŅ–ŅĐģŅ ҁĐēидаĐŊĐŊŅ " +"ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ Ņ—Ņ… ĐŊĐĩ виКдĐĩ." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ҁĐēиĐŊŅƒŅ‚Đ¸ ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ?" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "Ви вĐŋĐĩвĐŊĐĩĐŊŅ–, Ņ‰Đž Ņ…ĐžŅ‡ĐĩŅ‚Đĩ видаĐģĐ¸Ņ‚Đ¸?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "ĐĐ˛Ņ‚Đž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊа СĐŧŅ–ĐŊа ҁĐŧŅƒĐŗĐ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "ĐĐ˛Ņ‚ĐžĐˇĐŧŅ–ĐŊа ҁĐŧŅƒĐŗĐ¸: ĐąĐĩСĐŋĐĩŅ€ĐĩŅ€Đ˛ĐŊŅ– СĐŧŅ–ĐŊи" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "ĐĐ˛Ņ‚Đž — ĐŋŅ€Đ¸Ņ‚ĐĩĐŧĐŊĐĩĐŊĐž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "ĐĐ˛Ņ‚ĐžĐˇĐ°ĐēŅ€Đ¸Ņ‚Ņ‚Ņ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "" +"ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ŅƒŅˆĐ°Ņ” ĐŋҖҁĐģŅ ĐˇŅƒĐŋиĐŊĐēи ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ŅƒŅ…Ņƒ в ĐŋĐžŅ‚ĐžŅ†Ņ–, ĐŊа ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€ĐŧĐ°Ņ… Subaru," +" Đ´Đĩ ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛ĐŊа ĐąĐĩŅ‚Đ°-Ņ€ĐĩаĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "Đ”ĐžŅŅ‚ŅƒĐŋĐŊŅ–ŅŅ‚ŅŒ ĐŋŅ–Đ´ Ņ‡Đ°Ņ СĐŧŅ–ĐŊ ĐēŅ€ŅƒŅ—ĐˇŅƒ" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "Назад" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "ĐĄĐŋĐžĐ˛Ņ–Ņ‰ĐĩĐŊĐŊŅ ĐŋŅ€Đž ҁĐģŅ–Đŋ҃ СОĐŊ҃" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đž ҁĐģŅ–Đŋ҃ СОĐŊ҃" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "ІĐŊдиĐēĐ°Ņ‚ĐžŅ€Đ¸ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņ–Đ˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "ЗĐŧŅ–ĐŊа ҁĐŧŅƒĐŗĐ¸ Са ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐēĐžĐŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "ĐĄŅ‚Đ°ĐŊ ĐŋҖҁĐģŅ СаĐŋ҃ҁĐē҃" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "Đ ĐĩаĐēŅ†Ņ–Ņ ĐŊа ĐŗĐ°ĐģҌĐŧŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "" +"ПовĐĩŅ€Ņ‚Đ°Ņ” ŅˆĐ¸Ņ€ĐžĐē҃ ҁĐŧŅƒĐŗŅƒ ŅŅ‚Đ°ĐŊ҃ ĐžŅ„Ņ€ĐžŅƒĐ´ Ņ–Đˇ ĐēĐģĐ°ŅĐ¸Ņ‡ĐŊĐžĐŗĐž Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅŅƒ: Ņ‚ĐĩĐŧĐŋĐĩŅ€Đ°Ņ‚ŅƒŅ€Đ°, " +"Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ Ņ– ŅŅ‚Đ°ĐŊ Konn3kt С ĐŋĐĩŅ€ŅˆĐžĐŗĐž ĐŋĐžĐŗĐģŅĐ´Ņƒ." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "ЗМІНИĐĸИ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "ПЕРЕВІРИĐĸИ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "ОЧИСĐĸИĐĸИ" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "З’ЄДНАĐĸИ" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "ПІДКЛЮЧА..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "ĐĄĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ–ŅŽ" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "Đ›Ņ–ĐŧŅ–Ņ‚ĐŊĐĩ ҁ҂ҖĐģҌĐŊиĐēОвĐĩ С'Ņ”Đ´ĐŊаĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "ЗĐŧŅ–ĐŊĐ¸Ņ‚Đ¸ ĐŧĐžĐ˛Ņƒ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "" +"ЗĐŧŅ–ĐŊа Ņ†ŅŒĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° ĐŋŅ€Đ¸ĐˇĐ˛ĐĩĐ´Đĩ Đ´Đž ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ IQ.Pilot, ŅĐēŅ‰Đž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ " +"ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž." + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€ĐĩĐŊĐž {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "ОбĐĩŅ€Ņ–Ņ‚ŅŒ ĐŧОдĐĩĐģҌ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"ОбĐĩŅ€Ņ–Ņ‚ŅŒ ĐŋОСдОвĐļĐŊŅŽ ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃: IQ.Pilot (ĐŋОСдОвĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ IQ + ĐŊĐ°ŅĐēŅ€Ņ–ĐˇĐŊа " +"ĐŧОдĐĩĐģҌ), IQ.Dynamic (ĐŋОСдОвĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ IQ + диĐŊаĐŧҖ҇ĐŊиК Ņ€ĐĩĐļиĐŧ), IQ.Chill" +" (ĐŋОСдОвĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ IQ + ҁĐŋĐžĐēŅ–ĐšĐŊиК ĐŋŅ€ĐžŅ„Ņ–ĐģҌ) айО ĐˇĐ°Đ˛ĐžĐ´ŅŅŒĐēиК ACC." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "ĐžĐąŅ€Đ°ĐŊĐž Đ˛Ņ€ŅƒŅ‡ĐŊ҃" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐĩ҈" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐĩ҈ ĐžĐąŅ€Đ°ĐŊĐžŅ— ĐŧОдĐĩĐģŅ– Đš СаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ Ņ—Ņ— СĐŊĐžĐ˛Ņƒ?" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "ЗаĐēŅ€Đ¸Ņ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "" +"ЗаĐŧиĐēĐ°Ņ” ĐēĐžĐŊŅ‚ŅƒŅ€ ĐēĐĩŅ€Đŧа ĐŊа Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅŅ… MEB Ņ– MQB Evo. IQ.Pilot ĐēĐžŅ€Đ¸ĐŗŅƒŅ” " +"ĐēĐžĐŧаĐŊĐ´Ņƒ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Са ĐēŅ€Đ¸Đ˛Đ¸ĐˇĐŊĐžŅŽ, ŅĐē҃ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ Ņ€ĐĩаĐģҌĐŊĐž Ņ‚Ņ€Đ¸ĐŧĐ°Ņ”, СаĐŧŅ–ŅŅ‚ŅŒ " +"Ņ‚ĐžĐŗĐž Ņ‰ĐžĐą ĐŊĐ°Đ´ŅĐ¸ĐģĐ°Ņ‚Đ¸ СаĐŋĐģаĐŊОваĐŊ҃ ĐēŅ€Đ¸Đ˛Đ¸ĐˇĐŊ҃ ĐŊаĐŋŅ€ŅĐŧ҃." + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "ĐĨĐŧĐ°Ņ€Đ°" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "Đ›Đ¸ŅˆĐĩ Ņ…ĐŧĐ°Ņ€Đ°" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "ĐĨĐŧĐ°Ņ€ĐŊĐĩ Đ˛Ņ–Đ´ĐĩĐž ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "КоĐģŅŒĐžŅ€ĐžĐ˛Ņ– ĐŋОСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ŅŅ‚Đ°ĐŊ҃ Ņ–Đ´ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ—:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "ĐžĐąâ€™Ņ”Đ´ĐŊаĐŊа ĐŧОдĐĩĐģҌ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "" +"ВиĐēĐžĐŊŅƒŅ” СадаĐŊ҃ ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊŅ–ŅŅ‚ŅŒ ŅŅ‚ŅƒĐŋĐĩĐŊŅ–Đ˛ ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ, Ņ‰ĐžĐą виĐŧŅ–Ņ€ŅŅ‚Đ¸ Đ˛Ņ–Đ´ĐŗŅƒĐē " +"ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐŋŅ€Đ¸Đ˛ĐžĐ´Ņƒ. ĐŸĐžŅ‚Ņ€ĐĩĐąŅƒŅ” ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ IQ.Pilot. " +"ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐģĐ¸ŅˆĐĩ ĐŊа Đ˛Ņ–ĐģҌĐŊŅ–Đš, ĐŋĐĩŅ€ĐĩĐēŅ€Đ¸Ņ‚Ņ–Đš Đ´ĐžŅ€ĐžĐˇŅ–." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "" +"ВиĐēĐžĐŊŅƒŅ” СадаĐŊ҃ ĐŋĐžŅĐģŅ–Đ´ĐžĐ˛ĐŊŅ–ŅŅ‚ŅŒ ŅŅ‚ŅƒĐŋĐĩĐŊŅ–Đ˛ ĐąŅ–Ņ‡ĐŊĐžĐŗĐž ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ, Ņ‰ĐžĐą виĐŧŅ–Ņ€ŅŅ‚Đ¸ " +"Đ˛Ņ–Đ´ĐŗŅƒĐē ĐēĐĩŅ€ĐŧĐžĐ˛ĐžĐŗĐž ĐŋŅ€Đ¸Đ˛ĐžĐ´Ņƒ. ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ĐģĐ¸ŅˆĐĩ ĐŊа ĐŋŅ€ŅĐŧŅ–Đš, Ņ€Ņ–Đ˛ĐŊŅ–Đš Ņ– Đ˛Ņ–ĐģҌĐŊŅ–Đš " +"Đ´ĐžŅ€ĐžĐˇŅ–." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "ĐŸŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "ĐŸŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "ĐąĐĩСĐŋĐĩŅ€ĐĩŅ€Đ˛ĐŊŅ– СĐŧŅ–ĐŊи" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "КĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "" +"КĐĩŅ€ŅƒŅ” ĐŋОвĐĩĐ´Ņ–ĐŊĐēĐžŅŽ IQ.Pilot Ņ‰ĐžĐ´Đž ОйĐŧĐĩĐļĐĩĐŊҌ ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ–. ВиĐŧĐē. виĐŧиĐēĐ°Ņ” Ņ„ŅƒĐŊĐē҆Җҗ " +"ОйĐŧĐĩĐļĐĩĐŊҌ, ІĐŊŅ„Đž ĐģĐ¸ŅˆĐĩ ĐŋĐžĐēĐ°ĐˇŅƒŅ” ОйĐŧĐĩĐļĐĩĐŊĐŊŅ, ПоĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ–Đ´ŅĐ˛Ņ–Ņ‡ŅƒŅ” ĐŋĐĩŅ€ĐĩĐ˛Đ¸Ņ‰ĐĩĐŊĐŊŅ, а" +" КĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐžŅ€Đ¸ĐŗŅƒŅ” СадаĐŊ҃ ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ Са Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊиĐŧи ОйĐŧĐĩĐļĐĩĐŊĐŊŅĐŧи." + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "НĐĩ вдаĐģĐžŅŅ ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐēĐģŅŽŅ‡Ņ– SSH - ĐŋĐĩŅ€ĐĩĐŗĐģŅĐŊŅŒŅ‚Đĩ ĐļŅƒŅ€ĐŊаĐģи" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "НĐĩ вдаĐģĐžŅŅ СĐŊĐ°ĐšŅ‚Đ¸ ҆Đĩ ĐŧҖҁ҆Đĩ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "НĐĩ вдаĐģĐžŅŅ ĐˇĐ˛â€™ŅĐˇĐ°Ņ‚Đ¸ŅŅ С GitHub - ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Ņ‚Đĩ Đˇâ€™Ņ”Đ´ĐŊаĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "НĐĩ вдаĐģĐžŅŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ GitHub - ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Ņ‚Đĩ Ņ‡Đ°Ņ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "ĐšŅ€Đ°Ņ—ĐŊа" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "Đ–ŅƒŅ€ĐŊаĐģ ĐˇĐąĐžŅ—Đ˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "Đ ŅƒŅˆĐ°ĐŊĐŊŅ С ĐŧŅ–ŅŅ†Ņ (ĐąĐĩŅ‚Đ°)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "Đ ŅƒŅˆĐ°ĐŊĐŊŅ С ĐŧŅ–ŅŅ†Ņ — Ņ€ŅƒŅ‡ĐŊĐĩ ĐŗĐ°ĐģҌĐŧĐž (ĐąĐĩŅ‚Đ°)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "ĐšŅ€ŅƒŅ—Đˇ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "ĐŸĐžŅ‚ĐžŅ‡ĐŊа вĐĩŅ€ŅŅ–Ņ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "Đ ĐĩĐŗŅƒĐģŅŅ‚ĐžŅ€ ĐēŅ€Đ¸Đ˛Đ¸ĐˇĐŊи" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "ВИДАЛИĐĸИ" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "Đ’Đ†Đ”â€™Đ„Đ”ĐĐĐĐĐ¯..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "ВАНĐĸАЖ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "Đ’Ņ–Đ´Ņ…Đ¸ĐģĐ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "Đ’Ņ–Đ´Ņ…Đ¸ĐģĐ¸Ņ‚Đ¸, видаĐģĐ¸Ņ‚Đ¸ IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "ĐĸиĐŋОвО" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "ĐĸиĐŋОва (CD210)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "ĐĸиĐŋОвО: вĐŧиĐēĐ°Ņ”Ņ‚ŅŒŅŅ ĐŗĐžŅ‚ĐžĐ˛Đ¸Đŧ Đ´Đž Ņ€ŅƒŅ…Ņƒ, ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐĩ ĐžĐ´Ņ€Đ°ĐˇŅƒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"Đ—Đ°Ņ‚Ņ€Đ¸ĐŧĐēа, ĐŋҖҁĐģŅ ŅĐēĐžŅ— СĐŧŅ–ĐŊа ҁĐŧŅƒĐŗĐ¸, виĐēĐģиĐēаĐŊа ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐēĐžĐŧ, ĐŋĐžŅ‡ĐŊĐĩŅ‚ŅŒŅŅ " +"ŅĐ°ĐŧĐžŅŅ‚Ņ–ĐšĐŊĐž — ĐŋҖҁĐģŅ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēи ĐŋĐžŅˆŅ‚ĐžĐ˛Ņ… ĐēĐĩŅ€Đŧа ĐŊĐĩ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐĩĐŊ (Ņ‚Đ¸ĐŋОвО: " +"ĐŋĐžŅˆŅ‚ĐžĐ˛Ņ… ĐēĐĩŅ€Đŧа).
    ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐē ĐģĐ¸ŅˆĐĩ Ņ‚ĐžĐ´Ņ–, ĐēĐžĐģи Ņ€ŅƒŅ… Ņ–" +" Đ´ĐžŅ€ĐžĐŗĐ° ҁĐŋŅ€Đ°Đ˛Đ´Ņ– дОСвОĐģŅŅŽŅ‚ŅŒ ĐŧаĐŊĐĩĐ˛Ņ€." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēа ĐŋŅ€Đ¸ ҁĐģŅ–ĐŋŅ–Đš СОĐŊŅ–" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "ВидаĐģĐ¸Ņ‚Đ¸" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "ВидаĐģĐ¸Ņ‚Đ¸ виĐŧĐēĐŊĐĩĐŊиК ĐŋŅ€ĐžŅ„Ņ–ĐģҌ ÂĢ{}Âģ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "ВидаĐģĐ¸Ņ‚Đ¸ ҆ĐĩĐš ĐļŅƒŅ€ĐŊаĐģ?" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "ĐŸŅƒĐŊĐēŅ‚ ĐŋŅ€Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ СадаĐŊĐž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "Đ’Đ¸ŅĐ˛ĐģĐĩĐŊĐž Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "Đ ĐžĐˇŅ€ĐžĐąĐŊиĐē" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "ĐŸŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "ЊОй Đˇâ€™Ņ”Đ´ĐŊĐ°Ņ‚Đ¸, ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŧĐ°Ņ” ĐąŅƒŅ‚Đ¸ ĐˇĐ°Ņ€ĐĩŅ”ŅŅ‚Ņ€ĐžĐ˛Đ°ĐŊиК ҃ Konn3kt." + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "Đ—Đ°Ņ‚Ņ€Đ¸ĐŧĐēа ĐŋŅ€Đ¸Ņ‚ĐĩĐŧĐŊĐĩĐŊĐŊŅ" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "Đ’Ņ–Đ´â€™Ņ”Đ´ĐŊĐ°Ņ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "ВиĐŧĐēĐŊŅƒŅ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐĩŅ€ĐĩĐ´ ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đŧ ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ĐžĐŧ в ĐžŅ„Ņ€ĐžŅƒĐ´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐĩŅ€ĐĩĐ´ ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đŧ ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´ĐžĐŧ ҃ Ņ€ŅƒŅ…" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "ВиĐŧĐēĐŊĐĩĐŊĐŊŅ ĐŋŅ€Đ¸ ĐŊĐ°Ņ‚Đ¸ŅĐēаĐŊĐŊŅ– ĐŊа ĐŋĐĩдаĐģҌ ĐŗĐ°ĐˇŅƒ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ IQ.Pilot, Ņ‰ĐžĐą виĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ IQ.Pilot, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "ДĐĩаĐēŅ‚Đ¸Đ˛ŅƒĐšŅ‚Đĩ Đ´ĐģŅ ҁĐēидаĐŊĐŊŅ ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "виĐŧĐēĐŊŅ–Ņ‚ŅŒ, Ņ‰ĐžĐą {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "ВиĐŧĐēĐŊŅƒŅ‚Đ¸: ĐŗĐ°ĐģҌĐŧŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋОвĐŊŅ–ŅŅ‚ŅŽ виĐŧиĐēĐ°Ņ” ĐēĐĩŅ€ĐŧĐžĐ˛Ņƒ Đ´ĐžĐŋĐžĐŧĐžĐŗŅƒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "ЕĐēŅ€Đ°ĐŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "Đ¯ŅĐēŅ€Đ°Đ˛Ņ–ŅŅ‚ŅŒ ĐĩĐēŅ€Đ°ĐŊа" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "Đ’Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ‚Đ¸ ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ ҃ ĐēĐŧ/ĐŗĐžĐ´ СаĐŧŅ–ŅŅ‚ŅŒ ĐŧиĐģҌ/ĐŗĐžĐ´." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "Đ’Ņ–Đ´ŅŅ‚Đ°ĐŊҌ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "ĐĐ°Đ´ŅĐ¸ĐģĐ°Ņ‚Đ¸ даĐŊŅ– С ĐēаĐŧĐĩŅ€Đ¸ Đ˛ĐžĐ´Ņ–Ņ?" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "Đ“ĐžŅ‚ĐžĐ˛Đž" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "ID ĐēĐģŅŽŅ‡Đ°" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "НĐĩ вдаĐģĐžŅŅ СаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ — ҁĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ҉Đĩ Ņ€Đ°Đˇ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "ЗаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ Ņ‚Đ°ĐšĐģŅ–Đ˛ ĐēĐ°Ņ€Ņ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "" +"МаĐģŅŽŅ” ҁĐŧŅƒĐŗŅƒ вСдОвĐļ ĐģŅ–Đ˛ĐžĐŗĐž ĐēŅ€Đ°ŅŽ, Ņ‰Đž Đ˛Ņ–Đ´ŅŅ‚ĐĩĐļŅƒŅ” виĐŧŅ–Ņ€ŅĐŊŅ– ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ Ņ‚Đ° " +"ĐŗĐ°ĐģҌĐŧŅƒĐ˛Đ°ĐŊĐŊŅ — Ņ‚Đĩ, Ņ‰Đž Đ°Đ˛Ņ‚Đž ҁĐŋŅ€Đ°Đ˛Đ´Ņ– Ņ€ĐžĐąĐ¸Ņ‚ŅŒ ĐˇĐ°Ņ€Đ°Đˇ, а ĐŊĐĩ СаĐŋĐ¸Ņ‚ ĐŋĐģаĐŊŅƒĐ˛Đ°ĐģҌĐŊиĐēа." + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "" +"МаĐģŅŽŅ” ĐēĐ°Ņ€Ņ‚Ņƒ ĐŊа ĐĩĐēŅ€Đ°ĐŊŅ– С Ņ‚Đ°ĐšĐģŅ–Đ˛, СйĐĩŅ€ĐĩĐļĐĩĐŊĐ¸Ņ… ĐŊа ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—. ĐŖ ĐŋĐžŅ”Đ´ĐŊаĐŊĐŊŅ– С " +"ĐžĐŊĐģаКĐŊ-Ņ€ĐĩĐļиĐŧĐžĐŧ СйĐĩŅ€ĐĩĐļĐĩĐŊŅ– Ņ‚Đ°ĐšĐģи ĐŋĐĩŅ€ĐĩĐąĐ¸Ņ€Đ°ŅŽŅ‚ŅŒ Ņ€ĐžĐąĐžŅ‚Ņƒ в ĐŧĐ¸Ņ‚ŅŒ Đ˛Ņ‚Ņ€Đ°Ņ‚Đ¸ ĐˇĐ˛â€™ŅĐˇĐē҃. " +"ĐĸаКĐģи СаваĐŊŅ‚Đ°ĐļŅƒŅŽŅ‚ŅŒŅŅ Đ´ĐģŅ ĐžĐąŅ€Đ°ĐŊĐžĐŗĐž Ņ€ĐĩĐŗŅ–ĐžĐŊ҃." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "КаĐŧĐĩŅ€Đ° Đ˛ĐžĐ´Ņ–Ņ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "ПĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đēа ĐēаĐŧĐĩŅ€Đ¸ Đ˛ĐžĐ´Ņ–Ņ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "ĐžĐąŅ€ĐžĐąĐēа Đ˛Ņ‚Ņ€ŅƒŅ‡Đ°ĐŊĐŊŅ Đ˛ĐžĐ´Ņ–Ņ" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "ĐŸĐžŅ—ĐˇĐ´Đēи" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "Đ¯ŅĐēŅ€Đ°Đ˛Ņ–ŅŅ‚ŅŒ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ŅƒŅ…Ņƒ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "ĐĄŅ‚Đ¸ĐģҌ Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "ДиĐŊаĐŧҖ҇ĐŊиК" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "ДиĐŊаĐŧҖ҇ĐŊĐĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ: ĐļĐ˛Đ°Đ˛Ņ–ŅˆĐ° Ņ€ĐĩаĐēŅ†Ņ–Ņ ĐŗĐ°ĐˇŅƒ Đš ĐŗĐ°ĐģҌĐŧа." + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "РЕДАГ." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "ПОМИЛКА" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "" +"ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Always on Lateral (AOL). ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ ҆ĐĩĐš ĐŋĐĩŅ€ĐĩĐŧиĐēĐ°Ņ‡, Ņ‰ĐžĐą ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ŅŅ " +"Đ´Đž ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊĐžŅ— ĐŋОвĐĩĐ´Ņ–ĐŊĐēи ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐŊŅ ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Đ˛Ņ–Đ´ĐĩĐžŅ€ĐĩŅ”ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đž Đ˛Đ¸Ņ—ĐˇĐ´ ĐˇŅ– ҁĐŧŅƒĐŗĐ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "" +"ВĐŧиĐēĐ°Ņ” ĐžĐąŅ€ĐžĐąĐē҃ ĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ MQB ĐŊа Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅŅ… Volkswagen MQB Ņ–Đˇ " +"ĐŊĐĩҁĐŋŅ€Đ°Đ˛ĐŊĐžŅŅ‚ŅĐŧи LKAS ĐŊа ĐŊĐ¸ĐˇŅŒĐēŅ–Đš ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ–." + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ€ĐžŅƒĐŧŅ–ĐŊĐŗ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ‚ĐžŅ‡Đē҃ Đ´ĐžŅŅ‚ŅƒĐŋ҃" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗ Đ˛ĐžĐ´Ņ–Ņ, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐēĐžĐģи IQ.Pilot ĐŊĐĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž." + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐēОд аĐēŅ‚Đ¸Đ˛Đ°Ņ†Ņ–Ņ—" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "ВвĐĩŅŅ‚Đ¸ ĐēОд" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ Đ°Đ´Ņ€Đĩҁ҃ айО ĐŧҖҁ҆Đĩ" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐŊОвиК ĐŋĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ ĐŧОдĐĩĐŧ҃" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ Đ˛Đ°Ņˆ ĐģĐžĐŗŅ–ĐŊ GitHub" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "ПоĐŧиĐģĐēа" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "Đ’Đ¸ĐšŅ‚Đ¸ С Ņ€ĐĩĐļиĐŧ҃ ĐžŅ„Ņ€ĐžŅƒĐ´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "Đ ĐžĐˇŅˆĐ¸Ņ€ĐĩĐŊа ĐŋаĐŊĐĩĐģҌ ŅŅ‚Đ°ĐŊ҃" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊиК MPC ĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž Đ°Đ˛Ņ‚Đž" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "" +"ПоĐēĐ°ĐˇŅƒŅ” СĐŊŅ–ĐŧĐžĐē ĐžŅŅ‚Đ°ĐŊĐŊŅ–Ņ… ĐēĐģŅ–ĐŋŅ–Đ˛ Đ˛Ņ–Đ´ĐĩĐžŅ€ĐĩŅ”ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° Ņ‚Đ° ĐļŅƒŅ€ĐŊаĐģŅ–Đ˛ ŅĐē USB-" +"ĐŊаĐēĐžĐŋĐ¸Ņ‡ŅƒĐ˛Đ°Ņ‡ ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐŋŅ–Đ´â€™Ņ”Đ´ĐŊаĐŊĐŊŅ Đ´Đž ĐēĐžĐŧĐŋâ€™ŅŽŅ‚ĐĩŅ€Đ°. IQ.Pilot ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļŅƒŅ” ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸," +" ĐŋĐžĐēи ҆Đĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž." + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "Đ—ĐĐ‘ĐŖĐ’ĐĐŽ..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "" +"ĐĐ°Ņ€Đ°ĐˇŅ– ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đž ĐˇĐ°ŅŅ‚ĐžŅĐžĐ˛Đ°ĐŊĐž ĐˇĐ°Đ˛ĐžĐ´ŅŅŒĐēĐĩ ĐŋОСдОвĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Toyota. ОбĐĩŅ€Ņ–Ņ‚ŅŒ " +"ĐŋОСдОвĐļĐŊŅ–Đš Ņ€ĐĩĐļиĐŧ IQ, Ņ‰ĐžĐą виĐŧĐēĐŊŅƒŅ‚Đ¸ ĐšĐžĐŗĐž." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "Đ—Đ°Đ˛ĐžĐ´ŅŅŒĐēĐĩ ĐŋОСдОвĐļĐŊŅ” ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "ĐžĐąŅ€Đ°ĐŊĐĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ ĐēĐ°Ņ€Ņ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ ĐēĐ°Ņ€Ņ‚..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "ĐžŅŅ‚Đ°ĐŊĐŊŅ” ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "ЗĐŊĐ°ĐšĐ´Ņ–Ņ‚ŅŒ ŅĐ˛Ņ–Đš Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "ЗавĐĩŅ€ŅˆĐ¸Ņ‚Đ¸ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "" +"ПоĐēĐ°ĐˇŅƒŅ” ĐąŅ–Ņ‡ĐŊĐĩ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ Ņ‰ĐžŅ€Đ°ĐˇŅƒ, ĐēĐžĐģи Đ°Đ˛Ņ‚Đž ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ” ĐŋŅ€Đž ĐžĐąâ€™Ņ”ĐēŅ‚ ҃ Đ˛Đ°ŅˆŅ–Đš " +"ҁĐģŅ–ĐŋŅ–Đš СОĐŊŅ– (ĐģĐ¸ŅˆĐĩ Đ°Đ˛Ņ‚Đž С BSM)." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "" +"ĐŖĐ˛Ņ–ĐŧĐēĐŊŅ–Ņ‚ŅŒ ÂĢЗавĐļди ĐžŅ„Ņ€ĐžŅƒĐ´Âģ ĐŊа ĐŋаĐŊĐĩĐģŅ– ÂĢĐŸŅ€Đ¸ŅŅ‚Ņ€Ņ–ĐšÂģ айО виĐŧĐēĐŊŅ–Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ, Ņ‰ĐžĐą " +"҆Đĩ СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "Đ´Đ¸ŅŅ‚Đ°ĐŊŅ†Ņ–Ņ ҁ҂ĐĩĐļĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "Đ”ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐšŅ‚ĐĩҁҌ ĐŋŅ–Đ´ĐēаСОĐē ҃ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐē҃, Ņ‰ĐžĐą СавĐĩŅ€ŅˆĐ¸Ņ‚Đ¸ Đˇâ€™Ņ”Đ´ĐŊаĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "" +"ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đž ĐŋĐĩŅ€ĐĩвĐĩŅŅ‚Đ¸ IQ.Pilot ҃ Ņ€ŅƒŅ… ĐŊа 10 Ņ…Đ˛Đ¸ĐģиĐŊ? Đ ĐĩĐļиĐŧ ÂĢЗавĐļди ĐžŅ„Ņ€ĐžŅƒĐ´Âģ ĐąŅƒĐ´Đĩ " +"ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž, а ĐŋҖҁĐģŅ СавĐĩŅ€ŅˆĐĩĐŊĐŊŅ Ņ‚Đ°ĐšĐŧĐĩŅ€Đ° ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŋОвĐĩŅ€ĐŊĐĩŅ‚ŅŒŅŅ в " +"ĐžŅ„Ņ€ĐžŅƒĐ´." + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Mici" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš Ņ€ŅƒŅ… (10 Ņ…Đ˛)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš Ņ€ŅƒŅ… ĐŧĐžĐļĐŊа ĐŋĐžŅ‡Đ°Ņ‚Đ¸ ĐģĐ¸ŅˆĐĩ в ĐžŅ„Ņ€ĐžŅƒĐ´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš Ņ€ŅƒŅ… ҃ĐļĐĩ аĐēŅ‚Đ¸Đ˛ĐŊиК. ĐĄĐēиĐŊŅƒŅ‚Đ¸ Ņ‚Đ°ĐšĐŧĐĩŅ€ Đ´Đž 10 Ņ…Đ˛Đ¸ĐģиĐŊ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "ĐŸŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš Ņ€ŅƒŅ… аĐēŅ‚Đ¸Đ˛ĐŊиК" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "Заб-и" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "Đ—Đ°ĐąŅƒŅ‚Đ¸ ĐŧĐĩŅ€ĐĩĐļ҃ Wi-Fi \"{}\"?" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "ДОБРА" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "ĐĐ˛Ņ‚ĐĩĐŊŅ‚Đ¸Ņ„Ņ–ĐēĐ°Ņ†Ņ–Ņ Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "ĐĸĐžĐēĐĩĐŊ / ĐŋĐ°Ņ€ĐžĐģҌ Git" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "ІĐŧâ€™Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° Git" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "ПоĐŧиĐģĐēа GitHub ({}) ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ ĐēĐģŅŽŅ‡Ņ–Đ˛" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "ВИСОКА" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "ĐŸŅ€Đ¸Ņ…ĐžĐ˛Đ°ĐŊа ĐŧĐĩŅ€ĐĩĐļа" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "ĐŖŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸ СĐŧŅ–ĐŊ҃ ҁĐŧŅƒĐŗĐ¸ ҇ĐĩŅ€ĐĩС ҁĐģŅ–Đŋ҃ СОĐŊ҃" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "ĐĸŅ€Đ¸ĐŧĐ°ĐšŅ‚Đĩ ĐŊĐĩŅ€ŅƒŅ…ĐžĐŧĐž..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "" +"ĐŖŅ‚Ņ€Đ¸ĐŧŅƒŅ” Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊ҃ СĐŧŅ–ĐŊ҃ ҁĐŧŅƒĐŗĐ¸, Đ´ĐžĐēи ŅĐ¸ŅŅ‚ĐĩĐŧа ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅŽ ҁĐģŅ–ĐŋĐ¸Ņ… СОĐŊ ĐŋĐžĐ˛Ņ–Đ´ĐžĐŧĐģŅŅ”" +" ĐŋŅ€Đž Đ°Đ˛Ņ‚Đž ĐŊа ҆ҖĐģŅŒĐžĐ˛Ņ–Đš ҁĐŧŅƒĐˇŅ–, Ņ– Đ˛Ņ–Đ´Đŋ҃ҁĐēĐ°Ņ” Ņ—Ņ—, Ņ‰ĐžĐšĐŊĐž ҁĐŧŅƒĐŗĐ° Đ˛Ņ–ĐģҌĐŊа." + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "Đ”Ņ–Đŧ" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "ГодиĐŊи" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "" +"ĐĄĐēŅ–ĐģҌĐēи ĐĩĐēŅ€Đ°ĐŊ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ ĐŧĐžĐļĐĩ ĐģĐ¸ŅˆĐ°Ņ‚Đ¸ŅŅ ĐąĐĩС Đ´ĐžŅ‚Đ¸ĐēŅ–Đ˛, ĐŋĐĩŅ€Ņˆ ĐŊŅ–Đļ СаĐēŅ€Đ¸Ņ”Ņ‚ŅŒŅŅ " +"ŅĐ°Đŧ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "" +"ĐĄĐēŅ–ĐģҌĐēи Ņ‡Đ°ŅŅƒ виĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚Đ¸ Đ´Đž вĐģĐ°ŅĐŊĐžŅ— ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēи ĐēĐĩŅ€ĐŧĐžĐ˛ĐžŅ— Ņ€ĐĩĐšĐēи, ĐŋĐžĐēи " +"ŅĐ°ĐŧĐžĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ виĐŧĐēĐŊĐĩĐŊĐž. ĐĸиĐŋОвО 0,2 ҁ." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "ВСĐĸАНОВ." + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "IP-Đ°Đ´Ņ€ĐĩŅĐ°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Ņ– ĐˇŅƒĐŋиĐŊĐēи IQ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "Ņ€ĐĩĐļиĐŧ IQ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "" +"ПоздовĐļĐŊŅ– Ņ€ĐĩĐļиĐŧи IQ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ– Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ. Đ—Đ°Đ˛ĐžĐ´ŅŅŒĐēиК ACC — Ņ”Đ´Đ¸ĐŊиК" +" Đ´ĐžŅŅ‚ŅƒĐŋĐŊиК Đ˛Đ°Ņ€Ņ–Đ°ĐŊŅ‚." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐžĐŗĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic ĐŊĐ¸ĐˇŅŒĐēа ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic ĐˇŅƒĐŋиĐŊĐēи ĐŧОдĐĩĐģŅ–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic СаĐŋĐ°Ņ SLC" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic ĐŋĐžĐ˛Ņ–ĐģҌĐŊŅ–ŅˆĐĩ ĐŋĐĩŅ€ĐĩĐ´ĐŊŅ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic ĐˇŅƒĐŋиĐŊĐĩĐŊĐĩ ĐŋĐĩŅ€ĐĩĐ´ĐŊŅ”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "ВĐĩŅ€ŅŅ–Ņ IQ.OS" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot НĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиК" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "" +"IQ.Pilot ĐŋĐžŅŅ‚Ņ–ĐšĐŊĐž ĐēаĐģŅ–ĐąŅ€ŅƒŅ”Ņ‚ŅŒŅŅ, ҁĐēидаĐŊĐŊŅ Ņ€Ņ–Đ´ĐēĐž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐĩ. ĐĄĐēидаĐŊĐŊŅ " +"ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩĐ´Đĩ Đ´Đž ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ IQ.Pilot, ŅĐēŅ‰Đž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "" +"ДĐģŅ Ņ€ĐžĐąĐžŅ‚Đ¸ IQ.Pilot ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž, Ņ‰ĐžĐą ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐąŅƒĐ˛ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиК С ĐŊĐ°Ņ…Đ¸ĐģĐžĐŧ ĐŊĐĩ " +"ĐąŅ–ĐģҌ҈Đĩ 4° вĐģŅ–Đ˛Đž айО вĐŋŅ€Đ°Đ˛Đž Ņ‚Đ° ĐŊĐĩ ĐąŅ–ĐģҌ҈Đĩ 5° Đ˛ĐŗĐžŅ€Ņƒ айО 9° вĐŊиС. IQ.Pilot " +"ĐŋĐžŅŅ‚Ņ–ĐšĐŊĐž ĐēаĐģŅ–ĐąŅ€ŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‚ĐžĐŧ҃ ҁĐēидаĐŊĐŊŅ ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐĩ Ņ€Ņ–Đ´ĐēĐž." + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"Đ¯ĐēŅ‰Đž ви Ņ€ŅƒŅ…Đ°Ņ”Ņ‚ĐĩŅŅ ĐˇŅ– ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŽ 20 ĐŧиĐģҌ/ĐŗĐžĐ´ (32 ĐēĐŧ/ĐŗĐžĐ´) айО ĐŧĐĩĐŊ҈Đĩ С " +"ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊиĐŧ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐēĐžĐŧ, Đ°Đ˛Ņ‚Đž ҁĐŋĐģаĐŊŅƒŅ” ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚ ҃ Ņ†ŅŒĐžĐŧ҃ ĐŊаĐŋŅ€ŅĐŧĐē҃ ĐŊа " +"ĐŊаКйĐģиĐļŅ‡ĐžĐŧ҃ ĐŋŅ€ĐžŅ—ĐˇĐŊĐžĐŧ҃ ҈ĐģŅŅ…Ņƒ. ĐĻĐĩ СаĐŋĐžĐąŅ–ĐŗĐ°Ņ” ŅĐ¸Ņ‚ŅƒĐ°Ņ†Ņ–ŅĐŧ (ĐŊаĐŋŅ€Đ¸ĐēĐģад, ĐŊа ҇ĐĩŅ€Đ˛ĐžĐŊĐĩ " +"ŅĐ˛Ņ–Ņ‚ĐģĐž), ĐēĐžĐģи Đ°Đ˛Ņ‚Đž ĐŧĐžĐŗĐģĐž Đą ҁĐŋĐģаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚ ҃ Ņ…Đ¸ĐąĐŊĐžĐŧ҃ ĐŊаĐŋŅ€ŅĐŧĐē҃." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "ІĐŊŅ„Đž" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "" +"Đ’ŅŅ‚Đ°Đ˛Ņ‚Đĩ ĐžŅ€Đ¸ĐŗŅ–ĐŊаĐģҌĐŊ҃ SIM-ĐēĐ°Ņ€Ņ‚Đē҃ comma, Ņ‰Đž ĐŋĐžŅŅ‚Đ°Ņ‡Đ°ĐģĐ°ŅŅ С ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ”Đŧ, Ņ‰ĐžĐą " +"ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "Đ’ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "НĐĩĐ´Ņ–ĐšŅĐŊиК QR-ĐēОд" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "КМ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "ПОМИЛКА KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT ОФЛАЙН" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "ĐĸŅ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš в ĐžŅ„Ņ€ĐžŅƒĐ´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "ЗбĐĩŅ€ĐĩĐŗŅ‚Đ¸ ĐˇĐ°Đ˛ĐžĐ´ŅŅŒĐēŅ– ĐŗĐ°Đˇ Ņ– ĐŗĐ°ĐģҌĐŧĐž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "ЗаĐģĐ¸ŅˆĐ°Ņ” ĐŗĐ°Đˇ Ņ– ĐŗĐ°ĐģҌĐŧа ĐˇĐ°Đ˛ĐžĐ´ŅŅŒĐēŅ–Đš ŅĐ¸ŅŅ‚ĐĩĐŧŅ– Toyota; IQ.Pilot ĐģĐ¸ŅˆĐĩ ĐēĐĩŅ€ĐŧŅƒŅ”." + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "МоĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– Konn3kt:" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "ĐĄŅ‚Đ°Ņ‚ŅƒŅ Konn3kt:" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "ЛІМІĐĸ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "ЗАВАНĐĸĐĐ–Đ•ĐĐĐ¯" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "ЗАВАНĐĸĐĐ–Đ•ĐĐĐ¯..." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "ĐŸĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ¸ СĐŧŅ–ĐŊи ҁĐŧŅƒĐŗĐ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "Đ‘Ņ–Ņ‡ĐŊĐĩ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ ĐŊĐĩҁĐŋŅ€Đ°Đ˛ĐŊĐžŅŅ‚Ņ– ĐēŅ€ŅƒŅ—ĐˇŅƒ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "Đ ĐĩĐļиĐŧ ĐąŅ–Ņ‡ĐŊĐ¸Ņ… ĐŧаĐŊĐĩĐ˛Ņ€Ņ–Đ˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "ПоĐēаСĐŊиĐēи Đ°Đ˛Ņ‚Đž ĐŋĐžĐŋĐĩŅ€ĐĩĐ´Ņƒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "Đ’Đ¸ĐšŅ‚Đ¸ С Ņ€ĐĩĐļиĐŧ҃ ÂĢЗавĐļди ĐžŅ„Ņ€ĐžŅƒĐ´Âģ ĐˇĐ°Ņ€Đ°Đˇ?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "Đ’Đ¸ĐšŅ‚Đ¸ С ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛ĐžĐŗĐž Ņ€ĐĩĐļиĐŧ҃ ĐžŅ„Ņ€ĐžŅƒĐ´ ĐˇĐ°Ņ€Đ°Đˇ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "" +"ДозвоĐģŅŒŅ‚Đĩ IQ.Pilot виĐŧŅ–Ņ€ŅŽĐ˛Đ°Ņ‚Đ¸ Ņ‡Đ°Ņ Đ˛Ņ–Đ´ĐŗŅƒĐē҃ Đ˛Đ°ŅˆĐžĐŗĐž ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ Đš ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸ " +"҆Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ аĐēŅ‚ŅƒĐ°ĐģҌĐŊиĐŧ. ВиĐŧĐēĐŊŅ–Ņ‚ŅŒ, Ņ‰ĐžĐą ĐˇĐ°Đ´Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ŅĐ°ĐŧĐžŅŅ‚Ņ–ĐšĐŊĐž." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "" +"ДозвоĐģŅŅ” ĐŋĐžĐ˛ĐžŅ€ŅƒŅ…ĐŊŅƒŅ‚Đ¸ ĐēĐĩŅ€ĐŧĐžĐŧ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ĐžĐąĐžŅ‚Đ¸ ŅĐ¸ŅŅ‚ĐĩĐŧи ĐąĐĩС ĐŋОвĐŊĐžĐŗĐž виĐŧĐēĐŊĐĩĐŊĐŊŅ " +"ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "ĐĸŅ€Đ°ĐŊҁĐģŅŅ†Ņ–Ņ ĐŊаĐļивО" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "ЗаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "ЗаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ Đ˛Ņ–Đ´ĐĩĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "ЗаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ..." + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "ВизĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŧŅ–ŅŅ†Ņ..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "" +"ЗабĐģĐžĐēОваĐŊĐž ҃ ŅŅ‚Đ°ĐŊŅ– ВИМК. ĐŊа Ņ†Ņ–Đš ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€ĐŧŅ–; Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” Ņ–ĐŊŅˆĐ¸Ņ… " +"Đ˛Đ°Ņ€Ņ–Đ°ĐŊŅ‚Ņ–Đ˛." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "ПоздовĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"Đ ĐĩĐļиĐŧи ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ:
    МоĐļĐģĐ¸Đ˛ĐžŅŅ‚Ņ– IQ.Pilot ĐŊавĐĩĐ´ĐĩĐŊĐž " +"ĐŊиĐļ҇Đĩ:

    ĐĐ°ŅĐēŅ€Ņ–ĐˇĐŊĐĩ ĐŋОСдОвĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ IQ.Pilot


    ДозвоĐģŅŒŅ‚Đĩ " +"ĐŧОдĐĩĐģŅ– Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ ĐēĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŗĐ°ĐˇĐžĐŧ Ņ– ĐŗĐ°ĐģҌĐŧаĐŧи. IQ.Pilot Ņ—Ņ…Đ°Ņ‚Đ¸ĐŧĐĩ Ņ‚Đ°Đē, ŅĐē, ĐŊа ĐšĐžĐŗĐž " +"Đ´ŅƒĐŧĐē҃, Ņ—Ņ…Đ°Đģа Đą ĐģŅŽĐ´Đ¸ĐŊа, СОĐēŅ€ĐĩĐŧа ĐˇŅƒĐŋиĐŊŅŅ‚Đ¸ĐŧĐĩŅ‚ŅŒŅŅ ĐŊа ҇ĐĩŅ€Đ˛ĐžĐŊĐĩ ŅĐ˛Ņ–Ņ‚ĐģĐž Ņ‚Đ° СĐŊаĐēи " +"ÂĢŅŅ‚ĐžĐŋÂģ. ĐžŅĐēŅ–ĐģҌĐēи ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ виСĐŊĐ°Ņ‡Đ°Ņ” ĐŧОдĐĩĐģҌ, СадаĐŊа ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ ҁĐģŅƒĐŗŅƒŅ” ĐģĐ¸ŅˆĐĩ " +"вĐĩҀ҅ĐŊŅŒĐžŅŽ ĐŧĐĩĐļĐĩŅŽ. ĐĻŅ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ ҉Đĩ Đ˛Đ´ĐžŅĐēĐžĐŊаĐģŅŽŅ”Ņ‚ŅŒŅŅ; ҁĐģŅ–Đ´ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°Ņ‚Đ¸ " +"ĐŋĐžĐŧиĐģĐžĐē.

    IQ.Dynamic


    ДиĐŊаĐŧҖ҇ĐŊĐž ĐŋĐžŅ”Đ´ĐŊŅƒŅ” ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃ адаĐŋŅ‚Đ¸Đ˛ĐŊĐžĐŗĐž " +"ĐēŅ€ŅƒŅ—ĐˇŅƒ Ņ‚Đ° ĐŊĐ°ŅĐēŅ€Ņ–ĐˇĐŊĐžŅ— ĐŧОдĐĩĐģŅ– СаĐģĐĩĐļĐŊĐž Đ˛Ņ–Đ´ ŅĐ¸Ņ‚ŅƒĐ°Ņ†Ņ–Ņ— Đš " +"ĐžŅ‚ĐžŅ‡ĐĩĐŊĐŊŅ.

    IQ.Chill


    ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” Đ´ĐģŅ ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ" +" ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊ҃ ĐŋОвĐĩĐ´Ņ–ĐŊĐē҃ ĐēŅ€ŅƒŅ—ĐˇŅƒ С ŅƒŅ€Đ°Ņ…ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ Ņ‚Ņ€Đ°Ņ„Ņ–Đē҃.

    Нова Đ˛Ņ–ĐˇŅƒĐ°ĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ " +"Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ


    На ĐŊĐ¸ĐˇŅŒĐēŅ–Đš ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ– Đ˛Ņ–ĐˇŅƒĐ°ĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ ĐŋĐĩŅ€ĐĩĐŧиĐēĐ°Ņ‚Đ¸ĐŧĐĩŅ‚ŅŒŅŅ ĐŊа " +"ŅˆĐ¸Ņ€ĐžĐēĐžĐēŅƒŅ‚ĐŊ҃ Đ´ĐžŅ€ĐžĐļĐŊŅŽ ĐēаĐŧĐĩŅ€Ņƒ, Ņ‰ĐžĐą ĐēŅ€Đ°Ņ‰Đĩ ĐŋĐžĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐĩŅĐēŅ– ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Đ¸. ĐŖ ĐŋŅ€Đ°Đ˛ĐžĐŧ҃ " +"вĐĩҀ҅ĐŊŅŒĐžĐŧ҃ ĐēŅƒŅ‚Ņ– Ņ‚Đ°ĐēĐžĐļ Đˇâ€™ŅĐ˛Đ¸Ņ‚ŅŒŅŅ ĐģĐžĐŗĐžŅ‚Đ¸Đŋ IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "Đ ĐĩĐļиĐŧ ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐŧаĐŊĐĩĐ˛Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "ĐŸŅ€ĐžŅ„Ņ–ĐģҌ ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "ĐąŅ–ĐģҌ҈Đĩ виĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "ĐŧĐĩĐŊ҈Đĩ виĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "ПĐģаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņ–Đ˛ ĐŊа ĐŊĐ¸ĐˇŅŒĐēŅ–Đš ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "" +"ĐŸŅ€ĐžĐŋ҃ҁĐēĐ°Ņ” СаĐŋĐģаĐŊОваĐŊ҃ ĐēŅ€Đ¸Đ˛Đ¸ĐˇĐŊ҃ ҇ĐĩŅ€ĐĩС ҄ҖĐģŅŒŅ‚Ņ€ ĐŊĐ¸ĐˇŅŒĐēĐ¸Ņ… Ņ‡Đ°ŅŅ‚ĐžŅ‚, ĐŋĐĩŅ€Ņˆ ĐŊŅ–Đļ вОĐŊа " +"Đ´Ņ–ĐšĐ´Đĩ Đ´Đž Ņ€ĐĩĐšĐēи, ĐŊа Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅŅ… MEB Ņ– MQB Evo, Ņ‰Đž ĐŗĐ°ŅĐ¸Ņ‚ŅŒ ĐąŅ–Ņ‡ĐŊĐĩ ĐēĐžĐģиваĐŊĐŊŅ. " +"ДĐģŅ Ņ†Đ¸Ņ… ĐŧĐ°ŅˆĐ¸ĐŊ ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž Ņ‚Đ¸ĐŋОвО." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "Đ’Đ ĐŖĐ§ĐĐŖ" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "МАКС" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "Đ’Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ACC MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "Đ˛Ņ–Đ´ĐŊОвĐģĐĩĐŊĐŊŅ ACC MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "БĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ MQB" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "ĐąĐģĐžĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ MQB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "ĐžĐąŅĐģŅƒĐŗĐžĐ˛ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "Đ ŅƒŅ‡ĐŊĐĩ СĐŧҖ҉ĐĩĐŊĐŊŅ ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēи" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "База даĐŊĐ¸Ņ… ĐēĐ°Ņ€Ņ‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "ВиĐŧŅ–Ņ€ŅĐŊĐž:" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "МиĐģŅ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "Đ’Ņ–Đ´ĐžĐąŅ€Đ°ĐļĐ°Ņ” ĐŋĐžĐēаĐļŅ‡Đ¸Đēи ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņƒ Đ°Đ˛Ņ‚Đž ҃ Đ˛Đ¸ĐŗĐģŅĐ´Ņ– ҁ҂ҀҖĐģĐžĐē ĐŊа ĐĩĐēŅ€Đ°ĐŊŅ– Ņ€ŅƒŅ…Ņƒ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "Ņ‡Đ°Ņ ĐˇŅƒĐŋиĐŊĐēи ĐŧОдĐĩĐģŅ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "МодĐĩĐģŅ–" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "Н/Д" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "НЕМАЄ PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "НЕМАЄ" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "ĐĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ–Ņ" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "ĐĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ–ŅŽ ҁĐēĐ°ŅĐžĐ˛Đ°ĐŊĐž" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "БĐģĐ¸ĐˇŅŒĐēĐž" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "МĐĩŅ€ĐĩĐļа" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "ĐŊĐĩĐšŅ€ĐžĐŧĐĩŅ€ĐĩĐļа FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "ĐŸŅ€ŅĐŧĐĩ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊĐĩĐšŅ€ĐžĐŧĐĩŅ€ĐĩĐļĐĩŅŽ (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "ĐŅ–ĐēĐžĐģи ĐŊĐĩ ҁĐŋĐ°Ņ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "ĐŅ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "БĐĩС ĐŋĐžŅˆŅ‚ĐžĐ˛Ņ…Ņƒ" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "QR-ĐēОд ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "ĐšĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡ '{}' ĐŊĐĩ ĐŧĐ°Ņ” ĐēĐģŅŽŅ‡Ņ–Đ˛ ĐŊа GitHub" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "МĐĩŅ€ĐĩĐļŅ– Wi-Fi ĐŊĐĩ СĐŊаКдĐĩĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "" +"ĐŖ Ņ€ĐĩĐļиĐŧŅ– Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēа ĐēаĐŧĐĩŅ€Ņƒ ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž. ĐĐ°Ņ‚Đ¸ŅĐŊŅ–Ņ‚ŅŒ ÂĢĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸Âģ, Ņ‰ĐžĐą " +"ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸." + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "ІĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ ĐŋŅ€Đž виĐŋ҃ҁĐē Đ˛Ņ–Đ´ŅŅƒŅ‚ĐŊŅ." + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "НĐĩĐŧĐ°Ņ” Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ–Đ˛" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "ĐœĐ°Ņ€ŅˆŅ€ŅƒŅ‚Ņ–Đ˛ ĐŊĐĩ СаĐŋĐ¸ŅĐ°ĐŊĐž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "ĐĐ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ ĐŊĐĩ СадаĐŊĐž" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "НĐĩĐŧĐ°Ņ” Đ˛Ņ–Đ´ĐĩĐž С ҆ҖҔҗ ĐēаĐŧĐĩŅ€Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "" +"Đ—Đ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš ОдиĐŊ ĐŧаĐŊĐĩĐ˛Ņ€ СавĐĩŅ€ŅˆŅƒŅ” СĐŧŅ–ĐŊ҃ ҁĐŧŅƒĐŗĐ¸ ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ Ņ–Đˇ ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊиĐŧ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐēĐžĐŧ." +" ĐŖĐ˛Ņ–ĐŧĐēĐŊŅ–Ņ‚ŅŒ ҆Đĩ, Ņ‰ĐžĐą виĐēĐžĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊŅ– СĐŧŅ–ĐŊи, Đ´ĐžĐēи ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚ĐŊиĐē ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž — " +"ĐēĐžĐļĐŊа ĐŊĐ°ŅŅ‚ŅƒĐŋĐŊа Đ˛ŅĐĩ ОдĐŊĐž ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒŅ” ĐŋĐžŅˆŅ‚ĐžĐ˛Ņ…Ņƒ ĐēĐĩŅ€Đŧа." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "НĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐž ĐŊа Ņ†Ņ–Đš ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€ĐŧŅ– Subaru." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "НĐĩ ĐŋŅ–Đ´â€™Ņ”Đ´ĐŊаĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "НĐĩ СадаĐŊĐž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "" +"ĐŸŅ€Đ¸ĐŧŅ–Ņ‚Đēа: ĐŊа Đ°Đ˛Ņ‚Đž ĐąĐĩС ĐēĐŊĐžĐŋĐēи LFA/LKAS виĐŧĐēĐŊĐĩĐŊĐŊŅ Ņ†ŅŒĐžĐŗĐž ĐŊĐĩ Đ´Đ°Ņ” ĐēĐĩŅ€ĐŧĐžĐ˛Ņ–Đš " +"Đ´ĐžĐŋĐžĐŧĐžĐˇŅ– аĐēŅ‚Đ¸Đ˛ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ ĐŋŅ–Đ´ Ņ‡Đ°Ņ СĐŧŅ–ĐŊ Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐžŅŅ‚Ņ– ĐēŅ€ŅƒŅ—ĐˇŅƒ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "ĐŸĐžŅˆŅ‚ĐžĐ˛Ņ… ĐēĐĩŅ€Đŧа" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "ОФЛАЙН" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "OK" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "ОНЛАЙН" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "ВиĐŧĐē." + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "ĐžŅ„ĐģаКĐŊ-ĐēĐ°Ņ€Ņ‚Đ¸ ĐŊа ĐĩĐēŅ€Đ°ĐŊŅ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "ĐžŅ„Ņ€ĐžŅƒĐ´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "ĐĸаКĐŧĐĩŅ€ виĐŧĐēĐŊĐĩĐŊĐŊŅ в ĐžŅ„Ņ€ĐžŅƒĐ´" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "" +"ĐžŅ„Ņ€ĐžŅƒĐ´: ĐŋҖҁĐģŅ ĐēĐžĐļĐŊĐžĐŗĐž СаĐŋ҃ҁĐē҃ Ņ‡Đ¸ ĐŋŅ€ĐžĐąŅƒĐ´ĐļĐĩĐŊĐŊŅ ĐŋĐĩŅ€ĐĩŅ…ĐžĐ´Đ¸Ņ‚ŅŒ ҃ ÂĢЗавĐļди ĐžŅ„Ņ€ĐžŅƒĐ´Âģ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "ЗĐŧҖ҉ĐĩĐŊĐŊŅ:" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "На ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "ОĐŊĐģаКĐŊ-ĐēĐ°Ņ€Ņ‚Đ¸ ĐŊа ĐĩĐēŅ€Đ°ĐŊŅ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "ІĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐēа ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ŅƒŅ…Ņƒ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "Đ’Ņ–Đ´ĐēŅ€Đ¸ĐšŅ‚Đĩ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐžĐē Konn3kt ĐŊа Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊŅ–" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "Назва (ĐŊĐĩĐžĐąĐžĐ˛â€™ŅĐˇĐēОвО)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "" +"ПоĐēĐ°ĐˇŅƒŅ” ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ŅƒŅ…Ņƒ ҁĐŧŅƒĐŗŅƒ ĐļĐ¸Đ˛Đ¸Ņ… ĐŋĐžĐēаСĐŊиĐēŅ–Đ˛ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ (ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ, ĐąŅ–Ņ‡ĐŊĐĩ " +"ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ, даĐŊŅ– ĐŋŅ€Đž Đ°Đ˛Ņ‚Đž ĐŋĐžĐŋĐĩŅ€ĐĩĐ´Ņƒ)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "ПІДКЛЮЧИĐĸИ" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "ĐœĐ˜ĐĐŖĐ›Đ˜Đ™ ĐĸИЖДЕНĐŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "Đ ĐĩĐļиĐŧ PQ HCA Status 7" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "Ņ€ĐĩĐļиĐŧ PQ HCA status 7" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "ПОКАЖИ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "ĐŸŅ–Đ´ĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "ОĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐˇĐ°Ņ€Đ°Đˇ" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "ĐŸŅ–Đ´ĐēĐģŅŽŅ‡Đ¸Ņ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "Đ—â€™Ņ”Đ´ĐŊĐ°ĐšŅ‚Đĩ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ҃ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐē҃ Konn3kt" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "Đ—â€™Ņ”Đ´ĐŊĐ°ĐšŅ‚Đĩ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ҃ ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐē҃ Konn3kt." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "ĐŸŅ–Đ´ĐēĐģŅŽŅ‡Ņ–Ņ‚ŅŒ ŅĐ˛Ņ–Đš ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš Đ´Đž ОйĐģŅ–ĐēОвĐēи Konn3kt" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "ĐŸŅ€Đ¸ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "ВиĐēĐžĐŊĐ°Ņ‚Đ¸ ĐŋĐžŅˆŅƒĐē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "ОбĐĩŅ€Ņ–Ņ‚ŅŒ, ŅĐē ĐēĐĩŅ€ĐŧОва Đ´ĐžĐŋĐžĐŧĐžĐŗĐ° Ņ€ĐĩĐ°ĐŗŅƒŅ”, ĐēĐžĐģи Đ˛ĐžĐ´Ņ–Đš ĐŗĐ°ĐģҌĐŧŅƒŅ” в IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "ОбĐĩŅ€Ņ–Ņ‚ŅŒ, Ņ‰Đž ĐŊĐ°Ņ‚Đ¸ŅĐēаĐŊĐŊŅ ĐŋĐĩдаĐģŅ– ĐŗĐ°ĐģҌĐŧа Ņ€ĐžĐąĐ¸Ņ‚ŅŒ Ņ–Đˇ ĐēĐĩŅ€ĐŧĐžĐ˛ĐžŅŽ Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "" +"ОбĐĩŅ€Ņ–Ņ‚ŅŒ, Ņ‡Đ¸ ĐŗĐžŅ‚ĐžĐ˛Đĩ ĐžĐŊОвĐģĐĩĐŊĐŊŅ ĐģĐ¸ŅˆĐĩ ҇ĐĩĐēĐ°Ņ” ĐŊа Đ˛Đ°Ņˆ Đ´ĐžĐˇĐ˛Ņ–Đģ, Ņ‡Đ¸ СаваĐŊŅ‚Đ°ĐļŅƒŅ”Ņ‚ŅŒŅŅ Ņ‚Đ° " +"Đ˛ŅŅ‚Đ°ĐŊОвĐģŅŽŅ”Ņ‚ŅŒŅŅ ŅĐ°ĐŧĐžŅŅ‚Ņ–ĐšĐŊĐž." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "ОбĐĩŅ€Ņ–Ņ‚ŅŒ ŅĐ˛Ņ–Đš Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "ЗаĐēҀҖĐŋŅ–Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ, Ņ‰ĐžĐą ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ Đ°Đ˛Ņ‚ĐžĐ˛Đ¸ĐˇĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "" +"ЗаĐēҀҖĐŋĐģŅŽŅ” ĐļĐ¸Đ˛Ņ– ĐŋĐžĐēаСĐŊиĐēи (Đ´Đ¸ŅŅ‚Đ°ĐŊŅ†Ņ–Ņ, ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ, Ņ‡Đ°Ņ Đ´Đž Đ°Đ˛Ņ‚Đž ĐŋĐžĐŋĐĩŅ€ĐĩĐ´Ņƒ) ĐŊа " +"ĐŋОСĐŊĐ°Ņ‡Ņ†Ņ– Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´Ņƒ. ĐŸĐžŅ‚Ņ€ĐĩĐąŅƒŅ”, Ņ‰ĐžĐą ĐŗĐ°ĐˇĐžĐŧ Ņ– ĐŗĐ°ĐģҌĐŧĐžĐŧ ĐēĐĩŅ€ŅƒĐ˛Đ°Đ˛ ŅĐ°ĐŧĐĩ " +"IQ.Pilot." + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "" +"Đ‘ŅƒĐ´ŅŒ ĐģĐ°ŅĐēа, ĐŋŅ–Đ´ĐēĐģŅŽŅ‡Ņ–Ņ‚ŅŒŅŅ Đ´Đž Wi-Fi, Ņ‰ĐžĐą СавĐĩŅ€ŅˆĐ¸Ņ‚Đ¸ ĐŋĐžŅ‡Đ°Ņ‚ĐēОвĐĩ ҁĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊŅ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "ĐŸŅ–Đ´â€™Ņ”Đ´ĐŊĐ°ĐšŅ‚ĐĩŅŅ Đ´Đž Wi-Fi, Ņ‰ĐžĐą СавĐĩŅ€ŅˆĐ¸Ņ‚Đ¸ ĐŋĐžŅ‡Đ°Ņ‚ĐēОвĐĩ Đˇâ€™Ņ”Đ´ĐŊаĐŊĐŊŅ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "ĐŸŅ–Đ´â€™Ņ”Đ´ĐŊĐ°ĐšŅ‚ĐĩŅŅ Đ´Đž Wi-Fi, Ņ‰ĐžĐą ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ ĐēĐģŅŽŅ‡." + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "ĐŸŅ–Đ´â€™Ņ”Đ´ĐŊĐ°ĐšŅ‚ĐĩŅŅ Đ´Đž Wi-Fi, Ņ‰ĐžĐą ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸." + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "НавĐĩĐ´Ņ–Ņ‚ŅŒ ĐēаĐŧĐĩŅ€Ņƒ Đ˛ĐžĐ´Ņ–Ņ ĐŊа QR-ĐēОд eSIM ĐžĐŋĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° (LPA:...)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "Đ’Đ°ĐŗĐ¸ ĐŋĐžĐģŅ–Ņ‚Đ¸Đēи" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "ВиĐŧĐēĐŊŅƒŅ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"ВиĐŧиĐēĐ°Ņ” ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŋҖҁĐģŅ Ņ‚ĐžĐŗĐž, ŅĐē Đ˛Ņ–ĐŊ ĐŋŅ€ĐžŅŅ‚ĐžŅĐ˛ ҁ҂ҖĐģҌĐēи Ņ‡Đ°ŅŅƒ С виĐŧĐēĐŊĐĩĐŊиĐŧ Đ´Đ˛Đ¸ĐŗŅƒĐŊĐžĐŧ.\n" +"(Ņ‚Đ¸ĐŋОвО 30 ĐŗĐžĐ´)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "ĐŸŅ€ĐžĐŗĐŊОСĐŊиК" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "ĐŸŅ€ĐžĐŗĐŊОСĐŊĐĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ: ĐŋĐĩŅ€ĐĩĐ´ĐąĐ°Ņ‡Đ°Ņ” Ņ‚Đ° ĐˇĐŗĐģадĐļŅƒŅ” СĐŧŅ–ĐŊи ĐŋŅ€Đ¸ŅĐēĐžŅ€ĐĩĐŊĐŊŅ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "ПоĐŋĐĩŅ€ĐĩĐ´ĐŊŅ” СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ + Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "Đ›Đ¸ŅˆĐĩ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐŊŅ” СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "ĐŸŅ–Đ´ĐŗĐžŅ‚ĐžĐ˛Đēа Ņ‚Đ°ĐšĐģŅ–Đ˛ ĐēĐ°Ņ€Ņ‚Đ¸..." + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "" +"ЗаĐŋĐžĐąŅ–ĐŗĐ°ĐšŅ‚Đĩ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅŽ вĐĩĐģиĐēĐ¸Ņ… ĐžĐąŅŅĐŗŅ–Đ˛ даĐŊĐ¸Ņ… ĐŋŅ–Đ´ Ņ‡Đ°Ņ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ Wi-" +"Fi-С'Ņ”Đ´ĐŊаĐŊĐŊŅ С ОйĐŧĐĩĐļĐĩĐŊиĐŧ Ņ‚Ņ€Đ°Ņ„Ņ–ĐēĐžĐŧ" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "" +"ЗаĐŋĐžĐąŅ–ĐŗĐ°Ņ‚Đ¸ вĐĩĐģиĐēиĐŧ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅĐŧ даĐŊĐ¸Ņ… ĐŋŅ–Đ´ Ņ‡Đ°Ņ ĐģŅ–ĐŧŅ–Ņ‚ĐŊĐžĐŗĐž ҁ҂ҖĐģҌĐŊиĐēĐžĐ˛ĐžĐŗĐž " +"С'Ņ”Đ´ĐŊаĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "" +"ПоĐŋĐĩŅ€ĐĩĐ´ĐŊŅŒĐž ĐŋĐĩŅ€ĐĩĐŗĐģŅĐŊŅŒŅ‚Đĩ ĐēаĐŧĐĩŅ€Ņƒ, ҁĐŋŅ€ŅĐŧОваĐŊ҃ ĐŊа Đ˛ĐžĐ´Ņ–Ņ, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐēĐžĐŊĐ°Ņ‚Đ¸ŅŅ, Ņ‰Đž " +"ŅĐ¸ŅŅ‚ĐĩĐŧа ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗŅƒ Đ˛ĐžĐ´Ņ–Ņ ĐŧĐ°Ņ” Đ´ĐžĐąŅ€Ņƒ видиĐŧŅ–ŅŅ‚ŅŒ. (Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ ĐŋОвиĐŊĐĩĐŊ ĐąŅƒŅ‚Đ¸ " +"виĐŧĐēĐŊĐĩĐŊиК)" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "Đ”Ņ–Ņ— С ĐŋŅ€ĐžŅ„Ņ–ĐģĐĩĐŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "" +"ЗаваĐŊŅ‚Đ°ĐļŅƒŅ” ĐļĐ¸Đ˛Ņ– Ņ‚Đ°ĐšĐģи Mapbox Đ´ĐģŅ ĐēĐ°Ņ€Ņ‚Đ¸ ĐŊа ĐĩĐēŅ€Đ°ĐŊŅ–, Ņ‰ĐžĐšĐŊĐž ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŧĐ°Ņ” " +"Ņ–ĐŊŅ‚ĐĩŅ€ĐŊĐĩŅ‚." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐĩ҈ ĐŧОдĐĩĐģĐĩĐš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "" +"ПĐĩŅ€ĐĩвĐĩĐ´Ņ–Ņ‚ŅŒ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ҃ ÂĢЗавĐļди ĐžŅ„Ņ€ĐžŅƒĐ´Âģ айО виĐŧĐēĐŊŅ–Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ, ĐŋĐĩŅ€Ņˆ ĐŊŅ–Đļ " +"СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸ ҁĐŋĐžŅŅ–Đą Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ ĐžĐŊОвĐģĐĩĐŊҌ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "" +"ПĐĩŅ€ĐĩвĐĩĐ´Ņ–Ņ‚ŅŒ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ҃ ÂĢЗавĐļди ĐžŅ„Ņ€ĐžŅƒĐ´Âģ айО виĐŧĐēĐŊŅ–Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ, ĐŋĐĩŅ€Ņˆ ĐŊŅ–Đļ ҆Đĩ " +"СĐŧŅ–ĐŊŅŽĐ˛Đ°Ņ‚Đ¸." + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "ПоĐŧиĐģĐēа QR-ĐēĐžĐ´Ņƒ" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "QR-ĐēОд ĐŋŅ€Đ¸ĐšĐŊŅŅ‚Đž" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "ГОĐĸОВО" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "ЗАВАНĐĸАЖИĐĸИ Đ—ĐĐžĐ’ĐŖ" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "ОНОВИĐĸИ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "ВИДАЛИĐĸИ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "Đ’Đ˜Đ”ĐĐ›Đ•ĐĐĐ¯..." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "ĐĄĐēиĐŊŅƒŅ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "ДИВИĐĸИХĐŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "Đ ĐĩĐšĐēа:" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "" +"ПĐĩŅ€ĐĩĐ˛ŅŅ‚Đ°ĐŊĐžĐ˛Ņ–Ņ‚ŅŒ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš, ŅĐēŅ‰Đž ОйĐģĐ¸Ņ‡Ņ‡Ņ СаĐēŅ€Đ¸Ņ‚Đĩ айО ŅĐ¸ŅŅ‚ĐĩĐŧа ĐŋĐžĐŗĐ°ĐŊĐž ĐšĐžĐŗĐž " +"Đ˛Ņ–Đ´ŅŅ‚ĐĩĐļŅƒŅ”." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "Đ”ĐžŅŅ‚ŅƒĐŋĐŊĐž ĐģĐ¸ŅˆĐĩ С виĐŧĐēĐŊĐĩĐŊиĐŧ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģĐĩĐŧ айО ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊиĐŧ ÂĢЗавĐļди ĐžŅ„Ņ€ĐžŅƒĐ´Âģ." + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "ПĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "ПĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļŅ‚Đĩ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "ПĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ Ņ‚Đ° ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "" +"ĐžŅ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đž ĐŊĐĩĐžĐąŅ…Ņ–Đ´ĐŊŅ–ŅŅ‚ŅŒ ĐŋОвĐĩŅ€ĐŊŅƒŅ‚Đ¸ŅŅ в ҁĐŧŅƒĐŗŅƒ, ĐēĐžĐģи Đ˛Đ°Ņˆ " +"Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ ĐŋĐĩŅ€ĐĩŅ‚Đ¸ĐŊĐ°Ņ” Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊ҃ ĐģŅ–ĐŊŅ–ŅŽ Ņ€ĐžĐˇĐŧŅ–Ņ‚Đēи ĐąĐĩС ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐžĐŗĐž ŅĐ¸ĐŗĐŊаĐģ҃ " +"ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņƒ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ŅƒŅ…Ņƒ ĐˇŅ– ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŽ ĐŋĐžĐŊад 31 ĐŧиĐģҌ/ĐŗĐžĐ´ (50 ĐēĐŧ/ĐŗĐžĐ´)." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "ĐŸĐ¸ŅĐ°Ņ‚Đ¸ Ņ‚Đ° ваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ Đ˛Ņ–Đ´ĐĩĐž С ĐēаĐŧĐĩŅ€Đ¸ Đ˛ĐžĐ´Ņ–Ņ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "ЗаĐŋĐ¸Ņ Ņ‚Đ° СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ Đ°ŅƒĐ´Ņ–Đž С ĐŧŅ–ĐēŅ€ĐžŅ„ĐžĐŊа" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "" +"ЗаĐŋĐ¸ŅŅƒĐšŅ‚Đĩ Ņ‚Đ° СйĐĩŅ€Ņ–ĐŗĐ°ĐšŅ‚Đĩ Đ°ŅƒĐ´Ņ–Đž С ĐŧŅ–ĐēŅ€ĐžŅ„ĐžĐŊа ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ŅƒŅ…Ņƒ. ĐŅƒĐ´Ņ–Đž ĐąŅƒĐ´Đĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐž " +"Đ´Đž Đ˛Ņ–Đ´ĐĩĐž С Đ˛Ņ–Đ´ĐĩĐžŅ€ĐĩŅ”ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ° в Konn3kt." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "" +"ЗаĐŋĐ¸ŅŅƒĐ˛Đ°Ņ‚Đ¸ Ņ‚Đ° виваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°Ņ‚Đ¸ даĐŊŅ– Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ Đš Đ˛Ņ–Đ´ĐĩĐž. ВиĐŧĐēĐŊĐĩĐŊĐŊŅ ĐˇŅƒĐŋиĐŊŅŅ” вĐĩҁҌ " +"СаĐŋĐ¸Ņ! ĐŅ– ĐļŅƒŅ€ĐŊаĐģŅ–Đ˛, ĐŊŅ– Đ˛Ņ–Đ´ĐĩĐž, ĐŊŅ– ĐˇĐ˛ŅƒĐē҃." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ СĐŊĐžĐ˛Ņƒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "ЗаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ ĐŋĐžŅ‚ĐžŅ‡ĐŊ҃ ĐŧОдĐĩĐģҌ СĐŊĐžĐ˛Ņƒ" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "ОĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģŅ–" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "ĐĐžŅ€ĐŧĐ°Ņ‚Đ¸Đ˛ĐŊŅ– Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "ĐĄĐŋĐžĐēŅ–ĐšĐŊиК" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "ПĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē ĐŧОдĐĩĐģĐĩĐš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "Đ›Đ¸ŅˆĐ°Ņ‚Đ¸ŅŅ аĐēŅ‚Đ¸Đ˛ĐŊиĐŧ: ĐŗĐ°ĐģҌĐŧŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊŅ–ĐēĐžĐģи ĐŊĐĩ ĐŋĐĩŅ€ĐĩŅ€Đ¸Đ˛Đ°Ņ” ĐēĐĩŅ€ĐŧĐžĐ˛Ņƒ Đ´ĐžĐŋĐžĐŧĐžĐŗŅƒ." + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "Đ’Ņ–Đ´Đ´Đ°ĐģĐĩĐŊиК Đ´ĐžŅŅ‚ŅƒĐŋ" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "ВидаĐģĐ¸Ņ‚Đ¸" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "ВидаĐģĐ¸Ņ‚Đ¸ pSIM Comma" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "ПĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°Ņ‚Đ¸" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "ПĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģҌ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "Đ§Đ°Ņ СаĐŋĐ¸Ņ‚Ņƒ Đ˛Đ¸Ņ‡ĐĩŅ€ĐŋаĐŊĐž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "ĐŸĐžŅ‚Ņ€ĐĩĐąŅƒŅ” ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐžĐŗĐž ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ IQ.Pilot (аĐģŅŒŅ„Đ°)." + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "ĐĄĐēиĐŊŅƒŅ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "ĐĄĐēиĐŊŅƒŅ‚Đ¸ ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "Đ’Ņ–Đ´ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ Ņ‚Đ¸ĐŋĐžĐ˛Ņ–" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ¸ ĐŋĐžŅŅ–ĐąĐŊиĐē С ĐŊĐ°Đ˛Ņ‡Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅŒŅ‚Đĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа, Ņ„ŅƒĐŊĐē҆Җҗ Ņ‚Đ° ОйĐŧĐĩĐļĐĩĐŊĐŊŅ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "ĐŊаСва Đ´ĐžŅ€ĐžĐŗĐ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "Назва Đ´ĐžŅ€ĐžĐŗĐ¸ ĐŊа ĐĩĐēŅ€Đ°ĐŊŅ–" + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "ĐœĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "ВĐĩŅ€ŅŅ–Ņ Ņ€ŅƒŅˆŅ–Ņ ĐŧĐ°Ņ€ŅˆŅ€ŅƒŅ‚Đ¸ĐˇĐ°Ņ†Ņ–Ņ—" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "ЗаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐžĐŧĐŋаĐēŅ‚ĐŊиК Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ comma 4 (mici) ĐŊа Ņ†ŅŒĐžĐŧ҃ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅ—" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "ВИБРАĐĸИ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC Đ°Đ˛Ņ‚Đž ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´ĐļĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸ Đ˛Đ¸Ņ‰Đĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC ĐŋŅ–Đ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đ¸ ĐŊиĐļ҇Đĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC СаĐŋĐ°Ņ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC ĐžĐŊĐģаКĐŊ-СаĐŋОвĐŊĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC ĐŋĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC ĐŋĐžĐģŅ–Ņ‚Đ¸Đēа" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "SSH ĐēĐģŅŽŅ‡Ņ–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "ĐēĐģŅŽŅ‡Ņ– SSH" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "ЗАВОДСĐŦКИЙ ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "ĐĄĐēаĐŊŅƒĐ˛Đ°Ņ‚Đ¸" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "ĐĄĐēаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ QR" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "ĐĄĐēаĐŊŅƒĐšŅ‚Đĩ QR-ĐēОд айО ввĐĩĐ´Ņ–Ņ‚ŅŒ ĐēОд аĐēŅ‚Đ¸Đ˛Đ°Ņ†Ņ–Ņ—" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "ĐŸĐžŅˆŅƒĐē ĐŧĐĩŅ€ĐĩĐļ..." + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "ĐŸĐžŅˆŅƒĐē" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "ĐŸĐžŅˆŅƒĐē Đ°Đ´Ņ€ĐĩŅĐ¸ айО ĐŧŅ–ŅŅ†Ņ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "ĐŸĐžŅˆŅƒĐē ĐŧĐ°Ņ€Đēи айО ĐŧОдĐĩĐģŅ–" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "ĐŸĐžŅˆŅƒĐē..." + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "Đ’Đ¸ĐąŅ€Đ°Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐŗŅ–ĐģĐē҃" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "ВибĐĩŅ€Ņ–Ņ‚ŅŒ ĐŧĐžĐ˛Ņƒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "ХаĐŧĐžĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēи ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "ĐĄĐĩŅ€Ņ–ĐšĐŊиК ĐŊĐžĐŧĐĩŅ€" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "Đ—Đ°Đ´Đ°Ņ‚Đ¸ Đ´Ņ–Đŧ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "ОдиĐŊĐ¸Ņ†Ņ– Са Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅĐŧ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "Đ—Đ°Đ´Đ°Ņ‚Đ¸ Ņ€ĐžĐąĐžŅ‚Ņƒ" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "Đ—Đ°Đ´Đ°Ņ‚Đ¸ Đ´ĐžĐŧĐ°ŅˆĐŊŅŽ Đ°Đ´Ņ€Đĩҁ҃" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "" +"Đ—Đ°Đ´Đ°Đ˛Đ°Ņ‚Đ¸ ОдиĐŊĐ¸Ņ†Ņ– Са Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ. ШвидĐēŅ–ŅŅ‚ŅŒ ĐŋĐĩŅ€ĐĩĐŧиĐēĐ°Ņ”Ņ‚ŅŒŅŅ ĐŊа " +"ĐēĐŧ/ĐŗĐžĐ´ ŅƒŅŅŽĐ´Đ¸, ĐēҀҖĐŧ ХША, ВĐĩĐģиĐēĐžŅ— Đ‘Ņ€Đ¸Ņ‚Đ°ĐŊŅ–Ņ— Ņ‚Đ° Đ›Ņ–ĐąĐĩҀҖҗ, Ņ– ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅ”Ņ‚ŅŒŅŅ СĐŊĐžĐ˛Ņƒ " +"ĐŋҖҁĐģŅ ĐŋĐĩŅ€ĐĩŅ‚Đ¸ĐŊ҃ ĐēĐžŅ€Đ´ĐžĐŊ҃." + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "Đ—Đ°Đ´Đ°Ņ‚Đ¸ Ņ€ĐžĐąĐžŅ‡Ņƒ Đ°Đ´Ņ€Đĩҁ҃" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "" +"Đ—Đ°Đ´Đ°Ņ” ĐŋĐžŅ€Ņ–Đŗ ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ– Đ´ĐģŅ ĐŊаĐŧŅ–Ņ€Ņ–Đ˛ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņƒ. НиĐļ҇Đĩ Ņ†ŅŒĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŊаĐŧŅ–Ņ€Đ¸ " +"ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŋĐģаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊаКйĐģиĐļŅ‡Đ¸Đš ĐŋŅ€ĐžŅ—ĐˇĐŊиК ҈ĐģŅŅ… ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņƒ. ĐĸиĐŋОвО 19 ĐŧиĐģҌ/ĐŗĐžĐ´." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "" +"ВизĐŊĐ°Ņ‡Đ°Ņ”, ҃ ŅĐēĐžĐŧ҃ ŅŅ‚Đ°ĐŊŅ– ĐžĐŋиĐŊŅŅ”Ņ‚ŅŒŅŅ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŋҖҁĐģŅ СаĐŋ҃ҁĐē҃ айО ĐŋŅ€ĐžĐąŅƒĐ´ĐļĐĩĐŊĐŊŅ ĐˇŅ–" +" ҁĐŊ҃." + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "" +"ПоĐēĐ°ĐˇŅƒŅ” ĐŊĐ°ĐˇĐ˛Ņƒ ĐŋĐžŅ‚ĐžŅ‡ĐŊĐžŅ— Đ´ĐžŅ€ĐžĐŗĐ¸ ĐŊад видОĐŧ Đ´ĐžŅ€ĐžĐŗĐ¸.
    ĐŸĐžŅ‚Ņ€ĐĩĐąŅƒŅ” Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐ¸Ņ… " +"ĐžŅ„ĐģаКĐŊ-ĐēĐ°Ņ€Ņ‚ Đ´ĐģŅ Đ˛Đ°ŅˆĐžĐŗĐž Ņ€ĐĩĐŗŅ–ĐžĐŊ҃." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "ПĐģавĐŊĐĩ ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "Đ’Ņ–Đ´ĐēĐģĐ°ŅŅ‚Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "ĐŸŅ€ĐžĐŗŅ€Đ°Đŧа" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "ШвидĐēŅ–ŅŅ‚ŅŒ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "ОбĐŧĐĩĐļĐĩĐŊĐŊŅ ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "КĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ОйĐŧĐĩĐļĐĩĐŊĐŊŅĐŧ ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ–" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "ĐĄŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК Ņ€ĐĩĐļиĐŧ. В Đ°ĐŗŅ€ĐĩŅĐ¸Đ˛ĐŊĐžĐŧ҃ Ņ€ĐĩĐļиĐŧŅ– IQ.Pilot ĐąŅƒĐ´Đĩ " +"Ņ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ŅŅ ĐąĐģиĐļ҇Đĩ Đ´Đž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ–Đ˛ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´Ņƒ Ņ– ĐąŅ–ĐģҌ҈ Đ°ĐŗŅ€ĐĩŅĐ¸Đ˛ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ " +"ĐŗĐ°Đˇ Ņ– ĐŗĐ°ĐģҌĐŧа. ĐŖ ҁĐŋĐžĐēŅ–ĐšĐŊĐžĐŧ҃ Ņ€ĐĩĐļиĐŧŅ– IQ.Pilot ĐąŅƒĐ´Đĩ Ņ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ŅŅ ĐŊа ĐąŅ–ĐģŅŒŅˆŅ–Đš " +"Đ˛Ņ–Đ´ŅŅ‚Đ°ĐŊŅ– Đ˛Ņ–Đ´ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ–Đ˛ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´Ņƒ. На ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°ĐŊĐ¸Ņ… Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅŅ… ви ĐŧĐžĐļĐĩŅ‚Đĩ " +"ĐŋĐĩŅ€ĐĩĐŧиĐēĐ°Ņ‚Đ¸ŅŅ ĐŧŅ–Đļ Ņ†Đ¸Đŧи Ņ€ĐĩĐļиĐŧаĐŧи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐŊĐžĐŋĐēи Đ´Đ¸ŅŅ‚Đ°ĐŊ҆Җҗ ĐŊа ĐēĐĩŅ€ĐŧŅ–." + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "" +"ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ: ĐŗĐ°ĐģҌĐŧŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ĐˇŅƒĐŋиĐŊŅŅ” ĐēĐĩŅ€ĐŧĐžĐ˛Ņƒ Đ´ĐžĐŋĐžĐŧĐžĐŗŅƒ; вОĐŊа ĐŋОвĐĩŅ€Ņ‚Đ°Ņ”Ņ‚ŅŒŅŅ, " +"Ņ‰ĐžĐšĐŊĐž ви ĐŋŅ€Đ¸ĐąĐ¸Ņ€Đ°Ņ”Ņ‚Đĩ ĐŊĐžĐŗŅƒ С ĐŋĐĩдаĐģŅ–." + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "ĐŸĐžŅ‡Đ°Ņ‚Đ¸ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "" +"ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ҁ҃ĐŧҖҁĐŊŅ–ŅŅ‚ŅŒ ĐŋОвĐĩĐ´Ņ–ĐŊĐēи ĐēĐĩŅ€ĐŧĐžĐ˛ĐžŅ— Đ´ĐžĐŋĐžĐŧĐžĐŗĐ¸." + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "Đ¨Ņ‚Đ°Ņ‚" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "ĐĄŅ‚Đ°Ņ‚Đ¸ŅŅ‚Đ¸Đēа" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "ĐĄŅ‚Đ°Ņ‚ŅƒŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "Đ›Đ¸ŅˆĐ°Ņ‚Đ¸ŅŅ аĐēŅ‚Đ¸Đ˛ĐŊиĐŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "КĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "ПовĐĩĐ´Ņ–ĐŊĐēа ĐēĐĩŅ€ĐŧĐžĐ˛ĐžŅ— Đ´ĐžĐŋĐžĐŧĐžĐŗĐ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "Đ”ŅƒĐŗĐ° ĐēĐĩŅ€ĐŧĐžĐ˛ĐžĐŗĐž ĐˇŅƒŅĐ¸ĐģĐģŅ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "Đ—Đ°Đ˛ĐžĐ´ŅŅŒĐēиК ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "Đ—ŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"Đ’Đ°Ņ€Ņ–Đ°ĐŊŅ‚ stop-and-go Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ–Đ˛ Subaru Global Ņ–Đˇ Ņ€ŅƒŅ‡ĐŊиĐŧ ĐŗĐ°ĐģҌĐŧĐžĐŧ. ЗаĐģĐ¸ŅˆŅ‚Đĩ" +" виĐŧĐēĐŊĐĩĐŊиĐŧ ĐŊа Đ°Đ˛Ņ‚Đž С ĐĩĐģĐĩĐēŅ‚Ņ€Đ¸Ņ‡ĐŊиĐŧ ŅŅ‚ĐžŅĐŊĐēОвиĐŧ ĐŗĐ°ĐģҌĐŧĐžĐŧ. Đ”ŅĐēŅƒŅ”ĐŧĐž martinl Са Ņ†ŅŽ " +"Ņ€ĐĩаĐģŅ–ĐˇĐ°Ņ†Ņ–ŅŽ!" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "ЗбĐĩŅ€ĐĩĐļĐĩĐŊŅ– ĐēĐ°Ņ€Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "ĐĸŅ€Đ°ĐŊҁĐģŅŅ†Ņ–Ņ С Ņ…ĐŧĐ°Ņ€Đ¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "ПĐĩŅ€ĐĩвĐĩŅŅ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ҃ Ņ€ĐĩĐļиĐŧ ÂĢЗавĐļди ĐžŅ„Ņ€ĐžŅƒĐ´Âģ?" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "ПĐĩŅ€ĐĩвĐĩŅŅ‚Đ¸ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ҃ ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš Ņ€ĐĩĐļиĐŧ ĐžŅ„Ņ€ĐžŅƒĐ´?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "ĐĄĐ¸ŅŅ‚ĐĩĐŧа" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "ĐĄĐ¸ŅŅ‚ĐĩĐŧа ĐŊĐĩ Ņ€ĐĩĐ°ĐŗŅƒŅ”" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "ĐšĐ•Đ ĐœĐŖĐ™ĐĸЕ НЕГАЙНО" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "ĐĸЕМП" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "ВИСОКА ĐĸЕМП." + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "ĐĸЕМП. ОК" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "ĐĐ°Ņ‚Đ¸ŅĐŊŅ–Ņ‚ŅŒ ÂĢAdd DeviceÂģ Ņ– Đ˛Ņ–Đ´ŅĐēаĐŊŅƒĐšŅ‚Đĩ QR-ĐēОд ĐŋŅ€Đ°Đ˛ĐžŅ€ŅƒŅ‡" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "ĐĻŅ–ĐģŅŒĐžĐ˛Đ° ĐŗŅ–ĐģĐēа" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "ĐŸĐ°Ņ€ĐžĐģҌ Đ´ĐģŅ Ņ‚ĐžŅ‡Đēи Đ´ĐžŅŅ‚ŅƒĐŋ҃" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "" +"ĐžĐąŅ€Đ°ĐŊа ĐŧОдĐĩĐģҌ СĐŧŅ–ĐŊиĐģĐ°ŅŅ. РадиĐŧĐž ҁĐēиĐŊŅƒŅ‚Đ¸ ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ. Đ—Ņ€ĐžĐąĐ¸Ņ‚Đ¸ ҆Đĩ ĐˇĐ°Ņ€Đ°Đˇ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "ĐŸŅ–ŅĐģŅ СаĐŋ҃ҁĐē҃ ҁĐēĐ°ŅŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊĐĩĐŧĐžĐļĐģивО — ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đš ŅˆĐ°ĐŊҁ Đ˛Ņ–Đ´ĐŧĐžĐ˛Đ¸Ņ‚Đ¸ŅŅ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "ЊОй ĐˇĐ°ŅŅ‚ĐžŅŅƒĐ˛Đ°Ņ‚Đ¸, ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐĩ ĐŋĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ. ПĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ ĐˇĐ°Ņ€Đ°Đˇ?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "ĐĻŅ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧа ОйĐŧĐĩĐļĐĩĐŊа Ņ€ĐĩĐļиĐŧĐžĐŧ ÂĢВиĐŧĐēĐŊŅƒŅ‚Đ¸Âģ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "" +"ĐĻŅ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧа ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” ОйĐŧĐĩĐļĐĩĐŊиК ĐŊĐ°ĐąŅ–Ņ€ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Ņ–Đ˛ ĐŋОвĐĩĐ´Ņ–ĐŊĐēи ĐēĐĩŅ€ĐŧĐžĐ˛ĐžŅ— " +"Đ´ĐžĐŋĐžĐŧĐžĐŗĐ¸." + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "" +"ĐĻŅ ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧа ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” ĐŋОвĐŊĐĩ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋОвĐĩĐ´Ņ–ĐŊĐēи ĐēĐĩŅ€ĐŧĐžĐ˛ĐžŅ— Đ´ĐžĐŋĐžĐŧĐžĐŗĐ¸." + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"ĐĻĐĩ видаĐģĐ¸Ņ‚ŅŒ ĐŖĐĄĐ† СаваĐŊŅ‚Đ°ĐļĐĩĐŊŅ– ĐēĐ°Ņ€Ņ‚Đ¸\n" +"\n" +"ĐĄĐŋŅ€Đ°Đ˛Đ´Ņ– видаĐģĐ¸Ņ‚Đ¸ Đ˛ŅŅ– ĐēĐ°Ņ€Ņ‚Đ¸?" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "" +"ĐĻĐĩ видаĐģĐ¸Ņ‚ŅŒ Ņ–Đˇ ĐēĐĩ҈҃ ĐŖĐĄĐ† СаваĐŊŅ‚Đ°ĐļĐĩĐŊŅ– ĐŧОдĐĩĐģŅ–, ĐēҀҖĐŧ аĐēŅ‚Đ¸Đ˛ĐŊĐžŅ—. Ви вĐŋĐĩвĐŊĐĩĐŊŅ–?" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "ĐĻĐĩ ĐŊаСавĐļди ĐˇŅ–Ņ‚Ņ€Đĩ ĐŋŅ€ĐžŅ„Ņ–ĐģҌ pSIM Comma С SIM-ĐēĐ°Ņ€Ņ‚Đēи." + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "ĐĻĐĩ Ņ€ĐžĐˇĐŋĐžŅ‡ĐŊĐĩ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ, ŅĐēĐĩ ĐŧĐžĐļĐĩ Ņ‚Ņ€Đ¸Đ˛Đ°Ņ‚Đ¸ Đ´ĐĩŅĐēиК Ņ‡Đ°Ņ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "Đ§Đ°Ņ" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "ПĐĩŅ€ĐĩĐŧиĐēĐ°Ņ‡Ņ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "РаСОĐŧ:" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "" +"МаĐģŅŽŅ” Đ´ŅƒĐŗŅƒ ĐŊад видОĐŧ Đ´ĐžŅ€ĐžĐŗĐ¸, ĐŋĐžĐēĐ°ĐˇŅƒŅŽŅ‡Đ¸, ĐŊĐ°ŅĐēŅ–ĐģҌĐēи ŅĐ¸ĐģҌĐŊĐž IQ.Pilot ĐēĐĩŅ€ĐŧŅƒŅ” ĐŋŅ–Đ´" +" Ņ‡Đ°Ņ ĐąŅ–Ņ‡ĐŊĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "ĐŸĐžŅŅ–ĐąĐŊиĐē Ņ–Đˇ ĐŊĐ°Đ˛Ņ‡Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "ĐŋĐžĐēаĐļŅ‡Đ¸Đēи ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņ–Đ˛" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "" +"ПовĐŊŅ–ŅŅ‚ŅŽ виĐŧиĐēĐ°Ņ” ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đē҃ ĐžĐŊОвĐģĐĩĐŊҌ ҇ĐĩŅ€ĐĩС ĐŧĐĩŅ€ĐĩĐļ҃.
    ПĐĩŅ€ĐĩСаваĐŊŅ‚Đ°ĐļŅ‚Đĩ, Ņ‰ĐžĐą " +"҆Đĩ ĐŊĐ°ĐąŅƒĐģĐž Ņ‡Đ¸ĐŊĐŊĐžŅŅ‚Ņ–." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ ҀҖĐē, а ĐŋĐžŅ‚Ņ–Đŧ ĐŧОдĐĩĐģҌ — ĐŊаĐŋŅ€Đ¸ĐēĐģад, 2021 Toyota Corolla:" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "ВвĐĩĐ´Ņ–Ņ‚ŅŒ Đ´ĐģŅ ĐŋĐžŅˆŅƒĐē҃" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "НЕДОСĐĸĐŖĐŸĐĐž" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "ВИДАЛИĐĸИ" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "ОНОВИĐĸИ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "USB-ĐŊаĐēĐžĐŋĐ¸Ņ‡ŅƒĐ˛Đ°Ņ‡" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "ВИКОРИСĐĸАĐĸИ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "НĐĩ вдаĐģĐžŅŅ СаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ Đ˛Ņ–Đ´ĐĩĐž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "НĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐž, ĐŋĐžĐēи Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ ҃ Ņ€ŅƒŅŅ–." + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "" +"НĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐž — ĐŋОСдОвĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ IQ.Pilot ĐŊĐĩ аĐēŅ‚Đ¸Đ˛ĐŊĐĩ ĐŊа Ņ†ŅŒĐžĐŧ҃ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ–." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "НĐĩ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž Đš ĐŊĐĩ СадаĐŊĐž" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "ВидаĐģĐ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "НĐĩĐ˛Ņ–Đ´ĐžĐŧĐž" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "НĐĩĐ˛Ņ–Đ´ĐžĐŧиК ĐžĐŋĐĩŅ€Đ°Ņ‚ĐžŅ€" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "НĐĩОйĐŧĐĩĐļĐĩĐŊĐĩ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ĐŋĐžŅ—ĐˇĐ´ĐžĐē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "Đ ĐĩĐļиĐŧ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ ĐžĐŊОвĐģĐĩĐŊҌ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "ОĐŊОвĐģĐĩĐŊĐŊŅ СаваĐŊŅ‚Đ°ĐļŅƒŅŽŅ‚ŅŒŅŅ ĐģĐ¸ŅˆĐĩ Ņ‚ĐžĐ´Ņ–, ĐēĐžĐģи Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ виĐŧĐēĐŊĐĩĐŊĐž." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "ВиваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ŅƒŅ…Ņƒ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "" +"ЗаваĐŊŅ‚Đ°ĐļŅƒĐšŅ‚Đĩ даĐŊŅ– С ĐēаĐŧĐĩŅ€Đ¸, ҁĐŋŅ€ŅĐŧОваĐŊĐžŅ— ĐŊа Đ˛ĐžĐ´Ņ–Ņ, Ņ‚Đ° Đ´ĐžĐŋĐžĐŧĐžĐļŅ–Ņ‚ŅŒ ĐŋĐžĐēŅ€Đ°Ņ‰Đ¸Ņ‚Đ¸ " +"аĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗŅƒ Đ˛ĐžĐ´Ņ–Ņ." + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "ВиваĐŊŅ‚Đ°ĐļĐĩĐŊĐž" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "ВиваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ” HCA Status 7 СаĐŧŅ–ŅŅ‚ŅŒ Status 5 Đ´ĐģŅ ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŊа " +"Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅŅ… ĐŋĐģĐ°Ņ‚Ņ„ĐžŅ€Đŧи PQ. ĐĻĐĩ ĐŧĐžĐļĐĩ ĐŋĐžĐēŅ€Đ°Ņ‰Đ¸Ņ‚Đ¸ ҁ҃ĐŧҖҁĐŊŅ–ŅŅ‚ŅŒ Ņ–Đˇ Đ´ĐĩŅĐēиĐŧи ŅŅ‚Đ°Ņ€Ņ–ŅˆĐ¸Đŧи " +"ĐŧОдĐĩĐģŅĐŧи Volkswagen." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊ҃ ŅĐ¸ŅŅ‚ĐĩĐŧ҃" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"ВиĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ ĐēОд аĐēŅ‚Đ¸Đ˛Đ°Ņ†Ņ–Ņ—:\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "" +"ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧ҃ IQ.Pilot Đ´ĐģŅ адаĐŋŅ‚Đ¸Đ˛ĐŊĐžĐŗĐž ĐēŅ€ŅƒŅ—Đˇ-ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅŽ Ņ‚Đ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐ¸ в" +" ŅƒŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ– ҁĐŧŅƒĐŗĐ¸ Ņ€ŅƒŅ…Ņƒ. Đ’Đ°ŅˆĐ° ŅƒĐ˛Đ°ĐŗĐ° ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа ĐŋĐžŅŅ‚Ņ–ĐšĐŊĐž ĐŋŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– ҆ҖҔҗ " +"Ņ„ŅƒĐŊĐē҆Җҗ. ЗĐŧŅ–ĐŊа Ņ†ŅŒĐžĐŗĐž ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊĐ°ĐąŅƒĐ˛Đ°Ņ” Ņ‡Đ¸ĐŊĐŊĐžŅŅ‚Ņ– ĐŋҖҁĐģŅ виĐŧĐēĐŊĐĩĐŊĐŊŅ ĐļивĐģĐĩĐŊĐŊŅ " +"Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "АВĐĸО" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "ДИВИСĐŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTB (Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ СĐŧŅ–ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "ĐĐ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "" +"МоĐļĐģĐ¸Đ˛Ņ–ŅŅ‚ŅŒ ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģĐĩĐŧ ҉Đĩ ĐŊĐĩ Đ˛Đ¸ŅĐ˛ĐģĐĩĐŊĐž. ЗаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ Đ°Đ˛Ņ‚Đž" +" ОдиĐŊ Ņ€Đ°Đˇ, Ņ‰ĐžĐą виСĐŊĐ°Ņ‡Đ¸Ņ‚Đ¸ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧĐē҃." + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "Đ’Ņ–Đ´ĐĩĐžĐŋĐģĐĩҔҀ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ¸ ĐļŅƒŅ€ĐŊаĐģ ĐŋĐžĐŧиĐģĐžĐē ĐˇĐąĐžŅ—Đ˛ IQ.Pilot." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "Đ’Đ°ĐŗĐ¸ ĐˇĐžŅ€Ņƒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "Đ’Đ¸ĐŗĐģŅĐ´" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ŅĐ¸ĐŗĐŊаĐģ҃ GPS..." + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "" +"ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐēаĐŧĐĩŅ€Đ¸ Đ˛ĐžĐ´Ņ–Ņ. ĐĄĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐšŅ‚ĐĩŅŅ QR-ĐēОдОĐŧ eSIM ĐžĐŋĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° айО ввĐĩĐ´Ņ–Ņ‚ŅŒ " +"ĐēОд LPA Đ˛Ņ€ŅƒŅ‡ĐŊ҃." + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐžŅ‡Đ°Ņ‚Đē҃" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "ПоĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"ПоĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ: ҆Đĩ ĐŊĐ°Đ´Đ°Ņ” Đ´ĐžŅŅ‚ŅƒĐŋ SSH ŅƒŅŅ–Đŧ Đ˛Ņ–Đ´ĐēŅ€Đ¸Ņ‚Đ¸Đŧ ĐēĐģŅŽŅ‡Đ°Đŧ Ņ–Đˇ Đ˛Đ°ŅˆĐ¸Ņ… ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊҌ" +" GitHub. ĐŅ–ĐēĐžĐģи ĐŊĐĩ Đ˛Đ˛ĐžĐ´ŅŒŅ‚Đĩ Ņ‡ŅƒĐļĐĩ Ņ–Đŧâ€™Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° GitHub. ĐŸŅ€Đ°Ņ†Ņ–Đ˛ĐŊиĐē IQ.Pilot " +"НІКОЛИ ĐŊĐĩ ĐŋŅ€ĐžŅĐ¸Ņ‚Đ¸ĐŧĐĩ Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ–Đŧâ€™Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° GitHub." + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "" +"ПоĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ: ĐēĐĩŅ€ĐŧĐž ĐŧĐžĐļĐĩ ĐēĐžĐģĐ¸Đ˛Đ°Ņ‚Đ¸ŅŅ в ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Đ°Ņ… ĐŊиĐļ҇Đĩ {}; виĐŧĐēĐŊŅ–Ņ‚ŅŒ ҆Đĩ, ŅĐēŅ‰Đž " +"Đ˛Ņ–Đ´Ņ‡ŅƒĐ˛Đ°Ņ”Ņ‚Đĩ Ņ‚Đ°ĐēĐĩ." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "Đ›Đ°ŅĐēавО ĐŋŅ€ĐžŅĐ¸ĐŧĐž Đ´Đž IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "Đ¯ĐēŅ‰Đž ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž, ĐŊĐ°Ņ‚Đ¸ŅĐēаĐŊĐŊŅ ĐŊа ĐŋĐĩдаĐģҌ аĐēҁĐĩĐģĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° виĐŧĐēĐŊĐĩ IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi-Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "ĐĸŅ€Đ°Ņ„Ņ–Đē Wi-Fi" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "Đ ĐžĐąĐžŅ‚Đ°" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "НĐĩĐ˛Ņ–Ņ€ĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "ĐĸаĐē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "ĐĸаĐē, видаĐģĐ¸Ņ‚Đ¸ Đ˛ŅŅ– ĐēĐ°Ņ€Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "Ви ĐŧĐ°Ņ”Ņ‚Đĩ ĐŋŅ€Đ¸ĐšĐŊŅŅ‚Đ¸ ĐŖĐŧОви ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰ĐžĐą ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ С IQ.Pilot." + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "" +"Ви ĐŧĐ°Ņ”Ņ‚Đĩ ĐŋŅ€Đ¸ĐšĐŊŅŅ‚Đ¸ ĐŖĐŧОви ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ, Ņ‰ĐžĐą ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ С IQ.Pilot. ПĐĩŅ€ĐĩĐ´ " +"ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐĩĐŊĐŊŅĐŧ ОСĐŊаКОĐŧŅ‚ĐĩŅŅ С ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đŧи ҃ĐŧОваĐŧи ĐŊа https://iqlvbs.com/tos." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "" +"ĐŸŅ–ŅĐģŅ Ņ†ŅŒĐžĐŗĐž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ вĐģĐ°ŅĐŊиĐŧ ĐŋŅ€ĐžŅ„Ņ–ĐģĐĩĐŧ eSIM. Ви ĐŊĐĩ СĐŧĐžĐļĐĩŅ‚Đĩ " +"СĐŊĐžĐ˛Ņƒ ҁĐēĐžŅ€Đ¸ŅŅ‚Đ°Ņ‚Đ¸ŅŅ Comma Prime, ŅĐēŅ‰Đž ĐŊĐĩ ĐŋŅ€Đ¸Đ´ĐąĐ°Ņ”Ņ‚Đĩ ĐŊĐžĐ˛Ņƒ SIM-ĐēĐ°Ņ€Ņ‚Đē҃ Đ˛Ņ–Đ´ comma." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "аĐēŅ‚Đ¸Đ˛ŅƒĐ˛Đ°Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "аĐēŅ‚Đ¸Đ˛ĐŊиК" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "аĐēŅ‚Đ¸Đ˛ĐŊа ĐŧОдĐĩĐģҌ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģҌ eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģҌ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "Đ°ĐŗŅ€ĐĩŅĐ¸Đ˛ĐŊиК" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "Đ°Đ˛Ņ‚Đž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "Đ°Đ˛Ņ‚Đž Ņ‚ĐĩĐŧĐŊиК" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊŅ–\n" +"ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "ĐŊаСад" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "ĐŗŅ–ĐģĐēа" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēа ĐŋŅ€Đ¸Ņ‚ĐĩĐŧĐŊĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "ĐžĐąŅ‡Đ¸ŅĐģĐĩĐŊĐŊŅ ĐŧиĐģҌ..." + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "СаĐŋ҃ҁĐē ĐēаĐŧĐĩŅ€Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "ĐŧĐžĐąŅ–ĐģҌĐŊа С ĐģŅ–ĐŧŅ–Ņ‚ĐžĐŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"СĐŧŅ–ĐŊĐ¸Ņ‚Đ¸\n" +"ĐŧĐžĐ˛Ņƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅŅŽ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "ĐēĐžĐŧĐąŅ–ĐŊОваĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "ĐžĐąâ€™Ņ”Đ´ĐŊаĐŊа ĐŧОдĐĩĐģҌ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "ĐŊаĐģĐ°ŅˆŅ‚ĐžĐ˛Đ°ĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "Đˇâ€™Ņ”Đ´ĐŊĐ°Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "Đˇâ€™Ņ”Đ´ĐŊаĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "Đˇâ€™Ņ”Đ´ĐŊаĐŊĐŊŅ..." + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "Ņ€ŅƒŅˆĐ°ĐŊĐŊŅ С ĐŧŅ–ŅŅ†Ņ (ĐąĐĩŅ‚Đ°)" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "ĐēŅ€ŅƒŅ—Đˇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "Ņ€ĐĩĐŗŅƒĐģŅŅ‚ĐžŅ€ ĐēŅ€Đ¸Đ˛Đ¸ĐˇĐŊи" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "Đ˛Ņ–Đ´ĐĩĐžŅ€ĐĩŅ”ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "Đ˛Ņ–Đ´Ņ…Đ¸ĐģĐ¸Ņ‚Đ¸" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "СаĐŧĐžĐ˛Ņ‡." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "видаĐģĐ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "Ņ€ĐžĐˇŅ€ĐžĐąĐŊиĐē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "ID ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"виĐŧĐēĐŊŅƒŅ‚Đ¸\n" +"ĐŋŅ€Đ¸Đŧ҃ҁ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "виĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš ĐžŅ„Ņ€ĐžŅƒĐ´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "виĐŧĐēĐŊĐĩĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "Đ˛Ņ–Đ´â€™Ņ”Đ´ĐŊаĐŊĐŊŅ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "виĐŧĐēĐŊŅƒŅ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "виĐŧиĐēĐ°Ņ‚Đ¸ ĐŋĐĩдаĐģĐģŅŽ ĐŗĐ°ĐˇŅƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "ĐĩĐēŅ€Đ°ĐŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "ŅŅĐēŅ€Đ°Đ˛Ņ–ŅŅ‚ŅŒ ĐĩĐēŅ€Đ°ĐŊа" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "вĐŊиС" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "СаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "СаваĐŊŅ‚Đ°ĐļŅƒŅŽ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"ĐŋĐĩŅ€ĐĩĐŗĐģŅĐ´ ĐēаĐŧĐĩŅ€Đ¸\n" +"Đ˛ĐžĐ´Ņ–Ņ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "ŅŅĐēŅ€Đ°Đ˛Ņ–ŅŅ‚ŅŒ ҃ Ņ€ŅƒŅŅ–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "диĐŊаĐŧҖ҇ĐŊиК" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Đ˛Ņ–Đ´ĐĩĐžŅ€ĐĩŅ”ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ Ņ€ĐžŅƒĐŧŅ–ĐŊĐŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đĩ ĐˇĐ°Đ˛ĐžĐ´ŅŅŒĐēĐĩ ĐŋОСдОвĐļĐŊŅ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "ввĐĩĐ´Ņ–Ņ‚ŅŒ APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "ввĐĩĐ´Ņ–Ņ‚ŅŒ Ņ–Đŧâ€™Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° GitHub..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "ввĐĩĐ´Ņ–Ņ‚ŅŒ ĐēОд аĐēŅ‚Đ¸Đ˛Đ°Ņ†Ņ–Ņ— LPA..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "ввĐĩĐ´Ņ–Ņ‚ŅŒ ĐēОд" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "ввĐĩĐ´Ņ–Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ..." + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "ĐŊĐĩ вдаĐģĐžŅŅ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Ņ‚Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "ĐŊĐĩ вдаĐģĐžŅŅ ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "ŅˆĐ˛Đ¸Đ´ĐēĐž" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "СавĐĩŅ€ŅˆŅƒŅŽ..." + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "Đ´ĐģŅ \"{}\"" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "Đ´ĐģŅ ĐžĐŊОвĐģĐĩĐŊҌ Ņ–Đˇ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐ¸Ņ… ĐŗŅ–ĐģĐžĐē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"ĐžŅ„Ņ€ĐžŅƒĐ´\n" +"ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš Ņ–ĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ mici" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "ĐŋŅ€Đ¸ĐŧŅƒŅĐžĐ˛Đ¸Đš ĐžŅ„Ņ€ĐžŅƒĐ´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "ĐˇĐ°ĐąŅƒĐ˛Đ°ĐŊĐŊŅ..." + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "Ņ„ĐžŅ€ĐŧĐ°Ņ‚: LPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "С ĐēĐĩ҈҃" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "ĐŗĐžĐ´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "ĐŋОСдОвĐļĐŊŅ” ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ hyundai" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "Ņ–ĐŊŅ„Đž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "Ņ–ĐŊŅ‚ĐĩŅ€Đ°ĐēŅ‚Đ¸Đ˛ĐŊŅ–ŅŅ‚ŅŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ iq.dynamic" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "ĐēĐŧ/ĐŗĐžĐ´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "СĐŧŅ–ĐŊа ҁĐŧŅƒĐŗĐ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ ĐŋŅ€Đž Đ˛Đ¸Ņ—ĐˇĐ´ ĐˇŅ– ҁĐŧŅƒĐŗĐ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "Ņ€ĐĩĐļиĐŧ ĐąŅ–Ņ‡ĐŊĐ¸Ņ… ĐŧаĐŊĐĩĐ˛Ņ€Ņ–Đ˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "ĐąŅ–Ņ‡ĐŊĐĩ ĐŋŅ€Đ¸ ĐŊĐĩҁĐŋŅ€Đ°Đ˛ĐŊĐžŅŅ‚Ņ– ĐēŅ€ŅƒŅ—ĐˇŅƒ" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "СаĐģĐ¸ŅˆŅ‚Đĩ ĐŋĐžŅ€ĐžĐļĐŊŅ–Đŧ Đ´ĐģŅ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐžĐŗĐž ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "СаĐģĐ¸ŅˆŅ‚Đĩ ĐŋĐžŅ€ĐžĐļĐŊŅ–Đŧ, Ņ‰ĐžĐą ĐŋŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "СаĐģĐ¸ŅˆŅ‚Đĩ Ņ–Đŧâ€™Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° Đš Ņ‚ĐžĐēĐĩĐŊ ĐŋĐžŅ€ĐžĐļĐŊŅ–Đŧи, Ņ‰ĐžĐą ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "вĐģŅ–Đ˛Đž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "Ņ€ĐĩĐļиĐŧ ĐŋОСдОвĐļĐŊŅ–Ņ… ĐŧаĐŊĐĩĐ˛Ņ€Ņ–Đ˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "ĐŋĐģаĐŊŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Ņ–Đ˛ ĐŊа ĐŊĐ¸ĐˇŅŒĐēŅ–Đš ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "Ņ…Đ˛" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "ĐēĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģŅĐŧи" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "Đ˛Ņ€ŅƒŅ‡ĐŊ҃" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "Ņ€ŅƒŅ‡ĐŊĐĩ СĐŧҖ҉ĐĩĐŊĐŊŅ ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēи" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "ĐģĐ¸ŅˆĐĩ ĐēĐ°Ņ€Ņ‚Đ°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "ĐŋŅ€Ņ–ĐžŅ€Đ¸Ņ‚ĐĩŅ‚ ĐēĐ°Ņ€Ņ‚Đ¸" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "ОйĐŧĐĩĐļ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "ĐŧОдĐĩĐģŅ–" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "ĐŧиĐģҌ/ĐŗĐžĐ´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "ĐŧĐĩŅ€ĐĩĐļа" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ ĐŧĐĩŅ€ĐĩĐļŅ–" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "ĐŊŅ–ĐēĐžĐģи" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "ĐŊŅ–" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "ĐŊĐĩĐŧĐ°Ņ” ҁĐŋĐžĐ˛Ņ–Ņ‰ĐĩĐŊҌ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "ĐąĐĩС ĐŋĐžŅˆŅ‚ĐžĐ˛Ņ…Ņƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "ĐˇĐ˛Đ¸Ņ‡Đ°ĐšĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "ĐŋОСа СОĐŊĐžŅŽ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "ĐˇĐ°Ņ€Đ°Đˇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "ĐŋĐžŅˆŅ‚ĐžĐ˛Ņ… ĐēĐĩŅ€Đŧа" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "виĐŧĐē." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "ĐžŅ„ĐģаКĐŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "ŅƒĐ˛Ņ–ĐŧĐē." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "ĐžĐŊĐģаКĐŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "ĐŊаСва (ĐŊĐĩĐžĐąĐžĐ˛â€™ŅĐˇĐēОвО)..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "Đˇâ€™Ņ”Đ´ĐŊĐ°Ņ‚Đ¸ в ĐˇĐ°ŅŅ‚ĐžŅŅƒĐŊĐē҃" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "Đˇâ€™Ņ”Đ´ĐŊĐ°Ņ‚Đ¸ С Konn3kt" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "Đ˛Đ°ĐŗĐ¸ ĐŋĐžĐģŅ–Ņ‚Đ¸Đēи" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "виĐŧĐēĐŊŅƒŅ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "ĐŋŅ€ĐžĐŗĐŊОСĐŊиК" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "Đ´Ņ–Ņ— С ĐŋŅ€ĐžŅ„Ņ–ĐģĐĩĐŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "ĐžĐŋĐĩŅ€Đ°Ņ‚ĐžŅ€ ĐŊĐĩĐ˛Ņ–Đ´ĐžĐŧиК" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐĩ҈ ĐŧОдĐĩĐģĐĩĐš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "҃ ҇ĐĩŅ€ĐˇŅ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "ĐŗĐžŅ‚ĐžĐ˛Đž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅŅ‚Đ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "СаĐŋĐ¸ŅŅƒĐ˛Đ°Ņ‚Đ¸ ĐēаĐŧĐĩŅ€Ņƒ Đ˛ĐžĐ´Ņ–Ņ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "СаĐŋĐ¸ŅŅƒĐ˛Đ°Ņ‚Đ¸ ĐŧŅ–ĐēŅ€ĐžŅ„ĐžĐŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "СаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ ĐŧОдĐĩĐģҌ СĐŊĐžĐ˛Ņƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģŅ–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "ĐŊĐžŅ€ĐŧĐ°Ņ‚Đ¸Đ˛ĐŊа Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "ҁĐŋĐžĐēŅ–ĐšĐŊиК" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "ĐžĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ҁĐŋĐ¸ŅĐžĐē ĐŧОдĐĩĐģĐĩĐš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "видаĐģĐ¸Ņ‚Đ¸ pSIM comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "ĐŋĐĩŅ€ĐĩĐšĐŧĐĩĐŊŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋŅ€ĐžŅ„Ņ–ĐģҌ..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "ҁĐēиĐŊŅƒŅ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "ҁĐēиĐŊŅƒŅ‚Đ¸ ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"ĐŋĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚Đ¸\n" +"ĐŋĐžŅŅ–ĐąĐŊиĐē" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "вĐŋŅ€Đ°Đ˛Đž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "ҁ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "ҁĐēаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ QR" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "ҁĐēаĐŊŅƒĐ˛Đ°Ņ‚Đ¸ QR / ввĐĩŅŅ‚Đ¸ ĐēОд" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "ĐŋĐžŅˆŅƒĐē ĐŧĐĩŅ€ĐĩĐļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "ŅĐ°ĐŧĐžĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐˇĐ°Ņ‚Ņ€Đ¸ĐŧĐēи" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "ҁĐĩŅ€Ņ–ĐšĐŊиК ĐŊĐžĐŧĐĩŅ€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "СадаĐŊа ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "ОдиĐŊĐ¸Ņ†Ņ– Са Ņ€ĐžĐˇŅ‚Đ°ŅˆŅƒĐ˛Đ°ĐŊĐŊŅĐŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"ĐŋŅ€ĐžĐ˛ĐĩĐ´Ņ–Ņ‚ŅŒ, Ņ‰ĐžĐą\n" +"ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚Đ¸ ĐēĐĩ҈" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"ĐŋŅ€ĐžĐ˛ĐĩĐ´Ņ–Ņ‚ŅŒ, Ņ‰ĐžĐą\n" +"Đ˛Ņ–Đ´â€™Ņ”Đ´ĐŊĐ°Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"ĐŋŅ€ĐžĐ˛ĐĩĐ´Ņ–Ņ‚ŅŒ, Ņ‰ĐžĐą\n" +"ĐˇĐ°ĐąŅƒŅ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"ĐŋŅ€ĐžĐ˛ĐĩĐ´Ņ–Ņ‚ŅŒ, Ņ‰ĐžĐą\n" +"СаваĐŊŅ‚Đ°ĐļĐ¸Ņ‚Đ¸ СĐŊĐžĐ˛Ņƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"ĐŋŅ€ĐžĐ˛ĐĩĐ´Ņ–Ņ‚ŅŒ, Ņ‰ĐžĐą\n" +"ҁĐēиĐŊŅƒŅ‚Đ¸ ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"ĐŋŅ€ĐžĐ˛ĐĩĐ´Ņ–Ņ‚ŅŒ, Ņ‰ĐžĐą\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"ĐŋŅ€ĐžĐ˛ĐĩĐ´Ņ–Ņ‚ŅŒ, Ņ‰ĐžĐą видаĐģĐ¸Ņ‚Đ¸\n" +"pSIM comma" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "ĐŋĐžĐ˛Ņ–ĐģҌĐŊĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "ĐŋĐģавĐŊĐĩ ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŊĐĩ СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ОйĐŧĐĩĐļĐĩĐŊҌ ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚Ņ–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"СаĐŋŅƒŅŅ‚Ņ–Ņ‚ŅŒ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ, Ņ‰ĐžĐą\n" +"ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "СаĐŋ҃ҁĐē..." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "ŅŅ‚Đ°Ņ‚ŅƒŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "ĐģĐ¸ŅˆĐ°Ņ‚Đ¸ŅŅ аĐēŅ‚Đ¸Đ˛ĐŊиĐŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "ĐēĐĩŅ€ĐŧŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "ĐŋОвĐĩĐ´Ņ–ĐŊĐēа ĐēĐĩŅ€ĐŧĐžĐ˛ĐžŅ— Đ´ĐžĐŋĐžĐŧĐžĐŗĐ¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "ĐˇĐ°Đ˛ĐžĐ´ŅŅŒĐēиК" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "stop-and-go Ņ€ŅƒŅ‡ĐŊĐĩ ĐŗĐ°ĐģҌĐŧĐž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "ĐˇŅƒĐŋиĐŊĐ¸Ņ‚Đ¸ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "СаĐŋ҃ҁĐē ŅĐ¸ŅŅ‚ĐĩĐŧи" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "҆ҖĐģŅŒĐžĐ˛Đ° ĐŗŅ–ĐģĐēа" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"҃ĐŧОви\n" +"ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "Ņ‚ĐžŅ‡Đēа Đ´ĐžŅŅ‚ŅƒĐŋ҃" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "ĐŋĐ°Ņ€ĐžĐģҌ Ņ‚ĐžŅ‡Đēи Đ´ĐžŅŅ‚ŅƒĐŋ҃" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "ĐŋĐĩŅ€ĐĩĐŧиĐēĐ°Ņ‡Ņ–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "ĐŋĐžŅ—ĐˇĐ´Đēи" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "видаĐģĐ¸Ņ‚Đ¸" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "видаĐģĐ¸Ņ‚Đ¸ IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "ĐŊĐĩОйĐŧĐĩĐļ." + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ”Ņ‚ŅŒŅŅ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "Đ˛ĐŗĐžŅ€Ņƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "аĐēŅ‚ŅƒĐ°ĐģҌĐŊĐž" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "ĐžĐŊОвĐģĐĩĐŊĐž, ĐŊŅ–ĐēĐžĐģи ĐŊĐĩ ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€ŅĐģĐžŅŅŒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "ĐžĐŊОвĐģĐĩĐŊĐž, ĐŋĐĩŅ€ĐĩĐ˛Ņ–Ņ€Đ¸Đ˛ {}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"Ņ€ĐĩĐļиĐŧ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ\n" +"ĐžĐŊОвĐģĐĩĐŊҌ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐĩ ĐžĐŊОвĐģĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"ĐžĐŊОвĐģŅŽĐ˛Đ°Ņ‡ ĐŊĐĩ\n" +"Đ˛Ņ–Đ´ĐŋĐžĐ˛Ņ–Đ´Đ°Ņ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "ĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐŊŅ– ОдиĐŊĐ¸Ņ†Ņ–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "вĐĩŅ€ŅŅ–Ņ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "Đ˛Ņ–Ņ€Ņ‚ŅƒĐ°ĐģҌĐŊĐĩ СĐŧŅ–ŅˆŅƒĐ˛Đ°ĐŊĐŊŅ ĐŧĐžĐŧĐĩĐŊŅ‚Ņƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "Đ˛Đ°ĐŗĐ¸ ĐˇĐžŅ€Ņƒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "Đ˛Đ¸ĐŗĐģŅĐ´" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "ĐŋĐžĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "ĐŊĐĩĐ˛Ņ–Ņ€ĐŊиК ĐŋĐ°Ņ€ĐžĐģҌ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "Ņ‚Đ°Đē" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} ĐĄĐŸĐžĐ’Đ†ĐŠĐ•ĐĐĐ¯" +msgstr[1] "{} ĐĄĐŸĐžĐ’Đ†ĐŠĐ•ĐĐĐ¯" +msgstr[2] "{} СПОВІЩЕНĐŦ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{} Đ´ĐĩĐŊҌ Ņ‚ĐžĐŧ҃" +msgstr[1] "{} Đ´ĐŊŅ– Ņ‚ĐžĐŧ҃" +msgstr[2] "{} Đ´ĐŊŅ–Đ˛ Ņ‚ĐžĐŧ҃" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{} ĐŗĐžĐ´Đ¸ĐŊа Ņ‚ĐžĐŧ҃" +msgstr[1] "{} ĐŗĐžĐ´Đ¸ĐŊи Ņ‚ĐžĐŧ҃" +msgstr[2] "{} ĐŗĐžĐ´Đ¸ĐŊ Ņ‚ĐžĐŧ҃" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{} Ņ…Đ˛Đ¸ĐģиĐŊа Ņ‚ĐžĐŧ҃" +msgstr[1] "{} Ņ…Đ˛Đ¸ĐģиĐŊи Ņ‚ĐžĐŧ҃" +msgstr[2] "{} Ņ…Đ˛Đ¸ĐģиĐŊ Ņ‚ĐžĐŧ҃" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 ҀҖĐē СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ĐŋĐžŅ—ĐˇĐ´ĐžĐē" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "ĐŸŅ–Đ´ĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ LTE 24/7" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "ĐŸĐžĐŸĐ•Đ Đ•Đ”Đ–Đ•ĐĐĐ¯: ĐŋОСдОвĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ openpilot Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ СĐŊĐ°Ņ…ĐžĐ´Đ¸Ņ‚ŅŒŅŅ" +#~ " в ŅŅ‚Đ°Đ´Ņ–Ņ— аĐģŅŒŅ„Đ°-Ņ‚ĐĩŅŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ Ņ– виĐŧĐēĐŊĐĩ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐĩ ĐĩĐēҁ҂ҀĐĩĐŊĐĩ ĐŗĐ°ĐģҌĐŧŅƒĐ˛Đ°ĐŊĐŊŅ (AEB)." + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB (Android Debug Bridge) дОСвОĐģŅŅ” ĐŋŅ–Đ´ĐēĐģŅŽŅ‡Đ°Ņ‚Đ¸ŅŅ Đ´Đž Đ˛Đ°ŅˆĐžĐŗĐž ĐŋŅ€Đ¸ŅŅ‚Ņ€ĐžŅŽ ҇ĐĩŅ€ĐĩС " +#~ "USB айО ĐŧĐĩŅ€ĐĩĐļ҃. Đ”Đ¸Đ˛Ņ–Ņ‚ŅŒŅŅ https://docs.comma.ai/how-to/connect-to-comma Đ´ĐģŅ " +#~ "ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ—." + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "ĐŸĐžŅŅ‚Ņ–ĐšĐŊиК ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗ Đ˛ĐžĐ´Ņ–Ņ" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "" +#~ "АĐģŅŒŅ„Đ°-вĐĩŅ€ŅŅ–ŅŽ ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ openpilot ĐŧĐžĐļĐŊа ĐŋŅ€ĐžŅ‚ĐĩŅŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ Ņ€Đ°ĐˇĐžĐŧ С " +#~ "ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊиĐŧ Ņ€ĐĩĐļиĐŧĐžĐŧ ĐŊа ĐŊĐĩŅ€ĐĩĐģŅ–ĐˇĐŊĐ¸Ņ… ĐŗŅ–ĐģĐēĐ°Ņ…." + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "" +#~ "Đ”ĐžĐ´Đ°ĐšŅ‚Đĩ konn3kt.com Đ´Đž ĐŗĐžĐģОвĐŊĐžĐŗĐž ĐĩĐēŅ€Đ°ĐŊ҃, Ņ‰ĐžĐą виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž ŅĐē " +#~ "Đ´ĐžĐ´Đ°Ņ‚ĐžĐē." + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "СПОКІЙНИЙ РЕЖИМ" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "ЗĐŧŅ–ĐŊа Ņ†ŅŒĐžĐŗĐž ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° ĐŋŅ€Đ¸ĐˇĐ˛ĐĩĐ´Đĩ Đ´Đž ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ openpilot, ŅĐēŅ‰Đž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ " +#~ "ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž." + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "ĐĐ°Ņ‚Đ¸ŅĐŊŅ–Ņ‚ŅŒ ÂĢĐ´ĐžĐ´Đ°Ņ‚Đ¸ ĐŊОвиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–ĐšÂģ Ņ– Đ˛Ņ–Đ´ŅĐēаĐŊŅƒĐšŅ‚Đĩ QR-ĐēОд ĐŋŅ€Đ°Đ˛ĐžŅ€ŅƒŅ‡." + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "Đ’Ņ–Đ´Ņ…Đ¸ĐģĐ¸Ņ‚Đ¸, видаĐģĐ¸Ņ‚Đ¸ openpilot" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "ЕКСПЕРИМЕНĐĸ. РЕЖИМ" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ ĐŧĐžĐŊŅ–Ņ‚ĐžŅ€Đ¸ĐŊĐŗ Đ˛ĐžĐ´Ņ–Ņ, ĐŊĐ°Đ˛Ņ–Ņ‚ŅŒ ĐēĐžĐģи openpilot ĐŊĐĩ Đ˛Đ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž." + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ openpilot" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "" +#~ "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅ–Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐŧиĐēĐ°Ņ‡ ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ openpilot (аĐģŅŒŅ„Đ°), Ņ‰ĐžĐą ŅƒĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸ " +#~ "ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊиК Ņ€ĐĩĐļиĐŧ." + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "ЕĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊиК Ņ€ĐĩĐļиĐŧ" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "" +#~ "ЕĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊиК Ņ€ĐĩĐļиĐŧ ĐŊĐ°Ņ€Đ°ĐˇŅ– ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиК Đ´ĐģŅ Ņ†ŅŒĐžĐŗĐž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ, ĐžŅĐēŅ–ĐģҌĐēи " +#~ "Đ´ĐģŅ ĐŋОСдОвĐļĐŊŅŒĐžĐŗĐž ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ ŅˆŅ‚Đ°Ņ‚ĐŊиК адаĐŋŅ‚Đ¸Đ˛ĐŊиК ĐēŅ€ŅƒŅ—Đˇ-" +#~ "ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌ (ACC)." + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "XАРАКĐĸЕРИСĐĸИКИ PRIME:" + +#~ msgid "Firehose" +#~ msgstr "ЗĐģива" + +#~ msgid "Firehose Mode" +#~ msgstr "Đ ĐĩĐļиĐŧ СĐģиви" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "ДĐģŅ ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐžŅ— ĐĩŅ„ĐĩĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚Ņ– Ņ‰ĐžŅ‚Đ¸ĐļĐŊŅ СаĐŊĐžŅŅŒŅ‚Đĩ ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ҃ ĐŋŅ€Đ¸ĐŧҖ҉ĐĩĐŊĐŊŅ Ņ‚Đ° ĐŋŅ–Đ´ĐēĐģŅŽŅ‡Đ°ĐšŅ‚Đĩ ĐšĐžĐŗĐž Đ´Đž ŅĐēҖҁĐŊĐžĐŗĐž адаĐŋŅ‚ĐĩŅ€Đ° USB-C Ņ– Wi-Fi.\n" +#~ "\n" +#~ "Đ ĐĩĐļиĐŧ ЗĐģиви Ņ‚Đ°ĐēĐžĐļ ĐŧĐžĐļĐĩ ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚Đ¸ ĐŋŅ–Đ´ Ņ‡Đ°Ņ Ņ€ŅƒŅ…Ņƒ, ŅĐēŅ‰Đž ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐŋŅ–Đ´ĐēĐģŅŽŅ‡ĐĩĐŊĐž Đ´Đž Ņ‚ĐžŅ‡Đēи Đ´ĐžŅŅ‚ŅƒĐŋ҃ айО SIM-ĐēĐ°Ņ€Ņ‚Đēи С ĐŊĐĩОйĐŧĐĩĐļĐĩĐŊиĐŧ Ņ‚Ņ€Đ°Ņ„Ņ–ĐēĐžĐŧ.\n" +#~ "\n" +#~ "\n" +#~ "ĐŸĐžŅˆĐ¸Ņ€ĐĩĐŊŅ– СаĐŋĐ¸Ņ‚Đ°ĐŊĐŊŅ\n" +#~ "\n" +#~ "Чи ĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ŅĐē Ņ– Đ´Đĩ Ņ Ņ—Đ´Ņƒ? ĐŅ–, ĐŋŅ€ĐžŅŅ‚Đž Ņ—Đ´ŅŒŅ‚Đĩ, ŅĐē ĐˇĐ°ĐˇĐ˛Đ¸Ņ‡Đ°Đš.\n" +#~ "\n" +#~ "Чи Đ˛ŅŅ– ĐŧĐžŅ— ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ¸ ĐŋĐžŅ‚Ņ€Đ°ĐŋĐģŅŅŽŅ‚ŅŒ ҃ Ņ€ĐĩĐļиĐŧ ЗĐģиви? ĐŅ–, Đŧи Đ˛Đ¸ĐąŅ–Ņ€ĐēОвО Đ˛Đ¸ĐąĐ¸Ņ€Đ°Ņ”ĐŧĐž ĐŋŅ–Đ´ĐŧĐŊĐžĐļиĐŊ҃ Đ˛Đ°ŅˆĐ¸Ņ… ҁĐĩĐŗĐŧĐĩĐŊŅ‚Ņ–Đ˛.\n" +#~ "\n" +#~ "ĐŠĐž Ņ‚Đ°ĐēĐĩ Ņ…ĐžŅ€ĐžŅˆĐ¸Đš адаĐŋŅ‚ĐĩŅ€ USB-C? Đ‘ŅƒĐ´ŅŒ-ŅĐēиК ŅˆĐ˛Đ¸Đ´ĐēиК ĐˇĐ°Ņ€ŅĐ´ĐŊиК ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš Đ´ĐģŅ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊ҃ айО ĐŊĐžŅƒŅ‚ĐąŅƒĐēа ĐŋŅ–Đ´Ņ–ĐšĐ´Đĩ.\n" +#~ "\n" +#~ "Чи ĐŧĐ°Ņ” СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ŅĐēĐĩ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŊĐĩ СайĐĩСĐŋĐĩ҇ĐĩĐŊĐŊŅ Ņ виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅŽ? ĐĸаĐē, Đ´ĐģŅ ĐŊĐ°Đ˛Ņ‡Đ°ĐŊĐŊŅ ĐŧĐžĐļĐŊа виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ ҂ҖĐģҌĐēи upstream openpilot (Ņ– ĐŋĐĩвĐŊŅ– ĐšĐžĐŗĐž Ņ„ĐžŅ€Đēи)." + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "ПĐĩŅ€ĐĩĐšĐ´Ņ–Ņ‚ŅŒ ĐŊа ŅĐ°ĐšŅ‚ https://konn3kt.com ĐŊа ŅĐ˛ĐžŅ”Đŧ҃ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊŅ–." + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "НЕАКĐĸИВНО: ĐŋŅ–Đ´ĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ Đ´Đž ĐŧĐĩŅ€ĐĩĐļŅ– ĐąĐĩС ĐģŅ–ĐŧŅ–Ņ‚Ņƒ Ņ‚Ņ€Đ°Ņ„Ņ–Đē҃" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "Đ ĐĩĐļиĐŧ СĐŊĐĩвадĐļĐĩĐŊĐŊŅ Đ´ĐļĐžĐšŅŅ‚Đ¸Đēа" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "" +#~ "МаĐēŅĐ¸ĐŧŅ–ĐˇŅƒĐšŅ‚Đĩ СаваĐŊŅ‚Đ°ĐļĐĩĐŊĐŊŅ ĐŊĐ°Đ˛Ņ‡Đ°ĐģҌĐŊĐ¸Ņ… даĐŊĐ¸Ņ…, Ņ‰ĐžĐą ĐŋĐžĐģŅ–ĐŋŅˆĐ¸Ņ‚Đ¸ ĐŧОдĐĩĐģŅ– openpilot." + +#~ msgid "NO" +#~ msgstr "НЕМАЄ" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "НĐĩ СĐŊаКдĐĩĐŊĐž ĐēĐģŅŽŅ‡Ņ–Đ˛ SSH" + +#, python-format +#~ msgid "Open" +#~ msgstr "ВІДКРИĐĸИ" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "" +#~ "ĐŸŅ–Đ´ĐēĐģŅŽŅ‡Ņ–Ņ‚ŅŒ ŅĐ˛Ņ–Đš ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš Đ´Đž Konn3kt (konn3kt.com) Ņ– ĐžŅ‚Ņ€Đ¸ĐŧĐ°ĐšŅ‚Đĩ ŅĐ˛ĐžŅŽ " +#~ "ĐŋŅ€ĐžĐŋĐžĐˇĐ¸Ņ†Ņ–ŅŽ Konn3kt." + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "ĐĄŅ‚Đ°ĐŊŅŒŅ‚Đĩ ҇ĐģĐĩĐŊĐžĐŧ Konn3kt ĐŊа konn3kt.com" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "Đ’Ņ–Đ´Đ´Đ°ĐģĐĩĐŊŅ– СĐŊŅ–ĐŧĐēи" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "ПĐĩŅ€ĐĩĐŗĐģŅĐŊŅŒŅ‚Đĩ ĐŋŅ€Đ°Đ˛Đ¸Đģа, Ņ„ŅƒĐŊĐē҆Җҗ Ņ‚Đ° ОйĐŧĐĩĐļĐĩĐŊĐŊŅ openpilot" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "Đ ĐĩĐēĐžĐŧĐĩĐŊĐ´ŅƒŅ”Ņ‚ŅŒŅŅ ŅŅ‚Đ°ĐŊĐ´Đ°Ņ€Ņ‚ĐŊиК Ņ€ĐĩĐļиĐŧ. В Đ°ĐŗŅ€ĐĩŅĐ¸Đ˛ĐŊĐžĐŧ҃ Ņ€ĐĩĐļиĐŧŅ– openpilot ĐąŅƒĐ´Đĩ " +#~ "Ņ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ŅŅ ĐąĐģиĐļ҇Đĩ Đ´Đž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ–Đ˛ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´Ņƒ Ņ– ĐąŅ–ĐģҌ҈ Đ°ĐŗŅ€ĐĩŅĐ¸Đ˛ĐŊĐž виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐ˛Đ°Ņ‚Đ¸ " +#~ "ĐŗĐ°Đˇ Ņ– ĐŗĐ°ĐģҌĐŧа. ĐŖ ҁĐŋĐžĐēŅ–ĐšĐŊĐžĐŧ҃ Ņ€ĐĩĐļиĐŧŅ– openpilot ĐąŅƒĐ´Đĩ Ņ‚Ņ€Đ¸ĐŧĐ°Ņ‚Đ¸ŅŅ ĐŊа ĐąŅ–ĐģŅŒŅˆŅ–Đš " +#~ "Đ˛Ņ–Đ´ŅŅ‚Đ°ĐŊŅ– Đ˛Ņ–Đ´ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ–Đ˛ ĐŋĐžĐŋĐĩŅ€ĐĩĐ´Ņƒ. На ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒĐ˛Đ°ĐŊĐ¸Ņ… Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅŅ… ви ĐŧĐžĐļĐĩŅ‚Đĩ " +#~ "ĐŋĐĩŅ€ĐĩĐŧиĐēĐ°Ņ‚Đ¸ŅŅ ĐŧŅ–Đļ Ņ†Đ¸Đŧи Ņ€ĐĩĐļиĐŧаĐŧи Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ ĐēĐŊĐžĐŋĐēи Đ´Đ¸ŅŅ‚Đ°ĐŊ҆Җҗ ĐŊа ĐēĐĩŅ€ĐŧŅ–." + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "" +#~ "ВиĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ŅĐ¸ŅŅ‚ĐĩĐŧ҃ openpilot Đ´ĐģŅ адаĐŋŅ‚Đ¸Đ˛ĐŊĐžĐŗĐž ĐēŅ€ŅƒŅ—Đˇ-ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅŽ Ņ‚Đ° Đ´ĐžĐŋĐžĐŧĐžĐŗĐ¸ " +#~ "в ŅƒŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ– ҁĐŧŅƒĐŗĐ¸ Ņ€ŅƒŅ…Ņƒ. Đ’Đ°ŅˆĐ° ŅƒĐ˛Đ°ĐŗĐ° ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊа ĐŋĐžŅŅ‚Ņ–ĐšĐŊĐž ĐŋŅ€Đ¸ виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ– ҆ҖҔҗ " +#~ "Ņ„ŅƒĐŊĐē҆Җҗ. ЗĐŧŅ–ĐŊа Ņ†ŅŒĐžĐŗĐž ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊĐ°ĐąŅƒĐ˛Đ°Ņ” Ņ‡Đ¸ĐŊĐŊĐžŅŅ‚Ņ– ĐŋҖҁĐģŅ виĐŧĐēĐŊĐĩĐŊĐŊŅ ĐļивĐģĐĩĐŊĐŊŅ " +#~ "Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģŅ." + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "ПоĐŋĐĩŅ€ĐĩĐ´ĐļĐĩĐŊĐŊŅ: ҆Đĩ ĐŊĐ°Đ´Đ°Ņ” Đ´ĐžŅŅ‚ŅƒĐŋ ĐŋĐž SSH Đ´Đž Đ˛ŅŅ–Ņ… ĐŋŅƒĐąĐģҖ҇ĐŊĐ¸Ņ… ĐēĐģŅŽŅ‡Ņ–Đ˛ ҃ Đ˛Đ°ŅˆĐ¸Ņ… " +#~ "ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅŅ… GitHub. ĐŅ–ĐēĐžĐģи ĐŊĐĩ Đ˛Đ˛ĐžĐ´ŅŒŅ‚Đĩ Ņ–Đŧ'Ņ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° GitHub, ĐžĐēҀҖĐŧ " +#~ "Đ˛Đ°ŅˆĐžĐŗĐž вĐģĐ°ŅĐŊĐžĐŗĐž. ĐĄĐŋŅ–Đ˛Ņ€ĐžĐąŅ–Ņ‚ĐŊиĐē comma НІКОЛИ ĐŊĐĩ ĐŋĐžĐŋŅ€ĐžŅĐ¸Ņ‚ŅŒ Đ˛Đ°Ņ Đ´ĐžĐ´Đ°Ņ‚Đ¸ ĐšĐžĐŗĐž Ņ–Đŧ'Ņ" +#~ " ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° GitHub." + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "Đ›Đ°ŅĐēавО ĐŋŅ€ĐžŅĐ¸ĐŧĐž Đ´Đž openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "Đ¯ĐēŅ‰Đž ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž, ĐŊĐ°Ņ‚Đ¸ŅĐēаĐŊĐŊŅ ĐŊа ĐŋĐĩдаĐģҌ аĐēҁĐĩĐģĐĩŅ€Đ°Ņ‚ĐžŅ€Đ° виĐŧĐēĐŊĐĩ openpilot." + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "Ви ĐŋОвиĐŊĐŊŅ– ĐŋŅ€Đ¸ĐšĐŊŅŅ‚Đ¸ ĐŖĐŧОви Ņ‚Đ° ĐŋĐžĐģĐžĐļĐĩĐŊĐŊŅ, Ņ‰ĐžĐą ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ openpilot." + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "" +#~ "Ви ĐŋОвиĐŊĐŊŅ– ĐŋŅ€Đ¸ĐšĐŊŅŅ‚Đ¸ ĐŖĐŧОви виĐēĐžŅ€Đ¸ŅŅ‚Đ°ĐŊĐŊŅ, Ņ‰ĐžĐą ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‚Đ¸ŅŅ openpilot. ПĐĩŅ€ĐĩĐ´ " +#~ "Ņ‚Đ¸Đŧ, ŅĐē ĐŋŅ€ĐžĐ´ĐžĐ˛ĐļĐ¸Ņ‚Đ¸, ОСĐŊаКОĐŧŅ‚ĐĩŅŅ С ĐžŅŅ‚Đ°ĐŊĐŊŅ–Đŧи ҃ĐŧОваĐŧи ĐŊа ŅĐ°ĐšŅ‚Ņ– " +#~ "https://comma.ai/terms." + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "ПоздовĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ openpilot (АĐģŅŒŅ„Đ°)" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot НĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊиК" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilot Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ ĐŋŅ€Đ°Ņ†ŅŽŅ” в Ņ€ĐĩĐļиĐŧŅ– ҁĐŋĐžĐēŅ–Đš. ЕĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊиК Ņ€ĐĩĐļиĐŧ " +#~ "ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩ Ņ„ŅƒĐŊĐē҆Җҗ аĐģŅŒŅ„Đ°-Ņ€Ņ–Đ˛ĐŊŅ, ŅĐēŅ– ҉Đĩ ĐŊĐĩ ĐŗĐžŅ‚ĐžĐ˛Ņ– Đ´ĐģŅ Ņ€ĐĩĐļиĐŧ҃ ҁĐŋĐžĐēŅ–Đš. " +#~ "ЕĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊŅ– Ņ„ŅƒĐŊĐē҆Җҗ ĐŋĐĩŅ€ĐĩĐģҖ҇ĐĩĐŊŅ– ĐŊиĐļ҇Đĩ:

    ĐšŅ–ĐŊ҆ĐĩвиК ĐŋОСдОвĐļĐŊŅ–Đš " +#~ "ĐēĐžĐŊŅ‚Ņ€ĐžĐģҌ


    ДозвоĐģŅŒŅ‚Đĩ ĐŧОдĐĩĐģŅ– Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅŽĐ˛Đ°Ņ‚Đ¸ ĐŗĐ°Đˇ Ņ– ĐŗĐ°ĐģҌĐŧа. " +#~ "openpilot ĐąŅƒĐ´Đĩ ĐēĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģĐĩĐŧ Ņ‚Đ°Đē, ŅĐē ҆Đĩ Ņ€ĐžĐąĐ¸Đ˛ йи ĐģŅŽĐ´Đ¸ĐŊа, вĐēĐģŅŽŅ‡Đ°ŅŽŅ‡Đ¸ " +#~ "ĐˇŅƒĐŋиĐŊĐē҃ ĐŊа ҇ĐĩŅ€Đ˛ĐžĐŊĐĩ ŅĐ˛Ņ–Ņ‚ĐģĐž Ņ– СĐŊаĐēи ĐˇŅƒĐŋиĐŊĐēи. ĐžŅĐēŅ–ĐģҌĐēи ĐŧОдĐĩĐģҌ Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ виСĐŊĐ°Ņ‡Đ°Ņ” " +#~ "ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ Ņ€ŅƒŅ…Ņƒ, СадаĐŊа ŅˆĐ˛Đ¸Đ´ĐēŅ–ŅŅ‚ŅŒ ĐąŅƒĐ´Đĩ Đ´Ņ–ŅŅ‚Đ¸ ĐģĐ¸ŅˆĐĩ ŅĐē вĐĩҀ҅ĐŊŅ ĐŧĐĩĐļа. ĐĻĐĩ Ņ„ŅƒĐŊĐēŅ†Ņ–Ņ " +#~ "аĐģŅŒŅ„Đ°-Ņ€Ņ–Đ˛ĐŊŅ; ҁĐģŅ–Đ´ ĐžŅ‡Ņ–ĐēŅƒĐ˛Đ°Ņ‚Đ¸ ĐŋĐžĐŧиĐģĐžĐē.

    Нова Đ˛Ņ–ĐˇŅƒĐ°ĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ " +#~ "Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ


    Đ’Ņ–ĐˇŅƒĐ°ĐģŅ–ĐˇĐ°Ņ†Ņ–Ņ Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ ĐŋĐĩŅ€ĐĩКдĐĩ ĐŊа ŅˆĐ¸Ņ€ĐžĐēĐžĐēŅƒŅ‚ĐŊ҃ ĐēаĐŧĐĩŅ€Ņƒ, " +#~ "ҁĐŋŅ€ŅĐŧОваĐŊ҃ ĐŊа Đ´ĐžŅ€ĐžĐŗŅƒ, ĐŋŅ€Đ¸ ĐŊĐ¸ĐˇŅŒĐēĐ¸Ņ… ŅˆĐ˛Đ¸Đ´ĐēĐžŅŅ‚ŅŅ…, Ņ‰ĐžĐą ĐēŅ€Đ°Ņ‰Đĩ ĐŋĐžĐēĐ°ĐˇŅƒĐ˛Đ°Ņ‚Đ¸ Đ´ĐĩŅĐēŅ– " +#~ "ĐŋĐžĐ˛ĐžŅ€ĐžŅ‚Đ¸. Đ›ĐžĐŗĐžŅ‚Đ¸Đŋ ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊĐžĐŗĐž Ņ€ĐĩĐļиĐŧ҃ Ņ‚Đ°ĐēĐžĐļ ĐąŅƒĐ´Đĩ ĐŋĐžĐēаСаĐŊиК ҃ вĐĩҀ҅ĐŊŅŒĐžĐŧ҃" +#~ " ĐŋŅ€Đ°Đ˛ĐžĐŧ҃ ĐēŅƒŅ‚Ņ–." + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "" +#~ "openpilot ĐŋĐžŅŅ‚Ņ–ĐšĐŊĐž ĐēаĐģŅ–ĐąŅ€ŅƒŅ”Ņ‚ŅŒŅŅ, ҁĐēидаĐŊĐŊŅ Ņ€Ņ–Đ´ĐēĐž ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐĩ. ĐĄĐēидаĐŊĐŊŅ " +#~ "ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩĐ´Đĩ Đ´Đž ĐŋĐĩŅ€ĐĩСаĐŋ҃ҁĐē҃ openpilot, ŅĐēŅ‰Đž Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģҌ ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž." + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilot Đ˛Ņ‡Đ¸Ņ‚ŅŒŅŅ ĐēĐĩŅ€ŅƒĐ˛Đ°Ņ‚Đ¸ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģĐĩĐŧ, ҁĐŋĐžŅŅ‚ĐĩŅ€Ņ–ĐŗĐ°ŅŽŅ‡Đ¸ Са Ņ‚Đ¸Đŧ, ŅĐē ҆Đĩ Ņ€ĐžĐąĐģŅŅ‚ŅŒ ĐģŅŽĐ´Đ¸, Ņ‚Đ°ĐēŅ– ŅĐē ви.\n" +#~ "\n" +#~ "Đ ĐĩĐļиĐŧ СĐģиви дОСвОĐģŅŅ” ĐŧаĐēŅĐ¸ĐŧаĐģҌĐŊĐž ĐˇĐąŅ–ĐģŅŒŅˆĐ¸Ņ‚Đ¸ ĐžĐąŅŅĐŗ СаваĐŊŅ‚Đ°ĐļŅƒĐ˛Đ°ĐŊĐ¸Ņ… ĐŊĐ°Đ˛Ņ‡Đ°ĐģҌĐŊĐ¸Ņ… даĐŊĐ¸Ņ…, Ņ‰ĐžĐą ĐŋĐžĐģŅ–ĐŋŅˆĐ¸Ņ‚Đ¸ ĐŧОдĐĩĐģŅ– ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ Đ°Đ˛Ņ‚ĐžĐŧĐžĐąŅ–ĐģĐĩĐŧ openpilot. Đ‘Ņ–ĐģҌ҈Đĩ даĐŊĐ¸Ņ… ОСĐŊĐ°Ņ‡Đ°Ņ” ĐąŅ–ĐģŅŒŅˆŅ– ĐŧОдĐĩĐģŅ–, а ҆Đĩ ОСĐŊĐ°Ņ‡Đ°Ņ” ĐēŅ€Đ°Ņ‰Đ¸Đš ĐĩĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊиК Ņ€ĐĩĐļиĐŧ." + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "ПоздовĐļĐŊŅ” ĐēĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ openpilot ĐŧĐžĐļĐĩ С'ŅĐ˛Đ¸Ņ‚Đ¸ŅŅ в ĐŧĐ°ĐšĐąŅƒŅ‚ĐŊŅŒĐžĐŧ҃ ĐžĐŊОвĐģĐĩĐŊĐŊŅ–." + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "" +#~ "ДĐģŅ Ņ€ĐžĐąĐžŅ‚Đ¸ openpilot ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐž, Ņ‰ĐžĐą ĐŋŅ€Đ¸ŅŅ‚Ņ€Ņ–Đš ĐąŅƒĐ˛ Đ˛ŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиК С ĐŊĐ°Ņ…Đ¸ĐģĐžĐŧ ĐŊĐĩ " +#~ "ĐąŅ–ĐģҌ҈Đĩ 4° вĐģŅ–Đ˛Đž айО вĐŋŅ€Đ°Đ˛Đž Ņ‚Đ° ĐŊĐĩ ĐąŅ–ĐģҌ҈Đĩ 5° Đ˛ĐŗĐžŅ€Ņƒ айО 9° вĐŊиС. openpilot " +#~ "ĐŋĐžŅŅ‚Ņ–ĐšĐŊĐž ĐēаĐģŅ–ĐąŅ€ŅƒŅ”Ņ‚ŅŒŅŅ, Ņ‚ĐžĐŧ҃ ҁĐēидаĐŊĐŊŅ ĐēаĐģŅ–ĐąŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐžŅ‚Ņ€Ņ–ĐąĐŊĐĩ Ņ€Ņ–Đ´ĐēĐž." + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "" +#~ "{} ҁĐĩĐŗĐŧĐĩĐŊŅ‚ Đ˛Đ°ŅˆĐžĐŗĐž Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ ĐŊа даĐŊиК ĐŧĐžĐŧĐĩĐŊŅ‚ ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒŅŅ в ҂ҀĐĩĐŊŅƒĐ˛Đ°ĐģҌĐŊĐžĐŧ҃ ĐŊĐ°ĐąĐžŅ€Ņ– " +#~ "даĐŊĐ¸Ņ…." +#~ msgstr[1] "" +#~ "{} ҁĐĩĐŗĐŧĐĩĐŊŅ‚Đ¸ Đ˛Đ°ŅˆĐžĐŗĐž Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ ĐŊа даĐŊиК ĐŧĐžĐŧĐĩĐŊŅ‚ ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒŅŅ в ҂ҀĐĩĐŊŅƒĐ˛Đ°ĐģҌĐŊĐžĐŧ҃ ĐŊĐ°ĐąĐžŅ€Ņ– " +#~ "даĐŊĐ¸Ņ…." +#~ msgstr[2] "" +#~ "{} ҁĐĩĐŗĐŧĐĩĐŊŅ‚Ņ–Đ˛ Đ˛Đ°ŅˆĐžĐŗĐž Đ˛ĐžĐ´Ņ–ĐŊĐŊŅ ĐŊа даĐŊиК ĐŧĐžĐŧĐĩĐŊŅ‚ ĐŧŅ–ŅŅ‚ŅŅ‚ŅŒŅŅ в ҂ҀĐĩĐŊŅƒĐ˛Đ°ĐģҌĐŊĐžĐŧ҃ ĐŊĐ°ĐąĐžŅ€Ņ–" +#~ " даĐŊĐ¸Ņ…." + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ ПІДПИСАНО" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸŒ§ī¸ Đ ĐĩĐļиĐŧ СĐģиви đŸŒ§ī¸" diff --git a/iqpilot/selfdrive/ui/translations/app_zh-CHS.mo b/iqpilot/selfdrive/ui/translations/app_zh-CHS.mo new file mode 100644 index 000000000..0a6bf8bcb Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_zh-CHS.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_zh-CHS.po b/iqpilot/selfdrive/ui/translations/app_zh-CHS.po new file mode 100644 index 000000000..38f837c13 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_zh-CHS.po @@ -0,0 +1,4465 @@ +# Language zh-CHS translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-22 16:32-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh-CHS\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr "īŧˆéģ˜čޤīŧ‰" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " čŊŦå‘æ‰­įŸŠå“å甿 Ąå‡†åŽŒæˆã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " čŊŦå‘æ‰­įŸŠå“å甿 Ąå‡†åˇ˛åŽŒæˆ {}%。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " æ‚¨įš„čŽžå¤‡æœå‘ {:.1f}° {} 与 {:.1f}° {}。" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    čŊŦ向åģļčŋŸæ Ąå‡†åŽŒæˆã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    čŊŦ向åģļčŋŸæ Ąå‡†åˇ˛åŽŒæˆ {}%。" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "厞吝ᔍ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "ADBīŧˆAndroid č°ƒč¯•æĄĨīŧ‰å…čŽ¸é€ščŋ‡ USB 或įŊ‘įģœčŋžæŽĨ到äŊ įš„čŽžå¤‡ã€‚" + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "æˇģ加" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "į´¯čŽĄ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "APN 莞įŊŽ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "čŽ¤č¯" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "č‡Ē动" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "加速åēĻæĄ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "加速åēĻæĄ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "įĄŽčŽ¤čŋ‡åēĻäŊœåЍ" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "æŋ€æ´ģ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "åŊ“å‰æ¨Ąåž‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "äģ…在é̘äēŽ {} æ—ļå¯į”¨ã€‚" + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "æˇģ加配įŊŽæ–‡äģļ" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "æˇģ加 eSIM 配įŊŽæ–‡äģļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "č°ƒæ•´čŊĻ道čŊŦåŧ¯æ„å›žé€ŸåēĻ" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "é̘įē§" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"此后äŊ åŋ…éĄģäŊŋᔍč‡Ēåˇąįš„ eSIM 配įŊŽæ–‡äģļ。\n" +"\n" +"除非äģŽ comma č´­äš°æ–°įš„ SIM åĄīŧŒåĻåˆ™æ— æŗ•å†æŦĄäŊŋᔍ Comma Prime。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "æŋ€čŋ›" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "同意" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "全部" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "æ‰€æœ‰åˇžīŧˆįēĻ 6.0 GBīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "å…čŽ¸ IQ.Pilot 在支持“åģļé•ŋéŠģ停且无č‡Ē动čĩˇæ­Ĩ”FtS įš„å¤§äŧ— MQB čŊĻ辆上äŊŋᔍ MQB ACC æĸå¤čĄŒä¸ē。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "å…čŽ¸æ¨Ē向控åˆļīŧˆčŊŦ向īŧ‰åœ¨å› åˇĄčˆĒįŗģį쟿•…éšœå¯ŧ致įēĩ向控åˆļīŧˆæ˛šé—¨/刚čŊĻīŧ‰æš‚æ—ļä¸å¯į”¨æ—ļįģ§įģ­äŋæŒå¯į”¨ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "æ¨Ē向控åˆļ常åŧ€ (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "äģĨ及更多功čƒŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "įĢ‹åŗį”Ÿæ•ˆã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "å°†åœ¨čŽžå¤‡ä¸‹æŦĄčŋ›å…ĨéŠģčŊĻæ—ļį”Ÿæ•ˆã€‚" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "įĄŽåŽščρ兺æœē吗īŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "įĄŽåŽščĻé‡å¯å—īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "įĄŽåŽščρ将 IQ.Pilot įš„æ‰€æœ‰čŽžįŊŽæĸ复ä¸ēéģ˜čޤå€ŧ吗īŧŸčŽžįŊŽä¸€įģé‡įŊŽäžŋæ— æŗ•æĸ复。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "įĄŽåŽščĻé‡įŊŽæ Ąå‡†å—īŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "įĄŽåŽščĻå¸čŊŊ吗īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "č‡Ē动" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "č‡Ē动变道" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "č‡Ē动变道īŧščŋžįģ­å˜é“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "č‡Ē动 — 变暗" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "č‡ĒåŠ¨å…ŗé—­čŽžįŊŽ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "åœ¨é€‚į”¨č¯Ĩ Beta åŽžįŽ°įš„æ–¯åˇ´é˛åšŗå°ä¸ŠīŧŒčˇŸčŊĻ停æ­ĸ后č‡Ē动重新čĩˇæ­Ĩ。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "åˇĄčˆĒįŠļ态切æĸæ—ļįš„å¯į”¨æ€§" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "čŋ”回" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "ᛞåŒē提醒" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "ᛞåŒēč­Ļ告" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "čŊŦå‘į¯æŒ‡į¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "į”ąčŊŦ向ၝč§Ļå‘įš„å˜é“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "启动后įŠļ态" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "åˆļ动响å甿¨Ąåŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "æĸ复įģå…¸į•Œéĸįš„åŽŊį‰ˆéŠģčŊĻįŠļæ€æĄīŧšæ¸ŠåēĻ、čŊĻčž†å’Œ Konn3kt įŠļæ€ä¸€į›Žäē†į„ļ。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "更攚" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "æŖ€æŸĨ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "清除" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "čŋžæŽĨ" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "čŋžæŽĨ中..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "取æļˆ" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "取æļˆå¯ŧčˆĒ" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "蜂įĒčŽĄé‡" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "æ›´æ”šč¯­č¨€" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "č‹ĨčŊĻ辆通į”ĩīŧŒæ›´æ”šæ­¤čŽžįŊŽå°†é‡å¯ IQ.Pilot。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "åˇ˛æŖ€æŸĨ {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "é€‰æ‹Šæ¨Ąåž‹" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"选拊įēĩ向控åˆļ行ä¸ēīŧšIQ.PilotīŧˆIQ įēĩ向控åˆļ + į̝到į̝īŧ‰ã€IQ.DynamicīŧˆIQ įēĩ向控åˆļ + åŠ¨æ€æ¨Ąåŧīŧ‰ã€IQ.ChillīŧˆIQ " +"įēĩ向控åˆļ + 舒įŧ“éŖŽæ ŧīŧ‰æˆ–原厂 ACC。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "手动选拊" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "清除įŧ“å­˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "æ¸…é™¤æ‰€é€‰æ¨Ąåž‹įš„įŧ“å­˜åšļ重新下čŊŊīŧŸ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "å…ŗé—­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "在 MEB 和 MQB Evo čŊĻåž‹ä¸Šé—­įŽ¯æŽ§åˆļčŊŦ向。IQ.Pilot äŧšæ šæŽčŊĻčž†åŽžé™…äŋæŒįš„æ›˛įއäŋŽæ­ŖčŊŦ向指äģ¤īŧŒč€Œä¸æ˜¯į›´æŽĨä¸‹å‘č§„åˆ’įš„æ›˛įŽ‡ã€‚" + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "äē‘į̝" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "äģ…äē‘į̝" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "äē‘į̝视éĸ‘ä¸å¯į”¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "指įēšįŠļ态éĸœč‰˛č¯´æ˜Žīŧš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "合åšļæ¨Ąåž‹" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "æ‰§čĄŒä¸€æŽĩéĸ„čŽžįš„åŠ é€Ÿæ­Ĩčŋ›åēåˆ—īŧŒäģĨæĩ‹é‡įēĩå‘æ‰§čĄŒå™¨įš„å“åē”。需čρ吝ᔍ IQ.Pilot įēĩ向控åˆļ。äģ…可在įŠēæ—ˇįš„å°é—­é“čˇ¯ä¸ŠäŊŋį”¨ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "æ‰§čĄŒä¸€æŽĩéĸ„čŽžįš„æ¨Ē向加速æ­Ĩčŋ›åēåˆ—īŧŒäģĨæĩ‹é‡čŊŦå‘æ‰§čĄŒå™¨įš„å“åē”。äģ…å¯åœ¨åšŗį›´įŠēæ—ˇįš„é“čˇ¯ä¸ŠäŊŋį”¨ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "įĄŽčŽ¤" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "įģ§įģ­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "čŋžįģ­å˜é“" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "控åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "控åˆļ IQ.Pilot å¯šé™é€Ÿįš„å¤„į†æ–šåŧã€‚å…ŗé—­äŧšåœį”¨é™é€ŸåŠŸčƒŊīŧŒäŋĄæ¯äģ…æ˜žį¤ē限速īŧŒč­Ļ告äŧšįǁå‡ē昞į¤ēčļ…速īŧŒæŽ§åˆļåˆ™æ šæŽæŖ€æĩ‹åˆ°įš„é™é€Ÿč°ƒæ•´čŽžåŽščŊĻ速。" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "æ— æŗ•čŽˇå– SSH 密é’Ĩ - 蝎æŸĨįœ‹æ—Ĩåŋ—" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "æ— æŗ•åŽšäŊč¯Ĩåœ°į‚š" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "æ— æŗ•čŋžæŽĨ GitHub - č¯ˇæŖ€æŸĨįŊ‘įģœčŋžæŽĨ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "æ— æŗ•énj蝁 GitHub - č¯ˇæŖ€æŸĨčŽžå¤‡æ—ļ间" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "å›ŊåŽļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "å´Šæēƒæ—Ĩåŋ—" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "静æ­ĸčĩˇæ­Ĩ蠕行īŧˆBetaīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "静æ­ĸčĩˇæ­Ĩ蠕行 — 手动手刚īŧˆBetaīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "åˇĄčˆĒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "åŊ“å‰į‰ˆæœŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "æ›˛įŽ‡æŽ§åˆļ器" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "删除" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "æ­Ŗåœ¨æ–­åŧ€čŋžæŽĨâ€Ļ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "下čŊŊ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "拒įģ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "拒įģåšļ卸čŊŊ IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "éģ˜čޤ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "éģ˜čޤīŧˆCD210īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "éģ˜čޤīŧšå¯åŠ¨åŽåŗå¯éŠžéŠļīŧŒéšæ—ļ可äģĨæŽĨįŽĄã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "į”ąčŊŦ向ၝč§Ļå‘įš„å˜é“č‡Ē行åŧ€å§‹å‰įš„åģļčŋŸâ€”—莞įŊŽåģļčŋŸåŽæ— éœ€čŊģæŽ¨æ–šå‘į›˜īŧˆéģ˜čޤä¸ēčŊģæŽ¨æ–šå‘į›˜īŧ‰ã€‚
    äģ…在čŊĻæĩå’Œčˇ¯å†ĩįĄŽåŽžå…čŽ¸č¯Ĩ动äŊœæ—￉į”¨čŊŦ向ၝč§Ļ发。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "ᛞåŒēåģļčŋŸ" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "删除" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "åˆ é™¤åˇ˛åœį”¨įš„é…įŊŽæ–‡äģļ“{}”īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "删除此æ—Ĩåŋ—īŧŸ" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "åˇ˛čŽžįŊŽį›Žįš„地" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "č‡ĒåŠ¨č¯†åˆĢ" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "åŧ€å‘者" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "čŽžå¤‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "čŽžå¤‡åŋ…éĄģ厞圍 Konn3kt æŗ¨å†Œæ‰čƒŊ配寚。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "变暗åģļčŋŸ" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "断åŧ€čŋžæŽĨ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "退å‡ē" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "åŧēåˆļéŠģčŊĻå‰č¯ˇå…ˆå–æļˆæŽĨįŽĄ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "åŧēåˆļ行čŊĻå‰č¯ˇå…ˆå–æļˆæŽĨįŽĄ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "č¸Šä¸‹åŠ é€Ÿč¸æŋæ—ļ脱įĻģ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "脱įĻģäģĨå…ŗæœē" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "脱įĻģäģĨ重启" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "脱įĻģäģĨ重įŊŽæ Ąå‡†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "取æļˆæŽĨįŽĄäģĨ{}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "退å‡ēīŧšåˆļ动äŧšåŽŒå…¨å…ŗé—­čŊŦå‘čž…åŠŠã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "昞į¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "åąåš•äēŽåēĻ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "äģĨ km/h 昞į¤ē速åēĻīŧˆéž mphīŧ‰ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "距įĻģ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "是åĻ上äŧ éŠžéŠļ员摄像头数捎īŧŸ" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "厌成" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "Dongle ID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "下čŊŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "下čŊŊå¤ąč´Ĩ — č¯ˇé‡č¯•ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "æ­Ŗåœ¨ä¸‹čŊŊ地回į“Ļቇ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "æ˛ŋåˇĻäž§čžšįŧ˜įģ˜åˆļä¸€æĄæ˜žį¤ē厞æĩ‹åŠ é€Ÿä¸ŽåˆļåŠ¨įš„æĄåŊĸå›žâ€”â€”åŗčŊĻčž†æ­¤åˆģįœŸåŽžįš„åŠ¨äŊœīŧŒč€Œéžč§„åˆ’å™¨įš„č¯ˇæą‚ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "äŊŋį”¨čŽžå¤‡ä¸Šå­˜å‚¨įš„į“Ļቇįģ˜åˆļåąåš•åœ°å›žã€‚ä¸Žåœ¨įēŋæ¨Ąåŧé…åˆäŊŋᔍæ—ļīŧŒä¸€æ—Ļ断įŊ‘äžŋįĢ‹åŗį”ąåˇ˛å­˜å‚¨įš„į“ĻቇæŽĨįŽĄã€‚į“ĻቇäŧšæŒ‰äŊ é€‰æ‹Šįš„åŒē域下čŊŊ。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "čŊĻ内摄像头" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "銞éŠļå‘˜æ‘„åƒå¤´æŖ€æŸĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "銞éŠļå‘˜åš˛éĸ„处ᐆ" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "čĄŒį¨‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "行éŠļæ—ļäēŽåēĻ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "銞éŠļéŖŽæ ŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "动态" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "åŠ¨æ€č°ƒæ Ąīŧšæ˛šé—¨å’ŒåˆščŊĻ响å甿›´įĩ敏。" + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "įŧ–čž‘" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "错蝝" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "吝ᔍ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "吝ᔍ ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "吝ᔍ Always on LateralīŧˆAOLīŧ‰ã€‚å…ŗé—­æ­¤åŧ€å…ŗå¯æĸ复 IQ.Pilot åŽŸæœ‰įš„čŊŦ向æŽĨįŽĄæ–šåŧã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "å¯į”¨čĄŒčŊĻ莰åŊ•äģĒ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "吝ᔍčŊĻ道偏įĻģč­Ļį¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "ä¸ēäŊŽé€Ÿå‡ēįŽ° LKAS æ•…éšœįš„å¤§äŧ— MQB čŊĻčž†å¯į”¨ MQB čŊŦ向锁æ­ĸå¤„į†ã€‚" + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "吝ᔍæŧĢæ¸¸" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "吝ᔍ SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "吝ᔍįŊ‘įģœå…ąäēĢ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "åŗäŊŋæœĒ吝ᔍ IQ.Pilot äšŸå¯į”¨éŠžéŠļå‘˜į›‘æŽ§ã€‚" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "输å…Ĩ APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "输å…Ĩæŋ€æ´ģ᠁" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "输å…Ĩæŋ€æ´ģ᠁" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "输å…Ĩ SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "输å…Ĩåœ°å€æˆ–åœ°į‚š" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "输å…Ĩæ–°įš„įŊ‘įģœå…ąäēĢ坆᠁" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "输å…Ĩ坆᠁" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "输å…Ĩæ‚¨įš„ GitHub į”¨æˆˇå" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "错蝝" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "退å‡ēéŠģčŊĻæ¨Ąåŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "æ‰Šåą•įŠļ态栏" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "厞éĒŒæ€§å‰čŊĻ MPC" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "čŋžæŽĨį”ĩ脑æ—ļīŧŒå°†æœ€čŋ‘įš„čĄŒčŊĻ莰åŊ•ቇæŽĩ和æ—Ĩåŋ—äģĨ U į›˜åŊĸåŧæäž›ã€‚å¯į”¨æœŸé—´ IQ.Pilot äŧšįģ§įģ­čŋčĄŒã€‚" + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "æ­Ŗåœ¨é—åŋ˜..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "åŊ“前åŧēåˆļäŊŋį”¨ä¸°į”°åŽŸåŽ‚įēĩ向控åˆļã€‚é€‰æ‹Šä¸€į§ IQ įēĩå‘æ¨Ąåŧåŗå¯åœį”¨åŽƒã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "å‡ē厂éģ˜čŽ¤įš„įēĩå‘č°ƒæ Ąã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "æ”ļ藏" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "æ­Ŗåœ¨čŽˇå–åœ°å›ž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "æ­Ŗåœ¨čŽˇå–åœ°å›žâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "最后č­Ļ告" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "æŸĨ扞äŊ įš„čŊĻ辆" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "åŽŒæˆčŽžįŊŽ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "åŊ“čŊĻ辆æŠĨå‘Šį›˛åŒēå†…æœ‰į‰ŠäŊ“æ—ļīŧŒé—Ēįƒæ˜žį¤ē䞧向č­Ļ告īŧˆäģ…限配备 BSM įš„čŊĻ辆īŧ‰ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "åĻ‚éœ€æ›´æ”šīŧŒč¯ˇåœ¨â€œčŽžå¤‡â€éĸæŋ中åŧ€å¯å§‹įģˆéŠģčŊĻīŧŒæˆ–ᆄįĢå…ŗé—­čŊĻčž†ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "莟čŊĻ距įĻģ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "æŒ‰į…§åē”į”¨ä¸­įš„æį¤ē厌成配寚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "åŧēåˆļ IQ.Pilot čŋ›å…Ĩ行čŊĻ 10 分钟īŧŸįŗģįģŸäŧšč‡ĒåŠ¨å¯į”¨å§‹įģˆéŠģčŊĻīŧŒčŽĄæ—ļį쓿ŸåŽčŽžå¤‡å°†čŋ”回éŠģčŊĻ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "åŧēåˆļäŊŋᔍ Mici į•Œéĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "åŧēåˆļ行čŊĻīŧˆ10 分钟īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "åĒčƒŊ在éŠģčŊĻįŠļ态下启动åŧēåˆļ行čŊĻ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "åŧēåˆļ行čŊĻ厞圍čŋčĄŒã€‚å°†čŽĄæ—ļ重įŊŽä¸ē 10 分钟īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "åŧēåˆļ行čŊĻ厞吝ᔍ" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "åŋ˜čް" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "čρåŋ˜čް Wi‑Fi įŊ‘įģœâ€œ{}”吗īŧŸ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "艝åĨŊ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Git čŽ¤č¯" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Git äģ¤į‰Œ / 坆᠁" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Git į”¨æˆˇå" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "čŽˇå–å¯†é’Ĩæ—ļå‡ēįŽ° GitHub 错蝝īŧˆ{}īŧ‰" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "é̘" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "隐藏įŊ‘įģœ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "ᛞåŒē有čŊĻæ—ļ暂įŧ“变道" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "蝎äŋæŒį¨ŗåޚâ€Ļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "åŊ“ᛞåŒēᛑæĩ‹æŠĨå‘Šį›Žæ ‡čŊĻ道有čŊĻæ—ļ暂įŧ“č‡Ē动变道īŧŒåž…čŊĻ道įŠēå‡ēåŽå†æ‰§čĄŒã€‚" + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "äŊåŽļ" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "小æ—ļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "莞įŊŽį•Œéĸ在无äēēæ“äŊœå¤šäš…后č‡ĒåŠ¨å…ŗé—­ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "č‡Ēæ•´åŽšå…ŗé—­æ—ļīŧŒåœ¨čŊĻ辆č‡ĒčēĢčŊŦ向æœēåģļčŋŸäš‹ä¸Šéĸå¤–åĸžåŠ įš„æå‰é‡ã€‚éģ˜čޤå€ŧä¸ē 0.2 į§’ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "åŽ‰čŖ…" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "IP 地址" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "IQ åŧēåˆļ停čŊĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "IQ æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "æ­¤čŊĻčž†æ— æŗ•äŊŋᔍ IQ įēĩå‘æ¨Ąåŧã€‚原厂 ACC æ˜¯å”¯ä¸€å¯į”¨é€‰éĄšã€‚" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic åŧ¯é“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic 前čŊĻčŊĻ速" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic äŊŽé€Ÿ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic æ¨Ąåž‹åœčŊĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic SLC 回退" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic 前čŊĻ螃æ…ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic 前čŊĻ静æ­ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "IQ.OS į‰ˆæœŦ" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot æ— æŗ•äŊŋᔍ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "IQ.Pilot 持įģ­čŋ›čĄŒæ Ąå‡†īŧŒé€šå¸¸æ— éœ€é‡įŊŽã€‚č‹ĨčŊĻ辆通į”ĩīŧŒé‡įŊŽæ Ąå‡†å°†äŧšé‡å¯ IQ.Pilot。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "IQ.Pilot čĻæą‚čŽžå¤‡åŽ‰čŖ…åœ¨åˇĻåŗ 4°、上 5° 或下 9° äģĨ内。" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"åŊ“čŊĻ速在 20 英里/小æ—ļīŧˆ32 " +"å…Ŧ里/小æ—ļīŧ‰åŠäģĨ下且打åŧ€čŊŦ向ၝæ—ļīŧŒčŊĻ辆äŧšåœ¨æœ€čŋ‘įš„å¯čĄŒéŠļčˇ¯åž„ä¸Šč§„åˆ’æœč¯Ĩæ–šå‘įš„čŊŦåŧ¯ã€‚čŋ™å¯éŋ免在įēĸၝᭉåœē景下čŊĻčž†č§„åˆ’å‡ē错蝝čŊŦåŧ¯æ–šå‘įš„æƒ…å†ĩ。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "äŋĄæ¯" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "č¯ˇæ’å…ĨčŽžå¤‡éšé™„įš„åŽŸčŖ… comma SIM åĄäģĨäŊŋᔍ eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "åŽ‰čŖ…æ›´æ–°" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "äēŒįģ´į æ— æ•ˆ" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "å…Ŧ里" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "KONN3KT 错蝝" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT įĻģįēŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "čŽŠčŽžå¤‡äŋæŒéŠģčŊĻ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "äŋį•™åŽŸåŽ‚æ˛šé—¨å’ŒåˆščŊĻ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "æ˛šé—¨å’ŒåˆščŊĻäē¤į”ąä¸°į”°åŽŸåŽ‚įŗģįģŸč´Ÿč´Ŗīŧ›IQ.Pilot äģ…č´Ÿč´ŖčŊŦ向。" + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Konn3kt 功čƒŊīŧš" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Konn3kt įŠļ态īŧš" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "限速" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "加čŊŊ中" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "æ­Ŗåœ¨åŠ čŊŊâ€Ļ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "å˜é“é€‰éĄš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "åˇĄčˆĒ故障æ—ļįš„æ¨Ē向控åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "æ¨Ē向æœēåŠ¨æ¨Ąåŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "前čŊĻč¯ģ数" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "įŽ°åœ¨é€€å‡ē始įģˆéŠģčŊĻæ¨ĄåŧīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "įŽ°åœ¨é€€å‡ēåŧēåˆļéŠģčŊĻæ¨ĄåŧīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "莊 IQ.Pilot æĩ‹é‡äŊ įš„čŊŦ向响åē”耗æ—ļåšļ持įģ­æ›´æ–°č¯Ĩ数å€ŧã€‚å…ŗé—­åŽå¯į”ąäŊ č‡Ē行å›ē厚č¯Ĩæ—ļ间。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "å…čŽ¸äŊ åœ¨įŗģį쟿ŽĨįŽĄæœŸé—´čŊģæŽ¨æ–šå‘į›˜īŧŒč€Œä¸äŧšåŽŒå…¨é€€å‡ēčŊŦ向控åˆļ。" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "厞æ—ļį›´æ’­" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "æ­Ŗåœ¨åŠ čŊŊ %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "æ­Ŗåœ¨åŠ čŊŊ视éĸ‘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "æ­Ŗåœ¨åŠ čŊŊâ€Ļ" + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "æ­Ŗåœ¨åŽšäŊâ€Ļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "æ­¤åšŗå°é”åŽšä¸ēå…ŗé—­īŧ›čŊĻčž†ä¸æ”¯æŒå…ļäģ–é€‰éĄšã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "įēĩ向控åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"įēĩ向控åˆļæ¨Ąåŧīŧš
    IQ.Pilot įš„åŠŸčƒŊåς䏋īŧš

    IQ.Pilot " +"į̝到į̝įēĩ向控åˆļ


    莊銞éŠļæ¨Ąåž‹æŽ§åˆļæ˛šé—¨å’ŒåˆščŊĻ。IQ.Pilot " +"äŧšæŒ‰į…§åŽƒčŽ¤ä¸ēäēēįąģäŧšé‡‡å–įš„æ–šåŧéŠžéŠļīŧŒåŒ…æ‹Ŧ在įēĸį¯å’ŒåœčŊĻæ ‡åŋ—处停čŊĻã€‚į”ąäēŽčŊĻé€Ÿį”ąéŠžéŠļæ¨Ąåž‹å†ŗåŽšīŧŒčŽžåŽščŊĻ速äģ…äŊœä¸ē上限。此功čƒŊäģåœ¨æ”ščŋ›ä¸­īŧŒå¯čƒŊäŧšå‡ēįŽ°å¤ąč¯¯ã€‚

    IQ.Dynamic


    栚捎åœē景和情åĸƒīŧŒåœ¨č‡Ē适åē”åˇĄčˆĒ行ä¸ē与į̝到įĢ¯čĄŒä¸ēäš‹é—´åŠ¨æ€čžåˆã€‚

    IQ.Chill


    įēĩ向控åˆļé‡‡į”¨æ ‡å‡†įš„éščŊĻæĩč‡Ē适åē”åˇĄčˆĒ行ä¸ē。

    全新銞éŠļį”ģéĸ


    äŊŽé€Ÿæ—ļ銞éŠļį”ģéĸäŧšåˆ‡æĸ到éĸå‘é“čˇ¯įš„åšŋč§’æ‘„åƒå¤´īŧŒäģĨäžŋ更åĨŊåœ°åą•į¤ē某äē›åŧ¯é“ã€‚åŗä¸Šč§’čŋ˜äŧšæ˜žį¤ē" +" IQ.Pilot 标åŋ—。" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "įēĩ向操äŊœæ¨Ąåŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "įēĩå‘č°ƒæ Ąæ–šæĄˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "提前量åĸžå¤§" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "提前量减小" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "äŊŽé€ŸčŊŦåŧ¯č§„划" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "在 MEB 和 MQB Evo čŊĻ型上īŧŒč§„åˆ’įš„æ›˛įŽ‡é€åˆ°čŊŦ向æœē䚋前先įģčŋ‡äŊŽé€šæģ¤æŗĸīŧŒæŠ‘åˆļæ¨Ē向摆动。čŋ™äē›čŊĻ型éģ˜čޤåŧ€å¯ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "手动" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "最大" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "MQB ACC æĸ复" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "MQB ACC æĸ复" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "MQB čŊŦ向锁æ­ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "MQB čŊŦ向锁æ­ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "į촿Ф" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "手动åģļčŋŸåį§ģ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "地回数捎åē“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "厞æĩ‹īŧš" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "英里" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "在銞éŠļį”ģéĸ上äģĨįŽ­å¤´æ˜ å°„čŊĻčž†įš„čŊŦå‘į¯ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "æ¨Ąåž‹åœčŊĻæ—ļé•ŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "æ¨Ąåž‹" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "无" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "无 PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "无" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "å¯ŧčˆĒ" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "åˇ˛å–æļˆå¯ŧčˆĒ" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "螃čŋ‘" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "įŊ‘įģœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "įĨžįģįŊ‘įģœ FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "įĨžįģįŊ‘įģœå‰éψ (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "äģŽä¸äŧ‘įœ " + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "åĻ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "无需čŊģæŽ¨" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "æœĒæŖ€æĩ‹åˆ°äēŒįģ´į " + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "æœĒæ‰žåˆ°į”¨æˆˇâ€œ{}â€įš„ SSH 密é’Ĩ" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "æœĒ扞到 Wi-Fi įŊ‘įģœ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "åŧ€å‘č€…æ¨Ąåŧä¸‹æœĒæŖ€æĩ‹åˆ°æ‘„åƒå¤´ã€‚į‚šå‡ģæŖ€æŸĨäģĨįģ§įģ­ã€‚" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "æš‚æ— å‘čĄŒč¯´æ˜Žã€‚" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "æ˛Ąæœ‰į쓿žœ" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "æ˛Ąæœ‰åˇ˛čŽ°åŊ•įš„čĄŒį¨‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "æœĒ莞įŊŽčŊĻ辆" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "æ­¤æ‘„åƒå¤´æ˛Ąæœ‰č§†éĸ‘" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "é€šå¸¸åŗäŊŋä¸€į›´æ‰“į€čŊŦ向ၝīŧŒä¸€æŦĄåЍäŊœäšŸäŧšį쓿Ÿå˜é“。åŧ€å¯æ­¤éĄšåŽīŧŒåĒčρčŊŦ向ၝäŋæŒåŧ€å¯å°ąå¯čŋžįģ­å˜é“——äŊ†æ¯æŦĄåŽįģ­å˜é“äģéœ€čŊģæŽ¨æ–šå‘į›˜ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "æ­¤æ–¯åˇ´é˛åšŗå°ä¸æ”¯æŒã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "æœĒčŋžæŽĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "æœĒ莞įŊŽ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "æŗ¨æ„īŧšåœ¨æ˛Ąæœ‰ LFA/LKAS æŒ‰é”Žįš„čŊĻ辆上īŧŒå…ŗé—­æ­¤éĄšå¯éŋå…åˇĄčˆĒå¯į”¨įŠļ态切æĸæ—ļčŊŦå‘čž…åŠŠčŋ›å…Ĩåž…å‘Ŋ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "čŊģæŽ¨æ–šå‘į›˜" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "įĻģįēŋ" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "įĄŽåŽš" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "在įēŋ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "å…ŗé—­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "įĻģįēŋåąåš•åœ°å›ž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "éŠģčŊĻ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "éŠģčŊĻå…ŗæœē莥æ—ļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "éŠģčŊĻīŧšæ¯æŦĄå¯åŠ¨æˆ–å”¤é†’åŽéƒŊčŋ›å…Ĩ始įģˆéŠģčŊĻ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "偏į§ģīŧš" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "čŽžå¤‡æœŦ地" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "在įēŋåąåš•åœ°å›ž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "行čŊĻåŧ€å‘č€…į•Œéĸ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "在手æœē上打åŧ€ Konn3kt åē”ᔍ" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "å¤‡æŗ¨åį§°īŧˆå¯é€‰īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "行éŠļæ—ļ叠加昞į¤ēä¸€æĄåŽžæ—ļ控åˆļæŒ‡æ ‡æĄīŧˆčŊŦ向、æ¨Ē向加速åēĻ、前čŊĻæ•°æŽīŧ‰ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "配寚" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "čŋ‡åŽģ一周" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "PQ HCA Status 7 æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "PQ HCA įŠļ态 7 æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "éĸ„č§ˆ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "é…å¯ščŽžå¤‡" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "įĢ‹åŗå‡įē§" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "é…å¯ščŽžå¤‡" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "在 Konn3kt åē”į”¨ä¸­é…å¯šäŊ įš„čŽžå¤‡" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "在 Konn3kt åē”į”¨ä¸­é…å¯šäŊ įš„čŽžå¤‡ã€‚" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "å°†čŽžå¤‡é…å¯šåˆ°æ‚¨įš„ comma č´Ļåˇ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "暂停更新" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "æ‰§čĄŒæœį´ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "选拊在 IQ.Pilot 中銞éŠļ员åˆļ动后čŊŦå‘čž…åŠŠįš„åå甿–šåŧã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "é€‰æ‹Šč¸Šä¸‹åˆļåŠ¨č¸æŋæ—ļ寚čŊŦå‘čž…åŠŠįš„åŊąå“ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "é€‰æ‹Šåˇ˛å°ąįģĒįš„æ›´æ–°æ˜¯į­‰åž…äŊ įĄŽčޤīŧŒčŋ˜æ˜¯č‡Ē行下čŊŊåšļåŽ‰čŖ…ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "选拊äŊ įš„čŊĻ辆" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "å›ē厚一æŦžčŊĻčž†åŗå¯čˇŗčŋ‡č‡ĒåŠ¨č¯†åˆĢ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "将厞æ—ļč¯ģ数īŧˆčŊĻčˇã€čŊĻ速、到前čŊĻæ—ļ间īŧ‰å›ē厚在标į¤ē前čŊĻįš„įŽ­æ ‡ä¸Šã€‚éœ€čĻį”ą IQ.Pilot 控åˆļæ˛šé—¨å’ŒåˆščŊĻ。" + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "蝎čŋžæŽĨ Wi‑Fi äģĨ厌成初始配寚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "蝎čŋžæŽĨ Wi-Fi äģĨ厌成éĻ–æŦĄé…å¯šã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "蝎čŋžæŽĨ Wi-Fi äģĨčŽˇå–äŊ įš„密é’Ĩ。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "蝎čŋžæŽĨ Wi-Fi äģĨčŋ›čĄŒæ›´æ–°ã€‚" + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "č¯ˇå°†éŠžéŠļ员摄像头寚准čŋčĨå•†įš„ eSIM äēŒįģ´į īŧˆLPA:...īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "į­–į•Ĩ权重" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "å…ŗæœē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"在发动æœēᆄįĢįŠļ态下静įŊŽčžžåˆ°æ­¤æ—ļé•ŋåŽå…ŗé—­čŽžå¤‡ã€‚\n" +"īŧˆéģ˜čޤ 30 小æ—ļīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "éĸ„æĩ‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "éĸ„æĩ‹č°ƒæ Ąīŧšéĸ„判åšļåšŗæģ‘加速åēĻ变化。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "éĸ„先下čŊŊ + éĸ„å…ˆåމ誅" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "äģ…éĸ„先下čŊŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "æ­Ŗåœ¨å‡†å¤‡åœ°å›žį“Ļቇâ€Ļ" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "åœ¨čŽĄé‡åˆļ Wi‑Fi čŋžæŽĨæ—ļéŋ免大量上äŧ " + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "åœ¨čŽĄé‡åˆļ蜂įĒįŊ‘į윿—ļéŋ免大量上äŧ " + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "éĸ„č§ˆčŊĻ内摄像头äģĨįĄŽäŋéŠžéŠļå‘˜į›‘æŽ§č§†é‡Žč‰¯åĨŊ。īŧˆčŊĻ辆åŋ…éĄģᆄįĢīŧ‰" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "配įŊŽæ–‡äģļæ“äŊœ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "åĒčĻčŽžå¤‡æœ‰įŊ‘įģœīŧŒå°ąåŽžæ—ļčŽˇå–į”¨äēŽåąåš•åœ°å›žįš„ Mapbox į“Ļį‰‡ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "æ¸…é™¤æ¨Ąåž‹įŧ“å­˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "æ›´æ”šæ›´æ–°åŽ‰čŖ…æ–šåŧå‰īŧŒč¯ˇå…ˆå°†čŽžå¤‡åˆ‡æĸ到始įģˆéŠģčŊĻīŧŒæˆ–ᆄįĢå…ŗé—­čŊĻčž†ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "更攚čŋ™äē›čŽžįŊŽå‰īŧŒč¯ˇå…ˆå°†čŽžå¤‡åˆ‡æĸ到始įģˆéŠģčŊĻīŧŒæˆ–ᆄįĢå…ŗé—­čŊĻčž†ã€‚" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "äēŒįģ´į é”™č¯¯" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "äēŒįģ´į åˇ˛æŽĨ受" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "å°ąįģĒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "重新下čŊŊ" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "åˆˇæ–°" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "į§ģ除" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "æ­Ŗåœ¨į§ģ除â€Ļ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "重įŊŽ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "æŸĨįœ‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "čŊŦ向æœēīŧš" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "åĻ‚æžœéĸ部čĸĢéŽæŒĄæˆ–éŠžéŠļå‘˜į›‘æŽ§éšžäģĨčŋŊč¸ĒīŧŒč¯ˇé‡æ–°åŽ‰čŖ…čŽžå¤‡ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "äģ…在čŊĻčž†į†„įĢæˆ–åˇ˛åŧ€å¯å§‹įģˆéŠģčŊĻæ—ļå¯į”¨ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "重启" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "é‡å¯čŽžå¤‡" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "重启åšļ更新" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "åŊ“čŊĻ辆äģĨčļ…čŋ‡ 31 mphīŧˆ50 km/hīŧ‰čĄŒéŠļ且æœĒ打čŊŦ向ၝčļŠčŋ‡æŖ€æĩ‹åˆ°įš„čŊĻ道įēŋæ—ļīŧŒæŽĨæ”ļåŧ•å¯ŧ回čŊĻé“įš„č­ĻæŠĨ。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "åŊ•åˆļåšļ上äŧ čŊĻ内摄像头" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "åŊ•åˆļåšļ上äŧ éēĻå…‹éŖŽéŸŗéĸ‘" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "行éŠļæ—ļåŊ•åˆļåšļäŋå­˜éēĻå…‹éŖŽéŸŗéĸ‘ã€‚éŸŗéĸ‘将包åĢ在 Konn3kt įš„čĄŒčŊĻ莰åŊ•视éĸ‘中。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "莰åŊ•åšļ上äŧ éŠžéŠļæ•°æŽå’Œč§†éĸ‘ã€‚åœį”¨åŽå°†åœæ­ĸæ‰€æœ‰čŽ°åŊ•īŧæ˛Ąæœ‰æ—Ĩåŋ—ã€æ˛Ąæœ‰č§†éĸ‘ã€æ˛Ąæœ‰éŸŗéĸ‘。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "重新下čŊŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "重新下čŊŊåŊ“å‰æ¨Ąåž‹" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "åˆˇæ–°é…įŊŽæ–‡äģļ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "æŗ•č§„" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "äģŽåŽš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "重新加čŊŊæ¨Ąåž‹åˆ—čĄ¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "äŋæŒå¯į”¨īŧšåˆļ动įģä¸äŧšä¸­æ–­čŊŦå‘čž…åŠŠã€‚" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "čŋœį¨‹čŽŋ问" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "į§ģ除" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "į§ģ除 Comma pSIM" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "重å‘Ŋ名" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "重å‘Ŋ名配įŊŽæ–‡äģļ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "č¯ˇæą‚čļ…æ—ļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "需čĻå…ˆå¯į”¨ IQ.Pilot įēĩ向控åˆļīŧˆAlphaīŧ‰ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "重įŊŽ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "重įŊŽæ Ąå‡†" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "æĸ复éģ˜čŽ¤čŽžįŊŽ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "æŸĨįœ‹čŽ­į샿Œ‡å—" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "æŸĨįœ‹ IQ.Pilot įš„č§„åˆ™ã€åŠŸčƒŊ与限åˆļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "é“čˇ¯åį§°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "é“čˇ¯åį§°å åŠ " + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "čĄŒį¨‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "čˇ¯åž„č§„åˆ’åŧ•æ“Žį‰ˆæœŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "åœ¨æ­¤čŽžå¤‡ä¸ŠčŋčĄŒį´§å‡‘įš„ comma 4īŧˆmiciīŧ‰į•Œéĸ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "选拊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC č‡ĒåŠ¨įĄŽčŽ¤" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC įĄŽčŽ¤æ›´é̘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC įĄŽčŽ¤æ›´äŊŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC 回退 IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC 在įēŋåĄĢ充" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC čφᛖ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC į­–į•Ĩ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "SSH 密é’Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "SSH 密é’Ĩ" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "原厂 ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "æ‰Ģ描" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "æ‰Ģ描äēŒįģ´į " + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "æ‰Ģ描äēŒįģ´į æˆ–čž“å…Ĩæŋ€æ´ģ᠁" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "æ­Ŗåœ¨æ‰Ģ描 Wi‑Fi įŊ‘įģœâ€Ļ" + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "搜į´ĸ" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "搜į´ĸåœ°å€æˆ–åœ°į‚š" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "搜į´ĸå“į‰Œæˆ–čŊĻ型" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "æ­Ŗåœ¨æœį´ĸâ€Ļ" + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "选拊" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "选拊分支" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "é€‰æ‹Šč¯­č¨€" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "č‡Ē整厚čŊŦ向åģļčŋŸ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "åēåˆ—åˇ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "莞įŊŽäŊåŽļ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "栚捎äŊįŊŽčŽžįŊŽå•äŊ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "莞įŊŽå…Ŧ司" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "莞įŊŽäŊåŽļ地址" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "æ šæŽčŽžå¤‡äŊįŊŽčŽžįŊŽå•äŊã€‚é™¤įžŽå›Ŋã€č‹ąå›Ŋ和刊比里äēšå¤–īŧŒå„地čŊĻ速均切æĸä¸ēå…Ŧ里/小æ—ļīŧŒåšļ圍莍čļŠčžšåĸƒæ—ļ重新判断。" + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "莞įŊŽå…Ŧ司地址" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "莞įŊŽčŊĻ道čŊŦåŧ¯æ„å›žæ‰€į”¨įš„速åēĻ阈å€ŧ。äŊŽäēŽč¯Ĩå€ŧæ—ļīŧŒčŊŦåŧ¯æ„å›žå¯č§„划最čŋ‘įš„å¯čĄŒéŠļčŊŦåŧ¯čˇ¯åž„。éģ˜čޤå€ŧä¸ē 19 英里/小æ—ļ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "莞įŊŽčŽžå¤‡åœ¨å¯åŠ¨æˆ–äģŽįĄįœ å”¤é†’后čŋ›å…Ĩįš„įŠļ态。" + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "莞įŊŽ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "在銞éŠļį”ģéĸ上昞į¤ēåŊ“å‰é“čˇ¯åį§°ã€‚
    需čĻåŽ‰čŖ…äŊ æ‰€åœ¨åœ°åŒēįš„įĻģįēŋ地回数捎。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "åšŗæģ‘čŊŦ向" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "åģļ后更新" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "čŊ¯äģļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "čŊĻ速" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "限速" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "限速控åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "标准" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"åģē莎äŊŋį”¨æ ‡å‡†æ¨Ąåŧã€‚æŋ€čŋ›æ¨Ąåŧä¸‹īŧŒIQ.Pilot " +"äŧšæ›´č´´čŋ‘前čŊĻīŧŒæ˛šé—¨ä¸ŽåˆščŊĻæ›´ä¸ēæŋ€čŋ›īŧ›äģŽåŽšæ¨Ąåŧä¸‹īŧŒäŧšä¸Žå‰čŊĻäŋæŒæ›´čŋœčˇįĻģã€‚åœ¨æ”¯æŒįš„čŊĻ型上īŧŒå¯į”¨æ–šå‘į›˜čˇįĻ쿌‰é’Žåˆ‡æĸčŋ™äē›éŖŽæ ŧ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "åž…æœē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "åž…æœēīŧšåˆļ动äŧšæš‚åœčŊŦå‘čž…åŠŠīŧ›æžåŧ€č¸æŋåŽåŗæĸ复。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "åŧ€å§‹ä¸‹čŊŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "蝎吝劍čŊĻ辆äģĨæŖ€æŸĨčŊŦå‘čž…åŠŠčĄŒä¸ēįš„å…ŧ厚性。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "åˇž/ᜁ" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "įģŸčŽĄ" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "įŠļ态" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "äŋæŒæŽĨįŽĄ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "čŊŦ向" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "čŊŦå‘čž…åŠŠčĄŒä¸ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "čŊŦ向力åēĻåŧ§įēŋ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "原厂 ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "停æ­ĸ下čŊŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "适ᔍäēŽé…å¤‡æ‰‹åŠ¨æ‰‹åˆšįš„æ–¯åˇ´é˛ Global čŊĻåž‹įš„čĩ°čĩ°åœåœæ–šæĄˆã€‚é…å¤‡į”ĩ子éŠģčŊĻåˆļåŠ¨įš„čŊĻčž†č¯ˇäŋæŒå…ŗé—­ã€‚感č°ĸ martinl æäž›æ­¤åŽžįŽ°īŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "åˇ˛å­˜å‚¨įš„åœ°å›ž" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "æ­Ŗåœ¨äģŽäē‘įĢ¯æ’­æ”ž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "å°†čŽžå¤‡åˆ‡æĸ到始įģˆéŠģčŊĻæ¨ĄåŧīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "å°†čŽžå¤‡åˆ‡æĸ到åŧēåˆļéŠģčŊĻæ¨ĄåŧīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "įŗģįģŸ" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "įŗģį쟿— å“åē”" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "蝎įĢ‹åŗæŽĨįŽĄæŽ§åˆļ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "渊åēĻ" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "渊åēĻčŋ‡é̘" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "渊åēĻæ­Ŗå¸¸" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "į‚šå‡ģ“Add Device”åšļæ‰Ģæåŗäž§įš„äēŒįģ´į " + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "į›Žæ ‡åˆ†æ”¯" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "įŊ‘įģœå…ąäēĢ坆᠁" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "æ‰€é€‰æ¨Ąåž‹åˇ˛æ›´æ”šã€‚åģē议重įŊŽæ Ąå‡†ã€‚įŽ°åœ¨å°ąé‡įŊŽå—īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "一æ—Ļæ‰§čĄŒäžŋæ— æŗ•æ’¤é”€â€”â€”čŋ™æ˜¯æ”žåŧƒįš„æœ€åŽæœēäŧšã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "æ­¤æ›´æ”šéœ€é‡å¯åŽį”Ÿæ•ˆã€‚įŽ°åœ¨é‡å¯īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "æ­¤åšŗå°äģ…限退å‡ēæ¨Ąåŧã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "æ­¤åšŗå°äģ…æ”¯æŒéƒ¨åˆ†čŊŦå‘čž…åŠŠčĄŒä¸ēé€‰éĄšã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "æ­¤åšŗå°æ”¯æŒåŽŒæ•´įš„čŊŦå‘čž…åŠŠčĄŒä¸ē配įŊŽã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"此操äŊœå°†åˆ é™¤æ‰€æœ‰åˇ˛ä¸‹čŊŊįš„åœ°å›ž\n" +"\n" +"įĄŽåŽščĻåˆ é™¤å…¨éƒ¨åœ°å›žå—īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "此操äŊœå°†äģŽįŧ“存中删除除åŊ“前äŊŋį”¨æ¨Ąåž‹å¤–įš„æ‰€æœ‰åˇ˛ä¸‹čŊŊæ¨Ąåž‹ã€‚įĄŽåŽšå—īŧŸ" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "此操äŊœå°†äģŽ SIM åĄä¸­æ°¸äš…æŠšé™¤ Comma pSIM 配įŊŽæ–‡äģļ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "此操äŊœå°†åŧ€å§‹ä¸‹čŊŊīŧŒå¯čƒŊ需čρ䏀æŽĩæ—ļ间才čƒŊ厌成。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "æ—ļ间" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "切æĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "åˆčŽĄīŧš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "åœ¨é“čˇ¯į”ģéĸ上įģ˜åˆļä¸€æĄåŧ§įēŋīŧŒæ˜žį¤ēæ¨Ē向控åˆļčŋčĄŒæ—ļ IQ.Pilot æ–ŊåŠ įš„čŊŦ向量。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "äŊŋį”¨æŒ‡å—" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "čŊŦ向ၝ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "åŽŒå…¨å…ŗé—­åœ¨įēŋæ›´æ–°æŖ€æŸĨ。
    éœ€é‡å¯åŽį”Ÿæ•ˆã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "å…ˆčž“å…Ĩåš´äģŊå†čž“å…ĨčŊĻ型 — 例åĻ‚ 2021 Toyota Corollaīŧš" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "输å…ĨäģĨ搜į´ĸ" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "ä¸å¯į”¨" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "卸čŊŊ" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "更新" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "USB 存储" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "äŊŋᔍ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "æ— æŗ•åŠ čŊŊ视éĸ‘" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "čŊĻčž†å¤„äēŽčĄŒčŊĻįŠļ态æ—ļä¸å¯į”¨ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "ä¸å¯į”¨ — æ­¤čŊĻ辆æœĒ吝ᔍ IQ.Pilot įēĩ向控åˆļ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "æœĒ蝆åˆĢ且æœĒ莞įŊŽ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "卸čŊŊ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "æœĒįŸĨ" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "æœĒįŸĨčŋčĨ商" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "æ— é™čĄŒį¨‹å­˜å‚¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "æ›´æ–°åŽ‰čŖ…æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "äģ…在čŊĻčž†į†„įĢæ—ļ下čŊŊ更新。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "行éŠļæ—ļ上äŧ " + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "上äŧ čŊĻ内摄像头数捎īŧŒå¸ŽåŠŠæ”ščŋ›éŠžéŠļå‘˜į›‘æŽ§įŽ—æŗ•ã€‚" + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "厞䏊äŧ " + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "æ­Ŗåœ¨ä¸Šäŧ " + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "在 PQ åšŗå°čŊĻ辆上äŊŋᔍ HCA Status 7 而非 Status 5 čŋ›čĄŒčŊŦ向控åˆļ。čŋ™å¯čƒŊ有劊äēŽæ”šå–„éƒ¨åˆ†čžƒæ—§å¤§äŧ—čŊĻåž‹įš„å…ŧ厚性。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "äŊŋᔍå…Ŧåˆļ" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"äŊŋᔍæŋ€æ´ģ᠁īŧš\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "äŊŋᔍ IQ.Pilot čŋ›čĄŒč‡Ē适åē”åˇĄčˆĒ与čŊĻ道äŋæŒčž…劊。äŊŋį”¨æ­¤åŠŸčƒŊæ—ļīŧŒæ‚¨åŋ…éĄģ始įģˆäŋæŒä¸“æŗ¨ã€‚" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "čŊĻ辆" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "æŸĨįœ‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTBīŧˆč™šæ‹Ÿæ‰­įŸŠčžåˆīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "čŊĻ辆" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "尚æœĒæŖ€æĩ‹åˆ°čŊĻčž†įš„įēĩ向控åˆļčƒŊåŠ›ã€‚č¯ˇå¯åŠ¨čŊĻ辆一æŦĄäģĨæŖ€æĩ‹æ”¯æŒæƒ…å†ĩ。" + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "视éĸ‘播攞器" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "æŸĨįœ‹ IQ.Pilot å´Šæēƒįš„错蝝æ—Ĩåŋ—。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "č§†č§‰æƒé‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "昞į¤ē效果" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "æ­Ŗåœ¨į­‰åž… GPS 厚äŊâ€Ļ" + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "æ­Ŗåœ¨į­‰åž…éŠžéŠļå‘˜æ‘„åƒå¤´ã€‚č¯ˇäŊŋᔍčŋčĨå•†įš„ eSIM äēŒįģ´į īŧŒæˆ–æ‰‹åŠ¨čž“å…Ĩ LPA į ã€‚" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "į­‰åž…åŧ€å§‹" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "č­Ļ告" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"č­Ļ告īŧšæ­¤æ“äŊœäŧšå‘äŊ  GitHub 莞įŊŽä¸­įš„æ‰€æœ‰å…Ŧé’Ĩ授äēˆ SSH čŽŋ闎权限。切å‹ŋ输å…Ĩč‡ĒåˇąäģĨå¤–įš„ GitHub į”¨æˆˇåã€‚IQ.Pilot " +"įš„å‘˜åˇĨįģä¸äŧščĻæą‚äŊ æˇģ加äģ–äģŦįš„ GitHub į”¨æˆˇåã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "č­Ļ告īŧšåœ¨äŊŽäēŽ {} įš„åŧ¯é“中čŊŦ向可čƒŊå‡ēįŽ°æ‘†æŒ¯īŧ›č‹Ĩæœ‰æ­¤æ„Ÿč§‰č¯ˇå…ŗé—­æ­¤éĄšã€‚" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "æŦĸčŋŽäŊŋᔍ IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "å¯į”¨åŽīŧŒč¸Šä¸‹åŠ é€Ÿč¸æŋ将äŧšč„ąįĻģ IQ.Pilot。" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Wi‑Fi 计量įŊ‘įģœ" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "å…Ŧ司" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "坆᠁错蝝" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "是" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "是īŧŒåˆ é™¤å…¨éƒ¨åœ°å›ž" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "äŊ åŋ…éĄģæŽĨå—æœåŠĄæĄæŦžæ‰čƒŊäŊŋᔍ IQ.Pilot。" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "äŊ åŋ…éĄģæŽĨå—æœåŠĄæĄæŦžæ‰čƒŊäŊŋᔍ IQ.Pilot。įģ§įģ­äš‹å‰īŧŒč¯ˇåœ¨ https://iqlvbs.com/tos 阅č¯ģæœ€æ–°æĄæŦžã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "此后äŊ åŋ…éĄģäŊŋᔍč‡Ēåˇąįš„ eSIM 配įŊŽæ–‡äģļ。除非äģŽ comma č´­äš°æ–°įš„ SIM åĄīŧŒåĻåˆ™æ— æŗ•å†æŦĄäŊŋᔍ Comma Prime。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "吝ᔍ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "äŊŋᔍ䏭" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "åŊ“å‰æ¨Ąåž‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "æˇģ加 eSIM 配įŊŽæ–‡äģļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "æˇģ加配įŊŽæ–‡äģļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "æŋ€čŋ›" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "APN 莞įŊŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "č‡Ē动" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "č‡Ē动变暗" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"č‡Ē动\n" +"更新" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "čŋ”回" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "分支" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "变暗åģļčŋŸ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "æ­Ŗåœ¨čŽĄįŽ—é‡Œį¨‹â€Ļ" + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "ᛏæœē启动中" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "蜂įĒæŒ‰æĩé‡čŽĄč´š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"更攚\n" +"蝭荀" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "æŖ€æŸĨ更新" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "æ­Ŗåœ¨æŖ€æŸĨâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "įģ„合" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "合åšļæ¨Ąåž‹" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "åˇ˛é…įŊŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "čŋžæŽĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "厞čŋžæŽĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "æ­Ŗåœ¨čŋžæŽĨâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "įģ§įģ­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "控åˆļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "静æ­ĸčĩˇæ­Ĩ蠕行īŧˆBetaīŧ‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "åˇĄčˆĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "æ›˛įŽ‡æŽ§åˆļ器" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "行čŊĻ莰åŊ•äģĒ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "拒įģ" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "éģ˜čޤ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "删除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "åŧ€å‘者" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "čŽžå¤‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "čŽžå¤‡ ID" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"å…ŗé—­\n" +"åŧēåˆļéŠģčŊĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "å…ŗé—­åŧēåˆļéŠģčŊĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "厞兺闭" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "æ­Ŗåœ¨æ–­åŧ€â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "退å‡ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "č¸Šæ˛šé—¨é€€å‡ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "昞į¤ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "åąåš•äēŽåēĻ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "下" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "下čŊŊ更新" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "æ­Ŗåœ¨ä¸‹čŊŊ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "æ­Ŗåœ¨ä¸‹čŊŊâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"銞éŠļ员摄像头\n" +"éĸ„č§ˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "行éŠļäēŽåēĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "动态" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "å¯į”¨čĄŒčŊĻ莰åŊ•äģĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "吝ᔍæŧĢæ¸¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "厞åŧ€å¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "åŧēåˆļäŊŋį”¨åŽŸåŽ‚įēĩ向" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "输å…Ĩ APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "输å…Ĩ GitHub į”¨æˆˇåâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "输å…Ĩ LPA æŋ€æ´ģ᠁â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "输å…ĨäģŖį " + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "输å…Ĩ坆᠁â€Ļ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "æŖ€æŸĨæ›´æ–°å¤ąč´Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "æ›´æ–°å¤ąč´Ĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "åŋĢ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "æ­Ŗåœ¨åŽŒæˆæ›´æ–°â€Ļ" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "ᔍäēŽâ€œ{}”" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "ᔍäēŽį§æœ‰åˆ†æ”¯æ›´æ–°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"åŧēåˆļ\n" +"éŠģčŊĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "åŧēåˆļäŊŋᔍ mici į•Œéĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "åŧēåˆļéŠģčŊĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "æ­Ŗåœ¨åŋ˜čްâ€Ļ" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "æ ŧåŧīŧšLPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "æĨč‡Ēįŧ“å­˜" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "小æ—ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "įŽ°äģŖįēĩå‘č°ƒæ Ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "äŋĄæ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "åŽ‰čŖ…æ›´æ–°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "äē¤äē’čļ…æ—ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "iq.dynamic 莞įŊŽ" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "变道" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "čŊĻ道偏įĻģč­Ļ告" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "čŊŦåŧ¯é€ŸåēĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "æ¨Ē向æœēåŠ¨æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "åˇĄčˆĒ故障æ—ᅪĒ向控åˆļ" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "į•™įŠēäģĨč‡Ē动配įŊŽ" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "į•™įŠēåˆ™čˇŗčŋ‡" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "į•™įŠēį”¨æˆˇåå’Œäģ¤į‰ŒäģĨ清除" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "åˇĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "įēĩ向æœēåŠ¨æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "äŊŽé€ŸčŊŦåŧ¯č§„划" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "分钟" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "įŽĄį†é…įŊŽæ–‡äģļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "手动" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "手动åģļčŋŸåį§ģ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "äģ…地回" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "地回äŧ˜å…ˆ" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "计量" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "æ¨Ąåž‹" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "įŊ‘įģœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "įŊ‘įģœį”¨é‡" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "äģŽä¸" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "åĻ" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "无提醒" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "无需čŊģæŽ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "æ­Ŗå¸¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "ä¸åœ¨čŒƒå›´å†…" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "įŽ°åœ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "čŊģæŽ¨æ–šå‘į›˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "å…ŗé—­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "įĻģįēŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "åŧ€å¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "在įēŋ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "å¤‡æŗ¨åį§°īŧˆå¯é€‰īŧ‰â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "在åē”į”¨ä¸­é…å¯š" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "与 Konn3kt 配寚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "į­–į•Ĩ权重" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "å…ŗæœē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "éĸ„æĩ‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "配įŊŽæ–‡äģļæ“äŊœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "čŋčĨ商æœĒįŸĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "æ¸…é™¤æ¨Ąåž‹įŧ“å­˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "åˇ˛æŽ’é˜Ÿ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "å°ąįģĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "重启" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "åŊ•åˆļ銞éŠļ员摄像头" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "åŊ•åˆļéēĻå…‹éŖŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "重新下čŊŊæ¨Ąåž‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "åˆˇæ–°é…įŊŽæ–‡äģļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "æŗ•č§„äŋĄæ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "舒įŧ“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "重新加čŊŊæ¨Ąåž‹åˆ—čĄ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "į§ģ除 comma pSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "重å‘Ŋ名" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "重å‘Ŋ名配įŊŽæ–‡äģļâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "重įŊŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "重įŊŽæ Ąå‡†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"æŸĨįœ‹\n" +"äŊŋį”¨æŒ‡å—" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "åŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "į§’" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "æ‰Ģ描äēŒįģ´į " + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "æ‰Ģ᠁ / 输å…ĨäģŖį " + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "æ­Ŗåœ¨æœį´ĸįŊ‘įģœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "č‡Ē整厚čŊŦ向åģļčŋŸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "åēåˆ—åˇ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "čŽžåŽščŊĻ速" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "按äŊįŊŽčŽžįŊŽå•äŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"æģ‘动äģĨ\n" +"清除įŧ“å­˜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"æģ‘动äģĨ\n" +"断åŧ€čŋžæŽĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"æģ‘动äģĨ\n" +"åŋ˜čްįŊ‘įģœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"æģ‘动äģĨ\n" +"重新下čŊŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"æģ‘动äģĨ\n" +"重įŊŽæ Ąå‡†" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"æģ‘动äģĨ\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"æģ‘动äģĨį§ģ除\n" +"comma pSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "æ…ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "åšŗæģ‘čŊŦ向" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "čŊ¯äģļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "限速设įŊŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "标准" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "åž…æœē" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"启动čŊĻ辆äģĨ\n" +"äŊŋᔍ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "æ­Ŗåœ¨å¯åŠ¨â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "įŠļ态" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "äŋæŒæŽĨįŽĄ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "čŊŦ向" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "čŊŦå‘čž…åŠŠčĄŒä¸ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "原厂" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "手刚čĩ°čĩ°åœåœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "停æ­ĸ下čŊŊ" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "įŗģįģŸå¯åЍ䏭" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "į›Žæ ‡åˆ†æ”¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"æĄæŦžä¸Ž\n" +"æĄäģļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "įƒ­į‚š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "įƒ­į‚šå¯†į " + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "åŧ€å…ŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "čĄŒį¨‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "卸čŊŊ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "卸čŊŊ IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "不限æĩé‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "不支持" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "上" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "åˇ˛æ˜¯æœ€æ–°" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "åˇ˛æ˜¯æœ€æ–°īŧŒæœ€åŽæŖ€æŸĨīŧšäģŽæœĒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "åˇ˛æ˜¯æœ€æ–°īŧŒæœ€åŽæŖ€æŸĨīŧš{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"æ›´æ–°åŽ‰čŖ…\n" +"æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "æœ‰å¯į”¨æ›´æ–°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"æ›´æ–°į¨‹åēæ— \n" +"响åē”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "äŊŋᔍå…Ŧåˆļ单äŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "čŊĻ辆" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "į‰ˆæœŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "č™šæ‹Ÿæ‰­įŸŠčžåˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "č§†č§‰æƒé‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "昞į¤ē效果" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "č­Ļ告" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "坆᠁错蝝" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "是" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} æĄč­ĻæŠĨ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{} 夊前" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{} 小æ—ļ前" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{} 分钟前" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 åš´čĄŒéŠļ数捎存储" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "全夊候 LTE čŋžæŽĨ" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "č­Ļ告īŧšæ­¤čŊĻåž‹įš„ openpilot įēĩ向控åˆļäģä¸ē alphaīŧŒå°†äŧšåœį”¨č‡Ē劍ᴧæ€Ĩåˆļ动 " +#~ "(AEB)。

    在此čŊĻ型上īŧŒopenpilot éģ˜čޤäŊŋᔍčŊĻčŊŊ ACCīŧŒč€Œéž openpilot įš„įēĩ向控åˆļã€‚å¯į”¨æ­¤é€‰éĄšå¯åˆ‡æĸä¸ē " +#~ "openpilot įēĩ向控åˆļ。åģēčŽŽåŒæ—ļå¯į”¨åŽžéĒŒæ¨Ąåŧã€‚č‹ĨčŊĻ辆通į”ĩīŧŒæ›´æ”šæ­¤čŽžįŊŽå°†äŧšé‡å¯ openpilot。" + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADBīŧˆAndroid č°ƒč¯•æĄĨīŧ‰å¯é€ščŋ‡ USB 或įŊ‘įģœčŋžæŽĨåˆ°æ‚¨įš„čŽžå¤‡ã€‚č¯Ļ见 https://docs.comma.ai/how-to/connect-" +#~ "to-comma。" + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "始įģˆå¯į”¨éŠžéŠļå‘˜į›‘æŽ§" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "openpilot įēĩ向控åˆļįš„ alpha į‰ˆæœŦ可在非发布分支搭配厞éĒŒæ¨Ąåŧčŋ›čĄŒæĩ‹č¯•。" + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "将 konn3kt.com æˇģ加到ä¸ģåąåš•īŧŒåƒåē”į”¨ä¸€æ ˇäŊŋᔍ" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "åŽ‰į¨ŗæ¨Ąåŧåˇ˛åŧ€å¯" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "č‹ĨčŊĻ辆通į”ĩīŧŒæ›´æ”šæ­¤čŽžįŊŽå°†é‡å¯ openpilot。" + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "į‚šå‡ģ“æˇģåŠ æ–°čŽžå¤‡â€īŧŒæ‰Ģæåŗäž§äēŒįģ´į " + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "拒įģåšļ卸čŊŊ openpilot" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "厞éĒŒæ¨Ąåŧåˇ˛åŧ€å¯" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "åŗäŊŋæœĒ吝ᔍ openpilot äšŸå¯į”¨éŠžéŠļå‘˜į›‘æŽ§ã€‚" + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "吝ᔍ openpilot" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "吝ᔍ openpilot įēĩ向控åˆļīŧˆalphaīŧ‰åŧ€å…ŗīŧŒäģĨäŊŋį”¨åŽžéĒŒæ¨Ąåŧã€‚" + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "厞éĒŒæ¨Ąåŧ" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "æ­¤čŊĻ型åŊ“å‰æ— æŗ•äŊŋį”¨åŽžéĒŒæ¨ĄåŧīŧŒå› ä¸ēįēĩ向控åˆļäŊŋį”¨įš„æ˜¯åŽŸåŽ‚ ACC。" + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "PRIME 功čƒŊīŧš" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Firehose æ¨Ąåŧ" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "ä¸ēčžžåˆ°æœ€äŊŗæ•ˆæžœīŧŒč¯ˇå°†čŽžå¤‡å¸Ļ到厤内īŧŒåšļ每周čŋžæŽĨäŧ˜č´¨ USB‑C 充į”ĩ器与 Wi‑Fi。\n" +#~ "\n" +#~ "č‹ĨčŋžæŽĨįƒ­į‚šæˆ–ä¸é™æĩé‡åĄīŧŒčĄŒčŊĻ中䚟可äŊŋᔍ Firehose æ¨Ąåŧã€‚\n" +#~ "\n" +#~ "\n" +#~ "å¸¸č§é—Žéĸ˜\n" +#~ "\n" +#~ "我怎䚈åŧ€ã€åœ¨å“Ēåŧ€æœ‰åŒēåˆĢ吗īŧŸæ˛Ąæœ‰īŧŒåšŗå¸¸æ€Žäšˆåŧ€å°ąæ€Žäšˆåŧ€ã€‚\n" +#~ "\n" +#~ "Firehose æ¨Ąåŧäŧšæ‹‰å–æˆ‘æ‰€æœ‰į‰‡æŽĩ吗īŧŸä¸äŧšīŧŒæˆ‘äģŦäŧšé€‰æ‹Šæ€§æ‹‰å–éƒ¨åˆ†į‰‡æŽĩ。\n" +#~ "\n" +#~ "äģ€äšˆæ˜¯åĨŊįš„ USB‑C 充į”ĩ器īŧŸäģģäŊ•åŋĢé€Ÿįš„æ‰‹æœē或įŦ”į”ĩ充į”ĩ器éƒŊ可äģĨ。\n" +#~ "\n" +#~ "æˆ‘čˇ‘äģ€äšˆčŊ¯äģᅵ‰åŒēåˆĢ吗īŧŸæœ‰īŧŒåĒ有上游 openpilotīŧˆåŠį‰šåŽšåˆ†æ”¯īŧ‰å¯į”¨äēŽčŽ­įģƒã€‚" + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "在手æœē上前垀 https://konn3kt.com" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "æœĒ吝ᔍīŧšč¯ˇčŋžæŽĨ不限æĩé‡įŊ‘įģœ" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "æ‘‡æ†č°ƒč¯•æ¨Ąåŧ" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "最大化上äŧ čŽ­į샿•°æŽīŧŒäģĨ攚čŋ› openpilot įš„éŠžéŠļæ¨Ąåž‹ã€‚" + +#~ msgid "NO" +#~ msgstr "åĻ" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "æœĒ扞到 SSH 密é’Ĩ" + +#, python-format +#~ msgid "Open" +#~ msgstr "打åŧ€" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "å°†čŽžå¤‡ä¸Ž Konn3ktīŧˆkonn3kt.comīŧ‰é…å¯šīŧŒéĸ†å–æ‚¨įš„ Konn3kt äŧ˜æƒ ã€‚" + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "前垀 konn3kt.com 成ä¸ē Konn3kt äŧšå‘˜" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "čŋœį¨‹åŋĢį…§" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "æŸĨįœ‹ openpilot įš„č§„åˆ™ã€åŠŸčƒŊ与限åˆļ" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "åģē莎äŊŋį”¨æ ‡å‡†æ¨Ąåŧã€‚æŋ€čŋ›æ¨Ąåŧä¸‹īŧŒopenpilot " +#~ "äŧšæ›´č´´čŋ‘前čŊĻīŧŒæ˛šé—¨ä¸ŽåˆščŊĻæ›´ä¸ēæŋ€čŋ›īŧ›äģŽåŽšæ¨Ąåŧä¸‹īŧŒäŧšä¸Žå‰čŊĻäŋæŒæ›´čŋœčˇįĻģã€‚åœ¨æ”¯æŒįš„čŊĻ型上īŧŒå¯į”¨æ–šå‘į›˜čˇįĻ쿌‰é’Žåˆ‡æĸčŋ™äē›éŖŽæ ŧ。" + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "äŊŋᔍ openpilot čŋ›čĄŒč‡Ē适åē”åˇĄčˆĒ与čŊĻ道äŋæŒčž…劊。äŊŋį”¨æ­¤åŠŸčƒŊæ—ļīŧŒæ‚¨åŋ…éĄģ始įģˆäŋæŒä¸“æŗ¨ã€‚" + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "č­Ļ告īŧščŋ™å°†æŽˆäēˆå¯šæ‚¨ GitHub 莞įŊŽä¸­æ‰€æœ‰å…Ŧé’Ĩįš„ SSH čŽŋé—Žæƒé™ã€‚č¯ˇå‹ŋ输å…Ĩ非您æœŦäēēįš„ GitHub į”¨æˆˇåã€‚comma " +#~ "员åˇĨįģä¸äŧščĻæą‚æ‚¨æˇģ加äģ–äģŦįš„į”¨æˆˇåã€‚" + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "æŦĸčŋŽäŊŋᔍ openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "å¯į”¨åŽīŧŒč¸Šä¸‹åŠ é€Ÿč¸æŋ将äŧšč„ąįĻģ openpilot。" + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "您åŋ…éĄģæŽĨå—æĄæŦžä¸ŽæĄäģ￉čƒŊäŊŋᔍ openpilot。" + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "您åŋ…éĄģæŽĨå—æĄæŦžä¸ŽæĄäģ￉čƒŊäŊŋᔍ openpilot。įģ§įģ­å‰č¯ˇé˜…č¯ģ https://comma.ai/terms ä¸Šįš„æœ€æ–°æĄæŦžã€‚" + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "openpilot įēĩ向控åˆļīŧˆAlphaīŧ‰" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot æ— æŗ•äŊŋᔍ" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilot éģ˜čޤäģĨåŽ‰į¨ŗæ¨ĄåŧčĄŒéŠļ。厞éĒŒæ¨Ąåŧäŧšå¯į”¨å°šæœĒ准备åĨŊᔍäēŽåŽ‰į¨ŗæ¨Ąåŧįš„ Alpha " +#~ "įē§åŠŸčƒŊ。厞énj功čƒŊåς䏋īŧš

    į̝到į̝įēĩ向控åˆļ


    莊銞éŠļæ¨Ąåž‹æŽ§åˆļæ˛šé—¨ä¸ŽåˆščŊĻ。openpilot " +#~ "äŧšåƒäēēįąģä¸€æ ˇéŠžéŠļīŧŒåŒ…æ‹Ŧ在įēĸį¯ä¸Žåœį‰Œå‰åœčŊĻã€‚į”ąäēŽéŠžéŠļæ¨Ąåž‹å†ŗåŽščĄŒéŠļ速åēĻīŧŒčŽžåŽšé€ŸåēĻäģ…äŊœä¸ē上限。čŋ™æ˜¯ Alpha " +#~ "č´¨é‡åŠŸčƒŊīŧ›éĸ„期äŧšæœ‰é”™č¯¯ã€‚

    全新銞éŠļå¯č§†åŒ–


    在äŊŽé€Ÿæ—ļīŧŒéŠžéŠļå¯č§†åŒ–å°†åˆ‡æĸ臺éĸå‘é“čˇ¯įš„åšŋč§’æ‘„åƒå¤´äģĨ更åĨŊ昞į¤ē部分čŊŦåŧ¯ã€‚åŗä¸Šč§’äšŸäŧšæ˜žį¤ē厞éĒŒæ¨Ąåŧå›žæ ‡ã€‚" + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "openpilot 持įģ­čŋ›čĄŒæ Ąå‡†īŧŒé€šå¸¸æ— éœ€é‡įŊŽã€‚č‹ĨčŊĻ辆通į”ĩīŧŒé‡įŊŽæ Ąå‡†å°†äŧšé‡å¯ openpilot。" + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilot 通čŋ‡č§‚察äēēįąģīŧˆäž‹åĻ‚æ‚¨īŧ‰įš„銞éŠļæĨå­Ļ䚠。\n" +#~ "\n" +#~ "Firehose æ¨Ąåŧå¯čŽŠæ‚¨æœ€å¤§åŒ–ä¸Šäŧ čŽ­į샿•°æŽīŧŒäģĨ攚čŋ› openpilot įš„éŠžéŠļæ¨Ąåž‹ã€‚æ›´å¤šæ•°æŽæ„å‘ŗį€æ›´å¤§įš„æ¨Ąåž‹īŧŒäšŸæ„å‘ŗį€æ›´åĨŊįš„åŽžéĒŒæ¨Ąåŧã€‚" + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "openpilot įēĩ向控åˆļ可čƒŊäŧšåœ¨æœĒæĨ更新中提䞛。" + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "openpilot čĻæą‚čŽžå¤‡åŽ‰čŖ…åœ¨åˇĻåŗ 4°、上 5° 或下 9° äģĨ内。" + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "į›Žå‰åˇ˛æœ‰ {} ä¸Ēæ‚¨įš„éŠžéŠļቇæŽĩčĸĢįēŗå…Ĩ莭į샿•°æŽé›†ã€‚" +#~ msgstr[1] "į›Žå‰åˇ˛æœ‰ {} ä¸Ēæ‚¨įš„éŠžéŠļቇæŽĩčĸĢįēŗå…Ĩ莭į샿•°æŽé›†ã€‚" + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ 厞čŽĸ阅" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Firehose æ¨Ąåŧ đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/app_zh-CHT.mo b/iqpilot/selfdrive/ui/translations/app_zh-CHT.mo new file mode 100644 index 000000000..72c517d98 Binary files /dev/null and b/iqpilot/selfdrive/ui/translations/app_zh-CHT.mo differ diff --git a/iqpilot/selfdrive/ui/translations/app_zh-CHT.po b/iqpilot/selfdrive/ui/translations/app_zh-CHT.po new file mode 100644 index 000000000..d95eff259 --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/app_zh-CHT.po @@ -0,0 +1,4467 @@ +# Language zh-CHT translations for PACKAGE package. +# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-08-09 21:05-0500\n" +"PO-Revision-Date: 2025-10-22 16:32-0700\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh-CHT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1582 +#, python-brace-format +msgid " (Default)" +msgstr "īŧˆé č¨­īŧ‰" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:164 +#, python-brace-format +msgid " Steering torque response calibration is complete." +msgstr " čŊ‰å‘æ‰­įŸŠå›žæ‡‰æ Ąæ­ŖåŽŒæˆã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:162 +#, python-brace-format +msgid " Steering torque response calibration is {}% complete." +msgstr " čŊ‰å‘æ‰­įŸŠå›žæ‡‰æ Ąæ­Ŗåˇ˛åŽŒæˆ {}%。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid " Your device is pointed {:.1f}° {} and {:.1f}° {}." +msgstr " æ‚¨įš„čŖįŊŽæœå‘ {:.1f}° {} 與 {:.1f}° {}。" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:55 +msgid "--" +msgstr "--" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:58 +msgid "2G" +msgstr "2G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:59 +msgid "3G" +msgstr "3G" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:61 +msgid "5G" +msgstr "5G" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:152 +#, python-brace-format +msgid "

    Steering lag calibration is complete." +msgstr "

    čŊ‰å‘åģļé˛æ Ąæ­ŖåŽŒæˆã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:150 +#, python-brace-format +msgid "

    Steering lag calibration is {}% complete." +msgstr "

    čŊ‰å‘åģļé˛æ Ąæ­Ŗåˇ˛åŽŒæˆ {}%。" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "ACTIVE" +msgstr "å•Ÿį”¨" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:17 +msgid "" +"ADB (Android Debug Bridge) allows connecting to your device over USB or over" +" the network." +msgstr "ADBīŧˆAndroid åĩ錯抋æŽĨīŧ‰å¯čŽ“äŊ é€éŽ USB 或įļ˛čˇ¯é€Ŗįˇšč‡ŗčŖįŊŽã€‚" + +#: system/ui/widgets/esim.py:65 openpilot/selfdrive/ui/widgets/ssh_key.py:96 +#, python-brace-format +msgid "ADD" +msgstr "新åĸž" + +#: openpilot/selfdrive/ui/widgets/prime.py:138 +#: iqpilot/ui/layouts/settings/drive_history.py:154 +#, python-brace-format +msgid "ALL TIME" +msgstr "ᴝ荈" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:101 +#, python-brace-format +msgid "AOL" +msgstr "AOL" + +#: system/ui/widgets/network.py:191 +#, python-brace-format +msgid "APN Setting" +msgstr "APN č¨­åŽš" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "AUTH" +msgstr "驗證" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2642 +#, python-brace-format +msgid "AUTO" +msgstr "č‡Ē動" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:17 +#, python-brace-format +msgid "Acceleration Bar" +msgstr "加速åēĻæĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:219 +#, python-brace-format +msgid "Acceleration Meter" +msgstr "加速åēĻ計" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:109 +#, python-brace-format +msgid "Acknowledge Excessive Actuation" +msgstr "įĸēčĒéŽåēĻäŊœå‹•" + +#: system/ui/widgets/esim.py:164 system/ui/widgets/esim.py:180 +#, python-brace-format +msgid "Activate" +msgstr "å•Ÿį”¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1695 +#, python-brace-format +msgid "Active Model" +msgstr "į›Žå‰æ¨Ąåž‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2297 +#, python-brace-format +msgid "Active above {} only." +msgstr "僅在é̘æ–ŧ {} æ™‚å•Ÿį”¨ã€‚" + +#: system/ui/widgets/esim.py:64 +#, python-brace-format +msgid "Add Profile" +msgstr "新åĸžč¨­åޚæĒ”" + +#: system/ui/widgets/esim.py:96 +#, python-brace-format +msgid "Add eSIM Profile" +msgstr "新åĸž eSIM č¨­åŽšæĒ”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:869 +#, python-brace-format +msgid "Adjust Lane Turn Desire Speed" +msgstr "čĒŋ整čģŠé“čŊ‰åŊŽæ„åœ–速åēĻ" + +#: system/ui/widgets/network.py:98 +#, python-brace-format +msgid "Advanced" +msgstr "進階" + +#: system/ui/widgets/esim.py:232 +#, python-brace-format +msgid "" +"After this, you must use your own eSIM profile.\n" +"\n" +"You cannot use Comma Prime again unless you buy a new SIM from comma." +msgstr "" +"䚋垌äŊ åŋ…é ˆäŊŋᔍč‡Ēåˇąįš„ eSIM č¨­åŽšæĒ”。\n" +"\n" +"除非向 comma čŗŧč˛ˇæ–°įš„ SIM åĄīŧŒåĻå‰‡į„Ąæŗ•å†æŦĄäŊŋᔍ Comma Prime。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Aggressive" +msgstr "įŠæĨĩ" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:117 +#, python-brace-format +msgid "Agree" +msgstr "同意" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "All" +msgstr "全部" + +#: iqpilot/ui/layouts/settings/iq_panels.py:494 +#, python-brace-format +msgid "All states (~6.0 GB)" +msgstr "æ‰€æœ‰åˇžīŧˆį´„ 6.0 GBīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2356 +msgid "" +"Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended" +" Hold without Auto Resume Volkswagen MQB vehicles." +msgstr "å…č¨ą IQ.Pilot 在支援「åģļ長駐čģŠä¸”į„Ąč‡Ē動čĩˇæ­Ĩ」FtS įš„ Volkswagen MQB čģŠčŧ›ä¸ŠäŊŋᔍ MQB ACC æĸåžŠčĄŒį‚ē。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2352 +msgid "" +"Allow lateral control (steering) to remain active even when longitudinal " +"control (gas/brake) is temporarily unavailable due to a cruise control " +"fault." +msgstr "å…č¨ąå´å‘æŽ§åˆļīŧˆčŊ‰å‘īŧ‰åœ¨å› åˇĄčˆĒįŗģįĩąæ•…éšœå°Žč‡´į¸ąå‘æŽ§åˆļīŧˆæ˛šé–€/į…žčģŠīŧ‰æšĢæ™‚į„Ąæŗ•äŊŋį”¨æ™‚äģäŋæŒå•Ÿį”¨ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:843 +#, python-brace-format +msgid "Always on Lateral (AOL)" +msgstr "æŠĢ向控åˆļ常開 (AOL)" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "And so much more" +msgstr "還有更多功čƒŊ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2592 +#, python-brace-format +msgid "Applies right away." +msgstr "įĢ‹åŗį”Ÿæ•ˆã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2593 +#, python-brace-format +msgid "Applies the next time the device goes offroad." +msgstr "å°‡åœ¨čŖįŊŽä¸‹æŦĄé€˛å…Ĩ駐č슿™‚į”Ÿæ•ˆã€‚" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#, python-brace-format +msgid "Are you sure you want to power off?" +msgstr "įĸē厚čĻé—œæŠŸå—ŽīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#, python-brace-format +msgid "Are you sure you want to reboot?" +msgstr "įĸē厚čĻé‡æ–°å•Ÿå‹•å—ŽīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1531 +#, python-brace-format +msgid "" +"Are you sure you want to reset all IQ.Pilot settings to default? Once the " +"settings are reset, there is no going back." +msgstr "įĸē厚čρ將 IQ.Pilot įš„æ‰€æœ‰č¨­åŽšé‚„åŽŸį‚ē預設å€ŧ嗎īŧŸč¨­åŽšä¸€įļ“é‡č¨­äžŋį„Ąæŗ•åžŠåŽŸã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#, python-brace-format +msgid "Are you sure you want to reset calibration?" +msgstr "įĸē厚čĻé‡č¨­æ Ąæ­Ŗå—ŽīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Are you sure you want to uninstall?" +msgstr "įĸē厚čĻč§Ŗé™¤åŽ‰čŖå—ŽīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:119 +#, python-brace-format +msgid "Auto" +msgstr "č‡Ē動" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:74 +#, python-brace-format +msgid "Auto Lane Change" +msgstr "č‡Ēå‹•čŽŠæ›čģŠé“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:654 +#, python-brace-format +msgid "Auto Lane Change: Continuous Changes" +msgstr "č‡Ēå‹•čŽŠæ›čģŠé“īŧšé€ŖįēŒčŽŠæ›" + +#: iqpilot/ui/layouts/settings/iq_panels.py:121 +#, python-brace-format +msgid "Auto — Dim" +msgstr "č‡Ē動 — čŽŠæš—" + +#: iqpilot/ui/layouts/settings/iq_panels.py:153 +#, python-brace-format +msgid "Auto-Close Settings" +msgstr "č‡Ēå‹•é—œé–‰č¨­åŽšį•Ģéĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2262 +#, python-brace-format +msgid "" +"Automatically resume from a stop while following traffic, on Subaru " +"platforms where the beta implementation applies." +msgstr "åœ¨éŠį”¨æ­¤ Beta å¯ĻäŊœįš„ Subaru åšŗå°ä¸ŠīŧŒčˇŸčģŠåœæ­ĸ垌č‡Ē動重新čĩˇæ­Ĩ。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:52 +#: iqpilot/ui/layouts/settings/iq_panels.py:712 +#, python-brace-format +msgid "Availability While Cruise Changes" +msgstr "åˇĄčˆĒį‹€æ…‹åˆ‡æ›æ™‚įš„å¯į”¨æ€§" + +#: system/ui/widgets/network.py:96 +#: openpilot/selfdrive/ui/layouts/onboarding.py:148 +#: iqpilot/ui/layouts/settings/iq_panels.py:632 +#: iqpilot/ui/layouts/settings/iq_panels.py:706 +#: iqpilot/ui/layouts/settings/iq_panels.py:1450 +#: iqpilot/ui/layouts/settings/iq_dynamic.py:62 +#, python-brace-format +msgid "Back" +msgstr "čŋ”回" + +#: iqpilot/ui/layouts/settings/iq_panels.py:198 +#, python-brace-format +msgid "Blind Spot Alerts" +msgstr "ᛞéģžæé†’" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:13 +#, python-brace-format +msgid "Blind Spot Warnings" +msgstr "ᛞéģžč­Ļ告" + +#: iqpilot/ui/layouts/settings/iq_panels.py:215 +#, python-brace-format +msgid "Blinker Indicators" +msgstr "æ–šå‘į‡ˆæŒ‡į¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:638 +#, python-brace-format +msgid "Blinker-Initiated Lane Change" +msgstr "į”ąæ–šå‘į‡ˆč§¸į™ŧįš„čŽŠæ›čģŠé“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1412 +#, python-brace-format +msgid "Boot State" +msgstr "é–‹æŠŸåžŒį‹€æ…‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:54 +#: iqpilot/ui/layouts/settings/iq_panels.py:724 +#, python-brace-format +msgid "Brake Response Mode" +msgstr "į…žčģŠåæ‡‰æ¨Ąåŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:203 +#, python-brace-format +msgid "" +"Bring back the classic UI's wide offroad status strip: temperature, vehicle," +" and Konn3kt state at a glance." +msgstr "æĸ垊įļ“å…¸äģ‹éĸįš„å¯Ŧį‰ˆé§čģŠį‹€æ…‹åˆ—īŧšæēĢåēĻ、čģŠčŧ›čˆ‡ Konn3kt į‹€æ…‹ä¸€į›Žäē†į„ļ。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1254 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "CHANGE" +msgstr "čŽŠæ›´" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#: openpilot/selfdrive/ui/layouts/settings/software.py:148 +#: openpilot/selfdrive/ui/layouts/settings/software.py:159 +#: openpilot/selfdrive/ui/layouts/settings/software.py:188 +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "CHECK" +msgstr "æĒĸæŸĨ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1710 +#, python-brace-format +msgid "CLEAR" +msgstr "清除" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "CONNECT" +msgstr "é€Ŗįˇš" + +#: system/ui/widgets/network.py:437 +#, python-brace-format +msgid "CONNECTING..." +msgstr "é€Ŗįˇšä¸­..." + +#: system/ui/widgets/confirm_dialog.py:35 +#: system/ui/widgets/option_dialog.py:61 system/ui/widgets/esim.py:136 +#: system/ui/widgets/esim.py:206 system/ui/widgets/esim.py:217 +#: system/ui/widgets/esim.py:230 system/ui/widgets/network.py:380 +#: system/ui/widgets/keyboard.py:92 +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Cancel" +msgstr "取æļˆ" + +#: openpilot/selfdrive/ui/layouts/nav.py:459 +#, python-brace-format +msgid "Cancel navigation" +msgstr "取æļˆå°ŽčˆĒ" + +#: system/ui/widgets/network.py:186 +#, python-brace-format +msgid "Cellular Metered" +msgstr "čĄŒå‹•įļ˛čˇ¯č¨ˆé‡" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:72 +#: iqpilot/ui/layouts/settings/iq_panels.py:1420 +#, python-brace-format +msgid "Change Language" +msgstr "čŽŠæ›´čĒžč¨€" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:163 +#, python-brace-format +msgid "Changing this setting will restart IQ.Pilot if the car is powered on." +msgstr "č‹ĨčģŠčŧ›é€šé›ģīŧŒčŽŠæ›´æ­¤č¨­åŽšå°‡é‡æ–°å•Ÿå‹• IQ.Pilot。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:602 +#, python-brace-format +msgid "Checked {}" +msgstr "厞æĒĸæŸĨ {}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1965 +#, python-brace-format +msgid "Choose a Model" +msgstr "é¸æ“‡æ¨Ąåž‹" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:50 +msgid "" +"Choose longitudinal behavior: IQ.Pilot (IQ longitudinal + end-to-end), " +"IQ.Dynamic (IQ longitudinal + dynamic mode), IQ.Chill (IQ longitudinal + " +"relaxed personality), or Stock ACC." +msgstr "" +"é¸æ“‡į¸ąå‘æŽ§åˆļ行į‚ēīŧšIQ.PilotīŧˆIQ į¸ąå‘æŽ§åˆļ + į̝到į̝īŧ‰ã€IQ.DynamicīŧˆIQ į¸ąå‘æŽ§åˆļ + å‹•æ…‹æ¨Ąåŧīŧ‰ã€IQ.ChillīŧˆIQ " +"į¸ąå‘æŽ§åˆļ + čˆ’įˇŠéĸ¨æ ŧīŧ‰æˆ–原åģ  ACC。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2604 +#, python-brace-format +msgid "Chosen manually" +msgstr "手動選擇" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1803 +#, python-brace-format +msgid "Clear Cache" +msgstr "清除åŋĢ取" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1853 +#, python-brace-format +msgid "Clear the selected model cache and download it again?" +msgstr "æ¸…é™¤æ‰€é¸æ¨Ąåž‹įš„åŋĢ取ä¸Ļ重新下čŧ‰īŧŸ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:104 +#, python-brace-format +msgid "Close" +msgstr "關閉" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2245 +msgid "" +"Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its " +"steering command against the curvature the car is actually holding, " +"instead of sending the planned curvature straight through." +msgstr "在 MEB 與 MQB Evo čģŠåž‹ä¸Šé–‰į’°æŽ§åˆļčŊ‰å‘。IQ.Pilot 會䞝據čģŠčŧ›å¯Ļ際įļ­æŒįš„æ›˛įއäŋŽæ­ŖčŊ‰å‘指äģ¤īŧŒč€Œéžį›´æŽĨ送å‡ēčĻåŠƒįš„æ›˛įŽ‡ã€‚" + +#: openpilot/selfdrive/ui/layouts/routes.py:174 +#, python-brace-format +msgid "Cloud" +msgstr "雲į̝" + +#: openpilot/selfdrive/ui/layouts/video_player.py:578 +#: openpilot/selfdrive/ui/layouts/routes.py:101 +#, python-brace-format +msgid "Cloud only" +msgstr "åƒ…é›˛į̝" + +#: openpilot/selfdrive/ui/layouts/video_player.py:610 +#, python-brace-format +msgid "Cloud video unavailable" +msgstr "雲į̝åŊąį‰‡į„Ąæŗ•äŊŋᔍ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2624 +#, python-brace-format +msgid "Colour key for fingerprint state:" +msgstr "æŒ‡į´‹į‹€æ…‹éĄč‰˛čĒĒæ˜Žīŧš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1701 +#, python-brace-format +msgid "Combined Model" +msgstr "合äŊĩæ¨Ąåž‹" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:28 +msgid "" +"Commands a scripted sequence of acceleration steps to measure longitudinal " +"actuator response. Requires IQ.Pilot longitudinal control. Only use on a " +"clear, closed road." +msgstr "åŸˇčĄŒä¸€æŽĩé č¨­įš„åŠ é€ŸéšŽæŽĩåēåˆ—īŧŒäģĨ量æ¸Ŧį¸ąå‘č‡´å‹•å™¨įš„åæ‡‰ã€‚éœ€čĻå•Ÿį”¨ IQ.Pilot į¸ąå‘æŽ§åˆļã€‚åƒ…å¯åœ¨æˇ¨įŠēįš„å°é–‰é“čˇ¯ä¸ŠäŊŋį”¨ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:32 +msgid "" +"Commands a scripted sequence of lateral acceleration steps to measure " +"steering actuator response. Only use on a straight, flat, clear road." +msgstr "åŸˇčĄŒä¸€æŽĩé č¨­įš„å´å‘åŠ é€ŸéšŽæŽĩåēåˆ—īŧŒäģĨ量æ¸ŦčŊ‰å‘č‡´å‹•å™¨įš„åæ‡‰ã€‚åƒ…å¯åœ¨åšŗį›´ä¸”æˇ¨įŠēįš„é“čˇ¯ä¸ŠäŊŋį”¨ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:556 +#: iqpilot/ui/layouts/settings/iq_panels.py:1527 +#: iqpilot/ui/layouts/settings/iq_panels.py:1551 +#: iqpilot/ui/layouts/settings/iq_panels.py:1577 +#: iqpilot/ui/layouts/settings/iq_panels.py:2599 +#, python-brace-format +msgid "Confirm" +msgstr "įĸēčĒ" + +#: system/ui/widgets/esim.py:136 system/ui/widgets/esim.py:217 +#, python-brace-format +msgid "Continue" +msgstr "įšŧįēŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:78 +#, python-brace-format +msgid "Continuous Changes" +msgstr "逪įēŒčŽŠæ›" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Control" +msgstr "控åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:34 +msgid "" +"Controls IQ.Pilot speed limit behavior. Off disables speed limit features, " +"Information only displays limits, Warning highlights overspeed, and Control " +"adjusts set speed using detected limits." +msgstr "控åˆļ IQ.Pilot å°é€Ÿé™įš„č™•į†æ–šåŧã€‚é—œé–‰æœƒåœį”¨é€Ÿé™åŠŸčƒŊīŧŒčŗ‡č¨Šåƒ…éĄ¯į¤ē速限īŧŒč­Ļ告會標į¤ēčļ…速īŧŒæŽ§åˆļ則䞝åĩæ¸Ŧåˆ°įš„é€Ÿé™čĒŋæ•´č¨­åŽščģŠé€Ÿã€‚" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:89 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:212 +#, python-brace-format +msgid "Couldn't fetch SSH keys - see logs" +msgstr "į„Ąæŗ•å–åž— SSH 金鑰 - čĢ‹æŸĨįœ‹į´€éŒ„" + +#: openpilot/selfdrive/ui/layouts/nav.py:332 +#, python-brace-format +msgid "Couldn't locate that place" +msgstr "æ‰žä¸åˆ°čŠ˛åœ°éģž" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:86 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:208 +#, python-brace-format +msgid "Couldn't reach GitHub - check connection" +msgstr "į„Ąæŗ•é€Ŗįˇš GitHub - čĢ‹æĒĸæŸĨįļ˛čˇ¯é€Ŗįˇš" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:83 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:204 +#, python-brace-format +msgid "Couldn't verify GitHub - check device time" +msgstr "į„Ąæŗ•éŠ—č­‰ GitHub - čĢ‹æĒĸæŸĨčŖįŊŽæ™‚é–“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#, python-brace-format +msgid "Country" +msgstr "國åŽļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "Crash Log" +msgstr "į•ļæŠŸį´€éŒ„" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2234 +#, python-brace-format +msgid "Creep from Standstill (Beta)" +msgstr "靜æ­ĸčĩˇæ­ĨæŊ›čĄŒīŧˆBetaīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2237 +#, python-brace-format +msgid "Creep from Standstill — Manual Handbrake (Beta)" +msgstr "靜æ­ĸčĩˇæ­ĨæŊ›čĄŒ — æ‰‹å‹•æ‰‹į…žčģŠīŧˆBetaīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2096 +msgid "Cruise" +msgstr "åˇĄčˆĒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:74 +#, python-brace-format +msgid "Current Version" +msgstr "į›Žå‰į‰ˆæœŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2288 +#, python-brace-format +msgid "Curvature Controller" +msgstr "æ›˛įŽ‡æŽ§åˆļ器" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#: iqpilot/ui/layouts/settings/iq_panels.py:449 +#, python-brace-format +msgid "DELETE" +msgstr "åˆĒ除" + +#: system/ui/widgets/network.py:445 +#, python-brace-format +msgid "DISCONNECTING..." +msgstr "æ­Ŗåœ¨ä¸­æ–ˇé€Ŗįˇšâ€Ļ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:151 +#, python-brace-format +msgid "DOWNLOAD" +msgstr "下čŧ‰" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:116 +#, python-brace-format +msgid "Decline" +msgstr "拒įĩ•" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:149 +#, python-brace-format +msgid "Decline, uninstall IQ.Pilot" +msgstr "拒įĩ•ä¸Ļč§Ŗé™¤åŽ‰čŖ IQ.Pilot" + +#: iqpilot/ui/layouts/settings/iq_panels.py:140 +#: iqpilot/ui/layouts/settings/iq_panels.py:156 +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Default" +msgstr "預設" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:303 +#: iqpilot/ui/layouts/settings/iq_panels.py:1949 +#: iqpilot/ui/layouts/settings/iq_panels.py:1998 +#: iqpilot/ui/layouts/settings/iq_panels.py:2002 +#, python-brace-format +msgid "Default (CD210)" +msgstr "預設īŧˆCD210īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1509 +#, python-brace-format +msgid "Default: comes up ready to drive, engagement available straight away." +msgstr "預設īŧšé–‹æŠŸåžŒåŗå¯čĄŒé§›īŧŒéš¨æ™‚čƒŊ夠æŽĨįŽĄã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:640 +#, python-brace-format +msgid "" +"Delay before a blinker-triggered lane change starts on its own — no wheel " +"nudge needed once a delay is set (default is Nudge).
    Use the blinker for " +"this only when traffic and the road actually allow the maneuver." +msgstr "" +"į”ąæ–šå‘į‡ˆč§¸į™ŧįš„čŽŠæ›čģŠé“č‡ĒčĄŒé–‹å§‹å‰įš„åģļé˛â€”â€”č¨­åŽšåģļé˛åžŒäžŋį„Ąéœ€čŧ•æŽ¨æ–šå‘į›¤īŧˆé č¨­į‚ēčŧ•æŽ¨æ–šå‘į›¤īŧ‰ã€‚
    僅在č슿ĩčˆ‡čˇ¯æŗįĸēå¯Ļå…č¨ąčŠ˛å‹•äŊœæ™‚æ‰į”¨æ–šå‘į‡ˆč§¸į™ŧ。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:77 +#, python-brace-format +msgid "Delay with Blind Spot" +msgstr "ᛞéģžåģļ遲" + +#: system/ui/widgets/esim.py:169 system/ui/widgets/esim.py:186 +#: system/ui/widgets/esim.py:206 +#, python-brace-format +msgid "Delete" +msgstr "åˆĒ除" + +#: system/ui/widgets/esim.py:207 +#, python-brace-format +msgid "Delete disabled profile \"{}\"?" +msgstr "åˆĒé™¤åˇ˛åœį”¨įš„č¨­åŽšæĒ”「{}」īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Delete this log?" +msgstr "åˆĒé™¤æ­¤į´€éŒ„īŧŸ" + +#: openpilot/selfdrive/ui/layouts/nav.py:351 +#, python-brace-format +msgid "Destination set" +msgstr "åˇ˛č¨­åŽšį›Žįš„åœ°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2603 +#, python-brace-format +msgid "Detected automatically" +msgstr "č‡Ēå‹•čž¨č­˜" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:61 +#: iqpilot/ui/layouts/settings/iq_panels.py:2100 +msgid "Developer" +msgstr "開į™ŧäēēå“Ą" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:57 +#: iqpilot/ui/layouts/settings/iq_panels.py:2091 +msgid "Device" +msgstr "čŖįŊŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:165 +#, python-brace-format +msgid "Device must be registered with Konn3kt to pair." +msgstr "čŖįŊŽåŋ…é ˆåˇ˛åœ¨ Konn3kt č¨ģ冊才čƒŊ配對。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:148 +#, python-brace-format +msgid "Dim Delay" +msgstr "čŽŠæš—åģļ遲" + +#: system/ui/widgets/network.py:544 +#, python-brace-format +msgid "Disconnect" +msgstr "ä¸­æ–ˇé€Ŗįˇš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +#, python-brace-format +msgid "Disengage" +msgstr "觪除" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:547 +#: iqpilot/ui/layouts/settings/iq_panels.py:1538 +#, python-brace-format +msgid "Disengage before forcing offroad" +msgstr "åŧˇåˆļ駐čģŠå‰čĢ‹å…ˆč§Ŗé™¤æŽĨįŽĄ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1556 +#, python-brace-format +msgid "Disengage before forcing on-road" +msgstr "åŧˇåˆļ行čģŠå‰čĢ‹å…ˆč§Ŗé™¤æŽĨįŽĄ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:67 +#, python-brace-format +msgid "Disengage on Accelerator Pedal" +msgstr "č¸Šä¸‹åŠ é€Ÿč¸æŋ時č„Ģé›ĸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:536 +#: openpilot/selfdrive/ui/layouts/settings/device.py:188 +#, python-brace-format +msgid "Disengage to Power Off" +msgstr "č„Ģé›ĸäģĨ關抟" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:525 +#: openpilot/selfdrive/ui/layouts/settings/device.py:176 +#, python-brace-format +msgid "Disengage to Reboot" +msgstr "č„Ģé›ĸäģĨ重新啟動" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:107 +#, python-brace-format +msgid "Disengage to Reset Calibration" +msgstr "č„Ģé›ĸäģĨé‡č¨­æ Ąæ­Ŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:79 +#, python-brace-format +msgid "Disengage to {}" +msgstr "觪除æŽĨįŽĄäģĨ{}" + +#: iqpilot/ui/layouts/settings/iq_panels.py:690 +msgid "Disengage: braking shuts steering assistance off entirely." +msgstr "觪除īŧšį…žč슿œƒåŽŒå…¨é—œé–‰čŊ‰å‘čŧ”劊。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:260 +#, python-brace-format +msgid "Display" +msgstr "éĄ¯į¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:138 +#, python-brace-format +msgid "Display Brightness" +msgstr "čžĸåš•äēŽåēĻ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:43 +msgid "Display speed in km/h instead of mph." +msgstr "äģĨ km/h éĄ¯į¤ē速åēĻīŧˆéž mphīŧ‰ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Distance" +msgstr "距é›ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:300 +#, python-brace-format +msgid "Do you want to upload driver camera data?" +msgstr "是åĻä¸Šå‚ŗé§•é§›į›ŖæŽ§éĄé ­čŗ‡æ–™īŧŸ" + +#: system/ui/widgets/keyboard.py:121 +#, python-brace-format +msgid "Done" +msgstr "厌成" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#, python-brace-format +msgid "Dongle ID" +msgstr "Dongle ID" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:75 +#, python-brace-format +msgid "Download" +msgstr "下čŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:557 +#, python-brace-format +msgid "Download failed — try again." +msgstr "下čŧ‰å¤ąæ•— — čĢ‹å†čŠĻ一æŦĄã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:415 +#, python-brace-format +msgid "Downloading Map Tiles" +msgstr "æ­Ŗåœ¨ä¸‹čŧ‰åœ°åœ–åœ–įŖš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:220 +#, python-brace-format +msgid "" +"Draw a bar along the left edge tracking measured acceleration and braking — " +"what the car is actually doing right now, not the planner's request." +msgstr "æ˛ŋåˇĻå´é‚ŠįˇŖįšĒčŖŊ一æĸéĄ¯į¤ēå¯Ļæ¸ŦåŠ é€Ÿčˆ‡į…žčģŠįš„镡æĸâ€”â€”äšŸå°ąæ˜¯čģŠčŧ›æ­¤åˆģå¯Ļéš›įš„å‹•äŊœīŧŒč€ŒéžčĻåŠƒå™¨įš„čĻæą‚ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:408 +#, python-brace-format +msgid "" +"Draw the on-screen map from tiles stored on the device. Combined with " +"Online, stored tiles take over the moment connectivity drops. Tiles come " +"down with your selected region." +msgstr "äģĨčŖįŊŽä¸Šå„˛å­˜įš„åœ–įŖšįšĒčŖŊčžĸåš•åœ°åœ–ã€‚čˆ‡įˇšä¸Šæ¨Ąåŧæ­é…æ™‚īŧŒä¸€æ—Ļé€Ŗįˇšä¸­æ–ˇäžŋįĢ‹åŗį”ąåˇ˛å„˛å­˜įš„åœ–įŖšæŽĨæ‰‹ã€‚åœ–įŖšæœƒäžäŊ é¸æ“‡įš„區域下čŧ‰ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#, python-brace-format +msgid "Driver Camera" +msgstr "čģŠå…§éĄé ­" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "Driver Camera Check" +msgstr "é§•é§›į›ŖæŽ§éĄé ­æĒĸæŸĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:23 +#: iqpilot/ui/layouts/settings/iq_panels.py:717 +#, python-brace-format +msgid "Driver Intervention Handling" +msgstr "駕駛äģ‹å…Ĩ處ᐆ" + +#: openpilot/selfdrive/ui/widgets/prime.py:181 +#: iqpilot/ui/layouts/settings/drive_history.py:99 +#, python-brace-format +msgid "Drives" +msgstr "čĄŒį¨‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:143 +#, python-brace-format +msgid "Driving Brightness" +msgstr "čĄŒé§›æ™‚äēŽåēĻ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:111 +#, python-brace-format +msgid "Driving Personality" +msgstr "駕駛éĸ¨æ ŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Dynamic" +msgstr "動態" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2182 +#, python-brace-format +msgid "Dynamic tuning: livelier gas/brake response." +msgstr "動態čĒŋæ Ąīŧšæ˛šé–€čˆ‡į…žčģŠåæ‡‰æ›´éˆæ•ã€‚" + +#: system/ui/widgets/network.py:175 system/ui/widgets/network.py:191 +#, python-brace-format +msgid "EDIT" +msgstr "ᎍčŧ¯" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "ERROR" +msgstr "錯čǤ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:57 +msgid "ETH" +msgstr "ETH" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:339 +#: iqpilot/ui/layouts/settings/iq_panels.py:2341 +#, python-brace-format +msgid "Enable" +msgstr "å•Ÿį”¨" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:46 +#, python-brace-format +msgid "Enable ADB" +msgstr "å•Ÿį”¨ ADB" + +#: iqpilot/ui/layouts/settings/iq_panels.py:836 +#, python-brace-format +msgid "" +"Enable Always on Lateral (AOL). Disable this toggle to return to stock " +"IQ.Pilot steering engagement behavior." +msgstr "å•Ÿį”¨ Always on LateralīŧˆAOLīŧ‰ã€‚關閉此開關可回到 IQ.Pilot 原æœŦįš„čŊ‰å‘æŽĨįŽĄæ–šåŧã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:79 +#, python-brace-format +msgid "Enable Dashcam" +msgstr "å•Ÿį”¨čĄŒčģŠč¨˜éŒ„器" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:73 +#, python-brace-format +msgid "Enable Lane Departure Warnings" +msgstr "å•Ÿį”¨åé›ĸčģŠé“č­Ļį¤ē" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2359 +msgid "" +"Enable MQB steering lockout handling on Volkswagen MQB vehicles with low " +"speed LKAS faults." +msgstr "į‚ēäŊŽé€Ÿå‡ēįž LKAS æ•…éšœįš„ Volkswagen MQB čģŠčŧ›å•Ÿį”¨ MQB čŊ‰å‘éŽ–åŽšč™•į†ã€‚" + +#: system/ui/widgets/network.py:181 +#, python-brace-format +msgid "Enable Roaming" +msgstr "å•Ÿį”¨æŧĢ遊" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:63 +#, python-brace-format +msgid "Enable SSH" +msgstr "å•Ÿį”¨ SSH" + +#: system/ui/widgets/network.py:172 +#, python-brace-format +msgid "Enable Tethering" +msgstr "å•Ÿį”¨įļ˛čˇ¯å…ąäēĢ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:40 +msgid "Enable driver monitoring even when IQ.Pilot is not engaged." +msgstr "åŗäŊŋæœĒ啟動 IQ.Pilot äēĻå•Ÿį”¨é§•é§›į›ŖæŽ§ã€‚" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "Enter APN" +msgstr "čŧ¸å…Ĩ APN" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "Enter Activation Code" +msgstr "čŧ¸å…Ĩå•Ÿį”¨įĸŧ" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Enter Code" +msgstr "čŧ¸å…Ĩå•Ÿį”¨įĸŧ" + +#: system/ui/widgets/network.py:293 +#, python-brace-format +msgid "Enter SSID" +msgstr "čŧ¸å…Ĩ SSID" + +#: openpilot/selfdrive/ui/layouts/nav.py:300 +#, python-brace-format +msgid "Enter an address or place" +msgstr "čŧ¸å…Ĩ地址或地éģž" + +#: system/ui/widgets/network.py:306 +#, python-brace-format +msgid "Enter new tethering password" +msgstr "čŧ¸å…Ĩæ–°įš„įļ˛čˇ¯å…ąäēĢ密įĸŧ" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Enter password" +msgstr "čŧ¸å…Ĩ密įĸŧ" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:155 +#, python-brace-format +msgid "Enter your GitHub username" +msgstr "čŧ¸å…Ĩæ‚¨įš„ GitHub äŊŋį”¨č€…åį¨ą" + +#: system/ui/widgets/list_view.py:126 system/ui/widgets/list_view.py:171 +#, python-brace-format +msgid "Error" +msgstr "錯čǤ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Exit Offroad Mode" +msgstr "é›ĸ開駐č슿¨Ąåŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:202 +#, python-brace-format +msgid "Expanded Status Bar" +msgstr "åģļäŧ¸į‹€æ…‹åˆ—" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:90 +#, python-brace-format +msgid "Experimental Lead MPC" +msgstr "å¯Ļ銗性前čģŠ MPC" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:24 +msgid "" +"Exposes a snapshot of recent dashcam clips and logs as a USB drive when " +"connected to a computer. IQ.Pilot keeps running while this is enabled." +msgstr "逪æŽĨé›ģč…Ļ時īŧŒå°‡æœ€čŋ‘įš„čĄŒčģŠč¨˜éŒ„ቇæŽĩčˆ‡į´€éŒ„äģĨ USB 隨čēĢįĸŸåŊĸåŧæäž›ã€‚å•Ÿį”¨æœŸé–“ IQ.Pilot äģæœƒæŒįēŒé‹äŊœã€‚" + +#: system/ui/widgets/network.py:441 +#, python-brace-format +msgid "FORGETTING..." +msgstr "æ­Ŗåœ¨éēåŋ˜..." + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:234 +#, python-brace-format +msgid "" +"Factory Toyota longitudinal control is currently enforced. Choose an IQ " +"longitudinal mode to disable it." +msgstr "į›Žå‰åŧˇåˆļäŊŋᔍ Toyota 原åģ į¸ąå‘控åˆļã€‚é¸æ“‡ä¸€į¨Ž IQ į¸ąå‘æ¨Ąåŧåŗå¯åœį”¨ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2181 +#, python-brace-format +msgid "Factory-default longitudinal tuning." +msgstr "原åģ é č¨­įš„į¸ąå‘čĒŋæ Ąã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:308 +#, python-brace-format +msgid "Favorites" +msgstr "æ”ļ藏" + +#: iqpilot/ui/layouts/settings/iq_panels.py:414 +#, python-brace-format +msgid "Fetching Map" +msgstr "æ­Ŗåœ¨å–åž—åœ°åœ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:564 +#, python-brace-format +msgid "Fetching Maps..." +msgstr "æ­Ŗåœ¨å–åž—åœ°åœ–â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:168 +#, python-brace-format +msgid "Final Warning" +msgstr "最垌č­Ļ告" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2581 +#, python-brace-format +msgid "Find your vehicle" +msgstr "尋扞äŊ įš„čģŠčŧ›" + +#: openpilot/selfdrive/ui/widgets/setup.py:48 +#, python-brace-format +msgid "Finish Setup" +msgstr "åŽŒæˆč¨­åŽš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:199 +#, python-brace-format +msgid "" +"Flashes a side warning whenever the car reports something sitting in your " +"blind spot (BSM-equipped cars only)." +msgstr "į•ļčģŠčŧ›å›žå ąį›˛éģžå…§æœ‰į‰ŠéĢ”æ™‚īŧŒé–ƒįˆéĄ¯į¤ē側向č­Ļ告īŧˆåƒ…限配備 BSM įš„čģŠčŧ›īŧ‰ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2252 +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "" +"Flip on Always Offroad from the Device panel, or power the car down, to " +"change this." +msgstr "åĻ‚éœ€čŽŠæ›´īŧŒčĢ‹åœ¨ã€ŒčŖįŊŽã€éĸæŋ中開啟始įĩ‚駐čģŠīŧŒæˆ–ᆄįĢ關閉čģŠčŧ›ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:84 +#, python-brace-format +msgid "Follow Distance" +msgstr "莟čģŠčˇé›ĸ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:198 +#, python-brace-format +msgid "Follow the prompts in the app to finish pairing" +msgstr "äžį…§æ‡‰į”¨į¨‹åŧįš„æŒ‡į¤ē厌成配對" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1569 +#, python-brace-format +msgid "" +"Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled " +"automatically and it will return to offroad after the timer." +msgstr "åŧˇåˆļ IQ.Pilot 進å…Ĩ行čģŠ 10 分鐘īŧŸįŗģįĩ࿜ƒč‡Ēå‹•å•Ÿį”¨å§‹įĩ‚駐čģŠīŧŒč¨ˆæ™‚įĩæŸåžŒčŖįŊŽå°‡čŋ”回駐čģŠã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:133 +#, python-brace-format +msgid "Force Mici UI" +msgstr "åŧˇåˆļäŊŋᔍ Mici äģ‹éĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1392 +#: iqpilot/ui/layouts/settings/iq_panels.py:1620 +#, python-brace-format +msgid "Force On-Road (10 min)" +msgstr "åŧˇåˆļ行čģŠīŧˆ10 分鐘īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1560 +#, python-brace-format +msgid "Force On-Road can only be started while offroad" +msgstr "åĒčƒŊ在駐čģŠį‹€æ…‹ä¸‹å•Ÿå‹•åŧˇåˆļ行čģŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1567 +#, python-brace-format +msgid "Force On-Road is already active. Reset the timer to 10 minutes?" +msgstr "åŧˇåˆļ行čģŠåˇ˛åœ¨åŸˇčĄŒã€‚čĻå°‡č¨ˆæ™‚é‡č¨­į‚ē 10 分鐘嗎īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1617 +#, python-brace-format +msgid "Forced On-Road Active" +msgstr "åŧˇåˆļ行čģŠåˇ˛å•Ÿį”¨" + +#: system/ui/widgets/network.py:380 system/ui/widgets/network.py:541 +#, python-brace-format +msgid "Forget" +msgstr "åŋ˜č¨˜" + +#: system/ui/widgets/network.py:381 +#, python-brace-format +msgid "Forget Wi-Fi Network \"{}\"?" +msgstr "čρåŋ˜č¨˜ Wi‑Fi įļ˛čˇ¯ã€Œ{}」嗎īŧŸ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#, python-brace-format +msgid "GOOD" +msgstr "艝åĨŊ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:92 +#, python-brace-format +msgid "Git Auth" +msgstr "Git 驗證" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:257 +#, python-brace-format +msgid "Git token / password" +msgstr "Git æŦŠæ– / 密įĸŧ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "Git username" +msgstr "Git äŊŋį”¨č€…åį¨ą" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:79 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:200 +#, python-brace-format +msgid "GitHub error ({}) fetching keys" +msgstr "取垗金鑰時į™ŧį”Ÿ GitHub 錯čǤīŧˆ{}īŧ‰" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "HIGH" +msgstr "é̘" + +#: system/ui/widgets/network.py:207 +#, python-brace-format +msgid "Hidden Network" +msgstr "隱藏įļ˛čˇ¯" + +#: iqpilot/ui/layouts/settings/iq_panels.py:648 +#, python-brace-format +msgid "Hold Lane Change for Blind Spot" +msgstr "ᛞéģžæœ‰č슿™‚æšĢįˇŠčŽŠæ›čģŠé“" + +#: system/ui/widgets/esim_scanner.py:108 +#, python-brace-format +msgid "Hold steady..." +msgstr "čĢ‹äŋæŒįŠŠåŽšâ€Ļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:649 +#, python-brace-format +msgid "" +"Hold the automatic lane change while blind spot monitoring reports a car in " +"the target lane, releasing it once the lane is clear." +msgstr "į•ļᛞéģžåĩæ¸Ŧå›žå ąį›Žæ¨™čģŠé“有č슿™‚æšĢįˇŠč‡Ēå‹•čŽŠæ›čģŠé“īŧŒåž…čģŠé“æˇ¨įŠēåžŒå†åŸˇčĄŒã€‚" + +#: openpilot/selfdrive/ui/layouts/nav.py:469 +#, python-brace-format +msgid "Home" +msgstr "äŊåŽļ" + +#: openpilot/selfdrive/ui/widgets/prime.py:183 +#: iqpilot/ui/layouts/settings/drive_history.py:101 +#, python-brace-format +msgid "Hours" +msgstr "小時" + +#: iqpilot/ui/layouts/settings/iq_panels.py:154 +#, python-brace-format +msgid "" +"How long the settings screen may sit untouched before it closes itself." +msgstr "č¨­åŽšį•Ģéĸåœ¨į„Ąäēēæ“äŊœå¤šäš…垌č‡Ē動關閉。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:878 +#, python-brace-format +msgid "" +"How much lead time to add on top of the car's own steering rack delay while " +"self-tuning is off. Default is 0.2 s." +msgstr "č‡Ēå‹•æ Ąæē–關閉時īŧŒåœ¨čģŠčŧ›æœŦčēĢįš„čŊ‰å‘抟åģļé˛äš‹ä¸ŠéĄå¤–åĸžåŠ įš„æå‰é‡ã€‚é č¨­į‚ē 0.2 į§’ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#: openpilot/selfdrive/ui/layouts/settings/software.py:177 +#, python-brace-format +msgid "INSTALL" +msgstr "åŽ‰čŖ" + +#: system/ui/widgets/network.py:202 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#, python-brace-format +msgid "IP Address" +msgstr "IP äŊå€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:41 +#, python-brace-format +msgid "IQ Force Stops" +msgstr "IQ åŧˇåˆļ停čģŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/iq_widgets.py:102 +#, python-brace-format +msgid "IQ Mode" +msgstr "IQ æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:236 +#, python-brace-format +msgid "" +"IQ longitudinal modes are unavailable for this vehicle. Stock ACC is the " +"only available option." +msgstr "æ­¤čģŠčŧ›į„Ąæŗ•äŊŋᔍ IQ į¸ąå‘æ¨Ąåŧã€‚原åģ  ACC æ˜¯å”¯ä¸€å¯į”¨é¸é …ã€‚" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:65 +#, python-brace-format +msgid "IQ.DYNAMIC" +msgstr "IQ.DYNAMIC" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#: iqpilot/ui/layouts/settings/iq_panels.py:1081 +#, python-brace-format +msgid "IQ.Dynamic" +msgstr "IQ.Dynamic" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:33 +#, python-brace-format +msgid "IQ.Dynamic Curves" +msgstr "IQ.Dynamic åŊŽé“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:39 +#, python-brace-format +msgid "IQ.Dynamic Lead Speed" +msgstr "IQ.Dynamic 前čģŠčģŠé€Ÿ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:38 +#, python-brace-format +msgid "IQ.Dynamic Low Speed" +msgstr "IQ.Dynamic äŊŽé€Ÿ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:36 +#, python-brace-format +msgid "IQ.Dynamic Model Stops" +msgstr "IQ.Dynamic æ¨Ąåž‹åœčģŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:37 +#, python-brace-format +msgid "IQ.Dynamic SLC Fallback" +msgstr "IQ.Dynamic SLC 備援" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:34 +#, python-brace-format +msgid "IQ.Dynamic Slower Lead" +msgstr "IQ.Dynamic 前čģŠčŧƒæ…ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:35 +#, python-brace-format +msgid "IQ.Dynamic Stopped Lead" +msgstr "IQ.Dynamic 前čģŠéœæ­ĸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1263 +#, python-brace-format +msgid "IQ.OS Version" +msgstr "IQ.OS į‰ˆæœŦ" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:67 +#, python-brace-format +msgid "IQ.PILOT" +msgstr "IQ.PILOT" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Pilot" +msgstr "IQ.Pilot" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:51 +#, python-brace-format +msgid "IQ.Pilot Unavailable" +msgstr "IQ.Pilot į„Ąæŗ•äŊŋᔍ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:169 +#, python-brace-format +msgid "" +"IQ.Pilot is continuously calibrating, resetting is rarely required. " +"Resetting calibration will restart IQ.Pilot if the car is powered on." +msgstr "IQ.Pilot 會持į猿 Ąæ­ŖīŧŒé€šå¸¸ä¸éœ€é‡č¨­ã€‚č‹ĨčģŠčŧ›é€šé›ģīŧŒé‡č¨­æ Ąæ­Ŗå°‡é‡æ–°å•Ÿå‹• IQ.Pilot。" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:30 +msgid "" +"IQ.Pilot requires the device to be mounted within 4° left or right and " +"within 5° up or 9° down." +msgstr "IQ.Pilot čĻæą‚čŖįŊŽåŽ‰čŖåœ¨åˇĻåŗ 4°、上 5° 或下 9° äģĨ內。" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:69 +#, python-brace-format +msgid "IQ.STANDARD" +msgstr "IQ.STANDARD" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "IQ.Chill" +msgstr "IQ.Chill" + +#: iqpilot/ui/layouts/settings/iq_panels.py:863 +#, python-brace-format +msgid "" +"If you're driving at 20 mph (32 km/h) or below and have your blinker on, the" +" car will plan a turn in that direction at the nearest drivable path. This " +"prevents situations (like at red lights) where the car might plan the wrong " +"turn direction." +msgstr "" +"į•ļčģŠé€Ÿåœ¨æ¯å°æ™‚ 20 英里īŧˆ32 å…Ŧ里īŧ‰äģĨä¸‹ä¸”é–‹å•Ÿæ–šå‘į‡ˆæ™‚īŧŒčģŠčŧ›æœƒåœ¨æœ€čŋ‘įš„å¯čĄŒé§›čˇ¯åž‘ä¸ŠčĻåŠƒæœčŠ˛æ–šå‘čŊ‰åŊŽã€‚這可éŋå…åœ¨į´…į‡ˆį­‰æƒ…æŗä¸‹čģŠčŧ›čĻåŠƒå‡ē錯čǤčŊ‰åŊŽæ–šå‘。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#, python-brace-format +msgid "Info" +msgstr "čŗ‡č¨Š" + +#: system/ui/widgets/esim.py:245 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:187 +#, python-brace-format +msgid "" +"Insert the original comma SIM card that came with the device to use eSIM" +msgstr "čĢ‹æ’å…ĨčŖįŊŽéš¨é™„įš„åŽŸåģ  comma SIM åĄäģĨäŊŋᔍ eSIM" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:78 +#, python-brace-format +msgid "Install Update" +msgstr "åŽ‰čŖæ›´æ–°" + +#: system/ui/widgets/esim_scanner.py:93 +#, python-brace-format +msgid "Invalid QR code" +msgstr "QR Code į„Ąæ•ˆ" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "KM" +msgstr "å…Ŧ里" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:168 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#: openpilot/selfdrive/ui/layouts/home.py:659 +#, python-brace-format +msgid "KONN3KT" +msgstr "KONN3KT" + +#: openpilot/selfdrive/ui/layouts/home.py:629 +#, python-brace-format +msgid "KONN3KT ERROR" +msgstr "KONN3KT 錯čǤ" + +#: openpilot/selfdrive/ui/layouts/home.py:627 +#, python-brace-format +msgid "KONN3KT OFFLINE" +msgstr "KONN3KT é›ĸ᎚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1391 +#: iqpilot/ui/layouts/settings/iq_panels.py:1595 +#, python-brace-format +msgid "Keep Device Offroad" +msgstr "čŽ“čŖįŊŽäŋæŒé§čģŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2313 +#, python-brace-format +msgid "Keep Factory Gas and Brake" +msgstr "äŋį•™åŽŸåģ æ˛šé–€čˆ‡į…žčģŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2314 +#, python-brace-format +msgid "" +"Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only." +msgstr "æ˛šé–€čˆ‡į…žčģŠäē¤į”ą Toyota 原åģ įŗģįĩąč˛ č˛Ŧīŧ›IQ.Pilot åƒ…č˛ č˛ŦčŊ‰å‘。" + +#: openpilot/selfdrive/ui/widgets/prime.py:84 +#, python-brace-format +msgid "Konn3kt" +msgstr "Konn3kt" + +#: openpilot/selfdrive/ui/widgets/prime.py:61 +#, python-brace-format +msgid "Konn3kt Features:" +msgstr "Konn3kt 功čƒŊīŧš" + +#: openpilot/selfdrive/ui/widgets/prime.py:86 +#, python-brace-format +msgid "Konn3kt Status:" +msgstr "Konn3kt į‹€æ…‹īŧš" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:197 +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:208 +#, python-brace-format +msgid "LIMIT" +msgstr "速限" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:95 +msgid "LOADING" +msgstr "čŧ‰å…Ĩ中" + +#: iqpilot/ui/layouts/settings/iq_panels.py:478 +#, python-brace-format +msgid "LOADING..." +msgstr "æ­Ŗåœ¨čŧ‰å…Ĩâ€Ļ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:60 +msgid "LTE" +msgstr "LTE" + +#: iqpilot/ui/layouts/settings/iq_panels.py:852 +#, python-brace-format +msgid "Lane Change Options" +msgstr "čŽŠæ›čģŠé“選項" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2377 +#, python-brace-format +msgid "Lateral Control When Cruise Faulted" +msgstr "åˇĄčˆĒæ•…éšœæ™‚įš„å´å‘æŽ§åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:78 +#, python-brace-format +msgid "Lateral Maneuver Mode" +msgstr "å´å‘æ“æŽ§æ¨Ąåŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:243 +#, python-brace-format +msgid "Lead Vehicle Readouts" +msgstr "前čģŠčŽ€æ•¸" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1542 +#, python-brace-format +msgid "Leave Always Offroad mode now?" +msgstr "įžåœ¨é›ĸ開始įĩ‚駐č슿¨ĄåŧīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Leave forced-offroad mode now?" +msgstr "įžåœ¨é›ĸ開åŧˇåˆļ駐č슿¨ĄåŧīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:930 +#, python-brace-format +msgid "" +"Let IQ.Pilot measure how long your steering takes to respond and keep that " +"figure up to date. Switch it off to pin the timing yourself." +msgstr "讓 IQ.Pilot 量æ¸ŦäŊ įš„čŊ‰å‘反應時間ä¸Ļ持į猿›´æ–°čŠ˛æ•¸å€ŧã€‚é—œé–‰åžŒå¯į”ąäŊ č‡Ē行å›ēåŽščŠ˛æ™‚é–“ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2296 +#, python-brace-format +msgid "" +"Lets you nudge the wheel while engaged without fully disengaging steering." +msgstr "讓äŊ åœ¨įŗģįĩąæŽĨįŽĄæœŸé–“å¯čŧ•æŽ¨æ–šå‘į›¤īŧŒč€Œä¸æœƒåŽŒå…¨č§Ŗé™¤čŊ‰å‘控åˆļ。" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Live streaming" +msgstr "åŗæ™‚į›´æ’­" + +#: openpilot/selfdrive/ui/layouts/video_player.py:850 +#, python-format, python-brace-format +msgid "Loading %s" +msgstr "æ­Ŗåœ¨čŧ‰å…Ĩ %s" + +#: openpilot/selfdrive/ui/layouts/video_player.py:188 +#, python-brace-format +msgid "Loading video" +msgstr "æ­Ŗåœ¨čŧ‰å…ĨåŊąį‰‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:24 +#, python-brace-format +msgid "Loading..." +msgstr "æ­Ŗåœ¨čŧ‰å…Ĩâ€Ļ" + +#: openpilot/selfdrive/ui/layouts/nav.py:326 +#: openpilot/selfdrive/ui/layouts/nav.py:543 +#, python-brace-format +msgid "Locating..." +msgstr "æ­Ŗåœ¨åŽšäŊâ€Ļ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:699 +#, python-brace-format +msgid "Locked OFF on this platform; the vehicle can't support other choices." +msgstr "æ­¤åšŗå°éŽ–åŽšį‚ē關閉īŧ›čģŠčŧ›ä¸æ”¯æ´å…ļäģ–選項。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:129 +#, python-brace-format +msgid "Longitudinal Control" +msgstr "į¸ąå‘æŽ§åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:207 +#, python-brace-format +msgid "" +"Longitudinal Control modes:
    IQ.Pilot features are listed " +"below:

    IQ.Pilot End-to-End Longitudinal Control


    Let the " +"driving model control the gas and brakes. IQ.Pilot will drive as it thinks a" +" human would, including stopping for red lights and stop signs. Since the " +"driving model decides the speed to drive, the set speed will only act as an " +"upper bound. This feature is still being improved; mistakes should be " +"expected.

    IQ.Dynamic


    Dynamically blends between adaptive " +"cruise behavior and end-to-end behavior based on " +"scene/context.

    IQ.Chill


    Uses standard traffic-aware cruise" +" behavior for longitudinal control.

    New Driving " +"Visualization


    The driving visualization will transition to the road-" +"facing wide-angle camera at low speeds to better show some turns. The " +"IQ.Pilot logo will also be shown in the top right corner." +msgstr "" +"į¸ąå‘æŽ§åˆļæ¨Ąåŧīŧš
    IQ.Pilot įš„åŠŸčƒŊåς䏋īŧš

    IQ.Pilot " +"į̝到įĢ¯į¸ąå‘æŽ§åˆļ


    čŽ“é§•é§›æ¨Ąåž‹æŽ§åˆļæ˛šé–€čˆ‡į…žčģŠã€‚IQ.Pilot " +"æœƒäžį…§åŽƒčĒį‚ēäēēéĄžæœƒæŽĄå–įš„æ–šåŧé§•é§›īŧŒåŒ…æ‹Ŧåœ¨į´…į‡ˆčˆ‡åœæ­ĸ標čĒŒå‰åœčģŠã€‚į”ąæ–ŧčģŠé€Ÿį”ąé§•é§›æ¨Ąåž‹æąē厚īŧŒč¨­åޚčģŠé€Ÿåƒ…äŊœį‚ē上限。此功čƒŊäģåœ¨æ”šé€˛ä¸­īŧŒå¯čƒŊ會å‡ēįžå¤ąčĒ¤ã€‚

    IQ.Dynamic


    äžå ´æ™¯čˆ‡æƒ…åĸƒīŧŒåœ¨ä¸ģ動čģŠčˇåˇĄčˆĒ行į‚ē與į̝到įĢ¯čĄŒį‚ēäš‹é–“å‹•æ…‹æˇˇåˆã€‚

    IQ.Chill


    į¸ąå‘æŽ§åˆļæŽĄį”¨æ¨™æē–įš„éš¨č슿ĩä¸ģ動čģŠčˇåˇĄčˆĒ行į‚ē。

    å…¨æ–°čĄŒčģŠį•Ģéĸ


    äŊŽé€Ÿæ™‚čĄŒčģŠį•Ģéĸæœƒåˆ‡æ›č‡ŗéĸå‘é“čˇ¯įš„åģŖč§’鏡頭īŧŒäģĨäžŋ更清æĨšå‘ˆįžæŸäē›åŊŽé“ã€‚åŗä¸Šč§’ä🿜ƒéĄ¯į¤ē" +" IQ.Pilot 標čĒŒã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:71 +#, python-brace-format +msgid "Longitudinal Maneuver Mode" +msgstr "į¸ąå‘æ“äŊœæ¨Ąåŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2192 +#, python-brace-format +msgid "Longitudinal Tune Profile" +msgstr "į¸ąå‘čĒŋæ Ąč¨­åŽšæĒ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:62 +#, python-brace-format +msgid "Lookahead Higher" +msgstr "提前量åĸžåŠ " + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:63 +#, python-brace-format +msgid "Lookahead Lower" +msgstr "提前量減少" + +#: iqpilot/ui/layouts/settings/iq_panels.py:862 +#, python-brace-format +msgid "Low-Speed Turn Planning" +msgstr "äŊŽé€ŸčŊ‰åŊŽčĻåŠƒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2249 +msgid "" +"Low-pass the planned curvature before it reaches the rack on MEB and MQB " +"Evo vehicles, which damps lateral wobble. On by default for these cars." +msgstr "在 MEB 與 MQB Evo čģŠåž‹ä¸ŠīŧŒčĻåŠƒįš„æ›˛įŽ‡é€åˆ°čŊ‰å‘抟䚋前先įļ“過äŊŽé€šæŋžæŗĸīŧŒæŠ‘åˆļæŠĢ向æ“ē動。這äē›čģŠåž‹é č¨­é–‹å•Ÿã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2643 +#, python-brace-format +msgid "MANUAL" +msgstr "手動" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:219 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:259 +#, python-brace-format +msgid "MAX" +msgstr "最大" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2385 +#, python-brace-format +msgid "MQB ACC Resume" +msgstr "MQB ACC æĸ垊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:81 +#, python-brace-format +msgid "MQB ACC resume" +msgstr "MQB ACC æĸ垊" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2393 +#, python-brace-format +msgid "MQB Steering Lockout" +msgstr "MQB čŊ‰å‘鎖åޚ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:82 +#, python-brace-format +msgid "MQB steering lockout" +msgstr "MQB čŊ‰å‘鎖åޚ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1449 +#, python-brace-format +msgid "Maintenance" +msgstr "įļ­č­ˇ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:877 +#, python-brace-format +msgid "Manual Delay Offset" +msgstr "手動åģļé˛åį§ģ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:416 +#, python-brace-format +msgid "Map Database" +msgstr "åœ°åœ–čŗ‡æ–™åēĢ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:933 +#, python-brace-format +msgid "Measured:" +msgstr "量æ¸Ŧå€ŧīŧš" + +#: openpilot/selfdrive/ui/widgets/prime.py:182 +#: iqpilot/ui/layouts/settings/drive_history.py:97 +#, python-brace-format +msgid "Miles" +msgstr "英里" + +#: iqpilot/ui/layouts/settings/iq_panels.py:216 +#, python-brace-format +msgid "Mirror the car's blinkers as arrows on the driving screen." +msgstr "åœ¨čĄŒčģŠį•Ģéĸ上äģĨįŽ­č™Ÿå°æ‡‰čģŠčŧ›įš„æ–šå‘į‡ˆã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:40 +#, python-brace-format +msgid "Model Stop Time" +msgstr "æ¨Ąåž‹åœč슿™‚é–“" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2095 +msgid "Models" +msgstr "æ¨Ąåž‹" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:63 +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1461 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "N/A" +msgstr "į„Ą" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#, python-brace-format +msgid "NO PANDA" +msgstr "į„Ą PANDA" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2644 +#, python-brace-format +msgid "NONE" +msgstr "į„Ą" + +#: openpilot/selfdrive/ui/layouts/home.py:474 +#: openpilot/selfdrive/ui/layouts/nav.py:239 +#, python-brace-format +msgid "Navigation" +msgstr "導čˆĒ" + +#: openpilot/selfdrive/ui/layouts/nav.py:360 +#, python-brace-format +msgid "Navigation canceled" +msgstr "åˇ˛å–æļˆå°ŽčˆĒ" + +#: iqpilot/ui/onroad/hud_overlays.py:1006 +#: iqpilot/ui/onroad/hud_overlays.py:1012 +#, python-brace-format +msgid "Near" +msgstr "čŧƒčŋ‘" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:58 +#: iqpilot/ui/layouts/settings/iq_panels.py:2092 +msgid "Network" +msgstr "įļ˛čˇ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:106 +#, python-brace-format +msgid "Neural Net FF" +msgstr "įĨžįļ“įļ˛čˇ¯ FF" + +#: iqpilot/ui/layouts/settings/iq_panels.py:858 +#, python-brace-format +msgid "Neural Network Feed Forward (NNFF)" +msgstr "įĨžįļ“įļ˛čˇ¯å‰éĨ‹ (NNFF)" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "Never Sleep" +msgstr "永不äŧ‘įœ " + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "No" +msgstr "åĻ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:621 +#, python-brace-format +msgid "No Nudge" +msgstr "į„Ąéœ€čŧ•推" + +#: system/ui/widgets/esim_scanner.py:78 +#, python-brace-format +msgid "No QR detected" +msgstr "æœĒåĩæ¸Ŧ到 QR Code" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:67 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:76 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:181 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:197 +#, python-brace-format +msgid "No SSH keys found for user '{}'" +msgstr "扞不到äŊŋᔍ者 '{}' įš„ SSH 金鑰" + +#: system/ui/widgets/network.py:371 +#, python-brace-format +msgid "No Wi-Fi networks found" +msgstr "扞不到 Wi-Fi įļ˛čˇ¯" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:277 +#, python-brace-format +msgid "No camera detected in dev mode. Tap check to continue." +msgstr "開į™ŧč€…æ¨Ąåŧä¸‹æœĒåĩæ¸Ŧåˆ°éĄé ­ã€‚čĢ‹éģžé¸æĒĸæŸĨäģĨįšŧįēŒã€‚" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:320 +#, python-brace-format +msgid "No release notes available." +msgstr "į„Ąå¯į”¨į™ŧ行čĒĒæ˜Žã€‚" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#, python-brace-format +msgid "No results" +msgstr "æ˛’æœ‰įĩæžœ" + +#: openpilot/selfdrive/ui/layouts/routes.py:128 +#, python-brace-format +msgid "No routes recorded" +msgstr "æ˛’æœ‰åˇ˛č¨˜éŒ„įš„čĄŒį¨‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2506 +#, python-brace-format +msgid "No vehicle set" +msgstr "æœĒč¨­åŽščģŠčŧ›" + +#: openpilot/selfdrive/ui/layouts/video_player.py:621 +#, python-brace-format +msgid "No video for this camera" +msgstr "æ­¤éĄé ­æ˛’æœ‰åŊąį‰‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:655 +#, python-brace-format +msgid "" +"Normally one maneuver ends the lane change even with the blinker held. Turn " +"this on to chain further changes while the blinker stays on — each follow-up" +" still wants a wheel nudge." +msgstr "é€šå¸¸åŗäŊŋ持į猿‰“č‘—æ–šå‘į‡ˆīŧŒä¸€æŦĄå‹•äŊœä🿜ƒįĩæŸčŽŠæ›čģŠé“。開啟此項垌īŧŒåĒčĻæ–šå‘į‡ˆäŋæŒé–‹å•Ÿå°ąčƒŊ逪įēŒčŽŠæ›â€”â€”äŊ†æ¯æŦĄåžŒįēŒčŽŠæ›äģéœ€čŧ•æŽ¨æ–šå‘į›¤ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2250 +#, python-brace-format +msgid "Not available on this Subaru platform." +msgstr "æ­¤ Subaru åšŗå°ä¸æ”¯æ´ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:73 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:202 +#, python-brace-format +msgid "Not connected" +msgstr "æœĒé€Ŗįˇš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:32 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:38 +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "Not set" +msgstr "æœĒč¨­åŽš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:696 +#, python-brace-format +msgid "" +"Note: on cars lacking an LFA/LKAS button, turning this off keeps steering " +"assistance from arming as cruise availability flips." +msgstr "æŗ¨æ„īŧšåœ¨æ˛’有 LFA/LKAS 按éĩįš„čģŠčŧ›ä¸ŠīŧŒé—œé–‰æ­¤é …可éŋå…åˇĄčˆĒå¯į”¨į‹€æ…‹åˆ‡æ›æ™‚čŊ‰å‘čŧ”åŠŠé€˛å…Ĩåž…å‘Ŋ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:620 +#, python-brace-format +msgid "Nudge" +msgstr "čŧ•æŽ¨æ–šå‘į›¤" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:85 +#: openpilot/selfdrive/ui/layouts/sidebar.py:164 +#: openpilot/selfdrive/ui/layouts/home.py:655 +#, python-brace-format +msgid "OFFLINE" +msgstr "é›ĸ᎚" + +#: system/ui/widgets/confirm_dialog.py:113 +#: system/ui/widgets/html_render.py:266 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#, python-brace-format +msgid "OK" +msgstr "įĸē厚" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:166 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#: openpilot/selfdrive/ui/layouts/home.py:657 +#, python-brace-format +msgid "ONLINE" +msgstr "᎚䏊" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#: iqpilot/ui/layouts/settings/iq_panels.py:619 +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Off" +msgstr "關閉" + +#: iqpilot/ui/layouts/settings/iq_panels.py:407 +#, python-brace-format +msgid "Offline On-Screen Maps" +msgstr "é›ĸ᎚čžĸ嚕地圖" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1415 +#, python-brace-format +msgid "Offroad" +msgstr "駐čģŠ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1395 +#, python-brace-format +msgid "Offroad Shutdown Timer" +msgstr "駐čģŠé—œæŠŸč¨ˆæ™‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1510 +#, python-brace-format +msgid "Offroad: lands in Always Offroad every time it boots or wakes." +msgstr "駐čģŠīŧšæ¯æŦĄé–‹æŠŸæˆ–喚醒垌éƒŊ進å…Ĩ始įĩ‚駐čģŠã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Offset:" +msgstr "偏į§ģīŧš" + +#: openpilot/selfdrive/ui/layouts/routes.py:176 +#, python-brace-format +msgid "On device" +msgstr "čŖįŊŽæœŦ抟" + +#: iqpilot/ui/layouts/settings/iq_panels.py:402 +#, python-brace-format +msgid "Online On-Screen Maps" +msgstr "᎚䏊čžĸ嚕地圖" + +#: iqpilot/ui/layouts/settings/iq_panels.py:250 +#, python-brace-format +msgid "Onroad Developer UI" +msgstr "行čģŠé–‹į™ŧ者äģ‹éĸ" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:196 +#, python-brace-format +msgid "Open the Konn3kt app on your phone" +msgstr "在手抟上開啟 Konn3kt æ‡‰į”¨į¨‹åŧ" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "Optional Nickname" +msgstr "æšąį¨ąīŧˆé¸åĄĢīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:251 +#, python-brace-format +msgid "" +"Overlay a bar of live control metrics (steering, lateral accel, lead data) " +"while driving." +msgstr "čĄŒé§›æ™‚į–ŠåŠ éĄ¯į¤ēä¸€åˆ—åŗæ™‚æŽ§åˆļ指標īŧˆčŊ‰å‘、側向加速åēĻ、前čģŠčŗ‡æ–™īŧ‰ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "PAIR" +msgstr "配對" + +#: iqpilot/ui/layouts/settings/drive_history.py:156 +#, python-brace-format +msgid "PAST WEEK" +msgstr "過åŽģ一週" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2369 +#, python-brace-format +msgid "PQ HCA Status 7 Mode" +msgstr "PQ HCA Status 7 æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:79 +#, python-brace-format +msgid "PQ HCA status 7 mode" +msgstr "PQ HCA į‹€æ…‹ 7 æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:66 +#: iqpilot/ui/layouts/settings/iq_panels.py:1423 +#, python-brace-format +msgid "PREVIEW" +msgstr "預čĻŊ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:52 +#, python-brace-format +msgid "Pair Device" +msgstr "é…å°čŖįŊŽ" + +#: openpilot/selfdrive/ui/widgets/prime.py:50 +#, python-brace-format +msgid "Pair Your Device" +msgstr "įĢ‹åŗå‡į´š" + +#: openpilot/selfdrive/ui/widgets/setup.py:23 +#, python-brace-format +msgid "Pair device" +msgstr "é…å°čŖįŊŽ" + +#: openpilot/selfdrive/ui/widgets/prime.py:55 +#, python-brace-format +msgid "Pair your device in the Konn3kt app" +msgstr "čĢ‹åœ¨ Konn3kt æ‡‰į”¨į¨‹åŧä¸­é…å°äŊ įš„čŖįŊŽ" + +#: openpilot/selfdrive/ui/widgets/setup.py:50 +#: openpilot/selfdrive/ui/layouts/settings/device.py:28 +#, python-brace-format +msgid "Pair your device in the Konn3kt app." +msgstr "čĢ‹åœ¨ Konn3kt æ‡‰į”¨į¨‹åŧä¸­é…å°äŊ įš„čŖįŊŽã€‚" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:171 +#, python-brace-format +msgid "Pair your device to your Konn3kt account" +msgstr "å°‡čŖįŊŽé…å°č‡ŗæ‚¨įš„ comma å¸ŗč™Ÿ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1243 +#, python-brace-format +msgid "Pause Updates" +msgstr "æšĢ停更新" + +#: iqpilot/ui/layouts/settings/iq_panels.py:502 +#, python-brace-format +msgid "Perform a search" +msgstr "åŸˇčĄŒæœå°‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:758 +#, python-brace-format +msgid "" +"Pick how steering assistance reacts once the driver brakes in IQ.Pilot." +msgstr "選擇在 IQ.Pilot ä¸­é§•é§›į…žčģŠåžŒčŊ‰å‘čŧ”åŠŠįš„åæ‡‰æ–šåŧã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:698 +#, python-brace-format +msgid "Pick what a brake-pedal press does to steering assistance." +msgstr "é¸æ“‡č¸Šä¸‹į…žčģŠč¸æŋ時對čŊ‰å‘čŧ”åŠŠįš„åŊąéŸŋ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1220 +msgid "" +"Pick whether a ready update just waits for your go-ahead, or downloads and " +"installs on its own." +msgstr "é¸æ“‡åˇ˛å°ąįˇ’įš„æ›´æ–°æ˜¯į­‰åž…äŊ įĸēčĒīŧŒé‚„是č‡Ē行下čŧ‰ä¸ĻåŽ‰čŖã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2578 +#, python-brace-format +msgid "Pick your vehicle" +msgstr "選擇äŊ įš„čģŠčŧ›" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2622 +#, python-brace-format +msgid "Pin a vehicle to skip auto-detection." +msgstr "å›ē厚一æŦžčģŠčŧ›åŗå¯į•Ĩ過č‡Ēå‹•čž¨č­˜ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:190 +msgid "" +"Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car" +" ahead. Needs IQ.Pilot to be the one controlling gas and brake." +msgstr "å°‡åŗæ™‚čŽ€æ•¸īŧˆčģŠčˇã€čģŠé€Ÿã€æŠĩ達前č슿™‚é–“īŧ‰å›ē厚在標į¤ē前čģŠįš„įŽ­č™Ÿä¸Šã€‚éœ€į”ą IQ.Pilot 控åˆļæ˛šé–€čˆ‡į…žčģŠã€‚" + +#: openpilot/selfdrive/ui/widgets/setup.py:75 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing" +msgstr "čĢ‹é€Ŗįˇšč‡ŗ Wi‑Fi äģĨ厌成初始化配對" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:163 +#, python-brace-format +msgid "Please connect to Wi-Fi to complete initial pairing." +msgstr "čĢ‹é€Ŗįˇš Wi-Fi äģĨ厌成初æŦĄé…å°ã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:44 +#, python-brace-format +msgid "Please connect to Wi-Fi to fetch your key." +msgstr "čĢ‹é€Ŗįˇš Wi-Fi äģĨ取垗äŊ įš„金鑰。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:97 +#, python-brace-format +msgid "Please connect to Wi-Fi to update." +msgstr "čĢ‹é€Ŗįˇš Wi-Fi äģĨé€˛čĄŒæ›´æ–°ã€‚" + +#: system/ui/widgets/esim_scanner.py:29 +#, python-brace-format +msgid "Point the driver camera at a carrier eSIM QR code (LPA:...)" +msgstr "čĢ‹å°‡é§•é§›į›ŖæŽ§éĄé ­å°æē–é›ģäŋĄæĨ­č€…įš„ eSIM QR CodeīŧˆLPA:...īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1703 +#, python-brace-format +msgid "Policy Weights" +msgstr "į­–į•ĨæŦŠé‡" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:538 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:191 +#: iqpilot/ui/layouts/settings/iq_panels.py:1443 +#, python-brace-format +msgid "Power Off" +msgstr "關抟" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1396 +#, python-brace-format +msgid "" +"Powers the device down once it has sat this long with the engine off.\n" +"(30h by default)" +msgstr "" +"在åŧ•æ“Žį†„įĢį‹€æ…‹ä¸‹éœįŊŽé”åˆ°æ­¤æ™‚é•ˇåžŒé—œé–‰čŖįŊŽã€‚\n" +"īŧˆé č¨­ 30 小時īŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2193 +#, python-brace-format +msgid "Predictive" +msgstr "預æ¸Ŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2183 +#, python-brace-format +msgid "Predictive tuning: anticipates and smooths accel changes." +msgstr "預æ¸ŦčĒŋæ Ąīŧšé å…ˆåˆ¤æ–ˇä¸Ļåšŗé †åŒ–åŠ é€ŸåēĻčŽŠåŒ–ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1235 +msgid "Predownload + Preinstall" +msgstr "預先下čŧ‰ + é å…ˆåŽ‰čŖ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1234 +msgid "Predownload Only" +msgstr "僅預先下čŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:546 +#, python-brace-format +msgid "Preparing Map Tiles..." +msgstr "æ­Ŗåœ¨æē–å‚™åœ°åœ–åœ–įŖšâ€Ļ" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Prevent large data uploads when on a metered Wi-Fi connection" +msgstr "åœ¨č¨ˆé‡åˆļ Wi‑Fi é€Ŗįˇšæ™‚éŋå…å¤§é‡ä¸Šå‚ŗ" + +#: system/ui/widgets/network.py:187 +#, python-brace-format +msgid "Prevent large data uploads when on a metered cellular connection" +msgstr "åœ¨č¨ˆé‡åˆļčĄŒå‹•įļ˛čˇ¯æ™‚éŋå…å¤§é‡ä¸Šå‚ŗ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:29 +msgid "" +"Preview the driver facing camera to ensure that driver monitoring has good " +"visibility. (vehicle must be off)" +msgstr "預čĻŊčģŠå…§éĄé ­äģĨįĸēäŋé§•é§›į›ŖæŽ§čĻ–é‡Žč‰¯åĨŊ。īŧˆčģŠčŧ›é ˆį†„įĢīŧ‰" + +#: system/ui/widgets/esim.py:174 +#, python-brace-format +msgid "Profile Actions" +msgstr "č¨­åŽšæĒ”操äŊœ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:403 +#, python-brace-format +msgid "" +"Pull live Mapbox tiles for the on-screen map whenever the device has " +"internet." +msgstr "åĒčĻčŖįŊŽæœ‰įļ˛čˇ¯īŧŒå°ąåŗæ™‚取垗čžĸåš•åœ°åœ–æ‰€éœ€įš„ Mapbox åœ–įŖšã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1708 +#, python-brace-format +msgid "Purge Model Cache" +msgstr "æ¸…é™¤æ¨Ąåž‹åŋĢ取" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1223 +msgid "" +"Put the device in Always Offroad, or shut the car down, before changing how " +"updates install." +msgstr "čŽŠæ›´æ›´æ–°åŽ‰čŖæ–šåŧå‰īŧŒčĢ‹å…ˆå°‡čŖįŊŽåˆ‡æ›į‚ē始įĩ‚駐čģŠīŧŒæˆ–ᆄįĢ關閉čģŠčŧ›ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1217 +msgid "" +"Put the device in Always Offroad, or shut the car down, before touching " +"these." +msgstr "čŽŠæ›´é€™äē›č¨­åŽšå‰īŧŒčĢ‹å…ˆå°‡čŖįŊŽåˆ‡æ›į‚ē始įĩ‚駐čģŠīŧŒæˆ–ᆄįĢ關閉čģŠčŧ›ã€‚" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:230 +#, python-brace-format +msgid "QR Code Error" +msgstr "QR įĸŧ錯čǤ" + +#: system/ui/widgets/esim_scanner.py:105 +#, python-brace-format +msgid "QR accepted" +msgstr "厞æŽĨ受 QR Code" + +#: openpilot/selfdrive/ui/layouts/home.py:411 +#: openpilot/selfdrive/ui/layouts/home.py:634 +#, python-brace-format +msgid "READY" +msgstr "å°ąįˇ’" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "REDOWNLOAD" +msgstr "重新下čŧ‰" + +#: system/ui/widgets/esim.py:59 iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "REFRESH" +msgstr "é‡æ–°æ•´į†" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:97 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "REMOVE" +msgstr "į§ģ除" + +#: iqpilot/ui/layouts/settings/iq_panels.py:439 +#, python-brace-format +msgid "REMOVING..." +msgstr "æ­Ŗåœ¨į§ģ除â€Ļ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#, python-brace-format +msgid "RESET" +msgstr "重設" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "REVIEW" +msgstr "æĒĸčĻ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Rack:" +msgstr "čŊ‰å‘抟īŧš" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:100 +#, python-brace-format +msgid "" +"Re-mount if your face is occluded or driver monitoring has difficulty " +"tracking your face." +msgstr "č‹Ĩ臉部čĸĢéŽæ“‹æˆ–é§•é§›į›ŖæŽ§é›ŖäģĨčŋŊ蚤īŧŒčĢ‹é‡æ–°åŽ‰čŖčŖįŊŽã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2010 +#, python-brace-format +msgid "Reachable only with the car switched off or Always Offroad turned on." +msgstr "僅在čģŠčŧ›į†„įĢæˆ–åˇ˛é–‹å•Ÿå§‹įĩ‚駐č슿™‚å¯į”¨ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:527 +#: openpilot/selfdrive/ui/layouts/settings/device.py:59 +#: openpilot/selfdrive/ui/layouts/settings/device.py:179 +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#: iqpilot/ui/layouts/settings/iq_panels.py:1442 +#, python-brace-format +msgid "Reboot" +msgstr "重新啟動" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:66 +#, python-brace-format +msgid "Reboot Device" +msgstr "é‡æ–°å•Ÿå‹•čŖįŊŽ" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:112 +#, python-brace-format +msgid "Reboot and Update" +msgstr "重新啟動ä¸Ļ更新" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:37 +msgid "" +"Receive alerts to steer back into the lane when your vehicle drifts over a " +"detected lane line without a turn signal activated while driving over 31 mph" +" (50 km/h)." +msgstr "į•ļčģŠčŧ›äģĨčļ…過 31 mphīŧˆ50 km/hīŧ‰čĄŒé§›ä¸”æœĒæ‰“æ–šå‘į‡ˆčļŠéŽåĩæ¸Ŧåˆ°įš„čģŠé“įˇšæ™‚īŧŒæŽĨæ”ļčŊ‰å‘回čģŠé“įš„č­Ļį¤ē。" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:85 +#, python-brace-format +msgid "Record and Upload Driver Camera" +msgstr "錄čŖŊä¸Ļä¸Šå‚ŗčģŠå…§éĄé ­" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:91 +#, python-brace-format +msgid "Record and Upload Microphone Audio" +msgstr "錄čŖŊä¸Ļä¸Šå‚ŗéēĨ克éĸ¨éŸŗč¨Š" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:48 +msgid "" +"Record and store microphone audio while driving. The audio will be included " +"in the dashcam video in Konn3kt." +msgstr "行č슿™‚錄čŖŊä¸Ļå„˛å­˜éēĨ克éĸ¨éŸŗč¨Šã€‚éŸŗč¨Šå°‡åŒ…åĢ在 Konn3kt įš„čĄŒčģŠį´€éŒ„åŊąį‰‡ä¸­ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:41 +msgid "" +"Record and upload driving data and video. Disabling this stops all " +"recording! No logs, no video, no audio." +msgstr "記錄ä¸Ļä¸Šå‚ŗčĄŒčģŠčŗ‡æ–™čˆ‡åŊąį‰‡ã€‚åœį”¨åžŒå°‡åœæ­ĸ所有錄čŖŊīŧæ˛’æœ‰į´€éŒ„ã€æ˛’æœ‰åŊąį‰‡ã€æ˛’æœ‰č˛éŸŗã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1854 +#, python-brace-format +msgid "Redownload" +msgstr "重新下čŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1714 +#, python-brace-format +msgid "Redownload Current Model" +msgstr "重新下čŧ‰į›Žå‰æ¨Ąåž‹" + +#: system/ui/widgets/esim.py:58 +#, python-brace-format +msgid "Refresh Profiles" +msgstr "é‡æ–°æ•´į†č¨­åŽšæĒ”" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1427 +#, python-brace-format +msgid "Regulatory" +msgstr "æŗ•čĻ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Relaxed" +msgstr "垞厚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1705 +#, python-brace-format +msgid "Reload Model List" +msgstr "重新čŧ‰å…Ĩæ¨Ąåž‹æ¸…å–Ž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +msgid "Remain Active: braking never interrupts steering assistance." +msgstr "äŋæŒå•Ÿį”¨īŧšį…žčģŠįĩ•ä¸æœƒä¸­æ–ˇčŊ‰å‘čŧ”劊。" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Remote access" +msgstr "遠įĢ¯å­˜å–" + +#: system/ui/widgets/esim.py:230 +#, python-brace-format +msgid "Remove" +msgstr "į§ģ除" + +#: system/ui/widgets/esim.py:167 system/ui/widgets/esim.py:184 +#, python-brace-format +msgid "Remove Comma pSIM" +msgstr "į§ģ除 Comma pSIM" + +#: system/ui/widgets/esim.py:165 system/ui/widgets/esim.py:182 +#, python-brace-format +msgid "Rename" +msgstr "重新å‘Ŋ名" + +#: system/ui/widgets/esim.py:193 +#, python-brace-format +msgid "Rename Profile" +msgstr "重新å‘Ŋåč¨­åŽšæĒ”" + +#: openpilot/selfdrive/ui/widgets/ssh_key.py:72 +#: openpilot/selfdrive/ui/widgets/ssh_key.py:192 +#, python-brace-format +msgid "Request timed out" +msgstr "čĻæą‚é€žæ™‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2212 +#, python-brace-format +msgid "Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled." +msgstr "需čĻå…ˆå•Ÿį”¨ IQ.Pilot į¸ąå‘æŽ§åˆļīŧˆAlphaīŧ‰ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:123 +#: iqpilot/ui/layouts/settings/iq_panels.py:1532 +#, python-brace-format +msgid "Reset" +msgstr "重設" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:55 +#: iqpilot/ui/layouts/settings/iq_panels.py:1921 +#, python-brace-format +msgid "Reset Calibration" +msgstr "é‡č¨­æ Ąæ­Ŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1437 +#, python-brace-format +msgid "Restore Defaults" +msgstr "é‚„åŽŸé č¨­å€ŧ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:69 +#, python-brace-format +msgid "Review Training Guide" +msgstr "æĒĸčĻ–č¨“įˇ´æŒ‡å—" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:31 +msgid "Review the rules, features, and limitations of IQ.Pilot" +msgstr "æĒĸčĻ– IQ.Pilot įš„čĻå‰‡ã€åŠŸčƒŊ與限åˆļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:15 +#, python-brace-format +msgid "Road Name" +msgstr "é“čˇ¯åį¨ą" + +#: iqpilot/ui/layouts/settings/iq_panels.py:210 +#, python-brace-format +msgid "Road Name Overlay" +msgstr "é“čˇ¯åį¨ąį–ŠåŠ " + +#: openpilot/selfdrive/ui/layouts/home.py:475 +#: openpilot/selfdrive/ui/layouts/routes.py:38 +#, python-brace-format +msgid "Routes" +msgstr "čĄŒį¨‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:400 +#, python-brace-format +msgid "Routing Engine Version" +msgstr "čˇ¯åž‘čĻåŠƒåŧ•æ“Žį‰ˆæœŦ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:134 +#, python-brace-format +msgid "Run the compact comma 4 (mici) interface on this device" +msgstr "åœ¨æ­¤čŖįŊŽä¸ŠåŸˇčĄŒį˛žį°Ąįš„ comma 4īŧˆmiciīŧ‰äģ‹éĸ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#: iqpilot/ui/layouts/settings/iq_panels.py:418 +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#: iqpilot/ui/layouts/settings/iq_panels.py:497 +#: iqpilot/ui/layouts/settings/iq_panels.py:1697 +#: iqpilot/ui/layouts/settings/iq_panels.py:2654 +#: iqpilot/ui/layouts/settings/iq_panels.py:2677 +#, python-brace-format +msgid "SELECT" +msgstr "選取" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:59 +#, python-brace-format +msgid "SLC Auto Confirm" +msgstr "SLC č‡Ē動įĸēčĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:57 +#, python-brace-format +msgid "SLC Confirm Higher" +msgstr "SLC įĸēčĒčŧƒé̘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:58 +#, python-brace-format +msgid "SLC Confirm Lower" +msgstr "SLC įĸēčĒčŧƒäŊŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:60 +#, python-brace-format +msgid "SLC Fallback IQ.Pilot" +msgstr "SLC 備援 IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:61 +#, python-brace-format +msgid "SLC Online Filler" +msgstr "SLC ᎚䏊åĄĢ誜" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "SLC Override" +msgstr "SLC čφå¯Ģ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "SLC Policy" +msgstr "SLC 原則" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:68 +#, python-brace-format +msgid "SSH Keys" +msgstr "SSH 金鑰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:51 +#, python-brace-format +msgid "SSH keys" +msgstr "SSH 金鑰" + +#: openpilot/selfdrive/ui/widgets/exp_mode_button.py:61 +#, python-brace-format +msgid "STOCK ACC" +msgstr "原åģ  ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:314 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Scan" +msgstr "掃描" + +#: system/ui/widgets/esim.py:95 +#, python-brace-format +msgid "Scan QR" +msgstr "掃描 QR Code" + +#: system/ui/widgets/esim.py:66 +#, python-brace-format +msgid "Scan QR or enter activation code" +msgstr "掃描 QR Code 或čŧ¸å…Ĩå•Ÿį”¨įĸŧ" + +#: system/ui/widgets/network.py:368 +#, python-brace-format +msgid "Scanning Wi-Fi networks..." +msgstr "æ­Ŗåœ¨æŽƒæ Wi‑Fi įļ˛čˇ¯â€Ļ" + +#: system/ui/iqwidgets/widgets/list_view.py:1016 +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#: openpilot/selfdrive/ui/layouts/nav.py:535 +#, python-brace-format +msgid "Search" +msgstr "搜尋" + +#: openpilot/selfdrive/ui/layouts/nav.py:443 +#, python-brace-format +msgid "Search address or place" +msgstr "搜尋地址或地éģž" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2580 +#, python-brace-format +msgid "Search make or model" +msgstr "æœå°‹å“į‰Œæˆ–čģŠåž‹" + +#: openpilot/selfdrive/ui/layouts/nav.py:546 +#: iqpilot/ui/layouts/settings/iq_panels.py:322 +#, python-brace-format +msgid "Searching..." +msgstr "æ­Ŗåœ¨æœå°‹â€Ļ" + +#: system/ui/widgets/option_dialog.py:62 +#, python-brace-format +msgid "Select" +msgstr "選取" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:224 +#: iqpilot/ui/layouts/settings/iq_panels.py:1337 +#, python-brace-format +msgid "Select a branch" +msgstr "選取分支" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:95 +#, python-brace-format +msgid "Select a language" +msgstr "選取čĒžč¨€" + +#: iqpilot/ui/layouts/settings/iq_panels.py:875 +#, python-brace-format +msgid "Self-Tuning Steer Delay" +msgstr "č‡Ēå‹•æ Ąæē–čŊ‰å‘åģļ遲" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:64 +#: iqpilot/ui/layouts/settings/iq_panels.py:1463 +#, python-brace-format +msgid "Serial" +msgstr "åēč™Ÿ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Home" +msgstr "č¨­åŽšäŊåŽļ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:103 +#, python-brace-format +msgid "Set Units From Location" +msgstr "䞝äŊįŊŽč¨­åŽšå–ŽäŊ" + +#: openpilot/selfdrive/ui/layouts/nav.py:299 +#, python-brace-format +msgid "Set Work" +msgstr "č¨­åŽšå…Ŧ司" + +#: openpilot/selfdrive/ui/layouts/nav.py:470 +#, python-brace-format +msgid "Set home address" +msgstr "č¨­åŽšäŊåŽļ地址" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:45 +msgid "" +"Set the units from the device location. Speeds switch to km/h everywhere " +"except the United States, the United Kingdom and Liberia, and are re-checked" +" when you cross a border." +msgstr "äžčŖįŊŽæ‰€åœ¨äŊįŊŽč¨­åŽšå–ŽäŊã€‚é™¤įžŽåœ‹ã€č‹ąåœ‹čˆ‡čŗ´æ¯”į‘žäēžå¤–īŧŒå„地čģŠé€Ÿįš†åˆ‡æ›į‚ēå…Ŧ里/小時īŧŒä¸Ļ圍莍čļŠåœ‹į•Œæ™‚重新判厚。" + +#: openpilot/selfdrive/ui/layouts/nav.py:473 +#, python-brace-format +msgid "Set work address" +msgstr "č¨­åŽšå…Ŧ司地址" + +#: iqpilot/ui/layouts/settings/iq_panels.py:870 +#, python-brace-format +msgid "" +"Sets the speed threshold used by Lane Turn Desires. Below this value, turn " +"desires can plan into the nearest drivable turn path. Default is 19 mph." +msgstr "č¨­åŽščģŠé“čŊ‰åŊŽæ„åœ–所äŊŋį”¨įš„é€ŸåēĻ門æĒģ。äŊŽæ–ŧæ­¤å€ŧ時īŧŒčŊ‰åŊŽæ„åœ–可čĻåŠƒæœ€čŋ‘įš„å¯čĄŒé§›čŊ‰åŊŽčˇ¯åž‘ã€‚é č¨­į‚ē每小時 19 č‹ąé‡Œã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1511 +#, python-brace-format +msgid "" +"Sets which state the device settles into after a boot or a wake from sleep." +msgstr "č¨­åŽščŖįŊŽåœ¨é–‹æŠŸæˆ–åžžįĄįœ å–šé†’åžŒé€˛å…Ĩįš„į‹€æ…‹ã€‚" + +#: openpilot/selfdrive/ui/layouts/home.py:472 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:130 +#: openpilot/selfdrive/ui/layouts/settings_hub.py:431 +#, python-brace-format +msgid "Settings" +msgstr "č¨­åŽš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:211 +#, python-brace-format +msgid "" +"Show the current road's name over the driving view.
    Requires offline map " +"data for your region to be installed." +msgstr "åœ¨čĄŒčģŠį•Ģéĸä¸ŠéĄ¯į¤ēį›Žå‰įš„é“čˇ¯åį¨ąã€‚
    需čĻåŽ‰čŖäŊ æ‰€åœ¨å€åŸŸįš„é›ĸįˇšåœ°åœ–čŗ‡æ–™ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2300 +#, python-brace-format +msgid "Smooth Steering" +msgstr "åšŗæģ‘čŊ‰å‘" + +#: openpilot/selfdrive/ui/widgets/offroad_alerts.py:106 +#, python-brace-format +msgid "Snooze Update" +msgstr "åģļ垌更新" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:60 +#: iqpilot/ui/layouts/settings/iq_panels.py:2094 +msgid "Software" +msgstr "čģŸéĢ”" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Speed" +msgstr "čģŠé€Ÿ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:120 +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:86 +#, python-brace-format +msgid "Speed Limit" +msgstr "速限" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1008 +#, python-brace-format +msgid "Speed Limit Control" +msgstr "速限控åˆļ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:113 +#, python-brace-format +msgid "Standard" +msgstr "標æē–" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:29 +msgid "" +"Standard is recommended. In aggressive mode, IQ.Pilot will follow lead cars " +"closer and be more aggressive with the gas and brake. In relaxed mode " +"IQ.Pilot will stay further away from lead cars. On supported cars, you can " +"cycle through these personalities with your steering wheel distance button." +msgstr "" +"åģēč­°äŊŋį”¨æ¨™æē–æ¨Ąåŧã€‚įŠæĨĩæ¨Ąåŧä¸‹īŧŒIQ.Pilot " +"會更č˛ŧčŋ‘前čģŠīŧŒæ˛šé–€čˆ‡į…žčģŠåæ‡‰æ›´įŠæĨĩīŧ›åžžåŽšæ¨Ąåŧä¸‹īŧŒæœƒčˆ‡å‰čģŠäŋæŒæ›´é čˇé›ĸ。æ–ŧ支援č슿ŦžīŧŒå¯į”¨æ–šå‘į›¤čˇé›ĸ按鈕切換這äē›éĸ¨æ ŧ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +#, python-brace-format +msgid "Standby" +msgstr "åž…å‘Ŋ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:689 +msgid "" +"Standby: braking parks steering assistance; it rejoins once you're off the " +"pedal." +msgstr "åž…å‘Ŋīŧšį…žč슿œƒæšĢ停čŊ‰å‘čŧ”劊īŧ›æ”žé–‹č¸æŋåžŒåŗæĸ垊。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:460 +#, python-brace-format +msgid "Start Download" +msgstr "開始下čŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:839 +#, python-brace-format +msgid "Start the vehicle to check steering assistance behavior compatibility." +msgstr "čĢ‹į™ŧ動čģŠčŧ›äģĨæĒĸæŸĨčŊ‰å‘čŧ”åŠŠčĄŒį‚ēįš„į›¸åŽšæ€§ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:420 +#, python-brace-format +msgid "State" +msgstr "åˇž/ᜁ" + +#: openpilot/selfdrive/ui/layouts/home.py:473 +#: openpilot/selfdrive/ui/layouts/stats.py:18 +#, python-brace-format +msgid "Stats" +msgstr "įĩąč¨ˆ" + +#: system/ui/widgets/esim.py:56 +#, python-brace-format +msgid "Status" +msgstr "į‹€æ…‹" + +#: iqpilot/ui/layouts/settings/iq_panels.py:688 +#, python-brace-format +msgid "Stay Engaged" +msgstr "äŋæŒæŽĨįŽĄ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2097 +msgid "Steering" +msgstr "čŊ‰å‘" + +#: iqpilot/ui/layouts/settings/iq_panels.py:847 +#, python-brace-format +msgid "Steering Assistance Behavior" +msgstr "čŊ‰å‘čŧ”åŠŠčĄŒį‚ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:14 +#: iqpilot/ui/layouts/settings/iq_panels.py:206 +#, python-brace-format +msgid "Steering Effort Arc" +msgstr "čŊ‰å‘力道åŧ§įˇš" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:131 +#, python-brace-format +msgid "Stock ACC" +msgstr "原åģ  ACC" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1715 +#, python-brace-format +msgid "Stop Download" +msgstr "停æ­ĸ下čŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2265 +#, python-brace-format +msgid "" +"Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave " +"this off on cars with an electric parking brake. Thanks to martinl for this " +"implementation!" +msgstr "" +"éŠį”¨æ–ŧé…å‚™æ‰‹å‹•æ‰‹į…žčģŠįš„ Subaru Global čģŠåž‹įš„čĩ°čĩ°åœåœæ–šæĄˆã€‚é…å‚™é›ģ子駐čģŠį…žčģŠįš„čģŠčŧ›čĢ‹äŋæŒé—œé–‰ã€‚感čŦ martinl 提䞛此å¯ĻäŊœīŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:412 +#, python-brace-format +msgid "Stored Maps" +msgstr "åˇ˛å„˛å­˜įš„åœ°åœ–" + +#: openpilot/selfdrive/ui/layouts/video_player.py:614 +#, python-brace-format +msgid "Streaming from cloud" +msgstr "æ­Ŗåœ¨åžžé›˛į̝䏞æĩ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1543 +#, python-brace-format +msgid "Switch the device into Always Offroad mode?" +msgstr "å°‡čŖįŊŽåˆ‡æ›į‚ē始įĩ‚駐č슿¨ĄåŧīŧŸ" + +#: openpilot/selfdrive/ui/layouts/settings_hub.py:550 +#, python-brace-format +msgid "Switch the device into forced-offroad mode?" +msgstr "å°‡čŖįŊŽåˆ‡æ›į‚ēåŧˇåˆļ駐č슿¨ĄåŧīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1448 +#, python-brace-format +msgid "System" +msgstr "įŗģįĩą" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:59 +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:65 +#, python-brace-format +msgid "System Unresponsive" +msgstr "įŗģįĩąį„Ąå›žæ‡‰" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:58 +#, python-brace-format +msgid "TAKE CONTROL IMMEDIATELY" +msgstr "čĢ‹įĢ‹åˆģæŽĨ手控åˆļ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:83 +#: openpilot/selfdrive/ui/layouts/sidebar.py:155 +#: openpilot/selfdrive/ui/layouts/sidebar.py:157 +#: openpilot/selfdrive/ui/layouts/sidebar.py:159 +#: openpilot/selfdrive/ui/layouts/home.py:644 +#: openpilot/selfdrive/ui/layouts/home.py:646 +#: openpilot/selfdrive/ui/layouts/home.py:648 +#, python-brace-format +msgid "TEMP" +msgstr "æēĢåēĻ" + +#: openpilot/selfdrive/ui/layouts/home.py:618 +#, python-brace-format +msgid "TEMP HIGH" +msgstr "æēĢåēĻ過é̘" + +#: openpilot/selfdrive/ui/layouts/home.py:620 +#, python-brace-format +msgid "TEMP OK" +msgstr "æēĢåēĻæ­Ŗå¸¸" + +#: openpilot/selfdrive/ui/widgets/pairing_dialog.py:197 +#, python-brace-format +msgid "Tap \"Add Device\" and scan the QR code on the right" +msgstr "éģžé¸ã€ŒAdd Device」ä¸ĻæŽƒæåŗå´įš„ QR Code" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:86 +#, python-brace-format +msgid "Target Branch" +msgstr "į›Žæ¨™åˆ†æ”¯" + +#: system/ui/widgets/network.py:176 +#, python-brace-format +msgid "Tethering Password" +msgstr "įļ˛čˇ¯å…ąäēĢ密įĸŧ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1920 +#, python-brace-format +msgid "" +"The selected model changed. We suggest resetting calibration. Would you like" +" to do that now?" +msgstr "æ‰€é¸æ¨Ąåž‹åˇ˛čŽŠæ›´ã€‚åģēč­°é‡č¨­æ Ąæ­Ŗã€‚čĻįžåœ¨é‡č¨­å—ŽīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1526 +#, python-brace-format +msgid "There's no undo once this runs — last chance to back out." +msgstr "一æ—ĻåŸˇčĄŒäžŋį„Ąæŗ•åžŠåŽŸâ€”â€”é€™æ˜¯æ”žæŖ„įš„æœ€åžŒæŠŸæœƒã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1276 +#, python-brace-format +msgid "This needs a reboot to apply. Restart now?" +msgstr "æ­¤čŽŠæ›´éœ€é‡æ–°é–‹æŠŸæ‰æœƒį”Ÿæ•ˆã€‚čĻįžåœ¨é‡æ–°å•Ÿå‹•å—ŽīŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:700 +#, python-brace-format +msgid "This platform is limited to Disengage mode." +msgstr "æ­¤åšŗå°åƒ…é™č§Ŗé™¤æ¨Ąåŧã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:837 +#, python-brace-format +msgid "" +"This platform supports a limited set of steering assistance behavior " +"options." +msgstr "æ­¤åšŗå°åƒ…æ”¯æ´éƒ¨åˆ†čŊ‰å‘čŧ”åŠŠčĄŒį‚ē選項。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:838 +#, python-brace-format +msgid "" +"This platform supports the full steering assistance behavior configuration." +msgstr "æ­¤åšŗå°æ”¯æ´åŽŒæ•´įš„čŊ‰å‘čŧ”åŠŠčĄŒį‚ēč¨­åŽšã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:434 +#, python-brace-format +msgid "" +"This will delete ALL downloaded maps\n" +"\n" +"Are you sure you want to delete all maps?" +msgstr "" +"此操äŊœå°‡åˆĒé™¤æ‰€æœ‰åˇ˛ä¸‹čŧ‰įš„地圖\n" +"\n" +"įĸē厚čρåˆĒ除全部地圖嗎īŧŸ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1802 +#, python-brace-format +msgid "" +"This will delete ALL downloaded models from the cache except the currently " +"active model. Are you sure?" +msgstr "此操äŊœå°‡åžžåŋĢ取中åˆĒé™¤é™¤į›Žå‰äŊŋį”¨æ¨Ąåž‹å¤–įš„æ‰€æœ‰åˇ˛ä¸‹čŧ‰æ¨Ąåž‹ã€‚įĸē厚嗎īŧŸ" + +#: system/ui/widgets/esim.py:219 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:160 +#, python-brace-format +msgid "This will permanently wipe the Comma pSIM profile from the SIM." +msgstr "此操äŊœå°‡åžž SIM åĄæ°¸äš…æ¸…é™¤ Comma pSIM č¨­åŽšæĒ”。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:459 +#, python-brace-format +msgid "" +"This will start the download process and it might take a while to complete." +msgstr "此操äŊœå°‡é–‹å§‹ä¸‹čŧ‰īŧŒå¯čƒŊ需čρ䏀æŽĩ時間才čƒŊ厌成。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:245 +#, python-brace-format +msgid "Time" +msgstr "時間" + +#: openpilot/selfdrive/ui/layouts/settings/settings.py:59 +#: iqpilot/ui/layouts/settings/iq_panels.py:2093 +msgid "Toggles" +msgstr "切換" + +#: iqpilot/ui/layouts/settings/iq_panels.py:937 +#, python-brace-format +msgid "Total:" +msgstr "合荈īŧš" + +#: iqpilot/ui/layouts/settings/iq_panels.py:207 +#, python-brace-format +msgid "" +"Trace an arc over the road view showing how much steering IQ.Pilot is " +"applying while lateral control runs." +msgstr "åœ¨é“čˇ¯į•Ģéĸ上įšĒčŖŊ一道åŧ§įˇšīŧŒéĄ¯į¤ē側向控åˆļ運äŊœæ™‚ IQ.Pilot æ–ŊåŠ įš„čŊ‰å‘量。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1429 +#, python-brace-format +msgid "Training Guide" +msgstr "äŊŋį”¨æŒ‡å—" + +#: openpilot/selfdrive/ui/mici/layouts/settings/visuals.py:16 +#, python-brace-format +msgid "Turn Signals" +msgstr "æ–šå‘į‡ˆ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1214 +msgid "" +"Turns off over-the-air update checks entirely.
    Reboot for this to take" +" effect." +msgstr "åŽŒå…¨é—œé–‰įˇšä¸Šæ›´æ–°æĒĸæŸĨ。
    éœ€é‡æ–°é–‹æŠŸæ‰æœƒį”Ÿæ•ˆã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2582 +#, python-brace-format +msgid "Type a year then a model — for example, 2021 Toyota Corolla:" +msgstr "先čŧ¸å…Ĩåš´äģŊ再čŧ¸å…ĨčģŠåž‹ — 例åĻ‚ 2021 Toyota Corollaīŧš" + +#: system/ui/iqwidgets/widgets/list_view.py:1021 +#, python-brace-format +msgid "Type to search" +msgstr "čŧ¸å…ĨäģĨ搜尋" + +#: openpilot/selfdrive/ui/layouts/home.py:623 +#, python-brace-format +msgid "UNAVAILABLE" +msgstr "į„Ąæŗ•äŊŋᔍ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#, python-brace-format +msgid "UNINSTALL" +msgstr "č§Ŗé™¤åŽ‰čŖ" + +#: openpilot/selfdrive/ui/layouts/home.py:812 +#, python-brace-format +msgid "UPDATE" +msgstr "更新" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:54 +#, python-brace-format +msgid "USB Storage" +msgstr "USB å„˛å­˜" + +#: system/ui/widgets/esim.py:82 +#, python-brace-format +msgid "USE" +msgstr "äŊŋᔍ" + +#: openpilot/selfdrive/ui/layouts/video_player.py:360 +#: openpilot/selfdrive/ui/layouts/video_player.py:371 +#, python-brace-format +msgid "Unable to load video" +msgstr "į„Ąæŗ•čŧ‰å…ĨåŊąį‰‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2210 +#, python-brace-format +msgid "Unavailable while the car is onroad." +msgstr "čģŠčŧ›č™•æ–ŧ行čģŠį‹€æ…‹æ™‚į„Ąæŗ•äŊŋį”¨ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:192 +msgid "Unavailable — IQ.Pilot longitudinal control is not active on this car." +msgstr "į„Ąæŗ•äŊŋᔍ — æ­¤čģŠčŧ›æœĒå•Ÿį”¨ IQ.Pilot į¸ąå‘æŽ§åˆļ。" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2605 +#, python-brace-format +msgid "Undetected and unset" +msgstr "æœĒ辨識且æœĒč¨­åŽš" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:102 +#: openpilot/selfdrive/ui/layouts/settings/software.py:204 +#: iqpilot/ui/layouts/settings/iq_panels.py:1306 +#, python-brace-format +msgid "Uninstall" +msgstr "č§Ŗé™¤åŽ‰čŖ" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:147 +msgid "Unknown" +msgstr "æœĒįŸĨ" + +#: system/ui/widgets/esim.py:80 +#, python-brace-format +msgid "Unknown provider" +msgstr "æœĒįŸĨé›ģäŋĄæĨ­č€…" + +#: openpilot/selfdrive/ui/widgets/prime.py:64 +#, python-brace-format +msgid "Unlimited route storage" +msgstr "į„Ąé™čĄŒį¨‹å„˛å­˜įŠē間" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1253 +#: iqpilot/ui/layouts/settings/iq_panels.py:1286 +#, python-brace-format +msgid "Update Install Mode" +msgstr "æ›´æ–°åŽ‰čŖæ¨Ąåŧ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:73 +#, python-brace-format +msgid "Updates are only downloaded while the car is off." +msgstr "僅在čģŠčŧ›į†„įĢ時下čŧ‰æ›´æ–°ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1435 +#, python-brace-format +msgid "Upload While Driving" +msgstr "čĄŒé§›æ™‚ä¸Šå‚ŗ" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:42 +msgid "" +"Upload data from the driver facing camera and help improve the driver " +"monitoring algorithm." +msgstr "ä¸Šå‚ŗčģŠå…§éĄé ­čŗ‡æ–™īŧŒå”åŠŠæ”šå–„é§•é§›į›ŖæŽ§æŧ”įŽ—æŗ•ã€‚" + +#: openpilot/selfdrive/ui/layouts/routes.py:170 +#, python-brace-format +msgid "Uploaded" +msgstr "åˇ˛ä¸Šå‚ŗ" + +#: openpilot/selfdrive/ui/layouts/routes.py:172 +#, python-brace-format +msgid "Uploading" +msgstr "æ­Ŗåœ¨ä¸Šå‚ŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2348 +msgid "" +"Use HCA Status 7 instead of Status 5 for steering control on PQ platform " +"vehicles. This may help with compatibility on some older Volkswagen models." +msgstr "" +"在 PQ åšŗå°čģŠčŧ›ä¸ŠäŊŋᔍ HCA Status 7 而非 Status 5 進行čŊ‰å‘控åˆļ。這可čƒŊ有劊æ–ŧ攚善部分čŧƒčˆŠ Volkswagen čģŠåž‹įš„į›¸åŽšæ€§ã€‚" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:97 +#, python-brace-format +msgid "Use Metric System" +msgstr "äŊŋᔍå…Ŧåˆļ" + +#: system/ui/widgets/esim.py:138 +#, python-brace-format +msgid "" +"Use activation code:\n" +"{}" +msgstr "" +"äŊŋį”¨å•Ÿį”¨įĸŧīŧš\n" +"{}" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:24 +msgid "" +"Use the IQ.Pilot system for adaptive cruise control and lane keep driver " +"assistance. Your attention is required at all times to use this feature." +msgstr "äŊŋᔍ IQ.Pilot 進行 ACC 與čģŠé“įļ­æŒčŧ”劊。äŊŋį”¨æ­¤åŠŸčƒŊ時īŧŒæ‚¨åŋ…須始įĩ‚äŋæŒå°ˆæŗ¨ã€‚" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:84 +#: openpilot/selfdrive/ui/layouts/sidebar.py:172 +#: openpilot/selfdrive/ui/layouts/sidebar.py:174 +#: openpilot/selfdrive/ui/layouts/home.py:650 +#: openpilot/selfdrive/ui/layouts/home.py:652 +#, python-brace-format +msgid "VEHICLE" +msgstr "čģŠčŧ›" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:71 +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "VIEW" +msgstr "æĒĸčĻ–" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2289 +#, python-brace-format +msgid "VTB (Virtual Torque Blending)" +msgstr "VTBīŧˆč™›æ“Ŧæ‰­åŠ›čžåˆīŧ‰" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2099 +#: iqpilot/ui/layouts/settings/iq_panels.py:2538 +#, python-brace-format +msgid "Vehicle" +msgstr "čģŠčŧ›" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:232 +#, python-brace-format +msgid "" +"Vehicle longitudinal capability has not been detected yet. Start the car " +"once to detect support." +msgstr "尚æœĒåĩæ¸Ŧ到čģŠčŧ›įš„į¸ąå‘æŽ§åˆļčƒŊ力。čĢ‹į™ŧ動čģŠčŧ›ä¸€æŦĄäģĨåĩæ¸Ŧæ”¯æ´į‹€æŗã€‚" + +#: openpilot/selfdrive/ui/layouts/video_player.py:485 +#: openpilot/selfdrive/ui/layouts/video_player.py:558 +#, python-brace-format +msgid "Video Player" +msgstr "åŊąį‰‡æ’­æ”žå™¨" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1180 +#, python-brace-format +msgid "View the error log for IQ.Pilot crashes." +msgstr "æĒĸčĻ– IQ.Pilot į•ļæŠŸįš„錯čĒ¤į´€éŒ„ã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1702 +#, python-brace-format +msgid "Vision Weights" +msgstr "čĻ–čĻēæŦŠé‡" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2098 +msgid "Visuals" +msgstr "éĄ¯į¤ē效果" + +#: openpilot/selfdrive/ui/layouts/nav.py:517 +#, python-brace-format +msgid "Waiting for GPS fix..." +msgstr "æ­Ŗåœ¨į­‰åž… GPS 厚äŊâ€Ļ" + +#: system/ui/widgets/esim_scanner.py:62 +#, python-brace-format +msgid "" +"Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA " +"code manually." +msgstr "æ­Ŗåœ¨į­‰åž…é§•é§›į›ŖæŽ§éĄé ­ã€‚čĢ‹äŊŋᔍé›ģäŋĄæĨ­č€…įš„ eSIM QR CodeīŧŒæˆ–手動čŧ¸å…Ĩ LPA įĸŧ。" + +#: openpilot/selfdrive/ui/onroad/alert_renderer.py:52 +#, python-brace-format +msgid "Waiting to start" +msgstr "į­‰åž…é–‹å§‹" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:122 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:159 +#, python-brace-format +msgid "Warning" +msgstr "č­Ļ告" + +#: openpilot/selfdrive/ui/layouts/settings/developer.py:20 +msgid "" +"Warning: This grants SSH access to all public keys in your GitHub settings. " +"Never enter a GitHub username other than your own. An IQ.Pilot employee will" +" NEVER ask you to add their GitHub username." +msgstr "" +"č­Ļ告īŧšæ­¤æ“äŊœæœƒå°‡ SSH 存取æŦŠæŽˆäēˆäŊ  GitHub č¨­åŽšä¸­įš„æ‰€æœ‰å…Ŧ開金鑰。切å‹ŋčŧ¸å…Ĩč‡ĒåˇąäģĨå¤–įš„ GitHub äŊŋį”¨č€…åį¨ąã€‚IQ.Pilot " +"įš„å“ĄåˇĨįĩ•不會čĻæą‚äŊ æ–°åĸžäģ–å€‘įš„ GitHub äŊŋį”¨č€…åį¨ąã€‚" + +#: iqpilot/ui/layouts/settings/iq_panels.py:2293 +#, python-brace-format +msgid "" +"Warning: steering may oscillate in turns below {}; turn this off if you feel" +" it." +msgstr "č­Ļ告īŧšåœ¨äŊŽæ–ŧ {} įš„åŊŽé“中čŊ‰å‘可čƒŊå‡ēįžæ“ē振īŧ›č‹Ĩ有此感čĻēčĢ‹é—œé–‰æ­¤é …ã€‚" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:112 +#, python-brace-format +msgid "Welcome to IQ.Pilot" +msgstr "æ­ĄčŋŽäŊŋᔍ IQ.Pilot" + +#: openpilot/selfdrive/ui/layouts/settings/toggles.py:27 +msgid "When enabled, pressing the accelerator pedal will disengage IQ.Pilot." +msgstr "å•Ÿį”¨åžŒīŧŒč¸Šä¸‹åŠ é€Ÿč¸æŋ將會č„Ģé›ĸ IQ.Pilot。" + +#: openpilot/selfdrive/ui/layouts/sidebar.py:56 +msgid "Wi-Fi" +msgstr "Wi‑Fi" + +#: system/ui/widgets/network.py:196 +#, python-brace-format +msgid "Wi-Fi Network Metered" +msgstr "Wi‑Fi 計量įļ˛čˇ¯" + +#: openpilot/selfdrive/ui/layouts/nav.py:472 +#, python-brace-format +msgid "Work" +msgstr "å…Ŧ司" + +#: system/ui/widgets/network.py:376 +#, python-brace-format +msgid "Wrong password" +msgstr "密įĸŧ錯čǤ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1191 +#, python-brace-format +msgid "Yes" +msgstr "是" + +#: iqpilot/ui/layouts/settings/iq_panels.py:435 +#, python-brace-format +msgid "Yes, delete all maps" +msgstr "是īŧŒåˆĒ除全部地圖" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:146 +#, python-brace-format +msgid "You must accept the Terms of Service in order to use IQ.Pilot." +msgstr "äŊ åŋ…é ˆæŽĨ受服務æĸæŦžæ‰čƒŊäŊŋᔍ IQ.Pilot。" + +#: openpilot/selfdrive/ui/layouts/onboarding.py:113 +#, python-brace-format +msgid "" +"You must accept the Terms of Service to use IQ.Pilot. Read the latest terms " +"before continuing at https://iqlvbs.com/tos." +msgstr "äŊ åŋ…é ˆæŽĨ受服務æĸæŦžæ‰čƒŊäŊŋᔍ IQ.Pilot。įšŧįēŒäš‹å‰īŧŒč̋臺 https://iqlvbs.com/tos é–ąčŽ€æœ€æ–°æĸæŦžã€‚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:169 +#, python-brace-format +msgid "" +"You must use your own eSIM profile after this. You cannot use Comma Prime " +"again unless you buy a new SIM from comma." +msgstr "䚋垌äŊ åŋ…é ˆäŊŋᔍč‡Ēåˇąįš„ eSIM č¨­åŽšæĒ”。除非向 comma čŗŧč˛ˇæ–°įš„ SIM åĄīŧŒåĻå‰‡į„Ąæŗ•å†æŦĄäŊŋᔍ Comma Prime。" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:133 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:141 +#, python-brace-format +msgid "activate" +msgstr "å•Ÿį”¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:91 +#, python-brace-format +msgid "active" +msgstr "äŊŋᔍ䏭" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:99 +#, python-brace-format +msgid "active model" +msgstr "į›Žå‰æ¨Ąåž‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:106 +#, python-brace-format +msgid "add esim profile" +msgstr "新åĸž eSIM č¨­åŽšæĒ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "add profile" +msgstr "新åĸžč¨­åޚæĒ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "aggressive" +msgstr "įŠæĨĩ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:103 +#, python-brace-format +msgid "apn settings" +msgstr "APN č¨­åŽš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto" +msgstr "č‡Ē動" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:32 +#, python-brace-format +msgid "auto dark" +msgstr "č‡Ēå‹•čŽŠæš—" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#, python-brace-format +msgid "" +"automatic\n" +"updates" +msgstr "" +"č‡Ē動\n" +"更新" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:405 +#, python-brace-format +msgid "back" +msgstr "čŋ”回" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:48 +#, python-brace-format +msgid "branch" +msgstr "分支" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:33 +#, python-brace-format +msgid "brightness delay" +msgstr "čŽŠæš—åģļ遲" + +#: openpilot/selfdrive/ui/layouts/video_player.py:768 +#, python-brace-format +msgid "calculating miles..." +msgstr "æ­Ŗåœ¨č¨ˆįŽ—é‡Œį¨‹â€Ļ" + +#: system/ui/widgets/esim_scanner.py:116 +#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py:38 +#: openpilot/selfdrive/ui/mici/onroad/driver_camera_dialog.py:89 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:43 +#, python-brace-format +msgid "camera starting" +msgstr "į›¸æŠŸå•Ÿå‹•ä¸­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:107 +#, python-brace-format +msgid "cellular metered" +msgstr "čĄŒå‹•įļ˛čˇ¯č¨ˆé‡åˆļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:216 +#, python-brace-format +msgid "" +"change\n" +"language" +msgstr "" +"čŽŠæ›´\n" +"čĒžč¨€" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:80 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:118 +#, python-brace-format +msgid "check for update" +msgstr "æĒĸæŸĨ更新" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:23 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:178 +#, python-brace-format +msgid "checking..." +msgstr "æ­Ŗåœ¨æĒĸæŸĨâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "combined" +msgstr "įĩ„合" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:113 +#, python-brace-format +msgid "combined model" +msgstr "合äŊĩæ¨Ąåž‹" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:115 +#, python-brace-format +msgid "configured" +msgstr "åˇ˛č¨­åŽš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "connect" +msgstr "é€Ŗįˇš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#, python-brace-format +msgid "connected" +msgstr "åˇ˛é€Ŗįˇš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "connecting..." +msgstr "æ­Ŗåœ¨é€Ŗįˇšâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:64 +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:330 +#, python-brace-format +msgid "continue" +msgstr "įšŧįēŒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "control" +msgstr "控åˆļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:77 +#, python-brace-format +msgid "creep from standstill (beta)" +msgstr "靜æ­ĸčĩˇæ­ĨæŊ›čĄŒīŧˆBetaīŧ‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:35 +#, python-brace-format +msgid "cruise" +msgstr "åˇĄčˆĒ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "curvature controller" +msgstr "æ›˛įŽ‡æŽ§åˆļ器" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:94 +#, python-brace-format +msgid "dashcam" +msgstr "行čģŠč¨˜éŒ„器" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:441 +#, python-brace-format +msgid "decline" +msgstr "拒įĩ•" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:30 +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:36 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "default" +msgstr "預設" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:138 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:147 +#, python-brace-format +msgid "delete" +msgstr "åˆĒ除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:111 +#, python-brace-format +msgid "developer" +msgstr "開į™ŧ者" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:103 +#, python-brace-format +msgid "device" +msgstr "čŖįŊŽ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:105 +#, python-brace-format +msgid "device ID" +msgstr "čŖįŊŽ ID" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"disable\n" +"force offroad" +msgstr "" +"關閉\n" +"åŧˇåˆļ駐čģŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "disable force offroad" +msgstr "關閉åŧˇåˆļ駐čģŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#: openpilot/selfdrive/ui/mici/widgets/button.py:541 +#, python-brace-format +msgid "disabled" +msgstr "åˇ˛åœį”¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:249 +#, python-brace-format +msgid "disconnecting..." +msgstr "æ­Ŗåœ¨ä¸­æ–ˇâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "disengage" +msgstr "觪除" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:19 +#, python-brace-format +msgid "disengage on accelerator" +msgstr "č¸Šæ˛šé–€č§Ŗé™¤" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:82 +#, python-brace-format +msgid "display" +msgstr "éĄ¯į¤ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:29 +#, python-brace-format +msgid "display brightness" +msgstr "čžĸåš•äēŽåēĻ" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "down" +msgstr "下" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:173 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:174 +#, python-brace-format +msgid "download update" +msgstr "下čŧ‰æ›´æ–°" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1906 +#, python-brace-format +msgid "downloading" +msgstr "æ­Ŗåœ¨ä¸‹čŧ‰" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:24 +#, python-brace-format +msgid "downloading..." +msgstr "æ­Ŗåœ¨ä¸‹čŧ‰â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:205 +#, python-brace-format +msgid "" +"driver\n" +"camera preview" +msgstr "" +"é§•é§›į›ŖæŽ§éĄé ­\n" +"預čĻŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:31 +#, python-brace-format +msgid "driving brightness" +msgstr "行駛äēŽåēĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "dynamic" +msgstr "動態" + +#: system/ui/widgets/network.py:100 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "eSIM" +msgstr "eSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:15 +#, python-brace-format +msgid "enable dashcam" +msgstr "å•Ÿį”¨čĄŒčģŠč¨˜éŒ„器" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:100 +#, python-brace-format +msgid "enable roaming" +msgstr "å•Ÿį”¨æŧĢ遊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:190 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:199 +#, python-brace-format +msgid "enabled" +msgstr "åˇ˛å•Ÿį”¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:73 +#, python-brace-format +msgid "enforce factory long." +msgstr "åŧˇåˆļäŊŋį”¨åŽŸåģ į¸ąå‘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:182 +#, python-brace-format +msgid "enter APN" +msgstr "čŧ¸å…Ĩ APN" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:42 +#, python-brace-format +msgid "enter GitHub username..." +msgstr "čŧ¸å…Ĩ GitHub äŊŋį”¨č€…åį¨ąâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:121 +#, python-brace-format +msgid "enter LPA activation code..." +msgstr "čŧ¸å…Ĩ LPA å•Ÿį”¨įĸŧâ€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "enter code" +msgstr "čŧ¸å…ĨäģŖįĸŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:429 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:65 +#, python-brace-format +msgid "enter password..." +msgstr "čŧ¸å…Ĩ密įĸŧâ€Ļ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:147 +#, python-brace-format +msgid "failed to check for update" +msgstr "æĒĸæŸĨæ›´æ–°å¤ąæ•—" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:168 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:169 +#, python-brace-format +msgid "failed to update" +msgstr "æ›´æ–°å¤ąæ•—" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "fast" +msgstr "åŋĢ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:25 +#, python-brace-format +msgid "finalizing update..." +msgstr "æ­Ŗåœ¨åŽŒæˆæ›´æ–°â€Ļ" + +#: system/ui/widgets/network.py:289 system/ui/widgets/network.py:376 +#, python-brace-format +msgid "for \"{}\"" +msgstr "éŠį”¨æ–ŧ「{}」" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:261 +#, python-brace-format +msgid "for private branch updates" +msgstr "ᔍæ–ŧį§æœ‰åˆ†æ”¯æ›´æ–°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:99 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:116 +#, python-brace-format +msgid "" +"force\n" +"offroad" +msgstr "" +"åŧˇåˆļ\n" +"駐čģŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:28 +#, python-brace-format +msgid "force mici UI" +msgstr "åŧˇåˆļäŊŋᔍ mici äģ‹éĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:111 +#, python-brace-format +msgid "force offroad" +msgstr "åŧˇåˆļ駐čģŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:247 +#, python-brace-format +msgid "forgetting..." +msgstr "æ­Ŗåœ¨åŋ˜č¨˜â€Ļ" + +#: system/ui/widgets/esim.py:123 +#, python-brace-format +msgid "format: LPA:1$...$..." +msgstr "æ ŧåŧīŧšLPA:1$...$..." + +#: iqpilot/ui/layouts/settings/iq_panels.py:1908 +#, python-brace-format +msgid "from cache" +msgstr "來č‡ĒåŋĢ取" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "h" +msgstr "小時" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:75 +#, python-brace-format +msgid "hyundai long. tuning" +msgstr "įžäģŖį¸ąå‘čĒŋæ Ą" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "info" +msgstr "čŗ‡č¨Š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:198 +#, python-brace-format +msgid "install update" +msgstr "åŽ‰čŖæ›´æ–°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/display.py:35 +#, python-brace-format +msgid "interactivity" +msgstr "äē’動逞時" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:81 +#, python-brace-format +msgid "iq.dynamic settings" +msgstr "iq.dynamic č¨­åŽš" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "km/h" +msgstr "km/h" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:104 +#, python-brace-format +msgid "lane change" +msgstr "čŽŠæ›čģŠé“" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:20 +#, python-brace-format +msgid "lane departure warnings" +msgstr "čģŠé“偏é›ĸč­Ļ告" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "lane turn speed" +msgstr "čŊ‰åŊŽé€ŸåēĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:61 +#, python-brace-format +msgid "lateral maneuver mode" +msgstr "å´å‘æ“æŽ§æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:80 +#, python-brace-format +msgid "lateral when cruise faulted" +msgstr "åˇĄčˆĒ故障時側向控åˆļ" + +#: system/ui/widgets/network.py:256 +#, python-brace-format +msgid "leave blank for automatic configuration" +msgstr "į•™įŠēäģĨč‡Ēå‹•č¨­åŽš" + +#: system/ui/widgets/esim.py:150 +#, python-brace-format +msgid "leave blank to skip" +msgstr "į•™įŠēäģĨį•Ĩ過" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:258 +#, python-brace-format +msgid "leave username and token blank to clear" +msgstr "į•™įŠēäŊŋį”¨č€…åį¨ąčˆ‡æŦŠæ–åŗå¯æ¸…é™¤" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "left" +msgstr "åˇĻ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/developer.py:58 +#, python-brace-format +msgid "longitudinal maneuver mode" +msgstr "į¸ąå‘æ“æŽ§æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:128 +#, python-brace-format +msgid "low-speed turn planning" +msgstr "äŊŽé€ŸčŊ‰åŊŽčĻåŠƒ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1581 +#, python-brace-format +msgid "m" +msgstr "分鐘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:94 +#, python-brace-format +msgid "manage profiles" +msgstr "įŽĄį†č¨­åŽšæĒ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "manual" +msgstr "手動" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:125 +#, python-brace-format +msgid "manual delay offset" +msgstr "手動åģļé˛åį§ģ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map only" +msgstr "僅地圖" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:55 +#, python-brace-format +msgid "map priority" +msgstr "地圖å„Ē先" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "metered" +msgstr "計量" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:78 +#, python-brace-format +msgid "models" +msgstr "æ¨Ąåž‹" + +#: openpilot/selfdrive/ui/onroad/hud_renderer.py:248 +#: openpilot/selfdrive/ui/mici/onroad/hud_renderer.py:276 +#: iqpilot/ui/onroad/hud_overlays.py:224 +#, python-brace-format +msgid "mph" +msgstr "mph" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:98 +#, python-brace-format +msgid "network" +msgstr "įļ˛čˇ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:89 +#, python-brace-format +msgid "network usage" +msgstr "įļ˛čˇ¯į”¨é‡" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:45 +#, python-brace-format +msgid "never" +msgstr "垞不" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "no" +msgstr "åĻ" + +#: openpilot/selfdrive/ui/mici/layouts/offroad_alerts.py:203 +#, python-brace-format +msgid "no alerts" +msgstr "æ˛’æœ‰æé†’" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "no nudge" +msgstr "į„Ąéœ€čŧ•推" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "normal" +msgstr "æ­Ŗå¸¸" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:255 +#, python-brace-format +msgid "not in range" +msgstr "ä¸åœ¨į¯„åœå…§" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:56 +#, python-brace-format +msgid "now" +msgstr "įžåœ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#, python-brace-format +msgid "nudge" +msgstr "čŧ•æŽ¨æ–šå‘į›¤" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:75 +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "off" +msgstr "關閉" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "offline" +msgstr "é›ĸ᎚" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:324 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:338 +#, python-brace-format +msgid "on" +msgstr "開啟" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:146 +#, python-brace-format +msgid "online" +msgstr "᎚䏊" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:126 +#, python-brace-format +msgid "optional nickname..." +msgstr "æšąį¨ąīŧˆé¸åĄĢīŧ‰â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:148 +#, python-brace-format +msgid "pair in app" +msgstr "åœ¨æ‡‰į”¨į¨‹åŧä¸­é…å°" + +#: openpilot/selfdrive/ui/mici/widgets/stock_pairing_dialog.py:37 +#: openpilot/selfdrive/ui/mici/widgets/pairing_dialog.py:34 +#, python-brace-format +msgid "pair with Konn3kt" +msgstr "與 Konn3kt 配對" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:117 +#, python-brace-format +msgid "policy weights" +msgstr "į­–į•ĨæŦŠé‡" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:98 +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:198 +#, python-brace-format +msgid "power off" +msgstr "關抟" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:76 +#, python-brace-format +msgid "predictive" +msgstr "預æ¸Ŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:150 +#, python-brace-format +msgid "profile actions" +msgstr "č¨­åŽšæĒ”操äŊœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:90 +#, python-brace-format +msgid "provider unknown" +msgstr "é›ģäŋĄæĨ­č€…æœĒįŸĨ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:120 +#, python-brace-format +msgid "purge model cache" +msgstr "æ¸…é™¤æ¨Ąåž‹åŋĢ取" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:294 +#, python-brace-format +msgid "queued" +msgstr "åˇ˛æŽ’å…ĨäŊ‡åˆ—" + +#: iqpilot/ui/layouts/settings/iq_panels.py:1909 +#, python-brace-format +msgid "ready" +msgstr "å°ąįˇ’" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:195 +#, python-brace-format +msgid "reboot" +msgstr "重新開抟" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:16 +#, python-brace-format +msgid "record driver camera" +msgstr "錄čŖŊé§•é§›į›ŖæŽ§éĄé ­" + +#: openpilot/selfdrive/ui/mici/layouts/settings/dashcam.py:17 +#, python-brace-format +msgid "record microphone audio" +msgstr "錄čŖŊéēĨ克éĸ¨" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:106 +#, python-brace-format +msgid "redownload model" +msgstr "重新下čŧ‰æ¨Ąåž‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:72 +#, python-brace-format +msgid "refresh profiles" +msgstr "é‡æ–°æ•´į†č¨­åŽšæĒ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:202 +#, python-brace-format +msgid "regulatory info" +msgstr "æŗ•čĻčŗ‡č¨Š" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "relaxed" +msgstr "čˆ’įˇŠ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:110 +#, python-brace-format +msgid "reload model list" +msgstr "重新čŧ‰å…Ĩæ¨Ąåž‹æ¸…å–Ž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:136 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:145 +#, python-brace-format +msgid "remove comma psim" +msgstr "į§ģ除 comma pSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:134 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:143 +#, python-brace-format +msgid "rename" +msgstr "重新å‘Ŋ名" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:153 +#, python-brace-format +msgid "rename profile..." +msgstr "重新å‘Ŋåč¨­åŽšæĒ”â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset" +msgstr "重設" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:192 +#, python-brace-format +msgid "reset calibration" +msgstr "é‡č¨­æ Ąæ­Ŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:209 +#, python-brace-format +msgid "" +"review\n" +"training guide" +msgstr "" +"æŸĨįœ‹\n" +"äŊŋį”¨æŒ‡å—" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:138 +#, python-brace-format +msgid "right" +msgstr "åŗ" + +#: iqpilot/ui/layouts/settings/iq_panels.py:622 +#: iqpilot/ui/layouts/settings/iq_panels.py:623 +#: iqpilot/ui/layouts/settings/iq_panels.py:624 +#: iqpilot/ui/layouts/settings/iq_panels.py:625 +#, python-brace-format +msgid "s" +msgstr "į§’" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:98 +#, python-brace-format +msgid "scan qr" +msgstr "掃描 QR Code" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:77 +#, python-brace-format +msgid "scan qr / enter code" +msgstr "掃描 QR / čŧ¸å…ĨäģŖįĸŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:302 +#, python-brace-format +msgid "searching for networks" +msgstr "æ­Ŗåœ¨æœå°‹įļ˛čˇ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:124 +#, python-brace-format +msgid "self-tuning steer delay" +msgstr "č‡Ēå‹•æ Ąæē–čŊ‰å‘åģļ遲" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:109 +#, python-brace-format +msgid "serial" +msgstr "åēč™Ÿ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:56 +#, python-brace-format +msgid "set speed" +msgstr "č¨­åŽščģŠé€Ÿ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:22 +#, python-brace-format +msgid "set units from location" +msgstr "䞝äŊįŊŽč¨­åŽšå–ŽäŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:239 +#, python-brace-format +msgid "" +"slide to\n" +"clear cache" +msgstr "" +"æģ‘å‹•äģĨ\n" +"清除åŋĢ取" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:118 +#, python-brace-format +msgid "" +"slide to\n" +"disconnect" +msgstr "" +"æģ‘å‹•äģĨ\n" +"ä¸­æ–ˇé€Ŗįˇš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:90 +#, python-brace-format +msgid "" +"slide to\n" +"forget" +msgstr "" +"æģ‘å‹•äģĨ\n" +"åŋ˜č¨˜įļ˛čˇ¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:296 +#, python-brace-format +msgid "" +"slide to\n" +"redownload" +msgstr "" +"æģ‘å‹•äģĨ\n" +"重新下čŧ‰" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:355 +#, python-brace-format +msgid "" +"slide to\n" +"reset calibration" +msgstr "" +"æģ‘å‹•äģĨ\n" +"é‡č¨­æ Ąæ­Ŗ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:77 +#, python-brace-format +msgid "" +"slide to\n" +"{}" +msgstr "" +"æģ‘å‹•äģĨ\n" +"{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:177 +#, python-brace-format +msgid "" +"slide to remove\n" +"comma psim" +msgstr "" +"æģ‘å‹•äģĨį§ģ除\n" +"comma pSIM" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:129 +#, python-brace-format +msgid "slow" +msgstr "æ…ĸ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:84 +#, python-brace-format +msgid "smooth steering" +msgstr "åšŗæģ‘čŊ‰å‘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:107 +#, python-brace-format +msgid "software" +msgstr "čģŸéĢ”" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:88 +#, python-brace-format +msgid "speed limit settings" +msgstr "é€Ÿé™č¨­åŽš" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "standard" +msgstr "標æē–" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "standby" +msgstr "åž…å‘Ŋ" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:193 +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:218 +#, python-brace-format +msgid "" +"start the car to\n" +"use IQ.Pilot" +msgstr "" +"į™ŧ動čģŠčŧ›äģĨ\n" +"äŊŋᔍ IQ.Pilot" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:251 +#, python-brace-format +msgid "starting..." +msgstr "æ­Ŗåœ¨å•Ÿå‹•â€Ļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/esim_ui.py:68 +#, python-brace-format +msgid "status" +msgstr "į‹€æ…‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:17 +#, python-brace-format +msgid "stay engaged" +msgstr "äŋæŒæŽĨįŽĄ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:66 +#, python-brace-format +msgid "steering" +msgstr "čŊ‰å‘" + +#: openpilot/selfdrive/ui/mici/layouts/settings/steering.py:102 +#, python-brace-format +msgid "steering assistance behavior" +msgstr "čŊ‰å‘čŧ”åŠŠčĄŒį‚ē" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:85 +#, python-brace-format +msgid "stock" +msgstr "原åģ " + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:78 +#, python-brace-format +msgid "stop and go manual brake" +msgstr "æ‰‹į…žčģŠčĩ°čĩ°åœåœ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:102 +#, python-brace-format +msgid "stop download" +msgstr "停æ­ĸ下čŧ‰" + +#: openpilot/selfdrive/ui/mici/onroad/augmented_road_view.py:216 +#, python-brace-format +msgid "system booting" +msgstr "įŗģįĩąå•Ÿå‹•中" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:300 +#, python-brace-format +msgid "target branch" +msgstr "į›Žæ¨™åˆ†æ”¯" + +#: openpilot/selfdrive/ui/mici/layouts/settings/device.py:213 +#, python-brace-format +msgid "" +"terms &\n" +"conditions" +msgstr "" +"æĸæŦžčˆ‡\n" +"æĸäģļ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:253 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:56 +#, python-brace-format +msgid "tethering" +msgstr "個äēēį†ąéģž" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:69 +#, python-brace-format +msgid "tethering password" +msgstr "į†ąéģžå¯†įĸŧ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:62 +#, python-brace-format +msgid "toggles" +msgstr "切換" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:86 +#, python-brace-format +msgid "trips" +msgstr "čĄŒį¨‹" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall" +msgstr "č§Ŗé™¤åŽ‰čŖ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:403 +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:353 +#, python-brace-format +msgid "uninstall IQ.Pilot" +msgstr "č§Ŗé™¤åŽ‰čŖ IQ.Pilot" + +#: system/ui/widgets/network.py:194 +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:76 +#, python-brace-format +msgid "unmetered" +msgstr "不限æĩé‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:257 +#, python-brace-format +msgid "unsupported" +msgstr "不支援" + +#: openpilot/selfdrive/ui/layouts/settings/device.py:137 +#, python-brace-format +msgid "up" +msgstr "上" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:179 +#, python-brace-format +msgid "up to date" +msgstr "åˇ˛æ˜¯æœ€æ–°" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:158 +#, python-brace-format +msgid "up to date, last checked never" +msgstr "厞į‚ē最新īŧŒæœ€åžŒæĒĸæŸĨīŧšåžžæœĒ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:156 +#, python-brace-format +msgid "up to date, last checked {}" +msgstr "厞į‚ē最新īŧŒæœ€åžŒæĒĸæŸĨīŧš{}" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:248 +#, python-brace-format +msgid "" +"update\n" +"install mode" +msgstr "" +"æ›´æ–°åŽ‰čŖ\n" +"æ¨Ąåŧ" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:150 +#, python-brace-format +msgid "update available" +msgstr "æœ‰å¯į”¨æ›´æ–°" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:151 +#, python-brace-format +msgid "" +"updater failed\n" +"to respond" +msgstr "" +"æ›´æ–°į¨‹åŧį„Ą\n" +"回應" + +#: openpilot/selfdrive/ui/mici/layouts/settings/toggles.py:21 +#, python-brace-format +msgid "use metric units" +msgstr "äŊŋᔍå…Ŧåˆļå–ŽäŊ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:70 +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:90 +#, python-brace-format +msgid "vehicle" +msgstr "čģŠčŧ›" + +#: openpilot/selfdrive/ui/mici/layouts/settings/software.py:44 +#, python-brace-format +msgid "version" +msgstr "į‰ˆæœŦ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/vehicle.py:83 +#, python-brace-format +msgid "virtual torque blending" +msgstr "虛æ“Ŧæ‰­åŠ›čžåˆ" + +#: openpilot/selfdrive/ui/mici/layouts/settings/models.py:115 +#, python-brace-format +msgid "vision weights" +msgstr "čĻ–čĻēæŦŠé‡" + +#: openpilot/selfdrive/ui/mici/layouts/settings/settings.py:74 +#, python-brace-format +msgid "visuals" +msgstr "éĄ¯į¤ē效果" + +#: openpilot/selfdrive/ui/mici/layouts/settings/cruise.py:87 +#, python-brace-format +msgid "warning" +msgstr "č­Ļ告" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/network_layout.py:92 +#, python-brace-format +msgid "wi-fi" +msgstr "wi-fi" + +#: openpilot/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py:259 +#, python-brace-format +msgid "wrong password" +msgstr "密įĸŧ錯čǤ" + +#: openpilot/selfdrive/ui/mici/layouts/onboarding.py:297 +#, python-brace-format +msgid "yes" +msgstr "是" + +#: openpilot/selfdrive/ui/layouts/home.py:806 +#, python-brace-format +msgid "{} ALERT" +msgid_plural "{} ALERTS" +msgstr[0] "{} 則č­Ļį¤ē" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:65 +#, python-brace-format +msgid "{} day ago" +msgid_plural "{} days ago" +msgstr[0] "{} 夊前" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:62 +#, python-brace-format +msgid "{} hour ago" +msgid_plural "{} hours ago" +msgstr[0] "{} 小時前" + +#: openpilot/selfdrive/ui/layouts/settings/software.py:59 +#, python-brace-format +msgid "{} minute ago" +msgid_plural "{} minutes ago" +msgstr[0] "{} 分鐘前" + +#, python-format +#~ msgid "1 year of drive storage" +#~ msgstr "1 åš´čĄŒé§›čŗ‡æ–™å„˛å­˜" + +#, python-format +#~ msgid "24/7 LTE connectivity" +#~ msgstr "å…¨åš´į„Ąäŧ‘ LTE é€Ŗįˇš" + +#~ msgid "" +#~ "WARNING: openpilot longitudinal control is in alpha for this car and will" +#~ " disable Automatic Emergency Braking (AEB).

    On this car, " +#~ "openpilot defaults to the car's built-in ACC instead of openpilot's " +#~ "longitudinal control. Enable this to switch to openpilot longitudinal " +#~ "control. Enabling Experimental mode is recommended when enabling openpilot " +#~ "longitudinal control alpha. Changing this setting will restart openpilot if " +#~ "the car is powered on." +#~ msgstr "" +#~ "č­Ļ告īŧšæ­¤č슿Ŧžįš„ openpilot į¸ąå‘æŽ§åˆļäģį‚ē alphaīŧŒå°‡æœƒåœį”¨č‡Ēå‹•įˇŠæ€Ĩį…žčģŠ " +#~ "(AEB)。

    在此č슿Ŧžä¸ŠīŧŒopenpilot 預設äŊŋᔍčģŠčŧ‰ ACCīŧŒč€Œéž openpilot įš„į¸ąå‘æŽ§åˆļã€‚å•Ÿį”¨æ­¤é¸é …å¯åˆ‡æ›į‚ē " +#~ "openpilot į¸ąå‘æŽ§åˆļ。åģēč­°åŒæ™‚å•Ÿį”¨å¯ĻéŠ—æ¨Ąåŧã€‚č‹ĨčģŠčŧ›é€šé›ģīŧŒčŽŠæ›´æ­¤č¨­åŽšå°‡æœƒé‡æ–°å•Ÿå‹• openpilot。" + +#~ msgid "" +#~ "ADB (Android Debug Bridge) allows connecting to your device over USB or over" +#~ " the network. See https://docs.comma.ai/how-to/connect-to-comma for more " +#~ "info." +#~ msgstr "" +#~ "ADB (Android Debug Bridge) 可透過 USB 或įļ˛čˇ¯é€Ŗįˇšč‡ŗæ‚¨įš„čŖįŊŽã€‚čŠŗčĻ‹ https://docs.comma.ai/how-" +#~ "to/connect-to-comma。" + +#, python-format +#~ msgid "Always-On Driver Monitoring" +#~ msgstr "持įēŒå•Ÿį”¨é§•é§›į›ŖæŽ§" + +#, python-format +#~ msgid "" +#~ "An alpha version of openpilot longitudinal control can be tested, along with" +#~ " Experimental mode, on non-release branches." +#~ msgstr "openpilot į¸ąå‘æŽ§åˆļįš„ alpha į‰ˆæœŦ可æ–ŧ非į™ŧčĄŒåˆ†æ”¯æ­é…å¯ĻéŠ—æ¨Ąåŧé€˛čĄŒæ¸ŦčŠĻ。" + +#, python-format +#~ msgid "Bookmark konn3kt.com to your home screen to use it like an app" +#~ msgstr "將 konn3kt.com 加到ä¸ģį•ĢéĸīŧŒåƒ App ä¸€æ¨ŖäŊŋᔍ" + +#, python-format +#~ msgid "CHILL MODE ON" +#~ msgstr "åŽ‰įŠŠæ¨Ąåŧåˇ˛é–‹å•Ÿ" + +#, python-format +#~ msgid "Changing this setting will restart openpilot if the car is powered on." +#~ msgstr "č‹ĨčģŠčŧ›é€šé›ģīŧŒčŽŠæ›´æ­¤č¨­åŽšå°‡é‡æ–°å•Ÿå‹• openpilot。" + +#, python-format +#~ msgid "Click \"add new device\" and scan the QR code on the right" +#~ msgstr "éģžé¸ã€Œæ–°åĸžčŖįŊŽã€īŧŒæŽƒæåŗå´ QR įĸŧ" + +#, python-format +#~ msgid "Decline, uninstall openpilot" +#~ msgstr "拒įĩ•ä¸Ļč§Ŗé™¤åŽ‰čŖ openpilot" + +#, python-format +#~ msgid "EXPERIMENTAL MODE ON" +#~ msgstr "å¯ĻéŠ—æ¨Ąåŧåˇ˛é–‹å•Ÿ" + +#~ msgid "Enable driver monitoring even when openpilot is not engaged." +#~ msgstr "åŗäŊŋæœĒ啟動 openpilot äēĻå•Ÿį”¨é§•é§›į›ŖæŽ§ã€‚" + +#, python-format +#~ msgid "Enable openpilot" +#~ msgstr "å•Ÿį”¨ openpilot" + +#, python-format +#~ msgid "" +#~ "Enable the openpilot longitudinal control (alpha) toggle to allow " +#~ "Experimental mode." +#~ msgstr "å•Ÿį”¨ openpilot į¸ąå‘æŽ§åˆļīŧˆalphaīŧ‰åˆ‡æ›īŧŒäģĨäŊŋᔍå¯ĻéŠ—æ¨Ąåŧã€‚" + +#, python-format +#~ msgid "Experimental Mode" +#~ msgstr "å¯ĻéŠ—æ¨Ąåŧ" + +#, python-format +#~ msgid "" +#~ "Experimental mode is currently unavailable on this car since the car's stock" +#~ " ACC is used for longitudinal control." +#~ msgstr "æ­¤č슿Ŧžį›Žå‰į„Ąæŗ•äŊŋᔍå¯ĻéŠ—æ¨ĄåŧīŧŒå› į‚ēį¸ąå‘æŽ§åˆļäŊŋį”¨įš„æ˜¯åŽŸåģ  ACC。" + +#, python-format +#~ msgid "FEATURES:" +#~ msgstr "PRIME 功čƒŊīŧš" + +#~ msgid "Firehose" +#~ msgstr "Firehose" + +#~ msgid "Firehose Mode" +#~ msgstr "Firehose æ¨Ąåŧ" + +#~ msgid "" +#~ "For maximum effectiveness, bring your device inside and connect to a good USB-C adapter and Wi-Fi weekly.\n" +#~ "\n" +#~ "Firehose Mode can also work while you're driving if connected to a hotspot or unlimited SIM card.\n" +#~ "\n" +#~ "\n" +#~ "Frequently Asked Questions\n" +#~ "\n" +#~ "Does it matter how or where I drive? Nope, just drive as you normally would.\n" +#~ "\n" +#~ "Do all of my segments get pulled in Firehose Mode? No, we selectively pull a subset of your segments.\n" +#~ "\n" +#~ "What's a good USB-C adapter? Any fast phone or laptop charger should be fine.\n" +#~ "\n" +#~ "Does it matter which software I run? Yes, only upstream openpilot (and particular forks) are able to be used for training." +#~ msgstr "" +#~ "į‚ē達最äŊŗæ•ˆæžœīŧŒčĢ‹å°‡čŖįŊŽå¸ļ到厤內īŧŒä¸Ļæ¯é€ąé€ŖæŽĨå„ĒčŗĒ USB‑C 充é›ģå™¨čˆ‡ Wi‑Fi。\n" +#~ "\n" +#~ "č‹Ĩé€Ŗä¸Šį†ąéģžæˆ–吃到éŖŊ門號īŧŒčĄŒčģŠä¸­äšŸå¯äŊŋᔍ Firehose æ¨Ąåŧã€‚\n" +#~ "\n" +#~ "\n" +#~ "常čĻ‹å•éĄŒ\n" +#~ "\n" +#~ "我怎éēŧ開、在å“ĒčŖĄé–‹æœ‰åˇŽå—ŽīŧŸæ˛’有īŧŒåšŗå¸¸æ€Žéēŧé–‹å°ąæ€Žéēŧ開。\n" +#~ "\n" +#~ "Firehose æ¨Ąåŧæœƒæ‹‰å–æˆ‘æ‰€æœ‰į‰‡æŽĩ嗎īŧŸä¸æœƒīŧŒæˆ‘å€‘æœƒé¸æ“‡æ€§æ‹‰å–éƒ¨åˆ†į‰‡æŽĩ。\n" +#~ "\n" +#~ "äģ€éēŧ是åĨŊįš„ USB‑C 充é›ģ器īŧŸäģģäŊ•åŋĢé€Ÿįš„æ‰‹æŠŸæˆ–į­†é›ģ充é›ģ器éƒŊ可äģĨ。\n" +#~ "\n" +#~ "æˆ‘čˇ‘äģ€éēŧčģŸéĢ”æœ‰åˇŽå—ŽīŧŸæœ‰īŧŒåĒ有上游 openpilotīŧˆåŠį‰šåŽšåˆ†æ”¯īŧ‰å¯į”¨æ–ŧč¨“įˇ´ã€‚" + +#, python-format +#~ msgid "Go to https://konn3kt.com on your phone" +#~ msgstr "在手抟上前垀 https://konn3kt.com" + +#, python-format +#~ msgid "INACTIVE: connect to an unmetered network" +#~ msgstr "æœĒå•Ÿį”¨īŧšč̋逪æŽĨ不限æĩé‡įļ˛čˇ¯" + +#, python-format +#~ msgid "Joystick Debug Mode" +#~ msgstr "搖æĄŋé™¤éŒ¯æ¨Ąåŧ" + +#, python-format +#~ msgid "" +#~ "Maximize your training data uploads to improve openpilot's driving models." +#~ msgstr "æœ€å¤§åŒ–ä¸Šå‚ŗč¨“įˇ´čŗ‡æ–™īŧŒäģĨæ”šé€˛ openpilot įš„é§•é§›æ¨Ąåž‹ã€‚" + +#~ msgid "NO" +#~ msgstr "åĻ" + +#, python-format +#~ msgid "No SSH keys found" +#~ msgstr "扞不到 SSH 金鑰" + +#, python-format +#~ msgid "Open" +#~ msgstr "開啟" + +#~ msgid "PANDA" +#~ msgstr "PANDA" + +#, python-format +#~ msgid "" +#~ "Pair your device with Konn3kt (konn3kt.com) and claim your comma prime " +#~ "offer." +#~ msgstr "å°‡čŖįŊŽčˆ‡ Konn3ktīŧˆkonn3kt.comīŧ‰é…å°īŧŒé ˜å–æ‚¨įš„ Konn3kt å„Ē惠。" + +#, python-format +#~ msgid "Pair your device with Konn3kt at konn3kt.com" +#~ msgstr "前垀 konn3kt.com 成į‚ē Konn3kt æœƒå“Ą" + +#, python-format +#~ msgid "Remote snapshots" +#~ msgstr "遠įĢ¯æ“ˇåœ–" + +#~ msgid "Review the rules, features, and limitations of openpilot" +#~ msgstr "æĒĸčĻ– openpilot įš„čĻå‰‡ã€åŠŸčƒŊ與限åˆļ" + +#~ msgid "" +#~ "Standard is recommended. In aggressive mode, openpilot will follow lead cars" +#~ " closer and be more aggressive with the gas and brake. In relaxed mode " +#~ "openpilot will stay further away from lead cars. On supported cars, you can " +#~ "cycle through these personalities with your steering wheel distance button." +#~ msgstr "" +#~ "åģēč­°äŊŋį”¨æ¨™æē–æ¨Ąåŧã€‚įŠæĨĩæ¨Ąåŧä¸‹īŧŒopenpilot " +#~ "會更č˛ŧčŋ‘前čģŠīŧŒæ˛šé–€čˆ‡į…žčģŠåæ‡‰æ›´įŠæĨĩīŧ›åžžåŽšæ¨Ąåŧä¸‹īŧŒæœƒčˆ‡å‰čģŠäŋæŒæ›´é čˇé›ĸ。æ–ŧ支援č슿ŦžīŧŒå¯į”¨æ–šå‘į›¤čˇé›ĸ按鈕切換這äē›éĸ¨æ ŧ。" + +#~ msgid "" +#~ "Use the openpilot system for adaptive cruise control and lane keep driver " +#~ "assistance. Your attention is required at all times to use this feature." +#~ msgstr "äŊŋᔍ openpilot 進行 ACC 與čģŠé“įļ­æŒčŧ”劊。äŊŋį”¨æ­¤åŠŸčƒŊ時īŧŒæ‚¨åŋ…須始įĩ‚äŋæŒå°ˆæŗ¨ã€‚" + +#~ msgid "" +#~ "Warning: This grants SSH access to all public keys in your GitHub settings. " +#~ "Never enter a GitHub username other than your own. A comma employee will " +#~ "NEVER ask you to add their GitHub username." +#~ msgstr "" +#~ "č­Ļ告īŧšé€™å°‡æŽˆäēˆå°æ‚¨ GitHub č¨­åŽšä¸­æ‰€æœ‰å…Ŧé–‹é‡‘é‘°įš„ SSH 存取æŦŠã€‚čĢ‹å‹ŋčŧ¸å…Ĩ非您æœŦäēēįš„ GitHub å¸ŗč™Ÿã€‚comma " +#~ "å“ĄåˇĨįĩ•不會čĻæą‚æ‚¨æ–°åĸžäģ–å€‘įš„å¸ŗč™Ÿã€‚" + +#, python-format +#~ msgid "Welcome to openpilot" +#~ msgstr "æ­ĄčŋŽäŊŋᔍ openpilot" + +#~ msgid "When enabled, pressing the accelerator pedal will disengage openpilot." +#~ msgstr "å•Ÿį”¨åžŒīŧŒč¸Šä¸‹åŠ é€Ÿč¸æŋ將會č„Ģé›ĸ openpilot。" + +#, python-format +#~ msgid "You must accept the Terms and Conditions in order to use openpilot." +#~ msgstr "您åŋ…é ˆæŽĨ受æĸæŦžčˆ‡į´°å‰‡æ‰čƒŊäŊŋᔍ openpilot。" + +#, python-format +#~ msgid "" +#~ "You must accept the Terms and Conditions to use openpilot. Read the latest " +#~ "terms at https://comma.ai/terms before continuing." +#~ msgstr "您åŋ…é ˆæŽĨ受æĸæŦžčˆ‡į´°å‰‡æ‰čƒŊäŊŋᔍ openpilot。įšŧįēŒå‰čĢ‹é–ąčŽ€ https://comma.ai/terms ä¸Šįš„æœ€æ–°æĸæŦžã€‚" + +#, python-format +#~ msgid "openpilot Longitudinal Control (Alpha)" +#~ msgstr "openpilot į¸ąå‘æŽ§åˆļīŧˆAlphaīŧ‰" + +#, python-format +#~ msgid "openpilot Unavailable" +#~ msgstr "openpilot į„Ąæŗ•äŊŋᔍ" + +#, python-format +#~ msgid "" +#~ "openpilot defaults to driving in chill mode. Experimental mode enables " +#~ "alpha-level features that aren't ready for chill mode. Experimental features" +#~ " are listed below:

    End-to-End Longitudinal Control


    Let the " +#~ "driving model control the gas and brakes. openpilot will drive as it thinks " +#~ "a human would, including stopping for red lights and stop signs. Since the " +#~ "driving model decides the speed to drive, the set speed will only act as an " +#~ "upper bound. This is an alpha quality feature; mistakes should be " +#~ "expected.

    New Driving Visualization


    The driving visualization" +#~ " will transition to the road-facing wide-angle camera at low speeds to " +#~ "better show some turns. The Experimental mode logo will also be shown in the" +#~ " top right corner." +#~ msgstr "" +#~ "openpilot 預設äģĨåŽ‰įŠŠæ¨ĄåŧčĄŒé§›ã€‚å¯ĻéŠ—æ¨Ąåŧå•Ÿį”¨å°šæœĒæē–å‚™åĨŊ進å…ĨåŽ‰įŠŠæ¨Ąåŧįš„ Alpha " +#~ "į­‰į´šåŠŸčƒŊ。å¯Ļ銗功čƒŊåς䏋īŧš

    į̝到įĢ¯į¸ąå‘æŽ§åˆļ


    čŽ“é§•é§›æ¨Ąåž‹æŽ§åˆļæ˛šé–€čˆ‡į…žčģŠã€‚openpilot " +#~ "會åĻ‚åŒäēē類駕駛čˆŦ行駛īŧŒåŒ…æ‹Ŧåœ¨į´…į‡ˆčˆ‡åœč슿¨™čĒŒå‰åœčģŠã€‚į”ąæ–ŧé§•é§›æ¨Ąåž‹æąēåŽščĄŒé§›é€ŸåēĻīŧŒč¨­åŽšé€ŸåēĻ僅äŊœį‚ē上限。此į‚ē Alpha " +#~ "品čŗĒ功čƒŊīŧ›é æœŸæœƒæœ‰å¤ąčĒ¤ã€‚

    全新駕駛čĻ–čĻē化


    在äŊŽé€Ÿæ™‚īŧŒé§•é§›čĻ–čĻēåŒ–å°‡åˆ‡æ›č‡ŗéĸå‘é“čˇ¯įš„åģŖč§’鏡頭äģĨ更åĨŊå‘ˆįžéƒ¨åˆ†čŊ‰åŊŽã€‚åŗä¸Šč§’äēĻæœƒéĄ¯į¤ēå¯ĻéŠ—æ¨Ąåŧåœ–į¤ē。" + +#, python-format +#~ msgid "" +#~ "openpilot is continuously calibrating, resetting is rarely required. " +#~ "Resetting calibration will restart openpilot if the car is powered on." +#~ msgstr "openpilot 會持į猿 Ąæ­ŖīŧŒé€šå¸¸ä¸éœ€é‡č¨­ã€‚č‹ĨčģŠčŧ›é€šé›ģīŧŒé‡č¨­æ Ąæ­Ŗå°‡é‡æ–°å•Ÿå‹• openpilot。" + +#~ msgid "" +#~ "openpilot learns to drive by watching humans, like you, drive.\n" +#~ "\n" +#~ "Firehose Mode allows you to maximize your training data uploads to improve openpilot's driving models. More data means bigger models, which means better Experimental Mode." +#~ msgstr "" +#~ "openpilot é€éŽč§€å¯Ÿäēē類īŧˆäšŸå°ąæ˜¯æ‚¨īŧ‰įš„駕駛斚åŧäž†å­¸įŋ’。\n" +#~ "\n" +#~ "Firehose æ¨Ąåŧå¯čŽ“æ‚¨æœ€å¤§åŒ–ä¸Šå‚ŗč¨“įˇ´čŗ‡æ–™īŧŒäģĨæ”šé€˛ openpilot įš„é§•é§›æ¨Ąåž‹ã€‚æ›´å¤ščŗ‡æ–™äģŖčĄ¨æ›´å¤§įš„æ¨Ąåž‹īŧŒäšŸå°ąäģŖčĄ¨æ›´åĨŊįš„å¯ĻéŠ—æ¨Ąåŧã€‚" + +#, python-format +#~ msgid "openpilot longitudinal control may come in a future update." +#~ msgstr "openpilot į¸ąå‘æŽ§åˆļ可čƒŊæ–ŧæœĒ䞆更新提䞛。" + +#~ msgid "" +#~ "openpilot requires the device to be mounted within 4° left or right and " +#~ "within 5° up or 9° down." +#~ msgstr "openpilot čĻæą‚čŖįŊŽåŽ‰čŖåœ¨åˇĻåŗ 4°、上 5° 或下 9° äģĨ內。" + +#, python-format +#~ msgid "{} segment of your driving is in the training dataset so far." +#~ msgid_plural "{} segments of your driving is in the training dataset so far." +#~ msgstr[0] "į›Žå‰åˇ˛æœ‰ {} å€‹æ‚¨įš„é§•é§›į‰‡æŽĩį´å…Ĩč¨“įˇ´čŗ‡æ–™é›†ã€‚" +#~ msgstr[1] "į›Žå‰åˇ˛æœ‰ {} å€‹æ‚¨įš„é§•é§›į‰‡æŽĩį´å…Ĩč¨“įˇ´čŗ‡æ–™é›†ã€‚" + +#, python-format +#~ msgid "✓ PAIRED" +#~ msgstr "✓ åˇ˛č¨‚é–ą" + +#, python-format +#~ msgid "đŸ”Ĩ Firehose Mode đŸ”Ĩ" +#~ msgstr "đŸ”Ĩ Firehose æ¨Ąåŧ đŸ”Ĩ" diff --git a/iqpilot/selfdrive/ui/translations/languages.json b/iqpilot/selfdrive/ui/translations/languages.json new file mode 100644 index 000000000..d07b485ff --- /dev/null +++ b/iqpilot/selfdrive/ui/translations/languages.json @@ -0,0 +1,16 @@ +{ + "English": "en", + "Deutsch": "de", + "Français": "fr", + "PortuguÃĒs": "pt-BR", + "EspaÃąol": "es", + "Polski": "pl", + "TÃŧrkçe": "tr", + "ĐŖĐēŅ€Đ°Ņ—ĐŊҁҌĐēа": "uk", + "Ø§Ų„ØšØąØ¨ŲŠØŠ": "ar", + "āš„ā¸—ā¸ĸ": "th", + "中文īŧˆįšéĢ”īŧ‰": "zh-CHT", + "中文īŧˆįŽ€äŊ“īŧ‰": "zh-CHS", + "한ęĩ­ė–´": "ko", + "æ—ĨæœŦčĒž": "ja" +} diff --git a/iqpilot/selfdrive/ui/ui.py b/iqpilot/selfdrive/ui/ui.py new file mode 100755 index 000000000..34de32f2a --- /dev/null +++ b/iqpilot/selfdrive/ui/ui.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +import ctypes +import os +import time +import pyray as rl + +from iqpilot.system.hardware import TICI +from iqpilot.common.realtime import Priority, config_realtime_process, set_core_affinity +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.selfdrive.ui.layouts.main import MainLayout +from iqpilot.selfdrive.ui.mici.layouts.main import MiciMainLayout +from iqpilot.selfdrive.ui.ui_state import ui_state + +_FPS_OVERRIDE = os.getenv("FPS") +UI_OFFROAD_FPS = int(os.getenv("UI_OFFROAD_FPS", _FPS_OVERRIDE or "60")) +UI_ONROAD_FPS = int(os.getenv("UI_ONROAD_FPS", _FPS_OVERRIDE or "60")) + + +def main(): + cores = {5, } + # Run the UI above plannerd/radard (CTRL_LOW=51), which share core 5 with us after the TICI + # reaffine. At equal priority under SCHED_FIFO the render loop can't preempt their bursts and + # misses the vblank deadline onroad; stock runs the UI at CTRL_HIGH for exactly this reason. + config_realtime_process(0, Priority.CTRL_HIGH) + + gui_app.init_window("UI", fps=UI_OFFROAD_FPS, screen_recordable=True) + big = gui_app.big_ui() + if big: + # BIG UI (comma 3/3x): rendered manually each frame (unchanged). + main_layout = MainLayout() + main_layout.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + else: + # mici (comma 4): drives the nav stack; MiciMainLayout pushes itself in __init__ + # and is rendered by gui_app.render() (settings push on top). + main_layout = MiciMainLayout() + + # Tile decode/upload churn (1MB stb buffers off worker threads) grows glibc arenas + # that are never returned to the kernel; periodic trim keeps freed pages from + # accumulating as resident memory on long map/nav drives. + libc_trim = None + if TICI: + try: + libc_trim = ctypes.CDLL("libc.so.6").malloc_trim + except (OSError, AttributeError): + libc_trim = None + last_trim = time.monotonic() + + for should_render in gui_app.render(): + ui_state.update() + gui_app.set_target_fps(UI_ONROAD_FPS if ui_state.started else UI_OFFROAD_FPS) + if should_render: + if big: + main_layout.render() + + # reaffine after power save offlines our core + if TICI and os.sched_getaffinity(0) != cores: + try: + set_core_affinity(list(cores)) + except OSError: + pass + + if libc_trim is not None and time.monotonic() - last_trim > 300.0: + last_trim = time.monotonic() + libc_trim(0) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/selfdrive/ui/ui_state.py b/iqpilot/selfdrive/ui/ui_state.py new file mode 100644 index 000000000..07af7795b --- /dev/null +++ b/iqpilot/selfdrive/ui/ui_state.py @@ -0,0 +1,580 @@ +import pyray as rl +import numpy as np +import time +import threading +from collections.abc import Callable +from enum import Enum, IntEnum +from iqpilot.cereal import messaging, car, log, custom +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.auto_units import AutoUnits +from iqpilot.selfdrive.ui.lib.prime_state import PrimeState +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.hardware import HARDWARE, PC + +BACKLIGHT_OFFROAD = 65 if HARDWARE.get_device_type() == "mici" else 50 + +OpenpilotState = log.SelfdriveState.OpenpilotState +GuidanceState = custom.AlwaysOnLateral.AlwaysOnLateralState + +ONROAD_BRIGHTNESS_TIMER_PAUSED = -1 + + +def log_param_from_bytes(params: Params, key: str, schema): + # a capnp param written by anything other than the daemon that owns it takes the whole UI + # down at import time, and the UI cannot repair it -- read it defensively and carry on + dat = params.get(key) + if not dat: + return None + try: + return messaging.log_from_bytes(dat, schema) + except Exception: + cloudlog.exception(f"ui: ignoring malformed {key}") + return None + + +class OnroadTimerStatus(Enum): + NONE = 0 + PAUSE = 1 + RESUME = 2 + + +class OnroadBrightness(IntEnum): + AUTO = 0 + AUTO_DARK = 1 + + +class IQUIState: + def __init__(self): + self.params = Params() + self.sm_services_ext = [ + "iqModelManager", "iqState", "iqPlan", "iqNavState", + "gpsLocation", "lateralTorqueParameters", + "iqLiveData", "iqNavRenderState", "lateralDelay" + ] + + self.update_params() + + self.auto_units = AutoUnits(self.params) + self.onroad_brightness_timer: int = 0 + self.custom_interactive_timeout: int = self.params.get("InteractivityTimeout", return_default=True) + self.reset_onroad_sleep_timer() + + def update(self) -> None: + self.auto_units.update() + + def onroad_brightness_handle_alerts(self, started: bool, alert): + # while an alert is on screen the dim countdown is frozen and re-armed; otherwise it ticks down + alert_showing = bool(started and alert is not None and self.onroad_brightness != OnroadBrightness.AUTO) + self.update_onroad_brightness(alert_showing) + if alert_showing: + self.reset_onroad_sleep_timer() + + def update_onroad_brightness(self, has_alert: bool) -> None: + if not has_alert and self.onroad_brightness_timer > 0: + self.onroad_brightness_timer -= 1 + + def reset_onroad_sleep_timer(self, timer_status: OnroadTimerStatus = OnroadTimerStatus.NONE) -> None: + paused = self.onroad_brightness_timer == ONROAD_BRIGHTNESS_TIMER_PAUSED + + # an explicit PAUSE latches the timer and never re-arms + if timer_status == OnroadTimerStatus.PAUSE: + if not paused: + self.onroad_brightness_timer = ONROAD_BRIGHTNESS_TIMER_PAUSED + return + + dimming_active = self.onroad_brightness_timer_param >= 0 and self.onroad_brightness != OnroadBrightness.AUTO + if timer_status == OnroadTimerStatus.RESUME or (dimming_active and not paused): + seconds = 15 if self.onroad_brightness == OnroadBrightness.AUTO_DARK else self.onroad_brightness_timer_param + self.onroad_brightness_timer = seconds * gui_app.target_fps + + @property + def onroad_brightness_timer_expired(self) -> bool: + if self.onroad_brightness == OnroadBrightness.AUTO: + return False + return self.onroad_brightness_timer == 0 + + @property + def auto_onroad_brightness(self) -> bool: + return self.onroad_brightness in (OnroadBrightness.AUTO, OnroadBrightness.AUTO_DARK) + + @staticmethod + def guidance_phase(ss, ss_iq, onroad_evt) -> str: + state = ss.state + guidance = ss_iq.aol + guidance_state = guidance.state + + if state == OpenpilotState.preEnabled: + return "standby" + + if state == OpenpilotState.overriding and (not guidance.available or any(e.overrideLongitudinal for e in onroad_evt)): + return "standby" + + if guidance_state in (GuidanceState.paused, GuidanceState.overriding): + return "standby" + + if guidance.enabled or ss.enabled: + return "active" + + return "standby" + + @staticmethod + def update_status(ss, ss_iq, onroad_evt) -> str: + state = ss.state + guidance = ss_iq.aol + guidance_state = guidance.state + + if state == OpenpilotState.preEnabled: + return "override" + + if state == OpenpilotState.overriding: + if not guidance.available: + return "override" + + if any(e.overrideLongitudinal for e in onroad_evt): + return "override" + + if guidance_state in (GuidanceState.paused, GuidanceState.overriding): + return "override" + + if not guidance.available: + return "engaged" if ss.enabled else "disengaged" + + if not guidance.enabled and not ss.enabled: + return "disengaged" + + if guidance.enabled and ss.enabled: + return "engaged" + + if guidance.enabled: + return "lat_only" + + if ss.enabled: + return "long_only" + + return "disengaged" + + _PARAM_MIRROR = { + "active_bundle": ("ModelManager_ActiveBundle", "raw"), + "blindspot": ("IQBlindSpotAlerts", "bool"), + "chevron_metrics": ("IQLeadReadouts", "raw"), + "developer_ui": ("IQDevUIInfo", "raw"), + "night_mode": ("NightMode", "bool"), + "road_name_toggle": ("IQRoadNameOverlay", "bool"), + "rocket_fuel": ("IQAccelMeter", "bool"), + "torque_bar": ("IQSteerEffortArc", "bool"), + "turn_signals": ("IQBlinkerIndicators", "bool"), + "custom_interactive_timeout": ("InteractivityTimeout", "default"), + "onroad_brightness_timer_param": ("OnroadScreenOffTimer", "default"), + "speed_limit_mode": ("IQSpeedAssistMode", "default"), + } + + def update_params(self) -> None: + CP_IQ = log_param_from_bytes(self.params, "IQCarParamsPersistentV2", custom.IQCarParams) + if CP_IQ is not None: + self.CP_IQ = CP_IQ + + for attr, (key, kind) in self._PARAM_MIRROR.items(): + if kind == "bool": + value = self.params.get_bool(key) + elif kind == "default": + value = self.params.get(key, return_default=True) + else: + value = self.params.get(key) + setattr(self, attr, value) + + self.is_night = self._compute_is_night() if self.night_mode else False + self.onroad_brightness = int(float(self.params.get("OnroadScreenOffBrightness", return_default=True))) + + def _compute_is_night(self) -> bool: + try: + from iqpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position + from iqpilot.selfdrive.ui.lib.solar import is_after_sunset + lat, lon, _, valid = current_or_last_gps_position(self.params) + return valid and is_after_sunset(lat, lon) + except Exception: + return False + + +class IQDevice: + def __init__(self): + self._params = Params() + + def _set_awake(self, on: bool): + if on and self._params.get("DeviceBootMode", return_default=True) == 1: + self._params.put_bool("IQAlwaysOffroad", True) + + @staticmethod + def set_onroad_brightness(_ui_state, awake: bool, cur_brightness: float) -> float: + if not awake or not _ui_state.started: + return cur_brightness + + if _ui_state.onroad_brightness_timer != 0: + if _ui_state.onroad_brightness == OnroadBrightness.AUTO_DARK: + return max(30.0, cur_brightness) + return cur_brightness + + if _ui_state.onroad_brightness == OnroadBrightness.AUTO: + return cur_brightness + elif _ui_state.onroad_brightness == OnroadBrightness.AUTO_DARK: + return cur_brightness + + return float((_ui_state.onroad_brightness - 1) * 5) + + @staticmethod + def set_min_onroad_brightness(_ui_state, min_brightness: int) -> int: + dark = _ui_state.onroad_brightness == OnroadBrightness.AUTO_DARK + return 10 if dark else min_brightness + + @staticmethod + def wake_from_dimmed_onroad_brightness(_ui_state, evs) -> None: + expired = _ui_state.onroad_brightness_timer_expired + dimmed = expired or _ui_state.onroad_brightness == OnroadBrightness.AUTO_DARK + if not (_ui_state.started and dimmed): + return + if not any(ev.left_down for ev in evs): + return + if expired: + gui_app.mouse_events.clear() + _ui_state.reset_onroad_sleep_timer() + + +class UIStatus(Enum): + DISENGAGED = "disengaged" + ENGAGED = "engaged" + OVERRIDE = "override" + LAT_ONLY = "lat_only" + LONG_ONLY = "long_only" + + +class UIState(IQUIState): + _instance: 'UIState | None' = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance._initialize() + return cls._instance + + def _initialize(self): + IQUIState.__init__(self) + self.params = Params() + self.sm = messaging.SubMaster( + [ + "modelV2", + "controlsState", + "onroadEvents", + "extrinsicsCalibration", + "radarState", + "radarTracks", + "iqVehicleTracks", + "iqEnvironment", + "deviceState", + "pandaStates", + "carParams", + "driverMonitoringState", + "carState", + "driverStateV2", + "roadCameraState", + "wideRoadCameraState", + "managerState", + "selfdriveState", + "longitudinalPlan", + "gpsLocationExternal", + "carOutput", + "carControl", + "vehicleParameters", + ] + self.sm_services_ext + ) + + self.prime_state = PrimeState() + + # UI Status tracking + self.status: UIStatus = UIStatus.DISENGAGED + self.started_frame: int = 0 + self.started_time: float = 0.0 + self._engaged_prev: bool = False + self._started_prev: bool = False + self._last_non_disengaged_status: UIStatus = UIStatus.DISENGAGED + self._last_non_disengaged_time: float = 0.0 + + # Core state variables + self.is_metric: bool = self.params.get_bool("IsMetric") + self.is_release = self.params.get_bool("IsReleaseBranch") + self.always_on_dm: bool = self.params.get_bool("AlwaysOnDM") + self.started: bool = False + self.ignition: bool = False + self.recording_audio: bool = False + self.panda_type: log.PandaState.PandaType = log.PandaState.PandaType.unknown + self.personality: log.LongitudinalPersonality = log.LongitudinalPersonality.standard + self.has_longitudinal_control: bool = False + self.CP: car.CarParams | None = None + self.light_sensor: float = -1.0 + self._param_update_time: float = 0.0 + + # Callbacks + self._offroad_transition_callbacks: list[Callable[[], None]] = [] + self._engaged_transition_callbacks: list[Callable[[], None]] = [] + + self.update_params() + + def add_offroad_transition_callback(self, callback: Callable[[], None]): + self._offroad_transition_callbacks.append(callback) + + def add_engaged_transition_callback(self, callback: Callable[[], None]): + self._engaged_transition_callbacks.append(callback) + + @property + def engaged(self) -> bool: + ss_ext = self.sm["iqState"] + return self.started and (self.sm["selfdriveState"].enabled or ss_ext.aol.enabled) + + def is_onroad(self) -> bool: + return self.started + + def is_offroad(self) -> bool: + return not self.started + + def update(self) -> None: + self.prime_state.start() # start thread after manager forks ui + self.sm.update(0) + self._update_state() + self._update_status() + if time.monotonic() - self._param_update_time > 5.0: + self.update_params() + device.update() + IQUIState.update(self) + + def _update_state(self) -> None: + # Handle panda states updates + if self.sm.updated["pandaStates"]: + panda_states = self.sm["pandaStates"] + + if len(panda_states) > 0: + # Get panda type from first panda + self.panda_type = panda_states[0].pandaType + # Check ignition status across all pandas + if self.panda_type != log.PandaState.PandaType.unknown: + self.ignition = any(state.ignitionLine or state.ignitionCan for state in panda_states) + elif not self.sm.alive["pandaStates"]: + # Time-based staleness (SubMaster tracks it against the service rate). The old + # `5 * rl.get_fps()` frame threshold went near-zero right after the screen woke — rendering + # had just resumed so raylib's FPS reading was still ~0 — which briefly flagged a perfectly + # fresh pandaStates as stale, flashing panda_type to unknown ("UNAVAILABLE") for a few seconds. + self.panda_type = log.PandaState.PandaType.unknown + + # Handle wide road camera state updates + if self.sm.updated["wideRoadCameraState"]: + cam_state = self.sm["wideRoadCameraState"] + self.light_sensor = max(100.0 - cam_state.exposureValPercent, 0.0) + elif not self.sm.alive["wideRoadCameraState"] or not self.sm.valid["wideRoadCameraState"]: + self.light_sensor = -1 + + # Update started state + self.started = self.sm["deviceState"].started and self.ignition + + # Update recording audio state + self.recording_audio = self.params.get_bool("RecordAudio") and self.started + + self.is_metric = self.params.get_bool("IsMetric") + self.always_on_dm = self.params.get_bool("AlwaysOnDM") + + def _update_status(self) -> None: + if self.started and self.sm.updated["selfdriveState"]: + ss = self.sm["selfdriveState"] + state = ss.state + iq_state = self.sm["iqState"] + + if state in (log.SelfdriveState.OpenpilotState.preEnabled, log.SelfdriveState.OpenpilotState.overriding): + self.status = UIStatus.OVERRIDE + else: + self.status = UIStatus.ENGAGED if ss.enabled else UIStatus.DISENGAGED + + computed_status = UIStatus(IQUIState.update_status(ss, iq_state, self.sm["onroadEvents"])) + now = time.monotonic() + engaged_like_now = bool(ss.enabled or iq_state.aol.enabled) + if computed_status != UIStatus.DISENGAGED: + self._last_non_disengaged_status = computed_status + self._last_non_disengaged_time = now + self.status = computed_status + elif engaged_like_now: + if self._last_non_disengaged_status != UIStatus.DISENGAGED: + self.status = self._last_non_disengaged_status + else: + self.status = UIStatus.ENGAGED if ss.enabled else UIStatus.DISENGAGED + else: + self.status = UIStatus.DISENGAGED + + if self.engaged != self._engaged_prev: + for callback in self._engaged_transition_callbacks: + callback() + self._engaged_prev = self.engaged + + if self.started != self._started_prev or self.sm.frame == 1: + if self.started: + self.status = UIStatus.DISENGAGED + self.started_frame = self.sm.frame + self.started_time = time.monotonic() + self._last_non_disengaged_status = UIStatus.DISENGAGED + self._last_non_disengaged_time = 0.0 + + for callback in self._offroad_transition_callbacks: + callback() + + self._started_prev = self.started + + def update_params(self) -> None: + CP = log_param_from_bytes(self.params, "CarParamsPersistent", car.CarParams) + if CP is not None: + self.CP = CP + if self.CP.alphaLongitudinalAvailable: + self.has_longitudinal_control = self.params.get_bool("AlphaLongitudinalEnabled") + else: + self.has_longitudinal_control = self.CP.openpilotLongitudinalControl + IQUIState.update_params(self) + self._param_update_time = time.monotonic() + + + +class Device(IQDevice): + def __init__(self): + IQDevice.__init__(self) + self._ignition = False + self._interaction_time: float = -1 + self._override_interactive_timeout: int | None = None + self._interactive_timeout_callbacks: list[Callable] = [] + self._prev_timed_out = False + self._awake: bool = True + + self._offroad_brightness: int = BACKLIGHT_OFFROAD + self._display_brightness_param: int = 0 + self._last_brightness_param_update: float = 0.0 + self._last_brightness: int = 0 + self._brightness_filter = FirstOrderFilter(BACKLIGHT_OFFROAD, 10.00, 1 / gui_app.target_fps) + self._brightness_thread: threading.Thread | None = None + + @property + def awake(self) -> bool: + return self._awake + + def set_override_interactive_timeout(self, timeout: int | None) -> None: + self._override_interactive_timeout = timeout + self._reset_interactive_timeout() + + @property + def interactive_timeout(self) -> int: + if self._override_interactive_timeout is not None: + return self._override_interactive_timeout + + if gui_app.iqpilot_ui() and ui_state.custom_interactive_timeout != 0: + return ui_state.custom_interactive_timeout + + ignition_timeout = 10 if gui_app.big_ui() else 5 + if ui_state.night_mode and ui_state.is_night: + ignition_timeout = 15 + return ignition_timeout if ui_state.ignition else 30 + + def _reset_interactive_timeout(self) -> None: + self._interaction_time = time.monotonic() + self.interactive_timeout + + def add_interactive_timeout_callback(self, callback: Callable): + self._interactive_timeout_callbacks.append(callback) + + def update(self): + if self._interaction_time <= 0: + self._reset_interactive_timeout() + + self._update_brightness() + self._update_wakefulness() + + def set_offroad_brightness(self, brightness: int | None): + if brightness is None: + brightness = BACKLIGHT_OFFROAD + self._offroad_brightness = min(max(brightness, 0), 100) + + def _update_display_brightness_param(self): + now = time.monotonic() + if now - self._last_brightness_param_update < 1.0: + return + + try: + brightness = int(self._params.get("Brightness", return_default=True)) + except (TypeError, ValueError): + brightness = 0 + + self._display_brightness_param = min(max(brightness, 0), 100) + self._last_brightness_param_update = now + + def _update_brightness(self): + self._update_display_brightness_param() + manual_display_brightness = self._display_brightness_param + + clipped_brightness = manual_display_brightness if manual_display_brightness > 0 else self._offroad_brightness + + if ui_state.started and ui_state.light_sensor >= 0: + clipped_brightness = ui_state.light_sensor + + # CIE 1931 - https://www.photonstophotos.net/GeneralTopics/Exposure/Psychometric_Lightness_and_Gamma.htm + if clipped_brightness <= 8: + clipped_brightness = clipped_brightness / 903.3 + else: + clipped_brightness = ((clipped_brightness + 16.0) / 116.0) ** 3.0 + + min_brightness = 30 + if gui_app.iqpilot_ui(): + min_brightness = IQDevice.set_min_onroad_brightness(ui_state, min_brightness) + + clipped_brightness = float(np.interp(clipped_brightness, [0, 1], [min_brightness, 100])) + + brightness = round(self._brightness_filter.update(clipped_brightness)) + + if gui_app.iqpilot_ui(): + brightness = IQDevice.set_onroad_brightness(ui_state, self._awake, brightness) + + if manual_display_brightness > 0: + brightness = min(brightness, manual_display_brightness) + + if not self._awake: + brightness = 0 + + if brightness != self._last_brightness: + if self._brightness_thread is None or not self._brightness_thread.is_alive(): + self._brightness_thread = threading.Thread(target=HARDWARE.set_screen_brightness, args=(brightness,)) + self._brightness_thread.start() + self._last_brightness = brightness + + def _update_wakefulness(self): + # Handle interactive timeout + ignition_just_turned_off = not ui_state.ignition and self._ignition + self._ignition = ui_state.ignition + + if ignition_just_turned_off or any(ev.left_down for ev in gui_app.mouse_events): + if gui_app.iqpilot_ui(): + IQDevice.wake_from_dimmed_onroad_brightness(ui_state, gui_app.mouse_events) + + self._reset_interactive_timeout() + + interaction_timeout = time.monotonic() > self._interaction_time + if interaction_timeout and not self._prev_timed_out: + for callback in self._interactive_timeout_callbacks: + callback() + self._prev_timed_out = interaction_timeout + + night_active = ui_state.night_mode and ui_state.is_night + # active screen recording keeps the display on so remote-triggered recordings capture frames + self._set_awake((ui_state.ignition and not night_active) or not interaction_timeout or PC + or gui_app.screen_recorder_active) + + def _set_awake(self, on: bool): + if on != self._awake: + IQDevice._set_awake(self, on) + self._awake = on + cloudlog.debug(f"setting display power {int(on)}") + HARDWARE.set_display_power(on) + gui_app.set_should_render(on) + + +# Global instance +ui_state = UIState() +device = Device() diff --git a/iqpilot/selfdrive/ui/widgets/__init__.py b/iqpilot/selfdrive/ui/widgets/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/selfdrive/ui/widgets/inspire_widget.py b/iqpilot/selfdrive/ui/widgets/inspire_widget.py new file mode 100644 index 000000000..99aa90bda --- /dev/null +++ b/iqpilot/selfdrive/ui/widgets/inspire_widget.py @@ -0,0 +1,79 @@ +import random +import pyray as rl + +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.selfdrive.ui.lib.motd import load_motds +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.wrap_text import wrap_text +from iqpilot.system.ui.widgets import Widget + +PANEL_BG = rl.Color(34, 36, 42, 255) +PANEL_BORDER = rl.Color(255, 255, 255, 26) +TEAL_DIM = rl.Color(16, 185, 169, 22) +TEXT_COLOR = rl.Color(235, 235, 235, 255) +LABEL_COLOR = rl.Color(16, 185, 169, 255) + + +def _load_messages() -> list[str]: + msgs = load_motds() + random.shuffle(msgs) + return msgs + + +class InspireWidget(Widget): + def __init__(self): + super().__init__() + self._messages = _load_messages() + self._idx = 0 + self._current: str = self._messages[0] if self._messages else "Drive safely. Stay focused." + + def _pick(self): + if not self._messages: + self._messages = _load_messages() + self._idx = 0 + if self._messages: + self._current = self._messages[self._idx % len(self._messages)] + self._idx += 1 + + def show_event(self): + self._pick() + + def _render(self, rect: rl.Rectangle): + rl.draw_rectangle_rounded(rect, 0.06, 24, PANEL_BG) + rl.draw_rectangle_rounded_lines_ex(rect, 0.06, 24, 2, PANEL_BORDER) + + cx = rect.x + rect.width / 2 + cy = rect.y + rect.height / 2 + + font = gui_app.font(FontWeight.MEDIUM) + font_label = gui_app.font(FontWeight.BOLD) + + TEXT_FS = 52 + LABEL_FS = 24 + LABEL_H = 48 + max_w = int(rect.width - 80) + + wrapped = wrap_text(font, self._current, TEXT_FS, max_w) + line_h = int(TEXT_FS * 1.3) + total_text_h = len(wrapped) * line_h + + text_block_cy = cy - LABEL_H / 2 + text_y = text_block_cy - total_text_h / 2 + + for i, line in enumerate(wrapped): + lw = measure_text_cached(font, line, TEXT_FS).x + rl.draw_text_ex(font, line, + rl.Vector2(int(cx - lw / 2), int(text_y + i * line_h)), + TEXT_FS, 0, TEXT_COLOR) + + label = "DAILY INSPIRATION" + LABEL_SPACING = 3 + lw = measure_text_cached(font_label, label, LABEL_FS).x + len(label) * LABEL_SPACING + label_x = int(cx - lw / 2) + label_y = int(rect.y + rect.height - LABEL_H - 8) + + pill = rl.Rectangle(label_x - 20, label_y - 8, lw + 40, LABEL_FS + 16) + rl.draw_rectangle_rounded(pill, 0.5, 12, TEAL_DIM) + rl.draw_text_ex(font_label, label, + rl.Vector2(label_x, label_y), + LABEL_FS, LABEL_SPACING, LABEL_COLOR) diff --git a/iqpilot/selfdrive/ui/widgets/interactive_map.py b/iqpilot/selfdrive/ui/widgets/interactive_map.py new file mode 100644 index 000000000..7787f9f94 --- /dev/null +++ b/iqpilot/selfdrive/ui/widgets/interactive_map.py @@ -0,0 +1,230 @@ +"""Touch-interactive tile map for the offroad Navigate screen. + +Drag to pan, +/- to zoom, recenter snaps back to GPS. Tiles come from the onroad +MapboxTileProvider (async fetch, disk+GPU cache). Tiles are drawn directly every frame (~20 +texture blits); the fetch/prune pipeline is throttled so panning doesn't churn the cache. +""" +from __future__ import annotations + +import math +import time + +import pyray as rl + +from iqpilot.common.params import Params +from iqpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position +from iqpilot.ui.onroad.nav_map_panel import MapboxTileProvider +from iqpilot.ui.onroad.nav_map_utils import TILE_SIZE +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MouseEvent, MousePos +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +DEFAULT_ZOOM = 15.0 +MIN_ZOOM = 4.0 +MAX_ZOOM = 18.0 +ZOOM_STEP = 1.0 +TILE_UPDATE_S = 0.20 # fetch/prune cadence; drawing runs every frame +GPS_POLL_S = 0.5 +DEST_POLL_S = 1.0 +BTN = 92 +PUCK_BLUE = rl.Color(23, 134, 246, 255) +MAP_BG = rl.Color(18, 18, 20, 255) +BTN_BG = rl.Color(28, 30, 36, 235) +BTN_BORDER = rl.Color(255, 255, 255, 45) + + +def _norm(lat: float, lon: float) -> tuple[float, float]: + lat = max(-85.05, min(85.05, lat)) + x = (lon + 180.0) / 360.0 + s = math.sin(math.radians(lat)) + y = 0.5 - math.log((1.0 + s) / (1.0 - s)) / (4.0 * math.pi) + return x, y + + +def _denorm(x: float, y: float) -> tuple[float, float]: + lon = x * 360.0 - 180.0 + lat = math.degrees(math.atan(math.sinh(math.pi * (1.0 - 2.0 * y)))) + return lat, lon + + +class InteractiveNavMap(Widget): + def __init__(self): + super().__init__() + self._params = Params() + self._tiles = MapboxTileProvider() + self._lat = 0.0 + self._lon = 0.0 + self._zoom = DEFAULT_ZOOM + self._follow = True + self._have_center = False + + self._drag_start: MousePos | None = None + self._drag_center: tuple[float, float] | None = None + self._dragging = False + + self._tiles_time = 0.0 + self._gps_cache: tuple[float, float, bool] = (0.0, 0.0, False) + self._gps_time = 0.0 + self._dest_cache = None + self._dest_time = 0.0 + + self._pin_icon = gui_app.texture("icons/iq/pin.png", 64, 64, keep_aspect_ratio=True) + + def _world_size(self) -> float: + return TILE_SIZE * (2.0 ** self._zoom) + + def _poll_gps(self): + now = time.monotonic() + if now - self._gps_time > GPS_POLL_S: + lat, lon, _, fix = current_or_last_gps_position(self._params) + self._gps_cache = (lat, lon, fix) + self._gps_time = now + lat, lon, fix = self._gps_cache + if fix and self._follow and not self._dragging: + self._lat, self._lon = lat, lon + self._have_center = True + elif fix and not self._have_center: + self._lat, self._lon = lat, lon + self._have_center = True + return lat, lon, fix + + def recenter(self): + self._follow = True + self._gps_time = 0.0 + + # --- gestures --------------------------------------------------------------- + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + super()._handle_mouse_event(mouse_event) + if mouse_event.slot != 0 or not self._have_center: + return + if mouse_event.left_pressed: + if rl.check_collision_point_rec(mouse_event.pos, self._rect) and self._control_hit(mouse_event.pos) is None: + self._drag_start = mouse_event.pos + self._drag_center = _norm(self._lat, self._lon) + self._dragging = False + else: + self._drag_start = None + elif mouse_event.left_down and self._drag_start is not None: + dx = mouse_event.pos.x - self._drag_start.x + dy = mouse_event.pos.y - self._drag_start.y + if not self._dragging and (abs(dx) > 10 or abs(dy) > 10): + self._dragging = True + self._follow = False + if self._dragging: + ws = self._world_size() + nx = (self._drag_center[0] - dx / ws) % 1.0 + ny = max(0.001, min(0.999, self._drag_center[1] - dy / ws)) + self._lat, self._lon = _denorm(nx, ny) + elif mouse_event.left_released: + self._drag_start = None + self._drag_center = None + self._dragging = False + + def _controls(self) -> list[tuple[str, rl.Rectangle]]: + r = self._rect + x = r.x + r.width - BTN - 20 + ctrls = [("+", rl.Rectangle(x, r.y + 20, BTN, BTN)), + ("-", rl.Rectangle(x, r.y + 20 + BTN + 14, BTN, BTN))] + if not self._follow: + ctrls.append(("recenter", rl.Rectangle(x, r.y + r.height - BTN - 20, BTN, BTN))) + return ctrls + + def _control_hit(self, pos: MousePos) -> str | None: + for name, rect in self._controls(): + if rl.check_collision_point_rec(pos, rect): + return name + return None + + def _handle_mouse_release(self, mouse_pos: MousePos) -> None: + hit = self._control_hit(mouse_pos) + if hit == "+": + self._zoom = min(MAX_ZOOM, self._zoom + ZOOM_STEP) + self._tiles_time = 0.0 + elif hit == "-": + self._zoom = max(MIN_ZOOM, self._zoom - ZOOM_STEP) + self._tiles_time = 0.0 + elif hit == "recenter": + self.recenter() + + # --- rendering -------------------------------------------------------------- + def _render(self, rect: rl.Rectangle): + gps_lat, gps_lon, fix = self._poll_gps() + + if not self._have_center: + rl.draw_rectangle_rounded(rect, 0.03, 20, MAP_BG) + self._center_note(rect, tr("Waiting for GPS fix...")) + return + + now = time.monotonic() + if now - self._tiles_time > TILE_UPDATE_S: + self._tiles.update(self._lat, self._lon, self._zoom, rect.width, rect.height) + self._tiles_time = now + + rl.draw_rectangle_rec(rect, MAP_BG) + rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height)) + self._tiles.draw(rect, self._lat, self._lon, self._zoom) + if fix: + self._draw_puck(rect, gps_lat, gps_lon) + self._draw_destination(rect) + rl.end_scissor_mode() + rl.draw_rectangle_rounded_lines_ex(rect, 0.03, 20, 2, rl.Color(255, 255, 255, 38)) + self._draw_controls() + + def _center_note(self, rect: rl.Rectangle, text: str): + font = gui_app.font(FontWeight.MEDIUM) + ns = measure_text_cached(font, text, 40) + rl.draw_text_ex(font, text, rl.Vector2(int(rect.x + (rect.width - ns.x) / 2), + int(rect.y + rect.height / 2 - ns.y / 2)), 40, 0, rl.Color(165, 165, 170, 255)) + + def _project(self, rect: rl.Rectangle, lat: float, lon: float) -> tuple[float, float]: + ws = self._world_size() + cx, cy = _norm(self._lat, self._lon) + px, py = _norm(lat, lon) + return (rect.x + rect.width / 2 + (px - cx) * ws, + rect.y + rect.height / 2 + (py - cy) * ws) + + def _draw_puck(self, rect: rl.Rectangle, lat: float, lon: float): + x, y = self._project(rect, lat, lon) + if rect.x <= x <= rect.x + rect.width and rect.y <= y <= rect.y + rect.height: + rl.draw_circle(int(x), int(y), 24, rl.Color(255, 255, 255, 235)) + rl.draw_circle(int(x), int(y), 16, PUCK_BLUE) + + def _draw_destination(self, rect: rl.Rectangle): + now = time.monotonic() + if now - self._dest_time > DEST_POLL_S: + try: + self._dest_cache = self._params.get("NavigationDestination") + except Exception: + self._dest_cache = None + self._dest_time = now + dest = self._dest_cache + if not dest: + return + try: + lat, lon = float(dest["latitude"]), float(dest["longitude"]) + except Exception: + return + x, y = self._project(rect, lat, lon) + if rect.x <= x <= rect.x + rect.width and rect.y <= y <= rect.y + rect.height: + rl.draw_texture(self._pin_icon, int(x - self._pin_icon.width / 2), int(y - self._pin_icon.height), rl.WHITE) + + def _draw_controls(self): + font = gui_app.font(FontWeight.MEDIUM) + for name, r in self._controls(): + rl.draw_rectangle_rounded(r, 0.35, 16, BTN_BG) + rl.draw_rectangle_rounded_lines_ex(r, 0.35, 16, 2, BTN_BORDER) + cx, cy = r.x + r.width / 2, r.y + r.height / 2 + if name == "recenter": + rl.draw_circle_lines(int(cx), int(cy), 20, rl.WHITE) + rl.draw_circle(int(cx), int(cy), 6, PUCK_BLUE) + for ang in (0, 90, 180, 270): + a = math.radians(ang) + rl.draw_line_ex(rl.Vector2(cx + 20 * math.cos(a), cy + 20 * math.sin(a)), + rl.Vector2(cx + 30 * math.cos(a), cy + 30 * math.sin(a)), 3, rl.WHITE) + else: + ts = measure_text_cached(font, name, 56) + rl.draw_text_ex(font, name, rl.Vector2(int(cx - ts.x / 2), int(cy - ts.y / 2)), 56, 0, rl.WHITE) + + def release(self): + self._tiles.release() diff --git a/iqpilot/selfdrive/ui/widgets/map_panel_widget.py b/iqpilot/selfdrive/ui/widgets/map_panel_widget.py new file mode 100644 index 000000000..e9d7e724f --- /dev/null +++ b/iqpilot/selfdrive/ui/widgets/map_panel_widget.py @@ -0,0 +1,82 @@ +import pyray as rl + +from iqpilot.selfdrive.ui.layouts.nav import _MapPreview +from iqpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +PANEL_BG = rl.Color(34, 36, 42, 255) +PANEL_BORDER = rl.Color(255, 255, 255, 26) +TEAL = rl.Color(16, 185, 169, 255) +MUTED = rl.Color(160, 160, 165, 255) +PANEL_ROUNDNESS = 0.16 +PANEL_SEGMENTS = 24 + + +class MapPanelWidget(Widget): + def __init__(self): + super().__init__() + self._map = _MapPreview() + self._last_lat = 0.0 + self._last_lon = 0.0 + + def _render(self, rect: rl.Rectangle): + rl.draw_rectangle_rounded(rect, PANEL_ROUNDNESS, PANEL_SEGMENTS, PANEL_BG) + + lat, lon, bearing, have_fix = current_or_last_gps_position() + if have_fix: + self._map.request(lat, lon, bearing, rect.width, rect.height) + + drew_map = self._map.draw(rect, roundness=PANEL_ROUNDNESS) + rl.draw_rectangle_rounded_lines_ex(rect, PANEL_ROUNDNESS, PANEL_SEGMENTS, 2, PANEL_BORDER) + if drew_map: + font = gui_app.font(FontWeight.BOLD) + label = "LAST KNOWN LOCATION" + fs = 26 + spacing = 3 + text_size = measure_text_cached(font, label, fs, spacing) + pill_w = text_size.x + 56 + pill_h = text_size.y + 24 + pill = rl.Rectangle( + rect.x + (rect.width - pill_w) / 2, + rect.y + rect.height - pill_h - 24, + pill_w, + pill_h, + ) + text_x = pill.x + (pill.width - text_size.x) / 2 + text_y = pill.y + (pill.height - text_size.y) / 2 + rl.draw_rectangle_rounded(pill, 0.5, 18, rl.Color(0, 0, 0, 170)) + rl.draw_text_ex(font, label, rl.Vector2(int(text_x), int(text_y)), fs, spacing, TEAL) + else: + # No token or no fix — placeholder + font = gui_app.font(FontWeight.MEDIUM) + cx = rect.x + rect.width / 2 + cy = rect.y + rect.height / 2 + + if not self._map.has_token(): + line1 = "Map unavailable" + line2 = "Set MapboxToken to enable" + elif not have_fix: + line1 = tr("Waiting for GPS fix...") + line2 = "No live or saved location" + elif self._map.status() == "error": + line1 = "Map unavailable" + line2 = "Mapbox request failed" + else: + line1 = "Loading map..." + line2 = "Fetching Mapbox preview" + + ts1 = measure_text_cached(font, line1, 46) + rl.draw_text_ex(font, line1, rl.Vector2(int(cx - ts1.x / 2), int(cy - 40)), 46, 0, MUTED) + if line2: + ts2 = measure_text_cached(font, line2, 32) + rl.draw_text_ex( + font, + line2, + rl.Vector2(int(cx - ts2.x / 2), int(cy + 20)), + 32, + 0, + rl.Color(120, 120, 125, 255), + ) diff --git a/iqpilot/selfdrive/ui/widgets/offroad_alerts.py b/iqpilot/selfdrive/ui/widgets/offroad_alerts.py new file mode 100644 index 000000000..9a86179ad --- /dev/null +++ b/iqpilot/selfdrive/ui/widgets/offroad_alerts.py @@ -0,0 +1,344 @@ +import pyray as rl +from enum import IntEnum +from abc import ABC, abstractmethod +from collections.abc import Callable +from dataclasses import dataclass +from iqpilot.common.params import Params +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.scroll_panel import GuiScrollPanel +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.wrap_text import wrap_text +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.html_render import HtmlRenderer +from iqpilot.selfdrive.selfdrived.alertmanager import OFFROAD_ALERTS + + +class AlertColors: + HIGH_SEVERITY = rl.Color(226, 44, 44, 255) + LOW_SEVERITY = rl.Color(41, 41, 41, 255) + BACKGROUND = rl.Color(57, 57, 57, 255) + BUTTON = rl.WHITE + BUTTON_PRESSED = rl.Color(200, 200, 200, 255) + BUTTON_TEXT = rl.BLACK + SNOOZE_BG = rl.Color(79, 79, 79, 255) + SNOOZE_BG_PRESSED = rl.Color(100, 100, 100, 255) + TEXT = rl.WHITE + + +class AlertConstants: + MIN_BUTTON_WIDTH = 400 + BUTTON_HEIGHT = 125 + MARGIN = 50 + SPACING = 30 + FONT_SIZE = 48 + BORDER_RADIUS = 30 * 2 # matches Qt's 30px + ALERT_HEIGHT = 120 + ALERT_SPACING = 10 + ALERT_INSET = 60 + + +@dataclass +class AlertData: + key: str + text: str + severity: int + visible: bool = False + + +class ButtonStyle(IntEnum): + LIGHT = 0 + DARK = 1 + + +class ActionButton(Widget): + def __init__(self, text: str | Callable[[], str], style: ButtonStyle = ButtonStyle.LIGHT, + min_width: int = AlertConstants.MIN_BUTTON_WIDTH): + super().__init__() + self._text = text + self._style = style + self._min_width = min_width + self._font = gui_app.font(FontWeight.MEDIUM) + + @property + def text(self) -> str: + return self._text() if callable(self._text) else self._text + + def _render(self, _): + text_size = measure_text_cached(gui_app.font(FontWeight.MEDIUM), self.text, AlertConstants.FONT_SIZE) + self._rect.width = max(text_size.x + 60 * 2, self._min_width) + self._rect.height = AlertConstants.BUTTON_HEIGHT + + roundness = AlertConstants.BORDER_RADIUS / self._rect.height + bg_color = AlertColors.BUTTON if self._style == ButtonStyle.LIGHT else AlertColors.SNOOZE_BG + if self.is_pressed: + bg_color = AlertColors.BUTTON_PRESSED if self._style == ButtonStyle.LIGHT else AlertColors.SNOOZE_BG_PRESSED + + rl.draw_rectangle_rounded(self._rect, roundness, 10, bg_color) + + # center text + color = rl.WHITE if self._style == ButtonStyle.DARK else rl.BLACK + text_x = int(self._rect.x + (self._rect.width - text_size.x) // 2) + text_y = int(self._rect.y + (self._rect.height - text_size.y) // 2) + rl.draw_text_ex(self._font, self.text, rl.Vector2(text_x, text_y), AlertConstants.FONT_SIZE, 0, color) + + +class AbstractAlert(Widget, ABC): + def __init__(self, has_reboot_btn: bool = False): + super().__init__() + self.params = Params() + self.has_reboot_btn = has_reboot_btn + self.dismiss_callback: Callable | None = None + + def snooze_callback(): + self.params.put_bool("SnoozeUpdate", True) + if self.dismiss_callback: + self.dismiss_callback() + + def excessive_actuation_callback(): + self.params.remove("Offroad_ExcessiveActuation") + if self.dismiss_callback: + self.dismiss_callback() + + self.dismiss_btn = ActionButton(lambda: tr("Close")) + + self.snooze_btn = ActionButton(lambda: tr("Snooze Update"), style=ButtonStyle.DARK) + self.snooze_btn.set_click_callback(snooze_callback) + + self.excessive_actuation_btn = ActionButton(lambda: tr("Acknowledge Excessive Actuation"), style=ButtonStyle.DARK, min_width=800) + self.excessive_actuation_btn.set_click_callback(excessive_actuation_callback) + + self.reboot_btn = ActionButton(lambda: tr("Reboot and Update"), min_width=600) + self.reboot_btn.set_click_callback(lambda: HARDWARE.reboot()) + + # TODO: just use a Scroller? + self.content_rect = rl.Rectangle(0, 0, 0, 0) + self.scroll_panel_rect = rl.Rectangle(0, 0, 0, 0) + self.scroll_panel = GuiScrollPanel() + + def show_event(self): + self.scroll_panel.set_offset(0) + + def set_dismiss_callback(self, callback: Callable): + self.dismiss_callback = callback + self.dismiss_btn.set_click_callback(self.dismiss_callback) + + @abstractmethod + def refresh(self) -> bool: + pass + + @abstractmethod + def get_content_height(self) -> float: + pass + + def _render(self, rect: rl.Rectangle): + rl.draw_rectangle_rounded(rect, AlertConstants.BORDER_RADIUS / rect.height, 10, AlertColors.BACKGROUND) + + footer_height = AlertConstants.BUTTON_HEIGHT + AlertConstants.SPACING + content_height = rect.height - 2 * AlertConstants.MARGIN - footer_height + + self.content_rect = rl.Rectangle( + rect.x + AlertConstants.MARGIN, + rect.y + AlertConstants.MARGIN, + rect.width - 2 * AlertConstants.MARGIN, + content_height, + ) + self.scroll_panel_rect = rl.Rectangle( + self.content_rect.x, self.content_rect.y, self.content_rect.width, self.content_rect.height + ) + + self._render_scrollable_content() + self._render_footer(rect) + + def _render_scrollable_content(self): + content_total_height = self.get_content_height() + content_bounds = rl.Rectangle(0, 0, self.scroll_panel_rect.width, content_total_height) + scroll_offset = self.scroll_panel.update(self.scroll_panel_rect, content_bounds) + + rl.begin_scissor_mode( + int(self.scroll_panel_rect.x), + int(self.scroll_panel_rect.y), + int(self.scroll_panel_rect.width), + int(self.scroll_panel_rect.height), + ) + + content_rect_with_scroll = rl.Rectangle( + self.scroll_panel_rect.x, + self.scroll_panel_rect.y + scroll_offset, + self.scroll_panel_rect.width, + content_total_height, + ) + + self._render_content(content_rect_with_scroll) + rl.end_scissor_mode() + + @abstractmethod + def _render_content(self, content_rect: rl.Rectangle): + pass + + def _render_footer(self, rect: rl.Rectangle): + footer_y = rect.y + rect.height - AlertConstants.MARGIN - AlertConstants.BUTTON_HEIGHT + + dismiss_x = rect.x + AlertConstants.MARGIN + self.dismiss_btn.set_position(dismiss_x, footer_y) + self.dismiss_btn.render() + + if self.has_reboot_btn: + reboot_x = rect.x + rect.width - AlertConstants.MARGIN - self.reboot_btn.rect.width + self.reboot_btn.set_position(reboot_x, footer_y) + self.reboot_btn.render() + + elif self.excessive_actuation_btn.is_visible: + actuation_x = rect.x + rect.width - AlertConstants.MARGIN - self.excessive_actuation_btn.rect.width + self.excessive_actuation_btn.set_position(actuation_x, footer_y) + self.excessive_actuation_btn.render() + + elif self.snooze_btn.is_visible: + snooze_x = rect.x + rect.width - AlertConstants.MARGIN - self.snooze_btn.rect.width + self.snooze_btn.set_position(snooze_x, footer_y) + self.snooze_btn.render() + + +class OffroadAlert(AbstractAlert): + def __init__(self): + super().__init__(has_reboot_btn=False) + self.sorted_alerts: list[AlertData] = [] + + def refresh(self): + if not self.sorted_alerts: + self._build_alerts() + + active_count = 0 + connectivity_needed = False + excessive_actuation = False + + for alert_data in self.sorted_alerts: + text = "" + alert_json = self.params.get(alert_data.key) + + if alert_json: + text = alert_json.get("text", "").replace("%1", alert_json.get("extra", "")) + + alert_data.text = text + alert_data.visible = bool(text) + + if alert_data.visible: + active_count += 1 + + if alert_data.key == "Offroad_ConnectivityNeeded" and alert_data.visible: + connectivity_needed = True + + if alert_data.key == "Offroad_ExcessiveActuation" and alert_data.visible: + excessive_actuation = True + + self.excessive_actuation_btn.set_visible(excessive_actuation) + self.snooze_btn.set_visible(connectivity_needed and not excessive_actuation) + return active_count + + def get_content_height(self) -> float: + if not self.sorted_alerts: + return 0 + + total_height = 20 + font = gui_app.font(FontWeight.NORMAL) + + for alert_data in self.sorted_alerts: + if not alert_data.visible: + continue + + text_width = int(self.content_rect.width - (AlertConstants.ALERT_INSET * 2)) + wrapped_lines = wrap_text(font, alert_data.text, AlertConstants.FONT_SIZE, text_width) + line_count = len(wrapped_lines) + text_height = line_count * (AlertConstants.FONT_SIZE * FONT_SCALE) + alert_item_height = max(text_height + (AlertConstants.ALERT_INSET * 2), AlertConstants.ALERT_HEIGHT) + total_height += round(alert_item_height + AlertConstants.ALERT_SPACING) + + if total_height > 20: + total_height = total_height - AlertConstants.ALERT_SPACING + 20 + + return total_height + + def _build_alerts(self): + self.sorted_alerts = [] + for key, config in sorted(OFFROAD_ALERTS.items(), key=lambda x: x[1].get("severity", 0), reverse=True): + severity = config.get("severity", 0) + alert_data = AlertData(key=key, text="", severity=severity) + self.sorted_alerts.append(alert_data) + + def _render_content(self, content_rect: rl.Rectangle): + y_offset = AlertConstants.ALERT_SPACING + font = gui_app.font(FontWeight.NORMAL) + + for alert_data in self.sorted_alerts: + if not alert_data.visible: + continue + + bg_color = AlertColors.HIGH_SEVERITY if alert_data.severity > 0 else AlertColors.LOW_SEVERITY + text_width = int(content_rect.width - (AlertConstants.ALERT_INSET * 2)) + wrapped_lines = wrap_text(font, alert_data.text, AlertConstants.FONT_SIZE, text_width) + line_count = len(wrapped_lines) + text_height = line_count * (AlertConstants.FONT_SIZE * FONT_SCALE) + alert_item_height = max(text_height + (AlertConstants.ALERT_INSET * 2), AlertConstants.ALERT_HEIGHT) + + alert_rect = rl.Rectangle( + content_rect.x + 10, + content_rect.y + y_offset, + content_rect.width - 30, + alert_item_height, + ) + + roundness = AlertConstants.BORDER_RADIUS / min(alert_rect.height, alert_rect.width) + rl.draw_rectangle_rounded(alert_rect, roundness, 10, bg_color) + + text_x = alert_rect.x + AlertConstants.ALERT_INSET + text_y = alert_rect.y + AlertConstants.ALERT_INSET + + for i, line in enumerate(wrapped_lines): + rl.draw_text_ex( + font, + line, + rl.Vector2(text_x, text_y + i * AlertConstants.FONT_SIZE * FONT_SCALE), + AlertConstants.FONT_SIZE, + 0, + AlertColors.TEXT, + ) + + y_offset += round(alert_item_height + AlertConstants.ALERT_SPACING) + + +class UpdateAlert(AbstractAlert): + def __init__(self): + super().__init__(has_reboot_btn=True) + self.release_notes = "" + self._wrapped_release_notes = "" + self._cached_content_height: float = 0.0 + self._html_renderer = HtmlRenderer(text="") + + def refresh(self) -> bool: + update_available: bool = self.params.get_bool("UpdateAvailable") + no_release_notes = "

    " + tr("No release notes available.") + "

    " + + if update_available: + self.release_notes = (self.params.get("UpdaterNewReleaseNotes") or b"").decode("utf8").strip() + self._html_renderer.parse_html_content(self.release_notes or no_release_notes) + self._cached_content_height = 0 + else: + self._html_renderer.parse_html_content(no_release_notes) + + return update_available + + def get_content_height(self) -> float: + if not self.release_notes: + return 100 + + if self._cached_content_height == 0: + self._wrapped_release_notes = self.release_notes + size = measure_text_cached(gui_app.font(FontWeight.NORMAL), self._wrapped_release_notes, AlertConstants.FONT_SIZE) + self._cached_content_height = max(size.y + 60, 100) + + return self._cached_content_height + + def _render_content(self, content_rect: rl.Rectangle): + notes_rect = rl.Rectangle(content_rect.x + 30, content_rect.y + 30, content_rect.width - 60, content_rect.height - 60) + self._html_renderer.render(notes_rect) diff --git a/iqpilot/selfdrive/ui/widgets/pairing_dialog.py b/iqpilot/selfdrive/ui/widgets/pairing_dialog.py new file mode 100644 index 000000000..f5cea6217 --- /dev/null +++ b/iqpilot/selfdrive/ui/widgets/pairing_dialog.py @@ -0,0 +1,255 @@ +import pyray as rl +import qrcode +import numpy as np +import time +import jwt +import os +from datetime import datetime, timedelta, UTC + +from iqpilot.common.api.base import BaseApi +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.params import Params +from iqpilot.konn3kt.registration import get_or_create_dongle_id, ensure_dev_pairing_identity +from iqpilot.system.hardware import HARDWARE, PC +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.wrap_text import wrap_text +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets.button import IconButton +from iqpilot.selfdrive.ui.ui_state import ui_state + + +class PairingDialog(Widget): + """Dialog for device pairing with QR code.""" + + QR_REFRESH_INTERVAL = 300 # 5 minutes in seconds + + def __init__(self): + super().__init__() + self.params = Params() + self.qr_texture: rl.Texture | None = None + self.last_qr_generation = float('-inf') + self._close_btn = IconButton(gui_app.texture("icons/iq/close.png", 80, 80)) + self._close_btn.set_click_callback(lambda: gui_app.set_modal_overlay(None)) + + def _get_pairing_url(self) -> str: + dev_pairing = PC and os.getenv("KONN3KT_DEV_PAIRING") == "1" + if dev_pairing: + try: + ensure_dev_pairing_identity(self.params, force_reset=os.getenv("KONN3KT_DEV_PAIRING_RESET") == "1") + except Exception: + return "error://dev_identity_setup_failed" + + try: + imei1 = HARDWARE.get_imei(0) or "" + except Exception as e: + cloudlog.warning(f"Failed to get imei1: {e}") + imei1 = "" + + try: + imei2 = HARDWARE.get_imei(1) or "" + except Exception as e: + cloudlog.warning(f"Failed to get imei2: {e}") + imei2 = "" + + try: + algorithm, private_key, public_key = BaseApi.get_key_pair() + if not private_key or not algorithm: + cloudlog.error("No device keys found") + return "error://keys_not_found" + + dongle_id = get_or_create_dongle_id(self.params, prefer_readonly=True) + + try: + serial = HARDWARE.get_serial() or "" + except Exception as e: + cloudlog.warning(f"Failed to get serial: {e}") + serial = "" + if not serial: + serial = (self.params.get("HardwareSerial") or "") if dev_pairing else "" + if not serial: + cloudlog.error("No hardware serial found, cannot generate pairing token") + return "error://serial_not_found" + + now = datetime.now(UTC).replace(tzinfo=None) + payload = { + 'identity': dongle_id, + 'nbf': now, + 'iat': now, + 'imei': imei1, + 'imei2': imei2, + 'serial': serial, + 'public_key': public_key, + 'register': True, + 'exp': now + timedelta(hours=1), + } + + try: + token = jwt.encode(payload, private_key, algorithm=algorithm) + except Exception as e: + cloudlog.warning(f"jwt.encode failed ({e}), retrying with normalized key") + try: + from cryptography.hazmat.primitives import serialization + key_bytes = private_key.encode("utf-8") if isinstance(private_key, str) else private_key + try: + key_obj = serialization.load_pem_private_key(key_bytes, password=None) + except Exception: + key_obj = serialization.load_ssh_private_key(key_bytes, password=None) + token = jwt.encode(payload, key_obj, algorithm=algorithm) + except Exception as e2: + cloudlog.error(f"Failed to generate pairing token: {e2}") + return "error://token_generation_failed" + if isinstance(token, bytes): + token = token.decode('utf8') + return f"https://konn3kt.com/?pair={token}" + except FileNotFoundError as e: + cloudlog.error(f"Key files not found: {e}") + return "error://keys_not_found" + except Exception as e: + cloudlog.error(f"Failed to generate pairing token: {e}") + return "error://token_generation_failed" + + def _generate_qr_code(self) -> None: + try: + url = self._get_pairing_url() + if url.startswith("error://"): + cloudlog.warning(f"Cannot generate QR code: {url}") + self.qr_texture = None + return + + qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4) + qr.add_data(url) + qr.make(fit=True) + + pil_img = qr.make_image(fill_color="black", back_color="white").convert('RGBA') + img_array = np.array(pil_img, dtype=np.uint8) + + if self.qr_texture and self.qr_texture.id != 0: + rl.unload_texture(self.qr_texture) + + rl_image = rl.Image() + rl_image.data = rl.ffi.cast("void *", img_array.ctypes.data) + rl_image.width = pil_img.width + rl_image.height = pil_img.height + rl_image.mipmaps = 1 + rl_image.format = rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 + + self.qr_texture = rl.load_texture_from_image(rl_image) + except Exception: + cloudlog.exception("QR code generation failed") + self.qr_texture = None + + def _check_qr_refresh(self) -> None: + current_time = time.monotonic() + if current_time - self.last_qr_generation >= self.QR_REFRESH_INTERVAL: + self._generate_qr_code() + self.last_qr_generation = current_time + + def _update_state(self): + if ui_state.prime_state.is_paired(): + gui_app.set_modal_overlay(None) + + def _render(self, rect: rl.Rectangle) -> int: + rl.clear_background(rl.Color(20, 21, 24, 255)) + + self._check_qr_refresh() + + margin = 70 + content_rect = rl.Rectangle(rect.x + margin, rect.y + margin, rect.width - 2 * margin, rect.height - 2 * margin) + y = content_rect.y + + # Close button + close_size = 80 + pad = 20 + close_rect = rl.Rectangle(content_rect.x - pad, y - pad, close_size + pad * 2, close_size + pad * 2) + self._close_btn.render(close_rect) + + y += close_size + 40 + + # Title + title = tr("Pair your device to your Konn3kt account") + title_font = gui_app.font(FontWeight.NORMAL) + left_width = int(content_rect.width * 0.5 - 15) + + title_wrapped = wrap_text(title_font, title, 75, left_width) + rl.draw_text_ex(title_font, "\n".join(title_wrapped), rl.Vector2(content_rect.x, y), 75, 0.0, rl.WHITE) + y += len(title_wrapped) * 75 + 60 + + # Two columns: instructions and QR code + remaining_height = content_rect.height - (y - content_rect.y) + right_width = content_rect.width // 2 - 20 + + # Instructions + self._render_instructions(rl.Rectangle(content_rect.x, y, left_width, remaining_height)) + + # QR code + qr_size = min(right_width, content_rect.height) - 40 + qr_x = content_rect.x + left_width + 40 + (right_width - qr_size) // 2 + qr_y = content_rect.y + self._render_qr_code(rl.Rectangle(qr_x, qr_y, qr_size, qr_size)) + + return -1 + + def _render_instructions(self, rect: rl.Rectangle) -> None: + instructions = [ + tr("Open the Konn3kt app on your phone"), + tr("Tap \"Add Device\" and scan the QR code on the right"), + tr("Follow the prompts in the app to finish pairing"), + ] + + font = gui_app.font(FontWeight.BOLD) + y = rect.y + + for i, text in enumerate(instructions): + circle_radius = 25 + circle_x = rect.x + circle_radius + 15 + text_x = rect.x + circle_radius * 2 + 40 + text_width = rect.width - (circle_radius * 2 + 40) + + wrapped = wrap_text(font, text, 47, int(text_width)) + text_height = len(wrapped) * 47 + circle_y = y + text_height // 2 + + # Circle and number + rl.draw_circle(int(circle_x), int(circle_y), circle_radius, rl.Color(16, 185, 169, 255)) + number = str(i + 1) + number_size = measure_text_cached(font, number, 30) + rl.draw_text_ex(font, number, (int(circle_x - number_size.x // 2), int(circle_y - number_size.y // 2)), 30, 0, rl.WHITE) + + # Text + rl.draw_text_ex(font, "\n".join(wrapped), rl.Vector2(text_x, y), 47, 0.0, rl.WHITE) + y += text_height + 50 + + def _render_qr_code(self, rect: rl.Rectangle) -> None: + # White card: QR codes must stay light to scan, and it reads as an intentional panel on the dark theme. + rl.draw_rectangle_rounded(rect, 0.06, 20, rl.Color(245, 245, 245, 255)) + + if not self.qr_texture: + error_font = gui_app.font(FontWeight.BOLD) + msg = tr("QR Code Error") + ms = measure_text_cached(error_font, msg, 34) + pos = rl.Vector2(rect.x + (rect.width - ms.x) / 2, rect.y + (rect.height - ms.y) / 2) + rl.draw_text_ex(error_font, msg, pos, 34, 0.0, rl.Color(200, 60, 52, 255)) + return + + pad = 28 + inner = rl.Rectangle(rect.x + pad, rect.y + pad, rect.width - 2 * pad, rect.height - 2 * pad) + source = rl.Rectangle(0, 0, self.qr_texture.width, self.qr_texture.height) + rl.draw_texture_pro(self.qr_texture, source, inner, rl.Vector2(0, 0), 0, rl.WHITE) + + def __del__(self): + if self.qr_texture and self.qr_texture.id != 0: + rl.unload_texture(self.qr_texture) + + +if __name__ == "__main__": + gui_app.init_window("pairing device") + pairing = PairingDialog() + try: + for _ in gui_app.render(): + result = pairing.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + if result != -1: + break + finally: + del pairing diff --git a/iqpilot/selfdrive/ui/widgets/screen_header.py b/iqpilot/selfdrive/ui/widgets/screen_header.py new file mode 100644 index 000000000..c46738092 --- /dev/null +++ b/iqpilot/selfdrive/ui/widgets/screen_header.py @@ -0,0 +1,58 @@ +import pyray as rl +from collections.abc import Callable + +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +HEADER_HEIGHT = 130 +BACK_BTN_SIZE = 110 + + +class ScreenHeader(Widget): + """Reusable offroad sub-screen header: a circular back button on the left and a title. + + Used by the Stats and NAV screens reached from the offroad launcher tiles. + """ + + BTN_COLOR = rl.Color(38, 40, 46, 255) + BTN_PRESSED = rl.Color(54, 57, 65, 255) + + def __init__(self, title: str | Callable[[], str], on_back: Callable[[], None] | None = None): + super().__init__() + self._title = title + self._on_back = on_back + self._title_offset = 0 # extra space between back button and title (for inline buttons) + self._back_icon = gui_app.texture("icons/iq/back.png", 56, 56, keep_aspect_ratio=True) + self._back_rect = rl.Rectangle(0, 0, BACK_BTN_SIZE, BACK_BTN_SIZE) + + def set_on_back(self, cb: Callable[[], None]) -> None: + self._on_back = cb + + def set_title(self, title: str | Callable[[], str]) -> None: + self._title = title + + def set_title_offset(self, offset: int) -> None: + self._title_offset = offset + + def _render(self, rect: rl.Rectangle): + self._back_rect = rl.Rectangle(rect.x, rect.y + (rect.height - BACK_BTN_SIZE) / 2, BACK_BTN_SIZE, BACK_BTN_SIZE) + + mouse_pos = rl.get_mouse_position() + pressed = self.is_pressed and rl.check_collision_point_rec(mouse_pos, self._back_rect) + rl.draw_rectangle_rounded(self._back_rect, 1.0, 20, self.BTN_PRESSED if pressed else self.BTN_COLOR) + icon_x = int(self._back_rect.x + (BACK_BTN_SIZE - self._back_icon.width) / 2) + icon_y = int(self._back_rect.y + (BACK_BTN_SIZE - self._back_icon.height) / 2) + rl.draw_texture(self._back_icon, icon_x, icon_y, rl.WHITE) + + # Title, vertically centered, to the right of the back button + font = gui_app.font(FontWeight.BOLD) + title = self._title() if callable(self._title) else self._title + title_size = measure_text_cached(font, title, 64) + title_x = self._back_rect.x + BACK_BTN_SIZE + 36 + self._title_offset + title_y = rect.y + (rect.height - title_size.y) / 2 + rl.draw_text_ex(font, title, rl.Vector2(int(title_x), int(title_y)), 64, 0, rl.WHITE) + + def _handle_mouse_release(self, mouse_pos: MousePos): + if rl.check_collision_point_rec(mouse_pos, self._back_rect) and self._on_back: + self._on_back() diff --git a/iqpilot/selfdrive/ui/widgets/setup.py b/iqpilot/selfdrive/ui/widgets/setup.py new file mode 100644 index 000000000..83b7e719d --- /dev/null +++ b/iqpilot/selfdrive/ui/widgets/setup.py @@ -0,0 +1,85 @@ +import math +import pyray as rl +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.ui.widgets.pairing_dialog import PairingDialog +from iqpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.wrap_text import wrap_text +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.confirm_dialog import alert_dialog +from iqpilot.system.ui.widgets.button import Button, ButtonStyle + +SETUP_CARD_BG = rl.Color(34, 36, 42, 255) +SETUP_CARD_BORDER = rl.Color(255, 255, 255, 26) +SETUP_ACCENT = rl.Color(16, 185, 169, 255) + + +class SetupWidget(Widget): + def __init__(self): + super().__init__() + self._pairing_dialog: PairingDialog | None = None + self._pair_device_btn = Button(lambda: tr("Pair device"), self._show_pairing, button_style=ButtonStyle.PRIMARY) + + def _render(self, rect: rl.Rectangle): + if not ui_state.prime_state.is_paired(): + self._render_registration(rect) + + def _render_registration(self, rect: rl.Rectangle): + """Render registration prompt.""" + + t = rl.get_time() + pulse = 0.5 + 0.5 * math.sin(t * 2.3) + glow_alpha = int(24 + pulse * 34) + border_alpha = int(28 + pulse * 38) + + glow_rect = rl.Rectangle(rect.x - 4, rect.y - 4, rect.width + 8, rect.height + 8) + rl.draw_rectangle_rounded_lines_ex(glow_rect, 0.06, 24, 5, rl.Color(SETUP_ACCENT.r, SETUP_ACCENT.g, SETUP_ACCENT.b, glow_alpha)) + rl.draw_rectangle_rounded(rl.Rectangle(rect.x, rect.y, rect.width, rect.height), 0.06, 24, SETUP_CARD_BG) + rl.draw_rectangle_rounded_lines_ex(rl.Rectangle(rect.x, rect.y, rect.width, rect.height), 0.06, 24, 2, SETUP_CARD_BORDER) + rl.draw_rectangle_rounded_lines_ex(rl.Rectangle(rect.x, rect.y, rect.width, rect.height), 0.06, 24, 2, + rl.Color(SETUP_ACCENT.r, SETUP_ACCENT.g, SETUP_ACCENT.b, border_alpha)) + + x = rect.x + 64 + w = rect.width - 128 + + font = gui_app.font(FontWeight.BOLD) + title = tr("Finish Setup") + title_size = measure_text_cached(font, title, 75) + desc = tr("Pair your device in the Konn3kt app.") + light_font = gui_app.font(FontWeight.NORMAL) + wrapped = wrap_text(light_font, desc, 50, int(w)) + + desc_line_h = 50 * FONT_SCALE + content_h = title_size.y + 38 + len(wrapped) * desc_line_h + 30 + 200 + y = rect.y + (rect.height - content_h) / 2 - 44 + + title_x = x + (w - title_size.x) / 2 + rl.draw_text_ex(font, title, rl.Vector2(int(title_x), int(y)), 75, 0, rl.WHITE) + y += title_size.y + 38 + + for line in wrapped: + line_size = measure_text_cached(light_font, line, 50) + line_x = x + (w - line_size.x) / 2 + rl.draw_text_ex(light_font, line, rl.Vector2(int(line_x), int(y)), 50, 0, rl.WHITE) + y += desc_line_h + + button_rect = rl.Rectangle(x, y + 30, w, 200) + cta_glow = rl.Rectangle(button_rect.x - 8, button_rect.y - 8, button_rect.width + 16, button_rect.height + 16) + rl.draw_rectangle_rounded(cta_glow, 0.5, 24, rl.Color(SETUP_ACCENT.r, SETUP_ACCENT.g, SETUP_ACCENT.b, int(16 + pulse * 20))) + self._pair_device_btn.render(button_rect) + + def _show_pairing(self): + if not system_time_valid(): + dlg = alert_dialog(tr("Please connect to Wi-Fi to complete initial pairing")) + gui_app.set_modal_overlay(dlg) + return + + if not self._pairing_dialog: + self._pairing_dialog = PairingDialog() + gui_app.set_modal_overlay(self._pairing_dialog, lambda result: setattr(self, '_pairing_dialog', None)) + + def __del__(self): + if self._pairing_dialog: + del self._pairing_dialog diff --git a/iqpilot/selfdrive/ui/widgets/ssh_key.py b/iqpilot/selfdrive/ui/widgets/ssh_key.py new file mode 100644 index 000000000..a5cc06c3c --- /dev/null +++ b/iqpilot/selfdrive/ui/widgets/ssh_key.py @@ -0,0 +1,217 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import pyray as rl +import requests +import threading +import copy +from collections.abc import Callable +from enum import Enum + +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr, tr_noop +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import DialogResult +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.widgets.confirm_dialog import alert_dialog +from iqpilot.system.ui.widgets.keyboard import Keyboard +from iqpilot.system.ui.widgets.list_view import ( + ItemAction, + ListItem, + BUTTON_HEIGHT, + BUTTON_BORDER_RADIUS, + BUTTON_FONT_SIZE, + BUTTON_WIDTH, +) + +VALUE_FONT_SIZE = 48 + + +class SshKeyFetcher: + HTTP_TIMEOUT = 15 + + def __init__(self, params: Params): + self._params = params + self._on_response: Callable[[str | None], None] | None = None + self._done: bool = False + self._error: str | None = None + + def fetch(self, username: str, on_response: Callable[[str | None], None]): + self._error = None + self._on_response = on_response + threading.Thread(target=self._fetch_thread, args=(username,), daemon=True).start() + + def update(self): + if not self._done: + return + self._done = False + if self._error is not None: + self.clear() + if self._on_response: + self._on_response(self._error) + + def clear(self): + self._params.remove("GithubUsername") + self._params.remove("GithubSshKeys") + + def _fetch_thread(self, username: str): + try: + response = requests.get(f"https://github.com/{username}.keys", timeout=self.HTTP_TIMEOUT) + response.raise_for_status() + keys = response.text.strip() + if not keys: + # Genuinely no public SSH keys on this GitHub account + self._error = tr("No SSH keys found for user '{}'").format(username) + else: + self._params.put("GithubUsername", username) + self._params.put("GithubSshKeys", keys) + except requests.exceptions.Timeout: + self._error = tr("Request timed out") + except requests.exceptions.HTTPError as e: + status = e.response.status_code if e.response is not None else None + if status == 404: + self._error = tr("No SSH keys found for user '{}'").format(username) + else: + cloudlog.exception("SSH key fetch HTTP error") + self._error = tr("GitHub error ({}) fetching keys").format(status or "?") + except requests.exceptions.SSLError: + # Almost always a wrong device clock (cert validity check) or stale CA bundle + cloudlog.exception("SSH key fetch SSL error") + self._error = tr("Couldn't verify GitHub - check device time") + except requests.exceptions.ConnectionError: + cloudlog.exception("SSH key fetch connection error") + self._error = tr("Couldn't reach GitHub - check connection") + except Exception: + cloudlog.exception("SSH key fetch failed") + self._error = tr("Couldn't fetch SSH keys - see logs") + finally: + self._done = True + + +class SshKeyActionState(Enum): + LOADING = tr_noop("LOADING") + ADD = tr_noop("ADD") + REMOVE = tr_noop("REMOVE") + + +class SshKeyAction(ItemAction): + HTTP_TIMEOUT = 15 + MAX_WIDTH = 500 + + def __init__(self): + super().__init__(self.MAX_WIDTH, True) + + self._keyboard = Keyboard(min_text_size=1) + self._params = Params() + self._error_message: str = "" + self._text_font = gui_app.font(FontWeight.NORMAL) + self._button = Button("", click_callback=self._handle_button_click, button_style=ButtonStyle.LIST_ACTION, + border_radius=BUTTON_BORDER_RADIUS, font_size=BUTTON_FONT_SIZE) + + self._refresh_state() + + def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: + super().set_touch_valid_callback(touch_callback) + self._button.set_touch_valid_callback(touch_callback) + + def _refresh_state(self): + self._username = self._params.get("GithubUsername") + self._state = SshKeyActionState.REMOVE if self._params.get("GithubSshKeys") else SshKeyActionState.ADD + + def _render(self, rect: rl.Rectangle) -> bool: + # Show error dialog if there's an error + if self._error_message: + message = copy.copy(self._error_message) + gui_app.set_modal_overlay(alert_dialog(message)) + self._username = "" + self._error_message = "" + + # Draw username if exists + if self._username: + text_size = measure_text_cached(self._text_font, self._username, VALUE_FONT_SIZE) + rl.draw_text_ex( + self._text_font, + self._username, + (rect.x + rect.width - BUTTON_WIDTH - text_size.x - 30, rect.y + (rect.height - text_size.y) / 2), + VALUE_FONT_SIZE, + 1.0, + rl.Color(170, 170, 170, 255), + ) + + # Draw button + button_rect = rl.Rectangle(rect.x + rect.width - BUTTON_WIDTH, rect.y + (rect.height - BUTTON_HEIGHT) / 2, BUTTON_WIDTH, BUTTON_HEIGHT) + self._button.set_rect(button_rect) + self._button.set_text(tr(self._state.value)) + self._button.set_enabled(self._state != SshKeyActionState.LOADING) + self._button.render(button_rect) + return False + + def _handle_button_click(self): + if self._state == SshKeyActionState.ADD: + self._keyboard.reset() + self._keyboard.set_title(tr("Enter your GitHub username")) + gui_app.set_modal_overlay(self._keyboard, callback=self._on_username_submit) + elif self._state == SshKeyActionState.REMOVE: + self._params.remove("GithubUsername") + self._params.remove("GithubSshKeys") + self._refresh_state() + + def _on_username_submit(self, result: DialogResult): + if result != DialogResult.CONFIRM: + return + + username = self._keyboard.text.strip() + if not username: + return + + self._state = SshKeyActionState.LOADING + threading.Thread(target=lambda: self._fetch_ssh_key(username), daemon=True).start() + + def _fetch_ssh_key(self, username: str): + try: + url = f"https://github.com/{username}.keys" + response = requests.get(url, timeout=self.HTTP_TIMEOUT) + response.raise_for_status() + keys = response.text.strip() + if not keys: + # Genuinely no public SSH keys on this GitHub account + self._error_message = tr("No SSH keys found for user '{}'").format(username) + self._state = SshKeyActionState.ADD + return + + # Success - save keys + self._params.put("GithubUsername", username) + self._params.put("GithubSshKeys", keys) + self._state = SshKeyActionState.REMOVE + self._username = username + + except requests.exceptions.Timeout: + self._error_message = tr("Request timed out") + self._state = SshKeyActionState.ADD + except requests.exceptions.HTTPError as e: + status = e.response.status_code if e.response is not None else None + if status == 404: + self._error_message = tr("No SSH keys found for user '{}'").format(username) + else: + cloudlog.exception("SSH key fetch HTTP error") + self._error_message = tr("GitHub error ({}) fetching keys").format(status or "?") + self._state = SshKeyActionState.ADD + except requests.exceptions.SSLError: + cloudlog.exception("SSH key fetch SSL error") + self._error_message = tr("Couldn't verify GitHub - check device time") + self._state = SshKeyActionState.ADD + except requests.exceptions.ConnectionError: + cloudlog.exception("SSH key fetch connection error") + self._error_message = tr("Couldn't reach GitHub - check connection") + self._state = SshKeyActionState.ADD + except Exception: + cloudlog.exception("SSH key fetch failed") + self._error_message = tr("Couldn't fetch SSH keys - see logs") + self._state = SshKeyActionState.ADD + + +def ssh_key_item(title: str | Callable[[], str], description: str | Callable[[], str]) -> ListItem: + return ListItem(title=title, description=description, action_item=SshKeyAction()) diff --git a/iqpilot/system/__init__.py b/iqpilot/system/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/ble-transportd.service b/iqpilot/system/ble-transportd.service new file mode 100644 index 000000000..d6892417a --- /dev/null +++ b/iqpilot/system/ble-transportd.service @@ -0,0 +1,37 @@ +# Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +[Unit] +Description=Konn3kt BLE Device Settings Transport +Documentation=https://gitlvb.teallvbs.xyz/teal/iqpilot +After=bluetooth.service dbus.service +Wants=bluetooth.service dbus.service +# Never give up: /data/openpilot is a symlink created by the boot-time rename +# migration, so early starts fail "failed to locate repo root". With a burst +# limit those failures permanently kill BLE for the whole boot. +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=comma +AmbientCapabilities=CAP_SYS_NICE +Environment="IQPILOT_SOURCE_ROOT=/data/openpilot/iqpilot" +Environment="PYTHONPATH=/usr/libexec/iqpilot/python:/data/openpilot/.venv/lib/python3.12/site-packages:/data/openpilot" +Environment="PYTHONSAFEPATH=1" +Environment="PATH=/usr/local/venv/bin:/usr/sbin:/usr/bin:/sbin:/bin" +WorkingDirectory=/data/openpilot +ExecStartPre=/bin/bash -c 'for i in $(seq 1 120); do if [ -x /usr/libexec/iqpilot/iqpilot_bundle_runner ]; then exit 0; fi; echo "Waiting for iqpilot_bundle_runner..."; sleep 5; done; exit 1' +ExecStartPre=/bin/bash -c 'for i in $(seq 1 120); do if [ -e /data/openpilot/iqpilot/system ] && [ -e /data/openpilot/iqpilot/common ]; then exit 0; fi; echo "Waiting for repo root..."; sleep 5; done; exit 1' +ExecStartPre=/bin/bash -c 'if [ -f /data/openpilot/artifacts/runtime/ensure_private_installed.sh ]; then bash /data/openpilot/artifacts/runtime/ensure_private_installed.sh || true; fi' +ExecStart=/usr/libexec/iqpilot/iqpilot_bundle_runner --bundle iqpilot_hephaestusd_private --mode python-module --entry iqpilot_private.konn3kt.hephaestus.ble_transportd --daemon-name ble_transportd +TimeoutStartSec=600 +Restart=always +RestartSec=10 +StandardOutput=journal +StandardError=journal +PrivateTmp=yes +NoNewPrivileges=false +ProtectSystem=full +ProtectHome=no + +[Install] +WantedBy=multi-user.target diff --git a/iqpilot/system/camerad/__init__.py b/iqpilot/system/camerad/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/camerad/camerad b/iqpilot/system/camerad/camerad new file mode 100755 index 000000000..24d930234 Binary files /dev/null and b/iqpilot/system/camerad/camerad differ diff --git a/iqpilot/system/camerad/cameras/nv12_info.py b/iqpilot/system/camerad/cameras/nv12_info.py new file mode 100644 index 000000000..bcb6312d2 --- /dev/null +++ b/iqpilot/system/camerad/cameras/nv12_info.py @@ -0,0 +1,21 @@ +# Python version of system/camerad/cameras/nv12_info.h +# Calculations from third_party/linux/include/msm_media_info.h (VENUS_BUFFER_SIZE) + +def align(val: int, alignment: int) -> int: + return ((val + alignment - 1) // alignment) * alignment + +def get_nv12_info(width: int, height: int) -> tuple[int, int, int, int]: + """Returns (stride, y_height, uv_height, buffer_size) for NV12 frame dimensions.""" + stride = align(width, 128) + y_height = align(height, 32) + uv_height = align(height // 2, 16) + + # VENUS_BUFFER_SIZE for NV12 + y_plane = stride * y_height + uv_plane = stride * uv_height + 4096 + size = y_plane + uv_plane + max(16 * 1024, 8 * stride) + size = align(size, 4096) + size += align(width, 512) * 512 # kernel padding for non-aligned frames + size = align(size, 4096) + + return stride, y_height, uv_height, size diff --git a/iqpilot/system/camerad/snapshot.py b/iqpilot/system/camerad/snapshot.py new file mode 100755 index 000000000..fb6123b64 --- /dev/null +++ b/iqpilot/system/camerad/snapshot.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +import subprocess +import time + +import numpy as np +from PIL import Image + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionIpcClient +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL +from iqpilot.system.hardware import PC +from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert +from iqpilot.system.manager.process_config import managed_processes + + +VISION_STREAMS = { + "roadCameraState": VisionStreamType.VISION_STREAM_ROAD, + "driverCameraState": VisionStreamType.VISION_STREAM_DRIVER, + "wideRoadCameraState": VisionStreamType.VISION_STREAM_WIDE_ROAD, +} + + +def jpeg_write(fn, dat): + img = Image.fromarray(dat) + img.save(fn, "JPEG") + + +def yuv_to_rgb(y, u, v): + ul = np.repeat(np.repeat(u, 2).reshape(u.shape[0], y.shape[1]), 2, axis=0).reshape(y.shape) + vl = np.repeat(np.repeat(v, 2).reshape(v.shape[0], y.shape[1]), 2, axis=0).reshape(y.shape) + + yuv = np.dstack((y, ul, vl)).astype(np.int16) + yuv[:, :, 1:] -= 128 + + m = np.array([ + [1.00000, 1.00000, 1.00000], + [0.00000, -0.39465, 2.03211], + [1.13983, -0.58060, 0.00000], + ]) + rgb = np.dot(yuv, m).clip(0, 255) + return rgb.astype(np.uint8) + + +def extract_image(buf): + # NV12 format: Y plane followed by interleaved UV plane + # UV plane size is stride * uv_height, where uv_height = align(height/2, 16) + uv_height = ((buf.height // 2) + 15) // 16 * 16 + uv_plane_size = buf.stride * uv_height + + y = np.array(buf.data[:buf.uv_offset], dtype=np.uint8).reshape((-1, buf.stride))[:buf.height, :buf.width] + uv_data = buf.data[buf.uv_offset:buf.uv_offset + uv_plane_size] + u = np.array(uv_data[::2], dtype=np.uint8).reshape((-1, buf.stride//2))[:buf.height//2, :buf.width//2] + v = np.array(uv_data[1::2], dtype=np.uint8).reshape((-1, buf.stride//2))[:buf.height//2, :buf.width//2] + + return yuv_to_rgb(y, u, v) + + +def get_snapshots(frame="roadCameraState", front_frame="driverCameraState"): + sockets = [s for s in (frame, front_frame) if s is not None] + sm = messaging.SubMaster(sockets) + vipc_clients = {s: VisionIpcClient("camerad", VISION_STREAMS[s], True) for s in sockets} + + # wait 4 sec from camerad startup for focus and exposure + while sm[sockets[0]].frameId < int(4. / DT_MDL): + sm.update() + + for client in vipc_clients.values(): + client.connect(True) + + # grab images + rear, front = None, None + if frame is not None: + c = vipc_clients[frame] + rear = extract_image(c.recv()) + if front_frame is not None: + c = vipc_clients[front_frame] + front = extract_image(c.recv()) + return rear, front + + +def snapshot(): + params = Params() + + if (not params.get_bool("IsOffroad")) or params.get_bool("IsTakingSnapshot"): + print("Already taking snapshot") + return None, None + + front_camera_allowed = params.get_bool("RecordFront") + params.put_bool("IsTakingSnapshot", True) + set_offroad_alert("Offroad_IsTakingSnapshot", True) + time.sleep(2.0) # Give hardwared time to read the param, or if just started give camerad time to start + + # Check if camerad is already started + try: + subprocess.check_call(["pgrep", "camerad"]) + print("Camerad already running") + params.put_bool("IsTakingSnapshot", False) + params.remove("Offroad_IsTakingSnapshot") + return None, None + except subprocess.CalledProcessError: + pass + + try: + # Allow testing on replay on PC + if not PC: + managed_processes['camerad'].start() + + frame = "wideRoadCameraState" + front_frame = "driverCameraState" if front_camera_allowed else None + rear, front = get_snapshots(frame, front_frame) + finally: + managed_processes['camerad'].stop() + params.put_bool("IsTakingSnapshot", False) + set_offroad_alert("Offroad_IsTakingSnapshot", False) + + if not front_camera_allowed: + front = None + + return rear, front + + +if __name__ == "__main__": + pic, fpic = snapshot() + if pic is not None: + print(pic.shape) + jpeg_write("/tmp/back.jpg", pic) + if fpic is not None: + jpeg_write("/tmp/front.jpg", fpic) + else: + print("Error taking snapshot") diff --git a/iqpilot/system/camerad/test/.gitignore b/iqpilot/system/camerad/test/.gitignore new file mode 100644 index 000000000..d67473ebc --- /dev/null +++ b/iqpilot/system/camerad/test/.gitignore @@ -0,0 +1,2 @@ +jpegs/ +test_ae_gray diff --git a/iqpilot/system/camerad/test/debug.sh b/iqpilot/system/camerad/test/debug.sh new file mode 100755 index 000000000..a031be692 --- /dev/null +++ b/iqpilot/system/camerad/test/debug.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -e + +#echo 4294967295 | sudo tee /sys/module/cam_debug_util/parameters/debug_mdl + +# no CCI and UTIL, very spammy +echo 0xfffdbfff | sudo tee /sys/module/cam_debug_util/parameters/debug_mdl +#echo 0 | sudo tee /sys/module/cam_debug_util/parameters/debug_mdl + +sudo dmesg -C +scons -u -j8 --minimal . +export DEBUG_FRAMES=1 +export DISABLE_ROAD=1 DISABLE_WIDE_ROAD=1 +#export DISABLE_DRIVER=1 +export LOGPRINT=debug +./camerad diff --git a/iqpilot/system/camerad/test/icp_debug.sh b/iqpilot/system/camerad/test/icp_debug.sh new file mode 100755 index 000000000..ebeef9bf8 --- /dev/null +++ b/iqpilot/system/camerad/test/icp_debug.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -e + +cd /sys/kernel/debug/tracing +echo "" > trace +echo 1 > tracing_on +#echo Y > /sys/kernel/debug/camera_icp/a5_debug_q +echo 0x1 > /sys/kernel/debug/camera_icp/a5_debug_type +echo 1 > /sys/kernel/debug/tracing/events/camera/enable +echo 0xffffffff > /sys/kernel/debug/camera_icp/a5_debug_lvl +echo 1 > /sys/kernel/debug/tracing/events/camera/cam_icp_fw_dbg/enable + +cat /sys/kernel/debug/tracing/trace_pipe diff --git a/iqpilot/system/camerad/test/intercept.sh b/iqpilot/system/camerad/test/intercept.sh new file mode 100755 index 000000000..e269929af --- /dev/null +++ b/iqpilot/system/camerad/test/intercept.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +DISABLE_ROAD=1 DISABLE_WIDE_ROAD=1 DEBUG_FRAMES=1 LOGPRINT=debug LD_PRELOAD=/data/tici_test_scripts/isp/interceptor/tmpioctl.so ./camerad diff --git a/iqpilot/system/camerad/test/stress_restart.sh b/iqpilot/system/camerad/test/stress_restart.sh new file mode 100755 index 000000000..0445dcba7 --- /dev/null +++ b/iqpilot/system/camerad/test/stress_restart.sh @@ -0,0 +1,9 @@ +#!/bin/sh +cd .. +while :; do + ./camerad & + pid="$!" + sleep 2 + kill -2 $pid + wait $pid +done diff --git a/iqpilot/system/camerad/test/test_camerad.py b/iqpilot/system/camerad/test/test_camerad.py new file mode 100644 index 000000000..a8faf6763 --- /dev/null +++ b/iqpilot/system/camerad/test/test_camerad.py @@ -0,0 +1,217 @@ +import os +import time + +import pytest +import numpy as np +from msgq.visionipc import VisionIpcClient + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.selfdrive.test.helpers import processes_context +from iqpilot.system.camerad.snapshot import VISION_STREAMS +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.tools.lib.logreader import msgs_to_time_series + +TEST_TIMESPAN = 10 +CAMERAS = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState') +TEST_PATTERN_FRAMES = 200 +TEST_PATTERN_MIN_CONFIDENCE = 10 +TEST_PATTERN_CONNECT_TIMEOUT = 15 +TEST_PATTERN_CONFIGS = { + 'ox03c10': (41, 4), + 'os04c10': (97, 4), +} + + +def _pattern_sample(client): + buf = client.recv(1000) + if buf is None: + return None + + y = np.asarray(buf.data[:buf.uv_offset], dtype=np.uint8).reshape((-1, buf.stride))[:buf.height, :buf.width] + profile = y[:, ::8].mean(axis=1) + padded = np.pad(profile, (4, 4), mode='edge') + neighbors = [padded[i:i + len(profile)] for i in range(9) if i != 4] + residual = profile - np.median(neighbors, axis=0) + position = int(np.argmax(residual)) + return client.frame_id, client.timestamp_sof, position, residual[position], buf.height + + +def _test_pattern_session(): + samples = {camera: [] for camera in CAMERAS} + sockets = {camera: messaging.sub_sock(camera, conflate=False, timeout=100) for camera in CAMERAS} + logs = [] + with pytest.MonkeyPatch.context() as monkeypatch: + monkeypatch.setenv('SPECTRA_TEST_PATTERN', '1') + monkeypatch.setenv('SPECTRA_ERROR_PROB', '-1') + with processes_context(['camerad']) as processes: + clients = {camera: VisionIpcClient('camerad', VISION_STREAMS[camera], False) for camera in CAMERAS} + pending = set(clients) + deadline = time.monotonic() + TEST_PATTERN_CONNECT_TIMEOUT + while pending and time.monotonic() < deadline: + assert processes[0].proc is not None and processes[0].proc.exitcode is None + pending = {camera for camera in pending if not clients[camera].connect(False)} + if pending: + time.sleep(0.1) + assert not pending, f'VisionIPC connection timeout: {sorted(pending)}' + + for _ in range(TEST_PATTERN_FRAMES): + for camera, client in clients.items(): + sample = _pattern_sample(client) + if sample is not None: + samples[camera].append(sample) + for sock in sockets.values(): + logs.extend(messaging.drain_sock(sock)) + + return msgs_to_time_series(logs), samples + + +def run_and_log(procs, services, duration): + logs = [] + + try: + for p in procs: + managed_processes[p].start() + socks = [messaging.sub_sock(s, conflate=False, timeout=100) for s in services] + + start_time = time.monotonic() + while time.monotonic() - start_time < duration: + for s in socks: + logs.extend(messaging.drain_sock(s)) + for p in procs: + assert managed_processes[p].proc.is_alive() + finally: + for p in procs: + managed_processes[p].stop() + + return logs + +@pytest.fixture(scope="module") +def logs(): + logs = run_and_log(["camerad", ], CAMERAS, TEST_TIMESPAN) + ts = msgs_to_time_series(logs) + + for cam in CAMERAS: + expected_frames = SERVICE_LIST[cam].frequency * TEST_TIMESPAN + cnt = len(ts[cam]['t']) + assert expected_frames*0.8 < cnt < expected_frames*1.2, f"unexpected frame count {cam}: {expected_frames=}, got {cnt}" + + dts = np.abs(np.diff([ts[cam]['timestampSof']/1e6]) - 1000/SERVICE_LIST[cam].frequency) + assert (dts < 1.0).all(), f"{cam} dts(ms) out of spec: max diff {dts.max()}, 99 percentile {np.percentile(dts, 99)}" + return ts + +@pytest.mark.tici +class TestCamerad: + def test_frame_skips(self, logs): + for c in CAMERAS: + assert set(np.diff(logs[c]['frameId'])) == {1, }, f"{c} has frame skips" + + def test_frame_sync(self, logs): + n = range(len(logs['roadCameraState']['t'][:-10])) + + frame_ids = {i: [logs[cam]['frameId'][i] for cam in CAMERAS] for i in n} + assert all(len(set(v)) == 1 for v in frame_ids.values()), "frame IDs not aligned" + + frame_times = {i: [logs[cam]['timestampSof'][i] for cam in CAMERAS] for i in n} + diffs = {i: (max(ts) - min(ts))/1e6 for i, ts in frame_times.items()} + + laggy_frames = {k: v for k, v in diffs.items() if v > 1.1} + assert len(laggy_frames) == 0, f"Frames not synced properly: {laggy_frames=}" + + def test_sanity_checks(self, logs): + self._sanity_checks(logs) + + def _sanity_checks(self, ts): + for c in CAMERAS: + assert c in ts + assert len(ts[c]['t']) > 20 + + # not a valid request id + assert 0 not in ts[c]['requestId'] + + # should monotonically increase + assert np.all(np.diff(ts[c]['frameId']) >= 1) + assert np.all(np.diff(ts[c]['requestId']) >= 1) + + # EOF > SOF + assert np.all((ts[c]['timestampEof'] - ts[c]['timestampSof']) > 0) + + # logMonoTime > SOF + assert np.all((ts[c]['t'] - ts[c]['timestampSof']/1e9) > 1e-7) + + # logMonoTime > EOF, needs some tolerance since EOF is (SOF + readout time) but there is noise in the SOF timestamping (done via IRQ) + assert np.mean((ts[c]['t'] - ts[c]['timestampEof']/1e9) > 1e-7) > 0.7 # should be mostly logMonoTime > EOF + assert np.all((ts[c]['t'] - ts[c]['timestampEof']/1e9) > -0.10) # when EOF > logMonoTime, it should never be more than two frames + + def test_stress_test(self): + os.environ['SPECTRA_ERROR_PROB'] = '0.008' + logs = run_and_log(["camerad", ], CAMERAS, 10) + ts = msgs_to_time_series(logs) + + # we should see some jumps from introduced errors + assert np.max([ np.max(np.diff(ts[c]['frameId'])) for c in CAMERAS ]) > 1 + assert np.max([ np.max(np.diff(ts[c]['requestId'])) for c in CAMERAS ]) > 1 + + self._sanity_checks(ts) + + +@pytest.fixture(scope="module") +def test_pattern_data(): + return _test_pattern_session() + + +@pytest.mark.tici +@pytest.mark.xdist_group("camerad_test_pattern") +class TestCameradTestPattern: + def test_frame_delivery(self, test_pattern_data): + logs, samples_by_camera = test_pattern_data + for camera in CAMERAS: + assert camera in logs + samples = samples_by_camera[camera] + assert len(samples) > TEST_PATTERN_FRAMES * 0.9 + + state_frame_ids = logs[camera]['frameId'] + state_request_ids = logs[camera]['requestId'] + vipc_frame_ids = np.array([sample[0] for sample in samples]) + for source, frame_ids in (('camera state', state_frame_ids), ('VisionIPC', vipc_frame_ids)): + frame_steps = np.diff(frame_ids) + skipped = frame_ids[1:][frame_steps != 1] + assert len(skipped) == 0, f'{camera} {source} skipped frames before {skipped}' + + expected_sof_step = 1e9 / SERVICE_LIST[camera].frequency + sof_step_errors = np.diff(logs[camera]['timestampSof']) - expected_sof_step + assert np.all(np.abs(sof_step_errors) < 1e6), f'{camera} SOF cadence errors: {sof_step_errors[np.abs(sof_step_errors) >= 1e6]}' + + request_steps = np.diff(state_request_ids) + skipped_requests = state_request_ids[1:][request_steps != 1] + assert len(skipped_requests) == 0, f'{camera} skipped requests before {skipped_requests}' + + state_sofs = dict(zip(state_frame_ids, logs[camera]['timestampSof'], strict=True)) + matched_samples = [sample for sample in samples if sample[0] in state_sofs] + assert len(matched_samples) > len(samples) * 0.8 + mismatched_sofs = { + frame_id: (timestamp_sof, state_sofs[frame_id]) for frame_id, timestamp_sof, *_ in matched_samples if timestamp_sof != state_sofs[frame_id] + } + assert not mismatched_sofs, f'{camera} VisionIPC/camera state SOFs disagree: {mismatched_sofs}' + + def test_pattern(self, test_pattern_data): + logs, samples_by_camera = test_pattern_data + for camera in CAMERAS: + sensors = set(logs[camera]['sensor']) + assert len(sensors) == 1 + sensor = sensors.pop() + assert sensor in TEST_PATTERN_CONFIGS, f'unsupported test pattern sensor: {sensor}' + cycle_frames, position_tolerance = TEST_PATTERN_CONFIGS[sensor] + + samples = samples_by_camera[camera] + confident = [sample for sample in samples if sample[3] > TEST_PATTERN_MIN_CONFIDENCE] + positions = np.array([sample[2] for sample in confident]) + assert len(confident) > len(samples) * 0.7, f'{camera} test pattern confidence too low' + assert len(np.unique(positions)) > 20, f'{camera} test pattern is not moving' + assert np.ptp(positions) > confident[0][4] * 0.75, f'{camera} test pattern does not span the frame' + + samples_by_frame = {sample[0]: sample for sample in confident} + repeating_pairs = [(sample, samples_by_frame[sample[0] + cycle_frames]) for sample in confident if sample[0] + cycle_frames in samples_by_frame] + assert len(repeating_pairs) > 20 + unexpected = [(first[0], first[2], second[2]) for first, second in repeating_pairs if abs(second[2] - first[2]) > position_tolerance] + assert len(unexpected) < len(repeating_pairs) * 0.3, f'{camera} test pattern cycle mismatches: {unexpected}' diff --git a/iqpilot/system/camerad/test/test_exposure.py b/iqpilot/system/camerad/test/test_exposure.py new file mode 100644 index 000000000..394c41567 --- /dev/null +++ b/iqpilot/system/camerad/test/test_exposure.py @@ -0,0 +1,51 @@ +import time +import numpy as np +import pytest + +from iqpilot.selfdrive.test.helpers import with_processes +from iqpilot.system.camerad.snapshot import get_snapshots + +TEST_TIME = 45 +REPEAT = 5 + +@pytest.mark.tici +class TestCamerad: + @classmethod + def setup_class(cls): + pass + + def _numpy_rgb2gray(self, im): + ret = np.clip(im[:,:,2] * 0.114 + im[:,:,1] * 0.587 + im[:,:,0] * 0.299, 0, 255).astype(np.uint8) + return ret + + def _is_exposure_okay(self, i, med_mean=None): + if med_mean is None: + med_mean = np.array([[0.18,0.3],[0.18,0.3]]) + h, w = i.shape[:2] + i = i[h//10:9*h//10,w//10:9*w//10] + med_ex, mean_ex = med_mean + i = self._numpy_rgb2gray(i) + i_median = np.median(i) / 255. + i_mean = np.mean(i) / 255. + print([i_median, i_mean]) + return med_ex[0] < i_median < med_ex[1] and mean_ex[0] < i_mean < mean_ex[1] + + @with_processes(['camerad']) + def test_camera_operation(self): + passed = 0 + start = time.monotonic() + while time.monotonic() - start < TEST_TIME and passed < REPEAT: + rpic, dpic = get_snapshots(frame="roadCameraState", front_frame="driverCameraState") + wpic, _ = get_snapshots(frame="wideRoadCameraState") + + res = self._is_exposure_okay(rpic) + res = res and self._is_exposure_okay(dpic) + res = res and self._is_exposure_okay(wpic) + + if passed > 0 and not res: + passed = -passed # fails test if any failure after first sus + break + + passed += int(res) + time.sleep(2) + assert passed >= REPEAT diff --git a/iqpilot/system/flockd.service b/iqpilot/system/flockd.service new file mode 100644 index 000000000..f694f2132 --- /dev/null +++ b/iqpilot/system/flockd.service @@ -0,0 +1,34 @@ +# Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +[Unit] +Description=Konn3kt Flock/ALPR RF Detector +Documentation=https://gitlvb.teallvbs.xyz/teal/iqpilot +After=bluetooth.service dbus.service NetworkManager.service +Wants=bluetooth.service dbus.service +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=comma +AmbientCapabilities=CAP_SYS_NICE +Environment="IQPILOT_SOURCE_ROOT=/data/openpilot/iqpilot" +Environment="PYTHONPATH=/usr/libexec/iqpilot/python:/data/openpilot/.venv/lib/python3.12/site-packages:/data/openpilot" +Environment="PYTHONSAFEPATH=1" +Environment="PATH=/usr/local/venv/bin:/usr/sbin:/usr/bin:/sbin:/bin" +WorkingDirectory=/data/openpilot +ExecStartPre=/bin/bash -c 'for i in $(seq 1 120); do if [ -x /usr/libexec/iqpilot/iqpilot_bundle_runner ]; then exit 0; fi; echo "Waiting for iqpilot_bundle_runner..."; sleep 5; done; exit 1' +ExecStartPre=/bin/bash -c 'for i in $(seq 1 120); do if [ -e /data/openpilot/iqpilot/system ] && [ -e /data/openpilot/iqpilot/common ]; then exit 0; fi; echo "Waiting for repo root..."; sleep 5; done; exit 1' +ExecStartPre=/bin/bash -c 'if [ -f /data/openpilot/artifacts/runtime/ensure_private_installed.sh ]; then bash /data/openpilot/artifacts/runtime/ensure_private_installed.sh || true; fi' +ExecStart=/usr/libexec/iqpilot/iqpilot_bundle_runner --bundle iqpilot_hephaestusd_private --mode python-module --entry iqpilot_private.konn3kt.flockd.flockd --daemon-name flockd +TimeoutStartSec=600 +Restart=always +RestartSec=15 +StandardOutput=journal +StandardError=journal +PrivateTmp=yes +NoNewPrivileges=false +ProtectSystem=full +ProtectHome=no + +[Install] +WantedBy=multi-user.target diff --git a/iqpilot/system/hardware/__init__.py b/iqpilot/system/hardware/__init__.py new file mode 100644 index 000000000..1338aa2cf --- /dev/null +++ b/iqpilot/system/hardware/__init__.py @@ -0,0 +1,22 @@ +import os +from typing import cast + +from iqpilot.system.hardware.base import HardwareBase +from iqpilot.system.hardware.tici.hardware import Tici +from iqpilot.system.hardware.pc.hardware import Pc + +TICI = os.path.isfile('/TICI') +AGNOS = os.path.isfile('/AGNOS') +PC = not TICI + + +if TICI: + HARDWARE = cast(HardwareBase, Tici()) +else: + HARDWARE = cast(HardwareBase, Pc()) + +# Only comma 3/3X expose the DMA-BUF EGL extensions used by the zero-copy +# camera renderer and the direct EGL frame-pacing calls. /TICI is also present +# on comma 4, so it identifies the AGNOS hardware family rather than this GPU +# capability. +EGL_DMA_BUF_SUPPORTED = TICI and HARDWARE.get_device_type() in ("tici", "tizi") diff --git a/iqpilot/system/hardware/base.py b/iqpilot/system/hardware/base.py new file mode 100644 index 000000000..217696e09 --- /dev/null +++ b/iqpilot/system/hardware/base.py @@ -0,0 +1,228 @@ +import os +from abc import abstractmethod, ABC +from dataclasses import dataclass, fields + +from iqpilot.cereal import log + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +class LPAError(RuntimeError): + pass + +class LPAProfileNotFoundError(LPAError): + pass + +@dataclass +class Profile: + iccid: str + nickname: str + enabled: bool + provider: str + +@dataclass +class ThermalZone: + # a zone from /sys/class/thermal/thermal_zone* + name: str # a.k.a type + scale: float = 1000. # scale to get degrees in C + zone_number = -1 + + def read(self) -> float: + if self.zone_number < 0: + for n in os.listdir("/sys/devices/virtual/thermal"): + if not n.startswith("thermal_zone"): + continue + with open(os.path.join("/sys/devices/virtual/thermal", n, "type")) as f: + if f.read().strip() == self.name: + self.zone_number = int(n.removeprefix("thermal_zone")) + break + + try: + with open(f"/sys/devices/virtual/thermal/thermal_zone{self.zone_number}/temp") as f: + return int(f.read()) / self.scale + except FileNotFoundError: + return 0 + +@dataclass +class ThermalConfig: + cpu: list[ThermalZone] | None = None + gpu: list[ThermalZone] | None = None + dsp: ThermalZone | None = None + pmic: list[ThermalZone] | None = None + memory: ThermalZone | None = None + intake: ThermalZone | None = None + exhaust: ThermalZone | None = None + case: ThermalZone | None = None + + def get_msg(self): + ret = {} + for f in fields(ThermalConfig): + v = getattr(self, f.name) + if v is not None: + if isinstance(v, list): + ret[f.name + "TempC"] = [x.read() for x in v] + else: + ret[f.name + "TempC"] = v.read() + return ret + +class LPABase(ABC): + @abstractmethod + def list_profiles(self) -> list[Profile]: + pass + + @abstractmethod + def get_active_profile(self) -> Profile | None: + pass + + @abstractmethod + def delete_profile(self, iccid: str) -> None: + pass + + @abstractmethod + def bootstrap(self) -> None: + pass + + @abstractmethod + def download_profile(self, qr: str, nickname: str | None = None) -> None: + pass + + @abstractmethod + def nickname_profile(self, iccid: str, nickname: str) -> None: + pass + + @abstractmethod + def switch_profile(self, iccid: str) -> None: + pass + + def is_comma_profile(self, iccid: str) -> bool: + return any(iccid.startswith(prefix) for prefix in ('8985235',)) + +class HardwareBase(ABC): + @staticmethod + def get_cmdline() -> dict[str, str]: + with open('/proc/cmdline') as f: + cmdline = f.read() + return {kv[0]: kv[1] for kv in [s.split('=') for s in cmdline.split(' ')] if len(kv) == 2} + + @staticmethod + def read_param_file(path, parser, default=0): + try: + with open(path) as f: + return parser(f.read()) + except Exception: + return default + + def booted(self) -> bool: + return True + + def reboot(self, reason=None): + print("REBOOT!") + + def uninstall(self): + print("uninstall") + + def get_os_version(self): + return None + + @abstractmethod + def get_device_type(self): + pass + + def get_imei(self, slot) -> str: + return "" + + def get_serial(self): + return "" + + def get_network_info(self): + return None + + def get_network_type(self): + return NetworkType.none + + def get_sim_info(self): + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + + def get_sim_lpa(self) -> LPABase: + raise NotImplementedError("SIM LPA not available") + + def get_network_strength(self, network_type): + return NetworkStrength.unknown + + def get_network_metered(self, network_type) -> bool: + return network_type not in (NetworkType.none, NetworkType.wifi, NetworkType.ethernet) + + def get_current_power_draw(self): + return 0 + + def get_som_power_draw(self): + return 0 + + def shutdown(self): + print("SHUTDOWN!") + + def get_thermal_config(self): + return ThermalConfig() + + def set_display_power(self, on: bool): + pass + + def set_screen_brightness(self, percentage): + pass + + def get_screen_brightness(self): + return 0 + + def set_power_save(self, powersave_enabled): + pass + + def get_gpu_usage_percent(self): + return 0 + + def get_modem_version(self): + return None + + def get_modem_temperatures(self): + return [] + + def initialize_hardware(self): + pass + + def configure_modem(self): + pass + + def reboot_modem(self): + pass + + def recover_sim_detection(self) -> bool: + return False + + def get_networks(self): + return None + + def has_internal_panda(self) -> bool: + return False + + def reset_internal_panda(self): + pass + + def recover_internal_panda(self): + pass + + def get_modem_data_usage(self): + return -1, -1 + + def get_voltage(self) -> float: + return 0. + + def get_current(self) -> float: + return 0. + + def set_ir_power(self, percent: int): + pass diff --git a/iqpilot/system/hardware/egpu_dock/TESTING.md b/iqpilot/system/hardware/egpu_dock/TESTING.md new file mode 100644 index 000000000..38542e401 --- /dev/null +++ b/iqpilot/system/hardware/egpu_dock/TESTING.md @@ -0,0 +1,47 @@ +# eGPU dock bring-up runbook + +Our flasher is a port of comma's known-working one, byte-identical firmware +bundle, but it has never touched real hardware. Order matters: everything +read-only first, evidence at every step. + +Run everything as root from the repo root on the device, dock on the USB-C +port, car ignition off. + +## 1. Read-only probe (safe, run first, share the output) + + sudo python3 iqpilot/system/hardware/egpu_dock/dock_probe.py + +Expected on a dock previously flashed by stock openpilot: product matches the +bundled `custom ed4e39b7-CLEAN`, USB3 speed, PCIe link L0, stable config read. +Any other result: stop and send the output before proceeding. + +## 2. Flash-path validation (writes, but writes the same bytes) + +A stock-flashed dock already runs our exact bundled firmware, so the +no-op path proves version detection: + + sudo python3 iqpilot/system/hardware/egpu_dock/flash.py + +Expected: "firmware matches" and no write. Then exercise the full write path +by reflashing the identical image: + + sudo python3 iqpilot/system/hardware/egpu_dock/flash.py --force + +This backs up the per-unit config page to /data/egpu_dock_config/ first and +verifies every sector; identical bytes make it the lowest-risk possible +full-path test. Re-run step 1 after; product string and config sha must be +unchanged. + +## 3. Runtime + +Set `IQEgpuEnabled`, go onroad (bench is fine), and confirm iqegpumodeld +downloads/compiles and the selector reports UsbGpu* status. The runtime gate +requires the exact bundled firmware product string, so a dock that failed +step 2 will be treated as absent by design. + +## If anything goes wrong + +The dock falling back to the ROM bootloader (product "USB 3.2 PCIe +TinyEnclosure" or AS2462*) is recoverable: flash.py handles ROM recovery, and +the config backup from step 2 is on disk. Do not improvise register writes; +capture output and stop. diff --git a/iqpilot/system/hardware/egpu_dock/__init__.py b/iqpilot/system/hardware/egpu_dock/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/hardware/egpu_dock/dock_probe.py b/iqpilot/system/hardware/egpu_dock/dock_probe.py new file mode 100644 index 000000000..748e01e21 --- /dev/null +++ b/iqpilot/system/hardware/egpu_dock/dock_probe.py @@ -0,0 +1,46 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import hashlib +import sys + +from iqpilot.system.hardware.egpu_dock.flash import ( + Flash, RomFallback, bundled_version, find_dock, in_rom_bootloader, link_up, stable_read, +) + + +def main() -> int: + path, vid_pid, product = find_dock() + if path is None: + print("no eGPU dock enumerated") + return 1 + print(f"dock at {path}") + print(f" vid:pid {vid_pid[0]}:{vid_pid[1]}") + print(f" product {product!r}") + print(f" bundled {bundled_version()!r}") + print(f" match {product == bundled_version()}") + with open(path + "/speed") as fs: + speed = int(fs.read()) + print(f" usb speed {speed} Mbps ({'USB3' if speed >= 5000 else 'USB2 - register reads capped at 64B'})") + if in_rom_bootloader(vid_pid, product): + print(" state ROM bootloader (config page lost or firmware invalid)") + return 2 + print(f" pcie link {'L0 (trained)' if link_up() else 'not trained'}") + + flash = Flash() + try: + flash.connect() + config = stable_read(flash, 0, 0x100, 3) + print(f" config sha256={hashlib.sha256(config).hexdigest()[:16]} " + f"(stable over 3 reads, {sum(1 for b in config if b != 0xFF)} non-blank bytes)") + except (RomFallback, OSError, RuntimeError, TimeoutError) as e: + print(f" config read failed: {type(e).__name__}: {e}") + return 3 + finally: + flash.close() + print("all read-only checks passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/iqpilot/system/hardware/egpu_dock/firmware_wrapped.bin b/iqpilot/system/hardware/egpu_dock/firmware_wrapped.bin new file mode 100644 index 000000000..1d738e4a7 Binary files /dev/null and b/iqpilot/system/hardware/egpu_dock/firmware_wrapped.bin differ diff --git a/iqpilot/system/hardware/egpu_dock/flash.py b/iqpilot/system/hardware/egpu_dock/flash.py new file mode 100644 index 000000000..263a42dd0 --- /dev/null +++ b/iqpilot/system/hardware/egpu_dock/flash.py @@ -0,0 +1,617 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import argparse +import ctypes +import errno +import fcntl +import glob +import hashlib +import os +import re +import signal +import struct +import sys +import time +import zlib +from pathlib import Path + +VID_PIDS = (("add1", "0001"), ("3801", "0001")) +ROM_VID_PIDS = (("174c", "2464"), ("174c", "2463")) +ROM_PRODUCT = "USB 3.2 PCIe TinyEnclosure" +FIRMWARE_PATH = Path(__file__).with_name("firmware_wrapped.bin") +CONFIG_DIR = "/data/egpu_dock_config" +LEGACY_CONFIG_DIR = "/data/chestnut_config" +PM_PATHS = ("/sys/bus/platform/devices/a800000.ssusb", "/sys/bus/platform/devices/a600000.ssusb", + "/sys/bus/usb/devices/usb4") +VBUS_PATH = "/sys/kernel/debug/regulator/smb2-vbus/enable" +IMAGE_OFFSET = 0x100 +SECTOR, PAGE = 4096, 128 +MAX_REGISTER_READ_SIZE = 255 +MAX_CODE_SIZE = 0x10000 +FLASH_BUDGET = 600.0 +USBDEVFS_CONTROL = 0xC0185500 +USBDEVFS_BULK = 0xC0185502 +USBDEVFS_SETINTERFACE = 0x80085504 +USBDEVFS_SETCONFIGURATION = 0x80045505 +USBDEVFS_CLAIMINTERFACE = 0x8004550F +USBDEVFS_RESET = 0x5514 +USBDEVFS_CLEAR_HALT = 0x80045515 + +_deadline = float("inf") + + +def check_budget(): + if time.monotonic() > _deadline: + raise TimeoutError(f"flash did not converge within {FLASH_BUDGET:g}s") + + +class Ctrl(ctypes.Structure): + _fields_ = [("request_type", ctypes.c_uint8), ("request", ctypes.c_uint8), + ("value", ctypes.c_uint16), ("index", ctypes.c_uint16), + ("length", ctypes.c_uint16), ("timeout", ctypes.c_uint32), + ("data", ctypes.c_void_p)] + + +class Bulk(ctypes.Structure): + _fields_ = [("ep", ctypes.c_uint), ("len", ctypes.c_uint), + ("timeout", ctypes.c_uint), ("data", ctypes.c_void_p)] + + +class RomFallback(Exception): + pass + + +def find_dock(): + found = [] + for d in glob.glob("/sys/bus/usb/devices/*"): + try: + with open(d + "/idVendor") as fv, open(d + "/idProduct") as fp: + vid_pid = (fv.read().strip(), fp.read().strip()) + if vid_pid in VID_PIDS + ROM_VID_PIDS: + with open(d + "/product") as fpr: + found.append((d, vid_pid, fpr.read().strip())) + except OSError: + pass + if len(found) > 1: + raise RuntimeError(f"expected one eGPU dock, found {len(found)}") + return found[0] if found else (None, None, None) + + +def in_rom_bootloader(vid_pid, product): + return vid_pid in ROM_VID_PIDS or product == ROM_PRODUCT or (product or "").startswith("AS2462") + + +def disable_runtime_pm(path): + control = os.path.join(path, "power/control") + if not os.path.exists(control): + return + with open(control, "w") as f: + f.write("on\n") + with open(control) as fh: + applied = fh.read().strip() + if applied != "on": + raise RuntimeError(f"could not disable USB runtime PM: {control}") + delay = os.path.join(path, "power/autosuspend_delay_ms") + if os.path.exists(delay): + with open(delay, "w") as f: + f.write("-1\n") + + +def unbind_drivers(path): + for interface in glob.glob(path + ":*"): + driver = interface + "/driver" + if os.path.islink(driver): + with open(os.path.realpath(driver) + "/unbind", "w") as f: + f.write(os.path.basename(interface)) + + +def open_device(path): + with open(path + "/busnum") as fb, open(path + "/devnum") as fd_: + bus, dev = int(fb.read()), int(fd_.read()) + return os.open(f"/dev/bus/usb/{bus:03d}/{dev:03d}", os.O_RDWR) + + +def link_up() -> bool: + try: + path, _, _ = find_dock() + if path is None: + return False + fd = open_device(path) + except (OSError, RuntimeError): + return False + try: + fcntl.ioctl(fd, USBDEVFS_CONTROL, Ctrl(0x40, 0xF3, 1, 0, 0, 2000, None)) + buf = (ctypes.c_ubyte * 1)() + fcntl.ioctl(fd, USBDEVFS_CONTROL, Ctrl(0xC0, 0xE4, 0xB450, 0, 1, 1000, ctypes.cast(buf, ctypes.c_void_p))) + return buf[0] == 0x78 + except OSError: + return False + finally: + os.close(fd) + + +def claim_interface(path, setup=False): + disable_runtime_pm(path) + unbind_drivers(path) + fd = open_device(path) + try: + if setup: + fcntl.ioctl(fd, USBDEVFS_SETCONFIGURATION, struct.pack("I", 1)) + fcntl.ioctl(fd, USBDEVFS_CLAIMINTERFACE, struct.pack("I", 0)) + if setup: + fcntl.ioctl(fd, USBDEVFS_SETINTERFACE, struct.pack("II", 0, 0)) + except OSError as e: + os.close(fd) + if e.errno == errno.EBUSY: + raise RuntimeError("eGPU dock is in use, stop the model/GPU processes before flashing") from e + raise + return fd + + +class Flash: + def __init__(self): + self.fd = -1 + self.max_register_read_size = MAX_REGISTER_READ_SIZE + + def close(self): + if self.fd >= 0: + os.close(self.fd) + self.fd = -1 + + def connect(self, timeout=5.0): + self.close() + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + path, vid_pid, product = find_dock() + if in_rom_bootloader(vid_pid, product): + raise RomFallback("eGPU dock fell back to the ROM bootloader") + if path is not None: + try: + with open(path + "/speed") as fs: + speed = int(fs.read()) + except (OSError, ValueError): + speed = 0 + self.max_register_read_size = 64 if speed < 5000 else MAX_REGISTER_READ_SIZE + self.fd = claim_interface(path) + return + time.sleep(0.1) + raise RuntimeError(f"eGPU dock did not enumerate within {timeout:g}s") + + def reg_write(self, addr, value): + fcntl.ioctl(self.fd, USBDEVFS_CONTROL, + Ctrl(0x40, 0xE5, addr & 0xFFFF, value & 0xFFFF, 0, 2000, None)) + + def reg_read(self, addr, length=1): + buf = (ctypes.c_ubyte * length)() + fcntl.ioctl(self.fd, USBDEVFS_CONTROL, + Ctrl(0xC0, 0xE4, addr & 0xFFFF, 0, length, 2000, ctypes.cast(buf, ctypes.c_void_p))) + return bytes(buf) + + def write_buffer(self, data): + for i, value in enumerate(data): + self.reg_write(0x7000 + i, value) + + def wait_controller(self, timeout=2.0): + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + if not self.reg_read(0xC8A9)[0] & 1: + return + raise TimeoutError("flash controller timeout") + + def transaction(self, command, addr=0, length=0, addr_len=0x07, mode=0): + for reg, value in ((0xC8AD, mode), (0xC8AE, 0), (0xC8AF, 0), (0xC8AA, command), (0xC8AC, addr_len), + (0xC8A1, addr), (0xC8A2, addr >> 8), (0xC8AB, addr >> 16), (0xC8A3, length >> 8), (0xC8A4, length)): + self.reg_write(reg, value & 0xFF) + self.reg_write(0xC8A9, 1) + self.wait_controller() + for _ in range(4): + self.reg_write(0xC8AD, 0) + + def write_enable(self): + for reg, value in ((0xC8AD, 0), (0xC8AA, 0x06), (0xC8AC, 0x04), (0xC8A3, 0), (0xC8A4, 0), (0xC8A9, 1)): + self.reg_write(reg, value) + self.wait_controller() + + def status(self): + self.transaction(0x05, length=1, addr_len=0x04) + return self.reg_read(0x7000)[0] + + def wait_write_done(self, timeout=10.0): + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + if not self.status() & 1: + return + time.sleep(0.005) + raise TimeoutError("SPI flash WIP timeout") + + def init(self): + self.reg_write(0xCC33, 0x04) + self.reg_write(0xCA81, self.reg_read(0xCA81)[0] | 1) + self.reg_write(0xC805, 0x02) + self.reg_write(0xC8A6, 0x04) + for _ in range(5): + self.write_enable() + self.write_buffer(bytes(4)) + self.transaction(0x01, length=1, addr_len=0x04, mode=1) + time.sleep(0.01) + if not self.status() & 0x1C: + return + raise RuntimeError("could not clear SPI block protection") + + def read(self, addr, length): + out = bytearray() + while len(out) < length: + n = min(4096, length - len(out)) + self.transaction(0x03, addr + len(out), max(4096, n)) + for off in range(0, n, self.max_register_read_size): + out += self.reg_read(0x7000 + off, min(self.max_register_read_size, n - off)) + return bytes(out) + + def erase_sector(self, addr): + self.write_enable() + self.transaction(0x20, addr) + self.wait_write_done() + + def program(self, addr, data): + self.write_buffer(data + bytes((-len(data)) % 4)) + self.write_enable() + self.transaction(0x02, addr, len(data), mode=1) + self.wait_write_done() + + +def validate_image(data): + if len(data) < 10: + raise ValueError("wrapped firmware is too short") + body_len = int.from_bytes(data[:4], "little") + if body_len > MAX_CODE_SIZE: + raise ValueError(f"wrapped firmware body exceeds {MAX_CODE_SIZE} bytes") + if len(data) != body_len + 10 or data[4 + body_len] != 0xA5: + raise ValueError("invalid wrapped firmware length or magic") + body = data[4:4 + body_len] + if data[5 + body_len] != sum(body) & 0xFF: + raise ValueError("invalid wrapped firmware checksum") + if data[6 + body_len:] != zlib.crc32(body).to_bytes(4, "little"): + raise ValueError("invalid wrapped firmware CRC") + + +def image_product(image): + match = re.search(rb"custom [0-9a-f]{8}-CLEAN", image) + if match is None: + raise ValueError("no product string in wrapped firmware") + return match.group().decode() + + +def reconnect(flash): + attempt = 0 + while True: + attempt += 1 + check_budget() + try: + flash.connect() + flash.init() + return + except (OSError, TimeoutError, RuntimeError) as e: + print(f"waiting for eGPU dock (attempt {attempt}): {e}", flush=True) + time.sleep(1) + + +def with_retries(flash, label, operation): + attempt = 0 + while True: + attempt += 1 + try: + return operation() + except (OSError, TimeoutError, RuntimeError) as e: + check_budget() + print(f"{label} attempt {attempt}: {e}", flush=True) + reconnect(flash) + + +def stable_read(flash, addr, length, count=2): + def read(): + reads = [flash.read(addr, length) for _ in range(count)] + if any(x != reads[0] for x in reads[1:]): + raise RuntimeError(f"unstable flash read at 0x{addr:05x}") + return reads[0] + return with_retries(flash, f"read 0x{addr:05x}", read) + + +def program_sector(flash, addr, target): + def program(): + flash.erase_sector(addr) + if flash.read(addr, SECTOR) != bytes([0xFF]) * SECTOR: + raise RuntimeError("sector erase verification failed") + for off in range(0, SECTOR, PAGE): + chunk = target[off:off + PAGE] + if chunk != bytes([0xFF]) * len(chunk): + flash.program(addr + off, chunk) + if flash.read(addr + off, len(chunk)) != chunk: + raise RuntimeError(f"page verify failed at 0x{addr + off:05x}") + if flash.read(addr, SECTOR) != target: + raise RuntimeError("sector verification failed") + with_retries(flash, f"sector 0x{addr:05x}", program) + + +def config_path(): + return os.path.join(CONFIG_DIR, f"{os.uname().nodename}.bin") + + +def legacy_config_path(): + return os.path.join(LEGACY_CONFIG_DIR, f"{os.uname().nodename}.bin") + + +def saved_config(path, data): + os.makedirs(os.path.dirname(path), exist_ok=True) + try: + fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600) + except FileExistsError as e: + with open(path, "rb") as fh: + backup = fh.read() + if len(backup) != 0x100: + raise RuntimeError(f"invalid config backup: {path}") from e + if backup != data: + print(f"restoring config from {path}", flush=True) + return backup + with os.fdopen(fd, "wb") as f: + f.write(data) + f.flush() + os.fsync(f.fileno()) + return data + + +def rom_write(image, config): + path, _, _ = find_dock() + if path is None: + raise RuntimeError("eGPU dock disappeared before recovery") + unbind_drivers(path) + fd = open_device(path) + try: + fcntl.ioctl(fd, USBDEVFS_RESET) + finally: + os.close(fd) + time.sleep(3) + path, _, _ = find_dock() + if path is None: + raise RuntimeError("eGPU dock did not re-enumerate after reset") + fd = claim_interface(path, setup=True) + for ep in (0x02, 0x81): + fcntl.ioctl(fd, USBDEVFS_CLEAR_HALT, struct.pack("I", ep)) + tag = 0 + + def bulk(ep, payload, timeout): + buf = ctypes.create_string_buffer(bytes(payload), len(payload)) + fcntl.ioctl(fd, USBDEVFS_BULK, Bulk(ep, len(payload), timeout, ctypes.cast(buf, ctypes.c_void_p))) + return buf.raw + + def cmd(cdb, data=b"", timeout=30000): + nonlocal tag + tag += 1 + bulk(0x02, struct.pack("BBB12x", 0xE1, 0x50, 0), config[:0x80]) + cmd(struct.pack(">BBB12x", 0xE1, 0x50, 1), config[0x80:]) + cmd(struct.pack(">BBI", 0xE3, 0x50, min(len(image), 0xFF00)), image[:0xFF00]) + if len(image) > 0xFF00: + cmd(struct.pack(">BBI", 0xE3, 0xD0, len(image) - 0xFF00), image[0xFF00:]) + cmd(struct.pack(">BB13x", 0xE8, 0x51)) + finally: + os.close(fd) + print("recovery flash done", flush=True) + + +def vbus_write(value): + try: + with open(VBUS_PATH, "w") as f: + f.write(value + "\n") + except OSError: + pass + + +def vbus_cycle(): + if os.path.exists(VBUS_PATH): + vbus_write("0") + time.sleep(2) + vbus_write("1") + time.sleep(5) + + +def activate(expected_product): + if not os.path.exists(VBUS_PATH): + print("no VBUS control, firmware activates on the next dock power cycle", flush=True) + return + print("power-cycling the eGPU dock VBUS", flush=True) + vbus_write("0") + disconnected = False + deadline = time.monotonic() + 5.0 + while time.monotonic() < deadline: + path, _, _ = find_dock() + if path is None: + disconnected = True + break + time.sleep(0.2) + time.sleep(1) + vbus_write("1") + if not disconnected: + print("dock stayed powered, firmware activates on its next power cycle", flush=True) + return + deadline = time.monotonic() + 15.0 + while time.monotonic() < deadline: + _, _, product = find_dock() + if product is not None: + if product == expected_product: + print(f"activated {expected_product}", flush=True) + else: + print(f"dock re-enumerated with {product!r}, firmware activates on its next power cycle", flush=True) + return + time.sleep(0.2) + print("dock did not re-enumerate, firmware activates on its next power cycle", flush=True) + + +def defer_signal(signum, _frame): + os.write(1, f"signal {signum} deferred until the dock is powered back up\n".encode()) + + +def flash_dock(expected_version=None, force=False): + global _deadline + + image = FIRMWARE_PATH.read_bytes() + validate_image(image) + expected_product = image_product(image) + if expected_version is not None and expected_product != f"custom {expected_version}-CLEAN": + raise RuntimeError(f"bundled firmware is {expected_product!r}, expected version {expected_version}") + + path, vid_pid, product = find_dock() + if path is None: + print("no eGPU dock connected", flush=True) + return + if product == expected_product and not force: + print(f"eGPU dock firmware is up to date ({expected_product})", flush=True) + return + + _deadline = time.monotonic() + FLASH_BUDGET + for pm_path in PM_PATHS: + disable_runtime_pm(pm_path) + + previous = {sig: signal.signal(sig, defer_signal) for sig in (signal.SIGINT, signal.SIGTERM, signal.SIGHUP)} + try: + if in_rom_bootloader(vid_pid, product): + if not recover_from_rom(image, expected_product): + return + force, product = True, None + write_image(image, expected_product, product, force) + finally: + for sig, handler in previous.items(): + signal.signal(sig, handler) + + +def recover_from_rom(image, expected_product): + backup = config_path() + if not os.path.isfile(backup) and os.path.isfile(legacy_config_path()): + backup = legacy_config_path() + if not os.path.isfile(backup): + raise RuntimeError(f"cannot recover from the ROM bootloader without a config backup at {config_path()}") + with open(backup, "rb") as fh: + config = fh.read() + if len(config) != 0x100: + raise RuntimeError(f"invalid config backup: {backup}") + + committed = False + while True: + check_budget() + path, vid_pid, product = find_dock() + if path is None: + if committed: + print("dock is offline, recovered firmware boots on its next power cycle", flush=True) + return False + vbus_cycle() + continue + if not in_rom_bootloader(vid_pid, product): + return True + if committed: + print("dock stayed powered, recovered firmware boots on its next power cycle", flush=True) + return False + try: + rom_write(image, config) + committed = True + except (OSError, TimeoutError, RuntimeError) as e: + print(f"ROM recovery failed, retrying: {e}", flush=True) + vbus_cycle() + continue + activate(expected_product) + + +def write_image(image, expected_product, product, force): + if force: + print(f"forced reflash of {expected_product}", flush=True) + else: + print(f"eGPU dock firmware mismatch: {product!r}; expected {expected_product!r}", flush=True) + + flash = Flash() + try: + reconnect(flash) + config = stable_read(flash, 0, 0x100, 3) + config = saved_config(config_path(), config) + image_end = IMAGE_OFFSET + len(image) + first_sector = IMAGE_OFFSET & ~(SECTOR - 1) + span = (image_end + SECTOR - 1) & ~(SECTOR - 1) + current = stable_read(flash, first_sector, span - first_sector) + target = bytearray(current) + target[:len(config)] = config + target[IMAGE_OFFSET - first_sector:image_end - first_sector] = image + target = bytes(target) + print(f"target {len(image)} bytes at 0x{IMAGE_OFFSET:05x}, sha256={hashlib.sha256(image).hexdigest()}", flush=True) + + if not _still_offroad(): + raise RuntimeError("device went onroad before any sector was written; aborting flash") + + for addr in range(first_sector, span, SECTOR): + off = addr - first_sector + wanted = target[off:off + SECTOR] + if current[off:off + SECTOR] == wanted: + print(f"sector 0x{addr:05x}: unchanged", flush=True) + else: + print(f"sector 0x{addr:05x}: programming", flush=True) + program_sector(flash, addr, wanted) + + verified = stable_read(flash, first_sector, span - first_sector, 3) + if verified != target: + raise RuntimeError("final full-image verification failed") + print(f"verified sha256={hashlib.sha256(verified).hexdigest()}", flush=True) + finally: + flash.close() + + activate(expected_product) + + +def bundled_version() -> str: + return image_product(FIRMWARE_PATH.read_bytes()) + + +def _still_offroad() -> bool: + try: + from iqpilot.common.params import Params + return bool(Params().get_bool("IsOffroad")) + except Exception: + return True + + +def dock_needs_flash(usb_devices: list[dict]) -> bool: + try: + expected = bundled_version() + except (OSError, ValueError): + return False + ids = tuple(tuple(int(x, 16) for x in p) for p in VID_PIDS + ROM_VID_PIDS) + return any((d.get("vendorId"), d.get("productId")) in ids and d.get("product") != expected + for d in usb_devices) + + +def main(): + parser = argparse.ArgumentParser(description="check and flash the bundled eGPU dock firmware") + parser.add_argument("version", nargs="?", help="expected firmware version hash") + parser.add_argument("--force", action="store_true", help="reflash even when the version matches") + args = parser.parse_args() + if os.geteuid() != 0: + raise RuntimeError("flash.py must run as root") + flash_dock(expected_version=args.version, force=args.force) + + +if __name__ == "__main__": + try: + main() + except Exception as e: + print(f"FAIL: {type(e).__name__}: {e}", file=sys.stderr) + sys.exit(1) diff --git a/iqpilot/system/hardware/egpu_dock/status.py b/iqpilot/system/hardware/egpu_dock/status.py new file mode 100644 index 000000000..97077776f --- /dev/null +++ b/iqpilot/system/hardware/egpu_dock/status.py @@ -0,0 +1,89 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import time + +from iqpilot.system.hardware.usb import EGPU_DOCK_FW_PRODUCT, is_egpu_usb_device + +EGPU_POWERED_VOLTAGE = 5000 +GPU_TEMP_LIMIT = 110. +MEMORY_TEMP_LIMIT = 108. +TEMP_HYSTERESIS = 5. +FAN_START_GPU_TEMP = 60. +FAN_STOP_GPU_TEMP = 50. +FAN_START_MEMORY_TEMP = 70. +FAN_STOP_MEMORY_TEMP = 60. +FAN_STALLED_RPM = 250 + + +class EgpuDockStatus: + def __init__(self): + self.offroad = True + self.pcie_failed = False + self.power_lost = False + self.power_restored = False + self.link_failures = 0 + self.model_loading_seen = False + self.model_attempted = False + self.overheated = False + self.fans_obstructed = False + self.usb_seen = False + self.usb_failed = False + + def update(self, offroad, usb_state, firmware_failed, model_loading, model_active, compiled, state, set_alert): + detected = [d for d in usb_state if is_egpu_usb_device(d["vendorId"], d["productId"], include_bootloader=True)] + devices = [d for d in detected if is_egpu_usb_device(d["vendorId"], d["productId"])] + firmware_ok = len(devices) == 1 and devices[0]["product"] == EGPU_DOCK_FW_PRODUCT + + if self.offroad and not offroad: + self.pcie_failed = False + self.power_lost = False + self.power_restored = False + self.link_failures = 0 + self.model_loading_seen = False + self.model_attempted = False + self.usb_seen = firmware_ok + self.usb_failed = False + + self.model_loading_seen |= model_loading + self.model_attempted |= self.model_loading_seen and not model_loading and model_active is not None + + if not offroad and self.usb_seen and not firmware_ok: + self.usb_failed = True + + if not offroad and self.model_attempted and state is not None: + power_lost = state.supplyFault or state.supplyVoltage < EGPU_POWERED_VOLTAGE + self.link_failures = self.link_failures + 1 if state.pcieLtssm != 0x78 else 0 + self.pcie_failed |= self.link_failures >= 2 or power_lost + self.power_lost |= power_lost + + if self.pcie_failed and self.power_lost and state is not None: + self.power_restored |= not state.supplyFault and state.supplyVoltage >= EGPU_POWERED_VOLTAGE + if self.usb_failed: + self.pcie_failed = False + self.power_lost = False + self.power_restored = False + + if state is not None: + gpu_limit = GPU_TEMP_LIMIT - (TEMP_HYSTERESIS if self.overheated else 0.) + memory_limit = MEMORY_TEMP_LIMIT - (TEMP_HYSTERESIS if self.overheated else 0.) + self.overheated = state.tempC >= gpu_limit or state.memoryTempC >= memory_limit + fan_hot = (state.tempC >= (FAN_STOP_GPU_TEMP if self.fans_obstructed else FAN_START_GPU_TEMP) or + state.memoryTempC >= (FAN_STOP_MEMORY_TEMP if self.fans_obstructed else FAN_START_MEMORY_TEMP)) + self.fans_obstructed = fan_hot and state.fanSpeedRpm < FAN_STALLED_RPM + + slow_usb = offroad and len(devices) == 1 and devices[0]["speedMbps"] < 5000 + set_alert("Offroad_EgpuNotDetected", self.usb_failed) + set_alert("Offroad_EgpuFansObstructed", self.fans_obstructed) + set_alert("Offroad_EgpuOverheated", self.overheated) + set_alert("Offroad_EgpuUsbSlow", slow_usb, f"{devices[0]['speedMbps']} Mbps" if slow_usb else None) + if self.power_lost: + pcie_action = "12V power was interrupted, possibly by engine start-stop. " + pcie_action += ("Cycle ignition to reload the model." if self.power_restored else + "Check 12V, then cycle ignition to reload the model.") + else: + pcie_action = "Check 12V connection." + set_alert("Offroad_EgpuPcieUnavailable", self.pcie_failed, pcie_action) + set_alert("Offroad_EgpuUncompiled", offroad and firmware_ok and not compiled) + set_alert("Offroad_EgpuUpdateFailed", offroad and firmware_failed) + self.offroad = offroad diff --git a/iqpilot/system/hardware/fan_controller.py b/iqpilot/system/hardware/fan_controller.py new file mode 100755 index 000000000..cc66c83e5 --- /dev/null +++ b/iqpilot/system/hardware/fan_controller.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +import numpy as np + + +class FanController: + def update(self, cur_temp: float, ignition: bool, max_cool: bool = False) -> int: + if max_cool: + return 100 + + fan_pwr_out = int(np.interp(cur_temp, [70.0, 85.0, 90.0], [0, 80, 100])) + + if not ignition: + fan_pwr_out = min(fan_pwr_out, 30) + + return fan_pwr_out diff --git a/iqpilot/system/hardware/hardwared.py b/iqpilot/system/hardware/hardwared.py new file mode 100755 index 000000000..10fe93ed2 --- /dev/null +++ b/iqpilot/system/hardware/hardwared.py @@ -0,0 +1,749 @@ +#!/usr/bin/env python3 +import fcntl +import os +import subprocess +import sys +import queue +import struct +import threading +import time +from collections import OrderedDict, namedtuple + +import psutil + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import car +from iqpilot.cereal import log +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.iq_perf import PerfSample, PerfTraceEmitter +from iqpilot.common.utils import strip_deprecated_keys +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_HW +from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert +from iqpilot.system.hardware import HARDWARE, TICI, AGNOS +from iqpilot.system.hardware.egpu_dock.flash import dock_needs_flash +from iqpilot.system.hardware.egpu_dock.status import EgpuDockStatus +from iqpilot.system.hardware.usb import get_link_error_count, get_usb_state, set_usb_state, usb3_lane +from iqpilot.system.loggerd.config import get_available_percent +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware.power_monitoring import PowerMonitoring, VBATT_LOW_POWER_EXIT +from iqpilot.system.hardware.fan_controller import FanController +from iqpilot.system.version import terms_version, training_version, get_build_metadata + +ThermalStatus = log.DeviceState.ThermalStatus +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength +CURRENT_TAU = 15. # 15s time constant +TEMP_TAU = 5. # 5s time constant +DISCONNECT_TIMEOUT = 5. # wait 5 seconds before going offroad after disconnect so you get an alert +PANDA_STATES_TIMEOUT = round(1000 / SERVICE_LIST['pandaStates'].frequency * 1.5) # 1.5x the expected pandaState frequency +ONROAD_CYCLE_TIME = 1 # seconds to wait offroad after requesting an onroad cycle +CAN_STARTUP_RECOVERY_DELAY = 3. # require a persistent CAN timeout before cycling onroad processes +CAN_STARTUP_RECOVERY_WINDOW = 30. # only recover shortly after ignition turns on +CAN_STARTUP_RECOVERY_COOLDOWN = 5. # allow the restarted car stack time to initialize +CAN_STARTUP_RECOVERY_MAX_ATTEMPTS = 2 + +ThermalBand = namedtuple("ThermalBand", ['min_temp', 'max_temp']) +HardwareState = namedtuple("HardwareState", ['network_type', 'network_info', 'network_strength', 'network_stats', + 'network_metered', 'modem_temps', 'usb_state', 'usb_link_errors', + 'usb3_lane']) + +# List of thermal bands. We will stay within this region as long as we are within the bounds. +# When exiting the bounds, we'll jump to the lower or higher band. Bands are ordered in the dict. +THERMAL_BANDS = OrderedDict({ + ThermalStatus.green: ThermalBand(None, 80.0), + ThermalStatus.yellow: ThermalBand(75.0, 96.0), + ThermalStatus.red: ThermalBand(88.0, 107.), + ThermalStatus.danger: ThermalBand(94.0, None), +}) + +# Override to highest thermal band when offroad and above this temp +OFFROAD_DANGER_TEMP = 75 + +prev_offroad_states: dict[str, tuple[bool, str | None]] = {} +ALLOWED_TICI_BRANCHES = {"release-new", "release-tici", "master-mici", "beta", "beta-pq", "release-prebuilt"} + + +class CanStartupRecovery: + """Bounded recovery for a car stack that starts without a usable CAN stream.""" + + def __init__(self) -> None: + self.ignition_on_ts: float | None = None + self.timeout_started_ts: float | None = None + self.last_attempt_ts: float | None = None + self.attempts = 0 + + def update(self, now: float, ignition: bool, started: bool, engaged: bool, + car_state_alive: bool, can_timeout: bool, v_ego: float) -> bool: + if not ignition: + self.ignition_on_ts = None + self.timeout_started_ts = None + self.last_attempt_ts = None + self.attempts = 0 + return False + + if self.ignition_on_ts is None: + self.ignition_on_ts = now + + eligible = ( + started + and not engaged + and car_state_alive + and can_timeout + and abs(v_ego) < 0.1 + and (now - self.ignition_on_ts) <= CAN_STARTUP_RECOVERY_WINDOW + and self.attempts < CAN_STARTUP_RECOVERY_MAX_ATTEMPTS + and (self.last_attempt_ts is None or (now - self.last_attempt_ts) >= CAN_STARTUP_RECOVERY_COOLDOWN) + ) + if not eligible: + self.timeout_started_ts = None + return False + + if self.timeout_started_ts is None: + self.timeout_started_ts = now + return False + + if (now - self.timeout_started_ts) < CAN_STARTUP_RECOVERY_DELAY: + return False + + self.attempts += 1 + self.last_attempt_ts = now + self.timeout_started_ts = None + return True + + +def get_top_memory_processes(limit: int = 5) -> list[dict[str, object]]: + procs: list[dict[str, object]] = [] + for proc in psutil.process_iter(['pid', 'name', 'memory_info', 'memory_percent']): + try: + info = proc.info + rss = int(getattr(info.get('memory_info'), 'rss', 0)) + procs.append({ + "pid": int(info.get('pid', -1)), + "name": str(info.get('name', 'unknown')), + "rss_mb": round(rss / (1024 * 1024), 1), + "mem_pct": round(float(info.get('memory_percent') or 0.0), 2), + }) + except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess, TypeError, ValueError): + continue + procs.sort(key=lambda p: p["rss_mb"], reverse=True) + return procs[:limit] + +def _is_meb(CP) -> bool: + try: + if CP.brand != "volkswagen": + return False + from iqdbc.car.volkswagen.values import VolkswagenFlags + return bool(CP.flags & VolkswagenFlags.MEB) + except Exception: + cloudlog.exception("MEB detection failed") + return False + + +class _CarParamsCache: + def __init__(self, refresh_s: float = 5.0): + self._refresh_s = refresh_s + self._last_check = 0.0 + self._last_bytes: bytes | None = None + self.no_sleep = False + + def update(self, params: Params) -> None: + now = time.monotonic() + if (now - self._last_check) < self._refresh_s: + return + self._last_check = now + + cp_bytes = params.get("CarParams") + if not cp_bytes or cp_bytes == self._last_bytes: + return + self._last_bytes = cp_bytes + + try: + CP = messaging.log_from_bytes(cp_bytes, car.CarParams) + self.no_sleep = (CP.brand == "tesla") or _is_meb(CP) + except Exception: + self.no_sleep = False + + + +class EgpuDockFlasher: + """Flash the dock's firmware offroad when it does not match what we ship. + + Same policy as stock: the model runtime ignores a dock until its product + string matches, so a mismatched dock is unusable until this runs. Bounded + attempts, offroad only, one flash in flight at a time. + """ + MAX_ATTEMPTS = 3 + RETRY_INTERVAL = 20. + + def __init__(self): + self.thread: threading.Thread | None = None + self.attempts = 0 + self.last_attempt = 0. + self.flashed = False + self.mismatch = False + + @property + def failed(self) -> bool: + return (self.mismatch and self.attempts >= self.MAX_ATTEMPTS + and self.thread is not None and not self.thread.is_alive() and not self.flashed) + + def flash(self) -> None: + ret = subprocess.run(["sudo", sys.executable, + os.path.join(BASEDIR, "iqpilot/system/hardware/egpu_dock/flash.py")], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, check=False) + cloudlog.event("egpu dock flash done", returncode=ret.returncode, output=ret.stdout[-1000:], + error=ret.returncode != 0) + self.flashed = ret.returncode == 0 + + def update(self, offroad: bool, usb_state: list[dict]) -> None: + self.mismatch = dock_needs_flash(usb_state) + if not self.mismatch: + self.flashed = False + return + + if not offroad or self.flashed or self.attempts >= self.MAX_ATTEMPTS: + return + if self.thread is not None and self.thread.is_alive(): + return + if time.monotonic() - self.last_attempt < self.RETRY_INTERVAL: + return + + self.attempts += 1 + self.last_attempt = time.monotonic() + cloudlog.warning(f"egpu dock firmware out of date, flashing (attempt {self.attempts})") + self.thread = threading.Thread(target=self.flash, daemon=True) + self.thread.start() + + +def set_offroad_alert_if_changed(offroad_alert: str, show_alert: bool, extra_text: str | None=None): + if prev_offroad_states.get(offroad_alert, None) == (show_alert, extra_text): + return + prev_offroad_states[offroad_alert] = (show_alert, extra_text) + set_offroad_alert(offroad_alert, show_alert, extra_text) + + +def is_supported_tici_branch(build_metadata) -> bool: + return build_metadata.channel_type == "tici" or build_metadata.channel in ALLOWED_TICI_BRANCHES + +def touch_thread(end_event): + count = 0 + + pm = messaging.PubMaster(["touch"]) + + event_format = "llHHi" + event_size = struct.calcsize(event_format) + event_frame = [] + + with open("/dev/input/by-path/platform-894000.i2c-event", "rb") as event_file: + fcntl.fcntl(event_file, fcntl.F_SETFL, os.O_NONBLOCK) + while not end_event.is_set(): + if (count % int(1. / DT_HW)) == 0: + event = event_file.read(event_size) + if event: + (sec, usec, etype, code, value) = struct.unpack(event_format, event) + if etype != 0 or code != 0 or value != 0: + touch = log.Touch.new_message() + touch.sec = sec + touch.usec = usec + touch.type = etype + touch.code = code + touch.value = value + event_frame.append(touch) + else: # end of frame, push new log + msg = messaging.new_message('touch', len(event_frame), valid=True) + msg.touch = event_frame + pm.send('touch', msg) + event_frame = [] + continue + + count += 1 + time.sleep(DT_HW) + + +def hw_state_thread(end_event, hw_queue): + """Handles non critical hardware state, and sends over queue""" + count = 0 + prev_hw_state = None + + modem_version = None + modem_configured = False + modem_missing_count = 0 + modem_restart_count = 0 + sim_detection_recovered = False + + while not end_event.is_set(): + # these are expensive calls. update every 10s + if (count % int(10. / DT_HW)) == 0: + try: + network_type = HARDWARE.get_network_type() + modem_temps = HARDWARE.get_modem_temperatures() + if len(modem_temps) == 0 and prev_hw_state is not None: + modem_temps = prev_hw_state.modem_temps + + # Log modem version once + if AGNOS and (modem_version is None): + modem_version = HARDWARE.get_modem_version() + + if modem_version is not None: + cloudlog.event("modem version", version=modem_version) + + if AGNOS and modem_restart_count < 3 and HARDWARE.get_modem_version() is None: + # TODO: we may be able to remove this with a MM update + # ModemManager's probing on startup can fail + # rarely, restart the service to probe again. + # Also, AT commands sometimes timeout resulting in ModemManager not + # trying to use this modem anymore. + modem_missing_count += 1 + if (modem_missing_count % 4) == 0: + modem_restart_count += 1 + cloudlog.event("restarting ModemManager") + os.system("sudo systemctl restart --no-block ModemManager") + + tx, rx = HARDWARE.get_modem_data_usage() + + hw_state = HardwareState( + network_type=network_type, + network_info=HARDWARE.get_network_info(), + network_strength=HARDWARE.get_network_strength(network_type), + network_stats={'wwanTx': tx, 'wwanRx': rx}, + network_metered=HARDWARE.get_network_metered(network_type), + modem_temps=modem_temps, + usb_state=get_usb_state(), + usb_link_errors=get_link_error_count(), + usb3_lane=usb3_lane(), + ) + + try: + hw_queue.put_nowait(hw_state) + except queue.Full: + pass + + if not modem_configured and HARDWARE.get_modem_version() is not None: + cloudlog.warning("configuring modem") + HARDWARE.configure_modem() + modem_configured = True + + if modem_configured and not sim_detection_recovered and HARDWARE.recover_sim_detection(): + cloudlog.event("sim missing with hot-swap detect armed, rebooting modem with detect disabled", error=True) + sim_detection_recovered = True + + prev_hw_state = hw_state + except Exception: + cloudlog.exception("Error getting hardware state") + + count += 1 + time.sleep(DT_HW) + + +def hardware_thread(end_event, hw_queue) -> None: + pm = messaging.PubMaster(['deviceState', 'iqPerfTrace']) + sm = messaging.SubMaster(["peripheralState", "gpsLocationExternal", "selfdriveState", "pandaStates", "carState", "egpuDockState"], poll="pandaStates") + perf = PerfTraceEmitter("hardwared", pubmaster=pm) + + count = 0 + + onroad_conditions: dict[str, bool] = { + "ignition": False, + "not_onroad_cycle": True, + "device_temp_good": True, + } + startup_conditions: dict[str, bool] = {} + startup_conditions_prev: dict[str, bool] = {} + + off_ts: float | None = None + started_ts: float | None = None + started_seen = False + startup_blocked_ts: float | None = None + thermal_status = ThermalStatus.yellow + + last_hw_state = HardwareState( + network_type=NetworkType.none, + network_info=None, + network_metered=False, + network_strength=NetworkStrength.unknown, + network_stats={'wwanTx': -1, 'wwanRx': -1}, + modem_temps=[], + usb_state=[], + usb_link_errors=0, + usb3_lane="unknown", + ) + + all_temp_filter = FirstOrderFilter(0., TEMP_TAU, DT_HW, initialized=False) + offroad_temp_filter = FirstOrderFilter(0., TEMP_TAU, DT_HW, initialized=False) + low_memory_logged = False + should_start_prev = False + in_car = False + engaged_prev = False + pwrsave = False + low_power = False + low_power_prev = False + offroad_cycle_count = 0 + can_startup_recovery = CanStartupRecovery() + + params = Params() + power_monitor = PowerMonitoring() + cp_cache = _CarParamsCache() + + uptime_offroad: float = params.get("UptimeOffroad", return_default=True) + uptime_onroad: float = params.get("UptimeOnroad", return_default=True) + last_uptime_ts: float = time.monotonic() + + HARDWARE.initialize_hardware() + thermal_config = HARDWARE.get_thermal_config() + + fan_controller = FanController() + egpu_dock_flasher = EgpuDockFlasher() + egpu_dock_status = EgpuDockStatus() + + while not end_event.is_set(): + sm.update(PANDA_STATES_TIMEOUT) + + pandaStates = sm['pandaStates'] + peripheralState = sm['peripheralState'] + + # handle requests to cycle system started state + if params.get_bool("OnroadCycleRequested"): + params.put_bool("OnroadCycleRequested", False) + offroad_cycle_count = sm.frame + + car_state = sm['carState'] + if can_startup_recovery.update( + time.monotonic(), + ignition=onroad_conditions["ignition"], + started=started_ts is not None, + engaged=sm['selfdriveState'].enabled, + car_state_alive=sm.alive['carState'], + can_timeout=car_state.canTimeout, + v_ego=car_state.vEgo, + ): + offroad_cycle_count = sm.frame + cloudlog.event("automatic CAN startup recovery", attempt=can_startup_recovery.attempts, error=True) + onroad_conditions["not_onroad_cycle"] = (sm.frame - offroad_cycle_count) >= ONROAD_CYCLE_TIME * SERVICE_LIST['pandaStates'].frequency + + if sm.updated['pandaStates'] and len(pandaStates) > 0: + + # Set ignition based on any panda connected + onroad_conditions["ignition"] = any(ps.ignitionLine or ps.ignitionCan for ps in pandaStates if ps.pandaType != log.PandaState.PandaType.unknown) + if params.get_bool("IQBenchIgnition"): + onroad_conditions["ignition"] = True + + pandaState = pandaStates[0] + + in_car = pandaState.harnessStatus != log.PandaState.HarnessStatus.notConnected + + elif (time.monotonic() - sm.recv_time['pandaStates']) > DISCONNECT_TIMEOUT: + if onroad_conditions["ignition"]: + onroad_conditions["ignition"] = False + cloudlog.error("panda timed out onroad") + + # Run at 2Hz, plus either edge of ignition + ign_edge = (started_ts is not None) != all(onroad_conditions.values()) + if (sm.frame % round(SERVICE_LIST['pandaStates'].frequency * DT_HW) != 0) and not ign_edge: + continue + + msg = messaging.new_message('deviceState', valid=True) + msg.deviceState = thermal_config.get_msg() + msg.deviceState.deviceType = HARDWARE.get_device_type() + + try: + last_hw_state = hw_queue.get_nowait() + except queue.Empty: + pass + + msg.deviceState.freeSpacePercent = get_available_percent(default=100.0) + try: + msg.deviceState.memoryUsagePercent = int(round(psutil.virtual_memory().percent)) + except Exception: + msg.deviceState.memoryUsagePercent = 0 + # get_top_memory_processes() costs ~500ms: must never run in the 2Hz publish loop + if msg.deviceState.memoryUsagePercent > 95: + if not low_memory_logged: + cloudlog.event("low_memory_snapshot", memory_usage_percent=msg.deviceState.memoryUsagePercent, + top_processes=get_top_memory_processes(), error=True) + low_memory_logged = True + else: + low_memory_logged = False + msg.deviceState.gpuUsagePercent = int(round(HARDWARE.get_gpu_usage_percent())) + online_cpu_usage = [int(round(n)) for n in psutil.cpu_percent(percpu=True)] + offline_cpu_usage = [0., ] * (len(msg.deviceState.cpuTempC) - len(online_cpu_usage)) + msg.deviceState.cpuUsagePercent = online_cpu_usage + offline_cpu_usage + if msg.deviceState.memoryUsagePercent > 85: + avg_cpu_usage = int(round(sum(online_cpu_usage) / max(1, len(online_cpu_usage)))) + perf.emit( + "hardware_low_memory", + severity="error" if msg.deviceState.memoryUsagePercent > 95 else "warning", + frame_id=sm.frame, + samples=[PerfSample( + frame_id=sm.frame, + memory_usage_percent=int(msg.deviceState.memoryUsagePercent), + gpu_usage_percent=int(msg.deviceState.gpuUsagePercent), + cpu_usage_percent=avg_cpu_usage, + )], + detail=f"memory_usage_percent={msg.deviceState.memoryUsagePercent} gpu_usage_percent={msg.deviceState.gpuUsagePercent}", + min_interval_s=5.0, + ) + + msg.deviceState.networkType = last_hw_state.network_type + msg.deviceState.networkMetered = last_hw_state.network_metered + msg.deviceState.networkStrength = last_hw_state.network_strength + msg.deviceState.networkStats = last_hw_state.network_stats + if last_hw_state.network_info is not None: + msg.deviceState.networkInfo = last_hw_state.network_info + + msg.deviceState.modemTempC = last_hw_state.modem_temps + set_usb_state(msg.deviceState, last_hw_state.usb_state, last_hw_state.usb_link_errors, + last_hw_state.usb3_lane) + egpu_dock_flasher.update(started_ts is None, last_hw_state.usb_state) + egpu_valid = sm.alive["egpuDockState"] and sm.valid["egpuDockState"] + egpu_dock_status.update(started_ts is None, last_hw_state.usb_state, egpu_dock_flasher.failed, + params.get_bool("UsbGpuLoading"), params.get("UsbGpuActive"), + params.get_bool("UsbGpuReady"), + sm["egpuDockState"] if egpu_valid else None, set_offroad_alert_if_changed) + + msg.deviceState.screenBrightnessPercent = HARDWARE.get_screen_brightness() + + # this subset is only used for offroad + temp_sources = [ + msg.deviceState.memoryTempC, + max(msg.deviceState.cpuTempC, default=0.), + max(msg.deviceState.gpuTempC, default=0.), + ] + offroad_comp_temp = offroad_temp_filter.update(max(temp_sources)) + + # this drives the thermal status while onroad + temp_sources.append(max(msg.deviceState.pmicTempC, default=0.)) + all_comp_temp = all_temp_filter.update(max(temp_sources)) + msg.deviceState.maxTempC = all_comp_temp + + is_offroad_for_5_min = (started_ts is None) and ((not started_seen) or (off_ts is None) or (time.monotonic() - off_ts > 60 * 5)) + if is_offroad_for_5_min and offroad_comp_temp > OFFROAD_DANGER_TEMP: + # if device is offroad and already hot without the extra onroad load, + # we want to cool down first before increasing load + thermal_status = ThermalStatus.danger + else: + current_band = THERMAL_BANDS[thermal_status] + band_idx = list(THERMAL_BANDS.keys()).index(thermal_status) + if current_band.min_temp is not None and all_comp_temp < current_band.min_temp: + thermal_status = list(THERMAL_BANDS.keys())[band_idx - 1] + elif current_band.max_temp is not None and all_comp_temp > current_band.max_temp: + thermal_status = list(THERMAL_BANDS.keys())[band_idx + 1] + + # the car is running but temperature is blocking the start, so cool as fast as we can + max_cool = (started_ts is None) and onroad_conditions["ignition"] and thermal_status >= ThermalStatus.red + msg.deviceState.fanSpeedPercentDesired = fan_controller.update(all_comp_temp, onroad_conditions["ignition"], max_cool) + + # **** starting logic **** + + startup_conditions["up_to_date"] = True + startup_conditions["no_excessive_actuation"] = params.get("Offroad_ExcessiveActuation") is None + startup_conditions["not_uninstalling"] = not params.get_bool("DoUninstall") + startup_conditions["accepted_terms"] = params.get("HasAcceptedTerms") == terms_version + + # with 2% left, we killall, otherwise the phone will take a long time to boot + startup_conditions["free_space"] = msg.deviceState.freeSpacePercent > 2 + startup_conditions["completed_training"] = HARDWARE.get_device_type() != "mici" or params.get("CompletedTrainingVersion") == training_version + startup_conditions["not_driver_view"] = not params.get_bool("IsDriverViewEnabled") + startup_conditions["not_taking_snapshot"] = not params.get_bool("IsTakingSnapshot") + + # must be at an engageable thermal band to go onroad + startup_conditions["device_temp_engageable"] = thermal_status < ThermalStatus.red + + # ensure device is fully booted + startup_conditions["device_booted"] = startup_conditions.get("device_booted", False) or HARDWARE.booted() + + # user-forced status (Always Offroad can be temporarily overridden) + offroad_mode = params.get_bool("IQAlwaysOffroad") + force_onroad_until = params.get("ForceOnroadUntil", return_default=True) + now = int(time.time()) + force_onroad_active = offroad_mode and force_onroad_until > now + if force_onroad_until > 0 and (not offroad_mode or force_onroad_until <= now): + params.put("ForceOnroadUntil", 0) + + startup_conditions["not_always_offroad"] = (not offroad_mode) or force_onroad_active + onroad_conditions["not_always_offroad"] = (not offroad_mode) or force_onroad_active + + # if an unsupported device and branch is detected, going onroad is blocked + # only allow going onroad when: + # - TIZI, or + # - TICI and channel_type is "tici" + build_metadata = get_build_metadata() + is_unsupported_combo = TICI and HARDWARE.get_device_type() == "tici" and not is_supported_tici_branch(build_metadata) + startup_conditions["not_tici"] = not is_unsupported_combo + onroad_conditions["not_tici"] = not is_unsupported_combo + set_offroad_alert("Offroad_TiciSupport", is_unsupported_combo, extra_text=build_metadata.channel) + + # if the temperature enters the danger zone, go offroad to cool down + onroad_conditions["device_temp_good"] = thermal_status < ThermalStatus.danger + extra_text = f"{offroad_comp_temp:.1f}C" + show_alert = (not onroad_conditions["device_temp_good"] or not startup_conditions["device_temp_engageable"]) and onroad_conditions["ignition"] + set_offroad_alert_if_changed("Offroad_TemperatureTooHigh", show_alert, extra_text=extra_text) + + # Handle offroad/onroad transition + should_start = all(onroad_conditions.values()) + if started_ts is None: + should_start = should_start and all(startup_conditions.values()) + + if should_start != should_start_prev or (count == 0): + params.put_bool("IsEngaged", False) + engaged_prev = False + + if sm.updated['selfdriveState']: + engaged = sm['selfdriveState'].enabled + if engaged != engaged_prev: + params.put_bool("IsEngaged", engaged) + engaged_prev = engaged + + try: + with open('/dev/kmsg', 'w') as kmsg: + kmsg.write(f"<3>[hardware] engaged: {engaged}\n") + except Exception: + pass + + cp_cache.update(params) + no_sleep = cp_cache.no_sleep + + should_pwrsave = (not no_sleep) and (not onroad_conditions["ignition"] and msg.deviceState.screenBrightnessPercent < 1e-3) + if should_pwrsave != pwrsave or (count == 0): + HARDWARE.set_power_save(should_pwrsave) + pwrsave = should_pwrsave + + if should_start: + off_ts = None + if started_ts is None: + started_ts = time.monotonic() + started_seen = True + if startup_blocked_ts is not None: + cloudlog.event("Startup after block", block_duration=(time.monotonic() - startup_blocked_ts), + startup_conditions=startup_conditions, onroad_conditions=onroad_conditions, + startup_conditions_prev=startup_conditions_prev, error=True) + startup_blocked_ts = None + else: + if onroad_conditions["ignition"] and (startup_conditions != startup_conditions_prev): + cloudlog.event("Startup blocked", startup_conditions=startup_conditions, onroad_conditions=onroad_conditions, error=True) + startup_conditions_prev = startup_conditions.copy() + startup_blocked_ts = time.monotonic() + + started_ts = None + if off_ts is None: + off_ts = time.monotonic() + + # Offroad power monitoring + voltage = None if peripheralState.pandaType == log.PandaState.PandaType.unknown else peripheralState.voltage + + power_monitor.calculate(voltage, onroad_conditions["ignition"]) + msg.deviceState.offroadPowerUsageUwh = power_monitor.get_power_used() + msg.deviceState.carBatteryCapacityUwh = max(0, power_monitor.get_car_battery_capacity()) + current_power_draw = HARDWARE.get_current_power_draw() + msg.deviceState.powerDrawW = current_power_draw + + som_power_draw = HARDWARE.get_som_power_draw() + msg.deviceState.somPowerDrawW = som_power_draw + + # FastSleep deep standby: shed heavy processes once parked with the screen idled off + # (or at low battery) instead of shutting down, recover on ignition or once the + # alternator is charging + fast_sleep = params.get_bool("FastSleep") + if fast_sleep and not no_sleep: + if low_power: + if onroad_conditions["ignition"] or power_monitor.car_voltage_mV >= (VBATT_LOW_POWER_EXIT * 1e3): + low_power = False + else: + screen_off = msg.deviceState.screenBrightnessPercent < 1e-3 + low_power = power_monitor.should_enter_low_power(onroad_conditions["ignition"], in_car, off_ts, screen_off) + else: + low_power = False + + # Blank the panel only in deep standby, where not_low_power has shed the UI (so nothing + # relights it and there is no touch grab to fight). The parked idle screen-off and + # tap-to-wake live in the UI, which owns the touchscreen grab and brightness. + if low_power != low_power_prev: + params.put("DevicePowerState", "low_power" if low_power else "normal") + cloudlog.event("hardwared.device_power_state", low_power=low_power, voltage_mV=power_monitor.car_voltage_mV, error=False) + if low_power: + HARDWARE.set_screen_brightness(0) + low_power_prev = low_power + + # Check if we need to shut down + if (not no_sleep) and power_monitor.should_shutdown(onroad_conditions["ignition"], in_car, off_ts, started_seen): + cloudlog.warning(f"shutting device down, offroad since {off_ts}") + params.put_bool("DoShutdown", True) + + msg.deviceState.started = started_ts is not None and not offroad_mode + msg.deviceState.startedMonoTime = int(1e9*(started_ts or 0)) + + last_ping = params.get("LastAthenaPingTime") + if last_ping is not None: + msg.deviceState.lastAthenaPingTime = last_ping + + msg.deviceState.thermalStatus = thermal_status + pm.send("deviceState", msg) + + + # report to server once every 10 minutes + rising_edge_started = should_start and not should_start_prev + if rising_edge_started or (count % int(600. / DT_HW)) == 0: + dat = { + 'count': count, + 'pandaStates': [strip_deprecated_keys(p.to_dict()) for p in pandaStates], + 'peripheralState': strip_deprecated_keys(peripheralState.to_dict()), + 'location': (strip_deprecated_keys(sm["gpsLocationExternal"].to_dict()) if sm.alive["gpsLocationExternal"] else None), + 'deviceState': strip_deprecated_keys(msg.to_dict()) + } + cloudlog.event("STATUS_PACKET", **dat) + + # save last one before going onroad + if rising_edge_started: + try: + params.put("LastOffroadStatusPacket", dat) + except Exception: + cloudlog.exception("failed to save offroad status") + + params.put_bool_nonblocking("NetworkMetered", msg.deviceState.networkMetered) + + now_ts = time.monotonic() + if off_ts: + uptime_offroad += now_ts - max(last_uptime_ts, off_ts) + elif started_ts: + uptime_onroad += now_ts - max(last_uptime_ts, started_ts) + last_uptime_ts = now_ts + + if (count % int(60. / DT_HW)) == 0: + params.put("UptimeOffroad", uptime_offroad) + params.put("UptimeOnroad", uptime_onroad) + + count += 1 + should_start_prev = should_start + + +def main(): + hw_queue = queue.Queue(maxsize=1) + end_event = threading.Event() + + threads = [ + threading.Thread(target=hw_state_thread, args=(end_event, hw_queue)), + threading.Thread(target=hardware_thread, args=(end_event, hw_queue)), + ] + + if TICI: + threads.append(threading.Thread(target=touch_thread, args=(end_event,))) + + for t in threads: + t.start() + + try: + while True: + time.sleep(1) + if not all(t.is_alive() for t in threads): + break + finally: + end_event.set() + + for t in threads: + t.join() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/hardware/hw.py b/iqpilot/system/hardware/hw.py new file mode 100644 index 000000000..7263ddbfc --- /dev/null +++ b/iqpilot/system/hardware/hw.py @@ -0,0 +1,137 @@ +import os +import platform +from pathlib import Path + +from iqpilot.system.hardware import PC + +DEFAULT_DOWNLOAD_CACHE_ROOT = "/tmp/comma_download_cache" + +class Paths: + _persist_root_cache: str | None = None + + @staticmethod + def _is_writable_persist_root(path: str) -> bool: + try: + os.makedirs(path, exist_ok=True) + comma_dir = os.path.join(path, "comma") + os.makedirs(comma_dir, exist_ok=True) + + probe_path = os.path.join(comma_dir, ".rw_probe") + with open(probe_path, "w") as f: + f.write("1") + os.remove(probe_path) + return True + except OSError: + return False + + @staticmethod + def comma_home() -> str: + return os.path.join(str(Path.home()), ".comma" + os.environ.get("OPENPILOT_PREFIX", "")) + + @staticmethod + def params() -> str: + if os.environ.get("PARAMS_ROOT"): + return os.environ["PARAMS_ROOT"] + return os.path.join(Paths.comma_home(), "params") if PC else "/data/params" + + @staticmethod + def log_root() -> str: + if os.environ.get('LOG_ROOT', False): + return os.environ['LOG_ROOT'] + elif PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "realdata") + else: + return '/data/media/0/realdata/' + + @staticmethod + def log_root_external() -> str: + return '/mnt/external_realdata/' + + @staticmethod + def swaglog_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "log") + else: + return "/data/log/" + + @staticmethod + def swaglog_ipc() -> str: + return "ipc:///tmp/logmessage" + os.environ.get("OPENPILOT_PREFIX", "") + + @staticmethod + def download_cache_root() -> str: + if os.environ.get('COMMA_CACHE', False): + return os.environ['COMMA_CACHE'] + "/" + return DEFAULT_DOWNLOAD_CACHE_ROOT + os.environ.get("OPENPILOT_PREFIX", "") + "/" + + @staticmethod + def persist_root() -> str: + if PC: + return os.path.join(Paths.comma_home(), "persist") + + if Paths._persist_root_cache is not None: + return Paths._persist_root_cache + + for candidate in ("/persist", "/data/persist"): + if Paths._is_writable_persist_root(candidate): + Paths._persist_root_cache = candidate + return candidate + + # Keep previous behavior as a last resort. + Paths._persist_root_cache = "/persist" + return Paths._persist_root_cache + + @staticmethod + def stats_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats/" + + @staticmethod + def stats_iq_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "stats") + else: + return "/data/stats_iq/" + + @staticmethod + def config_root() -> str: + if PC: + return Paths.comma_home() + else: + return "/tmp/.comma" + + @staticmethod + def shm_path() -> str: + if PC and platform.system() == "Darwin": + return "/tmp" # This is not really shared memory on macOS, but it's the closest we can get + return "/dev/shm" + + @staticmethod + def model_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "models") + else: + return "/data/media/0/models" + + @staticmethod + def crash_log_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "community" / "crashes") + else: + return "/data/community/crashes" + + @staticmethod + def mapd_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "osm") + else: + return "/data/media/0/osm" + + @staticmethod + def screen_recordings_root() -> str: + if PC: + return str(Path(Paths.comma_home()) / "media" / "0" / "screen_recordings") + else: + return "/data/media/0/screen_recordings" diff --git a/iqpilot/system/hardware/pc/__init__.py b/iqpilot/system/hardware/pc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/hardware/pc/hardware.py b/iqpilot/system/hardware/pc/hardware.py new file mode 100644 index 000000000..72ef2f235 --- /dev/null +++ b/iqpilot/system/hardware/pc/hardware.py @@ -0,0 +1,12 @@ +from iqpilot.cereal import log +from iqpilot.system.hardware.base import HardwareBase + +NetworkType = log.DeviceState.NetworkType + + +class Pc(HardwareBase): + def get_device_type(self): + return "pc" + + def get_network_type(self): + return NetworkType.wifi diff --git a/iqpilot/system/hardware/power_monitoring.py b/iqpilot/system/hardware/power_monitoring.py new file mode 100644 index 000000000..591c49ab9 --- /dev/null +++ b/iqpilot/system/hardware/power_monitoring.py @@ -0,0 +1,165 @@ +import time +import threading + +from iqpilot.common.params import Params +from iqpilot.system.hardware import HARDWARE +from iqpilot.common.swaglog import cloudlog + +CAR_VOLTAGE_LOW_PASS_K = 0.011 # LPF gain for 45s tau (dt/tau / (dt/tau + 1)) + +# While driving, a battery charges completely in about 30-60 minutes +CAR_BATTERY_CAPACITY_uWh = 30e6 +CAR_CHARGING_RATE_W = 45 + +VBATT_PAUSE_CHARGING = 11.8 # Lower limit on the LPF car battery voltage + +# FastSleep (deep standby): enter low power once parked with the screen idled off, or +# immediately at the normal shutdown voltage; shut down at a lower floor, exit once the +# alternator is charging +VBATT_LOW_POWER_ENTRY = 11.8 +VBATT_LOW_POWER_EXIT = 12.8 +VBATT_HARD_SHUTDOWN = 11.5 +LOW_POWER_ENTRY_TIME_S = 300 +MAX_TIME_OFFROAD_S = 30*3600 +MIN_ON_TIME_S = 3600 +DELAY_SHUTDOWN_TIME_S = 300 # Wait at least DELAY_SHUTDOWN_TIME_S seconds after offroad_time to shutdown. +VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S = 60 + +class PowerMonitoring: + def __init__(self): + self.params = Params() + self.last_measurement_time = None # Used for integration delta + self.last_save_time = 0 # Used for saving current value in a param + self.power_used_uWh = 0 # Integrated power usage in uWh since going into offroad + self.next_pulsed_measurement_time = None + self.car_voltage_mV = 12e3 # Low-passed version of peripheralState voltage + self.car_voltage_instant_mV = 12e3 # Last value of peripheralState voltage + self.integration_lock = threading.Lock() + + car_battery_capacity_uWh = self.params.get("CarBatteryCapacity") or 0 + + # Reset capacity if it's low + self.car_battery_capacity_uWh = max((CAR_BATTERY_CAPACITY_uWh / 10), car_battery_capacity_uWh) + + # Calculation tick + def calculate(self, voltage: int | None, ignition: bool): + try: + now = time.monotonic() + + # If peripheralState is None, we're probably not in a car, so we don't care + if voltage is None: + with self.integration_lock: + self.last_measurement_time = None + self.next_pulsed_measurement_time = None + self.power_used_uWh = 0 + return + + # Low-pass battery voltage + self.car_voltage_instant_mV = voltage + self.car_voltage_mV = ((voltage * CAR_VOLTAGE_LOW_PASS_K) + (self.car_voltage_mV * (1 - CAR_VOLTAGE_LOW_PASS_K))) + + # Cap the car battery power and save it in a param every 10-ish seconds + self.car_battery_capacity_uWh = max(self.car_battery_capacity_uWh, 0) + self.car_battery_capacity_uWh = min(self.car_battery_capacity_uWh, CAR_BATTERY_CAPACITY_uWh) + if now - self.last_save_time >= 10: + self.params.put_nonblocking("CarBatteryCapacity", int(self.car_battery_capacity_uWh)) + self.last_save_time = now + + # First measurement, set integration time + with self.integration_lock: + if self.last_measurement_time is None: + self.last_measurement_time = now + return + + if ignition: + # If there is ignition, we integrate the charging rate of the car + with self.integration_lock: + self.power_used_uWh = 0 + integration_time_h = (now - self.last_measurement_time) / 3600 + if integration_time_h < 0: + raise ValueError(f"Negative integration time: {integration_time_h}h") + self.car_battery_capacity_uWh += (CAR_CHARGING_RATE_W * 1e6 * integration_time_h) + self.last_measurement_time = now + else: + # Get current power draw somehow + current_power = HARDWARE.get_current_power_draw() + + # Do the integration + self._perform_integration(now, current_power) + except Exception: + cloudlog.exception("Power monitoring calculation failed") + + def _perform_integration(self, t: float, current_power: float) -> None: + with self.integration_lock: + try: + if self.last_measurement_time: + integration_time_h = (t - self.last_measurement_time) / 3600 + power_used = (current_power * 1000000) * integration_time_h + if power_used < 0: + raise ValueError(f"Negative power used! Integration time: {integration_time_h} h Current Power: {power_used} uWh") + self.power_used_uWh += power_used + self.car_battery_capacity_uWh -= power_used + self.last_measurement_time = t + except Exception: + cloudlog.exception("Integration failed") + + # Get the power usage + def get_power_used(self) -> int: + return int(self.power_used_uWh) + + def get_car_battery_capacity(self) -> int: + return int(self.car_battery_capacity_uWh) + + # Max Time Offroad + def max_time_offroad_exceeded(self, offroad_time): + """ + Check if the max time offroad has been exceeded. If the value is 0, it means no limit. + :param offroad_time: Time spent offroad in seconds + :return: True if the max time offroad has been exceeded, False otherwise + """ + try: + param = self.params.get("MaxTimeOffroad") + iq_max_time_val_s = param * 60 if param is not None and param >= 0 else MAX_TIME_OFFROAD_S + except Exception: + iq_max_time_val_s = MAX_TIME_OFFROAD_S + + return 0 < iq_max_time_val_s <= offroad_time + + # FastSleep: see if we should enter low power mode instead of shutting down + def should_enter_low_power(self, ignition: bool, in_car: bool, offroad_timestamp: float | None, screen_off: bool) -> bool: + if offroad_timestamp is None or ignition or not in_car: + return False + if not self.params.get_bool("FastSleep"): + return False + offroad_time = time.monotonic() - offroad_timestamp + # a healthy battery rests above VBATT_LOW_POWER_ENTRY, so parked entry must be + # time-based; the voltage trigger stays as the sagging-battery fast path + low_voltage = (self.car_voltage_mV < (VBATT_LOW_POWER_ENTRY * 1e3) and + offroad_time > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S) + parked_idle = screen_off and offroad_time > LOW_POWER_ENTRY_TIME_S + return low_voltage or parked_idle + + # See if we need to shutdown + def should_shutdown(self, ignition: bool, in_car: bool, offroad_timestamp: float | None, started_seen: bool): + if offroad_timestamp is None: + return False + + now = time.monotonic() + should_shutdown = False + offroad_time = (now - offroad_timestamp) + fast_sleep = self.params.get_bool("FastSleep") + vbatt_min = VBATT_HARD_SHUTDOWN if fast_sleep else VBATT_PAUSE_CHARGING + low_voltage_shutdown = (self.car_voltage_mV < (vbatt_min * 1e3) and + offroad_time > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S) + should_shutdown |= self.max_time_offroad_exceeded(offroad_time) + should_shutdown |= low_voltage_shutdown + # the 30 Wh bookkeeping model empties within hours at offroad draw regardless of the + # real battery state; under FastSleep the measured voltage floors govern instead + should_shutdown |= (self.car_battery_capacity_uWh <= 0) and not fast_sleep + should_shutdown &= not ignition + should_shutdown &= (not self.params.get_bool("DisablePowerDown")) + should_shutdown &= in_car + should_shutdown &= offroad_time > DELAY_SHUTDOWN_TIME_S + should_shutdown |= self.params.get_bool("ForcePowerDown") + should_shutdown &= started_seen or (now > MIN_ON_TIME_S) + return should_shutdown diff --git a/iqpilot/system/hardware/tests/__init__.py b/iqpilot/system/hardware/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/hardware/tests/test_egpu_dock_flash.py b/iqpilot/system/hardware/tests/test_egpu_dock_flash.py new file mode 100644 index 000000000..694fdd8b4 --- /dev/null +++ b/iqpilot/system/hardware/tests/test_egpu_dock_flash.py @@ -0,0 +1,132 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +The eGPU dock flasher writes SPI flash, so the parts that decide WHETHER and +WHAT to write are pinned here. The transfer path itself needs the hardware; the +image validator, product parsing, config preservation and the needs-flash +decision do not, and those are what stop a bad write. +""" +import os +import zlib + +import pytest + +from iqpilot.system.hardware.egpu_dock import flash as f + + +def _wrap(body: bytes, *, magic=0xA5, checksum=None, crc=None, body_len=None) -> bytes: + n = len(body) if body_len is None else body_len + cs = (sum(body) & 0xFF) if checksum is None else checksum + c = zlib.crc32(body).to_bytes(4, "little") if crc is None else crc + return n.to_bytes(4, "little") + body + bytes([magic, cs]) + c + + +def test_bundled_firmware_is_valid_and_named(): + image = f.FIRMWARE_PATH.read_bytes() + f.validate_image(image) # raises if the shipped blob is corrupt + assert f.image_product(image).startswith("custom ") + assert f.image_product(image).endswith("-CLEAN") + assert f.bundled_version() == f.image_product(image) + + +def test_validate_rejects_corruption(): + body = b"custom deadbeef-CLEAN" + bytes(64) + f.validate_image(_wrap(body)) # the good case + with pytest.raises(ValueError): + f.validate_image(b"\x00" * 4) # too short + with pytest.raises(ValueError): + f.validate_image(_wrap(body, magic=0x00)) # bad magic + with pytest.raises(ValueError): + f.validate_image(_wrap(body, checksum=0x00)) + with pytest.raises(ValueError): + f.validate_image(_wrap(body, crc=b"\x00\x00\x00\x00")) + with pytest.raises(ValueError): + f.validate_image(_wrap(body, body_len=len(body) + 1)) # length disagrees + with pytest.raises(ValueError): + f.validate_image((f.MAX_CODE_SIZE + 1).to_bytes(4, "little") + bytes(16)) + + +def test_image_product_requires_a_version_string(): + with pytest.raises(ValueError): + f.image_product(b"no version here") + + +def test_saved_config_preserves_the_first_backup(tmp_path): + # the config page is per-unit; a reflash must rewrite the ORIGINAL, never the + # bytes read back from a half-written dock + p = str(tmp_path / "dock.bin") + original = bytes(range(256)) + assert f.saved_config(p, original) == original + # later flash reads something different -> the stored original wins + assert f.saved_config(p, bytes(256)) == original + with open(p, "rb") as fh: + assert fh.read() == original + + +def test_saved_config_rejects_wrong_size_backup(tmp_path): + p = str(tmp_path / "dock.bin") + with open(p, "wb") as fh: + fh.write(b"\x00" * 8) + with pytest.raises(RuntimeError): + f.saved_config(p, bytes(256)) + + +def test_needs_flash_only_for_a_dock_on_wrong_firmware(): + expected = f.bundled_version() + vid, pid = (int(x, 16) for x in f.VID_PIDS[0]) + rom_vid, rom_pid = (int(x, 16) for x in f.ROM_VID_PIDS[0]) + + assert not f.dock_needs_flash([]) + assert not f.dock_needs_flash([{"vendorId": 0x1234, "productId": 0x5678, "product": "something else"}]) + assert not f.dock_needs_flash([{"vendorId": vid, "productId": pid, "product": expected}]) + assert f.dock_needs_flash([{"vendorId": vid, "productId": pid, "product": "custom 00000000-CLEAN"}]) + # a ROM-mode board always needs flashing + assert f.dock_needs_flash([{"vendorId": rom_vid, "productId": rom_pid, "product": f.ROM_PRODUCT}]) + + +def test_both_shipped_ids_trigger_the_check(): + for pair in f.VID_PIDS: + vid, pid = (int(x, 16) for x in pair) + assert f.dock_needs_flash([{"vendorId": vid, "productId": pid, "product": "custom 00000000-CLEAN"}]) + + +def test_rom_detection(): + assert f.in_rom_bootloader(f.ROM_VID_PIDS[0], "anything") + assert f.in_rom_bootloader(("add1", "0001"), f.ROM_PRODUCT) + assert f.in_rom_bootloader(("add1", "0001"), "AS2462something") + assert not f.in_rom_bootloader(("add1", "0001"), f.bundled_version()) + assert not f.in_rom_bootloader(("add1", "0001"), None) + + +def test_config_paths_are_per_host_and_have_a_legacy_fallback(): + host = os.uname().nodename + assert f.config_path().endswith(f"{host}.bin") + assert f.config_path().startswith(f.CONFIG_DIR) + # a dock flashed on this device by stock openpilot left its backup elsewhere + assert f.legacy_config_path().startswith(f.LEGACY_CONFIG_DIR) + assert f.legacy_config_path() != f.config_path() + + +def test_we_do_not_autoflash(): + # upstream flashes from hardwared automatically; ours must stay deliberate + # until it has been validated against a real dock + import subprocess + root = os.path.join(os.path.dirname(f.__file__), "..", "..", "..") + hits = subprocess.run(["grep", "-rnI", "--exclude-dir=__pycache__", "flash_dock", os.path.join(root, "system"), + os.path.join(root, "iqpilot")], capture_output=True, text=True).stdout + callers = [ln for ln in hits.splitlines() if "egpu_dock/flash.py" not in ln and "test_" not in ln] + assert callers == [], f"unexpected automatic flash caller: {callers}" + + +def test_runtime_fw_gate_is_pinned_to_the_bundled_firmware(): + from iqpilot.system.hardware.usb import EGPU_DOCK_FW_PRODUCT + assert EGPU_DOCK_FW_PRODUCT == f.bundled_version() + + +def test_register_reads_default_to_superspeed_size(): + assert f.MAX_REGISTER_READ_SIZE == 255 + assert f.Flash().max_register_read_size == f.MAX_REGISTER_READ_SIZE + + +def test_link_up_is_false_without_a_dock(): + assert f.link_up() is False diff --git a/iqpilot/system/hardware/tests/test_fan_controller.py b/iqpilot/system/hardware/tests/test_fan_controller.py new file mode 100644 index 000000000..3284f5625 --- /dev/null +++ b/iqpilot/system/hardware/tests/test_fan_controller.py @@ -0,0 +1,41 @@ +import numpy as np + +from iqpilot.system.hardware.fan_controller import FanController + + +class TestFanController: + def test_ramp_anchors(self): + c = FanController() + assert c.update(60, True) == 0 + assert c.update(70, True) == 0 + assert c.update(85, True) == 80 + assert c.update(90, True) == 100 + assert c.update(100, True) == 100 + + def test_ramp_is_monotonic_and_continuous(self): + c = FanController() + temps = np.arange(50.0, 105.0, 0.25) + outs = [c.update(t, True) for t in temps] + assert all(b >= a for a, b in zip(outs, outs[1:])) + # no step may exceed the steepest segment's slope (4 %/deg) over a 0.25 deg move + assert max(b - a for a, b in zip(outs, outs[1:])) <= 2 + + def test_hot_onroad(self): + assert FanController().update(100, True) >= 70 + + def test_offroad_capped(self): + c = FanController() + for t in (60, 75, 85, 100): + assert c.update(t, False) <= 30 + + def test_no_fan_wear(self): + assert FanController().update(10, False) == 0 + + def test_max_cool(self): + c = FanController() + assert c.update(80, True, True) == 100 + assert c.update(80, False, True) == 100 + + def test_target_band_has_airflow(self): + # the design centers on 75 C; the curve must actually move air there + assert 20 <= FanController().update(75, True) <= 40 diff --git a/iqpilot/system/hardware/tests/test_hardwared.py b/iqpilot/system/hardware/tests/test_hardwared.py new file mode 100644 index 000000000..5b1a00a68 --- /dev/null +++ b/iqpilot/system/hardware/tests/test_hardwared.py @@ -0,0 +1,75 @@ +from types import SimpleNamespace + +from iqpilot.system.hardware.hardwared import ( + ALLOWED_TICI_BRANCHES, + CAN_STARTUP_RECOVERY_COOLDOWN, + CAN_STARTUP_RECOVERY_DELAY, + CAN_STARTUP_RECOVERY_MAX_ATTEMPTS, + CanStartupRecovery, + is_supported_tici_branch, +) + + +def test_beta_pq_allowed_for_tici(): + metadata = SimpleNamespace(channel="beta-pq", channel_type="dev") + assert "beta-pq" in ALLOWED_TICI_BRANCHES + assert is_supported_tici_branch(metadata) + + +def test_tici_channel_type_allowed(): + metadata = SimpleNamespace(channel="random-branch", channel_type="tici") + assert is_supported_tici_branch(metadata) + + +def test_unsupported_branch_rejected_for_tici(): + metadata = SimpleNamespace(channel="random-branch", channel_type="dev") + assert not is_supported_tici_branch(metadata) + + +def recovery_update(recovery: CanStartupRecovery, now: float, **kwargs) -> bool: + defaults = { + "ignition": True, + "started": True, + "engaged": False, + "car_state_alive": True, + "can_timeout": True, + "v_ego": 0., + } + return recovery.update(now, **(defaults | kwargs)) + + +def test_can_startup_recovery_requires_persistent_timeout(): + recovery = CanStartupRecovery() + assert not recovery_update(recovery, 10.) + assert not recovery_update(recovery, 10. + CAN_STARTUP_RECOVERY_DELAY - 0.1) + assert recovery_update(recovery, 10. + CAN_STARTUP_RECOVERY_DELAY) + + +def test_can_startup_recovery_only_when_safe(): + for unsafe_state in ( + {"started": False}, + {"engaged": True}, + {"car_state_alive": False}, + {"can_timeout": False}, + {"v_ego": 0.2}, + ): + recovery = CanStartupRecovery() + assert not recovery_update(recovery, 10., **unsafe_state) + assert not recovery_update(recovery, 10. + CAN_STARTUP_RECOVERY_DELAY, **unsafe_state) + + +def test_can_startup_recovery_is_bounded_and_resets_next_ignition(): + recovery = CanStartupRecovery() + now = 10. + for _ in range(CAN_STARTUP_RECOVERY_MAX_ATTEMPTS): + assert not recovery_update(recovery, now) + now += CAN_STARTUP_RECOVERY_DELAY + assert recovery_update(recovery, now) + now += CAN_STARTUP_RECOVERY_COOLDOWN + + assert not recovery_update(recovery, now) + assert not recovery_update(recovery, now + CAN_STARTUP_RECOVERY_DELAY) + + assert not recovery_update(recovery, now + 10., ignition=False) + assert not recovery_update(recovery, now + 11.) + assert recovery_update(recovery, now + 11. + CAN_STARTUP_RECOVERY_DELAY) diff --git a/iqpilot/system/hardware/tests/test_power_monitoring.py b/iqpilot/system/hardware/tests/test_power_monitoring.py new file mode 100644 index 000000000..7cabc3aa4 --- /dev/null +++ b/iqpilot/system/hardware/tests/test_power_monitoring.py @@ -0,0 +1,323 @@ +import pytest + +from iqpilot.common.params import Params +from iqpilot.system.hardware.power_monitoring import PowerMonitoring, CAR_BATTERY_CAPACITY_uWh, \ + CAR_CHARGING_RATE_W, VBATT_PAUSE_CHARGING, DELAY_SHUTDOWN_TIME_S, MAX_TIME_OFFROAD_S, \ + VBATT_HARD_SHUTDOWN, LOW_POWER_ENTRY_TIME_S + +# Create fake time +ssb = 0. +def mock_time_monotonic(): + global ssb + ssb += 1. + return ssb + +TEST_DURATION_S = 50 +GOOD_VOLTAGE = 12 * 1e3 +VOLTAGE_BELOW_PAUSE_CHARGING = (VBATT_PAUSE_CHARGING - 1) * 1e3 + +def pm_patch(mocker, name, value, constant=False): + if constant: + mocker.patch(f"iqpilot.system.hardware.power_monitoring.{name}", value) + else: + mocker.patch(f"iqpilot.system.hardware.power_monitoring.{name}", return_value=value) + + +@pytest.fixture(autouse=True) +def mock_time(mocker): + mocker.patch("time.monotonic", mock_time_monotonic) + + +class TestPowerMonitoring: + def setup_method(self): + self.params = Params() + + # Test to see that it doesn't do anything when pandaState is None + def test_panda_state_present(self): + pm = PowerMonitoring() + for _ in range(10): + pm.calculate(None, None) + assert pm.get_power_used() == 0 + assert pm.get_car_battery_capacity() == (CAR_BATTERY_CAPACITY_uWh / 10) + + # Test to see that it doesn't integrate offroad when ignition is True + def test_offroad_ignition(self): + pm = PowerMonitoring() + for _ in range(10): + pm.calculate(GOOD_VOLTAGE, True) + assert pm.get_power_used() == 0 + + # Test to see that it integrates with discharging battery + def test_offroad_integration_discharging(self, mocker): + POWER_DRAW = 4 + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + for _ in range(TEST_DURATION_S + 1): + pm.calculate(GOOD_VOLTAGE, False) + expected_power_usage = ((TEST_DURATION_S/3600) * POWER_DRAW * 1e6) + assert abs(pm.get_power_used() - expected_power_usage) < 10 + + # Test to check positive integration of car_battery_capacity + def test_car_battery_integration_onroad(self, mocker): + POWER_DRAW = 4 + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = 0 + for _ in range(TEST_DURATION_S + 1): + pm.calculate(GOOD_VOLTAGE, True) + expected_capacity = ((TEST_DURATION_S/3600) * CAR_CHARGING_RATE_W * 1e6) + assert abs(pm.get_car_battery_capacity() - expected_capacity) < 10 + + # Test to check positive integration upper limit + def test_car_battery_integration_upper_limit(self, mocker): + POWER_DRAW = 4 + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh - 1000 + for _ in range(TEST_DURATION_S + 1): + pm.calculate(GOOD_VOLTAGE, True) + estimated_capacity = CAR_BATTERY_CAPACITY_uWh + (CAR_CHARGING_RATE_W / 3600 * 1e6) + assert abs(pm.get_car_battery_capacity() - estimated_capacity) < 10 + + # Test to check negative integration of car_battery_capacity + def test_car_battery_integration_offroad(self, mocker): + POWER_DRAW = 4 + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh + for _ in range(TEST_DURATION_S + 1): + pm.calculate(GOOD_VOLTAGE, False) + expected_capacity = CAR_BATTERY_CAPACITY_uWh - ((TEST_DURATION_S/3600) * POWER_DRAW * 1e6) + assert abs(pm.get_car_battery_capacity() - expected_capacity) < 10 + + # Test to check negative integration lower limit + def test_car_battery_integration_lower_limit(self, mocker): + POWER_DRAW = 4 + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = 1000 + for _ in range(TEST_DURATION_S + 1): + pm.calculate(GOOD_VOLTAGE, False) + estimated_capacity = 0 - ((1/3600) * POWER_DRAW * 1e6) + assert abs(pm.get_car_battery_capacity() - estimated_capacity) < 10 + + # Test to check policy of stopping charging after MAX_TIME_OFFROAD_S + def test_max_time_offroad(self, mocker): + MOCKED_MAX_OFFROAD_TIME = 3600 + POWER_DRAW = 0 # To stop shutting down for other reasons + pm_patch(mocker, "MAX_TIME_OFFROAD_S", MOCKED_MAX_OFFROAD_TIME, constant=True) + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh + start_time = ssb + ignition = False + while ssb <= start_time + MOCKED_MAX_OFFROAD_TIME: + pm.calculate(GOOD_VOLTAGE, ignition) + if (ssb - start_time) % 1000 == 0 and ssb < start_time + MOCKED_MAX_OFFROAD_TIME: + assert not pm.should_shutdown(ignition, True, start_time, False) + assert pm.should_shutdown(ignition, True, start_time, False) + + def test_car_voltage(self, mocker): + POWER_DRAW = 0 # To stop shutting down for other reasons + TEST_TIME = 350 + VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S = 50 + pm_patch(mocker, "VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S", VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S, constant=True) + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh + ignition = False + start_time = ssb + for i in range(TEST_TIME): + pm.calculate(VOLTAGE_BELOW_PAUSE_CHARGING, ignition) + if i % 10 == 0: + assert pm.should_shutdown(ignition, True, start_time, True) == \ + (pm.car_voltage_mV < VBATT_PAUSE_CHARGING * 1e3 and \ + (ssb - start_time) > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S and \ + (ssb - start_time) > DELAY_SHUTDOWN_TIME_S) + assert pm.should_shutdown(ignition, True, start_time, True) + + # Test to check policy of not stopping charging when DisablePowerDown is set + def test_disable_power_down(self, mocker): + POWER_DRAW = 0 # To stop shutting down for other reasons + TEST_TIME = 100 + self.params.put_bool("DisablePowerDown", True) + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh + ignition = False + for i in range(TEST_TIME): + pm.calculate(VOLTAGE_BELOW_PAUSE_CHARGING, ignition) + if i % 10 == 0: + assert not pm.should_shutdown(ignition, True, ssb, False) + assert not pm.should_shutdown(ignition, True, ssb, False) + + # Test to check policy of not stopping charging when ignition + def test_ignition(self, mocker): + POWER_DRAW = 0 # To stop shutting down for other reasons + TEST_TIME = 100 + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh + ignition = True + for i in range(TEST_TIME): + pm.calculate(VOLTAGE_BELOW_PAUSE_CHARGING, ignition) + if i % 10 == 0: + assert not pm.should_shutdown(ignition, True, ssb, False) + assert not pm.should_shutdown(ignition, True, ssb, False) + + # Test to check policy of not stopping charging when harness is not connected + def test_harness_connection(self, mocker): + POWER_DRAW = 0 # To stop shutting down for other reasons + TEST_TIME = 100 + pm_patch(mocker, "HARDWARE.get_current_power_draw", POWER_DRAW) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh + + ignition = False + for i in range(TEST_TIME): + pm.calculate(VOLTAGE_BELOW_PAUSE_CHARGING, ignition) + if i % 10 == 0: + assert not pm.should_shutdown(ignition, False, ssb, False) + assert not pm.should_shutdown(ignition, False, ssb, False) + + def test_delay_shutdown_time(self): + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = 0 + ignition = False + in_car = True + offroad_timestamp = ssb + started_seen = True + pm.calculate(VOLTAGE_BELOW_PAUSE_CHARGING, ignition) + + while ssb < offroad_timestamp + DELAY_SHUTDOWN_TIME_S: + assert not pm.should_shutdown(ignition, in_car, + offroad_timestamp, + started_seen), \ + f"Should not shutdown before {DELAY_SHUTDOWN_TIME_S} seconds offroad time" + assert pm.should_shutdown(ignition, in_car, + offroad_timestamp, + started_seen), \ + f"Should shutdown after {DELAY_SHUTDOWN_TIME_S} seconds offroad time" + + @pytest.mark.parametrize( + "max_time_offroad, offroad_time_min, expected_result", + [ + # No max time set – fallback to default (30 hours) + (None, 0, False), + (None, MAX_TIME_OFFROAD_S + 1, True), # exceeds 30h (1800+ mins) + + # Valid max time values (in minutes) + (60, 59, False), # under limit + (60, 120, True), # over limit + (10, 8, False), # under limit + (10, 11, True), # over limit + + # Edge case: max time is zero → no limit enforced + (0, 0, False), + (0, 400, False), + + # Invalid max time formats or negative values → fallback to 30 hours + (-100, 100, False), # should fallback to 30h + (-1, MAX_TIME_OFFROAD_S + 1, True), # should fallback to 30h, and exceed it + ] + ) + def test_max_time_offroad_exceeded(self, max_time_offroad, offroad_time_min, expected_result): + # Set the parameter if provided + if max_time_offroad is not None: + self.params.put("MaxTimeOffroad", max_time_offroad) + + # Convert offroad time from minutes to seconds + offroad_time_s = offroad_time_min * 60 + + pm = PowerMonitoring() + result = pm.max_time_offroad_exceeded(offroad_time_s) + + assert result == expected_result + + # FastSleep must not shut down on the empty bookkeeping model while voltage is healthy + def test_fast_sleep_ignores_battery_capacity_model(self, mocker): + self.params.put_bool("FastSleep", True) + self.params.put("MaxTimeOffroad", 0) + try: + pm_patch(mocker, "HARDWARE.get_current_power_draw", 0) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = 0 + start_time = ssb + for _ in range(DELAY_SHUTDOWN_TIME_S + 100): + pm.calculate(GOOD_VOLTAGE, False) + assert not pm.should_shutdown(False, True, start_time, True) + finally: + self.params.put_bool("FastSleep", False) + + # FastSleep still shuts down below the hard voltage floor + def test_fast_sleep_hard_voltage_floor(self, mocker): + self.params.put_bool("FastSleep", True) + try: + pm_patch(mocker, "HARDWARE.get_current_power_draw", 0) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh + start_time = ssb + for _ in range(DELAY_SHUTDOWN_TIME_S + 100): + pm.calculate((VBATT_HARD_SHUTDOWN - 0.5) * 1e3, False) + assert pm.should_shutdown(False, True, start_time, True) + finally: + self.params.put_bool("FastSleep", False) + + def test_fast_sleep_low_power_entry(self, mocker): + self.params.put_bool("FastSleep", True) + try: + pm_patch(mocker, "HARDWARE.get_current_power_draw", 0) + + # parked with the screen idled off: time-based entry at healthy voltage + pm = PowerMonitoring() + start_time = ssb + for _ in range(LOW_POWER_ENTRY_TIME_S + 10): + pm.calculate(GOOD_VOLTAGE, False) + assert pm.should_enter_low_power(False, True, start_time, screen_off=True) + assert not pm.should_enter_low_power(False, True, start_time, screen_off=False) + assert not pm.should_enter_low_power(True, True, start_time, screen_off=True) + assert not pm.should_enter_low_power(False, False, start_time, screen_off=True) + + # sagging battery: voltage entry regardless of screen state + pm = PowerMonitoring() + start_time = ssb + for _ in range(100): + pm.calculate((VBATT_HARD_SHUTDOWN + 0.1) * 1e3, False) + assert pm.should_enter_low_power(False, True, start_time, screen_off=False) + + self.params.put_bool("FastSleep", False) + assert not pm.should_enter_low_power(False, True, start_time, screen_off=True) + finally: + self.params.put_bool("FastSleep", False) + + def test_negative_charging_interval_is_rejected(self, mocker): + exception = mocker.patch("iqpilot.system.hardware.power_monitoring.cloudlog.exception") + pm = PowerMonitoring() + pm.last_measurement_time = ssb + 100 + capacity = pm.car_battery_capacity_uWh + pm.calculate(GOOD_VOLTAGE, True) + assert pm.car_battery_capacity_uWh == capacity + exception.assert_called_once_with("Power monitoring calculation failed") + + def test_negative_discharge_interval_is_rejected(self, mocker): + exception = mocker.patch("iqpilot.system.hardware.power_monitoring.cloudlog.exception") + pm = PowerMonitoring() + pm.last_measurement_time = ssb + 100 + capacity = pm.car_battery_capacity_uWh + pm._perform_integration(ssb, 4.0) + assert pm.car_battery_capacity_uWh == capacity + assert pm.power_used_uWh == 0 + exception.assert_called_once_with("Integration failed") + + def test_max_time_offroad_uses_default_when_params_fail(self): + class UnavailableParams: + def get(self, key): + raise RuntimeError(key) + + pm = PowerMonitoring() + pm.params = UnavailableParams() + assert not pm.max_time_offroad_exceeded(MAX_TIME_OFFROAD_S - 1) + assert pm.max_time_offroad_exceeded(MAX_TIME_OFFROAD_S) + + def test_shutdown_requires_offroad_timestamp(self): + assert not PowerMonitoring().should_shutdown(False, True, None, True) diff --git a/iqpilot/system/hardware/tests/test_usb_state.py b/iqpilot/system/hardware/tests/test_usb_state.py new file mode 100644 index 000000000..8a536c22f --- /dev/null +++ b/iqpilot/system/hardware/tests/test_usb_state.py @@ -0,0 +1,279 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +deviceState.usbState carries a per-device USB bus snapshot plus the ssusb +link-error counter (IQ.OS 4.9.1+ `portli`) into every rlog. Drive it off a +synthetic sysfs tree so parsing, eGPU dock presence and the link-error +plumbing are pinned without hardware. +""" +from iqpilot.cereal import messaging +from iqpilot.system.hardware.usb import ( + EGPU_DOCK_FW_PRODUCT, EGPU_DOCK_ROM_USB_IDS, EGPU_DOCK_USB_IDS, controller, egpu_dock_present, + egpu_dock_ready, get_link_error_count, + get_usb_topology, get_usb_state, link_controller, read_hex_counter, set_usb_state, usb3_lane, +) + + +def _mkctrl(root, name="a800000.ssusb", portli="0x00000000"): + """Platform controller dir, mirroring /sys/devices/platform/soc/.ssusb.""" + ctrl = root / "soc" / name + ctrl.mkdir(parents=True) + if portli is not None: + (ctrl / "portli").write_text(portli + "\n") + return ctrl + + +def _mkdev(root, name, *, vid, pid, busnum=1, devnum=2, speed=5000, + manufacturer="ACME", product="Widget", ctrl=None): + """USB device under the controller, symlinked into the bus view like sysfs.""" + real = (ctrl / "usb1" / name) if ctrl is not None else (root / "bus" / name) + real.mkdir(parents=True) + (real / "idVendor").write_text(f"{vid:04x}\n") + (real / "idProduct").write_text(f"{pid:04x}\n") + (real / "busnum").write_text(f"{busnum}\n") + (real / "devnum").write_text(f"{devnum}\n") + (real / "speed").write_text(f"{speed}\n") + (real / "manufacturer").write_text(manufacturer + "\n") + (real / "product").write_text(product + "\n") + + bus = root / "bus" + bus.mkdir(parents=True, exist_ok=True) + link = bus / name + if real != link: + link.symlink_to(real) + return real + + +def test_missing_sysfs_is_empty(tmp_path): + assert get_usb_state(tmp_path / "nope") == [] + + +def test_entries_without_idvendor_are_skipped(tmp_path): + (tmp_path / "bus" / "usb1").mkdir(parents=True) # a root hub dir with no idVendor + _mkdev(tmp_path, "1-2", vid=0x1234, pid=0x5678) + state = get_usb_state(tmp_path / "bus") + assert len(state) == 1 and state[0]["vendorId"] == 0x1234 + + +def test_fields_parsed_with_hex_ids(tmp_path): + _mkdev(tmp_path, "1-2", vid=0x0BDA, pid=0x8153, busnum=3, devnum=7, + speed=480, manufacturer="Realtek", product="USB 10/100 LAN") + (dev,) = get_usb_state(tmp_path / "bus") + assert dev == { + "busnum": 3, "devnum": 7, + "vendorId": 0x0BDA, "productId": 0x8153, + "speedMbps": 480, + "manufacturer": "Realtek", "product": "USB 10/100 LAN", + "linkErrorCount": 0, # no controller in this device's path + "usb3Lane": "unknown", # not on the type-C port's controller + } + + +def test_unreadable_strings_default_empty(tmp_path): + real = _mkdev(tmp_path, "1-2", vid=0x1, pid=0x2) + (real / "manufacturer").unlink() + (real / "product").unlink() + (dev,) = get_usb_state(tmp_path / "bus") + assert dev["manufacturer"] == "" and dev["product"] == "" + + +def test_hex_counter_parsing(tmp_path): + f = tmp_path / "portli" + f.write_text("0x00000000\n") + assert read_hex_counter(f) == 0 + f.write_text("0x0000002a\n") + assert read_hex_counter(f) == 42 + f.write_text("0000002a\n") # bare hex, no 0x prefix + assert read_hex_counter(f) == 42 + f.write_text("garbage\n") + assert read_hex_counter(f) == 0 + assert read_hex_counter(tmp_path / "absent") == 0 # pre-4.9.1 IQ.OS + + +def test_controller_resolved_from_device(tmp_path): + ctrl = _mkctrl(tmp_path) + _mkdev(tmp_path, "1-2", vid=0x1, pid=0x2, ctrl=ctrl) + assert controller(tmp_path / "bus" / "1-2") == ctrl.resolve() + + +def test_device_carries_its_controllers_link_errors(tmp_path): + ctrl = _mkctrl(tmp_path, portli="0x0000000c") + _mkdev(tmp_path, "1-2", vid=0x1234, pid=0x5678, ctrl=ctrl) + (dev,) = get_usb_state(tmp_path / "bus") + assert dev["linkErrorCount"] == 12 + + +def test_controller_count_without_any_enumerated_device(tmp_path): + # peripheral mode (eMac gadget link): the peer never enumerates on our side, + # so the counter must still be readable off the controller + _mkctrl(tmp_path, portli="0x00000005") + assert get_usb_state(tmp_path / "bus") == [] + assert get_link_error_count(tmp_path / "soc") == 5 + + +def test_link_errors_summed_across_controllers(tmp_path): + _mkctrl(tmp_path, name="a800000.ssusb", portli="0x00000002") + _mkctrl(tmp_path, name="a600000.ssusb", portli="0x00000003") + assert get_link_error_count(tmp_path / "soc") == 5 + + +def test_missing_portli_reads_zero(tmp_path): + _mkctrl(tmp_path, portli=None) # pre-4.9.1 kernel: file absent + assert get_link_error_count(tmp_path / "soc") == 0 + + +def test_set_usb_state_populates_message_and_flags_dock(tmp_path): + ctrl = _mkctrl(tmp_path, portli="0x00000007") + _mkdev(tmp_path, "1-1", vid=0x1234, pid=0x5678, speed=480, ctrl=ctrl) + _mkdev(tmp_path, "1-2", vid=EGPU_DOCK_USB_IDS[0][0], pid=EGPU_DOCK_USB_IDS[0][1], speed=5000, ctrl=ctrl) + + msg = messaging.new_message('deviceState') + set_usb_state(msg.deviceState, get_usb_state(tmp_path / "bus"), get_link_error_count(tmp_path / "soc")) + + devices = list(msg.deviceState.usbState.devices) + assert len(devices) == 2 + assert {d.speedMbps for d in devices} == {480, 5000} + assert all(d.linkErrorCount == 7 for d in devices) + assert msg.deviceState.usbState.linkErrorCount == 7 + assert msg.deviceState.egpuDockPresent + + +def test_dock_absent_when_not_plugged(tmp_path): + _mkdev(tmp_path, "1-1", vid=0x1234, pid=0x5678) + msg = messaging.new_message('deviceState') + set_usb_state(msg.deviceState, get_usb_state(tmp_path / "bus")) + assert not msg.deviceState.egpuDockPresent + + +def test_both_shipped_dock_usb_ids_detected(tmp_path): + # comma ships the dock under two VID/PIDs; only the first was known before + for i, (vid, pid) in enumerate(EGPU_DOCK_USB_IDS): + root = tmp_path / f"v{i}" + _mkdev(root, "1-1", vid=vid, pid=pid) + assert egpu_dock_present(root / "bus"), f"{vid:#06x}:{pid:#06x} not detected" + + +def test_dock_in_rom_mode_is_not_present(tmp_path): + # bootloader/ROM state enumerates but cannot serve a GPU until flashed + vid, pid = EGPU_DOCK_ROM_USB_IDS[0] + _mkdev(tmp_path, "1-1", vid=vid, pid=pid) + assert not egpu_dock_present(tmp_path / "bus") + + +def test_empty_bus_clears_flag(): + msg = messaging.new_message('deviceState') + set_usb_state(msg.deviceState, []) + assert len(msg.deviceState.usbState.devices) == 0 + assert msg.deviceState.usbState.linkErrorCount == 0 + assert not msg.deviceState.egpuDockPresent + + +def test_link_error_count_masked_to_16_bits(tmp_path): + # the per-device field is UInt16 upstream; a wrapped counter must not overflow it + ctrl = _mkctrl(tmp_path, portli="0x0001ffff") + _mkdev(tmp_path, "1-2", vid=0x1, pid=0x2, ctrl=ctrl) + (dev,) = get_usb_state(tmp_path / "bus") + assert dev["linkErrorCount"] == 0xFFFF + + msg = messaging.new_message('deviceState') + set_usb_state(msg.deviceState, get_usb_state(tmp_path / "bus")) + assert list(msg.deviceState.usbState.devices)[0].linkErrorCount == 0xFFFF + + +def test_usb_topology_lists_bus_entries(tmp_path): + _mkdev(tmp_path, "1-1", vid=0x1, pid=0x2) + _mkdev(tmp_path, "1-2", vid=0x3, pid=0x4) + assert {"1-1", "1-2"} <= get_usb_topology(tmp_path / "bus") + assert get_usb_topology(tmp_path / "nope") == set() + + +def _mkudc(root, name="a600000.dwc3"): + udc = root / "udc" / name + udc.mkdir(parents=True, exist_ok=True) + (udc / "state").write_text("not attached\n") + return root / "udc" + + +def test_link_controller_derived_from_udc_not_hardcoded(tmp_path): + # comma pins "a600000.ssusb"; we derive it, so another board still resolves + assert link_controller(_mkudc(tmp_path)) == "a600000.ssusb" + assert link_controller(_mkudc(tmp_path / "other", "a800000.dwc3")) == "a800000.ssusb" + + +def test_link_controller_absent_udc_is_empty(tmp_path): + assert link_controller(tmp_path / "nope") == "" + + +def test_usb3_lane_mapping(): + assert usb3_lane(1) == "a" + assert usb3_lane(2) == "b" + assert usb3_lane(0) == "unknown" # unattached + assert usb3_lane(None if False else 7) == "unknown" + + +def test_port_lane_survives_gadget_mode(tmp_path): + """The case upstream cannot report: in peripheral mode nothing enumerates on + the link controller, so every Device row is 'unknown' while the eMac link is + up. The port-level field still carries it.""" + ctrl = _mkctrl(tmp_path, name="a800000.ssusb") + _mkdev(tmp_path, "1-1", vid=0x1234, pid=0x5678, ctrl=ctrl) # panda, host controller + _mkudc(tmp_path) # gadget is a600000 + + devices = get_usb_state(tmp_path / "bus", tmp_path / "udc") + assert all(d["usb3Lane"] == "unknown" for d in devices), "no device sits on the gadget controller" + + msg = messaging.new_message('deviceState') + set_usb_state(msg.deviceState, devices, 0, lane="b") + assert msg.deviceState.usbState.usb3Lane == "b" + assert all(d.usb3Lane == "unknown" for d in msg.deviceState.usbState.devices) + + +def test_device_on_link_controller_gets_the_lane(tmp_path): + # host mode on the type-C port (eGPU dock): upstream's per-device field populates + ctrl = _mkctrl(tmp_path, name="a600000.ssusb") + _mkdev(tmp_path, "1-1", vid=EGPU_DOCK_USB_IDS[0][0], pid=EGPU_DOCK_USB_IDS[0][1], ctrl=ctrl) + _mkudc(tmp_path) + import iqpilot.system.hardware.usb as usbmod + orig = usbmod.usb3_lane + usbmod.usb3_lane = lambda orientation=None: "a" + try: + devices = get_usb_state(tmp_path / "bus", tmp_path / "udc") + finally: + usbmod.usb3_lane = orig + assert devices[0]["usb3Lane"] == "a" + + +def test_dock_ready_requires_the_bundled_firmware_product(tmp_path): + root = tmp_path + vid, pid = EGPU_DOCK_USB_IDS[0] + _mkdev(root, "1-1", vid=vid, pid=pid, product=EGPU_DOCK_FW_PRODUCT) + assert egpu_dock_present(root / "bus") + assert egpu_dock_ready(root / "bus") + + +def test_dock_on_foreign_firmware_is_present_but_not_ready(tmp_path): + root = tmp_path + vid, pid = EGPU_DOCK_USB_IDS[0] + _mkdev(root, "1-1", vid=vid, pid=pid, product="custom deadbeef-CLEAN") + assert egpu_dock_present(root / "bus") + assert not egpu_dock_ready(root / "bus") + + +def test_rom_mode_dock_is_neither_present_nor_ready(tmp_path): + root = tmp_path + vid, pid = EGPU_DOCK_ROM_USB_IDS[0] + _mkdev(root, "1-1", vid=vid, pid=pid, product="USB 3.2 PCIe TinyEnclosure") + assert not egpu_dock_present(root / "bus") + assert not egpu_dock_ready(root / "bus") + + +class TestEnsureHostRole: + def test_already_host_needs_no_write(self, tmp_path): + from iqpilot.system.hardware.usb import ensure_host_role + mode = tmp_path / "mode" + mode.write_text("host\n") + assert ensure_host_role(mode) + + def test_missing_controller_is_false(self, tmp_path): + from iqpilot.system.hardware.usb import ensure_host_role + assert not ensure_host_role(tmp_path / "absent" / "mode") diff --git a/iqpilot/system/hardware/tici/__init__.py b/iqpilot/system/hardware/tici/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/hardware/tici/agnos.json b/iqpilot/system/hardware/tici/agnos.json new file mode 100644 index 000000000..5172685b5 --- /dev/null +++ b/iqpilot/system/hardware/tici/agnos.json @@ -0,0 +1,91 @@ +[ + { + "name": "xbl", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/xbl-dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6.img.xz", + "hash": "dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6", + "hash_raw": "dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6", + "size": 3282256, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "d47a08914d2376557b03f1231b7233508222c04b57d781f9daf77c63eab92c2e" + }, + { + "name": "xbl_config", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/xbl_config-1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9.img.xz", + "hash": "1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9", + "hash_raw": "1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9", + "size": 98124, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "e7d04d9f040c9c040cdf013335d0b6d6e9346311458baeb2461b193e954f5f1c" + }, + { + "name": "abl", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/abl-556bbb4ed1c671402b217bd2f3c07edce4f88b0bbd64e92241b82e396aa9ebee.img.xz", + "hash": "556bbb4ed1c671402b217bd2f3c07edce4f88b0bbd64e92241b82e396aa9ebee", + "hash_raw": "556bbb4ed1c671402b217bd2f3c07edce4f88b0bbd64e92241b82e396aa9ebee", + "size": 274432, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "556bbb4ed1c671402b217bd2f3c07edce4f88b0bbd64e92241b82e396aa9ebee" + }, + { + "name": "aop", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/aop-4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788.img.xz", + "hash": "4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788", + "hash_raw": "4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788", + "size": 184364, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "3aa0a79149ec57f4bc8c38f7bbdf4f6630dd659e49a111ce6258d2d06a07c8e5" + }, + { + "name": "devcfg", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/devcfg-2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585.img.xz", + "hash": "2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585", + "hash_raw": "2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585", + "size": 40336, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "3d7bb33588491a2a40091a7e1cf6cb65e6dd503f69b640aba484d723f1ad47e8" + }, + { + "name": "splash", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/splash-993d7fb8ddfa552bd7f60e8a78b8735efbc716a0978682ed3c92fa0d694528d2.img.xz", + "hash": "993d7fb8ddfa552bd7f60e8a78b8735efbc716a0978682ed3c92fa0d694528d2", + "hash_raw": "993d7fb8ddfa552bd7f60e8a78b8735efbc716a0978682ed3c92fa0d694528d2", + "size": 34226176, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "993d7fb8ddfa552bd7f60e8a78b8735efbc716a0978682ed3c92fa0d694528d2" + }, + { + "name": "boot", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/boot-4258981292746f5622f4a03a1e0c1d77379660e46bbaa455c504d638b5307906.img.xz", + "hash": "4258981292746f5622f4a03a1e0c1d77379660e46bbaa455c504d638b5307906", + "hash_raw": "4258981292746f5622f4a03a1e0c1d77379660e46bbaa455c504d638b5307906", + "size": 18216960, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "7be61ba2be5617ac22d6beb8ba8b896109a554347021f5e44b72458748336975" + }, + { + "name": "system", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/system-44b251e1b3d8cd9243d5c79287d2a0e74b5063d3e21b24192b1293430a3471aa.img.xz", + "hash": "44b251e1b3d8cd9243d5c79287d2a0e74b5063d3e21b24192b1293430a3471aa", + "hash_raw": "44b251e1b3d8cd9243d5c79287d2a0e74b5063d3e21b24192b1293430a3471aa", + "size": 6291456000, + "sparse": false, + "full_check": false, + "has_ab": true, + "ondevice_hash": "44b251e1b3d8cd9243d5c79287d2a0e74b5063d3e21b24192b1293430a3471aa", + "url_parts": 10 + } +] diff --git a/iqpilot/system/hardware/tici/agnos.json.sig b/iqpilot/system/hardware/tici/agnos.json.sig new file mode 100644 index 000000000..556ca7b7c --- /dev/null +++ b/iqpilot/system/hardware/tici/agnos.json.sig @@ -0,0 +1 @@ +Myu8k7msX7pt28JKl1Lx5/NnXu9i15nT8bFWnwGsip8wdCYPJqj69AWrfCtlg9YrR98O6ThCAEA1uzUfsrTeDQ== diff --git a/iqpilot/system/hardware/tici/agnos.py b/iqpilot/system/hardware/tici/agnos.py new file mode 100755 index 000000000..c44765cce --- /dev/null +++ b/iqpilot/system/hardware/tici/agnos.py @@ -0,0 +1,433 @@ +#!/usr/bin/env python3 +import base64 +import hashlib +import json +import lzma +import os +import struct +import subprocess +import time +from collections.abc import Generator + +import sys +_VENV_PY = "/usr/local/venv/bin/python3" +if sys.executable != _VENV_PY and os.path.exists(_VENV_PY): + try: + import Crypto # noqa: F401 + except ImportError: + os.execv(_VENV_PY, [_VENV_PY, os.path.abspath(__file__), *sys.argv[1:]]) + +import requests + +import iqpilot.system.updated.casync.casync as casync + +try: + from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey +except Exception as exc: + Ed25519PublicKey = None + _CRYPTO_IMPORT_ERROR = exc +else: + _CRYPTO_IMPORT_ERROR = None + +SPARSE_CHUNK_FMT = struct.Struct('H2xI4x') +CAIBX_URL = "https://commadist.azureedge.net/agnosupdate/" +IQPILOT_MANIFEST_PUBLIC_KEY = bytes.fromhex("40ae3f81b77506ecc4982a1ca37ba1d6f8765d2ae510eae9039577206c3e5732") + +AGNOS_MANIFEST_FILE = "system/hardware/tici/agnos.json" + +LFS_POINTER_MAGIC = b"version https://git-lfs" + +def _image_auth_module(): + try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + return import_verified_module("iqpilot_updater_private", "iqpilot_private.updater.git_remote") + except Exception: + pass + try: + root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..")) + bundle_python = os.path.join(root, "artifacts", "iqpilot_updater_private", "python") + if os.path.isdir(bundle_python): + if bundle_python not in sys.path: + sys.path.insert(0, bundle_python) + import importlib + return importlib.import_module("iqpilot_private.updater.git_remote") + except Exception: + pass + return None + +def _download_headers(url: str) -> dict: + mod = _image_auth_module() + if mod is not None: + try: + headers = mod.os_image_headers(url) + if headers: + return headers + except Exception: + pass + try: + from iqpilot.common.git_creds import get_credentials + creds = get_credentials() + if creds and all(creds) and "/iq.lvbs/iqos" in url.lower(): + return {"Authorization": "Basic " + base64.b64encode(f"{creds[0]}:{creds[1]}".encode()).decode()} + except Exception: + pass + return {} + +def _open_image_response(url: str) -> requests.Response: + auth = _download_headers(url) + req = requests.get(url, stream=True, headers={'Accept-Encoding': None, **auth}, timeout=60) + req.raise_for_status() + if int(req.headers.get('content-length') or 0) >= 1024: + return req + + body = req.content + if not body.startswith(LFS_POINTER_MAGIC): + raise requests.exceptions.InvalidURL(f"unexpected tiny response ({len(body)} bytes) for {url}") + meta = dict(line.split(" ", 1) for line in body.decode().strip().splitlines() if " " in line) + oid = meta["oid"].split(":", 1)[1] + size = int(meta["size"]) + lfs_base = url.split("/raw/", 1)[0] + ".git/info/lfs" + + req = requests.get(f"{lfs_base}/objects/{oid}", stream=True, + headers={'Accept-Encoding': None, 'Accept': 'application/vnd.git-lfs', **auth}, timeout=60) + if req.status_code == 200: + return req + + batch = requests.post(f"{lfs_base}/objects/batch", + data=json.dumps({"operation": "download", "transfers": ["basic"], + "objects": [{"oid": oid, "size": size}]}), + headers={"Content-Type": "application/vnd.git-lfs+json", + "Accept": "application/vnd.git-lfs+json", **auth}, + timeout=60) + batch.raise_for_status() + action = batch.json()["objects"][0]["actions"]["download"] + req = requests.get(action["href"], stream=True, + headers={'Accept-Encoding': None, **action.get("header", {})}, timeout=60) + req.raise_for_status() + return req + + +def verify_manifest_signature(manifest_path: str) -> None: + sig_path = f"{manifest_path}.sig" + if not os.path.exists(sig_path): + raise RuntimeError(f"missing AGNOS manifest signature: {sig_path}") + if Ed25519PublicKey is None: + raise RuntimeError(f"cryptography import failed: {_CRYPTO_IMPORT_ERROR}") + + manifest_bytes = open(manifest_path, "rb").read() + signature = base64.b64decode(open(sig_path, "rb").read().strip()) + digest = hashlib.sha256(manifest_bytes).digest() + public_key = Ed25519PublicKey.from_public_bytes(IQPILOT_MANIFEST_PUBLIC_KEY) + public_key.verify(signature, digest) + +class _ChainedParts: + def __init__(self, urls: list[str]) -> None: + self.urls = urls + self.req: requests.Response | None = None + + def raise_for_status(self) -> None: + if self.req is not None: + self.req.raise_for_status() + + def iter_content(self, chunk_size: int) -> Generator[bytes, None, None]: + for u in self.urls: + self.req = _open_image_response(u) + yield from self.req.iter_content(chunk_size=chunk_size) + +class StreamingDecompressor: + def __init__(self, url: str, parts: int = 0) -> None: + self.buf = b"" + + if parts > 1: + self.req = _ChainedParts([f"{url}.p{i:02d}" for i in range(parts)]) + else: + self.req = _open_image_response(url) + self.it = self.req.iter_content(chunk_size=1024 * 1024) + self.decompressor = lzma.LZMADecompressor(format=lzma.FORMAT_AUTO) + self.eof = False + self.sha256 = hashlib.sha256() + + def read(self, length: int) -> bytes: + while len(self.buf) < length and not self.eof: + if self.decompressor.needs_input: + self.req.raise_for_status() + + try: + compressed = next(self.it) + except StopIteration: + self.eof = True + break + else: + compressed = b'' + + self.buf += self.decompressor.decompress(compressed, max_length=length) + + if self.decompressor.eof: + self.eof = True + break + + result = self.buf[:length] + self.buf = self.buf[length:] + + self.sha256.update(result) + return result + +def unsparsify(f: StreamingDecompressor) -> Generator[bytes, None, None]: + magic = struct.unpack("I", f.read(4))[0] + assert(magic == 0xed26ff3a) + + major = struct.unpack("H", f.read(2))[0] + minor = struct.unpack("H", f.read(2))[0] + assert(major == 1 and minor == 0) + + f.read(2) + f.read(2) + + block_sz = struct.unpack("I", f.read(4))[0] + f.read(4) + num_chunks = struct.unpack("I", f.read(4))[0] + f.read(4) + + for _ in range(num_chunks): + chunk_type, out_blocks = SPARSE_CHUNK_FMT.unpack(f.read(12)) + + if chunk_type == 0xcac1: + yield f.read(out_blocks * block_sz) + elif chunk_type == 0xcac2: + filler = f.read(4) * (block_sz // 4) + for _ in range(out_blocks): + yield filler + elif chunk_type == 0xcac3: + yield b"" + else: + raise Exception("Unhandled sparse chunk type") + +def noop(f: StreamingDecompressor) -> Generator[bytes, None, None]: + while len(chunk := f.read(1024 * 1024)) > 0: + yield chunk + +def get_target_slot_number() -> int: + current_slot = subprocess.check_output(["abctl", "--boot_slot"], encoding='utf-8').strip() + return 1 if current_slot == "_a" else 0 + +def slot_number_to_suffix(slot_number: int) -> str: + assert slot_number in (0, 1) + return '_a' if slot_number == 0 else '_b' + +def get_partition_path(target_slot_number: int, partition: dict) -> str: + path = f"/dev/disk/by-partlabel/{partition['name']}" + + if partition.get('has_ab', True): + path += slot_number_to_suffix(target_slot_number) + + return path + +def get_raw_hash(path: str, partition_size: int) -> str: + raw_hash = hashlib.sha256() + pos, chunk_size = 0, 1024 * 1024 + + with open(path, 'rb+') as out: + while pos < partition_size: + n = min(chunk_size, partition_size - pos) + raw_hash.update(out.read(n)) + pos += n + + return raw_hash.hexdigest().lower() + +def verify_partition(target_slot_number: int, partition: dict[str, str | int], force_full_check: bool = False) -> bool: + full_check = partition['full_check'] or force_full_check + path = get_partition_path(target_slot_number, partition) + + if not isinstance(partition['size'], int): + return False + + partition_size: int = partition['size'] + + if not isinstance(partition['hash_raw'], str): + return False + + partition_hash: str = partition['hash_raw'] + + if full_check: + return get_raw_hash(path, partition_size) == partition_hash.lower() + else: + with open(path, 'rb+') as out: + out.seek(partition_size) + return out.read(64) == partition_hash.lower().encode() + +def clear_partition_hash(target_slot_number: int, partition: dict) -> None: + path = get_partition_path(target_slot_number, partition) + with open(path, 'wb+') as out: + partition_size = partition['size'] + + out.seek(partition_size) + out.write(b"\x00" * 64) + os.sync() + +def extract_compressed_image(target_slot_number: int, partition: dict, cloudlog): + path = get_partition_path(target_slot_number, partition) + downloader = StreamingDecompressor(partition['url'], parts=int(partition.get('url_parts', 0))) + + with open(path, 'wb+') as out: + last_p = 0 + raw_hash = hashlib.sha256() + f = unsparsify if partition['sparse'] else noop + for chunk in f(downloader): + raw_hash.update(chunk) + out.write(chunk) + p = int(out.tell() / partition['size'] * 100) + if p != last_p: + last_p = p + print(f"Installing {partition['name']}: {p}", flush=True) + + if raw_hash.hexdigest().lower() != partition['hash_raw'].lower(): + raise Exception(f"Raw hash mismatch '{raw_hash.hexdigest().lower()}'") + + if downloader.sha256.hexdigest().lower() != partition['hash'].lower(): + raise Exception("Uncompressed hash mismatch") + + if out.tell() != partition['size']: + raise Exception("Uncompressed size mismatch") + + os.sync() + +def extract_casync_image(target_slot_number: int, partition: dict, cloudlog): + path = get_partition_path(target_slot_number, partition) + seed_path = path[:-1] + ('b' if path[-1] == 'a' else 'a') + + target = casync.parse_caibx(partition['casync_caibx']) + + sources: list[tuple[str, casync.ChunkReader, casync.ChunkDict]] = [] + + try: + raw_hash = get_raw_hash(seed_path, partition['size']) + caibx_url = f"{CAIBX_URL}{partition['name']}-{raw_hash}.caibx" + + try: + cloudlog.info(f"casync fetching {caibx_url}") + sources += [('seed', casync.FileChunkReader(seed_path), casync.build_chunk_dict(casync.parse_caibx(caibx_url)))] + except requests.RequestException: + cloudlog.error(f"casync failed to load {caibx_url}") + except Exception: + cloudlog.exception("casync failed to hash seed partition") + + sources += [('target', casync.FileChunkReader(path), casync.build_chunk_dict(target))] + + sources += [('remote', casync.RemoteChunkReader(partition['casync_store']), casync.build_chunk_dict(target))] + + last_p = 0 + + def progress(cur): + nonlocal last_p + p = int(cur / partition['size'] * 100) + if p != last_p: + last_p = p + print(f"Installing {partition['name']}: {p}", flush=True) + + stats = casync.extract(target, sources, path, progress) + cloudlog.error(f'casync done {json.dumps(stats)}') + + os.sync() + if not verify_partition(target_slot_number, partition, force_full_check=True): + raise Exception(f"Raw hash mismatch '{partition['hash_raw'].lower()}'") + +def flash_partition(target_slot_number: int, partition: dict, cloudlog, standalone=False): + cloudlog.info(f"Downloading and writing {partition['name']}") + + if verify_partition(target_slot_number, partition): + cloudlog.info(f"Already flashed {partition['name']}") + return + + full_check = partition['full_check'] + if not full_check: + clear_partition_hash(target_slot_number, partition) + + path = get_partition_path(target_slot_number, partition) + + if ('casync_caibx' in partition) and not standalone: + extract_casync_image(target_slot_number, partition, cloudlog) + else: + extract_compressed_image(target_slot_number, partition, cloudlog) + + if not full_check: + with open(path, 'wb+') as out: + out.seek(partition['size']) + out.write(partition['hash_raw'].lower().encode()) + +def swap(manifest_path: str, target_slot_number: int, cloudlog) -> None: + verify_manifest_signature(manifest_path) + update = json.load(open(manifest_path)) + for partition in update: + if not partition.get('full_check', False): + clear_partition_hash(target_slot_number, partition) + + while True: + out = subprocess.check_output(f"abctl --set_active {target_slot_number}", shell=True, stderr=subprocess.STDOUT, encoding='utf8') + if ("No such file or directory" not in out) and ("lun as boot lun" in out): + cloudlog.info(f"Swap successful {out}") + break + else: + cloudlog.error(f"Swap failed {out}") + +def flash_agnos_update(manifest_path: str, target_slot_number: int, cloudlog, standalone=False) -> None: + verify_manifest_signature(manifest_path) + update = json.load(open(manifest_path)) + + cloudlog.info(f"Target slot {target_slot_number}") + + os.system(f"abctl --set_unbootable {target_slot_number}") + + for partition in update: + success = False + + for retries in range(10): + try: + flash_partition(target_slot_number, partition, cloudlog, standalone) + success = True + break + + except requests.exceptions.RequestException: + cloudlog.exception("Failed") + cloudlog.info(f"Failed to download {partition['name']}, retrying ({retries})") + time.sleep(10) + + if not success: + cloudlog.info(f"Failed to flash {partition['name']}, aborting") + raise Exception("Maximum retries exceeded") + + cloudlog.info(f"AGNOS ready on slot {target_slot_number}") + +def verify_agnos_update(manifest_path: str, target_slot_number: int) -> bool: + verify_manifest_signature(manifest_path) + update = json.load(open(manifest_path)) + return all(verify_partition(target_slot_number, partition) for partition in update) + +if __name__ == "__main__": + import argparse + import logging + + parser = argparse.ArgumentParser(description="Flash and verify AGNOS update", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument("--verify", action="store_true", help="Verify and perform swap if update ready") + parser.add_argument("--swap", action="store_true", help="Verify and perform swap, downloads if necessary") + parser.add_argument("manifest", help="Manifest json") + args = parser.parse_args() + + logging.basicConfig(level=logging.INFO) + + target_slot_number = get_target_slot_number() + if args.verify: + if verify_agnos_update(args.manifest, target_slot_number): + swap(args.manifest, target_slot_number, logging) + exit(0) + exit(1) + elif args.swap: + while not verify_agnos_update(args.manifest, target_slot_number): + logging.error("Verification failed. Flashing AGNOS") + flash_agnos_update(args.manifest, target_slot_number, logging, standalone=True) + + logging.warning(f"Verification succeeded. Swapping to slot {target_slot_number}") + swap(args.manifest, target_slot_number, logging) + else: + flash_agnos_update(args.manifest, target_slot_number, logging, standalone=True) diff --git a/iqpilot/system/hardware/tici/agnos_tici_15_1.json b/iqpilot/system/hardware/tici/agnos_tici_15_1.json new file mode 100644 index 000000000..985cb5efd --- /dev/null +++ b/iqpilot/system/hardware/tici/agnos_tici_15_1.json @@ -0,0 +1,80 @@ +[ + { + "name": "xbl", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/xbl-dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6.img.xz", + "hash": "dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6", + "hash_raw": "dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6", + "size": 3282256, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "d47a08914d2376557b03f1231b7233508222c04b57d781f9daf77c63eab92c2e" + }, + { + "name": "xbl_config", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/xbl_config-1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9.img.xz", + "hash": "1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9", + "hash_raw": "1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9", + "size": 98124, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "e7d04d9f040c9c040cdf013335d0b6d6e9346311458baeb2461b193e954f5f1c" + }, + { + "name": "abl", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/abl-32a2174b5f764e95dfc54cf358ba01752943b1b3b90e626149c3da7d5f1830b6.img.xz", + "hash": "32a2174b5f764e95dfc54cf358ba01752943b1b3b90e626149c3da7d5f1830b6", + "hash_raw": "32a2174b5f764e95dfc54cf358ba01752943b1b3b90e626149c3da7d5f1830b6", + "size": 274432, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "32a2174b5f764e95dfc54cf358ba01752943b1b3b90e626149c3da7d5f1830b6" + }, + { + "name": "aop", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/aop-4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788.img.xz", + "hash": "4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788", + "hash_raw": "4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788", + "size": 184364, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "3aa0a79149ec57f4bc8c38f7bbdf4f6630dd659e49a111ce6258d2d06a07c8e5" + }, + { + "name": "devcfg", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/devcfg-2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585.img.xz", + "hash": "2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585", + "hash_raw": "2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585", + "size": 40336, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "3d7bb33588491a2a40091a7e1cf6cb65e6dd503f69b640aba484d723f1ad47e8" + }, + { + "name": "boot", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/boot-4258981292746f5622f4a03a1e0c1d77379660e46bbaa455c504d638b5307906.img.xz", + "hash": "4258981292746f5622f4a03a1e0c1d77379660e46bbaa455c504d638b5307906", + "hash_raw": "4258981292746f5622f4a03a1e0c1d77379660e46bbaa455c504d638b5307906", + "size": 18216960, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "7be61ba2be5617ac22d6beb8ba8b896109a554347021f5e44b72458748336975" + }, + { + "name": "system", + "url": "https://git.konn3kt.com/IQ.Lvbs/iqos/raw/branch/master/system-44b251e1b3d8cd9243d5c79287d2a0e74b5063d3e21b24192b1293430a3471aa.img.xz", + "hash": "44b251e1b3d8cd9243d5c79287d2a0e74b5063d3e21b24192b1293430a3471aa", + "hash_raw": "44b251e1b3d8cd9243d5c79287d2a0e74b5063d3e21b24192b1293430a3471aa", + "size": 6291456000, + "sparse": false, + "full_check": false, + "has_ab": true, + "ondevice_hash": "44b251e1b3d8cd9243d5c79287d2a0e74b5063d3e21b24192b1293430a3471aa", + "url_parts": 10 + } +] diff --git a/iqpilot/system/hardware/tici/agnos_tici_15_1.json.sig b/iqpilot/system/hardware/tici/agnos_tici_15_1.json.sig new file mode 100644 index 000000000..af20db1df --- /dev/null +++ b/iqpilot/system/hardware/tici/agnos_tici_15_1.json.sig @@ -0,0 +1 @@ +aGtkoy//jP3MWJmd5uvb/mxKu1KsE8ZlhrTUr1CPCotwjIVzsxOncUGN9HnUcMXoUWZbUWz9H8Q+ARYxz41/Ag== diff --git a/iqpilot/system/hardware/tici/all-partitions.json b/iqpilot/system/hardware/tici/all-partitions.json new file mode 100644 index 000000000..b6718fe97 --- /dev/null +++ b/iqpilot/system/hardware/tici/all-partitions.json @@ -0,0 +1,400 @@ +[ + { + "name": "gpt_main_0", + "url": "https://commadist.azureedge.net/agnosupdate/gpt_main_0-8928a31fd9ee20f8703649f89833eba9b55e84b6415e67799c777b163c95a0bd.img.xz", + "hash": "8928a31fd9ee20f8703649f89833eba9b55e84b6415e67799c777b163c95a0bd", + "hash_raw": "8928a31fd9ee20f8703649f89833eba9b55e84b6415e67799c777b163c95a0bd", + "size": 24576, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "8928a31fd9ee20f8703649f89833eba9b55e84b6415e67799c777b163c95a0bd", + "gpt": { + "lun": 0, + "start_sector": 0, + "num_sectors": 6 + } + }, + { + "name": "gpt_main_1", + "url": "https://commadist.azureedge.net/agnosupdate/gpt_main_1-fe8ef7653db588d7420a625920ca06927dfcb0ed8aff3e3a1c74a52a24398ba6.img.xz", + "hash": "fe8ef7653db588d7420a625920ca06927dfcb0ed8aff3e3a1c74a52a24398ba6", + "hash_raw": "fe8ef7653db588d7420a625920ca06927dfcb0ed8aff3e3a1c74a52a24398ba6", + "size": 24576, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "fe8ef7653db588d7420a625920ca06927dfcb0ed8aff3e3a1c74a52a24398ba6", + "gpt": { + "lun": 1, + "start_sector": 0, + "num_sectors": 6 + } + }, + { + "name": "gpt_main_2", + "url": "https://commadist.azureedge.net/agnosupdate/gpt_main_2-5ccfc7240c8cbfa2f1a018a2e376cf274a6baf858c9bfe71951d8e28cab53c21.img.xz", + "hash": "5ccfc7240c8cbfa2f1a018a2e376cf274a6baf858c9bfe71951d8e28cab53c21", + "hash_raw": "5ccfc7240c8cbfa2f1a018a2e376cf274a6baf858c9bfe71951d8e28cab53c21", + "size": 24576, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "5ccfc7240c8cbfa2f1a018a2e376cf274a6baf858c9bfe71951d8e28cab53c21", + "gpt": { + "lun": 2, + "start_sector": 0, + "num_sectors": 6 + } + }, + { + "name": "gpt_main_3", + "url": "https://commadist.azureedge.net/agnosupdate/gpt_main_3-c707979fa21e89519328f4f30c2b21c9c453401ca8303f914c1873d410a95159.img.xz", + "hash": "c707979fa21e89519328f4f30c2b21c9c453401ca8303f914c1873d410a95159", + "hash_raw": "c707979fa21e89519328f4f30c2b21c9c453401ca8303f914c1873d410a95159", + "size": 24576, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "c707979fa21e89519328f4f30c2b21c9c453401ca8303f914c1873d410a95159", + "gpt": { + "lun": 3, + "start_sector": 0, + "num_sectors": 6 + } + }, + { + "name": "gpt_main_4", + "url": "https://commadist.azureedge.net/agnosupdate/gpt_main_4-e9405dcd785dbe79412184e1894a9c51ab7deb33bb612166c4c42a3d2bf42a0e.img.xz", + "hash": "e9405dcd785dbe79412184e1894a9c51ab7deb33bb612166c4c42a3d2bf42a0e", + "hash_raw": "e9405dcd785dbe79412184e1894a9c51ab7deb33bb612166c4c42a3d2bf42a0e", + "size": 24576, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "e9405dcd785dbe79412184e1894a9c51ab7deb33bb612166c4c42a3d2bf42a0e", + "gpt": { + "lun": 4, + "start_sector": 0, + "num_sectors": 6 + } + }, + { + "name": "gpt_main_5", + "url": "https://commadist.azureedge.net/agnosupdate/gpt_main_5-21ae965f05b2fa8d02e04f1eb74718f9779864f6eacdeb859757d6435e8ccce3.img.xz", + "hash": "21ae965f05b2fa8d02e04f1eb74718f9779864f6eacdeb859757d6435e8ccce3", + "hash_raw": "21ae965f05b2fa8d02e04f1eb74718f9779864f6eacdeb859757d6435e8ccce3", + "size": 24576, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "21ae965f05b2fa8d02e04f1eb74718f9779864f6eacdeb859757d6435e8ccce3", + "gpt": { + "lun": 5, + "start_sector": 0, + "num_sectors": 6 + } + }, + { + "name": "persist", + "url": "https://commadist.azureedge.net/agnosupdate/persist-d6af4ec18df180c7417353b52a9e05e43a6480b29425f087874136436cefe786.img.xz", + "hash": "d6af4ec18df180c7417353b52a9e05e43a6480b29425f087874136436cefe786", + "hash_raw": "d6af4ec18df180c7417353b52a9e05e43a6480b29425f087874136436cefe786", + "size": 4096, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "d6af4ec18df180c7417353b52a9e05e43a6480b29425f087874136436cefe786" + }, + { + "name": "systemrw", + "url": "https://commadist.azureedge.net/agnosupdate/systemrw-8ce150ca38ef64a0885fc2fe816e5b63bae8adb4df5d809c5b318e6996366c7e.img.xz", + "hash": "8ce150ca38ef64a0885fc2fe816e5b63bae8adb4df5d809c5b318e6996366c7e", + "hash_raw": "8ce150ca38ef64a0885fc2fe816e5b63bae8adb4df5d809c5b318e6996366c7e", + "size": 16777216, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "8ce150ca38ef64a0885fc2fe816e5b63bae8adb4df5d809c5b318e6996366c7e" + }, + { + "name": "cache", + "url": "https://commadist.azureedge.net/agnosupdate/cache-ebfbaaa2f96dc4e5fea4f126364e5bf5b3b44c12cbc753b62fdd8baab82f70b4.img.xz", + "hash": "ebfbaaa2f96dc4e5fea4f126364e5bf5b3b44c12cbc753b62fdd8baab82f70b4", + "hash_raw": "ebfbaaa2f96dc4e5fea4f126364e5bf5b3b44c12cbc753b62fdd8baab82f70b4", + "size": 134217728, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "ebfbaaa2f96dc4e5fea4f126364e5bf5b3b44c12cbc753b62fdd8baab82f70b4" + }, + { + "name": "xbl", + "url": "https://commadist.azureedge.net/agnosupdate/xbl-dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6.img.xz", + "hash": "dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6", + "hash_raw": "dd45c0febdf0e022dab82ed0219370a86e8e6c0dfabfe29f3dab7eb1174d6bc6", + "size": 3282256, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "d47a08914d2376557b03f1231b7233508222c04b57d781f9daf77c63eab92c2e" + }, + { + "name": "xbl_config", + "url": "https://commadist.azureedge.net/agnosupdate/xbl_config-1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9.img.xz", + "hash": "1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9", + "hash_raw": "1074ae051df159ba6dba988d8f6ba2cfc304ed1466cce0db531df6f7b1e44aa9", + "size": 98124, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "e7d04d9f040c9c040cdf013335d0b6d6e9346311458baeb2461b193e954f5f1c" + }, + { + "name": "abl", + "url": "https://commadist.azureedge.net/agnosupdate/abl-556bbb4ed1c671402b217bd2f3c07edce4f88b0bbd64e92241b82e396aa9ebee.img.xz", + "hash": "556bbb4ed1c671402b217bd2f3c07edce4f88b0bbd64e92241b82e396aa9ebee", + "hash_raw": "556bbb4ed1c671402b217bd2f3c07edce4f88b0bbd64e92241b82e396aa9ebee", + "size": 274432, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "556bbb4ed1c671402b217bd2f3c07edce4f88b0bbd64e92241b82e396aa9ebee" + }, + { + "name": "aop", + "url": "https://commadist.azureedge.net/agnosupdate/aop-4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788.img.xz", + "hash": "4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788", + "hash_raw": "4d925c9248672e4a69a236991983375008c44997a854ee7846d1b5fd7c787788", + "size": 184364, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "3aa0a79149ec57f4bc8c38f7bbdf4f6630dd659e49a111ce6258d2d06a07c8e5" + }, + { + "name": "bluetooth", + "url": "https://commadist.azureedge.net/agnosupdate/bluetooth-9bb766d2d2ce0cc4491664b3010fe1ef62f8ffc1e362d55f78e48c4141f75533.img.xz", + "hash": "9bb766d2d2ce0cc4491664b3010fe1ef62f8ffc1e362d55f78e48c4141f75533", + "hash_raw": "9bb766d2d2ce0cc4491664b3010fe1ef62f8ffc1e362d55f78e48c4141f75533", + "size": 1048576, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "9bb766d2d2ce0cc4491664b3010fe1ef62f8ffc1e362d55f78e48c4141f75533" + }, + { + "name": "cmnlib64", + "url": "https://commadist.azureedge.net/agnosupdate/cmnlib64-1a876bd151bb9635f18719c4a17f953079de6e11d3eaec800968fc75669e0dc3.img.xz", + "hash": "1a876bd151bb9635f18719c4a17f953079de6e11d3eaec800968fc75669e0dc3", + "hash_raw": "1a876bd151bb9635f18719c4a17f953079de6e11d3eaec800968fc75669e0dc3", + "size": 524288, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "1a876bd151bb9635f18719c4a17f953079de6e11d3eaec800968fc75669e0dc3" + }, + { + "name": "cmnlib", + "url": "https://commadist.azureedge.net/agnosupdate/cmnlib-63df823e8a5fae01d66cb2b8c20f0d2ddb5c5f2425e5d0992a64676273ba1c82.img.xz", + "hash": "63df823e8a5fae01d66cb2b8c20f0d2ddb5c5f2425e5d0992a64676273ba1c82", + "hash_raw": "63df823e8a5fae01d66cb2b8c20f0d2ddb5c5f2425e5d0992a64676273ba1c82", + "size": 524288, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "63df823e8a5fae01d66cb2b8c20f0d2ddb5c5f2425e5d0992a64676273ba1c82" + }, + { + "name": "devcfg", + "url": "https://commadist.azureedge.net/agnosupdate/devcfg-2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585.img.xz", + "hash": "2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585", + "hash_raw": "2f374581243910db92f62bb13bd66ec8e3d56d434997ba007ded06d2d6cc8585", + "size": 40336, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "3d7bb33588491a2a40091a7e1cf6cb65e6dd503f69b640aba484d723f1ad47e8" + }, + { + "name": "devinfo", + "url": "https://commadist.azureedge.net/agnosupdate/devinfo-143869c499a7e878fbeab756e9c53074195770cc41d6d0d10e45c043141389a3.img.xz", + "hash": "143869c499a7e878fbeab756e9c53074195770cc41d6d0d10e45c043141389a3", + "hash_raw": "143869c499a7e878fbeab756e9c53074195770cc41d6d0d10e45c043141389a3", + "size": 4096, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "143869c499a7e878fbeab756e9c53074195770cc41d6d0d10e45c043141389a3" + }, + { + "name": "dsp", + "url": "https://commadist.azureedge.net/agnosupdate/dsp-4b15fbd2f45581f1553f33f01649e450b24aa19d5deff2ac7dcb16a534d9c248.img.xz", + "hash": "4b15fbd2f45581f1553f33f01649e450b24aa19d5deff2ac7dcb16a534d9c248", + "hash_raw": "4b15fbd2f45581f1553f33f01649e450b24aa19d5deff2ac7dcb16a534d9c248", + "size": 33554432, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "4b15fbd2f45581f1553f33f01649e450b24aa19d5deff2ac7dcb16a534d9c248" + }, + { + "name": "hyp", + "url": "https://commadist.azureedge.net/agnosupdate/hyp-ff5ece6a4e3d2b4d898c77ffe193fc8bbc8acebe78263996ecf52373d8088927.img.xz", + "hash": "ff5ece6a4e3d2b4d898c77ffe193fc8bbc8acebe78263996ecf52373d8088927", + "hash_raw": "ff5ece6a4e3d2b4d898c77ffe193fc8bbc8acebe78263996ecf52373d8088927", + "size": 524288, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "ff5ece6a4e3d2b4d898c77ffe193fc8bbc8acebe78263996ecf52373d8088927" + }, + { + "name": "keymaster", + "url": "https://commadist.azureedge.net/agnosupdate/keymaster-5c968c76f29b9a4d66fbe57e639bac6b7a2c83b1758e25abbaf5d276b8a6af04.img.xz", + "hash": "5c968c76f29b9a4d66fbe57e639bac6b7a2c83b1758e25abbaf5d276b8a6af04", + "hash_raw": "5c968c76f29b9a4d66fbe57e639bac6b7a2c83b1758e25abbaf5d276b8a6af04", + "size": 524288, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "5c968c76f29b9a4d66fbe57e639bac6b7a2c83b1758e25abbaf5d276b8a6af04" + }, + { + "name": "limits", + "url": "https://commadist.azureedge.net/agnosupdate/limits-94951a0f7aa55fb6cb975535ce4ebbfe6d695f04cb5424677b01c10dfa2e94e1.img.xz", + "hash": "94951a0f7aa55fb6cb975535ce4ebbfe6d695f04cb5424677b01c10dfa2e94e1", + "hash_raw": "94951a0f7aa55fb6cb975535ce4ebbfe6d695f04cb5424677b01c10dfa2e94e1", + "size": 4096, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "94951a0f7aa55fb6cb975535ce4ebbfe6d695f04cb5424677b01c10dfa2e94e1" + }, + { + "name": "logfs", + "url": "https://commadist.azureedge.net/agnosupdate/logfs-b8b5ac87f3d954404fc7ecbdd9ee3b5b0cf5691e5006e6ec55db4c899ff61220.img.xz", + "hash": "b8b5ac87f3d954404fc7ecbdd9ee3b5b0cf5691e5006e6ec55db4c899ff61220", + "hash_raw": "b8b5ac87f3d954404fc7ecbdd9ee3b5b0cf5691e5006e6ec55db4c899ff61220", + "size": 8388608, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "b8b5ac87f3d954404fc7ecbdd9ee3b5b0cf5691e5006e6ec55db4c899ff61220" + }, + { + "name": "modem", + "url": "https://commadist.azureedge.net/agnosupdate/modem-a3d014f0896d77a2df7e5a80a70f43a51a047b9d03cfc675b6f0e31a6ecc4994.img.xz", + "hash": "a3d014f0896d77a2df7e5a80a70f43a51a047b9d03cfc675b6f0e31a6ecc4994", + "hash_raw": "a3d014f0896d77a2df7e5a80a70f43a51a047b9d03cfc675b6f0e31a6ecc4994", + "size": 125829120, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "a3d014f0896d77a2df7e5a80a70f43a51a047b9d03cfc675b6f0e31a6ecc4994" + }, + { + "name": "qupfw", + "url": "https://commadist.azureedge.net/agnosupdate/qupfw-64cc7c29d5d69b04267452b8b4ddba9f4809e68f476fc162ca283f58537afe4a.img.xz", + "hash": "64cc7c29d5d69b04267452b8b4ddba9f4809e68f476fc162ca283f58537afe4a", + "hash_raw": "64cc7c29d5d69b04267452b8b4ddba9f4809e68f476fc162ca283f58537afe4a", + "size": 65536, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "64cc7c29d5d69b04267452b8b4ddba9f4809e68f476fc162ca283f58537afe4a" + }, + { + "name": "splash", + "url": "https://commadist.azureedge.net/agnosupdate/splash-5c61260048f22ede6e6343fabb27f6ff73f9271f4751a01aaf7abf097afc1f08.img.xz", + "hash": "5c61260048f22ede6e6343fabb27f6ff73f9271f4751a01aaf7abf097afc1f08", + "hash_raw": "5c61260048f22ede6e6343fabb27f6ff73f9271f4751a01aaf7abf097afc1f08", + "size": 34226176, + "sparse": false, + "full_check": true, + "has_ab": false, + "ondevice_hash": "5c61260048f22ede6e6343fabb27f6ff73f9271f4751a01aaf7abf097afc1f08" + }, + { + "name": "storsec", + "url": "https://commadist.azureedge.net/agnosupdate/storsec-4494d86f68b125fbf2c004c824b1c6dbe71e61a65d2a1cc7db13c553edcb3fce.img.xz", + "hash": "4494d86f68b125fbf2c004c824b1c6dbe71e61a65d2a1cc7db13c553edcb3fce", + "hash_raw": "4494d86f68b125fbf2c004c824b1c6dbe71e61a65d2a1cc7db13c553edcb3fce", + "size": 131072, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "4494d86f68b125fbf2c004c824b1c6dbe71e61a65d2a1cc7db13c553edcb3fce" + }, + { + "name": "tz", + "url": "https://commadist.azureedge.net/agnosupdate/tz-e9443bf187641661bfa6c96702b9ab0156e72fb7482500f8799ba9ee2503cb16.img.xz", + "hash": "e9443bf187641661bfa6c96702b9ab0156e72fb7482500f8799ba9ee2503cb16", + "hash_raw": "e9443bf187641661bfa6c96702b9ab0156e72fb7482500f8799ba9ee2503cb16", + "size": 2097152, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "e9443bf187641661bfa6c96702b9ab0156e72fb7482500f8799ba9ee2503cb16" + }, + { + "name": "boot", + "url": "https://commadist.azureedge.net/agnosupdate/boot-a0185fa5ffc860de2179e4d0fec703fef6d560eacd730f79f60891ca79c72756.img.xz", + "hash": "a0185fa5ffc860de2179e4d0fec703fef6d560eacd730f79f60891ca79c72756", + "hash_raw": "a0185fa5ffc860de2179e4d0fec703fef6d560eacd730f79f60891ca79c72756", + "size": 17496064, + "sparse": false, + "full_check": true, + "has_ab": true, + "ondevice_hash": "0ee1ab104bb46d0f72e7d0b7d3e94629a7644a368896c6d4c558554fb955a08a" + }, + { + "name": "system", + "url": "https://commadist.azureedge.net/agnosupdate/system-0cf8cb01e40d05d6d325afe68b934a6c0dda3a56703b2ef3e3de637d754ae5dd.img.xz", + "hash": "7c58308be461126677ba02e9c9739556520ee02958934733867d86ecfe2e58e9", + "hash_raw": "0cf8cb01e40d05d6d325afe68b934a6c0dda3a56703b2ef3e3de637d754ae5dd", + "size": 4718592000, + "sparse": true, + "full_check": false, + "has_ab": true, + "ondevice_hash": "826790516410c325aa30265846946d06a556f0a7b23c957f65fd11c055a663da", + "alt": { + "hash": "0cf8cb01e40d05d6d325afe68b934a6c0dda3a56703b2ef3e3de637d754ae5dd", + "url": "https://commadist.azureedge.net/agnosupdate/system-0cf8cb01e40d05d6d325afe68b934a6c0dda3a56703b2ef3e3de637d754ae5dd.img", + "size": 4718592000 + } + }, + { + "name": "userdata_90", + "url": "https://commadist.azureedge.net/agnosupdate/userdata_90-ec31b8116125a95755adb32853c401c462a14a74f538535532bf2c34d72c60eb.img.xz", + "hash": "aa0f0fe32187493e6135aee9e984d3f9705fc58560d537b34687bb6b51a38428", + "hash_raw": "ec31b8116125a95755adb32853c401c462a14a74f538535532bf2c34d72c60eb", + "size": 96636764160, + "sparse": true, + "full_check": true, + "has_ab": false, + "ondevice_hash": "9c916b7d05543d4608b0401bc867639f44ce9671639a1a6da83b6d58b4eaa1b4" + }, + { + "name": "userdata_89", + "url": "https://commadist.azureedge.net/agnosupdate/userdata_89-7f092cc841124c10300e43574e90e3367e983bfbe4faa0969024e79e5ce90b11.img.xz", + "hash": "fa83d4b7096857136820b0b0a8785c90677256b054c5c14039cd7b9b1065a90b", + "hash_raw": "7f092cc841124c10300e43574e90e3367e983bfbe4faa0969024e79e5ce90b11", + "size": 95563022336, + "sparse": true, + "full_check": true, + "has_ab": false, + "ondevice_hash": "1699e38de769eb32c21dfa6a5ac21eb3ad620a362c7b8abf1a2c0afe0f717530" + }, + { + "name": "userdata_30", + "url": "https://commadist.azureedge.net/agnosupdate/userdata_30-3df2dcd5e1f426c90b090fdbcd1a95b035d96a4bdaf88d5517245db5ee84f5ed.img.xz", + "hash": "890910f20b1ad88a728ee822a47b1234eb3d70cab28ca8a935679c8c2d33cbe9", + "hash_raw": "3df2dcd5e1f426c90b090fdbcd1a95b035d96a4bdaf88d5517245db5ee84f5ed", + "size": 32212254720, + "sparse": true, + "full_check": true, + "has_ab": false, + "ondevice_hash": "8e7cb392dd6e49c7d59fa850be7d1f44901314c86ba9c88be5bb27a0cd1123c9" + } +] \ No newline at end of file diff --git a/iqpilot/system/hardware/tici/amplifier.py b/iqpilot/system/hardware/tici/amplifier.py new file mode 100644 index 000000000..48a34ea48 --- /dev/null +++ b/iqpilot/system/hardware/tici/amplifier.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +import time +from collections import namedtuple + +from iqpilot.common.i2c import SMBus + +# https://datasheets.maximintegrated.com/en/ds/MAX98089.pdf + +AmpConfig = namedtuple('AmpConfig', ['name', 'value', 'register', 'offset', 'mask']) +EQParams = namedtuple('EQParams', ['K', 'k1', 'k2', 'c1', 'c2']) + + +def configs_from_eq_params(base, eq_params): + return [ + AmpConfig("K (high)", (eq_params.K >> 8), base, 0, 0xFF), + AmpConfig("K (low)", (eq_params.K & 0xFF), base + 1, 0, 0xFF), + AmpConfig("k1 (high)", (eq_params.k1 >> 8), base + 2, 0, 0xFF), + AmpConfig("k1 (low)", (eq_params.k1 & 0xFF), base + 3, 0, 0xFF), + AmpConfig("k2 (high)", (eq_params.k2 >> 8), base + 4, 0, 0xFF), + AmpConfig("k2 (low)", (eq_params.k2 & 0xFF), base + 5, 0, 0xFF), + AmpConfig("c1 (high)", (eq_params.c1 >> 8), base + 6, 0, 0xFF), + AmpConfig("c1 (low)", (eq_params.c1 & 0xFF), base + 7, 0, 0xFF), + AmpConfig("c2 (high)", (eq_params.c2 >> 8), base + 8, 0, 0xFF), + AmpConfig("c2 (low)", (eq_params.c2 & 0xFF), base + 9, 0, 0xFF), + ] + + +BASE_CONFIG = [ + AmpConfig("MCLK prescaler", 0b01, 0x10, 4, 0b00110000), + AmpConfig("PM: enable speakers", 0b11, 0x4D, 4, 0b00110000), + AmpConfig("PM: enable DACs", 0b11, 0x4D, 0, 0b00000011), + AmpConfig("Enable PLL1", 0b1, 0x12, 7, 0b10000000), + AmpConfig("Enable PLL2", 0b1, 0x1A, 7, 0b10000000), + AmpConfig("DAI1: I2S mode", 0b00100, 0x14, 2, 0b01111100), + AmpConfig("DAI2: I2S mode", 0b00100, 0x1C, 2, 0b01111100), + AmpConfig("DAI1 Passband filtering: music mode", 0b1, 0x18, 7, 0b10000000), + AmpConfig("DAI1 voice mode gain (DV1G)", 0b00, 0x2F, 4, 0b00110000), + AmpConfig("DAI1 attenuation (DV1)", 0x0, 0x2F, 0, 0b00001111), + AmpConfig("DAI2 attenuation (DV2)", 0x0, 0x31, 0, 0b00001111), + AmpConfig("DAI2: DC blocking", 0b1, 0x20, 0, 0b00000001), + AmpConfig("DAI2: High sample rate", 0b0, 0x20, 3, 0b00001000), + AmpConfig("ALC enable", 0b1, 0x43, 7, 0b10000000), + AmpConfig("ALC/excursion limiter release time", 0b101, 0x43, 4, 0b01110000), + AmpConfig("ALC multiband enable", 0b1, 0x43, 3, 0b00001000), + AmpConfig("DAI1 EQ enable", 0b0, 0x49, 0, 0b00000001), + AmpConfig("DAI2 EQ clip detection disabled", 0b1, 0x32, 4, 0b00010000), + AmpConfig("DAI2 EQ attenuation", 0x5, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b100, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter lower corner freq", 0b00, 0x41, 0, 0b00000011), + AmpConfig("Excursion limiter threshold", 0b000, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x6, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b0, 0x46, 0, 0b00000001), + AmpConfig("Right DAC input mixer: DAI1 left", 0b0, 0x22, 3, 0b00001000), + AmpConfig("Right DAC input mixer: DAI1 right", 0b0, 0x22, 2, 0b00000100), + AmpConfig("Right DAC input mixer: DAI2 left", 0b1, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b0, 0x22, 0, 0b00000001), + AmpConfig("DAI1 audio port selector", 0b10, 0x16, 6, 0b11000000), + AmpConfig("DAI2 audio port selector", 0b01, 0x1E, 6, 0b11000000), + AmpConfig("Enable left digital microphone", 0b1, 0x48, 5, 0b00100000), + AmpConfig("Enable right digital microphone", 0b1, 0x48, 4, 0b00010000), + AmpConfig("Enhanced volume smoothing disabled", 0b0, 0x49, 7, 0b10000000), + AmpConfig("Volume adjustment smoothing disabled", 0b0, 0x49, 6, 0b01000000), + AmpConfig("Zero-crossing detection disabled", 0b0, 0x49, 5, 0b00100000), +] + +CONFIGS = { + "tici": [ + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Right speaker output volume", 0x1c, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b1, 0x49, 1, 0b00000010), + *configs_from_eq_params(0x84, EQParams(0x274F, 0xC0FF, 0x3BF9, 0x0B3C, 0x1656)), + *configs_from_eq_params(0x8E, EQParams(0x1009, 0xC6BF, 0x2952, 0x1C97, 0x30DF)), + *configs_from_eq_params(0x98, EQParams(0x0F75, 0xCBE5, 0x0ED2, 0x2528, 0x3E42)), + *configs_from_eq_params(0xA2, EQParams(0x091F, 0x3D4C, 0xCE11, 0x1266, 0x2807)), + *configs_from_eq_params(0xAC, EQParams(0x0A9E, 0x3F20, 0xE573, 0x0A8B, 0x3A3B)), + ], + "tizi": [ + AmpConfig("Left speaker output from left DAC", 0b1, 0x2B, 0, 0b11111111), + AmpConfig("Right speaker output from right DAC", 0b1, 0x2C, 0, 0b11111111), + AmpConfig("Left Speaker Mixer Gain", 0b00, 0x2D, 0, 0b00000011), + AmpConfig("Right Speaker Mixer Gain", 0b00, 0x2D, 2, 0b00001100), + AmpConfig("Left speaker output volume", 0x17, 0x3D, 0, 0b00011111), + AmpConfig("Right speaker output volume", 0x17, 0x3E, 0, 0b00011111), + AmpConfig("DAI2 EQ enable", 0b0, 0x49, 1, 0b00000010), + AmpConfig("DAI2: DC blocking", 0b0, 0x20, 0, 0b00000001), + AmpConfig("ALC enable", 0b0, 0x43, 7, 0b10000000), + AmpConfig("DAI2 EQ attenuation", 0x2, 0x32, 0, 0b00001111), + AmpConfig("Excursion limiter upper corner freq", 0b001, 0x41, 4, 0b01110000), + AmpConfig("Excursion limiter threshold", 0b100, 0x42, 0, 0b00001111), + AmpConfig("Distortion limit (THDCLP)", 0x0, 0x46, 4, 0b11110000), + AmpConfig("Distortion limiter release time constant", 0b1, 0x46, 0, 0b00000001), + AmpConfig("Left DAC input mixer: DAI1 left", 0b0, 0x22, 7, 0b10000000), + AmpConfig("Left DAC input mixer: DAI1 right", 0b0, 0x22, 6, 0b01000000), + AmpConfig("Left DAC input mixer: DAI2 left", 0b1, 0x22, 5, 0b00100000), + AmpConfig("Left DAC input mixer: DAI2 right", 0b0, 0x22, 4, 0b00010000), + AmpConfig("Right DAC input mixer: DAI2 left", 0b0, 0x22, 1, 0b00000010), + AmpConfig("Right DAC input mixer: DAI2 right", 0b1, 0x22, 0, 0b00000001), + AmpConfig("Volume adjustment smoothing disabled", 0b1, 0x49, 6, 0b01000000), + ], +} + + +class Amplifier: + AMP_I2C_BUS = 0 + AMP_ADDRESS = 0x10 + + def __init__(self, debug=False): + self.debug = debug + + def _get_shutdown_config(self, amp_disabled: bool) -> AmpConfig: + return AmpConfig("Global shutdown", 0b0 if amp_disabled else 0b1, 0x51, 7, 0b10000000) + + def _set_configs(self, configs: list[AmpConfig]) -> None: + with SMBus(self.AMP_I2C_BUS) as bus: + for config in configs: + if self.debug: + print(f"Setting \"{config.name}\" to {config.value}:") + + old_value = bus.read_byte_data(self.AMP_ADDRESS, config.register, force=True) + new_value = (old_value & (~config.mask)) | ((config.value << config.offset) & config.mask) + bus.write_byte_data(self.AMP_ADDRESS, config.register, new_value, force=True) + + if self.debug: + print(f" Changed {hex(config.register)}: {hex(old_value)} -> {hex(new_value)}") + + def set_configs(self, configs: list[AmpConfig]) -> bool: + tries = 15 + backoff = 0. + for i in range(tries): + try: + self._set_configs(configs) + return True + except OSError: + backoff += 0.1 + time.sleep(backoff) + print(f"Failed to set amp config, {tries - i - 1} retries left") + return False + + def set_global_shutdown(self, amp_disabled: bool) -> bool: + return self.set_configs([self._get_shutdown_config(amp_disabled), ]) + + def initialize_configuration(self, model: str) -> bool: + cfgs = [ + self._get_shutdown_config(True), + *BASE_CONFIG, + *CONFIGS[model], + self._get_shutdown_config(False), + ] + return self.set_configs(cfgs) + + +if __name__ == "__main__": + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + model = model.split('comma ')[-1] + + amp = Amplifier() + amp.initialize_configuration(model) diff --git a/iqpilot/system/hardware/tici/esim.nmconnection b/iqpilot/system/hardware/tici/esim.nmconnection new file mode 100644 index 000000000..74f6f8e82 --- /dev/null +++ b/iqpilot/system/hardware/tici/esim.nmconnection @@ -0,0 +1,30 @@ +[connection] +id=esim +uuid=fff6553c-3284-4707-a6b1-acc021caaafb +type=gsm +permissions= +autoconnect=true +autoconnect-retries=100 +autoconnect-priority=2 +metered=1 + +[gsm] +apn= +home-only=false +auto-config=true +sim-id= + +[ipv4] +route-metric=1000 +dns-priority=1000 +dns-search= +method=auto + +[ipv6] +ddr-gen-mode=stable-privacy +dns-search= +route-metric=1000 +dns-priority=1000 +method=auto + +[proxy] diff --git a/iqpilot/system/hardware/tici/esim_manager.py b/iqpilot/system/hardware/tici/esim_manager.py new file mode 100644 index 000000000..af08fd059 --- /dev/null +++ b/iqpilot/system/hardware/tici/esim_manager.py @@ -0,0 +1,290 @@ +import threading +import subprocess +import time +from dataclasses import dataclass +from enum import Enum +from queue import Queue, Empty +from typing import Callable + +from iqpilot.common.params import Params +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.hardware.base import LPAError, LPAProfileNotFoundError, Profile + + +class EsimOperationState(Enum): + IDLE = "idle" + SCANNING = "scanning" + DOWNLOADING = "downloading" + SWITCHING = "switching" + RENAMING = "renaming" + DELETING = "deleting" + REBOOTING_MODEM = "rebooting modem" + COMPLETED = "completed" + FAILED = "failed" + + +@dataclass +class EsimUiState: + state: EsimOperationState = EsimOperationState.IDLE + message: str = "" + profiles: list[Profile] | None = None + busy: bool = False + + +class EsimManager: + def __init__(self): + self._params = Params() + self._lock = threading.Lock() + self._callbacks: list[Callable[[EsimUiState], None]] = [] + self._state = EsimUiState() + self._support_cache: bool | None = None + self._support_cache_ts = 0.0 + + self._ops: Queue[Callable[[], None]] = Queue() + self._worker = threading.Thread(target=self._worker_loop, daemon=True) + self._worker.start() + + def is_supported(self) -> bool: + raw_flag = self._params.get("EnableEsimProvisioning") + enabled = True if raw_flag is None else self._params.get_bool("EnableEsimProvisioning") + if not enabled: + return False + if HARDWARE.get_device_type() not in ("tici", "tizi", "mici"): + return False + return self._has_euicc() + + def _has_euicc(self, force_refresh: bool = False) -> bool: + now = time.monotonic() + if not force_refresh and self._support_cache is not None and now - self._support_cache_ts < 5.0: + return self._support_cache + + supported = self._query_euicc_support() + self._support_cache = supported + self._support_cache_ts = now + return supported + + @staticmethod + def _query_euicc_support() -> bool: + try: + res = subprocess.run( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-get-slot-status"], + capture_output=True, text=True, check=False, timeout=8, + ) + except Exception: + return False + + output = f"{res.stdout}\n{res.stderr}" + if "Is eUICC: yes" in output: + return True + if "Is eUICC: no" in output: + return False + return False + + def add_callback(self, cb: Callable[[EsimUiState], None]) -> None: + with self._lock: + self._callbacks.append(cb) + state = self._copy_state_locked() + cb(state) + + def remove_callback(self, cb: Callable[[EsimUiState], None]) -> None: + with self._lock: + self._callbacks = [c for c in self._callbacks if c is not cb] + + def get_state(self) -> EsimUiState: + with self._lock: + return self._copy_state_locked() + + def refresh_profiles(self) -> None: + if not self._is_supported_for_operation(): + self._set_profiles([]) + self._set_state(EsimOperationState.IDLE, self._unavailable_message(), busy=False) + return + self._enqueue(self._refresh_profiles) + + def is_comma_profile(self, iccid: str) -> bool: + try: + return HARDWARE.get_sim_lpa().is_comma_profile(iccid) + except Exception: + return False + + def add_profile(self, activation_code: str, nickname: str | None = None) -> None: + def _op() -> None: + self._set_state(EsimOperationState.DOWNLOADING, "Downloading profile...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.download_profile(activation_code, nickname=nickname) + self._set_state(EsimOperationState.REBOOTING_MODEM, "Reconnecting modem...", busy=True) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Profile added", busy=False) + self._enqueue(_op) + + def switch_profile(self, iccid: str) -> None: + def _op() -> None: + self._set_state(EsimOperationState.SWITCHING, "Switching profile...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.switch_profile(iccid) + self._set_state(EsimOperationState.REBOOTING_MODEM, "Reconnecting modem...", busy=True) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Profile switched", busy=False) + self._enqueue(_op) + + def rename_profile(self, iccid: str, nickname: str) -> None: + def _op() -> None: + self._set_state(EsimOperationState.RENAMING, "Renaming profile...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.nickname_profile(iccid, nickname) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Profile renamed", busy=False) + self._enqueue(_op) + + def delete_profile(self, iccid: str) -> None: + def _op() -> None: + self._set_state(EsimOperationState.DELETING, "Deleting profile...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.delete_profile(iccid) + self._set_state(EsimOperationState.REBOOTING_MODEM, "Reconnecting modem...", busy=True) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Profile deleted", busy=False) + self._enqueue(_op) + + def bootstrap(self) -> None: + def _op() -> None: + self._set_state(EsimOperationState.DELETING, "Removing Comma pSIM...", busy=True) + lpa = HARDWARE.get_sim_lpa() + lpa.bootstrap() + self._set_state(EsimOperationState.REBOOTING_MODEM, "Reconnecting modem...", busy=True) + self._refresh_profiles() + self._set_state(EsimOperationState.COMPLETED, "Comma pSIM removed", busy=False) + self._enqueue(_op) + + def set_scanning_state(self, scanning: bool) -> None: + if scanning: + self._set_state(EsimOperationState.SCANNING, "Point camera at an eSIM QR code", busy=True) + else: + self._set_state(EsimOperationState.IDLE, "", busy=False) + + def _enqueue(self, fn: Callable[[], None]) -> None: + if not self._is_supported_for_operation(): + self._set_state(EsimOperationState.FAILED, self._unavailable_message(), busy=False) + return + self._ops.put(fn) + + def _is_supported_for_operation(self) -> bool: + raw_flag = self._params.get("EnableEsimProvisioning") + enabled = True if raw_flag is None else self._params.get_bool("EnableEsimProvisioning") + if not enabled: + return False + if HARDWARE.get_device_type() not in ("tici", "tizi", "mici"): + return False + return self._has_euicc(force_refresh=True) + + def _unavailable_message(self) -> str: + if HARDWARE.get_device_type() in ("tici", "tizi", "mici"): + return "Insert the original comma SIM card that came with the device to use eSIM" + return "eSIM provisioning is unavailable on this device" + + def _worker_loop(self) -> None: + while True: + try: + op = self._ops.get(timeout=0.2) + except Empty: + continue + try: + op() + except Exception as e: + self._set_state(EsimOperationState.FAILED, self._map_error(e), busy=False) + finally: + self._ops.task_done() + + def _refresh_profiles(self) -> None: + if not self._is_supported_for_operation(): + self._set_profiles([]) + return + profiles = HARDWARE.get_sim_lpa().list_profiles() + self._set_profiles(profiles) + + def _set_profiles(self, profiles: list[Profile]) -> None: + with self._lock: + self._state.profiles = profiles + state = self._copy_state_locked() + callbacks = list(self._callbacks) + for cb in callbacks: + cb(state) + + def _set_state(self, state: EsimOperationState, message: str, busy: bool) -> None: + with self._lock: + self._state.state = state + self._state.message = message + self._state.busy = busy + snapshot = self._copy_state_locked() + callbacks = list(self._callbacks) + for cb in callbacks: + cb(snapshot) + + def _copy_state_locked(self) -> EsimUiState: + profiles = list(self._state.profiles) if self._state.profiles is not None else None + return EsimUiState( + state=self._state.state, + message=self._state.message, + profiles=profiles, + busy=self._state.busy, + ) + + @staticmethod + def _map_error(error: Exception) -> str: + if isinstance(error, LPAProfileNotFoundError): + return "Profile not found" + if isinstance(error, LPAError): + message = str(error) + lower = message.lower() + if "is euicc: no" in lower or "reports no euicc support" in lower: + return "Insert the original comma SIM to enable eSIM provisioning on this device" + if "certificate verify failed" in lower or "ssl" in lower or "tls" in lower: + return "TLS validation failed while contacting SM-DP+" + if "system time is not set" in lower: + return "Device time is invalid; connect to network and retry" + if "returned no modems" in lower or "object does not exist at path" in lower: + return "Modem is restarting; wait a moment and refresh profiles" + if "timed out" in lower or "timeout" in lower: + return "Modem timed out while provisioning eSIM" + if "delete the existing comma psim profile" in lower: + return "Delete the Comma pSIM profile before activating RedPocket" + if "not bootstrapped" in lower: + return "Delete the Comma pSIM profile before using user eSIM profiles" + if "cannot delete active profile" in lower: + return "Cannot delete active profile" + if "profile delete may have succeeded" in lower: + return "Profile may already be deleted; refresh profiles" + if "profile delete did not finish cleanly" in lower: + return "Profile delete did not complete; refresh profiles and retry" + if "profile switch may have succeeded" in lower: + return "Profile likely switched; refresh profiles" + if "profile switch did not finish cleanly" in lower: + return "Profile switch did not complete; refresh profiles and retry" + if "profile add may have succeeded" in lower: + return "Profile may already be added; refresh profiles" + if "profile add did not finish cleanly" in lower: + return "Profile add did not complete; refresh profiles and retry" + if "profile enable may have succeeded" in lower: + return "Profile may already be enabled; refresh profiles" + if "profile enable did not finish cleanly" in lower: + return "Profile enable did not complete; refresh profiles and retry" + if "profile disable may have succeeded" in lower: + return "Profile may already be disabled; refresh profiles" + if "profile disable did not finish cleanly" in lower: + return "Profile disable did not complete; refresh profiles and retry" + if "bf2800" in lower or "listnotification" in lower: + return "Modem notification cleanup failed; refresh profiles" + return message + return str(error) + + +_ESIM_MANAGER: EsimManager | None = None +_ESIM_MANAGER_LOCK = threading.Lock() + + +def get_esim_manager() -> EsimManager: + global _ESIM_MANAGER + with _ESIM_MANAGER_LOCK: + if _ESIM_MANAGER is None: + _ESIM_MANAGER = EsimManager() + return _ESIM_MANAGER diff --git a/iqpilot/system/hardware/tici/gsma_ci_bundle.pem b/iqpilot/system/hardware/tici/gsma_ci_bundle.pem new file mode 100644 index 000000000..3ee7fd125 --- /dev/null +++ b/iqpilot/system/hardware/tici/gsma_ci_bundle.pem @@ -0,0 +1,133 @@ +# GSMA Certificate Issuer (CI) bundle for eSIM RSP +# Source: https://euicc-manual.osmocom.org/docs/pki/ci/bundle.pem + +issuer= + countryName = CH + organizationName = OISTE Foundation + commonName = OISTE GSMA CI G1 +notBefore=2024-01-16 23:17:39Z +notAfter=2059-01-07 23:17:38Z +-----BEGIN CERTIFICATE----- +MIIB9zCCAZ2gAwIBAgIUSpBSCCDYPOEG/IFHUCKpZ2pIAQMwCgYIKoZIzj0EAwIw +QzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xGTAXBgNV +BAMMEE9JU1RFIEdTTUEgQ0kgRzEwIBcNMjQwMTE2MjMxNzM5WhgPMjA1OTAxMDcy +MzE3MzhaMEMxCzAJBgNVBAYTAkNIMRkwFwYDVQQKDBBPSVNURSBGb3VuZGF0aW9u +MRkwFwYDVQQDDBBPSVNURSBHU01BIENJIEcxMFkwEwYHKoZIzj0CAQYIKoZIzj0D +AQcDQgAEvZ3s3PFC4NgrCcCMmHJ6DJ66uzAHuLcvjJnOn+TtBNThS7YHLDyHCa2v +7D+zTP+XTtgqgcLoB56Gha9EQQQ4xKNtMGswDwYDVR0TAQH/BAUwAwEB/zAQBgNV +HREECTAHiAVghXQFDjAXBgNVHSABAf8EDTALMAkGB2eBEgECAQAwHQYDVR0OBBYE +FEwnlnrSDBSzkelgHkHmBK1XwCIvMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQD +AgNIADBFAiBVcywTj017jKpAQ+gwy4MqK2hQvzve6lkvQkgSP6ykHwIhAI0KFwCD +jnPbmcJsG41hUrWNlf+IcrMvFuYii0DasBNi +-----END CERTIFICATE----- +issuer= + organizationName = GSM Association + commonName = GSM Association - RSP2 Root CI1 +notBefore=2017-02-22 00:00:00Z +notAfter=2052-02-21 23:59:59Z +-----BEGIN CERTIFICATE----- +MIICSTCCAe+gAwIBAgIQbmhWeneg7nyF7hg5Y9+qejAKBggqhkjOPQQDAjBEMRgw +FgYDVQQKEw9HU00gQXNzb2NpYXRpb24xKDAmBgNVBAMTH0dTTSBBc3NvY2lhdGlv +biAtIFJTUDIgUm9vdCBDSTEwIBcNMTcwMjIyMDAwMDAwWhgPMjA1MjAyMjEyMzU5 +NTlaMEQxGDAWBgNVBAoTD0dTTSBBc3NvY2lhdGlvbjEoMCYGA1UEAxMfR1NNIEFz +c29jaWF0aW9uIC0gUlNQMiBSb290IENJMTBZMBMGByqGSM49AgEGCCqGSM49AwEH +A0IABJ1qutL0HCMX52GJ6/jeibsAqZfULWj/X10p/Min6seZN+hf5llovbCNuB2n +unLz+O8UD0SUCBUVo8e6n9X1TuajgcAwgb0wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wEwYDVR0RBAwwCogIKwYBBAGC6WAwFwYDVR0gAQH/BA0wCzAJ +BgdngRIBAgEAME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9nc21hLWNybC5zeW1h +dXRoLmNvbS9vZmZsaW5lY2EvZ3NtYS1yc3AyLXJvb3QtY2kxLmNybDAdBgNVHQ4E +FgQUgTcPUSXQsdQI1MOyMubSXnlb6/swCgYIKoZIzj0EAwIDSAAwRQIgIJdYsOMF +WziPK7l8nh5mu0qiRiVf25oa9ullG/OIASwCIQDqCmDrYf+GziHXBOiwJwnBaeBO +aFsiLzIEOaUuZwdNUw== +-----END CERTIFICATE----- +issuer= + countryName = US + organizationName = Entrust, Inc. + organizationalUnitName = See www.entrust.net/legal-terms + organizationalUnitName = (c) 2016 Entrust, Inc. - for authorized use only + commonName = Entrust eSIM Certification Authority +notBefore=2016-11-16 16:04:02Z +notAfter=2051-10-16 16:34:02Z +-----BEGIN CERTIFICATE----- +MIIC6DCCAo2gAwIBAgIRAIy4GT7M5nHsAAAAAFgsinowCgYIKoZIzj0EAwIwgbkx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9T +ZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAx +NiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxLTArBgNV +BAMTJEVudHJ1c3QgZVNJTSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAgFw0xNjEx +MTYxNjA0MDJaGA8yMDUxMTAxNjE2MzQwMlowgbkxCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxLTArBgNVBAMTJEVudHJ1c3QgZVNJTSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA +BAdzwGHeQ1Wb2f4DmHTByR5/IWL3JugQ1U3908a++bHdlt+TTA7K4c5cYZ+51Yz/ +hg/bacxguPDh9uQUK6Wg3a6jcjBwMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMBcGA1UdIAEB/wQNMAswCQYHZ4ESAQIBADAVBgNVHREEDjAMiApghkgB +hvpsFAoAMB0GA1UdDgQWBBQWcEt/NR42B/GMS3AAXDoAPf1BSjAKBggqhkjOPQQD +AgNJADBGAiEAspjXMvaBZyAg86Z0AAtT0yBRAi1EyaAfNz9kDJeAE04CIQC3efj8 +ATL7/tDBOhANy3cK8PS/1NIlu9vqMLCZsZvJ0Q== +-----END CERTIFICATE----- +issuer= + countryName = FR + organizationName = OBERTHUR TECHNOLOGIES + organizationalUnitName = TELECOM + commonName = MC4 OT ROOT CI v1 +notBefore=2016-11-15 00:00:01Z +notAfter=2046-11-08 23:59:59Z +-----BEGIN CERTIFICATE----- +MIICOjCCAeGgAwIBAgIBATAKBggqhkjOPQQDAjBbMQswCQYDVQQGEwJGUjEeMBwG +A1UEChMVT0JFUlRIVVIgVEVDSE5PTE9HSUVTMRAwDgYDVQQLEwdURUxFQ09NMRow +GAYDVQQDExFNQzQgT1QgUk9PVCBDSSB2MTAeFw0xNjExMTUwMDAwMDFaFw00NjEx +MDgyMzU5NTlaMFsxCzAJBgNVBAYTAkZSMR4wHAYDVQQKExVPQkVSVEhVUiBURUNI +Tk9MT0dJRVMxEDAOBgNVBAsTB1RFTEVDT00xGjAYBgNVBAMTEU1DNCBPVCBST09U +IENJIHYxMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHb/Gajt3OZxuaDSklBQE +D4lOd6PGPLSvtfkM952ubdyy45tJwAeA0eEii0CLrFT6tcfXkW+H/5mQyMRXaAUk +T6OBlTCBkjAfBgNVHSMEGDAWgBTNbmC3LXoGPLyEYluR6A/jBAbhPjAdBgNVHQ4E +FgQUzW5gty16Bjy8hGJbkegP4wQG4T4wDgYDVR0PAQH/BAQDAgAGMBcGA1UdIAEB +/wQNMAswCQYHZ4ESAQIBADAWBgNVHREEDzANiAsrBgEEAYHvb7OITTAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIEw4Nc7f2fDtoH+6ON/bknfDQxmT +ikThXjhpLtSrSKN2AiAxHxgC87L0FDnH8dJNlkdGX9c0JIx6oLheIplfS6k+jg== +-----END CERTIFICATE----- +issuer= + commonName = SubMan V4.2 CI Google Pixel + organizationName = Giesecke and Devrient GmbH + organizationalUnitName = Mobile Security + countryName = DE +notBefore=2017-05-10 00:00:00Z +notAfter=2027-05-10 00:00:00Z +-----BEGIN CERTIFICATE----- +MIICaTCCAg6gAwIBAgICASwwCgYIKoZIzj0EAwIwczElMCMGA1UEAxMcIFN1Yk1h +biBWNC4yIENJIEdvb2dsZSBQaXhlbDEjMCEGA1UEChMaR2llc2Vja2UgYW5kIERl +dnJpZW50IEdtYkgxGDAWBgNVBAsTD01vYmlsZSBTZWN1cml0eTELMAkGA1UEBhMC +REUwHhcNMTcwNTEwMDAwMDAwWhcNMjcwNTEwMDAwMDAwWjBzMSUwIwYDVQQDExwg +U3ViTWFuIFY0LjIgQ0kgR29vZ2xlIFBpeGVsMSMwIQYDVQQKExpHaWVzZWNrZSBh +bmQgRGV2cmllbnQgR21iSDEYMBYGA1UECxMPTW9iaWxlIFNlY3VyaXR5MQswCQYD +VQQGEwJERTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHNorfaJsGzqWNawyAhl +IAv9QL2/+b9RsUoso06t/dKX1MRr5CUJ51acvv5TAFhQKIml+dwLbFnV5aO+8W6Z +wxajgZEwgY4wHwYDVR0jBBgwFoAUtg8LiX/WMLiM/tYWH46oCMU4KsMwHQYDVR0O +BBYEFLYPC4l/1jC4jP7WFh+OqAjFOCrDMA4GA1UdDwEB/wQEAwIBBjAXBgNVHSAB +Af8EDTALMAkGB2eBEgECAQAwDwYDVR0TAQH/BAUwAwEB/zASBgNVHREECzAJiAcr +BgEEAdwPMAoGCCqGSM49BAMCA0kAMEYCIQDpoZcuAQrjATW8U+AWqMUJ0dY6nWW1 +R1QmFzVZ1yMXSwIhALCvRqkCtgiavdeFeSgsSNbY5Fhd+QoCltuSh1U4TE7A +-----END CERTIFICATE----- +issuer= + countryName = DE + commonName = SubMan V4.2 CI + organizationName = Giesecke and Devrient + organizationalUnitName = Mobile Security +notBefore=2016-08-12 13:51:48Z +notAfter=2026-08-12 13:51:48Z +-----BEGIN CERTIFICATE----- +MIICUjCCAfigAwIBAgIDQgAAMAoGCCqGSM49BAMCMGAxCzAJBgNVBAYTAkRFMRcw +FQYDVQQDEw5TdWJNYW4gVjQuMiBDSTEeMBwGA1UEChMVR2llc2Vja2UgYW5kIERl +dnJpZW50MRgwFgYDVQQLEw9Nb2JpbGUgU2VjdXJpdHkwHhcNMTYwODEyMTM1MTQ4 +WhcNMjYwODEyMTM1MTQ4WjBgMQswCQYDVQQGEwJERTEXMBUGA1UEAxMOU3ViTWFu +IFY0LjIgQ0kxHjAcBgNVBAoTFUdpZXNlY2tlIGFuZCBEZXZyaWVudDEYMBYGA1UE +CxMPTW9iaWxlIFNlY3VyaXR5MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYIgl +VQr9wbXOlwPp8qMg5Df08Cli9Mc+lpr3Lwa9PlVA3QWlLeX4GfD4H3phLBqVIa17 +yHttmtheTxi0KoEqhKOBoDCBnTAdBgNVHQ4EFgQU6lOt7zMpuVCa/XVf1Ei4LcG8 +7P8wDgYDVR0PAQH/BAQDAgEGMBcGA1UdIAEB/wQNMAswCQYHZ4ESAQIBADAPBgNV +HRMBAf8EBTADAQH/MBIGA1UdEQQLMAmIBysGAQQB3A8wLgYDVR0fBCcwJTAjoCGg +H4YdaHR0cDovL2dpLWRlLmNvbS90ZXN0LmNybC5wZW0wCgYIKoZIzj0EAwIDSAAw +RQIhAMMx2L/VHDiOW+Fl/OuFmhCdizYM17Yn9zAVieKO2T0iAiANWtCMmY+DzkqK +yHxBFX0U2tBd682zP4DpgRt8j3Ylew== +-----END CERTIFICATE----- diff --git a/iqpilot/system/hardware/tici/hardware.py b/iqpilot/system/hardware/tici/hardware.py new file mode 100644 index 000000000..b9fa7fbff --- /dev/null +++ b/iqpilot/system/hardware/tici/hardware.py @@ -0,0 +1,740 @@ +import math +import os +import sys +import subprocess +import time +import tempfile +from enum import IntEnum +from functools import cached_property, lru_cache +from pathlib import Path + +from iqpilot.cereal import log +from iqpilot.common.utils import sudo_read, sudo_write +from iqpilot.common.gpio import gpio_set, gpio_init, get_irqs_for_action +from iqpilot.system.hardware.base import HardwareBase, LPABase, ThermalConfig, ThermalZone +from iqpilot.system.hardware.tici import iwlist +from iqpilot.system.hardware.tici.lpa import TiciLPA +from iqpilot.system.hardware.tici.pins import GPIO +from iqpilot.system.hardware.tici.amplifier import Amplifier + +NM = 'org.freedesktop.NetworkManager' +NM_CON_ACT = NM + '.Connection.Active' +NM_DEV = NM + '.Device' +NM_DEV_WL = NM + '.Device.Wireless' +NM_DEV_STATS = NM + '.Device.Statistics' +NM_AP = NM + '.AccessPoint' +DBUS_PROPS = 'org.freedesktop.DBus.Properties' + +MM = 'org.freedesktop.ModemManager1' +MM_MODEM = MM + ".Modem" +MM_MODEM_SIMPLE = MM + ".Modem.Simple" +MM_SIM = MM + ".Sim" + +class MM_MODEM_STATE(IntEnum): + FAILED = -1 + UNKNOWN = 0 + INITIALIZING = 1 + LOCKED = 2 + DISABLED = 3 + DISABLING = 4 + ENABLING = 5 + ENABLED = 6 + SEARCHING = 7 + REGISTERED = 8 + DISCONNECTING = 9 + CONNECTING = 10 + CONNECTED = 11 + +class NMActiveConnectionState(IntEnum): + UNKNOWN = 0 + ACTIVATING = 1 + ACTIVATED = 2 + DEACTIVATING = 3 + DEACTIVATED = 4 + +class NMMetered(IntEnum): + NM_METERED_UNKNOWN = 0 + NM_METERED_YES = 1 + NM_METERED_NO = 2 + NM_METERED_GUESS_YES = 3 + NM_METERED_GUESS_NO = 4 + +TIMEOUT = 0.1 +REFRESH_RATE_MS = 1000 + +NetworkType = log.DeviceState.NetworkType +NetworkStrength = log.DeviceState.NetworkStrength + +# https://developer.gnome.org/ModemManager/unstable/ModemManager-Flags-and-Enumerations.html#MMModemAccessTechnology +MM_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5 +MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14 + +# MMModemStateFailedReason +MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2 + + +def affine_irq(val, action): + irqs = get_irqs_for_action(action) + if len(irqs) == 0: + return + + for i in irqs: + sudo_write(str(val), f"/proc/irq/{i}/smp_affinity_list") + +@lru_cache +def get_device_type(): + # lru_cache and cache can cause memory leaks when used in classes + try: + with open("/sys/firmware/devicetree/base/model") as f: + model = f.read().strip('\x00') + except FileNotFoundError: + # off-device (e.g. the prebuilt build container fakes /TICI but has no + # devicetree); import must not crash. Not a real device type. + return "unknown" + return model.split('comma ')[-1] + +class Tici(HardwareBase): + @staticmethod + def _ensure_system_python_path() -> None: + system_site = "/usr/lib/python3/dist-packages" + if system_site not in sys.path and os.path.isdir(system_site): + sys.path.append(system_site) + + @staticmethod + def _run_direct_modem_command(command: str) -> None: + import serial + + last_error: Exception | None = None + for device in ("/dev/ttyUSB2", "/dev/ttyUSB3"): + if not os.path.exists(device): + continue + + try: + with serial.Serial(device, baudrate=9600, timeout=2) as modem: + modem.reset_input_buffer() + modem.write((command + "\r").encode("ascii")) + + deadline = time.monotonic() + 3.0 + while time.monotonic() < deadline: + line = modem.readline().decode(errors="ignore").strip() + if not line: + continue + if line == "OK": + return + if line == "ERROR" or "ERROR" in line: + raise RuntimeError(f"{device}: {line}") + raise TimeoutError(f"{device}: timed out waiting for modem response") + except Exception as e: + last_error = e + + if last_error is not None: + raise last_error + raise RuntimeError("No modem AT port available") + + @cached_property + def bus(self): + try: + import dbus + except ModuleNotFoundError: + self._ensure_system_python_path() + import dbus + return dbus.SystemBus() + + @cached_property + def nm(self): + return self.bus.get_object(NM, '/org/freedesktop/NetworkManager') + + @property # this should not be cached, in case the modemmanager restarts + def mm(self): + return self.bus.get_object(MM, '/org/freedesktop/ModemManager1') + + @cached_property + def amplifier(self): + if self.get_device_type() == "mici": + return None + if os.path.exists('/tmp/lite_hw') or os.environ.get('LITE') == '1': + return None + return Amplifier() + + def get_os_version(self): + with open("/VERSION") as f: + return f.read().strip() + + def get_device_type(self): + return get_device_type() + + def reboot(self, reason=None): + subprocess.check_output(["sudo", "reboot"]) + + def uninstall(self): + Path("/data/__system_reset__").touch() + os.sync() + self.reboot() + + def get_serial(self): + return self.get_cmdline()['androidboot.serialno'] + + def get_voltage(self): + with open("/sys/class/hwmon/hwmon1/in1_input") as f: + return int(f.read()) + + def get_current(self): + with open("/sys/class/hwmon/hwmon1/curr1_input") as f: + return int(f.read()) + + def set_ir_power(self, percent: int): + if self.get_device_type() in ("tici", "tizi"): + return + + value = int((percent / 100) * 300) + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write("0\n") + with open("/sys/class/leds/led:torch_2/brightness", "w") as f: + f.write(f"{value}\n") + with open("/sys/class/leds/led:switch_2/brightness", "w") as f: + f.write(f"{value}\n") + + def get_network_type(self): + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_type = primary_connection.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if primary_type == '802-3-ethernet': + return NetworkType.ethernet + elif primary_type == '802-11-wireless': + return NetworkType.wifi + else: + active_connections = self.nm.Get(NM, 'ActiveConnections', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + for conn in active_connections: + c = self.bus.get_object(NM, conn) + tp = c.Get(NM_CON_ACT, 'Type', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if tp == 'gsm': + modem = self.get_modem() + modem_state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if modem_state < MM_MODEM_STATE.REGISTERED: + return NetworkType.none + access_t = modem.Get(MM_MODEM, 'AccessTechnologies', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if access_t >= MM_MODEM_ACCESS_TECHNOLOGY_LTE: + return NetworkType.cell4G + elif access_t >= MM_MODEM_ACCESS_TECHNOLOGY_UMTS: + return NetworkType.cell3G + else: + return NetworkType.cell2G + except Exception: + pass + + return NetworkType.none + + def get_modem(self): + objects = self.mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=TIMEOUT) + if not objects: + raise RuntimeError("ModemManager returned no modems") + modem_path = next(iter(objects)) + return self.bus.get_object(MM, modem_path) + + def get_wlan(self): + wlan_path = self.nm.GetDeviceByIpIface('wlan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wlan_path) + + def get_wwan(self): + wwan_path = self.nm.GetDeviceByIpIface('wwan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wwan_path) + + def get_sim_info(self): + modem = self.get_modem() + sim_path = modem.Get(MM_MODEM, 'Sim', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if sim_path == "/": + return { + 'sim_id': '', + 'mcc_mnc': None, + 'network_type': ["Unknown"], + 'sim_state': ["ABSENT"], + 'data_connected': False + } + else: + sim = self.bus.get_object(MM, sim_path) + return { + 'sim_id': str(sim.Get(MM_SIM, 'SimIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'mcc_mnc': str(sim.Get(MM_SIM, 'OperatorIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)), + 'network_type': ["Unknown"], + 'sim_state': ["READY"], + 'data_connected': modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) == MM_MODEM_STATE.CONNECTED, + } + + def get_sim_lpa(self) -> LPABase: + return TiciLPA() + + def get_imei(self, slot): + if slot != 0: + return "" + + return str(self.get_modem().Get(MM_MODEM, 'EquipmentIdentifier', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + + def get_network_info(self): + if self.get_device_type() == "mici": + return None + try: + modem = self.get_modem() + info = modem.Command("AT+QNWINFO", math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + extra = modem.Command('AT+QENG="servingcell"', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + if info and info.startswith('+QNWINFO: '): + info = info.replace('+QNWINFO: ', '').replace('"', '').split(',') + extra = "" if extra is None else extra.replace('+QENG: "servingcell",', '').replace('"', '') + state = "" if state is None else MM_MODEM_STATE(state).name + + if len(info) != 4: + return None + + technology, operator, band, channel = info + + return({ + 'technology': technology, + 'operator': operator, + 'band': band, + 'channel': int(channel), + 'extra': extra, + 'state': state, + }) + else: + return None + + def parse_strength(self, percentage): + if percentage < 25: + return NetworkStrength.poor + elif percentage < 50: + return NetworkStrength.moderate + elif percentage < 75: + return NetworkStrength.good + else: + return NetworkStrength.great + + def get_network_strength(self, network_type): + network_strength = NetworkStrength.unknown + + try: + if network_type == NetworkType.none: + pass + elif network_type == NetworkType.wifi: + wlan = self.get_wlan() + active_ap_path = wlan.Get(NM_DEV_WL, 'ActiveAccessPoint', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if active_ap_path != "/": + active_ap = self.bus.get_object(NM, active_ap_path) + strength = int(active_ap.Get(NM_AP, 'Strength', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + network_strength = self.parse_strength(strength) + else: # Cellular + modem = self.get_modem() + strength = int(modem.Get(MM_MODEM, 'SignalQuality', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)[0]) + network_strength = self.parse_strength(strength) + except Exception: + pass + + return network_strength + + def get_network_metered(self, network_type) -> bool: + try: + primary_connection = self.nm.Get(NM, 'PrimaryConnection', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + primary_connection = self.bus.get_object(NM, primary_connection) + primary_devices = primary_connection.Get(NM_CON_ACT, 'Devices', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + for dev in primary_devices: + dev_obj = self.bus.get_object(NM, str(dev)) + metered_prop = dev_obj.Get(NM_DEV, 'Metered', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + if network_type == NetworkType.wifi: + if metered_prop in [NMMetered.NM_METERED_YES, NMMetered.NM_METERED_GUESS_YES]: + return True + elif network_type in [NetworkType.cell2G, NetworkType.cell3G, NetworkType.cell4G, NetworkType.cell5G]: + if metered_prop == NMMetered.NM_METERED_NO: + return False + except Exception: + pass + + return super().get_network_metered(network_type) + + def get_modem_version(self): + try: + modem = self.get_modem() + return modem.Get(MM_MODEM, 'Revision', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + except Exception: + return None + + def get_modem_temperatures(self): + timeout = 0.2 # Default timeout is too short + try: + modem = self.get_modem() + temps = modem.Command("AT+QTEMP", math.ceil(timeout), dbus_interface=MM_MODEM, timeout=timeout) + return list(filter(lambda t: t != 255, map(int, temps.split(' ')[1].split(',')))) + except Exception: + return [] + + + def get_current_power_draw(self): + return (self.read_param_file("/sys/class/hwmon/hwmon1/power1_input", int) / 1e6) + + def get_som_power_draw(self): + return (self.read_param_file("/sys/class/power_supply/bms/voltage_now", int) * self.read_param_file("/sys/class/power_supply/bms/current_now", int) / 1e12) + + def shutdown(self): + os.system("sudo poweroff") + + def get_thermal_config(self): + intake, exhaust, case = None, None, None + if self.get_device_type() == "mici": + case = ThermalZone("case") + intake = ThermalZone("intake") + exhaust = ThermalZone("exhaust") + return ThermalConfig(cpu=[ThermalZone(f"cpu{i}-silver-usr") for i in range(4)] + + [ThermalZone(f"cpu{i}-gold-usr") for i in range(4)], + gpu=[ThermalZone("gpu0-usr"), ThermalZone("gpu1-usr")], + dsp=ThermalZone("compute-hvx-usr"), + memory=ThermalZone("ddr-usr"), + pmic=[ThermalZone("pm8998_tz"), ThermalZone("pm8005_tz")], + intake=intake, + exhaust=exhaust, + case=case) + + def set_display_power(self, on): + try: + with open("/sys/class/backlight/panel0-backlight/bl_power", "w") as f: + f.write("0" if on else "4") + except Exception: + pass + + def set_screen_brightness(self, percentage): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + val = int(percentage * (max_brightness / 100.)) + with open("/sys/class/backlight/panel0-backlight/brightness", "w") as f: + f.write(str(val)) + except Exception: + pass + + def get_screen_brightness(self): + try: + with open("/sys/class/backlight/panel0-backlight/max_brightness") as f: + max_brightness = float(f.read().strip()) + + with open("/sys/class/backlight/panel0-backlight/brightness") as f: + return int(float(f.read()) / (max_brightness / 100.)) + except Exception: + return 0 + + def set_power_save(self, powersave_enabled): + # amplifier, 100mW at idle + if self.amplifier is not None: + self.amplifier.set_global_shutdown(amp_disabled=powersave_enabled) + if not powersave_enabled: + self.amplifier.initialize_configuration(self.get_device_type()) + + # *** CPU config *** + + # offline big cluster + for i in range(4, 8): + val = '0' if powersave_enabled else '1' + sudo_write(val, f'/sys/devices/system/cpu/cpu{i}/online') + + for n in ('0', '4'): + if powersave_enabled and n == '4': + continue + gov = 'ondemand' if powersave_enabled else 'performance' + sudo_write(gov, f'/sys/devices/system/cpu/cpufreq/policy{n}/scaling_governor') + + # *** IRQ config *** + + # GPU, modeld core + affine_irq(7, "kgsl-3d0") + + # camerad core + camera_irqs = ("a5", "cci", "cpas_camnoc", "cpas-cdm", "csid", "ife", "csid-lite", "ife-lite") + for n in camera_irqs: + affine_irq(6, n) + + def get_gpu_usage_percent(self): + try: + with open('/sys/class/kgsl/kgsl-3d0/gpubusy') as f: + used, total = f.read().strip().split() + return 100.0 * int(used) / int(total) + except Exception: + return 0 + + def initialize_hardware(self): + if self.amplifier is not None: + self.amplifier.initialize_configuration(self.get_device_type()) + + # Allow hardwared to write engagement status to kmsg + os.system("sudo chmod a+w /dev/kmsg") + + # Ensure fan gpio is enabled so fan runs until shutdown, also turned on at boot by the ABL + gpio_init(GPIO.SOM_ST_IO, True) + gpio_set(GPIO.SOM_ST_IO, 1) + + # *** IRQ config *** + + # mask off big cluster from default affinity + sudo_write("f", "/proc/irq/default_smp_affinity") + + # move these off the default core + affine_irq(1, "msm_vidc") # encoders + affine_irq(1, "i2c_geni") # sensors + + # *** GPU config *** + # https://github.com/commaai/agnos-kernel-sdm845/blob/master/arch/arm64/boot/dts/qcom/sdm845-gpu.dtsi#L216 + affine_irq(5, "fts_ts") # touch + affine_irq(5, "msm_drm") # display + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/min_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/max_pwrlevel") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_bus_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_clk_on") + sudo_write("1", "/sys/class/kgsl/kgsl-3d0/force_rail_on") + sudo_write("1000", "/sys/class/kgsl/kgsl-3d0/idle_timer") + sudo_write("performance", "/sys/class/kgsl/kgsl-3d0/devfreq/governor") + sudo_write("710", "/sys/class/kgsl/kgsl-3d0/max_clock_mhz") + + # setup governors + sudo_write("performance", "/sys/class/devfreq/soc:qcom,cpubw/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu0/governor") + sudo_write("performance", "/sys/class/devfreq/soc:qcom,memlat-cpu4/governor") + + # *** VIDC (encoder) config *** + sudo_write("N", "/sys/kernel/debug/msm_vidc/clock_scaling") + sudo_write("Y", "/sys/kernel/debug/msm_vidc/disable_thermal_mitigation") + + # pandad core + affine_irq(3, "spi_geni") # SPI + if "tici" in self.get_device_type(): + affine_irq(3, "xhci-hcd:usb3") + affine_irq(3, "xhci-hcd:usb1") + try: + pid = subprocess.check_output(["pgrep", "-f", "spi0"], encoding='utf8').strip() + subprocess.call(["sudo", "chrt", "-f", "-p", "1", pid]) + subprocess.call(["sudo", "taskset", "-pc", "3", pid], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessException as e: + print(str(e)) + + def configure_modem(self): + from iqpilot.common.params import Params + + sim_info = self.get_sim_info() + sim_id = sim_info.get('sim_id', '') + params = Params() + manual_apn = params.get("GsmApn", encoding="utf-8") or "" + metered_enabled = params.get_bool("GsmMetered") + + modem = self.get_modem() + try: + manufacturer = str(modem.Get(MM_MODEM, 'Manufacturer', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + except Exception: + manufacturer = None + + cmds = [] + is_comma_profile = self.get_sim_lpa().is_comma_profile(sim_id) + roaming_enabled = params.get_bool("GsmRoaming") + initial_eps_apn = "" if is_comma_profile else manual_apn + + if not is_comma_profile and params.get("GsmRoaming") is None: + params.put_bool("GsmRoaming", True) + roaming_enabled = True + + subprocess.call([ + "nmcli", "connection", "modify", "lte", + "gsm.auto-config", "no" if manual_apn else "yes", + "gsm.apn", manual_apn, + "gsm.home-only", "no" if roaming_enabled else "yes", + "gsm.network-id", "", + "gsm.initial-eps-bearer-configure", "yes" if initial_eps_apn else "no", + "gsm.initial-eps-bearer-apn", initial_eps_apn, + "connection.metered", "unknown" if metered_enabled else "no", + ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + if self.get_device_type() in ("tici", "tizi"): + if initial_eps_apn: + subprocess.call(["mmcli", "-m", "any", f'--3gpp-set-initial-eps-bearer-settings=apn={initial_eps_apn}']) + else: + subprocess.call(["mmcli", "-m", "any", '--3gpp-set-initial-eps-bearer-settings=apn=']) + + cmds += [ + # configure modem as data-centric + 'AT+QNVW=5280,0,"0102000000000000"', + 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', + 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', + ] + if self.get_device_type() == "tizi": + cmds += [ + 'AT+QSIMDET=1,0', + 'AT+QSIMSTAT=1', + ] + elif manufacturer == 'Cavli Inc.': + cmds += [ + 'AT^SIMSWAP=1', # use SIM slot, instead of internal eSIM + 'AT$QCSIMSLEEP=0', # disable SIM sleep + 'AT$QCSIMCFG=SimPowerSave,0', # more sleep disable + + # ethernet config + 'AT$QCPCFG=usbNet,0', + 'AT$QCNETDEVCTL=3,1', + ] + else: + # this modem gets upset with too many AT commands + if sim_id is None or len(sim_id) == 0: + cmds += [ + # SIM sleep disable + 'AT$QCSIMSLEEP=0', + 'AT$QCSIMCFG=SimPowerSave,0', + + # ethernet config + 'AT$QCPCFG=usbNet,1', + ] + + for cmd in cmds: + try: + modem.Command(cmd, math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + + # eSIM prime + dest = "/etc/NetworkManager/system-connections/esim.nmconnection" + if self.get_sim_lpa().is_comma_profile(sim_id) and not os.path.exists(dest): + with open(Path(__file__).parent/'esim.nmconnection') as f, tempfile.NamedTemporaryFile(mode='w') as tf: + dat = f.read() + dat = dat.replace("sim-id=", f"sim-id={sim_id}") + tf.write(dat) + tf.flush() + + # needs to be root + os.system(f"sudo cp {tf.name} {dest}") + os.system(f"sudo nmcli con load {dest}") + + def recover_sim_detection(self) -> bool: + # A worn SIM-tray presence switch can read "removed" while the SIM pads still make + # contact; with hot-swap detect armed (AT+QSIMDET=1) the modem never powers the SIM + # and lands in failed/sim-missing. Disabling detect and rebooting the modem makes it + # probe the SIM electrically. Safe to retry on failure: firing disarms the QSIMDET + # gate, so a genuinely SIM-less device gets at most one extra modem reboot per boot. + if self.get_device_type() not in ("tici", "tizi"): + return False + + try: + modem = self.get_modem() + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if state != MM_MODEM_STATE.FAILED: + return False + reason = modem.Get(MM_MODEM, 'StateFailedReason', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if reason != MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: + return False + detect = str(modem.Command('AT+QSIMDET?', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT)).strip() + if not detect.startswith('+QSIMDET: 1'): + return False + modem.Command('AT+QSIMDET=0,0', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + modem.Command('AT+CFUN=1,1', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + return True + except Exception: + return False + + def reboot_modem(self): + modem = None + try: + modem = self.get_modem() + except Exception: + pass + + if modem is not None: + for state in (0, 1): + try: + modem.Command(f'AT+CFUN={state}', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + except Exception: + pass + return + + for state in (0, 1): + try: + self._run_direct_modem_command(f"AT+CFUN={state}") + except Exception: + pass + + def get_networks(self): + r = {} + + wlan = iwlist.scan() + if wlan is not None: + r['wlan'] = wlan + + lte_info = self.get_network_info() + if lte_info is not None: + extra = lte_info['extra'] + + # ,"LTE",,,,,,,, + # ,,,,,,, + if 'LTE' in extra: + extra = extra.split(',') + try: + r['lte'] = [{ + "mcc": int(extra[3]), + "mnc": int(extra[4]), + "cid": int(extra[5], 16), + "nmr": [{"pci": int(extra[6]), "earfcn": int(extra[7])}], + }] + except (ValueError, IndexError): + pass + + return r + + def get_modem_data_usage(self): + try: + wwan = self.get_wwan() + + # Ensure refresh rate is set so values don't go stale + refresh_rate = wwan.Get(NM_DEV_STATS, 'RefreshRateMs', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if refresh_rate != REFRESH_RATE_MS: + u = type(refresh_rate) + wwan.Set(NM_DEV_STATS, 'RefreshRateMs', u(REFRESH_RATE_MS), dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + tx = wwan.Get(NM_DEV_STATS, 'TxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + rx = wwan.Get(NM_DEV_STATS, 'RxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + return int(tx), int(rx) + except Exception: + return -1, -1 + + def has_internal_panda(self): + return True + + def reset_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 0) + time.sleep(1) + gpio_set(GPIO.STM_RST_N, 0) + + def recover_internal_panda(self): + gpio_init(GPIO.STM_RST_N, True) + gpio_init(GPIO.STM_BOOT0, True) + + gpio_set(GPIO.STM_RST_N, 1) + gpio_set(GPIO.STM_BOOT0, 1) + time.sleep(0.5) + gpio_set(GPIO.STM_RST_N, 0) + time.sleep(0.5) + gpio_set(GPIO.STM_BOOT0, 0) + + def booted(self): + # this normally boots within 8s, but on rare occasions takes 30+s + encoder_state = sudo_read("/sys/kernel/debug/msm_vidc/core0/info") + if "Core state: 0" in encoder_state and (time.monotonic() < 60*2): + return False + return True + +if __name__ == "__main__": + t = Tici() + t.configure_modem() + t.initialize_hardware() + t.set_power_save(False) + print(t.get_sim_info()) diff --git a/iqpilot/system/hardware/tici/id_rsa b/iqpilot/system/hardware/tici/id_rsa new file mode 100644 index 000000000..3f269afe2 --- /dev/null +++ b/iqpilot/system/hardware/tici/id_rsa @@ -0,0 +1,28 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC+iXXq30Tq+J5N +Kat3KWHCzcmwZ55nGh6WggAqECa5CasBlM9VeROpVu3beA+5h0MibRgbD4DMtVXB +t6gEvZ8nd04E7eLA9LTZyFDZ7SkSOVj4oXOQsT0GnJmKrASW5KslTWqVzTfo2XCt +Z+004ikLxmyFeBO8NOcErW1pa8gFdQDToH9FrA7kgysic/XVESTOoe7XlzRoe/eZ +acEQ+jtnmFd21A4aEADkk00Ahjr0uKaJiLUAPatxs2icIXWpgYtfqqtaKF23wSt6 +1OTu6cAwXbOWr3m+IUSRUO0IRzEIQS3z1jfd1svgzSgSSwZ1Lhj4AoKxIEAIc8qJ +rO4uymCJAgMBAAECggEBAISFevxHGdoL3Z5xkw6oO5SQKO2GxEeVhRzNgmu/HA+q +x8OryqD6O1CWY4037kft6iWxlwiLOdwna2P25ueVM3LxqdQH2KS4DmlCx+kq6FwC +gv063fQPMhC9LpWimvaQSPEC7VUPjQlo4tPY6sTTYBUOh0A1ihRm/x7juKuQCWix +Cq8C/DVnB1X4mGj+W3nJc5TwVJtgJbbiBrq6PWrhvB/3qmkxHRL7dU2SBb2iNRF1 +LLY30dJx/cD73UDKNHrlrsjk3UJc29Mp4/MladKvUkRqNwlYxSuAtJV0nZ3+iFkL +s3adSTHdJpClQer45R51rFDlVsDz2ZBpb/hRNRoGDuECgYEA6A1EixLq7QYOh3cb +Xhyh3W4kpVvA/FPfKH1OMy3ONOD/Y9Oa+M/wthW1wSoRL2n+uuIW5OAhTIvIEivj +6bAZsTT3twrvOrvYu9rx9aln4p8BhyvdjeW4kS7T8FP5ol6LoOt2sTP3T1LOuJPO +uQvOjlKPKIMh3c3RFNWTnGzMPa0CgYEA0jNiPLxP3A2nrX0keKDI+VHuvOY88gdh +0W5BuLMLovOIDk9aQFIbBbMuW1OTjHKv9NK+Lrw+YbCFqOGf1dU/UN5gSyE8lX/Q +FsUGUqUZx574nJZnOIcy3ONOnQLcvHAQToLFAGUd7PWgP3CtHkt9hEv2koUwL4vo +ikTP1u9Gkc0CgYEA2apoWxPZrY963XLKBxNQecYxNbLFaWq67t3rFnKm9E8BAICi +4zUaE5J1tMVi7Vi9iks9Ml9SnNyZRQJKfQ+kaebHXbkyAaPmfv+26rqHKboA0uxA +nDOZVwXX45zBkp6g1sdHxJx8JLoGEnkC9eyvSi0C//tRLx86OhLErXwYcNkCf1it +VMRKrWYoXJTUNo6tRhvodM88UnnIo3u3CALjhgU4uC1RTMHV4ZCGBwiAOb8GozSl +s5YD1E1iKwEULloHnK6BIh6P5v8q7J6uf/xdqoKMjlWBHgq6/roxKvkSPA1DOZ3l +jTadcgKFnRUmc+JT9p/ZbCxkA/ALFg8++G+0ghECgYA8vG3M/utweLvq4RI7l7U7 +b+i2BajfK2OmzNi/xugfeLjY6k2tfQGRuv6ppTjehtji2uvgDWkgjJUgPfZpir3I +RsVMUiFgloWGHETOy0Qvc5AwtqTJFLTD1Wza2uBilSVIEsg6Y83Gickh+ejOmEsY +6co17RFaAZHwGfCFFjO76Q== +-----END RSA PRIVATE KEY----- diff --git a/iqpilot/system/hardware/tici/iwlist.py b/iqpilot/system/hardware/tici/iwlist.py new file mode 100644 index 000000000..1e7c428b4 --- /dev/null +++ b/iqpilot/system/hardware/tici/iwlist.py @@ -0,0 +1,35 @@ +import subprocess + + +def scan(interface="wlan0"): + result = [] + try: + r = subprocess.check_output(["iwlist", interface, "scan"], encoding='utf8') + + mac = None + for line in r.split('\n'): + if "Address" in line: + # Based on the adapter eithere a percentage or dBm is returned + # Add previous network in case no dBm signal level was seen + if mac is not None: + result.append({"mac": mac}) + mac = None + + mac = line.split(' ')[-1] + elif "dBm" in line: + try: + level = line.split('Signal level=')[1] + rss = int(level.split(' ')[0]) + result.append({"mac": mac, "rss": rss}) + mac = None + except ValueError: + continue + + # Add last network if no dBm was found + if mac is not None: + result.append({"mac": mac}) + + return result + + except Exception: + return None diff --git a/iqpilot/system/hardware/tici/lpa.py b/iqpilot/system/hardware/tici/lpa.py new file mode 100755 index 000000000..a636742d5 --- /dev/null +++ b/iqpilot/system/hardware/tici/lpa.py @@ -0,0 +1,1482 @@ +#!/usr/bin/env python3 +# SGP.22 v2.3: https://www.gsma.com/solutions-and-impact/technologies/esim/wp-content/uploads/2021/07/SGP.22-v2.3.pdf + +import argparse +import atexit +import base64 +import hashlib +import json +import math +import os +import re +import requests +import serial +import subprocess +import sys +import time + +from collections.abc import Generator +from contextlib import contextmanager +from pathlib import Path +from typing import Literal +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.system.hardware.base import LPABase, LPAError, LPAProfileNotFoundError, Profile + +GSMA_CI_BUNDLE = str(Path(__file__).parent / 'gsma_ci_bundle.pem') + + +DEFAULT_DEVICE = "/dev/modem_at0" +DEFAULT_BAUD = 9600 +DEFAULT_TIMEOUT = 5.0 +# https://euicc-manual.osmocom.org/docs/lpa/applet-id/ +ISDR_AID = "A0000005591010FFFFFFFF8900000100" +ES10X_MSS = 120 +MM = "org.freedesktop.ModemManager1" +MM_MODEM = MM + ".Modem" + +# TLV Tags +TAG_ICCID = 0x5A +TAG_STATUS = 0x80 +TAG_EUICC_INFO = 0xBF20 +TAG_PREPARE_DOWNLOAD = 0xBF21 +TAG_PROFILE_INFO_LIST = 0xBF2D +TAG_EUICC_CHALLENGE = 0xBF2E +TAG_SET_NICKNAME = 0xBF29 +TAG_LIST_NOTIFICATION = 0xBF28 +TAG_RETRIEVE_NOTIFICATION = 0xBF2B +TAG_NOTIFICATION_METADATA = 0xBF2F +TAG_NOTIFICATION_SENT = 0xBF30 +TAG_ENABLE_PROFILE = 0xBF31 +TAG_DISABLE_PROFILE = 0xBF32 +TAG_DELETE_PROFILE = 0xBF33 +TAG_BPP = 0xBF36 +TAG_PROFILE_INSTALL_RESULT = 0xBF37 +TAG_AUTH_SERVER = 0xBF38 +TAG_CANCEL_SESSION = 0xBF41 + +STATE_LABELS = {0: "disabled", 1: "enabled", 255: "unknown"} +ICON_LABELS = {0: "jpeg", 1: "png", 255: "unknown"} +CLASS_LABELS = {0: "test", 1: "provisioning", 2: "operational", 255: "unknown"} +PROFILE_ERROR_CODES = { + 0x01: "iccidOrAidNotFound", 0x02: "profileNotInDisabledState", + 0x03: "disallowedByPolicy", 0x04: "wrongProfileReenabling", + 0x05: "catBusy", 0x06: "undefinedError", +} +AUTH_SERVER_ERROR_CODES = { + 0x01: "eUICCVerificationFailed", 0x02: "eUICCCertificateExpired", + 0x03: "eUICCCertificateRevoked", 0x05: "invalidServerSignature", + 0x06: "euiccCiPKUnknown", 0x0A: "matchingIdRefused", + 0x10: "insufficientMemory", +} +BPP_COMMAND_NAMES = { + 0: "initialiseSecureChannel", 1: "configureISDP", 2: "storeMetadata", + 3: "storeMetadata2", 4: "replaceSessionKeys", 5: "loadProfileElements", +} +BPP_ERROR_REASONS = { + 1: "incorrectInputValues", 2: "invalidSignature", 3: "invalidTransactionId", + 4: "unsupportedCrtValues", 5: "unsupportedRemoteOperationType", + 6: "unsupportedProfileClass", 7: "scp03tStructureError", 8: "scp03tSecurityError", + 9: "iccidAlreadyExistsOnEuicc", 10: "insufficientMemoryForProfile", + 11: "installInterrupted", 12: "peProcessingError", 13: "dataMismatch", + 14: "invalidNAA", +} +CANCEL_SESSION_REASON = { + 0: "endUserRejection", 1: "postponed", 2: "timeout", + 3: "pprNotAllowed", 127: "undefinedReason", +} + +ESIM_TLS_BUNDLE_ENV = "IQPILOT_ESIM_CA_BUNDLE" +ESIM_QESIM_INIT_ENV = "IQPILOT_ESIM_QESIM_INIT" +ESIM_EXCLUSIVE_MODEM_ENV = "IQPILOT_ESIM_EXCLUSIVE_MODEM" + + +def _ensure_dbus_import(): + try: + import dbus # noqa: F401 + return + except ModuleNotFoundError: + dist_packages = "/usr/lib/python3/dist-packages" + if dist_packages not in sys.path and os.path.isdir(dist_packages): + sys.path.append(dist_packages) + import dbus # noqa: F401 + + +def _tls_verify_option() -> bool | str: + # Default to the GSMA CI bundle used by the reference eSIM branch. + # Allow explicit override for local testing or forced system trust behavior. + override = os.getenv(ESIM_TLS_BUNDLE_ENV, "").strip() + if not override: + return GSMA_CI_BUNDLE + if override.lower() in ("0", "false", "off"): + return False + if override.lower() in ("1", "true", "on", "system"): + return True + return override + + +def b64e(data: bytes) -> str: + return base64.b64encode(data).decode("ascii") + + +def b64d(s: str) -> bytes: + return base64.b64decode(base64_trim(s)) + + +def _decode_apdu_response_blob(raw: str, label: str) -> bytes: + filtered = re.sub(r"[^0-9A-Fa-f]", "", raw) + if len(filtered) < 2 or len(filtered) % 2: + raise RuntimeError(f"Malformed {label} response payload") + return bytes.fromhex(filtered) + + +class AtClient: + def __init__(self, device: str, baud: int, timeout: float, verbose: bool) -> None: + self._device = device + self._baud = baud + self._timeout = timeout + self.verbose = verbose + self.channel: str | None = None + self._serial: serial.Serial | None = None + self._use_csim = False + self._has_qesim = False + self._qesim_lpa_enabled = False + try: + self._serial = serial.Serial(device, baudrate=baud, timeout=timeout) + self._disable_echo() + except (serial.SerialException, PermissionError, OSError): + self._serial = None + if self.verbose: + print(f"!! using ModemManager DBus AT transport for {device}", file=sys.stderr) + + def close(self) -> None: + try: + if self.channel: + try: + self.query(f"AT+CCHC={self.channel}") + except Exception as e: + if self.verbose: + print(f"!! ignoring channel close failure: {e}", file=sys.stderr) + finally: + self.channel = None + finally: + if self._serial is not None: + self._serial.close() + + @staticmethod + def _is_busy_open_error(error: Exception) -> bool: + text = str(error).lower() + return "errno 16" in text or "device or resource busy" in text + + def _disable_echo(self) -> None: + if self._serial is None: + return + self._serial.reset_input_buffer() + self._serial.write(b"ATE0\r") + time.sleep(0.1) + self._serial.reset_input_buffer() + + def _send(self, cmd: str) -> None: + if self.verbose: + print(f">> {cmd}", file=sys.stderr) + assert self._serial is not None + self._serial.write((cmd + "\r").encode("ascii")) + + def _expect(self) -> list[str]: + lines: list[str] = [] + while True: + assert self._serial is not None + raw = self._serial.readline() + if not raw: + raise TimeoutError("AT command timed out") + line = raw.decode(errors="ignore").strip() + if not line: + continue + if self.verbose: + print(f"<< {line}", file=sys.stderr) + if line == "OK": + return lines + if line == "ERROR": + raise RuntimeError("AT command failed") + if "ERROR" in line and line.startswith("+"): + # Catch +CME ERROR / +CMS ERROR and similar modem-specific failures. + raise RuntimeError(f"AT command failed: {line}") + lines.append(line) + + def _get_modem(self): + _ensure_dbus_import() + import dbus + + bus = dbus.SystemBus() + mm = bus.get_object(MM, '/org/freedesktop/ModemManager1') + objects = mm.GetManagedObjects(dbus_interface="org.freedesktop.DBus.ObjectManager", timeout=self._timeout) + modem_paths = [path for path in objects.keys() if "/Modem/" in str(path)] + if not modem_paths: + raise RuntimeError("ModemManager returned no modems") + return bus.get_object(MM, modem_paths[0]) + + def _dbus_query(self, cmd: str) -> list[str]: + if self.verbose: + print(f"DBUS >> {cmd}", file=sys.stderr) + try: + result = str(self._get_modem().Command(cmd, math.ceil(self._timeout), dbus_interface=MM_MODEM, timeout=self._timeout)) + except Exception as e: + raise RuntimeError(f"AT command failed: {e}") from e + lines = [line.strip() for line in result.splitlines() if line.strip()] + if self.verbose: + for line in lines: + print(f"DBUS << {line}", file=sys.stderr) + return lines + + def _reconnect_serial(self) -> None: + self.channel = None + try: + if self._serial is not None: + self._serial.close() + except Exception: + pass + self._serial = serial.Serial(self._device, baudrate=self._baud, timeout=self._timeout) + self._disable_echo() + + def query(self, cmd: str) -> list[str]: + if self._serial is None: + return self._dbus_query(cmd) + try: + self._send(cmd) + return self._expect() + except (OSError, serial.SerialException) as e: + try: + self._reconnect_serial() + self._send(cmd) + return self._expect() + except Exception: + raise RuntimeError(f"AT transport error ({cmd}): {e}") from e + except TimeoutError as e: + raise TimeoutError(f"AT command timed out ({cmd})") from e + except RuntimeError as e: + raise RuntimeError(f"AT command failed ({cmd}): {e}") from e + + def _supports_qesim(self) -> bool: + try: + lines = self.query("AT+QESIM=?") + except Exception: + return False + return any(line.startswith("+QESIM:") for line in lines) + + def _set_quectel_lpa_mode(self) -> None: + self._has_qesim = self._supports_qesim() + self._qesim_lpa_enabled = False + if not self._has_qesim: + return + + # Some Quectel firmwares require enabling internal LPA mode before + # ISO7816 channel open commands (CCHO/CGLA) will succeed. + lpa_enable_cmds = ( + 'AT+QESIM="lpa_enable",1', + 'AT+QESIM="lpa_enable"', + ) + for cmd in lpa_enable_cmds: + try: + self.query(cmd) + self._qesim_lpa_enabled = True + break + except Exception: + continue + + # Keep BIP auth enabled when supported; this is needed by some firmware + # revisions for profile download/auth paths. + try: + lines = self.query('AT+QCFG="bip/auth"?') + needs_enable = any('"bip/auth",0' in line for line in lines) + if needs_enable: + self.query('AT+QCFG="bip/auth",1') + except Exception: + pass + + def ensure_capabilities(self) -> None: + if self._serial is None: + return + + # Some modem firmwares reject command test forms (e.g. AT+CCHO=?) + # while still supporting real execution. Keep these probes non-fatal. + self.query("AT") + # Keep IQ-specific QESIM initialization opt-in for debugging only. + # Default behavior should match upstream greatgitsby/esim transport flow. + if os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + try: + self.query("AT+CMEE=2") + except Exception: + pass + self._set_quectel_lpa_mode() + for command in ("AT+CCHO", "AT+CCHC", "AT+CGLA", "AT+CSIM"): + try: + self.query(f"{command}=?") + except Exception as e: + if self.verbose: + print(f"!! capability probe failed for {command}: {e}", file=sys.stderr) + + def open_isdr(self) -> None: + try: + self.query(f'AT+CCHC=1') + except Exception: + pass + ccho_candidates = [ + f'AT+CCHO="{ISDR_AID}"', + f"AT+CCHO={ISDR_AID}", + ] + for cmd in ccho_candidates: + try: + lines = self.query(cmd) + except Exception: + continue + for line in lines: + if line.startswith("+CCHO:") and (ch := line.split(":", 1)[1].strip()): + self.channel = ch + return + + # Fallback for modems that reject CCHO but allow APDUs over basic channel. + self.channel = "0" + aid_len = len(ISDR_AID) // 2 + select_isdr = bytes.fromhex(f"00A40400{aid_len:02X}{ISDR_AID}") + try: + _, sw1, sw2 = self.send_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + return + raise RuntimeError(f"ISD-R SELECT failed on basic channel SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + # Final fallback for modems that only support APDU via CSIM. + try: + _, sw1, sw2 = self._send_csim_apdu(select_isdr) + if (sw1, sw2) == (0x90, 0x00): + self._use_csim = True + self.channel = "csim" + if self.verbose: + print("!! using CSIM APDU transport fallback", file=sys.stderr) + return + raise RuntimeError(f"ISD-R SELECT failed on CSIM SW={sw1:02X}{sw2:02X}") + except Exception: + self.channel = None + if self._has_qesim and not self._qesim_lpa_enabled and os.getenv(ESIM_QESIM_INIT_ENV, "").strip() == "1": + raise RuntimeError( + "Modem exposes AT+QESIM but rejects LPA enable and ISD-R access; " + "this firmware/SKU likely does not provide usable eSIM functionality" + ) + raise RuntimeError("Failed to access eUICC ISD-R (CCHO/CGLA/CSIM all failed)") + + def send_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + for attempt in range(3): + try: + if not self.channel: + self.open_isdr() + if self._use_csim: + return self._send_csim_apdu(apdu) + hex_payload = apdu.hex().upper() + cmd = f'AT+CGLA={self.channel},{len(hex_payload)},"{hex_payload}"' + for query_attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CGLA:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CGLA") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if query_attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CGLA response") + except RuntimeError: + self.channel = None + self._use_csim = False + if attempt == 2: + raise + time.sleep(1 + attempt) + raise RuntimeError("send_apdu failed") + + def _send_csim_apdu(self, apdu: bytes) -> tuple[bytes, int, int]: + hex_payload = apdu.hex().upper() + cmd = f'AT+CSIM={len(hex_payload)},"{hex_payload}"' + for attempt in range(2): + for line in self.query(cmd): + if line.startswith("+CSIM:"): + parts = line.split(":", 1)[1].split(",", 1) + if len(parts) == 2: + data = _decode_apdu_response_blob(parts[1].strip().strip('"'), "+CSIM") + if len(data) >= 2: + return data[:-2], data[-2], data[-1] + if attempt == 0: + time.sleep(0.2) + raise RuntimeError("Missing +CSIM response") + + +# --- TLV utilities --- + +def iter_tlv(data: bytes, with_positions: bool = False) -> Generator: + idx, length = 0, len(data) + while idx < length: + start_pos = idx + tag = data[idx] + idx += 1 + if tag & 0x1F == 0x1F: # Multi-byte tag + tag_value = tag + while idx < length: + next_byte = data[idx] + idx += 1 + tag_value = (tag_value << 8) | next_byte + if not (next_byte & 0x80): + break + else: + tag_value = tag + if idx >= length: + break + size = data[idx] + idx += 1 + if size & 0x80: # Multi-byte length + num_bytes = size & 0x7F + if idx + num_bytes > length: + break + size = int.from_bytes(data[idx : idx + num_bytes], "big") + idx += num_bytes + if idx + size > length: + break + value = data[idx : idx + size] + idx += size + yield (tag_value, value, start_pos, idx) if with_positions else (tag_value, value) + + +def find_tag(data: bytes, target: int) -> bytes | None: + return next((v for t, v in iter_tlv(data) if t == target), None) + + +def encode_tlv(tag: int, value: bytes) -> bytes: + tag_bytes = bytes([(tag >> 8) & 0xFF, tag & 0xFF]) if tag > 255 else bytes([tag]) + vlen = len(value) + if vlen <= 127: + return tag_bytes + bytes([vlen]) + value + length_bytes = vlen.to_bytes((vlen.bit_length() + 7) // 8, "big") + return tag_bytes + bytes([0x80 | len(length_bytes)]) + length_bytes + value + + +def tbcd_to_string(raw: bytes) -> str: + return "".join(str(n) for b in raw for n in (b & 0x0F, b >> 4) if n <= 9) + + +def string_to_tbcd(s: str) -> bytes: + digits = [int(c) for c in s if c.isdigit()] + return bytes(digits[i] | ((digits[i + 1] if i + 1 < len(digits) else 0xF) << 4) for i in range(0, len(digits), 2)) + + +def base64_trim(s: str) -> str: + return "".join(c for c in s if c not in "\n\r \t") + + +# --- Shared helpers --- + +def _int_bytes(n: int) -> bytes: + """Encode a positive integer as minimal big-endian bytes (at least 1 byte).""" + return n.to_bytes((n.bit_length() + 7) // 8 or 1, "big") + + +def _extract_status(response: bytes, tag: int, name: str) -> int: + """Extract the status byte from a tagged ES10x response.""" + root = find_tag(response, tag) + if root is None: + raise RuntimeError(f"Missing {name}Response") + status = find_tag(root, TAG_STATUS) + if status is None: + raise RuntimeError(f"Missing status in {name}Response") + return status[0] + + +# Profile field decoders: TLV tag -> (field_name, decoder) +_PROFILE_FIELDS = { + TAG_ICCID: ("iccid", tbcd_to_string), + 0x4F: ("isdpAid", lambda v: v.hex().upper()), + 0x9F70: ("profileState", lambda v: STATE_LABELS.get(v[0], "unknown")), + 0x90: ("profileNickname", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x91: ("serviceProviderName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x92: ("profileName", lambda v: v.decode("utf-8", errors="ignore") or None), + 0x93: ("iconType", lambda v: ICON_LABELS.get(v[0], "unknown")), + 0x94: ("icon", b64e), + 0x95: ("profileClass", lambda v: CLASS_LABELS.get(v[0], "unknown")), +} + + +def _decode_profile_fields(data: bytes) -> dict: + """Parse known profile metadata TLV fields into a dict.""" + result = {} + for tag, value in iter_tlv(data): + if (field := _PROFILE_FIELDS.get(tag)): + result[field[0]] = field[1](value) + return result + + +# Notification field decoders: TLV tag -> (field_name, decoder) +_NOTIF_FIELDS = { + TAG_STATUS: ("seqNumber", lambda v: int.from_bytes(v, "big")), + 0x81: ("profileManagementOperation", lambda v: next((m for m in [0x80, 0x40, 0x20, 0x10] if len(v) >= 2 and v[1] & m), 0xFF)), + 0x0C: ("notificationAddress", lambda v: v.decode("utf-8", errors="ignore")), + TAG_ICCID: ("iccid", tbcd_to_string), +} + + +# --- ES10x command transport --- + +def es10x_command(client: AtClient, data: bytes) -> bytes: + response = bytearray() + sequence = 0 + offset = 0 + while offset < len(data): + chunk = data[offset : offset + ES10X_MSS] + offset += len(chunk) + is_last = offset == len(data) + apdu = bytes([0x80, 0xE2, 0x91 if is_last else 0x11, sequence & 0xFF, len(chunk)]) + chunk + segment, sw1, sw2 = client.send_apdu(apdu) + response.extend(segment) + while True: + if sw1 == 0x61: # More data available + segment, sw1, sw2 = client.send_apdu(bytes([0x80, 0xC0, 0x00, 0x00, sw2 or 0])) + response.extend(segment) + continue + if (sw1 & 0xF0) == 0x90: + break + raise RuntimeError(f"APDU failed with SW={sw1:02X}{sw2:02X}") + sequence += 1 + return bytes(response) + + +# --- ES9P HTTP --- + +def es9p_request(smdp_address: str, endpoint: str, payload: dict, error_prefix: str = "Request") -> dict: + if not system_time_valid(): + raise RuntimeError("System time is not set; TLS certificate validation requires a valid clock") + url = f"https://{smdp_address}/gsma/rsp2/es9plus/{endpoint}" + headers = {"User-Agent": "gsma-rsp-lpad", "X-Admin-Protocol": "gsma/rsp/v2.3.0", "Content-Type": "application/json"} + resp = requests.post(url, json=payload, headers=headers, timeout=30, verify=_tls_verify_option()) + resp.raise_for_status() + if not resp.content: + return {} + data = resp.json() + if "header" in data and "functionExecutionStatus" in data["header"]: + status = data["header"]["functionExecutionStatus"] + if status.get("status") == "Failed": + sd = status.get("statusCodeData", {}) + raise RuntimeError(f"{error_prefix} failed: {sd.get('reasonCode', 'unknown')}/{sd.get('subjectCode', 'unknown')} - {sd.get('message', 'unknown')}") + return data + + +# --- Profile operations --- + +def decode_profiles(blob: bytes) -> list[dict]: + root = find_tag(blob, TAG_PROFILE_INFO_LIST) + if root is None: + raise RuntimeError("Missing ProfileInfoList") + list_ok = find_tag(root, 0xA0) + if list_ok is None: + return [] + defaults = {name: None for name, _ in _PROFILE_FIELDS.values()} + return [{**defaults, **_decode_profile_fields(value)} for tag, value in iter_tlv(list_ok) if tag == 0xE3] + + +def list_profiles(client: AtClient) -> list[dict]: + return decode_profiles(es10x_command(client, bytes.fromhex("BF2D00"))) + + +def _profile_op(client: AtClient, tag: int, iccid: str, refresh: bool, action: str) -> None: + inner = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + if tag != TAG_DELETE_PROFILE: + if not refresh: + inner += encode_tlv(0x81, b'\x00') + inner = encode_tlv(0xA0, inner) + code = _extract_status(es10x_command(client, encode_tlv(tag, inner)), tag, f"{action.capitalize()}Profile") + if code == 0x00: + return + if code == 0x02 and tag != TAG_DELETE_PROFILE: + print(f"profile {iccid} already {action}d") + return + raise RuntimeError(f"{action.capitalize()}Profile failed: {PROFILE_ERROR_CODES.get(code, 'unknown')} (0x{code:02X})") + + +def enable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_ENABLE_PROFILE, iccid, refresh, "enable") + + +def disable_profile(client: AtClient, iccid: str, refresh: bool = True) -> None: + _profile_op(client, TAG_DISABLE_PROFILE, iccid, refresh, "disable") + + +def delete_profile(client: AtClient, iccid: str) -> None: + _profile_op(client, TAG_DELETE_PROFILE, iccid, True, "delete") + + +def set_profile_nickname(client: AtClient, iccid: str, nickname: str) -> None: + nickname_bytes = nickname.encode("utf-8") + if len(nickname_bytes) > 64: + raise ValueError("Profile nickname must be 64 bytes or less") + content = encode_tlv(TAG_ICCID, string_to_tbcd(iccid)) + encode_tlv(0x90, nickname_bytes) + code = _extract_status(es10x_command(client, encode_tlv(TAG_SET_NICKNAME, content)), TAG_SET_NICKNAME, "SetNickname") + if code == 0x01: + raise RuntimeError(f"profile {iccid} not found") + if code != 0x00: + raise RuntimeError(f"SetNickname failed with status 0x{code:02X}") + + +# --- Notifications --- + +def list_notifications(client: AtClient) -> list[dict]: + response = es10x_command(client, encode_tlv(TAG_LIST_NOTIFICATION, b"")) + root = find_tag(response, TAG_LIST_NOTIFICATION) + if root is None: + raise RuntimeError("Missing ListNotificationResponse") + metadata_list = find_tag(root, 0xA0) + if metadata_list is None: + return [] + notifications: list[dict] = [] + for tag, value in iter_tlv(metadata_list): + if tag != TAG_NOTIFICATION_METADATA: + continue + notification = {"seqNumber": None, "profileManagementOperation": None, "notificationAddress": None, "iccid": None} + for t, v in iter_tlv(value): + if (field := _NOTIF_FIELDS.get(t)): + notification[field[0]] = field[1](v) + if notification["seqNumber"] is not None and notification["profileManagementOperation"] is not None and notification["notificationAddress"]: + notifications.append(notification) + return notifications + + +def retrieve_notification(client: AtClient, seq_number: int) -> dict: + request = encode_tlv(TAG_RETRIEVE_NOTIFICATION, encode_tlv(0xA0, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + response = es10x_command(client, request) + root = find_tag(response, TAG_RETRIEVE_NOTIFICATION) + if root is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + a0_content = find_tag(root, 0xA0) + if a0_content is None: + raise RuntimeError("Invalid RetrieveNotificationsListResponse") + pending_notif, pending_tag = None, None + for tag, value in iter_tlv(a0_content): + if tag in (TAG_PROFILE_INSTALL_RESULT, 0x30): + pending_notif, pending_tag = value, tag + break + if pending_notif is None: + raise RuntimeError("Missing PendingNotification") + if pending_tag == TAG_PROFILE_INSTALL_RESULT: + result_data = find_tag(pending_notif, 0xBF27) + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) if result_data else None + else: + notif_meta = find_tag(pending_notif, TAG_NOTIFICATION_METADATA) + if notif_meta is None: + raise RuntimeError("Missing NotificationMetadata") + addr = find_tag(notif_meta, 0x0C) + if addr is None: + raise RuntimeError("Missing notificationAddress") + return {"notificationAddress": addr.decode("utf-8", errors="ignore"), "b64_PendingNotification": b64e(pending_notif)} + + +def remove_notification(client: AtClient, seq_number: int) -> None: + response = es10x_command(client, encode_tlv(TAG_NOTIFICATION_SENT, encode_tlv(TAG_STATUS, _int_bytes(seq_number)))) + root = find_tag(response, TAG_NOTIFICATION_SENT) + if root is None: + raise RuntimeError("Invalid NotificationSentResponse") + status = find_tag(root, TAG_STATUS) + if status is None or int.from_bytes(status, "big") != 0: + raise RuntimeError("RemoveNotificationFromList failed") + + +def process_notifications(client: AtClient) -> None: + for notification in list_notifications(client): + seq_number, smdp_address = notification["seqNumber"], notification["notificationAddress"] + if not seq_number or not smdp_address: + continue + try: + notif_data = retrieve_notification(client, seq_number) + es9p_request(smdp_address, "handleNotification", {"pendingNotification": notif_data["b64_PendingNotification"]}, "HandleNotification") + remove_notification(client, seq_number) + except Exception: + pass + + +# --- Authentication & Download --- + +def get_challenge_and_info(client: AtClient) -> tuple[bytes, bytes]: + challenge_resp = es10x_command(client, encode_tlv(TAG_EUICC_CHALLENGE, b"")) + root = find_tag(challenge_resp, TAG_EUICC_CHALLENGE) + if root is None: + raise RuntimeError("Missing GetEuiccDataResponse") + challenge = find_tag(root, TAG_STATUS) + if challenge is None: + raise RuntimeError("Missing challenge in response") + info_resp = es10x_command(client, encode_tlv(TAG_EUICC_INFO, b"")) + if not info_resp.startswith(bytes([0xBF, 0x20])): + raise RuntimeError("Missing GetEuiccInfo1Response") + return challenge, info_resp + + +def authenticate_server(client: AtClient, b64_signed1: str, b64_sig1: str, b64_pk_id: str, b64_cert: str, matching_id: str | None = None) -> str: + # Build request + tac = bytes([0x35, 0x29, 0x06, 0x11]) + device_info = encode_tlv(TAG_STATUS, tac) + encode_tlv(0xA1, b"") + ctx_inner = b"" + if matching_id: + ctx_inner += encode_tlv(TAG_STATUS, matching_id.encode("utf-8")) + ctx_inner += encode_tlv(0xA1, device_info) + content = base64.b64decode(b64_signed1) + base64.b64decode(b64_sig1) + base64.b64decode(b64_pk_id) + base64.b64decode(b64_cert) + encode_tlv(0xA0, ctx_inner) + request = encode_tlv(TAG_AUTH_SERVER, content) + + response = es10x_command(client, request) + if not response.startswith(bytes([0xBF, 0x38])): + raise RuntimeError("Invalid AuthenticateServerResponse") + + # Check for eUICC-side errors + root = find_tag(response, TAG_AUTH_SERVER) + if root is not None: + error_tag = find_tag(root, 0xA1) + if error_tag is not None: + code = int.from_bytes(error_tag, "big") if error_tag else 0 + desc = AUTH_SERVER_ERROR_CODES.get(code, "unknown") + raise RuntimeError(f"AuthenticateServer rejected by eUICC: {desc} (0x{code:02X})") + + return b64e(response) + + +def prepare_download(client: AtClient, b64_signed2: str, b64_sig2: str, b64_cert: str, cc: str | None = None) -> str: + smdp_signed2 = base64.b64decode(b64_signed2) + smdp_signature2 = base64.b64decode(b64_sig2) + smdp_certificate = base64.b64decode(b64_cert) + smdp_signed2_root = find_tag(smdp_signed2, 0x30) + if smdp_signed2_root is None: + raise RuntimeError("Invalid smdpSigned2") + transaction_id = find_tag(smdp_signed2_root, TAG_STATUS) + cc_required_flag = find_tag(smdp_signed2_root, 0x01) + if transaction_id is None or cc_required_flag is None: + raise RuntimeError("Invalid smdpSigned2") + content = smdp_signed2 + smdp_signature2 + if int.from_bytes(cc_required_flag, "big") != 0: + if not cc: + raise RuntimeError("Confirmation code required but not provided") + content += encode_tlv(0x04, hashlib.sha256(hashlib.sha256(cc.encode("utf-8")).digest() + transaction_id).digest()) + content += smdp_certificate + response = es10x_command(client, encode_tlv(TAG_PREPARE_DOWNLOAD, content)) + if not response.startswith(bytes([0xBF, 0x21])): + raise RuntimeError("Invalid PrepareDownloadResponse") + return b64e(response) + + +def _parse_tlv_header_len(data: bytes) -> int: + """Return the combined tag + length header size for a TLV element.""" + tag_len = 2 if data[0] & 0x1F == 0x1F else 1 + length_byte = data[tag_len] + return tag_len + (1 + (length_byte & 0x7F) if length_byte & 0x80 else 1) + + +def load_bpp(client: AtClient, b64_bpp: str) -> dict: + bpp = b64d(b64_bpp) + if not bpp.startswith(bytes([0xBF, 0x36])): + raise RuntimeError("Invalid BoundProfilePackage") + + bpp_root_value = None + for tag, value, start, end in iter_tlv(bpp, with_positions=True): + if tag == TAG_BPP: + bpp_root_value = value + bpp_value_start = start + _parse_tlv_header_len(bpp[start:end]) + break + if bpp_root_value is None: + raise RuntimeError("Invalid BoundProfilePackage") + + chunks = [] + for tag, value, start, end in iter_tlv(bpp_root_value, with_positions=True): + if tag == 0xBF23: + chunks.append(bpp[0 : bpp_value_start + end]) + elif tag == 0xA0: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + elif tag in (0xA1, 0xA3): + hdr_len = _parse_tlv_header_len(bpp_root_value[start:end]) + chunks.append(bpp[bpp_value_start + start : bpp_value_start + start + hdr_len]) + for _, _, child_start, child_end in iter_tlv(value, with_positions=True): + chunks.append(value[child_start:child_end]) + elif tag == 0xA2: + chunks.append(bpp[bpp_value_start + start : bpp_value_start + end]) + + result = {"seqNumber": 0, "success": False, "bppCommandId": None, "errorReason": None} + for chunk in chunks: + response = es10x_command(client, chunk) + if not response: + continue + root = find_tag(response, TAG_PROFILE_INSTALL_RESULT) + if not root: + continue + result_data = find_tag(root, 0xBF27) + if not result_data: + break + notif_meta = find_tag(result_data, TAG_NOTIFICATION_METADATA) + if notif_meta: + seq_num = find_tag(notif_meta, TAG_STATUS) + if seq_num: + result["seqNumber"] = int.from_bytes(seq_num, "big") + final_result = find_tag(result_data, 0xA2) + if final_result: + for tag, value in iter_tlv(final_result): + if tag == 0xA0: + result["success"] = True + elif tag == 0xA1: + bpp_cmd = find_tag(value, TAG_STATUS) + if bpp_cmd: + result["bppCommandId"] = int.from_bytes(bpp_cmd, "big") + err = find_tag(value, 0x81) + if err: + result["errorReason"] = int.from_bytes(err, "big") + break # ProfileInstallResult received — eUICC session is finalized + if not result["success"] and result["errorReason"] is not None: + cmd_name = BPP_COMMAND_NAMES.get(result["bppCommandId"], f"unknown({result['bppCommandId']})") + err_name = BPP_ERROR_REASONS.get(result["errorReason"], f"unknown({result['errorReason']})") + raise RuntimeError(f"Profile installation failed at {cmd_name}: {err_name} (bppCommandId={result['bppCommandId']}, errorReason={result['errorReason']})") + return result + + +def parse_metadata(b64_metadata: str) -> dict: + root = find_tag(b64d(b64_metadata), 0xBF25) + if root is None: + raise RuntimeError("Invalid profileMetadata") + defaults = {"iccid": None, "serviceProviderName": None, "profileName": None, "iconType": None, "icon": None, "profileClass": None} + return {**defaults, **_decode_profile_fields(root)} + + +def cancel_session(client: AtClient, transaction_id: bytes, reason: int = 127) -> str: + content = encode_tlv(0x80, transaction_id) + encode_tlv(0x81, bytes([reason])) + response = es10x_command(client, encode_tlv(TAG_CANCEL_SESSION, content)) + return b64e(response) + + +def parse_lpa_activation_code(activation_code: str) -> tuple[str, str, str]: + if not activation_code.startswith("LPA:"): + raise ValueError("Invalid activation code format") + + parts = activation_code[4:].split("$") + if len(parts) != 3: + raise ValueError("Invalid activation code format") + + version, smdp, matching_id = [p.strip() for p in parts] + if version != "1": + raise ValueError("Unsupported activation code version") + if len(smdp) == 0 or "." not in smdp: + raise ValueError("Invalid SM-DP+ address in activation code") + if len(matching_id) == 0: + raise ValueError("Missing matching ID in activation code") + return version, smdp, matching_id + + +def download_profile(client: AtClient, activation_code: str) -> str: + _, smdp, matching_id = parse_lpa_activation_code(activation_code) + + challenge, euicc_info = get_challenge_and_info(client) + + payload = {"smdpAddress": smdp, "euiccChallenge": b64e(challenge), "euiccInfo1": b64e(euicc_info)} + if matching_id: + payload["matchingId"] = matching_id + auth = es9p_request(smdp, "initiateAuthentication", payload, "Authentication") + tx_id = base64_trim(auth.get("transactionId", "")) + tx_id_bytes = base64.b64decode(tx_id) if tx_id else b"" + + try: + b64_auth_resp = authenticate_server( + client, base64_trim(auth.get("serverSigned1", "")), base64_trim(auth.get("serverSignature1", "")), + base64_trim(auth.get("euiccCiPKIdToBeUsed", "")), base64_trim(auth.get("serverCertificate", "")), + matching_id=matching_id) + + cli = es9p_request(smdp, "authenticateClient", {"transactionId": tx_id, "authenticateServerResponse": b64_auth_resp}, "Authentication") + metadata = parse_metadata(base64_trim(cli.get("profileMetadata", ""))) + iccid = str(metadata.get("iccid") or "") + print(f'Downloading profile: {iccid} - {metadata["serviceProviderName"]} - {metadata["profileName"]}') + + b64_prep = prepare_download( + client, base64_trim(cli.get("smdpSigned2", "")), base64_trim(cli.get("smdpSignature2", "")), base64_trim(cli.get("smdpCertificate", ""))) + + bpp = es9p_request(smdp, "getBoundProfilePackage", {"transactionId": tx_id, "prepareDownloadResponse": b64_prep}, "GetBoundProfilePackage") + + result = load_bpp(client, base64_trim(bpp.get("boundProfilePackage", ""))) + if result["success"]: + print(f"Profile installed successfully (seqNumber: {result['seqNumber']})") + return iccid + else: + raise RuntimeError(f"Profile installation failed: {result}") + except Exception: + if tx_id_bytes: + b64_cancel_resp = "" + try: + b64_cancel_resp = cancel_session(client, tx_id_bytes) + except Exception: + pass + try: + es9p_request(smdp, "cancelSession", { + "transactionId": tx_id, + "cancelSessionResponse": b64_cancel_resp, + }, "CancelSession") + except Exception: + pass + raise + + +class TiciLPA(LPABase): + handles_modem_restart = True + _instance = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self, interface: Literal["qmi", "at"] = "at", device: str = DEFAULT_DEVICE, baud: int = DEFAULT_BAUD, + timeout: float = DEFAULT_TIMEOUT, verbose: bool = False): + if getattr(self, "_initialized", False): + self.verbose = verbose or self.verbose + return + # This backend is AT-only. Keep interface arg for compatibility with existing CLI/call sites. + self.interface = interface + self.device = device + self.baud = baud + self.timeout = timeout + self.verbose = verbose + self._last_good_device = device + self._euicc_present_cache: bool | None = None + from iqpilot.system.hardware.tici.hardware import get_device_type + self._is_eg25 = get_device_type() in ("tizi",) + self._client: AtClient | None = None + self._initialized = True + # _client is opened lazily via _ensure_client() on first actual eSIM operation. + # Do NOT call _open_ready_client() here: on pSIM devices (no eUICC) it retries + # for 10–30 s against the AT port, blocking hw_state_thread and starving the + # network-type polling loop that drives the WiFi/LTE sidebar indicator. + atexit.register(self.close) + + def close(self) -> None: + if self._client is not None: + try: + self._client.close() + finally: + self._client = None + + @staticmethod + def _set_modemmanager_running(running: bool) -> None: + action = "start" if running else "stop" + subprocess.check_call(["sudo", "systemctl", action, "ModemManager"]) + + @staticmethod + def _is_modemmanager_running() -> bool: + res = subprocess.run(["systemctl", "is-active", "ModemManager"], + capture_output=True, text=True, check=False) + return res.stdout.strip() == "active" + + def _probe_euicc_present(self) -> bool | None: + if self._euicc_present_cache is not None: + return self._euicc_present_cache + + if self._is_modemmanager_running(): + return None + + restarted_modemmanager = False + try: + res = subprocess.run( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-get-slot-status"], + capture_output=True, text=True, check=False, timeout=12, + ) + output = f"{res.stdout}\n{res.stderr}" + if "Is eUICC: yes" in output: + self._euicc_present_cache = True + elif "Is eUICC: no" in output: + self._euicc_present_cache = False + else: + self._euicc_present_cache = None + except Exception: + self._euicc_present_cache = None + finally: + if restarted_modemmanager: + self._set_modemmanager_running(True) + time.sleep(2.0) + + return self._euicc_present_cache + + @staticmethod + def _ttyusb2_mm_ignored() -> bool: + # AGNOS PR 521 marks ttyUSB2 with ID_MM_PORT_IGNORE=1 for EG25. + # If missing, ModemManager may contend with direct AT eSIM operations. + if not os.path.exists("/dev/ttyUSB2"): + return False + try: + res = subprocess.run( + ["udevadm", "info", "-q", "property", "-n", "/dev/ttyUSB2"], + capture_output=True, text=True, check=False, + ) + if res.returncode != 0: + return False + return "ID_MM_PORT_IGNORE=1" in res.stdout + except Exception: + return False + + def _ensure_client(self) -> AtClient: + if self._client is None: + self._client = self._open_ready_client() + return self._client + + @contextmanager + def _open_client(self): + yield self._ensure_client() + + def _open_ready_client(self) -> AtClient: + euicc_present = self._probe_euicc_present() + if euicc_present is False: + raise LPAError("Modem reports no eUICC support on this unit (QMI: Is eUICC: no)") + + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(1, 6): + for device in self._candidate_devices(): + client: AtClient | None = None + try: + if self.verbose: + print(f"!! trying modem AT device: {device} (attempt {attempt})", file=sys.stderr) + client = AtClient(device, self.baud, self.timeout, self.verbose) + client.ensure_capabilities() + client.open_isdr() + self._last_good_device = device + if self.verbose: + print(f"!! selected modem AT device: {device}", file=sys.stderr) + return client + except Exception as e: + if self.verbose: + print(f"!! modem AT device failed: {device}: {e}", file=sys.stderr) + last_error = e + if client is not None: + try: + client.close() + except Exception: + pass + if not recovery_attempted and last_error is not None and self._should_recover_isdr(last_error): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + # Give modem a moment to finish startup / channel release. + time.sleep(min(0.4 * attempt, 1.5)) + assert last_error is not None + raise last_error + + def _candidate_devices(self) -> list[str]: + if self.device and not os.path.exists(self.device): + return [self.device] + + candidates = [ + self._last_good_device, + self.device, + "/dev/modem_at0", + "/dev/ttyUSB3", + "/dev/ttyUSB2", + "/dev/ttyUSB1", + "/dev/ttyUSB0", + ] + ordered: list[str] = [] + for dev in candidates: + should_include = dev in (self.device, "/dev/modem_at0") or os.path.exists(dev) + if dev and dev not in ordered and should_include: + ordered.append(dev) + return ordered if ordered else [self.device] + + @staticmethod + def _to_profile(data: dict) -> Profile: + return Profile( + iccid=str(data.get("iccid") or ""), + nickname=str(data.get("profileNickname") or ""), + enabled=str(data.get("profileState") or "") == "enabled", + provider=str(data.get("serviceProviderName") or ""), + ) + + def _clear_cat_busy(self) -> None: + time.sleep(3) + try: + self._ensure_client().query('AT+QSTKRSP=254') + except Exception: + pass + time.sleep(1) + try: + self._ensure_client().query('AT+CFUN=4') + except Exception: + pass + time.sleep(2) + try: + self._ensure_client().query('AT+CFUN=1') + except Exception: + pass + self._ensure_client().channel = None + time.sleep(5) + + def _wait_for_modem(self, timeout: float = 45.0) -> None: + start = time.monotonic() + last_error: Exception | None = None + while time.monotonic() - start < timeout: + try: + self.close() + self._client = self._open_ready_client() + return + except Exception as e: + last_error = e + time.sleep(2) + if last_error is not None: + raise RuntimeError("Modem did not recover after reboot") from last_error + raise RuntimeError("Modem did not recover after reboot") + + def _restart_modem(self) -> None: + client = self._ensure_client() + for cmd in ('AT+CFUN=0', 'AT+CFUN=1,1'): + try: + client.query(cmd) + except Exception: + pass + client.channel = None + client._use_csim = False + self._wait_for_modem() + + @staticmethod + def _should_recover_isdr(error: Exception) -> bool: + message = str(error).lower() + markers = ( + "failed to open isd-r", + "failed to access euicc isd-r", + "simfilenotfound", + "at+ccho", + "at+cgla", + ) + return any(marker in message for marker in markers) + + def _recover_isdr_access(self) -> bool: + was_modemmanager_running = self._is_modemmanager_running() + self.close() + try: + if was_modemmanager_running: + self._set_modemmanager_running(False) + time.sleep(2.0) + + for cmd in ( + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-reset"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-off=1"], + ["sudo", "qmicli", "-p", "-d", "/dev/cdc-wdm0", "--uim-sim-power-on=1"], + ): + subprocess.check_call(cmd) + time.sleep(2.0) + + self._euicc_present_cache = None + return True + except Exception as e: + if self.verbose: + print(f"!! ISD-R recovery failed: {e}", file=sys.stderr) + return False + finally: + if was_modemmanager_running: + self._set_modemmanager_running(True) + time.sleep(2.0) + + def _with_lpa_error(self, fn): + last_error: Exception | None = None + recovery_attempted = False + for attempt in range(3): + try: + return fn() + except LPAError: + raise + except RuntimeError as e: + last_error = e + if "does not provide usable esim functionality" in str(e).lower(): + raise LPAError(str(e)) from e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(str(e)) from e + except (OSError, serial.SerialException) as e: + last_error = e + if not recovery_attempted and self._should_recover_isdr(e): + recovery_attempted = self._recover_isdr_access() + if recovery_attempted: + continue + if self._is_transient_transport_error(str(e)) and attempt == 0: + self._wait_for_modem() + continue + raise LPAError(f"AT transport error: {e}") from e + except TimeoutError as e: + raise LPAError(f"AT modem timeout: {e}") from e + except ValueError as e: + raise LPAError(str(e)) from e + assert last_error is not None + raise LPAError(str(last_error)) + + @staticmethod + def _is_transient_transport_error(message: str) -> bool: + lower = message.lower() + transient_markers = ( + "broken pipe", + "resource busy", + "input/output error", + "device disconnected", + "device reports readiness to read but returned no data", + "transport error", + "missing +cgla response", + "missing +csim response", + "malformed +cgla response payload", + "malformed +csim response payload", + "non-hexadecimal number found in fromhex", + ) + return any(m in lower for m in transient_markers) + + def list_profiles(self) -> list[Profile]: + def _run() -> list[Profile]: + return [self._to_profile(p) for p in list_profiles(self._ensure_client())] + return self._with_lpa_error(_run) + + def get_active_profile(self) -> Profile | None: + return next((p for p in self.list_profiles() if p.enabled), None) + + def _validate_profile_exists(self, iccid: str) -> None: + if not any(p.iccid == iccid for p in self.list_profiles()): + raise LPAProfileNotFoundError(f"profile {iccid} does not exist") + + def _is_bootstrapped(self) -> bool: + return not any(self.is_comma_profile(p.iccid) for p in self.list_profiles()) + + def _ensure_switchable_profile(self, iccid: str) -> None: + if self.is_comma_profile(iccid): + return + + if not self._is_bootstrapped(): + raise LPAError( + "Delete the existing Comma pSIM profile before activating a user eSIM profile" + ) + + def _process_notifications_after_delete(self, client: AtClient, iccid: str) -> None: + try: + process_notifications(client) + return + except Exception as error: + notification_error = error + + self._restart_modem() + + try: + deleted = not any(p.iccid == iccid for p in self.list_profiles()) + except Exception: + raise RuntimeError( + "Profile delete may have succeeded, but modem notification cleanup failed; " + "refresh profiles and retry if needed" + ) from notification_error + + if deleted: + return + + raise RuntimeError( + "Profile delete did not finish cleanly; refresh profiles and retry" + ) from notification_error + + def _process_notifications_after_state_change( + self, + validator, + recovery_message: str, + failure_message: str, + ) -> None: + try: + process_notifications(self._ensure_client()) + return + except Exception as notification_error: + pass + + self._wait_for_modem() + + try: + if validator(): + return + except Exception: + raise RuntimeError(recovery_message) from notification_error + + raise RuntimeError(failure_message) from notification_error + + def delete_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + raise LPAError("cannot delete active profile, switch to another profile first") + + def _run() -> None: + client = self._ensure_client() + try: + delete_profile(client, iccid) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + delete_profile(client, iccid) + else: + raise + self._process_notifications_after_delete(client, iccid) + + self._with_lpa_error(_run) + + def bootstrap(self) -> None: + comma_profiles = [p for p in self.list_profiles() if self.is_comma_profile(p.iccid)] + if not comma_profiles: + return + + def _run() -> None: + client = self._ensure_client() + for profile in comma_profiles: + if profile.enabled: + disable_profile(client, profile.iccid, refresh=True) + process_notifications(client) + delete_profile(client, profile.iccid) + process_notifications(client) + self._restart_modem() + + self._with_lpa_error(_run) + + def download_profile(self, qr: str, nickname: str | None = None) -> None: + # Strict upfront validation to provide immediate user feedback. + parse_lpa_activation_code(qr) + before = {p.iccid for p in self.list_profiles()} + + def _run() -> None: + client = self._ensure_client() + iccid = download_profile(client, qr) + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid for profile in self.list_profiles()), + "Profile add may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile add did not finish cleanly; refresh profiles and retry", + ) + + self._with_lpa_error(_run) + + if nickname: + after = self.list_profiles() + new_profile = next((p for p in after if p.iccid not in before), None) + if new_profile is not None and new_profile.iccid: + self.nickname_profile(new_profile.iccid, nickname) + + def nickname_profile(self, iccid: str, nickname: str) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + set_profile_nickname(self._ensure_client(), iccid, nickname) + self._with_lpa_error(_run) + + def switch_profile(self, iccid: str) -> None: + self._validate_profile_exists(iccid) + self._ensure_switchable_profile(iccid) + active = self.get_active_profile() + if active is not None and active.iccid == iccid: + return + + def _run() -> None: + client = self._ensure_client() + use_refresh = self._is_eg25 + try: + enable_profile(client, iccid, refresh=use_refresh) + except RuntimeError as error: + if "catbusy" in str(error).lower(): + self._clear_cat_busy() + enable_profile(client, iccid, refresh=use_refresh) + else: + raise + client.channel = None + client._use_csim = False + if use_refresh: + self._wait_for_modem() + else: + self._restart_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile switch may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile switch did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + # Compatibility methods retained for old tests/scripts. + def process_notifications(self) -> None: + def _run() -> None: + process_notifications(self._ensure_client()) + self._with_lpa_error(_run) + + def enable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + enable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and profile.enabled for profile in self.list_profiles()), + "Profile enable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile enable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + def disable_profile(self, iccid: str, refresh: bool = True) -> None: + self._validate_profile_exists(iccid) + + def _run() -> None: + client = self._ensure_client() + disable_profile(client, iccid, refresh=refresh) + client.channel = None + client._use_csim = False + self._wait_for_modem() + self._process_notifications_after_state_change( + lambda: any(profile.iccid == iccid and not profile.enabled for profile in self.list_profiles()), + "Profile disable may have succeeded, but modem notification cleanup failed; refresh profiles", + "Profile disable did not finish cleanly; refresh profiles and retry", + ) + self._with_lpa_error(_run) + + +# --- CLI --- + +def main() -> None: + parser = argparse.ArgumentParser(description="Minimal AT-only LPA implementation") + parser.add_argument("--device", default=DEFAULT_DEVICE) + parser.add_argument("--baud", type=int, default=DEFAULT_BAUD) + parser.add_argument("--timeout", type=float, default=DEFAULT_TIMEOUT) + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--enable", type=str) + parser.add_argument("--disable", type=str) + parser.add_argument("--delete", type=str, metavar="ICCID", help="Delete a disabled profile") + parser.add_argument("--no-refresh", action="store_true", help="Skip REFRESH after enable/disable") + parser.add_argument("--set-nickname", nargs=2, metavar=("ICCID", "NICKNAME")) + parser.add_argument("--list-notifications", action="store_true") + parser.add_argument("--process-notifications", action="store_true") + parser.add_argument("--download", type=str, metavar="CODE") + args = parser.parse_args() + + lpa = TiciLPA(device=args.device, baud=args.baud, timeout=args.timeout, verbose=args.verbose) + + if args.enable: + lpa.enable_profile(args.enable, refresh=not args.no_refresh) + elif args.disable: + lpa.disable_profile(args.disable, refresh=not args.no_refresh) + elif args.delete: + lpa.delete_profile(args.delete) + elif args.set_nickname: + lpa.nickname_profile(args.set_nickname[0], args.set_nickname[1]) + elif args.list_notifications: + with lpa._open_client() as client: + print(json.dumps(list_notifications(client), indent=2)) + return + elif args.process_notifications: + lpa.process_notifications() + return + elif args.download: + lpa.download_profile(args.download) + + profiles_out = [{ + "iccid": p.iccid, + "profileNickname": p.nickname, + "profileState": "enabled" if p.enabled else "disabled", + "serviceProviderName": p.provider, + } for p in lpa.list_profiles()] + print(json.dumps(profiles_out, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/hardware/tici/pins.py b/iqpilot/system/hardware/tici/pins.py new file mode 100644 index 000000000..d53183f7a --- /dev/null +++ b/iqpilot/system/hardware/tici/pins.py @@ -0,0 +1,30 @@ +# GPIO pin definitions +class GPIO: + # both GPIO_STM_RST_N and GPIO_LTE_RST_N are misnamed, they are high to reset + HUB_RST_N = 30 + UBLOX_RST_N = 32 + UBLOX_SAFEBOOT_N = 33 + GNSS_PWR_EN = 34 # SCHEMATIC LABEL: GPIO_UBLOX_PWR_EN + + STM_RST_N = 124 + STM_BOOT0 = 134 + STM_PWR_EN_N = 41 # because STM32H7 RST doesn't generate a full power-on-reset + + SIREN = 42 + SOM_ST_IO = 49 + + LTE_RST_N = 50 + LTE_PWRKEY = 116 + LTE_BOOT = 52 + + # GPIO_CAM0_DVDD_EN = /sys/kernel/debug/regulator/camera_rear_ldo + CAM0_AVDD_EN = 8 + CAM0_RSTN = 9 + CAM1_RSTN = 7 + CAM2_RSTN = 12 + + # Sensor interrupts + BMX055_ACCEL_INT = 21 + BMX055_GYRO_INT = 23 + BMX055_MAGN_INT = 87 + LSM_INT = 84 diff --git a/iqpilot/system/hardware/tici/power_monitor.py b/iqpilot/system/hardware/tici/power_monitor.py new file mode 100755 index 000000000..ea855dfe4 --- /dev/null +++ b/iqpilot/system/hardware/tici/power_monitor.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +import sys +import time +import datetime +import numpy as np +from collections import deque + +from iqpilot.common.realtime import Ratekeeper +from iqpilot.common.filter_simple import FirstOrderFilter + + +def read_power(): + with open("/sys/bus/i2c/devices/0-0040/hwmon/hwmon1/power1_input") as f: + return int(f.read()) / 1e6 + +def sample_power(seconds=5) -> list[float]: + rate = 123 + rk = Ratekeeper(rate, print_delay_threshold=None) + + pwrs = [] + for _ in range(rate*seconds): + pwrs.append(read_power()) + rk.keep_time() + return pwrs + +def get_power(seconds=5): + pwrs = sample_power(seconds) + return np.mean(pwrs) + +def wait_for_power(min_pwr, max_pwr, min_secs_in_range, timeout): + start_time = time.monotonic() + pwrs = deque([min_pwr - 1.]*min_secs_in_range, maxlen=min_secs_in_range) + while (time.monotonic() - start_time < timeout): + pwrs.append(get_power(1)) + if all(min_pwr <= p <= max_pwr for p in pwrs): + break + return np.mean(pwrs) + + +if __name__ == "__main__": + duration = None + if len(sys.argv) > 1: + duration = int(sys.argv[1]) + + rate = 23 + rk = Ratekeeper(rate, print_delay_threshold=None) + fltr = FirstOrderFilter(0, 5, 1. / rate, initialized=False) + + measurements = [] + start_time = time.monotonic() + + try: + while duration is None or time.monotonic() - start_time < duration: + fltr.update(read_power()) + if rk.frame % rate == 0: + measurements.append(fltr.x) + t = datetime.timedelta(seconds=time.monotonic() - start_time) + avg = sum(measurements) / len(measurements) + print(f"Now: {fltr.x:.2f} W, Avg: {avg:.2f} W over {t}") + rk.keep_time() + except KeyboardInterrupt: + pass + + t = datetime.timedelta(seconds=time.monotonic() - start_time) + avg = sum(measurements) / len(measurements) + print(f"\nAverage power: {avg:.2f}W over {t}") diff --git a/iqpilot/system/hardware/tici/qr_decode.py b/iqpilot/system/hardware/tici/qr_decode.py new file mode 100644 index 000000000..ede27e442 --- /dev/null +++ b/iqpilot/system/hardware/tici/qr_decode.py @@ -0,0 +1,145 @@ +import ctypes +import hashlib +import os +import subprocess +from pathlib import Path + +import numpy as np + +try: + from pyzbar.pyzbar import decode as _pyzbar_decode +except Exception: + _pyzbar_decode = None + + +ROOT = Path(__file__).resolve().parents[3] +QUIRC_LIB_DIR = ROOT / "third_party" / "quirc" / "lib" +HELPER_C = Path(__file__).with_name("qr_decode_quirc.c") +BUILD_DIR = ROOT / ".run" / "cache" / "esim_qr" +SO_PATH = BUILD_DIR / "libiqpilot_quirc_decode.so" + +_LIB: ctypes.CDLL | None = None + + +def _build_decoder() -> bool: + BUILD_DIR.mkdir(parents=True, exist_ok=True) + cmd = [ + os.environ.get("CC", "cc"), + "-O2", + "-shared", + "-fPIC", + str(HELPER_C), + str(QUIRC_LIB_DIR / "quirc.c"), + str(QUIRC_LIB_DIR / "identify.c"), + str(QUIRC_LIB_DIR / "decode.c"), + str(QUIRC_LIB_DIR / "version_db.c"), + "-I", + str(QUIRC_LIB_DIR), + "-o", + str(SO_PATH), + ] + try: + subprocess.check_output(cmd, stderr=subprocess.STDOUT) + return True + except Exception: + return False + + +def _load_decoder() -> ctypes.CDLL | None: + global _LIB + if _LIB is not None: + return _LIB + + if not SO_PATH.exists(): + if not _build_decoder(): + return None + + try: + lib = ctypes.CDLL(str(SO_PATH)) + lib.iqpilot_decode_qr_gray.argtypes = [ + ctypes.POINTER(ctypes.c_uint8), + ctypes.c_int, + ctypes.c_int, + ctypes.c_char_p, + ctypes.c_int, + ] + lib.iqpilot_decode_qr_gray.restype = ctypes.c_int + _LIB = lib + return _LIB + except Exception: + return None + + +def decode_qr(image: bytes | np.ndarray, width: int | None = None, height: int | None = None) -> list[str]: + """ + Decode QR payloads from a grayscale image. + Accepts: + - ndarray shape (H, W), uint8 + - bytes + explicit width/height + """ + arr: np.ndarray + if isinstance(image, np.ndarray): + if image.ndim != 2: + raise ValueError("decode_qr expects grayscale ndarray with shape (H, W)") + arr = np.ascontiguousarray(image, dtype=np.uint8) + h, w = arr.shape + else: + if width is None or height is None: + raise ValueError("width and height are required when passing raw bytes") + arr = np.frombuffer(image, dtype=np.uint8).reshape((height, width)) + arr = np.ascontiguousarray(arr) + h, w = arr.shape + + if _pyzbar_decode is not None: + try: + pyzbar_results = _pyzbar_decode(arr) + payloads = [] + for result in pyzbar_results: + payload = result.data.decode("utf-8", errors="ignore").strip() + if payload: + payloads.append(payload) + if payloads: + return payloads + except Exception: + pass + + lib = _load_decoder() + if lib is None: + return [] + + out_size = 8192 + out_buf = ctypes.create_string_buffer(out_size) + count = lib.iqpilot_decode_qr_gray( + arr.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8)), + int(w), + int(h), + out_buf, + out_size, + ) + if count <= 0: + return [] + + raw = out_buf.value.decode("utf-8", errors="ignore") + return [line.strip() for line in raw.splitlines() if line.strip()] + + +def validate_lpa_activation_code(payload: str) -> tuple[bool, str]: + if not payload.startswith("LPA:"): + return False, "QR does not contain an LPA activation code" + + parts = payload[4:].split("$") + if len(parts) != 3: + return False, "Invalid LPA format" + + version, smdp, matching = [p.strip() for p in parts] + if version != "1": + return False, "Unsupported LPA version" + if len(smdp) == 0 or "." not in smdp: + return False, "Invalid SM-DP+ address" + if len(matching) == 0: + return False, "Missing matching ID" + return True, "" + + +def stable_code_key(payload: str) -> str: + return hashlib.sha256(payload.encode("utf-8")).hexdigest() diff --git a/iqpilot/system/hardware/tici/restart_modem.sh b/iqpilot/system/hardware/tici/restart_modem.sh new file mode 100755 index 000000000..741dc7205 --- /dev/null +++ b/iqpilot/system/hardware/tici/restart_modem.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +#nmcli connection modify --temporary lte gsm.home-only yes +#nmcli connection modify --temporary lte gsm.auto-config yes +#nmcli connection modify --temporary lte connection.autoconnect-retries 20 +sudo nmcli connection reload + +sudo systemctl stop ModemManager +nmcli con down lte +nmcli con down blue-prime + +# power cycle modem +/usr/comma/lte/lte.sh stop_blocking +/usr/comma/lte/lte.sh start + +sudo systemctl restart NetworkManager +#sudo systemctl restart ModemManager +sudo ModemManager --debug diff --git a/iqpilot/system/hardware/tici/set_usb_storage.sh b/iqpilot/system/hardware/tici/set_usb_storage.sh new file mode 100755 index 000000000..8c3ba1b8c --- /dev/null +++ b/iqpilot/system/hardware/tici/set_usb_storage.sh @@ -0,0 +1,233 @@ +#!/bin/bash +# USB mass-storage gadget exposing a snapshot of /data/media/0/realdata (dashcam clips + logs) +# over the same configfs gadget mechanism as /usr/comma/set_adb.sh. openpilot keeps running; the +# export is a read-only snapshot built at enable time, not a live view of realdata. +# +# The device only has one physical USB controller (UDC), so ADB and USB storage must live in the +# SAME composite gadget (/config/usb_gadget/g1) rather than each owning their own. Earlier versions +# of this script called /usr/comma/set_adb.sh as a black box and then unbound/rebound around it, +# but that intermediate bind/unbind churn made the *next* bind flaky (functionfs needs its +# userspace side, adbd, settled before the gadget can (re)bind). So instead we replicate set_adb.sh's +# handful of setup lines directly here and do exactly one bind at the end, covering whichever +# functions (ADB, mass storage) are currently enabled. +# +# Without composing like this, comma's adb-param-watcher systemd unit (which fires whenever +# /data/params/d/AdbEnabled is touched, even to the same value) would rebuild g1 with only its own +# functions and silently drop ours. + +set -e + +# serialize invocations: rapid toggling can otherwise race on the same /config/usb_gadget/g1 tree +# and leave it in a half-built state +LOCKFILE="/tmp/set_usb_storage.lock" +exec 9>"$LOCKFILE" +flock 9 + +IMG="/data/media/0/usb_storage.img" +LOOP_MNT="/tmp/usb_storage_mnt" +REALDATA="/data/media/0/realdata" +UDC_NAME="a600000.dwc3" +GADGET="/config/usb_gadget/g1" +SAFETY_MARGIN_KB=$((2 * 1024 * 1024)) # keep 2GB free on /data after the image +CAP_KB=$((4 * 1024 * 1024)) # never build more than a 4GB snapshot (FAT32 + dir overhead eats into this) + +build_image() { + avail_kb=$(df --output=avail -k /data | tail -1) + budget_kb=$((avail_kb - SAFETY_MARGIN_KB)) + if [ "$budget_kb" -gt "$CAP_KB" ]; then + budget_kb=$CAP_KB + fi + if [ "$budget_kb" -lt $((512 * 1024)) ]; then + echo "Not enough free space on /data to build a USB storage snapshot" >&2 + exit 1 + fi + + echo "Building ${budget_kb}KB FAT32 snapshot image at $IMG" + sudo rm -f "$IMG" + sudo fallocate -l "${budget_kb}K" "$IMG" || sudo dd if=/dev/zero of="$IMG" bs=1M count=$((budget_kb / 1024)) + sudo mkfs.vfat -F 32 -n IQPILOT "$IMG" + + sudo mkdir -p "$LOOP_MNT" + LOOP_DEV=$(sudo losetup -f) + sudo losetup "$LOOP_DEV" "$IMG" + sudo mount -t vfat "$LOOP_DEV" "$LOOP_MNT" + + # select the most recent files up to budget, then copy them in one rsync + # pass (this script already runs as root, and one process beats thousands + # of per-file forked sudo/mkdir/cp calls, which was previously the actual + # bottleneck, not disk throughput). + copy_budget_kb=$((budget_kb * 90 / 100)) + filelist=$(mktemp) + find "$REALDATA" -type f -printf '%T@ %s %P\n' 2>/dev/null | sort -rn | awk -v budget="$copy_budget_kb" ' + { used += int(($2 + 1023) / 1024); if (used > budget) { exit } print $3 } + ' > "$filelist" + mkdir -p "$LOOP_MNT/realdata" + # FAT32 has no concept of unix owner/group/perms, so don't ask rsync to preserve them + rsync -rt --files-from="$filelist" "$REALDATA/" "$LOOP_MNT/realdata/" + echo "Copied $(wc -l < "$filelist") files into snapshot" + rm -f "$filelist" + + sudo umount "$LOOP_MNT" + sudo losetup -d "$LOOP_DEV" +} + +unbind() { + if [ -d "$GADGET" ]; then + cd "$GADGET" + echo "" | sudo tee UDC >/dev/null 2>&1 || true + fi +} + +set_attr() { + [ "$(cat "$1" 2>/dev/null)" = "$2" ] && return 0 + echo "$2" | sudo tee "$1" >/dev/null 2>&1 || true +} + +ensure_base() { + if ! mountpoint -q /config; then + sudo mount -t configfs none /config + fi + sudo mkdir -p "$GADGET/strings/0x409" "$GADGET/configs/c.1/strings/0x409" + cd "$GADGET" + # `[ -s ]` never guards a configfs attribute: an unset idVendor still reads back + # as "0x0000", so those writes were all skipped and the gadget stayed nameless + set_attr idVendor 0x04D8 + set_attr idProduct 0x1235 + set_attr strings/0x409/serialnumber "$(sed -e 's/^.*androidboot.serialno=//' -e 's/ .*$//' /proc/cmdline)" + set_attr strings/0x409/manufacturer "comma.ai" + set_attr strings/0x409/product "IQ.Pilot" + set_attr configs/c.1/MaxPower 250 + set_attr configs/c.1/strings/0x409/configuration "IQ.Pilot" +} + +add_adb() { + # same rationale as add_mass_storage: start from a clean slate to avoid stale busy attributes + remove_adb + cd "$GADGET" + sudo mkdir -p functions/ffs.adb + sudo mkdir -p /dev/usb-ffs/adb + if ! mountpoint -q /dev/usb-ffs/adb; then + sudo mount -t functionfs adb /dev/usb-ffs/adb + fi + sudo rm -f configs/c.1/ffs.adb + sudo ln -s functions/ffs.adb configs/c.1/ + setprop service.adb.tcp.port -1 2>/dev/null || true + sudo systemctl start adbd + # adbd needs a moment to open the ffs endpoint and negotiate descriptors before the gadget can bind + sleep 1 +} + +remove_adb() { + sudo systemctl stop adbd || true + if [ -d "$GADGET" ]; then + cd "$GADGET" + sudo rm -f configs/c.1/ffs.adb + sudo umount /dev/usb-ffs/adb 2>/dev/null || true + sudo rmdir functions/ffs.adb 2>/dev/null || true + fi +} + +# ncm carries the usb0 ethernet link. ADB needs it, but so does the Mac-backed +# model worker with ADB off, so it is enabled independently of either. +# the kernel randomises the ncm MACs every boot, so macOS sees a new adapter each +# time and orphans the network service holding the link's static address +ncm_id() { + local id + id=$(tr -dc '0-9a-f' < /data/params/d/DongleId 2>/dev/null | tail -c 6) + [ ${#id} -eq 6 ] || id="000001" + echo "$id" +} + +add_ncm() { + remove_ncm + cd "$GADGET" + sudo mkdir -p functions/ncm.0 + local id + id=$(ncm_id) + # best effort: some kernels create the ncm netdev lazily and fail these writes + # with ENODEV, and a pinned MAC is never worth losing the whole gadget over + echo "02:49:51:${id:0:2}:${id:2:2}:${id:4:2}" | sudo tee functions/ncm.0/host_addr >/dev/null 2>&1 || true + echo "06:49:51:${id:0:2}:${id:2:2}:${id:4:2}" | sudo tee functions/ncm.0/dev_addr >/dev/null 2>&1 || true + sudo rm -f configs/c.1/ncm.0 + sudo ln -s functions/ncm.0 configs/c.1/ +} + +remove_ncm() { + if [ -d "$GADGET" ]; then + cd "$GADGET" + sudo rm -f configs/c.1/ncm.0 + sudo rmdir functions/ncm.0 2>/dev/null || true + fi +} + +add_mass_storage() { + # a function group that's ever been bound before can refuse attribute writes ("Device or + # resource busy") until it's torn down and recreated fresh, so always start from a clean slate + remove_mass_storage + cd "$GADGET" + sudo mkdir -p functions/mass_storage.0 + echo 1 | sudo tee functions/mass_storage.0/stall >/dev/null + echo 1 | sudo tee functions/mass_storage.0/lun.0/removable >/dev/null + echo 1 | sudo tee functions/mass_storage.0/lun.0/ro >/dev/null + echo "$IMG" | sudo tee functions/mass_storage.0/lun.0/file >/dev/null + sudo rm -f configs/c.1/mass_storage.0 + sudo ln -s functions/mass_storage.0 configs/c.1/ +} + +remove_mass_storage() { + if [ -d "$GADGET" ]; then + cd "$GADGET" + sudo rm -f configs/c.1/mass_storage.0 + sudo rmdir functions/mass_storage.0 2>/dev/null || true + fi +} + +bind() { + cd "$GADGET" + for attempt in $(seq 1 20); do + if echo "$UDC_NAME" | sudo tee UDC >/dev/null 2>&1; then + return 0 + fi + sleep 0.5 + done + echo "$UDC_NAME" | sudo tee UDC +} + +read_bool_param() { + [ -f "$1" ] && [ "$(< "$1")" == "1" ] +} + +USB_STORAGE_ENABLE=0 +read_bool_param "/data/params/d/UsbStorageEnabled" && USB_STORAGE_ENABLE=1 +ADB_ENABLE=0 +read_bool_param "/data/params/d/AdbEnabled" && ADB_ENABLE=1 +EMAC_ENABLE=0 +read_bool_param "/data/params/d/IQEmacEnabled" && EMAC_ENABLE=1 + +unbind +ensure_base + +if [ "$ADB_ENABLE" == "1" ] || [ "$EMAC_ENABLE" == "1" ]; then + add_ncm +else + remove_ncm +fi + +if [ "$ADB_ENABLE" == "1" ]; then + add_adb +else + remove_adb +fi + +if [ "$USB_STORAGE_ENABLE" == "1" ]; then + echo "Enabling USB storage mode" + if [ ! -f "$IMG" ] || [ "$1" == "--rebuild" ]; then + build_image + fi + add_mass_storage +else + echo "Disabling USB storage mode" + remove_mass_storage +fi + +bind diff --git a/iqpilot/system/hardware/tici/tests/__init__.py b/iqpilot/system/hardware/tici/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/hardware/tici/tests/compare_casync_manifest.py b/iqpilot/system/hardware/tici/tests/compare_casync_manifest.py new file mode 100755 index 000000000..258ef8810 --- /dev/null +++ b/iqpilot/system/hardware/tici/tests/compare_casync_manifest.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +import argparse +import collections +import multiprocessing +import os + +import requests +from tqdm import tqdm + +import iqpilot.system.hardware.tici.casync as casync + + +def get_chunk_download_size(chunk): + sha = chunk.sha.hex() + path = os.path.join(remote_url, sha[:4], sha + ".cacnk") + if os.path.isfile(path): + return os.path.getsize(path) + else: + r = requests.head(path, timeout=10) + r.raise_for_status() + return int(r.headers['content-length']) + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description='Compute overlap between two casync manifests') + parser.add_argument('frm') + parser.add_argument('to') + args = parser.parse_args() + + frm = casync.parse_caibx(args.frm) + to = casync.parse_caibx(args.to) + remote_url = args.to.replace('.caibx', '') + + most_common = collections.Counter(t.sha for t in to).most_common(1)[0][0] + + frm_dict = casync.build_chunk_dict(frm) + + # Get content-length for each chunk + with multiprocessing.Pool() as pool: + szs = list(tqdm(pool.imap(get_chunk_download_size, to), total=len(to))) + chunk_sizes = {t.sha: sz for (t, sz) in zip(to, szs, strict=True)} + + sources: dict[str, list[int]] = { + 'seed': [], + 'remote_uncompressed': [], + 'remote_compressed': [], + } + + for chunk in to: + # Assume most common chunk is the zero chunk + if chunk.sha == most_common: + continue + + if chunk.sha in frm_dict: + sources['seed'].append(chunk.length) + else: + sources['remote_uncompressed'].append(chunk.length) + sources['remote_compressed'].append(chunk_sizes[chunk.sha]) + + print() + print("Update statistics (excluding zeros)") + print() + print("Download only with no seed:") + print(f" Remote (uncompressed)\t\t{sum(sources['seed'] + sources['remote_uncompressed']) / 1000 / 1000:.2f} MB\tn = {len(to)}") + print(f" Remote (compressed download)\t{sum(chunk_sizes.values()) / 1000 / 1000:.2f} MB\tn = {len(to)}") + print() + print("Upgrade with seed partition:") + print(f" Seed (uncompressed)\t\t{sum(sources['seed']) / 1000 / 1000:.2f} MB\t\t\t\tn = {len(sources['seed'])}") + sz, n = sum(sources['remote_uncompressed']), len(sources['remote_uncompressed']) + print(f" Remote (uncompressed)\t\t{sz / 1000 / 1000:.2f} MB\t(avg {sz / 1000 / 1000 / n:4f} MB)\tn = {n}") + sz, n = sum(sources['remote_compressed']), len(sources['remote_compressed']) + print(f" Remote (compressed download)\t{sz / 1000 / 1000:.2f} MB\t(avg {sz / 1000 / 1000 / n:4f} MB)\tn = {n}") diff --git a/iqpilot/system/hardware/tici/tests/test_agnos_updater.py b/iqpilot/system/hardware/tici/tests/test_agnos_updater.py new file mode 100644 index 000000000..d238eb8be --- /dev/null +++ b/iqpilot/system/hardware/tici/tests/test_agnos_updater.py @@ -0,0 +1,37 @@ +import json +import os +import requests + +TEST_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__))) +MANIFESTS = [ + os.path.join(TEST_DIR, "../agnos.json"), + os.path.join(TEST_DIR, "../agnos_tici_15_1.json"), +] + +IMAGE_HOST = "git.konn3kt.com" + +XZ_MAGIC = b"\xfd7zXZ\x00" +LFS_POINTER_MAGIC = b"version https://git-lfs" + + +class TestAgnosUpdater: + + def test_manifest(self): + for manifest in MANIFESTS: + with open(manifest) as f: + m = json.load(f) + + for img in m: + assert img['url'].split('/')[2] == IMAGE_HOST + if not img['sparse']: + assert img['hash'] == img['hash_raw'] + + s = requests.Session() + s.trust_env = False + r = s.get(img['url'], timeout=10, stream=True, + headers={"User-Agent": "IQOS-Updater"}) + if r.status_code in (401, 403, 404): + continue + head = next(r.iter_content(chunk_size=256), b"") or b"" + assert not head.startswith(XZ_MAGIC), f"{img['name']}: anonymous request served image content" + assert not head.startswith(LFS_POINTER_MAGIC), f"{img['name']}: anonymous request served the LFS pointer" diff --git a/iqpilot/system/hardware/tici/tests/test_amplifier.py b/iqpilot/system/hardware/tici/tests/test_amplifier.py new file mode 100644 index 000000000..1073d5771 --- /dev/null +++ b/iqpilot/system/hardware/tici/tests/test_amplifier.py @@ -0,0 +1,66 @@ +import pytest +import time +import random +import subprocess + +from panda import Panda +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.hardware.tici.hardware import Tici +from iqpilot.system.hardware.tici.amplifier import Amplifier + + +@pytest.mark.tici +class TestAmplifier: + + def setup_method(self): + # clear dmesg + subprocess.check_call("sudo dmesg -C", shell=True) + + HARDWARE.reset_internal_panda() + Panda.wait_for_panda(None, 30) + self.panda = Panda() + + def teardown_method(self): + HARDWARE.reset_internal_panda() + + def _check_for_i2c_errors(self, expected): + dmesg = subprocess.check_output("dmesg", shell=True, encoding='utf8') + i2c_lines = [l for l in dmesg.strip().splitlines() if 'i2c_geni a88000.i2c' in l] + i2c_str = '\n'.join(i2c_lines) + + if not expected: + return len(i2c_lines) == 0 + else: + return "i2c error :-107" in i2c_str or "Bus arbitration lost" in i2c_str + + def test_init(self): + amp = Amplifier(debug=True) + r = amp.initialize_configuration(Tici().get_device_type()) + assert r + assert self._check_for_i2c_errors(False) + + def test_shutdown(self): + amp = Amplifier(debug=True) + for _ in range(10): + r = amp.set_global_shutdown(True) + r = amp.set_global_shutdown(False) + # amp config should be successful, with no i2c errors + assert r + assert self._check_for_i2c_errors(False) + + def test_init_while_siren_play(self): + for _ in range(10): + self.panda.set_siren(False) + time.sleep(0.1) + + self.panda.set_siren(True) + time.sleep(random.randint(0, 5)) + + amp = Amplifier(debug=True) + r = amp.initialize_configuration(Tici().get_device_type()) + assert r + + if self._check_for_i2c_errors(True): + break + else: + pytest.fail("didn't hit any i2c errors") diff --git a/iqpilot/system/hardware/tici/tests/test_esim.py b/iqpilot/system/hardware/tici/tests/test_esim.py new file mode 100644 index 000000000..614cb8b4c --- /dev/null +++ b/iqpilot/system/hardware/tici/tests/test_esim.py @@ -0,0 +1,238 @@ +import pytest + +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.hardware.base import LPAError, LPAProfileNotFoundError, Profile +from iqpilot.system.hardware.tici import lpa as lpa_module +from iqpilot.system.hardware.tici.esim_manager import EsimManager + +# https://euicc-manual.osmocom.org/docs/rsp/known-test-profile +# iccid is always the same for the given activation code +TEST_ACTIVATION_CODE = 'LPA:1$rsp.truphone.com$QRF-BETTERROAMING-PMRDGIR2EARDEIT5' +TEST_ICCID = '8944476500001944011' + +TEST_NICKNAME = 'test_profile' + +def cleanup(): + lpa = HARDWARE.get_sim_lpa() + try: + lpa.delete_profile(TEST_ICCID) + except LPAProfileNotFoundError: + pass + lpa.process_notifications() + +@pytest.mark.tici +class TestEsim: + + @classmethod + def setup_class(cls): + cleanup() + + @classmethod + def teardown_class(cls): + cleanup() + + def test_provision_enable_disable(self): + lpa = HARDWARE.get_sim_lpa() + current_active = lpa.get_active_profile() + + lpa.download_profile(TEST_ACTIVATION_CODE, TEST_NICKNAME) + assert any(p.iccid == TEST_ICCID and p.nickname == TEST_NICKNAME for p in lpa.list_profiles()) + + lpa.enable_profile(TEST_ICCID) + new_active = lpa.get_active_profile() + assert new_active is not None + assert new_active.iccid == TEST_ICCID + assert new_active.nickname == TEST_NICKNAME + + lpa.disable_profile(TEST_ICCID) + new_active = lpa.get_active_profile() + assert new_active is None + + if current_active: + lpa.enable_profile(current_active.iccid) + + +class TestEsimDeleteHandling: + def test_delete_ignores_notification_cleanup_if_profile_is_gone(self, monkeypatch): + target_iccid = "89012804332267989477" + lpa = lpa_module.TiciLPA() + + monkeypatch.setattr(lpa, "_validate_profile_exists", lambda iccid: None) + monkeypatch.setattr(lpa, "get_active_profile", lambda: Profile("8901240527117095243", "US Mobile", True, "Wireless")) + monkeypatch.setattr(lpa, "_restart_modem", lambda: None) + monkeypatch.setattr( + lpa, + "list_profiles", + lambda: [Profile("8901240527117095243", "US Mobile", True, "Wireless")], + ) + + monkeypatch.setattr(lpa, "_ensure_client", lambda: object()) + monkeypatch.setattr(lpa_module, "delete_profile", lambda client, iccid: None) + + def fail_notifications(client): + raise RuntimeError('AT command failed (AT+CGLA=2,16,"80E2910003BF2800"): AT command failed') + + monkeypatch.setattr(lpa_module, "process_notifications", fail_notifications) + + lpa.delete_profile(target_iccid) + + def test_delete_raises_clear_error_if_profile_still_present_after_cleanup_failure(self, monkeypatch): + target_iccid = "89012804332267989477" + lpa = lpa_module.TiciLPA() + + monkeypatch.setattr(lpa, "_validate_profile_exists", lambda iccid: None) + monkeypatch.setattr(lpa, "get_active_profile", lambda: Profile("8901240527117095243", "US Mobile", True, "Wireless")) + monkeypatch.setattr(lpa, "_restart_modem", lambda: None) + monkeypatch.setattr( + lpa, + "list_profiles", + lambda: [ + Profile("8901240527117095243", "US Mobile", True, "Wireless"), + Profile(target_iccid, "RedPocket", False, "RedPocket"), + ], + ) + + monkeypatch.setattr(lpa, "_ensure_client", lambda: object()) + monkeypatch.setattr(lpa_module, "delete_profile", lambda client, iccid: None) + + def fail_notifications(client): + raise RuntimeError('AT command failed (AT+CGLA=2,16,"80E2910003BF2800"): AT command failed') + + monkeypatch.setattr(lpa_module, "process_notifications", fail_notifications) + + with pytest.raises(LPAError, match="Profile delete did not finish cleanly"): + lpa.delete_profile(target_iccid) + + def test_manager_maps_notification_cleanup_error(self): + error = LPAError('AT command failed (AT+CGLA=2,16,"80E2910003BF2800"): AT command failed') + assert EsimManager._map_error(error) == "Modem notification cleanup failed; refresh profiles" + + +class TestEsimNotificationCleanupRecovery: + def test_switch_ignores_notification_cleanup_if_target_is_enabled(self, monkeypatch): + target_iccid = "8901240527117194095" + lpa = lpa_module.TiciLPA() + + monkeypatch.setattr(lpa, "_validate_profile_exists", lambda iccid: None) + monkeypatch.setattr(lpa, "_ensure_switchable_profile", lambda iccid: None) + monkeypatch.setattr(lpa, "get_active_profile", lambda: Profile("8901240527117113293", "US Mobile", True, "Wireless")) + monkeypatch.setattr(lpa, "_wait_for_modem", lambda: None) + monkeypatch.setattr(lpa, "_ensure_client", lambda: type("Client", (), {"channel": "2", "_use_csim": False})()) + monkeypatch.setattr( + lpa, + "list_profiles", + lambda: [ + Profile("8901240527117113293", "US Mobile", False, "Wireless"), + Profile(target_iccid, "T-Mobile", True, "Wireless"), + ], + ) + monkeypatch.setattr(lpa_module, "enable_profile", lambda client, iccid, refresh=True: None) + monkeypatch.setattr( + lpa_module, + "process_notifications", + lambda client: (_ for _ in ()).throw(RuntimeError('AT command failed (AT+CGLA=2,16,"80E2910003BF2800"): AT command failed')), + ) + + lpa.switch_profile(target_iccid) + + @pytest.mark.parametrize(("is_eg25", "expected_refresh", "expected_waits", "expected_reboots"), [ + (True, True, 1, 0), + (False, False, 0, 1), + ]) + def test_switch_profile_uses_modem_specific_refresh_behavior(self, monkeypatch, is_eg25, expected_refresh, expected_waits, expected_reboots): + target_iccid = "8901240527117194095" + lpa = object.__new__(lpa_module.TiciLPA) + lpa._is_eg25 = is_eg25 + lpa.verbose = False + + waits = [] + reboots = [] + refresh_values = [] + + monkeypatch.setattr(lpa, "_validate_profile_exists", lambda iccid: None) + monkeypatch.setattr(lpa, "_ensure_switchable_profile", lambda iccid: None) + monkeypatch.setattr(lpa, "get_active_profile", lambda: Profile("8901240527117113293", "US Mobile", True, "Wireless")) + monkeypatch.setattr(lpa, "_wait_for_modem", lambda: waits.append(True)) + monkeypatch.setattr(lpa, "_restart_modem", lambda: reboots.append(True)) + monkeypatch.setattr(lpa, "_with_lpa_error", lambda fn: fn()) + monkeypatch.setattr(lpa, "_ensure_client", lambda: type("Client", (), {"channel": "2", "_use_csim": False})()) + monkeypatch.setattr( + lpa, + "_process_notifications_after_state_change", + lambda validator, _recovery_message, _failure_message: validator(), + ) + monkeypatch.setattr( + lpa, + "list_profiles", + lambda: [ + Profile("8901240527117113293", "US Mobile", False, "Wireless"), + Profile(target_iccid, "T-Mobile", True, "Wireless"), + ], + ) + + def fake_enable_profile(client, iccid, refresh=True): + refresh_values.append(refresh) + + monkeypatch.setattr(lpa_module, "enable_profile", fake_enable_profile) + + lpa.switch_profile(target_iccid) + + assert refresh_values == [expected_refresh] + assert len(waits) == expected_waits + assert len(reboots) == expected_reboots + + def test_download_ignores_notification_cleanup_if_profile_exists(self, monkeypatch, mocker): + target_iccid = "8901240527117194095" + lpa = lpa_module.TiciLPA() + profiles = [ + [Profile("8901240527117113293", "US Mobile", True, "Wireless")], + [ + Profile("8901240527117113293", "US Mobile", True, "Wireless"), + Profile(target_iccid, "T-Mobile", False, "Wireless"), + ], + [ + Profile("8901240527117113293", "US Mobile", True, "Wireless"), + Profile(target_iccid, "T-Mobile", False, "Wireless"), + ], + ] + + monkeypatch.setattr(lpa, "_ensure_client", lambda: object()) + monkeypatch.setattr(lpa, "_wait_for_modem", lambda: None) + profile_states = iter(profiles) + current_profiles = profiles[-1] + + def list_profiles(): + nonlocal current_profiles + current_profiles = next(profile_states, current_profiles) + return current_profiles + + monkeypatch.setattr(lpa, "list_profiles", list_profiles) + monkeypatch.setattr(lpa_module, "download_profile", lambda client, qr: target_iccid) + set_nickname = mocker.MagicMock() + monkeypatch.setattr(lpa_module, "set_profile_nickname", set_nickname) + monkeypatch.setattr( + lpa_module, + "process_notifications", + lambda client: (_ for _ in ()).throw(RuntimeError('AT command failed (AT+CGLA=2,16,"80E2910003BF2800"): AT command failed')), + ) + + lpa.download_profile(TEST_ACTIVATION_CODE, "T-Mobile") + + set_nickname.assert_called_once_with(mocker.ANY, target_iccid, "T-Mobile") + + +class TestEsimManagerSupportGating: + def test_refresh_profiles_does_not_touch_lpa_without_euicc(self, monkeypatch, mocker): + manager = EsimManager() + + monkeypatch.setattr(manager, "_query_euicc_support", lambda: False) + manager._params = mocker.MagicMock() + manager._params.get.return_value = None + manager._params.get_bool.return_value = True + monkeypatch.setattr(HARDWARE, "get_device_type", lambda: "tici") + monkeypatch.setattr(HARDWARE, "get_sim_lpa", lambda: (_ for _ in ()).throw(AssertionError("LPA should not be touched"))) + + manager.refresh_profiles() + + assert manager.get_state().profiles == [] + assert manager.get_state().message == "Insert the original comma SIM card that came with the device to use eSIM" diff --git a/iqpilot/system/hardware/tici/tests/test_hardware.py b/iqpilot/system/hardware/tici/tests/test_hardware.py new file mode 100644 index 000000000..a807a6d61 --- /dev/null +++ b/iqpilot/system/hardware/tici/tests/test_hardware.py @@ -0,0 +1,102 @@ +from iqpilot.system.hardware.tici.hardware import ( + MM_MODEM_ACCESS_TECHNOLOGY_LTE, + MM_MODEM_STATE, + NMActiveConnectionState, + Tici, +) +from iqpilot.cereal import log + + +def _make_connection(mocker, connection_type: str, state: int): + connection = mocker.MagicMock() + + def get_side_effect(_iface, prop, **_kwargs): + values = { + "Type": connection_type, + "State": state, + } + return values[prop] + + connection.Get.side_effect = get_side_effect + return connection + + +def test_reboot_modem_falls_back_to_direct_at(monkeypatch, mocker): + device = Tici() + direct_runner = mocker.MagicMock() + + monkeypatch.setattr(device, "get_modem", mocker.MagicMock(side_effect=ModuleNotFoundError("dbus"))) + monkeypatch.setattr(device, "_run_direct_modem_command", direct_runner) + + device.reboot_modem() + + assert direct_runner.call_args_list == [ + (("AT+CFUN=0",), {}), + (("AT+CFUN=1",), {}), + ] + + +def test_get_network_type_ignores_non_activated_cellular(mocker): + device = Tici() + primary = _make_connection(mocker, "gsm", NMActiveConnectionState.ACTIVATING) + bus = mocker.MagicMock() + bus.get_object.return_value = primary + nm = mocker.MagicMock() + nm.Get.return_value = "/primary" + + device.__dict__["bus"] = bus + device.__dict__["nm"] = nm + + assert device.get_network_type() == log.DeviceState.NetworkType.none + + +def test_get_network_type_requires_registered_modem(monkeypatch, mocker): + device = Tici() + primary = _make_connection(mocker, "gsm", NMActiveConnectionState.ACTIVATED) + cellular = _make_connection(mocker, "gsm", NMActiveConnectionState.ACTIVATED) + bus = mocker.MagicMock() + bus.get_object.side_effect = [primary, cellular] + nm = mocker.MagicMock() + nm.Get.side_effect = ["/primary", ["/cellular"]] + modem = mocker.MagicMock() + + def modem_get_side_effect(_iface, prop, **_kwargs): + values = { + "State": MM_MODEM_STATE.SEARCHING, + "AccessTechnologies": MM_MODEM_ACCESS_TECHNOLOGY_LTE, + } + return values[prop] + + modem.Get.side_effect = modem_get_side_effect + + device.__dict__["bus"] = bus + device.__dict__["nm"] = nm + monkeypatch.setattr(device, "get_modem", mocker.MagicMock(return_value=modem)) + + assert device.get_network_type() == log.DeviceState.NetworkType.none + + +def test_get_network_type_reports_lte_for_registered_modem(monkeypatch, mocker): + device = Tici() + primary = _make_connection(mocker, "gsm", NMActiveConnectionState.ACTIVATED) + cellular = _make_connection(mocker, "gsm", NMActiveConnectionState.ACTIVATED) + bus = mocker.MagicMock() + bus.get_object.side_effect = [primary, cellular] + nm = mocker.MagicMock() + nm.Get.side_effect = ["/primary", ["/cellular"]] + modem = mocker.MagicMock() + + def modem_get_side_effect(_iface, prop, **_kwargs): + values = { + "State": MM_MODEM_STATE.CONNECTED, + "AccessTechnologies": MM_MODEM_ACCESS_TECHNOLOGY_LTE, + } + return values[prop] + + modem.Get.side_effect = modem_get_side_effect + + device.__dict__["bus"] = bus + device.__dict__["nm"] = nm + monkeypatch.setattr(device, "get_modem", mocker.MagicMock(return_value=modem)) + + assert device.get_network_type() == log.DeviceState.NetworkType.cell4G diff --git a/iqpilot/system/hardware/tici/tests/test_lpa_activation.py b/iqpilot/system/hardware/tici/tests/test_lpa_activation.py new file mode 100644 index 000000000..084654c96 --- /dev/null +++ b/iqpilot/system/hardware/tici/tests/test_lpa_activation.py @@ -0,0 +1,53 @@ +import pytest +import numpy as np + +from iqpilot.system.hardware.tici import qr_decode as qr_decode_module +from iqpilot.system.hardware.tici.lpa import parse_lpa_activation_code +from iqpilot.system.hardware.tici.qr_decode import validate_lpa_activation_code + + +def test_parse_valid_activation_code(): + version, smdp, matching = parse_lpa_activation_code("LPA:1$rsp.truphone.com$QRF-BETTERROAMING") + assert version == "1" + assert smdp == "rsp.truphone.com" + assert matching == "QRF-BETTERROAMING" + + +@pytest.mark.parametrize("code", [ + "", + "foo", + "LPA:2$rsp.truphone.com$abc", + "LPA:1$$abc", + "LPA:1$rsp.truphone.com$", + "LPA:1$rsp.truphone.com", +]) +def test_parse_invalid_activation_code(code): + with pytest.raises(ValueError): + parse_lpa_activation_code(code) + + +def test_qr_validator_valid(): + valid, reason = validate_lpa_activation_code("LPA:1$rsp.truphone.com$QRF-123") + assert valid + assert reason == "" + + +def test_qr_validator_invalid(): + valid, reason = validate_lpa_activation_code("https://example.com") + assert not valid + assert reason + + +def test_decode_qr_prefers_pyzbar(monkeypatch): + class FakeResult: + data = b"LPA:1$rsp.truphone.com$QRF-123" + + monkeypatch.setattr(qr_decode_module, "_pyzbar_decode", lambda arr: [FakeResult()]) + + def fail_load_decoder(): + raise AssertionError("quirc fallback should not be used when pyzbar succeeds") + + monkeypatch.setattr(qr_decode_module, "_load_decoder", fail_load_decoder) + + payloads = qr_decode_module.decode_qr(np.zeros((4, 4), dtype=np.uint8)) + assert payloads == ["LPA:1$rsp.truphone.com$QRF-123"] diff --git a/iqpilot/system/hardware/tici/tests/test_power_draw.py b/iqpilot/system/hardware/tici/tests/test_power_draw.py new file mode 100644 index 000000000..f155989a9 --- /dev/null +++ b/iqpilot/system/hardware/tici/tests/test_power_draw.py @@ -0,0 +1,128 @@ +from collections import defaultdict, deque +import pytest +import time +import numpy as np +from dataclasses import dataclass +from tabulate import tabulate + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqdbc.car.car_helpers import get_demo_car_params +from iqpilot.common.mock import mock_messages +from iqpilot.common.params import Params +from iqpilot.system.hardware.tici.power_monitor import get_power +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.system.manager.manager import manager_cleanup + +SAMPLE_TIME = 8 # seconds to sample power +MAX_WARMUP_TIME = 30 # seconds to wait for SAMPLE_TIME consecutive valid samples + +@dataclass +class Proc: + procs: list[str] + power: float + msgs: list[str] + rtol: float = 0.05 + atol: float = 0.12 + + @property + def name(self): + return '+'.join(self.procs) + + +PROCS = [ + Proc(['camerad'], 1.65, atol=0.4, msgs=['roadCameraState', 'wideRoadCameraState', 'driverCameraState']), + Proc(['modeld'], 1.24, atol=0.2, msgs=['modelV2']), + Proc(['dmonitoringmodeld'], 0.65, atol=0.35, msgs=['driverStateV2']), + Proc(['encoderd'], 0.23, msgs=[]), +] + + +@pytest.mark.tici +class TestPowerDraw: + + def setup_method(self): + Params().put("CarParams", get_demo_car_params().to_bytes()) + + # wait a bit for power save to disable + time.sleep(5) + + def teardown_method(self): + manager_cleanup() + + def get_expected_messages(self, proc): + return int(sum(SAMPLE_TIME * SERVICE_LIST[msg].frequency for msg in proc.msgs)) + + def valid_msg_count(self, proc, msg_counts): + msgs_received = sum(msg_counts[msg] for msg in proc.msgs) + msgs_expected = self.get_expected_messages(proc) + return np.isclose(msgs_expected, msgs_received, rtol=.02, atol=2) + + def valid_power_draw(self, proc, used): + return np.isclose(used, proc.power, rtol=proc.rtol, atol=proc.atol) + + def tabulate_msg_counts(self, msgs_and_power): + msg_counts = defaultdict(int) + for _, counts in msgs_and_power: + for msg, count in counts.items(): + msg_counts[msg] += count + return msg_counts + + def get_power_with_warmup_for_target(self, proc, prev): + socks = {msg: messaging.sub_sock(msg) for msg in proc.msgs} + for sock in socks.values(): + messaging.drain_sock_raw(sock) + + msgs_and_power = deque([], maxlen=SAMPLE_TIME) + + start_time = time.monotonic() + + while (time.monotonic() - start_time) < MAX_WARMUP_TIME: + power = get_power(1) + iteration_msg_counts = {} + for msg,sock in socks.items(): + iteration_msg_counts[msg] = len(messaging.drain_sock_raw(sock)) + msgs_and_power.append((power, iteration_msg_counts)) + + if len(msgs_and_power) < SAMPLE_TIME: + continue + + msg_counts = self.tabulate_msg_counts(msgs_and_power) + now = np.mean([m[0] for m in msgs_and_power]) + + if self.valid_msg_count(proc, msg_counts) and self.valid_power_draw(proc, now - prev): + break + + return now, msg_counts, time.monotonic() - start_time - SAMPLE_TIME + + @mock_messages(['deviceMotion']) + def test_camera_procs(self, subtests): + baseline = get_power() + + prev = baseline + used = {} + warmup_time = {} + msg_counts = {} + + for proc in PROCS: + for p in proc.procs: + managed_processes[p].start() + now, local_msg_counts, warmup_time[proc.name] = self.get_power_with_warmup_for_target(proc, prev) + msg_counts.update(local_msg_counts) + + used[proc.name] = now - prev + prev = now + + manager_cleanup() + + tab = [['process', 'expected (W)', 'measured (W)', '# msgs expected', '# msgs received', "warmup time (s)"]] + for proc in PROCS: + cur = used[proc.name] + expected = proc.power + msgs_received = sum(msg_counts[msg] for msg in proc.msgs) + tab.append([proc.name, round(expected, 2), round(cur, 2), self.get_expected_messages(proc), msgs_received, round(warmup_time[proc.name], 2)]) + with subtests.test(proc=proc.name): + assert self.valid_msg_count(proc, msg_counts), f"expected {self.get_expected_messages(proc)} msgs, got {msgs_received} msgs" + assert self.valid_power_draw(proc, cur), f"expected {expected:.2f}W, got {cur:.2f}W" + print(tabulate(tab)) + print(f"Baseline {baseline:.2f}W\n") diff --git a/iqpilot/system/hardware/tici/updater b/iqpilot/system/hardware/tici/updater new file mode 100755 index 000000000..69ce323a1 --- /dev/null +++ b/iqpilot/system/hardware/tici/updater @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +AGNOS_PY=$1 +MANIFEST=$2 + +if [[ ! -f "$AGNOS_PY" || ! -f "$MANIFEST" ]]; then + echo "invalid args" + exit 1 +fi + +if systemctl is-active --quiet weston-ready; then + $DIR/updater_weston $AGNOS_PY $MANIFEST +else + $DIR/updater_magic $AGNOS_PY $MANIFEST +fi diff --git a/iqpilot/system/hardware/tici/updater_magic b/iqpilot/system/hardware/tici/updater_magic new file mode 100755 index 000000000..f8ae534c2 Binary files /dev/null and b/iqpilot/system/hardware/tici/updater_magic differ diff --git a/iqpilot/system/hardware/tici/updater_weston b/iqpilot/system/hardware/tici/updater_weston new file mode 100755 index 000000000..5773489ec Binary files /dev/null and b/iqpilot/system/hardware/tici/updater_weston differ diff --git a/iqpilot/system/hardware/tici/usb_storage.py b/iqpilot/system/hardware/tici/usb_storage.py new file mode 100644 index 000000000..7dcb52214 --- /dev/null +++ b/iqpilot/system/hardware/tici/usb_storage.py @@ -0,0 +1,71 @@ +import os +import subprocess + +from iqpilot.common.params import Params + +SCRIPT_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "set_usb_storage.sh") + + +def apply_usb_storage_state(state: bool): + Params().put_bool("UsbStorageEnabled", state) + try: + args = ["sudo", SCRIPT_PATH] + if state: + args.append("--rebuild") + subprocess.Popen(args) + except OSError: + pass + + +NCM_TRIED_MARKER = "/tmp/.iqemac_ncm_provisioned" +MAX_NCM_ATTEMPTS = 3 + + +def _ncm_attempts() -> int: + try: + with open(NCM_TRIED_MARKER) as f: + return int(f.read().strip() or 0) + except (OSError, ValueError): + return 0 + + +def ensure_ncm_gadget() -> bool: + # configfs is RAM backed, so the gadget must be rebuilt every boot; binding it + # enumerates on the host, which must not happen mid-drive + if os.path.isdir("/sys/class/net/usb0"): + return True + params = Params() + from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected + if not (params.get_bool("IQEmacEnabled") or egpu_selected(params)): + return False + attempts = _ncm_attempts() + if attempts >= MAX_NCM_ATTEMPTS: + return False + try: + # stamped before the run: the gadget build can wedge configfs in + # uninterruptible D state, and retrying that forever helps nobody + with open(NCM_TRIED_MARKER, "w") as f: + f.write(str(attempts + 1)) + subprocess.run(["sudo", "-n", SCRIPT_PATH], timeout=120, check=False) + except (OSError, subprocess.SubprocessError): + return False + return os.path.isdir("/sys/class/net/usb0") + + +INPUT_SUSPEND = "/sys/class/power_supply/battery/input_suspend" + + +def suspend_usb_input(suspend: bool = True) -> bool: + # a host on the data port makes the PMIC sink USB-PD while OBD-C feeds the same + # rail; the SOM browns out. This closes the charge path only, data is untouched + if not os.path.exists(INPUT_SUSPEND): + return False + try: + with open(INPUT_SUSPEND) as f: + if f.read().strip() == ("1" if suspend else "0"): + return True + except OSError: + pass + rc = subprocess.run(["sudo", "-n", "sh", "-c", f"echo {int(suspend)} > {INPUT_SUSPEND}"], + check=False, capture_output=True) + return rc.returncode == 0 diff --git a/iqpilot/system/hardware/tici/zram_setup.sh b/iqpilot/system/hardware/tici/zram_setup.sh new file mode 100755 index 000000000..670833ce7 --- /dev/null +++ b/iqpilot/system/hardware/tici/zram_setup.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# RT control procs (controlsd/card) mlockall their pages, so they are never swapped. +set -e + +[ -e /sys/class/zram-control ] || exit 0 +grep -q "zram0" /proc/swaps 2>/dev/null && exit 0 + +DISKSIZE="${ZRAM_DISKSIZE:-2G}" + +echo lzo > /sys/block/zram0/comp_algorithm 2>/dev/null || true +echo "$DISKSIZE" > /sys/block/zram0/disksize + +mkswap /dev/zram0 >/dev/null 2>&1 +swapon -p 100 /dev/zram0 + +sysctl -q vm.swappiness=100 2>/dev/null || true +sysctl -q vm.page-cluster=0 2>/dev/null || true + +echo "zram: $(free -m | awk '/Swap/{print $2}')MB compressed swap active" diff --git a/iqpilot/system/hardware/usb.py b/iqpilot/system/hardware/usb.py new file mode 100644 index 000000000..8c8a2d7e8 --- /dev/null +++ b/iqpilot/system/hardware/usb.py @@ -0,0 +1,205 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +USB bus snapshot for deviceState: every enumerated device with its negotiated +speed and its controller's link-error count. Landing this in every rlog makes +cable/hub/link regressions diagnosable from a recorded route instead of only +live. + +Link errors come from `portli` on the ssusb controller (IQ.OS 4.9.1+); on older +builds the file is absent and the counts read 0. + +The USB eGPU dock is identified by VID/PID only. comma's internal codename for +it is deliberately not used here: IQ.Pilot runs these models on several +backends (eGPU dock, eMac), so the naming stays about the role, not the vendor. +""" +import subprocess +from pathlib import Path + +# comma's USB eGPU dock, both shipped USB IDs. The ROM ids are the same board +# sitting in its bootloader (ASMedia) before vendor firmware is flashed — it +# enumerates but cannot serve a GPU in that state. +EGPU_DOCK_USB_IDS = ((0xADD1, 0x0001), (0x3801, 0x0001)) +EGPU_DOCK_ROM_USB_IDS = ((0x174C, 0x2464), (0x174C, 0x2463)) +# must equal image_product() of the bundled firmware; test_egpu_dock_flash pins them together +EGPU_DOCK_FW_PRODUCT = "custom ed4e39b7-CLEAN" + + +def is_egpu_usb_device(vendor_id: int, product_id: int, include_bootloader: bool = False) -> bool: + ids = EGPU_DOCK_USB_IDS + EGPU_DOCK_ROM_USB_IDS if include_bootloader else EGPU_DOCK_USB_IDS + return (vendor_id, product_id) in ids +USB_DEVICES_PATH = Path("/sys/bus/usb/devices") +UDC_PATH = Path("/sys/class/udc") +TYPEC_CC_ORIENTATION_PATH = Path("/sys/class/power_supply/usb/typec_cc_orientation") +USB3_LANES = {1: "a", 2: "b"} # 0 = unattached +SOC_PLATFORM_PATH = Path("/sys/devices/platform/soc") +CONTROLLER_SUFFIX = ".ssusb" +LINK_ERRORS_FILE = "portli" + + +def read(path: Path) -> str | None: + # a controller in peripheral mode fails portli's show(); that surfaces as TypeError, not OSError + try: + return path.read_text().strip() + except Exception: + return None + + +def read_int(path: Path, base: int = 10) -> int: + try: + return int(path.read_text(), base) + except Exception: + return 0 + + +def read_hex_counter(path: Path) -> int: + """sysfs counter printed as '0x0000002a' (portli), tolerating a bare hex value.""" + raw = read(path) + if raw is None: + return 0 + try: + return int(raw, 0) if raw.lower().startswith("0x") else int(raw, 16) + except ValueError: + return 0 + + +def get_usb_topology(root: Path = USB_DEVICES_PATH) -> set[str]: + """Names of everything on the bus; a cheap way to detect hotplug without + re-reading every attribute.""" + try: + return {p.name for p in root.iterdir()} + except Exception: + return set() + + +def usb_devices(root: Path = USB_DEVICES_PATH) -> list[Path]: + try: + return sorted((d for d in root.glob("*") if (d / "idVendor").exists()), key=lambda p: p.name) + except Exception: + return [] + + +def controller(device: Path) -> Path | None: + """The SuperSpeed controller a device hangs off (â€Ļ/a800000.ssusb).""" + try: + return next((p for p in device.resolve().parents if p.name.endswith(CONTROLLER_SUFFIX)), None) + except Exception: + return None + + +def usb_controllers(soc: Path = SOC_PLATFORM_PATH) -> list[Path]: + try: + return sorted(soc.glob(f"*{CONTROLLER_SUFFIX}")) + except Exception: + return [] + + +def link_controller(udc_root: Path = UDC_PATH) -> str: + """Name of the Type-C port's controller, derived from the UDC rather than + hardcoded: the gadget exposes `.dwc3`, whose address prefix is the + `.ssusb` controller behind the same connector. comma pins the 3X value + directly, which would be wrong on any other board.""" + try: + udc = next(iter(sorted(p.name for p in udc_root.iterdir())), "") + except Exception: + return "" + return f"{udc.split('.')[0]}{CONTROLLER_SUFFIX}" if udc else "" + + +def usb3_lane(orientation: int | None = None) -> str: + """Which SuperSpeed lane the Type-C connector landed on. Unattached reads 0, + which is 'unknown' rather than a lane.""" + if orientation is None: + orientation = read_int(TYPEC_CC_ORIENTATION_PATH) + return USB3_LANES.get(orientation, "unknown") + + +def link_errors(ctrl: Path | None) -> int: + return read_hex_counter(ctrl / LINK_ERRORS_FILE) if ctrl is not None else 0 + + +def get_link_error_count(soc: Path = SOC_PLATFORM_PATH) -> int: + """Cumulative SS port link errors, read off the controller rather than a + device: in peripheral mode (eMac gadget link) the peer never enumerates on + our side, so there is no device row to carry the count.""" + return sum(link_errors(c) for c in usb_controllers(soc)) + + +def host_role_controller(soc: Path = SOC_PLATFORM_PATH, udc_root: Path = UDC_PATH) -> Path | None: + ctrl = link_controller(udc_root) + return (soc / ctrl / "mode") if ctrl else None + + +def ensure_host_role(mode_path: Path | None = None) -> bool: + """A usbpd blip mid-drive can leave the Type-C controller in 'none'/'peripheral', and the + dock can never re-enumerate until something puts the port back into host mode.""" + path = mode_path if mode_path is not None else host_role_controller() + if path is None: + return False + current = read(path) + if current == "host": + return True + if current is None: + return False + rc = subprocess.run(["sudo", "-n", "sh", "-c", f"echo host > {path}"], check=False, capture_output=True) + return rc.returncode == 0 and read(path) == "host" + + +def egpu_dock_present(root: Path = USB_DEVICES_PATH) -> bool: + """A dock in ROM/bootloader state is deliberately NOT counted as present: it + enumerates but cannot serve a GPU until vendor firmware is flashed.""" + return any((read_int(d / "idVendor", 16), read_int(d / "idProduct", 16)) in EGPU_DOCK_USB_IDS + for d in usb_devices(root)) + + +def egpu_dock_ready(root: Path = USB_DEVICES_PATH) -> bool: + """Present AND running the exact firmware we ship. A dock on any other + firmware enumerates fine but has not been validated with this stack, so the + runtime refuses it; the flasher still sees it via egpu_dock_present.""" + return any((read_int(d / "idVendor", 16), read_int(d / "idProduct", 16)) in EGPU_DOCK_USB_IDS + and (read(d / "product") or "").strip() == EGPU_DOCK_FW_PRODUCT + for d in usb_devices(root)) + + +def get_usb_state(root: Path = USB_DEVICES_PATH, udc_root: Path = UDC_PATH) -> list[dict]: + devices = [] + lane, link_ctrl = usb3_lane(), link_controller(udc_root) + for device in usb_devices(root): + ctrl = controller(device) + devices.append({ + "usb3Lane": lane if ctrl is not None and ctrl.name == link_ctrl else "unknown", + "busnum": read_int(device / "busnum"), + "devnum": read_int(device / "devnum"), + "vendorId": read_int(device / "idVendor", 16), + "productId": read_int(device / "idProduct", 16), + "speedMbps": read_int(device / "speed"), + "manufacturer": read(device / "manufacturer") or "", + "product": read(device / "product") or "", + # 16-bit field upstream, so mask rather than let a wrapped counter overflow it + "linkErrorCount": link_errors(ctrl) & 0xFFFF, + }) + return devices + + +def set_usb_state(device_state, devices: list[dict], link_error_count: int = 0, + lane: str | None = None) -> None: + entries = device_state.usbState.init('devices', len(devices)) + + dock_present = False + for entry, device in zip(entries, devices, strict=True): + entry.busnum = device["busnum"] + entry.devnum = device["devnum"] + entry.vendorId = device["vendorId"] + entry.productId = device["productId"] + entry.speedMbps = device["speedMbps"] + entry.manufacturer = device["manufacturer"] + entry.product = device["product"] + entry.linkErrorCount = device.get("linkErrorCount", 0) & 0xFFFF + entry.usb3Lane = device.get("usb3Lane", "unknown") + + if (entry.vendorId, entry.productId) in EGPU_DOCK_USB_IDS: + dock_present = True + + device_state.usbState.linkErrorCount = link_error_count + device_state.usbState.usb3Lane = lane if lane is not None else usb3_lane() + device_state.egpuDockPresent = dock_present diff --git a/iqpilot/system/hephaestusd.service b/iqpilot/system/hephaestusd.service new file mode 100644 index 000000000..044709de8 --- /dev/null +++ b/iqpilot/system/hephaestusd.service @@ -0,0 +1,38 @@ +[Unit] +Description=Hephaestusd - Lightning Fast Konn3kt Client +Documentation=https://gitlvb.teallvbs.xyz/teal/iqpilot +After=network.target +Wants=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=comma +AmbientCapabilities=CAP_SYS_NICE +Environment="IQPILOT_SOURCE_ROOT=/data/openpilot/iqpilot" +Environment="PYTHONPATH=/usr/libexec/iqpilot/python:/data/openpilot/.venv/lib/python3.12/site-packages:/data/openpilot" +Environment="PYTHONSAFEPATH=1" +Environment="PATH=/usr/local/venv/bin:/usr/sbin:/usr/bin:/sbin:/bin" +WorkingDirectory=/data/openpilot + +ExecStartPre=/bin/bash -c 'for i in $(seq 1 120); do if [ -x /usr/libexec/iqpilot/iqpilot_bundle_runner ]; then exit 0; fi; echo "Waiting for iqpilot_bundle_runner..."; sleep 5; done; exit 1' +ExecStartPre=/bin/bash -c 'for i in $(seq 1 120); do if [ -e /data/openpilot/iqpilot/system ] && [ -e /data/openpilot/iqpilot/common ]; then exit 0; fi; echo "Waiting for repo root..."; sleep 5; done; exit 1' +ExecStartPre=/bin/bash -c 'if [ -f /data/openpilot/artifacts/runtime/ensure_private_installed.sh ]; then bash /data/openpilot/artifacts/runtime/ensure_private_installed.sh || true; fi' +ExecStart=/usr/libexec/iqpilot/iqpilot_bundle_runner --bundle iqpilot_hephaestusd_private --mode python-module --entry iqpilot_private.konn3kt.hephaestus.manage_hephaestusd --daemon-name manage_hephaestusd + +# Give it 10 minutes to wait for build to complete on first boot +TimeoutStartSec=600 + +Restart=always +RestartSec=10 + +StandardOutput=journal +StandardError=journal + +PrivateTmp=yes +NoNewPrivileges=false +ProtectSystem=full +ProtectHome=no + +[Install] +WantedBy=multi-user.target diff --git a/iqpilot/system/install_ble_transportd_service.sh b/iqpilot/system/install_ble_transportd_service.sh new file mode 100644 index 000000000..380166c2f --- /dev/null +++ b/iqpilot/system/install_ble_transportd_service.sh @@ -0,0 +1,48 @@ +#!/usr/bin/bash +set -e + +SERVICE_FILE="/data/openpilot/iqpilot/system/ble-transportd.service" +SERVICE_NAME="ble-transportd.service" +SERVICE_OVERRIDE="/etc/systemd/system/${SERVICE_NAME}" +SERVICE_BAKED="/lib/systemd/system/${SERVICE_NAME}" +SERVICE_DROPIN="/run/systemd/system/${SERVICE_NAME}.d" + +echo "Installing BLE transportd systemd service..." + +if [ -f "$SERVICE_BAKED" ] && grep -q "/usr/libexec/iqpilot/iqpilot_bundle_runner" "$SERVICE_BAKED"; then + echo "Using IQ.OS baked ${SERVICE_NAME}; removing stale override if present..." + sudo mount -o remount,rw / + sudo rm -f "$SERVICE_OVERRIDE" + sudo systemctl daemon-reload + sudo mount -o remount,ro / +else + if [ ! -f "$SERVICE_FILE" ]; then + echo "ERROR: Service file not found at $SERVICE_FILE" + exit 1 + fi + + echo "IQ.OS baked unit unavailable; installing fallback override into /etc/systemd/system..." + sudo cp "$SERVICE_FILE" "$SERVICE_OVERRIDE" + sudo systemctl daemon-reload +fi + +sudo mkdir -p "$SERVICE_DROPIN" +printf '%s\n' '[Service]' 'Environment="PYTHONPATH=/usr/libexec/iqpilot/python:/data/openpilot/.venv/lib/python3.12/site-packages:/data/openpilot"' | sudo tee "$SERVICE_DROPIN/iqpilot-packages.conf" >/dev/null +sudo systemctl daemon-reload + +echo "Enabling $SERVICE_NAME to start at boot..." +sudo systemctl enable "$SERVICE_NAME" + +echo "Starting $SERVICE_NAME..." +sudo systemctl restart "$SERVICE_NAME" + +echo "" +echo "Service status:" +sudo systemctl status "$SERVICE_NAME" --no-pager + +echo "" +echo "Useful commands:" +echo " sudo systemctl status ble-transportd - Check service status" +echo " sudo systemctl restart ble-transportd - Restart service" +echo " sudo systemctl stop ble-transportd - Stop service" +echo " sudo journalctl -u ble-transportd -f - View live logs" diff --git a/iqpilot/system/install_flockd_service.sh b/iqpilot/system/install_flockd_service.sh new file mode 100644 index 000000000..51d2edf23 --- /dev/null +++ b/iqpilot/system/install_flockd_service.sh @@ -0,0 +1,47 @@ +#!/usr/bin/bash +set -e + +SERVICE_FILE="/data/openpilot/iqpilot/system/flockd.service" +SERVICE_NAME="flockd.service" +SERVICE_OVERRIDE="/etc/systemd/system/${SERVICE_NAME}" +SERVICE_BAKED="/lib/systemd/system/${SERVICE_NAME}" +SERVICE_DROPIN="/run/systemd/system/${SERVICE_NAME}.d" + +echo "Installing Flock RF detector systemd service..." + +if [ -f "$SERVICE_BAKED" ] && grep -q "/usr/libexec/iqpilot/iqpilot_bundle_runner" "$SERVICE_BAKED"; then + echo "Using IQ.OS baked ${SERVICE_NAME}; removing stale override if present..." + sudo mount -o remount,rw / + sudo rm -f "$SERVICE_OVERRIDE" + sudo systemctl daemon-reload + sudo mount -o remount,ro / +else + if [ ! -f "$SERVICE_FILE" ]; then + echo "ERROR: Service file not found at $SERVICE_FILE" + exit 1 + fi + + echo "IQ.OS baked unit unavailable; installing fallback override into /etc/systemd/system..." + sudo cp "$SERVICE_FILE" "$SERVICE_OVERRIDE" + sudo systemctl daemon-reload +fi + +sudo mkdir -p "$SERVICE_DROPIN" +printf '%s\n' '[Service]' 'Environment="PYTHONPATH=/usr/libexec/iqpilot/python:/data/openpilot/.venv/lib/python3.12/site-packages:/data/openpilot"' | sudo tee "$SERVICE_DROPIN/iqpilot-packages.conf" >/dev/null +sudo systemctl daemon-reload + +echo "Enabling $SERVICE_NAME to start at boot..." +sudo systemctl enable "$SERVICE_NAME" + +echo "Starting $SERVICE_NAME..." +sudo systemctl restart "$SERVICE_NAME" + +echo "" +echo "Service status:" +sudo systemctl status "$SERVICE_NAME" --no-pager + +echo "" +echo "Useful commands:" +echo " sudo systemctl status flockd - Check service status" +echo " sudo systemctl restart flockd - Restart service" +echo " sudo journalctl -u flockd -f - View live logs" diff --git a/iqpilot/system/install_hephaestusd_service.sh b/iqpilot/system/install_hephaestusd_service.sh new file mode 100755 index 000000000..5137a79f7 --- /dev/null +++ b/iqpilot/system/install_hephaestusd_service.sh @@ -0,0 +1,48 @@ +#!/usr/bin/bash +set -e + +SERVICE_FILE="/data/openpilot/iqpilot/system/hephaestusd.service" +SERVICE_NAME="hephaestusd.service" +SERVICE_OVERRIDE="/etc/systemd/system/${SERVICE_NAME}" +SERVICE_BAKED="/lib/systemd/system/${SERVICE_NAME}" +SERVICE_DROPIN="/run/systemd/system/${SERVICE_NAME}.d" + +echo "Installing Hephaestusd systemd service..." + +if [ -f "$SERVICE_BAKED" ] && grep -q "/usr/libexec/iqpilot/iqpilot_bundle_runner" "$SERVICE_BAKED"; then + echo "Using IQ.OS baked ${SERVICE_NAME}; removing stale override if present..." + sudo mount -o remount,rw / + sudo rm -f "$SERVICE_OVERRIDE" + sudo systemctl daemon-reload + sudo mount -o remount,ro / +else + if [ ! -f "$SERVICE_FILE" ]; then + echo "ERROR: Service file not found at $SERVICE_FILE" + exit 1 + fi + + echo "IQ.OS baked unit unavailable; installing fallback override into /etc/systemd/system..." + sudo cp "$SERVICE_FILE" "$SERVICE_OVERRIDE" + sudo systemctl daemon-reload +fi + +sudo mkdir -p "$SERVICE_DROPIN" +printf '%s\n' '[Service]' 'Environment="PYTHONPATH=/usr/libexec/iqpilot/python:/data/openpilot/.venv/lib/python3.12/site-packages:/data/openpilot"' | sudo tee "$SERVICE_DROPIN/iqpilot-packages.conf" >/dev/null +sudo systemctl daemon-reload + +echo "Enabling $SERVICE_NAME to start at boot..." +sudo systemctl enable "$SERVICE_NAME" + +echo "Starting $SERVICE_NAME..." +sudo systemctl restart "$SERVICE_NAME" + +echo "" +echo "Service status:" +sudo systemctl status "$SERVICE_NAME" --no-pager + +echo "" +echo "Useful commands:" +echo " sudo systemctl status hephaestusd - Check service status" +echo " sudo systemctl restart hephaestusd - Restart service" +echo " sudo systemctl stop hephaestusd - Stop service" +echo " sudo journalctl -u hephaestusd -f - View live logs" diff --git a/iqpilot/system/journald.py b/iqpilot/system/journald.py new file mode 100755 index 000000000..c3f85af35 --- /dev/null +++ b/iqpilot/system/journald.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +import json +import subprocess + +import iqpilot.cereal.messaging as messaging +from iqpilot.common.swaglog import cloudlog + + +def main(): + pm = messaging.PubMaster(['androidLog']) + cmd = ['journalctl', '-f', '-o', 'json'] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, text=True) + assert proc.stdout is not None + try: + for line in proc.stdout: + line = line.strip() + if not line: + continue + try: + kv = json.loads(line) + except json.JSONDecodeError: + cloudlog.exception("failed to parse journalctl output") + continue + + msg = messaging.new_message('androidLog') + entry = msg.androidLog + entry.ts = int(kv.get('__REALTIME_TIMESTAMP', 0)) + entry.message = json.dumps(kv) + if '_PID' in kv: + entry.pid = int(kv['_PID']) + if 'PRIORITY' in kv: + entry.priority = int(kv['PRIORITY']) + if 'SYSLOG_IDENTIFIER' in kv: + entry.tag = kv['SYSLOG_IDENTIFIER'] + + pm.send('androidLog', msg) + finally: + proc.terminate() + proc.wait() + + +if __name__ == '__main__': + main() diff --git a/iqpilot/system/loggerd/.gitignore b/iqpilot/system/loggerd/.gitignore new file mode 100644 index 000000000..53dc24e6f --- /dev/null +++ b/iqpilot/system/loggerd/.gitignore @@ -0,0 +1,4 @@ +loggerd +encoderd +bootlog +tests/test_logger diff --git a/iqpilot/system/loggerd/__init__.py b/iqpilot/system/loggerd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/loggerd/bootlog b/iqpilot/system/loggerd/bootlog new file mode 100755 index 000000000..7d6233a22 Binary files /dev/null and b/iqpilot/system/loggerd/bootlog differ diff --git a/iqpilot/system/loggerd/config.py b/iqpilot/system/loggerd/config.py new file mode 100644 index 000000000..042e72a17 --- /dev/null +++ b/iqpilot/system/loggerd/config.py @@ -0,0 +1,31 @@ +import os +from iqpilot.system.hardware.hw import Paths + + +CAMERA_FPS = 20 +SEGMENT_LENGTH = 60 + + +PATH_DICT = { + "internal": Paths.log_root(), + "external": Paths.log_root_external() +} + +def get_available_percent(default: float, path_type="internal") -> float: + try: + statvfs = os.statvfs(PATH_DICT[path_type]) + available_percent = 100.0 * statvfs.f_bavail / statvfs.f_blocks + except (OSError, KeyError): + available_percent = default + + return available_percent + + +def get_available_bytes(default: int, path_type="internal") -> int: + try: + statvfs = os.statvfs(PATH_DICT[path_type]) + available_bytes = statvfs.f_bavail * statvfs.f_frsize + except (OSError, KeyError): + available_bytes = default + + return available_bytes diff --git a/iqpilot/system/loggerd/crash_recovery.py b/iqpilot/system/loggerd/crash_recovery.py new file mode 100644 index 000000000..8ecb8c8ed --- /dev/null +++ b/iqpilot/system/loggerd/crash_recovery.py @@ -0,0 +1,45 @@ +import os + +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware.hw import Paths + +PRESERVE_ATTR_NAME = b"user.preserve" +PRESERVE_ATTR_VALUE = b"1" + + +def recover_unclean_segments(log_root: str | None = None) -> list[str]: + # Segments with leftover .lock files are from a loggerd that never closed + # cleanly (power cut, crash). The video/log data in them is valid up to the + # last durable sync. Clear the stale locks so the deleter can manage them + # again, and preserve them: footage from an unclean shutdown is exactly the + # footage a dashcam must not throw away. + root = log_root if log_root is not None else Paths.log_root() + recovered = [] + try: + dirs = os.listdir(root) + except OSError: + return recovered + + for d in dirs: + seg_path = os.path.join(root, d) + if not os.path.isdir(seg_path): + continue + try: + locks = [f for f in os.listdir(seg_path) if f.endswith(".lock")] + if not locks: + continue + for lock in locks: + os.unlink(os.path.join(seg_path, lock)) + setxattr = getattr(os, "setxattr", None) # not available on darwin + if setxattr is not None: + try: + setxattr(seg_path, PRESERVE_ATTR_NAME, PRESERVE_ATTR_VALUE) + except OSError: + pass + recovered.append(d) + except OSError: + cloudlog.exception(f"crash_recovery: failed to recover {seg_path}") + + if recovered: + cloudlog.event("crash_recovery.recovered_unclean_segments", segments=sorted(recovered), error=True) + return recovered diff --git a/iqpilot/system/loggerd/deleter.py b/iqpilot/system/loggerd/deleter.py new file mode 100755 index 000000000..4a0f27141 --- /dev/null +++ b/iqpilot/system/loggerd/deleter.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +import os +import time +import shutil +import threading +from pathlib import Path +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.loggerd.config import get_available_bytes, get_available_percent +from iqpilot.system.loggerd.uploader_common import listdir_by_creation +from iqpilot.system.loggerd.xattr_cache import getxattr + +MIN_BYTES = 5 * 1024 * 1024 * 1024 +MIN_PERCENT = 10 + +DELETE_LAST = ['boot', 'crash'] + +PRESERVE_ATTR_NAME = 'user.preserve' +PRESERVE_ATTR_VALUE = b'1' +PRESERVE_COUNT = 5 + + +def has_preserve_xattr(d: str) -> bool: + return getxattr(os.path.join(Paths.log_root(), d), PRESERVE_ATTR_NAME) == PRESERVE_ATTR_VALUE + + +def get_preserved_segments(dirs_by_creation: list[str]) -> set[str]: + # skip deleting most recent N preserved segments (and their prior segment) + preserved = set() + for n, d in enumerate(filter(has_preserve_xattr, reversed(dirs_by_creation))): + if n == PRESERVE_COUNT: + break + date_str, _, seg_str = d.rpartition("--") + + # ignore non-segment directories + if not date_str: + continue + try: + seg_num = int(seg_str) + except ValueError: + continue + + # preserve segment and two prior + for _seg_num in range(max(0, seg_num - 2), seg_num + 1): + preserved.add(f"{date_str}--{_seg_num}") + + return preserved + + +def deleter_thread(exit_event: threading.Event): + while not exit_event.is_set(): + out_of_bytes = get_available_bytes(default=MIN_BYTES + 1) < MIN_BYTES + out_of_percent = get_available_percent(default=MIN_PERCENT + 1) < MIN_PERCENT + + if out_of_percent or out_of_bytes: + dirs = listdir_by_creation(Paths.log_root()) + preserved_dirs = get_preserved_segments(dirs) + + # remove the earliest directory we can + for delete_dir in sorted(dirs, key=lambda d: (d in DELETE_LAST, d in preserved_dirs)): + delete_path = os.path.join(Paths.log_root(), delete_dir) + + if any(name.endswith(".lock") for name in os.listdir(delete_path)): + continue + + if Path(Paths.log_root_external()).is_mount(): + out_of_bytes_external = get_available_bytes(default=MIN_BYTES + 1, path_type="external") < MIN_BYTES + out_of_percent_external = get_available_percent(default=MIN_PERCENT + 1, path_type="external") < MIN_PERCENT + + if out_of_percent_external or out_of_bytes_external: + dirs_external = listdir_by_creation(Paths.log_root_external()) + + # remove the earliest external directory we can + for delete_dir_external in sorted(dirs_external): + delete_path_external = os.path.join(Paths.log_root_external(), delete_dir_external) + try: + cloudlog.warning(f"deleting {delete_path_external}") + shutil.rmtree(delete_path_external) + break + except OSError: + cloudlog.exception(f"issue deleting {delete_path_external}") + + # move directory from internal to external + path_external = os.path.join(Paths.log_root_external(), delete_dir) + try: + cloudlog.warning(f"moving {delete_path} to {path_external}") + start = time.monotonic() + shutil.move(delete_path, path_external) + cloudlog.warning(f"moved {delete_path} to {path_external} in {time.monotonic() - start:.2f}s") + break + except Exception: + cloudlog.error(f"issue moving {delete_path} to {path_external}") + try: + cloudlog.warning(f"deleting {delete_path}") + shutil.rmtree(delete_path) + break + except OSError: + cloudlog.exception(f"issue deleting {delete_path}") + continue + + try: + cloudlog.info(f"deleting {delete_path}") + shutil.rmtree(delete_path) + break + except OSError: + cloudlog.exception(f"issue deleting {delete_path}") + exit_event.wait(.1) + else: + exit_event.wait(30) + + +def main(): + deleter_thread(threading.Event()) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/loggerd/encoder/v4l_decode b/iqpilot/system/loggerd/encoder/v4l_decode new file mode 100755 index 000000000..482f6a892 Binary files /dev/null and b/iqpilot/system/loggerd/encoder/v4l_decode differ diff --git a/iqpilot/system/loggerd/encoderd b/iqpilot/system/loggerd/encoderd new file mode 100755 index 000000000..376d8c375 Binary files /dev/null and b/iqpilot/system/loggerd/encoderd differ diff --git a/iqpilot/system/loggerd/loggerd b/iqpilot/system/loggerd/loggerd new file mode 100755 index 000000000..98ea5df57 Binary files /dev/null and b/iqpilot/system/loggerd/loggerd differ diff --git a/iqpilot/system/loggerd/tests/__init__.py b/iqpilot/system/loggerd/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/loggerd/tests/deleter_tests_common.py b/iqpilot/system/loggerd/tests/deleter_tests_common.py new file mode 100644 index 000000000..9c200fc7d --- /dev/null +++ b/iqpilot/system/loggerd/tests/deleter_tests_common.py @@ -0,0 +1,57 @@ +import os +import random +import shutil +from pathlib import Path + +import iqpilot.system.loggerd.deleter as deleter +from iqpilot.common.params import Params +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.loggerd.xattr_cache import setxattr + + +def create_random_file(file_path: Path, size_mb: float, lock: bool = False) -> None: + file_path.parent.mkdir(parents=True, exist_ok=True) + + if lock: + lock_path = str(file_path) + ".lock" + os.close(os.open(lock_path, os.O_CREAT | os.O_EXCL)) + + chunks = 128 + chunk_bytes = int(size_mb * 1024 * 1024 / chunks) + data = os.urandom(chunk_bytes) + + with open(file_path, "wb") as f: + for _ in range(chunks): + f.write(data) + + +class DeleterTestCase: + f_type = "UNKNOWN" + + root: Path + seg_num: int + seg_format: str + seg_format2: str + seg_dir: str + + def setup_method(self): + shutil.rmtree(Paths.log_root(), ignore_errors=True) + Path(Paths.log_root()).mkdir(parents=True, exist_ok=True) + self.seg_num = random.randint(1, 300) + self.seg_format = "00000004--0ac3964c96--{}" + self.seg_format2 = "00000005--4c4e99b08b--{}" + self.seg_dir = self.seg_format.format(self.seg_num) + + self.params = Params() + self.params.put("IsOffroad", True) + self.params.put("DongleId", "0000000000000000") + + def make_file_with_data(self, f_dir: str, fn: str, size_mb: float = .1, lock: bool = False, + preserve_xattr: bytes | None = None) -> Path: + file_path = Path(Paths.log_root()) / f_dir / fn + create_random_file(file_path, size_mb, lock) + + if preserve_xattr is not None: + setxattr(str(file_path.parent), deleter.PRESERVE_ATTR_NAME, preserve_xattr) + + return file_path diff --git a/iqpilot/system/loggerd/tests/test_deleter.py b/iqpilot/system/loggerd/tests/test_deleter.py new file mode 100644 index 000000000..6cec4696b --- /dev/null +++ b/iqpilot/system/loggerd/tests/test_deleter.py @@ -0,0 +1,117 @@ +import time +import threading +from collections import namedtuple +from pathlib import Path +from collections.abc import Sequence + +import iqpilot.system.loggerd.deleter as deleter +from iqpilot.common.timeout import Timeout, TimeoutException +from iqpilot.system.loggerd.tests.deleter_tests_common import DeleterTestCase + +Stats = namedtuple("Stats", ['f_bavail', 'f_blocks', 'f_frsize']) + + +class TestDeleter(DeleterTestCase): + def fake_statvfs(self, d): + return self.fake_stats + + def setup_method(self): + self.f_type = "fcamera.hevc" + super().setup_method() + self.fake_stats = Stats(f_bavail=0, f_blocks=10, f_frsize=4096) + deleter.os.statvfs = self.fake_statvfs + + def start_thread(self): + self.end_event = threading.Event() + self.del_thread = threading.Thread(target=deleter.deleter_thread, args=[self.end_event]) + self.del_thread.daemon = True + self.del_thread.start() + + def join_thread(self): + self.end_event.set() + self.del_thread.join() + + def test_delete(self): + f_path = self.make_file_with_data(self.seg_dir, self.f_type, 1) + + self.start_thread() + + try: + with Timeout(2, "Timeout waiting for file to be deleted"): + while f_path.exists(): + time.sleep(0.01) + finally: + self.join_thread() + + def assertDeleteOrder(self, f_paths: Sequence[Path], timeout: int = 5) -> None: + deleted_order = [] + + self.start_thread() + try: + with Timeout(timeout, "Timeout waiting for files to be deleted"): + while True: + for f in f_paths: + if not f.exists() and f not in deleted_order: + deleted_order.append(f) + if len(deleted_order) == len(f_paths): + break + time.sleep(0.01) + except TimeoutException: + print("Not deleted:", [f for f in f_paths if f not in deleted_order]) + raise + finally: + self.join_thread() + + assert deleted_order == f_paths, "Files not deleted in expected order" + + def test_delete_order(self): + self.assertDeleteOrder([ + self.make_file_with_data(self.seg_format.format(0), self.f_type), + self.make_file_with_data(self.seg_format.format(1), self.f_type), + self.make_file_with_data(self.seg_format2.format(0), self.f_type), + ]) + + def test_delete_many_preserved(self): + self.assertDeleteOrder([ + self.make_file_with_data(self.seg_format.format(0), self.f_type), + self.make_file_with_data(self.seg_format.format(1), self.f_type, preserve_xattr=deleter.PRESERVE_ATTR_VALUE), + self.make_file_with_data(self.seg_format.format(2), self.f_type), + ] + [ + self.make_file_with_data(self.seg_format2.format(i), self.f_type, preserve_xattr=deleter.PRESERVE_ATTR_VALUE) + for i in range(5) + ]) + + def test_delete_last(self): + self.assertDeleteOrder([ + self.make_file_with_data(self.seg_format.format(1), self.f_type), + self.make_file_with_data(self.seg_format2.format(0), self.f_type), + self.make_file_with_data(self.seg_format.format(0), self.f_type, preserve_xattr=deleter.PRESERVE_ATTR_VALUE), + self.make_file_with_data("boot", self.seg_format[:-4]), + self.make_file_with_data("crash", self.seg_format2[:-4]), + ]) + + def test_no_delete_when_available_space(self): + f_path = self.make_file_with_data(self.seg_dir, self.f_type) + + block_size = 4096 + available = (10 * 1024 * 1024 * 1024) / block_size # 10GB free + self.fake_stats = Stats(f_bavail=available, f_blocks=10, f_frsize=block_size) + + self.start_thread() + start_time = time.monotonic() + while f_path.exists() and time.monotonic() - start_time < 2: + time.sleep(0.01) + self.join_thread() + + assert f_path.exists(), "File deleted with available space" + + def test_no_delete_with_lock_file(self): + f_path = self.make_file_with_data(self.seg_dir, self.f_type, lock=True) + + self.start_thread() + start_time = time.monotonic() + while f_path.exists() and time.monotonic() - start_time < 2: + time.sleep(0.01) + self.join_thread() + + assert f_path.exists(), "File deleted when locked" diff --git a/iqpilot/system/loggerd/tests/test_encoder.py b/iqpilot/system/loggerd/tests/test_encoder.py new file mode 100644 index 000000000..642274f96 --- /dev/null +++ b/iqpilot/system/loggerd/tests/test_encoder.py @@ -0,0 +1,152 @@ +import math +import os +import pytest +import random +import shutil +import subprocess +import time +from pathlib import Path + +from parameterized import parameterized +from tqdm import trange + +from iqpilot.common.params import Params +from iqpilot.common.timeout import Timeout +from iqpilot.system.hardware import TICI +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.system.hardware.hw import Paths + +SEGMENT_LENGTH = 2 +FULL_SIZE = 2507572 +def hevc_size(w): return FULL_SIZE // 2 if w <= 1344 else FULL_SIZE +CAMERAS = [ + ("fcamera.hevc", 20, hevc_size, "roadEncodeIdx"), + ("dcamera.hevc", 20, hevc_size, "driverEncodeIdx"), + ("ecamera.hevc", 20, hevc_size, "wideRoadEncodeIdx"), + ("qcamera.ts", 20, lambda x: 130000, None), +] + +# we check frame count, so we don't have to be too strict on size +FILE_SIZE_TOLERANCE = 0.7 + + +@pytest.mark.tici # TODO: all of loggerd should work on PC +class TestEncoder: + + def setup_method(self): + self._clear_logs() + os.environ["LOGGERD_TEST"] = "1" + os.environ["LOGGERD_SEGMENT_LENGTH"] = str(SEGMENT_LENGTH) + + def teardown_method(self): + self._clear_logs() + + def _clear_logs(self): + if os.path.exists(Paths.log_root()): + shutil.rmtree(Paths.log_root()) + + def _get_latest_segment_path(self): + last_route = sorted(Path(Paths.log_root()).iterdir())[-1] + return os.path.join(Paths.log_root(), last_route) + + # TODO: this should run faster than real time + @parameterized.expand([(True, ), (False, )]) + def test_log_rotation(self, record_front): + Params().put_bool("RecordFront", record_front) + + managed_processes['sensord'].start() + managed_processes['loggerd'].start() + managed_processes['encoderd'].start() + + time.sleep(1.0) + managed_processes['camerad'].start() + + num_segments = int(os.getenv("SEGMENTS", random.randint(2, 8))) + + # wait for loggerd to make the dir for first segment + route_prefix_path = None + with Timeout(int(SEGMENT_LENGTH*3)): + while route_prefix_path is None: + try: + route_prefix_path = self._get_latest_segment_path().rsplit("--", 1)[0] + except Exception: + time.sleep(0.1) + + def check_seg(i): + # check each camera file size + counts = [] + first_frames = [] + for camera, fps, size_lambda, encode_idx_name in CAMERAS: + if not record_front and "dcamera" in camera: + continue + + file_path = f"{route_prefix_path}--{i}/{camera}" + + # check file exists + assert os.path.exists(file_path), f"segment #{i}: '{file_path}' missing" + + # TODO: this ffprobe call is really slow + # get width and check frame count + cmd = f"ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets,width -of csv=p=0 {file_path}" + if TICI: + cmd = "LD_LIBRARY_PATH=/usr/local/lib " + cmd + + expected_frames = fps * SEGMENT_LENGTH + probe = subprocess.check_output(cmd, shell=True, encoding='utf8').split('\n')[0].strip().split(',') + frame_width, frame_count = int(probe[0]), int(probe[1]) + counts.append(frame_count) + + assert frame_count == expected_frames, \ + f"segment #{i}: {camera} failed frame count check: expected {expected_frames}, got {frame_count}" + + # sanity check file size + file_size = os.path.getsize(file_path) + target_size = size_lambda(frame_width) + assert math.isclose(file_size, target_size, rel_tol=FILE_SIZE_TOLERANCE), \ + f"{file_path} size {file_size} isn't close to target size {target_size}" + + # Check encodeIdx + if encode_idx_name is not None: + rlog_path = f"{route_prefix_path}--{i}/rlog.zst" + msgs = [m for m in LogReader(rlog_path) if m.which() == encode_idx_name] + encode_msgs = [getattr(m, encode_idx_name) for m in msgs] + + valid = [m.valid for m in msgs] + segment_idxs = [m.segmentId for m in encode_msgs] + encode_idxs = [m.encodeId for m in encode_msgs] + frame_idxs = [m.frameId for m in encode_msgs] + + # Check frame count + assert frame_count == len(segment_idxs) + assert frame_count == len(encode_idxs) + + # Check for duplicates or skips + assert 0 == segment_idxs[0] + assert len(set(segment_idxs)) == len(segment_idxs) + + assert all(valid) + + assert expected_frames * i == encode_idxs[0] + first_frames.append(frame_idxs[0]) + assert len(set(encode_idxs)) == len(encode_idxs) + + assert 1 == len(set(first_frames)) + + if TICI: + expected_frames = fps * SEGMENT_LENGTH + assert min(counts) == expected_frames + shutil.rmtree(f"{route_prefix_path}--{i}") + + try: + for i in trange(num_segments): + # poll for next segment + with Timeout(int(SEGMENT_LENGTH*10), error_msg=f"timed out waiting for segment {i}"): + while Path(f"{route_prefix_path}--{i+1}") not in Path(Paths.log_root()).iterdir(): + time.sleep(0.1) + check_seg(i) + finally: + managed_processes['loggerd'].stop() + managed_processes['encoderd'].stop() + managed_processes['camerad'].stop() + managed_processes['sensord'].stop() diff --git a/iqpilot/system/loggerd/tests/test_loggerd.py b/iqpilot/system/loggerd/tests/test_loggerd.py new file mode 100644 index 000000000..7da996b0b --- /dev/null +++ b/iqpilot/system/loggerd/tests/test_loggerd.py @@ -0,0 +1,377 @@ +import numpy as np +import os +import re +import random +import string +import subprocess +import time +from collections import defaultdict +from pathlib import Path +import pytest + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import log +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.common.timeout import Timeout +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.hardware import TICI +from iqpilot.system.loggerd.xattr_cache import getxattr +from iqpilot.system.loggerd.deleter import PRESERVE_ATTR_NAME, PRESERVE_ATTR_VALUE +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.system.version import get_version +from iqpilot.tools.lib.route import RE +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionIpcServer + +SentinelType = log.Sentinel.SentinelType + +CEREAL_SERVICES = [f for f in log.Event.schema.union_fields if f in SERVICE_LIST + and SERVICE_LIST[f].should_log and "encode" not in f.lower()] + + +class TestLoggerd: + def _get_latest_log_dir(self): + log_dirs = sorted(Path(Paths.log_root()).iterdir(), key=lambda f: f.stat().st_mtime) + return log_dirs[-1] + + def _get_log_dir(self, x): + for l in x.splitlines(): + for p in l.split(' '): + path = Path(p.strip()) + if path.is_dir(): + return path + return None + + def _get_log_fn(self, x): + for l in x.splitlines(): + for p in l.split(' '): + path = Path(p.strip()) + if path.is_file(): + return path + return None + + def _gen_bootlog(self): + with Timeout(5): + out = subprocess.check_output("./bootlog", cwd=os.path.join(BASEDIR, "iqpilot/system/loggerd"), encoding='utf-8') + + log_fn = self._get_log_fn(out) + + # check existence + assert log_fn is not None + + return log_fn + + def _check_init_data(self, msgs): + msg = msgs[0] + assert msg.which() == 'initData' + + def _check_sentinel(self, msgs, route): + start_type = SentinelType.startOfRoute if route else SentinelType.startOfSegment + assert msgs[1].sentinel.type == start_type + + end_type = SentinelType.endOfRoute if route else SentinelType.endOfSegment + assert msgs[-1].sentinel.type == end_type + + def _publish_random_messages(self, services: list[str]) -> dict[str, list]: + pm = messaging.PubMaster(services) + + managed_processes["loggerd"].start() + for s in services: + assert pm.wait_for_readers_to_update(s, timeout=5) + + sent_msgs = defaultdict(list) + for i in range(random.randint(2, 10) * 100): + for s in services: + try: + m = messaging.new_message(s) + except Exception: + m = messaging.new_message(s, random.randint(2, 10)) + pm.send(s, m) + sent_msgs[s].append(m) + + if (i + 1) % 100 == 0: + for s in services: + assert pm.wait_for_readers_to_update(s, timeout=5) + + for s in services: + assert pm.wait_for_readers_to_update(s, timeout=5) + assert managed_processes["loggerd"].stop(timeout=30) == 0 + + return sent_msgs + + def _publish_camera_and_audio_messages(self, num_segs=1, segment_length=5): + # Use small frame sizes for testing (width, height, size, stride, uv_offset) + # NV12 format: size = stride * height * 1.5, uv_offset = stride * height + w, h = 320, 240 + frame_spec = (w, h, w * h * 3 // 2, w, w * h) + streams = [ + (VisionStreamType.VISION_STREAM_ROAD, frame_spec, "roadCameraState"), + (VisionStreamType.VISION_STREAM_DRIVER, frame_spec, "driverCameraState"), + (VisionStreamType.VISION_STREAM_WIDE_ROAD, frame_spec, "wideRoadCameraState"), + ] + + sm = messaging.SubMaster(["roadEncodeData"]) + pm = messaging.PubMaster([s for _, _, s in streams] + ["rawAudioData"]) + vipc_server = VisionIpcServer("camerad") + for stream_type, frame_spec, _ in streams: + vipc_server.create_buffers_with_sizes(stream_type, 40, *(frame_spec)) + vipc_server.start_listener() + + encoderd_ret = None + loggerd_ret = None + try: + os.environ["LOGGERD_TEST"] = "1" + os.environ["LOGGERD_SEGMENT_LENGTH"] = str(segment_length) + managed_processes["loggerd"].start() + managed_processes["encoderd"].start() + for _, _, state in streams: + assert pm.wait_for_readers_to_update(state, timeout=5) + + fps = 20 + for n in range(1, int(num_segs * segment_length * fps) + 1): + # send video + for stream_type, frame_spec, state in streams: + dat = np.empty(frame_spec[2], dtype=np.uint8) + vipc_server.send(stream_type, dat[:].flatten().tobytes(), n, n / fps, n / fps) + + camera_state = messaging.new_message(state) + frame = getattr(camera_state, state) + frame.frameId = n + pm.send(state, camera_state) + + # send audio + msg = messaging.new_message('rawAudioData') + msg.rawAudioData.data = bytes(800 * 2) # 800 samples of int16 + msg.rawAudioData.sampleRate = 16000 + pm.send('rawAudioData', msg) + + for _, _, state in streams: + assert pm.wait_for_readers_to_update(state, timeout=5, dt=0.001) + + sm.update(100) + finally: + encoderd_ret = managed_processes["encoderd"].stop(timeout=30) + loggerd_ret = managed_processes["loggerd"].stop(timeout=30) + del vipc_server + + assert encoderd_ret == 0 + assert loggerd_ret == 0 + + def test_init_data_values(self): + os.environ["CLEAN"] = random.choice(["0", "1"]) + + dongle = ''.join(random.choice(string.printable) for n in range(random.randint(1, 100))) + fake_params = [ + # param, initData field, value + ("DongleId", "dongleId", dongle), + ("GitCommit", "gitCommit", "commit"), + ("GitCommitDate", "gitCommitDate", "date"), + ("GitBranch", "gitBranch", "branch"), + ("GitRemote", "gitRemote", "remote"), + ] + params = Params() + for k, _, v in fake_params: + params.put(k, v) + params.put("AccessToken", "abc") + + lr = list(LogReader(str(self._gen_bootlog()))) + initData = lr[0].initData + + assert initData.dirty != bool(os.environ["CLEAN"]) + assert initData.version == get_version() + + if TICI: + assert initData._has("ufsHealth") + assert initData.ufsHealth.preEolInfo in (1, 2, 3) + assert 1 <= initData.ufsHealth.lifeTimeEstimateA <= 11 + assert 1 <= initData.ufsHealth.lifeTimeEstimateB <= 11 + assert len(initData.ufsHealth.vendorHealthReport) == 32 + else: + assert not initData._has("ufsHealth") + + if os.path.isfile("/proc/cmdline"): + with open("/proc/cmdline") as f: + assert list(initData.kernelArgs) == f.read().strip().split(" ") + + with open("/proc/version") as f: + assert initData.kernelVersion == f.read() + + # check params + logged_params = {entry.key: entry.value for entry in initData.params.entries} + expected_params = {k for k, _, __ in fake_params} | {'AccessToken', 'BootCount'} + assert set(logged_params.keys()) == expected_params, set(logged_params.keys()) ^ expected_params + assert logged_params['AccessToken'] == b'', f"DONT_LOG param value was logged: {repr(logged_params['AccessToken'])}" + for param_key, initData_key, v in fake_params: + assert getattr(initData, initData_key) == v + assert logged_params[param_key].decode() == v + + @pytest.mark.xdist_group("camera_encoder_tests") # setting xdist group ensures tests are run in same worker, prevents encoderd from crashing + def test_rotation(self): + Params().put_bool("RecordFront", True) + + expected_files = {"rlog.zst", "qlog.zst", "qcamera.ts", "fcamera.hevc", "dcamera.hevc", "ecamera.hevc"} + + num_segs = random.randint(2, 3) + length = random.randint(4, 5) # H264 encoder uses 40 lookahead frames and does B-frame reordering, so minimum 3 seconds before qcam output + + self._publish_camera_and_audio_messages(num_segs=num_segs, segment_length=length) + + route_path = str(self._get_latest_log_dir()).rsplit("--", 1)[0] + for n in range(num_segs): + p = Path(f"{route_path}--{n}") + logged = {f.name for f in p.iterdir() if f.is_file()} + diff = logged ^ expected_files + assert len(diff) == 0, f"didn't get all expected files. seg={n} {route_path=}, {diff=}\n{logged=} {expected_files=}" + + def test_bootlog(self): + # generate bootlog with fake launch log + launch_log = ''.join(str(random.choice(string.printable)) for _ in range(100)) + with open("/tmp/launch_log", "w") as f: + f.write(launch_log) + + bootlog_path = self._gen_bootlog() + lr = list(LogReader(str(bootlog_path))) + + # check length + assert len(lr) == 2 # boot + initData + + self._check_init_data(lr) + + # check msgs + bootlog_msgs = [m for m in lr if m.which() == 'boot'] + assert len(bootlog_msgs) == 1 + + # sanity check values + boot = bootlog_msgs.pop().boot + assert abs(boot.wallTimeNanos - time.time_ns()) < 5*1e9 # within 5s + assert boot.launchLog == launch_log + + if TICI: + for fn in ["console-ramoops", "pmsg-ramoops-0"]: + path = Path(os.path.join("/sys/fs/pstore/", fn)) + if path.is_file(): + with open(path, "rb") as f: + expected_val = f.read() + bootlog_val = [e.value for e in boot.pstore.entries if e.key == fn][0] + assert expected_val == bootlog_val + else: + assert len(boot.pstore.entries) == 0 + + # next one should increment by one + bl1 = re.match(RE.LOG_ID_V2, bootlog_path.name) + bl2 = re.match(RE.LOG_ID_V2, self._gen_bootlog().name) + assert bl1.group('uid') != bl2.group('uid') + assert int(bl1.group('count')) == 0 and int(bl2.group('count')) == 1 + + def test_qlog(self): + qlog_services = [s for s in CEREAL_SERVICES if SERVICE_LIST[s].decimation is not None] + no_qlog_services = [s for s in CEREAL_SERVICES if SERVICE_LIST[s].decimation is None] + + services = random.sample(qlog_services, random.randint(2, min(10, len(qlog_services)))) + \ + random.sample(no_qlog_services, random.randint(2, min(10, len(no_qlog_services)))) + sent_msgs = self._publish_random_messages(services) + + qlog_path = os.path.join(self._get_latest_log_dir(), "qlog.zst") + lr = list(LogReader(qlog_path)) + + # check initData and sentinel + self._check_init_data(lr) + self._check_sentinel(lr, True) + + recv_msgs = defaultdict(list) + for m in lr: + recv_msgs[m.which()].append(m) + + for s, msgs in sent_msgs.items(): + recv_cnt = len(recv_msgs[s]) + + if s in no_qlog_services: + # check services with no specific decimation aren't in qlog + assert recv_cnt == 0, f"got {recv_cnt} {s} msgs in qlog" + else: + # check logged message count matches decimation + expected_cnt = (len(msgs) - 1) // SERVICE_LIST[s].decimation + 1 + assert recv_cnt == expected_cnt, f"expected {expected_cnt} msgs for {s}, got {recv_cnt}" + + def test_rlog(self): + services = random.sample(CEREAL_SERVICES, random.randint(5, 10)) + sent_msgs = self._publish_random_messages(services) + + lr = list(LogReader(os.path.join(self._get_latest_log_dir(), "rlog.zst"))) + + # check initData and sentinel + self._check_init_data(lr) + self._check_sentinel(lr, True) + + # check all messages were logged and in order + lr = lr[2:-1] # slice off initData and both sentinels + for m in lr: + sent = sent_msgs[m.which()].pop(0) + sent.clear_write_flag() + assert sent.to_bytes() == m.as_builder().to_bytes() + + def test_preserving_bookmarked_segments(self): + services = set(random.sample(CEREAL_SERVICES, random.randint(5, 10))) | {"userBookmark"} + self._publish_random_messages(services) + + segment_dir = self._get_latest_log_dir() + assert getxattr(segment_dir, PRESERVE_ATTR_NAME) == PRESERVE_ATTR_VALUE + + def test_not_preserving_nonbookmarked_segments(self): + services = set(random.sample(CEREAL_SERVICES, random.randint(5, 10))) - {"userBookmark", "audioFeedback"} + self._publish_random_messages(services) + + segment_dir = self._get_latest_log_dir() + assert getxattr(segment_dir, PRESERVE_ATTR_NAME) is None + + @pytest.mark.xdist_group("camera_encoder_tests") # setting xdist group ensures tests are run in same worker, prevents encoderd from crashing + @pytest.mark.parametrize("record_front", [True, False]) + def test_record_front(self, record_front): + params = Params() + params.put_bool("RecordFront", record_front) + + self._publish_camera_and_audio_messages() + + dcamera_hevc_exists = os.path.exists(os.path.join(self._get_latest_log_dir(), 'dcamera.hevc')) + assert dcamera_hevc_exists == record_front + + @pytest.mark.xdist_group("camera_encoder_tests") # setting xdist group ensures tests are run in same worker, prevents encoderd from crashing + @pytest.mark.parametrize("record_audio", [True, False]) + def test_record_audio(self, record_audio): + params = Params() + params.put_bool("RecordAudio", record_audio) + + self._publish_camera_and_audio_messages() + + qcamera_ts_path = os.path.join(self._get_latest_log_dir(), 'qcamera.ts') + ffprobe_cmd = f"ffprobe -i {qcamera_ts_path} -show_streams -select_streams a -loglevel error" + has_audio_stream = subprocess.run(ffprobe_cmd, shell=True, capture_output=True).stdout.strip() != b'' + assert has_audio_stream == record_audio + + raw_audio_in_rlog = any(m.which() == 'rawAudioData' for m in LogReader(os.path.join(self._get_latest_log_dir(), 'rlog.zst'))) + assert raw_audio_in_rlog == record_audio + + @pytest.mark.xdist_group("camera_encoder_tests") # setting xdist group ensures tests are run in same worker, prevents encoderd from crashing + def test_record_audio_init_failure_fails_open(self): + params = Params() + params.put_bool("RecordAudio", True) + + os.environ["LOGGERD_TEST_AUDIO_INIT_FAIL"] = "1" + try: + self._publish_camera_and_audio_messages() + finally: + os.environ.pop("LOGGERD_TEST_AUDIO_INIT_FAIL", None) + + latest_log_dir = self._get_latest_log_dir() + qcamera_ts_path = os.path.join(latest_log_dir, 'qcamera.ts') + assert os.path.exists(qcamera_ts_path) + + ffprobe_cmd = f"ffprobe -i {qcamera_ts_path} -show_streams -select_streams a -loglevel error" + has_audio_stream = subprocess.run(ffprobe_cmd, shell=True, capture_output=True).stdout.strip() != b'' + assert has_audio_stream is False + + raw_audio_in_rlog = any(m.which() == 'rawAudioData' for m in LogReader(os.path.join(latest_log_dir, 'rlog.zst'))) + assert raw_audio_in_rlog is True diff --git a/iqpilot/system/loggerd/tests/vidc_debug.sh b/iqpilot/system/loggerd/tests/vidc_debug.sh new file mode 100755 index 000000000..7471f2ab0 --- /dev/null +++ b/iqpilot/system/loggerd/tests/vidc_debug.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -e + +cd /sys/kernel/debug/tracing +echo "" > trace +echo 1 > tracing_on +echo 1 > /sys/kernel/debug/tracing/events/msm_vidc/enable + +echo 0xff > /sys/module/videobuf2_core/parameters/debug +echo 0x7fffffff > /sys/kernel/debug/msm_vidc/debug_level +echo 0xff > /sys/devices/platform/soc/aa00000.qcom,vidc/video4linux/video33/dev_debug + +cat /sys/kernel/debug/tracing/trace_pipe diff --git a/iqpilot/system/loggerd/uploader_common.py b/iqpilot/system/loggerd/uploader_common.py new file mode 100644 index 000000000..a797a60e4 --- /dev/null +++ b/iqpilot/system/loggerd/uploader_common.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +import os + +from iqpilot.common.swaglog import cloudlog + + +def get_directory_sort(d: str) -> list[str]: + prefix = ["0"] if d.startswith("2024-") else ["1"] + return prefix + [s.rjust(10, "0") for s in d.rsplit("--", 1)] + + +def listdir_by_creation(d: str) -> list[str]: + if not os.path.isdir(d): + return [] + + try: + paths = [f for f in os.listdir(d) if os.path.isdir(os.path.join(d, f))] + return sorted(paths, key=get_directory_sort) + except OSError: + cloudlog.exception("uploader_common.listdir_by_creation_failed") + return [] diff --git a/iqpilot/system/loggerd/xattr_cache.py b/iqpilot/system/loggerd/xattr_cache.py new file mode 100644 index 000000000..194b46459 --- /dev/null +++ b/iqpilot/system/loggerd/xattr_cache.py @@ -0,0 +1,28 @@ +import errno +import os + +import xattr + +_cached_attributes: dict[tuple[str, str], tuple[tuple[int, int, int], bytes | None]] = {} + +def getxattr(path: str, attr_name: str) -> bytes | None: + key = (path, attr_name) + st = os.stat(path) + identity = (st.st_dev, st.st_ino, st.st_ctime_ns) + cached = _cached_attributes.get(key) + if cached is None or cached[0] != identity: + try: + response = xattr.getxattr(path, attr_name) + except OSError as e: + # ENODATA (Linux) or ENOATTR (macOS) means attribute hasn't been set + if e.errno == errno.ENODATA or (hasattr(errno, 'ENOATTR') and e.errno == errno.ENOATTR): + response = None + else: + raise + _cached_attributes[key] = (identity, response) + return _cached_attributes[key][1] + +def setxattr(path: str, attr_name: str, attr_value: bytes) -> None: + xattr.setxattr(path, attr_name, attr_value) + st = os.stat(path) + _cached_attributes[(path, attr_name)] = ((st.st_dev, st.st_ino, st.st_ctime_ns), attr_value) diff --git a/iqpilot/system/logmessaged.py b/iqpilot/system/logmessaged.py new file mode 100755 index 000000000..f1ca0544a --- /dev/null +++ b/iqpilot/system/logmessaged.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +import zmq +from typing import NoReturn + +import iqpilot.cereal.messaging as messaging +from iqpilot.common.logging_extra import SwagLogFileFormatter +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import get_file_handler + + +def close_log_handler(log_handler): + try: + log_handler.close() + except ValueError: + pass + + +def main() -> NoReturn: + log_handler = get_file_handler() + log_handler.setFormatter(SwagLogFileFormatter(None)) + log_level = 20 # logging.INFO + + ctx = zmq.Context.instance() + sock = ctx.socket(zmq.PULL) + sock.bind(Paths.swaglog_ipc()) + + # and we publish them + log_message_sock = messaging.pub_sock('logMessage') + error_log_message_sock = messaging.pub_sock('errorLogMessage') + + try: + while True: + dat = b''.join(sock.recv_multipart()) + level = dat[0] + record = dat[1:].decode("utf-8") + if level >= log_level: + log_handler.emit(record) + + if len(record) > 2*1024*1024: + print("WARNING: log too big to publish", len(record)) + print(record[:100]) + continue + + # then we publish them + msg = messaging.new_message(None, valid=True, logMessage=record) + log_message_sock.send(msg.to_bytes()) + + if level >= 40: # logging.ERROR + msg = messaging.new_message(None, valid=True, errorLogMessage=record) + error_log_message_sock.send(msg.to_bytes()) + finally: + sock.close() + ctx.term() + + close_log_handler(log_handler) + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/manager/__init__.py b/iqpilot/system/manager/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/manager/build.py b/iqpilot/system/manager/build.py new file mode 100755 index 000000000..f05a87a22 --- /dev/null +++ b/iqpilot/system/manager/build.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +import os +import subprocess +import sys +from pathlib import Path + +# NOTE: Do NOT import anything here that needs be built (e.g. params) +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.spinner import Spinner +from iqpilot.common.text_window import TextWindow +from iqpilot.common.swaglog import cloudlog, add_file_handler +from iqpilot.system.hardware import HARDWARE, AGNOS +from iqpilot.system.version import get_build_metadata + +MAX_CACHE_SIZE = 4e9 if "CI" in os.environ else 2e9 +CACHE_DIR = Path("/data/scons_cache" if AGNOS else "/tmp/scons_cache") + +TOTAL_SCONS_NODES = 5500 +MAX_BUILD_PROGRESS = 100 + +def get_job_sequence() -> list[int]: + env_override = os.environ.get("SCONS_MAX_JOBS") + if env_override is not None: + try: + max_jobs = max(1, int(env_override)) + except ValueError: + max_jobs = 1 + else: + detected_jobs = os.cpu_count() or 2 + max_jobs = min(detected_jobs, 3 if AGNOS else detected_jobs) + + candidates = [max_jobs, max_jobs // 2, 1] + jobs: list[int] = [] + for candidate in candidates: + candidate = max(1, int(candidate)) + if candidate not in jobs: + jobs.append(candidate) + return jobs + +class _SilentProgress: + """Not a UI element: a do-nothing sink for build()'s progress calls, used when + updated.py builds in the background at update-apply time so that NO spinner or + window is shown. The normal boot path still uses the real Spinner.""" + def update(self, spinner_text: str) -> None: + pass + + def update_progress(self, cur: float, total: float) -> None: + pass + + def close(self) -> None: + pass + + +def build(spinner, dirty: bool = False, minimal: bool = False, show_error_window: bool = True) -> None: + env = os.environ.copy() + env.pop('PWD', None) + env['SCONS_PROGRESS'] = "1" + + extra_args = ["--minimal"] if minimal else [] + + if AGNOS: + HARDWARE.set_power_save(False) + os.sched_setaffinity(0, range(8)) # ensure we can use the isolcpus cores + + # building with all cores can result in using too + # much memory, so retry with less parallelism + compile_output: list[bytes] = [] + for n in get_job_sequence(): + compile_output.clear() + command = [sys.executable, "-m", "SCons", f"-j{int(n)}", "--cache-populate", *extra_args] + scons: subprocess.Popen = subprocess.Popen(command, cwd=BASEDIR, env=env, stderr=subprocess.PIPE) + assert scons.stderr is not None + + # Read progress from stderr and update spinner + while scons.poll() is None: + try: + line = scons.stderr.readline() + if line is None: + continue + line = line.rstrip() + + prefix = b'progress: ' + if line.startswith(prefix): + i = int(line[len(prefix):]) + spinner.update_progress(MAX_BUILD_PROGRESS * min(0.99, i / TOTAL_SCONS_NODES), 100.) + elif len(line): + compile_output.append(line) + print(line.decode('utf8', 'replace')) + except Exception: + pass + + if scons.returncode == 0: + spinner.update_progress(100, 100.) + break + + if scons.returncode != 0: + # Read remaining output + if scons.stderr is not None: + compile_output += scons.stderr.read().split(b'\n') + + # Build failed log errors + error_s = b"\n".join(compile_output).decode('utf8', 'replace') + add_file_handler(cloudlog) + cloudlog.error("scons build failed\n" + error_s) + + # Show TextWindow + spinner.close() + if not os.getenv("CI") and show_error_window: + with TextWindow("IQ.Pilot failed to build\n \n" + error_s) as t: + t.wait_for_exit() + exit(1) + + # enforce max cache size + cache_files = [f for f in CACHE_DIR.rglob('*') if f.is_file()] + cache_files.sort(key=lambda f: f.stat().st_mtime) + cache_size = sum(f.stat().st_size for f in cache_files) + for f in cache_files: + if cache_size < MAX_CACHE_SIZE: + break + cache_size -= f.stat().st_size + f.unlink() + + +if __name__ == "__main__": + headless = "--headless" in sys.argv + spinner = _SilentProgress() if headless else Spinner() + spinner.update_progress(0, 100) + build_metadata = get_build_metadata() + build(spinner, build_metadata.openpilot.is_dirty, minimal = AGNOS, show_error_window = not headless) diff --git a/iqpilot/system/manager/github_runner.sh b/iqpilot/system/manager/github_runner.sh new file mode 100755 index 000000000..a3befe1f1 --- /dev/null +++ b/iqpilot/system/manager/github_runner.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +# Define the service name +SERVICE_NAME="actions.runner.iqpilot.$(uname -n)" + +# Function to control the service +control_service() { + local action=$1 # Store the function argument in a local variable + sudo systemctl $action ${SERVICE_NAME} +} + +service_exists_and_is_loaded() { + sudo systemctl status ${SERVICE_NAME} &>/dev/null + if [[ $? -ne 4 ]]; then + return 0 # Service is known to systemd (i.e., loaded) + else + return 1 # Service is unknown to systemd (i.e., not loaded) + fi +} + +# Check for required argument +if [[ -z $1 ]] || { [[ $1 != "start" ]] && [[ $1 != "stop" ]]; }; then + echo "Usage: $0 {start|stop}" + exit 1 +fi + +# Store the script argument in a descriptive variable +ACTION=$1 + +# Trap EXIT signal (Ctrl+C) and stop the service +trap 'control_service stop ; exit' SIGINT SIGKILL EXIT + +# Enter the main loop +while true; do + # Check if the service is actually present on the system + if service_exists_and_is_loaded; then + control_service $ACTION # Call the function with the specified action + fi + sleep 1 # Pause before the next iteration +done \ No newline at end of file diff --git a/iqpilot/system/manager/helpers.py b/iqpilot/system/manager/helpers.py new file mode 100644 index 000000000..7385a12d8 --- /dev/null +++ b/iqpilot/system/manager/helpers.py @@ -0,0 +1,104 @@ +import errno +import fcntl +import os +import sys +import pathlib +import shutil +import signal +import subprocess +import tempfile +import threading + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params + +def unblock_stdout() -> None: + # get a non-blocking stdout + child_pid, child_pty = os.forkpty() + if child_pid != 0: # parent + + # child is in its own process group, manually pass kill signals + signal.signal(signal.SIGINT, lambda signum, frame: os.kill(child_pid, signal.SIGINT)) + signal.signal(signal.SIGTERM, lambda signum, frame: os.kill(child_pid, signal.SIGTERM)) + + fcntl.fcntl(sys.stdout, fcntl.F_SETFL, fcntl.fcntl(sys.stdout, fcntl.F_GETFL) | os.O_NONBLOCK) + + while True: + try: + dat = os.read(child_pty, 4096) + except OSError as e: + if e.errno == errno.EIO: + break + continue + + if not dat: + break + + try: + sys.stdout.write(dat.decode('utf8')) + except (OSError, UnicodeDecodeError): + pass + + # os.wait() returns a tuple with the pid and a 16 bit value + # whose low byte is the signal number and whose high byte is the exit status + exit_status = os.wait()[1] >> 8 + os._exit(exit_status) + + +def write_onroad_params(started, params): + params.put_bool("IsOnroad", started) + params.put_bool("IsOffroad", not started) + + +def heal_param_perms(): + """Self-heal for a boot-bricking failure mode: a stray root process occasionally + writes a param (seen with RouteCount/CurrentRoute) as root:root 0600, which manager + (comma) then can't read — crashing save_bootlog and any param read. Detect params we + don't own and chown them back + make them readable. Needs root to chown another user's + file, so it shells to passwordless sudo (device grants it); best-effort, never raises, + never blocks boot. No-op when everything is already ours (the common case: no sudo).""" + try: + param_path = Params().get_param_path() + uid, gid = os.getuid(), os.getgid() + stray = [] + for name in os.listdir(param_path): + p = os.path.join(param_path, name) + try: + if os.stat(p).st_uid != uid: + stray.append(p) + except OSError: + pass + if stray: + subprocess.run(["sudo", "-n", "chown", f"{uid}:{gid}", *stray], check=False, timeout=15, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + subprocess.run(["sudo", "-n", "chmod", "644", *stray], check=False, timeout=15, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + except Exception: + pass + + +def save_bootlog(): + # copy current params + tmp = tempfile.mkdtemp() + params_dirname = pathlib.Path(Params().get_param_path()).name + params_dir = os.path.join(tmp, params_dirname) + + # Params are rewritten atomically (unlink + rename) by other processes, so a + # value can vanish between copytree's listing and the copy; a param may also be + # unreadable (e.g. a root-owned RouteCount/CurrentRoute). Skip any file we can't + # copy instead of raising — the bootlog snapshot is best-effort and must NOT block boot. + def _copy_skip_missing(src, dst, *, follow_symlinks=True): + try: + shutil.copy2(src, dst, follow_symlinks=follow_symlinks) + except OSError: + pass + shutil.copytree(Params().get_param_path(), params_dir, dirs_exist_ok=True, copy_function=_copy_skip_missing) + + def fn(tmpdir): + env = os.environ.copy() + env['PARAMS_COPY_PATH'] = tmpdir + subprocess.call("./bootlog", cwd=os.path.join(BASEDIR, "iqpilot/system/loggerd"), env=env) + shutil.rmtree(tmpdir) + t = threading.Thread(target=fn, args=(tmp, )) + t.daemon = True + t.start() diff --git a/iqpilot/system/manager/manager.py b/iqpilot/system/manager/manager.py new file mode 100755 index 000000000..c72e65329 --- /dev/null +++ b/iqpilot/system/manager/manager.py @@ -0,0 +1,309 @@ +#!/usr/bin/env python3 +import datetime +import os +import signal +import sys +import time +import traceback + +# sync $PWD before cereal/kj loads (and for spawned procs) or kj warns "PWD doesn't match" +os.environ['PWD'] = os.getcwd() + +from iqpilot.cereal import log +import iqpilot.cereal.messaging as messaging +import iqpilot.system.sentry as sentry +from iqpilot.common.utils import atomic_write +from iqpilot.common.params import Params, ParamKeyFlag +from iqpilot.common.text_window import TextWindow +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.loggerd.crash_recovery import recover_unclean_segments +from iqpilot.system.manager.helpers import unblock_stdout, write_onroad_params, save_bootlog, heal_param_perms +from iqpilot.system.manager.process import ensure_running +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.konn3kt.registration import register, UNREGISTERED_DONGLE_ID +from iqpilot.common.swaglog import cloudlog, add_file_handler +from iqpilot.system.version import get_build_metadata +from iqpilot.system.hardware.hw import Paths + + +MODELD_WATCHDOG_TIMEOUT = 30.0 + + +def update_modeld_watchdog(deadline: float | None, started: bool, model_updated: bool, process, now: float) -> float | None: + running = process.proc is not None and process.proc.is_alive() + if not started or not running: + return None + if deadline is None or model_updated: + return now + MODELD_WATCHDOG_TIMEOUT + if now >= deadline: + cloudlog.error("iqmodeld is alive but not publishing modelV2; restarting") + process.restart() + return now + MODELD_WATCHDOG_TIMEOUT + return deadline + + +def manager_init() -> None: + heal_param_perms() + save_bootlog() + + # loggerd isn't running yet, so any leftover .lock marks an unclean shutdown: + # unlock those segments and preserve them (dashcam footage from power cuts) + try: + recover_unclean_segments() + except Exception: + cloudlog.exception("recover_unclean_segments failed") + + try: + from iqpilot.system.hardware import TICI + if TICI: + from iqpilot.system.hardware.tici.usb_storage import ensure_ncm_gadget, suspend_usb_input + ensure_ncm_gadget() + if Params().get_bool("IQEmacEnabled") or Params().get_bool("IQEgpuEnabled"): + suspend_usb_input(True) + except Exception: + cloudlog.exception("emac usb setup failed") + + build_metadata = get_build_metadata() + + params = Params() + params.clear_all(ParamKeyFlag.CLEAR_ON_MANAGER_START) + params.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION) + params.clear_all(ParamKeyFlag.CLEAR_ON_OFFROAD_TRANSITION) + params.clear_all(ParamKeyFlag.CLEAR_ON_IGNITION_ON) + if build_metadata.release_channel: + params.clear_all(ParamKeyFlag.DEVELOPMENT_ONLY) + + # device boot mode + if params.get("DeviceBootMode") == 1: # start in Always Offroad mode + params.put_bool("IQAlwaysOffroad", True) + + if params.get_bool("RecordFrontLock"): + params.put_bool("RecordFront", True) + + # set unset params to their default value + initialized_defaults = {} + for k in params.all_keys(): + default_value = params.get_default_value(k) + if default_value is not None and params.get(k) is None: + params.put(k, default_value) + if default_value is not None: + initialized_defaults[k] = params.get(k) + + try: + from iqpilot.selfdrive.iqmodeld.models.helpers import seed_default_bundle_if_unset + seed_default_bundle_if_unset(params) + except Exception: + cloudlog.exception("failed to seed default model bundle") + for k, value in initialized_defaults.items(): + if value is not None and params.get(k) is None: + params.put(k, value) + + # Create folders needed for msgq + try: + os.mkdir(Paths.shm_path()) + except FileExistsError: + pass + except PermissionError: + print(f"WARNING: failed to make {Paths.shm_path()}") + + # set params + serial = HARDWARE.get_serial() + params.put("Version", build_metadata.openpilot.version) + params.put("GitCommit", build_metadata.openpilot.git_commit) + params.put("GitCommitDate", build_metadata.openpilot.git_commit_date) + params.put("GitBranch", build_metadata.channel) + params.put("GitRemote", build_metadata.openpilot.git_origin) + params.put_bool("IsDevelopmentBranch", build_metadata.development_channel) + params.put_bool("IsTestedBranch", build_metadata.tested_channel) + params.put_bool("IsReleaseBranch", build_metadata.release_channel) + params.put_bool("IsReleaseIqBranch", build_metadata.release_channel) + params.put("HardwareSerial", serial) + + # set dongle id + reg_res = register(show_spinner=True) + if reg_res: + dongle_id = reg_res + else: + raise Exception(f"Registration failed for device {serial}") + os.environ['DONGLE_ID'] = dongle_id # Needed for swaglog + os.environ['GIT_ORIGIN'] = build_metadata.openpilot.git_normalized_origin # Needed for swaglog + os.environ['GIT_BRANCH'] = build_metadata.channel # Needed for swaglog + os.environ['GIT_COMMIT'] = build_metadata.openpilot.git_commit # Needed for swaglog + + if not build_metadata.openpilot.is_dirty: + os.environ['CLEAN'] = '1' + + # init logging + sentry.init(sentry.SentryProject.SELFDRIVE) + cloudlog.bind_global(dongle_id=dongle_id, + version=build_metadata.openpilot.version, + origin=build_metadata.openpilot.git_normalized_origin, + branch=build_metadata.channel, + commit=build_metadata.openpilot.git_commit, + dirty=build_metadata.openpilot.is_dirty, + device=HARDWARE.get_device_type()) + + # preimport all processes + for p in managed_processes.values(): + p.prepare() + + +def manager_cleanup() -> None: + # send signals to kill all procs + for p in managed_processes.values(): + p.stop(block=False) + + # ensure all are killed + for p in managed_processes.values(): + p.stop(block=True) + + cloudlog.info("everything is dead") + + +def manager_thread() -> None: + cloudlog.bind(daemon="manager") + cloudlog.info("manager start") + cloudlog.info({"environ": os.environ}) + + params = Params() + + ignore: list[str] = [] + if params.get("DongleId") in (None, UNREGISTERED_DONGLE_ID): + ignore += ["manage_hephaestusd", "iquploaderd"] + if os.getenv("NOBOARD") is not None: + ignore.append("pandad") + ignore += [x for x in os.getenv("BLOCK", "").split(",") if len(x) > 0] + + sm = messaging.SubMaster(['deviceState', 'carParams', 'pandaStates', 'modelV2'], poll='deviceState') + pm = messaging.PubMaster(['managerState']) + + write_onroad_params(False, params) + ensure_running(managed_processes.values(), False, params=params, CP=sm['carParams'], not_run=ignore) + + started_prev = False + ignition_prev = False + running_prev = None + modeld_deadline = None + + while True: + sm.update(1000) + + started = sm['deviceState'].started + + if started and not started_prev: + try: + HARDWARE.set_power_save(False) + except Exception: + cloudlog.exception("failed to leave power save on onroad transition") + params.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION) + elif not started and started_prev: + params.clear_all(ParamKeyFlag.CLEAR_ON_OFFROAD_TRANSITION) + + ignition = any(ps.ignitionLine or ps.ignitionCan for ps in sm['pandaStates'] if ps.pandaType != log.PandaState.PandaType.unknown) + if ignition and not ignition_prev: + params.clear_all(ParamKeyFlag.CLEAR_ON_IGNITION_ON) + + # update onroad params, which drives pandad's safety setter thread + if started != started_prev: + write_onroad_params(started, params) + + started_prev = started + ignition_prev = ignition + + ensure_running(managed_processes.values(), started, params=params, CP=sm['carParams'], not_run=ignore) + modeld_deadline = update_modeld_watchdog( + modeld_deadline, started, sm.updated['modelV2'], managed_processes['iqmodeld'], time.monotonic() + ) + + # print only on change (reprinting every loop floods the shared tmux); always logged + procs = [p for p in managed_processes.values() if p.proc] + running = ' '.join( + ("\u001b[32m{}\u001b[0m".format(p.name) if p.proc.is_alive() + else "\u001b[1;31m\u2717 {}\u001b[0m".format(p.name)) + for p in procs) + cloudlog.debug(running) + alive = tuple(p.proc.is_alive() for p in procs) + if alive != running_prev: + print(running) + running_prev = alive + + # send managerState + msg = messaging.new_message('managerState', valid=True) + msg.managerState.processes = [p.get_process_state_msg() for p in managed_processes.values()] + pm.send('managerState', msg) + + # kick AGNOS power monitoring watchdog + try: + if sm.all_checks(['deviceState']): + with atomic_write("/var/tmp/power_watchdog", "w", overwrite=True) as f: + f.write(str(time.monotonic())) + except Exception: + pass + + # Exit main loop when uninstall/shutdown/reboot is needed + shutdown = False + for param in ("DoUninstall", "DoShutdown", "DoReboot"): + if params.get_bool(param): + shutdown = True + params.put("LastManagerExitReason", f"{param} {datetime.datetime.now()}") + cloudlog.warning(f"Shutting down manager - {param} set") + + if shutdown: + break + + +def main() -> None: + manager_init() + if os.getenv("PREPAREONLY") is not None: + return + + # SystemExit on sigterm + signal.signal(signal.SIGTERM, lambda signum, frame: sys.exit(1)) + + try: + manager_thread() + except Exception: + traceback.print_exc() + sentry.capture_exception() + finally: + manager_cleanup() + + params = Params() + if params.get_bool("DoUninstall"): + cloudlog.warning("uninstalling") + HARDWARE.uninstall() + elif params.get_bool("DoReboot"): + cloudlog.warning("reboot") + HARDWARE.reboot() + elif params.get_bool("DoShutdown"): + cloudlog.warning("shutdown") + HARDWARE.shutdown() + + +if __name__ == "__main__": + if not (os.getenv("SIMULATION") and sys.platform == "darwin"): + unblock_stdout() + + try: + main() + except KeyboardInterrupt: + print("got CTRL-C, exiting") + except Exception: + add_file_handler(cloudlog) + cloudlog.exception("Manager failed to start") + + try: + managed_processes['ui'].stop() + except Exception: + pass + + # Show last 3 lines of traceback + error = traceback.format_exc(-3) + error = "Manager failed to start\n\n" + error + with TextWindow(error) as t: + t.wait_for_exit() + + raise + + # manual exit because we are forked + sys.exit(0) diff --git a/iqpilot/system/manager/process.py b/iqpilot/system/manager/process.py new file mode 100644 index 000000000..c0fe7caa8 --- /dev/null +++ b/iqpilot/system/manager/process.py @@ -0,0 +1,365 @@ +import importlib +import os +import signal +import time +import subprocess +from pathlib import Path +from collections.abc import Callable, ValuesView +from abc import ABC, abstractmethod +from multiprocessing import Process + +from setproctitle import setproctitle + +from iqpilot.cereal import car, log +import iqpilot.cereal.messaging as messaging +import iqpilot.system.sentry as sentry +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog + +MAX_CRASH_BACKOFF = 300.0 +CRASH_RESET_TIME = 60.0 +CRASH_LOOP_THRESHOLD = 6 + +try: + from iqpilot.system.proprietary_runtime.runtime_paths import preferred_runner_path +except ModuleNotFoundError: + _VERIFIED_RUNNER_PATH = Path("/usr/libexec/iqpilot/iqpilot_bundle_runner") + _FALLBACK_RUNNER_PATH = Path("/data/openpilot/iqpilot/system/proprietary_runtime/iqpilot_bundle_runner") + + def preferred_runner_path() -> Path: + if _VERIFIED_RUNNER_PATH.is_file() and os.access(_VERIFIED_RUNNER_PATH, os.X_OK): + return _VERIFIED_RUNNER_PATH + if os.getenv("IQPILOT_ALLOW_DEV_FALLBACKS") == "1" and _FALLBACK_RUNNER_PATH.is_file(): + return _FALLBACK_RUNNER_PATH + return _VERIFIED_RUNNER_PATH + + +def launcher(proc: str, name: str) -> None: + try: + # import the process + mod = importlib.import_module(proc) + + # rename the process + setproctitle(proc) + + # create new context since we forked + messaging.reset_context() + + # add daemon name tag to logs + cloudlog.bind(daemon=name) + sentry.set_tag("daemon", name) + + # exec the process + mod.main() + except KeyboardInterrupt: + cloudlog.warning(f"child {proc} got SIGINT") + except Exception: + # can't install the crash handler because sys.excepthook doesn't play nice + # with threads, so catch it here. + sentry.capture_exception() + raise + + +def nativelauncher(pargs: list[str], cwd: str, name: str) -> None: + os.environ['MANAGER_DAEMON'] = name + + # exec the process + os.chdir(cwd) + os.environ['PWD'] = cwd + os.execvp(pargs[0], pargs) + + +def join_process(process: Process, timeout: float) -> None: + # Process().join(timeout) will hang due to a python 3 bug: https://bugs.python.org/issue28382 + # We have to poll the exitcode instead + t = time.monotonic() + while time.monotonic() - t < timeout and process.exitcode is None: + time.sleep(0.001) + + +class ManagerProcess(ABC): + daemon = False + sigkill = False + should_run: Callable[[bool, Params, car.CarParams], bool] + proc: Process | None = None + enabled = True + name = "" + shutting_down = False + restart_if_crash = False + crash_count = 0 + last_restart_time = 0.0 + last_alive_time = 0.0 + crash_loop_logged = False + + @abstractmethod + def prepare(self) -> None: + pass + + @abstractmethod + def start(self) -> None: + pass + + def restart(self) -> None: + self.stop(sig=signal.SIGKILL) + self.start() + + def stop(self, retry: bool = True, block: bool = True, sig: signal.Signals | None = None, timeout: float = 5) -> int | None: + if self.proc is None: + return None + + if self.proc.exitcode is None: + if not self.shutting_down: + cloudlog.info(f"killing {self.name}") + if sig is None: + sig = signal.SIGKILL if self.sigkill else signal.SIGINT + self.signal(sig) + self.shutting_down = True + + if not block: + return None + + join_process(self.proc, timeout) + + # If process failed to die send SIGKILL + if self.proc.exitcode is None and retry: + cloudlog.info(f"killing {self.name} with SIGKILL") + self.signal(signal.SIGKILL) + self.proc.join() + + ret = self.proc.exitcode + cloudlog.info(f"{self.name} is dead with {ret}") + + if self.proc.exitcode is not None: + self.shutting_down = False + self.proc = None + + return ret + + def signal(self, sig: int) -> None: + if self.proc is None: + return + + # Don't signal if already exited + if self.proc.exitcode is not None and self.proc.pid is not None: + return + + # Can't signal if we don't have a pid + if self.proc.pid is None: + return + + cloudlog.info(f"sending signal {sig} to {self.name}") + os.kill(self.proc.pid, sig) + + def get_process_state_msg(self): + state = log.ManagerState.ProcessState.new_message() + state.name = self.name + if self.proc: + state.running = self.proc.is_alive() + state.shouldBeRunning = self.proc is not None and not self.shutting_down + state.pid = self.proc.pid or 0 + state.exitCode = self.proc.exitcode or 0 + return state + + +class NativeProcess(ManagerProcess): + def __init__(self, name, cwd, cmdline, should_run, enabled=True, sigkill=False, restart_if_crash=False): + self.name = name + self.cwd = cwd + self.cmdline = cmdline + self.should_run = should_run + self.enabled = enabled + self.sigkill = sigkill + self.launcher = nativelauncher + self.restart_if_crash = restart_if_crash + + def prepare(self) -> None: + pass + + def start(self) -> None: + # In case we only tried a non blocking stop we need to stop it before restarting + if self.shutting_down: + self.stop() + + if self.proc is not None: + return + + cwd = os.path.join(BASEDIR, self.cwd) + cloudlog.info(f"starting process {self.name}") + self.proc = Process(name=self.name, target=self.launcher, args=(self.cmdline, cwd, self.name)) + self.proc.start() + self.shutting_down = False + + +def _normalize_bundle_modes(bundle: str) -> None: + import json + candidates = [] + if env_root := os.environ.get("IQPILOT_PROPRIETARY_ROOT"): + candidates += [os.path.join(env_root, bundle), env_root] + candidates += [ + os.path.join(BASEDIR, ".iqpilot", "bundles", bundle), + os.path.join(os.path.dirname(BASEDIR), ".iqpilot", "bundles", bundle), + os.path.join(BASEDIR, "artifacts", bundle), + ] + root = next((c for c in candidates if os.path.isfile(os.path.join(c, "manifest.json"))), None) + if root is None: + return + try: + with open(os.path.join(root, "manifest.json")) as f: + manifest = json.load(f) + for rel, meta in manifest.items(): + if not (isinstance(meta, dict) and "mode" in meta and "sha256" in meta): + continue + path = os.path.join(root, rel) + if os.path.isfile(path) and (os.stat(path).st_mode & 0o777) != meta["mode"]: + os.chmod(path, meta["mode"]) + except Exception: + cloudlog.exception(f"failed to normalize bundle modes for {bundle}") + + +class BundleProcess(NativeProcess): + def __init__(self, name, bundle, entry, should_run, enabled=True, sigkill=False, restart_if_crash=False): + self.bundle = bundle + self.entry = entry + self.restart_if_crash = restart_if_crash + runner_path = preferred_runner_path() + runner_cmd = str(runner_path) if runner_path.is_absolute() else "./iqpilot_bundle_runner" + runner_cwd = ".iqpilot/runtime_root" if runner_path.is_absolute() else "system/proprietary_runtime" + super().__init__( + name=name, + cwd=runner_cwd, + cmdline=[ + runner_cmd, + "--bundle", bundle, + "--mode", "python-module", + "--entry", entry, + "--daemon-name", name, + ], + should_run=should_run, + enabled=enabled, + sigkill=sigkill, + ) + + def start(self) -> None: + if self.proc is None: + _normalize_bundle_modes(self.bundle) + super().start() + + def stop(self, retry: bool = True, block: bool = True, sig: signal.Signals | None = None, timeout: float = 5) -> int | None: + return super().stop(retry=retry, block=block, sig=signal.SIGTERM if sig is None else sig, timeout=timeout) + + +class PythonProcess(ManagerProcess): + def __init__(self, name, module, should_run, enabled=True, sigkill=False, restart_if_crash=False): + self.name = name + self.module = module + self.should_run = should_run + self.enabled = enabled + self.sigkill = sigkill + self.launcher = launcher + self.restart_if_crash = restart_if_crash + + def prepare(self) -> None: + if self.enabled: + cloudlog.info(f"preimporting {self.module}") + importlib.import_module(self.module) + + def start(self) -> None: + # In case we only tried a non blocking stop we need to stop it before restarting + if self.shutting_down: + self.stop() + + if self.proc is not None: + return + + cloudlog.info(f"starting python {self.module}") + self.proc = Process(name=self.name, target=self.launcher, args=(self.module, self.name)) + self.proc.start() + self.shutting_down = False + + +class DaemonProcess(ManagerProcess): + """Python process that has to stay running across manager restart. + This is used for athena so you don't lose SSH access when restarting manager.""" + def __init__(self, name, module, param_name, enabled=True): + self.name = name + self.module = module + self.param_name = param_name + self.enabled = enabled + self.params = None + + @staticmethod + def should_run(started, params, CP): + return True + + def prepare(self) -> None: + pass + + def start(self) -> None: + if self.params is None: + self.params = Params() + + pid = self.params.get(self.param_name) + if pid is not None: + try: + os.kill(int(pid), 0) + with open(f'/proc/{pid}/cmdline') as f: + if self.module in f.read(): + # daemon is running + return + except (OSError, FileNotFoundError): + # process is dead + pass + + cloudlog.info(f"starting daemon {self.name}") + proc = subprocess.Popen(['python', '-m', self.module], + stdin=open('/dev/null'), + stdout=open('/dev/null', 'w'), + stderr=open('/dev/null', 'w'), + preexec_fn=os.setpgrp) + + self.params.put(self.param_name, proc.pid) + + def stop(self, retry=True, block=True, sig=None) -> None: + pass + + +def ensure_running(procs: ValuesView[ManagerProcess], started: bool, params=None, CP: car.CarParams=None, + not_run: list[str] | None=None) -> list[ManagerProcess]: + if not_run is None: + not_run = [] + + running = [] + now = time.monotonic() + for p in procs: + if p.enabled and p.name not in not_run and p.should_run(started, params, CP): + if p.restart_if_crash and p.proc is not None and p.proc.is_alive(): + p.last_alive_time = now + elif p.restart_if_crash and p.proc is not None: + # uptime, not time-since-restart: the latter also counts the backoff wait, + # which would reset the counter as soon as backoff exceeds CRASH_RESET_TIME + if p.last_alive_time - p.last_restart_time > CRASH_RESET_TIME: + p.crash_count = 0 + p.crash_loop_logged = False + + backoff = 0.0 if not p.crash_count else min(MAX_CRASH_BACKOFF, 2.0 ** (p.crash_count - 1)) + if now - p.last_restart_time >= backoff: + p.crash_count += 1 + p.last_restart_time = now + cloudlog.error(f'Restarting {p.name} (exitcode {p.proc.exitcode}) [crash {p.crash_count}]') + if p.crash_count >= CRASH_LOOP_THRESHOLD and not p.crash_loop_logged: + # never stop retrying: giving up on hardwared or ui is worse than restarting slowly + cloudlog.error(f'{p.name} is in a crash loop, backing off to {MAX_CRASH_BACKOFF}s between restarts') + p.crash_loop_logged = True + p.restart() + running.append(p) + else: + p.crash_count = 0 + p.crash_loop_logged = False + p.last_alive_time = 0.0 + p.stop(block=False) + + for p in running: + p.start() + + return running diff --git a/iqpilot/system/manager/process_config.py b/iqpilot/system/manager/process_config.py new file mode 100644 index 000000000..2b1de9aee --- /dev/null +++ b/iqpilot/system/manager/process_config.py @@ -0,0 +1,254 @@ +import os +import platform +from pathlib import Path + +from iqpilot.cereal import car, custom +from iqpilot.common.params import Params +from iqpilot.system.hardware import HARDWARE, PC, TICI +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.manager.process import PythonProcess, NativeProcess, BundleProcess + +from iqpilot.selfdrive.iqmodeld.egpu_helpers import egpu_selected, resolve_backend, usbgpu_present +from iqpilot.selfdrive.iqmodeld.models.helpers import get_active_model_runner +from iqpilot.konn3kt.service_health import hephaestus_ready + +def driverview(started: bool, params: Params, CP: car.CarParams) -> bool: + return started or params.get_bool("IsDriverViewEnabled") + +def driver_monitoring(started: bool, params: Params, CP: car.CarParams) -> bool: + if os.path.exists('/tmp/lite_hw'): + return False + return driverview(started, params, CP) + +def notcar(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and CP.notCar + +def iscar(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not CP.notCar + +def logging(started: bool, params: Params, CP: car.CarParams) -> bool: + run = (not CP.notCar) or not params.get_bool("DisableLogging") + return started and run and params.get_bool("DashcamEnabled") + +def ublox_available() -> bool: + if HARDWARE.get_device_type() == "tizi" or os.path.exists('/tmp/lite_hw'): + return False + + quectel_override = Path(Paths.persist_root()) / "comma" / "use-quectel-gps" + return os.path.exists('/dev/ttyHS0') and not quectel_override.exists() + +def ublox(started: bool, params: Params, CP: car.CarParams) -> bool: + use_ublox = ublox_available() + if use_ublox != params.get_bool("UbloxAvailable"): + params.put_bool("UbloxAvailable", use_ublox) + return started and use_ublox + +def joystick(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("JoystickDebugMode") + +def not_joystick(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not params.get_bool("JoystickDebugMode") + +def long_maneuver(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("LongitudinalManeuverMode") + +def not_long_maneuver(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not params.get_bool("LongitudinalManeuverMode") + +def lat_maneuver(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("LateralManeuverMode") + +def not_lat_maneuver(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not params.get_bool("LateralManeuverMode") + +def qcomgps(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and not ublox_available() + +def always_run(started: bool, params: Params, CP: car.CarParams) -> bool: + return True + +def only_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started + +def navd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("NavigationEnabled") + +def navrenderd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("NavigationEnabled") and params.get_bool("OnScreenNavigation") + +def navincidentd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("NavigationEnabled") and bool(params.get("WazePoliceApiKey")) and ( + params.get_int("WazePoliceAlertMode") > 0 or params.get_bool("WazePoliceShadow") + ) + +def iqmapd_needed(params: Params) -> bool: + return ( + params.get_bool("IQRoadNameOverlay") + or params.get_bool("ShowSpeedLimits") + or params.get_bool("SpeedLimitController") + or params.get_bool("EnableSpeedLimitControl") + or params.get_bool("EnableSpeedLimitPredicative") + or params.get_bool("MapCurveSpeedController") + or params.get_bool("VisionCurveSpeedController") + ) + +def iqmapd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("NavigationEnabled") and iqmapd_needed(params) + +def mapd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and iqmapd_needed(params) + +def constructiond_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return started and params.get_bool("ConstructionZoneAssist") + +def iqvd_onroad(started: bool, params: Params, CP: car.CarParams) -> bool: + # held for 1.0d: iqvd runs a detector per frame and the added load is not + # something 1.0c needs to carry. re-enable by restoring the param check. + return False + +def only_offroad(started: bool, params: Params, CP: car.CarParams) -> bool: + return not started + +def livestream(started: bool, params: Params, CP: car.CarParams) -> bool: + # Konn3kt Live View: hephaestusd sets IsLiveStreaming when a viewer connects, so the + # manager brings up the stream encoder (and camerad/webrtcd when offroad) and tears them + # down cleanly when the session ends — no subprocess management inside hephaestusd. + return params.get_bool("IsLiveStreaming") + +def canlive(started: bool, params: Params, CP: car.CarParams) -> bool: + # Remote live CAN debugging via konn3kt. hephaestusd sets CanLiveStreaming when a viewer + # connects (startCanLive) and clears it when the last one leaves (stopCanLive), so canlived + # runs only during an active debug session — no idle connection or battery cost otherwise. + return params.get_bool("CanLiveStreaming") + +def is_tinygrad_model(started, params, CP: car.CarParams) -> bool: + """Check if the active model runner is tinygrad.""" + return bool(get_active_model_runner(params, not started) == custom.IQModelManager.Runner.tinygrad) + +def _egpu_present(params) -> bool: + if params.get_bool("IQEgpuDisabled"): + return False + return usbgpu_present() + + +def emac_enabled(started, params, CP: car.CarParams) -> bool: + return resolve_backend(params.get_bool("IQEmacEnabled"), egpu_selected(params), _egpu_present(params)) == "emac" + +def egpu_enabled(started, params, CP: car.CarParams) -> bool: + return (resolve_backend(params.get_bool("IQEmacEnabled"), egpu_selected(params), _egpu_present(params)) == "egpu" + and _egpu_present(params)) + +def egpu_prefetch_enabled(started, params, CP: car.CarParams) -> bool: + if params.get_bool("IQEgpuDisabled"): + return False + return resolve_backend(params.get_bool("IQEmacEnabled"), True, _egpu_present(params)) == "egpu" + +def big_model_enabled(started, params, CP: car.CarParams) -> bool: + return params.get_bool("IQEmacEnabled") or egpu_selected(params) + +def hephaestus_ready_shim(started, params, CP: car.CarParams) -> bool: + return hephaestus_ready(params) + +def not_low_power(started: bool, params: Params, CP: car.CarParams) -> bool: + # FastSleep deep standby: heavy processes are shed offroad while DevicePowerState is low_power + return started or params.get("DevicePowerState") != "low_power" + +def iquploaderd_ready(started: bool, params: Params, CP: car.CarParams) -> bool: + if not params.get_bool("OnroadUploads"): + return only_offroad(started, params, CP) + + return always_run(started, params, CP) + +def or_(*fns): + return lambda *args: any(fn(*args) for fn in fns) + +def and_(*fns): + return lambda *args: all(fn(*args) for fn in fns) + +procs = [ + NativeProcess("loggerd", "iqpilot/system/loggerd", ["./loggerd"], logging), + NativeProcess("encoderd", "iqpilot/system/loggerd", ["./encoderd"], only_onroad), + NativeProcess("stream_encoderd", "iqpilot/system/loggerd", ["./encoderd", "--stream"], or_(notcar, livestream)), + PythonProcess("logmessaged", "iqpilot.system.logmessaged", always_run, restart_if_crash=True), + + NativeProcess("camerad", "iqpilot/system/camerad", ["./camerad"], or_(driverview, livestream), restart_if_crash=True), + PythonProcess("proclogd", "iqpilot.system.proclogd", only_onroad, enabled=platform.system() != "Darwin"), + PythonProcess("journald", "iqpilot.system.journald", only_onroad, platform.system() != "Darwin"), + PythonProcess("micd", "iqpilot.system.micd", or_(iscar, livestream)), + PythonProcess("timed", "iqpilot.system.timed", always_run, enabled=not PC), + + PythonProcess("dmonitoringmodeld", "iqpilot.selfdrive.dmonitoringmodeld.dmonitoringmodeld", driver_monitoring, enabled=not PC), + + PythonProcess("sensord", "iqpilot.system.sensord.sensord", only_onroad, enabled=not PC), + PythonProcess("ui", "iqpilot.selfdrive.ui.ui", not_low_power, restart_if_crash=True), + PythonProcess("soundd", "iqpilot.selfdrive.ui.soundd", driverview), + PythonProcess("locationd", "iqpilot.selfdrive.locationd.locationd", only_onroad), + NativeProcess("_pandad", "iqpilot/selfdrive/pandad", ["./pandad"], always_run, enabled=False), + PythonProcess("calibrationd", "iqpilot.selfdrive.locationd.calibrationd", only_onroad), + PythonProcess("controlsd", "iqpilot.selfdrive.controls.controlsd", and_(not_joystick, iscar)), + PythonProcess("joystickd", "iqpilot.tools.joystick.joystickd", or_(joystick, notcar)), + PythonProcess("selfdrived", "iqpilot.selfdrive.selfdrived.selfdrived", only_onroad), + PythonProcess("card", "iqpilot.selfdrive.car.card", only_onroad), + PythonProcess("deleter", "iqpilot.system.loggerd.deleter", always_run), + PythonProcess("dmonitoringd", "iqpilot.selfdrive.monitoring.dmonitoringd", driver_monitoring, enabled=not PC), + PythonProcess("qcomgpsd", "iqpilot.system.qcomgpsd.qcomgpsd", qcomgps, enabled=TICI), + PythonProcess("pandad", "iqpilot.selfdrive.pandad.pandad", always_run), + PythonProcess("estimatord", "iqpilot.selfdrive.locationd.estimatord", only_onroad), + PythonProcess("ubloxd", "iqpilot.system.ubloxd.ubloxd", ublox, enabled=TICI), + PythonProcess("pigeond", "iqpilot.system.ubloxd.pigeond", ublox, enabled=TICI), + PythonProcess("plannerd", "iqpilot.selfdrive.controls.plannerd", not_long_maneuver), + PythonProcess("maneuversd", "iqpilot.tools.maneuvers.longitudinal_maneuversd", long_maneuver), + PythonProcess("lateral_maneuversd", "iqpilot.tools.maneuvers.lateral_maneuversd", lat_maneuver), + PythonProcess("radard", "iqpilot.selfdrive.controls.radard", only_onroad), + PythonProcess("hardwared", "iqpilot.system.hardware.hardwared", always_run, restart_if_crash=True), + PythonProcess("tombstoned", "iqpilot.system.tombstoned", always_run, enabled=not PC), + PythonProcess("updated", "iqpilot.system.updated.updated", and_(only_offroad, not_low_power), enabled=not PC), + BundleProcess("iquploaderd", "iqpilot_hephaestusd_private", "iqpilot_private.konn3kt.uploaderd.iquploaderd", + and_(iquploaderd_ready, not_low_power), restart_if_crash=True), + PythonProcess("feedbackd", "iqpilot.selfdrive.ui.feedback.feedbackd", and_(only_onroad, not_lat_maneuver)), + + # debug procs + NativeProcess("bridge", "iqpilot/cereal/messaging", ["./bridge"], notcar), + PythonProcess("webrtcd", "iqpilot.system.webrtc.webrtcd", or_(iscar, livestream)), + PythonProcess("canlived", "iqpilot.konn3kt.canlive.canlived", canlive), +] + +# iqpilot +procs += [ + # Models + BundleProcess("models_manager", "iqpilot_model_selector_private", "iqpilot_private.models.manager", and_(only_offroad, not_low_power)), + NativeProcess("iqmodeld", "iqpilot/selfdrive/iqmodeld", ["./iqmodeld"], and_(only_onroad, is_tinygrad_model), restart_if_crash=True), + # big-model backends: iqmodeld self-demotes to the small channel worker when + # either backend is enabled; the selector publishes, and exactly one big + # worker (Mac or eGPU, eMac wins) feeds the BIG channel + PythonProcess("modeld_selector", "iqpilot.selfdrive.iqmodeld.modeld_selector", + and_(only_onroad, and_(is_tinygrad_model, big_model_enabled)), restart_if_crash=True), + BundleProcess("maciqmodeld", "iqpilot_emac_private", "iqpilot_private.emac.maciqmodeld", + and_(only_onroad, and_(is_tinygrad_model, emac_enabled)), restart_if_crash=True), + PythonProcess("iqegpumodeld", "iqpilot.selfdrive.iqmodeld.iqegpumodeld", + and_(only_onroad, and_(is_tinygrad_model, egpu_enabled)), restart_if_crash=True), + PythonProcess("egpu_prefetch", "iqpilot.selfdrive.iqmodeld.egpu_prefetch", + and_(only_offroad, and_(is_tinygrad_model, egpu_prefetch_enabled)), restart_if_crash=True), + + BundleProcess("backup_manager_k3", "iqpilot_hephaestusd_private", "iqpilot_private.konn3kt.backups.backup_orchestrator", + and_(only_offroad, hephaestus_ready_shim, not_low_power)), + BundleProcess("navd", "iqpilot_navd_private", "iqpilot_private.navd.navd", navd_onroad, restart_if_crash=True), + BundleProcess("navincidentd", "iqpilot_navd_private", "iqpilot_private.navd.navincidentd", navincidentd_onroad, restart_if_crash=True), + BundleProcess("navrenderd", "iqpilot_navd_private", "iqpilot_private.navd.navrenderd", navrenderd_onroad, restart_if_crash=True), + BundleProcess("iqmapd", "iqpilot_navd_private", "iqpilot_private.navd.iqmapd", iqmapd_onroad, restart_if_crash=True), + + # work-zone detector for Speed Limit Assist + PythonProcess("constructiond", "iqpilot.selfdrive.constructiond", constructiond_onroad, restart_if_crash=True), + + # iqvd: vision vehicle detector for UI ambient track dots + BundleProcess("iqvd", "iqpilot_iqvd_private", "iqpilot_private.iqvd.iqvd", iqvd_onroad, restart_if_crash=True), + + # mapd + NativeProcess("mapd", "iqpilot/third_party/mapd_pfeiferj", ["./mapd"], mapd_onroad, restart_if_crash=True), + PythonProcess("mapd_manager", "iqpilot.iq_maps.orchestrator", and_(only_offroad, not_low_power)), + + # locationd + NativeProcess("iqlocd", "iqpilot/selfdrive/iqlocd", ["./iqlocd"], only_onroad), +] + +managed_processes = {p.name: p for p in procs} diff --git a/iqpilot/system/manager/test/__init__.py b/iqpilot/system/manager/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/manager/test/test_manager.py b/iqpilot/system/manager/test/test_manager.py new file mode 100644 index 000000000..0c6a283b0 --- /dev/null +++ b/iqpilot/system/manager/test/test_manager.py @@ -0,0 +1,136 @@ +import os +import pytest +import signal +import time + +from iqpilot.cereal import car +from iqpilot.common.params import Params +import iqpilot.system.manager.manager as manager +from iqpilot.system.manager.process import BundleProcess, NativeProcess, ensure_running +from iqpilot.system.manager.process_config import managed_processes, procs +from iqpilot.system.hardware import HARDWARE + +os.environ['FAKEUPLOAD'] = "1" + +MAX_STARTUP_TIME = 3 +BLACKLIST_PROCS = ['manage_hephaestusd', 'pandad', 'pigeond'] + + +class TestManager: + def setup_method(self): + HARDWARE.set_power_save(False) + + # ensure clean CarParams + params = Params() + params.clear_all() + + def teardown_method(self): + manager.manager_cleanup() + + @pytest.mark.linux + def test_manager_prepare(self): + os.environ['PREPAREONLY'] = '1' + manager.main() + + def test_duplicate_procs(self): + assert len(procs) == len(managed_processes), "Duplicate process names" + + def test_models_manager_uses_private_bundle(self): + proc = managed_processes["models_manager"] + + assert isinstance(proc, BundleProcess) + assert proc.bundle == "iqpilot_model_selector_private" + assert proc.entry == "iqpilot_private.models.manager" + + def test_modeld_watchdog_restarts_stalled_process(self, mocker): + proc = mocker.Mock() + proc.proc.is_alive.return_value = True + + deadline = manager.update_modeld_watchdog(None, True, False, proc, 10.0) + assert deadline == 10.0 + manager.MODELD_WATCHDOG_TIMEOUT + assert manager.update_modeld_watchdog(deadline, True, False, proc, deadline - 0.1) == deadline + proc.restart.assert_not_called() + + next_deadline = manager.update_modeld_watchdog(deadline, True, False, proc, deadline) + proc.restart.assert_called_once_with() + assert next_deadline == deadline + manager.MODELD_WATCHDOG_TIMEOUT + + def test_modeld_watchdog_tracks_output_and_resets(self, mocker): + proc = mocker.Mock() + proc.proc.is_alive.return_value = True + + deadline = manager.update_modeld_watchdog(20.0, True, True, proc, 15.0) + assert deadline == 15.0 + manager.MODELD_WATCHDOG_TIMEOUT + assert manager.update_modeld_watchdog(deadline, False, False, proc, 16.0) is None + + proc.proc.is_alive.return_value = False + assert manager.update_modeld_watchdog(deadline, True, False, proc, 16.0) is None + proc.restart.assert_not_called() + + def test_bundle_process_stops_with_sigterm(self, mocker): + proc = BundleProcess("test", "bundle", "entry", lambda *_: True) + proc.proc = mocker.Mock(exitcode=None, pid=123) + proc.proc.is_alive.return_value = True + signal_mock = mocker.patch.object(proc, "signal") + + proc.stop(block=False) + + signal_mock.assert_called_once_with(signal.SIGTERM) + + def test_native_process_stop_timeout(self, mocker): + proc = NativeProcess("test", ".", ["true"], lambda *_: True) + native_process = mocker.Mock(exitcode=None, pid=123) + proc.proc = native_process + signal_mock = mocker.patch.object(proc, "signal") + join_mock = mocker.patch("iqpilot.system.manager.process.join_process", side_effect=lambda process, _: setattr(process, "exitcode", 0)) + + assert proc.stop(timeout=30) == 0 + signal_mock.assert_called_once_with(signal.SIGINT) + join_mock.assert_called_once_with(native_process, 30) + + def test_blacklisted_procs(self): + # TODO: ensure there are blacklisted procs until we have a dedicated test + assert len(BLACKLIST_PROCS), "No blacklisted procs to test not_run" + + @pytest.mark.linux + def test_set_params_with_default_value(self): + params = Params() + params.clear_all() + + os.environ['PREPAREONLY'] = '1' + manager.main() + for k in params.all_keys(): + default_value = params.get_default_value(k) + if default_value is not None: + assert params.get(k) == default_value + assert params.get("OpenpilotEnabledToggle") + assert params.get("RouteCount") == 0 + + @pytest.mark.tici + def test_clean_exit(self, subtests): + """ + Ensure all processes exit cleanly when stopped. + """ + HARDWARE.set_power_save(False) + manager.manager_init() + + CP = car.CarParams.new_message() + procs = ensure_running(managed_processes.values(), True, Params(), CP, not_run=BLACKLIST_PROCS) + + time.sleep(10) + + for p in procs: + with subtests.test(proc=p.name): + state = p.get_process_state_msg() + assert state.running, f"{p.name} not running" + exit_code = p.stop(retry=False) + + assert p.name not in BLACKLIST_PROCS, f"{p.name} was started" + + assert exit_code is not None, f"{p.name} failed to exit" + + # TODO: interrupted blocking read exits with 1 in cereal. use a more unique return code + exit_codes = [0, 1] + if p.sigkill: + exit_codes = [-signal.SIGKILL] + assert exit_code in exit_codes, f"{p.name} died with {exit_code}" diff --git a/iqpilot/system/micd.py b/iqpilot/system/micd.py new file mode 100755 index 000000000..5c8d05594 --- /dev/null +++ b/iqpilot/system/micd.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +import numpy as np +import os +import time +from functools import cache +import threading + +from iqpilot.cereal import messaging +from iqpilot.common.params import Params +from iqpilot.common.realtime import Ratekeeper +from iqpilot.common.utils import retry +from iqpilot.common.swaglog import cloudlog + +RATE = 10 +FFT_SAMPLES = 1600 # 100ms +REFERENCE_SPL = 2e-5 # newtons/m^2 +SAMPLE_RATE = 16000 +SAMPLE_BUFFER = 800 # 50ms + + +@cache +def get_a_weighting_filter(): + # Calculate the A-weighting filter + # https://en.wikipedia.org/wiki/A-weighting + freqs = np.fft.fftfreq(FFT_SAMPLES, d=1 / SAMPLE_RATE) + A = 12194 ** 2 * freqs ** 4 / ((freqs ** 2 + 20.6 ** 2) * (freqs ** 2 + 12194 ** 2) * np.sqrt((freqs ** 2 + 107.7 ** 2) * (freqs ** 2 + 737.9 ** 2))) + return A / np.max(A) + + +def calculate_spl(measurements): + # https://www.engineeringtoolbox.com/sound-pressure-d_711.html + sound_pressure = np.sqrt(np.mean(measurements ** 2)) # RMS of amplitudes + if sound_pressure > 0: + sound_pressure_level = 20 * np.log10(sound_pressure / REFERENCE_SPL) # dB + else: + sound_pressure_level = 0 + return sound_pressure, sound_pressure_level + + +def apply_a_weighting(measurements: np.ndarray) -> np.ndarray: + # Generate a Hanning window of the same length as the audio measurements + measurements_windowed = measurements * np.hanning(len(measurements)) + + # Apply the A-weighting filter to the signal + return np.abs(np.fft.ifft(np.fft.fft(measurements_windowed) * get_a_weighting_filter())) + + +class Mic: + def __init__(self): + self.rk = Ratekeeper(RATE) + self.pm = messaging.PubMaster(['soundPressure', 'rawAudioData']) + self.params = Params() + + self.measurements = np.empty(0) + + self.sound_pressure = 0 + self.sound_pressure_weighted = 0 + self.sound_pressure_level_weighted = 0 + + self.lock = threading.Lock() + self.callback_count = 0 + self.last_audio_rms = 0.0 + self.last_audio_peak = 0.0 + self.last_device = None + self.last_status = None + + def update(self): + with self.lock: + sound_pressure = self.sound_pressure + sound_pressure_weighted = self.sound_pressure_weighted + sound_pressure_level_weighted = self.sound_pressure_level_weighted + callback_count = self.callback_count + audio_rms = self.last_audio_rms + audio_peak = self.last_audio_peak + device_name = self.last_device + status = self.last_status + + msg = messaging.new_message('soundPressure', valid=True) + msg.soundPressure.soundPressure = float(sound_pressure) + msg.soundPressure.soundPressureWeighted = float(sound_pressure_weighted) + msg.soundPressure.soundPressureWeightedDb = float(sound_pressure_level_weighted) + + self.pm.send('soundPressure', msg) + if callback_count % RATE == 0: + cloudlog.info( + f"micd health: callbacks={callback_count} rms={audio_rms:.6f} peak={audio_peak:.6f} " + f"device={device_name} status={status!r} livestream={self.params.get_bool('IsLiveStreaming')}" + ) + self.rk.keep_time() + + def callback(self, indata, frames, time, status): + """ + Using amplitude measurements, calculate an uncalibrated sound pressure and sound pressure level. + Then apply A-weighting to the raw amplitudes and run the same calculations again. + + Logged A-weighted equivalents are rough approximations of the human-perceived loudness. + """ + msg = messaging.new_message('rawAudioData', valid=True) + audio_data_int_16 = (indata[:, 0] * 32767).astype(np.int16) + msg.rawAudioData.data = audio_data_int_16.tobytes() + msg.rawAudioData.sampleRate = SAMPLE_RATE + self.pm.send('rawAudioData', msg) + + with self.lock: + self.callback_count += 1 + self.last_audio_rms = float(np.sqrt(np.mean(np.square(indata[:, 0])))) + self.last_audio_peak = float(np.max(np.abs(indata[:, 0]))) + self.last_status = str(status) if status else None + self.measurements = np.concatenate((self.measurements, indata[:, 0])) + + while self.measurements.size >= FFT_SAMPLES: + measurements = self.measurements[:FFT_SAMPLES] + + self.sound_pressure, _ = calculate_spl(measurements) + measurements_weighted = apply_a_weighting(measurements) + self.sound_pressure_weighted, self.sound_pressure_level_weighted = calculate_spl(measurements_weighted) + + self.measurements = self.measurements[FFT_SAMPLES:] + + @retry(attempts=10, delay=3) + def get_stream(self, sd): + # reload sounddevice to reinitialize portaudio + sd._terminate() + sd._initialize() + requested_device = os.environ.get("MICD_DEVICE") + device = int(requested_device) if requested_device is not None else None + return sd.InputStream(channels=1, samplerate=SAMPLE_RATE, callback=self.callback, blocksize=SAMPLE_BUFFER, device=device) + + def micd_thread(self): + # sounddevice must be imported after forking processes + import sounddevice as sd + + device = sd.default.device + if os.environ.get("MICD_DEVICE") is not None: + device = int(os.environ["MICD_DEVICE"]) + sd.default.device = (device, device) + self.last_device = f"{device}: {sd.query_devices(device)['name']}" if isinstance(device, int) else str(device) + cloudlog.info(f"micd selecting input device {self.last_device}") + + while True: + try: + with self.get_stream(sd) as stream: + cloudlog.info(f"micd stream started: {stream.samplerate=} {stream.channels=} {stream.dtype=} {stream.device=}, {stream.blocksize=}") + while True: + self.update() + except Exception: + # Some A1s wedge the audio DSP (ALSA EINVAL / ADSP_EFAILED until reboot). Dying here + # crash-loops the process and selfdrived raises a takeover alert mid-drive over a + # microphone - stay alive and keep retrying instead; recovers if the DSP comes back. + cloudlog.exception("micd: audio stream unavailable, retrying") + time.sleep(10) + + +def main(): + mic = Mic() + mic.micd_thread() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/proclogd.py b/iqpilot/system/proclogd.py new file mode 100755 index 000000000..d0ff7ba79 --- /dev/null +++ b/iqpilot/system/proclogd.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python3 +import os +from typing import NoReturn, TypedDict + +from iqpilot.cereal import messaging +from iqpilot.common.realtime import Ratekeeper +from iqpilot.common.swaglog import cloudlog + +JIFFY = os.sysconf(os.sysconf_names['SC_CLK_TCK']) +PAGE_SIZE = os.sysconf(os.sysconf_names['SC_PAGE_SIZE']) + + +def _cpu_times() -> list[dict[str, float]]: + cpu_times: list[dict[str, float]] = [] + try: + with open('/proc/stat') as f: + lines = f.readlines()[1:] + for line in lines: + if not line.startswith('cpu') or len(line) < 4 or not line[3].isdigit(): + break + parts = line.split() + cpu_times.append({ + 'cpuNum': int(parts[0][3:]), + 'user': float(parts[1]) / JIFFY, + 'nice': float(parts[2]) / JIFFY, + 'system': float(parts[3]) / JIFFY, + 'idle': float(parts[4]) / JIFFY, + 'iowait': float(parts[5]) / JIFFY, + 'irq': float(parts[6]) / JIFFY, + 'softirq': float(parts[7]) / JIFFY, + }) + except Exception: + cloudlog.exception("failed to read /proc/stat") + return cpu_times + + +def _mem_info() -> dict[str, int]: + keys = ["MemTotal:", "MemFree:", "MemAvailable:", "Buffers:", "Cached:", "Active:", "Inactive:", "Shmem:"] + info: dict[str, int] = dict.fromkeys(keys, 0) + try: + with open('/proc/meminfo') as f: + for line in f: + parts = line.split() + if parts and parts[0] in info: + info[parts[0]] = int(parts[1]) * 1024 + except Exception: + cloudlog.exception("failed to read /proc/meminfo") + return info + + +_STAT_POS = { + 'pid': 1, + 'state': 3, + 'ppid': 4, + 'utime': 14, + 'stime': 15, + 'cutime': 16, + 'cstime': 17, + 'priority': 18, + 'nice': 19, + 'num_threads': 20, + 'starttime': 22, + 'vsize': 23, + 'rss': 24, + 'processor': 39, +} + +class ProcStat(TypedDict): + name: str + pid: int + state: str + ppid: int + utime: int + stime: int + cutime: int + cstime: int + priority: int + nice: int + num_threads: int + starttime: int + vms: int + rss: int + processor: int + + +def _parse_proc_stat(stat: str) -> ProcStat | None: + open_paren = stat.find('(') + close_paren = stat.rfind(')') + if open_paren == -1 or close_paren == -1 or open_paren > close_paren: + return None + name = stat[open_paren + 1:close_paren] + stat = stat[:open_paren] + stat[open_paren:close_paren].replace(' ', '_') + stat[close_paren:] + parts = stat.split() + if len(parts) < 52: + return None + try: + return { + 'name': name, + 'pid': int(parts[_STAT_POS['pid'] - 1]), + 'state': parts[_STAT_POS['state'] - 1][0], + 'ppid': int(parts[_STAT_POS['ppid'] - 1]), + 'utime': int(parts[_STAT_POS['utime'] - 1]), + 'stime': int(parts[_STAT_POS['stime'] - 1]), + 'cutime': int(parts[_STAT_POS['cutime'] - 1]), + 'cstime': int(parts[_STAT_POS['cstime'] - 1]), + 'priority': int(parts[_STAT_POS['priority'] - 1]), + 'nice': int(parts[_STAT_POS['nice'] - 1]), + 'num_threads': int(parts[_STAT_POS['num_threads'] - 1]), + 'starttime': int(parts[_STAT_POS['starttime'] - 1]), + 'vms': int(parts[_STAT_POS['vsize'] - 1]), + 'rss': int(parts[_STAT_POS['rss'] - 1]), + 'processor': int(parts[_STAT_POS['processor'] - 1]), + } + except Exception: + cloudlog.exception("failed to parse /proc//stat") + return None + +class ProcExtra(TypedDict): + pid: int + name: str + exe: str + cmdline: list[str] + + +_proc_cache: dict[int, ProcExtra] = {} + + +def _get_proc_extra(pid: int, name: str) -> ProcExtra: + cache: ProcExtra | None = _proc_cache.get(pid) + if cache is None or cache.get('name') != name: + exe = '' + cmdline: list[str] = [] + try: + exe = os.readlink(f'/proc/{pid}/exe') + except OSError: + pass + try: + with open(f'/proc/{pid}/cmdline', 'rb') as f: + cmdline = [c.decode('utf-8', errors='replace') for c in f.read().split(b'\0') if c] + except OSError: + pass + cache = {'pid': pid, 'name': name, 'exe': exe, 'cmdline': cmdline} + _proc_cache[pid] = cache + return cache + + +def _procs() -> list[ProcStat]: + stats: list[ProcStat] = [] + for pid_str in os.listdir('/proc'): + if not pid_str.isdigit(): + continue + try: + with open(f'/proc/{pid_str}/stat') as f: + stat = f.read() + parsed = _parse_proc_stat(stat) + if parsed is not None: + stats.append(parsed) + except OSError: + continue + return stats + + +def build_proc_log_message(msg) -> None: + pl = msg.procLog + + procs = _procs() + l = pl.init('procs', len(procs)) + for i, r in enumerate(procs): + proc = l[i] + proc.pid = r['pid'] + proc.state = ord(r['state'][0]) + proc.ppid = r['ppid'] + proc.cpuUser = r['utime'] / JIFFY + proc.cpuSystem = r['stime'] / JIFFY + proc.cpuChildrenUser = r['cutime'] / JIFFY + proc.cpuChildrenSystem = r['cstime'] / JIFFY + proc.priority = r['priority'] + proc.nice = r['nice'] + proc.numThreads = r['num_threads'] + proc.startTime = r['starttime'] / JIFFY + proc.memVms = r['vms'] + proc.memRss = r['rss'] * PAGE_SIZE + proc.processor = r['processor'] + proc.name = r['name'] + + extra = _get_proc_extra(r['pid'], r['name']) + proc.exe = extra['exe'] + cmdline = proc.init('cmdline', len(extra['cmdline'])) + for j, arg in enumerate(extra['cmdline']): + cmdline[j] = arg + + cpu_times = _cpu_times() + cpu_list = pl.init('cpuTimes', len(cpu_times)) + for i, ct in enumerate(cpu_times): + cpu = cpu_list[i] + cpu.cpuNum = ct['cpuNum'] + cpu.user = ct['user'] + cpu.nice = ct['nice'] + cpu.system = ct['system'] + cpu.idle = ct['idle'] + cpu.iowait = ct['iowait'] + cpu.irq = ct['irq'] + cpu.softirq = ct['softirq'] + + mem_info = _mem_info() + pl.mem.total = mem_info["MemTotal:"] + pl.mem.free = mem_info["MemFree:"] + pl.mem.available = mem_info["MemAvailable:"] + pl.mem.buffers = mem_info["Buffers:"] + pl.mem.cached = mem_info["Cached:"] + pl.mem.active = mem_info["Active:"] + pl.mem.inactive = mem_info["Inactive:"] + pl.mem.shared = mem_info["Shmem:"] + + +def main() -> NoReturn: + pm = messaging.PubMaster(['procLog']) + rk = Ratekeeper(0.5) + while True: + msg = messaging.new_message('procLog', valid=True) + build_proc_log_message(msg) + pm.send('procLog', msg) + rk.keep_time() + + +if __name__ == '__main__': + main() diff --git a/iqpilot/system/proprietary_runtime/__init__.py b/iqpilot/system/proprietary_runtime/__init__.py new file mode 100644 index 000000000..b0f19ddfd --- /dev/null +++ b/iqpilot/system/proprietary_runtime/__init__.py @@ -0,0 +1,16 @@ +import os + +from iqpilot.common.basedir import BASEDIR + + +os.environ.setdefault("OPENPILOT_BASEDIR", BASEDIR) +os.environ.setdefault("IQPILOT_PROPRIETARY_ROOT", os.path.join(BASEDIR, ".iqpilot", "bundles")) + +# _verified_import.so ships ONLY in the signed rootfs runtime. It MUST be prepended so a +# repo-side _verified_import.py can never shadow the signed native module via __path__ +# order. runtime_paths.py lives in the repo copy and still resolves from the fall-through. +_ROOTFS_PKG = "/usr/libexec/iqpilot/python/openpilot/system/proprietary_runtime" +if os.path.isdir(_ROOTFS_PKG): + if _ROOTFS_PKG in __path__: + __path__.remove(_ROOTFS_PKG) + __path__.insert(0, _ROOTFS_PKG) diff --git a/iqpilot/system/proprietary_runtime/install_verified_runtime.sh b/iqpilot/system/proprietary_runtime/install_verified_runtime.sh new file mode 100755 index 000000000..89e3ff2bf --- /dev/null +++ b/iqpilot/system/proprietary_runtime/install_verified_runtime.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" +RUNTIME_ROOT="${IQPILOT_VERIFIED_RUNTIME_ROOT:-/usr/libexec/iqpilot}" +PYTHON_ROOT="${RUNTIME_ROOT}/python" +TARGET_EXT_DIR="${PYTHON_ROOT}/openpilot/system/proprietary_runtime" +MANIFEST_SRC="${ROOT}/iqpilot/system/proprietary_runtime/rootfs_integrity.json" +MANIFEST_SIG_SRC="${ROOT}/iqpilot/system/proprietary_runtime/rootfs_integrity.json.sig" + +RUNNER_SRC="${ROOT}/iqpilot/system/proprietary_runtime/iqpilot_bundle_runner" +EXT_SRC="${ROOT}/iqpilot/system/proprietary_runtime/_verified_import.so" +STUB_ROOT="${ROOT}/iqpilot/system/proprietary_runtime/rootfs_python" + +if [ ! -x "${RUNNER_SRC}" ]; then + echo "missing runner: ${RUNNER_SRC}" + exit 1 +fi + +if [ ! -f "${EXT_SRC}" ]; then + # No locally-built _verified_import.so staged in the tree. This is the NORMAL prebuilt/release case: + # the .so is gitignored and ships baked into the OS image at /usr/libexec/iqpilot, so there is + # nothing to install from /data. Quietly no-op and let the OS-baked verified runtime be used. + exit 0 +fi + +if [ ! -f "${MANIFEST_SRC}" ] || [ ! -f "${MANIFEST_SIG_SRC}" ]; then + if [ -n "${IQPILOT_SIGNING_KEY:-}" ]; then + "${ROOT}/.venv/bin/python" \ + "${ROOT}/scripts/iqpilot/build_proprietary_runtime_manifest.py" \ + --repo-root "${ROOT}" \ + --output "${MANIFEST_SRC}" + fi +fi + +if [ ! -f "${MANIFEST_SRC}" ] || [ ! -f "${MANIFEST_SIG_SRC}" ]; then + echo "missing rootfs runtime integrity manifest or signature" + exit 1 +fi + +sudo mount -o remount,rw / +trap 'sudo mount -o remount,ro /' EXIT + +sudo mkdir -p "${RUNTIME_ROOT}" "${TARGET_EXT_DIR}" +sudo install -m 0755 "${RUNNER_SRC}" "${RUNTIME_ROOT}/iqpilot_bundle_runner" +sudo install -m 0755 "${EXT_SRC}" "${TARGET_EXT_DIR}/_verified_import.so" +sudo install -m 0644 "${MANIFEST_SRC}" "${RUNTIME_ROOT}/runtime_integrity.json" +sudo install -m 0644 "${MANIFEST_SIG_SRC}" "${RUNTIME_ROOT}/runtime_integrity.json.sig" +sudo install -m 0644 "${STUB_ROOT}/openpilot/__init__.py" "${PYTHON_ROOT}/openpilot/__init__.py" +sudo mkdir -p "${PYTHON_ROOT}/openpilot/system" +sudo install -m 0644 "${STUB_ROOT}/openpilot/system/__init__.py" "${PYTHON_ROOT}/openpilot/system/__init__.py" +sudo install -m 0644 "${STUB_ROOT}/openpilot/system/proprietary_runtime/__init__.py" "${TARGET_EXT_DIR}/__init__.py" + +echo "installed verified runtime to ${RUNTIME_ROOT}" diff --git a/iqpilot/system/proprietary_runtime/iqpilot_bundle_runner b/iqpilot/system/proprietary_runtime/iqpilot_bundle_runner new file mode 100755 index 000000000..602b4d598 Binary files /dev/null and b/iqpilot/system/proprietary_runtime/iqpilot_bundle_runner differ diff --git a/iqpilot/system/proprietary_runtime/rootfs_integrity.json b/iqpilot/system/proprietary_runtime/rootfs_integrity.json new file mode 100644 index 000000000..3b703f883 --- /dev/null +++ b/iqpilot/system/proprietary_runtime/rootfs_integrity.json @@ -0,0 +1,53 @@ +{ + "entries": [ + { + "mode": 493, + "path": "iqpilot_bundle_runner", + "relative_to": "runtime_root", + "sha256": "13af5da8a783b2f2e20464187e468a2acb58fbbf03340ced6f9b8a69874fe7ed", + "size": 134160 + }, + { + "mode": 420, + "path": "python/openpilot/__init__.py", + "relative_to": "runtime_root", + "sha256": "acff7d771dbec2a17c97ea2de7c0a86f12f1119616932ddb09e7c670bf2eed25", + "size": 580 + }, + { + "mode": 420, + "path": "python/openpilot/system/__init__.py", + "relative_to": "runtime_root", + "sha256": "399977f784cfb3a5e1c1d2f4e75619214c37ec2b4127802f0b739ab8e768ce82", + "size": 602 + }, + { + "mode": 420, + "path": "python/openpilot/system/proprietary_runtime/__init__.py", + "relative_to": "runtime_root", + "sha256": "3243b0edf306e17fe860e0c2a64fc2354be0d72ad12b613eea1dfeb426bb522b", + "size": 742 + }, + { + "mode": 493, + "path": "python/openpilot/system/proprietary_runtime/_verified_import.so", + "relative_to": "runtime_root", + "sha256": "cd8cf31c11742d4f2079b398a9dec9e6df60f5a79dfe42c1d6888614bd8e500b", + "size": 200416 + }, + { + "mode": 420, + "path": "/usr/lib/systemd/system/hephaestusd.service", + "relative_to": "absolute", + "sha256": "3b70e8873c7eb813e70798300b76c153dddda9947c1301cbba7e103962461fa2", + "size": 1627 + }, + { + "mode": 420, + "path": "/usr/lib/systemd/system/ble-transportd.service", + "relative_to": "absolute", + "sha256": "6b5bf61ebfebffe3d125bb766c13c391b83e8feda04b89f47de2725c6fe186e3", + "size": 1907 + } + ] +} diff --git a/iqpilot/system/proprietary_runtime/rootfs_integrity.json.sig b/iqpilot/system/proprietary_runtime/rootfs_integrity.json.sig new file mode 100644 index 000000000..319c33e40 --- /dev/null +++ b/iqpilot/system/proprietary_runtime/rootfs_integrity.json.sig @@ -0,0 +1 @@ +exS3jBbVETgFQtzbRGWymtflNgeWLbjHvcMVsKs5NrwpmMdx9sWpcZ2FO/pB6RQaCniXGDwT7GhjvGxpfrP5Cg== diff --git a/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/__init__.py b/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/__init__.py new file mode 100644 index 000000000..1d017da5f --- /dev/null +++ b/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/__init__.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +import os +from pathlib import Path + + +def _resolve_source_pkg() -> Path: + raw_root = os.environ.get("IQPILOT_SOURCE_ROOT") or os.environ.get("OPENPILOT_SOURCE_ROOT") or "/data/openpilot/iqpilot" + source_root = Path(raw_root) + if source_root.name == "openpilot": + return source_root + return source_root / "openpilot" + + +def _extend_package_path() -> None: + source_pkg = _resolve_source_pkg() + if source_pkg.is_dir(): + pkg_path = str(source_pkg) + if pkg_path not in __path__: + __path__.append(pkg_path) + + +_extend_package_path() diff --git a/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/system/__init__.py b/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/system/__init__.py new file mode 100644 index 000000000..43bf64887 --- /dev/null +++ b/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/system/__init__.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +import os +from pathlib import Path + + +def _resolve_source_pkg() -> Path: + raw_root = os.environ.get("IQPILOT_SOURCE_ROOT") or os.environ.get("OPENPILOT_SOURCE_ROOT") or "/data/openpilot/iqpilot" + source_root = Path(raw_root) + if source_root.name == "openpilot": + return source_root / "system" + return source_root / "openpilot" / "system" + + +def _extend_package_path() -> None: + source_pkg = _resolve_source_pkg() + if source_pkg.is_dir(): + pkg_path = str(source_pkg) + if pkg_path not in __path__: + __path__.append(pkg_path) + + +_extend_package_path() diff --git a/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/system/proprietary_runtime/__init__.py b/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/system/proprietary_runtime/__init__.py new file mode 100644 index 000000000..c7efed683 --- /dev/null +++ b/iqpilot/system/proprietary_runtime/rootfs_python/openpilot/system/proprietary_runtime/__init__.py @@ -0,0 +1,27 @@ +from __future__ import annotations + +import os +from pathlib import Path + +from ._verified_import import import_verified_module + + +def _resolve_source_pkg() -> Path: + raw_root = os.environ.get("IQPILOT_SOURCE_ROOT") or os.environ.get("OPENPILOT_SOURCE_ROOT") or "/data/openpilot/iqpilot" + source_root = Path(raw_root) + if source_root.name == "openpilot": + return source_root / "system" / "proprietary_runtime" + return source_root / "openpilot" / "system" / "proprietary_runtime" + + +def _extend_package_path() -> None: + source_pkg = _resolve_source_pkg() + if source_pkg.is_dir(): + pkg_path = str(source_pkg) + if pkg_path not in __path__: + __path__.append(pkg_path) + + +_extend_package_path() + +__all__ = ["import_verified_module"] diff --git a/iqpilot/system/proprietary_runtime/runtime_paths.py b/iqpilot/system/proprietary_runtime/runtime_paths.py new file mode 100644 index 000000000..a5d38d708 --- /dev/null +++ b/iqpilot/system/proprietary_runtime/runtime_paths.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import os +from pathlib import Path + + +VERIFIED_RUNTIME_ROOT = Path("/usr/libexec/iqpilot") +VERIFIED_RUNNER_PATH = VERIFIED_RUNTIME_ROOT / "iqpilot_bundle_runner" +VERIFIED_PYTHON_ROOT = VERIFIED_RUNTIME_ROOT / "python" +FALLBACK_RUNNER_PATH = Path("/data/openpilot/iqpilot/system/proprietary_runtime/iqpilot_bundle_runner") +DEFAULT_SOURCE_ROOT = Path("/data/openpilot/iqpilot") + + +def verified_runtime_present() -> bool: + return VERIFIED_RUNNER_PATH.is_file() and os.access(VERIFIED_RUNNER_PATH, os.X_OK) + + +def preferred_runner_path() -> Path: + if verified_runtime_present(): + return VERIFIED_RUNNER_PATH + if os.getenv("IQPILOT_ALLOW_DEV_FALLBACKS") == "1" and FALLBACK_RUNNER_PATH.is_file(): + return FALLBACK_RUNNER_PATH + return VERIFIED_RUNNER_PATH + + +def preferred_pythonpath(existing: str = "") -> str: + parts: list[str] = [] + if VERIFIED_PYTHON_ROOT.is_dir(): + parts.append(str(VERIFIED_PYTHON_ROOT)) + if existing: + parts.append(existing) + return ":".join(parts) diff --git a/iqpilot/system/proprietary_runtime/test_proprietary_runtime.py b/iqpilot/system/proprietary_runtime/test_proprietary_runtime.py new file mode 100644 index 000000000..fae43f629 --- /dev/null +++ b/iqpilot/system/proprietary_runtime/test_proprietary_runtime.py @@ -0,0 +1,35 @@ +import os +import subprocess +import sys + +from iqpilot.common.basedir import BASEDIR + + +def _runtime_paths(env): + result = subprocess.run( + [ + sys.executable, + "-c", + "import os; import iqpilot.system.proprietary_runtime; print(os.environ['OPENPILOT_BASEDIR']); " + + "print(os.environ['IQPILOT_PROPRIETARY_ROOT'])", + ], + env=env, + check=True, + capture_output=True, + text=True, + ) + return result.stdout.splitlines() + + +def test_basedir_contract(): + env = os.environ.copy() + env.pop("OPENPILOT_BASEDIR", None) + env.pop("IQPILOT_PROPRIETARY_ROOT", None) + assert _runtime_paths(env) == [BASEDIR, os.path.join(BASEDIR, ".iqpilot", "bundles")] + + +def test_explicit_basedir_is_preserved(tmp_path): + env = os.environ.copy() + env["OPENPILOT_BASEDIR"] = str(tmp_path) + env["IQPILOT_PROPRIETARY_ROOT"] = str(tmp_path / "bundles") + assert _runtime_paths(env) == [str(tmp_path), str(tmp_path / "bundles")] diff --git a/iqpilot/system/qcomgpsd/modemdiag.py b/iqpilot/system/qcomgpsd/modemdiag.py new file mode 100644 index 000000000..5d72aeba9 --- /dev/null +++ b/iqpilot/system/qcomgpsd/modemdiag.py @@ -0,0 +1,94 @@ +import select +from serial import Serial +from crcmod import mkCrcFun +from struct import pack, unpack_from, calcsize + +class ModemDiag: + def __init__(self): + self.serial = self.open_serial() + self.pend = b'' + + def open_serial(self): + serial = Serial("/dev/ttyUSB0", baudrate=115200, rtscts=True, dsrdtr=True, timeout=0, exclusive=True) + serial.flush() + serial.reset_input_buffer() + serial.reset_output_buffer() + return serial + + ccitt_crc16 = mkCrcFun(0x11021, initCrc=0, xorOut=0xffff) + ESCAPE_CHAR = b'\x7d' + TRAILER_CHAR = b'\x7e' + + def hdlc_encapsulate(self, payload): + payload += pack('= 3 + assert payload[-1:] == self.TRAILER_CHAR + payload = payload[:-1] + payload = payload.replace(bytes([self.ESCAPE_CHAR[0], self.TRAILER_CHAR[0] ^ 0x20]), self.TRAILER_CHAR) + payload = payload.replace(bytes([self.ESCAPE_CHAR[0], self.ESCAPE_CHAR[0] ^ 0x20]), self.ESCAPE_CHAR) + assert payload[-2:] == pack(' str | None: + return subprocess.check_output(f"mmcli -m any --timeout 30 --command='{cmd}'", shell=True, encoding='utf8') + +def gps_enabled() -> bool: + return "QGPS: 1" in at_cmd("AT+QGPS?") + +def download_assistance(): + try: + response = requests.get(ASSISTANCE_URL, timeout=5, stream=True) + + with open(ASSIST_DATA_FILE_DOWNLOAD, 'wb') as fp: + for chunk in response.iter_content(chunk_size=8192): + fp.write(chunk) + if fp.tell() > 1e5: + cloudlog.error("Qcom assistance data larger than expected") + return + + os.rename(ASSIST_DATA_FILE_DOWNLOAD, ASSIST_DATA_FILE) + + except requests.exceptions.RequestException: + cloudlog.exception("Failed to download assistance file") + return + +def downloader_loop(event): + if os.path.exists(ASSIST_DATA_FILE): + os.remove(ASSIST_DATA_FILE) + + alt_path = os.getenv("QCOM_ALT_ASSISTANCE_PATH", None) + if alt_path is not None and os.path.exists(alt_path): + shutil.copyfile(alt_path, ASSIST_DATA_FILE) + + try: + while not os.path.exists(ASSIST_DATA_FILE) and not event.is_set(): + download_assistance() + event.wait(timeout=10) + except KeyboardInterrupt: + pass + +@retry(attempts=5, delay=0.2, ignore_failure=True) +def inject_assistance(): + cmd = f"mmcli -m any --timeout 30 --location-inject-assistance-data={ASSIST_DATA_FILE}" + subprocess.check_output(cmd, stderr=subprocess.PIPE, shell=True) + cloudlog.info("successfully loaded assistance data") + +@retry(attempts=5, delay=1.0) +def setup_quectel(diag: ModemDiag) -> bool: + ret = False + + # enable OEMDRE in the NV + # TODO: it has to reboot for this to take effect + DIAG_NV_READ_F = 38 + DIAG_NV_WRITE_F = 39 + NV_GNSS_OEM_FEATURE_MASK = 7165 + send_recv(diag, DIAG_NV_WRITE_F, pack(' None: + if diag is None: + return + try: + diag.serial.close() + except Exception: + cloudlog.exception("failed to close modem diag serial") + + +def ensure_quectel_setup(diag: ModemDiag | None, reason: str) -> tuple[ModemDiag, bool]: + while True: + try: + close_diag(diag) + wait_for_modem() + diag = ModemDiag() + assisted = setup_quectel(diag) + cloudlog.warning(f"quectel setup done ({reason})") + return diag, assisted + except Exception: + cloudlog.exception(f"quectel setup failed during {reason}, retrying") + close_diag(diag) + time.sleep(1.0) + + +def wait_for_modem(cmd="AT+QGPS?"): + cloudlog.warning("waiting for modem to come up") + while True: + ret = subprocess.call(f"mmcli -m any --timeout 10 --command=\"{cmd}\"", stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, shell=True) + if ret == 0: + return + time.sleep(0.1) + + +def main() -> NoReturn: + unpack_gps_meas, size_gps_meas = dict_unpacker(gps_measurement_report, True) + unpack_gps_meas_sv, size_gps_meas_sv = dict_unpacker(gps_measurement_report_sv, True) + + unpack_glonass_meas, size_glonass_meas = dict_unpacker(glonass_measurement_report, True) + unpack_glonass_meas_sv, size_glonass_meas_sv = dict_unpacker(glonass_measurement_report_sv, True) + + unpack_oemdre_meas, size_oemdre_meas = dict_unpacker(oemdre_measurement_report, True) + unpack_oemdre_meas_sv, size_oemdre_meas_sv = dict_unpacker(oemdre_measurement_report_sv, True) + + unpack_svpoly, _ = dict_unpacker(oemdre_svpoly_report, True) + unpack_position, _ = dict_unpacker(position_report) + + unpack_position, _ = dict_unpacker(position_report) + + wait_for_modem() + + stop_download_event = Event() + assist_fetch_proc = Process(target=downloader_loop, args=(stop_download_event,)) + assist_fetch_proc.start() + def cleanup(sig, frame): + cloudlog.warning("caught sig disabling quectel gps") + + gpio_set(GPIO.GNSS_PWR_EN, False) + try: + teardown_quectel(diag) + cloudlog.warning("quectel cleanup done") + except NameError: + cloudlog.warning('quectel not yet setup') + except Exception: + cloudlog.exception("quectel cleanup failed") + finally: + try: + close_diag(diag) + except NameError: + pass + + stop_download_event.set() + assist_fetch_proc.kill() + assist_fetch_proc.join() + + sys.exit(0) + signal.signal(signal.SIGINT, cleanup) + signal.signal(signal.SIGTERM, cleanup) + + # connect to modem + diag = None + diag, r = ensure_quectel_setup(diag, "startup") + want_assistance = not r + gpio_init(GPIO.GNSS_PWR_EN, True) + gpio_set(GPIO.GNSS_PWR_EN, True) + + pm = messaging.PubMaster(['qcomGnss', 'gpsLocation']) + + while 1: + if os.path.exists(ASSIST_DATA_FILE) and want_assistance: + diag, r = ensure_quectel_setup(diag, "assistance_reload") + want_assistance = not r + + try: + opcode, payload = diag.recv() + except Exception: + cloudlog.exception("modem diag receive failed, resetting qcomgpsd session") + diag, r = ensure_quectel_setup(diag, "diag_receive_recovery") + want_assistance = want_assistance and not r + continue + if opcode != DIAG_LOG_F: + cloudlog.error(f"Unhandled opcode: {opcode}") + continue + + (pending_msgs, log_outer_length), inner_log_packet = unpack_from(' 0: + cloudlog.debug(f"have {pending_msgs} pending messages") + assert log_outer_length == len(inner_log_packet) + + (log_inner_length, log_type, log_time), log_payload = unpack_from(' 6*SECS_IN_DAY: + epoch.week += 1 + elif epoch.tow > 6*SECS_IN_DAY and current_gps_time.tow < SECS_IN_DAY: + epoch.week -= 1 + + poly.gpsWeek = epoch.week + poly.gpsTow = epoch.tow + ''' + pm.send('qcomGnss', msg) + + elif log_type in [LOG_GNSS_GPS_MEASUREMENT_REPORT, LOG_GNSS_GLONASS_MEASUREMENT_REPORT]: + msg = messaging.new_message('qcomGnss', valid=True) + + gnss = msg.qcomGnss + gnss.logTs = log_time + gnss.init('measurementReport') + report = gnss.measurementReport + + if log_type == LOG_GNSS_GPS_MEASUREMENT_REPORT: + dat = unpack_gps_meas(log_payload) + sats = log_payload[size_gps_meas:] + unpack_meas_sv, size_meas_sv = unpack_gps_meas_sv, size_gps_meas_sv + report.source = 0 # gps + measurement_status_fields = (measurementStatusFields.items(), measurementStatusGPSFields.items()) + elif log_type == LOG_GNSS_GLONASS_MEASUREMENT_REPORT: + dat = unpack_glonass_meas(log_payload) + sats = log_payload[size_glonass_meas:] + unpack_meas_sv, size_meas_sv = unpack_glonass_meas_sv, size_glonass_meas_sv + report.source = 1 # glonass + measurement_status_fields = (measurementStatusFields.items(), measurementStatusGlonassFields.items()) + else: + raise RuntimeError(f"invalid log_type: {log_type}") + + for k,v in dat.items(): + if k == "version": + assert v == 0 + elif k == "week": + report.gpsWeek = v + elif k == "svCount": + pass + else: + setattr(report, k, v) + report.init('sv', dat['svCount']) + if dat['svCount'] > 0: + assert len(sats)//dat['svCount'] == size_meas_sv + for i in range(dat['svCount']): + sv = report.sv[i] + sv.init('measurementStatus') + sat = unpack_meas_sv(sats[size_meas_sv*i:size_meas_sv*(i+1)]) + for k,v in sat.items(): + if k == "parityErrorCount": + sv.gpsParityErrorCount = v + elif k == "frequencyIndex": + sv.glonassFrequencyIndex = v + elif k == "hemmingErrorCount": + sv.glonassHemmingErrorCount = v + elif k == "measurementStatus": + for kk,vv in itertools.chain(*measurement_status_fields): + setattr(sv.measurementStatus, kk, bool(v & (1< Accelerometer BIT[1] 0x00000002 <96> Gyro 0x0000FFFC - Reserved A bit set to 1 indicates that certain fields as defined by the SENSOR_AIDING_MASK were aided with sensor data*/ + uint32 q_SensorAidMask; /* Denotes which component of the position report was assisted with additional sensors defined in SENSOR_DATA_USAGE_MASK BIT[0] 0x00000001 <96> Heading aided with sensor data BIT[1] 0x00000002 <96> Speed aided with sensor data BIT[2] 0x00000004 <96> Position aided with sensor data BIT[3] 0x00000008 <96> Velocity aided with sensor data 0xFFFFFFF0 <96> Reserved */ + uint8 u_NumGpsSvsUsed; /* The number of GPS SVs used in the fix */ + uint8 u_TotalGpsSvs; /* Total number of GPS SVs detected by searcher, including ones not used in position calculation */ + uint8 u_NumGloSvsUsed; /* The number of Glonass SVs used in the fix */ + uint8 u_TotalGloSvs; /* Total number of Glonass SVs detected by searcher, including ones not used in position calculation */ + uint8 u_NumBdsSvsUsed; /* The number of BeiDou SVs used in the fix */ + uint8 u_TotalBdsSvs; /* Total number of BeiDou SVs detected by searcher, including ones not used in position calculation */ +""" # noqa: E501 + +def name_to_camelcase(nam): + ret = [] + i = 0 + while i < len(nam): + if nam[i] == "_": + ret.append(nam[i+1].upper()) + i += 2 + else: + ret.append(nam[i]) + i += 1 + return ''.join(ret) + +def parse_struct(ss): + st = "<" + nams = [] + for l in ss.strip().split("\n"): + if len(l.strip()) == 0: + continue + typ, nam = l.split(";")[0].split() + #print(typ, nam) + if typ == "float" or '_Flt' in nam: + st += "f" + elif typ == "double" or '_Dbl' in nam: + st += "d" + elif typ in ["uint8", "uint8_t"]: + st += "B" + elif typ in ["int8", "int8_t"]: + st += "b" + elif typ in ["uint32", "uint32_t"]: + st += "I" + elif typ in ["int32", "int32_t"]: + st += "i" + elif typ in ["uint16", "uint16_t"]: + st += "H" + elif typ in ["int16", "int16_t"]: + st += "h" + elif typ in ["uint64", "uint64_t"]: + st += "Q" + else: + raise RuntimeError(f"unknown type {typ}") + if '[' in nam: + cnt = int(nam.split("[")[1].split("]")[0]) + st += st[-1]*(cnt-1) + for i in range(cnt): + nams.append(f'{nam.split("[")[0]}[{i}]') + else: + nams.append(nam) + return st, nams + +def dict_unpacker(ss, camelcase = False): + st, nams = parse_struct(ss) + if camelcase: + nams = [name_to_camelcase(x) for x in nams] + sz = calcsize(st) + return lambda x: dict(zip(nams, unpack_from(st, x), strict=True)), sz + +def relist(dat): + list_keys = set() + for key in dat.keys(): + if '[' in key: + list_keys.add(key.split('[')[0]) + list_dict = {} + for list_key in list_keys: + list_dict[list_key] = [] + i = 0 + while True: + key = list_key + f'[{i}]' + if key not in dat: + break + list_dict[list_key].append(dat[key]) + del dat[key] + i += 1 + return {**dat, **list_dict} diff --git a/iqpilot/system/qcomgpsd/tests/test_qcomgpsd.py b/iqpilot/system/qcomgpsd/tests/test_qcomgpsd.py new file mode 100644 index 000000000..8a8ba98a4 --- /dev/null +++ b/iqpilot/system/qcomgpsd/tests/test_qcomgpsd.py @@ -0,0 +1,119 @@ +import os +import pytest +import json +import time +import datetime +import subprocess + +import iqpilot.cereal.messaging as messaging +from iqpilot.system.qcomgpsd.qcomgpsd import at_cmd, wait_for_modem +from iqpilot.system.manager.process_config import managed_processes + +GOOD_SIGNAL = bool(int(os.getenv("GOOD_SIGNAL", '0'))) + + +@pytest.mark.tici +class TestRawgpsd: + @classmethod + def setup_class(cls): + os.environ['GPS_COLD_START'] = '1' + os.system("sudo systemctl start systemd-resolved") + os.system("sudo systemctl restart ModemManager lte") + wait_for_modem() + + @classmethod + def teardown_class(cls): + managed_processes['qcomgpsd'].stop() + os.system("sudo systemctl restart systemd-resolved") + os.system("sudo systemctl restart ModemManager lte") + + def setup_method(self): + self.sm = messaging.SubMaster(['qcomGnss', 'gpsLocation', 'gnssMeasurements']) + + def teardown_method(self): + managed_processes['qcomgpsd'].stop() + os.system("sudo systemctl restart systemd-resolved") + + def _wait_for_output(self, t): + dt = 0.1 + for _ in range(t*int(1/dt)): + self.sm.update(0) + if self.sm.updated['qcomGnss']: + break + time.sleep(dt) + return self.sm.updated['qcomGnss'] + + def test_no_crash_double_command(self): + at_cmd("AT+QGPSDEL=0") + at_cmd("AT+QGPSDEL=0") + + def test_wait_for_modem(self): + os.system("sudo systemctl stop ModemManager") + managed_processes['qcomgpsd'].start() + assert not self._wait_for_output(5) + + os.system("sudo systemctl restart ModemManager") + assert self._wait_for_output(30) + + def test_startup_time(self, subtests): + for internet in (True, False): + if not internet: + os.system("sudo systemctl stop systemd-resolved") + with subtests.test(internet=internet): + managed_processes['qcomgpsd'].start() + assert self._wait_for_output(7) + managed_processes['qcomgpsd'].stop() + + def test_turns_off_gnss(self, subtests): + for s in (0.1, 1, 5): + with subtests.test(runtime=s): + managed_processes['qcomgpsd'].start() + time.sleep(s) + managed_processes['qcomgpsd'].stop() + + ls = subprocess.check_output("mmcli -m any --location-status --output-json", shell=True, encoding='utf-8') + loc_status = json.loads(ls) + assert set(loc_status['modem']['location']['enabled']) <= {'3gpp-lac-ci'} + + + def check_assistance(self, should_be_loaded): + # after QGPSDEL: '+QGPSXTRADATA: 0,"1980/01/05,19:00:00"' + # after loading: '+QGPSXTRADATA: 10080,"2023/06/24,19:00:00"' + out = at_cmd("AT+QGPSXTRADATA?") + out = out.split("+QGPSXTRADATA:")[1].split("'")[0].strip() + valid_duration, injected_time_str = out.split(",", 1) + if should_be_loaded: + assert valid_duration == "10080" # should be max time + injected_time = datetime.datetime.strptime(injected_time_str.replace("\"", ""), "%Y/%m/%d,%H:%M:%S") + assert abs((datetime.datetime.now(datetime.UTC).replace(tzinfo=None) - injected_time).total_seconds()) < 60*60*12 + else: + valid_duration, injected_time_str = out.split(",", 1) + injected_time_str = injected_time_str.replace('\"', '').replace('\'', '') + assert injected_time_str[:] == '1980/01/05,19:00:00'[:] + assert valid_duration == '0' + + def test_assistance_loading(self): + managed_processes['qcomgpsd'].start() + assert self._wait_for_output(10) + managed_processes['qcomgpsd'].stop() + self.check_assistance(True) + + def test_no_assistance_loading(self): + os.system("sudo systemctl stop systemd-resolved") + + managed_processes['qcomgpsd'].start() + assert self._wait_for_output(10) + managed_processes['qcomgpsd'].stop() + self.check_assistance(False) + + def test_late_assistance_loading(self): + os.system("sudo systemctl stop systemd-resolved") + + managed_processes['qcomgpsd'].start() + self._wait_for_output(17) + assert self.sm.updated['qcomGnss'] + + os.system("sudo systemctl restart systemd-resolved") + time.sleep(15) + managed_processes['qcomgpsd'].stop() + self.check_assistance(True) diff --git a/iqpilot/system/runtime_package_sources.py b/iqpilot/system/runtime_package_sources.py new file mode 100644 index 000000000..dd1f7e9f6 --- /dev/null +++ b/iqpilot/system/runtime_package_sources.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +import re +import sys +from pathlib import Path + + +PACKAGE_NAMES = ("msgq", "iqdbc", "panda", "tinygrad") +root = Path(sys.argv[1]).resolve() +text = (root / "pyproject.toml").read_text() +for name in PACKAGE_NAMES: + vendor_source = root / "artifacts" / "package_sources" / name + if vendor_source.is_dir(): + source = str(vendor_source) + else: + match = re.search(rf'"({name} @ git\+https://[^@]+@[0-9a-f]{{40}})"', text) + if match is None: + raise RuntimeError(f"missing {name} package source") + source = match.group(1) + print(f"{name}\t{source}") diff --git a/iqpilot/system/runtime_packages_verify.py b/iqpilot/system/runtime_packages_verify.py new file mode 100644 index 000000000..2eecf409c --- /dev/null +++ b/iqpilot/system/runtime_packages_verify.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +"""Verify the runtime packages are completely installed: every file each +package's wheel RECORD names must exist on disk. A top-level `import tinygrad` +passes on a partially extracted install (backends load lazily), and +importlib.metadata's `files` silently drops missing entries, so RECORD is +parsed directly here. Runs under the interpreter whose site-packages should be +checked; prints missing files and exits nonzero on any damage. +""" +import csv +import sys +from importlib import metadata +from pathlib import Path + +PACKAGES = ("iqdbc", "msgq", "panda", "tinygrad") + +missing = [] +for name in PACKAGES: + try: + dist = metadata.distribution(name) + except metadata.PackageNotFoundError: + missing.append(f"{name}: not installed") + continue + record = dist.read_text("RECORD") + if not record: + missing.append(f"{name}: no RECORD") + continue + base = Path(str(dist._path)).parent + for row in csv.reader(record.splitlines()): + if not row or row[0].endswith((".pyc", "/")): + continue + if not (base / row[0]).exists(): + missing.append(f"{name}: {row[0]}") + +if missing: + print("\n".join(missing[:20]), file=sys.stderr) + print(f"runtime packages damaged: {len(missing)} missing files", file=sys.stderr) + sys.exit(1) diff --git a/iqpilot/system/runtime_wheel_requirements.py b/iqpilot/system/runtime_wheel_requirements.py new file mode 100644 index 000000000..9ae3d088d --- /dev/null +++ b/iqpilot/system/runtime_wheel_requirements.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +import hashlib +import sys +import tomllib +from pathlib import Path + + +PACKAGE_NAMES = ("libdatachannel-py",) +PACKAGE_IMPORTS = ("libdatachannel",) +PACKAGE_WHEELS = { + "libdatachannel-py": "libdatachannel_py-2026.1.0.dev2-cp312-cp312-manylinux_2_35_aarch64.whl", +} + + +def locked_packages(root: Path) -> dict[str, dict]: + lock = tomllib.loads((root / "uv.lock").read_text()) + packages = {package["name"]: package for package in lock["package"] if package["name"] in PACKAGE_NAMES} + if packages.keys() != set(PACKAGE_NAMES): + raise RuntimeError("missing locked runtime wheel") + return packages + + +def requirements(root: Path) -> list[str]: + packages = locked_packages(root) + return [f"{name}=={packages[name]['version']}" for name in PACKAGE_NAMES] + + +def install_sources(root: Path) -> list[str]: + packages = locked_packages(root) + sources = [] + for name in PACKAGE_NAMES: + filename = PACKAGE_WHEELS[name] + wheel = root / "artifacts" / "runtime_wheels" / filename + locked_wheel = next((item for item in packages[name]["wheels"] if item["url"].endswith(f"/{filename}")), None) + if locked_wheel is None or not wheel.is_file(): + raise RuntimeError(f"missing vendored runtime wheel for {name}") + expected = locked_wheel["hash"].removeprefix("sha256:") + if hashlib.sha256(wheel.read_bytes()).hexdigest() != expected: + raise RuntimeError(f"invalid vendored runtime wheel for {name}") + sources.append(str(wheel)) + return sources + + +if __name__ == "__main__": + root = Path(sys.argv[1]).resolve() + values = install_sources(root) if "--sources" in sys.argv[2:] else requirements(root) + print("\n".join(values)) diff --git a/iqpilot/system/runtime_wheels_verify.py b/iqpilot/system/runtime_wheels_verify.py new file mode 100644 index 000000000..b342cf1a7 --- /dev/null +++ b/iqpilot/system/runtime_wheels_verify.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +import csv +import sys +from importlib import metadata +from pathlib import Path + +from iqpilot.system.runtime_wheel_requirements import PACKAGE_NAMES + + +missing = [] +for name in PACKAGE_NAMES: + try: + dist = metadata.distribution(name) + except metadata.PackageNotFoundError: + missing.append(f"{name}: not installed") + continue + record = dist.read_text("RECORD") + if not record: + missing.append(f"{name}: no RECORD") + continue + base = Path(str(dist._path)).parent + for row in csv.reader(record.splitlines()): + if not row or row[0].endswith((".pyc", "/")): + continue + if not (base / row[0]).exists(): + missing.append(f"{name}: {row[0]}") + +if missing: + print("\n".join(missing[:20]), file=sys.stderr) + print(f"runtime wheels damaged: {len(missing)} missing files", file=sys.stderr) + sys.exit(1) diff --git a/iqpilot/system/sensord/__init__.py b/iqpilot/system/sensord/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/sensord/sensord.py b/iqpilot/system/sensord/sensord.py new file mode 100755 index 000000000..1fb161aa3 --- /dev/null +++ b/iqpilot/system/sensord/sensord.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +import os +import time +import ctypes +import select +import threading + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.utils import sudo_write +from iqpilot.common.realtime import config_realtime_process, Ratekeeper +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.gpio import gpiochip_get_ro_value_fd, gpioevent_data +from iqpilot.system.hardware import HARDWARE + +from iqpilot.system.sensord.sensors.i2c_sensor import Sensor +from iqpilot.system.sensord.sensors.lsm6ds3_accel import LSM6DS3_Accel +from iqpilot.system.sensord.sensors.lsm6ds3_gyro import LSM6DS3_Gyro +from iqpilot.system.sensord.sensors.lsm6ds3_temp import LSM6DS3_Temp +from iqpilot.system.sensord.sensors.mmc5603nj_magn import MMC5603NJ_Magn + +I2C_BUS_IMU = 1 + +def interrupt_loop(sensors: list[tuple[Sensor, str, bool]], event) -> None: + pm = messaging.PubMaster([service for sensor, service, interrupt in sensors if interrupt]) + + # Requesting both edges as the data ready pulse from the lsm6ds sensor is + # very short (75us) and is mostly detected as falling edge instead of rising. + # So if it is detected as rising the following falling edge is skipped. + fd = gpiochip_get_ro_value_fd("sensord", 0, 84) + + # Configure IRQ affinity + irq_path = "/proc/irq/336/smp_affinity_list" + if not os.path.exists(irq_path): + irq_path = "/proc/irq/335/smp_affinity_list" + if os.path.exists(irq_path): + sudo_write('1\n', irq_path) + + offset = time.time_ns() - time.monotonic_ns() + + poller = select.poll() + poller.register(fd, select.POLLIN | select.POLLPRI) + while not event.is_set(): + events = poller.poll(100) + if not events: + cloudlog.error("poll timed out") + continue + if not (events[0][1] & (select.POLLIN | select.POLLPRI)): + cloudlog.error("no poll events set") + continue + + dat = os.read(fd, ctypes.sizeof(gpioevent_data)*16) + evd = gpioevent_data.from_buffer_copy(dat) + + cur_offset = time.time_ns() - time.monotonic_ns() + if abs(cur_offset - offset) > 10 * 1e6: # ms + cloudlog.warning(f"time jumped: {cur_offset} {offset}") + offset = cur_offset + continue + + ts = evd.timestamp - cur_offset + for sensor, service, interrupt in sensors: + if interrupt: + try: + evt = sensor.get_event(ts) + if not sensor.is_data_valid(): + continue + msg = messaging.new_message(service, valid=True) + setattr(msg, service, evt) + pm.send(service, msg) + except Sensor.DataNotReady: + pass + except Exception: + cloudlog.exception(f"Error processing {service}") + + +def polling_loop(sensor: Sensor, service: str, event: threading.Event) -> None: + pm = messaging.PubMaster([service]) + rk = Ratekeeper(SERVICE_LIST[service].frequency, print_delay_threshold=None) + while not event.is_set(): + try: + evt = sensor.get_event() + if not sensor.is_data_valid(): + continue + msg = messaging.new_message(service, valid=True) + setattr(msg, service, evt) + pm.send(service, msg) + except Exception: + cloudlog.exception(f"Error in {service} polling loop") + rk.keep_time() + +def main() -> None: + config_realtime_process([1, ], 1) + + sensors_cfg = [ + (LSM6DS3_Accel(I2C_BUS_IMU), "accelerometer", True), + (LSM6DS3_Gyro(I2C_BUS_IMU), "gyroscope", True), + (LSM6DS3_Temp(I2C_BUS_IMU), "temperatureSensor", False), + ] + if HARDWARE.get_device_type() == "tizi": + sensors_cfg.append( + (MMC5603NJ_Magn(I2C_BUS_IMU), "magnetometer", False), + ) + + # Reset sensors + for sensor, _, _ in sensors_cfg: + try: + sensor.reset() + except Exception: + cloudlog.exception(f"Error initializing {sensor} sensor") + + # Initialize sensors + exit_event = threading.Event() + threads = [ + threading.Thread(target=interrupt_loop, args=(sensors_cfg, exit_event), daemon=True) + ] + for sensor, service, interrupt in sensors_cfg: + try: + sensor.init() + if not interrupt: + # Start polling thread for sensors without interrupts + threads.append(threading.Thread( + target=polling_loop, + args=(sensor, service, exit_event), + daemon=True + )) + except Exception: + cloudlog.exception(f"Error initializing {service} sensor") + + try: + for t in threads: + t.start() + while any(t.is_alive() for t in threads): + time.sleep(1) + except KeyboardInterrupt: + pass + finally: + exit_event.set() + for t in threads: + if t.is_alive(): + t.join() + + for sensor, _, _ in sensors_cfg: + try: + sensor.shutdown() + except Exception: + cloudlog.exception("Error shutting down sensor") + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/sensord/sensors/__init__.py b/iqpilot/system/sensord/sensors/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/sensord/sensors/i2c_sensor.py b/iqpilot/system/sensord/sensors/i2c_sensor.py new file mode 100644 index 000000000..ad52ae323 --- /dev/null +++ b/iqpilot/system/sensord/sensors/i2c_sensor.py @@ -0,0 +1,78 @@ +import time +import ctypes +from collections.abc import Iterable + +from iqpilot.cereal import log +from iqpilot.common.i2c import SMBus + + +class Sensor: + class SensorException(Exception): + pass + + class DataNotReady(SensorException): + pass + + def __init__(self, bus: int) -> None: + self.bus = SMBus(bus) + self.source = log.SensorEventData.SensorSource.velodyne # unknown + self.start_ts = 0. + + def __del__(self): + self.bus.close() + + def read(self, addr: int, length: int) -> bytes: + return bytes(self.bus.read_i2c_block_data(self.device_address, addr, length)) + + def write(self, addr: int, data: int) -> None: + self.bus.write_byte_data(self.device_address, addr, data) + + def writes(self, writes: Iterable[tuple[int, int]]) -> None: + for addr, data in writes: + self.write(addr, data) + + def verify_chip_id(self, address: int, expected_ids: list[int]) -> int: + chip_id = self.read(address, 1)[0] + assert chip_id in expected_ids + return chip_id + + # Abstract methods that must be implemented by subclasses + @property + def device_address(self) -> int: + raise NotImplementedError + + def reset(self) -> None: + # optional. + # not part of init due to shared registers + pass + + def init(self) -> None: + raise NotImplementedError + + def get_event(self, ts: int | None = None) -> log.SensorEventData: + raise NotImplementedError + + def shutdown(self) -> None: + raise NotImplementedError + + def is_data_valid(self) -> bool: + if self.start_ts == 0: + self.start_ts = time.monotonic() + + # unclear whether we need this... + return (time.monotonic() - self.start_ts) > 0.5 + + # *** helpers *** + @staticmethod + def wait(): + # a standard small sleep + time.sleep(0.005) + + @staticmethod + def parse_16bit(lsb: int, msb: int) -> int: + return ctypes.c_int16((msb << 8) | lsb).value + + @staticmethod + def parse_20bit(b2: int, b1: int, b0: int) -> int: + combined = ctypes.c_uint32((b0 << 16) | (b1 << 8) | b2).value + return ctypes.c_int32(combined).value // (1 << 4) diff --git a/iqpilot/system/sensord/sensors/lsm6ds3_accel.py b/iqpilot/system/sensord/sensors/lsm6ds3_accel.py new file mode 100644 index 000000000..287602855 --- /dev/null +++ b/iqpilot/system/sensord/sensors/lsm6ds3_accel.py @@ -0,0 +1,161 @@ +import os +import time + +from iqpilot.cereal import log +from iqpilot.system.sensord.sensors.i2c_sensor import Sensor + +class LSM6DS3_Accel(Sensor): + LSM6DS3_ACCEL_I2C_REG_DRDY_CFG = 0x0B + LSM6DS3_ACCEL_I2C_REG_INT1_CTRL = 0x0D + LSM6DS3_ACCEL_I2C_REG_CTRL1_XL = 0x10 + LSM6DS3_ACCEL_I2C_REG_CTRL3_C = 0x12 + LSM6DS3_ACCEL_I2C_REG_CTRL5_C = 0x14 + LSM6DS3_ACCEL_I2C_REG_STAT_REG = 0x1E + LSM6DS3_ACCEL_I2C_REG_OUTX_L_XL = 0x28 + + LSM6DS3_ACCEL_ODR_104HZ = (0b0100 << 4) + LSM6DS3_ACCEL_INT1_DRDY_XL = 0b1 + LSM6DS3_ACCEL_DRDY_XLDA = 0b1 + LSM6DS3_ACCEL_DRDY_PULSE_MODE = (1 << 7) + LSM6DS3_ACCEL_IF_INC = 0b00000100 + + LSM6DS3_ACCEL_ODR_52HZ = (0b0011 << 4) + LSM6DS3_ACCEL_FS_4G = (0b10 << 2) + LSM6DS3_ACCEL_IF_INC_BDU = 0b01000100 + LSM6DS3_ACCEL_POSITIVE_TEST = 0b01 + LSM6DS3_ACCEL_NEGATIVE_TEST = 0b10 + LSM6DS3_ACCEL_MIN_ST_LIMIT_mg = 90.0 + LSM6DS3_ACCEL_MAX_ST_LIMIT_mg = 1700.0 + + @property + def device_address(self) -> int: + return 0x6A + + def reset(self): + self.write(0x12, 0x1) + time.sleep(0.1) + + def init(self): + chip_id = self.verify_chip_id(0x0F, [0x69, 0x6A]) + if chip_id == 0x6A: + self.source = log.SensorEventData.SensorSource.lsm6ds3trc + else: + self.source = log.SensorEventData.SensorSource.lsm6ds3 + + # self-test + if os.getenv("LSM_SELF_TEST") == "1": + self.self_test(self.LSM6DS3_ACCEL_POSITIVE_TEST) + self.self_test(self.LSM6DS3_ACCEL_NEGATIVE_TEST) + + # actual init + int1 = self.read(self.LSM6DS3_ACCEL_I2C_REG_INT1_CTRL, 1)[0] + int1 |= self.LSM6DS3_ACCEL_INT1_DRDY_XL + self.writes(( + # Enable continuous update and automatic address increment + (self.LSM6DS3_ACCEL_I2C_REG_CTRL3_C, self.LSM6DS3_ACCEL_IF_INC), + # Set ODR to 104 Hz, FS to Âą2g (default) + (self.LSM6DS3_ACCEL_I2C_REG_CTRL1_XL, self.LSM6DS3_ACCEL_ODR_104HZ), + # Configure data ready signal to pulse mode + (self.LSM6DS3_ACCEL_I2C_REG_DRDY_CFG, self.LSM6DS3_ACCEL_DRDY_PULSE_MODE), + # Enable data ready interrupt on INT1 without resetting existing interrupts + (self.LSM6DS3_ACCEL_I2C_REG_INT1_CTRL, int1), + )) + + def get_event(self, ts: int | None = None) -> log.SensorEventData: + assert ts is not None # must come from the IRQ event + + # Check if data is ready since IRQ is shared with gyro + status_reg = self.read(self.LSM6DS3_ACCEL_I2C_REG_STAT_REG, 1)[0] + if (status_reg & self.LSM6DS3_ACCEL_DRDY_XLDA) == 0: + raise self.DataNotReady + + scale = 9.81 * 2.0 / (1 << 15) + b = self.read(self.LSM6DS3_ACCEL_I2C_REG_OUTX_L_XL, 6) + x = self.parse_16bit(b[0], b[1]) * scale + y = self.parse_16bit(b[2], b[3]) * scale + z = self.parse_16bit(b[4], b[5]) * scale + + event = log.SensorEventData.new_message() + event.timestamp = ts + event.version = 1 + event.sensor = 1 # SENSOR_ACCELEROMETER + event.type = 1 # SENSOR_TYPE_ACCELEROMETER + event.source = self.source + a = event.init('acceleration') + a.v = [y, -x, z] + a.status = 1 + return event + + def shutdown(self) -> None: + # Disable data ready interrupt on INT1 + value = self.read(self.LSM6DS3_ACCEL_I2C_REG_INT1_CTRL, 1)[0] + value &= ~self.LSM6DS3_ACCEL_INT1_DRDY_XL + self.write(self.LSM6DS3_ACCEL_I2C_REG_INT1_CTRL, value) + + # Power down by clearing ODR bits + value = self.read(self.LSM6DS3_ACCEL_I2C_REG_CTRL1_XL, 1)[0] + value &= 0x0F + self.write(self.LSM6DS3_ACCEL_I2C_REG_CTRL1_XL, value) + + # *** self-test stuff *** + def _wait_for_data_ready(self): + while True: + drdy = self.read(self.LSM6DS3_ACCEL_I2C_REG_STAT_REG, 1)[0] + if drdy & self.LSM6DS3_ACCEL_DRDY_XLDA: + break + + def _read_and_avg_data(self, scaling: float) -> list[float]: + out_buf = [0.0, 0.0, 0.0] + for _ in range(5): + self._wait_for_data_ready() + b = self.read(self.LSM6DS3_ACCEL_I2C_REG_OUTX_L_XL, 6) + for j in range(3): + val = self.parse_16bit(b[j*2], b[j*2+1]) * scaling + out_buf[j] += val + return [x / 5.0 for x in out_buf] + + def self_test(self, test_type: int) -> None: + # Prepare sensor for self-test + self.write(self.LSM6DS3_ACCEL_I2C_REG_CTRL3_C, self.LSM6DS3_ACCEL_IF_INC_BDU) + + # Configure ODR and full scale based on sensor type + if self.source == log.SensorEventData.SensorSource.lsm6ds3trc: + odr_fs = self.LSM6DS3_ACCEL_FS_4G | self.LSM6DS3_ACCEL_ODR_52HZ + scaling = 0.122 # mg/LSB for Âą4g + else: + odr_fs = self.LSM6DS3_ACCEL_ODR_52HZ + scaling = 0.061 # mg/LSB for Âą2g + self.write(self.LSM6DS3_ACCEL_I2C_REG_CTRL1_XL, odr_fs) + + # Wait for stable output + time.sleep(0.1) + self._wait_for_data_ready() + val_st_off = self._read_and_avg_data(scaling) + + # Enable self-test + self.write(self.LSM6DS3_ACCEL_I2C_REG_CTRL5_C, test_type) + + # Wait for stable output + time.sleep(0.1) + self._wait_for_data_ready() + val_st_on = self._read_and_avg_data(scaling) + + # Disable sensor and self-test + self.write(self.LSM6DS3_ACCEL_I2C_REG_CTRL1_XL, 0) + self.write(self.LSM6DS3_ACCEL_I2C_REG_CTRL5_C, 0) + + # Calculate differences and check limits + test_val = [abs(on - off) for on, off in zip(val_st_on, val_st_off, strict=False)] + for val in test_val: + if val < self.LSM6DS3_ACCEL_MIN_ST_LIMIT_mg or val > self.LSM6DS3_ACCEL_MAX_ST_LIMIT_mg: + raise self.SensorException(f"Accelerometer self-test failed for test type {test_type}") + +if __name__ == "__main__": + import numpy as np + s = LSM6DS3_Accel(1) + s.init() + time.sleep(0.2) + e = s.get_event(0) + print(e) + print(np.linalg.norm(e.acceleration.v)) + s.shutdown() diff --git a/iqpilot/system/sensord/sensors/lsm6ds3_gyro.py b/iqpilot/system/sensord/sensors/lsm6ds3_gyro.py new file mode 100644 index 000000000..b26812c6c --- /dev/null +++ b/iqpilot/system/sensord/sensors/lsm6ds3_gyro.py @@ -0,0 +1,145 @@ +import os +import math +import time + +from iqpilot.cereal import log +from iqpilot.system.sensord.sensors.i2c_sensor import Sensor + +class LSM6DS3_Gyro(Sensor): + LSM6DS3_GYRO_I2C_REG_DRDY_CFG = 0x0B + LSM6DS3_GYRO_I2C_REG_INT1_CTRL = 0x0D + LSM6DS3_GYRO_I2C_REG_CTRL2_G = 0x11 + LSM6DS3_GYRO_I2C_REG_CTRL5_C = 0x14 + LSM6DS3_GYRO_I2C_REG_STAT_REG = 0x1E + LSM6DS3_GYRO_I2C_REG_OUTX_L_G = 0x22 + + LSM6DS3_GYRO_ODR_104HZ = (0b0100 << 4) + LSM6DS3_GYRO_INT1_DRDY_G = 0b10 + LSM6DS3_GYRO_DRDY_GDA = 0b10 + LSM6DS3_GYRO_DRDY_PULSE_MODE = (1 << 7) + + LSM6DS3_GYRO_ODR_208HZ = (0b0101 << 4) + LSM6DS3_GYRO_FS_2000dps = (0b11 << 2) + LSM6DS3_GYRO_POSITIVE_TEST = (0b01 << 2) + LSM6DS3_GYRO_NEGATIVE_TEST = (0b11 << 2) + LSM6DS3_GYRO_MIN_ST_LIMIT_mdps = 150000.0 + LSM6DS3_GYRO_MAX_ST_LIMIT_mdps = 700000.0 + + @property + def device_address(self) -> int: + return 0x6A + + def reset(self): + self.write(0x12, 0x1) + time.sleep(0.1) + + def init(self): + chip_id = self.verify_chip_id(0x0F, [0x69, 0x6A]) + if chip_id == 0x6A: + self.source = log.SensorEventData.SensorSource.lsm6ds3trc + else: + self.source = log.SensorEventData.SensorSource.lsm6ds3 + + # self-test + if "LSM_SELF_TEST" in os.environ: + self.self_test(self.LSM6DS3_GYRO_POSITIVE_TEST) + self.self_test(self.LSM6DS3_GYRO_NEGATIVE_TEST) + + # actual init + self.writes(( + # TODO: set scale. Default is +- 250 deg/s + (self.LSM6DS3_GYRO_I2C_REG_CTRL2_G, self.LSM6DS3_GYRO_ODR_104HZ), + # Configure data ready signal to pulse mode + (self.LSM6DS3_GYRO_I2C_REG_DRDY_CFG, self.LSM6DS3_GYRO_DRDY_PULSE_MODE), + )) + value = self.read(self.LSM6DS3_GYRO_I2C_REG_INT1_CTRL, 1)[0] + value |= self.LSM6DS3_GYRO_INT1_DRDY_G + self.write(self.LSM6DS3_GYRO_I2C_REG_INT1_CTRL, value) + + def get_event(self, ts: int | None = None) -> log.SensorEventData: + assert ts is not None # must come from the IRQ event + + # Check if gyroscope data is ready, since it's shared with accelerometer + status_reg = self.read(self.LSM6DS3_GYRO_I2C_REG_STAT_REG, 1)[0] + if not (status_reg & self.LSM6DS3_GYRO_DRDY_GDA): + raise self.DataNotReady + + b = self.read(self.LSM6DS3_GYRO_I2C_REG_OUTX_L_G, 6) + x = self.parse_16bit(b[0], b[1]) + y = self.parse_16bit(b[2], b[3]) + z = self.parse_16bit(b[4], b[5]) + scale = (8.75 / 1000.0) * (math.pi / 180.0) + xyz = [y * scale, -x * scale, z * scale] + + event = log.SensorEventData.new_message() + event.timestamp = ts + event.version = 2 + event.sensor = 5 # SENSOR_GYRO_UNCALIBRATED + event.type = 16 # SENSOR_TYPE_GYROSCOPE_UNCALIBRATED + event.source = self.source + g = event.init('gyroUncalibrated') + g.v = xyz + g.status = 1 + return event + + def shutdown(self) -> None: + # Disable data ready interrupt on INT1 + value = self.read(self.LSM6DS3_GYRO_I2C_REG_INT1_CTRL, 1)[0] + value &= ~self.LSM6DS3_GYRO_INT1_DRDY_G + self.write(self.LSM6DS3_GYRO_I2C_REG_INT1_CTRL, value) + + # Power down by clearing ODR bits + value = self.read(self.LSM6DS3_GYRO_I2C_REG_CTRL2_G, 1)[0] + value &= 0x0F + self.write(self.LSM6DS3_GYRO_I2C_REG_CTRL2_G, value) + + # *** self-test stuff *** + def _wait_for_data_ready(self): + while True: + drdy = self.read(self.LSM6DS3_GYRO_I2C_REG_STAT_REG, 1)[0] + if drdy & self.LSM6DS3_GYRO_DRDY_GDA: + break + + def _read_and_avg_data(self) -> list[float]: + out_buf = [0.0, 0.0, 0.0] + for _ in range(5): + self._wait_for_data_ready() + b = self.read(self.LSM6DS3_GYRO_I2C_REG_OUTX_L_G, 6) + for j in range(3): + val = self.parse_16bit(b[j*2], b[j*2+1]) * 70.0 # mdps/LSB for 2000 dps + out_buf[j] += val + return [x / 5.0 for x in out_buf] + + def self_test(self, test_type: int): + # Set ODR to 208Hz, FS to 2000dps + self.write(self.LSM6DS3_GYRO_I2C_REG_CTRL2_G, self.LSM6DS3_GYRO_ODR_208HZ | self.LSM6DS3_GYRO_FS_2000dps) + + # Wait for stable output + time.sleep(0.15) + self._wait_for_data_ready() + val_st_off = self._read_and_avg_data() + + # Enable self-test + self.write(self.LSM6DS3_GYRO_I2C_REG_CTRL5_C, test_type) + + # Wait for stable output + time.sleep(0.05) + self._wait_for_data_ready() + val_st_on = self._read_and_avg_data() + + # Disable sensor and self-test + self.write(self.LSM6DS3_GYRO_I2C_REG_CTRL2_G, 0) + self.write(self.LSM6DS3_GYRO_I2C_REG_CTRL5_C, 0) + + # Calculate differences and check limits + test_val = [abs(on - off) for on, off in zip(val_st_on, val_st_off, strict=False)] + for val in test_val: + if val < self.LSM6DS3_GYRO_MIN_ST_LIMIT_mdps or val > self.LSM6DS3_GYRO_MAX_ST_LIMIT_mdps: + raise Exception(f"Gyroscope self-test failed for test type {test_type}") + +if __name__ == "__main__": + s = LSM6DS3_Gyro(1) + s.init() + time.sleep(0.1) + print(s.get_event(0)) + s.shutdown() diff --git a/iqpilot/system/sensord/sensors/lsm6ds3_temp.py b/iqpilot/system/sensord/sensors/lsm6ds3_temp.py new file mode 100644 index 000000000..b776d4b63 --- /dev/null +++ b/iqpilot/system/sensord/sensors/lsm6ds3_temp.py @@ -0,0 +1,33 @@ +import time + +from iqpilot.cereal import log +from iqpilot.system.sensord.sensors.i2c_sensor import Sensor + +# https://content.arduino.cc/assets/st_imu_lsm6ds3_datasheet.pdf +class LSM6DS3_Temp(Sensor): + @property + def device_address(self) -> int: + return 0x6A + + def _read_temperature(self) -> float: + scale = 16.0 if self.source == log.SensorEventData.SensorSource.lsm6ds3 else 256.0 + data = self.read(0x20, 2) + return 25 + (self.parse_16bit(data[0], data[1]) / scale) + + def init(self): + chip_id = self.verify_chip_id(0x0F, [0x69, 0x6A]) + if chip_id == 0x6A: + self.source = log.SensorEventData.SensorSource.lsm6ds3trc + else: + self.source = log.SensorEventData.SensorSource.lsm6ds3 + + def get_event(self, ts: int | None = None) -> log.SensorEventData: + event = log.SensorEventData.new_message() + event.version = 1 + event.timestamp = int(time.monotonic() * 1e9) + event.source = self.source + event.temperature = self._read_temperature() + return event + + def shutdown(self) -> None: + pass diff --git a/iqpilot/system/sensord/sensors/mmc5603nj_magn.py b/iqpilot/system/sensord/sensors/mmc5603nj_magn.py new file mode 100644 index 000000000..e53f1ff6c --- /dev/null +++ b/iqpilot/system/sensord/sensors/mmc5603nj_magn.py @@ -0,0 +1,76 @@ +import time + +from iqpilot.cereal import log +from iqpilot.system.sensord.sensors.i2c_sensor import Sensor + +# https://www.mouser.com/datasheet/2/821/Memsic_09102019_Datasheet_Rev.B-1635324.pdf + +# Register addresses +REG_ODR = 0x1A +REG_INTERNAL_0 = 0x1B +REG_INTERNAL_1 = 0x1C + +# Control register settings +CMM_FREQ_EN = (1 << 7) +AUTO_SR_EN = (1 << 5) +SET = (1 << 3) +RESET = (1 << 4) + +class MMC5603NJ_Magn(Sensor): + @property + def device_address(self) -> int: + return 0x30 + + def init(self): + self.verify_chip_id(0x39, [0x10, ]) + self.writes(( + (REG_ODR, 0), + + # Set BW to 0b01 for 1-150 Hz operation + (REG_INTERNAL_1, 0b01), + )) + + def _read_data(self, cycle) -> list[float]: + # start measurement + self.write(REG_INTERNAL_0, cycle) + self.wait() + + # read out XYZ + scale = 1.0 / 16384.0 + b = self.read(0x00, 9) + return [ + (self.parse_20bit(b[6], b[1], b[0]) * scale) - 32.0, + (self.parse_20bit(b[7], b[3], b[2]) * scale) - 32.0, + (self.parse_20bit(b[8], b[5], b[4]) * scale) - 32.0, + ] + + def get_event(self, ts: int | None = None) -> log.SensorEventData: + ts = time.monotonic_ns() + + # SET - RESET cycle + xyz = self._read_data(SET) + reset_xyz = self._read_data(RESET) + vals = [*xyz, *reset_xyz] + + event = log.SensorEventData.new_message() + event.timestamp = ts + event.version = 1 + event.sensor = 3 # SENSOR_MAGNETOMETER_UNCALIBRATED + event.type = 14 # SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED + event.source = log.SensorEventData.SensorSource.mmc5603nj + + m = event.init('magneticUncalibrated') + m.v = vals + m.status = int(all(int(v) != -32 for v in vals)) + + return event + + def shutdown(self) -> None: + v = self.read(REG_INTERNAL_0, 1)[0] + self.writes(( + # disable auto-reset of measurements + (REG_INTERNAL_0, (v & (~(CMM_FREQ_EN | AUTO_SR_EN)))), + + # disable continuous mode + (REG_ODR, 0), + )) diff --git a/iqpilot/system/sensord/tests/__init__.py b/iqpilot/system/sensord/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/sensord/tests/test_sensord.py b/iqpilot/system/sensord/tests/test_sensord.py new file mode 100644 index 000000000..d49cfc777 --- /dev/null +++ b/iqpilot/system/sensord/tests/test_sensord.py @@ -0,0 +1,225 @@ +import os +import pytest +import time +import numpy as np +from collections import namedtuple, defaultdict + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import log +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.gpio import get_irqs_for_action +from iqpilot.common.timeout import Timeout +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.manager.process_config import managed_processes + +LSM = { + ('lsm6ds3', 'acceleration'), + ('lsm6ds3', 'gyroUncalibrated'), + ('lsm6ds3', 'temperature'), +} +LSM_C = {(x[0]+'trc', x[1]) for x in LSM} + +MMC = { + ('mmc5603nj', 'magneticUncalibrated'), +} + +SENSOR_CONFIGURATIONS: list[set] = { + "mici": [LSM, LSM_C], + "tizi": [MMC | LSM, MMC | LSM_C], + "tici": [LSM, LSM_C, MMC | LSM, MMC | LSM_C], +}.get(HARDWARE.get_device_type(), []) + +Sensor = log.SensorEventData.SensorSource +SensorConfig = namedtuple('SensorConfig', ['type', 'sanity_min', 'sanity_max']) +ALL_SENSORS = { + Sensor.lsm6ds3trc: { + SensorConfig("acceleration", 5, 15), + SensorConfig("gyroUncalibrated", 0, .2), + SensorConfig("temperature", 10, 40), # set for max range of our office + }, + + Sensor.mmc5603nj: { + SensorConfig("magneticUncalibrated", 0, 300), + } +} +ALL_SENSORS[Sensor.lsm6ds3] = ALL_SENSORS[Sensor.lsm6ds3trc] + +def get_irq_count(irq: int): + with open(f"/sys/kernel/irq/{irq}/per_cpu_count") as f: + per_cpu = map(int, f.read().split(",")) + return sum(per_cpu) + +def read_sensor_events(duration_sec): + sensor_types = ['accelerometer', 'gyroscope', 'magnetometer', 'temperatureSensor',] + socks = {} + poller = messaging.Poller() + events = defaultdict(list) + for stype in sensor_types: + socks[stype] = messaging.sub_sock(stype, poller=poller, timeout=100) + + # wait for sensors to come up + with Timeout(int(os.environ.get("SENSOR_WAIT", "5")), "sensors didn't come up"): + while len(poller.poll(250)) == 0: + pass + time.sleep(1) + for s in socks.values(): + messaging.drain_sock_raw(s) + + st = time.monotonic() + while time.monotonic() - st < duration_sec: + for s in socks: + events[s] += messaging.drain_sock(socks[s]) + time.sleep(0.1) + + assert sum(map(len, events.values())) != 0, "No sensor events collected!" + + return {k: v for k, v in events.items() if len(v) > 0} + +@pytest.mark.tici +class TestSensord: + @classmethod + def setup_class(cls): + # enable LSM self test + os.environ["LSM_SELF_TEST"] = "1" + + # read initial sensor values every test case can use + os.system("pkill -f \\\\./sensord") + try: + managed_processes["sensord"].start() + cls.sample_secs = int(os.getenv("SAMPLE_SECS", "10")) + cls.events = read_sensor_events(cls.sample_secs) + + # determine sensord's irq + cls.sensord_irq = get_irqs_for_action("sensord")[0] + finally: + # teardown won't run if this doesn't succeed + managed_processes["sensord"].stop() + + @classmethod + def teardown_class(cls): + managed_processes["sensord"].stop() + + def teardown_method(self): + managed_processes["sensord"].stop() + + def test_sensors_present(self): + # verify correct sensors configuration + seen = set() + for etype in self.events: + for measurement in self.events[etype]: + m = getattr(measurement, measurement.which()) + seen.add((str(m.source), m.which())) + + assert seen in SENSOR_CONFIGURATIONS + + def test_lsm6ds3_timing(self, subtests): + # verify measurements are sampled and published at 104Hz + + sensor_t = { + 1: [], # accel + 5: [], # gyro + } + + for measurement in self.events['accelerometer']: + m = getattr(measurement, measurement.which()) + sensor_t[m.sensor].append(m.timestamp) + + for measurement in self.events['gyroscope']: + m = getattr(measurement, measurement.which()) + sensor_t[m.sensor].append(m.timestamp) + + for s, vals in sensor_t.items(): + with subtests.test(sensor=s): + assert len(vals) > 0 + tdiffs = np.diff(vals) / 1e6 # millis + + high_delay_diffs = list(filter(lambda d: d >= 20., tdiffs)) + assert len(high_delay_diffs) < 15, f"Too many large diffs: {high_delay_diffs}" + + avg_diff = sum(tdiffs)/len(tdiffs) + avg_freq = 1. / (avg_diff * 1e-3) + assert 92. < avg_freq < 114., f"avg freq {avg_freq}Hz wrong, expected 104Hz" + + stddev = np.std(tdiffs) + assert stddev < 2.0, f"Standard-dev to big {stddev}" + + def test_sensor_frequency(self, subtests): + for s, msgs in self.events.items(): + with subtests.test(sensor=s): + freq = len(msgs) / self.sample_secs + ef = SERVICE_LIST[s].frequency + assert ef*0.85 <= freq <= ef*1.15 + + def test_logmonottime_timestamp_diff(self): + # ensure diff between the message logMonotime and sample timestamp is small + + tdiffs = list() + for etype in self.events: + for measurement in self.events[etype]: + m = getattr(measurement, measurement.which()) + + # check if gyro and accel timestamps are before logMonoTime + if str(m.source).startswith("lsm6ds3") and m.which() != 'temperature': + err_msg = f"Timestamp after logMonoTime: {m.timestamp} > {measurement.logMonoTime}" + assert m.timestamp < measurement.logMonoTime, err_msg + + # negative values might occur, as non interrupt packages created + # before the sensor is read + tdiffs.append(abs(measurement.logMonoTime - m.timestamp) / 1e6) + + # some sensors have a read procedure that will introduce an expected diff on the order of 20ms + high_delay_diffs = set(filter(lambda d: d >= 25., tdiffs)) + assert len(high_delay_diffs) < 20, f"Too many measurements published: {high_delay_diffs}" + + avg_diff = round(sum(tdiffs)/len(tdiffs), 4) + assert avg_diff < 4, f"Avg packet diff: {avg_diff:.1f}ms" + + def test_sensor_values(self): + sensor_values = dict() + for etype in self.events: + for measurement in self.events[etype]: + m = getattr(measurement, measurement.which()) + key = (m.source.raw, m.which()) + values = getattr(m, m.which()) + + if hasattr(values, 'v'): + values = values.v + values = np.atleast_1d(values) + + if key in sensor_values: + sensor_values[key].append(values) + else: + sensor_values[key] = [values] + + # Sanity check sensor values + for sensor, stype in sensor_values: + for s in ALL_SENSORS[sensor]: + if s.type != stype: + continue + + key = (sensor, s.type) + mean_norm = np.mean(np.linalg.norm(sensor_values[key], axis=1)) + err_msg = f"Sensor '{sensor} {s.type}' failed sanity checks {mean_norm} is not between {s.sanity_min} and {s.sanity_max}" + assert s.sanity_min <= mean_norm <= s.sanity_max, err_msg + + def test_sensor_verify_no_interrupts_after_stop(self): + managed_processes["sensord"].start() + time.sleep(3) + + # read /proc/interrupts to verify interrupts are received + state_one = get_irq_count(self.sensord_irq) + time.sleep(1) + state_two = get_irq_count(self.sensord_irq) + + error_msg = f"no interrupts received after sensord start!\n{state_one} {state_two}" + assert state_one != state_two, error_msg + + managed_processes["sensord"].stop() + time.sleep(1) + + # read /proc/interrupts to verify no more interrupts are received + state_one = get_irq_count(self.sensord_irq) + time.sleep(1) + state_two = get_irq_count(self.sensord_irq) + assert state_one == state_two, "Interrupts received after sensord stop!" + diff --git a/iqpilot/system/sentry.py b/iqpilot/system/sentry.py new file mode 100644 index 000000000..0205903d5 --- /dev/null +++ b/iqpilot/system/sentry.py @@ -0,0 +1,171 @@ +"""Install exception handler for process crash.""" +import os +import shutil +import traceback +from datetime import datetime +import sentry_sdk +from enum import Enum +from sentry_sdk.integrations.threading import ThreadingIntegration + +from iqpilot.common.params import Params +from iqpilot.konn3kt.registration import UNREGISTERED_DONGLE_ID +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.version import get_build_metadata, get_version + +CRASHES_DIR = Paths.crash_log_root() +CRASH_UPLOADS_DIR = os.path.join(Paths.log_root(), "crash") + + +class SentryProject(Enum): + # python project + SELFDRIVE = "https://186a6736b7927e5ae9b92c869ba81b6b@o1138119.ingest.us.sentry.io/4508660076052480" + # native project + SELFDRIVE_NATIVE = SELFDRIVE + + +def _sentry_enabled() -> bool: + return os.getenv("IQPILOT_ENABLE_SENTRY", "0") == "1" + + +def _ensure_dir(path: str) -> None: + os.makedirs(path, exist_ok=True) + + +def _queue_crash_upload(src: str, name: str | None = None) -> None: + try: + _ensure_dir(CRASH_UPLOADS_DIR) + dest_name = name or os.path.basename(src) + shutil.copyfile(src, os.path.join(CRASH_UPLOADS_DIR, dest_name)) + except Exception: + cloudlog.exception("error when attempting to queue crash upload") + + +def report_tombstone(fn: str, message: str, contents: str) -> None: + cloudlog.error({'tombstone': message}) + + if not _sentry_enabled(): + return + + with sentry_sdk.configure_scope() as scope: + set_user() + scope.set_extra("tombstone_fn", fn) + scope.set_extra("tombstone", contents) + sentry_sdk.capture_message(message=message) + sentry_sdk.flush() + + +def capture_exception(*args, **kwargs) -> None: + cloudlog.error("crash", exc_info=kwargs.get('exc_info', 1)) + + try: + save_exception(traceback.format_exc()) + + if not _sentry_enabled(): + return + + set_user() + sentry_sdk.capture_exception(*args, **kwargs) + sentry_sdk.flush() # https://github.com/getsentry/sentry-python/issues/291 + except Exception: + cloudlog.exception("sentry exception") + + +def save_exception(content: str) -> None: + try: + _ensure_dir(CRASHES_DIR) + commit = (get_build_metadata().openpilot.git_commit or "nocommit")[:8] + + dated_fn = os.path.join(CRASHES_DIR, datetime.now().strftime("%Y-%m-%d--%H-%M-%S.log")) + files = [ + dated_fn, + os.path.join(CRASHES_DIR, "error.log") + ] + + for fn in files: + with open(fn, 'w') as f: + if os.path.basename(fn) == "error.log": + lines = content.splitlines()[-3:] + f.write("\n".join(lines)) + else: + f.write(content) + + upload_name = f"{os.path.splitext(os.path.basename(dated_fn))[0]}_{commit}_python.log" + _queue_crash_upload(dated_fn, upload_name) + cloudlog.error(f"logged crash to {files}") + except Exception: + cloudlog.exception("error when attempting to save exception") + + +def capture_fingerprint_mock() -> None: + try: + set_user() + message = "car doesn't match any fingerprints" + sentry_sdk.capture_message(message=message, level="error") + sentry_sdk.flush() + except Exception as e: + cloudlog.exception(f"sentry fingerprint MOCK exception: {e}") + + +def capture_fingerprint(candidate: str, car_name: str) -> None: + try: + set_user() + sentry_sdk.set_tag("carFingerprint", candidate) + sentry_sdk.set_tag("carName", car_name) + + message = f"Fingerprinted {candidate}" + sentry_sdk.capture_message(message=message, level="info") + sentry_sdk.flush() + except Exception as e: + cloudlog.exception(f"sentry fingerprint exception: {e}") + + +def set_tag(key: str, value: str) -> None: + sentry_sdk.set_tag(key, value) + + +def set_user() -> None: + dongle_id, git_username = get_properties() + sentry_sdk.set_user({"id": dongle_id, "name": git_username}) + + +def get_properties() -> tuple[str, str]: + params = Params() + hardware_serial: str = params.get("HardwareSerial") or "" + git_username: str = params.get("GithubUsername") or "" + dongle_id: str = params.get("DongleId") or f"{UNREGISTERED_DONGLE_ID}-{hardware_serial}" + + return dongle_id, git_username + + +def init(project: SentryProject) -> bool: + if not _sentry_enabled(): + cloudlog.info("Sentry disabled, using local crash logging + konn3kt uploader") + return False + + build_metadata = get_build_metadata() + + env = build_metadata.channel_type + dongle_id, git_username = get_properties() + + integrations = [] + if project == SentryProject.SELFDRIVE: + integrations.append(ThreadingIntegration(propagate_hub=True)) + + sentry_sdk.init(project.value, + default_integrations=False, + release=get_version(), + integrations=integrations, + traces_sample_rate=1.0, + max_value_length=8192, + environment=env) + + sentry_sdk.set_user({"id": dongle_id, "name": git_username}) + sentry_sdk.set_tag("dirty", build_metadata.openpilot.is_dirty) + sentry_sdk.set_tag("origin", build_metadata.openpilot.git_origin) + sentry_sdk.set_tag("branch", build_metadata.channel) + sentry_sdk.set_tag("commit", build_metadata.openpilot.git_commit) + sentry_sdk.set_tag("device", HARDWARE.get_device_type()) + + return True diff --git a/iqpilot/system/tests/__init__.py b/iqpilot/system/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/tests/test_logmessaged.py b/iqpilot/system/tests/test_logmessaged.py new file mode 100644 index 000000000..0c8a88667 --- /dev/null +++ b/iqpilot/system/tests/test_logmessaged.py @@ -0,0 +1,94 @@ +import glob +import json +import os +import time + +import iqpilot.cereal.messaging as messaging +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog, ipchandler +from iqpilot.system.logmessaged import close_log_handler + + +def test_close_log_handler_tolerates_rollover_interruption(): + class InterruptedHandler: + def close(self): + raise ValueError + + close_log_handler(InterruptedHandler()) + + +class TestLogmessaged: + def setup_method(self): + managed_processes['logmessaged'].start() + ipchandler.close() + ipchandler.connect() + + self.sock = messaging.sub_sock("logMessage", timeout=1000, conflate=False) + self.error_sock = messaging.sub_sock("errorLogMessage", timeout=1000, conflate=False) + probe = f"logmessaged-ready-{time.monotonic_ns()}" + deadline = time.monotonic() + 3 + log_ready = error_ready = False + while not (log_ready and error_ready) and time.monotonic() < deadline: + cloudlog.error(probe) + time.sleep(0.05) + log_ready |= any(json.loads(event.logMessage)["msg"] == probe for event in messaging.drain_sock(self.sock)) + error_ready |= any(json.loads(event.errorLogMessage)["msg"] == probe for event in messaging.drain_sock(self.error_sock)) + assert log_ready and error_ready + + def teardown_method(self): + del self.sock + del self.error_sock + managed_processes['logmessaged'].stop(block=True) + + def _get_log_files(self): + return list(glob.glob(os.path.join(Paths.swaglog_root(), "swaglog.*"))) + + @staticmethod + def _collect_matching(sock, field, expected, count): + matches = [] + deadline = time.monotonic() + 2 + while len(matches) < count and time.monotonic() < deadline: + for event in messaging.drain_sock(sock): + if json.loads(getattr(event, field))["msg"] in expected: + matches.append(event) + time.sleep(0.01) + return matches + + def test_simple_log(self): + msgs = [f"abc {i}" for i in range(10)] + for m in msgs: + cloudlog.error(m) + m = self._collect_matching(self.sock, "logMessage", set(msgs), len(msgs)) + received = [json.loads(event.logMessage)["msg"] for event in m] + assert received[-len(msgs):] == msgs + assert len(self._get_log_files()) >= 1 + + def test_big_log(self): + n = 10 + msg = "a"*3*1024*1024 + initial_size = sum(os.path.getsize(f) for f in self._get_log_files()) + for _ in range(n): + cloudlog.info(msg) + + deadline = time.monotonic() + 3 + logsize = initial_size + while logsize - initial_size <= n * len(msg) and time.monotonic() < deadline: + time.sleep(0.01) + logsize = sum(os.path.getsize(f) for f in self._get_log_files()) + + msgs = messaging.drain_sock(self.sock) + assert len(msgs) == 0 + written = logsize - initial_size + assert n * len(msg) < written < n * (len(msg) + 1024) + + def test_large_log_below_publish_limit(self): + msg = "a" * (256 * 1024) + cloudlog.error(msg) + msgs = self._collect_matching(self.sock, "logMessage", {msg}, 1) + error_msgs = self._collect_matching(self.error_sock, "errorLogMessage", {msg}, 1) + + assert len(msgs) == 1 + assert json.loads(msgs[0].logMessage)["msg"] == msg + assert len(error_msgs) == 1 + assert json.loads(error_msgs[0].errorLogMessage)["msg"] == msg diff --git a/iqpilot/system/timed.py b/iqpilot/system/timed.py new file mode 100755 index 000000000..05fcb11be --- /dev/null +++ b/iqpilot/system/timed.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +import datetime +import subprocess +import time +from typing import NoReturn + +import iqpilot.cereal.messaging as messaging +from iqpilot.common.time_helpers import min_date, system_time_valid +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.params import Params +from iqpilot.common.gps import get_gps_location_service + + +def set_time(new_time): + diff = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) - new_time + if abs(diff) < datetime.timedelta(seconds=10): + cloudlog.debug(f"Time diff too small: {diff}") + return + + cloudlog.debug(f"Setting time to {new_time}") + try: + subprocess.run(f"TZ=UTC date -s '{new_time}'", shell=True, check=True) + except subprocess.CalledProcessError: + cloudlog.exception("timed.failed_setting_time") + + +def main() -> NoReturn: + """ + timed has two responsibilities: + - getting the current time from GPS + - publishing the time in the logs + + AGNOS will also use NTP to update the time. + """ + + params = Params() + gps_location_service = get_gps_location_service(params) + + pm = messaging.PubMaster(['clocks']) + sm = messaging.SubMaster([gps_location_service]) + while True: + sm.update(1000) + + msg = messaging.new_message('clocks') + msg.valid = system_time_valid() + msg.clocks.wallTimeNanos = time.time_ns() + pm.send('clocks', msg) + + gps = sm[gps_location_service] + gps_time = datetime.datetime.fromtimestamp(gps.unixTimestampMillis / 1000., datetime.UTC).replace(tzinfo=None) + if not sm.updated[gps_location_service] or (time.monotonic() - sm.logMonoTime[gps_location_service] / 1e9) > 2.0: + continue + if not gps.hasFix: + continue + if gps_time < min_date(): + continue + + set_time(gps_time) + time.sleep(10) + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/tombstoned.py b/iqpilot/system/tombstoned.py new file mode 100755 index 000000000..c7bef0ff8 --- /dev/null +++ b/iqpilot/system/tombstoned.py @@ -0,0 +1,176 @@ +#!/usr/bin/env python3 +import datetime +import os +import re +import shutil +import signal +import subprocess +import time +import glob +from typing import NoReturn + +import iqpilot.system.sentry as sentry +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.version import get_build_metadata + +MAX_SIZE = 1_000_000 * 100 # allow up to 100M +MAX_TOMBSTONE_FN_LEN = 62 # 85 - 23 ("/crash/") + +TOMBSTONE_DIR = "/data/tombstones/" +APPORT_DIR = "/var/crash/" + + +def safe_fn(s): + extra = ['_'] + return "".join(c for c in s if c.isalnum() or c in extra).rstrip() + + +def clear_apport_folder(): + for f in glob.glob(APPORT_DIR + '*'): + try: + os.remove(f) + except Exception: + pass + + +def get_apport_stacktrace(fn): + try: + cmd = f'apport-retrace -s <(cat <(echo "Package: openpilot") "{fn}")' + return subprocess.check_output(cmd, shell=True, encoding='utf8', timeout=30, executable='/bin/bash') + except subprocess.CalledProcessError: + return "Error getting stacktrace" + except subprocess.TimeoutExpired: + return "Timeout getting stacktrace" + + +def get_tombstones(): + """Returns list of (filename, ctime) for all crashlogs""" + files = [] + if os.path.exists(APPORT_DIR): + with os.scandir(APPORT_DIR) as d: + # Loop over first 1000 directory entries + for _, f in zip(range(1000), d, strict=False): + if f.name.startswith("tombstone"): + files.append((f.path, int(f.stat().st_ctime))) + elif f.name.endswith(".crash") and f.stat().st_mode == 0o100640: + files.append((f.path, int(f.stat().st_ctime))) + return files + + +def report_tombstone_apport(fn): + f_size = os.path.getsize(fn) + if f_size > MAX_SIZE: + cloudlog.error(f"Tombstone {fn} too big, {f_size}. Skipping...") + return + + message = "" # One line description of the crash + contents = "" # Full file contents without coredump + path = "" # File path relative to openpilot directory + + proc_maps = False + + with open(fn) as f: + for line in f: + if "CoreDump" in line: + break + elif "ProcMaps" in line: + proc_maps = True + elif "ProcStatus" in line: + proc_maps = False + + if not proc_maps: + contents += line + + if "ExecutablePath" in line: + path = line.strip().split(': ')[-1] + path = path.replace('/data/openpilot/', '') + message += path + elif "Signal" in line: + message += " - " + line.strip() + + try: + sig_num = int(line.strip().split(': ')[-1]) + message += " (" + signal.Signals(sig_num).name + ")" + except ValueError: + pass + + stacktrace = get_apport_stacktrace(fn) + stacktrace_s = stacktrace.split('\n') + crash_function = "No stacktrace" + + if len(stacktrace_s) > 2: + found = False + + # Try to find first entry in openpilot, fall back to first line + for line in stacktrace_s: + if "at selfdrive/" in line: + crash_function = line + found = True + break + + if not found: + crash_function = stacktrace_s[1] + + # Remove arguments that can contain pointers to make sentry one-liner unique + crash_function = " ".join(x for x in crash_function.split(' ')[1:] if not x.startswith('0x')) + crash_function = re.sub(r'\(.*?\)', '', crash_function) + + contents = stacktrace + "\n\n" + contents + message = message + " - " + crash_function + sentry.report_tombstone(fn, message, contents) + + # Copy crashlog to upload folder + clean_path = path.replace('/', '_') + date = datetime.datetime.now().strftime("%Y-%m-%d--%H-%M-%S") + + build_metadata = get_build_metadata() + + new_fn = f"{date}_{(build_metadata.openpilot.git_commit or 'nocommit')[:8]}_{safe_fn(clean_path)}"[:MAX_TOMBSTONE_FN_LEN] + + crashlog_dir = os.path.join(Paths.log_root(), "crash") + os.makedirs(crashlog_dir, exist_ok=True) + + # Files could be on different filesystems, copy, then delete + shutil.copy(fn, os.path.join(crashlog_dir, new_fn)) + + try: + os.remove(fn) + except PermissionError: + pass + + +def main() -> NoReturn: + should_report = sentry.init(sentry.SentryProject.SELFDRIVE_NATIVE) + + # Clear apport folder on start, otherwise duplicate crashes won't register + clear_apport_folder() + initial_tombstones = set(get_tombstones()) + + while True: + now_tombstones = set(get_tombstones()) + + for fn, _ in (now_tombstones - initial_tombstones): + # clear logs if we're not interested in them + if not should_report: + try: + os.remove(fn) + except Exception: + pass + continue + + try: + cloudlog.info(f"reporting new tombstone {fn}") + if fn.endswith(".crash"): + report_tombstone_apport(fn) + else: + cloudlog.error(f"unknown crash type: {fn}") + except Exception: + cloudlog.exception(f"Error reporting tombstone {fn}") + + initial_tombstones = now_tombstones + time.sleep(5) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ubloxd/binary_struct.py b/iqpilot/system/ubloxd/binary_struct.py new file mode 100644 index 000000000..7b229620a --- /dev/null +++ b/iqpilot/system/ubloxd/binary_struct.py @@ -0,0 +1,280 @@ +""" +Binary struct parsing DSL. + +Defines a declarative schema for binary messages using dataclasses +and type annotations. +""" + +import struct +from enum import Enum +from dataclasses import dataclass, is_dataclass +from typing import Annotated, Any, TypeVar, get_args, get_origin + + +class FieldType: + """Base class for field type descriptors.""" + + +@dataclass(frozen=True) +class IntType(FieldType): + bits: int + signed: bool + big_endian: bool = False + +@dataclass(frozen=True) +class FloatType(FieldType): + bits: int + +@dataclass(frozen=True) +class BitsType(FieldType): + bits: int + +@dataclass(frozen=True) +class BytesType(FieldType): + size: int + +@dataclass(frozen=True) +class ArrayType(FieldType): + element_type: Any + count_field: str + +@dataclass(frozen=True) +class SwitchType(FieldType): + selector: str + cases: dict[Any, Any] + default: Any = None + +@dataclass(frozen=True) +class EnumType(FieldType): + base_type: FieldType + enum_cls: type[Enum] + +@dataclass(frozen=True) +class ConstType(FieldType): + base_type: FieldType + expected: Any + +@dataclass(frozen=True) +class SubstreamType(FieldType): + length_field: str + element_type: Any + +# Common types - little endian +u8 = IntType(8, False) +u16 = IntType(16, False) +u32 = IntType(32, False) +s8 = IntType(8, True) +s16 = IntType(16, True) +s32 = IntType(32, True) +f32 = FloatType(32) +f64 = FloatType(64) +# Big endian variants +u16be = IntType(16, False, big_endian=True) +u32be = IntType(32, False, big_endian=True) +s16be = IntType(16, True, big_endian=True) +s32be = IntType(32, True, big_endian=True) + + +def bits(n: int) -> BitsType: + """Create a bit-level field type.""" + return BitsType(n) + +def bytes_field(size: int) -> BytesType: + """Create a fixed-size bytes field.""" + return BytesType(size) + +def array(element_type: Any, count_field: str) -> ArrayType: + """Create an array/repeated field.""" + return ArrayType(element_type, count_field) + +def switch(selector: str, cases: dict[Any, Any], default: Any = None) -> SwitchType: + """Create a switch-on field.""" + return SwitchType(selector, cases, default) + +def enum(base_type: Any, enum_cls: type[Enum]) -> EnumType: + """Create an enum-wrapped field.""" + field_type = _field_type_from_spec(base_type) + if field_type is None: + raise TypeError(f"Unsupported field type: {base_type!r}") + return EnumType(field_type, enum_cls) + +def const(base_type: Any, expected: Any) -> ConstType: + """Create a constant-value field.""" + field_type = _field_type_from_spec(base_type) + if field_type is None: + raise TypeError(f"Unsupported field type: {base_type!r}") + return ConstType(field_type, expected) + +def substream(length_field: str, element_type: Any) -> SubstreamType: + """Parse a fixed-length substream using an inner schema.""" + return SubstreamType(length_field, element_type) + + +class BinaryReader: + def __init__(self, data: bytes): + self.data = data + self.pos = 0 + self.bit_pos = 0 # 0-7, position within current byte + + def _require(self, n: int) -> None: + if self.pos + n > len(self.data): + raise EOFError("Unexpected end of data") + + def _read_struct(self, fmt: str): + self._align_to_byte() + size = struct.calcsize(fmt) + self._require(size) + value = struct.unpack_from(fmt, self.data, self.pos)[0] + self.pos += size + return value + + def read_bytes(self, n: int) -> bytes: + self._align_to_byte() + self._require(n) + result = self.data[self.pos : self.pos + n] + self.pos += n + return result + + def read_bits_int_be(self, n: int) -> int: + result = 0 + bits_remaining = n + while bits_remaining > 0: + if self.pos >= len(self.data): + raise EOFError("Unexpected end of data while reading bits") + bits_in_byte = 8 - self.bit_pos + bits_to_read = min(bits_remaining, bits_in_byte) + byte_val = self.data[self.pos] + shift = bits_in_byte - bits_to_read + mask = (1 << bits_to_read) - 1 + extracted = (byte_val >> shift) & mask + result = (result << bits_to_read) | extracted + self.bit_pos += bits_to_read + bits_remaining -= bits_to_read + if self.bit_pos >= 8: + self.bit_pos = 0 + self.pos += 1 + return result + + def _align_to_byte(self) -> None: + if self.bit_pos > 0: + self.bit_pos = 0 + self.pos += 1 + + +T = TypeVar('T', bound='BinaryStruct') + + +class BinaryStruct: + """Base class for binary struct definitions.""" + + def __init_subclass__(cls, **kwargs) -> None: + super().__init_subclass__(**kwargs) + if cls is BinaryStruct: + return + if not is_dataclass(cls): + dataclass(init=False)(cls) + fields = list(getattr(cls, '__annotations__', {}).items()) + cls.__binary_fields__ = fields # type: ignore[attr-defined] + + @classmethod + def _read(inner_cls, reader: BinaryReader): + obj = inner_cls.__new__(inner_cls) + for name, spec in inner_cls.__binary_fields__: + value = _parse_field(spec, reader, obj) + setattr(obj, name, value) + return obj + + cls._read = _read # type: ignore[attr-defined] + + @classmethod + def from_bytes(cls: type[T], data: bytes) -> T: + """Parse struct from bytes.""" + reader = BinaryReader(data) + return cls._read(reader) + + @classmethod + def _read(cls: type[T], reader: BinaryReader) -> T: + """Override in subclasses to implement parsing.""" + raise NotImplementedError + + +def _resolve_path(obj: Any, path: str) -> Any: + cur = obj + for part in path.split('.'): + cur = getattr(cur, part) + return cur + +def _unwrap_annotated(spec: Any) -> tuple[Any, ...]: + if get_origin(spec) is Annotated: + return get_args(spec)[1:] + return () + +def _field_type_from_spec(spec: Any) -> FieldType | None: + if isinstance(spec, FieldType): + return spec + for item in _unwrap_annotated(spec): + if isinstance(item, FieldType): + return item + return None + + +def _int_format(field_type: IntType) -> str: + if field_type.bits == 8: + return 'b' if field_type.signed else 'B' + endian = '>' if field_type.big_endian else '<' + if field_type.bits == 16: + code = 'h' if field_type.signed else 'H' + elif field_type.bits == 32: + code = 'i' if field_type.signed else 'I' + else: + raise ValueError(f"Unsupported integer size: {field_type.bits}") + return f"{endian}{code}" + +def _float_format(field_type: FloatType) -> str: + if field_type.bits == 32: + return ' Any: + field_type = _field_type_from_spec(spec) + if field_type is not None: + spec = field_type + if isinstance(spec, ConstType): + value = _parse_field(spec.base_type, reader, obj) + if value != spec.expected: + raise ValueError(f"Invalid constant: expected {spec.expected!r}, got {value!r}") + return value + if isinstance(spec, EnumType): + raw = _parse_field(spec.base_type, reader, obj) + try: + return spec.enum_cls(raw) + except ValueError: + return raw + if isinstance(spec, SwitchType): + key = _resolve_path(obj, spec.selector) + target = spec.cases.get(key, spec.default) + if target is None: + return None + return _parse_field(target, reader, obj) + if isinstance(spec, ArrayType): + count = _resolve_path(obj, spec.count_field) + return [_parse_field(spec.element_type, reader, obj) for _ in range(int(count))] + if isinstance(spec, SubstreamType): + length = _resolve_path(obj, spec.length_field) + data = reader.read_bytes(int(length)) + sub_reader = BinaryReader(data) + return _parse_field(spec.element_type, sub_reader, obj) + if isinstance(spec, IntType): + return reader._read_struct(_int_format(spec)) + if isinstance(spec, FloatType): + return reader._read_struct(_float_format(spec)) + if isinstance(spec, BitsType): + value = reader.read_bits_int_be(spec.bits) + return bool(value) if spec.bits == 1 else value + if isinstance(spec, BytesType): + return reader.read_bytes(spec.size) + if isinstance(spec, type) and issubclass(spec, BinaryStruct): + return spec._read(reader) + raise TypeError(f"Unsupported field spec: {spec!r}") diff --git a/iqpilot/system/ubloxd/glonass.py b/iqpilot/system/ubloxd/glonass.py new file mode 100644 index 000000000..5b0ba224a --- /dev/null +++ b/iqpilot/system/ubloxd/glonass.py @@ -0,0 +1,156 @@ +""" +Parses GLONASS navigation strings per GLONASS ICD specification. +http://gauss.gge.unb.ca/GLONASS.ICD.pdf +https://www.unavco.org/help/glossary/docs/ICD_GLONASS_4.0_(1998)_en.pdf +""" + +from typing import Annotated + +from iqpilot.system.ubloxd import binary_struct as bs + + +class Glonass(bs.BinaryStruct): + class String1(bs.BinaryStruct): + not_used: Annotated[int, bs.bits(2)] + p1: Annotated[int, bs.bits(2)] + t_k: Annotated[int, bs.bits(12)] + x_vel_sign: Annotated[bool, bs.bits(1)] + x_vel_value: Annotated[int, bs.bits(23)] + x_accel_sign: Annotated[bool, bs.bits(1)] + x_accel_value: Annotated[int, bs.bits(4)] + x_sign: Annotated[bool, bs.bits(1)] + x_value: Annotated[int, bs.bits(26)] + + @property + def x_vel(self) -> int: + """Computed x_vel from sign-magnitude representation.""" + return (self.x_vel_value * -1) if self.x_vel_sign else self.x_vel_value + + @property + def x_accel(self) -> int: + """Computed x_accel from sign-magnitude representation.""" + return (self.x_accel_value * -1) if self.x_accel_sign else self.x_accel_value + + @property + def x(self) -> int: + """Computed x from sign-magnitude representation.""" + return (self.x_value * -1) if self.x_sign else self.x_value + + class String2(bs.BinaryStruct): + b_n: Annotated[int, bs.bits(3)] + p2: Annotated[bool, bs.bits(1)] + t_b: Annotated[int, bs.bits(7)] + not_used: Annotated[int, bs.bits(5)] + y_vel_sign: Annotated[bool, bs.bits(1)] + y_vel_value: Annotated[int, bs.bits(23)] + y_accel_sign: Annotated[bool, bs.bits(1)] + y_accel_value: Annotated[int, bs.bits(4)] + y_sign: Annotated[bool, bs.bits(1)] + y_value: Annotated[int, bs.bits(26)] + + @property + def y_vel(self) -> int: + """Computed y_vel from sign-magnitude representation.""" + return (self.y_vel_value * -1) if self.y_vel_sign else self.y_vel_value + + @property + def y_accel(self) -> int: + """Computed y_accel from sign-magnitude representation.""" + return (self.y_accel_value * -1) if self.y_accel_sign else self.y_accel_value + + @property + def y(self) -> int: + """Computed y from sign-magnitude representation.""" + return (self.y_value * -1) if self.y_sign else self.y_value + + class String3(bs.BinaryStruct): + p3: Annotated[bool, bs.bits(1)] + gamma_n_sign: Annotated[bool, bs.bits(1)] + gamma_n_value: Annotated[int, bs.bits(10)] + not_used: Annotated[bool, bs.bits(1)] + p: Annotated[int, bs.bits(2)] + l_n: Annotated[bool, bs.bits(1)] + z_vel_sign: Annotated[bool, bs.bits(1)] + z_vel_value: Annotated[int, bs.bits(23)] + z_accel_sign: Annotated[bool, bs.bits(1)] + z_accel_value: Annotated[int, bs.bits(4)] + z_sign: Annotated[bool, bs.bits(1)] + z_value: Annotated[int, bs.bits(26)] + + @property + def gamma_n(self) -> int: + """Computed gamma_n from sign-magnitude representation.""" + return (self.gamma_n_value * -1) if self.gamma_n_sign else self.gamma_n_value + + @property + def z_vel(self) -> int: + """Computed z_vel from sign-magnitude representation.""" + return (self.z_vel_value * -1) if self.z_vel_sign else self.z_vel_value + + @property + def z_accel(self) -> int: + """Computed z_accel from sign-magnitude representation.""" + return (self.z_accel_value * -1) if self.z_accel_sign else self.z_accel_value + + @property + def z(self) -> int: + """Computed z from sign-magnitude representation.""" + return (self.z_value * -1) if self.z_sign else self.z_value + + class String4(bs.BinaryStruct): + tau_n_sign: Annotated[bool, bs.bits(1)] + tau_n_value: Annotated[int, bs.bits(21)] + delta_tau_n_sign: Annotated[bool, bs.bits(1)] + delta_tau_n_value: Annotated[int, bs.bits(4)] + e_n: Annotated[int, bs.bits(5)] + not_used_1: Annotated[int, bs.bits(14)] + p4: Annotated[bool, bs.bits(1)] + f_t: Annotated[int, bs.bits(4)] + not_used_2: Annotated[int, bs.bits(3)] + n_t: Annotated[int, bs.bits(11)] + n: Annotated[int, bs.bits(5)] + m: Annotated[int, bs.bits(2)] + + @property + def tau_n(self) -> int: + """Computed tau_n from sign-magnitude representation.""" + return (self.tau_n_value * -1) if self.tau_n_sign else self.tau_n_value + + @property + def delta_tau_n(self) -> int: + """Computed delta_tau_n from sign-magnitude representation.""" + return (self.delta_tau_n_value * -1) if self.delta_tau_n_sign else self.delta_tau_n_value + + class String5(bs.BinaryStruct): + n_a: Annotated[int, bs.bits(11)] + tau_c: Annotated[int, bs.bits(32)] + not_used: Annotated[bool, bs.bits(1)] + n_4: Annotated[int, bs.bits(5)] + tau_gps: Annotated[int, bs.bits(22)] + l_n: Annotated[bool, bs.bits(1)] + + class StringNonImmediate(bs.BinaryStruct): + data_1: Annotated[int, bs.bits(64)] + data_2: Annotated[int, bs.bits(8)] + + idle_chip: Annotated[bool, bs.bits(1)] + string_number: Annotated[int, bs.bits(4)] + data: Annotated[ + object, + bs.switch( + 'string_number', + { + 1: String1, + 2: String2, + 3: String3, + 4: String4, + 5: String5, + }, + default=StringNonImmediate, + ), + ] + hamming_code: Annotated[int, bs.bits(8)] + pad_1: Annotated[int, bs.bits(11)] + superframe_number: Annotated[int, bs.bits(16)] + pad_2: Annotated[int, bs.bits(8)] + frame_number: Annotated[int, bs.bits(8)] diff --git a/iqpilot/system/ubloxd/gps.py b/iqpilot/system/ubloxd/gps.py new file mode 100644 index 000000000..6115f363e --- /dev/null +++ b/iqpilot/system/ubloxd/gps.py @@ -0,0 +1,116 @@ +""" +Parses GPS navigation subframes per IS-GPS-200E specification. +https://www.gps.gov/technical/icwg/IS-GPS-200E.pdf +""" + +from typing import Annotated + +from iqpilot.system.ubloxd import binary_struct as bs + + +class Gps(bs.BinaryStruct): + class Tlm(bs.BinaryStruct): + preamble: Annotated[bytes, bs.const(bs.bytes_field(1), b"\x8b")] + tlm: Annotated[int, bs.bits(14)] + integrity_status: Annotated[bool, bs.bits(1)] + reserved: Annotated[bool, bs.bits(1)] + + class How(bs.BinaryStruct): + tow_count: Annotated[int, bs.bits(17)] + alert: Annotated[bool, bs.bits(1)] + anti_spoof: Annotated[bool, bs.bits(1)] + subframe_id: Annotated[int, bs.bits(3)] + reserved: Annotated[int, bs.bits(2)] + + class Subframe1(bs.BinaryStruct): + week_no: Annotated[int, bs.bits(10)] + code: Annotated[int, bs.bits(2)] + sv_accuracy: Annotated[int, bs.bits(4)] + sv_health: Annotated[int, bs.bits(6)] + iodc_msb: Annotated[int, bs.bits(2)] + l2_p_data_flag: Annotated[bool, bs.bits(1)] + reserved1: Annotated[int, bs.bits(23)] + reserved2: Annotated[int, bs.bits(24)] + reserved3: Annotated[int, bs.bits(24)] + reserved4: Annotated[int, bs.bits(16)] + t_gd: Annotated[int, bs.s8] + iodc_lsb: Annotated[int, bs.u8] + t_oc: Annotated[int, bs.u16be] + af_2: Annotated[int, bs.s8] + af_1: Annotated[int, bs.s16be] + af_0_sign: Annotated[bool, bs.bits(1)] + af_0_value: Annotated[int, bs.bits(21)] + reserved5: Annotated[int, bs.bits(2)] + + @property + def af_0(self) -> int: + """Computed af_0 from sign-magnitude representation.""" + return (self.af_0_value - (1 << 21)) if self.af_0_sign else self.af_0_value + + class Subframe2(bs.BinaryStruct): + iode: Annotated[int, bs.u8] + c_rs: Annotated[int, bs.s16be] + delta_n: Annotated[int, bs.s16be] + m_0: Annotated[int, bs.s32be] + c_uc: Annotated[int, bs.s16be] + e: Annotated[int, bs.s32be] + c_us: Annotated[int, bs.s16be] + sqrt_a: Annotated[int, bs.u32be] + t_oe: Annotated[int, bs.u16be] + fit_interval_flag: Annotated[bool, bs.bits(1)] + aoda: Annotated[int, bs.bits(5)] + reserved: Annotated[int, bs.bits(2)] + + class Subframe3(bs.BinaryStruct): + c_ic: Annotated[int, bs.s16be] + omega_0: Annotated[int, bs.s32be] + c_is: Annotated[int, bs.s16be] + i_0: Annotated[int, bs.s32be] + c_rc: Annotated[int, bs.s16be] + omega: Annotated[int, bs.s32be] + omega_dot_sign: Annotated[bool, bs.bits(1)] + omega_dot_value: Annotated[int, bs.bits(23)] + iode: Annotated[int, bs.u8] + idot_sign: Annotated[bool, bs.bits(1)] + idot_value: Annotated[int, bs.bits(13)] + reserved: Annotated[int, bs.bits(2)] + + @property + def omega_dot(self) -> int: + """Computed omega_dot from sign-magnitude representation.""" + return (self.omega_dot_value - (1 << 23)) if self.omega_dot_sign else self.omega_dot_value + + @property + def idot(self) -> int: + """Computed idot from sign-magnitude representation.""" + return (self.idot_value - (1 << 13)) if self.idot_sign else self.idot_value + + class Subframe4(bs.BinaryStruct): + class IonosphereData(bs.BinaryStruct): + a0: Annotated[int, bs.s8] + a1: Annotated[int, bs.s8] + a2: Annotated[int, bs.s8] + a3: Annotated[int, bs.s8] + b0: Annotated[int, bs.s8] + b1: Annotated[int, bs.s8] + b2: Annotated[int, bs.s8] + b3: Annotated[int, bs.s8] + + data_id: Annotated[int, bs.bits(2)] + page_id: Annotated[int, bs.bits(6)] + body: Annotated[object, bs.switch('page_id', {56: IonosphereData})] + + tlm: Tlm + how: How + body: Annotated[ + object, + bs.switch( + 'how.subframe_id', + { + 1: Subframe1, + 2: Subframe2, + 3: Subframe3, + 4: Subframe4, + }, + ), + ] diff --git a/iqpilot/system/ubloxd/pigeond.py b/iqpilot/system/ubloxd/pigeond.py new file mode 100755 index 000000000..8553969d2 --- /dev/null +++ b/iqpilot/system/ubloxd/pigeond.py @@ -0,0 +1,328 @@ +#!/usr/bin/env python3 +import os +import sys +import time +import signal +import serial +import struct +import requests +import urllib.parse +from datetime import datetime, UTC + +from iqpilot.cereal import messaging +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import TICI +from iqpilot.common.gpio import gpio_init, gpio_set +from iqpilot.system.hardware.tici.pins import GPIO + +UBLOX_TTY = "/dev/ttyHS0" + +UBLOX_ACK = b"\xb5\x62\x05\x01\x02\x00" +UBLOX_NACK = b"\xb5\x62\x05\x00\x02\x00" +UBLOX_SOS_ACK = b"\xb5\x62\x09\x14\x08\x00\x02\x00\x00\x00\x01\x00\x00\x00" +UBLOX_SOS_NACK = b"\xb5\x62\x09\x14\x08\x00\x02\x00\x00\x00\x00\x00\x00\x00" +UBLOX_BACKUP_RESTORE_MSG = b"\xb5\x62\x09\x14\x08\x00\x03" +UBLOX_ASSIST_ACK = b"\xb5\x62\x13\x60\x08\x00" + +# written by hephaestusd from konn3kt's /v1/{dongle_id}/assist proxy +ASSISTNOW_CACHE_PATH = "/data/agps/assistnow.ubx" +ASSISTNOW_CACHE_MAX_AGE = 2 * 60 * 60 # ephemeris expires after ~4h; stale data is worse than none + +def set_power(enabled: bool) -> None: + gpio_init(GPIO.UBLOX_SAFEBOOT_N, True) + gpio_init(GPIO.GNSS_PWR_EN, True) + gpio_init(GPIO.UBLOX_RST_N, True) + + gpio_set(GPIO.UBLOX_SAFEBOOT_N, True) + gpio_set(GPIO.GNSS_PWR_EN, enabled) + gpio_set(GPIO.UBLOX_RST_N, enabled) + +def add_ubx_checksum(msg: bytes) -> bytes: + A = B = 0 + for b in msg[2:]: + A = (A + b) % 256 + B = (B + A) % 256 + return msg + bytes([A, B]) + +def split_ubx_messages(dat: bytes) -> list[bytes]: + msgs = [] + while len(dat) > 0: + assert dat[:2] == b"\xB5\x62" + msg_len = 6 + (dat[5] << 8 | dat[4]) + 2 + msgs.append(dat[:msg_len]) + dat = dat[msg_len:] + return msgs + +def get_assistnow_messages(token: str) -> list[bytes]: + # make request + # TODO: implement adding the last known location + r = requests.get("https://online-live2.services.u-blox.com/GetOnlineData.ashx", params=urllib.parse.urlencode({ + 'token': token, + 'gnss': 'gps,glo', + 'datatype': 'eph,alm,aux', + }, safe=':,'), timeout=5) + assert r.status_code == 200, "Got invalid status code" + return split_ubx_messages(r.content) + +def get_cached_assistnow_messages() -> list[bytes]: + try: + if time.time() - os.path.getmtime(ASSISTNOW_CACHE_PATH) > ASSISTNOW_CACHE_MAX_AGE: + return [] + with open(ASSISTNOW_CACHE_PATH, "rb") as f: + dat = f.read() + except OSError: + return [] + return split_ubx_messages(dat) + + +class TTYPigeon: + def __init__(self): + self.tty = serial.VTIMESerial(UBLOX_TTY, baudrate=9600, timeout=0) + + def send(self, dat: bytes) -> None: + self.tty.write(dat) + + def receive(self) -> bytes: + dat = b'' + while len(dat) < 0x1000: + d = self.tty.read(0x40) + dat += d + if len(d) == 0: + break + return dat + + def set_baud(self, baud: int) -> None: + self.tty.baudrate = baud + + def wait_for_ack(self, ack: bytes = UBLOX_ACK, nack: bytes = UBLOX_NACK, timeout: float = 0.5) -> bool: + dat = b'' + st = time.monotonic() + while True: + dat += self.receive() + if ack in dat: + cloudlog.debug("Received ACK from ublox") + return True + elif nack in dat: + cloudlog.error("Received NACK from ublox") + return False + elif time.monotonic() - st > timeout: + cloudlog.error("No response from ublox") + raise TimeoutError('No response from ublox') + time.sleep(0.001) + + def send_with_ack(self, dat: bytes, ack: bytes = UBLOX_ACK, nack: bytes = UBLOX_NACK) -> None: + self.send(dat) + self.wait_for_ack(ack, nack) + + def wait_for_backup_restore_status(self, timeout: float = 1.) -> int: + dat = b'' + st = time.monotonic() + while True: + dat += self.receive() + position = dat.find(UBLOX_BACKUP_RESTORE_MSG) + if position >= 0 and len(dat) >= position + 11: + return dat[position + 10] + elif time.monotonic() - st > timeout: + cloudlog.error("No backup restore response from ublox") + raise TimeoutError('No response from ublox') + time.sleep(0.001) + + def reset_device(self) -> bool: + # deleting the backup does not always work on first try (mostly on second try) + for _ in range(5): + # device cold start + self.send(b"\xb5\x62\x06\x04\x04\x00\xff\xff\x00\x00\x0c\x5d") + time.sleep(1) # wait for cold start + init_baudrate(self) + + # clear configuration + self.send_with_ack(b"\xb5\x62\x06\x09\x0d\x00\x1f\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x71\xd7") + + # clear flash memory (almanac backup) + self.send_with_ack(b"\xB5\x62\x09\x14\x04\x00\x01\x00\x00\x00\x22\xf0") + + # try restoring backup to verify it got deleted + self.send(b"\xB5\x62\x09\x14\x00\x00\x1D\x60") + # 1: failed to restore, 2: could restore, 3: no backup + status = self.wait_for_backup_restore_status() + if status == 1 or status == 3: + return True + return False + +def save_almanac(pigeon: TTYPigeon) -> None: + # store almanac in flash + pigeon.send(b"\xB5\x62\x09\x14\x04\x00\x00\x00\x00\x00\x21\xEC") + try: + if pigeon.wait_for_ack(ack=UBLOX_SOS_ACK, nack=UBLOX_SOS_NACK): + cloudlog.info("Done storing almanac") + else: + cloudlog.error("Error storing almanac") + except TimeoutError: + pass + +def init_baudrate(pigeon: TTYPigeon): + # ublox default setting on startup is 9600 baudrate + pigeon.set_baud(9600) + + # $PUBX,41,1,0007,0003,460800,0*15\r\n + pigeon.send(b"\x24\x50\x55\x42\x58\x2C\x34\x31\x2C\x31\x2C\x30\x30\x30\x37\x2C\x30\x30\x30\x33\x2C\x34\x36\x30\x38\x30\x30\x2C\x30\x2A\x31\x35\x0D\x0A") + time.sleep(0.1) + pigeon.set_baud(460800) + + +def init_pigeon(pigeon: TTYPigeon) -> bool: + # try initializing a few times + for _ in range(10): + try: + + # setup port config + pigeon.send_with_ack(b"\xb5\x62\x06\x00\x14\x00\x03\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x1E\x7F") + pigeon.send_with_ack(b"\xb5\x62\x06\x00\x14\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x35") + pigeon.send_with_ack(b"\xb5\x62\x06\x00\x14\x00\x01\x00\x00\x00\xC0\x08\x00\x00\x00\x08\x07\x00\x01\x00\x01\x00\x00\x00\x00\x00\xF4\x80") + pigeon.send_with_ack(b"\xb5\x62\x06\x00\x14\x00\x04\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1D\x85") + pigeon.send_with_ack(b"\xb5\x62\x06\x00\x00\x00\x06\x18") + pigeon.send_with_ack(b"\xb5\x62\x06\x00\x01\x00\x01\x08\x22") + pigeon.send_with_ack(b"\xb5\x62\x06\x00\x01\x00\x03\x0A\x24") + + # UBX-CFG-RATE (0x06 0x08) + pigeon.send_with_ack(b"\xB5\x62\x06\x08\x06\x00\x64\x00\x01\x00\x00\x00\x79\x10") + + # UBX-CFG-NAV5 (0x06 0x24) + pigeon.send_with_ack(b"\xB5\x62\x06\x24\x24\x00\x05\x00\x04\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5A\x63") + + # UBX-CFG-ODO (0x06 0x1E) + pigeon.send_with_ack(b"\xB5\x62\x06\x1E\x14\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3C\x37") + pigeon.send_with_ack(b"\xB5\x62\x06\x39\x08\x00\xFF\xAD\x62\xAD\x1E\x63\x00\x00\x83\x0C") + pigeon.send_with_ack(b"\xB5\x62\x06\x23\x28\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x24") + + # UBX-CFG-NAV5 (0x06 0x24) + pigeon.send_with_ack(b"\xB5\x62\x06\x24\x00\x00\x2A\x84") + pigeon.send_with_ack(b"\xB5\x62\x06\x23\x00\x00\x29\x81") + pigeon.send_with_ack(b"\xB5\x62\x06\x1E\x00\x00\x24\x72") + pigeon.send_with_ack(b"\xB5\x62\x06\x39\x00\x00\x3F\xC3") + + # UBX-CFG-MSG (set message rate) + pigeon.send_with_ack(b"\xB5\x62\x06\x01\x03\x00\x01\x07\x01\x13\x51") + pigeon.send_with_ack(b"\xB5\x62\x06\x01\x03\x00\x02\x15\x01\x22\x70") + pigeon.send_with_ack(b"\xB5\x62\x06\x01\x03\x00\x02\x13\x01\x20\x6C") + pigeon.send_with_ack(b"\xB5\x62\x06\x01\x03\x00\x0A\x09\x01\x1E\x70") + pigeon.send_with_ack(b"\xB5\x62\x06\x01\x03\x00\x0A\x0B\x01\x20\x74") + pigeon.send_with_ack(b"\xB5\x62\x06\x01\x03\x00\x01\x35\x01\x41\xAD") + cloudlog.debug("pigeon configured") + + # try restoring almanac backup + pigeon.send(b"\xB5\x62\x09\x14\x00\x00\x1D\x60") + restore_status = pigeon.wait_for_backup_restore_status() + if restore_status == 2: + cloudlog.warning("almanac backup restored") + elif restore_status == 3: + cloudlog.warning("no almanac backup found") + else: + cloudlog.error(f"failed to restore almanac backup, status: {restore_status}") + + # sending time to ublox + if system_time_valid(): + t_now = datetime.now(UTC).replace(tzinfo=None) + cloudlog.warning("Sending current time to ublox") + + # UBX-MGA-INI-TIME_UTC + msg = add_ubx_checksum(b"\xB5\x62\x13\x40\x18\x00" + struct.pack(" None: + # register exit handler + signal.signal(signal.SIGINT, lambda sig, frame: deinitialize_and_exit(pigeon)) + + # power cycle ublox + set_power(False) + time.sleep(0.1) + set_power(True) + time.sleep(0.5) + + init_baudrate(pigeon) + init_pigeon(pigeon) + +def run_receiving(duration: int = 0): + pm = messaging.PubMaster(['ubloxRaw']) + + pigeon = TTYPigeon() + init(pigeon) + + start_time = time.monotonic() + last_almanac_save = time.monotonic() + while (duration == 0) or (time.monotonic() - start_time < duration): + dat = pigeon.receive() + if len(dat) > 0: + if dat[0] == 0x00: + cloudlog.warning("received invalid data from ublox, re-initing!") + init(pigeon) + continue + + # send out to socket + msg = messaging.new_message('ubloxRaw', len(dat), valid=True) + msg.ubloxRaw = dat[:] + pm.send('ubloxRaw', msg) + + # save almanac every 5 minutes + if (time.monotonic() - last_almanac_save) > 60*5: + save_almanac(pigeon) + last_almanac_save = time.monotonic() + else: + # prevent locking up a CPU core if ublox disconnects + time.sleep(0.001) + + +def main(): + assert TICI, "unsupported hardware for pigeond" + run_receiving() + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ubloxd/tests/test_pigeond.py b/iqpilot/system/ubloxd/tests/test_pigeond.py new file mode 100644 index 000000000..84120a472 --- /dev/null +++ b/iqpilot/system/ubloxd/tests/test_pigeond.py @@ -0,0 +1,54 @@ +import pytest +import time + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.gpio import gpio_read +from iqpilot.selfdrive.test.helpers import with_processes +from iqpilot.system.manager.process_config import managed_processes +from iqpilot.system.hardware.tici.pins import GPIO + + +# TODO: test TTFF when we have good A-GNSS +@pytest.mark.tici +class TestPigeond: + + def teardown_method(self): + managed_processes['pigeond'].stop() + + @with_processes(['pigeond']) + def test_frequency(self): + sm = messaging.SubMaster(['ubloxRaw']) + + # setup time + for _ in range(int(5 * SERVICE_LIST['ubloxRaw'].frequency)): + sm.update() + + for _ in range(int(10 * SERVICE_LIST['ubloxRaw'].frequency)): + sm.update() + assert sm.all_checks() + + def test_startup_time(self): + for _ in range(5): + sm = messaging.SubMaster(['ubloxRaw']) + managed_processes['pigeond'].start() + + start_time = time.monotonic() + for __ in range(10): + sm.update(1 * 1000) + if sm.updated['ubloxRaw']: + break + assert sm.recv_frame['ubloxRaw'] > 0, "pigeond didn't start outputting messages in time" + + et = time.monotonic() - start_time + assert et < 5, f"pigeond took {et:.1f}s to start" + managed_processes['pigeond'].stop() + + def test_turns_off_ublox(self): + for s in (0.1, 0.5, 1, 5): + managed_processes['pigeond'].start() + time.sleep(s) + managed_processes['pigeond'].stop() + + assert gpio_read(GPIO.UBLOX_RST_N) == 0 + assert gpio_read(GPIO.GNSS_PWR_EN) == 0 diff --git a/iqpilot/system/ubloxd/ubloxd.py b/iqpilot/system/ubloxd/ubloxd.py new file mode 100755 index 000000000..7fe003b1e --- /dev/null +++ b/iqpilot/system/ubloxd/ubloxd.py @@ -0,0 +1,534 @@ +#!/usr/bin/env python3 +import math +import capnp +import calendar +import numpy as np +from collections import defaultdict +from dataclasses import dataclass + +from iqpilot.cereal import log +from iqpilot.cereal import messaging +from iqpilot.system.ubloxd.ubx import Ubx +from iqpilot.system.ubloxd.gps import Gps +from iqpilot.system.ubloxd.glonass import Glonass + + +SECS_IN_MIN = 60 +SECS_IN_HR = 60 * SECS_IN_MIN +SECS_IN_DAY = 24 * SECS_IN_HR +SECS_IN_WEEK = 7 * SECS_IN_DAY + + +class UbxFramer: + PREAMBLE1 = 0xB5 + PREAMBLE2 = 0x62 + HEADER_SIZE = 6 + CHECKSUM_SIZE = 2 + + def __init__(self) -> None: + self.buf = bytearray() + self.last_log_time = 0.0 + + def reset(self) -> None: + self.buf.clear() + + @staticmethod + def _checksum_ok(frame: bytes) -> bool: + ck_a = 0 + ck_b = 0 + for b in frame[2:-2]: + ck_a = (ck_a + b) & 0xFF + ck_b = (ck_b + ck_a) & 0xFF + return ck_a == frame[-2] and ck_b == frame[-1] + + def add_data(self, log_time: float, incoming: bytes) -> list[bytes]: + self.last_log_time = log_time + out: list[bytes] = [] + if not incoming: + return out + self.buf += incoming + + while True: + # find preamble + if len(self.buf) < 2: + break + start = self.buf.find(b"\xb5\x62") + if start < 0: + # no preamble in buffer + self.buf.clear() + break + if start > 0: + # drop garbage before preamble + self.buf = self.buf[start:] + + if len(self.buf) < self.HEADER_SIZE: + break + + length_le = int.from_bytes(self.buf[4:6], 'little', signed=False) + total_len = self.HEADER_SIZE + length_le + self.CHECKSUM_SIZE + if len(self.buf) < total_len: + break + + candidate = bytes(self.buf[:total_len]) + if self._checksum_ok(candidate): + out.append(candidate) + # consume this frame + self.buf = self.buf[total_len:] + else: + # drop first byte and retry + self.buf = self.buf[1:] + + return out + + +def _bit(b: int, shift: int) -> bool: + return (b & (1 << shift)) != 0 + + +@dataclass +class EphemerisCaches: + gps_subframes: defaultdict[int, dict[int, bytes]] + glonass_strings: defaultdict[int, dict[int, bytes]] + glonass_string_times: defaultdict[int, dict[int, float]] + glonass_string_superframes: defaultdict[int, dict[int, int]] + + +class UbloxMsgParser: + gpsPi = 3.1415926535898 + + # user range accuracy in meters + glonass_URA_lookup: dict[int, float] = { + 0: 1, + 1: 2, + 2: 2.5, + 3: 4, + 4: 5, + 5: 7, + 6: 10, + 7: 12, + 8: 14, + 9: 16, + 10: 32, + 11: 64, + 12: 128, + 13: 256, + 14: 512, + 15: 1024, + } + + def __init__(self) -> None: + self.framer = UbxFramer() + self.caches = EphemerisCaches( + gps_subframes=defaultdict(dict), + glonass_strings=defaultdict(dict), + glonass_string_times=defaultdict(dict), + glonass_string_superframes=defaultdict(dict), + ) + + # Message generation entry point + def parse_frame(self, frame: bytes) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder] | None: + # Quick header parse + msg_type = int.from_bytes(frame[2:4], 'big') + payload = frame[6:-2] + if msg_type == 0x0107: + body = Ubx.NavPvt.from_bytes(payload) + return self._gen_nav_pvt(body) + if msg_type == 0x0213: + # Manually parse RXM-SFRBX to avoid EOF on some frames + if len(payload) < 8: + return None + gnss_id = payload[0] + sv_id = payload[1] + freq_id = payload[3] + num_words = payload[4] + exp = 8 + 4 * num_words + if exp != len(payload): + return None + words: list[int] = [] + off = 8 + for _ in range(num_words): + words.append(int.from_bytes(payload[off : off + 4], 'little')) + off += 4 + + class _SfrbxView: + def __init__(self, gid: int, sid: int, fid: int, body: list[int]): + self.gnss_id = Ubx.GnssType(gid) + self.sv_id = sid + self.freq_id = fid + self.body = body + + view = _SfrbxView(gnss_id, sv_id, freq_id, words) + return self._gen_rxm_sfrbx(view) + if msg_type == 0x0215: + body = Ubx.RxmRawx.from_bytes(payload) + return self._gen_rxm_rawx(body) + if msg_type == 0x0A09: + body = Ubx.MonHw.from_bytes(payload) + return self._gen_mon_hw(body) + if msg_type == 0x0A0B: + body = Ubx.MonHw2.from_bytes(payload) + return self._gen_mon_hw2(body) + if msg_type == 0x0135: + body = Ubx.NavSat.from_bytes(payload) + return self._gen_nav_sat(body) + return None + + # NAV-PVT -> gpsLocationExternal + def _gen_nav_pvt(self, msg: Ubx.NavPvt) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder]: + dat = messaging.new_message('gpsLocationExternal', valid=True) + gps = dat.gpsLocationExternal + gps.source = log.GpsLocationData.SensorSource.ublox + gps.flags = msg.flags + gps.hasFix = (msg.flags % 2) == 1 + gps.latitude = msg.lat * 1e-07 + gps.longitude = msg.lon * 1e-07 + gps.altitude = msg.height * 1e-03 + gps.speed = msg.g_speed * 1e-03 + gps.bearingDeg = msg.head_mot * 1e-5 + gps.horizontalAccuracy = msg.h_acc * 1e-03 + gps.satelliteCount = msg.num_sv + + # build UTC timestamp millis (NAV-PVT is in UTC) + # tolerate invalid or unset date values like C++ timegm + try: + utc_tt = calendar.timegm((msg.year, msg.month, msg.day, msg.hour, msg.min, msg.sec, 0, 0, 0)) + except Exception: + utc_tt = 0 + gps.unixTimestampMillis = int(utc_tt * 1e3 + (msg.nano * 1e-6)) + + # match C++ float32 rounding semantics exactly + gps.vNED = [ + float(np.float32(msg.vel_n) * np.float32(1e-03)), + float(np.float32(msg.vel_e) * np.float32(1e-03)), + float(np.float32(msg.vel_d) * np.float32(1e-03)), + ] + gps.verticalAccuracy = msg.v_acc * 1e-03 + gps.speedAccuracy = msg.s_acc * 1e-03 + gps.bearingAccuracyDeg = msg.head_acc * 1e-05 + return ('gpsLocationExternal', dat) + + # RXM-SFRBX dispatch to GPS or GLONASS ephemeris + def _gen_rxm_sfrbx(self, msg) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder] | None: + if msg.gnss_id == Ubx.GnssType.gps: + return self._parse_gps_ephemeris(msg) + if msg.gnss_id == Ubx.GnssType.glonass: + return self._parse_glonass_ephemeris(msg) + return None + + def _parse_gps_ephemeris(self, msg: Ubx.RxmSfrbx) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder] | None: + # body is list of 10 words; convert to 30-byte subframe (strip parity/padding) + body = msg.body + if len(body) != 10: + return None + subframe_data = bytearray() + for word in body: + word >>= 6 + subframe_data.append((word >> 16) & 0xFF) + subframe_data.append((word >> 8) & 0xFF) + subframe_data.append(word & 0xFF) + + sf = Gps.from_bytes(bytes(subframe_data)) + subframe_id = sf.how.subframe_id + if subframe_id < 1 or subframe_id > 3: + return None + self.caches.gps_subframes[msg.sv_id][subframe_id] = bytes(subframe_data) + + if len(self.caches.gps_subframes[msg.sv_id]) != 3: + return None + + dat = messaging.new_message('ubloxGnss', valid=True) + eph = dat.ubloxGnss.init('ephemeris') + eph.svId = msg.sv_id + + iode_s2 = 0 + iode_s3 = 0 + iodc_lsb = 0 + week = 0 + + # Subframe 1 + sf1 = Gps.from_bytes(self.caches.gps_subframes[msg.sv_id][1]) + s1 = sf1.body + assert isinstance(s1, Gps.Subframe1) + week = s1.week_no + week += 1024 + if week < 1877: + week += 1024 + eph.tgd = s1.t_gd * math.pow(2, -31) + eph.toc = s1.t_oc * math.pow(2, 4) + eph.af2 = s1.af_2 * math.pow(2, -55) + eph.af1 = s1.af_1 * math.pow(2, -43) + eph.af0 = s1.af_0 * math.pow(2, -31) + eph.svHealth = s1.sv_health + eph.towCount = sf1.how.tow_count + iodc_lsb = s1.iodc_lsb + + # Subframe 2 + sf2 = Gps.from_bytes(self.caches.gps_subframes[msg.sv_id][2]) + s2 = sf2.body + assert isinstance(s2, Gps.Subframe2) + if s2.t_oe == 0 and sf2.how.tow_count * 6 >= (SECS_IN_WEEK - 2 * SECS_IN_HR): + week += 1 + eph.crs = s2.c_rs * math.pow(2, -5) + eph.deltaN = s2.delta_n * math.pow(2, -43) * self.gpsPi + eph.m0 = s2.m_0 * math.pow(2, -31) * self.gpsPi + eph.cuc = s2.c_uc * math.pow(2, -29) + eph.ecc = s2.e * math.pow(2, -33) + eph.cus = s2.c_us * math.pow(2, -29) + eph.a = math.pow(s2.sqrt_a * math.pow(2, -19), 2.0) + eph.toe = s2.t_oe * math.pow(2, 4) + iode_s2 = s2.iode + + # Subframe 3 + sf3 = Gps.from_bytes(self.caches.gps_subframes[msg.sv_id][3]) + s3 = sf3.body + assert isinstance(s3, Gps.Subframe3) + eph.cic = s3.c_ic * math.pow(2, -29) + eph.omega0 = s3.omega_0 * math.pow(2, -31) * self.gpsPi + eph.cis = s3.c_is * math.pow(2, -29) + eph.i0 = s3.i_0 * math.pow(2, -31) * self.gpsPi + eph.crc = s3.c_rc * math.pow(2, -5) + eph.omega = s3.omega * math.pow(2, -31) * self.gpsPi + eph.omegaDot = s3.omega_dot * math.pow(2, -43) * self.gpsPi + eph.iode = s3.iode + eph.iDot = s3.idot * math.pow(2, -43) * self.gpsPi + iode_s3 = s3.iode + + eph.toeWeek = week + eph.tocWeek = week + + # clear cache for this SV + self.caches.gps_subframes[msg.sv_id].clear() + if not (iodc_lsb == iode_s2 == iode_s3): + return None + return ('ubloxGnss', dat) + + def _parse_glonass_ephemeris(self, msg: Ubx.RxmSfrbx) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder] | None: + # words are 4 bytes each; Glonass parser expects 16 bytes (string) + body = msg.body + if len(body) != 4: + return None + string_bytes = bytearray() + for word in body: + for i in (3, 2, 1, 0): + string_bytes.append((word >> (8 * i)) & 0xFF) + + gl = Glonass.from_bytes(bytes(string_bytes)) + string_number = gl.string_number + if string_number < 1 or string_number > 5 or gl.idle_chip: + return None + + # correlate by superframe and timing, similar to C++ logic + freq_id = msg.freq_id + superframe_unknown = False + needs_clear = False + for i in range(1, 6): + if i not in self.caches.glonass_strings[freq_id]: + continue + sf_prev = self.caches.glonass_string_superframes[freq_id].get(i, 0) + if sf_prev == 0 or gl.superframe_number == 0: + superframe_unknown = True + elif sf_prev != gl.superframe_number: + needs_clear = True + if superframe_unknown: + prev_time = self.caches.glonass_string_times[freq_id].get(i, 0.0) + if abs((prev_time - 2.0 * i) - (self.framer.last_log_time - 2.0 * string_number)) > 10: + needs_clear = True + + if needs_clear: + self.caches.glonass_strings[freq_id].clear() + self.caches.glonass_string_superframes[freq_id].clear() + self.caches.glonass_string_times[freq_id].clear() + + self.caches.glonass_strings[freq_id][string_number] = bytes(string_bytes) + self.caches.glonass_string_superframes[freq_id][string_number] = gl.superframe_number + self.caches.glonass_string_times[freq_id][string_number] = self.framer.last_log_time + + if msg.sv_id == 255: + # unknown SV id + return None + if len(self.caches.glonass_strings[freq_id]) != 5: + return None + + dat = messaging.new_message('ubloxGnss', valid=True) + eph = dat.ubloxGnss.init('glonassEphemeris') + eph.svId = msg.sv_id + eph.freqNum = msg.freq_id - 7 + + current_day = 0 + tk = 0 + + # string 1 + try: + s1 = Glonass.from_bytes(self.caches.glonass_strings[freq_id][1]).data + except Exception: + return None + assert isinstance(s1, Glonass.String1) + eph.p1 = int(s1.p1) + tk = int(s1.t_k) + eph.tkDEPRECATED = tk + eph.xVel = float(s1.x_vel) * math.pow(2, -20) + eph.xAccel = float(s1.x_accel) * math.pow(2, -30) + eph.x = float(s1.x) * math.pow(2, -11) + + # string 2 + try: + s2 = Glonass.from_bytes(self.caches.glonass_strings[freq_id][2]).data + except Exception: + return None + assert isinstance(s2, Glonass.String2) + eph.svHealth = int(s2.b_n >> 2) + eph.p2 = int(s2.p2) + eph.tb = int(s2.t_b) + eph.yVel = float(s2.y_vel) * math.pow(2, -20) + eph.yAccel = float(s2.y_accel) * math.pow(2, -30) + eph.y = float(s2.y) * math.pow(2, -11) + + # string 3 + try: + s3 = Glonass.from_bytes(self.caches.glonass_strings[freq_id][3]).data + except Exception: + return None + assert isinstance(s3, Glonass.String3) + eph.p3 = int(s3.p3) + eph.gammaN = float(s3.gamma_n) * math.pow(2, -40) + eph.svHealth = int(eph.svHealth | (1 if s3.l_n else 0)) + eph.zVel = float(s3.z_vel) * math.pow(2, -20) + eph.zAccel = float(s3.z_accel) * math.pow(2, -30) + eph.z = float(s3.z) * math.pow(2, -11) + + # string 4 + try: + s4 = Glonass.from_bytes(self.caches.glonass_strings[freq_id][4]).data + except Exception: + return None + assert isinstance(s4, Glonass.String4) + current_day = int(s4.n_t) + eph.nt = current_day + eph.tauN = float(s4.tau_n) * math.pow(2, -30) + eph.deltaTauN = float(s4.delta_tau_n) * math.pow(2, -30) + eph.age = int(s4.e_n) + eph.p4 = int(s4.p4) + eph.svURA = float(self.glonass_URA_lookup.get(int(s4.f_t), 0.0)) + # consistency check: SV slot number + # if it doesn't match, keep going but note mismatch (no logging here) + eph.svType = int(s4.m) + + # string 5 + try: + s5 = Glonass.from_bytes(self.caches.glonass_strings[freq_id][5]).data + except Exception: + return None + assert isinstance(s5, Glonass.String5) + eph.n4 = int(s5.n_4) + tk_seconds = int(SECS_IN_HR * ((tk >> 7) & 0x1F) + SECS_IN_MIN * ((tk >> 1) & 0x3F) + (tk & 0x1) * 30) + eph.tkSeconds = tk_seconds + + self.caches.glonass_strings[freq_id].clear() + return ('ubloxGnss', dat) + + def _gen_rxm_rawx(self, msg: Ubx.RxmRawx) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder]: + dat = messaging.new_message('ubloxGnss', valid=True) + mr = dat.ubloxGnss.init('measurementReport') + mr.rcvTow = msg.rcv_tow + mr.gpsWeek = msg.week + mr.leapSeconds = msg.leap_s + + mb = mr.init('measurements', msg.num_meas) + for i, m in enumerate(msg.meas): + mb[i].svId = m.sv_id + mb[i].pseudorange = m.pr_mes + mb[i].carrierCycles = m.cp_mes + mb[i].doppler = m.do_mes + mb[i].gnssId = int(m.gnss_id.value) + mb[i].glonassFrequencyIndex = m.freq_id + mb[i].locktime = m.lock_time + mb[i].cno = m.cno + mb[i].pseudorangeStdev = 0.01 * (math.pow(2, (m.pr_stdev & 15))) + mb[i].carrierPhaseStdev = 0.004 * (m.cp_stdev & 15) + mb[i].dopplerStdev = 0.002 * (math.pow(2, (m.do_stdev & 15))) + + ts = mb[i].init('trackingStatus') + trk = m.trk_stat + ts.pseudorangeValid = _bit(trk, 0) + ts.carrierPhaseValid = _bit(trk, 1) + ts.halfCycleValid = _bit(trk, 2) + ts.halfCycleSubtracted = _bit(trk, 3) + + mr.numMeas = msg.num_meas + rs = mr.init('receiverStatus') + rs.leapSecValid = _bit(msg.rec_stat, 0) + rs.clkReset = _bit(msg.rec_stat, 2) + return ('ubloxGnss', dat) + + def _gen_nav_sat(self, msg: Ubx.NavSat) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder]: + dat = messaging.new_message('ubloxGnss', valid=True) + sr = dat.ubloxGnss.init('satReport') + sr.iTow = msg.itow + svs = sr.init('svs', msg.num_svs) + for i, s in enumerate(msg.svs): + svs[i].svId = s.sv_id + svs[i].gnssId = int(s.gnss_id.value) + svs[i].flagsBitfield = s.flags + svs[i].cno = s.cno + svs[i].elevationDeg = s.elev + svs[i].azimuthDeg = s.azim + svs[i].pseudorangeResidual = s.pr_res * 0.1 + return ('ubloxGnss', dat) + + def _gen_mon_hw(self, msg: Ubx.MonHw) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder]: + dat = messaging.new_message('ubloxGnss', valid=True) + hw = dat.ubloxGnss.init('hwStatus') + hw.noisePerMS = msg.noise_per_ms + hw.flags = msg.flags + hw.agcCnt = msg.agc_cnt + hw.aStatus = int(msg.a_status.value) + hw.aPower = int(msg.a_power.value) + hw.jamInd = msg.jam_ind + return ('ubloxGnss', dat) + + def _gen_mon_hw2(self, msg: Ubx.MonHw2) -> tuple[str, capnp.lib.capnp._DynamicStructBuilder]: + dat = messaging.new_message('ubloxGnss', valid=True) + hw = dat.ubloxGnss.init('hwStatus2') + hw.ofsI = msg.ofs_i + hw.magI = msg.mag_i + hw.ofsQ = msg.ofs_q + hw.magQ = msg.mag_q + # Map Ubx enum to cereal enum {undefined=0, rom=1, otp=2, configpins=3, flash=4} + cfg_map = { + Ubx.MonHw2.ConfigSource.rom: 1, + Ubx.MonHw2.ConfigSource.otp: 2, + Ubx.MonHw2.ConfigSource.config_pins: 3, + Ubx.MonHw2.ConfigSource.flash: 4, + } + hw.cfgSource = cfg_map.get(msg.cfg_source, 0) + hw.lowLevCfg = msg.low_lev_cfg + hw.postStatus = msg.post_status + return ('ubloxGnss', dat) + + +def main(): + parser = UbloxMsgParser() + pm = messaging.PubMaster(['ubloxGnss', 'gpsLocationExternal']) + sock = messaging.sub_sock('ubloxRaw', timeout=100, conflate=False) + + while True: + msg = messaging.recv_one(sock) + if msg is None: + continue + + data = bytes(msg.ubloxRaw) + log_time = msg.logMonoTime * 1e-9 + frames = parser.framer.add_data(log_time, data) + for frame in frames: + try: + res = parser.parse_frame(frame) + except Exception: + continue + if not res: + continue + service, dat = res + pm.send(service, dat) + + +if __name__ == '__main__': + main() diff --git a/iqpilot/system/ubloxd/ubx.py b/iqpilot/system/ubloxd/ubx.py new file mode 100644 index 000000000..90cef0191 --- /dev/null +++ b/iqpilot/system/ubloxd/ubx.py @@ -0,0 +1,180 @@ +""" +UBX protocol parser +""" + +from enum import IntEnum +from typing import Annotated + +from iqpilot.system.ubloxd import binary_struct as bs + + +class GnssType(IntEnum): + gps = 0 + sbas = 1 + galileo = 2 + beidou = 3 + imes = 4 + qzss = 5 + glonass = 6 + + +class Ubx(bs.BinaryStruct): + GnssType = GnssType + + class RxmRawx(bs.BinaryStruct): + class Measurement(bs.BinaryStruct): + pr_mes: Annotated[float, bs.f64] + cp_mes: Annotated[float, bs.f64] + do_mes: Annotated[float, bs.f32] + gnss_id: Annotated[GnssType | int, bs.enum(bs.u8, GnssType)] + sv_id: Annotated[int, bs.u8] + reserved2: Annotated[bytes, bs.bytes_field(1)] + freq_id: Annotated[int, bs.u8] + lock_time: Annotated[int, bs.u16] + cno: Annotated[int, bs.u8] + pr_stdev: Annotated[int, bs.u8] + cp_stdev: Annotated[int, bs.u8] + do_stdev: Annotated[int, bs.u8] + trk_stat: Annotated[int, bs.u8] + reserved3: Annotated[bytes, bs.bytes_field(1)] + + rcv_tow: Annotated[float, bs.f64] + week: Annotated[int, bs.u16] + leap_s: Annotated[int, bs.s8] + num_meas: Annotated[int, bs.u8] + rec_stat: Annotated[int, bs.u8] + reserved1: Annotated[bytes, bs.bytes_field(3)] + meas: Annotated[list[Measurement], bs.array(Measurement, count_field='num_meas')] + + class RxmSfrbx(bs.BinaryStruct): + gnss_id: Annotated[GnssType | int, bs.enum(bs.u8, GnssType)] + sv_id: Annotated[int, bs.u8] + reserved1: Annotated[bytes, bs.bytes_field(1)] + freq_id: Annotated[int, bs.u8] + num_words: Annotated[int, bs.u8] + reserved2: Annotated[bytes, bs.bytes_field(1)] + version: Annotated[int, bs.u8] + reserved3: Annotated[bytes, bs.bytes_field(1)] + body: Annotated[list[int], bs.array(bs.u32, count_field='num_words')] + + class NavSat(bs.BinaryStruct): + class Nav(bs.BinaryStruct): + gnss_id: Annotated[GnssType | int, bs.enum(bs.u8, GnssType)] + sv_id: Annotated[int, bs.u8] + cno: Annotated[int, bs.u8] + elev: Annotated[int, bs.s8] + azim: Annotated[int, bs.s16] + pr_res: Annotated[int, bs.s16] + flags: Annotated[int, bs.u32] + + itow: Annotated[int, bs.u32] + version: Annotated[int, bs.u8] + num_svs: Annotated[int, bs.u8] + reserved: Annotated[bytes, bs.bytes_field(2)] + svs: Annotated[list[Nav], bs.array(Nav, count_field='num_svs')] + + class NavPvt(bs.BinaryStruct): + i_tow: Annotated[int, bs.u32] + year: Annotated[int, bs.u16] + month: Annotated[int, bs.u8] + day: Annotated[int, bs.u8] + hour: Annotated[int, bs.u8] + min: Annotated[int, bs.u8] + sec: Annotated[int, bs.u8] + valid: Annotated[int, bs.u8] + t_acc: Annotated[int, bs.u32] + nano: Annotated[int, bs.s32] + fix_type: Annotated[int, bs.u8] + flags: Annotated[int, bs.u8] + flags2: Annotated[int, bs.u8] + num_sv: Annotated[int, bs.u8] + lon: Annotated[int, bs.s32] + lat: Annotated[int, bs.s32] + height: Annotated[int, bs.s32] + h_msl: Annotated[int, bs.s32] + h_acc: Annotated[int, bs.u32] + v_acc: Annotated[int, bs.u32] + vel_n: Annotated[int, bs.s32] + vel_e: Annotated[int, bs.s32] + vel_d: Annotated[int, bs.s32] + g_speed: Annotated[int, bs.s32] + head_mot: Annotated[int, bs.s32] + s_acc: Annotated[int, bs.s32] + head_acc: Annotated[int, bs.u32] + p_dop: Annotated[int, bs.u16] + flags3: Annotated[int, bs.u8] + reserved1: Annotated[bytes, bs.bytes_field(5)] + head_veh: Annotated[int, bs.s32] + mag_dec: Annotated[int, bs.s16] + mag_acc: Annotated[int, bs.u16] + + class MonHw2(bs.BinaryStruct): + class ConfigSource(IntEnum): + flash = 102 + otp = 111 + config_pins = 112 + rom = 113 + + ofs_i: Annotated[int, bs.s8] + mag_i: Annotated[int, bs.u8] + ofs_q: Annotated[int, bs.s8] + mag_q: Annotated[int, bs.u8] + cfg_source: Annotated[ConfigSource | int, bs.enum(bs.u8, ConfigSource)] + reserved1: Annotated[bytes, bs.bytes_field(3)] + low_lev_cfg: Annotated[int, bs.u32] + reserved2: Annotated[bytes, bs.bytes_field(8)] + post_status: Annotated[int, bs.u32] + reserved3: Annotated[bytes, bs.bytes_field(4)] + + class MonHw(bs.BinaryStruct): + class AntennaStatus(IntEnum): + init = 0 + dontknow = 1 + ok = 2 + short = 3 + open = 4 + + class AntennaPower(IntEnum): + false = 0 + true = 1 + dontknow = 2 + + pin_sel: Annotated[int, bs.u32] + pin_bank: Annotated[int, bs.u32] + pin_dir: Annotated[int, bs.u32] + pin_val: Annotated[int, bs.u32] + noise_per_ms: Annotated[int, bs.u16] + agc_cnt: Annotated[int, bs.u16] + a_status: Annotated[AntennaStatus | int, bs.enum(bs.u8, AntennaStatus)] + a_power: Annotated[AntennaPower | int, bs.enum(bs.u8, AntennaPower)] + flags: Annotated[int, bs.u8] + reserved1: Annotated[bytes, bs.bytes_field(1)] + used_mask: Annotated[int, bs.u32] + vp: Annotated[bytes, bs.bytes_field(17)] + jam_ind: Annotated[int, bs.u8] + reserved2: Annotated[bytes, bs.bytes_field(2)] + pin_irq: Annotated[int, bs.u32] + pull_h: Annotated[int, bs.u32] + pull_l: Annotated[int, bs.u32] + + magic: Annotated[bytes, bs.const(bs.bytes_field(2), b"\xb5\x62")] + msg_type: Annotated[int, bs.u16be] + length: Annotated[int, bs.u16] + body: Annotated[ + object, + bs.substream( + 'length', + bs.switch( + 'msg_type', + { + 0x0107: NavPvt, + 0x0213: RxmSfrbx, + 0x0215: RxmRawx, + 0x0A09: MonHw, + 0x0A0B: MonHw2, + 0x0135: NavSat, + }, + ), + ), + ] + checksum: Annotated[int, bs.u16] diff --git a/iqpilot/system/ui/README.md b/iqpilot/system/ui/README.md new file mode 100644 index 000000000..abc20e8ec --- /dev/null +++ b/iqpilot/system/ui/README.md @@ -0,0 +1,21 @@ +# ui + +The user interfaces here are built with [raylib](https://www.raylib.com/). + +Quick start: +* set `BIG=1` to run the comma 3X UI (comma four UI runs by default) +* set `SHOW_FPS=1` to show the FPS +* set `STRICT_MODE=1` to kill the app if it drops too much below 60fps +* set `SCALE=1.5` to scale the entire UI by 1.5x +* set `BURN_IN=1` to get a burn-in heatmap version of the UI +* set `GRID=50` to show a 50-pixel alignment grid overlay +* set `MAGIC_DEBUG=1` to show every dropped frames (only on device) +* set `RECORD=1` to record the screen, output defaults to `output.mp4` but can be set with `RECORD_OUTPUT` +* set `IQPILOT_UI=0` to run the stock UI instead of the IQ.Pilot UI +* https://www.raylib.com/cheatsheet/cheatsheet.html +* https://electronstudio.github.io/raylib-python-cffi/README.html#quickstart + +Style guide: +* All graphical elements should subclass [`Widget`](/system/ui/widgets/__init__.py). + * Prefer a stateful widget over a function for easy migration from QT +* All internal class variables and functions should be prefixed with `_` diff --git a/iqpilot/system/ui/iqwidgets/__init__.py b/iqpilot/system/ui/iqwidgets/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/system/ui/iqwidgets/lib/__init__.py b/iqpilot/system/ui/iqwidgets/lib/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/lib/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/system/ui/iqwidgets/lib/application.py b/iqpilot/system/ui/iqwidgets/lib/application.py new file mode 100644 index 000000000..532e913e2 --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/lib/application.py @@ -0,0 +1,36 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import os + +import pyray as rl + +_UI_MODE_IQ = os.getenv("IQPILOT_UI", "1") == "1" + +_PROBE_FS = 20 +_PROBE_MARGIN = 10 +_PROBE_COLOR = rl.Color(0x12, 0x97, 0x91, 0xFF) + + +class IQAppHooks: + """IQ hooks mixed into GuiApplication: UI-mode flag + pointer debug readout.""" + + def __init__(self): + self._pointer_probe = os.getenv("SHOW_MOUSE_COORDS") == "1" + + @staticmethod + def iqpilot_ui() -> bool: + return _UI_MODE_IQ + + def set_show_mouse_coords(self, show: bool): + self._pointer_probe = show + + @property + def pointer_probe_enabled(self) -> bool: + return self._pointer_probe + + def draw_pointer_probe(self, font): + readout = f"X:{rl.get_mouse_x()}, Y:{rl.get_mouse_y()}" + width = rl.measure_text_ex(font, readout, _PROBE_FS, 0).x + canvas_w = self._scaled_width if self._scale != 1.0 else self._width + rl.draw_text_ex(font, readout, rl.Vector2(canvas_w - width - _PROBE_MARGIN, 6), _PROBE_FS, 0, _PROBE_COLOR) diff --git a/iqpilot/system/ui/iqwidgets/lib/canvas.py b/iqpilot/system/ui/iqwidgets/lib/canvas.py new file mode 100644 index 000000000..b4f4ccf2f --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/lib/canvas.py @@ -0,0 +1,107 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +IQ.Pilot drawing surface. Onroad renderers and settings widgets paint through +this facade instead of touching pyray directly, so the HUD has one vocabulary +for shapes/text/textures. Each call forwards verbatim to the backing library — +output is identical to a raw pyray call, only the call site reads in IQ terms. +""" +import pyray as _p +from iqpilot.system.ui.lib.text_measure import measure_text_cached as _measure + +Rgba = _p.Color +Box = _p.Rectangle +Pt = _p.Vector2 + +WHITE = _p.WHITE +BLACK = _p.BLACK +RED = _p.RED +CLEAR = _p.Color(0, 0, 0, 0) + + +def shade(r: int, g: int, b: int, a: int = 255) -> Rgba: + return _p.Color(r, g, b, a) + + +def with_opacity(color: Rgba, alpha: float) -> Rgba: + return _p.Color(color.r, color.g, color.b, int(alpha)) + + +# --- filled / stroked shapes ------------------------------------------------- + +def panel(box: Box, roundness: float, segments: int, color: Rgba) -> None: + _p.draw_rectangle_rounded(box, roundness, segments, color) + + +def panel_outline(box: Box, roundness: float, segments: int, thickness: float, color: Rgba) -> None: + _p.draw_rectangle_rounded_lines_ex(box, roundness, segments, thickness, color) + + +def slab(x: float, y: float, w: float, h: float, color: Rgba) -> None: + _p.draw_rectangle(int(x), int(y), int(w), int(h), color) + + +def h_sweep(x: float, y: float, w: float, h: float, left: Rgba, right: Rgba) -> None: + _p.draw_rectangle_gradient_h(int(x), int(y), int(w), int(h), left, right) + + +def v_sweep(x: float, y: float, w: float, h: float, top: Rgba, bottom: Rgba) -> None: + _p.draw_rectangle_gradient_v(int(x), int(y), int(w), int(h), top, bottom) + + +def disc(cx: float, cy: float, radius: float, color: Rgba) -> None: + _p.draw_circle(int(cx), int(cy), radius, color) + + +def disc_at(center: Pt, radius: float, color: Rgba) -> None: + _p.draw_circle_v(center, radius, color) + + +def hoop(cx: float, cy: float, radius: float, color: Rgba) -> None: + _p.draw_circle_lines(int(cx), int(cy), radius, color) + + +def annulus(center: Pt, inner: float, outer: float, start: float, end: float, segments: int, color: Rgba) -> None: + _p.draw_ring(center, inner, outer, start, end, segments, color) + + +def oval(cx: float, cy: float, rx: float, ry: float, color: Rgba) -> None: + _p.draw_ellipse(int(cx), int(cy), rx, ry, color) + + +def hair(a: Pt, b: Pt, thickness: float, color: Rgba) -> None: + _p.draw_line_ex(a, b, thickness, color) + + +def hair_xy(x0: float, y0: float, x1: float, y1: float, color: Rgba) -> None: + _p.draw_line(int(x0), int(y0), int(x1), int(y1), color) + + +def wedge(a: Pt, b: Pt, c: Pt, color: Rgba) -> None: + _p.draw_triangle(a, b, c, color) + + +# --- text -------------------------------------------------------------------- + +def span(box_w, text: str, size: int, spacing: float = 0): + """Measured extent of a text run (Vector2).""" + return _measure(box_w, text, size, spacing) + + +def glyphs(font, text: str, at: Pt, size: int, color: Rgba, spacing: float = 0) -> None: + _p.draw_text_ex(font, text, at, size, spacing, color) + + +def glyphs_centered(font, text: str, size: int, center: Pt, color: Rgba, spacing: float = 0) -> None: + extent = _measure(font, text, size, spacing) + _p.draw_text_ex(font, text, _p.Vector2(center.x - extent.x / 2, center.y - extent.y / 2), size, spacing, color) + + +# --- textures ---------------------------------------------------------------- + +def stamp(tex, x: float, y: float, tint: Rgba) -> None: + _p.draw_texture(tex, int(x), int(y), tint) + + +def stamp_scaled(tex, src: Box, dst: Box, origin: Pt, rotation: float, tint: Rgba) -> None: + _p.draw_texture_pro(tex, src, dst, origin, rotation, tint) diff --git a/iqpilot/system/ui/iqwidgets/lib/styles.py b/iqpilot/system/ui/iqwidgets/lib/styles.py new file mode 100644 index 000000000..1f122a1ca --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/lib/styles.py @@ -0,0 +1,142 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import pyray as rl + + +def _hex(rgb: int, alpha: int = 0xFF) -> rl.Color: + return rl.Color((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF, alpha) + + +class ink: + """IQ settings palette, grouped by role.""" + + # surfaces + PANEL = _hex(0x393939) + PANEL_MUTED = _hex(0x272727) + PANEL_PRESSED = _hex(0x151515) + + # accent (selection / "on") + ACCENT = _hex(0x1C65BA) + ACCENT_PRESSED = _hex(0x114E96) + ACCENT_FADED = _hex(0x25466B) + + # text + TITLE = rl.WHITE + READOUT = _hex(0xAAAAAA) + CAPTION = _hex(0x808080) + DISABLED = _hex(0x585858) + + # toggle knob + KNOB = rl.WHITE + KNOB_DISABLED = _hex(0x585858) + + # chips / segmented controls + CHIP_PRESSED = _hex(0x696868) + FAINT = rl.Color(255, 255, 255, 0x33) + CLEAR = rl.Color(255, 255, 255, 0) + VOID = rl.Color(0, 0, 0, 0) + + # dialog key buttons + KEY_ACTION = _hex(0x465BEA) + KEY_NEUTRAL = _hex(0x333333) + KEY_SUNKEN = _hex(0x1E1E1E) + OUTLINE = _hex(0x969696, 200) + + # status colours (vehicle fingerprint legend etc.) + STATUS_GOOD = _hex(0x129791) + STATUS_INFO = _hex(0x0086E9) + STATUS_WARN = _hex(0xFFD500) + + # push buttons + PUSH = _hex(0x34373E) + PUSH_PRESSED = _hex(0x464A52) + PUSH_DISABLED = _hex(0x121212) + PUSH_TEXT_DISABLED = _hex(0x5C5C5C) + + +class metrics: + """Row and control geometry for the IQ settings surfaces.""" + + ROW = 170 + GUTTER = 20 + TITLE_FS = 50 + CAPTION_FS = 40 + CAPTION_DY = 150 + TEXT_PAD = 20 + CLOSE_BTN = 160 + + TOGGLE_H = 120 + TOGGLE_W = int(TOGGLE_H * 2.2) + TOGGLE_TRACK_H = TOGGLE_H - 20 + + ACTION_W = 300 + ROW_BTN_H = 120 + WIDE_BTN_W = 800 + WIDE_BTN_H = 150 + + +class style: + """Transitional facade for panels not yet ported to ink/metrics; shrink as ports land.""" + + ITEM_BASE_HEIGHT = metrics.ROW + ITEM_PADDING = metrics.GUTTER + ITEM_TEXT_FONT_SIZE = metrics.TITLE_FS + ITEM_DESC_FONT_SIZE = metrics.CAPTION_FS + ITEM_DESC_V_OFFSET = metrics.CAPTION_DY + ITEM_TEXT_VALUE_COLOR = ink.READOUT + CLOSE_BTN_SIZE = metrics.CLOSE_BTN + TEXT_PADDING = metrics.TEXT_PAD + TOGGLE_HEIGHT = metrics.TOGGLE_H + TOGGLE_WIDTH = metrics.TOGGLE_W + TOGGLE_BG_HEIGHT = metrics.TOGGLE_TRACK_H + BUTTON_ACTION_WIDTH = metrics.ACTION_W + BUTTON_HEIGHT = metrics.ROW_BTN_H + SIMPLE_BUTTON_WIDTH = metrics.WIDE_BTN_W + SIMPLE_BUTTON_HEIGHT = metrics.WIDE_BTN_H + + BASE_BG_COLOR = ink.PANEL + ON_BG_COLOR = ink.ACCENT + OFF_BG_COLOR = ink.PANEL + ON_HOVER_BG_COLOR = ink.ACCENT_PRESSED + OFF_HOVER_BG_COLOR = ink.PANEL_PRESSED + DISABLED_ON_BG_COLOR = ink.ACCENT_FADED + DISABLED_OFF_BG_COLOR = ink.PANEL_MUTED + ITEM_TEXT_COLOR = ink.TITLE + ITEM_DISABLED_TEXT_COLOR = ink.DISABLED + ITEM_DESC_TEXT_COLOR = ink.CAPTION + + TOGGLE_ON_COLOR = ink.ACCENT + TOGGLE_OFF_COLOR = ink.PANEL + TOGGLE_KNOB_COLOR = ink.KNOB + TOGGLE_DISABLED_ON_COLOR = ink.ACCENT_FADED + TOGGLE_DISABLED_OFF_COLOR = ink.PANEL_MUTED + TOGGLE_DISABLED_KNOB_COLOR = ink.KNOB_DISABLED + + MBC_TRANSPARENT = ink.CLEAR + MBC_BG_CHECKED_ENABLED = ink.CHIP_PRESSED + MBC_DISABLED = ink.FAINT + + OPTION_CONTROL_CONTAINER_BG = ink.PANEL + OPTION_CONTROL_BTN_ENABLED = ink.KNOB_DISABLED + OPTION_CONTROL_BTN_PRESSED = ink.CHIP_PRESSED + OPTION_CONTROL_BTN_DISABLED = ink.PANEL_MUTED + OPTION_CONTROL_TEXT_ENABLED = ink.TITLE + OPTION_CONTROL_TEXT_PRESSED = ink.TITLE + OPTION_CONTROL_TEXT_DISABLED = ink.DISABLED + + BUTTON_PRIMARY_COLOR = ink.KEY_ACTION + BUTTON_NEUTRAL_GRAY = ink.KEY_NEUTRAL + BUTTON_DISABLED_BG_COLOR = ink.KEY_SUNKEN + TREE_DIALOG_TRANSPARENT = ink.VOID + TREE_DIALOG_SEARCH_BUTTON_PRESSED = ink.CHIP_PRESSED + TREE_DIALOG_SEARCH_BUTTON_BORDER = ink.OUTLINE + + GREEN = ink.STATUS_GOOD + BLUE = ink.STATUS_INFO + YELLOW = ink.STATUS_WARN + + BUTTON_ENABLED_OFF = ink.PUSH + BUTTON_OFF_PRESSED = ink.PUSH_PRESSED + BUTTON_DISABLED = ink.PUSH_DISABLED + BUTTON_TEXT_DISABLED = ink.PUSH_TEXT_DISABLED diff --git a/iqpilot/system/ui/iqwidgets/lib/utils.py b/iqpilot/system/ui/iqwidgets/lib/utils.py new file mode 100644 index 000000000..7b3629b45 --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/lib/utils.py @@ -0,0 +1,9 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.system.ui.iqwidgets.widgets.list_view import IQButtonAction + + +class WideButtonAction(IQButtonAction): + def get_width_hint(self): + return super().get_width_hint() + 1 diff --git a/iqpilot/system/ui/iqwidgets/widgets/__init__.py b/iqpilot/system/ui/iqwidgets/widgets/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/widgets/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/system/ui/iqwidgets/widgets/helpers/__init__.py b/iqpilot/system/ui/iqwidgets/widgets/helpers/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/ui/iqwidgets/widgets/helpers/glyphs.py b/iqpilot/system/ui/iqwidgets/widgets/helpers/glyphs.py new file mode 100644 index 000000000..b8e19ae85 --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/widgets/helpers/glyphs.py @@ -0,0 +1,30 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import math + +import pyray as rl + +# Unit pentagram vertices, spike up, alternating outer/inner radius, clockwise +# from the top. Inner radius 0.5 keeps the classic star proportions. +_STAR_RING: list[tuple[float, float]] = [] +for _k in range(10): + _theta = math.radians(-90.0 + _k * 36.0) + _r = 1.0 if _k % 2 == 0 else 0.5 + _STAR_RING.append((_r * math.cos(_theta), _r * math.sin(_theta))) + + +def draw_star(center_x: float, center_y: float, radius: float, is_filled: bool, color: rl.Color) -> None: + pts = [rl.Vector2(center_x + ux * radius, center_y + uy * radius) for ux, uy in _STAR_RING] + + if is_filled: + inner = [pts[k] for k in range(1, 10, 2)] + # five spikes, each flanked by its two inner neighbours... + for i in range(5): + rl.draw_triangle(inner[i - 1], pts[2 * i], inner[i], color) + # ...plus the inner pentagon, fanned from one vertex + for i in range(1, 4): + rl.draw_triangle(inner[0], inner[i], inner[i + 1], color) + + for k in range(10): + rl.draw_line_ex(pts[k], pts[(k + 1) % 10], 2, color) diff --git a/iqpilot/system/ui/iqwidgets/widgets/list_view.py b/iqpilot/system/ui/iqwidgets/widgets/list_view.py new file mode 100644 index 000000000..11c4ede3e --- /dev/null +++ b/iqpilot/system/ui/iqwidgets/widgets/list_view.py @@ -0,0 +1,1354 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from __future__ import annotations + +import time +from collections.abc import Callable + +import pyray as rl +from iqpilot.system.ui.iqwidgets.lib.styles import ink, metrics +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.iqwidgets.lib import canvas +from iqpilot.system.ui.widgets.scroller_tici import LineSeparator, LINE_COLOR, LINE_PADDING +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets.toggle import Toggle +import unicodedata +from iqpilot.common.params import Params, UnknownKeyName +from iqpilot.system.ui.widgets.label import gui_label +from iqpilot.system.ui.lib.application import gui_app, MousePos, FontWeight +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.list_view import (ListItem, ToggleAction, ItemAction, MultipleButtonAction, + ButtonAction, _resolve_value, DualButtonAction) + +_Dyn = str | Callable[[], str] # a literal or a late-bound provider +_Pred = Callable[[], bool] + +LABEL_WIDTH = 350 # hoisted: used as a default arg in option_item before the option-control section +_SPINNER_TEAL = rl.Color(16, 185, 169, 255) +_SPINNER_HALO = rl.Color(255, 255, 255, 26) + + +class Spacer(Widget): + def __init__(self, height: int = 1): + super().__init__() + self._rect = rl.Rectangle(0, 0, 0, height) + + def set_parent_rect(self, parent_rect: rl.Rectangle) -> None: + super().set_parent_rect(parent_rect) + self._rect.width = parent_rect.width + + def _render(self, _): + pass + + +class IQLineSeparator(LineSeparator): + def __init__(self, height: int = 1): + super().__init__() + self._rect = rl.Rectangle(0, 0, 0, height) + + def _render(self, _): + mid_y = int(self._rect.y + self._rect.height // 2) + rl.draw_line(int(self._rect.x) + LINE_PADDING, mid_y, + int(self._rect.x + self._rect.width) - LINE_PADDING, mid_y, LINE_COLOR) + + +class IQToggleAction(ToggleAction): + def __init__(self, initial_state: bool = False, width: int = metrics.TOGGLE_W, enabled: bool | _Pred = True, + callback: Callable[[bool], None] | None = None, param: str | None = None): + super().__init__(initial_state, width, enabled, callback) + self.toggle = IQToggle(initial_state=initial_state, callback=callback, param=param) + + +class SafeIQToggleAction(IQToggleAction): + """Toggle bound to a param that may be missing from the build's registry. + + IQToggle's ParamSlot already degrades reads/writes on unknown keys; this + adds the caller-chosen fallback state and skips the callback on dead keys. + """ + + def __init__(self, param: str, default_on: bool = True, width: int = metrics.TOGGLE_W, + enabled: bool | _Pred = True, callback: Callable[[bool], None] | None = None): + slot = ParamSlot(param) + + def _guarded(state: bool): + if slot.write(state) and callback: + callback(state) + + super().__init__(initial_state=slot.read_bool(default_on), width=width, enabled=enabled, + callback=_guarded, param=param) + self.toggle._slot = slot # share one slot; IQToggle re-syncs from it every frame + + +class IQButton(Button): + def _update_state(self): + super()._update_state() + self._background_color, label_color = self._palette() + if label_color is not None: + self._label.set_text_color(label_color) + + def _palette(self) -> tuple[rl.Color, rl.Color | None]: + if not self.enabled: + return ink.PUSH_DISABLED, ink.PUSH_TEXT_DISABLED + if self._button_style == ButtonStyle.PRIMARY: + # honor the "on"/active style (e.g. Onroad Uploads, Always Offroad, Force On-Road) — otherwise + # set_button_style(PRIMARY) was ignored and toggles stayed grey with no visual feedback + c = ink.KEY_ACTION + if self.is_pressed: + return rl.Color(min(255, c.r + 22), min(255, c.g + 22), min(255, c.b + 22), 255), None + return c, None + return (ink.PUSH_PRESSED if self.is_pressed else ink.PUSH), None + + +class NavSectionButton(IQButton): + """A clean navigable section row: icon (left) + label + chevron (right), full width.""" + + def __init__(self, text, icon_path: str | None = None, click_callback: Callable | None = None): + super().__init__(text, click_callback=click_callback, button_style=ButtonStyle.NORMAL, text_padding=0) + self._label_src = text + self._icon = gui_app.texture(icon_path, 64, 64, keep_aspect_ratio=True) if icon_path else None + self._chevron = gui_app.texture("icons/iq/chevron_right.png", 50, 50, keep_aspect_ratio=True) + self._border_radius = 40 + + def _render(self, _): + rect = self._rect + roundness = self._border_radius / (min(rect.width, rect.height) / 2) + canvas.panel(rect, roundness, 10, self._background_color) + + cy = rect.y + rect.height / 2 + x = rect.x + 44 + if self._icon: + rl.draw_texture(self._icon, int(x), int(cy - self._icon.height / 2), rl.WHITE) + x += self._icon.width + 30 + + text = self._label_src() if callable(self._label_src) else self._label_src + font = gui_app.font(FontWeight.MEDIUM) + fs = 58 + ts = measure_text_cached(font, text, fs) + canvas.glyphs(font, text, rl.Vector2(int(x), int(cy - ts.y / 2)), fs, rl.WHITE) + + rl.draw_texture(self._chevron, int(rect.x + rect.width - 44 - self._chevron.width), + int(cy - self._chevron.height / 2), rl.Color(170, 172, 178, 255)) + + +class IQSimpleButtonAction(ItemAction): + """A single wide standalone button occupying the row.""" + + def __init__(self, button_text: _Dyn, callback: Callable | None = None, + enabled: bool | _Pred = True, button_width: int = metrics.WIDE_BTN_W): + super().__init__(width=button_width, enabled=enabled) + self.button_action = IQButton(button_text, click_callback=callback, button_style=ButtonStyle.NORMAL, + border_radius=48) + + def set_touch_valid_callback(self, touch_callback: _Pred) -> None: + super().set_touch_valid_callback(touch_callback) + self.button_action.set_touch_valid_callback(touch_callback) + + def _render(self, rect: rl.Rectangle) -> bool | int | None: + self.button_action.set_enabled(self.enabled) + return self.button_action.render(rect) + + +class IQButtonAction(ButtonAction): + """Stock button action plus a colourable readout and an in-progress spinner.""" + + def __init__(self, text: _Dyn, width: int = metrics.ACTION_W, enabled: bool | _Pred = True): + super().__init__(text=text, width=width, enabled=enabled) + self._readout_tint: rl.Color = ink.READOUT + self._loading = False + + def set_value(self, value: _Dyn, color: rl.Color = ink.READOUT): + self._value_source = value + self._readout_tint = color + + def set_loading(self, loading: bool): + self._loading = loading + + def _button_only(self, rect: rl.Rectangle) -> bool: + """Let the base draw just the trailing button by hiding the value for one pass.""" + stash, self._value_source = self._value_source, None + try: + return super()._render(rect) + finally: + self._value_source = stash + + @staticmethod + def _draw_spinner(cx: float, cy: float): + ang = (rl.get_time() * 280) % 360 + canvas.annulus(rl.Vector2(cx, cy), 16, 24, 0, 360, 40, _SPINNER_HALO) + canvas.annulus(rl.Vector2(cx, cy), 16, 24, ang, ang + 100, 28, _SPINNER_TEAL) + + def _render(self, rect: rl.Rectangle) -> bool: + from iqpilot.system.ui.widgets.list_view import BUTTON_WIDTH, TEXT_PADDING + + if self._loading: + pressed = self._button_only(rect) + # teal spinner sits in the readout slot, next to the button + self._draw_spinner(rect.x + rect.width - BUTTON_WIDTH - TEXT_PADDING - 28, rect.y + rect.height / 2) + return pressed + + value = self.value + if not value: + return super()._render(rect) + + pressed = self._button_only(rect) + body = rl.Rectangle(rect.x, rect.y, rect.width - BUTTON_WIDTH - TEXT_PADDING, rect.height) + if measure_text_cached(self._font, value, metrics.TITLE_FS).x > body.width: + self._value_label.set_text(value) + self._value_label.set_font_size(metrics.TITLE_FS) + self._value_label.set_text_color(self._readout_tint) + self._value_label.render(body) + else: + gui_label(body, value, font_size=metrics.TITLE_FS, color=self._readout_tint, + font_weight=FontWeight.NORMAL, alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + return pressed + + +class IQDualButtonAction(DualButtonAction): + BUTTON_GAP = 20 + BUTTON_H = 150 + + def __init__(self, left_text: _Dyn, right_text: _Dyn, left_callback: Callable | None = None, + right_callback: Callable | None = None, enabled: bool | _Pred = True, border_radius: int = 40): + super().__init__(left_text, right_text, left_callback, right_callback, enabled) + # Neutral left action uses IQButton (lighter grey + IQ press states); right keeps its style (e.g. DANGER). + self.left_button = IQButton(left_text, click_callback=left_callback, button_style=ButtonStyle.NORMAL, text_padding=0) + self.left_button._border_radius = self.right_button._border_radius = border_radius + + def _pair_rects(self, rect: rl.Rectangle) -> tuple[rl.Rectangle, rl.Rectangle]: + w = (rect.width - self.BUTTON_GAP) / 2 + y = rect.y + (rect.height - self.BUTTON_H) / 2 + left = rl.Rectangle(rect.x, y, w, self.BUTTON_H) + right = rl.Rectangle(rect.x + w + self.BUTTON_GAP, y, w, self.BUTTON_H) + if not self.left_button.is_visible: + right = rl.Rectangle(rect.x, y, rect.width, self.BUTTON_H) + elif not self.right_button.is_visible: + left = rl.Rectangle(rect.x, y, rect.width, self.BUTTON_H) + return left, right + + def _render(self, rect: rl.Rectangle): + left, right = self._pair_rects(rect) + self.left_button.render(left) + self.right_button.render(right) + + +# Segmented (multi-button) control — dark container with a teal "active" pill + soft glow +SEG_CONTAINER_BG = rl.Color(42, 45, 52, 255) +SEG_CONTAINER_BORDER = rl.Color(255, 255, 255, 22) +SEG_ACTIVE = rl.Color(18, 191, 173, 255) +SEG_TEXT_SELECTED = rl.Color(8, 16, 16, 255) +SEG_H_PAD = 8 +SEG_V_PAD = 9 +SEG_TEXT_PAD = 16 +_DOUBLE_CLICK_S = 0.5 + + +class IQMultipleButtonAction(MultipleButtonAction): + def __init__(self, buttons: list[_Dyn], button_width: int, selected_index: int = 0, callback: Callable | None = None, + param: str | None = None): + super().__init__(buttons, button_width, selected_index, callback) + self._slot = ParamSlot(param) + if self._slot.bound: + self.selected_button = self._slot.read_int(selected_index) + self._anim_x: float | None = None + self._double_click_callbacks: dict[int, Callable] = {} + self._last_click: tuple[int, float] = (-1, 0.0) + + @property + def param_key(self): + return self._slot.key + + def set_double_click_callback(self, button_index: int, callback: Callable) -> None: + self._double_click_callbacks[button_index] = callback + + def _track_rect(self) -> rl.Rectangle: + y = self._rect.y + (self._rect.height - metrics.ROW_BTN_H) / 2 + return rl.Rectangle(self._rect.x, y, self._rect.width, metrics.ROW_BTN_H) + + def _segment_at(self, mouse_pos: MousePos) -> int: + track = self._track_rect() + if not rl.check_collision_point_rec(mouse_pos, track): + return -1 + return min(len(self.buttons) - 1, int((mouse_pos.x - track.x) / (track.width / len(self.buttons)))) + + def _render(self, rect: rl.Rectangle): + track = rl.Rectangle(rect.x, rect.y + (rect.height - metrics.ROW_BTN_H) / 2, rect.width, metrics.ROW_BTN_H) + seg_w = track.width / len(self.buttons) + selected_enabled = self._is_button_enabled(self.selected_button) + + # Dark container + canvas.panel(track, 0.35, 20, SEG_CONTAINER_BG) + canvas.panel_outline(track, 0.35, 20, 2, SEG_CONTAINER_BORDER if self.enabled else ink.FAINT) + + # Animated active pill + target_x = track.x + self.selected_button * seg_w + self._anim_x = target_x if self._anim_x is None else self._anim_x + (target_x - self._anim_x) * 0.2 + pill = rl.Rectangle(self._anim_x + SEG_H_PAD, track.y + SEG_V_PAD, seg_w - 2 * SEG_H_PAD, track.height - 2 * SEG_V_PAD) + + if selected_enabled: + # Soft teal glow behind the active pill + for grow, alpha in ((16, 16), (10, 28), (5, 44)): + halo = rl.Rectangle(pill.x - grow, pill.y - grow, pill.width + 2 * grow, pill.height + 2 * grow) + canvas.panel(halo, 0.6, 20, rl.Color(SEG_ACTIVE.r, SEG_ACTIVE.g, SEG_ACTIVE.b, alpha)) + canvas.panel(pill, 0.6, 20, SEG_ACTIVE) + else: + canvas.panel(pill, 0.6, 20, ink.FAINT) + + # Labels, shrunk to fit their segment + for i, source in enumerate(self.buttons): + text = _resolve_value(source, "") + fs = 40 + limit = max(1, seg_w - SEG_TEXT_PAD * 2) + ts = measure_text_cached(self._font, text, fs) + while ts.x > limit and fs > 30: + fs -= 2 + ts = measure_text_cached(self._font, text, fs) + + if i == self.selected_button and selected_enabled: + color = SEG_TEXT_SELECTED + elif self._is_button_enabled(i): + color = ink.TITLE + else: + color = ink.FAINT + rl.draw_text_ex(self._font, text, + rl.Vector2(track.x + i * seg_w + (seg_w - ts.x) / 2, track.y + (track.height - ts.y) / 2), + fs, 0, color) + + def _handle_mouse_release(self, mouse_pos: MousePos): + hit = self._segment_at(mouse_pos) + + if self.enabled and hit >= 0 and self._is_button_enabled(hit): + self.selected_button = hit + if self.callback: + self.callback(hit) + self._slot.write(self.selected_button) + + if hit < 0 or not self._double_click_callbacks: + return + prev_hit, prev_time = self._last_click + now = time.monotonic() + if hit == prev_hit and (now - prev_time) < _DOUBLE_CLICK_S: + self._last_click = (-1, 0.0) + if hit in self._double_click_callbacks: + self._double_click_callbacks[hit]() + else: + self._last_click = (hit, now) + + +class IQListItem(ListItem): + """Settings row with IQ extensions: leading toggles/buttons, title badge chips, + right-aligned readouts, and a stacked (non-inline) action layout.""" + + STACKED_EXTRA = metrics.ROW / 1.75 + + def __init__(self, title: _Dyn = "", icon: str | None = None, description: _Dyn | None = None, + description_visible: bool = False, callback: Callable | None = None, + action_item: ItemAction | None = None, inline: bool = True, title_color: rl.Color = ink.TITLE): + super().__init__(title, icon, description, description_visible, callback, action_item) + self.title_color = title_color + self.inline = inline + if not self.inline: + self._rect.height += self.STACKED_EXTRA + self.title_badge: tuple[str, rl.Color] | None = None + self._ro_val: _Dyn | None = None + self._ro_font = gui_app.font(FontWeight.NORMAL) + self._ro_tint: rl.Color = ink.READOUT + + # -- value/badge API ------------------------------------------------------ + def set_title(self, title: _Dyn = ""): + self._title = title + + def set_right_value(self, value: _Dyn, color: rl.Color = ink.READOUT): + self._ro_val = value + self._ro_tint = color + + @property + def right_value(self) -> str: + if self._ro_val is None: + return "" + return str(_resolve_value(self._ro_val, "")) + + def show_description(self, show: bool): + self._set_description_visible(show) + + # -- geometry ------------------------------------------------------------- + def _leading_action(self) -> bool: + return isinstance(self.action_item, ToggleAction) or isinstance(self.action_item, IQSimpleButtonAction) + + def _update_state(self): + prev_desc = self._prev_description + super()._update_state() + if self.description_visible and self._prev_description != prev_desc: + self._rect.height = self.get_item_height(self._font, int(self._rect.width - metrics.GUTTER * 2)) + + def get_item_height(self, font: rl.Font, max_width: int) -> float: + extra = 0.0 + if self.description_visible: + extra += metrics.GUTTER * 1.5 + if not self.inline: + extra += self.STACKED_EXTRA + return super().get_item_height(font, max_width) + extra + + def get_right_item_rect(self, item_rect: rl.Rectangle) -> rl.Rectangle: + if not self.action_item: + return rl.Rectangle(0, 0, 0, 0) + + pad = metrics.GUTTER + inset_x = item_rect.x + pad + inner_w = item_rect.width - pad * 2 + top = item_rect.y + + if not self.inline: + # stacked: the action spans the row width, below the title + title_h = measure_text_cached(self._font, self.title, metrics.TITLE_FS).y + return rl.Rectangle(inset_x, top + title_h + pad * 3, inner_w, metrics.ROW_BTN_H) + + hint = self.action_item.get_width_hint() + if hint == 0: + return rl.Rectangle(inset_x, top, inner_w, metrics.ROW) + + title_w = measure_text_cached(self._font, self.title, metrics.TITLE_FS).x + hint = min(inner_w - title_w, hint) + x = item_rect.x if self._leading_action() else item_rect.x + item_rect.width - hint + return rl.Rectangle(x, top, hint, metrics.ROW) + + # -- drawing -------------------------------------------------------------- + def _draw_title_badge(self, x: float, cy: float): + """Rounded status chip just after the title text.""" + label, color = self.title_badge + font = gui_app.font(FontWeight.MEDIUM) + fs = 30 + ts = measure_text_cached(font, label, fs) + pad_x = 18 + chip = rl.Rectangle(x, cy - (ts.y + 16) / 2, ts.x + pad_x * 2, ts.y + 16) + canvas.panel(chip, 0.5, 12, color) + lum = 0.299 * color.r + 0.587 * color.g + 0.114 * color.b + txt_color = rl.Color(10, 14, 16, 255) if lum > 140 else rl.WHITE + canvas.glyphs(font, label, rl.Vector2(chip.x + pad_x, cy - ts.y / 2), fs, txt_color) + + def _draw_title(self, x: float, with_badge: bool) -> None: + self._text_size = measure_text_cached(self._font, self.title, metrics.TITLE_FS) + y = self._rect.y + (metrics.ROW - self._text_size.y) // 2 if self.inline else self._rect.y + metrics.GUTTER * 1.5 + canvas.glyphs(self._font, self.title, rl.Vector2(x, y), metrics.TITLE_FS, self.title_color) + if with_badge and self.title_badge: + self._draw_title_badge(x + self._text_size.x + 24, y + self._text_size.y / 2) + + def _draw_right_value(self, from_x: float) -> None: + span = rl.Rectangle(from_x, self._rect.y, self._rect.width - (from_x - self._rect.x) - metrics.GUTTER, metrics.ROW) + if span.width > 0: + gui_label(span, self.right_value, font_size=metrics.TITLE_FS, color=self._ro_tint, + font_weight=FontWeight.NORMAL, alignment=rl.GuiTextAlignment.TEXT_ALIGN_RIGHT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + + def _draw_caption(self) -> None: + content_w = int(self._rect.width - metrics.GUTTER * 2) + y = self._rect.y + metrics.CAPTION_DY + if not self.inline and self.action_item: + y = self.action_item.rect.y + metrics.CAPTION_DY - metrics.GUTTER * 0.5 + self._html_renderer.render(rl.Rectangle(self._rect.x + metrics.GUTTER, y, content_w, + self._html_renderer.get_total_height(content_w))) + + def _fire_action(self, action_rect: rl.Rectangle) -> None: + if self.action_item.render(action_rect) and self.action_item.enabled and self.callback: + self.callback() + + def _render(self, _): + if not self.is_visible: + return + if (self._rect.y + self.rect.height) <= self._parent_rect.y or self._rect.y >= (self._parent_rect.y + self._parent_rect.height): + return + + content_x = self._rect.x + metrics.GUTTER + + if self._leading_action(): + slot_h = metrics.WIDE_BTN_H if isinstance(self.action_item, IQSimpleButtonAction) else metrics.TOGGLE_H + lead = rl.Rectangle(content_x, self._rect.y + (metrics.ROW - slot_h) // 2, self.action_item.rect.width, slot_h) + text_x = lead.x + lead.width + metrics.GUTTER * 1.5 + if self.title: + self._draw_title(text_x, with_badge=False) + if self.right_value: + self._draw_right_value(text_x) + self._fire_action(lead) + else: + if self.title: + self._draw_title(content_x, with_badge=True) + if self.action_item: + self._fire_action(self.get_right_item_rect(self._rect)) + + if self.description_visible: + self._draw_caption() + + +def simple_button_item_iq(button_text: _Dyn, callback: Callable | None = None, + enabled: bool | _Pred = True, button_width: int = metrics.WIDE_BTN_W) -> IQListItem: + action = IQSimpleButtonAction(button_text=button_text, enabled=enabled, callback=callback, button_width=button_width) + return IQListItem(title="", callback=callback, description="", action_item=action) + + +def toggle_item_iq(title: _Dyn, description: _Dyn | None = None, initial_state: bool = False, + callback: Callable | None = None, icon: str = "", enabled: bool | _Pred = True, param: str | None = None) -> IQListItem: + action = IQToggleAction(initial_state=initial_state, enabled=enabled, callback=callback, param=param) + return IQListItem(title=title, description=description, action_item=action, icon=icon, callback=callback) + + +def multiple_button_item_iq(title: _Dyn, description: _Dyn, buttons: list[_Dyn], + selected_index: int = 0, button_width: int = metrics.ACTION_W, callback: Callable | None = None, + icon: str = "", param: str | None = None, inline: bool = False) -> IQListItem: + action = IQMultipleButtonAction(buttons, button_width, selected_index, callback=callback, param=param) + return IQListItem(title=title, description=description, icon=icon, action_item=action, inline=inline) + + +def option_item_iq(title: _Dyn, param: str, + min_value: int, max_value: int, description: _Dyn | None = None, + value_change_step: int = 1, on_value_changed: Callable[[int], None] | None = None, + enabled: bool | _Pred = True, + icon: str = "", label_width: int = LABEL_WIDTH, value_map: dict[int, int] | None = None, + use_float_scaling: bool = False, label_callback: Callable[[int], str] | None = None, inline: bool = False) -> IQListItem: + action = IQOptionControl( + param, min_value, max_value, value_change_step, + enabled, on_value_changed, value_map, label_width, use_float_scaling, label_callback + ) + return IQListItem(title=title, description=description, action_item=action, icon=icon, inline=inline) + + +def button_item_iq(title: _Dyn, button_text: _Dyn, description: _Dyn | None = None, + callback: Callable | None = None, enabled: bool | _Pred = True) -> IQListItem: + action = IQButtonAction(text=button_text, enabled=enabled) + return IQListItem(title=title, description=description, action_item=action, callback=callback) + + +def dual_button_item_iq(left_text: _Dyn, right_text: _Dyn, left_callback: Callable | None = None, + right_callback: Callable | None = None, description: _Dyn | None = None, + enabled: bool | _Pred = True, border_radius: int = 40) -> IQListItem: + action = IQDualButtonAction(left_text, right_text, left_callback, right_callback, enabled, border_radius) + return IQListItem(title="", description=description, action_item=action) + + +# Preferred IQ helper names. +simple_button_item = simple_button_item_iq +toggle_item = toggle_item_iq +multiple_button_item = multiple_button_item_iq +option_item = option_item_iq +button_item = button_item_iq +dual_button_item = dual_button_item_iq + + +# ===== toggle ===== + +KNOB_PADDING = 10 +KNOB_RADIUS = metrics.TOGGLE_TRACK_H / 2 - KNOB_PADDING + +# Track colors: grey when off, teal gradient (left -> right) when on. +OFF_COLOR = rl.Color(58, 61, 68, 255) +ON_START = rl.Color(52, 231, 200, 255) # #34E7C8 +ON_END = rl.Color(4, 140, 155, 255) # #048C9B +OFF_DISABLED = rl.Color(45, 47, 52, 255) +ON_START_DISABLED = rl.Color(40, 110, 100, 255) +ON_END_DISABLED = rl.Color(18, 78, 86, 255) +KNOB_ON = rl.WHITE +KNOB_DISABLED = rl.Color(150, 150, 150, 255) +TRACK_BORDER = rl.Color(0, 0, 0, 45) + + +class IQToggle(Toggle): + def __init__(self, initial_state=False, callback: Callable[[bool], None] | None = None, param: str | None = None): + self._slot = ParamSlot(param) + if self._slot.bound: + initial_state = self._slot.read_bool(initial_state) + super().__init__(initial_state, callback) + + @property + def param_key(self): + return self._slot.key + + def set_rect(self, rect: rl.Rectangle): + self._rect = rl.Rectangle(rect.x, rect.y, metrics.TOGGLE_W, metrics.TOGGLE_H) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + if self._enabled: + self._slot.write(self._state) + + def update(self): + # Framerate-independent exponential ease-out (springy settle) instead of the base class's + # constant-velocity linear slide, which read as robotic. + if abs(self._progress - self._target) > 0.001: + self._progress += (self._target - self._progress) * min(1.0, rl.get_frame_time() * 16.0) + else: + self._progress = self._target + + def _sync_from_param(self): + if self._slot.bound: + stored = self._slot.read_bool(self._state) + if stored != self._state: + self.set_state(stored) + + def _render(self, rect: rl.Rectangle): + self._sync_from_param() + self.update() + self._rect.y -= metrics.GUTTER / 2 + + # Track color blends grey -> teal gradient as the toggle animates on. + if self._enabled: + c_start = self._blend_color(OFF_COLOR, ON_START, self._progress) + c_end = self._blend_color(OFF_COLOR, ON_END, self._progress) + knob_color = KNOB_ON + else: + c_start = self._blend_color(OFF_DISABLED, ON_START_DISABLED, self._progress) + c_end = self._blend_color(OFF_DISABLED, ON_END_DISABLED, self._progress) + knob_color = KNOB_DISABLED + + x = self._rect.x + y = self._rect.y + w = metrics.TOGGLE_W + h = metrics.TOGGLE_TRACK_H + r = h / 2 + + # Gradient pill: rounded end caps + horizontal gradient body + rl.draw_circle(int(x + r), int(y + r), r, c_start) + rl.draw_circle(int(x + w - r), int(y + r), r, c_end) + canvas.h_sweep(int(x + r), int(y), int(w - 2 * r), int(h), c_start, c_end) + + # Subtle outline for definition + canvas.panel_outline(rl.Rectangle(x, y, w, h), 1.0, 16, 2, TRACK_BORDER) + + # Knob position + p = self._progress + left_edge = x + KNOB_PADDING + right_edge = x + w - KNOB_PADDING + knob_travel_distance = right_edge - left_edge - 2 * KNOB_RADIUS + knob_x = left_edge + KNOB_RADIUS + knob_travel_distance * p + knob_y = y + h / 2 + + # Subtle squish: the knob stretches along its travel and rounds back out at the ends — a tactile, + # liquid feel. m peaks (1.0) at mid-travel and is 0 at rest, so a settled knob is a clean circle. + m = 4.0 * p * (1.0 - p) + rh = KNOB_RADIUS * (1.0 + 0.22 * m) + rv = KNOB_RADIUS * (1.0 - 0.12 * m) + + # Soft drop shadow under the knob for depth + rl.draw_ellipse(int(knob_x), int(knob_y + 4), rh + 1, rv + 1, rl.Color(0, 0, 0, 38)) + rl.draw_ellipse(int(knob_x), int(knob_y + 2), rh, rv, rl.Color(0, 0, 0, 30)) + rl.draw_ellipse(int(knob_x), int(knob_y), rh, rv, knob_color) + + +# ===== option_control ===== + +# Dimensions and styling constants +BUTTON_WIDTH = 150 +BUTTON_HEIGHT = 150 +LABEL_WIDTH = 350 +BUTTON_SPACING = 25 +VALUE_FONT_SIZE = 50 +BUTTON_FONT_SIZE = 60 +CONTAINER_PADDING = 20 + +# Circular +/- button styling +BTN_INSET = 24 # gap between circle and container edge +GLYPH_THICK = 9 # +/- stroke thickness +CONTAINER_ROUNDNESS = 0.5 +BTN_BG = rl.Color(64, 67, 75, 255) # idle circle (lifted off the container) +BTN_BG_DISABLED = rl.Color(40, 42, 48, 255) +BTN_BG_PRESSED = rl.Color(16, 185, 169, 255) # teal on press +GLYPH_COLOR = rl.Color(52, 231, 200, 255) # teal +/- +GLYPH_PRESSED = rl.Color(10, 14, 16, 255) # dark glyph on teal +GLYPH_DISABLED = rl.Color(110, 112, 118, 255) + + +class _ValueCodec: + """Maps between the stepper's internal integer position and the stored/displayed value.""" + + def __init__(self, value_map: dict[int, int] | None, float_scaled: bool, + label_fn: Callable[[float | int], str] | None): + self._map = value_map + self._scaled = float_scaled + self._label_fn = label_fn + + def external(self, position: int): + if self._map: + return self._map[position] + return position / 100.0 if self._scaled else position + + def position_of(self, stored, fallback: int) -> int: + if self._map: + for pos, mapped in self._map.items(): + if mapped == stored: + return int(pos) + return fallback + try: + return int(round(float(stored) * 100.0)) if self._scaled else int(stored) + except (TypeError, ValueError): + return fallback + + def label(self, position: int) -> str: + if self._label_fn: + return self._label_fn(self.external(position)) + if self._map: + return str(self._map.get(position, position)) + if self._scaled: + return f"{position / 100.0:.2f}" + return str(position) + + +class IQOptionControl(ItemAction): + def __init__(self, param: str, min_value: int, max_value: int, + value_change_step: int = 1, enabled: bool | _Pred = True, + on_value_changed: Callable[[int], None] | None = None, + value_map: dict[int, int] | None = None, + label_width: int = LABEL_WIDTH, + use_float_scaling: bool = False, label_callback: Callable[[float | int], str] | None = None): + super().__init__(enabled=enabled) + self.param_key = param + self.min_value = min_value + self.max_value = max_value + self.value_change_step = value_change_step + self.on_value_changed = on_value_changed + self.label_width = label_width + # kept for callers introspecting the control + self.value_map = value_map + self.use_float_scaling = use_float_scaling + self.label_callback = label_callback + + self._slot = ParamSlot(param) + self._codec = _ValueCodec(value_map, use_float_scaling, label_callback) + self.current_value = self._clamp(self._codec.position_of(self._slot.read_raw(), min_value)) + + self._font = gui_app.font(FontWeight.MEDIUM) + self._zones: dict[int, rl.Rectangle] = {} # step delta sign -> hit rect + self.label_rect = rl.Rectangle(0, 0, 0, 0) + + def _clamp(self, position: int) -> int: + return max(self.min_value, min(self.max_value, position)) + + def get_value(self) -> int: + return self.current_value + + def set_value(self, value: int): + if not (self.min_value <= value <= self.max_value): + return + self.current_value = value + self._slot.write(self._codec.external(value)) + if self.on_value_changed: + self.on_value_changed(value) + + def get_displayed_value(self) -> str: + return self._codec.label(self.current_value) + + def _place(self, rect: rl.Rectangle): + control_w = BUTTON_WIDTH * 2 + self.label_width + BUTTON_SPACING * 2 + total_w = control_w + CONTAINER_PADDING * 2 + self._rect.width = total_w + x0 = self._rect.x + self._rect.width - total_w + y0 = rect.y + (rect.height - BUTTON_HEIGHT) / 2 + + self.container_rect = rl.Rectangle(x0, y0, total_w, BUTTON_HEIGHT) + self._zones = { + -1: rl.Rectangle(x0, y0, BUTTON_WIDTH + CONTAINER_PADDING, BUTTON_HEIGHT), + +1: rl.Rectangle(x0 + CONTAINER_PADDING + BUTTON_WIDTH + BUTTON_SPACING + self.label_width + BUTTON_SPACING, + y0, BUTTON_WIDTH + CONTAINER_PADDING, BUTTON_HEIGHT), + } + self.label_rect = rl.Rectangle(x0 + CONTAINER_PADDING + BUTTON_WIDTH + BUTTON_SPACING, y0, + self.label_width, BUTTON_HEIGHT) + + def _step_allowed(self, direction: int) -> bool: + if not self.enabled: + return False + return self.current_value > self.min_value if direction < 0 else self.current_value < self.max_value + + def _render(self, rect: rl.Rectangle): + if self._rect.width == 0 or self._rect.height == 0 or not self.is_visible: + return + + self._place(rect) + canvas.panel(self.container_rect, CONTAINER_ROUNDNESS, 20, ink.PANEL) + + for direction, zone in self._zones.items(): + self._draw_stepper(zone, direction, self._step_allowed(direction)) + + label = self.get_displayed_value() + size = measure_text_cached(self._font, label, VALUE_FONT_SIZE) + origin = rl.Vector2(self.label_rect.x + (self.label_rect.width - size.x) / 2, + self.label_rect.y + (self.label_rect.height - size.y) / 2) + canvas.glyphs(self._font, label, origin, VALUE_FONT_SIZE, ink.TITLE if self.enabled else ink.DISABLED) + + def _draw_stepper(self, zone: rl.Rectangle, direction: int, allowed: bool): + pressed = (allowed and self._touch_valid() + and rl.check_collision_point_rec(rl.get_mouse_position(), zone) + and rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT)) + + if not allowed: + circle, glyph = BTN_BG_DISABLED, GLYPH_DISABLED + elif pressed: + circle, glyph = BTN_BG_PRESSED, GLYPH_PRESSED + else: + circle, glyph = BTN_BG, GLYPH_COLOR + + cx = zone.x + zone.width / 2 + cy = zone.y + zone.height / 2 + radius = (BUTTON_HEIGHT - 2 * BTN_INSET) / 2 + rl.draw_circle(int(cx), int(cy), radius, circle) + + # Crisp drawn glyph (rounded bars) instead of a font character + arm = radius * 0.46 + canvas.panel(rl.Rectangle(cx - arm, cy - GLYPH_THICK / 2, arm * 2, GLYPH_THICK), 1.0, 6, glyph) + if direction > 0: + canvas.panel(rl.Rectangle(cx - GLYPH_THICK / 2, cy - arm, GLYPH_THICK, arm * 2), 1.0, 6, glyph) + + def _handle_mouse_release(self, mouse_pos: MousePos): + for direction, zone in self._zones.items(): + if self._step_allowed(direction) and rl.check_collision_point_rec(mouse_pos, zone): + self.set_value(self._clamp(self.current_value + direction * self.value_change_step)) + return + self.set_value(self.current_value) + + +# Preferred IQ-compatible generic alias. +OptionControl = IQOptionControl + + +# ===== progress_bar ===== + +# Download progress fill: gradient from 09A3AB (left) to E30985 (right). +FILL_START = rl.Color(0x09, 0xA3, 0xAB, 255) +FILL_END = rl.Color(0xE3, 0x09, 0x85, 255) + +_FONT_SIZE = 40 +_BAR_H = 60 +_PAD = 30 +_INSET = 4 +_SWEEP_FRACTION = 0.35 +_SWEEP_HZ = 0.7 + + +def _mix(a: rl.Color, b: rl.Color, t: float) -> rl.Color: + t = max(0.0, min(1.0, t)) + return rl.Color(int(a.r + (b.r - a.r) * t), int(a.g + (b.g - a.g) * t), int(a.b + (b.b - a.b) * t), 255) + + +class ProgressBarAction(ItemAction): + def __init__(self, width=600): + super().__init__(width=width) + self.progress = 0.0 + self.text = "" + self.show_progress = False + self.indeterminate = False + self.text_color = rl.GRAY + self._font = gui_app.font(FontWeight.NORMAL) + + def update(self, progress, text, show_progress=False, text_color=rl.GRAY, indeterminate=False): + self.progress = progress + self.text = text + self.show_progress = show_progress + self.text_color = text_color + self.indeterminate = indeterminate + + def _bar_geometry(self, rect: rl.Rectangle) -> tuple[rl.Rectangle, float]: + """Right-aligned bar sized to the text; a "NN% - detail" label reserves the + width of a full "100%" prefix so the bar doesn't jitter as digits change.""" + label_w = measure_text_cached(self._font, self.text, _FONT_SIZE).x + text_dx = _PAD + + prefix, sep, _ = self.text.partition(" - ") + if self.show_progress and sep: + widest_prefix = measure_text_cached(self._font, "100%", _FONT_SIZE).x + prefix_w = measure_text_cached(self._font, prefix, _FONT_SIZE).x + slack = widest_prefix - prefix_w + bar_w = label_w + slack + 2 * _PAD + text_dx = _PAD + slack + else: + bar_w = label_w + 2 * _PAD + text_dx = (bar_w - label_w) / 2 + + bar = rl.Rectangle(rect.x + rect.width - bar_w, rect.y + (rect.height - _BAR_H) / 2, bar_w, _BAR_H) + return bar, text_dx + + @staticmethod + def _fill_span(track: rl.Rectangle, lo: float, hi: float): + """Paint the [lo, hi] fraction of the track with the gradient section that + belongs to that span, so partial fills stay colour-consistent.""" + lo, hi = max(0.0, lo), min(1.0, hi) + if hi <= lo: + return + x0 = track.x + track.width * lo + x1 = track.x + track.width * hi + canvas.h_sweep(int(x0), int(track.y), int(x1 - x0), int(track.height), + _mix(FILL_START, FILL_END, lo), _mix(FILL_START, FILL_END, hi)) + + def _render(self, rect: rl.Rectangle): + bar, text_dx = self._bar_geometry(rect) + + if self.show_progress: + track = rl.Rectangle(bar.x + _INSET, bar.y + _INSET, bar.width - 2 * _INSET, bar.height - 2 * _INSET) + if track.width > 0: + if self.indeterminate: + # no known percentage (host didn't expose a size) — sweep a gradient window across + phase = (rl.get_time() * _SWEEP_HZ) % 1.0 + head = phase * (1.0 + _SWEEP_FRACTION) + self._fill_span(track, head - _SWEEP_FRACTION, head) + else: + self._fill_span(track, 0.0, self.progress / 100.0) + + label_h = measure_text_cached(self._font, self.text, _FONT_SIZE).y + rl.draw_text_ex(self._font, self.text, rl.Vector2(bar.x + text_dx, bar.y + (_BAR_H - label_h) / 2), + _FONT_SIZE, 0, self.text_color) + + +def progress_item(title): + return ListItem(title=title, action_item=ProgressBarAction()) + +from dataclasses import dataclass, field +from iqpilot.common.params import Params +from iqpilot.system.ui.iqwidgets.lib.styles import ink +from iqpilot.system.ui.iqwidgets.widgets.helpers.glyphs import draw_star +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import DialogResult +from iqpilot.system.ui.widgets.button import Button, ButtonStyle, BUTTON_PRESSED_BACKGROUND_COLORS +from iqpilot.system.ui.widgets.html_render import HtmlModal +from iqpilot.system.ui.widgets.keyboard import Keyboard +from iqpilot.system.ui.widgets.option_dialog import MultiOptionDialog + + +# ===== tree_dialog ===== + +TREE_TEAL = rl.Color(16, 185, 169, 255) +TREE_FOLDER_COLOR = rl.Color(48, 51, 58, 255) # brand header rows (lighter) +TREE_SEARCH_FILL = rl.Color(42, 45, 52, 255) +TREE_SEARCH_PRESSED = rl.Color(58, 62, 70, 255) +TREE_SEARCH_BORDER = rl.Color(255, 255, 255, 38) + +_STAR_SLOT = 90 # right-edge inset reserved for the favourite star +_ROW_H = 120 +_FRAME_PAD = 50 + + +@dataclass +class PickerItem: + ref: str + data: dict = field(default_factory=dict) + + +@dataclass +class PickerGroup: + folder: str + nodes: list + + +class _TreeRow(Button): + """One rendered row: a brand/folder header, or a selectable leaf with an optional star.""" + + def __init__(self, text, ref, is_folder=False, indent_level=0, click_callback=None, + favorite_callback=None, is_favorite=False, is_expanded=False): + super().__init__(text, click_callback, button_style=ButtonStyle.NORMAL, + text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + text_padding=20 + indent_level * 30, elide_right=True) + self.text = text + self.ref = ref + self.is_folder = is_folder + self.indent_level = indent_level + self.is_favorite = is_favorite + self.selected = False + self.is_expanded = is_expanded + self._favorite_callback = favorite_callback + self.text_padding = 20 + indent_level * 30 + self.border_radius = 10 + + def _fill_color(self): + if self.is_pressed: + return BUTTON_PRESSED_BACKGROUND_COLORS[self._button_style] + if self.selected and self.ref != "search_bar": + return TREE_TEAL + return TREE_FOLDER_COLOR if self.is_folder else ink.KEY_SUNKEN + + def _star_hitbox(self) -> rl.Rectangle: + return rl.Rectangle(self._rect.x + self._rect.width - _STAR_SLOT - 40, + self._rect.y + self._rect.height / 2 - 40, 80, 80) + + def _render(self, rect): + indent = 60 * self.indent_level + self._rect = rl.Rectangle(rect.x + indent, rect.y, rect.width - indent, rect.height) + roundness = self.border_radius / (min(self._rect.width, self._rect.height) / 2) + rl.draw_rectangle_rounded(self._rect, roundness, 10, self._fill_color()) + + cy = self._rect.y + self._rect.height / 2 + text_offset = self.text_padding + 20 + + if self.is_folder: + # chevron: down when expanded, right when collapsed + chev = gui_app.texture("icons/iq/chevron_down.png" if self.is_expanded else "icons/iq/chevron_right.png", + 40, 40, keep_aspect_ratio=True) + rl.draw_texture(chev, int(self._rect.x + self.text_padding + 6), int(cy - chev.height / 2), rl.Color(205, 205, 210, 255)) + text_offset = self.text_padding + 6 + 40 + 22 + elif self.indent_level > 0 and not self.selected: + # teal accent marking a model under the expanded brand + rl.draw_rectangle_rounded(rl.Rectangle(self._rect.x + 16, cy - 24, 6, 48), 1.0, 4, TREE_TEAL) + + self._label.render(rl.Rectangle(self._rect.x + text_offset, self._rect.y, + self._rect.width - text_offset - _STAR_SLOT, self._rect.height)) + + if not self.is_folder and self._favorite_callback: + draw_star(self._rect.x + self._rect.width - _STAR_SLOT, cy, 40, self.is_favorite, + ink.ACCENT if self.is_favorite else rl.GRAY) + + def _handle_mouse_release(self, mouse_pos): + if not self.is_folder and self._favorite_callback and rl.check_collision_point_rec(mouse_pos, self._star_hitbox()): + self._favorite_callback() + return True + return super()._handle_mouse_release(mouse_pos) + + +class PickerDialog(MultiOptionDialog): + """Folder/leaf picker with search, favourites, and a pinned current selection.""" + + def __init__(self, title, folders, current_ref="", fav_param="", option_font_weight=FontWeight.MEDIUM, search_prompt=None, + get_folders_fn=None, on_exit=None, display_func=None, search_funcs=None, search_title=None, search_subtitle=None): + super().__init__(title, [], current_ref, option_font_weight) + self.folders = folders + self.selection_ref = current_ref + self.fav_param = fav_param + self.expanded = set() + self._fav_slot = ParamSlot(fav_param or None) + stored = self._fav_slot.read_raw() + self.favorites = set(stored.split(';')) if stored else set() + self.query = "" + self.search_prompt = search_prompt or tr("Search") + self.get_folders_fn = get_folders_fn + self.on_exit = on_exit + self.display_func = display_func or (lambda node: node.data.get('display_name', node.ref)) + self.search_funcs = search_funcs or [lambda node: node.data.get('display_name', ''), lambda node: node.data.get('short_name', '')] + self.search_title = search_title or tr("Type to search") + self.search_subtitle = search_subtitle + self._search_rect: rl.Rectangle | None = None + self._search_pressed = False + + self.selection_node = self._locate_current(current_ref) + if self.selection_node is not None: + self.selection = self.current = self.display_func(self.selection_node) + + self._build_visible_items() + + # -- model ---------------------------------------------------------------- + def _locate_current(self, current_ref): + """Match by ref, by display text, or fall back to "Default" when no ref is set.""" + for folder in self.folders: + for node in folder.nodes: + display = self.display_func(node) + if node.ref == current_ref or display == current_ref or (not current_ref and node.ref == "Default"): + return node + return None + + def _node_matches(self, node) -> bool: + if not self.query: + return True + haystacks = [fn(node) for fn in self.search_funcs] + return bool(rank_matches(self.query, [h for h in haystacks if h])) + + def _leaf_row(self, node, depth: int, expanded: bool = False) -> _TreeRow: + fav_cb = None + if self.fav_param and node.ref != "Default": + fav_cb = lambda n=node: self._toggle_favorite(n) # noqa: E731 + return _TreeRow(self.display_func(node), node.ref, False, depth, + lambda n=node: self._select_node(n), + fav_cb, node.ref in self.favorites, is_expanded=expanded) + + def _build_visible_items(self, reset_scroll=True): + rows: list[_TreeRow] = [] + + # Pinned selected item at the very top (if any) + pinned = getattr(self, "selection_node", None) + if pinned is not None: + self.selection = self.current = self.display_func(pinned) + rows.append(self._leaf_row(pinned, 0, expanded=True)) + + for folder in self.folders: + visible_nodes = [n for n in folder.nodes if self._node_matches(n)] + if not visible_nodes and self.query: + continue + expanded = folder.folder in self.expanded or not folder.folder or bool(self.query) + if folder.folder: + rows.append(_TreeRow(folder.folder, "", True, 0, + lambda f=folder: self._toggle_folder(f), is_expanded=expanded)) + if expanded: + for node in visible_nodes: + if pinned is not None and node.ref == pinned.ref and not folder.folder: + continue # already pinned at the top + rows.append(self._leaf_row(node, 1 if folder.folder else 0, expanded=expanded)) + + self.visible_items = rows + self.option_buttons = rows + self.options = [row.text for row in rows] + self.scroller._items = rows + if reset_scroll: + self.scroller.scroll_panel.set_offset(0) + + # -- interactions --------------------------------------------------------- + def _select_node(self, node): + self.selection = self.display_func(node) + self.selection_ref = node.ref + + def _toggle_folder(self, folder): + if not folder.folder: + return + self.expanded.symmetric_difference_update({folder.folder}) + if folder is self.folders[-1] and folder.folder in self.expanded: + self.scroller.scroll_panel.set_offset(self.scroller.scroll_panel.offset - 200) + self._build_visible_items(reset_scroll=False) + + def _toggle_favorite(self, node): + self.favorites.symmetric_difference_update({node.ref}) + self._fav_slot.write(';'.join(self.favorites)) + if self.get_folders_fn: + self.folders = self.get_folders_fn(self.favorites) + self._build_visible_items(reset_scroll=False) + + def _open_search(self): + def _apply(result, text): + if result == DialogResult.CONFIRM: + self.query = text + self._build_visible_items() + gui_app.set_modal_overlay(self, callback=self.on_exit) + + open_text_prompt(self.search_title, self.search_subtitle, initial=self.query, on_done=_apply) + + # -- drawing -------------------------------------------------------------- + def _render(self, rect): + frame = rl.Rectangle(rect.x + _FRAME_PAD, rect.y + _FRAME_PAD, rect.width - 2 * _FRAME_PAD, rect.height - 2 * _FRAME_PAD) + rl.draw_rectangle_rounded(frame, 0.02, 20, rl.BLACK) + + title_rect = rl.Rectangle(frame.x + _FRAME_PAD, frame.y + _FRAME_PAD, frame.width * 0.5, 70) + gui_label(title_rect, self.title, 70, font_weight=FontWeight.BOLD) + + search_bottom = self._draw_search_field(frame, title_rect.y + title_rect.height + 36) + self._draw_choice_list(frame, search_bottom + 36) + self._draw_footer(frame) + return self._result + + def _draw_search_field(self, frame: rl.Rectangle, top: float) -> float: + self._search_rect = rl.Rectangle(frame.x + _FRAME_PAD, top, frame.width - 2 * _FRAME_PAD, 100) + rl.draw_rectangle_rounded(self._search_rect, 0.4, 16, TREE_SEARCH_PRESSED if self._search_pressed else TREE_SEARCH_FILL) + rl.draw_rectangle_rounded_lines_ex(self._search_rect, 0.4, 16, 2, TREE_SEARCH_BORDER) + + # Magnifying glass icon + icon_color = rl.Color(190, 190, 195, 255) + cx = self._search_rect.x + 54 + cy = self._search_rect.y + self._search_rect.height / 2 - 2 + radius = 24 + for i in range(4): + rl.draw_circle_lines(int(cx), int(cy), radius - i, icon_color) + rl.draw_line_ex(rl.Vector2(cx + radius * 0.65, cy + radius * 0.65), + rl.Vector2(cx + radius * 1.4, cy + radius * 1.4), 5, icon_color) + + # Query text, or muted placeholder + text_x = cx + radius * 1.4 + 34 + text_rect = rl.Rectangle(text_x, self._search_rect.y, + self._search_rect.x + self._search_rect.width - text_x - 24, self._search_rect.height) + if self.query: + gui_label(text_rect, self.query, 56, font_weight=FontWeight.MEDIUM) + else: + gui_label(text_rect, self.search_prompt, 56, color=rl.Color(150, 150, 155, 255), font_weight=FontWeight.NORMAL) + + return self._search_rect.y + self._search_rect.height + + def _draw_choice_list(self, frame: rl.Rectangle, top: float): + area = rl.Rectangle(frame.x + _FRAME_PAD, top, frame.width - 2 * _FRAME_PAD, + frame.height - (top - frame.y) - 210) + for row in self.option_buttons: + row.selected = (row.text == self.selection) + row.set_button_style(ButtonStyle.PRIMARY if row.selected else ButtonStyle.NORMAL) + row.set_rect(rl.Rectangle(0, 0, area.width, _ROW_H)) + self.scroller.render(area) + + def _draw_footer(self, frame: rl.Rectangle): + btn_w = (frame.width - 3 * _FRAME_PAD) / 2 + btn_y = frame.y + frame.height - 160 + + self.cancel_button._border_radius = self.select_button._border_radius = 44 + self.cancel_button.render(rl.Rectangle(frame.x + _FRAME_PAD, btn_y, btn_w, 160)) + + select_rect = rl.Rectangle(frame.x + 2 * _FRAME_PAD + btn_w, btn_y, btn_w, 160) + can_select = self.selection != self.current + self.select_button.set_enabled(can_select) + if can_select: + rl.draw_rectangle_rounded(select_rect, 44 / (min(select_rect.width, select_rect.height) / 2), 10, TREE_TEAL) + self.select_button.set_button_style(ButtonStyle.TRANSPARENT_WHITE_TEXT) + else: + self.select_button.set_button_style(ButtonStyle.NORMAL) + self.select_button.render(select_rect) + + # -- input ---------------------------------------------------------------- + def _handle_mouse_press(self, mouse_pos): + if self._search_rect and rl.check_collision_point_rec(mouse_pos, self._search_rect): + self._search_pressed = True + return True + return super()._handle_mouse_press(mouse_pos) + + def _handle_mouse_release(self, mouse_pos): + tapped_search = (self._search_pressed and self._search_rect + and rl.check_collision_point_rec(mouse_pos, self._search_rect)) + self._search_pressed = False + if tapped_search: + self._open_search() + return True + return super()._handle_mouse_release(mouse_pos) + + +# ===== text_prompt ===== + +def open_text_prompt(title: str, subtitle: str | None = None, initial: str = "", + param_key: str | None = None, + on_done: Callable[[DialogResult, str], None] | None = None, + min_len: int = 0, password: bool = False) -> Keyboard: + """Open the on-screen keyboard as a modal text prompt. + + On confirm, the entered text is optionally persisted to `param_key` and + passed to `on_done`; a cancel reports an empty string. + """ + pad = Keyboard(max_text_size=255, min_text_size=min_len, password_mode=password) + pad.set_title(title, subtitle) if subtitle else pad.set_title(title) + pad.set_text(initial) + + def _finish(result: DialogResult): + entered = pad.text if result == DialogResult.CONFIRM else "" + if entered and result == DialogResult.CONFIRM and param_key: + Params().put(param_key, entered) + if on_done: + on_done(result, entered) + + gui_app.set_modal_overlay(pad, _finish) + return pad + + +# ===== notice_modal ===== + +class NoticeModal(HtmlModal): + """HTML notice dialog whose OK press closes the overlay and reports CONFIRM.""" + + def __init__(self, file_path=None, text=None, callback=None): + super().__init__(file_path=file_path, text=text) + self.result = DialogResult.NO_ACTION + + def _dismiss(): + self.result = DialogResult.CONFIRM + gui_app.set_modal_overlay(None) + if callback: + callback(self.result) + + self._ok_button._click_callback = _dismiss + + def reset(self): + self.result = DialogResult.NO_ACTION + + +# ===== param binding (typed per-key params handle for IQ settings widgets) ===== + +class ParamSlot: + """Typed read/write handle for one params key, shared by IQ settings widgets. + + A widget owns a slot instead of talking to Params directly; missing keys + (params compiled out of a build) degrade to the fallback instead of raising. + """ + + _store = Params() + + def __init__(self, key: str | None): + self.key = key + + @property + def bound(self) -> bool: + return bool(self.key) + + def read_bool(self, fallback: bool = False) -> bool: + if not self.key: + return fallback + try: + return self._store.get_bool(self.key) + except UnknownKeyName: + return fallback + + def read_raw(self, fallback=None): + if not self.key: + return fallback + try: + value = self._store.get(self.key, return_default=True) + except UnknownKeyName: + return fallback + return fallback if value is None else value + + def read_int(self, fallback: int = 0) -> int: + try: + return int(self.read_raw(fallback)) + except (TypeError, ValueError): + return fallback + + def write(self, value) -> bool: + if not self.key: + return False + try: + if isinstance(value, bool): + self._store.put_bool(self.key, value) + else: + self._store.put(self.key, value) + except UnknownKeyName: + return False + return True + + +# ===== fuzzy match ranking (folder/search filtering for tree pickers) ===== + +def _fold(text: str) -> str: + return unicodedata.normalize("NFKD", text).encode("ascii", "ignore").decode("ascii").lower() + + +def _words_of(text: str) -> list[str]: + out, cur = [], [] + for ch in _fold(text): + if ch.isalnum(): + cur.append(ch) + elif cur: + out.append("".join(cur)) + cur = [] + if cur: + out.append("".join(cur)) + return out + + +def _is_subsequence(needle: str, haystack: str) -> bool: + it = iter(haystack) + return all(ch in it for ch in needle) + + +def _token_score(token: str, words: list[str], joined: str) -> int: + best = 0 + for w in words: + if w == token: + best = max(best, 100) + elif w.startswith(token): + best = max(best, 75) + elif token in w: + best = max(best, 40) + if not best and _is_subsequence(token, joined): + best = 10 + return best + + +def rank_matches(query: str, items: list[str]) -> list[str]: + tokens = _words_of(query) + if not tokens: + return list(items) + ranked = [] + for item in items: + words = _words_of(item) + joined = "".join(words) + total = 0 + for tok in tokens: + s = _token_score(tok, words, joined) + if s == 0: + total = 0 + break + total += s + if total: + ranked.append((total, item)) + ranked.sort(key=lambda pair: (-pair[0], items.index(pair[1]))) + return [item for _, item in ranked] diff --git a/iqpilot/system/ui/lib/__init__.py b/iqpilot/system/ui/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/ui/lib/application.py b/iqpilot/system/ui/lib/application.py new file mode 100644 index 000000000..20078712c --- /dev/null +++ b/iqpilot/system/ui/lib/application.py @@ -0,0 +1,1120 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import atexit +import cffi +import os +import queue +import time +import signal +import sys +import pyray as rl +import threading +import platform +import subprocess +from contextlib import contextmanager +from collections.abc import Callable +from collections import deque +from dataclasses import dataclass +from enum import StrEnum +from pathlib import Path +from typing import NamedTuple +from importlib.resources import as_file, files +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import EGL_DMA_BUF_SUPPORTED, HARDWARE, PC +from iqpilot.system.ui.lib.multilang import multilang +from iqpilot.common.realtime import Ratekeeper + +from iqpilot.system.ui.iqwidgets.lib.application import IQAppHooks +from iqpilot.system.ui.lib.screen_recorder import ScreenRecorder +from iqpilot.system.ui.lib.utils import gui_style_color + +_DEFAULT_FPS = int(os.getenv("FPS", {'tizi': 20, 'tici': 20}.get(HARDWARE.get_device_type(), 60))) +# Benign raylib warnings emitted on the headless DRM/EGL target (no window manager / monitor). +# These repeat on every UI init and carry no signal; the trace-log callback drops them. +_RAYLIB_BENIGN_WARNINGS = ( + "SetWindowState() not available on target platform", + "GetCurrentMonitor() not implemented on target platform", + "GetMonitorRefreshRate() not implemented on target platform", + "Failed to initialize color correction", +) +FPS_LOG_INTERVAL = 5 # Seconds between logging FPS drops +FPS_DROP_THRESHOLD = 0.9 # FPS drop threshold for triggering a warning +FPS_CRITICAL_THRESHOLD = 0.5 # Critical threshold for triggering strict actions +MOUSE_THREAD_RATE = 140 # touch controller runs at 140Hz +MAX_TOUCH_SLOTS = 2 +TOUCH_HISTORY_TIMEOUT = 3.0 # Seconds before touch points fade out + +BIG_UI = os.getenv("BIG", "0") == "1" +SMALL_UI = os.getenv("SMALL", "0") == "1" +ENABLE_VSYNC = os.getenv("ENABLE_VSYNC", "1") != "0" +VSYNC_REAPPLY_INTERVAL = float(os.getenv("VSYNC_REAPPLY_INTERVAL", "1.0")) +DISPLAY_SYNC_BEFORE_SWAP = os.getenv("UI_DISPLAY_SYNC_BEFORE_SWAP", "1" if not PC else "0") != "0" +SHOW_FPS = os.getenv("SHOW_FPS") == "1" +SHOW_TEMP_FPS = os.getenv("SHOW_TEMP_FPS") == "1" +SHOW_TOUCHES = os.getenv("SHOW_TOUCHES") == "1" +STRICT_MODE = os.getenv("STRICT_MODE") == "1" +SCALE = float(os.getenv("SCALE", "1.0")) +GRID_SIZE = int(os.getenv("GRID", "0")) +PROFILE_RENDER = int(os.getenv("PROFILE_RENDER", "0")) +PROFILE_STATS = int(os.getenv("PROFILE_STATS", "100")) # Number of functions to show in profile output +RECORD = os.getenv("RECORD") == "1" +RECORD_OUTPUT = str(Path(os.getenv("RECORD_OUTPUT", "output")).with_suffix(".mp4")) +RECORD_BITRATE = os.getenv("RECORD_BITRATE", "") # Target bitrate e.g. "2000k" +RECORD_SPEED = int(os.getenv("RECORD_SPEED", "1")) # Speed multiplier +OFFSCREEN = os.getenv("OFFSCREEN") == "1" # Disable FPS limiting for fast offline rendering + +GL_VERSION = """ +#version 300 es +precision highp float; +""" +if platform.system() == "Darwin": + GL_VERSION = """ + #version 330 core + """ + +BURN_IN_MODE = "BURN_IN" in os.environ +BURN_IN_VERTEX_SHADER = GL_VERSION + """ +in vec3 vertexPosition; +in vec2 vertexTexCoord; +uniform mat4 mvp; +out vec2 fragTexCoord; +void main() { + fragTexCoord = vertexTexCoord; + gl_Position = mvp * vec4(vertexPosition, 1.0); +} +""" +BURN_IN_FRAGMENT_SHADER = GL_VERSION + """ +in vec2 fragTexCoord; +uniform sampler2D texture0; +out vec4 fragColor; +void main() { + vec4 sampled = texture(texture0, fragTexCoord); + float intensity = sampled.b; + // Map blue intensity to green -> yellow -> red to highlight burn-in risk. + vec3 start = vec3(0.0, 1.0, 0.0); + vec3 middle = vec3(1.0, 1.0, 0.0); + vec3 end = vec3(1.0, 0.0, 0.0); + vec3 gradient = mix(start, middle, clamp(intensity * 2.0, 0.0, 1.0)); + gradient = mix(gradient, end, clamp((intensity - 0.5) * 2.0, 0.0, 1.0)); + fragColor = vec4(gradient, sampled.a); +} +""" + +DEFAULT_TEXT_SIZE = 60 +DEFAULT_TEXT_COLOR = rl.Color(255, 255, 255, int(255 * 0.9)) + +# Qt draws fonts accounting for ascent/descent differently, so compensate to match old styles +# The real scales for the fonts below range from 1.212 to 1.266 +FONT_SCALE = 1.242 if BIG_UI else 1.16 + +ASSETS_DIR = files("iqpilot.selfdrive").joinpath("assets") +FONT_DIR = ASSETS_DIR.joinpath("fonts") + + +class FontWeight(StrEnum): + LIGHT = "Inter-Light.fnt" + NORMAL = "Inter-Regular.fnt" if BIG_UI else "Inter-Medium.fnt" + MEDIUM = "Inter-Medium.fnt" + BOLD = "Inter-Bold.fnt" + SEMI_BOLD = "Inter-SemiBold.fnt" + UNIFONT = "unifont.fnt" + AUDIOWIDE = "Audiowide-Regular.fnt" + SYNCOPATE = "Syncopate-Regular.fnt" + + # Small UI fonts + DISPLAY_REGULAR = "Inter-Regular.fnt" + ROMAN = "Inter-Regular.fnt" + DISPLAY = "Inter-Bold.fnt" + + +FONT_SOURCE_FILES = { + FontWeight.LIGHT: "Inter-Light.ttf", + FontWeight.NORMAL: "Inter-Regular.ttf" if BIG_UI else "Inter-Medium.ttf", + FontWeight.MEDIUM: "Inter-Medium.ttf", + FontWeight.BOLD: "Inter-Bold.ttf", + FontWeight.SEMI_BOLD: "Inter-SemiBold.ttf", + FontWeight.UNIFONT: "unifont.otf", + FontWeight.AUDIOWIDE: "Audiowide-Regular.ttf", + FontWeight.SYNCOPATE: "Syncopate-Regular.ttf", + FontWeight.DISPLAY_REGULAR: "Inter-Regular.ttf", + FontWeight.ROMAN: "Inter-Regular.ttf", + FontWeight.DISPLAY: "Inter-Bold.ttf", +} + + +def font_fallback(font: rl.Font) -> rl.Font: + """Fall back to unifont for languages that require it.""" + if multilang.requires_unifont(): + return gui_app.font(FontWeight.UNIFONT) + return font + + +@dataclass +class ModalOverlay: + overlay: object = None + callback: Callable | None = None + + +class MousePos(NamedTuple): + x: float + y: float + + +class MousePosWithTime(NamedTuple): + x: float + y: float + t: float + + +class MouseEvent(NamedTuple): + pos: MousePos + slot: int + left_pressed: bool + left_released: bool + left_down: bool + t: float + + +class MouseState: + def __init__(self, scale: float = 1.0): + self._scale = scale + self._events: deque[MouseEvent] = deque(maxlen=MOUSE_THREAD_RATE) # bound event list + self._prev_mouse_event: list[MouseEvent | None] = [None] * MAX_TOUCH_SLOTS + + self._rk = Ratekeeper(MOUSE_THREAD_RATE, print_delay_threshold=None) + self._lock = threading.Lock() + self._exit_event = threading.Event() + self._thread = None + + def get_events(self) -> list[MouseEvent]: + with self._lock: + events = list(self._events) + self._events.clear() + return events + + def start(self): + self._exit_event.clear() + if self._thread is None or not self._thread.is_alive(): + self._thread = threading.Thread(target=self._run_thread, daemon=True) + self._thread.start() + + def stop(self): + self._exit_event.set() + if self._thread is not None and self._thread.is_alive(): + self._thread.join() + + def _run_thread(self): + while not self._exit_event.is_set(): + rl.poll_input_events() + self._handle_mouse_event() + self._rk.keep_time() + + def _handle_mouse_event(self): + for slot in range(MAX_TOUCH_SLOTS): + mouse_pos = rl.get_touch_position(slot) + x = mouse_pos.x / self._scale if self._scale != 1.0 else mouse_pos.x + y = mouse_pos.y / self._scale if self._scale != 1.0 else mouse_pos.y + ev = MouseEvent( + MousePos(x, y), + slot, + rl.is_mouse_button_pressed(slot), # noqa: TID251 + rl.is_mouse_button_released(slot), # noqa: TID251 + rl.is_mouse_button_down(slot), + time.monotonic(), + ) + # Only add changes + prev = self._prev_mouse_event[slot] + if prev is None or ev[:-1] != prev[:-1]: + with self._lock: + self._events.append(ev) + self._prev_mouse_event[slot] = ev + + +class GuiApplication(IQAppHooks): + def __init__(self, width: int | None = None, height: int | None = None): + self._set_log_callback() + + self._fonts: dict[FontWeight, rl.Font] = {} + self._width = width if width is not None else GuiApplication._default_width() + self._height = height if height is not None else GuiApplication._default_height() + + if PC and os.getenv("SCALE") is None: + self._scale = self._calculate_auto_scale() + else: + self._scale = SCALE + + # Scale, then ensure dimensions are even + self._scaled_width = int(self._width * self._scale) + self._scaled_height = int(self._height * self._scale) + self._scaled_width += self._scaled_width % 2 + self._scaled_height += self._scaled_height % 2 + + self._render_texture: rl.RenderTexture | None = None + self._screen_recorder: ScreenRecorder | None = None + self._burn_in_shader: rl.Shader | None = None + self._ffmpeg_proc: subprocess.Popen | None = None + self._ffmpeg_queue: queue.Queue | None = None + self._ffmpeg_thread: threading.Thread | None = None + self._ffmpeg_stop_event: threading.Event | None = None + self._textures: dict[str, rl.Texture] = {} + self._target_fps: int = _DEFAULT_FPS + self._last_frame_pacing_refresh_time: float = 0.0 + # Last swap interval we told EGL to use, and whether vsync is the active pacer. The Adreno/GBM + # EGL silently drops the swap interval back to 0 (intermittent screen tearing on scroll), so we + # re-assert it cheaply every frame — see _refresh_frame_pacing_if_needed. + self._vsync_interval: int = 0 + self._paced_by_vsync: bool = False + self._last_fps_log_time: float = time.monotonic() + self._frame = 0 + self._window_close_requested = False + self._modal_overlay = ModalOverlay() + self._modal_overlay_shown = False + self._modal_overlay_tick: Callable[[], None] | None = None + + self._nav_stack: list[object] = [] + self._nav_stack_ticks: list[Callable[[], None]] = [] + self._nav_stack_widgets_to_render = 1 if self.big_ui() else 2 + + self._mouse = MouseState(self._scale) + self._mouse_events: list[MouseEvent] = [] + self._last_mouse_event: MouseEvent = MouseEvent(MousePos(0, 0), 0, False, False, False, 0.0) + + self._should_render = True + self._display_sync_available: bool | None = None + + # Debug variables + self._mouse_history: deque[MousePosWithTime] = deque(maxlen=MOUSE_THREAD_RATE) + self._show_touches = SHOW_TOUCHES + self._show_fps = SHOW_FPS + self._grid_size = GRID_SIZE + self._profile_render_frames = PROFILE_RENDER + self._render_profiler = None + self._render_profile_start_time = None + + IQAppHooks.__init__(self) + + @property + def frame(self): + return self._frame + + def set_show_touches(self, show: bool): + self._show_touches = show + + def set_show_fps(self, show: bool): + self._show_fps = show + + @property + def target_fps(self): + return self._target_fps + + def _monitor_refresh_rate(self) -> int: + if not rl.is_window_ready(): + return 60 + try: + monitor = rl.get_current_monitor() + if monitor < 0: # PC: GLFW can fail to resolve a monitor; the C call segfaults on -1 + return 60 + refresh = int(rl.get_monitor_refresh_rate(monitor)) + except Exception: + refresh = 60 + return max(1, refresh or 60) + + def _apply_vsync_interval(self, fps: int) -> bool: + if OFFSCREEN or not rl.is_window_ready() or not ENABLE_VSYNC: + if hasattr(rl, "glfw_swap_interval") and rl.is_window_ready() and not OFFSCREEN: + try: + rl.glfw_swap_interval(0) + except Exception: + pass + if EGL_DMA_BUF_SUPPORTED and rl.is_window_ready() and not OFFSCREEN: + try: + from iqpilot.system.ui.lib.egl import set_swap_interval + set_swap_interval(0) + except Exception: + pass + return False + + if hasattr(rl, "set_window_state"): + rl.set_window_state(rl.ConfigFlags.FLAG_VSYNC_HINT) + + refresh = self._monitor_refresh_rate() + interval = 1 if fps >= refresh else max(1, round(refresh / fps)) + + glfw_vsync = False + if hasattr(rl, "glfw_swap_interval"): + try: + rl.glfw_swap_interval(interval) + glfw_vsync = True + except Exception: + glfw_vsync = False + + egl_vsync = False + if EGL_DMA_BUF_SUPPORTED: + try: + from iqpilot.system.ui.lib.egl import set_swap_interval + egl_vsync = set_swap_interval(interval) + except Exception: + egl_vsync = False + + paced = glfw_vsync or egl_vsync + self._paced_by_vsync = paced + self._vsync_interval = interval if paced else 0 + return paced + + @staticmethod + def _flush_raylib_batch() -> None: + if hasattr(rl, "rl_draw_render_batch_active"): + rl.rl_draw_render_batch_active() + + def _apply_display_sync_before_swap(self) -> None: + if not EGL_DMA_BUF_SUPPORTED or OFFSCREEN or not DISPLAY_SYNC_BEFORE_SWAP or self._display_sync_available is False: + return + try: + self._flush_raylib_batch() + from iqpilot.system.ui.lib.egl import finish_gl + self._display_sync_available = finish_gl() + except Exception: + self._display_sync_available = False + + def _apply_target_fps(self, fps: int): + fps = max(1, int(fps)) + paced_by_vsync = self._apply_vsync_interval(fps) + rl.set_target_fps(0 if OFFSCREEN or paced_by_vsync else fps) + self._target_fps = fps + self._last_frame_pacing_refresh_time = time.monotonic() + + def set_target_fps(self, fps: int): + fps = max(1, int(fps)) + if fps != self._target_fps: + self._apply_target_fps(fps) + + def _refresh_frame_pacing_if_needed(self): + if not ENABLE_VSYNC or OFFSCREEN: + return + # The Adreno/GBM EGL silently resets the swap interval back to 0, which shows up as + # intermittent screen tearing when scrolling (the content moves, so a mid-scanout swap is + # visible). eglSwapInterval is a trivial call, so re-assert it every frame to keep FIFO vsync + # pinned instead of relying on the slow (VSYNC_REAPPLY_INTERVAL) full re-apply below. + if self._paced_by_vsync and self._vsync_interval > 0 and EGL_DMA_BUF_SUPPORTED and rl.is_window_ready(): + try: + from iqpilot.system.ui.lib.egl import set_swap_interval + set_swap_interval(self._vsync_interval) + except Exception: + pass + if VSYNC_REAPPLY_INTERVAL > 0 and time.monotonic() - self._last_frame_pacing_refresh_time >= VSYNC_REAPPLY_INTERVAL: + self._apply_target_fps(self._target_fps) + + def request_close(self): + self._window_close_requested = True + + def init_window(self, title: str, fps: int = _DEFAULT_FPS, screen_recordable: bool = False): + with self._startup_profile_context(): + def _close(sig, frame): + self.close() + sys.exit(0) + signal.signal(signal.SIGINT, _close) + atexit.register(self.close) + + flags = rl.ConfigFlags.FLAG_MSAA_4X_HINT + if ENABLE_VSYNC and not OFFSCREEN: + flags |= rl.ConfigFlags.FLAG_VSYNC_HINT + rl.set_config_flags(flags) + + rl.init_window(self._scaled_width, self._scaled_height, title) + + needs_render_texture = self._scale != 1.0 or BURN_IN_MODE or RECORD + if self._scale != 1.0: + rl.set_mouse_scale(1 / self._scale, 1 / self._scale) + if needs_render_texture: + self._render_texture = rl.load_render_texture(self._width, self._height) + rl.set_texture_filter(self._render_texture.texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + + if RECORD: + output_fps = fps * RECORD_SPEED + ffmpeg_args = [ + 'ffmpeg', + '-v', 'warning', # Reduce ffmpeg log spam + '-nostats', # Suppress encoding progress + '-f', 'rawvideo', # Input format + '-pix_fmt', 'rgba', # Input pixel format + '-s', f'{self._width}x{self._height}', # Input resolution + '-r', str(fps), # Input frame rate + '-i', 'pipe:0', # Input from stdin + '-vf', 'vflip,format=yuv420p', # Flip vertically and convert to yuv420p + '-r', str(output_fps), # Output frame rate (for speed multiplier) + '-c:v', 'libx264', + '-preset', 'ultrafast', + ] + if RECORD_BITRATE: + ffmpeg_args += ['-b:v', RECORD_BITRATE, '-maxrate', RECORD_BITRATE, '-bufsize', RECORD_BITRATE] + ffmpeg_args += [ + '-y', # Overwrite existing file + '-f', 'mp4', # Output format + RECORD_OUTPUT, # Output file path + ] + self._ffmpeg_proc = subprocess.Popen(ffmpeg_args, stdin=subprocess.PIPE) + self._ffmpeg_queue = queue.Queue(maxsize=60) # Buffer up to 60 frames + self._ffmpeg_stop_event = threading.Event() + self._ffmpeg_thread = threading.Thread(target=self._ffmpeg_writer_thread, daemon=True) + self._ffmpeg_thread.start() + + self._apply_target_fps(fps) + if screen_recordable and not OFFSCREEN and not RECORD: + self._screen_recorder = ScreenRecorder(self._width, self._height, fps) + self._set_styles() + self._load_fonts() + self._patch_text_functions() + if BURN_IN_MODE and self._burn_in_shader is None: + self._burn_in_shader = rl.load_shader_from_memory(BURN_IN_VERTEX_SHADER, BURN_IN_FRAGMENT_SHADER) + + if not PC: + self._mouse.start() + + @contextmanager + def _startup_profile_context(self): + if "PROFILE_STARTUP" not in os.environ: + yield + return + + import cProfile + import io + import pstats + + profiler = cProfile.Profile() + start_time = time.monotonic() + profiler.enable() + + # do the init + yield + + profiler.disable() + elapsed_ms = (time.monotonic() - start_time) * 1e3 + + stats_stream = io.StringIO() + pstats.Stats(profiler, stream=stats_stream).sort_stats("cumtime").print_stats(25) + print("\n=== Startup profile ===") + print(stats_stream.getvalue().rstrip()) + + green = "\033[92m" + reset = "\033[0m" + print(f"{green}UI window ready in {elapsed_ms:.1f} ms{reset}") + sys.exit(0) + + def _ffmpeg_writer_thread(self): + """Background thread that writes frames to ffmpeg.""" + while True: + try: + data = self._ffmpeg_queue.get(timeout=1.0) + if data is None: # Sentinel to stop + break + self._ffmpeg_proc.stdin.write(data) + except queue.Empty: + if self._ffmpeg_stop_event.is_set(): + break + continue + except Exception: + break + + def set_modal_overlay(self, overlay, callback: Callable | None = None): + if self._modal_overlay.overlay is not None: + if hasattr(self._modal_overlay.overlay, 'hide_event'): + self._modal_overlay.overlay.hide_event() + + if self._modal_overlay.callback is not None: + self._modal_overlay.callback(-1) + + self._modal_overlay = ModalOverlay(overlay=overlay, callback=callback) + + # NavWidget dialogs (keyboard, confirm, etc.) return None from render() and self-close via an + # exit callback rather than a render result. Bridge them onto the legacy modal API so callers + # that still use set_modal_overlay (e.g. the setup's wifi password keyboard) keep working: + # clear the overlay and fire the modal callback when the NavWidget finishes. + if overlay is not None and hasattr(overlay, 'set_exit_callback'): + def _nav_exit(result, _ov=overlay, _cb=callback): + if self._modal_overlay.overlay is _ov: + self._modal_overlay = ModalOverlay() + if _cb is not None: + _cb(result) + overlay.set_exit_callback(_nav_exit) + + def set_modal_overlay_tick(self, tick_function: Callable | None): + self._modal_overlay_tick = tick_function + + + def push_widget(self, widget: object): + if widget in self._nav_stack: + cloudlog.warning("Widget already in stack, cannot push again!") + return + + if len(self._nav_stack) > 0: + prev_widget = self._nav_stack[-1] + prev_widget.set_enabled(False) + # The press that opened this new page may have armed a swipe/drag on the page now being + # covered. It won't be rendered while covered, so its own cleanup can't run; clear that + # stale state now so it doesn't track the finger the instant it's revealed again. + settle = getattr(prev_widget, "settle_to_top", None) + if settle is not None: + settle() + + self._nav_stack.append(widget) + widget.show_event() + widget.set_enabled(True) + + def pop_widget(self, idx: int | None = None): + if len(self._nav_stack) < 2: + cloudlog.warning("At least one widget should remain on the stack, ignoring pop!") + return + + idx_to_pop = len(self._nav_stack) - 1 if idx is None else idx + if idx_to_pop <= 0 or idx_to_pop >= len(self._nav_stack): + cloudlog.warning(f"Invalid index {idx_to_pop} to pop, ignoring!") + return + + if idx_to_pop == len(self._nav_stack) - 1: + prev_widget = self._nav_stack[idx_to_pop - 1] + prev_widget.set_enabled(True) + # The revealed page was hidden (not rendered) while covered, so an in-flight slide-in + # animation is frozen mid-way. Settle it to rest so it appears in place instead of + # bouncing/sliding in when it becomes visible again. + settle = getattr(prev_widget, "settle_to_top", None) + if settle is not None: + settle() + + widget = self._nav_stack.pop(idx_to_pop) + widget.hide_event() + + def pop_widgets_to(self, widget: object, callback: Callable[[], None] | None = None, instant: bool = False): + if widget not in self._nav_stack: + cloudlog.warning("Widget not in stack, cannot pop to it!") + return + + top_widget = self._nav_stack[-1] + if top_widget == widget: + if callback: + callback() + return + + while len(self._nav_stack) > 1 and self._nav_stack[-2] != widget: + self.pop_widget(len(self._nav_stack) - 2) + + if not instant: + top_widget.dismiss(callback) + else: + self.pop_widget() + + def get_active_widget(self): + if len(self._nav_stack) > 0: + return self._nav_stack[-1] + return None + + def widget_in_stack(self, widget: object) -> bool: + return widget in self._nav_stack + + def add_nav_stack_tick(self, tick_function: Callable[[], None]): + if tick_function not in self._nav_stack_ticks: + self._nav_stack_ticks.append(tick_function) + + def remove_nav_stack_tick(self, tick_function: Callable[[], None]): + if tick_function in self._nav_stack_ticks: + self._nav_stack_ticks.remove(tick_function) + + @property + def screen_recorder_active(self) -> bool: + return self._screen_recorder is not None and self._screen_recorder.active + + def set_should_render(self, should_render: bool): + if should_render and not self._should_render: + self._apply_target_fps(self._target_fps) + self._should_render = should_render + + def texture(self, asset_path: str, width: int | None = None, height: int | None = None, + alpha_premultiply=False, keep_aspect_ratio=True): + cache_key = f"{asset_path}_{width}_{height}_{alpha_premultiply}{keep_aspect_ratio}" + if cache_key in self._textures: + return self._textures[cache_key] + + with as_file(ASSETS_DIR.joinpath(asset_path)) as fspath: + image_obj = self._load_image_from_path(fspath.as_posix(), width, height, alpha_premultiply, keep_aspect_ratio) + texture_obj = self._load_texture_from_image(image_obj) + self._textures[cache_key] = texture_obj + return texture_obj + + def _load_image_from_path(self, image_path: str, width: int | None = None, height: int | None = None, + alpha_premultiply: bool = False, keep_aspect_ratio: bool = True) -> rl.Image: + """Load and resize an image, storing it for later automatic unloading.""" + image = rl.load_image(image_path) + + if alpha_premultiply: + rl.image_alpha_premultiply(image) + + if width is not None and height is not None: + same_dimensions = image.width == width and image.height == height + + # Resize with aspect ratio preservation if requested + if not same_dimensions: + if keep_aspect_ratio: + orig_width = image.width + orig_height = image.height + + if orig_width == 0 or orig_height == 0: + # Image failed to load (e.g. missing file); skip resize + return image + + scale_width = width / orig_width + scale_height = height / orig_height + + # Calculate new dimensions + scale = min(scale_width, scale_height) + new_width = int(orig_width * scale) + new_height = int(orig_height * scale) + + rl.image_resize(image, new_width, new_height) + else: + rl.image_resize(image, width, height) + else: + assert keep_aspect_ratio, "Cannot resize without specifying width and height" + return image + + def _load_texture_from_image(self, image: rl.Image) -> rl.Texture: + """Send image to GPU and unload original image.""" + texture = rl.load_texture_from_image(image) + # Set texture filtering to smooth the result + rl.set_texture_filter(texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + # prevent artifacts from wrapping coordinates + rl.set_texture_wrap(texture, rl.TextureWrap.TEXTURE_WRAP_CLAMP) + + rl.unload_image(image) + return texture + + def close_ffmpeg(self): + if self._ffmpeg_thread is not None: + # Signal thread to stop, send sentinel, then wait for it to drain + self._ffmpeg_stop_event.set() + self._ffmpeg_queue.put(None) + self._ffmpeg_thread.join(timeout=30) + + if self._ffmpeg_proc is not None: + self._ffmpeg_proc.stdin.flush() + self._ffmpeg_proc.stdin.close() + try: + self._ffmpeg_proc.wait(timeout=30) + except subprocess.TimeoutExpired: + self._ffmpeg_proc.terminate() + self._ffmpeg_proc.wait() + + def close(self): + if not rl.is_window_ready(): + return + + if self._screen_recorder is not None: + self._screen_recorder.close() + self._screen_recorder = None + + for texture in self._textures.values(): + rl.unload_texture(texture) + self._textures = {} + + for font in self._fonts.values(): + rl.unload_font(font) + self._fonts = {} + + if self._render_texture is not None: + rl.unload_render_texture(self._render_texture) + self._render_texture = None + + if self._burn_in_shader: + rl.unload_shader(self._burn_in_shader) + self._burn_in_shader = None + + if not PC: + self._mouse.stop() + + self.close_ffmpeg() + + rl.close_window() + + @property + def mouse_events(self) -> list[MouseEvent]: + return self._mouse_events + + @property + def last_mouse_event(self) -> MouseEvent: + return self._last_mouse_event + + def render(self): + try: + if self._profile_render_frames > 0: + import cProfile + self._render_profiler = cProfile.Profile() + self._render_profile_start_time = time.monotonic() + self._render_profiler.enable() + + while not (self._window_close_requested or rl.window_should_close()): + if PC: + # Thread is not used on PC, need to manually add mouse events + self._mouse._handle_mouse_event() + + # Store all mouse events for the current frame + self._mouse_events = self._mouse.get_events() + if len(self._mouse_events) > 0: + self._last_mouse_event = self._mouse_events[-1] + + # Skip rendering when screen is off + if not self._should_render: + if self._screen_recorder is not None: + self._screen_recorder.update(self._render_texture) + if PC: + rl.poll_input_events() + time.sleep(1 / self._target_fps) + yield False + continue + + self._refresh_frame_pacing_if_needed() + + capture_now = False + if self._screen_recorder is not None: + self._screen_recorder.update(self._render_texture) + capture_now = self._screen_recorder.begin_frame() + frame_rt = self._render_texture + # Only reroute through the recorder's RenderTexture (and pay the extra present-blit) + # on frames we will actually capture. + if frame_rt is None and capture_now: + frame_rt = self._screen_recorder.render_texture + + if frame_rt: + rl.begin_texture_mode(frame_rt) + rl.clear_background(rl.BLACK) + else: + rl.begin_drawing() + rl.clear_background(rl.BLACK) + + for tick in self._nav_stack_ticks: + tick() + to_render = self._nav_stack[-self._nav_stack_widgets_to_render:] + # Skip widgets fully hidden behind an opaque, settled top widget (e.g. the onroad + # camera view underneath the settings) — avoids redrawing them every frame. + if len(to_render) > 1: + covers = getattr(to_render[-1], 'covers_below', None) + if covers is not None and covers(): + to_render = to_render[-1:] + for widget in to_render: + widget.render(rl.Rectangle(0, 0, self.width, self.height)) + + # Handle modal overlay rendering and input processing + if self._handle_modal_overlay(): + # Allow a Widget to still run a function while overlay is shown + if self._modal_overlay_tick is not None: + self._modal_overlay_tick() + yield False + else: + yield True + + if frame_rt: + rl.end_texture_mode() + rl.begin_drawing() + rl.clear_background(rl.BLACK) + src_rect = rl.Rectangle(0, 0, float(self._width), -float(self._height)) + dst_rect = rl.Rectangle(0, 0, float(self._scaled_width), float(self._scaled_height)) + texture = frame_rt.texture + if texture: + if BURN_IN_MODE and self._burn_in_shader: + rl.begin_shader_mode(self._burn_in_shader) + rl.draw_texture_pro(texture, src_rect, dst_rect, rl.Vector2(0, 0), 0.0, rl.WHITE) + rl.end_shader_mode() + else: + rl.draw_texture_pro(texture, src_rect, dst_rect, rl.Vector2(0, 0), 0.0, rl.WHITE) + + # REC dot drawn to the screen every active frame (not into the recorder RT, so it + # neither flickers on non-capture frames nor bloats the video) + if self._screen_recorder is not None and self._screen_recorder.active: + self._screen_recorder.draw_indicator(self._scaled_width) + + if self._show_fps: + rl.draw_fps(10, 10) + + if SHOW_TEMP_FPS: + self._draw_tiny_fps() + + if self._show_touches: + self._draw_touch_points() + + if self.pointer_probe_enabled: + self.draw_pointer_probe(gui_app.font(FontWeight.SEMI_BOLD)) + + if self._grid_size > 0: + self._draw_grid() + + self._apply_display_sync_before_swap() + # Re-assert vsync FIFO one more time immediately before the swap. The pre-frame re-assert + # (_refresh_frame_pacing_if_needed) isn't enough during video playback: uploading/drawing a + # full-res frame texture can make the Adreno/GBM driver silently reset the swap interval to 0 + # *after* that call but before this swap, which reintroduced tearing. This is the swap that + # actually matters, so pin the interval here too. + if (ENABLE_VSYNC and not OFFSCREEN and EGL_DMA_BUF_SUPPORTED and self._paced_by_vsync + and self._vsync_interval > 0 and rl.is_window_ready()): + try: + from iqpilot.system.ui.lib.egl import set_swap_interval + set_swap_interval(self._vsync_interval) + except Exception: + pass + rl.end_drawing() + + if RECORD: + image = rl.load_image_from_texture(self._render_texture.texture) + data_size = image.width * image.height * 4 + data = bytes(rl.ffi.buffer(image.data, data_size)) + self._ffmpeg_queue.put(data) # Async write via background thread + rl.unload_image(image) + + if self._screen_recorder is not None and self._screen_recorder.active and frame_rt: + self._screen_recorder.capture(frame_rt) + + self._monitor_fps() + self._frame += 1 + + if self._profile_render_frames > 0 and self._frame >= self._profile_render_frames: + self._output_render_profile() + except KeyboardInterrupt: + pass + + def font(self, font_weight: FontWeight = FontWeight.NORMAL) -> rl.Font: + return self._fonts[font_weight] + + @property + def width(self): + return self._width + + @property + def height(self): + return self._height + + def _handle_modal_overlay(self) -> bool: + if self._modal_overlay.overlay: + if hasattr(self._modal_overlay.overlay, 'render'): + result = self._modal_overlay.overlay.render(rl.Rectangle(0, 0, self.width, self.height)) + elif callable(self._modal_overlay.overlay): + result = self._modal_overlay.overlay() + else: + raise Exception + + # Send show event to Widget + if not self._modal_overlay_shown and hasattr(self._modal_overlay.overlay, 'show_event'): + self._modal_overlay.overlay.show_event() + self._modal_overlay_shown = True + + # NavWidget overlays return None (they self-close via their exit callback, wired up in + # set_modal_overlay); only legacy overlays return an int result to act on here. + if result is not None and result >= 0: + # Clear the overlay and execute the callback + original_modal = self._modal_overlay + self._modal_overlay = ModalOverlay() + if hasattr(original_modal.overlay, 'hide_event'): + original_modal.overlay.hide_event() + if original_modal.callback is not None: + original_modal.callback(result) + return True + else: + self._modal_overlay_shown = False + return False + + def _load_fonts(self): + with as_file(FONT_DIR) as fspath: + for font_weight_file in FontWeight: + fnt_path = fspath / font_weight_file + if fnt_path.is_file(): + font = rl.load_font(fnt_path.as_posix()) + else: + source_name = FONT_SOURCE_FILES[font_weight_file] + source_path = fspath / source_name + cloudlog.warning(f"font atlas missing for {font_weight_file}, loading source font {source_name}") + font = rl.load_font_ex(source_path.as_posix(), 120, None, 0) + if font_weight_file != FontWeight.UNIFONT: + rl.gen_texture_mipmaps(font.texture) + rl.set_texture_filter(font.texture, rl.TextureFilter.TEXTURE_FILTER_TRILINEAR) + self._fonts[font_weight_file] = font + rl.gui_set_font(self._fonts[FontWeight.NORMAL]) + + def _set_styles(self): + rl.gui_set_style(rl.GuiControl.DEFAULT, rl.GuiControlProperty.BORDER_WIDTH, 0) + rl.gui_set_style(rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_SIZE, DEFAULT_TEXT_SIZE) + rl.gui_set_style(rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.BACKGROUND_COLOR, gui_style_color(rl.BLACK)) + rl.gui_set_style(rl.GuiControl.DEFAULT, rl.GuiControlProperty.TEXT_COLOR_NORMAL, gui_style_color(DEFAULT_TEXT_COLOR)) + rl.gui_set_style(rl.GuiControl.DEFAULT, rl.GuiControlProperty.BASE_COLOR_NORMAL, gui_style_color(rl.Color(50, 50, 50, 255))) + + def _patch_text_functions(self): + # Wrap pyray text APIs to apply a global text size scale so our px sizes match Qt + if not hasattr(rl, "_orig_draw_text_ex"): + rl._orig_draw_text_ex = rl.draw_text_ex + + def _draw_text_ex_scaled(font, text, position, font_size, spacing, tint): + font = font_fallback(font) + return rl._orig_draw_text_ex(font, text, position, font_size * FONT_SCALE, spacing, tint) + + rl.draw_text_ex = _draw_text_ex_scaled + + def _set_log_callback(self): + ffi_libc = cffi.FFI() + ffi_libc.cdef(""" + int vasprintf(char **strp, const char *fmt, void *ap); + void free(void *ptr); + """) + libc = ffi_libc.dlopen(None) + + @rl.ffi.callback("void(int, char *, void *)") + def trace_log_callback(log_level, text, args): + try: + text_addr = int(rl.ffi.cast("uintptr_t", text)) + args_addr = int(rl.ffi.cast("uintptr_t", args)) + text_libc = ffi_libc.cast("char *", text_addr) + args_libc = ffi_libc.cast("void *", args_addr) + + out = ffi_libc.new("char **") + if libc.vasprintf(out, text_libc, args_libc) >= 0 and out[0] != ffi_libc.NULL: + text_str = ffi_libc.string(out[0]).decode("utf-8", "replace") + libc.free(out[0]) + else: + text_str = rl.ffi.string(text).decode("utf-8", "replace") + except Exception as e: + text_str = f"[Log decode error: {e}]" + + text_str = text_str.replace("COMMA:", "IQ:") + + # raylib emits a fixed set of benign "not implemented on target platform" warnings on the + # comma's headless DRM/EGL backend (no window manager or monitor object). They carry no + # signal, repeat on every UI (re)init, and drown the log/tmux. Drop them entirely. + if any(s in text_str for s in _RAYLIB_BENIGN_WARNINGS): + return + + if log_level == rl.TraceLogLevel.LOG_ERROR: + cloudlog.error(f"raylib: {text_str}") + elif log_level == rl.TraceLogLevel.LOG_WARNING: + cloudlog.warning(f"raylib: {text_str}") + elif log_level == rl.TraceLogLevel.LOG_INFO: + cloudlog.info(f"raylib: {text_str}") + elif log_level == rl.TraceLogLevel.LOG_DEBUG: + cloudlog.debug(f"raylib: {text_str}") + else: + cloudlog.error(f"raylib: Unknown level {log_level}: {text_str}") + + # ensure we get all the logs forwarded to us + rl.set_trace_log_level(rl.TraceLogLevel.LOG_DEBUG) + + # Store callback reference + self._trace_log_callback = trace_log_callback + rl.set_trace_log_callback(self._trace_log_callback) + + def _monitor_fps(self): + fps = rl.get_fps() + + # Log FPS drop below threshold at regular intervals + if fps < self._target_fps * FPS_DROP_THRESHOLD: + current_time = time.monotonic() + if current_time - self._last_fps_log_time >= FPS_LOG_INTERVAL: + # debug not warning: transient drops shouldn't spam the shared console + cloudlog.debug(f"FPS dropped below {self._target_fps}: {fps}") + self._last_fps_log_time = current_time + + # Strict mode: terminate UI if FPS drops too much + if STRICT_MODE and fps < self._target_fps * FPS_CRITICAL_THRESHOLD: + cloudlog.error(f"FPS dropped critically below {fps}. Shutting down UI.") + self.close_ffmpeg() + os._exit(1) + + def _draw_touch_points(self): + current_time = time.monotonic() + + for mouse_event in self._mouse_events: + if mouse_event.left_pressed: + self._mouse_history.clear() + self._mouse_history.append(MousePosWithTime(mouse_event.pos.x * self._scale, mouse_event.pos.y * self._scale, current_time)) + + # Remove old touch points that exceed the timeout + while self._mouse_history and (current_time - self._mouse_history[0].t) > TOUCH_HISTORY_TIMEOUT: + self._mouse_history.popleft() + + if self._mouse_history: + mouse_pos = self._mouse_history[-1] + rl.draw_circle(int(mouse_pos.x), int(mouse_pos.y), 15, rl.RED) + for idx, mouse_pos in enumerate(self._mouse_history): + perc = idx / len(self._mouse_history) + color = rl.Color(min(int(255 * (1.5 - perc)), 255), int(min(255 * (perc + 0.5), 255)), 50, 255) + rl.draw_circle(int(mouse_pos.x), int(mouse_pos.y), 5, color) + + def _draw_grid(self): + grid_color = rl.Color(60, 60, 60, 255) + # Draw vertical lines + x = 0 + while x <= self._scaled_width: + rl.draw_line(x, 0, x, self._scaled_height, grid_color) + x += self._grid_size + # Draw horizontal lines + y = 0 + while y <= self._scaled_height: + rl.draw_line(0, y, self._scaled_width, y, grid_color) + y += self._grid_size + + def _draw_tiny_fps(self): + text = f"{rl.get_fps()} FPS" + font_size = 22 + font = self.font(FontWeight.MEDIUM) + rl.draw_text_ex(font, text, rl.Vector2(12, self._scaled_height - 34), font_size, 0, rl.Color(210, 210, 210, 170)) + + def _output_render_profile(self): + import io + import pstats + + self._render_profiler.disable() + elapsed_ms = (time.monotonic() - self._render_profile_start_time) * 1e3 + avg_frame_time = elapsed_ms / self._frame if self._frame > 0 else 0 + + stats_stream = io.StringIO() + pstats.Stats(self._render_profiler, stream=stats_stream).sort_stats("cumtime").print_stats(PROFILE_STATS) + print("\n=== Render loop profile ===") + print(stats_stream.getvalue().rstrip()) + + green = "\033[92m" + reset = "\033[0m" + print(f"\n{green}Rendered {self._frame} frames in {elapsed_ms:.1f} ms{reset}") + print(f"{green}Average frame time: {avg_frame_time:.2f} ms ({1000/avg_frame_time:.1f} FPS){reset}") + sys.exit(0) + + def _calculate_auto_scale(self) -> float: + # Create temporary window to query monitor info + rl.init_window(1, 1, "") + w, h = rl.get_monitor_width(0), rl.get_monitor_height(0) + rl.close_window() + + if w == 0 or h == 0 or (w >= self._width and h >= self._height): + return 1.0 + + # Apply 0.95 factor for window decorations/taskbar margin + return max(0.3, min(w / self._width, h / self._height) * 0.95) + + @staticmethod + def _default_width() -> int: + return 2160 if GuiApplication.big_ui() else 536 + + @staticmethod + def _default_height() -> int: + return 1080 if GuiApplication.big_ui() else 240 + + @staticmethod + def big_ui() -> bool: + if SMALL_UI: + return False + try: + from iqpilot.common.params import Params + if Params().get_bool("ForceSmallUI"): + return False + except ImportError: + # The compiled params_pyx isn't built yet during a first-install compile, when the + # loading spinner imports this before scons finishes. Without this guard the spinner + # crashes on import and the screen sits on the boot logo with no progress bar. The + # ForceSmallUI override doesn't matter for the build spinner — fall back to device type. + pass + return HARDWARE.get_device_type() in ('tici', 'tizi') or BIG_UI + + +gui_app = GuiApplication() diff --git a/iqpilot/system/ui/lib/egl.py b/iqpilot/system/ui/lib/egl.py new file mode 100644 index 000000000..dde4bcf0a --- /dev/null +++ b/iqpilot/system/ui/lib/egl.py @@ -0,0 +1,204 @@ +import os +import cffi +from dataclasses import dataclass +from typing import Any +from iqpilot.common.swaglog import cloudlog + +# EGL constants +EGL_LINUX_DMA_BUF_EXT = 0x3270 +EGL_WIDTH = 0x3057 +EGL_HEIGHT = 0x3056 +EGL_LINUX_DRM_FOURCC_EXT = 0x3271 +EGL_DMA_BUF_PLANE0_FD_EXT = 0x3272 +EGL_DMA_BUF_PLANE0_OFFSET_EXT = 0x3273 +EGL_DMA_BUF_PLANE0_PITCH_EXT = 0x3274 +EGL_DMA_BUF_PLANE1_FD_EXT = 0x3275 +EGL_DMA_BUF_PLANE1_OFFSET_EXT = 0x3276 +EGL_DMA_BUF_PLANE1_PITCH_EXT = 0x3277 +EGL_NONE = 0x3038 +GL_TEXTURE0 = 0x84C0 +GL_TEXTURE_EXTERNAL_OES = 0x8D65 + +# DRM Format for NV12 +DRM_FORMAT_NV12 = 842094158 + + +@dataclass +class EGLImage: + """Container for EGL image and associated resources""" + + egl_image: Any + fd: int + + +@dataclass +class EGLState: + """Container for all EGL-related state""" + + initialized: bool = False + ffi: Any = None + egl_lib: Any = None + gles_lib: Any = None + + # EGL display connection - shared across all users + display: Any = None + + # Constants + NO_CONTEXT: Any = None + NO_DISPLAY: Any = None + NO_IMAGE_KHR: Any = None + + # Function pointers + get_current_display: Any = None + create_image_khr: Any = None + destroy_image_khr: Any = None + image_target_texture: Any = None + get_error: Any = None + swap_interval: Any = None + bind_texture: Any = None + active_texture: Any = None + flush: Any = None + finish: Any = None + + +# Create a single instance of the state +_egl = EGLState() + + +def init_egl() -> bool: + """Initialize EGL and load necessary functions""" + global _egl + + # Don't re-initialize if already done + if _egl.initialized: + return True + + try: + _egl.ffi = cffi.FFI() + _egl.ffi.cdef(""" + typedef int EGLint; + typedef unsigned int EGLBoolean; + typedef unsigned int EGLenum; + typedef unsigned int GLenum; + typedef void *EGLContext; + typedef void *EGLDisplay; + typedef void *EGLClientBuffer; + typedef void *EGLImageKHR; + typedef void *GLeglImageOES; + + EGLDisplay eglGetCurrentDisplay(void); + EGLint eglGetError(void); + EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, + EGLenum target, EGLClientBuffer buffer, + const EGLint *attrib_list); + EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image); + EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval); + void glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image); + void glBindTexture(GLenum target, unsigned int texture); + void glActiveTexture(GLenum texture); + void glFlush(void); + void glFinish(void); + """) + + # Load libraries + _egl.egl_lib = _egl.ffi.dlopen("libEGL.so") + _egl.gles_lib = _egl.ffi.dlopen("libGLESv2.so") + + # Cast NULL pointers + _egl.NO_CONTEXT = _egl.ffi.cast("void *", 0) + _egl.NO_DISPLAY = _egl.ffi.cast("void *", 0) + _egl.NO_IMAGE_KHR = _egl.ffi.cast("void *", 0) + + # Bind functions + _egl.get_current_display = _egl.egl_lib.eglGetCurrentDisplay + _egl.create_image_khr = _egl.egl_lib.eglCreateImageKHR + _egl.destroy_image_khr = _egl.egl_lib.eglDestroyImageKHR + _egl.swap_interval = _egl.egl_lib.eglSwapInterval + _egl.image_target_texture = _egl.gles_lib.glEGLImageTargetTexture2DOES + _egl.get_error = _egl.egl_lib.eglGetError + _egl.bind_texture = _egl.gles_lib.glBindTexture + _egl.active_texture = _egl.gles_lib.glActiveTexture + _egl.flush = _egl.gles_lib.glFlush + _egl.finish = _egl.gles_lib.glFinish + + # Initialize EGL display once here + _egl.display = _egl.get_current_display() + if _egl.display == _egl.NO_DISPLAY: + raise RuntimeError("Failed to get EGL display") + + _egl.initialized = True + return True + except Exception as e: + cloudlog.exception(f"EGL initialization failed: {e}") + _egl.initialized = False + return False + + +def create_egl_image(width: int, height: int, stride: int, fd: int, uv_offset: int) -> EGLImage | None: + assert _egl.initialized, "EGL not initialized" + + try: + # Duplicate fd since EGL needs it + dup_fd = os.dup(fd) + except OSError as e: + cloudlog.exception(f"Failed to duplicate frame fd when creating EGL image: {e}") + return None + + # Create image attributes for EGL + img_attrs = [ + EGL_WIDTH, width, + EGL_HEIGHT, height, + EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_NV12, + EGL_DMA_BUF_PLANE0_FD_EXT, dup_fd, + EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, + EGL_DMA_BUF_PLANE0_PITCH_EXT, stride, + EGL_DMA_BUF_PLANE1_FD_EXT, dup_fd, + EGL_DMA_BUF_PLANE1_OFFSET_EXT, uv_offset, + EGL_DMA_BUF_PLANE1_PITCH_EXT, stride, + EGL_NONE + ] + + attr_array = _egl.ffi.new("int[]", img_attrs) + egl_image = _egl.create_image_khr(_egl.display, _egl.NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, _egl.ffi.NULL, attr_array) + + if egl_image == _egl.NO_IMAGE_KHR: + cloudlog.error(f"Failed to create EGL image: {_egl.get_error()}") + os.close(dup_fd) + return None + + return EGLImage(egl_image=egl_image, fd=dup_fd) + + +def destroy_egl_image(egl_image: EGLImage) -> None: + assert _egl.initialized, "EGL not initialized" + + _egl.destroy_image_khr(_egl.display, egl_image.egl_image) + + # Close the duplicated fd we created in create_egl_image() + # We need to handle OSError since the fd might already be closed + try: + os.close(egl_image.fd) + except OSError: + pass + + +def bind_egl_image_to_texture(texture_id: int, egl_image: EGLImage) -> None: + assert _egl.initialized, "EGL not initialized" + + _egl.active_texture(GL_TEXTURE0) + _egl.bind_texture(GL_TEXTURE_EXTERNAL_OES, texture_id) + _egl.image_target_texture(GL_TEXTURE_EXTERNAL_OES, egl_image.egl_image) + _egl.flush() + + +def set_swap_interval(interval: int) -> bool: + if not _egl.initialized and not init_egl(): + return False + return bool(_egl.swap_interval(_egl.display, max(0, int(interval)))) + + +def finish_gl() -> bool: + if not _egl.initialized and not init_egl(): + return False + _egl.finish() + return True diff --git a/iqpilot/system/ui/lib/emoji.py b/iqpilot/system/ui/lib/emoji.py new file mode 100644 index 000000000..459c4f4b4 --- /dev/null +++ b/iqpilot/system/ui/lib/emoji.py @@ -0,0 +1,67 @@ +import io +import re + +from PIL import Image, ImageDraw, ImageFont +import pyray as rl + +from iqpilot.system.ui.lib.application import FONT_DIR + +_emoji_font: ImageFont.FreeTypeFont | None = None +_cache: dict[str, rl.Texture] = {} + +EMOJI_REGEX = re.compile( +"""[\U0001F600-\U0001F64F +\U0001F300-\U0001F5FF +\U0001F680-\U0001F6FF +\U0001F1E0-\U0001F1FF +\U00002700-\U000027BF +\U0001F900-\U0001F9FF +\U00002600-\U000026FF +\U00002300-\U000023FF +\U00002B00-\U00002BFF +\U0001FA70-\U0001FAFF +\U0001F700-\U0001F77F +\u2640-\u2642 +\u2600-\u2B55 +\u200d +\u23cf +\u23e9 +\u231a +\ufe0f +\u3030 +]+""".replace("\n", ""), + flags=re.UNICODE +) + +_emoji_font_loaded = False + +def _load_emoji_font() -> ImageFont.FreeTypeFont | None: + global _emoji_font, _emoji_font_loaded + if not _emoji_font_loaded: + _emoji_font_loaded = True + try: + # FONT_DIR is an importlib.resources path. Inside the setup zipapp it points into the archive, + # so str() yields a path through the .zip that PIL can't open ("cannot open resource"). Read + # the bytes and hand PIL a file object so it works both on disk and inside the zipapp. + _emoji_font = ImageFont.truetype(io.BytesIO(FONT_DIR.joinpath("NotoColorEmoji.ttf").read_bytes()), 109) + except Exception: + _emoji_font = None # never crash the whole UI over an emoji glyph + return _emoji_font + +def find_emoji(text): + return [(m.start(), m.end(), m.group()) for m in EMOJI_REGEX.finditer(text)] + +def emoji_tex(emoji): + if emoji not in _cache: + font = _load_emoji_font() + if font is None: + return None + img = Image.new("RGBA", (128, 128), (0, 0, 0, 0)) + draw = ImageDraw.Draw(img) + draw.text((0, 0), emoji, font=font, embedded_color=True) + with io.BytesIO() as buffer: + img.save(buffer, format="PNG") + l = buffer.tell() + buffer.seek(0) + _cache[emoji] = rl.load_texture_from_image(rl.load_image_from_memory(".png", buffer.getvalue(), l)) + return _cache.get(emoji) diff --git a/iqpilot/system/ui/lib/multilang.py b/iqpilot/system/ui/lib/multilang.py new file mode 100644 index 000000000..6031d43e3 --- /dev/null +++ b/iqpilot/system/ui/lib/multilang.py @@ -0,0 +1,98 @@ +from collections.abc import Callable +from importlib.resources import files +import os +import json +import gettext +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.swaglog import cloudlog + +try: + from iqpilot.common.params import Params +except ImportError: + Params = None + +SYSTEM_UI_DIR = os.path.join(BASEDIR, "iqpilot", "system", "ui") +UI_DIR = files("iqpilot.selfdrive.ui") +TRANSLATIONS_DIR = UI_DIR.joinpath("translations") +LANGUAGES_FILE = TRANSLATIONS_DIR.joinpath("languages.json") + +UNIFONT_LANGUAGES = [ + "ar", + "th", + "zh-CHT", + "zh-CHS", + "ko", + "ja", +] + + +class Multilang: + def __init__(self): + self._params = Params() if Params is not None else None + self._language: str = "en" + self.languages = {} + self.codes = {} + self._translation: gettext.NullTranslations | gettext.GNUTranslations = gettext.NullTranslations() + self._change_callbacks: list[Callable[[], None]] = [] + self._load_languages() + + @property + def language(self) -> str: + return self._language + + def requires_unifont(self) -> bool: + """Certain languages require unifont to render their glyphs.""" + return self._language in UNIFONT_LANGUAGES + + def setup(self): + try: + with TRANSLATIONS_DIR.joinpath(f'app_{self._language}.mo').open('rb') as fh: + translation = gettext.GNUTranslations(fh) + translation.install() + self._translation = translation + cloudlog.debug(f"Loaded translations for language: {self._language}") + except FileNotFoundError: + cloudlog.error(f"No translation file found for language: {self._language}, using default.") + gettext.install('app') + self._translation = gettext.NullTranslations() + + def add_change_callback(self, callback: Callable[[], None]) -> None: + self._change_callbacks.append(callback) + + def change_language(self, language_code: str) -> None: + # Reinstall gettext with the selected language + self._params.put("LanguageSetting", language_code) + self._language = language_code + self.setup() + for callback in self._change_callbacks: + try: + callback() + except Exception: + cloudlog.exception("multilang: language change callback failed") + + def tr(self, text: str) -> str: + return self._translation.gettext(text) + + def trn(self, singular: str, plural: str, n: int) -> str: + return self._translation.ngettext(singular, plural, n) + + def _load_languages(self): + with LANGUAGES_FILE.open(encoding='utf-8') as f: + self.languages = json.load(f) + self.codes = {v: k for k, v in self.languages.items()} + + if self._params is not None: + lang = str(self._params.get("LanguageSetting")).removeprefix("main_") + if lang in self.codes: + self._language = lang + + +multilang = Multilang() +multilang.setup() + +tr, trn = multilang.tr, multilang.trn + + +# no-op marker for static strings translated later +def tr_noop(s: str) -> str: + return s diff --git a/iqpilot/system/ui/lib/networkmanager.py b/iqpilot/system/ui/lib/networkmanager.py new file mode 100644 index 000000000..1165a9892 --- /dev/null +++ b/iqpilot/system/ui/lib/networkmanager.py @@ -0,0 +1,47 @@ +from enum import IntEnum + + +# NetworkManager device states +class NMDeviceState(IntEnum): + UNKNOWN = 0 + DISCONNECTED = 30 + PREPARE = 40 + STATE_CONFIG = 50 + NEED_AUTH = 60 + IP_CONFIG = 70 + ACTIVATED = 100 + DEACTIVATING = 110 + + +# NetworkManager constants +NM = "org.freedesktop.NetworkManager" +NM_PATH = '/org/freedesktop/NetworkManager' +NM_IFACE = 'org.freedesktop.NetworkManager' +NM_ACCESS_POINT_IFACE = 'org.freedesktop.NetworkManager.AccessPoint' +NM_SETTINGS_PATH = '/org/freedesktop/NetworkManager/Settings' +NM_SETTINGS_IFACE = 'org.freedesktop.NetworkManager.Settings' +NM_CONNECTION_IFACE = 'org.freedesktop.NetworkManager.Settings.Connection' +NM_ACTIVE_CONNECTION_IFACE = 'org.freedesktop.NetworkManager.Connection.Active' +NM_WIRELESS_IFACE = 'org.freedesktop.NetworkManager.Device.Wireless' +NM_PROPERTIES_IFACE = 'org.freedesktop.DBus.Properties' +NM_DEVICE_IFACE = 'org.freedesktop.NetworkManager.Device' +NM_IP4_CONFIG_IFACE = 'org.freedesktop.NetworkManager.IP4Config' + +NM_DEVICE_TYPE_WIFI = 2 +NM_DEVICE_TYPE_MODEM = 8 +NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT = 8 +NM_DEVICE_STATE_REASON_NEW_ACTIVATION = 60 + +# https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NM80211ApFlags +NM_802_11_AP_FLAGS_NONE = 0x0 +NM_802_11_AP_FLAGS_PRIVACY = 0x1 +NM_802_11_AP_FLAGS_WPS = 0x2 + +# https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NM80211ApSecurityFlags +NM_802_11_AP_SEC_PAIR_WEP40 = 0x00000001 +NM_802_11_AP_SEC_PAIR_WEP104 = 0x00000002 +NM_802_11_AP_SEC_GROUP_WEP40 = 0x00000010 +NM_802_11_AP_SEC_GROUP_WEP104 = 0x00000020 +NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x00000100 +NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200 +NM_802_11_AP_SEC_KEY_MGMT_SAE = 0x00000400 # WPA3-Personal (SAE) diff --git a/iqpilot/system/ui/lib/os_update.py b/iqpilot/system/ui/lib/os_update.py new file mode 100644 index 000000000..806beee73 --- /dev/null +++ b/iqpilot/system/ui/lib/os_update.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +""" +IQ.OS compatibility check + in-place AGNOS update for the setup flow. + +A chosen IQ.Pilot channel may target a newer IQ.OS than the device is running +(its cloned tree pins the required version in launch_env.sh AGNOS_VERSION). When +that differs from the running /VERSION, the setup flow flashes the target IQ.OS +via comma's own agnos.py BEFORE writing continue.sh, so the single reboot lands +on a compatible OS. The risky flashing is delegated entirely to agnos.py; this +module only reads versions, picks the right manifest, and streams coarse +progress. +""" +import json +import os +import re +import subprocess +import threading +from typing import Callable + +VERSION_PATH = "/VERSION" + + +def current_os_version() -> str: + try: + with open(VERSION_PATH) as f: + return f.read().strip() + except Exception: + return "" + + +def required_agnos_version(install_path: str) -> str: + """Read the target OS version the cloned fork pins in launch_env.sh.""" + path = os.path.join(install_path, "launch_env.sh") + try: + with open(path) as f: + for line in f: + m = re.search(r'AGNOS_VERSION\s*=\s*"([^"]+)"', line) + if m: + return m.group(1).strip() + except Exception: + pass + return "" + + +def _hardware_dir(install_path: str) -> str: + nested = os.path.join(install_path, "iqpilot", "system", "hardware", "tici") + if os.path.isdir(nested): + return nested + return os.path.join(install_path, "system", "hardware", "tici") + + +def agnos_manifest_path(install_path: str, device_type: str) -> str: + # comma 3 (tici) uses a different AGNOS manifest than comma 3x (tizi) / comma 4 (mici). + fname = "agnos_tici_15_1.json" if device_type == "tici" else "agnos.json" + return os.path.join(_hardware_dir(install_path), fname) + + +def os_update_needed(install_path: str) -> tuple[bool, str, str]: + """Returns (needed, current, required).""" + current = current_os_version() + required = required_agnos_version(install_path) + needed = bool(required and current and required != current) + return needed, current, required + + +ProgressCb = Callable[[int, str], None] + + +def run_agnos_update(install_path: str, device_type: str, progress_cb: ProgressCb) -> bool: + """Flash + swap to the target IQ.OS. Streams coarse partition-level progress + via progress_cb(percent, note). Returns True on success. The device must be + rebooted by the caller afterward for the new slot to take effect.""" + manifest = agnos_manifest_path(install_path, device_type) + agnos_py = os.path.join(_hardware_dir(install_path), "agnos.py") + if not os.path.isfile(manifest) or not os.path.isfile(agnos_py): + progress_cb(0, "manifest_missing") + return False + + try: + total_partitions = max(1, len(json.load(open(manifest)))) + except Exception: + total_partitions = 1 + + progress_cb(1, "starting") + try: + proc = subprocess.Popen( + ["python3", agnos_py, "--swap", manifest], + cwd=install_path, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + env={**os.environ, "PYTHONPATH": install_path}, + ) + except Exception: + progress_cb(0, "launch_failed") + return False + + completed = 0 + swapping = False + assert proc.stdout is not None + for line in proc.stdout: + line = line.strip() + if "Downloading and writing" in line or "Already flashed" in line: + completed += 1 + pct = min(94, int((completed / total_partitions) * 90) + 2) + progress_cb(pct, "flashing") + elif "Swapping to slot" in line or "AGNOS ready" in line: + swapping = True + progress_cb(96, "swapping") + proc.wait() + if proc.returncode == 0: + progress_cb(100, "done") + return True + progress_cb(0, "failed" if not swapping else "swap_failed") + return False + + +class OsUpdateCoordinator: + """Bridges the setup UI's install thread and the BLE confirmation from the app. + The install thread posts a required-update, waits for the phone's confirm, then + runs the flash. On-screen setup can confirm locally too.""" + + def __init__(self): + self.confirmed = threading.Event() + self.needed = False + self.current = "" + self.required = "" + + def request(self, current: str, required: str) -> None: + self.needed = True + self.current = current + self.required = required + self.confirmed.clear() + + def confirm(self) -> None: + self.confirmed.set() + + def wait_for_confirm(self, timeout: float) -> bool: + return self.confirmed.wait(timeout=timeout) diff --git a/iqpilot/system/ui/lib/raylib_compat.py b/iqpilot/system/ui/lib/raylib_compat.py new file mode 100644 index 000000000..2ec04118d --- /dev/null +++ b/iqpilot/system/ui/lib/raylib_compat.py @@ -0,0 +1,34 @@ +"""Compatibility wrappers for raylib API differences between wheel generations. + +PC dev environments install the pypi raylib 5.5 wheel, while devices ship a wheel +built from comma's raylib fork, which carries newer upstream API changes: + + - DrawCircleGradient takes a Vector2 center instead of int x/y + - DrawRectangleGradientEx swapped its two right-corner color parameters + (old: topLeft, bottomLeft, topRight, bottomRight + new: topLeft, bottomLeft, bottomRight, topRight) + - LoadFontData grew an int *glyphCount out-param and returns a compacted array + (handled where it's used, in selfdrive/assets/fonts/process.py) + +The wheel is a single snapshot, so one signature identifies the generation for all +of them. Detect it from the C function type via cffi rather than hardcoding either +variant — the pyray wrappers are *args shims and can't be introspected directly. +""" +import pyray as rl +import raylib as _raylib + +_NEW_API = _raylib.ffi.typeof(_raylib.rl.DrawCircleGradient).args[0].cname != "int" + + +def draw_circle_gradient(center_x: float, center_y: float, radius: float, inner, outer) -> None: + if _NEW_API: + rl.draw_circle_gradient(rl.Vector2(center_x, center_y), radius, inner, outer) + else: + rl.draw_circle_gradient(int(center_x), int(center_y), radius, inner, outer) + + +def draw_rectangle_gradient_ex(rec, top_left, bottom_left, top_right, bottom_right) -> None: + if _NEW_API: + rl.draw_rectangle_gradient_ex(rec, top_left, bottom_left, bottom_right, top_right) + else: + rl.draw_rectangle_gradient_ex(rec, top_left, bottom_left, top_right, bottom_right) diff --git a/iqpilot/system/ui/lib/screen_recorder.py b/iqpilot/system/ui/lib/screen_recorder.py new file mode 100644 index 000000000..f2b8160a0 --- /dev/null +++ b/iqpilot/system/ui/lib/screen_recorder.py @@ -0,0 +1,293 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from __future__ import annotations + +import math +import os +import queue +import shutil +import subprocess +import threading +import time + +import pyray as rl + +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware.hw import Paths + +PARAM_KEY = "ScreenRecording" +PARAM_POLL_INTERVAL = 0.5 # seconds between param checks +CAPTURE_FPS = int(os.getenv("SCREEN_RECORD_FPS", "15")) +MAX_DURATION_S = int(os.getenv("SCREEN_RECORD_MAX_S", str(10 * 60))) # auto-stop safety +MIN_FREE_DISK_BYTES = 2 * 1024**3 # refuse to record with < 2GB free +QUEUE_MAX_FRAMES = 30 # ~2s of frames before we start dropping +MIN_VALID_OUTPUT_BYTES = 8 * 1024 +CRF = os.getenv("SCREEN_RECORD_CRF", "28") +MAX_BITRATE = os.getenv("SCREEN_RECORD_MAXRATE", "2M") +# capture at half res above this width (BIG UI 2160 -> 1080), native below (mici 536) +DOWNSCALE_THRESHOLD = 1200 +# Skip capture while the UI frame time is above this multiple of target: the readback +# (blocking glReadPixels) and extra present-blit stall the render thread, so back off and +# let the UI recover rather than dragging its framerate down. The recorder self-throttles. +BACKOFF_FRAME_TIME_RATIO = float(os.getenv("SCREEN_RECORD_BACKOFF", "1.35")) + + +class ScreenRecorder: + def __init__(self, width: int, height: int, target_fps: int): + self._width = width + self._height = height + scale = 2 if width > DOWNSCALE_THRESHOLD else 1 + # yuv420 needs even dimensions + self._rec_width = (width // scale) & ~1 + self._rec_height = (height // scale) & ~1 + self._target_fps = max(1, target_fps) + self._capture_fps = max(1, min(CAPTURE_FPS, target_fps)) + self._frame_interval = max(1, round(target_fps / self._capture_fps)) + self._target_frame_time = 1.0 / self._target_fps + + self._params = Params() + self._active = False + self._owns_rt = False + self._rt: rl.RenderTexture | None = None + self._small_rt: rl.RenderTexture | None = None + + self._proc: subprocess.Popen | None = None + self._queue: queue.Queue[bytes | None] | None = None + self._writer: threading.Thread | None = None + self._finalizers: list[threading.Thread] = [] + + self._frame_idx = 0 + self._dropped = 0 + self._backoff_skips = 0 + self._start_time = 0.0 + self._last_poll = 0.0 + self._out_path = "" + # after a self-initiated stop, don't restart until the param is observed False + self._await_param_clear = False + # adaptive backoff: EMA of the render-loop frame time + self._last_frame_t = 0.0 + self._frame_time_ema = 0.0 + self._capture_this_frame = False + + @property + def active(self) -> bool: + return self._active + + @property + def render_texture(self) -> rl.RenderTexture | None: + return self._rt + + def begin_frame(self) -> bool: + self._capture_this_frame = False + if not self._active: + return False + + now = time.monotonic() + if self._last_frame_t: + dt = now - self._last_frame_t + self._frame_time_ema = dt if self._frame_time_ema == 0.0 else 0.85 * self._frame_time_ema + 0.15 * dt + self._last_frame_t = now + + self._frame_idx += 1 + if self._frame_idx % self._frame_interval != 0: + return False + if self._frame_time_ema > self._target_frame_time * BACKOFF_FRAME_TIME_RATIO: + self._backoff_skips += 1 + if self._backoff_skips % 200 == 1: + cloudlog.warning(f"screen_recorder: UI busy, backing off capture ({self._backoff_skips} skips)") + return False + + self._capture_this_frame = True + return True + + def update(self, app_render_texture: rl.RenderTexture | None) -> None: + """Called every frame from the render thread. Handles start/stop and safety limits.""" + now = time.monotonic() + if self._active: + # encoder died (e.g. broken pipe) or hit the duration cap + if self._proc is not None and self._proc.poll() is not None: + cloudlog.error(f"screen_recorder: encoder exited unexpectedly rc={self._proc.returncode}") + self._stop(clear_param=True) + elif now - self._start_time > MAX_DURATION_S: + cloudlog.warning("screen_recorder: max duration reached, auto-stopping") + self._stop(clear_param=True) + + if now - self._last_poll < PARAM_POLL_INTERVAL: + return + self._last_poll = now + + want = self._params.get_bool(PARAM_KEY) + if self._await_param_clear: + if want: + return + self._await_param_clear = False + if want and not self._active: + self._start(app_render_texture) + elif not want and self._active: + self._stop(clear_param=False) + + def _start(self, app_render_texture: rl.RenderTexture | None) -> None: + root = Paths.screen_recordings_root() + try: + os.makedirs(root, exist_ok=True) + if shutil.disk_usage(root).free < MIN_FREE_DISK_BYTES: + cloudlog.warning("screen_recorder: not enough free disk space, refusing to record") + self._params.put_bool_nonblocking(PARAM_KEY, False) + return + except OSError as e: + cloudlog.exception(f"screen_recorder: cannot prepare output dir: {e}") + self._params.put_bool_nonblocking(PARAM_KEY, False) + return + + if app_render_texture is not None: + self._rt = app_render_texture + self._owns_rt = False + else: + self._rt = rl.load_render_texture(self._width, self._height) + rl.set_texture_filter(self._rt.texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + self._owns_rt = True + self._small_rt = rl.load_render_texture(self._rec_width, self._rec_height) + + self._out_path = os.path.join(root, time.strftime("screen_recording_%Y-%m-%d_%H-%M-%S.mp4")) + args = [ + 'ffmpeg', '-v', 'error', '-nostats', + '-f', 'rawvideo', '-pix_fmt', 'rgba', + '-s', f'{self._rec_width}x{self._rec_height}', + '-r', str(self._capture_fps), '-i', 'pipe:0', + '-vf', 'vflip,format=yuv420p', + '-c:v', 'libx264', '-preset', 'ultrafast', '-tune', 'zerolatency', + '-crf', CRF, '-maxrate', MAX_BITRATE, '-bufsize', '4M', + '-g', str(self._capture_fps * 2), + '-threads', '2', + # fragmented mp4: file stays playable even if we die before a clean stop + '-movflags', '+frag_keyframe+empty_moov+default_base_moof', + '-y', '-f', 'mp4', self._out_path, + ] + try: + self._proc = subprocess.Popen(args, stdin=subprocess.PIPE, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + preexec_fn=lambda: os.nice(15)) + except OSError as e: + cloudlog.exception(f"screen_recorder: failed to start ffmpeg: {e}") + self._release_textures() + self._params.put_bool_nonblocking(PARAM_KEY, False) + return + + self._queue = queue.Queue(maxsize=QUEUE_MAX_FRAMES) + self._writer = threading.Thread(target=self._writer_thread, args=(self._proc, self._queue), daemon=True) + self._writer.start() + + self._frame_idx = 0 + self._dropped = 0 + self._backoff_skips = 0 + self._last_frame_t = 0.0 + self._frame_time_ema = 0.0 + self._start_time = time.monotonic() + self._active = True + cloudlog.event("screen_recorder: started", path=self._out_path, + size=f"{self._rec_width}x{self._rec_height}", fps=self._capture_fps) + + def _stop(self, clear_param: bool) -> None: + self._active = False + proc, q, writer = self._proc, self._queue, self._writer + self._proc, self._queue, self._writer = None, None, None + self._release_textures() + + if clear_param: + self._params.put_bool_nonblocking(PARAM_KEY, False) + self._await_param_clear = True + + # finalize off the render thread; ffmpeg needs a clean stdin close to flush + out_path = self._out_path + def _finalize(): + try: + if q is not None: + q.put(None) + if writer is not None: + writer.join(timeout=10) + if proc is not None: + if proc.stdin is not None: + try: + proc.stdin.close() + except OSError: + pass + try: + proc.wait(timeout=15) + except subprocess.TimeoutExpired: + proc.terminate() + proc.wait(timeout=5) + try: + if out_path and os.path.getsize(out_path) < MIN_VALID_OUTPUT_BYTES: + os.remove(out_path) + cloudlog.warning(f"screen_recorder: discarded truncated output {out_path}") + except OSError: + pass + except Exception: + cloudlog.exception("screen_recorder: finalize failed") + + t = threading.Thread(target=_finalize, daemon=True) + t.start() + self._finalizers = [f for f in self._finalizers if f.is_alive()] + [t] + cloudlog.event("screen_recorder: stopped", path=self._out_path, dropped=self._dropped) + + def _release_textures(self) -> None: + # render thread only + if self._small_rt is not None: + rl.unload_render_texture(self._small_rt) + self._small_rt = None + if self._rt is not None and self._owns_rt: + rl.unload_render_texture(self._rt) + self._rt = None + self._owns_rt = False + + def capture(self, frame_rt: rl.RenderTexture) -> None: + if not self._capture_this_frame or self._small_rt is None or self._queue is None: + return + if self._queue.full(): + self._dropped += 1 + if self._dropped % 100 == 1: + cloudlog.warning(f"screen_recorder: encoder falling behind, dropped {self._dropped} frames") + return + + src = rl.Rectangle(0, 0, float(frame_rt.texture.width), -float(frame_rt.texture.height)) + dst = rl.Rectangle(0, 0, float(self._rec_width), float(self._rec_height)) + rl.begin_texture_mode(self._small_rt) + rl.draw_texture_pro(frame_rt.texture, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE) + rl.end_texture_mode() + + image = rl.load_image_from_texture(self._small_rt.texture) + try: + data = bytes(rl.ffi.buffer(image.data, self._rec_width * self._rec_height * 4)) + finally: + rl.unload_image(image) + try: + self._queue.put_nowait(data) + except queue.Full: + self._dropped += 1 + + def draw_indicator(self, width: int) -> None: + """Pulsing red REC dot, drawn into the frame so it shows on screen and in the video.""" + big = width > DOWNSCALE_THRESHOLD + radius = 14 if big else 7 + margin = (28 if big else 14) + radius + alpha = int(155 + 100 * math.sin(time.monotonic() * 4.0)) + rl.draw_circle(width - margin, margin, float(radius), rl.Color(255, 60, 60, alpha)) + + @staticmethod + def _writer_thread(proc: subprocess.Popen, q: queue.Queue[bytes | None]) -> None: + while True: + data = q.get() + if data is None: + break + try: + proc.stdin.write(data) + except (BrokenPipeError, OSError): + break + + def close(self) -> None: + if self._active: + self._stop(clear_param=False) + for t in self._finalizers: + t.join(timeout=15) diff --git a/iqpilot/system/ui/lib/scroll_panel.py b/iqpilot/system/ui/lib/scroll_panel.py new file mode 100644 index 000000000..795c21cb6 --- /dev/null +++ b/iqpilot/system/ui/lib/scroll_panel.py @@ -0,0 +1,136 @@ +import math +import pyray as rl +from enum import IntEnum +from iqpilot.system.ui.lib.application import gui_app, MouseEvent +from iqpilot.common.filter_simple import FirstOrderFilter + +# Scroll constants for smooth scrolling behavior +MOUSE_WHEEL_SCROLL_SPEED = 50 +BOUNCE_RETURN_RATE = 5 # ~0.92 at 60fps +MIN_VELOCITY = 2 # px/s, changes from auto scroll to steady state +MIN_VELOCITY_FOR_CLICKING = 2 * 60 # px/s, accepts clicks while auto scrolling below this velocity +DRAG_THRESHOLD = 12 # pixels of movement to consider it a drag, not a click + +DEBUG = False + + +class ScrollState(IntEnum): + IDLE = 0 # Not dragging, content may be bouncing or scrolling with inertia + DRAGGING_CONTENT = 1 # User is actively dragging the content + + +class GuiScrollPanel: + def __init__(self): + self._scroll_state: ScrollState = ScrollState.IDLE + self._last_mouse_y: float = 0.0 + self._start_mouse_y: float = 0.0 # Track the initial mouse position for drag detection + self._offset_filter_y = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + self._velocity_filter_y = FirstOrderFilter(0.0, 0.05, 1 / gui_app.target_fps) + self._last_drag_time: float = 0.0 + + def update(self, bounds: rl.Rectangle, content: rl.Rectangle) -> float: + for mouse_event in gui_app.mouse_events: + if mouse_event.slot == 0: + self._handle_mouse_event(mouse_event, bounds, content) + + self._update_state(bounds, content) + + return float(self._offset_filter_y.x) + + def _update_state(self, bounds: rl.Rectangle, content: rl.Rectangle): + if DEBUG: + rl.draw_rectangle_lines(0, 0, abs(int(self._velocity_filter_y.x)), 10, rl.RED) + + # wheel scrolls this panel only while the cursor sits inside its bounds + wheel = rl.get_mouse_wheel_move() + if wheel and rl.check_collision_point_rec(rl.get_mouse_position(), bounds): + self._offset_filter_y.x += wheel * MOUSE_WHEEL_SCROLL_SPEED + + max_scroll_distance = max(0, content.height - bounds.height) + if self._scroll_state == ScrollState.IDLE: + above_bounds, below_bounds = self._check_bounds(bounds, content) + + # Decay velocity when idle + if abs(self._velocity_filter_y.x) > MIN_VELOCITY: + # Faster decay if bouncing back from out of bounds + friction = math.exp(-BOUNCE_RETURN_RATE * 1 / gui_app.target_fps) + self._velocity_filter_y.x *= friction ** 2 if (above_bounds or below_bounds) else friction + else: + self._velocity_filter_y.x = 0.0 + + if above_bounds or below_bounds: + if above_bounds: + self._offset_filter_y.update(0) + else: + self._offset_filter_y.update(-max_scroll_distance) + + self._offset_filter_y.x += self._velocity_filter_y.x / gui_app.target_fps + + elif self._scroll_state == ScrollState.DRAGGING_CONTENT: + # Mouse not moving, decay velocity + if not len(gui_app.mouse_events): + self._velocity_filter_y.update(0.0) + + # Settle to exact bounds + if abs(self._offset_filter_y.x) < 1e-2: + self._offset_filter_y.x = 0.0 + elif abs(self._offset_filter_y.x + max_scroll_distance) < 1e-2: + self._offset_filter_y.x = -max_scroll_distance + + def _handle_mouse_event(self, mouse_event: MouseEvent, bounds: rl.Rectangle, content: rl.Rectangle): + if self._scroll_state == ScrollState.IDLE: + if rl.check_collision_point_rec(mouse_event.pos, bounds): + if mouse_event.left_pressed: + self._start_mouse_y = mouse_event.pos.y + # Interrupt scrolling with new drag + # TODO: stop scrolling with any tap, need to fix is_touch_valid + if abs(self._velocity_filter_y.x) > MIN_VELOCITY_FOR_CLICKING: + self._scroll_state = ScrollState.DRAGGING_CONTENT + # Start velocity at initial measurement for more immediate response + self._velocity_filter_y.initialized = False + + if mouse_event.left_down: + if abs(mouse_event.pos.y - self._start_mouse_y) > DRAG_THRESHOLD: + self._scroll_state = ScrollState.DRAGGING_CONTENT + # Start velocity at initial measurement for more immediate response + self._velocity_filter_y.initialized = False + + elif self._scroll_state == ScrollState.DRAGGING_CONTENT: + if mouse_event.left_released: + self._scroll_state = ScrollState.IDLE + else: + delta_y = mouse_event.pos.y - self._last_mouse_y + above_bounds, below_bounds = self._check_bounds(bounds, content) + # Rubber banding effect when out of bands + if above_bounds or below_bounds: + delta_y /= 3 + + self._offset_filter_y.x += delta_y + + # Track velocity for inertia + dt = mouse_event.t - self._last_drag_time + if dt > 0: + drag_velocity = delta_y / dt + self._velocity_filter_y.update(drag_velocity) + + # TODO: just store last mouse event! + self._last_drag_time = mouse_event.t + self._last_mouse_y = mouse_event.pos.y + + def _check_bounds(self, bounds: rl.Rectangle, content: rl.Rectangle) -> tuple[bool, bool]: + max_scroll_distance = max(0, content.height - bounds.height) + above_bounds = self._offset_filter_y.x > 0 + below_bounds = self._offset_filter_y.x < -max_scroll_distance + return above_bounds, below_bounds + + def is_touch_valid(self): + return self._scroll_state == ScrollState.IDLE and abs(self._velocity_filter_y.x) < MIN_VELOCITY_FOR_CLICKING + + def set_offset(self, position: float) -> None: + self._offset_filter_y.x = position + self._velocity_filter_y.x = 0.0 + self._scroll_state = ScrollState.IDLE + + @property + def offset(self) -> float: + return float(self._offset_filter_y.x) diff --git a/iqpilot/system/ui/lib/scroll_panel2.py b/iqpilot/system/ui/lib/scroll_panel2.py new file mode 100644 index 000000000..923661067 --- /dev/null +++ b/iqpilot/system/ui/lib/scroll_panel2.py @@ -0,0 +1,230 @@ +import os +import math +import pyray as rl +from collections.abc import Callable +from enum import Enum +from typing import cast +from iqpilot.system.ui.lib.application import gui_app, MouseEvent +from iqpilot.system.hardware import TICI +from collections import deque + +MIN_VELOCITY = 10 # px/s, changes from auto scroll to steady state +MIN_VELOCITY_FOR_CLICKING = 2 * 60 # px/s, accepts clicks while auto scrolling below this velocity +MIN_DRAG_PIXELS = 12 +AUTO_SCROLL_TC_SNAP = 0.025 +AUTO_SCROLL_TC = 0.18 +BOUNCE_RETURN_RATE = 10.0 +REJECT_DECELERATION_FACTOR = 3 +MAX_SPEED = 10000.0 # px/s + +DEBUG = os.getenv("DEBUG_SCROLL", "0") == "1" + + +def weighted_velocity(buffer: deque[float]) -> float: + if len(buffer) >= 3: + return buffer[-3] * 0.6 + buffer[-2] * 0.35 + buffer[-1] * 0.05 + if len(buffer) == 2: + return buffer[-2] * 0.7 + buffer[-1] * 0.3 + if len(buffer) == 1: + return buffer[-1] + return 0.0 + + +# from https://ariya.io/2011/10/flick-list-with-its-momentum-scrolling-and-deceleration +class ScrollState(Enum): + STEADY = 0 + PRESSED = 1 + MANUAL_SCROLL = 2 + AUTO_SCROLL = 3 + + +class GuiScrollPanel2: + def __init__(self, horizontal: bool = True, handle_out_of_bounds: bool = True) -> None: + self._horizontal = horizontal + self._handle_out_of_bounds = handle_out_of_bounds + self._AUTO_SCROLL_TC = AUTO_SCROLL_TC_SNAP if not self._handle_out_of_bounds else AUTO_SCROLL_TC + self._state = ScrollState.STEADY + self._offset: rl.Vector2 = rl.Vector2(0, 0) + self._initial_click_event: MouseEvent | None = None + self._previous_mouse_event: MouseEvent | None = None + self._velocity = 0.0 # pixels per second + self._velocity_buffer: deque[float] = deque(maxlen=12 if TICI else 6) + self._enabled: bool | Callable[[], bool] = True + + def set_enabled(self, enabled: bool | Callable[[], bool]) -> None: + self._enabled = enabled + + @property + def enabled(self) -> bool: + return self._enabled() if callable(self._enabled) else self._enabled + + def update(self, bounds: rl.Rectangle, content_size: float) -> float: + if DEBUG: + print('Old state:', self._state) + + bounds_size = bounds.width if self._horizontal else bounds.height + + for mouse_event in gui_app.mouse_events: + self._handle_mouse_event(mouse_event, bounds, bounds_size, content_size) + self._previous_mouse_event = mouse_event + + self._update_state(bounds_size, content_size) + + if DEBUG: + print('Velocity:', self._velocity) + print('Offset X:', self._offset.x, 'Y:', self._offset.y) + print('New state:', self._state) + print() + return self.get_offset() + + def _get_offset_bounds(self, bounds_size: float, content_size: float) -> tuple[float, float]: + """Returns (max_offset, min_offset) for the given bounds and content size.""" + return 0.0, min(0.0, bounds_size - content_size) + + def _update_state(self, bounds_size: float, content_size: float) -> None: + """Runs per render frame, independent of mouse events. Updates auto-scrolling state and velocity.""" + if self._state == ScrollState.AUTO_SCROLL: + max_offset, min_offset = self._get_offset_bounds(bounds_size, content_size) + # simple exponential return if out of bounds + out_of_bounds = self.get_offset() > max_offset or self.get_offset() < min_offset + if out_of_bounds and self._handle_out_of_bounds: + target = max_offset if self.get_offset() > max_offset else min_offset + + dt = rl.get_frame_time() or 1e-6 + factor = 1.0 - math.exp(-BOUNCE_RETURN_RATE * dt) + + dist = target - self.get_offset() + self.set_offset(self.get_offset() + dist * factor) # ease toward the edge + self._velocity *= (1.0 - factor) # damp any leftover fling + + # Steady once we are close enough to the target + if abs(dist) < 1 and abs(self._velocity) < MIN_VELOCITY: + self.set_offset(target) + self._velocity = 0.0 + self._state = ScrollState.STEADY + + elif abs(self._velocity) < MIN_VELOCITY: + self._velocity = 0.0 + self._state = ScrollState.STEADY + + # Update the offset based on the current velocity + dt = rl.get_frame_time() + self.set_offset(self.get_offset() + self._velocity * dt) # Adjust the offset based on velocity + alpha = 1 - (dt / (self._AUTO_SCROLL_TC + dt)) + self._velocity *= alpha + + def _handle_mouse_event(self, mouse_event: MouseEvent, bounds: rl.Rectangle, bounds_size: float, + content_size: float) -> None: + max_offset, min_offset = self._get_offset_bounds(bounds_size, content_size) + # simple exponential return if out of bounds + out_of_bounds = self.get_offset() > max_offset or self.get_offset() < min_offset + if DEBUG: + print('Mouse event:', mouse_event) + + mouse_pos = self._get_mouse_pos(mouse_event) + + if not self.enabled: + # Reset state if not enabled + self._state = ScrollState.STEADY + self._velocity = 0.0 + self._velocity_buffer.clear() + + elif self._state == ScrollState.STEADY: + if rl.check_collision_point_rec(mouse_event.pos, bounds): + if mouse_event.left_pressed: + self._state = ScrollState.PRESSED + self._initial_click_event = mouse_event + + elif self._state == ScrollState.PRESSED: + initial_click_pos = self._get_mouse_pos(cast(MouseEvent, self._initial_click_event)) + diff = abs(mouse_pos - initial_click_pos) + if mouse_event.left_released: + # Special handling for down and up clicks across two frames + # TODO: not sure what that means or if it's accurate anymore + if out_of_bounds: + self._state = ScrollState.AUTO_SCROLL + elif diff <= MIN_DRAG_PIXELS: + self._state = ScrollState.STEADY + else: + self._state = ScrollState.MANUAL_SCROLL + elif diff > MIN_DRAG_PIXELS: + self._state = ScrollState.MANUAL_SCROLL + + elif self._state == ScrollState.MANUAL_SCROLL: + if mouse_event.left_released: + high_decel = False + if len(self._velocity_buffer) > 2: + abs_velocity_buffer = [(abs(v), i) for i, v in enumerate(self._velocity_buffer)] + max_idx = max(abs_velocity_buffer[:len(abs_velocity_buffer) // 2])[1] + min_idx = min(abs_velocity_buffer)[1] + if DEBUG: + print('min_idx:', min_idx, 'max_idx:', max_idx, 'velocity buffer:', self._velocity_buffer) + if (abs(self._velocity_buffer[min_idx]) * REJECT_DECELERATION_FACTOR < abs(self._velocity_buffer[max_idx]) and + max_idx < min_idx): + if DEBUG: + print('deceleration too high, going to STEADY') + high_decel = True + + self._velocity = weighted_velocity(self._velocity_buffer) + low_speed = abs(self._velocity) <= MIN_VELOCITY_FOR_CLICKING * 1.5 # plus some margin + + if out_of_bounds or not (high_decel or low_speed): + self._state = ScrollState.AUTO_SCROLL + else: + # TODO: we should just set velocity and let autoscroll go back to steady. delays one frame but who cares + self._velocity = 0.0 + self._state = ScrollState.STEADY + self._velocity_buffer.clear() + else: + # Update velocity for when we release the mouse button. + # Do not update velocity on the same frame the mouse was released + previous_mouse_pos = self._get_mouse_pos(cast(MouseEvent, self._previous_mouse_event)) + delta_x = mouse_pos - previous_mouse_pos + delta_t = max((mouse_event.t - cast(MouseEvent, self._previous_mouse_event).t), 1e-6) + self._velocity = delta_x / delta_t + self._velocity = max(-MAX_SPEED, min(MAX_SPEED, self._velocity)) + self._velocity_buffer.append(self._velocity) + + # rubber-banding: reduce dragging when out of bounds + # TODO: this drifts when dragging quickly + if out_of_bounds: + delta_x *= 0.25 + + # Update the offset based on the mouse movement + # Use internal _offset directly to preserve precision (don't round via get_offset()) + # TODO: make get_offset return float + current_offset = self._offset.x if self._horizontal else self._offset.y + self.set_offset(current_offset + delta_x) + + elif self._state == ScrollState.AUTO_SCROLL: + if mouse_event.left_pressed: + # Decide whether to click or scroll (block click if moving too fast) + if abs(self._velocity) <= MIN_VELOCITY_FOR_CLICKING: + # Traveling slow enough, click + self._state = ScrollState.PRESSED + self._initial_click_event = mouse_event + else: + # Go straight into manual scrolling to block erroneous input + self._state = ScrollState.MANUAL_SCROLL + # Reset velocity for touch down and up events that happen in back-to-back frames + self._velocity = 0.0 + + def _get_mouse_pos(self, mouse_event: MouseEvent) -> float: + return mouse_event.pos.x if self._horizontal else mouse_event.pos.y + + def get_offset(self) -> float: + return self._offset.x if self._horizontal else self._offset.y + + def set_offset(self, value: float) -> None: + if self._horizontal: + self._offset.x = value + else: + self._offset.y = value + + @property + def state(self) -> ScrollState: + return self._state + + def is_touch_valid(self) -> bool: + # MIN_VELOCITY_FOR_CLICKING is checked in auto-scroll state + return bool(self._state != ScrollState.MANUAL_SCROLL) diff --git a/iqpilot/system/ui/lib/setup_ble.py b/iqpilot/system/ui/lib/setup_ble.py new file mode 100644 index 000000000..d49b52675 --- /dev/null +++ b/iqpilot/system/ui/lib/setup_ble.py @@ -0,0 +1,744 @@ +#!/usr/bin/env python3 +""" +Konn3kt BLE Setup transport (Phase A) — runs inside the setup zipapp, before any +IQ.Pilot install. Advertises the device on the setup screen so the konn3kt app +can drive Wi-Fi + install over Bluetooth. Self-contained (the compiled +ble-transportd bundle lives on the wiped /data and is unavailable here); uses the +AGNOS system python's gi/BlueZ D-Bus, mirroring the settings transport's GATT + +fragmentation + auth so the app can share client code. + +See konn3kt_private/docs/konn3kt_ble_setup_protocol.md for the wire contract. +""" +import hashlib +import hmac +import json +import math +import os +import re +import secrets +import struct +import subprocess +import threading +import time +from dataclasses import dataclass, field +from typing import Any, Callable + +def _import_gi(): + # In setup mode /data is wiped, so the installed system's gi symlink + # (/data/openpilot/gi) is gone and the venv has no gi of its own. The real gi + # dist-package + GI typelibs live in the rootfs and survive reset — make them + # importable before falling over. Works unchanged on an installed device too. + import sys + try: + import gi # noqa: F401 + except Exception: + for extra in ("/usr/lib/python3/dist-packages", "/usr/lib/python3.12/dist-packages"): + import os + if os.path.isdir(os.path.join(extra, "gi")) and extra not in sys.path: + sys.path.append(extra) + import gi # noqa: F401 + gi.require_version("Gio", "2.0") + from gi.repository import Gio, GLib + return gi, Gio, GLib + + +try: + gi, Gio, GLib = _import_gi() + _GI_AVAILABLE = True +except Exception: + _GI_AVAILABLE = False + +BLUEZ_SERVICE = "org.bluez" +DBUS_OM_IFACE = "org.freedesktop.DBus.ObjectManager" +DBUS_PROPS_IFACE = "org.freedesktop.DBus.Properties" +GATT_MANAGER_IFACE = "org.bluez.GattManager1" +LE_ADV_MANAGER_IFACE = "org.bluez.LEAdvertisingManager1" +GATT_SERVICE_IFACE = "org.bluez.GattService1" +GATT_CHRC_IFACE = "org.bluez.GattCharacteristic1" +LE_ADV_IFACE = "org.bluez.LEAdvertisement1" +DEVICE_IFACE = "org.bluez.Device1" +ADAPTER_IFACE = "org.bluez.Adapter1" + +SETUP_SERVICE_UUID = "73f2c700-5e40-4d0d-8b7f-fde61f729100" +SETUP_CONTROL_CHAR_UUID = "73f2c701-5e40-4d0d-8b7f-fde61f729100" +SETUP_REQUEST_CHAR_UUID = "73f2c702-5e40-4d0d-8b7f-fde61f729100" +SETUP_RESPONSE_CHAR_UUID = "73f2c703-5e40-4d0d-8b7f-fde61f729100" +# 16-bit ServiceData UUID for the advertisement — a 128-bit service UUID PLUS +# 128-bit service data overflows the 31-byte legacy adv budget, so the setupId +# rides in a compact 16-bit ServiceData AD instead (the full 128-bit service is +# still the GATT service, discovered after connect). BlueZ expands "fe01" to the +# Bluetooth base UUID; the app reads it as 0000fe01-0000-1000-8000-00805f9b34fb. +SETUP_SERVICE_DATA_UUID = "0000fe01-0000-1000-8000-00805f9b34fb" + +PROTOCOL_VERSION = 1 +FRAME_HEADER = struct.Struct(">IHH") +MAX_FRAGMENT_PAYLOAD = 180 +ADAPTER_WAIT_TIMEOUT_S = 8.0 +BLUEZ_REGISTER_TIMEOUT_MS = 15000 +SESSION_IDLE_TIMEOUT_S = 120 +SEQ_REPLAY_WINDOW = 128 +HELLO_MAX_SKEW_MS = 300_000 +MAX_AUTH_FAILURES = 5 +AUTH_LOCKOUT_S = 30.0 + + +def setup_id_for_serial(serial: str) -> str: + return hashlib.sha256(f"k3setup:{serial}".encode("utf-8")).hexdigest()[:16] + + +def _derive_setup_bdaddr(serial: str) -> str: + raw = bytearray(hashlib.sha256(f"konn3kt-bdaddr:{serial}".encode("utf-8")).digest()[:6]) + raw[0] = (raw[0] | 0x02) & 0xFE + return ":".join(f"{x:02X}" for x in raw) + + +def _json_safe(value: Any) -> Any: + if isinstance(value, float): + return value if math.isfinite(value) else None + if isinstance(value, dict): + return {str(k): _json_safe(v) for k, v in value.items()} + if isinstance(value, (list, tuple)): + return [_json_safe(v) for v in value] + return value + + +def _canonical(value: Any) -> bytes: + return json.dumps(_json_safe(value), ensure_ascii=True, sort_keys=True, separators=(",", ":"), allow_nan=False).encode("utf-8") + + +def _safe_json(data: dict[str, Any]) -> bytes: + return _canonical(data) + + +def _hmac_hex(key: bytes, payload: bytes) -> str: + return hmac.new(key, payload, hashlib.sha256).hexdigest() + + +class SetupAuthError(Exception): + pass + + +# --------------------------------------------------------------------------- +# Session / auth (6-digit code, mirrors settings-transport HKDF + replay window) +# --------------------------------------------------------------------------- +@dataclass +class SetupSession: + client_id: str + setup_id: str + client_nonce: str + device_nonce: str + session_id: str + authenticated: bool = False + session_key: bytes = b"" + last_seen: float = 0.0 + highest_seq: int = 0 + seen_seq_mask: int = 0 + + +class SetupSessionManager: + def __init__(self, setup_id: str, code_getter: Callable[[], str]): + self._setup_id = setup_id + self._code_getter = code_getter + self._sessions: dict[str, SetupSession] = {} + self._auth_failures = 0 + self._lockout_until = 0.0 + self._lock = threading.Lock() + + def prune(self) -> None: + now = time.monotonic() + with self._lock: + for cid in [c for c, s in self._sessions.items() if (now - s.last_seen) > SESSION_IDLE_TIMEOUT_S]: + self._sessions.pop(cid, None) + + def begin_hello(self, client_id: str, setup_id: str, client_nonce: str, timestamp_ms: int) -> dict[str, Any]: + if setup_id != self._setup_id: + raise SetupAuthError("setup_id_mismatch") + now_ms = int(time.time() * 1000) + # NOTE: deliberately NO timestamp-skew check here. A freshly-reset device has + # no network, so its clock is arbitrarily wrong (often weeks off) — a skew + # check would reject every real setup. The 6-digit on-screen code is the + # actual authorization and the per-session nonce prevents replay, so the + # timestamp is informational only. + session = SetupSession( + client_id=client_id, + setup_id=self._setup_id, + client_nonce=str(client_nonce), + device_nonce=secrets.token_hex(8), + session_id=secrets.token_hex(8), + last_seen=time.monotonic(), + ) + with self._lock: + self._sessions[client_id] = session + return { + "type": "helloAck", + "protocolVersion": PROTOCOL_VERSION, + "setupId": self._setup_id, + "deviceNonce": session.device_nonce, + "sessionId": session.session_id, + "codeRequired": True, + "timestampMs": now_ms, + } + + def _session_key(self, session: SetupSession, code: str) -> bytes: + salt = f"{session.client_nonce}:{session.device_nonce}:{session.session_id}:{self._setup_id}".encode("utf-8") + prk = hmac.new(salt, f"k3setup:{code}".encode("utf-8"), hashlib.sha256).digest() + return hmac.new(prk, b"konn3kt-ble-setup-v1\x01", hashlib.sha256).digest() + + def authenticate(self, client_id: str, session_id: str, timestamp_ms: int, proof_hex: str) -> dict[str, Any]: + if time.monotonic() < self._lockout_until: + raise SetupAuthError("auth_locked_out") + session = self._sessions.get(client_id) + if session is None or session.session_id != session_id: + raise SetupAuthError("unknown_session") + code = str(self._code_getter() or "") + key = self._session_key(session, code) + expected = _hmac_hex(key, _canonical({"role": "client-auth", "sessionId": session_id, "timestampMs": int(timestamp_ms)})) + if not hmac.compare_digest(expected, str(proof_hex or "").strip().lower()): + self._auth_failures += 1 + if self._auth_failures >= MAX_AUTH_FAILURES: + self._lockout_until = time.monotonic() + AUTH_LOCKOUT_S + self._auth_failures = 0 + raise SetupAuthError("auth_failed") + self._auth_failures = 0 + session.authenticated = True + session.session_key = key + session.highest_seq = 0 + session.seen_seq_mask = 0 + session.last_seen = time.monotonic() + return { + "type": "authOk", + "sessionId": session_id, + "setupId": self._setup_id, + "timestampMs": int(time.time() * 1000), + "proof": _hmac_hex(key, _canonical({"role": "device-auth", "sessionId": session_id, "timestampMs": int(timestamp_ms)})), + } + + def validate_request(self, client_id: str, session_id: str) -> SetupSession: + session = self._sessions.get(client_id) + if session is None or not session.authenticated: + raise SetupAuthError("session_not_authenticated") + if session.session_id != session_id: + raise SetupAuthError("session_id_mismatch") + session.last_seen = time.monotonic() + return session + + def _check_seq(self, session: SetupSession, seq: int) -> None: + seq = int(seq) + if seq <= 0: + raise SetupAuthError("seq_invalid") + if seq > session.highest_seq: + return + offset = session.highest_seq - seq + if offset >= SEQ_REPLAY_WINDOW or (session.seen_seq_mask >> offset) & 1: + raise SetupAuthError("seq_replayed") + + def _consume_seq(self, session: SetupSession, seq: int) -> None: + seq = int(seq) + if seq > session.highest_seq: + shift = seq - session.highest_seq + session.seen_seq_mask = ((session.seen_seq_mask << shift) | 1) & ((1 << SEQ_REPLAY_WINDOW) - 1) + session.highest_seq = seq + else: + session.seen_seq_mask |= 1 << (session.highest_seq - seq) + + def validate_signed_request(self, client_id: str, session_id: str, request_id: Any, seq: int, method: str, params: Any, mac_hex: str) -> SetupSession: + session = self.validate_request(client_id, session_id) + if not session.session_key: + raise SetupAuthError("missing_session_key") + self._check_seq(session, seq) + payload = _canonical({"id": request_id, "method": method, "params": params, "seq": int(seq), "sessionId": session_id, "type": "request"}) + if not hmac.compare_digest(_hmac_hex(session.session_key, payload), str(mac_hex or "").strip().lower()): + raise SetupAuthError("request_mac_invalid") + self._consume_seq(session, seq) + return session + + def build_response(self, session: SetupSession | None, request_id: Any, seq: int | None, *, result: Any = None, error: str | None = None) -> dict[str, Any]: + rtype = "error" if error is not None else "response" + env: dict[str, Any] = {"type": rtype, "id": request_id} + if error is not None: + env["error"] = error + else: + env["result"] = result + if session is not None and session.session_key and seq is not None: + payload = error if error is not None else result + env["seq"] = int(seq) + env["mac"] = _hmac_hex(session.session_key, _canonical({"id": request_id, "payload": payload, "seq": int(seq), "sessionId": session.session_id, "type": rtype})) + return env + + +# --------------------------------------------------------------------------- +# GATT plumbing (adapted from the proven settings transport, + ServiceData adv) +# --------------------------------------------------------------------------- +def _variant(sig: str, val: Any): + return GLib.Variant(sig, val) + + +def frame_payload(payload: bytes) -> list[bytes]: + if not payload: + payload = b"{}" + chunk = max(1, MAX_FRAGMENT_PAYLOAD - FRAME_HEADER.size) + chunks = [payload[i:i + chunk] for i in range(0, len(payload), chunk)] or [b""] + total, count = len(payload), len(chunks) + return [FRAME_HEADER.pack(total, idx, count) + c for idx, c in enumerate(chunks)] + + +@dataclass +class _Reassembly: + total_length: int + fragment_count: int + chunks: dict[int, bytes] = field(default_factory=dict) + + def add(self, idx: int, payload: bytes) -> bytes | None: + self.chunks[idx] = payload + if len(self.chunks) != self.fragment_count: + return None + return b"".join(self.chunks[i] for i in range(self.fragment_count))[:self.total_length] + + +OM_XML = '' +PROPS_XML = '' +SERVICE_XML = '' +CHAR_XML = '' +ADV_XML = '' + + +class _Exported: + def __init__(self, path, xml, methods=None, properties=None): + self.path = path + self.node = Gio.DBusNodeInfo.new_for_xml(xml) + self.methods = methods or {} + self.properties = properties or {} + self.ids: list[int] = [] + + def register(self, bus): + for iface in self.node.interfaces: + self.ids.append(bus.register_object(self.path, iface, self._call, self._get, None)) + + def unregister(self, bus): + for i in self.ids: + try: + bus.unregister_object(i) + except Exception: + pass + self.ids.clear() + + def _call(self, conn, sender, path, iface, method, params, invocation): + handler = self.methods.get((iface, method)) + if handler is None: + invocation.return_dbus_error("org.konn3kt.Error", f"unsupported:{iface}.{method}") + return + try: + result = handler(params) + invocation.return_value(result) + except Exception as e: + invocation.return_dbus_error("org.konn3kt.Error", str(e)) + + def _get(self, conn, sender, path, iface, name): + props = self.properties.get(iface, {}) + return props[name]() if name in props else None + + +class SetupBleServer: + """Advertise + serve the setup GATT service. Single central (1:1 setup).""" + + def __init__(self, *, serial: str, on_control: Callable[[bytes], bytes | None], on_request: Callable[[bytes], bytes | None]): + self.serial = serial + self.setup_id = setup_id_for_serial(serial) + self.local_name = f"IQSetup-{serial[-6:]}" + self.on_control = on_control + self.on_request = on_request + self.bus = None + self.adapter_path: str | None = None + self.context = None + self.loop = None + self._thread: threading.Thread | None = None + self._ready = threading.Event() + self._error: Exception | None = None + self.running = False + self._install_in_progress = False + self._root = f"/io/konn3kt/setup/p{os.getpid()}" + self._objects: list[_Exported] = [] + self._notify = {"control": False, "response": False} + self._values = {"control": b"", "request": b"", "response": b""} + self._reassembly: dict[str, _Reassembly] = {} + + # ---- lifecycle ----------------------------------------------------------- + def start(self, timeout_s: float = 30.0) -> None: + if not _GI_AVAILABLE: + raise RuntimeError("gi_unavailable") + if self.running: + return + self._ensure_unique_bdaddr() + self._thread = threading.Thread(target=self._run, name="setup_ble_gatt", daemon=True) + self._thread.start() + if not self._ready.wait(timeout=timeout_s): + raise RuntimeError("setup_ble_start_timeout") + if self._error is not None: + raise self._error + + def stop(self) -> None: + try: + if self.context is not None: + GLib.idle_add(self._stop_on_loop) + if self._thread is not None: + self._thread.join(timeout=3.0) + except Exception: + pass + self.running = False + + def set_install_in_progress(self, active: bool) -> None: + self._install_in_progress = bool(active) + + # ---- BD address ---------------------------------------------------------- + def _run_priv(self, args: list[str], timeout_s: float = 10.0) -> bool: + cmds = ([args] if os.geteuid() == 0 else [["sudo", "-n", *args], args]) + for cmd in cmds: + try: + p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=timeout_s, check=False) + if p.returncode == 0: + return True + except Exception: + continue + return False + + def _read_bdaddr(self) -> str | None: + try: + out = subprocess.run(["hciconfig", "hci0"], stdout=subprocess.PIPE, text=True, timeout=5.0, check=False).stdout + m = re.search(r"BD Address:\s*([0-9A-Fa-f:]{17})", out or "") + return m.group(1).upper() if m else None + except Exception: + return None + + def _ensure_unique_bdaddr(self) -> None: + current = self._read_bdaddr() + if not current or not current.startswith("00:00:00:00"): + return + target = _derive_setup_bdaddr(self.serial) + octets = [f"0x{p}" for p in target.split(":")] + if not self._run_priv(["hcitool", "-i", "hci0", "cmd", "0x3f", "0x0014", *octets]): + return + time.sleep(0.5) + self._run_priv(["hciconfig", "hci0", "reset"]) + time.sleep(1.5) + self._run_priv(["systemctl", "restart", "bluetooth.service"], timeout_s=20.0) + time.sleep(2.0) + + # ---- main loop ----------------------------------------------------------- + def _run(self): + self.context = GLib.MainContext() + self.loop = GLib.MainLoop.new(self.context, False) + self.context.push_thread_default() + try: + src = GLib.idle_source_new() + src.set_callback(self._startup) + src.attach(self.context) + self.loop.run() + except Exception as e: + self._error = e + self._ready.set() + finally: + try: + self.context.pop_thread_default() + except Exception: + pass + + def _find_adapter(self) -> str | None: + objs = self._managed_objects() + for path, ifaces in objs.items(): + if GATT_MANAGER_IFACE in ifaces and LE_ADV_MANAGER_IFACE in ifaces and ADAPTER_IFACE in ifaces: + return path + return None + + def _managed_objects(self) -> dict: + reply = self.bus.call_sync(BLUEZ_SERVICE, "/", DBUS_OM_IFACE, "GetManagedObjects", None, + GLib.VariantType.new("(a{oa{sa{sv}}})"), Gio.DBusCallFlags.NONE, 5000, None) + u = reply.unpack() + return u[0] if isinstance(u, tuple) else u + + def _startup(self, *_): + try: + self._dbg("startup begin") + self.bus = Gio.bus_get_sync(Gio.BusType.SYSTEM, None) + # ensure powered + try: + self.adapter_path = None + start = time.monotonic() + while time.monotonic() - start < ADAPTER_WAIT_TIMEOUT_S: + self.adapter_path = self._find_adapter() + if self.adapter_path: + break + time.sleep(0.5) + if not self.adapter_path: + raise RuntimeError("bluetooth_adapter_not_found") + self._set_powered() + except Exception: + raise + self._dbg("adapter=%s, registering objects" % self.adapter_path) + self._register_objects() + self._dbg("objects registered, calling RegisterApplication") + self._register_with_bluez() + self._dbg("RegisterApplication call issued") + except Exception as e: + import traceback as _tb + self._dbg("startup EXC: %r\n%s" % (e, _tb.format_exc())) + self._error = e + self._stop_on_loop() + if self.loop: + self.loop.quit() + self._ready.set() + return False + + def _set_powered(self): + try: + self.bus.call_sync(BLUEZ_SERVICE, self.adapter_path, DBUS_PROPS_IFACE, "Set", + GLib.Variant("(ssv)", (ADAPTER_IFACE, "Powered", GLib.Variant("b", True))), + None, Gio.DBusCallFlags.NONE, 5000, None) + except Exception: + pass + + # paths + @property + def _app_path(self): return self._root + @property + def _service_path(self): return self._root + "/service0" + @property + def _control_path(self): return self._service_path + "/char0" + @property + def _request_path(self): return self._service_path + "/char1" + @property + def _response_path(self): return self._service_path + "/char2" + @property + def _adv_path(self): return self._root + "/advertisement0" + + def _char_props(self, uuid, flags, kind): + return {GATT_CHRC_IFACE: { + "UUID": lambda: _variant("s", uuid), + "Service": lambda: _variant("o", self._service_path), + "Flags": lambda: _variant("as", flags), + "Value": lambda: _variant("ay", list(self._values[kind])), + "Notifying": lambda: _variant("b", self._notify.get(kind, False)), + }} + + def _service_data_variant(self): + flags = 0x01 | (0x02 if self._install_in_progress else 0x00) + data = bytes([PROTOCOL_VERSION, flags]) + bytes.fromhex(self.setup_id) + return _variant("a{sv}", {SETUP_SERVICE_DATA_UUID: GLib.Variant("ay", list(data))}) + + def _register_objects(self): + chars = [self._control_path, self._request_path, self._response_path] + service_props = {GATT_SERVICE_IFACE: { + "UUID": lambda: _variant("s", SETUP_SERVICE_UUID), + "Primary": lambda: _variant("b", True), + "Characteristics": lambda: _variant("ao", chars), + }} + # Keep the adv within the 31-byte legacy budget: 16-bit ServiceData (setupId) + # + a short LocalName, no 128-bit ServiceUUID, no tx-power. The app scans by + # the ServiceData UUID and matches setupId locally against its known serials. + adv_props = {LE_ADV_IFACE: { + "Type": lambda: _variant("s", "peripheral"), + "LocalName": lambda: _variant("s", "IQSetup"), + "ServiceData": self._service_data_variant, + }} + + def mk_props(path, pmap): + def get_prop(params): + iface, name = params.unpack() + getter = pmap.get(iface, {}).get(name) + if getter is None: + raise RuntimeError(f"unknown_property:{iface}.{name}") + return GLib.Variant("(v)", (getter(),)) + def get_all(params): + (iface,) = params.unpack() + pm = pmap.get(iface) + if pm is None: + raise RuntimeError(f"unknown_interface:{iface}") + return GLib.Variant("(a{sv})", ({k: g() for k, g in pm.items()},)) + return _Exported(path, PROPS_XML, methods={(DBUS_PROPS_IFACE, "Get"): get_prop, (DBUS_PROPS_IFACE, "GetAll"): get_all}) + + app = _Exported(self._app_path, OM_XML, methods={(DBUS_OM_IFACE, "GetManagedObjects"): self._get_managed}) + service = _Exported(self._service_path, SERVICE_XML, properties=service_props) + control = self._mk_char("control", self._control_path, SETUP_CONTROL_CHAR_UUID, ["write", "notify"]) + request = self._mk_char("request", self._request_path, SETUP_REQUEST_CHAR_UUID, ["write", "write-without-response"]) + response = self._mk_char("response", self._response_path, SETUP_RESPONSE_CHAR_UUID, ["notify"]) + adv = _Exported(self._adv_path, ADV_XML, methods={(LE_ADV_IFACE, "Release"): lambda _: None}, properties=adv_props) + + self._objects = [ + app, mk_props(self._app_path, {}), + service, mk_props(self._service_path, service_props), + control, mk_props(self._control_path, self._char_props(SETUP_CONTROL_CHAR_UUID, ["write", "notify"], "control")), + request, mk_props(self._request_path, self._char_props(SETUP_REQUEST_CHAR_UUID, ["write", "write-without-response"], "request")), + response, mk_props(self._response_path, self._char_props(SETUP_RESPONSE_CHAR_UUID, ["notify"], "response")), + adv, mk_props(self._adv_path, adv_props), + ] + for o in self._objects: + o.register(self.bus) + + def _mk_char(self, kind, path, uuid, flags): + def read_value(_params): + return GLib.Variant("(ay)", (list(self._values[kind]),)) + + def write_value(params): + value, options = params.unpack() + payload = bytes(int(x) & 0xFF for x in value) if isinstance(value, (list, tuple)) else bytes(value or b"") + full = self._consume_fragment(kind, payload) + if full is None: + return None + self._values[kind] = full + if kind == "control": + resp = self.on_control(full) + if resp: + self.notify("control", resp) + elif kind == "request": + # Handle on a worker so a slow op (wifi scan, connect) never stalls BLE. + threading.Thread(target=self._handle_request_worker, args=(full,), daemon=True).start() + return None + + def start_notify(_params): + self._notify[kind] = True + return None + + def stop_notify(_params): + self._notify[kind] = False + return None + + return _Exported(path, CHAR_XML, methods={ + (GATT_CHRC_IFACE, "ReadValue"): read_value, + (GATT_CHRC_IFACE, "WriteValue"): write_value, + (GATT_CHRC_IFACE, "StartNotify"): start_notify, + (GATT_CHRC_IFACE, "StopNotify"): stop_notify, + }, properties=self._char_props(uuid, flags, kind)) + + def _handle_request_worker(self, full: bytes): + try: + resp = self.on_request(full) + if resp: + self.notify("response", resp) + except Exception: + pass + + def _get_managed(self, _params): + managed = { + self._service_path: {GATT_SERVICE_IFACE: { + "UUID": _variant("s", SETUP_SERVICE_UUID), "Primary": _variant("b", True), + "Characteristics": _variant("ao", [self._control_path, self._request_path, self._response_path])}}, + self._control_path: {GATT_CHRC_IFACE: {"UUID": _variant("s", SETUP_CONTROL_CHAR_UUID), "Service": _variant("o", self._service_path), "Flags": _variant("as", ["write", "notify"])}}, + self._request_path: {GATT_CHRC_IFACE: {"UUID": _variant("s", SETUP_REQUEST_CHAR_UUID), "Service": _variant("o", self._service_path), "Flags": _variant("as", ["write", "write-without-response"])}}, + self._response_path: {GATT_CHRC_IFACE: {"UUID": _variant("s", SETUP_RESPONSE_CHAR_UUID), "Service": _variant("o", self._service_path), "Flags": _variant("as", ["notify"])}}, + } + return GLib.Variant("(a{oa{sa{sv}}})", (managed,)) + + def _consume_fragment(self, kind, fragment): + if len(fragment) < FRAME_HEADER.size: + raise RuntimeError("fragment_too_small") + total, idx, count = FRAME_HEADER.unpack(fragment[:FRAME_HEADER.size]) + if count <= 0 or idx >= count: + raise RuntimeError("invalid_fragment_header") + st = self._reassembly.get(kind) + if st is None or st.total_length != total or st.fragment_count != count: + st = _Reassembly(total_length=total, fragment_count=count) + self._reassembly[kind] = st + payload = st.add(idx, fragment[FRAME_HEADER.size:]) + if payload is not None: + self._reassembly.pop(kind, None) + return payload + + def notify(self, kind: str, payload: bytes): + path = {"control": self._control_path, "response": self._response_path}.get(kind) + if not self.running or self.bus is None or not self._notify.get(kind) or path is None: + return + for fragment in frame_payload(payload): + self._values[kind] = fragment + try: + self.bus.emit_signal(None, path, DBUS_PROPS_IFACE, "PropertiesChanged", + GLib.Variant("(sa{sv}as)", (GATT_CHRC_IFACE, {"Value": _variant("ay", list(fragment))}, []))) + except Exception: + pass + + def refresh_advertisement(self): + """Re-emit ServiceData (e.g. install-in-progress flag flipped).""" + if not self.running or self.bus is None: + return + try: + self.bus.emit_signal(None, self._adv_path, DBUS_PROPS_IFACE, "PropertiesChanged", + GLib.Variant("(sa{sv}as)", (LE_ADV_IFACE, {"ServiceData": self._service_data_variant()}, []))) + except Exception: + pass + + # ---- bluez registration -------------------------------------------------- + def _register_with_bluez(self): + self.bus.call(BLUEZ_SERVICE, self.adapter_path, GATT_MANAGER_IFACE, "RegisterApplication", + GLib.Variant("(oa{sv})", (self._app_path, {})), None, Gio.DBusCallFlags.NONE, + BLUEZ_REGISTER_TIMEOUT_MS, None, self._on_app_registered, None) + + def _on_app_registered(self, conn, result, _ud): + try: + (conn or self.bus).call_finish(result) + self._dbg("app_registered OK adv_path=%s" % self._adv_path) + except GLib.GError as e: + self._dbg("app_registered GError: %s" % e) + if "AlreadyExists" not in str(e): + self._error = e + self._stop_on_loop() + if self.loop: + self.loop.quit() + self._ready.set() + return + self.bus.call(BLUEZ_SERVICE, self.adapter_path, LE_ADV_MANAGER_IFACE, "RegisterAdvertisement", + GLib.Variant("(oa{sv})", (self._adv_path, {})), None, Gio.DBusCallFlags.NONE, + BLUEZ_REGISTER_TIMEOUT_MS, None, self._on_adv_registered, None) + + def _dbg(self, msg): + try: + import os as _os + fd = _os.open("/data/setup_test/setup_ble_dbg.log", _os.O_WRONLY | _os.O_CREAT | _os.O_APPEND, 0o644) + _os.write(fd, (msg + "\n").encode()) + _os.close(fd) + except Exception: + pass + + def _on_adv_registered(self, conn, result, _ud): + try: + (conn or self.bus).call_finish(result) + self._dbg("adv_registered OK") + except GLib.GError as e: + self._dbg("adv_registered GError: %s" % e) + if "AlreadyExists" not in str(e): + self._error = e + self._stop_on_loop() + if self.loop: + self.loop.quit() + self._ready.set() + return + self.running = True + self._error = None + self._ready.set() + + def _clear_registrations(self): + if self.bus is None or self.adapter_path is None: + return + for iface, method, arg in ( + (LE_ADV_MANAGER_IFACE, "UnregisterAdvertisement", self._adv_path), + (GATT_MANAGER_IFACE, "UnregisterApplication", self._app_path), + ): + try: + self.bus.call_sync(BLUEZ_SERVICE, self.adapter_path, iface, method, GLib.Variant("(o)", (arg,)), + None, Gio.DBusCallFlags.NONE, 3000, None) + except Exception: + pass + + def _stop_on_loop(self): + if self.bus is not None and self.adapter_path is not None: + self._clear_registrations() + if self.bus is not None: + for o in reversed(self._objects): + try: + o.unregister(self.bus) + except Exception: + pass + self._objects.clear() + self.running = False + if self.loop: + try: + self.loop.quit() + except Exception: + pass diff --git a/iqpilot/system/ui/lib/setup_controller.py b/iqpilot/system/ui/lib/setup_controller.py new file mode 100644 index 000000000..4f0c4d6a3 --- /dev/null +++ b/iqpilot/system/ui/lib/setup_controller.py @@ -0,0 +1,372 @@ +#!/usr/bin/env python3 +""" +Konn3kt setup BLE controller — owns the setup session, dispatches the setup +operations against the real device (Wi-Fi via WifiManager, hardware/cellular via +HARDWARE, install via an injected trigger), and exposes the 6-digit code + a +small observable status the setup UI renders. + +Runs inside the setup zipapp. See konn3kt_ble_setup_protocol.md. +""" +import json +import secrets +import threading +import time +import urllib.request +from typing import Any, Callable + +from iqpilot.system.ui.lib.setup_ble import ( + SetupBleServer, + SetupSessionManager, + SetupAuthError, + PROTOCOL_VERSION, +) +from iqpilot.system.ui.lib.os_update import OsUpdateCoordinator + +NETWORK_CHECK_URL = "https://openpilot.comma.ai" +IQPILOT_CHANNELS = {"release": "IQLvbs/release", "beta": "IQLvbs/beta"} + +# Setup ops served over BLE (Phase A only — deliberately tiny, no shell/params). +SETUP_METHODS = { + "getSetupInfo", + "scanWifi", + "connectWifi", + "forgetWifi", + "getNetworkStatus", + "startInstall", + "getInstallProgress", + "confirmOsUpdate", + "ping", +} + + +def _new_code() -> str: + return f"{secrets.randbelow(1_000_000):06d}" + + +class SetupController: + def __init__(self, *, serial: str, hardware: Any, wifi_manager: Any, + on_start_install: Callable[[str], None], version: str = ""): + self.serial = serial + self.hardware = hardware + self.wifi = wifi_manager + self.on_start_install = on_start_install + self.version = version + + self._code = _new_code() + self._code_lock = threading.Lock() + self.session_manager: SetupSessionManager | None = None + self.server: SetupBleServer | None = None + + # Observable UI state + self._lock = threading.Lock() + self.phone_active = False # a phone has authenticated + self.install_state = "idle" # idle|downloading|os_update_required|os_updating|installing|failed|rebooting + self.install_percent = 0 + self.install_error = "" + self.os_from = "" # current IQ.OS version when an OS update is needed + self.os_to = "" # target IQ.OS version + self.os_update = OsUpdateCoordinator() # bridges install thread <-> phone confirm + self._enabled = False + + # ---- code ---------------------------------------------------------------- + @property + def code(self) -> str: + with self._code_lock: + return self._code + + def _rotate_code(self) -> None: + with self._code_lock: + self._code = _new_code() + + # ---- lifecycle ----------------------------------------------------------- + def start(self) -> bool: + if self._enabled: + return True + self._enabled = True + threading.Thread(target=self._start_blocking, name="setup_ble_start", daemon=True).start() + return True + + def _start_blocking(self) -> None: + self.session_manager = SetupSessionManager(self._setup_id(), lambda: self.code) + server = SetupBleServer( + serial=self.serial, + on_control=self._on_control, + on_request=self._on_request, + ) + try: + server.start() + except Exception as e: + print(f"[setup_ble] start failed: {e}") + return + self.server = server + if self.wifi is not None: + try: + self.wifi.set_active(True) + except Exception: + pass + print(f"[setup_ble] advertising setupId={self._setup_id()} name=IQSetup-{self.serial[-6:]}") + + def stop(self) -> None: + self._enabled = False + if self.server is not None: + try: + self.server.stop() + except Exception: + pass + self.server = None + + def _setup_id(self) -> str: + from iqpilot.system.ui.lib.setup_ble import setup_id_for_serial + return setup_id_for_serial(self.serial) + + # ---- observable state ---------------------------------------------------- + def snapshot(self) -> dict[str, Any]: + with self._lock: + return { + "phone_active": self.phone_active, + "install_state": self.install_state, + "install_percent": self.install_percent, + "install_error": self.install_error, + "osFrom": self.os_from, + "osTo": self.os_to, + } + + def set_install_progress(self, state: str, percent: int = 0, error: str = "", + os_from: str | None = None, os_to: str | None = None) -> None: + with self._lock: + self.install_state = state + self.install_percent = int(percent) + self.install_error = error + if os_from is not None: + self.os_from = os_from + if os_to is not None: + self.os_to = os_to + cur_from, cur_to = self.os_from, self.os_to + if self.server is not None: + self.server.set_install_in_progress(state in ("downloading", "os_updating", "installing", "rebooting")) + self.server.refresh_advertisement() + # push unsolicited progress event to a connected phone + self.server.notify("response", json.dumps({ + "type": "event", "event": "installProgress", + "state": state, "percent": int(percent), "error": error, + "osFrom": cur_from, "osTo": cur_to, + }, separators=(",", ":")).encode("utf-8")) + + # ---- control (hello/auth/ping) ------------------------------------------- + def _on_control(self, payload: bytes) -> bytes | None: + try: + msg = json.loads(payload.decode("utf-8")) + mtype = str(msg.get("type") or "") + client_id = "central" # single central for setup + self.session_manager.prune() + if mtype == "hello": + resp = self.session_manager.begin_hello( + client_id=client_id, + setup_id=str(msg.get("setupId") or ""), + client_nonce=str(msg.get("clientNonce") or ""), + timestamp_ms=int(msg.get("timestampMs") or 0), + ) + # The code is generated once at setup start and shown persistently on the + # device screen (Chromecast-style) — it must NOT change mid-pairing, or + # the code the user is reading becomes stale the instant they connect. + return json.dumps(resp, separators=(",", ":")).encode("utf-8") + if mtype == "auth": + resp = self.session_manager.authenticate( + client_id=client_id, + session_id=str(msg.get("sessionId") or ""), + timestamp_ms=int(msg.get("timestampMs") or 0), + proof_hex=str(msg.get("proof") or ""), + ) + with self._lock: + self.phone_active = True + return json.dumps(resp, separators=(",", ":")).encode("utf-8") + if mtype == "ping": + sid = str(msg.get("sessionId") or "") + self.session_manager.validate_request(client_id, sid) + return json.dumps({"type": "pong", "sessionId": sid, "timestampMs": int(time.time() * 1000)}, separators=(",", ":")).encode("utf-8") + raise SetupAuthError("unsupported_control_message") + except SetupAuthError as e: + return json.dumps({"type": "error", "error": str(e)}, separators=(",", ":")).encode("utf-8") + except Exception as e: + return json.dumps({"type": "error", "error": str(e)}, separators=(",", ":")).encode("utf-8") + + # ---- request (authenticated ops) ----------------------------------------- + def _on_request(self, payload: bytes) -> bytes | None: + request_id = None + session = None + seq = None + try: + msg = json.loads(payload.decode("utf-8")) + request_id = msg.get("id") + method = str(msg.get("method") or "") + # MAC must be verified over params EXACTLY as sent (None when omitted) — + # coercing to {} here would diverge from the client's canonical JSON. + params = msg.get("params") + seq = int(msg.get("seq") or 0) + session = self.session_manager.validate_signed_request( + "central", str(msg.get("sessionId") or ""), request_id, seq, method, params, str(msg.get("mac") or ""), + ) + if method not in SETUP_METHODS: + raise SetupAuthError(f"method_not_allowed:{method}") + result = self._dispatch(method, params or {}) + return json.dumps(self.session_manager.build_response(session, request_id, seq, result=result), separators=(",", ":")).encode("utf-8") + except SetupAuthError as e: + env = self.session_manager.build_response(session, request_id, seq, error=str(e)) if session else {"type": "error", "id": request_id, "error": str(e)} + return json.dumps(env, separators=(",", ":")).encode("utf-8") + except Exception as e: + env = self.session_manager.build_response(session, request_id, seq, error=str(e)) if session else {"type": "error", "id": request_id, "error": str(e)} + return json.dumps(env, separators=(",", ":")).encode("utf-8") + + def _dispatch(self, method: str, params: dict) -> Any: + if method == "ping": + return {"ok": True} + if method == "getSetupInfo": + return self._setup_info() + if method == "scanWifi": + return {"networks": self._scan_wifi()} + if method == "connectWifi": + return self._connect_wifi(str(params.get("ssid") or ""), str(params.get("password") or "")) + if method == "forgetWifi": + return self._forget_wifi(str(params.get("ssid") or "")) + if method == "getNetworkStatus": + return self._network_status() + if method == "startInstall": + return self._start_install(str(params.get("channel") or "release")) + if method == "getInstallProgress": + s = self.snapshot() + return {"state": s["install_state"], "percent": s["install_percent"], "error": s["install_error"], + "osFrom": s["osFrom"], "osTo": s["osTo"]} + if method == "confirmOsUpdate": + # Phone approved flashing the newer IQ.OS — unblock the install thread. + self.os_update.confirm() + return {"confirmed": True} + raise SetupAuthError(f"method_not_allowed:{method}") + + # ---- op implementations -------------------------------------------------- + def _setup_info(self) -> dict[str, Any]: + cellular = self._cellular_status() + net = self._network_status() + voltage_ok = True + try: + v = self.hardware.get_voltage() if self.hardware else None + if v is not None: + voltage_ok = v > 8_000 # mV; matches setup low-voltage threshold spirit + except Exception: + pass + hw = "mici" if self._is_mici() else "tici" + return { + "serial": self.serial, + "setupId": self._setup_id(), + "hardware": hw, + "version": self.version, + "voltageOk": voltage_ok, + "cellular": cellular, + "wifiConnected": net["wifiConnected"], + "internetReachable": net["internetReachable"], + } + + def _is_mici(self) -> bool: + try: + return getattr(self.hardware, "__class__", type("x", (), {})).__name__.lower().startswith("mici") or \ + bool(getattr(self.hardware, "is_mici", lambda: False)()) + except Exception: + return False + + def _scan_wifi(self) -> list[dict[str, Any]]: + if self.wifi is None: + return [] + try: + self.wifi.set_active(True) + except Exception: + pass + nets = [] + try: + for n in self.wifi.get_networks(): + nets.append({ + "ssid": n.ssid, + "strength": int(n.strength), + "security": int(n.security_type), + "connected": bool(n.is_connected), + "saved": bool(n.is_saved), + }) + except Exception: + pass + return nets + + def _connect_wifi(self, ssid: str, password: str) -> dict[str, Any]: + if not ssid: + return {"success": False, "error": "missing_ssid"} + if self.wifi is None: + return {"success": False, "error": "wifi_unavailable"} + try: + self.wifi.connect_to_network(ssid, password) + return {"success": True} + except Exception as e: + return {"success": False, "error": str(e)} + + def _forget_wifi(self, ssid: str) -> dict[str, Any]: + if self.wifi is None: + return {"success": False, "error": "wifi_unavailable"} + try: + self.wifi.forget_connection(ssid) + return {"success": True} + except Exception as e: + return {"success": False, "error": str(e)} + + def _cellular_status(self) -> dict[str, Any]: + present = False + active = False + operator = None + try: + if self.hardware is not None and hasattr(self.hardware, "get_network_type"): + from iqpilot.system.hardware.tici.hardware import NetworkType + nt = self.hardware.get_network_type() + active = nt in (NetworkType.cell2G, NetworkType.cell3G, NetworkType.cell4G, NetworkType.cell5G) + present = active + if self.hardware is not None and hasattr(self.hardware, "get_sim_info"): + sim = self.hardware.get_sim_info() + present = present or bool(sim and sim.get("sim_id")) + operator = (sim or {}).get("network_type") + except Exception: + pass + return {"present": present, "active": active, "operator": operator} + + def _network_status(self) -> dict[str, Any]: + wifi_connected = False + ssid = None + try: + if self.wifi is not None: + for n in self.wifi.get_networks(): + if n.is_connected: + wifi_connected = True + ssid = n.ssid + break + except Exception: + pass + cellular = self._cellular_status() + internet = False + try: + urllib.request.urlopen(NETWORK_CHECK_URL, timeout=3) + internet = True + except Exception: + internet = False + return { + "wifiConnected": wifi_connected, + "ssid": ssid, + "cellularActive": cellular["active"], + "internetReachable": internet, + } + + def _start_install(self, channel: str) -> dict[str, Any]: + if channel not in IQPILOT_CHANNELS: + return {"started": False, "error": "invalid_channel"} + net = self._network_status() + if not net["internetReachable"]: + return {"started": False, "error": "no_internet"} + try: + self.set_install_progress("downloading", 0) + self.on_start_install(IQPILOT_CHANNELS[channel]) + return {"started": True, "channel": channel} + except Exception as e: + self.set_install_progress("failed", 0, str(e)) + return {"started": False, "error": str(e)} diff --git a/iqpilot/system/ui/lib/shader_polygon.py b/iqpilot/system/ui/lib/shader_polygon.py new file mode 100644 index 000000000..400223b42 --- /dev/null +++ b/iqpilot/system/ui/lib/shader_polygon.py @@ -0,0 +1,238 @@ +import pyray as rl +import numpy as np +from dataclasses import dataclass +from typing import Any, Optional, cast +from iqpilot.system.ui.lib.application import gui_app, GL_VERSION + +MAX_GRADIENT_COLORS = 20 # includes stops as well + + +@dataclass +class Gradient: + start: tuple[float, float] + end: tuple[float, float] + colors: list[rl.Color] + stops: list[float] + + def __post_init__(self): + if len(self.colors) > MAX_GRADIENT_COLORS: + self.colors = self.colors[:MAX_GRADIENT_COLORS] + print(f"Warning: Gradient colors truncated to {MAX_GRADIENT_COLORS} entries") + + if len(self.stops) > MAX_GRADIENT_COLORS: + self.stops = self.stops[:MAX_GRADIENT_COLORS] + print(f"Warning: Gradient stops truncated to {MAX_GRADIENT_COLORS} entries") + + if not len(self.stops): + color_count = min(len(self.colors), MAX_GRADIENT_COLORS) + self.stops = [i / max(1, color_count - 1) for i in range(color_count)] + + +FRAGMENT_SHADER = GL_VERSION + """ +in vec2 fragTexCoord; +out vec4 finalColor; + +uniform vec4 fillColor; + +// Gradient line defined in *screen pixels* +uniform int useGradient; +uniform vec2 gradientStart; // e.g. vec2(0, 0) +uniform vec2 gradientEnd; // e.g. vec2(0, screenHeight) +uniform vec4 gradientColors[20]; +uniform float gradientStops[20]; +uniform int gradientColorCount; + +vec4 getGradientColor(vec2 p) { + // Compute t from screen-space position + vec2 d = gradientStart - gradientEnd; + float len2 = max(dot(d, d), 1e-6); + float t = clamp(dot(p - gradientEnd, d) / len2, 0.0, 1.0); + + // Clamp to range + float t0 = gradientStops[0]; + float tn = gradientStops[gradientColorCount-1]; + if (t <= t0) return gradientColors[0]; + if (t >= tn) return gradientColors[gradientColorCount-1]; + + for (int i = 0; i < gradientColorCount - 1; i++) { + float a = gradientStops[i]; + float b = gradientStops[i+1]; + if (t >= a && t <= b) { + float k = (t - a) / max(b - a, 1e-6); + return mix(gradientColors[i], gradientColors[i+1], k); + } + } + + return gradientColors[gradientColorCount-1]; +} + +void main() { + // TODO: do proper antialiasing + finalColor = useGradient == 1 ? getGradientColor(gl_FragCoord.xy) : fillColor; +} +""" + +# Default vertex shader +VERTEX_SHADER = GL_VERSION + """ +in vec3 vertexPosition; +in vec2 vertexTexCoord; +out vec2 fragTexCoord; +uniform mat4 mvp; + +void main() { + fragTexCoord = vertexTexCoord; + gl_Position = mvp * vec4(vertexPosition, 1.0); +} +""" + +UNIFORM_INT = rl.ShaderUniformDataType.SHADER_UNIFORM_INT +UNIFORM_FLOAT = rl.ShaderUniformDataType.SHADER_UNIFORM_FLOAT +UNIFORM_VEC2 = rl.ShaderUniformDataType.SHADER_UNIFORM_VEC2 +UNIFORM_VEC4 = rl.ShaderUniformDataType.SHADER_UNIFORM_VEC4 + + +class ShaderState: + _instance: Any = None + + @classmethod + def get_instance(cls): + if cls._instance is None: + cls._instance = cls() + return cls._instance + + def __init__(self): + if ShaderState._instance is not None: + raise Exception("This class is a singleton. Use get_instance() instead.") + + self.initialized = False + self.shader = None + + # Shader uniform locations + self.locations = { + 'fillColor': None, + 'useGradient': None, + 'gradientStart': None, + 'gradientEnd': None, + 'gradientColors': None, + 'gradientStops': None, + 'gradientColorCount': None, + 'mvp': None, + } + + # Pre-allocated FFI objects + self.fill_color_ptr = rl.ffi.new("float[]", [0.0, 0.0, 0.0, 0.0]) + self.use_gradient_ptr = rl.ffi.new("int[]", [0]) + self.color_count_ptr = rl.ffi.new("int[]", [0]) + self.gradient_colors_ptr = rl.ffi.new("float[]", MAX_GRADIENT_COLORS * 4) + self.gradient_stops_ptr = rl.ffi.new("float[]", MAX_GRADIENT_COLORS) + + def initialize(self): + if self.initialized: + return + + self.shader = rl.load_shader_from_memory(VERTEX_SHADER, FRAGMENT_SHADER) + + # Cache all uniform locations + for uniform in self.locations.keys(): + self.locations[uniform] = rl.get_shader_location(self.shader, uniform) + + # Orthographic MVP (origin top-left) + proj = rl.matrix_ortho(0, gui_app.width, gui_app.height, 0, -1, 1) + rl.set_shader_value_matrix(self.shader, self.locations['mvp'], proj) + + self.initialized = True + + def cleanup(self): + if not self.initialized: + return + if self.shader: + rl.unload_shader(self.shader) + self.shader = None + + self.initialized = False + + +def _configure_shader_color(state: ShaderState, color: Optional[rl.Color], + gradient: Gradient | None, origin_rect: rl.Rectangle): + assert (color is not None) != (gradient is not None), "Either color or gradient must be provided" + + use_gradient = 1 if (gradient is not None and len(gradient.colors) >= 1) else 0 + state.use_gradient_ptr[0] = use_gradient + rl.set_shader_value(state.shader, state.locations['useGradient'], state.use_gradient_ptr, UNIFORM_INT) + + if use_gradient: + gradient = cast(Gradient, gradient) + state.color_count_ptr[0] = len(gradient.colors) + for i in range(len(gradient.colors)): + c = gradient.colors[i] + base = i * 4 + state.gradient_colors_ptr[base:base + 4] = [c.r / 255.0, c.g / 255.0, c.b / 255.0, c.a / 255.0] + rl.set_shader_value_v(state.shader, state.locations['gradientColors'], state.gradient_colors_ptr, UNIFORM_VEC4, len(gradient.colors)) + + for i in range(len(gradient.stops)): + s = float(gradient.stops[i]) + state.gradient_stops_ptr[i] = 0.0 if s < 0.0 else 1.0 if s > 1.0 else s + rl.set_shader_value_v(state.shader, state.locations['gradientStops'], state.gradient_stops_ptr, UNIFORM_FLOAT, len(gradient.stops)) + rl.set_shader_value(state.shader, state.locations['gradientColorCount'], state.color_count_ptr, UNIFORM_INT) + + # Map normalized start/end to screen pixels + start_vec = rl.Vector2(origin_rect.x + gradient.start[0] * origin_rect.width, origin_rect.y + gradient.start[1] * origin_rect.height) + end_vec = rl.Vector2(origin_rect.x + gradient.end[0] * origin_rect.width, origin_rect.y + gradient.end[1] * origin_rect.height) + rl.set_shader_value(state.shader, state.locations['gradientStart'], start_vec, UNIFORM_VEC2) + rl.set_shader_value(state.shader, state.locations['gradientEnd'], end_vec, UNIFORM_VEC2) + else: + color = color or rl.WHITE + state.fill_color_ptr[0:4] = [color.r / 255.0, color.g / 255.0, color.b / 255.0, color.a / 255.0] + rl.set_shader_value(state.shader, state.locations['fillColor'], state.fill_color_ptr, UNIFORM_VEC4) + + +def triangulate(pts: np.ndarray) -> list[tuple[float, float]]: + """Only supports simple polygons with two chains (ribbon).""" + + # TODO: consider deduping close screenspace points + # interleave points to produce a triangle strip + # assert len(pts) % 2 == 0, "Interleaving expects even number of points" + if len(pts) % 2 != 0: + pts = pts[:-1] + + tri_strip = [] + for i in range(len(pts) // 2): + tri_strip.append(pts[i]) + tri_strip.append(pts[-i - 1]) + + return cast(list, np.array(tri_strip).tolist()) + + +def draw_polygon(origin_rect: rl.Rectangle, points: np.ndarray, + color: Optional[rl.Color] = None, gradient: Gradient | None = None): + + """ + Draw a ribbon polygon (two chains) with a triangle strip and gradient. + - Input must be [L0..Lk-1, Rk-1..R0], even count, no crossings/holes. + """ + if len(points) < 3: + return + + # Initialize shader on-demand + state = ShaderState.get_instance() + state.initialize() + + # Ensure (N,2) float32 contiguous array + pts = np.ascontiguousarray(points, dtype=np.float32) + assert pts.ndim == 2 and pts.shape[1] == 2, "points must be (N,2)" + + # Configure gradient shader + _configure_shader_color(state, color, gradient, origin_rect) + + # Triangulate via interleaving + tri_strip = triangulate(pts) + + # Draw strip, color here doesn't matter + rl.begin_shader_mode(state.shader) + rl.draw_triangle_strip(tri_strip, len(tri_strip), rl.WHITE) + rl.end_shader_mode() + + +def cleanup_shader_resources(): + state = ShaderState.get_instance() + state.cleanup() diff --git a/iqpilot/system/ui/lib/text_measure.py b/iqpilot/system/ui/lib/text_measure.py new file mode 100644 index 000000000..8bfe49fd4 --- /dev/null +++ b/iqpilot/system/ui/lib/text_measure.py @@ -0,0 +1,36 @@ +import pyray as rl +from iqpilot.system.ui.lib.application import FONT_SCALE, font_fallback +from iqpilot.system.ui.lib.emoji import find_emoji + +_cache: dict[int, rl.Vector2] = {} + + +def measure_text_cached(font: rl.Font, text: str, font_size: int, spacing: float = 0) -> rl.Vector2: + """Caches text measurements to avoid redundant calculations.""" + font = font_fallback(font) + spacing = round(spacing, 4) + key = hash((font.texture.id, text, font_size, spacing)) + if key in _cache: + return _cache[key] + + # Measure normal characters without emojis, then add standard width for each found emoji + emoji = find_emoji(text) + if emoji: + non_emoji_text = "" + last_index = 0 + for start, end, _ in emoji: + non_emoji_text += text[last_index:start] + last_index = end + non_emoji_text += text[last_index:] + else: + non_emoji_text = text + + result = rl.measure_text_ex(font, non_emoji_text, font_size * FONT_SCALE, spacing) # noqa: TID251 + if emoji: + result.x += len(emoji) * font_size * FONT_SCALE + # If just emoji assume a single line height + if result.y == 0: + result.y = font_size * FONT_SCALE + + _cache[key] = result + return result diff --git a/iqpilot/system/ui/lib/utils.py b/iqpilot/system/ui/lib/utils.py new file mode 100644 index 000000000..a588cc753 --- /dev/null +++ b/iqpilot/system/ui/lib/utils.py @@ -0,0 +1,23 @@ +import pyray as rl + + +def gui_style_color(color: rl.Color) -> int: + value_type = rl.ffi.typeof(rl.raylib.GuiSetStyle).args[2] + return int(rl.ffi.cast(value_type, rl.color_to_int(color))) + + +class GuiStyleContext: + def __init__(self, styles: list[tuple[int, int, int]]): + """styles is a list of tuples (control, prop, new_value)""" + self.styles = styles + self.prev_styles: list[tuple[int, int, int]] = [] + + def __enter__(self): + for control, prop, new_value in self.styles: + prev_value = rl.gui_get_style(control, prop) + self.prev_styles.append((control, prop, prev_value)) + rl.gui_set_style(control, prop, new_value) + + def __exit__(self, exc_type, exc_value, traceback): + for control, prop, prev_value in self.prev_styles: + rl.gui_set_style(control, prop, prev_value) diff --git a/iqpilot/system/ui/lib/wifi_manager.py b/iqpilot/system/ui/lib/wifi_manager.py new file mode 100644 index 000000000..a52cdab8b --- /dev/null +++ b/iqpilot/system/ui/lib/wifi_manager.py @@ -0,0 +1,1091 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import atexit +import os +import threading +import time +import uuid +import subprocess +from collections.abc import Callable +from dataclasses import dataclass +from enum import IntEnum +from typing import Any + +from jeepney import DBusAddress, new_method_call +from jeepney.bus_messages import MatchRule, message_bus +from jeepney.io.blocking import open_dbus_connection as open_dbus_connection_blocking +from jeepney.io.threading import DBusRouter, open_dbus_connection as open_dbus_connection_threading +from jeepney.low_level import MessageType +from jeepney.wrappers import Properties + +from iqpilot.common.swaglog import cloudlog +from iqpilot.system.hardware import PC +from iqpilot.system.ui.lib.networkmanager import (NM, NM_WIRELESS_IFACE, NM_802_11_AP_SEC_PAIR_WEP40, + NM_802_11_AP_SEC_PAIR_WEP104, NM_802_11_AP_SEC_GROUP_WEP40, + NM_802_11_AP_SEC_GROUP_WEP104, NM_802_11_AP_SEC_KEY_MGMT_PSK, + NM_802_11_AP_SEC_KEY_MGMT_802_1X, NM_802_11_AP_SEC_KEY_MGMT_SAE, + NM_802_11_AP_FLAGS_NONE, + NM_802_11_AP_FLAGS_PRIVACY, NM_802_11_AP_FLAGS_WPS, + NM_PATH, NM_IFACE, NM_ACCESS_POINT_IFACE, NM_SETTINGS_PATH, + NM_SETTINGS_IFACE, NM_CONNECTION_IFACE, NM_DEVICE_IFACE, + NM_DEVICE_TYPE_WIFI, NM_DEVICE_TYPE_MODEM, NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT, + NM_DEVICE_STATE_REASON_NEW_ACTIVATION, NM_ACTIVE_CONNECTION_IFACE, + NM_IP4_CONFIG_IFACE, NMDeviceState) + +try: + from iqpilot.common.params import Params +except Exception: + Params = None + +TETHERING_IP_ADDRESS = "192.168.43.1" +DEFAULT_TETHERING_PASSWORD = "swagswagcomma" +SIGNAL_QUEUE_SIZE = 10 +SCAN_PERIOD_SECONDS = 5 +SYSTEM_DBUS_SOCKET_CANDIDATES = ( + "/run/dbus/system_bus_socket", + "/var/run/dbus/system_bus_socket", +) + + +def normalize_ssid(ssid: str) -> str: + return ssid.replace("’", "'") + + +class SecurityType(IntEnum): + OPEN = 0 + WPA = 1 + WPA2 = 2 + WPA3 = 3 + UNSUPPORTED = 4 + + +class MeteredType(IntEnum): + UNKNOWN = 0 + YES = 1 + NO = 2 + + +_WARNED_UNSUPPORTED_NETWORKS: set[tuple[int, int, int]] = set() + + +def get_security_type(flags: int, wpa_flags: int, rsn_flags: int) -> SecurityType: + wpa_props = wpa_flags | rsn_flags + + # obtained by looking at flags of networks in the office as reported by an Android phone + supports_wpa = (NM_802_11_AP_SEC_PAIR_WEP40 | NM_802_11_AP_SEC_PAIR_WEP104 | NM_802_11_AP_SEC_GROUP_WEP40 | + NM_802_11_AP_SEC_GROUP_WEP104 | NM_802_11_AP_SEC_KEY_MGMT_PSK) + + if (flags == NM_802_11_AP_FLAGS_NONE) or ((flags & NM_802_11_AP_FLAGS_WPS) and not (wpa_props & supports_wpa) and not (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_SAE)): + return SecurityType.OPEN + elif (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_SAE) and not (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_PSK) and not (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_802_1X): + # WPA3-Personal only (SAE without PSK fallback) + return SecurityType.WPA3 + elif (flags & NM_802_11_AP_FLAGS_PRIVACY) and (wpa_props & (supports_wpa | NM_802_11_AP_SEC_KEY_MGMT_SAE)) and not (wpa_props & NM_802_11_AP_SEC_KEY_MGMT_802_1X): + # WPA2, WPA2+WPA3 mixed, or WPA — all handled via WPA key_mgmt (NM negotiates SAE if available) + return SecurityType.WPA2 + else: + _key = (flags, wpa_flags, rsn_flags) + if _key not in _WARNED_UNSUPPORTED_NETWORKS: + _WARNED_UNSUPPORTED_NETWORKS.add(_key) + cloudlog.warning(f"Unsupported network! flags: {flags}, wpa_flags: {wpa_flags}, rsn_flags: {rsn_flags}") + return SecurityType.UNSUPPORTED + + +@dataclass(frozen=True) +class Network: + ssid: str + strength: int + is_connected: bool + security_type: SecurityType + is_saved: bool + ip_address: str = "" # TODO: implement + + @classmethod + def from_dbus(cls, ssid: str, aps: list["AccessPoint"], is_saved: bool) -> "Network": + # we only want to show the strongest AP for each Network/SSID + strongest_ap = max(aps, key=lambda ap: ap.strength) + is_connected = any(ap.is_connected for ap in aps) + security_type = get_security_type(strongest_ap.flags, strongest_ap.wpa_flags, strongest_ap.rsn_flags) + + return cls( + ssid=ssid, + strength=strongest_ap.strength, + is_connected=is_connected and is_saved, + security_type=security_type, + is_saved=is_saved, + ) + + +def wifi_network_sort_key(network: Network, network_missing: bool = False) -> tuple[int, int]: + if network.is_connected: + return (0, 0) + if network_missing or network.strength <= 0: + return (2, 0) + return (1, -network.strength) + + +@dataclass(frozen=True) +class AccessPoint: + ssid: str + bssid: str + strength: int + is_connected: bool + flags: int + wpa_flags: int + rsn_flags: int + ap_path: str + + @classmethod + def from_dbus(cls, ap_props: dict[str, tuple[str, Any]], ap_path: str, active_ap_path: str) -> "AccessPoint": + ssid = bytes(ap_props['Ssid'][1]).decode("utf-8", "replace") + bssid = str(ap_props['HwAddress'][1]) + strength = int(ap_props['Strength'][1]) + flags = int(ap_props['Flags'][1]) + wpa_flags = int(ap_props['WpaFlags'][1]) + rsn_flags = int(ap_props['RsnFlags'][1]) + + return cls( + ssid=ssid, + bssid=bssid, + strength=strength, + is_connected=ap_path == active_ap_path, + flags=flags, + wpa_flags=wpa_flags, + rsn_flags=rsn_flags, + ap_path=ap_path, + ) + + +class WifiManager: + def __init__(self): + self._networks: list[Network] = [] # a network can be comprised of multiple APs + self._active = True # used to not run when not in settings + self._exit = False + + # DBus connections + self._router_main: DBusRouter | None = None # used by scanner / general method calls + self._conn_monitor = None # used by state monitor thread + self._nm: DBusAddress | None = None + self._dbus_connected = False + self._last_dbus_connect_log = 0.0 + + # Store wifi device path + self._wifi_device: str | None = None + + # State + self._connecting_to_ssid: str = "" + self._ipv4_address: str = "" + self._current_network_metered: MeteredType = MeteredType.UNKNOWN + self._tethering_password: str = "" + self._ipv4_forward = False + self._tethering_transition = False + + self._last_network_update: float = 0.0 + self._callback_queue: list[Callable] = [] + self._scanning = False + + self._tethering_ssid = "weedle" + if Params is not None: + dongle_id = Params().get("DongleId") + if dongle_id: + self._tethering_ssid += "-" + dongle_id[:4] + + # Callbacks + self._need_auth: list[Callable[[str], None]] = [] + self._activated: list[Callable[[], None]] = [] + self._forgotten: list[Callable[[], None]] = [] + self._networks_updated: list[Callable[[list[Network]], None]] = [] + self._disconnected: list[Callable[[], None]] = [] + + self._lock = threading.Lock() + self._dbus_lock = threading.Lock() + self._bootstrap_thread = threading.Thread(target=self._bootstrap_loop, daemon=True) + self._scan_thread = threading.Thread(target=self._network_scanner, daemon=True) + self._state_thread = threading.Thread(target=self._monitor_state, daemon=True) + self._initialize() + atexit.register(self.stop) + + def _initialize(self): + self._bootstrap_thread.start() + self._scan_thread.start() + self._state_thread.start() + + def _bootstrap_loop(self): + while not self._exit: + if not self._ensure_wifi_ready(): + time.sleep(1) + continue + + if self._dbus_connected: + time.sleep(1) + continue + + try: + if Params is not None and self._tethering_ssid not in self._get_connections(): + self._add_tethering_connection() + self._tethering_password = self._get_tethering_password() + self._dbus_connected = True + cloudlog.debug("WifiManager initialized") + except Exception: + cloudlog.exception("WifiManager initialization failed") + self._reset_dbus() + time.sleep(1) + + def _connect_dbus(self) -> bool: + with self._dbus_lock: + if self._router_main is not None and self._conn_monitor is not None and self._nm is not None: + return True + + dbus_socket = next((path for path in SYSTEM_DBUS_SOCKET_CANDIDATES if os.path.exists(path)), None) + if dbus_socket is not None: + os.environ["DBUS_SYSTEM_BUS_ADDRESS"] = f"unix:path={dbus_socket}" + + try: + router_main = DBusRouter(open_dbus_connection_threading(bus="SYSTEM")) + conn_monitor = open_dbus_connection_blocking(bus="SYSTEM") + except FileNotFoundError: + now = time.monotonic() + if now - self._last_dbus_connect_log > 10: + cloudlog.warning(f"WifiManager waiting for system D-Bus socket={dbus_socket}") + self._last_dbus_connect_log = now + return False + except Exception: + cloudlog.exception("WifiManager failed to connect to system D-Bus") + return False + + self._router_main = router_main + self._conn_monitor = conn_monitor + self._nm = DBusAddress(NM_PATH, bus_name=NM, interface=NM_IFACE) + self._last_dbus_connect_log = 0.0 + return True + + def _reset_dbus(self): + with self._dbus_lock: + router_main = self._router_main + conn_monitor = self._conn_monitor + self._router_main = None + self._conn_monitor = None + self._nm = None + self._wifi_device = None + self._dbus_connected = False + + if router_main is not None: + try: + router_main.close() + except Exception: + pass + try: + router_main.conn.close() + except Exception: + pass + + if conn_monitor is not None: + try: + conn_monitor.close() + except Exception: + pass + + def _ensure_wifi_ready(self) -> bool: + if not self._connect_dbus(): + return False + + if self._wifi_device is not None: + return True + + self._wait_for_wifi_device() + return self._wifi_device is not None + + def add_callbacks(self, need_auth: Callable[[str], None] | None = None, + activated: Callable[[], None] | None = None, + forgotten: Callable[[], None] | None = None, + networks_updated: Callable[[list[Network]], None] | None = None, + disconnected: Callable[[], None] | None = None): + if need_auth is not None: + self._need_auth.append(need_auth) + if activated is not None: + self._activated.append(activated) + if forgotten is not None: + self._forgotten.append(forgotten) + if networks_updated is not None: + self._networks_updated.append(networks_updated) + if disconnected is not None: + self._disconnected.append(disconnected) + + def get_networks(self) -> list[Network]: + # Snapshot of the current scan results — used by non-UI consumers + # (e.g. the BLE setup transport) that can't drive process_callbacks(). + with self._lock: + return list(self._networks) + + @property + def ipv4_address(self) -> str: + return self._ipv4_address + + @property + def current_network_metered(self) -> MeteredType: + return self._current_network_metered + + @property + def tethering_password(self) -> str: + return self._tethering_password + + @property + def is_scanning(self) -> bool: + return self._scanning + + def _enqueue_callbacks(self, cbs: list[Callable], *args): + for cb in cbs: + self._callback_queue.append(lambda _cb=cb: _cb(*args)) + + def process_callbacks(self): + # Call from UI thread to run any pending callbacks + to_run, self._callback_queue = self._callback_queue, [] + for cb in to_run: + cb() + + def set_active(self, active: bool): + self._active = active + + # Scan immediately if we haven't scanned in a while + if active and time.monotonic() - self._last_network_update > SCAN_PERIOD_SECONDS / 2: + self._last_network_update = 0.0 + + def _monitor_state(self): + while not self._exit: + if not self._active: + time.sleep(1) + continue + + if not self._ensure_wifi_ready(): + time.sleep(1) + continue + + conn_monitor = self._conn_monitor + wifi_device = self._wifi_device + if conn_monitor is None or wifi_device is None: + time.sleep(1) + continue + + rule = MatchRule( + type="signal", + interface=NM_DEVICE_IFACE, + member="StateChanged", + path=wifi_device, + ) + + try: + conn_monitor.send_and_get_reply(message_bus.AddMatch(rule)) + with conn_monitor.filter(rule, bufsize=SIGNAL_QUEUE_SIZE) as q: + while not self._exit and self._conn_monitor is conn_monitor and self._wifi_device == wifi_device: + if not self._active: + time.sleep(1) + continue + + try: + msg = conn_monitor.recv_until_filtered(q, timeout=1) + except TimeoutError: + continue + + new_state, previous_state, change_reason = msg.body + + if self._tethering_transition: + continue + + if new_state == NMDeviceState.NEED_AUTH and change_reason == NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT and len(self._connecting_to_ssid): + self.forget_connection(self._connecting_to_ssid, block=True) + self._enqueue_callbacks(self._need_auth, self._connecting_to_ssid) + self._connecting_to_ssid = "" + + elif new_state == NMDeviceState.ACTIVATED: + if len(self._activated): + self._update_networks() + self._enqueue_callbacks(self._activated) + self._connecting_to_ssid = "" + + elif new_state == NMDeviceState.DISCONNECTED and change_reason != NM_DEVICE_STATE_REASON_NEW_ACTIVATION: + self._connecting_to_ssid = "" + self._enqueue_callbacks(self._forgotten) + except Exception: + if not self._exit: + cloudlog.exception("WifiManager state monitor lost D-Bus connection") + self._reset_dbus() + time.sleep(1) + + def _network_scanner(self): + while not self._exit: + if self._active: + if time.monotonic() - self._last_network_update > SCAN_PERIOD_SECONDS: + self._scanning = True + try: + if self._ensure_wifi_ready(): + self._update_networks() + self._request_scan() + self._last_network_update = time.monotonic() + except Exception: + if not self._exit: + cloudlog.exception("WifiManager scanner lost D-Bus connection") + self._reset_dbus() + finally: + self._scanning = False + time.sleep(1 / 2.) + + def _wait_for_wifi_device(self): + while not self._exit: + device_path = self._get_adapter(NM_DEVICE_TYPE_WIFI) + if device_path is not None: + self._wifi_device = device_path + break + time.sleep(1) + + def _get_adapter(self, adapter_type: int) -> str | None: + # Return the first NetworkManager device path matching adapter_type + if self._router_main is None or self._nm is None: + return None + + try: + reply = self._router_main.send_and_get_reply(new_method_call(self._nm, 'GetDevices')) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f"NetworkManager GetDevices failed: {reply.body!r}") + return None + + if len(reply.body) != 1 or not isinstance(reply.body[0], (list, tuple)): + cloudlog.warning(f"Unexpected NetworkManager GetDevices reply: {reply.body!r}") + return None + + device_paths = reply.body[0] + for device_path in device_paths: + if not isinstance(device_path, str) or not device_path.startswith("/"): + cloudlog.warning(f"Skipping malformed NetworkManager device path: {device_path!r}") + continue + dev_addr = DBusAddress(device_path, bus_name=NM, interface=NM_DEVICE_IFACE) + dev_type = self._router_main.send_and_get_reply(Properties(dev_addr).get('DeviceType')).body[0][1] + if dev_type == adapter_type: + return str(device_path) + except Exception as e: + cloudlog.exception(f"Error getting adapter type {adapter_type}: {e}") + return None + + def _get_connections(self) -> dict[str, str]: + if self._router_main is None: + return {} + + settings_addr = DBusAddress(NM_SETTINGS_PATH, bus_name=NM, interface=NM_SETTINGS_IFACE) + known_connections = self._router_main.send_and_get_reply(new_method_call(settings_addr, 'ListConnections')).body[0] + + conns: dict[str, str] = {} + for conn_path in known_connections: + settings = self._get_connection_settings(conn_path) + + if len(settings) == 0: + cloudlog.warning(f'Failed to get connection settings for {conn_path}') + continue + + if "802-11-wireless" in settings: + ssid = settings['802-11-wireless']['ssid'][1].decode("utf-8", "replace") + if ssid != "": + conns[ssid] = conn_path + return conns + + def _get_active_connections(self): + if self._router_main is None or self._nm is None: + return [] + + return self._router_main.send_and_get_reply(Properties(self._nm).get('ActiveConnections')).body[0][1] + + def _get_connection_settings(self, conn_path: str) -> dict: + if self._router_main is None: + return {} + + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(conn_addr, 'GetSettings')) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to get connection settings: {reply}') + return {} + return dict(reply.body[0]) + + def _add_tethering_connection(self): + if self._router_main is None: + return + + connection = { + 'connection': { + 'type': ('s', '802-11-wireless'), + 'uuid': ('s', str(uuid.uuid4())), + 'id': ('s', 'Hotspot'), + 'autoconnect-retries': ('i', 0), + 'interface-name': ('s', 'wlan0'), + 'autoconnect': ('b', False), + }, + '802-11-wireless': { + 'band': ('s', 'bg'), + 'mode': ('s', 'ap'), + 'ssid': ('ay', self._tethering_ssid.encode("utf-8")), + }, + '802-11-wireless-security': { + 'group': ('as', ['ccmp']), + 'key-mgmt': ('s', 'wpa-psk'), + 'pairwise': ('as', ['ccmp']), + 'proto': ('as', ['rsn']), + 'psk': ('s', DEFAULT_TETHERING_PASSWORD), + }, + 'ipv4': { + 'method': ('s', 'shared'), + 'address-data': ('aa{sv}', [[ + ('address', ('s', TETHERING_IP_ADDRESS)), + ('prefix', ('u', 24)), + ]]), + 'gateway': ('s', TETHERING_IP_ADDRESS), + 'never-default': ('b', True), + }, + 'ipv6': {'method': ('s', 'ignore')}, + } + + settings_addr = DBusAddress(NM_SETTINGS_PATH, bus_name=NM, interface=NM_SETTINGS_IFACE) + self._router_main.send_and_get_reply(new_method_call(settings_addr, 'AddConnection', 'a{sa{sv}}', (connection,))) + + def connect_to_network(self, ssid: str, password: str, hidden: bool = False, security_type: "SecurityType | None" = None): + def worker(): + if not self._ensure_wifi_ready() or self._router_main is None: + cloudlog.warning(f"WiFi not ready while connecting to {ssid}") + return + + # Resolve security type from current scan if not explicitly provided + resolved_security = security_type + if resolved_security is None: + for net in self._networks: + if net.ssid == ssid: + resolved_security = net.security_type + break + + # Clear all connections that may already exist to the network we are connecting to + self._connecting_to_ssid = ssid + self.forget_connection(ssid, block=True) + + connection = { + 'connection': { + 'type': ('s', '802-11-wireless'), + 'uuid': ('s', str(uuid.uuid4())), + 'id': ('s', f'iqpilot connection {ssid}'), + 'autoconnect-retries': ('i', 0), + }, + '802-11-wireless': { + 'ssid': ('ay', ssid.encode("utf-8")), + 'hidden': ('b', hidden), + 'mode': ('s', 'infrastructure'), + }, + 'ipv4': { + 'method': ('s', 'auto'), + 'dns-priority': ('i', 600), + }, + 'ipv6': {'method': ('s', 'ignore')}, + } + + if password: + if resolved_security == SecurityType.WPA3: + # WPA3-Personal (SAE) — PMF is mandatory for WPA3 + connection['802-11-wireless-security'] = { + 'key-mgmt': ('s', 'sae'), + 'psk': ('s', password), + 'pmf': ('i', 2), + } + else: + # WPA/WPA2/mixed — NM negotiates SAE automatically in transition mode + connection['802-11-wireless-security'] = { + 'key-mgmt': ('s', 'wpa-psk'), + 'auth-alg': ('s', 'open'), + 'psk': ('s', password), + } + + settings_addr = DBusAddress(NM_SETTINGS_PATH, bus_name=NM, interface=NM_SETTINGS_IFACE) + self._router_main.send_and_get_reply(new_method_call(settings_addr, 'AddConnection', 'a{sa{sv}}', (connection,))) + self.activate_connection(ssid, block=True) + + threading.Thread(target=worker, daemon=True).start() + + def forget_connection(self, ssid: str, block: bool = False): + def worker(): + if self._router_main is None: + cloudlog.warning(f"WiFi not ready while forgetting {ssid}") + return + + conn_path = self._get_connections().get(ssid, None) + if conn_path is not None: + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + self._router_main.send_and_get_reply(new_method_call(conn_addr, 'Delete')) + + if len(self._forgotten): + self._update_networks() + self._enqueue_callbacks(self._forgotten) + + if block: + worker() + else: + threading.Thread(target=worker, daemon=True).start() + + def activate_connection(self, ssid: str, block: bool = False): + def worker(): + if not self._ensure_wifi_ready() or self._router_main is None: + cloudlog.warning(f"WiFi not ready while activating {ssid}") + return + + conn_path = self._get_connections().get(ssid, None) + if conn_path is not None: + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + self._set_device_autoconnect(True) + self._connecting_to_ssid = ssid + self._router_main.send(new_method_call(self._nm, 'ActivateConnection', 'ooo', + (conn_path, self._wifi_device, "/"))) + + if block: + worker() + else: + threading.Thread(target=worker, daemon=True).start() + + def disconnect_connection(self, ssid: str, block: bool = False): + def worker(): + if self._router_main is None: + cloudlog.warning(f"WiFi not ready while disconnecting {ssid}") + return + + if ssid not in self._get_connections(): + return + + # the profile stays saved and untouched; without clearing autoconnect on the device + # NetworkManager re-associates within seconds + self._set_device_autoconnect(False) + self._connecting_to_ssid = "" + self._deactivate_connection(ssid) + self._update_networks() + self._enqueue_callbacks(self._disconnected) + + if block: + worker() + else: + threading.Thread(target=worker, daemon=True).start() + + def _set_device_autoconnect(self, enabled: bool) -> None: + if self._router_main is None or self._wifi_device is None: + return + + dev_addr = DBusAddress(self._wifi_device, bus_name=NM, interface=NM_DEVICE_IFACE) + reply = self._router_main.send_and_get_reply(Properties(dev_addr).set('Autoconnect', 'b', enabled)) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to set device autoconnect={enabled}: {reply}') + + def _deactivate_connection(self, ssid: str): + target_conn_path = self._get_connections().get(ssid, None) + if target_conn_path is None: + return + + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if active_conn_path == target_conn_path: + self._router_main.send_and_get_reply(new_method_call(self._nm, 'DeactivateConnection', 'o', (active_conn,))) + return + + def _deactivate_active_wifi_client(self): + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + conn_type = self._router_main.send_and_get_reply(Properties(conn_addr).get('Type')).body[0][1] + if conn_type != '802-11-wireless': + continue + + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + tether_conn_path = self._get_connections().get(self._tethering_ssid, None) + if active_conn_path == tether_conn_path: + continue + + self._router_main.send_and_get_reply(new_method_call(self._nm, 'DeactivateConnection', 'o', (active_conn,))) + return + + def is_tethering_active(self) -> bool: + tether_conn_path = self._get_connections().get(self._tethering_ssid, None) + if tether_conn_path is None: + return False + + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if active_conn_path == tether_conn_path: + return True + + return False + + def set_tethering_password(self, password: str): + def worker(): + if not self._ensure_wifi_ready() or self._router_main is None: + cloudlog.warning("WiFi not ready while updating tethering password") + return + + conn_path = self._get_connections().get(self._tethering_ssid, None) + if conn_path is None: + cloudlog.warning('No tethering connection found') + return + + settings = self._get_connection_settings(conn_path) + if len(settings) == 0: + cloudlog.warning(f'Failed to get tethering settings for {conn_path}') + return + + settings['802-11-wireless-security']['psk'] = ('s', password) + + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(conn_addr, 'Update', 'a{sa{sv}}', (settings,))) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to update tethering settings: {reply}') + return + + self._tethering_password = password + if self.is_tethering_active(): + self.activate_connection(self._tethering_ssid, block=True) + + threading.Thread(target=worker, daemon=True).start() + + def _get_tethering_password(self) -> str: + if self._router_main is None: + return '' + + conn_path = self._get_connections().get(self._tethering_ssid, None) + if conn_path is None: + cloudlog.warning('No tethering connection found') + return '' + + reply = self._router_main.send_and_get_reply(new_method_call( + DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE), + 'GetSecrets', 's', ('802-11-wireless-security',) + )) + + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to get tethering password: {reply}') + return '' + + secrets = reply.body[0] + if '802-11-wireless-security' not in secrets: + return '' + + return str(secrets['802-11-wireless-security'].get('psk', ('s', ''))[1]) + + def set_ipv4_forward(self, enabled: bool): + self._ipv4_forward = enabled + + def set_tethering_active(self, active: bool): + def worker(): + if not self._ensure_wifi_ready(): + cloudlog.warning("WiFi not ready while changing tethering state") + return + + if active: + self._tethering_transition = True + self._connecting_to_ssid = "" + self._deactivate_active_wifi_client() + self.activate_connection(self._tethering_ssid, block=True) + time.sleep(5) + subprocess.run(["sudo", "sysctl", "net.ipv4.ip_forward=1"], check=False) + nat_rule = ["POSTROUTING", "-t", "nat", "-s", "192.168.43.0/24", "-o", "wwan0", "-j", "MASQUERADE"] + rule_check = subprocess.run(["sudo", "iptables-legacy", "-C", *nat_rule], check=False) + if rule_check.returncode != 0: + subprocess.run(["sudo", "iptables-legacy", "-A", *nat_rule], check=False) + else: + self._deactivate_connection(self._tethering_ssid) + self._tethering_transition = False + + threading.Thread(target=worker, daemon=True).start() + + def _update_current_network_metered(self) -> None: + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + self._current_network_metered = MeteredType.UNKNOWN + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + conn_type = self._router_main.send_and_get_reply(Properties(conn_addr).get('Type')).body[0][1] + + if conn_type == '802-11-wireless': + conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if conn_path == "/": + continue + + settings = self._get_connection_settings(conn_path) + + if len(settings) == 0: + cloudlog.warning(f'Failed to get connection settings for {conn_path}') + continue + + metered_prop = settings['connection'].get('metered', ('i', 0))[1] + if metered_prop == MeteredType.YES: + self._current_network_metered = MeteredType.YES + elif metered_prop == MeteredType.NO: + self._current_network_metered = MeteredType.NO + return + + def set_current_network_metered(self, metered: MeteredType): + def worker(): + if self._router_main is None: + cloudlog.warning("WiFi not ready while updating metered setting") + return + + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + conn_type = self._router_main.send_and_get_reply(Properties(conn_addr).get('Type')).body[0][1] + + if conn_type == '802-11-wireless' and not self.is_tethering_active(): + conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if conn_path == "/": + continue + + settings = self._get_connection_settings(conn_path) + + if len(settings) == 0: + cloudlog.warning(f'Failed to get connection settings for {conn_path}') + return + + settings['connection']['metered'] = ('i', int(metered)) + + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(conn_addr, 'Update', 'a{sa{sv}}', (settings,))) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to update tethering settings: {reply}') + return + + threading.Thread(target=worker, daemon=True).start() + + def _request_scan(self): + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + wifi_addr = DBusAddress(self._wifi_device, bus_name=NM, interface=NM_WIRELESS_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(wifi_addr, 'RequestScan', 'a{sv}', ({},))) + + if reply.header.message_type == MessageType.error: + cloudlog.warning(f"Failed to request scan: {reply}") + + def _update_networks(self): + with self._lock: + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + # returns '/' if no active AP + wifi_addr = DBusAddress(self._wifi_device, NM, interface=NM_WIRELESS_IFACE) + active_ap_path = self._router_main.send_and_get_reply(Properties(wifi_addr).get('ActiveAccessPoint')).body[0][1] + ap_paths = self._router_main.send_and_get_reply(new_method_call(wifi_addr, 'GetAllAccessPoints')).body[0] + + aps: dict[str, list[AccessPoint]] = {} + + for ap_path in ap_paths: + ap_addr = DBusAddress(ap_path, NM, interface=NM_ACCESS_POINT_IFACE) + ap_props = self._router_main.send_and_get_reply(Properties(ap_addr).get_all()) + + # some APs have been seen dropping off during iteration + if ap_props.header.message_type == MessageType.error: + cloudlog.warning(f"Failed to get AP properties for {ap_path}") + continue + + try: + ap = AccessPoint.from_dbus(ap_props.body[0], ap_path, active_ap_path) + if ap.ssid == "": + continue + + if ap.ssid not in aps: + aps[ap.ssid] = [] + + aps[ap.ssid].append(ap) + except Exception: + # catch all for parsing errors + cloudlog.exception(f"Failed to parse AP properties for {ap_path}") + + known_connections = self._get_connections() + networks = [Network.from_dbus(ssid, ap_list, ssid in known_connections) for ssid, ap_list in aps.items()] + # sort with quantized strength to reduce jumping + networks.sort(key=lambda n: (-n.is_connected, -round(n.strength / 100 * 2), n.ssid.lower())) + self._networks = networks + + self._update_ipv4_address() + self._update_current_network_metered() + + self._enqueue_callbacks(self._networks_updated, self._networks) + + def _update_ipv4_address(self): + if self._wifi_device is None: + cloudlog.warning("No WiFi device found") + return + + self._ipv4_address = "" + + for conn_path in self._get_active_connections(): + conn_addr = DBusAddress(conn_path, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + conn_type = self._router_main.send_and_get_reply(Properties(conn_addr).get('Type')).body[0][1] + if conn_type == '802-11-wireless': + ip4config_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Ip4Config')).body[0][1] + + if ip4config_path != "/": + ip4config_addr = DBusAddress(ip4config_path, bus_name=NM, interface=NM_IP4_CONFIG_IFACE) + address_data = self._router_main.send_and_get_reply(Properties(ip4config_addr).get('AddressData')).body[0][1] + + for entry in address_data: + if 'address' in entry: + self._ipv4_address = entry['address'][1] + return + + def __del__(self): + self.stop() + + def update_gsm_settings(self, roaming: bool, apn: str, metered: bool): + """Update GSM settings for cellular connection""" + + def worker(): + try: + lte_connection_path = self._get_lte_connection_path() + if not lte_connection_path: + cloudlog.warning("No LTE connection found") + return + + settings = self._get_connection_settings(lte_connection_path) + + if len(settings) == 0: + cloudlog.warning(f"Failed to get connection settings for {lte_connection_path}") + return + + # Ensure dicts exist + if 'gsm' not in settings: + settings['gsm'] = {} + if 'connection' not in settings: + settings['connection'] = {} + + changes = False + # NetworkManager updates an active modem connection in place. Quectel + # modems keep the existing PDP bearer in that case, so an APN change + # does not take effect until LTE is disconnected and reactivated. + apn_settings_changed = False + auto_config = apn == "" + initial_eps_apn = apn if not auto_config else "" + + if settings['gsm'].get('auto-config', ('b', False))[1] != auto_config: + cloudlog.warning(f'Changing gsm.auto-config to {auto_config}') + settings['gsm']['auto-config'] = ('b', auto_config) + changes = True + apn_settings_changed = True + + if settings['gsm'].get('apn', ('s', ''))[1] != apn: + cloudlog.warning(f'Changing gsm.apn to {apn}') + settings['gsm']['apn'] = ('s', apn) + changes = True + apn_settings_changed = True + + if settings['gsm'].get('home-only', ('b', False))[1] == roaming: + cloudlog.warning(f'Changing gsm.home-only to {not roaming}') + settings['gsm']['home-only'] = ('b', not roaming) + changes = True + + if settings['gsm'].get('initial-eps-bearer-configure', ('b', False))[1] != bool(initial_eps_apn): + cloudlog.warning(f'Changing gsm.initial-eps-bearer-configure to {bool(initial_eps_apn)}') + settings['gsm']['initial-eps-bearer-configure'] = ('b', bool(initial_eps_apn)) + changes = True + apn_settings_changed = True + + if settings['gsm'].get('initial-eps-bearer-apn', ('s', ''))[1] != initial_eps_apn: + cloudlog.warning(f'Changing gsm.initial-eps-bearer-apn to {initial_eps_apn}') + settings['gsm']['initial-eps-bearer-apn'] = ('s', initial_eps_apn) + changes = True + apn_settings_changed = True + + # Unknown means NetworkManager decides + metered_int = int(MeteredType.UNKNOWN if metered else MeteredType.NO) + if settings['connection'].get('metered', ('i', 0))[1] != metered_int: + cloudlog.warning(f'Changing connection.metered to {metered_int}') + settings['connection']['metered'] = ('i', metered_int) + changes = True + + if changes: + # Update the connection settings (temporary update) + conn_addr = DBusAddress(lte_connection_path, bus_name=NM, interface=NM_CONNECTION_IFACE) + reply = self._router_main.send_and_get_reply(new_method_call(conn_addr, 'UpdateUnsaved', 'a{sa{sv}}', (settings,))) + + if reply.header.message_type == MessageType.error: + cloudlog.warning(f"Failed to update GSM settings: {reply}") + return + + if apn_settings_changed: + self._restart_modem_connection(lte_connection_path) + else: + self._activate_modem_connection(lte_connection_path) + except Exception as e: + cloudlog.exception(f"Error updating GSM settings: {e}") + + threading.Thread(target=worker, daemon=True).start() + + def _get_lte_connection_path(self) -> str | None: + if PC or self._router_main is None: + return None + try: + settings_addr = DBusAddress(NM_SETTINGS_PATH, bus_name=NM, interface=NM_SETTINGS_IFACE) + known_connections = self._router_main.send_and_get_reply(new_method_call(settings_addr, 'ListConnections')).body[0] + + for conn_path in known_connections: + settings = self._get_connection_settings(conn_path) + if settings and settings.get('connection', {}).get('id', ('s', ''))[1] == 'lte': + return str(conn_path) + except Exception as e: + cloudlog.exception(f"Error finding LTE connection: {e}") + return None + + def _activate_modem_connection(self, connection_path: str): + try: + modem_device = self._get_adapter(NM_DEVICE_TYPE_MODEM) + if modem_device and connection_path: + self._router_main.send_and_get_reply(new_method_call(self._nm, 'ActivateConnection', 'ooo', (connection_path, modem_device, "/"))) + except Exception as e: + cloudlog.exception(f"Error activating modem connection: {e}") + + def _restart_modem_connection(self, connection_path: str): + """Reconnect LTE so a changed APN is used for a new PDP bearer.""" + try: + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if active_conn_path == connection_path: + cloudlog.warning("Restarting LTE connection to apply APN settings") + reply = self._router_main.send_and_get_reply(new_method_call(self._nm, 'DeactivateConnection', 'o', (active_conn,))) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f"Failed to deactivate LTE connection: {reply}") + return + + for _ in range(20): + if not self._is_connection_active(connection_path): + break + time.sleep(0.25) + else: + cloudlog.warning("LTE connection did not deactivate after APN change") + return + break + + self._activate_modem_connection(connection_path) + except Exception as e: + cloudlog.exception(f"Error restarting modem connection: {e}") + + def _is_connection_active(self, connection_path: str) -> bool: + for active_conn in self._get_active_connections(): + conn_addr = DBusAddress(active_conn, bus_name=NM, interface=NM_ACTIVE_CONNECTION_IFACE) + active_conn_path = self._router_main.send_and_get_reply(Properties(conn_addr).get('Connection')).body[0][1] + if active_conn_path == connection_path: + return True + return False + + def stop(self): + if not self._exit: + self._exit = True + if self._bootstrap_thread.is_alive(): + self._bootstrap_thread.join() + if self._scan_thread.is_alive(): + self._scan_thread.join() + if self._state_thread.is_alive(): + self._state_thread.join() + self._reset_dbus() diff --git a/iqpilot/system/ui/lib/wrap_text.py b/iqpilot/system/ui/lib/wrap_text.py new file mode 100644 index 000000000..724329655 --- /dev/null +++ b/iqpilot/system/ui/lib/wrap_text.py @@ -0,0 +1,107 @@ +import pyray as rl +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.application import font_fallback + + +def _break_long_word(font: rl.Font, word: str, font_size: int, max_width: int, spacing: float = 0) -> list[str]: + if not word: + return [] + + parts = [] + remaining = word + + while remaining: + if measure_text_cached(font, remaining, font_size, spacing).x <= max_width: + parts.append(remaining) + break + + # Binary search for the longest substring that fits + left, right = 1, len(remaining) + best_fit = 1 + + while left <= right: + mid = (left + right) // 2 + substring = remaining[:mid] + width = measure_text_cached(font, substring, font_size, spacing).x + + if width <= max_width: + best_fit = mid + left = mid + 1 + else: + right = mid - 1 + + # Add the part that fits + parts.append(remaining[:best_fit]) + remaining = remaining[best_fit:] + + return parts + + +_cache: dict[int, list[str]] = {} + + +def wrap_text(font: rl.Font, text: str, font_size: int, max_width: int, spacing: float = 0) -> list[str]: + font = font_fallback(font) + spacing = round(spacing, 4) + key = hash((font.texture.id, text, font_size, max_width, spacing)) + if key in _cache: + return _cache[key] + + if not text or max_width <= 0: + return [] + + # Split text by newlines first to preserve explicit line breaks + paragraphs = text.split('\n') + all_lines: list[str] = [] + + for paragraph in paragraphs: + # Handle empty paragraphs (preserve empty lines) + if not paragraph.strip(): + all_lines.append("") + continue + + # Process each paragraph separately + words = paragraph.split() + if not words: + all_lines.append("") + continue + + lines: list[str] = [] + current_line: list[str] = [] + + for word in words: + word_width = measure_text_cached(font, word, font_size, spacing).x + + # Check if word alone exceeds max width (need to break the word) + if word_width > max_width: + # Finish current line if it has content + if current_line: + lines.append(" ".join(current_line)) + current_line = [] + + # Break the long word into parts + lines.extend(_break_long_word(font, word, font_size, max_width, spacing)) + continue + + # Measure the actual joined string to get accurate width (accounts for kerning, etc.) + test_line = " ".join(current_line + [word]) if current_line else word + test_width = measure_text_cached(font, test_line, font_size, spacing).x + + # Check if word fits on current line + if test_width <= max_width: + current_line.append(word) + else: + # Start new line with this word + if current_line: + lines.append(" ".join(current_line)) + current_line = [word] + + # Add remaining words + if current_line: + lines.append(" ".join(current_line)) + + # Add all lines from this paragraph + all_lines.extend(lines) + + _cache[key] = all_lines + return all_lines diff --git a/iqpilot/system/ui/mici_reset.py b/iqpilot/system/ui/mici_reset.py new file mode 100755 index 000000000..3b2157d35 --- /dev/null +++ b/iqpilot/system/ui/mici_reset.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 +import os +import sys +import threading +import time +from enum import IntEnum + +import pyray as rl + +from iqpilot.system.hardware import PC +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.slider import SmallSlider +from iqpilot.system.ui.widgets.button import SmallButton, FullRoundedButton +from iqpilot.system.ui.widgets.label import gui_label, gui_text_box + +USERDATA = "/dev/disk/by-partlabel/userdata" +TIMEOUT = 3*60 + +# Guard the confirm against the same tap-burst that triggers tap-to-reset on boot. +# The confirm slider stays disabled until the screen has been quiet (no touches) for +# CONFIRM_GUARD_QUIET seconds, so the triggering taps can't carry through to the wipe. +CONFIRM_GUARD_MIN = 1.0 # minimum seconds the screen must be shown +CONFIRM_GUARD_QUIET = 1.0 # seconds of no touch input before arming confirm + + +class ResetMode(IntEnum): + USER_RESET = 0 # user initiated a factory reset from openpilot + RECOVER = 1 # userdata is corrupt for some reason, give a chance to recover + FORMAT = 2 # finish up a factory reset from a tool that doesn't flash an empty partition to userdata + + +class ResetState(IntEnum): + NONE = 0 + RESETTING = 1 + FAILED = 2 + + +class Reset(Widget): + def __init__(self, mode): + super().__init__() + self._mode = mode + self._previous_reset_state = None + self._reset_state = ResetState.NONE + + self._cancel_button = SmallButton("cancel") + self._cancel_button.set_click_callback(self._cancel_callback) + + self._reboot_button = FullRoundedButton("reboot") + self._reboot_button.set_click_callback(self._do_reboot) + + self._confirm_slider = SmallSlider("reset", self._confirm) + + self._render_status = True + + # tap-burst guard (see CONFIRM_GUARD_* above) + self._start_mono = time.monotonic() + self._last_touch_mono = self._start_mono + self._confirm_armed = False + self._confirm_slider.set_enabled(lambda: self._confirm_armed) + + def _cancel_callback(self): + self._render_status = False + + def _do_reboot(self): + if PC: + return + + os.system("sudo reboot") + + def _do_erase(self): + if PC: + return + + # Removing data and formatting + rm = os.system("sudo rm -rf /data/*") + os.system(f"sudo umount {USERDATA}") + fmt = os.system(f"yes | sudo mkfs.ext4 {USERDATA}") + + if rm == 0 or fmt == 0: + os.system("sudo reboot") + else: + self._reset_state = ResetState.FAILED + + def start_reset(self): + self._reset_state = ResetState.RESETTING + threading.Timer(0.1, self._do_erase).start() + + def _update_state(self): + # arm the confirm slider only after the screen has been touch-quiet for a beat, + # so the taps that triggered the reset don't carry through and confirm it + now = time.monotonic() + if rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT): + self._last_touch_mono = now + if not self._confirm_armed and (now - self._start_mono) > CONFIRM_GUARD_MIN \ + and (now - self._last_touch_mono) > CONFIRM_GUARD_QUIET: + self._confirm_armed = True + + if self._reset_state != self._previous_reset_state: + self._previous_reset_state = self._reset_state + self._timeout_st = time.monotonic() + elif self._reset_state != ResetState.RESETTING and (time.monotonic() - self._timeout_st) > TIMEOUT: + exit(0) + + def _render(self, rect: rl.Rectangle): + label_rect = rl.Rectangle(rect.x + 8, rect.y + 8, rect.width, 50) + gui_label(label_rect, "factory reset", 48, font_weight=FontWeight.BOLD, + color=rl.Color(255, 255, 255, int(255 * 0.9))) + + text_rect = rl.Rectangle(rect.x + 8, rect.y + 56, rect.width - 8 * 2, rect.height - 80) + gui_text_box(text_rect, self._get_body_text(), 36, font_weight=FontWeight.ROMAN, line_scale=0.9) + + if self._reset_state != ResetState.RESETTING: + # fade out cancel button as slider is moved, set visible to prevent pressing invisible cancel + self._cancel_button.set_opacity(1.0 - self._confirm_slider.slider_percentage) + self._cancel_button.set_visible(self._confirm_slider.slider_percentage < 0.8) + + if self._mode == ResetMode.RECOVER: + self._cancel_button.set_text("reboot") + self._cancel_button.render(rl.Rectangle( + rect.x + 8, + rect.y + rect.height - self._cancel_button.rect.height, + self._cancel_button.rect.width, + self._cancel_button.rect.height)) + elif self._mode == ResetMode.USER_RESET and self._reset_state != ResetState.FAILED: + self._cancel_button.render(rl.Rectangle( + rect.x + 8, + rect.y + rect.height - self._cancel_button.rect.height, + self._cancel_button.rect.width, + self._cancel_button.rect.height)) + + if self._reset_state != ResetState.FAILED: + self._confirm_slider.render(rl.Rectangle( + rect.x + rect.width - self._confirm_slider.rect.width, + rect.y + rect.height - self._confirm_slider.rect.height, + self._confirm_slider.rect.width, + self._confirm_slider.rect.height)) + else: + self._reboot_button.render(rl.Rectangle( + rect.x + 8, + rect.y + rect.height - self._reboot_button.rect.height, + self._reboot_button.rect.width, + self._reboot_button.rect.height)) + + return self._render_status + + def _confirm(self): + self.start_reset() + + def _get_body_text(self): + if self._reset_state == ResetState.RESETTING: + return "Resetting device... This may take up to a minute." + if self._reset_state == ResetState.FAILED: + return "Reset failed. Reboot to try again." + if self._mode == ResetMode.RECOVER: + return "Unable to mount data partition. It may be corrupted." + if not self._confirm_armed: + return "Stop touching the screen, then slide to erase all content and settings." + return "All content and settings will be erased." + + +def main(): + mode = ResetMode.USER_RESET + if len(sys.argv) > 1: + if sys.argv[1] == '--recover': + mode = ResetMode.RECOVER + elif sys.argv[1] == "--format": + mode = ResetMode.FORMAT + + # 20 fps to match tici_reset: the reset UI runs at early boot (after uninstall) before the + # panel is ready for 60 fps. _DEFAULT_FPS is 60 on the comma 4 (mici), and the default + # 60 fps here left the comma 4 stuck on the boot logo (no reset prompt). tici/tizi default + # to 20 so they were unaffected. + gui_app.init_window("System Reset", 20) + reset = Reset(mode) + + if mode == ResetMode.FORMAT: + reset.start_reset() + + for should_render in gui_app.render(): + if should_render: + if not reset.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)): + break + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/mici_setup.py b/iqpilot/system/ui/mici_setup.py new file mode 100755 index 000000000..448aa978b --- /dev/null +++ b/iqpilot/system/ui/mici_setup.py @@ -0,0 +1,931 @@ +#!/usr/bin/env python3 +from abc import abstractmethod +import os +import re +import subprocess +import threading +import time +import urllib.request +import urllib.error +from urllib.parse import urlparse +from enum import IntEnum +import shutil +from collections.abc import Callable + +import pyray as rl + +from iqpilot.common.utils import run_cmd +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.wifi_manager import WifiManager +from iqpilot.system.ui.lib.scroll_panel2 import GuiScrollPanel2 +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import (IconButton, SmallButton, WideRoundedButton, SmallerRoundedButton, + SmallCircleIconButton, WidishRoundedButton, SmallRedPillButton, + FullRoundedButton) +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.system.ui.widgets.slider import LargerSlider, SmallSlider +from iqpilot.selfdrive.ui.mici.layouts.settings.network.wifi_ui import WifiUIMici +from iqpilot.selfdrive.ui.mici.widgets.dialog import BigInputDialog + +try: + from iqpilot.cereal import log + NetworkType = log.DeviceState.NetworkType +except ImportError: + NetworkType = None + +NETWORK_CHECK_URL = "https://openpilot.comma.ai" +IQPILOT_INSTALLER_URL = "IQLvbs/release" +USER_AGENT = f"AGNOSSetup-{HARDWARE.get_os_version()}" + +CONTINUE_PATH = "/data/continue.sh" +TMP_CONTINUE_PATH = "/data/continue.sh.new" +INSTALL_PATH = "/data/openpilot" +TMP_INSTALL_PATH = "/data/tmppilot" +VALID_CACHE_PATH = "/data/.openpilot_cache" +INSTALLER_SOURCE_PATH = "/usr/comma/installer" +INSTALLER_DESTINATION_PATH = "/tmp/installer" +INSTALLER_URL_PATH = "/tmp/installer_url" + +# "/" maps to a GitHub fork. IQ.OS uses the DRM "magic" compositor, not Wayland, +# so comma's downloaded installers (installer.comma.ai) crash on launch; clone the fork directly. +GITHUB_FORK_URL = "https://github.com/{user}/openpilot.git" +# IQ.Pilot lives on the IQ Lvbs git server; github.com/IQLvbs is DMCA'd and dead. +GIT_URL_OVERRIDES = {"IQLvbs": "https://git.konn3kt.com/IQ.Lvbs/IQ.Pilot.git"} + +CONTINUE = """#!/usr/bin/env bash + +cd /data/openpilot +exec ./launch_openpilot.sh +""" + + +class NetworkConnectivityMonitor: + def __init__(self, should_check: Callable[[], bool] | None = None, check_interval: float = 1.0): + self.network_connected = threading.Event() + self.wifi_connected = threading.Event() + self._should_check = should_check or (lambda: True) + self._check_interval = check_interval + self._stop_event = threading.Event() + self._thread: threading.Thread | None = None + + def start(self): + self._stop_event.clear() + if self._thread is None or not self._thread.is_alive(): + self._thread = threading.Thread(target=self._run, daemon=True) + self._thread.start() + + def stop(self): + if self._thread is not None: + self._stop_event.set() + self._thread.join() + self._thread = None + + def reset(self): + self.network_connected.clear() + self.wifi_connected.clear() + + def _run(self): + while not self._stop_event.is_set(): + if self._should_check(): + try: + request = urllib.request.Request(NETWORK_CHECK_URL, method="HEAD") + urllib.request.urlopen(request, timeout=1.0) + self.network_connected.set() + if NetworkType is not None and HARDWARE.get_network_type() == NetworkType.wifi: + self.wifi_connected.set() + except Exception: + self.reset() + else: + self.reset() + + if self._stop_event.wait(timeout=self._check_interval): + break + + +class SetupState(IntEnum): + GETTING_STARTED = 0 + NETWORK_SETUP = 1 + NETWORK_SETUP_CUSTOM_SOFTWARE = 8 + SOFTWARE_SELECTION = 2 + DOWNLOADING = 4 + DOWNLOAD_FAILED = 5 + CUSTOM_SOFTWARE_WARNING = 6 + + +IQ_GREEN = rl.Color(16, 185, 129, 255) # konn3kt/IQ accent + + +class SetupBleCodePage(Widget): + """The 6-digit pairing code the konn3kt app asks for when setting up this + device over Bluetooth. Shown on-screen (Chromecast-style) while a phone drives + setup — the code is the setup authorization.""" + def __init__(self, code_getter: Callable[[], str]): + super().__init__() + self._code_getter = code_getter + + self._eyebrow = UnifiedLabel("SET UP FROM YOUR PHONE", 26, + text_color=rl.Color(255, 255, 255, int(255 * 0.55)), + font_weight=FontWeight.BOLD, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, letter_spacing=0.14) + self._code = UnifiedLabel(lambda: self._spaced_code(), 76, + text_color=rl.Color(255, 255, 255, int(255 * 0.95)), + font_weight=FontWeight.DISPLAY, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + letter_spacing=0.08, elide=False, wrap_text=False) + self._hint = UnifiedLabel("Enter this code in the konn3kt app", 27, + text_color=IQ_GREEN, font_weight=FontWeight.MEDIUM, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + + def _spaced_code(self) -> str: + c = (self._code_getter() or "").strip() + return " ".join(c) if c else "¡¡¡¡¡¡" + + def _render(self, rect: rl.Rectangle): + self._eyebrow.render(rl.Rectangle(rect.x, rect.y + 30, rect.width, 34)) + self._code.render(rl.Rectangle(rect.x, rect.y + 84, rect.width, 90)) + self._hint.render(rl.Rectangle(rect.x, rect.y + rect.height - 48, rect.width, 34)) + + +class StartPage(Widget): + def __init__(self): + super().__init__() + + self._title = UnifiedLabel("start", 64, text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + font_weight=FontWeight.DISPLAY, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + + self._start_bg_txt = gui_app.texture("icons_mici/setup/green_button.png", 520, 224) + self._start_bg_pressed_txt = gui_app.texture("icons_mici/setup/green_button_pressed.png", 520, 224) + + def _render(self, rect: rl.Rectangle): + draw_x = rect.x + (rect.width - self._start_bg_txt.width) / 2 + draw_y = rect.y + (rect.height - self._start_bg_txt.height) / 2 + texture = self._start_bg_pressed_txt if self.is_pressed else self._start_bg_txt + rl.draw_texture(texture, int(draw_x), int(draw_y), rl.WHITE) + + self._title.render(rect) + + +class SoftwareSelectionPage(Widget): + def __init__(self, use_openpilot_callback: Callable, + use_custom_software_callback: Callable): + super().__init__() + + self._openpilot_slider = LargerSlider("slide to install\nIQ.Pilot", use_openpilot_callback) + self._openpilot_slider.set_enabled(lambda: self.enabled) # for nav stack + self._custom_software_slider = LargerSlider("slide to use\ncustom software", use_custom_software_callback, green=False) + self._custom_software_slider.set_enabled(lambda: self.enabled) # for nav stack + + def reset(self): + self._openpilot_slider.reset() + self._custom_software_slider.reset() + + def _render(self, rect: rl.Rectangle): + self._openpilot_slider.set_opacity(1.0 - self._custom_software_slider.slider_percentage) + self._custom_software_slider.set_opacity(1.0 - self._openpilot_slider.slider_percentage) + + openpilot_rect = rl.Rectangle( + rect.x + (rect.width - self._openpilot_slider.rect.width) / 2, + rect.y, + self._openpilot_slider.rect.width, + rect.height / 2, + ) + self._openpilot_slider.render(openpilot_rect) + + custom_software_rect = rl.Rectangle( + rect.x + (rect.width - self._custom_software_slider.rect.width) / 2, + rect.y + rect.height / 2, + self._custom_software_slider.rect.width, + rect.height / 2, + ) + self._custom_software_slider.render(custom_software_rect) + + +class TermsHeader(Widget): + def __init__(self, text: str, icon_texture: rl.Texture): + super().__init__() + + self._title = UnifiedLabel(text, 36, text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + font_weight=FontWeight.BOLD, alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + line_height=0.8) + self._icon_texture = icon_texture + + self.set_rect(rl.Rectangle(0, 0, gui_app.width - 16 * 2, self._icon_texture.height)) + + def set_title(self, text: str): + self._title.set_text(text) + + def set_icon(self, icon_texture: rl.Texture): + self._icon_texture = icon_texture + + def _render(self, _): + rl.draw_texture_ex(self._icon_texture, rl.Vector2(self._rect.x, self._rect.y), + 0.0, 1.0, rl.WHITE) + + # May expand outside parent rect + title_content_height = self._title.get_content_height(int(self._rect.width - self._icon_texture.width - 16)) + title_rect = rl.Rectangle( + self._rect.x + self._icon_texture.width + 16, + self._rect.y + (self._rect.height - title_content_height) / 2, + self._rect.width - self._icon_texture.width - 16, + title_content_height, + ) + self._title.render(title_rect) + + +class TermsPage(Widget): + ITEM_SPACING = 20 + + def __init__(self, continue_callback: Callable, back_callback: Callable | None = None, + back_text: str = "back", continue_text: str = "accept"): + super().__init__() + + # TODO: use Scroller + self._scroll_panel = GuiScrollPanel2(horizontal=False) + + self._continue_text = continue_text + self._continue_slider: bool = continue_text in ("reboot", "power off") + self._continue_button: WideRoundedButton | FullRoundedButton | SmallSlider + if self._continue_slider: + self._continue_button = SmallSlider(continue_text, confirm_callback=continue_callback) + self._scroll_panel.set_enabled(lambda: not self._continue_button.is_pressed) + elif back_callback is not None: + self._continue_button = WideRoundedButton(continue_text) + else: + self._continue_button = FullRoundedButton(continue_text) + self._continue_button.set_enabled(False) + self._continue_button.set_opacity(0.0) + self._continue_button.set_touch_valid_callback(self._scroll_panel.is_touch_valid) + if not self._continue_slider: + self._continue_button.set_click_callback(continue_callback) + + self._enable_back = back_callback is not None + self._back_button = SmallButton(back_text) + self._back_button.set_opacity(0.0) + self._back_button.set_touch_valid_callback(self._scroll_panel.is_touch_valid) + self._back_button.set_click_callback(back_callback) + + self._scroll_down_indicator = IconButton(gui_app.texture("icons_mici/setup/scroll_down_indicator.png", 64, 78)) + self._scroll_down_indicator.set_enabled(False) + + def reset(self): + self._scroll_panel.set_offset(0) + self._continue_button.set_enabled(False) + self._continue_button.set_opacity(0.0) + self._back_button.set_enabled(False) + self._back_button.set_opacity(0.0) + self._scroll_down_indicator.set_opacity(1.0) + + def show_event(self): + super().show_event() + self.reset() + + @property + @abstractmethod + def _content_height(self): + pass + + @property + def _scrolled_down_offset(self): + return -self._content_height + (self._continue_button.rect.height + 16 + 30) + + @abstractmethod + def _render_content(self, scroll_offset): + pass + + def _render(self, _): + scroll_offset = round(self._scroll_panel.update(self._rect, self._content_height + self._continue_button.rect.height + 16)) + + if scroll_offset <= self._scrolled_down_offset: + # don't show back if not enabled + if self._enable_back: + self._back_button.set_enabled(True) + self._back_button.set_opacity(1.0, smooth=True) + self._continue_button.set_enabled(True) + self._continue_button.set_opacity(1.0, smooth=True) + self._scroll_down_indicator.set_opacity(0.0, smooth=True) + else: + self._back_button.set_enabled(False) + self._back_button.set_opacity(0.0, smooth=True) + self._continue_button.set_enabled(False) + self._continue_button.set_opacity(0.0, smooth=True) + self._scroll_down_indicator.set_opacity(1.0, smooth=True) + + # Render content + self._render_content(scroll_offset) + + # black gradient at top and bottom for scrolling content + rl.draw_rectangle_gradient_v(int(self._rect.x), int(self._rect.y), + int(self._rect.width), 20, rl.BLACK, rl.BLANK) + rl.draw_rectangle_gradient_v(int(self._rect.x), int(self._rect.y + self._rect.height - 20), + int(self._rect.width), 20, rl.BLANK, rl.BLACK) + + # fade out back button as slider is moved + if self._continue_slider and scroll_offset <= self._scrolled_down_offset: + self._back_button.set_opacity(1.0 - self._continue_button.slider_percentage) + self._back_button.set_visible(self._continue_button.slider_percentage < 0.99) + + self._back_button.render(rl.Rectangle( + self._rect.x + 8, + self._rect.y + self._rect.height - self._back_button.rect.height, + self._back_button.rect.width, + self._back_button.rect.height, + )) + + continue_x = self._rect.x + 8 + if self._enable_back: + continue_x = self._rect.x + self._rect.width - self._continue_button.rect.width - 8 + if self._continue_slider: + continue_x += 8 + self._continue_button.render(rl.Rectangle( + continue_x, + self._rect.y + self._rect.height - self._continue_button.rect.height, + self._continue_button.rect.width, + self._continue_button.rect.height, + )) + + self._scroll_down_indicator.render(rl.Rectangle( + self._rect.x + self._rect.width - self._scroll_down_indicator.rect.width - 8, + self._rect.y + self._rect.height - self._scroll_down_indicator.rect.height - 8, + self._scroll_down_indicator.rect.width, + self._scroll_down_indicator.rect.height, + )) + + +class CustomSoftwareWarningPage(TermsPage): + def __init__(self, continue_callback: Callable, back_callback: Callable): + super().__init__(continue_callback, back_callback) + + self._title_header = TermsHeader("use caution installing\n3rd party software", + gui_app.texture("icons_mici/setup/warning.png", 66, 60)) + self._body = UnifiedLabel("â€ĸ It has not been tested by comma.\n" + + "â€ĸ It may not comply with relevant safety standards.\n" + + "â€ĸ It may cause damage to your device and/or vehicle.\n", 36, text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + font_weight=FontWeight.ROMAN) + + self._restore_header = TermsHeader("how to backup &\nrestore", gui_app.texture("icons_mici/setup/restore.png", 60, 60)) + self._restore_body = UnifiedLabel("To restore your device to a factory state later, use https://flash.comma.ai", + 36, text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + font_weight=FontWeight.ROMAN) + + @property + def _content_height(self): + return self._restore_body.rect.y + self._restore_body.rect.height - self._scroll_panel.get_offset() + + def _render_content(self, scroll_offset): + self._title_header.set_position(self._rect.x + 16, self._rect.y + 8 + scroll_offset) + self._title_header.render() + + body_rect = rl.Rectangle( + self._rect.x + 8, + self._title_header.rect.y + self._title_header.rect.height + self.ITEM_SPACING, + self._rect.width - 50, + self._body.get_content_height(int(self._rect.width - 50)), + ) + self._body.render(body_rect) + + self._restore_header.set_position(self._rect.x + 16, self._body.rect.y + self._body.rect.height + self.ITEM_SPACING) + self._restore_header.render() + + self._restore_body.render(rl.Rectangle( + self._rect.x + 8, + self._restore_header.rect.y + self._restore_header.rect.height + self.ITEM_SPACING, + self._rect.width - 50, + self._restore_body.get_content_height(int(self._rect.width - 50)), + )) + + +class DownloadingPage(Widget): + def __init__(self): + super().__init__() + + self._title_label = UnifiedLabel("downloading", 64, text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + font_weight=FontWeight.DISPLAY) + self._progress_label = UnifiedLabel("", 128, text_color=rl.Color(255, 255, 255, int(255 * 0.9 * 0.35)), + font_weight=FontWeight.ROMAN, alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM) + self._progress = 0 + + def set_progress(self, progress: int): + self._progress = progress + self._progress_label.set_text(f"{progress}%") + + def _render(self, rect: rl.Rectangle): + self._title_label.render(rl.Rectangle( + rect.x + 20, + rect.y + 10, + rect.width, + 64, + )) + + self._progress_label.render(rl.Rectangle( + rect.x + 20, + rect.y + 20, + rect.width, + rect.height, + )) + + +class FailedPage(Widget): + def __init__(self, reboot_callback: Callable, retry_callback: Callable, title: str = "download failed"): + super().__init__() + + self._title_label = UnifiedLabel(title, 64, text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + font_weight=FontWeight.DISPLAY) + self._reason_label = UnifiedLabel("", 36, text_color=rl.Color(255, 255, 255, int(255 * 0.9 * 0.65)), + font_weight=FontWeight.ROMAN) + + self._reboot_button = SmallRedPillButton("reboot") + self._reboot_button.set_click_callback(reboot_callback) + self._reboot_button.set_enabled(lambda: self.enabled) # for nav stack + + self._retry_button = WideRoundedButton("retry") + self._retry_button.set_click_callback(retry_callback) + self._retry_button.set_enabled(lambda: self.enabled) # for nav stack + + def set_reason(self, reason: str): + self._reason_label.set_text(reason) + + def _render(self, rect: rl.Rectangle): + self._title_label.render(rl.Rectangle( + rect.x + 8, + rect.y + 10, + rect.width, + 64, + )) + + self._reason_label.render(rl.Rectangle( + rect.x + 8, + rect.y + 10 + 64, + rect.width, + 36, + )) + + self._reboot_button.render(rl.Rectangle( + rect.x + 8, + rect.y + rect.height - self._reboot_button.rect.height, + self._reboot_button.rect.width, + self._reboot_button.rect.height, + )) + + self._retry_button.render(rl.Rectangle( + rect.x + 8 + self._reboot_button.rect.width + 8, + rect.y + rect.height - self._retry_button.rect.height, + self._retry_button.rect.width, + self._retry_button.rect.height, + )) + + +class NetworkSetupPage(Widget): + def __init__(self, wifi_manager, continue_callback: Callable, back_callback: Callable): + super().__init__() + self._wifi_ui = WifiUIMici(wifi_manager) + + self._no_wifi_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_slash.png", 58, 50) + self._wifi_full_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_full.png", 58, 50) + self._waiting_text = "waiting for internet..." + self._network_header = TermsHeader(self._waiting_text, self._no_wifi_txt) + + back_txt = gui_app.texture("icons_mici/setup/back_new.png", 37, 32) + self._back_button = SmallCircleIconButton(back_txt) + self._back_button.set_click_callback(back_callback) + self._back_button.set_enabled(lambda: self.enabled) # for nav stack + + self._wifi_button = SmallerRoundedButton("wifi") + self._wifi_button.set_click_callback(lambda: gui_app.push_widget(self._wifi_ui)) + self._wifi_button.set_enabled(lambda: self.enabled) # for nav stack + + self._continue_button = WidishRoundedButton("continue") + self._continue_button.set_enabled(False) + self._continue_button.set_click_callback(continue_callback) + + def set_has_internet(self, has_internet: bool): + if has_internet: + self._network_header.set_title("connected to internet") + self._network_header.set_icon(self._wifi_full_txt) + self._continue_button.set_enabled(self.enabled) + else: + self._network_header.set_title(self._waiting_text) + self._network_header.set_icon(self._no_wifi_txt) + self._continue_button.set_enabled(False) + + def _render(self, _): + self._network_header.render(rl.Rectangle( + self._rect.x + 16, + self._rect.y + 16, + self._rect.width - 32, + self._network_header.rect.height, + )) + + self._back_button.render(rl.Rectangle( + self._rect.x + 8, + self._rect.y + self._rect.height - self._back_button.rect.height, + self._back_button.rect.width, + self._back_button.rect.height, + )) + + self._wifi_button.render(rl.Rectangle( + self._rect.x + 8 + self._back_button.rect.width + 10, + self._rect.y + self._rect.height - self._wifi_button.rect.height, + self._wifi_button.rect.width, + self._wifi_button.rect.height, + )) + + self._continue_button.render(rl.Rectangle( + self._rect.x + self._rect.width - self._continue_button.rect.width - 8, + self._rect.y + self._rect.height - self._continue_button.rect.height, + self._continue_button.rect.width, + self._continue_button.rect.height, + )) + + +class Setup(Widget): + def __init__(self): + super().__init__() + self.state = SetupState.GETTING_STARTED + self.failed_url = "" + self.failed_reason = "" + self.download_url = "" + self.download_progress = 0 + self.download_thread = None + self._wifi_manager = WifiManager() + self._wifi_manager.set_active(True) + # BLE zero-touch setup (Phase A) — shares this WifiManager. Best-effort. + self.ble_setup = None + self._ble_pending_install_url = None + self._init_ble_setup() + self._network_monitor = NetworkConnectivityMonitor() + self._network_monitor.start() + self._prev_has_internet = False + gui_app.add_nav_stack_tick(self._nav_stack_tick) + + self._start_page = StartPage() + self._start_page.set_click_callback(self._getting_started_button_callback) + + self._network_setup_page = NetworkSetupPage(self._wifi_manager, self._network_setup_continue_button_callback, + self._network_setup_back_button_callback) + self._network_setup_page.set_enabled(lambda: self.enabled) # for nav stack + + self._software_selection_page = SoftwareSelectionPage(self._software_selection_continue_button_callback, + self._software_selection_custom_software_button_callback) + self._software_selection_page.set_enabled(lambda: self.enabled) # for nav stack + + self._download_failed_page = FailedPage(HARDWARE.reboot, self._download_failed_startover_button_callback) + self._download_failed_page.set_enabled(lambda: self.enabled) # for nav stack + + self._custom_software_warning_page = CustomSoftwareWarningPage(self._software_selection_custom_software_continue, + self._custom_software_warning_back_button_callback) + self._custom_software_warning_page.set_enabled(lambda: self.enabled) # for nav stack + + self._downloading_page = DownloadingPage() + + def _nav_stack_tick(self): + has_internet = self._network_monitor.network_connected.is_set() + if has_internet and not self._prev_has_internet: + gui_app.pop_widgets_to(self) + self._prev_has_internet = has_internet + + def _init_ble_setup(self): + try: + from iqpilot.system.ui.lib.setup_controller import SetupController + version = "" + try: + with open("/VERSION") as f: + version = f.read().strip() + except Exception: + pass + controller = SetupController( + serial=HARDWARE.get_serial(), + hardware=HARDWARE, + wifi_manager=self._wifi_manager, + on_start_install=self._ble_request_install, + version=version, + ) + self.ble_setup = controller + # controller.start() can block on BlueZ D-Bus registration (up to ~30s if + # BlueZ is unhealthy) — run it off the UI thread so the setup screen never + # stalls. The UI already guards ble_setup being None / not-yet-advertising. + def _start_ble(): + try: + if not controller.start(): + self.ble_setup = None + except Exception: + self.ble_setup = None + threading.Thread(target=_start_ble, name="ble_setup_start", daemon=True).start() + except Exception: + self.ble_setup = None + + def _ble_request_install(self, url: str): + self._ble_pending_install_url = url + + def _ble_sync(self): + if self.ble_setup is None: + return + if self._ble_pending_install_url is not None: + url = self._ble_pending_install_url + self._ble_pending_install_url = None + if self.state not in (SetupState.DOWNLOADING, SetupState.DOWNLOAD_FAILED): + self.download(url) + # Install progress is reported by the install thread (_ble_progress / + # _maybe_update_os) as the single source of truth. Do NOT push per-frame here: + # a ~60fps "downloading" push floods over the thread's os_update_required / + # installing / rebooting states so the phone never sees them (the OS-update + # confirm prompt would never appear). Only relay the terminal failure reason. + if self.state == SetupState.DOWNLOAD_FAILED: + self.ble_setup.set_install_progress("failed", 0, self.failed_reason) + + def _update_state(self): + self._ble_sync() + self._wifi_manager.process_callbacks() + + def _set_state(self, state: SetupState): + self.state = state + if self.state == SetupState.SOFTWARE_SELECTION: + self._software_selection_page.reset() + elif self.state == SetupState.CUSTOM_SOFTWARE_WARNING: + self._custom_software_warning_page.reset() + + if self.state in (SetupState.NETWORK_SETUP, SetupState.NETWORK_SETUP_CUSTOM_SOFTWARE): + self._network_setup_page.show_event() + self._network_monitor.reset() + else: + self._network_setup_page.hide_event() + + def _render(self, rect: rl.Rectangle): + if self.state == SetupState.GETTING_STARTED: + self._start_page.render(rect) + elif self.state in (SetupState.NETWORK_SETUP, SetupState.NETWORK_SETUP_CUSTOM_SOFTWARE): + self.render_network_setup(rect) + elif self.state == SetupState.SOFTWARE_SELECTION: + self._software_selection_page.render(rect) + elif self.state == SetupState.CUSTOM_SOFTWARE_WARNING: + self._custom_software_warning_page.render(rect) + elif self.state == SetupState.DOWNLOADING: + self.render_downloading(rect) + elif self.state == SetupState.DOWNLOAD_FAILED: + self._download_failed_page.render(rect) + + def _custom_software_warning_back_button_callback(self): + self._set_state(SetupState.SOFTWARE_SELECTION) + + def _getting_started_button_callback(self): + self._set_state(SetupState.SOFTWARE_SELECTION) + + def _software_selection_back_button_callback(self): + self._set_state(SetupState.GETTING_STARTED) + + def _software_selection_continue_button_callback(self): + self.use_iqpilot() + + def _software_selection_custom_software_button_callback(self): + self._set_state(SetupState.CUSTOM_SOFTWARE_WARNING) + + def _software_selection_custom_software_continue(self): + self._set_state(SetupState.NETWORK_SETUP_CUSTOM_SOFTWARE) + + def _download_failed_startover_button_callback(self): + self._set_state(SetupState.GETTING_STARTED) + + def _network_setup_back_button_callback(self): + self._set_state(SetupState.SOFTWARE_SELECTION) + + def _network_setup_continue_button_callback(self): + if self.state == SetupState.NETWORK_SETUP: + self.download(IQPILOT_INSTALLER_URL) + elif self.state == SetupState.NETWORK_SETUP_CUSTOM_SOFTWARE: + def handle_keyboard_result(text): + url = text.strip() + if url: + self.download(url) + + keyboard = BigInputDialog("custom software URL", confirm_callback=handle_keyboard_result) + gui_app.push_widget(keyboard) + + def close(self): + self._network_monitor.stop() + + def render_network_setup(self, rect: rl.Rectangle): + has_internet = self._network_monitor.network_connected.is_set() + self._network_setup_page.set_has_internet(has_internet) + self._network_setup_page.render(rect) + + def render_downloading(self, rect: rl.Rectangle): + self._downloading_page.set_progress(self.download_progress) + self._downloading_page.render(rect) + + def use_iqpilot(self): + self._set_state(SetupState.NETWORK_SETUP) + + def download(self, url: str): + self._set_state(SetupState.DOWNLOADING) + + # "/" maps to a GitHub fork (e.g. IQLvbs/release). Clone it directly here rather + # than fetching comma's Wayland installer, which can't run on IQ.OS's DRM compositor. + match = re.match(r"^([^/.]+)/([^/]+)$", url) + if match: + user, branch = match.group(1), match.group(2) + self.download_url = f"{user}/{branch}" + self.download_thread = threading.Thread(target=self._fork_install_thread, args=(user, branch), daemon=True) + self.download_thread.start() + return + + parsed = urlparse(url, scheme='https') + self.download_url = (urlparse(f"https://{url}") if not parsed.netloc else parsed).geturl() + + self.download_thread = threading.Thread(target=self._download_thread, daemon=True) + self.download_thread.start() + + def _ble_progress(self, state: str, percent: int = 0): + # Mirror install milestones to a phone driving setup over BLE so it can track + # the flow and hand off to Phase B. Best-effort — no-op without a BLE session. + if self.ble_setup is not None: + try: + self.ble_setup.set_install_progress(state, percent) + except Exception: + pass + + def _write_setup_claim(self): + ble = self.ble_setup + if ble is None or not getattr(ble, "phone_active", False): + return + try: + import hashlib + claim_id = hashlib.sha256(f"k3setup-claim:v1:{ble.code}:{ble.serial}".encode()).hexdigest() + with open("/data/setup_claim_id", "w") as f: + f.write(claim_id) + except Exception: + pass + + def _fork_install_thread(self, user: str, branch: str): + git_url = GIT_URL_OVERRIDES.get(user) or GITHUB_FORK_URL.format(user=user) + label = f"{user}/{branch}" + try: + subprocess.run(["rm", "-rf", TMP_INSTALL_PATH], check=False) + + self._ble_progress("downloading", 10) + clone = subprocess.run(["git", "clone", "--depth=1", + "-b", branch, git_url, TMP_INSTALL_PATH]) + if clone.returncode != 0: + self._ble_progress("failed") + self.download_failed(label, "No custom software found at this URL.") + return + + self._ble_progress("downloading", 70) + subprocess.run(["git", "-C", TMP_INSTALL_PATH, "reset", "--hard", f"origin/{branch}"], check=True) + + run_cmd(["rm", "-f", VALID_CACHE_PATH]) + # sudo: a prior *run* install can leave root-owned .pyc here that a comma-user rm can't delete. + run_cmd(["sudo", "rm", "-rf", INSTALL_PATH]) + run_cmd(["mv", TMP_INSTALL_PATH, INSTALL_PATH]) + + self._ble_progress("installing", 90) + + # If the chosen channel targets a newer IQ.OS than we're running, flash it + # BEFORE writing continue.sh so the single reboot lands on a compatible OS. + if not self._maybe_update_os(label): + return + + self._write_setup_claim() + + with open(TMP_CONTINUE_PATH, "w") as f: + f.write(CONTINUE) + run_cmd(["chmod", "+x", TMP_CONTINUE_PATH]) + shutil.move(TMP_CONTINUE_PATH, CONTINUE_PATH) + + with open(INSTALLER_URL_PATH, "w") as f: + f.write(label) + + # comma.sh blocks waiting for /tmp/installer before checking for continue.sh; the real + # install is already done above, so drop a no-op installer to let it proceed and launch. + with open(INSTALLER_DESTINATION_PATH, "w") as f: + f.write("#!/bin/sh\nexit 0\n") + run_cmd(["chmod", "+x", INSTALLER_DESTINATION_PATH]) + + # Tell the phone we're about to reboot into the installed fork so it can + # switch to Phase B; give the event a moment to flush before the link drops. + self._ble_progress("rebooting", 100) + time.sleep(0.4) + gui_app.request_close() + except Exception: + self._ble_progress("failed") + self.download_failed(label, "Invalid URL") + + def _maybe_update_os(self, label: str) -> bool: + # The freshly-installed fork pins the IQ.OS it needs in launch_env.sh. If it + # differs from what we're running, flash it now (via comma's agnos.py) so the + # upcoming single reboot lands on a compatible OS instead of dead-ending on + # "update required". Returns False (and shows the failed page) on abort. + from iqpilot.system.ui.lib.os_update import os_update_needed, run_agnos_update + try: + needed, current, required = os_update_needed(INSTALL_PATH) + except Exception: + return True # never block an install on a version-check failure + if not needed: + return True + + ble = self.ble_setup + if ble is not None and getattr(ble, "phone_active", False): + ble.os_update.request(current, required) + ble.set_install_progress("os_update_required", 0, os_from=current, os_to=required) + if not ble.os_update.wait_for_confirm(timeout=300): + ble.set_install_progress("failed", error="os_update_not_confirmed") + self.download_failed(label, f"IQ.OS update to {required} was not confirmed.") + return False + + def _cb(pct: int, note: str): + if ble is not None: + ble.set_install_progress("os_updating", pct, error=note, os_from=current, os_to=required) + + if not run_agnos_update(INSTALL_PATH, HARDWARE.get_device_type(), _cb): + if ble is not None: + ble.set_install_progress("failed", error="os_update_failed") + self.download_failed(label, f"IQ.OS update to {required} failed. Please try again.") + return False + return True + + def _download_thread(self): + try: + import tempfile + + fd, tmpfile = tempfile.mkstemp(prefix="installer_") + + headers = {"User-Agent": USER_AGENT, + "X-openpilot-serial": HARDWARE.get_serial(), + "X-openpilot-device-type": HARDWARE.get_device_type()} + req = urllib.request.Request(self.download_url, headers=headers) + + with open(tmpfile, 'wb') as f, urllib.request.urlopen(req, timeout=30) as response: + total_size = int(response.headers.get('content-length', 0)) + downloaded = 0 + block_size = 8192 + + while True: + buffer = response.read(block_size) + if not buffer: + break + + downloaded += len(buffer) + f.write(buffer) + + if total_size: + self.download_progress = int(downloaded * 100 / total_size) + self._downloading_page.set_progress(self.download_progress) + + is_elf = False + with open(tmpfile, 'rb') as f: + header = f.read(4) + is_elf = header == b'\x7fELF' + + if not is_elf: + self.download_failed(self.download_url, "No custom software found at this URL.") + return + + # AGNOS might try to execute the installer before this process exits. + # Therefore, important to close the fd before renaming the installer. + os.close(fd) + # comma's ELF installer does `rm -rf /data/openpilot` as the comma user and asserts it + # succeeds; a prior *run* install leaves root-owned __pycache__ .pyc it can't delete, so it + # aborts before continue.sh and bounces back to setup. Clear the old tree first (sudo) so the + # installer's rm succeeds. + subprocess.run(["sudo", "rm", "-rf", INSTALL_PATH], check=False) + os.rename(tmpfile, INSTALLER_DESTINATION_PATH) + + with open(INSTALLER_URL_PATH, "w") as f: + f.write(self.download_url) + + # give time for installer UI to take over + time.sleep(0.1) + gui_app.request_close() + + except urllib.error.HTTPError as e: + if e.code == 409: + error_msg = "Incompatible IQ.Pilot version" + self.download_failed(self.download_url, error_msg) + except Exception: + error_msg = "Invalid URL" + self.download_failed(self.download_url, error_msg) + + def download_failed(self, url: str, reason: str): + self.failed_url = url + self.failed_reason = reason + self._download_failed_page.set_reason(reason) + self._set_state(SetupState.DOWNLOAD_FAILED) + + +def main(): + try: + gui_app.init_window("Setup") + setup = Setup() + gui_app.push_widget(setup) + for _ in gui_app.render(): + pass + setup.close() + except Exception as e: + print(f"Setup error: {e}") + finally: + gui_app.close() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/mici_updater.py b/iqpilot/system/ui/mici_updater.py new file mode 100755 index 000000000..bc2d4e134 --- /dev/null +++ b/iqpilot/system/ui/mici_updater.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python3 +import sys +import subprocess +import threading +import pyray as rl +from enum import IntEnum + +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.wifi_manager import WifiManager, Network +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import gui_text_box, gui_label, UnifiedLabel +from iqpilot.system.ui.widgets.button import FullRoundedButton +from iqpilot.system.ui.mici_setup import NetworkSetupPage, FailedPage, NetworkConnectivityMonitor + + +class Screen(IntEnum): + PROMPT = 0 + WIFI = 1 + PROGRESS = 2 + FAILED = 3 + + +class Updater(Widget): + def __init__(self, updater_path, manifest_path): + super().__init__() + self.updater = updater_path + self.manifest = manifest_path + self.current_screen = Screen.PROMPT + self._current_network_strength = -1 + + self.progress_value = 0 + self.progress_text = "loading" + self.process = None + self.update_thread = None + self._wifi_manager = WifiManager() + self._wifi_manager.set_active(True) + + self._network_setup_page = NetworkSetupPage(self._wifi_manager, self._network_setup_continue_callback, + self._network_setup_back_callback) + + self._wifi_manager.add_callbacks(networks_updated=self._on_network_updated) + self._network_monitor = NetworkConnectivityMonitor() + self._network_monitor.start() + + # Buttons + self._continue_button = FullRoundedButton("continue") + self._continue_button.set_click_callback(lambda: self.set_current_screen(Screen.WIFI)) + + self._title_label = UnifiedLabel("update required", 48, text_color=rl.Color(255, 115, 0, 255), + font_weight=FontWeight.DISPLAY) + self._subtitle_label = UnifiedLabel("The download size is approximately 1GB.", 36, + text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + font_weight=FontWeight.ROMAN) + + self._update_failed_page = FailedPage(HARDWARE.reboot, self._update_failed_retry_callback, + title="update failed") + + def _network_setup_back_callback(self): + self.set_current_screen(Screen.PROMPT) + + def _network_setup_continue_callback(self): + self.install_update() + + def _update_failed_retry_callback(self): + self.set_current_screen(Screen.PROMPT) + + def _on_network_updated(self, networks: list[Network]): + self._current_network_strength = next((net.strength for net in networks if net.is_connected), -1) + + def set_current_screen(self, screen: Screen): + if self.current_screen != screen: + if screen == Screen.PROGRESS: + if self._network_setup_page: + self._network_setup_page.hide_event() + elif screen == Screen.WIFI: + if self._network_setup_page: + self._network_setup_page.show_event() + elif screen == Screen.PROMPT: + if self._network_setup_page: + self._network_setup_page.hide_event() + elif screen == Screen.FAILED: + if self._network_setup_page: + self._network_setup_page.hide_event() + + self.current_screen = screen + + def install_update(self): + self.set_current_screen(Screen.PROGRESS) + self.progress_value = 0 + self.progress_text = "downloading" + + # Start the update process in a separate thread + self.update_thread = threading.Thread(target=self._run_update_process) + self.update_thread.daemon = True + self.update_thread.start() + + def _run_update_process(self): + # TODO: just import it and run in a thread without a subprocess + cmd = [self.updater, "--swap", self.manifest] + self.process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + text=True, bufsize=1, universal_newlines=True) + + if self.process.stdout is not None: + for line in self.process.stdout: + parts = line.strip().split(":") + if len(parts) == 2: + self.progress_text = parts[0].lower() + try: + self.progress_value = int(float(parts[1])) + except ValueError: + pass + + exit_code = self.process.wait() + if exit_code == 0: + HARDWARE.reboot() + else: + self.set_current_screen(Screen.FAILED) + + def render_prompt_screen(self, rect: rl.Rectangle): + self._title_label.render(rl.Rectangle( + rect.x + 8, + rect.y - 5, + rect.width, + 48, + )) + + subtitle_width = rect.width - 16 + subtitle_height = self._subtitle_label.get_content_height(int(subtitle_width)) + self._subtitle_label.render(rl.Rectangle( + rect.x + 8, + rect.y + 48, + subtitle_width, + subtitle_height, + )) + + self._continue_button.render(rl.Rectangle( + rect.x + 8, + rect.y + rect.height - self._continue_button.rect.height, + self._continue_button.rect.width, + self._continue_button.rect.height, + )) + + def render_progress_screen(self, rect: rl.Rectangle): + title_rect = rl.Rectangle(self._rect.x + 6, self._rect.y - 5, self._rect.width - 12, self._rect.height - 8) + if ' ' in self.progress_text: + font_size = 62 + else: + font_size = 82 + gui_text_box(title_rect, self.progress_text, font_size, font_weight=FontWeight.DISPLAY, + color=rl.Color(255, 255, 255, int(255 * 0.9))) + + progress_value = f"{self.progress_value}%" + text_height = measure_text_cached(gui_app.font(FontWeight.ROMAN), progress_value, 128).y + progress_rect = rl.Rectangle(self._rect.x + 6, self._rect.y + self._rect.height - text_height + 18, + self._rect.width - 12, text_height) + gui_label(progress_rect, progress_value, 128, font_weight=FontWeight.ROMAN, + color=rl.Color(255, 255, 255, int(255 * 0.9 * 0.35))) + + def _update_state(self): + self._wifi_manager.process_callbacks() + + def _render(self, rect: rl.Rectangle): + if self.current_screen == Screen.PROMPT: + self.render_prompt_screen(rect) + elif self.current_screen == Screen.WIFI: + self._network_setup_page.set_has_internet(self._network_monitor.network_connected.is_set()) + self._network_setup_page.render(rect) + elif self.current_screen == Screen.PROGRESS: + self.render_progress_screen(rect) + elif self.current_screen == Screen.FAILED: + self._update_failed_page.render(rect) + + def close(self): + self._network_monitor.stop() + + +def main(): + if len(sys.argv) < 3: + print("Usage: updater.py ") + sys.exit(1) + + updater_path = sys.argv[1] + manifest_path = sys.argv[2] + + try: + gui_app.init_window("System Update") + updater = Updater(updater_path, manifest_path) + for should_render in gui_app.render(): + if should_render: + updater.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + updater.close() + except Exception as e: + print(f"Updater error: {e}") + finally: + gui_app.close() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/reset.py b/iqpilot/system/ui/reset.py new file mode 100755 index 000000000..d74151e5c --- /dev/null +++ b/iqpilot/system/ui/reset.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +from iqpilot.system.ui.lib.application import gui_app +import iqpilot.system.ui.tici_reset as tici_reset +import iqpilot.system.ui.mici_reset as mici_reset + + +def main(): + if gui_app.big_ui(): + tici_reset.main() + else: + mici_reset.main() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/setup.py b/iqpilot/system/ui/setup.py new file mode 100755 index 000000000..c9141dfac --- /dev/null +++ b/iqpilot/system/ui/setup.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +from iqpilot.system.ui.lib.application import gui_app + + +def main(): + if gui_app.big_ui(): + import iqpilot.system.ui.tici_setup as tici_setup + tici_setup.main() + else: + import iqpilot.system.ui.mici_setup as mici_setup + mici_setup.main() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/spinner.py b/iqpilot/system/ui/spinner.py new file mode 100755 index 000000000..31d283557 --- /dev/null +++ b/iqpilot/system/ui/spinner.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +import math +import pyray as rl +import select +import sys + +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.text import wrap_text +from iqpilot.system.ui.widgets import Widget + +# Constants +if gui_app.big_ui(): + PROGRESS_BAR_WIDTH = 1000 + PROGRESS_BAR_HEIGHT = 20 + TEXTURE_SIZE = 360 + WRAPPED_SPACING = 50 + CENTERED_SPACING = 150 +else: + PROGRESS_BAR_WIDTH = 268 + PROGRESS_BAR_HEIGHT = 10 + TEXTURE_SIZE = 140 + WRAPPED_SPACING = 10 + CENTERED_SPACING = 20 +LOGO_SCALE = 0.82 +LOGO_SIZE = int(TEXTURE_SIZE * LOGO_SCALE) +LOGO_Y_OFFSET = int(TEXTURE_SIZE * 0.04) +MARGIN_H = 100 +FONT_SIZE = 96 +LINE_HEIGHT = 104 +DARKGRAY = (55, 55, 55, 255) +PROGRESS_START = rl.Color(0x1B, 0x94, 0x88, 0xFF) +PROGRESS_END = rl.Color(0xA3, 0x0B, 0x8C, 0xFF) +DOT_REGION_X = 0.83 +DOT_REGION_Y = 0.58 +DOT_BOUNCE_HEIGHT = TEXTURE_SIZE * 0.08 +DOT_BOUNCE_PERIOD = 0.9 + + +def clamp(value, min_value, max_value): + return max(min(value, max_value), min_value) + + +def lerp_color(start: rl.Color, end: rl.Color, t: float) -> rl.Color: + t = clamp(t, 0.0, 1.0) + return rl.Color( + int(round(start.r + (end.r - start.r) * t)), + int(round(start.g + (end.g - start.g) * t)), + int(round(start.b + (end.b - start.b) * t)), + int(round(start.a + (end.a - start.a) * t)), + ) + + +class Spinner(Widget): + def __init__(self): + super().__init__() + self._comma_texture, self._has_bouncing_dot = self._load_center_texture() + self._progress: int | None = None + self._wrapped_lines: list[str] = [] + + @staticmethod + def _load_center_texture(): + try: + return gui_app.texture("images/k3_spinner.png", LOGO_SIZE, LOGO_SIZE), True + except Exception: + return gui_app.texture("images/spinner_comma.png", LOGO_SIZE, LOGO_SIZE), False + + def _draw_logo(self, position: rl.Vector2) -> None: + if not self._has_bouncing_dot: + rl.draw_texture_v(self._comma_texture, position, rl.WHITE) + return + + width = self._comma_texture.width + height = self._comma_texture.height + dot_x = int(width * DOT_REGION_X) + dot_y = int(height * DOT_REGION_Y) + source_top = rl.Rectangle(0, 0, width, dot_y) + source_left = rl.Rectangle(0, dot_y, dot_x, height - dot_y) + source_dot = rl.Rectangle(dot_x, dot_y, width - dot_x, height - dot_y) + origin = rl.Vector2(0, 0) + + rl.draw_texture_pro(self._comma_texture, source_top, rl.Rectangle(position.x, position.y, width, dot_y), origin, 0, rl.WHITE) + rl.draw_texture_pro(self._comma_texture, source_left, rl.Rectangle(position.x, position.y + dot_y, dot_x, height - dot_y), origin, 0, rl.WHITE) + + phase = (rl.get_time() % DOT_BOUNCE_PERIOD) / DOT_BOUNCE_PERIOD + bounce = -4.0 * DOT_BOUNCE_HEIGHT * phase * (1.0 - phase) + rl.draw_texture_pro(self._comma_texture, source_dot, + rl.Rectangle(position.x + dot_x, position.y + dot_y + bounce, width - dot_x, height - dot_y), + origin, 0, rl.WHITE) + + def set_text(self, text: str) -> None: + if text.isdigit(): + self._progress = clamp(int(text), 0, 100) + self._wrapped_lines = [] + else: + self._progress = None + self._wrapped_lines = wrap_text(text, FONT_SIZE, gui_app.width - MARGIN_H) + + def _render(self, rect: rl.Rectangle): + if self._wrapped_lines: + # Calculate total height required for spinner and text + spacing = WRAPPED_SPACING + total_height = TEXTURE_SIZE + spacing + len(self._wrapped_lines) * LINE_HEIGHT + center_y = (rect.height - total_height) / 2.0 + TEXTURE_SIZE / 2.0 + else: + # Center spinner vertically + spacing = CENTERED_SPACING + center_y = rect.height / 2.0 + y_pos = center_y + TEXTURE_SIZE / 2.0 + spacing + + center = rl.Vector2(rect.width / 2.0, center_y) + comma_position = rl.Vector2(center.x - LOGO_SIZE / 2.0, center.y - LOGO_SIZE / 2.0 + LOGO_Y_OFFSET) + + self._draw_logo(comma_position) + + # Display the progress bar or text based on user input + if self._progress is not None: + bar = rl.Rectangle(center.x - PROGRESS_BAR_WIDTH / 2.0, y_pos, PROGRESS_BAR_WIDTH, PROGRESS_BAR_HEIGHT) + rl.draw_rectangle_rounded(bar, 1, 10, DARKGRAY) + + bar.width *= self._progress / 100.0 + if bar.width > 0: + radius = bar.height / 2.0 + if bar.width <= bar.height: + fill_color = lerp_color(PROGRESS_START, PROGRESS_END, bar.width / PROGRESS_BAR_WIDTH) + rl.draw_circle_v(rl.Vector2(bar.x + bar.width / 2.0, bar.y + radius), min(bar.width, bar.height) / 2.0, fill_color) + else: + rl.draw_circle_v(rl.Vector2(bar.x + radius, bar.y + radius), radius, PROGRESS_START) + right_color = lerp_color(PROGRESS_START, PROGRESS_END, bar.width / PROGRESS_BAR_WIDTH) + rl.draw_circle_v(rl.Vector2(bar.x + bar.width - radius, bar.y + radius), radius, right_color) + rect_x = int(bar.x + radius) + rect_y = int(bar.y) + rect_width = int(max(0, bar.width - (2.0 * radius))) + if rect_width > 0: + rl.draw_rectangle_gradient_h(rect_x, rect_y, rect_width, int(bar.height), PROGRESS_START, right_color) + elif self._wrapped_lines: + for i, line in enumerate(self._wrapped_lines): + text_size = measure_text_cached(gui_app.font(), line, FONT_SIZE) + rl.draw_text_ex(gui_app.font(), line, rl.Vector2(center.x - text_size.x / 2, y_pos + i * LINE_HEIGHT), + FONT_SIZE, 0.0, rl.WHITE) + + +def _read_stdin(): + """Non-blocking read of available lines from stdin.""" + lines = [] + while True: + rlist, _, _ = select.select([sys.stdin], [], [], 0.0) + if not rlist: + break + line = sys.stdin.readline().strip() + if line == "": + break + lines.append(line) + return lines + + +def main(): + gui_app.init_window("Spinner") + spinner = Spinner() + for _ in gui_app.render(): + text_list = _read_stdin() + if text_list: + spinner.set_text(text_list[-1]) + + spinner.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/text.py b/iqpilot/system/ui/text.py new file mode 100755 index 000000000..81c2315d5 --- /dev/null +++ b/iqpilot/system/ui/text.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +import os +import re +import subprocess +import sys +import pyray as rl +from iqpilot.system.hardware import HARDWARE, PC +from iqpilot.system.ui.lib.application import BIG_UI, gui_app +from iqpilot.system.ui.lib.scroll_panel import GuiScrollPanel +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle + +if BIG_UI: + MARGIN = 50 + SPACING = 40 + FONT_SIZE = 72 + LINE_HEIGHT = 80 + BUTTON_SIZE = rl.Vector2(560, 160) +else: + MARGIN = 20 + SPACING = 30 + FONT_SIZE = 25 + LINE_HEIGHT = 25 + BUTTON_SIZE = rl.Vector2(280, 80) + +DEMO_TEXT = """This is a sample text that will be wrapped and scrolled if necessary. + The text is long enough to demonstrate scrolling and word wrapping.""" * 30 + + +def wrap_text(text, font_size, max_width): + lines = [] + font = gui_app.font() + + for paragraph in text.split("\n"): + if not paragraph.strip(): + # Don't add empty lines first, ensuring wrap_text("") returns [] + if lines: + lines.append("") + continue + indent = re.match(r"^\s*", paragraph).group() + current_line = indent + words = re.split(r"(\s+|-)", paragraph[len(indent):]) + while len(words): + word = words.pop(0) + test_line = current_line + word + (words.pop(0) if words else "") + if measure_text_cached(font, test_line, font_size).x <= max_width: + current_line = test_line + else: + lines.append(current_line) + current_line = word + " " + current_line = current_line.rstrip() + if current_line: + lines.append(current_line) + + return lines + + +class TextWindow(Widget): + def __init__(self, text: str): + super().__init__() + self._textarea_rect = rl.Rectangle(MARGIN, MARGIN, gui_app.width - MARGIN * 2, gui_app.height - MARGIN * 2) + self._wrapped_lines = wrap_text(text, FONT_SIZE, self._textarea_rect.width - 20) + self._content_rect = rl.Rectangle(0, 0, self._textarea_rect.width - 20, len(self._wrapped_lines) * LINE_HEIGHT) + self._scroll_panel = GuiScrollPanel() + self._scroll_panel._offset_filter_y.x = -max(self._content_rect.height - self._textarea_rect.height, 0) + + button_text = "Exit" if PC else "Update & Reboot" + self._button = Button(button_text, click_callback=self._on_button_clicked, button_style=ButtonStyle.TRANSPARENT_WHITE_BORDER, font_size=FONT_SIZE) + + @staticmethod + def _on_button_clicked(): + if PC: + gui_app.request_close() + return + + try: + basedir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..") + # Detect current branch and its remote tracking ref + branch = subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"], cwd=basedir, timeout=10).decode().strip() + remote = subprocess.check_output( + ["git", "config", f"branch.{branch}.remote"], cwd=basedir, timeout=10 + ).decode().strip() or "origin" + subprocess.run(["git", "fetch", remote], cwd=basedir, timeout=60) + subprocess.run(["git", "reset", "--hard", f"{remote}/{branch}"], cwd=basedir, timeout=30) + except Exception: + pass + + gui_app.request_close() + HARDWARE.reboot() + + def _render(self, rect: rl.Rectangle): + scroll = self._scroll_panel.update(self._textarea_rect, self._content_rect) + rl.begin_scissor_mode(int(self._textarea_rect.x), int(self._textarea_rect.y), int(self._textarea_rect.width), int(self._textarea_rect.height)) + for i, line in enumerate(self._wrapped_lines): + position = rl.Vector2(self._textarea_rect.x, self._textarea_rect.y + scroll + i * LINE_HEIGHT) + if position.y + LINE_HEIGHT < self._textarea_rect.y or position.y > self._textarea_rect.y + self._textarea_rect.height: + continue + rl.draw_text_ex(gui_app.font(), line, position, FONT_SIZE, 0, rl.WHITE) + rl.end_scissor_mode() + + button_bounds = rl.Rectangle(rect.width - MARGIN - BUTTON_SIZE.x - SPACING, rect.height - MARGIN - BUTTON_SIZE.y, BUTTON_SIZE.x, BUTTON_SIZE.y) + self._button.render(button_bounds) + + +if __name__ == "__main__": + text = sys.argv[1] if len(sys.argv) > 1 else DEMO_TEXT + gui_app.init_window("Text Viewer") + text_window = TextWindow(text) + for _ in gui_app.render(): + text_window.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) diff --git a/iqpilot/system/ui/tici_reset.py b/iqpilot/system/ui/tici_reset.py new file mode 100755 index 000000000..8a8685ded --- /dev/null +++ b/iqpilot/system/ui/tici_reset.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python3 +import os +import sys +import threading +import time +from enum import IntEnum + +import pyray as rl + +from iqpilot.system.hardware import PC +from iqpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.widgets.label import gui_label, gui_text_box + +USERDATA = "/dev/disk/by-partlabel/userdata" +NVME = "/dev/nvme0n1" +TIMEOUT = 3*60 + +# Guard the confirm against the same tap-burst that triggers tap-to-reset on boot. +# The confirm button stays disabled until the screen has been quiet (no touches) +# for CONFIRM_GUARD_QUIET seconds, so the triggering taps can't carry through and +# silently confirm the wipe. The user must stop, see the screen, then tap confirm. +CONFIRM_GUARD_MIN = 1.0 # minimum seconds the screen must be shown +CONFIRM_GUARD_QUIET = 1.0 # seconds of no touch input before arming confirm + + +class ResetMode(IntEnum): + USER_RESET = 0 # user initiated a factory reset from openpilot + RECOVER = 1 # userdata is corrupt for some reason, give a chance to recover + FORMAT = 2 # finish up a factory reset from a tool that doesn't flash an empty partition to userdata + + +class ResetState(IntEnum): + NONE = 0 + CONFIRM = 1 + RESETTING = 2 + FAILED = 3 + + +class Reset(Widget): + def __init__(self, mode): + super().__init__() + self._mode = mode + self._previous_reset_state = None + self._reset_state = ResetState.NONE + self._cancel_button = Button("Cancel", self._cancel_callback) + self._confirm_button = Button("Confirm", self._confirm, button_style=ButtonStyle.PRIMARY) + self._reboot_button = Button("Reboot", lambda: os.system("sudo reboot")) + self._render_status = True + + # tap-burst guard (see CONFIRM_GUARD_* above) + self._start_mono = time.monotonic() + self._last_touch_mono = self._start_mono + self._confirm_armed = False + self._confirm_button.set_enabled(lambda: self._confirm_armed) + + def _cancel_callback(self): + self._render_status = False + + def _do_erase(self): + if PC: + return + + # Removing data and formatting + rm = os.system("sudo rm -rf /data/*") + os.system(f"sudo umount {NVME}") + os.system(f"yes | sudo mkfs.ext4 {NVME}") + os.system(f"sudo umount {USERDATA}") + fmt = os.system(f"yes | sudo mkfs.ext4 {USERDATA}") + + if rm == 0 or fmt == 0: + os.system("sudo reboot") + else: + self._reset_state = ResetState.FAILED + + def start_reset(self): + self._reset_state = ResetState.RESETTING + threading.Timer(0.1, self._do_erase).start() + + def _update_state(self): + # arm the confirm button only after the screen has been touch-quiet for a beat, + # so the taps that triggered the reset don't carry through and confirm it + now = time.monotonic() + if rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT): + self._last_touch_mono = now + if not self._confirm_armed and (now - self._start_mono) > CONFIRM_GUARD_MIN \ + and (now - self._last_touch_mono) > CONFIRM_GUARD_QUIET: + self._confirm_armed = True + + if self._reset_state != self._previous_reset_state: + self._previous_reset_state = self._reset_state + self._timeout_st = time.monotonic() + elif self._reset_state != ResetState.RESETTING and (time.monotonic() - self._timeout_st) > TIMEOUT: + exit(0) + + def _render(self, rect: rl.Rectangle): + label_rect = rl.Rectangle(rect.x + 140, rect.y, rect.width - 280, 100 * FONT_SCALE) + gui_label(label_rect, "System Reset", 100, font_weight=FontWeight.BOLD) + + text_rect = rl.Rectangle(rect.x + 140, rect.y + 140, rect.width - 280, rect.height - 90 - 100 * FONT_SCALE) + gui_text_box(text_rect, self._get_body_text(), 90) + + button_height = 160 + button_spacing = 50 + button_top = rect.y + rect.height - button_height + button_width = (rect.width - button_spacing) / 2.0 + + if self._reset_state != ResetState.RESETTING: + if self._mode == ResetMode.RECOVER: + self._reboot_button.render(rl.Rectangle(rect.x, button_top, button_width, button_height)) + elif self._mode == ResetMode.USER_RESET: + self._cancel_button.render(rl.Rectangle(rect.x, button_top, button_width, button_height)) + + if self._reset_state != ResetState.FAILED: + self._confirm_button.render(rl.Rectangle(rect.x + button_width + 50, button_top, button_width, button_height)) + else: + self._reboot_button.render(rl.Rectangle(rect.x, button_top, rect.width, button_height)) + + return self._render_status + + def _confirm(self): + if self._reset_state == ResetState.CONFIRM: + self.start_reset() + else: + self._reset_state = ResetState.CONFIRM + + def _get_body_text(self): + if self._reset_state == ResetState.CONFIRM: + return "Are you sure you want to reset your device?" + if self._reset_state == ResetState.RESETTING: + return "Resetting device...\nThis may take up to a minute." + if self._reset_state == ResetState.FAILED: + return "Reset failed. Reboot to try again." + if self._mode == ResetMode.RECOVER: + return "Unable to mount data partition. Partition may be corrupted. Press confirm to erase and reset your device." + if not self._confirm_armed and self._reset_state == ResetState.NONE: + return "System reset triggered. Stop touching the screen, then press confirm to erase all content and settings. Press cancel to resume boot." + return "System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot." + + +def main(): + mode = ResetMode.USER_RESET + if len(sys.argv) > 1: + if sys.argv[1] == '--recover': + mode = ResetMode.RECOVER + elif sys.argv[1] == "--format": + mode = ResetMode.FORMAT + + gui_app.init_window("System Reset", 20) + reset = Reset(mode) + + if mode == ResetMode.FORMAT: + reset.start_reset() + + for should_render in gui_app.render(): + if should_render: + if not reset.render(rl.Rectangle(45, 200, gui_app.width - 90, gui_app.height - 245)): + break + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/tici_setup.py b/iqpilot/system/ui/tici_setup.py new file mode 100755 index 000000000..352e00ed7 --- /dev/null +++ b/iqpilot/system/ui/tici_setup.py @@ -0,0 +1,765 @@ +#!/usr/bin/env python3 +import os +import re +import subprocess +import threading +import time +import urllib.request +import urllib.error +from urllib.parse import urlparse +from enum import IntEnum +import shutil + +import pyray as rl + +from iqpilot.common.utils import run_cmd +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.ui.lib.scroll_panel import GuiScrollPanel +from iqpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle, ButtonRadio +from iqpilot.system.ui.widgets.keyboard import Keyboard +from iqpilot.system.ui.widgets.label import Label +from iqpilot.system.ui.widgets.network import WifiManagerUI, WifiManager + +try: + from iqpilot.cereal import log + NetworkType = log.DeviceState.NetworkType +except ImportError: + NetworkType = None + +MARGIN = 50 +TITLE_FONT_SIZE = 90 +TITLE_FONT_WEIGHT = FontWeight.MEDIUM +NEXT_BUTTON_WIDTH = 310 +BODY_FONT_SIZE = 80 +BUTTON_HEIGHT = 160 +BUTTON_SPACING = 50 + +NETWORK_CHECK_URL = "https://openpilot.comma.ai" +IQPILOT_BETA_URL = "IQLvbs/beta" +IQPILOT_RELEASE_URL = "IQLvbs/release" +USER_AGENT = f"AGNOSSetup-{HARDWARE.get_os_version()}" + +CONTINUE_PATH = "/data/continue.sh" +TMP_CONTINUE_PATH = "/data/continue.sh.new" +INSTALL_PATH = "/data/openpilot" +TMP_INSTALL_PATH = "/data/tmppilot" +VALID_CACHE_PATH = "/data/.openpilot_cache" +INSTALLER_SOURCE_PATH = "/usr/comma/installer" +INSTALLER_DESTINATION_PATH = "/tmp/installer" +INSTALLER_URL_PATH = "/tmp/installer_url" + +GITHUB_FORK_URL = "https://github.com/{user}/openpilot.git" +# IQ.Pilot lives on the IQ Lvbs git server; github.com/IQLvbs is DMCA'd and dead. +GIT_URL_OVERRIDES = {"IQLvbs": "https://git.konn3kt.com/IQ.Lvbs/IQ.Pilot.git"} + +CONTINUE = """#!/usr/bin/env bash + +cd /data/openpilot +exec ./launch_openpilot.sh +""" + + +class SetupState(IntEnum): + LOW_VOLTAGE = 0 + GETTING_STARTED = 1 + NETWORK_SETUP = 2 + SOFTWARE_SELECTION = 3 + CUSTOM_SOFTWARE = 4 + DOWNLOADING = 5 + DOWNLOAD_FAILED = 6 + CUSTOM_SOFTWARE_WARNING = 7 + IQPILOT_BRANCH_SELECTION = 8 + + +class Setup(Widget): + def __init__(self): + super().__init__() + self.state = SetupState.GETTING_STARTED + self.network_check_thread = None + self.network_connected = threading.Event() + self.wifi_connected = threading.Event() + self.stop_network_check_thread = threading.Event() + self.failed_url = "" + self.failed_reason = "" + self.download_url = "" + self.download_progress = 0 + self.download_thread = None + # Single WifiManager shared with the BLE setup transport so a phone can scan + # and connect Wi-Fi over Bluetooth using the same NM state the on-screen UI shows. + self.wifi_manager = WifiManager() + self.wifi_ui = WifiManagerUI(self.wifi_manager) + self.keyboard = Keyboard() + + # BLE zero-touch setup (Phase A): advertise so the konn3kt app can drive + # Wi-Fi + install over Bluetooth. Best-effort — on-screen setup is unaffected + # if BlueZ is unavailable. + self.ble_setup = None + self._ble_pending_install_url = None + self._init_ble_setup() + self.selected_radio = None + self.warning = gui_app.texture("icons/warning.png", 150, 150) + self.checkmark = gui_app.texture("icons/circled_check.png", 100, 100) + + self._low_voltage_title_label = Label("WARNING: Low Voltage", TITLE_FONT_SIZE, FontWeight.MEDIUM, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + text_color=rl.Color(255, 89, 79, 255), text_padding=20) + self._low_voltage_body_label = Label("Power your device in a car with a harness or proceed at your own risk.", BODY_FONT_SIZE, + text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + self._low_voltage_continue_button = Button("Continue", self._low_voltage_continue_button_callback) + self._low_voltage_poweroff_button = Button("Power Off", HARDWARE.shutdown) + + self._getting_started_button = Button("", self._getting_started_button_callback, button_style=ButtonStyle.PRIMARY, border_radius=0) + self._getting_started_title_label = Label("Getting Started", TITLE_FONT_SIZE, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + self._getting_started_body_label = Label("Before we get on the road, let's finish installation and cover some details.", + BODY_FONT_SIZE, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + + self.iqpilot_url = IQPILOT_RELEASE_URL + + self._software_selection_iqpilot_button = ButtonRadio("IQ.Pilot", self.checkmark, font_size=BODY_FONT_SIZE, text_padding=80) + self._software_selection_openpilot_button = ButtonRadio("Upstream openpilot", self.checkmark, font_size=BODY_FONT_SIZE, text_padding=80) + self._software_selection_custom_software_button = ButtonRadio("Custom Software", self.checkmark, font_size=BODY_FONT_SIZE, text_padding=80) + self._software_selection_continue_button = Button("Continue", self._software_selection_continue_button_callback, + button_style=ButtonStyle.PRIMARY) + self._software_selection_continue_button.set_enabled(False) + self._software_selection_back_button = Button("Back", self._software_selection_back_button_callback) + self._software_selection_title_label = Label("Choose Software to Use", TITLE_FONT_SIZE, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + text_padding=20) + + self._iqpilot_branch_beta_button = ButtonRadio("Beta", self.checkmark, font_size=BODY_FONT_SIZE, text_padding=80) + self._iqpilot_branch_release_button = ButtonRadio("Release", self.checkmark, font_size=BODY_FONT_SIZE, text_padding=80) + self._iqpilot_branch_continue_button = Button("Continue", self._iqpilot_branch_continue_button_callback, + button_style=ButtonStyle.PRIMARY) + self._iqpilot_branch_continue_button.set_enabled(False) + self._iqpilot_branch_back_button = Button("Back", self._iqpilot_branch_back_button_callback) + self._iqpilot_branch_title_label = Label("Branch:", TITLE_FONT_SIZE, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + text_padding=20) + + self._download_failed_reboot_button = Button("Reboot device", HARDWARE.reboot) + self._download_failed_startover_button = Button("Start over", self._download_failed_startover_button_callback, button_style=ButtonStyle.PRIMARY) + self._download_failed_title_label = Label("Download Failed", TITLE_FONT_SIZE, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + self._download_failed_url_label = Label("", 52, FontWeight.NORMAL, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + self._download_failed_body_label = Label("", BODY_FONT_SIZE, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + + self._network_setup_back_button = Button("Back", self._network_setup_back_button_callback) + self._network_setup_continue_button = Button("Waiting for internet", self._network_setup_continue_button_callback, + button_style=ButtonStyle.PRIMARY) + self._network_setup_continue_button.set_enabled(False) + self._network_setup_title_label = Label("Connect to Wi-Fi", TITLE_FONT_SIZE, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + + self._custom_software_warning_continue_button = Button("Scroll to continue", self._custom_software_warning_continue_button_callback, + button_style=ButtonStyle.PRIMARY) + self._custom_software_warning_continue_button.set_enabled(False) + self._custom_software_warning_back_button = Button("Back", self._custom_software_warning_back_button_callback) + self._custom_software_warning_title_label = Label("WARNING: Custom Software", 81, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + text_color=rl.Color(255, 89, 79, 255), + text_padding=60) + self._custom_software_warning_body_label = Label("Use caution when installing third-party software.\n\n" + + "âš ī¸ It has not been tested by comma.\n\n" + + "âš ī¸ It may not comply with relevant safety standards.\n\n" + + "âš ī¸ It may cause damage to your device and/or vehicle.\n\n" + + "If you'd like to proceed, use https://flash.comma.ai " + + "to restore your device to a factory state later.", + 68, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=60) + self._custom_software_warning_body_scroll_panel = GuiScrollPanel() + + self._downloading_body_label = Label("Downloading...", TITLE_FONT_SIZE, FontWeight.MEDIUM, text_padding=20) + # Persistent "set up from your phone" banner: an eyebrow + the big pairing + # code, shown on every setup page so the konn3kt app can drive setup at any point. + self._ble_eyebrow_label = Label("KONN3KT SETUP CODE", 26, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + text_color=rl.Color(255, 255, 255, 150)) + self._ble_code_label = Label("", 56, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + text_color=rl.Color(255, 255, 255, 240)) + self._ble_connected_label = Label("Phone connected - continue in app", 28, FontWeight.MEDIUM, + rl.GuiTextAlignment.TEXT_ALIGN_CENTER, text_color=rl.Color(16, 185, 129, 255)) + + try: + with open("/sys/class/hwmon/hwmon1/in1_input") as f: + voltage = float(f.read().strip()) / 1000.0 + if voltage < 7: + self.state = SetupState.LOW_VOLTAGE + except (FileNotFoundError, ValueError): + self.state = SetupState.LOW_VOLTAGE + + def _init_ble_setup(self): + try: + from iqpilot.system.ui.lib.setup_controller import SetupController + version = "" + try: + with open("/VERSION") as f: + version = f.read().strip() + except Exception: + pass + controller = SetupController( + serial=HARDWARE.get_serial(), + hardware=HARDWARE, + wifi_manager=self.wifi_manager, + on_start_install=self._ble_request_install, + version=version, + ) + self.ble_setup = controller + # controller.start() can block on BlueZ D-Bus registration (up to ~30s if + # BlueZ is unhealthy) — run it off the UI thread so the setup screen never + # stalls. The UI already guards ble_setup being None / not-yet-advertising. + def _start_ble(): + try: + if not controller.start(): + self.ble_setup = None + except Exception: + self.ble_setup = None + threading.Thread(target=_start_ble, name="ble_setup_start", daemon=True).start() + except Exception: + self.ble_setup = None + + def _ble_request_install(self, url: str): + # Called from the BLE thread — defer to the UI thread (raylib is not + # thread-safe). The render loop consumes this and starts the real install. + self._ble_pending_install_url = url + + def _ble_sync(self): + if self.ble_setup is None: + return + # start a phone-requested install on the UI thread + if self._ble_pending_install_url is not None: + url = self._ble_pending_install_url + self._ble_pending_install_url = None + self.iqpilot_url = url + if self.state not in (SetupState.DOWNLOADING, SetupState.DOWNLOAD_FAILED): + self.download(url) + # Install progress is reported by the install thread (_ble_progress / + # _maybe_update_os) as the single source of truth. Do NOT push per-frame from + # here: a ~60fps "downloading" push floods over the install thread's + # os_update_required / installing / rebooting states and the phone never sees + # them (the OS-update confirm prompt would never appear). Only relay the + # terminal failure reason, which the thread doesn't spell out over BLE. + if self.state == SetupState.DOWNLOAD_FAILED: + self.ble_setup.set_install_progress("failed", 0, self.failed_reason) + + def _render_ble_overlay(self, rect: rl.Rectangle): + # Compact top-right chip on every setup page (except while installing): the + # 6-digit pairing code so the konn3kt app can drive setup over Bluetooth, or + # the connected state once a phone has joined. Corner placement keeps it off + # the page titles (top-left) and the continue/back buttons (bottom). + if self.ble_setup is None or self.state in (SetupState.DOWNLOADING, SetupState.LOW_VOLTAGE): + return + snap = self.ble_setup.snapshot() + + margin = 24 + if snap.get("phone_active"): + chip_w, chip_h = 700, 64 + chip_x = int(rect.x + rect.width - chip_w - margin) + chip_y = int(rect.y + margin) + chip = rl.Rectangle(chip_x, chip_y, chip_w, chip_h) + rl.draw_rectangle_rounded(chip, 0.5, 12, rl.Color(12, 12, 14, 225)) + rl.draw_circle(chip_x + 42, chip_y + chip_h // 2, 8, rl.Color(16, 185, 129, 255)) + self._ble_connected_label.render(rl.Rectangle(chip_x + 60, chip_y + (chip_h - 32) / 2, chip_w - 90, 36)) + else: + chip_w, chip_h = 430, 132 + chip_x = int(rect.x + rect.width - chip_w - margin) + chip_y = int(rect.y + margin) + chip = rl.Rectangle(chip_x, chip_y, chip_w, chip_h) + rl.draw_rectangle_rounded(chip, 0.3, 12, rl.Color(12, 12, 14, 225)) + rl.draw_rectangle(chip_x, chip_y + chip_h - 3, chip_w, 3, rl.Color(16, 185, 129, 255)) + code = self.ble_setup.code + spaced = " ".join(code) if code else "- - -" + self._ble_code_label.set_text(spaced) + self._ble_eyebrow_label.render(rl.Rectangle(chip_x, chip_y + 18, chip_w, 30)) + self._ble_code_label.render(rl.Rectangle(chip_x, chip_y + 54, chip_w, 62)) + + def _render(self, rect: rl.Rectangle): + self._ble_sync() + if self.state == SetupState.LOW_VOLTAGE: + self.render_low_voltage(rect) + elif self.state == SetupState.GETTING_STARTED: + self.render_getting_started(rect) + elif self.state == SetupState.NETWORK_SETUP: + self.render_network_setup(rect) + elif self.state == SetupState.SOFTWARE_SELECTION: + self.render_software_selection(rect) + elif self.state == SetupState.CUSTOM_SOFTWARE_WARNING: + self.render_custom_software_warning(rect) + elif self.state == SetupState.IQPILOT_BRANCH_SELECTION: + self.render_iqpilot_branch_selection(rect) + elif self.state == SetupState.CUSTOM_SOFTWARE: + self.render_custom_software() + elif self.state == SetupState.DOWNLOADING: + self.render_downloading(rect) + elif self.state == SetupState.DOWNLOAD_FAILED: + self.render_download_failed(rect) + self._render_ble_overlay(rect) + + def _low_voltage_continue_button_callback(self): + self.state = SetupState.GETTING_STARTED + + def _custom_software_warning_back_button_callback(self): + self.state = SetupState.SOFTWARE_SELECTION + + def _custom_software_warning_continue_button_callback(self): + self.state = SetupState.NETWORK_SETUP + self.stop_network_check_thread.clear() + self.start_network_check() + + def _getting_started_button_callback(self): + self.state = SetupState.SOFTWARE_SELECTION + + def _software_selection_back_button_callback(self): + self.state = SetupState.GETTING_STARTED + + def _software_selection_continue_button_callback(self): + if self._software_selection_iqpilot_button.selected: + self.state = SetupState.IQPILOT_BRANCH_SELECTION + elif self._software_selection_openpilot_button.selected: + self.use_openpilot() + else: + self.state = SetupState.CUSTOM_SOFTWARE_WARNING + + def _iqpilot_branch_back_button_callback(self): + self.state = SetupState.SOFTWARE_SELECTION + + def _iqpilot_branch_continue_button_callback(self): + self.iqpilot_url = IQPILOT_BETA_URL if self._iqpilot_branch_beta_button.selected else IQPILOT_RELEASE_URL + self.state = SetupState.NETWORK_SETUP + self.stop_network_check_thread.clear() + self.start_network_check() + + def _download_failed_startover_button_callback(self): + self.state = SetupState.GETTING_STARTED + + def _network_setup_back_button_callback(self): + self.state = SetupState.SOFTWARE_SELECTION + + def _network_setup_continue_button_callback(self): + self.stop_network_check_thread.set() + if self._software_selection_iqpilot_button.selected: + self.download(self.iqpilot_url) + elif self._software_selection_openpilot_button.selected: + self.use_baked_installer() + else: + self.state = SetupState.CUSTOM_SOFTWARE + + def render_low_voltage(self, rect: rl.Rectangle): + rl.draw_texture(self.warning, int(rect.x + 150), int(rect.y + 110), rl.WHITE) + + self._low_voltage_title_label.render(rl.Rectangle(rect.x + 150, rect.y + 110 + 150 + 100, rect.width - 500 - 150, TITLE_FONT_SIZE * FONT_SCALE)) + self._low_voltage_body_label.render(rl.Rectangle(rect.x + 150, rect.y + 110 + 150 + 150, rect.width - 500, BODY_FONT_SIZE * FONT_SCALE * 3)) + + button_width = (rect.width - MARGIN * 3) / 2 + button_y = rect.height - MARGIN - BUTTON_HEIGHT + self._low_voltage_poweroff_button.render(rl.Rectangle(rect.x + MARGIN, button_y, button_width, BUTTON_HEIGHT)) + self._low_voltage_continue_button.render(rl.Rectangle(rect.x + MARGIN * 2 + button_width, button_y, button_width, BUTTON_HEIGHT)) + + def render_getting_started(self, rect: rl.Rectangle): + self._getting_started_title_label.render(rl.Rectangle(rect.x + 165, rect.y + 280, rect.width - 265, TITLE_FONT_SIZE * FONT_SCALE)) + self._getting_started_body_label.render(rl.Rectangle(rect.x + 165, rect.y + 280 + TITLE_FONT_SIZE * FONT_SCALE, rect.width - 500, + BODY_FONT_SIZE * FONT_SCALE * 3)) + + btn_rect = rl.Rectangle(rect.width - NEXT_BUTTON_WIDTH, 0, NEXT_BUTTON_WIDTH, rect.height) + self._getting_started_button.render(btn_rect) + triangle = gui_app.texture("images/button_continue_triangle.png", 54, int(btn_rect.height)) + rl.draw_texture_v(triangle, rl.Vector2(btn_rect.x + btn_rect.width / 2 - triangle.width / 2, btn_rect.height / 2 - triangle.height / 2), rl.WHITE) + + def check_network_connectivity(self): + while not self.stop_network_check_thread.is_set(): + if self.state == SetupState.NETWORK_SETUP: + try: + urllib.request.urlopen(NETWORK_CHECK_URL, timeout=2) + self.network_connected.set() + if NetworkType is not None and HARDWARE.get_network_type() == NetworkType.wifi: + self.wifi_connected.set() + else: + self.wifi_connected.clear() + except Exception: + self.network_connected.clear() + time.sleep(1) + + def start_network_check(self): + if self.network_check_thread is None or not self.network_check_thread.is_alive(): + self.network_check_thread = threading.Thread(target=self.check_network_connectivity, daemon=True) + self.network_check_thread.start() + + def close(self): + if self.network_check_thread is not None: + self.stop_network_check_thread.set() + self.network_check_thread.join() + + def render_network_setup(self, rect: rl.Rectangle): + self._network_setup_title_label.render(rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - MARGIN * 2, TITLE_FONT_SIZE * FONT_SCALE)) + + wifi_rect = rl.Rectangle(rect.x + MARGIN, rect.y + TITLE_FONT_SIZE * FONT_SCALE + MARGIN + 25, rect.width - MARGIN * 2, + rect.height - TITLE_FONT_SIZE * FONT_SCALE - 25 - BUTTON_HEIGHT - MARGIN * 3) + rl.draw_rectangle_rounded(wifi_rect, 0.05, 10, rl.Color(51, 51, 51, 255)) + wifi_content_rect = rl.Rectangle(wifi_rect.x + MARGIN, wifi_rect.y, wifi_rect.width - MARGIN * 2, wifi_rect.height) + self.wifi_ui.render(wifi_content_rect) + + button_width = (rect.width - BUTTON_SPACING - MARGIN * 2) / 2 + button_y = rect.height - BUTTON_HEIGHT - MARGIN + + self._network_setup_back_button.render(rl.Rectangle(rect.x + MARGIN, button_y, button_width, BUTTON_HEIGHT)) + + # Check network connectivity status + continue_enabled = self.network_connected.is_set() + self._network_setup_continue_button.set_enabled(continue_enabled) + continue_text = ("Continue" if self.wifi_connected.is_set() else "Continue without Wi-Fi") if continue_enabled else "Waiting for internet" + self._network_setup_continue_button.set_text(continue_text) + self._network_setup_continue_button.render(rl.Rectangle(rect.x + MARGIN + button_width + BUTTON_SPACING, button_y, button_width, BUTTON_HEIGHT)) + + def render_software_selection(self, rect: rl.Rectangle): + self._software_selection_title_label.render(rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - MARGIN * 2, TITLE_FONT_SIZE * FONT_SCALE)) + + # three options need to fit above the bottom buttons, so they're shorter than the stock two-option layout + radio_height = 185 + radio_spacing = 25 + + self._software_selection_continue_button.set_enabled(False) + + base_y = rect.y + TITLE_FONT_SIZE * FONT_SCALE + MARGIN * 2 + + # each radio is rendered, then immediately enforces single-selection by clearing the others; + # because each button processes its own tap during render(), the just-tapped radio always wins + iqpilot_rect = rl.Rectangle(rect.x + MARGIN, base_y, rect.width - MARGIN * 2, radio_height) + self._software_selection_iqpilot_button.render(iqpilot_rect) + if self._software_selection_iqpilot_button.selected: + self._software_selection_continue_button.set_enabled(True) + self._software_selection_openpilot_button.selected = False + self._software_selection_custom_software_button.selected = False + + openpilot_rect = rl.Rectangle(rect.x + MARGIN, base_y + (radio_height + radio_spacing), rect.width - MARGIN * 2, radio_height) + self._software_selection_openpilot_button.render(openpilot_rect) + if self._software_selection_openpilot_button.selected: + self._software_selection_continue_button.set_enabled(True) + self._software_selection_iqpilot_button.selected = False + self._software_selection_custom_software_button.selected = False + + custom_rect = rl.Rectangle(rect.x + MARGIN, base_y + 2 * (radio_height + radio_spacing), rect.width - MARGIN * 2, radio_height) + self._software_selection_custom_software_button.render(custom_rect) + if self._software_selection_custom_software_button.selected: + self._software_selection_continue_button.set_enabled(True) + self._software_selection_iqpilot_button.selected = False + self._software_selection_openpilot_button.selected = False + + button_width = (rect.width - BUTTON_SPACING - MARGIN * 2) / 2 + button_y = rect.height - BUTTON_HEIGHT - MARGIN + + self._software_selection_back_button.render(rl.Rectangle(rect.x + MARGIN, button_y, button_width, BUTTON_HEIGHT)) + self._software_selection_continue_button.render(rl.Rectangle(rect.x + MARGIN + button_width + BUTTON_SPACING, button_y, button_width, BUTTON_HEIGHT)) + + def render_iqpilot_branch_selection(self, rect: rl.Rectangle): + self._iqpilot_branch_title_label.render(rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - MARGIN * 2, TITLE_FONT_SIZE * FONT_SCALE)) + + radio_height = 230 + radio_spacing = 30 + + self._iqpilot_branch_continue_button.set_enabled(False) + + base_y = rect.y + TITLE_FONT_SIZE * FONT_SCALE + MARGIN * 2 + + beta_rect = rl.Rectangle(rect.x + MARGIN, base_y, rect.width - MARGIN * 2, radio_height) + self._iqpilot_branch_beta_button.render(beta_rect) + if self._iqpilot_branch_beta_button.selected: + self._iqpilot_branch_continue_button.set_enabled(True) + self._iqpilot_branch_release_button.selected = False + + release_rect = rl.Rectangle(rect.x + MARGIN, base_y + (radio_height + radio_spacing), rect.width - MARGIN * 2, radio_height) + self._iqpilot_branch_release_button.render(release_rect) + if self._iqpilot_branch_release_button.selected: + self._iqpilot_branch_continue_button.set_enabled(True) + self._iqpilot_branch_beta_button.selected = False + + button_width = (rect.width - BUTTON_SPACING - MARGIN * 2) / 2 + button_y = rect.height - BUTTON_HEIGHT - MARGIN + + self._iqpilot_branch_back_button.render(rl.Rectangle(rect.x + MARGIN, button_y, button_width, BUTTON_HEIGHT)) + self._iqpilot_branch_continue_button.render(rl.Rectangle(rect.x + MARGIN + button_width + BUTTON_SPACING, button_y, button_width, BUTTON_HEIGHT)) + + def render_downloading(self, rect: rl.Rectangle): + self._downloading_body_label.render(rl.Rectangle(rect.x, rect.y + rect.height / 2 - TITLE_FONT_SIZE * FONT_SCALE / 2, rect.width, + TITLE_FONT_SIZE * FONT_SCALE)) + + def render_download_failed(self, rect: rl.Rectangle): + self._download_failed_title_label.render(rl.Rectangle(rect.x + 117, rect.y + 185, rect.width - 117, TITLE_FONT_SIZE * FONT_SCALE)) + self._download_failed_url_label.set_text(self.failed_url) + self._download_failed_url_label.render(rl.Rectangle(rect.x + 117, rect.y + 185 + TITLE_FONT_SIZE * FONT_SCALE + 67, rect.width - 117 - 100, 64)) + + self._download_failed_body_label.set_text(self.failed_reason) + self._download_failed_body_label.render(rl.Rectangle(rect.x + 117, rect.y, rect.width - 117 - 100, rect.height)) + + button_width = (rect.width - BUTTON_SPACING - MARGIN * 2) / 2 + button_y = rect.height - BUTTON_HEIGHT - MARGIN + self._download_failed_reboot_button.render(rl.Rectangle(rect.x + MARGIN, button_y, button_width, BUTTON_HEIGHT)) + self._download_failed_startover_button.render(rl.Rectangle(rect.x + MARGIN + button_width + BUTTON_SPACING, button_y, button_width, BUTTON_HEIGHT)) + + def render_custom_software_warning(self, rect: rl.Rectangle): + warn_rect = rl.Rectangle(rect.x, rect.y, rect.width, 1500) + offset = self._custom_software_warning_body_scroll_panel.update(rect, warn_rect) + + button_width = (rect.width - MARGIN * 3) / 2 + button_y = rect.height - MARGIN - BUTTON_HEIGHT + + rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(button_y - BODY_FONT_SIZE * FONT_SCALE)) + y_offset = rect.y + offset + self._custom_software_warning_title_label.render(rl.Rectangle(rect.x + 50, y_offset + 150, rect.width - 265, TITLE_FONT_SIZE * FONT_SCALE)) + self._custom_software_warning_body_label.render(rl.Rectangle(rect.x + 50, y_offset + 400, rect.width - 50, BODY_FONT_SIZE * FONT_SCALE * 3)) + rl.end_scissor_mode() + + self._custom_software_warning_back_button.render(rl.Rectangle(rect.x + MARGIN, button_y, button_width, BUTTON_HEIGHT)) + self._custom_software_warning_continue_button.render(rl.Rectangle(rect.x + MARGIN * 2 + button_width, button_y, button_width, BUTTON_HEIGHT)) + if offset < (rect.height - warn_rect.height): + self._custom_software_warning_continue_button.set_enabled(True) + self._custom_software_warning_continue_button.set_text("Continue") + + def render_custom_software(self): + def handle_keyboard_result(result): + # Enter pressed + if result == 1: + url = self.keyboard.text + self.keyboard.clear() + if url: + self.download(url) + + # Cancel pressed + elif result == 0: + self.state = SetupState.SOFTWARE_SELECTION + + self.keyboard.reset(min_text_size=1) + self.keyboard.set_title("Enter URL", "for Custom Software") + gui_app.set_modal_overlay(self.keyboard, callback=handle_keyboard_result) + + def use_openpilot(self): + if os.path.isdir(INSTALL_PATH) and os.path.isfile(VALID_CACHE_PATH): + os.remove(VALID_CACHE_PATH) + with open(TMP_CONTINUE_PATH, "w") as f: + f.write(CONTINUE) + run_cmd(["chmod", "+x", TMP_CONTINUE_PATH]) + shutil.move(TMP_CONTINUE_PATH, CONTINUE_PATH) + shutil.copyfile(INSTALLER_SOURCE_PATH, INSTALLER_DESTINATION_PATH) + + # give time for installer UI to take over + time.sleep(0.1) + gui_app.request_close() + else: + self.state = SetupState.NETWORK_SETUP + self.stop_network_check_thread.clear() + self.start_network_check() + + def use_baked_installer(self): + # /usr/comma/installer is the local DRM "magic" installer (clones commaai/openpilot); comma's + # downloaded Wayland installer can't initialize a display on IQ.OS, so always use the baked one. + shutil.copyfile(INSTALLER_SOURCE_PATH, INSTALLER_DESTINATION_PATH) + + # give time for installer UI to take over + time.sleep(0.1) + gui_app.request_close() + + def download(self, url: str): + self.state = SetupState.DOWNLOADING + + # "/" maps to a GitHub fork (e.g. IQLvbs/release-new). Clone it directly here + # rather than fetching comma's Wayland installer, which can't run on IQ.OS's DRM compositor. + match = re.match(r"^([^/.]+)/([^/]+)$", url) + if match: + user, branch = match.group(1), match.group(2) + self.download_url = f"{user}/{branch}" + self.download_thread = threading.Thread(target=self._fork_install_thread, args=(user, branch), daemon=True) + self.download_thread.start() + return + + parsed = urlparse(url, scheme='https') + self.download_url = (urlparse(f"https://{url}") if not parsed.netloc else parsed).geturl() + + self.download_thread = threading.Thread(target=self._download_thread, daemon=True) + self.download_thread.start() + + def _ble_progress(self, state: str, percent: int = 0): + # Mirror install milestones to a phone driving setup over BLE so it can track + # the flow and hand off to Phase B. Best-effort — no-op without a BLE session. + if self.ble_setup is not None: + try: + self.ble_setup.set_install_progress(state, percent) + except Exception: + pass + + def _write_setup_claim(self): + ble = self.ble_setup + if ble is None or not getattr(ble, "phone_active", False): + return + try: + import hashlib + claim_id = hashlib.sha256(f"k3setup-claim:v1:{ble.code}:{ble.serial}".encode()).hexdigest() + with open("/data/setup_claim_id", "w") as f: + f.write(claim_id) + except Exception: + pass + + def _fork_install_thread(self, user: str, branch: str): + git_url = GIT_URL_OVERRIDES.get(user) or GITHUB_FORK_URL.format(user=user) + label = f"{user}/{branch}" + fail_msg = "Ensure the entered URL is valid, and the device's internet connection is good." + try: + subprocess.run(["rm", "-rf", TMP_INSTALL_PATH], check=False) + + self._ble_progress("downloading", 10) + clone = subprocess.run(["git", "clone", "--depth=1", + "-b", branch, git_url, TMP_INSTALL_PATH]) + if clone.returncode != 0: + self._ble_progress("failed") + self.download_failed(label, "No custom software found at this URL.") + return + + self._ble_progress("downloading", 70) + subprocess.run(["git", "-C", TMP_INSTALL_PATH, "reset", "--hard", f"origin/{branch}"], check=True) + + run_cmd(["rm", "-f", VALID_CACHE_PATH]) + # sudo: a prior *run* install can leave root-owned .pyc here that a comma-user rm can't delete. + run_cmd(["sudo", "rm", "-rf", INSTALL_PATH]) + run_cmd(["mv", TMP_INSTALL_PATH, INSTALL_PATH]) + + self._ble_progress("installing", 90) + + # If the chosen channel targets a newer IQ.OS than we're running, flash it + # BEFORE writing continue.sh so the single reboot lands on a compatible OS. + if not self._maybe_update_os(label): + return + + self._write_setup_claim() + + with open(TMP_CONTINUE_PATH, "w") as f: + f.write(CONTINUE) + run_cmd(["chmod", "+x", TMP_CONTINUE_PATH]) + shutil.move(TMP_CONTINUE_PATH, CONTINUE_PATH) + + with open(INSTALLER_URL_PATH, "w") as f: + f.write(label) + + # comma.sh blocks waiting for /tmp/installer before it checks for continue.sh; the real + # install is already done above, so drop a no-op installer to let it proceed and launch. + with open(INSTALLER_DESTINATION_PATH, "w") as f: + f.write("#!/bin/sh\nexit 0\n") + run_cmd(["chmod", "+x", INSTALLER_DESTINATION_PATH]) + + # Tell the phone we're about to reboot into the installed fork so it can + # switch to Phase B; give the event a moment to flush before the link drops. + self._ble_progress("rebooting", 100) + time.sleep(0.4) + gui_app.request_close() + except Exception: + self._ble_progress("failed") + self.download_failed(label, fail_msg) + + def _maybe_update_os(self, label: str) -> bool: + # The freshly-installed fork pins the IQ.OS it needs in launch_env.sh. If it + # differs from what we're running, flash it now (via comma's agnos.py) so the + # upcoming single reboot lands on a compatible OS instead of dead-ending on + # "update required". Returns False (and shows Download Failed) on abort. + from iqpilot.system.ui.lib.os_update import os_update_needed, run_agnos_update + try: + needed, current, required = os_update_needed(INSTALL_PATH) + except Exception: + return True # never block an install on a version-check failure + if not needed: + return True + + ble = self.ble_setup + # When a phone is driving setup, require it to confirm the OS update. With no + # phone (on-screen-only install) proceed automatically — the fork requires it. + if ble is not None and getattr(ble, "phone_active", False): + ble.os_update.request(current, required) + ble.set_install_progress("os_update_required", 0, os_from=current, os_to=required) + if not ble.os_update.wait_for_confirm(timeout=300): + ble.set_install_progress("failed", error="os_update_not_confirmed") + self.download_failed(label, f"IQ.OS update to {required} was not confirmed.") + return False + + def _cb(pct: int, note: str): + if ble is not None: + ble.set_install_progress("os_updating", pct, error=note, os_from=current, os_to=required) + + if not run_agnos_update(INSTALL_PATH, HARDWARE.get_device_type(), _cb): + if ble is not None: + ble.set_install_progress("failed", error="os_update_failed") + self.download_failed(label, f"IQ.OS update to {required} failed. Please try again.") + return False + return True + + def _download_thread(self): + try: + import tempfile + + fd, tmpfile = tempfile.mkstemp(prefix="installer_") + + headers = {"User-Agent": USER_AGENT, + "X-openpilot-serial": HARDWARE.get_serial(), + "X-openpilot-device-type": HARDWARE.get_device_type()} + req = urllib.request.Request(self.download_url, headers=headers) + + with open(tmpfile, 'wb') as f, urllib.request.urlopen(req, timeout=30) as response: + total_size = int(response.headers.get('content-length', 0)) + downloaded = 0 + block_size = 8192 + + while True: + buffer = response.read(block_size) + if not buffer: + break + + downloaded += len(buffer) + f.write(buffer) + + if total_size: + self.download_progress = int(downloaded * 100 / total_size) + + is_elf = False + with open(tmpfile, 'rb') as f: + header = f.read(4) + is_elf = header == b'\x7fELF' + + if not is_elf: + self.download_failed(self.download_url, "No custom software found at this URL.") + return + + # AGNOS might try to execute the installer before this process exits. + # Therefore, important to close the fd before renaming the installer. + os.close(fd) + # comma's ELF installer does `rm -rf /data/openpilot` as the comma user and asserts it + # succeeds; a prior *run* install leaves root-owned __pycache__ .pyc it can't delete, so it + # aborts before continue.sh and bounces back to setup. Clear the old tree first (sudo) so the + # installer's rm succeeds. + subprocess.run(["sudo", "rm", "-rf", INSTALL_PATH], check=False) + os.rename(tmpfile, INSTALLER_DESTINATION_PATH) + + with open(INSTALLER_URL_PATH, "w") as f: + f.write(self.download_url) + + # give time for installer UI to take over + time.sleep(0.1) + gui_app.request_close() + + except urllib.error.HTTPError as e: + if e.code == 409: + error_msg = e.read().decode("utf-8") + self.download_failed(self.download_url, error_msg) + except Exception: + error_msg = "Ensure the entered URL is valid, and the device's internet connection is good." + self.download_failed(self.download_url, error_msg) + + def download_failed(self, url: str, reason: str): + self.failed_url = url + self.failed_reason = reason + self.state = SetupState.DOWNLOAD_FAILED + + +def main(): + try: + gui_app.init_window("Setup", 20) + setup = Setup() + for should_render in gui_app.render(): + if should_render: + setup.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + setup.close() + except Exception as e: + print(f"Setup error: {e}") + finally: + gui_app.close() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/tici_updater.py b/iqpilot/system/ui/tici_updater.py new file mode 100755 index 000000000..8a4a443fb --- /dev/null +++ b/iqpilot/system/ui/tici_updater.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +import sys +import subprocess +import threading +import pyray as rl +from enum import IntEnum + +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE +from iqpilot.system.ui.lib.wifi_manager import WifiManager +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.widgets.label import gui_text_box, gui_label +from iqpilot.system.ui.widgets.network import WifiManagerUI + +# Constants +MARGIN = 50 +BUTTON_HEIGHT = 160 +BUTTON_WIDTH = 400 +PROGRESS_BAR_HEIGHT = 72 +TITLE_FONT_SIZE = 80 +BODY_FONT_SIZE = 65 +BACKGROUND_COLOR = rl.BLACK +PROGRESS_BG_COLOR = rl.Color(41, 41, 41, 255) +PROGRESS_COLOR = rl.Color(54, 77, 239, 255) + + +class Screen(IntEnum): + PROMPT = 0 + WIFI = 1 + PROGRESS = 2 + + +class Updater(Widget): + def __init__(self, updater_path, manifest_path): + super().__init__() + self.updater = updater_path + self.manifest = manifest_path + self.current_screen = Screen.PROMPT + + self.progress_value = 0 + self.progress_text = "Loading..." + self.show_reboot_button = False + self.process = None + self.update_thread = None + self.wifi_manager_ui = WifiManagerUI(WifiManager()) + + # Buttons + self._wifi_button = Button("Connect to Wi-Fi", click_callback=lambda: self.set_current_screen(Screen.WIFI)) + self._install_button = Button("Install", click_callback=self.install_update, button_style=ButtonStyle.PRIMARY) + self._back_button = Button("Back", click_callback=lambda: self.set_current_screen(Screen.PROMPT)) + self._reboot_button = Button("Reboot", click_callback=lambda: HARDWARE.reboot()) + + def set_current_screen(self, screen: Screen): + self.current_screen = screen + + def install_update(self): + self.set_current_screen(Screen.PROGRESS) + self.progress_value = 0 + self.progress_text = "Downloading..." + self.show_reboot_button = False + + # Start the update process in a separate thread + self.update_thread = threading.Thread(target=self._run_update_process) + self.update_thread.daemon = True + self.update_thread.start() + + def _run_update_process(self): + # TODO: just import it and run in a thread without a subprocess + cmd = [self.updater, "--swap", self.manifest] + self.process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + text=True, bufsize=1, universal_newlines=True) + + if self.process.stdout is not None: + for line in self.process.stdout: + parts = line.strip().split(":") + if len(parts) == 2: + self.progress_text = parts[0] + try: + self.progress_value = int(float(parts[1])) + except ValueError: + pass + + exit_code = self.process.wait() + if exit_code == 0: + HARDWARE.reboot() + else: + self.progress_text = "Update failed" + self.show_reboot_button = True + + def render_prompt_screen(self, rect: rl.Rectangle): + # Title + title_rect = rl.Rectangle(MARGIN + 50, 250, rect.width - MARGIN * 2 - 100, TITLE_FONT_SIZE * FONT_SCALE) + gui_label(title_rect, "Update Required", TITLE_FONT_SIZE, font_weight=FontWeight.BOLD) + + # Description + desc_text = ("An operating system update is required. Connect your device to Wi-Fi for the fastest update experience. " + + "The download size is approximately 1GB.") + + desc_rect = rl.Rectangle(MARGIN + 50, 250 + TITLE_FONT_SIZE * FONT_SCALE + 75, rect.width - MARGIN * 2 - 100, BODY_FONT_SIZE * FONT_SCALE * 4) + gui_text_box(desc_rect, desc_text, BODY_FONT_SIZE) + + # Buttons at the bottom + button_y = rect.height - MARGIN - BUTTON_HEIGHT + button_width = (rect.width - MARGIN * 3) // 2 + + # WiFi button + wifi_button_rect = rl.Rectangle(MARGIN, button_y, button_width, BUTTON_HEIGHT) + self._wifi_button.render(wifi_button_rect) + + # Install button + install_button_rect = rl.Rectangle(MARGIN * 2 + button_width, button_y, button_width, BUTTON_HEIGHT) + self._install_button.render(install_button_rect) + + def render_wifi_screen(self, rect: rl.Rectangle): + # Draw the Wi-Fi manager UI + wifi_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - MARGIN * 2, + rect.height - BUTTON_HEIGHT - MARGIN * 3) + rl.draw_rectangle_rounded(wifi_rect, 0.035, 10, rl.Color(51, 51, 51, 255)) + wifi_content_rect = rl.Rectangle(wifi_rect.x + 50, wifi_rect.y, wifi_rect.width - 100, wifi_rect.height) + self.wifi_manager_ui.render(wifi_content_rect) + + back_button_rect = rl.Rectangle(MARGIN, rect.height - MARGIN - BUTTON_HEIGHT, BUTTON_WIDTH, BUTTON_HEIGHT) + self._back_button.render(back_button_rect) + + def render_progress_screen(self, rect: rl.Rectangle): + title_rect = rl.Rectangle(MARGIN + 100, 330, rect.width - MARGIN * 2 - 200, 100) + gui_label(title_rect, self.progress_text, 90, font_weight=FontWeight.SEMI_BOLD) + + # Progress bar + bar_rect = rl.Rectangle(MARGIN + 100, 330 + 100 + 100, rect.width - MARGIN * 2 - 200, PROGRESS_BAR_HEIGHT) + rl.draw_rectangle_rounded(bar_rect, 0.5, 10, PROGRESS_BG_COLOR) + + # Calculate the width of the progress chunk + progress_width = (bar_rect.width * self.progress_value) / 100 + if progress_width > 0: + progress_rect = rl.Rectangle(bar_rect.x, bar_rect.y, progress_width, bar_rect.height) + rl.draw_rectangle_rounded(progress_rect, 0.5, 10, PROGRESS_COLOR) + + # Show reboot button if needed + if self.show_reboot_button: + reboot_rect = rl.Rectangle(MARGIN + 100, rect.height - MARGIN - BUTTON_HEIGHT, BUTTON_WIDTH, BUTTON_HEIGHT) + self._reboot_button.render(reboot_rect) + + def _render(self, rect: rl.Rectangle): + if self.current_screen == Screen.PROMPT: + self.render_prompt_screen(rect) + elif self.current_screen == Screen.WIFI: + self.render_wifi_screen(rect) + elif self.current_screen == Screen.PROGRESS: + self.render_progress_screen(rect) + + +def main(): + if len(sys.argv) < 3: + print("Usage: updater.py ") + sys.exit(1) + + updater_path = sys.argv[1] + manifest_path = sys.argv[2] + + try: + gui_app.init_window("System Update") + updater = Updater(updater_path, manifest_path) + for should_render in gui_app.render(): + if should_render: + updater.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + finally: + # Make sure we clean up even if there's an error + gui_app.close() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/updater.py b/iqpilot/system/ui/updater.py new file mode 100755 index 000000000..b65584138 --- /dev/null +++ b/iqpilot/system/ui/updater.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +from iqpilot.system.ui.lib.application import gui_app +import iqpilot.system.ui.tici_updater as tici_updater +import iqpilot.system.ui.mici_updater as mici_updater + + +def main(): + if gui_app.big_ui(): + tici_updater.main() + else: + mici_updater.main() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/widgets/__init__.py b/iqpilot/system/ui/widgets/__init__.py new file mode 100644 index 000000000..40aa6f04b --- /dev/null +++ b/iqpilot/system/ui/widgets/__init__.py @@ -0,0 +1,461 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from __future__ import annotations + +import abc +import math +import pyray as rl +from enum import IntEnum +from typing import TypeVar +from collections.abc import Callable +from iqpilot.common.filter_simple import BounceFilter, FirstOrderFilter +from iqpilot.system.ui.lib.application import gui_app, MousePos, MAX_TOUCH_SLOTS, MouseEvent + +W = TypeVar('W', bound='Widget') + +_device = None + + +def device_awake() -> bool: + global _device + if _device is None: + try: + from iqpilot.selfdrive.ui.ui_state import device + _device = device + except Exception: + return True + return _device.awake + + +class DialogResult(IntEnum): + CANCEL = 0 + CONFIRM = 1 + NO_ACTION = -1 + + +class Widget(abc.ABC): + def __init__(self): + self._rect: rl.Rectangle = rl.Rectangle(0, 0, 0, 0) + self._parent_rect: rl.Rectangle | None = None + self.__is_pressed = [False] * MAX_TOUCH_SLOTS + # if current mouse/touch down started within the widget's rectangle + self.__tracking_is_pressed = [False] * MAX_TOUCH_SLOTS + self._enabled: bool | Callable[[], bool] = True + self._is_visible: bool | Callable[[], bool] = True + self._touch_valid_callback: Callable[[], bool] | None = None + self._click_callback: Callable[[], None] | None = None + self._multi_touch = False + self.__was_awake = True + self._children: list[Widget] = [] + self._click_delay: float | None = None + self._click_release_time: float | None = None + + def _child(self, widget: W) -> W: + """Register a widget as a child for show/hide lifecycle propagation. Returns the widget.""" + assert widget not in self._children + self._children.append(widget) + return widget + + @property + def rect(self) -> rl.Rectangle: + return self._rect + + def set_rect(self, rect: rl.Rectangle) -> None: + changed = (self._rect.x != rect.x or self._rect.y != rect.y or + self._rect.width != rect.width or self._rect.height != rect.height) + self._rect = rect + if changed: + self._update_layout_rects() + + def set_parent_rect(self, parent_rect: rl.Rectangle) -> None: + """Can be used like size hint in QT""" + self._parent_rect = parent_rect + + @property + def is_pressed(self) -> bool: + return any(self.__is_pressed) or self._click_release_time is not None + + @property + def enabled(self) -> bool: + return self._enabled() if callable(self._enabled) else self._enabled + + def set_enabled(self, enabled: bool | Callable[[], bool]) -> None: + self._enabled = enabled + + @property + def is_visible(self) -> bool: + return self._is_visible() if callable(self._is_visible) else self._is_visible + + def set_visible(self, visible: bool | Callable[[], bool]) -> None: + self._is_visible = visible + + def set_click_callback(self, click_callback: Callable[[], None] | None) -> None: + """Set a callback to be called when the widget is clicked.""" + self._click_callback = click_callback + + def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: + """Set a callback to determine if the widget can be clicked.""" + self._touch_valid_callback = touch_callback + + def _touch_valid(self) -> bool: + """Check if the widget can be touched.""" + return self._touch_valid_callback() if self._touch_valid_callback else True + + def set_position(self, x: float, y: float) -> None: + changed = (self._rect.x != x or self._rect.y != y) + self._rect = rl.Rectangle(x, y, self._rect.width, self._rect.height) + if changed: + self._update_layout_rects() + + @property + def _hit_rect(self) -> rl.Rectangle: + # restrict touches to within parent rect if set, useful inside Scroller + if self._parent_rect is None: + return self._rect + return rl.get_collision_rec(self._rect, self._parent_rect) + + def render(self, rect: rl.Rectangle | None = None) -> bool | int | None: + if rect is not None: + self.set_rect(rect) + + if self._click_release_time is not None and rl.get_time() >= self._click_release_time: + self._click_release_time = None + + self._update_state() + + if not self.is_visible: + return None + + self._layout() + ret = self._render(self._rect) + + # Keep track of whether mouse down started within the widget's rectangle + if self.enabled and self.__was_awake: + self._process_mouse_events() + else: + # Drop any in-flight press tracking when disabled (e.g. covered by a pushed widget), so a + # stale press doesn't fire when re-enabled (upstream #37094). + # TODO: ideally we emit release events when going disabled + self.__is_pressed = [False] * MAX_TOUCH_SLOTS + self.__tracking_is_pressed = [False] * MAX_TOUCH_SLOTS + + self.__was_awake = device_awake() + + return ret + + def _process_mouse_events(self) -> None: + hit_rect = self._hit_rect + touch_valid = self._touch_valid() + + for mouse_event in gui_app.mouse_events: + if not self._multi_touch and mouse_event.slot != 0: + continue + + mouse_in_rect = rl.check_collision_point_rec(mouse_event.pos, hit_rect) + # Ignores touches/presses that start outside our rect + # Allows touch to leave the rect and come back in focus if mouse did not release + if mouse_event.left_pressed and touch_valid: + if mouse_in_rect: + self._handle_mouse_press(mouse_event.pos) + self.__is_pressed[mouse_event.slot] = True + self.__tracking_is_pressed[mouse_event.slot] = True + self._handle_mouse_event(mouse_event) + + # Callback such as scroll panel signifies user is scrolling + elif not touch_valid: + self.__is_pressed[mouse_event.slot] = False + self.__tracking_is_pressed[mouse_event.slot] = False + + elif mouse_event.left_released: + self._handle_mouse_event(mouse_event) + if self.__is_pressed[mouse_event.slot] and mouse_in_rect: + self._handle_mouse_release(mouse_event.pos) + self.__is_pressed[mouse_event.slot] = False + self.__tracking_is_pressed[mouse_event.slot] = False + + # Mouse/touch is still within our rect + elif mouse_in_rect: + if self.__tracking_is_pressed[mouse_event.slot]: + self.__is_pressed[mouse_event.slot] = True + self._handle_mouse_event(mouse_event) + + # Mouse/touch left our rect but may come back into focus later + elif not mouse_in_rect: + self.__is_pressed[mouse_event.slot] = False + self._handle_mouse_event(mouse_event) + + def _layout(self) -> None: + """Optionally lay out child widgets separately. This is called before rendering.""" + + def _update_state(self): + """Optionally update the widget's non-layout state. This is called before rendering.""" + + @abc.abstractmethod + def _render(self, rect: rl.Rectangle) -> bool | int | None: + """Render the widget within the given rectangle.""" + + def _update_layout_rects(self) -> None: + """Optionally update any layout rects on Widget rect change.""" + + def _handle_mouse_press(self, mouse_pos: MousePos) -> None: + """Optionally handle mouse press events.""" + + def _handle_mouse_release(self, mouse_pos: MousePos) -> None: + """Optionally handle mouse release events.""" + if self._click_delay is not None: + self._click_release_time = rl.get_time() + self._click_delay + if self._click_callback: + self._click_callback() + + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + """Optionally handle mouse events. This is called before rendering.""" + # Default implementation does nothing, can be overridden by subclasses + + def show_event(self): + """Optionally handle show event. Parent must manually call this. Propagates to registered children.""" + for child in self._children: + child.show_event() + + def hide_event(self): + """Optionally handle hide event. Parent must manually call this. Propagates to registered children.""" + for child in self._children: + child.hide_event() + + def dismiss(self, callback: Callable[[], None] | None = None): + """Pop this widget off the nav stack, then run the callback. Overridden by NavWidget for animation.""" + gui_app.pop_widget() + if callback is not None: + callback() + + +SWIPE_AWAY_THRESHOLD = 80 # px to dismiss after releasing +START_DISMISSING_THRESHOLD = 40 # px to start dismissing while dragging +BLOCK_SWIPE_AWAY_THRESHOLD = 60 # px horizontal movement to block swipe away + +NAV_BAR_MARGIN = 6 +NAV_BAR_WIDTH = 205 +NAV_BAR_HEIGHT = 8 +EDGE_SHADOW_HEIGHT = 20 + +DISMISS_PUSH_OFFSET = 50 + NAV_BAR_MARGIN + NAV_BAR_HEIGHT # px extra to push down when dismissing +DISMISS_TIME_SECONDS = 1.5 + + +class NavBar(Widget): + def __init__(self): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, NAV_BAR_WIDTH, NAV_BAR_HEIGHT)) + self._alpha = 1.0 + self._alpha_filter = FirstOrderFilter(1.0, 0.1, 1 / gui_app.target_fps) + self._fade_time = 0.0 + + def set_alpha(self, alpha: float) -> None: + self._alpha = alpha + self._fade_time = rl.get_time() + + def show_event(self): + super().show_event() + self._alpha = 1.0 + self._alpha_filter.x = 1.0 + self._fade_time = rl.get_time() + + def _render(self, _): + if rl.get_time() - self._fade_time > DISMISS_TIME_SECONDS: + self._alpha = 0.0 + alpha = self._alpha_filter.update(self._alpha) + + # white bar with black border + rl.draw_rectangle_rounded(self._rect, 1.0, 6, rl.Color(255, 255, 255, int(255 * 0.9 * alpha))) + rl.draw_rectangle_rounded_lines_ex(self._rect, 1.0, 6, 2, rl.Color(0, 0, 0, int(255 * 0.3 * alpha))) + + +class NavWidget(Widget, abc.ABC): + """ + A full screen widget that supports back navigation by swiping down from the top. + """ + BACK_TOUCH_AREA_PERCENTAGE = 0.65 + + def __init__(self): + super().__init__() + self._back_callback: Callable[[], None] | None = None + self._back_button_start_pos: MousePos | None = None + self._swiping_away = False # currently swiping away + self._can_swipe_away = True # swipe away is blocked after certain horizontal movement + + self._pos_filter = BounceFilter(0.0, 0.1, 1 / gui_app.target_fps, bounce=1) + self._playing_dismiss_animation = False + self._trigger_animate_in = False + self._back_enabled: bool | Callable[[], bool] = True + self._nav_bar = NavBar() + + self._nav_bar_y_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + + self._set_up = False + + @property + def back_enabled(self) -> bool: + return self._back_enabled() if callable(self._back_enabled) else self._back_enabled + + def set_back_enabled(self, enabled: bool | Callable[[], bool]) -> None: + self._back_enabled = enabled + + def set_back_callback(self, callback: Callable[[], None]) -> None: + self._back_callback = callback + + def covers_below(self) -> bool: + # Skip the widgets underneath ONLY when fully settled at the top; during a swipe/dismiss/ + # slide-in render the page below so it shows through behind the moving page, like stock. + return (self._rect.y < 1.0 + and self._back_button_start_pos is None + and not self._playing_dismiss_animation + and abs(self._pos_filter.velocity.x) < 0.5) + + def settle_to_top(self) -> None: + # Snap to rest and clear any pending swipe/dismiss state. Called on cover/reveal so a + # drag-start captured just before this page was covered can't make it track the finger + # when it reappears (the disabled-cleanup in _update_state can't run while it's skipped). + self._pos_filter.x = 0.0 + self._pos_filter.velocity.x = 0.0 + self._back_button_start_pos = None + self._swiping_away = False + self._playing_dismiss_animation = False + self.set_position(self._rect.x, 0.0) + + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + super()._handle_mouse_event(mouse_event) + + if not self.back_enabled: + self._back_button_start_pos = None + self._swiping_away = False + self._can_swipe_away = True + return + + if mouse_event.left_pressed: + # user is able to swipe away if starting near top of screen, or anywhere if scroller is at top + self._pos_filter.update_alpha(0.04) + in_dismiss_area = mouse_event.pos.y < self._rect.height * self.BACK_TOUCH_AREA_PERCENTAGE + + scroller_at_top = False + vertical_scroller = False + # TODO: -20? snapping in WiFi dialog can make offset not be positive at the top + if hasattr(self, '_scroller'): + scroller_at_top = self._scroller.scroll_panel.get_offset() >= -20 and not self._scroller._horizontal + vertical_scroller = not self._scroller._horizontal + elif hasattr(self, '_scroll_panel'): + scroller_at_top = self._scroll_panel.get_offset() >= -20 and not self._scroll_panel._horizontal + vertical_scroller = not self._scroll_panel._horizontal + + # Vertical scrollers need to be at the top to swipe away to prevent erroneous swipes + if (not vertical_scroller and in_dismiss_area) or scroller_at_top: + self._can_swipe_away = True + self._back_button_start_pos = mouse_event.pos + + elif mouse_event.left_down: + if self._back_button_start_pos is not None: + # block swiping away if too much horizontal or upward movement + horizontal_movement = abs(mouse_event.pos.x - self._back_button_start_pos.x) > BLOCK_SWIPE_AWAY_THRESHOLD + upward_movement = mouse_event.pos.y - self._back_button_start_pos.y < -BLOCK_SWIPE_AWAY_THRESHOLD + if not self._swiping_away and (horizontal_movement or upward_movement): + self._can_swipe_away = False + self._back_button_start_pos = None + + # block horizontal swiping if now swiping away + if self._can_swipe_away: + if mouse_event.pos.y - self._back_button_start_pos.y > START_DISMISSING_THRESHOLD: + self._swiping_away = True + + elif mouse_event.left_released: + self._pos_filter.update_alpha(0.1) + # if far enough, trigger back navigation callback + if self._back_button_start_pos is not None: + if mouse_event.pos.y - self._back_button_start_pos.y > SWIPE_AWAY_THRESHOLD: + self._playing_dismiss_animation = True + + self._back_button_start_pos = None + self._swiping_away = False + + def _update_state(self): + super()._update_state() + + # Disable self's scroller while swiping away + if not self._set_up: + self._set_up = True + if hasattr(self, '_scroller'): + original_enabled = self._scroller._enabled + self._scroller.set_enabled(lambda: self.enabled and not self._swiping_away and (original_enabled() if callable(original_enabled) else + original_enabled)) + elif hasattr(self, '_scroll_panel'): + original_enabled = self._scroll_panel.enabled + self._scroll_panel.set_enabled(lambda: self.enabled and not self._swiping_away and (original_enabled() if callable(original_enabled) else + original_enabled)) + + if self._trigger_animate_in: + self._pos_filter.x = self._rect.height + self._nav_bar_y_filter.x = -NAV_BAR_MARGIN - NAV_BAR_HEIGHT + self._trigger_animate_in = False + + new_y = 0.0 + + if not self.enabled: + self._back_button_start_pos = None + + if self._back_button_start_pos is not None: + last_mouse_event = gui_app.last_mouse_event + # push entire widget as user drags it away + new_y = max(last_mouse_event.pos.y - self._back_button_start_pos.y, 0) + if new_y < SWIPE_AWAY_THRESHOLD: + new_y /= 2 # resistance until mouse release would dismiss widget + + if self._swiping_away: + self._nav_bar.set_alpha(1.0) + + if self._playing_dismiss_animation: + new_y = self._rect.height + DISMISS_PUSH_OFFSET + + new_y = round(self._pos_filter.update(new_y)) + if abs(new_y) < 1 and self._pos_filter.velocity.x == 0.0: + new_y = self._pos_filter.x = 0.0 + + if new_y > self._rect.height + DISMISS_PUSH_OFFSET - 10: + if self._back_callback is not None: + self._back_callback() + + self._playing_dismiss_animation = False + self._back_button_start_pos = None + self._swiping_away = False + + self.set_position(self._rect.x, new_y) + + def render(self, rect: rl.Rectangle | None = None) -> bool | int | None: + ret = super().render(rect) + + if self.back_enabled: + bar_x = self._rect.x + (self._rect.width - self._nav_bar.rect.width) / 2 + if self._back_button_start_pos is not None or self._playing_dismiss_animation: + self._nav_bar_y_filter.x = NAV_BAR_MARGIN + self._pos_filter.x + else: + self._nav_bar_y_filter.update(NAV_BAR_MARGIN) + + self._nav_bar.set_position(bar_x, round(self._nav_bar_y_filter.x)) + self._nav_bar.render() + + # draw black above widget when dismissing + if self._rect.y > 0: + shadow_height = EDGE_SHADOW_HEIGHT + shadow_y = max(math.floor(self._rect.y) - shadow_height, 0) + if shadow_y > 0: + rl.draw_rectangle(int(self._rect.x), 0, int(self._rect.width), shadow_y, rl.BLACK) + rl.draw_rectangle_gradient_v(int(self._rect.x), shadow_y, + int(self._rect.width), shadow_height + 1, + rl.BLANK, rl.Color(0, 0, 0, 204)) + + return ret + + def show_event(self): + super().show_event() + # FIXME: we don't know the height of the rect at first show_event since it's before the first render :( + # so we need this hacky bool for now + self._trigger_animate_in = True + self._nav_bar.show_event() diff --git a/iqpilot/system/ui/widgets/button.py b/iqpilot/system/ui/widgets/button.py new file mode 100644 index 000000000..4c370ff37 --- /dev/null +++ b/iqpilot/system/ui/widgets/button.py @@ -0,0 +1,303 @@ +from collections.abc import Callable +from enum import IntEnum + +import pyray as rl + +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import Label, UnifiedLabel +from iqpilot.common.filter_simple import FirstOrderFilter + + +class ButtonStyle(IntEnum): + NORMAL = 0 # Most common, neutral buttons + PRIMARY = 1 # For main actions + DANGER = 2 # For critical actions, like reboot or delete + TRANSPARENT = 3 # For buttons with transparent background and border + TRANSPARENT_WHITE_TEXT = 9 # For buttons with transparent background and border and white text + TRANSPARENT_WHITE_BORDER = 10 # For buttons with transparent background and white border and text + ACTION = 4 + LIST_ACTION = 5 # For list items with action buttons + NO_EFFECT = 6 + KEYBOARD = 7 + FORGET_WIFI = 8 + + +ICON_PADDING = 15 +DEFAULT_BUTTON_FONT_SIZE = 60 +ACTION_BUTTON_FONT_SIZE = 48 + +BUTTON_TEXT_COLOR = { + ButtonStyle.NORMAL: rl.Color(228, 228, 228, 255), + ButtonStyle.PRIMARY: rl.Color(228, 228, 228, 255), + ButtonStyle.DANGER: rl.Color(228, 228, 228, 255), + ButtonStyle.TRANSPARENT: rl.BLACK, + ButtonStyle.TRANSPARENT_WHITE_TEXT: rl.WHITE, + ButtonStyle.TRANSPARENT_WHITE_BORDER: rl.Color(228, 228, 228, 255), + ButtonStyle.ACTION: rl.BLACK, + ButtonStyle.LIST_ACTION: rl.Color(228, 228, 228, 255), + ButtonStyle.NO_EFFECT: rl.Color(228, 228, 228, 255), + ButtonStyle.KEYBOARD: rl.Color(221, 221, 221, 255), + ButtonStyle.FORGET_WIFI: rl.Color(51, 51, 51, 255), +} + +BUTTON_DISABLED_TEXT_COLORS = { + ButtonStyle.TRANSPARENT_WHITE_TEXT: rl.WHITE, +} + +BUTTON_BACKGROUND_COLORS = { + ButtonStyle.NORMAL: rl.Color(51, 51, 51, 255), + ButtonStyle.PRIMARY: rl.Color(70, 91, 234, 255), + ButtonStyle.DANGER: rl.Color(226, 44, 44, 255), + ButtonStyle.TRANSPARENT: rl.BLACK, + ButtonStyle.TRANSPARENT_WHITE_TEXT: rl.BLANK, + ButtonStyle.TRANSPARENT_WHITE_BORDER: rl.BLACK, + ButtonStyle.ACTION: rl.Color(189, 189, 189, 255), + ButtonStyle.LIST_ACTION: rl.Color(57, 57, 57, 255), + ButtonStyle.NO_EFFECT: rl.Color(51, 51, 51, 255), + ButtonStyle.KEYBOARD: rl.Color(68, 68, 68, 255), + ButtonStyle.FORGET_WIFI: rl.Color(189, 189, 189, 255), +} + +BUTTON_PRESSED_BACKGROUND_COLORS = { + ButtonStyle.NORMAL: rl.Color(74, 74, 74, 255), + ButtonStyle.PRIMARY: rl.Color(48, 73, 244, 255), + ButtonStyle.DANGER: rl.Color(255, 36, 36, 255), + ButtonStyle.TRANSPARENT: rl.BLACK, + ButtonStyle.TRANSPARENT_WHITE_TEXT: rl.BLANK, + ButtonStyle.TRANSPARENT_WHITE_BORDER: rl.BLANK, + ButtonStyle.ACTION: rl.Color(130, 130, 130, 255), + ButtonStyle.LIST_ACTION: rl.Color(74, 74, 74, 74), + ButtonStyle.NO_EFFECT: rl.Color(51, 51, 51, 255), + ButtonStyle.KEYBOARD: rl.Color(51, 51, 51, 255), + ButtonStyle.FORGET_WIFI: rl.Color(130, 130, 130, 255), +} + +BUTTON_DISABLED_BACKGROUND_COLORS = { + ButtonStyle.TRANSPARENT_WHITE_TEXT: rl.BLANK, +} + + +class Button(Widget): + def __init__(self, + text: str | Callable[[], str], + click_callback: Callable[[], None] | None = None, + font_size: int = DEFAULT_BUTTON_FONT_SIZE, + font_weight: FontWeight = FontWeight.MEDIUM, + button_style: ButtonStyle = ButtonStyle.NORMAL, + border_radius: int = 10, + text_alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + text_padding: int = 20, + icon=None, + elide_right: bool = False, + multi_touch: bool = False, + ): + + super().__init__() + self._button_style = button_style + self._border_radius = border_radius + self._background_color = BUTTON_BACKGROUND_COLORS[self._button_style] + + self._label = Label(text, font_size, font_weight, text_alignment, text_padding=text_padding, + text_color=BUTTON_TEXT_COLOR[self._button_style], icon=icon, elide_right=elide_right) + + self._click_callback = click_callback + self._multi_touch = multi_touch + + def set_text(self, text): + self._label.set_text(text) + + def set_button_style(self, button_style: ButtonStyle): + self._button_style = button_style + self._background_color = BUTTON_BACKGROUND_COLORS[self._button_style] + self._label.set_text_color(BUTTON_TEXT_COLOR[self._button_style]) + + def _update_state(self): + if self.enabled: + self._label.set_text_color(BUTTON_TEXT_COLOR[self._button_style]) + if self.is_pressed: + self._background_color = BUTTON_PRESSED_BACKGROUND_COLORS[self._button_style] + else: + self._background_color = BUTTON_BACKGROUND_COLORS[self._button_style] + elif self._button_style != ButtonStyle.NO_EFFECT: + self._background_color = BUTTON_DISABLED_BACKGROUND_COLORS.get(self._button_style, rl.Color(51, 51, 51, 255)) + self._label.set_text_color(BUTTON_DISABLED_TEXT_COLORS.get(self._button_style, rl.Color(228, 228, 228, 51))) + + def _render(self, _): + roundness = self._border_radius / (min(self._rect.width, self._rect.height) / 2) + if self._button_style == ButtonStyle.TRANSPARENT_WHITE_BORDER: + rl.draw_rectangle_rounded(self._rect, roundness, 10, rl.BLACK) + rl.draw_rectangle_rounded_lines_ex(self._rect, roundness, 10, 2, rl.WHITE) + else: + rl.draw_rectangle_rounded(self._rect, roundness, 10, self._background_color) + self._label.render(self._rect) + + +class ButtonRadio(Button): + def __init__(self, + text: str, + icon, + click_callback: Callable[[], None] | None = None, + font_size: int = DEFAULT_BUTTON_FONT_SIZE, + text_alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + border_radius: int = 10, + text_padding: int = 20, + ): + + super().__init__(text, click_callback=click_callback, font_size=font_size, + border_radius=border_radius, text_padding=text_padding, + text_alignment=text_alignment) + self._text_padding = text_padding + self._icon = icon + self.selected = False + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + self.selected = not self.selected + + def _update_state(self): + if self.selected: + self._background_color = BUTTON_BACKGROUND_COLORS[ButtonStyle.PRIMARY] + else: + self._background_color = BUTTON_BACKGROUND_COLORS[ButtonStyle.NORMAL] + + def _render(self, _): + roundness = self._border_radius / (min(self._rect.width, self._rect.height) / 2) + rl.draw_rectangle_rounded(self._rect, roundness, 10, self._background_color) + self._label.render(self._rect) + + if self._icon and self.selected: + icon_y = self._rect.y + (self._rect.height - self._icon.height) / 2 + icon_x = self._rect.x + self._rect.width - self._icon.width - self._text_padding - ICON_PADDING + rl.draw_texture_v(self._icon, rl.Vector2(icon_x, icon_y), rl.WHITE if self.enabled else rl.Color(255, 255, 255, 100)) + + +class IconButton(Widget): + def __init__(self, texture: rl.Texture): + super().__init__() + self._texture = texture + self._opacity_filter = FirstOrderFilter(1.0, 0.1, 1 / gui_app.target_fps) + self.set_rect(rl.Rectangle(0, 0, self._texture.width, self._texture.height)) + + def set_opacity(self, opacity: float, smooth: bool = False): + if smooth: + self._opacity_filter.update(opacity) + else: + self._opacity_filter.x = opacity + + def _render(self, rect: rl.Rectangle): + color = rl.Color(180, 180, 180, int(150 * self._opacity_filter.x)) if self.is_pressed else rl.WHITE + if not self.enabled: + color = rl.Color(255, 255, 255, int(255 * 0.9 * 0.35 * self._opacity_filter.x)) + draw_x = rect.x + (rect.width - self._texture.width) / 2 + draw_y = rect.y + (rect.height - self._texture.height) / 2 + rl.draw_texture(self._texture, int(draw_x), int(draw_y), color) + + +class SmallCircleIconButton(Widget): + def __init__(self, icon_txt: rl.Texture): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, 100, 100)) + self._opacity_filter = FirstOrderFilter(1.0, 0.1, 1 / gui_app.target_fps) + self._icon_bg_txt = gui_app.texture("icons_mici/setup/small_button.png", 100, 100) + self._icon_bg_pressed_txt = gui_app.texture("icons_mici/setup/small_button_pressed.png", 100, 100) + self._icon_bg_disabled_txt = gui_app.texture("icons_mici/setup/small_button_disabled.png", 100, 100) + self._icon_txt = icon_txt + + def set_opacity(self, opacity: float, smooth: bool = False): + if smooth: + self._opacity_filter.update(opacity) + else: + self._opacity_filter.x = opacity + + def _render(self, _): + white = rl.Color(255, 255, 255, int(255 * self._opacity_filter.x)) + if not self.enabled: + bg_txt = self._icon_bg_disabled_txt + icon_white = rl.Color(255, 255, 255, int(white.a * 0.35)) + else: + bg_txt = self._icon_bg_pressed_txt if self.is_pressed else self._icon_bg_txt + icon_white = white + + rl.draw_texture(bg_txt, int(self.rect.x), int(self.rect.y), white) + icon_x = self.rect.x + (self.rect.width - self._icon_txt.width) / 2 + icon_y = self.rect.y + (self.rect.height - self._icon_txt.height) / 2 + rl.draw_texture(self._icon_txt, int(icon_x), int(icon_y), icon_white) + + +class SmallButton(Widget): + def __init__(self, text: str): + super().__init__() + self._opacity_filter = FirstOrderFilter(1.0, 0.1, 1 / gui_app.target_fps) + + self._load_assets() + + self._label = UnifiedLabel(text, 36, font_weight=FontWeight.MEDIUM, + text_color=rl.Color(255, 255, 255, int(255 * 0.9)), + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + + self._bg_disabled_txt = None + + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 194, 100)) + self._bg_txt = gui_app.texture("icons_mici/setup/reset/small_button.png", 194, 100) + self._bg_pressed_txt = gui_app.texture("icons_mici/setup/reset/small_button_pressed.png", 194, 100) + + def set_text(self, text: str): + self._label.set_text(text) + + def set_opacity(self, opacity: float, smooth: bool = False): + if smooth: + self._opacity_filter.update(opacity) + else: + self._opacity_filter.x = opacity + + def _render(self, _): + if not self.enabled and self._bg_disabled_txt is not None: + rl.draw_texture(self._bg_disabled_txt, int(self.rect.x), int(self.rect.y), rl.Color(255, 255, 255, int(255 * self._opacity_filter.x))) + elif self.is_pressed: + rl.draw_texture(self._bg_pressed_txt, int(self.rect.x), int(self.rect.y), rl.Color(255, 255, 255, int(255 * self._opacity_filter.x))) + else: + rl.draw_texture(self._bg_txt, int(self.rect.x), int(self.rect.y), rl.Color(255, 255, 255, int(255 * self._opacity_filter.x))) + + opacity = 0.9 if self.enabled else 0.35 + self._label.set_color(rl.Color(255, 255, 255, int(255 * opacity * self._opacity_filter.x))) + self._label.render(self._rect) + + +class SmallRedPillButton(SmallButton): + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 194, 100)) + self._bg_txt = gui_app.texture("icons_mici/setup/small_red_pill.png", 194, 100) + self._bg_pressed_txt = gui_app.texture("icons_mici/setup/small_red_pill_pressed.png", 194, 100) + + +class SmallerRoundedButton(SmallButton): + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 150, 100)) + self._bg_txt = gui_app.texture("icons_mici/setup/smaller_button.png", 150, 100) + self._bg_disabled_txt = gui_app.texture("icons_mici/setup/smaller_button_disabled.png", 150, 100) + self._bg_pressed_txt = gui_app.texture("icons_mici/setup/smaller_button_pressed.png", 150, 100) + + +class WideRoundedButton(SmallButton): + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 316, 100)) + self._bg_txt = gui_app.texture("icons_mici/setup/medium_button_bg.png", 316, 100) + self._bg_pressed_txt = gui_app.texture("icons_mici/setup/medium_button_pressed_bg.png", 316, 100) + + +class WidishRoundedButton(SmallButton): + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 250, 100)) + self._bg_txt = gui_app.texture("icons_mici/setup/widish_button.png", 250, 100) + self._bg_pressed_txt = gui_app.texture("icons_mici/setup/widish_button_pressed.png", 250, 100) + self._bg_disabled_txt = gui_app.texture("icons_mici/setup/widish_button_disabled.png", 250, 100) + + +class FullRoundedButton(SmallButton): + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 520, 100)) + self._bg_txt = gui_app.texture("icons_mici/setup/reset/wide_button.png", 520, 100) + self._bg_pressed_txt = gui_app.texture("icons_mici/setup/reset/wide_button_pressed.png", 520, 100) diff --git a/iqpilot/system/ui/widgets/confirm_dialog.py b/iqpilot/system/ui/widgets/confirm_dialog.py new file mode 100644 index 000000000..4102c0de9 --- /dev/null +++ b/iqpilot/system/ui/widgets/confirm_dialog.py @@ -0,0 +1,114 @@ +import pyray as rl +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import DialogResult +from iqpilot.system.ui.widgets.button import ButtonStyle, Button +from iqpilot.system.ui.widgets.label import Label +from iqpilot.system.ui.widgets.html_render import HtmlRenderer, ElementType +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.scroller_tici import Scroller + +OUTER_MARGIN = 200 +RICH_OUTER_MARGIN = 100 +BUTTON_HEIGHT = 160 +MARGIN = 50 +TEXT_PADDING = 10 +BACKGROUND_COLOR = rl.Color(27, 27, 27, 255) +CONFIRM_COLOR = rl.Color(16, 185, 169, 255) # teal (normal confirm) +DANGER_COLOR = rl.Color(226, 72, 58, 255) # red (destructive confirm) +BUTTON_RADIUS = 44 + +# Confirm actions whose button text contains one of these read as destructive (red). +DESTRUCTIVE_KEYWORDS = ("uninstall", "reset", "reboot", "power off", "forget", "delete", "remove", "erase", "wipe", "factory") + + +def _is_destructive(confirm_text) -> bool: + text = confirm_text() if callable(confirm_text) else confirm_text + return any(k in str(text).lower() for k in DESTRUCTIVE_KEYWORDS) + + +class ConfirmDialog(Widget): + def __init__(self, text: str, confirm_text: str, cancel_text: str | None = None, rich: bool = False, + destructive: bool | None = None): + super().__init__() + if cancel_text is None: + cancel_text = tr("Cancel") + self._confirm_color = DANGER_COLOR if (destructive if destructive is not None else _is_destructive(confirm_text)) else CONFIRM_COLOR + self._label = Label(text, 70, FontWeight.BOLD, text_color=rl.Color(201, 201, 201, 255)) + self._html_renderer = HtmlRenderer(text=text, text_size={ElementType.P: 50}, center_text=True) + self._cancel_button = Button(cancel_text, self._cancel_button_callback) + self._confirm_button = Button(confirm_text, self._confirm_button_callback, button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT) + self._cancel_button._border_radius = BUTTON_RADIUS + self._confirm_button._border_radius = BUTTON_RADIUS + self._rich = rich + self._dialog_result = DialogResult.NO_ACTION + self._cancel_text = cancel_text + self._scroller = Scroller([self._html_renderer], line_separator=False, spacing=0) + + def set_text(self, text): + if not self._rich: + self._label.set_text(text) + else: + self._html_renderer.parse_html_content(text) + + def reset(self): + self._dialog_result = DialogResult.NO_ACTION + + def _cancel_button_callback(self): + self._dialog_result = DialogResult.CANCEL + + def _confirm_button_callback(self): + self._dialog_result = DialogResult.CONFIRM + + def _render(self, rect: rl.Rectangle): + dialog_x = OUTER_MARGIN if not self._rich else RICH_OUTER_MARGIN + dialog_y = OUTER_MARGIN if not self._rich else RICH_OUTER_MARGIN + dialog_width = gui_app.width - 2 * dialog_x + dialog_height = gui_app.height - 2 * dialog_y + dialog_rect = rl.Rectangle(dialog_x, dialog_y, dialog_width, dialog_height) + + bottom = dialog_rect.y + dialog_rect.height + button_width = (dialog_rect.width - 3 * MARGIN) // 2 + cancel_button_x = dialog_rect.x + MARGIN + confirm_button_x = dialog_rect.x + dialog_rect.width - button_width - MARGIN + button_y = bottom - BUTTON_HEIGHT - MARGIN + cancel_button = rl.Rectangle(cancel_button_x, button_y, button_width, BUTTON_HEIGHT) + confirm_button = rl.Rectangle(confirm_button_x, button_y, button_width, BUTTON_HEIGHT) + + rl.draw_rectangle_rec(dialog_rect, BACKGROUND_COLOR) + + text_rect = rl.Rectangle(dialog_rect.x + MARGIN, dialog_rect.y + TEXT_PADDING, + dialog_rect.width - 2 * MARGIN, dialog_rect.height - BUTTON_HEIGHT - MARGIN - TEXT_PADDING * 2) + if not self._rich: + self._label.render(text_rect) + else: + html_rect = rl.Rectangle(text_rect.x, text_rect.y, text_rect.width, + self._html_renderer.get_total_height(int(text_rect.width))) + self._html_renderer.set_rect(html_rect) + self._scroller.render(text_rect) + + if rl.is_key_pressed(rl.KeyboardKey.KEY_ENTER): + self._dialog_result = DialogResult.CONFIRM + elif rl.is_key_pressed(rl.KeyboardKey.KEY_ESCAPE): + self._dialog_result = DialogResult.CANCEL + + def _render_confirm(r: rl.Rectangle): + roundness = BUTTON_RADIUS / (min(r.width, r.height) / 2) + rl.draw_rectangle_rounded(r, roundness, 10, self._confirm_color) + self._confirm_button.render(r) + + if self._cancel_text: + _render_confirm(confirm_button) + self._cancel_button.render(cancel_button) + else: + full_button_width = dialog_rect.width - 2 * MARGIN + full_confirm_button = rl.Rectangle(dialog_rect.x + MARGIN, button_y, full_button_width, BUTTON_HEIGHT) + _render_confirm(full_confirm_button) + + return self._dialog_result + + +def alert_dialog(message: str, button_text: str | None = None): + if button_text is None: + button_text = tr("OK") + return ConfirmDialog(message, button_text, cancel_text="") diff --git a/iqpilot/system/ui/widgets/esim.py b/iqpilot/system/ui/widgets/esim.py new file mode 100644 index 000000000..82a2b4e6f --- /dev/null +++ b/iqpilot/system/ui/widgets/esim.py @@ -0,0 +1,247 @@ +from __future__ import annotations + +import pyray as rl + +from iqpilot.system.hardware.base import Profile +from iqpilot.system.hardware.tici.esim_manager import EsimManager, EsimOperationState, EsimUiState, get_esim_manager +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import DialogResult, Widget +from iqpilot.system.ui.widgets.confirm_dialog import ConfirmDialog +from iqpilot.system.ui.widgets.keyboard import Keyboard +from iqpilot.system.ui.widgets.list_view import ListItem, button_item, text_item +from iqpilot.system.ui.widgets.option_dialog import MultiOptionDialog +from iqpilot.system.ui.widgets.scroller_tici import Scroller +from iqpilot.system.ui.widgets.esim_scanner import EsimQrScannerDialog + + +class EsimPanel(Widget): + def __init__(self): + super().__init__() + self._manager: EsimManager = get_esim_manager() + self._state = EsimUiState() + self._keyboard = Keyboard(max_text_size=256, min_text_size=0) + self._callback_registered = False + self._scroller = Scroller([]) + self._rebuild_scroller() + + def show_event(self): + if not self._callback_registered: + self._manager.add_callback(self._on_state_update) + self._callback_registered = True + self._manager.refresh_profiles() + + def hide_event(self): + if self._callback_registered: + self._manager.remove_callback(self._on_state_update) + self._callback_registered = False + + def _is_busy(self) -> bool: + return self._state.busy + + def is_supported(self) -> bool: + return self._manager.is_supported() + + def _on_state_update(self, state: EsimUiState): + self._state = state + self._rebuild_scroller() + + def _state_text(self) -> str: + if self._state.message: + return self._state.message + return self._state.state.value + + def _rebuild_scroller(self): + items: list[Widget] = [ + text_item(lambda: tr("Status"), lambda: self._state_text()), + button_item( + lambda: tr("Refresh Profiles"), + lambda: tr("REFRESH"), + callback=self._on_refresh, + enabled=lambda: not self._is_busy(), + ), + button_item( + lambda: tr("Add Profile"), + lambda: tr("ADD"), + description=lambda: tr("Scan QR or enter activation code"), + callback=self._on_add_profile, + enabled=lambda: not self._is_busy(), + ), + ] + + profiles = self._state.profiles or [] + for profile in profiles: + items.append(self._make_profile_item(profile)) + + self._scroller = Scroller(items, line_separator=True, spacing=0) + + def _make_profile_item(self, profile: Profile) -> ListItem: + label = profile.nickname if profile.nickname else profile.iccid + provider = profile.provider if profile.provider else tr("Unknown provider") + description = f"{provider}\n{profile.iccid}" + action = tr("ACTIVE") if profile.enabled else tr("USE") + return button_item( + lambda label=label: label, + lambda action=action: action, + description=lambda description=description: description, + callback=lambda profile=profile: self._on_profile_selected(profile), + enabled=lambda: not self._is_busy(), + ) + + def _on_refresh(self): + self._manager.refresh_profiles() + + def _on_add_profile(self): + options = [tr("Scan QR"), tr("Enter Code")] + dialog = MultiOptionDialog(tr("Add eSIM Profile"), options, current="") + dialog.selection = options[0] + + def _done(result: int): + if result != DialogResult.CONFIRM: + return + if dialog.selection == options[0]: + self._scan_qr() + else: + self._manual_code_entry() + + gui_app.set_modal_overlay(dialog, _done) + + def _scan_qr(self): + scanner = EsimQrScannerDialog() + self._manager.set_scanning_state(True) + + def _done(result: int): + self._manager.set_scanning_state(False) + if result != DialogResult.CONFIRM or not scanner.code: + return + self._confirm_add_code(scanner.code) + + gui_app.set_modal_overlay(scanner, _done) + + def _manual_code_entry(self): + self._keyboard.reset(min_text_size=1) + self._keyboard.set_title(tr("Enter Activation Code"), tr("format: LPA:1$...$...")) + self._keyboard.clear() + + def _done(result: int): + if result != DialogResult.CONFIRM: + return + code = self._keyboard.text.strip() + if code: + self._confirm_add_code(code) + + gui_app.set_modal_overlay(self._keyboard, _done) + + def _confirm_add_code(self, code: str): + confirm = ConfirmDialog("", tr("Continue"), tr("Cancel")) + code_preview = code if len(code) < 64 else (code[:61] + "...") + confirm.set_text(tr("Use activation code:\n{}").format(code_preview)) + confirm.reset() + + def _done(result: int): + if result != DialogResult.CONFIRM: + return + self._prompt_nickname_and_add(code) + + gui_app.set_modal_overlay(confirm, _done) + + def _prompt_nickname_and_add(self, code: str): + self._keyboard.reset(min_text_size=0) + self._keyboard.set_title(tr("Optional Nickname"), tr("leave blank to skip")) + self._keyboard.clear() + + def _done(result: int): + if result != DialogResult.CONFIRM: + return + nickname = self._keyboard.text.strip() + self._manager.add_profile(code, nickname if nickname else None) + + gui_app.set_modal_overlay(self._keyboard, _done) + + def _on_profile_selected(self, profile: Profile): + options = [] + if not profile.enabled: + options.append(tr("Activate")) + options.append(tr("Rename")) + if self._manager.is_comma_profile(profile.iccid): + options.append(tr("Remove Comma pSIM")) + elif not profile.enabled: + options.append(tr("Delete")) + + if len(options) == 0: + return + + dialog = MultiOptionDialog(tr("Profile Actions"), options, current="") + dialog.selection = options[0] + + def _done(result: int): + if result != DialogResult.CONFIRM: + return + if dialog.selection == tr("Activate"): + self._manager.switch_profile(profile.iccid) + elif dialog.selection == tr("Rename"): + self._rename_profile(profile) + elif dialog.selection == tr("Remove Comma pSIM"): + self._remove_comma_profile() + elif dialog.selection == tr("Delete"): + self._delete_profile(profile) + + gui_app.set_modal_overlay(dialog, _done) + + def _rename_profile(self, profile: Profile): + self._keyboard.reset(min_text_size=1) + self._keyboard.set_title(tr("Rename Profile"), "") + self._keyboard.set_text(profile.nickname or "") + + def _done(result: int): + if result != DialogResult.CONFIRM: + return + name = self._keyboard.text.strip() + if name: + self._manager.rename_profile(profile.iccid, name) + + gui_app.set_modal_overlay(self._keyboard, _done) + + def _delete_profile(self, profile: Profile): + confirm = ConfirmDialog("", tr("Delete"), tr("Cancel")) + confirm.set_text(tr("Delete disabled profile \"{}\"?").format(profile.nickname or profile.iccid)) + confirm.reset() + + def _done(result: int): + if result == DialogResult.CONFIRM: + self._manager.delete_profile(profile.iccid) + + gui_app.set_modal_overlay(confirm, _done) + + def _remove_comma_profile(self): + confirm = ConfirmDialog("", tr("Continue"), tr("Cancel")) + confirm.set_text( + tr("This will permanently wipe the Comma pSIM profile from the SIM.") + ) + confirm.reset() + + def _done(result: int): + if result == DialogResult.CONFIRM: + self._remove_comma_profile_final_warning() + + gui_app.set_modal_overlay(confirm, _done) + + def _remove_comma_profile_final_warning(self): + confirm = ConfirmDialog("", tr("Remove"), tr("Cancel")) + confirm.set_text( + tr("After this, you must use your own eSIM profile.\n\nYou cannot use Comma Prime again unless you buy a new SIM from comma.") + ) + confirm.reset() + + def _done(result: int): + if result == DialogResult.CONFIRM: + self._manager.bootstrap() + + gui_app.set_modal_overlay(confirm, _done) + + def _render(self, _): + if not self.is_supported(): + from iqpilot.system.ui.widgets.label import gui_label + gui_label(self._rect, tr("Insert the original comma SIM card that came with the device to use eSIM"), 64, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + return + self._scroller.render(self._rect) diff --git a/iqpilot/system/ui/widgets/esim_scanner.py b/iqpilot/system/ui/widgets/esim_scanner.py new file mode 100644 index 000000000..77bcc0bee --- /dev/null +++ b/iqpilot/system/ui/widgets/esim_scanner.py @@ -0,0 +1,131 @@ +import numpy as np +import pyray as rl + +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import DialogResult, NavWidget +from iqpilot.system.ui.widgets.label import gui_label +from iqpilot.selfdrive.ui.ui_state import ui_state, device +from iqpilot.system.hardware.tici.qr_decode import decode_qr, stable_code_key, validate_lpa_activation_code + +if gui_app.big_ui(): + from iqpilot.selfdrive.ui.onroad.driver_camera_dialog import DriverCameraDialog +else: + from iqpilot.selfdrive.ui.mici.onroad.driver_camera_dialog import DriverCameraDialog + + +class EsimQrScannerDialog(NavWidget): + REQUIRED_MATCH_FRAMES = 3 + DECODE_EVERY_N_FRAMES = 3 + NO_CAMERA_MESSAGE_DELAY_SEC = 3.0 + + def __init__(self): + super().__init__() + self._is_big_ui = gui_app.big_ui() + self._camera = DriverCameraDialog() if self._is_big_ui else DriverCameraDialog(no_escape=True) + self._candidate_key = "" + self._candidate_count = 0 + self.code: str | None = None + self._status = tr("Point the driver camera at a carrier eSIM QR code (LPA:...)") + self._frame_count = 0 + self._no_camera_elapsed_sec = 0.0 + self._result = DialogResult.NO_ACTION + + self.set_back_callback(lambda: setattr(self, "_result", DialogResult.CANCEL)) + + def _get_frame(self): + return self._camera.frame if self._is_big_ui else self._camera._camera_view.frame + + def show_event(self): + super().show_event() + self._camera.show_event() + ui_state.params.put_bool_nonblocking("IsDriverViewEnabled", True) + device.set_override_interactive_timeout(300) + self._no_camera_elapsed_sec = 0.0 + + def hide_event(self): + super().hide_event() + ui_state.params.put_bool("IsDriverViewEnabled", False) + device.set_override_interactive_timeout(None) + self._camera.hide_event() + + def _update_state(self): + super()._update_state() + if device.awake and not ui_state.params.get_bool("IsDriverViewEnabled"): + ui_state.params.put_bool_nonblocking("IsDriverViewEnabled", True) + self._frame_count += 1 + + frame = self._get_frame() + if frame is None: + self._no_camera_elapsed_sec += 1.0 / gui_app.target_fps + if self._no_camera_elapsed_sec >= self.NO_CAMERA_MESSAGE_DELAY_SEC: + self._status = tr("Waiting for driver camera. Use the carrier eSIM QR code or enter the LPA code manually.") + return + + self._no_camera_elapsed_sec = 0.0 + if frame is None or (self._frame_count % self.DECODE_EVERY_N_FRAMES != 0): + return + + try: + y = np.frombuffer(frame.data[:frame.uv_offset], dtype=np.uint8).reshape((-1, frame.stride))[:frame.height, :frame.width] + except Exception: + return + + codes = decode_qr(y) + if not codes: + self._candidate_key = "" + self._candidate_count = 0 + self._status = tr("No QR detected") + return + + valid_payload = "" + validation_error = "" + for payload in codes: + valid, err = validate_lpa_activation_code(payload) + if valid: + valid_payload = payload + break + validation_error = err + + if not valid_payload: + self._candidate_key = "" + self._candidate_count = 0 + self._status = validation_error or tr("Invalid QR code") + return + + key = stable_code_key(valid_payload) + if key == self._candidate_key: + self._candidate_count += 1 + else: + self._candidate_key = key + self._candidate_count = 1 + + if self._candidate_count >= self.REQUIRED_MATCH_FRAMES: + self.code = valid_payload + self._status = tr("QR accepted") + self._result = DialogResult.CONFIRM + else: + self._status = tr("Hold steady...") + + def _render(self, rect: rl.Rectangle): + self._camera.render(rect) + + if self._get_frame() is None: + gui_label( + rect, + tr("camera starting"), + font_size=72 if gui_app.big_ui() else 44, + font_weight=FontWeight.BOLD, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + ) + else: + text_rect = rl.Rectangle(rect.x + 40, rect.y + 40, rect.width - 80, 90) + gui_label( + text_rect, + self._status, + font_size=50 if gui_app.big_ui() else 30, + font_weight=FontWeight.MEDIUM, + alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + ) + + return self._result diff --git a/iqpilot/system/ui/widgets/html_render.py b/iqpilot/system/ui/widgets/html_render.py new file mode 100644 index 000000000..f2fd30417 --- /dev/null +++ b/iqpilot/system/ui/widgets/html_render.py @@ -0,0 +1,302 @@ +import re +import pyray as rl +from dataclasses import dataclass +from enum import Enum +from typing import Any +from iqpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.scroll_panel import GuiScrollPanel +from iqpilot.system.ui.lib.wrap_text import wrap_text +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.lib.text_measure import measure_text_cached + +LIST_INDENT_PX = 40 + + +class ElementType(Enum): + H1 = "h1" + H2 = "h2" + H3 = "h3" + H4 = "h4" + H5 = "h5" + H6 = "h6" + P = "p" + B = "b" + UL = "ul" + LI = "li" + BR = "br" + + +TAG_NAMES = '|'.join([t.value for t in ElementType]) +START_TAG_RE = re.compile(f'<({TAG_NAMES})>') +END_TAG_RE = re.compile(f'') +COMMENT_RE = re.compile(r'', flags=re.DOTALL) +DOCTYPE_RE = re.compile(r']*>') +HTML_BODY_TAGS_RE = re.compile(r']*>') +TOKEN_RE = re.compile(r']+>|<[^>]+>|[^<\s]+') + + +def is_tag(token: str) -> tuple[bool, bool, ElementType | None]: + supported_tag = bool(START_TAG_RE.fullmatch(token)) + supported_end_tag = bool(END_TAG_RE.fullmatch(token)) + tag = ElementType(token[1:-1].strip('/')) if supported_tag or supported_end_tag else None + return supported_tag, supported_end_tag, tag + + +@dataclass +class HtmlElement: + type: ElementType + content: str + font_size: int + font_weight: FontWeight + margin_top: int + margin_bottom: int + line_height: float = 0.9 # matches Qt visually, unsure why not default 1.2 + indent_level: int = 0 + + +class HtmlRenderer(Widget): + def __init__(self, file_path: str | None = None, text: str | None = None, + text_size: dict | None = None, text_color: rl.Color = rl.WHITE, center_text: bool = False): + super().__init__() + self._text_color = text_color + self._center_text = center_text + self._normal_font = gui_app.font(FontWeight.NORMAL) + self._bold_font = gui_app.font(FontWeight.BOLD) + self._indent_level = 0 + + if text_size is None: + text_size = {} + + self._cached_height: float | None = None + self._cached_width: int = -1 + + # Base paragraph size (Qt stylesheet default is 48px in offroad alerts) + base_p_size = int(text_size.get(ElementType.P, 48)) + + # Untagged text defaults to

    + self.styles: dict[ElementType, dict[str, Any]] = { + ElementType.H1: {"size": round(base_p_size * 2), "weight": FontWeight.BOLD, "margin_top": 20, "margin_bottom": 16}, + ElementType.H2: {"size": round(base_p_size * 1.50), "weight": FontWeight.BOLD, "margin_top": 24, "margin_bottom": 12}, + ElementType.H3: {"size": round(base_p_size * 1.17), "weight": FontWeight.BOLD, "margin_top": 20, "margin_bottom": 10}, + ElementType.H4: {"size": round(base_p_size * 1.00), "weight": FontWeight.BOLD, "margin_top": 16, "margin_bottom": 8}, + ElementType.H5: {"size": round(base_p_size * 0.83), "weight": FontWeight.BOLD, "margin_top": 12, "margin_bottom": 6}, + ElementType.H6: {"size": round(base_p_size * 0.67), "weight": FontWeight.BOLD, "margin_top": 10, "margin_bottom": 4}, + ElementType.P: {"size": base_p_size, "weight": FontWeight.NORMAL, "margin_top": 8, "margin_bottom": 12}, + ElementType.B: {"size": base_p_size, "weight": FontWeight.BOLD, "margin_top": 8, "margin_bottom": 12}, + ElementType.LI: {"size": base_p_size, "weight": FontWeight.NORMAL, "color": rl.Color(40, 40, 40, 255), "margin_top": 6, "margin_bottom": 6}, + ElementType.BR: {"size": 0, "weight": FontWeight.NORMAL, "margin_top": 0, "margin_bottom": 12}, + } + + self.elements: list[HtmlElement] = [] + if file_path is not None: + self.parse_html_file(file_path) + elif text is not None: + self.parse_html_content(text) + else: + raise ValueError("Either file_path or text must be provided") + + def parse_html_file(self, file_path: str) -> None: + with open(file_path, encoding='utf-8') as file: + content = file.read() + self.parse_html_content(content) + + def parse_html_content(self, html_content: str) -> None: + self.elements.clear() + self._cached_height = None + self._cached_width = -1 + + # Remove HTML comments + html_content = COMMENT_RE.sub('', html_content) + + # Remove DOCTYPE, html, head, body tags but keep their content + html_content = DOCTYPE_RE.sub('', html_content) + html_content = HTML_BODY_TAGS_RE.sub('', html_content) + + # Parse HTML + tokens = TOKEN_RE.findall(html_content) + + def close_tag(): + nonlocal current_content + nonlocal current_tag + + # If no tag is set, default to paragraph so we don't lose text + if current_tag is None: + current_tag = ElementType.P + + text = ' '.join(current_content).strip() + current_content = [] + if text: + if current_tag == ElementType.LI: + text = 'â€ĸ ' + text + self._add_element(current_tag, text) + + current_content: list[str] = [] + current_tag: ElementType | None = None + for token in tokens: + is_start_tag, is_end_tag, tag = is_tag(token) + if tag is not None: + if tag == ElementType.BR: + # Close current tag and add a line break + close_tag() + self._add_element(ElementType.BR, "") + + elif is_start_tag or is_end_tag: + # Always add content regardless of opening or closing tag + close_tag() + + if is_start_tag: + current_tag = tag + else: + current_tag = None + + # increment after we add the content for the current tag + if tag == ElementType.UL: + self._indent_level = self._indent_level + 1 if is_start_tag else max(0, self._indent_level - 1) + + else: + current_content.append(token) + + if current_content: + close_tag() + + def _add_element(self, element_type: ElementType, content: str) -> None: + style = self.styles[element_type] + + element = HtmlElement( + type=element_type, + content=content, + font_size=style["size"], + font_weight=style["weight"], + margin_top=style["margin_top"], + margin_bottom=style["margin_bottom"], + indent_level=self._indent_level, + ) + + self.elements.append(element) + + def _render(self, rect: rl.Rectangle): + # TODO: speed up by removing duplicate calculations across renders + current_y = rect.y + padding = 20 + content_width = rect.width - (padding * 2) + + for element in self.elements: + if element.type == ElementType.BR: + current_y += element.margin_bottom + continue + + current_y += element.margin_top + if current_y > rect.y + rect.height: + break + + if element.content: + font = self._get_font(element.font_weight) + wrapped_lines = wrap_text(font, element.content, element.font_size, int(content_width)) + + for line in wrapped_lines: + # Use FONT_SCALE from wrapped raylib text functions to match what is drawn + if current_y < rect.y - element.font_size * FONT_SCALE: + current_y += element.font_size * FONT_SCALE * element.line_height + continue + + if current_y > rect.y + rect.height: + break + + if self._center_text: + text_width = measure_text_cached(font, line, element.font_size).x + text_x = rect.x + (rect.width - text_width) / 2 + else: # left align + text_x = rect.x + (max(element.indent_level - 1, 0) * LIST_INDENT_PX) + + rl.draw_text_ex(font, line, rl.Vector2(text_x + padding, current_y), element.font_size, 0, self._text_color) + + current_y += element.font_size * FONT_SCALE * element.line_height + + # Apply bottom margin + current_y += element.margin_bottom + + return current_y - rect.y + + def get_total_height(self, content_width: int) -> float: + if self._cached_height is not None and self._cached_width == content_width: + return self._cached_height + + total_height = 0.0 + padding = 20 + usable_width = content_width - (padding * 2) + + for element in self.elements: + if element.type == ElementType.BR: + total_height += element.margin_bottom + continue + + total_height += element.margin_top + + if element.content: + font = self._get_font(element.font_weight) + wrapped_lines = wrap_text(font, element.content, element.font_size, int(usable_width)) + + for _ in wrapped_lines: + total_height += element.font_size * FONT_SCALE * element.line_height + + total_height += element.margin_bottom + + # Store result in cache + self._cached_height = total_height + self._cached_width = content_width + + return total_height + + def _get_font(self, weight: FontWeight): + if weight == FontWeight.BOLD: + return self._bold_font + return self._normal_font + + +HTML_MODAL_TEAL = rl.Color(16, 185, 169, 255) + + +class HtmlModal(Widget): + def __init__(self, file_path: str | None = None, text: str | None = None): + super().__init__() + self._content = HtmlRenderer(file_path=file_path, text=text) + self._scroll_panel = GuiScrollPanel() + self._ok_button = Button(tr("OK"), click_callback=lambda: gui_app.set_modal_overlay(None), + button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT) + self._ok_button._border_radius = 44 + + def _render(self, rect: rl.Rectangle): + margin = 50 + content_rect = rl.Rectangle(rect.x + margin, rect.y + margin, rect.width - (margin * 2), rect.height - (margin * 2)) + + button_height = 160 + button_spacing = 24 + panel_height = content_rect.height - button_height - button_spacing + + # Content panel + panel_rect = rl.Rectangle(content_rect.x, content_rect.y, content_rect.width, panel_height) + rl.draw_rectangle_rounded(panel_rect, 0.03, 20, rl.Color(22, 24, 28, 255)) + rl.draw_rectangle_rounded_lines_ex(panel_rect, 0.03, 20, 2, rl.Color(255, 255, 255, 26)) + + pad = 30 + scrollable_rect = rl.Rectangle(panel_rect.x + pad, panel_rect.y + pad, panel_rect.width - 2 * pad, panel_rect.height - 2 * pad) + + total_height = self._content.get_total_height(int(scrollable_rect.width)) + scroll_content_rect = rl.Rectangle(scrollable_rect.x, scrollable_rect.y, scrollable_rect.width, total_height) + scroll_offset = self._scroll_panel.update(scrollable_rect, scroll_content_rect) + scroll_content_rect.y += scroll_offset + + rl.begin_scissor_mode(int(scrollable_rect.x), int(scrollable_rect.y), int(scrollable_rect.width), int(scrollable_rect.height)) + self._content.render(scroll_content_rect) + rl.end_scissor_mode() + + button_width = (rect.width - 3 * 50) // 3 + button_x = content_rect.x + content_rect.width - button_width + button_y = content_rect.y + content_rect.height - button_height + button_rect = rl.Rectangle(button_x, button_y, button_width, button_height) + rl.draw_rectangle_rounded(button_rect, 44 / (min(button_rect.width, button_rect.height) / 2), 10, HTML_MODAL_TEAL) + self._ok_button.render(button_rect) + + return -1 diff --git a/iqpilot/system/ui/widgets/inputbox.py b/iqpilot/system/ui/widgets/inputbox.py new file mode 100644 index 000000000..1cbcebe55 --- /dev/null +++ b/iqpilot/system/ui/widgets/inputbox.py @@ -0,0 +1,232 @@ +import pyray as rl +import time +from iqpilot.system.ui.lib.application import gui_app, MousePos, FONT_SCALE +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +PASSWORD_MASK_CHAR = "â€ĸ" +PASSWORD_MASK_DELAY = 1.5 # Seconds to show character before masking + + +class InputBox(Widget): + def __init__(self, max_text_size=255, password_mode=False): + super().__init__() + self._max_text_size = max_text_size + self._input_text = "" + self._cursor_position = 0 + self._password_mode = password_mode + self._blink_counter = 0 + self._show_cursor = False + self.bg_color = rl.BLACK + self.caret_color = rl.WHITE + self._last_key_pressed = 0 + self._key_press_time = 0 + self._repeat_delay = 30 + self._repeat_rate = 4 + self._text_offset = 0 + self._visible_width = 0 + self._last_char_time = 0 # Track when last character was added + self._masked_length = 0 # How many characters are currently masked + + @property + def text(self): + return self._input_text + + @text.setter + def text(self, value): + self._input_text = value[: self._max_text_size] + self._cursor_position = len(self._input_text) + self._update_text_offset() + + def set_password_mode(self, password_mode): + self._password_mode = password_mode + + def clear(self): + self._input_text = '' + self._cursor_position = 0 + self._text_offset = 0 + + def set_cursor_position(self, position): + """Set the cursor position and reset the blink counter.""" + if 0 <= position <= len(self._input_text): + self._cursor_position = position + self._blink_counter = 0 + self._show_cursor = True + self._update_text_offset() + + def _update_text_offset(self): + """Ensure the cursor is visible by adjusting text offset.""" + if self._visible_width == 0: + return + + font = gui_app.font() + display_text = self._get_display_text() + padding = 10 + + if self._cursor_position > 0: + cursor_x = measure_text_cached(font, display_text[: self._cursor_position], self._font_size).x + else: + cursor_x = 0 + + visible_width = self._visible_width - (padding * 2) + + # Adjust offset if cursor would be outside visible area + if cursor_x < self._text_offset: + self._text_offset = max(0, cursor_x - padding) + elif cursor_x > self._text_offset + visible_width: + self._text_offset = cursor_x - visible_width + padding + + def add_char_at_cursor(self, char): + """Add a character at the current cursor position.""" + if len(self._input_text) < self._max_text_size: + self._input_text = self._input_text[: self._cursor_position] + char + self._input_text[self._cursor_position:] + self.set_cursor_position(self._cursor_position + 1) + + if self._password_mode: + self._last_char_time = time.monotonic() + + return True + return False + + def delete_char_before_cursor(self): + """Delete the character before the cursor position (backspace).""" + if self._cursor_position > 0: + self._input_text = self._input_text[: self._cursor_position - 1] + self._input_text[self._cursor_position:] + self.set_cursor_position(self._cursor_position - 1) + return True + return False + + def delete_char_at_cursor(self): + """Delete the character at the cursor position (delete).""" + if self._cursor_position < len(self._input_text): + self._input_text = self._input_text[: self._cursor_position] + self._input_text[self._cursor_position + 1:] + self.set_cursor_position(self._cursor_position) + return True + return False + + def _render(self, rect, color=None, border_color=rl.DARKGRAY, text_color=rl.WHITE, font_size=80): + if color is None: + color = self.bg_color + # Store dimensions for text offset calculations + self._visible_width = rect.width + self._font_size = font_size + + # Draw input box + rl.draw_rectangle_rec(rect, color) + + # Process keyboard input + self._handle_keyboard_input() + + # Update cursor blink + self._blink_counter += 1 + if self._blink_counter >= 30: + self._show_cursor = not self._show_cursor + self._blink_counter = 0 + + # Display text + font = gui_app.font() + display_text = self._get_display_text() + padding = 10 + + # Clip text within input box bounds + buffer = 2 + rl.begin_scissor_mode(int(rect.x + padding - buffer), int(rect.y), int(rect.width - padding * 2 + buffer * 2), int(rect.height)) + rl.draw_text_ex( + font, + display_text, + rl.Vector2(int(rect.x + padding - self._text_offset), int(rect.y + rect.height / 2 - font_size * FONT_SCALE / 2)), + font_size, + 0, + text_color, + ) + + # Draw cursor + if self._show_cursor: + cursor_x = rect.x + padding + if len(display_text) > 0 and self._cursor_position > 0: + cursor_x += measure_text_cached(font, display_text[: self._cursor_position], font_size).x + + # Apply text offset to cursor position + cursor_x -= self._text_offset + + cursor_height = font_size * FONT_SCALE + 4 + cursor_y = rect.y + rect.height / 2 - cursor_height / 2 + rl.draw_line(int(cursor_x), int(cursor_y), int(cursor_x), int(cursor_y + cursor_height), self.caret_color) + + rl.end_scissor_mode() + + def _get_display_text(self): + """Get text to display, applying password masking with delay if needed.""" + if not self._password_mode: + return self._input_text + + # Show character at last edited position if within delay window + masked_text = PASSWORD_MASK_CHAR * len(self._input_text) + recent_edit = time.monotonic() - self._last_char_time < PASSWORD_MASK_DELAY + if recent_edit and self._input_text: + last_pos = max(0, self._cursor_position - 1) + if last_pos < len(self._input_text): + return masked_text[:last_pos] + self._input_text[last_pos] + masked_text[last_pos + 1:] + + return masked_text + + def _handle_mouse_release(self, mouse_pos: MousePos): + # Calculate cursor position from click + if len(self._input_text) > 0: + font = gui_app.font() + display_text = self._get_display_text() + + # Find the closest character position to the click + relative_x = mouse_pos.x - (self._rect.x + 10) + self._text_offset + best_pos = 0 + min_distance = float('inf') + + for i in range(len(self._input_text) + 1): + char_width = measure_text_cached(font, display_text[:i], self._font_size).x + distance = abs(relative_x - char_width) + if distance < min_distance: + min_distance = distance + best_pos = i + + self.set_cursor_position(best_pos) + else: + self.set_cursor_position(0) + + def _handle_keyboard_input(self): + # Handle navigation keys + key = rl.get_key_pressed() + if key != 0: + self._process_key(key) + if key in (rl.KEY_LEFT, rl.KEY_RIGHT, rl.KEY_BACKSPACE, rl.KEY_DELETE): + self._last_key_pressed = key + self._key_press_time = 0 + + # Handle repeats for held keys + elif self._last_key_pressed != 0: + if rl.is_key_down(self._last_key_pressed): + self._key_press_time += 1 + if self._key_press_time > self._repeat_delay and self._key_press_time % self._repeat_rate == 0: + self._process_key(self._last_key_pressed) + else: + self._last_key_pressed = 0 + + # Handle text input + char = rl.get_char_pressed() + if char != 0 and char >= 32: # Filter out control characters + self.add_char_at_cursor(chr(char)) + + def _process_key(self, key): + if key == rl.KEY_LEFT: + if self._cursor_position > 0: + self.set_cursor_position(self._cursor_position - 1) + elif key == rl.KEY_RIGHT: + if self._cursor_position < len(self._input_text): + self.set_cursor_position(self._cursor_position + 1) + elif key == rl.KEY_BACKSPACE: + self.delete_char_before_cursor() + elif key == rl.KEY_DELETE: + self.delete_char_at_cursor() + elif key == rl.KEY_HOME: + self.set_cursor_position(0) + elif key == rl.KEY_END: + self.set_cursor_position(len(self._input_text)) diff --git a/iqpilot/system/ui/widgets/keyboard.py b/iqpilot/system/ui/widgets/keyboard.py new file mode 100644 index 000000000..4ac568587 --- /dev/null +++ b/iqpilot/system/ui/widgets/keyboard.py @@ -0,0 +1,316 @@ +from functools import partial +import time +from typing import Literal + +import pyray as rl + +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import ButtonStyle, Button +from iqpilot.system.ui.widgets.inputbox import InputBox +from iqpilot.system.ui.widgets.label import Label + +KEY_FONT_SIZE = 96 +DOUBLE_CLICK_THRESHOLD = 0.5 # seconds +DELETE_REPEAT_DELAY = 0.5 +DELETE_REPEAT_INTERVAL = 0.07 + +# Constants for special keys +CONTENT_MARGIN = 50 +BACKSPACE_KEY = "<-" +ENTER_KEY = "->" +SPACE_KEY = " " +SHIFT_INACTIVE_KEY = "SHIFT_OFF" +SHIFT_ACTIVE_KEY = "SHIFT_ON" +CAPS_LOCK_KEY = "CAPS" +NUMERIC_KEY = "123" +SYMBOL_KEY = "#+=" +ABC_KEY = "ABC" + +# Theme +TEAL = rl.Color(16, 185, 169, 255) +KEY_LETTER = rl.Color(58, 61, 68, 255) # letters / space / punctuation +KEY_FUNCTION = rl.Color(38, 40, 46, 255) # shift, backspace, 123, ABC, #+= +KEY_DISABLED = rl.Color(34, 36, 42, 255) +KEY_RADIUS = 32 +PRESS_SCALE = 1.045 +FIELD_BG = rl.Color(30, 32, 38, 255) +FIELD_BORDER = rl.Color(255, 255, 255, 38) +FUNCTION_KEYS = {SHIFT_INACTIVE_KEY, SHIFT_ACTIVE_KEY, CAPS_LOCK_KEY, BACKSPACE_KEY, NUMERIC_KEY, SYMBOL_KEY, ABC_KEY} + +# Define keyboard layouts as a dictionary for easier access +KEYBOARD_LAYOUTS = { + "lowercase": [ + ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"], + ["a", "s", "d", "f", "g", "h", "j", "k", "l"], + [SHIFT_INACTIVE_KEY, "z", "x", "c", "v", "b", "n", "m", BACKSPACE_KEY], + [NUMERIC_KEY, "/", "-", SPACE_KEY, ".", ENTER_KEY], + ], + "uppercase": [ + ["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"], + ["A", "S", "D", "F", "G", "H", "J", "K", "L"], + [SHIFT_ACTIVE_KEY, "Z", "X", "C", "V", "B", "N", "M", BACKSPACE_KEY], + [NUMERIC_KEY, "/", "-", SPACE_KEY, ".", ENTER_KEY], + ], + "numbers": [ + ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"], + ["-", "/", ":", ";", "(", ")", "$", "&", "@", "\""], + [SYMBOL_KEY, "_", ",", "?", "!", "`", BACKSPACE_KEY], + [ABC_KEY, SPACE_KEY, ".", ENTER_KEY], + ], + "specials": [ + ["[", "]", "{", "}", "#", "%", "^", "*", "+", "="], + ["_", "\\", "|", "~", "<", ">", "â‚Ŧ", "ÂŖ", "ÂĨ", "â€ĸ"], + [NUMERIC_KEY, "-", ",", "?", "!", "'", BACKSPACE_KEY], + [ABC_KEY, SPACE_KEY, ".", ENTER_KEY], + ], +} + + +class Keyboard(Widget): + def __init__(self, max_text_size: int = 255, min_text_size: int = 0, password_mode: bool = False, show_password_toggle: bool = False): + super().__init__() + self._layout_name: Literal["lowercase", "uppercase", "numbers", "specials"] = "lowercase" + self._caps_lock = False + self._last_shift_press_time = 0 + self._title = Label("", 90, FontWeight.BOLD, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + self._sub_title = Label("", 55, FontWeight.NORMAL, rl.GuiTextAlignment.TEXT_ALIGN_LEFT, text_padding=20) + + self._max_text_size = max_text_size + self._min_text_size = min_text_size + self._input_box = InputBox(max_text_size) + self._password_mode = password_mode + self._show_password_toggle = show_password_toggle + + # Backspace key repeat tracking + self._backspace_pressed: bool = False + self._backspace_press_time: float = 0.0 + self._backspace_last_repeat: float = 0.0 + + self._render_return_status = -1 + self._cancel_button = Button(lambda: tr("Cancel"), self._cancel_button_callback) + + self._eye_button = Button("", self._eye_button_callback, button_style=ButtonStyle.TRANSPARENT) + + self._eye_open_texture = gui_app.texture("icons/eye_open.png", 81, 54) + self._eye_closed_texture = gui_app.texture("icons/eye_closed.png", 81, 54) + self._key_icons = { + BACKSPACE_KEY: gui_app.texture("icons/backspace.png", 80, 80), + SHIFT_INACTIVE_KEY: gui_app.texture("icons/shift.png", 80, 80), + SHIFT_ACTIVE_KEY: gui_app.texture("icons/shift-fill.png", 80, 80), + CAPS_LOCK_KEY: gui_app.texture("icons/capslock-fill.png", 80, 80), + ENTER_KEY: gui_app.texture("icons/arrow-right.png", 80, 80), + } + + # All key buttons use a transparent style (draw no background); the keyboard paints each + # key's rounded background itself so it can shade by category and flash teal on press. + self._all_keys = {} + for l in KEYBOARD_LAYOUTS: + for keys in KEYBOARD_LAYOUTS[l]: + for key in keys: + if key in self._key_icons: + self._all_keys[key] = Button("", partial(self._key_callback, key), icon=self._key_icons[key], + button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT, multi_touch=True) + else: + self._all_keys[key] = Button(key, partial(self._key_callback, key), + button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT, font_size=85, multi_touch=True) + self._all_keys[CAPS_LOCK_KEY] = Button("", partial(self._key_callback, CAPS_LOCK_KEY), icon=self._key_icons[CAPS_LOCK_KEY], + button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT, multi_touch=True) + # Enter is a teal "Done" key + self._all_keys[ENTER_KEY] = Button(tr("Done"), partial(self._key_callback, ENTER_KEY), + button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT, font_size=64, multi_touch=True) + + self._cancel_button._border_radius = 40 + self._input_box.bg_color = rl.BLANK + self._input_box.caret_color = TEAL + + def set_text(self, text: str): + self._input_box.text = text + + @property + def text(self): + return self._input_box.text + + def clear(self): + self._layout_name = "lowercase" + self._caps_lock = False + self._input_box.clear() + self._backspace_pressed = False + + def set_title(self, title: str, sub_title: str = ""): + self._title.set_text(title) + self._sub_title.set_text(sub_title) + + def _eye_button_callback(self): + self._password_mode = not self._password_mode + + def _cancel_button_callback(self): + self.clear() + self._render_return_status = 0 + + def _key_callback(self, k): + if k == ENTER_KEY: + self._render_return_status = 1 + else: + self.handle_key_press(k) + + def _render(self, rect: rl.Rectangle): + rect = rl.Rectangle(rect.x + CONTENT_MARGIN, rect.y + CONTENT_MARGIN, rect.width - 2 * CONTENT_MARGIN, rect.height - 2 * CONTENT_MARGIN) + self._title.render(rl.Rectangle(rect.x, rect.y, rect.width, 95)) + self._sub_title.render(rl.Rectangle(rect.x, rect.y + 95, rect.width, 60)) + self._cancel_button.render(rl.Rectangle(rect.x + rect.width - 386, rect.y, 386, 125)) + + # Draw input box and password toggle + input_margin = 25 + input_box_rect = rl.Rectangle(rect.x + input_margin, rect.y + 160, rect.width - input_margin, 100) + self._render_input_area(input_box_rect) + + # Process backspace key repeat if it's held down + if not self._all_keys[BACKSPACE_KEY].is_pressed: + self._backspace_pressed = False + + if self._backspace_pressed: + current_time = time.monotonic() + time_since_press = current_time - self._backspace_press_time + + # After initial delay, start repeating with shorter intervals + if time_since_press > DELETE_REPEAT_DELAY: + time_since_last_repeat = current_time - self._backspace_last_repeat + if time_since_last_repeat > DELETE_REPEAT_INTERVAL: + self._input_box.delete_char_before_cursor() + self._backspace_last_repeat = current_time + + layout = KEYBOARD_LAYOUTS[self._layout_name] + + h_space, v_space = 15, 15 + row_y_start = rect.y + 300 # Starting Y position for the first row + key_height = (rect.height - 300 - 3 * v_space) / 4 + key_max_width = (rect.width - (len(layout[2]) - 1) * h_space) / len(layout[2]) + + # Iterate over the rows of keys in the current layout + pressed_keys = [] + for row, keys in enumerate(layout): + key_width = min((rect.width - (180 if row == 1 else 0) - h_space * (len(keys) - 1)) / len(keys), key_max_width) + start_x = rect.x + (90 if row == 1 else 0) + + for i, key in enumerate(keys): + if i > 0: + start_x += h_space + + new_width = (key_width * 3 + h_space * 2) if key == SPACE_KEY else (key_width * 2 + h_space if key == ENTER_KEY else key_width) + key_rect = rl.Rectangle(start_x, row_y_start + row * (key_height + v_space), new_width, key_height) + start_x += new_width + + is_enabled = key != ENTER_KEY or len(self._input_box.text) >= self._min_text_size + + if key == BACKSPACE_KEY and self._all_keys[BACKSPACE_KEY].is_pressed and not self._backspace_pressed: + self._backspace_pressed = True + self._backspace_press_time = time.monotonic() + self._backspace_last_repeat = time.monotonic() + + draw_key = key + if key == SHIFT_ACTIVE_KEY and self._caps_lock: + draw_key = CAPS_LOCK_KEY + btn = self._all_keys[draw_key] + btn.set_enabled(is_enabled) + + # Pressed keys are deferred so they grow + glow on top of their neighbors + if is_enabled and btn.is_pressed: + pressed_keys.append((btn, key_rect, new_width, key_height)) + continue + + if not is_enabled: + bg = KEY_DISABLED + elif key == ENTER_KEY or draw_key in (SHIFT_ACTIVE_KEY, CAPS_LOCK_KEY): + bg = TEAL # teal "Done" / shift / caps active + elif draw_key in FUNCTION_KEYS: + bg = KEY_FUNCTION # darker function keys + else: + bg = KEY_LETTER + roundness = min(1.0, KEY_RADIUS / (min(new_width, key_height) / 2)) + rl.draw_rectangle_rounded(key_rect, roundness, 10, bg) + btn.render(key_rect) + + # Draw pressed keys last: slightly grown with a teal glow + for btn, kr, w, h in pressed_keys: + gw, gh = w * PRESS_SCALE, h * PRESS_SCALE + grown = rl.Rectangle(kr.x - (gw - w) / 2, kr.y - (gh - h) / 2, gw, gh) + gr = min(1.0, KEY_RADIUS / (min(gw, gh) / 2)) + glow = rl.Rectangle(grown.x - 10, grown.y - 10, grown.width + 20, grown.height + 20) + rl.draw_rectangle_rounded(glow, gr, 10, rl.Color(16, 185, 169, 70)) + rl.draw_rectangle_rounded(grown, gr, 10, TEAL) + btn.render(grown) + + return self._render_return_status + + def _render_input_area(self, input_rect: rl.Rectangle): + # Filled rounded field behind the text + field = rl.Rectangle(input_rect.x, input_rect.y - 6, input_rect.width, input_rect.height + 24) + rl.draw_rectangle_rounded(field, 0.34, 16, FIELD_BG) + rl.draw_rectangle_rounded_lines_ex(field, 0.34, 16, 2, FIELD_BORDER) + + if self._show_password_toggle: + self._input_box.set_password_mode(self._password_mode) + self._input_box.render(rl.Rectangle(input_rect.x + 24, input_rect.y, input_rect.width - 130, input_rect.height)) + + # render eye icon + eye_texture = self._eye_closed_texture if self._password_mode else self._eye_open_texture + + eye_rect = rl.Rectangle(input_rect.x + input_rect.width - 100, input_rect.y, 80, input_rect.height) + self._eye_button.render(eye_rect) + + eye_x = eye_rect.x + (eye_rect.width - eye_texture.width) / 2 + eye_y = eye_rect.y + (eye_rect.height - eye_texture.height) / 2 + + rl.draw_texture_v(eye_texture, rl.Vector2(eye_x, eye_y), rl.WHITE) + else: + self._input_box.render(rl.Rectangle(input_rect.x + 24, input_rect.y, input_rect.width - 48, input_rect.height)) + + def handle_key_press(self, key): + if key in (CAPS_LOCK_KEY, ABC_KEY): + self._caps_lock = False + self._layout_name = "lowercase" + elif key == SHIFT_INACTIVE_KEY: + self._last_shift_press_time = time.monotonic() + self._layout_name = "uppercase" + elif key == SHIFT_ACTIVE_KEY: + if time.monotonic() - self._last_shift_press_time < DOUBLE_CLICK_THRESHOLD: + self._caps_lock = True + else: + self._layout_name = "lowercase" + elif key == NUMERIC_KEY: + self._layout_name = "numbers" + elif key == SYMBOL_KEY: + self._layout_name = "specials" + elif key == BACKSPACE_KEY: + self._input_box.delete_char_before_cursor() + else: + self._input_box.add_char_at_cursor(key) + if not self._caps_lock and self._layout_name == "uppercase": + self._layout_name = "lowercase" + + def reset(self, min_text_size: int | None = None): + if min_text_size is not None: + self._min_text_size = min_text_size + self._render_return_status = -1 + self._last_shift_press_time = 0 + self._backspace_pressed = False + self._backspace_press_time = 0.0 + self._backspace_last_repeat = 0.0 + self.clear() + + +if __name__ == "__main__": + gui_app.init_window("Keyboard") + keyboard = Keyboard(min_text_size=8, show_password_toggle=True) + for _ in gui_app.render(): + keyboard.set_title("Keyboard Input", "Type your text below") + result = keyboard.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + if result == 1: + print(f"You typed: {keyboard.text}") + gui_app.request_close() + elif result == 0: + print("Canceled") + gui_app.request_close() + gui_app.close() diff --git a/iqpilot/system/ui/widgets/label.py b/iqpilot/system/ui/widgets/label.py new file mode 100644 index 000000000..c5d917af2 --- /dev/null +++ b/iqpilot/system/ui/widgets/label.py @@ -0,0 +1,863 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from enum import IntEnum +from collections.abc import Callable +from itertools import zip_longest +from typing import Union +import pyray as rl + +from iqpilot.system.ui.lib.application import gui_app, FontWeight, DEFAULT_TEXT_SIZE, DEFAULT_TEXT_COLOR, FONT_SCALE +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.utils import GuiStyleContext, gui_style_color +from iqpilot.system.ui.lib.emoji import find_emoji, emoji_tex +from iqpilot.system.ui.lib.wrap_text import wrap_text + +ICON_PADDING = 15 + + +# TODO: make this common +def _resolve_value(value, default=""): + if callable(value): + return value() + return value if value is not None else default + + +class ScrollState(IntEnum): + STARTING = 0 + SCROLLING = 1 + ENDING = 2 + + +# TODO: merge anything new here to master +class MiciLabel(Widget): + def __init__(self, + text: str, + font_size: int = DEFAULT_TEXT_SIZE, + width: int | None = None, + color: rl.Color = DEFAULT_TEXT_COLOR, + font_weight: FontWeight = FontWeight.NORMAL, + alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + alignment_vertical: int = rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP, + spacing: int = 0, + line_height: int | None = None, + elide_right: bool = True, + wrap_text: bool = False, + scroll: bool = False): + super().__init__() + self.text = text + self.wrapped_text: list[str] = [] + self.font_size = font_size + self.width = width + self.color = color + self.font_weight = font_weight + self.alignment = alignment + self.alignment_vertical = alignment_vertical + self.spacing = spacing + self.line_height = line_height if line_height is not None else font_size + self.elide_right = elide_right + self.wrap_text = wrap_text + self._height = 0 + + # Scroll state + self.scroll = scroll + self._needs_scroll = False + self._scroll_offset = 0 + self._scroll_pause_t: float | None = None + self._scroll_state: ScrollState = ScrollState.STARTING + + assert not (self.scroll and self.wrap_text), "Cannot enable both scroll and wrap_text" + assert not (self.scroll and self.elide_right), "Cannot enable both scroll and elide_right" + + self.set_text(text) + + @property + def text_height(self): + return self._height + + def set_font_size(self, font_size: int): + self.font_size = font_size + self.set_text(self.text) + + def set_width(self, width: int): + if self.width != width: + self._scroll_offset = 0 + self._scroll_pause_t = None + self._scroll_state = ScrollState.STARTING + self.width = width + self._rect.width = width + self.set_text(self.text) + + def set_text(self, txt: str): + if self.text != txt: + self._scroll_offset = 0 + self._scroll_pause_t = None + self._scroll_state = ScrollState.STARTING + self.text = txt + text_size = measure_text_cached(gui_app.font(self.font_weight), self.text, self.font_size, self.spacing) + if self.width is not None: + self._rect.width = self.width + else: + self._rect.width = text_size.x + + if self.wrap_text: + self.wrapped_text = wrap_text(gui_app.font(self.font_weight), self.text, self.font_size, int(self._rect.width)) + self._height = len(self.wrapped_text) * self.line_height + elif self.scroll: + self._needs_scroll = self.scroll and text_size.x > self._rect.width + self._rect.height = text_size.y + + def set_color(self, color: rl.Color): + self.color = color + + def set_font_weight(self, font_weight: FontWeight): + self.font_weight = font_weight + self.set_text(self.text) + + def _render(self, rect: rl.Rectangle): + # Only scissor when we know there is a single scrolling line + if self._needs_scroll: + rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height)) + + font = gui_app.font(self.font_weight) + + text_y_offset = 0 + # Draw the text in the specified rectangle + lines = self.wrapped_text or [self.text] + if self.alignment_vertical == rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM: + lines = lines[::-1] + + for display_text in lines: + text_size = measure_text_cached(font, display_text, self.font_size, self.spacing) + + # Elide text to fit within the rectangle + if self.elide_right and text_size.x > rect.width: + ellipsis = "..." + left, right = 0, len(display_text) + while left < right: + mid = (left + right) // 2 + candidate = display_text[:mid] + ellipsis + candidate_size = measure_text_cached(font, candidate, self.font_size, self.spacing) + if candidate_size.x <= rect.width: + left = mid + 1 + else: + right = mid + display_text = display_text[: left - 1] + ellipsis if left > 0 else ellipsis + text_size = measure_text_cached(font, display_text, self.font_size, self.spacing) + + # Handle scroll state. Pause at both endpoints, then snap back to the + # readable start position instead of animating backward. + elif self.scroll and self._needs_scroll: + max_scroll = max(0.0, text_size.x - rect.width) + speed = 0.8 / 60. * gui_app.target_fps + if self._scroll_state == ScrollState.STARTING: + if self._scroll_pause_t is None: + self._scroll_pause_t = rl.get_time() + 2.0 + if rl.get_time() >= self._scroll_pause_t: + self._scroll_state = ScrollState.SCROLLING + self._scroll_pause_t = None + + elif self._scroll_state == ScrollState.SCROLLING: + self._scroll_offset = max(-max_scroll, self._scroll_offset - speed) + if self._scroll_offset <= -max_scroll: + self._scroll_state = ScrollState.ENDING + self._scroll_pause_t = None + + elif self._scroll_state == ScrollState.ENDING: + if self._scroll_pause_t is None: + self._scroll_pause_t = rl.get_time() + 1.5 + if rl.get_time() >= self._scroll_pause_t: + self._scroll_offset = 0 + self._scroll_state = ScrollState.STARTING + self._scroll_pause_t = None + + # Calculate horizontal position based on alignment + if self._needs_scroll: + text_x = rect.x + self._scroll_offset + else: + text_x = rect.x + { + rl.GuiTextAlignment.TEXT_ALIGN_LEFT: 0, + rl.GuiTextAlignment.TEXT_ALIGN_CENTER: (rect.width - text_size.x) / 2, + rl.GuiTextAlignment.TEXT_ALIGN_RIGHT: rect.width - text_size.x, + }.get(self.alignment, 0) + self._scroll_offset + + # Calculate vertical position based on alignment + text_y = rect.y + { + rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP: 0, + rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE: (rect.height - text_size.y) / 2, + rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM: rect.height - text_size.y, + }.get(self.alignment_vertical, 0) + text_y += text_y_offset + + rl.draw_text_ex(font, display_text, rl.Vector2(round(text_x), text_y), self.font_size, self.spacing, self.color) + if self.alignment_vertical == rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM: + text_y_offset -= self.line_height + else: + text_y_offset += self.line_height + + if self._needs_scroll: + # draw black fade on left and right + fade_width = 20 + text_width = measure_text_cached(font, self.text, self.font_size, self.spacing).x + if self._scroll_offset > -(text_width - rect.width): + rl.draw_rectangle_gradient_h(int(rect.x + rect.width - fade_width), int(rect.y), fade_width, int(rect.height), rl.BLANK, rl.BLACK) + if self._scroll_offset < 0: + rl.draw_rectangle_gradient_h(int(rect.x), int(rect.y), fade_width, int(rect.height), rl.BLACK, rl.BLANK) + + rl.end_scissor_mode() + + +# TODO: This should be a Widget class +def gui_label( + rect: rl.Rectangle, + text: str, + font_size: int = DEFAULT_TEXT_SIZE, + color: rl.Color = DEFAULT_TEXT_COLOR, + font_weight: FontWeight = FontWeight.NORMAL, + alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + alignment_vertical: int = rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + elide_right: bool = True +): + font = gui_app.font(font_weight) + text_size = measure_text_cached(font, text, font_size) + display_text = text + + # Elide text to fit within the rectangle + if elide_right and text_size.x > rect.width: + _ellipsis = "..." + left, right = 0, len(text) + while left < right: + mid = (left + right) // 2 + candidate = text[:mid] + _ellipsis + candidate_size = measure_text_cached(font, candidate, font_size) + if candidate_size.x <= rect.width: + left = mid + 1 + else: + right = mid + display_text = text[: left - 1] + _ellipsis if left > 0 else _ellipsis + text_size = measure_text_cached(font, display_text, font_size) + + # Calculate horizontal position based on alignment + text_x = rect.x + { + rl.GuiTextAlignment.TEXT_ALIGN_LEFT: 0, + rl.GuiTextAlignment.TEXT_ALIGN_CENTER: (rect.width - text_size.x) / 2, + rl.GuiTextAlignment.TEXT_ALIGN_RIGHT: rect.width - text_size.x, + }.get(alignment, 0) + + # Calculate vertical position based on alignment + text_y = rect.y + { + rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP: 0, + rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE: (rect.height - text_size.y) / 2, + rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM: rect.height - text_size.y, + }.get(alignment_vertical, 0) + + # Draw the text in the specified rectangle + # TODO: add wrapping and proper centering for multiline text + rl.draw_text_ex(font, display_text, rl.Vector2(text_x, text_y), font_size, 0, color) + + +def gui_text_box( + rect: rl.Rectangle, + text: str, + font_size: int = DEFAULT_TEXT_SIZE, + color: rl.Color = DEFAULT_TEXT_COLOR, + alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + alignment_vertical: int = rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP, + font_weight: FontWeight = FontWeight.NORMAL, + line_scale: float = 1.0, +): + styles = [ + (rl.GuiControl.DEFAULT, rl.GuiControlProperty.TEXT_COLOR_NORMAL, gui_style_color(color)), + (rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_SIZE, round(font_size * FONT_SCALE)), + (rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_LINE_SPACING, round(font_size * FONT_SCALE * line_scale)), + (rl.GuiControl.DEFAULT, rl.GuiControlProperty.TEXT_ALIGNMENT, alignment), + (rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_ALIGNMENT_VERTICAL, alignment_vertical), + (rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_WRAP_MODE, rl.GuiTextWrapMode.TEXT_WRAP_WORD) + ] + if font_weight != FontWeight.NORMAL: + rl.gui_set_font(gui_app.font(font_weight)) + + with GuiStyleContext(styles): + rl.gui_label(rect, text) + + if font_weight != FontWeight.NORMAL: + rl.gui_set_font(gui_app.font(FontWeight.NORMAL)) + + +# Non-interactive text area. Can render emojis and an optional specified icon. +class Label(Widget): + def __init__(self, + text: str | Callable[[], str], + font_size: int = DEFAULT_TEXT_SIZE, + font_weight: FontWeight = FontWeight.NORMAL, + text_alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_CENTER, + text_alignment_vertical: int = rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + text_padding: int = 0, + text_color: rl.Color = DEFAULT_TEXT_COLOR, + icon: Union[rl.Texture, None] = None, + elide_right: bool = False, + line_scale=1.0, + ): + + super().__init__() + self._font_weight = font_weight + self._font = gui_app.font(self._font_weight) + self._font_size = font_size + self._text_alignment = text_alignment + self._text_alignment_vertical = text_alignment_vertical + self._text_padding = text_padding + self._text_color = text_color + self._icon = icon + self._elide_right = elide_right + self._line_scale = line_scale + + self._text = text + self.set_text(text) + + def set_text(self, text): + self._text = text + self._update_text(self._text) + + def set_text_color(self, color): + self._text_color = color + + def set_font_size(self, size): + self._font_size = size + self._update_text(self._text) + + def _update_text(self, text): + self._emojis = [] + self._text_size = [] + text = _resolve_value(text) + + if self._elide_right: + display_text = text + + # Elide text to fit within the rectangle + text_size = measure_text_cached(self._font, text, self._font_size) + content_width = self._rect.width - self._text_padding * 2 + if self._icon: + content_width -= self._icon.width + ICON_PADDING + if text_size.x > content_width: + _ellipsis = "..." + left, right = 0, len(text) + while left < right: + mid = (left + right) // 2 + candidate = text[:mid] + _ellipsis + candidate_size = measure_text_cached(self._font, candidate, self._font_size) + if candidate_size.x <= content_width: + left = mid + 1 + else: + right = mid + display_text = text[: left - 1] + _ellipsis if left > 0 else _ellipsis + + self._text_wrapped = [display_text] + else: + self._text_wrapped = wrap_text(self._font, text, self._font_size, round(self._rect.width - (self._text_padding * 2))) + + for t in self._text_wrapped: + self._emojis.append(find_emoji(t)) + self._text_size.append(measure_text_cached(self._font, t, self._font_size)) + + def _render(self, _): + # Text can be a callable + # TODO: cache until text changed + self._update_text(self._text) + + text_size = self._text_size[0] if self._text_size else rl.Vector2(0.0, 0.0) + if self._text_alignment_vertical == rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE: + total_text_height = sum(ts.y for ts in self._text_size) or self._font_size * FONT_SCALE + text_pos = rl.Vector2(self._rect.x, (self._rect.y + (self._rect.height - total_text_height) // 2)) + else: + text_pos = rl.Vector2(self._rect.x, self._rect.y) + + if self._icon: + icon_y = self._rect.y + (self._rect.height - self._icon.height) / 2 + if len(self._text_wrapped) > 0: + if self._text_alignment == rl.GuiTextAlignment.TEXT_ALIGN_LEFT: + icon_x = self._rect.x + self._text_padding + text_pos.x = self._icon.width + ICON_PADDING + elif self._text_alignment == rl.GuiTextAlignment.TEXT_ALIGN_CENTER: + total_width = self._icon.width + ICON_PADDING + text_size.x + icon_x = self._rect.x + (self._rect.width - total_width) / 2 + text_pos.x = self._icon.width + ICON_PADDING + else: + icon_x = (self._rect.x + self._rect.width - text_size.x - self._text_padding) - ICON_PADDING - self._icon.width + else: + icon_x = self._rect.x + (self._rect.width - self._icon.width) / 2 + rl.draw_texture_v(self._icon, rl.Vector2(icon_x, icon_y), rl.WHITE) + + for text, text_size, emojis in zip_longest(self._text_wrapped, self._text_size, self._emojis, fillvalue=[]): + line_pos = rl.Vector2(text_pos.x, text_pos.y) + if self._text_alignment == rl.GuiTextAlignment.TEXT_ALIGN_LEFT: + line_pos.x += self._text_padding + elif self._text_alignment == rl.GuiTextAlignment.TEXT_ALIGN_CENTER: + line_pos.x += (self._rect.width - text_size.x) // 2 + elif self._text_alignment == rl.GuiTextAlignment.TEXT_ALIGN_RIGHT: + line_pos.x += self._rect.width - text_size.x - self._text_padding + + prev_index = 0 + for start, end, emoji in emojis: + text_before = text[prev_index:start] + width_before = measure_text_cached(self._font, text_before, self._font_size) + rl.draw_text_ex(self._font, text_before, line_pos, self._font_size, 0, self._text_color) + line_pos.x += width_before.x + + tex = emoji_tex(emoji) + if tex is not None: + rl.draw_texture_ex(tex, line_pos, 0.0, self._font_size / tex.height * FONT_SCALE, self._text_color) + line_pos.x += self._font_size * FONT_SCALE + prev_index = end + rl.draw_text_ex(self._font, text[prev_index:], line_pos, self._font_size, 0, self._text_color) + text_pos.y += (text_size.y or self._font_size * FONT_SCALE) * self._line_scale + + +class UnifiedLabel(Widget): + """ + Unified label widget that combines functionality from gui_label, gui_text_box, Label, and MiciLabel. + + Supports: + - Emoji rendering + - Text wrapping + - Automatic eliding (single-line or multiline) + - Proper multiline vertical alignment + - Height calculation for layout purposes + """ + def __init__(self, + text: str | Callable[[], str], + font_size: int = DEFAULT_TEXT_SIZE, + font_weight: FontWeight = FontWeight.NORMAL, + text_color: rl.Color = DEFAULT_TEXT_COLOR, + alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + alignment_vertical: int = rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP, + text_padding: int = 0, + max_width: int | None = None, + elide: bool = True, + wrap_text: bool = True, + scroll: bool = False, + line_height: float = 1.0, + letter_spacing: float = 0.0): + super().__init__() + self._text = text + self._font_size = font_size + self._font_weight = font_weight + self._font = gui_app.font(self._font_weight) + self._text_color = text_color + self._alignment = alignment + self._alignment_vertical = alignment_vertical + self._text_padding = text_padding + self._max_width = max_width + self._elide = elide + self._wrap_text = wrap_text + self._scroll = scroll + self._line_height = line_height * 0.9 + self._letter_spacing = letter_spacing # 0.1 = 10% + self._spacing_pixels = font_size * letter_spacing + + # Scroll state + self._scroll = scroll + self._needs_scroll = False + self._scroll_offset = 0 + self._scroll_pause_t: float | None = None + self._scroll_state: ScrollState = ScrollState.STARTING + self._scroll_active = True + + # Scroll mode does not support eliding or multiline wrapping + if self._scroll: + self._elide = False + self._wrap_text = False + + # Cached data + self._cached_text: str | None = None + self._cached_wrapped_lines: list[str] = [] + self._cached_line_sizes: list[rl.Vector2] = [] + self._cached_line_emojis: list[list[tuple[int, int, str]]] = [] + self._cached_total_height: float | None = None + self._cached_width: int = -1 + + # If max_width is set, initialize rect size for Scroller support + if max_width is not None: + self._rect.width = max_width + self._rect.height = self.get_content_height(max_width) + + def set_text(self, text: str | Callable[[], str]): + """Update the text content.""" + old_text = self.text + new_text = str(_resolve_value(text)) + self._text = text + if old_text != new_text: + self.reset_scroll() + self._cached_text = None + # No need to update cache here, will be done on next render if needed + + @property + def text(self) -> str: + """Get the current text content.""" + return str(_resolve_value(self._text)) + + def set_text_color(self, color: rl.Color): + """Update the text color.""" + self._text_color = color + + def set_color(self, color: rl.Color): + """Update the text color (alias for set_text_color).""" + self.set_text_color(color) + + def set_font_size(self, size: int): + """Update the font size.""" + if self._font_size != size: + self._font_size = size + self._spacing_pixels = size * self._letter_spacing # Recalculate spacing + self._cached_text = None # Invalidate cache + + def set_letter_spacing(self, letter_spacing: float): + """Update letter spacing (as percentage, e.g., 0.1 = 10%).""" + if self._letter_spacing != letter_spacing: + self._letter_spacing = letter_spacing + self._spacing_pixels = self._font_size * letter_spacing + self._cached_text = None # Invalidate cache + + def set_font_weight(self, font_weight: FontWeight): + """Update the font weight.""" + if self._font_weight != font_weight: + self._font_weight = font_weight + self._font = gui_app.font(self._font_weight) + self._cached_text = None # Invalidate cache + + def set_alignment(self, alignment: int): + """Update the horizontal text alignment.""" + self._alignment = alignment + + def set_alignment_vertical(self, alignment_vertical: int): + """Update the vertical text alignment.""" + self._alignment_vertical = alignment_vertical + + def set_line_height(self, line_height: float): + """Update line height (multiplier, e.g., 1.0 = default).""" + new_line_height = line_height * 0.9 + if self._line_height != new_line_height: + self._line_height = new_line_height + self._cached_text = None + + def reset_scroll(self): + """Reset scroll state to initial position.""" + self._scroll_offset = 0 + self._scroll_pause_t = None + self._scroll_state = ScrollState.STARTING + + def set_scroll_active(self, active: bool) -> None: + if self._scroll_active == active: + return + self._scroll_active = active + if not active: + self.reset_scroll() + + def set_max_width(self, max_width: int | None): + """Set the maximum width constraint for wrapping/eliding.""" + if self._max_width != max_width: + self.reset_scroll() + self._max_width = max_width + self._cached_text = None # Invalidate cache + # Update rect size for Scroller support + if max_width is not None: + self._rect.width = max_width + self._rect.height = self.get_content_height(max_width) + + def _update_text_cache(self, available_width: int): + """Update cached text processing data.""" + text = self.text + + # Check if cache is still valid + if (self._cached_text == text and + self._cached_width == available_width and + self._cached_wrapped_lines): + return + + if self._cached_text is not None and (self._cached_text != text or self._cached_width != available_width): + self.reset_scroll() + + self._cached_text = text + self._cached_width = available_width + + # Determine wrapping width + content_width = available_width - (self._text_padding * 2) + if content_width <= 0: + content_width = 1 + + # Wrap text if enabled + if self._wrap_text: + self._cached_wrapped_lines = wrap_text(self._font, text, self._font_size, content_width, self._spacing_pixels) + else: + # Split by newlines but don't wrap + self._cached_wrapped_lines = text.split('\n') if text else [""] + + # Elide lines if needed (for width constraint) + self._cached_wrapped_lines = [self._elide_line(line, content_width) for line in self._cached_wrapped_lines] + + if self._scroll: + self._cached_wrapped_lines = self._cached_wrapped_lines[:1] # Only first line for scrolling + + # Process each line: measure and find emojis + self._cached_line_sizes = [] + self._cached_line_emojis = [] + + for line in self._cached_wrapped_lines: + emojis = find_emoji(line) + self._cached_line_emojis.append(emojis) + # Empty lines should still have height (use font size as line height) + if not line: + size = rl.Vector2(0, self._font_size * FONT_SCALE) + else: + size = measure_text_cached(self._font, line, self._font_size, self._spacing_pixels) + + # This is the only line + if self._scroll: + self._needs_scroll = size.x > content_width + + self._cached_line_sizes.append(size) + + # Calculate total height + # Each line contributes its measured height * line_height (matching Label's behavior) + # This includes spacing to the next line + if self._cached_line_sizes: + # Match the rendering logic: first line doesn't get line_height scaling + total_height = 0.0 + for idx, size in enumerate(self._cached_line_sizes): + if idx == 0: + total_height += size.y + else: + total_height += size.y * self._line_height + self._cached_total_height = total_height + else: + self._cached_total_height = 0.0 + + def _elide_line(self, line: str, max_width: int, force: bool = False) -> str: + """Elide a single line if it exceeds max_width. If force is True, always elide even if it fits.""" + if not self._elide and not force: + return line + + text_size = measure_text_cached(self._font, line, self._font_size, self._spacing_pixels) + if text_size.x <= max_width and not force: + return line + + ellipsis = "..." + # If force=True and line fits, just append ellipsis without truncating + if force and text_size.x <= max_width: + ellipsis_size = measure_text_cached(self._font, ellipsis, self._font_size, self._spacing_pixels) + if text_size.x + ellipsis_size.x <= max_width: + return line + ellipsis + # If line + ellipsis doesn't fit, need to truncate + # Fall through to binary search below + + left, right = 0, len(line) + while left < right: + mid = (left + right) // 2 + candidate = line[:mid] + ellipsis + candidate_size = measure_text_cached(self._font, candidate, self._font_size, self._spacing_pixels) + if candidate_size.x <= max_width: + left = mid + 1 + else: + right = mid + return line[:left - 1] + ellipsis if left > 0 else ellipsis + + def get_content_height(self, max_width: int) -> float: + """ + Returns the height needed for text at given max_width. + Similar to HtmlRenderer.get_total_height(). + """ + # Use max_width if provided, otherwise use self._max_width or a default + width = max_width if max_width > 0 else (self._max_width if self._max_width else 1000) + self._update_text_cache(width) + + if self._cached_total_height is not None: + return self._cached_total_height + return 0.0 + + def _render(self, _): + """Render the label.""" + if self._rect.width <= 0 or self._rect.height <= 0: + return + + # Determine available width + available_width = self._rect.width + if self._max_width is not None: + available_width = min(available_width, self._max_width) + + # Update text cache + self._update_text_cache(int(available_width)) + + if not self._cached_wrapped_lines: + return + + # Calculate which lines fit in the available height + visible_lines: list[str] = [] + visible_sizes: list[rl.Vector2] = [] + visible_emojis: list[list[tuple[int, int, str]]] = [] + + current_height = 0.0 + broke_early = False + for line, size, emojis in zip( + self._cached_wrapped_lines, + self._cached_line_sizes, + self._cached_line_emojis, + strict=True): + + # Calculate height needed for this line + # Each line contributes its height * line_height (matching Label's behavior) + line_height_needed = size.y * self._line_height + + # Check if this line fits + if current_height + line_height_needed > self._rect.height: + # This line doesn't fit + if len(visible_lines) == 0: + # First line doesn't fit by height - still show it (will be clipped by scissor if needed) + # Continue to add this line below + pass + else: + # We have visible lines and this one doesn't fit - mark that we broke early + broke_early = True + break + + visible_lines.append(line) + visible_sizes.append(size) + visible_emojis.append(emojis) + + current_height += line_height_needed + + # If we broke early (there are more lines that don't fit) and elide is enabled, elide the last visible line + if broke_early and len(visible_lines) > 0 and self._elide: + content_width = int(available_width - (self._text_padding * 2)) + if content_width <= 0: + content_width = 1 + + last_line_idx = len(visible_lines) - 1 + last_line = visible_lines[last_line_idx] + # Force elide the last line to show "..." even if it fits in width (to indicate more content) + elided = self._elide_line(last_line, content_width, force=True) + visible_lines[last_line_idx] = elided + visible_sizes[last_line_idx] = measure_text_cached(self._font, elided, self._font_size, self._spacing_pixels) + + if not visible_lines: + return + + # Calculate total visible text block height + # First line is not changed by line_height scaling + total_visible_height = 0.0 + for idx, size in enumerate(visible_sizes): + if idx == 0: + total_visible_height += size.y + else: + total_visible_height += size.y * self._line_height + + # Calculate vertical alignment offset + if self._alignment_vertical == rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP: + start_y = self._rect.y + elif self._alignment_vertical == rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM: + start_y = self._rect.y + self._rect.height - total_visible_height + else: # TEXT_ALIGN_MIDDLE + start_y = self._rect.y + (self._rect.height - total_visible_height) / 2 + + # Only scissor when we know there is a single scrolling line + # Pad a little since descenders like g or j may overflow below rect from font_scale + if self._needs_scroll: + scissor_x = int(self._rect.x + self._text_padding) + scissor_w = int(max(1, self._rect.width - self._text_padding * 2)) + rl.begin_scissor_mode(scissor_x, int(self._rect.y - self._font_size / 2), scissor_w, int(self._rect.height + self._font_size)) + + # Render each line + current_y = start_y + for idx, (line, size, emojis) in enumerate(zip(visible_lines, visible_sizes, visible_emojis, strict=True)): + if self._needs_scroll and self._scroll_active: + content_width = max(1.0, available_width - self._text_padding * 2) + max_scroll = max(0.0, size.x - content_width) + speed = 0.8 / 60. * gui_app.target_fps + if self._scroll_state == ScrollState.STARTING: + if self._scroll_pause_t is None: + self._scroll_pause_t = rl.get_time() + 2.0 + if rl.get_time() >= self._scroll_pause_t: + self._scroll_state = ScrollState.SCROLLING + self._scroll_pause_t = None + + elif self._scroll_state == ScrollState.SCROLLING: + self._scroll_offset = max(-max_scroll, self._scroll_offset - speed) + if self._scroll_offset <= -max_scroll: + self._scroll_state = ScrollState.ENDING + self._scroll_pause_t = None + + elif self._scroll_state == ScrollState.ENDING: + if self._scroll_pause_t is None: + self._scroll_pause_t = rl.get_time() + 1.5 + if rl.get_time() >= self._scroll_pause_t: + self._scroll_offset = 0 + self._scroll_state = ScrollState.STARTING + self._scroll_pause_t = None + else: + self.reset_scroll() + + self._render_line(line, size, emojis, current_y) + + # Move to next line (if not last line) + if idx < len(visible_lines) - 1: + # Use current line's height * line_height for spacing to next line + current_y += size.y * self._line_height + + if self._needs_scroll: + # draw black fade on left and right + fade_width = 20 + left_edge = self._rect.x + self._text_padding + right_edge = self._rect.x + self._rect.width - self._text_padding + content_width = max(1.0, available_width - self._text_padding * 2) + max_scroll = max(0.0, visible_sizes[0].x - content_width) + if self._scroll_offset > -max_scroll: + rl.draw_rectangle_gradient_h( + int(right_edge - fade_width), int(self._rect.y), + fade_width, int(self._rect.height), rl.BLANK, rl.BLACK, + ) + if self._scroll_active and self._scroll_offset < 0: + rl.draw_rectangle_gradient_h( + int(left_edge), int(self._rect.y), fade_width, int(self._rect.height), rl.BLACK, rl.BLANK, + ) + + rl.end_scissor_mode() + + def _render_line(self, line, size, emojis, current_y, x_offset=0.0): + # Calculate horizontal position + if self._needs_scroll: + line_x = self._rect.x + self._text_padding + elif self._alignment == rl.GuiTextAlignment.TEXT_ALIGN_LEFT: + line_x = self._rect.x + self._text_padding + elif self._alignment == rl.GuiTextAlignment.TEXT_ALIGN_CENTER: + line_x = self._rect.x + (self._rect.width - size.x) / 2 + elif self._alignment == rl.GuiTextAlignment.TEXT_ALIGN_RIGHT: + line_x = self._rect.x + self._rect.width - size.x - self._text_padding + else: + line_x = self._rect.x + self._text_padding + line_x += self._scroll_offset + x_offset + + # Render line with emojis + line_pos = rl.Vector2(line_x, current_y) + prev_index = 0 + + for start, end, emoji in emojis: + # Draw text before emoji + text_before = line[prev_index:start] + if text_before: + rl.draw_text_ex(self._font, text_before, line_pos, self._font_size, self._spacing_pixels, self._text_color) + width_before = measure_text_cached(self._font, text_before, self._font_size, self._spacing_pixels) + line_pos.x += width_before.x + + # Draw emoji + tex = emoji_tex(emoji) + if tex is not None: + emoji_scale = self._font_size / tex.height * FONT_SCALE + rl.draw_texture_ex(tex, line_pos, 0.0, emoji_scale, self._text_color) + # Emoji width is font_size * FONT_SCALE (as per measure_text_cached) + line_pos.x += self._font_size * FONT_SCALE + prev_index = end + + # Draw remaining text after last emoji + text_after = line[prev_index:] + if text_after: + rl.draw_text_ex(self._font, text_after, line_pos, self._font_size, self._spacing_pixels, self._text_color) diff --git a/iqpilot/system/ui/widgets/list_view.py b/iqpilot/system/ui/widgets/list_view.py new file mode 100644 index 000000000..01f559220 --- /dev/null +++ b/iqpilot/system/ui/widgets/list_view.py @@ -0,0 +1,518 @@ +import os +import pyray as rl +from collections.abc import Callable +from abc import ABC +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.widgets.toggle import Toggle, WIDTH as TOGGLE_WIDTH, HEIGHT as TOGGLE_HEIGHT +from iqpilot.system.ui.widgets.label import gui_label, UnifiedLabel +from iqpilot.system.ui.widgets.html_render import HtmlRenderer, ElementType + +ITEM_BASE_WIDTH = 600 +ITEM_BASE_HEIGHT = 170 +ITEM_PADDING = 20 +ITEM_TEXT_FONT_SIZE = 50 +ITEM_TEXT_COLOR = rl.WHITE +ITEM_TEXT_VALUE_COLOR = rl.Color(170, 170, 170, 255) +ITEM_DESC_TEXT_COLOR = rl.Color(128, 128, 128, 255) +ITEM_DESC_FONT_SIZE = 40 +ITEM_DESC_V_OFFSET = 140 +RIGHT_ITEM_PADDING = 20 +ICON_SIZE = 80 +BUTTON_WIDTH = 250 +BUTTON_HEIGHT = 100 +BUTTON_BORDER_RADIUS = 50 +BUTTON_FONT_SIZE = 35 +BUTTON_FONT_WEIGHT = FontWeight.MEDIUM + +TEXT_PADDING = 20 + + +def _resolve_value(value, default=""): + if callable(value): + return value() + return value if value is not None else default + + +# Abstract base class for right-side items +class ItemAction(Widget, ABC): + def __init__(self, width: int = BUTTON_HEIGHT, enabled: bool | Callable[[], bool] = True): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, width, 0)) + self._enabled_source = enabled + + def get_width_hint(self) -> float: + # Return's action ideal width, 0 means use full width + return self._rect.width + + def set_enabled(self, enabled: bool | Callable[[], bool]): + self._enabled_source = enabled + + @property + def enabled(self): + return _resolve_value(self._enabled_source, False) + + +class ToggleAction(ItemAction): + def __init__(self, initial_state: bool = False, width: int = TOGGLE_WIDTH, enabled: bool | Callable[[], bool] = True, + callback: Callable[[bool], None] | None = None): + super().__init__(width, enabled) + self.toggle = Toggle(initial_state=initial_state, callback=callback) + + def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: + super().set_touch_valid_callback(touch_callback) + self.toggle.set_touch_valid_callback(touch_callback) + + def _render(self, rect: rl.Rectangle) -> bool: + self.toggle.set_enabled(self.enabled) + clicked = self.toggle.render(rl.Rectangle(rect.x, rect.y + (rect.height - TOGGLE_HEIGHT) / 2, self._rect.width, TOGGLE_HEIGHT)) + return bool(clicked) + + def set_state(self, state: bool): + self.toggle.set_state(state) + + def get_state(self) -> bool: + return self.toggle.get_state() + + +class ButtonAction(ItemAction): + def __init__(self, text: str | Callable[[], str], width: int = BUTTON_WIDTH, enabled: bool | Callable[[], bool] = True): + super().__init__(width, enabled) + self._text_source = text + self._value_source: str | Callable[[], str] | None = None + self._pressed = False + self._font = gui_app.font(FontWeight.NORMAL) + self._value_label = UnifiedLabel("", ITEM_TEXT_FONT_SIZE, text_color=ITEM_TEXT_VALUE_COLOR, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + wrap_text=False, scroll=True) + + def pressed(): + self._pressed = True + + self._button = Button( + self.text, + font_size=BUTTON_FONT_SIZE, + font_weight=BUTTON_FONT_WEIGHT, + button_style=ButtonStyle.LIST_ACTION, + border_radius=BUTTON_BORDER_RADIUS, + click_callback=pressed, + text_padding=0, + ) + self.set_enabled(enabled) + + def get_width_hint(self) -> float: + value_text = self.value + if value_text: + text_width = measure_text_cached(self._font, value_text, ITEM_TEXT_FONT_SIZE).x + return text_width + BUTTON_WIDTH + TEXT_PADDING + else: + return BUTTON_WIDTH + + def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: + super().set_touch_valid_callback(touch_callback) + self._button.set_touch_valid_callback(touch_callback) + + def set_text(self, text: str | Callable[[], str]): + self._text_source = text + + def set_value(self, value: str | Callable[[], str]): + self._value_source = value + + @property + def text(self): + return _resolve_value(self._text_source, tr("Error")) + + @property + def value(self): + return _resolve_value(self._value_source, "") + + def _render(self, rect: rl.Rectangle) -> bool: + self._button.set_text(self.text) + self._button.set_enabled(_resolve_value(self.enabled)) + button_rect = rl.Rectangle(rect.x + rect.width - BUTTON_WIDTH, rect.y + (rect.height - BUTTON_HEIGHT) / 2, BUTTON_WIDTH, BUTTON_HEIGHT) + self._button.render(button_rect) + + value_text = self.value + if value_text: + value_rect = rl.Rectangle(rect.x, rect.y, rect.width - BUTTON_WIDTH - TEXT_PADDING, rect.height) + if measure_text_cached(self._font, value_text, ITEM_TEXT_FONT_SIZE).x > value_rect.width: + self._value_label.set_text(value_text) + self._value_label.set_text_color(ITEM_TEXT_VALUE_COLOR) + self._value_label.render(value_rect) + else: + gui_label(value_rect, value_text, font_size=ITEM_TEXT_FONT_SIZE, color=ITEM_TEXT_VALUE_COLOR, + font_weight=FontWeight.NORMAL, alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + + # TODO: just use the generic Widget click callbacks everywhere, no returning from render + pressed = self._pressed + self._pressed = False + return pressed + + +class TextAction(ItemAction): + def __init__(self, text: str | Callable[[], str], color: rl.Color = ITEM_TEXT_COLOR, enabled: bool | Callable[[], bool] = True): + self._text_source = text + self.color = color + + self._font = gui_app.font(FontWeight.NORMAL) + initial_text = _resolve_value(text, "") + text_width = measure_text_cached(self._font, initial_text, ITEM_TEXT_FONT_SIZE).x + self._scroll_label = UnifiedLabel(initial_text, ITEM_TEXT_FONT_SIZE, text_color=color, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + wrap_text=False, scroll=True) + super().__init__(int(text_width + TEXT_PADDING), enabled) + + @property + def text(self): + return _resolve_value(self._text_source, tr("Error")) + + def get_width_hint(self) -> float: + text_width = measure_text_cached(self._font, self.text, ITEM_TEXT_FONT_SIZE).x + return text_width + TEXT_PADDING + + def _render(self, rect: rl.Rectangle) -> bool: + text = self.text + if measure_text_cached(self._font, text, ITEM_TEXT_FONT_SIZE).x > rect.width: + self._scroll_label.set_text(text) + self._scroll_label.set_text_color(self.color) + self._scroll_label.render(rect) + else: + gui_label(self._rect, text, font_size=ITEM_TEXT_FONT_SIZE, color=self.color, + font_weight=FontWeight.NORMAL, alignment=rl.GuiTextAlignment.TEXT_ALIGN_RIGHT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE) + return False + + def set_text(self, text: str | Callable[[], str]): + self._text_source = text + + +class DualButtonAction(ItemAction): + def __init__(self, left_text: str | Callable[[], str], right_text: str | Callable[[], str], left_callback: Callable | None = None, + right_callback: Callable | None = None, enabled: bool | Callable[[], bool] = True): + super().__init__(width=0, enabled=enabled) # Width 0 means use full width + self.left_button = Button(left_text, click_callback=left_callback, button_style=ButtonStyle.NORMAL, text_padding=0) + self.right_button = Button(right_text, click_callback=right_callback, button_style=ButtonStyle.DANGER, text_padding=0) + + def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: + super().set_touch_valid_callback(touch_callback) + self.left_button.set_touch_valid_callback(touch_callback) + self.right_button.set_touch_valid_callback(touch_callback) + + def _render(self, rect: rl.Rectangle): + button_spacing = 30 + button_height = 120 + button_width = (rect.width - button_spacing) / 2 + button_y = rect.y + (rect.height - button_height) / 2 + + left_rect = rl.Rectangle(rect.x, button_y, button_width, button_height) + right_rect = rl.Rectangle(rect.x + button_width + button_spacing, button_y, button_width, button_height) + + # expand one to full width if other is not visible + if not self.left_button.is_visible: + right_rect.x = rect.x + right_rect.width = rect.width + elif not self.right_button.is_visible: + left_rect.width = rect.width + + # Render buttons + self.left_button.render(left_rect) + self.right_button.render(right_rect) + + +class MultipleButtonAction(ItemAction): + def __init__(self, buttons: list[str | Callable[[], str]], button_width: int, selected_index: int = 0, + callback: Callable | None = None, enabled: bool | Callable[[], bool] = True): + super().__init__(width=len(buttons) * button_width + (len(buttons) - 1) * RIGHT_ITEM_PADDING, enabled=enabled) + self.buttons = buttons + self.button_width = button_width + self.selected_button = selected_index + self.callback = callback + self._font = gui_app.font(FontWeight.MEDIUM) + self._enabled_buttons_source: list[bool] | Callable[[int], bool] | None = None + + def set_enabled_buttons(self, enabled_buttons: list[bool] | Callable[[int], bool] | None): + self._enabled_buttons_source = enabled_buttons + + def _is_button_enabled(self, index: int) -> bool: + if not self.enabled: + return False + + if self._enabled_buttons_source is None: + return True + + if callable(self._enabled_buttons_source): + return bool(self._enabled_buttons_source(index)) + + if 0 <= index < len(self._enabled_buttons_source): + return bool(self._enabled_buttons_source[index]) + + return False + + def set_selected_button(self, index: int): + if 0 <= index < len(self.buttons): + self.selected_button = index + + def get_selected_button(self) -> int: + return self.selected_button + + def _render(self, rect: rl.Rectangle): + spacing = RIGHT_ITEM_PADDING + button_y = rect.y + (rect.height - BUTTON_HEIGHT) / 2 + button_count = len(self.buttons) + button_width = (rect.width - spacing * (button_count - 1)) / button_count + + for i, _text in enumerate(self.buttons): + button_x = rect.x + i * (button_width + spacing) + button_rect = rl.Rectangle(button_x, button_y, button_width, BUTTON_HEIGHT) + button_enabled = self._is_button_enabled(i) + + # Check button state + mouse_pos = rl.get_mouse_position() + is_pressed = rl.check_collision_point_rec(mouse_pos, button_rect) and button_enabled and self.is_pressed + is_selected = i == self.selected_button + + # Button colors + if is_selected: + bg_color = rl.Color(51, 171, 76, 255) # Green + elif is_pressed: + bg_color = rl.Color(74, 74, 74, 255) # Dark gray + else: + bg_color = rl.Color(57, 57, 57, 255) # Gray + + if not button_enabled: + bg_color = rl.Color(bg_color.r, bg_color.g, bg_color.b, 150) # Dim + + # Draw button + rl.draw_rectangle_rounded(button_rect, 1.0, 20, bg_color) + + # Draw text + text = _resolve_value(_text, "") + font_size = 40 + max_text_width = max(1, button_width - TEXT_PADDING * 2) + text_size = measure_text_cached(self._font, text, font_size) + while text_size.x > max_text_width and font_size > 30: + font_size -= 2 + text_size = measure_text_cached(self._font, text, font_size) + text_x = button_x + (button_width - text_size.x) / 2 + text_y = button_y + (BUTTON_HEIGHT - text_size.y) / 2 + text_color = rl.Color(228, 228, 228, 255) if button_enabled else rl.Color(150, 150, 150, 255) + rl.begin_scissor_mode(int(button_rect.x), int(button_rect.y), int(button_rect.width), int(button_rect.height)) + rl.draw_text_ex(self._font, text, rl.Vector2(text_x, text_y), font_size, 0, text_color) + rl.end_scissor_mode() + + def _handle_mouse_release(self, mouse_pos: MousePos): + spacing = RIGHT_ITEM_PADDING + button_y = self._rect.y + (self._rect.height - BUTTON_HEIGHT) / 2 + button_count = len(self.buttons) + button_width = (self._rect.width - spacing * (button_count - 1)) / button_count + for i, _ in enumerate(self.buttons): + button_x = self._rect.x + i * (button_width + spacing) + button_rect = rl.Rectangle(button_x, button_y, button_width, BUTTON_HEIGHT) + if rl.check_collision_point_rec(mouse_pos, button_rect): + if not self._is_button_enabled(i): + continue + self.selected_button = i + if self.callback: + self.callback(i) + + +class ListItem(Widget): + def __init__(self, title: str | Callable[[], str] = "", icon: str | None = None, description: str | Callable[[], str] | None = None, + description_visible: bool = False, callback: Callable | None = None, + action_item: ItemAction | None = None): + super().__init__() + self._title = title + self.set_icon(icon) + self._description = description + self.description_visible = description_visible + self.callback = callback + self.description_opened_callback: Callable | None = None + self.action_item = action_item + + self.set_rect(rl.Rectangle(0, 0, ITEM_BASE_WIDTH, ITEM_BASE_HEIGHT)) + self._font = gui_app.font(FontWeight.NORMAL) + + self._html_renderer = HtmlRenderer(text="", text_size={ElementType.P: ITEM_DESC_FONT_SIZE}, + text_color=ITEM_DESC_TEXT_COLOR) + self._parse_description(self.description) + + # Cached properties for performance + self._prev_description: str | None = self.description + + def show_event(self): + self._set_description_visible(False) + + def set_description_opened_callback(self, callback: Callable) -> None: + self.description_opened_callback = callback + + def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: + super().set_touch_valid_callback(touch_callback) + if self.action_item: + self.action_item.set_touch_valid_callback(touch_callback) + + def set_parent_rect(self, parent_rect: rl.Rectangle): + super().set_parent_rect(parent_rect) + self._rect.width = parent_rect.width + + def _handle_mouse_release(self, mouse_pos: MousePos): + if not self.is_visible: + return + + # Check not in action rect + if self.action_item: + action_rect = self.get_right_item_rect(self._rect) + if rl.check_collision_point_rec(mouse_pos, action_rect): + # Click was on right item, don't toggle description + return + + self._set_description_visible(not self.description_visible) + + def _set_description_visible(self, visible: bool): + if self.description and self.description_visible != visible: + self.description_visible = visible + # do callback first in case receiver changes description + if self.description_visible and self.description_opened_callback is not None: + self.description_opened_callback() + # Call _update_state to catch any description changes + self._update_state() + + content_width = int(self._rect.width - ITEM_PADDING * 2) + self._rect.height = self.get_item_height(self._font, content_width) + + def _update_state(self): + # Detect changes if description is callback + new_description = self.description + if new_description != self._prev_description: + self._parse_description(new_description) + + def _render(self, _): + if not self.is_visible: + return + + # Don't draw items that are not in parent's viewport + if ((self._rect.y + self.rect.height) <= self._parent_rect.y or + self._rect.y >= (self._parent_rect.y + self._parent_rect.height)): + return + + content_x = self._rect.x + ITEM_PADDING + text_x = content_x + + # Only draw title and icon for items that have them + if self.title: + # Draw icon if present + if self.icon: + rl.draw_texture(self._icon_texture, int(content_x), int(self._rect.y + (ITEM_BASE_HEIGHT - self._icon_texture.height) // 2), rl.WHITE) + text_x += ICON_SIZE + ITEM_PADDING + + # Draw main text + text_size = measure_text_cached(self._font, self.title, ITEM_TEXT_FONT_SIZE) + item_y = self._rect.y + (ITEM_BASE_HEIGHT - text_size.y) // 2 + rl.draw_text_ex(self._font, self.title, rl.Vector2(text_x, item_y), ITEM_TEXT_FONT_SIZE, 0, ITEM_TEXT_COLOR) + + # Draw description if visible + if self.description_visible: + content_width = int(self._rect.width - ITEM_PADDING * 2) + description_height = self._html_renderer.get_total_height(content_width) + description_rect = rl.Rectangle( + self._rect.x + ITEM_PADDING, + self._rect.y + ITEM_DESC_V_OFFSET, + content_width, + description_height + ) + self._html_renderer.render(description_rect) + + # Draw right item if present + if self.action_item: + right_rect = self.get_right_item_rect(self._rect) + right_rect.y = self._rect.y + if self.action_item.render(right_rect) and self.action_item.enabled: + # Right item was clicked/activated + if self.callback: + self.callback() + + def set_icon(self, icon: str | None): + self.icon = icon + self._icon_texture = gui_app.texture(os.path.join("icons", self.icon), ICON_SIZE, ICON_SIZE) if self.icon else None + + def set_description(self, description: str | Callable[[], str] | None): + self._description = description + + def _parse_description(self, new_desc): + self._html_renderer.parse_html_content(new_desc) + self._prev_description = new_desc + + @property + def title(self): + return _resolve_value(self._title, "") + + @property + def description(self): + return _resolve_value(self._description, "") + + def get_item_height(self, font: rl.Font, max_width: int) -> float: + if not self.is_visible: + return 0 + + height = float(ITEM_BASE_HEIGHT) + if self.description_visible: + description_height = self._html_renderer.get_total_height(max_width) + height += description_height - (ITEM_BASE_HEIGHT - ITEM_DESC_V_OFFSET) + ITEM_PADDING + return height + + def get_right_item_rect(self, item_rect: rl.Rectangle) -> rl.Rectangle: + if not self.action_item: + return rl.Rectangle(0, 0, 0, 0) + + right_width = self.action_item.get_width_hint() + if right_width == 0: # Full width action (like DualButtonAction) + return rl.Rectangle(item_rect.x + ITEM_PADDING, item_rect.y, + item_rect.width - (ITEM_PADDING * 2), ITEM_BASE_HEIGHT) + + # Clip width to available space, never overlapping this Item's title + content_width = item_rect.width - (ITEM_PADDING * 2) + title_width = measure_text_cached(self._font, self.title, ITEM_TEXT_FONT_SIZE).x + right_width = min(content_width - title_width, right_width) + + right_x = item_rect.x + item_rect.width - right_width + right_y = item_rect.y + return rl.Rectangle(right_x, right_y, right_width, ITEM_BASE_HEIGHT) + + +# Factory functions +def simple_item(title: str | Callable[[], str], callback: Callable | None = None) -> ListItem: + return ListItem(title=title, callback=callback) + + +def toggle_item(title: str | Callable[[], str], description: str | Callable[[], str] | None = None, initial_state: bool = False, + callback: Callable | None = None, icon: str = "", enabled: bool | Callable[[], bool] = True) -> ListItem: + action = ToggleAction(initial_state=initial_state, enabled=enabled, callback=callback) + return ListItem(title=title, description=description, action_item=action, icon=icon) + + +def button_item(title: str | Callable[[], str], button_text: str | Callable[[], str], description: str | Callable[[], str] | None = None, + callback: Callable | None = None, enabled: bool | Callable[[], bool] = True) -> ListItem: + action = ButtonAction(text=button_text, enabled=enabled) + return ListItem(title=title, description=description, action_item=action, callback=callback) + + +def text_item(title: str | Callable[[], str], value: str | Callable[[], str], description: str | Callable[[], str] | None = None, + callback: Callable | None = None, enabled: bool | Callable[[], bool] = True) -> ListItem: + action = TextAction(text=value, color=ITEM_TEXT_VALUE_COLOR, enabled=enabled) + return ListItem(title=title, description=description, action_item=action, callback=callback) + + +def dual_button_item(left_text: str | Callable[[], str], right_text: str | Callable[[], str], + left_callback: Callable | None = None, right_callback: Callable | None = None, + description: str | Callable[[], str] | None = None, enabled: bool | Callable[[], bool] = True) -> ListItem: + action = DualButtonAction(left_text, right_text, left_callback, right_callback, enabled) + return ListItem(title="", description=description, action_item=action) + + +def multiple_button_item(title: str | Callable[[], str], description: str | Callable[[], str], buttons: list[str | Callable[[], str]], selected_index: int, + button_width: int = BUTTON_WIDTH, callback: Callable | None = None, icon: str = ""): + action = MultipleButtonAction(buttons, button_width, selected_index, callback=callback) + return ListItem(title=title, description=description, icon=icon, action_item=action) diff --git a/iqpilot/system/ui/widgets/mici_keyboard.py b/iqpilot/system/ui/widgets/mici_keyboard.py new file mode 100644 index 000000000..39b8c71c6 --- /dev/null +++ b/iqpilot/system/ui/widgets/mici_keyboard.py @@ -0,0 +1,418 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +from enum import IntEnum +import pyray as rl +import numpy as np +from iqpilot.system.ui.lib.application import gui_app, FontWeight, MousePos, MouseEvent +from iqpilot.system.ui.lib.raylib_compat import draw_circle_gradient +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget +from iqpilot.common.filter_simple import BounceFilter, FirstOrderFilter + +CHAR_FONT_SIZE = 42 +CHAR_NEAR_FONT_SIZE = CHAR_FONT_SIZE * 2 +SELECTED_CHAR_FONT_SIZE = 128 +CHAR_CAPS_FONT_SIZE = 38 # TODO: implement this +NUMBER_LAYER_SWITCH_FONT_SIZE = 24 +KEYBOARD_COLUMN_PADDING = 33 +KEYBOARD_ROW_PADDING = {0: 44, 1: 33, 2: 44} # TODO: 2 should be 116 with extra control keys added in + +KEY_TOUCH_AREA_OFFSET = 10 # px +KEY_DRAG_HYSTERESIS = 5 # px +KEY_MIN_ANIMATION_TIME = 0.075 # s + +DEBUG = False +ANIMATION_SCALE = 0.65 + + +def zip_repeat(a, b): + la, lb = len(a), len(b) + for i in range(max(la, lb)): + yield (a[i] if i < la else a[-1], + b[i] if i < lb else b[-1]) + + +def fast_euclidean_distance(dx, dy): + # https://en.wikibooks.org/wiki/Algorithms/Distance_approximations + max_d, min_d = abs(dx), abs(dy) + if max_d < min_d: + max_d, min_d = min_d, max_d + return 0.941246 * max_d + 0.41 * min_d + + +class Key(Widget): + def __init__(self, char: str, font_weight: FontWeight = FontWeight.SEMI_BOLD): + super().__init__() + self.char = char + self._font = gui_app.font(font_weight) + self._x_filter = BounceFilter(0.0, 0.1 * ANIMATION_SCALE, 1 / gui_app.target_fps) + self._y_filter = BounceFilter(0.0, 0.1 * ANIMATION_SCALE, 1 / gui_app.target_fps) + self._size_filter = BounceFilter(CHAR_FONT_SIZE, 0.1 * ANIMATION_SCALE, 1 / gui_app.target_fps) + self._alpha_filter = BounceFilter(1.0, 0.075 * ANIMATION_SCALE, 1 / gui_app.target_fps) + + self._color = rl.Color(255, 255, 255, 255) + + self._position_initialized = False + self.original_position = rl.Vector2(0, 0) + + def set_position(self, x: float, y: float, smooth: bool = True): + # Smooth keys within parent rect + base_y = self._parent_rect.y if self._parent_rect else 0.0 + local_y = y - base_y + + if not self._position_initialized: + self._x_filter.x = x + self._y_filter.x = local_y + # keep track of original position so dragging around feels consistent. also move touch area down a bit + self.original_position = rl.Vector2(x, y + KEY_TOUCH_AREA_OFFSET) + self._position_initialized = True + + if not smooth: + self._x_filter.x = x + self._y_filter.x = local_y + + self._rect.x = self._x_filter.update(x) + self._rect.y = base_y + self._y_filter.update(local_y) + + def set_alpha(self, alpha: float): + self._alpha_filter.update(alpha) + + def get_position(self) -> tuple[float, float]: + return self._rect.x, self._rect.y + + def _update_state(self): + self._color.a = min(int(255 * self._alpha_filter.x), 255) + + def _render(self, _): + # center char at rect position + text_size = measure_text_cached(self._font, self.char, self._get_font_size()) + x = self._rect.x + self._rect.width / 2 - text_size.x / 2 + y = self._rect.y + self._rect.height / 2 - text_size.y / 2 + rl.draw_text_ex(self._font, self.char, (x, y), self._get_font_size(), 0, self._color) + + if DEBUG: + rl.draw_circle(int(self._rect.x), int(self._rect.y), 5, rl.RED) # Debug: draw circle around key + rl.draw_rectangle_lines_ex(self._rect, 2, rl.RED) + + def set_font_size(self, size: float): + self._size_filter.update(size) + + def _get_font_size(self) -> int: + return int(round(self._size_filter.x)) + + +class SmallKey(Key): + def __init__(self, chars: str): + super().__init__(chars, FontWeight.BOLD) + self._size_filter.x = NUMBER_LAYER_SWITCH_FONT_SIZE + + def set_font_size(self, size: float): + self._size_filter.update(size * (NUMBER_LAYER_SWITCH_FONT_SIZE / CHAR_FONT_SIZE)) + + +class IconKey(Key): + def __init__(self, icon: str, vertical_align: str = "center", char: str = "", icon_size: tuple[int, int] = (38, 38)): + super().__init__(char) + self._icon_size = icon_size + self._icon = gui_app.texture(icon, *icon_size) + self._vertical_align = vertical_align + + def set_icon(self, icon: str, icon_size: tuple[int, int] | None = None): + size = icon_size if icon_size is not None else self._icon_size + self._icon = gui_app.texture(icon, *size) + + def _render(self, _): + scale = np.interp(self._size_filter.x, [CHAR_FONT_SIZE, CHAR_NEAR_FONT_SIZE], [1, 1.5]) + + if self._vertical_align == "center": + dest_rec = rl.Rectangle(self._rect.x + (self._rect.width - self._icon.width * scale) / 2, + self._rect.y + (self._rect.height - self._icon.height * scale) / 2, + self._icon.width * scale, self._icon.height * scale) + src_rec = rl.Rectangle(0, 0, self._icon.width, self._icon.height) + rl.draw_texture_pro(self._icon, src_rec, dest_rec, rl.Vector2(0, 0), 0, self._color) + + elif self._vertical_align == "bottom": + dest_rec = rl.Rectangle(self._rect.x + (self._rect.width - self._icon.width * scale) / 2, self._rect.y, + self._icon.width * scale, self._icon.height * scale) + src_rec = rl.Rectangle(0, 0, self._icon.width, self._icon.height) + rl.draw_texture_pro(self._icon, src_rec, dest_rec, rl.Vector2(0, 0), 0, self._color) + + if DEBUG: + rl.draw_circle(int(self._rect.x), int(self._rect.y), 5, rl.RED) # Debug: draw circle around key + rl.draw_rectangle_lines_ex(self._rect, 2, rl.RED) + + +class CapsState(IntEnum): + LOWER = 0 + UPPER = 1 + LOCK = 2 + + +class MiciKeyboard(Widget): + def __init__(self, auto_return_to_letters: str = ""): + super().__init__() + self._auto_return_to_letters = auto_return_to_letters + + lower_chars = [ + "qwertyuiop", + "asdfghjkl", + "zxcvbnm", + ] + upper_chars = ["".join([char.upper() for char in row]) for row in lower_chars] + special_chars = [ + "1234567890", + "-/:;()$&@\"", + "~.,?!'#%", + ] + super_special_chars = [ + "1234567890", + "`[]{}^*+=_", + "\\|<>ÂĨâ‚ŦÂŖâ€ĸ", + ] + + self._lower_keys = [[Key(char) for char in row] for row in lower_chars] + self._upper_keys = [[Key(char) for char in row] for row in upper_chars] + self._special_keys = [[Key(char) for char in row] for row in special_chars] + self._super_special_keys = [[Key(char) for char in row] for row in super_special_chars] + + # control keys + self._space_key = IconKey("icons_mici/settings/keyboard/space.png", char=" ", vertical_align="bottom", icon_size=(43, 14)) + self._caps_key = IconKey("icons_mici/settings/keyboard/caps_lower.png", icon_size=(38, 33)) + # these two are in different places on some layouts + self._123_key, self._123_key2 = SmallKey("123"), SmallKey("123") + self._abc_key = SmallKey("abc") + self._super_special_key = SmallKey("#+=") + + # insert control keys + for keys in (self._lower_keys, self._upper_keys): + keys[2].insert(0, self._caps_key) + keys[2].append(self._123_key) + + for keys in (self._lower_keys, self._upper_keys, self._special_keys, self._super_special_keys): + keys[1].append(self._space_key) + + for keys in (self._special_keys, self._super_special_keys): + keys[2].append(self._abc_key) + + self._special_keys[2].insert(0, self._super_special_key) + self._super_special_keys[2].insert(0, self._123_key2) + + # set initial keys + self._current_keys: list[list[Key]] = [] + self._set_keys(self._lower_keys) + self._caps_state = CapsState.LOWER + self._initialized = False + + self._load_images() + + self._closest_key: tuple[Key | None, float] = None, float('inf') + self._selected_key_t: float | None = None # time key was initially selected + self._unselect_key_t: float | None = None # time to unselect key after release + self._dragging_on_keyboard = False + + self._text: str = "" + + self._bg_scale_filter = BounceFilter(1.0, 0.1 * ANIMATION_SCALE, 1 / gui_app.target_fps) + self._selected_key_filter = FirstOrderFilter(0.0, 0.075 * ANIMATION_SCALE, 1 / gui_app.target_fps) + + def get_candidate_character(self) -> str: + # return str of character about to be added to text + key = self._closest_key[0] + return key.char if key is not None and key.__class__ is Key and self._dragging_on_keyboard else "" + + def get_keyboard_height(self) -> int: + return int(self._txt_bg.height) + + def _load_images(self): + self._txt_bg = gui_app.texture("icons_mici/settings/keyboard/keyboard_background.png", 520, 170, keep_aspect_ratio=False) + + def _set_keys(self, keys: list[list[Key]]): + # inherit previous keys' positions to fix switching animation + for current_row, row in zip(self._current_keys, keys, strict=False): + # not all layouts have the same number of keys + for current_key, key in zip_repeat(current_row, row): + current_pos = current_key.get_position() + # Anchor to the CURRENT keyboard rect before snapping. The non-visible layers are first laid + # out while the host dialog is still sliding in (rect.y high), so their _parent_rect is stale; + # snapping the position filter against that stale anchor then re-anchoring in _lay_out_keys + # made the keys jump into place on the first switch to that layer (shift / 123). + key.set_parent_rect(self._rect) + key.set_position(current_pos[0], current_pos[1], smooth=False) + + self._current_keys = keys + + def set_text(self, text: str): + self._text = text + + def text(self) -> str: + return self._text + + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + keyboard_pos_y = self._rect.y + self._rect.height - self._txt_bg.height + if mouse_event.left_pressed: + if mouse_event.pos.y > keyboard_pos_y: + self._dragging_on_keyboard = True + elif mouse_event.left_released: + self._dragging_on_keyboard = False + + if mouse_event.left_down and self._dragging_on_keyboard: + self._closest_key = self._get_closest_key() + if self._selected_key_t is None: + self._selected_key_t = rl.get_time() + + # unselect key temporarily if mouse goes above keyboard + if mouse_event.pos.y <= keyboard_pos_y: + self._closest_key = (None, float('inf')) + + if DEBUG: + print('HANDLE MOUSE EVENT', mouse_event, self._closest_key[0].char if self._closest_key[0] else 'None') + + def _get_closest_key(self) -> tuple[Key | None, float]: + closest_key: tuple[Key | None, float] = (None, float('inf')) + for row in self._current_keys: + for key in row: + mouse_pos = gui_app.last_mouse_event.pos + # approximate distance for comparison is accurate enough + dist = abs(key.original_position.x - mouse_pos.x) + abs(key.original_position.y - mouse_pos.y) + if dist < closest_key[1]: + if self._closest_key[0] is None or key is self._closest_key[0] or dist < self._closest_key[1] - KEY_DRAG_HYSTERESIS: + closest_key = (key, dist) + return closest_key + + def _set_uppercase(self, cycle: bool): + self._set_keys(self._upper_keys if cycle else self._lower_keys) + if not cycle: + self._caps_state = CapsState.LOWER + self._caps_key.set_icon("icons_mici/settings/keyboard/caps_lower.png", icon_size=(38, 33)) + else: + if self._caps_state == CapsState.LOWER: + self._caps_state = CapsState.UPPER + self._caps_key.set_icon("icons_mici/settings/keyboard/caps_upper.png", icon_size=(38, 33)) + elif self._caps_state == CapsState.UPPER: + self._caps_state = CapsState.LOCK + self._caps_key.set_icon("icons_mici/settings/keyboard/caps_lock.png", icon_size=(39, 38)) + else: + self._set_uppercase(False) + + def _handle_mouse_release(self, mouse_pos: MousePos): + if self._closest_key[0] is not None: + if self._closest_key[0] == self._caps_key: + self._set_uppercase(True) + elif self._closest_key[0] in (self._123_key, self._123_key2): + self._set_keys(self._special_keys) + elif self._closest_key[0] == self._abc_key: + self._set_uppercase(False) + elif self._closest_key[0] == self._super_special_key: + self._set_keys(self._super_special_keys) + else: + self._text += self._closest_key[0].char + + # Reset caps state + if self._caps_state == CapsState.UPPER: + self._set_uppercase(False) + + if self._closest_key[0].char in self._auto_return_to_letters and self._current_keys in (self._special_keys, self._super_special_keys): + self._set_uppercase(False) + + # ensure minimum selected animation time + key_selected_dt = rl.get_time() - (self._selected_key_t or 0) + cur_t = rl.get_time() + self._unselect_key_t = cur_t + KEY_MIN_ANIMATION_TIME if (key_selected_dt < KEY_MIN_ANIMATION_TIME) else cur_t + + def backspace(self): + if self._text: + self._text = self._text[:-1] + + def space(self): + self._text += ' ' + + def _update_state(self): + # update selected key filter + self._selected_key_filter.update(self._closest_key[0] is not None) + + # unselect key after animation plays + if self._unselect_key_t is not None and rl.get_time() > self._unselect_key_t: + self._closest_key = (None, float('inf')) + self._unselect_key_t = None + self._selected_key_t = None + + def _lay_out_keys(self, bg_x, bg_y, keys: list[list[Key]]): + key_rect = rl.Rectangle(bg_x, bg_y, self._txt_bg.width, self._txt_bg.height) + for row_idx, row in enumerate(keys): + padding = KEYBOARD_ROW_PADDING[row_idx] + step_y = (key_rect.height - 2 * KEYBOARD_COLUMN_PADDING) / (len(keys) - 1) + for key_idx, key in enumerate(row): + key_x = key_rect.x + padding + key_idx * ((key_rect.width - 2 * padding) / (len(row) - 1)) + key_y = key_rect.y + KEYBOARD_COLUMN_PADDING + row_idx * step_y + + # Anchor the hit-test grid to the *resting* layout position (before the pop-up animation + # offsets below). Recompute it every frame so it tracks the keyboard's real rect: the host + # dialog slides in from the bottom, so the very first render happens with rect.y far down — + # locking original_position once there put the whole grid below every key and made every + # tap resolve to the top row. + key.original_position = rl.Vector2(key_x, key_y + KEY_TOUCH_AREA_OFFSET) + + if self._closest_key[0] is None: + key.set_alpha(1.0) + key.set_font_size(CHAR_FONT_SIZE) + elif key == self._closest_key[0]: + # push key up with a max and inward so user can see key easier + key_y = max(key_y - 120, 40) + key_x += np.interp(key_x, [self._rect.x, self._rect.x + self._rect.width], [100, -100]) + key.set_alpha(1.0) + key.set_font_size(SELECTED_CHAR_FONT_SIZE) + + # draw black circle behind selected key + circle_alpha = int(self._selected_key_filter.x * 225) + draw_circle_gradient(int(key_x + key.rect.width / 2), int(key_y + key.rect.height / 2), + SELECTED_CHAR_FONT_SIZE, rl.Color(0, 0, 0, circle_alpha), rl.BLANK) + else: + # move other keys away from selected key a bit + dx = key.original_position.x - self._closest_key[0].original_position.x + dy = key.original_position.y - self._closest_key[0].original_position.y + distance_from_selected_key = fast_euclidean_distance(dx, dy) + + inv = 1 / (distance_from_selected_key or 1.0) + ux = dx * inv + uy = dy * inv + + # NOTE: hardcode to 20 to get entire keyboard to move + push_pixels = np.interp(distance_from_selected_key, [0, 250], [20, 0]) + key_x += ux * push_pixels + key_y += uy * push_pixels + + # TODO: slow enough to use an approximation or nah? also caching might work + font_size = np.interp(distance_from_selected_key, [0, 150], [CHAR_NEAR_FONT_SIZE, CHAR_FONT_SIZE]) + + key_alpha = np.interp(distance_from_selected_key, [0, 100], [1.0, 0.35]) + key.set_alpha(key_alpha) + key.set_font_size(font_size) + + # TODO: I like the push amount, so we should clip the pos inside the keyboard rect + key.set_parent_rect(self._rect) + key.set_position(key_x, key_y) + + def _render(self, _): + # draw bg + bg_x = self._rect.x + (self._rect.width - self._txt_bg.width) / 2 + bg_y = self._rect.y + self._rect.height - self._txt_bg.height + + scale = self._bg_scale_filter.update(1.0307692307692307 if self._closest_key[0] is not None else 1.0) + src_rec = rl.Rectangle(0, 0, self._txt_bg.width, self._txt_bg.height) + dest_rec = rl.Rectangle(self._rect.x + self._rect.width / 2 - self._txt_bg.width * scale / 2, bg_y, + self._txt_bg.width * scale, self._txt_bg.height) + + rl.draw_texture_pro(self._txt_bg, src_rec, dest_rec, rl.Vector2(0, 0), 0.0, rl.WHITE) + + # draw keys + if not self._initialized: + for keys in (self._lower_keys, self._upper_keys, self._special_keys, self._super_special_keys): + self._lay_out_keys(bg_x, bg_y, keys) + self._initialized = True + + self._lay_out_keys(bg_x, bg_y, self._current_keys) + for row in self._current_keys: + for key in row: + key.render() diff --git a/iqpilot/system/ui/widgets/nav_widget.py b/iqpilot/system/ui/widgets/nav_widget.py new file mode 100644 index 000000000..8ae29ffc9 --- /dev/null +++ b/iqpilot/system/ui/widgets/nav_widget.py @@ -0,0 +1,260 @@ +from __future__ import annotations + +import abc +import pyray as rl +from collections.abc import Callable +from iqpilot.system.ui.widgets import Widget +from iqpilot.common.filter_simple import BounceFilter, FirstOrderFilter +from iqpilot.system.ui.lib.application import gui_app, MousePos, MouseEvent +from iqpilot.selfdrive.ui.ui_state import device + +SWIPE_AWAY_THRESHOLD = 80 # px to dismiss after releasing +START_DISMISSING_THRESHOLD = 40 # px to start dismissing while dragging +BLOCK_SWIPE_AWAY_THRESHOLD = 60 # px horizontal movement to block swipe away + +NAV_BAR_MARGIN = 6 +NAV_BAR_WIDTH = 205 +NAV_BAR_HEIGHT = 8 + +DISMISS_PUSH_OFFSET = NAV_BAR_MARGIN + NAV_BAR_HEIGHT + 50 # px extra to push down when dismissing +DISMISS_ANIMATION_RC = 0.2 # slightly slower for non-user triggered dismiss animation + + +class NavBar(Widget): + FADE_AFTER_SECONDS = 2.0 + + def __init__(self): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, NAV_BAR_WIDTH, NAV_BAR_HEIGHT)) + self._alpha = 1.0 + self._alpha_filter = FirstOrderFilter(1.0, 0.1, 1 / gui_app.target_fps) + self._fade_time = 0.0 + + def set_alpha(self, alpha: float) -> None: + self._alpha = alpha + self._fade_time = rl.get_time() + + def show_event(self): + super().show_event() + self._alpha = 1.0 + self._alpha_filter.x = 1.0 + self._fade_time = rl.get_time() + + def _render(self, _): + if rl.get_time() - self._fade_time > self.FADE_AFTER_SECONDS: + self._alpha = 0.0 + alpha = self._alpha_filter.update(self._alpha) + + # white bar with black border + rl.draw_rectangle_rounded(self._rect, 1.0, 6, rl.Color(255, 255, 255, int(255 * 0.9 * alpha))) + rl.draw_rectangle_rounded_lines_ex(self._rect, 1.0, 6, 2, rl.Color(0, 0, 0, int(255 * 0.3 * alpha))) + + +class NavWidget(Widget, abc.ABC): + """ + A full screen widget that supports back navigation by swiping down from the top. + """ + BACK_TOUCH_AREA_PERCENTAGE = 0.65 + + def __init__(self): + super().__init__() + # State + self._drag_start_pos: MousePos | None = None # cleared after certain amount of horizontal movement + self._dragging_down = False # swiped down enough to trigger dismissing on release + self._playing_dismiss_animation = False # released and animating away + self._y_pos_filter = BounceFilter(0.0, 0.1, 1 / gui_app.target_fps, bounce=1) + + self._back_callback: Callable[[], None] | None = None # persistent callback for user-initiated back navigation + self._dismiss_callback: Callable[[], None] | None = None # transient callback for programmatic dismiss + # TODO: add this functionality to push_widget + self._shown_callback: Callable[[], None] | None = None # transient callback fired after show animation completes + + # TODO: move this state into NavBar + self._nav_bar = self._child(NavBar()) + self._nav_bar_show_time = 0.0 + self._nav_bar_y_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + + def _back_enabled(self) -> bool: + # Children can override this to block swipe away, like when not at + # the top of a vertical scroll panel to prevent erroneous swipes + return True + + def covers_below(self) -> bool: + # Skip drawing the widgets underneath ONLY when fully settled at the top (idle perf). During + # a swipe/dismiss/slide-in return False so the page below renders and shows through behind the + # moving page, like stock (instead of black). + return (self._rect.y < 1.0 + and self._drag_start_pos is None + and not self._playing_dismiss_animation + and abs(self._y_pos_filter.velocity.x) < 0.5) + + def settle_to_top(self) -> None: + # Snap to the resting (fully-shown) position and cancel any in-flight slide-in animation AND + # any pending swipe/dismiss state. Called when this page is covered or revealed: while covered + # it isn't rendered, so the "if not enabled: clear drag" cleanup in _update_state never runs and + # a drag-start captured just before it was covered (e.g. the press that opened the sub-page) + # would otherwise stick and make the page track the finger the instant it's revealed. + self._y_pos_filter.x = 0.0 + self._y_pos_filter.velocity.x = 0.0 + self._drag_start_pos = None + self._dragging_down = False + self._playing_dismiss_animation = False + self.set_position(self._rect.x, 0.0) + + def set_back_callback(self, callback: Callable[[], None]) -> None: + self._back_callback = callback + + def set_shown_callback(self, callback: Callable[[], None] | None) -> None: + self._shown_callback = callback + + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + super()._handle_mouse_event(mouse_event) + + # Don't let touch events change filter state during dismiss animation + if self._playing_dismiss_animation: + return + + if mouse_event.left_pressed: + # user is able to swipe away if starting near top of screen + self._y_pos_filter.update_alpha(0.04) + in_dismiss_area = mouse_event.pos.y < self._rect.height * self.BACK_TOUCH_AREA_PERCENTAGE + + if in_dismiss_area and self._back_enabled(): + self._drag_start_pos = mouse_event.pos + + elif mouse_event.left_down: + if self._drag_start_pos is not None: + # block swiping away if too much horizontal or upward movement + # block (lock-in) threshold is higher than start dismissing + horizontal_movement = abs(mouse_event.pos.x - self._drag_start_pos.x) > BLOCK_SWIPE_AWAY_THRESHOLD + upward_movement = mouse_event.pos.y - self._drag_start_pos.y < -BLOCK_SWIPE_AWAY_THRESHOLD + + if not (horizontal_movement or upward_movement): + # no blocking movement, check if we should start dismissing + if mouse_event.pos.y - self._drag_start_pos.y > START_DISMISSING_THRESHOLD: + self._dragging_down = True + else: + if not self._dragging_down: + self._drag_start_pos = None + + elif mouse_event.left_released: + # reset rc for either slide up or down animation + self._y_pos_filter.update_alpha(0.1) + + # if far enough, trigger back navigation callback + if self._drag_start_pos is not None: + if mouse_event.pos.y - self._drag_start_pos.y > SWIPE_AWAY_THRESHOLD: + self._playing_dismiss_animation = True + + self._drag_start_pos = None + self._dragging_down = False + + def _update_state(self): + super()._update_state() + + new_y = 0.0 + + if self._dragging_down: + self._nav_bar.set_alpha(1.0) + + # FIXME: disabling this widget on new push_widget still causes this widget to track mouse events without mouse down + if not self.enabled: + self._drag_start_pos = None + + if self._drag_start_pos is not None: + last_mouse_event = gui_app.last_mouse_event + # push entire widget as user drags it away + new_y = max(last_mouse_event.pos.y - self._drag_start_pos.y, 0) + if new_y < SWIPE_AWAY_THRESHOLD: + new_y /= 2 # resistance until mouse release would dismiss widget + + if self._playing_dismiss_animation: + new_y = self._rect.height + DISMISS_PUSH_OFFSET + + new_y = self._y_pos_filter.update(new_y) + if abs(new_y) < 1 and abs(self._y_pos_filter.velocity.x) < 0.5: + new_y = self._y_pos_filter.x = 0.0 + self._y_pos_filter.velocity.x = 0.0 + + if self._shown_callback is not None: + self._shown_callback() + self._shown_callback = None + + if new_y > self._rect.height + DISMISS_PUSH_OFFSET - 10: + gui_app.pop_widget() + + # Only one callback should ever be fired + if self._dismiss_callback is not None: + self._dismiss_callback() + self._dismiss_callback = None + elif self._back_callback is not None: + self._back_callback() + + self._playing_dismiss_animation = False + self._drag_start_pos = None + self._dragging_down = False + + self.set_position(self._rect.x, new_y) + + def _layout(self): + # Only paint THIS widget's own opaque background (from self._rect.y down). The area above + # self._rect.y is the part revealed while swiping down — leave it untouched so the page behind + # renders through at full brightness, matching stock. A previous full-screen dim overlay + # darkened that revealed area to a sliver until the swipe completed; it was also invisible when + # settled (covered by this same black bg), so it only ever hurt the transition. + bounce_height = 20 + rl.draw_rectangle_rec(rl.Rectangle(self._rect.x, self._rect.y, self._rect.width, self._rect.height + bounce_height), rl.BLACK) + + def render(self, rect: rl.Rectangle | None = None) -> bool | int | None: + ret = super().render(rect) + + bar_x = self._rect.x + (self._rect.width - self._nav_bar.rect.width) / 2 + nav_bar_delayed = rl.get_time() - self._nav_bar_show_time < 0.4 + # User dragging or dismissing, nav bar follows NavWidget + if self._drag_start_pos is not None or self._playing_dismiss_animation: + self._nav_bar_y_filter.x = NAV_BAR_MARGIN + self._y_pos_filter.x + # Waiting to show + elif nav_bar_delayed: + self._nav_bar_y_filter.x = -NAV_BAR_MARGIN - NAV_BAR_HEIGHT + # Animate back to top + else: + self._nav_bar_y_filter.update(NAV_BAR_MARGIN) + + self._nav_bar.set_position(bar_x, self._nav_bar_y_filter.x) + self._nav_bar.render() + + return ret + + @property + def is_dismissing(self) -> bool: + return self._dragging_down or self._playing_dismiss_animation + + def dismiss(self, callback: Callable[[], None] | None = None): + """Programmatically trigger the dismiss animation. Calls pop_widget when done, then callback.""" + if not self._playing_dismiss_animation: + self._playing_dismiss_animation = True + self._y_pos_filter.update_alpha(DISMISS_ANIMATION_RC) + self._dismiss_callback = callback + + def show_event(self): + super().show_event() + + # Reset state + self._drag_start_pos = None + self._dragging_down = False + self._playing_dismiss_animation = False + self._dismiss_callback = None + # Start NavWidget off-screen, no matter how tall it is + self._y_pos_filter.update_alpha(0.1) + self._y_pos_filter.x = gui_app.height + self._y_pos_filter.velocity.x = 0.0 + + self._nav_bar_y_filter.x = -NAV_BAR_MARGIN - NAV_BAR_HEIGHT + self._nav_bar_show_time = rl.get_time() + device.set_override_interactive_timeout(300) + + def hide_event(self): + super().hide_event() + active = gui_app.get_active_widget() + if not isinstance(active, NavWidget): + device.set_override_interactive_timeout(None) diff --git a/iqpilot/system/ui/widgets/network.py b/iqpilot/system/ui/widgets/network.py new file mode 100644 index 000000000..566b8ea5d --- /dev/null +++ b/iqpilot/system/ui/widgets/network.py @@ -0,0 +1,581 @@ +from enum import IntEnum +from functools import partial +from collections.abc import Callable +from typing import cast +import threading + +import pyray as rl +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.scroll_panel import GuiScrollPanel +from iqpilot.system.ui.lib.wifi_manager import WifiManager, SecurityType, Network, MeteredType +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import ButtonStyle, Button +from iqpilot.system.ui.widgets.confirm_dialog import ConfirmDialog +from iqpilot.system.ui.widgets.keyboard import Keyboard +from iqpilot.system.ui.widgets.label import gui_label +from iqpilot.system.ui.widgets.scroller_tici import Scroller +from iqpilot.system.ui.widgets.list_view import ButtonAction, ListItem, MultipleButtonAction, ToggleAction, button_item, text_item + +if gui_app.iqpilot_ui(): + from iqpilot.system.ui.iqwidgets.widgets.list_view import button_item + from iqpilot.system.ui.iqwidgets.widgets.list_view import IQListItem as ListItem + from iqpilot.system.ui.iqwidgets.widgets.list_view import IQToggleAction as ToggleAction + from iqpilot.system.ui.iqwidgets.widgets.list_view import IQMultipleButtonAction as MultipleButtonAction + +# These are only used for AdvancedNetworkSettings, standalone apps just need WifiManagerUI +try: + from iqpilot.common.params import Params + from iqpilot.selfdrive.ui.ui_state import ui_state +except Exception: + Params = None + ui_state = None + +NM_DEVICE_STATE_NEED_AUTH = 60 +MIN_PASSWORD_LENGTH = 8 +MAX_PASSWORD_LENGTH = 64 +ITEM_HEIGHT = 160 +ICON_SIZE = 50 + +STRENGTH_ICONS = [ + "icons/wifi_strength_low.png", + "icons/wifi_strength_medium.png", + "icons/wifi_strength_high.png", + "icons/wifi_strength_full.png", +] + +TEAL = rl.Color(16, 185, 169, 255) + + +def draw_spinner(cx: float, cy: float, radius: float, color: rl.Color = TEAL): + """A simple rotating teal arc spinner.""" + ang = (rl.get_time() * 280) % 360 + inner = radius * 0.72 + rl.draw_ring(rl.Vector2(cx, cy), inner, radius, 0, 360, 48, rl.Color(255, 255, 255, 26)) + rl.draw_ring(rl.Vector2(cx, cy), inner, radius, ang, ang + 100, 32, color) + + +class PanelType(IntEnum): + WIFI = 0 + ADVANCED = 1 + ESIM = 2 + + +class UIState(IntEnum): + IDLE = 0 + CONNECTING = 1 + NEEDS_AUTH = 2 + SHOW_FORGET_CONFIRM = 3 + FORGETTING = 4 + DISCONNECTING = 5 + + +class NavButton(Widget): + def __init__(self, text: str | Callable[[], str]): + super().__init__() + self.text = text + self.set_rect(rl.Rectangle(0, 0, 400, 100)) + + def _render(self, _): + color = rl.Color(70, 74, 82, 255) if self.is_pressed else rl.Color(52, 55, 62, 255) + rl.draw_rectangle_rounded(self._rect, 0.6, 10, color) + text = self.text() if callable(self.text) else self.text + gui_label(self.rect, text, font_size=60, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + + +class NetworkUI(Widget): + def __init__(self, wifi_manager: WifiManager): + super().__init__() + self._wifi_manager = wifi_manager + self._current_panel: PanelType = PanelType.WIFI + self._wifi_panel = WifiManagerUI(wifi_manager) + self._advanced_panel = AdvancedNetworkSettings(wifi_manager) + # Imported lazily: the setup zipapp uses WifiManagerUI (never builds NetworkUI), and eagerly + # importing esim -> esim_scanner -> selfdrive.ui.ui_state pulls a cereal SubMaster + typed + # params at import time, which don't exist in the setup zipapp (crashes it -> stuck on IQ logo). + from iqpilot.system.ui.widgets.esim import EsimPanel + self._esim_panel = EsimPanel() + self._back_button = NavButton(lambda: tr("Back")) + self._back_button.set_click_callback(lambda: self._set_current_panel(PanelType.WIFI)) + self._advanced_button = NavButton(lambda: tr("Advanced")) + self._advanced_button.set_click_callback(lambda: self._set_current_panel(PanelType.ADVANCED)) + self._esim_button = NavButton(lambda: tr("eSIM")) + self._esim_button.set_click_callback(lambda: self._set_current_panel(PanelType.ESIM)) + self._esim_supported = False + threading.Thread(target=self._detect_esim_support, daemon=True).start() + + def _detect_esim_support(self): + try: + self._esim_supported = self._esim_panel.is_supported() + except Exception: + self._esim_supported = False + + def show_event(self): + if self._current_panel != PanelType.WIFI: + self._set_current_panel(PanelType.WIFI) + else: + self._wifi_panel.show_event() + + def hide_event(self): + if self._current_panel == PanelType.WIFI: + self._wifi_panel.hide_event() + elif self._current_panel == PanelType.ESIM: + self._esim_panel.hide_event() + + def _render(self, _): + content_rect = rl.Rectangle(self._rect.x, self._rect.y + self._back_button.rect.height + 40, + self._rect.width, self._rect.height - self._back_button.rect.height - 40) + if self._current_panel == PanelType.WIFI: + self._wifi_panel.render(content_rect) + right_x = self._rect.x + self._rect.width - self._advanced_button.rect.width + self._advanced_button.set_position(right_x, self._rect.y + 20) + self._advanced_button.render() + if self._esim_supported: + esim_x = right_x - self._esim_button.rect.width - 20 + self._esim_button.set_position(esim_x, self._rect.y + 20) + self._esim_button.render() + elif self._current_panel == PanelType.ESIM: + self._back_button.set_position(self._rect.x, self._rect.y + 20) + self._back_button.render() + self._esim_panel.render(content_rect) + else: + self._back_button.set_position(self._rect.x, self._rect.y + 20) + self._back_button.render() + self._advanced_panel.render(content_rect) + + def _set_current_panel(self, panel: PanelType): + if panel == self._current_panel: + return + + if self._current_panel == PanelType.WIFI: + self._wifi_panel.hide_event() + elif self._current_panel == PanelType.ESIM: + self._esim_panel.hide_event() + + self._current_panel = panel + + if self._current_panel == PanelType.WIFI: + self._wifi_panel.show_event() + elif self._current_panel == PanelType.ESIM: + self._esim_panel.show_event() + + +class AdvancedNetworkSettings(Widget): + def __init__(self, wifi_manager: WifiManager): + super().__init__() + self._wifi_manager = wifi_manager + self._wifi_manager.add_callbacks(networks_updated=self._on_network_updated) + self._params = Params() + + self._keyboard = Keyboard(max_text_size=MAX_PASSWORD_LENGTH, min_text_size=MIN_PASSWORD_LENGTH, show_password_toggle=True) + + # Tethering + self._tethering_action = ToggleAction(initial_state=False) + tethering_btn = ListItem(lambda: tr("Enable Tethering"), action_item=self._tethering_action, callback=self._toggle_tethering) + + # Edit tethering password + self._tethering_password_action = ButtonAction(lambda: tr("EDIT")) + tethering_password_btn = ListItem(lambda: tr("Tethering Password"), action_item=self._tethering_password_action, callback=self._edit_tethering_password) + + # Roaming toggle + roaming_enabled = self._params.get_bool("GsmRoaming") + self._roaming_action = ToggleAction(initial_state=roaming_enabled) + self._roaming_btn = ListItem(lambda: tr("Enable Roaming"), action_item=self._roaming_action, callback=self._toggle_roaming) + + # Cellular metered toggle + cellular_metered = self._params.get_bool("GsmMetered") + self._cellular_metered_action = ToggleAction(initial_state=cellular_metered) + self._cellular_metered_btn = ListItem(lambda: tr("Cellular Metered"), + description=lambda: tr("Prevent large data uploads when on a metered cellular connection"), + action_item=self._cellular_metered_action, callback=self._toggle_cellular_metered) + + # APN setting + self._apn_btn = button_item(lambda: tr("APN Setting"), lambda: tr("EDIT"), callback=self._edit_apn) + + # Wi-Fi metered toggle + self._wifi_metered_action = MultipleButtonAction([lambda: tr("default"), lambda: tr("metered"), lambda: tr("unmetered")], 255, 0, + callback=self._toggle_wifi_metered) + wifi_metered_btn = ListItem(lambda: tr("Wi-Fi Network Metered"), description=lambda: tr("Prevent large data uploads when on a metered Wi-Fi connection"), + action_item=self._wifi_metered_action) + + items: list[Widget] = [ + tethering_btn, + tethering_password_btn, + text_item(lambda: tr("IP Address"), lambda: self._wifi_manager.ipv4_address), + self._roaming_btn, + self._apn_btn, + self._cellular_metered_btn, + wifi_metered_btn, + button_item(lambda: tr("Hidden Network"), lambda: tr("CONNECT"), callback=self._connect_to_hidden_network), + ] + + self._scroller = Scroller(items, line_separator=True, spacing=0) + + # Set initial config + metered = self._params.get_bool("GsmMetered") + self._wifi_manager.update_gsm_settings(roaming_enabled, self._params.get("GsmApn") or "", metered) + + def _on_network_updated(self, networks: list[Network]): + self._tethering_action.set_enabled(True) + self._tethering_action.set_state(self._wifi_manager.is_tethering_active()) + self._tethering_password_action.set_enabled(True) + + if self._wifi_manager.is_tethering_active() or self._wifi_manager.ipv4_address == "": + self._wifi_metered_action.set_enabled(False) + self._wifi_metered_action.selected_button = 0 + elif self._wifi_manager.ipv4_address != "": + metered = self._wifi_manager.current_network_metered + self._wifi_metered_action.set_enabled(True) + self._wifi_metered_action.selected_button = int(metered) if metered in (MeteredType.UNKNOWN, MeteredType.YES, MeteredType.NO) else 0 + + def _toggle_tethering(self): + checked = self._tethering_action.get_state() + self._tethering_action.set_enabled(False) + if checked: + self._wifi_metered_action.set_enabled(False) + self._wifi_manager.set_tethering_active(checked) + + def _toggle_roaming(self): + roaming_state = self._roaming_action.get_state() + self._params.put_bool("GsmRoaming", roaming_state) + self._wifi_manager.update_gsm_settings(roaming_state, self._params.get("GsmApn") or "", self._params.get_bool("GsmMetered")) + + def _edit_apn(self): + def update_apn(result): + if result != 1: + return + + apn = self._keyboard.text.strip() + if apn == "": + self._params.remove("GsmApn") + else: + self._params.put("GsmApn", apn) + + self._wifi_manager.update_gsm_settings(self._params.get_bool("GsmRoaming"), apn, self._params.get_bool("GsmMetered")) + + current_apn = self._params.get("GsmApn") or "" + self._keyboard.reset(min_text_size=0) + self._keyboard.set_title(tr("Enter APN"), tr("leave blank for automatic configuration")) + self._keyboard.set_text(current_apn) + gui_app.set_modal_overlay(self._keyboard, update_apn) + + def _toggle_cellular_metered(self): + metered = self._cellular_metered_action.get_state() + self._params.put_bool("GsmMetered", metered) + self._wifi_manager.update_gsm_settings(self._params.get_bool("GsmRoaming"), self._params.get("GsmApn") or "", metered) + + def _toggle_wifi_metered(self, metered): + metered_type = {0: MeteredType.UNKNOWN, 1: MeteredType.YES, 2: MeteredType.NO}.get(metered, MeteredType.UNKNOWN) + self._wifi_metered_action.set_enabled(False) + self._wifi_manager.set_current_network_metered(metered_type) + + def _connect_to_hidden_network(self): + def connect_hidden(result): + if result != 1: + return + + ssid = self._keyboard.text + if not ssid: + return + + def enter_password(result): + password = self._keyboard.text + if password == "": + # connect without password + self._wifi_manager.connect_to_network(ssid, "", hidden=True) + return + + self._wifi_manager.connect_to_network(ssid, password, hidden=True) + + self._keyboard.reset(min_text_size=0) + self._keyboard.set_title(tr("Enter password"), tr("for \"{}\"").format(ssid)) + gui_app.set_modal_overlay(self._keyboard, enter_password) + + self._keyboard.reset(min_text_size=1) + self._keyboard.set_title(tr("Enter SSID"), "") + gui_app.set_modal_overlay(self._keyboard, connect_hidden) + + def _edit_tethering_password(self): + def update_password(result): + if result != 1: + return + + password = self._keyboard.text + self._wifi_manager.set_tethering_password(password) + self._tethering_password_action.set_enabled(False) + + self._keyboard.reset(min_text_size=MIN_PASSWORD_LENGTH) + self._keyboard.set_title(tr("Enter new tethering password"), "") + self._keyboard.set_text(self._wifi_manager.tethering_password) + gui_app.set_modal_overlay(self._keyboard, update_password) + + def _update_state(self): + self._wifi_manager.process_callbacks() + + # konn3kt has no managed cellular SIM, so always expose the GSM/APN settings. + show_cell_settings = True + self._wifi_manager.set_ipv4_forward(show_cell_settings) + self._roaming_btn.set_visible(show_cell_settings) + self._apn_btn.set_visible(show_cell_settings) + self._cellular_metered_btn.set_visible(show_cell_settings) + + def _render(self, _): + self._scroller.render(self._rect) + + +class WifiManagerUI(Widget): + def __init__(self, wifi_manager: WifiManager): + super().__init__() + self._wifi_manager = wifi_manager + self.state: UIState = UIState.IDLE + self._state_network: Network | None = None # for CONNECTING / NEEDS_AUTH / SHOW_FORGET_CONFIRM / FORGETTING + self._password_retry: bool = False # for NEEDS_AUTH + self.btn_width: int = 200 + self.disconnect_btn_width: int = 300 + self.scroll_panel = GuiScrollPanel() + self.keyboard = Keyboard(max_text_size=MAX_PASSWORD_LENGTH, min_text_size=MIN_PASSWORD_LENGTH, show_password_toggle=True) + self._load_icons() + + self._networks: list[Network] = [] + self._networks_buttons: dict[str, Button] = {} + self._forget_networks_buttons: dict[str, Button] = {} + self._disconnect_networks_buttons: dict[str, Button] = {} + + self._wifi_manager.add_callbacks(need_auth=self._on_need_auth, + activated=self._on_activated, + forgotten=self._on_forgotten, + networks_updated=self._on_network_updated, + disconnected=self._on_disconnected) + + def show_event(self): + # start/stop scanning when widget is visible + self._wifi_manager.set_active(True) + + def hide_event(self): + self._wifi_manager.set_active(False) + + def _load_icons(self): + for icon in STRENGTH_ICONS + ["icons/checkmark.png", "icons/circled_slash.png", "icons/lock_closed.png"]: + gui_app.texture(icon, ICON_SIZE, ICON_SIZE) + + def _update_state(self): + self._wifi_manager.process_callbacks() + + def _render(self, rect: rl.Rectangle): + if not self._networks: + cx = rect.x + rect.width / 2 + cy = rect.y + rect.height / 2 + if self._wifi_manager.is_scanning: + draw_spinner(cx, cy - 50, 46) + gui_label(rl.Rectangle(rect.x, cy + 2, rect.width, 90), tr("Scanning Wi-Fi networks..."), 60, + color=rl.Color(190, 190, 195, 255), alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + else: + gui_label(rl.Rectangle(rect.x, cy - 45, rect.width, 90), tr("No Wi-Fi networks found"), 60, + color=rl.Color(150, 150, 155, 255), alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + return + + if self.state == UIState.NEEDS_AUTH and self._state_network: + self.keyboard.set_title(tr("Wrong password") if self._password_retry else tr("Enter password"), tr("for \"{}\"").format(self._state_network.ssid)) + self.keyboard.reset(min_text_size=MIN_PASSWORD_LENGTH) + gui_app.set_modal_overlay(self.keyboard, lambda result: self._on_password_entered(cast(Network, self._state_network), result)) + elif self.state == UIState.SHOW_FORGET_CONFIRM and self._state_network: + confirm_dialog = ConfirmDialog("", tr("Forget"), tr("Cancel")) + confirm_dialog.set_text(tr("Forget Wi-Fi Network \"{}\"?").format(self._state_network.ssid)) + confirm_dialog.reset() + gui_app.set_modal_overlay(confirm_dialog, callback=lambda result: self.on_forgot_confirm_finished(self._state_network, result)) + else: + self._draw_network_list(rect) + + def _on_password_entered(self, network: Network, result: int): + if result == 1: + password = self.keyboard.text + self.keyboard.clear() + + if len(password) >= MIN_PASSWORD_LENGTH: + self.connect_to_network(network, password) + elif result == 0: + self.state = UIState.IDLE + + def on_forgot_confirm_finished(self, network, result: int): + if result == 1: + self.forget_network(network) + elif result == 0: + self.state = UIState.IDLE + + def _draw_network_list(self, rect: rl.Rectangle): + content_rect = rl.Rectangle(rect.x, rect.y, rect.width, len(self._networks) * ITEM_HEIGHT) + offset = self.scroll_panel.update(rect, content_rect) + + rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height)) + for i, network in enumerate(self._networks): + y_offset = rect.y + i * ITEM_HEIGHT + offset + item_rect = rl.Rectangle(rect.x, y_offset, rect.width, ITEM_HEIGHT) + if not rl.check_collision_recs(item_rect, rect): + continue + + self._draw_network_item(item_rect, network) + if i < len(self._networks) - 1: + line_y = int(item_rect.y + item_rect.height - 1) + rl.draw_line(int(item_rect.x), int(line_y), int(item_rect.x + item_rect.width), line_y, rl.LIGHTGRAY) + + rl.end_scissor_mode() + + def _draw_network_item(self, rect, network: Network): + spacing = 50 + show_disconnect = network.is_connected and self.state not in (UIState.CONNECTING, UIState.DISCONNECTING) + reserved = self.btn_width * 2 + (self.disconnect_btn_width + spacing if show_disconnect else 0) + ssid_rect = rl.Rectangle(rect.x, rect.y, rect.width - reserved, ITEM_HEIGHT) + signal_icon_rect = rl.Rectangle(rect.x + rect.width - ICON_SIZE, rect.y + (ITEM_HEIGHT - ICON_SIZE) / 2, ICON_SIZE, ICON_SIZE) + security_icon_rect = rl.Rectangle(signal_icon_rect.x - spacing - ICON_SIZE, rect.y + (ITEM_HEIGHT - ICON_SIZE) / 2, ICON_SIZE, ICON_SIZE) + + # Teal accent bar on the connected network + if network.is_connected and self.state != UIState.CONNECTING: + rl.draw_rectangle_rounded(rl.Rectangle(rect.x, rect.y + (ITEM_HEIGHT - 72) / 2, 6, 72), 1.0, 4, TEAL) + + status_text = "" + if self.state == UIState.CONNECTING and self._state_network: + if self._state_network.ssid == network.ssid: + self._networks_buttons[network.ssid].set_enabled(False) + status_text = tr("CONNECTING...") + elif self.state == UIState.FORGETTING and self._state_network: + if self._state_network.ssid == network.ssid: + self._networks_buttons[network.ssid].set_enabled(False) + status_text = tr("FORGETTING...") + elif self.state == UIState.DISCONNECTING and self._state_network: + if self._state_network.ssid == network.ssid: + self._networks_buttons[network.ssid].set_enabled(False) + status_text = tr("DISCONNECTING...") + elif network.security_type == SecurityType.UNSUPPORTED: + self._networks_buttons[network.ssid].set_enabled(False) + else: + self._networks_buttons[network.ssid].set_enabled(True) + + self._networks_buttons[network.ssid].render(ssid_rect) + + if status_text: + status_text_rect = rl.Rectangle(security_icon_rect.x - 410, rect.y, 410, ITEM_HEIGHT) + gui_label(status_text_rect, status_text, font_size=48, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) + else: + # If the network is saved, show the "Forget" button + if network.is_saved: + forget_btn_rect = rl.Rectangle( + security_icon_rect.x - self.btn_width - spacing, + rect.y + (ITEM_HEIGHT - 80) / 2, + self.btn_width, + 80, + ) + self._forget_networks_buttons[network.ssid].render(forget_btn_rect) + + if show_disconnect: + disconnect_btn_rect = rl.Rectangle( + forget_btn_rect.x - self.disconnect_btn_width - spacing, + forget_btn_rect.y, + self.disconnect_btn_width, + 80, + ) + self._disconnect_networks_buttons[network.ssid].render(disconnect_btn_rect) + + self._draw_status_icon(security_icon_rect, network) + self._draw_signal_strength_icon(signal_icon_rect, network) + + def _networks_buttons_callback(self, network): + if not network.is_saved and network.security_type != SecurityType.OPEN: + self.state = UIState.NEEDS_AUTH + self._state_network = network + self._password_retry = False + elif not network.is_connected: + self.connect_to_network(network) + + def _forget_networks_buttons_callback(self, network): + self.state = UIState.SHOW_FORGET_CONFIRM + self._state_network = network + + def _disconnect_networks_buttons_callback(self, network): + self.disconnect_network(network) + + def _draw_status_icon(self, rect, network: Network): + """Draw the status icon based on network's connection state""" + icon_file = None + if network.is_connected and self.state != UIState.CONNECTING: + icon_file = "icons/checkmark.png" + elif network.security_type == SecurityType.UNSUPPORTED: + icon_file = "icons/circled_slash.png" + elif network.security_type != SecurityType.OPEN: + icon_file = "icons/lock_closed.png" + + if not icon_file: + return + + texture = gui_app.texture(icon_file, ICON_SIZE, ICON_SIZE) + icon_rect = rl.Vector2(rect.x, rect.y + (ICON_SIZE - texture.height) / 2) + tint = TEAL if (network.is_connected and self.state != UIState.CONNECTING) else rl.WHITE + rl.draw_texture_v(texture, icon_rect, tint) + + def _draw_signal_strength_icon(self, rect: rl.Rectangle, network: Network): + """Draw the Wi-Fi signal strength icon based on network's signal strength""" + strength_level = max(0, min(3, round(network.strength / 33.0))) + rl.draw_texture_v(gui_app.texture(STRENGTH_ICONS[strength_level], ICON_SIZE, ICON_SIZE), rl.Vector2(rect.x, rect.y), rl.WHITE) + + def connect_to_network(self, network: Network, password=''): + self.state = UIState.CONNECTING + self._state_network = network + if network.is_saved and not password: + self._wifi_manager.activate_connection(network.ssid) + else: + self._wifi_manager.connect_to_network(network.ssid, password, security_type=network.security_type) + + def forget_network(self, network: Network): + self.state = UIState.FORGETTING + self._state_network = network + self._wifi_manager.forget_connection(network.ssid) + + def disconnect_network(self, network: Network): + self.state = UIState.DISCONNECTING + self._state_network = network + self._wifi_manager.disconnect_connection(network.ssid) + + def _on_network_updated(self, networks: list[Network]): + self._networks = networks + for n in self._networks: + self._networks_buttons[n.ssid] = Button(n.ssid, partial(self._networks_buttons_callback, n), font_size=55, + text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT) + self._networks_buttons[n.ssid].set_touch_valid_callback(lambda: self.scroll_panel.is_touch_valid()) + self._forget_networks_buttons[n.ssid] = Button(tr("Forget"), partial(self._forget_networks_buttons_callback, n), button_style=ButtonStyle.FORGET_WIFI, + font_size=45) + self._forget_networks_buttons[n.ssid].set_touch_valid_callback(lambda: self.scroll_panel.is_touch_valid()) + self._disconnect_networks_buttons[n.ssid] = Button(tr("Disconnect"), partial(self._disconnect_networks_buttons_callback, n), + button_style=ButtonStyle.FORGET_WIFI, font_size=45) + self._disconnect_networks_buttons[n.ssid].set_touch_valid_callback(lambda: self.scroll_panel.is_touch_valid()) + + def _on_need_auth(self, ssid): + network = next((n for n in self._networks if n.ssid == ssid), None) + if network: + self.state = UIState.NEEDS_AUTH + self._state_network = network + self._password_retry = True + + def _on_activated(self): + if self.state == UIState.CONNECTING: + self.state = UIState.IDLE + + def _on_forgotten(self): + if self.state == UIState.FORGETTING: + self.state = UIState.IDLE + + def _on_disconnected(self): + if self.state in (UIState.CONNECTING, UIState.DISCONNECTING): + self.state = UIState.IDLE + + +def main(): + gui_app.init_window("Wi-Fi Manager") + wifi_ui = WifiManagerUI(WifiManager()) + + for _ in gui_app.render(): + wifi_ui.render(rl.Rectangle(50, 50, gui_app.width - 100, gui_app.height - 100)) + + gui_app.close() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/ui/widgets/option_dialog.py b/iqpilot/system/ui/widgets/option_dialog.py new file mode 100644 index 000000000..bf8879067 --- /dev/null +++ b/iqpilot/system/ui/widgets/option_dialog.py @@ -0,0 +1,108 @@ +import pyray as rl +from iqpilot.system.ui.lib.application import FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import Widget, DialogResult +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.widgets.label import gui_label +from iqpilot.system.ui.widgets.scroller_tici import Scroller + +# Constants +MARGIN = 50 +TITLE_FONT_SIZE = 70 +ITEM_HEIGHT = 135 +BUTTON_SPACING = 50 +BUTTON_HEIGHT = 160 +ITEM_SPACING = 50 +LIST_ITEM_SPACING = 25 + +TEAL = rl.Color(16, 185, 169, 255) +OPTION_RADIUS = 28 +DIALOG_BTN_RADIUS = 44 +DISABLED_BTN_COLOR = rl.Color(45, 47, 52, 255) + + +def _latin_only(s: str) -> bool: + # Names within Latin + Latin-1 + Latin Extended-A render cleanly in the normal UI font. + return all(ord(c) < 0x250 for c in s) + + +class _OptionButton(Button): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.selected = False + self._border_radius = OPTION_RADIUS + + def _render(self, _): + if self.selected: + roundness = self._border_radius / (min(self._rect.width, self._rect.height) / 2) + rl.draw_rectangle_rounded(self._rect, roundness, 10, TEAL) + self._label.render(self._rect) + else: + super()._render(_) + + +class MultiOptionDialog(Widget): + def __init__(self, title, options, current="", option_font_weight=FontWeight.MEDIUM): + super().__init__() + self.title = title + self.options = options + self.current = current + self.selection = current + self._result: DialogResult = DialogResult.NO_ACTION + + # Create scroller with option buttons. Latin names use the normal font; everything + # else (CJK, Cyrillic, Arabic, ...) keeps the broad-coverage font passed by the caller. + self.option_buttons = [_OptionButton(option, click_callback=lambda opt=option: self._on_option_clicked(opt), + font_weight=(FontWeight.MEDIUM if _latin_only(option) else option_font_weight), + text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT, button_style=ButtonStyle.NORMAL, + text_padding=50, elide_right=True) for option in options] + self.scroller = Scroller(self.option_buttons, spacing=LIST_ITEM_SPACING) + + self.cancel_button = Button(lambda: tr("Cancel"), click_callback=lambda: self._set_result(DialogResult.CANCEL)) + self.select_button = Button(lambda: tr("Select"), click_callback=lambda: self._set_result(DialogResult.CONFIRM), + button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT) + self.cancel_button._border_radius = DIALOG_BTN_RADIUS + self.select_button._border_radius = DIALOG_BTN_RADIUS + + def _set_result(self, result: DialogResult): + self._result = result + + def _on_option_clicked(self, option): + self.selection = option + + def _render(self, rect): + dialog_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - 2 * MARGIN, rect.height - 2 * MARGIN) + rl.draw_rectangle_rounded(dialog_rect, 0.02, 20, rl.Color(30, 30, 30, 255)) + + content_rect = rl.Rectangle(dialog_rect.x + MARGIN, dialog_rect.y + MARGIN, + dialog_rect.width - 2 * MARGIN, dialog_rect.height - 2 * MARGIN) + + gui_label(rl.Rectangle(content_rect.x, content_rect.y, content_rect.width, TITLE_FONT_SIZE), self.title, 70, font_weight=FontWeight.BOLD) + + # Options area + options_y = content_rect.y + TITLE_FONT_SIZE + ITEM_SPACING + options_h = content_rect.height - TITLE_FONT_SIZE - BUTTON_HEIGHT - 2 * ITEM_SPACING + options_rect = rl.Rectangle(content_rect.x, options_y, content_rect.width, options_h) + + # Mark the selected option (teal highlight handled by _OptionButton) + for i, option in enumerate(self.options): + self.option_buttons[i].selected = (option == self.selection) + self.option_buttons[i].set_rect(rl.Rectangle(0, 0, options_rect.width, ITEM_HEIGHT)) + + self.scroller.render(options_rect) + + # Buttons + button_y = content_rect.y + content_rect.height - BUTTON_HEIGHT + button_w = (content_rect.width - BUTTON_SPACING) / 2 + + cancel_rect = rl.Rectangle(content_rect.x, button_y, button_w, BUTTON_HEIGHT) + self.cancel_button.render(cancel_rect) + + select_rect = rl.Rectangle(content_rect.x + button_w + BUTTON_SPACING, button_y, button_w, BUTTON_HEIGHT) + select_enabled = self.selection != self.current + self.select_button.set_enabled(select_enabled) + sr = DIALOG_BTN_RADIUS / (min(select_rect.width, select_rect.height) / 2) + rl.draw_rectangle_rounded(select_rect, sr, 10, TEAL if select_enabled else DISABLED_BTN_COLOR) + self.select_button.render(select_rect) + + return self._result diff --git a/iqpilot/system/ui/widgets/scroller.py b/iqpilot/system/ui/widgets/scroller.py new file mode 100644 index 000000000..46902900a --- /dev/null +++ b/iqpilot/system/ui/widgets/scroller.py @@ -0,0 +1,387 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import pyray as rl +import numpy as np +from collections.abc import Callable + +from iqpilot.common.filter_simple import FirstOrderFilter, BounceFilter +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.scroll_panel2 import GuiScrollPanel2, ScrollState +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.nav_widget import NavWidget + +ITEM_SPACING = 20 +LINE_COLOR = rl.GRAY +LINE_PADDING = 40 +ANIMATION_SCALE = 0.6 +PAGE_SLIDER_MARGIN = 18 +PAGE_SLIDER_GLOW_W = 360 +PAGE_SLIDER_GLOW_H = 18 +PAGE_SLIDER_PEAK = 220 +PAGE_SLIDER_END_TAPER = 95 +PAGE_EDGE_FADE_W = 55 + +MIN_ZOOM_ANIMATION_TIME = 0.075 # seconds +DO_ZOOM = False +DO_JELLO = False +SCROLL_BAR = False + + +class LineSeparator(Widget): + def __init__(self, height: int = 1): + super().__init__() + self._rect = rl.Rectangle(0, 0, 0, height) + + def set_parent_rect(self, parent_rect: rl.Rectangle) -> None: + super().set_parent_rect(parent_rect) + self._rect.width = parent_rect.width + + def _render(self, _): + rl.draw_line(int(self._rect.x) + LINE_PADDING, int(self._rect.y), + int(self._rect.x + self._rect.width) - LINE_PADDING, int(self._rect.y), + LINE_COLOR) + + +class Scroller(Widget): + def __init__(self, items: list[Widget], horizontal: bool = True, snap_items: bool = True, spacing: int = ITEM_SPACING, + line_separator: bool = False, pad_start: int = ITEM_SPACING, pad_end: int = ITEM_SPACING): + super().__init__() + self._items: list[Widget] = [] + self._horizontal = horizontal + self._snap_items = snap_items + self._spacing = spacing + self._line_separator = LineSeparator() if line_separator else None + self._pad_start = pad_start + self._pad_end = pad_end + + self._reset_scroll_at_show = True + + self._scrolling_to: float | None = None + self._scroll_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps) + self._zoom_filter = FirstOrderFilter(1.0, 0.2, 1 / gui_app.target_fps) + self._zoom_out_t: float = 0.0 + + # layout state + self._visible_items: list[Widget] = [] + self._content_size: float = 0.0 + self._scroll_offset: float = 0.0 + + self._item_pos_filter = BounceFilter(0.0, 0.05, 1 / gui_app.target_fps) + + # when not pressed, snap to closest item to be center + self._scroll_snap_filter = FirstOrderFilter(0.0, 0.05, 1 / gui_app.target_fps) + + self.scroll_panel = GuiScrollPanel2(self._horizontal, handle_out_of_bounds=not self._snap_items) + self._scroll_enabled: bool | Callable[[], bool] = True + + self._txt_scroll_indicator = gui_app.texture("icons_mici/settings/vertical_scroll_indicator.png", 40, 80) + + for item in items: + self.add_widget(item) + + def set_reset_scroll_at_show(self, scroll: bool): + self._reset_scroll_at_show = scroll + + def scroll_to(self, pos: float, smooth: bool = False): + # already there + if abs(pos) < 1: + return + + # FIXME: the padding correction doesn't seem correct + scroll_offset = self.scroll_panel.get_offset() - pos + if smooth: + self._scrolling_to = scroll_offset + else: + self.scroll_panel.set_offset(scroll_offset) + + @property + def is_auto_scrolling(self) -> bool: + return self._scrolling_to is not None + + def add_widget(self, item: Widget) -> None: + self._items.append(item) + item.set_touch_valid_callback(lambda: self.scroll_panel.is_touch_valid() and self.enabled) + + def add_widgets(self, items: list[Widget]) -> None: + for item in items: + self.add_widget(item) + + @property + def items(self) -> list[Widget]: + return self._items + + def move_item(self, from_idx: int, to_idx: int): + if from_idx == to_idx or not (0 <= from_idx < len(self._items)): + return + self._items.insert(to_idx, self._items.pop(from_idx)) + + def set_scrolling_enabled(self, enabled: bool | Callable[[], bool]) -> None: + """Set whether scrolling is enabled (does not affect widget enabled state).""" + self._scroll_enabled = enabled + + def _update_state(self): + if DO_ZOOM: + if self._scrolling_to is not None or self.scroll_panel.state != ScrollState.STEADY: + self._zoom_out_t = rl.get_time() + MIN_ZOOM_ANIMATION_TIME + self._zoom_filter.update(0.85) + else: + if self._zoom_out_t is not None: + if rl.get_time() > self._zoom_out_t: + self._zoom_filter.update(1.0) + else: + self._zoom_filter.update(0.85) + + # Cancel auto-scroll if user starts manually scrolling + if self._scrolling_to is not None and (self.scroll_panel.state == ScrollState.PRESSED or self.scroll_panel.state == ScrollState.MANUAL_SCROLL): + self._scrolling_to = None + + if self._scrolling_to is not None: + self._scroll_filter.update(self._scrolling_to) + self.scroll_panel.set_offset(self._scroll_filter.x) + + if abs(self._scroll_filter.x - self._scrolling_to) < 1: + self.scroll_panel.set_offset(self._scrolling_to) + self._scrolling_to = None + else: + # keep current scroll position up to date + self._scroll_filter.x = self.scroll_panel.get_offset() + + def _get_scroll(self, visible_items: list[Widget], content_size: float) -> float: + scroll_enabled = self._scroll_enabled() if callable(self._scroll_enabled) else self._scroll_enabled + self.scroll_panel.set_enabled(scroll_enabled and self.enabled) + self.scroll_panel.update(self._rect, content_size) + if not self._snap_items: + return round(self.scroll_panel.get_offset()) + + # Snap closest item to center + center_pos = self._rect.x + self._rect.width / 2 if self._horizontal else self._rect.y + self._rect.height / 2 + closest_delta_pos = float('inf') + scroll_snap_idx: int | None = None + for idx, item in enumerate(visible_items): + if self._horizontal: + delta_pos = (item.rect.x + item.rect.width / 2) - center_pos + else: + delta_pos = (item.rect.y + item.rect.height / 2) - center_pos + if abs(delta_pos) < abs(closest_delta_pos): + closest_delta_pos = delta_pos + scroll_snap_idx = idx + + if scroll_snap_idx is not None: + snap_item = visible_items[scroll_snap_idx] + if self.is_pressed: + # no snapping until released + self._scroll_snap_filter.x = 0 + else: + # TODO: this doesn't handle two small buttons at the edges well + if self._horizontal: + snap_delta_pos = (center_pos - (snap_item.rect.x + snap_item.rect.width / 2)) / 10 + snap_delta_pos = min(snap_delta_pos, -self.scroll_panel.get_offset() / 10) + snap_delta_pos = max(snap_delta_pos, (self._rect.width - self.scroll_panel.get_offset() - content_size) / 10) + else: + snap_delta_pos = (center_pos - (snap_item.rect.y + snap_item.rect.height / 2)) / 10 + snap_delta_pos = min(snap_delta_pos, -self.scroll_panel.get_offset() / 10) + snap_delta_pos = max(snap_delta_pos, (self._rect.height - self.scroll_panel.get_offset() - content_size) / 10) + self._scroll_snap_filter.update(snap_delta_pos) + + self.scroll_panel.set_offset(self.scroll_panel.get_offset() + self._scroll_snap_filter.x) + + return self.scroll_panel.get_offset() + + def _layout(self): + self._visible_items = [item for item in self._items if item.is_visible] + + # Add line separator between items + if self._line_separator is not None: + l = len(self._visible_items) + for i in range(1, len(self._visible_items)): + self._visible_items.insert(l - i, self._line_separator) + + self._content_size = sum(item.rect.width if self._horizontal else item.rect.height for item in self._visible_items) + self._content_size += self._spacing * (len(self._visible_items) - 1) + self._content_size += self._pad_start + self._pad_end + + self._scroll_offset = self._get_scroll(self._visible_items, self._content_size) + + rl.begin_scissor_mode(int(self._rect.x), int(self._rect.y), + int(self._rect.width), int(self._rect.height)) + + self._item_pos_filter.update(self._scroll_offset) + + cur_pos = 0 + for idx, item in enumerate(self._visible_items): + spacing = self._spacing if (idx > 0) else self._pad_start + # Nicely lay out items horizontally/vertically + if self._horizontal: + x = self._rect.x + cur_pos + spacing + y = self._rect.y + (self._rect.height - item.rect.height) / 2 + cur_pos += item.rect.width + spacing + else: + x = self._rect.x + (self._rect.width - item.rect.width) / 2 + y = self._rect.y + cur_pos + spacing + cur_pos += item.rect.height + spacing + + # Consider scroll + if self._horizontal: + x += self._scroll_offset + else: + y += self._scroll_offset + + # Add some jello effect when scrolling + if DO_JELLO: + if self._horizontal: + cx = self._rect.x + self._rect.width / 2 + jello_offset = self._scroll_offset - np.interp(x + item.rect.width / 2, + [self._rect.x, cx, self._rect.x + self._rect.width], + [self._item_pos_filter.x, self._scroll_offset, self._item_pos_filter.x]) + x -= np.clip(jello_offset, -20, 20) + else: + cy = self._rect.y + self._rect.height / 2 + jello_offset = self._scroll_offset - np.interp(y + item.rect.height / 2, + [self._rect.y, cy, self._rect.y + self._rect.height], + [self._item_pos_filter.x, self._scroll_offset, self._item_pos_filter.x]) + y -= np.clip(jello_offset, -20, 20) + + # Update item state + item.set_position(round(x), round(y)) # round to prevent jumping when settling + item.set_parent_rect(self._rect) + + def _render(self, _): + for item in self._visible_items: + item_visible = rl.check_collision_recs(item.rect, self._rect) + if hasattr(item, "set_scroll_active"): + item.set_scroll_active(item_visible) + + # Skip rendering if not in viewport + if not item_visible: + continue + + # Scale each element around its own origin when scrolling + scale = self._zoom_filter.x + if scale != 1.0: + rl.rl_push_matrix() + rl.rl_scalef(scale, scale, 1.0) + rl.rl_translatef((1 - scale) * (item.rect.x + item.rect.width / 2) / scale, + (1 - scale) * (item.rect.y + item.rect.height / 2) / scale, 0) + item.render() + rl.rl_pop_matrix() + else: + item.render() + + # Draw scroll indicator + if SCROLL_BAR and not self._horizontal and len(self._visible_items) > 0: + _real_content_size = self._content_size - self._rect.height + self._txt_scroll_indicator.height + scroll_bar_y = -self._scroll_offset / _real_content_size * self._rect.height + scroll_bar_y = min(max(scroll_bar_y, self._rect.y), self._rect.y + self._rect.height - self._txt_scroll_indicator.height) + rl.draw_texture_ex(self._txt_scroll_indicator, rl.Vector2(self._rect.x, scroll_bar_y), 0, 1.0, rl.WHITE) + + rl.end_scissor_mode() + + def show_event(self): + super().show_event() + if self._reset_scroll_at_show: + self.scroll_panel.set_offset(0.0) + + for item in self._items: + item.show_event() + + def hide_event(self): + super().hide_event() + for item in self._items: + item.hide_event() + + +def draw_scroller_page_slider(scroller: Scroller, rect: rl.Rectangle) -> None: + if not scroller._horizontal: + return + max_off = scroller._content_size - scroller.rect.width + if max_off <= 1: + return + progress = max(0.0, min(1.0, (-scroller.scroll_panel.get_offset()) / max_off)) + + from iqpilot.ui.theme import NeonTheme + c = NeonTheme.glow(255) + r, g, b = c.r, c.g, c.b + glow_w = PAGE_SLIDER_GLOW_W + h = PAGE_SLIDER_GLOW_H + end = PAGE_SLIDER_END_TAPER + left = rect.x - end + right = rect.x + rect.width - glow_w + end + x = int(left + progress * (right - left)) + bottom = int(rect.y + rect.height) + + rl.draw_rectangle_gradient_v(x, bottom - h, glow_w, h, rl.Color(r, g, b, 0), rl.Color(r, g, b, PAGE_SLIDER_PEAK)) + black, blank = rl.Color(0, 0, 0, 255), rl.Color(0, 0, 0, 0) + rl.draw_rectangle_gradient_h(x, bottom - h, end, h, black, blank) + rl.draw_rectangle_gradient_h(x + glow_w - end, bottom - h, end, h, blank, black) + + +def draw_scroller_edge_fades(rect: rl.Rectangle) -> None: + fw = PAGE_EDGE_FADE_W + x, y = int(rect.x), int(rect.y) + w, h = int(rect.width), int(rect.height) + black = rl.Color(0, 0, 0, 255) + blank = rl.Color(0, 0, 0, 0) + rl.draw_rectangle_gradient_h(x, y, fw, h, black, blank) + rl.draw_rectangle_gradient_h(x + w - fw, y, fw, h, blank, black) + + +class NavScroller(NavWidget): + """Full screen Scroller that supports the nav stack with swipe-to-dismiss animations. + + Subclasses add their items via ``self._scroller.add_widgets([...])``. Built on the existing + ``Scroller`` so old callers are unaffected. + """ + def __init__(self, **kwargs): + super().__init__() + kwargs.setdefault('snap_items', False) + self._scroller = Scroller([], **kwargs) + self._scroller.set_enabled(lambda: self.enabled and not self.is_dismissing) + + PAGE_SLIDER_MARGIN = PAGE_SLIDER_MARGIN + PAGE_SLIDER_GLOW_W = PAGE_SLIDER_GLOW_W + PAGE_SLIDER_GLOW_H = PAGE_SLIDER_GLOW_H + PAGE_SLIDER_PEAK = PAGE_SLIDER_PEAK + PAGE_SLIDER_END_TAPER = PAGE_SLIDER_END_TAPER + PAGE_SLIDER_RGB = (0x3A, 0xDD, 0xC6) + + PAGE_EDGE_FADE_W = PAGE_EDGE_FADE_W + + def _back_enabled(self) -> bool: + return self._scroller._horizontal or self._scroller.scroll_panel.get_offset() >= -20 + + def _draw_page_slider(self): + draw_scroller_page_slider(self._scroller, self._rect) + + def _draw_edge_fades(self): + draw_scroller_edge_fades(self._rect) + + def _render(self, _): + self._scroller.render(self._rect) + self._draw_edge_fades() + self._draw_page_slider() + + def show_event(self): + super().show_event() + self._scroller.show_event() + + def hide_event(self): + super().hide_event() + self._scroller.hide_event() + + +class NavRawScrollPanel(NavWidget): + BACK_TOUCH_AREA_PERCENTAGE = 1.0 + + def __init__(self): + super().__init__() + self._scroll_panel = GuiScrollPanel2(horizontal=False) + self._scroll_panel.set_enabled(lambda: self.enabled and not self.is_dismissing) + + def show_event(self): + super().show_event() + self._scroll_panel.set_offset(0) + + def _back_enabled(self) -> bool: + return self._scroll_panel.get_offset() >= -20 diff --git a/iqpilot/system/ui/widgets/scroller_tici.py b/iqpilot/system/ui/widgets/scroller_tici.py new file mode 100644 index 000000000..2d191226f --- /dev/null +++ b/iqpilot/system/ui/widgets/scroller_tici.py @@ -0,0 +1,88 @@ +import pyray as rl +from iqpilot.system.ui.lib.scroll_panel import GuiScrollPanel +from iqpilot.system.ui.widgets import Widget + +ITEM_SPACING = 40 +LINE_COLOR = rl.GRAY +LINE_PADDING = 40 + + +class LineSeparator(Widget): + def __init__(self, height: int = 1): + super().__init__() + self._rect = rl.Rectangle(0, 0, 0, height) + + def set_parent_rect(self, parent_rect: rl.Rectangle) -> None: + super().set_parent_rect(parent_rect) + self._rect.width = parent_rect.width + + def _render(self, _): + pass + + +class Scroller(Widget): + def __init__(self, items: list[Widget], spacing: int = ITEM_SPACING, line_separator: bool = False, pad_end: bool = True): + super().__init__() + self._items: list[Widget] = [] + self._spacing = spacing + self._line_separator = LineSeparator() if line_separator else None + self._pad_end = pad_end + + self.scroll_panel = GuiScrollPanel() + + for item in items: + self.add_widget(item) + + def add_widget(self, item: Widget) -> None: + self._items.append(item) + item.set_touch_valid_callback(self.scroll_panel.is_touch_valid) + + def _render(self, _): + # TODO: don't draw items that are not in the viewport + visible_items = [item for item in self._items if item.is_visible] + + # Add line separator between items + if self._line_separator is not None: + l = len(visible_items) + for i in range(1, len(visible_items)): + visible_items.insert(l - i, self._line_separator) + + content_height = sum(item.rect.height for item in visible_items) + self._spacing * (len(visible_items)) + if not self._pad_end: + content_height -= self._spacing + scroll = self.scroll_panel.update(self._rect, rl.Rectangle(0, 0, self._rect.width, content_height)) + + rl.begin_scissor_mode(int(self._rect.x), int(self._rect.y), + int(self._rect.width), int(self._rect.height)) + + cur_height = 0 + for idx, item in enumerate(visible_items): + if not item.is_visible: + continue + + # Nicely lay out items vertically + x = self._rect.x + y = self._rect.y + cur_height + self._spacing * (idx != 0) + cur_height += item.rect.height + self._spacing * (idx != 0) + + # Consider scroll + y += scroll + + # Update item state + item.set_position(x, y) + item.set_parent_rect(self._rect) + item.render() + + rl.end_scissor_mode() + + def show_event(self): + super().show_event() + # Reset to top + self.scroll_panel.set_offset(0) + for item in self._items: + item.show_event() + + def hide_event(self): + super().hide_event() + for item in self._items: + item.hide_event() diff --git a/iqpilot/system/ui/widgets/slider.py b/iqpilot/system/ui/widgets/slider.py new file mode 100644 index 000000000..3654d3c75 --- /dev/null +++ b/iqpilot/system/ui/widgets/slider.py @@ -0,0 +1,209 @@ +from collections.abc import Callable + +import pyray as rl + +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.label import UnifiedLabel +from iqpilot.common.filter_simple import FirstOrderFilter + + +class SmallSlider(Widget): + HORIZONTAL_PADDING = 8 + CONFIRM_DELAY = 0.2 + + def __init__(self, title: str, confirm_callback: Callable | None = None): + # TODO: unify this with BigConfirmationDialogV2 + super().__init__() + self._confirm_callback = confirm_callback + + self._font = gui_app.font(FontWeight.DISPLAY) + + self._load_assets() + + self._drag_threshold = -self._rect.width // 2 + + # State + self._opacity_filter = FirstOrderFilter(1.0, 0.1, 1 / gui_app.target_fps) + self._confirmed_time = 0.0 + self._confirm_callback_called = False # we keep dialog open by default, only call once + self._start_x_circle = 0.0 + self._scroll_x_circle = 0.0 + self._scroll_x_circle_filter = FirstOrderFilter(0, 0.05, 1 / gui_app.target_fps) + + self._is_dragging_circle = False + + self._label = UnifiedLabel(title, font_size=36, font_weight=FontWeight.MEDIUM, text_color=rl.Color(255, 255, 255, int(255 * 0.65)), + alignment=rl.GuiTextAlignment.TEXT_ALIGN_RIGHT, + alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, line_height=0.9) + + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 316 + self.HORIZONTAL_PADDING * 2, 100)) + + self._bg_txt = gui_app.texture("icons_mici/setup/small_slider/slider_bg.png", 316, 100) + self._circle_bg_txt = gui_app.texture("icons_mici/setup/small_slider/slider_red_circle.png", 100, 100) + self._circle_arrow_txt = gui_app.texture("icons_mici/setup/small_slider/slider_arrow.png", 37, 32) + + @property + def confirmed(self) -> bool: + return self._confirmed_time > 0.0 + + def reset(self): + # reset all slider state + self._is_dragging_circle = False + self._confirmed_time = 0.0 + self._confirm_callback_called = False + + def set_opacity(self, opacity: float, smooth: bool = False): + if smooth: + self._opacity_filter.update(opacity) + else: + self._opacity_filter.x = opacity + + @property + def slider_percentage(self): + activated_pos = -self._bg_txt.width + self._circle_bg_txt.width + return min(max(-self._scroll_x_circle_filter.x / abs(activated_pos), 0.0), 1.0) + + def _on_confirm(self): + if self._confirm_callback: + self._confirm_callback() + + def _handle_mouse_event(self, mouse_event): + super()._handle_mouse_event(mouse_event) + + if mouse_event.left_pressed: + # touch rect goes to the padding + circle_button_rect = rl.Rectangle( + self._rect.x + (self._rect.width - self._circle_bg_txt.width) + self._scroll_x_circle_filter.x - self.HORIZONTAL_PADDING * 2, + self._rect.y, + self._circle_bg_txt.width + self.HORIZONTAL_PADDING * 2, + self._rect.height, + ) + if rl.check_collision_point_rec(mouse_event.pos, circle_button_rect): + self._start_x_circle = mouse_event.pos.x + self._is_dragging_circle = True + + elif mouse_event.left_released: + # swiped to left + if self._scroll_x_circle_filter.x < self._drag_threshold: + self._confirmed_time = rl.get_time() + + self._is_dragging_circle = False + + if self._is_dragging_circle: + self._scroll_x_circle = mouse_event.pos.x - self._start_x_circle + + def _update_state(self): + super()._update_state() + # TODO: this math can probably be cleaned up to remove duplicate stuff + activated_pos = int(-self._bg_txt.width + self._circle_bg_txt.width) + self._scroll_x_circle = max(min(self._scroll_x_circle, 0), activated_pos) + + if self._confirmed_time > 0: + # swiped left to confirm + self._scroll_x_circle_filter.update(activated_pos) + + # activate once animation completes, small threshold for small floats + if self._scroll_x_circle_filter.x < (activated_pos + 1): + if not self._confirm_callback_called and (rl.get_time() - self._confirmed_time) >= self.CONFIRM_DELAY: + self._on_confirm() + self._confirm_callback_called = True + + elif not self._is_dragging_circle: + # reset back to right + self._scroll_x_circle_filter.update(0) + else: + # not activated yet, keep movement 1:1 + self._scroll_x_circle_filter.x = self._scroll_x_circle + + def _bg_rgb(self) -> tuple[int, int, int]: + return (255, 255, 255) + + def _circle_rgb(self) -> tuple[int, int, int]: + return (255, 255, 255) + + def _render(self, _): + # TODO: iOS text shimmering animation + + op = self._opacity_filter.x + white = rl.Color(255, 255, 255, int(255 * op)) + bg_tint = rl.Color(*self._bg_rgb(), int(255 * op)) + circle_tint = rl.Color(*self._circle_rgb(), int(255 * op)) + + bg_txt_x = self._rect.x + (self._rect.width - self._bg_txt.width) / 2 + bg_txt_y = self._rect.y + (self._rect.height - self._bg_txt.height) / 2 + rl.draw_texture_ex(self._bg_txt, rl.Vector2(bg_txt_x, bg_txt_y), 0.0, 1.0, bg_tint) + + btn_x = bg_txt_x + self._bg_txt.width - self._circle_bg_txt.width + self._scroll_x_circle_filter.x + btn_y = self._rect.y + (self._rect.height - self._circle_bg_txt.height) / 2 + + if self._confirmed_time == 0.0 or self._scroll_x_circle > 0: + self._label.set_text_color(rl.Color(255, 255, 255, int(255 * 0.65 * (1.0 - self.slider_percentage) * self._opacity_filter.x))) + label_rect = rl.Rectangle( + self._rect.x + 20, + self._rect.y, + self._rect.width - self._circle_bg_txt.width - 20 * 2.5, + self._rect.height, + ) + self._label.render(label_rect) + + # circle and arrow + rl.draw_texture_ex(self._circle_bg_txt, rl.Vector2(btn_x, btn_y), 0.0, 1.0, circle_tint) + + arrow_x = btn_x + (self._circle_bg_txt.width - self._circle_arrow_txt.width) / 2 + arrow_y = btn_y + (self._circle_bg_txt.height - self._circle_arrow_txt.height) / 2 + rl.draw_texture_ex(self._circle_arrow_txt, rl.Vector2(arrow_x, arrow_y), 0.0, 1.0, white) + + +class LargerSlider(SmallSlider): + def __init__(self, title: str, confirm_callback: Callable | None = None, green: bool = True): + self._green = green + super().__init__(title, confirm_callback=confirm_callback) + + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 520 + self.HORIZONTAL_PADDING * 2, 115)) + + self._bg_txt = gui_app.texture("icons_mici/setup/small_slider/slider_bg_larger.png", 520, 115) + circle_fn = "slider_green_rounded_rectangle" if self._green else "slider_black_rounded_rectangle" + self._circle_bg_txt = gui_app.texture(f"icons_mici/setup/small_slider/{circle_fn}.png", 180, 115) + self._circle_arrow_txt = gui_app.texture("icons_mici/setup/small_slider/slider_arrow.png", 64, 55) + + +class BigSlider(SmallSlider): + def __init__(self, title: str, icon: rl.Texture, confirm_callback: Callable | None = None): + self._icon = icon + super().__init__(title, confirm_callback=confirm_callback) + self._label = UnifiedLabel(title, font_size=48, font_weight=FontWeight.DISPLAY, text_color=rl.Color(255, 255, 255, int(255 * 0.65)), + alignment=rl.GuiTextAlignment.TEXT_ALIGN_RIGHT, alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, + line_height=0.875) + + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 520 + self.HORIZONTAL_PADDING * 2, 180)) + + self._bg_txt = gui_app.texture("icons_mici/buttons/slider_bg.png", 520, 180) + self._circle_bg_txt = gui_app.texture("icons_mici/buttons/button_circle.png", 180, 180) + self._circle_arrow_txt = self._icon + + def _accent_rgb(self) -> tuple[int, int, int]: + from iqpilot.ui.theme import NeonTheme + c = NeonTheme.glow(255) + return (c.r, c.g, c.b) + + def _bg_rgb(self) -> tuple[int, int, int]: + return self._accent_rgb() + + def _circle_rgb(self) -> tuple[int, int, int]: + return self._accent_rgb() + + +class RedBigSlider(BigSlider): + def _load_assets(self): + self.set_rect(rl.Rectangle(0, 0, 520 + self.HORIZONTAL_PADDING * 2, 180)) + + self._bg_txt = gui_app.texture("icons_mici/buttons/slider_bg.png", 520, 180) + self._circle_bg_txt = gui_app.texture("icons_mici/buttons/button_circle_red.png", 180, 180) + self._circle_arrow_txt = self._icon + + def _circle_rgb(self) -> tuple[int, int, int]: + return (255, 255, 255) # keep the red circle texture's own color diff --git a/iqpilot/system/ui/widgets/toggle.py b/iqpilot/system/ui/widgets/toggle.py new file mode 100644 index 000000000..3c0d5351b --- /dev/null +++ b/iqpilot/system/ui/widgets/toggle.py @@ -0,0 +1,81 @@ +import pyray as rl +from collections.abc import Callable +from iqpilot.system.ui.lib.application import MousePos +from iqpilot.system.ui.widgets import Widget + +ON_COLOR = rl.Color(51, 171, 76, 255) +OFF_COLOR = rl.Color(0x39, 0x39, 0x39, 255) +KNOB_COLOR = rl.WHITE +DISABLED_ON_COLOR = rl.Color(0x22, 0x77, 0x22, 255) # Dark green when disabled + on +DISABLED_OFF_COLOR = rl.Color(0x39, 0x39, 0x39, 255) +DISABLED_KNOB_COLOR = rl.Color(0x88, 0x88, 0x88, 255) +WIDTH, HEIGHT = 230, 80 +BG_HEIGHT = 60 +ANIMATION_SPEED = 8.0 + + +class Toggle(Widget): + def __init__(self, initial_state: bool = False, callback: Callable[[bool], None] | None = None): + super().__init__() + self._state = initial_state + self._callback = callback + self._enabled = True + self._progress = 1.0 if initial_state else 0.0 + self._target = self._progress + self._clicked = False + + def set_rect(self, rect: rl.Rectangle): + self._rect = rl.Rectangle(rect.x, rect.y, WIDTH, HEIGHT) + + def _handle_mouse_release(self, mouse_pos: MousePos): + if not self._enabled: + return + + self._clicked = True + self._state = not self._state + self._target = 1.0 if self._state else 0.0 + if self._callback: + self._callback(self._state) + + def get_state(self) -> bool: + return self._state + + def set_state(self, state: bool): + self._state = state + self._target = 1.0 if state else 0.0 + + def is_enabled(self): + return self._enabled + + def update(self): + if abs(self._progress - self._target) > 0.01: + delta = rl.get_frame_time() * ANIMATION_SPEED + self._progress += delta if self._progress < self._target else -delta + self._progress = max(0.0, min(1.0, self._progress)) + + def _render(self, rect: rl.Rectangle): + self.update() + + if self._enabled: + bg_color = self._blend_color(OFF_COLOR, ON_COLOR, self._progress) + knob_color = KNOB_COLOR + else: + bg_color = self._blend_color(DISABLED_OFF_COLOR, DISABLED_ON_COLOR, self._progress) + knob_color = DISABLED_KNOB_COLOR + + # Draw background + bg_rect = rl.Rectangle(self._rect.x + 5, self._rect.y + 10, WIDTH - 10, BG_HEIGHT) + rl.draw_rectangle_rounded(bg_rect, 1.0, 10, bg_color) + + # Draw knob + knob_x = self._rect.x + HEIGHT / 2 + (WIDTH - HEIGHT) * self._progress + knob_y = self._rect.y + HEIGHT / 2 + rl.draw_circle(int(knob_x), int(knob_y), HEIGHT / 2, knob_color) + + # TODO: use click callback + clicked = self._clicked + self._clicked = False + return clicked + + def _blend_color(self, c1, c2, t): + return rl.Color(int(c1.r + (c2.r - c1.r) * t), int(c1.g + (c2.g - c1.g) * t), int(c1.b + (c2.b - c1.b) * t), 255) diff --git a/iqpilot/system/updated/casync/casync.py b/iqpilot/system/updated/casync/casync.py new file mode 100755 index 000000000..82042ea6f --- /dev/null +++ b/iqpilot/system/updated/casync/casync.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python3 +import io +import lzma +import os +import pathlib +import struct +import sys +import time +from abc import ABC, abstractmethod +from collections import defaultdict, namedtuple +from collections.abc import Callable +from typing import IO + +import requests +from Crypto.Hash import SHA512 +from iqpilot.system.updated.casync import tar +from iqpilot.system.updated.casync.common import create_casync_tar_package + +CA_FORMAT_INDEX = 0x96824d9c7b129ff9 +CA_FORMAT_TABLE = 0xe75b9e112f17417d +CA_FORMAT_TABLE_TAIL_MARKER = 0xe75b9e112f17417 +FLAGS = 0xb000000000000000 + +CA_HEADER_LEN = 48 +CA_TABLE_HEADER_LEN = 16 +CA_TABLE_ENTRY_LEN = 40 +CA_TABLE_MIN_LEN = CA_TABLE_HEADER_LEN + CA_TABLE_ENTRY_LEN + +CHUNK_DOWNLOAD_TIMEOUT = 60 +CHUNK_DOWNLOAD_RETRIES = 3 + +CAIBX_DOWNLOAD_TIMEOUT = 120 + +Chunk = namedtuple('Chunk', ['sha', 'offset', 'length']) +ChunkDict = dict[bytes, Chunk] + + +class ChunkReader(ABC): + @abstractmethod + def read(self, chunk: Chunk) -> bytes: + ... + + +class BinaryChunkReader(ChunkReader): + """Reads chunks from a local file""" + def __init__(self, file_like: IO[bytes]) -> None: + super().__init__() + self.f = file_like + + def read(self, chunk: Chunk) -> bytes: + self.f.seek(chunk.offset) + return self.f.read(chunk.length) + + +class FileChunkReader(BinaryChunkReader): + def __init__(self, path: str) -> None: + super().__init__(open(path, 'rb')) + + def __del__(self): + self.f.close() + + +class RemoteChunkReader(ChunkReader): + """Reads lzma compressed chunks from a remote store""" + + def __init__(self, url: str) -> None: + super().__init__() + self.url = url + self.session = requests.Session() + + def read(self, chunk: Chunk) -> bytes: + sha_hex = chunk.sha.hex() + url = os.path.join(self.url, sha_hex[:4], sha_hex + ".cacnk") + + if os.path.isfile(url): + with open(url, 'rb') as f: + contents = f.read() + else: + for i in range(CHUNK_DOWNLOAD_RETRIES): + try: + resp = self.session.get(url, timeout=CHUNK_DOWNLOAD_TIMEOUT) + break + except Exception: + if i == CHUNK_DOWNLOAD_RETRIES - 1: + raise + time.sleep(CHUNK_DOWNLOAD_TIMEOUT) + + resp.raise_for_status() + contents = resp.content + + decompressor = lzma.LZMADecompressor(format=lzma.FORMAT_AUTO) + return decompressor.decompress(contents) + + +class DirectoryTarChunkReader(BinaryChunkReader): + """creates a tar archive of a directory and reads chunks from it""" + + def __init__(self, path: str, cache_file: str) -> None: + create_casync_tar_package(pathlib.Path(path), pathlib.Path(cache_file)) + + self.f = open(cache_file, "rb") + super().__init__(self.f) + + def __del__(self): + self.f.close() + os.unlink(self.f.name) + + +def parse_caibx(caibx_path: str) -> list[Chunk]: + """Parses the chunks from a caibx file. Can handle both local and remote files. + Returns a list of chunks with hash, offset and length""" + caibx: io.BufferedIOBase + if os.path.isfile(caibx_path): + caibx = open(caibx_path, 'rb') + else: + resp = requests.get(caibx_path, timeout=CAIBX_DOWNLOAD_TIMEOUT) + resp.raise_for_status() + caibx = io.BytesIO(resp.content) + + caibx.seek(0, os.SEEK_END) + caibx_len = caibx.tell() + caibx.seek(0, os.SEEK_SET) + + # Parse header + length, magic, flags, min_size, _, max_size = struct.unpack("= min_size + + chunks.append(Chunk(sha, offset, length)) + offset = new_offset + + caibx.close() + return chunks + + +def build_chunk_dict(chunks: list[Chunk]) -> ChunkDict: + """Turn a list of chunks into a dict for faster lookups based on hash. + Keep first chunk since it's more likely to be already downloaded.""" + r = {} + for c in chunks: + if c.sha not in r: + r[c.sha] = c + return r + + +def extract(target: list[Chunk], + sources: list[tuple[str, ChunkReader, ChunkDict]], + out_path: str, + progress: Callable[[int], None] | None = None): + stats: dict[str, int] = defaultdict(int) + + mode = 'rb+' if os.path.exists(out_path) else 'wb' + with open(out_path, mode) as out: + for cur_chunk in target: + + # Find source for desired chunk + for name, chunk_reader, store_chunks in sources: + if cur_chunk.sha in store_chunks: + bts = chunk_reader.read(store_chunks[cur_chunk.sha]) + + # Check length + if len(bts) != cur_chunk.length: + continue + + # Check hash + if SHA512.new(bts, truncate="256").digest() != cur_chunk.sha: + continue + + # Write to output + out.seek(cur_chunk.offset) + out.write(bts) + + stats[name] += cur_chunk.length + + if progress is not None: + progress(sum(stats.values())) + + break + else: + raise RuntimeError("Desired chunk not found in provided stores") + + return stats + + +def extract_directory(target: list[Chunk], + sources: list[tuple[str, ChunkReader, ChunkDict]], + out_path: str, + tmp_file: str, + progress: Callable[[int], None] | None = None): + """extract a directory stored as a casync tar archive""" + + stats = extract(target, sources, tmp_file, progress) + + with open(tmp_file, "rb") as f: + tar.extract_tar_archive(f, pathlib.Path(out_path)) + + return stats + + +def print_stats(stats: dict[str, int]): + total_bytes = sum(stats.values()) + print(f"Total size: {total_bytes / 1024 / 1024:.2f} MB") + for name, total in stats.items(): + print(f" {name}: {total / 1024 / 1024:.2f} MB ({total / total_bytes * 100:.1f}%)") + + +def extract_simple(caibx_path, out_path, store_path): + # (name, callback, chunks) + target = parse_caibx(caibx_path) + sources = [ + # (store_path, RemoteChunkReader(store_path), build_chunk_dict(target)), + (store_path, FileChunkReader(store_path), build_chunk_dict(target)), + ] + + return extract(target, sources, out_path) + + +if __name__ == "__main__": + caibx = sys.argv[1] + out = sys.argv[2] + store = sys.argv[3] + + stats = extract_simple(caibx, out, store) + print_stats(stats) diff --git a/iqpilot/system/updated/casync/common.py b/iqpilot/system/updated/casync/common.py new file mode 100644 index 000000000..230b7f339 --- /dev/null +++ b/iqpilot/system/updated/casync/common.py @@ -0,0 +1,61 @@ +import dataclasses +import json +import pathlib +import subprocess + +from iqpilot.system.version import BUILD_METADATA_FILENAME, BuildMetadata +from iqpilot.system.updated.casync import tar + + +CASYNC_ARGS = ["--with=symlinks", "--with=permissions", "--compression=xz", "--chunk-size=16M"] +CASYNC_FILES = [BUILD_METADATA_FILENAME] + + +def run(cmd): + return subprocess.check_output(cmd) + + +def get_exclude_set(path) -> set[str]: + exclude_set = set(CASYNC_FILES) + + for file in path.rglob("*"): + if file.is_file() or file.is_symlink(): + + while file.resolve() != path.resolve(): + exclude_set.add(str(file.relative_to(path))) + + file = file.parent + + return exclude_set + + +def create_build_metadata_file(path: pathlib.Path, build_metadata: BuildMetadata): + with open(path / BUILD_METADATA_FILENAME, "w") as f: + build_metadata_dict = dataclasses.asdict(build_metadata) + build_metadata_dict["openpilot"].pop("is_dirty") # this is determined at runtime + build_metadata_dict.pop("channel") # channel is unrelated to the build itself + f.write(json.dumps(build_metadata_dict)) + + +def is_not_git(path: pathlib.Path) -> bool: + return ".git" not in path.parts + + +def create_casync_tar_package(target_dir: pathlib.Path, output_path: pathlib.Path): + tar.create_tar_archive(output_path, target_dir, is_not_git) + + +def create_casync_from_file(file: pathlib.Path, output_dir: pathlib.Path, caibx_name: str): + caibx_file = output_dir / f"{caibx_name}.caibx" + run(["casync", "make", *CASYNC_ARGS, caibx_file, str(file)]) + + return caibx_file + + +def create_casync_release(target_dir: pathlib.Path, output_dir: pathlib.Path, caibx_name: str): + tar_file = output_dir / f"{caibx_name}.tar" + create_casync_tar_package(target_dir, tar_file) + caibx_file = create_casync_from_file(tar_file, output_dir, caibx_name) + tar_file.unlink() + digest = run(["casync", "digest", *CASYNC_ARGS, target_dir]).decode("utf-8").strip() + return digest, caibx_file diff --git a/iqpilot/system/updated/casync/tar.py b/iqpilot/system/updated/casync/tar.py new file mode 100644 index 000000000..a5a8238bb --- /dev/null +++ b/iqpilot/system/updated/casync/tar.py @@ -0,0 +1,39 @@ +import pathlib +import tarfile +from typing import IO +from collections.abc import Callable + + +def include_default(_) -> bool: + return True + + +def create_tar_archive(filename: pathlib.Path, directory: pathlib.Path, include: Callable[[pathlib.Path], bool] = include_default): + """Creates a tar archive of a directory""" + + with tarfile.open(filename, 'w') as tar: + for file in sorted(directory.rglob("*"), key=lambda f: f.stat().st_size if f.is_file() else 0, reverse=True): + if not include(file): + continue + relative_path = str(file.relative_to(directory)) + if file.is_symlink(): + info = tarfile.TarInfo(relative_path) + info.type = tarfile.SYMTYPE + info.linkpath = str(file.readlink()) + tar.addfile(info) + + elif file.is_file(): + info = tarfile.TarInfo(relative_path) + info.size = file.stat().st_size + info.type = tarfile.REGTYPE + info.mode = file.stat().st_mode + with file.open('rb') as f: + tar.addfile(info, f) + + +def extract_tar_archive(fh: IO[bytes], directory: pathlib.Path): + """Extracts a tar archive to a directory""" + + tar = tarfile.open(fileobj=fh, mode='r') + tar.extractall(str(directory), filter=lambda info, path: info) + tar.close() diff --git a/iqpilot/system/updated/casync/tests/test_casync.py b/iqpilot/system/updated/casync/tests/test_casync.py new file mode 100644 index 000000000..623a06aaf --- /dev/null +++ b/iqpilot/system/updated/casync/tests/test_casync.py @@ -0,0 +1,228 @@ +import pytest +import os +import pathlib +import tempfile +import subprocess + +from iqpilot.system.updated.casync import casync +from iqpilot.system.updated.casync import tar + +# dd if=/dev/zero of=/tmp/img.raw bs=1M count=2 +# sudo losetup -f /tmp/img.raw +# losetup -a | grep img.raw +@pytest.mark.linux +class TestCasync: + @classmethod + def setup_class(cls): + cls.tmpdir = tempfile.TemporaryDirectory() + + # Build example contents + chunk_a = [i % 256 for i in range(1024)] * 512 + chunk_b = [(256 - i) % 256 for i in range(1024)] * 512 + zeroes = [0] * (1024 * 128) + contents = chunk_a + chunk_b + zeroes + chunk_a + + cls.contents = bytes(contents) + + # Write to file + cls.orig_fn = os.path.join(cls.tmpdir.name, 'orig.bin') + with open(cls.orig_fn, 'wb') as f: + f.write(cls.contents) + + # Create casync files + cls.manifest_fn = os.path.join(cls.tmpdir.name, 'orig.caibx') + cls.store_fn = os.path.join(cls.tmpdir.name, 'store') + subprocess.check_output(["casync", "make", "--compression=xz", "--store", cls.store_fn, cls.manifest_fn, cls.orig_fn]) + + target = casync.parse_caibx(cls.manifest_fn) + hashes = [c.sha.hex() for c in target] + + # Ensure we have chunk reuse + assert len(hashes) > len(set(hashes)) + + def setup_method(self): + # Clear target_lo + self.target_fn = os.path.join(self.tmpdir.name, next(tempfile._get_candidate_names())) + self.seed_fn = os.path.join(self.tmpdir.name, next(tempfile._get_candidate_names())) + + def teardown_method(self): + for fn in [self.target_fn, self.seed_fn]: + try: + os.unlink(fn) + except FileNotFoundError: + pass + + def test_simple_extract(self): + target = casync.parse_caibx(self.manifest_fn) + + sources = [('remote', casync.RemoteChunkReader(self.store_fn), casync.build_chunk_dict(target))] + stats = casync.extract(target, sources, self.target_fn) + + with open(self.target_fn, 'rb') as target_f: + assert target_f.read() == self.contents + + assert stats['remote'] == len(self.contents) + + def test_seed(self): + target = casync.parse_caibx(self.manifest_fn) + + # Populate seed with half of the target contents + with open(self.seed_fn, 'wb') as seed_f: + seed_f.write(self.contents[:len(self.contents) // 2]) + + sources = [('seed', casync.FileChunkReader(self.seed_fn), casync.build_chunk_dict(target))] + sources += [('remote', casync.RemoteChunkReader(self.store_fn), casync.build_chunk_dict(target))] + stats = casync.extract(target, sources, self.target_fn) + + with open(self.target_fn, 'rb') as target_f: + assert target_f.read() == self.contents + + assert stats['seed'] > 0 + assert stats['remote'] < len(self.contents) + + def test_already_done(self): + """Test that an already flashed target doesn't download any chunks""" + target = casync.parse_caibx(self.manifest_fn) + + with open(self.target_fn, 'wb') as f: + f.write(self.contents) + + sources = [('target', casync.FileChunkReader(self.target_fn), casync.build_chunk_dict(target))] + sources += [('remote', casync.RemoteChunkReader(self.store_fn), casync.build_chunk_dict(target))] + + stats = casync.extract(target, sources, self.target_fn) + + with open(self.target_fn, 'rb') as f: + assert f.read() == self.contents + + assert stats['target'] == len(self.contents) + + def test_chunk_reuse(self): + """Test that chunks that are reused are only downloaded once""" + target = casync.parse_caibx(self.manifest_fn) + + # Ensure target exists + with open(self.target_fn, 'wb'): + pass + + sources = [('target', casync.FileChunkReader(self.target_fn), casync.build_chunk_dict(target))] + sources += [('remote', casync.RemoteChunkReader(self.store_fn), casync.build_chunk_dict(target))] + + stats = casync.extract(target, sources, self.target_fn) + + with open(self.target_fn, 'rb') as f: + assert f.read() == self.contents + + assert stats['remote'] < len(self.contents) + +@pytest.mark.linux +class TestCasyncDirectory: + """Tests extracting a directory stored as a casync tar archive""" + + NUM_FILES = 16 + + @classmethod + def setup_cache(cls, directory, files=None): + if files is None: + files = range(cls.NUM_FILES) + + chunk_a = [i % 256 for i in range(1024)] * 512 + chunk_b = [(256 - i) % 256 for i in range(1024)] * 512 + zeroes = [0] * (1024 * 128) + cls.contents = chunk_a + chunk_b + zeroes + chunk_a + cls.contents = bytes(cls.contents) + + for i in files: + with open(os.path.join(directory, f"file_{i}.txt"), "wb") as f: + f.write(cls.contents) + + os.symlink(f"file_{i}.txt", os.path.join(directory, f"link_{i}.txt")) + + @classmethod + def setup_class(cls): + cls.tmpdir = tempfile.TemporaryDirectory() + + # Create casync files + cls.manifest_fn = os.path.join(cls.tmpdir.name, 'orig.caibx') + cls.store_fn = os.path.join(cls.tmpdir.name, 'store') + + cls.directory_to_extract = tempfile.TemporaryDirectory() + cls.setup_cache(cls.directory_to_extract.name) + + cls.orig_fn = os.path.join(cls.tmpdir.name, 'orig.tar') + tar.create_tar_archive(cls.orig_fn, pathlib.Path(cls.directory_to_extract.name)) + + subprocess.check_output(["casync", "make", "--compression=xz", "--store", cls.store_fn, cls.manifest_fn, cls.orig_fn]) + + @classmethod + def teardown_class(cls): + cls.tmpdir.cleanup() + cls.directory_to_extract.cleanup() + + def setup_method(self): + self.cache_dir = tempfile.TemporaryDirectory() + self.working_dir = tempfile.TemporaryDirectory() + self.out_dir = tempfile.TemporaryDirectory() + + def teardown_method(self): + self.cache_dir.cleanup() + self.working_dir.cleanup() + self.out_dir.cleanup() + + def run_test(self): + target = casync.parse_caibx(self.manifest_fn) + + cache_filename = os.path.join(self.working_dir.name, "cache.tar") + tmp_filename = os.path.join(self.working_dir.name, "tmp.tar") + + sources = [('cache', casync.DirectoryTarChunkReader(self.cache_dir.name, cache_filename), casync.build_chunk_dict(target))] + sources += [('remote', casync.RemoteChunkReader(self.store_fn), casync.build_chunk_dict(target))] + + stats = casync.extract_directory(target, sources, pathlib.Path(self.out_dir.name), tmp_filename) + + with open(os.path.join(self.out_dir.name, "file_0.txt"), "rb") as f: + assert f.read() == self.contents + + with open(os.path.join(self.out_dir.name, "link_0.txt"), "rb") as f: + assert f.read() == self.contents + assert os.readlink(os.path.join(self.out_dir.name, "link_0.txt")) == "file_0.txt" + + return stats + + def test_no_cache(self): + self.setup_cache(self.cache_dir.name, []) + stats = self.run_test() + assert stats['remote'] > 0 + assert stats['cache'] == 0 + + def test_full_cache(self): + self.setup_cache(self.cache_dir.name, range(self.NUM_FILES)) + stats = self.run_test() + assert stats['remote'] == 0 + assert stats['cache'] > 0 + + def test_one_file_cache(self): + self.setup_cache(self.cache_dir.name, range(1)) + stats = self.run_test() + assert stats['remote'] > 0 + assert stats['cache'] > 0 + assert stats['cache'] < stats['remote'] + + def test_one_file_incorrect_cache(self): + self.setup_cache(self.cache_dir.name, range(self.NUM_FILES)) + with open(os.path.join(self.cache_dir.name, "file_0.txt"), "wb") as f: + f.write(b"1234") + + stats = self.run_test() + assert stats['remote'] > 0 + assert stats['cache'] > 0 + assert stats['cache'] > stats['remote'] + + def test_one_file_missing_cache(self): + self.setup_cache(self.cache_dir.name, range(self.NUM_FILES)) + os.unlink(os.path.join(self.cache_dir.name, "file_12.txt")) + + stats = self.run_test() + assert stats['remote'] > 0 + assert stats['cache'] > 0 + assert stats['cache'] > stats['remote'] diff --git a/iqpilot/system/updated/tests/test_base.py b/iqpilot/system/updated/tests/test_base.py new file mode 100644 index 000000000..5ac8a432e --- /dev/null +++ b/iqpilot/system/updated/tests/test_base.py @@ -0,0 +1,284 @@ +import os +import pathlib +import shutil +import signal +import stat +import subprocess +import tempfile +import time +import pytest + +from iqpilot.common.params import Params +from iqpilot.system.manager.process import ManagerProcess +from iqpilot.selfdrive.test.helpers import processes_context + + +def run(args, **kwargs): + return subprocess.check_output(args, **kwargs) + + +def update_release(directory, name, version, agnos_version, release_notes): + (directory / "iqpilot" / "docs").mkdir(parents=True, exist_ok=True) + with open(directory / "iqpilot" / "docs" / "CHANGELOG.md", "w") as f: + f.write(release_notes) + + (directory / "iqpilot" / "common").mkdir(parents=True, exist_ok=True) + + with open(directory / "iqpilot" / "common" / "version.h", "w") as f: + f.write(f'#define COMMA_VERSION "{version}"') + + launch_env = directory / "launch_env.sh" + with open(launch_env, "w") as f: + f.write(f'export AGNOS_VERSION="{agnos_version}"') + + st = os.stat(launch_env) + os.chmod(launch_env, st.st_mode | stat.S_IEXEC) + + test_symlink = directory / "test_symlink" + if not os.path.exists(str(test_symlink)): + os.symlink("iqpilot/common/version.h", test_symlink) + + +def get_version(path: str) -> str: + with open(os.path.join(path, "iqpilot", "common", "version.h")) as f: + return f.read().split('"')[1] + + +@pytest.mark.linux +@pytest.mark.slow +class BaseUpdateTest: + def setup_method(self): + self.tmpdir = tempfile.mkdtemp() + self.mock_update_path = pathlib.Path(self.tmpdir) + + self.params = Params() + + self.basedir = self.mock_update_path / "openpilot" + self.basedir.mkdir() + + self.staging_root = self.mock_update_path / "safe_staging" + + self.remote_dir = self.mock_update_path / "remote" + self.remote_dir.mkdir() + + os.environ["UPDATER_STAGING_ROOT"] = str(self.staging_root) + os.environ["UPDATER_LOCK_FILE"] = str(self.mock_update_path / "safe_staging_overlay.lock") + + self.MOCK_RELEASES = { + "release3": ("0.1.2", "1.2", "0.1.2 release notes"), + "master": ("0.1.3", "1.2", "0.1.3 release notes"), + } + + @pytest.fixture(autouse=True) + def mock_basedir(self, mocker): + mocker.patch("iqpilot.common.basedir.BASEDIR", self.basedir) + mocker.patch("iqpilot.system.updated.updated.BASEDIR", str(self.basedir)) + mocker.patch("iqpilot.system.updated.updated.STAGING_ROOT", str(self.staging_root)) + mocker.patch("iqpilot.system.updated.updated.LOCK_FILE", str(self.mock_update_path / "safe_staging_overlay.lock")) + mocker.patch("iqpilot.system.updated.updated.OVERLAY_INIT", self.basedir / ".overlay_init") + + def set_target_branch(self, branch): + self.params.put("UpdaterTargetBranch", branch) + + def setup_basedir_release(self, release): + self.params = Params() + self.set_target_branch(release) + + def update_remote_release(self, release): + raise NotImplementedError("") + + def setup_remote_release(self, release): + raise NotImplementedError("") + + def additional_context(self): + raise NotImplementedError("") + + def teardown_method(self): + shutil.rmtree(self.tmpdir) + + def wait_for_condition(self, condition, timeout=12): + start = time.monotonic() + while True: + waited = time.monotonic() - start + if condition(): + print(f"waited {waited}s for condition ") + return waited + + if waited > timeout: + raise TimeoutError("timed out waiting for condition") + + time.sleep(1) + + def _test_finalized_update(self, branch, version, agnos_version, release_notes): + assert get_version(str(self.basedir)) == version + assert os.access(str(self.basedir / "launch_env.sh"), os.X_OK) + + with open(self.basedir / "test_symlink") as f: + assert version in f.read() + +class ParamsBaseUpdateTest(BaseUpdateTest): + def _test_finalized_update(self, branch, version, agnos_version, release_notes): + assert self.params.get("UpdaterNewDescription").startswith(f"{version} / {branch}") + assert self.params.get("UpdaterNewReleaseNotes") == f"{release_notes}\n".encode() + super()._test_finalized_update(branch, version, agnos_version, release_notes) + + def send_check_for_updates_signal(self, updated: ManagerProcess): + updated.signal(signal.SIGUSR1.value) + + def send_download_signal(self, updated: ManagerProcess): + updated.signal(signal.SIGHUP.value) + + def _test_params(self, branch, fetch_available, update_available): + assert self.params.get("UpdaterTargetBranch") == branch + assert self.params.get_bool("UpdaterFetchAvailable") == fetch_available + assert self.params.get_bool("UpdateAvailable") == update_available + + def wait_for_idle(self): + self.wait_for_condition(lambda: self.params.get("UpdaterState") == "idle") + + def wait_for_failed(self): + self.wait_for_condition(lambda: self.params.get("UpdateFailedCount") is not None and \ + self.params.get("UpdateFailedCount") > 0) + + def wait_for_fetch_available(self): + self.wait_for_condition(lambda: self.params.get_bool("UpdaterFetchAvailable")) + + def wait_for_update_available(self): + self.wait_for_condition(lambda: self.params.get_bool("UpdateAvailable")) + + def wait_for_reboot_requested(self): + self.wait_for_condition(lambda: self.params.get_bool("DoReboot")) + + def test_no_update(self): + # Start on release3, ensure we don't fetch any updates + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + + with self.additional_context(), processes_context(["updated"]) as [updated]: + self._test_params("release3", False, False) + self.wait_for_idle() + self._test_params("release3", False, False) + + self.send_check_for_updates_signal(updated) + + self.wait_for_idle() + + self._test_params("release3", False, False) + + def test_new_release(self): + # Start on release3, simulate a release3 commit, ensure we fetch that update properly + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + + with self.additional_context(), processes_context(["updated"]) as [updated]: + self._test_params("release3", False, False) + self.wait_for_idle() + self._test_params("release3", False, False) + + self.MOCK_RELEASES["release3"] = ("0.1.3", "1.2", "0.1.3 release notes") + self.update_remote_release("release3") + + self.send_check_for_updates_signal(updated) + + self.wait_for_fetch_available() + + self._test_params("release3", True, False) + + self.send_download_signal(updated) + + self.wait_for_update_available() + + self._test_params("release3", False, True) + self._test_finalized_update("release3", *self.MOCK_RELEASES["release3"]) + + def test_switch_branches(self): + # Start on release3, request to switch to master manually, ensure we switched + self.setup_remote_release("release3") + self.setup_remote_release("master") + self.setup_basedir_release("release3") + + with self.additional_context(), processes_context(["updated"]) as [updated]: + self._test_params("release3", False, False) + self.wait_for_idle() + self._test_params("release3", False, False) + + self.set_target_branch("master") + self.send_check_for_updates_signal(updated) + + self.wait_for_fetch_available() + + self._test_params("master", True, False) + + self.send_download_signal(updated) + + self.wait_for_update_available() + + self._test_params("master", False, True) + self._test_finalized_update("master", *self.MOCK_RELEASES["master"]) + + def test_download_only_does_not_auto_install(self): + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + self.params.put("UpdaterInstallMode", "download_only") + + with self.additional_context(), processes_context(["updated"]) as [updated]: + self.wait_for_idle() + + self.MOCK_RELEASES["release3"] = ("0.1.3", "1.2", "0.1.3 release notes") + self.update_remote_release("release3") + + self.send_check_for_updates_signal(updated) + self.wait_for_fetch_available() + + self.send_download_signal(updated) + self.wait_for_update_available() + + assert not self.params.get_bool("DoReboot") + + def test_download_and_install_auto_installs(self): + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + self.params.put("UpdaterInstallMode", "download_and_install") + + with self.additional_context(), processes_context(["updated"]) as [updated]: + self.wait_for_idle() + + self.MOCK_RELEASES["release3"] = ("0.1.3", "1.2", "0.1.3 release notes") + self.update_remote_release("release3") + + self.send_check_for_updates_signal(updated) + self.wait_for_fetch_available() + + self.send_download_signal(updated) + self.wait_for_reboot_requested() + + def test_agnos_update(self, mocker): + # Start on release3, push an update with an agnos change + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + + with self.additional_context(), processes_context(["updated"]) as [updated]: + mocker.patch("iqpilot.system.hardware.AGNOS", "True") + mocker.patch("iqpilot.system.hardware.tici.hardware.Tici.get_os_version", "1.2") + mocker.patch("iqpilot.system.hardware.tici.agnos.get_target_slot_number") + mocker.patch("iqpilot.system.hardware.tici.agnos.flash_agnos_update") + + self._test_params("release3", False, False) + self.wait_for_idle() + self._test_params("release3", False, False) + + self.MOCK_RELEASES["release3"] = ("0.1.3", "1.3", "0.1.3 release notes") + self.update_remote_release("release3") + + self.send_check_for_updates_signal(updated) + + self.wait_for_fetch_available() + + self._test_params("release3", True, False) + + self.send_download_signal(updated) + + self.wait_for_update_available() + + self._test_params("release3", False, True) + self._test_finalized_update("release3", *self.MOCK_RELEASES["release3"]) diff --git a/iqpilot/system/updated/tests/test_branch_migrations.py b/iqpilot/system/updated/tests/test_branch_migrations.py new file mode 100644 index 000000000..e04ad0974 --- /dev/null +++ b/iqpilot/system/updated/tests/test_branch_migrations.py @@ -0,0 +1,62 @@ +from iqpilot.common.params import Params +from iqpilot.common.basedir import BASEDIR +from iqpilot.system.version import BuildMetadata, OpenpilotMetadata +from iqpilot.system.updated.updated import Updater, display_commit_date + + +def test_display_commit_date(): + assert display_commit_date("'1786378834 2026-08-10 11:20:34 -0500'") == "2026-08-10 11:20:34" + assert display_commit_date("1786378834 2026-08-10 11:20:34 -0500") == "2026-08-10 11:20:34" + assert display_commit_date("'1786378834 2026-08-10 11:20:34 -0500'\n") == "2026-08-10 11:20:34" + assert display_commit_date("Jul 02") == "Jul 02" + + +def test_tici_branch_unchanged(mocker): + params = Params() + params.put("UpdaterTargetBranch", "master-dev") + mocker.patch("iqpilot.system.updated.updated.HARDWARE.get_device_type", return_value="tici") + + try: + assert Updater().target_branch == "master-dev" + finally: + params.remove("UpdaterTargetBranch") + + +def test_non_tici_branch_unchanged(mocker): + params = Params() + params.put("UpdaterTargetBranch", "master-dev") + mocker.patch("iqpilot.system.updated.updated.HARDWARE.get_device_type", return_value="tizi") + + try: + assert Updater().target_branch == "master-dev" + finally: + params.remove("UpdaterTargetBranch") + + +def test_non_git_baked_deployment_uses_build_metadata(mocker): + mocker.patch("iqpilot.system.updated.updated.has_git_repo", return_value=False) + mocker.patch("iqpilot.system.updated.updated.HARDWARE.get_device_type", return_value="tici") + mocker.patch( + "iqpilot.system.updated.updated.get_build_metadata", + return_value=BuildMetadata( + "release3", + OpenpilotMetadata( + version="1.2.3", + release_notes="notes", + git_commit="abcdef1234567890", + git_origin="github.com/IQLvbs/openpilot", + git_commit_date="Jul 02", + build_style="release", + is_dirty=False, + ), + ), + ) + + updater = Updater() + + assert updater.git_mode is False + assert updater.get_branch(BASEDIR) == "release3" + assert updater.get_commit_hash() == "abcdef1234567890" + assert updater.target_branch == "release3" + assert updater.update_available is False + assert updater.update_ready is False diff --git a/iqpilot/system/updated/tests/test_git.py b/iqpilot/system/updated/tests/test_git.py new file mode 100644 index 000000000..ac89cb466 --- /dev/null +++ b/iqpilot/system/updated/tests/test_git.py @@ -0,0 +1,48 @@ +import contextlib +import os +from iqpilot.system.updated.tests.test_base import ParamsBaseUpdateTest, run, update_release +from iqpilot.system.updated.updated import cleanup_stale_prebuilt_marker + + +class TestUpdateDGitStrategy(ParamsBaseUpdateTest): + def update_remote_release(self, release): + update_release(self.remote_dir, release, *self.MOCK_RELEASES[release]) + run(["git", "add", "."], cwd=self.remote_dir) + run(["git", "commit", "-m", f"openpilot release {release}"], cwd=self.remote_dir) + + def setup_remote_release(self, release): + run(["git", "init"], cwd=self.remote_dir) + run(["git", "config", "user.name", "IQPilot Test"], cwd=self.remote_dir) + run(["git", "config", "user.email", "test@iqpilot.local"], cwd=self.remote_dir) + run(["git", "checkout", "-b", release], cwd=self.remote_dir) + self.update_remote_release(release) + + def setup_basedir_release(self, release): + super().setup_basedir_release(release) + run(["git", "clone", "-b", release, self.remote_dir, self.basedir]) + + @contextlib.contextmanager + def additional_context(self): + yield + + def test_cleanup_stale_prebuilt_marker(self): + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + + prebuilt_path = os.path.join(self.basedir, "prebuilt") + with open(prebuilt_path, "w") as f: + f.write("") + + cleanup_stale_prebuilt_marker(str(self.basedir), "release3") + assert not os.path.exists(prebuilt_path) + + def test_keep_prebuilt_marker_for_prebuilt_branch(self): + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + + prebuilt_path = os.path.join(self.basedir, "prebuilt") + with open(prebuilt_path, "w") as f: + f.write("") + + cleanup_stale_prebuilt_marker(str(self.basedir), "release3-prebuilt") + assert os.path.exists(prebuilt_path) diff --git a/iqpilot/system/updated/updated.py b/iqpilot/system/updated/updated.py new file mode 100755 index 000000000..f6c24acc4 --- /dev/null +++ b/iqpilot/system/updated/updated.py @@ -0,0 +1,627 @@ +#!/usr/bin/env python3 +import os +import re +import datetime +import subprocess +import psutil +import signal +import fcntl +import threading +import time +from collections import defaultdict +from pathlib import Path + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.params import Params +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.common.markdown import parse_markdown +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert +from iqpilot.system.hardware import AGNOS, HARDWARE +from iqpilot.system.version import get_build_metadata, IQ_BRANCH_MIGRATIONS + + +LOCK_FILE = os.getenv("UPDATER_LOCK_FILE", "/tmp/safe_staging_overlay.lock") +STAGING_ROOT = os.getenv("UPDATER_STAGING_ROOT", "/data/safe_staging") +OVERLAY_INIT = Path(os.path.join(BASEDIR, ".overlay_init")) + +# do not allow to engage after this many hours onroad and this many routes +HOURS_NO_CONNECTIVITY_MAX = 27 +ROUTES_NO_CONNECTIVITY_MAX = 84 +# send an offroad prompt after this many hours onroad and this many routes +HOURS_NO_CONNECTIVITY_PROMPT = 23 +ROUTES_NO_CONNECTIVITY_PROMPT = 80 + + +class UserRequest: + NONE = 0 + CHECK = 1 + FETCH = 2 + + +class UpdateInstallMode: + DOWNLOAD_ONLY = "download_only" + DOWNLOAD_AND_INSTALL = "download_and_install" + +class WaitTimeHelper: + def __init__(self): + self.ready_event = threading.Event() + self.user_request = UserRequest.NONE + signal.signal(signal.SIGHUP, self.update_now) + signal.signal(signal.SIGUSR1, self.check_now) + + def update_now(self, signum: int, frame) -> None: + cloudlog.info("caught SIGHUP, attempting to downloading update") + self.user_request = UserRequest.FETCH + self.ready_event.set() + + def check_now(self, signum: int, frame) -> None: + cloudlog.info("caught SIGUSR1, checking for updates") + self.user_request = UserRequest.CHECK + self.ready_event.set() + + def sleep(self, t: float) -> None: + self.ready_event.wait(timeout=t) + +def write_time_to_param(params, param) -> None: + t = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) + params.put(param, t) + +def run(cmd: list[str], cwd: str | None = None) -> str: + return subprocess.check_output(cmd, cwd=cwd, stderr=subprocess.STDOUT, encoding='utf8') + + +def has_git_repo(path: str) -> bool: + return os.path.isdir(os.path.join(path, ".git")) + + +def display_commit_date(value: str) -> str: + value = value.strip() + match = re.fullmatch(r"'?\d+ (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) [+-]\d{4}'?", value) + return match.group(1) if match else value.strip("'") + + +def cleanup_stale_overlay() -> None: + try: + merged = os.path.join(STAGING_ROOT, "merged") + if os.path.ismount(merged): + run(["sudo", "umount", "-l", merged]) + if os.path.isdir(STAGING_ROOT): + run(["sudo", "rm", "-rf", STAGING_ROOT]) + OVERLAY_INIT.unlink(missing_ok=True) + except Exception: + cloudlog.exception("updater: failed to clean up stale overlay") + + +def parse_release_notes(basedir: str) -> bytes: + try: + with open(os.path.join(basedir, "iqpilot", "docs", "CHANGELOG.md"), "rb") as f: + r = f.read().split(b'\n\n', 1)[0] # Slice latest release notes + try: + return bytes(parse_markdown(r.decode("utf-8")), encoding="utf-8") + except Exception: + return r + b"\n" + except FileNotFoundError: + pass + except Exception: + cloudlog.exception("failed to parse release notes") + return b"" + + +def get_agnos_target_versions(launch_env_dir: str) -> tuple[str, list[str]]: + out = run([ + "bash", "-c", + r'unset AGNOS_VERSION AGNOS_COMPAT_VERSIONS && source launch_env.sh && printf "%s\n%s\n" "${AGNOS_VERSION}" "${AGNOS_COMPAT_VERSIONS}"', + ], launch_env_dir) + lines = out.splitlines() + expected_version = lines[0].strip() if len(lines) > 0 else "" + compat_versions = [v.strip() for v in (lines[1] if len(lines) > 1 else "").split(",") if v.strip()] + return expected_version, compat_versions + + +def agnos_version_allowed(current_version: str, expected_version: str, compat_versions: list[str]) -> bool: + if current_version == expected_version or current_version.startswith(f"{expected_version}-"): + return True + + return current_version in compat_versions + +def configure_git_auth(cwd: str) -> None: + """Install the IQ.Lvbs read-only git credential helper before any remote op. + + The IQ.Firewall blocks anonymous access to the git server (to stop bandwidth- + wasting mirrors), so the fleet must authenticate. The read token + credential + helper live in a proprietary, signed, compiled bundle + (iqpilot_private.konn3kt.iqlvbs.git_remote); the token never appears in + .git/config, argv, or this open-source file. On dev installs without the + bundle this is a no-op and ambient git credentials are used.""" + try: + from iqpilot.system.proprietary_runtime._verified_import import import_verified_module + import_verified_module("iqpilot_updater_private", "iqpilot_private.updater.git_remote").configure(cwd) + except Exception: + cloudlog.info("updater: proprietary git auth unavailable; using ambient git credentials") + + try: + from iqpilot.common.git_creds import configure as configure_user_creds + configure_user_creds(cwd) + except Exception: + cloudlog.exception("updater: user git credentials unavailable") + + +def setup_git_options(cwd: str) -> None: + # We sync FS object atimes (which NEOS doesn't use) and mtimes, but ctimes + # are outside user control. Make sure Git is set up to ignore system ctimes, + # because they change when we make hard links during finalize. Otherwise, + # there is a lot of unnecessary churn. This appears to be a common need on + # OSX as well: https://www.git-tower.com/blog/make-git-rebase-safe-on-osx/ + + # We are using copytree to copy the directory, which also changes + # inode numbers. Ignore those changes too. + + # Set protocol to the new version (default after git 2.26) to reduce data + # usage on git fetch --dry-run from about 400KB to 18KB. + git_cfg = [ + ("core.trustctime", "false"), + ("core.checkStat", "minimal"), + ("protocol.version", "2"), + ("gc.auto", "0"), + ("gc.autoDetach", "false"), + ] + for option, value in git_cfg: + run(["git", "config", option, value], cwd) + + +def cleanup_stale_prebuilt_marker(cwd: str, branch: str) -> None: + prebuilt_path = os.path.join(cwd, "prebuilt") + if not os.path.exists(prebuilt_path): + return + + tracked = True + try: + run(["git", "ls-files", "--error-unmatch", "prebuilt"], cwd) + except subprocess.CalledProcessError: + tracked = False + + if not tracked and not branch.endswith("-prebuilt"): + os.remove(prebuilt_path) + cloudlog.info("removed stale untracked prebuilt marker on non-prebuilt branch %s", branch) + + +def handle_agnos_update() -> None: + from iqpilot.system.hardware.tici.agnos import flash_agnos_update, get_target_slot_number + + cur_version = HARDWARE.get_os_version() + device_type = HARDWARE.get_device_type() + is_tici_c3 = device_type in ("tici", "three") + updated_version, compat_versions = get_agnos_target_versions(BASEDIR) + + cloudlog.info(f"AGNOS version check: current={cur_version}, target={updated_version}, compat={compat_versions}") + if agnos_version_allowed(cur_version, updated_version, compat_versions): + return + + cloudlog.info(f"Beginning background installation for AGNOS {updated_version}") + set_offroad_alert("Offroad_NeosUpdate", True) + + manifest_name = "agnos_tici_15_1.json" if is_tici_c3 else "agnos.json" + manifest_path = os.path.join(BASEDIR, "iqpilot/system/hardware/tici", manifest_name) + cloudlog.info(f"AGNOS manifest selected: device_type={device_type}, manifest={manifest_name}") + target_slot_number = get_target_slot_number() + flash_agnos_update(manifest_path, target_slot_number, cloudlog) + set_offroad_alert("Offroad_NeosUpdate", False) + + +class Updater: + def __init__(self): + self.params = Params() + self.branches = defaultdict(lambda: None) + self._has_internet: bool = False + + # The commit/branch the running processes booted from. We update BASEDIR in + # place, so this is what we diff against to know a reboot is needed. + try: + self.running_commit = self.get_commit_hash(BASEDIR) + self.running_branch = self.get_branch(BASEDIR) + self.running_description = self.get_description(BASEDIR) + except Exception: + cloudlog.exception("updater: failed to capture running version") + self.running_commit = "" + self.running_branch = "" + self.running_description = "" + + @property + def git_mode(self) -> bool: + return has_git_repo(BASEDIR) + + @property + def has_internet(self) -> bool: + return self._has_internet + + @property + def install_mode(self) -> str: + mode = self.params.get("UpdaterInstallMode") + if mode not in (UpdateInstallMode.DOWNLOAD_ONLY, UpdateInstallMode.DOWNLOAD_AND_INSTALL): + return UpdateInstallMode.DOWNLOAD_AND_INSTALL + return mode + + @property + def target_branch(self) -> str: + b: str | None = self.params.get("UpdaterTargetBranch") + if b is None: + b = self.get_branch(BASEDIR) + b = IQ_BRANCH_MIGRATIONS.get((HARDWARE.get_device_type(), b), b) + return b + + @property + def update_ready(self) -> bool: + """True when the code on disk differs from what's running -> reboot to apply. + After a reboot this is False again, since running_* is recaptured at start.""" + if not self.git_mode: + return False + on_disk_commit = self.get_commit_hash(BASEDIR) + on_disk_branch = self.get_branch(BASEDIR) + return (on_disk_commit != self.running_commit) or (on_disk_branch != self.running_branch) + + @property + def update_available(self) -> bool: + """True when the code on disk is behind the remote target -> can download.""" + if not self.git_mode: + return False + if len(self.branches) == 0: + return False + target = self.target_branch + on_disk_commit = self.get_commit_hash(BASEDIR) + on_disk_branch = self.get_branch(BASEDIR) + hash_mismatch = self.branches[target] is not None and on_disk_commit != self.branches[target] + branch_mismatch = on_disk_branch != target + return hash_mismatch or branch_mismatch + + def get_branch(self, path: str) -> str: + if not has_git_repo(path): + try: + return get_build_metadata(path).channel + except Exception: + return "" + return run(["git", "rev-parse", "--abbrev-ref", "HEAD"], path).rstrip() + + def get_commit_hash(self, path: str = BASEDIR) -> str: + if not has_git_repo(path): + try: + return get_build_metadata(path).openpilot.git_commit + except Exception: + return "" + return run(["git", "rev-parse", "HEAD"], path).rstrip() + + def get_description(self, basedir: str) -> str: + if not os.path.exists(basedir): + return "" + + try: + if has_git_repo(basedir): + with open(os.path.join(basedir, "iqpilot", "common", "version.h")) as version_file: + version = version_file.read().split('"')[1] + branch = run(["git", "rev-parse", "--abbrev-ref", "HEAD"], basedir).rstrip() + commit = run(["git", "rev-parse", "HEAD"], basedir).rstrip()[:7] + commit_date = display_commit_date(run(["git", "show", "--no-patch", "--format='%ct %ci'", "HEAD"], basedir)) + else: + metadata = get_build_metadata(basedir) + branch = metadata.channel + commit = metadata.openpilot.git_commit[:7] + version = metadata.openpilot.version + commit_date = display_commit_date(metadata.openpilot.git_commit_date) + return f"{version} / {branch} / {commit} / {commit_date}" + except Exception: + cloudlog.exception("updater.get_description") + return "" + + def set_params(self, update_success: bool, failed_count: int, exception: str | None) -> None: + self.params.put("UpdateFailedCount", failed_count) + self.params.put("UpdaterTargetBranch", self.target_branch) + + self.params.put_bool("UpdaterFetchAvailable", self.update_available) + if len(self.branches): + self.params.put("UpdaterAvailableBranches", ','.join(self.branches.keys())) + + last_uptime_onroad = self.params.get("UptimeOnroad", return_default=True) + last_route_count = self.params.get("RouteCount", return_default=True) + if update_success: + self.params.put("LastUpdateTime", datetime.datetime.now(datetime.UTC).replace(tzinfo=None)) + self.params.put("LastUpdateUptimeOnroad", last_uptime_onroad) + self.params.put("LastUpdateRouteCount", last_route_count) + + if exception is None: + self.params.remove("LastUpdateException") + else: + self.params.put("LastUpdateException", exception) + + # Current = what's running (captured at boot, stable until reboot). + # New = what's on disk now (changes once we fetch in place). + self.params.put("UpdaterCurrentDescription", self.running_description) + self.params.put("UpdaterCurrentReleaseNotes", parse_release_notes(BASEDIR)) + self.params.put("UpdaterNewDescription", self.get_description(BASEDIR)) + self.params.put("UpdaterNewReleaseNotes", parse_release_notes(BASEDIR)) + self.params.put_bool("UpdateAvailable", self.update_ready) + + # Handle user prompt + for alert in ("Offroad_UpdateFailed", "Offroad_ConnectivityNeeded", "Offroad_ConnectivityNeededPrompt"): + set_offroad_alert(alert, False) + + build_metadata = get_build_metadata() + if failed_count > 15 and exception is not None and self.has_internet: + if build_metadata.tested_channel: + extra_text = "Ensure the software is correctly installed. Uninstall and re-install if this error persists." + else: + extra_text = exception + set_offroad_alert("Offroad_UpdateFailed", True, extra_text=extra_text) + + def check_for_update(self) -> None: + cloudlog.info("checking for updates") + + if not self.git_mode: + cloudlog.info("updater: baked non-git deployment detected; skipping git update check") + self._has_internet = False + self.branches = defaultdict(lambda: None) + return + + excluded_branches = ('release2', 'release2-staging') + + # authenticate before the very first remote op (the internet probe below), + # since anonymous access is firewalled + configure_git_auth(BASEDIR) + + try: + run(["git", "ls-remote", "origin", "HEAD"], BASEDIR) + self._has_internet = True + except subprocess.CalledProcessError: + self._has_internet = False + + setup_git_options(BASEDIR) + output = run(["git", "ls-remote", "--heads"], BASEDIR) + + self.branches = defaultdict(lambda: None) + for line in output.split('\n'): + ls_remotes_re = r'(?P\b[0-9a-f]{5,40}\b)(\s+)(refs\/heads\/)(?P.*$)' + x = re.fullmatch(ls_remotes_re, line.strip()) + if x is not None and x.group('branch_name') not in excluded_branches: + self.branches[x.group('branch_name')] = x.group('commit_sha') + + cur_branch = self.get_branch(BASEDIR) + cur_commit = self.get_commit_hash(BASEDIR) + new_branch = self.target_branch + new_commit = self.branches[new_branch] + if (cur_branch, cur_commit) != (new_branch, new_commit): + cloudlog.info(f"update available, {cur_branch} ({str(cur_commit)[:7]}) -> {new_branch} ({str(new_commit)[:7]})") + else: + cloudlog.info(f"up to date on {cur_branch} ({str(cur_commit)[:7]})") + + def fetch_update(self) -> None: + if not self.git_mode: + cloudlog.info("updater: baked non-git deployment detected; skipping git fetch") + self.params.put("UpdaterState", "idle") + return + + cloudlog.info("attempting git fetch and in-place reset") + + configure_git_auth(BASEDIR) + + self.params.put("UpdaterState", "downloading...") + self.params.put_bool("UpdateAvailable", False) + + setup_git_options(BASEDIR) + + run(["git", "config", "--replace-all", "remote.origin.fetch", "+refs/heads/*:refs/remotes/origin/*"], BASEDIR) + + branch = self.target_branch + git_fetch_output = run(["git", "fetch", "origin", branch], BASEDIR) + cloudlog.info("git fetch success: %s", git_fetch_output) + + cloudlog.info("git reset in progress") + cmds = [ + ["git", "checkout", "--force", "-B", branch, "FETCH_HEAD"], + ["git", "branch", "--set-upstream-to", f"origin/{branch}"], + ["git", "reset", "--hard", "FETCH_HEAD"], + ] + r = [run(cmd, BASEDIR) for cmd in cmds] + cloudlog.info("git reset success: %s", '\n'.join(r)) + cleanup_stale_prebuilt_marker(BASEDIR, branch) + + # TODO: show agnos download progress + if AGNOS: + handle_agnos_update() + + cloudlog.info("update applied to disk; reboot to finish") + + +# cap the reboot quiet-window deferral so an idle SSH session can't hold updates forever +MAX_SSH_DEFER_S = 2 * 60 * 60 + + +def has_active_ssh_session() -> bool: + """True when someone is interactively logged in over SSH. tmux's own panes + register in utmp with a tmux(...) host and don't count.""" + try: + out = subprocess.check_output(["who"], encoding="utf8", timeout=5) + except Exception: + return False + for line in out.splitlines(): + fields = line.split() + if len(fields) >= 2 and fields[1].startswith("pts/") and "tmux(" not in line: + return True + return False + + +def prepare_environment() -> bool: + """Run the boot-time env sync + build right after an update lands on disk, + while the device is offroad and the stack is idle -- so the reboot that + follows starts on a warm cache with nothing heavy left to do at boot. + launch_chffrplus.sh keeps the identical steps as its fallback path.""" + # same env the launch script builds under: repo on PYTHONPATH, venv tools + # (uv, cython, ...) on PATH + env = os.environ.copy() + env["PYTHONPATH"] = BASEDIR + (os.pathsep + env["PYTHONPATH"] if env.get("PYTHONPATH") else "") + env["PATH"] = os.pathsep.join([os.path.join(BASEDIR, ".venv", "bin"), "/usr/local/venv/bin", env.get("PATH", "")]) + + def _run(cmd: list[str], cwd: str) -> None: + subprocess.check_output(cmd, cwd=cwd, stderr=subprocess.STDOUT, encoding="utf8", env=env) + + try: + env_sync = os.path.join(BASEDIR, "artifacts", "runtime", "env_sync.sh") + if os.path.exists(env_sync): + cloudlog.info("update prep: syncing python env") + _run(["bash", env_sync], BASEDIR) + venv_python = os.path.join(BASEDIR, ".venv", "bin", "python3") + build_py = os.path.join(BASEDIR, "iqpilot", "system", "manager", "build.py") + if not os.path.exists(os.path.join(BASEDIR, "prebuilt")) and os.path.exists(venv_python) and os.path.exists(build_py): + cloudlog.info("update prep: building") + _run([venv_python, build_py, "--headless"], os.path.dirname(build_py)) + cloudlog.info("update prep: done, next boot starts on a warm cache") + return True + except subprocess.CalledProcessError as e: + output = e.output[-4096:] if e.output else "" + cloudlog.event("update prep failed", cmd=e.cmd, output=output, returncode=e.returncode, error=True) + return False + + +def publish_running_version(params: Params) -> None: + try: + updater = Updater() + release_notes = parse_release_notes(BASEDIR) + params.put("UpdaterState", "idle") + params.put("UpdaterTargetBranch", updater.target_branch) + params.put("UpdaterCurrentDescription", updater.running_description) + params.put("UpdaterCurrentReleaseNotes", release_notes) + params.put("UpdaterNewDescription", updater.running_description) + params.put("UpdaterNewReleaseNotes", release_notes) + params.put_bool("UpdaterFetchAvailable", False) + params.put_bool("UpdateAvailable", False) + except Exception: + cloudlog.exception("updater: failed to publish running version") + + +def main() -> None: + params = Params() + + if params.get_bool("DisableUpdates"): + cloudlog.warning("updates are disabled by the DisableUpdates param") + publish_running_version(params) + exit(0) + + with open(LOCK_FILE, 'w') as ov_lock_fd: + try: + fcntl.flock(ov_lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except OSError as e: + raise RuntimeError("couldn't get overlay lock; is another instance running?") from e + + # Set low io priority + proc = psutil.Process() + if psutil.LINUX: + proc.ionice(psutil.IOPRIO_CLASS_BE, value=7) + + cleanup_stale_overlay() + + if not params.get("InstallDate"): + t = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) + params.put("InstallDate", t) + + updater = Updater() + update_failed_count = 0 # TODO: Load from param? + wait_helper = WaitTimeHelper() + + params.put("UpdaterState", "idle") + params.put_bool("UpdateAvailable", False) + + # Run the update loop + first_run = True + # commit hash the apply-time prep (env sync + build) last succeeded for + prepared_commit = updater.running_commit + # when the pending reboot first became eligible, for the SSH quiet-window cap + install_eligible_since = None + while True: + wait_helper.ready_event.clear() + + # Attempt an update + exception = None + install_pending = False + try: + # ensure we have some params written soon after startup + updater.set_params(False, update_failed_count, exception) + + if not system_time_valid() or first_run: + first_run = False + wait_helper.sleep(60) + continue + + update_failed_count += 1 + + # check for update + params.put("UpdaterState", "checking...") + updater.check_for_update() + + # download update + last_fetch = params.get("UpdaterLastFetchTime") + timed_out = last_fetch is None or (datetime.datetime.now(datetime.UTC).replace(tzinfo=None) - last_fetch > datetime.timedelta(days=3)) + user_requested_fetch = wait_helper.user_request == UserRequest.FETCH + if params.get_bool("IsOnroad") and not user_requested_fetch: + # the update download + AGNOS flash hold hundreds of MB; onroad that trips lowMemory, + # so defer the heavy work until parked + cloudlog.info("skipping fetch, device is onroad") + elif params.get_bool("NetworkMetered") and not timed_out and not user_requested_fetch: + cloudlog.info("skipping fetch, connection metered") + elif wait_helper.user_request == UserRequest.CHECK: + cloudlog.info("skipping fetch, only checking") + elif updater.update_available or user_requested_fetch: + updater.fetch_update() + write_time_to_param(params, "UpdaterLastFetchTime") + else: + cloudlog.info("already up to date, skipping fetch") + + # Finish a fetched update. update_ready stays true across cycles (on-disk + # vs running commit), so failed prep and deferred reboots retry here on + # the short sleep instead of being one-shot at fetch time. + if updater.update_ready and not params.get_bool("IsOnroad"): + on_disk_commit = updater.get_commit_hash(BASEDIR) + if prepared_commit != on_disk_commit: + if prepare_environment(): + prepared_commit = on_disk_commit + if prepared_commit != on_disk_commit: + # prep failed: hold the reboot and retry next cycle. The boot-time + # fallback path still exists, but rebooting into it is exactly the + # heavy all-at-once boot that takes devices down. + install_pending = True + elif updater.install_mode == UpdateInstallMode.DOWNLOAD_AND_INSTALL: + if install_eligible_since is None: + install_eligible_since = time.monotonic() + if has_active_ssh_session() and time.monotonic() - install_eligible_since < MAX_SSH_DEFER_S: + cloudlog.info("update ready; deferring reboot, active SSH session") + install_pending = True + else: + cloudlog.info("update ready; auto-install mode enabled, triggering reboot") + params.put_bool("DoReboot", True) + else: + install_eligible_since = None + update_failed_count = 0 + except subprocess.CalledProcessError as e: + cloudlog.event( + "update process failed", + cmd=e.cmd, + output=e.output, + returncode=e.returncode + ) + exception = f"command failed: {e.cmd}\n{e.output}" + except Exception as e: + cloudlog.exception("uncaught updated exception, shouldn't happen") + exception = str(e) + + try: + params.put("UpdaterState", "idle") + update_successful = (update_failed_count == 0) + updater.set_params(update_successful, update_failed_count, exception) + except Exception: + cloudlog.exception("uncaught updated exception while setting params, shouldn't happen") + + # infrequent attempts if we successfully updated recently; short cadence + # while an install is pending (failed prep retry or deferred reboot) + wait_helper.user_request = UserRequest.NONE + wait_helper.sleep(5*60 if (update_failed_count > 0 or install_pending) else 1.5*60*60) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/system/version.py b/iqpilot/system/version.py new file mode 100755 index 000000000..cb731d009 --- /dev/null +++ b/iqpilot/system/version.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 +from dataclasses import dataclass +from functools import cache +import json +import os +import pathlib +import subprocess + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_commit_date + +RELEASE_IQ_BRANCHES = ['release', 'release-tici', 'release-new'] +TESTED_BRANCHES = RELEASE_IQ_BRANCHES +IQ_BRANCH_MIGRATIONS: dict[tuple[str, str], str] = {} + +BUILD_METADATA_FILENAME = "build.json" + +training_version: str = "0.2.0" +terms_version: str = "2" + + +UNKNOWN_VERSION = "0.0.0" + + +@cache +def get_version(path: str = BASEDIR) -> str: + try: + with open(os.path.join(path, "iqpilot", "common", "version.h")) as _versionf: + return _versionf.read().split('"')[1] + except (OSError, IndexError): + return UNKNOWN_VERSION + + +def get_release_notes(path: str = BASEDIR) -> str: + for rel in (("iqpilot", "docs", "CHANGELOG.md"), ("docs", "CHANGELOG.md")): + try: + with open(os.path.join(path, *rel)) as f: + return f.read().split('\n\n', 1)[0] + except OSError: + continue + return "" + + +@cache +def is_prebuilt(path: str = BASEDIR) -> bool: + return os.path.exists(os.path.join(path, 'prebuilt')) + + +@cache +def is_dirty(cwd: str = BASEDIR) -> bool: + if not get_origin() or not get_short_branch(): + return True + + dirty = False + try: + # Actually check dirty files + if not is_prebuilt(cwd): + # This is needed otherwise touched files might show up as modified + try: + subprocess.check_call(["git", "update-index", "--refresh"], cwd=cwd) + except subprocess.CalledProcessError: + pass + + branch = get_branch() + if not branch: + return True + dirty = (subprocess.call(["git", "diff-index", "--quiet", branch, "--"], cwd=cwd)) != 0 + except subprocess.CalledProcessError: + cloudlog.exception("git subprocess failed while checking dirty") + dirty = True + + return dirty + + +@dataclass +class OpenpilotMetadata: + version: str + release_notes: str + git_commit: str + git_origin: str + git_commit_date: str + build_style: str + is_dirty: bool # whether there are local changes + + @property + def short_version(self) -> str: + return self.version.split('-')[0] + + @property + def comma_remote(self) -> bool: + # note to fork maintainers, this is used for release metrics. please do not + # touch this to get rid of the orange startup alert. there's better ways to do that + return self.git_normalized_origin == "github.com/commaai/openpilot" + + @property + def iqpilot_remote(self) -> bool: + return self.git_normalized_origin in ("github.com/iqpilot/iqpilot", + "github.com/iqpilot/openpilot") + + @property + def git_normalized_origin(self) -> str: + return self.git_origin \ + .replace("git@", "", 1) \ + .replace(".git", "", 1) \ + .replace("https://", "", 1) \ + .replace(":", "/", 1) + + +@dataclass +class BuildMetadata: + channel: str + openpilot: OpenpilotMetadata + + @property + def tested_channel(self) -> bool: + return self.channel in TESTED_BRANCHES + + @property + def release_channel(self) -> bool: + return self.channel in RELEASE_IQ_BRANCHES + + @property + def canonical(self) -> str: + return f"{self.openpilot.version}-{self.openpilot.git_commit}-{self.openpilot.build_style}" + + @property + def ui_description(self) -> str: + return f"{self.openpilot.version} / {self.openpilot.git_commit[:6]} / {self.channel}" + + @property + def master_channel(self) -> bool: + return self.channel in RELEASE_IQ_BRANCHES + + @property + def development_channel(self) -> bool: + return self.channel == "dev" or self.channel.startswith("dev-") or self.channel.endswith("-prebuilt") + + @property + def channel_type(self) -> str: + if "-tici" in self.channel or self.channel in ("release-new" or "master-mici"): + return "tici" + elif self.development_channel: + return "development" + elif self.tested_channel: + return "staging" + elif self.master_channel: + return "master" + elif self.release_channel: + return "release" + else: + return "feature" + + +def build_metadata_from_dict(build_metadata: dict) -> BuildMetadata: + channel = build_metadata.get("channel", "unknown") + openpilot_metadata = build_metadata.get("openpilot", {}) + version = openpilot_metadata.get("version", "unknown") + release_notes = openpilot_metadata.get("release_notes", "unknown") + git_commit = openpilot_metadata.get("git_commit", "unknown") + git_origin = openpilot_metadata.get("git_origin", "unknown") + git_commit_date = openpilot_metadata.get("git_commit_date", "unknown") + build_style = openpilot_metadata.get("build_style", "unknown") + return BuildMetadata(channel, + OpenpilotMetadata( + version=version, + release_notes=release_notes, + git_commit=git_commit, + git_origin=git_origin, + git_commit_date=git_commit_date, + build_style=build_style, + is_dirty=False)) + + +def get_build_metadata(path: str = BASEDIR) -> BuildMetadata: + build_metadata_path = pathlib.Path(path) / BUILD_METADATA_FILENAME + + if build_metadata_path.exists(): + build_metadata = json.loads(build_metadata_path.read_text()) + return build_metadata_from_dict(build_metadata) + + git_folder = pathlib.Path(path) / ".git" + + if git_folder.exists(): + return BuildMetadata(get_short_branch(path), + OpenpilotMetadata( + version=get_version(path), + release_notes=get_release_notes(path), + git_commit=get_commit(path), + git_origin=get_origin(path), + git_commit_date=get_commit_date(path), + build_style="unknown", + is_dirty=is_dirty(path))) + + cloudlog.exception("unable to get build metadata") + raise Exception("invalid build metadata") + + +if __name__ == "__main__": + print(get_build_metadata()) diff --git a/iqpilot/system/webrtc/__init__.py b/iqpilot/system/webrtc/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/system/webrtc/device/native_audio.py b/iqpilot/system/webrtc/device/native_audio.py new file mode 100644 index 000000000..c0235f992 --- /dev/null +++ b/iqpilot/system/webrtc/device/native_audio.py @@ -0,0 +1,135 @@ +import asyncio +import contextlib +from collections import deque +from fractions import Fraction + +import av + +from iqpilot.cereal import messaging +from iqpilot.selfdrive.ui.soundd import SAMPLE_RATE as SOUND_SAMPLE_RATE + + +WEBRTC_AUDIO_SERVICE = "webrtcAudioData" +WEBRTC_AUDIO_PTIME = 0.020 + + +class AudioInputOpusProducer: + def __init__(self) -> None: + self._sock = messaging.sub_sock("rawAudioData", conflate=False) + self._pcm = bytearray() + self._source_rate = 16_000 + self._next_pts = 0 + self._packet_pts = 0 + self._pending: deque[tuple[bytes, int]] = deque() + self._enabled = True + self._resampler = av.AudioResampler(format="fltp", layout="mono", rate=48_000) + self._encoder = av.CodecContext.create("libopus", "w") + self._encoder.sample_rate = 48_000 + self._encoder.layout = "mono" + self._encoder.format = "fltp" + self._encoder.open() + + def enable(self, enabled: bool) -> None: + self._enabled = enabled + + async def _read_pcm_frame(self) -> av.AudioFrame: + while True: + samples = max(1, int(WEBRTC_AUDIO_PTIME * self._source_rate)) + target_bytes = samples * 2 + while len(self._pcm) < target_bytes: + msg = messaging.recv_one_or_none(self._sock) + if msg is None: + await asyncio.sleep(0.002) + continue + audio = msg.rawAudioData + rate = int(audio.sampleRate) or self._source_rate + if rate != self._source_rate: + self._source_rate = rate + self._pcm.clear() + continue + self._pcm.extend(bytes(audio.data)) + + data = bytes(self._pcm[:target_bytes]) + del self._pcm[:target_bytes] + frame = av.AudioFrame(format="s16", layout="mono", samples=samples) + frame.planes[0].update(data) + frame.sample_rate = self._source_rate + return frame + + async def recv(self) -> tuple[bytes, int] | None: + if not self._enabled: + await asyncio.sleep(WEBRTC_AUDIO_PTIME) + return None + while not self._pending: + source_frame = await self._read_pcm_frame() + for frame in self._resampler.resample(source_frame): + frame.pts = self._next_pts + frame.time_base = Fraction(1, 48_000) + self._next_pts += frame.samples + for packet in self._encoder.encode(frame): + self._pending.append((bytes(packet), self._packet_pts)) + self._packet_pts += int(packet.duration or frame.samples) + return self._pending.popleft() + + +class DebugAudioOpusProducer(AudioInputOpusProducer): + async def _read_pcm_frame(self) -> av.AudioFrame: + samples = int(WEBRTC_AUDIO_PTIME * self._source_rate) + await asyncio.sleep(WEBRTC_AUDIO_PTIME) + frame = av.AudioFrame(format="s16", layout="mono", samples=samples) + frame.planes[0].update(bytes(samples * 2)) + frame.sample_rate = self._source_rate + return frame + + +class IncomingOpusCerealProxy: + def __init__(self, track) -> None: + self._loop = asyncio.get_running_loop() + self._queue: asyncio.Queue[bytes] = asyncio.Queue(maxsize=32) + self._pm = messaging.PubMaster([WEBRTC_AUDIO_SERVICE]) + self._decoder = av.CodecContext.create("opus", "r") + self._resampler = av.AudioResampler(format="s16", layout="mono", rate=SOUND_SAMPLE_RATE) + self._task: asyncio.Task | None = None + track.on_frame(self._on_frame) + + def _on_frame(self, payload: bytes, _info) -> None: + def enqueue() -> None: + if self._queue.full(): + with contextlib.suppress(asyncio.QueueEmpty): + self._queue.get_nowait() + self._queue.put_nowait(bytes(payload)) + self._loop.call_soon_threadsafe(enqueue) + + def start(self) -> None: + if self._task is None: + self._task = asyncio.create_task(self.run()) + + async def stop(self) -> None: + if self._task is None: + return + self._task.cancel() + try: + await self._task + except asyncio.CancelledError: + pass + self._task = None + + def _publish(self, frame: av.AudioFrame) -> None: + data = frame.to_ndarray().tobytes() + if not data: + return + msg = messaging.new_message(WEBRTC_AUDIO_SERVICE, valid=True) + msg.webrtcAudioData.data = data + msg.webrtcAudioData.sampleRate = frame.sample_rate + self._pm.send(WEBRTC_AUDIO_SERVICE, msg) + + async def run(self) -> None: + while True: + payload = await self._queue.get() + try: + for decoded in self._decoder.decode(av.Packet(payload)): + for frame in self._resampler.resample(decoded): + self._publish(frame) + except Exception: + # A malformed or stale packet must not end the video/control session. + continue diff --git a/iqpilot/system/webrtc/device/native_video.py b/iqpilot/system/webrtc/device/native_video.py new file mode 100644 index 000000000..63f487fc4 --- /dev/null +++ b/iqpilot/system/webrtc/device/native_video.py @@ -0,0 +1,311 @@ +import asyncio +import logging +import struct +import time + +import av +from iqpilot.system.webrtc.rtc.tracks import TiciVideoStreamTrack + +from iqpilot.cereal import messaging +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_MDL, DT_DMON + +# Arbitrary 16-byte UUID identifying konn3kt frame-timing SEI messages. When timing +# telemetry is enabled, each frame carries a user_data_unregistered SEI NAL with four +# big-endian doubles (ms): encode duration, IPC/queue delay, host transit, and the +# device wall clock. The client decodes these to compute true glass-to-glass latency. +TIMING_SEI_UUID = bytes([ + 0xa5, 0xe0, 0xc4, 0xa4, 0x5b, 0x6e, 0x4e, 0x1e, + 0x9c, 0x7e, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, +]) +# Annex-B start code + SEI NAL (type 6) + user_data_unregistered (type 5) + payload size +# (0x30 = 48 bytes = 16 UUID + 32 data). Trailing 0x80 is the RBSP stop bit. +_SEI_PREFIX = b'\x00\x00\x00\x01\x06\x05\x30' + TIMING_SEI_UUID + + +class LiveStreamVideoStreamTrack(TiciVideoStreamTrack): + livestream_camera_to_sock_mapping = { + "driver": "livestreamDriverEncodeData", + "wideRoad": "livestreamWideRoadEncodeData", + "road": "livestreamRoadEncodeData", + } + main_camera_to_sock_mapping = { + "driver": "driverEncodeData", + "wideRoad": "wideRoadEncodeData", + "road": "roadEncodeData", + } + + # Number of live tracks still waiting for their first keyframe. The on-demand + # keyframe request (LivestreamRequestKeyframe) is a single global param honored by + # every encoder, so with multiple concurrent tracks (dual-camera PiP) we must not + # clear it until *all* tracks have received an IDR — otherwise the first track to + # get its keyframe clears the request and starves the others (black feed). + _kf_pending_count = 0 + + def __init__(self, camera_type: str): + dt = DT_DMON if camera_type == "driver" else DT_MDL + super().__init__(camera_type, dt) + + self._params = Params() + self._camera_type = camera_type + self._candidate_topics = [ + self.main_camera_to_sock_mapping[camera_type], + self.livestream_camera_to_sock_mapping[camera_type], + ] + self._socks = {topic: messaging.sub_sock(topic, conflate=True) for topic in self._candidate_topics} + self._active_topic = self._preferred_topics()[0] + self._pts = 0 + self._t0_ns = time.monotonic_ns() + self._cached_header: bytes = b"" + self._sent_keyframe = False + self._kf_requested = False # whether this track counts toward _kf_pending_count + self._frame_count = 0 + self._last_frame_time = 0.0 + self._last_preference_refresh = 0.0 + # Tracks how long the H264 livestream feed has been silent, to gate the last-resort main-feed + # fallback (see recv) without flapping between sources frame-by-frame. + self._live_silent_since: float | None = None + # Opt-in glass-to-glass latency telemetry (toggled by the client over the data channel). + self.timing_sei_enabled = False + self._logger = logging.getLogger("LiveStreamVideoStreamTrack") + + # Ask the encoder for an immediate IDR so the stream starts fast instead of waiting up to a full + # GOP for the next periodic keyframe (encoderd honors LivestreamRequestKeyframe per-frame). + self._mark_keyframe_needed() + + def _request_keyframe(self, enabled: bool) -> None: + try: + self._params.put_bool("LivestreamRequestKeyframe", enabled) + except Exception: + self._logger.exception("failed to set LivestreamRequestKeyframe") + + def _mark_keyframe_needed(self) -> None: + """This track needs (another) keyframe: keep the global request asserted.""" + if not self._kf_requested: + LiveStreamVideoStreamTrack._kf_pending_count += 1 + self._kf_requested = True + self._request_keyframe(True) + + def request_keyframe(self) -> None: + """RTCP PLI hook used by libdatachannel's native H.264 packetizer.""" + self._mark_keyframe_needed() + + def _mark_keyframe_received(self) -> None: + """This track got its keyframe; only clear the global request once no track needs one.""" + if self._kf_requested: + self._kf_requested = False + LiveStreamVideoStreamTrack._kf_pending_count = max(0, LiveStreamVideoStreamTrack._kf_pending_count - 1) + if LiveStreamVideoStreamTrack._kf_pending_count == 0: + self._request_keyframe(False) + + def stop(self): + # Release our pending-keyframe hold so a torn-down track that never received an + # IDR doesn't pin LivestreamRequestKeyframe True forever (continuous keyframes). + if getattr(self, "_kf_requested", False): + self._kf_requested = False + LiveStreamVideoStreamTrack._kf_pending_count = max(0, LiveStreamVideoStreamTrack._kf_pending_count - 1) + try: + super().stop() + except Exception: + pass + + def switch_camera(self, camera_type: str) -> None: + """Repoint this track at a different camera without renegotiating the peer connection. + + Lets a single video track back the whole Live View — the client flips cameras over the + data channel and we swap the source here, instead of uplinking every camera at once.""" + if camera_type not in self.livestream_camera_to_sock_mapping: + self._logger.warning("[%s] ignoring switch to unknown camera %s", self._id, camera_type) + return + if camera_type == self._camera_type: + return + self._logger.info("[%s] switching camera %s -> %s", self._id, self._camera_type, camera_type) + self._camera_type = camera_type + self._candidate_topics = [ + self.main_camera_to_sock_mapping[camera_type], + self.livestream_camera_to_sock_mapping[camera_type], + ] + self._socks = {topic: messaging.sub_sock(topic, conflate=True) for topic in self._candidate_topics} + self._active_topic = self._preferred_topics()[0] + # Force a fresh keyframe/header before emitting frames from the new source, and ask the encoder + # for an immediate IDR so the camera switch isn't stalled waiting for the next periodic keyframe. + self._cached_header = b"" + self._sent_keyframe = False + self._last_preference_refresh = 0.0 + self._live_silent_since = None + self._mark_keyframe_needed() + + def _preferred_topics(self) -> list[str]: + # WebRTC currently forces H.264. The dedicated livestream topics are the H.264 feeds, + # while the main encode topics are the full-resolution HEVC recordings. Prefer the + # livestream feeds both onroad and offroad, and keep the main topics only as fallback. + return [ + self.livestream_camera_to_sock_mapping[self._camera_type], + self.main_camera_to_sock_mapping[self._camera_type], + ] + + def _reset_decoder_state(self, topic: str) -> None: + if topic == self._active_topic: + return + self._logger.info("[%s] switching video source from %s to %s", self._id, self._active_topic, topic) + self._active_topic = topic + self._cached_header = b"" + self._sent_keyframe = False + + def _timing_sei(self, evta, log_mono_time: int) -> bytes: + """Build a timing SEI NAL from encode metadata, or empty bytes when disabled.""" + if not self.timing_sei_enabled: + return b"" + idx = evta.idx + return _SEI_PREFIX + struct.pack( + '>4d', + (idx.timestampEof - idx.timestampSof) / 1e6, # encode duration (ms) + (log_mono_time - idx.timestampEof) / 1e6, # IPC/queue delay (ms) + (time.monotonic_ns() - log_mono_time) / 1e6, # host transit so far (ms) + time.time() * 1000, # device wall clock (ms) # noqa: TID251 + ) + b'\x80' + + def _is_keyframe(self, data: bytes) -> bool: + """Check if H.264 NAL unit contains an IDR keyframe (NAL type 5).""" + i = 0 + while i < len(data) - 4: + # Look for Annex B start codes: 0x000001 or 0x00000001 + if data[i:i+3] == b'\x00\x00\x01': + nal_type = data[i+3] & 0x1f + if nal_type == 5: # IDR slice + return True + i += 3 + elif data[i:i+4] == b'\x00\x00\x00\x01': + nal_type = data[i+4] & 0x1f + if nal_type == 5: # IDR slice + return True + i += 4 + else: + i += 1 + return False + + async def recv(self): + while True: + now = time.monotonic() + # Resolve topics each iteration: a camera switch (different async task) can rebuild self._socks + # across the await below, so a value cached before the loop would index a stale key (KeyError). + live_topic = self.livestream_camera_to_sock_mapping[self._camera_type] + main_topic = self.main_camera_to_sock_mapping[self._camera_type] + # Lock onto the dedicated H264 livestream feed. Onroad the HEVC main feed also publishes at + # 20fps; eagerly preferring whichever socket had a frame ready raced frame-by-frame, reset the + # decoder every frame, and (the track is negotiated H264) shoved HEVC garbage into the stream — + # the onroad choppiness. Only fall back to the main feed as a last resort after a long + # livestream silence (e.g. stream_encoderd still spinning up), and snap back when it returns. + msg = messaging.recv_one_or_none(self._socks[live_topic]) + if msg is not None: + self._reset_decoder_state(live_topic) + self._last_frame_time = now + self._live_silent_since = None + break + + if self._live_silent_since is None: + self._live_silent_since = now + elif now - self._live_silent_since > 3.0: + maybe_msg = messaging.recv_one_or_none(self._socks[main_topic]) + if maybe_msg is not None: + self._reset_decoder_state(main_topic) + self._last_frame_time = now + msg = maybe_msg + break + + await asyncio.sleep(0.005) + + evta = getattr(msg, msg.which()) + + header = bytes(evta.header) + data = bytes(evta.data) + self._frame_count += 1 + + # Cache SPS/PPS header when it arrives + if header: + self._cached_header = header + self._logger.debug(f"[{self._id}] cached SPS/PPS header ({len(header)} bytes)") + + # CRITICAL: Cannot decode without SPS/PPS. Wait for it. + if not self._cached_header: + self._logger.debug(f"[{self._id}] frame {self._frame_count}: no SPS/PPS yet, skipping") + return await self.recv() + + is_keyframe = self._is_keyframe(data) + + # Wait for first keyframe before sending any frames + # Browser decoder needs IDR to initialize properly + if not self._sent_keyframe: + if not is_keyframe: + self._logger.debug(f"[{self._id}] frame {self._frame_count}: waiting for keyframe") + return await self.recv() + self._sent_keyframe = True + # Got the IDR we asked for — stop nagging the encoder, but only once every + # concurrent track has its keyframe (multi-track PiP shares the global param). + self._mark_keyframe_received() + self._logger.info(f"[{self._id}] first keyframe received, starting stream") + + # Optional timing SEI NAL, inserted before the slice data (and after SPS/PPS on keyframes). + sei_nal = self._timing_sei(evta, msg.logMonoTime) + + # Prepend SPS/PPS header to keyframes (required by some decoders) + # For non-keyframes, header is optional but safe to include + if is_keyframe: + payload = self._cached_header + sei_nal + data + else: + payload = sei_nal + data + + self._pts = ((time.monotonic_ns() - self._t0_ns) * self._clock_rate) // 1_000_000_000 + + packet = av.Packet(payload) + packet.time_base = self._time_base + packet.pts = int(self._pts) + packet.dts = int(self._pts) + packet.duration = int(self._dt * self._clock_rate) + + if is_keyframe: + packet.is_keyframe = True + + self.log_debug("track sending frame %s (keyframe=%s, size=%d)", self._pts, is_keyframe, len(payload)) + + return packet + + def codec_preference(self) -> str | None: + return "H264" + + +class DebugVideoStreamTrack(TiciVideoStreamTrack): + def __init__(self, camera_type: str): + super().__init__(camera_type, 0.05) + self._codec = av.CodecContext.create("libx264", "w") + self._codec.width = 640 + self._codec.height = 480 + self._codec.pix_fmt = "yuv420p" + self._codec.time_base = self._time_base + self._codec.framerate = 20 + self._codec.options = {"preset": "ultrafast", "tune": "zerolatency"} + self._codec.open() + self._pts = 0 + self.timing_sei_enabled = False + + async def recv(self): + await asyncio.sleep(self._dt) + frame = av.VideoFrame(self._codec.width, self._codec.height, "yuv420p") + frame.planes[0].update(bytes(frame.planes[0].buffer_size)) + for plane in frame.planes[1:]: + plane.update(bytes([128]) * plane.buffer_size) + frame.pts = self._pts + self._pts += int(self._dt * self._clock_rate) + packets = self._codec.encode(frame) + if not packets: + return await self.recv() + packet = av.Packet(b"".join(bytes(encoded) for encoded in packets)) + packet.pts = frame.pts + packet.dts = frame.pts + packet.time_base = self._time_base + packet.duration = int(self._dt * self._clock_rate) + return packet + + def switch_camera(self, camera_type: str) -> None: + if camera_type not in LiveStreamVideoStreamTrack.livestream_camera_to_sock_mapping: + raise ValueError(f"Unknown camera {camera_type}") diff --git a/iqpilot/system/webrtc/rtc/__init__.py b/iqpilot/system/webrtc/rtc/__init__.py new file mode 100644 index 000000000..13cd60a2a --- /dev/null +++ b/iqpilot/system/webrtc/rtc/__init__.py @@ -0,0 +1,2 @@ +from .builder import WebRTCOfferBuilder, WebRTCAnswerBuilder # noqa +from .stream import WebRTCBaseStream, StreamingOffer, ConnectionProvider, MessageHandler # noqa diff --git a/iqpilot/system/webrtc/rtc/builder.py b/iqpilot/system/webrtc/rtc/builder.py new file mode 100644 index 000000000..32173da13 --- /dev/null +++ b/iqpilot/system/webrtc/rtc/builder.py @@ -0,0 +1,89 @@ +# ruff: noqa: UP006, UP035 + +import abc +from typing import Dict, List, Optional + +from .stream import RTCSessionDescription, WebRTCBaseStream, WebRTCOfferStream, WebRTCAnswerStream, ConnectionProvider +from .tracks import TiciVideoStreamTrack, TiciTrackWrapper + + +class WebRTCStreamBuilder(abc.ABC): + @abc.abstractmethod + def stream(self) -> WebRTCBaseStream: + raise NotImplementedError + + +class WebRTCOfferBuilder(WebRTCStreamBuilder): + def __init__(self, connection_provider: ConnectionProvider, bind_address: Optional[str] = None, + ice_servers: Optional[List[dict]] = None): + self.connection_provider = connection_provider + self.bind_address = bind_address + self.ice_servers = ice_servers + self.requested_camera_types: List[str] = [] + self.requested_audio = False + self.audio_tracks: List[object] = [] + self.messaging_enabled = False + + def offer_to_receive_video_stream(self, camera_type: str): + assert camera_type in ["driver", "wideRoad", "road"] + self.requested_camera_types.append(camera_type) + + def offer_to_receive_audio_stream(self): + self.requested_audio = True + + def add_audio_stream(self, track: object): + assert len(self.audio_tracks) == 0 + self.audio_tracks = [track] + + def add_messaging(self): + self.messaging_enabled = True + + def stream(self) -> WebRTCBaseStream: + return WebRTCOfferStream( + self.connection_provider, + consumed_camera_types=self.requested_camera_types, + consume_audio=self.requested_audio, + video_producer_tracks=[], + audio_producer_tracks=self.audio_tracks, + should_add_data_channel=self.messaging_enabled, + bind_address=self.bind_address, + ice_servers=self.ice_servers, + ) + + +class WebRTCAnswerBuilder(WebRTCStreamBuilder): + def __init__(self, offer_sdp: str, bind_address: Optional[str] = None, + ice_servers: Optional[List[dict]] = None): + self.offer_sdp = offer_sdp + self.bind_address = bind_address + self.ice_servers = ice_servers + self.video_tracks: Dict[str, TiciVideoStreamTrack] = {} + self.requested_audio = False + self.audio_tracks: List[object] = [] + + def offer_to_receive_audio_stream(self): + self.requested_audio = True + + def add_video_stream(self, camera_type: str, track: object): + assert camera_type not in self.video_tracks + assert camera_type in ["driver", "wideRoad", "road"] + if not isinstance(track, TiciVideoStreamTrack): + track = TiciTrackWrapper(camera_type, track) + self.video_tracks[camera_type] = track + + def add_audio_stream(self, track: object): + assert len(self.audio_tracks) == 0 + self.audio_tracks = [track] + + def stream(self) -> WebRTCBaseStream: + description = RTCSessionDescription(sdp=self.offer_sdp, type="offer") + return WebRTCAnswerStream( + description, + consumed_camera_types=[], + consume_audio=self.requested_audio, + video_producer_tracks=list(self.video_tracks.values()), + audio_producer_tracks=self.audio_tracks, + should_add_data_channel=False, + bind_address=self.bind_address, + ice_servers=self.ice_servers, + ) diff --git a/iqpilot/system/webrtc/rtc/decoder.py b/iqpilot/system/webrtc/rtc/decoder.py new file mode 100644 index 000000000..843c67a15 --- /dev/null +++ b/iqpilot/system/webrtc/rtc/decoder.py @@ -0,0 +1,52 @@ +# ruff: noqa: UP006, UP035 + +import dataclasses +import struct +from typing import List + + +@dataclasses.dataclass(frozen=True) +class RtcpReceiverReport: + ssrc: int + fraction_lost: int + packets_lost: int + highest_seq_no: int + jitter: int + lsr: int + dlsr: int + + +def _decode_receiver_reports(message: bytes) -> List[RtcpReceiverReport]: + reports: List[RtcpReceiverReport] = [] + offset = 0 + + while offset + 4 <= len(message): + flags, packet_type, length_words = struct.unpack_from("!BBH", message, offset) + packet_end = offset + (length_words + 1) * 4 + if flags >> 6 != 2 or packet_end > len(message): + break + + report_count = flags & 0x1F + if packet_type == 200: # Sender Report + report_offset = offset + 28 + elif packet_type == 201: # Receiver Report + report_offset = offset + 8 + else: + offset = packet_end + continue + + if report_offset + report_count * 24 > packet_end: + break + + for i in range(report_count): + block_offset = report_offset + i * 24 + ssrc, loss, highest_seq_no, jitter, lsr, dlsr = struct.unpack_from("!IIIIII", message, block_offset) + fraction_lost = loss >> 24 + packets_lost = loss & 0xFFFFFF + if packets_lost & 0x800000: + packets_lost -= 1 << 24 + reports.append(RtcpReceiverReport(ssrc, fraction_lost, packets_lost, highest_seq_no, jitter, lsr, dlsr)) + + offset = packet_end + + return reports diff --git a/iqpilot/system/webrtc/rtc/info.py b/iqpilot/system/webrtc/rtc/info.py new file mode 100644 index 000000000..191d177cd --- /dev/null +++ b/iqpilot/system/webrtc/rtc/info.py @@ -0,0 +1,37 @@ +import dataclasses + +from libdatachannel import Description + + +@dataclasses.dataclass +class StreamingMediaInfo: + n_expected_camera_tracks: int + expected_audio_track: bool + incoming_audio_track: bool + incoming_datachannel: bool + + +def parse_info_from_offer(sdp: str) -> StreamingMediaInfo: + """ + helper function to parse info about outgoing and incoming streams from an offer sdp + """ + desc = Description(sdp, Description.Type.Offer) + n_video = 0 + expected_audio_track = False + incoming_audio_track = False + incoming_datachannel = desc.has_application() + + for i in range(desc.media_count()): + media = desc.media(i) + if media is None: + continue + direction = media.direction() + if media.type() == "video" and direction in (Description.Direction.RecvOnly, Description.Direction.SendRecv): + n_video += 1 + elif media.type() == "audio": + if direction in (Description.Direction.RecvOnly, Description.Direction.SendRecv): + expected_audio_track = True + if direction in (Description.Direction.SendOnly, Description.Direction.SendRecv): + incoming_audio_track = True + + return StreamingMediaInfo(n_video, expected_audio_track, incoming_audio_track, incoming_datachannel) diff --git a/iqpilot/system/webrtc/rtc/stream.py b/iqpilot/system/webrtc/rtc/stream.py new file mode 100644 index 000000000..7c417c166 --- /dev/null +++ b/iqpilot/system/webrtc/rtc/stream.py @@ -0,0 +1,541 @@ +# ruff: noqa: UP006, UP035 + +import abc +import asyncio +import contextlib +import dataclasses +import logging +import random +from typing import Any, Awaitable, Callable, Dict, List, Optional, Tuple, Union + +from libdatachannel import ( + Configuration, + DataChannel, + Candidate, + Description, + FrameInfo, + H264RtpDepacketizer, + H264RtpPacketizer, + IceServer, + NalUnit, + OpusRtpDepacketizer, + OpusRtpPacketizer, + PeerConnection, + PliHandler, + RtcpNackResponder, + RtcpSrReporter, + RtpPacketizationConfig, + Track, +) + +from .decoder import RtcpReceiverReport, _decode_receiver_reports +from .tracks import TiciVideoStreamTrack, parse_video_track_id + + +@dataclasses.dataclass +class StreamingOffer: + sdp: str + video: List[str] + + +@dataclasses.dataclass +class RTCSessionDescription: + sdp: str + type: str + + +ConnectionProvider = Callable[[StreamingOffer], Awaitable[RTCSessionDescription]] +MessageHandler = Callable[[Union[bytes, str]], None] + + +class WebRTCBaseStream(abc.ABC): + def __init__(self, + consumed_camera_types: List[str], + consume_audio: bool, + video_producer_tracks: List[TiciVideoStreamTrack], + audio_producer_tracks: List[Any], + should_add_data_channel: bool, + bind_address: Optional[str] = None, + ice_servers: Optional[List[dict]] = None): + config = Configuration() + config.force_media_transport = True + config.disable_auto_negotiation = True + config.ice_servers = self._make_ice_servers(ice_servers) + if bind_address is not None: + config.bind_address = bind_address + + self.peer_connection = PeerConnection(config) + self.expected_incoming_camera_types = consumed_camera_types + self.expected_incoming_audio = consume_audio + self.expected_number_of_incoming_media: Optional[int] = None + + self.incoming_camera_tracks: Dict[str, Any] = {} + self.incoming_audio_tracks: List[Any] = [] + self.outgoing_video_tracks = video_producer_tracks + self.outgoing_audio_tracks = audio_producer_tracks + + self.should_add_data_channel = should_add_data_channel + self.messaging_channel: Optional[DataChannel] = None + self.incoming_message_handlers: List[MessageHandler] = [] + self._consumer_tracks: List[Track] = [] + self._sender_tasks: List[asyncio.Task] = [] + self._track_state: List[Tuple[Track, TiciVideoStreamTrack, RtpPacketizationConfig]] = [] + self._audio_track_state: List[Tuple[Track, Any, RtpPacketizationConfig]] = [] + self._receiver_reports: Dict[str, RtcpReceiverReport] = {} + self._receiver_report_tracks: Dict[str, Tuple[Track, int]] = {} + self._negotiated_tracks: Dict[str, Track] = {} + + self.incoming_media_ready_event = asyncio.Event() + self.messaging_channel_ready_event = asyncio.Event() + self.connection_attempted_event = asyncio.Event() + self.connection_stopped_event = asyncio.Event() + self.gathering_complete_event = asyncio.Event() + self._loop: Optional[asyncio.AbstractEventLoop] = None + + self.peer_connection.on_state_change(self._on_connectionstatechange) + self.peer_connection.on_gathering_state_change(self._on_gatheringstatechange) + self.peer_connection.on_data_channel(self._on_incoming_datachannel) + if self.expected_incoming_camera_types or self.expected_incoming_audio: + self.peer_connection.on_track(self._on_incoming_track) + + self.logger = logging.getLogger("WebRTCStream") + + @staticmethod + def _make_ice_servers(servers: Optional[List[dict]]) -> List[IceServer]: + parsed: List[IceServer] = [] + for server in servers or []: + urls = server.get("urls", []) if isinstance(server, dict) else [] + if isinstance(urls, str): + urls = [urls] + username = str(server.get("username") or "") + credential = str(server.get("credential") or "") + for url in urls: + if not isinstance(url, str) or not url: + continue + try: + ice_server = IceServer(url) + ice_server.username = username + ice_server.password = credential + parsed.append(ice_server) + except Exception: + logging.getLogger("WebRTCStream").warning("Ignoring invalid ICE server %r", url, exc_info=True) + # A supplied list is authoritative, including LAN-only sessions where relay is deliberately filtered. + if servers is not None: + return parsed + return [IceServer("stun:stun.l.google.com:19302")] + + def _log_debug(self, msg: Any, *args): + self.logger.debug(f"{type(self)}() {msg}", *args) + + def _call_soon_threadsafe(self, fn: Callable, *args) -> None: + if self._loop is not None and self._loop.is_running(): + self._loop.call_soon_threadsafe(fn, *args) + else: + fn(*args) + + def _set_event(self, event: asyncio.Event) -> None: + self._call_soon_threadsafe(event.set) + + @property + def _number_of_incoming_media(self) -> int: + media = len(self.incoming_camera_tracks) + len(self.incoming_audio_tracks) + media += int(self.messaging_channel is not None) if not self.should_add_data_channel else 0 + return media + + def _add_consumer_transceivers(self): + for camera_type in self.expected_incoming_camera_types: + media = Description.Video(camera_type, Description.Direction.RecvOnly) + media.add_h264_codec(96) + track = self.peer_connection.add_track(media) + track.set_media_handler(H264RtpDepacketizer()) + self._consumer_tracks.append(track) + self.incoming_camera_tracks[camera_type] = track + if self.expected_incoming_audio: + media = Description.Audio("audio", Description.Direction.RecvOnly) + media.add_opus_codec(111) + track = self.peer_connection.add_track(media) + track.set_media_handler(OpusRtpDepacketizer()) + self._consumer_tracks.append(track) + self.incoming_audio_tracks.append(track) + + def _find_offer_video(self, remote_sdp: str) -> Tuple[str, int]: + desc = Description(remote_sdp, Description.Type.Offer) + for i in range(desc.media_count()): + media = desc.media(i) + if media is None or media.type() != "video": + continue + for payload_type in media.payload_types(): + with contextlib.suppress(ValueError): + rtp_map = media.rtp_map(payload_type) + if rtp_map is not None and rtp_map.format.upper() == "H264": + return media.mid(), payload_type + raise ValueError("Remote SDP does not offer H264 video") + + def _make_video_media(self, track: TiciVideoStreamTrack, remote_sdp: str) -> Tuple[Description.Video, int, int, str]: + mid, payload_type = self._find_offer_video(remote_sdp) + ssrc = random.randint(1, 0xFFFFFFFF) + cname = f"iqpilot-video-{random.getrandbits(32):08x}" + stream_id = f"stream-{random.getrandbits(32):08x}" + media = Description.Video(mid, Description.Direction.SendOnly) + media.add_h264_codec(payload_type) + media.add_ssrc(ssrc, cname, stream_id, track.id) + return media, ssrc, payload_type, cname + + def _find_offer_audio(self, remote_sdp: str) -> Tuple[str, int]: + desc = Description(remote_sdp, Description.Type.Offer) + for i in range(desc.media_count()): + media = desc.media(i) + if media is None or media.type() != "audio": + continue + for payload_type in media.payload_types(): + with contextlib.suppress(ValueError): + rtp_map = media.rtp_map(payload_type) + if rtp_map is not None and rtp_map.format.upper() == "OPUS": + return media.mid(), payload_type + raise ValueError("Remote SDP does not offer Opus audio") + + def _make_audio_media(self, remote_sdp: str) -> Tuple[Description.Audio, int, int, str]: + mid, payload_type = self._find_offer_audio(remote_sdp) + ssrc = random.randint(1, 0xFFFFFFFF) + cname = f"iqpilot-audio-{random.getrandbits(32):08x}" + direction = Description.Direction.SendRecv if self.expected_incoming_audio else Description.Direction.SendOnly + media = Description.Audio(mid, direction) + media.add_opus_codec(payload_type) + media.add_ssrc(ssrc, cname, "audio", "audio") + return media, ssrc, payload_type, cname + + def _add_producer_tracks(self, remote_sdp: Optional[str] = None): + for track in self.outgoing_video_tracks: + media, ssrc, payload_type, cname = self._make_video_media(track, remote_sdp or "") + rtc_track = self._negotiated_tracks.get(media.mid()) + if rtc_track is not None: + rtc_track.set_description(media) + else: + rtc_track = self.peer_connection.add_track(media) + + rtp_config = RtpPacketizationConfig(ssrc, cname, payload_type, H264RtpPacketizer.CLOCK_RATE) + rtp_config.start_timestamp = random.randint(0, 0xFFFFFFFF) + rtp_config.timestamp = rtp_config.start_timestamp + rtp_config.sequence_number = random.randint(0, 0xFFFF) + + packetizer = H264RtpPacketizer(NalUnit.Separator.LongStartSequence, rtp_config, 1200) + packetizer.add_to_chain(RtcpSrReporter(rtp_config)) + packetizer.add_to_chain(PliHandler(track.request_keyframe)) + packetizer.add_to_chain(RtcpNackResponder()) + rtc_track.set_media_handler(packetizer) + + camera_type, _ = parse_video_track_id(track.id) + rtc_track.reset_callbacks() + self._receiver_report_tracks[camera_type] = (rtc_track, ssrc) + self._track_state.append((rtc_track, track, rtp_config)) + + for producer in self.outgoing_audio_tracks: + media, ssrc, payload_type, cname = self._make_audio_media(remote_sdp or "") + if self.expected_incoming_audio and self.incoming_audio_tracks: + # set_remote_description() creates the browser's sendrecv audio track. Reuse that + # negotiated m-line for our outbound Opus instead of adding a second track with the + # same MID, which leaves libdatachannel stuck in signalling/ICE negotiation. + rtc_track = self.incoming_audio_tracks[0] + negotiated_media = rtc_track.description() + negotiated_media.clear_ssrcs() + negotiated_media.remove_attribute("msid") + negotiated_media.add_ssrc(ssrc, cname, "audio", "audio") + rtc_track.set_description(negotiated_media) + else: + rtc_track = self.peer_connection.add_track(media) + rtp_config = RtpPacketizationConfig(ssrc, cname, payload_type, OpusRtpPacketizer.DEFAULT_CLOCK_RATE) + rtp_config.start_timestamp = random.randint(0, 0xFFFFFFFF) + rtp_config.timestamp = rtp_config.start_timestamp + rtp_config.sequence_number = random.randint(0, 0xFFFF) + packetizer = OpusRtpPacketizer(rtp_config) + packetizer.add_to_chain(RtcpSrReporter(rtp_config)) + packetizer.add_to_chain(RtcpNackResponder()) + rtc_track.set_media_handler(packetizer) + self._audio_track_state.append((rtc_track, producer, rtp_config)) + + def _add_messaging_channel(self, channel: Optional[DataChannel] = None): + if channel is None: + channel = self.peer_connection.create_data_channel("data") + self.messaging_channel = channel + + def on_message(message: Union[bytes, str]): + for handler in list(self.incoming_message_handlers): + self._call_soon_threadsafe(handler, message) + + channel.on_message(on_message) + channel.on_open(lambda: self._set_event(self.messaging_channel_ready_event)) + channel.on_closed(lambda: self._set_event(self.connection_stopped_event)) + if channel.is_open(): + self._set_event(self.messaging_channel_ready_event) + self._on_after_media() + + def _on_connectionstatechange(self, state: PeerConnection.State): + self._log_debug("connection state is %s", state) + if state in (PeerConnection.State.Connected, PeerConnection.State.Failed): + self._set_event(self.connection_attempted_event) + if state in (PeerConnection.State.Disconnected, PeerConnection.State.Closed, PeerConnection.State.Failed): + self._set_event(self.connection_stopped_event) + + def _on_gatheringstatechange(self, state: PeerConnection.GatheringState): + self._log_debug("gathering state is %s", state) + if state == PeerConnection.GatheringState.Complete: + self._set_event(self.gathering_complete_event) + + def _on_incoming_track(self, track: Track): + self._log_debug("got track: %s", track.mid()) + self._negotiated_tracks[track.mid()] = track + media_type = track.description().type() + if media_type == "audio": + if self.expected_incoming_audio: + self.incoming_audio_tracks.append(track) + self._on_after_media() + return + if media_type != "video": + self._on_after_media() + return + try: + camera_type, _ = parse_video_track_id(track.mid()) + except ValueError: + camera_type = track.mid() + if camera_type in self.expected_incoming_camera_types: + self.incoming_camera_tracks[camera_type] = track + self._on_after_media() + + def _on_incoming_datachannel(self, channel: DataChannel): + self._log_debug("got data channel: %s", channel.label()) + if channel.label() == "data" and self.messaging_channel is None: + self._add_messaging_channel(channel) + + def _update_receiver_report(self, camera_type: str, ssrc: int, message: bytes) -> None: + for report in _decode_receiver_reports(message): + if report.ssrc == ssrc: + self._receiver_reports[camera_type] = report + + def _on_after_media(self): + if self.expected_number_of_incoming_media is not None and self._number_of_incoming_media >= self.expected_number_of_incoming_media: + self._set_event(self.incoming_media_ready_event) + + def _parse_incoming_streams(self, remote_sdp: str): + desc = Description(remote_sdp, Description.Type.Offer) + media_count = 0 + for i in range(desc.media_count()): + media = desc.media(i) + if media is None: + continue + direction = media.direction() + if media.type() == "video" and direction in (Description.Direction.SendOnly, Description.Direction.SendRecv): + media_count += 1 + elif media.type() == "audio" and self.expected_incoming_audio and direction in (Description.Direction.SendOnly, Description.Direction.SendRecv): + media_count += 1 + data_media_count = int(desc.has_application()) if not self.should_add_data_channel else 0 + self.expected_number_of_incoming_media = media_count + data_media_count + if self.expected_number_of_incoming_media == 0: + self._set_event(self.incoming_media_ready_event) + + def has_incoming_video_track(self, camera_type: str) -> bool: + return camera_type in self.incoming_camera_tracks + + def has_incoming_audio_track(self) -> bool: + return len(self.incoming_audio_tracks) > 0 + + def has_messaging_channel(self) -> bool: + return self.messaging_channel is not None + + def get_incoming_video_track(self, camera_type: str) -> Track: + assert camera_type in self.incoming_camera_tracks, "Video tracks are not enabled on this stream" + assert self.is_started, "Stream must be started" + return self.incoming_camera_tracks[camera_type] + + def get_incoming_audio_track(self) -> Track: + assert len(self.incoming_audio_tracks) > 0, "Audio tracks are not enabled on this stream" + assert self.is_started, "Stream must be started" + return self.incoming_audio_tracks[0] + + def get_messaging_channel(self) -> DataChannel: + assert self.messaging_channel is not None, "Messaging channel is not enabled on this stream" + assert self.is_started, "Stream must be started" + return self.messaging_channel + + def get_receiver_report_stats(self) -> Dict[str, RtcpReceiverReport]: + return dict(self._receiver_reports) + + def set_message_handler(self, message_handler: MessageHandler): + self.incoming_message_handlers.append(message_handler) + + def add_ice_candidate(self, candidate: dict) -> None: + candidate_sdp = str(candidate.get("candidate") or "") if isinstance(candidate, dict) else "" + if not candidate_sdp: + return + try: + self.peer_connection.add_remote_candidate(Candidate(candidate_sdp, str(candidate.get("sdpMid") or ""))) + except Exception: + self.logger.warning("Ignoring invalid trickle ICE candidate", exc_info=True) + + @property + def is_started(self) -> bool: + return self.peer_connection is not None and \ + self.peer_connection.local_description() is not None and \ + self.peer_connection.remote_description() is not None and \ + self.peer_connection.state() != PeerConnection.State.Closed + + @property + def is_connected_and_ready(self) -> bool: + return self.peer_connection is not None and \ + self.peer_connection.state() == PeerConnection.State.Connected and \ + (self.expected_number_of_incoming_media == 0 or self.incoming_media_ready_event.is_set()) + + async def _wait_for_gathering_complete(self): + if self.peer_connection.gathering_state() != PeerConnection.GatheringState.Complete: + await self.gathering_complete_event.wait() + + async def _send_track_loop(self, rtc_track: Track, producer_track: TiciVideoStreamTrack, rtp_config: RtpPacketizationConfig): + while True: + if not rtc_track.is_open(): + await asyncio.sleep(0.01) + continue + + try: + packet = await producer_track.recv() + data = bytes(packet) + if not data: + continue + + pts = int(packet.pts or 0) + timestamp = (rtp_config.start_timestamp + pts) & 0xFFFFFFFF + rtc_track.send_frame(data, FrameInfo(timestamp)) + except asyncio.CancelledError: + raise + except Exception: + self.logger.exception("Error in send track loop for track %s", producer_track.id) + self._set_event(self.connection_stopped_event) + break + + async def _receiver_report_loop(self): + while True: + for camera_type, (rtc_track, ssrc) in self._receiver_report_tracks.items(): + for _ in range(32): + try: + message = rtc_track.receive() + if message is None: # go until queue empty (bounded to 32) + break + if isinstance(message, bytes): + self._update_receiver_report(camera_type, ssrc, message) + except asyncio.CancelledError: + raise + except Exception: + self.logger.exception("Error receiving report for %s", camera_type) + break + await asyncio.sleep(0.05) + + async def _send_audio_track_loop(self, rtc_track: Track, producer: Any, rtp_config: RtpPacketizationConfig): + while True: + if not rtc_track.is_open(): + await asyncio.sleep(0.01) + continue + try: + packet = await producer.recv() + if packet is None: + continue + data, pts = packet + if data: + rtc_track.send_frame(data, FrameInfo((rtp_config.start_timestamp + int(pts)) & 0xFFFFFFFF)) + except asyncio.CancelledError: + raise + except Exception: + self.logger.exception("Error in audio send loop") + self._set_event(self.connection_stopped_event) + break + + def _start_sender_tasks(self): + for rtc_track, producer_track, rtp_config in self._track_state: + self._sender_tasks.append(asyncio.create_task(self._send_track_loop(rtc_track, producer_track, rtp_config))) + for rtc_track, producer, rtp_config in self._audio_track_state: + self._sender_tasks.append(asyncio.create_task(self._send_audio_track_loop(rtc_track, producer, rtp_config))) + if self._track_state: + self._sender_tasks.append(asyncio.create_task(self._receiver_report_loop())) + + async def wait_for_connection(self): + assert self.is_started + await self.connection_attempted_event.wait() + if self.peer_connection.state() != PeerConnection.State.Connected: + raise ValueError("Connection failed.") + if self.expected_number_of_incoming_media: + await self.incoming_media_ready_event.wait() + if self.messaging_channel is not None: + await self.messaging_channel_ready_event.wait() + self._start_sender_tasks() + + async def wait_for_disconnection(self): + assert self.is_connected_and_ready, "Stream is not connected/ready yet (make sure wait_for_connection was awaited)" + await self.connection_stopped_event.wait() + + async def stop(self): + for task in self._sender_tasks: + task.cancel() + for task in self._sender_tasks: + with contextlib.suppress(asyncio.CancelledError): + await task + self._sender_tasks.clear() + self.peer_connection.close() + self.peer_connection.reset_callbacks() + self.messaging_channel = None + self.incoming_camera_tracks.clear() + self.incoming_audio_tracks.clear() + self._consumer_tracks.clear() + self._track_state.clear() + self._audio_track_state.clear() + self._receiver_reports.clear() + self._receiver_report_tracks.clear() + self._negotiated_tracks.clear() + + @abc.abstractmethod + async def start(self) -> RTCSessionDescription: + raise NotImplementedError + + +class WebRTCOfferStream(WebRTCBaseStream): + def __init__(self, session_provider: ConnectionProvider, *args, **kwargs): + super().__init__(*args, **kwargs) + self.session_provider = session_provider + + async def start(self) -> RTCSessionDescription: + self._loop = asyncio.get_running_loop() + self._add_consumer_transceivers() + if self.should_add_data_channel: + self._add_messaging_channel() + + self.peer_connection.set_local_description(Description.Type.Offer) + await self._wait_for_gathering_complete() + actual_offer = self.peer_connection.local_description() + + streaming_offer = StreamingOffer( + sdp=str(actual_offer), + video=list(self.expected_incoming_camera_types), + ) + remote_answer = await self.session_provider(streaming_offer) + self._parse_incoming_streams(remote_sdp=remote_answer.sdp) + self.peer_connection.set_remote_description(Description(remote_answer.sdp, Description.Type.Answer)) + self._on_after_media() + actual_answer = self.peer_connection.remote_description() + + return RTCSessionDescription(str(actual_answer), actual_answer.type_string()) + + +class WebRTCAnswerStream(WebRTCBaseStream): + def __init__(self, session: RTCSessionDescription, *args, **kwargs): + super().__init__(*args, **kwargs) + self.session = session + + async def start(self) -> RTCSessionDescription: + self._loop = asyncio.get_running_loop() + assert self.peer_connection.remote_description() is None, "Connection already established" + + self._parse_incoming_streams(remote_sdp=self.session.sdp) + self.peer_connection.set_remote_description(Description(self.session.sdp, Description.Type.Offer)) + self._add_producer_tracks(self.session.sdp) + + self.peer_connection.set_local_description(Description.Type.Answer) + await self._wait_for_gathering_complete() + actual_answer = self.peer_connection.local_description() + + return RTCSessionDescription(str(actual_answer), actual_answer.type_string()) diff --git a/iqpilot/system/webrtc/rtc/tracks.py b/iqpilot/system/webrtc/rtc/tracks.py new file mode 100644 index 000000000..fd692949c --- /dev/null +++ b/iqpilot/system/webrtc/rtc/tracks.py @@ -0,0 +1,78 @@ +# ruff: noqa: UP006, UP035 + +import fractions +import logging +import uuid +from typing import Any, Tuple + + +VIDEO_CLOCK_RATE = 90000 +VIDEO_TIME_BASE = fractions.Fraction(1, VIDEO_CLOCK_RATE) + + +def video_track_id(camera_type: str, track_id: str) -> str: + return f"{camera_type}:{track_id}" + + +def parse_video_track_id(track_id: str) -> Tuple[str, str]: + parts = track_id.split(":") + if len(parts) != 2: + raise ValueError(f"Invalid video track id: {track_id}") + + camera_type, track_id = parts + return camera_type, track_id + + +class TiciVideoStreamTrack: + """ + Abstract video track which associates video track with camera_type. + """ + kind = "video" + + def __init__(self, camera_type: str, dt: float, time_base: fractions.Fraction = VIDEO_TIME_BASE, clock_rate: int = VIDEO_CLOCK_RATE): + assert camera_type in ["driver", "wideRoad", "road"] + self._id: str = video_track_id(camera_type, str(uuid.uuid4())) + self._dt = dt + self._time_base: fractions.Fraction = time_base + self._clock_rate: int = clock_rate + self._logger = logging.getLogger("WebRTCStream") + self.readyState = "live" + + @property + def id(self) -> str: + return self._id + + def stop(self) -> None: + self.readyState = "ended" + + def log_debug(self, msg: Any, *args): + self._logger.debug(f"{type(self)}() {msg}", *args) + + async def recv(self): + raise NotImplementedError() + + def request_keyframe(self) -> None: + pass + + +class TiciTrackWrapper(TiciVideoStreamTrack): + """ + Associates a generic video track with camera_type. + """ + def __init__(self, camera_type: str, track: Any): + assert track.kind == "video" + super().__init__(camera_type, getattr(track, "_dt", 0.05)) + try: + parsed_camera, _ = parse_video_track_id(track.id) + self._id = track.id if parsed_camera == camera_type else video_track_id(camera_type, track.id) + except ValueError: + self._id = video_track_id(camera_type, track.id) + self._track = track + + async def recv(self): + return await self._track.recv() + + def stop(self) -> None: + super().stop() + if hasattr(self._track, "stop"): + self._track.stop() diff --git a/iqpilot/system/webrtc/schema.py b/iqpilot/system/webrtc/schema.py new file mode 100644 index 000000000..d80986ebf --- /dev/null +++ b/iqpilot/system/webrtc/schema.py @@ -0,0 +1,43 @@ +import capnp +from typing import Any + + +def generate_type(type_walker, schema_walker) -> str | list[Any] | dict[str, Any]: + data_type = next(type_walker) + if data_type.which() == 'struct': + return generate_struct(next(schema_walker)) + elif data_type.which() == 'list': + _ = next(schema_walker) + return [generate_type(type_walker, schema_walker)] + elif data_type.which() == 'enum': + return "text" + else: + return str(data_type.which()) + + +def generate_struct(schema: capnp.lib.capnp._StructSchema) -> dict[str, Any]: + return {field: generate_field(schema.fields[field]) for field in schema.fields if not field.endswith("DEPRECATED")} + + +def generate_field(field: capnp.lib.capnp._StructSchemaField) -> str | list[Any] | dict[str, Any]: + def schema_walker(field): + yield field.schema + + s = field.schema + while hasattr(s, 'elementType'): + s = s.elementType + yield s + + def type_walker(field): + yield field.proto.slot.type + + t = field.proto.slot.type + while hasattr(getattr(t, t.which()), 'elementType'): + t = getattr(t, t.which()).elementType + yield t + + if field.proto.which() == "slot": + schema_gen, type_gen = schema_walker(field), type_walker(field) + return generate_type(type_gen, schema_gen) + else: + return generate_struct(field.schema) diff --git a/iqpilot/system/webrtc/session.py b/iqpilot/system/webrtc/session.py new file mode 100644 index 000000000..c07e53f19 --- /dev/null +++ b/iqpilot/system/webrtc/session.py @@ -0,0 +1,241 @@ +import asyncio +import contextlib +import json +import logging +import os +import socket +import uuid +from typing import Any + +from iqpilot.common.params import Params +from iqpilot.cereal import messaging + +from iqpilot.system.webrtc.webrtcd import CerealIncomingMessageProxy, CerealOutgoingMessageProxy, CerealProxyRunner, DynamicPubMaster + + +def _default_route_ip() -> str | None: + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + sock.connect(("8.8.8.8", 53)) + return sock.getsockname()[0] + except OSError: + return None + finally: + sock.close() + + +class LivestreamBitrateController: + bitrates = [500_000, 1_500_000, int(os.environ.get("STREAM_BITRATE", 5_000_000))] + label_to_bitrate = {"low": bitrates[0], "med": bitrates[1], "high": bitrates[2]} + sample_interval = 0.2 + high_loss = 0.10 + sustained_loss = 0.05 + down_samples = 5 + + def __init__(self, get_stats, enabled: bool = True): + self._get_stats = get_stats + self._enabled = enabled + self._auto = True + self._level = 1 + self._counter = 0 + self._up_samples = 5 + self._previous: tuple[Any, ...] | None = None + self._task: asyncio.Task | None = None + self.current_bitrate = self.bitrates[self._level] + self._publish(self.current_bitrate) + + def start(self) -> None: + if self._task is None: + self._task = asyncio.create_task(self.run()) + + def stop(self) -> None: + if self._task is not None: + self._task.cancel() + self._task = None + + def enable(self, enabled: bool) -> None: + self._enabled = enabled + + def set_quality(self, quality: str) -> None: + if quality in self.label_to_bitrate: + self._auto = False + self._publish(self.label_to_bitrate[quality]) + elif quality == "auto": + self._auto = True + + def _publish(self, bitrate: int) -> None: + self.current_bitrate = int(bitrate) + Params().put("LivestreamEncoderBitrate", self.current_bitrate) + + def _sample_loss(self) -> float | None: + report = next(iter(self._get_stats().values()), None) + if report is None: + return None + current = (report.ssrc, report.fraction_lost, report.packets_lost, report.highest_seq_no, report.jitter, report.lsr, report.dlsr) + if current == self._previous: + return None + self._previous = current + return report.fraction_lost / 256.0 + + async def run(self) -> None: + while True: + await asyncio.sleep(self.sample_interval) + if not self._enabled or not self._auto: + continue + loss = self._sample_loss() + if loss is None: + continue + if loss >= self.sustained_loss and self._level > 0: + self._counter += 1 + if loss >= self.high_loss or self._counter >= self.down_samples: + self._level -= 1 + self._up_samples *= 2 + self._counter = 0 + self._publish(self.bitrates[self._level]) + elif loss <= 0 and self._level < len(self.bitrates) - 1: + self._counter -= 1 + if -self._counter >= self._up_samples: + self._level += 1 + self._counter = 0 + self._publish(self.bitrates[self._level]) + + +class StreamSession: + shared_pub_master: DynamicPubMaster | None = None + + def __init__(self, sdp: str, cameras: list[str], incoming_services: list[str], outgoing_services: list[str], + ice_servers: list[dict[str, Any]] | None = None, debug_mode: bool = False, ui_stream: bool = False): + from iqpilot.system.webrtc.device.native_audio import AudioInputOpusProducer, DebugAudioOpusProducer + from iqpilot.system.webrtc.device.native_video import DebugVideoStreamTrack, LiveStreamVideoStreamTrack + from iqpilot.system.webrtc.rtc.builder import WebRTCAnswerBuilder + from iqpilot.system.webrtc.rtc.info import parse_info_from_offer + + config = parse_info_from_offer(sdp) + if len(cameras) != config.n_expected_camera_tracks: + raise ValueError("Incoming stream has misconfigured number of video tracks") + builder = WebRTCAnswerBuilder(sdp, bind_address=_default_route_ip(), ice_servers=ice_servers or []) + video_track_type = DebugVideoStreamTrack if debug_mode else LiveStreamVideoStreamTrack + self.video_tracks = [video_track_type(camera) for camera in cameras] + for camera, track in zip(cameras, self.video_tracks, strict=True): + builder.add_video_stream(camera, track) + + audio_track_type = DebugAudioOpusProducer if debug_mode else AudioInputOpusProducer + self.audio_output = audio_track_type() if config.expected_audio_track else None + if self.audio_output is not None: + builder.add_audio_stream(self.audio_output) + if config.incoming_audio_track: + builder.offer_to_receive_audio_stream() + self.stream = builder.stream() + + self.identifier = str(uuid.uuid4()) + self.incoming_bridge_services = incoming_services + if incoming_services and self.shared_pub_master is None: + StreamSession.shared_pub_master = DynamicPubMaster([]) + self.incoming_bridge = CerealIncomingMessageProxy(self.shared_pub_master) if self.shared_pub_master is not None and incoming_services else None + self.outgoing_bridge = CerealOutgoingMessageProxy(messaging.SubMaster(outgoing_services)) if outgoing_services else None + self.outgoing_bridge_runner = CerealProxyRunner(self.outgoing_bridge) if self.outgoing_bridge is not None else None + self.ui_stream_requested = ui_stream + self.ui_stream_runner: CerealProxyRunner | None = None + self.audio_input_proxy = None + self.audio_recv_requested = config.incoming_audio_track + self.bitrate_controller = LivestreamBitrateController(self.stream.get_receiver_report_stats) + self.run_task: asyncio.Task | None = None + self._cleanup_lock = asyncio.Lock() + self._cleanup_done = False + self.logger = logging.getLogger("webrtcd") + + def start(self) -> None: + self.run_task = asyncio.create_task(self.run()) + + async def get_answer(self): + return await self.stream.start() + + async def stop_async(self) -> None: + if self.run_task is not None and not self.run_task.done() and self.run_task is not asyncio.current_task(): + self.run_task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await self.run_task + self.run_task = None + await self.post_run_cleanup() + + def add_ice_candidate(self, candidate: Any) -> None: + self.stream.add_ice_candidate(candidate) + + def message_handler(self, message: bytes | str) -> None: + try: + payload = json.loads(message) + except (TypeError, ValueError): + return + if not isinstance(payload, dict): + return + message_type = payload.get("type") + if message_type == "timingSei": + for track in self.video_tracks: + track.timing_sei_enabled = bool(payload.get("enabled", False)) + elif message_type == "setQuality": + self.bitrate_controller.set_quality(str(payload.get("quality", "auto"))) + elif message_type == "setAudioEnabled" and self.audio_output is not None: + self.audio_output.enable(bool(payload.get("enabled", True))) + elif message_type == "switchCamera": + for track in self.video_tracks: + track.switch_camera(str(payload.get("camera", ""))) + elif message_type == "setUiStream": + self.set_ui_stream(bool(payload.get("enabled", False))) + elif self.incoming_bridge is not None: + try: + self.incoming_bridge.send(message) + except Exception: + self.logger.exception("Cereal incoming proxy failure") + + def set_ui_stream(self, enabled: bool) -> None: + if enabled: + if self.ui_stream_runner is not None or not self.stream.has_messaging_channel(): + return + from iqpilot.system.webrtc.ui_stream import UIStreamMessageProxy + proxy = UIStreamMessageProxy(bitrate_getter=lambda: self.bitrate_controller.current_bitrate) + proxy.add_channel(self.stream.get_messaging_channel()) + self.ui_stream_runner = CerealProxyRunner(proxy) + self.ui_stream_runner.start() + elif self.ui_stream_runner is not None: + self.ui_stream_runner.stop() + self.ui_stream_runner = None + + async def run(self) -> None: + try: + await self.stream.wait_for_connection() + if self.stream.has_messaging_channel(): + self.stream.set_message_handler(self.message_handler) + if self.incoming_bridge is not None: + await self.shared_pub_master.add_services_if_needed(self.incoming_bridge_services) + if self.outgoing_bridge_runner is not None: + self.outgoing_bridge_runner.proxy.add_channel(self.stream.get_messaging_channel()) + self.outgoing_bridge_runner.start() + if self.ui_stream_requested: + self.set_ui_stream(True) + if self.audio_recv_requested and self.stream.has_incoming_audio_track(): + from iqpilot.system.webrtc.device.native_audio import IncomingOpusCerealProxy + self.audio_input_proxy = IncomingOpusCerealProxy(self.stream.get_incoming_audio_track()) + self.audio_input_proxy.start() + self.bitrate_controller.start() + await self.stream.wait_for_disconnection() + except Exception: + self.logger.exception("libdatachannel stream session failure") + finally: + await self.post_run_cleanup() + + async def post_run_cleanup(self) -> None: + async with self._cleanup_lock: + if self._cleanup_done: + return + self._cleanup_done = True + self.bitrate_controller.stop() + if self.ui_stream_runner is not None: + self.ui_stream_runner.stop() + self.ui_stream_runner = None + if self.outgoing_bridge_runner is not None: + self.outgoing_bridge_runner.stop() + if self.audio_input_proxy is not None: + await self.audio_input_proxy.stop() + for track in self.video_tracks: + track.stop() + await self.stream.stop() diff --git a/iqpilot/system/webrtc/tests/test_native_session.py b/iqpilot/system/webrtc/tests/test_native_session.py new file mode 100644 index 000000000..88046644a --- /dev/null +++ b/iqpilot/system/webrtc/tests/test_native_session.py @@ -0,0 +1,96 @@ +from types import SimpleNamespace + +import pytest + +from iqpilot.system.webrtc import session as session_module + + +class FakeStream: + def get_receiver_report_stats(self): + return {} + + +class FakeBuilder: + instance = None + + def __init__(self, sdp, bind_address=None, ice_servers=None): + self.sdp = sdp + self.bind_address = bind_address + self.ice_servers = ice_servers + self.video = [] + self.audio = [] + self.receive_audio = False + self.result = FakeStream() + FakeBuilder.instance = self + + def add_video_stream(self, camera, track): + self.video.append((camera, track)) + + def add_audio_stream(self, track): + self.audio.append(track) + + def offer_to_receive_audio_stream(self): + self.receive_audio = True + + def stream(self): + return self.result + + +class FakeVideoTrack: + def __init__(self, camera): + self.camera = camera + self.timing_sei_enabled = False + self.switched = None + + def switch_camera(self, camera): + self.switched = camera + + +class FakeAudioProducer: + def __init__(self): + self.enabled = True + + def enable(self, enabled): + self.enabled = enabled + + +@pytest.fixture +def native_session(mocker): + config = SimpleNamespace( + n_expected_camera_tracks=1, + expected_audio_track=True, + incoming_audio_track=True, + incoming_datachannel=True, + ) + mocker.patch("iqpilot.system.webrtc.rtc.info.parse_info_from_offer", return_value=config) + mocker.patch("iqpilot.system.webrtc.rtc.builder.WebRTCAnswerBuilder", FakeBuilder) + mocker.patch("iqpilot.system.webrtc.device.native_video.LiveStreamVideoStreamTrack", FakeVideoTrack) + mocker.patch("iqpilot.system.webrtc.device.native_audio.AudioInputOpusProducer", FakeAudioProducer) + mocker.patch.object(session_module, "_default_route_ip", return_value="192.0.2.1") + mocker.patch.object(session_module, "Params", return_value=mocker.Mock()) + return session_module.StreamSession( + "offer", ["road"], [], [], [{"urls": "turn:example.com"}], ui_stream=False, + ) + + +def test_native_session_builds_duplex_audio(native_session): + builder = FakeBuilder.instance + assert builder is not None + assert builder.bind_address == "192.0.2.1" + assert builder.ice_servers == [{"urls": "turn:example.com"}] + assert [camera for camera, _ in builder.video] == ["road"] + assert builder.audio == [native_session.audio_output] + assert builder.receive_audio + assert native_session.audio_recv_requested + + +def test_native_session_controls(native_session, mocker): + native_session.bitrate_controller = mocker.Mock() + native_session.message_handler('{"type":"timingSei","enabled":true}') + assert native_session.video_tracks[0].timing_sei_enabled + native_session.message_handler('{"type":"switchCamera","camera":"driver"}') + assert native_session.video_tracks[0].switched == "driver" + native_session.message_handler('{"type":"setAudioEnabled","enabled":false}') + assert not native_session.audio_output.enabled + native_session.message_handler('{"type":"setQuality","quality":"low"}') + native_session.bitrate_controller.set_quality.assert_called_once_with("low") diff --git a/iqpilot/system/webrtc/tests/test_rtc.py b/iqpilot/system/webrtc/tests/test_rtc.py new file mode 100644 index 000000000..ac71dbb60 --- /dev/null +++ b/iqpilot/system/webrtc/tests/test_rtc.py @@ -0,0 +1,116 @@ +import pytest + +from iqpilot.system.webrtc.rtc.info import parse_info_from_offer +from iqpilot.system.webrtc.rtc.stream import WebRTCBaseStream +from iqpilot.system.webrtc.rtc.tracks import TiciTrackWrapper, TiciVideoStreamTrack, parse_video_track_id, video_track_id + + +def sdp_with_media(media): + mids = " ".join(str(i) for i in range(len(media))) + sections = [] + for index, (kind, direction) in enumerate(media): + if kind == "video": + payload, mapping = "96", "H264/90000" + protocol = "UDP/TLS/RTP/SAVPF" + elif kind == "audio": + payload, mapping = "111", "opus/48000/2" + protocol = "UDP/TLS/RTP/SAVPF" + else: + sections.extend([ + "m=application 9 UDP/DTLS/SCTP webrtc-datachannel", + "c=IN IP4 0.0.0.0", + f"a=mid:{index}", + "a=sctp-port:5000", + ]) + continue + sections.extend([ + f"m={kind} 9 {protocol} {payload}", + "c=IN IP4 0.0.0.0", + f"a=mid:{index}", + f"a={direction}", + f"a=rtpmap:{payload} {mapping}", + "a=rtcp-mux", + ]) + lines = [ + "v=0", + "o=- 1 1 IN IP4 0.0.0.0", + "s=-", + "t=0 0", + f"a=group:BUNDLE {mids}", + *sections, + ] + return "\r\n".join(lines) + "\r\n" + + +@pytest.mark.parametrize("direction,expected_outgoing,expected_incoming", [ + ("recvonly", True, False), + ("sendonly", False, True), + ("sendrecv", True, True), + ("inactive", False, False), +]) +def test_audio_directions(direction, expected_outgoing, expected_incoming): + info = parse_info_from_offer(sdp_with_media([("audio", direction)])) + assert info.expected_audio_track == expected_outgoing + assert info.incoming_audio_track == expected_incoming + + +def test_video_and_data_channel_metadata(): + info = parse_info_from_offer(sdp_with_media([ + ("video", "recvonly"), + ("video", "sendrecv"), + ("application", "sendrecv"), + ])) + assert info.n_expected_camera_tracks == 2 + assert info.incoming_datachannel + + +def test_explicit_empty_ice_servers_disable_defaults(): + assert WebRTCBaseStream._make_ice_servers([]) == [] + + +def test_default_ice_server(): + servers = WebRTCBaseStream._make_ice_servers(None) + assert len(servers) == 1 + assert servers[0].hostname == "stun.l.google.com" + assert servers[0].port == 19302 + + +def test_authenticated_ice_servers(): + servers = WebRTCBaseStream._make_ice_servers([{ + "urls": ["turn:relay.example.com:3478", "stun:stun.example.com:3478"], + "username": "user", + "credential": "secret", + }]) + assert [(server.hostname, server.port) for server in servers] == [ + ("relay.example.com", 3478), + ("stun.example.com", 3478), + ] + assert all(server.username == "user" and server.password == "secret" for server in servers) + + +def test_track_id_roundtrip(): + assert parse_video_track_id(video_track_id("driver", "track")) == ("driver", "track") + + +def test_invalid_track_id(): + with pytest.raises(ValueError): + parse_video_track_id("driver") + + +def test_track_wrapper_preserves_camera(): + class Track: + kind = "video" + id = "source" + + async def recv(self): + return b"frame" + + wrapper = TiciTrackWrapper("road", Track()) + assert parse_video_track_id(wrapper.id)[0] == "road" + wrapper.stop() + assert wrapper.readyState == "ended" + + +def test_track_stores_frame_period(): + track = TiciVideoStreamTrack("wideRoad", 0.05) + assert track._dt == 0.05 diff --git a/iqpilot/system/webrtc/tests/test_rtc_integration.py b/iqpilot/system/webrtc/tests/test_rtc_integration.py new file mode 100644 index 000000000..9beb0724f --- /dev/null +++ b/iqpilot/system/webrtc/tests/test_rtc_integration.py @@ -0,0 +1,95 @@ +import asyncio +import os + +import pytest + +from iqpilot.system.webrtc.rtc import WebRTCOfferBuilder +from iqpilot.system.webrtc.rtc.stream import RTCSessionDescription +from iqpilot.system.webrtc.session import StreamSession + + +@pytest.mark.asyncio +async def test_native_video_audio_and_data_channel(): + if not os.environ.get("CI"): + return + + answer_session = None + video_received = asyncio.Event() + audio_received = asyncio.Event() + + async def connect(offer): + nonlocal answer_session + browser_offer = offer.sdp.replace("profile-level-id=42e01f", "profile-level-id=640c1f", 1) + audio_offset = browser_offer.index("m=audio") + browser_offer = browser_offer[:audio_offset] + browser_offer[audio_offset:].replace( + "a=recvonly", + "a=sendrecv\r\na=msid:ios-microphone ios-audio-track\r\na=ssrc:123456 cname:ios-audio\r\na=ssrc:123456 msid:ios-microphone ios-audio-track", + 1, + ) + answer_session = StreamSession(browser_offer, offer.video, [], [], [], debug_mode=True) + answer = await answer_session.get_answer() + assert not any(line.startswith("m=video 0 ") for line in answer.sdp.splitlines()) + assert answer_session.stream._track_state[0][0] is answer_session.stream._negotiated_tracks["road"] + answer_session.start() + return RTCSessionDescription(answer.sdp, answer.type) + + builder = WebRTCOfferBuilder(connect, ice_servers=[]) + builder.offer_to_receive_video_stream("road") + builder.offer_to_receive_audio_stream() + builder.add_messaging() + stream = builder.stream() + + try: + await asyncio.wait_for(stream.start(), 10) + stream.get_incoming_video_track("road").on_frame(lambda *_: video_received.set()) + stream.get_incoming_audio_track().on_frame(lambda *_: audio_received.set()) + await asyncio.wait_for(stream.wait_for_connection(), 10) + await asyncio.wait_for(video_received.wait(), 10) + await asyncio.wait_for(audio_received.wait(), 10) + stream.get_messaging_channel().send('{"type":"timingSei","enabled":true}') + await asyncio.sleep(0.1) + assert answer_session is not None + assert answer_session.video_tracks[0].timing_sei_enabled + finally: + await stream.stop() + if answer_session is not None: + await answer_session.stop_async() + + +@pytest.mark.asyncio +async def test_native_duplex_audio_negotiation(): + if not os.environ.get("CI"): + return + + answer_session = None + + async def connect(offer): + nonlocal answer_session + sendrecv_offer = offer.sdp.replace( + "a=recvonly", + "a=sendrecv\r\na=msid:ios-microphone ios-audio-track\r\na=ssrc:123456 cname:ios-audio\r\na=ssrc:123456 msid:ios-microphone ios-audio-track", + 1, + ) + answer_session = StreamSession(sendrecv_offer, offer.video, [], [], [], debug_mode=True) + answer = await answer_session.get_answer() + assert "ios-microphone" not in answer.sdp + assert "ios-audio-track" not in answer.sdp + assert answer.sdp.count("a=msid:audio audio") == 1 + answer_session.start() + return RTCSessionDescription(answer.sdp, answer.type) + + builder = WebRTCOfferBuilder(connect, ice_servers=[]) + builder.offer_to_receive_audio_stream() + stream = builder.stream() + + try: + await asyncio.wait_for(stream.start(), 10) + await asyncio.wait_for(stream.wait_for_connection(), 10) + assert stream.has_incoming_audio_track() + assert answer_session is not None + assert answer_session.audio_recv_requested + assert answer_session.audio_output is not None + finally: + await stream.stop() + if answer_session is not None: + await answer_session.stop_async() diff --git a/iqpilot/system/webrtc/tests/test_stream_session.py b/iqpilot/system/webrtc/tests/test_stream_session.py new file mode 100644 index 000000000..5b3e0d2b0 --- /dev/null +++ b/iqpilot/system/webrtc/tests/test_stream_session.py @@ -0,0 +1,110 @@ +import asyncio +import gc +import json + +import capnp +from iqpilot.cereal import messaging, log + +from iqpilot.system.webrtc.webrtcd import CerealOutgoingMessageProxy, CerealIncomingMessageProxy +from iqpilot.system.webrtc.device.native_audio import AudioInputOpusProducer, DebugAudioOpusProducer +from iqpilot.system.webrtc.device.native_video import DebugVideoStreamTrack, LiveStreamVideoStreamTrack +from iqpilot.system.webrtc.rtc.tracks import VIDEO_TIME_BASE + + +class TestStreamSession: + def setup_method(self): + self.loop = asyncio.new_event_loop() + + def teardown_method(self): + self.loop.stop() + self.loop.close() + gc.collect() + + def test_outgoing_proxy(self, mocker): + test_msg = log.Event.new_message() + test_msg.logMonoTime = 123 + test_msg.valid = True + test_msg.customReservedRawData0 = b"test" + expected_dict = {"type": "customReservedRawData0", "logMonoTime": 123, "valid": True, "data": "test"} + expected_json = json.dumps(expected_dict).encode() + + channel = mocker.Mock() + mocked_submaster = mocker.MagicMock() + mocked_submaster.updated = {"customReservedRawData0": True} + mocked_submaster.logMonoTime = {"customReservedRawData0": 123} + mocked_submaster.valid = {"customReservedRawData0": True} + mocked_submaster.__getitem__.return_value = test_msg.customReservedRawData0 + proxy = CerealOutgoingMessageProxy(mocked_submaster) + proxy.add_channel(channel) + + proxy.update() + + channel.send.assert_called_once_with(expected_json) + + def test_incoming_proxy(self, mocker): + tested_msgs = [ + {"type": "customReservedRawData0", "data": "test"}, + {"type": "can", "data": [{"address": 0, "dat": "", "src": 0}]}, + {"type": "testJoystick", "data": {"axes": [0, 0], "buttons": [False]}}, + ] + + mocked_pubmaster = mocker.MagicMock(spec=messaging.PubMaster) + + proxy = CerealIncomingMessageProxy(mocked_pubmaster) + + for msg in tested_msgs: + proxy.send(json.dumps(msg).encode()) + + mocked_pubmaster.send.assert_called_once() + mt, md = mocked_pubmaster.send.call_args.args + assert mt == msg["type"] + assert isinstance(md, capnp._DynamicStructBuilder) + assert hasattr(md, msg["type"]) + + mocked_pubmaster.reset_mock() + + def test_livestream_track(self, mocker): + fake_msg = messaging.new_message("livestreamDriverEncodeData") + fake_msg.livestreamDriverEncodeData.header = b"header" + fake_msg.livestreamDriverEncodeData.data = b"\x00\x00\x00\x01\x65" + + mocker.patch("iqpilot.system.webrtc.device.native_video.messaging.sub_sock", return_value=mocker.Mock()) + mocker.patch("iqpilot.system.webrtc.device.native_video.messaging.recv_one_or_none", return_value=fake_msg) + track = LiveStreamVideoStreamTrack("driver") + + assert track.id.startswith("driver") + packet = self.loop.run_until_complete(track.recv()) + assert packet.time_base == VIDEO_TIME_BASE + assert packet.pts is not None + assert packet.size == len(b"header\x00\x00\x00\x01\x65") + + def test_input_audio_track(self, mocker): + packet_time, rate = 0.02, 16000 + sample_count = int(packet_time * rate) + fake_msg = messaging.new_message("rawAudioData") + fake_msg.rawAudioData.data = b"\x00" * 2 * sample_count + fake_msg.rawAudioData.sampleRate = rate + mocker.patch("iqpilot.system.webrtc.device.native_audio.messaging.sub_sock", return_value=mocker.Mock()) + track = AudioInputOpusProducer() + track._source_rate = rate + mocker.patch("iqpilot.system.webrtc.device.native_audio.messaging.recv_one_or_none", return_value=fake_msg) + + packet = self.loop.run_until_complete(track.recv()) + assert packet is not None + payload, pts = packet + assert payload + assert pts >= 0 + + def test_debug_video_track(self): + track = DebugVideoStreamTrack("road") + packet = self.loop.run_until_complete(track.recv()) + assert packet.size > 0 + assert packet.pts == 0 + + def test_debug_audio_track(self): + track = DebugAudioOpusProducer() + packet = self.loop.run_until_complete(track.recv()) + assert packet is not None + payload, pts = packet + assert payload + assert pts == 0 diff --git a/iqpilot/system/webrtc/tests/test_ui_stream.py b/iqpilot/system/webrtc/tests/test_ui_stream.py new file mode 100644 index 000000000..9d74c9967 --- /dev/null +++ b/iqpilot/system/webrtc/tests/test_ui_stream.py @@ -0,0 +1,303 @@ +import asyncio +import json +import math + +import pytest + +from iqpilot.cereal import log, messaging +from iqpilot.system.webrtc.ui_stream import ( + UI_STREAM_SERVICES, + UIStreamMessageProxy, + compute_ui_status, + frame_to_str, + MAX_BUFFERED_BYTES, +) + +OpenpilotState = log.SelfdriveState.OpenpilotState + + +def make_readers(**overrides): + readers = {} + for service in UI_STREAM_SERVICES: + if service == "onroadEvents": + msg = messaging.new_message(service, 0) + else: + msg = messaging.new_message(service) + readers[service] = msg + readers.update(overrides) + return {s: getattr(m, s) for s, m in readers.items()} + + +class FakeSubMaster: + def __init__(self, readers, updated=None, valid=None): + self.readers = readers + self.updated = updated or dict.fromkeys(UI_STREAM_SERVICES, True) + self.valid = valid or dict.fromkeys(UI_STREAM_SERVICES, True) + self.logMonoTime = dict.fromkeys(UI_STREAM_SERVICES, 42) + self.update_calls = 0 + + def __getitem__(self, service): + return self.readers[service] + + def update(self, timeout): + self.update_calls += 1 + + +class FakeChannel: + def __init__(self, buffered_amount=0): + self.bufferedAmount = buffered_amount + self.sent = [] + + def send(self, data): + self.sent.append(data) + + +def make_proxy(sm, **kwargs): + return UIStreamMessageProxy(sm=sm, **kwargs) + + +class TestComputeUiStatus: + def _msgs(self): + ss = messaging.new_message("selfdriveState") + iq = messaging.new_message("iqState") + ev = messaging.new_message("onroadEvents", 0) + return ss.selfdriveState, iq.iqState, ev.onroadEvents + + def test_disengaged(self): + ss, iq, ev = self._msgs() + assert compute_ui_status(ss, iq, ev) == "disengaged" + + def test_engaged_no_guidance(self): + ss, iq, ev = self._msgs() + ss.enabled = True + assert compute_ui_status(ss, iq, ev) == "engaged" + + def test_pre_enabled_is_override(self): + ss, iq, ev = self._msgs() + ss.state = OpenpilotState.preEnabled + assert compute_ui_status(ss, iq, ev) == "override" + + def test_lat_only(self): + ss, iq, ev = self._msgs() + iq.aol.available = True + iq.aol.enabled = True + assert compute_ui_status(ss, iq, ev) == "lat_only" + + def test_long_only(self): + ss, iq, ev = self._msgs() + ss.enabled = True + iq.aol.available = True + assert compute_ui_status(ss, iq, ev) == "long_only" + + def test_both_engaged(self): + ss, iq, ev = self._msgs() + ss.enabled = True + iq.aol.available = True + iq.aol.enabled = True + assert compute_ui_status(ss, iq, ev) == "engaged" + + +class TestUIStreamFrame: + def test_frame_shape_and_json(self): + model_msg = messaging.new_message("modelV2") + model = model_msg.modelV2 + model.position.x = [float(i) for i in range(33)] + model.position.y = [0.123456] * 33 + model.position.z = [0.0] * 33 + model.init("laneLines", 4) + for lane in model.laneLines: + lane.x = [1.0, 2.0] + lane.y = [0.1, 0.2] + lane.z = [0.0, 0.0] + model.laneLineProbs = [0.9, 0.8, 0.7, 0.6] + model.init("roadEdges", 2) + for edge in model.roadEdges: + edge.x = [1.0] + edge.y = [2.0] + edge.z = [0.0] + model.roadEdgeStds = [0.1, 0.2] + model.acceleration.x = [0.5] * 33 + + cs_msg = messaging.new_message("carState") + cs_msg.carState.vEgo = 12.345 + cs_msg.carState.leftBlinker = True + + readers = make_readers(modelV2=model_msg, carState=cs_msg) + sm = FakeSubMaster(readers) + proxy = make_proxy(sm) + channel = FakeChannel() + proxy.add_channel(channel) + + proxy.update() + + assert len(channel.sent) == 1 + frame = json.loads(channel.sent[0]) + assert frame["type"] == "uiStream" + data = frame["data"] + assert len(data["modelV2"]["position"]["x"]) == 33 + assert data["modelV2"]["position"]["y"][0] == 0.12 + assert len(data["modelV2"]["laneLines"]) == 4 + assert data["carState"]["vEgo"] == 12.35 + assert data["carState"]["leftBlinker"] is True + assert data["uiStatus"] == "disengaged" + assert data["selfdriveState"]["alertSize"] == "none" + assert "hasLongitudinalControl" in data["init"] + assert "cameraOffset" in data["init"] + assert "isMetric" in data["init"] + + def test_nan_scrubbed(self): + model_msg = messaging.new_message("modelV2") + model_msg.modelV2.position.x = [math.nan, math.inf, 1.0] + + readers = make_readers(modelV2=model_msg) + sm = FakeSubMaster(readers) + proxy = make_proxy(sm) + channel = FakeChannel() + proxy.add_channel(channel) + + proxy.update() + + raw = channel.sent[0] + assert "NaN" not in raw and "Infinity" not in raw + frame = json.loads(raw) + assert frame["data"]["modelV2"]["position"]["x"] == [0.0, 0.0, 1.0] + + def test_backpressure_drops_frames(self): + readers = make_readers() + sm = FakeSubMaster(readers) + proxy = make_proxy(sm) + channel = FakeChannel(buffered_amount=MAX_BUFFERED_BYTES + 1) + proxy.add_channel(channel) + + proxy.update() + + assert channel.sent == [] + assert proxy.dropped_frames == 1 + + def test_no_send_without_model_update(self): + readers = make_readers() + updated = dict.fromkeys(UI_STREAM_SERVICES, False) + sm = FakeSubMaster(readers, updated=updated) + proxy = make_proxy(sm) + proxy._last_emit_time = float("inf") + channel = FakeChannel() + proxy.add_channel(channel) + + proxy.update() + + assert channel.sent == [] + assert sm.update_calls == 1 + + def test_heartbeat_without_model_update(self): + readers = make_readers() + updated = dict.fromkeys(UI_STREAM_SERVICES, False) + sm = FakeSubMaster(readers, updated=updated) + proxy = make_proxy(sm) + channel = FakeChannel() + proxy.add_channel(channel) + + proxy.update() + + assert len(channel.sent) == 1 + frame = json.loads(channel.sent[0]) + assert frame["data"]["modelV2"] is None + + def test_low_bandwidth_decimation(self): + readers = make_readers() + sm = FakeSubMaster(readers) + proxy = make_proxy(sm, bitrate_getter=lambda: 500_000) + channel = FakeChannel() + proxy.add_channel(channel) + + for _ in range(4): + proxy.update() + + assert len(channel.sent) == 2 + + def test_full_rate_at_high_bitrate(self): + readers = make_readers() + sm = FakeSubMaster(readers) + proxy = make_proxy(sm, bitrate_getter=lambda: 5_000_000) + channel = FakeChannel() + proxy.add_channel(channel) + + for _ in range(4): + proxy.update() + + assert len(channel.sent) == 4 + + def test_sticky_status_when_engaged_like(self): + ss_msg = messaging.new_message("selfdriveState") + ss_msg.selfdriveState.enabled = True + iq_msg = messaging.new_message("iqState") + iq_msg.iqState.aol.available = True + iq_msg.iqState.aol.enabled = True + + readers = make_readers(selfdriveState=ss_msg, iqState=iq_msg) + sm = FakeSubMaster(readers) + proxy = make_proxy(sm) + channel = FakeChannel() + proxy.add_channel(channel) + proxy.update() + assert json.loads(channel.sent[-1])["data"]["uiStatus"] == "engaged" + + iq_msg.iqState.aol.available = False + proxy.update() + assert json.loads(channel.sent[-1])["data"]["uiStatus"] == "engaged" + + def test_frame_size_budget(self): + model_msg = messaging.new_message("modelV2") + model = model_msg.modelV2 + model.position.x = [float(i) * 3.03 for i in range(33)] + model.position.y = [1.234567] * 33 + model.position.z = [0.456789] * 33 + model.init("laneLines", 4) + for lane in model.laneLines: + lane.x = [float(i) * 3.03 for i in range(33)] + lane.y = [1.234567] * 33 + lane.z = [0.456789] * 33 + model.laneLineProbs = [0.9] * 4 + model.init("roadEdges", 2) + for edge in model.roadEdges: + edge.x = [float(i) * 3.03 for i in range(33)] + edge.y = [1.234567] * 33 + edge.z = [0.456789] * 33 + model.acceleration.x = [1.23] * 33 + + readers = make_readers(modelV2=model_msg) + sm = FakeSubMaster(readers) + proxy = make_proxy(sm) + frame = proxy._build_frame() + encoded = frame_to_str(frame) + assert len(encoded) < 8 * 1024 + + +class TestSessionWiring: + @pytest.mark.asyncio + async def test_set_ui_stream_control_message(self, mocker): + import logging + from types import SimpleNamespace + from iqpilot.system.webrtc.session import StreamSession + + mocker.patch("iqpilot.system.webrtc.ui_stream.messaging.SubMaster", return_value=FakeSubMaster(make_readers())) + + session = StreamSession.__new__(StreamSession) + session.logger = logging.getLogger("webrtcd") + session.ui_stream_runner = None + session.bitrate_controller = None + session.incoming_bridge = None + channel = FakeChannel() + session.stream = SimpleNamespace( + has_messaging_channel=lambda: True, + get_messaging_channel=lambda: channel, + ) + + session.message_handler(b'{"type":"setUiStream","enabled":true}') + assert session.ui_stream_runner is not None + await asyncio.sleep(0.05) + session.message_handler(b'{"type":"setUiStream","enabled":false}') + assert session.ui_stream_runner is None + + assert len(channel.sent) >= 1 + frame = json.loads(channel.sent[0]) + assert frame["type"] == "uiStream" diff --git a/iqpilot/system/webrtc/tests/test_webrtcd.py b/iqpilot/system/webrtc/tests/test_webrtcd.py new file mode 100644 index 000000000..c4b10d67e --- /dev/null +++ b/iqpilot/system/webrtc/tests/test_webrtcd.py @@ -0,0 +1,75 @@ +import json +from types import SimpleNamespace + +from parameterized import parameterized_class +import pytest + +from iqpilot.system.webrtc.webrtcd import add_ice, get_stream + + +class FakeSession: + instances = [] + + def __init__(self, identifier="session"): + self.identifier = identifier + self.started = False + self.stopped = False + self.candidates = [] + self.instances.append(self) + + async def get_answer(self): + return SimpleNamespace(sdp="answer", type="answer") + + def start(self): + self.started = True + + async def stop_async(self): + self.stopped = True + + async def add_ice_candidate(self, candidate): + self.candidates.append(candidate) + + +@parameterized_class(("in_services", "out_services"), [ + (["testJoystick"], ["carState"]), + ([], ["carState"]), + (["testJoystick"], []), + ([], []), +]) +@pytest.mark.asyncio +class TestWebrtcdProc: + async def test_webrtcd(self, mocker): + session = FakeSession() + mocker.patch("iqpilot.system.webrtc.webrtcd._new_stream_session", return_value=session) + request = mocker.MagicMock() + request.app = {"streams": {}, "debug": False} + request.json = mocker.AsyncMock(return_value={ + "sdp": "offer", + "cameras": ["road"], + "bridge_services_in": self.in_services, + "bridge_services_out": self.out_services, + }) + + response = await get_stream(request) + + assert response.status == 200 + assert json.loads(response.text) == {"sdp": "answer", "type": "answer"} + assert request.app["streams"] == {session.identifier: session} + assert session.started + + async def test_replaces_session_and_routes_ice(self, mocker): + previous = FakeSession("previous") + session = FakeSession("current") + mocker.patch("iqpilot.system.webrtc.webrtcd._new_stream_session", return_value=session) + request = mocker.MagicMock() + request.app = {"streams": {previous.identifier: previous}, "debug": False} + request.json = mocker.AsyncMock(return_value={"sdp": "offer", "cameras": ["road"]}) + + response = await get_stream(request) + + assert response.status == 200 + assert previous.stopped + request.json = mocker.AsyncMock(return_value={"candidate": {"candidate": "candidate:1"}}) + ice_response = await add_ice(request) + assert ice_response.status == 200 + assert session.candidates == [{"candidate": "candidate:1"}] diff --git a/iqpilot/system/webrtc/ui_stream.py b/iqpilot/system/webrtc/ui_stream.py new file mode 100644 index 000000000..5d8f59ecf --- /dev/null +++ b/iqpilot/system/webrtc/ui_stream.py @@ -0,0 +1,269 @@ +import json +import math +import time + +import numpy as np + +from iqpilot.cereal import car, log, custom, messaging +from iqpilot.common.params import Params + +OpenpilotState = log.SelfdriveState.OpenpilotState +GuidanceState = custom.AlwaysOnLateral.AlwaysOnLateralState + +UI_STREAM_SERVICES = [ + "modelV2", "carState", "selfdriveState", "controlsState", "extrinsicsCalibration", + "radarState", "longitudinalPlan", "deviceState", "roadCameraState", + "iqState", "onroadEvents", +] + +# Above this the viewer is not draining the channel; drop frames instead of queueing, +# telemetry is newest-wins and unbounded SCTP buffering is how webrtcd leaked before. +MAX_BUFFERED_BYTES = 256 * 1024 + +# Bitrate at/below which modelV2 frames are decimated to half rate to leave +# headroom for video on a struggling uplink. +LOW_BANDWIDTH_BITRATE = 500_000 + +HEARTBEAT_INTERVAL = 1.0 + + +def _round_list(vals, decimals: int) -> list[float]: + arr = np.asarray(vals, dtype=np.float64) + if arr.size == 0: + return [] + arr = np.round(np.where(np.isfinite(arr), arr, 0.0), decimals) + return arr.tolist() + + +def _round_float(val, decimals: int = 3, default: float = 0.0) -> float: + try: + v = float(val) + except (TypeError, ValueError): + return default + return round(v, decimals) if math.isfinite(v) else default + + +def _xyz(line, decimals: int = 2) -> dict[str, list[float]]: + return { + "x": _round_list(line.x, decimals), + "y": _round_list(line.y, decimals), + "z": _round_list(line.z, decimals), + } + + +def _lead(lead) -> dict: + return { + "status": bool(lead.status), + "dRel": _round_float(lead.dRel, 2), + "yRel": _round_float(lead.yRel, 2), + "vRel": _round_float(lead.vRel, 2), + } + + +def compute_ui_status(ss, iq_state, onroad_events) -> str: + # Mirrors IQUIState.update_status; that module pulls in the raylib UI stack, + # which must not be imported into webrtcd. + guidance = iq_state.aol + guidance_state = guidance.state + + if ss.state == OpenpilotState.preEnabled: + return "override" + + if ss.state == OpenpilotState.overriding: + if not guidance.available: + return "override" + if any(e.overrideLongitudinal for e in onroad_events): + return "override" + + if guidance_state in (GuidanceState.paused, GuidanceState.overriding): + return "override" + + if not guidance.available: + return "engaged" if ss.enabled else "disengaged" + + if not guidance.enabled and not ss.enabled: + return "disengaged" + + if guidance.enabled and ss.enabled: + return "engaged" + + if guidance.enabled: + return "lat_only" + + if ss.enabled: + return "long_only" + + return "disengaged" + + +def build_init_payload(params: Params | None = None) -> dict: + params = params or Params() + + has_longitudinal_control = False + cp_bytes = params.get("CarParamsPersistent") + if cp_bytes is not None: + try: + cp = messaging.log_from_bytes(cp_bytes, car.CarParams) + if cp.alphaLongitudinalAvailable: + has_longitudinal_control = params.get_bool("AlphaLongitudinalEnabled") + else: + has_longitudinal_control = bool(cp.openpilotLongitudinalControl) + except Exception: + pass + + camera_offset = 0.0 + if params.get("ModelManager_ActiveBundle"): + try: + camera_offset = float(params.get("CameraOffset", return_default=True) or 0.0) + except (TypeError, ValueError): + camera_offset = 0.0 + + return { + "hasLongitudinalControl": has_longitudinal_control, + "cameraOffset": _round_float(camera_offset, 3), + "isMetric": params.get_bool("IsMetric"), + } + + +class UIStreamMessageProxy: + """Sends a trimmed, HUD-only JSON projection of UI state over the session data + channel, clocked by modelV2 (~20Hz). Payload stays a few KB per frame; anything + the client renderers don't read is not serialized.""" + + def __init__(self, sm: messaging.SubMaster | None = None, bitrate_getter=None): + self.sm = sm if sm is not None else messaging.SubMaster(UI_STREAM_SERVICES) + self.channels = [] + self.bitrate_getter = bitrate_getter + self.dropped_frames = 0 + self._last_non_disengaged = "disengaged" + self._last_emit_time = 0.0 + self._decimate_flip = False + self._init_payload = build_init_payload() + + def add_channel(self, channel): + self.channels.append(channel) + + def update(self): + self.sm.update(0) + + model_updated = self.sm.updated["modelV2"] + now = time.monotonic() + if not model_updated: + if now - self._last_emit_time < HEARTBEAT_INTERVAL: + return + elif self._low_bandwidth(): + self._decimate_flip = not self._decimate_flip + if self._decimate_flip: + return + + # Send as a text frame: react-native-webrtc surfaces binary frames as + # ArrayBuffers that Hermes cannot reliably decode without TextDecoder. + frame = self._build_frame(include_model=model_updated) + encoded = frame_to_str(frame) + self._last_emit_time = now + for channel in self.channels: + if channel.bufferedAmount > MAX_BUFFERED_BYTES: + self.dropped_frames += 1 + continue + channel.send(encoded) + + def _low_bandwidth(self) -> bool: + if self.bitrate_getter is None: + return False + try: + bitrate = self.bitrate_getter() + except Exception: + return False + return bitrate is not None and bitrate <= LOW_BANDWIDTH_BITRATE + + def _ui_status(self) -> str: + sm = self.sm + ss = sm["selfdriveState"] + iq_state = sm["iqState"] + status = compute_ui_status(ss, iq_state, sm["onroadEvents"]) + + # Same stickiness as UIState._update_status: while still engaged-like, a + # transient disengaged classification keeps the last non-disengaged status. + if status != "disengaged": + self._last_non_disengaged = status + return status + + if ss.enabled or iq_state.aol.enabled: + if self._last_non_disengaged != "disengaged": + return self._last_non_disengaged + return "engaged" if ss.enabled else "disengaged" + + self._last_non_disengaged = "disengaged" + return "disengaged" + + def _build_frame(self, include_model: bool = True) -> dict: + sm = self.sm + cs = sm["carState"] + ss = sm["selfdriveState"] + calib = sm["extrinsicsCalibration"] + radar = sm["radarState"] + device_state = sm["deviceState"] + + model_data = None + if include_model: + model = sm["modelV2"] + model_data = { + "position": _xyz(model.position), + "laneLines": [_xyz(line) for line in model.laneLines], + "laneLineProbs": _round_list(model.laneLineProbs, 3), + "roadEdges": [_xyz(edge) for edge in model.roadEdges], + "roadEdgeStds": _round_list(model.roadEdgeStds, 3), + "acceleration": {"x": _round_list(model.acceleration.x, 2)}, + } + + data = { + "modelV2": model_data, + "carState": { + "vEgo": _round_float(cs.vEgo, 2), + "vEgoCluster": _round_float(cs.vEgoCluster, 2), + "vCruiseCluster": _round_float(cs.vCruiseCluster, 2), + "leftBlinker": bool(cs.leftBlinker), + "rightBlinker": bool(cs.rightBlinker), + }, + "selfdriveState": { + "enabled": bool(ss.enabled), + "experimentalMode": bool(ss.experimentalMode), + "state": str(ss.state), + "alertText1": str(ss.alertText1), + "alertText2": str(ss.alertText2), + "alertSize": str(ss.alertSize), + "alertStatus": str(ss.alertStatus), + }, + "controlsState": { + "vCruiseDEPRECATED": _round_float(sm["controlsState"].vCruiseDEPRECATED, 2), + }, + "extrinsicsCalibration": { + "calStatus": str(calib.calStatus), + "rpyCalib": _round_list(calib.rpyCalib, 5), + "wideFromDeviceEuler": _round_list(calib.wideFromDeviceEuler, 5), + "height": _round_list(calib.height, 3), + }, + "radarState": { + "valid": bool(sm.valid["radarState"]), + "leadOne": _lead(radar.leadOne), + "leadTwo": _lead(radar.leadTwo), + }, + "longitudinalPlan": { + "allowThrottle": bool(sm["longitudinalPlan"].allowThrottle), + }, + "deviceState": { + "deviceType": str(device_state.deviceType), + "started": bool(device_state.started), + }, + "roadCameraState": { + "sensor": str(sm["roadCameraState"].sensor), + }, + "uiStatus": self._ui_status(), + "init": self._init_payload, + } + + return {"type": "uiStream", "logMonoTime": sm.logMonoTime["modelV2"], "data": data} + + +def frame_to_str(frame: dict) -> str: + return json.dumps(frame, separators=(",", ":")) diff --git a/iqpilot/system/webrtc/webrtcd.py b/iqpilot/system/webrtc/webrtcd.py new file mode 100755 index 000000000..28c20cc84 --- /dev/null +++ b/iqpilot/system/webrtc/webrtcd.py @@ -0,0 +1,278 @@ +#!/usr/bin/env python3 + +import argparse +import asyncio +import json +import logging +from dataclasses import dataclass, field +from typing import Any + +import warnings +warnings.filterwarnings("ignore", category=DeprecationWarning) +warnings.filterwarnings("ignore", category=RuntimeWarning) + +import capnp +from aiohttp import web + +from iqpilot.system.webrtc.schema import generate_field +from iqpilot.cereal import messaging, log + + +class CerealOutgoingMessageProxy: + def __init__(self, sm: messaging.SubMaster): + self.sm = sm + self.channels: list[Any] = [] + + def add_channel(self, channel: Any): + self.channels.append(channel) + + def to_json(self, msg_content: Any): + if isinstance(msg_content, capnp._DynamicStructReader): + msg_dict = msg_content.to_dict() + elif isinstance(msg_content, capnp._DynamicListReader): + msg_dict = [self.to_json(msg) for msg in msg_content] + elif isinstance(msg_content, bytes): + msg_dict = msg_content.decode() + else: + msg_dict = msg_content + + return msg_dict + + def update(self): + # this is blocking in async context... + self.sm.update(0) + for service, updated in self.sm.updated.items(): + if not updated: + continue + msg_dict = self.to_json(self.sm[service]) + mono_time, valid = self.sm.logMonoTime[service], self.sm.valid[service] + outgoing_msg = {"type": service, "logMonoTime": mono_time, "valid": valid, "data": msg_dict} + encoded_msg = json.dumps(outgoing_msg).encode() + for channel in self.channels: + channel.send(encoded_msg) + + +class CerealIncomingMessageProxy: + def __init__(self, pm: messaging.PubMaster): + self.pm = pm + + def send(self, message: bytes): + msg_json = json.loads(message) + msg_type, msg_data = msg_json["type"], msg_json["data"] + size = None + if not isinstance(msg_data, dict): + size = len(msg_data) + + msg = messaging.new_message(msg_type, size=size) + setattr(msg, msg_type, msg_data) + self.pm.send(msg_type, msg) + + +class AsyncTaskRunner: + def __init__(self): + self.task: asyncio.Task | None = None + self.logger = logging.getLogger("webrtcd") + + def start(self): + if self.task is None: + self.task = asyncio.create_task(self.run()) + + async def stop(self): + if self.task is None: + return + if not self.task.done(): + self.task.cancel() + try: + await self.task + except asyncio.CancelledError: + pass + self.task = None + + +class CerealProxyRunner: + def __init__(self, proxy: CerealOutgoingMessageProxy): + self.proxy = proxy + self.is_running = False + self.task = None + self.logger = logging.getLogger("webrtcd") + + def start(self): + assert self.task is None + self.task = asyncio.create_task(self.run()) + + def stop(self): + if self.task is None or self.task.done(): + return + self.task.cancel() + self.task = None + + async def run(self): + while True: + try: + self.proxy.update() + except Exception: + self.logger.exception("Cereal outgoing proxy failure") + await asyncio.sleep(0.01) + + +class DynamicPubMaster(messaging.PubMaster): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.lock = asyncio.Lock() + + async def add_services_if_needed(self, services): + async with self.lock: + for service in services: + if service not in self.sock: + self.sock[service] = messaging.pub_sock(service) + + +def _is_retryable_stream_error(e: Exception) -> bool: + return isinstance(e, (ValueError, OSError)) + + +async def _cleanup_failed_session(session: Any | None, logger: logging.Logger) -> None: + if session is None: + return + try: + await session.stop_async() + except Exception: + logger.exception("Failed to clean up failed stream session") + + +def _strip_mdns_host_candidates(sdp: str) -> tuple[str, int]: + lines = sdp.split("\r\n") + kept = [line for line in lines if not (line.startswith("a=candidate:") and ".local" in line)] + return "\r\n".join(kept), len(lines) - len(kept) + + +@dataclass +class StreamRequestBody: + sdp: str + cameras: list[str] + bridge_services_in: list[str] = field(default_factory=list) + bridge_services_out: list[str] = field(default_factory=list) + iceServers: list[dict[str, Any]] = field(default_factory=list) + ui_stream: bool = False + + +def _new_stream_session(offer_sdp: str, body: StreamRequestBody, debug_mode: bool): + from iqpilot.system.webrtc.session import StreamSession + return StreamSession( + offer_sdp, body.cameras, body.bridge_services_in, body.bridge_services_out, body.iceServers, debug_mode, + ui_stream=body.ui_stream, + ) + + +async def get_stream(request: 'web.Request'): + stream_dict, debug_mode = request.app['streams'], request.app['debug'] + logger = logging.getLogger("webrtcd") + session: Any | None = None + try: + raw_body = await request.json() + body = StreamRequestBody(**raw_body) + offer_sdp = body.sdp + + # Single active session on the device: tear down any prior session before starting a new + # one. webrtcd is long-lived (manager-owned), so without this, repeated offers would leak + # sessions and contend for the same livestream topics. + for prev in list(stream_dict.values()): + try: + await prev.stop_async() + except Exception: + logger.exception("Failed to stop previous stream session") + stream_dict.clear() + + session = _new_stream_session(offer_sdp, body, debug_mode) + # Creating an answer can occasionally stall (ICE gathering, codec negotiation, etc). + # Bound it so the HTTP request doesn't hang forever and athena can surface a useful error. + try: + answer = await asyncio.wait_for(session.get_answer(), timeout=15.0) + except Exception as e: + if not _is_retryable_stream_error(e): + raise + + logger.warning("Transient stream creation error (%s); retrying once with a fresh session", e) + await _cleanup_failed_session(session, logger) + retry_offer_sdp, removed_mdns = _strip_mdns_host_candidates(offer_sdp) + if removed_mdns > 0: + logger.info("Retrying with SDP sanitized; removed %d mDNS host ICE candidate(s)", removed_mdns) + else: + logger.info("Retrying with fresh session and original SDP (no mDNS host candidates removed)") + + session = _new_stream_session(retry_offer_sdp, body, debug_mode) + answer = await asyncio.wait_for(session.get_answer(), timeout=15.0) + + session.start() + + stream_dict[session.identifier] = session + + return web.json_response({"sdp": answer.sdp, "type": answer.type}) + except TimeoutError: + await _cleanup_failed_session(session, logger) + logger.exception("Timed out generating WebRTC answer") + return web.json_response({"error": "answer_timeout", "message": "Timed out generating WebRTC answer"}, status=504) + except Exception as e: + await _cleanup_failed_session(session, logger) + logger.exception("Failed to create WebRTC stream session") + return web.json_response({"error": "stream_create_failed", "message": str(e)}, status=500) + + +async def add_ice(request: 'web.Request'): + stream_dict = request.app['streams'] + try: + body = await request.json() + except Exception: + return web.json_response({"error": "bad_request"}, status=400) + cand = body.get("candidate") + # Single active session on the device; apply to whatever is live. + for session in list(stream_dict.values()): + await session.add_ice_candidate(cand) + return web.json_response({"ok": True}) + + +async def get_schema(request: 'web.Request'): + services = request.query["services"].split(",") + services = [s for s in services if s] + assert all(s in log.Event.schema.fields and not s.endswith("DEPRECATED") for s in services), "Invalid service name" + schema_dict = {s: generate_field(log.Event.schema.fields[s]) for s in services} + return web.json_response(schema_dict) + + +async def on_shutdown(app: 'web.Application'): + for session in app['streams'].values(): + await session.stop_async() + del app['streams'] + + +def webrtcd_thread(host: str, port: int, debug: bool): + logging.basicConfig(level=logging.CRITICAL, handlers=[logging.StreamHandler()]) + logging_level = logging.DEBUG if debug else logging.INFO + logging.getLogger("WebRTCStream").setLevel(logging_level) + logging.getLogger("webrtcd").setLevel(logging_level) + logging.getLogger("LiveStreamVideoStreamTrack").setLevel(logging_level) + + app = web.Application() + + app['streams'] = dict() + app['debug'] = debug + app.on_shutdown.append(on_shutdown) + app.router.add_post("/stream", get_stream) + app.router.add_post("/ice", add_ice) + app.router.add_get("/schema", get_schema) + + web.run_app(app, host=host, port=port) + + +def main(): + parser = argparse.ArgumentParser(description="WebRTC daemon") + parser.add_argument("--host", type=str, default="0.0.0.0", help="Host to listen on") + parser.add_argument("--port", type=int, default=5001, help="Port to listen on") + parser.add_argument("--debug", action="store_true", help="Enable debug mode") + args = parser.parse_args() + + webrtcd_thread(args.host, args.port, args.debug) + + +if __name__=="__main__": + main() diff --git a/iqpilot/third_party/.gitignore b/iqpilot/third_party/.gitignore new file mode 100644 index 000000000..0d20b6487 --- /dev/null +++ b/iqpilot/third_party/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/iqpilot/third_party/acados/.gitignore b/iqpilot/third_party/acados/.gitignore new file mode 100644 index 000000000..68858c62e --- /dev/null +++ b/iqpilot/third_party/acados/.gitignore @@ -0,0 +1,5 @@ +acados_repo/ +lib +!x86_64/ +!larch64/ +!aarch64/ diff --git a/iqpilot/third_party/acados/aarch64 b/iqpilot/third_party/acados/aarch64 new file mode 120000 index 000000000..062c65e8d --- /dev/null +++ b/iqpilot/third_party/acados/aarch64 @@ -0,0 +1 @@ +larch64/ \ No newline at end of file diff --git a/iqpilot/third_party/acados/acados_template/.gitignore b/iqpilot/third_party/acados/acados_template/.gitignore new file mode 100644 index 000000000..63b741bb9 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/.gitignore @@ -0,0 +1,6 @@ +__pycache__/ + +# Cython intermediates +*_pyx.c +*_pyx.o +*_pyx.so diff --git a/iqpilot/third_party/acados/acados_template/__init__.py b/iqpilot/third_party/acados/acados_template/__init__.py new file mode 100644 index 000000000..bfbe90799 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/__init__.py @@ -0,0 +1,40 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +from .acados_model import AcadosModel +from .acados_ocp import AcadosOcp, AcadosOcpConstraints, AcadosOcpCost, AcadosOcpDims, AcadosOcpOptions +from .acados_sim import AcadosSim, AcadosSimDims, AcadosSimOpts +from .acados_ocp_solver import AcadosOcpSolver, get_simulink_default_opts, ocp_get_default_cmake_builder +from .acados_sim_solver import AcadosSimSolver, sim_get_default_cmake_builder +from .utils import print_casadi_expression, get_acados_path, get_python_interface_path, \ + get_tera_exec_path, get_tera, check_casadi_version, acados_dae_model_json_dump, \ + casadi_length, make_object_json_dumpable, J_to_idx, get_default_simulink_opts + +from .zoro_description import ZoroDescription, process_zoro_description diff --git a/iqpilot/third_party/acados/acados_template/acados_layout.json b/iqpilot/third_party/acados/acados_template/acados_layout.json new file mode 100644 index 000000000..a1cc5bbdf --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/acados_layout.json @@ -0,0 +1,834 @@ +{ + "code_export_directory": [ + "str" + ], + "acados_include_path": [ + "str" + ], + "cython_include_dirs": [ + "list" + ], + "json_file": [ + "str" + ], + "shared_lib_ext": [ + "str" + ], + "model": { + "name" : [ + "str" + ], + "dyn_ext_fun_type" : [ + "str" + ], + "dyn_generic_source" : [ + "str" + ], + "dyn_impl_dae_fun" : [ + "str" + ], + "dyn_impl_dae_fun_jac" : [ + "str" + ], + "dyn_impl_dae_jac" : [ + "str" + ], + "dyn_disc_fun_jac_hess" : [ + "str" + ], + "dyn_disc_fun_jac" : [ + "str" + ], + "dyn_disc_fun" : [ + "str" + ], + "gnsf" : { + "nontrivial_f_LO": [ + "int" + ], + "purely_linear": [ + "int" + ] + } + }, + "parameter_values": [ + "ndarray", + [ + "np" + ] + ], + "acados_lib_path": [ + "str" + ], + "problem_class": [ + "str" + ], + "constraints": { + "constr_type": [ + "str" + ], + "constr_type_e": [ + "str" + ], + "lbx": [ + "ndarray", + [ + "nbx" + ] + ], + "lbu": [ + "ndarray", + [ + "nbu" + ] + ], + "ubx": [ + "ndarray", + [ + "nbx" + ] + ], + "ubu": [ + "ndarray", + [ + "nbu" + ] + ], + "idxbx": [ + "ndarray", + [ + "nbx" + ] + ], + "idxbu": [ + "ndarray", + [ + "nbu" + ] + ], + "lbx_e": [ + "ndarray", + [ + "nbx_e" + ] + ], + "ubx_e": [ + "ndarray", + [ + "nbx_e" + ] + ], + "idxbx_e": [ + "ndarray", + [ + "nbx_e" + ] + ], + "lbx_0": [ + "ndarray", + [ + "nbx_0" + ] + ], + "ubx_0": [ + "ndarray", + [ + "nbx_0" + ] + ], + "idxbx_0": [ + "ndarray", + [ + "nbx_0" + ] + ], + "idxbxe_0": [ + "ndarray", + [ + "nbxe_0" + ] + ], + "lg": [ + "ndarray", + [ + "ng" + ] + ], + "ug": [ + "ndarray", + [ + "ng" + ] + ], + "D": [ + "ndarray", + [ + "ng", + "nu" + ] + ], + "C": [ + "ndarray", + [ + "ng", + "nx" + ] + ], + "C_e": [ + "ndarray", + [ + "ng_e", + "nx" + ] + ], + "lg_e": [ + "ndarray", + [ + "ng_e" + ] + ], + "ug_e": [ + "ndarray", + [ + "ng_e" + ] + ], + "lh": [ + "ndarray", + [ + "nh" + ] + ], + "uh": [ + "ndarray", + [ + "nh" + ] + ], + "lh_e": [ + "ndarray", + [ + "nh_e" + ] + ], + "uh_e": [ + "ndarray", + [ + "nh_e" + ] + ], + "lphi": [ + "ndarray", + [ + "nphi" + ] + ], + "uphi": [ + "ndarray", + [ + "nphi" + ] + ], + "lphi_e": [ + "ndarray", + [ + "nphi_e" + ] + ], + "uphi_e": [ + "ndarray", + [ + "nphi_e" + ] + ], + "lsbx": [ + "ndarray", + [ + "nsbx" + ] + ], + "usbx": [ + "ndarray", + [ + "nsbx" + ] + ], + "lsbu": [ + "ndarray", + [ + "nsbu" + ] + ], + "usbu": [ + "ndarray", + [ + "nsbu" + ] + ], + "idxsbx": [ + "ndarray", + [ + "nsbx" + ] + ], + "idxsbu": [ + "ndarray", + [ + "nsbu" + ] + ], + "lsbx_e": [ + "ndarray", + [ + "nsbx_e" + ] + ], + "usbx_e": [ + "ndarray", + [ + "nsbx_e" + ] + ], + "idxsbx_e": [ + "ndarray", + [ + "nsbx_e" + ] + ], + "lsg": [ + "ndarray", + [ + "nsg" + ] + ], + "usg": [ + "ndarray", + [ + "nsg" + ] + ], + "idxsg": [ + "ndarray", + [ + "nsg" + ] + ], + "lsg_e": [ + "ndarray", + [ + "nsg_e" + ] + ], + "usg_e": [ + "ndarray", + [ + "nsg_e" + ] + ], + "idxsg_e": [ + "ndarray", + [ + "nsg_e" + ] + ], + "lsh": [ + "ndarray", + [ + "nsh" + ] + ], + "ush": [ + "ndarray", + [ + "nsh" + ] + ], + "idxsh": [ + "ndarray", + [ + "nsh" + ] + ], + "lsh_e": [ + "ndarray", + [ + "nsh_e" + ] + ], + "ush_e": [ + "ndarray", + [ + "nsh_e" + ] + ], + "idxsh_e": [ + "ndarray", + [ + "nsh_e" + ] + ], + "lsphi": [ + "ndarray", + [ + "nsphi" + ] + ], + "usphi": [ + "ndarray", + [ + "nsphi" + ] + ], + "idxsphi": [ + "ndarray", + [ + "nsphi" + ] + ], + "lsphi_e": [ + "ndarray", + [ + "nsphi_e" + ] + ], + "usphi_e": [ + "ndarray", + [ + "nsphi_e" + ] + ], + "idxsphi_e": [ + "ndarray", + [ + "nsphi_e" + ] + ] + }, + "cost": { + "cost_type_0": [ + "str" + ], + "cost_type": [ + "str" + ], + "cost_type_e": [ + "str" + ], + "cost_ext_fun_type_0": [ + "str" + ], + "cost_ext_fun_type": [ + "str" + ], + "cost_ext_fun_type_e": [ + "str" + ], + "Vu_0": [ + "ndarray", + [ + "ny_0", + "nu" + ] + ], + "Vu": [ + "ndarray", + [ + "ny", + "nu" + ] + ], + "Vx_0": [ + "ndarray", + [ + "ny_0", + "nx" + ] + ], + "Vx": [ + "ndarray", + [ + "ny", + "nx" + ] + ], + "Vx_e": [ + "ndarray", + [ + "ny_e", + "nx" + ] + ], + "Vz_0": [ + "ndarray", + [ + "ny_0", + "nz" + ] + ], + "Vz": [ + "ndarray", + [ + "ny", + "nz" + ] + ], + "W_0": [ + "ndarray", + [ + "ny_0", + "ny_0" + ] + ], + "W": [ + "ndarray", + [ + "ny", + "ny" + ] + ], + "Zl": [ + "ndarray", + [ + "ns" + ] + ], + "Zu": [ + "ndarray", + [ + "ns" + ] + ], + "zl": [ + "ndarray", + [ + "ns" + ] + ], + "zu": [ + "ndarray", + [ + "ns" + ] + ], + "W_e": [ + "ndarray", + [ + "ny_e", + "ny_e" + ] + ], + "yref_0": [ + "ndarray", + [ + "ny_0" + ] + ], + "yref": [ + "ndarray", + [ + "ny" + ] + ], + "yref_e": [ + "ndarray", + [ + "ny_e" + ] + ], + "Zl_e": [ + "ndarray", + [ + "ns_e" + ] + ], + "Zu_e": [ + "ndarray", + [ + "ns_e" + ] + ], + "zl_e": [ + "ndarray", + [ + "ns_e" + ] + ], + "zu_e": [ + "ndarray", + [ + "ns_e" + ] + ] + }, + "dims": { + "N": [ + "int" + ], + "nbu": [ + "int" + ], + "nbx": [ + "int" + ], + "nsbu": [ + "int" + ], + "nsbx": [ + "int" + ], + "nsbx_e": [ + "int" + ], + "nbx_0": [ + "int" + ], + "nbx_e": [ + "int" + ], + "nbxe_0": [ + "int" + ], + "nsg": [ + "int" + ], + "nsg_e": [ + "int" + ], + "nsh": [ + "int" + ], + "nsh_e": [ + "int" + ], + "nsphi": [ + "int" + ], + "nsphi_e": [ + "int" + ], + "ns": [ + "int" + ], + "ns_e": [ + "int" + ], + "ng": [ + "int" + ], + "ng_e": [ + "int" + ], + "np": [ + "int" + ], + "nr": [ + "int" + ], + "nr_e": [ + "int" + ], + "nh": [ + "int" + ], + "nh_e": [ + "int" + ], + "nphi": [ + "int" + ], + "nphi_e": [ + "int" + ], + "nu": [ + "int" + ], + "nx": [ + "int" + ], + "ny": [ + "int" + ], + "ny_0": [ + "int" + ], + "ny_e": [ + "int" + ], + "nz": [ + "int" + ], + "gnsf_nx1": [ + "int" + ], + "gnsf_nz1": [ + "int" + ], + "gnsf_nuhat": [ + "int" + ], + "gnsf_ny": [ + "int" + ], + "gnsf_nout": [ + "int" + ] + }, + "solver_options": { + "time_steps": [ + "ndarray", + [ + "N" + ] + ], + "hessian_approx": [ + "str" + ], + "hpipm_mode": [ + "str" + ], + "regularize_method": [ + "str" + ], + "integrator_type": [ + "str" + ], + "nlp_solver_type": [ + "str" + ], + "collocation_type": [ + "str" + ], + "globalization": [ + "str" + ], + "nlp_solver_step_length": [ + "float" + ], + "levenberg_marquardt": [ + "float" + ], + "qp_solver": [ + "str" + ], + "tf": [ + "float" + ], + "Tsim": [ + "float" + ], + "alpha_min": [ + "float" + ], + "alpha_reduction": [ + "float" + ], + "line_search_use_sufficient_descent": [ + "int" + ], + "globalization_use_SOC": [ + "int" + ], + "full_step_dual": [ + "int" + ], + "eps_sufficient_descent": [ + "float" + ], + "sim_method_num_stages": [ + "ndarray", + [ + "N" + ] + ], + "sim_method_num_steps": [ + "ndarray", + [ + "N" + ] + ], + "sim_method_newton_iter": [ + "int" + ], + "sim_method_newton_tol": [ + "float" + ], + "sim_method_jac_reuse": [ + "ndarray", + [ + "N" + ] + ], + "qp_solver_cond_N": [ + "int" + ], + "qp_solver_warm_start": [ + "int" + ], + "qp_solver_tol_stat": [ + "float" + ], + "qp_solver_tol_eq": [ + "float" + ], + "qp_solver_tol_ineq": [ + "float" + ], + "qp_solver_tol_comp": [ + "float" + ], + "qp_solver_iter_max": [ + "int" + ], + "qp_solver_cond_ric_alg": [ + "int" + ], + "qp_solver_ric_alg": [ + "int" + ], + "nlp_solver_tol_stat": [ + "float" + ], + "nlp_solver_tol_eq": [ + "float" + ], + "nlp_solver_tol_ineq": [ + "float" + ], + "nlp_solver_tol_comp": [ + "float" + ], + "nlp_solver_max_iter": [ + "int" + ], + "nlp_solver_ext_qp_res": [ + "int" + ], + "print_level": [ + "int" + ], + "initialize_t_slacks": [ + "int" + ], + "exact_hess_cost": [ + "int" + ], + "exact_hess_constr": [ + "int" + ], + "exact_hess_dyn": [ + "int" + ], + "ext_cost_num_hess": [ + "int" + ], + "ext_fun_compile_flags": [ + "str" + ], + "model_external_shared_lib_dir": [ + "str" + ], + "model_external_shared_lib_name": [ + "str" + ] + } +} diff --git a/iqpilot/third_party/acados/acados_template/acados_model.py b/iqpilot/third_party/acados/acados_template/acados_model.py new file mode 100644 index 000000000..b7c694544 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/acados_model.py @@ -0,0 +1,154 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + + +class AcadosModel(): + """ + Class containing all the information to code generate the external CasADi functions + that are needed when creating an acados ocp solver or acados integrator. + Thus, this class contains: + + a) the :py:attr:`name` of the model, + b) all CasADi variables/expressions needed in the CasADi function generation process. + """ + def __init__(self): + ## common for OCP and Integrator + self.name = None + """ + The model name is used for code generation. Type: string. Default: :code:`None` + """ + self.x = None #: CasADi variable describing the state of the system; Default: :code:`None` + self.xdot = None #: CasADi variable describing the derivative of the state wrt time; Default: :code:`None` + self.u = None #: CasADi variable describing the input of the system; Default: :code:`None` + self.z = [] #: CasADi variable describing the algebraic variables of the DAE; Default: :code:`empty` + self.p = [] #: CasADi variable describing parameters of the DAE; Default: :code:`empty` + # dynamics + self.f_impl_expr = None + """ + CasADi expression for the implicit dynamics :math:`f_\\text{impl}(\dot{x}, x, u, z, p) = 0`. + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.integrator_type` == 'IRK'. + Default: :code:`None` + """ + self.f_expl_expr = None + """ + CasADi expression for the explicit dynamics :math:`\dot{x} = f_\\text{expl}(x, u, p)`. + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.integrator_type` == 'ERK'. + Default: :code:`None` + """ + self.disc_dyn_expr = None + """ + CasADi expression for the discrete dynamics :math:`x_{+} = f_\\text{disc}(x, u, p)`. + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.integrator_type` == 'DISCRETE'. + Default: :code:`None` + """ + + self.dyn_ext_fun_type = 'casadi' #: type of external functions for dynamics module; 'casadi' or 'generic'; Default: 'casadi' + self.dyn_generic_source = None #: name of source file for discrete dyanamics; Default: :code:`None` + self.dyn_disc_fun_jac_hess = None #: name of function discrete dyanamics + jacobian and hessian; Default: :code:`None` + self.dyn_disc_fun_jac = None #: name of function discrete dyanamics + jacobian; Default: :code:`None` + self.dyn_disc_fun = None #: name of function discrete dyanamics; Default: :code:`None` + + # for GNSF models + self.gnsf = {'nontrivial_f_LO': 1, 'purely_linear': 0} + """ + dictionary containing information on GNSF structure needed when rendering templates. + Contains integers `nontrivial_f_LO`, `purely_linear`. + """ + + ## for OCP + # constraints + # BGH(default): lh <= h(x, u) <= uh + self.con_h_expr = None #: CasADi expression for the constraint :math:`h`; Default: :code:`None` + # BGP(convex over nonlinear): lphi <= phi(r(x, u)) <= uphi + self.con_phi_expr = None #: CasADi expression for the constraint phi; Default: :code:`None` + self.con_r_expr = None #: CasADi expression for the constraint phi(r); Default: :code:`None` + self.con_r_in_phi = None + # terminal + self.con_h_expr_e = None #: CasADi expression for the terminal constraint :math:`h^e`; Default: :code:`None` + self.con_r_expr_e = None #: CasADi expression for the terminal constraint; Default: :code:`None` + self.con_phi_expr_e = None #: CasADi expression for the terminal constraint; Default: :code:`None` + self.con_r_in_phi_e = None + # cost + self.cost_y_expr = None #: CasADi expression for nonlinear least squares; Default: :code:`None` + self.cost_y_expr_e = None #: CasADi expression for nonlinear least squares, terminal; Default: :code:`None` + self.cost_y_expr_0 = None #: CasADi expression for nonlinear least squares, initial; Default: :code:`None` + self.cost_expr_ext_cost = None #: CasADi expression for external cost; Default: :code:`None` + self.cost_expr_ext_cost_e = None #: CasADi expression for external cost, terminal; Default: :code:`None` + self.cost_expr_ext_cost_0 = None #: CasADi expression for external cost, initial; Default: :code:`None` + self.cost_expr_ext_cost_custom_hess = None #: CasADi expression for custom hessian (only for external cost); Default: :code:`None` + self.cost_expr_ext_cost_custom_hess_e = None #: CasADi expression for custom hessian (only for external cost), terminal; Default: :code:`None` + self.cost_expr_ext_cost_custom_hess_0 = None #: CasADi expression for custom hessian (only for external cost), initial; Default: :code:`None` + + ## CONVEX_OVER_NONLINEAR convex-over-nonlinear cost: psi(y(x, u, p) - y_ref; p) + self.cost_psi_expr_0 = None + """ + CasADi expression for the outer loss function :math:`\psi(r, p)`, initial; Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type_0` == 'CONVEX_OVER_NONLINEAR'. + """ + self.cost_psi_expr = None + """ + CasADi expression for the outer loss function :math:`\psi(r, p)`; Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type` == 'CONVEX_OVER_NONLINEAR'. + """ + self.cost_psi_expr_e = None + """ + CasADi expression for the outer loss function :math:`\psi(r, p)`, terminal; Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type_e` == 'CONVEX_OVER_NONLINEAR'. + """ + self.cost_r_in_psi_expr_0 = None + """ + CasADi expression for the argument :math:`r`; to the outer loss function :math:`\psi(r, p)`, initial; Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type_0` == 'CONVEX_OVER_NONLINEAR'. + """ + self.cost_r_in_psi_expr = None + """ + CasADi expression for the argument :math:`r`; to the outer loss function :math:`\psi(r, p)`; Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type` == 'CONVEX_OVER_NONLINEAR'. + """ + self.cost_r_in_psi_expr_e = None + """ + CasADi expression for the argument :math:`r`; to the outer loss function :math:`\psi(r, p)`, terminal; Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type_e` == 'CONVEX_OVER_NONLINEAR'. + """ + self.cost_conl_custom_outer_hess_0 = None + """ + CasADi expression for the custom hessian of the outer loss function (only for convex-over-nonlinear cost), initial; Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type_0` == 'CONVEX_OVER_NONLINEAR'. + """ + self.cost_conl_custom_outer_hess = None + """ + CasADi expression for the custom hessian of the outer loss function (only for convex-over-nonlinear cost); Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type` == 'CONVEX_OVER_NONLINEAR'. + """ + self.cost_conl_custom_outer_hess_e = None + """ + CasADi expression for the custom hessian of the outer loss function (only for convex-over-nonlinear cost), terminal; Default: :code:`None` + Used if :py:attr:`acados_template.acados_ocp.AcadosOcpOptions.cost_type_e` == 'CONVEX_OVER_NONLINEAR'. + """ diff --git a/iqpilot/third_party/acados/acados_template/acados_ocp.py b/iqpilot/third_party/acados/acados_template/acados_ocp.py new file mode 100644 index 000000000..d6236e1f6 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/acados_ocp.py @@ -0,0 +1,3166 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +import numpy as np +import os +from .acados_model import AcadosModel +from .utils import get_acados_path, J_to_idx, J_to_idx_slack, get_lib_ext + +class AcadosOcpDims: + """ + Class containing the dimensions of the optimal control problem. + """ + def __init__(self): + self.__nx = None + self.__nu = None + self.__nz = 0 + self.__np = 0 + self.__ny = 0 + self.__ny_e = 0 + self.__ny_0 = 0 + self.__nr = 0 + self.__nr_e = 0 + self.__nh = 0 + self.__nh_e = 0 + self.__nphi = 0 + self.__nphi_e = 0 + self.__nbx = 0 + self.__nbx_0 = 0 + self.__nbx_e = 0 + self.__nbu = 0 + self.__nsbx = 0 + self.__nsbx_e = 0 + self.__nsbu = 0 + self.__nsh = 0 + self.__nsh_e = 0 + self.__nsphi = 0 + self.__nsphi_e = 0 + self.__ns = 0 + self.__ns_e = 0 + self.__ng = 0 + self.__ng_e = 0 + self.__nsg = 0 + self.__nsg_e = 0 + self.__nbxe_0 = None + self.__N = None + + + @property + def nx(self): + """:math:`n_x` - number of states. + Type: int; default: None""" + return self.__nx + + @property + def nz(self): + """:math:`n_z` - number of algebraic variables. + Type: int; default: 0""" + return self.__nz + + @property + def nu(self): + """:math:`n_u` - number of inputs. + Type: int; default: None""" + return self.__nu + + @property + def np(self): + """:math:`n_p` - number of parameters. + Type: int; default: 0""" + return self.__np + + @property + def ny(self): + """:math:`n_y` - number of residuals in Lagrange term. + Type: int; default: 0""" + return self.__ny + + @property + def ny_0(self): + """:math:`n_{y}^0` - number of residuals in Mayer term. + Type: int; default: 0""" + return self.__ny_0 + + @property + def ny_e(self): + """:math:`n_{y}^e` - number of residuals in Mayer term. + Type: int; default: 0""" + return self.__ny_e + + @property + def nr(self): + """:math:`n_{\pi}` - dimension of the image of the inner nonlinear function in positive definite constraints. + Type: int; default: 0""" + return self.__nr + + @property + def nr_e(self): + """:math:`n_{\pi}^e` - dimension of the image of the inner nonlinear function in positive definite constraints. + Type: int; default: 0""" + return self.__nr_e + + @property + def nh(self): + """:math:`n_h` - number of nonlinear constraints. + Type: int; default: 0""" + return self.__nh + + @property + def nh_e(self): + """:math:`n_{h}^e` - number of nonlinear constraints at terminal shooting node N. + Type: int; default: 0""" + return self.__nh_e + + @property + def nphi(self): + """:math:`n_{\phi}` - number of convex-over-nonlinear constraints. + Type: int; default: 0""" + return self.__nphi + + @property + def nphi_e(self): + """:math:`n_{\phi}^e` - number of convex-over-nonlinear constraints at terminal shooting node N. + Type: int; default: 0""" + return self.__nphi_e + + @property + def nbx(self): + """:math:`n_{b_x}` - number of state bounds. + Type: int; default: 0""" + return self.__nbx + + @property + def nbxe_0(self): + """:math:`n_{be_{x0}}` - number of state bounds at initial shooting node that are equalities. + Type: int; default: None""" + return self.__nbxe_0 + + @property + def nbx_0(self): + """:math:`n_{b_{x0}}` - number of state bounds for initial state. + Type: int; default: 0""" + return self.__nbx_0 + + @property + def nbx_e(self): + """:math:`n_{b_x}` - number of state bounds at terminal shooting node N. + Type: int; default: 0""" + return self.__nbx_e + + @property + def nbu(self): + """:math:`n_{b_u}` - number of input bounds. + Type: int; default: 0""" + return self.__nbu + + @property + def nsbx(self): + """:math:`n_{{sb}_x}` - number of soft state bounds. + Type: int; default: 0""" + return self.__nsbx + + @property + def nsbx_e(self): + """:math:`n_{{sb}^e_{x}}` - number of soft state bounds at terminal shooting node N. + Type: int; default: 0""" + return self.__nsbx_e + + @property + def nsbu(self): + """:math:`n_{{sb}_u}` - number of soft input bounds. + Type: int; default: 0""" + return self.__nsbu + + @property + def nsg(self): + """:math:`n_{{sg}}` - number of soft general linear constraints. + Type: int; default: 0""" + return self.__nsg + + @property + def nsg_e(self): + """:math:`n_{{sg}^e}` - number of soft general linear constraints at terminal shooting node N. + Type: int; default: 0""" + return self.__nsg_e + + @property + def nsh(self): + """:math:`n_{{sh}}` - number of soft nonlinear constraints. + Type: int; default: 0""" + return self.__nsh + + @property + def nsh_e(self): + """:math:`n_{{sh}}^e` - number of soft nonlinear constraints at terminal shooting node N. + Type: int; default: 0""" + return self.__nsh_e + + @property + def nsphi(self): + """:math:`n_{{s\phi}}` - number of soft convex-over-nonlinear constraints. + Type: int; default: 0""" + return self.__nsphi + + @property + def nsphi_e(self): + """:math:`n_{{s\phi}^e}` - number of soft convex-over-nonlinear constraints at terminal shooting node N. + Type: int; default: 0""" + return self.__nsphi_e + + @property + def ns(self): + """:math:`n_{s}` - total number of slacks. + Type: int; default: 0""" + return self.__ns + + @property + def ns_e(self): + """:math:`n_{s}^e` - total number of slacks at terminal shooting node N. + Type: int; default: 0""" + return self.__ns_e + + @property + def ng(self): + """:math:`n_{g}` - number of general polytopic constraints. + Type: int; default: 0""" + return self.__ng + + @property + def ng_e(self): + """:math:`n_{g}^e` - number of general polytopic constraints at terminal shooting node N. + Type: int; default: 0""" + return self.__ng_e + + @property + def N(self): + """:math:`N` - prediction horizon. + Type: int; default: None""" + return self.__N + + @nx.setter + def nx(self, nx): + if isinstance(nx, int) and nx > 0: + self.__nx = nx + else: + raise Exception('Invalid nx value, expected positive integer.') + + @nz.setter + def nz(self, nz): + if isinstance(nz, int) and nz > -1: + self.__nz = nz + else: + raise Exception('Invalid nz value, expected nonnegative integer.') + + @nu.setter + def nu(self, nu): + if isinstance(nu, int) and nu > -1: + self.__nu = nu + else: + raise Exception('Invalid nu value, expected nonnegative integer.') + + @np.setter + def np(self, np): + if isinstance(np, int) and np > -1: + self.__np = np + else: + raise Exception('Invalid np value, expected nonnegative integer.') + + @ny_0.setter + def ny_0(self, ny_0): + if isinstance(ny_0, int) and ny_0 > -1: + self.__ny_0 = ny_0 + else: + raise Exception('Invalid ny_0 value, expected nonnegative integer.') + + @ny.setter + def ny(self, ny): + if isinstance(ny, int) and ny > -1: + self.__ny = ny + else: + raise Exception('Invalid ny value, expected nonnegative integer.') + + @ny_e.setter + def ny_e(self, ny_e): + if isinstance(ny_e, int) and ny_e > -1: + self.__ny_e = ny_e + else: + raise Exception('Invalid ny_e value, expected nonnegative integer.') + + @nr.setter + def nr(self, nr): + if isinstance(nr, int) and nr > -1: + self.__nr = nr + else: + raise Exception('Invalid nr value, expected nonnegative integer.') + + @nr_e.setter + def nr_e(self, nr_e): + if isinstance(nr_e, int) and nr_e > -1: + self.__nr_e = nr_e + else: + raise Exception('Invalid nr_e value, expected nonnegative integer.') + + @nh.setter + def nh(self, nh): + if isinstance(nh, int) and nh > -1: + self.__nh = nh + else: + raise Exception('Invalid nh value, expected nonnegative integer.') + + @nh_e.setter + def nh_e(self, nh_e): + if isinstance(nh_e, int) and nh_e > -1: + self.__nh_e = nh_e + else: + raise Exception('Invalid nh_e value, expected nonnegative integer.') + + @nphi.setter + def nphi(self, nphi): + if isinstance(nphi, int) and nphi > -1: + self.__nphi = nphi + else: + raise Exception('Invalid nphi value, expected nonnegative integer.') + + @nphi_e.setter + def nphi_e(self, nphi_e): + if isinstance(nphi_e, int) and nphi_e > -1: + self.__nphi_e = nphi_e + else: + raise Exception('Invalid nphi_e value, expected nonnegative integer.') + + @nbx.setter + def nbx(self, nbx): + if isinstance(nbx, int) and nbx > -1: + self.__nbx = nbx + else: + raise Exception('Invalid nbx value, expected nonnegative integer.') + + @nbxe_0.setter + def nbxe_0(self, nbxe_0): + if isinstance(nbxe_0, int) and nbxe_0 > -1: + self.__nbxe_0 = nbxe_0 + else: + raise Exception('Invalid nbxe_0 value, expected nonnegative integer.') + + @nbx_0.setter + def nbx_0(self, nbx_0): + if isinstance(nbx_0, int) and nbx_0 > -1: + self.__nbx_0 = nbx_0 + else: + raise Exception('Invalid nbx_0 value, expected nonnegative integer.') + + @nbx_e.setter + def nbx_e(self, nbx_e): + if isinstance(nbx_e, int) and nbx_e > -1: + self.__nbx_e = nbx_e + else: + raise Exception('Invalid nbx_e value, expected nonnegative integer.') + + @nbu.setter + def nbu(self, nbu): + if isinstance(nbu, int) and nbu > -1: + self.__nbu = nbu + else: + raise Exception('Invalid nbu value, expected nonnegative integer.') + + @nsbx.setter + def nsbx(self, nsbx): + if isinstance(nsbx, int) and nsbx > -1: + self.__nsbx = nsbx + else: + raise Exception('Invalid nsbx value, expected nonnegative integer.') + + @nsbx_e.setter + def nsbx_e(self, nsbx_e): + if isinstance(nsbx_e, int) and nsbx_e > -1: + self.__nsbx_e = nsbx_e + else: + raise Exception('Invalid nsbx_e value, expected nonnegative integer.') + + @nsbu.setter + def nsbu(self, nsbu): + if isinstance(nsbu, int) and nsbu > -1: + self.__nsbu = nsbu + else: + raise Exception('Invalid nsbu value, expected nonnegative integer.') + + @nsg.setter + def nsg(self, nsg): + if isinstance(nsg, int) and nsg > -1: + self.__nsg = nsg + else: + raise Exception('Invalid nsg value, expected nonnegative integer.') + + @nsg_e.setter + def nsg_e(self, nsg_e): + if isinstance(nsg_e, int) and nsg_e > -1: + self.__nsg_e = nsg_e + else: + raise Exception('Invalid nsg_e value, expected nonnegative integer.') + + @nsh.setter + def nsh(self, nsh): + if isinstance(nsh, int) and nsh > -1: + self.__nsh = nsh + else: + raise Exception('Invalid nsh value, expected nonnegative integer.') + + @nsh_e.setter + def nsh_e(self, nsh_e): + if isinstance(nsh_e, int) and nsh_e > -1: + self.__nsh_e = nsh_e + else: + raise Exception('Invalid nsh_e value, expected nonnegative integer.') + + @nsphi.setter + def nsphi(self, nsphi): + if isinstance(nsphi, int) and nsphi > -1: + self.__nsphi = nsphi + else: + raise Exception('Invalid nsphi value, expected nonnegative integer.') + + @nsphi_e.setter + def nsphi_e(self, nsphi_e): + if isinstance(nsphi_e, int) and nsphi_e > -1: + self.__nsphi_e = nsphi_e + else: + raise Exception('Invalid nsphi_e value, expected nonnegative integer.') + + @ns.setter + def ns(self, ns): + if isinstance(ns, int) and ns > -1: + self.__ns = ns + else: + raise Exception('Invalid ns value, expected nonnegative integer.') + + @ns_e.setter + def ns_e(self, ns_e): + if isinstance(ns_e, int) and ns_e > -1: + self.__ns_e = ns_e + else: + raise Exception('Invalid ns_e value, expected nonnegative integer.') + + @ng.setter + def ng(self, ng): + if isinstance(ng, int) and ng > -1: + self.__ng = ng + else: + raise Exception('Invalid ng value, expected nonnegative integer.') + + @ng_e.setter + def ng_e(self, ng_e): + if isinstance(ng_e, int) and ng_e > -1: + self.__ng_e = ng_e + else: + raise Exception('Invalid ng_e value, expected nonnegative integer.') + + @N.setter + def N(self, N): + if isinstance(N, int) and N > 0: + self.__N = N + else: + raise Exception('Invalid N value, expected positive integer.') + + def set(self, attr, value): + setattr(self, attr, value) + + +class AcadosOcpCost: + """ + Class containing the numerical data of the cost: + + NOTE: all cost terms, except for the terminal one are weighted with the corresponding time step. + This means given the time steps are :math:`\Delta t_0,..., \Delta t_N`, the total cost is given by: + :math:`c_\\text{total} = \Delta t_0 \cdot c_0(x_0, u_0, p_0, z_0) + ... + \Delta t_{N-1} \cdot c_{N-1}(x_0, u_0, p_0, z_0) + c_N(x_N, p_N)`. + + This means the Lagrange cost term is given in continuous time, this makes up for a seeminglessly OCP discretization with a nonuniform time grid. + + In case of LINEAR_LS: + stage cost is + :math:`l(x,u,z) = || V_x \, x + V_u \, u + V_z \, z - y_\\text{ref}||^2_W`, + terminal cost is + :math:`m(x) = || V^e_x \, x - y_\\text{ref}^e||^2_{W^e}` + + In case of NONLINEAR_LS: + stage cost is + :math:`l(x,u,z,p) = || y(x,u,z,p) - y_\\text{ref}||^2_W`, + terminal cost is + :math:`m(x,p) = || y^e(x,p) - y_\\text{ref}^e||^2_{W^e}` + + In case of CONVEX_OVER_NONLINEAR: + stage cost is + :math:`l(x,u,p) = \psi(y(x,u,p) - y_\\text{ref}, p)`, + terminal cost is + :math:`m(x, p) = \psi^e (y^e(x,p) - y_\\text{ref}^e, p)` + """ + def __init__(self): + # initial stage + self.__cost_type_0 = None + self.__W_0 = None + self.__Vx_0 = None + self.__Vu_0 = None + self.__Vz_0 = None + self.__yref_0 = None + self.__cost_ext_fun_type_0 = 'casadi' + # Lagrange term + self.__cost_type = 'LINEAR_LS' # cost type + self.__W = np.zeros((0,0)) + self.__Vx = np.zeros((0,0)) + self.__Vu = np.zeros((0,0)) + self.__Vz = np.zeros((0,0)) + self.__yref = np.array([]) + self.__Zl = np.array([]) + self.__Zu = np.array([]) + self.__zl = np.array([]) + self.__zu = np.array([]) + self.__cost_ext_fun_type = 'casadi' + # Mayer term + self.__cost_type_e = 'LINEAR_LS' + self.__W_e = np.zeros((0,0)) + self.__Vx_e = np.zeros((0,0)) + self.__yref_e = np.array([]) + self.__Zl_e = np.array([]) + self.__Zu_e = np.array([]) + self.__zl_e = np.array([]) + self.__zu_e = np.array([]) + self.__cost_ext_fun_type_e = 'casadi' + + # initial stage + @property + def cost_type_0(self): + """Cost type at initial shooting node (0) + -- string in {EXTERNAL, LINEAR_LS, NONLINEAR_LS, CONVEX_OVER_NONLINEAR} or :code:`None`. + Default: :code:`None`. + + .. note:: Cost at initial stage is the same as for intermediate shooting nodes if not set differently explicitly. + + .. note:: If :py:attr:`cost_type_0` is set to :code:`None` values in :py:attr:`W_0`, :py:attr:`Vx_0`, :py:attr:`Vu_0`, :py:attr:`Vz_0` and :py:attr:`yref_0` are ignored (set to :code:`None`). + """ + return self.__cost_type_0 + + @property + def W_0(self): + """:math:`W_0` - weight matrix at initial shooting node (0). + Default: :code:`None`. + """ + return self.__W_0 + + @property + def Vx_0(self): + """:math:`V_x^0` - x matrix coefficient at initial shooting node (0). + Default: :code:`None`. + """ + return self.__Vx_0 + + @property + def Vu_0(self): + """:math:`V_u^0` - u matrix coefficient at initial shooting node (0). + Default: :code:`None`. + """ + return self.__Vu_0 + + @property + def Vz_0(self): + """:math:`V_z^0` - z matrix coefficient at initial shooting node (0). + Default: :code:`None`. + """ + return self.__Vz_0 + + @property + def yref_0(self): + """:math:`y_\\text{ref}^0` - reference at initial shooting node (0). + Default: :code:`None`. + """ + return self.__yref_0 + + @property + def cost_ext_fun_type_0(self): + """Type of external function for cost at initial shooting node (0) + -- string in {casadi, generic} or :code:`None` + Default: :code:'casadi'. + + .. note:: Cost at initial stage is the same as for intermediate shooting nodes if not set differently explicitly. + """ + return self.__cost_ext_fun_type_0 + + @yref_0.setter + def yref_0(self, yref_0): + if isinstance(yref_0, np.ndarray) and len(yref_0.shape) == 1: + self.__yref_0 = yref_0 + else: + raise Exception('Invalid yref_0 value, expected 1-dimensional numpy array.') + + @W_0.setter + def W_0(self, W_0): + if isinstance(W_0, np.ndarray) and len(W_0.shape) == 2: + self.__W_0 = W_0 + else: + raise Exception('Invalid cost W_0 value. ' \ + + 'Should be 2 dimensional numpy array.') + + @Vx_0.setter + def Vx_0(self, Vx_0): + if isinstance(Vx_0, np.ndarray) and len(Vx_0.shape) == 2: + self.__Vx_0 = Vx_0 + else: + raise Exception('Invalid cost Vx_0 value. ' \ + + 'Should be 2 dimensional numpy array.') + + @Vu_0.setter + def Vu_0(self, Vu_0): + if isinstance(Vu_0, np.ndarray) and len(Vu_0.shape) == 2: + self.__Vu_0 = Vu_0 + else: + raise Exception('Invalid cost Vu_0 value. ' \ + + 'Should be 2 dimensional numpy array.') + + @Vz_0.setter + def Vz_0(self, Vz_0): + if isinstance(Vz_0, np.ndarray) and len(Vz_0.shape) == 2: + self.__Vz_0 = Vz_0 + else: + raise Exception('Invalid cost Vz_0 value. ' \ + + 'Should be 2 dimensional numpy array.') + + @cost_ext_fun_type_0.setter + def cost_ext_fun_type_0(self, cost_ext_fun_type_0): + if cost_ext_fun_type_0 in ['casadi', 'generic']: + self.__cost_ext_fun_type_0 = cost_ext_fun_type_0 + else: + raise Exception('Invalid cost_ext_fun_type_0 value, expected numpy array.') + + # Lagrange term + @property + def cost_type(self): + """ + Cost type at intermediate shooting nodes (1 to N-1) + -- string in {EXTERNAL, LINEAR_LS, NONLINEAR_LS, CONVEX_OVER_NONLINEAR}. + Default: 'LINEAR_LS'. + """ + return self.__cost_type + + @property + def W(self): + """:math:`W` - weight matrix at intermediate shooting nodes (1 to N-1). + Default: :code:`np.zeros((0,0))`. + """ + return self.__W + + @property + def Vx(self): + """:math:`V_x` - x matrix coefficient at intermediate shooting nodes (1 to N-1). + Default: :code:`np.zeros((0,0))`. + """ + return self.__Vx + + @property + def Vu(self): + """:math:`V_u` - u matrix coefficient at intermediate shooting nodes (1 to N-1). + Default: :code:`np.zeros((0,0))`. + """ + return self.__Vu + + @property + def Vz(self): + """:math:`V_z` - z matrix coefficient at intermediate shooting nodes (1 to N-1). + Default: :code:`np.zeros((0,0))`. + """ + return self.__Vz + + @property + def yref(self): + """:math:`y_\\text{ref}` - reference at intermediate shooting nodes (1 to N-1). + Default: :code:`np.array([])`. + """ + return self.__yref + + @property + def Zl(self): + """:math:`Z_l` - diagonal of Hessian wrt lower slack at intermediate shooting nodes (0 to N-1). + Default: :code:`np.array([])`. + """ + return self.__Zl + + @property + def Zu(self): + """:math:`Z_u` - diagonal of Hessian wrt upper slack at intermediate shooting nodes (0 to N-1). + Default: :code:`np.array([])`. + """ + return self.__Zu + + @property + def zl(self): + """:math:`z_l` - gradient wrt lower slack at intermediate shooting nodes (0 to N-1). + Default: :code:`np.array([])`. + """ + return self.__zl + + @property + def zu(self): + """:math:`z_u` - gradient wrt upper slack at intermediate shooting nodes (0 to N-1). + Default: :code:`np.array([])`. + """ + return self.__zu + + @property + def cost_ext_fun_type(self): + """Type of external function for cost at intermediate shooting nodes (1 to N-1). + -- string in {casadi, generic} + Default: :code:'casadi'. + """ + return self.__cost_ext_fun_type + + @cost_type.setter + def cost_type(self, cost_type): + cost_types = ('LINEAR_LS', 'NONLINEAR_LS', 'EXTERNAL', 'CONVEX_OVER_NONLINEAR') + if cost_type in cost_types: + self.__cost_type = cost_type + else: + raise Exception('Invalid cost_type value.') + + @cost_type_0.setter + def cost_type_0(self, cost_type_0): + cost_types = ('LINEAR_LS', 'NONLINEAR_LS', 'EXTERNAL', 'CONVEX_OVER_NONLINEAR') + if cost_type_0 in cost_types: + self.__cost_type_0 = cost_type_0 + else: + raise Exception('Invalid cost_type_0 value.') + + @W.setter + def W(self, W): + if isinstance(W, np.ndarray) and len(W.shape) == 2: + self.__W = W + else: + raise Exception('Invalid cost W value. ' \ + + 'Should be 2 dimensional numpy array.') + + + @Vx.setter + def Vx(self, Vx): + if isinstance(Vx, np.ndarray) and len(Vx.shape) == 2: + self.__Vx = Vx + else: + raise Exception('Invalid cost Vx value. ' \ + + 'Should be 2 dimensional numpy array.') + + @Vu.setter + def Vu(self, Vu): + if isinstance(Vu, np.ndarray) and len(Vu.shape) == 2: + self.__Vu = Vu + else: + raise Exception('Invalid cost Vu value. ' \ + + 'Should be 2 dimensional numpy array.') + + @Vz.setter + def Vz(self, Vz): + if isinstance(Vz, np.ndarray) and len(Vz.shape) == 2: + self.__Vz = Vz + else: + raise Exception('Invalid cost Vz value. ' \ + + 'Should be 2 dimensional numpy array.') + + @yref.setter + def yref(self, yref): + if isinstance(yref, np.ndarray) and len(yref.shape) == 1: + self.__yref = yref + else: + raise Exception('Invalid yref value, expected 1-dimensional numpy array.') + + @Zl.setter + def Zl(self, Zl): + if isinstance(Zl, np.ndarray): + self.__Zl = Zl + else: + raise Exception('Invalid Zl value, expected numpy array.') + + @Zu.setter + def Zu(self, Zu): + if isinstance(Zu, np.ndarray): + self.__Zu = Zu + else: + raise Exception('Invalid Zu value, expected numpy array.') + + @zl.setter + def zl(self, zl): + if isinstance(zl, np.ndarray): + self.__zl = zl + else: + raise Exception('Invalid zl value, expected numpy array.') + + @zu.setter + def zu(self, zu): + if isinstance(zu, np.ndarray): + self.__zu = zu + else: + raise Exception('Invalid zu value, expected numpy array.') + + @cost_ext_fun_type.setter + def cost_ext_fun_type(self, cost_ext_fun_type): + if cost_ext_fun_type in ['casadi', 'generic']: + self.__cost_ext_fun_type = cost_ext_fun_type + else: + raise Exception("Invalid cost_ext_fun_type value, expected one in ['casadi', 'generic'].") + + # Mayer term + @property + def cost_type_e(self): + """ + Cost type at terminal shooting node (N) + -- string in {EXTERNAL, LINEAR_LS, NONLINEAR_LS, CONVEX_OVER_NONLINEAR}. + Default: 'LINEAR_LS'. + """ + return self.__cost_type_e + + @property + def W_e(self): + """:math:`W_e` - weight matrix at terminal shooting node (N). + Default: :code:`np.zeros((0,0))`. + """ + return self.__W_e + + @property + def Vx_e(self): + """:math:`V_x^e` - x matrix coefficient for cost at terminal shooting node (N). + Default: :code:`np.zeros((0,0))`. + """ + return self.__Vx_e + + @property + def yref_e(self): + """:math:`y_\\text{ref}^e` - cost reference at terminal shooting node (N). + Default: :code:`np.array([])`. + """ + return self.__yref_e + + @property + def Zl_e(self): + """:math:`Z_l^e` - diagonal of Hessian wrt lower slack at terminal shooting node (N). + Default: :code:`np.array([])`. + """ + return self.__Zl_e + + @property + def Zu_e(self): + """:math:`Z_u^e` - diagonal of Hessian wrt upper slack at terminal shooting node (N). + Default: :code:`np.array([])`. + """ + return self.__Zu_e + + @property + def zl_e(self): + """:math:`z_l^e` - gradient wrt lower slack at terminal shooting node (N). + Default: :code:`np.array([])`. + """ + return self.__zl_e + + @property + def zu_e(self): + """:math:`z_u^e` - gradient wrt upper slack at terminal shooting node (N). + Default: :code:`np.array([])`. + """ + return self.__zu_e + + @property + def cost_ext_fun_type_e(self): + """Type of external function for cost at terminal shooting node (N). + -- string in {casadi, generic} + Default: :code:'casadi'. + """ + return self.__cost_ext_fun_type_e + + @cost_type_e.setter + def cost_type_e(self, cost_type_e): + cost_types = ('LINEAR_LS', 'NONLINEAR_LS', 'EXTERNAL', 'CONVEX_OVER_NONLINEAR') + + if cost_type_e in cost_types: + self.__cost_type_e = cost_type_e + else: + raise Exception('Invalid cost_type_e value.') + + @W_e.setter + def W_e(self, W_e): + if isinstance(W_e, np.ndarray) and len(W_e.shape) == 2: + self.__W_e = W_e + else: + raise Exception('Invalid cost W_e value. ' \ + + 'Should be 2 dimensional numpy array.') + + @Vx_e.setter + def Vx_e(self, Vx_e): + if isinstance(Vx_e, np.ndarray) and len(Vx_e.shape) == 2: + self.__Vx_e = Vx_e + else: + raise Exception('Invalid cost Vx_e value. ' \ + + 'Should be 2 dimensional numpy array.') + + @yref_e.setter + def yref_e(self, yref_e): + if isinstance(yref_e, np.ndarray) and len(yref_e.shape) == 1: + self.__yref_e = yref_e + else: + raise Exception('Invalid yref_e value, expected 1-dimensional numpy array.') + + @Zl_e.setter + def Zl_e(self, Zl_e): + if isinstance(Zl_e, np.ndarray): + self.__Zl_e = Zl_e + else: + raise Exception('Invalid Zl_e value, expected numpy array.') + + @Zu_e.setter + def Zu_e(self, Zu_e): + if isinstance(Zu_e, np.ndarray): + self.__Zu_e = Zu_e + else: + raise Exception('Invalid Zu_e value, expected numpy array.') + + @zl_e.setter + def zl_e(self, zl_e): + if isinstance(zl_e, np.ndarray): + self.__zl_e = zl_e + else: + raise Exception('Invalid zl_e value, expected numpy array.') + + @zu_e.setter + def zu_e(self, zu_e): + if isinstance(zu_e, np.ndarray): + self.__zu_e = zu_e + else: + raise Exception('Invalid zu_e value, expected numpy array.') + + @cost_ext_fun_type_e.setter + def cost_ext_fun_type_e(self, cost_ext_fun_type_e): + if cost_ext_fun_type_e in ['casadi', 'generic']: + self.__cost_ext_fun_type_e = cost_ext_fun_type_e + else: + raise Exception("Invalid cost_ext_fun_type_e value, expected one in ['casadi', 'generic'].") + + def set(self, attr, value): + setattr(self, attr, value) + + +def print_J_to_idx_note(): + print("NOTE: J* matrix is converted to zero based vector idx* vector, which is returned here.") + + +class AcadosOcpConstraints: + """ + class containing the description of the constraints + """ + def __init__(self): + self.__constr_type = 'BGH' + self.__constr_type_e = 'BGH' + # initial x + self.__lbx_0 = np.array([]) + self.__ubx_0 = np.array([]) + self.__idxbx_0 = np.array([]) + self.__idxbxe_0 = np.array([]) + # state bounds + self.__lbx = np.array([]) + self.__ubx = np.array([]) + self.__idxbx = np.array([]) + # bounds on x at shooting node N + self.__lbx_e = np.array([]) + self.__ubx_e = np.array([]) + self.__idxbx_e = np.array([]) + # bounds on u + self.__lbu = np.array([]) + self.__ubu = np.array([]) + self.__idxbu = np.array([]) + # polytopic constraints + self.__lg = np.array([]) + self.__ug = np.array([]) + self.__D = np.zeros((0,0)) + self.__C = np.zeros((0,0)) + # polytopic constraints at shooting node N + self.__C_e = np.zeros((0,0)) + self.__lg_e = np.array([]) + self.__ug_e = np.array([]) + # nonlinear constraints + self.__lh = np.array([]) + self.__uh = np.array([]) + # nonlinear constraints at shooting node N + self.__uh_e = np.array([]) + self.__lh_e = np.array([]) + # convex-over-nonlinear constraints + self.__lphi = np.array([]) + self.__uphi = np.array([]) + # nonlinear constraints at shooting node N + self.__uphi_e = np.array([]) + self.__lphi_e = np.array([]) + # SLACK BOUNDS + # soft bounds on x + self.__lsbx = np.array([]) + self.__usbx = np.array([]) + self.__idxsbx = np.array([]) + # soft bounds on u + self.__lsbu = np.array([]) + self.__usbu = np.array([]) + self.__idxsbu = np.array([]) + # soft bounds on x at shooting node N + self.__lsbx_e = np.array([]) + self.__usbx_e = np.array([]) + self.__idxsbx_e= np.array([]) + # soft bounds on general linear constraints + self.__lsg = np.array([]) + self.__usg = np.array([]) + self.__idxsg = np.array([]) + # soft bounds on nonlinear constraints + self.__lsh = np.array([]) + self.__ush = np.array([]) + self.__idxsh = np.array([]) + # soft bounds on nonlinear constraints + self.__lsphi = np.array([]) + self.__usphi = np.array([]) + self.__idxsphi = np.array([]) + # soft bounds on general linear constraints at shooting node N + self.__lsg_e = np.array([]) + self.__usg_e = np.array([]) + self.__idxsg_e = np.array([]) + # soft bounds on nonlinear constraints at shooting node N + self.__lsh_e = np.array([]) + self.__ush_e = np.array([]) + self.__idxsh_e = np.array([]) + # soft bounds on nonlinear constraints at shooting node N + self.__lsphi_e = np.array([]) + self.__usphi_e = np.array([]) + self.__idxsphi_e = np.array([]) + + + # types + @property + def constr_type(self): + """Constraints type for shooting nodes (0 to N-1). string in {BGH, BGP}. + Default: BGH; BGP is for convex over nonlinear.""" + return self.__constr_type + + @property + def constr_type_e(self): + """Constraints type for terminal shooting node N. string in {BGH, BGP}. + Default: BGH; BGP is for convex over nonlinear.""" + return self.__constr_type_e + + # initial bounds on x + @property + def lbx_0(self): + """:math:`\\underline{x_0}` - lower bounds on x at initial stage 0. + Type: :code:`np.ndarray`; default: :code:`np.array([])`.""" + return self.__lbx_0 + + @property + def ubx_0(self): + """:math:`\\bar{x_0}` - upper bounds on x at initial stage 0. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__ubx_0 + + @property + def Jbx_0(self): + """:math:`J_{bx,0}` - matrix coefficient for bounds on x at initial stage 0. + Translated internally to :py:attr:`idxbx_0`""" + print_J_to_idx_note() + return self.__idxbx_0 + + @property + def idxbx_0(self): + """Indices of bounds on x at initial stage 0 + -- can be set automatically via x0. + Can be set by using :py:attr:`Jbx_0`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxbx_0 + + @property + def idxbxe_0(self): + """Indices of bounds on x0 that are equalities -- can be set automatically via :py:attr:`x0`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxbxe_0 + + # bounds on x + @property + def lbx(self): + """:math:`\\underline{x}` - lower bounds on x at intermediate shooting nodes (1 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__lbx + + @property + def ubx(self): + """:math:`\\bar{x}` - upper bounds on x at intermediate shooting nodes (1 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__ubx + + @property + def idxbx(self): + """indices of bounds on x (defines :math:`J_{bx}`) at intermediate shooting nodes (1 to N-1). + Can be set by using :py:attr:`Jbx`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxbx + + @property + def Jbx(self): + """:math:`J_{bx}` - matrix coefficient for bounds on x + at intermediate shooting nodes (1 to N-1). + Translated internally into :py:attr:`idxbx`.""" + print_J_to_idx_note() + return self.__idxbx + + # bounds on x at shooting node N + @property + def lbx_e(self): + """:math:`\\underline{x}^e` - lower bounds on x at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__lbx_e + + @property + def ubx_e(self): + """:math:`\\bar{x}^e` - upper bounds on x at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__ubx_e + + @property + def idxbx_e(self): + """Indices for bounds on x at terminal shooting node N (defines :math:`J_{bx}^e`). + Can be set by using :py:attr:`Jbx_e`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxbx_e + + @property + def Jbx_e(self): + """:math:`J_{bx}^e` matrix coefficient for bounds on x at terminal shooting node N. + Translated internally into :py:attr:`idxbx_e`.""" + print_J_to_idx_note() + return self.__idxbx_e + + # bounds on u + @property + def lbu(self): + """:math:`\\underline{u}` - lower bounds on u at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])` + """ + return self.__lbu + + @property + def ubu(self): + """:math:`\\bar{u}` - upper bounds on u at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])` + """ + return self.__ubu + + @property + def idxbu(self): + """Indices of bounds on u (defines :math:`J_{bu}`) at shooting nodes (0 to N-1). + Can be set by using :py:attr:`Jbu`. + Type: :code:`np.ndarray`; default: :code:`np.array([])` + """ + return self.__idxbu + + @property + def Jbu(self): + """:math:`J_{bu}` - matrix coefficient for bounds on u at shooting nodes (0 to N-1). + Translated internally to :py:attr:`idxbu`. + """ + print_J_to_idx_note() + return self.__idxbu + + # polytopic constraints + @property + def C(self): + """:math:`C` - C matrix in :math:`\\underline{g} \\leq D \, u + C \, x \\leq \\bar{g}` + at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array((0,0))`. + """ + return self.__C + + @property + def D(self): + """:math:`D` - D matrix in :math:`\\underline{g} \\leq D \, u + C \, x \\leq \\bar{g}` + at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array((0,0))` + """ + return self.__D + + @property + def lg(self): + """:math:`\\underline{g}` - lower bound for general polytopic inequalities + at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])` + """ + return self.__lg + + @property + def ug(self): + """:math:`\\bar{g}` - upper bound for general polytopic inequalities + at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__ug + + # polytopic constraints at shooting node N + @property + def C_e(self): + """:math:`C^e` - C matrix at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array((0,0))`. + """ + return self.__C_e + + @property + def lg_e(self): + """:math:`\\underline{g}^e` - lower bound on general polytopic inequalities + at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__lg_e + + @property + def ug_e(self): + """:math:`\\bar{g}^e` - upper bound on general polytopic inequalities + at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__ug_e + + + # nonlinear constraints + @property + def lh(self): + """:math:`\\underline{h}` - lower bound for nonlinear inequalities + at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__lh + + @property + def uh(self): + """:math:`\\bar{h}` - upper bound for nonlinear inequalities + at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__uh + + # nonlinear constraints at shooting node N + @property + def lh_e(self): + """:math:`\\underline{h}^e` - lower bound on nonlinear inequalities + at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__lh_e + + @property + def uh_e(self): + """:math:`\\bar{h}^e` - upper bound on nonlinear inequalities + at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__uh_e + + # convex-over-nonlinear constraints + @property + def lphi(self): + """:math:`\\underline{\phi}` - lower bound for convex-over-nonlinear inequalities + at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__lphi + + @property + def uphi(self): + """:math:`\\bar{\phi}` - upper bound for convex-over-nonlinear inequalities + at shooting nodes (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__uphi + + # convex-over-nonlinear constraints at shooting node N + @property + def lphi_e(self): + """:math:`\\underline{\phi}^e` - lower bound on convex-over-nonlinear inequalities + at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__lphi_e + + @property + def uphi_e(self): + """:math:`\\bar{\phi}^e` - upper bound on convex-over-nonlinear inequalities + at terminal shooting node N. + Type: :code:`np.ndarray`; default: :code:`np.array([])`. + """ + return self.__uphi_e + + + # SLACK bounds + # soft bounds on x + @property + def lsbx(self): + """Lower bounds on slacks corresponding to soft lower bounds on x + at stages (1 to N-1); + not required - zeros by default""" + return self.__lsbx + + @property + def usbx(self): + """Lower bounds on slacks corresponding to soft upper bounds on x + at stages (1 to N-1); + not required - zeros by default""" + return self.__usbx + + @property + def idxsbx(self): + """Indices of soft bounds on x within the indices of bounds on x + at stages (1 to N-1). + Can be set by using :py:attr:`Jsbx`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxsbx + + @property + def Jsbx(self): + """:math:`J_{sbx}` - matrix coefficient for soft bounds on x + at stages (1 to N-1); + Translated internally into :py:attr:`idxsbx`.""" + print_J_to_idx_note() + return self.__idxsbx + + # soft bounds on u + @property + def lsbu(self): + """Lower bounds on slacks corresponding to soft lower bounds on u + at stages (0 to N-1). + Not required - zeros by default.""" + return self.__lsbu + + @property + def usbu(self): + """Lower bounds on slacks corresponding to soft upper bounds on u + at stages (0 to N-1); + not required - zeros by default""" + return self.__usbu + + @property + def idxsbu(self): + """Indices of soft bounds on u within the indices of bounds on u + at stages (0 to N-1). + Can be set by using :py:attr:`Jsbu`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxsbu + + @property + def Jsbu(self): + """:math:`J_{sbu}` - matrix coefficient for soft bounds on u + at stages (0 to N-1); + internally translated into :py:attr:`idxsbu`""" + print_J_to_idx_note() + return self.__idxsbu + + # soft bounds on x at shooting node N + @property + def lsbx_e(self): + """Lower bounds on slacks corresponding to soft lower bounds on x at shooting node N. + Not required - zeros by default""" + return self.__lsbx_e + + @property + def usbx_e(self): + """Lower bounds on slacks corresponding to soft upper bounds on x at shooting node N. + Not required - zeros by default""" + return self.__usbx_e + + @property + def idxsbx_e(self): + """Indices of soft bounds on x at shooting node N, within the indices of bounds on x at terminal shooting node N. + Can be set by using :py:attr:`Jsbx_e`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxsbx_e + + @property + def Jsbx_e(self): + """:math:`J_{sbx}^e` - matrix coefficient for soft bounds on x at terminal shooting node N. + Translated internally to :py:attr:`idxsbx_e`""" + print_J_to_idx_note() + return self.__idxsbx_e + + # soft general linear constraints + @property + def lsg(self): + """Lower bounds on slacks corresponding to soft lower bounds for general linear constraints + at stages (0 to N-1). + Type: :code:`np.ndarray`; default: :code:`np.array([])` + """ + return self.__lsg + + @property + def usg(self): + """Lower bounds on slacks corresponding to soft upper bounds for general linear constraints. + Not required - zeros by default""" + return self.__usg + + @property + def idxsg(self): + """Indices of soft general linear constraints within the indices of general linear constraints. + Can be set by using :py:attr:`Jsg`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxsg + + @property + def Jsg(self): + """:math:`J_{sg}` - matrix coefficient for soft bounds on general linear constraints. + Translated internally to :py:attr:`idxsg`""" + print_J_to_idx_note() + return self.__idxsg + + # soft nonlinear constraints + @property + def lsh(self): + """Lower bounds on slacks corresponding to soft lower bounds for nonlinear constraints. + Not required - zeros by default""" + return self.__lsh + + @property + def ush(self): + """Lower bounds on slacks corresponding to soft upper bounds for nonlinear constraints. + Not required - zeros by default""" + return self.__ush + + @property + def idxsh(self): + """Indices of soft nonlinear constraints within the indices of nonlinear constraints. + Can be set by using :py:attr:`Jbx`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxsh + + @property + def Jsh(self): + """:math:`J_{sh}` - matrix coefficient for soft bounds on nonlinear constraints. + Translated internally to :py:attr:`idxsh`""" + print_J_to_idx_note() + return self.__idxsh + + # soft bounds on convex-over-nonlinear constraints + @property + def lsphi(self): + """Lower bounds on slacks corresponding to soft lower bounds for convex-over-nonlinear constraints. + Not required - zeros by default""" + return self.__lsphi + + @property + def usphi(self): + """Lower bounds on slacks corresponding to soft upper bounds for convex-over-nonlinear constraints. + Not required - zeros by default""" + return self.__usphi + + @property + def idxsphi(self): + """Indices of soft convex-over-nonlinear constraints within the indices of nonlinear constraints. + Can be set by using :py:attr:`Jsphi`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxsphi + + @property + def Jsphi(self): + """:math:`J_{s, \phi}` - matrix coefficient for soft bounds on convex-over-nonlinear constraints. + Translated internally into :py:attr:`idxsphi`.""" + print_J_to_idx_note() + return self.__idxsphi + + + # soft bounds on general linear constraints at shooting node N + @property + def lsg_e(self): + """Lower bounds on slacks corresponding to soft lower bounds for general linear constraints at shooting node N. + Not required - zeros by default""" + return self.__lsg_e + + @property + def usg_e(self): + """Lower bounds on slacks corresponding to soft upper bounds for general linear constraints at shooting node N. + Not required - zeros by default""" + return self.__usg_e + + @property + def idxsg_e(self): + """Indices of soft general linear constraints at shooting node N within the indices of general linear constraints at shooting node N. + Can be set by using :py:attr:`Jsg_e`.""" + return self.__idxsg_e + + @property + def Jsg_e(self): + """:math:`J_{s,h}^e` - matrix coefficient for soft bounds on general linear constraints at terminal shooting node N. + Translated internally to :py:attr:`idxsg_e`""" + print_J_to_idx_note() + return self.__idxsg_e + + + # soft bounds on nonlinear constraints at shooting node N + @property + def lsh_e(self): + """Lower bounds on slacks corresponding to soft lower bounds for nonlinear constraints at terminal shooting node N. + Not required - zeros by default""" + return self.__lsh_e + + @property + def ush_e(self): + """Lower bounds on slacks corresponding to soft upper bounds for nonlinear constraints at terminal shooting node N. + Not required - zeros by default""" + return self.__ush_e + + @property + def idxsh_e(self): + """Indices of soft nonlinear constraints at shooting node N within the indices of nonlinear constraints at terminal shooting node N. + Can be set by using :py:attr:`Jsh_e`.""" + return self.__idxsh_e + + @property + def Jsh_e(self): + """:math:`J_{s,h}^e` - matrix coefficient for soft bounds on nonlinear constraints at terminal shooting node N; fills :py:attr:`idxsh_e`""" + print_J_to_idx_note() + return self.__idxsh_e + + # soft bounds on convex-over-nonlinear constraints at shooting node N + @property + def lsphi_e(self): + """Lower bounds on slacks corresponding to soft lower bounds for convex-over-nonlinear constraints at terminal shooting node N. + Not required - zeros by default""" + return self.__lsphi_e + + @property + def usphi_e(self): + """Lower bounds on slacks corresponding to soft upper bounds for convex-over-nonlinear constraints at terminal shooting node N. + Not required - zeros by default""" + return self.__usphi_e + + @property + def idxsphi_e(self): + """Indices of soft nonlinear constraints at shooting node N within the indices of nonlinear constraints at terminal shooting node N. + Can be set by using :py:attr:`Jsphi_e`. + Type: :code:`np.ndarray`; default: :code:`np.array([])`""" + return self.__idxsphi_e + + @property + def Jsphi_e(self): + """:math:`J_{sh}^e` - matrix coefficient for soft bounds on convex-over-nonlinear constraints at shooting node N. + Translated internally to :py:attr:`idxsphi_e`""" + print_J_to_idx_note() + return self.__idxsphi_e + + @property + def x0(self): + """:math:`x_0 \\in \mathbb{R}^{n_x}` - initial state -- + Translated internally to :py:attr:`idxbx_0`, :py:attr:`lbx_0`, :py:attr:`ubx_0`, :py:attr:`idxbxe_0` """ + print("x0 is converted to lbx_0, ubx_0, idxbx_0") + print("idxbx_0: ", self.__idxbx_0) + print("lbx_0: ", self.__lbx_0) + print("ubx_0: ", self.__ubx_0) + print("idxbxe_0: ", self.__idxbxe_0) + return None + + # SETTERS + @constr_type.setter + def constr_type(self, constr_type): + constr_types = ('BGH', 'BGP') + if constr_type in constr_types: + self.__constr_type = constr_type + else: + raise Exception('Invalid constr_type value. Possible values are:\n\n' \ + + ',\n'.join(constr_types) + '.\n\nYou have: ' + constr_type + '.\n\n') + + @constr_type_e.setter + def constr_type_e(self, constr_type_e): + constr_types = ('BGH', 'BGP') + if constr_type_e in constr_types: + self.__constr_type_e = constr_type_e + else: + raise Exception('Invalid constr_type_e value. Possible values are:\n\n' \ + + ',\n'.join(constr_types) + '.\n\nYou have: ' + constr_type_e + '.\n\n') + + # initial x + @lbx_0.setter + def lbx_0(self, lbx_0): + if isinstance(lbx_0, np.ndarray): + self.__lbx_0 = lbx_0 + else: + raise Exception('Invalid lbx_0 value.') + + @ubx_0.setter + def ubx_0(self, ubx_0): + if isinstance(ubx_0, np.ndarray): + self.__ubx_0 = ubx_0 + else: + raise Exception('Invalid ubx_0 value.') + + @idxbx_0.setter + def idxbx_0(self, idxbx_0): + if isinstance(idxbx_0, np.ndarray): + self.__idxbx_0 = idxbx_0 + else: + raise Exception('Invalid idxbx_0 value.') + + @Jbx_0.setter + def Jbx_0(self, Jbx_0): + if isinstance(Jbx_0, np.ndarray): + self.__idxbx_0 = J_to_idx(Jbx_0) + else: + raise Exception('Invalid Jbx_0 value.') + + @idxbxe_0.setter + def idxbxe_0(self, idxbxe_0): + if isinstance(idxbxe_0, np.ndarray): + self.__idxbxe_0 = idxbxe_0 + else: + raise Exception('Invalid idxbxe_0 value.') + + + @x0.setter + def x0(self, x0): + if isinstance(x0, np.ndarray): + self.__lbx_0 = x0 + self.__ubx_0 = x0 + self.__idxbx_0 = np.arange(x0.size) + self.__idxbxe_0 = np.arange(x0.size) + else: + raise Exception('Invalid x0 value.') + + # bounds on x + @lbx.setter + def lbx(self, lbx): + if isinstance(lbx, np.ndarray): + self.__lbx = lbx + else: + raise Exception('Invalid lbx value.') + + @ubx.setter + def ubx(self, ubx): + if isinstance(ubx, np.ndarray): + self.__ubx = ubx + else: + raise Exception('Invalid ubx value.') + + @idxbx.setter + def idxbx(self, idxbx): + if isinstance(idxbx, np.ndarray): + self.__idxbx = idxbx + else: + raise Exception('Invalid idxbx value.') + + @Jbx.setter + def Jbx(self, Jbx): + if isinstance(Jbx, np.ndarray): + self.__idxbx = J_to_idx(Jbx) + else: + raise Exception('Invalid Jbx value.') + + # bounds on u + @lbu.setter + def lbu(self, lbu): + if isinstance(lbu, np.ndarray): + self.__lbu = lbu + else: + raise Exception('Invalid lbu value.') + + @ubu.setter + def ubu(self, ubu): + if isinstance(ubu, np.ndarray): + self.__ubu = ubu + else: + raise Exception('Invalid ubu value.') + + @idxbu.setter + def idxbu(self, idxbu): + if isinstance(idxbu, np.ndarray): + self.__idxbu = idxbu + else: + raise Exception('Invalid idxbu value.') + + @Jbu.setter + def Jbu(self, Jbu): + if isinstance(Jbu, np.ndarray): + self.__idxbu = J_to_idx(Jbu) + else: + raise Exception('Invalid Jbu value.') + + # bounds on x at shooting node N + @lbx_e.setter + def lbx_e(self, lbx_e): + if isinstance(lbx_e, np.ndarray): + self.__lbx_e = lbx_e + else: + raise Exception('Invalid lbx_e value.') + + @ubx_e.setter + def ubx_e(self, ubx_e): + if isinstance(ubx_e, np.ndarray): + self.__ubx_e = ubx_e + else: + raise Exception('Invalid ubx_e value.') + + @idxbx_e.setter + def idxbx_e(self, idxbx_e): + if isinstance(idxbx_e, np.ndarray): + self.__idxbx_e = idxbx_e + else: + raise Exception('Invalid idxbx_e value.') + + @Jbx_e.setter + def Jbx_e(self, Jbx_e): + if isinstance(Jbx_e, np.ndarray): + self.__idxbx_e = J_to_idx(Jbx_e) + else: + raise Exception('Invalid Jbx_e value.') + + # polytopic constraints + @D.setter + def D(self, D): + if isinstance(D, np.ndarray) and len(D.shape) == 2: + self.__D = D + else: + raise Exception('Invalid constraint D value.' \ + + 'Should be 2 dimensional numpy array.') + + @C.setter + def C(self, C): + if isinstance(C, np.ndarray) and len(C.shape) == 2: + self.__C = C + else: + raise Exception('Invalid constraint C value.' \ + + 'Should be 2 dimensional numpy array.') + + @lg.setter + def lg(self, lg): + if isinstance(lg, np.ndarray): + self.__lg = lg + else: + raise Exception('Invalid lg value.') + + @ug.setter + def ug(self, ug): + if isinstance(ug, np.ndarray): + self.__ug = ug + else: + raise Exception('Invalid ug value.') + + # polytopic constraints at shooting node N + @C_e.setter + def C_e(self, C_e): + if isinstance(C_e, np.ndarray) and len(C_e.shape) == 2: + self.__C_e = C_e + else: + raise Exception('Invalid constraint C_e value.' \ + + 'Should be 2 dimensional numpy array.') + + @lg_e.setter + def lg_e(self, lg_e): + if isinstance(lg_e, np.ndarray): + self.__lg_e = lg_e + else: + raise Exception('Invalid lg_e value.') + + @ug_e.setter + def ug_e(self, ug_e): + if isinstance(ug_e, np.ndarray): + self.__ug_e = ug_e + else: + raise Exception('Invalid ug_e value.') + + # nonlinear constraints + @lh.setter + def lh(self, lh): + if isinstance(lh, np.ndarray): + self.__lh = lh + else: + raise Exception('Invalid lh value.') + + @uh.setter + def uh(self, uh): + if isinstance(uh, np.ndarray): + self.__uh = uh + else: + raise Exception('Invalid uh value.') + + # convex-over-nonlinear constraints + @lphi.setter + def lphi(self, lphi): + if isinstance(lphi, np.ndarray): + self.__lphi = lphi + else: + raise Exception('Invalid lphi value.') + + @uphi.setter + def uphi(self, uphi): + if isinstance(uphi, np.ndarray): + self.__uphi = uphi + else: + raise Exception('Invalid uphi value.') + + # nonlinear constraints at shooting node N + @lh_e.setter + def lh_e(self, lh_e): + if isinstance(lh_e, np.ndarray): + self.__lh_e = lh_e + else: + raise Exception('Invalid lh_e value.') + + @uh_e.setter + def uh_e(self, uh_e): + if isinstance(uh_e, np.ndarray): + self.__uh_e = uh_e + else: + raise Exception('Invalid uh_e value.') + + # convex-over-nonlinear constraints at shooting node N + @lphi_e.setter + def lphi_e(self, lphi_e): + if isinstance(lphi_e, np.ndarray): + self.__lphi_e = lphi_e + else: + raise Exception('Invalid lphi_e value.') + + @uphi_e.setter + def uphi_e(self, uphi_e): + if isinstance(uphi_e, np.ndarray): + self.__uphi_e = uphi_e + else: + raise Exception('Invalid uphi_e value.') + + # SLACK bounds + # soft bounds on x + @lsbx.setter + def lsbx(self, lsbx): + if isinstance(lsbx, np.ndarray): + self.__lsbx = lsbx + else: + raise Exception('Invalid lsbx value.') + + @usbx.setter + def usbx(self, usbx): + if isinstance(usbx, np.ndarray): + self.__usbx = usbx + else: + raise Exception('Invalid usbx value.') + + @idxsbx.setter + def idxsbx(self, idxsbx): + if isinstance(idxsbx, np.ndarray): + self.__idxsbx = idxsbx + else: + raise Exception('Invalid idxsbx value.') + + @Jsbx.setter + def Jsbx(self, Jsbx): + if isinstance(Jsbx, np.ndarray): + self.__idxsbx = J_to_idx_slack(Jsbx) + else: + raise Exception('Invalid Jsbx value, expected numpy array.') + + # soft bounds on u + @lsbu.setter + def lsbu(self, lsbu): + if isinstance(lsbu, np.ndarray): + self.__lsbu = lsbu + else: + raise Exception('Invalid lsbu value.') + + @usbu.setter + def usbu(self, usbu): + if isinstance(usbu, np.ndarray): + self.__usbu = usbu + else: + raise Exception('Invalid usbu value.') + + @idxsbu.setter + def idxsbu(self, idxsbu): + if isinstance(idxsbu, np.ndarray): + self.__idxsbu = idxsbu + else: + raise Exception('Invalid idxsbu value.') + + @Jsbu.setter + def Jsbu(self, Jsbu): + if isinstance(Jsbu, np.ndarray): + self.__idxsbu = J_to_idx_slack(Jsbu) + else: + raise Exception('Invalid Jsbu value.') + + # soft bounds on x at shooting node N + @lsbx_e.setter + def lsbx_e(self, lsbx_e): + if isinstance(lsbx_e, np.ndarray): + self.__lsbx_e = lsbx_e + else: + raise Exception('Invalid lsbx_e value.') + + @usbx_e.setter + def usbx_e(self, usbx_e): + if isinstance(usbx_e, np.ndarray): + self.__usbx_e = usbx_e + else: + raise Exception('Invalid usbx_e value.') + + @idxsbx_e.setter + def idxsbx_e(self, idxsbx_e): + if isinstance(idxsbx_e, np.ndarray): + self.__idxsbx_e = idxsbx_e + else: + raise Exception('Invalid idxsbx_e value.') + + @Jsbx_e.setter + def Jsbx_e(self, Jsbx_e): + if isinstance(Jsbx_e, np.ndarray): + self.__idxsbx_e = J_to_idx_slack(Jsbx_e) + else: + raise Exception('Invalid Jsbx_e value.') + + + # soft bounds on general linear constraints + @lsg.setter + def lsg(self, lsg): + if isinstance(lsg, np.ndarray): + self.__lsg = lsg + else: + raise Exception('Invalid lsg value.') + + @usg.setter + def usg(self, usg): + if isinstance(usg, np.ndarray): + self.__usg = usg + else: + raise Exception('Invalid usg value.') + + @idxsg.setter + def idxsg(self, idxsg): + if isinstance(idxsg, np.ndarray): + self.__idxsg = idxsg + else: + raise Exception('Invalid idxsg value.') + + @Jsg.setter + def Jsg(self, Jsg): + if isinstance(Jsg, np.ndarray): + self.__idxsg = J_to_idx_slack(Jsg) + else: + raise Exception('Invalid Jsg value, expected numpy array.') + + + # soft bounds on nonlinear constraints + @lsh.setter + def lsh(self, lsh): + if isinstance(lsh, np.ndarray): + self.__lsh = lsh + else: + raise Exception('Invalid lsh value.') + + @ush.setter + def ush(self, ush): + if isinstance(ush, np.ndarray): + self.__ush = ush + else: + raise Exception('Invalid ush value.') + + @idxsh.setter + def idxsh(self, idxsh): + if isinstance(idxsh, np.ndarray): + self.__idxsh = idxsh + else: + raise Exception('Invalid idxsh value.') + + + @Jsh.setter + def Jsh(self, Jsh): + if isinstance(Jsh, np.ndarray): + self.__idxsh = J_to_idx_slack(Jsh) + else: + raise Exception('Invalid Jsh value, expected numpy array.') + + # soft bounds on convex-over-nonlinear constraints + @lsphi.setter + def lsphi(self, lsphi): + if isinstance(lsphi, np.ndarray): + self.__lsphi = lsphi + else: + raise Exception('Invalid lsphi value.') + + @usphi.setter + def usphi(self, usphi): + if isinstance(usphi, np.ndarray): + self.__usphi = usphi + else: + raise Exception('Invalid usphi value.') + + @idxsphi.setter + def idxsphi(self, idxsphi): + if isinstance(idxsphi, np.ndarray): + self.__idxsphi = idxsphi + else: + raise Exception('Invalid idxsphi value.') + + @Jsphi.setter + def Jsphi(self, Jsphi): + if isinstance(Jsphi, np.ndarray): + self.__idxsphi = J_to_idx_slack(Jsphi) + else: + raise Exception('Invalid Jsphi value, expected numpy array.') + + # soft bounds on general linear constraints at shooting node N + @lsg_e.setter + def lsg_e(self, lsg_e): + if isinstance(lsg_e, np.ndarray): + self.__lsg_e = lsg_e + else: + raise Exception('Invalid lsg_e value.') + + @usg_e.setter + def usg_e(self, usg_e): + if isinstance(usg_e, np.ndarray): + self.__usg_e = usg_e + else: + raise Exception('Invalid usg_e value.') + + @idxsg_e.setter + def idxsg_e(self, idxsg_e): + if isinstance(idxsg_e, np.ndarray): + self.__idxsg_e = idxsg_e + else: + raise Exception('Invalid idxsg_e value.') + + @Jsg_e.setter + def Jsg_e(self, Jsg_e): + if isinstance(Jsg_e, np.ndarray): + self.__idxsg_e = J_to_idx_slack(Jsg_e) + else: + raise Exception('Invalid Jsg_e value, expected numpy array.') + + # soft bounds on nonlinear constraints at shooting node N + @lsh_e.setter + def lsh_e(self, lsh_e): + if isinstance(lsh_e, np.ndarray): + self.__lsh_e = lsh_e + else: + raise Exception('Invalid lsh_e value.') + + @ush_e.setter + def ush_e(self, ush_e): + if isinstance(ush_e, np.ndarray): + self.__ush_e = ush_e + else: + raise Exception('Invalid ush_e value.') + + @idxsh_e.setter + def idxsh_e(self, idxsh_e): + if isinstance(idxsh_e, np.ndarray): + self.__idxsh_e = idxsh_e + else: + raise Exception('Invalid idxsh_e value.') + + @Jsh_e.setter + def Jsh_e(self, Jsh_e): + if isinstance(Jsh_e, np.ndarray): + self.__idxsh_e = J_to_idx_slack(Jsh_e) + else: + raise Exception('Invalid Jsh_e value, expected numpy array.') + + + # soft bounds on convex-over-nonlinear constraints at shooting node N + @lsphi_e.setter + def lsphi_e(self, lsphi_e): + if isinstance(lsphi_e, np.ndarray): + self.__lsphi_e = lsphi_e + else: + raise Exception('Invalid lsphi_e value.') + + @usphi_e.setter + def usphi_e(self, usphi_e): + if isinstance(usphi_e, np.ndarray): + self.__usphi_e = usphi_e + else: + raise Exception('Invalid usphi_e value.') + + @idxsphi_e.setter + def idxsphi_e(self, idxsphi_e): + if isinstance(idxsphi_e, np.ndarray): + self.__idxsphi_e = idxsphi_e + else: + raise Exception('Invalid idxsphi_e value.') + + @Jsphi_e.setter + def Jsphi_e(self, Jsphi_e): + if isinstance(Jsphi_e, np.ndarray): + self.__idxsphi_e = J_to_idx_slack(Jsphi_e) + else: + raise Exception('Invalid Jsphi_e value.') + + def set(self, attr, value): + setattr(self, attr, value) + + +class AcadosOcpOptions: + """ + class containing the description of the solver options + """ + def __init__(self): + self.__qp_solver = 'PARTIAL_CONDENSING_HPIPM' # qp solver to be used in the NLP solver + self.__hessian_approx = 'GAUSS_NEWTON' # hessian approximation + self.__integrator_type = 'ERK' # integrator type + self.__tf = None # prediction horizon + self.__nlp_solver_type = 'SQP_RTI' # NLP solver + self.__globalization = 'FIXED_STEP' + self.__nlp_solver_step_length = 1.0 # fixed Newton step length + self.__levenberg_marquardt = 0.0 + self.__collocation_type = 'GAUSS_LEGENDRE' + self.__sim_method_num_stages = 4 # number of stages in the integrator + self.__sim_method_num_steps = 1 # number of steps in the integrator + self.__sim_method_newton_iter = 3 # number of Newton iterations in simulation method + self.__sim_method_newton_tol = 0.0 + self.__sim_method_jac_reuse = 0 + self.__qp_solver_tol_stat = None # QP solver stationarity tolerance + self.__qp_solver_tol_eq = None # QP solver equality tolerance + self.__qp_solver_tol_ineq = None # QP solver inequality + self.__qp_solver_tol_comp = None # QP solver complementarity + self.__qp_solver_iter_max = 50 # QP solver max iter + self.__qp_solver_cond_N = None # QP solver: new horizon after partial condensing + self.__qp_solver_warm_start = 0 + self.__qp_solver_cond_ric_alg = 1 + self.__qp_solver_ric_alg = 1 + self.__nlp_solver_tol_stat = 1e-6 # NLP solver stationarity tolerance + self.__nlp_solver_tol_eq = 1e-6 # NLP solver equality tolerance + self.__nlp_solver_tol_ineq = 1e-6 # NLP solver inequality + self.__nlp_solver_tol_comp = 1e-6 # NLP solver complementarity + self.__nlp_solver_max_iter = 100 # NLP solver maximum number of iterations + self.__nlp_solver_ext_qp_res = 0 + self.__Tsim = None # automatically calculated as tf/N + self.__print_level = 0 # print level + self.__initialize_t_slacks = 0 # possible values: 0, 1 + self.__regularize_method = None + self.__time_steps = None + self.__shooting_nodes = None + self.__exact_hess_cost = 1 + self.__exact_hess_dyn = 1 + self.__exact_hess_constr = 1 + self.__ext_cost_num_hess = 0 + self.__alpha_min = 0.05 + self.__alpha_reduction = 0.7 + self.__line_search_use_sufficient_descent = 0 + self.__globalization_use_SOC = 0 + self.__full_step_dual = 0 + self.__eps_sufficient_descent = 1e-4 + self.__hpipm_mode = 'BALANCE' + # TODO: move those out? they are more about generation than about the acados OCP solver. + self.__ext_fun_compile_flags = '-O2' + self.__model_external_shared_lib_dir = None # path to the the .so lib + self.__model_external_shared_lib_name = None # name of the the .so lib + self.__custom_update_filename = '' + self.__custom_update_header_filename = '' + self.__custom_templates = [] + self.__custom_update_copy = True + + @property + def qp_solver(self): + """QP solver to be used in the NLP solver. + String in ('PARTIAL_CONDENSING_HPIPM', 'FULL_CONDENSING_QPOASES', 'FULL_CONDENSING_HPIPM', 'PARTIAL_CONDENSING_QPDUNES', 'PARTIAL_CONDENSING_OSQP', 'FULL_CONDENSING_DAQP'). + Default: 'PARTIAL_CONDENSING_HPIPM'. + """ + return self.__qp_solver + + @property + def ext_fun_compile_flags(self): + """ + String with compiler flags for external function compilation. + Default: '-O2'. + """ + return self.__ext_fun_compile_flags + + + @property + def custom_update_filename(self): + """ + Filename of the custom C function to update solver data and parameters in between solver calls + + This file has to implement the functions + int custom_update_init_function([model.name]_solver_capsule* capsule); + int custom_update_function([model.name]_solver_capsule* capsule); + int custom_update_terminate_function([model.name]_solver_capsule* capsule); + + + Default: ''. + """ + return self.__custom_update_filename + + + @property + def custom_templates(self): + """ + List of tuples of the form: + (input_filename, output_filename) + + Custom templates are render in OCP solver generation. + + Default: []. + """ + return self.__custom_templates + + + @property + def custom_update_header_filename(self): + """ + Header filename of the custom C function to update solver data and parameters in between solver calls + + This file has to declare the custom_update functions and look as follows: + + ``` + // Called at the end of solver creation. + // This is allowed to allocate memory and store the pointer to it into capsule->custom_update_memory. + int custom_update_init_function([model.name]_solver_capsule* capsule); + + // Custom update function that can be called between solver calls + int custom_update_function([model.name]_solver_capsule* capsule, double* data, int data_len); + + // Called just before destroying the solver. + // Responsible to free allocated memory, stored at capsule->custom_update_memory. + int custom_update_terminate_function([model.name]_solver_capsule* capsule); + + Default: ''. + """ + return self.__custom_update_header_filename + + @property + def custom_update_copy(self): + """ + Boolean; + If True, the custom update function files are copied into the `code_export_directory`. + """ + return self.__custom_update_copy + + + @property + def hpipm_mode(self): + """ + Mode of HPIPM to be used, + + String in ('BALANCE', 'SPEED_ABS', 'SPEED', 'ROBUST'). + + Default: 'BALANCE'. + + see https://cdn.syscop.de/publications/Frison2020a.pdf + and the HPIPM code: + https://github.com/giaf/hpipm/blob/master/ocp_qp/x_ocp_qp_ipm.c#L69 + """ + return self.__hpipm_mode + + @property + def hessian_approx(self): + """Hessian approximation. + String in ('GAUSS_NEWTON', 'EXACT'). + Default: 'GAUSS_NEWTON'. + """ + return self.__hessian_approx + + @property + def integrator_type(self): + """ + Integrator type. + String in ('ERK', 'IRK', 'GNSF', 'DISCRETE', 'LIFTED_IRK'). + Default: 'ERK'. + """ + return self.__integrator_type + + @property + def nlp_solver_type(self): + """NLP solver. + String in ('SQP', 'SQP_RTI'). + Default: 'SQP_RTI'. + """ + return self.__nlp_solver_type + + @property + def globalization(self): + """Globalization type. + String in ('FIXED_STEP', 'MERIT_BACKTRACKING'). + Default: 'FIXED_STEP'. + + .. note:: preliminary implementation. + """ + return self.__globalization + + @property + def collocation_type(self): + """Collocation type: relevant for implicit integrators + -- string in {GAUSS_RADAU_IIA, GAUSS_LEGENDRE}. + + Default: GAUSS_LEGENDRE + """ + return self.__collocation_type + + @property + def regularize_method(self): + """Regularization method for the Hessian. + String in ('NO_REGULARIZE', 'MIRROR', 'PROJECT', 'PROJECT_REDUC_HESS', 'CONVEXIFY') or :code:`None`. + + - MIRROR: performs eigenvalue decomposition H = V^T D V and sets D_ii = max(eps, abs(D_ii)) + - PROJECT: performs eigenvalue decomposition H = V^T D V and sets D_ii = max(eps, D_ii) + - CONVEXIFY: Algorithm 6 from Verschueren2017, https://cdn.syscop.de/publications/Verschueren2017.pdf + - PROJECT_REDUC_HESS: experimental + + Note: default eps = 1e-4 + + Default: :code:`None`. + """ + return self.__regularize_method + + @property + def nlp_solver_step_length(self): + """ + Fixed Newton step length. + Type: float > 0. + Default: 1.0. + """ + return self.__nlp_solver_step_length + + @property + def levenberg_marquardt(self): + """ + Factor for LM regularization. + Type: float >= 0 + Default: 0.0. + """ + return self.__levenberg_marquardt + + @property + def sim_method_num_stages(self): + """ + Number of stages in the integrator. + Type: int > 0 or ndarray of ints > 0 of shape (N,). + Default: 4 + """ + return self.__sim_method_num_stages + + @property + def sim_method_num_steps(self): + """ + Number of steps in the integrator. + Type: int > 0 or ndarray of ints > 0 of shape (N,). + Default: 1 + """ + return self.__sim_method_num_steps + + @property + def sim_method_newton_iter(self): + """ + Number of Newton iterations in simulation method. + Type: int > 0 + Default: 3 + """ + return self.__sim_method_newton_iter + + @property + def sim_method_newton_tol(self): + """ + Tolerance of Newton system in simulation method. + Type: float: 0.0 means not used + Default: 0.0 + """ + return self.__sim_method_newton_tol + + @property + def sim_method_jac_reuse(self): + """ + Integer determining if jacobians are reused within integrator or ndarray of ints > 0 of shape (N,). + 0: False (no reuse); 1: True (reuse) + Default: 0 + """ + return self.__sim_method_jac_reuse + + @property + def qp_solver_tol_stat(self): + """ + QP solver stationarity tolerance. + Default: :code:`None` + """ + return self.__qp_solver_tol_stat + + @property + def qp_solver_tol_eq(self): + """ + QP solver equality tolerance. + Default: :code:`None` + """ + return self.__qp_solver_tol_eq + + @property + def qp_solver_tol_ineq(self): + """ + QP solver inequality. + Default: :code:`None` + """ + return self.__qp_solver_tol_ineq + + @property + def qp_solver_tol_comp(self): + """ + QP solver complementarity. + Default: :code:`None` + """ + return self.__qp_solver_tol_comp + + @property + def qp_solver_cond_N(self): + """QP solver: New horizon after partial condensing. + Set to N by default -> no condensing.""" + return self.__qp_solver_cond_N + + @property + def qp_solver_warm_start(self): + """ + QP solver: Warm starting. + 0: no warm start; 1: warm start; 2: hot start. + Default: 0 + """ + return self.__qp_solver_warm_start + + @property + def qp_solver_cond_ric_alg(self): + """ + QP solver: Determines which algorithm is used in HPIPM condensing. + 0: dont factorize hessian in the condensing; 1: factorize. + Default: 1 + """ + return self.__qp_solver_cond_ric_alg + + @property + def qp_solver_ric_alg(self): + """ + QP solver: Determines which algorithm is used in HPIPM OCP QP solver. + 0 classical Riccati, 1 square-root Riccati. + + Note: taken from [HPIPM paper]: + + (a) the classical implementation requires the reduced Hessian with respect to the dynamics + equality constraints to be positive definite, but allows the full-space Hessian to be indefinite) + (b) the square-root implementation, which in order to reduce the flop count employs the Cholesky + factorization of the Riccati recursion matrix, and therefore requires the full-space Hessian to be positive definite + + [HPIPM paper]: HPIPM: a high-performance quadratic programming framework for model predictive control, Frison and Diehl, 2020 + https://cdn.syscop.de/publications/Frison2020a.pdf + + Default: 1 + """ + return self.__qp_solver_ric_alg + + @property + def qp_solver_iter_max(self): + """ + QP solver: maximum number of iterations. + Type: int > 0 + Default: 50 + """ + return self.__qp_solver_iter_max + + @property + def tol(self): + """ + NLP solver tolerance. Sets or gets the max of :py:attr:`nlp_solver_tol_eq`, + :py:attr:`nlp_solver_tol_ineq`, :py:attr:`nlp_solver_tol_comp` + and :py:attr:`nlp_solver_tol_stat`. + """ + return max([self.__nlp_solver_tol_eq, self.__nlp_solver_tol_ineq,\ + self.__nlp_solver_tol_comp, self.__nlp_solver_tol_stat]) + + @property + def qp_tol(self): + """ + QP solver tolerance. + Sets all of the following at once or gets the max of + :py:attr:`qp_solver_tol_eq`, :py:attr:`qp_solver_tol_ineq`, + :py:attr:`qp_solver_tol_comp` and + :py:attr:`qp_solver_tol_stat`. + """ + return max([self.__qp_solver_tol_eq, self.__qp_solver_tol_ineq,\ + self.__qp_solver_tol_comp, self.__qp_solver_tol_stat]) + + @property + def nlp_solver_tol_stat(self): + """ + NLP solver stationarity tolerance. + Type: float > 0 + Default: 1e-6 + """ + return self.__nlp_solver_tol_stat + + @property + def nlp_solver_tol_eq(self): + """NLP solver equality tolerance""" + return self.__nlp_solver_tol_eq + + @property + def alpha_min(self): + """Minimal step size for globalization MERIT_BACKTRACKING, default: 0.05.""" + return self.__alpha_min + + @property + def alpha_reduction(self): + """Step size reduction factor for globalization MERIT_BACKTRACKING, default: 0.7.""" + return self.__alpha_reduction + + @property + def line_search_use_sufficient_descent(self): + """ + Determines if sufficient descent (Armijo) condition is used in line search. + Type: int; 0 or 1; + default: 0. + """ + return self.__line_search_use_sufficient_descent + + @property + def eps_sufficient_descent(self): + """ + Factor for sufficient descent (Armijo) conditon, see line_search_use_sufficient_descent. + Type: float, + default: 1e-4. + """ + return self.__eps_sufficient_descent + + @property + def globalization_use_SOC(self): + """ + Determines if second order correction (SOC) is done when using MERIT_BACKTRACKING. + SOC is done if preliminary line search does not return full step. + Type: int; 0 or 1; + default: 0. + """ + return self.__globalization_use_SOC + + @property + def full_step_dual(self): + """ + Determines if dual variables are updated with full steps (alpha=1.0) when primal variables are updated with smaller step. + Type: int; 0 or 1; + default: 0. + """ + return self.__full_step_dual + + @property + def nlp_solver_tol_ineq(self): + """NLP solver inequality tolerance""" + return self.__nlp_solver_tol_ineq + + @property + def nlp_solver_ext_qp_res(self): + """Determines if residuals of QP are computed externally within NLP solver (for debugging) + + Type: int; 0 or 1; + Default: 0. + """ + return self.__nlp_solver_ext_qp_res + + @property + def nlp_solver_tol_comp(self): + """NLP solver complementarity tolerance""" + return self.__nlp_solver_tol_comp + + @property + def nlp_solver_max_iter(self): + """ + NLP solver maximum number of iterations. + Type: int > 0 + Default: 100 + """ + return self.__nlp_solver_max_iter + + @property + def time_steps(self): + """ + Vector with time steps between the shooting nodes. Set automatically to uniform discretization if :py:attr:`N` and :py:attr:`tf` are provided. + Default: :code:`None` + """ + return self.__time_steps + + @property + def shooting_nodes(self): + """ + Vector with the shooting nodes, time_steps will be computed from it automatically. + Default: :code:`None` + """ + return self.__shooting_nodes + + @property + def tf(self): + """ + Prediction horizon + Type: float > 0 + Default: :code:`None` + """ + return self.__tf + + @property + def Tsim(self): + """ + Time horizon for one integrator step. Automatically calculated as :py:attr:`tf`/:py:attr:`N`. + Default: :code:`None` + """ + return self.__Tsim + + @property + def print_level(self): + """ + Verbosity of printing. + Type: int >= 0 + Default: 0 + """ + return self.__print_level + + @property + def model_external_shared_lib_dir(self): + """Path to the .so lib""" + return self.__model_external_shared_lib_dir + + @property + def model_external_shared_lib_name(self): + """Name of the .so lib""" + return self.__model_external_shared_lib_name + + @property + def exact_hess_constr(self): + """ + Used in case of hessian_approx == 'EXACT'.\n + Can be used to turn off exact hessian contributions from the constraints module. + """ + return self.__exact_hess_constr + + @property + def exact_hess_cost(self): + """ + Used in case of hessian_approx == 'EXACT'.\n + Can be used to turn off exact hessian contributions from the cost module. + """ + return self.__exact_hess_cost + + @property + def exact_hess_dyn(self): + """ + Used in case of hessian_approx == 'EXACT'.\n + Can be used to turn off exact hessian contributions from the dynamics module. + """ + return self.__exact_hess_dyn + + @property + def ext_cost_num_hess(self): + """ + Determines if custom hessian approximation for cost contribution is used (> 0).\n + Or if hessian contribution is evaluated exactly using CasADi external function (=0 - default). + """ + return self.__ext_cost_num_hess + + @qp_solver.setter + def qp_solver(self, qp_solver): + qp_solvers = ('PARTIAL_CONDENSING_HPIPM', \ + 'FULL_CONDENSING_QPOASES', 'FULL_CONDENSING_HPIPM', \ + 'PARTIAL_CONDENSING_QPDUNES', 'PARTIAL_CONDENSING_OSQP', \ + 'FULL_CONDENSING_DAQP') + if qp_solver in qp_solvers: + self.__qp_solver = qp_solver + else: + raise Exception('Invalid qp_solver value. Possible values are:\n\n' \ + + ',\n'.join(qp_solvers) + '.\n\nYou have: ' + qp_solver + '.\n\n') + + @regularize_method.setter + def regularize_method(self, regularize_method): + regularize_methods = ('NO_REGULARIZE', 'MIRROR', 'PROJECT', \ + 'PROJECT_REDUC_HESS', 'CONVEXIFY') + if regularize_method in regularize_methods: + self.__regularize_method = regularize_method + else: + raise Exception('Invalid regularize_method value. Possible values are:\n\n' \ + + ',\n'.join(regularize_methods) + '.\n\nYou have: ' + regularize_method + '.\n\n') + + @collocation_type.setter + def collocation_type(self, collocation_type): + collocation_types = ('GAUSS_RADAU_IIA', 'GAUSS_LEGENDRE') + if collocation_type in collocation_types: + self.__collocation_type = collocation_type + else: + raise Exception('Invalid collocation_type value. Possible values are:\n\n' \ + + ',\n'.join(collocation_types) + '.\n\nYou have: ' + collocation_type + '.\n\n') + + @hpipm_mode.setter + def hpipm_mode(self, hpipm_mode): + hpipm_modes = ('BALANCE', 'SPEED_ABS', 'SPEED', 'ROBUST') + if hpipm_mode in hpipm_modes: + self.__hpipm_mode = hpipm_mode + else: + raise Exception('Invalid hpipm_mode value. Possible values are:\n\n' \ + + ',\n'.join(hpipm_modes) + '.\n\nYou have: ' + hpipm_mode + '.\n\n') + + @ext_fun_compile_flags.setter + def ext_fun_compile_flags(self, ext_fun_compile_flags): + if isinstance(ext_fun_compile_flags, str): + self.__ext_fun_compile_flags = ext_fun_compile_flags + else: + raise Exception('Invalid ext_fun_compile_flags, expected a string.\n') + + + @custom_update_filename.setter + def custom_update_filename(self, custom_update_filename): + if isinstance(custom_update_filename, str): + self.__custom_update_filename = custom_update_filename + else: + raise Exception('Invalid custom_update_filename, expected a string.\n') + + @custom_templates.setter + def custom_templates(self, custom_templates): + if not isinstance(custom_templates, list): + raise Exception('Invalid custom_templates, expected a list.\n') + for tup in custom_templates: + if not isinstance(tup, tuple): + raise Exception('Invalid custom_templates, shoubld be list of tuples.\n') + for s in tup: + if not isinstance(s, str): + raise Exception('Invalid custom_templates, shoubld be list of tuples of strings.\n') + self.__custom_templates = custom_templates + + @custom_update_header_filename.setter + def custom_update_header_filename(self, custom_update_header_filename): + if isinstance(custom_update_header_filename, str): + self.__custom_update_header_filename = custom_update_header_filename + else: + raise Exception('Invalid custom_update_header_filename, expected a string.\n') + + @custom_update_copy.setter + def custom_update_copy(self, custom_update_copy): + if isinstance(custom_update_copy, bool): + self.__custom_update_copy = custom_update_copy + else: + raise Exception('Invalid custom_update_copy, expected a bool.\n') + + @hessian_approx.setter + def hessian_approx(self, hessian_approx): + hessian_approxs = ('GAUSS_NEWTON', 'EXACT') + if hessian_approx in hessian_approxs: + self.__hessian_approx = hessian_approx + else: + raise Exception('Invalid hessian_approx value. Possible values are:\n\n' \ + + ',\n'.join(hessian_approxs) + '.\n\nYou have: ' + hessian_approx + '.\n\n') + + @integrator_type.setter + def integrator_type(self, integrator_type): + integrator_types = ('ERK', 'IRK', 'GNSF', 'DISCRETE', 'LIFTED_IRK') + if integrator_type in integrator_types: + self.__integrator_type = integrator_type + else: + raise Exception('Invalid integrator_type value. Possible values are:\n\n' \ + + ',\n'.join(integrator_types) + '.\n\nYou have: ' + integrator_type + '.\n\n') + + @tf.setter + def tf(self, tf): + self.__tf = tf + + @time_steps.setter + def time_steps(self, time_steps): + if isinstance(time_steps, np.ndarray): + if len(time_steps.shape) == 1: + self.__time_steps = time_steps + else: + raise Exception('Invalid time_steps, expected np.ndarray of shape (N,).') + else: + raise Exception('Invalid time_steps, expected np.ndarray.') + + @shooting_nodes.setter + def shooting_nodes(self, shooting_nodes): + if isinstance(shooting_nodes, np.ndarray): + if len(shooting_nodes.shape) == 1: + self.__shooting_nodes = shooting_nodes + else: + raise Exception('Invalid shooting_nodes, expected np.ndarray of shape (N+1,).') + else: + raise Exception('Invalid shooting_nodes, expected np.ndarray.') + + @Tsim.setter + def Tsim(self, Tsim): + self.__Tsim = Tsim + + @globalization.setter + def globalization(self, globalization): + globalization_types = ('MERIT_BACKTRACKING', 'FIXED_STEP') + if globalization in globalization_types: + self.__globalization = globalization + else: + raise Exception('Invalid globalization value. Possible values are:\n\n' \ + + ',\n'.join(globalization_types) + '.\n\nYou have: ' + globalization + '.\n\n') + + @alpha_min.setter + def alpha_min(self, alpha_min): + self.__alpha_min = alpha_min + + @alpha_reduction.setter + def alpha_reduction(self, alpha_reduction): + self.__alpha_reduction = alpha_reduction + + @line_search_use_sufficient_descent.setter + def line_search_use_sufficient_descent(self, line_search_use_sufficient_descent): + if line_search_use_sufficient_descent in [0, 1]: + self.__line_search_use_sufficient_descent = line_search_use_sufficient_descent + else: + raise Exception(f'Invalid value for line_search_use_sufficient_descent. Possible values are 0, 1, got {line_search_use_sufficient_descent}') + + @globalization_use_SOC.setter + def globalization_use_SOC(self, globalization_use_SOC): + if globalization_use_SOC in [0, 1]: + self.__globalization_use_SOC = globalization_use_SOC + else: + raise Exception(f'Invalid value for globalization_use_SOC. Possible values are 0, 1, got {globalization_use_SOC}') + + @full_step_dual.setter + def full_step_dual(self, full_step_dual): + if full_step_dual in [0, 1]: + self.__full_step_dual = full_step_dual + else: + raise Exception(f'Invalid value for full_step_dual. Possible values are 0, 1, got {full_step_dual}') + + @eps_sufficient_descent.setter + def eps_sufficient_descent(self, eps_sufficient_descent): + if isinstance(eps_sufficient_descent, float) and eps_sufficient_descent > 0: + self.__eps_sufficient_descent = eps_sufficient_descent + else: + raise Exception('Invalid eps_sufficient_descent value. eps_sufficient_descent must be a positive float.') + + @sim_method_num_stages.setter + def sim_method_num_stages(self, sim_method_num_stages): + + # if isinstance(sim_method_num_stages, int): + # self.__sim_method_num_stages = sim_method_num_stages + # else: + # raise Exception('Invalid sim_method_num_stages value. sim_method_num_stages must be an integer.') + + self.__sim_method_num_stages = sim_method_num_stages + + @sim_method_num_steps.setter + def sim_method_num_steps(self, sim_method_num_steps): + + # if isinstance(sim_method_num_steps, int): + # self.__sim_method_num_steps = sim_method_num_steps + # else: + # raise Exception('Invalid sim_method_num_steps value. sim_method_num_steps must be an integer.') + self.__sim_method_num_steps = sim_method_num_steps + + + @sim_method_newton_iter.setter + def sim_method_newton_iter(self, sim_method_newton_iter): + + if isinstance(sim_method_newton_iter, int): + self.__sim_method_newton_iter = sim_method_newton_iter + else: + raise Exception('Invalid sim_method_newton_iter value. sim_method_newton_iter must be an integer.') + + @sim_method_jac_reuse.setter + def sim_method_jac_reuse(self, sim_method_jac_reuse): + # if sim_method_jac_reuse in (True, False): + self.__sim_method_jac_reuse = sim_method_jac_reuse + # else: + # raise Exception('Invalid sim_method_jac_reuse value. sim_method_jac_reuse must be a Boolean.') + + @nlp_solver_type.setter + def nlp_solver_type(self, nlp_solver_type): + nlp_solver_types = ('SQP', 'SQP_RTI') + if nlp_solver_type in nlp_solver_types: + self.__nlp_solver_type = nlp_solver_type + else: + raise Exception('Invalid nlp_solver_type value. Possible values are:\n\n' \ + + ',\n'.join(nlp_solver_types) + '.\n\nYou have: ' + nlp_solver_type + '.\n\n') + + @nlp_solver_step_length.setter + def nlp_solver_step_length(self, nlp_solver_step_length): + if isinstance(nlp_solver_step_length, float) and nlp_solver_step_length > 0: + self.__nlp_solver_step_length = nlp_solver_step_length + else: + raise Exception('Invalid nlp_solver_step_length value. nlp_solver_step_length must be a positive float.') + + @levenberg_marquardt.setter + def levenberg_marquardt(self, levenberg_marquardt): + if isinstance(levenberg_marquardt, float) and levenberg_marquardt >= 0: + self.__levenberg_marquardt = levenberg_marquardt + else: + raise Exception('Invalid levenberg_marquardt value. levenberg_marquardt must be a positive float.') + + @qp_solver_iter_max.setter + def qp_solver_iter_max(self, qp_solver_iter_max): + if isinstance(qp_solver_iter_max, int) and qp_solver_iter_max > 0: + self.__qp_solver_iter_max = qp_solver_iter_max + else: + raise Exception('Invalid qp_solver_iter_max value. qp_solver_iter_max must be a positive int.') + + @qp_solver_ric_alg.setter + def qp_solver_ric_alg(self, qp_solver_ric_alg): + if qp_solver_ric_alg in [0, 1]: + self.__qp_solver_ric_alg = qp_solver_ric_alg + else: + raise Exception(f'Invalid qp_solver_ric_alg value. qp_solver_ric_alg must be in [0, 1], got {qp_solver_ric_alg}.') + + @qp_solver_cond_ric_alg.setter + def qp_solver_cond_ric_alg(self, qp_solver_cond_ric_alg): + if qp_solver_cond_ric_alg in [0, 1]: + self.__qp_solver_cond_ric_alg = qp_solver_cond_ric_alg + else: + raise Exception(f'Invalid qp_solver_cond_ric_alg value. qp_solver_cond_ric_alg must be in [0, 1], got {qp_solver_cond_ric_alg}.') + + + @qp_solver_cond_N.setter + def qp_solver_cond_N(self, qp_solver_cond_N): + if isinstance(qp_solver_cond_N, int) and qp_solver_cond_N >= 0: + self.__qp_solver_cond_N = qp_solver_cond_N + else: + raise Exception('Invalid qp_solver_cond_N value. qp_solver_cond_N must be a positive int.') + + @qp_solver_warm_start.setter + def qp_solver_warm_start(self, qp_solver_warm_start): + if qp_solver_warm_start in [0, 1, 2]: + self.__qp_solver_warm_start = qp_solver_warm_start + else: + raise Exception('Invalid qp_solver_warm_start value. qp_solver_warm_start must be 0 or 1 or 2.') + + @qp_tol.setter + def qp_tol(self, qp_tol): + if isinstance(qp_tol, float) and qp_tol > 0: + self.__qp_solver_tol_eq = qp_tol + self.__qp_solver_tol_ineq = qp_tol + self.__qp_solver_tol_stat = qp_tol + self.__qp_solver_tol_comp = qp_tol + else: + raise Exception('Invalid qp_tol value. qp_tol must be a positive float.') + + @qp_solver_tol_stat.setter + def qp_solver_tol_stat(self, qp_solver_tol_stat): + if isinstance(qp_solver_tol_stat, float) and qp_solver_tol_stat > 0: + self.__qp_solver_tol_stat = qp_solver_tol_stat + else: + raise Exception('Invalid qp_solver_tol_stat value. qp_solver_tol_stat must be a positive float.') + + @qp_solver_tol_eq.setter + def qp_solver_tol_eq(self, qp_solver_tol_eq): + if isinstance(qp_solver_tol_eq, float) and qp_solver_tol_eq > 0: + self.__qp_solver_tol_eq = qp_solver_tol_eq + else: + raise Exception('Invalid qp_solver_tol_eq value. qp_solver_tol_eq must be a positive float.') + + @qp_solver_tol_ineq.setter + def qp_solver_tol_ineq(self, qp_solver_tol_ineq): + if isinstance(qp_solver_tol_ineq, float) and qp_solver_tol_ineq > 0: + self.__qp_solver_tol_ineq = qp_solver_tol_ineq + else: + raise Exception('Invalid qp_solver_tol_ineq value. qp_solver_tol_ineq must be a positive float.') + + @qp_solver_tol_comp.setter + def qp_solver_tol_comp(self, qp_solver_tol_comp): + if isinstance(qp_solver_tol_comp, float) and qp_solver_tol_comp > 0: + self.__qp_solver_tol_comp = qp_solver_tol_comp + else: + raise Exception('Invalid qp_solver_tol_comp value. qp_solver_tol_comp must be a positive float.') + + @tol.setter + def tol(self, tol): + if isinstance(tol, float) and tol > 0: + self.__nlp_solver_tol_eq = tol + self.__nlp_solver_tol_ineq = tol + self.__nlp_solver_tol_stat = tol + self.__nlp_solver_tol_comp = tol + else: + raise Exception('Invalid tol value. tol must be a positive float.') + + @nlp_solver_tol_stat.setter + def nlp_solver_tol_stat(self, nlp_solver_tol_stat): + if isinstance(nlp_solver_tol_stat, float) and nlp_solver_tol_stat > 0: + self.__nlp_solver_tol_stat = nlp_solver_tol_stat + else: + raise Exception('Invalid nlp_solver_tol_stat value. nlp_solver_tol_stat must be a positive float.') + + @nlp_solver_tol_eq.setter + def nlp_solver_tol_eq(self, nlp_solver_tol_eq): + if isinstance(nlp_solver_tol_eq, float) and nlp_solver_tol_eq > 0: + self.__nlp_solver_tol_eq = nlp_solver_tol_eq + else: + raise Exception('Invalid nlp_solver_tol_eq value. nlp_solver_tol_eq must be a positive float.') + + @nlp_solver_tol_ineq.setter + def nlp_solver_tol_ineq(self, nlp_solver_tol_ineq): + if isinstance(nlp_solver_tol_ineq, float) and nlp_solver_tol_ineq > 0: + self.__nlp_solver_tol_ineq = nlp_solver_tol_ineq + else: + raise Exception('Invalid nlp_solver_tol_ineq value. nlp_solver_tol_ineq must be a positive float.') + + @nlp_solver_ext_qp_res.setter + def nlp_solver_ext_qp_res(self, nlp_solver_ext_qp_res): + if nlp_solver_ext_qp_res in [0, 1]: + self.__nlp_solver_ext_qp_res = nlp_solver_ext_qp_res + else: + raise Exception('Invalid nlp_solver_ext_qp_res value. nlp_solver_ext_qp_res must be in [0, 1].') + + @nlp_solver_tol_comp.setter + def nlp_solver_tol_comp(self, nlp_solver_tol_comp): + if isinstance(nlp_solver_tol_comp, float) and nlp_solver_tol_comp > 0: + self.__nlp_solver_tol_comp = nlp_solver_tol_comp + else: + raise Exception('Invalid nlp_solver_tol_comp value. nlp_solver_tol_comp must be a positive float.') + + @nlp_solver_max_iter.setter + def nlp_solver_max_iter(self, nlp_solver_max_iter): + + if isinstance(nlp_solver_max_iter, int) and nlp_solver_max_iter > 0: + self.__nlp_solver_max_iter = nlp_solver_max_iter + else: + raise Exception('Invalid nlp_solver_max_iter value. nlp_solver_max_iter must be a positive int.') + + @print_level.setter + def print_level(self, print_level): + if isinstance(print_level, int) and print_level >= 0: + self.__print_level = print_level + else: + raise Exception('Invalid print_level value. print_level takes one of the values >=0.') + + @model_external_shared_lib_dir.setter + def model_external_shared_lib_dir(self, model_external_shared_lib_dir): + if isinstance(model_external_shared_lib_dir, str) : + self.__model_external_shared_lib_dir = model_external_shared_lib_dir + else: + raise Exception('Invalid model_external_shared_lib_dir value. Str expected.' \ + + '.\n\nYou have: ' + type(model_external_shared_lib_dir) + '.\n\n') + + @model_external_shared_lib_name.setter + def model_external_shared_lib_name(self, model_external_shared_lib_name): + if isinstance(model_external_shared_lib_name, str) : + if model_external_shared_lib_name[-3:] == '.so' : + raise Exception('Invalid model_external_shared_lib_name value. Remove the .so extension.' \ + + '.\n\nYou have: ' + type(model_external_shared_lib_name) + '.\n\n') + else : + self.__model_external_shared_lib_name = model_external_shared_lib_name + else: + raise Exception('Invalid model_external_shared_lib_name value. Str expected.' \ + + '.\n\nYou have: ' + type(model_external_shared_lib_name) + '.\n\n') + + @exact_hess_constr.setter + def exact_hess_constr(self, exact_hess_constr): + if exact_hess_constr in [0, 1]: + self.__exact_hess_constr = exact_hess_constr + else: + raise Exception('Invalid exact_hess_constr value. exact_hess_constr takes one of the values 0, 1.') + + @exact_hess_cost.setter + def exact_hess_cost(self, exact_hess_cost): + if exact_hess_cost in [0, 1]: + self.__exact_hess_cost = exact_hess_cost + else: + raise Exception('Invalid exact_hess_cost value. exact_hess_cost takes one of the values 0, 1.') + + @exact_hess_dyn.setter + def exact_hess_dyn(self, exact_hess_dyn): + if exact_hess_dyn in [0, 1]: + self.__exact_hess_dyn = exact_hess_dyn + else: + raise Exception('Invalid exact_hess_dyn value. exact_hess_dyn takes one of the values 0, 1.') + + @ext_cost_num_hess.setter + def ext_cost_num_hess(self, ext_cost_num_hess): + if ext_cost_num_hess in [0, 1]: + self.__ext_cost_num_hess = ext_cost_num_hess + else: + raise Exception('Invalid ext_cost_num_hess value. ext_cost_num_hess takes one of the values 0, 1.') + + def set(self, attr, value): + setattr(self, attr, value) + + +class AcadosOcp: + """ + Class containing the full description of the optimal control problem. + This object can be used to create an :py:class:`acados_template.acados_ocp_solver.AcadosOcpSolver`. + + The class has the following properties that can be modified to formulate a specific OCP, see below: + + - :py:attr:`dims` of type :py:class:`acados_template.acados_ocp.AcadosOcpDims` + - :py:attr:`model` of type :py:class:`acados_template.acados_model.AcadosModel` + - :py:attr:`cost` of type :py:class:`acados_template.acados_ocp.AcadosOcpCost` + - :py:attr:`constraints` of type :py:class:`acados_template.acados_ocp.AcadosOcpConstraints` + - :py:attr:`solver_options` of type :py:class:`acados_template.acados_ocp.AcadosOcpOptions` + + - :py:attr:`acados_include_path` (set automatically) + - :py:attr:`shared_lib_ext` (set automatically) + - :py:attr:`acados_lib_path` (set automatically) + - :py:attr:`parameter_values` - used to initialize the parameters (can be changed) + """ + def __init__(self, acados_path=''): + """ + Keyword arguments: + acados_path -- path of your acados installation + """ + if acados_path == '': + acados_path = get_acados_path() + + self.dims = AcadosOcpDims() + """Dimension definitions, type :py:class:`acados_template.acados_ocp.AcadosOcpDims`""" + self.model = AcadosModel() + """Model definitions, type :py:class:`acados_template.acados_model.AcadosModel`""" + self.cost = AcadosOcpCost() + """Cost definitions, type :py:class:`acados_template.acados_ocp.AcadosOcpCost`""" + self.constraints = AcadosOcpConstraints() + """Constraints definitions, type :py:class:`acados_template.acados_ocp.AcadosOcpConstraints`""" + self.solver_options = AcadosOcpOptions() + """Solver Options, type :py:class:`acados_template.acados_ocp.AcadosOcpOptions`""" + + self.acados_include_path = os.path.join(acados_path, 'include').replace(os.sep, '/') # the replace part is important on Windows for CMake + """Path to acados include directory (set automatically), type: `string`""" + self.acados_lib_path = os.path.join(acados_path, 'lib').replace(os.sep, '/') # the replace part is important on Windows for CMake + """Path to where acados library is located, type: `string`""" + self.shared_lib_ext = get_lib_ext() + + # get cython paths + from sysconfig import get_paths + self.cython_include_dirs = [np.get_include(), get_paths()['include']] + + self.__parameter_values = np.array([]) + self.__problem_class = 'OCP' + + self.code_export_directory = 'c_generated_code' + """Path to where code will be exported. Default: `c_generated_code`.""" + + @property + def parameter_values(self): + """:math:`p` - initial values for parameter - can be updated stagewise""" + return self.__parameter_values + + @parameter_values.setter + def parameter_values(self, parameter_values): + if isinstance(parameter_values, np.ndarray): + self.__parameter_values = parameter_values + else: + raise Exception('Invalid parameter_values value. ' + + f'Expected numpy array, got {type(parameter_values)}.') + + def set(self, attr, value): + # tokenize string + tokens = attr.split('_', 1) + if len(tokens) > 1: + setter_to_call = getattr(getattr(self, tokens[0]), 'set') + else: + setter_to_call = getattr(self, 'set') + + setter_to_call(tokens[1], value) + + return diff --git a/iqpilot/third_party/acados/acados_template/acados_ocp_solver.py b/iqpilot/third_party/acados/acados_template/acados_ocp_solver.py new file mode 100644 index 000000000..229bdf603 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/acados_ocp_solver.py @@ -0,0 +1,1990 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +import sys +import os +import json +import numpy as np +from datetime import datetime +import importlib +import shutil + +from subprocess import DEVNULL, call, STDOUT + +from ctypes import POINTER, cast, CDLL, c_void_p, c_char_p, c_double, c_int, c_int64, byref + +from copy import deepcopy +from pathlib import Path + +from .casadi_function_generation import generate_c_code_explicit_ode, \ + generate_c_code_implicit_ode, generate_c_code_gnsf, generate_c_code_discrete_dynamics, \ + generate_c_code_constraint, generate_c_code_nls_cost, generate_c_code_conl_cost, \ + generate_c_code_external_cost +from .gnsf.detect_gnsf_structure import detect_gnsf_structure +from .acados_ocp import AcadosOcp +from .acados_model import AcadosModel +from .utils import is_column, is_empty, casadi_length, render_template,\ + format_class_dict, make_object_json_dumpable, make_model_consistent,\ + set_up_imported_gnsf_model, get_ocp_nlp_layout, get_python_interface_path, get_lib_ext, check_casadi_version +from .builders import CMakeBuilder + + +def make_ocp_dims_consistent(acados_ocp: AcadosOcp): + dims = acados_ocp.dims + cost = acados_ocp.cost + constraints = acados_ocp.constraints + model = acados_ocp.model + opts = acados_ocp.solver_options + + # nx + if is_column(model.x): + dims.nx = casadi_length(model.x) + else: + raise Exception('model.x should be column vector!') + + # nu + if is_empty(model.u): + dims.nu = 0 + else: + dims.nu = casadi_length(model.u) + + # nz + if is_empty(model.z): + dims.nz = 0 + else: + dims.nz = casadi_length(model.z) + + # np + if is_empty(model.p): + dims.np = 0 + else: + dims.np = casadi_length(model.p) + if acados_ocp.parameter_values.shape[0] != dims.np: + raise Exception('inconsistent dimension np, regarding model.p and parameter_values.' + \ + f'\nGot np = {dims.np}, acados_ocp.parameter_values.shape = {acados_ocp.parameter_values.shape[0]}\n') + + ## cost + # initial stage - if not set, copy fields from path constraints + if cost.cost_type_0 is None: + cost.cost_type_0 = cost.cost_type + cost.W_0 = cost.W + cost.Vx_0 = cost.Vx + cost.Vu_0 = cost.Vu + cost.Vz_0 = cost.Vz + cost.yref_0 = cost.yref + cost.cost_ext_fun_type_0 = cost.cost_ext_fun_type + model.cost_y_expr_0 = model.cost_y_expr + model.cost_expr_ext_cost_0 = model.cost_expr_ext_cost + model.cost_expr_ext_cost_custom_hess_0 = model.cost_expr_ext_cost_custom_hess + + model.cost_psi_expr_0 = model.cost_psi_expr + model.cost_r_in_psi_expr_0 = model.cost_r_in_psi_expr + + if cost.cost_type_0 == 'LINEAR_LS': + ny_0 = cost.W_0.shape[0] + if cost.Vx_0.shape[0] != ny_0 or cost.Vu_0.shape[0] != ny_0: + raise Exception('inconsistent dimension ny_0, regarding W_0, Vx_0, Vu_0.' + \ + f'\nGot W_0[{cost.W_0.shape}], Vx_0[{cost.Vx_0.shape}], Vu_0[{cost.Vu_0.shape}]\n') + if dims.nz != 0 and cost.Vz_0.shape[0] != ny_0: + raise Exception('inconsistent dimension ny_0, regarding W_0, Vx_0, Vu_0, Vz_0.' + \ + f'\nGot W_0[{cost.W_0.shape}], Vx_0[{cost.Vx_0.shape}], Vu_0[{cost.Vu_0.shape}], Vz_0[{cost.Vz_0.shape}]\n') + if cost.Vx_0.shape[1] != dims.nx and ny_0 != 0: + raise Exception('inconsistent dimension: Vx_0 should have nx columns.') + if cost.Vu_0.shape[1] != dims.nu and ny_0 != 0: + raise Exception('inconsistent dimension: Vu_0 should have nu columns.') + if cost.yref_0.shape[0] != ny_0: + raise Exception('inconsistent dimension: regarding W_0, yref_0.' + \ + f'\nGot W_0[{cost.W_0.shape}], yref_0[{cost.yref_0.shape}]\n') + dims.ny_0 = ny_0 + + elif cost.cost_type_0 == 'NONLINEAR_LS': + ny_0 = cost.W_0.shape[0] + if is_empty(model.cost_y_expr_0) and ny_0 != 0: + raise Exception('inconsistent dimension ny_0: regarding W_0, cost_y_expr.') + elif casadi_length(model.cost_y_expr_0) != ny_0: + raise Exception('inconsistent dimension ny_0: regarding W_0, cost_y_expr.') + if cost.yref_0.shape[0] != ny_0: + raise Exception('inconsistent dimension: regarding W_0, yref_0.' + \ + f'\nGot W_0[{cost.W.shape}], yref_0[{cost.yref_0.shape}]\n') + dims.ny_0 = ny_0 + + elif cost.cost_type_0 == 'CONVEX_OVER_NONLINEAR': + if is_empty(model.cost_y_expr_0): + raise Exception('cost_y_expr_0 and/or cost_y_expr not provided.') + ny_0 = casadi_length(model.cost_y_expr_0) + if is_empty(model.cost_r_in_psi_expr_0) or casadi_length(model.cost_r_in_psi_expr_0) != ny_0: + raise Exception('inconsistent dimension ny_0: regarding cost_y_expr_0 and cost_r_in_psi_0.') + if is_empty(model.cost_psi_expr_0) or casadi_length(model.cost_psi_expr_0) != 1: + raise Exception('cost_psi_expr_0 not provided or not scalar-valued.') + if cost.yref_0.shape[0] != ny_0: + raise Exception('inconsistent dimension: regarding yref_0 and cost_y_expr_0, cost_r_in_psi_0.') + dims.ny_0 = ny_0 + + if not (opts.hessian_approx=='EXACT' and opts.exact_hess_cost==False) and opts.hessian_approx != 'GAUSS_NEWTON': + raise Exception("\nWith CONVEX_OVER_NONLINEAR cost type, possible Hessian approximations are:\n" + "GAUSS_NEWTON or EXACT with 'exact_hess_cost' == False.\n") + + elif cost.cost_type_0 == 'EXTERNAL': + if opts.hessian_approx == 'GAUSS_NEWTON' and opts.ext_cost_num_hess == 0 and model.cost_expr_ext_cost_custom_hess_0 is None: + print("\nWARNING: Gauss-Newton Hessian approximation with EXTERNAL cost type not possible!\n" + "got cost_type_0: EXTERNAL, hessian_approx: 'GAUSS_NEWTON.'\n" + "GAUSS_NEWTON hessian is only supported for cost_types [NON]LINEAR_LS.\n" + "If you continue, acados will proceed computing the exact hessian for the cost term.\n" + "Note: There is also the option to use the external cost module with a numerical hessian approximation (see `ext_cost_num_hess`).\n" + "OR the option to provide a symbolic custom hessian approximation (see `cost_expr_ext_cost_custom_hess`).\n") + + # path + if cost.cost_type == 'LINEAR_LS': + ny = cost.W.shape[0] + if cost.Vx.shape[0] != ny or cost.Vu.shape[0] != ny: + raise Exception('inconsistent dimension ny, regarding W, Vx, Vu.' + \ + f'\nGot W[{cost.W.shape}], Vx[{cost.Vx.shape}], Vu[{cost.Vu.shape}]\n') + if dims.nz != 0 and cost.Vz.shape[0] != ny: + raise Exception('inconsistent dimension ny, regarding W, Vx, Vu, Vz.' + \ + f'\nGot W[{cost.W.shape}], Vx[{cost.Vx.shape}], Vu[{cost.Vu.shape}], Vz[{cost.Vz.shape}]\n') + if cost.Vx.shape[1] != dims.nx and ny != 0: + raise Exception('inconsistent dimension: Vx should have nx columns.') + if cost.Vu.shape[1] != dims.nu and ny != 0: + raise Exception('inconsistent dimension: Vu should have nu columns.') + if cost.yref.shape[0] != ny: + raise Exception('inconsistent dimension: regarding W, yref.' + \ + f'\nGot W[{cost.W.shape}], yref[{cost.yref.shape}]\n') + dims.ny = ny + + elif cost.cost_type == 'NONLINEAR_LS': + ny = cost.W.shape[0] + if is_empty(model.cost_y_expr) and ny != 0: + raise Exception('inconsistent dimension ny: regarding W, cost_y_expr.') + elif casadi_length(model.cost_y_expr) != ny: + raise Exception('inconsistent dimension ny: regarding W, cost_y_expr.') + if cost.yref.shape[0] != ny: + raise Exception('inconsistent dimension: regarding W, yref.' + \ + f'\nGot W[{cost.W.shape}], yref[{cost.yref.shape}]\n') + dims.ny = ny + + elif cost.cost_type == 'CONVEX_OVER_NONLINEAR': + if is_empty(model.cost_y_expr): + raise Exception('cost_y_expr and/or cost_y_expr not provided.') + ny = casadi_length(model.cost_y_expr) + if is_empty(model.cost_r_in_psi_expr) or casadi_length(model.cost_r_in_psi_expr) != ny: + raise Exception('inconsistent dimension ny: regarding cost_y_expr and cost_r_in_psi.') + if is_empty(model.cost_psi_expr) or casadi_length(model.cost_psi_expr) != 1: + raise Exception('cost_psi_expr not provided or not scalar-valued.') + if cost.yref.shape[0] != ny: + raise Exception('inconsistent dimension: regarding yref and cost_y_expr, cost_r_in_psi.') + dims.ny = ny + + if not (opts.hessian_approx=='EXACT' and opts.exact_hess_cost==False) and opts.hessian_approx != 'GAUSS_NEWTON': + raise Exception("\nWith CONVEX_OVER_NONLINEAR cost type, possible Hessian approximations are:\n" + "GAUSS_NEWTON or EXACT with 'exact_hess_cost' == False.\n") + + + elif cost.cost_type == 'EXTERNAL': + if opts.hessian_approx == 'GAUSS_NEWTON' and opts.ext_cost_num_hess == 0 and model.cost_expr_ext_cost_custom_hess is None: + print("\nWARNING: Gauss-Newton Hessian approximation with EXTERNAL cost type not possible!\n" + "got cost_type: EXTERNAL, hessian_approx: 'GAUSS_NEWTON.'\n" + "GAUSS_NEWTON hessian is only supported for cost_types [NON]LINEAR_LS.\n" + "If you continue, acados will proceed computing the exact hessian for the cost term.\n" + "Note: There is also the option to use the external cost module with a numerical hessian approximation (see `ext_cost_num_hess`).\n" + "OR the option to provide a symbolic custom hessian approximation (see `cost_expr_ext_cost_custom_hess`).\n") + + # terminal + if cost.cost_type_e == 'LINEAR_LS': + ny_e = cost.W_e.shape[0] + if cost.Vx_e.shape[0] != ny_e: + raise Exception('inconsistent dimension ny_e: regarding W_e, cost_y_expr_e.' + \ + f'\nGot W_e[{cost.W_e.shape}], Vx_e[{cost.Vx_e.shape}]') + if cost.Vx_e.shape[1] != dims.nx and ny_e != 0: + raise Exception('inconsistent dimension: Vx_e should have nx columns.') + if cost.yref_e.shape[0] != ny_e: + raise Exception('inconsistent dimension: regarding W_e, yref_e.') + dims.ny_e = ny_e + + elif cost.cost_type_e == 'NONLINEAR_LS': + ny_e = cost.W_e.shape[0] + if is_empty(model.cost_y_expr_e) and ny_e != 0: + raise Exception('inconsistent dimension ny_e: regarding W_e, cost_y_expr_e.') + elif casadi_length(model.cost_y_expr_e) != ny_e: + raise Exception('inconsistent dimension ny_e: regarding W_e, cost_y_expr_e.') + if cost.yref_e.shape[0] != ny_e: + raise Exception('inconsistent dimension: regarding W_e, yref_e.') + dims.ny_e = ny_e + + elif cost.cost_type_e == 'CONVEX_OVER_NONLINEAR': + if is_empty(model.cost_y_expr_e): + raise Exception('cost_y_expr_e not provided.') + ny_e = casadi_length(model.cost_y_expr_e) + if is_empty(model.cost_r_in_psi_expr_e) or casadi_length(model.cost_r_in_psi_expr_e) != ny_e: + raise Exception('inconsistent dimension ny_e: regarding cost_y_expr_e and cost_r_in_psi_e.') + if is_empty(model.cost_psi_expr_e) or casadi_length(model.cost_psi_expr_e) != 1: + raise Exception('cost_psi_expr_e not provided or not scalar-valued.') + if cost.yref_e.shape[0] != ny_e: + raise Exception('inconsistent dimension: regarding yref_e and cost_y_expr_e, cost_r_in_psi_e.') + dims.ny_e = ny_e + + if not (opts.hessian_approx=='EXACT' and opts.exact_hess_cost==False) and opts.hessian_approx != 'GAUSS_NEWTON': + raise Exception("\nWith CONVEX_OVER_NONLINEAR cost type, possible Hessian approximations are:\n" + "GAUSS_NEWTON or EXACT with 'exact_hess_cost' == False.\n") + + + + elif cost.cost_type_e == 'EXTERNAL': + if opts.hessian_approx == 'GAUSS_NEWTON' and opts.ext_cost_num_hess == 0 and model.cost_expr_ext_cost_custom_hess_e is None: + print("\nWARNING: Gauss-Newton Hessian approximation with EXTERNAL cost type not possible!\n" + "got cost_type_e: EXTERNAL, hessian_approx: 'GAUSS_NEWTON.'\n" + "GAUSS_NEWTON hessian is only supported for cost_types [NON]LINEAR_LS.\n" + "If you continue, acados will proceed computing the exact hessian for the cost term.\n" + "Note: There is also the option to use the external cost module with a numerical hessian approximation (see `ext_cost_num_hess`).\n" + "OR the option to provide a symbolic custom hessian approximation (see `cost_expr_ext_cost_custom_hess`).\n") + + ## constraints + # initial + this_shape = constraints.lbx_0.shape + other_shape = constraints.ubx_0.shape + if not this_shape == other_shape: + raise Exception('lbx_0, ubx_0 have different shapes!') + if not is_column(constraints.lbx_0): + raise Exception('lbx_0, ubx_0 must be column vectors!') + dims.nbx_0 = constraints.lbx_0.size + + if all(constraints.lbx_0 == constraints.ubx_0) and dims.nbx_0 == dims.nx \ + and dims.nbxe_0 is None \ + and (constraints.idxbxe_0.shape == constraints.idxbx_0.shape)\ + and all(constraints.idxbxe_0 == constraints.idxbx_0): + # case: x0 was set: nbx0 are all equlities. + dims.nbxe_0 = dims.nbx_0 + elif constraints.idxbxe_0 is not None: + dims.nbxe_0 = constraints.idxbxe_0.shape[0] + elif dims.nbxe_0 is None: + # case: x0 and idxbxe_0 were not set -> dont assume nbx0 to be equality constraints. + dims.nbxe_0 = 0 + + # path + nbx = constraints.idxbx.shape[0] + if constraints.ubx.shape[0] != nbx or constraints.lbx.shape[0] != nbx: + raise Exception('inconsistent dimension nbx, regarding idxbx, ubx, lbx.') + else: + dims.nbx = nbx + + nbu = constraints.idxbu.shape[0] + if constraints.ubu.shape[0] != nbu or constraints.lbu.shape[0] != nbu: + raise Exception('inconsistent dimension nbu, regarding idxbu, ubu, lbu.') + else: + dims.nbu = nbu + + ng = constraints.lg.shape[0] + if constraints.ug.shape[0] != ng or constraints.C.shape[0] != ng \ + or constraints.D.shape[0] != ng: + raise Exception('inconsistent dimension ng, regarding lg, ug, C, D.') + else: + dims.ng = ng + + if not is_empty(model.con_h_expr): + nh = casadi_length(model.con_h_expr) + else: + nh = 0 + + if constraints.uh.shape[0] != nh or constraints.lh.shape[0] != nh: + raise Exception('inconsistent dimension nh, regarding lh, uh, con_h_expr.') + else: + dims.nh = nh + + if is_empty(model.con_phi_expr): + dims.nphi = 0 + dims.nr = 0 + else: + dims.nphi = casadi_length(model.con_phi_expr) + if is_empty(model.con_r_expr): + raise Exception('convex over nonlinear constraints: con_r_expr but con_phi_expr is nonempty') + else: + dims.nr = casadi_length(model.con_r_expr) + + # terminal + nbx_e = constraints.idxbx_e.shape[0] + if constraints.ubx_e.shape[0] != nbx_e or constraints.lbx_e.shape[0] != nbx_e: + raise Exception('inconsistent dimension nbx_e, regarding idxbx_e, ubx_e, lbx_e.') + else: + dims.nbx_e = nbx_e + + ng_e = constraints.lg_e.shape[0] + if constraints.ug_e.shape[0] != ng_e or constraints.C_e.shape[0] != ng_e: + raise Exception('inconsistent dimension ng_e, regarding_e lg_e, ug_e, C_e.') + else: + dims.ng_e = ng_e + + if not is_empty(model.con_h_expr_e): + nh_e = casadi_length(model.con_h_expr_e) + else: + nh_e = 0 + + if constraints.uh_e.shape[0] != nh_e or constraints.lh_e.shape[0] != nh_e: + raise Exception('inconsistent dimension nh_e, regarding lh_e, uh_e, con_h_expr_e.') + else: + dims.nh_e = nh_e + + if is_empty(model.con_phi_expr_e): + dims.nphi_e = 0 + dims.nr_e = 0 + else: + dims.nphi_e = casadi_length(model.con_phi_expr_e) + if is_empty(model.con_r_expr_e): + raise Exception('convex over nonlinear constraints: con_r_expr_e but con_phi_expr_e is nonempty') + else: + dims.nr_e = casadi_length(model.con_r_expr_e) + + # Slack dimensions + nsbx = constraints.idxsbx.shape[0] + if nsbx > nbx: + raise Exception(f'inconsistent dimension nsbx = {nsbx}. Is greater than nbx = {nbx}.') + if is_empty(constraints.lsbx): + constraints.lsbx = np.zeros((nsbx,)) + elif constraints.lsbx.shape[0] != nsbx: + raise Exception('inconsistent dimension nsbx, regarding idxsbx, lsbx.') + if is_empty(constraints.usbx): + constraints.usbx = np.zeros((nsbx,)) + elif constraints.usbx.shape[0] != nsbx: + raise Exception('inconsistent dimension nsbx, regarding idxsbx, usbx.') + dims.nsbx = nsbx + + nsbu = constraints.idxsbu.shape[0] + if nsbu > nbu: + raise Exception(f'inconsistent dimension nsbu = {nsbu}. Is greater than nbu = {nbu}.') + if is_empty(constraints.lsbu): + constraints.lsbu = np.zeros((nsbu,)) + elif constraints.lsbu.shape[0] != nsbu: + raise Exception('inconsistent dimension nsbu, regarding idxsbu, lsbu.') + if is_empty(constraints.usbu): + constraints.usbu = np.zeros((nsbu,)) + elif constraints.usbu.shape[0] != nsbu: + raise Exception('inconsistent dimension nsbu, regarding idxsbu, usbu.') + dims.nsbu = nsbu + + nsh = constraints.idxsh.shape[0] + if nsh > nh: + raise Exception(f'inconsistent dimension nsh = {nsh}. Is greater than nh = {nh}.') + if is_empty(constraints.lsh): + constraints.lsh = np.zeros((nsh,)) + elif constraints.lsh.shape[0] != nsh: + raise Exception('inconsistent dimension nsh, regarding idxsh, lsh.') + if is_empty(constraints.ush): + constraints.ush = np.zeros((nsh,)) + elif constraints.ush.shape[0] != nsh: + raise Exception('inconsistent dimension nsh, regarding idxsh, ush.') + dims.nsh = nsh + + nsphi = constraints.idxsphi.shape[0] + if nsphi > dims.nphi: + raise Exception(f'inconsistent dimension nsphi = {nsphi}. Is greater than nphi = {dims.nphi}.') + if is_empty(constraints.lsphi): + constraints.lsphi = np.zeros((nsphi,)) + elif constraints.lsphi.shape[0] != nsphi: + raise Exception('inconsistent dimension nsphi, regarding idxsphi, lsphi.') + if is_empty(constraints.usphi): + constraints.usphi = np.zeros((nsphi,)) + elif constraints.usphi.shape[0] != nsphi: + raise Exception('inconsistent dimension nsphi, regarding idxsphi, usphi.') + dims.nsphi = nsphi + + nsg = constraints.idxsg.shape[0] + if nsg > ng: + raise Exception(f'inconsistent dimension nsg = {nsg}. Is greater than ng = {ng}.') + if is_empty(constraints.lsg): + constraints.lsg = np.zeros((nsg,)) + elif constraints.lsg.shape[0] != nsg: + raise Exception('inconsistent dimension nsg, regarding idxsg, lsg.') + if is_empty(constraints.usg): + constraints.usg = np.zeros((nsg,)) + elif constraints.usg.shape[0] != nsg: + raise Exception('inconsistent dimension nsg, regarding idxsg, usg.') + dims.nsg = nsg + + ns = nsbx + nsbu + nsh + nsg + nsphi + wrong_field = "" + if cost.Zl.shape[0] != ns: + wrong_field = "Zl" + dim = cost.Zl.shape[0] + elif cost.Zu.shape[0] != ns: + wrong_field = "Zu" + dim = cost.Zu.shape[0] + elif cost.zl.shape[0] != ns: + wrong_field = "zl" + dim = cost.zl.shape[0] + elif cost.zu.shape[0] != ns: + wrong_field = "zu" + dim = cost.zu.shape[0] + + if wrong_field != "": + raise Exception(f'Inconsistent size for field {wrong_field}, with dimension {dim}, \n\t'\ + + f'Detected ns = {ns} = nsbx + nsbu + nsg + nsh + nsphi.\n\t'\ + + f'With nsbx = {nsbx}, nsbu = {nsbu}, nsg = {nsg}, nsh = {nsh}, nsphi = {nsphi}') + + dims.ns = ns + + nsbx_e = constraints.idxsbx_e.shape[0] + if nsbx_e > nbx_e: + raise Exception(f'inconsistent dimension nsbx_e = {nsbx_e}. Is greater than nbx_e = {nbx_e}.') + if is_empty(constraints.lsbx_e): + constraints.lsbx_e = np.zeros((nsbx_e,)) + elif constraints.lsbx_e.shape[0] != nsbx_e: + raise Exception('inconsistent dimension nsbx_e, regarding idxsbx_e, lsbx_e.') + if is_empty(constraints.usbx_e): + constraints.usbx_e = np.zeros((nsbx_e,)) + elif constraints.usbx_e.shape[0] != nsbx_e: + raise Exception('inconsistent dimension nsbx_e, regarding idxsbx_e, usbx_e.') + dims.nsbx_e = nsbx_e + + nsh_e = constraints.idxsh_e.shape[0] + if nsh_e > nh_e: + raise Exception(f'inconsistent dimension nsh_e = {nsh_e}. Is greater than nh_e = {nh_e}.') + if is_empty(constraints.lsh_e): + constraints.lsh_e = np.zeros((nsh_e,)) + elif constraints.lsh_e.shape[0] != nsh_e: + raise Exception('inconsistent dimension nsh_e, regarding idxsh_e, lsh_e.') + if is_empty(constraints.ush_e): + constraints.ush_e = np.zeros((nsh_e,)) + elif constraints.ush_e.shape[0] != nsh_e: + raise Exception('inconsistent dimension nsh_e, regarding idxsh_e, ush_e.') + dims.nsh_e = nsh_e + + nsg_e = constraints.idxsg_e.shape[0] + if nsg_e > ng_e: + raise Exception(f'inconsistent dimension nsg_e = {nsg_e}. Is greater than ng_e = {ng_e}.') + if is_empty(constraints.lsg_e): + constraints.lsg_e = np.zeros((nsg_e,)) + elif constraints.lsg_e.shape[0] != nsg_e: + raise Exception('inconsistent dimension nsg_e, regarding idxsg_e, lsg_e.') + if is_empty(constraints.usg_e): + constraints.usg_e = np.zeros((nsg_e,)) + elif constraints.usg_e.shape[0] != nsg_e: + raise Exception('inconsistent dimension nsg_e, regarding idxsg_e, usg_e.') + dims.nsg_e = nsg_e + + nsphi_e = constraints.idxsphi_e.shape[0] + if nsphi_e > dims.nphi_e: + raise Exception(f'inconsistent dimension nsphi_e = {nsphi_e}. Is greater than nphi_e = {dims.nphi_e}.') + if is_empty(constraints.lsphi_e): + constraints.lsphi_e = np.zeros((nsphi_e,)) + elif constraints.lsphi_e.shape[0] != nsphi_e: + raise Exception('inconsistent dimension nsphi_e, regarding idxsphi_e, lsphi_e.') + if is_empty(constraints.usphi_e): + constraints.usphi_e = np.zeros((nsphi_e,)) + elif constraints.usphi_e.shape[0] != nsphi_e: + raise Exception('inconsistent dimension nsphi_e, regarding idxsphi_e, usphi_e.') + dims.nsphi_e = nsphi_e + + # terminal + ns_e = nsbx_e + nsh_e + nsg_e + nsphi_e + wrong_field = "" + if cost.Zl_e.shape[0] != ns_e: + wrong_field = "Zl_e" + dim = cost.Zl_e.shape[0] + elif cost.Zu_e.shape[0] != ns_e: + wrong_field = "Zu_e" + dim = cost.Zu_e.shape[0] + elif cost.zl_e.shape[0] != ns_e: + wrong_field = "zl_e" + dim = cost.zl_e.shape[0] + elif cost.zu_e.shape[0] != ns_e: + wrong_field = "zu_e" + dim = cost.zu_e.shape[0] + + if wrong_field != "": + raise Exception(f'Inconsistent size for field {wrong_field}, with dimension {dim}, \n\t'\ + + f'Detected ns_e = {ns_e} = nsbx_e + nsg_e + nsh_e + nsphi_e.\n\t'\ + + f'With nsbx_e = {nsbx_e}, nsg_e = {nsg_e}, nsh_e = {nsh_e}, nsphi_e = {nsphi_e}') + + dims.ns_e = ns_e + + # discretization + if is_empty(opts.time_steps) and is_empty(opts.shooting_nodes): + # uniform discretization + opts.time_steps = opts.tf / dims.N * np.ones((dims.N,)) + + elif not is_empty(opts.shooting_nodes): + if np.shape(opts.shooting_nodes)[0] != dims.N+1: + raise Exception('inconsistent dimension N, regarding shooting_nodes.') + + time_steps = opts.shooting_nodes[1:] - opts.shooting_nodes[0:-1] + # identify constant time_steps: due to numerical reasons the content of time_steps might vary a bit + avg_time_steps = np.average(time_steps) + # criterion for constant time step detection: the min/max difference in values normalized by the average + check_const_time_step = (np.max(time_steps)-np.min(time_steps)) / avg_time_steps + # if the criterion is small, we have a constant time_step + if check_const_time_step < 1e-9: + time_steps[:] = avg_time_steps # if we have a constant time_step: apply the average time_step + + opts.time_steps = time_steps + + elif (not is_empty(opts.time_steps)) and (not is_empty(opts.shooting_nodes)): + Exception('Please provide either time_steps or shooting_nodes for nonuniform discretization') + + tf = np.sum(opts.time_steps) + if (tf - opts.tf) / tf > 1e-15: + raise Exception(f'Inconsistent discretization: {opts.tf}'\ + f' = tf != sum(opts.time_steps) = {tf}.') + + # num_steps + if isinstance(opts.sim_method_num_steps, np.ndarray) and opts.sim_method_num_steps.size == 1: + opts.sim_method_num_steps = opts.sim_method_num_steps.item() + + if isinstance(opts.sim_method_num_steps, (int, float)) and opts.sim_method_num_steps % 1 == 0: + opts.sim_method_num_steps = opts.sim_method_num_steps * np.ones((dims.N,), dtype=np.int64) + elif isinstance(opts.sim_method_num_steps, np.ndarray) and opts.sim_method_num_steps.size == dims.N \ + and np.all(np.equal(np.mod(opts.sim_method_num_steps, 1), 0)): + opts.sim_method_num_steps = np.reshape(opts.sim_method_num_steps, (dims.N,)).astype(np.int64) + else: + raise Exception("Wrong value for sim_method_num_steps. Should be either int or array of ints of shape (N,).") + + # num_stages + if isinstance(opts.sim_method_num_stages, np.ndarray) and opts.sim_method_num_stages.size == 1: + opts.sim_method_num_stages = opts.sim_method_num_stages.item() + + if isinstance(opts.sim_method_num_stages, (int, float)) and opts.sim_method_num_stages % 1 == 0: + opts.sim_method_num_stages = opts.sim_method_num_stages * np.ones((dims.N,), dtype=np.int64) + elif isinstance(opts.sim_method_num_stages, np.ndarray) and opts.sim_method_num_stages.size == dims.N \ + and np.all(np.equal(np.mod(opts.sim_method_num_stages, 1), 0)): + opts.sim_method_num_stages = np.reshape(opts.sim_method_num_stages, (dims.N,)).astype(np.int64) + else: + raise Exception("Wrong value for sim_method_num_stages. Should be either int or array of ints of shape (N,).") + + # jac_reuse + if isinstance(opts.sim_method_jac_reuse, np.ndarray) and opts.sim_method_jac_reuse.size == 1: + opts.sim_method_jac_reuse = opts.sim_method_jac_reuse.item() + + if isinstance(opts.sim_method_jac_reuse, (int, float)) and opts.sim_method_jac_reuse % 1 == 0: + opts.sim_method_jac_reuse = opts.sim_method_jac_reuse * np.ones((dims.N,), dtype=np.int64) + elif isinstance(opts.sim_method_jac_reuse, np.ndarray) and opts.sim_method_jac_reuse.size == dims.N \ + and np.all(np.equal(np.mod(opts.sim_method_jac_reuse, 1), 0)): + opts.sim_method_jac_reuse = np.reshape(opts.sim_method_jac_reuse, (dims.N,)).astype(np.int64) + else: + raise Exception("Wrong value for sim_method_jac_reuse. Should be either int or array of ints of shape (N,).") + + +def get_simulink_default_opts(): + python_interface_path = get_python_interface_path() + abs_path = os.path.join(python_interface_path, 'simulink_default_opts.json') + with open(abs_path , 'r') as f: + simulink_default_opts = json.load(f) + return simulink_default_opts + + +def ocp_formulation_json_dump(acados_ocp, simulink_opts=None, json_file='acados_ocp_nlp.json'): + # Load acados_ocp_nlp structure description + ocp_layout = get_ocp_nlp_layout() + + # Copy input ocp object dictionary + ocp_nlp_dict = dict(deepcopy(acados_ocp).__dict__) + # TODO: maybe make one function with formatting + + for acados_struct, v in ocp_layout.items(): + # skip non dict attributes + if not isinstance(v, dict): + continue + # setattr(ocp_nlp, acados_struct, dict(getattr(acados_ocp, acados_struct).__dict__)) + # Copy ocp object attributes dictionaries + ocp_nlp_dict[acados_struct]=dict(getattr(acados_ocp, acados_struct).__dict__) + + ocp_nlp_dict = format_class_dict(ocp_nlp_dict) + + if simulink_opts is not None: + ocp_nlp_dict['simulink_opts'] = simulink_opts + + with open(json_file, 'w') as f: + json.dump(ocp_nlp_dict, f, default=make_object_json_dumpable, indent=4, sort_keys=True) + + + +def ocp_formulation_json_load(json_file='acados_ocp_nlp.json'): + # Load acados_ocp_nlp structure description + ocp_layout = get_ocp_nlp_layout() + + with open(json_file, 'r') as f: + ocp_nlp_json = json.load(f) + + ocp_nlp_dict = json2dict(ocp_nlp_json, ocp_nlp_json['dims']) + + # Instantiate AcadosOcp object + acados_ocp = AcadosOcp() + + # load class dict + acados_ocp.__dict__ = ocp_nlp_dict + + # load class attributes dict, dims, constraints, etc + for acados_struct, v in ocp_layout.items(): + # skip non dict attributes + if not isinstance(v, dict): + continue + acados_attribute = getattr(acados_ocp, acados_struct) + acados_attribute.__dict__ = ocp_nlp_dict[acados_struct] + setattr(acados_ocp, acados_struct, acados_attribute) + + return acados_ocp + + +def ocp_generate_external_functions(acados_ocp: AcadosOcp, model: AcadosModel): + + model = make_model_consistent(model) + + if acados_ocp.solver_options.hessian_approx == 'EXACT': + opts = dict(generate_hess=1) + else: + opts = dict(generate_hess=0) + + # create code_export_dir, model_dir + code_export_dir = acados_ocp.code_export_directory + opts['code_export_directory'] = code_export_dir + model_dir = os.path.join(code_export_dir, model.name + '_model') + if not os.path.exists(model_dir): + os.makedirs(model_dir) + + check_casadi_version() + # TODO: remove dir gen from all the generate_c_* functions + if acados_ocp.model.dyn_ext_fun_type == 'casadi': + if acados_ocp.solver_options.integrator_type == 'ERK': + generate_c_code_explicit_ode(model, opts) + elif acados_ocp.solver_options.integrator_type == 'IRK': + generate_c_code_implicit_ode(model, opts) + elif acados_ocp.solver_options.integrator_type == 'LIFTED_IRK': + generate_c_code_implicit_ode(model, opts) + elif acados_ocp.solver_options.integrator_type == 'GNSF': + generate_c_code_gnsf(model, opts) + elif acados_ocp.solver_options.integrator_type == 'DISCRETE': + generate_c_code_discrete_dynamics(model, opts) + else: + raise Exception("ocp_generate_external_functions: unknown integrator type.") + else: + target_location = os.path.join(code_export_dir, model_dir, model.dyn_generic_source) + shutil.copyfile(model.dyn_generic_source, target_location) + + if acados_ocp.dims.nphi > 0 or acados_ocp.dims.nh > 0: + generate_c_code_constraint(model, model.name, False, opts) + + if acados_ocp.dims.nphi_e > 0 or acados_ocp.dims.nh_e > 0: + generate_c_code_constraint(model, model.name, True, opts) + + if acados_ocp.cost.cost_type_0 == 'NONLINEAR_LS': + generate_c_code_nls_cost(model, model.name, 'initial', opts) + elif acados_ocp.cost.cost_type_0 == 'CONVEX_OVER_NONLINEAR': + generate_c_code_conl_cost(model, model.name, 'initial', opts) + elif acados_ocp.cost.cost_type_0 == 'EXTERNAL': + generate_c_code_external_cost(model, 'initial', opts) + + if acados_ocp.cost.cost_type == 'NONLINEAR_LS': + generate_c_code_nls_cost(model, model.name, 'path', opts) + elif acados_ocp.cost.cost_type == 'CONVEX_OVER_NONLINEAR': + generate_c_code_conl_cost(model, model.name, 'path', opts) + elif acados_ocp.cost.cost_type == 'EXTERNAL': + generate_c_code_external_cost(model, 'path', opts) + + if acados_ocp.cost.cost_type_e == 'NONLINEAR_LS': + generate_c_code_nls_cost(model, model.name, 'terminal', opts) + elif acados_ocp.cost.cost_type_e == 'CONVEX_OVER_NONLINEAR': + generate_c_code_conl_cost(model, model.name, 'terminal', opts) + elif acados_ocp.cost.cost_type_e == 'EXTERNAL': + generate_c_code_external_cost(model, 'terminal', opts) + + +def ocp_get_default_cmake_builder() -> CMakeBuilder: + """ + If :py:class:`~acados_template.acados_ocp_solver.AcadosOcpSolver` is used with `CMake` this function returns a good first setting. + :return: default :py:class:`~acados_template.builders.CMakeBuilder` + """ + cmake_builder = CMakeBuilder() + cmake_builder.options_on = ['BUILD_ACADOS_OCP_SOLVER_LIB'] + return cmake_builder + + + +def ocp_render_templates(acados_ocp: AcadosOcp, json_file, cmake_builder=None, simulink_opts=None): + + # setting up loader and environment + json_path = os.path.abspath(json_file) + + if not os.path.exists(json_path): + raise Exception(f'Path "{json_path}" not found!') + + # Render templates + template_list = __ocp_get_template_list(acados_ocp, cmake_builder=cmake_builder, simulink_opts=simulink_opts) + for tup in template_list: + if len(tup) > 2: + output_dir = tup[2] + else: + output_dir = acados_ocp.code_export_directory + render_template(tup[0], tup[1], output_dir, json_path) + + # Custom templates + acados_template_path = os.path.dirname(os.path.abspath(__file__)) + custom_template_glob = os.path.join(acados_template_path, 'custom_update_templates', '*') + for tup in acados_ocp.solver_options.custom_templates: + render_template(tup[0], tup[1], acados_ocp.code_export_directory, json_path, template_glob=custom_template_glob) + + return + + + +def __ocp_get_template_list(acados_ocp: AcadosOcp, cmake_builder=None, simulink_opts=None) -> list: + """ + returns a list of tuples in the form: + (input_filename, output_filname) + or + (input_filename, output_filname, output_directory) + """ + name = acados_ocp.model.name + code_export_directory = acados_ocp.code_export_directory + template_list = [] + + template_list.append(('main.in.c', f'main_{name}.c')) + template_list.append(('acados_solver.in.c', f'acados_solver_{name}.c')) + template_list.append(('acados_solver.in.h', f'acados_solver_{name}.h')) + template_list.append(('acados_solver.in.pxd', f'acados_solver.pxd')) + if cmake_builder is not None: + template_list.append(('CMakeLists.in.txt', 'CMakeLists.txt')) + else: + template_list.append(('Makefile.in', 'Makefile')) + + + # sim + template_list.append(('acados_sim_solver.in.c', f'acados_sim_solver_{name}.c')) + template_list.append(('acados_sim_solver.in.h', f'acados_sim_solver_{name}.h')) + template_list.append(('main_sim.in.c', f'main_sim_{name}.c')) + + # model + model_dir = os.path.join(code_export_directory, f'{name}_model') + template_list.append(('model.in.h', f'{name}_model.h', model_dir)) + # constraints + constraints_dir = os.path.join(code_export_directory, f'{name}_constraints') + template_list.append(('constraints.in.h', f'{name}_constraints.h', constraints_dir)) + # cost + cost_dir = os.path.join(code_export_directory, f'{name}_cost') + template_list.append(('cost.in.h', f'{name}_cost.h', cost_dir)) + + # Simulink + if simulink_opts is not None: + template_file = os.path.join('matlab_templates', 'acados_solver_sfun.in.c') + template_list.append((template_file, f'acados_solver_sfunction_{name}.c')) + template_file = os.path.join('matlab_templates', 'acados_solver_sfun.in.c') + template_list.append((template_file, f'make_sfun_{name}.m')) + + return template_list + + +def remove_x0_elimination(acados_ocp): + acados_ocp.constraints.idxbxe_0 = np.zeros((0,)) + acados_ocp.dims.nbxe_0 = 0 + + +class AcadosOcpSolver: + """ + Class to interact with the acados ocp solver C object. + + :param acados_ocp: type :py:class:`~acados_template.acados_ocp.AcadosOcp` - description of the OCP for acados + :param json_file: name for the json file used to render the templated code - default: acados_ocp_nlp.json + :param simulink_opts: Options to configure Simulink S-function blocks, mainly to activate possible Inputs and Outputs + """ + if sys.platform=="win32": + from ctypes import wintypes + from ctypes import WinDLL + dlclose = WinDLL('kernel32', use_last_error=True).FreeLibrary + dlclose.argtypes = [wintypes.HMODULE] + else: + dlclose = CDLL(None).dlclose + dlclose.argtypes = [c_void_p] + + @classmethod + def generate(cls, acados_ocp: AcadosOcp, json_file='acados_ocp_nlp.json', simulink_opts=None, cmake_builder: CMakeBuilder = None): + """ + Generates the code for an acados OCP solver, given the description in acados_ocp. + :param acados_ocp: type AcadosOcp - description of the OCP for acados + :param json_file: name for the json file used to render the templated code - default: `acados_ocp_nlp.json` + :param simulink_opts: Options to configure Simulink S-function blocks, mainly to activate possible inputs and + outputs; default: `None` + :param cmake_builder: type :py:class:`~acados_template.builders.CMakeBuilder` generate a `CMakeLists.txt` and use + the `CMake` pipeline instead of a `Makefile` (`CMake` seems to be the better option in conjunction with + `MS Visual Studio`); default: `None` + """ + model = acados_ocp.model + acados_ocp.code_export_directory = os.path.abspath(acados_ocp.code_export_directory) + + # make dims consistent + make_ocp_dims_consistent(acados_ocp) + + # module dependent post processing + if acados_ocp.solver_options.integrator_type == 'GNSF': + if 'gnsf_model' in acados_ocp.__dict__: + set_up_imported_gnsf_model(acados_ocp) + else: + detect_gnsf_structure(acados_ocp) + + if acados_ocp.solver_options.qp_solver == 'PARTIAL_CONDENSING_QPDUNES': + remove_x0_elimination(acados_ocp) + + # set integrator time automatically + acados_ocp.solver_options.Tsim = acados_ocp.solver_options.time_steps[0] + + # generate external functions + ocp_generate_external_functions(acados_ocp, model) + + # dump to json + acados_ocp.json_file = json_file + ocp_formulation_json_dump(acados_ocp, simulink_opts=simulink_opts, json_file=json_file) + + # render templates + ocp_render_templates(acados_ocp, json_file, cmake_builder=cmake_builder, simulink_opts=simulink_opts) + + # copy custom update function + if acados_ocp.solver_options.custom_update_filename != "" and acados_ocp.solver_options.custom_update_copy: + target_location = os.path.join(acados_ocp.code_export_directory, acados_ocp.solver_options.custom_update_filename) + shutil.copyfile(acados_ocp.solver_options.custom_update_filename, target_location) + if acados_ocp.solver_options.custom_update_header_filename != "" and acados_ocp.solver_options.custom_update_copy: + target_location = os.path.join(acados_ocp.code_export_directory, acados_ocp.solver_options.custom_update_header_filename) + shutil.copyfile(acados_ocp.solver_options.custom_update_header_filename, target_location) + + + @classmethod + def build(cls, code_export_dir, with_cython=False, cmake_builder: CMakeBuilder = None, verbose: bool = True): + """ + Builds the code for an acados OCP solver, that has been generated in code_export_dir + :param code_export_dir: directory in which acados OCP solver has been generated, see generate() + :param with_cython: option indicating if the cython interface is build, default: False. + :param cmake_builder: type :py:class:`~acados_template.builders.CMakeBuilder` generate a `CMakeLists.txt` and use + the `CMake` pipeline instead of a `Makefile` (`CMake` seems to be the better option in conjunction with + `MS Visual Studio`); default: `None` + :param verbose: indicating if build command is printed + """ + code_export_dir = os.path.abspath(code_export_dir) + cwd = os.getcwd() + os.chdir(code_export_dir) + if with_cython: + call( + ['make', 'clean_all'], + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + call( + ['make', 'ocp_cython'], + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + else: + if cmake_builder is not None: + cmake_builder.exec(code_export_dir) + else: + call( + ['make', 'clean_ocp_shared_lib'], + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + call( + ['make', 'ocp_shared_lib'], + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + os.chdir(cwd) + + + @classmethod + def create_cython_solver(cls, json_file): + """ + Returns an `AcadosOcpSolverCython` object. + + This is an alternative Cython based Python wrapper to the acados OCP solver in C. + This offers faster interaction with the solver, because getter and setter calls, which include shape checking are done in compiled C code. + + The default wrapper `AcadosOcpSolver` is based on ctypes. + """ + with open(json_file, 'r') as f: + acados_ocp_json = json.load(f) + code_export_directory = acados_ocp_json['code_export_directory'] + + importlib.invalidate_caches() + rel_code_export_directory = os.path.relpath(code_export_directory) + acados_ocp_solver_pyx = importlib.import_module(f'{rel_code_export_directory}.acados_ocp_solver_pyx') + + AcadosOcpSolverCython = getattr(acados_ocp_solver_pyx, 'AcadosOcpSolverCython') + return AcadosOcpSolverCython(acados_ocp_json['model']['name'], + acados_ocp_json['solver_options']['nlp_solver_type'], + acados_ocp_json['dims']['N']) + + + def __init__(self, acados_ocp: AcadosOcp, json_file='acados_ocp_nlp.json', simulink_opts=None, build=True, generate=True, cmake_builder: CMakeBuilder = None, verbose=True): + + self.solver_created = False + if generate: + self.generate(acados_ocp, json_file=json_file, simulink_opts=simulink_opts, cmake_builder=cmake_builder) + + # load json, store options in object + with open(json_file, 'r') as f: + acados_ocp_json = json.load(f) + self.N = acados_ocp_json['dims']['N'] + self.model_name = acados_ocp_json['model']['name'] + self.solver_options = acados_ocp_json['solver_options'] + + acados_lib_path = acados_ocp_json['acados_lib_path'] + code_export_directory = acados_ocp_json['code_export_directory'] + + if build: + self.build(code_export_directory, with_cython=False, cmake_builder=cmake_builder, verbose=verbose) + + # prepare library loading + lib_prefix = 'lib' + lib_ext = get_lib_ext() + if os.name == 'nt': + lib_prefix = '' + + # Load acados library to avoid unloading the library. + # This is necessary if acados was compiled with OpenMP, since the OpenMP threads can't be destroyed. + # Unloading a library which uses OpenMP results in a segfault (on any platform?). + # see [https://stackoverflow.com/questions/34439956/vc-crash-when-freeing-a-dll-built-with-openmp] + # or [https://python.hotexamples.com/examples/_ctypes/-/dlclose/python-dlclose-function-examples.html] + libacados_name = f'{lib_prefix}acados{lib_ext}' + libacados_filepath = os.path.join(acados_lib_path, libacados_name) + self.__acados_lib = CDLL(libacados_filepath) + # find out if acados was compiled with OpenMP + try: + self.__acados_lib_uses_omp = getattr(self.__acados_lib, 'omp_get_thread_num') is not None + except AttributeError as e: + self.__acados_lib_uses_omp = False + if self.__acados_lib_uses_omp: + print('acados was compiled with OpenMP.') + else: + print('acados was compiled without OpenMP.') + libacados_ocp_solver_name = f'{lib_prefix}acados_ocp_solver_{self.model_name}{lib_ext}' + self.shared_lib_name = os.path.join(code_export_directory, libacados_ocp_solver_name) + + # get shared_lib + self.shared_lib = CDLL(self.shared_lib_name) + + # create capsule + getattr(self.shared_lib, f"{self.model_name}_acados_create_capsule").restype = c_void_p + self.capsule = getattr(self.shared_lib, f"{self.model_name}_acados_create_capsule")() + + # create solver + getattr(self.shared_lib, f"{self.model_name}_acados_create").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_create").restype = c_int + assert getattr(self.shared_lib, f"{self.model_name}_acados_create")(self.capsule)==0 + self.solver_created = True + + self.acados_ocp = acados_ocp + + # get pointers solver + self.__get_pointers_solver() + + self.status = 0 + + # gettable fields + self.__qp_dynamics_fields = ['A', 'B', 'b'] + self.__qp_cost_fields = ['Q', 'R', 'S', 'q', 'r'] + self.__qp_constraint_fields = ['C', 'D', 'lg', 'ug', 'lbx', 'ubx', 'lbu', 'ubu'] + + + def __get_pointers_solver(self): + # """ + # Private function to get the pointers for solver + # """ + # get pointers solver + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_opts").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_opts").restype = c_void_p + self.nlp_opts = getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_opts")(self.capsule) + + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_dims").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_dims").restype = c_void_p + self.nlp_dims = getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_dims")(self.capsule) + + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_config").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_config").restype = c_void_p + self.nlp_config = getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_config")(self.capsule) + + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_out").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_out").restype = c_void_p + self.nlp_out = getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_out")(self.capsule) + + getattr(self.shared_lib, f"{self.model_name}_acados_get_sens_out").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_get_sens_out").restype = c_void_p + self.sens_out = getattr(self.shared_lib, f"{self.model_name}_acados_get_sens_out")(self.capsule) + + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_in").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_in").restype = c_void_p + self.nlp_in = getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_in")(self.capsule) + + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_solver").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_solver").restype = c_void_p + self.nlp_solver = getattr(self.shared_lib, f"{self.model_name}_acados_get_nlp_solver")(self.capsule) + + + + def solve_for_x0(self, x0_bar): + """ + Wrapper around `solve()` which sets initial state constraint, solves the OCP, and returns u0. + """ + self.set(0, "lbx", x0_bar) + self.set(0, "ubx", x0_bar) + + status = self.solve() + + if status == 2: + print("Warning: acados_ocp_solver reached maximum iterations.") + elif status != 0: + raise Exception(f'acados acados_ocp_solver returned status {status}') + + u0 = self.get(0, "u") + return u0 + + + def solve(self): + """ + Solve the ocp with current input. + """ + getattr(self.shared_lib, f"{self.model_name}_acados_solve").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_solve").restype = c_int + self.status = getattr(self.shared_lib, f"{self.model_name}_acados_solve")(self.capsule) + + return self.status + + + def custom_update(self, data_: np.ndarray): + """ + A custom function that can be implemented by a user to be called between solver calls. + By default this does nothing. + The idea is to have a convenient wrapper to do complex updates of parameters and numerical data efficiently in C, + in a function that is compiled into the solver library and can be conveniently used in the Python environment. + """ + data = np.ascontiguousarray(data_, dtype=np.float64) + c_data = cast(data.ctypes.data, POINTER(c_double)) + data_len = len(data) + + getattr(self.shared_lib, f"{self.model_name}_acados_custom_update").argtypes = [c_void_p, POINTER(c_double), c_int] + getattr(self.shared_lib, f"{self.model_name}_acados_custom_update").restype = c_int + status = getattr(self.shared_lib, f"{self.model_name}_acados_custom_update")(self.capsule, c_data, data_len) + + return status + + + def reset(self, reset_qp_solver_mem=1): + """ + Sets current iterate to all zeros. + """ + getattr(self.shared_lib, f"{self.model_name}_acados_reset").argtypes = [c_void_p, c_int] + getattr(self.shared_lib, f"{self.model_name}_acados_reset").restype = c_int + getattr(self.shared_lib, f"{self.model_name}_acados_reset")(self.capsule, reset_qp_solver_mem) + + return + + + def set_new_time_steps(self, new_time_steps): + """ + Set new time steps. + Recreates the solver if N changes. + + :param new_time_steps: 1 dimensional np array of new time steps for the solver + + .. note:: This allows for different use-cases: either set a new size of time_steps or a new distribution of + the shooting nodes without changing the number, e.g., to reach a different final time. Both cases + do not require a new code export and compilation. + """ + + # unlikely but still possible + if not self.solver_created: + raise Exception('Solver was not yet created!') + + # check if time steps really changed in value + if np.array_equal(self.solver_options['time_steps'], new_time_steps): + return + + N = new_time_steps.size + new_time_steps_data = cast(new_time_steps.ctypes.data, POINTER(c_double)) + + # check if recreation of acados is necessary (no need to recreate acados if sizes are identical) + if len(self.solver_options['time_steps']) == N: + getattr(self.shared_lib, f"{self.model_name}_acados_update_time_steps").argtypes = [c_void_p, c_int, c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_update_time_steps").restype = c_int + assert getattr(self.shared_lib, f"{self.model_name}_acados_update_time_steps")(self.capsule, N, new_time_steps_data) == 0 + else: # recreate the solver with the new time steps + self.solver_created = False + + # delete old memory (analog to __del__) + getattr(self.shared_lib, f"{self.model_name}_acados_free").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_free").restype = c_int + getattr(self.shared_lib, f"{self.model_name}_acados_free")(self.capsule) + + # create solver with new time steps + getattr(self.shared_lib, f"{self.model_name}_acados_create_with_discretization").argtypes = [c_void_p, c_int, c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_create_with_discretization").restype = c_int + assert getattr(self.shared_lib, f"{self.model_name}_acados_create_with_discretization")(self.capsule, N, new_time_steps_data) == 0 + + self.solver_created = True + + # get pointers solver + self.__get_pointers_solver() + + # store time_steps, N + self.solver_options['time_steps'] = new_time_steps + self.N = N + self.solver_options['Tsim'] = self.solver_options['time_steps'][0] + + + def update_qp_solver_cond_N(self, qp_solver_cond_N: int): + """ + Recreate solver with new value `qp_solver_cond_N` with a partial condensing QP solver. + This function is relevant for code reuse, i.e., if either `set_new_time_steps(...)` is used or + the influence of a different `qp_solver_cond_N` is studied without code export and compilation. + :param qp_solver_cond_N: new number of condensing stages for the solver + + .. note:: This function can only be used in combination with a partial condensing QP solver. + + .. note:: After `set_new_time_steps(...)` is used and depending on the new number of time steps it might be + necessary to change `qp_solver_cond_N` as well (using this function), i.e., typically + `qp_solver_cond_N < N`. + """ + # unlikely but still possible + if not self.solver_created: + raise Exception('Solver was not yet created!') + if self.N < qp_solver_cond_N: + raise Exception('Setting qp_solver_cond_N to be larger than N does not work!') + if self.solver_options['qp_solver_cond_N'] != qp_solver_cond_N: + self.solver_created = False + + # recreate the solver + fun_name = f'{self.model_name}_acados_update_qp_solver_cond_N' + getattr(self.shared_lib, fun_name).argtypes = [c_void_p, c_int] + getattr(self.shared_lib, fun_name).restype = c_int + assert getattr(self.shared_lib, fun_name)(self.capsule, qp_solver_cond_N) == 0 + + # store the new value + self.solver_options['qp_solver_cond_N'] = qp_solver_cond_N + self.solver_created = True + + # get pointers solver + self.__get_pointers_solver() + + + def eval_param_sens(self, index, stage=0, field="ex"): + """ + Calculate the sensitivity of the curent solution with respect to the initial state component of index + + :param index: integer corresponding to initial state index in range(nx) + """ + + field_ = field + field = field_.encode('utf-8') + + # checks + if not isinstance(index, int): + raise Exception('AcadosOcpSolver.eval_param_sens(): index must be Integer.') + + self.shared_lib.ocp_nlp_dims_get_from_attr.argtypes = [c_void_p, c_void_p, c_void_p, c_int, c_char_p] + self.shared_lib.ocp_nlp_dims_get_from_attr.restype = c_int + nx = self.shared_lib.ocp_nlp_dims_get_from_attr(self.nlp_config, self.nlp_dims, self.nlp_out, 0, "x".encode('utf-8')) + + if index < 0 or index > nx: + raise Exception(f'AcadosOcpSolver.eval_param_sens(): index must be in [0, nx-1], got: {index}.') + + # actual eval_param + self.shared_lib.ocp_nlp_eval_param_sens.argtypes = [c_void_p, c_char_p, c_int, c_int, c_void_p] + self.shared_lib.ocp_nlp_eval_param_sens.restype = None + self.shared_lib.ocp_nlp_eval_param_sens(self.nlp_solver, field, stage, index, self.sens_out) + + return + + + def get(self, stage_, field_): + """ + Get the last solution of the solver: + + :param stage: integer corresponding to shooting node + :param field: string in ['x', 'u', 'z', 'pi', 'lam', 't', 'sl', 'su',] + + .. note:: regarding lam, t: \n + the inequalities are internally organized in the following order: \n + [ lbu lbx lg lh lphi ubu ubx ug uh uphi; \n + lsbu lsbx lsg lsh lsphi usbu usbx usg ush usphi] + + .. note:: pi: multipliers for dynamics equality constraints \n + lam: multipliers for inequalities \n + t: slack variables corresponding to evaluation of all inequalities (at the solution) \n + sl: slack variables of soft lower inequality constraints \n + su: slack variables of soft upper inequality constraints \n + """ + + out_fields = ['x', 'u', 'z', 'pi', 'lam', 't', 'sl', 'su'] + # mem_fields = ['sl', 'su'] + sens_fields = ['sens_u', "sens_x"] + all_fields = out_fields + sens_fields + + field = field_ + + if (field_ not in all_fields): + raise Exception(f'AcadosOcpSolver.get(stage={stage_}, field={field_}): \'{field_}\' is an invalid argument.\ + \n Possible values are {all_fields}.') + + if not isinstance(stage_, int): + raise Exception(f'AcadosOcpSolver.get(stage={stage_}, field={field_}): stage index must be an integer, got type {type(stage_)}.') + + if stage_ < 0 or stage_ > self.N: + raise Exception(f'AcadosOcpSolver.get(stage={stage_}, field={field_}): stage index must be in [0, {self.N}], got: {stage_}.') + + if stage_ == self.N and field_ == 'pi': + raise Exception(f'AcadosOcpSolver.get(stage={stage_}, field={field_}): field \'{field_}\' does not exist at final stage {stage_}.') + + if field_ in sens_fields: + field = field_.replace('sens_', '') + + field = field.encode('utf-8') + + self.shared_lib.ocp_nlp_dims_get_from_attr.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p] + self.shared_lib.ocp_nlp_dims_get_from_attr.restype = c_int + + dims = self.shared_lib.ocp_nlp_dims_get_from_attr(self.nlp_config, \ + self.nlp_dims, self.nlp_out, stage_, field) + + out = np.ascontiguousarray(np.zeros((dims,)), dtype=np.float64) + out_data = cast(out.ctypes.data, POINTER(c_double)) + + if (field_ in out_fields): + self.shared_lib.ocp_nlp_out_get.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_out_get(self.nlp_config, \ + self.nlp_dims, self.nlp_out, stage_, field, out_data) + # elif field_ in mem_fields: + # self.shared_lib.ocp_nlp_get_at_stage.argtypes = \ + # [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + # self.shared_lib.ocp_nlp_get_at_stage(self.nlp_config, \ + # self.nlp_dims, self.nlp_solver, stage_, field, out_data) + elif field_ in sens_fields: + self.shared_lib.ocp_nlp_out_get.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_out_get(self.nlp_config, \ + self.nlp_dims, self.sens_out, stage_, field, out_data) + + return out + + + def print_statistics(self): + """ + prints statistics of previous solver run as a table: + - iter: iteration number + - res_stat: stationarity residual + - res_eq: residual wrt equality constraints (dynamics) + - res_ineq: residual wrt inequality constraints (constraints) + - res_comp: residual wrt complementarity conditions + - qp_stat: status of QP solver + - qp_iter: number of QP iterations + - alpha: SQP step size + - qp_res_stat: stationarity residual of the last QP solution + - qp_res_eq: residual wrt equality constraints (dynamics) of the last QP solution + - qp_res_ineq: residual wrt inequality constraints (constraints) of the last QP solution + - qp_res_comp: residual wrt complementarity conditions of the last QP solution + """ + stat = self.get_stats("statistics") + + if self.solver_options['nlp_solver_type'] == 'SQP': + print('\niter\tres_stat\tres_eq\t\tres_ineq\tres_comp\tqp_stat\tqp_iter\talpha') + if stat.shape[0]>8: + print('\tqp_res_stat\tqp_res_eq\tqp_res_ineq\tqp_res_comp') + for jj in range(stat.shape[1]): + print(f'{int(stat[0][jj]):d}\t{stat[1][jj]:e}\t{stat[2][jj]:e}\t{stat[3][jj]:e}\t' + + f'{stat[4][jj]:e}\t{int(stat[5][jj]):d}\t{int(stat[6][jj]):d}\t{stat[7][jj]:e}\t') + if stat.shape[0]>8: + print('\t{:e}\t{:e}\t{:e}\t{:e}'.format( \ + stat[8][jj], stat[9][jj], stat[10][jj], stat[11][jj])) + print('\n') + elif self.solver_options['nlp_solver_type'] == 'SQP_RTI': + print('\niter\tqp_stat\tqp_iter') + if stat.shape[0]>3: + print('\tqp_res_stat\tqp_res_eq\tqp_res_ineq\tqp_res_comp') + for jj in range(stat.shape[1]): + print('{:d}\t{:d}\t{:d}'.format( int(stat[0][jj]), int(stat[1][jj]), int(stat[2][jj]))) + if stat.shape[0]>3: + print('\t{:e}\t{:e}\t{:e}\t{:e}'.format( \ + stat[3][jj], stat[4][jj], stat[5][jj], stat[6][jj])) + print('\n') + + return + + + def store_iterate(self, filename: str = '', overwrite=False): + """ + Stores the current iterate of the ocp solver in a json file. + + :param filename: if not set, use f'{self.model_name}_iterate.json' + :param overwrite: if false and filename exists add timestamp to filename + """ + if filename == '': + filename = f'{self.model_name}_iterate.json' + + if not overwrite: + # append timestamp + if os.path.isfile(filename): + filename = filename[:-5] + filename += datetime.utcnow().strftime('%Y-%m-%d-%H:%M:%S.%f') + '.json' + + # get iterate: + solution = dict() + + lN = len(str(self.N+1)) + for i in range(self.N+1): + i_string = f'{i:0{lN}d}' + solution['x_'+i_string] = self.get(i,'x') + solution['u_'+i_string] = self.get(i,'u') + solution['z_'+i_string] = self.get(i,'z') + solution['lam_'+i_string] = self.get(i,'lam') + solution['t_'+i_string] = self.get(i, 't') + solution['sl_'+i_string] = self.get(i, 'sl') + solution['su_'+i_string] = self.get(i, 'su') + if i < self.N: + solution['pi_'+i_string] = self.get(i,'pi') + + for k in list(solution.keys()): + if len(solution[k]) == 0: + del solution[k] + + # save + with open(filename, 'w') as f: + json.dump(solution, f, default=make_object_json_dumpable, indent=4, sort_keys=True) + print("stored current iterate in ", os.path.join(os.getcwd(), filename)) + + + + def dump_last_qp_to_json(self, filename: str = '', overwrite=False): + """ + Dumps the latest QP data into a json file + + :param filename: if not set, use model_name + timestamp + '.json' + :param overwrite: if false and filename exists add timestamp to filename + """ + if filename == '': + filename = f'{self.model_name}_QP.json' + + if not overwrite: + # append timestamp + if os.path.isfile(filename): + filename = filename[:-5] + filename += datetime.utcnow().strftime('%Y-%m-%d-%H:%M:%S.%f') + '.json' + + # get QP data: + qp_data = dict() + + lN = len(str(self.N+1)) + for field in self.__qp_dynamics_fields: + for i in range(self.N): + qp_data[f'{field}_{i:0{lN}d}'] = self.get_from_qp_in(i,field) + + for field in self.__qp_constraint_fields + self.__qp_cost_fields: + for i in range(self.N+1): + qp_data[f'{field}_{i:0{lN}d}'] = self.get_from_qp_in(i,field) + + # remove empty fields + for k in list(qp_data.keys()): + if len(qp_data[k]) == 0: + del qp_data[k] + + # save + with open(filename, 'w') as f: + json.dump(qp_data, f, default=make_object_json_dumpable, indent=4, sort_keys=True) + print("stored qp from solver memory in ", os.path.join(os.getcwd(), filename)) + + + + def load_iterate(self, filename): + """ + Loads the iterate stored in json file with filename into the ocp solver. + """ + if not os.path.isfile(filename): + raise Exception('load_iterate: failed, file does not exist: ' + os.path.join(os.getcwd(), filename)) + + with open(filename, 'r') as f: + solution = json.load(f) + + print(f"loading iterate {filename}") + for key in solution.keys(): + (field, stage) = key.split('_') + self.set(int(stage), field, np.array(solution[key])) + + + def get_stats(self, field_): + """ + Get the information of the last solver call. + + :param field: string in ['statistics', 'time_tot', 'time_lin', 'time_sim', 'time_sim_ad', 'time_sim_la', 'time_qp', 'time_qp_solver_call', 'time_reg', 'sqp_iter', 'residuals', 'qp_iter', 'alpha'] + + Available fileds: + - time_tot: total CPU time previous call + - time_lin: CPU time for linearization + - time_sim: CPU time for integrator + - time_sim_ad: CPU time for integrator contribution of external function calls + - time_sim_la: CPU time for integrator contribution of linear algebra + - time_qp: CPU time qp solution + - time_qp_solver_call: CPU time inside qp solver (without converting the QP) + - time_qp_xcond: time_glob: CPU time globalization + - time_solution_sensitivities: CPU time for previous call to eval_param_sens + - time_reg: CPU time regularization + - sqp_iter: number of SQP iterations + - qp_iter: vector of QP iterations for last SQP call + - statistics: table with info about last iteration + - stat_m: number of rows in statistics matrix + - stat_n: number of columns in statistics matrix + - residuals: residuals of last iterate + - alpha: step sizes of SQP iterations + """ + + double_fields = ['time_tot', + 'time_lin', + 'time_sim', + 'time_sim_ad', + 'time_sim_la', + 'time_qp', + 'time_qp_solver_call', + 'time_qp_xcond', + 'time_glob', + 'time_solution_sensitivities', + 'time_reg' + ] + fields = double_fields + [ + 'sqp_iter', + 'qp_iter', + 'statistics', + 'stat_m', + 'stat_n', + 'residuals', + 'alpha', + ] + field = field_.encode('utf-8') + + + if field_ in ['sqp_iter', 'stat_m', 'stat_n']: + out = np.ascontiguousarray(np.zeros((1,)), dtype=np.int64) + out_data = cast(out.ctypes.data, POINTER(c_int64)) + self.shared_lib.ocp_nlp_get.argtypes = [c_void_p, c_void_p, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_get(self.nlp_config, self.nlp_solver, field, out_data) + return out + + # TODO: just return double instead of np. + elif field_ in double_fields: + out = np.zeros((1,)) + out_data = cast(out.ctypes.data, POINTER(c_double)) + self.shared_lib.ocp_nlp_get.argtypes = [c_void_p, c_void_p, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_get(self.nlp_config, self.nlp_solver, field, out_data) + return out + + elif field_ == 'statistics': + sqp_iter = self.get_stats("sqp_iter") + stat_m = self.get_stats("stat_m") + stat_n = self.get_stats("stat_n") + min_size = min([stat_m, sqp_iter+1]) + out = np.ascontiguousarray( + np.zeros((stat_n[0]+1, min_size[0])), dtype=np.float64) + out_data = cast(out.ctypes.data, POINTER(c_double)) + self.shared_lib.ocp_nlp_get.argtypes = [c_void_p, c_void_p, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_get(self.nlp_config, self.nlp_solver, field, out_data) + return out + + elif field_ == 'qp_iter': + full_stats = self.get_stats('statistics') + if self.solver_options['nlp_solver_type'] == 'SQP': + return full_stats[6, :] + elif self.solver_options['nlp_solver_type'] == 'SQP_RTI': + return full_stats[2, :] + + elif field_ == 'alpha': + full_stats = self.get_stats('statistics') + if self.solver_options['nlp_solver_type'] == 'SQP': + return full_stats[7, :] + else: # self.solver_options['nlp_solver_type'] == 'SQP_RTI': + raise Exception("alpha values are not available for SQP_RTI") + + elif field_ == 'residuals': + return self.get_residuals() + + else: + raise Exception(f'AcadosOcpSolver.get_stats(): \'{field}\' is not a valid argument.' + + f'\n Possible values are {fields}.') + + + def get_cost(self): + """ + Returns the cost value of the current solution. + """ + # compute cost internally + self.shared_lib.ocp_nlp_eval_cost.argtypes = [c_void_p, c_void_p, c_void_p] + self.shared_lib.ocp_nlp_eval_cost(self.nlp_solver, self.nlp_in, self.nlp_out) + + # create output array + out = np.ascontiguousarray(np.zeros((1,)), dtype=np.float64) + out_data = cast(out.ctypes.data, POINTER(c_double)) + + # call getter + self.shared_lib.ocp_nlp_get.argtypes = [c_void_p, c_void_p, c_char_p, c_void_p] + + field = "cost_value".encode('utf-8') + self.shared_lib.ocp_nlp_get(self.nlp_config, self.nlp_solver, field, out_data) + + return out[0] + + + def get_residuals(self, recompute=False): + """ + Returns an array of the form [res_stat, res_eq, res_ineq, res_comp]. + This residual has to be computed for SQP_RTI solver, since it is not available by default. + + - res_stat: stationarity residual + - res_eq: residual wrt equality constraints (dynamics) + - res_ineq: residual wrt inequality constraints (constraints) + - res_comp: residual wrt complementarity conditions + """ + # compute residuals if RTI + if self.solver_options['nlp_solver_type'] == 'SQP_RTI' or recompute: + self.shared_lib.ocp_nlp_eval_residuals.argtypes = [c_void_p, c_void_p, c_void_p] + self.shared_lib.ocp_nlp_eval_residuals(self.nlp_solver, self.nlp_in, self.nlp_out) + + # create output array + out = np.ascontiguousarray(np.zeros((4, 1)), dtype=np.float64) + out_data = cast(out.ctypes.data, POINTER(c_double)) + + # call getters + self.shared_lib.ocp_nlp_get.argtypes = [c_void_p, c_void_p, c_char_p, c_void_p] + + field = "res_stat".encode('utf-8') + self.shared_lib.ocp_nlp_get(self.nlp_config, self.nlp_solver, field, out_data) + + out_data = cast(out[1].ctypes.data, POINTER(c_double)) + field = "res_eq".encode('utf-8') + self.shared_lib.ocp_nlp_get(self.nlp_config, self.nlp_solver, field, out_data) + + out_data = cast(out[2].ctypes.data, POINTER(c_double)) + field = "res_ineq".encode('utf-8') + self.shared_lib.ocp_nlp_get(self.nlp_config, self.nlp_solver, field, out_data) + + out_data = cast(out[3].ctypes.data, POINTER(c_double)) + field = "res_comp".encode('utf-8') + self.shared_lib.ocp_nlp_get(self.nlp_config, self.nlp_solver, field, out_data) + return out.flatten() + + + # Note: this function should not be used anymore, better use cost_set, constraints_set + def set(self, stage_, field_, value_): + """ + Set numerical data inside the solver. + + :param stage: integer corresponding to shooting node + :param field: string in ['x', 'u', 'pi', 'lam', 't', 'p', 'xdot_guess', 'z_guess'] + + .. note:: regarding lam, t: \n + the inequalities are internally organized in the following order: \n + [ lbu lbx lg lh lphi ubu ubx ug uh uphi; \n + lsbu lsbx lsg lsh lsphi usbu usbx usg ush usphi] + + .. note:: pi: multipliers for dynamics equality constraints \n + lam: multipliers for inequalities \n + t: slack variables corresponding to evaluation of all inequalities (at the solution) \n + sl: slack variables of soft lower inequality constraints \n + su: slack variables of soft upper inequality constraints \n + """ + cost_fields = ['y_ref', 'yref'] + constraints_fields = ['lbx', 'ubx', 'lbu', 'ubu'] + out_fields = ['x', 'u', 'pi', 'lam', 't', 'z', 'sl', 'su'] + mem_fields = ['xdot_guess', 'z_guess'] + + # cast value_ to avoid conversion issues + if isinstance(value_, (float, int)): + value_ = np.array([value_]) + value_ = value_.astype(float) + + field = field_.encode('utf-8') + + stage = c_int(stage_) + + # treat parameters separately + if field_ == 'p': + getattr(self.shared_lib, f"{self.model_name}_acados_update_params").argtypes = [c_void_p, c_int, POINTER(c_double), c_int] + getattr(self.shared_lib, f"{self.model_name}_acados_update_params").restype = c_int + + value_data = cast(value_.ctypes.data, POINTER(c_double)) + + assert getattr(self.shared_lib, f"{self.model_name}_acados_update_params")(self.capsule, stage, value_data, value_.shape[0])==0 + else: + if field_ not in constraints_fields + cost_fields + out_fields + mem_fields: + raise Exception(f"AcadosOcpSolver.set(): '{field}' is not a valid argument.\n" + f" Possible values are {constraints_fields + cost_fields + out_fields + mem_fields + ['p']}.") + + self.shared_lib.ocp_nlp_dims_get_from_attr.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p] + self.shared_lib.ocp_nlp_dims_get_from_attr.restype = c_int + + dims = self.shared_lib.ocp_nlp_dims_get_from_attr(self.nlp_config, \ + self.nlp_dims, self.nlp_out, stage_, field) + + if value_.shape[0] != dims: + msg = f'AcadosOcpSolver.set(): mismatching dimension for field "{field_}" ' + msg += f'with dimension {dims} (you have {value_.shape[0]})' + raise Exception(msg) + + value_data = cast(value_.ctypes.data, POINTER(c_double)) + value_data_p = cast((value_data), c_void_p) + + if field_ in constraints_fields: + self.shared_lib.ocp_nlp_constraints_model_set.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_constraints_model_set(self.nlp_config, \ + self.nlp_dims, self.nlp_in, stage, field, value_data_p) + elif field_ in cost_fields: + self.shared_lib.ocp_nlp_cost_model_set.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_cost_model_set(self.nlp_config, \ + self.nlp_dims, self.nlp_in, stage, field, value_data_p) + elif field_ in out_fields: + self.shared_lib.ocp_nlp_out_set.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_out_set(self.nlp_config, \ + self.nlp_dims, self.nlp_out, stage, field, value_data_p) + elif field_ in mem_fields: + self.shared_lib.ocp_nlp_set.argtypes = \ + [c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_set(self.nlp_config, \ + self.nlp_solver, stage, field, value_data_p) + # also set z_guess, when setting z. + if field_ == 'z': + field = 'z_guess'.encode('utf-8') + self.shared_lib.ocp_nlp_set.argtypes = \ + [c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_set(self.nlp_config, \ + self.nlp_solver, stage, field, value_data_p) + return + + + def cost_set(self, stage_, field_, value_, api='warn'): + """ + Set numerical data in the cost module of the solver. + + :param stage: integer corresponding to shooting node + :param field: string, e.g. 'yref', 'W', 'ext_cost_num_hess', 'zl', 'zu', 'Zl', 'Zu' + :param value: of appropriate size + """ + # cast value_ to avoid conversion issues + if isinstance(value_, (float, int)): + value_ = np.array([value_]) + value_ = value_.astype(float) + + field = field_ + field = field.encode('utf-8') + + stage = c_int(stage_) + self.shared_lib.ocp_nlp_cost_dims_get_from_attr.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, POINTER(c_int)] + self.shared_lib.ocp_nlp_cost_dims_get_from_attr.restype = c_int + + dims = np.ascontiguousarray(np.zeros((2,)), dtype=np.intc) + dims_data = cast(dims.ctypes.data, POINTER(c_int)) + + self.shared_lib.ocp_nlp_cost_dims_get_from_attr(self.nlp_config, \ + self.nlp_dims, self.nlp_out, stage_, field, dims_data) + + value_shape = value_.shape + if len(value_shape) == 1: + value_shape = (value_shape[0], 0) + + elif len(value_shape) == 2: + if api=='old': + pass + elif api=='warn': + if not np.all(np.ravel(value_, order='F')==np.ravel(value_, order='K')): + raise Exception("Ambiguity in API detected.\n" + "Are you making an acados model from scrach? Add api='new' to cost_set and carry on.\n" + "Are you seeing this error suddenly in previously running code? Read on.\n" + f" You are relying on a now-fixed bug in cost_set for field '{field_}'.\n" + + " acados_template now correctly passes on any matrices to acados in column major format.\n" + + " Two options to fix this error: \n" + + " * Add api='old' to cost_set to restore old incorrect behaviour\n" + + " * Add api='new' to cost_set and remove any unnatural manipulation of the value argument " + + "such as non-mathematical transposes, reshaping, casting to fortran order, etc... " + + "If there is no such manipulation, then you have probably been getting an incorrect solution before.") + # Get elements in column major order + value_ = np.ravel(value_, order='F') + elif api=='new': + # Get elements in column major order + value_ = np.ravel(value_, order='F') + else: + raise Exception("Unknown api: '{}'".format(api)) + + if value_shape != tuple(dims): + raise Exception('AcadosOcpSolver.cost_set(): mismatching dimension' + + f' for field "{field_}" at stage {stage} with dimension {tuple(dims)} (you have {value_shape})') + + value_data = cast(value_.ctypes.data, POINTER(c_double)) + value_data_p = cast((value_data), c_void_p) + + self.shared_lib.ocp_nlp_cost_model_set.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_cost_model_set(self.nlp_config, \ + self.nlp_dims, self.nlp_in, stage, field, value_data_p) + + return + + + def constraints_set(self, stage_, field_, value_, api='warn'): + """ + Set numerical data in the constraint module of the solver. + + :param stage: integer corresponding to shooting node + :param field: string in ['lbx', 'ubx', 'lbu', 'ubu', 'lg', 'ug', 'lh', 'uh', 'uphi', 'C', 'D'] + :param value: of appropriate size + """ + # cast value_ to avoid conversion issues + if isinstance(value_, (float, int)): + value_ = np.array([value_]) + value_ = value_.astype(float) + + field = field_ + field = field.encode('utf-8') + + stage = c_int(stage_) + self.shared_lib.ocp_nlp_constraint_dims_get_from_attr.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, POINTER(c_int)] + self.shared_lib.ocp_nlp_constraint_dims_get_from_attr.restype = c_int + + dims = np.ascontiguousarray(np.zeros((2,)), dtype=np.intc) + dims_data = cast(dims.ctypes.data, POINTER(c_int)) + + self.shared_lib.ocp_nlp_constraint_dims_get_from_attr(self.nlp_config, \ + self.nlp_dims, self.nlp_out, stage_, field, dims_data) + + value_shape = value_.shape + if len(value_shape) == 1: + value_shape = (value_shape[0], 0) + elif len(value_shape) == 2: + if api=='old': + pass + elif api=='warn': + if not np.all(np.ravel(value_, order='F')==np.ravel(value_, order='K')): + raise Exception("Ambiguity in API detected.\n" + "Are you making an acados model from scrach? Add api='new' to constraints_set and carry on.\n" + "Are you seeing this error suddenly in previously running code? Read on.\n" + f" You are relying on a now-fixed bug in constraints_set for field '{field}'.\n" + + " acados_template now correctly passes on any matrices to acados in column major format.\n" + + " Two options to fix this error: \n" + + " * Add api='old' to constraints_set to restore old incorrect behaviour\n" + + " * Add api='new' to constraints_set and remove any unnatural manipulation of the value argument " + + "such as non-mathematical transposes, reshaping, casting to fortran order, etc... " + + "If there is no such manipulation, then you have probably been getting an incorrect solution before.") + # Get elements in column major order + value_ = np.ravel(value_, order='F') + elif api=='new': + # Get elements in column major order + value_ = np.ravel(value_, order='F') + else: + raise Exception(f"Unknown api: '{api}'") + + if value_shape != tuple(dims): + raise Exception(f'AcadosOcpSolver.constraints_set(): mismatching dimension' + + f' for field "{field_}" at stage {stage} with dimension {tuple(dims)} (you have {value_shape})') + + value_data = cast(value_.ctypes.data, POINTER(c_double)) + value_data_p = cast((value_data), c_void_p) + + self.shared_lib.ocp_nlp_constraints_model_set.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_constraints_model_set(self.nlp_config, \ + self.nlp_dims, self.nlp_in, stage, field, value_data_p) + + return + + + def get_from_qp_in(self, stage_: int, field_: str): + """ + Get numerical data from the current QP. + + :param stage: integer corresponding to shooting node + :param field: string in ['A', 'B', 'b', 'Q', 'R', 'S', 'q', 'r', 'C', 'D', 'lg', 'ug', 'lbx', 'ubx', 'lbu', 'ubu'] + """ + # idx* should be added too.. + if not isinstance(stage_, int): + raise TypeError("stage should be int") + if stage_ > self.N: + raise Exception("stage should be <= self.N") + if field_ in self.__qp_dynamics_fields and stage_ >= self.N: + raise ValueError(f"dynamics field {field_} not available at terminal stage") + if field_ not in self.__qp_dynamics_fields + self.__qp_cost_fields + self.__qp_constraint_fields: + raise Exception(f"field {field_} not supported.") + + field = field_.encode('utf-8') + stage = c_int(stage_) + + # get dims + self.shared_lib.ocp_nlp_qp_dims_get_from_attr.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, POINTER(c_int)] + self.shared_lib.ocp_nlp_qp_dims_get_from_attr.restype = c_int + + dims = np.ascontiguousarray(np.zeros((2,)), dtype=np.intc) + dims_data = cast(dims.ctypes.data, POINTER(c_int)) + + self.shared_lib.ocp_nlp_qp_dims_get_from_attr(self.nlp_config, \ + self.nlp_dims, self.nlp_out, stage_, field, dims_data) + + # create output data + out = np.ascontiguousarray(np.zeros((np.prod(dims),)), dtype=np.float64) + out = out.reshape(dims[0], dims[1], order='F') + + out_data = cast(out.ctypes.data, POINTER(c_double)) + out_data_p = cast((out_data), c_void_p) + + # call getter + self.shared_lib.ocp_nlp_get_at_stage.argtypes = \ + [c_void_p, c_void_p, c_void_p, c_int, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_get_at_stage(self.nlp_config, \ + self.nlp_dims, self.nlp_solver, stage, field, out_data_p) + + return out + + + def options_set(self, field_, value_): + """ + Set options of the solver. + + :param field: string, e.g. 'print_level', 'rti_phase', 'initialize_t_slacks', 'step_length', 'alpha_min', 'alpha_reduction', 'qp_warm_start', 'line_search_use_sufficient_descent', 'full_step_dual', 'globalization_use_SOC', 'qp_tol_stat', 'qp_tol_eq', 'qp_tol_ineq', 'qp_tol_comp', 'qp_tau_min', 'qp_mu0' + + :param value: of type int, float, string + + - qp_tol_stat: QP solver tolerance stationarity + - qp_tol_eq: QP solver tolerance equalities + - qp_tol_ineq: QP solver tolerance inequalities + - qp_tol_comp: QP solver tolerance complementarity + - qp_tau_min: for HPIPM QP solvers: minimum value of barrier parameter in HPIPM + - qp_mu0: for HPIPM QP solvers: initial value for complementarity slackness + - warm_start_first_qp: indicates if first QP in SQP is warm_started + """ + int_fields = ['print_level', 'rti_phase', 'initialize_t_slacks', 'qp_warm_start', + 'line_search_use_sufficient_descent', 'full_step_dual', 'globalization_use_SOC', 'warm_start_first_qp'] + double_fields = ['step_length', 'tol_eq', 'tol_stat', 'tol_ineq', 'tol_comp', 'alpha_min', 'alpha_reduction', + 'eps_sufficient_descent', 'qp_tol_stat', 'qp_tol_eq', 'qp_tol_ineq', 'qp_tol_comp', 'qp_tau_min', 'qp_mu0'] + string_fields = ['globalization'] + + # check field availability and type + if field_ in int_fields: + if not isinstance(value_, int): + raise Exception(f'solver option \'{field_}\' must be of type int. You have {type(value_)}.') + else: + value_ctypes = c_int(value_) + + elif field_ in double_fields: + if not isinstance(value_, float): + raise Exception(f'solver option \'{field_}\' must be of type float. You have {type(value_)}.') + else: + value_ctypes = c_double(value_) + + elif field_ in string_fields: + if not isinstance(value_, str): + raise Exception(f'solver option \'{field_}\' must be of type str. You have {type(value_)}.') + else: + value_ctypes = value_.encode('utf-8') + else: + fields = ', '.join(int_fields + double_fields + string_fields) + raise Exception(f'AcadosOcpSolver.options_set() does not support field \'{field_}\'.\n'\ + f' Possible values are {fields}.') + + + if field_ == 'rti_phase': + if value_ < 0 or value_ > 2: + raise Exception('AcadosOcpSolver.options_set(): argument \'rti_phase\' can ' + 'take only values 0, 1, 2 for SQP-RTI-type solvers') + if self.solver_options['nlp_solver_type'] != 'SQP_RTI' and value_ > 0: + raise Exception('AcadosOcpSolver.options_set(): argument \'rti_phase\' can ' + 'take only value 0 for SQP-type solvers') + + # encode + field = field_ + field = field.encode('utf-8') + + # call C interface + if field_ in string_fields: + self.shared_lib.ocp_nlp_solver_opts_set.argtypes = \ + [c_void_p, c_void_p, c_char_p, c_char_p] + self.shared_lib.ocp_nlp_solver_opts_set(self.nlp_config, \ + self.nlp_opts, field, value_ctypes) + else: + self.shared_lib.ocp_nlp_solver_opts_set.argtypes = \ + [c_void_p, c_void_p, c_char_p, c_void_p] + self.shared_lib.ocp_nlp_solver_opts_set(self.nlp_config, \ + self.nlp_opts, field, byref(value_ctypes)) + return + + + def set_params_sparse(self, stage_, idx_values_, param_values_): + """ + set parameters of the solvers external function partially: + Pseudo: solver.param[idx_values_] = param_values_; + Parameters: + :param stage_: integer corresponding to shooting node + :param idx_values_: 0 based np array (or iterable) of integers: indices of parameter to be set + :param param_values_: new parameter values as numpy array + """ + + # if not isinstance(idx_values_, np.ndarray) or not issubclass(type(idx_values_[0]), np.integer): + # raise Exception('idx_values_ must be np.array of integers.') + + if not isinstance(param_values_, np.ndarray): + raise Exception('param_values_ must be np.array.') + elif np.float64 != param_values_.dtype: + raise TypeError('param_values_ must be np.array of float64.') + + if param_values_.shape[0] != len(idx_values_): + raise Exception(f'param_values_ and idx_values_ must be of the same size.' + + f' Got sizes idx {param_values_.shape[0]}, param_values {len(idx_values_)}.') + + if any(idx_values_ >= self.acados_ocp.dims.np): + raise Exception(f'idx_values_ contains value >= np = {self.acados_ocp.dims.np}') + + stage = c_int(stage_) + n_update = c_int(len(param_values_)) + + param_data = cast(param_values_.ctypes.data, POINTER(c_double)) + c_idx_values = np.ascontiguousarray(idx_values_, dtype=np.intc) + idx_data = cast(c_idx_values.ctypes.data, POINTER(c_int)) + + getattr(self.shared_lib, f"{self.model_name}_acados_update_params_sparse").argtypes = \ + [c_void_p, c_int, POINTER(c_int), POINTER(c_double), c_int] + getattr(self.shared_lib, f"{self.model_name}_acados_update_params_sparse").restype = c_int + getattr(self.shared_lib, f"{self.model_name}_acados_update_params_sparse") \ + (self.capsule, stage, idx_data, param_data, n_update) + + def __del__(self): + if self.solver_created: + getattr(self.shared_lib, f"{self.model_name}_acados_free").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_free").restype = c_int + getattr(self.shared_lib, f"{self.model_name}_acados_free")(self.capsule) + + getattr(self.shared_lib, f"{self.model_name}_acados_free_capsule").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_free_capsule").restype = c_int + getattr(self.shared_lib, f"{self.model_name}_acados_free_capsule")(self.capsule) + + try: + self.dlclose(self.shared_lib._handle) + except: + print(f"WARNING: acados Python interface could not close shared_lib handle of AcadosOcpSolver {self.model_name}.\n", + "Attempting to create a new one with the same name will likely result in the old one being used!") + pass diff --git a/iqpilot/third_party/acados/acados_template/acados_sim.py b/iqpilot/third_party/acados/acados_template/acados_sim.py new file mode 100644 index 000000000..7faa49fb1 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/acados_sim.py @@ -0,0 +1,366 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +import numpy as np +import os +from .acados_model import AcadosModel +from .utils import get_acados_path, get_lib_ext + +class AcadosSimDims: + """ + Class containing the dimensions of the model to be simulated. + """ + def __init__(self): + self.__nx = None + self.__nu = None + self.__nz = 0 + self.__np = 0 + + @property + def nx(self): + """:math:`n_x` - number of states. Type: int > 0""" + return self.__nx + + @property + def nz(self): + """:math:`n_z` - number of algebraic variables. Type: int >= 0""" + return self.__nz + + @property + def nu(self): + """:math:`n_u` - number of inputs. Type: int >= 0""" + return self.__nu + + @property + def np(self): + """:math:`n_p` - number of parameters. Type: int >= 0""" + return self.__np + + @nx.setter + def nx(self, nx): + if isinstance(nx, int) and nx > 0: + self.__nx = nx + else: + raise Exception('Invalid nx value, expected positive integer.') + + @nz.setter + def nz(self, nz): + if isinstance(nz, int) and nz > -1: + self.__nz = nz + else: + raise Exception('Invalid nz value, expected nonnegative integer.') + + @nu.setter + def nu(self, nu): + if isinstance(nu, int) and nu > -1: + self.__nu = nu + else: + raise Exception('Invalid nu value, expected nonnegative integer.') + + @np.setter + def np(self, np): + if isinstance(np, int) and np > -1: + self.__np = np + else: + raise Exception('Invalid np value, expected nonnegative integer.') + + def set(self, attr, value): + setattr(self, attr, value) + + +class AcadosSimOpts: + """ + class containing the solver options + """ + def __init__(self): + self.__integrator_type = 'ERK' + self.__collocation_type = 'GAUSS_LEGENDRE' + self.__Tsim = None + # ints + self.__sim_method_num_stages = 1 + self.__sim_method_num_steps = 1 + self.__sim_method_newton_iter = 3 + # doubles + self.__sim_method_newton_tol = 0.0 + # bools + self.__sens_forw = True + self.__sens_adj = False + self.__sens_algebraic = False + self.__sens_hess = False + self.__output_z = True + self.__sim_method_jac_reuse = 0 + self.__ext_fun_compile_flags = '-O2' + + @property + def integrator_type(self): + """Integrator type. Default: 'ERK'.""" + return self.__integrator_type + + @property + def num_stages(self): + """Number of stages in the integrator. Default: 1""" + return self.__sim_method_num_stages + + @property + def num_steps(self): + """Number of steps in the integrator. Default: 1""" + return self.__sim_method_num_steps + + @property + def newton_iter(self): + """Number of Newton iterations in simulation method. Default: 3""" + return self.__sim_method_newton_iter + + @property + def newton_tol(self): + """ + Tolerance for Newton system solved in implicit integrator (IRK, GNSF). + 0.0 means this is not used and exactly newton_iter iterations are carried out. + Default: 0.0 + """ + return self.__sim_method_newton_tol + + @property + def sens_forw(self): + """Boolean determining if forward sensitivities are computed. Default: True""" + return self.__sens_forw + + @property + def sens_adj(self): + """Boolean determining if adjoint sensitivities are computed. Default: False""" + return self.__sens_adj + + @property + def sens_algebraic(self): + """Boolean determining if sensitivities wrt algebraic variables are computed. Default: False""" + return self.__sens_algebraic + + @property + def sens_hess(self): + """Boolean determining if hessians are computed. Default: False""" + return self.__sens_hess + + @property + def output_z(self): + """Boolean determining if values for algebraic variables (corresponding to start of simulation interval) are computed. Default: True""" + return self.__output_z + + @property + def sim_method_jac_reuse(self): + """Integer determining if jacobians are reused (0 or 1). Default: 0""" + return self.__sim_method_jac_reuse + + @property + def T(self): + """Time horizon""" + return self.__Tsim + + @property + def collocation_type(self): + """Collocation type: relevant for implicit integrators + -- string in {GAUSS_RADAU_IIA, GAUSS_LEGENDRE} + + Default: GAUSS_LEGENDRE + """ + return self.__collocation_type + + @property + def ext_fun_compile_flags(self): + """ + String with compiler flags for external function compilation. + Default: '-O2'. + """ + return self.__ext_fun_compile_flags + + @ext_fun_compile_flags.setter + def ext_fun_compile_flags(self, ext_fun_compile_flags): + if isinstance(ext_fun_compile_flags, str): + self.__ext_fun_compile_flags = ext_fun_compile_flags + else: + raise Exception('Invalid ext_fun_compile_flags, expected a string.\n') + + @integrator_type.setter + def integrator_type(self, integrator_type): + integrator_types = ('ERK', 'IRK', 'GNSF') + if integrator_type in integrator_types: + self.__integrator_type = integrator_type + else: + raise Exception('Invalid integrator_type value. Possible values are:\n\n' \ + + ',\n'.join(integrator_types) + '.\n\nYou have: ' + integrator_type + '.\n\n') + + @collocation_type.setter + def collocation_type(self, collocation_type): + collocation_types = ('GAUSS_RADAU_IIA', 'GAUSS_LEGENDRE') + if collocation_type in collocation_types: + self.__collocation_type = collocation_type + else: + raise Exception('Invalid collocation_type value. Possible values are:\n\n' \ + + ',\n'.join(collocation_types) + '.\n\nYou have: ' + collocation_type + '.\n\n') + + @T.setter + def T(self, T): + self.__Tsim = T + + @num_stages.setter + def num_stages(self, num_stages): + if isinstance(num_stages, int): + self.__sim_method_num_stages = num_stages + else: + raise Exception('Invalid num_stages value. num_stages must be an integer.') + + @num_steps.setter + def num_steps(self, num_steps): + if isinstance(num_steps, int): + self.__sim_method_num_steps = num_steps + else: + raise Exception('Invalid num_steps value. num_steps must be an integer.') + + @newton_iter.setter + def newton_iter(self, newton_iter): + if isinstance(newton_iter, int): + self.__sim_method_newton_iter = newton_iter + else: + raise Exception('Invalid newton_iter value. newton_iter must be an integer.') + + @newton_tol.setter + def newton_tol(self, newton_tol): + if isinstance(newton_tol, float): + self.__sim_method_newton_tol = newton_tol + else: + raise Exception('Invalid newton_tol value. newton_tol must be an float.') + + @sens_forw.setter + def sens_forw(self, sens_forw): + if sens_forw in (True, False): + self.__sens_forw = sens_forw + else: + raise Exception('Invalid sens_forw value. sens_forw must be a Boolean.') + + @sens_adj.setter + def sens_adj(self, sens_adj): + if sens_adj in (True, False): + self.__sens_adj = sens_adj + else: + raise Exception('Invalid sens_adj value. sens_adj must be a Boolean.') + + @sens_hess.setter + def sens_hess(self, sens_hess): + if sens_hess in (True, False): + self.__sens_hess = sens_hess + else: + raise Exception('Invalid sens_hess value. sens_hess must be a Boolean.') + + @sens_algebraic.setter + def sens_algebraic(self, sens_algebraic): + if sens_algebraic in (True, False): + self.__sens_algebraic = sens_algebraic + else: + raise Exception('Invalid sens_algebraic value. sens_algebraic must be a Boolean.') + + @output_z.setter + def output_z(self, output_z): + if output_z in (True, False): + self.__output_z = output_z + else: + raise Exception('Invalid output_z value. output_z must be a Boolean.') + + @sim_method_jac_reuse.setter + def sim_method_jac_reuse(self, sim_method_jac_reuse): + if sim_method_jac_reuse in (0, 1): + self.__sim_method_jac_reuse = sim_method_jac_reuse + else: + raise Exception('Invalid sim_method_jac_reuse value. sim_method_jac_reuse must be 0 or 1.') + +class AcadosSim: + """ + The class has the following properties that can be modified to formulate a specific simulation problem, see below: + + :param acados_path: string with the path to acados. It is used to generate the include and lib paths. + + - :py:attr:`dims` of type :py:class:`acados_template.acados_ocp.AcadosSimDims` - are automatically detected from model + - :py:attr:`model` of type :py:class:`acados_template.acados_model.AcadosModel` + - :py:attr:`solver_options` of type :py:class:`acados_template.acados_sim.AcadosSimOpts` + + - :py:attr:`acados_include_path` (set automatically) + - :py:attr:`shared_lib_ext` (set automatically) + - :py:attr:`acados_lib_path` (set automatically) + - :py:attr:`parameter_values` - used to initialize the parameters (can be changed) + + """ + def __init__(self, acados_path=''): + if acados_path == '': + acados_path = get_acados_path() + self.dims = AcadosSimDims() + """Dimension definitions, automatically detected from :py:attr:`model`. Type :py:class:`acados_template.acados_sim.AcadosSimDims`""" + self.model = AcadosModel() + """Model definitions, type :py:class:`acados_template.acados_model.AcadosModel`""" + self.solver_options = AcadosSimOpts() + """Solver Options, type :py:class:`acados_template.acados_sim.AcadosSimOpts`""" + + self.acados_include_path = os.path.join(acados_path, 'include').replace(os.sep, '/') # the replace part is important on Windows for CMake + """Path to acados include directory (set automatically), type: `string`""" + self.acados_lib_path = os.path.join(acados_path, 'lib').replace(os.sep, '/') # the replace part is important on Windows for CMake + """Path to where acados library is located (set automatically), type: `string`""" + + self.code_export_directory = 'c_generated_code' + """Path to where code will be exported. Default: `c_generated_code`.""" + self.shared_lib_ext = get_lib_ext() + + # get cython paths + from sysconfig import get_paths + self.cython_include_dirs = [np.get_include(), get_paths()['include']] + + self.__parameter_values = np.array([]) + self.__problem_class = 'SIM' + + @property + def parameter_values(self): + """:math:`p` - initial values for parameter - can be updated""" + return self.__parameter_values + + @parameter_values.setter + def parameter_values(self, parameter_values): + if isinstance(parameter_values, np.ndarray): + self.__parameter_values = parameter_values + else: + raise Exception('Invalid parameter_values value. ' + + f'Expected numpy array, got {type(parameter_values)}.') + + def set(self, attr, value): + # tokenize string + tokens = attr.split('_', 1) + if len(tokens) > 1: + setter_to_call = getattr(getattr(self, tokens[0]), 'set') + else: + setter_to_call = getattr(self, 'set') + + setter_to_call(tokens[1], value) + + return diff --git a/iqpilot/third_party/acados/acados_template/acados_sim_layout.json b/iqpilot/third_party/acados/acados_template/acados_sim_layout.json new file mode 100644 index 000000000..e3ca4b575 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/acados_sim_layout.json @@ -0,0 +1,53 @@ +{ + "acados_include_path": [ + "str" + ], + "model": { + "name" : [ + "str" + ] + }, + "acados_lib_path": [ + "str" + ], + "dims": { + "np": [ + "int" + ], + "nu": [ + "int" + ], + "nx": [ + "int" + ], + "nz": [ + "int" + ] + }, + "solver_options": { + "integrator_type": [ + "str" + ], + "collocation_type": [ + "str" + ], + "Tsim": [ + "float" + ], + "sim_method_num_stages": [ + "int" + ], + "sim_method_num_steps": [ + "int" + ], + "sim_method_newton_iter": [ + "int" + ], + "sim_method_newton_tol": [ + "float" + ], + "ext_fun_compile_flags": [ + "str" + ] + } +} diff --git a/iqpilot/third_party/acados/acados_template/acados_sim_solver.py b/iqpilot/third_party/acados/acados_template/acados_sim_solver.py new file mode 100644 index 000000000..de5ee1070 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/acados_sim_solver.py @@ -0,0 +1,558 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +import sys +import os +import json +import importlib + +import numpy as np + +from subprocess import DEVNULL, call, STDOUT + +from ctypes import POINTER, cast, CDLL, c_void_p, c_char_p, c_double, c_int, c_bool, byref +from copy import deepcopy + +from .casadi_function_generation import generate_c_code_implicit_ode, generate_c_code_gnsf, generate_c_code_explicit_ode +from .acados_sim import AcadosSim +from .acados_ocp import AcadosOcp +from .utils import is_column, render_template, format_class_dict, make_object_json_dumpable,\ + make_model_consistent, set_up_imported_gnsf_model, get_python_interface_path, get_lib_ext,\ + casadi_length, is_empty, check_casadi_version +from .builders import CMakeBuilder +from .gnsf.detect_gnsf_structure import detect_gnsf_structure + + + +def make_sim_dims_consistent(acados_sim: AcadosSim): + dims = acados_sim.dims + model = acados_sim.model + # nx + if is_column(model.x): + dims.nx = casadi_length(model.x) + else: + raise Exception('model.x should be column vector!') + + # nu + if is_empty(model.u): + dims.nu = 0 + else: + dims.nu = casadi_length(model.u) + + # nz + if is_empty(model.z): + dims.nz = 0 + else: + dims.nz = casadi_length(model.z) + + # np + if is_empty(model.p): + dims.np = 0 + else: + dims.np = casadi_length(model.p) + if acados_sim.parameter_values.shape[0] != dims.np: + raise Exception('inconsistent dimension np, regarding model.p and parameter_values.' + \ + f'\nGot np = {dims.np}, acados_sim.parameter_values.shape = {acados_sim.parameter_values.shape[0]}\n') + + +def get_sim_layout(): + python_interface_path = get_python_interface_path() + abs_path = os.path.join(python_interface_path, 'acados_sim_layout.json') + with open(abs_path, 'r') as f: + sim_layout = json.load(f) + return sim_layout + + +def sim_formulation_json_dump(acados_sim: AcadosSim, json_file='acados_sim.json'): + # Load acados_sim structure description + sim_layout = get_sim_layout() + + # Copy input sim object dictionary + sim_dict = dict(deepcopy(acados_sim).__dict__) + + for key, v in sim_layout.items(): + # skip non dict attributes + if not isinstance(v, dict): continue + # Copy sim object attributes dictionaries + sim_dict[key]=dict(getattr(acados_sim, key).__dict__) + + sim_json = format_class_dict(sim_dict) + + with open(json_file, 'w') as f: + json.dump(sim_json, f, default=make_object_json_dumpable, indent=4, sort_keys=True) + + +def sim_get_default_cmake_builder() -> CMakeBuilder: + """ + If :py:class:`~acados_template.acados_sim_solver.AcadosSimSolver` is used with `CMake` this function returns a good first setting. + :return: default :py:class:`~acados_template.builders.CMakeBuilder` + """ + cmake_builder = CMakeBuilder() + cmake_builder.options_on = ['BUILD_ACADOS_SIM_SOLVER_LIB'] + return cmake_builder + + +def sim_render_templates(json_file, model_name: str, code_export_dir, cmake_options: CMakeBuilder = None): + # setting up loader and environment + json_path = os.path.join(os.getcwd(), json_file) + + if not os.path.exists(json_path): + raise Exception(f"{json_path} not found!") + + # Render templates + in_file = 'acados_sim_solver.in.c' + out_file = f'acados_sim_solver_{model_name}.c' + render_template(in_file, out_file, code_export_dir, json_path) + + in_file = 'acados_sim_solver.in.h' + out_file = f'acados_sim_solver_{model_name}.h' + render_template(in_file, out_file, code_export_dir, json_path) + + in_file = 'acados_sim_solver.in.pxd' + out_file = f'acados_sim_solver.pxd' + render_template(in_file, out_file, code_export_dir, json_path) + + # Builder + if cmake_options is not None: + in_file = 'CMakeLists.in.txt' + out_file = 'CMakeLists.txt' + render_template(in_file, out_file, code_export_dir, json_path) + else: + in_file = 'Makefile.in' + out_file = 'Makefile' + render_template(in_file, out_file, code_export_dir, json_path) + + in_file = 'main_sim.in.c' + out_file = f'main_sim_{model_name}.c' + render_template(in_file, out_file, code_export_dir, json_path) + + # folder model + model_dir = os.path.join(code_export_dir, model_name + '_model') + + in_file = 'model.in.h' + out_file = f'{model_name}_model.h' + render_template(in_file, out_file, model_dir, json_path) + + +def sim_generate_external_functions(acados_sim: AcadosSim): + model = acados_sim.model + model = make_model_consistent(model) + + integrator_type = acados_sim.solver_options.integrator_type + + opts = dict(generate_hess = acados_sim.solver_options.sens_hess, + code_export_directory = acados_sim.code_export_directory) + + # create code_export_dir, model_dir + code_export_dir = acados_sim.code_export_directory + opts['code_export_directory'] = code_export_dir + model_dir = os.path.join(code_export_dir, model.name + '_model') + if not os.path.exists(model_dir): + os.makedirs(model_dir) + + # generate external functions + check_casadi_version() + if integrator_type == 'ERK': + generate_c_code_explicit_ode(model, opts) + elif integrator_type == 'IRK': + generate_c_code_implicit_ode(model, opts) + elif integrator_type == 'GNSF': + generate_c_code_gnsf(model, opts) + + +class AcadosSimSolver: + """ + Class to interact with the acados integrator C object. + + :param acados_sim: type :py:class:`~acados_template.acados_ocp.AcadosOcp` (takes values to generate an instance :py:class:`~acados_template.acados_sim.AcadosSim`) or :py:class:`~acados_template.acados_sim.AcadosSim` + :param json_file: Default: 'acados_sim.json' + :param build: Default: True + :param cmake_builder: type :py:class:`~acados_template.utils.CMakeBuilder` generate a `CMakeLists.txt` and use + the `CMake` pipeline instead of a `Makefile` (`CMake` seems to be the better option in conjunction with + `MS Visual Studio`); default: `None` + """ + if sys.platform=="win32": + from ctypes import wintypes + from ctypes import WinDLL + dlclose = WinDLL('kernel32', use_last_error=True).FreeLibrary + dlclose.argtypes = [wintypes.HMODULE] + else: + dlclose = CDLL(None).dlclose + dlclose.argtypes = [c_void_p] + + + @classmethod + def generate(cls, acados_sim: AcadosSim, json_file='acados_sim.json', cmake_builder: CMakeBuilder = None): + """ + Generates the code for an acados sim solver, given the description in acados_sim + """ + + acados_sim.code_export_directory = os.path.abspath(acados_sim.code_export_directory) + + # make dims consistent + make_sim_dims_consistent(acados_sim) + + # module dependent post processing + if acados_sim.solver_options.integrator_type == 'GNSF': + if acados_sim.solver_options.sens_hess == True: + raise Exception("AcadosSimSolver: GNSF does not support sens_hess = True.") + if 'gnsf_model' in acados_sim.__dict__: + set_up_imported_gnsf_model(acados_sim) + else: + detect_gnsf_structure(acados_sim) + + # generate external functions + sim_generate_external_functions(acados_sim) + + # dump to json + sim_formulation_json_dump(acados_sim, json_file) + + # render templates + sim_render_templates(json_file, acados_sim.model.name, acados_sim.code_export_directory, cmake_builder) + + + @classmethod + def build(cls, code_export_dir, with_cython=False, cmake_builder: CMakeBuilder = None, verbose: bool = True): + # Compile solver + cwd = os.getcwd() + os.chdir(code_export_dir) + if with_cython: + call( + ['make', 'clean_sim_cython'], + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + call( + ['make', 'sim_cython'], + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + else: + if cmake_builder is not None: + cmake_builder.exec(code_export_dir, verbose=verbose) + else: + call( + ['make', 'sim_shared_lib'], + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + os.chdir(cwd) + + + @classmethod + def create_cython_solver(cls, json_file): + """ + """ + with open(json_file, 'r') as f: + acados_sim_json = json.load(f) + code_export_directory = acados_sim_json['code_export_directory'] + + importlib.invalidate_caches() + rel_code_export_directory = os.path.relpath(code_export_directory) + acados_sim_solver_pyx = importlib.import_module(f'{rel_code_export_directory}.acados_sim_solver_pyx') + + AcadosSimSolverCython = getattr(acados_sim_solver_pyx, 'AcadosSimSolverCython') + return AcadosSimSolverCython(acados_sim_json['model']['name']) + + def __init__(self, acados_sim, json_file='acados_sim.json', generate=True, build=True, cmake_builder: CMakeBuilder = None, verbose: bool = True): + + self.solver_created = False + self.acados_sim = acados_sim + model_name = acados_sim.model.name + self.model_name = model_name + + code_export_dir = os.path.abspath(acados_sim.code_export_directory) + + # reuse existing json and casadi functions, when creating integrator from ocp + if generate and not isinstance(acados_sim, AcadosOcp): + self.generate(acados_sim, json_file=json_file, cmake_builder=cmake_builder) + + if build: + self.build(code_export_dir, cmake_builder=cmake_builder, verbose=True) + + # prepare library loading + lib_prefix = 'lib' + lib_ext = get_lib_ext() + if os.name == 'nt': + lib_prefix = '' + + # Load acados library to avoid unloading the library. + # This is necessary if acados was compiled with OpenMP, since the OpenMP threads can't be destroyed. + # Unloading a library which uses OpenMP results in a segfault (on any platform?). + # see [https://stackoverflow.com/questions/34439956/vc-crash-when-freeing-a-dll-built-with-openmp] + # or [https://python.hotexamples.com/examples/_ctypes/-/dlclose/python-dlclose-function-examples.html] + libacados_name = f'{lib_prefix}acados{lib_ext}' + libacados_filepath = os.path.join(acados_sim.acados_lib_path, libacados_name) + self.__acados_lib = CDLL(libacados_filepath) + # find out if acados was compiled with OpenMP + try: + self.__acados_lib_uses_omp = getattr(self.__acados_lib, 'omp_get_thread_num') is not None + except AttributeError as e: + self.__acados_lib_uses_omp = False + if self.__acados_lib_uses_omp: + print('acados was compiled with OpenMP.') + else: + print('acados was compiled without OpenMP.') + libacados_sim_solver_name = f'{lib_prefix}acados_sim_solver_{self.model_name}{lib_ext}' + self.shared_lib_name = os.path.join(code_export_dir, libacados_sim_solver_name) + + # get shared_lib + self.shared_lib = CDLL(self.shared_lib_name) + + # create capsule + getattr(self.shared_lib, f"{model_name}_acados_sim_solver_create_capsule").restype = c_void_p + self.capsule = getattr(self.shared_lib, f"{model_name}_acados_sim_solver_create_capsule")() + + # create solver + getattr(self.shared_lib, f"{model_name}_acados_sim_create").argtypes = [c_void_p] + getattr(self.shared_lib, f"{model_name}_acados_sim_create").restype = c_int + assert getattr(self.shared_lib, f"{model_name}_acados_sim_create")(self.capsule)==0 + self.solver_created = True + + getattr(self.shared_lib, f"{model_name}_acados_get_sim_opts").argtypes = [c_void_p] + getattr(self.shared_lib, f"{model_name}_acados_get_sim_opts").restype = c_void_p + self.sim_opts = getattr(self.shared_lib, f"{model_name}_acados_get_sim_opts")(self.capsule) + + getattr(self.shared_lib, f"{model_name}_acados_get_sim_dims").argtypes = [c_void_p] + getattr(self.shared_lib, f"{model_name}_acados_get_sim_dims").restype = c_void_p + self.sim_dims = getattr(self.shared_lib, f"{model_name}_acados_get_sim_dims")(self.capsule) + + getattr(self.shared_lib, f"{model_name}_acados_get_sim_config").argtypes = [c_void_p] + getattr(self.shared_lib, f"{model_name}_acados_get_sim_config").restype = c_void_p + self.sim_config = getattr(self.shared_lib, f"{model_name}_acados_get_sim_config")(self.capsule) + + getattr(self.shared_lib, f"{model_name}_acados_get_sim_out").argtypes = [c_void_p] + getattr(self.shared_lib, f"{model_name}_acados_get_sim_out").restype = c_void_p + self.sim_out = getattr(self.shared_lib, f"{model_name}_acados_get_sim_out")(self.capsule) + + getattr(self.shared_lib, f"{model_name}_acados_get_sim_in").argtypes = [c_void_p] + getattr(self.shared_lib, f"{model_name}_acados_get_sim_in").restype = c_void_p + self.sim_in = getattr(self.shared_lib, f"{model_name}_acados_get_sim_in")(self.capsule) + + getattr(self.shared_lib, f"{model_name}_acados_get_sim_solver").argtypes = [c_void_p] + getattr(self.shared_lib, f"{model_name}_acados_get_sim_solver").restype = c_void_p + self.sim_solver = getattr(self.shared_lib, f"{model_name}_acados_get_sim_solver")(self.capsule) + + self.gettable_vectors = ['x', 'u', 'z', 'S_adj'] + self.gettable_matrices = ['S_forw', 'Sx', 'Su', 'S_hess', 'S_algebraic'] + self.gettable_scalars = ['CPUtime', 'time_tot', 'ADtime', 'time_ad', 'LAtime', 'time_la'] + + + def simulate(self, x=None, u=None, z=None, p=None): + """ + Simulate the system forward for the given x, u, z, p and return x_next. + Wrapper around `solve()` taking care of setting/getting inputs/outputs. + """ + if x is not None: + self.set('x', x) + if u is not None: + self.set('u', u) + if z is not None: + self.set('z', z) + if p is not None: + self.set('p', p) + + status = self.solve() + + if status == 2: + print("Warning: acados_sim_solver reached maximum iterations.") + elif status != 0: + raise Exception(f'acados_sim_solver for model {self.model_name} returned status {status}.') + + x_next = self.get('x') + return x_next + + + def solve(self): + """ + Solve the simulation problem with current input. + """ + getattr(self.shared_lib, f"{self.model_name}_acados_sim_solve").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_sim_solve").restype = c_int + + status = getattr(self.shared_lib, f"{self.model_name}_acados_sim_solve")(self.capsule) + return status + + + def get(self, field_): + """ + Get the last solution of the solver. + + :param str field: string in ['x', 'u', 'z', 'S_forw', 'Sx', 'Su', 'S_adj', 'S_hess', 'S_algebraic', 'CPUtime', 'time_tot', 'ADtime', 'time_ad', 'LAtime', 'time_la'] + """ + field = field_.encode('utf-8') + + if field_ in self.gettable_vectors: + # get dims + dims = np.ascontiguousarray(np.zeros((2,)), dtype=np.intc) + dims_data = cast(dims.ctypes.data, POINTER(c_int)) + + self.shared_lib.sim_dims_get_from_attr.argtypes = [c_void_p, c_void_p, c_char_p, POINTER(c_int)] + self.shared_lib.sim_dims_get_from_attr(self.sim_config, self.sim_dims, field, dims_data) + + # allocate array + out = np.ascontiguousarray(np.zeros((dims[0],)), dtype=np.float64) + out_data = cast(out.ctypes.data, POINTER(c_double)) + + self.shared_lib.sim_out_get.argtypes = [c_void_p, c_void_p, c_void_p, c_char_p, c_void_p] + self.shared_lib.sim_out_get(self.sim_config, self.sim_dims, self.sim_out, field, out_data) + + elif field_ in self.gettable_matrices: + # get dims + dims = np.ascontiguousarray(np.zeros((2,)), dtype=np.intc) + dims_data = cast(dims.ctypes.data, POINTER(c_int)) + + self.shared_lib.sim_dims_get_from_attr.argtypes = [c_void_p, c_void_p, c_char_p, POINTER(c_int)] + self.shared_lib.sim_dims_get_from_attr(self.sim_config, self.sim_dims, field, dims_data) + + out = np.zeros((dims[0], dims[1]), order='F') + out_data = cast(out.ctypes.data, POINTER(c_double)) + + self.shared_lib.sim_out_get.argtypes = [c_void_p, c_void_p, c_void_p, c_char_p, c_void_p] + self.shared_lib.sim_out_get(self.sim_config, self.sim_dims, self.sim_out, field, out_data) + + elif field_ in self.gettable_scalars: + scalar = c_double() + scalar_data = byref(scalar) + self.shared_lib.sim_out_get.argtypes = [c_void_p, c_void_p, c_void_p, c_char_p, c_void_p] + self.shared_lib.sim_out_get(self.sim_config, self.sim_dims, self.sim_out, field, scalar_data) + + out = scalar.value + else: + raise Exception(f'AcadosSimSolver.get(): Unknown field {field_},' \ + f' available fields are {", ".join(self.gettable_vectors+self.gettable_matrices)}, {", ".join(self.gettable_scalars)}') + + return out + + + + def set(self, field_: str, value_): + """ + Set numerical data inside the solver. + + :param field: string in ['x', 'u', 'p', 'xdot', 'z', 'seed_adj', 'T'] + :param value: the value with appropriate size. + """ + settable = ['x', 'u', 'p', 'xdot', 'z', 'seed_adj', 'T'] # S_forw + + # TODO: check and throw error here. then remove checks in Cython for speed + # cast value_ to avoid conversion issues + if isinstance(value_, (float, int)): + value_ = np.array([value_]) + + value_ = value_.astype(float) + value_data = cast(value_.ctypes.data, POINTER(c_double)) + value_data_p = cast((value_data), c_void_p) + + field = field_.encode('utf-8') + + # treat parameters separately + if field_ == 'p': + model_name = self.acados_sim.model.name + getattr(self.shared_lib, f"{model_name}_acados_sim_update_params").argtypes = [c_void_p, POINTER(c_double), c_int] + value_data = cast(value_.ctypes.data, POINTER(c_double)) + getattr(self.shared_lib, f"{model_name}_acados_sim_update_params")(self.capsule, value_data, value_.shape[0]) + return + else: + # dimension check + dims = np.ascontiguousarray(np.zeros((2,)), dtype=np.intc) + dims_data = cast(dims.ctypes.data, POINTER(c_int)) + + self.shared_lib.sim_dims_get_from_attr.argtypes = [c_void_p, c_void_p, c_char_p, POINTER(c_int)] + self.shared_lib.sim_dims_get_from_attr(self.sim_config, self.sim_dims, field, dims_data) + + value_ = np.ravel(value_, order='F') + + value_shape = value_.shape + if len(value_shape) == 1: + value_shape = (value_shape[0], 0) + + if value_shape != tuple(dims): + raise Exception(f'AcadosSimSolver.set(): mismatching dimension' \ + f' for field "{field_}" with dimension {tuple(dims)} (you have {value_shape}).') + + # set + if field_ in ['xdot', 'z']: + self.shared_lib.sim_solver_set.argtypes = [c_void_p, c_char_p, c_void_p] + self.shared_lib.sim_solver_set(self.sim_solver, field, value_data_p) + elif field_ in settable: + self.shared_lib.sim_in_set.argtypes = [c_void_p, c_void_p, c_void_p, c_char_p, c_void_p] + self.shared_lib.sim_in_set(self.sim_config, self.sim_dims, self.sim_in, field, value_data_p) + else: + raise Exception(f'AcadosSimSolver.set(): Unknown field {field_},' \ + f' available fields are {", ".join(settable)}') + + return + + + def options_set(self, field_: str, value_: bool): + """ + Set solver options + + :param field: string in ['sens_forw', 'sens_adj', 'sens_hess'] + :param value: Boolean + """ + fields = ['sens_forw', 'sens_adj', 'sens_hess'] + if field_ not in fields: + raise Exception(f"field {field_} not supported. Supported values are {', '.join(fields)}.\n") + + field = field_.encode('utf-8') + value_ctypes = c_bool(value_) + + if not isinstance(value_, bool): + raise TypeError("options_set: expected boolean for value") + + # only allow setting + if getattr(self.acados_sim.solver_options, field_) or value_ == False: + self.shared_lib.sim_opts_set.argtypes = [c_void_p, c_void_p, c_char_p, POINTER(c_bool)] + self.shared_lib.sim_opts_set(self.sim_config, self.sim_opts, field, value_ctypes) + else: + raise RuntimeError(f"Cannot set option {field_} to True, because it was False in original solver options.\n") + + return + + + def __del__(self): + + if self.solver_created: + getattr(self.shared_lib, f"{self.model_name}_acados_sim_free").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_sim_free").restype = c_int + getattr(self.shared_lib, f"{self.model_name}_acados_sim_free")(self.capsule) + + getattr(self.shared_lib, f"{self.model_name}_acados_sim_solver_free_capsule").argtypes = [c_void_p] + getattr(self.shared_lib, f"{self.model_name}_acados_sim_solver_free_capsule").restype = c_int + getattr(self.shared_lib, f"{self.model_name}_acados_sim_solver_free_capsule")(self.capsule) + + try: + self.dlclose(self.shared_lib._handle) + except: + print(f"WARNING: acados Python interface could not close shared_lib handle of AcadosSimSolver {self.model_name}.\n", + "Attempting to create a new one with the same name will likely result in the old one being used!") + pass diff --git a/iqpilot/third_party/acados/acados_template/builders.py b/iqpilot/third_party/acados/acados_template/builders.py new file mode 100644 index 000000000..8acc05b52 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/builders.py @@ -0,0 +1,130 @@ +# +# Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, +# Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, +# Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, +# Jonas Koenemann, Yutao Chen, Tobias SchÃļls, Jonas Schlagenhauf, Moritz Diehl +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +import os +import sys +from subprocess import DEVNULL, call, STDOUT + + +class CMakeBuilder: + """ + Class to work with the `CMake` build system. + """ + def __init__(self): + self._source_dir = None # private source directory, this is set to code_export_dir + self.build_dir = 'build' + self._build_dir = None # private build directory, usually rendered to abspath(build_dir) + self.generator = None + """Defines the generator, options can be found via `cmake --help` under 'Generator'. Type: string. Linux default 'Unix Makefiles', Windows 'Visual Studio 15 2017 Win64'; default value: `None`.""" + # set something for Windows + if os.name == 'nt': + self.generator = 'Visual Studio 15 2017 Win64' + self.build_targets = None + """A comma-separated list of the build targets, if `None` then all targets will be build; type: List of strings; default: `None`.""" + self.options_on = None + """List of strings as CMake options which are translated to '-D Opt[0]=ON -D Opt[1]=ON ...'; default: `None`.""" + + # Generate the command string for handling the cmake command. + def get_cmd1_cmake(self): + defines_str = '' + if self.options_on is not None: + defines_arr = [f' -D{opt}=ON' for opt in self.options_on] + defines_str = ' '.join(defines_arr) + generator_str = '' + if self.generator is not None: + generator_str = f' -G"{self.generator}"' + return f'cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="{self._source_dir}"{defines_str}{generator_str} -Wdev -S"{self._source_dir}" -B"{self._build_dir}"' + + # Generate the command string for handling the build. + def get_cmd2_build(self): + import multiprocessing + cmd = f'cmake --build "{self._build_dir}" --config Release -j{multiprocessing.cpu_count()}' + if self.build_targets is not None: + cmd += f' -t {self.build_targets}' + return cmd + + # Generate the command string for handling the install command. + def get_cmd3_install(self): + return f'cmake --install "{self._build_dir}"' + + def exec(self, code_export_directory, verbose=True): + """ + Execute the compilation using `CMake` with the given settings. + :param code_export_directory: must be the absolute path to the directory where the code was exported to + """ + if(os.path.isabs(code_export_directory) is False): + print(f'(W) the code export directory "{code_export_directory}" is not an absolute path!') + self._source_dir = code_export_directory + self._build_dir = os.path.abspath(self.build_dir) + try: + os.mkdir(self._build_dir) + except FileExistsError as e: + pass + + try: + os.chdir(self._build_dir) + cmd_str = self.get_cmd1_cmake() + print(f'call("{cmd_str})"') + retcode = call( + cmd_str, + shell=True, + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + if retcode != 0: + raise RuntimeError(f'CMake command "{cmd_str}" was terminated by signal {retcode}') + cmd_str = self.get_cmd2_build() + print(f'call("{cmd_str}")') + retcode = call( + cmd_str, + shell=True, + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + if retcode != 0: + raise RuntimeError(f'Build command "{cmd_str}" was terminated by signal {retcode}') + cmd_str = self.get_cmd3_install() + print(f'call("{cmd_str}")') + retcode = call( + cmd_str, + shell=True, + stdout=None if verbose else DEVNULL, + stderr=None if verbose else STDOUT + ) + if retcode != 0: + raise RuntimeError(f'Install command "{cmd_str}" was terminated by signal {retcode}') + except OSError as e: + print("Execution failed:", e, file=sys.stderr) + except Exception as e: + print("Execution failed:", e, file=sys.stderr) + exit(1) diff --git a/iqpilot/third_party/acados/acados_template/c_templates_tera/CMakeLists.in.txt b/iqpilot/third_party/acados/acados_template/c_templates_tera/CMakeLists.in.txt new file mode 100644 index 000000000..99bc26f75 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/c_templates_tera/CMakeLists.in.txt @@ -0,0 +1,397 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +{%- if solver_options.qp_solver %} + {%- set qp_solver = solver_options.qp_solver %} +{%- else %} + {%- set qp_solver = "FULL_CONDENSING_HPIPM" %} +{%- endif %} + +{%- if solver_options.hessian_approx %} + {%- set hessian_approx = solver_options.hessian_approx %} +{%- elif solver_options.sens_hess %} + {%- set hessian_approx = "EXACT" %} +{%- else %} + {%- set hessian_approx = "GAUSS_NEWTON" %} +{%- endif %} + +{%- if constraints.constr_type %} + {%- set constr_type = constraints.constr_type %} +{%- else %} + {%- set constr_type = "NONE" %} +{%- endif %} + +{%- if constraints.constr_type_e %} + {%- set constr_type_e = constraints.constr_type_e %} +{%- else %} + {%- set constr_type_e = "NONE" %} +{%- endif %} + +{%- if cost.cost_type %} + {%- set cost_type = cost.cost_type %} +{%- else %} + {%- set cost_type = "NONE" %} +{%- endif %} + +{%- if cost.cost_type_e %} + {%- set cost_type_e = cost.cost_type_e %} +{%- else %} + {%- set cost_type_e = "NONE" %} +{%- endif %} + +{%- if cost.cost_type_0 %} + {%- set cost_type_0 = cost.cost_type_0 %} +{%- else %} + {%- set cost_type_0 = "NONE" %} +{%- endif %} + +{%- if dims.nh %} + {%- set dims_nh = dims.nh %} +{%- else %} + {%- set dims_nh = 0 %} +{%- endif %} + +{%- if dims.nphi %} + {%- set dims_nphi = dims.nphi %} +{%- else %} + {%- set dims_nphi = 0 %} +{%- endif %} + +{%- if dims.nh_e %} + {%- set dims_nh_e = dims.nh_e %} +{%- else %} + {%- set dims_nh_e = 0 %} +{%- endif %} + +{%- if dims.nphi_e %} + {%- set dims_nphi_e = dims.nphi_e %} +{%- else %} + {%- set dims_nphi_e = 0 %} +{%- endif %} + +{%- if solver_options.model_external_shared_lib_dir %} + {%- set model_external_shared_lib_dir = solver_options.model_external_shared_lib_dir %} +{%- endif %} + +{%- if solver_options.model_external_shared_lib_name %} + {%- set model_external_shared_lib_name = solver_options.model_external_shared_lib_name %} +{%- endif %} + +{#- control operator #} +{%- if os and os == "pc" %} + {%- set control = "&" %} +{%- else %} + {%- set control = ";" %} +{%- endif %} + +{%- if acados_link_libs and os and os == "pc" %}{# acados linking libraries and flags #} + {%- set link_libs = acados_link_libs.qpoases ~ " " ~ acados_link_libs.hpmpc ~ " " ~ acados_link_libs.osqp -%} + {%- set openmp_flag = acados_link_libs.openmp %} +{%- else %} + {%- set openmp_flag = " " %} + {%- if qp_solver == "FULL_CONDENSING_QPOASES" %} + {%- set link_libs = "-lqpOASES_e" %} + {%- elif qp_solver == "FULL_CONDENSING_DAQP" %} + {%- set link_libs = "-ldaqp" %} + {%- else %} + {%- set link_libs = "" %} + {%- endif %} +{%- endif %} + +cmake_minimum_required(VERSION 3.13) + +project({{ model.name }}) + +# build options. +option(BUILD_ACADOS_SOLVER_LIB "Should the solver library acados_solver_{{ model.name }} be build?" OFF) +option(BUILD_ACADOS_OCP_SOLVER_LIB "Should the OCP solver library acados_ocp_solver_{{ model.name }} be build?" OFF) +option(BUILD_EXAMPLE "Should the example main_{{ model.name }} be build?" OFF) +{%- if solver_options.integrator_type != "DISCRETE" %} +option(BUILD_SIM_EXAMPLE "Should the simulation example main_sim_{{ model.name }} be build?" OFF) +option(BUILD_ACADOS_SIM_SOLVER_LIB "Should the simulation solver library acados_sim_solver_{{ model.name }} be build?" OFF) +{%- endif %} + + +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_SYSTEM_NAME MATCHES "Windows") + # MinGW, change to .lib such that mex recognizes it + set(CMAKE_SHARED_LIBRARY_SUFFIX ".lib") + set(CMAKE_SHARED_LIBRARY_PREFIX "") +endif() + + +# object target names +set(MODEL_OBJ model_{{ model.name }}) +set(OCP_OBJ ocp_{{ model.name }}) +set(SIM_OBJ sim_{{ model.name }}) + +# model +set(MODEL_SRC + {%- if model.dyn_ext_fun_type == "casadi" %} +{%- if solver_options.integrator_type == "ERK" %} + {{ model.name }}_model/{{ model.name }}_expl_ode_fun.c + {{ model.name }}_model/{{ model.name }}_expl_vde_forw.c + {{ model.name }}_model/{{ model.name }}_expl_vde_adj.c + {%- if hessian_approx == "EXACT" %} + {{ model.name }}_model/{{ model.name }}_expl_ode_hess.c + {%- endif %} +{%- elif solver_options.integrator_type == "IRK" %} + {{ model.name }}_model/{{ model.name }}_impl_dae_fun.c + {{ model.name }}_model/{{ model.name }}_impl_dae_fun_jac_x_xdot_z.c + {{ model.name }}_model/{{ model.name }}_impl_dae_jac_x_xdot_u_z.c + {%- if hessian_approx == "EXACT" %} + {{ model.name }}_model/{{ model.name }}_impl_dae_hess.c + {%- endif %} +{%- elif solver_options.integrator_type == "LIFTED_IRK" %} + {{ model.name }}_model/{{ model.name }}_impl_dae_fun.c + {{ model.name }}_model/{{ model.name }}_impl_dae_fun_jac_x_xdot_u.c + {%- if hessian_approx == "EXACT" %} + {{ model.name }}_model/{{ model.name }}_impl_dae_hess.c + {%- endif %} +{%- elif solver_options.integrator_type == "GNSF" %} + {% if model.gnsf.purely_linear != 1 %} + {{ model.name }}_model/{{ model.name }}_gnsf_phi_fun.c + {{ model.name }}_model/{{ model.name }}_gnsf_phi_fun_jac_y.c + {{ model.name }}_model/{{ model.name }}_gnsf_phi_jac_y_uhat.c + {% if model.gnsf.nontrivial_f_LO == 1 %} + {{ model.name }}_model/{{ model.name }}_gnsf_f_lo_fun_jac_x1k1uz.c + {%- endif %} + {%- endif %} + {{ model.name }}_model/{{ model.name }}_gnsf_get_matrices_fun.c +{%- elif solver_options.integrator_type == "DISCRETE" %} + {{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun.c + {{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun_jac.c + {%- if hessian_approx == "EXACT" %} + {{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun_jac_hess.c + {%- endif %} +{%- endif -%} + {%- else %} + {{ model.name }}_model/{{ model.dyn_generic_source }} + {%- endif %} +) +add_library(${MODEL_OBJ} OBJECT ${MODEL_SRC} ) + +# optimal control problem - mostly CasADi exports +if(${BUILD_ACADOS_SOLVER_LIB} OR ${BUILD_ACADOS_OCP_SOLVER_LIB} OR ${BUILD_EXAMPLE}) + set(OCP_SRC +{%- if constr_type == "BGP" and dims_nphi > 0 %} + {{ model.name }}_constraints/{{ model.name }}_phi_constraint.c +{%- endif %} +{%- if constr_type_e == "BGP" and dims_nphi_e > 0 %} + {{ model.name }}_constraints/{{ model.name }}_phi_e_constraint.c +{%- endif %} + +{%- if constr_type == "BGH" and dims_nh > 0 %} + {{ model.name }}_constraints/{{ model.name }}_constr_h_fun_jac_uxt_zt.c + {{ model.name }}_constraints/{{ model.name }}_constr_h_fun.c + {%- if hessian_approx == "EXACT" %} + {{ model.name }}_constraints/{{ model.name }}_constr_h_fun_jac_uxt_zt_hess.c + {%- endif %} +{%- endif %} + +{%- if constr_type_e == "BGH" and dims_nh_e > 0 %} + {{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun_jac_uxt_zt.c + {{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun.c + {%- if hessian_approx == "EXACT" %} + {{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun_jac_uxt_zt_hess.c + {%- endif %} +{%- endif %} + +{%- if cost_type_0 == "NONLINEAR_LS" %} + {{ model.name }}_cost/{{ model.name }}_cost_y_0_fun.c + {{ model.name }}_cost/{{ model.name }}_cost_y_0_fun_jac_ut_xt.c + {{ model.name }}_cost/{{ model.name }}_cost_y_0_hess.c +{%- elif cost_type_0 == "CONVEX_OVER_NONLINEAR" %} + {{ model.name }}_cost/{{ model.name }}_conl_cost_0_fun.c + {{ model.name }}_cost/{{ model.name }}_conl_cost_0_fun_jac_hess.c +{%- elif cost_type_0 == "EXTERNAL" %} + {%- if cost.cost_ext_fun_type_0 == "casadi" %} + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun.c + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun_jac.c + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun_jac_hess.c + {%- else %} + {{ model.name }}_cost/{{ cost.cost_source_ext_cost_0 }} + {%- endif %} +{%- endif %} +{%- if cost_type == "NONLINEAR_LS" %} + {{ model.name }}_cost/{{ model.name }}_cost_y_fun.c + {{ model.name }}_cost/{{ model.name }}_cost_y_fun_jac_ut_xt.c + {{ model.name }}_cost/{{ model.name }}_cost_y_hess.c +{%- elif cost_type == "CONVEX_OVER_NONLINEAR" %} + {{ model.name }}_cost/{{ model.name }}_conl_cost_fun.c + {{ model.name }}_cost/{{ model.name }}_conl_cost_fun_jac_hess.c +{%- elif cost_type == "EXTERNAL" %} + {%- if cost.cost_ext_fun_type == "casadi" %} + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun.c + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun_jac.c + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun_jac_hess.c + {%- elif cost.cost_source_ext_cost != cost.cost_source_ext_cost_0 %} + {{ model.name }}_cost/{{ cost.cost_source_ext_cost }} + {%- endif %} +{%- endif %} +{%- if cost_type_e == "NONLINEAR_LS" %} + {{ model.name }}_cost/{{ model.name }}_cost_y_e_fun.c + {{ model.name }}_cost/{{ model.name }}_cost_y_e_fun_jac_ut_xt.c + {{ model.name }}_cost/{{ model.name }}_cost_y_e_hess.c +{%- elif cost_type_e == "CONVEX_OVER_NONLINEAR" %} + {{ model.name }}_cost/{{ model.name }}_conl_cost_e_fun.c + {{ model.name }}_cost/{{ model.name }}_conl_cost_e_fun_jac_hess.c +{%- elif cost_type_e == "EXTERNAL" %} + {%- if cost.cost_ext_fun_type_e == "casadi" %} + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun.c + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun_jac.c + {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun_jac_hess.c + {%- elif cost.cost_source_ext_cost_e != cost.cost_source_ext_cost_0 %} + {{ model.name }}_cost/{{ cost.cost_source_ext_cost_e }} + {%- endif %} +{%- endif %} + acados_solver_{{ model.name }}.c) + add_library(${OCP_OBJ} OBJECT ${OCP_SRC}) +endif() + +{%- if solver_options.integrator_type != "DISCRETE" %} +# for sim solver +if(${BUILD_ACADOS_SOLVER_LIB} OR ${BUILD_EXAMPLE} + {%- if solver_options.integrator_type != "DISCRETE" %} + OR ${BUILD_SIM_EXAMPLE} OR ${BUILD_ACADOS_SIM_SOLVER_LIB} + {%- endif -%} + ) + set(SIM_SRC acados_sim_solver_{{ model.name }}.c) + add_library(${SIM_OBJ} OBJECT ${SIM_SRC}) +endif() +{%- endif %} + +# for target example +set(EX_SRC main_{{ model.name }}.c) +set(EX_EXE main_{{ model.name }}) + +{%- if model_external_shared_lib_dir and model_external_shared_lib_name %} +set(EXTERNAL_DIR {{ model_external_shared_lib_dir | replace(from="\", to="/") }}) +set(EXTERNAL_LIB {{ model_external_shared_lib_name }}) +{%- else %} +set(EXTERNAL_DIR) +set(EXTERNAL_LIB) +{%- endif %} + +# set some search paths for preprocessor and linker +set(ACADOS_INCLUDE_PATH {{ acados_include_path | replace(from="\", to="/") }} CACHE PATH "Define the path which contains the include directory for acados.") +set(ACADOS_LIB_PATH {{ acados_lib_path | replace(from="\", to="/") }} CACHE PATH "Define the path which contains the lib directory for acados.") + +# c-compiler flags for debugging +set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb") + +set(CMAKE_C_FLAGS "-fPIC -std=c99 {{ openmp_flag }} +{%- if qp_solver == "FULL_CONDENSING_QPOASES" -%} + -DACADOS_WITH_QPOASES +{%- endif -%} +{%- if qp_solver == "FULL_CONDENSING_DAQP" -%} + -DACADOS_WITH_DAQP +{%- endif -%} +{%- if qp_solver == "PARTIAL_CONDENSING_OSQP" -%} + -DACADOS_WITH_OSQP +{%- endif -%} +{%- if qp_solver == "PARTIAL_CONDENSING_QPDUNES" -%} + -DACADOS_WITH_QPDUNES +{%- endif -%} +") +#-fno-diagnostics-show-line-numbers -g + +include_directories( + ${ACADOS_INCLUDE_PATH} + ${ACADOS_INCLUDE_PATH}/acados + ${ACADOS_INCLUDE_PATH}/blasfeo/include + ${ACADOS_INCLUDE_PATH}/hpipm/include +{%- if qp_solver == "FULL_CONDENSING_QPOASES" %} + ${ACADOS_INCLUDE_PATH}/qpOASES_e/ +{%- endif %} +{%- if qp_solver == "FULL_CONDENSING_DAQP" %} + ${ACADOS_INCLUDE_PATH}/daqp/include +{%- endif %} +) + +# linker flags +link_directories(${ACADOS_LIB_PATH}) + +# link to libraries +if(UNIX) + link_libraries(acados hpipm blasfeo m {{ link_libs }}) +else() + link_libraries(acados hpipm blasfeo {{ link_libs }}) +endif() + +# the targets + +# bundled_shared_lib +if(${BUILD_ACADOS_SOLVER_LIB}) + set(LIB_ACADOS_SOLVER acados_solver_{{ model.name }}) + add_library(${LIB_ACADOS_SOLVER} SHARED $ $ + {%- if solver_options.integrator_type != "DISCRETE" %} + $ + {%- endif -%} + ) + install(TARGETS ${LIB_ACADOS_SOLVER} DESTINATION ${CMAKE_INSTALL_PREFIX}) +endif(${BUILD_ACADOS_SOLVER_LIB}) + +# ocp_shared_lib +if(${BUILD_ACADOS_OCP_SOLVER_LIB}) + set(LIB_ACADOS_OCP_SOLVER acados_ocp_solver_{{ model.name }}) + add_library(${LIB_ACADOS_OCP_SOLVER} SHARED $ $) + # Specify libraries or flags to use when linking a given target and/or its dependents. + target_link_libraries(${LIB_ACADOS_OCP_SOLVER} PRIVATE ${EXTERNAL_LIB}) + target_link_directories(${LIB_ACADOS_OCP_SOLVER} PRIVATE ${EXTERNAL_DIR}) + install(TARGETS ${LIB_ACADOS_OCP_SOLVER} DESTINATION ${CMAKE_INSTALL_PREFIX}) +endif(${BUILD_ACADOS_OCP_SOLVER_LIB}) + +# example +if(${BUILD_EXAMPLE}) + add_executable(${EX_EXE} ${EX_SRC} $ $ + {%- if solver_options.integrator_type != "DISCRETE" %} + $ + {%- endif -%} + ) + install(TARGETS ${EX_EXE} DESTINATION ${CMAKE_INSTALL_PREFIX}) +endif(${BUILD_EXAMPLE}) + +{% if solver_options.integrator_type != "DISCRETE" -%} +# example_sim +if(${BUILD_SIM_EXAMPLE}) + set(EX_SIM_SRC main_sim_{{ model.name }}.c) + set(EX_SIM_EXE main_sim_{{ model.name }}) + add_executable(${EX_SIM_EXE} ${EX_SIM_SRC} $ $) + install(TARGETS ${EX_SIM_EXE} DESTINATION ${CMAKE_INSTALL_PREFIX}) +endif(${BUILD_SIM_EXAMPLE}) + +# sim_shared_lib +if(${BUILD_ACADOS_SIM_SOLVER_LIB}) + set(LIB_ACADOS_SIM_SOLVER acados_sim_solver_{{ model.name }}) + add_library(${LIB_ACADOS_SIM_SOLVER} SHARED $ $) + install(TARGETS ${LIB_ACADOS_SIM_SOLVER} DESTINATION ${CMAKE_INSTALL_PREFIX}) +endif(${BUILD_ACADOS_SIM_SOLVER_LIB}) +{%- endif %} + diff --git a/iqpilot/third_party/acados/acados_template/c_templates_tera/Makefile.in b/iqpilot/third_party/acados/acados_template/c_templates_tera/Makefile.in new file mode 100644 index 000000000..fbefc08e3 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/c_templates_tera/Makefile.in @@ -0,0 +1,468 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +{%- if solver_options.qp_solver %} + {%- set qp_solver = solver_options.qp_solver %} +{%- else %} + {%- set qp_solver = "FULL_CONDENSING_HPIPM" %} +{%- endif %} + +{%- if solver_options.hessian_approx %} + {%- set hessian_approx = solver_options.hessian_approx %} +{%- elif solver_options.sens_hess %} + {%- set hessian_approx = "EXACT" %} +{%- else %} + {%- set hessian_approx = "GAUSS_NEWTON" %} +{%- endif %} + +{%- if constraints.constr_type %} + {%- set constr_type = constraints.constr_type %} +{%- else %} + {%- set constr_type = "NONE" %} +{%- endif %} + +{%- if constraints.constr_type_e %} + {%- set constr_type_e = constraints.constr_type_e %} +{%- else %} + {%- set constr_type_e = "NONE" %} +{%- endif %} + +{%- if cost.cost_type %} + {%- set cost_type = cost.cost_type %} +{%- else %} + {%- set cost_type = "NONE" %} +{%- endif %} + +{%- if cost.cost_type_e %} + {%- set cost_type_e = cost.cost_type_e %} +{%- else %} + {%- set cost_type_e = "NONE" %} +{%- endif %} + +{%- if cost.cost_type_0 %} + {%- set cost_type_0 = cost.cost_type_0 %} +{%- else %} + {%- set cost_type_0 = "NONE" %} +{%- endif %} + +{%- if dims.nh %} + {%- set dims_nh = dims.nh %} +{%- else %} + {%- set dims_nh = 0 %} +{%- endif %} + +{%- if dims.nphi %} + {%- set dims_nphi = dims.nphi %} +{%- else %} + {%- set dims_nphi = 0 %} +{%- endif %} + +{%- if dims.nh_e %} + {%- set dims_nh_e = dims.nh_e %} +{%- else %} + {%- set dims_nh_e = 0 %} +{%- endif %} + +{%- if dims.nphi_e %} + {%- set dims_nphi_e = dims.nphi_e %} +{%- else %} + {%- set dims_nphi_e = 0 %} +{%- endif %} +{%- if solver_options.model_external_shared_lib_dir %} + {%- set model_external_shared_lib_dir = solver_options.model_external_shared_lib_dir %} +{%- endif %} +{%- if solver_options.model_external_shared_lib_name %} + {%- set model_external_shared_lib_name = solver_options.model_external_shared_lib_name %} +{%- endif %} + +{# control operator #} +{%- if os and os == "pc" %} + {%- set control = "&" %} +{%- else %} + {%- set control = ";" %} +{%- endif %} + +{# acados linking libraries and flags #} +{%- if acados_link_libs and os and os == "pc" %} + {%- set link_libs = acados_link_libs.qpoases ~ " " ~ acados_link_libs.hpmpc ~ " " ~ acados_link_libs.osqp -%} + {%- set openmp_flag = acados_link_libs.openmp %} +{%- else %} + {%- set openmp_flag = " " %} + {%- if qp_solver == "FULL_CONDENSING_QPOASES" %} + {%- set link_libs = "-lqpOASES_e" %} + {%- elif qp_solver == "FULL_CONDENSING_DAQP" %} + {%- set link_libs = "-ldaqp" %} + {%- else %} + {%- set link_libs = "" %} + {%- endif %} +{%- endif %} + +# define sources and use make's implicit rules to generate object files (*.o) + +# model +MODEL_SRC= + {%- if model.dyn_ext_fun_type == "casadi" %} +{%- if solver_options.integrator_type == "ERK" %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_expl_ode_fun.c +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_expl_vde_forw.c +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_expl_vde_adj.c + {%- if hessian_approx == "EXACT" %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_expl_ode_hess.c + {%- endif %} +{%- elif solver_options.integrator_type == "IRK" %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_impl_dae_fun.c +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_impl_dae_fun_jac_x_xdot_z.c +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_impl_dae_jac_x_xdot_u_z.c + {%- if hessian_approx == "EXACT" %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_impl_dae_hess.c + {%- endif %} +{%- elif solver_options.integrator_type == "LIFTED_IRK" %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_impl_dae_fun.c +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_impl_dae_fun_jac_x_xdot_u.c + {%- if hessian_approx == "EXACT" %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_impl_dae_hess.c + {%- endif %} +{%- elif solver_options.integrator_type == "GNSF" %} + {% if model.gnsf.purely_linear != 1 %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_gnsf_phi_fun.c +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_gnsf_phi_fun_jac_y.c +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_gnsf_phi_jac_y_uhat.c + {% if model.gnsf.nontrivial_f_LO == 1 %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_gnsf_f_lo_fun_jac_x1k1uz.c + {%- endif %} + {%- endif %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_gnsf_get_matrices_fun.c +{%- elif solver_options.integrator_type == "DISCRETE" %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun.c +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun_jac.c + {%- if hessian_approx == "EXACT" %} +MODEL_SRC+= {{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun_jac_hess.c + {%- endif %} +{%- endif %} + {%- else %} +MODEL_SRC+= {{ model.name }}_model/{{ model.dyn_generic_source }} + {%- endif %} +MODEL_OBJ := $(MODEL_SRC:.c=.o) + +# optimal control problem - mostly CasADi exports +OCP_SRC= +{%- if constr_type == "BGP" and dims_nphi > 0 %} +OCP_SRC+= {{ model.name }}_constraints/{{ model.name }}_phi_constraint.c +{%- endif %} +{%- if constr_type_e == "BGP" and dims_nphi_e > 0 %} +OCP_SRC+= {{ model.name }}_constraints/{{ model.name }}_phi_e_constraint.c +{%- endif %} + +{%- if constr_type == "BGH" and dims_nh > 0 %} +OCP_SRC+= {{ model.name }}_constraints/{{ model.name }}_constr_h_fun_jac_uxt_zt.c +OCP_SRC+= {{ model.name }}_constraints/{{ model.name }}_constr_h_fun.c + {%- if hessian_approx == "EXACT" %} +OCP_SRC+= {{ model.name }}_constraints/{{ model.name }}_constr_h_fun_jac_uxt_zt_hess.c + {%- endif %} +{%- endif %} + +{%- if constr_type_e == "BGH" and dims_nh_e > 0 %} +OCP_SRC+= {{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun_jac_uxt_zt.c +OCP_SRC+= {{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun.c + {%- if hessian_approx == "EXACT" %} +OCP_SRC+= {{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun_jac_uxt_zt_hess.c + {%- endif %} +{%- endif %} + +{%- if cost_type_0 == "NONLINEAR_LS" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_0_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_0_fun_jac_ut_xt.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_0_hess.c +{%- elif cost_type_0 == "CONVEX_OVER_NONLINEAR" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_conl_cost_0_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_conl_cost_0_fun_jac_hess.c +{%- elif cost_type_0 == "EXTERNAL" %} + {%- if cost.cost_ext_fun_type_0 == "casadi" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun_jac.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun_jac_hess.c + {%- else %} +OCP_SRC+= {{ model.name }}_cost/{{ cost.cost_source_ext_cost_0 }} + {%- endif %} +{%- endif %} +{%- if cost_type == "NONLINEAR_LS" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_fun_jac_ut_xt.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_hess.c +{%- elif cost_type == "CONVEX_OVER_NONLINEAR" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_conl_cost_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_conl_cost_fun_jac_hess.c +{%- elif cost_type == "EXTERNAL" %} + {%- if cost.cost_ext_fun_type == "casadi" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun_jac.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun_jac_hess.c + {%- elif cost.cost_source_ext_cost != cost.cost_source_ext_cost_0 %} +OCP_SRC+= {{ model.name }}_cost/{{ cost.cost_source_ext_cost }} + {%- endif %} +{%- endif %} +{%- if cost_type_e == "NONLINEAR_LS" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_e_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_e_fun_jac_ut_xt.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_y_e_hess.c +{%- elif cost_type_e == "CONVEX_OVER_NONLINEAR" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_conl_cost_e_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_conl_cost_e_fun_jac_hess.c +{%- elif cost_type_e == "EXTERNAL" %} + {%- if cost.cost_ext_fun_type_e == "casadi" %} +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun_jac.c +OCP_SRC+= {{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun_jac_hess.c + {%- elif cost.cost_source_ext_cost_e != cost.cost_source_ext_cost_0 %} +OCP_SRC+= {{ model.name }}_cost/{{ cost.cost_source_ext_cost_e }} + {%- endif %} +{%- endif %} +{%- if solver_options.custom_update_filename %} + {%- if solver_options.custom_update_filename != "" %} +OCP_SRC+= {{ solver_options.custom_update_filename }} + {%- endif %} +{%- endif %} + +OCP_SRC+= acados_solver_{{ model.name }}.c +OCP_OBJ := $(OCP_SRC:.c=.o) + +# for sim solver +SIM_SRC= acados_sim_solver_{{ model.name }}.c +SIM_OBJ := $(SIM_SRC:.c=.o) + +# for target example +EX_SRC= main_{{ model.name }}.c +EX_OBJ := $(EX_SRC:.c=.o) +EX_EXE := $(EX_SRC:.c=) + +# for target example_sim +EX_SIM_SRC= main_sim_{{ model.name }}.c +EX_SIM_OBJ := $(EX_SIM_SRC:.c=.o) +EX_SIM_EXE := $(EX_SIM_SRC:.c=) + +# combine model, sim and ocp object files +OBJ= +OBJ+= $(MODEL_OBJ) +{%- if solver_options.integrator_type != "DISCRETE" %} +OBJ+= $(SIM_OBJ) +{%- endif %} +OBJ+= $(OCP_OBJ) + +EXTERNAL_DIR= +EXTERNAL_LIB= + +{%- if model_external_shared_lib_dir and model_external_shared_lib_name %} +EXTERNAL_DIR+= {{ model_external_shared_lib_dir }} +EXTERNAL_LIB+= {{ model_external_shared_lib_name }} +{%- endif %} + +INCLUDE_PATH = {{ acados_include_path }} +LIB_PATH = {{ acados_lib_path }} + +# preprocessor flags for make's implicit rules +{%- if qp_solver == "FULL_CONDENSING_QPOASES" %} +CPPFLAGS += -DACADOS_WITH_QPOASES +{%- endif %} +{%- if qp_solver == "FULL_CONDENSING_DAQP" %} +CPPFLAGS += -DACADOS_WITH_DAQP +{%- endif %} +{%- if qp_solver == "PARTIAL_CONDENSING_OSQP" %} +CPPFLAGS += -DACADOS_WITH_OSQP +{%- endif %} +{%- if qp_solver == "PARTIAL_CONDENSING_QPDUNES" %} +CPPFLAGS += -DACADOS_WITH_QPDUNES +{%- endif %} +CPPFLAGS+= -I$(INCLUDE_PATH) +CPPFLAGS+= -I$(INCLUDE_PATH)/acados +CPPFLAGS+= -I$(INCLUDE_PATH)/blasfeo/include +CPPFLAGS+= -I$(INCLUDE_PATH)/hpipm/include + {%- if qp_solver == "FULL_CONDENSING_QPOASES" %} +CPPFLAGS+= -I $(INCLUDE_PATH)/qpOASES_e/ + {%- endif %} + {%- if qp_solver == "FULL_CONDENSING_DAQP" %} +CPPFLAGS+= -I $(INCLUDE_PATH)/daqp/include + {%- endif %} + +{# c-compiler flags #} +# define the c-compiler flags for make's implicit rules +CFLAGS = -fPIC -std=c99 {{ openmp_flag }} {{ solver_options.ext_fun_compile_flags }}#-fno-diagnostics-show-line-numbers -g +# # Debugging +# CFLAGS += -g3 + +# linker flags +LDFLAGS+= -L$(LIB_PATH) + +# link to libraries +LDLIBS+= -lacados +LDLIBS+= -lhpipm +LDLIBS+= -lblasfeo +LDLIBS+= -lm +LDLIBS+= {{ link_libs }} + +# libraries +LIBACADOS_SOLVER=libacados_solver_{{ model.name }}{{ shared_lib_ext }} +LIBACADOS_OCP_SOLVER=libacados_ocp_solver_{{ model.name }}{{ shared_lib_ext }} +LIBACADOS_SIM_SOLVER=lib$(SIM_SRC:.c={{ shared_lib_ext }}) + +# virtual targets +.PHONY : all clean + +#all: clean example_sim example shared_lib +{% if solver_options.integrator_type == "DISCRETE" -%} +all: clean example +shared_lib: ocp_shared_lib +{%- else %} +all: clean example_sim example +shared_lib: bundled_shared_lib ocp_shared_lib sim_shared_lib +{%- endif %} + +# some linker targets +example: $(EX_OBJ) $(OBJ) + $(CC) $^ -o $(EX_EXE) $(LDFLAGS) $(LDLIBS) + +example_sim: $(EX_SIM_OBJ) $(MODEL_OBJ) $(SIM_OBJ) + $(CC) $^ -o $(EX_SIM_EXE) $(LDFLAGS) $(LDLIBS) + +{% if solver_options.integrator_type != "DISCRETE" -%} +bundled_shared_lib: $(OBJ) + $(CC) -shared $^ -o $(LIBACADOS_SOLVER) $(LDFLAGS) $(LDLIBS) +{%- endif %} + +ocp_shared_lib: $(OCP_OBJ) $(MODEL_OBJ) + $(CC) -shared $^ -o $(LIBACADOS_OCP_SOLVER) $(LDFLAGS) $(LDLIBS) \ + -L$(EXTERNAL_DIR) -l$(EXTERNAL_LIB) + +sim_shared_lib: $(SIM_OBJ) $(MODEL_OBJ) + $(CC) -shared $^ -o $(LIBACADOS_SIM_SOLVER) $(LDFLAGS) $(LDLIBS) + + +# Cython targets +ocp_cython_c: ocp_shared_lib + cython \ + -o acados_ocp_solver_pyx.c \ + -I $(INCLUDE_PATH)/../interfaces/acados_template/acados_template \ + $(INCLUDE_PATH)/../interfaces/acados_template/acados_template/acados_ocp_solver_pyx.pyx \ + -I {{ code_export_directory }} \ + +ocp_cython_o: ocp_cython_c + $(CC) $(ACADOS_FLAGS) -c -O2 \ + -fPIC \ + -o acados_ocp_solver_pyx.o \ + -I $(INCLUDE_PATH)/blasfeo/include/ \ + -I $(INCLUDE_PATH)/hpipm/include/ \ + -I $(INCLUDE_PATH) \ + {%- for path in cython_include_dirs %} + -I {{ path }} \ + {%- endfor %} + acados_ocp_solver_pyx.c \ + +ocp_cython: ocp_cython_o + $(CC) $(ACADOS_FLAGS) -shared \ + -o acados_ocp_solver_pyx{{ shared_lib_ext }} \ + -Wl,-rpath=$(LIB_PATH) \ + acados_ocp_solver_pyx.o \ + $(abspath .)/libacados_ocp_solver_{{ model.name }}{{ shared_lib_ext }} \ + $(LDFLAGS) $(LDLIBS) + +# Sim Cython targets +sim_cython_c: sim_shared_lib + cython \ + -o acados_sim_solver_pyx.c \ + -I $(INCLUDE_PATH)/../interfaces/acados_template/acados_template \ + $(INCLUDE_PATH)/../interfaces/acados_template/acados_template/acados_sim_solver_pyx.pyx \ + -I {{ code_export_directory }} \ + +sim_cython_o: sim_cython_c + $(CC) $(ACADOS_FLAGS) -c -O2 \ + -fPIC \ + -o acados_sim_solver_pyx.o \ + -I $(INCLUDE_PATH)/blasfeo/include/ \ + -I $(INCLUDE_PATH)/hpipm/include/ \ + -I $(INCLUDE_PATH) \ + {%- for path in cython_include_dirs %} + -I {{ path }} \ + {%- endfor %} + acados_sim_solver_pyx.c \ + +sim_cython: sim_cython_o + $(CC) $(ACADOS_FLAGS) -shared \ + -o acados_sim_solver_pyx{{ shared_lib_ext }} \ + -Wl,-rpath=$(LIB_PATH) \ + acados_sim_solver_pyx.o \ + $(abspath .)/libacados_sim_solver_{{ model.name }}{{ shared_lib_ext }} \ + $(LDFLAGS) $(LDLIBS) + +{%- if os and os == "pc" %} + +clean: + del \Q *.o 2>nul + del \Q *{{ shared_lib_ext }} 2>nul + del \Q main_{{ model.name }} 2>nul + +clean_ocp_shared_lib: + del \Q libacados_ocp_solver_{{ model.name }}{{ shared_lib_ext }} 2>nul + del \Q acados_solver_{{ model.name }}.o 2>nul + +clean_ocp_cython: + del \Q libacados_ocp_solver_{{ model.name }}{{ shared_lib_ext }} 2>nul + del \Q acados_solver_{{ model.name }}.o 2>nul + del \Q acados_ocp_solver_pyx{{ shared_lib_ext }} 2>nul + del \Q acados_ocp_solver_pyx.o 2>nul + +clean_sim_cython: + del \Q libacados_sim_solver_{{ model.name }}{{ shared_lib_ext }} 2>nul + del \Q acados_sim_solver_{{ model.name }}.o 2>nul + del \Q acados_sim_solver_pyx{{ shared_lib_ext }} 2>nul + del \Q acados_sim_solver_pyx.o 2>nul + +{%- else %} + +clean: + $(RM) $(OBJ) $(EX_OBJ) $(EX_SIM_OBJ) + $(RM) $(LIBACADOS_SOLVER) $(LIBACADOS_OCP_SOLVER) $(LIBACADOS_SIM_SOLVER) + $(RM) $(EX_EXE) $(EX_SIM_EXE) + +clean_ocp_shared_lib: + $(RM) $(LIBACADOS_OCP_SOLVER) + $(RM) $(OCP_OBJ) + +clean_ocp_cython: + $(RM) libacados_ocp_solver_{{ model.name }}{{ shared_lib_ext }} + $(RM) acados_solver_{{ model.name }}.o + $(RM) acados_ocp_solver_pyx{{ shared_lib_ext }} + $(RM) acados_ocp_solver_pyx.o + +clean_sim_cython: + $(RM) libacados_sim_solver_{{ model.name }}{{ shared_lib_ext }} + $(RM) acados_sim_solver_{{ model.name }}.o + $(RM) acados_sim_solver_pyx{{ shared_lib_ext }} + $(RM) acados_sim_solver_pyx.o + +{%- endif %} diff --git a/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_main_mex.in.m b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_main_mex.in.m new file mode 100644 index 000000000..d21794845 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_main_mex.in.m @@ -0,0 +1,103 @@ +% +% Copyright (c) The acados authors. +% +% This file is part of acados. +% +% The 2-Clause BSD License +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions are met: +% +% 1. Redistributions of source code must retain the above copyright notice, +% this list of conditions and the following disclaimer. +% +% 2. Redistributions in binary form must reproduce the above copyright notice, +% this list of conditions and the following disclaimer in the documentation +% and/or other materials provided with the distribution. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE.; + +% + +function make_main_mex_{{ model.name }}() + + opts.output_dir = pwd; + + % get acados folder + acados_folder = getenv('ACADOS_INSTALL_DIR'); + + % set paths + acados_include = ['-I' fullfile(acados_folder, 'include')]; + template_lib_include = ['-l' 'acados_solver_{{ model.name }}']; + template_lib_path = ['-L' fullfile(pwd)]; + + acados_lib_path = ['-L' fullfile(acados_folder, 'lib')]; + external_include = ['-I', fullfile(acados_folder, 'external')]; + blasfeo_include = ['-I', fullfile(acados_folder, 'external', 'blasfeo', 'include')]; + hpipm_include = ['-I', fullfile(acados_folder, 'external', 'hpipm', 'include')]; + + mex_names = { ... + 'main_mex_{{ model.name }}' ... + }; + + mex_files = cell(length(mex_names), 1); + for k=1:length(mex_names) + mex_files{k} = fullfile([mex_names{k}, '.c']); + end + + %% octave C flags + if is_octave() + if ~exist(fullfile(opts.output_dir, 'cflags_octave.txt'), 'file') + diary(fullfile(opts.output_dir, 'cflags_octave.txt')); + diary on + mkoctfile -p CFLAGS + diary off + input_file = fopen(fullfile(opts.output_dir, 'cflags_octave.txt'), 'r'); + cflags_tmp = fscanf(input_file, '%[^\n]s'); + fclose(input_file); + if ~ismac() + cflags_tmp = [cflags_tmp, ' -std=c99 -fopenmp']; + else + cflags_tmp = [cflags_tmp, ' -std=c99']; + end + input_file = fopen(fullfile(opts.output_dir, 'cflags_octave.txt'), 'w'); + fprintf(input_file, '%s', cflags_tmp); + fclose(input_file); + end + % read cflags from file + input_file = fopen(fullfile(opts.output_dir, 'cflags_octave.txt'), 'r'); + cflags_tmp = fscanf(input_file, '%[^\n]s'); + fclose(input_file); + setenv('CFLAGS', cflags_tmp); + end + + %% compile mex + for ii=1:length(mex_files) + disp(['compiling ', mex_files{ii}]) + if is_octave() + % mkoctfile -p CFLAGS + mex(acados_include, template_lib_include, external_include, blasfeo_include, hpipm_include,... + acados_lib_path, template_lib_path, '-lacados', '-lhpipm', '-lblasfeo', mex_files{ii}) + else + if ismac() + FLAGS = 'CFLAGS=$CFLAGS -std=c99'; + else + FLAGS = 'CFLAGS=$CFLAGS -std=c99 -fopenmp'; + end + mex(FLAGS, acados_include, template_lib_include, external_include, blasfeo_include, hpipm_include,... + acados_lib_path, template_lib_path, '-lacados', '-lhpipm', '-lblasfeo', mex_files{ii}) + end + end + + +end \ No newline at end of file diff --git a/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_mex.in.m b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_mex.in.m new file mode 100644 index 000000000..5e3582713 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_mex.in.m @@ -0,0 +1,127 @@ +% +% Copyright (c) The acados authors. +% +% This file is part of acados. +% +% The 2-Clause BSD License +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions are met: +% +% 1. Redistributions of source code must retain the above copyright notice, +% this list of conditions and the following disclaimer. +% +% 2. Redistributions in binary form must reproduce the above copyright notice, +% this list of conditions and the following disclaimer in the documentation +% and/or other materials provided with the distribution. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE.; + +% + +function make_mex_{{ model.name }}() + + opts.output_dir = pwd; + + % get acados folder + acados_folder = getenv('ACADOS_INSTALL_DIR'); + + % set paths + acados_include = ['-I' fullfile(acados_folder, 'include')]; + template_lib_include = ['-l' 'acados_ocp_solver_{{ model.name }}']; + template_lib_path = ['-L' fullfile(pwd)]; + + acados_lib_path = ['-L' fullfile(acados_folder, 'lib')]; + external_include = ['-I', fullfile(acados_folder, 'external')]; + blasfeo_include = ['-I', fullfile(acados_folder, 'external', 'blasfeo', 'include')]; + hpipm_include = ['-I', fullfile(acados_folder, 'external', 'hpipm', 'include')]; + + % load linking information of compiled acados + link_libs_core_filename = fullfile(acados_folder, 'lib', 'link_libs.json'); + addpath(fullfile(acados_folder, 'external', 'jsonlab')); + link_libs = loadjson(link_libs_core_filename); + + % add necessary link instructs + acados_lib_extra = {}; + lib_names = fieldnames(link_libs); + for idx = 1 : numel(lib_names) + lib_name = lib_names{idx}; + link_arg = link_libs.(lib_name); + if ~isempty(link_arg) + acados_lib_extra = [acados_lib_extra, link_arg]; + end + end + + + mex_include = ['-I', fullfile(acados_folder, 'interfaces', 'acados_matlab_octave')]; + + mex_names = { ... + 'acados_mex_create_{{ model.name }}' ... + 'acados_mex_free_{{ model.name }}' ... + 'acados_mex_solve_{{ model.name }}' ... + 'acados_mex_set_{{ model.name }}' ... + }; + + mex_files = cell(length(mex_names), 1); + for k=1:length(mex_names) + mex_files{k} = fullfile([mex_names{k}, '.c']); + end + + %% octave C flags + if is_octave() + if ~exist(fullfile(opts.output_dir, 'cflags_octave.txt'), 'file') + diary(fullfile(opts.output_dir, 'cflags_octave.txt')); + diary on + mkoctfile -p CFLAGS + diary off + input_file = fopen(fullfile(opts.output_dir, 'cflags_octave.txt'), 'r'); + cflags_tmp = fscanf(input_file, '%[^\n]s'); + fclose(input_file); + if ~ismac() + cflags_tmp = [cflags_tmp, ' -std=c99 -fopenmp']; + else + cflags_tmp = [cflags_tmp, ' -std=c99']; + end + input_file = fopen(fullfile(opts.output_dir, 'cflags_octave.txt'), 'w'); + fprintf(input_file, '%s', cflags_tmp); + fclose(input_file); + end + % read cflags from file + input_file = fopen(fullfile(opts.output_dir, 'cflags_octave.txt'), 'r'); + cflags_tmp = fscanf(input_file, '%[^\n]s'); + fclose(input_file); + setenv('CFLAGS', cflags_tmp); + end + + %% compile mex + for ii=1:length(mex_files) + disp(['compiling ', mex_files{ii}]) + if is_octave() + % mkoctfile -p CFLAGS + mex(acados_include, template_lib_include, external_include, blasfeo_include, hpipm_include,... + template_lib_path, mex_include, acados_lib_path, '-lacados', '-lhpipm', '-lblasfeo',... + acados_lib_extra{:}, mex_files{ii}) + else + if ismac() + FLAGS = 'CFLAGS=$CFLAGS -std=c99'; + else + FLAGS = 'CFLAGS=$CFLAGS -std=c99 -fopenmp'; + end + mex(FLAGS, acados_include, template_lib_include, external_include, blasfeo_include, hpipm_include,... + template_lib_path, mex_include, acados_lib_path, '-lacados', '-lhpipm', '-lblasfeo',... + acados_lib_extra{:}, mex_files{ii}) + end + end + + +end \ No newline at end of file diff --git a/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_sfun.in.m b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_sfun.in.m new file mode 100644 index 000000000..5d74c523f --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_sfun.in.m @@ -0,0 +1,432 @@ +% +% Copyright (c) The acados authors. +% +% This file is part of acados. +% +% The 2-Clause BSD License +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions are met: +% +% 1. Redistributions of source code must retain the above copyright notice, +% this list of conditions and the following disclaimer. +% +% 2. Redistributions in binary form must reproduce the above copyright notice, +% this list of conditions and the following disclaimer in the documentation +% and/or other materials provided with the distribution. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE.; + +% + +SOURCES = { ... + {%- if solver_options.integrator_type == 'ERK' %} + '{{ model.name }}_model/{{ model.name }}_expl_ode_fun.c', ... + '{{ model.name }}_model/{{ model.name }}_expl_vde_forw.c',... + {%- if solver_options.hessian_approx == 'EXACT' %} + '{{ model.name }}_model/{{ model.name }}_expl_ode_hess.c',... + {%- endif %} + {%- elif solver_options.integrator_type == "IRK" %} + '{{ model.name }}_model/{{ model.name }}_impl_dae_fun.c', ... + '{{ model.name }}_model/{{ model.name }}_impl_dae_fun_jac_x_xdot_z.c', ... + '{{ model.name }}_model/{{ model.name }}_impl_dae_jac_x_xdot_u_z.c', ... + {%- if solver_options.hessian_approx == 'EXACT' %} + '{{ model.name }}_model/{{ model.name }}_impl_dae_hess.c',... + {%- endif %} + {%- elif solver_options.integrator_type == "GNSF" %} + {% if model.gnsf.purely_linear != 1 %} + '{{ model.name }}_model/{{ model.name }}_gnsf_phi_fun.c',... + '{{ model.name }}_model/{{ model.name }}_gnsf_phi_fun_jac_y.c',... + '{{ model.name }}_model/{{ model.name }}_gnsf_phi_jac_y_uhat.c',... + {% if model.gnsf.nontrivial_f_LO == 1 %} + '{{ model.name }}_model/{{ model.name }}_gnsf_f_lo_fun_jac_x1k1uz.c',... + {%- endif %} + {%- endif %} + '{{ model.name }}_model/{{ model.name }}_gnsf_get_matrices_fun.c',... + {%- elif solver_options.integrator_type == "DISCRETE" %} + '{{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun.c',... + '{{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun_jac.c',... + {%- if solver_options.hessian_approx == "EXACT" %} + '{{ model.name }}_model/{{ model.name }}_dyn_disc_phi_fun_jac_hess.c',... + {%- endif %} + {%- endif %} + {%- if cost.cost_type_0 == "NONLINEAR_LS" %} + '{{ model.name }}_cost/{{ model.name }}_cost_y_0_fun.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_y_0_fun_jac_ut_xt.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_y_0_hess.c',... + {%- elif cost.cost_type_0 == "EXTERNAL" %} + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun_jac.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_0_fun_jac_hess.c',... + {%- endif %} + + {%- if cost.cost_type == "NONLINEAR_LS" %} + '{{ model.name }}_cost/{{ model.name }}_cost_y_fun.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_y_fun_jac_ut_xt.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_y_hess.c',... + {%- elif cost.cost_type == "EXTERNAL" %} + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun_jac.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_fun_jac_hess.c',... + {%- endif %} + {%- if cost.cost_type_e == "NONLINEAR_LS" %} + '{{ model.name }}_cost/{{ model.name }}_cost_y_e_fun.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_y_e_fun_jac_ut_xt.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_y_e_hess.c',... + {%- elif cost.cost_type_e == "EXTERNAL" %} + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun_jac.c',... + '{{ model.name }}_cost/{{ model.name }}_cost_ext_cost_e_fun_jac_hess.c',... + {%- endif %} + {%- if constraints.constr_type == "BGH" and dims.nh > 0 %} + '{{ model.name }}_constraints/{{ model.name }}_constr_h_fun.c', ... + '{{ model.name }}_constraints/{{ model.name }}_constr_h_fun_jac_uxt_zt_hess.c', ... + '{{ model.name }}_constraints/{{ model.name }}_constr_h_fun_jac_uxt_zt.c', ... + {%- elif constraints.constr_type == "BGP" and dims.nphi > 0 %} + '{{ model.name }}_constraints/{{ model.name }}_phi_constraint.c', ... + {%- endif %} + {%- if constraints.constr_type_e == "BGH" and dims.nh_e > 0 %} + '{{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun.c', ... + '{{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun_jac_uxt_zt_hess.c', ... + '{{ model.name }}_constraints/{{ model.name }}_constr_h_e_fun_jac_uxt_zt.c', ... + {%- elif constraints.constr_type_e == "BGP" and dims.nphi_e > 0 %} + '{{ model.name }}_constraints/{{ model.name }}_phi_e_constraint.c', ... + {%- endif %} + 'acados_solver_sfunction_{{ model.name }}.c', ... + 'acados_solver_{{ model.name }}.c' + }; + +INC_PATH = '{{ acados_include_path }}'; + +INCS = {['-I', fullfile(INC_PATH, 'blasfeo', 'include')], ... + ['-I', fullfile(INC_PATH, 'hpipm', 'include')], ... + ['-I', fullfile(INC_PATH, 'acados')], ... + ['-I', fullfile(INC_PATH)]}; + +{% if solver_options.qp_solver is containing("QPOASES") %} +INCS{end+1} = ['-I', fullfile(INC_PATH, 'qpOASES_e')]; +{% endif %} + +CFLAGS = 'CFLAGS=$CFLAGS'; +LDFLAGS = 'LDFLAGS=$LDFLAGS'; +COMPFLAGS = 'COMPFLAGS=$COMPFLAGS'; +COMPDEFINES = 'COMPDEFINES=$COMPDEFINES'; + +{% if solver_options.qp_solver is containing("QPOASES") %} +CFLAGS = [ CFLAGS, ' -DACADOS_WITH_QPOASES ' ]; +COMPDEFINES = [ COMPDEFINES, ' -DACADOS_WITH_QPOASES ' ]; +{%- elif solver_options.qp_solver is containing("OSQP") %} +CFLAGS = [ CFLAGS, ' -DACADOS_WITH_OSQP ' ]; +COMPDEFINES = [ COMPDEFINES, ' -DACADOS_WITH_OSQP ' ]; +{%- elif solver_options.qp_solver is containing("QPDUNES") %} +CFLAGS = [ CFLAGS, ' -DACADOS_WITH_QPDUNES ' ]; +COMPDEFINES = [ COMPDEFINES, ' -DACADOS_WITH_QPDUNES ' ]; +{%- elif solver_options.qp_solver is containing("DAQP") %} +CFLAGS = [ CFLAGS, ' -DACADOS_WITH_DAQP' ]; +COMPDEFINES = [ COMPDEFINES, ' -DACADOS_WITH_DAQP' ]; +{%- elif solver_options.qp_solver is containing("HPMPC") %} +CFLAGS = [ CFLAGS, ' -DACADOS_WITH_HPMPC ' ]; +COMPDEFINES = [ COMPDEFINES, ' -DACADOS_WITH_HPMPC ' ]; +{% endif %} + +LIB_PATH = ['-L', fullfile('{{ acados_lib_path }}')]; + +LIBS = {'-lacados', '-lhpipm', '-lblasfeo'}; + +% acados linking libraries and flags +{%- if acados_link_libs and os and os == "pc" %} +LDFLAGS = [LDFLAGS ' {{ acados_link_libs.openmp }}']; +COMPFLAGS = [COMPFLAGS ' {{ acados_link_libs.openmp }}']; +LIBS{end+1} = '{{ acados_link_libs.qpoases }}'; +LIBS{end+1} = '{{ acados_link_libs.hpmpc }}'; +LIBS{end+1} = '{{ acados_link_libs.osqp }}'; +{%- else %} + {% if solver_options.qp_solver is containing("QPOASES") %} +LIBS{end+1} = '-lqpOASES_e'; + {% endif %} + {% if solver_options.qp_solver is containing("DAQP") %} +LIBS{end+1} = '-ldaqp'; + {% endif %} +{%- endif %} + + +try + % mex('-v', '-O', CFLAGS, LDFLAGS, COMPFLAGS, COMPDEFINES, INCS{:}, ... + mex('-O', CFLAGS, LDFLAGS, COMPFLAGS, COMPDEFINES, INCS{:}, ... + LIB_PATH, LIBS{:}, SOURCES{:}, ... + '-output', 'acados_solver_sfunction_{{ model.name }}' ); +catch exception + disp('make_sfun failed with the following exception:') + disp(exception); + disp('Try adding -v to the mex command above to get more information.') + keyboard +end + +fprintf( [ '\n\nSuccessfully created sfunction:\nacados_solver_sfunction_{{ model.name }}', '.', ... + eval('mexext')] ); + + +%% print note on usage of s-function, and create I/O port names vectors +fprintf('\n\nNote: Usage of Sfunction is as follows:\n') +input_note = 'Inputs are:\n'; +i_in = 1; + +global sfun_input_names +sfun_input_names = {}; + +{%- if dims.nbx_0 > 0 and simulink_opts.inputs.lbx_0 -%} {#- lbx_0 #} +input_note = strcat(input_note, num2str(i_in), ') lbx_0 - lower bound on x for stage 0,',... + ' size [{{ dims.nbx_0 }}]\n '); +sfun_input_names = [sfun_input_names; 'lbx_0 [{{ dims.nbx_0 }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.nbx_0 > 0 and simulink_opts.inputs.ubx_0 -%} {#- ubx_0 #} +input_note = strcat(input_note, num2str(i_in), ') ubx_0 - upper bound on x for stage 0,',... + ' size [{{ dims.nbx_0 }}]\n '); +sfun_input_names = [sfun_input_names; 'ubx_0 [{{ dims.nbx_0 }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.np > 0 and simulink_opts.inputs.parameter_traj -%} {#- parameter_traj #} +input_note = strcat(input_note, num2str(i_in), ') parameters - concatenated for all shooting nodes 0 to N,',... + ' size [{{ (dims.N+1)*dims.np }}]\n '); +sfun_input_names = [sfun_input_names; 'parameter_traj [{{ (dims.N+1)*dims.np }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.ny_0 > 0 and simulink_opts.inputs.y_ref_0 %} +input_note = strcat(input_note, num2str(i_in), ') y_ref_0, size [{{ dims.ny_0 }}]\n '); +sfun_input_names = [sfun_input_names; 'y_ref_0 [{{ dims.ny_0 }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.ny > 0 and dims.N > 1 and simulink_opts.inputs.y_ref %} +input_note = strcat(input_note, num2str(i_in), ') y_ref - concatenated for shooting nodes 1 to N-1,',... + ' size [{{ (dims.N-1) * dims.ny }}]\n '); +sfun_input_names = [sfun_input_names; 'y_ref [{{ (dims.N-1) * dims.ny }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.ny_e > 0 and dims.N > 0 and simulink_opts.inputs.y_ref_e %} +input_note = strcat(input_note, num2str(i_in), ') y_ref_e, size [{{ dims.ny_e }}]\n '); +sfun_input_names = [sfun_input_names; 'y_ref_e [{{ dims.ny_e }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.nbx > 0 and dims.N > 1 and simulink_opts.inputs.lbx -%} {#- lbx #} +input_note = strcat(input_note, num2str(i_in), ') lbx for shooting nodes 1 to N-1, size [{{ (dims.N-1) * dims.nbx }}]\n '); +sfun_input_names = [sfun_input_names; 'lbx [{{ (dims.N-1) * dims.nbx }}]']; +i_in = i_in + 1; +{%- endif %} +{%- if dims.nbx > 0 and dims.N > 1 and simulink_opts.inputs.ubx -%} {#- ubx #} +input_note = strcat(input_note, num2str(i_in), ') ubx for shooting nodes 1 to N-1, size [{{ (dims.N-1) * dims.nbx }}]\n '); +sfun_input_names = [sfun_input_names; 'ubx [{{ (dims.N-1) * dims.nbx }}]']; +i_in = i_in + 1; +{%- endif %} + + +{%- if dims.nbx_e > 0 and dims.N > 0 and simulink_opts.inputs.lbx_e -%} {#- lbx_e #} +input_note = strcat(input_note, num2str(i_in), ') lbx_e (lbx at shooting node N), size [{{ dims.nbx_e }}]\n '); +sfun_input_names = [sfun_input_names; 'lbx_e [{{ dims.nbx_e }}]']; +i_in = i_in + 1; +{%- endif %} +{%- if dims.nbx_e > 0 and dims.N > 0 and simulink_opts.inputs.ubx_e -%} {#- ubx_e #} +input_note = strcat(input_note, num2str(i_in), ') ubx_e (ubx at shooting node N), size [{{ dims.nbx_e }}]\n '); +sfun_input_names = [sfun_input_names; 'ubx_e [{{ dims.nbx_e }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.nbu > 0 and dims.N > 0 and simulink_opts.inputs.lbu -%} {#- lbu #} +input_note = strcat(input_note, num2str(i_in), ') lbu for shooting nodes 0 to N-1, size [{{ dims.N*dims.nbu }}]\n '); +sfun_input_names = [sfun_input_names; 'lbu [{{ dims.N*dims.nbu }}]']; +i_in = i_in + 1; +{%- endif -%} +{%- if dims.nbu > 0 and dims.N > 0 and simulink_opts.inputs.ubu -%} {#- ubu #} +input_note = strcat(input_note, num2str(i_in), ') ubu for shooting nodes 0 to N-1, size [{{ dims.N*dims.nbu }}]\n '); +sfun_input_names = [sfun_input_names; 'ubu [{{ dims.N*dims.nbu }}]']; +i_in = i_in + 1; +{%- endif -%} + +{%- if dims.ng > 0 and simulink_opts.inputs.lg -%} {#- lg #} +input_note = strcat(input_note, num2str(i_in), ') lg for shooting nodes 0 to N-1, size [{{ dims.N*dims.ng }}]\n '); +sfun_input_names = [sfun_input_names; 'lg [{{ dims.N*dims.ng }}]']; +i_in = i_in + 1; +{%- endif %} +{%- if dims.ng > 0 and simulink_opts.inputs.ug -%} {#- ug #} +input_note = strcat(input_note, num2str(i_in), ') ug for shooting nodes 0 to N-1, size [{{ dims.N*dims.ng }}]\n '); +sfun_input_names = [sfun_input_names; 'ug [{{ dims.N*dims.ng }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.nh > 0 and simulink_opts.inputs.lh -%} {#- lh #} +input_note = strcat(input_note, num2str(i_in), ') lh for shooting nodes 0 to N-1, size [{{ dims.N*dims.nh }}]\n '); +sfun_input_names = [sfun_input_names; 'lh [{{ dims.N*dims.nh }}]']; +i_in = i_in + 1; +{%- endif %} +{%- if dims.nh > 0 and simulink_opts.inputs.uh -%} {#- uh #} +input_note = strcat(input_note, num2str(i_in), ') uh for shooting nodes 0 to N-1, size [{{ dims.N*dims.nh }}]\n '); +sfun_input_names = [sfun_input_names; 'uh [{{ dims.N*dims.nh }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.nh_e > 0 and simulink_opts.inputs.lh_e -%} {#- lh_e #} +input_note = strcat(input_note, num2str(i_in), ') lh_e, size [{{ dims.nh_e }}]\n '); +sfun_input_names = [sfun_input_names; 'lh_e [{{ dims.nh_e }}]']; +i_in = i_in + 1; +{%- endif %} +{%- if dims.nh_e > 0 and simulink_opts.inputs.uh_e -%} {#- uh_e #} +input_note = strcat(input_note, num2str(i_in), ') uh_e, size [{{ dims.nh_e }}]\n '); +sfun_input_names = [sfun_input_names; 'uh_e [{{ dims.nh_e }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.ny_0 > 0 and simulink_opts.inputs.cost_W_0 %} {#- cost_W_0 #} +input_note = strcat(input_note, num2str(i_in), ') cost_W_0 in column-major format, size [{{ dims.ny_0 * dims.ny_0 }}]\n '); +sfun_input_names = [sfun_input_names; 'cost_W_0 [{{ dims.ny_0 * dims.ny_0 }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.ny > 0 and simulink_opts.inputs.cost_W %} {#- cost_W #} +input_note = strcat(input_note, num2str(i_in), ') cost_W in column-major format, that is set for all intermediate shooting nodes: 1 to N-1, size [{{ dims.ny * dims.ny }}]\n '); +sfun_input_names = [sfun_input_names; 'cost_W [{{ dims.ny * dims.ny }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if dims.ny_e > 0 and simulink_opts.inputs.cost_W_e %} {#- cost_W_e #} +input_note = strcat(input_note, num2str(i_in), ') cost_W_e in column-major format, size [{{ dims.ny_e * dims.ny_e }}]\n '); +sfun_input_names = [sfun_input_names; 'cost_W_e [{{ dims.ny_e * dims.ny_e }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if simulink_opts.inputs.reset_solver %} {#- reset_solver #} +input_note = strcat(input_note, num2str(i_in), ') reset_solver determines if iterate is set to all zeros before other initializations (x_init, u_init) are set and before solver is called, size [1]\n '); +sfun_input_names = [sfun_input_names; 'reset_solver [1]']; +i_in = i_in + 1; +{%- endif %} + +{%- if simulink_opts.inputs.x_init %} {#- x_init #} +input_note = strcat(input_note, num2str(i_in), ') initialization of x for all shooting nodes, size [{{ dims.nx * (dims.N+1) }}]\n '); +sfun_input_names = [sfun_input_names; 'x_init [{{ dims.nx * (dims.N+1) }}]']; +i_in = i_in + 1; +{%- endif %} + +{%- if simulink_opts.inputs.u_init %} {#- u_init #} +input_note = strcat(input_note, num2str(i_in), ') initialization of u for shooting nodes 0 to N-1, size [{{ dims.nu * (dims.N) }}]\n '); +sfun_input_names = [sfun_input_names; 'u_init [{{ dims.nu * (dims.N) }}]']; +i_in = i_in + 1; +{%- endif %} + +fprintf(input_note) + +disp(' ') + +output_note = 'Outputs are:\n'; +i_out = 0; + +global sfun_output_names +sfun_output_names = {}; + +{%- if dims.nu > 0 and simulink_opts.outputs.u0 == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') u0, control input at node 0, size [{{ dims.nu }}]\n '); +sfun_output_names = [sfun_output_names; 'u0 [{{ dims.nu }}]']; +{%- endif %} + +{%- if simulink_opts.outputs.utraj == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') utraj, control input concatenated for nodes 0 to N-1, size [{{ dims.nu * dims.N }}]\n '); +sfun_output_names = [sfun_output_names; 'utraj [{{ dims.nu * dims.N }}]']; +{%- endif %} + +{%- if simulink_opts.outputs.xtraj == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') xtraj, state concatenated for nodes 0 to N, size [{{ dims.nx * (dims.N + 1) }}]\n '); +sfun_output_names = [sfun_output_names; 'xtraj [{{ dims.nx * (dims.N + 1) }}]']; +{%- endif %} + +{%- if simulink_opts.outputs.solver_status == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') acados solver status (0 = SUCCESS)\n '); +sfun_output_names = [sfun_output_names; 'solver_status']; +{%- endif %} + +{%- if simulink_opts.outputs.cost_value == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') cost function value\n '); +sfun_output_names = [sfun_output_names; 'cost_value']; +{%- endif %} + + +{%- if simulink_opts.outputs.KKT_residual == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') KKT residual\n '); +sfun_output_names = [sfun_output_names; 'KKT_residual']; +{%- endif %} + +{%- if simulink_opts.outputs.KKT_residuals == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') KKT residuals, size [4] (stat, eq, ineq, comp)\n '); +sfun_output_names = [sfun_output_names; 'KKT_residuals [4]']; +{%- endif %} + +{%- if dims.N > 0 and simulink_opts.outputs.x1 == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') x1, state at node 1\n '); +sfun_output_names = [sfun_output_names; 'x1']; +{%- endif %} + +{%- if simulink_opts.outputs.CPU_time == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') CPU time\n '); +sfun_output_names = [sfun_output_names; 'CPU_time']; +{%- endif %} + +{%- if simulink_opts.outputs.CPU_time_sim == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') CPU time integrator\n '); +sfun_output_names = [sfun_output_names; 'CPU_time_sim']; +{%- endif %} + +{%- if simulink_opts.outputs.CPU_time_qp == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') CPU time QP solution\n '); +sfun_output_names = [sfun_output_names; 'CPU_time_qp']; +{%- endif %} + +{%- if simulink_opts.outputs.CPU_time_lin == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') CPU time linearization (including integrator)\n '); +sfun_output_names = [sfun_output_names; 'CPU_time_lin']; +{%- endif %} + +{%- if simulink_opts.outputs.sqp_iter == 1 %} +i_out = i_out + 1; +output_note = strcat(output_note, num2str(i_out), ') SQP iterations\n '); +sfun_output_names = [sfun_output_names; 'sqp_iter']; +{%- endif %} + +fprintf(output_note) + +% The mask drawing command is: +% --- +% global sfun_input_names sfun_output_names +% for i = 1:length(sfun_input_names) +% port_label('input', i, sfun_input_names{i}) +% end +% for i = 1:length(sfun_output_names) +% port_label('output', i, sfun_output_names{i}) +% end +% --- +% It can be used by copying it in sfunction/Mask/Edit mask/Icon drawing commands +% (you can access it wirth ctrl+M on the s-function) \ No newline at end of file diff --git a/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_sfun_sim.in.m b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_sfun_sim.in.m new file mode 100644 index 000000000..e4c32a8c1 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/make_sfun_sim.in.m @@ -0,0 +1,137 @@ +% +% Copyright (c) The acados authors. +% +% This file is part of acados. +% +% The 2-Clause BSD License +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions are met: +% +% 1. Redistributions of source code must retain the above copyright notice, +% this list of conditions and the following disclaimer. +% +% 2. Redistributions in binary form must reproduce the above copyright notice, +% this list of conditions and the following disclaimer in the documentation +% and/or other materials provided with the distribution. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE.; + +% + +SOURCES = [ 'acados_sim_solver_sfunction_{{ model.name }}.c ', ... + 'acados_sim_solver_{{ model.name }}.c ', ... + {%- if solver_options.integrator_type == 'ERK' %} + '{{ model.name }}_model/{{ model.name }}_expl_ode_fun.c ',... + '{{ model.name }}_model/{{ model.name }}_expl_vde_forw.c ',... + '{{ model.name }}_model/{{ model.name }}_expl_vde_adj.c ',... + {%- if solver_options.hessian_approx == 'EXACT' %} + '{{ model.name }}_model/{{ model.name }}_expl_ode_hess.c ',... + {%- endif %} + {%- elif solver_options.integrator_type == "IRK" %} + '{{ model.name }}_model/{{ model.name }}_impl_dae_fun.c ', ... + '{{ model.name }}_model/{{ model.name }}_impl_dae_fun_jac_x_xdot_z.c ', ... + '{{ model.name }}_model/{{ model.name }}_impl_dae_jac_x_xdot_u_z.c ', ... + {%- if solver_options.hessian_approx == 'EXACT' %} + '{{ model.name }}_model/{{ model.name }}_impl_dae_hess.c ',... + {%- endif %} + {%- elif solver_options.integrator_type == "GNSF" %} + {%- if model.gnsf.purely_linear != 1 %} + '{{ model.name }}_model/{{ model.name }}_gnsf_phi_fun.c ',... + '{{ model.name }}_model/{{ model.name }}_gnsf_phi_fun_jac_y.c ',... + '{{ model.name }}_model/{{ model.name }}_gnsf_phi_jac_y_uhat.c ',... + {%- if model.gnsf.nontrivial_f_LO == 1 %} + '{{ model.name }}_model/{{ model.name }}_gnsf_f_lo_fun_jac_x1k1uz.c ',... + {%- endif %} + {%- endif %} + '{{ model.name }}_model/{{ model.name }}_gnsf_get_matrices_fun.c ',... + {%- endif %} + ]; + +INC_PATH = '{{ acados_include_path }}'; + +INCS = [ ' -I', fullfile(INC_PATH, 'blasfeo', 'include'), ... + ' -I', fullfile(INC_PATH, 'hpipm', 'include'), ... + ' -I', INC_PATH, ' -I', fullfile(INC_PATH, 'acados'), ' ']; + +CFLAGS = ' -O'; + +LIB_PATH = '{{ acados_lib_path }}'; + +LIBS = '-lacados -lblasfeo -lhpipm'; + +try + % eval( [ 'mex -v -output acados_sim_solver_sfunction_{{ model.name }} ', ... + eval( [ 'mex -output acados_sim_solver_sfunction_{{ model.name }} ', ... + CFLAGS, INCS, ' ', SOURCES, ' -L', LIB_PATH, ' ', LIBS ]); + +catch exception + disp('make_sfun failed with the following exception:') + disp(exception); + disp('Try adding -v to the mex command above to get more information.') + keyboard +end + + +fprintf( [ '\n\nSuccessfully created sfunction:\nacados_sim_solver_sfunction_{{ model.name }}', '.', ... + eval('mexext')] ); + + +global sfun_sim_input_names +sfun_sim_input_names = {}; + +%% print note on usage of s-function +fprintf('\n\nNote: Usage of Sfunction is as follows:\n') +input_note = 'Inputs are:\n1) x0, initial state, size [{{ dims.nx }}]\n '; +i_in = 2; +sfun_sim_input_names = [sfun_sim_input_names; 'x0 [{{ dims.nx }}]']; + +{%- if dims.nu > 0 %} +input_note = strcat(input_note, num2str(i_in), ') u, size [{{ dims.nu }}]\n '); +i_in = i_in + 1; +sfun_sim_input_names = [sfun_sim_input_names; 'u [{{ dims.nu }}]']; +{%- endif %} + +{%- if dims.np > 0 %} +input_note = strcat(input_note, num2str(i_in), ') parameters, size [{{ dims.np }}]\n '); +i_in = i_in + 1; +sfun_sim_input_names = [sfun_sim_input_names; 'p [{{ dims.np }}]']; +{%- endif %} + + +fprintf(input_note) + +disp(' ') + +global sfun_sim_output_names +sfun_sim_output_names = {}; + +output_note = strcat('Outputs are:\n', ... + '1) x1 - simulated state, size [{{ dims.nx }}]\n'); +sfun_sim_output_names = [sfun_sim_output_names; 'x1 [{{ dims.nx }}]']; + +fprintf(output_note) + + +% The mask drawing command is: +% --- +% global sfun_sim_input_names sfun_sim_output_names +% for i = 1:length(sfun_sim_input_names) +% port_label('input', i, sfun_sim_input_names{i}) +% end +% for i = 1:length(sfun_sim_output_names) +% port_label('output', i, sfun_sim_output_names{i}) +% end +% --- +% It can be used by copying it in sfunction/Mask/Edit mask/Icon drawing commands +% (you can access it wirth ctrl+M on the s-function) \ No newline at end of file diff --git a/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/mex_solver.in.m b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/mex_solver.in.m new file mode 100644 index 000000000..374321283 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/c_templates_tera/matlab_templates/mex_solver.in.m @@ -0,0 +1,270 @@ +% +% Copyright (c) The acados authors. +% +% This file is part of acados. +% +% The 2-Clause BSD License +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions are met: +% +% 1. Redistributions of source code must retain the above copyright notice, +% this list of conditions and the following disclaimer. +% +% 2. Redistributions in binary form must reproduce the above copyright notice, +% this list of conditions and the following disclaimer in the documentation +% and/or other materials provided with the distribution. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +% POSSIBILITY OF SUCH DAMAGE.; + +% + +classdef {{ model.name }}_mex_solver < handle + + properties + C_ocp + C_ocp_ext_fun + cost_ext_fun_type + cost_ext_fun_type_e + N + name + code_gen_dir + end % properties + + + + methods + + % constructor + function obj = {{ model.name }}_mex_solver() + make_mex_{{ model.name }}(); + [obj.C_ocp, obj.C_ocp_ext_fun] = acados_mex_create_{{ model.name }}(); + % to have path to destructor when changing directory + addpath('.') + obj.cost_ext_fun_type = '{{ cost.cost_ext_fun_type }}'; + obj.cost_ext_fun_type_e = '{{ cost.cost_ext_fun_type_e }}'; + obj.N = {{ dims.N }}; + obj.name = '{{ model.name }}'; + obj.code_gen_dir = pwd(); + end + + % destructor + function delete(obj) + disp("delete template..."); + return_dir = pwd(); + cd(obj.code_gen_dir); + if ~isempty(obj.C_ocp) + acados_mex_free_{{ model.name }}(obj.C_ocp); + end + cd(return_dir); + disp("done."); + end + + % solve + function solve(obj) + acados_mex_solve_{{ model.name }}(obj.C_ocp); + end + + % set -- borrowed from MEX interface + function set(varargin) + obj = varargin{1}; + field = varargin{2}; + value = varargin{3}; + if ~isa(field, 'char') + error('field must be a char vector, use '' '''); + end + if nargin==3 + acados_mex_set_{{ model.name }}(obj.cost_ext_fun_type, obj.cost_ext_fun_type_e, obj.C_ocp, obj.C_ocp_ext_fun, field, value); + elseif nargin==4 + stage = varargin{4}; + acados_mex_set_{{ model.name }}(obj.cost_ext_fun_type, obj.cost_ext_fun_type_e, obj.C_ocp, obj.C_ocp_ext_fun, field, value, stage); + else + disp('acados_ocp.set: wrong number of input arguments (2 or 3 allowed)'); + end + end + + function value = get_cost(obj) + value = ocp_get_cost(obj.C_ocp); + end + + % get -- borrowed from MEX interface + function value = get(varargin) + % usage: + % obj.get(field, value, [stage]) + obj = varargin{1}; + field = varargin{2}; + if any(strfind('sens', field)) + error('field sens* (sensitivities of optimal solution) not yet supported for templated MEX.') + end + if ~isa(field, 'char') + error('field must be a char vector, use '' '''); + end + + if nargin==2 + value = ocp_get(obj.C_ocp, field); + elseif nargin==3 + stage = varargin{3}; + value = ocp_get(obj.C_ocp, field, stage); + else + disp('acados_ocp.get: wrong number of input arguments (1 or 2 allowed)'); + end + end + + + function [] = store_iterate(varargin) + %%% Stores the current iterate of the ocp solver in a json file. + %%% param1: filename: if not set, use model_name + timestamp + '.json' + %%% param2: overwrite: if false and filename exists add timestamp to filename + + obj = varargin{1}; + filename = ''; + overwrite = false; + + if nargin>=2 + filename = varargin{2}; + if ~isa(filename, 'char') + error('filename must be a char vector, use '' '''); + end + end + + if nargin==3 + overwrite = varargin{3}; + end + + if nargin > 3 + disp('acados_ocp.get: wrong number of input arguments (1 or 2 allowed)'); + end + + if strcmp(filename,'') + filename = [obj.name '_iterate.json']; + end + if ~overwrite + % append timestamp + if exist(filename, 'file') + filename = filename(1:end-5); + filename = [filename '_' datestr(now,'yyyy-mm-dd-HH:MM:SS') '.json']; + end + end + filename = fullfile(pwd, filename); + + % get iterate: + solution = struct(); + for i=0:obj.N + solution.(['x_' num2str(i)]) = obj.get('x', i); + solution.(['lam_' num2str(i)]) = obj.get('lam', i); + solution.(['t_' num2str(i)]) = obj.get('t', i); + solution.(['sl_' num2str(i)]) = obj.get('sl', i); + solution.(['su_' num2str(i)]) = obj.get('su', i); + end + for i=0:obj.N-1 + solution.(['z_' num2str(i)]) = obj.get('z', i); + solution.(['u_' num2str(i)]) = obj.get('u', i); + solution.(['pi_' num2str(i)]) = obj.get('pi', i); + end + + acados_folder = getenv('ACADOS_INSTALL_DIR'); + addpath(fullfile(acados_folder, 'external', 'jsonlab')); + savejson('', solution, filename); + + json_string = savejson('', solution, 'ForceRootName', 0); + + fid = fopen(filename, 'w'); + if fid == -1, error('store_iterate: Cannot create JSON file'); end + fwrite(fid, json_string, 'char'); + fclose(fid); + + disp(['stored current iterate in ' filename]); + end + + + function [] = load_iterate(obj, filename) + %%% Loads the iterate stored in json file with filename into the ocp solver. + acados_folder = getenv('ACADOS_INSTALL_DIR'); + addpath(fullfile(acados_folder, 'external', 'jsonlab')); + filename = fullfile(pwd, filename); + + if ~exist(filename, 'file') + error(['load_iterate: failed, file does not exist: ' filename]) + end + + solution = loadjson(filename); + keys = fieldnames(solution); + + for k = 1:numel(keys) + key = keys{k}; + key_parts = strsplit(key, '_'); + field = key_parts{1}; + stage = key_parts{2}; + + val = solution.(key); + + % check if array is empty (can happen for z) + if numel(val) > 0 + obj.set(field, val, str2num(stage)) + end + end + end + + + % print + function print(varargin) + if nargin < 2 + field = 'stat'; + else + field = varargin{2}; + end + + obj = varargin{1}; + + if strcmp(field, 'stat') + stat = obj.get('stat'); + {%- if solver_options.nlp_solver_type == "SQP" %} + fprintf('\niter\tres_stat\tres_eq\t\tres_ineq\tres_comp\tqp_stat\tqp_iter\talpha'); + if size(stat,2)>8 + fprintf('\tqp_res_stat\tqp_res_eq\tqp_res_ineq\tqp_res_comp'); + end + fprintf('\n'); + for jj=1:size(stat,1) + fprintf('%d\t%e\t%e\t%e\t%e\t%d\t%d\t%e', stat(jj,1), stat(jj,2), stat(jj,3), stat(jj,4), stat(jj,5), stat(jj,6), stat(jj,7), stat(jj, 8)); + if size(stat,2)>8 + fprintf('\t%e\t%e\t%e\t%e', stat(jj,9), stat(jj,10), stat(jj,11), stat(jj,12)); + end + fprintf('\n'); + end + fprintf('\n'); + {%- else %} + fprintf('\niter\tqp_status\tqp_iter'); + if size(stat,2)>3 + fprintf('\tqp_res_stat\tqp_res_eq\tqp_res_ineq\tqp_res_comp'); + end + fprintf('\n'); + for jj=1:size(stat,1) + fprintf('%d\t%d\t\t%d', stat(jj,1), stat(jj,2), stat(jj,3)); + if size(stat,2)>3 + fprintf('\t%e\t%e\t%e\t%e', stat(jj,4), stat(jj,5), stat(jj,6), stat(jj,7)); + end + fprintf('\n'); + end + {% endif %} + + else + fprintf('unsupported field in function print of acados_ocp.print, got %s', field); + keyboard + end + + end + + end % methods + +end % class + diff --git a/iqpilot/third_party/acados/acados_template/casadi_function_generation.py b/iqpilot/third_party/acados/acados_template/casadi_function_generation.py new file mode 100644 index 000000000..6373a2809 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/casadi_function_generation.py @@ -0,0 +1,708 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +import os +import casadi as ca +from .utils import is_empty, casadi_length + + +def get_casadi_symbol(x): + if isinstance(x, ca.MX): + return ca.MX.sym + elif isinstance(x, ca.SX): + return ca.SX.sym + else: + raise TypeError("Expected casadi SX or MX.") + +################ +# Dynamics +################ + + +def generate_c_code_discrete_dynamics( model, opts ): + + casadi_codegen_opts = dict(mex=False, casadi_int='int', casadi_real='double') + + # load model + x = model.x + u = model.u + p = model.p + phi = model.disc_dyn_expr + model_name = model.name + nx = casadi_length(x) + + symbol = get_casadi_symbol(x) + # assume nx1 = nx !!! + lam = symbol('lam', nx, 1) + + # generate jacobians + ux = ca.vertcat(u,x) + jac_ux = ca.jacobian(phi, ux) + # generate adjoint + adj_ux = ca.jtimes(phi, ux, lam, True) + # generate hessian + hess_ux = ca.jacobian(adj_ux, ux) + + # change directory + cwd = os.getcwd() + model_dir = os.path.abspath(os.path.join(opts["code_export_directory"], f'{model_name}_model')) + if not os.path.exists(model_dir): + os.makedirs(model_dir) + os.chdir(model_dir) + + # set up & generate ca.Functions + fun_name = model_name + '_dyn_disc_phi_fun' + phi_fun = ca.Function(fun_name, [x, u, p], [phi]) + phi_fun.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_dyn_disc_phi_fun_jac' + phi_fun_jac_ut_xt = ca.Function(fun_name, [x, u, p], [phi, jac_ux.T]) + phi_fun_jac_ut_xt.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_dyn_disc_phi_fun_jac_hess' + phi_fun_jac_ut_xt_hess = ca.Function(fun_name, [x, u, lam, p], [phi, jac_ux.T, hess_ux]) + phi_fun_jac_ut_xt_hess.generate(fun_name, casadi_codegen_opts) + + os.chdir(cwd) + return + + + +def generate_c_code_explicit_ode( model, opts ): + + casadi_codegen_opts = dict(mex=False, casadi_int='int', casadi_real='double') + + generate_hess = opts["generate_hess"] + + # load model + x = model.x + u = model.u + p = model.p + f_expl = model.f_expl_expr + model_name = model.name + + ## get model dimensions + nx = x.size()[0] + nu = u.size()[0] + + symbol = get_casadi_symbol(x) + + ## set up functions to be exported + Sx = symbol('Sx', nx, nx) + Sp = symbol('Sp', nx, nu) + lambdaX = symbol('lambdaX', nx, 1) + + fun_name = model_name + '_expl_ode_fun' + + ## Set up functions + expl_ode_fun = ca.Function(fun_name, [x, u, p], [f_expl]) + + vdeX = ca.jtimes(f_expl,x,Sx) + vdeP = ca.jacobian(f_expl,u) + ca.jtimes(f_expl,x,Sp) + + fun_name = model_name + '_expl_vde_forw' + + expl_vde_forw = ca.Function(fun_name, [x, Sx, Sp, u, p], [f_expl, vdeX, vdeP]) + + adj = ca.jtimes(f_expl, ca.vertcat(x, u), lambdaX, True) + + fun_name = model_name + '_expl_vde_adj' + expl_vde_adj = ca.Function(fun_name, [x, lambdaX, u, p], [adj]) + + if generate_hess: + S_forw = ca.vertcat(ca.horzcat(Sx, Sp), ca.horzcat(ca.DM.zeros(nu,nx), ca.DM.eye(nu))) + hess = ca.mtimes(ca.transpose(S_forw),ca.jtimes(adj, ca.vertcat(x,u), S_forw)) + hess2 = [] + for j in range(nx+nu): + for i in range(j,nx+nu): + hess2 = ca.vertcat(hess2, hess[i,j]) + + fun_name = model_name + '_expl_ode_hess' + expl_ode_hess = ca.Function(fun_name, [x, Sx, Sp, lambdaX, u, p], [adj, hess2]) + + # change directory + cwd = os.getcwd() + model_dir = os.path.abspath(os.path.join(opts["code_export_directory"], f'{model_name}_model')) + if not os.path.exists(model_dir): + os.makedirs(model_dir) + os.chdir(model_dir) + + # generate C code + fun_name = model_name + '_expl_ode_fun' + expl_ode_fun.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_expl_vde_forw' + expl_vde_forw.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_expl_vde_adj' + expl_vde_adj.generate(fun_name, casadi_codegen_opts) + + if generate_hess: + fun_name = model_name + '_expl_ode_hess' + expl_ode_hess.generate(fun_name, casadi_codegen_opts) + os.chdir(cwd) + + return + + +def generate_c_code_implicit_ode( model, opts ): + + casadi_codegen_opts = dict(mex=False, casadi_int='int', casadi_real='double') + + # load model + x = model.x + xdot = model.xdot + u = model.u + z = model.z + p = model.p + f_impl = model.f_impl_expr + model_name = model.name + + # get model dimensions + nx = casadi_length(x) + nz = casadi_length(z) + + # generate jacobians + jac_x = ca.jacobian(f_impl, x) + jac_xdot = ca.jacobian(f_impl, xdot) + jac_u = ca.jacobian(f_impl, u) + jac_z = ca.jacobian(f_impl, z) + + # Set up functions + p = model.p + fun_name = model_name + '_impl_dae_fun' + impl_dae_fun = ca.Function(fun_name, [x, xdot, u, z, p], [f_impl]) + + fun_name = model_name + '_impl_dae_fun_jac_x_xdot_z' + impl_dae_fun_jac_x_xdot_z = ca.Function(fun_name, [x, xdot, u, z, p], [f_impl, jac_x, jac_xdot, jac_z]) + + fun_name = model_name + '_impl_dae_fun_jac_x_xdot_u_z' + impl_dae_fun_jac_x_xdot_u_z = ca.Function(fun_name, [x, xdot, u, z, p], [f_impl, jac_x, jac_xdot, jac_u, jac_z]) + + fun_name = model_name + '_impl_dae_fun_jac_x_xdot_u' + impl_dae_fun_jac_x_xdot_u = ca.Function(fun_name, [x, xdot, u, z, p], [f_impl, jac_x, jac_xdot, jac_u]) + + fun_name = model_name + '_impl_dae_jac_x_xdot_u_z' + impl_dae_jac_x_xdot_u_z = ca.Function(fun_name, [x, xdot, u, z, p], [jac_x, jac_xdot, jac_u, jac_z]) + + if opts["generate_hess"]: + x_xdot_z_u = ca.vertcat(x, xdot, z, u) + symbol = get_casadi_symbol(x) + multiplier = symbol('multiplier', nx + nz) + ADJ = ca.jtimes(f_impl, x_xdot_z_u, multiplier, True) + HESS = ca.jacobian(ADJ, x_xdot_z_u) + fun_name = model_name + '_impl_dae_hess' + impl_dae_hess = ca.Function(fun_name, [x, xdot, u, z, multiplier, p], [HESS]) + + # change directory + cwd = os.getcwd() + model_dir = os.path.abspath(os.path.join(opts["code_export_directory"], f'{model_name}_model')) + if not os.path.exists(model_dir): + os.makedirs(model_dir) + os.chdir(model_dir) + + # generate C code + fun_name = model_name + '_impl_dae_fun' + impl_dae_fun.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_impl_dae_fun_jac_x_xdot_z' + impl_dae_fun_jac_x_xdot_z.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_impl_dae_jac_x_xdot_u_z' + impl_dae_jac_x_xdot_u_z.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_impl_dae_fun_jac_x_xdot_u_z' + impl_dae_fun_jac_x_xdot_u_z.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_impl_dae_fun_jac_x_xdot_u' + impl_dae_fun_jac_x_xdot_u.generate(fun_name, casadi_codegen_opts) + + if opts["generate_hess"]: + fun_name = model_name + '_impl_dae_hess' + impl_dae_hess.generate(fun_name, casadi_codegen_opts) + + os.chdir(cwd) + return + + +def generate_c_code_gnsf( model, opts ): + + casadi_codegen_opts = dict(mex=False, casadi_int='int', casadi_real='double') + + model_name = model.name + + # set up directory + cwd = os.getcwd() + model_dir = os.path.abspath(os.path.join(opts["code_export_directory"], f'{model_name}_model')) + if not os.path.exists(model_dir): + os.makedirs(model_dir) + os.chdir(model_dir) + + # obtain gnsf dimensions + get_matrices_fun = model.get_matrices_fun + phi_fun = model.phi_fun + + size_gnsf_A = get_matrices_fun.size_out(0) + gnsf_nx1 = size_gnsf_A[1] + gnsf_nz1 = size_gnsf_A[0] - size_gnsf_A[1] + gnsf_nuhat = max(phi_fun.size_in(1)) + gnsf_ny = max(phi_fun.size_in(0)) + gnsf_nout = max(phi_fun.size_out(0)) + + # set up expressions + # if the model uses ca.MX because of cost/constraints + # the DAE can be exported as ca.SX -> detect GNSF in Matlab + # -> evaluated ca.SX GNSF functions with ca.MX. + u = model.u + symbol = get_casadi_symbol(u) + + y = symbol("y", gnsf_ny, 1) + uhat = symbol("uhat", gnsf_nuhat, 1) + p = model.p + x1 = symbol("gnsf_x1", gnsf_nx1, 1) + x1dot = symbol("gnsf_x1dot", gnsf_nx1, 1) + z1 = symbol("gnsf_z1", gnsf_nz1, 1) + dummy = symbol("gnsf_dummy", 1, 1) + empty_var = symbol("gnsf_empty_var", 0, 0) + + ## generate C code + fun_name = model_name + '_gnsf_phi_fun' + phi_fun_ = ca.Function(fun_name, [y, uhat, p], [phi_fun(y, uhat, p)]) + phi_fun_.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_gnsf_phi_fun_jac_y' + phi_fun_jac_y = model.phi_fun_jac_y + phi_fun_jac_y_ = ca.Function(fun_name, [y, uhat, p], phi_fun_jac_y(y, uhat, p)) + phi_fun_jac_y_.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_gnsf_phi_jac_y_uhat' + phi_jac_y_uhat = model.phi_jac_y_uhat + phi_jac_y_uhat_ = ca.Function(fun_name, [y, uhat, p], phi_jac_y_uhat(y, uhat, p)) + phi_jac_y_uhat_.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_gnsf_f_lo_fun_jac_x1k1uz' + f_lo_fun_jac_x1k1uz = model.f_lo_fun_jac_x1k1uz + f_lo_fun_jac_x1k1uz_eval = f_lo_fun_jac_x1k1uz(x1, x1dot, z1, u, p) + + # avoid codegeneration issue + if not isinstance(f_lo_fun_jac_x1k1uz_eval, tuple) and is_empty(f_lo_fun_jac_x1k1uz_eval): + f_lo_fun_jac_x1k1uz_eval = [empty_var] + + f_lo_fun_jac_x1k1uz_ = ca.Function(fun_name, [x1, x1dot, z1, u, p], + f_lo_fun_jac_x1k1uz_eval) + f_lo_fun_jac_x1k1uz_.generate(fun_name, casadi_codegen_opts) + + fun_name = model_name + '_gnsf_get_matrices_fun' + get_matrices_fun_ = ca.Function(fun_name, [dummy], get_matrices_fun(1)) + get_matrices_fun_.generate(fun_name, casadi_codegen_opts) + + # remove fields for json dump + del model.phi_fun + del model.phi_fun_jac_y + del model.phi_jac_y_uhat + del model.f_lo_fun_jac_x1k1uz + del model.get_matrices_fun + + os.chdir(cwd) + + return + + +################ +# Cost +################ + +def generate_c_code_external_cost(model, stage_type, opts): + + casadi_codegen_opts = dict(mex=False, casadi_int='int', casadi_real='double') + + x = model.x + p = model.p + u = model.u + z = model.z + symbol = get_casadi_symbol(x) + + if stage_type == 'terminal': + suffix_name = "_cost_ext_cost_e_fun" + suffix_name_hess = "_cost_ext_cost_e_fun_jac_hess" + suffix_name_jac = "_cost_ext_cost_e_fun_jac" + ext_cost = model.cost_expr_ext_cost_e + custom_hess = model.cost_expr_ext_cost_custom_hess_e + # Last stage cannot depend on u and z + u = symbol("u", 0, 0) + z = symbol("z", 0, 0) + + elif stage_type == 'path': + suffix_name = "_cost_ext_cost_fun" + suffix_name_hess = "_cost_ext_cost_fun_jac_hess" + suffix_name_jac = "_cost_ext_cost_fun_jac" + ext_cost = model.cost_expr_ext_cost + custom_hess = model.cost_expr_ext_cost_custom_hess + + elif stage_type == 'initial': + suffix_name = "_cost_ext_cost_0_fun" + suffix_name_hess = "_cost_ext_cost_0_fun_jac_hess" + suffix_name_jac = "_cost_ext_cost_0_fun_jac" + ext_cost = model.cost_expr_ext_cost_0 + custom_hess = model.cost_expr_ext_cost_custom_hess_0 + + nunx = x.shape[0] + u.shape[0] + + # set up functions to be exported + fun_name = model.name + suffix_name + fun_name_hess = model.name + suffix_name_hess + fun_name_jac = model.name + suffix_name_jac + + # generate expression for full gradient and Hessian + hess_uxz, grad_uxz = ca.hessian(ext_cost, ca.vertcat(u, x, z)) + + hess_ux = hess_uxz[:nunx, :nunx] + hess_z = hess_uxz[nunx:, nunx:] + hess_z_ux = hess_uxz[nunx:, :nunx] + + if custom_hess is not None: + hess_ux = custom_hess + + ext_cost_fun = ca.Function(fun_name, [x, u, z, p], [ext_cost]) + + ext_cost_fun_jac_hess = ca.Function( + fun_name_hess, [x, u, z, p], [ext_cost, grad_uxz, hess_ux, hess_z, hess_z_ux] + ) + ext_cost_fun_jac = ca.Function( + fun_name_jac, [x, u, z, p], [ext_cost, grad_uxz] + ) + + # change directory + cwd = os.getcwd() + cost_dir = os.path.abspath(os.path.join(opts["code_export_directory"], f'{model.name}_cost')) + if not os.path.exists(cost_dir): + os.makedirs(cost_dir) + os.chdir(cost_dir) + + ext_cost_fun.generate(fun_name, casadi_codegen_opts) + ext_cost_fun_jac_hess.generate(fun_name_hess, casadi_codegen_opts) + ext_cost_fun_jac.generate(fun_name_jac, casadi_codegen_opts) + + os.chdir(cwd) + return + + +def generate_c_code_nls_cost( model, cost_name, stage_type, opts ): + + casadi_codegen_opts = dict(mex=False, casadi_int='int', casadi_real='double') + + x = model.x + z = model.z + p = model.p + u = model.u + + symbol = get_casadi_symbol(x) + + if stage_type == 'terminal': + middle_name = '_cost_y_e' + u = symbol('u', 0, 0) + y_expr = model.cost_y_expr_e + + elif stage_type == 'initial': + middle_name = '_cost_y_0' + y_expr = model.cost_y_expr_0 + + elif stage_type == 'path': + middle_name = '_cost_y' + y_expr = model.cost_y_expr + + # change directory + cwd = os.getcwd() + cost_dir = os.path.abspath(os.path.join(opts["code_export_directory"], f'{model.name}_cost')) + if not os.path.exists(cost_dir): + os.makedirs(cost_dir) + os.chdir(cost_dir) + + # set up expressions + cost_jac_expr = ca.transpose(ca.jacobian(y_expr, ca.vertcat(u, x))) + dy_dz = ca.jacobian(y_expr, z) + ny = casadi_length(y_expr) + + y = symbol('y', ny, 1) + + y_adj = ca.jtimes(y_expr, ca.vertcat(u, x), y, True) + y_hess = ca.jacobian(y_adj, ca.vertcat(u, x)) + + ## generate C code + suffix_name = '_fun' + fun_name = cost_name + middle_name + suffix_name + y_fun = ca.Function( fun_name, [x, u, z, p], [ y_expr ]) + y_fun.generate( fun_name, casadi_codegen_opts ) + + suffix_name = '_fun_jac_ut_xt' + fun_name = cost_name + middle_name + suffix_name + y_fun_jac_ut_xt = ca.Function(fun_name, [x, u, z, p], [ y_expr, cost_jac_expr, dy_dz ]) + y_fun_jac_ut_xt.generate( fun_name, casadi_codegen_opts ) + + suffix_name = '_hess' + fun_name = cost_name + middle_name + suffix_name + y_hess = ca.Function(fun_name, [x, u, z, y, p], [ y_hess ]) + y_hess.generate( fun_name, casadi_codegen_opts ) + + os.chdir(cwd) + + return + + + +def generate_c_code_conl_cost(model, cost_name, stage_type, opts): + + casadi_codegen_opts = dict(mex=False, casadi_int='int', casadi_real='double') + + x = model.x + z = model.z + p = model.p + + symbol = get_casadi_symbol(x) + + if stage_type == 'terminal': + u = symbol('u', 0, 0) + + yref = model.cost_r_in_psi_expr_e + inner_expr = model.cost_y_expr_e - yref + outer_expr = model.cost_psi_expr_e + res_expr = model.cost_r_in_psi_expr_e + + suffix_name_fun = '_conl_cost_e_fun' + suffix_name_fun_jac_hess = '_conl_cost_e_fun_jac_hess' + + custom_hess = model.cost_conl_custom_outer_hess_e + + elif stage_type == 'initial': + u = model.u + + yref = model.cost_r_in_psi_expr_0 + inner_expr = model.cost_y_expr_0 - yref + outer_expr = model.cost_psi_expr_0 + res_expr = model.cost_r_in_psi_expr_0 + + suffix_name_fun = '_conl_cost_0_fun' + suffix_name_fun_jac_hess = '_conl_cost_0_fun_jac_hess' + + custom_hess = model.cost_conl_custom_outer_hess_0 + + elif stage_type == 'path': + u = model.u + + yref = model.cost_r_in_psi_expr + inner_expr = model.cost_y_expr - yref + outer_expr = model.cost_psi_expr + res_expr = model.cost_r_in_psi_expr + + suffix_name_fun = '_conl_cost_fun' + suffix_name_fun_jac_hess = '_conl_cost_fun_jac_hess' + + custom_hess = model.cost_conl_custom_outer_hess + + # set up function names + fun_name_cost_fun = model.name + suffix_name_fun + fun_name_cost_fun_jac_hess = model.name + suffix_name_fun_jac_hess + + # set up functions to be exported + outer_loss_fun = ca.Function('psi', [res_expr, p], [outer_expr]) + cost_expr = outer_loss_fun(inner_expr, p) + + outer_loss_grad_fun = ca.Function('outer_loss_grad', [res_expr, p], [ca.jacobian(outer_expr, res_expr).T]) + + if custom_hess is None: + outer_hess_fun = ca.Function('inner_hess', [res_expr, p], [ca.hessian(outer_loss_fun(res_expr, p), res_expr)[0]]) + else: + outer_hess_fun = ca.Function('inner_hess', [res_expr, p], [custom_hess]) + + Jt_ux_expr = ca.jacobian(inner_expr, ca.vertcat(u, x)).T + Jt_z_expr = ca.jacobian(inner_expr, z).T + + cost_fun = ca.Function( + fun_name_cost_fun, + [x, u, z, yref, p], + [cost_expr]) + + cost_fun_jac_hess = ca.Function( + fun_name_cost_fun_jac_hess, + [x, u, z, yref, p], + [cost_expr, outer_loss_grad_fun(inner_expr, p), Jt_ux_expr, Jt_z_expr, outer_hess_fun(inner_expr, p)] + ) + # change directory + cwd = os.getcwd() + cost_dir = os.path.abspath(os.path.join(opts["code_export_directory"], f'{model.name}_cost')) + if not os.path.exists(cost_dir): + os.makedirs(cost_dir) + os.chdir(cost_dir) + + # generate C code + cost_fun.generate(fun_name_cost_fun, casadi_codegen_opts) + cost_fun_jac_hess.generate(fun_name_cost_fun_jac_hess, casadi_codegen_opts) + + os.chdir(cwd) + + return + + +################ +# Constraints +################ +def generate_c_code_constraint( model, con_name, is_terminal, opts ): + + casadi_codegen_opts = dict(mex=False, casadi_int='int', casadi_real='double') + + # load constraint variables and expression + x = model.x + p = model.p + + symbol = get_casadi_symbol(x) + + if is_terminal: + con_h_expr = model.con_h_expr_e + con_phi_expr = model.con_phi_expr_e + # create dummy u, z + u = symbol('u', 0, 0) + z = symbol('z', 0, 0) + else: + con_h_expr = model.con_h_expr + con_phi_expr = model.con_phi_expr + u = model.u + z = model.z + + if (not is_empty(con_h_expr)) and (not is_empty(con_phi_expr)): + raise Exception("acados: you can either have constraint_h, or constraint_phi, not both.") + + if (is_empty(con_h_expr) and is_empty(con_phi_expr)): + # both empty -> nothing to generate + return + + if is_empty(con_h_expr): + constr_type = 'BGP' + else: + constr_type = 'BGH' + + if is_empty(p): + p = symbol('p', 0, 0) + + if is_empty(z): + z = symbol('z', 0, 0) + + if not (is_empty(con_h_expr)) and opts['generate_hess']: + # multipliers for hessian + nh = casadi_length(con_h_expr) + lam_h = symbol('lam_h', nh, 1) + + # set up & change directory + cwd = os.getcwd() + constraints_dir = os.path.abspath(os.path.join(opts["code_export_directory"], f'{model.name}_constraints')) + if not os.path.exists(constraints_dir): + os.makedirs(constraints_dir) + os.chdir(constraints_dir) + + # export casadi functions + if constr_type == 'BGH': + if is_terminal: + fun_name = con_name + '_constr_h_e_fun_jac_uxt_zt' + else: + fun_name = con_name + '_constr_h_fun_jac_uxt_zt' + + jac_ux_t = ca.transpose(ca.jacobian(con_h_expr, ca.vertcat(u,x))) + jac_z_t = ca.jacobian(con_h_expr, z) + constraint_fun_jac_tran = ca.Function(fun_name, [x, u, z, p], \ + [con_h_expr, jac_ux_t, jac_z_t]) + + constraint_fun_jac_tran.generate(fun_name, casadi_codegen_opts) + if opts['generate_hess']: + + if is_terminal: + fun_name = con_name + '_constr_h_e_fun_jac_uxt_zt_hess' + else: + fun_name = con_name + '_constr_h_fun_jac_uxt_zt_hess' + + # adjoint + adj_ux = ca.jtimes(con_h_expr, ca.vertcat(u, x), lam_h, True) + # hessian + hess_ux = ca.jacobian(adj_ux, ca.vertcat(u, x)) + + adj_z = ca.jtimes(con_h_expr, z, lam_h, True) + hess_z = ca.jacobian(adj_z, z) + + # set up functions + constraint_fun_jac_tran_hess = \ + ca.Function(fun_name, [x, u, lam_h, z, p], \ + [con_h_expr, jac_ux_t, hess_ux, jac_z_t, hess_z]) + + # generate C code + constraint_fun_jac_tran_hess.generate(fun_name, casadi_codegen_opts) + + if is_terminal: + fun_name = con_name + '_constr_h_e_fun' + else: + fun_name = con_name + '_constr_h_fun' + h_fun = ca.Function(fun_name, [x, u, z, p], [con_h_expr]) + h_fun.generate(fun_name, casadi_codegen_opts) + + else: # BGP constraint + if is_terminal: + fun_name = con_name + '_phi_e_constraint' + r = model.con_r_in_phi_e + con_r_expr = model.con_r_expr_e + else: + fun_name = con_name + '_phi_constraint' + r = model.con_r_in_phi + con_r_expr = model.con_r_expr + + nphi = casadi_length(con_phi_expr) + con_phi_expr_x_u_z = ca.substitute(con_phi_expr, r, con_r_expr) + phi_jac_u = ca.jacobian(con_phi_expr_x_u_z, u) + phi_jac_x = ca.jacobian(con_phi_expr_x_u_z, x) + phi_jac_z = ca.jacobian(con_phi_expr_x_u_z, z) + + hess = ca.hessian(con_phi_expr[0], r)[0] + for i in range(1, nphi): + hess = ca.vertcat(hess, ca.hessian(con_phi_expr[i], r)[0]) + + r_jac_u = ca.jacobian(con_r_expr, u) + r_jac_x = ca.jacobian(con_r_expr, x) + + constraint_phi = \ + ca.Function(fun_name, [x, u, z, p], \ + [con_phi_expr_x_u_z, \ + ca.vertcat(ca.transpose(phi_jac_u), ca.transpose(phi_jac_x)), \ + ca.transpose(phi_jac_z), \ + hess, + ca.vertcat(ca.transpose(r_jac_u), ca.transpose(r_jac_x))]) + + constraint_phi.generate(fun_name, casadi_codegen_opts) + + # change directory back + os.chdir(cwd) + + return + diff --git a/iqpilot/third_party/acados/acados_template/gnsf/check_reformulation.py b/iqpilot/third_party/acados/acados_template/gnsf/check_reformulation.py new file mode 100644 index 000000000..291e2fa35 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/check_reformulation.py @@ -0,0 +1,216 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +from ..utils import casadi_length +from casadi import * +import numpy as np + + +def check_reformulation(model, gnsf, print_info): + + ## Description: + # this function takes the implicit ODE/ index-1 DAE and a gnsf structure + # to evaluate both models at num_eval random points x0, x0dot, z0, u0 + # if for all points the relative error is <= TOL, the function will return:: + # 1, otherwise it will give an error. + + TOL = 1e-14 + num_eval = 10 + + # get dimensions + nx = gnsf["nx"] + nu = gnsf["nu"] + nz = gnsf["nz"] + nx1 = gnsf["nx1"] + nx2 = gnsf["nx2"] + nz1 = gnsf["nz1"] + nz2 = gnsf["nz2"] + n_out = gnsf["n_out"] + + # get model matrices + A = gnsf["A"] + B = gnsf["B"] + C = gnsf["C"] + E = gnsf["E"] + c = gnsf["c"] + + L_x = gnsf["L_x"] + L_xdot = gnsf["L_xdot"] + L_z = gnsf["L_z"] + L_u = gnsf["L_u"] + + A_LO = gnsf["A_LO"] + E_LO = gnsf["E_LO"] + B_LO = gnsf["B_LO"] + c_LO = gnsf["c_LO"] + + I_x1 = range(nx1) + I_x2 = range(nx1, nx) + + I_z1 = range(nz1) + I_z2 = range(nz1, nz) + + idx_perm_f = gnsf["idx_perm_f"] + + # get casadi variables + x = gnsf["x"] + xdot = gnsf["xdot"] + z = gnsf["z"] + u = gnsf["u"] + y = gnsf["y"] + uhat = gnsf["uhat"] + p = gnsf["p"] + + # create functions + impl_dae_fun = Function("impl_dae_fun", [x, xdot, u, z, p], [model.f_impl_expr]) + phi_fun = Function("phi_fun", [y, uhat, p], [gnsf["phi_expr"]]) + f_lo_fun = Function( + "f_lo_fun", [x[range(nx1)], xdot[range(nx1)], z, u, p], [gnsf["f_lo_expr"]] + ) + + # print(gnsf) + # print(gnsf["n_out"]) + + for i_check in range(num_eval): + # generate random values + x0 = np.random.rand(nx, 1) + x0dot = np.random.rand(nx, 1) + z0 = np.random.rand(nz, 1) + u0 = np.random.rand(nu, 1) + + if gnsf["ny"] > 0: + y0 = L_x @ x0[I_x1] + L_xdot @ x0dot[I_x1] + L_z @ z0[I_z1] + else: + y0 = [] + if gnsf["nuhat"] > 0: + uhat0 = L_u @ u0 + else: + uhat0 = [] + + # eval functions + p0 = np.random.rand(gnsf["np"], 1) + f_impl_val = impl_dae_fun(x0, x0dot, u0, z0, p0).full() + phi_val = phi_fun(y0, uhat0, p0) + f_lo_val = f_lo_fun(x0[I_x1], x0dot[I_x1], z0[I_z1], u0, p0) + + f_impl_val = f_impl_val[idx_perm_f] + # eval gnsf + if n_out > 0: + C_phi = C @ phi_val + else: + C_phi = np.zeros((nx1 + nz1, 1)) + try: + gnsf_val1 = ( + A @ x0[I_x1] + B @ u0 + C_phi + c - E @ vertcat(x0dot[I_x1], z0[I_z1]) + ) + # gnsf_1 = (A @ x[I_x1] + B @ u + C_phi + c - E @ vertcat(xdot[I_x1], z[I_z1])) + except: + import pdb + + pdb.set_trace() + + if nx2 > 0: # eval LOS: + gnsf_val2 = ( + A_LO @ x0[I_x2] + + B_LO @ u0 + + c_LO + + f_lo_val + - E_LO @ vertcat(x0dot[I_x2], z0[I_z2]) + ) + gnsf_val = vertcat(gnsf_val1, gnsf_val2).full() + else: + gnsf_val = gnsf_val1.full() + # compute error and check + rel_error = np.linalg.norm(f_impl_val - gnsf_val) / np.linalg.norm(f_impl_val) + + if rel_error > TOL: + print("transcription failed rel_error > TOL") + print("you are in debug mode now: import pdb; pdb.set_trace()") + abs_error = gnsf_val - f_impl_val + # T = table(f_impl_val, gnsf_val, abs_error) + # print(T) + print("abs_error:", abs_error) + # error('transcription failed rel_error > TOL') + # check = 0 + import pdb + + pdb.set_trace() + if print_info: + print(" ") + print("model reformulation checked: relative error <= TOL = ", str(TOL)) + print(" ") + check = 1 + ## helpful for debugging: + # # use in calling function and compare + # # compare f_impl(i) with gnsf_val1(i) + # + + # nx = gnsf['nx'] + # nu = gnsf['nu'] + # nz = gnsf['nz'] + # nx1 = gnsf['nx1'] + # nx2 = gnsf['nx2'] + # + # A = gnsf['A'] + # B = gnsf['B'] + # C = gnsf['C'] + # E = gnsf['E'] + # c = gnsf['c'] + # + # L_x = gnsf['L_x'] + # L_z = gnsf['L_z'] + # L_xdot = gnsf['L_xdot'] + # L_u = gnsf['L_u'] + # + # A_LO = gnsf['A_LO'] + # + # x0 = rand(nx, 1) + # x0dot = rand(nx, 1) + # z0 = rand(nz, 1) + # u0 = rand(nu, 1) + # I_x1 = range(nx1) + # I_x2 = nx1+range(nx) + # + # y0 = L_x @ x0[I_x1] + L_xdot @ x0dot[I_x1] + L_z @ z0 + # uhat0 = L_u @ u0 + # + # gnsf_val1 = (A @ x[I_x1] + B @ u + # C @ phi_current + c) - E @ [xdot[I_x1] z] + # gnsf_val1 = gnsf_val1.simplify() + # + # # gnsf_val2 = A_LO @ x[I_x2] + gnsf['f_lo_fun'](x[I_x1], xdot[I_x1], z, u) - xdot[I_x2] + # gnsf_val2 = A_LO @ x[I_x2] + gnsf['f_lo_fun'](x[I_x1], xdot[I_x1], z, u) - xdot[I_x2] + # + # + # gnsf_val = [gnsf_val1 gnsf_val2] + # gnsf_val = gnsf_val.simplify() + # dyn_expr_f = dyn_expr_f.simplify() + # import pdb; pdb.set_trace() + + return check diff --git a/iqpilot/third_party/acados/acados_template/gnsf/detect_affine_terms_reduce_nonlinearity.py b/iqpilot/third_party/acados/acados_template/gnsf/detect_affine_terms_reduce_nonlinearity.py new file mode 100644 index 000000000..ebf1f373a --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/detect_affine_terms_reduce_nonlinearity.py @@ -0,0 +1,278 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +from casadi import * +from .check_reformulation import check_reformulation +from .determine_input_nonlinearity_function import determine_input_nonlinearity_function +from ..utils import casadi_length, print_casadi_expression + + +def detect_affine_terms_reduce_nonlinearity(gnsf, acados_ocp, print_info): + + ## Description + # this function takes a gnsf structure with trivial model matrices (A, B, + # E, c are zeros, and C is eye). + # It detects all affine linear terms and sets up an equivalent model in the + # GNSF structure, where all affine linear terms are modeled through the + # matrices A, B, E, c and the linear output system (LOS) is empty. + # NOTE: model is just taken as an argument to check equivalence of the + # models within the function. + + model = acados_ocp.model + if print_info: + print(" ") + print("====================================================================") + print(" ") + print("============ Detect affine-linear dependencies ==================") + print(" ") + print("====================================================================") + print(" ") + # symbolics + x = gnsf["x"] + xdot = gnsf["xdot"] + u = gnsf["u"] + z = gnsf["z"] + + # dimensions + nx = gnsf["nx"] + nu = gnsf["nu"] + nz = gnsf["nz"] + + ny_old = gnsf["ny"] + nuhat_old = gnsf["nuhat"] + + ## Represent all affine dependencies through the model matrices A, B, E, c + ## determine A + n_nodes_current = n_nodes(gnsf["phi_expr"]) + + for ii in range(casadi_length(gnsf["phi_expr"])): + fii = gnsf["phi_expr"][ii] + for ix in range(nx): + var = x[ix] + varname = var.name + # symbolic jacobian of fii w.r.t. xi + jac_fii_xi = jacobian(fii, var) + if jac_fii_xi.is_constant(): + # jacobian value + jac_fii_xi_fun = Function("jac_fii_xi_fun", [x[1]], [jac_fii_xi]) + # x[1] as input just to have a scalar input and call the function as follows: + gnsf["A"][ii, ix] = jac_fii_xi_fun(0).full() + else: + gnsf["A"][ii, ix] = 0 + if print_info: + print( + "phi(", + str(ii), + ") is nonlinear in x(", + str(ix), + ") = ", + varname, + ) + print(fii) + print("-----------------------------------------------------") + f_next = gnsf["phi_expr"] - gnsf["A"] @ x + f_next = simplify(f_next) + n_nodes_next = n_nodes(f_next) + + if print_info: + print("\n") + print(f"determined matrix A:") + print(gnsf["A"]) + print(f"reduced nonlinearity from {n_nodes_current} to {n_nodes_next} nodes") + # assert(n_nodes_current >= n_nodes_next,'n_nodes_current >= n_nodes_next FAILED') + gnsf["phi_expr"] = f_next + + check_reformulation(model, gnsf, print_info) + + ## determine B + n_nodes_current = n_nodes(gnsf["phi_expr"]) + + for ii in range(casadi_length(gnsf["phi_expr"])): + fii = gnsf["phi_expr"][ii] + for iu in range(nu): + var = u[iu] + varname = var.name + # symbolic jacobian of fii w.r.t. ui + jac_fii_ui = jacobian(fii, var) + if jac_fii_ui.is_constant(): # i.e. hessian is structural zero: + # jacobian value + jac_fii_ui_fun = Function("jac_fii_ui_fun", [x[1]], [jac_fii_ui]) + gnsf["B"][ii, iu] = jac_fii_ui_fun(0).full() + else: + gnsf["B"][ii, iu] = 0 + if print_info: + print(f"phi({ii}) is nonlinear in u(", str(iu), ") = ", varname) + print(fii) + print("-----------------------------------------------------") + f_next = gnsf["phi_expr"] - gnsf["B"] @ u + f_next = simplify(f_next) + n_nodes_next = n_nodes(f_next) + + if print_info: + print("\n") + print(f"determined matrix B:") + print(gnsf["B"]) + print(f"reduced nonlinearity from {n_nodes_current} to {n_nodes_next} nodes") + + gnsf["phi_expr"] = f_next + + check_reformulation(model, gnsf, print_info) + + ## determine E + n_nodes_current = n_nodes(gnsf["phi_expr"]) + k = vertcat(xdot, z) + + for ii in range(casadi_length(gnsf["phi_expr"])): + fii = gnsf["phi_expr"][ii] + for ik in range(casadi_length(k)): + # symbolic jacobian of fii w.r.t. ui + var = k[ik] + varname = var.name + jac_fii_ki = jacobian(fii, var) + if jac_fii_ki.is_constant(): + # jacobian value + jac_fii_ki_fun = Function("jac_fii_ki_fun", [x[1]], [jac_fii_ki]) + gnsf["E"][ii, ik] = -jac_fii_ki_fun(0).full() + else: + gnsf["E"][ii, ik] = 0 + if print_info: + print(f"phi( {ii}) is nonlinear in xdot_z({ik}) = ", varname) + print(fii) + print("-----------------------------------------------------") + f_next = gnsf["phi_expr"] + gnsf["E"] @ k + f_next = simplify(f_next) + n_nodes_next = n_nodes(f_next) + + if print_info: + print("\n") + print(f"determined matrix E:") + print(gnsf["E"]) + print(f"reduced nonlinearity from {n_nodes_current} to {n_nodes_next} nodes") + + gnsf["phi_expr"] = f_next + check_reformulation(model, gnsf, print_info) + + ## determine constant term c + + n_nodes_current = n_nodes(gnsf["phi_expr"]) + for ii in range(casadi_length(gnsf["phi_expr"])): + fii = gnsf["phi_expr"][ii] + if fii.is_constant(): + # function value goes into c + fii_fun = Function("fii_fun", [x[1]], [fii]) + gnsf["c"][ii] = fii_fun(0).full() + else: + gnsf["c"][ii] = 0 + if print_info: + print(f"phi(", str(ii), ") is NOT constant") + print(fii) + print("-----------------------------------------------------") + gnsf["phi_expr"] = gnsf["phi_expr"] - gnsf["c"] + gnsf["phi_expr"] = simplify(gnsf["phi_expr"]) + n_nodes_next = n_nodes(gnsf["phi_expr"]) + + if print_info: + print("\n") + print(f"determined vector c:") + print(gnsf["c"]) + print(f"reduced nonlinearity from {n_nodes_current} to {n_nodes_next} nodes") + + check_reformulation(model, gnsf, print_info) + + ## determine nonlinearity & corresponding matrix C + ## Reduce dimension of phi + n_nodes_current = n_nodes(gnsf["phi_expr"]) + ind_non_zero = [] + for ii in range(casadi_length(gnsf["phi_expr"])): + fii = gnsf["phi_expr"][ii] + fii = simplify(fii) + if not fii.is_zero(): + ind_non_zero = list(set.union(set(ind_non_zero), set([ii]))) + gnsf["phi_expr"] = gnsf["phi_expr"][ind_non_zero] + + # C + gnsf["C"] = np.zeros((nx + nz, len(ind_non_zero))) + for ii in range(len(ind_non_zero)): + gnsf["C"][ind_non_zero[ii], ii] = 1 + gnsf = determine_input_nonlinearity_function(gnsf) + n_nodes_next = n_nodes(gnsf["phi_expr"]) + + if print_info: + print(" ") + print("determined matrix C:") + print(gnsf["C"]) + print( + "---------------------------------------------------------------------------------" + ) + print( + "------------- Success: Affine linear terms detected -----------------------------" + ) + print( + "---------------------------------------------------------------------------------" + ) + print( + f'reduced nonlinearity dimension n_out from {nx+nz} to {gnsf["n_out"]}' + ) + print(f"reduced nonlinearity from {n_nodes_current} to {n_nodes_next} nodes") + print(" ") + print("phi now reads as:") + print_casadi_expression(gnsf["phi_expr"]) + + ## determine input of nonlinearity function + check_reformulation(model, gnsf, print_info) + + gnsf["ny"] = casadi_length(gnsf["y"]) + gnsf["nuhat"] = casadi_length(gnsf["uhat"]) + + if print_info: + print( + "-----------------------------------------------------------------------------------" + ) + print(" ") + print( + f"reduced input ny of phi from ", + str(ny_old), + " to ", + str(gnsf["ny"]), + ) + print( + f"reduced input nuhat of phi from ", + str(nuhat_old), + " to ", + str(gnsf["nuhat"]), + ) + print( + "-----------------------------------------------------------------------------------" + ) + + # if print_info: + # print(f"gnsf: {gnsf}") + + return gnsf diff --git a/iqpilot/third_party/acados/acados_template/gnsf/detect_gnsf_structure.py b/iqpilot/third_party/acados/acados_template/gnsf/detect_gnsf_structure.py new file mode 100644 index 000000000..24ffe643b --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/detect_gnsf_structure.py @@ -0,0 +1,240 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# +# Author: Jonathan Frey: jonathanpaulfrey(at)gmail.com + +from casadi import Function, jacobian, SX, vertcat, horzcat + +from .determine_trivial_gnsf_transcription import determine_trivial_gnsf_transcription +from .detect_affine_terms_reduce_nonlinearity import ( + detect_affine_terms_reduce_nonlinearity, +) +from .reformulate_with_LOS import reformulate_with_LOS +from .reformulate_with_invertible_E_mat import reformulate_with_invertible_E_mat +from .structure_detection_print_summary import structure_detection_print_summary +from .check_reformulation import check_reformulation + + +def detect_gnsf_structure(acados_ocp, transcribe_opts=None): + + ## Description + # This function takes a CasADi implicit ODE or index-1 DAE model "model" + # consisting of a CasADi expression f_impl in the symbolic CasADi + # variables x, xdot, u, z, (and possibly parameters p), which are also part + # of the model, as well as a model name. + # It will create a struct "gnsf" containing all information needed to use + # it with the gnsf integrator in acados. + # Additionally it will create the struct "reordered_model" which contains + # the permuted state vector and permuted f_impl, in which additionally some + # functions, which were made part of the linear output system of the gnsf, + # have changed signs. + + # Options: transcribe_opts is a Matlab struct consisting of booleans: + # print_info: if extensive information on how the model is processed + # is printed to the console. + # generate_gnsf_model: if the neccessary C functions to simulate the gnsf + # model with the acados implementation of the GNSF exploiting + # integrator should be generated. + # generate_gnsf_model: if the neccessary C functions to simulate the + # reordered model with the acados implementation of the IRK + # integrator should be generated. + # check_E_invertibility: if the transcription method should check if the + # assumption that the main blocks of the matrix gnsf.E are invertible + # holds. If not, the method will try to reformulate the gnsf model + # with a different model, such that the assumption holds. + + # acados_root_dir = getenv('ACADOS_INSTALL_DIR') + + ## load transcribe_opts + if transcribe_opts is None: + print("WARNING: GNSF structure detection called without transcribe_opts") + print(" using default settings") + print("") + transcribe_opts = dict() + + if "print_info" in transcribe_opts: + print_info = transcribe_opts["print_info"] + else: + print_info = 1 + print("print_info option was not set - default is true") + + if "detect_LOS" in transcribe_opts: + detect_LOS = transcribe_opts["detect_LOS"] + else: + detect_LOS = 1 + if print_info: + print("detect_LOS option was not set - default is true") + + if "check_E_invertibility" in transcribe_opts: + check_E_invertibility = transcribe_opts["check_E_invertibility"] + else: + check_E_invertibility = 1 + if print_info: + print("check_E_invertibility option was not set - default is true") + + ## Reformulate implicit index-1 DAE into GNSF form + # (Generalized nonlinear static feedback) + gnsf = determine_trivial_gnsf_transcription(acados_ocp, print_info) + gnsf = detect_affine_terms_reduce_nonlinearity(gnsf, acados_ocp, print_info) + + if detect_LOS: + gnsf = reformulate_with_LOS(acados_ocp, gnsf, print_info) + + if check_E_invertibility: + gnsf = reformulate_with_invertible_E_mat(gnsf, acados_ocp, print_info) + + # detect purely linear model + if gnsf["nx1"] == 0 and gnsf["nz1"] == 0 and gnsf["nontrivial_f_LO"] == 0: + gnsf["purely_linear"] = 1 + else: + gnsf["purely_linear"] = 0 + + structure_detection_print_summary(gnsf, acados_ocp) + check_reformulation(acados_ocp.model, gnsf, print_info) + + ## copy relevant fields from gnsf to model + acados_ocp.model.get_matrices_fun = Function() + dummy = acados_ocp.model.x[0] + model_name = acados_ocp.model.name + + get_matrices_fun = Function( + f"{model_name}_gnsf_get_matrices_fun", + [dummy], + [ + gnsf["A"], + gnsf["B"], + gnsf["C"], + gnsf["E"], + gnsf["L_x"], + gnsf["L_xdot"], + gnsf["L_z"], + gnsf["L_u"], + gnsf["A_LO"], + gnsf["c"], + gnsf["E_LO"], + gnsf["B_LO"], + gnsf["nontrivial_f_LO"], + gnsf["purely_linear"], + gnsf["ipiv_x"] + 1, + gnsf["ipiv_z"] + 1, + gnsf["c_LO"], + ], + ) + + phi = gnsf["phi_expr"] + y = gnsf["y"] + uhat = gnsf["uhat"] + p = gnsf["p"] + + jac_phi_y = jacobian(phi, y) + jac_phi_uhat = jacobian(phi, uhat) + + phi_fun = Function(f"{model_name}_gnsf_phi_fun", [y, uhat, p], [phi]) + acados_ocp.model.phi_fun = phi_fun + acados_ocp.model.phi_fun_jac_y = Function( + f"{model_name}_gnsf_phi_fun_jac_y", [y, uhat, p], [phi, jac_phi_y] + ) + acados_ocp.model.phi_jac_y_uhat = Function( + f"{model_name}_gnsf_phi_jac_y_uhat", [y, uhat, p], [jac_phi_y, jac_phi_uhat] + ) + + x1 = acados_ocp.model.x[gnsf["idx_perm_x"][: gnsf["nx1"]]] + x1dot = acados_ocp.model.xdot[gnsf["idx_perm_x"][: gnsf["nx1"]]] + if gnsf["nz1"] > 0: + z1 = acados_ocp.model.z[gnsf["idx_perm_z"][: gnsf["nz1"]]] + else: + z1 = SX.sym("z1", 0, 0) + f_lo = gnsf["f_lo_expr"] + u = acados_ocp.model.u + acados_ocp.model.f_lo_fun_jac_x1k1uz = Function( + f"{model_name}_gnsf_f_lo_fun_jac_x1k1uz", + [x1, x1dot, z1, u, p], + [ + f_lo, + horzcat( + jacobian(f_lo, x1), + jacobian(f_lo, x1dot), + jacobian(f_lo, u), + jacobian(f_lo, z1), + ), + ], + ) + + acados_ocp.model.get_matrices_fun = get_matrices_fun + + size_gnsf_A = gnsf["A"].shape + acados_ocp.dims.gnsf_nx1 = size_gnsf_A[1] + acados_ocp.dims.gnsf_nz1 = size_gnsf_A[0] - size_gnsf_A[1] + acados_ocp.dims.gnsf_nuhat = max(phi_fun.size_in(1)) + acados_ocp.dims.gnsf_ny = max(phi_fun.size_in(0)) + acados_ocp.dims.gnsf_nout = max(phi_fun.size_out(0)) + + # # dim + # model['dim_gnsf_nx1'] = gnsf['nx1'] + # model['dim_gnsf_nx2'] = gnsf['nx2'] + # model['dim_gnsf_nz1'] = gnsf['nz1'] + # model['dim_gnsf_nz2'] = gnsf['nz2'] + # model['dim_gnsf_nuhat'] = gnsf['nuhat'] + # model['dim_gnsf_ny'] = gnsf['ny'] + # model['dim_gnsf_nout'] = gnsf['n_out'] + + # # sym + # model['sym_gnsf_y'] = gnsf['y'] + # model['sym_gnsf_uhat'] = gnsf['uhat'] + + # # data + # model['dyn_gnsf_A'] = gnsf['A'] + # model['dyn_gnsf_A_LO'] = gnsf['A_LO'] + # model['dyn_gnsf_B'] = gnsf['B'] + # model['dyn_gnsf_B_LO'] = gnsf['B_LO'] + # model['dyn_gnsf_E'] = gnsf['E'] + # model['dyn_gnsf_E_LO'] = gnsf['E_LO'] + # model['dyn_gnsf_C'] = gnsf['C'] + # model['dyn_gnsf_c'] = gnsf['c'] + # model['dyn_gnsf_c_LO'] = gnsf['c_LO'] + # model['dyn_gnsf_L_x'] = gnsf['L_x'] + # model['dyn_gnsf_L_xdot'] = gnsf['L_xdot'] + # model['dyn_gnsf_L_z'] = gnsf['L_z'] + # model['dyn_gnsf_L_u'] = gnsf['L_u'] + # model['dyn_gnsf_idx_perm_x'] = gnsf['idx_perm_x'] + # model['dyn_gnsf_ipiv_x'] = gnsf['ipiv_x'] + # model['dyn_gnsf_idx_perm_z'] = gnsf['idx_perm_z'] + # model['dyn_gnsf_ipiv_z'] = gnsf['ipiv_z'] + # model['dyn_gnsf_idx_perm_f'] = gnsf['idx_perm_f'] + # model['dyn_gnsf_ipiv_f'] = gnsf['ipiv_f'] + + # # flags + # model['dyn_gnsf_nontrivial_f_LO'] = gnsf['nontrivial_f_LO'] + # model['dyn_gnsf_purely_linear'] = gnsf['purely_linear'] + + # # casadi expr + # model['dyn_gnsf_expr_phi'] = gnsf['phi_expr'] + # model['dyn_gnsf_expr_f_lo'] = gnsf['f_lo_expr'] + + return acados_ocp diff --git a/iqpilot/third_party/acados/acados_template/gnsf/determine_input_nonlinearity_function.py b/iqpilot/third_party/acados/acados_template/gnsf/determine_input_nonlinearity_function.py new file mode 100644 index 000000000..94aa001c7 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/determine_input_nonlinearity_function.py @@ -0,0 +1,110 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# +# Author: Jonathan Frey: jonathanpaulfrey(at)gmail.com + +from casadi import * +from ..utils import casadi_length, is_empty + + +def determine_input_nonlinearity_function(gnsf): + + ## Description + # this function takes a structure gnsf and updates the matrices L_x, + # L_xdot, L_z, L_u and CasADi vectors y, uhat of this structure as follows: + + # given a CasADi expression phi_expr, which may depend on the variables + # (x1, x1dot, z, u), this function determines a vector y (uhat) consisting + # of all components of (x1, x1dot, z) (respectively u) that enter phi_expr. + # Additionally matrices L_x, L_xdot, L_z, L_u are determined such that + # y = L_x * x + L_xdot * xdot + L_z * z + # uhat = L_u * u + # Furthermore the dimensions ny, nuhat, n_out are updated + + ## y + y = SX.sym('y', 0, 0) + # components of x1 + for ii in range(gnsf["nx1"]): + if which_depends(gnsf["phi_expr"], gnsf["x"][ii])[0]: + y = vertcat(y, gnsf["x"][ii]) + # else: + # x[ii] is not part of y + # components of x1dot + for ii in range(gnsf["nx1"]): + if which_depends(gnsf["phi_expr"], gnsf["xdot"][ii])[0]: + print(gnsf["phi_expr"], "depends on", gnsf["xdot"][ii]) + y = vertcat(y, gnsf["xdot"][ii]) + # else: + # xdot[ii] is not part of y + # components of z + for ii in range(gnsf["nz1"]): + if which_depends(gnsf["phi_expr"], gnsf["z"][ii])[0]: + y = vertcat(y, gnsf["z"][ii]) + # else: + # z[ii] is not part of y + ## uhat + uhat = SX.sym('uhat', 0, 0) + # components of u + for ii in range(gnsf["nu"]): + if which_depends(gnsf["phi_expr"], gnsf["u"][ii])[0]: + uhat = vertcat(uhat, gnsf["u"][ii]) + # else: + # u[ii] is not part of uhat + ## generate gnsf['phi_expr_fun'] + # linear input matrices + if is_empty(y): + gnsf["L_x"] = [] + gnsf["L_xdot"] = [] + gnsf["L_u"] = [] + gnsf["L_z"] = [] + else: + dummy = SX.sym("dummy_input", 0) + L_x_fun = Function( + "L_x_fun", [dummy], [jacobian(y, gnsf["x"][range(gnsf["nx1"])])] + ) + L_xdot_fun = Function( + "L_xdot_fun", [dummy], [jacobian(y, gnsf["xdot"][range(gnsf["nx1"])])] + ) + L_z_fun = Function( + "L_z_fun", [dummy], [jacobian(y, gnsf["z"][range(gnsf["nz1"])])] + ) + L_u_fun = Function("L_u_fun", [dummy], [jacobian(uhat, gnsf["u"])]) + + gnsf["L_x"] = L_x_fun(0).full() + gnsf["L_xdot"] = L_xdot_fun(0).full() + gnsf["L_u"] = L_u_fun(0).full() + gnsf["L_z"] = L_z_fun(0).full() + gnsf["y"] = y + gnsf["uhat"] = uhat + + gnsf["ny"] = casadi_length(y) + gnsf["nuhat"] = casadi_length(uhat) + gnsf["n_out"] = casadi_length(gnsf["phi_expr"]) + + return gnsf diff --git a/iqpilot/third_party/acados/acados_template/gnsf/determine_trivial_gnsf_transcription.py b/iqpilot/third_party/acados/acados_template/gnsf/determine_trivial_gnsf_transcription.py new file mode 100644 index 000000000..23c244053 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/determine_trivial_gnsf_transcription.py @@ -0,0 +1,155 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +from casadi import * +import numpy as np +from ..utils import casadi_length, idx_perm_to_ipiv +from .determine_input_nonlinearity_function import determine_input_nonlinearity_function +from .check_reformulation import check_reformulation + + +def determine_trivial_gnsf_transcription(acados_ocp, print_info): + ## Description + # this function takes a model of an implicit ODE/ index-1 DAE and sets up + # an equivalent model in the GNSF structure, with empty linear output + # system and trivial model matrices, i.e. A, B, E, c are zeros, and C is + # eye. - no structure is exploited + + model = acados_ocp.model + # initial print + print("*****************************************************************") + print(" ") + print(f"****** Restructuring {model.name} model ***********") + print(" ") + print("*****************************************************************") + + # load model + f_impl_expr = model.f_impl_expr + + model_name_prefix = model.name + + # x + x = model.x + nx = acados_ocp.dims.nx + # check type + if isinstance(x[0], SX): + isSX = True + else: + print("GNSF detection only works for SX CasADi type!!!") + import pdb + + pdb.set_trace() + # xdot + xdot = model.xdot + # u + nu = acados_ocp.dims.nu + if nu == 0: + u = SX.sym("u", 0, 0) + else: + u = model.u + + nz = acados_ocp.dims.nz + if nz == 0: + z = SX.sym("z", 0, 0) + else: + z = model.z + + p = model.p + nparam = acados_ocp.dims.np + + # avoid SX of size 0x1 + if casadi_length(u) == 0: + u = SX.sym("u", 0, 0) + nu = 0 + ## initialize gnsf struct + # dimensions + gnsf = {"nx": nx, "nu": nu, "nz": nz, "np": nparam} + gnsf["nx1"] = nx + gnsf["nx2"] = 0 + gnsf["nz1"] = nz + gnsf["nz2"] = 0 + gnsf["nuhat"] = nu + gnsf["ny"] = 2 * nx + nz + + gnsf["phi_expr"] = f_impl_expr + gnsf["A"] = np.zeros((nx + nz, nx)) + gnsf["B"] = np.zeros((nx + nz, nu)) + gnsf["E"] = np.zeros((nx + nz, nx + nz)) + gnsf["c"] = np.zeros((nx + nz, 1)) + gnsf["C"] = np.eye(nx + nz) + gnsf["name"] = model_name_prefix + + gnsf["x"] = x + gnsf["xdot"] = xdot + gnsf["z"] = z + gnsf["u"] = u + gnsf["p"] = p + + gnsf = determine_input_nonlinearity_function(gnsf) + + gnsf["A_LO"] = [] + gnsf["E_LO"] = [] + gnsf["B_LO"] = [] + gnsf["c_LO"] = [] + gnsf["f_lo_expr"] = [] + + # permutation + gnsf["idx_perm_x"] = range(nx) # matlab-style) + gnsf["ipiv_x"] = idx_perm_to_ipiv(gnsf["idx_perm_x"]) # blasfeo-style + gnsf["idx_perm_z"] = range(nz) + gnsf["ipiv_z"] = idx_perm_to_ipiv(gnsf["idx_perm_z"]) + gnsf["idx_perm_f"] = range((nx + nz)) + gnsf["ipiv_f"] = idx_perm_to_ipiv(gnsf["idx_perm_f"]) + + gnsf["nontrivial_f_LO"] = 0 + + check_reformulation(model, gnsf, print_info) + if print_info: + print(f"Success: Set up equivalent GNSF model with trivial matrices") + print(" ") + if print_info: + print( + "-----------------------------------------------------------------------------------" + ) + print(" ") + print( + "reduced input ny of phi from ", + str(2 * nx + nz), + " to ", + str(gnsf["ny"]), + ) + print( + "reduced input nuhat of phi from ", str(nu), " to ", str(gnsf["nuhat"]) + ) + print(" ") + print( + "-----------------------------------------------------------------------------------" + ) + return gnsf diff --git a/iqpilot/third_party/acados/acados_template/gnsf/matlab to python.md b/iqpilot/third_party/acados/acados_template/gnsf/matlab to python.md new file mode 100644 index 000000000..53a0ed971 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/matlab to python.md @@ -0,0 +1,43 @@ +# matlab to python + +% -> # + +; -> + +from casadi import * +-> +from casadi import * + + +print\('(.*)'\) +print('$1') + +print\(\['(.*)'\]\) +print(f'$1') + +keyboard +import pdb; pdb.set_trace() + + +range((([^))]*)) +range($1) + +\s*end +-> +nothing + + +if (.*) +if $1: + +else +else: + +num2str +str + +for ([a-z_]*) = +for $1 in + +length\( +len( \ No newline at end of file diff --git a/iqpilot/third_party/acados/acados_template/gnsf/reformulate_with_LOS.py b/iqpilot/third_party/acados/acados_template/gnsf/reformulate_with_LOS.py new file mode 100644 index 000000000..297a56556 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/reformulate_with_LOS.py @@ -0,0 +1,394 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# +# Author: Jonathan Frey: jonathanpaulfrey(at)gmail.com + +from .determine_input_nonlinearity_function import determine_input_nonlinearity_function +from .check_reformulation import check_reformulation +from casadi import * +from ..utils import casadi_length, idx_perm_to_ipiv, is_empty + + +def reformulate_with_LOS(acados_ocp, gnsf, print_info): + + ## Description: + # This function takes an intitial transcription of the implicit ODE model + # "model" into "gnsf" and reformulates "gnsf" with a linear output system + # (LOS), containing as many states of the model as possible. + # Therefore it might be that the state vector and the implicit function + # vector have to be reordered. This reordered model is part of the output, + # namely reordered_model. + + ## import CasADi and load models + model = acados_ocp.model + + # symbolics + x = gnsf["x"] + xdot = gnsf["xdot"] + u = gnsf["u"] + z = gnsf["z"] + + # dimensions + nx = gnsf["nx"] + nz = gnsf["nz"] + + # get model matrices + A = gnsf["A"] + B = gnsf["B"] + C = gnsf["C"] + E = gnsf["E"] + c = gnsf["c"] + + A_LO = gnsf["A_LO"] + + y = gnsf["y"] + + phi_old = gnsf["phi_expr"] + + if print_info: + print(" ") + print("=================================================================") + print(" ") + print("================ Detect Linear Output System ===============") + print(" ") + print("=================================================================") + print(" ") + ## build initial I_x1 and I_x2_candidates + # I_xrange( all components of x for which either xii or xdot_ii enters y): + # I_LOS_candidates: the remaining components + + I_nsf_components = set() + I_LOS_candidates = set() + + if gnsf["ny"] > 0: + for ii in range(nx): + if which_depends(y, x[ii])[0] or which_depends(y, xdot[ii])[0]: + # i.e. xii or xiidot are part of y, and enter phi_expr + if print_info: + print(f"x_{ii} is part of x1") + I_nsf_components = set.union(I_nsf_components, set([ii])) + else: + # i.e. neither xii nor xiidot are part of y, i.e. enter phi_expr + I_LOS_candidates = set.union(I_LOS_candidates, set([ii])) + if print_info: + print(" ") + for ii in range(nz): + if which_depends(y, z[ii])[0]: + # i.e. xii or xiidot are part of y, and enter phi_expr + if print_info: + print(f"z_{ii} is part of x1") + I_nsf_components = set.union(I_nsf_components, set([ii + nx])) + else: + # i.e. neither xii nor xiidot are part of y, i.e. enter phi_expr + I_LOS_candidates = set.union(I_LOS_candidates, set([ii + nx])) + else: + I_LOS_candidates = set(range((nx + nz))) + if print_info: + print(" ") + print(f"I_LOS_candidates {I_LOS_candidates}") + new_nsf_components = I_nsf_components + I_nsf_eq = set([]) + unsorted_dyn = set(range(nx + nz)) + xdot_z = vertcat(xdot, z) + + ## determine components of Linear Output System + # determine maximal index set I_x2 + # such that the components x(I_x2) can be written as a LOS + Eq_map = [] + while True: + ## find equations corresponding to new_nsf_components + for ii in new_nsf_components: + current_var = xdot_z[ii] + var_name = current_var.name + + # print( unsorted_dyn) + # print("np.nonzero(E[:,ii])[0]",np.nonzero(E[:,ii])[0]) + I_eq = set.intersection(set(np.nonzero(E[:, ii])[0]), unsorted_dyn) + if len(I_eq) == 1: + i_eq = I_eq.pop() + if print_info: + print(f"component {i_eq} is associated with state {ii}") + elif len(I_eq) > 1: # x_ii_dot occurs in more than 1 eq linearly + # find the equation with least linear dependencies on + # I_LOS_cancidates + number_of_eq = 0 + candidate_dependencies = np.zeros(len(I_eq), 1) + I_x2_candidates = set.intersection(I_LOS_candidates, set(range(nx))) + for eq in I_eq: + depending_candidates = set.union( + np.nonzero(E[eq, I_LOS_candidates])[0], + np.nonzero(A[eq, I_x2_candidates])[0], + ) + candidate_dependencies[number_of_eq] = +len(depending_candidates) + number_of_eq += 1 + number_of_eq = np.argmin(candidate_dependencies) + i_eq = I_eq[number_of_eq] + else: ## x_ii_dot does not occur linearly in any of the unsorted dynamics + for j in unsorted_dyn: + phi_eq_j = gnsf["phi_expr"][np.nonzero(C[j, :])[0]] + if which_depends(phi_eq_j, xdot_z(ii))[0]: + I_eq = set.union(I_eq, j) + if is_empty(I_eq): + I_eq = unsorted_dyn + # find the equation with least linear dependencies on I_LOS_cancidates + number_of_eq = 0 + candidate_dependencies = np.zeros(len(I_eq), 1) + I_x2_candidates = set.intersection(I_LOS_candidates, set(range(nx))) + for eq in I_eq: + depending_candidates = set.union( + np.nonzero(E[eq, I_LOS_candidates])[0], + np.nonzero(A[eq, I_x2_candidates])[0], + ) + candidate_dependencies[number_of_eq] = +len(depending_candidates) + number_of_eq += 1 + number_of_eq = np.argmin(candidate_dependencies) + i_eq = I_eq[number_of_eq] + ## add 1 * [xdot,z](ii) to both sides of i_eq + if print_info: + print( + "adding 1 * ", + var_name, + " to both sides of equation ", + i_eq, + ".", + ) + gnsf["E"][i_eq, ii] = 1 + i_phi = np.nonzero(gnsf["C"][i_eq, :]) + if is_empty(i_phi): + i_phi = len(gnsf["phi_expr"]) + 1 + gnsf["C"][i_eq, i_phi] = 1 # add column to C with 1 entry + gnsf["phi_expr"] = vertcat(gnsf["phi_expr"], 0) + gnsf["phi_expr"][i_phi] = ( + gnsf["phi_expr"](i_phi) + + gnsf["E"][i_eq, ii] / gnsf["C"][i_eq, i_phi] * xdot_z[ii] + ) + if print_info: + print( + "detected equation ", + i_eq, + " to correspond to variable ", + var_name, + ) + I_nsf_eq = set.union(I_nsf_eq, {i_eq}) + # remove i_eq from unsorted_dyn + unsorted_dyn.remove(i_eq) + Eq_map.append([ii, i_eq]) + + ## add components to I_x1 + for eq in I_nsf_eq: + I_linear_dependence = set.union( + set(np.nonzero(A[eq, :])[0]), set(np.nonzero(E[eq, :])[0]) + ) + I_nsf_components = set.union(I_linear_dependence, I_nsf_components) + # I_nsf_components = I_nsf_components[:] + + new_nsf_components = set.intersection(I_LOS_candidates, I_nsf_components) + if is_empty(new_nsf_components): + if print_info: + print("new_nsf_components is empty") + break + # remove new_nsf_components from candidates + I_LOS_candidates = set.difference(I_LOS_candidates, new_nsf_components) + if not is_empty(Eq_map): + # [~, new_eq_order] = sort(Eq_map(1,:)) + # I_nsf_eq = Eq_map(2, new_eq_order ) + for count, m in enumerate(Eq_map): + m.append(count) + sorted(Eq_map, key=lambda x: x[1]) + new_eq_order = [m[2] for m in Eq_map] + Eq_map = [Eq_map[i] for i in new_eq_order] + I_nsf_eq = [m[1] for m in Eq_map] + + else: + I_nsf_eq = [] + + I_LOS_components = I_LOS_candidates + I_LOS_eq = sorted(set.difference(set(range(nx + nz)), I_nsf_eq)) + I_nsf_eq = sorted(I_nsf_eq) + + I_x1 = set.intersection(I_nsf_components, set(range(nx))) + I_z1 = set.intersection(I_nsf_components, set(range(nx, nx + nz))) + I_z1 = set([i - nx for i in I_z1]) + + I_x2 = set.intersection(I_LOS_components, set(range(nx))) + I_z2 = set.intersection(I_LOS_components, set(range(nx, nx + nz))) + I_z2 = set([i - nx for i in I_z2]) + + if print_info: + print(f"I_x1 {I_x1}, I_x2 {I_x2}") + + ## permute x, xdot + if is_empty(I_x1): + x1 = [] + x1dot = [] + else: + x1 = x[list(I_x1)] + x1dot = xdot[list(I_x1)] + if is_empty(I_x2): + x2 = [] + x2dot = [] + else: + x2 = x[list(I_x2)] + x2dot = xdot[list(I_x2)] + if is_empty(I_z1): + z1 = [] + else: + z1 = z(I_z1) + if is_empty(I_z2): + z2 = [] + else: + z2 = z[list(I_z2)] + + I_x1 = sorted(I_x1) + I_x2 = sorted(I_x2) + I_z1 = sorted(I_z1) + I_z2 = sorted(I_z2) + gnsf["xdot"] = vertcat(x1dot, x2dot) + gnsf["x"] = vertcat(x1, x2) + gnsf["z"] = vertcat(z1, z2) + gnsf["nx1"] = len(I_x1) + gnsf["nx2"] = len(I_x2) + gnsf["nz1"] = len(I_z1) + gnsf["nz2"] = len(I_z2) + + # store permutations + gnsf["idx_perm_x"] = I_x1 + I_x2 + gnsf["ipiv_x"] = idx_perm_to_ipiv(gnsf["idx_perm_x"]) + gnsf["idx_perm_z"] = I_z1 + I_z2 + gnsf["ipiv_z"] = idx_perm_to_ipiv(gnsf["idx_perm_z"]) + gnsf["idx_perm_f"] = I_nsf_eq + I_LOS_eq + gnsf["ipiv_f"] = idx_perm_to_ipiv(gnsf["idx_perm_f"]) + + f_LO = SX.sym("f_LO", 0, 0) + + ## rewrite I_LOS_eq as LOS + if gnsf["n_out"] == 0: + C_phi = np.zeros(gnsf["nx"] + gnsf["nz"], 1) + else: + C_phi = C @ phi_old + if gnsf["nx1"] == 0: + Ax1 = np.zeros(gnsf["nx"] + gnsf["nz"], 1) + else: + Ax1 = A[:, sorted(I_x1)] @ x1 + if gnsf["nx1"] + gnsf["nz1"] == 0: + lhs_nsf = np.zeros(gnsf["nx"] + gnsf["nz"], 1) + else: + lhs_nsf = E[:, sorted(I_nsf_components)] @ vertcat(x1, z1) + n_LO = len(I_LOS_eq) + B_LO = np.zeros((n_LO, gnsf["nu"])) + A_LO = np.zeros((gnsf["nx2"] + gnsf["nz2"], gnsf["nx2"])) + E_LO = np.zeros((n_LO, n_LO)) + c_LO = np.zeros((n_LO, 1)) + + I_LOS_eq = list(I_LOS_eq) + for eq in I_LOS_eq: + i_LO = I_LOS_eq.index(eq) + f_LO = vertcat(f_LO, Ax1[eq] + C_phi[eq] - lhs_nsf[eq]) + print(f"eq {eq} I_LOS_components {I_LOS_components}, i_LO {i_LO}, f_LO {f_LO}") + E_LO[i_LO, :] = E[eq, sorted(I_LOS_components)] + A_LO[i_LO, :] = A[eq, I_x2] + c_LO[i_LO, :] = c[eq] + B_LO[i_LO, :] = B[eq, :] + if casadi_length(f_LO) == 0: + f_LO = SX.zeros((gnsf["nx2"] + gnsf["nz2"], 1)) + f_LO = simplify(f_LO) + gnsf["A_LO"] = A_LO + gnsf["E_LO"] = E_LO + gnsf["B_LO"] = B_LO + gnsf["c_LO"] = c_LO + gnsf["f_lo_expr"] = f_LO + + ## remove I_LOS_eq from NSF type system + gnsf["A"] = gnsf["A"][np.ix_(sorted(I_nsf_eq), sorted(I_x1))] + gnsf["B"] = gnsf["B"][sorted(I_nsf_eq), :] + gnsf["C"] = gnsf["C"][sorted(I_nsf_eq), :] + gnsf["E"] = gnsf["E"][np.ix_(sorted(I_nsf_eq), sorted(I_nsf_components))] + gnsf["c"] = gnsf["c"][sorted(I_nsf_eq), :] + + ## reduce phi, C + I_nonzero = [] + for ii in range(gnsf["C"].shape[1]): # n_colums of C: + print(f"ii {ii}") + if not all(gnsf["C"][:, ii] == 0): # if column ~= 0 + I_nonzero.append(ii) + gnsf["C"] = gnsf["C"][:, I_nonzero] + gnsf["phi_expr"] = gnsf["phi_expr"][I_nonzero] + + gnsf = determine_input_nonlinearity_function(gnsf) + + check_reformulation(model, gnsf, print_info) + + gnsf["nontrivial_f_LO"] = 0 + if not is_empty(gnsf["f_lo_expr"]): + for ii in range(casadi_length(gnsf["f_lo_expr"])): + fii = gnsf["f_lo_expr"][ii] + if not fii.is_zero(): + gnsf["nontrivial_f_LO"] = 1 + if not gnsf["nontrivial_f_LO"] and print_info: + print("f_LO is fully trivial (== 0)") + check_reformulation(model, gnsf, print_info) + + if print_info: + print("") + print( + "---------------------------------------------------------------------------------" + ) + print( + "------------- Success: Linear Output System (LOS) detected ----------------------" + ) + print( + "---------------------------------------------------------------------------------" + ) + print("") + print( + "==>> moved ", + gnsf["nx2"], + "differential states and ", + gnsf["nz2"], + " algebraic variables to the Linear Output System", + ) + print( + "==>> recuced output dimension of phi from ", + casadi_length(phi_old), + " to ", + casadi_length(gnsf["phi_expr"]), + ) + print(" ") + print("Matrices defining the LOS read as") + print(" ") + print("E_LO =") + print(gnsf["E_LO"]) + print("A_LO =") + print(gnsf["A_LO"]) + print("B_LO =") + print(gnsf["B_LO"]) + print("c_LO =") + print(gnsf["c_LO"]) + + return gnsf diff --git a/iqpilot/third_party/acados/acados_template/gnsf/reformulate_with_invertible_E_mat.py b/iqpilot/third_party/acados/acados_template/gnsf/reformulate_with_invertible_E_mat.py new file mode 100644 index 000000000..21ab8ebfd --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/reformulate_with_invertible_E_mat.py @@ -0,0 +1,167 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# +# Author: Jonathan Frey: jonathanpaulfrey(at)gmail.com + +from casadi import * +from .determine_input_nonlinearity_function import determine_input_nonlinearity_function +from .check_reformulation import check_reformulation + + +def reformulate_with_invertible_E_mat(gnsf, model, print_info): + ## Description + # this function checks that the necessary condition to apply the gnsf + # structure exploiting integrator to a model, namely that the matrices E11, + # E22 are invertible holds. + # if this is not the case, it will make these matrices invertible and add: + # corresponding terms, to the term C * phi, such that the obtained model is + # still equivalent + + # check invertibility of E11, E22 and reformulate if needed: + ind_11 = range(gnsf["nx1"]) + ind_22 = range(gnsf["nx1"], gnsf["nx1"] + gnsf["nz1"]) + + if print_info: + print(" ") + print("----------------------------------------------------") + print("checking rank of E11 and E22") + print("----------------------------------------------------") + ## check if E11, E22 are invertible: + z_check = False + if gnsf["nz1"] > 0: + z_check = ( + np.linalg.matrix_rank(gnsf["E"][np.ix_(ind_22, ind_22)]) != gnsf["nz1"] + ) + + if ( + np.linalg.matrix_rank(gnsf["E"][np.ix_(ind_11, ind_11)]) != gnsf["nx1"] + or z_check + ): + # print warning (always) + print(f"the rank of E11 or E22 is not full after the reformulation") + print("") + print( + f"the script will try to reformulate the model with an invertible matrix instead" + ) + print( + f"NOTE: this feature is based on a heuristic, it should be used with care!!!" + ) + + ## load models + xdot = gnsf["xdot"] + z = gnsf["z"] + + # # GNSF + # get dimensions + nx1 = gnsf["nx1"] + x1dot = xdot[range(nx1)] + + k = vertcat(x1dot, z) + for i in [1, 2]: + if i == 1: + ind = range(gnsf["nx1"]) + else: + ind = range(gnsf["nx1"], gnsf["nx1"] + gnsf["nz1"]) + mat = gnsf["E"][np.ix_(ind, ind)] + import pdb + + pdb.set_trace() + while np.linalg.matrix_rank(mat) < len(ind): + # import pdb; pdb.set_trace() + if print_info: + print(" ") + print(f"the rank of E", str(i), str(i), " is not full") + print( + f"the algorithm will try to reformulate the model with an invertible matrix instead" + ) + print( + f"NOTE: this feature is not super stable and might need more testing!!!!!!" + ) + for sub_max in ind: + sub_ind = range(min(ind), sub_max) + # regard the submatrix mat(sub_ind, sub_ind) + sub_mat = gnsf["E"][sub_ind, sub_ind] + if np.linalg.matrix_rank(sub_mat) < len(sub_ind): + # reformulate the model by adding a 1 to last diagonal + # element and changing rhs respectively. + gnsf["E"][sub_max, sub_max] = gnsf["E"][sub_max, sub_max] + 1 + # this means adding the term 1 * k(sub_max) to the sub_max + # row of the l.h.s + if len(np.nonzero(gnsf["C"][sub_max, :])[0]) == 0: + # if isempty(find(gnsf['C'](sub_max,:), 1)): + # add new nonlinearity entry + gnsf["C"][sub_max, gnsf["n_out"] + 1] = 1 + gnsf["phi_expr"] = vertcat(gnsf["phi_expr"], k[sub_max]) + else: + ind_f = np.nonzero(gnsf["C"][sub_max, :])[0] + if len(ind_f) != 1: + raise Exception("C is assumed to be a selection matrix") + else: + ind_f = ind_f[0] + # add term to corresponding nonlinearity entry + # note: herbey we assume that C is a selection matrix, + # i.e. gnsf['phi_expr'](ind_f) is only entering one equation + + gnsf["phi_expr"][ind_f] = ( + gnsf["phi_expr"][ind_f] + + k[sub_max] / gnsf["C"][sub_max, ind_f] + ) + gnsf = determine_input_nonlinearity_function(gnsf) + check_reformulation(model, gnsf, print_info) + print("successfully reformulated the model with invertible matrices E11, E22") + else: + if print_info: + print(" ") + print( + "the rank of both E11 and E22 is naturally full after the reformulation " + ) + print("==> model reformulation finished") + print(" ") + if (gnsf['nx2'] > 0 or gnsf['nz2'] > 0) and det(gnsf["E_LO"]) == 0: + print( + "_______________________________________________________________________________________________________" + ) + print(" ") + print("TAKE CARE ") + print("E_LO matrix is NOT regular after automatic transcription!") + print("->> this means the model CANNOT be used with the gnsf integrator") + print( + "->> it probably means that one entry (of xdot or z) that was moved to the linear output type system" + ) + print(" does not appear in the model at all (zero column in E_LO)") + print(" OR: the columns of E_LO are linearly dependent ") + print(" ") + print( + " SOLUTIONs: a) go through your model & check equations the method wanted to move to LOS" + ) + print(" b) deactivate the detect_LOS option") + print( + "_______________________________________________________________________________________________________" + ) + return gnsf diff --git a/iqpilot/third_party/acados/acados_template/gnsf/structure_detection_print_summary.py b/iqpilot/third_party/acados/acados_template/gnsf/structure_detection_print_summary.py new file mode 100644 index 000000000..db2d18758 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/gnsf/structure_detection_print_summary.py @@ -0,0 +1,174 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# +# Author: Jonathan Frey: jonathanpaulfrey(at)gmail.com + +from casadi import n_nodes +import numpy as np + + +def structure_detection_print_summary(gnsf, acados_ocp): + + ## Description + # this function prints the most important info after determining a GNSF + # reformulation of the implicit model "initial_model" into "gnsf", which is + # equivalent to the "reordered_model". + model = acados_ocp.model + # # GNSF + # get dimensions + nx = gnsf["nx"] + nu = gnsf["nu"] + nz = gnsf["nz"] + + nx1 = gnsf["nx1"] + nx2 = gnsf["nx2"] + + nz1 = gnsf["nz1"] + nz2 = gnsf["nz2"] + + # np = gnsf['np'] + n_out = gnsf["n_out"] + ny = gnsf["ny"] + nuhat = gnsf["nuhat"] + + # + f_impl_expr = model.f_impl_expr + n_nodes_initial = n_nodes(model.f_impl_expr) + # x_old = model.x + # f_impl_old = model.f_impl_expr + + x = gnsf["x"] + z = gnsf["z"] + + phi_current = gnsf["phi_expr"] + + ## PRINT SUMMARY -- STRUCHTRE DETECTION + print(" ") + print( + "*********************************************************************************************" + ) + print(" ") + print( + "****************** SUCCESS: GNSF STRUCTURE DETECTION COMPLETE !!! ***************" + ) + print(" ") + print( + "*********************************************************************************************" + ) + print(" ") + print( + f"========================= STRUCTURE DETECTION SUMMARY ====================================" + ) + print(" ") + print("-------- Nonlinear Static Feedback type system --------") + print(" ") + print(" successfully transcribed dynamic system model into GNSF structure ") + print(" ") + print( + "reduced dimension of nonlinearity phi from ", + str(nx + nz), + " to ", + str(gnsf["n_out"]), + ) + print(" ") + print( + "reduced input dimension of nonlinearity phi from ", + 2 * nx + nz + nu, + " to ", + gnsf["ny"] + gnsf["nuhat"], + ) + print(" ") + print(f"reduced number of nodes in CasADi expression of nonlinearity phi from {n_nodes_initial} to {n_nodes(phi_current)}\n") + print("----------- Linear Output System (LOS) ---------------") + if nx2 + nz2 > 0: + print(" ") + print(f"introduced Linear Output System of size ", str(nx2 + nz2)) + print(" ") + if nx2 > 0: + print("consisting of the states:") + print(" ") + print(x[range(nx1, nx)]) + print(" ") + if nz2 > 0: + print("and algebraic variables:") + print(" ") + print(z[range(nz1, nz)]) + print(" ") + if gnsf["purely_linear"] == 1: + print(" ") + print("Model is fully linear!") + print(" ") + if not all(gnsf["idx_perm_x"] == np.array(range(nx))): + print(" ") + print( + "--------------------------------------------------------------------------------------------------" + ) + print( + "NOTE: permuted differential state vector x, such that x_gnsf = x(idx_perm_x) with idx_perm_x =" + ) + print(" ") + print(gnsf["idx_perm_x"]) + if nz != 0 and not all(gnsf["idx_perm_z"] == np.array(range(nz))): + print(" ") + print( + "--------------------------------------------------------------------------------------------------" + ) + print( + "NOTE: permuted algebraic state vector z, such that z_gnsf = z(idx_perm_z) with idx_perm_z =" + ) + print(" ") + print(gnsf["idx_perm_z"]) + if not all(gnsf["idx_perm_f"] == np.array(range(nx + nz))): + print(" ") + print( + "--------------------------------------------------------------------------------------------------" + ) + print( + "NOTE: permuted rhs expression vector f, such that f_gnsf = f(idx_perm_f) with idx_perm_f =" + ) + print(" ") + print(gnsf["idx_perm_f"]) + ## print GNSF dimensions + print( + "--------------------------------------------------------------------------------------------------------" + ) + print(" ") + print("The dimensions of the GNSF reformulated model read as:") + print(" ") + # T_dim = table(nx, nu, nz, np, nx1, nz1, n_out, ny, nuhat) + # print( T_dim ) + print(f"nx ", {nx}) + print(f"nu ", {nu}) + print(f"nz ", {nz}) + # print(f"np ", {np}) + print(f"nx1 ", {nx1}) + print(f"nz1 ", {nz1}) + print(f"n_out ", {n_out}) + print(f"ny ", {ny}) + print(f"nuhat ", {nuhat}) diff --git a/iqpilot/third_party/acados/acados_template/simulink_default_opts.json b/iqpilot/third_party/acados/acados_template/simulink_default_opts.json new file mode 100644 index 000000000..5d178fef8 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/simulink_default_opts.json @@ -0,0 +1,44 @@ +{ + "outputs": { + "u0": 1, + "utraj": 0, + "xtraj": 0, + "solver_status": 1, + "cost_value": 0, + "KKT_residual": 1, + "KKT_residuals": 0, + "x1": 1, + "CPU_time": 1, + "CPU_time_sim": 0, + "CPU_time_qp": 0, + "CPU_time_lin": 0, + "sqp_iter": 1 + }, + "inputs": { + "lbx_0": 1, + "ubx_0": 1, + "parameter_traj": 1, + "y_ref_0": 1, + "y_ref": 1, + "y_ref_e": 1, + "lbx": 1, + "ubx": 1, + "lbx_e": 1, + "ubx_e": 1, + "lbu": 1, + "ubu": 1, + "lg": 1, + "ug": 1, + "lh": 1, + "uh": 1, + "lh_e": 1, + "uh_e": 1, + "cost_W_0": 0, + "cost_W": 0, + "cost_W_e": 0, + "reset_solver": 0, + "x_init": 0, + "u_init": 0 + }, + "samplingtime": "t0" +} diff --git a/iqpilot/third_party/acados/acados_template/utils.py b/iqpilot/third_party/acados/acados_template/utils.py new file mode 100644 index 000000000..aa7cd1dfa --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/utils.py @@ -0,0 +1,442 @@ +# +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; +# + +import os, sys, json +import urllib.request +import shutil +import numpy as np +from casadi import SX, MX, DM, Function, CasadiMeta + +ALLOWED_CASADI_VERSIONS = ('3.5.6', '3.5.5', '3.5.4', '3.5.3', '3.5.2', '3.5.1', '3.4.5', '3.4.0') + +TERA_VERSION = "0.0.34" + +PLATFORM2TERA = { + "linux": "linux", + "darwin": "osx", + "win32": "windows" +} + + +def get_acados_path(): + ACADOS_PATH = os.environ.get('ACADOS_SOURCE_DIR') + if not ACADOS_PATH: + acados_template_path = os.path.dirname(os.path.abspath(__file__)) + vendored_acados_path = os.path.realpath(os.path.join(acados_template_path, '..')) + upstream_acados_path = os.path.realpath(os.path.join(acados_template_path, '..', '..', '..')) + if os.path.isfile(os.path.join(vendored_acados_path, 'acados_template', 'acados_layout.json')): + ACADOS_PATH = vendored_acados_path + else: + ACADOS_PATH = upstream_acados_path + msg = 'Warning: Did not find environment variable ACADOS_SOURCE_DIR, ' + msg += 'guessed ACADOS_PATH to be {}.\n'.format(ACADOS_PATH) + msg += 'Please export ACADOS_SOURCE_DIR to avoid this warning.' + print(msg) + return ACADOS_PATH + + +def get_python_interface_path(): + ACADOS_PYTHON_INTERFACE_PATH = os.environ.get('ACADOS_PYTHON_INTERFACE_PATH') + if not ACADOS_PYTHON_INTERFACE_PATH: + vendored_interface_path = os.path.dirname(os.path.abspath(__file__)) + if os.path.isfile(os.path.join(vendored_interface_path, 'acados_layout.json')): + ACADOS_PYTHON_INTERFACE_PATH = vendored_interface_path + else: + acados_path = get_acados_path() + ACADOS_PYTHON_INTERFACE_PATH = os.path.join(acados_path, 'interfaces', 'acados_template', 'acados_template') + return ACADOS_PYTHON_INTERFACE_PATH + + +def get_tera_exec_path(): + TERA_PATH = os.environ.get('TERA_PATH') + if not TERA_PATH: + TERA_PATH = os.path.join(get_acados_path(), 'bin', 't_renderer') + if os.name == 'nt': + TERA_PATH += '.exe' + return TERA_PATH + + +def check_casadi_version(): + casadi_version = CasadiMeta.version() + if casadi_version in ALLOWED_CASADI_VERSIONS: + return + else: + msg = 'Warning: Please note that the following versions of CasADi are ' + msg += 'officially supported: {}.\n '.format(" or ".join(ALLOWED_CASADI_VERSIONS)) + msg += 'If there is an incompatibility with the CasADi generated code, ' + msg += 'please consider changing your CasADi version.\n' + msg += 'Version {} currently in use.'.format(casadi_version) + print(msg) + + +def is_column(x): + if isinstance(x, np.ndarray): + if x.ndim == 1: + return True + elif x.ndim == 2 and x.shape[1] == 1: + return True + else: + return False + elif isinstance(x, (MX, SX, DM)): + if x.shape[1] == 1: + return True + elif x.shape[0] == 0 and x.shape[1] == 0: + return True + else: + return False + elif x == None or x == []: + return False + else: + raise Exception("is_column expects one of the following types: np.ndarray, casadi.MX, casadi.SX." + + " Got: " + str(type(x))) + + +def is_empty(x): + if isinstance(x, (MX, SX, DM)): + return x.is_empty() + elif isinstance(x, np.ndarray): + if np.prod(x.shape) == 0: + return True + else: + return False + elif x == None: + return True + elif isinstance(x, (set, list)): + if len(x)==0: + return True + else: + return False + else: + raise Exception("is_empty expects one of the following types: casadi.MX, casadi.SX, " + + "None, numpy array empty list, set. Got: " + str(type(x))) + + +def casadi_length(x): + if isinstance(x, (MX, SX, DM)): + return int(np.prod(x.shape)) + else: + raise Exception("casadi_length expects one of the following types: casadi.MX, casadi.SX." + + " Got: " + str(type(x))) + + +def make_model_consistent(model): + x = model.x + xdot = model.xdot + u = model.u + z = model.z + p = model.p + + if isinstance(x, MX): + symbol = MX.sym + elif isinstance(x, SX): + symbol = SX.sym + else: + raise Exception("model.x must be casadi.SX or casadi.MX, got {}".format(type(x))) + + if is_empty(p): + model.p = symbol('p', 0, 0) + + if is_empty(z): + model.z = symbol('z', 0, 0) + + return model + +def get_lib_ext(): + lib_ext = '.so' + if sys.platform == 'darwin': + lib_ext = '.dylib' + elif os.name == 'nt': + lib_ext = '' + + return lib_ext + +def get_tera(): + tera_path = get_tera_exec_path() + acados_path = get_acados_path() + + if os.path.exists(tera_path) and os.access(tera_path, os.X_OK): + return tera_path + + repo_url = "https://github.com/acados/tera_renderer/releases" + url = "{}/download/v{}/t_renderer-v{}-{}".format( + repo_url, TERA_VERSION, TERA_VERSION, PLATFORM2TERA[sys.platform]) + + manual_install = 'For manual installation follow these instructions:\n' + manual_install += '1 Download binaries from {}\n'.format(url) + manual_install += '2 Copy them in {}/bin\n'.format(acados_path) + manual_install += '3 Strip the version and platform from the binaries: ' + manual_install += 'as t_renderer-v0.0.34-X -> t_renderer)\n' + manual_install += '4 Enable execution privilege on the file "t_renderer" with:\n' + manual_install += '"chmod +x {}"\n\n'.format(tera_path) + + msg = "\n" + msg += 'Tera template render executable not found, ' + msg += 'while looking in path:\n{}\n'.format(tera_path) + msg += 'In order to be able to render the templates, ' + msg += 'you need to download the tera renderer binaries from:\n' + msg += '{}\n\n'.format(repo_url) + msg += 'Do you wish to set up Tera renderer automatically?\n' + msg += 'y/N? (press y to download tera or any key for manual installation)\n' + + if input(msg) == 'y': + print("Dowloading {}".format(url)) + with urllib.request.urlopen(url) as response, open(tera_path, 'wb') as out_file: + shutil.copyfileobj(response, out_file) + print("Successfully downloaded t_renderer.") + os.chmod(tera_path, 0o755) + return tera_path + + msg_cancel = "\nYou cancelled automatic download.\n\n" + msg_cancel += manual_install + msg_cancel += "Once installed re-run your script.\n\n" + print(msg_cancel) + + sys.exit(1) + + +def render_template(in_file, out_file, output_dir, json_path, template_glob=None): + + acados_path = os.path.dirname(os.path.abspath(__file__)) + if template_glob is None: + template_glob = os.path.join(acados_path, 'c_templates_tera', '**', '*') + cwd = os.getcwd() + + if not os.path.exists(output_dir): + os.makedirs(output_dir) + os.chdir(output_dir) + + tera_path = get_tera() + + # call tera as system cmd + os_cmd = f"{tera_path} '{template_glob}' '{in_file}' '{json_path}' '{out_file}'" + # Windows cmd.exe can not cope with '...', so use "..." instead: + if os.name == 'nt': + os_cmd = os_cmd.replace('\'', '\"') + + status = os.system(os_cmd) + if (status != 0): + raise Exception(f'Rendering of {in_file} failed!\n\nAttempted to execute OS command:\n{os_cmd}\n\n') + + os.chdir(cwd) + + +## Conversion functions +def make_object_json_dumpable(input): + if isinstance(input, (np.ndarray)): + return input.tolist() + elif isinstance(input, (SX)): + return input.serialize() + elif isinstance(input, (MX)): + # NOTE: MX expressions can not be serialized, only Functions. + return input.__str__() + elif isinstance(input, (DM)): + return input.full() + else: + raise TypeError(f"Cannot make input of type {type(input)} dumpable.") + + +def format_class_dict(d): + """ + removes the __ artifact from class to dict conversion + """ + out = {} + for k, v in d.items(): + if isinstance(v, dict): + v = format_class_dict(v) + + out_key = k.split('__', 1)[-1] + out[k.replace(k, out_key)] = v + return out + + +def get_ocp_nlp_layout() -> dict: + python_interface_path = get_python_interface_path() + abs_path = os.path.join(python_interface_path, 'acados_layout.json') + with open(abs_path, 'r') as f: + ocp_nlp_layout = json.load(f) + return ocp_nlp_layout + + +def get_default_simulink_opts() -> dict: + python_interface_path = get_python_interface_path() + abs_path = os.path.join(python_interface_path, 'simulink_default_opts.json') + with open(abs_path, 'r') as f: + simulink_opts = json.load(f) + return simulink_opts + + +def J_to_idx(J): + nrows = J.shape[0] + idx = np.zeros((nrows, )) + for i in range(nrows): + this_idx = np.nonzero(J[i,:])[0] + if len(this_idx) != 1: + raise Exception('Invalid J matrix structure detected, ' \ + 'must contain one nonzero element per row.') + if this_idx.size > 0 and J[i,this_idx[0]] != 1: + raise Exception('J matrices can only contain 1s.') + idx[i] = this_idx[0] + return idx + + +def J_to_idx_slack(J): + nrows = J.shape[0] + ncol = J.shape[1] + idx = np.zeros((ncol, )) + i_idx = 0 + for i in range(nrows): + this_idx = np.nonzero(J[i,:])[0] + if len(this_idx) == 1: + idx[i_idx] = i + i_idx = i_idx + 1 + elif len(this_idx) > 1: + raise Exception('J_to_idx_slack: Invalid J matrix. ' \ + 'Found more than one nonzero in row ' + str(i)) + if this_idx.size > 0 and J[i,this_idx[0]] != 1: + raise Exception('J_to_idx_slack: J matrices can only contain 1s, ' \ + 'got J(' + str(i) + ', ' + str(this_idx[0]) + ') = ' + str(J[i,this_idx[0]]) ) + if not i_idx == ncol: + raise Exception('J_to_idx_slack: J must contain a 1 in every column!') + return idx + + +def acados_dae_model_json_dump(model): + + # load model + x = model.x + xdot = model.xdot + u = model.u + z = model.z + p = model.p + + f_impl = model.f_impl_expr + model_name = model.name + + # create struct with impl_dae_fun, casadi_version + fun_name = model_name + '_impl_dae_fun' + impl_dae_fun = Function(fun_name, [x, xdot, u, z, p], [f_impl]) + + casadi_version = CasadiMeta.version() + str_impl_dae_fun = impl_dae_fun.serialize() + + dae_dict = {"str_impl_dae_fun": str_impl_dae_fun, "casadi_version": casadi_version} + + # dump + json_file = model_name + '_acados_dae.json' + with open(json_file, 'w') as f: + json.dump(dae_dict, f, default=make_object_json_dumpable, indent=4, sort_keys=True) + print("dumped ", model_name, " dae to file:", json_file, "\n") + + +def set_up_imported_gnsf_model(acados_ocp): + + gnsf = acados_ocp.gnsf_model + + # check CasADi version + # dump_casadi_version = gnsf['casadi_version'] + # casadi_version = CasadiMeta.version() + + # if not casadi_version == dump_casadi_version: + # print("WARNING: GNSF model was dumped with another CasADi version.\n" + # + "This might yield errors. Please use the same version for compatibility, serialize version: " + # + dump_casadi_version + " current Python CasADi verison: " + casadi_version) + # input("Press any key to attempt to continue...") + + # load model + phi_fun = Function.deserialize(gnsf['phi_fun']) + phi_fun_jac_y = Function.deserialize(gnsf['phi_fun_jac_y']) + phi_jac_y_uhat = Function.deserialize(gnsf['phi_jac_y_uhat']) + get_matrices_fun = Function.deserialize(gnsf['get_matrices_fun']) + + # obtain gnsf dimensions + size_gnsf_A = get_matrices_fun.size_out(0) + acados_ocp.dims.gnsf_nx1 = size_gnsf_A[1] + acados_ocp.dims.gnsf_nz1 = size_gnsf_A[0] - size_gnsf_A[1] + acados_ocp.dims.gnsf_nuhat = max(phi_fun.size_in(1)) + acados_ocp.dims.gnsf_ny = max(phi_fun.size_in(0)) + acados_ocp.dims.gnsf_nout = max(phi_fun.size_out(0)) + + # save gnsf functions in model + acados_ocp.model.phi_fun = phi_fun + acados_ocp.model.phi_fun_jac_y = phi_fun_jac_y + acados_ocp.model.phi_jac_y_uhat = phi_jac_y_uhat + acados_ocp.model.get_matrices_fun = get_matrices_fun + + # get_matrices_fun = Function([model_name,'_gnsf_get_matrices_fun'], {dummy},... + # {A, B, C, E, L_x, L_xdot, L_z, L_u, A_LO, c, E_LO, B_LO,... + # nontrivial_f_LO, purely_linear, ipiv_x, ipiv_z, c_LO}); + get_matrices_out = get_matrices_fun(0) + acados_ocp.model.gnsf['nontrivial_f_LO'] = int(get_matrices_out[12]) + acados_ocp.model.gnsf['purely_linear'] = int(get_matrices_out[13]) + + if "f_lo_fun_jac_x1k1uz" in gnsf: + f_lo_fun_jac_x1k1uz = Function.deserialize(gnsf['f_lo_fun_jac_x1k1uz']) + acados_ocp.model.f_lo_fun_jac_x1k1uz = f_lo_fun_jac_x1k1uz + else: + dummy_var_x1 = SX.sym('dummy_var_x1', acados_ocp.dims.gnsf_nx1) + dummy_var_x1dot = SX.sym('dummy_var_x1dot', acados_ocp.dims.gnsf_nx1) + dummy_var_z1 = SX.sym('dummy_var_z1', acados_ocp.dims.gnsf_nz1) + dummy_var_u = SX.sym('dummy_var_z1', acados_ocp.dims.nu) + dummy_var_p = SX.sym('dummy_var_z1', acados_ocp.dims.np) + empty_var = SX.sym('empty_var', 0, 0) + + empty_fun = Function('empty_fun', \ + [dummy_var_x1, dummy_var_x1dot, dummy_var_z1, dummy_var_u, dummy_var_p], + [empty_var]) + acados_ocp.model.f_lo_fun_jac_x1k1uz = empty_fun + + del acados_ocp.gnsf_model + + +def idx_perm_to_ipiv(idx_perm): + n = len(idx_perm) + vec = list(range(n)) + ipiv = np.zeros(n) + + print(n, idx_perm) + # import pdb; pdb.set_trace() + for ii in range(n): + idx0 = idx_perm[ii] + for jj in range(ii,n): + if vec[jj]==idx0: + idx1 = jj + break + tmp = vec[ii] + vec[ii] = vec[idx1] + vec[idx1] = tmp + ipiv[ii] = idx1 + + ipiv = ipiv-1 # C 0-based indexing + return ipiv + + +def print_casadi_expression(f): + for ii in range(casadi_length(f)): + print(f[ii,:]) diff --git a/iqpilot/third_party/acados/acados_template/zoro_description.py b/iqpilot/third_party/acados/acados_template/zoro_description.py new file mode 100644 index 000000000..4d795c150 --- /dev/null +++ b/iqpilot/third_party/acados/acados_template/zoro_description.py @@ -0,0 +1,78 @@ +# Copyright (c) The acados authors. +# +# This file is part of acados. +# +# The 2-Clause BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE.; + +from dataclasses import dataclass, field +import numpy as np + + +@dataclass +class ZoroDescription: + """ + Zero-Order Robust Optimization scheme. + + For advanced users. + """ + backoff_scaling_gamma: float = 1.0 + fdbk_K_mat: np.ndarray = None + unc_jac_G_mat: np.ndarray = None # default: an identity matrix + P0_mat: np.ndarray = None + W_mat: np.ndarray = None + idx_lbx_t: list = field(default_factory=list) + idx_ubx_t: list = field(default_factory=list) + idx_lbx_e_t: list = field(default_factory=list) + idx_ubx_e_t: list = field(default_factory=list) + idx_lbu_t: list = field(default_factory=list) + idx_ubu_t: list = field(default_factory=list) + idx_lg_t: list = field(default_factory=list) + idx_ug_t: list = field(default_factory=list) + idx_lg_e_t: list = field(default_factory=list) + idx_ug_e_t: list = field(default_factory=list) + idx_lh_t: list = field(default_factory=list) + idx_uh_t: list = field(default_factory=list) + idx_lh_e_t: list = field(default_factory=list) + idx_uh_e_t: list = field(default_factory=list) + +def process_zoro_description(zoro_description: ZoroDescription): + zoro_description.nw, _ = zoro_description.W_mat.shape + if zoro_description.unc_jac_G_mat is None: + zoro_description.unc_jac_G_mat = np.eye(zoro_description.nw) + zoro_description.nlbx_t = len(zoro_description.idx_lbx_t) + zoro_description.nubx_t = len(zoro_description.idx_ubx_t) + zoro_description.nlbx_e_t = len(zoro_description.idx_lbx_e_t) + zoro_description.nubx_e_t = len(zoro_description.idx_ubx_e_t) + zoro_description.nlbu_t = len(zoro_description.idx_lbu_t) + zoro_description.nubu_t = len(zoro_description.idx_ubu_t) + zoro_description.nlg_t = len(zoro_description.idx_lg_t) + zoro_description.nug_t = len(zoro_description.idx_ug_t) + zoro_description.nlg_e_t = len(zoro_description.idx_lg_e_t) + zoro_description.nug_e_t = len(zoro_description.idx_ug_e_t) + zoro_description.nlh_t = len(zoro_description.idx_lh_t) + zoro_description.nuh_t = len(zoro_description.idx_uh_t) + zoro_description.nlh_e_t = len(zoro_description.idx_lh_e_t) + zoro_description.nuh_e_t = len(zoro_description.idx_uh_e_t) + return zoro_description.__dict__ diff --git a/iqpilot/third_party/acados/build.sh b/iqpilot/third_party/acados/build.sh new file mode 100755 index 000000000..2b803ef6b --- /dev/null +++ b/iqpilot/third_party/acados/build.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" + +ARCHNAME="x86_64" +BLAS_TARGET="X64_AUTOMATIC" +if [ -f /TICI ]; then + ARCHNAME="larch64" + BLAS_TARGET="ARMV8A_ARM_CORTEX_A57" +fi + +ACADOS_FLAGS="-DACADOS_WITH_QPOASES=ON -UBLASFEO_TARGET -DBLASFEO_TARGET=$BLAS_TARGET" + +if [[ "$OSTYPE" == "darwin"* ]]; then + ACADOS_FLAGS="$ACADOS_FLAGS -DCMAKE_OSX_ARCHITECTURES=arm64;x86_64 -DCMAKE_MACOSX_RPATH=1" + ARCHNAME="Darwin" +fi + +if [ ! -d acados_repo/ ]; then + git clone https://github.com/acados/acados.git $DIR/acados_repo + # git clone https://github.com/commaai/acados.git $DIR/acados_repo +fi +cd acados_repo +git fetch --all +git checkout 8af9b0ad180940ef611884574a0b27a43504311d # v0.2.2 +git submodule update --depth=1 --recursive --init + +# build +mkdir -p build +cd build +cmake $ACADOS_FLAGS .. +make -j20 install + +INSTALL_DIR="$DIR/$ARCHNAME" +rm -rf $INSTALL_DIR +mkdir -p $INSTALL_DIR + +rm $DIR/acados_repo/lib/*.json + +rm -rf $DIR/include $DIR/acados_template +cp -r $DIR/acados_repo/include $DIR +cp -r $DIR/acados_repo/lib $INSTALL_DIR +cp -r $DIR/acados_repo/interfaces/acados_template/acados_template $DIR/ +#pip3 install -e $DIR/acados/interfaces/acados_template + +# skip macOS - sed is different :/ +if [[ "$OSTYPE" != "darwin"* ]]; then + # strip future_fstrings to avoid having to install the compatibility package + find $DIR/acados_template/ -type f -exec sed -i '/future.fstrings/d' {} + +fi + +# build tera +cd $DIR/acados_repo/interfaces/acados_template/tera_renderer/ +if [[ "$OSTYPE" == "darwin"* ]]; then + cargo build --verbose --release --target aarch64-apple-darwin + cargo build --verbose --release --target x86_64-apple-darwin + lipo -create -output target/release/t_renderer target/x86_64-apple-darwin/release/t_renderer target/aarch64-apple-darwin/release/t_renderer +else + cargo build --verbose --release +fi +cp target/release/t_renderer $INSTALL_DIR/ diff --git a/iqpilot/third_party/acados/larch64/lib/libacados.so b/iqpilot/third_party/acados/larch64/lib/libacados.so new file mode 100644 index 000000000..9a28b4c9d Binary files /dev/null and b/iqpilot/third_party/acados/larch64/lib/libacados.so differ diff --git a/iqpilot/third_party/acados/larch64/lib/libblasfeo.so b/iqpilot/third_party/acados/larch64/lib/libblasfeo.so new file mode 100644 index 000000000..b97ed876e Binary files /dev/null and b/iqpilot/third_party/acados/larch64/lib/libblasfeo.so differ diff --git a/iqpilot/third_party/acados/larch64/lib/libhpipm.so b/iqpilot/third_party/acados/larch64/lib/libhpipm.so new file mode 100644 index 000000000..cd4b1f1b5 Binary files /dev/null and b/iqpilot/third_party/acados/larch64/lib/libhpipm.so differ diff --git a/iqpilot/third_party/acados/larch64/lib/libqpOASES_e.so b/iqpilot/third_party/acados/larch64/lib/libqpOASES_e.so new file mode 120000 index 000000000..14048625a --- /dev/null +++ b/iqpilot/third_party/acados/larch64/lib/libqpOASES_e.so @@ -0,0 +1 @@ +libqpOASES_e.so.3.1 \ No newline at end of file diff --git a/iqpilot/third_party/acados/larch64/lib/libqpOASES_e.so.3.1 b/iqpilot/third_party/acados/larch64/lib/libqpOASES_e.so.3.1 new file mode 100644 index 000000000..19e7a69bd Binary files /dev/null and b/iqpilot/third_party/acados/larch64/lib/libqpOASES_e.so.3.1 differ diff --git a/iqpilot/third_party/acados/larch64/t_renderer b/iqpilot/third_party/acados/larch64/t_renderer new file mode 100755 index 000000000..b6f70bde0 Binary files /dev/null and b/iqpilot/third_party/acados/larch64/t_renderer differ diff --git a/iqpilot/third_party/bootstrap/.gitignore b/iqpilot/third_party/bootstrap/.gitignore new file mode 100644 index 000000000..ac06c0cf8 --- /dev/null +++ b/iqpilot/third_party/bootstrap/.gitignore @@ -0,0 +1 @@ +/icons/ diff --git a/iqpilot/third_party/bootstrap/bootstrap-icons.svg b/iqpilot/third_party/bootstrap/bootstrap-icons.svg new file mode 100644 index 000000000..61f2720db --- /dev/null +++ b/iqpilot/third_party/bootstrap/bootstrap-icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/iqpilot/third_party/bootstrap/pull.sh b/iqpilot/third_party/bootstrap/pull.sh new file mode 100755 index 000000000..0b03b4db9 --- /dev/null +++ b/iqpilot/third_party/bootstrap/pull.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +cd $DIR + +if [ ! -d icons/ ]; then + git clone https://github.com/twbs/icons/ +fi + +cd icons +git fetch --all +git checkout d5aa187483a1b0b186f87adcfa8576350d970d98 +cp bootstrap-icons.svg ../ diff --git a/iqpilot/third_party/libyuv/.gitignore b/iqpilot/third_party/libyuv/.gitignore new file mode 100644 index 000000000..450712e47 --- /dev/null +++ b/iqpilot/third_party/libyuv/.gitignore @@ -0,0 +1 @@ +libyuv/ diff --git a/iqpilot/third_party/libyuv/LICENSE b/iqpilot/third_party/libyuv/LICENSE new file mode 100644 index 000000000..c911747a6 --- /dev/null +++ b/iqpilot/third_party/libyuv/LICENSE @@ -0,0 +1,29 @@ +Copyright 2011 The LibYuv Project Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/iqpilot/third_party/libyuv/aarch64 b/iqpilot/third_party/libyuv/aarch64 new file mode 120000 index 000000000..062c65e8d --- /dev/null +++ b/iqpilot/third_party/libyuv/aarch64 @@ -0,0 +1 @@ +larch64/ \ No newline at end of file diff --git a/iqpilot/third_party/libyuv/build.sh b/iqpilot/third_party/libyuv/build.sh new file mode 100755 index 000000000..b960f60ef --- /dev/null +++ b/iqpilot/third_party/libyuv/build.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" + +ARCHNAME=$(uname -m) +if [ -f /TICI ]; then + ARCHNAME="larch64" +fi + +if [[ "$OSTYPE" == "darwin"* ]]; then + ARCHNAME="Darwin" +fi + +cd $DIR +if [ ! -d libyuv ]; then + git clone --single-branch https://chromium.googlesource.com/libyuv/libyuv +fi + +cd libyuv +git checkout 4a14cb2e81235ecd656e799aecaaf139db8ce4a2 + +# build +cmake . +make -j$(nproc) + +INSTALL_DIR="$DIR/$ARCHNAME" +rm -rf $INSTALL_DIR +mkdir -p $INSTALL_DIR + +rm -rf $DIR/include +mkdir -p $INSTALL_DIR/lib +cp $DIR/libyuv/libyuv.a $INSTALL_DIR/lib +cp -r $DIR/libyuv/include $DIR + +## To create universal binary on Darwin: +## ``` +## lipo -create -output Darwin/libyuv.a path-to-x64/libyuv.a path-to-arm64/libyuv.a +## ``` diff --git a/iqpilot/third_party/libyuv/include/libyuv/version.h b/iqpilot/third_party/libyuv/include/libyuv/version.h new file mode 100644 index 000000000..3a8f6337c --- /dev/null +++ b/iqpilot/third_party/libyuv/include/libyuv/version.h @@ -0,0 +1,16 @@ +/* + * Copyright 2012 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef INCLUDE_LIBYUV_VERSION_H_ +#define INCLUDE_LIBYUV_VERSION_H_ + +#define LIBYUV_VERSION 1622 + +#endif // INCLUDE_LIBYUV_VERSION_H_ diff --git a/iqpilot/third_party/mapd_pfeiferj/mapd b/iqpilot/third_party/mapd_pfeiferj/mapd new file mode 100755 index 000000000..815891ccc Binary files /dev/null and b/iqpilot/third_party/mapd_pfeiferj/mapd differ diff --git a/iqpilot/third_party/raylib/.gitignore b/iqpilot/third_party/raylib/.gitignore new file mode 100644 index 000000000..c4afad9c3 --- /dev/null +++ b/iqpilot/third_party/raylib/.gitignore @@ -0,0 +1,3 @@ +/raylib_repo/ +/raylib_python_repo/ +/wheel/ diff --git a/iqpilot/third_party/raylib/build.sh b/iqpilot/third_party/raylib/build.sh new file mode 100755 index 000000000..7f2ce5951 --- /dev/null +++ b/iqpilot/third_party/raylib/build.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +set -e + +SUDO="" + +# Use sudo if not root +if [[ ! $(id -u) -eq 0 ]]; then + if [[ -z $(which sudo) ]]; then + echo "Please install sudo or run as root" + exit 1 + fi + SUDO="sudo" +fi + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +cd $DIR + +RAYLIB_PLATFORM="PLATFORM_DESKTOP" + +ARCHNAME=$(uname -m) +if [ -f /TICI ]; then + ARCHNAME="larch64" + RAYLIB_PLATFORM="PLATFORM_COMMA" +elif [[ "$OSTYPE" == "linux"* ]]; then + # required dependencies on Linux PC + $SUDO apt install \ + libxcursor-dev \ + libxi-dev \ + libxinerama-dev \ + libxrandr-dev +fi + +if [[ "$OSTYPE" == "darwin"* ]]; then + ARCHNAME="Darwin" +fi + +INSTALL_DIR="$DIR/$ARCHNAME" +rm -rf $INSTALL_DIR +mkdir -p $INSTALL_DIR + +INSTALL_H_DIR="$DIR/include" +rm -rf $INSTALL_H_DIR +mkdir -p $INSTALL_H_DIR + +if [ ! -d raylib_repo ]; then + git clone -b master --no-tags https://github.com/commaai/raylib.git raylib_repo +fi + +cd raylib_repo + +COMMIT=${1:-3425bd9d1fb292ede4d80f97a1f4f258f614cffc} +git fetch origin $COMMIT +git reset --hard $COMMIT +git clean -xdff . + +cd src + +make -j$(nproc) PLATFORM=$RAYLIB_PLATFORM RAYLIB_RELEASE_PATH=$INSTALL_DIR +cp raylib.h raymath.h rlgl.h $INSTALL_H_DIR/ +echo "raylib development files installed/updated in $INSTALL_H_DIR" + +# this commit needs to be in line with raylib +set -x +RAYGUI_COMMIT="76b36b597edb70ffaf96f046076adc20d67e7827" +curl -fsSLo $INSTALL_H_DIR/raygui.h https://raw.githubusercontent.com/raysan5/raygui/$RAYGUI_COMMIT/src/raygui.h + +if [ -f /TICI ]; then + + # Building the python bindings + cd $DIR + + if [ ! -d raylib_python_repo ]; then + git clone -b master --no-tags https://github.com/commaai/raylib-python-cffi.git raylib_python_repo + fi + + cd raylib_python_repo + + BINDINGS_COMMIT="a0710d95af3c12fd7f4b639589be9a13dad93cb6" + git fetch origin $BINDINGS_COMMIT + git reset --hard $BINDINGS_COMMIT + git clean -xdff . + + RAYLIB_PLATFORM=$RAYLIB_PLATFORM RAYLIB_INCLUDE_PATH=$INSTALL_H_DIR RAYLIB_LIB_PATH=$INSTALL_DIR python setup.py bdist_wheel + cd $DIR + + rm -rf wheel + mkdir wheel + cp raylib_python_repo/dist/*.whl wheel/ + +fi diff --git a/iqpilot/tools/Brewfile b/iqpilot/tools/Brewfile new file mode 100644 index 000000000..af610be75 --- /dev/null +++ b/iqpilot/tools/Brewfile @@ -0,0 +1,15 @@ +brew "git-lfs" +brew "capnp" +brew "coreutils" +brew "eigen" +brew "ffmpeg" +brew "glfw" +brew "libusb" +brew "libtool" +brew "llvm" +brew "openssl@3.0" +brew "qt@5" +brew "zeromq" +cask "gcc-arm-embedded" +brew "portaudio" +brew "gcc@13" diff --git a/iqpilot/tools/README.md b/iqpilot/tools/README.md new file mode 100644 index 000000000..50f13db83 --- /dev/null +++ b/iqpilot/tools/README.md @@ -0,0 +1,89 @@ +# IQ.Pilot tools + +## System Requirements + +IQ.Pilot is developed and tested on **Apple macOS**, which is the primary development target aside from supported vehicle hardware (3, 3x, 4). + +Most of IQ.Pilot should work natively on macOS. On Windows you can use WSL for a nearly native Ubuntu experience. Running natively on any other system is not currently recommended and will likely require modifications. + +## Native setup on Ubuntu 24.04 and macOS + +Follow these instructions for a fully managed setup experience. If you'd like to manage the dependencies yourself, just read the setup scripts in this directory. + +**1. Clone IQ.Pilot** +``` bash +git clone https://gitlvb.teallvbs.xyz/IQ.Lvbs/IQ.Pilot.git +``` + +**2. Run the setup script** +``` bash +cd IQ.Pilot +iqpilot/tools/iq.sh setup +``` + +**3. Activate a Python shell** +Activate a shell with the Python dependencies installed: +``` bash +source .venv/bin/activate +``` + +**4. Build IQ.Pilot** +``` bash +scons -u -j$(nproc) +``` + +# Using IQ.Pilot tools with Konn3kt: + +This guide explains how to use IQ.Pilot tools to view and analyze routes from Konn3kt. + +## Overview + +All you need to do is authenticate with Konn3kt so you can access your routes. + +## Quick Start + +### 1. Authenticate with Konn3kt + +Run the authentication helper: + +```bash +cd IQ.Pilot +python3 iqpilot/tools/lib/auth.py +``` + +This will: +- Open your browser to log in via GitHub OAuth +- Save your authentication token to `~/.comma/auth.json` +- Allow access to your Konn3kt routes + +If browser auto-open is unavailable (headless/WSL), copy the printed URL into any browser — the local callback listens on port 3000. + +## How It Works + +OP Tools reads your Konn3kt JWT token from `~/.comma/auth.json`. + +You can always view public routes! + +## WSL on Windows + +[Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/about) should provide a similar experience to native Ubuntu. [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/compare-versions) specifically has been reported by several users to be a seamless experience. + +Follow [these instructions](https://docs.microsoft.com/en-us/windows/wsl/install) to setup the WSL and install the `Ubuntu-24.04` distribution. Once your Ubuntu WSL environment is setup, follow the Linux setup instructions to finish setting up your environment. See [these instructions](https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps) for running GUI apps. + +**NOTE**: If you are running WSL and any GUIs are failing (segfaulting or other strange issues) even after following the steps above, you may need to enable software rendering with `LIBGL_ALWAYS_SOFTWARE=1`, e.g. `LIBGL_ALWAYS_SOFTWARE=1 selfdrive/ui/ui`. + +## CTF +Learn about the IQ.Pilot ecosystem and tools by playing our [CTF](/tools/CTF.md). + +## Directory Structure + +``` +├── cabana/ # View and plot CAN messages from drives or in realtime +├── joystick/ # Control your car with a joystick +├── jotpluggler/ # View and plot IQ.Pilot logs +├── lib/ # Libraries to support the tools and reading IQ.Pilot logs +├── maneuvers/ # Lateral and longitudinal maneuver testing +├── replay/ # Replay drives and mock IQ.Pilot services +├── scripts/ # Miscellaneous scripts +└── serial/ # Tools for using the comma serial +``` diff --git a/iqpilot/tools/__init__.py b/iqpilot/tools/__init__.py new file mode 100644 index 000000000..75a336dc1 --- /dev/null +++ b/iqpilot/tools/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" \ No newline at end of file diff --git a/iqpilot/tools/auto_source.py b/iqpilot/tools/auto_source.py new file mode 100755 index 000000000..7fa0c38dd --- /dev/null +++ b/iqpilot/tools/auto_source.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +import sys +from iqpilot.tools.lib.logreader import LogReader, ReadMode + + +def main(): + if len(sys.argv) != 2: + print("Usage: python auto_source.py ") + sys.exit(1) + + log_path = sys.argv[1] + lr = LogReader(log_path, default_mode=ReadMode.AUTO, sort_by_time=True) + print("\n".join(lr.logreader_identifiers)) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/clip/run.py b/iqpilot/tools/clip/run.py new file mode 100755 index 000000000..0164b9d6a --- /dev/null +++ b/iqpilot/tools/clip/run.py @@ -0,0 +1,457 @@ +#!/usr/bin/env python3 +import os +import sys +import time +import logging +import subprocess +import threading +import queue +import multiprocessing +import itertools +import numpy as np +import tqdm +from argparse import ArgumentParser +from pathlib import Path +from concurrent.futures import ThreadPoolExecutor, as_completed + +from iqpilot.tools.lib.route import Route +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.tools.lib.filereader import FileReader +from iqpilot.tools.lib.framereader import FrameReader, ffprobe +from iqpilot.selfdrive.test.process_replay.migration import migrate_all +from iqpilot.common.prefix import OpenpilotPrefix +from iqpilot.common.utils import Timer +from iqpilot.cereal.visionipc import VisionStreamType +from msgq.visionipc import VisionIpcServer + +FRAMERATE = 20 +DEMO_ROUTE, DEMO_START, DEMO_END = 'a2a0ccea32023010/2023-07-27--13-01-19', 90, 105 + +logger = logging.getLogger('clip') + + +def parse_args(): + parser = ArgumentParser(description="Direct clip renderer") + parser.add_argument("route", nargs="?", help="Route ID (dongle/route or dongle/route/start/end)") + parser.add_argument("-s", "--start", type=int, help="Start time in seconds") + parser.add_argument("-e", "--end", type=int, help="End time in seconds") + parser.add_argument("-o", "--output", default="output.mp4", help="Output file path") + parser.add_argument("-d", "--data-dir", help="Local directory with route data") + parser.add_argument("-t", "--title", help="Title overlay text") + parser.add_argument("-f", "--file-size", type=float, default=9.0, help="Target file size in MB") + parser.add_argument("-x", "--speed", type=int, default=1, help="Speed multiplier") + parser.add_argument("--demo", action="store_true", help="Use demo route with default timing") + ui_group = parser.add_mutually_exclusive_group() + ui_group.add_argument("--big", dest="big", action="store_true", default=None, help="Force big UI (2160x1080)") + ui_group.add_argument("--mici", dest="big", action="store_false", help="Force mici UI (536x240)") + parser.add_argument("--qcam", action="store_true", help="Use qcamera instead of fcamera") + parser.add_argument("--windowed", action="store_true", help="Show window") + parser.add_argument("--no-metadata", action="store_true", help="Disable metadata overlay") + parser.add_argument("--no-time-overlay", action="store_true", help="Disable time overlay") + args = parser.parse_args() + + if args.demo: + args.route, args.start, args.end = args.route or DEMO_ROUTE, args.start or DEMO_START, args.end or DEMO_END + elif not args.route: + parser.error("route is required (or use --demo)") + + if args.route and args.route.count('/') == 3: + parts = args.route.split('/') + args.route, args.start, args.end = '/'.join(parts[:2]), args.start or int(parts[2]), args.end or int(parts[3]) + + if args.start is None or args.end is None: + parser.error("--start and --end are required") + if args.end <= args.start: + parser.error(f"end ({args.end}) must be greater than start ({args.start})") + return args + + +def setup_env(output_path: str, big: bool = False, speed: int = 1, target_mb: float = 0, duration: int = 0): + os.environ.update({"RECORD": "1", "OFFSCREEN": "1", "RECORD_OUTPUT": str(Path(output_path).with_suffix(".mp4"))}) + if speed > 1: + os.environ["RECORD_SPEED"] = str(speed) + if target_mb > 0 and duration > 0: + os.environ["RECORD_BITRATE"] = f"{int(target_mb * 8 * 1024 / (duration / speed))}k" + if big: + os.environ["BIG"] = "1" + else: + os.environ["BIG"] = "0" + + +def _download_segment(path: str) -> bytes: + with FileReader(path) as f: + return bytes(f.read()) + + +def _parse_and_chunk_segment(args: tuple) -> list[dict]: + raw_data, fps = args + from iqpilot.tools.lib.logreader import _LogFileReader + messages = migrate_all(list(_LogFileReader("", dat=raw_data, sort_by_time=True))) + if not messages: + return [] + + dt_ns, chunks, current, next_time = 1e9 / fps, [], {}, messages[0].logMonoTime + 1e9 / fps # type: ignore[var-annotated] + for msg in messages: + if msg.logMonoTime >= next_time: + chunks.append(current) + current, next_time = {}, next_time + dt_ns * ((msg.logMonoTime - next_time) // dt_ns + 1) + current[msg.which()] = msg + return chunks + [current] if current else chunks + + +def load_logs_parallel(log_paths: list[str], fps: int = 20) -> list[dict]: + num_workers = min(16, len(log_paths), (multiprocessing.cpu_count() or 1)) + logger.info(f"Downloading {len(log_paths)} segments with {num_workers} workers...") + + with ThreadPoolExecutor(max_workers=num_workers) as pool: + futures = {pool.submit(_download_segment, path): idx for idx, path in enumerate(log_paths)} + raw_data = {futures[f]: f.result() for f in as_completed(futures)} + + logger.info("Parsing and chunking segments...") + with multiprocessing.Pool(num_workers) as pool: + return list(itertools.chain.from_iterable(pool.map(_parse_and_chunk_segment, [(raw_data[i], fps) for i in range(len(log_paths))]))) + + +def patch_submaster(message_chunks, ui_state): + # Reset started_frame so alerts render correctly (recv_frame must be >= started_frame) + ui_state.started_frame = 0 + ui_state.started_time = time.monotonic() + + def mock_update(timeout=None): + sm, t = ui_state.sm, time.monotonic() + sm.updated = dict.fromkeys(sm.services, False) + if sm.frame < len(message_chunks): + for svc, msg in message_chunks[sm.frame].items(): + if svc in sm.data: + sm.seen[svc] = sm.updated[svc] = sm.alive[svc] = sm.valid[svc] = True + sm.data[svc] = getattr(msg.as_builder(), svc) + sm.logMonoTime[svc], sm.recv_time[svc], sm.recv_frame[svc] = msg.logMonoTime, t, sm.frame + sm.frame += 1 + ui_state.sm.update = mock_update + + +def get_frame_dimensions(camera_path: str) -> tuple[int, int]: + """Get frame dimensions from a video file using ffprobe.""" + probe = ffprobe(camera_path) + stream = probe["streams"][0] + return stream["width"], stream["height"] + + +def iter_segment_frames(camera_paths, start_time, end_time, fps=20, use_qcam=False, + frame_size: tuple[int, int] | None = None, on_segment_open=None): + frames_per_seg = fps * 60 + start_frame, end_frame = int(start_time * fps), int(end_time * fps) + current_seg: int = -1 + seg_frames: FrameReader | np.ndarray | None = None + + for global_idx in range(start_frame, end_frame): + seg_idx, local_idx = global_idx // frames_per_seg, global_idx % frames_per_seg + + if seg_idx != current_seg: + current_seg = seg_idx + path = camera_paths[seg_idx] if seg_idx < len(camera_paths) else None + if not path: + raise RuntimeError(f"No camera file for segment {seg_idx}") + if on_segment_open is not None: + on_segment_open(seg_idx, path) + + if use_qcam: + w, h = frame_size or get_frame_dimensions(path) + with FileReader(path) as f: + result = subprocess.run(["ffmpeg", "-v", "quiet", "-i", "-", "-f", "rawvideo", "-pix_fmt", "nv12", "-"], + input=f.read(), capture_output=True) + if result.returncode != 0: + raise RuntimeError(f"ffmpeg failed: {result.stderr.decode()}") + seg_frames = np.frombuffer(result.stdout, dtype=np.uint8).reshape(-1, w * h * 3 // 2) + else: + seg_frames = FrameReader(path, pix_fmt="nv12") + + assert seg_frames is not None + frame = seg_frames[local_idx] if use_qcam else seg_frames.get(local_idx) # type: ignore[index, union-attr] + yield global_idx, frame + + +class FrameQueue: + def __init__(self, camera_paths, start_time, end_time, fps=20, prefetch_count=60, use_qcam=False): + # Probe first valid camera file for dimensions + first_path = next((p for p in camera_paths if p), None) + if not first_path: + raise RuntimeError("No valid camera paths") + self.frame_w, self.frame_h = get_frame_dimensions(first_path) + + self._queue, self._stop, self._error = queue.Queue(maxsize=prefetch_count), threading.Event(), None + self._use_qcam = use_qcam + self._current_seg_idx = None + self._current_path = first_path + self._state_lock = threading.Lock() + self._thread = threading.Thread(target=self._worker, + args=(camera_paths, start_time, end_time, fps, use_qcam, (self.frame_w, self.frame_h)), daemon=True) + self._thread.start() + + def _set_current_source(self, seg_idx, path): + with self._state_lock: + self._current_seg_idx = seg_idx + self._current_path = path + + def _worker(self, camera_paths, start_time, end_time, fps, use_qcam, frame_size): + try: + for idx, data in iter_segment_frames(camera_paths, start_time, end_time, fps, use_qcam, frame_size, self._set_current_source): + if self._stop.is_set(): + break + self._queue.put((idx, data.tobytes())) + except Exception as e: + logger.exception("Decode error") + self._error = e + finally: + self._queue.put(None) + + def get(self, timeout=60.0): + deadline = time.monotonic() + timeout + while True: + if self._error: + raise self._error + + remaining = max(0.0, deadline - time.monotonic()) + if remaining == 0.0: + break + + try: + result = self._queue.get(timeout=min(0.5, remaining)) + except queue.Empty: + continue + + if result is None: + if self._error: + raise self._error + raise StopIteration("No more frames") + return result + + if self._error: + raise self._error + + with self._state_lock: + seg_idx = self._current_seg_idx + path = self._current_path + + camera_kind = "qcamera" if self._use_qcam else "fcamera" + source = f"segment {seg_idx}" if seg_idx is not None else "the initial segment" + if path: + source = f"{source} ({path})" + hint = "" + if path and path.startswith(("http://", "https://")): + hint = " Try downloading the route locally with --data-dir or verify the remote camera endpoint supports timely range reads." + raise TimeoutError(f"Timed out after {timeout:.0f}s waiting for {camera_kind} frames from {source}; camera fetch or decode is stalled.{hint}") + + def stop(self): + self._stop.set() + while not self._queue.empty(): + try: + self._queue.get_nowait() + except queue.Empty: + break + self._thread.join(timeout=2.0) + + +def load_route_metadata(route): + from iqpilot.common.params import Params, UnknownKeyName + lr = LogReader(route.log_paths()[0]) + init_data, car_params = lr.first('initData'), lr.first('carParams') + + params = Params() + for entry in init_data.params.entries: + try: + value = params.cpp2python(entry.key, entry.value) + if value is None: + logger.warning("Skipping malformed route param %s while loading clip metadata", entry.key) + continue + params.put(entry.key, value) + except UnknownKeyName: + pass + except TypeError: + logger.warning("Skipping route param %s due to type mismatch while loading clip metadata", entry.key) + + origin = init_data.gitRemote.split('/')[3] if len(init_data.gitRemote.split('/')) > 3 else 'unknown' + return { + 'version': init_data.version, 'route': route.name.canonical_name, + 'car': car_params.carFingerprint if car_params else 'unknown', 'origin': origin, + 'commit': init_data.gitCommit[:7], + } + + +def detect_big_ui(route: Route) -> bool: + try: + init_data = LogReader(route.log_paths()[0]).first('initData') + git_branch = (init_data.gitBranch or "").lower() + device_type = str(init_data.deviceType).lower() + if device_type in ("mici", "tizi", "tici"): + big = device_type != "mici" + reason = f"route device type {device_type}" + elif "mici" in git_branch: + big = False + reason = f"route branch {git_branch}" + else: + big = True + reason = f"route branch {git_branch or 'unknown'}" + logger.info("Auto-detected %s UI from %s", "big" if big else "mici", reason) + return big + except Exception: + logger.warning("Falling back to big UI; failed to auto-detect UI mode", exc_info=True) + return True + + +def draw_text_box(rl, text, x, y, size, gui_app, font, font_scale, color=None, center=False): + box_color, text_color = rl.Color(0, 0, 0, 85), color or rl.WHITE + # measure_text_ex is NOT auto-scaled, so multiply by font_scale + # draw_text_ex IS auto-scaled, so pass size directly + text_size = rl.measure_text_ex(font, text, size * font_scale, 0) + text_width, text_height = int(text_size.x), int(text_size.y) + if center: + x = (gui_app.width - text_width) // 2 + rl.draw_rectangle(x - 8, y - 4, text_width + 16, text_height + 8, box_color) + rl.draw_text_ex(font, text, rl.Vector2(x, y), size, 0, text_color) + + +def render_overlays(rl, gui_app, font, font_scale, metadata, title, start_time, frame_idx, show_metadata, show_time): + if show_metadata and metadata and frame_idx < FRAMERATE * 5: + m = metadata + text = ", ".join([f"IQ.Pilot v{m['version']}", f"route: {m['route']}", f"car: {m['car']}", f"origin: {m['origin']}", + f"commit: {m['commit']}"]) + # Truncate if too wide (leave 20px margin on each side) + max_width = gui_app.width - 40 + while rl.measure_text_ex(font, text, 15 * font_scale, 0).x > max_width and len(text) > 20: + text = text[:-4] + "..." + draw_text_box(rl, text, 0, 8, 15, gui_app, font, font_scale, center=True) + + if title: + draw_text_box(rl, title, 0, 60, 32, gui_app, font, font_scale, center=True) + + if show_time: + t = start_time + frame_idx / FRAMERATE + time_text = f"{int(t)//60:02d}:{int(t)%60:02d}" + time_width = int(rl.measure_text_ex(font, time_text, 24 * font_scale, 0).x) + draw_text_box(rl, time_text, gui_app.width - time_width - 45, 45, 24, gui_app, font, font_scale) + + +def prefetch_nav_tiles(road_view, ui_state, message_chunks) -> None: + """If the route drove with on-screen maps enabled, feed the panel the first messages and block + until the opening viewport's tiles are fetched, so the clip doesn't start on the placeholder grid.""" + nav_panel = getattr(getattr(road_view, "_hud_renderer", None), "nav_map_panel", None) + if nav_panel is None or not getattr(nav_panel, "maps_enabled", lambda: False)(): + return + + logger.info("Route has on-screen maps enabled, prefetching map tiles...") + for _ in range(min(len(message_chunks), FRAMERATE * 2)): + ui_state.sm.update() + nav_panel.update() + if nav_panel.active: + break + if nav_panel.active: + if not nav_panel.warm_up_tiles(): + logger.warning("Map tiles incomplete after warmup (missing MapboxToken or slow network); map may render partially") + else: + logger.warning("No nav position in the first seconds of the clip; map tiles will load mid-clip") + ui_state.sm.frame = 0 + + +def clip(route: Route, output: str, start: int, end: int, headless: bool = True, big: bool = False, + title: str | None = None, show_metadata: bool = True, show_time: bool = True, use_qcam: bool = False): + timer, duration = Timer(), end - start + + # The prefix must wrap the UI imports: ui_state and the nav map panel bind Params() to the + # params path active when they're constructed, and load_route_metadata below seeds the route's + # params (on-screen maps gate, units, Mapbox token) into the prefixed dir. + with OpenpilotPrefix(shared_download_cache=True): + import pyray as rl + if big: + from iqpilot.selfdrive.ui.onroad.augmented_road_view import AugmentedRoadView + else: + from iqpilot.selfdrive.ui.mici.onroad.augmented_road_view import AugmentedRoadView # type: ignore[assignment] + from iqpilot.selfdrive.ui.ui_state import ui_state + from iqpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE + timer.lap("import") + + logger.info(f"Clipping {route.name.canonical_name}, {start}s-{end}s ({duration}s)") + seg_start, seg_end = start // 60, (end - 1) // 60 + 1 + all_chunks = load_logs_parallel(route.log_paths()[seg_start:seg_end], fps=FRAMERATE) + timer.lap("logs") + + frame_start = (start - seg_start * 60) * FRAMERATE + message_chunks = all_chunks[frame_start:frame_start + duration * FRAMERATE] + if not message_chunks: + logger.error("No messages to render") + sys.exit(1) + + metadata = load_route_metadata(route) + if not show_metadata: + metadata = None + if headless: + rl.set_config_flags(rl.ConfigFlags.FLAG_WINDOW_HIDDEN) + + camera_paths = route.qcamera_paths() if use_qcam else route.camera_paths() + frame_queue = FrameQueue(camera_paths, start, end, fps=FRAMERATE, use_qcam=use_qcam) + + ecamera_paths = route.ecamera_paths() if not use_qcam else [] + wide_frame_queue: FrameQueue | None = None + if any(p for p in ecamera_paths[seg_start:seg_end] if p): + wide_frame_queue = FrameQueue(ecamera_paths, start, end, fps=FRAMERATE) + + vipc = VisionIpcServer("camerad") + vipc.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 4, frame_queue.frame_w, frame_queue.frame_h) + if wide_frame_queue: + vipc.create_buffers(VisionStreamType.VISION_STREAM_WIDE_ROAD, 4, wide_frame_queue.frame_w, wide_frame_queue.frame_h) + vipc.start_listener() + + patch_submaster(message_chunks, ui_state) + gui_app.init_window("clip", fps=FRAMERATE) + + road_view = AugmentedRoadView() + road_view.set_rect(rl.Rectangle(0, 0, gui_app.width, gui_app.height)) + font = gui_app.font(FontWeight.NORMAL) + prefetch_nav_tiles(road_view, ui_state, message_chunks) + timer.lap("setup") + + frame_idx = 0 + with tqdm.tqdm(total=len(message_chunks), desc="Rendering", unit="frame") as pbar: + for should_render in gui_app.render(): + if frame_idx >= len(message_chunks): + break + _, frame_bytes = frame_queue.get() + vipc.send(VisionStreamType.VISION_STREAM_ROAD, frame_bytes, frame_idx, int(frame_idx * 5e7), int(frame_idx * 5e7)) + if wide_frame_queue: + _, wide_bytes = wide_frame_queue.get() + vipc.send(VisionStreamType.VISION_STREAM_WIDE_ROAD, wide_bytes, frame_idx, int(frame_idx * 5e7), int(frame_idx * 5e7)) + ui_state.update() + if should_render: + road_view.render() + render_overlays(rl, gui_app, font, FONT_SCALE, metadata, title, start, frame_idx, show_metadata, show_time) + frame_idx += 1 + pbar.update(1) + timer.lap("render") + + frame_queue.stop() + if wide_frame_queue: + wide_frame_queue.stop() + gui_app.close() + timer.lap("ffmpeg") + + logger.info(f"Clip saved to: {Path(output).resolve()}") + logger.info(f"Generated {timer.fmt(duration)}") + + +def main(): + logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s\t%(message)s") + args = parse_args() + route = Route(args.route, data_dir=args.data_dir) + big = args.big if args.big is not None else detect_big_ui(route) + + setup_env(args.output, big=big, speed=args.speed, target_mb=args.file_size, duration=args.end - args.start) + try: + clip(route, args.output, args.start, args.end, not args.windowed, + big, args.title, not args.no_metadata, not args.no_time_overlay, args.qcam) + except TimeoutError as e: + logger.error("%s", e) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/install_python_dependencies.sh b/iqpilot/tools/install_python_dependencies.sh new file mode 100755 index 000000000..e8840e3d4 --- /dev/null +++ b/iqpilot/tools/install_python_dependencies.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Increase the pip timeout to handle TimeoutError +export PIP_DEFAULT_TIMEOUT=200 + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +ROOT="$DIR"/../../ +cd "$ROOT" + +if ! command -v "uv" > /dev/null 2>&1; then + echo "installing uv..." + curl -LsSf --retry 5 --retry-delay 5 --retry-all-errors https://astral.sh/uv/install.sh | sh + UV_BIN="$HOME/.local/bin" + PATH="$UV_BIN:$PATH" +fi + +echo "updating uv..." +# ok to fail, can also fail due to installing with brew +uv self update || true + +echo "installing python packages..." +UV_SYNC_ARGS=(--frozen) +if [[ "${IQPILOT_RUNTIME_DEPENDENCIES_ONLY:-0}" != "1" ]]; then + UV_SYNC_ARGS+=(--all-extras) +fi +UV_SYNC_OK=0 +for attempt in 1 2 3; do + if uv sync "${UV_SYNC_ARGS[@]}"; then + UV_SYNC_OK=1 + break + fi + [[ "${attempt}" -lt 3 ]] && sleep "$((attempt * 5))" +done +if [[ "${UV_SYNC_OK}" -ne 1 ]]; then + exit 1 +fi +source .venv/bin/activate + +if [[ "$(uname)" == 'Darwin' ]]; then + touch "$ROOT"/.env + echo "export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES" >> "$ROOT"/.env +fi diff --git a/iqpilot/tools/install_ubuntu_dependencies.sh b/iqpilot/tools/install_ubuntu_dependencies.sh new file mode 100755 index 000000000..5c2131d4b --- /dev/null +++ b/iqpilot/tools/install_ubuntu_dependencies.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env bash +set -e + +SUDO="" + +# Use sudo if not root +if [[ ! $(id -u) -eq 0 ]]; then + if [[ -z $(which sudo) ]]; then + echo "Please install sudo or run as root" + exit 1 + fi + SUDO="sudo" +fi + +# Check if stdin is open +if [ -t 0 ]; then + INTERACTIVE=1 +fi + +# Install common packages +function install_ubuntu_common_requirements() { + $SUDO apt-get update + + # normal stuff, mostly for the bare docker image + $SUDO apt-get install -y --no-install-recommends \ + ca-certificates \ + clang \ + build-essential \ + curl \ + libssl-dev \ + libcurl4-openssl-dev \ + locales \ + git \ + git-lfs \ + xvfb + + # TODO: vendor the rest of these in third_party/ + $SUDO apt-get install -y --no-install-recommends \ + gcc-arm-none-eabi \ + capnproto \ + libcapnp-dev \ + ffmpeg \ + libavformat-dev \ + libavcodec-dev \ + libavdevice-dev \ + libavutil-dev \ + libavfilter-dev \ + libbz2-dev \ + libeigen3-dev \ + libffi-dev \ + libgles2-mesa-dev \ + libglfw3-dev \ + libglib2.0-0 \ + libjpeg-dev \ + libqt5charts5-dev \ + libncurses5-dev \ + libusb-1.0-0-dev \ + libzmq3-dev \ + libzstd-dev \ + libsqlite3-dev \ + opencl-headers \ + ocl-icd-libopencl1 \ + ocl-icd-opencl-dev \ + portaudio19-dev \ + qttools5-dev-tools \ + libqt5svg5-dev \ + libqt5serialbus5-dev \ + libqt5x11extras5-dev \ + libqt5opengl5-dev \ + gettext +} + +# Install Ubuntu 24.04 LTS packages +function install_ubuntu_lts_latest_requirements() { + install_ubuntu_common_requirements + + $SUDO apt-get install -y --no-install-recommends \ + g++-12 \ + qtbase5-dev \ + qtbase5-dev-tools \ + python3-dev \ + python3-venv +} + +# Detect OS using /etc/os-release file +if [ -f "/etc/os-release" ]; then + source /etc/os-release + case "$VERSION_CODENAME" in + "jammy" | "kinetic" | "noble") + install_ubuntu_lts_latest_requirements + ;; + *) + echo "$ID $VERSION_ID is unsupported. This setup script is written for Ubuntu 24.04." + read -p "Would you like to attempt installation anyway? " -n 1 -r + echo "" + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi + install_ubuntu_lts_latest_requirements + esac + + if [[ -d "/etc/udev/rules.d/" ]]; then + # Setup jungle udev rules + $SUDO tee /etc/udev/rules.d/12-panda_jungle.rules > /dev/null < /dev/null < /dev/null <&2 +} + +iq_note() { + printf ' %b●%b %s\n' "$IQ_CYAN" "$IQ_RESET" "$1" +} + +iq_find_root() { + local candidate="${IQ_ROOT:-$PWD}" + while [[ "$candidate" != / ]]; do + if [[ ( -f "$candidate/launch_iqpilot.sh" || -f "$candidate/launch_openpilot.sh" ) && -d "$candidate/iqpilot" ]]; then + IQ_ROOT="$candidate" + return 0 + fi + candidate="$(cd "$candidate/.." && pwd)" + done + for candidate in "$HOME/iqpilot" "$HOME/openpilot" /data/iqpilot /data/openpilot; do + if [[ ( -f "$candidate/launch_iqpilot.sh" || -f "$candidate/launch_openpilot.sh" ) && -d "$candidate/iqpilot" ]]; then + IQ_ROOT="$candidate" + return 0 + fi + done + return 1 +} + +iq_require_root() { + if ! iq_find_root; then + iq_fail 'IQ.Pilot checkout not found. Run this inside the checkout or use --dir PATH.' + return 1 + fi +} + +iq_run() { + local rendered + printf -v rendered '%q ' "$@" + rendered="${rendered% }" + printf '%bâ€ē%b %b%s%b\n' "$IQ_PINK" "$IQ_RESET" "$IQ_MUTED" "$rendered" "$IQ_RESET" + [[ "$IQ_DRY" = 1 ]] || "$@" +} + +iq_check() { + iq_title 'environment check' + iq_require_root + iq_ok "checkout $IQ_ROOT" + command -v git >/dev/null 2>&1 || { iq_fail 'git is not installed'; return 1; } + iq_ok "git $(git --version | sed 's/git version //')" + command -v python3 >/dev/null 2>&1 || { iq_fail 'python3 is not installed'; return 1; } + iq_ok "python $(python3 --version | sed 's/Python //')" + if [[ -x "$IQ_ROOT/.venv/bin/python3" ]]; then + iq_ok 'venv ready' + else + iq_note 'venv not created yet — run iq setup' + fi +} + +iq_install() { + local shell_name rc_file iq_script command + shell_name="$(basename "${SHELL:-bash}")" + rc_file="$HOME/.${shell_name}rc" + [[ "$(uname)" = Darwin && "$shell_name" = bash ]] && rc_file="$HOME/.bash_profile" + iq_script="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/iq.sh" + command="alias iq='${iq_script} \"\$@\"'" + touch "$rc_file" + grep -Fqx "$command" "$rc_file" 2>/dev/null || printf '\n%s\n' "$command" >> "$rc_file" + iq_title 'command installed' + iq_ok "restart your shell, then use iq ${rc_file}" +} + +iq_setup() { + local script + iq_require_root + if [[ -f /AGNOS ]]; then + iq_title 'setup' + iq_note 'IQ.OS manages system dependencies and the base Python runtime' + iq_note 'use iq pkg to synchronize private packages when needed' + iq_check + return 0 + fi + case "$OSTYPE" in + linux-gnu*) script="$IQ_ROOT/iqpilot/tools/ubuntu_setup.sh" ;; + darwin*) script="$IQ_ROOT/iqpilot/tools/mac_setup.sh" ;; + *) iq_fail "unsupported platform: $OSTYPE"; return 1 ;; + esac + iq_title 'setup' + iq_run "$script" + if command -v git-lfs >/dev/null 2>&1; then + iq_run git -C "$IQ_ROOT" lfs pull + fi + iq_ok 'setup complete' +} + +iq_venv() { + iq_require_root + [[ -f "$IQ_ROOT/.venv/bin/activate" ]] || { iq_fail 'venv not found — run iq setup first'; return 1; } + case "$(basename "${SHELL:-bash}")" in + zsh) ZDOTDIR="$(mktemp -d)"; printf 'source %q\nsource %q\n' "$HOME/.zshrc" "$IQ_ROOT/.venv/bin/activate" > "$ZDOTDIR/.zshrc"; zsh ;; + *) bash --rcfile <(printf 'source %q\nsource %q\n' "$HOME/.bashrc" "$IQ_ROOT/.venv/bin/activate") ;; + esac +} + +iq_build() { + iq_require_root + if [[ -f /AGNOS ]]; then + iq_run "$IQ_ROOT/iqpilot/system/manager/build.py" + else + (cd "$IQ_ROOT" && iq_run scons "$@") + fi +} + +iq_quality() { + iq_require_root + (cd "$IQ_ROOT" && iq_run scripts/lint/lint.sh "$@") +} + +iq_pkg() { + iq_require_root + # the venv python has the component packages (iqdbc etc.); bare python3 does not + local py=python3 + [[ -x "$IQ_ROOT/.venv/bin/python3" ]] && py="$IQ_ROOT/.venv/bin/python3" + if [[ -f "$IQ_ROOT/iqpilot/tools/scripts/setup_private_packages.py" ]]; then + (cd "$IQ_ROOT" && iq_run "$py" iqpilot/tools/scripts/setup_private_packages.py "$@") + else + iq_note 'private package sources are not present in this checkout' + fi + if [[ -f "$IQ_ROOT/artifacts/runtime/ensure_private_installed.sh" ]]; then + (cd "$IQ_ROOT" && iq_run bash artifacts/runtime/ensure_private_installed.sh) + fi +} + +iq_update() { + local fast=0 + iq_require_root + if [[ $# -gt 0 ]]; then + [[ $# = 1 && "$1" = f ]] || { iq_fail 'usage: iq update [f] [r]'; return 1; } + fast=1 + fi + iq_title 'updating IQ.Pilot' + iq_run git -C "$IQ_ROOT" pull + iq_pkg + [[ "$fast" = 1 ]] && iq_fast_restart +} + +iq_status() { + local branch commit tree + iq_require_root + branch="$(git -C "$IQ_ROOT" branch --show-current 2>/dev/null || printf detached)" + commit="$(git -C "$IQ_ROOT" rev-parse --short HEAD 2>/dev/null || printf unknown)" + tree=clean + [[ -n "$(git -C "$IQ_ROOT" status --porcelain 2>/dev/null)" ]] && tree=modified + iq_title 'status' + iq_note "root $IQ_ROOT" + iq_note "branch $branch" + iq_note "commit $commit" + [[ "$tree" = clean ]] && iq_ok "tree $tree" || iq_note "tree $tree" +} + +iq_switch() { + local remote=origin branch + iq_require_root + [[ $# -ge 1 ]] || { iq_fail 'usage: iq switch [REMOTE] BRANCH'; return 1; } + [[ $# -ge 2 ]] && { remote="$1"; shift; } + branch="$1" + iq_title "switching to $remote/$branch" + iq_note 'this discards uncommitted changes and untracked files' + iq_run git -C "$IQ_ROOT" fetch "$remote" "$branch:refs/remotes/$remote/$branch" + iq_run git -C "$IQ_ROOT" checkout -B "$branch" --track "$remote/$branch" + iq_run git -C "$IQ_ROOT" reset --hard "$remote/$branch" + iq_run git -C "$IQ_ROOT" clean -df +} + +iq_service() { + local action="$1" + [[ -f /AGNOS ]] || { iq_note "${action} is available on IQ.OS devices only"; return 0; } + iq_run sudo systemctl "$action" iq +} + +iq_wait_for_tmux() { + local expected="$1" attempt active + [[ "$IQ_DRY" = 1 ]] && { iq_note "would verify IQ tmux session ${expected}"; return 0; } + for ((attempt = 0; attempt < 15; attempt++)); do + if tmux has-session -t iq 2>/dev/null; then active=running; else active=stopped; fi + [[ "$active" = "$expected" ]] && return 0 + sleep 1 + done + return 1 +} + +iq_fast_restart() { + [[ -f /AGNOS || "$IQ_DRY" = 1 ]] || { iq_fail 'fast update restart is available on IQ.OS devices only'; return 1; } + iq_title 'fast restarting IQ.Pilot' + iq_run sudo systemctl stop iq + if ! iq_wait_for_tmux stopped; then + iq_fail 'IQ tmux session did not stop; attempt a reboot.' + return 1 + fi + iq_run sudo systemctl start iq + if ! iq_wait_for_tmux running; then + iq_fail 'IQ tmux session did not start; attempt a reboot.' + return 1 + fi + iq_ok 'IQ.Pilot restarted' +} + +iq_help() { + iq_title 'command center' + printf '%bUsage%b iq [--dir PATH] [--dry] COMMAND [ARGS] [r]\n\n' "$IQ_BOLD" "$IQ_RESET" + printf '%bCOMMAND%b\n' "$IQ_PURPLE" "$IQ_RESET" + printf ' %bsetup%b install development dependencies\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bcheck%b verify checkout, Git, Python, and venv\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bbuild%b build IQ.Pilot\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bquality%b run code-quality checks\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bpkg%b authenticate and synchronize private packages\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bupdate%b pull IQ.Pilot, synchronize packages, optionally fast restart\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bstatus%b show checkout, branch, commit, and tree state\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bswitch%b replace the checkout with another branch\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bvenv%b open a shell with the project venv active\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bstart%b start IQ.Pilot on IQ.OS\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %bstop%b stop IQ.Pilot on IQ.OS\n' "$IQ_CYAN" "$IQ_RESET" + printf ' %binstall%b install the iq shell command\n' "$IQ_CYAN" "$IQ_RESET" + printf '\n %br%b reboot after a successful command\n' "$IQ_CYAN" "$IQ_RESET" + printf '\n%bExamples%b\n' "$IQ_PURPLE" "$IQ_RESET" + printf ' iq setup iq update iq update f iq update f r\n' + iq_line +} + +while [[ $# -gt 0 ]]; do + case "$1" in + -d|--dir) [[ $# -ge 2 ]] || { iq_fail 'missing path after --dir'; exit 2; }; IQ_ROOT="$2"; shift 2 ;; + --dry) IQ_DRY=1; shift ;; + -n|--no-verify) IQ_NO_VERIFY=1; shift ;; + -l|--log) [[ $# -ge 2 ]] || { iq_fail 'missing file after --log'; exit 2; }; IQ_LOG_FILE="$2"; shift 2 ;; + -h|--help|help) iq_help; exit 0 ;; + *) break ;; + esac +done + +command="${1:-help}" +[[ $# -gt 0 ]] && shift +if [[ $# -gt 0 && "${!#}" = r ]]; then + IQ_REBOOT=1 + set -- "${@:1:$#-1}" +fi +case "$command" in + help) iq_help ;; + setup) iq_setup "$@" ;; + check) iq_check "$@" ;; + build) iq_build "$@" ;; + quality) iq_quality "$@" ;; + pkg) iq_pkg "$@" ;; + update) iq_update "$@" ;; + status) iq_status "$@" ;; + switch) iq_switch "$@" ;; + venv) iq_venv "$@" ;; + start) iq_service start "$@" ;; + stop) iq_service stop "$@" ;; + install) iq_install "$@" ;; + *) iq_fail "unknown command: $command"; iq_help; exit 2 ;; +esac + +if [[ "$IQ_REBOOT" = 1 ]]; then + iq_title 'restarting IQ.OS' + iq_run sudo reboot +fi diff --git a/iqpilot/tools/iqperf/__init__.py b/iqpilot/tools/iqperf/__init__.py new file mode 100755 index 000000000..8b1378917 --- /dev/null +++ b/iqpilot/tools/iqperf/__init__.py @@ -0,0 +1 @@ + diff --git a/iqpilot/tools/iqperf/analyze_msg_size.py b/iqpilot/tools/iqperf/analyze_msg_size.py new file mode 100755 index 000000000..b8d2d0420 --- /dev/null +++ b/iqpilot/tools/iqperf/analyze_msg_size.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +import argparse +from tqdm import tqdm + +from iqpilot.cereal.services import SERVICE_LIST, QueueSize +from iqpilot.tools.lib.logreader import LogReader + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Analyze message sizes from a log route") + parser.add_argument("route", nargs="?", default="98395b7c5b27882e/000000a8--f87e7cd255", + help="Log route to analyze (default: 98395b7c5b27882e/000000a8--f87e7cd255)") + args = parser.parse_args() + + lr = LogReader(args.route) + + szs = {} + for msg in tqdm(lr): + sz = len(msg.as_builder().to_bytes()) + msg_type = msg.which() + if msg_type not in szs: + szs[msg_type] = {'min': sz, 'max': sz, 'sum': sz, 'count': 1} + else: + szs[msg_type]['min'] = min(szs[msg_type]['min'], sz) + szs[msg_type]['max'] = max(szs[msg_type]['max'], sz) + szs[msg_type]['sum'] += sz + szs[msg_type]['count'] += 1 + + print() + print(f"{'Service':<36} {'Min (KB)':>12} {'Max (KB)':>12} {'Avg (KB)':>12} {'KB/min':>12} {'KB/sec':>12} {'Minutes in 10MB':>18} {'Seconds in Queue':>18}") + print("-" * 132) + def sort_key(x): + k, v = x + avg = v['sum'] / v['count'] + freq = SERVICE_LIST.get(k, None) + freq_val = freq.frequency if freq else 0.0 + kb_per_min = (avg * freq_val * 60) / 1024 if freq_val > 0 else 0.0 + return kb_per_min + total_kb_per_min = 0.0 + RINGBUFFER_SIZE_KB = 10 * 1024 # 10MB old default + for k, v in sorted(szs.items(), key=sort_key, reverse=True): + avg = v['sum'] / v['count'] + service = SERVICE_LIST.get(k, None) + freq_val = service.frequency if service else 0.0 + queue_size_kb = (service.queue_size / 1024) if service else 250 # default to SMALL + kb_per_min = (avg * freq_val * 60) / 1024 if freq_val > 0 else 0.0 + kb_per_sec = kb_per_min / 60 + minutes_in_buffer = RINGBUFFER_SIZE_KB / kb_per_min if kb_per_min > 0 else float('inf') + seconds_in_queue = (queue_size_kb / kb_per_sec) if kb_per_sec > 0 else float('inf') + total_kb_per_min += kb_per_min + min_str = f"{minutes_in_buffer:.2f}" if minutes_in_buffer != float('inf') else "inf" + sec_queue_str = f"{seconds_in_queue:.2f}" if seconds_in_queue != float('inf') else "inf" + print(f"{k:<36} {v['min']/1024:>12.2f} {v['max']/1024:>12.2f} {avg/1024:>12.2f} {kb_per_min:>12.2f} {kb_per_sec:>12.2f} {min_str:>18} {sec_queue_str:>18}") + + # Summary section + print() + print(f"Total usage: {total_kb_per_min / 1024:.2f} MB/min") + + # Calculate memory usage: old (10MB for all) vs new (from services.py) + OLD_SIZE = 10 * 1024 * 1024 # 10MB was the old default + old_total = len(SERVICE_LIST) * OLD_SIZE + + new_total = sum(s.queue_size for s in SERVICE_LIST.values()) + + # Count by queue size + size_counts = {QueueSize.BIG: 0, QueueSize.MEDIUM: 0, QueueSize.SMALL: 0} + for s in SERVICE_LIST.values(): + size_counts[s.queue_size] += 1 + + savings_pct = (1 - new_total / old_total) * 100 + + print() + print(f"{'Queue Size Comparison':<40}") + print("-" * 60) + print(f"{'Old (10MB default):':<30} {old_total / 1024 / 1024:>10.2f} MB") + print(f"{'New (from services.py):':<30} {new_total / 1024 / 1024:>10.2f} MB") + print(f"{'Savings:':<30} {savings_pct:>10.1f}%") + print() + print(f"{'Breakdown:':<30}") + print(f" BIG (10MB): {size_counts[QueueSize.BIG]:>3} services") + print(f" MEDIUM (2MB): {size_counts[QueueSize.MEDIUM]:>3} services") + print(f" SMALL (250KB): {size_counts[QueueSize.SMALL]:>3} services") diff --git a/iqpilot/tools/iqperf/check_can_parser_performance.py b/iqpilot/tools/iqperf/check_can_parser_performance.py new file mode 100755 index 000000000..3b0668240 --- /dev/null +++ b/iqpilot/tools/iqperf/check_can_parser_performance.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +import numpy as np +import time +from tqdm import tqdm + +from iqpilot.cereal import car +from iqdbc.car.tests.routes import CarTestRoute +from iqpilot.selfdrive.car.tests.test_models import TestCarModelBase +N_RUNS = 10 +DEMO_ROUTE = "a2a0ccea32023010|2023-07-27--13-01-19" + + +class CarModelTestCase(TestCarModelBase): + test_route = CarTestRoute(DEMO_ROUTE, None) + + +if __name__ == '__main__': + # Get CAN messages and parsers + tm = CarModelTestCase() + tm.setUpClass() + tm.setUp() + + CC = car.CarControl.new_message() + ets = [] + for _ in tqdm(range(N_RUNS)): + start_t = time.process_time_ns() + for msg in tm.can_msgs: + for cp in tm.CI.can_parsers.values(): + if cp is not None: + cp.update_strings(msg) + ets.append((time.process_time_ns() - start_t) * 1e-6) + + print(f'{len(tm.can_msgs)} CAN packets, {N_RUNS} runs') + print(f'{np.mean(ets):.2f} mean ms, {max(ets):.2f} max ms, {min(ets):.2f} min ms, {np.std(ets):.2f} std ms') + print(f'{np.mean(ets) / len(tm.can_msgs):.4f} mean ms / CAN packet') diff --git a/iqpilot/tools/iqperf/check_freq.py b/iqpilot/tools/iqperf/check_freq.py new file mode 100755 index 000000000..66fbcb011 --- /dev/null +++ b/iqpilot/tools/iqperf/check_freq.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +import argparse +import numpy as np +import time +from collections import defaultdict, deque +from collections.abc import MutableSequence + +import iqpilot.cereal.messaging as messaging + + +if __name__ == "__main__": + context = messaging.Context() + poller = messaging.Poller() + + parser = argparse.ArgumentParser() + parser.add_argument("socket", type=str, nargs='*', help="socket name") + args = parser.parse_args() + + socket_names = args.socket + sockets = {} + + rcv_times: defaultdict[str, MutableSequence[float]] = defaultdict(lambda: deque(maxlen=100)) + valids: defaultdict[str, deque[bool]] = defaultdict(lambda: deque(maxlen=100)) + + t = time.monotonic() + for name in socket_names: + sock = messaging.sub_sock(name, poller=poller) + sockets[sock] = name + + prev_print = t + while True: + for socket in poller.poll(100): + msg = messaging.recv_one(socket) + if msg is None: + continue + + name = msg.which() + + t = time.monotonic() + rcv_times[name].append(msg.logMonoTime / 1e9) + valids[name].append(msg.valid) + + if t - prev_print > 1: + print() + for name in socket_names: + dts = np.diff(rcv_times[name]) + mean = np.mean(dts) + print(f"{name}: Freq {1.0 / mean:.2f} Hz, Min {np.min(dts) / mean * 100:.2f}%, Max {np.max(dts) / mean * 100:.2f}%, valid ", all(valids[name])) + + prev_print = t diff --git a/iqpilot/tools/iqperf/check_lag.py b/iqpilot/tools/iqperf/check_lag.py new file mode 100755 index 000000000..55f941e16 --- /dev/null +++ b/iqpilot/tools/iqperf/check_lag.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal.services import SERVICE_LIST + +TO_CHECK = ['carState'] + + +if __name__ == "__main__": + sm = messaging.SubMaster(TO_CHECK) + + prev_t: dict[str, float] = {} + + while True: + sm.update() + + for s in TO_CHECK: + if sm.updated[s]: + t = sm.logMonoTime[s] / 1e9 + + if s in prev_t: + expected = 1.0 / (SERVICE_LIST[s].frequency) + dt = t - prev_t[s] + if dt > 10 * expected: + print(t, s, dt) + + prev_t[s] = t diff --git a/iqpilot/tools/iqperf/check_timings.py b/iqpilot/tools/iqperf/check_timings.py new file mode 100755 index 000000000..82e7434c2 --- /dev/null +++ b/iqpilot/tools/iqperf/check_timings.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +import sys +import time +import numpy as np +import datetime +from collections.abc import MutableSequence +from collections import defaultdict + +import iqpilot.cereal.messaging as messaging + + +if __name__ == "__main__": + ts: defaultdict[str, MutableSequence[float]] = defaultdict(list) + socks = {s: messaging.sub_sock(s, conflate=False) for s in sys.argv[1:]} + try: + st = time.monotonic() + while True: + print() + for s, sock in socks.items(): + msgs = messaging.drain_sock(sock) + for m in msgs: + ts[s].append(m.logMonoTime / 1e6) + + if len(ts[s]) > 2: + d = np.diff(ts[s])[-100:] + print(f"{s:25} {np.mean(d):7.2f} {np.std(d):7.2f} {np.max(d):7.2f} {np.min(d):7.2f}") + time.sleep(1) + except KeyboardInterrupt: + print("\n") + print("="*5, "timing summary", "="*5) + for s, sock in socks.items(): + msgs = messaging.drain_sock(sock) + if len(ts[s]) > 2: + d = np.diff(ts[s]) + print(f"{s:25} {np.mean(d):7.2f} {np.std(d):7.2f} {np.max(d):7.2f} {np.min(d):7.2f}") + print("="*5, datetime.timedelta(seconds=time.monotonic()-st), "="*5) diff --git a/iqpilot/tools/iqperf/cpu_usage_stat.py b/iqpilot/tools/iqperf/cpu_usage_stat.py new file mode 100755 index 000000000..01a5c2f9a --- /dev/null +++ b/iqpilot/tools/iqperf/cpu_usage_stat.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +''' +System tools like top/htop can only show current cpu usage values, so I write this script to do statistics jobs. + Features: + Use psutil library to sample cpu usage(avergage for all cores) of openpilot processes, at a rate of 5 samples/sec. + Do cpu usage statistics periodically, 5 seconds as a cycle. + Calculate the average cpu usage within this cycle. + Calculate minumium/maximum/accumulated_average cpu usage as long term inspections. + Monitor multiple processes simuteneously. + Sample usage: + root@localhost:/data/openpilot$ python iqpilot/tools/iqperf/cpu_usage_stat.py pandad,ubloxd + ('Add monitored proc:', './pandad') + ('Add monitored proc:', 'python locationd/ubloxd.py') + pandad: 1.96%, min: 1.96%, max: 1.96%, acc: 1.96% + ubloxd.py: 0.39%, min: 0.39%, max: 0.39%, acc: 0.39% +''' +import psutil +import time +import os +import sys +import numpy as np +import argparse +import re +from collections import defaultdict + +from iqpilot.system.manager.process_config import managed_processes + +# Do statistics every 5 seconds +PRINT_INTERVAL = 5 +SLEEP_INTERVAL = 0.2 + +monitored_proc_names = [ + # android procs + 'SurfaceFlinger', 'sensors.qcom' +] + list(managed_processes.keys()) + +cpu_time_names = ['user', 'system', 'children_user', 'children_system'] + + +def get_arg_parser(): + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument("proc_names", nargs="?", default='', + help="Process names to be monitored, comma separated") + parser.add_argument("--list_all", action='store_true', + help="Show all running processes' cmdline") + parser.add_argument("--detailed_times", action='store_true', + help="show cpu time details (split by user, system, child user, child system)") + return parser + + +if __name__ == "__main__": + args = get_arg_parser().parse_args(sys.argv[1:]) + if args.list_all: + for p in psutil.process_iter(): + print('cmdline', p.cmdline(), 'name', p.name()) + sys.exit(0) + + if len(args.proc_names) > 0: + monitored_proc_names = args.proc_names.split(',') + monitored_procs = [] + stats = {} + for p in psutil.process_iter(): + if p == psutil.Process(): + continue + matched = any(l for l in p.cmdline() if any(pn for pn in monitored_proc_names if re.match(fr'.*{pn}.*', l, re.M | re.I))) + if matched: + k = ' '.join(p.cmdline()) + print('Add monitored proc:', k) + stats[k] = {'cpu_samples': defaultdict(list), 'min': defaultdict(lambda: None), 'max': defaultdict(lambda: None), + 'avg': defaultdict(float), 'last_cpu_times': None, 'last_sys_time': None} + stats[k]['last_sys_time'] = time.monotonic() + stats[k]['last_cpu_times'] = p.cpu_times() + monitored_procs.append(p) + i = 0 + interval_int = int(PRINT_INTERVAL / SLEEP_INTERVAL) + while True: + for p in monitored_procs: + k = ' '.join(p.cmdline()) + cur_sys_time = time.monotonic() + cur_cpu_times = p.cpu_times() + cpu_times = np.subtract(cur_cpu_times, stats[k]['last_cpu_times']) / (cur_sys_time - stats[k]['last_sys_time']) + stats[k]['last_sys_time'] = cur_sys_time + stats[k]['last_cpu_times'] = cur_cpu_times + cpu_percent = 0 + for num, name in enumerate(cpu_time_names): + stats[k]['cpu_samples'][name].append(cpu_times[num]) + cpu_percent += cpu_times[num] + stats[k]['cpu_samples']['total'].append(cpu_percent) + time.sleep(SLEEP_INTERVAL) + i += 1 + if i % interval_int == 0: + l = [] + for k, stat in stats.items(): + if len(stat['cpu_samples']) <= 0: + continue + for name, samples in stat['cpu_samples'].items(): + samples = np.array(samples) + avg = samples.mean() + c = samples.size + min_cpu = np.amin(samples) + max_cpu = np.amax(samples) + if stat['min'][name] is None or min_cpu < stat['min'][name]: + stat['min'][name] = min_cpu + if stat['max'][name] is None or max_cpu > stat['max'][name]: + stat['max'][name] = max_cpu + stat['avg'][name] = (stat['avg'][name] * (i - c) + avg * c) / (i) + stat['cpu_samples'][name] = [] + + msg = f"avg: {stat['avg']['total']:.2%}, min: {stat['min']['total']:.2%}, max: {stat['max']['total']:.2%} {os.path.basename(k)}" + if args.detailed_times: + for stat_type in ['avg', 'min', 'max']: + msg += f"\n {stat_type}: {[(name + ':' + str(round(stat[stat_type][name] * 100, 2))) for name in cpu_time_names]}" + l.append((os.path.basename(k), stat['avg']['total'], msg)) + l.sort(key=lambda x: -x[1]) + for x in l: + print(x[2]) + print('avg sum: {:.2%} over {} samples {} seconds\n'.format( + sum(stat['avg']['total'] for k, stat in stats.items()), i, i * SLEEP_INTERVAL + )) diff --git a/iqpilot/tools/iqperf/io_stall_repro.py b/iqpilot/tools/iqperf/io_stall_repro.py new file mode 100755 index 000000000..88adea4c1 --- /dev/null +++ b/iqpilot/tools/iqperf/io_stall_repro.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 +""" +io_stall_repro.py — bench reproduction + fix-validation rig for the VW PQ EPS +HCA fault (control loop stalling on a /data read under eMMC write saturation). + +The real fault chain (proven from rlog b29ee8c5a0a735d1/000000e4--8a8ba97b54): + loggerd buffered writes saturate eMMC -> ext4 jbd2 journal commits -> + controlsd's inline Params.get (util::read_file on /data) blocks ~300-630ms -> + controlsd stops publishing carControl -> card's all_alive guard withholds + HCA_1 -> EPS LH2_Sta_HCA 7->2. + +This reproduces the *proximate* cause WITHOUT driving, WITHOUT the EPS, and +WITHOUT touching the real control stack. Two roles: + + --writer : emulate loggerd. Buffered (no-fsync) writes to /data at a target + MB/s, with an optional periodic big flush to mimic 60s segment + rotation. This is what saturates the eMMC. + + --probe : emulate controlsd's I/O exposure. A 100Hz loop that every + --param-period seconds reads a real param (util::read_file on + /data). It records per-iteration loop gaps and param-read + durations. A 300ms gap here == the stall that drops HCA. + --threaded moves the param read to a background thread (the + proposed fix, mirroring card.py's params_thread) so you can A/B it. + +USAGE (run parked, ignition on, on the device): + # 1) baseline: probe alone -> gaps should be tiny + python3 io_stall_repro.py --probe --secs 120 + + # 2) reproduce: writer in one shell, probe in another + python3 io_stall_repro.py --writer --mbps 25 --rotate 60 + python3 io_stall_repro.py --probe --secs 180 # expect big gaps + + # 3) validate fix A (params off control thread): + python3 io_stall_repro.py --probe --secs 180 --threaded # gaps should vanish + + # 4) validate fix B (smoother writeback) — set before step 2, as root: + # echo 5 > /proc/sys/vm/dirty_background_ratio + # echo 10 > /proc/sys/vm/dirty_ratio + # then re-run step 2 inline probe and compare gap distribution. + +Cleanup: writer deletes its scratch files on exit. Read-only wrt openpilot. +""" + +import argparse +import os +import sys +import time +import threading +import signal + +SCRATCH_DEFAULT = "/data/media/0/io_repro_scratch" + + +# ----------------------------------------------------------------------------- writer +def run_writer(args): + os.makedirs(args.scratch, exist_ok=True) + chunk = os.urandom(1 << 20) # 1 MiB + bytes_per_s = int(args.mbps * (1 << 20)) + print(f"[writer] buffered no-fsync writes to {args.scratch} at ~{args.mbps} MB/s, rotate every {args.rotate}s (big flush). Ctrl-C to stop.", file=sys.stderr) + + stop = {"v": False} + signal.signal(signal.SIGINT, lambda *_: stop.update(v=True)) + signal.signal(signal.SIGTERM, lambda *_: stop.update(v=True)) + + files = [] + seg = 0 + try: + while not stop["v"]: + seg_start = time.monotonic() + path = os.path.join(args.scratch, f"seg_{seg}.bin") + f = open(path, "wb", buffering=1 << 20) + files.append(path) + written = 0 + # write at target rate using buffered fwrite, NO fsync (exactly loggerd) + while not stop["v"] and (time.monotonic() - seg_start) < args.rotate: + f.write(chunk) + written += len(chunk) + # pace to target MB/s + target_t = written / bytes_per_s + elapsed = time.monotonic() - seg_start + if target_t > elapsed: + time.sleep(min(0.1, target_t - elapsed)) + # "segment rotation": flush+close a big buffered file at once -> writeback burst + f.flush() + f.close() + seg += 1 + # keep only a few recent files so we don't fill the disk + while len(files) > 3: + old = files.pop(0) + try: + os.remove(old) + except OSError: + pass + finally: + for p in files: + try: + os.remove(p) + except OSError: + pass + print("[writer] stopped, scratch cleaned.", file=sys.stderr) + + +# ----------------------------------------------------------------------------- probe +def _get_param(key): + # real /data read, same syscall path as controlsd's get_params_iq + try: + from iqpilot.common.params import Params + + return Params().get_bool(key) + except Exception: + # fallback: plain file read of a param file if openpilot import unavailable + p = os.path.join(os.getenv("PARAMS_ROOT", "/data/params"), "d", key) + try: + with open(p, "rb") as fh: + return fh.read() + except OSError: + return None + + +class ThreadedParam: + """Mirror card.py params_thread: refresh the param on a bg thread, control + loop reads the cached value (non-blocking).""" + + def __init__(self, key, period): + self.key = key + self.period = period + self.val = None + self.stop = False + self.t = threading.Thread(target=self._loop, daemon=True) + self.t.start() + + def _loop(self): + while not self.stop: + self.val = _get_param(self.key) + time.sleep(self.period) + + def read(self): # O(1), no I/O on the control thread + return self.val + + +def run_probe(args): + # pin like controlsd (core 4) so we share the same iowait domain if possible + try: + os.sched_setaffinity(0, {args.core}) + except (OSError, AttributeError): + pass + + interval = 0.01 # 100Hz, like the control loop + gaps = [] # ms, per-iteration loop overrun beyond 10ms + read_ms = [] # ms, time spent in the param read on the control thread + worst = 0.0 + threaded = ThreadedParam(args.param_key, args.param_period) if args.threaded else None + + print( + f"[probe] 100Hz loop for {args.secs}s, param '{args.param_key}' every {args.param_period}s, threaded={args.threaded}, core={args.core}", file=sys.stderr + ) + t_end = time.monotonic() + args.secs + next_t = time.monotonic() + last_param = 0.0 + while time.monotonic() < t_end: + loop_start = time.monotonic() + + # the I/O exposure: read param on the control thread (inline) every period + if loop_start - last_param >= args.param_period: + r0 = time.monotonic() + if threaded is not None: + _ = threaded.read() # cached, no I/O on this thread (the FIX) + else: + _ = _get_param(args.param_key) # inline /data read (current behavior) + dr = (time.monotonic() - r0) * 1000 + read_ms.append(dr) + last_param = loop_start + + # measure scheduling/lag: how late did this iteration actually fire? + next_t += interval + lag = (time.monotonic() - next_t) * 1000 # ms behind schedule + if lag > 5: + gaps.append(lag) + worst = max(worst, lag) + sleep = next_t - time.monotonic() + if sleep > 0: + time.sleep(sleep) + else: + next_t = time.monotonic() # don't spiral after a big stall + + if threaded: + threaded.stop = True + + def pct(xs, p): + return sorted(xs)[int(p / 100 * (len(xs) - 1))] if xs else 0.0 + + print("\n================ PROBE RESULT ================") + print(f"loop-lag events >5ms : {len(gaps)}") + print(f"loop-lag p50/p99/max : {pct(gaps, 50):.0f} / {pct(gaps, 99):.0f} / {worst:.0f} ms") + print(f"param-read p50/p99/max: {pct(read_ms, 50):.1f} / {pct(read_ms, 99):.1f} / {max(read_ms + [0]):.1f} ms (n={len(read_ms)})") + hca_class = max(gaps + [0]) + verdict = "FAULT-CLASS STALL REPRODUCED (>250ms -> would drop HCA)" if hca_class > 250 else "marginal (100-250ms)" if hca_class > 100 else "clean (<100ms)" + print(f"VERDICT: {verdict}") + print("=============================================") + + +# ----------------------------------------------------------------------------- main +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--writer", action="store_true", help="emulate loggerd eMMC saturation") + ap.add_argument("--probe", action="store_true", help="emulate controlsd I/O exposure") + ap.add_argument("--mbps", type=float, default=25.0, help="writer target MB/s (loggerd ~10-30)") + ap.add_argument("--rotate", type=float, default=60.0, help="writer segment/flush period s") + ap.add_argument("--scratch", default=SCRATCH_DEFAULT) + ap.add_argument("--secs", type=float, default=180.0, help="probe duration s") + ap.add_argument("--param-key", default="IsMetric", help="a real param key to read") + ap.add_argument("--param-period", type=float, default=3.0, help="controlsd reads every 3s") + ap.add_argument("--threaded", action="store_true", help="probe: read param off control thread (the FIX)") + ap.add_argument("--core", type=int, default=4, help="probe cpu affinity (control core)") + args = ap.parse_args() + if args.writer == args.probe: + ap.error("pick exactly one of --writer / --probe (run them in separate shells)") + run_writer(args) if args.writer else run_probe(args) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/iqperf/io_stall_tracer.py b/iqpilot/tools/iqperf/io_stall_tracer.py new file mode 100755 index 000000000..9a00b19f6 --- /dev/null +++ b/iqpilot/tools/iqperf/io_stall_tracer.py @@ -0,0 +1,268 @@ +#!/usr/bin/env python3 +""" +io_stall_tracer.py — continuous low-overhead per-process disk-I/O tracer. + +WHY: the VW PQ EPS HCA faults are caused by a control process (controlsd/card) +blocking ~300-630ms in disk I/O (iowait) on /data, which stops HCA_1 TX. The +stall is far too short to catch with a manual `iostat`/`iotop` run. This sampler +runs for the whole drive at 100ms cadence and records, per process: + + - write_bytes (/proc//io) -> identifies the WRITER saturating eMMC + - delayacct_blkio (/proc//stat) -> per-process cumulative block-I/O wait + - state (/proc//stat) -> catches 'D' (uninterruptible disk wait) + +plus whole-device /proc/diskstats. After a fault, find the wall-clock time of the +LH2_Sta_HCA->2 event (from the rlog) and look at the rows around it: the process +whose write_bytes delta spikes is the bully; the control process whose blkio +delta jumps / state == 'D' is the victim. + +Deploy: copy to the device, run alongside openpilot during a drive: + python3 io_stall_tracer.py --out /data/media/0/io_trace.csv +Overhead: reading /proc for ~40 procs every 100ms is well under 1% of one core, +and it pins itself to CPU 0 (away from the control cores 4/5) at low priority. + +Read-only. Writes a single CSV. No openpilot deps. +""" + +import argparse +import os +import time +import glob +import sys + +CLK_TCK = os.sysconf("SC_CLK_TCK") # usually 100 -> blkio ticks are 10ms each + + +def read_proc_io(pid): + # wchar/rchar = bytes moved via read()/write() syscalls (catches BUFFERED writers + # like loggerd, which never appear in write_bytes because the kernel flushes their + # page-cache dirty pages asynchronously via kworker). write_bytes = bytes actually + # sent to the block device. Track both. + try: + with open(f"/proc/{pid}/io") as f: + d = {} + for line in f: + k, _, v = line.partition(":") + d[k] = int(v) + return (d.get("wchar", 0), d.get("rchar", 0), d.get("write_bytes", 0), d.get("read_bytes", 0)) + except (OSError, ValueError): + return None + + +def read_proc_stat(pid): + # state is field 3; delayacct_blkio_ticks is field 42 (1-indexed). comm may + # contain spaces/parens, so split on the last ')'. + try: + with open(f"/proc/{pid}/stat") as f: + data = f.read() + rparen = data.rfind(")") + comm = data[data.find("(") + 1 : rparen] + rest = data[rparen + 2 :].split() + state = rest[0] # field 3 + blkio_ticks = int(rest[39]) if len(rest) > 39 else 0 # field 42 + return comm, state, blkio_ticks + except (OSError, ValueError, IndexError): + return None + + +def read_diskstats(): + # returns {dev: (sectors_written, ms_doing_io)} for whole-disk devices + out = {} + try: + with open("/proc/diskstats") as f: + for line in f: + p = line.split() + if len(p) < 14: + continue + dev = p[2] + # field 10 (idx 9) = sectors written; field 13 (idx 12) = ms doing I/O + out[dev] = (int(p[9]), int(p[12])) + except (OSError, AttributeError): + pass + return out + + +# These counters tell us WHICH kernel mechanism caused a stall, which decides +# the fix: compact_stall jumping -> memory compaction (texture-pool fix); +# allocstall/pgsteal jumping -> direct reclaim; high nr_dirty/nr_writeback -> +# loggerd writeback bomb (loggerd sync_file_range fix). meminfo Dirty/Writeback +# are absolute kB; vmstat ones are cumulative event counts (we delta them). +VMSTAT_KEYS = ( + "compact_stall", + "compact_fail", + "allocstall_normal", + "allocstall_movable", + "pgsteal_direct", + "pgscan_direct", + "pgmajfault", + "nr_dirty", + "nr_writeback", +) +MEMINFO_KEYS = ("MemFree", "MemAvailable", "Dirty", "Writeback") + + +def read_vmstat(): + out = {} + try: + with open("/proc/vmstat") as f: + for line in f: + k, _, v = line.partition(" ") + if k in VMSTAT_KEYS: + out[k] = int(v) + except OSError: + pass + return out + + +def read_meminfo(): + out = {} + try: + with open("/proc/meminfo") as f: + for line in f: + k, _, v = line.partition(":") + if k in MEMINFO_KEYS: + out[k] = int(v.split()[0]) # kB + except (OSError, IndexError): + pass + return out + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--out", default="/data/media/0/io_trace.csv") + ap.add_argument("--hz", type=float, default=10.0, help="sample rate (default 10Hz/100ms)") + ap.add_argument("--disk", default="sda", help="comma-separated disk devices to track (default sda)") + ap.add_argument( + "--names", + default="controlsd,car.c,selfd,ui,loggerd,encoderd,modeld,camerad,locationd,estimatord,navd,mapd", + help="substring match of process comm to record (others summed as 'other')", + ) + args = ap.parse_args() + + # be a good citizen: low priority, off the control cores + try: + os.nice(10) + os.sched_setaffinity(0, {0}) + except OSError: + pass + + watch = [n.strip() for n in args.names.split(",") if n.strip()] + disks = [d.strip() for d in args.disk.split(",") if d.strip()] + interval = 1.0 / args.hz + + prev_io = {} # pid -> (wchar, rchar, write_bytes, read_bytes) + prev_blkio = {} # pid -> blkio_ticks + prev_disk = read_diskstats() + prev_vm = read_vmstat() + + f = open(args.out, "w", buffering=1) + # per-proc rows fill the first block; one SYS row per tick fills the trailing + # mechanism columns (deltas for the vmstat counts, absolute kB for meminfo). + columns = [ + "wall", + "mono", + "proc", + "pid", + "state", + "d_wchar_kB", + "d_wbytes_kB", + "d_blkio_ms", + "disk_d_write_kB", + "disk_d_busy_ms", + "compact_stall", + "allocstall", + "pgmajfault", + "dirty_kB", + "writeback_kB", + "memfree_kB", + "memavail_kB", + ] + f.write(",".join(columns) + "\n") + print(f"[io_stall_tracer] writing {args.out} at {args.hz}Hz, tracking {watch}", file=sys.stderr) + + while True: + t_wall = time.time() + t_mono = time.monotonic() + + # whole-disk delta (write kB + busy ms) for the named disks + disk = read_diskstats() + disk_dw = disk_db = 0 + for dev in disks: + if dev in disk and dev in prev_disk: + disk_dw += (disk[dev][0] - prev_disk[dev][0]) * 512 / 1024.0 # sectors->kB + disk_db += disk[dev][1] - prev_disk[dev][1] + prev_disk = disk + + seen = set() + rows = [] + for path in glob.glob("/proc/[0-9]*"): + pid = path.rsplit("/", 1)[1] + st = read_proc_stat(pid) + if st is None: + continue + comm, state, blkio = st + label = next((w for w in watch if w in comm), None) + if label is None: + # still track D-state of anything to catch surprise writers/blockers + if state != "D": + continue + label = comm + io = read_proc_io(pid) + if io is None: + continue + wchar, rchar, wbytes, rbytes = io + pw = prev_io.get(pid, io) + pblk = prev_blkio.get(pid, blkio) + d_wchar = (wchar - pw[0]) / 1024.0 # syscall write volume (catches loggerd) + d_wbytes = (wbytes - pw[2]) / 1024.0 # bytes hitting the block device + d_blk = (blkio - pblk) * (1000.0 / CLK_TCK) # ticks -> ms blocked on block I/O + prev_io[pid] = io + prev_blkio[pid] = blkio + seen.add(pid) + # only emit rows that carry signal (writing, blocked, or in D) to keep file small + if d_wchar > 4 or d_wbytes > 4 or d_blk > 5 or state == "D": + rows.append((label, pid, state, d_wchar, d_wbytes, d_blk)) + + # drop dead pids from prev maps occasionally + if len(prev_io) > 4000: + prev_io = {p: v for p, v in prev_io.items() if p in seen} + prev_blkio = {p: v for p, v in prev_blkio.items() if p in seen} + + for label, pid, state, d_wchar, d_wbytes, d_blk in rows: + f.write(f"{t_wall:.3f},{t_mono:.3f},{label},{pid},{state},{d_wchar:.0f},{d_wbytes:.0f},{d_blk:.0f},{disk_dw:.0f},{disk_db:.0f},,,,,,,\n") + + # one SYS row per tick: the kernel-mechanism counters (compaction vs reclaim + # vs writeback). Compare these against the stall's wall-clock to see which + # one spiked. + vm = read_vmstat() + mi = read_meminfo() + d_compact = vm.get("compact_stall", 0) - prev_vm.get("compact_stall", 0) + d_alloc = (vm.get("allocstall_normal", 0) + vm.get("allocstall_movable", 0)) - (prev_vm.get("allocstall_normal", 0) + prev_vm.get("allocstall_movable", 0)) + d_majflt = vm.get("pgmajfault", 0) - prev_vm.get("pgmajfault", 0) + prev_vm = vm + values = [ + f"{t_wall:.3f}", + f"{t_mono:.3f}", + "SYS", + "0", + "-", + "", + "", + "", + "", + "", + str(d_compact), + str(d_alloc), + str(d_majflt), + str(mi.get("Dirty", 0)), + str(mi.get("Writeback", 0)), + str(mi.get("MemFree", 0)), + str(mi.get("MemAvailable", 0)), + ] + f.write(",".join(values) + "\n") + + time.sleep(max(0.0, interval - (time.monotonic() - t_mono))) + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/iqperf/live_cpu_and_temp.py b/iqpilot/tools/iqperf/live_cpu_and_temp.py new file mode 100755 index 000000000..ffeb3a44d --- /dev/null +++ b/iqpilot/tools/iqperf/live_cpu_and_temp.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +import argparse +import numpy as np +import capnp +from collections import defaultdict + +from iqpilot.cereal.messaging import SubMaster + +def cputime_total(ct): + return ct.user + ct.nice + ct.system + ct.idle + ct.iowait + ct.irq + ct.softirq + + +def cputime_busy(ct): + return ct.user + ct.nice + ct.system + ct.irq + ct.softirq + + +def proc_cputime_total(ct): + return ct.cpuUser + ct.cpuSystem + ct.cpuChildrenUser + ct.cpuChildrenSystem + + +def proc_name(proc): + name = proc.name + if len(proc.cmdline): + name = proc.cmdline[0] + if len(proc.exe): + name = proc.exe + " - " + name + + return name + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--mem', action='store_true') + parser.add_argument('--cpu', action='store_true') + args = parser.parse_args() + + sm = SubMaster(['deviceState', 'procLog']) + + last_temp = 0.0 + last_mem = 0.0 + total_times = [0.]*8 + busy_times = [0.]*8 + + prev_proclog: capnp._DynamicStructReader | None = None + prev_proclog_t: int | None = None + + while True: + sm.update() + + if sm.updated['deviceState']: + t = sm['deviceState'] + last_temp = np.mean(t.cpuTempC) + last_mem = t.memoryUsagePercent + + if sm.updated['procLog']: + m = sm['procLog'] + + cores = [0.]*8 + total_times_new = [0.]*8 + busy_times_new = [0.]*8 + + for c in m.cpuTimes: + n = c.cpuNum + total_times_new[n] = cputime_total(c) + busy_times_new[n] = cputime_busy(c) + + for n in range(8): + t_busy = busy_times_new[n] - busy_times[n] + t_total = total_times_new[n] - total_times[n] + cores[n] = t_busy / t_total + + total_times = total_times_new[:] + busy_times = busy_times_new[:] + + print(f"CPU {100.0 * np.mean(cores):.2f}% - RAM: {last_mem:.2f}% - Temp {last_temp:.2f}C") + + if args.cpu and prev_proclog is not None and prev_proclog_t is not None: + procs: dict[str, float] = defaultdict(float) + dt = (sm.logMonoTime['procLog'] - prev_proclog_t) / 1e9 + for proc in m.procs: + try: + name = proc_name(proc) + prev_proc = [p for p in prev_proclog.procs if proc.pid == p.pid][0] + cpu_time = proc_cputime_total(proc) - proc_cputime_total(prev_proc) + cpu_usage = cpu_time / dt * 100. + procs[name] += cpu_usage + except IndexError: + pass + + print("Top CPU usage:") + for k, v in sorted(procs.items(), key=lambda item: item[1], reverse=True)[:10]: + print(f"{k.rjust(70)} {v:.2f} %") + print() + + if args.mem: + mems = {} + for proc in m.procs: + name = proc_name(proc) + mems[name] = float(proc.memRss) / 1e6 + print("Top memory usage:") + for k, v in sorted(mems.items(), key=lambda item: item[1], reverse=True)[:10]: + print(f"{k.rjust(70)} {v:.2f} MB") + print() + + prev_proclog = m + prev_proclog_t = sm.logMonoTime['procLog'] diff --git a/iqpilot/tools/iqperf/max_lat_accel.py b/iqpilot/tools/iqperf/max_lat_accel.py new file mode 100755 index 000000000..9f42078fc --- /dev/null +++ b/iqpilot/tools/iqperf/max_lat_accel.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +import argparse +import numpy as np +import matplotlib.pyplot as plt +from functools import partial +from tqdm import tqdm +from typing import NamedTuple +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.selfdrive.locationd.models.pose_kf import EARTH_G + +RLOG_MIN_LAT_ACTIVE = 50 +RLOG_MIN_STEERING_UNPRESSED = 50 +RLOG_MIN_REQUESTING_MAX = 25 # sample many times after reaching max torque + +QLOG_DECIMATION = 10 + + +class Event(NamedTuple): + lateral_accel: float + speed: float + roll: float + timestamp: float # relative to start of route (s) + + +def find_events(lr: LogReader, extrapolate: bool = False, qlog: bool = False) -> list[Event]: + min_lat_active = RLOG_MIN_LAT_ACTIVE // QLOG_DECIMATION if qlog else RLOG_MIN_LAT_ACTIVE + min_steering_unpressed = RLOG_MIN_STEERING_UNPRESSED // QLOG_DECIMATION if qlog else RLOG_MIN_STEERING_UNPRESSED + min_requesting_max = RLOG_MIN_REQUESTING_MAX // QLOG_DECIMATION if qlog else RLOG_MIN_REQUESTING_MAX + + # if we test with driver torque safety, max torque can be slightly noisy + steer_threshold = 0.7 if extrapolate else 0.95 + + events = [] + + # state tracking + steering_unpressed = 0 # frames + requesting_max = 0 # frames + lat_active = 0 # frames + + # current state + curvature = 0 + v_ego = 0 + roll = 0 + out_torque = 0 + + start_ts = 0 + for msg in lr: + if msg.which() == 'carControl': + if start_ts == 0: + start_ts = msg.logMonoTime + + lat_active = lat_active + 1 if msg.carControl.latActive else 0 + + elif msg.which() == 'carOutput': + out_torque = msg.carOutput.actuatorsOutput.torque + requesting_max = requesting_max + 1 if abs(out_torque) > steer_threshold else 0 + + elif msg.which() == 'carState': + steering_unpressed = steering_unpressed + 1 if not msg.carState.steeringPressed else 0 + v_ego = msg.carState.vEgo + + elif msg.which() == 'controlsState': + curvature = msg.controlsState.curvature + + elif msg.which() == 'vehicleParameters': + roll = msg.vehicleParameters.roll + + if lat_active > min_lat_active and steering_unpressed > min_steering_unpressed and requesting_max > min_requesting_max: + # TODO: record max lat accel at the end of the event, need to use the past lat accel as overriding can happen before we detect it + requesting_max = 0 + + factor = 1 / abs(out_torque) + current_lateral_accel = (curvature * v_ego ** 2 * factor) - roll * EARTH_G + events.append(Event(current_lateral_accel, v_ego, roll, round((msg.logMonoTime - start_ts) * 1e-9, 2))) + print(events[-1]) + + return events + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Find max lateral acceleration events", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument("route", nargs='+') + parser.add_argument("-e", "--extrapolate", action="store_true", help="Extrapolates max lateral acceleration events linearly. " + + "This option can be far less accurate.") + args = parser.parse_args() + + events = [] + for route in tqdm(args.route): + try: + lr = LogReader(route, sort_by_time=True) + except Exception: + print(f'Skipping {route}') + continue + + qlog = route.endswith('/q') + if qlog: + print('WARNING: Treating route as qlog!') + + print('Finding events...') + events += lr.run_across_segments(8, partial(find_events, extrapolate=args.extrapolate, qlog=qlog), disable_tqdm=True) + + print() + print(f'Found {len(events)} events') + + perc_left_accel = -np.percentile([-ev.lateral_accel for ev in events if ev.lateral_accel < 0] or [0], 90) + perc_right_accel = np.percentile([ev.lateral_accel for ev in events if ev.lateral_accel > 0] or [0], 90) + + CP = lr.first('carParams') + + plt.ion() + plt.clf() + plt.suptitle(f'{CP.carFingerprint} - Max lateral acceleration events') + plt.title(', '.join(args.route)) + plt.scatter([ev.speed for ev in events], [ev.lateral_accel for ev in events], label='max lateral accel events') + + plt.plot([0, 35], [3, 3], c='r', label='ISO 11270 - 3 m/s^2') + plt.plot([0, 35], [-3, -3], c='r') + + plt.plot([0, 35], [perc_left_accel, perc_left_accel], c='g', linestyle='--', label='90th percentile left lateral accel') + plt.plot([0, 35], [perc_right_accel, perc_right_accel], c='#ff7f0e', linestyle='--', label='90th percentile right lateral accel') + plt.text(0.4, float(perc_left_accel + 0.4), f'{perc_left_accel:.2f} m/s^2', verticalalignment='center', fontsize=12) + plt.text(0.4, float(perc_right_accel - 0.4), f'{perc_right_accel:.2f} m/s^2', verticalalignment='center', fontsize=12) + + plt.xlim(0, 35) + plt.ylim(-5, 5) + plt.xlabel('speed (m/s)') + plt.ylabel('lateral acceleration (m/s^2)') + plt.legend() + plt.show(block=True) diff --git a/iqpilot/tools/iqperf/measure_torque_time_to_max.py b/iqpilot/tools/iqperf/measure_torque_time_to_max.py new file mode 100755 index 000000000..b6ce1a5e5 --- /dev/null +++ b/iqpilot/tools/iqperf/measure_torque_time_to_max.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +import os +import argparse +import struct +from collections import deque +from statistics import mean + +from iqpilot.cereal import log +import iqpilot.cereal.messaging as messaging + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description='Sniff a communication socket') + parser.add_argument('--addr', default='127.0.0.1') + args = parser.parse_args() + + if args.addr != "127.0.0.1": + os.environ["ZMQ"] = "1" + messaging.reset_context() + + poller = messaging.Poller() + messaging.sub_sock('can', poller, addr=args.addr) + + active = 0 + start_t = 0 + start_v = 0 + max_v = 0 + max_t = 0 + window = deque(maxlen=10) + avg = 0 + while 1: + polld = poller.poll(1000) + for sock in polld: + msg = sock.receive() + with log.Event.from_bytes(msg) as log_evt: + evt = log_evt + + for item in evt.can: + if item.address == 0xe4 and item.src == 128: + torque_req = struct.unpack('!h', item.dat[0:2])[0] + # print(torque_req) + active = abs(torque_req) > 0 + if abs(torque_req) < 100: + if max_v > 5: + print(f'{start_v} -> {max_v} = {round(max_v - start_v, 2)} over {round(max_t - start_t, 2)}s') + start_t = evt.logMonoTime / 1e9 + start_v = avg + max_t = 0 + max_v = 0 + if item.address == 0x1ab and item.src == 0: + motor_torque = ((item.dat[0] & 0x3) << 8) + item.dat[1] + window.append(motor_torque) + avg = mean(window) + #print(f'{evt.logMonoTime}: {avg}') + if active and avg > max_v + 0.5: + max_v = avg + max_t = evt.logMonoTime / 1e9 diff --git a/iqpilot/tools/iqperf/qlog_size.py b/iqpilot/tools/iqperf/qlog_size.py new file mode 100755 index 000000000..dc614c8d5 --- /dev/null +++ b/iqpilot/tools/iqperf/qlog_size.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +import argparse +import zstandard as zstd +from collections import defaultdict + +import matplotlib.pyplot as plt + +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.utils import LOG_COMPRESSION_LEVEL +from iqpilot.tools.lib.logreader import LogReader +from tqdm import tqdm + +MIN_SIZE = 0.5 # Percent size of total to show as separate entry + + +def make_pie(msgs, typ): + msgs_by_type = defaultdict(list) + for m in msgs: + msgs_by_type[m.which()].append(m.as_builder().to_bytes()) + + total = len(zstd.compress(b"".join([m.as_builder().to_bytes() for m in msgs]), LOG_COMPRESSION_LEVEL)) + uncompressed_total = len(b"".join([m.as_builder().to_bytes() for m in msgs])) + + length_by_type = {k: len(b"".join(v)) for k, v in msgs_by_type.items()} + # calculate compressed size by calculating diff when removed from the segment + compressed_length_by_type = {} + for k in tqdm(msgs_by_type.keys(), desc="Compressing"): + compressed_length_by_type[k] = total - len(zstd.compress(b"".join([m.as_builder().to_bytes() for m in msgs if m.which() != k]), LOG_COMPRESSION_LEVEL)) + + sizes = sorted(compressed_length_by_type.items(), key=lambda kv: kv[1]) + + print("name - comp. size (uncomp. size)") + for (name, sz) in sizes: + print(f"{name:<22} - {sz / 1024:.2f} kB ({length_by_type[name] / 1024:.2f} kB)") + print() + print(f"{typ} - Real total {total / 1024:.2f} kB") + print(f"{typ} - Breakdown total {sum(compressed_length_by_type.values()) / 1024:.2f} kB") + print(f"{typ} - Uncompressed total {uncompressed_total / 1024 / 1024:.2f} MB") + + sizes_large = [(k, sz) for (k, sz) in sizes if sz >= total * MIN_SIZE / 100] + sizes_large += [('other', sum(sz for (_, sz) in sizes if sz < total * MIN_SIZE / 100))] + + labels, sizes = zip(*sizes_large, strict=True) + + plt.figure() + plt.title(f"{typ}") + plt.pie(sizes, labels=labels, autopct='%1.1f%%') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='View log size breakdown by message type') + parser.add_argument('route', help='route to use') + parser.add_argument('--as-qlog', action='store_true', help='decimate rlog using latest decimation factors') + args = parser.parse_args() + + msgs = list(LogReader(args.route)) + + if args.as_qlog: + new_msgs = [] + msg_cnts: dict[str, int] = defaultdict(int) + for msg in msgs: + msg_which = msg.which() + if msg.which() in ("initData", "sentinel"): + new_msgs.append(msg) + continue + + if msg_which not in SERVICE_LIST: + continue + + decimation = SERVICE_LIST[msg_which].decimation + if decimation is not None and msg_cnts[msg_which] % decimation == 0: + new_msgs.append(msg) + msg_cnts[msg_which] += 1 + + msgs = new_msgs + + make_pie(msgs, 'qlog') + plt.show() diff --git a/iqpilot/tools/iqperf/sendcan_gap_audit.py b/iqpilot/tools/iqperf/sendcan_gap_audit.py new file mode 100755 index 000000000..c0a452735 --- /dev/null +++ b/iqpilot/tools/iqperf/sendcan_gap_audit.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +""" +sendcan_gap_audit.py — measure the openpilot->car actuator TX cadence from an rlog. + +WHY: VW PQ random long/lat disengages are caused by control-loop STALLS that +freeze the `sendcan` publish for >100ms. The car's ECU runs a counter/checksum +watchdog on the actuator messages (ACC_System ADR, HCA_1) and FAULTS when frames +arrive late/missing — it does NOT care about the payload value. So the single +metric that predicts the fault is the inter-frame GAP in sendcan, not anything +about accel/torque. (Reference: route 20e3cd4f0d5f39d1|00000038--0f69286335 had a +103ms gap at ~373s -> engine MO2_Sta_GRA->0 -> main switch off -> disengage. A +separate 60ms gap did NOT disengage: the ECU timeout sits ~60-100ms.) + +This is the pass/fail metric for the mlockall / loggerd-writeback fix (5324c46) +and, later, the decoupled in-card heartbeat TX. Run it on a BASELINE route to see +the offending gaps, then on POST-FIX drives to confirm they're gone. + + python3 iqpilot/tools/iqperf/sendcan_gap_audit.py [--warn-ms 30] [--fault-ms 100] + +Exit code 0 if no gap >= --fault-ms, else 1 (so it can gate CI / a smoke test). +Read-only; pulls rlogs via the normal LogReader (konn3kt for IQ.Pilot routes). +""" + +import argparse +import sys + +from iqpilot.tools.lib.logreader import LogReader + + +def audit(route: str, warn_ms: float, fault_ms: float) -> int: + lr = LogReader(route, sort_by_time=True) + + last = None + gaps = [] # (t_end, dt_ms) for every gap >= warn_ms + n = 0 + worst = 0.0 + for m in lr: + if m.which() != "sendcan": + continue + t = m.logMonoTime / 1e9 + n += 1 + if last is not None: + dt = (t - last) * 1000.0 + worst = max(worst, dt) + if dt >= warn_ms: + gaps.append((t, dt)) + last = t + + faults = [(t, dt) for t, dt in gaps if dt >= fault_ms] + + print(f"route : {route}") + print(f"sendcan frames : {n}") + print(f"worst gap : {worst:.1f} ms") + print(f"gaps >= {warn_ms:.0f}ms : {len(gaps)}") + print(f"gaps >= {fault_ms:.0f}ms (FAULT-RISK): {len(faults)}") + if gaps: + print("\n t(s) gap(ms) risk") + for t, dt in gaps: + print(f" {t:10.3f} {dt:7.1f} {'<-- FAULT RISK' if dt >= fault_ms else ''}") + + if faults: + print(f"\nFAIL: {len(faults)} gap(s) >= {fault_ms:.0f}ms can trip the car's actuator counter watchdog (late/missing frames).") + return 1 + print(f"\nPASS: no sendcan gap >= {fault_ms:.0f}ms.") + return 0 + + +def main() -> int: + p = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + p.add_argument("route", help="route name, segment, or URL (e.g. dongle|time--hash or .../5:8)") + p.add_argument("--warn-ms", type=float, default=30.0, help="list gaps >= this (default 30)") + p.add_argument("--fault-ms", type=float, default=100.0, help="fail on gaps >= this (default 100)") + args = p.parse_args() + return audit(args.route, args.warn_ms, args.fault_ms) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/iqpilot/tools/iqpilot/console_pretty.py b/iqpilot/tools/iqpilot/console_pretty.py new file mode 100644 index 000000000..c90830339 --- /dev/null +++ b/iqpilot/tools/iqpilot/console_pretty.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +# console path for the boot/manager tmux: must never die or block; on any error, forward raw. +import os +import re +import signal +import sys + +try: + signal.signal(signal.SIGPIPE, signal.SIG_IGN) +except Exception: + pass + +_COLOR = sys.stdout.isatty() and os.environ.get("NO_COLOR") is None + +_DROP = re.compile( + r"(\x1b\[\?\d+[a-z])" + r"|^Last login:" + r"|gbm_create_device\(\d+\): Info:" + r"|^pid \d+'s (current|new) affinity list:" + r"|kj/filesystem-disk-unix\.c\+\+:\d+: warning: PWD" +) +_CLOUDLOG = re.compile(r"^([\w./+-]+\.(?:cc|cpp|c|h|py)): (.*)$") +_ALREADY = re.compile(r"^\s*(?:\x1b\[[0-9;]*m)?\s*(CRIT|ERR|WARN|info|dbg)\b") +_ERRISH = re.compile(r"not supported|fail|error|invalid|cannot|timed out|timeout|unable", re.I) + + +def _sev(msg): + return ("\033[1;38;5;203m", " ERR", "\033[1;38;5;210m") if _ERRISH.search(msg) \ + else ("\033[38;5;110m", "info", "") + + +def _restyle(line): + if _DROP.search(line): + return None + if _ALREADY.match(line): + return line + m = _CLOUDLOG.match(re.sub(r"\x1b\[[0-9;]*m", "", line)) + if m and _COLOR: + src, msg = m.group(1), m.group(2) + lc, ln, mc = _sev(msg) + body = f"{mc}{msg}\033[0m" if mc else msg + return f"{lc}{ln}\033[0m \033[2m{src}\033[0m {body}" + return line + + +def _emit(out, buf): + styled = _restyle(buf) + if styled is not None: + out.write(styled + "\r\n"); out.flush() + + +def main(): + out = sys.stdout + buf = "" + pending_cr = False + read = sys.stdin.buffer.read + while True: + try: + ch = read(1) + except Exception: + break + if not ch: + break + try: + c = ch.decode("utf-8", "replace") + if pending_cr: + pending_cr = False + if c == "\n": + _emit(out, buf); buf = ""; continue + out.write(buf + "\r"); out.flush(); buf = "" # bare \r: progress + if c == "\r": + pending_cr = True + elif c == "\n": + _emit(out, buf); buf = "" + else: + buf += c + except Exception: + try: + out.write(buf); out.flush() + except Exception: + pass + buf = ""; pending_cr = False + if pending_cr: + out.write(buf + "\r"); out.flush() + elif buf: + try: + styled = _restyle(buf) + if styled is not None: + out.write(styled); out.flush() + except Exception: + pass + + +if __name__ == "__main__": + try: + main() + except Exception: + try: + import shutil + shutil.copyfileobj(sys.stdin.buffer, sys.stdout.buffer) + except Exception: + pass diff --git a/iqpilot/tools/iqpilot/git-pretty.sh b/iqpilot/tools/iqpilot/git-pretty.sh new file mode 100644 index 000000000..f883b16c5 --- /dev/null +++ b/iqpilot/tools/iqpilot/git-pretty.sh @@ -0,0 +1,32 @@ +# IQ.Pilot pretty git wrappers (gpull/gfetch/gsync/greset/gbv). bash + zsh. +# Source from your shell rc: source .../tools/iqpilot/git-pretty.sh +if [ -n "${BASH_SOURCE:-}" ]; then + _iq_gp_src="${BASH_SOURCE[0]}" +elif [ -n "${ZSH_VERSION:-}" ]; then + _iq_gp_src="${(%):-%x}" +else + _iq_gp_src="$0" +fi +_IQ_GIT_PRETTY="$(cd "$(dirname "$_iq_gp_src")" 2>/dev/null && pwd)/git_pretty.py" +unset _iq_gp_src + +if [ -z "${_IQ_GP_PY:-}" ]; then + if command -v python3 >/dev/null 2>&1; then _IQ_GP_PY=python3 + elif [ -x /usr/bin/python3 ]; then _IQ_GP_PY=/usr/bin/python3 + else _IQ_GP_PY=python; fi +fi + +_iq_git_pretty() { + command git "$@" 2>&1 | "$_IQ_GP_PY" "$_IQ_GIT_PRETTY" + if [ -n "${ZSH_VERSION:-}" ]; then + return ${pipestatus[1]} + else + return ${PIPESTATUS[0]} + fi +} + +gpull() { _iq_git_pretty -c color.ui=always pull --progress "$@"; } +gfetch() { _iq_git_pretty -c color.ui=always fetch --progress "$@"; } +gsync() { _iq_git_pretty -c color.ui=always submodule update --init --recursive --progress "$@"; } +greset() { _iq_git_pretty -c color.ui=always reset "$@"; } +gbv() { _iq_git_pretty -c color.branch=always branch -v "$@"; } diff --git a/iqpilot/tools/iqpilot/git_pretty.py b/iqpilot/tools/iqpilot/git_pretty.py new file mode 100644 index 000000000..b576da32e --- /dev/null +++ b/iqpilot/tools/iqpilot/git_pretty.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +import os +import re +import sys + +_GRAD = { + "PULL": ((95, 240, 150), (40, 200, 120)), + "FETCH": ((95, 205, 255), (130, 110, 250)), + "SUBMOD": ((200, 160, 255), (150, 110, 250)), + "RESET": ((255, 190, 90), (230, 80, 70)), + "BRANCH": ((95, 215, 255), (70, 130, 245)), +} +_TARGET_RGB = (150, 152, 178) +_GREEN = (120, 210, 130) +_DIM = "\033[2;38;5;246m" +_RST = "\033[0m" + + +def _mode(): + if not sys.stdout.isatty() or os.environ.get("NO_COLOR"): + return None + return "true" if os.environ.get("COLORTERM", "").lower() in ("truecolor", "24bit") else "256" + + +def _fg(rgb, mode): + r, g, b = rgb + if mode == "true": + return f"\033[38;2;{r};{g};{b}m" + if abs(r - g) < 12 and abs(g - b) < 12 and abs(r - b) < 12: + idx = 232 + min(23, round((r + g + b) / 3 / 255 * 23)) + else: + idx = 16 + 36 * round(r / 255 * 5) + 6 * round(g / 255 * 5) + round(b / 255 * 5) + return f"\033[38;5;{idx}m" + + +def _grad(word, label, mode): + start, end = _GRAD.get(label, _GRAD["FETCH"]) + n = max(1, len(word) - 1) + out = [f"\033[1m{_fg(tuple(int(s + (e - s) * i / n) for s, e in zip(start, end)), mode)}{ch}" + for i, ch in enumerate(word)] + return "".join(out) + _RST + + +def _label(label, body, mode): + pad = " " * max(0, 8 - len(label)) + return f"{pad}{_grad(label, label, mode)} {_fg(_TARGET_RGB, mode)}{body}{_RST}" + + +def _restyle(line, mode): + s = line.rstrip("\n") + raw = re.sub(r"\033\[[0-9;]*m", "", s) # match against de-colored text + + if raw == "Already up to date.": + return f"{_fg(_GREEN, mode)}✓ already up to date{_RST}" + m = re.match(r"Updating ([0-9a-f]+\.\.[0-9a-f]+)$", raw) + if m: + return _label("PULL", m.group(1), mode) + if raw == "Fast-forward": + return f"{_DIM}fast-forward{_RST}" + m = re.match(r"HEAD is now at ([0-9a-f]+) (.*)$", raw) + if m: + return _label("RESET", f"{m.group(1)} {m.group(2)}", mode) + m = re.match(r"Submodule path '(.+)': checked out '([0-9a-f]+)'$", raw) + if m: + return _label("SUBMOD", f"{m.group(1)} @ {m.group(2)[:9]}", mode) + m = re.match(r"Submodule '(.+)' \((.+)\) registered for path '(.+)'$", raw) + if m: + return _label("SUBMOD", f"{m.group(3)} (registered)", mode) + m = re.match(r"From (.+)$", raw) + if m: + return _label("FETCH", m.group(1), mode) + m = re.match(r"\s*\*?\s*\[new (?:branch|tag)\]\s+(\S+)\s+->\s+(\S+)$", raw) + if m: + return _label("FETCH", f"new {m.group(1)} → {m.group(2)}", mode) + m = re.match(r"\s*\*\s+(?:branch|tag)\s+(\S+)\s+->\s+(\S+)$", raw) + if m: + return _label("FETCH", f"{m.group(1)} → {m.group(2)}", mode) + m = re.match(r"\s*([0-9a-f]+\.\.[0-9a-f]+)\s+(\S+)\s+->\s+(\S+)$", raw) + if m: + return _label("FETCH", f"{m.group(1)} {m.group(2)} → {m.group(3)}", mode) + m = re.match(r"([* ]) +(\S+) +([0-9a-f]{7,})( .*)?$", raw) + if m: + cur, name, sha, msg = m.groups() + star = f"{_fg(_GREEN, mode)}●{_RST} " if cur == "*" else " " + return f"{star}{_grad(name, 'BRANCH', mode)} {_fg(_TARGET_RGB, mode)}{sha}{(msg or '')}{_RST}" + return s + + +def main(): + mode = _mode() + out = sys.stdout + if mode is None: # not a tty / NO_COLOR: passthrough + for chunk in iter(lambda: sys.stdin.buffer.read(4096), b""): + out.buffer.write(chunk) + out.buffer.flush() + return + + buf = "" + stream = sys.stdin + while True: + ch = stream.read(1) + if not ch: + break + if ch == "\r": # progress fragment: emit live, untouched + out.write(buf + "\r") + out.flush() + buf = "" + elif ch == "\n": + out.write(_restyle(buf, mode) + "\n") + out.flush() + buf = "" + else: + buf += ch + if buf: + out.write(_restyle(buf, mode)) + out.flush() + + +if __name__ == "__main__": + try: + main() + except (BrokenPipeError, KeyboardInterrupt): + pass diff --git a/iqpilot/tools/iqpilot/mici_preview.py b/iqpilot/tools/iqpilot/mici_preview.py new file mode 100755 index 000000000..ab47e1bbe --- /dev/null +++ b/iqpilot/tools/iqpilot/mici_preview.py @@ -0,0 +1,775 @@ +#!/usr/bin/env python3 +""" +╔══════════════════════════════════════════════════════════════════════════╗ +║ IQ.Pilot MICI UI Preview Tool ║ +║ ────────────────────────────────────────────────────────────────────── ║ +║ Renders any MICI layout/widget at 536×240 on your Mac desktop so you ║ +║ can visually inspect and iterate without a physical comma 4. ║ +║ ║ +║ MODES ║ +║ screenshot — render N frames, save PNG(s), open in Preview ║ +║ video — render N seconds to MP4 via ffmpeg, open in QuickTime ║ +║ live — interactive window, hot-reload on file-save ║ +║ ║ +║ USAGE ║ +║ python tools/iqpilot/mici_preview.py [OPTIONS] ║ +║ ║ +║ OPTIONS ║ +║ --panel PANEL Panel to render: steering, visuals, display, ║ +║ software, cruise, trips, osm, models, toggles, ║ +║ device, developer, home, settings (default: steering)║ +║ --mode MODE screenshot | video | live (default: screenshot) ║ +║ --frames N Frames to settle before screenshot (default: 90) ║ +║ --shots N Number of screenshots to take (default: 1) ║ +║ --duration S Video duration in seconds (default: 4) ║ +║ --fps N Render FPS (default: 60) ║ +║ --scale F Window scale multiplier (2.0 = 1072×480 window) ║ +║ (default: 2.5) ║ +║ --out PATH Output file/dir (default: /tmp/mici_preview/) ║ +║ --open Open output file(s) after capture (default: True) ║ +║ --mock Use mock UI state (no real params needed) ║ +║ ║ +║ EXAMPLES ║ +║ # Screenshot the steering panel (scaled 2.5×, opens in Preview) ║ +║ python tools/iqpilot/mici_preview.py --panel steering ║ +║ ║ +║ # 4-second video of the neon glow animation ║ +║ python tools/iqpilot/mici_preview.py --panel steering --mode video ║ +║ ║ +║ # Live interactive window with hot-reload ║ +║ python tools/iqpilot/mici_preview.py --panel visuals --mode live ║ +║ ║ +║ # Multiple panels in one go (screenshots) ║ +║ python tools/iqpilot/mici_preview.py --panel all ║ +╚══════════════════════════════════════════════════════════════════════════╝ +""" + +import argparse +import importlib +import os +import subprocess +import sys +import time +import queue +import threading +from pathlib import Path + +# ── Project root on sys.path ────────────────────────────────────────────── +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT)) + +# Force MICI mode (no BIG UI) +os.environ.setdefault("BIG", "0") +os.environ.setdefault("IQPILOT_UI", "1") +# Use offscreen mode for screenshot/video (no FPS cap → fast capture) +# Live mode overrides this below. + +import pyray as rl # noqa: E402 — must come after env setup + +# ── MICI canvas dimensions ───────────────────────────────────────────────── +MICI_W = 536 +MICI_H = 240 + +# ── Output directory ─────────────────────────────────────────────────────── +DEFAULT_OUT = Path("/tmp/mici_preview") + +# ── Color palette for the preview chrome ────────────────────────────────── +CHROME_BG = rl.Color(18, 18, 22, 255) # dark bg behind the MICI canvas +LABEL_COLOR = rl.Color(160, 160, 160, 200) # panel label text + +# ── All available panels ─────────────────────────────────────────────────── +ALL_PANELS = [ + "steering", "visuals", "display", "software", "cruise", + "trips", "osm", "models", "toggles", "device", "developer", "home", +] + + +# ───────────────────────────────────────────────────────────────────────────── +# Mock UI state so we can run without a live comma process +# ───────────────────────────────────────────────────────────────────────────── + +def _patch_mock_state(): + """Replace real ui_state and Params with lightweight mocks.""" + import types + + # ── Shared in-memory store ──────────────────────────────────────────────── + _store: dict = {} + + class MockParams: + """ + Drop-in Params mock that also supports `Params | None` type expressions + at module import time by implementing __or__ / __ror__ on the class itself. + """ + # Allow `Params | None` as a runtime type-union expression + def __class_getitem__(cls, item): + return cls + def __or__(cls, other): + import types as _t + return _t.UnionType if hasattr(_t, 'UnionType') else object + __ror__ = __or__ + + def __init__(self, _=None, **__): + pass # ignore any constructor args (real Params accepts path kwarg) + + def get(self, key, default=None, return_default=False): + val = _store.get(key, default) + # Real Params.get() returns str or None; convert bools → str + if isinstance(val, bool): + return str(int(val)) + return val + + def get_bool(self, key, default=False): + val = _store.get(key, default) + if isinstance(val, str): + return val not in ('', '0', 'false', 'False', 'None') + return bool(val) + + def put(self, key, val): + _store[key] = val + + def put_bool(self, key, val): + _store[key] = bool(val) + + def put_nonblocking(self, key, val): + _store[key] = val + + # Seed some sensible defaults so widgets render realistically + mp = MockParams() + # ── Steering ──────────────────────────────────────────────────────────── + mp.put("AolEnabled", False) + mp.put("AolSteeringMode", 0) # 0=remain active, 1=pause, 2=disengage + mp.put("AolMainCruiseAllowed", True) + mp.put("AolUnifiedEngagementMode", False) + mp.put("AolPauseOnSteeringOverride", False) + mp.put("NeuralNetworkFeedForward", False) + mp.put("IQLaneChangeTimer", 0) # nudge + mp.put("IQLaneChangeBsmDelay", False) + mp.put("IQEdgeGuard", False) + + # ── Visuals (correct param keys matching visuals.py) ───────────────────── + mp.put("IQBlindSpotAlerts", True) + mp.put("IQSteerEffortArc", True) + mp.put("IQRoadNameOverlay", True) + mp.put("IQBlinkerIndicators", True) + mp.put("IQAccelMeter", False) + mp.put("IQLeadReadouts", 0) # 0=off + mp.put("IQDevUIInfo", 0) # 0=off + mp.put("AlphaLongitudinalEnabled", False) # real param; gates ChevronInfo + + # ── Display ─────────────────────────────────────────────────────────────── + mp.put("OnroadScreenOffBrightness", 0) # 0=auto + mp.put("OnroadScreenOffTimer", 60) # 1m + mp.put("InteractivityTimeout", 0) # default + + # ── Software ────────────────────────────────────────────────────────────── + mp.put("DisableUpdates", False) + mp.put("GitBranch", "master-mici") + mp.put("Version", "IQ.Pilot 0.9.5-mici") + + # ── Models ──────────────────────────────────────────────────────────────── + mp.put("IQLiveSteerDelay", False) + mp.put("IQLaneTurnDesire", False) + mp.put("IQLaneTurnValue", "19.0") + + # ── Cruise ──────────────────────────────────────────────────────────────── + mp.put("ExperimentalMode", False) + mp.put("IQDynamicMode", False) + mp.put("LongitudinalPersonality", 1) + mp.put("IQSpeedAssistMode", 0) # 0=off + + # ── Misc / system ───────────────────────────────────────────────────────── + mp.put("IsMetric", False) + mp.put("UIAccentColor", "#00FFF5") # default neon cyan + + # Inject mock into common.params + # IMPORTANT: inject the CLASS (not an instance) so that `Params | None` + # type-union expressions in downstream modules work at import time. + mock_module = types.ModuleType("iqpilot.common.params") + mock_module.Params = MockParams + sys.modules["iqpilot.common.params"] = mock_module + + # ── Mock ui_state (both the iqpilot layer and the top-level selfdrive layer) ─ + class MockCP: + enableBsm = True + openpilotLongitudinalControl = True + alphaLongitudinalAvailable = False + + # Minimal mock for ui_state.sm — returns empty/default objects for any key + class _MockBundle: + internalName = "mock-model" + displayName = "Mock Model" + index = 0 + status = None # not downloading + models = [] + overrides = [] + + class _MockModelManager: + availableBundles = [] + activeBundle = _MockBundle() + selectedBundle = None # None = not downloading + + from iqpilot.cereal import log as _log + class _MockDeviceState: + networkType = _log.DeviceState.NetworkType.wifi + networkStrength = type("NS", (), {"raw": 3})() + egpuDockPresent = True + started = False + freeSpacePercent = 50.0 + memoryUsagePercent = 40 + + class _MockSM: + """Minimal SubMaster-like dict that returns sensible defaults.""" + _data = { + "iqModelManager": _MockModelManager(), + "deviceState": _MockDeviceState(), + } + def __getitem__(self, key): + return self._data.get(key, type("Empty", (), {"enabled": False})()) + @property + def updated(self): + return type("U", (), {"__getitem__": lambda s, k: False})() + @property + def alive(self): + return type("A", (), {"__getitem__": lambda s, k: True})() + @property + def valid(self): + return type("V", (), {"__getitem__": lambda s, k: True})() + @property + def frame(self): return 0 + def __contains__(self, key): return True + + class MockUIState: + CP = MockCP() + params = mp + sm = _MockSM() + started = False + ignition = False + is_metric = False + has_longitudinal_control = True + always_on_dm = False + recording_audio = False + personality = 1 # standard + custom_interactive_timeout = 0 + light_sensor = -1.0 + is_release = False + # IQ-specific extras + aol_enabled = False + aol_state = 0 + + def is_offroad(self): return True + def is_onroad(self): return False + def add_offroad_transition_callback(self, cb): pass + def add_engaged_transition_callback(self, cb): pass + def update_params(self): pass + + @property + def engaged(self): return False + + _mock_ui_state = MockUIState() + + # iqpilot.selfdrive.ui.ui_state (base openpilot layer — hosts the IQ UI state classes/enums) + from enum import Enum, IntEnum + class _UIStatus(Enum): + DISENGAGED = "disengaged" + ENGAGED = "engaged" + OVERRIDE = "override" + LAT_ONLY = "lat_only" + LONG_ONLY = "long_only" + + class _OnroadTimerStatus(Enum): + NONE = 0 + PAUSE = 1 + RESUME = 2 + + class _OnroadBrightness(IntEnum): + AUTO = 0 + AUTO_DARK = 1 + + mock_base_ui_mod = types.ModuleType("iqpilot.selfdrive.ui.ui_state") + mock_base_ui_mod.ui_state = _mock_ui_state + mock_base_ui_mod.UIStatus = _UIStatus + mock_base_ui_mod.OnroadTimerStatus = _OnroadTimerStatus + mock_base_ui_mod.OnroadBrightness = _OnroadBrightness + mock_base_ui_mod.device = type("MockDevice", (), {"awake": True})() + sys.modules["iqpilot.selfdrive.ui.ui_state"] = mock_base_ui_mod + + return mp + + +# ───────────────────────────────────────────────────────────────────────────── +# Panel loader +# ───────────────────────────────────────────────────────────────────────────── + +def load_panel(name: str): + """ + Instantiate a MICI panel/layout by name. + Returns a Widget instance with set_rect() already called. + """ + rect = rl.Rectangle(0, 0, MICI_W, MICI_H) + + layouts = { + "steering": ("iqpilot.ui.mici.layouts.steering", "SteeringLayoutMici"), + "visuals": ("iqpilot.ui.mici.layouts.visuals", "VisualsLayoutMici"), + "display": ("iqpilot.ui.mici.layouts.display", "DisplayLayoutMici"), + "software": ("iqpilot.ui.mici.layouts.software", "SoftwareLayoutMici"), + "cruise": ("iqpilot.ui.mici.layouts.cruise", "CruiseLayoutMici"), + "trips": ("iqpilot.ui.mici.layouts.trips", "TripsLayoutMici"), + "osm": ("iqpilot.ui.mici.layouts.osm", "OSMLayoutMici"), + "models": ("iqpilot.ui.mici.layouts.models", "ModelsLayoutMici"), + "toggles": ("iqpilot.selfdrive.ui.mici.layouts.settings.toggles", "TogglesLayoutMici"), + "device": ("iqpilot.selfdrive.ui.mici.layouts.settings.device", "DeviceLayoutMici"), + "developer":("iqpilot.selfdrive.ui.mici.layouts.settings.developer","DeveloperLayoutMici"), + "home": ("iqpilot.selfdrive.ui.mici.layouts.home", "MiciHomeLayout"), + "settings": ("iqpilot.ui.mici.layouts.settings", "IQMiciSettingsLayout"), + } + + if name not in layouts: + raise ValueError(f"Unknown panel '{name}'. Choose from: {', '.join(layouts)}") + + # All IQ.Pilot MICI layout panels accept an optional back_callback + NEEDS_BACK_CB = { + "steering", "visuals", "display", "software", "cruise", + "trips", "osm", "models", "toggles", "device", "developer", + } + + mod_path, cls_name = layouts[name] + mod = importlib.import_module(mod_path) + cls = getattr(mod, cls_name) + if name in NEEDS_BACK_CB: + widget = cls(back_callback=lambda: None) + else: + widget = cls() + widget.set_rect(rect) + widget.show_event() + + eg = os.environ.get("IQ_EGPU_STATE") + mc = os.environ.get("IQ_MAC_STATE") + if (eg or mc) and hasattr(widget, "_egpu_state"): + widget._egpu_state = eg or None + widget._mac_state = mc or None + widget._egpu_progress = float(os.environ.get("IQ_EGPU_PROGRESS", "0") or 0) + widget._mac_progress = float(os.environ.get("IQ_MAC_PROGRESS", "0") or 0) + widget._update_dock_status = lambda: None + + return widget + + +# ───────────────────────────────────────────────────────────────────────────── +# Rendering helpers +# ───────────────────────────────────────────────────────────────────────────── + +def _draw_chrome(panel_name: str, scale: float, canvas_x: int, canvas_y: int): + """Draw the preview window chrome: background, label, dimension hint.""" + # Nothing to draw outside the canvas — the window IS the canvas (+ padding) + pass + + +def _render_frame(widget, render_tex: rl.RenderTexture, canvas_x: int, canvas_y: int, scale: float, panel_name: str): + """ + Render one frame: + 1. Draw the MICI widget into render_tex (536×240 offscreen) + 2. Blit the texture into the window at the correct position + scale + 3. Draw chrome overlays (panel label, grid, etc.) + """ + # Draw into the MICI-sized render texture + rl.begin_texture_mode(render_tex) + rl.clear_background(rl.Color(0, 0, 0, 255)) + widget.render(rl.Rectangle(0, 0, MICI_W, MICI_H)) + rl.end_texture_mode() + + # Blit to screen (flip Y because OpenGL textures are upside-down) + src = rl.Rectangle(0, 0, MICI_W, -MICI_H) # negative H = flip + dst = rl.Rectangle(canvas_x, canvas_y, MICI_W * scale, MICI_H * scale) + rl.draw_texture_pro(render_tex.texture, src, dst, rl.Vector2(0, 0), 0, rl.WHITE) + + # Panel name label bottom-left + rl.draw_text(panel_name.upper(), canvas_x + 6, canvas_y + int(MICI_H * scale) + 6, + 14, rl.Color(120, 120, 120, 180)) + + # Dimension hint bottom-right + hint = f"{MICI_W}×{MICI_H} (×{scale:.1f})" + hint_w = rl.measure_text(hint, 12) + win_w = rl.get_screen_width() + rl.draw_text(hint, win_w - hint_w - 8, canvas_y + int(MICI_H * scale) + 6, + 12, rl.Color(80, 80, 80, 160)) + + +# ───────────────────────────────────────────────────────────────────────────── +# Screenshot mode +# ───────────────────────────────────────────────────────────────────────────── + +def run_screenshot(panel_name: str, args, out_dir: Path) -> list[Path]: + """ + Render `args.frames` frames (so animations settle), then take `args.shots` + screenshots 0.5s apart. Returns list of saved PNG paths. + + Uses gui_app.init_window() so fonts are loaded correctly, and the SCALE + env var (set to args.scale in main()) controls window size. + """ + from iqpilot.system.ui.lib.application import gui_app + + gui_app.init_window(f"MICI Preview — {panel_name}", fps=args.fps) + + # Offscreen MICI-resolution render texture + render_tex = rl.load_render_texture(MICI_W, MICI_H) + + # Load widget AFTER window/fonts are initialized + widget = load_panel(panel_name) + + saved: list[Path] = [] + frame = 0 + shots_taken = 0 + next_shot_frame = args.frames # first shot after settle + + # Display at native scaled window coords (0,0 → screen size) + win_w = rl.get_screen_width() + win_h = rl.get_screen_height() + + while not rl.window_should_close() and shots_taken < args.shots: + rl.begin_drawing() + rl.clear_background(CHROME_BG) + + # Render widget into the MICI-sized texture, then blit full-window + rl.begin_texture_mode(render_tex) + rl.clear_background(rl.BLACK) + widget.render(rl.Rectangle(0, 0, MICI_W, MICI_H)) + rl.end_texture_mode() + + # Blit the render texture to fill the whole window (Y-flipped) + src = rl.Rectangle(0, 0, MICI_W, -MICI_H) + dst = rl.Rectangle(0, 0, win_w, win_h) + rl.draw_texture_pro(render_tex.texture, src, dst, rl.Vector2(0, 0), 0, rl.WHITE) + + # Settle progress bar + if frame < args.frames: + pct = frame / args.frames + rl.draw_rectangle(0, win_h - 3, int(win_w * pct), 3, rl.Color(0, 255, 245, 140)) + rl.draw_text(f"settling {frame}/{args.frames}", 6, 6, 11, rl.Color(100, 100, 100, 160)) + + rl.end_drawing() + frame += 1 + + if frame == next_shot_frame: + # Read from render texture (native MICI res, no padding to crop) + img = rl.load_image_from_texture(render_tex.texture) + rl.image_flip_vertical(img) + # Save at 2× native for clarity on Retina displays + rl.image_resize(img, MICI_W * 2, MICI_H * 2) + out_dir.mkdir(parents=True, exist_ok=True) + ts = int(time.time() * 1000) + path = out_dir / f"mici_{panel_name}_{shots_taken + 1:02d}_{ts}.png" + rl.export_image(img, str(path)) + rl.unload_image(img) + saved.append(path) + print(f" 📸 saved: {path}") + shots_taken += 1 + next_shot_frame += int(args.fps * 0.5) # 0.5s between shots + + rl.unload_render_texture(render_tex) + rl.close_window() + return saved + + +# ───────────────────────────────────────────────────────────────────────────── +# Video mode +# ───────────────────────────────────────────────────────────────────────────── + +def run_video(panel_name: str, args, out_dir: Path) -> Path: + """ + Render args.duration seconds at args.fps, pipe raw RGBA frames to ffmpeg → MP4. + Returns the output MP4 path. + """ + from iqpilot.system.ui.lib.application import gui_app + + out_dir.mkdir(parents=True, exist_ok=True) + ts = int(time.time()) + mp4_path = out_dir / f"mici_{panel_name}_{ts}.mp4" + + # Launch ffmpeg to accept raw RGBA frames at MICI native resolution + ffmpeg = subprocess.Popen([ + "ffmpeg", "-v", "warning", "-nostats", + "-f", "rawvideo", "-pix_fmt", "rgba", + "-s", f"{MICI_W}x{MICI_H}", + "-r", str(args.fps), + "-i", "pipe:0", + "-vf", "vflip,format=yuv420p", + "-c:v", "libx264", "-preset", "fast", "-crf", "18", + "-y", str(mp4_path), + ], stdin=subprocess.PIPE) + + # Write-queue so rendering doesn't block on ffmpeg + frame_queue: queue.Queue = queue.Queue(maxsize=args.fps * 2) + stop_event = threading.Event() + + def _writer(): + while not stop_event.is_set() or not frame_queue.empty(): + try: + data = frame_queue.get(timeout=0.1) + ffmpeg.stdin.write(data) + except queue.Empty: + pass + ffmpeg.stdin.close() + + writer_thread = threading.Thread(target=_writer, daemon=True) + writer_thread.start() + + gui_app.init_window(f"MICI Preview (recording) — {panel_name}", fps=args.fps) + render_tex = rl.load_render_texture(MICI_W, MICI_H) + widget = load_panel(panel_name) + + win_w = rl.get_screen_width() + win_h = rl.get_screen_height() + total_frames = int(args.fps * args.duration) + frame = 0 + settle = min(args.frames, total_frames // 4) + + print(f" đŸŽŦ recording {args.duration}s at {args.fps}fps → {mp4_path.name}") + + while not rl.window_should_close() and frame < total_frames: + rl.begin_drawing() + rl.clear_background(CHROME_BG) + + rl.begin_texture_mode(render_tex) + rl.clear_background(rl.BLACK) + widget.render(rl.Rectangle(0, 0, MICI_W, MICI_H)) + rl.end_texture_mode() + + src = rl.Rectangle(0, 0, MICI_W, -MICI_H) + dst = rl.Rectangle(0, 0, win_w, win_h) + rl.draw_texture_pro(render_tex.texture, src, dst, rl.Vector2(0, 0), 0, rl.WHITE) + + # REC progress bar + pct = frame / total_frames + rl.draw_rectangle(0, win_h - 3, int(win_w * pct), 3, rl.Color(255, 80, 80, 180)) + rl.draw_text(f"REC {frame}/{total_frames}", 6, 6, 11, rl.Color(255, 80, 80, 200)) + + rl.end_drawing() + + # Queue raw RGBA from MICI-res texture for ffmpeg + if frame >= settle: + import ctypes + img = rl.load_image_from_texture(render_tex.texture) + colors = rl.load_image_colors(img) + raw = bytes(ctypes.string_at(colors, MICI_W * MICI_H * 4)) + rl.unload_image_colors(colors) + rl.unload_image(img) + try: + frame_queue.put(raw, timeout=1.0) + except queue.Full: + pass + + frame += 1 + + rl.unload_render_texture(render_tex) + rl.close_window() + + stop_event.set() + writer_thread.join(timeout=10) + ffmpeg.wait(timeout=15) + + print(f" ✅ video saved: {mp4_path}") + return mp4_path + + +# ───────────────────────────────────────────────────────────────────────────── +# Live / hot-reload mode +# ───────────────────────────────────────────────────────────────────────────── + +def run_live(panel_name: str, args, mock_params): + """ + Interactive window with hot-reload. + Watches the source file of the selected panel; re-imports it on save. + Press S to take a screenshot, R to force reload, Q/Esc to quit. + """ + from iqpilot.system.ui.lib.application import gui_app + + gui_app.init_window(f"MICI Live — {panel_name} [S=shot R=reload Q=quit]", fps=args.fps) + render_tex = rl.load_render_texture(MICI_W, MICI_H) + win_w = rl.get_screen_width() + win_h = rl.get_screen_height() + + widget = load_panel(panel_name) + last_mtime: dict[str, float] = {} + + def _watch_paths() -> list[Path]: + """Files to watch for changes (panel module + shared theme/button).""" + mods = [ + ROOT / "iqpilot/selfdrive/ui/iqpilot/mici/layouts" / f"{panel_name}.py", + ROOT / "iqpilot/selfdrive/ui/iqpilot/theme.py", + ROOT / "iqpilot/selfdrive/ui/mici/widgets/button.py", + ] + return [p for p in mods if p.exists()] + + def _needs_reload() -> bool: + for p in _watch_paths(): + mtime = p.stat().st_mtime + if last_mtime.get(str(p), 0) != mtime: + last_mtime[str(p)] = mtime + return True + return False + + def _reload(): + nonlocal widget + print(" 🔄 reloading...") + # Invalidate cached modules so importlib picks up changes + prefix = "iqpilot.ui.mici.layouts" + for key in list(sys.modules.keys()): + if key.startswith(prefix) or key == "iqpilot.ui.theme": + del sys.modules[key] + try: + widget = load_panel(panel_name) + print(" ✅ reloaded OK") + except Exception as e: + print(f" ❌ reload error: {e}") + + # Seed mtimes + for p in _watch_paths(): + last_mtime[str(p)] = p.stat().st_mtime + + out_dir = Path(args.out) + shot_count = 0 + + while not rl.window_should_close(): + # Check for file changes + if _needs_reload(): + _reload() + + # Key bindings + if rl.is_key_pressed(rl.KeyboardKey.KEY_Q) or rl.is_key_pressed(rl.KeyboardKey.KEY_ESCAPE): + break + if rl.is_key_pressed(rl.KeyboardKey.KEY_R): + _reload() + if rl.is_key_pressed(rl.KeyboardKey.KEY_S): + # Take screenshot from render texture (native MICI res) + img = rl.load_image_from_texture(render_tex.texture) + rl.image_flip_vertical(img) + rl.image_resize(img, MICI_W * 2, MICI_H * 2) + out_dir.mkdir(parents=True, exist_ok=True) + ts = int(time.time() * 1000) + path = out_dir / f"mici_{panel_name}_live_{shot_count:03d}_{ts}.png" + rl.export_image(img, str(path)) + rl.unload_image(img) + shot_count += 1 + print(f" 📸 screenshot saved: {path}") + if args.open: + subprocess.Popen(["open", str(path)]) + + rl.begin_drawing() + rl.clear_background(CHROME_BG) + + # Render widget into MICI-sized texture, blit to full window + rl.begin_texture_mode(render_tex) + rl.clear_background(rl.BLACK) + widget.render(rl.Rectangle(0, 0, MICI_W, MICI_H)) + rl.end_texture_mode() + + src = rl.Rectangle(0, 0, MICI_W, -MICI_H) + dst = rl.Rectangle(0, 0, win_w, win_h) + rl.draw_texture_pro(render_tex.texture, src, dst, rl.Vector2(0, 0), 0, rl.WHITE) + + # Status hint overlay + watch_files = _watch_paths() + hint = f"watching {len(watch_files)} file(s) | S=shot R=reload Q=quit" + rl.draw_text(hint, 6, win_h - 18, 11, rl.Color(80, 80, 80, 160)) + + rl.end_drawing() + + rl.unload_render_texture(render_tex) + rl.close_window() + + +# ───────────────────────────────────────────────────────────────────────────── +# Entry point +# ───────────────────────────────────────────────────────────────────────────── + +def parse_args(): + p = argparse.ArgumentParser( + description="IQ.Pilot MICI UI Preview Tool", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__, + ) + p.add_argument("--panel", default="steering", + help="Panel name or 'all'") + p.add_argument("--mode", default="screenshot", + choices=["screenshot", "video", "live"], + help="Capture mode") + p.add_argument("--frames", type=int, default=90, + help="Settle frames before screenshot") + p.add_argument("--shots", type=int, default=1, + help="Number of screenshots") + p.add_argument("--duration", type=float, default=4.0, + help="Video duration in seconds") + p.add_argument("--fps", type=int, default=60, + help="Render FPS") + p.add_argument("--scale", type=float, default=2.5, + help="Window scale multiplier (1.0 = native 536×240)") + p.add_argument("--out", default=str(DEFAULT_OUT), + help="Output directory") + p.add_argument("--open", action="store_true", default=True, + help="Open output after capture (macOS)") + p.add_argument("--no-open", dest="open", action="store_false") + p.add_argument("--mock", action="store_true", default=True, + help="Use mock UI state (no live process needed)") + p.add_argument("--no-mock", dest="mock", action="store_false") + p.add_argument("--accent", default=None, + help="Override neon accent color, e.g. '#FF6B00'") + return p.parse_args() + + +def main(): + args = parse_args() + out_dir = Path(args.out) + out_dir.mkdir(parents=True, exist_ok=True) + + # Set SCALE env var BEFORE gui_app module is imported (it reads it at import time) + os.environ["SCALE"] = str(args.scale) + + # Apply mock state early (before any widget imports) + mock_params = None + if args.mock: + print(" 🎭 using mock UI state (--no-mock to use live params)") + mock_params = _patch_mock_state() + + # Override accent color if requested + if args.accent: + if mock_params: + mock_params.put("UIAccentColor", args.accent) + print(f" 🎨 accent color: {args.accent}") + + panels = ALL_PANELS if args.panel == "all" else [args.panel] + mode = args.mode + + if mode == "live" and len(panels) > 1: + print(" âš ī¸ live mode only supports a single panel. Using first panel.") + panels = panels[:1] + + all_outputs: list[Path] = [] + + for panel_name in panels: + print(f"\n â–ļ {mode.upper()} — panel: {panel_name}") + + try: + if mode == "live": + run_live(panel_name, args, mock_params) + elif mode == "screenshot": + saved = run_screenshot(panel_name, args, out_dir) + all_outputs.extend(saved) + elif mode == "video": + mp4 = run_video(panel_name, args, out_dir) + all_outputs.append(mp4) + except Exception as e: + print(f" ❌ failed for panel '{panel_name}': {e}") + import traceback; traceback.print_exc() + if rl.is_window_ready(): + rl.close_window() + + # Open all outputs at once + if args.open and all_outputs: + print(f"\n 📂 opening {len(all_outputs)} output(s)...") + subprocess.Popen(["open"] + [str(p) for p in all_outputs]) + + print("\n ✨ done\n") + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/joystick/joystick_control.py b/iqpilot/tools/joystick/joystick_control.py new file mode 100755 index 000000000..dbb5c9ea0 --- /dev/null +++ b/iqpilot/tools/joystick/joystick_control.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python3 +import argparse +import atexit +import os +from select import select +import signal +import socket +import struct +import sys +import termios +import threading +import time + +import numpy as np +from inputs import UnpluggedError, get_gamepad + +from iqpilot.cereal import messaging +from iqpilot.common.params import Params +from iqpilot.common.realtime import Ratekeeper +from iqpilot.system.hardware import HARDWARE + +REMOTE_PORT_DEFAULT = 8765 +REMOTE_TIMEOUT_S = 0.25 +REMOTE_PUBLISH_HZ = 30 +LOCAL_PUBLISH_HZ = 100 + + +class KBHit: + def __init__(self) -> None: + self.stdin_fd = sys.stdin.fileno() + self.old_term = termios.tcgetattr(self.stdin_fd) + self.new_term = self.old_term.copy() + self.new_term[3] &= ~(termios.ICANON | termios.ECHO) + termios.tcsetattr(self.stdin_fd, termios.TCSAFLUSH, self.new_term) + atexit.register(self.set_normal_term) + + def set_normal_term(self) -> None: + termios.tcsetattr(self.stdin_fd, termios.TCSAFLUSH, self.old_term) + + @staticmethod + def getch() -> str: + return sys.stdin.read(1) + + @staticmethod + def kbhit(): + return select([sys.stdin], [], [], 0)[0] != [] + + +class Keyboard: + def __init__(self): + self.kb = KBHit() + self.axis_increment = 0.05 # 5% of full actuation each key press + self.axes_map = {'w': 'gb', 's': 'gb', + 'a': 'steer', 'd': 'steer'} + self.axes_values = {'gb': 0., 'steer': 0.} + self.axes_order = ['gb', 'steer'] + self.cancel = False + self.idle_sleep_s = 0.0 + + def update(self): + key = self.kb.getch().lower() + self.cancel = False + if key == 'r': + self.axes_values = dict.fromkeys(self.axes_values, 0.) + elif key == 'c': + self.cancel = True + elif key in self.axes_map: + axis = self.axes_map[key] + incr = self.axis_increment if key in ['w', 'a'] else -self.axis_increment + self.axes_values[axis] = float(np.clip(self.axes_values[axis] + incr, -1, 1)) + else: + return False + return True + + def get_buttons(self): + return [False, self.cancel] + + +class Joystick: + def __init__(self): + # This class supports a PlayStation 5 DualSense controller on the comma 3X + # Using both analog sticks: left stick Y for gas/brake, right stick X for steering + self.cancel_button = 'BTN_NORTH' # BTN_NORTH=X/triangle + if HARDWARE.get_device_type() == 'pc': + accel_axis = 'ABS_Y' # Left stick Y-axis + steer_axis = 'ABS_RX' # Right stick X-axis + self.flip_map = {} # No flipping needed + else: + accel_axis = 'ABS_Y' # Left stick Y-axis + steer_axis = 'ABS_Z' # Right stick X-axis + self.flip_map = {} # No flipping needed + + self.min_axis_value = {accel_axis: 0., steer_axis: 0.} + self.max_axis_value = {accel_axis: 255., steer_axis: 255.} + self.axes_values = {accel_axis: 0., steer_axis: 0.} + self.axes_order = [accel_axis, steer_axis] + self.cancel = False + self.idle_sleep_s = 0.0 + + def update(self): + try: + joystick_event = get_gamepad()[0] + except (OSError, UnpluggedError): + self.axes_values = dict.fromkeys(self.axes_values, 0.) + return False + + event = (joystick_event.code, joystick_event.state) + + # flip left trigger to negative accel + if event[0] in self.flip_map: + event = (self.flip_map[event[0]], -event[1]) + + if event[0] == self.cancel_button: + if event[1] == 1: + self.cancel = True + elif event[1] == 0: # state 0 is falling edge + self.cancel = False + elif event[0] in self.axes_values: + self.max_axis_value[event[0]] = max(event[1], self.max_axis_value[event[0]]) + self.min_axis_value[event[0]] = min(event[1], self.min_axis_value[event[0]]) + + norm = -float(np.interp(event[1], [self.min_axis_value[event[0]], self.max_axis_value[event[0]]], [-1., 1.])) + norm = norm if abs(norm) > 0.03 else 0. # center can be noisy, deadzone of 3% + self.axes_values[event[0]] = norm + else: + return False + return True + + def get_buttons(self): + return [False, self.cancel] + + +class RemoteJoystick: + def __init__(self, host: str, port: int): + self.addr = (host, port) + self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.socket.bind(self.addr) + self.socket.settimeout(0.1) + + self.axes_values = {'gb': 0.0, 'steer': 0.0} + self.axes_order = ['gb', 'steer'] + self.buttons = [False, False] + self.last_update = 0.0 + self.authenticated = False + self.client_addr = None + self.idle_sleep_s = 0.01 + + def _clamp(self, value: float) -> float: + return float(np.clip(value, -1.0, 1.0)) + + def _handle_timeout(self, now: float) -> None: + if self.authenticated and (now - self.last_update) > REMOTE_TIMEOUT_S: + self.axes_values = {'gb': 0.0, 'steer': 0.0} + self.buttons = [False, False] + + def _send_auth_ok(self, addr) -> None: + try: + self.socket.sendto(bytes([1]), addr) + except OSError: + pass + + def update(self): + now = time.monotonic() + try: + data, addr = self.socket.recvfrom(64) + except TimeoutError: + self._handle_timeout(now) + return False + except OSError: + return False + + if not data: + return False + + msg_type = data[0] + if msg_type == 0: + self.client_addr = addr + self.authenticated = True + self._send_auth_ok(addr) + return True + + if msg_type == 2: + try: + payload = data[1:].decode("utf-8", errors="strict").strip() + steer_s, accel_s, engage_s, disengage_s = payload.split(",", 3) + steer = float(steer_s) + accel = float(accel_s) + engage = engage_s == "1" + disengage = disengage_s == "1" + except (UnicodeDecodeError, ValueError): + return False + + self.axes_values['steer'] = self._clamp(steer) + self.axes_values['gb'] = self._clamp(accel) + self.buttons = [engage, disengage] + self.last_update = now + return True + + if msg_type != 1 or len(data) < 9: + return False + + steer, accel = struct.unpack_from(" 9 else False + disengage = bool(data[10]) if len(data) > 10 else False + + self.axes_values['steer'] = self._clamp(steer) + self.axes_values['gb'] = self._clamp(accel) + self.buttons = [engage, disengage] + self.last_update = now + return True + + def get_buttons(self): + return self.buttons + + +def send_thread(joystick, show_values: bool): + pm = messaging.PubMaster(['testJoystick']) + + publish_hz = REMOTE_PUBLISH_HZ if isinstance(joystick, RemoteJoystick) else LOCAL_PUBLISH_HZ + rk = Ratekeeper(publish_hz, print_delay_threshold=None) + + while True: + if show_values and rk.frame % 20 == 0: + print('\n' + ', '.join(f'{name}: {round(v, 3)}' for name, v in joystick.axes_values.items())) + + joystick_msg = messaging.new_message('testJoystick') + joystick_msg.valid = True + joystick_msg.testJoystick.axes = [joystick.axes_values[ax] for ax in joystick.axes_order] + joystick_msg.testJoystick.buttons = joystick.get_buttons() + + pm.send('testJoystick', joystick_msg) + + rk.keep_time() + + +def joystick_control_thread(joystick, show_values: bool): + Params().put_bool('JoystickDebugMode', True) + try: + threading.Thread(target=send_thread, args=(joystick, show_values), daemon=True).start() + while True: + updated = joystick.update() + if not updated and joystick.idle_sleep_s > 0: + time.sleep(joystick.idle_sleep_s) + finally: + Params().put_bool('JoystickDebugMode', False) + + +def main(): + joystick_control_thread(Joystick(), True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Publishes events from your joystick to control your car.\n' + + 'openpilot must be offroad before starting joystick_control. This tool supports ' + + 'a PlayStation 5 DualSense controller on the comma 3X.', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('--keyboard', action='store_true', help='Use your keyboard instead of a joystick') + parser.add_argument('--remote', action='store_true', help='Listen for UDP joystick input') + parser.add_argument('--listen', type=int, default=REMOTE_PORT_DEFAULT, help='UDP port for remote joystick input') + parser.add_argument('--listen-address', default='0.0.0.0', help='UDP address to bind for remote input') + args = parser.parse_args() + + if not Params().get_bool("IsOffroad") and "ZMQ" not in os.environ: + print("The car must be off before running joystick_control.") + exit() + + if args.remote and args.keyboard: + print("Choose only one input mode.") + exit() + + print() + if args.remote: + print(f'Listening for remote joystick on {args.listen_address}:{args.listen}') + elif args.keyboard: + print('Gas/brake control: `W` and `S` keys') + print('Steering control: `A` and `D` keys') + print('Buttons') + print('- `R`: Resets axes') + print('- `C`: Cancel cruise control') + else: + print('Using joystick, make sure to run cereal/messaging/bridge on your device if running over the network!') + print('If not running on a comma device, the mapping may need to be adjusted.') + + def handle_exit(signum, _frame): + Params().put_bool('JoystickDebugMode', False) + raise SystemExit + + signal.signal(signal.SIGINT, handle_exit) + signal.signal(signal.SIGTERM, handle_exit) + + if args.remote: + joystick = RemoteJoystick(args.listen_address, int(args.listen)) + joystick_control_thread(joystick, False) + else: + joystick = Keyboard() if args.keyboard else Joystick() + joystick_control_thread(joystick, True) diff --git a/iqpilot/tools/joystick/joystickd.py b/iqpilot/tools/joystick/joystickd.py new file mode 100755 index 000000000..4fec800d0 --- /dev/null +++ b/iqpilot/tools/joystick/joystickd.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 + +import math +import numpy as np + +from iqpilot.cereal import messaging, car, custom +from iqdbc.car.vehicle_model import VehicleModel +from iqpilot.common.realtime import DT_CTRL, Ratekeeper +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog + +LongCtrlState = car.CarControl.Actuators.LongControlState +MAX_LAT_ACCEL = 5.0 +MAX_STEERING_ANGLE_DEG = 500.0 +ACCEL_RELEASE_THRESHOLD = 0.01 +DECEL_REQUEST_THRESHOLD = -0.02 +STOPPING_HOLD_SPEED_MARGIN = 0.3 +STOPPING_SPEED = 0.25 + + +def get_lateral_joystick_outputs(CP: car.CarParams, VM: VehicleModel, v_ego: float, roll: float, steer_axis: float) -> tuple[float, float, float]: + steer_axis = float(np.clip(steer_axis, -1, 1)) + steering_angle_deg = steer_axis * MAX_STEERING_ANGLE_DEG + curvature = -VM.calc_curvature(math.radians(steering_angle_deg), v_ego, roll) + + if CP.steerControlType in (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED): + return 0.0, steering_angle_deg, curvature + + max_curvature = MAX_LAT_ACCEL / max(v_ego ** 2, 5) + max_angle = min(math.degrees(VM.get_steer_from_curvature(max_curvature, v_ego, roll)), MAX_STEERING_ANGLE_DEG) + return steer_axis, steer_axis * max_angle, steer_axis * -max_curvature + + +def joystickd_thread(): + params = Params() + cloudlog.info("joystickd is waiting for CarParams") + CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams) + CP_IQ = messaging.log_from_bytes(params.get("IQCarParams", block=True), custom.IQCarParams) + VM = VehicleModel(CP) + + sm = messaging.SubMaster(['carState', 'onroadEvents', 'vehicleParameters', 'selfdriveState', 'iqState', 'testJoystick'], frequency=1. / DT_CTRL) + pm = messaging.PubMaster(['carControl', 'controlsState']) + + # Stop-hold behavior for joystick long control: + # - enter hold only when user requested decel and we are near/at stop + # - neutral input does not request decel while rolling + # - release hold on positive accel request + decel_intent_latched = False + stop_hold_latched = False + + rk = Ratekeeper(100, print_delay_threshold=None) + while 1: + sm.update(0) + + cc_msg = messaging.new_message('carControl') + cc_msg.valid = True + CC = cc_msg.carControl + ss = sm['selfdriveState'] + ss_iq = sm['iqState'] + aol_enabled = bool(getattr(ss_iq.aol, 'enabled', False)) + aol_active = bool(getattr(ss_iq.aol, 'active', False)) + joystick_angle_lat_active = aol_active or ( + aol_enabled and CP.steerControlType == car.CarParams.SteerControlType.angle + ) + + CC.enabled = bool(ss.enabled or aol_enabled) + CC.latActive = bool(ss.active or joystick_angle_lat_active) and not sm['carState'].steerFaultTemporary and not sm['carState'].steerFaultPermanent + long_through_override = CP_IQ.longActiveWithGasOverride and CP.openpilotLongitudinalControl + override_longitudinal = any(e.overrideLongitudinal for e in sm['onroadEvents']) + CC.longActive = bool(ss.enabled) and (not override_longitudinal or long_through_override) and CP.openpilotLongitudinalControl + CC.cruiseControl.cancel = sm['carState'].cruiseState.enabled and (not CC.enabled or not CP.pcmCruise) + CC.hudControl.leadDistanceBars = 2 + + actuators = CC.actuators + + # reset joystick if it hasn't been received in a while + should_reset_joystick = sm.recv_frame['testJoystick'] == 0 or (sm.frame - sm.recv_frame['testJoystick'])*DT_CTRL > 0.2 + + if not should_reset_joystick: + joystick_axes = sm['testJoystick'].axes + else: + joystick_axes = [0.0, 0.0] + + if CC.longActive: + accel_cmd = float(np.clip(joystick_axes[0], -1, 1)) + actuators.accel = 4.0 * accel_cmd + + positive_accel_requested = accel_cmd > ACCEL_RELEASE_THRESHOLD + negative_accel_requested = accel_cmd < DECEL_REQUEST_THRESHOLD + near_stop = sm['carState'].standstill or sm['carState'].vEgo <= (STOPPING_SPEED + STOPPING_HOLD_SPEED_MARGIN) + + if positive_accel_requested: + stop_hold_latched = False + decel_intent_latched = False + elif negative_accel_requested: + decel_intent_latched = True + + if decel_intent_latched and near_stop and not positive_accel_requested: + stop_hold_latched = True + + # If we are moving again and driver is not asking for decel, clear stale hold state. + if stop_hold_latched and sm['carState'].vEgo > (STOPPING_SPEED + STOPPING_HOLD_SPEED_MARGIN) and not negative_accel_requested: + stop_hold_latched = False + decel_intent_latched = False + + actuators.longControlState = LongCtrlState.stopping if stop_hold_latched else LongCtrlState.pid + CC.cruiseControl.resume = positive_accel_requested + else: + decel_intent_latched = False + stop_hold_latched = False + + if CC.latActive: + torque, steering_angle_deg, curvature = get_lateral_joystick_outputs(CP, VM, sm['carState'].vEgo, sm['vehicleParameters'].roll, joystick_axes[1]) + actuators.torque = torque + actuators.steeringAngleDeg = steering_angle_deg + actuators.curvature = curvature + + pm.send('carControl', cc_msg) + + cs_msg = messaging.new_message('controlsState') + cs_msg.valid = True + controlsState = cs_msg.controlsState + controlsState.lateralControlState.init('debugState') + + lp = sm['vehicleParameters'] + steer_angle_without_offset = math.radians(sm['carState'].steeringAngleDeg - lp.angleOffsetDeg) + controlsState.curvature = -VM.calc_curvature(steer_angle_without_offset, sm['carState'].vEgo, lp.roll) + + pm.send('controlsState', cs_msg) + + rk.keep_time() + + +def main(): + joystickd_thread() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/joystick/tests/test_joystickd.py b/iqpilot/tools/joystick/tests/test_joystickd.py new file mode 100644 index 000000000..1d37efbff --- /dev/null +++ b/iqpilot/tools/joystick/tests/test_joystickd.py @@ -0,0 +1,33 @@ +from iqpilot.cereal import car + +from iqpilot.tools.joystick.joystickd import get_lateral_joystick_outputs + + +class StubVehicleModel: + def calc_curvature(self, steer_angle: float, v_ego: float, roll: float) -> float: + return steer_angle + + def get_steer_from_curvature(self, curvature: float, v_ego: float, roll: float) -> float: + return curvature + + +def test_angle_cars_use_angle_outputs(): + CP = car.CarParams.new_message() + CP.steerControlType = car.CarParams.SteerControlType.angle + + torque, steering_angle_deg, curvature = get_lateral_joystick_outputs(CP, StubVehicleModel(), 20.0, 0.0, 0.5) + + assert torque == 0.0 + assert steering_angle_deg != 0.0 + assert curvature < 0.0 + + +def test_torque_cars_keep_torque_outputs(): + CP = car.CarParams.new_message() + CP.steerControlType = car.CarParams.SteerControlType.torque + + torque, steering_angle_deg, curvature = get_lateral_joystick_outputs(CP, StubVehicleModel(), 20.0, 0.0, 0.5) + + assert torque == 0.5 + assert steering_angle_deg != 0.0 + assert curvature < 0.0 diff --git a/iqpilot/tools/lib/__init__.py b/iqpilot/tools/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/tools/lib/api.py b/iqpilot/tools/lib/api.py new file mode 100644 index 000000000..84517cea2 --- /dev/null +++ b/iqpilot/tools/lib/api.py @@ -0,0 +1,62 @@ +import os +import json +import requests +from requests.adapters import HTTPAdapter, Retry + +from iqpilot.system.hardware.hw import Paths + +API_HOST = os.getenv('API_HOST', 'https://api-iqlabs.konn3kt.com') + +# TODO: this should be merged into common.api + +class CommaApi: + def __init__(self, token=None): + self.session = requests.Session() + self.session.headers['User-agent'] = 'OpenpilotTools' + if token: + self.session.headers['Authorization'] = 'JWT ' + token + + retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504]) + self.session.mount('https://', HTTPAdapter(max_retries=retries)) + + def request(self, method, endpoint, **kwargs): + with self.session.request(method, API_HOST + '/' + endpoint, **kwargs) as resp: + resp_json = resp.json() + if isinstance(resp_json, dict) and resp_json.get('error'): + if resp.status_code in [401, 403]: + raise UnauthorizedError('Unauthorized. Authenticate with tools/lib/auth.py') + + e = APIError(str(resp.status_code) + ":" + resp_json.get('description', str(resp_json['error']))) + e.status_code = resp.status_code + raise e + return resp_json + + def get(self, endpoint, **kwargs): + return self.request('GET', endpoint, **kwargs) + + def post(self, endpoint, **kwargs): + return self.request('POST', endpoint, **kwargs) + +class APIError(Exception): + pass + +class UnauthorizedError(Exception): + pass + +def get_token(): + try: + with open(os.path.join(Paths.config_root(), 'auth.json')) as f: + return json.load(f)['access_token'] + except Exception: + return None + +def set_token(token): + os.makedirs(Paths.config_root(), exist_ok=True) + with open(os.path.join(Paths.config_root(), 'auth.json'), 'w') as f: + json.dump({'access_token': token}, f) + +def clear_token(): + try: + os.unlink(os.path.join(Paths.config_root(), 'auth.json')) + except FileNotFoundError: + pass diff --git a/iqpilot/tools/lib/auth.py b/iqpilot/tools/lib/auth.py new file mode 100755 index 000000000..62d270f71 --- /dev/null +++ b/iqpilot/tools/lib/auth.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +""" +Usage:: + + usage: auth.py [-h] [{github,jwt}] [jwt] + + Login to your konn3kt account + + positional arguments: + {github,jwt} + jwt + + optional arguments: + -h, --help show this help message and exit + + +Examples:: + + ./auth.py # Log in with GitHub + ./auth.py jwt ey..hw # Log in with a pre-issued JWT (for CI) +""" + +import argparse +import sys +import pprint +import webbrowser +from http.server import BaseHTTPRequestHandler, HTTPServer +from typing import Any +from urllib.parse import parse_qs, urlencode + +from iqpilot.tools.lib.api import APIError, CommaApi, UnauthorizedError, set_token, get_token + +PORT = 3000 + + +class ClientRedirectServer(HTTPServer): + query_params: dict[str, Any] = {} + + +class ClientRedirectHandler(BaseHTTPRequestHandler): + def do_GET(self): + if '?' in self.path: + query_parsed = parse_qs(self.path.split('?', 1)[1], keep_blank_values=True) + if 'code' in query_parsed or 'error' in query_parsed: + self.server.query_params = query_parsed + + self.send_response(200) + self.send_header('Content-type', 'text/plain') + self.end_headers() + self.wfile.write(b'Return to the CLI to continue') + + def log_message(self, fmt, *fmt_args): + sys.stderr.write(f"[auth callback] {self.address_string()} {fmt % fmt_args}\n") + + +def auth_redirect_link(method): + if method != 'github': + raise NotImplementedError(f"no redirect implemented for method {method}") + + params = { + 'client_id': 'Ov23lifjMafxJzFatvuB', + 'redirect_uri': 'https://api-iqlabs.konn3kt.com/v2/auth/h/redirect/', + 'state': f'service,localhost:{PORT}', + 'scope': 'read:user', + } + return 'https://github.com/login/oauth/authorize?' + urlencode(params) + + +def login(method): + oauth_uri = auth_redirect_link(method) + + web_server = ClientRedirectServer(('localhost', PORT), ClientRedirectHandler) + print(f'To sign in, use your browser and navigate to {oauth_uri}') + webbrowser.open(oauth_uri, new=2) + + while True: + web_server.handle_request() + if 'code' in web_server.query_params: + break + elif 'error' in web_server.query_params: + print('Authentication Error: "{}". Description: "{}" '.format( + web_server.query_params['error'], + web_server.query_params.get('error_description')), file=sys.stderr) + break + + try: + auth_resp = CommaApi().post('v2/auth/', data={'code': web_server.query_params['code'], 'provider': web_server.query_params['provider']}) + set_token(auth_resp['access_token']) + except APIError as e: + print(f'Authentication Error: {e}', file=sys.stderr) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Login to your konn3kt account') + parser.add_argument('method', default='github', const='github', nargs='?', choices=['github', 'jwt']) + parser.add_argument('jwt', nargs='?') + + args = parser.parse_args() + if args.method == 'jwt': + if args.jwt is None: + print("method JWT selected, but no JWT was provided") + exit(1) + + set_token(args.jwt) + else: + login(args.method) + + try: + me = CommaApi(token=get_token()).get('/v1/me') + print("Authenticated!") + pprint.pprint(me) + except UnauthorizedError: + print("Got invalid JWT") + exit(1) diff --git a/iqpilot/tools/lib/filereader.py b/iqpilot/tools/lib/filereader.py new file mode 100644 index 000000000..d5bba126f --- /dev/null +++ b/iqpilot/tools/lib/filereader.py @@ -0,0 +1,58 @@ +import os +import io +import posixpath +import socket +from functools import cache +from iqpilot.common.utils import retry +from urllib.parse import urlparse + +from iqpilot.tools.lib.url_file import URLFile + +DATA_ENDPOINT = os.getenv("DATA_ENDPOINT", "http://data-raw.comma.internal/") + + +@cache +@retry(delay=0.0) +def internal_source_available(url: str) -> bool: + if os.path.isdir(url): + return True + + try: + hostname = urlparse(url).hostname + port = urlparse(url).port or 80 + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(0.5) + s.connect((hostname, port)) + return True + except (socket.gaierror, ConnectionRefusedError): + pass + return False + + +def resolve_name(fn): + if fn.startswith("cd:/"): + return posixpath.join(DATA_ENDPOINT, fn[4:]) + return fn + + +@cache +def file_exists(fn): + fn = resolve_name(fn) + if fn.startswith(("http://", "https://")): + return URLFile(fn).get_length_online() != -1 + return os.path.exists(fn) + +class DiskFile(io.BufferedReader): + def get_multi_range(self, ranges: list[tuple[int, int]]) -> list[bytes]: + parts = [] + for r in ranges: + self.seek(r[0]) + parts.append(self.read(r[1] - r[0])) + return parts + +def FileReader(fn): + fn = resolve_name(fn) + if fn.startswith(("http://", "https://")): + return URLFile(fn) + else: + return DiskFile(open(fn, "rb")) diff --git a/iqpilot/tools/lib/framereader.py b/iqpilot/tools/lib/framereader.py new file mode 100644 index 000000000..193622b3a --- /dev/null +++ b/iqpilot/tools/lib/framereader.py @@ -0,0 +1,176 @@ +import os +import subprocess +import json +import logging +from collections.abc import Iterator +from collections import OrderedDict + +import numpy as np +from iqpilot.tools.lib.filereader import FileReader, resolve_name +from iqpilot.tools.lib.vidindex import hevc_index + + +class DataUnreadableError(Exception): + pass + +logger = logging.getLogger("tools") + +HEVC_SLICE_B = 0 +HEVC_SLICE_P = 1 +HEVC_SLICE_I = 2 + +class LRUCache: + def __init__(self, capacity: int): + self._cache: OrderedDict = OrderedDict() + self.capacity = capacity + + def __getitem__(self, key): + self._cache.move_to_end(key) + return self._cache[key] + + def __setitem__(self, key, value): + self._cache[key] = value + if len(self._cache) > self.capacity: + self._cache.popitem(last=False) + + def __contains__(self, key): + return key in self._cache + +def assert_hvec(fn: str) -> None: + with FileReader(fn) as f: + header = f.read(4) + if len(header) == 0: + raise DataUnreadableError(f"{fn} is empty") + elif header == b"\x00\x00\x00\x01": + if 'hevc' not in fn: + raise NotImplementedError(fn) + +def decompress_video_data(rawdat, w, h, pix_fmt="rgb24", vid_fmt='hevc', hwaccel="auto", loglevel="info") -> np.ndarray: + threads = os.getenv("FFMPEG_THREADS", "0") + args = ["ffmpeg", "-v", loglevel, + "-threads", threads, + "-hwaccel", hwaccel, + "-c:v", "hevc", + "-vsync", "0", + "-f", vid_fmt, + "-flags2", "showall", + "-i", "-", + "-f", "rawvideo", + "-pix_fmt", pix_fmt, + "-"] + dat = subprocess.check_output(args, input=rawdat) + + ret: np.ndarray + if pix_fmt == "rgb24": + ret = np.frombuffer(dat, dtype=np.uint8).reshape(-1, h, w, 3) + elif pix_fmt in ["nv12", "yuv420p"]: + ret = np.frombuffer(dat, dtype=np.uint8).reshape(-1, (h*w*3//2)) + else: + raise NotImplementedError(f"Unsupported pixel format: {pix_fmt}") + return ret + +def ffprobe(fn, fmt=None): + fn = resolve_name(fn) + cmd = ["ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", "-show_streams"] + if fmt: + cmd += ["-f", fmt] + cmd += ["-i", "-"] + + try: + with FileReader(fn) as f: + ffprobe_output = subprocess.check_output(cmd, input=f.read(4096)) + except subprocess.CalledProcessError as e: + raise DataUnreadableError(fn) from e + return json.loads(ffprobe_output) + +def get_index_data(fn: str, index_data: dict|None = None): + if index_data is None: + index_data = get_video_index(fn) + if index_data is None: + raise DataUnreadableError(f"Failed to index {fn!r}") + stream = index_data["probe"]["streams"][0] + return index_data["index"], index_data["global_prefix"], stream["width"], stream["height"] + +def get_video_index(fn): + assert_hvec(fn) + frame_types, dat_len, prefix = hevc_index(fn) + index = np.array(frame_types + [(0xFFFFFFFF, dat_len)], dtype=np.uint32) + probe = ffprobe(fn, "hevc") + return { + 'index': index, + 'global_prefix': prefix, + 'probe': probe + } + +class FfmpegDecoder: + def __init__(self, fn: str, index_data: dict|None = None, + pix_fmt: str = "rgb24", hwaccel="auto", loglevel="quiet"): + self.fn = fn + self.index, self.prefix, self.w, self.h = get_index_data(fn, index_data) + self.frame_count = len(self.index) - 1 # sentinel row at the end + self.iframes = np.where(self.index[:, 0] == HEVC_SLICE_I)[0] + self.pix_fmt = pix_fmt + self.loglevel, self.hwaccel = loglevel, hwaccel + + def _gop_bounds(self, frame_idx: int): + f_b = frame_idx + while f_b > 0 and self.index[f_b, 0] != HEVC_SLICE_I: + f_b -= 1 + f_e = frame_idx + 1 + while f_e < self.frame_count and self.index[f_e, 0] != HEVC_SLICE_I: + f_e += 1 + return f_b, f_e, self.index[f_b, 1], self.index[f_e, 1] + + def _decode_gop(self, raw: bytes) -> Iterator[np.ndarray]: + yield from decompress_video_data(raw, self.w, self.h, pix_fmt=self.pix_fmt, hwaccel=self.hwaccel, loglevel=self.loglevel) + + def get_gop_start(self, frame_idx: int): + return self.iframes[np.searchsorted(self.iframes, frame_idx, side="right") - 1] + + def get_iterator(self, start_fidx: int = 0, end_fidx: int|None = None, + frame_skip: int = 1) -> Iterator[tuple[int, np.ndarray]]: + end_fidx = end_fidx or self.frame_count + fidx = start_fidx + while fidx < end_fidx: + f_b, f_e, off_b, off_e = self._gop_bounds(fidx) + with FileReader(self.fn) as f: + f.seek(off_b) + raw = self.prefix + f.read(off_e - off_b) + # number of frames to discard inside this GOP before the wanted one + for i, frm in enumerate(decompress_video_data(raw, self.w, self.h, self.pix_fmt, hwaccel=self.hwaccel, loglevel=self.loglevel)): + fidx = f_b + i + if fidx >= end_fidx: + return + elif fidx >= start_fidx and (fidx - start_fidx) % frame_skip == 0: + yield fidx, frm + fidx += 1 + +def FrameIterator(fn: str, index_data: dict|None=None, pix_fmt: str = "rgb24", + start_fidx:int=0, end_fidx=None, frame_skip:int=1, hwaccel="auto", loglevel="quiet") -> Iterator[np.ndarray]: + dec = FfmpegDecoder(fn, pix_fmt=pix_fmt, index_data=index_data, hwaccel=hwaccel, loglevel=loglevel) + for _, frame in dec.get_iterator(start_fidx=start_fidx, end_fidx=end_fidx, frame_skip=frame_skip): + yield frame + +class FrameReader: + def __init__(self, fn: str, index_data: dict|None = None, cache_size: int = 30, + pix_fmt: str = "rgb24", hwaccel="auto", loglevel="quiet"): + self.decoder = FfmpegDecoder(fn, index_data=index_data, pix_fmt=pix_fmt, hwaccel=hwaccel, loglevel=loglevel) + self.iframes = self.decoder.iframes + self._cache: LRUCache = LRUCache(cache_size) + self.w, self.h, self.frame_count, = self.decoder.w, self.decoder.h, self.decoder.frame_count + self.pix_fmt = pix_fmt + + self.it: Iterator[tuple[int, np.ndarray]] | None = None + self.fidx = -1 + + def get(self, fidx:int): + if fidx in self._cache: # If frame is cached, return it + return self._cache[fidx] + read_start = self.decoder.get_gop_start(fidx) + if not self.it or fidx < self.fidx or read_start != self.decoder.get_gop_start(self.fidx): # If the frame is in a different GOP, reset the iterator + self.it = self.decoder.get_iterator(read_start) + self.fidx = -1 + while self.fidx < fidx: + self.fidx, frame = next(self.it) + self._cache[self.fidx] = frame + return self._cache[fidx] diff --git a/iqpilot/tools/lib/logreader.py b/iqpilot/tools/lib/logreader.py new file mode 100755 index 000000000..0af1bce00 --- /dev/null +++ b/iqpilot/tools/lib/logreader.py @@ -0,0 +1,436 @@ +#!/usr/bin/env python3 +import bz2 +from functools import partial +import multiprocessing +import capnp +import enum +import os +import pathlib +import sys +import tqdm +import urllib.parse +import warnings +import zstandard as zstd +import numpy as np + +from collections.abc import Callable, Iterable, Iterator +from pathlib import Path +from urllib.parse import parse_qs, urlparse + +from iqpilot.cereal import log as capnp_log, messaging +from iqpilot.cereal.services import SERVICE_LIST +from iqpilot.common.swaglog import cloudlog +from iqpilot.tools.lib.filereader import DATA_ENDPOINT, FileReader, file_exists, internal_source_available +from iqpilot.tools.lib.route import Route, SegmentRange, FileName + +LogMessage = type[capnp._DynamicStructReader] +LogIterable = Iterable[LogMessage] +RawLogIterable = Iterable[bytes] +FileNames = tuple[str, ...] +Source = Callable[[SegmentRange, list[int], FileNames], dict[int, str]] +InternalUnavailableException = Exception("Internal source not available") +OPENPILOT_CI_BASE_URL = "https://commadataci.blob.core.windows.net/openpilotci/" +OPENPILOT_CI_ACCOUNT_URL = "https://commadataci.blob.core.windows.net" + + +def get_url(route_name: str, segment_num: str | int, filename: str) -> str: + return f"{OPENPILOT_CI_BASE_URL}{route_name.replace('|', '/')}/{segment_num}/{filename}" + + +def upload_file(path: str, blob_name: str, overwrite=False) -> str: + from azure.identity import AzureCliCredential + from azure.storage.blob import BlobClient + token_path = Path("/data/azure_token") + credential = os.environ.get("AZURE_TOKEN") or (token_path.read_text().strip() if token_path.is_file() else AzureCliCredential()) + client = BlobClient(OPENPILOT_CI_ACCOUNT_URL, container_name="openpilotci", blob_name=blob_name, credential=credential) + with open(path, "rb") as f: + client.upload_blob(f, overwrite=overwrite) + return OPENPILOT_CI_BASE_URL + blob_name + + +def comma_api_source(sr: SegmentRange, seg_idxs: list[int], fns: FileNames) -> dict[int, str]: + route = Route(sr.route_name) + if fns == FileName.RLOG: + return {seg: route.log_paths()[seg] for seg in seg_idxs if route.log_paths()[seg] is not None} + return {seg: route.qlog_paths()[seg] for seg in seg_idxs if route.qlog_paths()[seg] is not None} + + +def internal_source(sr: SegmentRange, seg_idxs: list[int], fns: FileNames, endpoint_url: str = DATA_ENDPOINT) -> dict[int, str]: + if not internal_source_available(endpoint_url): + raise InternalUnavailableException + + def internal_url(seg, file): + return f"{endpoint_url.rstrip('/')}/{sr.dongle_id}/{sr.log_id}/{seg}/{file}" + + return eval_source({seg: [internal_url(seg, fn) for fn in fns] for seg in seg_idxs}) + + +def openpilotci_source(sr: SegmentRange, seg_idxs: list[int], fns: FileNames) -> dict[int, str]: + return eval_source({seg: [get_url(sr.route_name, seg, fn) for fn in fns] for seg in seg_idxs}) + + +def eval_source(files: dict[int, list[str] | str]) -> dict[int, str]: + valid_files: dict[int, str] = {} + for seg_idx, urls in files.items(): + if isinstance(urls, str): + urls = [urls] + for url in urls: + if file_exists(url): + valid_files[seg_idx] = url + break + return valid_files + + +ALL_SERVICES = list(SERVICE_LIST.keys()) + + +def raw_live_logreader(services: list[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> RawLogIterable: + if addr != "127.0.0.1": + os.environ["ZMQ"] = "1" + messaging.reset_context() + poller = messaging.Poller() + for service in services: + messaging.sub_sock(service, poller, addr=addr) + while True: + for sock in poller.poll(100): + yield sock.receive() + + +def live_logreader(services: list[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> LogIterable: + for msg in raw_live_logreader(services, addr): + with capnp_log.Event.from_bytes(msg) as evt: + yield evt + + +def flatten_type_dict(data, sep="/", prefix=None): + result = {} + if isinstance(data, dict): + for key, value in data.items(): + result.update(flatten_type_dict(value, sep, key if prefix is None else prefix + sep + key)) + return result + if isinstance(data, list): + return {prefix: np.array(data)} + return {prefix: data} + + +def get_message_dict(message, typ): + valid = message.valid + message = message._get(typ) + if not hasattr(message, 'to_dict') or typ in ('qcomGnss', 'ubloxGnss'): + return None + result = flatten_type_dict(message.to_dict(verbose=True)) + result['_valid'] = valid + return result + + +def potentially_ragged_array(values, dtype=None, **kwargs): + try: + return np.array(values, dtype=dtype, **kwargs) + except ValueError: + return np.array(values, dtype=object, **kwargs) + + +def msgs_to_time_series(msgs): + values = {} + for msg in msgs: + typ = msg.which() + msg_dict = get_message_dict(msg, typ) + if msg_dict is None: + continue + group = values.setdefault(typ, {"t": [], **{key: [] for key in msg_dict}}) + group["t"].append(msg.logMonoTime / 1.0e9) + for key, value in msg_dict.items(): + group[key].append(value) + for group in values.values(): + order = np.argsort(group["t"]) + for name, group_values in group.items(): + group[name] = potentially_ragged_array(group_values)[order] + return values + + +def save_log(dest, log_msgs, compress=True): + dat = b"".join(msg.as_builder().to_bytes() for msg in log_msgs) + + if compress and dest.endswith(".bz2"): + dat = bz2.compress(dat) + elif compress and dest.endswith(".zst"): + dat = zstd.compress(dat, 10) + + with open(dest, "wb") as f: + f.write(dat) + + +def decompress_stream(data: bytes): + dctx = zstd.ZstdDecompressor() + decompressed_data = b"" + + with dctx.stream_reader(data) as reader: + decompressed_data = reader.read() + + return decompressed_data + + +class CachedEventReader: + __slots__ = ('_evt', '_enum') + + def __init__(self, evt: capnp._DynamicStructReader, _enum: str | None = None): + """All capnp attribute accesses are expensive, and which() is often called multiple times""" + self._evt = evt + self._enum: str | None = _enum + + # fast pickle support + def __reduce__(self): + return CachedEventReader._reducer, (self._evt.as_builder().to_bytes(), self._enum) + + @staticmethod + def _reducer(data: bytes, _enum: str | None = None): + with capnp_log.Event.from_bytes(data) as evt: + return CachedEventReader(evt, _enum) + + def __repr__(self): + return self._evt.__repr__() + + def __str__(self): + return self._evt.__str__() + + def __dir__(self): + return dir(self._evt) + + def which(self) -> str: + if self._enum is None: + self._enum = self._evt.which() + return self._enum + + def __getattr__(self, name: str): + if name.startswith("__") and name.endswith("__"): + return getattr(self, name) + return getattr(self._evt, name) + + +class _LogFileReader: + def __init__(self, fn, only_union_types=False, sort_by_time=False, dat=None): + self.data_version = None + self._only_union_types = only_union_types + + ext = None + if not dat: + _, ext = os.path.splitext(urllib.parse.urlparse(fn).path) + if ext not in ('', '.bz2', '.zst'): + # old rlogs weren't compressed + raise ValueError(f"unknown extension {ext}") + + with FileReader(fn) as f: + dat = f.read() + + if ext == ".bz2" or dat.startswith(b'BZh9'): + dat = bz2.decompress(dat) + elif ext == ".zst" or dat.startswith(b'\x28\xB5\x2F\xFD'): + # https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#zstandard-frames + dat = decompress_stream(dat) + + ents = capnp_log.Event.read_multiple_bytes(dat) + + self._ents = [] + try: + for e in ents: + self._ents.append(CachedEventReader(e)) + except capnp.KjException: + warnings.warn("Corrupted events detected", RuntimeWarning, stacklevel=1) + + if sort_by_time: + self._ents.sort(key=lambda x: x.logMonoTime) + + def __iter__(self) -> Iterator[capnp._DynamicStructReader]: + for ent in self._ents: + if self._only_union_types: + try: + ent.which() + yield ent + except (capnp.lib.capnp.KjException, RuntimeError): + pass + else: + yield ent + + +class ReadMode(enum.StrEnum): + RLOG = "r" # only read rlogs + QLOG = "q" # only read qlogs + AUTO = "a" # default to rlogs, fallback to qlogs + AUTO_INTERACTIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user + + +class LogsUnavailable(Exception): + pass + + +def direct_source(file_or_url: str) -> list[str]: + return [file_or_url] + + +# TODO this should apply to camera files as well +def auto_source(identifier: str, sources: list[Source], default_mode: ReadMode) -> list[str]: + exceptions = {} + + sr = SegmentRange(identifier) + needed_seg_idxs = sr.seg_idxs + + mode = default_mode if sr.selector is None else ReadMode(sr.selector) + if mode == ReadMode.QLOG: + try_fns = [FileName.QLOG] + else: + try_fns = [FileName.RLOG] + + # If selector allows it, fallback to qlogs + if mode in (ReadMode.AUTO, ReadMode.AUTO_INTERACTIVE): + try_fns.append(FileName.QLOG) + + # Build a dict of valid files as we evaluate each source. May contain mix of rlogs, qlogs, and None. + # This function only returns when we've sourced all files, or throws an exception + valid_files: dict[int, str] = {} + for fn in try_fns: + for source in sources: + try: + files = source(sr, needed_seg_idxs, fn) + + # Build a dict of valid files + valid_files |= files + + # Don't check for segment files that have already been found + needed_seg_idxs = [idx for idx in needed_seg_idxs if idx not in valid_files] + + # We've found all files, return them + if len(needed_seg_idxs) == 0: + return list(valid_files.values()) + else: + raise FileNotFoundError(f"Did not find {fn} for seg idxs {needed_seg_idxs} of {sr.route_name}") + + except Exception as e: + exceptions[source.__name__] = e + + if fn == try_fns[0]: + missing_logs = len(needed_seg_idxs) + if mode == ReadMode.AUTO: + cloudlog.warning(f"{missing_logs}/{len(sr.seg_idxs)} rlogs were not found, falling back to qlogs for those segments...") + elif mode == ReadMode.AUTO_INTERACTIVE: + if input(f"{missing_logs}/{len(sr.seg_idxs)} rlogs were not found, would you like to fallback to qlogs for those segments? (y/N) ").lower() != "y": + break + + missing_logs = len(needed_seg_idxs) + raise LogsUnavailable(f"{missing_logs}/{len(sr.seg_idxs)} logs were not found, please ensure all logs " + + "are uploaded. You can fall back to qlogs with '/a' selector at the end of the route name.\n\n" + + "Exceptions for sources:\n - " + "\n - ".join([f"{k}: {repr(v)}" for k, v in exceptions.items()])) + + +def parse_indirect(identifier: str) -> str: + if "useradmin.comma.ai" in identifier: + query = parse_qs(urlparse(identifier).query) + identifier = query["onebox"][0] + elif "connect.comma.ai" in identifier or "konn3kt.com" in identifier: + path = urlparse(identifier).path.strip("/").split("/") + if path and path[0] == "connectdata": + # signed data URL from the API host (api-*.konn3kt.com/connectdata/...), not a share link + return identifier + path = ['/'.join(path[:2]), *path[2:]] # recombine log id + + identifier = path[0] + if len(path) > 2: + # convert url with seconds to segments + start, end = int(path[1]) // 60, int(path[2]) // 60 + 1 + identifier = f"{identifier}/{start}:{end}" + + # add selector if it exists + if len(path) > 3: + identifier += f"/{path[3]}" + else: + # add selector if it exists + identifier = "/".join(path) + + return identifier + + +def parse_direct(identifier: str): + if identifier.startswith(("http://", "https://", "cd:/")) or pathlib.Path(identifier).exists(): + return identifier + return None + + +class LogReader: + def _parse_identifier(self, identifier: str) -> list[str]: + # useradmin, etc. + identifier = parse_indirect(identifier) + + # direct url or file + direct_parsed = parse_direct(identifier) + if direct_parsed is not None: + return direct_source(identifier) + + identifiers = auto_source(identifier, self.sources, self.default_mode) + return identifiers + + def __init__(self, identifier: str | list[str], default_mode: ReadMode = ReadMode.RLOG, + sources: list[Source] | None = None, sort_by_time=False, only_union_types=False): + if sources is None: + sources = [internal_source, comma_api_source, openpilotci_source] + + self.default_mode = default_mode + self.sources = sources + self.identifier = identifier + if isinstance(identifier, str): + self.identifier = [identifier] + + self.sort_by_time = sort_by_time + self.only_union_types = only_union_types + + self.__lrs: dict[int, _LogFileReader] = {} + self.reset() + + def _get_lr(self, i): + if i not in self.__lrs: + self.__lrs[i] = _LogFileReader(self.logreader_identifiers[i], sort_by_time=self.sort_by_time, only_union_types=self.only_union_types) + return self.__lrs[i] + + def __iter__(self): + for i in range(len(self.logreader_identifiers)): + yield from self._get_lr(i) + + def _run_on_segment(self, func, i): + return func(self._get_lr(i)) + + def run_across_segments(self, num_processes, func, disable_tqdm=False, desc=None): + with multiprocessing.Pool(num_processes) as pool: + ret = [] + num_segs = len(self.logreader_identifiers) + for p in tqdm.tqdm(pool.imap(partial(self._run_on_segment, func), range(num_segs)), total=num_segs, disable=disable_tqdm, desc=desc): + ret.extend(p) + return ret + + def reset(self): + self.logreader_identifiers = [] + for identifier in self.identifier: + self.logreader_identifiers.extend(self._parse_identifier(identifier)) + + @staticmethod + def from_bytes(dat): + return _LogFileReader("", dat=dat) + + def filter(self, msg_type: str): + return (getattr(m, m.which()) for m in filter(lambda m: m.which() == msg_type, self)) + + def first(self, msg_type: str): + return next(self.filter(msg_type), None) + + @property + def time_series(self): + return msgs_to_time_series(self) + + +if __name__ == "__main__": + import codecs + + # capnproto <= 0.8.0 throws errors converting byte data to string + # below line catches those errors and replaces the bytes with \x__ + codecs.register_error("strict", codecs.backslashreplace_errors) + log_path = sys.argv[1] + lr = LogReader(log_path, sort_by_time=True) + for msg in lr: + print(msg) diff --git a/iqpilot/tools/lib/route.py b/iqpilot/tools/lib/route.py new file mode 100644 index 000000000..f3fa74f5a --- /dev/null +++ b/iqpilot/tools/lib/route.py @@ -0,0 +1,382 @@ +import os +import re +import requests +from functools import cache +from urllib.parse import urlparse +from collections import defaultdict +from itertools import chain + +from iqpilot.tools.lib.api import APIError, CommaApi, get_token + + +class RE: + DONGLE_ID = r'(?P[a-f0-9]{16})' + TIMESTAMP = r'(?P[0-9]{4}-[0-9]{2}-[0-9]{2}--[0-9]{2}-[0-9]{2}-[0-9]{2})' + LOG_ID_V2 = r'(?P[a-f0-9]{8})--(?P[a-z0-9]{10})' + LOG_ID = fr'(?P(?:{TIMESTAMP}|{LOG_ID_V2}))' + ROUTE_NAME = fr'(?P{DONGLE_ID}[|_/]{LOG_ID})' + SEGMENT_NAME = fr'{ROUTE_NAME}(?:--|/)(?P[0-9]+)' + INDEX = r'-?[0-9]+' + SLICE = fr'(?P{INDEX})?:?(?P{INDEX})?:?(?P{INDEX})?' + SEGMENT_RANGE = fr'{ROUTE_NAME}(?:(--|/)(?P({SLICE})))?(?:/(?P([qra])))?' + BOOTLOG_NAME = ROUTE_NAME + EXPLORER_FILE = fr'^(?P{SEGMENT_NAME})--(?P[a-z]+\.[a-z0-9]+)$' + OP_SEGMENT_DIR = fr'^(?P{SEGMENT_NAME})$' + + +class FileName: + RLOG = ("rlog.zst", "rlog.bz2") + QLOG = ("qlog.zst", "qlog.bz2") + QCAMERA = ('qcamera.ts',) + FCAMERA = ('fcamera.hevc',) + ECAMERA = ('ecamera.hevc',) + DCAMERA = ('dcamera.hevc',) + BOOTLOG = ('bootlog.zst', 'bootlog.bz2') + + +class Route: + def __init__(self, name, data_dir=None): + self._name = RouteName(name) + self.files = None + if data_dir is not None: + self._segments = self._get_segments_local(data_dir) + else: + self._segments = self._get_segments_remote() + self.max_seg_number = self._segments[-1].name.segment_num + + @property + def name(self): + return self._name + + @property + def segments(self): + return self._segments + + def log_paths(self): + log_path_by_seg_num = {s.name.segment_num: s.log_path for s in self._segments} + return [log_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] + + def qlog_paths(self): + qlog_path_by_seg_num = {s.name.segment_num: s.qlog_path for s in self._segments} + return [qlog_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] + + def camera_paths(self): + camera_path_by_seg_num = {s.name.segment_num: s.camera_path for s in self._segments} + return [camera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] + + def dcamera_paths(self): + dcamera_path_by_seg_num = {s.name.segment_num: s.dcamera_path for s in self._segments} + return [dcamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] + + def ecamera_paths(self): + ecamera_path_by_seg_num = {s.name.segment_num: s.ecamera_path for s in self._segments} + return [ecamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] + + def qcamera_paths(self): + qcamera_path_by_seg_num = {s.name.segment_num: s.qcamera_path for s in self._segments} + return [qcamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] + + # TODO: refactor this, it's super repetitive + def _get_segments_remote(self): + api = CommaApi(get_token()) + route_files = api.get('v1/route/' + self.name.canonical_name + '/files') + self.files = [f['url'] if isinstance(f, dict) else f + for f in chain.from_iterable(route_files.values())] + + segments = {} + for url in self.files: + _, dongle_id, time_str, segment_num, fn = urlparse(url).path.rsplit('/', maxsplit=4) + segment_name = f'{dongle_id}|{time_str}--{segment_num}' + if segments.get(segment_name): + segments[segment_name] = Segment( + segment_name, + url if fn in FileName.RLOG else segments[segment_name].log_path, + url if fn in FileName.QLOG else segments[segment_name].qlog_path, + url if fn in FileName.FCAMERA else segments[segment_name].camera_path, + url if fn in FileName.DCAMERA else segments[segment_name].dcamera_path, + url if fn in FileName.ECAMERA else segments[segment_name].ecamera_path, + url if fn in FileName.QCAMERA else segments[segment_name].qcamera_path, + ) + else: + segments[segment_name] = Segment( + segment_name, + url if fn in FileName.RLOG else None, + url if fn in FileName.QLOG else None, + url if fn in FileName.FCAMERA else None, + url if fn in FileName.DCAMERA else None, + url if fn in FileName.ECAMERA else None, + url if fn in FileName.QCAMERA else None, + ) + + return sorted(segments.values(), key=lambda seg: seg.name.segment_num) + + def _get_segments_local(self, data_dir): + files = os.listdir(data_dir) + segment_files = defaultdict(list) + + for f in files: + fullpath = os.path.join(data_dir, f) + explorer_match = re.match(RE.EXPLORER_FILE, f) + op_match = re.match(RE.OP_SEGMENT_DIR, f) + + if explorer_match: + segment_name = explorer_match.group('segment_name') + fn = explorer_match.group('file_name') + if segment_name.replace('_', '|').startswith(self.name.canonical_name): + segment_files[segment_name].append((fullpath, fn)) + elif op_match and os.path.isdir(fullpath): + segment_name = op_match.group('segment_name') + if segment_name.startswith(self.name.canonical_name): + for seg_f in os.listdir(fullpath): + segment_files[segment_name].append((os.path.join(fullpath, seg_f), seg_f)) + elif f == self.name.canonical_name: + for seg_num in os.listdir(fullpath): + if not seg_num.isdigit(): + continue + + segment_name = f'{self.name.canonical_name}--{seg_num}' + for seg_f in os.listdir(os.path.join(fullpath, seg_num)): + segment_files[segment_name].append((os.path.join(fullpath, seg_num, seg_f), seg_f)) + + segments = [] + for segment, files in segment_files.items(): + + try: + log_path = next(path for path, filename in files if filename in FileName.RLOG) + except StopIteration: + log_path = None + + try: + qlog_path = next(path for path, filename in files if filename in FileName.QLOG) + except StopIteration: + qlog_path = None + + try: + camera_path = next(path for path, filename in files if filename in FileName.FCAMERA) + except StopIteration: + camera_path = None + + try: + dcamera_path = next(path for path, filename in files if filename in FileName.DCAMERA) + except StopIteration: + dcamera_path = None + + try: + ecamera_path = next(path for path, filename in files if filename in FileName.ECAMERA) + except StopIteration: + ecamera_path = None + + try: + qcamera_path = next(path for path, filename in files if filename in FileName.QCAMERA) + except StopIteration: + qcamera_path = None + + segments.append(Segment(segment, log_path, qlog_path, camera_path, dcamera_path, ecamera_path, qcamera_path)) + + if len(segments) == 0: + raise ValueError(f'Could not find segments for route {self.name.canonical_name} in data directory {data_dir}') + return sorted(segments, key=lambda seg: seg.name.segment_num) + + +class Segment: + def __init__(self, name, log_path, qlog_path, camera_path, dcamera_path, ecamera_path, qcamera_path): + self._events = None + self._name = SegmentName(name) + self.log_path = log_path + self.qlog_path = qlog_path + self.camera_path = camera_path + self.dcamera_path = dcamera_path + self.ecamera_path = ecamera_path + self.qcamera_path = qcamera_path + + @property + def name(self): + return self._name + + @staticmethod + @cache + def _get_route_metadata(route_name: str): + api = CommaApi(get_token()) + return api.get(f'v1/route/{route_name}') + + @property + def url(self): + route_name = self._name.route_name.canonical_name + metadata = self._get_route_metadata(route_name) + return f'{metadata["url"]}/{self._name.segment_num}' + + @property + def events(self): + if not self._events: + try: + resp = requests.get(f'{self.url}/events.json') + resp.raise_for_status() + self._events = resp.json() + except Exception as e: + raise APIError(f'error getting events for segment {self._name}') from e + return self._events + + +class RouteName: + def __init__(self, name_str: str): + self._name_str = name_str + delim = next(c for c in self._name_str if c in ("|", "/")) + self._dongle_id, self._time_str = self._name_str.split(delim) + + assert len(self._dongle_id) == 16, self._name_str + assert len(self._time_str) == 20, self._name_str + self._canonical_name = f"{self._dongle_id}|{self._time_str}" + + @property + def canonical_name(self) -> str: return self._canonical_name + + @property + def dongle_id(self) -> str: return self._dongle_id + + @property + def log_id(self) -> str: return self._time_str + + @property + def time_str(self) -> str: return self._time_str + + @property + def azure_prefix(self): + return f'{self.dongle_id}/{self.log_id}' + + def __str__(self) -> str: return self._canonical_name + + +class SegmentName: + # TODO: add constructor that takes dongle_id, time_str, segment_num and then create instances + # of this class instead of manually constructing a segment name (use canonical_name prop instead) + def __init__(self, name_str: str, allow_route_name=False): + data_dir_path_separator_index = name_str.rsplit("|", 1)[0].rfind("/") + use_data_dir = (data_dir_path_separator_index != -1) and ("|" in name_str) + self._name_str = name_str[data_dir_path_separator_index + 1:] if use_data_dir else name_str + self._data_dir = name_str[:data_dir_path_separator_index] if use_data_dir else None + + seg_num_delim = "--" if self._name_str.count("--") == 2 else "/" + name_parts = self._name_str.rsplit(seg_num_delim, 1) + if allow_route_name and len(name_parts) == 1: + name_parts.append("-1") # no segment number + self._route_name = RouteName(name_parts[0]) + self._num = int(name_parts[1]) + self._canonical_name = f"{self._route_name._dongle_id}|{self._route_name._time_str}--{self._num}" + + @property + def canonical_name(self) -> str: return self._canonical_name + + # TODO should only use one name + @property + def data_name(self) -> str: return f"{self._route_name.canonical_name}/{self._num}" + + @property + def azure_prefix(self): + return f'{self.dongle_id}/{self.log_id}/{self._num}' + + @property + def dongle_id(self) -> str: return self._route_name.dongle_id + + @property + def time_str(self) -> str: return self._route_name.time_str + + @property + def log_id(self) -> str: return self._route_name.time_str + + @property + def segment_num(self) -> int: return self._num + + @property + def route_name(self) -> RouteName: return self._route_name + + @property + def data_dir(self) -> str | None: return self._data_dir + + def __str__(self) -> str: return self._canonical_name + + @staticmethod + def from_file_name(file_name): + # ??????/xxxxxxxxxxxxxxxx|1111-11-11-11--11-11-11/1/rlog.bz2 + dongle_id, route_name, segment_num = file_name.replace('|', '/').split('/')[-4:-1] + return SegmentName(dongle_id + "|" + route_name + "--" + segment_num) + + @staticmethod + def from_device_key(dongle_id, key): + # 2018-05-07--18-56-13--5/rlog.bz2 + segment_name = key.split('/')[0] + return SegmentName(dongle_id + "|" + segment_name) + + @staticmethod + def from_file_key(key): + # 38c52c217150700f/2018-05-07--18-56-13/5/rlog.bz2 + az_prefix = '/'.join(key.split('/')[:3]) + return SegmentName.from_azure_prefix(az_prefix) + + @staticmethod + def from_azure_prefix(prefix): + # xxxxxxxx/1111-11-11-11--11-11-11/0 + dongle_id, route_name, segment_num = prefix.split("/") + return SegmentName(dongle_id + "|" + route_name + "--" + segment_num) + + +@cache +def get_max_seg_number_cached(sr: 'SegmentRange') -> int: + try: + api = CommaApi(get_token()) + max_seg_number = api.get("/v1/route/" + sr.route_name.replace("/", "|"))["maxqlog"] + assert isinstance(max_seg_number, int) + return max_seg_number + except Exception as e: + raise Exception("unable to get max_segment_number. ensure you have access to this route or the route is public.") from e + + +class SegmentRange: + def __init__(self, segment_range: str): + m = re.fullmatch(RE.SEGMENT_RANGE, segment_range) + assert m is not None, f"Segment range is not valid {segment_range}" + self.m = m + + @property + def route_name(self) -> str: + return self.m.group("route_name") + + @property + def dongle_id(self) -> str: + return self.m.group("dongle_id") + + @property + def log_id(self) -> str: + return self.m.group("log_id") + + @property + def slice(self) -> str: + return self.m.group("slice") or "" + + @property + def selector(self) -> str | None: + return self.m.group("selector") + + @property + def seg_idxs(self) -> list[int]: + m = re.fullmatch(RE.SLICE, self.slice) + assert m is not None, f"Invalid slice: {self.slice}" + start, end, step = (None if s is None else int(s) for s in m.groups()) + + # one segment specified + if start is not None and end is None and ':' not in self.slice: + if start < 0: + start += get_max_seg_number_cached(self) + 1 + return [start] + + s = slice(start, end, step) + # no specified end or using relative indexing, need number of segments + if end is None or end < 0 or (start is not None and start < 0): + return list(range(get_max_seg_number_cached(self) + 1))[s] + else: + return list(range(end + 1))[s] + + def __str__(self) -> str: + return f"{self.dongle_id}/{self.log_id}" + (f"/{self.slice}" if self.slice else "") + (f"/{self.selector}" if self.selector else "") + + def __repr__(self) -> str: + return self.__str__() diff --git a/iqpilot/tools/lib/tests/__init__.py b/iqpilot/tools/lib/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/iqpilot/tools/lib/tests/test_caching.py b/iqpilot/tools/lib/tests/test_caching.py new file mode 100644 index 000000000..8e4989adb --- /dev/null +++ b/iqpilot/tools/lib/tests/test_caching.py @@ -0,0 +1,191 @@ +import http.server +import multiprocessing +import os +import shutil +import socket +import tempfile +import pytest + +from iqpilot.selfdrive.test.helpers import http_server_context +from iqpilot.system.hardware.hw import Paths +from iqpilot.tools.lib.url_file import URLFile, prune_cache +import iqpilot.tools.lib.url_file as url_file_module + + +def concurrent_prune_cache(cache_root, entry, barrier): + Paths.download_cache_root = staticmethod(lambda: cache_root) + barrier.wait() + prune_cache(entry) + + +class CachingTestRequestHandler(http.server.BaseHTTPRequestHandler): + FILE_EXISTS = True + + def do_GET(self): + if self.FILE_EXISTS: + self.send_response(206 if "Range" in self.headers else 200, b'1234') + else: + self.send_response(404) + self.end_headers() + + def do_HEAD(self): + if self.FILE_EXISTS: + self.send_response(200) + self.send_header("Content-Length", "4") + else: + self.send_response(404) + self.end_headers() + + +@pytest.fixture +def host(): + with http_server_context(handler=CachingTestRequestHandler) as (host, port): + yield f"http://{host}:{port}" + +class TestFileDownload: + + def test_pipeline_defaults(self, host): + # TODO: parameterize the defaults so we don't rely on hard-coded values in xx + + assert URLFile.pool_manager().pools._maxsize == 10# PoolManager num_pools param + pool_manager_defaults = { + "maxsize": 100, + "socket_options": [(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),], + } + for k, v in pool_manager_defaults.items(): + assert URLFile.pool_manager().connection_pool_kw.get(k) == v + + retry_defaults = { + "total": 6, + "backoff_factor": 0.75, + "status_forcelist": [409, 429, 500, 502, 503, 504], + } + for k, v in retry_defaults.items(): + assert getattr(URLFile.pool_manager().connection_pool_kw["retries"], k) == v + + # ensure caching on by default and cache dir gets created + os.environ.pop("DISABLE_FILEREADER_CACHE", None) + if os.path.exists(Paths.download_cache_root()): + shutil.rmtree(Paths.download_cache_root()) + URLFile(f"{host}/test.txt").get_length() + URLFile(f"{host}/test.txt").read() + assert os.path.exists(Paths.download_cache_root()) + + def compare_loads(self, url, start=0, length=None): + """Compares range between cached and non cached version""" + file_cached = URLFile(url, cache=True) + file_downloaded = URLFile(url, cache=False) + + file_cached.seek(start) + file_downloaded.seek(start) + + assert file_cached.get_length() == file_downloaded.get_length() + assert length + start if length is not None else 0 <= file_downloaded.get_length() + + response_cached = file_cached.read(ll=length) + response_downloaded = file_downloaded.read(ll=length) + + assert response_cached == response_downloaded + + # Now test with cache in place + file_cached = URLFile(url, cache=True) + file_cached.seek(start) + response_cached = file_cached.read(ll=length) + + assert file_cached.get_length() == file_downloaded.get_length() + assert response_cached == response_downloaded + + def test_small_file(self): + # Make sure we don't force cache + os.environ.pop("DISABLE_FILEREADER_CACHE", None) + small_file_url = "https://raw.githubusercontent.com/commaai/openpilot/master/docs/SAFETY.md" + # If you want large file to be larger than a chunk + # large_file_url = "https://commadataci.blob.core.windows.net/openpilotci/0375fdf7b1ce594d/2019-06-13--08-32-25/3/fcamera.hevc" + + # Load full small file + self.compare_loads(small_file_url) + + file_small = URLFile(small_file_url) + length = file_small.get_length() + + self.compare_loads(small_file_url, length - 100, 100) + self.compare_loads(small_file_url, 50, 100) + + # Load small file 100 bytes at a time + for i in range(length // 100): + self.compare_loads(small_file_url, 100 * i, 100) + + def test_large_file(self): + large_file_url = "https://commadataci.blob.core.windows.net/openpilotci/0375fdf7b1ce594d/2019-06-13--08-32-25/3/qlog.bz2" + # Load the end 100 bytes of both files + file_large = URLFile(large_file_url) + length = file_large.get_length() + + self.compare_loads(large_file_url, length - 100, 100) + self.compare_loads(large_file_url) + + @pytest.mark.parametrize("cache_enabled", [True, False]) + def test_recover_from_missing_file(self, host, cache_enabled): + if cache_enabled: + os.environ.pop("DISABLE_FILEREADER_CACHE", None) + else: + os.environ["DISABLE_FILEREADER_CACHE"] = "1" + + file_url = f"{host}/test.png" + + CachingTestRequestHandler.FILE_EXISTS = False + length = URLFile(file_url).get_length() + assert length == -1 + + CachingTestRequestHandler.FILE_EXISTS = True + length = URLFile(file_url).get_length() + assert length == 4 + + +class TestCache: + def test_concurrent_prune_cache(self, tmp_path): + context = multiprocessing.get_context("fork") + barrier = context.Barrier(16) + processes = [context.Process(target=concurrent_prune_cache, args=(f"{tmp_path}/", f"entry_{i}", barrier)) for i in range(16)] + for process in processes: + process.start() + for process in processes: + process.join(10) + assert process.exitcode == 0 + + manifest = set() + for line in (tmp_path / "manifest.txt").read_text().splitlines(): + parts = line.split() + if len(parts) == 2: + manifest.add(parts[0]) + assert manifest == {f"entry_{i}" for i in range(16)} + + def test_prune_cache(self, monkeypatch): + with tempfile.TemporaryDirectory() as tmpdir: + monkeypatch.setattr(Paths, 'download_cache_root', staticmethod(lambda: tmpdir + "/")) + + # setup test files and manifest + manifest_lines = [] + for i in range(3): + fname = f"hash_{i}" + with open(tmpdir + "/" + fname, "wb") as f: + f.truncate(1000) + manifest_lines.append(f"{fname} {1000 + i}") + with open(tmpdir + "/manifest.txt", "w") as f: + f.write('\n'.join(manifest_lines)) + + # under limit, shouldn't prune + assert len(os.listdir(tmpdir)) == 4 + prune_cache() + assert len([name for name in os.listdir(tmpdir) if name != "manifest.lock"]) == 4 + + # set a tiny cache limit to force eviction (1.5 chunks worth) + monkeypatch.setattr(url_file_module, 'CACHE_SIZE', url_file_module.CHUNK_SIZE + url_file_module.CHUNK_SIZE // 2) + + # prune_cache should evict oldest files to get under limit + prune_cache() + remaining = [name for name in os.listdir(tmpdir) if name != "manifest.lock"] + # should have evicted at least one file + manifest + assert len(remaining) < 4 + # newest file should remain + assert manifest_lines[2].split()[0] in remaining diff --git a/iqpilot/tools/lib/tests/test_logreader.py b/iqpilot/tools/lib/tests/test_logreader.py new file mode 100644 index 000000000..179fd8f7e --- /dev/null +++ b/iqpilot/tools/lib/tests/test_logreader.py @@ -0,0 +1,176 @@ +import capnp +import contextlib +import shutil +import tempfile +import os +import pytest +import requests + +from parameterized import parameterized + +from iqpilot.cereal import log as capnp_log +from iqpilot.tools.lib.logreader import InternalUnavailableException, LogReader, parse_indirect +from iqpilot.tools.lib.route import SegmentRange +from iqpilot.tools.lib.url_file import URLFileException + +NUM_SEGS = 17 # number of segments in the test route +ALL_SEGS = list(range(NUM_SEGS)) +TEST_ROUTE = "344c5c15b34f2d8a/2024-01-03--09-37-12" +QLOG_FILE = "https://commadataci.blob.core.windows.net/openpilotci/0375fdf7b1ce594d/2019-06-13--08-32-25/3/qlog.bz2" + + +@contextlib.contextmanager +def setup_source_scenario(mocker, is_internal=False): + internal_source_mock = mocker.patch("iqpilot.tools.lib.logreader.internal_source") + internal_source_mock.__name__ = internal_source_mock._mock_name + + openpilotci_source_mock = mocker.patch("iqpilot.tools.lib.logreader.openpilotci_source") + openpilotci_source_mock.__name__ = openpilotci_source_mock._mock_name + + comma_api_source_mock = mocker.patch("iqpilot.tools.lib.logreader.comma_api_source") + comma_api_source_mock.__name__ = comma_api_source_mock._mock_name + + if is_internal: + internal_source_mock.return_value = {3: QLOG_FILE} + else: + internal_source_mock.side_effect = InternalUnavailableException + + openpilotci_source_mock.return_value = {} + comma_api_source_mock.return_value = {3: QLOG_FILE} + + yield + + +class TestLogReader: + @pytest.mark.parametrize(("identifier", "expected"), [ + (f"{TEST_ROUTE}", ALL_SEGS), + (f"{TEST_ROUTE.replace('/', '|')}", ALL_SEGS), + (f"{TEST_ROUTE}--0", [0]), + (f"{TEST_ROUTE}--5", [5]), + (f"{TEST_ROUTE}/0", [0]), + (f"{TEST_ROUTE}/5", [5]), + (f"{TEST_ROUTE}/0:10", ALL_SEGS[0:10]), + (f"{TEST_ROUTE}/0:0", []), + (f"{TEST_ROUTE}/4:6", ALL_SEGS[4:6]), + (f"{TEST_ROUTE}/0:-1", ALL_SEGS[0:-1]), + (f"{TEST_ROUTE}/:5", ALL_SEGS[:5]), + (f"{TEST_ROUTE}/2:", ALL_SEGS[2:]), + (f"{TEST_ROUTE}/2:-1", ALL_SEGS[2:-1]), + (f"{TEST_ROUTE}/-1", [ALL_SEGS[-1]]), + (f"{TEST_ROUTE}/-2", [ALL_SEGS[-2]]), + (f"{TEST_ROUTE}/-2:-1", ALL_SEGS[-2:-1]), + (f"{TEST_ROUTE}/-4:-2", ALL_SEGS[-4:-2]), + (f"{TEST_ROUTE}/:10:2", ALL_SEGS[:10:2]), + (f"{TEST_ROUTE}/5::2", ALL_SEGS[5::2]), + (f"https://useradmin.comma.ai/?onebox={TEST_ROUTE}", ALL_SEGS), + (f"https://useradmin.comma.ai/?onebox={TEST_ROUTE.replace('/', '|')}", ALL_SEGS), + (f"https://useradmin.comma.ai/?onebox={TEST_ROUTE.replace('/', '%7C')}", ALL_SEGS), + ]) + def test_indirect_parsing(self, identifier, expected, mocker): + mocker.patch("iqpilot.tools.lib.route.get_max_seg_number_cached", return_value=NUM_SEGS - 1) + parsed = parse_indirect(identifier) + sr = SegmentRange(parsed) + assert list(sr.seg_idxs) == expected, identifier + + @parameterized.expand([ + (f"{TEST_ROUTE}", f"{TEST_ROUTE}"), + (f"{TEST_ROUTE.replace('/', '|')}", f"{TEST_ROUTE}"), + (f"{TEST_ROUTE}--5", f"{TEST_ROUTE}/5"), + (f"{TEST_ROUTE}/0/q", f"{TEST_ROUTE}/0/q"), + (f"{TEST_ROUTE}/5:6/r", f"{TEST_ROUTE}/5:6/r"), + (f"{TEST_ROUTE}/5", f"{TEST_ROUTE}/5"), + ]) + def test_canonical_name(self, identifier, expected): + sr = SegmentRange(identifier) + assert str(sr) == expected + + @pytest.mark.parametrize("cache_enabled", [True, False]) + def test_direct_parsing(self, mocker, cache_enabled): + file_exists_mock = mocker.patch("iqpilot.tools.lib.filereader.file_exists") + if cache_enabled: + os.environ.pop("DISABLE_FILEREADER_CACHE", None) + else: + os.environ["DISABLE_FILEREADER_CACHE"] = "1" + qlog = tempfile.NamedTemporaryFile(mode='wb', delete=False) + + with requests.get(QLOG_FILE, stream=True) as r: + with qlog as f: + shutil.copyfileobj(r.raw, f) + + for f in [QLOG_FILE, qlog.name]: + l = len(list(LogReader(f))) + assert l > 100 + + with pytest.raises(URLFileException) if not cache_enabled else pytest.raises(AssertionError): + l = len(list(LogReader(QLOG_FILE.replace("/3/", "/200/")))) + + # file_exists should not be called for direct files + assert file_exists_mock.call_count == 0 + + @parameterized.expand([ + (f"{TEST_ROUTE}///",), + (f"{TEST_ROUTE}---",), + (f"{TEST_ROUTE}/-4:--2",), + (f"{TEST_ROUTE}/-a",), + (f"{TEST_ROUTE}/j",), + (f"{TEST_ROUTE}/0:1:2:3",), + (f"{TEST_ROUTE}/:::3",), + (f"{TEST_ROUTE}3",), + (f"{TEST_ROUTE}-3",), + (f"{TEST_ROUTE}--3a",), + ]) + def test_bad_ranges(self, segment_range): + with pytest.raises(AssertionError): + _ = SegmentRange(segment_range).seg_idxs + + @pytest.mark.parametrize("segment_range, api_call", [ + (f"{TEST_ROUTE}/0", False), + (f"{TEST_ROUTE}/:2", False), + (f"{TEST_ROUTE}/0:", True), + (f"{TEST_ROUTE}/-1", True), + (f"{TEST_ROUTE}", True), + ]) + def test_slicing_api_call(self, mocker, segment_range, api_call): + max_seg_mock = mocker.patch("iqpilot.tools.lib.route.get_max_seg_number_cached") + max_seg_mock.return_value = NUM_SEGS + _ = SegmentRange(segment_range).seg_idxs + assert api_call == max_seg_mock.called + + @pytest.mark.parametrize("is_internal", [True, False]) + def test_auto_source_scenarios(self, mocker, is_internal): + lr = LogReader(QLOG_FILE) + qlog_len = len(list(lr)) + + with setup_source_scenario(mocker, is_internal=is_internal): + lr = LogReader(f"{TEST_ROUTE}/3/q") + log_len = len(list(lr)) + assert qlog_len == log_len + + def test_only_union_types(self): + with tempfile.NamedTemporaryFile() as qlog: + # write valid Event messages + num_msgs = 100 + with open(qlog.name, "wb") as f: + f.write(b"".join(capnp_log.Event.new_message().to_bytes() for _ in range(num_msgs))) + + msgs = list(LogReader(qlog.name)) + assert len(msgs) == num_msgs + [m.which() for m in msgs] + + # append non-union Event message + event_msg = capnp_log.Event.new_message() + non_union_bytes = bytearray(event_msg.to_bytes()) + non_union_bytes[event_msg.total_size.word_count * 8] = 0xff # set discriminant value out of range using Event word offset + with open(qlog.name, "ab") as f: + f.write(non_union_bytes) + + # ensure new message is added, but is not a union type + msgs = list(LogReader(qlog.name)) + assert len(msgs) == num_msgs + 1 + with pytest.raises((capnp.KjException, RuntimeError)): + [m.which() for m in msgs] + + # should not be added when only_union_types=True + msgs = list(LogReader(qlog.name, only_union_types=True)) + assert len(msgs) == num_msgs + [m.which() for m in msgs] diff --git a/iqpilot/tools/lib/tests/test_route_library.py b/iqpilot/tools/lib/tests/test_route_library.py new file mode 100644 index 000000000..4be43a9cc --- /dev/null +++ b/iqpilot/tools/lib/tests/test_route_library.py @@ -0,0 +1,27 @@ +from collections import namedtuple + +from iqpilot.tools.lib.route import SegmentName + +class TestRouteLibrary: + def test_segment_name_formats(self): + Case = namedtuple('Case', ['input', 'expected_route', 'expected_segment_num', 'expected_data_dir']) + + cases = [ Case("a2a0ccea32023010|2023-07-27--13-01-19", "a2a0ccea32023010|2023-07-27--13-01-19", -1, None), + Case("a2a0ccea32023010/2023-07-27--13-01-19--1", "a2a0ccea32023010|2023-07-27--13-01-19", 1, None), + Case("a2a0ccea32023010|2023-07-27--13-01-19/2", "a2a0ccea32023010|2023-07-27--13-01-19", 2, None), + Case("a2a0ccea32023010/2023-07-27--13-01-19/3", "a2a0ccea32023010|2023-07-27--13-01-19", 3, None), + Case("/data/media/0/realdata/a2a0ccea32023010|2023-07-27--13-01-19", "a2a0ccea32023010|2023-07-27--13-01-19", -1, "/data/media/0/realdata"), + Case("/data/media/0/realdata/a2a0ccea32023010|2023-07-27--13-01-19--1", "a2a0ccea32023010|2023-07-27--13-01-19", 1, "/data/media/0/realdata"), + Case("/data/media/0/realdata/a2a0ccea32023010|2023-07-27--13-01-19/2", "a2a0ccea32023010|2023-07-27--13-01-19", 2, "/data/media/0/realdata") ] + + def _validate(case): + route_or_segment_name = case.input + + s = SegmentName(route_or_segment_name, allow_route_name=True) + + assert str(s.route_name) == case.expected_route + assert s.segment_num == case.expected_segment_num + assert s.data_dir == case.expected_data_dir + + for case in cases: + _validate(case) diff --git a/iqpilot/tools/lib/url_file.py b/iqpilot/tools/lib/url_file.py new file mode 100644 index 000000000..5200bb019 --- /dev/null +++ b/iqpilot/tools/lib/url_file.py @@ -0,0 +1,252 @@ +import logging +import fcntl +import os +import re +import socket +import time +from hashlib import md5 +from urllib3 import PoolManager, Retry +from urllib3.response import BaseHTTPResponse +from urllib3.util import Timeout + +from iqpilot.common.utils import atomic_write +from iqpilot.system.hardware.hw import Paths +from urllib3.exceptions import MaxRetryError + +# Cache chunk size +K = 1000 +CHUNK_SIZE = 1000 * K +CACHE_SIZE = 10 * 1024 * 1024 * 1024 # total cache size in GB + +logging.getLogger("urllib3").setLevel(logging.WARNING) + + +USER_AGENT = os.getenv("IQPILOT_HTTP_USER_AGENT", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36") + + +def _env_int(name: str, default: int) -> int: + raw = os.getenv(name) + if raw is None: + return default + try: + value = int(raw) + return value if value > 0 else default + except ValueError: + return default + + +def hash_url(link: str) -> str: + return md5((link.split("?")[0]).encode('utf-8')).hexdigest() + + +def prune_cache(new_entry: str | None = None) -> None: + """Evicts oldest cache files (LRU) until cache is under the size limit.""" + cache_root = Paths.download_cache_root() + os.makedirs(cache_root, exist_ok=True) + manifest_path = os.path.join(cache_root, "manifest.txt") + with open(os.path.join(cache_root, "manifest.lock"), "w") as lock_file: + fcntl.flock(lock_file, fcntl.LOCK_EX) + manifest = {} + try: + with open(manifest_path) as f: + manifest = {parts[0]: int(parts[1]) for line in f if (parts := line.strip().split()) and len(parts) == 2} + except FileNotFoundError: + pass + + if new_entry: + manifest[new_entry] = int(time.time()) # noqa: TID251 + + sorted_items = sorted(manifest.items(), key=lambda x: x[1]) + while len(manifest) * CHUNK_SIZE > CACHE_SIZE and sorted_items: + key, _ = sorted_items.pop(0) + try: + os.remove(os.path.join(cache_root, key)) + except OSError: + pass + manifest.pop(key, None) + + with atomic_write(manifest_path, mode="w", overwrite=True) as f: + f.write('\n'.join(f"{k} {v}" for k, v in manifest.items())) + +class URLFileException(Exception): + pass + + +class URLFile: + _pool_manager: PoolManager | None = None + + @staticmethod + def reset() -> None: + URLFile._pool_manager = None + + @staticmethod + def pool_manager() -> PoolManager: + if URLFile._pool_manager is None: + socket_options = [(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)] + retries = Retry( + total=_env_int("URLFILE_RETRIES_TOTAL", 6), + connect=_env_int("URLFILE_RETRIES_CONNECT", 6), + read=_env_int("URLFILE_RETRIES_READ", 6), + backoff_factor=float(os.getenv("URLFILE_RETRIES_BACKOFF", "0.75")), + status_forcelist=[409, 429, 500, 502, 503, 504], + ) + URLFile._pool_manager = PoolManager(num_pools=10, maxsize=100, socket_options=socket_options, retries=retries) + return URLFile._pool_manager + + def __init__(self, url: str, timeout: int = 10, cache: bool | None = None): + self._url = url + connect_timeout = _env_int("URLFILE_CONNECT_TIMEOUT", min(timeout, 10)) + read_timeout = _env_int("URLFILE_READ_TIMEOUT", max(timeout, 30)) + total_timeout = _env_int("URLFILE_TOTAL_TIMEOUT", max(read_timeout * 4, 180)) + self._timeout = Timeout(connect=connect_timeout, read=read_timeout, total=total_timeout) + self._pos = 0 + self._length: int | None = None + # Caching enabled by default, can be disabled with DISABLE_FILEREADER_CACHE=1, or overwritten by the cache input + self._force_download = int(os.environ.get("DISABLE_FILEREADER_CACHE", "0")) == 1 + if cache is not None: + self._force_download = not cache + + if not self._force_download: + os.makedirs(Paths.download_cache_root(), exist_ok=True) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback) -> None: + pass + + def _request(self, method: str, url: str, headers: dict[str, str] | None = None) -> BaseHTTPResponse: + # the data host is behind cloudflare, which answers a default urllib3 agent + # with a 1010 block. It reads as 403 Forbidden on a correctly signed url, so + # it looks like an auth problem and is not one. + headers = {**(headers or {}), "User-Agent": USER_AGENT} + try: + return URLFile.pool_manager().request(method, url, timeout=self._timeout, headers=headers) + except MaxRetryError as e: + raise URLFileException(f"Failed to {method} {url}: {e}") from e + + def get_length_online(self) -> int: + response = self._request('HEAD', self._url) + if not (200 <= response.status <= 299): + return -1 + length = response.headers.get('content-length', 0) + return int(length) + + def get_length(self) -> int: + if self._length is not None: + return self._length + + file_length_path = os.path.join(Paths.download_cache_root(), hash_url(self._url) + "_length") + if not self._force_download and os.path.exists(file_length_path): + with open(file_length_path) as file_length: + content = file_length.read() + self._length = int(content) + return self._length + + self._length = self.get_length_online() + if not self._force_download and self._length != -1: + with atomic_write(file_length_path, mode="w", overwrite=True) as file_length: + file_length.write(str(self._length)) + return self._length + + def read(self, ll: int | None = None) -> bytes: + if self._force_download: + return self.read_aux(ll=ll) + + file_begin = self._pos + file_end = self._pos + ll if ll is not None else self.get_length() + assert file_end != -1, f"Remote file is empty or doesn't exist: {self._url}" + # We have to align with chunks we store. Position is the begginiing of the latest chunk that starts before or at our file + position = (file_begin // CHUNK_SIZE) * CHUNK_SIZE + response = b"" + while True: + self._pos = position + chunk_number = self._pos / CHUNK_SIZE + file_name = hash_url(self._url) + "_" + str(chunk_number) + full_path = os.path.join(Paths.download_cache_root(), str(file_name)) + data = None + # If we don't have a file, download it + if not os.path.exists(full_path): + data = self.read_aux(ll=CHUNK_SIZE) + with atomic_write(full_path, mode="wb", overwrite=True) as new_cached_file: + new_cached_file.write(data) + prune_cache(file_name) + else: + with open(full_path, "rb") as cached_file: + data = cached_file.read() + + response += data[max(0, file_begin - position): min(CHUNK_SIZE, file_end - position)] + + position += CHUNK_SIZE + if position >= file_end: + self._pos = file_end + return response + + def read_aux(self, ll: int | None = None) -> bytes: + if ll is None: + length = self.get_length() + if length == -1: + raise URLFileException(f"Remote file is empty or doesn't exist: {self._url}") + end = length + else: + end = self._pos + ll + data = self.get_multi_range([(self._pos, end)]) + self._pos += len(data[0]) + return data[0] + + def get_multi_range(self, ranges: list[tuple[int, int]]) -> list[bytes]: + # HTTP range requests are inclusive + assert all(e > s for s, e in ranges), "Range end must be greater than start" + rs = [f"{s}-{e-1}" for s, e in ranges if e > s] + + r = self._request("GET", self._url, headers={"Range": "bytes=" + ",".join(rs)}) + if r.status not in [200, 206]: + raise URLFileException(f"Expected 206 or 200 response {r.status} ({self._url})") + + ctype = (r.headers.get("content-type") or "").lower() + if "multipart/byteranges" not in ctype: + return [r.data,] + + m = re.search(r'boundary="?([^";]+)"?', ctype) + if not m: + raise URLFileException(f"Missing multipart boundary ({self._url})") + boundary = m.group(1).encode() + + parts = [] + for chunk in r.data.split(b"--" + boundary): + if b"\r\n\r\n" not in chunk: + continue + payload = chunk.split(b"\r\n\r\n", 1)[1].rstrip(b"\r\n") + if payload and payload != b"--": + parts.append(payload) + if len(parts) != len(ranges): + raise URLFileException(f"Expected {len(ranges)} parts, got {len(parts)} ({self._url})") + return parts + + def seekable(self) -> bool: + return True + + def seek(self, pos: int, whence: int = 0) -> int: + pos = int(pos) + if whence == os.SEEK_SET: + self._pos = pos + elif whence == os.SEEK_CUR: + self._pos += pos + elif whence == os.SEEK_END: + length = self.get_length() + assert length != -1, "Cannot seek from end on unknown length file" + self._pos = length + pos + else: + raise URLFileException("Invalid whence value") + return self._pos + + def tell(self) -> int: + return self._pos + + @property + def name(self) -> str: + return self._url + + +os.register_at_fork(after_in_child=URLFile.reset) diff --git a/iqpilot/tools/lib/vidindex.py b/iqpilot/tools/lib/vidindex.py new file mode 100755 index 000000000..b8587429a --- /dev/null +++ b/iqpilot/tools/lib/vidindex.py @@ -0,0 +1,311 @@ +#!/usr/bin/env python3 +import argparse +import os +import struct +from enum import IntEnum + +from iqpilot.tools.lib.filereader import FileReader + +DEBUG = int(os.getenv("DEBUG", "0")) + +# compare to ffmpeg parsing +# ffmpeg -i -c copy -bsf:v trace_headers -f null - 2>&1 | grep -B4 -A32 '] 0 ' + +# H.265 specification +# https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-H.265-201802-S!!PDF-E&type=items + +NAL_UNIT_START_CODE = b"\x00\x00\x01" +NAL_UNIT_START_CODE_SIZE = len(NAL_UNIT_START_CODE) +NAL_UNIT_HEADER_SIZE = 2 + +class HevcNalUnitType(IntEnum): + TRAIL_N = 0 # RBSP structure: slice_segment_layer_rbsp( ) + TRAIL_R = 1 # RBSP structure: slice_segment_layer_rbsp( ) + TSA_N = 2 # RBSP structure: slice_segment_layer_rbsp( ) + TSA_R = 3 # RBSP structure: slice_segment_layer_rbsp( ) + STSA_N = 4 # RBSP structure: slice_segment_layer_rbsp( ) + STSA_R = 5 # RBSP structure: slice_segment_layer_rbsp( ) + RADL_N = 6 # RBSP structure: slice_segment_layer_rbsp( ) + RADL_R = 7 # RBSP structure: slice_segment_layer_rbsp( ) + RASL_N = 8 # RBSP structure: slice_segment_layer_rbsp( ) + RASL_R = 9 # RBSP structure: slice_segment_layer_rbsp( ) + RSV_VCL_N10 = 10 + RSV_VCL_R11 = 11 + RSV_VCL_N12 = 12 + RSV_VCL_R13 = 13 + RSV_VCL_N14 = 14 + RSV_VCL_R15 = 15 + BLA_W_LP = 16 # RBSP structure: slice_segment_layer_rbsp( ) + BLA_W_RADL = 17 # RBSP structure: slice_segment_layer_rbsp( ) + BLA_N_LP = 18 # RBSP structure: slice_segment_layer_rbsp( ) + IDR_W_RADL = 19 # RBSP structure: slice_segment_layer_rbsp( ) + IDR_N_LP = 20 # RBSP structure: slice_segment_layer_rbsp( ) + CRA_NUT = 21 # RBSP structure: slice_segment_layer_rbsp( ) + RSV_IRAP_VCL22 = 22 + RSV_IRAP_VCL23 = 23 + RSV_VCL24 = 24 + RSV_VCL25 = 25 + RSV_VCL26 = 26 + RSV_VCL27 = 27 + RSV_VCL28 = 28 + RSV_VCL29 = 29 + RSV_VCL30 = 30 + RSV_VCL31 = 31 + VPS_NUT = 32 # RBSP structure: video_parameter_set_rbsp( ) + SPS_NUT = 33 # RBSP structure: seq_parameter_set_rbsp( ) + PPS_NUT = 34 # RBSP structure: pic_parameter_set_rbsp( ) + AUD_NUT = 35 + EOS_NUT = 36 + EOB_NUT = 37 + FD_NUT = 38 + PREFIX_SEI_NUT = 39 + SUFFIX_SEI_NUT = 40 + RSV_NVCL41 = 41 + RSV_NVCL42 = 42 + RSV_NVCL43 = 43 + RSV_NVCL44 = 44 + RSV_NVCL45 = 45 + RSV_NVCL46 = 46 + RSV_NVCL47 = 47 + UNSPEC48 = 48 + UNSPEC49 = 49 + UNSPEC50 = 50 + UNSPEC51 = 51 + UNSPEC52 = 52 + UNSPEC53 = 53 + UNSPEC54 = 54 + UNSPEC55 = 55 + UNSPEC56 = 56 + UNSPEC57 = 57 + UNSPEC58 = 58 + UNSPEC59 = 59 + UNSPEC60 = 60 + UNSPEC61 = 61 + UNSPEC62 = 62 + UNSPEC63 = 63 + +# B.2.2 Byte stream NAL unit semantics +# - The nal_unit_type within the nal_unit( ) syntax structure is equal to VPS_NUT, SPS_NUT or PPS_NUT. +# - The byte stream NAL unit syntax structure contains the first NAL unit of an access unit in decoding +# order, as specified in clause 7.4.2.4.4. +HEVC_PARAMETER_SET_NAL_UNITS = ( + HevcNalUnitType.VPS_NUT, + HevcNalUnitType.SPS_NUT, + HevcNalUnitType.PPS_NUT, +) + +# 3.29 coded slice segment NAL unit: A NAL unit that has nal_unit_type in the range of TRAIL_N to RASL_R, +# inclusive, or in the range of BLA_W_LP to RSV_IRAP_VCL23, inclusive, which indicates that the NAL unit +# contains a coded slice segment +HEVC_CODED_SLICE_SEGMENT_NAL_UNITS = ( + HevcNalUnitType.TRAIL_N, + HevcNalUnitType.TRAIL_R, + HevcNalUnitType.TSA_N, + HevcNalUnitType.TSA_R, + HevcNalUnitType.STSA_N, + HevcNalUnitType.STSA_R, + HevcNalUnitType.RADL_N, + HevcNalUnitType.RADL_R, + HevcNalUnitType.RASL_N, + HevcNalUnitType.RASL_R, + HevcNalUnitType.BLA_W_LP, + HevcNalUnitType.BLA_W_RADL, + HevcNalUnitType.BLA_N_LP, + HevcNalUnitType.IDR_W_RADL, + HevcNalUnitType.IDR_N_LP, + HevcNalUnitType.CRA_NUT, +) + +class VideoFileInvalid(Exception): + pass + +def get_ue(dat: bytes, start_idx: int, skip_bits: int) -> tuple[int, int]: + prefix_val = 0 + prefix_len = 0 + suffix_val = 0 + suffix_len = 0 + + i = start_idx + while i < len(dat): + j = 7 + while j >= 0: + if skip_bits > 0: + skip_bits -= 1 + elif prefix_val == 0: + prefix_val = (dat[i] >> j) & 1 + prefix_len += 1 + else: + suffix_val = (suffix_val << 1) | ((dat[i] >> j) & 1) + suffix_len += 1 + j -= 1 + + if prefix_val == 1 and prefix_len - 1 == suffix_len: + val = int(2**(prefix_len-1) - 1 + suffix_val) + size = prefix_len + suffix_len + return val, size + i += 1 + + raise VideoFileInvalid("invalid exponential-golomb code") + +def require_nal_unit_start(dat: bytes, nal_unit_start: int) -> None: + if nal_unit_start < 1: + raise ValueError("start index must be greater than zero") + + if dat[nal_unit_start:nal_unit_start + NAL_UNIT_START_CODE_SIZE] != NAL_UNIT_START_CODE: + raise VideoFileInvalid("data must begin with start code") + +def get_hevc_nal_unit_length(dat: bytes, nal_unit_start: int) -> int: + try: + pos = dat.index(NAL_UNIT_START_CODE, nal_unit_start + NAL_UNIT_START_CODE_SIZE) + except ValueError: + pos = -1 + + # length of NAL unit is byte count up to next NAL unit start index + nal_unit_len = (pos if pos != -1 else len(dat)) - nal_unit_start + if DEBUG: + print(" nal_unit_len:", nal_unit_len) + return nal_unit_len + +def get_hevc_nal_unit_type(dat: bytes, nal_unit_start: int) -> HevcNalUnitType: + # 7.3.1.2 NAL unit header syntax + # nal_unit_header( ) { // descriptor + # forbidden_zero_bit f(1) + # nal_unit_type u(6) + # nuh_layer_id u(6) + # nuh_temporal_id_plus1 u(3) + # } + header_start = nal_unit_start + NAL_UNIT_START_CODE_SIZE + nal_unit_header = dat[header_start:header_start + NAL_UNIT_HEADER_SIZE] + if len(nal_unit_header) != 2: + raise VideoFileInvalid("data to short to contain nal unit header") + nal_unit_type = HevcNalUnitType((nal_unit_header[0] >> 1) & 0x3F) + if DEBUG: + print(" nal_unit_type:", nal_unit_type.name, f"({nal_unit_type.value})") + return nal_unit_type + +def get_hevc_slice_type(dat: bytes, nal_unit_start: int, nal_unit_type: HevcNalUnitType) -> tuple[int, bool]: + # 7.3.2.9 Slice segment layer RBSP syntax + # slice_segment_layer_rbsp( ) { + # slice_segment_header( ) + # slice_segment_data( ) + # rbsp_slice_segment_trailing_bits( ) + # } + # ... + # 7.3.6.1 General slice segment header syntax + # slice_segment_header( ) { // descriptor + # first_slice_segment_in_pic_flag u(1) + # if( nal_unit_type >= BLA_W_LP && nal_unit_type <= RSV_IRAP_VCL23 ) + # no_output_of_prior_pics_flag u(1) + # slice_pic_parameter_set_id ue(v) + # if( !first_slice_segment_in_pic_flag ) { + # if( dependent_slice_segments_enabled_flag ) + # dependent_slice_segment_flag u(1) + # slice_segment_address u(v) + # } + # if( !dependent_slice_segment_flag ) { + # for( i = 0; i < num_extra_slice_header_bits; i++ ) + # slice_reserved_flag[ i ] u(1) + # slice_type ue(v) + # ... + + rbsp_start = nal_unit_start + NAL_UNIT_START_CODE_SIZE + NAL_UNIT_HEADER_SIZE + skip_bits = 0 + + # 7.4.7.1 General slice segment header semantics + # first_slice_segment_in_pic_flag equal to 1 specifies that the slice segment is the first slice segment of the picture in + # decoding order. first_slice_segment_in_pic_flag equal to 0 specifies that the slice segment is not the first slice segment + # of the picture in decoding order. + is_first_slice = dat[rbsp_start] >> 7 & 1 == 1 + if not is_first_slice: + # TODO: parse dependent_slice_segment_flag and slice_segment_address and get real slice_type + # for now since we don't use it return -1 for slice_type + return (-1, is_first_slice) + skip_bits += 1 # skip past first_slice_segment_in_pic_flag + + if nal_unit_type >= HevcNalUnitType.BLA_W_LP and nal_unit_type <= HevcNalUnitType.RSV_IRAP_VCL23: + # 7.4.7.1 General slice segment header semantics + # no_output_of_prior_pics_flag affects the output of previously-decoded pictures in the decoded picture buffer after the + # decoding of an IDR or a BLA picture that is not the first picture in the bitstream as specified in Annex C. + skip_bits += 1 # skip past no_output_of_prior_pics_flag + + # 7.4.7.1 General slice segment header semantics + # slice_pic_parameter_set_id specifies the value of pps_pic_parameter_set_id for the PPS in use. + # The value of slice_pic_parameter_set_id shall be in the range of 0 to 63, inclusive. + _, size = get_ue(dat, rbsp_start, skip_bits) + skip_bits += size # skip past slice_pic_parameter_set_id + + # 7.4.3.3.1 General picture parameter set RBSP semanal_unit_lenntics + # num_extra_slice_header_bits specifies the number of extra slice header bits that are present in the slice header RBSP + # for coded pictures referring to the PPS. The value of num_extra_slice_header_bits shall be in the range of 0 to 2, inclusive, + # in bitstreams conforming to this version of this Specification. Other values for num_extra_slice_header_bits are reserved + # for future use by ITU-T | ISO/IEC. However, decoders shall allow num_extra_slice_header_bits to have any value. + # TODO: get from PPS_NUT pic_parameter_set_rbsp( ) for corresponding slice_pic_parameter_set_id + num_extra_slice_header_bits = 0 + skip_bits += num_extra_slice_header_bits + + # 7.4.7.1 General slice segment header semantics + # slice_type specifies the coding type of the slice according to Table 7-7. + # Table 7-7 - Name association to slice_type + # slice_type | Name of slice_type + # 0 | B (B slice) + # 1 | P (P slice) + # 2 | I (I slice) + # unsigned integer 0-th order Exp-Golomb-coded syntax element with the left bit first + slice_type, _ = get_ue(dat, rbsp_start, skip_bits) + if DEBUG: + print(" slice_type:", slice_type, f"(first slice: {is_first_slice})") + if slice_type > 2: + raise VideoFileInvalid("slice_type must be 0, 1, or 2") + return slice_type, is_first_slice + +def hevc_index(hevc_file_name: str, allow_corrupt: bool=False) -> tuple[list, int, bytes]: + with FileReader(hevc_file_name) as f: + dat = f.read() + + if len(dat) < NAL_UNIT_START_CODE_SIZE + 1: + raise VideoFileInvalid("data is too short") + + if dat[0] != 0x00: + raise VideoFileInvalid("first byte must be 0x00") + + prefix_dat = b"" + frame_types = list() + + i = 1 # skip past first byte 0x00 + try: + while i < len(dat): + require_nal_unit_start(dat, i) + nal_unit_len = get_hevc_nal_unit_length(dat, i) + nal_unit_type = get_hevc_nal_unit_type(dat, i) + if nal_unit_type in HEVC_PARAMETER_SET_NAL_UNITS: + prefix_dat += dat[i:i+nal_unit_len] + elif nal_unit_type in HEVC_CODED_SLICE_SEGMENT_NAL_UNITS: + slice_type, is_first_slice = get_hevc_slice_type(dat, i, nal_unit_type) + if is_first_slice: + frame_types.append((slice_type, i)) + i += nal_unit_len + except Exception as e: + if not allow_corrupt: + raise + print(f"ERROR: NAL unit skipped @ {i}\n", str(e)) + + return frame_types, len(dat), prefix_dat + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("input_file", type=str) + parser.add_argument("output_prefix_file", type=str) + parser.add_argument("output_index_file", type=str) + args = parser.parse_args() + + frame_types, dat_len, prefix_dat = hevc_index(args.input_file) + with open(args.output_prefix_file, "wb") as f: + f.write(prefix_dat) + + with open(args.output_index_file, "wb") as f: + for ft, fp in frame_types: + f.write(struct.pack("/dev/null && pwd )" +ROOT="$(cd $DIR/../../ && pwd)" +ARCH=$(uname -m) + +# homebrew update is slow +export HOMEBREW_NO_AUTO_UPDATE=1 + +if [[ $SHELL == "/bin/zsh" ]]; then + RC_FILE="$HOME/.zshrc" +elif [[ $SHELL == "/bin/bash" ]]; then + RC_FILE="$HOME/.bash_profile" +fi + +# Install brew if required +if [[ $(command -v brew) == "" ]]; then + echo "Installing Homebrew" + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + echo "[ ] installed brew t=$SECONDS" + + # make brew available now + if [[ $ARCH == "x86_64" ]]; then + echo 'eval "$(/usr/local/bin/brew shellenv)"' >> $RC_FILE + eval "$(/usr/local/bin/brew shellenv)" + else + echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> $RC_FILE + eval "$(/opt/homebrew/bin/brew shellenv)" + fi +else + brew up +fi + +brew bundle --file=$DIR/Brewfile + +echo "[ ] finished brew install t=$SECONDS" + +BREW_PREFIX=$(brew --prefix) + +# archive backend tools for pip dependencies +export LDFLAGS="$LDFLAGS -L${BREW_PREFIX}/opt/zlib/lib" +export LDFLAGS="$LDFLAGS -L${BREW_PREFIX}/opt/bzip2/lib" +export CPPFLAGS="$CPPFLAGS -I${BREW_PREFIX}/opt/zlib/include" +export CPPFLAGS="$CPPFLAGS -I${BREW_PREFIX}/opt/bzip2/include" + +# pycurl curl/openssl backend dependencies +export LDFLAGS="$LDFLAGS -L${BREW_PREFIX}/opt/openssl@3/lib" +export CPPFLAGS="$CPPFLAGS -I${BREW_PREFIX}/opt/openssl@3/include" +export PYCURL_CURL_CONFIG=/usr/bin/curl-config +export PYCURL_SSL_LIBRARY=openssl + +# install python dependencies +$DIR/install_python_dependencies.sh +echo "[ ] installed python dependencies t=$SECONDS" + +# brew does not link qt5 by default +# check if qt5 can be linked, if not, prompt the user to link it +QT_BIN_LOCATION="$(command -v lupdate || :)" +if [ -n "$QT_BIN_LOCATION" ]; then + # if qt6 is linked, prompt the user to unlink it and link the right version + QT_BIN_VERSION="$(lupdate -version | awk '{print $NF}')" + if [[ ! "$QT_BIN_VERSION" =~ 5\.[0-9]+\.[0-9]+ ]]; then + echo + echo "lupdate/lrelease available at PATH is $QT_BIN_VERSION" + if [[ "$QT_BIN_LOCATION" == "$(brew --prefix)/"* ]]; then + echo "Run the following command to link qt5:" + echo "brew unlink qt@6 && brew link qt@5" + else + echo "Remove conflicting qt entries from PATH and run the following command to link qt5:" + echo "brew link qt@5" + fi + fi +else + brew link qt@5 +fi + +echo +echo "---- OPENPILOT SETUP DONE ----" +echo "Open a new shell or configure your active shell env by running:" +echo "source $RC_FILE" diff --git a/iqpilot/tools/maneuvers/.gitignore b/iqpilot/tools/maneuvers/.gitignore new file mode 100644 index 000000000..30846059d --- /dev/null +++ b/iqpilot/tools/maneuvers/.gitignore @@ -0,0 +1 @@ +/reports/ diff --git a/iqpilot/tools/maneuvers/README-lateral.md b/iqpilot/tools/maneuvers/README-lateral.md new file mode 100644 index 000000000..382e33e74 --- /dev/null +++ b/iqpilot/tools/maneuvers/README-lateral.md @@ -0,0 +1,87 @@ +# Lateral Maneuvers Testing Tool + +> [!WARNING] +> Use caution when using this tool. + +Test your vehicle's lateral control tuning with this tool. The tool will test the vehicle's ability to follow a few lateral maneuvers and includes a tool to generate a report from the route. + +## Instructions + +1. Check out a development branch such as `master-mici` on your device. The toggle is hidden on release branches. +2. The full maneuver suite runs at 20 and 30 mph. +3. Enable "Lateral Maneuver Mode" in Settings > Developer on the device while offroad. Alternatively, set the parameter manually: + + ```sh + echo -n 1 > /data/params/d/LateralManeuverMode + ``` + + To run only some of the maneuvers, set `LateralManeuverFilter` to a substring of their + descriptions. Aborts mean a session often never reaches the later maneuvers, so target the one + you need directly. Unset or unmatched runs the full suite. + + ```sh + echo -n 'sine 0.5Hz 30mph' > /data/params/d/LateralManeuverFilter # comma's published comparison + echo -n '30mph' > /data/params/d/LateralManeuverFilter # all four 30 mph maneuvers + ``` + +4. Turn your vehicle back on. You will see "Lateral Maneuver Mode". + +5. Ensure the area ahead is clear, as IQ.Pilot will command lateral acceleration steps in this mode. Once you are ready, set ACC manually to the target speed shown on screen and let IQ.Pilot stabilize lateral. After 2 seconds of steady straight driving on a road under 250 m radius and under 6.8° of roll, the maneuver will begin automatically. IQ.Pilot lateral control stays engaged between maneuvers normally while waiting for the next maneuver's readiness conditions. The maneuver will be aborted and repeated if speed is out of range, the steering wheel or gas is touched, or IQ.Pilot disengages. + +6. When the testing is complete, you'll see an alert that says "Maneuvers Finished." Complete the route by pulling over and turning off the vehicle. + +7. Locate the route(s) — they will stand out with lots of orange intervals in their timeline. Ensure "All logs" show as "uploaded." + +8. Gather the route ID and then run the report generator. The file will be exported to the same directory: + + ```sh + $ python iqpilot/tools/maneuvers/lateral_report.py 98395b7c5b27882e/000001cc--5a73bde686 + + processing report for KIA_EV6 + plotting maneuver: step right 20mph, runs: 3 + plotting maneuver: step left 20mph, runs: 3 + plotting maneuver: sine 0.5Hz 20mph, runs: 3 + plotting maneuver: step right 30mph, runs: 3 + + Opening report: iqpilot/tools/maneuvers/reports/lateral/KIA_EV6_98395b7c5b27882e_000001cc--5a73bde686.html + ``` + + The IQ.Pilot `lateral_report.py` also takes a path to a local `rlog.zst` or a directory of them, supports + auto-detection of lateral sweeps in any route without `alertDebug` markers (pass `--auto`), and ranks the + top-N highest-peak sweeps by speed/peak filters. See `lateral_report.py --help`. + +## Blog-style response plot + +`lateral_response_plot.py` renders the "requested vs actual + 50% response time" figure comma +publishes, for one or more routes on the same axes: + +```sh +$ python iqpilot/tools/maneuvers/lateral_response_plot.py '' \ + --maneuver 'sine 0.5Hz 30mph' --label 'IQ.Lvbs angle — VW Golf MK7' --out response.png +``` + +Three stacked panels sharing a time axis: lateral acceleration (comma's panel, with the 50% marker), +steering wheel angle (commanded vs measured, the commanded trace only exists on angle-control cars), +and steering wheel rate. `--accel-only` drops to comma's single panel. + +`controlsd` derives curvature as `-calc_curvature(steeringAngleDeg)`, so the raw wheel angle always +reads opposite to lateral acceleration. The angle and rate panels are flipped to match the +acceleration panel; pass `--raw-angle` to plot the raw log sign instead. + +The 50% response time is only comparable between runs of the **same maneuver at the same speed**. A +step and a sine of equal amplitude do not produce comparable numbers: the step's request rises +instantly, so its 50% crossing measures rack rise time alone, while the 0.5 Hz sine's own request +takes ~0.167 s to reach 50%. comma's published 350 ms (ID.4) and 423 ms (Model Y) are both from the +0.5 Hz sine at 30 mph. + +## Testing the tooling without a car + +`simulate_lateral.py` runs `lateral_maneuversd` as a real process against a synthetic steering rack and writes an +rlog that `lateral_report.py` reads. Use it to verify the daemon and the report generator after changing either: + +```sh +$ python iqpilot/tools/maneuvers/simulate_lateral.py --out /tmp/lat/rlog.zst +$ python iqpilot/tools/maneuvers/lateral_report.py /tmp/lat/rlog.zst +``` + +The full suite takes about 5 minutes of wall clock; `--max-maneuvers N` stops early. diff --git a/iqpilot/tools/maneuvers/README-longitudinal.md b/iqpilot/tools/maneuvers/README-longitudinal.md new file mode 100644 index 000000000..7120983fc --- /dev/null +++ b/iqpilot/tools/maneuvers/README-longitudinal.md @@ -0,0 +1,60 @@ +# Longitudinal Maneuvers Testing Tool + +Test your vehicle's longitudinal control tuning with this tool. The tool will test the vehicle's ability to follow a few longitudinal maneuvers and includes a tool to generate a report from the route. + +

    Sample snapshot of a report.
    + +## Instructions + +1. Check out a development branch such as `master-mici` on your device. The toggle is hidden on release branches. +2. Locate either a large empty parking lot or road devoid of any car or foot traffic. Flat, straight road is preferred. The full maneuver suite can take 1 mile or more if left running, however it is recommended to disengage IQ.Pilot between maneuvers and turn around if there is not enough space. +3. Turn off the vehicle and enable "Longitudinal Maneuver Mode" in Settings > Developer. The toggle requires IQ.Pilot longitudinal control and only enables while offroad. Alternatively, set the parameter manually: + + ```sh + echo -n 1 > /data/params/d/LongitudinalManeuverMode + ``` + +4. Turn your vehicle back on. You will see the "Longitudinal Maneuver Mode" alert: + + ![videoframe_6652](https://github.com/user-attachments/assets/e9d4c95a-cd76-4ab7-933e-19937792fa0f) + +5. Ensure the road ahead is clear, as openpilot will not brake for any obstructions in this mode. Once you are ready, press "Set" on your steering wheel to start the tests. The tests will run for about 4 minutes. If you need to pause the tests, press "Cancel" on your steering wheel. You can resume the tests by pressing "Resume" on your steering wheel. + + **Note:** For GM cars, it is recommended to hold down the resume button for all low-speed tests (starting, stopping and creep) to avoid the car entering standstill. + + ![cog-clip-00 01 11 250-00 01 22 250](https://github.com/user-attachments/assets/c312c1cc-76e8-46e1-a05e-bb9dfb58994f) + +6. When the testing is complete, you'll see an alert that says "Maneuvers Finished." Complete the route by pulling over and turning off the vehicle. + + ![fin2](https://github.com/user-attachments/assets/c06960ae-7cfb-44af-beaa-4dc28848e49d) + +7. Visit https://connect.comma.ai and locate the route(s). They will stand out with lots of orange intervals in their timeline. Ensure "All logs" show as "uploaded." + + ![image](https://github.com/user-attachments/assets/cfe4c6d9-752f-4b24-b421-4b90a01933dc) + +8. Gather the route ID and then run the report generator. The file will be exported to the same directory: + + ```sh + $ python iqpilot/tools/maneuvers/longitudinal_report.py 57048cfce01d9625/0000010e--5b26bc3be7 'pcm accel compensation' + + processing report for LEXUS_ES_TSS2 + plotting maneuver: start from stop, runs: 4 + plotting maneuver: creep: alternate between +1m/s^2 and -1m/s^2, runs: 2 + plotting maneuver: gas step response: +1m/s^2 from 20mph, runs: 2 + + Report written to iqpilot/tools/maneuvers/reports/longitudinal/LEXUS_ES_TSS2_57048cfce01d9625_0000010e--5b26bc3be7.html + ``` + + `longitudinal_report.py` also takes a path to a local `rlog.zst` or a directory of them. + +## Testing the tooling without a car + +`simulate_longitudinal.py` runs `maneuversd` as a real process against a synthetic powertrain and writes an rlog +that `longitudinal_report.py` reads. Use it to verify the daemon and the report generator after changing either: + +```sh +$ python iqpilot/tools/maneuvers/simulate_longitudinal.py --out /tmp/long/rlog.zst +$ python iqpilot/tools/maneuvers/longitudinal_report.py /tmp/long/rlog.zst +``` + +The full suite takes about 4 minutes of wall clock; `--max-maneuvers N` stops early. diff --git a/iqpilot/tools/maneuvers/lateral_maneuversd.py b/iqpilot/tools/maneuvers/lateral_maneuversd.py new file mode 100644 index 000000000..beb40412d --- /dev/null +++ b/iqpilot/tools/maneuvers/lateral_maneuversd.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python3 +import numpy as np +from dataclasses import dataclass + +from iqpilot.cereal import messaging, car +from iqpilot.common.constants import CV +from iqpilot.common.realtime import DT_MDL, Ratekeeper +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.controls.lib.drive_helpers import MIN_SPEED +from iqpilot.tools.maneuvers.longitudinal_maneuversd import Action, Maneuver as _Maneuver + +# thresholds for starting maneuvers +MAX_SPEED_DEV = 0.7 # deviation in m/s +MAX_CURV = 0.004 # 250 m radius +MAX_ROLL = 0.12 # 6.8° +TIMER = 2.0 # sec stable conditions before starting maneuver + +# The curvature step yanks the rim and spikes driver torque for a frame or two, which single-frame +# aborts read as a driver grab. Measured on VW_GOLF_MK7: 9/9 maneuvers died 0.15s in with the driver +# near hands-off. The EPS torque signal is also noisy enough to clip the ALC override threshold for +# ~10 ms at a time, blipping steeringPressed on its own, so require the hold to exceed 0.2 s of +# continuous frames — longer than any sensor blip or step reaction, far shorter than a real grab. +STEER_PRESSED_ABORT_S = 0.25 +STEER_PRESSED_FRAMES = int(STEER_PRESSED_ABORT_S / DT_MDL) # 5 frames at 20 Hz + + +@dataclass +class Maneuver(_Maneuver): + _baseline_curvature: float = 0.0 + + def get_accel(self, v_ego: float, lat_active: bool, curvature: float, roll: float) -> float: + self._run_completed = False + # only start maneuver on straight, flat roads + ready = abs(v_ego - self.initial_speed) < MAX_SPEED_DEV and lat_active and abs(curvature) < MAX_CURV and abs(roll) < MAX_ROLL + self._ready_cnt = (self._ready_cnt + 1) if ready else max(self._ready_cnt - 1, 0) + + if self._ready_cnt > (TIMER / DT_MDL): + if not self._active: + self._baseline_curvature = curvature + self._active = True + + if not self._active: + return 0.0 + + return self._step() + + def reset(self): + super().reset() + self._ready_cnt = 0 + + +def _sine_action(amplitude, period, duration): + t = np.linspace(0, duration, int(duration / DT_MDL) + 1) + a = amplitude * np.sin(2 * np.pi * t / period) + return Action(a.tolist(), t.tolist()) + + +MANEUVERS = [ + Maneuver( + "step right 20mph", + [Action([0.5], [1.0]), Action([-0.5], [1.5])], + repeat=2, + initial_speed=20. * CV.MPH_TO_MS, + ), + Maneuver( + "step left 20mph", + [Action([-0.5], [1.0]), Action([0.5], [1.5])], + repeat=2, + initial_speed=20. * CV.MPH_TO_MS, + ), + Maneuver( + "sine 0.5Hz 20mph", + [_sine_action(1.0, 2.0, 2.0), Action([0.0], [0.5])], + repeat=2, + initial_speed=20. * CV.MPH_TO_MS, + ), + Maneuver( + "jitter 20mph", + [Action([-0.5 if i % 2 == 0 else 0.5], [0.1]) for i in range(10)], + repeat=2, + initial_speed=20. * CV.MPH_TO_MS, + ), + Maneuver( + "step right 30mph", + [Action([0.5], [1.0]), Action([-0.5], [1.5])], + repeat=2, + initial_speed=30. * CV.MPH_TO_MS, + ), + Maneuver( + "step left 30mph", + [Action([-0.5], [1.0]), Action([0.5], [1.5])], + repeat=2, + initial_speed=30. * CV.MPH_TO_MS, + ), + Maneuver( + "sine 0.5Hz 30mph", + [_sine_action(1.0, 2.0, 2.0), Action([0.0], [0.5])], + repeat=2, + initial_speed=30. * CV.MPH_TO_MS, + ), + Maneuver( + "jitter 30mph", + [Action([-0.5 if i % 2 == 0 else 0.5], [0.1]) for i in range(10)], + repeat=2, + initial_speed=30. * CV.MPH_TO_MS, + ), +] + + +def select_maneuvers(params) -> list[Maneuver]: + # LateralManeuverFilter runs only the maneuvers whose description contains it, so a session can + # target one maneuver (e.g. the 0.5 Hz sine at 30 mph) without driving the whole suite to reach it + needle = (params.get("LateralManeuverFilter") or "").strip() + if not needle: + return MANEUVERS + selected = [m for m in MANEUVERS if needle.lower() in m.description.lower()] + if not selected: + cloudlog.error(f"LateralManeuverFilter {needle!r} matched no maneuvers, running the full suite") + return MANEUVERS + cloudlog.info(f"LateralManeuverFilter {needle!r} selected: {[m.description for m in selected]}") + return selected + + +def main(): + params = Params() + cloudlog.info("lateral_maneuversd is waiting for CarParams") + messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams) + + # iqpilot: subscribe only to the services we actually read and drive timing with a + # Ratekeeper instead of polling modelV2. msgq caps each topic at NUM_READERS (15) and + # evicts ALL subscribers when exceeded; iqpilot runs many daemons, and unlike longitudinal + # maneuver mode (which disables plannerd), lateral mode keeps plannerd running. Subscribing + # to selfdriveState/modelV2 here (selfdriveState is unused; modelV2 was only a poll source) + # tips those topics past 15 → eviction storm → UI/speed render drops to a few fps. + sm = messaging.SubMaster(['carState', 'carControl', 'controlsState']) + pm = messaging.PubMaster(['lateralManeuverPlan', 'alertDebug']) + rk = Ratekeeper(int(1. / DT_MDL), print_delay_threshold=None) # 20 Hz, matches DT_MDL maneuver timing + + maneuvers = iter(select_maneuvers(params)) + maneuver = None + complete_cnt = 0 + aborted_cnt = 0 + steer_pressed_cnt = 0 + abort_reason = '' + display_holdoff = 0 + prev_text = '' + + while True: + sm.update(0) + + if maneuver is None: + maneuver = next(maneuvers, None) + + alert_msg = messaging.new_message('alertDebug') + alert_msg.valid = True + + plan_send = messaging.new_message('lateralManeuverPlan') + + accel = 0 + v_ego = max(sm['carState'].vEgo, 0) + curvature = sm['controlsState'].desiredCurvature + + if complete_cnt > 0: + complete_cnt -= 1 + alert_msg.alertDebug.alertText1 = 'Completed' + alert_msg.alertDebug.alertText2 = maneuver.description + elif maneuver is not None: + # any driver input aborts the maneuver, but only a sustained hold counts as steering override + CS = sm['carState'] + steer_pressed_cnt = (steer_pressed_cnt + 1) if CS.steeringPressed else 0 + steer_override = steer_pressed_cnt >= STEER_PRESSED_FRAMES + if steer_override or CS.gasPressed: + aborted_cnt = int(1.0 / DT_MDL) + abort_reason = ('steering pressed' if steer_override else 'gas pressed').ljust(20) + aborted = aborted_cnt > 0 + speed_out_of_range = maneuver.active and abs(v_ego - maneuver.initial_speed) > MAX_SPEED_DEV + if aborted or speed_out_of_range: + maneuver.reset() + + roll = sm['carControl'].orientationNED[0] if len(sm['carControl'].orientationNED) == 3 else 0.0 + accel = maneuver.get_accel(v_ego, sm['carControl'].latActive, curvature, roll) + + if maneuver._run_completed: + complete_cnt = int(1.0 / DT_MDL) + alert_msg.alertDebug.alertText1 = 'Complete' + alert_msg.alertDebug.alertText2 = maneuver.description + elif maneuver.active: + action_remaining = maneuver.actions[maneuver._action_index].time_bp[-1] - maneuver._action_frames * DT_MDL + if maneuver.description.startswith('sine'): + freq = maneuver.description.split()[1] + alert_msg.alertDebug.alertText1 = f'Active sine {freq} {max(action_remaining, 0):.1f}s' + else: + alert_msg.alertDebug.alertText1 = f'Active {accel:+.1f}m/s² {max(action_remaining, 0):.1f}s' + alert_msg.alertDebug.alertText2 = maneuver.description + elif aborted_cnt > 0: + aborted_cnt -= 1 + alert_msg.alertDebug.alertText1 = abort_reason + elif not (abs(v_ego - maneuver.initial_speed) < MAX_SPEED_DEV and sm['carControl'].latActive): + alert_msg.alertDebug.alertText1 = f'Set speed to {maneuver.initial_speed * CV.MS_TO_MPH:0.0f} mph' + elif maneuver._ready_cnt > 0: + ready_time = max(TIMER - maneuver._ready_cnt * DT_MDL, 0) + alert_msg.alertDebug.alertText1 = f'Starting: {int(ready_time) + 1}' + alert_msg.alertDebug.alertText2 = maneuver.description + else: + curv_ok = abs(curvature) < MAX_CURV + reason = 'road not straight' if not curv_ok else 'road not flat' + alert_msg.alertDebug.alertText1 = f'Waiting: {reason}' + alert_msg.alertDebug.alertText2 = maneuver.description + else: + alert_msg.alertDebug.alertText1 = 'Maneuvers Finished' + + # prevent flickering text + setup = ('Set speed', 'Starting', 'Waiting') + text = alert_msg.alertDebug.alertText1 + same = text == prev_text or (text.startswith('Starting') and prev_text.startswith('Starting')) + if not same and text.startswith(setup) and prev_text.startswith(setup) and display_holdoff > 0: + alert_msg.alertDebug.alertText1 = prev_text + display_holdoff -= 1 + else: + prev_text = text + display_holdoff = int(0.5 / DT_MDL) if text.startswith(setup) else 0 + + pm.send('alertDebug', alert_msg) + + plan_send.valid = maneuver is not None and maneuver.active and complete_cnt == 0 + if plan_send.valid: + plan_send.lateralManeuverPlan.desiredCurvature = maneuver._baseline_curvature + accel / max(v_ego, MIN_SPEED) ** 2 + pm.send('lateralManeuverPlan', plan_send) + + if maneuver is not None and maneuver.finished and complete_cnt == 0: + maneuver = None + + rk.keep_time() + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/maneuvers/lateral_report.py b/iqpilot/tools/maneuvers/lateral_report.py new file mode 100644 index 000000000..3f634f07a --- /dev/null +++ b/iqpilot/tools/maneuvers/lateral_report.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python3 +import argparse +import base64 +import io +import math +import numpy as np +import os +import webbrowser +from collections import defaultdict +from pathlib import Path +import matplotlib.pyplot as plt +from iqpilot.common.utils import tabulate + +from iqpilot.cereal import car +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.selfdrive.controls.lib.latcontrol_torque import LP_FILTER_CUTOFF_HZ +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.system.hardware.hw import Paths +from iqpilot.common.constants import CV +from iqpilot.common.realtime import DT_MDL +from iqpilot.tools.maneuvers.lateral_maneuversd import STEER_PRESSED_FRAMES +from iqpilot.tools.maneuvers.longitudinal_report import format_car_params + +ANGLE_CONTROL = (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED) +STEER_OVERRIDE_S = STEER_PRESSED_FRAMES * DT_MDL + + +def lat_accel(curvature, v): + return curvature * max(v, 1.0) ** 2 + + +def steering_overridden(t_carState, carState): + # mirrors lateral_maneuversd: the curvature step spikes driver torque for a frame or two on + # cars with a tight override threshold, so only a sustained hold invalidates the run + start = None + for t, cs in zip(t_carState, carState, strict=True): + if not cs.steeringPressed: + start = None + elif start is None: + start = t + elif t - start >= STEER_OVERRIDE_S: + return True + return False + + +def report(platform, route, _description, CP, ID, maneuvers): + output_path = Path(__file__).resolve().parent / "reports" / "lateral" + output_fn = output_path / f"{platform}_{route.replace('/', '_').replace('|', '_')}.html" + output_path.mkdir(parents=True, exist_ok=True) + target_cross_times = defaultdict(list) + + builder = [ + "\n", + "

    Lateral maneuver report

    \n", + f"

    {platform}

    \n", + f"

    {route}

    \n", + f"

    {ID.gitCommit}, {ID.gitBranch}, {ID.gitRemote}

    \n", + ] + if _description is not None: + builder.append(f"

    Description: {_description}

    \n") + builder.append(f"

    CarParams

    {format_car_params(CP)}
    \n") + builder.append('{ summary }') # to be replaced below + for description, runs in maneuvers: + # filter incomplete runs + completed_runs = [msgs for msgs in runs + if any(m.alertDebug.alertText1 == 'Complete' for m in msgs if m.which() == 'alertDebug')] + print(f'plotting maneuver: {description}, runs: {len(completed_runs)}') + if not completed_runs: + continue + builder.append("
    \n") + builder.append(f"

    {description}

    \n") + for run, msgs in enumerate(completed_runs): + last_active = max(m.logMonoTime for m in msgs if m.which() == 'lateralManeuverPlan' and m.valid) + msgs = [m for m in msgs if m.logMonoTime <= last_active] + t_carControl, carControl = zip(*[(m.logMonoTime, m.carControl) for m in msgs if m.which() == 'carControl'], strict=True) + t_carState, carState = zip(*[(m.logMonoTime, m.carState) for m in msgs if m.which() == 'carState'], strict=True) + t_controlsState, controlsState = zip(*[(m.logMonoTime, m.controlsState) for m in msgs if m.which() == 'controlsState'], strict=True) + t_lateralPlan, lateralPlan = zip(*[(m.logMonoTime, m.lateralManeuverPlan) for m in msgs if m.which() == 'lateralManeuverPlan' and m.valid], strict=True) + t_carOutput, carOutput = zip(*[(m.logMonoTime, m.carOutput) for m in msgs if m.which() == 'carOutput'], strict=True) + + # make time relative seconds + t_carControl = [(t - t_carControl[0]) / 1e9 for t in t_carControl] + t_carState = [(t - t_carState[0]) / 1e9 for t in t_carState] + t_controlsState = [(t - t_controlsState[0]) / 1e9 for t in t_controlsState] + t_lateralPlan = [(t - t_lateralPlan[0]) / 1e9 for t in t_lateralPlan] + t_carOutput = [(t - t_carOutput[0]) / 1e9 for t in t_carOutput] + + # maneuver validity + latActive = [m.latActive for m in carControl] + maneuver_valid = all(latActive) and not steering_overridden(t_carState, carState) + + _open = 'open' if maneuver_valid else '' + title = f'Run #{int(run)+1}' + (' (invalid maneuver!)' if not maneuver_valid else '') + + builder.append(f"

    {title}

    \n") + + baseline_accel = lat_accel(controlsState[0].curvature, carState[0].vEgo) + v_ego = [m.vEgo for m in carState] + cross_markers = [] + + if description.startswith(('sine', 'jitter')): + amplitude = max(abs(lat_accel(lp.desiredCurvature, v) - baseline_accel) + for lp, v in zip(lateralPlan, v_ego, strict=False)) + threshold = amplitude * 0.5 + builder.append('

    50% peak') + for t, cs, v in zip(t_controlsState, controlsState, v_ego, strict=False): + actual = lat_accel(cs.curvature, v) - baseline_accel + if abs(actual) > threshold: + builder.append(f', crossed in {t:.3f}s') + cross_markers.append((t, actual + baseline_accel)) + if maneuver_valid: + target_cross_times[description].append(t) + break + else: + builder.append(', not crossed') + builder.append('

    ') + if maneuver_valid: + target_cross_times.setdefault(description, []) + else: + action_targets = [(0, lat_accel(lateralPlan[0].desiredCurvature, v_ego[0]) - baseline_accel)] + for i in range(1, min(len(lateralPlan), len(v_ego))): + if abs(lateralPlan[i].desiredCurvature - lateralPlan[i - 1].desiredCurvature) > 0.001: + desired = lat_accel(lateralPlan[i].desiredCurvature, v_ego[i]) - baseline_accel + action_targets.append((i, desired)) + + for j, (start_i, act_target) in enumerate(action_targets): + start_time = t_lateralPlan[start_i] + end_time = t_lateralPlan[action_targets[j + 1][0]] if j + 1 < len(action_targets) else t_controlsState[-1] + + builder.append(f'

    aTarget: {round(act_target, 1)} m/s^2') + prev_crossed = False + for t, cs, v in zip(t_controlsState, controlsState, v_ego, strict=False): + if not (start_time <= t <= end_time): + continue + actual_accel = lat_accel(cs.curvature, v) - baseline_accel + crossed = (0 < act_target < actual_accel) or (0 > act_target > actual_accel) + if crossed and prev_crossed: + cross_time = t - start_time + builder.append(f', crossed in {cross_time:.3f}s') + cross_markers.append((t, act_target + baseline_accel)) + if maneuver_valid: + target_cross_times[description].append(cross_time) + break + prev_crossed = crossed + else: + builder.append(', not crossed') + builder.append('

    ') + if maneuver_valid: + target_cross_times.setdefault(description, []) + + plt.rcParams['font.size'] = 40 + fig = plt.figure(figsize=(30, 40)) + ax = fig.subplots(5, 1, sharex=True, gridspec_kw={'height_ratios': [5, 5, 3, 3, 3]}) + + ax[0].grid(linewidth=4) + desired_label = 'lateralManeuverPlan.desiredCurvature * vEgo^2' + desired_lat_accel = [lat_accel(m.desiredCurvature, v) for m, v in zip(lateralPlan, v_ego, strict=False)] + if description.startswith(('sine', 'jitter')): + ax[0].plot(t_lateralPlan[:len(desired_lat_accel)], desired_lat_accel, 'C1', label=desired_label, linewidth=6) + else: + t_desired = [t_lateralPlan[0]] + t_lateralPlan[:len(desired_lat_accel)] + desired_lat_accel = [baseline_accel] + desired_lat_accel + ax[0].step(t_desired, desired_lat_accel, 'C1', label=desired_label, linewidth=6, where='post') + actual_lat_accel = [lat_accel(cs.curvature, v) for cs, v in zip(controlsState, v_ego, strict=False)] + ax[0].plot(t_controlsState[:len(actual_lat_accel)], actual_lat_accel, 'g', label='controlsState.curvature * vEgo^2', linewidth=6) + ax[0].set_ylabel('Lateral Accel (m/s^2)') + for ct, cv in cross_markers: + ax[0].plot(ct, cv, marker='o', markersize=50, markeredgewidth=7, markeredgecolor='black', markerfacecolor='None') + ax[0].legend(prop={'size': 30}) + + ax[1].grid(linewidth=4) + if CP.steerControlType in ANGLE_CONTROL: + steer_field, steer_ylabel = 'steeringAngleDeg', 'Steer angle (deg)' + else: + steer_field, steer_ylabel = 'torque', 'Steer torque' + ax[1].plot(t_carControl, [getattr(m.actuators, steer_field) for m in carControl], 'C1', label=f'carControl.actuators.{steer_field}', linewidth=6) + ax[1].plot(t_carOutput, [getattr(m.actuatorsOutput, steer_field) for m in carOutput], 'g', label=f'carOutput.actuatorsOutput.{steer_field}', linewidth=6) + ax[1].set_ylabel(steer_ylabel) + ax[1].legend(prop={'size': 30}) + + ax[2].grid(linewidth=4) + ax[2].plot(t_carState, [v * CV.MS_TO_MPH for v in v_ego], label='carState.vEgo', linewidth=6) + ax[2].set_ylabel('Velocity (mph)') + ax[2].yaxis.set_major_formatter(plt.FormatStrFormatter('%.1f')) + ax[2].legend() + + t_accel = np.array(t_controlsState[:len(actual_lat_accel)]) + raw_jerk = np.gradient(actual_lat_accel, t_accel) + dt_avg = np.mean(np.diff(t_accel)) + jerk_filter = FirstOrderFilter(0.0, 1 / (2 * np.pi * LP_FILTER_CUTOFF_HZ), dt_avg) + filtered_jerk = [jerk_filter.update(j) for j in raw_jerk] + ax[3].grid(linewidth=4) + ax[3].plot(t_accel, filtered_jerk, label='d/dt(controlsState.curvature * vEgo^2)', linewidth=6) + ax[3].set_ylabel('Jerk (m/s^3)') + ax[3].legend() + + ax[4].grid(linewidth=4) + ax[4].plot(t_carControl, [math.degrees(m.orientationNED[0]) if len(m.orientationNED) == 3 else 0.0 for m in carControl], + label='carControl.orientationNED[0]', linewidth=6) + ax[4].set_ylabel('Roll (deg)') + ax[4].legend() + + ax[-1].set_xlabel("Time (s)") + fig.tight_layout() + + buffer = io.BytesIO() + fig.savefig(buffer, format='webp') + plt.close(fig) + buffer.seek(0) + builder.append(f"\n") + builder.append("
    \n") + + summary = ["

    Summary

    \n"] + cols = ['maneuver', 'crossed', 'mean', 'min', 'max'] + table = [] + for description, times in target_cross_times.items(): + l = [description, len(times)] + if len(times): + l.extend([round(sum(times) / len(times), 2), round(min(times), 2), round(max(times), 2)]) + table.append(l) + summary.append(tabulate(table, headers=cols, tablefmt='html', numalign='left') + '\n') + + sum_idx = builder.index('{ summary }') + builder[sum_idx:sum_idx + 1] = summary + + with open(output_fn, "w") as f: + f.write(''.join(builder)) + + print(f"\nOpening report: {output_fn}\n") + webbrowser.open_new_tab(str(output_fn)) + + +def open_route(route: str) -> LogReader: + if os.path.isdir(route): + rlogs = sorted(str(p) for p in Path(route).glob("*rlog.zst")) + if not rlogs: + raise SystemExit(f"no *rlog.zst files in {route}") + print(f"loading {len(rlogs)} rlogs from {route}") + return LogReader(rlogs, only_union_types=True) + if route.endswith(('.zst', '.bz2', '.log')) and not os.path.exists(route): + raise SystemExit(f"no such file: {route}") + if os.path.exists(route) or '/' in route or '|' in route: + return LogReader(route, only_union_types=True) + segs = [seg for seg in os.listdir(Paths.log_root()) if route in seg] + return LogReader([os.path.join(Paths.log_root(), seg, 'rlog.zst') for seg in segs], only_union_types=True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Generate lateral maneuver report from route') + parser.add_argument('route', type=str, help='Route name, local rlog path, or directory of rlogs') + parser.add_argument('description', type=str, nargs='?') + + args = parser.parse_args() + + lr = open_route(args.route) + + CP = lr.first('carParams') + ID = lr.first('initData') + platform = CP.carFingerprint + print('processing report for', platform) + + maneuvers: list[tuple[str, list[list]]] = [] + active_prev = False + description_prev = None + + for msg in lr: + if msg.which() == 'alertDebug': + active = 'Active' in msg.alertDebug.alertText1 or msg.alertDebug.alertText1 == 'Complete' + if active and not active_prev: + if msg.alertDebug.alertText2 == description_prev: + maneuvers[-1][1].append([]) + else: + maneuvers.append((msg.alertDebug.alertText2, [[]])) + description_prev = maneuvers[-1][0] + active_prev = active + + if active_prev: + maneuvers[-1][1][-1].append(msg) + + report(platform, args.route, args.description, CP, ID, maneuvers) diff --git a/iqpilot/tools/maneuvers/lateral_response_plot.py b/iqpilot/tools/maneuvers/lateral_response_plot.py new file mode 100755 index 000000000..2f77fc9aa --- /dev/null +++ b/iqpilot/tools/maneuvers/lateral_response_plot.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python3 +"""Blog-style lateral actuator response plot. + +Renders the single-panel "requested vs actual lateral acceleration + 50% response time" figure +comma publishes for lateral maneuver comparisons, for one or more routes on the same axes. + + ./iqpilot/tools/maneuvers/lateral_response_plot.py 1ce1b50dd82993a1'|'00000011--6cb007b200/0:4 \ + --maneuver 'sine 0.5Hz 30mph' --label 'IQ.Lvbs angle (Golf MK7)' + +The 50% response time is only comparable between runs of the SAME maneuver at the SAME speed; +a step and a sine of equal amplitude do not produce comparable numbers. +""" +import argparse +from pathlib import Path +from typing import NamedTuple + +import matplotlib.pyplot as plt +import numpy as np + +from iqpilot.tools.maneuvers.lateral_report import lat_accel, open_route, steering_overridden + +SERIES_COLORS = ('#2ca02c', '#ff7f0e', '#1f77b4', '#d62728') +REQUESTED_COLOR = '#999999' + + +def completed_runs(msgs, maneuver): + runs, active_prev, desc_prev = [], False, None + for m in msgs: + if m.which() == 'alertDebug': + active = 'Active' in m.alertDebug.alertText1 or m.alertDebug.alertText1 == 'Complete' + if active and not active_prev: + if m.alertDebug.alertText2 == desc_prev: + runs[-1][1].append([]) + else: + runs.append((m.alertDebug.alertText2, [[]])) + desc_prev = runs[-1][0] + active_prev = active + if active_prev: + runs[-1][1][-1].append(m) + + out = [] + for description, windows in runs: + if maneuver is not None and description != maneuver: + continue + for w in windows: + if any(m.alertDebug.alertText1 == 'Complete' for m in w if m.which() == 'alertDebug'): + out.append((description, w)) + return out + + +class Run(NamedTuple): + t_requested: np.ndarray + requested: np.ndarray + t_actual: np.ndarray + actual: np.ndarray + t_wheel: np.ndarray + angle: np.ndarray + rate: np.ndarray + t_angle_cmd: np.ndarray + angle_cmd: np.ndarray | None + v_mean: float + valid: bool + + +def extract(msgs, raw_angle: bool = False) -> Run: + """requested/actual lateral accel and wheel angle on a common relative timebase, baseline removed""" + t_cs, carState = zip(*[(m.logMonoTime, m.carState) for m in msgs if m.which() == 'carState'], strict=True) + t_ct, controlsState = zip(*[(m.logMonoTime, m.controlsState) for m in msgs if m.which() == 'controlsState'], strict=True) + t_cc, carControl = zip(*[(m.logMonoTime, m.carControl) for m in msgs if m.which() == 'carControl'], strict=True) + t_lp, lateralPlan = zip(*[(m.logMonoTime, m.lateralManeuverPlan) for m in msgs + if m.which() == 'lateralManeuverPlan' and m.valid], strict=True) + + t0 = t_lp[0] + + def rel(ts): + return np.array([(t - t0) / 1e9 for t in ts]) + + t_cs_s, t_ct_s, t_cc_s, t_lp_s = rel(t_cs), rel(t_ct), rel(t_cc), rel(t_lp) + + v_ego = np.array([m.vEgo for m in carState]) + v_at_lp = np.interp(t_lp_s, t_cs_s, v_ego) + v_at_ct = np.interp(t_ct_s, t_cs_s, v_ego) + + baseline = lat_accel(controlsState[0].curvature, carState[0].vEgo) + requested = np.array([lat_accel(m.desiredCurvature, v) for m, v in zip(lateralPlan, v_at_lp, strict=True)]) - baseline + actual = np.array([lat_accel(m.curvature, v) for m, v in zip(controlsState, v_at_ct, strict=True)]) - baseline + + # controlsd derives curvature as -calc_curvature(steeringAngleDeg), so raw wheel angle always reads + # opposite to lateral accel; flip it unless the caller wants the raw signal + sign = 1.0 if raw_angle else -1.0 + angle = sign * (np.array([m.steeringAngleDeg for m in carState]) - carState[0].steeringAngleDeg) + rate = sign * np.array([m.steeringRateDeg for m in carState]) + if not np.any(rate): # not all brands populate steeringRateDeg + rate = np.gradient(angle, t_cs_s) + + # angle command only exists on angle-control cars + cmd = sign * (np.array([m.actuators.steeringAngleDeg for m in carControl]) - carControl[0].actuators.steeringAngleDeg) + angle_cmd = cmd if np.any(cmd) else None + + window = lambda t: (t >= 0) & (t <= t_lp_s[-1]) # noqa: E731 + k_ct, k_cs, k_cc = window(t_ct_s), window(t_cs_s), window(t_cc_s) + + lat_active = all(m.latActive for m in carControl) + # steering_overridden takes seconds, not raw logMonoTime + overridden = steering_overridden(t_cs_s.tolist(), carState) + return Run(t_lp_s, requested, t_ct_s[k_ct], actual[k_ct], + t_cs_s[k_cs], angle[k_cs], rate[k_cs], + t_cc_s[k_cc], angle_cmd[k_cc] if angle_cmd is not None else None, + float(np.mean(v_ego)), lat_active and not overridden) + + +def response_time(t_actual, actual, requested): + """time to first reach 50% of the requested peak, comma's metric""" + amplitude = float(np.max(np.abs(requested))) + if amplitude < 1e-3: + return None, amplitude + threshold = 0.5 * amplitude + crossed = np.flatnonzero(np.abs(actual) > threshold) + if not len(crossed): + return None, amplitude + return float(t_actual[crossed[0]]), amplitude + + +def main(): + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + parser.add_argument('routes', nargs='+', help='route, local rlog path, or directory (one per series)') + parser.add_argument('--label', action='append', default=[], help='series label, repeat to match routes') + parser.add_argument('--maneuver', default='sine 0.5Hz 30mph', help='maneuver description to plot') + parser.add_argument('--run', type=int, default=0, help='which completed run to plot (default first)') + parser.add_argument('--out', type=Path, default=Path('lateral_response.png')) + parser.add_argument('--title', default=None) + parser.add_argument('--accel-only', action='store_true', + help="just comma's single lateral-accel panel, without wheel angle and rate") + parser.add_argument('--raw-angle', action='store_true', + help='plot wheel angle in the raw log sign instead of aligned to lateral accel') + args = parser.parse_args() + + if args.accel_only: + fig, ax0 = plt.subplots(figsize=(9, 5.5), dpi=200) + ax_angle = ax_rate = None + axes = [ax0] + else: + fig, axes = plt.subplots(3, 1, figsize=(9, 10), dpi=200, sharex=True, + gridspec_kw={'height_ratios': [3, 2, 2]}) + ax0, ax_angle, ax_rate = axes + ax = ax0 + annotations = [] + plotted_requested = False + plotted_cmd = False + + for i, route in enumerate(args.routes): + label = args.label[i] if i < len(args.label) else route + color = SERIES_COLORS[i % len(SERIES_COLORS)] + + msgs = list(open_route(route)) + runs = completed_runs(msgs, args.maneuver) + if not runs: + have = sorted({d for d, _ in completed_runs(msgs, None)}) + raise SystemExit(f"{route}: no completed '{args.maneuver}' runs. completed maneuvers in this route: {have or 'none'}") + if args.run >= len(runs): + raise SystemExit(f"{route}: only {len(runs)} completed '{args.maneuver}' run(s), --run {args.run} out of range") + + description, msgs_run = runs[args.run] + r = extract(msgs_run, args.raw_angle) + t_req, requested, t_act, actual, v_mean, valid = r.t_requested, r.requested, r.t_actual, r.actual, r.v_mean, r.valid + cross, amplitude = response_time(t_act, actual, requested) + + if not plotted_requested: + ax.plot(t_req, requested, color=REQUESTED_COLOR, linestyle=':', linewidth=2.5, label='requested', zorder=1) + plotted_requested = True + ax.plot(t_act, actual, color=color, linewidth=2.5, label=label, zorder=3) + + if ax_angle is not None: + if r.angle_cmd is not None and not plotted_cmd: + ax_angle.plot(r.t_angle_cmd, r.angle_cmd, color=REQUESTED_COLOR, linestyle=':', linewidth=2.5, + label='commanded', zorder=1) + plotted_cmd = True + ax_angle.plot(r.t_wheel, r.angle, color=color, linewidth=2.5, zorder=3) + ax_rate.plot(r.t_wheel, r.rate, color=color, linewidth=2.5, zorder=3) + + if cross is not None: + y = float(np.interp(cross, t_act, actual)) + ax.axvline(cross, color=color, linestyle='--', linewidth=1.5, ymax=0.92, zorder=2) + ax.plot(cross, y, marker='o', markersize=9, markeredgewidth=2, + markeredgecolor=color, markerfacecolor='none', zorder=4) + annotations.append((f'50% response in {cross:.3f} s', color)) + else: + annotations.append(('50% response not reached', color)) + + flag = '' if valid else ' (INVALID: lat not active or steering overridden)' + cross_str = f'{cross:.3f} s' if cross else 'n/a' + print(', '.join([ + f"{label}: {description}", + f"run {args.run}", + f"{v_mean * 2.23694:.1f} mph", + f"peak requested {amplitude:.2f} m/s^2", + f"50% in {cross_str}", + f"peak wheel {np.abs(r.angle).max():.1f} deg", + f"peak rate {np.abs(r.rate).max():.0f} deg/s{flag}", + ])) + + # headroom so the annotation block never sits on the trace + lo, hi = ax.get_ylim() + ax.set_ylim(lo, hi + (hi - lo) * 0.10 * max(len(annotations), 1)) + for j, (text, color) in enumerate(annotations): + ax.text(0.03, 0.965 - j * 0.06, text, transform=ax.transAxes, color=color, + fontsize=11, fontweight='bold', va='top', + bbox={'facecolor': 'white', 'edgecolor': 'none', 'alpha': 0.75, 'pad': 2}) + + ax.set_ylabel('Lateral acceleration (m/s²)') + if ax_angle is not None: + ax_angle.set_ylabel('Steering wheel angle (deg)') + ax_rate.set_ylabel('Steering wheel rate (deg/s)') + if not args.raw_angle: + fig.text(0.5, 0.005, 'wheel angle sign aligned to lateral accel (raw log sign is inverted; --raw-angle to keep it)', + ha='center', fontsize=8, color='#777777') + if plotted_cmd: + ax_angle.legend(loc='upper right', frameon=False, fontsize=9) + axes[-1].set_xlabel('Time (s)') + + for a in axes: + a.grid(True, color='#dddddd', linewidth=0.8) + a.set_axisbelow(True) + for side in ('top', 'right'): + a.spines[side].set_visible(False) + + ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.12 if args.accel_only else 1.10), + ncol=4, frameon=False, fontsize=10) + if args.title: + ax.set_title(args.title, pad=28) + + fig.tight_layout() + fig.savefig(args.out, bbox_inches='tight') + print(f"\nwrote {args.out}") + + +if __name__ == '__main__': + main() diff --git a/iqpilot/tools/maneuvers/longitudinal_maneuversd.py b/iqpilot/tools/maneuvers/longitudinal_maneuversd.py new file mode 100755 index 000000000..8b84e6e75 --- /dev/null +++ b/iqpilot/tools/maneuvers/longitudinal_maneuversd.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 +import numpy as np +from dataclasses import dataclass + +from iqpilot.cereal import messaging +from iqpilot.common.constants import CV +from iqpilot.common.realtime import DT_MDL +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.controls.lib.drive_helpers import should_stop + + +@dataclass +class Action: + accel_bp: list[float] # m/s^2 + time_bp: list[float] # seconds + + def __post_init__(self): + assert len(self.accel_bp) == len(self.time_bp) + + +@dataclass +class Maneuver: + description: str + actions: list[Action] + repeat: int = 0 + initial_speed: float = 0. # m/s + + _active: bool = False + _finished: bool = False + _run_completed: bool = False + _action_index: int = 0 + _action_frames: int = 0 + _ready_cnt: int = 0 + _repeated: int = 0 + + def _step(self) -> float: + self._run_completed = False + action = self.actions[self._action_index] + action_accel = np.interp(self._action_frames * DT_MDL, action.time_bp, action.accel_bp) + + self._action_frames += 1 + + # reached duration of action + if self._action_frames > (action.time_bp[-1] / DT_MDL): + # next action + if self._action_index < len(self.actions) - 1: + self._action_index += 1 + self._action_frames = 0 + # repeat maneuver + elif self._repeated < self.repeat: + self._repeated += 1 + self._run_completed = True + self.reset() + # finish maneuver + else: + self._run_completed = True + self._finished = True + + return float(action_accel) + + def get_accel(self, v_ego: float, long_active: bool, standstill: bool, cruise_standstill: bool) -> float: + ready = abs(v_ego - self.initial_speed) < 0.3 and long_active and not cruise_standstill + if self.initial_speed < 0.01: + ready = ready and standstill + self._ready_cnt = (self._ready_cnt + 1) if ready else 0 + + if self._ready_cnt > (3. / DT_MDL): + self._active = True + + if not self._active: + return min(max(self.initial_speed - v_ego, -2.), 2.) + + return self._step() + + def reset(self): + self._active = False + self._action_frames = 0 + self._action_index = 0 + + @property + def finished(self): + return self._finished + + @property + def active(self): + return self._active + + +MANEUVERS = [ + Maneuver( + "come to stop", + [Action([-0.5], [12])], + repeat=2, + initial_speed=5., + ), + Maneuver( + "start from stop", + [Action([1.5], [6])], + repeat=2, + initial_speed=0., + ), + Maneuver( + "creep: alternate between +1m/s^2 and -1m/s^2", + [ + Action([1], [3]), Action([-1], [3]), + Action([1], [3]), Action([-1], [3]), + Action([1], [3]), Action([-1], [3]), + ], + repeat=2, + initial_speed=0., + ), + Maneuver( + "brake step response: -1m/s^2 from 20mph", + [Action([-1], [3])], + repeat=2, + initial_speed=20. * CV.MPH_TO_MS, + ), + Maneuver( + "brake step response: -4m/s^2 from 20mph", + [Action([-4], [3])], + repeat=2, + initial_speed=20. * CV.MPH_TO_MS, + ), + Maneuver( + "gas step response: +1m/s^2 from 20mph", + [Action([1], [3])], + repeat=2, + initial_speed=20. * CV.MPH_TO_MS, + ), + Maneuver( + "gas step response: +4m/s^2 from 20mph", + [Action([4], [3])], + repeat=2, + initial_speed=20. * CV.MPH_TO_MS, + ), +] + + +def main(): + params = Params() + cloudlog.info("maneuversd is waiting for CarParams") + params.get("CarParams", block=True) + + sm = messaging.SubMaster(['carState', 'carControl', 'controlsState', 'selfdriveState', 'modelV2'], poll='modelV2') + pm = messaging.PubMaster(['longitudinalPlan', 'iqPlan', 'driverAssistance', 'alertDebug']) + + maneuvers = iter(MANEUVERS) + maneuver = None + + while True: + sm.update() + + if maneuver is None: + maneuver = next(maneuvers, None) + + alert_msg = messaging.new_message('alertDebug') + alert_msg.valid = True + + plan_send = messaging.new_message('longitudinalPlan') + plan_send.valid = sm.all_checks() + + longitudinalPlan = plan_send.longitudinalPlan + accel = 0 + v_ego = max(sm['carState'].vEgo, 0) + + if maneuver is not None: + accel = maneuver.get_accel(v_ego, sm['carControl'].longActive, sm['carState'].standstill, sm['carState'].cruiseState.standstill) + + if maneuver.active: + alert_msg.alertDebug.alertText1 = f'Maneuver Active: {accel:0.2f} m/s^2' + else: + alert_msg.alertDebug.alertText1 = f'Setting up to {maneuver.initial_speed * CV.MS_TO_MPH:0.2f} mph' + alert_msg.alertDebug.alertText2 = f'{maneuver.description}' + else: + alert_msg.alertDebug.alertText1 = 'Maneuvers Finished' + + pm.send('alertDebug', alert_msg) + + longitudinalPlan.aTarget = accel + longitudinalPlan.shouldStop = should_stop(v_ego, accel) + + longitudinalPlan.allowBrake = True + longitudinalPlan.allowThrottle = True + longitudinalPlan.hasLead = True + + longitudinalPlan.speeds = [0.2] # triggers carControl.cruiseControl.resume in controlsd + + pm.send('longitudinalPlan', plan_send) + + plan_iq_send = messaging.new_message('iqPlan') + plan_iq_send.valid = True + pm.send('iqPlan', plan_iq_send) + + assistance_send = messaging.new_message('driverAssistance') + assistance_send.valid = True + pm.send('driverAssistance', assistance_send) + + if maneuver is not None and maneuver.finished: + maneuver = None diff --git a/iqpilot/tools/maneuvers/longitudinal_report.py b/iqpilot/tools/maneuvers/longitudinal_report.py new file mode 100755 index 000000000..2c97575c8 --- /dev/null +++ b/iqpilot/tools/maneuvers/longitudinal_report.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python3 +import argparse +import base64 +import io +import os +import math +import pprint +import webbrowser +from collections import defaultdict +from pathlib import Path +import matplotlib.pyplot as plt +from iqpilot.common.utils import tabulate + +from iqpilot.tools.lib.logreader import LogReader +from iqpilot.system.hardware.hw import Paths + + +def format_car_params(CP): + return pprint.pformat({k: v for k, v in CP.to_dict().items() if not k.endswith('DEPRECATED')}, indent=2) + + +def report(platform, route, _description, CP, ID, maneuvers): + output_path = Path(__file__).resolve().parent / "reports" / "longitudinal" + output_fn = output_path / f"{platform}_{route.replace('/', '_')}.html" + output_path.mkdir(parents=True, exist_ok=True) + target_cross_times = defaultdict(list) + + builder = [ + "\n", + "

    Longitudinal maneuver report

    \n", + f"

    {platform}

    \n", + f"

    {route}

    \n", + f"

    {ID.gitCommit}, {ID.gitBranch}, {ID.gitRemote}

    \n", + ] + if _description is not None: + builder.append(f"

    Description: {_description}

    \n") + builder.append(f"

    CarParams

    {format_car_params(CP)}
    \n") + builder.append('{ summary }') # to be replaced below + for description, runs in maneuvers: + print(f'plotting maneuver: {description}, runs: {len(runs)}') + builder.append("
    \n") + builder.append(f"

    {description}

    \n") + for run, msgs in enumerate(runs): + t_carControl, carControl = zip(*[(m.logMonoTime, m.carControl) for m in msgs if m.which() == 'carControl'], strict=True) + t_carOutput, carOutput = zip(*[(m.logMonoTime, m.carOutput) for m in msgs if m.which() == 'carOutput'], strict=True) + t_carState, carState = zip(*[(m.logMonoTime, m.carState) for m in msgs if m.which() == 'carState'], strict=True) + t_deviceMotion, deviceMotion = zip(*[(m.logMonoTime, m.deviceMotion) for m in msgs if m.which() == 'deviceMotion'], strict=True) + t_longitudinalPlan, longitudinalPlan = zip(*[(m.logMonoTime, m.longitudinalPlan) for m in msgs if m.which() == 'longitudinalPlan'], strict=True) + + # make time relative seconds + t_carControl = [(t - t_carControl[0]) / 1e9 for t in t_carControl] + t_carOutput = [(t - t_carOutput[0]) / 1e9 for t in t_carOutput] + t_carState = [(t - t_carState[0]) / 1e9 for t in t_carState] + t_deviceMotion = [(t - t_deviceMotion[0]) / 1e9 for t in t_deviceMotion] + t_longitudinalPlan = [(t - t_longitudinalPlan[0]) / 1e9 for t in t_longitudinalPlan] + + # maneuver validity + longActive = [m.longActive for m in carControl] + maneuver_valid = all(longActive) and (not any(cs.cruiseState.standstill for cs in carState) or CP.autoResumeSng) + + _open = 'open' if maneuver_valid else '' + title = f'Run #{int(run)+1}' + (' (invalid maneuver!)' if not maneuver_valid else '') + + builder.append(f"

    {title}

    \n") + + # get first acceleration target and first intersection + aTarget = longitudinalPlan[0].aTarget + target_cross_time = None + builder.append(f'

    Initial aTarget: {round(aTarget, 2)} m/s^2') + + # Localizer is noisy, require two consecutive 20Hz frames above threshold + prev_crossed = False + for t, lp in zip(t_deviceMotion, deviceMotion, strict=True): + crossed = (0 < aTarget < lp.accelerationDevice.x) or (0 > aTarget > lp.accelerationDevice.x) + if crossed and prev_crossed: + builder.append(f', crossed in {t:.3f}s') + target_cross_time = t + if maneuver_valid: + target_cross_times[description].append(t) + break + prev_crossed = crossed + else: + builder.append(', not crossed') + builder.append('

    ') + + pitches = [math.degrees(m.orientationNED[1]) for m in carControl] + builder.append(f'

    Average pitch: {sum(pitches) / len(pitches):0.2f} degrees

    ') + + plt.rcParams['font.size'] = 40 + fig = plt.figure(figsize=(30, 26)) + ax = fig.subplots(4, 1, sharex=True, gridspec_kw={'height_ratios': [5, 3, 1, 1]}) + + ax[0].grid(linewidth=4) + ax[0].plot(t_carControl, [m.actuators.accel for m in carControl], label='carControl.actuators.accel', linewidth=6) + ax[0].plot(t_carOutput, [m.actuatorsOutput.accel for m in carOutput], label='carOutput.actuatorsOutput.accel', linewidth=6) + ax[0].plot(t_longitudinalPlan, [m.aTarget for m in longitudinalPlan], label='longitudinalPlan.aTarget', linewidth=6) + ax[0].plot(t_carState, [m.aEgo for m in carState], label='carState.aEgo', linewidth=6) + ax[0].plot(t_deviceMotion, [m.accelerationDevice.x for m in deviceMotion], label='deviceMotion.accelerationDevice.x', linewidth=6) + # TODO localizer accel + ax[0].set_ylabel('Acceleration (m/s^2)') + #ax[0].set_ylim(-6.5, 6.5) + ax[0].legend(prop={'size': 30}) + + if target_cross_time is not None: + ax[0].plot(target_cross_time, aTarget, marker='o', markersize=50, markeredgewidth=7, markeredgecolor='black', markerfacecolor='None') + + ax[1].grid(linewidth=4) + ax[1].plot(t_carState, [m.vEgo for m in carState], 'g', label='vEgo', linewidth=6) + ax[1].set_ylabel('Velocity (m/s)') + ax[1].legend() + + ax[2].plot(t_carControl, longActive, label='longActive', linewidth=6) + ax[3].plot(t_carState, [m.gasPressed for m in carState], label='gasPressed', linewidth=6) + ax[3].plot(t_carState, [m.brakePressed for m in carState], label='brakePressed', linewidth=6) + for i in (2, 3): + ax[i].set_yticks([0, 1], minor=False) + ax[i].set_ylim(-1, 2) + ax[i].legend() + + ax[-1].set_xlabel("Time (s)") + fig.tight_layout() + + buffer = io.BytesIO() + fig.savefig(buffer, format='webp') + plt.close(fig) + buffer.seek(0) + builder.append(f"\n") + builder.append("
    \n") + + summary = ["

    Summary

    \n"] + cols = ['maneuver', 'crossed', 'runs', 'mean', 'min', 'max'] + table = [] + for description, runs in maneuvers: + times = target_cross_times[description] + l = [description, len(times), len(runs)] + if len(times): + l.extend([round(sum(times) / len(times), 2), round(min(times), 2), round(max(times), 2)]) + table.append(l) + summary.append(tabulate(table, headers=cols, tablefmt='html', numalign='left') + '\n') + + sum_idx = builder.index('{ summary }') + builder[sum_idx:sum_idx + 1] = summary + + with open(output_fn, "w") as f: + f.write(''.join(builder)) + + print(f"\nOpening report: {output_fn}\n") + webbrowser.open_new_tab(str(output_fn)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Generate longitudinal maneuver report from route') + parser.add_argument('route', type=str, help='Route name (e.g. 00000000--5f742174be)') + parser.add_argument('description', type=str, nargs='?') + + args = parser.parse_args() + + if '/' in args.route or '|' in args.route: + lr = LogReader(args.route) + else: + segs = [seg for seg in os.listdir(Paths.log_root()) if args.route in seg] + lr = LogReader([os.path.join(Paths.log_root(), seg, 'rlog.zst') for seg in segs]) + + CP = lr.first('carParams') + ID = lr.first('initData') + platform = CP.carFingerprint + print('processing report for', platform) + + maneuvers: list[tuple[str, list[list]]] = [] + active_prev = False + description_prev = None + + for msg in lr: + if msg.which() == 'alertDebug': + active = 'Maneuver Active' in msg.alertDebug.alertText1 + if active and not active_prev: + if msg.alertDebug.alertText2 == description_prev: + maneuvers[-1][1].append([]) + else: + maneuvers.append((msg.alertDebug.alertText2, [[]])) + description_prev = maneuvers[-1][0] + active_prev = active + + if active_prev: + maneuvers[-1][1][-1].append(msg) + + report(platform, args.route, args.description, CP, ID, maneuvers) diff --git a/iqpilot/tools/maneuvers/maneuver_helpers.py b/iqpilot/tools/maneuvers/maneuver_helpers.py new file mode 100644 index 000000000..9fc65fb9e --- /dev/null +++ b/iqpilot/tools/maneuvers/maneuver_helpers.py @@ -0,0 +1,18 @@ +from enum import IntEnum + +class Axis(IntEnum): + TIME = 0 + EGO_POSITION = 1 + LEAD_DISTANCE= 2 + EGO_V = 3 + LEAD_V = 4 + EGO_A = 5 + D_REL = 6 + +axis_labels = {Axis.TIME: 'Time (s)', + Axis.EGO_POSITION: 'Ego position (m)', + Axis.LEAD_DISTANCE: 'Lead absolute position (m)', + Axis.EGO_V: 'Ego Velocity (m/s)', + Axis.LEAD_V: 'Lead Velocity (m/s)', + Axis.EGO_A: 'Ego acceleration (m/s^2)', + Axis.D_REL: 'Lead distance (m)'} diff --git a/iqpilot/tools/maneuvers/mpc_longitudinal_tuning_report.py b/iqpilot/tools/maneuvers/mpc_longitudinal_tuning_report.py new file mode 100644 index 000000000..6bbe4a65e --- /dev/null +++ b/iqpilot/tools/maneuvers/mpc_longitudinal_tuning_report.py @@ -0,0 +1,293 @@ +import io +import sys +import numpy as np +import matplotlib.pyplot as plt +from iqpilot.common.realtime import DT_MDL +from iqpilot.selfdrive.controls.tests.test_following_distance import desired_follow_distance +from iqpilot.tools.maneuvers.maneuver_helpers import Axis, axis_labels +from iqpilot.selfdrive.test.longitudinal_maneuvers.maneuver import Maneuver + + +def get_html_from_results(results, labels, AXIS): + fig, ax = plt.subplots(figsize=(16, 8)) + for idx, key in enumerate(results.keys()): + ax.plot(results[key][:, Axis.TIME], results[key][:, AXIS], label=labels[idx]) + + ax.set_xlabel(axis_labels[Axis.TIME]) + ax.set_ylabel(axis_labels[AXIS]) + ax.legend(bbox_to_anchor=(1.02, 1), loc='upper left', borderaxespad=0) + ax.grid(True, linestyle='--', alpha=0.7) + ax.text(-0.075, 0.5, '.', transform=ax.transAxes, color='none') + + fig_buffer = io.StringIO() + fig.savefig(fig_buffer, format='svg', bbox_inches='tight') + plt.close(fig) + return fig_buffer.getvalue() + '
    ' + + +def generate_mpc_tuning_report(): + htmls = [] + + results = {} + name = 'Resuming behind lead' + labels = [] + for lead_accel in np.linspace(1.0, 4.0, 4): + man = Maneuver( + '', + duration=11, + initial_speed=0.0, + lead_relevancy=True, + initial_distance_lead=desired_follow_distance(0.0, 0.0), + speed_lead_values=[0.0, 10 * lead_accel], + cruise_values=[100, 100], + prob_lead_values=[1.0, 1.0], + breakpoints=[1., 11], + ) + valid, results[lead_accel] = man.evaluate() + labels.append(f'{lead_accel} m/s^2 lead acceleration') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_V)) + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + + + results = {} + name = 'Approaching stopped car from 140m' + labels = [] + for speed in np.arange(0, 45, 5): + man = Maneuver( + name, + duration=30., + initial_speed=float(speed), + lead_relevancy=True, + initial_distance_lead=140., + speed_lead_values=[0.0, 0.], + breakpoints=[0., 30.], + ) + valid, results[speed] = man.evaluate() + labels.append(f'{speed} m/s approach speed') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + htmls.append(get_html_from_results(results, labels, Axis.D_REL)) + + + results = {} + name = 'Following 5s (triangular) oscillating lead' + labels = [] + speed = np.int64(10) + for oscil in np.arange(0, 10, 1): + man = Maneuver( + '', + duration=30., + initial_speed=float(speed), + lead_relevancy=True, + initial_distance_lead=desired_follow_distance(speed, speed), + speed_lead_values=[speed, speed, speed - oscil, speed + oscil, speed - oscil, speed + oscil, speed - oscil], + breakpoints=[0., 2., 5, 8, 15, 18, 25.], + ) + valid, results[oscil] = man.evaluate() + labels.append(f'{oscil} m/s oscillation size') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.D_REL)) + htmls.append(get_html_from_results(results, labels, Axis.EGO_V)) + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + + + results = {} + name = 'Following 5s (sinusoidal) oscillating lead' + labels = [] + speed = np.int64(10) + duration = float(30) + f_osc = 1. / 5 + for oscil in np.arange(0, 10, 1): + bps = DT_MDL * np.arange(int(duration / DT_MDL)) + lead_speeds = speed + oscil * np.sin(2 * np.pi * f_osc * bps) + man = Maneuver( + '', + duration=duration, + initial_speed=float(speed), + lead_relevancy=True, + initial_distance_lead=desired_follow_distance(speed, speed), + speed_lead_values=lead_speeds, + breakpoints=bps, + ) + valid, results[oscil] = man.evaluate() + labels.append(f'{oscil} m/s oscillation size') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.D_REL)) + htmls.append(get_html_from_results(results, labels, Axis.EGO_V)) + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + + + results = {} + name = 'Speed profile when converging to steady state lead at 30m/s' + labels = [] + for distance in np.arange(20, 140, 10): + man = Maneuver( + '', + duration=50, + initial_speed=30.0, + lead_relevancy=True, + initial_distance_lead=distance, + speed_lead_values=[30.0], + breakpoints=[0.], + ) + valid, results[distance] = man.evaluate() + labels.append(f'{distance} m initial distance') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_V)) + htmls.append(get_html_from_results(results, labels, Axis.D_REL)) + + + results = {} + name = 'Speed profile when converging to steady state lead at 20m/s' + labels = [] + for distance in np.arange(20, 140, 10): + man = Maneuver( + '', + duration=50, + initial_speed=20.0, + lead_relevancy=True, + initial_distance_lead=distance, + speed_lead_values=[20.0], + breakpoints=[0.], + ) + valid, results[distance] = man.evaluate() + labels.append(f'{distance} m initial distance') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_V)) + htmls.append(get_html_from_results(results, labels, Axis.D_REL)) + + + results = {} + name = 'Following car at 30m/s that comes to a stop' + labels = [] + for stop_time in np.arange(4, 14, 1): + man = Maneuver( + '', + duration=30, + initial_speed=30.0, + cruise_values=[30.0, 30.0, 30.0], + lead_relevancy=True, + initial_distance_lead=60.0, + speed_lead_values=[30.0, 30.0, 0.0], + breakpoints=[0., 5., 5 + stop_time], + ) + valid, results[stop_time] = man.evaluate() + labels.append(f'{stop_time} seconds stop time') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + htmls.append(get_html_from_results(results, labels, Axis.D_REL)) + + + results = {} + name = 'Response to cut-in at half follow distance' + labels = [] + for speed in np.arange(0, 40, 5): + man = Maneuver( + '', + duration=20, + initial_speed=float(speed), + cruise_values=[speed, speed, speed], + lead_relevancy=True, + initial_distance_lead=desired_follow_distance(speed, speed) / 2, + speed_lead_values=[speed, speed, speed], + prob_lead_values=[0.0, 0.0, 1.0], + breakpoints=[0., 5.0, 5.01], + ) + valid, results[speed] = man.evaluate() + labels.append(f'{speed} m/s speed') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + htmls.append(get_html_from_results(results, labels, Axis.D_REL)) + + + results = {} + name = 'Follow a lead that accelerates at 2m/s^2 until steady state speed' + labels = [] + for speed in np.arange(0, 40, 5): + man = Maneuver( + '', + duration=60, + initial_speed=0.0, + lead_relevancy=True, + initial_distance_lead=desired_follow_distance(0.0, 0.0), + speed_lead_values=[0.0, 0.0, speed], + prob_lead_values=[1.0, 1.0, 1.0], + breakpoints=[0., 1.0, speed / 2], + ) + valid, results[speed] = man.evaluate() + labels.append(f'{speed} m/s speed') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_V)) + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + + + results = {} + name = 'From stop to cruise' + labels = [] + for speed in np.arange(0, 40, 5): + man = Maneuver( + '', + duration=50, + initial_speed=0.0, + lead_relevancy=True, + initial_distance_lead=desired_follow_distance(0.0, 0.0), + speed_lead_values=[0.0, 0.0], + cruise_values=[0.0, speed], + prob_lead_values=[0.0, 0.0], + breakpoints=[1., 1.01], + ) + valid, results[speed] = man.evaluate() + labels.append(f'{speed} m/s speed') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_V)) + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + + + results = {} + name = 'From cruise to min' + labels = [] + for speed in np.arange(10, 40, 5): + man = Maneuver( + '', + duration=50, + initial_speed=float(speed), + lead_relevancy=True, + initial_distance_lead=desired_follow_distance(0.0, 0.0), + speed_lead_values=[0.0, 0.0], + cruise_values=[speed, 10.0], + prob_lead_values=[0.0, 0.0], + breakpoints=[1., 1.01], + ) + valid, results[speed] = man.evaluate() + labels.append(f'{speed} m/s speed') + + htmls.append(f'

    {name}

    ') + htmls.append(get_html_from_results(results, labels, Axis.EGO_V)) + htmls.append(get_html_from_results(results, labels, Axis.EGO_A)) + + return htmls + + +if __name__ == '__main__': + htmls = generate_mpc_tuning_report() + + if len(sys.argv) < 2: + file_name = 'long_mpc_tune_report.html' + else: + file_name = sys.argv[1] + + with open(file_name, 'w') as f: + f.write('

    MPC longitudinal tuning report

    ') + for html in htmls: + f.write(html) diff --git a/iqpilot/tools/maneuvers/sim_harness.py b/iqpilot/tools/maneuvers/sim_harness.py new file mode 100644 index 000000000..5f5f0c6b6 --- /dev/null +++ b/iqpilot/tools/maneuvers/sim_harness.py @@ -0,0 +1,244 @@ +#!/usr/bin/env python3 +"""Closed-loop offline harness for the maneuver daemons. + +Runs maneuversd / lateral_maneuversd as real subprocesses over msgq, drives them with a +synthetic vehicle, and records every message to an rlog that the report generators can read. +Used to validate the maneuver tooling without a car. +""" +import math +import os +import signal +import subprocess +import sys +import time +from pathlib import Path +from typing import NamedTuple + +import numpy as np +import zstandard as zstd + +from iqpilot.cereal import car, messaging +from iqpilot.common.params import Params +from iqpilot.common.realtime import DT_CTRL, Ratekeeper +from iqpilot.common.basedir import BASEDIR + +PUB_100HZ = ('carState', 'carControl', 'carOutput', 'controlsState', 'selfdriveState') +PUB_20HZ = ('modelV2', 'deviceMotion', 'vehicleParameters') +SUB = ('alertDebug', 'longitudinalPlan', 'lateralManeuverPlan') + +STEER_RATIO = 15.0 +WHEELBASE = 2.78 + + +class LongPlan(NamedTuple): + aTarget: float + shouldStop: bool + + +class LatPlan(NamedTuple): + desiredCurvature: float + + +class Plant: + """Vehicle model. Subclasses consume the daemon's plan and fill the published messages.""" + + sim = None + PLAN = 'longitudinalPlan' + + def __init__(self, v_ego: float = 0.0): + self.v_ego = v_ego + self.a_ego = 0.0 + self.curvature = 0.0 # commanded, controlsState.desiredCurvature + self.achieved_curvature = 0.0 # measured, controlsState.curvature + self.lat_accel = 0.0 + self.long_active = True + self.lat_active = True + self.steering_pressed = False + self.gas_pressed = False + + def step(self, dt: float, plan) -> None: + raise NotImplementedError + + def _angle(self, curvature: float) -> float: + return math.degrees(curvature * WHEELBASE * STEER_RATIO) + + def _torque(self, curvature: float) -> float: + return float(np.clip(curvature * max(self.v_ego, 1.0) ** 2 / 3.0, -1.0, 1.0)) + + def fill_car_state(self, cs) -> None: + cs.vEgo = float(self.v_ego) + cs.vEgoRaw = float(self.v_ego) + cs.vEgoCluster = float(self.v_ego) + cs.aEgo = float(self.a_ego) + cs.standstill = self.v_ego < 0.01 + cs.steeringPressed = self.steering_pressed + cs.gasPressed = self.gas_pressed + cs.steeringAngleDeg = self._angle(self.achieved_curvature) + cs.cruiseState.enabled = True + cs.cruiseState.available = True + cs.cruiseState.speed = float(max(self.v_ego, 1.0)) + + def fill_car_control(self, cc) -> None: + cc.enabled = True + cc.latActive = self.lat_active + cc.longActive = self.long_active + cc.orientationNED = [0.0, 0.0, 0.0] + cc.actuators.curvature = float(self.curvature) + cc.actuators.accel = float(self.a_ego) + cc.actuators.steeringAngleDeg = self._angle(self.curvature) + cc.actuators.torque = self._torque(self.curvature) + + +class ManeuverSim: + def __init__(self, module: str, plant: Plant, fingerprint: str = "TOYOTA_SIENNA", + max_maneuvers: int = 0, timeout: float = 600.0, verbose: bool = True): + self.module = module + self.plant = plant + plant.sim = self + self.fingerprint = fingerprint + self.max_maneuvers = max_maneuvers + self.timeout = timeout + self.verbose = verbose + + self.events: list[bytes] = [] + self.alert1 = '' + self.alert2 = '' + self.seen_maneuvers: list[str] = [] + self.finished = False + + def _write_car_params(self): + CP = car.CarParams.new_message() + CP.carFingerprint = self.fingerprint + CP.brand = "toyota" + CP.openpilotLongitudinalControl = True + CP.autoResumeSng = True + CP.steerRatio = STEER_RATIO + CP.wheelbase = WHEELBASE + Params().put("CarParams", CP.to_bytes()) + return CP + + def _head_events(self, CP): + init = messaging.new_message('initData') + init.valid = True + init.initData.gitCommit = "simulated" + init.initData.gitBranch = "sim" + init.initData.gitRemote = "iqpilot-sim" + self.events.append(init.to_bytes()) + + cpm = messaging.new_message('carParams') + cpm.valid = True + cpm.carParams = CP + self.events.append(cpm.to_bytes()) + + def _launch(self): + env = dict(os.environ) + env["PYTHONPATH"] = str(BASEDIR) + os.pathsep + env.get("PYTHONPATH", "") + return subprocess.Popen([sys.executable, "-c", f"from {self.module} import main; main()"], + cwd=str(BASEDIR), env=env, start_new_session=True) + + def _on_alert(self, ad): + text1, text2 = ad.alertText1, ad.alertText2 + if (text1, text2) != (self.alert1, self.alert2): + if self.verbose: + print(f" [{time.monotonic() - self.t_start:6.1f}s] {text1!r} | {text2!r}") + if text2 and text2 not in self.seen_maneuvers: + self.seen_maneuvers.append(text2) + if text1 == 'Maneuvers Finished': + self.finished = True + self.alert1, self.alert2 = text1, text2 + + def run(self, out: Path) -> Path: + self._head_events(self._write_car_params()) + + pm = messaging.PubMaster(list(PUB_100HZ) + list(PUB_20HZ)) + socks = {s: messaging.sub_sock(s, conflate=False, timeout=0) for s in SUB} + + proc = self._launch() + self.t_start = time.monotonic() + rk = Ratekeeper(int(1.0 / DT_CTRL), print_delay_threshold=None) + + plans: dict[str, object | None] = {'longitudinalPlan': None, 'lateralManeuverPlan': None} + frame = 0 + try: + while True: + for s, sock in socks.items(): + while True: + raw = sock.receive(non_blocking=True) + if raw is None: + break + self.events.append(raw) + evt = messaging.log_from_bytes(raw) + if s == 'alertDebug': + self._on_alert(evt.alertDebug) + elif s == 'longitudinalPlan': + plans[s] = LongPlan(evt.longitudinalPlan.aTarget, evt.longitudinalPlan.shouldStop) + elif s == 'lateralManeuverPlan': + plans[s] = LatPlan(evt.lateralManeuverPlan.desiredCurvature) if evt.valid else None + + self.plant.step(DT_CTRL, plans[self.plant.PLAN]) + + for s in PUB_100HZ: + raw = self._build(s).to_bytes() + self.events.append(raw) + pm.send(s, raw) + + if frame % 5 == 0: + for s in PUB_20HZ: + raw = self._build(s).to_bytes() + self.events.append(raw) + pm.send(s, raw) + + frame += 1 + if self.finished: + break + if self.max_maneuvers and len(self.seen_maneuvers) > self.max_maneuvers: + break + if time.monotonic() - self.t_start > self.timeout: + print(" timed out") + break + rk.keep_time() + finally: + if proc.poll() is None: + os.killpg(os.getpgid(proc.pid), signal.SIGTERM) + proc.wait(timeout=5) + for sock in socks.values(): + del sock + + out.parent.mkdir(parents=True, exist_ok=True) + out.write_bytes(zstd.compress(b"".join(self.events), 10)) + return out + + def _build(self, s: str): + msg = messaging.new_message(s) + msg.valid = True + if s == 'carState': + self.plant.fill_car_state(msg.carState) + elif s == 'carControl': + self.plant.fill_car_control(msg.carControl) + elif s == 'carOutput': + msg.carOutput.actuatorsOutput.accel = float(self.plant.a_ego) + msg.carOutput.actuatorsOutput.curvature = float(self.plant.curvature) + msg.carOutput.actuatorsOutput.steeringAngleDeg = self.plant._angle(self.plant.achieved_curvature) + msg.carOutput.actuatorsOutput.torque = self.plant._torque(self.plant.achieved_curvature) + elif s == 'controlsState': + msg.controlsState.curvature = float(self.plant.achieved_curvature) + msg.controlsState.desiredCurvature = float(self.plant.curvature) + elif s == 'selfdriveState': + msg.selfdriveState.enabled = True + msg.selfdriveState.active = True + msg.selfdriveState.state = 'enabled' + elif s == 'modelV2': + msg.modelV2.frameId = 0 + msg.modelV2.action.desiredCurvature = 0.0 + elif s == 'deviceMotion': + msg.deviceMotion.accelerationDevice.x = float(self.plant.a_ego) + msg.deviceMotion.accelerationDevice.y = float(self.plant.lat_accel) + msg.deviceMotion.velocityDevice.x = float(self.plant.v_ego) + msg.deviceMotion.inputsOK = True + msg.deviceMotion.posenetOK = True + msg.deviceMotion.sensorsOK = True + elif s == 'vehicleParameters': + msg.vehicleParameters.valid = True + msg.vehicleParameters.roll = 0.0 + msg.vehicleParameters.steerRatio = STEER_RATIO + return msg diff --git a/iqpilot/tools/maneuvers/simulate_lateral.py b/iqpilot/tools/maneuvers/simulate_lateral.py new file mode 100755 index 000000000..056cb1cfc --- /dev/null +++ b/iqpilot/tools/maneuvers/simulate_lateral.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +"""Run lateral_maneuversd against a synthetic lateral plant and write an rlog. + + ./iqpilot/tools/maneuvers/simulate_lateral.py --out /tmp/lat_rlog.zst + ./iqpilot/tools/maneuvers/lateral_report.py /tmp/lat_rlog.zst +""" +import argparse +import re +from pathlib import Path + +from iqpilot.common.constants import CV +from iqpilot.tools.maneuvers.lateral_maneuversd import MANEUVERS +from iqpilot.tools.maneuvers.sim_harness import ManeuverSim, Plant + +CURV_TAU = 0.05 # controlsd curvature command tracking +RACK_WN = 8.0 # steering rack + tire natural frequency (rad/s) +RACK_ZETA = 0.7 # underdamped, so achieved curvature overshoots like a real rack +CRUISE_ACCEL = 1.2 + +SET_SPEED_RE = re.compile(r"Set speed to (\d+) mph") + + +class LateralPlant(Plant): + PLAN = 'lateralManeuverPlan' + + def __init__(self, steer_input: float = 0.0): + super().__init__(v_ego=MANEUVERS[0].initial_speed) + self.sim = None + self._rack_rate = 0.0 + self.target_speed = MANEUVERS[0].initial_speed + self._by_description = {m.description: m.initial_speed for m in MANEUVERS} + # seconds of steeringPressed to assert at each maneuver start, mimicking the driver-torque + # spike a curvature step produces on a car with a tight override threshold + self.steer_input = steer_input + self._steer_hold = 0.0 + self._was_active = False + + def _update_target(self): + if self.sim is None: + return + speed = self._by_description.get(self.sim.alert2) + if speed is None: + match = SET_SPEED_RE.search(self.sim.alert1) + speed = float(match.group(1)) * CV.MPH_TO_MS if match else None + if speed is not None: + self.target_speed = speed + + def step(self, dt, plan): + self._update_target() + + active = plan is not None + if self.steer_input > 0 and active and not self._was_active: + self._steer_hold = self.steer_input + self._was_active = active + self.steering_pressed = self._steer_hold > 0 + self._steer_hold = max(self._steer_hold - dt, 0.0) + + err = self.target_speed - self.v_ego + self.a_ego = max(min(err / 1.0, CRUISE_ACCEL), -CRUISE_ACCEL) + self.v_ego = max(self.v_ego + self.a_ego * dt, 0.0) + + desired_curvature = float(plan.desiredCurvature) if plan is not None else 0.0 + self.curvature += (dt / (CURV_TAU + dt)) * (desired_curvature - self.curvature) + + self._rack_rate += dt * (RACK_WN ** 2 * (self.curvature - self.achieved_curvature) - 2 * RACK_ZETA * RACK_WN * self._rack_rate) + self.achieved_curvature += dt * self._rack_rate + self.lat_accel = self.achieved_curvature * max(self.v_ego, 1.0) ** 2 + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, default=Path("/tmp/lateral_maneuvers_sim/rlog.zst")) + parser.add_argument("--max-maneuvers", type=int, default=0, help="stop after N maneuvers (0 = all)") + parser.add_argument("--timeout", type=float, default=900.0) + parser.add_argument("--steer-input", type=float, default=0.0, + help="seconds of steeringPressed to assert at each maneuver start (0 = hands off)") + args = parser.parse_args() + + sim = ManeuverSim("iqpilot.tools.maneuvers.lateral_maneuversd", LateralPlant(args.steer_input), + max_maneuvers=args.max_maneuvers, timeout=args.timeout) + out = sim.run(args.out) + print(f"\nmaneuvers seen: {sim.seen_maneuvers}") + print(f"rlog: {out} ({out.stat().st_size / 1e6:.1f} MB)") + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/maneuvers/simulate_longitudinal.py b/iqpilot/tools/maneuvers/simulate_longitudinal.py new file mode 100755 index 000000000..5a9fe8941 --- /dev/null +++ b/iqpilot/tools/maneuvers/simulate_longitudinal.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +"""Run maneuversd against a synthetic longitudinal plant and write an rlog. + + ./iqpilot/tools/maneuvers/simulate_longitudinal.py --out /tmp/long_rlog.zst + ./iqpilot/tools/maneuvers/longitudinal_report.py /tmp/long_rlog.zst +""" +import argparse +from pathlib import Path + +from iqpilot.tools.maneuvers.sim_harness import ManeuverSim, Plant + +WN = 6.0 # powertrain natural frequency (rad/s) +ZETA = 0.6 # underdamped, so actual accel overshoots the target like a real car + + +class LongitudinalPlant(Plant): + def __init__(self): + super().__init__() + self.jerk = 0.0 + + def step(self, dt, plan): + a_target = float(plan.aTarget) if plan is not None else 0.0 + if plan is not None and plan.shouldStop: + a_target = min(a_target, -0.5) + + self.jerk += dt * (WN ** 2 * (a_target - self.a_ego) - 2 * ZETA * WN * self.jerk) + self.a_ego += dt * self.jerk + + self.v_ego = max(self.v_ego + self.a_ego * dt, 0.0) + if self.v_ego <= 0.0: + self.a_ego = min(self.a_ego, 0.0) + self.jerk = min(self.jerk, 0.0) + self.lat_accel = 0.0 + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, default=Path("/tmp/longitudinal_maneuvers_sim/rlog.zst")) + parser.add_argument("--max-maneuvers", type=int, default=0, help="stop after N maneuvers (0 = all)") + parser.add_argument("--timeout", type=float, default=900.0) + args = parser.parse_args() + + sim = ManeuverSim("iqpilot.tools.maneuvers.longitudinal_maneuversd", LongitudinalPlant(), + max_maneuvers=args.max_maneuvers, timeout=args.timeout) + out = sim.run(args.out) + print(f"\nmaneuvers seen: {sim.seen_maneuvers}") + print(f"rlog: {out} ({out.stat().st_size / 1e6:.1f} MB)") + + +if __name__ == "__main__": + main() diff --git a/iqpilot/tools/scons/site_init.py b/iqpilot/tools/scons/site_init.py new file mode 100644 index 000000000..465d7e2c3 --- /dev/null +++ b/iqpilot/tools/scons/site_init.py @@ -0,0 +1,108 @@ +import os +import sys + +import SCons.Script.Main as _main + +try: + from site_tools import pretty as _pretty +except Exception: + _pretty = None + + +def _tty(): + return sys.stdout.isatty() and not os.environ.get("NO_COLOR") + + +_DIM = "\033[2;38;5;246m" +_BLUE = "\033[38;5;111m" +_GREEN = "\033[38;5;114m" +_RED = "\033[38;5;203m" +_RST = "\033[0m" + +_READING = "scons: Reading SConscript files ..." + +_PHASES = { + _READING: f"{_DIM}reading sconscriptsâ€Ļ{_RST}", + "scons: done reading SConscript files.": f"{_DIM}sconscripts read{_RST}", + "scons: Building targets ...": f"{_BLUE}buildingâ€Ļ{_RST}", + "scons: done building targets.": f"{_GREEN}✓ build complete{_RST}", + "scons: done building targets (errors occurred during build).": f"{_RED}✗ build failed{_RST}", + "scons: writing .sconsign file.": f"{_DIM}writing .sconsign{_RST}", + "scons: Cleaning targets ...": f"{_DIM}cleaningâ€Ļ{_RST}", + "scons: done cleaning targets.": f"{_GREEN}✓ clean complete{_RST}", + "scons: done cleaning targets (errors occurred during clean).": f"{_RED}✗ clean failed{_RST}", +} + + +def _phase(text): + if _tty() and isinstance(text, str) and text in _PHASES: + return _PHASES[text] + return text + + +def _clean(text): + if not (_tty() and _pretty and isinstance(text, str)): + return text + for prefix in ("Removed directory ", "Removed "): + if text.startswith(prefix): + return _pretty._format("CLEAN", text[len(prefix):]) + return text + + +class _Restyle: + # delegates unknown attrs (.set_mode etc.) to the wrapped DisplayEngine + def __init__(self, orig, transform): + self._orig = orig + self._transform = transform + + def __call__(self, text, *args, **kwargs): + return self._orig(self._transform(text), *args, **kwargs) + + def __getattr__(self, name): + return getattr(self._orig, name) + + +if not isinstance(_main.progress_display, _Restyle): + _main.progress_display = _Restyle(_main.progress_display, _phase) +if not isinstance(_main.display, _Restyle): + _main.display = _Restyle(_main.display, _clean) + + +# SConstruct imports this instead of scons auto-loading a root site_scons dir, so the reading +# banner is already on screen by now; rewrite that one line in place +if not getattr(_main, "_iq_banner_restyled", False): + _main._iq_banner_restyled = True + if _tty() and _main.progress_display.print_it: + sys.stdout.write(f"\033[F\033[2K{_PHASES[_READING]}\n") + sys.stdout.flush() + + +# drop only "Could not remove ... No such file" during clean; real errors still print +import builtins as _builtins + + +def _wrap_clean(orig): + def wrapper(self, *args, **kwargs): + if getattr(_builtins.print, "_iq_clean", False): + return orig(self, *args, **kwargs) + real = _builtins.print + + def filtered(*a, **k): + if a and isinstance(a[0], str) and a[0].startswith("scons: Could not remove"): + if "No such file" in " ".join(str(x) for x in a): + return + return real(*a, **k) + filtered._iq_clean = True + _builtins.print = filtered + try: + return orig(self, *args, **kwargs) + finally: + _builtins.print = real + return wrapper + + +if not getattr(_main.CleanTask.fs_delete, "_iq_wrapped", False): + _main.CleanTask.fs_delete = _wrap_clean(_main.CleanTask.fs_delete) + _main.CleanTask.remove = _wrap_clean(_main.CleanTask.remove) + _main.CleanTask.fs_delete._iq_wrapped = True + _main.CleanTask.remove._iq_wrapped = True diff --git a/iqpilot/tools/scons/site_tools/cython.py b/iqpilot/tools/scons/site_tools/cython.py new file mode 100644 index 000000000..cefc571d7 --- /dev/null +++ b/iqpilot/tools/scons/site_tools/cython.py @@ -0,0 +1,82 @@ +import re +import sys +import SCons +from SCons.Action import Action +from SCons.Scanner import Scanner +import numpy as np + +pyx_from_import_re = re.compile(r'^from\s+(\S+)\s+cimport', re.M) +pyx_import_re = re.compile(r'^cimport\s+(\S+)', re.M) +cdef_import_re = re.compile(r'^cdef extern from\s+.(\S+).:', re.M) + +np_version = SCons.Script.Value(np.__version__) + +def pyx_scan(node, env, path, arg=None): + contents = node.get_text_contents() + env.Depends(str(node).split('.')[0] + env['CYTHONCFILESUFFIX'], np_version) + + # from cimport ... + matches = pyx_from_import_re.findall(contents) + # cimport + matches += pyx_import_re.findall(contents) + + # Modules can be either .pxd or .pyx files + files = [m.replace('.', '/') + '.pxd' for m in matches] + files += [m.replace('.', '/') + '.pyx' for m in matches] + + # cdef extern from + files += cdef_import_re.findall(contents) + + # Handle relative imports + cur_dir = str(node.get_dir()) + files = [cur_dir + f if f.startswith('/') else f for f in files] + + # Filter out non-existing files (probably system imports) + files = [f for f in files if env.File(f).exists()] + return env.File(files) + + +pyxscanner = Scanner(function=pyx_scan, skeys=['.pyx', '.pxd'], recursive=True) +cythonAction = Action("$CYTHONCOM", "$CYTHONCOMSTR") + + +def create_builder(env): + try: + cython = env['BUILDERS']['Cython'] + except KeyError: + cython = SCons.Builder.Builder( + action=cythonAction, + emitter={}, + suffix=cython_suffix_emitter, + single_source=1 + ) + env.Append(SCANNERS=pyxscanner) + env['BUILDERS']['Cython'] = cython + return cython + +def cython_suffix_emitter(env, source): + return "$CYTHONCFILESUFFIX" + +def generate(env): + env["CYTHON"] = f'"{sys.executable}" -m Cython.Build.Cythonize' + # drop cythonize's stdout progress; errors stay on stderr. kept under --verbose + try: + from SCons.Script import GetOption + quiet = not GetOption("verbose") + except Exception: + quiet = True + env["CYTHONCOM"] = "$CYTHON $CYTHONFLAGS $SOURCE" + (" > /dev/null" if quiet else "") + env["CYTHONCFILESUFFIX"] = ".cpp" + + c_file, _ = SCons.Tool.createCFileBuilders(env) + + c_file.suffix['.pyx'] = cython_suffix_emitter + c_file.add_action('.pyx', cythonAction) + + c_file.suffix['.py'] = cython_suffix_emitter + c_file.add_action('.py', cythonAction) + + create_builder(env) + +def exists(env): + return True diff --git a/iqpilot/tools/scons/site_tools/pretty.py b/iqpilot/tools/scons/site_tools/pretty.py new file mode 100644 index 000000000..fc86b1d06 --- /dev/null +++ b/iqpilot/tools/scons/site_tools/pretty.py @@ -0,0 +1,125 @@ +import os +import sys + +from SCons.Action import Action +from SCons.Script import GetOption + +_GRAD = { + "CC": ((95, 215, 255), (70, 130, 245)), + "CXX": ((95, 205, 255), (130, 110, 250)), + "LINK": ((95, 240, 150), (40, 200, 120)), + "AR": ((120, 235, 220), (40, 175, 185)), + "RANLIB": ((140, 240, 225), (45, 165, 180)), + "SKIP": ((150, 160, 185), (100, 110, 145)), + "CLEAN": ((200, 130, 145), (120, 120, 155)), + "OBJCOPY": ((255, 200, 90), (255, 120, 50)), + "SIGN": ((255, 190, 90), (230, 80, 70)), + "CYTHON": ((215, 130, 255), (140, 80, 250)), + "CAPNP": ((255, 120, 225), (190, 90, 255)), + "RCC": ((200, 160, 255), (150, 110, 250)), + "FONTS": ((130, 190, 255), (90, 120, 250)), + "GEN": ((160, 160, 255), (120, 90, 250)), + "CDB": ((150, 175, 210), (105, 135, 185)), + "MODEL": ((255, 170, 70), (240, 60, 60)), + "META": ((255, 205, 110), (230, 130, 80)), + "MOC": ((255, 140, 205), (215, 90, 240)), + "UIC": ((255, 160, 190), (225, 110, 225)), + "MO": ((100, 235, 200), (55, 200, 155)), +} +_DEFAULT = ((120, 200, 255), (90, 140, 250)) +_TARGET_RGB = (150, 152, 178) + + +def _mode(): + if not sys.stdout.isatty() or os.environ.get("NO_COLOR"): + return None + if os.environ.get("COLORTERM", "").lower() in ("truecolor", "24bit"): + return "true" + return "256" + + +def _fg(rgb, mode): + r, g, b = rgb + if mode == "true": + return f"\033[38;2;{r};{g};{b}m" + if abs(r - g) < 12 and abs(g - b) < 12 and abs(r - b) < 12: + idx = 232 + min(23, round((r + g + b) / 3 / 255 * 23)) + else: + idx = 16 + 36 * round(r / 255 * 5) + 6 * round(g / 255 * 5) + round(b / 255 * 5) + return f"\033[38;5;{idx}m" + + +def _gradient(word, start, end, mode): + n = max(1, len(word) - 1) + out = [] + for i, ch in enumerate(word): + t = i / n + rgb = tuple(int(s + (e - s) * t) for s, e in zip(start, end)) + out.append(f"\033[1m{_fg(rgb, mode)}{ch}") + return "".join(out) + "\033[0m" + + +def _format(label, body): + mode = _mode() + if mode is None: + return f"{label:>8} {body}" + start, end = _GRAD.get(label, _DEFAULT) + pad = " " * max(0, 8 - len(label)) + word = _gradient(label, start, end, mode) + return f"{pad}{word} {_fg(_TARGET_RGB, mode)}{body}\033[0m" + + +def _line(label): + return _format(label, "$TARGET") + + +def _verbose(): + try: + return bool(GetOption("verbose")) + except Exception: + return False + + +def generate(env): + def pretty_action(e, cmd, label, logfile=None, capture_stderr=False): + if _verbose(): + return Action(cmd) + if callable(cmd): + return Action(cmd, _line(label)) + if logfile: + cmd = f"{cmd} > {logfile}" + (" 2>&1" if capture_stderr else "") + return Action(cmd, _line(label)) + env.AddMethod(pretty_action, "PrettyAction") + env.AddMethod(lambda e, label, msg: _format(label, msg), "PrettyNote") + + # real errors are exceptions, not warnings, so they still surface with these ignored + env["PYWARN"] = "" if _verbose() else "PYTHONWARNINGS=ignore::UserWarning" + + if _verbose(): + return + + try: + import SCons.CacheDir as _cachedir + _cachedir.CacheRetrieve.strfunction = lambda target, source, env: "" + except Exception: + pass + + env["CCCOMSTR"] = _line("CC") + env["SHCCCOMSTR"] = _line("CC") + env["CXXCOMSTR"] = _line("CXX") + env["SHCXXCOMSTR"] = _line("CXX") + env["ASCOMSTR"] = _line("CC") + env["ASPPCOMSTR"] = _line("CC") + env["LINKCOMSTR"] = _line("LINK") + env["SHLINKCOMSTR"] = _line("LINK") + env["ARCOMSTR"] = _line("AR") + env["RANLIBCOMSTR"] = _line("RANLIB") + env["CYTHONCOMSTR"] = _line("CYTHON") + env["COMPILATIONDB_COMSTR"] = _line("CDB") + env["QT3_MOCFROMHCOMSTR"] = _line("MOC") + env["QT3_MOCFROMCXXCOMSTR"] = _line("MOC") + env["QT3_UICCOMSTR"] = _line("UIC") + + +def exists(env): + return True diff --git a/iqpilot/tools/setup.sh b/iqpilot/tools/setup.sh new file mode 100755 index 000000000..410180ae5 --- /dev/null +++ b/iqpilot/tools/setup.sh @@ -0,0 +1,187 @@ +#!/usr/bin/env bash +set -euo pipefail + +RED='\033[0;31m' +GREEN='\033[0;32m' +BOLD='\033[1m' +NC='\033[0m' + +if [ -z "$OPENPILOT_ROOT" ]; then + # default to current directory for installation + OPENPILOT_ROOT="$(pwd)/openpilot" +fi + +function show_motd() { +cat << 'EOF' + + .~ssos+. + +8888888888i, + {888888888888o. + h8888888888888k + t888888888s888k + `t88888d/ h88k + ``` h88l + ,88k` + .d8h` + +d8h + _+d8h` + ;y8h+` + |-` + + openpilot installer + +EOF +} + +function sentry_send_event() { + SENTRY_KEY=dd0cba62ba0ac07ff9f388f8f1e6a7f4 + SENTRY_URL=https://sentry.io/api/4507726145781760/store/ + + EVENT=$1 + EVENT_TYPE=${2:-$EVENT} + EVENT_LOG=${3:-"NA"} + + PLATFORM=$(uname -s) + ARCH=$(uname -m) + SYSTEM=$(uname -a) + if [[ $PLATFORM == "Darwin" ]]; then + OS="macos" + elif [[ $PLATFORM == "Linux" ]]; then + OS="linux" + fi + + if [[ $ARCH == armv8* ]] || [[ $ARCH == arm64* ]] || [[ $ARCH == aarch64* ]]; then + ARCH="aarch64" + elif [[ $ARCH == "x86_64" ]] || [[ $ARCH == i686* ]]; then + ARCH="x86" + fi + + PYTHON_VERSION=$(echo $(python3 --version 2> /dev/null || echo "NA")) + BRANCH=$(echo $(git -C $OPENPILOT_ROOT rev-parse --abbrev-ref HEAD 2> /dev/null || echo "NA")) + COMMIT=$(echo $(git -C $OPENPILOT_ROOT rev-parse HEAD 2> /dev/null || echo "NA")) + + curl -s -o /dev/null -X POST -g --data "{ \"exception\": { \"values\": [{ \"type\": \"$EVENT\" }] }, \"tags\" : { \"event_type\" : \"$EVENT_TYPE\", \"event_log\" : \"$EVENT_LOG\", \"os\" : \"$OS\", \"arch\" : \"$ARCH\", \"python_version\" : \"$PYTHON_VERSION\" , \"git_branch\" : \"$BRANCH\", \"git_commit\" : \"$COMMIT\", \"system\" : \"$SYSTEM\" } }" \ + -H 'Content-Type: application/json' \ + -H "X-Sentry-Auth: Sentry sentry_version=7, sentry_key=$SENTRY_KEY, sentry_client=op_setup/0.1" \ + $SENTRY_URL 2> /dev/null +} + +function check_stdin() { + if [ -t 0 ]; then + INTERACTIVE=1 + else + echo "Checking for valid invocation..." + echo -e " â†ŗ [${RED}✗${NC}] stdin not found! Running in non-interactive mode." + echo -e " Run ${BOLD}'bash <(curl -fsSL openpilot.comma.ai)'${NC} to run in interactive mode.\n" + fi +} + +function ask_dir() { + echo -n "Enter directory in which to install openpilot (default $OPENPILOT_ROOT): " + + if [[ -z $INTERACTIVE ]]; then + echo -e "\nBecause your are running in non-interactive mode, the installation" + echo -e "will default to $OPENPILOT_ROOT\n" + return 0 + fi + + read + if [[ ! -z "$REPLY" ]]; then + mkdir -p $REPLY + OPENPILOT_ROOT="$(realpath $REPLY)/openpilot" + fi +} + +function check_dir() { + echo "Checking for installation directory..." + if [ -d "$OPENPILOT_ROOT" ]; then + echo -e " â†ŗ [${RED}✗${NC}] Installation destination $OPENPILOT_ROOT already exists!" + + # not a valid clone, can't continue + if [[ ! -z "$(ls -A $OPENPILOT_ROOT)" && ! -f "$OPENPILOT_ROOT/launch_openpilot.sh" ]]; then + echo -e " $OPENPILOT_ROOT already contains files but does not seems" + echo -e " to be a valid openpilot git clone. Choose another location for" + echo -e " installing openpilot!\n" + return 1 + fi + + # already a "valid" openpilot clone, skip cloning again + if [[ ! -z "$(ls -A $OPENPILOT_ROOT)" ]]; then + SKIP_GIT_CLONE=1 + fi + + # by default, don't try installing in already existing directory + if [[ -z $INTERACTIVE ]]; then + return 0 + fi + + read -p " Would you like to attempt installation anyway? [Y/n] " -n 1 -r + echo -e "\n" + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + return 1 + fi + + return 0 + fi + + echo -e " â†ŗ [${GREEN}✔${NC}] Successfully chosen $OPENPILOT_ROOT as installation directory\n" +} + +function check_git() { + echo "Checking for git..." + if ! command -v "git" > /dev/null 2>&1; then + echo -e " â†ŗ [${RED}✗${NC}] git not found on your system, can't continue!" + sentry_send_event "SETUP_FAILURE" "ERROR_GIT_NOT_FOUND" + return 1 + else + echo -e " â†ŗ [${GREEN}✔${NC}] git found.\n" + fi +} + +function git_clone() { + st="$(date +%s)" + echo "Cloning openpilot..." + if $(git clone --filter=blob:none https://github.com/commaai/openpilot.git "$OPENPILOT_ROOT"); then + if [[ -f $OPENPILOT_ROOT/launch_openpilot.sh ]]; then + et="$(date +%s)" + echo -e " â†ŗ [${GREEN}✔${NC}] Successfully cloned openpilot in $((et - st)) seconds.\n" + return 0 + fi + fi + + echo -e " â†ŗ [${RED}✗${NC}] failed to clone openpilot!" + sentry_send_event "SETUP_FAILURE" "ERROR_GIT_CLONE" + return 1 +} + +function install_with_iq() { + cd $OPENPILOT_ROOT + $OPENPILOT_ROOT/iqpilot/tools/iq.sh install + + LOG_FILE=$(mktemp) + + if ! $OPENPILOT_ROOT/iqpilot/tools/iq.sh --log $LOG_FILE setup; then + echo -e "\n[${RED}✗${NC}] failed to install openpilot!" + + ERROR_TYPE="$(cat "$LOG_FILE" | sed '1p;d')" + ERROR_LOG="$(cat "$LOG_FILE" | sed '2p;d')" + sentry_send_event "SETUP_FAILURE" "$ERROR_TYPE" "$ERROR_LOG" || true + + return 1 + else + sentry_send_event "SETUP_SUCCESS" || true + fi + + echo -e "\n----------------------------------------------------------------------" + echo -e "[${GREEN}✔${NC}] openpilot was successfully installed into ${BOLD}$OPENPILOT_ROOT${NC}" + echo -e "Checkout the docs at https://docs.comma.ai" + echo -e "Checkout how to contribute at https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md" +} + +show_motd +check_stdin +ask_dir +check_dir +check_git +[ -z $SKIP_GIT_CLONE ] && git_clone +install_with_iq diff --git a/iqpilot/tools/test_tools_local_route.py b/iqpilot/tools/test_tools_local_route.py new file mode 100644 index 000000000..f75db4864 --- /dev/null +++ b/iqpilot/tools/test_tools_local_route.py @@ -0,0 +1,106 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import os +import shutil +import subprocess +import time +from pathlib import Path + +import pytest + +import iqpilot.cereal.messaging as messaging +from iqpilot.cereal import log + +TOOLS_DIR = Path(__file__).parent +CABANA_BIN = TOOLS_DIR / "cabana" / "_cabana" +JOTPLUGGLER_BIN = TOOLS_DIR / "jotpluggler" / "jotpluggler" + +DONGLE_ID = "0000000000000000" +TIMESTAMP = "2024-01-01--00-00-00" +ROUTE = f"{DONGLE_ID}|{TIMESTAMP}" + + +def write_rlog(path: Path, n_frames: int = 200): + with open(path, "wb") as f: + cp = messaging.new_message('carParams') + cp.carParams.carFingerprint = "TOYOTA_RAV4_TSS2" + cp.carParams.brand = "toyota" + f.write(cp.to_bytes()) + + for i in range(n_frames): + msg = messaging.new_message('can', 2) + msg.logMonoTime = int(i * 1e7) + for j, addr in enumerate((0x1D2, 0x260)): + msg.can[j].address = addr + msg.can[j].src = 0 + msg.can[j].dat = bytes([i % 256] * 8) + f.write(msg.to_bytes()) + + +@pytest.fixture(scope="module") +def local_route(tmp_path_factory): + data_dir = tmp_path_factory.mktemp("routes") + for seg in range(2): + seg_dir = data_dir / f"{DONGLE_ID}|{TIMESTAMP}--{seg}" + seg_dir.mkdir() + write_rlog(seg_dir / "rlog") + return data_dir + + +def run(cmd, timeout=180): + env = {**os.environ, "QT_QPA_PLATFORM": "offscreen"} + return subprocess.run(cmd, capture_output=True, text=True, timeout=timeout, env=env, + cwd=TOOLS_DIR.parent) + + +def test_jotpluggler_renders_a_local_route(local_route, tmp_path): + assert JOTPLUGGLER_BIN.exists(), "jotpluggler not built" + out = tmp_path / "plot.png" + result = run([str(JOTPLUGGLER_BIN), "--data-dir", str(local_route), + "--sync-load", "--output", str(out), ROUTE]) + assert result.returncode == 0, result.stdout + result.stderr + assert out.is_file(), result.stdout + result.stderr + assert out.stat().st_size > 5000, f"suspiciously small render: {out.stat().st_size} bytes" + + +def test_cabana_loads_a_local_route(local_route): + assert CABANA_BIN.exists(), "cabana not built" + env = {**os.environ, "QT_QPA_PLATFORM": "offscreen"} + proc = subprocess.Popen([str(CABANA_BIN), "--data_dir", str(local_route), "--no-vipc", ROUTE], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, + env=env, cwd=TOOLS_DIR.parent) + loaded = f"loaded route {ROUTE} with 2 valid segments" + lines = [] + deadline = time.monotonic() + 60 + try: + while time.monotonic() < deadline: + line = proc.stdout.readline() + if not line: + break + lines.append(line) + if loaded in line: + break + finally: + proc.kill() + proc.wait() + proc.stdout.close() + + out = "".join(lines) + assert "failed to load route" not in out, out + assert "invalid route format" not in out, out + assert loaded in out, out + + +def test_replay_logreader_reports_load_stats(local_route): + assert shutil.which("python3") is not None + header = (TOOLS_DIR / "replay" / "logreader.h").read_text() + for accessor in ("compressed_size", "decompressed_size", "download_seconds", + "decompress_seconds", "parse_seconds"): + assert f"{accessor}() const" in header + + +def test_can_capnp_field_matches_extractor_codegen(): + assert 'busTimeDEPRECATED' in log.CanData.schema.fields + gen = (TOOLS_DIR / "jotpluggler" / "generate_event_extractors.py").read_text() + assert "getBusTimeDEPRECATED()" in gen diff --git a/iqpilot/tools/tests/test_iq_command.py b/iqpilot/tools/tests/test_iq_command.py new file mode 100644 index 000000000..79f557d5d --- /dev/null +++ b/iqpilot/tools/tests/test_iq_command.py @@ -0,0 +1,66 @@ +# Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +import os +from pathlib import Path +import subprocess + + +IQ_COMMAND = Path(__file__).parents[1] / "iq.sh" + + +def make_checkout(tmp_path: Path) -> Path: + checkout = tmp_path / "checkout" + (checkout / "iqpilot").mkdir(parents=True) + (checkout / "launch_iqpilot.sh").touch() + return checkout + + +def run_pkg(checkout: Path, path: Path) -> subprocess.CompletedProcess[str]: + env = os.environ.copy() + env["PATH"] = f"{path}:{env['PATH']}" + return subprocess.run( + ["bash", str(IQ_COMMAND), "--dir", str(checkout), "pkg"], + check=False, + capture_output=True, + env=env, + text=True, + ) + + +def test_public_checkout_skips_private_package_source_setup(tmp_path: Path): + checkout = make_checkout(tmp_path) + + result = run_pkg(checkout, tmp_path) + + assert result.returncode == 0 + assert "private package sources are not present" in result.stdout + assert "setup_private_packages.py" not in result.stderr + + +def test_internal_checkout_runs_private_package_source_setup(tmp_path: Path): + checkout = make_checkout(tmp_path) + setup_script = checkout / "iqpilot/tools/scripts/setup_private_packages.py" + setup_script.parent.mkdir(parents=True) + setup_script.touch() + python_log = tmp_path / "python.log" + python = tmp_path / "python3" + python.write_text(f"#!/usr/bin/env bash\nprintf '%s\\n' \"$*\" > {python_log!s}\n") + python.chmod(0o755) + + result = run_pkg(checkout, tmp_path) + + assert result.returncode == 0 + assert python_log.read_text().strip() == "iqpilot/tools/scripts/setup_private_packages.py" + + +def test_public_checkout_runs_bundled_package_installer(tmp_path: Path): + checkout = make_checkout(tmp_path) + installer_log = tmp_path / "installer.log" + installer = checkout / "artifacts/runtime/ensure_private_installed.sh" + installer.parent.mkdir(parents=True) + installer.write_text(f"printf installed > {installer_log!s}\n") + + result = run_pkg(checkout, tmp_path) + + assert result.returncode == 0 + assert installer_log.read_text() == "installed" diff --git a/iqpilot/tools/ubuntu_setup.sh b/iqpilot/tools/ubuntu_setup.sh new file mode 100755 index 000000000..be4cfb68f --- /dev/null +++ b/iqpilot/tools/ubuntu_setup.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +# NOTE: this is used in a docker build, so do not run any scripts here. + +"$DIR"/install_ubuntu_dependencies.sh +"$DIR"/install_python_dependencies.sh diff --git a/iqpilot/ui/__init__.py b/iqpilot/ui/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/ui/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/ui/layouts/__init__.py b/iqpilot/ui/layouts/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/ui/layouts/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/ui/layouts/settings/__init__.py b/iqpilot/ui/layouts/settings/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/ui/layouts/settings/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/ui/layouts/settings/drive_history.py b/iqpilot/ui/layouts/settings/drive_history.py new file mode 100644 index 000000000..9a66b08d1 --- /dev/null +++ b/iqpilot/ui/layouts/settings/drive_history.py @@ -0,0 +1,146 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import requests +import threading +import time +import pyray as rl + +from iqpilot.common.api import api_get +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.common.swaglog import cloudlog +from iqpilot.common.time_helpers import system_time_valid +from iqpilot.selfdrive.ui.lib.api_helpers import get_token +from iqpilot.selfdrive.ui.ui_state import ui_state, device +from iqpilot.konn3kt.registration import UNREGISTERED_DONGLE_ID +from iqpilot.system.ui.lib.application import gui_app, FontWeight, FONT_SCALE +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +_STATS_PARAM = "ApiCache_DriveStats" +_POLL_SECONDS = 30 + +class _DriveStatsSource: + def __init__(self): + self._params = Params() + self._http = requests.Session() + self.snapshot = self._params.get(_STATS_PARAM) or {} + self._alive = True + self._worker = threading.Thread(target=self._poll, daemon=True) + self._worker.start() + + def close(self) -> None: + self._alive = False + try: + if self._worker.is_alive(): + self._worker.join(timeout=1.0) + except Exception: + pass + + def _poll(self) -> None: + while self._alive: + if not ui_state.started and device._awake: + self._pull_once() + time.sleep(_POLL_SECONDS) + + def _pull_once(self) -> None: + try: + dongle_id = self._params.get("DongleId") + if not dongle_id or dongle_id == UNREGISTERED_DONGLE_ID: + return + if not system_time_valid(): + return + resp = api_get(f"v1.1/devices/{dongle_id}/stats", access_token=get_token(dongle_id), session=self._http) + if resp.status_code == 200: + payload = resp.json() + self.snapshot = payload + self._params.put(_STATS_PARAM, payload) + except Exception as e: + cloudlog.error(f"Failed to fetch drive stats: {e}") + + +class TripsLayout(Widget): + PARAM_KEY = _STATS_PARAM + UPDATE_INTERVAL = _POLL_SECONDS + + _CARD_FILL = rl.Color(38, 40, 46, 255) + _CARD_EDGE = rl.Color(255, 255, 255, 18) + _ACCENT = rl.Color(30, 200, 168, 255) + _ACCENT_DIM = rl.Color(93, 202, 165, 255) + _UNIT = rl.Color(138, 139, 144, 255) + _RULE = rl.Color(255, 255, 255, 16) + + def __init__(self): + super().__init__() + self._params = Params() + self._source = _DriveStatsSource() + self._ic_drives = gui_app.texture("icons_mici/wheel.png", 64, 64, keep_aspect_ratio=True) + self._ic_distance = gui_app.texture("icons/road.png", 88, 64, keep_aspect_ratio=True) + self._ic_hours = gui_app.texture("icons/clock.png", 64, 64, keep_aspect_ratio=True) + + def __del__(self): + self._source.close() + + def _columns(self, bucket: dict, is_metric: bool): + routes = int(bucket.get("routes", 0)) + distance = bucket.get("distance", 0) + distance_val = int(distance * CV.MPH_TO_KPH) if is_metric else int(distance) + hours = int(bucket.get("minutes", 0) / 60) + dist_unit = tr("KM") if is_metric else tr("Miles") + return ( + (self._ic_drives, str(routes), tr("Drives")), + (self._ic_distance, str(distance_val), dist_unit), + (self._ic_hours, str(hours), tr("Hours")), + ) + + def _paint_card(self, x, y, width, height, title, columns) -> None: + card = rl.Rectangle(x, y, width, height) + rl.draw_rectangle_rounded(card, 0.10, 20, self._CARD_FILL) + rl.draw_rectangle_rounded_lines_ex(card, 0.10, 20, 2, self._CARD_EDGE) + pad = 44 + label_y = y + 36 + tick_h = 30 + title_size = 34 * FONT_SCALE + rl.draw_rectangle_rounded(rl.Rectangle(x + pad, label_y, 6, tick_h), 0.5, 6, self._ACCENT) + rl.draw_text_ex(gui_app.font(FontWeight.BOLD), title, + rl.Vector2(x + pad + 22, label_y + (tick_h - title_size) / 2), title_size, 4, self._ACCENT_DIM) + col_width = width / 3 + content_top = label_y + tick_h + 20 + content_bottom = y + height - 30 + number_font = gui_app.font(FontWeight.BOLD) + unit_font = gui_app.font(FontWeight.MEDIUM) + number_size = 84 * FONT_SCALE + unit_size = 30 * FONT_SCALE + unit_spacing = 2.0 + icon_gap = 16 + num_gap = 14 + for i in (1, 2): + dx = x + col_width * i + rl.draw_line_ex(rl.Vector2(dx, content_top + 4), rl.Vector2(dx, content_bottom - 4), 1, self._RULE) + + for idx, (icon, value, unit) in enumerate(columns): + center_x = x + col_width * idx + col_width / 2 + unit = unit.upper() + val_w = measure_text_cached(number_font, value, int(number_size)).x + unit_w = measure_text_cached(unit_font, unit, int(unit_size)).x + unit_spacing * max(0, len(unit) - 1) + block_h = icon.height + icon_gap + number_size + num_gap + unit_size + start_y = content_top + max(0.0, (content_bottom - content_top - block_h) / 2) + rl.draw_texture(icon, int(center_x - icon.width / 2), int(start_y), self._ACCENT) + num_y = start_y + icon.height + icon_gap + rl.draw_text_ex(number_font, value, rl.Vector2(center_x - val_w / 2, num_y), number_size, 0, rl.WHITE) + unit_y = num_y + number_size + num_gap + rl.draw_text_ex(unit_font, unit, rl.Vector2(center_x - unit_w / 2, unit_y), unit_size, unit_spacing, self._UNIT) + + def _render(self, rect: rl.Rectangle): + is_metric = self._params.get_bool("IsMetric") + stats = self._source.snapshot + spacing = 28 + card_height = (rect.height - spacing) / 2 + + self._paint_card(rect.x, rect.y, rect.width, card_height, tr("ALL TIME"), + self._columns(stats.get("all", {}), is_metric)) + self._paint_card(rect.x, rect.y + card_height + spacing, rect.width, card_height, tr("PAST WEEK"), + self._columns(stats.get("week", {}), is_metric)) + return -1 diff --git a/iqpilot/ui/layouts/settings/iq_dynamic.py b/iqpilot/ui/layouts/settings/iq_dynamic.py new file mode 100644 index 000000000..cf80605c0 --- /dev/null +++ b/iqpilot/ui/layouts/settings/iq_dynamic.py @@ -0,0 +1,202 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from collections.abc import Callable + +import pyray as rl + +from iqpilot.common.params import Params +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, IQToggleAction, SafeIQToggleAction +from iqpilot.system.ui.iqwidgets.widgets.list_view import OptionControl +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.network import NavButton +from iqpilot.system.ui.widgets.scroller_tici import Scroller +from iqdbc.car.volkswagen.values import CAR, VolkswagenFlags + + +def _toggle_item(title: str, description: str, param: str) -> IQListItem: + return IQListItem( + title=lambda t=title: tr(t), + description=lambda d=description: tr(d), + action_item=IQToggleAction( + initial_state=Params().get_bool(param), + callback=lambda state, p=param: Params().put_bool(p, state), + param=param, + ), + ) + + +def _safe_toggle_item(title: str, description: str, param: str, default_on: bool = True) -> IQListItem: + return IQListItem( + title=lambda t=title: tr(t), + description=lambda d=description: tr(d), + action_item=SafeIQToggleAction( + param=param, + default_on=default_on, + ), + ) + + +def _option_item(title: str, description: str, param: str, minimum: int, maximum: int, + step: int = 1, label_callback=None, use_float_scaling: bool = False) -> IQListItem: + return IQListItem( + title=lambda t=title: tr(t), + description=lambda d=description: tr(d), + action_item=OptionControl( + param=param, + min_value=minimum, + max_value=maximum, + value_change_step=step, + use_float_scaling=use_float_scaling, + label_callback=label_callback, + ), + ) + + +class IQDynamicLayout(Widget): + def __init__(self, back_btn_callback: Callable): + super().__init__() + self._params = Params() + self._back_button = NavButton(tr("Back")) + self._back_button.set_click_callback(back_btn_callback) + + items = self._initialize_items() + self._scroller = Scroller(items, line_separator=True, spacing=0) + + @staticmethod + def _is_pq() -> bool: + bundle = ui_state.params.get("CarPlatformBundle") + if bundle: + platform = bundle.get("platform") + if platform: + try: + return bool(CAR[platform].config.flags & VolkswagenFlags.PQ) + except (KeyError, AttributeError): + return False + elif ui_state.CP: + return bool(ui_state.CP.flags & VolkswagenFlags.PQ) + return False + + def _initialize_items(self): + ms_to_mph = 2.23694 + + def speed_label(value: float | int) -> str: + try: + speed_ms = float(value) + except (TypeError, ValueError): + return "-- mph" + return f"{int(round(speed_ms * ms_to_mph))} mph" + + def distance_label(value: float | int) -> str: + try: + distance_m = float(value) + except (TypeError, ValueError): + return "-- m" + if self._params.get_bool("IsMetric"): + return f"{distance_m:.1f} m" + return f"{distance_m * 3.28084:.0f} ft" + + def seconds_label(value: float | int) -> str: + try: + seconds = float(value) + except (TypeError, ValueError): + return "--.-s" + return f"{seconds:.1f}s" + + self._blend_radar_toggle = _toggle_item( + "Blend IQ.Pilot + Stock ACC Radar", + "VW PQ only. Keep the factory ACC radar engaged and use its acceleration as IQ.Dynamic's ACC " + "(chill) command, while IQ.Pilot still owns blended/e2e control for low speed, stops, and traffic.", + "IQDynamicBlendStockRadar", + ) + self._pq_only_items = [self._blend_radar_toggle] + + return [ + self._blend_radar_toggle, + _toggle_item( + "IQ.Dynamic Curves", + "Allow IQ.Dynamic to enter blended control for curves and strong vision slowdown cues.", + "IQDynamicConditionalCurves", + ), + _toggle_item( + "IQ.Dynamic Slower Lead", + "Allow IQ.Dynamic to switch toward blended control when a slower lead vehicle is detected.", + "IQDynamicConditionalSlowerLead", + ), + _toggle_item( + "IQ.Dynamic Stopped Lead", + "Allow IQ.Dynamic to react more aggressively when a lead vehicle is nearly stopped.", + "IQDynamicConditionalStoppedLead", + ), + _toggle_item( + "IQ.Dynamic Model Stops", + "Allow IQ.Dynamic to switch toward blended control for stop-sign and stop-light style vision stops.", + "IQDynamicConditionalModelStops", + ), + _toggle_item( + "IQ.Dynamic SLC Fallback", + "Allow IQ.Dynamic to request blended control when Speed Limit Controller has no usable target.", + "IQDynamicConditionalSLCFallback", + ), + _option_item( + "IQ.Dynamic Low Speed", + "Below this speed, IQ.Dynamic prefers blended control when no lead is present.", + "IQDynamicConditionalSpeed", + 500, 3500, step=50, + use_float_scaling=True, + label_callback=speed_label, + ), + _toggle_item( + "IQ Force Stops", + "Bring the car to a complete stop for stop signs and stop lights, and feather the brake in the final meters of " + "every stop so it settles gently instead of rocking on its suspension. Yields full braking authority when a lead " + "is close. Override with the accelerator.", + "IQForceStops", + ), + _option_item( + "IQ.Dynamic Lead Speed", + "Below this speed, IQ.Dynamic prefers blended control even with a tracked lead.", + "IQDynamicConditionalLeadSpeed", + 500, 4000, step=50, + use_float_scaling=True, + label_callback=speed_label, + ), + _option_item( + "IQ.Dynamic Model Stop Time", + "Sets the vision stop prediction time horizon used by IQ.Dynamic and IQ Force Stops. Shorter values react later. Longer values react earlier.", + "IQDynamicModelStopTime", + 100, 600, + step=25, + use_float_scaling=True, + label_callback=seconds_label, + ), + _option_item( + "IQ.Dynamic Min Force Stop Length", + "When IQ Force Stops is enabled, keep at least this much stopping distance in the force-stop ramp. Set to 0 to disable the minimum.", + "IQDynamicMinimumForceStopLength", + 0, 5000, + step=50, + use_float_scaling=True, + label_callback=distance_label, + ), + ] + + def _render(self, rect: rl.Rectangle): + is_pq = self._is_pq() + for item in self._pq_only_items: + item.set_visible(is_pq) + + self._back_button.set_position(self._rect.x, self._rect.y + 20) + self._back_button.render() + content_rect = rl.Rectangle( + rect.x, + rect.y + self._back_button.rect.height + 40, + rect.width, + rect.height - self._back_button.rect.height - 40, + ) + self._scroller.render(content_rect) + + def show_event(self): + self._scroller.show_event() diff --git a/iqpilot/ui/layouts/settings/iq_panels.py b/iqpilot/ui/layouts/settings/iq_panels.py new file mode 100644 index 000000000..bb06fa680 --- /dev/null +++ b/iqpilot/ui/layouts/settings/iq_panels.py @@ -0,0 +1,2675 @@ +""" +Copyright Š IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos + +Consolidated IQ.Pilot settings panels (display, visuals, network, maps, steering +and its lane-change / steering-assist sub-panels) in one module. +""" +from iqpilot.cereal import car +from collections.abc import Callable +from enum import Enum +from enum import IntEnum +from iqpilot.common.constants import CV +from iqpilot.common.params import Params +from iqpilot.selfdrive.ui.ui_state import OnroadBrightness +from iqpilot.common.swaglog import cloudlog +from iqpilot.selfdrive.controls.lib.helpers.lane_change import AutoLaneChangeMode +from iqpilot.ui.onroad.offline_tiles import offline_map_root +from iqpilot.selfdrive.ui.layouts.settings.software import time_ago +from iqpilot.selfdrive.ui.ui_state import device, ui_state +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.hardware.hw import Paths +from iqpilot.system.ui.iqwidgets.lib.styles import style +from iqpilot.system.ui.iqwidgets.lib.utils import WideButtonAction +from iqpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, toggle_item +from iqpilot.system.ui.iqwidgets.widgets.list_view import OptionControl +from iqpilot.system.ui.iqwidgets.widgets.list_view import multiple_button_item, toggle_item +from iqpilot.system.ui.iqwidgets.widgets.list_view import option_item, toggle_item, ToggleAction +from iqpilot.system.ui.iqwidgets.widgets.list_view import progress_item +from iqpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, multiple_button_item, IQListItem, IQLineSeparator +from iqpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, option_item, IQLineSeparator +from iqpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, simple_button_item, option_item, IQLineSeparator +from iqpilot.system.ui.iqwidgets.widgets.list_view import PickerGroup, PickerItem, PickerDialog +from iqpilot.system.ui.lib.application import gui_app +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.lib.multilang import tr, tr_noop +from iqpilot.system.ui.widgets import DialogResult, Widget +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.widgets.button import Button, ButtonStyle +from iqpilot.system.ui.widgets.confirm_dialog import ConfirmDialog +from iqpilot.system.ui.widgets.list_view import text_item +from iqpilot.system.ui.widgets.network import NavButton +from iqpilot.system.ui.widgets.network import NetworkUI, PanelType as NetworkPanelType, TEAL +from iqpilot.system.ui.widgets.scroller_tici import Scroller +from pathlib import Path +from time import monotonic +import datetime +import os +import platform +import pyray as rl +import requests +import shutil +import threading +import time + + +from iqpilot.cereal import custom +from dataclasses import dataclass +from iqpilot.selfdrive.car.vehicle_catalog import load_catalog +from iqpilot.selfdrive.iqmodeld.models.helpers import select_default_model, is_default_bundle +from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUSTOM_MODEL_PATH +from iqpilot.selfdrive.ui.layouts.settings import settings as OP +from iqpilot.selfdrive.ui.layouts.settings.toggles import TogglesLayout +from iqpilot.system.hardware import HARDWARE +from iqpilot.system.ui.iqwidgets.lib.styles import metrics +from iqpilot.system.ui.iqwidgets.widgets.list_view import ( + option_item as option_item, + multiple_button_item as multiple_button_item, + button_item as button_item, + dual_button_item as dual_button_item, + NavSectionButton, + Spacer, +) +from iqpilot.system.ui.iqwidgets.widgets.list_view import IQListItem +from iqpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, IQMultipleButtonAction, IQToggleAction, IQLineSeparator +from iqpilot.system.ui.iqwidgets.widgets.list_view import button_item, toggle_item +from iqpilot.system.ui.iqwidgets.widgets.list_view import NoticeModal +from iqpilot.system.ui.iqwidgets.widgets.list_view import PickerDialog, PickerItem, PickerGroup +from iqpilot.system.ui.lib.application import gui_app, MousePos +from iqpilot.system.ui.lib.multilang import tr_noop +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.wifi_manager import WifiManager +from iqpilot.system.ui.widgets import DialogResult +from iqpilot.system.ui.widgets.button import ButtonStyle +from iqpilot.system.ui.widgets.confirm_dialog import alert_dialog, ConfirmDialog +from iqpilot.system.ui.widgets.list_view import button_item +from iqpilot.system.ui.widgets.option_dialog import MultiOptionDialog +from iqpilot.system.ui.widgets.scroller_tici import LineSeparator +from iqpilot.system.ui.widgets.toggle import ON_COLOR +import re + +from iqpilot.selfdrive.ui.layouts.settings.developer import DeveloperLayout +from iqpilot.selfdrive.ui.layouts.settings.device import DeviceLayout +from iqpilot.selfdrive.ui.layouts.settings.software import SoftwareLayout, time_ago + +from functools import partial +from iqdbc.car.hyundai.values import CAR, CANFD_UNSUPPORTED_LONGITUDINAL_CAR, UNSUPPORTED_LONGITUDINAL_CAR +from iqdbc.car.subaru.values import CAR, SubaruFlags +from iqdbc.car.volkswagen.values import CAR, VolkswagenFlags +from iqpilot.common.basedir import BASEDIR +from iqpilot.system.ui.iqwidgets.lib.styles import ink +from iqpilot.system.ui.iqwidgets.widgets.list_view import multiple_button_item +from iqpilot.system.ui.iqwidgets.widgets.list_view import toggle_item +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.widgets.list_view import ButtonAction +import json + +ONROAD_BRIGHTNESS_TIMER_VALUES = {0: 15, 1: 30, **{i: (i - 1) * 60 for i in range(2, 12)}} + +def _fmt_seconds(value) -> str: + return f"{value} s" if value < 60 else f"{int(value / 60)} m" + +def onroad_brightness_label(val) -> str: + if val == OnroadBrightness.AUTO: + return tr("Auto") + if val == OnroadBrightness.AUTO_DARK: + return tr("Auto — Dim") + return f"{(val - 1) * 5} %" + +class DisplayLayout(Widget): + def __init__(self): + super().__init__() + self._params = Params() + self._scroller = Scroller(self._build_rows(), line_separator=True, spacing=0) + + def _build_rows(self): + self._force_mici_ui = toggle_item( + title=lambda: tr("Force Mici UI"), + description=lambda: tr("Run the compact comma 4 (mici) interface on this device") if self._params.get_bool("ForceSmallUI") else "", + param="ForceSmallUI", + ) + self._brightness_row = option_item( + param="Brightness", title=lambda: tr("Display Brightness"), description="", + min_value=0, max_value=100, value_change_step=5, + label_callback=lambda v: tr("Default") if v == 0 else f"{v} %", inline=True, + ) + self._onroad_brightness_row = option_item( + param="OnroadScreenOffBrightness", title=lambda: tr("Driving Brightness"), description="", + min_value=0, max_value=21, value_change_step=1, + label_callback=onroad_brightness_label, inline=True, + ) + self._dim_delay_row = option_item( + param="OnroadScreenOffTimer", title=lambda: tr("Dim Delay"), description="", + min_value=0, max_value=11, value_change_step=1, + value_map=ONROAD_BRIGHTNESS_TIMER_VALUES, label_callback=_fmt_seconds, inline=True, + ) + self._idle_close_row = option_item( + param="InteractivityTimeout", title=lambda: tr("Auto-Close Settings"), + description=lambda: tr("How long the settings screen may sit untouched before it closes itself."), + min_value=0, max_value=120, value_change_step=10, + label_callback=lambda v: tr("Default") if not v else _fmt_seconds(v), inline=True, + ) + return [ + self._force_mici_ui, + self._brightness_row, + self._onroad_brightness_row, + self._dim_delay_row, + self._idle_close_row, + ] + update_onroad_brightness = staticmethod(onroad_brightness_label) + + def _update_state(self): + super()._update_state() + for row in self._scroller._items: + action = row.action_item + if isinstance(action, ToggleAction) and action.toggle.param_key is not None: + action.set_state(self._params.get_bool(action.toggle.param_key)) + elif isinstance(action, OptionControl) and action.param_key is not None: + action.set_value(self._params.get(action.param_key, return_default=True)) + + mode = self._params.get("OnroadScreenOffBrightness", return_default=True) + self._dim_delay_row.action_item.set_enabled(mode not in (OnroadBrightness.AUTO, OnroadBrightness.AUTO_DARK)) + + def _render(self, rect): + self._scroller.render(rect) + + def show_event(self): + self._scroller.show_event() + +CHEVRON_INFO_DESCRIPTION = { + "enabled": tr_noop("Pins live readouts (gap, speed, time-to-lead) to the chevron marking the car ahead. " + "Needs IQ.Pilot to be the one controlling gas and brake."), + "disabled": tr_noop("Unavailable — IQ.Pilot longitudinal control is not active on this car."), +} + +_HUD_TOGGLES = { + "IQBlindSpotAlerts": ( + lambda: tr("Blind Spot Alerts"), + lambda: tr("Flashes a side warning whenever the car reports something sitting in your blind spot (BSM-equipped cars only)."), + ), + "IQExpandedStatus": ( + lambda: tr("Expanded Status Bar"), + lambda: tr("Bring back the classic UI's wide offroad status strip: temperature, vehicle, and Konn3kt state at a glance."), + ), + "IQSteerEffortArc": ( + lambda: tr("Steering Effort Arc"), + lambda: tr("Trace an arc over the road view showing how much steering IQ.Pilot is applying while lateral control runs."), + ), + "IQRoadNameOverlay": ( + lambda: tr("Road Name Overlay"), + lambda: tr("Show the current road's name over the driving view." + "
    Requires offline map data for your region to be installed."), + ), + "IQBlinkerIndicators": ( + lambda: tr("Blinker Indicators"), + lambda: tr("Mirror the car's blinkers as arrows on the driving screen."), + ), + "IQAccelMeter": ( + lambda: tr("Acceleration Meter"), + lambda: tr("Draw a bar along the left edge tracking measured acceleration and braking — what the car is actually " + "doing right now, not the planner's request."), + ), +} + +_SECTION_TITLE_COLOR = rl.Color(16, 185, 169, 255) + +class VisualsLayout(Widget): + def __init__(self): + super().__init__() + self._params = Params() + self._display_layout = DisplayLayout() + self._scroller = Scroller(self._build_rows(), line_separator=True, spacing=0) + + def _build_rows(self): + self._toggles = { + key: toggle_item(title=title, description=desc, param=key, + initial_state=ui_state.params.get_bool(key)) + for key, (title, desc) in _HUD_TOGGLES.items() + } + + self._chevron_info = multiple_button_item( + title=lambda: tr("Lead Vehicle Readouts"), + description="", + buttons=[lambda: tr("Off"), lambda: tr("Distance"), lambda: tr("Speed"), lambda: tr("Time"), lambda: tr("All")], + param="IQLeadReadouts", + inline=False, + ) + self._dev_ui_info = toggle_item( + title=lambda: tr("Onroad Developer UI"), + description=lambda: tr("Overlay a bar of live control metrics (steering, lateral accel, lead data) while driving."), + initial_state=bool(int(ui_state.params.get("IQDevUIInfo", return_default=True))), + callback=lambda on: ui_state.params.put("IQDevUIInfo", 3 if on else 0), + ) + + display_rows = self._display_layout._scroller._items[1:] + + return [ + IQListItem(title=lambda: tr("Display"), description="", action_item=None, inline=True, + title_color=_SECTION_TITLE_COLOR), + IQLineSeparator(20), + *display_rows, + IQLineSeparator(60), + *self._toggles.values(), + self._chevron_info, + self._dev_ui_info, + ] + + def _sync_chevron_row(self): + if ui_state.has_longitudinal_control: + self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["enabled"])) + self._chevron_info.action_item.set_selected_button(ui_state.params.get("IQLeadReadouts", return_default=True)) + self._chevron_info.action_item.set_enabled(True) + else: + self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["disabled"])) + self._chevron_info.action_item.set_enabled(False) + ui_state.params.put("IQLeadReadouts", 0) + + def _update_state(self): + super()._update_state() + for key, row in self._toggles.items(): + row.action_item.set_state(self._params.get_bool(key)) + self._dev_ui_info.action_item.set_state(bool(int(ui_state.params.get("IQDevUIInfo", return_default=True)))) + self._sync_chevron_row() + + def _render(self, rect): + self._scroller.render(rect) + + def show_event(self): + self._display_layout.show_event() + self._scroller.show_event() + if not ui_state.has_longitudinal_control: + self._chevron_info.set_description(tr(CHEVRON_INFO_DESCRIPTION["disabled"])) + self._chevron_info.show_description(True) + +_IDLE_BG = rl.Color(52, 55, 62, 255) + +class ScanPhase(Enum): + IDLE = 0 + RUNNING = 1 + FAILED = 2 + +class IQNetworkUI(NetworkUI): + def __init__(self, wifi_manager): + super().__init__(wifi_manager) + self._phase = ScanPhase.IDLE + self.scan_button = Button(lambda: tr("Searching...") if self._phase == ScanPhase.RUNNING else tr("Scan"), self._start_scan, + button_style=ButtonStyle.TRANSPARENT_WHITE_TEXT, + font_size=60, border_radius=30) + self.scan_button.set_rect(rl.Rectangle(0, 0, 400, 100)) + self._wifi_manager.add_callbacks(networks_updated=self._on_networks_updated) + + def _set_phase(self, phase: ScanPhase): + self._phase = phase + running = phase == ScanPhase.RUNNING + self.scan_button.set_enabled(not running) + self._wifi_manager._scanning = running + + def _start_scan(self): + self._set_phase(ScanPhase.RUNNING) + threading.Thread(target=self._scan_worker, daemon=True).start() + + def _scan_worker(self): + try: + self._wifi_manager._update_networks() + self._wifi_manager._request_scan() + self._wifi_manager._last_network_update = time.monotonic() + except Exception: + cloudlog.exception("IQNetworkUI scan failed") + self._phase = ScanPhase.FAILED + + def _on_networks_updated(self, networks): + if self._phase == ScanPhase.RUNNING: + self._set_phase(ScanPhase.IDLE) + + def _render(self, rect: rl.Rectangle): + super()._render(rect) + + if self._phase == ScanPhase.FAILED: + self._set_phase(ScanPhase.IDLE) + + if self._current_panel == NetworkPanelType.WIFI: + self.scan_button.set_position(self._rect.x, self._rect.y + 20) + r = self.scan_button.rect + bg = TEAL if self.scan_button.enabled else _IDLE_BG + rl.draw_rectangle_rounded(r, 30 / (min(r.width, r.height) / 2), 10, bg) + self.scan_button.render() + +MAP_PATH = Path(Paths.mapd_root()) / "offline" +OFFLINE_TILES_PATH = offline_map_root() / "regions" + +_BOUNDS_BASE_URL = "https://raw.githubusercontent.com/pfeiferj/openpilot-mapd/main/" +_REGION_PARAMS = ("OsmDownloadedDate", "OsmLocal", "OsmLocationName", "OsmLocationTitle", "OsmStateName", "OsmStateTitle") + + +def _fmt_bytes(n: int) -> str: + return f"{n / 1024 ** 2:.2f} MB" if n < 1024 ** 3 else f"{n / 1024 ** 3:.2f} GB" + +def _tree_size(*roots: Path) -> int: + total = 0 + pending = [p for p in roots if p.exists()] + while pending: + try: + for entry in os.scandir(pending.pop()): + if entry.is_file(): + total += entry.stat().st_size + elif entry.is_dir(): + pending.append(entry.path) + except OSError: + pass + return total + +class IQMapsLayout(Widget): + def __init__(self): + super().__init__() + self._current_percent = 0 + self._last_sync = 0 + self._mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else ui_state.params + self._build_rows() + self._refresh_disk_usage() + self._progress.set_visible(False) + self._tile_progress.set_visible(False) + self._state_btn.set_visible(False) + self._mapd_version.action_item.set_text(ui_state.params.get("MapdVersion") or "Loading...") + self._scroller = Scroller(self.items, line_separator=True, spacing=0) + + def _build_rows(self): + self._mapd_version = text_item(tr("Routing Engine Version"), lambda: ui_state.params.get("MapdVersion") or "Loading...") + self._online_maps_toggle = toggle_item( + tr("Online On-Screen Maps"), + tr("Pull live Mapbox tiles for the on-screen map whenever the device has internet."), + param="OnlineOSMaps", + ) + self._offline_maps_toggle = toggle_item( + tr("Offline On-Screen Maps"), + tr("Draw the on-screen map from tiles stored on the device. Combined with Online, stored tiles " + "take over the moment connectivity drops. Tiles come down with your selected region."), + param="OfflineOSMaps", + ) + self._delete_maps_btn = IQListItem(tr("Stored Maps"), action_item=WideButtonAction(tr("DELETE"), enabled=True), + callback=self._confirm_wipe) + self._progress = progress_item(tr("Fetching Map")) + self._tile_progress = progress_item(tr("Downloading Map Tiles")) + self._update_btn = IQListItem(tr("Map Database"), action_item=WideButtonAction(tr("CHECK"), enabled=True), + callback=self._confirm_db_refresh) + self._country_btn = IQListItem(tr("Country"), action_item=WideButtonAction(tr("SELECT"), enabled=True), + callback=lambda: self._open_region_picker("Country")) + self._state_btn = IQListItem(tr("State"), action_item=WideButtonAction(tr("SELECT"), enabled=True), + callback=lambda: self._open_region_picker("State")) + + self.items = [self._mapd_version, self._online_maps_toggle, self._offline_maps_toggle, self._delete_maps_btn, + self._progress, self._tile_progress, self._update_btn, self._country_btn, self._state_btn] + + def _refresh_disk_usage(self): + def worker(): + self._delete_maps_btn.action_item.set_value(_fmt_bytes(_tree_size(MAP_PATH, OFFLINE_TILES_PATH))) + threading.Thread(target=worker, daemon=True).start() + + def _confirm_wipe(self): + self._ask(tr("This will delete ALL downloaded maps\n\nAre you sure you want to delete all maps?"), + tr("Yes, delete all maps"), self._start_wipe) + + def _start_wipe(self): + self._delete_maps_btn.action_item.set_enabled(False) + self._delete_maps_btn.action_item.set_text(tr("REMOVING...")) + threading.Thread(target=self._wipe_worker, daemon=True).start() + + def _wipe_worker(self): + for root in (MAP_PATH, OFFLINE_TILES_PATH): + if root.exists(): + shutil.rmtree(root) + for param in _REGION_PARAMS: + ui_state.params.remove(param) + self._delete_maps_btn.action_item.set_enabled(True) + self._delete_maps_btn.action_item.set_text(tr("DELETE")) + self._refresh_disk_usage() + + @staticmethod + def _ask(msg, confirm_text, then): + gui_app.set_modal_overlay(ConfirmDialog(msg, confirm_text), + lambda res: then() if res == DialogResult.CONFIRM else None) + + def _confirm_db_refresh(self): + self._ask(tr("This will start the download process and it might take a while to complete."), + tr("Start Download"), self._request_db_download) + + def _request_db_download(self): + ui_state.params.put_bool("OsmDbUpdatesCheck", True) + nations = [c] if (c := ui_state.params.get("OsmLocationName") or "") else [] + states = [s] if (s := ui_state.params.get("OsmStateName") or "") else [] + if "US" in nations and states: + if any(x.lower() == "all" for x in states): + states = [x for x in states if x.lower() != "all"] + else: + nations.remove("US") + self._mem_params.put("OSMDownloadLocations", {"nations": nations, "states": states}) + + def _open_region_picker(self, region_type): + btn = self._country_btn if region_type == "Country" else self._state_btn + btn.action_item.set_enabled(False) + btn.action_item.set_text(tr("LOADING...")) + threading.Thread(target=self._region_picker_worker, args=(region_type, btn), daemon=True).start() + + @staticmethod + def _fetch_regions(region_type): + url = _BOUNDS_BASE_URL + ("nation_bounding_boxes.json" if region_type == "Country" else "us_states_bounding_boxes.json") + try: + data = requests.get(url, timeout=10).json() + return sorted((PickerItem(ref=k, data={'display_name': v['full_name']}) for k, v in data.items()), + key=lambda n: n.data['display_name']) + except Exception: + return [] + + def _region_picker_worker(self, region_type, btn): + locations = self._fetch_regions(region_type) + if region_type == "State": + locations.insert(0, PickerItem(ref="All", data={'display_name': tr("All states (~6.0 GB)")})) + + btn.action_item.set_enabled(True) + btn.action_item.set_text(tr("SELECT")) + + key = "OsmLocation" if region_type == "Country" else "OsmState" + current = ui_state.params.get(f"{key}Name") or "" + dialog = PickerDialog(tr(f"Select {region_type}"), [PickerGroup(folder="", nodes=locations)], + current_ref=current, search_prompt=tr("Perform a search")) + done = lambda res: self._on_region_picked(region_type, locations, key, res, dialog.selection_ref) # noqa: E731 + dialog.on_exit = done + gui_app.set_modal_overlay(dialog, callback=done) + + def _on_region_picked(self, region_type, locations, key, res, ref): + if res != DialogResult.CONFIRM or not ref: + if region_type == "State" and res == DialogResult.CANCEL: + if ui_state.params.get("OsmLocationName") == "US" and not ui_state.params.get("OsmStateName"): + for param in ("OsmLocationName", "OsmLocationTitle", "OsmLocal"): + ui_state.params.remove(param) + self._sync_rows() + return + + if region_type == "Country": + ui_state.params.put_bool("OsmLocal", True) + ui_state.params.remove("OsmStateName") + ui_state.params.remove("OsmStateTitle") + + ui_state.params.put(f"{key}Name", ref) + title = next((n.data['display_name'] for n in locations if n.ref == ref), ref) + ui_state.params.put(f"{key}Title", title) + + if ref == "US" and region_type == "Country": + self._open_region_picker("State") + else: + self._confirm_db_refresh() + + def _sync_tile_progress(self): + if not self._mem_params.get("OfflineTilesDownloadRequest"): + self._tile_progress.set_visible(False) + return + device._reset_interactive_timeout() + self._refresh_disk_usage() + self._tile_progress.set_visible(True) + progress = self._mem_params.get("OfflineTilesDownloadProgress") or {} + total = progress.get("total_bytes", 0) + done = progress.get("downloaded_bytes", 0) + if total > 0: + pct = max(0.0, min(100.0, done / total * 100.0)) + self._tile_progress.action_item.update(pct, f"{int(pct)}% - Downloading Map Tiles", show_progress=True) + else: + self._tile_progress.action_item.update(0.0, tr("Preparing Map Tiles..."), show_progress=False) + + def _sync_db_progress(self, downloading: bool): + self._progress.set_visible(True) + progress = ui_state.params.get("OSMDownloadProgress") or {} + total = progress.get('total_files', 0) + done = progress.get('downloaded_files', 0) + failed = total > 0 and not downloading and done < total + + if failed: + self._current_percent = 0.0 + bar_text, btn_text = "0% - Downloading Maps", tr("Download failed — try again.") + elif total > 0 and downloading: + self._current_percent = max(0.0, min(100.0, done / total * 100.0)) + pct = int(self._current_percent) + bar_text, btn_text = f"{pct}% - Downloading Maps", f"{done}/{total} ({pct}%)" + else: + self._current_percent = 0.0 + bar_text, btn_text = "0% - Downloading Maps", tr("Fetching Maps...") + + self._progress.action_item.update(self._current_percent, bar_text, + show_progress=total > 0 and downloading and not failed) + self._update_btn.action_item.set_value(btn_text) + + def _set_rows_busy(self, busy: bool): + for row in (self._update_btn, self._country_btn, self._state_btn, self._delete_maps_btn): + row.action_item.set_enabled(not busy) + + def _sync_rows(self): + downloading = bool(self._mem_params.get("OSMDownloadLocations")) + self._sync_tile_progress() + self._country_btn.set_enabled(not downloading) + self._state_btn.set_enabled(not downloading) + self._state_btn.set_visible(ui_state.params.get("OsmLocationName") == "US") + self._update_btn.set_visible(bool(ui_state.params.get("OsmLocationName"))) + self._country_btn.action_item.set_value(ui_state.params.get("OsmLocationTitle") or "") + self._state_btn.action_item.set_value(ui_state.params.get("OsmStateTitle") or "") + + if downloading or ui_state.params.get_bool("OsmDbUpdatesCheck"): + if downloading: + device._reset_interactive_timeout() + self._refresh_disk_usage() + self._sync_db_progress(downloading) + self._set_rows_busy(downloading) # TODO-IQ: introduce CANCEL database download with mapd + return + + self._progress.set_visible(False) + self._set_rows_busy(False) + + dt = None + if ts := ui_state.params.get("OsmDownloadedDate"): + try: + if float(ts) > 0: + dt = datetime.datetime.fromtimestamp(float(ts), tz=datetime.UTC) + except (ValueError, TypeError): + dt = None + self._update_btn.action_item.set_value(tr("Checked {}").format(time_ago(dt))) + + def _update_state(self): + now = monotonic() + if now - self._last_sync >= 1.0: + self._last_sync = now + self._sync_rows() + + def _render(self, rect): + self._scroller.render(rect) + + def show_event(self): + self._scroller.show_event() + +_TIMER_LABELS = { + -1: lambda: tr("Off"), + 0: lambda: tr("Nudge"), + 1: lambda: tr("No Nudge"), + 2: lambda: f"0.5 {tr('s')}", + 3: lambda: f"1 {tr('s')}", + 4: lambda: f"2 {tr('s')}", + 5: lambda: f"3 {tr('s')}", +} + +class LaneChangeSettingsLayout(Widget): + def __init__(self, back_btn_callback: Callable): + super().__init__() + self._back_button = NavButton(tr("Back")) + self._back_button.set_click_callback(back_btn_callback) + self._scroller = Scroller(self._build_rows(), line_separator=False, spacing=0) + + def _build_rows(self): + self._lane_change_timer = option_item( + title=lambda: tr("Blinker-Initiated Lane Change"), + param="IQLaneChangeTimer", + description=lambda: tr("Delay before a blinker-triggered lane change starts on its own — no wheel nudge " + "needed once a delay is set (default is Nudge).
    Use the blinker for this only " + "when traffic and the road actually allow the maneuver."), + min_value=-1, max_value=5, value_change_step=1, + label_callback=lambda x: _TIMER_LABELS[int(x)](), + ) + self._bsm_delay = toggle_item( + param="IQLaneChangeBsmDelay", + title=lambda: tr("Hold Lane Change for Blind Spot"), + description=lambda: tr("Hold the automatic lane change while blind spot monitoring reports a car in the " + "target lane, releasing it once the lane is clear."), + ) + self._edge_guard = toggle_item( + param="IQEdgeGuard", + title=lambda: tr("Lane Edge Guard"), + description=lambda: tr("Blocks lane changes when a road edge is detected on the target side."), + ) + self._continuous = toggle_item( + param="LaneChangeContinuous", + title=lambda: tr("Auto Lane Change: Continuous Changes"), + description=lambda: tr("Normally one maneuver ends the lane change even with the blinker held. Turn this on " + "to chain further changes while the blinker stays on — each follow-up still wants a " + "wheel nudge."), + ) + return [ + self._lane_change_timer, + IQLineSeparator(40), + self._bsm_delay, + IQLineSeparator(40), + self._edge_guard, + IQLineSeparator(40), + self._continuous, + ] + + def _update_state(self): + super()._update_state() + has_bsm = bool(ui_state.CP and ui_state.CP.enableBsm) + if not has_bsm and ui_state.params.get_bool("IQLaneChangeBsmDelay"): + ui_state.params.remove("IQLaneChangeBsmDelay") + timer_armed = ui_state.params.get("IQLaneChangeTimer", return_default=True) > AutoLaneChangeMode.NUDGE + self._bsm_delay.action_item.set_enabled(has_bsm and timer_armed) + + def _render(self, rect): + self._back_button.set_position(self._rect.x, self._rect.y + 20) + self._back_button.render() + below_button = self._back_button.rect.height + 40 + self._scroller.render(rl.Rectangle(rect.x, rect.y + below_button, rect.width, rect.height - below_button)) + + def show_event(self): + self._scroller.show_event() + +SAB_BRAKE_RESPONSE_OPTIONS = [ + (tr_noop("Stay Engaged"), tr_noop("Remain Active: braking never interrupts steering assistance.")), + (tr_noop("Standby"), tr_noop("Standby: braking parks steering assistance; it rejoins once you're off the pedal.")), + (tr_noop("Disengage"), tr_noop("Disengage: braking shuts steering assistance off entirely.")), +] + +_MODE_DISENGAGE = 2 +_MODE_STANDBY = 1 + +SAB_AVAILABILITY_DESC = tr("Note: on cars lacking an LFA/LKAS button, turning this off keeps steering assistance " + "from arming as cruise availability flips.") +SAB_DRIVER_INTERVENTION_DESC = tr("Pick what a brake-pedal press does to steering assistance.") +SAB_STEERING_OVERRIDE_DESC = tr( + "Steering assistance stands by while you steer yourself and rejoins the moment you let go. It stays armed the whole time; only the torque stops." +) +DEFAULT_TO_OFF = tr("Locked OFF on this platform; the vehicle can't support other choices.") +STATUS_DISENGAGE_ONLY = tr("This platform is limited to Disengage mode.") + +class SabSettingsLayout(Widget): + def __init__(self, back_btn_callback: Callable): + super().__init__() + self._back_button = NavButton(tr("Back")) + self._back_button.set_click_callback(back_btn_callback) + self._scroller = Scroller(self._build_rows(), line_separator=True, spacing=0) + + def _build_rows(self): + self._main_cruise_toggle = toggle_item( + title=lambda: tr("Availability While Cruise Changes"), + description=SAB_AVAILABILITY_DESC, + param="AolMainCruiseAllowed", + ) + self._disengage_on_brake_toggle = toggle_item( + title=lambda: tr("Driver Intervention Handling"), + description=SAB_DRIVER_INTERVENTION_DESC, + initial_state=False, + callback=self._on_brake_shortcut_toggled, + ) + self._steering_mode = multiple_button_item( + param="AolSteeringMode", + title=lambda: tr("Brake Response Mode"), + description="", + buttons=[lambda label=label: tr(label) for label, _ in SAB_BRAKE_RESPONSE_OPTIONS], + inline=False, + button_width=350, + callback=self._refresh_mode_description, + ) + self._pause_on_steering_override_toggle = toggle_item( + title=lambda: tr("Pause While You Steer"), + description=SAB_STEERING_OVERRIDE_DESC, + param="AolPauseOnSteeringOverride", + ) + return [self._main_cruise_toggle, self._disengage_on_brake_toggle, self._steering_mode, + self._pause_on_steering_override_toggle] + + @staticmethod + def _has_limited_sab_options() -> bool: + brand = "" + if ui_state.is_offroad(): + if bundle := ui_state.params.get("CarPlatformBundle"): + brand = bundle.get("brand", "") + if not brand and ui_state.CP: + brand = ui_state.CP.brand + return brand == "rivian" + + def _on_brake_shortcut_toggled(self, enabled: bool): + current = int(ui_state.params.get("AolSteeringMode", return_default=True)) + if enabled: + target = _MODE_DISENGAGE + elif current == _MODE_DISENGAGE: + target = _MODE_STANDBY + else: + return + ui_state.params.put("AolSteeringMode", target) + self._steering_mode.action_item.set_selected_button(target) + + def _refresh_mode_description(self, selected: int): + lines = [tr("Pick how steering assistance reacts once the driver brakes in IQ.Pilot."), ""] + for i, (_, blurb) in enumerate(SAB_BRAKE_RESPONSE_OPTIONS): + text = tr(blurb) + lines.append(f"{text}" if i == selected else text) + self._steering_mode.set_description("
    ".join(lines)) + self._steering_mode.show_description(True) + + def _apply_limited_platform(self): + ui_state.params.remove("AolMainCruiseAllowed") + ui_state.params.put_bool("AolUnifiedEngagementMode", True) + ui_state.params.put("AolSteeringMode", _MODE_DISENGAGE) + + self._main_cruise_toggle.action_item.set_enabled(False) + self._main_cruise_toggle.action_item.set_state(False) + self._main_cruise_toggle.set_description(f"{DEFAULT_TO_OFF}
    {SAB_AVAILABILITY_DESC}") + + self._disengage_on_brake_toggle.action_item.set_enabled(False) + self._disengage_on_brake_toggle.action_item.set_state(True) + self._disengage_on_brake_toggle.set_description(STATUS_DISENGAGE_ONLY) + + self._steering_mode.action_item.set_enabled(False) + self._steering_mode.set_description(STATUS_DISENGAGE_ONLY) + self._steering_mode.action_item.set_selected_button(_MODE_DISENGAGE) + + def _apply_full_platform(self): + self._main_cruise_toggle.action_item.set_enabled(True) + self._main_cruise_toggle.set_description(SAB_AVAILABILITY_DESC) + self._disengage_on_brake_toggle.action_item.set_enabled(True) + self._disengage_on_brake_toggle.set_description(SAB_DRIVER_INTERVENTION_DESC) + self._steering_mode.action_item.set_enabled(True) + + def _update_state(self): + super()._update_state() + if ui_state.params.get_bool("AolEnabled"): + ui_state.params.put_bool("AolUnifiedEngagementMode", True) + + current = int(ui_state.params.get("AolSteeringMode", return_default=True)) + self._disengage_on_brake_toggle.action_item.set_state(current == _MODE_DISENGAGE) + self._refresh_mode_description(self._steering_mode.action_item.get_selected_button()) + + if self._has_limited_sab_options(): + self._apply_limited_platform() + else: + self._apply_full_platform() + + def _render(self, rect): + self._back_button.set_position(self._rect.x, self._rect.y + 20) + self._back_button.render() + below_button = self._back_button.rect.height + 40 + self._scroller.render(rl.Rectangle(rect.x, rect.y + below_button, rect.width, rect.height - below_button)) + + def show_event(self): + self._scroller.show_event() + +class PanelType(IntEnum): + STEERING = 0 + SAB = 1 + LANE_CHANGE = 2 + +class SteeringLayout(Widget): + def __init__(self): + super().__init__() + + self._current_panel = PanelType.STEERING + self._lane_change_settings_layout = LaneChangeSettingsLayout(lambda: self._set_current_panel(PanelType.STEERING)) + self._sab_settings_layout = SabSettingsLayout(lambda: self._set_current_panel(PanelType.STEERING)) + + items = self._initialize_items() + self._scroller = Scroller(items, line_separator=False, spacing=0) + + for ctrl, key in [(self._lane_turn_value_control, "IQLaneTurnValue"), (self._delay_control, "IQSoftwareSteerDelay")]: + ctrl.action_item.set_value(int(float(ui_state.params.get(key, return_default=True)) * 100)) + + def _initialize_items(self): + self._aol_base_desc = tr("Enable Always on Lateral (AOL). Disable this toggle to return to stock IQ.Pilot steering engagement behavior.") + self._sab_limited_desc = tr("This platform supports a limited set of steering assistance behavior options.") + self._sab_full_desc = tr("This platform supports the full steering assistance behavior configuration.") + self._sab_check_compat_desc = tr("Start the vehicle to check steering assistance behavior compatibility.") + + self._aol_toggle = toggle_item( + param="AolEnabled", + title=lambda: tr("Always on Lateral (AOL)"), + description=self._aol_base_desc, + ) + self._aol_settings_button = simple_button_item( + button_text=lambda: tr("Steering Assistance Behavior"), + button_width=800, + callback=lambda: self._set_current_panel(PanelType.SAB) + ) + self._lane_change_settings_button = simple_button_item( + button_text=lambda: tr("Lane Change Options"), + button_width=800, + callback=lambda: self._set_current_panel(PanelType.LANE_CHANGE) + ) + self._nnff_toggle = toggle_item( + param="NeuralNetworkFeedForward", + title=lambda: tr("Neural Network Feed Forward (NNFF)"), + description="" + ) + self._lane_turn_desire_toggle = toggle_item( + lambda: tr("Low-Speed Turn Planning"), + lambda: tr("If you're driving at 20 mph (32 km/h) or below and have your blinker on," + " the car will plan a turn in that direction at the nearest drivable path." + " This prevents situations (like at red lights) where the car might plan the wrong turn direction."), + param="IQLaneTurnDesire" + ) + self._lane_turn_value_control = option_item( + tr("Adjust Lane Turn Desire Speed"), "IQLaneTurnValue", 500, 2000, + tr("Sets the speed threshold used by Lane Turn Desires. Below this value, turn desires can plan into the nearest drivable turn path. Default is 19 mph."), + int(round(100 / CV.MPH_TO_KPH)), None, True, "", style.BUTTON_ACTION_WIDTH, None, True, + lambda v: f"{int(round(v * (CV.MPH_TO_KPH if ui_state.is_metric else 1)))}" + f" {'km/h' if ui_state.is_metric else 'mph'}" + ) + self._steer_delay_toggle = toggle_item(lambda: tr("Self-Tuning Steer Delay"), "", param="IQLiveSteerDelay") + self._delay_control = option_item( + tr("Manual Delay Offset"), "IQSoftwareSteerDelay", 5, 50, + tr("How much lead time to add on top of the car's own steering rack delay while self-tuning is off. Default is 0.2 s."), + 1, None, True, "", style.BUTTON_ACTION_WIDTH, None, True, lambda v: f"{float(v):.2f}s" + ) + + items = [ + self._aol_toggle, + self._nnff_toggle, + IQLineSeparator(40), + self._aol_settings_button, + IQLineSeparator(40), + self._lane_change_settings_button, + IQLineSeparator(40), + self._lane_turn_desire_toggle, + self._lane_turn_value_control, + IQLineSeparator(40), + self._steer_delay_toggle, + self._delay_control, + ] + return items + + def _set_current_panel(self, panel: PanelType): + self._current_panel = panel + + def _update_state(self): + super()._update_state() + + steering_supported = True + if ui_state.CP is not None: + sab_desc = self._sab_limited_desc if self._sab_settings_layout._has_limited_sab_options() else self._sab_full_desc + self._aol_toggle.set_description(f"{sab_desc}

    {self._aol_base_desc}") + + if ui_state.CP.steerControlType == car.CarParams.SteerControlType.angle: + ui_state.params.remove("NeuralNetworkFeedForward") + steering_supported = False + else: + self._aol_toggle.set_description(f"{self._sab_check_compat_desc}

    {self._aol_base_desc}") + ui_state.params.remove("NeuralNetworkFeedForward") + steering_supported = False + + self._aol_toggle.action_item.set_enabled(ui_state.is_offroad()) + self._aol_settings_button.action_item.set_enabled(ui_state.is_offroad() and self._aol_toggle.action_item.get_state()) + self._nnff_toggle.action_item.set_enabled(ui_state.is_offroad() and steering_supported) + + turn_desire = ui_state.params.get_bool("IQLaneTurnDesire") + live_delay = ui_state.params.get_bool("IQLiveSteerDelay") + self._lane_turn_desire_toggle.action_item.set_state(turn_desire) + self._lane_turn_value_control.set_visible(turn_desire) + self._steer_delay_toggle.action_item.set_state(live_delay) + self._delay_control.set_visible(not live_delay) + new_step = int(round(100 / CV.MPH_TO_KPH)) if ui_state.is_metric else 100 + if self._lane_turn_value_control.action_item.value_change_step != new_step: + self._lane_turn_value_control.action_item.value_change_step = new_step + delay_desc = tr("Let IQ.Pilot measure how long your steering takes to respond and keep that figure up to date. " + "Switch it off to pin the timing yourself.") + if live_delay: + delay_desc += f"
    {tr('Measured:')} {ui_state.sm['lateralDelay'].lateralDelay:.3f} s" + elif ui_state.CP: + sw = float(ui_state.params.get("IQSoftwareSteerDelay", "0.2")) + cp = ui_state.CP.steerActuatorDelay + delay_desc += f"
    {tr('Rack:')} {cp:.2f} s + {tr('Offset:')} {sw:.2f} s = {tr('Total:')} {cp + sw:.2f} s" + self._steer_delay_toggle.set_description(delay_desc) + + def _render(self, rect): + if self._current_panel == PanelType.LANE_CHANGE: + self._lane_change_settings_layout.render(rect) + elif self._current_panel == PanelType.SAB: + self._sab_settings_layout.render(rect) + else: + self._scroller.render(rect) + + def show_event(self): + self._set_current_panel(PanelType.STEERING) + self._scroller.show_event() + + +class CruiseLayout(Widget): + def __init__(self): + super().__init__() + self._params = Params() + self._scroller = Scroller(self._initialize_items(), line_separator=True, spacing=0) + + @staticmethod + def _toggle_item(title: str, description: str, param: str): + return IQListItem( + title=lambda: tr(title), + description=lambda: tr(description), + action_item=IQToggleAction(initial_state=Params().get_bool(param), callback=lambda state: Params().put_bool(param, state), param=param), + ) + + @staticmethod + def _mode_item(title: str, description: str, param: str, labels: list[str], width: int, inline: bool = False): + return IQListItem( + title=lambda: tr(title), + description=lambda: tr(description), + action_item=IQMultipleButtonAction(buttons=[lambda s=s: tr(s) for s in labels], button_width=width, param=param), + inline=inline, + ) + + @staticmethod + def _option_item(title: str, description: str, param: str, minimum: int, maximum: int, step: int = 1, + label_callback=None, use_float_scaling: bool = False): + return IQListItem( + title=lambda: tr(title), + description=lambda: tr(description), + action_item=OptionControl( + param=param, + min_value=minimum, + max_value=maximum, + value_change_step=step, + use_float_scaling=use_float_scaling, + label_callback=label_callback, + ), + ) + + def _initialize_items(self): + ms_to_mph = 2.23694 + + def speed_label(value: float | int) -> str: + return f"{int(round(value * ms_to_mph))} mph" + + def seconds_label(value: float | int) -> str: + return f"{float(value):.1f}s" + + def distance_label(value: float | int) -> str: + value = int(value) + return "Stock" if value == 0 else f"{value:+d} m" + + items = [ + IQListItem(title=lambda: tr("Speed Limit Control"), description="", action_item=None, inline=True, + title_color=rl.Color(16, 185, 169, 255)), + IQLineSeparator(20), + self._mode_item( + "IQ Speed Limit Mode", + "Choose how IQ.Pilot handles speed limit data. Control adjusts cruise speed. Warning only highlights overspeed.", + "IQSpeedAssistMode", + ["Off", "Info", "Warn", "Control"], + 180, + ), + self._mode_item( + "IQ SLC Policy", + "Select how IQ.Pilot resolves conflicting speed limit sources.", + "SLCPolicy", + ["Map", "Priority", "Combined"], + 180, + ), + self._toggle_item( + "IQ SLC Confirm Higher", + "Require confirmation before IQ.Pilot accepts a higher detected speed limit.", + "SpeedLimitConfirmationHigher", + ), + self._toggle_item( + "IQ SLC Confirm Lower", + "Require confirmation before IQ.Pilot accepts a lower detected speed limit.", + "SpeedLimitConfirmationLower", + ), + self._toggle_item( + "IQ SLC Auto Confirm", + "Automatically accept speed limit changes after a 5-second timeout without requiring a cruise button press.", + "SLCAutoConfirm", + ), + self._toggle_item( + "IQ SLC Fallback Set Speed", + "If no speed limit is available, use the current set speed as the controller target.", + "SLCFallbackSetSpeed", + ), + self._toggle_item( + "IQ SLC Fallback Previous", + "If a new limit is denied, reuse the previous accepted speed limit when possible.", + "SLCFallbackPreviousSpeedLimit", + ), + self._toggle_item( + "IQ SLC Fallback Experimental", + "When no speed limit is available, let IQ.Dynamic request experimental longitudinal behavior.", + "SLCFallbackExperimentalMode", + ), + self._toggle_item( + "IQ SLC Online Filler", + "Use online sources (TomTom + Mapbox) to fill in missing speed limits when local map data is unavailable.", + "SLCOnlineFiller", + ), + self._option_item( + "IQ Map Lookahead Higher", + "How far ahead IQ.Pilot should apply an upcoming higher map speed limit before the limit changes.", + "MapSpeedLookaheadHigher", + 100, + 1000, + step=50, + use_float_scaling=True, + label_callback=seconds_label, + ), + self._option_item( + "IQ Map Lookahead Lower", + "How far ahead IQ.Pilot should apply an upcoming lower map speed limit before the limit changes.", + "MapSpeedLookaheadLower", + 100, + 1000, + step=50, + use_float_scaling=True, + label_callback=seconds_label, + ), + IQLineSeparator(60), + IQListItem(title=lambda: tr("IQ.Dynamic"), description="", action_item=None, inline=True, + title_color=rl.Color(16, 185, 169, 255)), + IQLineSeparator(20), + self._toggle_item( + "IQ.Dynamic Curves", + "Allow IQ.Dynamic to enter blended control for curves and strong vision slowdown cues.", + "IQDynamicConditionalCurves", + ), + self._toggle_item( + "IQ.Dynamic Slower Lead", + "Allow IQ.Dynamic to switch toward blended control when a slower lead vehicle is detected.", + "IQDynamicConditionalSlowerLead", + ), + self._toggle_item( + "IQ.Dynamic Stopped Lead", + "Allow IQ.Dynamic to react more aggressively when a lead vehicle is nearly stopped.", + "IQDynamicConditionalStoppedLead", + ), + self._toggle_item( + "IQ.Dynamic Model Stops", + "Allow IQ.Dynamic to switch toward blended control for stop-sign and stop-light style vision stops.", + "IQDynamicConditionalModelStops", + ), + self._toggle_item( + "IQ.Dynamic SLC Fallback", + "Allow IQ.Dynamic to request blended control when Speed Limit Controller has no usable target.", + "IQDynamicConditionalSLCFallback", + ), + self._option_item( + "IQ.Dynamic Low Speed", + "Below this speed, IQ.Dynamic prefers blended control when no lead is present.", + "IQDynamicConditionalSpeed", + 500, + 3500, + step=50, + use_float_scaling=True, + label_callback=speed_label, + ), + self._option_item( + "IQ.Dynamic Lead Speed", + "Below this speed, IQ.Dynamic prefers blended control even with a tracked lead.", + "IQDynamicConditionalLeadSpeed", + 500, + 4000, + step=50, + use_float_scaling=True, + label_callback=speed_label, + ), + self._option_item( + "IQ.Dynamic Model Stop Time", + "Sets the vision stop prediction time horizon used by IQ.Dynamic and IQ Force Stops. Shorter values react later. Longer values react earlier.", + "IQDynamicModelStopTime", + 100, + 600, + step=25, + use_float_scaling=True, + label_callback=seconds_label, + ), + self._toggle_item( + "IQ Force Stops", + "Bring the car to a complete stop for stop signs and stop lights, and feather the brake in the final meters of " + "every stop so it settles gently instead of rocking on its suspension. Yields full braking authority when a lead " + "is close. Override with the accelerator.", + "IQForceStops", + ), + self._option_item( + "IQ Custom Stop Distance", + "Nudge how far back IQ.Pilot stops behind a stopped lead vehicle or a model-held stop (red light). Positive " + "stops further back, negative settles in closer. Works whether IQ Force Stops is on or off.", + "IQCustomStopDistance", + -2, + 2, + step=1, + label_callback=distance_label, + ), + ] + return items + + def _render(self, rect): + self._scroller.render(rect) + + def show_event(self): + self._scroller.show_event() + +class IQDeveloperLayout(DeveloperLayout): + def __init__(self): + super().__init__() + self.error_log_path = os.path.join(Paths.crash_log_root(), "error.log") + self._is_release_branch: bool = self._is_release or ui_state.params.get_bool("IsReleaseIqBranch") + self._is_development_branch: bool = ui_state.params.get_bool("IsTestedBranch") or ui_state.params.get_bool("IsDevelopmentBranch") + self._initialize_items() + + for item in self.items: + self._scroller.add_widget(item) + + def _initialize_items(self): + self.error_log_btn = button_item(lambda: tr("Crash Log"), lambda: tr("VIEW"), + lambda: tr("View the error log for IQ.Pilot crashes."), callback=self._on_error_log_clicked) + + self.items: list = [self.error_log_btn] + + def _on_delete_confirm(self, result): + if result == DialogResult.CONFIRM: + if os.path.exists(self.error_log_path): + os.remove(self.error_log_path) + + def _on_error_log_closed(self, result, log_exists): + if result == DialogResult.CONFIRM and log_exists: + dialog2 = ConfirmDialog(tr("Delete this log?"), tr("Yes"), tr("No"), rich=False) + gui_app.set_modal_overlay(dialog2, callback=self._on_delete_confirm) + + def _on_error_log_clicked(self): + text = "" + if os.path.exists(self.error_log_path): + text = f"{datetime.datetime.fromtimestamp(os.path.getmtime(self.error_log_path)).strftime('%d-%b-%Y %H:%M:%S').upper()}

    " + try: + with open(self.error_log_path) as file: + text += file.read() + except Exception: + pass + dialog = NoticeModal(text=text, callback=lambda result: self._on_error_log_closed(result, os.path.exists(self.error_log_path))) + gui_app.set_modal_overlay(dialog) + + def _update_state(self): + self.error_log_btn.set_visible(not self._is_release_branch) + +UPDATES_DESCRIPTIONS = { + 'disable_updates_offroad': tr_noop( + "Turns off over-the-air update checks entirely.
    Reboot for this to take effect." + ), + 'disable_updates_onroad': tr_noop( + "Put the device in Always Offroad, or shut the car down, before touching these." + ), + 'install_mode_offroad': tr_noop( + "Pick whether a ready update just waits for your go-ahead, or downloads and installs on its own." + ), + 'install_mode_onroad': tr_noop( + "Put the device in Always Offroad, or shut the car down, before changing how updates install." + ) +} + +INSTALL_MODE_DOWNLOAD_ONLY = "download_only" +INSTALL_MODE_DOWNLOAD_AND_INSTALL = "download_and_install" +INSTALL_MODE_OPTIONS = [ + INSTALL_MODE_DOWNLOAD_ONLY, + INSTALL_MODE_DOWNLOAD_AND_INSTALL, +] +INSTALL_MODE_LABELS = { + INSTALL_MODE_DOWNLOAD_ONLY: tr_noop("Predownload Only"), + INSTALL_MODE_DOWNLOAD_AND_INSTALL: tr_noop("Predownload + Preinstall"), +} + +class IQSoftwareLayout(SoftwareLayout): + def __init__(self): + super().__init__() + self.disable_updates_toggle = toggle_item( + lambda: tr("Pause Updates"), + description="", + initial_state=ui_state.params.get_bool("DisableUpdates"), + callback=self._on_disable_updates_toggled, + ) + install_mode = ui_state.params.get("UpdaterInstallMode") or INSTALL_MODE_DOWNLOAD_AND_INSTALL + if install_mode not in INSTALL_MODE_OPTIONS: + install_mode = INSTALL_MODE_DOWNLOAD_AND_INSTALL + self._install_mode_dialog = None + self.install_mode_btn = button_item( + lambda: tr("Update Install Mode"), + lambda: tr("CHANGE"), + description="", + callback=self._on_change_install_mode, + ) + self.install_mode_btn.action_item.set_value(tr(INSTALL_MODE_LABELS[install_mode])) + try: + os_version = HARDWARE.get_os_version() or "unknown" + except Exception: + os_version = "unknown" + self.iqos_version_item = text_item(lambda: tr("IQ.OS Version"), os_version) + self._scroller.add_widget(self.iqos_version_item) + self._scroller.add_widget(self.disable_updates_toggle) + self._scroller.add_widget(self.install_mode_btn) + + def _handle_reboot(self, result): + if result == DialogResult.CONFIRM: + ui_state.params.put_bool("DisableUpdates", self.disable_updates_toggle.action_item.get_state()) + ui_state.params.put_bool("DoReboot", True) + else: + self.disable_updates_toggle.action_item.set_state(ui_state.params.get_bool("DisableUpdates")) + + def _on_disable_updates_toggled(self, enabled): + dialog = ConfirmDialog(tr("This needs a reboot to apply. Restart now?"), tr("Reboot")) + gui_app.set_modal_overlay(dialog, callback=self._handle_reboot) + + def _on_change_install_mode(self): + current_mode = ui_state.params.get("UpdaterInstallMode") or INSTALL_MODE_DOWNLOAD_AND_INSTALL + if current_mode not in INSTALL_MODE_OPTIONS: + current_mode = INSTALL_MODE_DOWNLOAD_AND_INSTALL + + labels = [tr(INSTALL_MODE_LABELS[mode]) for mode in INSTALL_MODE_OPTIONS] + current_label = tr(INSTALL_MODE_LABELS[current_mode]) + self._install_mode_dialog = MultiOptionDialog(tr("Update Install Mode"), labels, current_label) + + def handle_selection(result): + if result == DialogResult.CONFIRM and self._install_mode_dialog is not None and self._install_mode_dialog.selection: + selected_label = self._install_mode_dialog.selection + for mode in INSTALL_MODE_OPTIONS: + if selected_label == tr(INSTALL_MODE_LABELS[mode]): + ui_state.params.put("UpdaterInstallMode", mode) + self.install_mode_btn.action_item.set_value(selected_label) + break + self._install_mode_dialog = None + + gui_app.set_modal_overlay(self._install_mode_dialog, callback=handle_selection) + + def _on_uninstall(self): + def handle_uninstall_confirmation(result): + if result == DialogResult.CONFIRM: + ui_state.params.put_bool("DoUninstall", True) + gui_app.request_close() + + dialog = ConfirmDialog(tr("Are you sure you want to uninstall?"), tr("Uninstall")) + gui_app.set_modal_overlay(dialog, callback=handle_uninstall_confirmation) + + def _on_select_branch(self): + current_git_branch = ui_state.params.get("GitBranch") or "" + branches_str = ui_state.params.get("UpdaterAvailableBranches") or "" + branches = [b for b in branches_str.split(",") if b] + current_target = ui_state.params.get("UpdaterTargetBranch") or "" + top_level_branches = [current_git_branch, "release-mici", "release-tizi", "staging", "dev", "master"] + + if HARDWARE.get_device_type() == "tici": + top_level_branches = ["release-new", "release-tici", "staging-tici"] + branches = [b for b in branches if b in ("release-new", "beta") or b.endswith("-tici")] + pinned_nodes = [PickerItem(b, {'display_name': b}) for b in top_level_branches if b in branches] + other_nodes = [PickerItem(b, {'display_name': b}) for b in sorted(branches) + if b not in top_level_branches and not b.endswith("-prebuilt")] + + folders = [PickerGroup("", pinned_nodes + other_nodes)] + + def _on_branch_selected(result): + if result == DialogResult.CONFIRM and self._branch_dialog is not None: + selection = self._branch_dialog.selection_ref + if selection: + ui_state.params.put("UpdaterTargetBranch", selection) + self._branch_btn.action_item.set_value(selection) + os.system("pkill -SIGUSR1 -f system.updated.updated") + self._branch_dialog = None + + self._branch_dialog = PickerDialog(tr("Select a branch"), folders, current_target, "", + on_exit=_on_branch_selected) + + gui_app.set_modal_overlay(self._branch_dialog, callback=_on_branch_selected) + + def _update_state(self): + super()._update_state() + self.disable_updates_toggle.action_item.set_enabled(ui_state.is_offroad()) + self.disable_updates_toggle.set_visible(True) + self.install_mode_btn.action_item.set_enabled(ui_state.is_offroad()) + self.install_mode_btn.set_visible(True) + + disable_updates_desc = tr(UPDATES_DESCRIPTIONS["disable_updates_offroad"] if ui_state.is_offroad() else UPDATES_DESCRIPTIONS["disable_updates_onroad"]) + self.disable_updates_toggle.set_description(disable_updates_desc) + install_mode_desc = tr(UPDATES_DESCRIPTIONS["install_mode_offroad"] if ui_state.is_offroad() else UPDATES_DESCRIPTIONS["install_mode_onroad"]) + self.install_mode_btn.set_description(install_mode_desc) + + install_mode = ui_state.params.get("UpdaterInstallMode") or INSTALL_MODE_DOWNLOAD_AND_INSTALL + if install_mode not in INSTALL_MODE_OPTIONS: + install_mode = INSTALL_MODE_DOWNLOAD_AND_INSTALL + self.install_mode_btn.action_item.set_value(tr(INSTALL_MODE_LABELS[install_mode])) + waiting = getattr(self, "_waiting_for_updater", False) + self._download_btn.action_item.set_loading(waiting) + if waiting: + self._download_btn.action_item.set_enabled(False) + +_OFFROAD_SHUTDOWN_MINUTES = (0, 5, 10, 15, 30, 60, 120, 180, 300, 600, 1440, 1800) +offroad_time_options = dict(enumerate(_OFFROAD_SHUTDOWN_MINUTES)) + +FORCE_ONROAD_DURATION_SEC = 10 * 60 +FORCE_ONROAD_PARAM = "ForceOnroadUntil" + +class IQDeviceLayout(DeviceLayout): + MENU_ROOT = 0 + MENU_SYSTEM = 1 + MENU_MAINTENANCE = 2 + + def __init__(self): + DeviceLayout.__init__(self) + self._scroller._line_separator = None + self._submenu = self.MENU_ROOT + + def _initialize_items(self): + DeviceLayout._initialize_items(self) + self._always_offroad_btn = self._left_button(lambda: tr("Keep Device Offroad"), self._handle_always_offroad) + self._force_onroad_btn = self._left_button(lambda: tr("Force On-Road (10 min)"), self._handle_force_onroad) + + self._max_time_offroad = option_item( + title=lambda: tr("Offroad Shutdown Timer"), + description=lambda: tr("Powers the device down once it has sat this long with the engine off.\n(30h by default)"), + param="MaxTimeOffroad", + min_value=0, + max_value=11, + value_change_step=1, + on_value_changed=None, + enabled=True, + icon="", + value_map=offroad_time_options, + label_width=360, + use_float_scaling=False, + inline=True, + label_callback=self._update_max_time_offroad_label + ) + + self._device_wake_mode = multiple_button_item( + title=lambda: tr("Boot State"), + description=self.wake_mode_description, + param="DeviceBootMode", + buttons=[lambda: tr("Default"), lambda: tr("Offroad")], + button_width=364, + callback=None, + inline=True, + ) + self._change_language_btn = button_item(lambda: tr("Change Language"), lambda: tr("CHANGE"), callback=self._show_language_dialog) + self._driver_camera_btn = button_item(lambda: tr("Driver Camera Check"), lambda: tr("PREVIEW"), callback=self._show_driver_camera) + + self._reg_and_training = self._left_button(lambda: tr("Regulatory"), self._on_regulatory) + + self._onroad_uploads_and_reset_settings = dual_button_item( + left_text=lambda: tr("Upload While Driving"), + left_callback=lambda: ui_state.params.put_bool("OnroadUploads", not ui_state.params.get_bool("OnroadUploads")), + right_text=lambda: tr("Restore Defaults"), + right_callback=self._reset_settings + ) + + self._power_buttons = dual_button_item( + left_text=lambda: tr("Reboot"), + right_text=lambda: tr("Power Off"), + left_callback=self._reboot_prompt, + right_callback=self._power_off_prompt + ) + + self._submenu_system_btn = self._section_button(lambda: tr("System"), "icons/iq/sec_system.png", self.MENU_SYSTEM) + self._submenu_maintenance_btn = self._section_button(lambda: tr("Maintenance"), "icons/iq/sec_maintenance.png", self.MENU_MAINTENANCE) + self._submenu_back_btn = self._left_button(lambda: tr("Back"), self._go_back) + + self._submenu_top_separator = LineSeparator(height=10) + self._submenu_gap = Spacer(10) + self._submenu_bottom_separator = LineSeparator(height=10) + self._system_sep_a = LineSeparator() + self._system_sep_b = LineSeparator() + self._system_sep_c = LineSeparator() + self._system_sep_d = LineSeparator() + + items = [ + text_item(lambda: tr("Dongle ID"), self._params.get("DongleId") or (lambda: tr("N/A"))), + LineSeparator(), + text_item(lambda: tr("Serial"), self._params.get("HardwareSerial") or (lambda: tr("N/A"))), + self._system_sep_a, + self._reset_calib_btn, + self._system_sep_b, + self._change_language_btn, + self._system_sep_c, + self._device_wake_mode, + self._system_sep_d, + self._max_time_offroad, + self._submenu_top_separator, + self._submenu_system_btn, + self._submenu_maintenance_btn, + self._submenu_back_btn, + self._driver_camera_btn, + self._reg_and_training, + self._onroad_uploads_and_reset_settings, + self._submenu_gap, + self._submenu_bottom_separator, + self._power_buttons, + ] + + return items + + def _left_button(self, text, callback): + item = dual_button_item(left_text=text, left_callback=callback, right_text="", right_callback=None) + item.action_item.right_button.set_visible(False) + return item + + def _section_button(self, text, icon, submenu): + item = self._left_button(text, lambda: self._set_submenu(submenu)) + item.action_item.left_button = NavSectionButton(text, icon, lambda: self._set_submenu(submenu)) + return item + + def _set_submenu(self, submenu: int): + self._submenu = submenu + self._scroller.scroll_panel.set_offset(0) + + def _go_back(self): + self._set_submenu(self.MENU_ROOT) + + def _offroad_transition(self): + self._power_buttons.action_item.right_button.set_visible(ui_state.is_offroad()) + + @staticmethod + def wake_mode_description() -> str: + def_str = tr("Default: comes up ready to drive, engagement available straight away.") + offrd_str = tr("Offroad: lands in Always Offroad every time it boots or wakes.") + header = tr("Sets which state the device settles into after a boot or a wake from sleep.") + + return f"{header}\n\n{def_str}\n{offrd_str}" + + @staticmethod + def _reset_settings(): + def _do_reset(result: int): + if result == DialogResult.CONFIRM: + for _key in ui_state.params.all_keys(): + ui_state.params.remove(_key) + HARDWARE.reboot() + + def _second_confirm(result: int): + if result == DialogResult.CONFIRM: + gui_app.set_modal_overlay(ConfirmDialog( + text=tr("There's no undo once this runs — last chance to back out."), + confirm_text=tr("Confirm") + ), callback=_do_reset) + + gui_app.set_modal_overlay(ConfirmDialog( + text=tr("Are you sure you want to reset all IQ.Pilot settings to default? Once the settings are reset, there is no going back."), + confirm_text=tr("Reset") + ), callback=_second_confirm) + + @staticmethod + def _handle_always_offroad(): + if ui_state.engaged: + gui_app.set_modal_overlay(alert_dialog(tr("Disengage before forcing offroad"))) + return + + _offroad_mode_state = ui_state.params.get_bool("IQAlwaysOffroad") + _offroad_mode_str = tr("Leave Always Offroad mode now?") if _offroad_mode_state else \ + tr("Switch the device into Always Offroad mode?") + + def _set_always_offroad(result: int): + if result == DialogResult.CONFIRM and not ui_state.engaged: + if _offroad_mode_state: + ui_state.params.put(FORCE_ONROAD_PARAM, 0) + ui_state.params.put_bool("IQAlwaysOffroad", not _offroad_mode_state) + + gui_app.set_modal_overlay(ConfirmDialog(_offroad_mode_str, tr("Confirm")), callback=lambda result: _set_always_offroad(result)) + + @staticmethod + def _handle_force_onroad(): + if ui_state.engaged: + gui_app.set_modal_overlay(alert_dialog(tr("Disengage before forcing on-road"))) + return + + if not ui_state.is_offroad(): + gui_app.set_modal_overlay(alert_dialog(tr("Force On-Road can only be started while offroad"))) + return + + now = int(time.time()) + force_onroad_until = ui_state.params.get(FORCE_ONROAD_PARAM, return_default=True) + is_active = force_onroad_until > now + if is_active: + prompt = tr("Force On-Road is already active. Reset the timer to 10 minutes?") + else: + prompt = tr("Force IQ.Pilot on-road for 10 minutes? Always Offroad will be enabled automatically and it will return to offroad after the timer.") + + def _set_force_onroad(result: int): + if result == DialogResult.CONFIRM and not ui_state.engaged: + ui_state.params.put_bool("IQAlwaysOffroad", True) + ui_state.params.put(FORCE_ONROAD_PARAM, int(time.time()) + FORCE_ONROAD_DURATION_SEC) + + gui_app.set_modal_overlay(ConfirmDialog(prompt, tr("Confirm")), callback=_set_force_onroad) + + @staticmethod + def _update_max_time_offroad_label(value: int) -> str: + label = tr("Never Sleep") if value == 0 else f"{value}" + tr("m") if value < 60 else f"{value // 60}" + tr("h") + label += tr(" (Default)") if value == 1800 else "" + return label + + def _update_state(self): + super()._update_state() + always_offroad = ui_state.params.get_bool("IQAlwaysOffroad") + now = int(time.time()) + force_onroad_until = ui_state.params.get(FORCE_ONROAD_PARAM, return_default=True) + force_onroad_active = force_onroad_until > now + offroad_mode_btn_text = tr("Exit Offroad Mode") if always_offroad else tr("Keep Device Offroad") + offroad_mode_btn_style = ButtonStyle.PRIMARY if always_offroad else ButtonStyle.DANGER + self._always_offroad_btn.action_item.left_button.set_text(offroad_mode_btn_text) + self._always_offroad_btn.action_item.left_button.set_button_style(offroad_mode_btn_style) + if self._scroller._items.__contains__(self._always_offroad_btn): + self._scroller._items.remove(self._always_offroad_btn) + if ui_state.is_offroad() and not always_offroad: + self._scroller._items.insert(len(self._scroller._items) - 1, self._always_offroad_btn) + else: + self._scroller._items.insert(0, self._always_offroad_btn) + if self._scroller._items.__contains__(self._force_onroad_btn): + self._scroller._items.remove(self._force_onroad_btn) + self._scroller._items.insert(self._scroller._items.index(self._always_offroad_btn) + 1, self._force_onroad_btn) + + if force_onroad_active: + remaining = force_onroad_until - now + minutes = remaining // 60 + seconds = remaining % 60 + force_onroad_text = f"{tr('Forced On-Road Active')} ({minutes}:{seconds:02d})" + force_onroad_style = ButtonStyle.PRIMARY + else: + force_onroad_text = tr("Force On-Road (10 min)") + force_onroad_style = ButtonStyle.NORMAL + self._force_onroad_btn.action_item.left_button.set_text(force_onroad_text) + self._force_onroad_btn.action_item.left_button.set_button_style(force_onroad_style) + self._force_onroad_btn.action_item.left_button.set_enabled(ui_state.is_offroad()) + + self._onroad_uploads_and_reset_settings.action_item.left_button.set_button_style( + ButtonStyle.PRIMARY if ui_state.params.get_bool("OnroadUploads") else ButtonStyle.NORMAL + ) + + self._driver_camera_btn.set_enabled(ui_state.is_offroad()) + self._reg_and_training.action_item.left_button.set_enabled(ui_state.is_offroad()) + self._onroad_uploads_and_reset_settings.action_item.right_button.set_enabled(ui_state.is_offroad()) + + root_menu = self._submenu == self.MENU_ROOT + system_menu = self._submenu == self.MENU_SYSTEM + maintenance_menu = self._submenu == self.MENU_MAINTENANCE + + self._submenu_system_btn.set_visible(root_menu) + self._submenu_maintenance_btn.set_visible(root_menu) + self._submenu_back_btn.set_visible(not root_menu) + + self._always_offroad_btn.set_visible(system_menu) + self._force_onroad_btn.set_visible(system_menu) + self._reset_calib_btn.set_visible(system_menu) + self._change_language_btn.set_visible(system_menu) + self._system_sep_a.set_visible(system_menu) + self._system_sep_b.set_visible(system_menu) + self._system_sep_c.set_visible(system_menu) + self._system_sep_d.set_visible(system_menu) + self._device_wake_mode.set_visible(system_menu) + self._max_time_offroad.set_visible(system_menu) + self._driver_camera_btn.set_visible(system_menu) + self._reg_and_training.set_visible(system_menu) + + self._onroad_uploads_and_reset_settings.set_visible(maintenance_menu) + self._submenu_gap.set_visible(maintenance_menu) + self._submenu_bottom_separator.set_visible(maintenance_menu) + self._power_buttons.set_visible(maintenance_menu) + + self._submenu_top_separator.set_visible(root_menu or system_menu or maintenance_menu) + + +if gui_app.iqpilot_ui(): + from iqpilot.system.ui.iqwidgets.widgets.list_view import button_item as button_item + +_ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle" +_DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex" +_RUNNER_CACHE_KEY = "ModelRunnerTypeCache" + +def _big_model_options() -> list[tuple[str, str]]: + try: + from iqpilot.selfdrive.iqmodeld.emac_model_meta import big_models + return big_models(ui_state.params) + except Exception: + return [] + + +def _big_model_label(key: str) -> str: + for name, display in _big_model_options(): + if name == key: + return display + return key + + +def _refresh_big_catalog() -> None: + def worker(): + try: + from iqpilot.selfdrive.iqmodeld.emac_model_meta import refresh_catalog + refresh_catalog(ui_state.params) + except Exception: + pass + threading.Thread(target=worker, daemon=True).start() + + +class ModelsLayout(Widget): + def __init__(self): + super().__init__() + self.model_manager = None + self._refreshing = False + self._refresh_start = 0.0 + self.download_status = None + self.prev_download_status = None + self.model_dialog = None + self._big_model_dialog = None + self.last_cache_calc_time = 0 + + self._initialize_items() + + self.clear_cache_item.action_item.set_value(f"{self._calculate_cache_size():.2f} MB") + self._scroller = Scroller(self.items, line_separator=True, spacing=0) + + def _initialize_items(self): + self.current_model_item = IQListItem( + title=lambda: tr("Active Model"), + description="", + action_item=WideButtonAction(lambda: tr("SELECT")), + callback=self._handle_current_model_clicked + ) + + self.big_model_item = button_item( + lambda: tr("Big Model"), + lambda: tr("CHANGE"), + tr("Only works with external compute connected over USB."), + self._handle_big_model_clicked, + ) + self.big_model_item.action_item.set_value(self._big_model_value()) + + self.supercombo_label = progress_item(tr("Combined Model")) + self.vision_label = progress_item(tr("Vision Weights")) + self.policy_label = progress_item(tr("Policy Weights")) + + self.refresh_item = button_item(lambda: tr("Reload Model List"), lambda: tr("REFRESH"), "", self._on_refresh_models) + + self.clear_cache_item = IQListItem( + title=lambda: tr("Purge Model Cache"), + description="", + action_item=WideButtonAction(lambda: tr("CLEAR")), + callback=self._clear_cache + ) + + self.redownload_item = button_item(lambda: tr("Redownload Current Model"), lambda: tr("REDOWNLOAD"), "", self._redownload_model) + self.cancel_download_item = button_item(tr("Stop Download"), tr("Cancel"), "", self._cancel_model_request) + + self.items = [self.current_model_item, self.big_model_item, self.cancel_download_item, self.supercombo_label, self.vision_label, + self.policy_label, self.redownload_item, self.refresh_item, self.clear_cache_item] + + def _is_downloading(self): + return (self.model_manager and self.model_manager.selectedBundle and + self.model_manager.selectedBundle.status == custom.IQModelManager.DownloadStatus.downloading) + + @staticmethod + def _has_download_request() -> bool: + try: + return int(ui_state.params.get(_DOWNLOAD_INDEX_KEY)) >= 0 + except (TypeError, ValueError): + return False + + @staticmethod + def _has_active_bundle_param() -> bool: + return bool(ui_state.params.get(_ACTIVE_BUNDLE_KEY)) + + def _has_model_request(self) -> bool: + return self._has_download_request() + + @staticmethod + def _calculate_cache_size(): + cache_size = 0.0 + if os.path.exists(CUSTOM_MODEL_PATH): + cache_size = sum(os.path.getsize(os.path.join(CUSTOM_MODEL_PATH, file)) for file in os.listdir(CUSTOM_MODEL_PATH)) / (1024**2) + return cache_size + + @staticmethod + def _bundle_index(bundle) -> int | None: + try: + return int(getattr(bundle, "index", -1)) + except (TypeError, ValueError): + return None + + @classmethod + def _bundle_matches(cls, left, right) -> bool: + if left is None or right is None: + return False + + left_index = cls._bundle_index(left) + right_index = cls._bundle_index(right) + if left_index is not None and right_index is not None and left_index == right_index: + return True + + for attr in ("ref", "internalName", "displayName"): + left_value = getattr(left, attr, None) + if left_value and left_value == getattr(right, attr, None): + return True + return False + + @staticmethod + def _safe_model_path(filename: str) -> str | None: + if not filename or os.path.basename(filename) != filename: + return None + + root = os.path.realpath(CUSTOM_MODEL_PATH) + path = os.path.realpath(os.path.join(root, filename)) + try: + if os.path.commonpath([root, path]) != root: + return None + except ValueError: + return None + return path + + def _remove_bundle_files(self, bundle) -> None: + for model in getattr(bundle, "models", []) or []: + for artifact in (getattr(model, "metadata", None), getattr(model, "artifact", None)): + filename = getattr(artifact, "fileName", "") if artifact is not None else "" + path = self._safe_model_path(filename) + if path is None: + continue + for candidate in (path, f"{path}.download"): + try: + if os.path.isfile(candidate): + os.remove(candidate) + except OSError: + pass + + def _clear_cache(self): + def _callback(response): + if response == DialogResult.CONFIRM: + ui_state.params.put_bool("ModelManager_ClearCache", True) + self.clear_cache_item.action_item.set_value(f"{self._calculate_cache_size():.2f} MB") + + gui_app.set_modal_overlay(ConfirmDialog(tr("This will delete ALL downloaded models from the cache except the currently active model. Are you sure?"), + tr("Clear Cache")), callback=_callback) + + def _redownload_target_bundle(self): + if not self.model_manager: + return None + selected = self.model_manager.selectedBundle + if selected and selected.status == custom.IQModelManager.DownloadStatus.failed: + return selected + active = self.model_manager.activeBundle + if self._has_active_bundle_param() and active and active.ref: + return active + return None + + def _redownload_target_index(self) -> int | None: + target = self._redownload_target_bundle() + if not target: + return None + try: + return int(target.index) + except (TypeError, ValueError): + pass + + for bundle in self.model_manager.availableBundles: + if bundle.ref and bundle.ref == target.ref: + return int(bundle.index) + if bundle.internalName and bundle.internalName == target.internalName: + return int(bundle.index) + return None + + def _can_redownload(self) -> bool: + return bool(ui_state.is_offroad() and not self._is_downloading() and not self._has_model_request() and self._redownload_target_index() is not None) + + def _cancel_model_request(self): + ui_state.params.remove(_DOWNLOAD_INDEX_KEY) + + def _redownload_model(self): + index = self._redownload_target_index() + if index is None: + return + + def _callback(response): + if response == DialogResult.CONFIRM: + target = self._redownload_target_bundle() + if target is not None: + self._remove_bundle_files(target) + if self._bundle_matches(getattr(self.model_manager, "activeBundle", None), target): + ui_state.params.remove(_ACTIVE_BUNDLE_KEY) + ui_state.params.remove(_RUNNER_CACHE_KEY) + ui_state.params.put(_DOWNLOAD_INDEX_KEY, index) + + gui_app.set_modal_overlay(ConfirmDialog(tr("Clear the selected model cache and download it again?"), + tr("Redownload")), callback=_callback) + + def _handle_bundle_download_progress(self): + labels = {custom.IQModelManager.Model.Type.supercombo: self.supercombo_label, + custom.IQModelManager.Model.Type.vision: self.vision_label, + custom.IQModelManager.Model.Type.policy: self.policy_label} + for label in labels.values(): + label.set_visible(False) + self.cancel_download_item.set_visible(False) + + if not self.model_manager or (not self.model_manager.selectedBundle and (not self._has_active_bundle_param() or not self.model_manager.activeBundle)): + return + + bundle = self.model_manager.selectedBundle if self._is_downloading() or ( + self.model_manager.selectedBundle and self.model_manager.selectedBundle.status == custom.IQModelManager.DownloadStatus.failed + ) else (self.model_manager.activeBundle if self._has_active_bundle_param() else None) + if not bundle: + return + + self.download_status = bundle.status + status_changed = self.prev_download_status != self.download_status + self.prev_download_status = self.download_status + + self.cancel_download_item.set_visible(bool(self.model_manager.selectedBundle) and self._has_download_request()) + + if (current_time := time.monotonic()) - self.last_cache_calc_time > 0.5: + self.last_cache_calc_time = current_time + self.clear_cache_item.action_item.set_value(f"{self._calculate_cache_size():.2f} MB") + + if self.download_status == custom.IQModelManager.DownloadStatus.downloading: + device._reset_interactive_timeout() + + DS = custom.IQModelManager.DownloadStatus + bundle_downloading = bundle.status == DS.downloading + for model in bundle.models: + label = labels.get(getattr(model.type, 'raw', model.type)) + if label is None: + continue + label.set_visible(True) + p = model.artifact.downloadProgress + text, show, color, indeterminate = self._model_label_state(p, bundle, bundle_downloading, status_changed) + label.action_item.update(p.progress, text, show, color, indeterminate=indeterminate) + + def _model_label_state(self, p, bundle, bundle_downloading, status_changed): + DS = custom.IQModelManager.DownloadStatus + name = bundle.displayName + live = p.status == DS.downloading or (bundle_downloading and p.status not in (DS.downloaded, DS.cached, DS.failed)) + if live: + if p.progress > 0: + return f"{int(p.progress)}% - {name}", True, rl.GRAY, False + return f"{tr('downloading')} - {name}", True, rl.GRAY, True + if p.status in (DS.downloaded, DS.cached): + status_text = tr("from cache" if p.status == DS.cached else "downloaded") + return f"{name} - {status_text if status_changed else tr('ready')}", False, ON_COLOR, False + if p.status == DS.failed: + return f"download failed - {name}", False, rl.RED, False + return f"pending - {name}", False, rl.GRAY, False + + @staticmethod + def _show_reset_params_dialog(): + def _callback(response): + if response == DialogResult.CONFIRM: + ui_state.params.remove("CalibrationParams") + ui_state.params.remove("LiveTorqueParameters") + msg = tr("The selected model changed. We suggest resetting calibration. Would you like to do that now?") + gui_app.set_modal_overlay(ConfirmDialog(msg, tr("Reset Calibration")), callback=_callback) + + def _on_model_selected(self, result): + if result != DialogResult.CONFIRM: + return + selected_ref = self.model_dialog.selection_ref + if selected_ref == "Default": + active = self.model_manager.activeBundle if self.model_manager else None + had_custom_model = bool(active and active.ref and not is_default_bundle(active)) + select_default_model(ui_state.params) + if had_custom_model: + self._show_reset_params_dialog() + elif selected_bundle := next((bundle for bundle in self.model_manager.availableBundles if bundle.ref == selected_ref), None): + ui_state.params.put(_DOWNLOAD_INDEX_KEY, selected_bundle.index) + if self.model_manager.activeBundle and selected_bundle.generation != self.model_manager.activeBundle.generation: + self._show_reset_params_dialog() + self.model_dialog = None + + @staticmethod + def _bundle_to_node(bundle): + return PickerItem(bundle.ref, {'display_name': bundle.displayName, 'short_name': bundle.internalName}) + + def _get_folders(self, favorites): + bundles = self.model_manager.availableBundles + folders = {} + for bundle in bundles: + folders.setdefault(next((ov_ride.value for ov_ride in bundle.overrides if ov_ride.key == "folder"), ""), []).append(bundle) + + folders_list = [PickerGroup("", [PickerItem("Default", {'display_name': tr("Default (CD210)"), 'short_name': "Default"})])] + for folder, folder_bundles in sorted(folders.items(), key=lambda x: max((bundle.index for bundle in x[1]), default=-1), reverse=True): + folder_bundles.sort(key=lambda bundle: bundle.index, reverse=True) + name = folder + (f" - (Updated: {m.group(1)})" if folder_bundles and (m := re.search(r'\(([^)]*)\)[^(]*$', folder_bundles[0].displayName)) else "") + folders_list.append(PickerGroup(name, [self._bundle_to_node(bundle) for bundle in folder_bundles])) + + if favorites and (fav_bundles := [bundle for bundle in bundles if bundle.ref in favorites]): + folders_list.insert(1, PickerGroup("Favorites", [self._bundle_to_node(bundle) for bundle in fav_bundles])) + return folders_list + + def _handle_current_model_clicked(self): + favs = ui_state.params.get("IQModelFavorites") + favorites = set(favs.split(';')) if favs else set() + folders_list = self._get_folders(favorites) + + active_ref = self.model_manager.activeBundle.ref if self._has_active_bundle_param() and self.model_manager.activeBundle else "Default" + self.model_dialog = PickerDialog(tr("Choose a Model"), folders_list, active_ref, "IQModelFavorites", + get_folders_fn=self._get_folders, on_exit=self._on_model_selected) + gui_app.set_modal_overlay(self.model_dialog, callback=self._on_model_selected) + + @staticmethod + def _big_model_value() -> str: + if not ui_state.params.get_bool("IQEmacEnabled"): + return tr("Off") + key = ui_state.params.get("IQEmacModel") + key = key.decode() if isinstance(key, bytes) else (key or "") + return _big_model_label(key) if key in [n for n, _ in _big_model_options()] else tr("Off") + + def _handle_big_model_clicked(self): + options = _big_model_options() + if len(options) <= 1: + _refresh_big_catalog() + keys = [n for n, _ in options] + labels = [tr("Off")] + [d for _, d in options] + self._big_model_dialog = MultiOptionDialog(tr("Big Model"), labels, self._big_model_value()) + + def handle_selection(result): + if result == DialogResult.CONFIRM and self._big_model_dialog is not None and self._big_model_dialog.selection: + selected = self._big_model_dialog.selection + if selected == tr("Off"): + ui_state.params.put_bool("IQEmacEnabled", False) + else: + for key in keys: + if _big_model_label(key) == selected: + ui_state.params.put("IQEmacModel", key) + ui_state.params.put_bool("IQEmacEnabled", True) + break + self.big_model_item.action_item.set_value(self._big_model_value()) + self._big_model_dialog = None + + gui_app.set_modal_overlay(self._big_model_dialog, callback=handle_selection) + + def _on_refresh_models(self): + _refresh_big_catalog() + ui_state.params.put("ModelManager_LastSyncTime", 0) + self._refreshing = True + self._refresh_start = time.monotonic() + self.refresh_item.action_item.set_enabled(False) + + def _update_refresh_state(self): + if not self._refreshing: + return + try: + last_sync = int(ui_state.params.get("ModelManager_LastSyncTime", return_default=True) or 0) + except (TypeError, ValueError): + last_sync = 0 + elapsed = time.monotonic() - self._refresh_start + if (last_sync > 0 and elapsed > 1.0) or elapsed > 20.0: + self._refreshing = False + self.refresh_item.action_item.set_loading(False) + self.refresh_item.action_item.set_enabled(True) + else: + self.refresh_item.action_item.set_loading(True) + self.refresh_item.action_item.set_enabled(False) + + def _update_state(self): + self._update_refresh_state() + self.model_manager = ui_state.sm["iqModelManager"] + self._handle_bundle_download_progress() + active = self.model_manager.activeBundle if self.model_manager else None + if is_default_bundle(active): + active_name = active.displayName or tr("Default (CD210)") + elif self._has_active_bundle_param() and active and active.ref: + active_name = active.internalName + else: + active_name = tr("Default (CD210)") + self.current_model_item.action_item.set_value(active_name) + self.redownload_item.action_item.set_enabled(self._can_redownload()) + target = self._redownload_target_bundle() + self.redownload_item.action_item.set_value(target.internalName if target else "") + + if not ui_state.is_offroad(): + self.current_model_item.action_item.set_enabled(False) + self.current_model_item.set_description(tr("Reachable only with the car switched off or Always Offroad turned on.")) + else: + self.current_model_item.action_item.set_enabled(True) + self.current_model_item.set_description("") + + def _render(self, rect): + self._scroller.render(rect) + + def show_event(self): + self._scroller.show_event() + +OP.PANEL_COLOR = rl.Color(10, 10, 10, 255) +ICON_SIZE = 70 + +OP.PanelType = IntEnum( + "PanelType", + [es.name for es in OP.PanelType] + [ + "MODELS", + "CRUISE", + "STEERING", + "VISUALS", + "NAVIGATION", + "VEHICLE", + ], + start=0, +) + +@dataclass +class PanelInfo(OP.PanelInfo): + icon: str = "" + +class SidebarEntry(Widget): + def __init__(self, hub, panel_type, panel_info): + super().__init__() + self._hub = hub + self.panel_type = panel_type + self.panel_info = panel_info + + @staticmethod + def _draw_active_pill(rect: rl.Rectangle, left_x: float): + pill = rl.Rectangle(left_x - 50, rect.y, OP.SIDEBAR_WIDTH - 50, OP.NAV_BTN_HEIGHT) + rl.draw_rectangle_rounded(pill, 0.2, 5, OP.CLOSE_BTN_COLOR) + + def _render(self, rect): + active = self.panel_type == self._hub._current_panel + x = rect.x + 90 + if active: + self._draw_active_pill(rect, x) + + if self.panel_info.icon: + icon = gui_app.texture(self.panel_info.icon, ICON_SIZE, ICON_SIZE, keep_aspect_ratio=True) + rl.draw_texture(icon, int(x), int(rect.y + (OP.NAV_BTN_HEIGHT - icon.height) / 2), rl.WHITE) + x += ICON_SIZE + 20 + + label_h = measure_text_cached(self._hub._font_medium, self.panel_info.name, 65).y + rl.draw_text_ex(self._hub._font_medium, self.panel_info.name, + rl.Vector2(x, rect.y + (OP.NAV_BTN_HEIGHT - label_h) / 2), 55, 0, + OP.TEXT_SELECTED if active else OP.TEXT_NORMAL) + + self.panel_info.button_rect = rect + +class IQSettingsLayout(OP.SettingsLayout): + def __init__(self): + OP.SettingsLayout.__init__(self) + self._nav_items: list[Widget] = [] + self._sidebar_scroller = Scroller([], spacing=0, line_separator=False, pad_end=False) + + wifi_manager = WifiManager() + wifi_manager.set_active(False) + + iq_asset = "offroad" + self._panels = { + OP.PanelType.DEVICE: PanelInfo(tr_noop("Device"), IQDeviceLayout(), icon=f"{iq_asset}/icon_home.png"), + OP.PanelType.NETWORK: PanelInfo(tr_noop("Network"), IQNetworkUI(wifi_manager), icon="icons/network.png"), + OP.PanelType.TOGGLES: PanelInfo(tr_noop("Toggles"), TogglesLayout(), icon=f"{iq_asset}/icon_toggle.png"), + OP.PanelType.SOFTWARE: PanelInfo(tr_noop("Software"), IQSoftwareLayout(), icon=f"{iq_asset}/icon_software.png"), + OP.PanelType.MODELS: PanelInfo(tr_noop("Models"), ModelsLayout(), icon=f"{iq_asset}/icon_models.png"), + OP.PanelType.CRUISE: PanelInfo(tr_noop("Cruise"), CruiseLayout(), icon=f"{iq_asset}/icon_longitudinal.png"), + OP.PanelType.STEERING: PanelInfo(tr_noop("Steering"), SteeringLayout(), icon="icons_mici/wheel.png"), + OP.PanelType.VISUALS: PanelInfo(tr_noop("Visuals"), VisualsLayout(), icon=f"{iq_asset}/icon_visuals.png"), + OP.PanelType.VEHICLE: PanelInfo(tr_noop("Vehicle"), VehicleLayout(), icon=f"{iq_asset}/icon_vehicle.png"), + OP.PanelType.DEVELOPER: PanelInfo(tr_noop("Developer"), IQDeveloperLayout(), icon="icons/shell.png"), + } + self._hidden_from_sidebar = {OP.PanelType.CRUISE} + self._panels[OP.PanelType.TOGGLES].instance.set_cruise_panel_callback( + lambda: self.set_current_panel(OP.PanelType.CRUISE) + ) + + def _sidebar_entries(self): + for panel_type, panel_info in self._panels.items(): + if panel_type not in self._hidden_from_sidebar: + yield panel_type, panel_info + + def _populate_sidebar(self, rect: rl.Rectangle): + for panel_type, panel_info in self._sidebar_entries(): + entry = SidebarEntry(self, panel_type, panel_info) + entry.rect.width = rect.width - 100 + entry.rect.height = OP.NAV_BTN_HEIGHT + self._nav_items.append(entry) + self._sidebar_scroller.add_widget(entry) + + def _draw_close_button(self, rect: rl.Rectangle) -> rl.Rectangle: + btn = rl.Rectangle(rect.x + metrics.GUTTER * 3, rect.y + metrics.GUTTER * 2, + metrics.CLOSE_BTN, metrics.CLOSE_BTN) + pressed = (rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT) and + rl.check_collision_point_rec(rl.get_mouse_position(), btn)) + rl.draw_rectangle_rounded(btn, 1.0, 20, OP.CLOSE_BTN_PRESSED if pressed else OP.CLOSE_BTN_COLOR) + + icon = self._close_icon + dest = rl.Rectangle(btn.x + (btn.width - icon.width) / 2, btn.y + (btn.height - icon.height) / 2, + icon.width, icon.height) + tint = rl.Color(220, 220, 220, 255) if pressed else rl.WHITE + rl.draw_texture_pro(icon, rl.Rectangle(0, 0, icon.width, icon.height), dest, rl.Vector2(0, 0), 0, tint) + return btn + + def _draw_sidebar(self, rect: rl.Rectangle): + rl.draw_rectangle_rec(rect, OP.SIDEBAR_COLOR) + self._close_btn_rect = self._draw_close_button(rect) + + if not self._nav_items: + self._populate_sidebar(rect) + + nav_rect = rl.Rectangle(rect.x, self._close_btn_rect.height + metrics.GUTTER * 4, + rect.width, rect.height - 300) + self._sidebar_scroller.render(nav_rect) + + def _handle_mouse_release(self, mouse_pos: MousePos) -> bool: + if rl.check_collision_point_rec(mouse_pos, self._close_btn_rect): + if self._close_callback: + self._close_callback() + return True + + if self._sidebar_scroller.scroll_panel.is_touch_valid(): + for panel_type, panel_info in self._sidebar_entries(): + if rl.check_collision_point_rec(mouse_pos, panel_info.button_rect): + self.set_current_panel(panel_type) + return True + return False + + def show_event(self): + super().show_event() + self._panels[self._current_panel].instance.show_event() + self._sidebar_scroller.show_event() + +class BrandPanel: + def __init__(self): + self.items: list = [] + def update_settings(self) -> None: + pass + +_TUNING_BLURBS = ( + lambda: tr("Factory-default longitudinal tuning."), + lambda: tr("Dynamic tuning: livelier gas/brake response."), + lambda: tr("Predictive tuning: anticipates and smooths accel changes."), +) + +class HyundaiSettings(BrandPanel): + def __init__(self): + super().__init__() + self.alpha_long_available = False + self.longitudinal_tuning_item = multiple_button_item( + tr("Longitudinal Tune Profile"), "", + [tr("Off"), tr("Dynamic"), tr("Predictive")], + button_width=300, param="IQHyundaiLongTune", inline=False, + callback=lambda index: ui_state.params.put("IQHyundaiLongTune", index)) + self.items = [self.longitudinal_tuning_item] + + def _alpha_long_supported(self) -> bool: + if bundle := ui_state.params.get("CarPlatformBundle"): + return CAR[bundle.get("platform")] not in (UNSUPPORTED_LONGITUDINAL_CAR | CANFD_UNSUPPORTED_LONGITUDINAL_CAR) + if ui_state.CP: + return ui_state.CP.alphaLongitudinalAvailable + return False + + def update_settings(self): + self.alpha_long_available = self._alpha_long_supported() + selected = int(ui_state.params.get("IQHyundaiLongTune") or "0") + + if not ui_state.is_offroad(): + desc, usable = tr("Unavailable while the car is onroad."), False + elif not ui_state.has_longitudinal_control: + desc, usable = tr("Requires IQ.Pilot Longitudinal Control (Alpha) to be enabled."), False + else: + blurb = _TUNING_BLURBS[selected] if selected < len(_TUNING_BLURBS) else _TUNING_BLURBS[0] + desc, usable = blurb(), True + + row = self.longitudinal_tuning_item + row.action_item.set_enabled(usable) + row.set_description(desc) + row.show_description(True) + row.action_item.set_selected_button(selected) + row.set_visible(self.alpha_long_available) + +_UNSUPPORTED_FLAGS = SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID + +class SubaruSettings(BrandPanel): + def __init__(self): + super().__init__() + self._supported = False + self.stop_and_go_toggle = toggle_item(tr("Creep from Standstill (Beta)"), "", param="IQSubaruCreepAssist", + callback=lambda _: self.update_settings()) + self.stop_and_go_manual_parking_brake_toggle = toggle_item( + tr("Creep from Standstill — Manual Handbrake (Beta)"), "", + param="IQSubaruCreepAssistManualBrake", callback=lambda _: self.update_settings()) + self.items = [self.stop_and_go_toggle, self.stop_and_go_manual_parking_brake_toggle] + + def _platform_flags(self) -> int: + if bundle := ui_state.params.get("CarPlatformBundle"): + return CAR[bundle.get("platform")].config.flags + if ui_state.CP: + return ui_state.CP.flags + return 0 + + def _blocker_text(self) -> str: + if not self._supported: + return tr("Not available on this Subaru platform.") + if not ui_state.is_offroad(): + return tr("Flip on Always Offroad from the Device panel, or power the car down, to change this.") + return "" + + def update_settings(self): + self._supported = not (self._platform_flags() & _UNSUPPORTED_FLAGS) + blocker = self._blocker_text() + usable = self._supported and ui_state.is_offroad() + + rows = ( + (self.stop_and_go_toggle, + tr("Automatically resume from a stop while following traffic, on Subaru platforms where " + "the beta implementation applies.")), + (self.stop_and_go_manual_parking_brake_toggle, + tr("Stop-and-go variant for Subaru Global cars with a manual handbrake. Leave this off on " + "cars with an electric parking brake. Thanks to martinl for this implementation!")), + ) + for row, body in rows: + row.action_item.set_enabled(usable) + row.set_description(f"{blocker}

    {body}" if blocker else body) + +COOP_STEERING_MIN_KMH = 23 +OEM_STEERING_MIN_KMH = 48 +KM_TO_MILE = 0.621371 + +def _speed_text(kmh: int) -> str: + if ui_state.is_metric: + return f"{kmh} km/h" + return f"{round(kmh * KM_TO_MILE)} mph" + +class TeslaSettings(BrandPanel): + def __init__(self): + super().__init__() + self.torque_blend_toggle = toggle_item(tr("VTB (Virtual Torque Blending)"), "", param="IQTeslaTorqueBlend") + self.fsd_visualization_toggle = toggle_item(tr("FSD Visualization"), "", param="IQTeslaFsdVisualization") + self.items = [self.torque_blend_toggle, self.fsd_visualization_toggle] + + def update_settings(self): + caution = tr("Warning: steering may oscillate in turns below {}; turn this off if you feel it.").format( + _speed_text(OEM_STEERING_MIN_KMH)) + body = (f"{caution}

    " + f"{tr('Lets you nudge the wheel while engaged without fully disengaging steering.')}
    " + f"{tr('Active above {} only.').format(_speed_text(COOP_STEERING_MIN_KMH))}") + + if not ui_state.is_offroad(): + blocker = tr("Flip on Always Offroad from the Device panel, or power the car down, to change this.") + body = f"{blocker}

    {body}" + + self.torque_blend_toggle.set_description(body) + visualization_body = tr("Shows Tesla's FSD / Autosteer visualization while IQ.Pilot controls steering. " + + "Requires an offroad restart or reboot.") + if not ui_state.is_offroad(): + visualization_body = f"{blocker}

    {visualization_body}" + self.fsd_visualization_toggle.set_description(visualization_body) + for row in self.items: + row.action_item.set_enabled(ui_state.is_offroad()) + +class ToyotaSettings(BrandPanel): + def __init__(self): + super().__init__() + self.enforce_stock_longitudinal = toggle_item( + lambda: tr("Keep Factory Gas and Brake"), + description=lambda: tr("Keeps gas and brakes with the factory Toyota system; IQ.Pilot steers only."), + initial_state=ui_state.params.get_bool("IQToyotaFactoryLong"), + callback=self._on_toggled, + enabled=lambda: not ui_state.engaged, + ) + self.items = [self.enforce_stock_longitudinal] + + @staticmethod + def _apply(enabled: bool): + ui_state.params.put_bool("IQToyotaFactoryLong", enabled) + if enabled and ui_state.params.get_bool("AlphaLongitudinalEnabled"): + ui_state.params.put_bool("AlphaLongitudinalEnabled", False) + ui_state.params.put_bool("OnroadCycleRequested", True) + + def _on_toggled(self, state: bool): + if not state: + self._apply(False) + return + + def after_confirm(result: int): + if result == DialogResult.CONFIRM: + self._apply(True) + else: + self.enforce_stock_longitudinal.action_item.set_state(False) + + row = self.enforce_stock_longitudinal + prompt = f"

    {row.title}


    {row.description}

    " + gui_app.set_modal_overlay(ConfirmDialog(prompt, tr("Enable"), rich=True), callback=after_confirm) + +DESCRIPTIONS = { + 'pqhca5or7Toggle': tr_noop( + 'Use HCA Status 7 instead of Status 5 for steering control on PQ platform vehicles. ' + 'This may help with compatibility on some older Volkswagen models.' + ), + 'AllowLateralWhenLongUnavailable': tr_noop( + 'Allow lateral control (steering) to remain active even when longitudinal control (gas/brake) ' + 'is temporarily unavailable due to a cruise control fault.' + ), + 'iqMqbAccResume': tr_noop( + 'Allow IQ.Pilot to use MQB ACC resume behavior on supported FtS with Extended Hold without Auto Resume Volkswagen MQB vehicles.' + ), + 'iqMqbSteeringLockout': tr_noop( + 'Enable MQB steering lockout handling on Volkswagen MQB vehicles with low speed LKAS faults.' + ), + 'EnableCurvatureController': tr_noop( + 'Close the steering loop on MEB and MQB Evo vehicles. IQ.Pilot corrects its steering command against ' + 'the curvature the car is actually holding, instead of sending the planned curvature straight through.' + ), + 'EnableSmoothSteer': tr_noop( + 'Low-pass the planned curvature before it reaches the rack on MEB and MQB Evo vehicles, which damps ' + 'lateral wobble. On by default for these cars.' + ), +} + +class VolkswagenSettings(BrandPanel): + def __init__(self): + super().__init__() + + self.pq_hca_toggle = toggle_item( + lambda: tr("PQ HCA Status 7 Mode"), + description=lambda: tr(DESCRIPTIONS["pqhca5or7Toggle"]), + initial_state=ui_state.params.get_bool("pqhca5or7Toggle"), + callback=self._on_pq_hca_toggle, + enabled=lambda: not ui_state.engaged, + ) + + self.lateral_when_long_unavailable = toggle_item( + lambda: tr("Lateral Control When Cruise Faulted"), + description=lambda: tr(DESCRIPTIONS["AllowLateralWhenLongUnavailable"]), + initial_state=ui_state.params.get_bool("AllowLateralWhenLongUnavailable"), + callback=self._on_lateral_when_long_unavailable, + enabled=lambda: not ui_state.engaged, + ) + + self.mqb_acc_resume = toggle_item( + lambda: tr("MQB ACC Resume"), + description=lambda: tr(DESCRIPTIONS["iqMqbAccResume"]), + initial_state=ui_state.params.get_bool("iqMqbAccResume"), + callback=self._on_mqb_acc_resume, + enabled=lambda: not ui_state.engaged, + ) + + self.mqb_steering_lockout = toggle_item( + lambda: tr("MQB Steering Lockout"), + description=lambda: tr(DESCRIPTIONS["iqMqbSteeringLockout"]), + initial_state=ui_state.params.get_bool("iqMqbSteeringLockout"), + callback=self._on_mqb_steering_lockout, + enabled=lambda: not ui_state.engaged, + ) + + self.curvature_controller = toggle_item( + lambda: tr("Curvature Controller"), + description=lambda: tr(DESCRIPTIONS["EnableCurvatureController"]), + initial_state=ui_state.params.get_bool("EnableCurvatureController"), + callback=self._on_curvature_controller, + enabled=lambda: not ui_state.engaged, + ) + + self.smooth_steer = toggle_item( + lambda: tr("Smooth Steering"), + description=lambda: tr(DESCRIPTIONS["EnableSmoothSteer"]), + initial_state=ui_state.params.get_bool("EnableSmoothSteer"), + callback=self._on_smooth_steer, + enabled=lambda: not ui_state.engaged, + ) + + self.items = [self.pq_hca_toggle, self.lateral_when_long_unavailable, self.mqb_acc_resume, self.mqb_steering_lockout, + self.curvature_controller, self.smooth_steer] + + def _flags(self) -> VolkswagenFlags: + bundle = ui_state.params.get("CarPlatformBundle") + if bundle: + platform = bundle.get("platform") + if platform: + try: + return CAR[platform].config.flags + except (KeyError, AttributeError): + return VolkswagenFlags(0) + elif ui_state.CP: + return ui_state.CP.flags + return VolkswagenFlags(0) + + def _uses_hca_status_toggle(self) -> bool: + return bool(self._flags() & (VolkswagenFlags.PQ | VolkswagenFlags.MLB)) + + def _is_mqb(self) -> bool: + flags = self._flags() + return not bool(flags & (VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlags.MEB | VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO)) + + def _supports_lateral_when_faulted(self) -> bool: + return not bool(self._flags() & VolkswagenFlags.MLB) + + def _is_curvature_car(self) -> bool: + return bool(self._flags() & (VolkswagenFlags.MEB | VolkswagenFlags.MQB_EVO)) + + def _on_pq_hca_toggle(self, state: bool): + ui_state.params.put_bool("pqhca5or7Toggle", state) + + def _on_lateral_when_long_unavailable(self, state: bool): + ui_state.params.put_bool("AllowLateralWhenLongUnavailable", state) + + def _on_mqb_acc_resume(self, state: bool): + ui_state.params.put_bool("iqMqbAccResume", state) + + def _on_mqb_steering_lockout(self, state: bool): + ui_state.params.put_bool("iqMqbSteeringLockout", state) + + def _on_curvature_controller(self, state: bool): + ui_state.params.put_bool("EnableCurvatureController", state) + + def _on_smooth_steer(self, state: bool): + ui_state.params.put_bool("EnableSmoothSteer", state) + + def update_settings(self): + self.pq_hca_toggle.set_visible(self._uses_hca_status_toggle()) + self.lateral_when_long_unavailable.set_visible(self._supports_lateral_when_faulted()) + is_mqb = self._is_mqb() + self.mqb_acc_resume.set_visible(is_mqb) + self.mqb_steering_lockout.set_visible(is_mqb) + is_curvature_car = self._is_curvature_car() + self.curvature_controller.set_visible(is_curvature_car) + self.smooth_steer.set_visible(is_curvature_car) + +_REGISTRY: dict[str, type[BrandPanel]] = { + "hyundai": HyundaiSettings, + "subaru": SubaruSettings, + "tesla": TeslaSettings, + "toyota": ToyotaSettings, + "volkswagen": VolkswagenSettings, +} + + +def brand_settings_for(brand: str) -> BrandPanel | None: + cls = _REGISTRY.get(brand) + return cls() if cls else None + + +class BrandPanelFactory: + create_brand_settings = staticmethod(brand_settings_for) + +class FingerprintStatus(IntEnum): + NONE = 0 # nothing identified, nothing forced + AUTO = 1 # car identified itself over CAN + FORCED = 2 # user pinned a platform manually + + +STATUS_COLORS = { + FingerprintStatus.NONE: ink.STATUS_WARN, + FingerprintStatus.AUTO: ink.STATUS_GOOD, + FingerprintStatus.FORCED: ink.STATUS_INFO, +} + + +class VehicleSelection: + def __init__(self): + self.platforms: dict = load_catalog() + + @staticmethod + def forced_bundle(): + return ui_state.params.get("CarPlatformBundle") + + def status(self) -> FingerprintStatus: + if self.forced_bundle(): + return FingerprintStatus.FORCED + if ui_state.CP and ui_state.CP.carFingerprint != "MOCK": + return FingerprintStatus.AUTO + return FingerprintStatus.NONE + + def display_name(self) -> str: + if bundle := self.forced_bundle(): + return bundle.get("name", "") + if ui_state.CP and ui_state.CP.carFingerprint != "MOCK": + return ui_state.CP.carFingerprint + return tr("No vehicle set") + + def force(self, platform_name: str) -> bool: + data = self.platforms.get(platform_name) + if not data: + return False + ui_state.params.put("CarPlatformBundle", {**data, "name": platform_name}) + return True + + @staticmethod + def clear(): + ui_state.params.remove("CarPlatformBundle") + + def picker_folders(self) -> list[PickerGroup]: + def node_for(name: str) -> PickerItem: + info = self.platforms[name] + years = ' '.join(map(str, info.get('year', []))) + return PickerItem(name, { + 'display_name': name, + 'search_tags': f"{name} {info.get('make')} {years} {info.get('model', name)}", + }) + + names = sorted(self.platforms) + makes = sorted({self.platforms[n].get('make') for n in names}) + return [PickerGroup(make, [node_for(n) for n in names if self.platforms[n].get('make') == make]) + for make in makes] + + +class VehiclePicker(Button): + def __init__(self, on_platform_change: Callable[[], None] | None = None): + super().__init__(tr("Vehicle"), self._on_clicked, button_style=ButtonStyle.NORMAL) + self.set_rect(rl.Rectangle(0, 0, 0, 120)) + self.selection = VehicleSelection() + self._on_platform_change = on_platform_change + self.refresh() + + @property + def text(self): + return self._label._text + + @property + def status(self) -> FingerprintStatus: + return self.selection.status() + + @property + def color(self) -> rl.Color: + return STATUS_COLORS[self.status] + + def set_parent_rect(self, parent_rect): + super().set_parent_rect(parent_rect) + self._rect.width = parent_rect.width + + def refresh(self): + self.set_text(self.selection.display_name()) + self.set_enabled(True) + + def _notify(self): + self.refresh() + if self._on_platform_change: + self._on_platform_change() + + def _on_clicked(self): + if self.selection.forced_bundle(): + self.selection.clear() + self._notify() + else: + self._open_picker() + + def _open_picker(self): + dialog = PickerDialog( + tr("Pick your vehicle"), + self.selection.picker_folders(), + search_prompt=tr("Search make or model"), + search_title=tr("Find your vehicle"), + search_subtitle=tr("Type a year then a model — for example, 2021 Toyota Corolla:"), + search_funcs=[lambda node: node.data.get('display_name', ''), lambda node: node.data.get('search_tags', '')], + ) + done = partial(self._on_picked, dialog) + dialog.on_exit = done + gui_app.set_modal_overlay(dialog, callback=done) + + def _on_picked(self, dialog, res): + if res != DialogResult.CONFIRM or not dialog.selection_ref: + return + when = tr("Applies right away.") if ui_state.is_offroad else \ + tr("Applies the next time the device goes offroad.") + + def confirm(result): + if result == DialogResult.CONFIRM and self.selection.force(dialog.selection_ref): + self._notify() + + gui_app.set_modal_overlay(ConfirmDialog(when, tr("Confirm")), callback=confirm) + + +_LEGEND = ( + (FingerprintStatus.AUTO, lambda: tr("Detected automatically")), + (FingerprintStatus.FORCED, lambda: tr("Chosen manually")), + (FingerprintStatus.NONE, lambda: tr("Undetected and unset")), +) + +class LegendWidget(Widget): + def __init__(self, platform_selector: VehiclePicker): + super().__init__() + self.set_rect(rl.Rectangle(0, 0, 0, 350)) + self._selector = platform_selector + self._font = gui_app.font(FontWeight.NORMAL) + self._bold_font = gui_app.font(FontWeight.BOLD) + + def _render(self, rect): + x = rect.x + 20 + y = rect.y + 20 + rl.draw_text_ex(self._font, tr("Pin a vehicle to skip auto-detection."), rl.Vector2(x, y), 40, 0, ink.CAPTION) + y += 80 + rl.draw_text_ex(self._font, tr("Colour key for fingerprint state:"), rl.Vector2(x, y), 40, 0, ink.CAPTION) + y += 80 + + active = self._selector.status + for status, label in _LEGEND: + font = self._bold_font if status == active else self._font + text_color = rl.WHITE if status == active else ink.CAPTION + text = f"- {label()}" + ts = measure_text_cached(font, text, 40) + chip_cy = (y - 7) + ts.y / 2 + rl.draw_rectangle_rounded(rl.Rectangle(x, chip_cy - 18, 36, 36), 0.45, 10, STATUS_COLORS[status]) + rl.draw_text_ex(font, text, rl.Vector2(x + 56, y - 7), 40, 0, text_color) + y += 50 + +_STATUS_BADGES = { + FingerprintStatus.AUTO: lambda: tr("AUTO"), + FingerprintStatus.FORCED: lambda: tr("MANUAL"), + FingerprintStatus.NONE: lambda: tr("NONE"), +} + +class VehicleLayout(Widget): + def __init__(self): + super().__init__() + self._brand_settings = None + self._current_brand = None + self._platform_selector = VehiclePicker(self._on_vehicle_changed) + self._vehicle_item = IQListItem(title=self._platform_selector.text, action_item=ButtonAction(text=tr("SELECT")), + callback=self._platform_selector._on_clicked) + self._legend_widget = LegendWidget(self._platform_selector) + self._refresh_vehicle_row() + + self.items = [self._vehicle_item, self._legend_widget] + self._scroller = Scroller(self.items, line_separator=True, spacing=0) + + @staticmethod + def get_brand(): + bundle = ui_state.params.get("CarPlatformBundle") + if bundle: + return bundle.get("brand", "") + fingerprinted = ui_state.CP and ui_state.CP.carFingerprint != "MOCK" + return ui_state.CP.brand if fingerprinted else "" + + def _refresh_vehicle_row(self): + status = self._platform_selector.status + self._vehicle_item._title = self._platform_selector.text + self._vehicle_item.title_color = rl.WHITE + self._vehicle_item.title_badge = (_STATUS_BADGES[status](), STATUS_COLORS[status]) + forced = ui_state.params.get("CarPlatformBundle") is not None + self._vehicle_item.action_item.set_text(tr("REMOVE") if forced else tr("SELECT")) + + def _sync_brand_panel(self): + brand = self.get_brand() + if brand == self._current_brand: + return + self._current_brand = brand + self._brand_settings = brand_settings_for(brand) + brand_rows = self._brand_settings.items if self._brand_settings else [] + self.items = [self._vehicle_item, self._legend_widget, *brand_rows] + self._scroller = Scroller(self.items, line_separator=True, spacing=0) + + def _on_vehicle_changed(self): + self._refresh_vehicle_row() + self._sync_brand_panel() + + def _update_state(self): + self._on_vehicle_changed() + if self._brand_settings: + self._brand_settings.update_settings() + self._platform_selector.refresh() + + def _render(self, rect): + self._scroller.render(rect) + + def show_event(self): + self._scroller.show_event() diff --git a/iqpilot/ui/mici/__init__.py b/iqpilot/ui/mici/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/ui/mici/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/ui/mici/onroad/__init__.py b/iqpilot/ui/mici/onroad/__init__.py new file mode 100644 index 000000000..297dca9e1 --- /dev/null +++ b/iqpilot/ui/mici/onroad/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" diff --git a/iqpilot/ui/mici/onroad/confidence_ball.py b/iqpilot/ui/mici/onroad/confidence_ball.py new file mode 100644 index 000000000..887ac08a2 --- /dev/null +++ b/iqpilot/ui/mici/onroad/confidence_ball.py @@ -0,0 +1,30 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import pyray as rl +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus + + +ACTIVE_CONFIDENCE_TOP = rl.Color(0x22, 0xB8, 0xB9, 0xFF) +ACTIVE_CONFIDENCE_BOTTOM = rl.Color(0x0C, 0x94, 0x96, 0xFF) +MEDIUM_CONFIDENCE_TOP = rl.Color(255, 200, 0, 255) +MEDIUM_CONFIDENCE_BOTTOM = rl.Color(255, 115, 0, 255) +LOW_CONFIDENCE_TOP = rl.Color(255, 0, 21, 255) +LOW_CONFIDENCE_BOTTOM = rl.Color(255, 0, 89, 255) + + +class IQConfidenceBall: + @staticmethod + def get_animate_status_probs(): + if ui_state.status == UIStatus.LAT_ONLY: + return ui_state.sm['modelV2'].meta.disengagePredictions.steerOverrideProbs + + return ui_state.sm['modelV2'].meta.disengagePredictions.brakeDisengageProbs + + @staticmethod + def get_lat_long_dot_colors(confidence: float) -> tuple[rl.Color, rl.Color]: + if confidence > 0.5: + return ACTIVE_CONFIDENCE_TOP, ACTIVE_CONFIDENCE_BOTTOM + if confidence > 0.2: + return MEDIUM_CONFIDENCE_TOP, MEDIUM_CONFIDENCE_BOTTOM + return LOW_CONFIDENCE_TOP, LOW_CONFIDENCE_BOTTOM diff --git a/iqpilot/ui/mici/onroad/emac_source.py b/iqpilot/ui/mici/onroad/emac_source.py new file mode 100644 index 000000000..4adb1801a --- /dev/null +++ b/iqpilot/ui/mici/onroad/emac_source.py @@ -0,0 +1,43 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import time + +import pyray as rl + +from iqpilot.common.params import Params +from iqpilot.ui.onroad.big_model_status import SourceState, draw_source_label, resolve_source +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.lib.text_measure import measure_text_cached + +_POLL_S = 1.0 +_FONT_SIZE = 44 +_WHEEL_H = 50 +_MARGIN_R = 12 +_MARGIN_B = 14 + + +class EmacSourceIndicator: + def __init__(self): + self._params = Params() + self._font = gui_app.font(FontWeight.SEMI_BOLD) + self._last_poll = 0.0 + self._label = "" + self._state = SourceState.HIDDEN + + def update(self) -> None: + now = time.monotonic() + if now - self._last_poll < _POLL_S: + return + self._last_poll = now + self._label, self._state = resolve_source(self._params, ui_state.engaged) + + def render(self, rect: rl.Rectangle) -> None: + if self._state == SourceState.HIDDEN: + return + size = measure_text_cached(self._font, self._label, _FONT_SIZE) + x = rect.x + rect.width - _MARGIN_R - size.x + y = rect.y + rect.height - _MARGIN_B - (_WHEEL_H + size.y) / 2 + draw_source_label(self._font, self._label, self._state, rl.Vector2(x, y), _FONT_SIZE) diff --git a/iqpilot/ui/mici/onroad/hud_renderer.py b/iqpilot/ui/mici/onroad/hud_renderer.py new file mode 100644 index 000000000..4dfc6fa21 --- /dev/null +++ b/iqpilot/ui/mici/onroad/hud_renderer.py @@ -0,0 +1,26 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import pyray as rl + +from iqpilot.selfdrive.ui.mici.onroad.hud_renderer import HudRenderer +from iqpilot.ui.onroad.hud_overlays import IQBlindSpotOverlay +from iqpilot.ui.mici.onroad.emac_source import EmacSourceIndicator + +class IQMiciHudRenderer(HudRenderer): + def __init__(self): + super().__init__() + self._overlays = [IQBlindSpotOverlay(), EmacSourceIndicator()] + + def _update_state(self) -> None: + super()._update_state() + for overlay in self._overlays: + overlay.update() + + def _render(self, rect: rl.Rectangle) -> None: + super()._render(rect) + for overlay in self._overlays: + overlay.render(rect) + + def _has_blind_spot_detected(self) -> bool: + return any(getattr(overlay, "detected", False) for overlay in self._overlays) diff --git a/iqpilot/ui/mici/onroad/road_label.py b/iqpilot/ui/mici/onroad/road_label.py new file mode 100644 index 000000000..133bd8d07 --- /dev/null +++ b/iqpilot/ui/mici/onroad/road_label.py @@ -0,0 +1,10 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +from iqpilot.ui.onroad.hud_overlays import RoadNameBanner + +class RoadNameRendererMici(RoadNameBanner): + TYPE_SIZE = 18 + MARGIN = 120 + GAP = 2 + TORQUE_SCALE = 1.0 diff --git a/iqpilot/ui/onroad/__init__.py b/iqpilot/ui/onroad/__init__.py new file mode 100644 index 000000000..75a336dc1 --- /dev/null +++ b/iqpilot/ui/onroad/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" \ No newline at end of file diff --git a/iqpilot/ui/onroad/augmented_road_view.py b/iqpilot/ui/onroad/augmented_road_view.py new file mode 100644 index 000000000..01f45e3e4 --- /dev/null +++ b/iqpilot/ui/onroad/augmented_road_view.py @@ -0,0 +1,18 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import pyray as rl +from iqpilot.selfdrive.ui.ui_state import UIStatus + +BORDER_COLORS_IQ = { + UIStatus.LAT_ONLY: rl.Color(0x0C, 0x94, 0x96, 0xFF), + UIStatus.LONG_ONLY: rl.Color(0x96, 0x1C, 0xA8, 0xFF), +} + + +class AugmentedRoadViewIQ: + def __init__(self): + pass + + def update_fade_out_bottom_overlay(self, _content_rect): + pass diff --git a/iqpilot/ui/onroad/big_model_status.py b/iqpilot/ui/onroad/big_model_status.py new file mode 100644 index 000000000..a4e1537d3 --- /dev/null +++ b/iqpilot/ui/onroad/big_model_status.py @@ -0,0 +1,71 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" +import math +from enum import IntEnum + +import pyray as rl + +from iqpilot.common.params import Params +from iqpilot.system.ui.lib.text_measure import measure_text_cached + +class SourceState(IntEnum): + HIDDEN = 0 + LOADING = 1 + ACTIVE = 2 + FAILED = 3 + CROSSED = 4 + + +_GREEN = rl.Color(46, 204, 113, 255) +_ORANGE = rl.Color(255, 115, 0, 255) +_WHITE = rl.Color(255, 255, 255, 255) + + +def _emac_state(params: Params, engaged: bool) -> SourceState: + if not params.get_bool("MacModelReachable"): + return SourceState.HIDDEN + if params.get_bool("MacModelActive"): + return SourceState.ACTIVE + if params.get_bool("MacModelFailed"): + return SourceState.CROSSED if engaged else SourceState.FAILED + return SourceState.LOADING + + +def _egpu_state(params: Params, engaged: bool) -> SourceState: + if not params.get_bool("UsbGpuPresent"): + return SourceState.HIDDEN + if params.get_bool("UsbGpuActive"): + return SourceState.ACTIVE + if params.get_bool("UsbGpuFailed"): + return SourceState.CROSSED if engaged else SourceState.FAILED + return SourceState.LOADING + + +def resolve_source(params: Params, engaged: bool) -> tuple[str, SourceState]: + if params.get_bool("IQEmacEnabled"): + return "MAC", _emac_state(params, engaged) + if params.get_bool("UsbGpuPresent") or params.get_bool("IQEgpuEnabled"): + return "GPU", _egpu_state(params, engaged) + return "", SourceState.HIDDEN + + +def draw_source_label(font: rl.Font, label: str, state: SourceState, + pos: rl.Vector2, font_size: int) -> None: + if state == SourceState.HIDDEN or not label: + return + if state == SourceState.ACTIVE: + color, opacity, strike = _GREEN, 1.0, False + elif state == SourceState.FAILED: + color, opacity, strike = _ORANGE, 1.0, False + elif state == SourceState.CROSSED: + color, opacity, strike = _WHITE, 0.65, True + else: + color, opacity, strike = _WHITE, 0.35 + 0.65 * (0.5 - 0.5 * math.cos(rl.get_time() * 6.0)), False + + col = rl.Color(color.r, color.g, color.b, int(255 * opacity)) + rl.draw_text_ex(font, label, pos, font_size, 0, col) + if strike: + size = measure_text_cached(font, label, font_size) + y = int(pos.y + size.y / 2) + rl.draw_line_ex(rl.Vector2(pos.x - 2, y), rl.Vector2(pos.x + size.x + 2, y), 4, col) diff --git a/iqpilot/ui/onroad/driver_state.py b/iqpilot/ui/onroad/driver_state.py new file mode 100644 index 000000000..84bf8440a --- /dev/null +++ b/iqpilot/ui/onroad/driver_state.py @@ -0,0 +1,159 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import time +import numpy as np +import pyray as rl + +from iqpilot.common.params import Params +from iqpilot.selfdrive.ui import UI_BORDER_SIZE +from iqpilot.selfdrive.ui.onroad.driver_state import DriverStateRenderer, BTN_SIZE, ARC_LENGTH +from iqpilot.ui.onroad.hud_overlays import IQDevMetricsOverlay +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.text_measure import measure_text_cached + +_PERSONALITY_RELAXED = 0 +_PERSONALITY_STANDARD = 1 +_PERSONALITY_AGGRESSIVE = 2 + +PERSONALITY_COLORS = { + _PERSONALITY_RELAXED: rl.Color(0x17, 0xC9, 0x64, 0xFF), + _PERSONALITY_STANDARD: rl.Color(0x0C, 0x94, 0x96, 0xFF), + _PERSONALITY_AGGRESSIVE: rl.Color(0xE8, 0x2C, 0x2C, 0xFF), +} + +PERSONALITY_NAMES = { + _PERSONALITY_RELAXED: "Relaxed", + _PERSONALITY_STANDARD: "Standard", + _PERSONALITY_AGGRESSIVE: "Aggressive", +} + +_TOAST_DURATION = 2.0 +_TOAST_FONT_SIZE = 52 +_TOAST_PAD_X = 52 +_TOAST_PAD_Y = 22 +_TOAST_BOTTOM_MARGIN = UI_BORDER_SIZE + 36 +_TOAST_RADIUS = 0.45 +_TOAST_FADE = 0.25 + +class DriverStateRendererIQ(DriverStateRenderer): + def __init__(self): + super().__init__() + self._params = Params() + self._personality: int = _PERSONALITY_STANDARD + self._personality_color: rl.Color = PERSONALITY_COLORS[_PERSONALITY_STANDARD] + + self._toast_end_time: float = 0.0 + self._toast_text: str = "" + self._toast_color: rl.Color = rl.WHITE + self._font = gui_app.font(FontWeight.SEMI_BOLD) + + self.dev_ui_offset = IQDevMetricsOverlay.get_bottom_dev_ui_offset() + self._dm_background = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_background.png", BTN_SIZE, BTN_SIZE) + self._dm_person = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_person.png", 118, 118) + self._dm_cone = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_cone.png", 118, 118) + + def _update_state(self): + super()._update_state() + personality = self._params.get("LongitudinalPersonality", return_default=True) + if personality is not None: + self._personality = int(personality) + self._personality_color = PERSONALITY_COLORS.get(self._personality, PERSONALITY_COLORS[_PERSONALITY_STANDARD]) + + def cycle_personality(self): + next_p = (self._personality + 1) % 3 + self._params.put_nonblocking("LongitudinalPersonality", next_p) + self._personality = next_p + self._personality_color = PERSONALITY_COLORS[next_p] + self._toast_text = PERSONALITY_NAMES[next_p] + self._toast_color = PERSONALITY_COLORS[next_p] + self._toast_end_time = time.monotonic() + _TOAST_DURATION + + def _render(self, _): + fade = max(0.35, 1.0 - self.dm_fade_state) + alpha = int(255 * fade) + pc = self._personality_color + + rl.draw_texture( + self._dm_background, + int(self.position_x - self._dm_background.width / 2), + int(self.position_y - self._dm_background.height / 2), + rl.Color(pc.r, pc.g, pc.b, alpha), + ) + + rl.draw_texture( + self._dm_person, + int(self.position_x - self._dm_person.width / 2), + int(self.position_y - self._dm_person.height / 2), + rl.Color(255, 255, 255, int(alpha * 0.9)), + ) + + if self.is_active: + dest_rect = rl.Rectangle(self.position_x, self.position_y, self._dm_cone.width, self._dm_cone.height) + rl.draw_texture_pro( + self._dm_cone, + rl.Rectangle(0, 0, self._dm_cone.width, self._dm_cone.height), + dest_rect, + rl.Vector2(dest_rect.width / 2, dest_rect.height / 2), + 180.0, + rl.Color(pc.r, pc.g, pc.b, alpha), + ) + else: + rl.draw_circle(int(self.position_x), int(self.position_y), 14, rl.Color(255, 255, 255, alpha)) + + self._draw_personality_toast() + + def _draw_personality_toast(self): + now = time.monotonic() + remaining = self._toast_end_time - now + if remaining <= 0 or not self._toast_text: + return + + elapsed = _TOAST_DURATION - remaining + fade_in = min(1.0, elapsed / _TOAST_FADE) + fade_out = min(1.0, remaining / _TOAST_FADE) + a = int(255 * fade_in * fade_out) + + text_size = measure_text_cached(self._font, self._toast_text, _TOAST_FONT_SIZE) + toast_w = text_size.x + _TOAST_PAD_X * 2 + toast_h = text_size.y + _TOAST_PAD_Y * 2 + + cx = self._rect.x + self._rect.width / 2 + toast_x = cx - toast_w / 2 + toast_y = self._rect.y + self._rect.height - _TOAST_BOTTOM_MARGIN - toast_h + + tc = self._toast_color + toast_rect = rl.Rectangle(toast_x, toast_y, toast_w, toast_h) + rl.draw_rectangle_rounded(toast_rect, _TOAST_RADIUS, 10, rl.Color(tc.r, tc.g, tc.b, a)) + rl.draw_text_ex( + self._font, self._toast_text, + rl.Vector2(toast_x + _TOAST_PAD_X, toast_y + _TOAST_PAD_Y), + _TOAST_FONT_SIZE, 0, + rl.Color(255, 255, 255, a), + ) + + def _pre_calculate_drawing_elements(self): + width, height = self._rect.width, self._rect.height + offset = UI_BORDER_SIZE + BTN_SIZE // 2 + self.position_x = self._rect.x + (width - offset if self.is_rhd else offset) + self.position_y = self._rect.y + height - offset - self.dev_ui_offset + + positioned_keypoints = self.face_keypoints_transformed + np.array([self.position_x, self.position_y]) + for i in range(len(positioned_keypoints)): + self.face_lines[i].x = positioned_keypoints[i][0] + self.face_lines[i].y = positioned_keypoints[i][1] + + delta_x = -self.driver_pose_sins[1] * ARC_LENGTH / 2.0 + delta_y = -self.driver_pose_sins[0] * ARC_LENGTH / 2.0 + + h_width = abs(delta_x) + self.h_arc_data = self._calculate_arc_data( + delta_x, h_width, self.position_x, self.position_y - ARC_LENGTH / 2, + self.driver_pose_sins[1], self.driver_pose_diff[1], is_horizontal=True + ) + + v_height = abs(delta_y) + self.v_arc_data = self._calculate_arc_data( + delta_y, v_height, self.position_x - ARC_LENGTH / 2, self.position_y, + self.driver_pose_sins[0], self.driver_pose_diff[0], is_horizontal=False + ) diff --git a/iqpilot/ui/onroad/emac_status.py b/iqpilot/ui/onroad/emac_status.py new file mode 100644 index 000000000..efcb65955 --- /dev/null +++ b/iqpilot/ui/onroad/emac_status.py @@ -0,0 +1,44 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ +""" + +import time + +import pyray as rl + +from iqpilot.common.params import Params +from iqpilot.ui.onroad.big_model_status import SourceState, draw_source_label, resolve_source +from iqpilot.selfdrive.ui import UI_BORDER_SIZE +from iqpilot.selfdrive.ui.onroad.driver_state import BTN_SIZE +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import FontWeight, gui_app +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.widgets import Widget + +_POLL_S = 1.0 +_FONT_SIZE = 70 + + +class EmacStatusRenderer(Widget): + def __init__(self): + super().__init__() + self._params = Params() + self._font = gui_app.font(FontWeight.SEMI_BOLD) + self._last_poll = 0.0 + self._label = "" + self._state = SourceState.HIDDEN + + def update(self): + now = time.monotonic() + if now - self._last_poll < _POLL_S: + return + self._last_poll = now + self._label, self._state = resolve_source(self._params, ui_state.engaged) + + def _render(self, rect: rl.Rectangle): + if self._state == SourceState.HIDDEN: + return + size = measure_text_cached(self._font, self._label, _FONT_SIZE) + x = rect.x + UI_BORDER_SIZE + BTN_SIZE // 2 - size.x / 2 + y = rect.y + rect.height / 2 - size.y / 2 + draw_source_label(self._font, self._label, self._state, rl.Vector2(x, y), _FONT_SIZE) diff --git a/iqpilot/ui/onroad/hud_overlays.py b/iqpilot/ui/onroad/hud_overlays.py new file mode 100644 index 000000000..65d595d29 --- /dev/null +++ b/iqpilot/ui/onroad/hud_overlays.py @@ -0,0 +1,918 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import math +import time + +import numpy as np +import pyray as rl + +from iqpilot.cereal import car, custom +from iqpilot.common.constants import CV +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.ui.onroad.hud_renderer import COLORS, FONT_SIZES, UI_CONFIG +from iqpilot.selfdrive.ui.mici.onroad.alert_renderer import IconSide, TURN_SIGNAL_BLINK_PERIOD +from iqpilot.selfdrive.ui.mici.onroad.torque_bar import TorqueBar +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.multilang import tr +from iqpilot.system.ui.widgets import Widget +from iqpilot.system.ui.iqwidgets.lib import canvas +from iqdbc.car.volkswagen.values import VolkswagenFlags + +def _feed(): + return ui_state.sm + + +def _speed_scale() -> float: + return CV.MS_TO_KPH if ui_state.is_metric else CV.MS_TO_MPH + + +_STRIP_WIDTH = 28 +_STRIP_INSET = 14 +_STRIP_CEILING = 0.85 +_STRIP_EMA = 5.0 +_STRIP_ARC_SEGMENTS = 24 +_STRIP_ACCEL = (33, 112, 115) +_STRIP_ACCEL_NEON = (94, 232, 236) +_STRIP_DECEL = (255, 0, 247) +_STRIP_DECEL_NEON = (255, 145, 251) +_STRIP_TIP_ALPHA = 235 +_STRIP_ROOT_ALPHA = 55 +_STRIP_CORE_DEPTH = 7.0 +_STRIP_CORE_LAYERS = 8 +_STRIP_CORE_ALPHA = 0.15 +_STRIP_CORE_FLOOR = 0.3 +_STRIP_CORE_TAIL = 22.0 +_STRIP_HALO_SPREAD = 11.0 +_STRIP_HALO_LAYERS = 11 +_STRIP_HALO_ALPHA = 0.095 +_STRIP_HALO_TAIL = 34.0 +_STRIP_NEON_FULL = 2.0 + + +class IQAccelBar: + def __init__(self): + self._eased = 0.0 + + def _reach(self) -> float: + mag = abs(self._eased) + return 0.0 if mag == 0.0 else max(0.0, _STRIP_CEILING - 0.1 / mag) + + @staticmethod + def _tint(fill, frac: float): + return canvas.shade(*fill, int(_STRIP_TIP_ALPHA + (_STRIP_ROOT_ALPHA - _STRIP_TIP_ALPHA) * frac)) + + @staticmethod + def _halo(center, cap: float, up: bool, neon, heat: float, tail: float) -> None: + step = int(255 * _STRIP_HALO_ALPHA * heat) + if step < 1: + return + start, end = (180.0, 360.0) if up else (0.0, 180.0) + tint = canvas.shade(*neon, step) + faded = canvas.shade(*neon, 0) + top, bottom = (tint, faded) if up else (faded, tint) + for i in range(_STRIP_HALO_LAYERS): + spread = _STRIP_HALO_SPREAD * (1.0 - i / _STRIP_HALO_LAYERS) + if spread <= 0.0: + continue + canvas.annulus(center, cap, cap + spread, start, end, _STRIP_ARC_SEGMENTS, tint) + if tail <= 0.0: + continue + run = min(tail, _STRIP_HALO_TAIL) + y = center.y if up else center.y - run + canvas.v_sweep(center.x - cap - spread, y, spread, run, top, bottom) + canvas.v_sweep(center.x + cap, y, spread, run, top, bottom) + + @staticmethod + def _cap(center, cap: float, up: bool, fill, neon, heat: float, tail: float) -> None: + start, end = (180.0, 360.0) if up else (0.0, 180.0) + canvas.annulus(center, 0.0, cap, start, end, _STRIP_ARC_SEGMENTS, fill) + IQAccelBar._halo(center, cap, up, neon, heat, tail) + lit = _STRIP_CORE_FLOOR + (1.0 - _STRIP_CORE_FLOOR) * heat + core = canvas.shade(*neon, max(1, int(255 * _STRIP_CORE_ALPHA * lit))) + faded = canvas.shade(*neon, 0) + top, bottom = (core, faded) if up else (faded, core) + run = min(tail, _STRIP_CORE_TAIL) + for i in range(_STRIP_CORE_LAYERS): + depth = _STRIP_CORE_DEPTH * (1.0 - i / _STRIP_CORE_LAYERS) + if depth <= 0.0: + continue + canvas.annulus(center, max(0.0, cap - depth), cap, start, end, _STRIP_ARC_SEGMENTS, core) + if run <= 0.0: + continue + y = center.y if up else center.y - run + canvas.v_sweep(center.x - cap, y, depth, run, top, bottom) + canvas.v_sweep(center.x + cap - depth, y, depth, run, top, bottom) + + def render(self, rect, sm) -> None: + if not ui_state.rocket_fuel: + return + self._eased += (sm['carState'].aEgo - self._eased) / _STRIP_EMA + reach = self._reach() * rect.height / 2.0 + if reach <= 0.0: + return + accelerating = self._eased > 0.0 + mid = rect.y + rect.height / 2.0 + top = mid - reach if accelerating else mid + x = rect.x + _STRIP_INSET + cap = min(_STRIP_WIDTH / 2.0, reach / 2.0) + fill, neon = (_STRIP_ACCEL, _STRIP_ACCEL_NEON) if accelerating else (_STRIP_DECEL, _STRIP_DECEL_NEON) + near = cap / reach + frac_top, frac_bottom = (near, 1.0 - near) if accelerating else (1.0 - near, near) + heat = min(abs(self._eased) / _STRIP_NEON_FULL, 1.0) + + canvas.v_sweep(x, top + cap, cap * 2.0, reach - cap * 2.0, + self._tint(fill, frac_top), self._tint(fill, frac_bottom)) + tail = max(0.0, reach / 2.0 - cap) + self._cap(canvas.Pt(x + cap, top + cap), cap, True, self._tint(fill, frac_top), neon, heat, tail) + self._cap(canvas.Pt(x + cap, top + reach - cap), cap, False, self._tint(fill, frac_bottom), neon, heat, tail) + +_BS_INSET = 20 +_BS_DROP = 100 +_BS_MIN = 0.01 + + +class _BlindSide: + def __init__(self, name: str): + self.texture = gui_app.texture(f'icons_mici/onroad/blind_spot_{name}.png', 108, 128) + self.glow = FirstOrderFilter(0, 0.15, 1 / gui_app.target_fps) + self.on_left = name == "left" + + def feed(self, present: bool): + self.glow.update(1.0 if present else 0.0) + + def lit(self) -> bool: + return self.glow.x > _BS_MIN + + def place(self, rect): + tex = self.texture + x = rect.x + _BS_INSET if self.on_left else rect.x + rect.width - _BS_INSET - tex.width + canvas.stamp(tex, x, rect.y + _BS_DROP, canvas.shade(255, 255, 255, int(255 * self.glow.x))) + + +class IQBlindSpotOverlay: + def __init__(self): + self._left = _BlindSide("left") + self._right = _BlindSide("right") + + def update(self) -> None: + cs = _feed()['carState'] + self._left.feed(cs.leftBlindspot) + self._right.feed(cs.rightBlindspot) + + @property + def detected(self) -> bool: + return self._left.lit() or self._right.lit() + + def render(self, rect) -> None: + if not ui_state.blindspot: + return + for side in (self._left, self._right): + if side.lit(): + side.place(rect) + +_MQB_CLUSTER_EXEMPT = (VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlags.MEB | VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO) + +class IQSpeedOverlay: + def __init__(self): + self.speed: float = 0.0 + self._cluster_ever_live: bool = False + self._heavy = gui_app.font(FontWeight.BOLD) + self._mid = gui_app.font(FontWeight.MEDIUM) + + def _source_speed(self, cs) -> float: + cp = ui_state.CP + if cp is not None and cp.brand == "volkswagen" and not (cp.flags & _MQB_CLUSTER_EXEMPT): + return cs.vEgoCluster + self._cluster_ever_live = self._cluster_ever_live or cs.vEgoCluster != 0.0 + return cs.vEgoCluster if self._cluster_ever_live else cs.vEgo + + def update(self) -> None: + self.speed = max(0.0, self._source_speed(_feed()['carState']) * _speed_scale()) + + def _stack(self, face, text: str, size: int, rect, top: float, color) -> float: + extent = canvas.span(face, text, size) + canvas.glyphs(face, text, canvas.Pt(rect.x + (rect.width - extent.x) / 2, top), size, color) + return extent.y + + def render(self, rect) -> None: + top = rect.y + 52 + number_h = self._stack(self._heavy, str(round(self.speed)), FONT_SIZES.current_speed, rect, top, COLORS.WHITE) + unit = tr("km/h") if ui_state.is_metric else tr("mph") + self._stack(self._mid, unit, FONT_SIZES.speed_unit, rect, top + number_h - 10, COLORS.WHITE_TRANSLUCENT) + +def clip_to_width(font, words: str, size: int, limit: float) -> str: + if canvas.span(font, words, size).x <= limit: + return words + trimmed = words + while len(trimmed) > 3 and canvas.span(font, trimmed + "...", size).x > limit: + trimmed = trimmed[:-1] + return trimmed + "..." + + +class RoadNameBanner(Widget): + TYPE_SIZE = 46 + MARGIN = 40 + GAP = 10 + TORQUE_SCALE = 3.0 + + def __init__(self): + super().__init__() + self.road_name = "" + self._face = gui_app.font(FontWeight.BOLD) + + def update(self): + sm = _feed() + if sm.recv_frame["carState"] < ui_state.started_frame: + return + if sm.updated["iqLiveData"]: + self.road_name = sm["iqLiveData"].roadName + + def _render(self, rect): + if not self.road_name or not ui_state.road_name_toggle: + return + label = clip_to_width(self._face, self.road_name, self.TYPE_SIZE, rect.width - self.MARGIN) + extent = canvas.span(self._face, label, self.TYPE_SIZE) + top = min(TorqueBar.resting_bottom(rect, self.TORQUE_SCALE) + self.GAP, + rect.y + rect.height - extent.y) + canvas.glyphs(self._face, label, + canvas.Pt(rect.x + (rect.width - extent.x) / 2, top), + self.TYPE_SIZE, COLORS.WHITE) + + +RoadNameRenderer = RoadNameBanner +ellipsize = clip_to_width + +from dataclasses import dataclass, field + +_ARROW = 'signal' +_WARN = 'blind_spot' + + +@dataclass(frozen=True) +class TurnSignalConfig: + left_x: int = 80 + left_y: int = 190 + right_x: int = 80 + right_y: int = 190 + size: int = 150 + +class _IndicatorLamp(Widget): + def __init__(self, direction: IconSide): + super().__init__() + self.mode: str | None = None + self._epoch = 0.0 + self._glow = FirstOrderFilter(0.0, 0.3, 1 / gui_app.target_fps) + self._art = { + _ARROW: gui_app.texture(f'icons_mici/onroad/turn_signal_{direction}.png', 120, 109), + _WARN: gui_app.texture(f'icons_mici/onroad/blind_spot_{direction}.png', 120, 109), + } + + def set_mode(self, mode: str | None): + if mode != self.mode or mode is None: + self._epoch = 0.0 + self.mode = mode + + def _pulse(self) -> int: + self._glow.dt = 1 / gui_app.target_fps + self._glow.update_alpha(0.3) + if time.monotonic() - self._epoch > TURN_SIGNAL_BLINK_PERIOD: + self._epoch = time.monotonic() + self._glow.x = 255 * 2 + else: + self._glow.update(255 * 0.2) + return int(min(self._glow.x, 255)) + + def _render(self, _): + if self.mode is None: + return + alpha = self._pulse() if self.mode == _ARROW else 255 + tex = self._art[self.mode] + canvas.stamp(tex, self._rect.x + (self._rect.width - tex.width) / 2, + self._rect.y + (self._rect.height - tex.height) / 2, canvas.shade(255, 255, 255, alpha)) + + +def _lamp_modes(event_name: str, cs, remembered): + if event_name == 'preLaneChangeLeft': + return _ARROW, None, IconSide.left + if event_name == 'preLaneChangeRight': + return None, _ARROW, IconSide.right + if event_name == 'laneChange': + if remembered == IconSide.left: + return _ARROW, None, remembered + if remembered == IconSide.right: + return None, _ARROW, remembered + return None, None, remembered + if event_name == 'laneChangeBlocked': + side = IconSide.left if cs.leftBlinker else IconSide.right if cs.rightBlinker else remembered + if side == IconSide.left: + return _WARN, None, remembered + if side == IconSide.right: + return None, _WARN, remembered + return None, None, remembered + left = _WARN if cs.leftBlindspot else _ARROW if cs.leftBlinker else None + right = _WARN if cs.rightBlindspot else _ARROW if cs.rightBlinker else None + return left, right, None + + +class IQTurnSignalOverlay: + def __init__(self, config: TurnSignalConfig | None = None): + self._config = config or TurnSignalConfig() + self._lamps = {IconSide.left: _IndicatorLamp(IconSide.left), + IconSide.right: _IndicatorLamp(IconSide.right)} + self._remembered: IconSide | None = None + + def update(self): + sm = _feed() + alert = sm['selfdriveState'].alertType + event_name = alert.split('/')[0] if alert else '' + left, right, self._remembered = _lamp_modes(event_name, sm['carState'], self._remembered) + self._lamps[IconSide.left].set_mode(left) + self._lamps[IconSide.right].set_mode(right) + + def render(self, rect): + if not ui_state.turn_signals: + return + c = self._config + mid_x = rect.x + rect.width / 2 + spots = { + IconSide.left: canvas.Box(mid_x - c.left_x - c.size, rect.y + c.left_y, c.size, c.size), + IconSide.right: canvas.Box(mid_x + c.right_x, rect.y + c.right_y, c.size, c.size), + } + for side, lamp in self._lamps.items(): + if lamp.mode is not None: + lamp.render(spots[side]) + + @property + def config(self) -> TurnSignalConfig: + return self._config + + @config.setter + def config(self, new_config: TurnSignalConfig): + self._config = new_config + +_PROVIDER_TAGS = {0: "", 1: "NAV", 2: "MBX", 3: "VIS", 4: "OSM"} +_NAV_TEX_W, _NAV_TEX_H = 256, 128 +_NAV_BADGE_W = 160 +_NAV_FONT = 36 +_NAV_SHIFT = -260 + +class NavInfluenceRenderer(Widget): + def __init__(self): + super().__init__() + self.engaged = False + self.valid = False + self.provider = 0 + self.long_override = False + self._streak = 0 + self.font = gui_app.font(FontWeight.BOLD) + self._offscreen = rl.load_render_texture(_NAV_TEX_W, _NAV_TEX_H) + + def update(self): + sm = _feed() + if sm.updated["iqPlan"]: + nav = sm["iqPlan"].iqNavState.nav + self.engaged = nav.engaged + self.valid = nav.valid + self.provider = getattr(nav.provider, "raw", nav.provider) + if sm.updated["carControl"]: + self.long_override = sm["carControl"].cruiseControl.override + self._streak = self._streak + 1 if (self.engaged and self.valid) else 0 + + def _blinked_off(self) -> bool: + fps = gui_app.target_fps + return self.engaged and (self._streak % fps) < (fps / 2.5) + + def _bake(self, label: str): + extent = canvas.span(self.font, label, _NAV_FONT) + badge = canvas.Box((_NAV_TEX_W - _NAV_BADGE_W) // 2, (_NAV_TEX_H - extent.y - 10) // 2, + _NAV_BADGE_W, int(extent.y + 10)) + rl.begin_texture_mode(self._offscreen) + rl.clear_background(canvas.CLEAR) + canvas.panel(badge, 0.2, 10, COLORS.OVERRIDE if self.long_override else canvas.shade(0, 255, 0, 255)) + rl.rl_set_blend_factors(rl.RL_ZERO, rl.RL_ONE_MINUS_SRC_ALPHA, 0x8006) + rl.rl_set_blend_mode(rl.BLEND_CUSTOM) + canvas.glyphs(self.font, label, + canvas.Pt(badge.x + (badge.width - extent.x) / 2, badge.y + (badge.height - extent.y) / 2), + _NAV_FONT, canvas.WHITE) + rl.rl_set_blend_mode(rl.BLEND_ALPHA) + rl.end_texture_mode() + + def _render(self, rect): + if not self.valid or self._blinked_off(): + return + label = _PROVIDER_TAGS.get(int(self.provider), "NAV") + if not label: + return + self._bake(label) + ax = rect.x + rect.width / 2 + _NAV_SHIFT - _NAV_TEX_W / 2 + ay = (rect.height / 4 - 40) - _NAV_TEX_H / 2 + canvas.stamp_scaled(self._offscreen.texture, canvas.Box(0, 0, _NAV_TEX_W, -_NAV_TEX_H), + canvas.Box(ax, ay, _NAV_TEX_W, _NAV_TEX_H), canvas.Pt(0, 0), 0, canvas.WHITE) + +class ChevronOptions: + OFF = 0 + DISTANCE_ONLY = 1 + SPEED_ONLY = 2 + TTC_ONLY = 3 + ALL = 4 + +_CH_FONT = 40 +_CH_LINE = 50 +_CH_MARGIN = 20 +_CH_FADE_DOWN = 0.05 +_CH_FADE_UP = 0.1 +_CH_DEDUP = 3.0 + +def _gap_label(d_rel: float, _v_abs: float) -> str: + val = max(0.0, d_rel) + return f"{val:.0f} m" if ui_state.is_metric else f"{val * 3.28084:.0f} ft" + +def _pace_label(_d_rel: float, v_abs: float) -> str: + unit = "km/h" if ui_state.is_metric else "mph" + return f"{max(0.0, v_abs * _speed_scale()):.0f} {unit}" + +def _ttc_label(d_rel: float, _v_abs: float, v_ego: float) -> str: + ttc = (d_rel / v_ego) if (d_rel > 0 and v_ego > 0) else 0.0 + return f"{ttc:.1f} s" if 0 < ttc < 200 else "---" + +_CH_METRICS = ( + ((ChevronOptions.DISTANCE_ONLY, ChevronOptions.ALL), lambda d, va, ve: _gap_label(d, va)), + ((ChevronOptions.SPEED_ONLY, ChevronOptions.ALL), lambda d, va, ve: _pace_label(d, va)), + ((ChevronOptions.TTC_ONLY, ChevronOptions.ALL), _ttc_label), +) + +class ChevronMetrics: + def __init__(self): + self._alpha: float = 0.0 + self._font = gui_app.font(FontWeight.SEMI_BOLD) + + def update_alpha(self, has_lead: bool): + self._alpha = float(np.clip(self._alpha + (_CH_FADE_UP if has_lead else -_CH_FADE_DOWN), 0.0, 1.0)) + + def should_render(self) -> bool: + return ui_state.chevron_metrics != ChevronOptions.OFF and self._alpha > 0.0 + + @staticmethod + def _marker_size(d_rel: float) -> float: + return float(np.clip((25 * 30) / (d_rel / 3 + 30), 15.0, 30.0)) * 2.35 + + def _labels(self, d_rel: float, v_rel: float, v_ego: float) -> list[str]: + mode = ui_state.chevron_metrics + return [fn(d_rel, v_rel + v_ego, v_ego) for modes, fn in _CH_METRICS if mode in modes] + + def _top_y(self, anchor_y: float, size: float, n: int, rect) -> float: + y = anchor_y + size + 15 + block = n * _CH_LINE + floor = rect.y + rect.height - _CH_MARGIN + if y + block > floor: + y = max(rect.y + _CH_MARGIN, min(anchor_y, floor) - 15 - block) + return y + + def _stack(self, lines, cx: float, top: float, rect): + a = self._alpha + fg = canvas.shade(255, 255, 255, int(255 * a)) + shadow = canvas.shade(0, 0, 0, int(200 * a)) + floor = rect.y + rect.height - _CH_MARGIN + for i, line in enumerate(lines): + y = int(top + i * _CH_LINE) + if y + _CH_LINE > floor: + break + w = canvas.span(self._font, line, _CH_FONT).x + x = int(np.clip(cx - w / 2, rect.x + _CH_MARGIN, rect.x + rect.width - w - _CH_MARGIN)) + canvas.glyphs(self._font, line, canvas.Pt(x + 2, y + 2), _CH_FONT, shadow) + canvas.glyphs(self._font, line, canvas.Pt(x, y), _CH_FONT, fg) + + def _one_lead(self, lead, marker, v_ego: float, rect): + if not self.should_render() or marker.center is None: + return + lines = self._labels(lead.dRel, lead.vRel, v_ego) + if not lines: + return + self._stack(lines, marker.center[0], self._top_y(marker.center[1], self._marker_size(lead.dRel), len(lines), rect), rect) + + @staticmethod + def _active_leads(radar_state, markers): + tracked = [] + for lead, marker in zip((radar_state.leadOne, radar_state.leadTwo), markers, strict=False): + if lead and lead.status and marker.center is not None: + tracked.append((lead, marker)) + if len(tracked) == 2 and abs(tracked[0][0].dRel - tracked[1][0].dRel) <= _CH_DEDUP: + tracked.pop() + return tracked + + def draw_lead_status(self, sm, radar_state, rect, lead_vehicles): + present = [radar_state.leadOne, radar_state.leadTwo] + self.update_alpha(any(bool(x) and x.status for x in present)) + if not self.should_render(): + return + v_ego = sm['carState'].vEgo + for lead, marker in self._active_leads(radar_state, lead_vehicles): + self._one_lead(lead, marker, v_ego, rect) + +_TEAL = canvas.shade(0x0C, 0x94, 0x96, 0xFF) +_AMBER = canvas.shade(255, 188, 0, 255) +_GREEN = canvas.shade(0, 255, 0, 255) +_GREY = canvas.shade(145, 155, 149, 255) +_G = 9.81 +_BAR_FONT = 38 +_ANGLE_TYPES = (car.CarParams.SteerControlType.angle, car.CarParams.SteerControlType.curvatureDEPRECATED) + + +@dataclass +class Readout: + tag: str + value: str + unit: str = "" + color: object = field(default_factory=lambda: canvas.WHITE) + tag_text: str = "" + value_text: str = "" + unit_text: str = "" + tag_w: float = 0.0 + value_w: float = 0.0 + unit_w: float = 0.0 + span: float = 0.0 + + def size_up(self, font, px: int): + self.tag_text = f"{self.tag} " + self.value_text = self.value + self.unit_text = f" {self.unit}" if self.unit else "" + self.tag_w = canvas.span(font, self.tag_text, px, 0).x + self.value_w = canvas.span(font, self.value_text, px, 0).x + self.unit_w = canvas.span(font, self.unit_text, px, 0).x if self.unit else 0 + self.span = self.tag_w + self.value_w + self.unit_w + + @property + def total_width(self): + return self.span + + def measure(self, font, px): + self.size_up(font, px) + + +UiElement = Readout + +def _banded(magnitude, warn, crit, ok): + if magnitude > crit: + return canvas.RED + return _AMBER if magnitude > warn else ok + +def _closing(v_rel): + return _banded(-v_rel if v_rel < 0 else 0.0, 0.0, 4.4704, canvas.WHITE) + +def _following(d_rel): + if d_rel < 5: + return canvas.RED + return _AMBER if d_rel < 15 else canvas.WHITE + +def _steer_tint(sm): + if not sm['carControl'].latActive: + return canvas.WHITE + return _GREY if sm['carState'].steeringPressed else _TEAL + +def _angle_tint(sm, deg): + floor = _steer_tint(sm) if sm['carControl'].latActive else canvas.WHITE + return _banded(abs(deg), 90.0, 180.0, floor) + +def _yaw_offset(sm): + return sm['vehicleParameters'].angleOffsetAverageDeg if sm.valid['vehicleParameters'] else 0.0 + +def _bank(sm): + return sm['vehicleParameters'].roll if sm.valid['vehicleParameters'] else 0.0 + +def _units(is_metric): + return (CV.MS_TO_KPH, "km/h") if is_metric else (CV.MS_TO_MPH, "mph") + +def _fix(sm): + for svc in ('gpsLocationExternal', 'gpsLocation'): + if sm.valid[svc]: + return sm[svc], svc + return None, None + +def steering_angle(sm, is_metric): + deg = sm['carState'].steeringAngleDeg - _yaw_offset(sm) + return Readout("R.S.", f"{deg:.1f}°", color=_angle_tint(sm, deg)) + +def desired_steering_angle(sm, is_metric): + live = sm['carControl'].latActive + off = _yaw_offset(sm) + lat = sm['controlsState'].lateralControlState + if lat.which() == 'angleState': + want = lat.angleState.steeringAngleDesiredDeg - off + else: + want = sm['carControl'].actuators.steeringAngleDeg - off + seen = sm['carState'].steeringAngleDeg - off + tint = _banded(abs(seen), 90.0, 180.0, _TEAL) if live else canvas.WHITE + return Readout("D.S.", f"{want:.1f}°" if live else "-", color=tint) + +def desired_steering_pid(sm, is_metric): + live = sm['carControl'].latActive + off = _yaw_offset(sm) + want = sm['controlsState'].lateralControlState.pidState.steeringAngleDesiredDeg - off + seen = sm['carState'].steeringAngleDeg - off + tint = _banded(abs(seen), 90.0, 180.0, _TEAL) if live else canvas.WHITE + return Readout("D.S.", f"{want:.1f}°" if live else "-", color=tint) + +def actual_lat_accel(sm, is_metric): + a = sm['controlsState'].curvature * sm['carState'].vEgo ** 2 - _bank(sm) * _G + return Readout("A.L.A.", f"{a:.2f}", "m/s^2", _steer_tint(sm)) + +def desired_lat_accel(sm, is_metric): + live = sm['carControl'].latActive + a = sm['controlsState'].desiredCurvature * sm['carState'].vEgo ** 2 - _bank(sm) * _G + return Readout("D.L.A.", f"{a:.2f}" if live else "-", "m/s^2", _steer_tint(sm)) + +def a_ego(sm, is_metric): + return Readout("L.ACC.", f"{sm['carState'].aEgo:.1f}", "m/s^2") + +def lead_distance(sm, is_metric): + lead = sm['radarState'].leadOne + return Readout("REL DIST", "-", "m") if not lead.status else Readout("REL DIST", f"{lead.dRel:.0f}", "m", _following(lead.dRel)) + +def lead_rel_speed(sm, is_metric): + lead = sm['radarState'].leadOne + k, unit = _units(is_metric) + return Readout("REL SPEED", "-", unit) if not lead.status else Readout("REL SPEED", f"{lead.vRel * k:.0f}", unit, _closing(lead.vRel)) + +def lead_speed(sm, is_metric): + lead = sm['radarState'].leadOne + k, unit = _units(is_metric) + if not lead.status: + return Readout("L.S.", "-", unit) + return Readout("L.S.", f"{(lead.vRel + sm['carState'].vEgo) * k:.0f}", unit, _closing(lead.vRel)) + +def friction_coefficient(sm, is_metric): + ltp = sm['lateralTorqueParameters'] + return Readout("FRIC.", f"{ltp.frictionCoefficientFiltered:.3f}", color=_GREEN if ltp.valid else canvas.WHITE) + +def lat_accel_factor(sm, is_metric): + ltp = sm['lateralTorqueParameters'] + return Readout("L.A.F.", f"{ltp.latAccelFactorFiltered:.3f}", color=_GREEN if ltp.valid else canvas.WHITE) + +def eps_torque(sm, is_metric): + return Readout("E.T.", f"{abs(sm['carState'].steeringTorqueEps):.1f}", "N·dm") + +_COMPASS = ("N", "NE", "E", "SE", "S", "SW", "W", "NW") + +def bearing(sm, is_metric): + fix, _ = _fix(sm) + if fix is None or fix.bearingAccuracyDeg == 180.0: + return Readout("B.D.", "OFF | -") + heading = _COMPASS[int(((fix.bearingDeg + 22.5) % 360) // 45)] + return Readout("B.D.", f"{heading} | {fix.bearingDeg:.0f}°") + +def altitude(sm, is_metric): + fix, svc = _fix(sm) + if fix is None: + return Readout("ALT.", "-", "m") + acc = fix.horizontalAccuracy if svc == 'gpsLocationExternal' else 1.0 + return Readout("ALT.", f"{fix.altitude:.1f}" if acc != 0.0 else "-", "m") + +def _desired_probe(sm): + if sm['controlsState'].lateralControlState.which() == 'angleState': + return desired_steering_angle + if ui_state.CP is not None and ui_state.CP.steerControlType in _ANGLE_TYPES: + return desired_steering_angle + if sm['controlsState'].lateralControlState.which() == 'pidState': + return desired_steering_pid + return desired_lat_accel + +class IQDevMetricsOverlay(Widget): + DEV_UI_OFF = 0 + DEV_UI_RIGHT = 1 + DEV_UI_BOTTOM = 2 + DEV_UI_BOTH = 3 + BOTTOM_BAR_HEIGHT = 61 + + def __init__(self): + super().__init__() + self._face = gui_app.font(FontWeight.BOLD) + self.dev_ui_mode = self.DEV_UI_OFF + + @staticmethod + def get_bottom_dev_ui_offset(): + return IQDevMetricsOverlay.BOTTOM_BAR_HEIGHT if ui_state.developer_ui != IQDevMetricsOverlay.DEV_UI_OFF else 0 + + def _update_state(self) -> None: + self.dev_ui_mode = ui_state.developer_ui + + def _render(self, rect) -> None: + if self.dev_ui_mode == self.DEV_UI_OFF: + return + sm = ui_state.sm + if sm.recv_frame["carState"] < ui_state.started_frame: + return + self._paint_bar(rect) + + def _gather(self, sm): + probes = (_desired_probe(sm), actual_lat_accel, steering_angle, a_ego, lead_speed) + cells = [probe(sm, ui_state.is_metric) for probe in probes] + for cell in cells: + cell.size_up(self._face, _BAR_FONT) + return cells + + def _paint_bar(self, rect) -> None: + height = self.BOTTOM_BAR_HEIGHT + top = int(rect.y + rect.height - height) + canvas.slab(rect.x, top, rect.width, height, canvas.shade(0, 0, 0, 100)) + + cells = self._gather(ui_state.sm) + slack = (rect.width - sum(c.span for c in cells)) / (len(cells) + 1) + baseline = top + height // 2 - _BAR_FONT // 2 + + cursor = rect.x + slack + for cell in cells: + self._paint_cell(cursor, baseline, cell) + cursor += cell.span + slack + + def _paint_cell(self, x, y, cell) -> None: + canvas.glyphs(self._face, cell.tag_text, canvas.Pt(x, y), _BAR_FONT, canvas.WHITE) + canvas.glyphs(self._face, cell.value_text, canvas.Pt(x + cell.tag_w, y), _BAR_FONT, cell.color) + if cell.unit: + canvas.glyphs(self._face, cell.unit_text, canvas.Pt(x + cell.tag_w + cell.value_w, y), _BAR_FONT, canvas.WHITE) + +_SL_M_TO_FT = 3.28084 +_SL_M_TO_MI = 0.000621371 +_SL_AHEAD_STEPS = 5 +_SL_ASSIST = custom.IQPlan.SpeedLimit.AssistState +_SL_SOURCE = custom.IQPlan.SpeedLimit.Source +_SL_GREY = canvas.shade(145, 155, 149, 255) +_SL_DARK = canvas.shade(77, 77, 77, 255) +_SL_PANEL_BG = canvas.shade(0, 0, 0, 180) +_SL_PANEL_EDGE = canvas.shade(255, 255, 255, 100) + +def _dim(color, alpha: float): + return canvas.with_opacity(color, 255 * alpha) + +class IQSpeedLimitOverlay(Widget): + def __init__(self): + super().__init__() + self.speed_limit = 0.0 + self.speed_limit_last = 0.0 + self.speed_limit_offset = 0.0 + self.speed_limit_valid = False + self.speed_limit_last_valid = False + self.speed_limit_final_last = 0.0 + self.speed_limit_source = _SL_SOURCE.none + self.assist_state = _SL_ASSIST.disabled + + self.ahead_limit = 0.0 + self.ahead_dist = 0.0 + self._ahead_prev = 0.0 + self.ahead_valid = False + self._ahead_streak = 0 + + self.assist_frame = 0 + self.speed = 0.0 + self.set_speed = 0.0 + + self._bold = gui_app.font(FontWeight.BOLD) + self._demi = gui_app.font(FontWeight.SEMI_BOLD) + self._norm = gui_app.font(FontWeight.NORMAL) + self._pulse_ema = FirstOrderFilter(1.0, 0.5, 1 / gui_app.target_fps) + + px = 90 + self._up = gui_app.texture("img_plus_arrow_up.png", px, px) + self._down = gui_app.texture("img_minus_arrow_down.png", px, px) + + @property + def speed_limit_assist_state(self): + return self.assist_state + + @property + def _scale(self): + return CV.MS_TO_KPH if ui_state.is_metric else CV.MS_TO_MPH + + def _take_plan(self, lp_iq): + k = self._scale + r = lp_iq.speedLimit.resolver + self.speed_limit = r.speedLimit * k + self.speed_limit_last = r.speedLimitLast * k + self.speed_limit_offset = r.speedLimitOffset * k + self.speed_limit_valid = r.speedLimitValid + self.speed_limit_last_valid = r.speedLimitLastValid + self.speed_limit_final_last = r.speedLimitFinalLast * k + self.speed_limit_source = r.source + self.assist_state = lp_iq.speedLimit.assist.state + + def _take_ahead(self, lmd): + self.ahead_valid = lmd.speedLimitAheadValid + self.ahead_limit = lmd.speedLimitAhead * self._scale + self.ahead_dist = lmd.speedLimitAheadDistance + if self.ahead_dist < self._ahead_prev: + self._ahead_streak = min(_SL_AHEAD_STEPS, self._ahead_streak + 1) + elif self.ahead_dist > self._ahead_prev: + self._ahead_streak = max(0, self._ahead_streak - 1) + self._ahead_prev = self.ahead_dist + + def update(self): + sm = _feed() + if sm.recv_frame["carState"] < ui_state.started_frame: + return + if sm.updated["iqPlan"]: + self._take_plan(sm["iqPlan"]) + if sm.updated["iqLiveData"]: + self._take_ahead(sm["iqLiveData"]) + cs = sm["carState"] + self.set_speed = cs.cruiseState.speed * self._scale + v_ego = cs.vEgoCluster if cs.vEgoCluster != 0.0 else cs.vEgo + self.speed = max(0.0, v_ego * self._scale) + + def _spec(self): + has_limit = self.speed_limit_valid or self.speed_limit_last_valid + value = str(round(self.speed_limit_last)) if has_limit else "---" + badge = "" + if self.speed_limit_offset != 0: + badge = f"{'' if self.speed_limit_offset > 0 else '-'}{round(abs(self.speed_limit_offset))}" + warn = ui_state.speed_limit_mode >= 2 + over = has_limit and round(self.speed_limit_final_last) < round(self.speed) + tint = canvas.RED if (warn and over) else (_SL_GREY if not self.speed_limit_valid else canvas.BLACK) + return value, badge, tint, has_limit + + def _render(self, rect): + if ui_state.speed_limit_mode == 0: + return + w = UI_CONFIG.set_speed_width_metric if ui_state.is_metric else UI_CONFIG.set_speed_width_imperial + sign = canvas.Box(rect.x + 60 - 6, rect.y + 45 + UI_CONFIG.set_speed_height + 12, w + 12, 160) + if self.assist_state == _SL_ASSIST.preActive: + self.assist_frame += 1 + pulse = 0.65 + 0.35 * math.sin(self.assist_frame * math.pi / gui_app.target_fps) + self._sign(sign, self._pulse_ema.update(pulse)) + self._nudge_arrow(sign) + else: + self.assist_frame = 0 + self._pulse_ema.update(1.0) + self._sign(sign) + self._ahead(sign) + + def _sign(self, rect, alpha=1.0): + value, badge, tint, has_limit = self._spec() + (self._vienna if ui_state.is_metric else self._mutcd)(rect, value, badge, tint, has_limit, alpha) + + def _nudge_arrow(self, sign): + delta = round(self.speed_limit_final_last) - round(self.set_speed) + if delta == 0: + return + arrow = self._up if delta > 0 else self._down + bounce = int(20 * math.sin(self.assist_frame * 2.0 * math.pi / (gui_app.target_fps * 2.5))) + x = sign.x + (sign.width - arrow.width) / 2 + y = sign.y + (sign.height - arrow.height) / 2 + (bounce if delta > 0 else -bounce) + canvas.stamp(arrow, x, y, canvas.WHITE) + + def _vienna(self, rect, value, badge, tint, has_limit, alpha=1.0): + hub = canvas.Pt(rect.x + rect.width / 2, rect.y + rect.height / 2) + radius = (rect.width + 18) / 2 + canvas.disc_at(hub, radius, _dim(canvas.WHITE, alpha)) + canvas.annulus(hub, radius * 0.80, radius, 0, 360, 36, _dim(canvas.RED, alpha)) + canvas.glyphs_centered(self._bold, value, 70 if len(value) >= 3 else 85, hub, _dim(tint, alpha)) + if badge and has_limit: + br = radius * 0.4 + bc = canvas.Pt(rect.x + rect.width - br / 2, rect.y + br / 2) + canvas.disc_at(bc, br, _dim(canvas.BLACK, alpha)) + canvas.annulus(bc, br - 3, br, 0, 360, 36, _dim(_SL_DARK, alpha)) + canvas.glyphs_centered(self._bold, badge, int(br * 2 * (0.5 if len(badge) < 3 else 0.45)), bc, _dim(canvas.WHITE, alpha)) + + def _mutcd(self, rect, value, badge, tint, has_limit, alpha=1.0): + canvas.panel(rect, 0.35, 10, _dim(canvas.WHITE, alpha)) + inner = canvas.Box(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20) + canvas.panel_outline(inner, 0.35, 10, 4, _dim(canvas.BLACK, alpha)) + mid = rect.x + rect.width / 2 + canvas.glyphs_centered(self._demi, "SPEED", 40, canvas.Pt(mid, rect.y + 40), _dim(canvas.BLACK, alpha)) + canvas.glyphs_centered(self._demi, "LIMIT", 40, canvas.Pt(mid, rect.y + 80), _dim(canvas.BLACK, alpha)) + canvas.glyphs_centered(self._bold, value, 90, canvas.Pt(mid, rect.y + 150), _dim(tint, alpha)) + if badge and has_limit: + side = rect.width * 0.3 + overlap = side * 0.2 + chip = canvas.Box(rect.x + rect.width - side / 1.5 + overlap, rect.y - side / 1.25 + overlap, side, side) + canvas.panel(chip, 0.35, 10, _dim(canvas.BLACK, alpha)) + canvas.panel_outline(chip, 0.35, 10, 6, _dim(_SL_DARK, alpha)) + canvas.glyphs_centered(self._bold, badge, int(side * (0.6 if len(badge) < 3 else 0.475)), + canvas.Pt(chip.x + side / 2, chip.y + side / 2), _dim(canvas.WHITE, alpha)) + + def _ahead(self, sign): + if not (self.ahead_valid and self.ahead_limit > 0 and self.ahead_limit != self.speed_limit_last and self._ahead_streak > 0): + return + panel = canvas.Box(sign.x + (sign.width - 170) / 2, sign.y + sign.height + 10, 170, 160) + canvas.panel(panel, 0.35, 10, _SL_PANEL_BG) + canvas.panel_outline(panel, 0.35, 10, 3, _SL_PANEL_EDGE) + mid = panel.x + panel.width / 2 + canvas.glyphs_centered(self._demi, "AHEAD", 40, canvas.Pt(mid, panel.y + 28), _SL_GREY) + canvas.glyphs_centered(self._bold, str(round(self.ahead_limit)), 70, canvas.Pt(mid, panel.y + 82), canvas.WHITE) + canvas.glyphs_centered(self._norm, self._dist(self.ahead_dist), 36, canvas.Pt(mid, panel.y + 134), _SL_GREY) + + @staticmethod + def _dist(d): + if ui_state.is_metric: + if d < 50: + return tr("Near") + if d >= 1000: + return f"{d / 1000:.1f} km" + return f"{int(round(d, -1) if d < 200 else round(d, -2))} m" + ft = d * _SL_M_TO_FT + if ft < 100: + return tr("Near") + if ft >= 900: + return f"{d * _SL_M_TO_MI:.1f} mi" + step = 50 if ft < 500 else 100 + return f"{int(round(ft / step) * step)} ft" diff --git a/iqpilot/ui/onroad/hud_renderer.py b/iqpilot/ui/onroad/hud_renderer.py new file mode 100644 index 000000000..c4c6d9b76 --- /dev/null +++ b/iqpilot/ui/onroad/hud_renderer.py @@ -0,0 +1,90 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import pyray as rl + +from iqpilot.selfdrive.ui.mici.onroad.torque_bar import TorqueBar +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.ui.onroad.hud_renderer import HudRenderer +from iqpilot.ui.onroad.hud_overlays import ( + IQDevMetricsOverlay, + RoadNameRenderer, + IQAccelBar, + IQSpeedLimitOverlay, + IQTurnSignalOverlay, + IQSpeedOverlay, +) +from iqpilot.ui.onroad.nav_map_panel import NavMapPanel +from iqpilot.ui.onroad.soft_warning import SoftWarningRenderer +from iqpilot.ui.onroad.emac_status import EmacStatusRenderer + +ENABLE_FLOATING_NAV_MAP_PANEL = False +ENABLE_SPLIT_NAV_MAP_PANEL = True + + +class IQHudRenderer(HudRenderer): + def __init__(self): + super().__init__() + self.developer_ui = IQDevMetricsOverlay() + self.emac_status = EmacStatusRenderer() + self.nav_map_panel = NavMapPanel() + self.road_name_renderer = RoadNameRenderer() + self.rocket_fuel = IQAccelBar() + self.speed_limit_renderer = IQSpeedLimitOverlay() + self.turn_signal_controller = IQTurnSignalOverlay() + self.speed_renderer = IQSpeedOverlay() + self.soft_warning_renderer = SoftWarningRenderer() + self._torque_bar = TorqueBar(scale=3.0, always=True) + + def _update_state(self) -> None: + super()._update_state() + if ENABLE_FLOATING_NAV_MAP_PANEL or ENABLE_SPLIT_NAV_MAP_PANEL: + self.nav_map_panel.update() + self.emac_status.update() + self.road_name_renderer.update() + self.speed_limit_renderer.update() + has_limit = self.speed_limit_renderer.speed_limit_valid or self.speed_limit_renderer.speed_limit_last_valid + self.limit_available = has_limit + self.limit_speed_text = str(round(self.speed_limit_renderer.speed_limit_last)) if has_limit else "---" + offset = round(self.speed_limit_renderer.speed_limit_offset) + self.limit_offset_text = f"{offset:+d}" if has_limit and offset != 0 else "" + self.turn_signal_controller.update() + self.speed_renderer.update() + self.soft_warning_renderer.update() + + def _draw_current_speed(self, rect: rl.Rectangle) -> None: + self.speed_renderer.render(rect) + + def _render(self, rect: rl.Rectangle) -> None: + super()._render(rect) + + torque_rect = rect + if ui_state.developer_ui in (IQDevMetricsOverlay.DEV_UI_BOTTOM, IQDevMetricsOverlay.DEV_UI_BOTH): + torque_rect = rl.Rectangle(rect.x, rect.y, rect.width, rect.height - IQDevMetricsOverlay.BOTTOM_BAR_HEIGHT) + if ui_state.torque_bar: + self._torque_bar.render(torque_rect) + + if not self.split_nav_enabled(): + self.developer_ui.render(rect) + if ENABLE_FLOATING_NAV_MAP_PANEL: + self.nav_map_panel.render(rect) + self.emac_status.render(rect) + self.road_name_renderer.render(torque_rect) + self.turn_signal_controller.render(rect) + self.soft_warning_renderer.render(rect) + self.rocket_fuel.render(rect, ui_state.sm) + + def split_nav_enabled(self) -> bool: + if not ENABLE_SPLIT_NAV_MAP_PANEL: + return False + if hasattr(self.nav_map_panel, "maps_enabled"): + return bool(self.nav_map_panel.maps_enabled()) + return bool(getattr(self.nav_map_panel, "_maps_enabled", False)) + + def render_split_nav(self, rect: rl.Rectangle) -> None: + if self.split_nav_enabled(): + self.nav_map_panel.render_split(rect) + + def render_full_width_overlays(self, rect: rl.Rectangle) -> None: + if self.split_nav_enabled(): + self.developer_ui.render(rect) diff --git a/iqpilot/ui/onroad/lead_confidence.py b/iqpilot/ui/onroad/lead_confidence.py new file mode 100644 index 000000000..d5035fa9c --- /dev/null +++ b/iqpilot/ui/onroad/lead_confidence.py @@ -0,0 +1,70 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import pyray as rl +from iqpilot.common.filter_simple import FirstOrderFilter +from iqpilot.selfdrive.ui.ui_state import ui_state, UIStatus +from iqpilot.system.ui.lib.application import gui_app + +ACTIVE_TOP = rl.Color(0x22, 0xB8, 0xB9, 255) +ACTIVE_BOTTOM = rl.Color(0x0C, 0x94, 0x96, 255) +MEDIUM_TOP = rl.Color(255, 200, 0, 255) +MEDIUM_BOTTOM = rl.Color(255, 115, 0, 255) +LOW_TOP = rl.Color(255, 0, 21, 255) +LOW_BOTTOM = rl.Color(255, 0, 89, 255) +OVERRIDE_TOP = rl.Color(255, 255, 255, 255) +OVERRIDE_BOTTOM = rl.Color(82, 82, 82, 255) +IDLE_TOP = rl.Color(120, 120, 120, 255) +IDLE_BOTTOM = rl.Color(60, 60, 60, 255) + + +def _zone_colors(confidence: float) -> tuple[rl.Color, rl.Color]: + if confidence > 0.5: + return ACTIVE_TOP, ACTIVE_BOTTOM + if confidence > 0.2: + return MEDIUM_TOP, MEDIUM_BOTTOM + return LOW_TOP, LOW_BOTTOM + + +class DrivingConfidence: + def __init__(self): + self._filter = FirstOrderFilter(-0.5, 0.5, 1 / gui_app.target_fps) + self._last_frame = -1 + + def update(self) -> None: + frame = ui_state.sm.frame + if frame == self._last_frame: + return + self._last_frame = frame + try: + predictions = ui_state.sm['modelV2'].meta.disengagePredictions + except Exception: + return + + if ui_state.status == UIStatus.DISENGAGED: + value = -0.5 + elif ui_state.status == UIStatus.LAT_ONLY: + value = 1 - max(predictions.steerOverrideProbs or [1]) + elif ui_state.status == UIStatus.LONG_ONLY: + value = 1 - max(predictions.brakeDisengageProbs or [1]) + else: + value = (1 - max(predictions.brakeDisengageProbs or [1])) * (1 - max(predictions.steerOverrideProbs or [1])) + + self._filter.update(value) + + @property + def value(self) -> float: + return self._filter.x + + def colors(self, demo: bool = False) -> tuple[rl.Color, rl.Color]: + confidence = self._filter.x + if ui_state.status == UIStatus.ENGAGED or demo: + return _zone_colors(confidence) + if ui_state.status in (UIStatus.LAT_ONLY, UIStatus.LONG_ONLY): + return _zone_colors(confidence) + if ui_state.status == UIStatus.OVERRIDE: + return OVERRIDE_TOP, OVERRIDE_BOTTOM + return IDLE_TOP, IDLE_BOTTOM + + +driving_confidence = DrivingConfidence() diff --git a/iqpilot/ui/onroad/nav_map_panel.py b/iqpilot/ui/onroad/nav_map_panel.py new file mode 100644 index 000000000..1e44aea0b --- /dev/null +++ b/iqpilot/ui/onroad/nav_map_panel.py @@ -0,0 +1,1800 @@ +import os +import math +import threading +import time +from typing import Any +from pathlib import Path + +try: + import sqlite3 +except Exception: + sqlite3 = None # type: ignore[assignment] + +import pyray as rl +import requests + +from iqpilot.common.basedir import BASEDIR +from iqpilot.common.iq_perf import PerfSample, PerfTraceEmitter +from iqpilot.common.params import Params, UnknownKeyName +from iqpilot.selfdrive.ui.lib.nav_helpers import current_or_last_gps_position, resolve_mapbox_token +from iqpilot.selfdrive.ui.lib.local_routes import utc_offset_hours +from iqpilot.ui.onroad.offline_tiles import ( + find_offline_mbtiles_path, + find_offline_xyz_root, + load_raster_tile_blob, + load_raster_xyz_tile_blob, + mbtiles_is_raster, + mbtiles_zoom_bounds, + open_mbtiles, + xyz_zoom_bounds, +) +from iqpilot.ui.onroad.nav_map_utils import ( + build_mapbox_tile_url, + choose_nav_camera, + mercator_world_px_at_zoom, + project_nav_point, + project_nav_polyline, + solar_elevation_deg, +) +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.system.ui.lib.application import gui_app, FontWeight +from iqpilot.system.ui.lib.text_measure import measure_text_cached +from iqpilot.system.ui.lib.wrap_text import wrap_text +from iqpilot.system.ui.widgets import Widget + +PANEL_WIDTH = 560 +PANEL_HEIGHT = 600 +PANEL_MARGIN_RIGHT = 28 +PANEL_MARGIN_TOP = 92 +CARD_RADIUS = 0.055 +MAP_HEIGHT = 392 +SPLIT_HEADER_HEIGHT = 160 +SPLIT_FOOTER_HEIGHT = 112 +# parents[4] pointed one level above the repo (stock selfdrive/assets has no nav icons), +# so the maneuver arrow never loaded anywhere — anchor to BASEDIR instead +ICON_ASSET_DIR = Path(BASEDIR) / "iqpilot" / "iqpilot" / "selfdrive" / "assets" / "navigation" +STAT_GAP = 10 +TILE_SIZE = 256 +# env-overridable GPU-texture footprint levers; CACHE_LIMIT must stay >= the keep-set (~(visible + 2*margin)^2) +TILE_SCALE = int(os.getenv("IQPILOT_NAV_TILE_SCALE", "2")) +# Downscale each decoded tile before uploading to the GPU. Mapbox only serves integer-retina +# tiles (@2x = 512px), which cost ~1MB of dmabuf each; the resident cache of these is the bulk +# of the map's memory floor. Resizing the crisp @2x source down to TILE_SIZE*this (1.75 -> 448px, +# ~768KB) reclaims GPU memory while staying sharper than a native @1x (256px) fetch would be. +# Only ever downsamples — sources already at/under the target (e.g. native 256px offline tiles) +# are left untouched. Set to TILE_SCALE to keep full @2x resolution. +TILE_TEXTURE_SCALE = float(os.getenv("IQPILOT_NAV_TILE_TEXTURE_SCALE", "1.75")) +MAX_INFLIGHT_TILES = 8 +CAMERA_SMOOTHING = 0.18 +# The onroad corner panel is immediate-mode redrawn (rounded rects + every glyph + tile blits) +# every UI frame at 20Hz, which measured at ~52% of a CPU core on a comma 3x and starved radard. +# Cache the whole panel in a persistent RenderTexture and only re-render it a few times a second; +# every frame just blits the cached texture. A corner map panning at 12Hz is visually seamless. +PANEL_RENDER_FPS = max(1, int(os.getenv("IQPILOT_NAV_PANEL_FPS", "12"))) +PANEL_RENDER_INTERVAL = 1.0 / PANEL_RENDER_FPS +# The drop-shadow is drawn a few px past the panel bounds; pad the render target so it isn't clipped. +PANEL_SHADOW_PAD = 16 +# Chrome (badge + info-panel text/chips) only changes when nav values change, so it's cached in its +# own texture regenerated on a content-key change. This cap forces a refresh at least every 0.5s so a +# missed key field can never freeze the readout. +CHROME_MAX_INTERVAL = 0.5 +CACHE_MARGIN_TILES = int(os.getenv("IQPILOT_NAV_CACHE_MARGIN", "2")) +CACHE_LIMIT = int(os.getenv("IQPILOT_NAV_CACHE_LIMIT", "96")) +# The corner panel's viewport (560x392) keeps ~(3+2*margin)x(2+2*margin) = 42 tiles on +# screen+margin; 96 was sized for the full-screen interactive map and doubles the panel's +# resident GPU footprint for tiles that can never be drawn. +PANEL_CACHE_LIMIT = int(os.getenv("IQPILOT_NAV_PANEL_CACHE_LIMIT", "48")) +# How long mapbox must stay healthy before the offline fallback's tile cache is freed. +OFFLINE_RELEASE_AFTER_S = 60.0 +PARAMS_REFRESH_S = 0.5 +MAP_PROVIDER_UPDATE_S = 0.25 +# Offline decode now runs off the render thread (worker pattern, same as mapbox), so when +# offline is the engaged provider it updates at the same cadence as the online one. +OFFLINE_PROVIDER_UPDATE_S = MAP_PROVIDER_UPDATE_S +ROUTE_PROJECTION_UPDATE_S = 0.15 +TILE_CACHE_ROOT = Path( + os.getenv( + "IQPILOT_NAV_TILE_CACHE", + "/data/iqpilot_nav_tiles" if Path("/data").exists() else "/tmp/iqpilot_nav_tiles", + ) +) +MAPBOX_PROVIDER_DISABLED = os.getenv("IQPILOT_DISABLE_MAPBOX_PROVIDER", "0") == "1" +MAPBOX_CACHE_DISABLED = os.getenv("IQPILOT_DISABLE_MAPBOX_CACHE", "0") == "1" +SQLITE_ERRORS = (sqlite3.Error,) if sqlite3 is not None else (Exception,) +NAV_TEXTURE_WARN_US = 20_000 +NAV_TILE_OP_WARN_US = 10_000 +NAV_PRUNE_WARN_US = 10_000 +NAV_BURST_WARN_TILES = 4 +NAV_PERF = PerfTraceEmitter("ui.nav") + + +def _downscale_tile_image(image) -> None: + """Shrink a decoded tile image in place to the configured texture footprint. + + Downsample-only: leaves images already at/under the target size alone so native low-DPI + (e.g. 256px offline) tiles are never upscaled. The resize is a CPU (stb) bicubic pass, so + it must run OFF the render thread (in the fetch worker) — doing it inline in _consume_pending + stalled the UI loop for several ms per tile and caused visible map lag on tile bursts.""" + target = int(round(TILE_SIZE * TILE_TEXTURE_SCALE)) + if target > 0 and image.width > target: + rl.image_resize(image, target, target) + + +def _decode_tile_image(payload: bytes): + """Decode a raw tile payload to an rl.Image and downscale it, on the calling thread. + + Pure CPU (stb) work — no GL context needed — so it is safe to run from a fetch worker + thread. The returned Image is uploaded to a GPU texture later on the render thread. + + Raises ValueError on undecodable payloads: stb returns a 0x0 image instead of failing + (e.g. webp, which stb can't read), and uploading that produces an invisible texture the + cache then counts as content — the map draws blank while the badge claims tiles.""" + image = rl.load_image_from_memory(MapboxTileProvider._image_ext(payload), payload, len(payload)) + if image.width <= 0 or image.height <= 0: + rl.unload_image(image) + raise ValueError("undecodable tile payload") + _downscale_tile_image(image) + # pooled textures are refilled in place; contents must be RGBA8 regardless of source format + rl.image_format(image, rl.PixelFormat.PIXELFORMAT_UNCOMPRESSED_R8G8B8A8) + return image + + +def _emit_nav_perf(event_class: str, *, frame_id: int = 0, total_time_us: int = 0, + batch_size: int = 0, severity: str = "warning", detail: str = "", + sample: PerfSample | None = None, min_interval_s: float = 0.5) -> None: + NAV_PERF.emit( + event_class, + severity=severity, + frame_id=frame_id, + total_time_us=total_time_us, + batch_size=batch_size, + samples=[sample] if sample is not None else None, + detail=detail, + min_interval_s=min_interval_s, + ) + + +class TexturePool: + """Recycles GL texture objects between tiles of identical size/format. + + Creating/destroying thousands of texture objects per drive ratchets the GL + driver's CPU-side pools (measured: hundreds of MB of driver-owned anon memory + on both Adreno and Mac). Refilling an existing texture via rl.update_texture + allocates nothing at steady state. Render thread only.""" + + def __init__(self, max_free: int): + self._max_free = max_free + self._free: dict[tuple[int, int], list[Any]] = {} + + def acquire(self, image) -> Any: + bucket = self._free.get((image.width, image.height)) + if bucket: + texture = bucket.pop() + rl.update_texture(texture, image.data) + return texture + texture = rl.load_texture_from_image(image) + rl.set_texture_filter(texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + rl.set_texture_wrap(texture, rl.TextureWrap.TEXTURE_WRAP_CLAMP) + return texture + + def release(self, texture) -> None: + bucket = self._free.setdefault((texture.width, texture.height), []) + if len(bucket) < self._max_free: + bucket.append(texture) + else: + rl.unload_texture(texture) + + def drain(self) -> None: + for bucket in self._free.values(): + for texture in bucket: + rl.unload_texture(texture) + self._free.clear() + + +class MapboxTileProvider: + def __init__(self, cache_limit: int = CACHE_LIMIT): + self._cache_limit = cache_limit + self._pool = TexturePool(cache_limit) + self._params = Params() + self._session = requests.Session() + # Decoded, downscaled rl.Images ready for GPU upload. Decoding + resizing happens off the + # render thread (fetch worker) and is drained by _consume_pending, which only uploads. + self._pending_tiles: dict[tuple[int, int, int], Any] = {} + self._inflight: set[tuple[int, int, int]] = set() + self._textures: dict[tuple[int, int, int], rl.Texture] = {} + self._lock = threading.Lock() + self._status = "idle" + self._viewport_complete = False + self._cache_root = TILE_CACHE_ROOT + self._cache_root.mkdir(parents=True, exist_ok=True) + self._provider_disabled = MAPBOX_PROVIDER_DISABLED + self._cache_disabled = MAPBOX_CACHE_DISABLED + self._day_mode = False + self._style = "navigation-night-v1" + self._rotated = False + self._keep_margin = CACHE_MARGIN_TILES + + def set_day_mode(self, day: bool) -> None: + """Switch between the day/night Mapbox styles. Frees the tile cache on a change — + the resident textures are the wrong palette. Render-thread only (release touches GL).""" + if day == self._day_mode: + return + self._day_mode = day + self._style = "navigation-day-v1" if day else "navigation-night-v1" + self.release() + + def _token(self) -> str: + return resolve_mapbox_token(self._params) + + def _fetch_worker(self, tile_key: tuple[int, int, int], token: str) -> None: + z, x, y = tile_key + url = build_mapbox_tile_url(z, x, y, tile_size=TILE_SIZE, scale=TILE_SCALE, style=self._style) + try: + response = self._session.get(url, params={"access_token": token}, timeout=1.5) + fallback_style = "light-v11" if self._day_mode else "dark-v11" + if response.status_code == 401 and self._style != fallback_style: + # some tokens can't access the navigation styles ("Direct access not allowed") + self._style = fallback_style + url = build_mapbox_tile_url(z, x, y, tile_size=TILE_SIZE, scale=TILE_SCALE, style=self._style) + response = self._session.get(url, params={"access_token": token}, timeout=3.0) + response.raise_for_status() + if not self._cache_disabled: + cache_path = self._cache_path(tile_key) + cache_path.parent.mkdir(parents=True, exist_ok=True) + cache_path.write_bytes(response.content) + # Decode + downscale here on the worker thread (pure CPU/stb, no GL), so the render + # thread only pays the cheap GPU upload in _consume_pending. + self._stash_pending(tile_key, _decode_tile_image(response.content)) + self._status = "ready" + except (requests.RequestException, ValueError): + if not self._queue_cached_tile(tile_key, inline=True): + self._status = "error" + finally: + self._inflight.discard(tile_key) + + def _cache_path(self, tile_key: tuple[int, int, int]) -> Path: + z, x, y = tile_key + # style-keyed: day and night tiles must never mix in the disk cache + return self._cache_root / self._style / str(z) / str(x) / f"{y}@{TILE_SCALE}x.png" + + def _queue_cached_tile(self, tile_key: tuple[int, int, int], inline: bool = False) -> bool: + if self._cache_disabled: + return False + if tile_key in self._textures or tile_key in self._pending_tiles: + return True + # The render-thread path defers when the tile is already being fetched/decoded; the inline + # (network-error fallback) path owns its own _inflight entry, so it must not short-circuit here. + if not inline and tile_key in self._inflight: + return True + + cache_path = self._cache_path(tile_key) + if not cache_path.exists(): + return False + + if inline: + # Already on a worker thread (network-error fallback) — decode here directly. + try: + payload = cache_path.read_bytes() + self._stash_pending(tile_key, _decode_tile_image(payload)) + except (OSError, ValueError): + return False + self._status = "offline_cache" + return True + + # Called from the render thread: offload the disk read + decode + resize to a worker so the + # UI loop never stalls, even when a whole screen of tiles is served from cache. Bounded by + # MAX_INFLIGHT (shared with network fetches); over the cap we defer to a later frame. + if len(self._inflight) >= MAX_INFLIGHT_TILES: + return True + self._inflight.add(tile_key) + self._status = "offline_cache" + threading.Thread(target=self._cache_decode_worker, args=(tile_key, cache_path), daemon=True).start() + return True + + def _cache_decode_worker(self, tile_key: tuple[int, int, int], cache_path: Path) -> None: + try: + payload = cache_path.read_bytes() + self._stash_pending(tile_key, _decode_tile_image(payload)) + except (OSError, ValueError): + pass + finally: + self._inflight.discard(tile_key) + + def _stash_pending(self, tile_key: tuple[int, int, int], image) -> None: + """Store a decoded tile Image for upload, unloading any Image it displaces. + + Safe to call from a fetch worker thread; only the render thread uploads/unloads textures.""" + with self._lock: + displaced = self._pending_tiles.get(tile_key) + self._pending_tiles[tile_key] = image + if displaced is not None: + rl.unload_image(displaced) + + def _consume_pending(self) -> None: + with self._lock: + pending = list(self._pending_tiles.items()) + self._pending_tiles.clear() + + decode_us = 0 + upload_us = 0 + unload_us = 0 + unload_count = 0 + payload_bytes = 0 + cache_before = len(self._textures) + for tile_key, image in pending: + # Images arrive already decoded + downscaled from the fetch worker; the render thread + # only uploads to a GPU texture here (decode cost is off-thread, so decode_us stays ~0). + started_ns = time.monotonic_ns() + texture = self._pool.acquire(image) + upload_us += (time.monotonic_ns() - started_ns) // 1000 + rl.unload_image(image) + old_texture = self._textures.get(tile_key) + if old_texture is not None: + started_ns = time.monotonic_ns() + self._pool.release(old_texture) + unload_us += (time.monotonic_ns() - started_ns) // 1000 + unload_count += 1 + self._textures[tile_key] = texture + + total_us = decode_us + upload_us + unload_us + if pending and ( + total_us >= NAV_TEXTURE_WARN_US + or decode_us >= NAV_TILE_OP_WARN_US + or upload_us >= NAV_TILE_OP_WARN_US + or len(pending) >= NAV_BURST_WARN_TILES + ): + sample = PerfSample( + texture_decode_us=int(decode_us), + texture_upload_us=int(upload_us), + texture_unload_us=int(unload_us), + texture_consume_us=int(total_us), + texture_batch_size=len(pending), + texture_bytes=payload_bytes, + texture_cache_before=cache_before, + texture_cache_after=len(self._textures), + texture_unloaded=unload_count, + ) + _emit_nav_perf( + "nav_texture_burst", + total_time_us=int(total_us), + batch_size=len(pending), + detail=( + f"provider=mapbox decode_us={decode_us} upload_us={upload_us} unload_us={unload_us} " + + f"tiles={len(pending)} bytes={payload_bytes} cache_before={cache_before} cache_after={len(self._textures)}" + ), + sample=sample, + ) + + def _visible_tile_keys( + self, latitude: float, longitude: float, zoom: float, width: float, height: float + ) -> tuple[int, float, float, float, list[tuple[int, int, int]]]: + if self._rotated: + # rotation coverage = bounding circle; keep_margin=1 keeps resident set under cache_limit + width = height = math.hypot(width, height) + z = max(0, min(22, int(round(zoom)))) + scale = 2.0 ** (zoom - z) + center_x, center_y = mercator_world_px_at_zoom(latitude, longitude, z, tile_size=TILE_SIZE) + world_half_width = (width * 0.5) / max(scale, 1e-6) + world_half_height = (height * 0.5) / max(scale, 1e-6) + min_tile_x = int(math.floor((center_x - world_half_width) / TILE_SIZE)) - 1 + max_tile_x = int(math.floor((center_x + world_half_width) / TILE_SIZE)) + 1 + min_tile_y = int(math.floor((center_y - world_half_height) / TILE_SIZE)) - 1 + max_tile_y = int(math.floor((center_y + world_half_height) / TILE_SIZE)) + 1 + + tile_count = 2 ** z + visible = [] + for tile_y in range(max(0, min_tile_y), min(tile_count - 1, max_tile_y) + 1): + for tile_x in range(min_tile_x, max_tile_x + 1): + visible.append((z, tile_x % tile_count, tile_y)) + return z, scale, center_x, center_y, visible + + def set_rotated(self, rotated: bool) -> None: + self._rotated = rotated + self._keep_margin = 1 if rotated else CACHE_MARGIN_TILES + + @staticmethod + def _image_ext(payload: bytes) -> str: + if payload.startswith(b"\xff\xd8\xff"): + return ".jpg" + if payload.startswith(b"RIFF") and b"WEBP" in payload[:16]: + return ".webp" + return ".png" + + def _prune_cache(self, keep_tiles: set[tuple[int, int, int]]) -> None: + if len(self._textures) <= self._cache_limit: + return + + cache_before = len(self._textures) + unload_count = 0 + started_ns = time.monotonic_ns() + for tile_key in list(self._textures): + if tile_key in keep_tiles: + continue + self._pool.release(self._textures.pop(tile_key)) + unload_count += 1 + if len(self._textures) <= self._cache_limit: + break + prune_us = (time.monotonic_ns() - started_ns) // 1000 + if prune_us >= NAV_PRUNE_WARN_US or unload_count >= NAV_BURST_WARN_TILES: + sample = PerfSample( + texture_prune_us=int(prune_us), + texture_cache_before=cache_before, + texture_cache_after=len(self._textures), + texture_unloaded=unload_count, + ) + _emit_nav_perf( + "nav_texture_prune", + total_time_us=int(prune_us), + batch_size=unload_count, + detail=f"provider=mapbox prune_us={prune_us} cache_before={cache_before} cache_after={len(self._textures)} unload_count={unload_count}", + sample=sample, + ) + + def update(self, latitude: float, longitude: float, zoom: float, width: float, height: float): + if self._provider_disabled: + self._status = "disabled" + return + + self._consume_pending() + + z, scale, center_x, center_y, visible_tiles = self._visible_tile_keys(latitude, longitude, zoom, width, height) + center_tile_x = center_x / TILE_SIZE + center_tile_y = center_y / TILE_SIZE + token = self._token() + + for tile_key in visible_tiles: + self._queue_cached_tile(tile_key) + + missing_tiles = [ + tile_key for tile_key in visible_tiles + if tile_key not in self._textures and tile_key not in self._inflight + ] + missing_tiles.sort(key=lambda tile_key: abs(tile_key[1] - center_tile_x) + abs(tile_key[2] - center_tile_y)) + if token: + launch_count = max(0, MAX_INFLIGHT_TILES - len(self._inflight)) + for tile_key in missing_tiles[:launch_count]: + self._inflight.add(tile_key) + self._status = "loading" + thread = threading.Thread(target=self._fetch_worker, args=(tile_key, token), daemon=True) + thread.start() + elif not self._textures: + self._status = "token_missing" + + visible_set = set(visible_tiles) + self._viewport_complete = bool(visible_set) and all(tile_key in self._textures for tile_key in visible_set) + if self._viewport_complete: + self._status = "ready" if token else "offline_cache" + elif self._inflight: + self._status = "loading" + elif self._textures: + self._status = "offline_cache" + + tile_count = 2 ** z + keep_tiles = set() + for tile_key in visible_tiles: + _, tile_x, tile_y = tile_key + for dx in range(-self._keep_margin, self._keep_margin + 1): + for dy in range(-self._keep_margin, self._keep_margin + 1): + keep_y = tile_y + dy + if 0 <= keep_y < tile_count: + keep_tiles.add((z, (tile_x + dx) % tile_count, keep_y)) + self._prune_cache(keep_tiles) + + def draw(self, rect: rl.Rectangle, latitude: float, longitude: float, zoom: float) -> bool: + if self._provider_disabled: + return False + z, scale, center_x, center_y, visible_tiles = self._visible_tile_keys(latitude, longitude, zoom, rect.width, rect.height) + drew_any = False + half_width = rect.width * 0.5 + half_height = rect.height * 0.5 + + for tile_key in visible_tiles: + texture = self._textures.get(tile_key) + if texture is None: + continue + _, tile_x, tile_y = tile_key + tile_left = rect.x + half_width + ((tile_x * TILE_SIZE) - center_x) * scale + tile_top = rect.y + half_height + ((tile_y * TILE_SIZE) - center_y) * scale + dst = rl.Rectangle(tile_left, tile_top, TILE_SIZE * scale, TILE_SIZE * scale) + src = rl.Rectangle(0, 0, float(texture.width), float(texture.height)) + rl.draw_texture_pro(texture, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE) + drew_any = True + + return drew_any + + def status(self) -> str: + return self._status + + def has_content(self) -> bool: + return bool(self._textures) + + def viewport_complete(self) -> bool: + """True when every tile of the last update() viewport has a resident texture.""" + return self._viewport_complete + + def release(self) -> None: + """Free all GPU tile textures and drop pending decodes. + + Called when the map panel goes inactive (offroad / maps disabled) so the tile + cache — up to CACHE_LIMIT textures of dmabuf-backed GPU memory — isn't held + resident while nothing is drawing it. Safe to call from the UI thread only + (raylib GL context); update()/_consume_pending() already run here.""" + for texture in self._textures.values(): + rl.unload_texture(texture) + self._textures.clear() + self._pool.drain() + with self._lock: + pending_images = list(self._pending_tiles.values()) + self._pending_tiles.clear() + for image in pending_images: + rl.unload_image(image) + self._status = "idle" + self._viewport_complete = False + + +class OsmOfflineProvider: + def __init__(self, cache_limit: int = CACHE_LIMIT): + self._cache_limit = cache_limit + self._pool = TexturePool(cache_limit) + self._conn: Any | None = None + # Serializes sqlite access + source swaps: blob reads run on fetch worker threads against a + # single shared read-only connection, and _refresh_source may close/reopen it under them. + self._db_lock = threading.Lock() + self._mbtiles_path: Path | None = None + self._xyz_root: Path | None = None + # Decoded, downscaled rl.Images ready for GPU upload — same off-render-thread pattern as + # MapboxTileProvider: workers read the blob + decode + resize, _consume_pending only uploads. + self._pending_tiles: dict[tuple[int, int, int], Any] = {} + self._inflight: set[tuple[int, int, int]] = set() + self._lock = threading.Lock() + self._textures: dict[tuple[int, int, int], rl.Texture] = {} + self._status = "offline_missing" + self._min_zoom: int | None = None + self._max_zoom: int | None = None + self._day_mode = False + self._rotated = False + self._keep_margin = CACHE_MARGIN_TILES + + def set_day_mode(self, day: bool) -> None: + self._day_mode = day + + def set_rotated(self, rotated: bool) -> None: + self._rotated = rotated + self._keep_margin = 1 if rotated else CACHE_MARGIN_TILES + + def _close_conn_locked(self) -> None: + if self._conn is not None: + self._conn.close() + self._conn = None + + def _drop_pending(self) -> None: + with self._lock: + pending_images = list(self._pending_tiles.values()) + self._pending_tiles.clear() + for image in pending_images: + rl.unload_image(image) + + def _refresh_source(self, latitude: float, longitude: float) -> None: + mbtiles_path = find_offline_mbtiles_path(latitude, longitude, day=self._day_mode) + xyz_root = find_offline_xyz_root(latitude, longitude) + + if self._mbtiles_path == mbtiles_path and self._xyz_root == xyz_root: + return + + self._mbtiles_path = mbtiles_path + self._xyz_root = xyz_root + self._min_zoom = None + self._max_zoom = None + + for texture in self._textures.values(): + rl.unload_texture(texture) + self._textures.clear() + self._drop_pending() + + with self._db_lock: + self._close_conn_locked() + if self._mbtiles_path is not None: + try: + self._conn = open_mbtiles(self._mbtiles_path) + if mbtiles_is_raster(self._conn): + self._min_zoom, self._max_zoom = mbtiles_zoom_bounds(self._conn) + self._status = "offline_ready" + else: + self._status = "offline_invalid" + except SQLITE_ERRORS: + self._conn = None + self._status = "offline_invalid" + elif self._xyz_root is not None: + self._min_zoom, self._max_zoom = xyz_zoom_bounds(self._xyz_root) + self._status = "offline_ready" + else: + self._status = "offline_missing" + + def _source_tile_for_request(self, tile_key: tuple[int, int, int]) -> tuple[tuple[int, int, int], int]: + z, x, y = tile_key + source_z = z + if self._max_zoom is not None and z > self._max_zoom: + source_z = self._max_zoom + elif self._min_zoom is not None and z < self._min_zoom: + source_z = self._min_zoom + + delta = z - source_z + if delta <= 0: + return (source_z, x, y), 0 + + return (source_z, x >> delta, y >> delta), delta + + def _stash_pending(self, tile_key: tuple[int, int, int], image) -> None: + """Store a decoded tile Image for upload, unloading any Image it displaces. + + Safe to call from a fetch worker thread; only the render thread uploads/unloads textures.""" + with self._lock: + displaced = self._pending_tiles.get(tile_key) + self._pending_tiles[tile_key] = image + if displaced is not None: + rl.unload_image(displaced) + + def _load_decode_worker(self, tile_key: tuple[int, int, int]) -> None: + """Read a tile blob from disk and decode + downscale it, entirely off the render thread. + + Mirrors MapboxTileProvider._fetch_worker: the render loop must never pay the sqlite/file + read or the stb decode — with offline as the primary provider, an inline decode of a + screenful of tiles was a visible render-loop hitch.""" + try: + payload = self._load_blob(tile_key) + if payload is not None: + self._stash_pending(tile_key, _decode_tile_image(payload)) + except Exception: + pass + finally: + self._inflight.discard(tile_key) + + def _consume_pending(self) -> None: + with self._lock: + pending = list(self._pending_tiles.items()) + self._pending_tiles.clear() + + upload_us = 0 + unload_us = 0 + unload_count = 0 + cache_before = len(self._textures) + for tile_key, image in pending: + # Images arrive already decoded + downscaled from the worker; only the GPU upload runs here. + started_ns = time.monotonic_ns() + texture = self._pool.acquire(image) + upload_us += (time.monotonic_ns() - started_ns) // 1000 + rl.unload_image(image) + old_texture = self._textures.get(tile_key) + if old_texture is not None: + started_ns = time.monotonic_ns() + self._pool.release(old_texture) + unload_us += (time.monotonic_ns() - started_ns) // 1000 + unload_count += 1 + self._textures[tile_key] = texture + + total_us = upload_us + unload_us + if pending and ( + total_us >= NAV_TEXTURE_WARN_US + or upload_us >= NAV_TILE_OP_WARN_US + or len(pending) >= NAV_BURST_WARN_TILES + ): + sample = PerfSample( + texture_upload_us=int(upload_us), + texture_unload_us=int(unload_us), + texture_consume_us=int(total_us), + texture_batch_size=len(pending), + texture_cache_before=cache_before, + texture_cache_after=len(self._textures), + texture_unloaded=unload_count, + ) + _emit_nav_perf( + "nav_texture_burst", + total_time_us=int(total_us), + batch_size=len(pending), + detail=( + f"provider=offline upload_us={upload_us} unload_us={unload_us} " + + f"tiles={len(pending)} cache_before={cache_before} cache_after={len(self._textures)}" + ), + sample=sample, + ) + + def _prune_cache(self, keep_tiles: set[tuple[int, int, int]]) -> None: + if len(self._textures) <= self._cache_limit: + return + + cache_before = len(self._textures) + unload_count = 0 + started_ns = time.monotonic_ns() + for tile_key in list(self._textures): + if tile_key in keep_tiles: + continue + self._pool.release(self._textures.pop(tile_key)) + unload_count += 1 + if len(self._textures) <= self._cache_limit: + break + prune_us = (time.monotonic_ns() - started_ns) // 1000 + if prune_us >= NAV_PRUNE_WARN_US or unload_count >= NAV_BURST_WARN_TILES: + sample = PerfSample( + texture_prune_us=int(prune_us), + texture_cache_before=cache_before, + texture_cache_after=len(self._textures), + texture_unloaded=unload_count, + ) + _emit_nav_perf( + "nav_texture_prune", + total_time_us=int(prune_us), + batch_size=unload_count, + detail=f"provider=offline prune_us={prune_us} cache_before={cache_before} cache_after={len(self._textures)} unload_count={unload_count}", + sample=sample, + ) + + def _visible_tile_keys( + self, latitude: float, longitude: float, zoom: float, width: float, height: float + ) -> tuple[int, float, float, float, list[tuple[int, int, int]]]: + if self._rotated: + width = height = math.hypot(width, height) + z = max(0, min(22, int(round(zoom)))) + scale = 2.0 ** (zoom - z) + center_x, center_y = mercator_world_px_at_zoom(latitude, longitude, z, tile_size=TILE_SIZE) + world_half_width = (width * 0.5) / max(scale, 1e-6) + world_half_height = (height * 0.5) / max(scale, 1e-6) + min_tile_x = int(math.floor((center_x - world_half_width) / TILE_SIZE)) - 1 + max_tile_x = int(math.floor((center_x + world_half_width) / TILE_SIZE)) + 1 + min_tile_y = int(math.floor((center_y - world_half_height) / TILE_SIZE)) - 1 + max_tile_y = int(math.floor((center_y + world_half_height) / TILE_SIZE)) + 1 + + tile_count = 2 ** z + visible = [] + for tile_y in range(max(0, min_tile_y), min(tile_count - 1, max_tile_y) + 1): + for tile_x in range(min_tile_x, max_tile_x + 1): + visible.append((z, tile_x % tile_count, tile_y)) + return z, scale, center_x, center_y, visible + + def _load_blob(self, tile_key: tuple[int, int, int]) -> bytes | None: + z, x, y = tile_key + # Runs on worker threads: the shared read-only sqlite connection is not safe for + # concurrent queries, and _refresh_source may swap it — serialize via _db_lock. + with self._db_lock: + if self._conn is not None and self._status == "offline_ready": + try: + return load_raster_tile_blob(self._conn, z, x, y) + except SQLITE_ERRORS: + self._status = "offline_invalid" + return None + xyz_root = self._xyz_root + if xyz_root is not None: + return load_raster_xyz_tile_blob(xyz_root, z, x, y) + return None + + def update(self, latitude: float, longitude: float, zoom: float, width: float, height: float) -> None: + self._refresh_source(latitude, longitude) + if self._status != "offline_ready": + return + + self._consume_pending() + + z, _, center_x, center_y, visible_tiles = self._visible_tile_keys(latitude, longitude, zoom, width, height) + # Map requested tiles to their on-disk source tiles (overzoom clamps to the stored range). + visible_source: list[tuple[int, int, int]] = [] + seen: set[tuple[int, int, int]] = set() + for requested_tile in visible_tiles: + source_tile, _ = self._source_tile_for_request(requested_tile) + if source_tile not in seen: + seen.add(source_tile) + visible_source.append(source_tile) + + missing_tiles = [ + tile_key for tile_key in visible_source + if tile_key not in self._textures and tile_key not in self._inflight + ] + + def _center_distance(tile_key: tuple[int, int, int]) -> float: + source_z, tile_x, tile_y = tile_key + zoom_scale = 2.0 ** (z - source_z) + return ( + abs(tile_x + 0.5 - (center_x / TILE_SIZE) / zoom_scale) + + abs(tile_y + 0.5 - (center_y / TILE_SIZE) / zoom_scale) + ) + + missing_tiles.sort(key=_center_distance) + launch_count = max(0, MAX_INFLIGHT_TILES - len(self._inflight)) + for tile_key in missing_tiles[:launch_count]: + self._inflight.add(tile_key) + threading.Thread(target=self._load_decode_worker, args=(tile_key,), daemon=True).start() + + # Keep a margin ring around the visible source tiles so panning doesn't churn re-decodes; + # the cache limit bounds the resident GPU footprint exactly like the mapbox provider. + keep_tiles: set[tuple[int, int, int]] = set() + for source_z, tile_x, tile_y in visible_source: + tile_count = 2 ** source_z + for dx in range(-self._keep_margin, self._keep_margin + 1): + for dy in range(-self._keep_margin, self._keep_margin + 1): + keep_y = tile_y + dy + if 0 <= keep_y < tile_count: + keep_tiles.add((source_z, (tile_x + dx) % tile_count, keep_y)) + self._prune_cache(keep_tiles) + + def draw(self, rect: rl.Rectangle, latitude: float, longitude: float, zoom: float) -> bool: + if self._status != "offline_ready": + return False + + z, scale, center_x, center_y, visible_tiles = self._visible_tile_keys(latitude, longitude, zoom, rect.width, rect.height) + drew_any = False + half_width = rect.width * 0.5 + half_height = rect.height * 0.5 + + for requested_tile in visible_tiles: + source_tile, delta = self._source_tile_for_request(requested_tile) + texture = self._textures.get(source_tile) + if texture is None: + continue + _, tile_x, tile_y = requested_tile + tile_left = rect.x + half_width + ((tile_x * TILE_SIZE) - center_x) * scale + tile_top = rect.y + half_height + ((tile_y * TILE_SIZE) - center_y) * scale + dst = rl.Rectangle(tile_left, tile_top, TILE_SIZE * scale, TILE_SIZE * scale) + if delta == 0: + src = rl.Rectangle(0, 0, float(texture.width), float(texture.height)) + else: + subdivisions = 2 ** delta + src_width = float(texture.width) / subdivisions + src_height = float(texture.height) / subdivisions + src_x = float(tile_x % subdivisions) * src_width + src_y = float(tile_y % subdivisions) * src_height + src = rl.Rectangle(src_x, src_y, src_width, src_height) + rl.draw_texture_pro(texture, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE) + drew_any = True + + return drew_any + + def status(self) -> str: + return self._status + + def has_content(self) -> bool: + return bool(self._textures) + + def release(self) -> None: + """Free all GPU tile textures and drop pending decodes. See MapboxTileProvider.release().""" + for texture in self._textures.values(): + rl.unload_texture(texture) + self._textures.clear() + self._pool.drain() + self._drop_pending() + + +class NavMapPanel(Widget): + def __init__(self, force_visible: bool = False): + super().__init__() + self._params = Params() + self._force_visible = force_visible + self.active = False + self._maps_enabled = False + self.current_latitude = 0.0 + self.current_longitude = 0.0 + self.bearing_deg = 0.0 + self.zoom_hint = 16.0 + self.destination_latitude = 0.0 + self.destination_longitude = 0.0 + self.render_center_latitude = 0.0 + self.render_center_longitude = 0.0 + self.render_zoom = 16.0 + self.display_center_latitude = 0.0 + self.display_center_longitude = 0.0 + self.display_zoom = 16.0 + self.route_points = [] + self.next_distance = 0.0 + self.next_description = "" + self.next_direction = 0 + self.next_type = 0 + self.next_valid = False + self.nav_active = False + self.destination_name = "" + self.time_remaining = 0.0 + self.distance_remaining = 0.0 + self.road_name = "" + self._has_render_fix = False + self._route_ahead_index = 0 + self._projected_route_points: list[tuple[float, float]] = [] + self._projected_route_key: tuple | None = None + self._map_viewport_width: float = PANEL_WIDTH - 24 + self._map_viewport_height: float = MAP_HEIGHT + self._mapbox = MapboxTileProvider(cache_limit=PANEL_CACHE_LIMIT) + self._offline = OsmOfflineProvider(cache_limit=PANEL_CACHE_LIMIT) + self._offline_idle_since = 0.0 + # OnlineOSMaps/OfflineOSMaps pick the tile sources: both on = online primary with offline + # filling in whenever mapbox is unhealthy; online only = mapbox alone (stock behavior); + # offline only = local tiles alone, mapbox never fetched (no network threads at all). + self._online_maps_enabled = True + self._offline_maps_enabled = False + self._mapbox_mode_released = False + # Day/night map styling, Apple/Google-style: solar elevation drives it once a GPS fix + # exists (hysteresis: day above 0 deg, night below -6 deg / civil dusk); the local clock + # seeds the first frame. OSMapsStyleMode param forces day(1)/night(2), 0 = auto. + self._day_mode = 6 <= time.localtime().tm_hour < 20 + self._style_mode = 0 + self._last_daynight_check = 0.0 + self._heading_up = True + self.display_bearing = 0.0 + self._title_font = gui_app.font(FontWeight.BOLD) + self._body_font = gui_app.font(FontWeight.MEDIUM) + self._micro_font = gui_app.font(FontWeight.SEMI_BOLD) + self._icon_textures: dict[str, rl.Texture] = {} + self._last_params_refresh = 0.0 + self._last_mapbox_update = 0.0 + self._last_offline_update = 0.0 + self._released = False + self._last_projection_update = 0.0 + # Memoizes _fit_text_size: the fit loop measures the same (font, text, width) tuples every + # frame at 20Hz across ~a dozen text elements. The result only depends on those inputs, so + # cache it and skip the descending measure loop entirely on repeats. + self._fit_size_cache: dict[tuple, int] = {} + # Split RenderTexture caches for the onroad panel (lazily created on the render thread, which + # owns the GL context). The map layer (tiles/route/ego) pans, so it refreshes at + # PANEL_RENDER_FPS; the chrome layer (badge + info text) only refreshes on a value change. + self._map_rt: Any = None + self._chrome_rt: Any = None + self._last_map_render = 0.0 + self._last_chrome_render = 0.0 + self._chrome_key: Any = None + + @staticmethod + def _enum_value(value) -> int: + return int(getattr(value, "raw", value)) + + def _release_providers(self) -> None: + """Free tile textures once when the panel transitions to inactive. + + Latched so it runs on the offroad/maps-off transition rather than every idle + frame. force_visible (offroad NAV screen) keeps its own panel active, so this + only fires for the onroad panel when it stops drawing.""" + if self._released: + return + self._mapbox.release() + self._offline.release() + for attr in ("_map_rt", "_chrome_rt"): + rt = getattr(self, attr) + if rt is not None: + rl.unload_render_texture(rt) + setattr(self, attr, None) + self._last_map_render = 0.0 + self._last_chrome_render = 0.0 + self._chrome_key = None + self._released = True + + def _route_ahead_points(self): + if len(self.route_points) < 2: + self._route_ahead_index = 0 + return self.route_points + + best_idx = 0 + best_score = None + for idx, point in enumerate(self.route_points): + dlat = float(point.latitude) - self.current_latitude + dlon = float(point.longitude) - self.current_longitude + score = dlat * dlat + dlon * dlon + if best_score is None or score < best_score: + best_score = score + best_idx = idx + + self._route_ahead_index = best_idx + return self.route_points[best_idx:] + + def _refresh_route_projection(self, force: bool = False) -> None: + route_points = self.route_points[self._route_ahead_index:] + if len(route_points) < 2: + self._projected_route_points = [] + self._projected_route_key = None + return + + projection_key = ( + self._route_ahead_index, + len(self.route_points), + round(self.display_center_latitude, 5), + round(self.display_center_longitude, 5), + round(self.display_zoom, 2), + round(self._map_viewport_width, 0), + round(self._map_viewport_height, 0), + ) + if not force and projection_key == self._projected_route_key: + return + + started = time.monotonic() + self._projected_route_points = project_nav_polyline( + route_points, + self.display_center_latitude, + self.display_center_longitude, + self.display_zoom, + 0.0, + self._map_viewport_width, + self._map_viewport_height, + ) + self._projected_route_key = projection_key + + project_us = int((time.monotonic() - started) * 1_000_000) + if project_us > 3_000: + sample = PerfSample(texture_consume_us=project_us, texture_batch_size=len(route_points)) + _emit_nav_perf( + "nav_map_projection_slow", + total_time_us=project_us, + batch_size=len(route_points), + detail=f"project_us={project_us} points={len(route_points)} active={int(self.active)}", + sample=sample, + ) + + def _icon_asset_name(self) -> str | None: + if not self._display_next_valid(): + return None + dir_left = self._display_direction_is_left() + if self.next_type == 1: + return "direction_turn_left.png" if dir_left else "direction_turn_right.png" + if self.next_type == 2: + return "direction_off_ramp_left.png" if dir_left else "direction_off_ramp_right.png" + if self.next_type == 3: + return "direction_merge_left.png" if dir_left else "direction_merge_right.png" + if self.next_type == 4: + return "direction_fork_left.png" if dir_left else "direction_fork_right.png" + if self.next_type == 6: + return "direction_arrive.png" + return "direction_continue_left.png" if dir_left else "direction_continue_right.png" + + def _display_next_valid(self) -> bool: + return bool( + self.next_valid and ( + self.next_distance > 1.0 + or bool(self.next_description) + or self.next_type == 6 + ) + ) + + def _display_direction_is_left(self) -> bool: + description = f" {self.next_description.lower()} " + if " left " in description and " right " not in description: + return True + if " right " in description and " left " not in description: + return False + return self.next_direction == 1 + + def _display_route_active(self) -> bool: + return bool( + self.nav_active and ( + self.distance_remaining > 1.0 + or self.time_remaining > 1.0 + or bool(self.destination_name) + or self._display_next_valid() + or len(self.route_points) >= 2 + ) + ) + + def _icon_texture(self): + name = self._icon_asset_name() + if name is None: + return None + if name in self._icon_textures: + return self._icon_textures[name] + + path = ICON_ASSET_DIR / name + if not path.exists(): + return None + + texture = rl.load_texture(path.as_posix()) + rl.set_texture_filter(texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + rl.set_texture_wrap(texture, rl.TextureWrap.TEXTURE_WRAP_CLAMP) + self._icon_textures[name] = texture + return texture + + def _destination_texture(self): + name = "direction_flag.png" + if name in self._icon_textures: + return self._icon_textures[name] + + path = ICON_ASSET_DIR / name + if not path.exists(): + return None + + texture = rl.load_texture(path.as_posix()) + rl.set_texture_filter(texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + rl.set_texture_wrap(texture, rl.TextureWrap.TEXTURE_WRAP_CLAMP) + self._icon_textures[name] = texture + return texture + + def _fit_text_size(self, font: rl.Font, text: str, max_width: float, max_size: int, min_size: int) -> int: + key = (id(font), text, round(max_width), max_size, min_size) + cached = self._fit_size_cache.get(key) + if cached is not None: + return cached + fitted = min_size + for size in range(max_size, min_size - 1, -1): + if measure_text_cached(font, text, size).x <= max_width: + fitted = size + break + # Bound the cache: distances/ETA strings churn, but the working set per frame is tiny. + if len(self._fit_size_cache) > 512: + self._fit_size_cache.clear() + self._fit_size_cache[key] = fitted + return fitted + + @staticmethod + def _lerp(start: float, end: float, alpha: float) -> float: + return start + (end - start) * alpha + + @staticmethod + def _lerp_angle(current: float, target: float, alpha: float) -> float: + delta = ((target - current + 180.0) % 360.0) - 180.0 + return (current + delta * alpha) % 360.0 + + def _refresh_position_from_fallback(self) -> bool: + lat, lon, bearing, have_fix = current_or_last_gps_position() + if not have_fix: + return False + + self.current_latitude = lat + self.current_longitude = lon + self.bearing_deg = bearing + self.zoom_hint = self.zoom_hint if self.zoom_hint > 0.0 else 16.0 + self.render_center_latitude, self.render_center_longitude, self.render_zoom = choose_nav_camera( + self.current_latitude, + self.current_longitude, + self.bearing_deg, + self._route_ahead_points(), + self._map_viewport_width, + self._map_viewport_height, + self.zoom_hint, + ) + if self.display_center_latitude == 0.0 and self.display_center_longitude == 0.0: + self.display_center_latitude = self.render_center_latitude + self.display_center_longitude = self.render_center_longitude + self.display_zoom = self.render_zoom + self._has_render_fix = True + self.active = True + return True + + def _refresh_params(self, now: float) -> None: + if now - self._last_params_refresh < PARAMS_REFRESH_S: + return + try: + self._maps_enabled = self._force_visible or self._params.get_bool("OnScreenNavigation") + except UnknownKeyName: + # If the param doesn't exist in this build, default to disabled unless explicitly embedded. + self._maps_enabled = self._force_visible + try: + self._online_maps_enabled = self._params.get_bool("OnlineOSMaps") + self._offline_maps_enabled = self._params.get_bool("OfflineOSMaps") + except UnknownKeyName: + # Builds whose compiled params predate the toggles keep the legacy behavior: + # online primary with the offline fallback armed. + self._online_maps_enabled = True + self._offline_maps_enabled = True + try: + self._style_mode = int(self._params.get("OSMapsStyleMode") or 0) + except (UnknownKeyName, ValueError): + self._style_mode = 0 + try: + self._heading_up = self._params.get_bool("OSMapsHeadingUp") + except UnknownKeyName: + self._heading_up = True + self._last_params_refresh = now + + def _refresh_day_mode(self, now: float) -> None: + if self._style_mode in (1, 2): + self._day_mode = self._style_mode == 1 + return + if now - self._last_daynight_check < 60.0: + return + self._last_daynight_check = now + if abs(self.current_latitude) > 0.01 or abs(self.current_longitude) > 0.01: + elevation = solar_elevation_deg(self.current_latitude, self.current_longitude, time.time()) # noqa: TID251 + if elevation > 0.0: + self._day_mode = True + elif elevation < -6.0: + self._day_mode = False + # between 0 and -6 deg (twilight): keep the current style, no flapping + + def update(self): + now = time.monotonic() + self._refresh_params(now) + + if not gui_app.big_ui() and not self._force_visible: + self.active = False + self._release_providers() + return + if not self._maps_enabled: + self.active = False + self._release_providers() + return + + # We're onroad with maps enabled — tiles may load again, so re-arm the release latch. + self._released = False + + sm = ui_state.sm + render_updated = False + if sm.updated["iqNavRenderState"]: + render_updated = True + rs = sm["iqNavRenderState"] + rs_lat = float(rs.currentLatitude) + rs_lon = float(rs.currentLongitude) + has_fix = abs(rs_lat) > 0.001 and abs(rs_lon) > 0.001 + if has_fix: + self.current_latitude = rs_lat + self.current_longitude = rs_lon + self.bearing_deg = float(rs.bearingDeg) + self.zoom_hint = float(rs.zoomHint) if float(rs.zoomHint) > 0.0 else 16.0 + self._has_render_fix = True + route_points = list(rs.routePolylineSimplified) if len(rs.routePolylineSimplified) > 0 else list(rs.routePolyline) + if route_points: + self.route_points = route_points + self._projected_route_key = None + self.next_distance = float(rs.nextManeuverDistance) + self.next_direction = self._enum_value(rs.nextManeuverDirection) + self.next_type = self._enum_value(rs.nextManeuverType) + if self._has_render_fix: + self.render_center_latitude, self.render_center_longitude, self.render_zoom = choose_nav_camera( + self.current_latitude, + self.current_longitude, + self.bearing_deg, + self._route_ahead_points(), + self._map_viewport_width, + self._map_viewport_height, + self.zoom_hint, + ) + self.destination_latitude = float(rs.destinationLatitude) + self.destination_longitude = float(rs.destinationLongitude) + if self.display_center_latitude == 0.0 and self.display_center_longitude == 0.0: + self.display_center_latitude = self.render_center_latitude + self.display_center_longitude = self.render_center_longitude + self.display_zoom = self.render_zoom + self.active = bool(rs.active) or self._has_render_fix or bool(self.route_points) + + if self._force_visible and (not render_updated or not self.active): + self._refresh_position_from_fallback() + + if sm.updated["iqNavState"]: + nav = sm["iqNavState"] + self.nav_active = bool(nav.active) + self.next_valid = bool(nav.nextManeuverValid) + self.destination_name = str(nav.destinationName or "") + self.next_description = nav.nextManeuverDescription if nav.nextManeuverValid else "" + self.time_remaining = float(nav.timeRemaining) + self.distance_remaining = float(nav.distanceRemaining) + self.next_direction = self._enum_value(nav.nextManeuverDirection) if nav.nextManeuverValid else self.next_direction + self.next_type = self._enum_value(nav.nextManeuverType) if nav.nextManeuverValid else self.next_type + + if sm.updated["iqLiveData"]: + self.road_name = sm["iqLiveData"].roadName + + if self.active: + self.display_center_latitude = self._lerp(self.display_center_latitude, self.render_center_latitude, CAMERA_SMOOTHING) + self.display_center_longitude = self._lerp(self.display_center_longitude, self.render_center_longitude, CAMERA_SMOOTHING) + self.display_zoom = self._lerp(self.display_zoom, self.render_zoom, CAMERA_SMOOTHING) + if now - self._last_projection_update >= ROUTE_PROJECTION_UPDATE_S: + self._refresh_route_projection() + self._last_projection_update = now + + self._refresh_day_mode(now) + self._mapbox.set_day_mode(self._day_mode) + self._offline.set_day_mode(self._day_mode) + + rotate = self._heading_up and self._has_render_fix + self._mapbox.set_rotated(rotate) + self._offline.set_rotated(rotate) + target_bearing = self.bearing_deg if rotate else 0.0 + self.display_bearing = self._lerp_angle(self.display_bearing, target_bearing, 0.15) + + if self._online_maps_enabled: + self._mapbox_mode_released = False + if now - self._last_mapbox_update >= MAP_PROVIDER_UPDATE_S: + self._mapbox.update( + self.display_center_latitude, + self.display_center_longitude, + self.display_zoom, + self._map_viewport_width, + self._map_viewport_height, + ) + self._last_mapbox_update = now + elif not self._mapbox_mode_released: + # Online maps toggled off: free the mapbox tile cache once. No update() means no fetch + # threads and no network traffic while offline-only mode is selected. + self._mapbox.release() + self._mapbox_mode_released = True + + if self._offline_maps_enabled: + if self._online_maps_enabled: + # Both sources on: offline engages only while mapbox can't cover the screen. + mapbox_status = self._mapbox.status() + offline_engaged = mapbox_status in {"disabled", "token_missing", "error"} or not self._mapbox.has_content() + else: + offline_engaged = True + else: + offline_engaged = False + + if offline_engaged: + if now - self._last_offline_update >= OFFLINE_PROVIDER_UPDATE_S: + self._offline.update( + self.display_center_latitude, + self.display_center_longitude, + self.display_zoom, + self._map_viewport_width, + self._map_viewport_height, + ) + self._last_offline_update = now + self._offline_idle_since = 0.0 + elif self._offline.has_content(): + if not self._offline_maps_enabled: + # Offline maps toggled off mid-drive: free its tile cache immediately. + self._offline.release() + self._offline_idle_since = 0.0 + # Mapbox recovered: the offline fill-in cache (up to CACHE_LIMIT tiles of GPU + # memory) would otherwise stay resident until the panel deactivates — one LTE + # dropout per drive made it a permanent +tile-cache floor. It refills from the + # on-disk cache in a few frames when needed, so free it after a healthy minute. + elif self._offline_idle_since == 0.0: + self._offline_idle_since = now + elif now - self._offline_idle_since >= OFFLINE_RELEASE_AFTER_S: + self._offline.release() + self._offline_idle_since = 0.0 + + def maps_enabled(self) -> bool: + if self._force_visible: + return True + self._refresh_params(time.monotonic()) + return bool(self._maps_enabled) + + def warm_up_tiles(self, timeout_s: float = 30.0) -> bool: + """Block until the online provider covers the current viewport. For offline rendering + (tools/clip), where frames aren't wall-clock paced and async tile fetches would lag the + output. Pumps update() with the provider throttle bypassed; needs the panel active (a nav + fix already fed through sm) and a resolvable Mapbox token. Render thread only.""" + if not (self._maps_enabled and self.active and self._online_maps_enabled): + return False + if not resolve_mapbox_token(self._params): + return False + deadline = time.monotonic() + timeout_s + while True: + self._last_mapbox_update = 0.0 + self.update() + if self._mapbox.viewport_complete(): + return True + if time.monotonic() >= deadline: + return False + time.sleep(0.05) + + @staticmethod + def _draw_card(rect: rl.Rectangle): + shadow = rl.Rectangle(rect.x + 8, rect.y + 12, rect.width, rect.height) + rl.draw_rectangle_rounded(shadow, CARD_RADIUS, 18, rl.Color(4, 8, 14, 110)) + rl.draw_rectangle_rounded(rect, CARD_RADIUS, 18, rl.Color(9, 18, 28, 246)) + rl.draw_rectangle_rounded_lines(rect, CARD_RADIUS, 18, rl.Color(255, 255, 255, 35)) + + @staticmethod + def _draw_fallback_background(rect: rl.Rectangle, draw_grid: bool = True): + rl.draw_rectangle_rounded(rect, 0.04, 14, rl.Color(20, 27, 37, 255)) + # The decorative grid is only visible in the no-map placeholder state; once tiles are drawn + # they paint over it opaquely, so the ~20 draw_line calls/frame are pure wasted overdraw. + if not draw_grid: + return + spacing = 44 + line_color = rl.Color(90, 104, 123, 86) + x = rect.x + while x < rect.x + rect.width: + rl.draw_line(int(x), int(rect.y), int(x), int(rect.y + rect.height), line_color) + x += spacing + y = rect.y + while y < rect.y + rect.height: + rl.draw_line(int(rect.x), int(y), int(rect.x + rect.width), int(y), line_color) + y += spacing + + @staticmethod + def _draw_ego_arrow(center_x: float, center_y: float, bearing_deg: float): + rl.draw_circle_v(rl.Vector2(center_x, center_y + 8), 21.0, rl.Color(0, 0, 0, 120)) + heading = math.radians(bearing_deg) + + def rotate(px: float, py: float) -> rl.Vector2: + rx = (px * math.cos(heading)) - (py * math.sin(heading)) + ry = (px * math.sin(heading)) + (py * math.cos(heading)) + return rl.Vector2(center_x + rx, center_y + ry) + + nose = rotate(0.0, -25.0) + left = rotate(-16.0, 19.0) + right = rotate(16.0, 19.0) + rl.draw_triangle(nose, left, right, rl.Color(255, 255, 255, 245)) + + def _draw_provider_badge(self, map_rect: rl.Rectangle): + status = self._mapbox.status() + offline_status = self._offline.status() + base = self.road_name or "Navigation" + if not self._online_maps_enabled and not self._offline_maps_enabled: + label = "Map sources disabled" + elif not self._online_maps_enabled: + # Offline-only mode: local tiles are the primary (and only) source. + if offline_status == "offline_ready" and self._offline.has_content(): + label = f"{base} (offline)" + else: + label = { + "offline_missing": "Offline maps missing", + "offline_invalid": "Offline maps invalid", + }.get(offline_status, "Loading offline map") + elif status == "offline_cache": + label = f"{base} (Mapbox cached)" + elif status == "ready" or self._mapbox.has_content(): + label = base + elif self._offline_maps_enabled and offline_status == "offline_ready" and self._offline.has_content(): + label = f"{base} (offline)" + else: + label = { + "disabled": "Mapbox disabled", + "token_missing": "Mapbox token missing", + "loading": "Loading live map", + "error": "Mapbox unavailable", + "offline_cache": "Mapbox cached", + }.get(status, base) + if self._offline_maps_enabled and status in {"token_missing", "error"}: + if offline_status == "offline_missing": + label = "Offline maps missing" + elif offline_status == "offline_invalid": + label = "Offline maps invalid" + + badge = rl.Rectangle(map_rect.x + 16, map_rect.y + 16, min(280.0, map_rect.width - 32), 38) + rl.draw_rectangle_rounded(badge, 0.28, 10, rl.Color(7, 12, 18, 175)) + rl.draw_text_ex(self._micro_font, label, rl.Vector2(badge.x + 14, badge.y + 9), 20, 0, rl.Color(238, 243, 247, 240)) + + @staticmethod + def _draw_panel_shell(rect: rl.Rectangle): + rl.draw_rectangle_rounded(rect, 0.03, 12, rl.Color(9, 18, 28, 248)) + rl.draw_rectangle_rounded_lines(rect, 0.03, 12, rl.Color(255, 255, 255, 26)) + + @staticmethod + def _draw_glass_band(rect: rl.Rectangle, alpha: int = 220): + rl.draw_rectangle_rounded(rect, 0.02, 10, rl.Color(7, 12, 18, alpha)) + + def _format_next_distance(self) -> str: + if not self._display_next_valid() or self.next_distance <= 0.0: + return "--" + if ui_state.is_metric: + if self.next_distance >= 1000.0: + return f"{self.next_distance / 1000.0:.1f} km" + return f"{self.next_distance:.0f} m" + + feet = self.next_distance * 3.28084 + if feet >= 900.0: + return f"{self.next_distance * 0.000621371:.1f} mi" + if feet < 500.0: + return f"{int(round(feet / 50) * 50)} ft" + return f"{int(round(feet / 100) * 100)} ft" + + def _format_remaining_distance(self) -> str: + if not self._display_route_active() or self.distance_remaining <= 0.0: + return "--" + if ui_state.is_metric: + return f"{self.distance_remaining / 1000.0:.1f} km" + return f"{self.distance_remaining * 0.000621371:.1f} mi" + + def _format_eta_clock(self) -> str: + if not self._display_route_active() or self.time_remaining <= 0.0: + return "--" + eta_epoch = time.time() + self.time_remaining + utc_offset_hours() * 3600 + eta_time = time.gmtime(eta_epoch) + if ui_state.is_metric: + return time.strftime("%H:%M", eta_time) + return time.strftime("%-I:%M %p", eta_time).lower() + + def _draw_map_surface(self, map_rect: rl.Rectangle, draw_fade: bool = True) -> None: + rl.begin_scissor_mode(int(map_rect.x), int(map_rect.y), int(map_rect.width), int(map_rect.height)) + # Skip the placeholder grid whenever a provider has tiles to paint over it. + has_tiles = self._mapbox.has_content() or self._offline.has_content() + self._draw_fallback_background(map_rect, draw_grid=not has_tiles) + # heading-up: one modelview rotation about the map center covers tiles + route + pin + rotation = self.display_bearing % 360.0 + rotated = min(rotation, 360.0 - rotation) > 0.2 + if rotated: + rl.rl_push_matrix() + rl.rl_translatef(map_rect.x + map_rect.width * 0.5, map_rect.y + map_rect.height * 0.5, 0.0) + rl.rl_rotatef(-self.display_bearing, 0.0, 0.0, 1.0) + rl.rl_translatef(-(map_rect.x + map_rect.width * 0.5), -(map_rect.y + map_rect.height * 0.5), 0.0) + if self._online_maps_enabled: + if self._offline_maps_enabled and self._offline.has_content(): + # Offline underlay fills any tiles mapbox is missing; it only holds content while + # mapbox is degraded (released ~60s after recovery), so this is a no-op when healthy. + self._offline.draw(map_rect, self.display_center_latitude, self.display_center_longitude, self.display_zoom) + self._mapbox.draw(map_rect, self.display_center_latitude, self.display_center_longitude, self.display_zoom) + elif self._offline_maps_enabled: + self._offline.draw(map_rect, self.display_center_latitude, self.display_center_longitude, self.display_zoom) + self._draw_route_overlay(map_rect) + if rotated: + rl.rl_pop_matrix() + if draw_fade: + fade = rl.Rectangle(map_rect.x, map_rect.y + map_rect.height - 128, map_rect.width, 128) + rl.draw_rectangle_gradient_v(int(fade.x), int(fade.y), int(fade.width), int(fade.height), rl.Color(0, 0, 0, 0), rl.Color(4, 10, 16, 170)) + rl.end_scissor_mode() + + def _draw_route_overlay(self, map_rect: rl.Rectangle): + if len(self._projected_route_points) >= 2: + for idx in range(len(self._projected_route_points) - 1): + x1, y1 = self._projected_route_points[idx] + x2, y2 = self._projected_route_points[idx + 1] + p1 = rl.Vector2(map_rect.x + x1, map_rect.y + y1) + p2 = rl.Vector2(map_rect.x + x2, map_rect.y + y2) + rl.draw_line_ex(p1, p2, 16.0, rl.Color(8, 18, 30, 220)) + rl.draw_line_ex(p1, p2, 10.0, rl.Color(255, 255, 255, 210)) + rl.draw_line_ex(p1, p2, 6.0, rl.Color(58, 164, 255, 255)) + + if abs(self.destination_latitude) > 0.001 and abs(self.destination_longitude) > 0.001: + dest_x, dest_y = project_nav_point( + self.destination_latitude, + self.destination_longitude, + self.display_center_latitude, + self.display_center_longitude, + self.display_zoom, + 0.0, + map_rect.width, + map_rect.height, + ) + center = rl.Vector2(map_rect.x + dest_x, map_rect.y + dest_y) + rl.draw_circle_v(center, 12.0, rl.Color(7, 18, 26, 235)) + rl.draw_circle_lines(int(center.x), int(center.y), 12.0, rl.Color(255, 255, 255, 150)) + texture = self._destination_texture() + if texture is not None: + src = rl.Rectangle(0, 0, float(texture.width), float(texture.height)) + # counter-rotate about its own center so the flag stays upright in heading-up + dst = rl.Rectangle(center.x, center.y, 18, 22) + rl.draw_texture_pro(texture, src, dst, rl.Vector2(9, 11), self.display_bearing, rl.WHITE) + + ego_x, ego_y = project_nav_point( + self.current_latitude, + self.current_longitude, + self.display_center_latitude, + self.display_center_longitude, + self.display_zoom, + 0.0, + map_rect.width, + map_rect.height, + ) + self._draw_ego_arrow(map_rect.x + ego_x, map_rect.y + ego_y, self.bearing_deg) + + def _draw_maneuver_icon(self, tile: rl.Rectangle): + display_next_valid = self._display_next_valid() + texture = self._icon_texture() + if texture is not None and display_next_valid: + src = rl.Rectangle(0, 0, float(texture.width), float(texture.height)) + icon_side = min(tile.width, tile.height - 32) + dst = rl.Rectangle(tile.x + (tile.width - icon_side) * 0.5, tile.y, icon_side, icon_side) + rl.draw_texture_pro(texture, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE) + + distance_text = f"{self.next_distance:.0f} m" if display_next_valid and self.next_distance > 0 else "--" + distance_size = self._fit_text_size(self._micro_font, distance_text, tile.width - 22, 22, 16) + dist_width = measure_text_cached(self._micro_font, distance_text, distance_size).x + distance_color = rl.WHITE if display_next_valid else rl.Color(150, 163, 176, 200) + rl.draw_text_ex( + self._micro_font, + distance_text, + rl.Vector2(tile.x + (tile.width - dist_width) * 0.5, tile.y + tile.height - 30), + distance_size, + 0, + distance_color, + ) + + def _draw_split_header(self, rect: rl.Rectangle): + header_rect = rl.Rectangle(rect.x + 14, rect.y + 14, rect.width - 28, SPLIT_HEADER_HEIGHT - 20) + self._draw_glass_band(header_rect, 214) + + icon_tile = rl.Rectangle(header_rect.x + 18, header_rect.y + 18, 112, 112) + self._draw_maneuver_icon(icon_tile) + + display_next_valid = self._display_next_valid() + display_route_active = self._display_route_active() + distance_text = self._format_next_distance() + if display_next_valid and self.next_description: + title = self.next_description + elif display_route_active and self.destination_name: + title = self.destination_name + elif display_route_active: + title = "Route guidance" + else: + title = self.road_name or "Navigation" + + if display_next_valid and self.road_name: + sublabel = self.road_name + elif display_route_active: + sublabel = "Route active" + else: + sublabel = self.road_name or "Navigation standby" + + text_x = icon_tile.x + icon_tile.width + 22 + right_x = header_rect.x + header_rect.width - 22 + distance_size = self._fit_text_size(self._title_font, distance_text, 140, 42, 22) + distance_width = measure_text_cached(self._title_font, distance_text, distance_size).x + rl.draw_text_ex(self._title_font, distance_text, rl.Vector2(right_x - distance_width, header_rect.y + 22), distance_size, 0, rl.WHITE) + + title_max_width = max(160.0, right_x - text_x - 10) + title_size = self._fit_text_size(self._title_font, title, title_max_width, 34, 22) + title_lines = wrap_text(self._title_font, title, title_size, int(title_max_width))[:2] + for idx, line in enumerate(title_lines): + rl.draw_text_ex(self._title_font, line, rl.Vector2(text_x, header_rect.y + 24 + idx * (title_size + 2)), title_size, 0, rl.WHITE) + + sub_size = self._fit_text_size(self._micro_font, sublabel, title_max_width, 22, 18) + sub_y = header_rect.y + 30 + len(title_lines) * (title_size + 2) + rl.draw_text_ex(self._micro_font, sublabel, rl.Vector2(text_x, sub_y), sub_size, 0, rl.Color(179, 188, 201, 240)) + + def _draw_split_footer(self, rect: rl.Rectangle): + footer_rect = rl.Rectangle(rect.x + 14, rect.y + rect.height - SPLIT_FOOTER_HEIGHT - 14, rect.width - 28, SPLIT_FOOTER_HEIGHT) + self._draw_glass_band(footer_rect, 222) + + chips_y = footer_rect.y + 20 + chips_x = footer_rect.x + 20 + chips_gap = 12 + chip_width = (footer_rect.width - 40 - chips_gap * 2) / 3.0 + self._draw_stat_chip(rl.Rectangle(chips_x, chips_y, chip_width, 54), self._format_eta_clock(), "eta") + minutes_text = f"{self.time_remaining / 60.0:.1f} min" if self._display_route_active() and self.time_remaining > 0.0 else "--" + self._draw_stat_chip(rl.Rectangle(chips_x + chip_width + chips_gap, chips_y, chip_width, 54), minutes_text, "time") + self._draw_stat_chip(rl.Rectangle(chips_x + (chip_width + chips_gap) * 2, chips_y, chip_width, 54), self._format_remaining_distance(), "left") + + def _draw_info_panel(self, panel_rect: rl.Rectangle): + info_rect = rl.Rectangle(panel_rect.x + 14, panel_rect.y + MAP_HEIGHT + 26, panel_rect.width - 28, panel_rect.height - MAP_HEIGHT - 40) + rl.draw_rectangle_rounded(info_rect, 0.08, 12, rl.Color(8, 14, 20, 225)) + + icon_tile = rl.Rectangle(info_rect.x + 16, info_rect.y + 16, 124, 124) + self._draw_maneuver_icon(icon_tile) + + display_next_valid = self._display_next_valid() + display_route_active = self._display_route_active() + + if display_next_valid and self.next_description: + title = self.next_description + elif display_route_active and self.destination_name: + title = self.destination_name + elif display_route_active: + title = "Route guidance" + else: + title = self.road_name or "Navigation" + title_x = info_rect.x + 162 + title_max_width = info_rect.width - 178 + title_size = self._fit_text_size(self._title_font, title, title_max_width, 34, 24) + title_lines = wrap_text(self._title_font, title, title_size, int(title_max_width))[:2] + for idx, line in enumerate(title_lines): + rl.draw_text_ex(self._title_font, line, rl.Vector2(title_x, info_rect.y + 18 + idx * (title_size + 2)), title_size, 0, rl.WHITE) + + if display_next_valid and self.road_name: + road_label = self.road_name + elif display_route_active: + road_label = "Route active" + else: + road_label = self.road_name or "No active route" + road_size = self._fit_text_size(self._micro_font, road_label, title_max_width, 22, 18) + road_y = info_rect.y + 18 + len(title_lines) * (title_size + 2) + 8 + rl.draw_text_ex(self._micro_font, road_label, rl.Vector2(title_x, road_y), road_size, 0, rl.Color(171, 184, 196, 240)) + + eta_text = f"{(self.time_remaining / 60.0):.1f} min" if display_route_active and self.time_remaining > 0 else "--" + remaining_text = f"{(self.distance_remaining / 1000.0):.1f} km" if display_route_active and self.distance_remaining > 0 else "--" + next_text = f"{self.next_distance:.0f} m" if display_next_valid and self.next_distance > 0 else "--" + + stat_y = info_rect.y + info_rect.height - 58 + available_width = info_rect.width - 178 + chip_width = (available_width - STAT_GAP * 2) / 3.0 + self._draw_stat_chip(rl.Rectangle(title_x, stat_y, chip_width, 50), next_text, "next") + self._draw_stat_chip(rl.Rectangle(title_x + chip_width + STAT_GAP, stat_y, chip_width, 50), eta_text, "eta") + self._draw_stat_chip(rl.Rectangle(title_x + (chip_width + STAT_GAP) * 2, stat_y, chip_width, 50), remaining_text, "left") + + def _draw_stat_chip(self, rect: rl.Rectangle, value: str, label: str): + rl.draw_rectangle_rounded(rect, 0.24, 10, rl.Color(18, 30, 42, 255)) + value_size = self._fit_text_size(self._body_font, value, rect.width - 16, 25, 17) + label_size = self._fit_text_size(self._micro_font, label.upper(), rect.width - 16, 12, 9) + value_width = measure_text_cached(self._body_font, value, value_size).x + label_width = measure_text_cached(self._micro_font, label.upper(), label_size).x + rl.draw_text_ex( + self._body_font, + value, + rl.Vector2(rect.x + (rect.width - value_width) * 0.5, rect.y + 3), + value_size, + 0, + rl.WHITE, + ) + rl.draw_text_ex( + self._micro_font, + label.upper(), + rl.Vector2(rect.x + (rect.width - label_width) * 0.5, rect.y + 33), + label_size, + 0, + rl.Color(122, 205, 161, 255), + ) + + def _draw_panel_contents(self, panel_rect: rl.Rectangle) -> None: + """Draw the full onroad panel into the given rect. Rect origin is (0,0) when rendering into + the cache texture, or the real screen position on the direct-draw fallback.""" + self._draw_card(panel_rect) + + map_rect = rl.Rectangle(panel_rect.x + 12, panel_rect.y + 12, panel_rect.width - 24, MAP_HEIGHT) + self._map_viewport_width = map_rect.width + self._map_viewport_height = map_rect.height + self._draw_map_surface(map_rect) + + self._draw_provider_badge(map_rect) + self._draw_info_panel(panel_rect) + + def _ensure_rt(self, attr: str, width: int, height: int): + rt = getattr(self, attr) + if rt is None: + try: + rt = rl.load_render_texture(width, height) + rl.set_texture_filter(rt.texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) + setattr(self, attr, rt) + except Exception: + setattr(self, attr, None) + return None + return rt + + def _chrome_content_key(self): + # Every piece of state that _draw_provider_badge + _draw_info_panel turn into pixels. + return ( + round(self.next_distance), self.next_direction, self.next_type, bool(self.next_valid), + self.next_description, self.destination_name, + round(self.time_remaining), round(self.distance_remaining), + bool(self.nav_active), self.road_name, len(self.route_points), + self._mapbox.status(), self._offline.status(), + self._mapbox.has_content(), self._offline.has_content(), + self._online_maps_enabled, self._offline_maps_enabled, self._day_mode, + bool(ui_state.is_metric), + ) + + @staticmethod + def _blit_rt(rt, x: float, y: float) -> None: + # RenderTexture color buffers are stored bottom-up, so flip vertically via negative src height. + tex = rt.texture + src = rl.Rectangle(0, 0, float(tex.width), -float(tex.height)) + dst = rl.Rectangle(float(x), float(y), float(tex.width), float(tex.height)) + rl.draw_texture_pro(tex, src, dst, rl.Vector2(0, 0), 0.0, rl.WHITE) + + def _render(self, rect: rl.Rectangle): + if not self.active or not gui_app.big_ui(): + return + + panel_x = rect.x + rect.width - PANEL_WIDTH - PANEL_MARGIN_RIGHT + panel_y = rect.y + PANEL_MARGIN_TOP + map_w = float(PANEL_WIDTH - 24) + map_h = float(MAP_HEIGHT) + + map_rt = self._ensure_rt("_map_rt", int(map_w), int(map_h)) + chrome_rt = self._ensure_rt("_chrome_rt", int(PANEL_WIDTH + PANEL_SHADOW_PAD), int(PANEL_HEIGHT + PANEL_SHADOW_PAD)) + if map_rt is None or chrome_rt is None: + # RenderTexture unavailable — fall back to direct per-frame draw (previous behavior). + self._draw_panel_contents(rl.Rectangle(panel_x, panel_y, PANEL_WIDTH, PANEL_HEIGHT)) + return + + now = time.monotonic() + self._map_viewport_width = map_w + self._map_viewport_height = map_h + + # LIVE map layer: tiles/route/ego pan continuously -> refresh at PANEL_RENDER_FPS. + if now - self._last_map_render >= PANEL_RENDER_INTERVAL: + self._last_map_render = now + rl.begin_texture_mode(map_rt) + rl.clear_background(rl.Color(0, 0, 0, 0)) + self._draw_map_surface(rl.Rectangle(0.0, 0.0, map_w, map_h)) + rl.end_texture_mode() + + # CHROME layer: badge + info text only change on value updates. Regenerate on a content-key + # change, with a safety cap so a missed key field can't freeze the readout. + key = self._chrome_content_key() + if key != self._chrome_key or now - self._last_chrome_render >= CHROME_MAX_INTERVAL: + self._chrome_key = key + self._last_chrome_render = now + rl.begin_texture_mode(chrome_rt) + rl.clear_background(rl.Color(0, 0, 0, 0)) + self._draw_provider_badge(rl.Rectangle(12.0, 12.0, map_w, map_h)) + self._draw_info_panel(rl.Rectangle(0.0, 0.0, PANEL_WIDTH, PANEL_HEIGHT)) + rl.end_texture_mode() + + # Composite: static card backdrop -> live map -> chrome text overlay. + self._draw_card(rl.Rectangle(panel_x, panel_y, PANEL_WIDTH, PANEL_HEIGHT)) + self._blit_rt(map_rt, panel_x + 12, panel_y + 12) + self._blit_rt(chrome_rt, panel_x, panel_y) + + def render_split_direct(self, rect: rl.Rectangle) -> None: + local_rect = rl.Rectangle(rect.x, rect.y, rect.width, rect.height) + map_rect = rl.Rectangle(rect.x + 8, rect.y + 8, rect.width - 16, rect.height - 16) + self._map_viewport_width = map_rect.width + self._map_viewport_height = map_rect.height + self._draw_panel_shell(local_rect) + self._draw_map_surface(map_rect, draw_fade=False) + self._draw_provider_badge(map_rect) + self._draw_split_header(local_rect) + self._draw_split_footer(local_rect) + + def render_split(self, rect: rl.Rectangle) -> None: + self.render_split_direct(rect) diff --git a/iqpilot/ui/onroad/nav_map_utils.py b/iqpilot/ui/onroad/nav_map_utils.py new file mode 100644 index 000000000..0d4d3a4cf --- /dev/null +++ b/iqpilot/ui/onroad/nav_map_utils.py @@ -0,0 +1,170 @@ +import math +from urllib.parse import quote + +EARTH_RADIUS_M = 6378137.0 +TILE_SIZE = 256.0 +NAV_DRIVE_ZOOM_BOOST = 1.0 + +def _mercator_normalized(latitude: float, longitude: float) -> tuple[float, float]: + x = (longitude + 180.0) / 360.0 + siny = min(max(math.sin(math.radians(latitude)), -0.9999), 0.9999) + y = 0.5 - math.log((1.0 + siny) / (1.0 - siny)) / (4.0 * math.pi) + return x, y + +def mercator_world_px(latitude: float, longitude: float, zoom: float) -> tuple[float, float]: + world_size = TILE_SIZE * (2.0 ** zoom) + nx, ny = _mercator_normalized(latitude, longitude) + x = nx * world_size + y = ny * world_size + return x, y + +def destination_point(latitude: float, longitude: float, bearing_deg: float, distance_m: float) -> tuple[float, float]: + if abs(distance_m) < 1e-3: + return latitude, longitude + + angular_distance = distance_m / EARTH_RADIUS_M + bearing = math.radians(bearing_deg) + lat1 = math.radians(latitude) + lon1 = math.radians(longitude) + + sin_lat1 = math.sin(lat1) + cos_lat1 = math.cos(lat1) + sin_ad = math.sin(angular_distance) + cos_ad = math.cos(angular_distance) + + lat2 = math.asin(sin_lat1 * cos_ad + cos_lat1 * sin_ad * math.cos(bearing)) + lon2 = lon1 + math.atan2( + math.sin(bearing) * sin_ad * cos_lat1, + cos_ad - sin_lat1 * math.sin(lat2), + ) + return math.degrees(lat2), math.degrees(lon2) + +def fit_zoom_for_points(points, width: float, height: float, max_zoom: float = 17.6, + min_zoom: float = 12.8, padding: float = 56.0) -> float: + coords = [(float(point.latitude), float(point.longitude)) for point in points if point is not None] + if len(coords) < 2: + return max_zoom + + xs, ys = zip(*[_mercator_normalized(lat, lon) for lat, lon in coords]) + span_x = max(max(xs) - min(xs), 1e-6) + span_y = max(max(ys) - min(ys), 1e-6) + + usable_width = max(width - 2.0 * padding, 32.0) + usable_height = max(height - 2.0 * padding, 32.0) + zoom_x = math.log2(usable_width / (TILE_SIZE * span_x)) + zoom_y = math.log2(usable_height / (TILE_SIZE * span_y)) + return max(min(min(zoom_x, zoom_y), max_zoom), min_zoom) + +def choose_nav_camera(current_latitude: float, current_longitude: float, bearing_deg: float, points, + width: float, height: float, preferred_zoom: float) -> tuple[float, float, float]: + preferred_zoom += NAV_DRIVE_ZOOM_BOOST + zoom = preferred_zoom + if points: + zoom = fit_zoom_for_points(points, width, height * 0.78, max_zoom=preferred_zoom + 0.6) + zoom = min(max(zoom, preferred_zoom - 1.2), preferred_zoom + 0.6) + + meters_per_pixel = 156543.03392 * math.cos(math.radians(current_latitude)) / (2.0 ** zoom) + lookahead_pixels = height * 0.16 + lookahead_m = max(lookahead_pixels * meters_per_pixel, 12.0) + center_latitude, center_longitude = destination_point(current_latitude, current_longitude, bearing_deg, lookahead_m) + return center_latitude, center_longitude, zoom + +def build_mapbox_static_url(latitude: float, longitude: float, zoom: float, bearing: float, + width: int, height: int, points=None) -> str: + overlay = "" + if points: + overlay = f"path-7+34d17a-0.85({encode_polyline(points)})/" + return ( + f"https://api.mapbox.com/styles/v1/mapbox/navigation-night-v1/static/" + f"{overlay}{longitude:.6f},{latitude:.6f},{zoom:.2f},{bearing:.1f},0/{width}x{height}@2x" + ) + +def build_mapbox_tile_url(z: int, x: int, y: int, tile_size: int = 256, scale: int = 2, + style: str = "navigation-night-v1") -> str: + suffix = f"@{scale}x" if scale > 1 else "" + return ( + f"https://api.mapbox.com/styles/v1/mapbox/{style}/tiles/" + f"{tile_size}/{z}/{x}/{y}{suffix}" + ) + +def tile_world_size(z: int, tile_size: int = 256) -> int: + return tile_size * (2 ** z) + +def mercator_world_px_at_zoom(latitude: float, longitude: float, z: int, tile_size: int = 256) -> tuple[float, float]: + world_size = tile_world_size(z, tile_size) + nx, ny = _mercator_normalized(latitude, longitude) + return nx * world_size, ny * world_size + +def encode_polyline(points) -> str: + result = [] + last_lat = 0 + last_lon = 0 + + for point in points: + lat = int(round(float(point.latitude if hasattr(point, "latitude") else point[0]) * 1e5)) + lon = int(round(float(point.longitude if hasattr(point, "longitude") else point[1]) * 1e5)) + + for value in (lat - last_lat, lon - last_lon): + shifted = ~(value << 1) if value < 0 else (value << 1) + while shifted >= 0x20: + result.append(chr((0x20 | (shifted & 0x1f)) + 63)) + shifted >>= 5 + result.append(chr(shifted + 63)) + + last_lat = lat + last_lon = lon + + return quote("".join(result), safe="") + +def project_nav_point(latitude: float, longitude: float, center_latitude: float, center_longitude: float, + zoom: float, bearing_deg: float, width: float, height: float, + anchor_x: float = 0.5, anchor_y: float = 0.5) -> tuple[float, float]: + px, py = mercator_world_px(latitude, longitude, zoom) + cx, cy = mercator_world_px(center_latitude, center_longitude, zoom) + dx = px - cx + dy = py - cy + + theta = math.radians(bearing_deg) + cos_theta = math.cos(theta) + sin_theta = math.sin(theta) + rx = dx * cos_theta + dy * sin_theta + ry = -dx * sin_theta + dy * cos_theta + return width * anchor_x + rx, height * anchor_y + ry + +def project_nav_polyline(points, center_latitude: float, center_longitude: float, zoom: float, bearing_deg: float, + width: float, height: float, anchor_x: float = 0.5, anchor_y: float = 0.5) -> list[tuple[float, float]]: + projected = [] + for point in points: + projected.append( + project_nav_point( + float(point.latitude), + float(point.longitude), + center_latitude, + center_longitude, + zoom, + bearing_deg, + width, + height, + anchor_x=anchor_x, + anchor_y=anchor_y, + ) + ) + return projected + +def solar_elevation_deg(latitude: float, longitude: float, unix_time: float) -> float: + days = unix_time / 86400.0 - 10957.5 + mean_longitude = math.radians((280.460 + 0.9856474 * days) % 360.0) + mean_anomaly = math.radians((357.528 + 0.9856003 * days) % 360.0) + ecliptic_longitude = mean_longitude + math.radians(1.915) * math.sin(mean_anomaly) \ + + math.radians(0.020) * math.sin(2.0 * mean_anomaly) + obliquity = math.radians(23.439 - 0.0000004 * days) + declination = math.asin(math.sin(obliquity) * math.sin(ecliptic_longitude)) + right_ascension = math.atan2(math.cos(obliquity) * math.sin(ecliptic_longitude), math.cos(ecliptic_longitude)) + gmst_deg = (280.46061837 + 360.98564736629 * days) % 360.0 + hour_angle = math.radians(gmst_deg) + math.radians(longitude) - right_ascension + lat_rad = math.radians(latitude) + elevation = math.asin( + math.sin(lat_rad) * math.sin(declination) + + math.cos(lat_rad) * math.cos(declination) * math.cos(hour_angle) + ) + return math.degrees(elevation) diff --git a/iqpilot/ui/onroad/offline_tiles.py b/iqpilot/ui/onroad/offline_tiles.py new file mode 100644 index 000000000..75d944bb1 --- /dev/null +++ b/iqpilot/ui/onroad/offline_tiles.py @@ -0,0 +1,257 @@ +import os +import json +import time +from typing import Any +from pathlib import Path + +try: + import sqlite3 +except Exception: + sqlite3 = None + +OFFLINE_MBTILES_ENV = "IQPILOT_OFFLINE_MBTILES" +OFFLINE_TILE_ROOT_ENV = "IQPILOT_OFFLINE_TILE_ROOT" +DEFAULT_OFFLINE_TILE_ROOT = Path("/data/offline_maps/tiles" if Path("/data").exists() else "/tmp/offline_maps/tiles") +DEFAULT_OFFLINE_MAP_ROOT = Path("/data/offline_maps" if Path("/data").exists() else "/tmp/offline_maps") +SQLITE_ERRORS = (sqlite3.Error,) if sqlite3 is not None else (Exception,) +SQLiteConnection = Any + +def offline_tile_root() -> Path: + override = os.getenv(OFFLINE_TILE_ROOT_ENV) + return Path(override) if override else DEFAULT_OFFLINE_TILE_ROOT + +def offline_map_root() -> Path: + root = offline_tile_root() + if root.name == "tiles": + return root.parent + if root.name == "xyz": + return root.parent.parent if root.parent.name == "tiles" else root.parent + return DEFAULT_OFFLINE_MAP_ROOT + +def _parse_bounds(bounds: str) -> tuple[float, float, float, float] | None: + try: + min_lon, min_lat, max_lon, max_lat = [float(part) for part in bounds.split(",")] + except (ValueError, AttributeError): + return None + return min_lat, min_lon, max_lat, max_lon + +def _bounds_contains(bounds: tuple[float, float, float, float], latitude: float, longitude: float) -> bool: + min_lat, min_lon, max_lat, max_lon = bounds + return min_lat <= latitude <= max_lat and min_lon <= longitude <= max_lon + +def _bounds_area(bounds: tuple[float, float, float, float]) -> float: + min_lat, min_lon, max_lat, max_lon = bounds + return max(max_lat - min_lat, 0.0) * max(max_lon - min_lon, 0.0) + +_region_bounds_cache: dict[Path, tuple[float, float, float, float]] = {} + +def _load_region_bounds(region_root: Path) -> tuple[float, float, float, float] | None: + cached = _region_bounds_cache.get(region_root) + if cached is not None: + return cached + bounds = _load_region_bounds_uncached(region_root) + if bounds is not None: + if len(_region_bounds_cache) > 64: + _region_bounds_cache.clear() + _region_bounds_cache[region_root] = bounds + return bounds + +def _load_region_bounds_uncached(region_root: Path) -> tuple[float, float, float, float] | None: + manifest_path = region_root / "manifest.json" + if manifest_path.exists(): + try: + manifest = json.loads(manifest_path.read_text()) + bounds = manifest.get("mbtiles", {}).get("bounds") + parsed = _parse_bounds(bounds) if bounds else None + if parsed is not None: + return parsed + except (OSError, json.JSONDecodeError): + pass + + mbtiles_path = region_root / "tiles" / "offline.mbtiles" + if not mbtiles_path.exists(): + return None + + try: + conn = open_mbtiles(mbtiles_path) + row = conn.execute("SELECT value FROM metadata WHERE name = 'bounds'").fetchone() + conn.close() + except SQLITE_ERRORS: + return None + + return _parse_bounds(row["value"]) if row is not None else None + +_REGION_ROOTS_TTL_S = 15.0 +_region_roots_cache: tuple[float, Path, tuple[Path, ...]] | None = None + +def _candidate_region_roots() -> tuple[Path, ...]: + global _region_roots_cache + root = offline_map_root() + now = time.monotonic() + if _region_roots_cache is not None: + cached_at, cached_root, cached = _region_roots_cache + if cached_root == root and now - cached_at < _REGION_ROOTS_TTL_S: + return cached + + candidates: list[Path] = [] + if (root / "tiles").exists(): + candidates.append(root) + + regions_root = root / "regions" + if regions_root.exists(): + for child in sorted(regions_root.iterdir()): + if child.is_dir() and (child / "tiles").exists(): + candidates.append(child) + + result = tuple(candidates) + _region_roots_cache = (now, root, result) + return result + +def _region_covers_point(region_root: Path, latitude: float, longitude: float) -> bool: + mb = region_root / "tiles" / "offline.mbtiles" + if not mb.exists(): + return True + try: + conn = open_mbtiles(mb) + try: + _, max_zoom = mbtiles_zoom_bounds(conn) + z = max_zoom if max_zoom is not None else 14 + import math + n = 2 ** z + lat_r = math.radians(max(min(latitude, 85.05112878), -85.05112878)) + x = int((longitude + 180.0) / 360.0 * n) + y = int((1.0 - math.asinh(math.tan(lat_r)) / math.pi) / 2.0 * n) + for dx in (-1, 0, 1): + for dy in (-1, 0, 1): + if load_raster_tile_blob(conn, z, x + dx, y + dy) is not None: + return True + return False + finally: + conn.close() + except SQLITE_ERRORS: + return True + +def find_offline_region_root(latitude: float | None = None, longitude: float | None = None) -> Path | None: + candidates = _candidate_region_roots() + if not candidates: + return None + + if latitude is None or longitude is None: + return candidates[0] + + bounded: list[tuple[float, Path]] = [] + for candidate in candidates: + bounds = _load_region_bounds(candidate) + if bounds is None: + continue + if _bounds_contains(bounds, latitude, longitude): + bounded.append((_bounds_area(bounds), candidate)) + + if bounded: + if len(bounded) == 1: + return bounded[0][1] + bounded.sort(key=lambda item: item[0]) + for _, candidate in bounded: + if _region_covers_point(candidate, latitude, longitude): + return candidate + return bounded[0][1] + + return candidates[0] + +def find_offline_mbtiles_path(latitude: float | None = None, longitude: float | None = None, + day: bool = False) -> Path | None: + explicit = os.getenv(OFFLINE_MBTILES_ENV) + if explicit: + path = Path(explicit) + if day: + day_path = path.with_name("offline_day.mbtiles") + if day_path.exists(): + return day_path + return path if path.exists() else None + + region_root = find_offline_region_root(latitude, longitude) + if region_root is None: + return None + + if day: + day_preferred = region_root / "tiles" / "offline_day.mbtiles" + if day_preferred.exists(): + return day_preferred + + preferred = region_root / "tiles" / "offline.mbtiles" + if preferred.exists(): + return preferred + + matches = sorted(p for p in (region_root / "tiles").glob("*.mbtiles") if "_day" not in p.name or day) + return matches[0] if matches else None + +def find_offline_xyz_root(latitude: float | None = None, longitude: float | None = None) -> Path | None: + root = offline_tile_root() + if not root.exists(): + region_root = find_offline_region_root(latitude, longitude) + if region_root is None: + return None + root = region_root / "tiles" + + if any(child.is_dir() and child.name.isdigit() for child in root.iterdir()): + return root + + xyz_dir = root / "xyz" + if xyz_dir.exists() and any(child.is_dir() and child.name.isdigit() for child in xyz_dir.iterdir()): + return xyz_dir + + return None + +def xyz_to_tms_y(z: int, y: int) -> int: + return (2 ** z - 1) - y + +def open_mbtiles(path: Path) -> SQLiteConnection: + if sqlite3 is None: + raise RuntimeError("sqlite3 unavailable") + conn = sqlite3.connect(f"file:{path}?mode=ro", uri=True, check_same_thread=False) + conn.row_factory = sqlite3.Row + return conn + +def mbtiles_is_raster(conn: SQLiteConnection) -> bool: + row = conn.execute("SELECT value FROM metadata WHERE name = 'format'").fetchone() + if row is None: + return False + return row["value"] in {"png", "jpg", "jpeg", "webp"} + +def mbtiles_zoom_bounds(conn: SQLiteConnection) -> tuple[int | None, int | None]: + rows = { + row["name"]: row["value"] + for row in conn.execute("SELECT name, value FROM metadata WHERE name IN ('minzoom', 'maxzoom')") + } + min_zoom = int(rows["minzoom"]) if "minzoom" in rows else None + max_zoom = int(rows["maxzoom"]) if "maxzoom" in rows else None + return min_zoom, max_zoom + +def xyz_zoom_bounds(root: Path) -> tuple[int | None, int | None]: + zoom_dirs = sorted( + int(child.name) + for child in root.iterdir() + if child.is_dir() and child.name.isdigit() + ) + if not zoom_dirs: + return None, None + return zoom_dirs[0], zoom_dirs[-1] + +def load_raster_tile_blob(conn: SQLiteConnection, z: int, x: int, y: int) -> bytes | None: + row = conn.execute( + """ + SELECT tile_data + FROM tiles + WHERE zoom_level = ? AND tile_column = ? AND tile_row = ? + """, + (z, x, xyz_to_tms_y(z, y)), + ).fetchone() + return bytes(row["tile_data"]) if row is not None else None + +def load_raster_xyz_tile_blob(root: Path, z: int, x: int, y: int) -> bytes | None: + for suffix in ("png", "webp", "jpg", "jpeg"): + for filename in (f"{y}.{suffix}", f"{y}@2x.{suffix}"): + tile_path = root / str(z) / str(x) / filename + if tile_path.exists(): + return tile_path.read_bytes() + return None diff --git a/iqpilot/ui/onroad/soft_warning.py b/iqpilot/ui/onroad/soft_warning.py new file mode 100644 index 000000000..02324245d --- /dev/null +++ b/iqpilot/ui/onroad/soft_warning.py @@ -0,0 +1,50 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +import pyray as rl +from iqpilot.cereal import log + +from iqpilot.selfdrive.ui import UI_BORDER_SIZE +from iqpilot.selfdrive.ui.ui_state import ui_state +from iqpilot.selfdrive.ui.onroad.driver_state import BTN_SIZE +from iqpilot.system.ui.lib.application import gui_app + +EventName = log.OnroadEvent.EventName +SOFT_WARNING_EVENTS = { + EventName.commIssue, + EventName.commIssueAvgFreq, + EventName.selfdrivedLagging, +} +ICON_SIZE = 96 +_SPEED_BOX_X_OFFSET = 60 +_SPEED_BOX_Y_OFFSET = 45 +_SPEED_BOX_WIDTH = 180 +_SPEED_BOX_HEIGHT = 228 + +_DM_OFFSET = UI_BORDER_SIZE + BTN_SIZE // 2 + +class SoftWarningRenderer: + def __init__(self): + self._icon = gui_app.texture("icons_mici/offroad_alerts/orange_warning.png", ICON_SIZE, ICON_SIZE) + self._active = False + + def update(self) -> None: + sm = ui_state.sm + self._active = any(e.name in SOFT_WARNING_EVENTS for e in sm['onroadEvents']) + + def render(self, rect: rl.Rectangle) -> None: + if not self._active: + return + speed_cx = rect.x + _SPEED_BOX_X_OFFSET + _SPEED_BOX_WIDTH / 2 + speed_cy = rect.y + _SPEED_BOX_Y_OFFSET + _SPEED_BOX_HEIGHT / 2 + + dm_cx = rect.x + _DM_OFFSET + dm_cy = rect.y + rect.height - _DM_OFFSET + + mid_x = (speed_cx + dm_cx) / 2 + mid_y = (speed_cy + dm_cy) / 2 + + draw_x = int(mid_x - ICON_SIZE / 2) + draw_y = int(mid_y - ICON_SIZE / 2) + + rl.draw_texture(self._icon, draw_x, draw_y, rl.WHITE) diff --git a/iqpilot/ui/tests/test_big_model_status.py b/iqpilot/ui/tests/test_big_model_status.py new file mode 100644 index 000000000..46af2707a --- /dev/null +++ b/iqpilot/ui/tests/test_big_model_status.py @@ -0,0 +1,66 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/ + +The BIG (tici/tizi) and SMALL (mici) onroad source indicators share one +resolver (comma PR #38492 states, backend-aware label). Pin its truth table. +""" +from iqpilot.ui.onroad.big_model_status import SourceState, resolve_source + + +class _FakeParams: + def __init__(self, **flags): + self._flags = flags + + def get_bool(self, key: str) -> bool: + return bool(self._flags.get(key, False)) + + +def _resolve(engaged=False, **flags): + return resolve_source(_FakeParams(**flags), engaged) + + +def test_no_backend_enabled_is_hidden(): + assert _resolve() == ("", SourceState.HIDDEN) + + +def test_emac_label_is_mac(): + label, _ = _resolve(IQEmacEnabled=True, MacModelReachable=True, MacModelActive=True) + assert label == "MAC" + + +def test_egpu_label_is_gpu(): + label, _ = _resolve(IQEgpuEnabled=True, UsbGpuPresent=True, UsbGpuActive=True) + assert label == "GPU" + + +def test_emac_wins_when_both_enabled(): + label, _ = _resolve(IQEmacEnabled=True, IQEgpuEnabled=True, + MacModelReachable=True, UsbGpuPresent=True) + assert label == "MAC" + + +def test_egpu_states_mirror_emac(): + assert _resolve(IQEgpuEnabled=True)[1] == SourceState.HIDDEN # not present + assert _resolve(IQEgpuEnabled=True, UsbGpuPresent=True)[1] == SourceState.LOADING + assert _resolve(IQEgpuEnabled=True, UsbGpuPresent=True, UsbGpuActive=True)[1] == SourceState.ACTIVE + assert _resolve(IQEgpuEnabled=True, UsbGpuPresent=True, UsbGpuFailed=True)[1] == SourceState.FAILED + assert _resolve(engaged=True, IQEgpuEnabled=True, UsbGpuPresent=True, + UsbGpuFailed=True)[1] == SourceState.CROSSED + + +def test_emac_states(): + assert _resolve(IQEmacEnabled=True)[1] == SourceState.HIDDEN # unreachable + assert _resolve(IQEmacEnabled=True, MacModelReachable=True)[1] == SourceState.LOADING + assert _resolve(IQEmacEnabled=True, MacModelReachable=True, MacModelActive=True)[1] == SourceState.ACTIVE + assert _resolve(IQEmacEnabled=True, MacModelReachable=True, MacModelFailed=True)[1] == SourceState.FAILED + # engaged on small because big failed -> crossed + assert _resolve(engaged=True, IQEmacEnabled=True, MacModelReachable=True, + MacModelFailed=True)[1] == SourceState.CROSSED + # active always wins over a stale failed flag + assert _resolve(IQEmacEnabled=True, MacModelReachable=True, + MacModelActive=True, MacModelFailed=True)[1] == SourceState.ACTIVE + + +def test_failed_but_disconnected_is_hidden(): + # unplugged mid-drive: nothing to show, not a red/orange "failed" + assert _resolve(IQEmacEnabled=True, MacModelReachable=False, MacModelFailed=True)[1] == SourceState.HIDDEN diff --git a/iqpilot/ui/theme.py b/iqpilot/ui/theme.py new file mode 100644 index 000000000..a38906f0d --- /dev/null +++ b/iqpilot/ui/theme.py @@ -0,0 +1,102 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" + +import time +import pyray as rl + +try: + from iqpilot.common.params import Params +except ImportError: + Params = None + +REFRESH_INTERVAL = 2.0 + +DEFAULT_ACCENT_HEX = "#00FFF5" + + +def _hex_to_rgb(hex_str: str) -> tuple[int, int, int]: + h = hex_str.strip().lstrip("#") + if len(h) == 3: + h = h[0] * 2 + h[1] * 2 + h[2] * 2 + if len(h) != 6: + return (0x00, 0xFF, 0xF5) # fallback to default + try: + return (int(h[0:2], 16), int(h[2:4], 16), int(h[4:6], 16)) + except ValueError: + return (0x00, 0xFF, 0xF5) + + +def _darken(r: int, g: int, b: int, factor: float = 0.08) -> tuple[int, int, int]: + return (int(r * factor), int(g * factor), int(b * factor)) + + +class _NeonTheme: + def __init__(self): + self._params = Params() if Params else None + self._last_refresh: float = 0.0 + self._hex: str = DEFAULT_ACCENT_HEX + self._r, self._g, self._b = _hex_to_rgb(DEFAULT_ACCENT_HEX) + self._refresh() + + def _refresh(self): + self._last_refresh = time.monotonic() + if self._params is None: + return + try: + stored = self._params.get("UIAccentColor") + if stored and isinstance(stored, str) and stored.strip(): + self._hex = stored.strip() + self._r, self._g, self._b = _hex_to_rgb(self._hex) + except Exception: + pass + + def _maybe_refresh(self): + if time.monotonic() - self._last_refresh >= REFRESH_INTERVAL: + self._refresh() + + def glow(self, alpha: int = 255) -> rl.Color: + self._maybe_refresh() + return rl.Color(self._r, self._g, self._b, alpha) + + def glow_mid(self, alpha: int = 130) -> rl.Color: + self._maybe_refresh() + return rl.Color(self._r, self._g, self._b, alpha) + + def glow_outer(self, alpha: int = 45) -> rl.Color: + self._maybe_refresh() + return rl.Color(self._r, self._g, self._b, alpha) + + def bg(self) -> rl.Color: + self._maybe_refresh() + dr, dg, db = _darken(self._r, self._g, self._b, 0.08) + dr = max(dr, 0x0A) + dg = max(dg, 0x0A) + db = max(db, 0x0A) + return rl.Color(dr, dg, db, 255) + + def bg_pressed(self) -> rl.Color: + self._maybe_refresh() + dr, dg, db = _darken(self._r, self._g, self._b, 0.13) + dr = max(dr, 0x0D) + dg = max(dg, 0x0D) + db = max(db, 0x0D) + return rl.Color(dr, dg, db, 255) + + @property + def hex(self) -> str: + self._maybe_refresh() + return self._hex + + def set_accent(self, hex_color: str): + r, g, b = _hex_to_rgb(hex_color) + self._r, self._g, self._b = r, g, b + self._hex = "#" + hex_color.strip().lstrip("#").upper() + self._last_refresh = time.monotonic() + if self._params: + try: + self._params.put_nonblocking("UIAccentColor", self._hex) + except Exception: + pass + +NeonTheme = _NeonTheme() diff --git a/iqpilot/vehicle/__init__.py b/iqpilot/vehicle/__init__.py new file mode 100644 index 000000000..75a336dc1 --- /dev/null +++ b/iqpilot/vehicle/__init__.py @@ -0,0 +1,3 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" \ No newline at end of file diff --git a/iqpilot/vehicle/vehicle.py b/iqpilot/vehicle/vehicle.py new file mode 100644 index 000000000..afcecfca8 --- /dev/null +++ b/iqpilot/vehicle/vehicle.py @@ -0,0 +1,47 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from iqpilot.cereal import log +from iqdbc.car import structs +from iqdbc.car.chrysler.values import RAM_DT +from iqpilot.selfdrive.selfdrived.events import Events +from iqpilot.selfdrive.selfdrived.iq_events import IQEvents + +_E = log.OnroadEvent.EventName +_GEAR = structs.CarState.GearShifter +_RAM_STEER_FLOOR_MS = 14.5 + + +class VehicleEvents: + def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): + self.CP = CP + self.CP_IQ = CP_IQ + self._steer_floor_held = False + + def update(self, CS: structs.CarState, events: Events) -> IQEvents: + handler = self._BRAND_HANDLERS.get(self.CP.brand) + if handler is not None: + handler(self, CS, events) + return IQEvents() + + def _ram_steer_floor(self, CS: structs.CarState, events: Events) -> None: + if self.CP.carFingerprint in RAM_DT: + events.remove(_E.belowSteerSpeed) + if CS.vEgo >= self.CP.minEnableSpeed: + self._steer_floor_held = False + if self.CP.minEnableSpeed >= _RAM_STEER_FLOOR_MS and CS.gearShifter != _GEAR.drive: + self._steer_floor_held = True + if self._steer_floor_held: + events.add(_E.belowSteerSpeed) + + def _toyota_interceptor_resume(self, CS: structs.CarState, events: Events) -> None: + if not self.CP.openpilotLongitudinalControl: + return + stopped_and_coasting = CS.cruiseState.standstill and not CS.brakePressed + if stopped_and_coasting and self.CP_IQ.enableGasInterceptor: + events.remove(_E.resumeRequired) + + _BRAND_HANDLERS = { + 'chrysler': _ram_steer_floor, + 'toyota': _toyota_interceptor_resume, + } diff --git a/launch_chffrplus.sh b/launch_chffrplus.sh new file mode 100755 index 000000000..9dbb1cd3d --- /dev/null +++ b/launch_chffrplus.sh @@ -0,0 +1,285 @@ +#!/usr/bin/env bash + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" + +export HOME="${HOME:-/home/comma}" +export IQPILOT_PROPRIETARY_ROOT="$DIR/artifacts" +source "$DIR/launch_env.sh" +export PATH="/usr/local/venv/bin:$PATH" + +function agnos_version_allowed { + local current_version="$1" + local expected_version="$2" + local compat_version + + if [ "$current_version" = "$expected_version" ] || [[ "$current_version" = "$expected_version"-* ]]; then + return 0 + fi + + IFS=',' read -r -a compat_versions <<< "${AGNOS_COMPAT_VERSIONS:-}" + for compat_version in "${compat_versions[@]}"; do + compat_version="${compat_version// /}" + if [ -n "$compat_version" ] && [ "$current_version" = "$compat_version" ]; then + return 0 + fi + done + + return 1 +} + +function set_lite_hw() { + if grep -q "tici" /sys/firmware/devicetree/base/model 2>/dev/null; then + output=$(i2cget -y 0 0x10 0x00 2>/dev/null) + if [ -z "$output" ]; then + echo "C3 Lite hardware detected" + export LITE=1 + echo "1" > /tmp/lite_hw + fi + fi +} + +function install_iq_command() { + local rc_file="$HOME/.bashrc" + + [ -w "$HOME" ] || return 0 + touch "$rc_file" 2>/dev/null || return 0 + local rc_temp="${rc_file}.iq-tmp.$$" + awk '/^# >>> iq command/{skip=1} /^# <<< iq command/{skip=0; next} skip{next} + !/^alias op=.*tools\/op\.sh/ && !/^alias iq=.*tools\/iq\.sh/' "$rc_file" > "$rc_temp" || return 0 + mv "$rc_temp" "$rc_file" || return 0 + cat >> "$rc_file" <<'IQFN' +# >>> iq command (auto-managed, do not edit) >>> +unalias iq op 2>/dev/null +iq() { + local d="$PWD" + while [ "$d" != "/" ]; do + if [ -x "$d/iqpilot/tools/iq.sh" ] && { [ -f "$d/launch_iqpilot.sh" ] || [ -f "$d/launch_openpilot.sh" ]; }; then + "$d/iqpilot/tools/iq.sh" "$@"; return + fi + d="$(dirname "$d")" + done + for d in /data/iqpilot /data/openpilot; do + if [ -x "$d/iqpilot/tools/iq.sh" ] && { [ -f "$d/launch_iqpilot.sh" ] || [ -f "$d/launch_openpilot.sh" ]; }; then + "$d/iqpilot/tools/iq.sh" "$@"; return + fi + done + echo "iq: no IQ.Pilot checkout found (searched up from $PWD, then /data/iqpilot, /data/openpilot)" >&2 + return 1 +} +# <<< iq command (auto-managed) <<< +IQFN +} + +function agnos_init { + # TODO: move this to agnos + sudo rm -f /data/etc/NetworkManager/system-connections/*.nmmeta + + # set success flag for current boot slot + sudo abctl --set_success + + # TODO: do this without udev in AGNOS + # udev does this, but sometimes we startup faster + sudo chgrp gpu /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0 + sudo chmod 660 /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0 + + # iptables-nft fails on this kernel (no nf_tables module), breaking NM hotspot NAT rules + if [ "$(readlink /etc/alternatives/iptables)" != "/usr/sbin/iptables-legacy" ]; then + sudo mount -o remount,rw / + sudo ln -sf /usr/sbin/iptables-legacy /etc/alternatives/iptables + sudo ln -sf /usr/sbin/iptables-legacy-restore /etc/alternatives/iptables-restore + sudo ln -sf /usr/sbin/iptables-legacy-save /etc/alternatives/iptables-save + sudo mount -o remount,ro / + fi + + # Check if AGNOS update is required + CURRENT_AGNOS_VERSION=$(< /VERSION) + if ! agnos_version_allowed "$CURRENT_AGNOS_VERSION" "$AGNOS_VERSION"; then + AGNOS_PY="$DIR/iqpilot/system/hardware/tici/agnos.py" + MANIFEST="$DIR/iqpilot/system/hardware/tici/agnos.json" + if [ -f /sys/firmware/devicetree/base/model ]; then + DEVICE_MODEL="$(tr -d '\0' the updater picks updater_magic (DRM), which renders the on-screen + # progress prompt fine, so fall through and keep it. This mirrors the updater's own weston check. + if systemctl is-active --quiet weston-ready; then + if $AGNOS_PY --swap $MANIFEST; then + sudo reboot + fi + fi + $DIR/iqpilot/system/hardware/tici/updater $AGNOS_PY $MANIFEST + fi +} + +function launch { + # Remove orphaned git lock if it exists on boot + [ -f "$DIR/.git/index.lock" ] && rm -f $DIR/.git/index.lock + for server_dir in "$HOME/.cursor-server" "$HOME/.windsurf-server" "$HOME/.vscode-server"; do + [ -L "$server_dir" ] && unlink "$server_dir" + done + + install_iq_command + + # Check to see if there's a valid overlay-based update available. Conditions + # are as follows: + # + # 1. The DIR init file has to exist, with a newer modtime than anything in + # the DIR Git repo. This checks for local development work or the user + # switching branches/forks, which should not be overwritten. + # 2. The FINALIZED consistent file has to exist, indicating there's an update + # that completed successfully and synced to disk. + + if [ -f "${DIR}/.overlay_init" ]; then + find ${DIR}/.git -newer ${DIR}/.overlay_init | grep -q '.' 2> /dev/null + if [ $? -eq 0 ]; then + echo "${DIR} has been modified, skipping overlay update installation" + else + if [ -f "${STAGING_ROOT}/finalized/.overlay_consistent" ]; then + if [ ! -d /data/safe_staging/old_openpilot ]; then + echo "Valid overlay update found, installing" + LAUNCHER_LOCATION="${BASH_SOURCE[0]}" + + mv $DIR /data/safe_staging/old_openpilot + mv "${STAGING_ROOT}/finalized" $DIR + cd $DIR + + echo "Restarting launch script ${LAUNCHER_LOCATION}" + unset AGNOS_VERSION + exec "${LAUNCHER_LOCATION}" + else + echo "openpilot backup found, not updating" + # TODO: restore backup? This means the updater didn't start after swapping + fi + fi + fi + fi + + # Python env + proprietary runtime sync. Lives in artifacts/runtime/env_sync.sh so updated.py + # can run the identical steps at update-apply time (offroad, stack idle); by the + # time this runs at boot it is normally a warm no-op. Real work still lands here + # for local dev edits or a failed apply-time prep, under the boot spinner as before. + source "$DIR/artifacts/runtime/env_sync.sh" + sync_python_env || return 1 + if [ ! -f "$DIR/prebuilt" ] && [ ! -x "$DIR/.venv/bin/python3" ]; then + return 1 + fi + export PATH="$DIR/.venv/bin:$PATH" + + RUNTIME_COMPAT_ROOT="$DIR/.iqpilot/runtime_root" + mkdir -p "$RUNTIME_COMPAT_ROOT" + ln -sfn "$DIR/iqpilot" "$RUNTIME_COMPAT_ROOT/iqpilot" + ln -sfn iqpilot "$RUNTIME_COMPAT_ROOT/openpilot" + ln -sfn "$DIR/iqpilot/system" "$RUNTIME_COMPAT_ROOT/system" + + ln -sfn $(pwd) /data/pythonpath + export IQPILOT_SOURCE_ROOT="${IQPILOT_SOURCE_ROOT:-$DIR/iqpilot}" + export PYTHONSAFEPATH=1 + VERIFIED_PYTHON_ROOT="/usr/libexec/iqpilot/python" + IQPILOT_PYTHONPATH="$VENV_SITE_PACKAGES:$PWD" + if [ -d "$PWD/artifacts/package_runtime" ]; then + IQPILOT_PYTHONPATH="$PWD/artifacts/package_runtime:$IQPILOT_PYTHONPATH" + fi + if [ -d "$VERIFIED_PYTHON_ROOT" ]; then + export PYTHONPATH="$VERIFIED_PYTHON_ROOT:$IQPILOT_PYTHONPATH" + else + export PYTHONPATH="$IQPILOT_PYTHONPATH" + fi + + # Install independent systemd services BEFORE build so they run even + # when openpilot fails to compile — SSH/BLE/hephaestusd must always + # be reachable for device recovery. + for service_name in hephaestusd ble-transportd flockd; do + service_src="$DIR/iqpilot/system/${service_name}.service" + service_dst="/etc/systemd/system/${service_name}.service" + service_lib="/lib/systemd/system/${service_name}.service" + service_dropin="/run/systemd/system/${service_name}.service.d" + service_exec="$(grep '^ExecStart=' "$service_src")" + sudo mkdir -p "$service_dropin" + printf '[Service]\nWorkingDirectory=%s\nEnvironment="IQPILOT_SOURCE_ROOT=%s/iqpilot"\nEnvironment="IQPILOT_PROPRIETARY_ROOT=%s/artifacts"\nEnvironment="PYTHONPATH=%s"\nExecStart=\n%s\n' "$RUNTIME_COMPAT_ROOT" "$DIR" "$DIR" "$PYTHONPATH" "$service_exec" | sudo tee "$service_dropin/iqpilot-packages.conf" >/dev/null + sudo systemctl daemon-reload + if [ -f "$service_lib" ] && grep -q "/usr/libexec/iqpilot/iqpilot_bundle_runner" "$service_lib"; then + if [ -f "$service_dst" ]; then + sudo mount -o remount,rw / + sudo rm -f "$service_dst" + sudo systemctl daemon-reload + sudo mount -o remount,ro / + fi + sudo systemctl enable "${service_name}.service" + # --no-block: these units ExecStartPre-wait for the verified runtime. Blocking here + # made a missing runner stall the whole install for the unit's 600s timeout (x3 units). + if systemctl is-active --quiet "${service_name}.service"; then + sudo systemctl restart --no-block "${service_name}.service" + else + sudo systemctl start --no-block "${service_name}.service" + fi + elif [ -f "$service_src" ]; then + if [ ! -f "$service_dst" ] || ! cmp -s "$service_src" "$service_dst"; then + sudo mount -o remount,rw / + sudo cp "$service_src" "$service_dst" + sudo systemctl daemon-reload + sudo systemctl enable "${service_name}.service" + sudo mount -o remount,ro / + sudo systemctl restart --no-block "${service_name}.service" + elif ! systemctl is-active --quiet "${service_name}.service"; then + sudo systemctl start --no-block "${service_name}.service" + fi + fi + done + + # detect mr.one C3 Lite hardware + set_lite_hw + + # hardware specific init + if [ -f /AGNOS ]; then + agnos_init + + sudo "$DIR/iqpilot/system/hardware/tici/zram_setup.sh" || true + fi + + if [ -f "$DIR/artifacts/runtime/apply_boot_branding.py" ]; then + sudo python3 "$DIR/artifacts/runtime/apply_boot_branding.py" || true + fi + + # /home is an ephemeral overlay (resets each boot); re-inject the source line. best-effort + if [ -f "$DIR/iqpilot/tools/iqpilot/git-pretty.sh" ] && [ -w "$HOME/.bashrc" ]; then + grep -q 'iqpilot/git-pretty.sh' "$HOME/.bashrc" 2>/dev/null || \ + echo "[ -f $DIR/iqpilot/tools/iqpilot/git-pretty.sh ] && source $DIR/iqpilot/tools/iqpilot/git-pretty.sh" >> "$HOME/.bashrc" || true + fi + + # write tmux scrollback to a file + tmux capture-pane -pq -S-1000 > /tmp/launch_log + + # start manager + cd "$DIR/iqpilot/system/manager" + export PWD="$(pwd)" + MANAGER_PYTHON="$DIR/.venv/bin/python3" + if [ ! -f $DIR/prebuilt ]; then + if pkill -f /tmp/installer 2>/dev/null; then sleep 1; fi + "$MANAGER_PYTHON" ./build.py + for service_name in hephaestusd ble-transportd flockd; do + sudo systemctl restart --no-block "${service_name}.service" + done + else + MANAGER_PYTHON="/usr/local/venv/bin/python3" + fi + + "$MANAGER_PYTHON" ./manager.py + + # if broken, keep on screen error + while true; do sleep 1; done +} + +launch diff --git a/launch_env.sh b/launch_env.sh new file mode 100755 index 000000000..f43ee89e9 --- /dev/null +++ b/launch_env.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +export OMP_NUM_THREADS=1 +export MKL_NUM_THREADS=1 +export NUMEXPR_NUM_THREADS=1 +export OPENBLAS_NUM_THREADS=1 +export VECLIB_MAXIMUM_THREADS=1 + +# models get lower priority than ui +# - ui is ~5ms +# - modeld is 20ms +# - DM is 10ms +# in order to run ui at 60fps (16.67ms), we need to allow +# it to preempt the model workloads. we have enough +# headroom for this until ui is moved to the CPU. +export QCOM_PRIORITY=12 + +if [ -z "$AGNOS_VERSION" ]; then + DEVICE_MODEL="" + if [ -f /sys/firmware/devicetree/base/model ]; then + DEVICE_MODEL="$(tr -d '\0' =2.0", + + # body / webrtcd + "aiohttp", + "av", + "libdatachannel-py>=2026.1.0.dev2", + + # panda + "libusb1", + "spidev; platform_system == 'Linux'", + + # modeld + "onnx >= 1.14.0", + + # logging + "pyzmq", + "sentry-sdk", + "xattr ; sys_platform != 'win32'", # used in place of 'os.getxattr' for macOS compatibility + + # athena + "PyJWT", + "json-rpc", + "websocket_client", + + # acados deps + "casadi >=3.6.6", # 3.12 fixed in 3.6.6 + + # joystickd + "inputs", + + # these should be removed + "psutil", + "pycryptodome", # used in updated/casync, panda, body, and a test + "cryptography", # proprietary bundle signing / verification + "setproctitle", + + # logreader + "zstandard", + + # ui + "raylib > 5.5.0.3", + "pyzbar @ git+https://github.com/greatgitsby/op-dependencies.git@release-pyzbar#subdirectory=pyzbar ; sys_platform == 'linux'", + "qrcode", + "mapbox-earcut", + "jeepney", +] + +[project.optional-dependencies] +testing = [ + "coverage", + "hypothesis ==6.47.*", + "jinja2", + "ty", + "pytest", + "pytest-cpp", + "pytest-subtests", + # https://github.com/pytest-dev/pytest-xdist/pull/1229 + "pytest-xdist @ git+https://github.com/sshane/pytest-xdist@2b4372bd62699fb412c4fe2f95bf9f01bd2018da", + "pytest-timeout", + "pytest-asyncio", + "pytest-mock", + "pytest-repeat", + "ruff", + "codespell", + "pre-commit-hooks", +] + +dev = [ + "azure-identity", + "azure-storage-blob", + "dictdiffer", + "matplotlib", + "opencv-python-headless", + "parameterized >=0.8, <0.9", + "pyautogui", + "pywinctl", + "tabulate", +] + +tools = [ + "imgui @ git+https://git.konn3kt.com/IQ.Lvbs/dependencies.git@release-imgui#subdirectory=imgui", + "libusb @ git+https://git.konn3kt.com/IQ.Lvbs/dependencies.git@release-libusb#subdirectory=libusb", +] + +[project.urls] +Homepage = "https://konn3kt.com" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = [ + ".", +] + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.uv.extra-build-dependencies] +panda = [{ requirement = "iqdbc", match-runtime = true }] + +[tool.pytest.ini_options] +minversion = "6.0" +addopts = "--ignore=iqpilot/third_party -Werror --strict-config --strict-markers --durations=10" +pythonpath = ["."] +cpp_files = "test_*" +cpp_harness = ".venv/bin/python3 iqpilot/selfdrive/test/cpp_harness.py" +python_files = "test_*.py" +asyncio_default_fixture_loop_scope = "function" +xfail_strict = true +#timeout = "30" # you get this long by default +markers = [ + "car_ports: public car-port integration tests run in the dedicated parallel lane", + "linux: tests that require Linux services or IPC", + "model_validation: model compilation or inference validation excluded from the current matrix", + "release: tests that run against a release checkout", + "slow: tests that run in the dedicated ARM64 slow lane", + "tici: tests that are only meant to run on the C3/C3X", + "skip_tici_setup: mark test to skip tici setup fixture" +] +testpaths = [ + "iqpilot/common", + "iqpilot/selfdrive", + "iqpilot/system", + "iqpilot/tools", + "iqpilot/cereal", + "iqpilot", +] + +[tool.codespell] +quiet-level = 3 +# if you've got a short variable name that's getting flagged, add it here +ignore-words-list = "bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints,whit,indexIn,ws,uint,grey,deque,stdio,amin,BA,LITE,atEnd,UIs,errorString,arange,FocusIn,od,tim,relA,hist,copyable,jupyter,thead,TGE,abl,lite" +builtin = "clear,rare,informal,code,names,en-GB_to_en-US" +skip = "./iqpilot/third_party/*, *.po, uv.lock, *.onnx, ./iqpilot/cereal/gen/*, */c_generated_code/*, iqpilot/selfdrive/assets/offroad/mici_fcc.html, iqpilot/selfdrive/assets/*" + +# https://docs.astral.sh/ruff/configuration/#using-pyprojecttoml +[tool.ruff] +indent-width = 2 +lint.select = [ + "E", "F", "W", "PIE", "C4", "ISC", "A", "B", + "NPY", # numpy + "UP", # pyupgrade + "TRY203", "TRY400", "TRY401", # try/excepts + "RUF008", "RUF100", + "TID251", + "PLE", "PLR1704", +] +lint.ignore = [ + "E741", + "E402", + "C408", + "ISC003", + "B027", + "B024", + "NPY002", # new numpy random syntax is worse + "UP045", "UP007", # these don't play nice with raylib atm +] +line-length = 160 +target-version ="py311" +exclude = [ + "body", + "cereal", + "third_party", + "*.ipynb", + "generated", +] +lint.flake8-implicit-str-concat.allow-multiline = false + +[tool.ruff.lint.flake8-tidy-imports.banned-api] +"selfdrive".msg = "Use iqpilot.selfdrive" +"common".msg = "Use iqpilot.common" +"system".msg = "Use iqpilot.system" +"third_party".msg = "Use iqpilot.third_party" +"tools".msg = "Use iqpilot.tools" +"pytest.main".msg = "pytest.main requires special handling that is easy to mess up!" +"unittest".msg = "Use pytest" +"time.time".msg = "Use time.monotonic" + +# raylib banned APIs +"pyray.measure_text_ex".msg = "Use iqpilot.system.ui.lib.text_measure" +"pyray.is_mouse_button_pressed".msg = "This can miss events. Use Widget._handle_mouse_press" +"pyray.is_mouse_button_released".msg = "This can miss events. Use Widget._handle_mouse_release" +"pyray.draw_text".msg = "Use a function (such as rl.draw_font_ex) that takes font as an argument" + +[tool.ruff.format] +quote-style = "preserve" + +[tool.ty.src] +exclude = [ + "iqpilot/cereal/", + "iqpilot/third_party/", +] + +[tool.ty.rules] +# Ignore unresolved imports for Cython-compiled modules (.pyx) +unresolved-import = "ignore" +# Ignore unresolved attributes - many from capnp and Cython modules +unresolved-attribute = "ignore" +# Ignore invalid method overrides - signature variance issues +invalid-method-override = "ignore" +# Ignore possibly-missing-attribute - too many false positives +possibly-missing-attribute = "ignore" +# Ignore invalid assignment - often intentional monkey-patching +invalid-assignment = "ignore" +# Ignore no-matching-overload - numpy/ctypes overload matching issues +no-matching-overload = "ignore" +# Ignore invalid-argument-type - many false positives from raylib, ctypes, numpy +invalid-argument-type = "ignore" +# Ignore call-non-callable - false positives from dynamic types +call-non-callable = "ignore" +# Ignore unsupported-operator - false positives from dynamic types +unsupported-operator = "ignore" +# Ignore not-subscriptable - false positives from dynamic types +not-subscriptable = "ignore" +# not-iterable errors are now fixed diff --git a/uv.lock b/uv.lock new file mode 100644 index 000000000..1cfa0a740 --- /dev/null +++ b/uv.lock @@ -0,0 +1,4021 @@ +version = 1 +revision = 3 +requires-python = ">=3.12.3, <3.13" + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, + { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, + { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, + { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "av" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/f8/5adeeae0c42a7130933d168b8d84a21c98a32cb9fcf9222e2541ed0d9c7b/av-12.3.0.tar.gz", hash = "sha256:04b1892562aff3277efc79f32bd8f1d0cbb64ed011241cb3e96f9ad471816c22", size = 3833953, upload-time = "2024-07-21T04:02:43.708Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/c1/0636bccf5a1a2c935952614b9d34d8d8aae078c9773a60efb5376702f499/av-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5174e995772ebe33561980dca625f830aea8d39a4338728dedb41ae7dc2605af", size = 24669628, upload-time = "2024-07-21T04:00:58.643Z" }, + { url = "https://files.pythonhosted.org/packages/ef/7d/9126abdafe20fa73d2c19fd108450363253cfea283c350618cc1434f473c/av-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:028d8b40308536f740dace3efd0178eb96825b414897c9594fb74136532901cb", size = 19928928, upload-time = "2024-07-21T04:01:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/27/75/c1b9e0aa4bd0d8b8311f366b6b38f6c6600d66baddfe2888accc7f76b1f5/av-12.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030791ecc6185776d832d19ce196f61daf3e17e591a9bb6fd181280e1754138", size = 32793461, upload-time = "2024-07-21T04:01:04.62Z" }, + { url = "https://files.pythonhosted.org/packages/5a/06/1364c445f8a8ab4870f0f5c4530b496257ae09de7fa01b6108525abea8b9/av-12.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3703a35481fda5798a27bf6208c1ec3b61c18931625771fb3c9fd870539c7d7", size = 32217647, upload-time = "2024-07-21T04:01:07.549Z" }, + { url = "https://files.pythonhosted.org/packages/27/08/220d5a1ae7e7830d66d041c71e607c1f5df2e3598b12fb406b0d7c2defa7/av-12.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32f3eef56b2df289db6105f9fe2ebc9a8134a8adbd62190daeb8e22c4ff47794", size = 34746451, upload-time = "2024-07-21T04:01:10.506Z" }, + { url = "https://files.pythonhosted.org/packages/96/67/9f1c444864d4f3e3773100b9ed20e670f80d5575b7a8fd53cca20de9d681/av-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:62d036ee8321d67190887012c3dbcd1ad83248603cc29ea75fbb75835b8d6e6e", size = 25977611, upload-time = "2024-07-21T04:01:13.709Z" }, +] + +[[package]] +name = "azure-core" +version = "1.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/1b/e503e08e755ea94e7d3419c9242315f888fc664211c90d032e40479022bf/azure_core-1.38.0.tar.gz", hash = "sha256:8194d2682245a3e4e3151a667c686464c3786fed7918b394d035bdcd61bb5993", size = 363033, upload-time = "2026-01-12T17:03:05.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/d8/b8fcba9464f02b121f39de2db2bf57f0b216fe11d014513d666e8634380d/azure_core-1.38.0-py3-none-any.whl", hash = "sha256:ab0c9b2cd71fecb1842d52c965c95285d3cfb38902f6766e4a471f1cd8905335", size = 217825, upload-time = "2026-01-12T17:03:07.291Z" }, +] + +[[package]] +name = "azure-identity" +version = "1.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, + { name = "cryptography" }, + { name = "msal" }, + { name = "msal-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/8d/1a6c41c28a37eab26dc85ab6c86992c700cd3f4a597d9ed174b0e9c69489/azure_identity-1.25.1.tar.gz", hash = "sha256:87ca8328883de6036443e1c37b40e8dc8fb74898240f61071e09d2e369361456", size = 279826, upload-time = "2025-10-06T20:30:02.194Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/7b/5652771e24fff12da9dde4c20ecf4682e606b104f26419d139758cc935a6/azure_identity-1.25.1-py3-none-any.whl", hash = "sha256:e9edd720af03dff020223cd269fa3a61e8f345ea75443858273bcb44844ab651", size = 191317, upload-time = "2025-10-06T20:30:04.251Z" }, +] + +[[package]] +name = "azure-storage-blob" +version = "12.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, + { name = "cryptography" }, + { name = "isodate" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/24/072ba8e27b0e2d8fec401e9969b429d4f5fc4c8d4f0f05f4661e11f7234a/azure_storage_blob-12.28.0.tar.gz", hash = "sha256:e7d98ea108258d29aa0efbfd591b2e2075fa1722a2fae8699f0b3c9de11eff41", size = 604225, upload-time = "2026-01-06T23:48:57.282Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/3a/6ef2047a072e54e1142718d433d50e9514c999a58f51abfff7902f3a72f8/azure_storage_blob-12.28.0-py3-none-any.whl", hash = "sha256:00fb1db28bf6a7b7ecaa48e3b1d5c83bfadacc5a678b77826081304bd87d6461", size = 431499, upload-time = "2026-01-06T23:48:58.995Z" }, +] + +[[package]] +name = "casadi" +version = "3.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/62/1e98662024915ecb09c6894c26a3f497f4afa66570af3f53db4651fc45f1/casadi-3.7.2.tar.gz", hash = "sha256:b4d7bd8acdc4180306903ae1c9eddaf41be2a3ae2fa7154c57174ae64acdc60d", size = 6053600, upload-time = "2025-09-10T10:05:49.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/c8/689d085447b1966f42bdb8aa4fbebef49a09697dbee32ab02a865c17ac1b/casadi-3.7.2-cp312-none-macosx_10_13_x86_64.macosx_10_13_intel.whl", hash = "sha256:309ea41a69c9230390d349b0dd899c6a19504d1904c0756bef463e47fb5c8f9a", size = 47116756, upload-time = "2025-09-10T07:53:00.931Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c0/3c4704394a6fd4dfb2123a4fd71ba64a001f340670a3eba45be7a19ac736/casadi-3.7.2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6033381234db810b2247d16c6352e679a009ec4365d04008fc768866e011ed58", size = 42293718, upload-time = "2025-09-10T08:07:16.415Z" }, + { url = "https://files.pythonhosted.org/packages/f3/24/4cf05469ddf8544da5e92f359f96d716a97e7482999f085a632bc4ef344a/casadi-3.7.2-cp312-none-manylinux2014_aarch64.whl", hash = "sha256:732f2804d0766454bb75596339e4f2da6662ffb669621da0f630ed4af9e83d6a", size = 47276175, upload-time = "2025-09-10T08:08:09.29Z" }, + { url = "https://files.pythonhosted.org/packages/82/08/b5f57fea03128efd5c860673b6ac44776352e6c1af862b8177f4c503fffe/casadi-3.7.2-cp312-none-manylinux2014_i686.whl", hash = "sha256:cf17298ff0c162735bdf9bf72b765c636ae732130604017a3b52e26e35402857", size = 72430454, upload-time = "2025-09-10T08:09:10.781Z" }, + { url = "https://files.pythonhosted.org/packages/24/ab/d7233c915b12c005655437c6c4cf0ae46cbbb2b20d743cb5e4881ad3104a/casadi-3.7.2-cp312-none-manylinux2014_x86_64.whl", hash = "sha256:cde616930fa1440ad66f1850670399423edd37354eed9b12e74b3817b98d1187", size = 75568903, upload-time = "2025-09-10T08:10:07.108Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b9/5b984124f539656efdf079f3d8f09d73667808ec8d0546e6bce6dc60ade6/casadi-3.7.2-cp312-none-win_amd64.whl", hash = "sha256:81d677d2b020c1307c1eb25eae15686e5de199bb066828c3eaabdfaaaf457ffd", size = 50991347, upload-time = "2025-09-10T08:10:46.629Z" }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "codespell" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/e0/709453393c0ea77d007d907dd436b3ee262e28b30995ea1aa36c6ffbccaf/codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5", size = 344740, upload-time = "2025-01-28T18:52:39.411Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/01/b394922252051e97aab231d416c86da3d8a6d781eeadcdca1082867de64e/codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425", size = 344501, upload-time = "2025-01-28T18:52:37.057Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, +] + +[[package]] +name = "coverage" +version = "7.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/49/349848445b0e53660e258acbcc9b0d014895b6739237920886672240f84b/coverage-7.13.2.tar.gz", hash = "sha256:044c6951ec37146b72a50cc81ef02217d27d4c3640efd2640311393cbbf143d3", size = 826523, upload-time = "2026-01-25T13:00:04.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/39/e92a35f7800222d3f7b2cbb7bbc3b65672ae8d501cb31801b2d2bd7acdf1/coverage-7.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f106b2af193f965d0d3234f3f83fc35278c7fb935dfbde56ae2da3dd2c03b84d", size = 219142, upload-time = "2026-01-25T12:58:00.448Z" }, + { url = "https://files.pythonhosted.org/packages/45/7a/8bf9e9309c4c996e65c52a7c5a112707ecdd9fbaf49e10b5a705a402bbb4/coverage-7.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f45d21dc4d5d6bd29323f0320089ef7eae16e4bef712dff79d184fa7330af3", size = 219503, upload-time = "2026-01-25T12:58:02.451Z" }, + { url = "https://files.pythonhosted.org/packages/87/93/17661e06b7b37580923f3f12406ac91d78aeed293fb6da0b69cc7957582f/coverage-7.13.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fae91dfecd816444c74531a9c3d6ded17a504767e97aa674d44f638107265b99", size = 251006, upload-time = "2026-01-25T12:58:04.059Z" }, + { url = "https://files.pythonhosted.org/packages/12/f0/f9e59fb8c310171497f379e25db060abef9fa605e09d63157eebec102676/coverage-7.13.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:264657171406c114787b441484de620e03d8f7202f113d62fcd3d9688baa3e6f", size = 253750, upload-time = "2026-01-25T12:58:05.574Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b1/1935e31add2232663cf7edd8269548b122a7d100047ff93475dbaaae673e/coverage-7.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae47d8dcd3ded0155afbb59c62bd8ab07ea0fd4902e1c40567439e6db9dcaf2f", size = 254862, upload-time = "2026-01-25T12:58:07.647Z" }, + { url = "https://files.pythonhosted.org/packages/af/59/b5e97071ec13df5f45da2b3391b6cdbec78ba20757bc92580a5b3d5fa53c/coverage-7.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a0b33e9fd838220b007ce8f299114d406c1e8edb21336af4c97a26ecfd185aa", size = 251420, upload-time = "2026-01-25T12:58:09.309Z" }, + { url = "https://files.pythonhosted.org/packages/3f/75/9495932f87469d013dc515fb0ce1aac5fa97766f38f6b1a1deb1ee7b7f3a/coverage-7.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3becbea7f3ce9a2d4d430f223ec15888e4deb31395840a79e916368d6004cce", size = 252786, upload-time = "2026-01-25T12:58:10.909Z" }, + { url = "https://files.pythonhosted.org/packages/6a/59/af550721f0eb62f46f7b8cb7e6f1860592189267b1c411a4e3a057caacee/coverage-7.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f819c727a6e6eeb8711e4ce63d78c620f69630a2e9d53bc95ca5379f57b6ba94", size = 250928, upload-time = "2026-01-25T12:58:12.449Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b1/21b4445709aae500be4ab43bbcfb4e53dc0811c3396dcb11bf9f23fd0226/coverage-7.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4f7b71757a3ab19f7ba286e04c181004c1d61be921795ee8ba6970fd0ec91da5", size = 250496, upload-time = "2026-01-25T12:58:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b1/0f5d89dfe0392990e4f3980adbde3eb34885bc1effb2dc369e0bf385e389/coverage-7.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b7fc50d2afd2e6b4f6f2f403b70103d280a8e0cb35320cbbe6debcda02a1030b", size = 252373, upload-time = "2026-01-25T12:58:15.976Z" }, + { url = "https://files.pythonhosted.org/packages/01/c9/0cf1a6a57a9968cc049a6b896693faa523c638a5314b1fc374eb2b2ac904/coverage-7.13.2-cp312-cp312-win32.whl", hash = "sha256:292250282cf9bcf206b543d7608bda17ca6fc151f4cbae949fc7e115112fbd41", size = 221696, upload-time = "2026-01-25T12:58:17.517Z" }, + { url = "https://files.pythonhosted.org/packages/4d/05/d7540bf983f09d32803911afed135524570f8c47bb394bf6206c1dc3a786/coverage-7.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:eeea10169fac01549a7921d27a3e517194ae254b542102267bef7a93ed38c40e", size = 222504, upload-time = "2026-01-25T12:58:19.115Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/1a9f037a736ced0a12aacf6330cdaad5008081142a7070bc58b0f7930cbc/coverage-7.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a5b567f0b635b592c917f96b9a9cb3dbd4c320d03f4bf94e9084e494f2e8894", size = 221120, upload-time = "2026-01-25T12:58:21.334Z" }, + { url = "https://files.pythonhosted.org/packages/d2/db/d291e30fdf7ea617a335531e72294e0c723356d7fdde8fba00610a76bda9/coverage-7.13.2-py3-none-any.whl", hash = "sha256:40ce1ea1e25125556d8e76bd0b61500839a07944cc287ac21d5626f3e620cad5", size = 210943, upload-time = "2026-01-25T13:00:02.388Z" }, +] + +[[package]] +name = "crcmod-plus" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/0c/71733bbaf38e9f1eaecfdf7f8e350993f3dcac208a5297c41503ae66e513/crcmod_plus-2.3.1.tar.gz", hash = "sha256:732ffe3c3ce3ef9b272e1827d8fb894590c4d6ff553f2a2b41ae30f4f94b0f5d", size = 22319, upload-time = "2025-10-10T22:14:21.691Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/e0/2dad2e6f0cd4914b4144496d9785780ec820e200816c080df785cfa34da6/crcmod_plus-2.3.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:b7e35e0f7d93d7571c2c9c3d6760e456999ea4c1eae5ead6acac247b5a79e469", size = 23279, upload-time = "2025-10-10T22:13:47.281Z" }, + { url = "https://files.pythonhosted.org/packages/66/76/53c0b65b9679b903f98fc54efa32b0e5a19634712a45200c7a80674aa6f5/crcmod_plus-2.3.1-cp311-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6853243120db84677b94b625112116f0ef69cd581741d20de58dce4c34242654", size = 20185, upload-time = "2025-10-10T22:13:48.06Z" }, + { url = "https://files.pythonhosted.org/packages/98/79/2b4dc9bb26394873d7699737124408b5106264ae33053fdec600e9a9fa65/crcmod_plus-2.3.1-cp311-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:17735bc4e944d552ea18c8609fc6d08a5e64ee9b29cc216ba4d623754029cc3a", size = 26999, upload-time = "2025-10-10T22:13:48.854Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e8/f5d66778b5a1bff915807016561a02b5cebf6b3840fb8a2be40bbb0c8575/crcmod_plus-2.3.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ac755040a2a35f43ab331978c48a9acb4ff64b425f282a296be467a410f00c3", size = 27536, upload-time = "2025-10-10T22:13:49.956Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2c/0113ad30cadad40c22eef08c0f2618f2446dd282f02268fecbcfc9fda3c1/crcmod_plus-2.3.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bdcfb838ca093ca673a3bbb37f62d1e5ec7182e00cc5ee2d00759f9f9f8ab11", size = 27385, upload-time = "2025-10-10T22:13:50.765Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ba/501ef1b02119402cf1a31c01eb2cb8399660bca863c2f4dd3dc060220284/crcmod_plus-2.3.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9166bc3c9b5e7b07b4e6854cac392b4a451b31d58d3950e48c140ab7b5d05394", size = 27135, upload-time = "2025-10-10T22:13:51.889Z" }, + { url = "https://files.pythonhosted.org/packages/49/90/d4556c9db69c83e726c5b88da3d656fdaac7d60c4d27b43cb939bed80069/crcmod_plus-2.3.1-cp311-abi3-win32.whl", hash = "sha256:cb99b694cce5c862560cf332a8b5e793620e28f0de3726995608bbd6f9b6e09a", size = 22384, upload-time = "2025-10-10T22:13:53.016Z" }, + { url = "https://files.pythonhosted.org/packages/4d/7e/57bb97a8c7b4e19900744f58b67dc83bc9c83aaac670deeede9fb3bfab6a/crcmod_plus-2.3.1-cp311-abi3-win_amd64.whl", hash = "sha256:82b0f7e968c430c5a80fe0fc59e75cb54f2e84df2ed0cee5a3ff9cadfbf8a220", size = 22912, upload-time = "2025-10-10T22:13:53.849Z" }, +] + +[[package]] +name = "cryptography" +version = "43.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", size = 686989, upload-time = "2024-10-18T15:58:32.918Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/f3/01fdf26701a26f4b4dbc337a26883ad5bccaa6f1bbbdd29cd89e22f18a1c/cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e", size = 6225303, upload-time = "2024-10-18T15:57:36.753Z" }, + { url = "https://files.pythonhosted.org/packages/a3/01/4896f3d1b392025d4fcbecf40fdea92d3df8662123f6835d0af828d148fd/cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", size = 3760905, upload-time = "2024-10-18T15:57:39.166Z" }, + { url = "https://files.pythonhosted.org/packages/0a/be/f9a1f673f0ed4b7f6c643164e513dbad28dd4f2dcdf5715004f172ef24b6/cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", size = 3977271, upload-time = "2024-10-18T15:57:41.227Z" }, + { url = "https://files.pythonhosted.org/packages/4e/49/80c3a7b5514d1b416d7350830e8c422a4d667b6d9b16a9392ebfd4a5388a/cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", size = 3746606, upload-time = "2024-10-18T15:57:42.903Z" }, + { url = "https://files.pythonhosted.org/packages/0e/16/a28ddf78ac6e7e3f25ebcef69ab15c2c6be5ff9743dd0709a69a4f968472/cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", size = 3986484, upload-time = "2024-10-18T15:57:45.434Z" }, + { url = "https://files.pythonhosted.org/packages/01/f5/69ae8da70c19864a32b0315049866c4d411cce423ec169993d0434218762/cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", size = 3852131, upload-time = "2024-10-18T15:57:47.267Z" }, + { url = "https://files.pythonhosted.org/packages/fd/db/e74911d95c040f9afd3612b1f732e52b3e517cb80de8bf183be0b7d413c6/cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", size = 4075647, upload-time = "2024-10-18T15:57:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/56/48/7b6b190f1462818b324e674fa20d1d5ef3e24f2328675b9b16189cbf0b3c/cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2", size = 2623873, upload-time = "2024-10-18T15:57:51.822Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b1/0ebff61a004f7f89e7b65ca95f2f2375679d43d0290672f7713ee3162aff/cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd", size = 3068039, upload-time = "2024-10-18T15:57:54.426Z" }, + { url = "https://files.pythonhosted.org/packages/30/d5/c8b32c047e2e81dd172138f772e81d852c51f0f2ad2ae8a24f1122e9e9a7/cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984", size = 6222984, upload-time = "2024-10-18T15:57:56.174Z" }, + { url = "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", size = 3762968, upload-time = "2024-10-18T15:57:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", size = 3977754, upload-time = "2024-10-18T15:58:00.683Z" }, + { url = "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", size = 3749458, upload-time = "2024-10-18T15:58:02.225Z" }, + { url = "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", size = 3988220, upload-time = "2024-10-18T15:58:04.331Z" }, + { url = "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", size = 3853898, upload-time = "2024-10-18T15:58:06.113Z" }, + { url = "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", size = 4076592, upload-time = "2024-10-18T15:58:08.673Z" }, + { url = "https://files.pythonhosted.org/packages/81/1e/ffcc41b3cebd64ca90b28fd58141c5f68c83d48563c88333ab660e002cd3/cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995", size = 2623145, upload-time = "2024-10-18T15:58:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/87/5c/3dab83cc4aba1f4b0e733e3f0c3e7d4386440d660ba5b1e3ff995feb734d/cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", size = 3068026, upload-time = "2024-10-18T15:58:11.916Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "cython" +version = "3.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/85/7574c9cd44b69a27210444b6650f6477f56c75fee1b70d7672d3e4166167/cython-3.2.4.tar.gz", hash = "sha256:84226ecd313b233da27dc2eb3601b4f222b8209c3a7216d8733b031da1dc64e6", size = 3280291, upload-time = "2026-01-04T14:14:14.473Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/4d/1eb0c7c196a136b1926f4d7f0492a96c6fabd604d77e6cd43b56a3a16d83/cython-3.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:64d7f71be3dd6d6d4a4c575bb3a4674ea06d1e1e5e4cd1b9882a2bc40ed3c4c9", size = 2970064, upload-time = "2026-01-04T14:15:08.567Z" }, + { url = "https://files.pythonhosted.org/packages/03/1c/46e34b08bea19a1cdd1e938a4c123e6299241074642db9d81983cef95e9f/cython-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:869487ea41d004f8b92171f42271fbfadb1ec03bede3158705d16cd570d6b891", size = 3226757, upload-time = "2026-01-04T14:15:10.812Z" }, + { url = "https://files.pythonhosted.org/packages/12/33/3298a44d201c45bcf0d769659725ae70e9c6c42adf8032f6d89c8241098d/cython-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:55b6c44cd30821f0b25220ceba6fe636ede48981d2a41b9bbfe3c7902ce44ea7", size = 3388969, upload-time = "2026-01-04T14:15:12.45Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f3/4275cd3ea0a4cf4606f9b92e7f8766478192010b95a7f516d1b7cf22cb10/cython-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:767b143704bdd08a563153448955935844e53b852e54afdc552b43902ed1e235", size = 2756457, upload-time = "2026-01-04T14:15:14.67Z" }, + { url = "https://files.pythonhosted.org/packages/0a/8b/fd393f0923c82be4ec0db712fffb2ff0a7a131707b842c99bf24b549274d/cython-3.2.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:36bf3f5eb56d5281aafabecbaa6ed288bc11db87547bba4e1e52943ae6961ccf", size = 2875622, upload-time = "2026-01-04T14:15:39.749Z" }, + { url = "https://files.pythonhosted.org/packages/73/48/48530d9b9d64ec11dbe0dd3178a5fe1e0b27977c1054ecffb82be81e9b6a/cython-3.2.4-cp39-abi3-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6d5267f22b6451eb1e2e1b88f6f78a2c9c8733a6ddefd4520d3968d26b824581", size = 3210669, upload-time = "2026-01-04T14:15:41.911Z" }, + { url = "https://files.pythonhosted.org/packages/5e/91/4865fbfef1f6bb4f21d79c46104a53d1a3fa4348286237e15eafb26e0828/cython-3.2.4-cp39-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3b6e58f73a69230218d5381817850ce6d0da5bb7e87eb7d528c7027cbba40b06", size = 2856835, upload-time = "2026-01-04T14:15:43.815Z" }, + { url = "https://files.pythonhosted.org/packages/fa/39/60317957dbef179572398253f29d28f75f94ab82d6d39ea3237fb6c89268/cython-3.2.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e71efb20048358a6b8ec604a0532961c50c067b5e63e345e2e359fff72feaee8", size = 2994408, upload-time = "2026-01-04T14:15:45.422Z" }, + { url = "https://files.pythonhosted.org/packages/8d/30/7c24d9292650db4abebce98abc9b49c820d40fa7c87921c0a84c32f4efe7/cython-3.2.4-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:28b1e363b024c4b8dcf52ff68125e635cb9cb4b0ba997d628f25e32543a71103", size = 2891478, upload-time = "2026-01-04T14:15:47.394Z" }, + { url = "https://files.pythonhosted.org/packages/86/70/03dc3c962cde9da37a93cca8360e576f904d5f9beecfc9d70b1f820d2e5f/cython-3.2.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:31a90b4a2c47bb6d56baeb926948348ec968e932c1ae2c53239164e3e8880ccf", size = 3225663, upload-time = "2026-01-04T14:15:49.446Z" }, + { url = "https://files.pythonhosted.org/packages/b1/97/10b50c38313c37b1300325e2e53f48ea9a2c078a85c0c9572057135e31d5/cython-3.2.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e65e4773021f8dc8532010b4fbebe782c77f9a0817e93886e518c93bd6a44e9d", size = 3115628, upload-time = "2026-01-04T14:15:51.323Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b1/d6a353c9b147848122a0db370863601fdf56de2d983b5c4a6a11e6ee3cd7/cython-3.2.4-cp39-abi3-win32.whl", hash = "sha256:2b1f12c0e4798293d2754e73cd6f35fa5bbdf072bdc14bc6fc442c059ef2d290", size = 2437463, upload-time = "2026-01-04T14:15:53.787Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d8/319a1263b9c33b71343adfd407e5daffd453daef47ebc7b642820a8b68ed/cython-3.2.4-cp39-abi3-win_arm64.whl", hash = "sha256:3b8e62049afef9da931d55de82d8f46c9a147313b69d5ff6af6e9121d545ce7a", size = 2442754, upload-time = "2026-01-04T14:15:55.382Z" }, + { url = "https://files.pythonhosted.org/packages/ff/fa/d3c15189f7c52aaefbaea76fb012119b04b9013f4bf446cb4eb4c26c4e6b/cython-3.2.4-py3-none-any.whl", hash = "sha256:732fc93bc33ae4b14f6afaca663b916c2fdd5dcbfad7114e17fb2434eeaea45c", size = 1257078, upload-time = "2026-01-04T14:14:12.373Z" }, +] + +[[package]] +name = "dictdiffer" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/7b/35cbccb7effc5d7e40f4c55e2b79399e1853041997fcda15c9ff160abba0/dictdiffer-0.9.0.tar.gz", hash = "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578", size = 31513, upload-time = "2021-07-22T13:24:29.276Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/ef/4cb333825d10317a36a1154341ba37e6e9c087bac99c1990ef07ffdb376f/dictdiffer-0.9.0-py2.py3-none-any.whl", hash = "sha256:442bfc693cfcadaf46674575d2eba1c53b42f5e404218ca2c2ff549f2df56595", size = 16754, upload-time = "2021-07-22T13:24:26.783Z" }, +] + +[[package]] +name = "ewmhlib" +version = "0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-xlib" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/3a/46ca34abf0725a754bc44ef474ad34aedcc3ea23b052d97b18b76715a6a9/EWMHlib-0.2-py3-none-any.whl", hash = "sha256:f5b07d8cfd4c7734462ee744c32d490f2f3233fa7ab354240069344208d2f6f5", size = 46657, upload-time = "2024-04-17T08:15:56.338Z" }, +] + +[[package]] +name = "execnet" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, +] + +[[package]] +name = "fonttools" +version = "4.61.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, + { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, + { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "hypothesis" +version = "6.47.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/f2/f77da8271b1abb630cb2090ead2f5aa4acc9639d632e8e68187f52527e4b/hypothesis-6.47.5.tar.gz", hash = "sha256:e0c1e253fc97e7ecdb9e2bbff2cf815d8739e0d1d3d093d67c3af5bb6a7211b0", size = 326641, upload-time = "2022-06-25T20:58:48.926Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/a7/389bbaade2cbbb2534cb2715986041ed01c6d792152c527e71f7f68e93b5/hypothesis-6.47.5-py3-none-any.whl", hash = "sha256:87049b781ee11ec1c7948565b889ab02e428a1e32d427ab4de8fdb3649242d06", size = 387311, upload-time = "2022-06-25T20:58:45.281Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "imgui" +version = "1.92.7" +source = { git = "https://git.konn3kt.com/IQ.Lvbs/dependencies.git?subdirectory=imgui&rev=release-imgui#9201acfc39719129422b0c0f97c02c036d048ed7" } + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "inputs" +version = "0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/cd/5f434220920f76eb73d19bb7aab8d857445f40aa642718e6e51e850cd663/inputs-0.5.tar.gz", hash = "sha256:a31d5b96a3525f1232f326be9e7ce8ccaf873c6b1fb84d9f3c9bc3d79b23eae4", size = 33393, upload-time = "2018-10-05T22:38:14.206Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/94/040a0d9c81f018c39bd887b7b825013b024deb0a6c795f9524797e2cd41b/inputs-0.5-py2.py3-none-any.whl", hash = "sha256:13f894564e52134cf1e3862b1811da034875eb1f2b62e6021e3776e9669a96ec", size = 33630, upload-time = "2018-10-05T22:38:28.28Z" }, +] + +[[package]] +name = "iqpilot" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "aiohttp" }, + { name = "av" }, + { name = "casadi" }, + { name = "cffi" }, + { name = "crcmod-plus" }, + { name = "cryptography" }, + { name = "cython" }, + { name = "inputs" }, + { name = "jeepney" }, + { name = "json-rpc" }, + { name = "libdatachannel-py" }, + { name = "libusb1" }, + { name = "mapbox-earcut" }, + { name = "numpy" }, + { name = "onnx" }, + { name = "psutil" }, + { name = "pycapnp" }, + { name = "pycryptodome" }, + { name = "pyjwt" }, + { name = "pyserial" }, + { name = "pyzbar", marker = "sys_platform == 'linux'" }, + { name = "pyzmq" }, + { name = "qrcode" }, + { name = "raylib" }, + { name = "requests" }, + { name = "scons" }, + { name = "sentry-sdk" }, + { name = "setproctitle" }, + { name = "setuptools" }, + { name = "sounddevice" }, + { name = "spidev", marker = "sys_platform == 'linux'" }, + { name = "sympy" }, + { name = "tqdm" }, + { name = "websocket-client" }, + { name = "xattr", marker = "sys_platform != 'win32'" }, + { name = "zstandard" }, +] + +[package.optional-dependencies] +dev = [ + { name = "azure-identity" }, + { name = "azure-storage-blob" }, + { name = "dictdiffer" }, + { name = "matplotlib" }, + { name = "opencv-python-headless" }, + { name = "parameterized" }, + { name = "pyautogui" }, + { name = "pywinctl" }, + { name = "tabulate" }, +] +testing = [ + { name = "codespell" }, + { name = "coverage" }, + { name = "hypothesis" }, + { name = "jinja2" }, + { name = "pre-commit-hooks" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cpp" }, + { name = "pytest-mock" }, + { name = "pytest-repeat" }, + { name = "pytest-subtests" }, + { name = "pytest-timeout" }, + { name = "pytest-xdist" }, + { name = "ruff" }, + { name = "ty" }, +] +tools = [ + { name = "imgui" }, + { name = "libusb" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiohttp" }, + { name = "av" }, + { name = "azure-identity", marker = "extra == 'dev'" }, + { name = "azure-storage-blob", marker = "extra == 'dev'" }, + { name = "casadi", specifier = ">=3.6.6" }, + { name = "cffi" }, + { name = "codespell", marker = "extra == 'testing'" }, + { name = "coverage", marker = "extra == 'testing'" }, + { name = "crcmod-plus" }, + { name = "cryptography" }, + { name = "cython" }, + { name = "dictdiffer", marker = "extra == 'dev'" }, + { name = "hypothesis", marker = "extra == 'testing'", specifier = "==6.47.*" }, + { name = "imgui", marker = "extra == 'tools'", git = "https://git.konn3kt.com/IQ.Lvbs/dependencies.git?subdirectory=imgui&rev=release-imgui" }, + { name = "inputs" }, + { name = "jeepney" }, + { name = "jinja2", marker = "extra == 'testing'" }, + { name = "json-rpc" }, + { name = "libdatachannel-py", specifier = ">=2026.1.0.dev2" }, + { name = "libusb", marker = "extra == 'tools'", git = "https://git.konn3kt.com/IQ.Lvbs/dependencies.git?subdirectory=libusb&rev=release-libusb" }, + { name = "libusb1" }, + { name = "mapbox-earcut" }, + { name = "matplotlib", marker = "extra == 'dev'" }, + { name = "numpy", specifier = ">=2.0" }, + { name = "onnx", specifier = ">=1.14.0" }, + { name = "opencv-python-headless", marker = "extra == 'dev'" }, + { name = "parameterized", marker = "extra == 'dev'", specifier = ">=0.8,<0.9" }, + { name = "pre-commit-hooks", marker = "extra == 'testing'" }, + { name = "psutil" }, + { name = "pyautogui", marker = "extra == 'dev'" }, + { name = "pycapnp", specifier = "==2.1.0" }, + { name = "pycryptodome" }, + { name = "pyjwt" }, + { name = "pyserial" }, + { name = "pytest", marker = "extra == 'testing'" }, + { name = "pytest-asyncio", marker = "extra == 'testing'" }, + { name = "pytest-cpp", marker = "extra == 'testing'" }, + { name = "pytest-mock", marker = "extra == 'testing'" }, + { name = "pytest-repeat", marker = "extra == 'testing'" }, + { name = "pytest-subtests", marker = "extra == 'testing'" }, + { name = "pytest-timeout", marker = "extra == 'testing'" }, + { name = "pytest-xdist", marker = "extra == 'testing'", git = "https://github.com/sshane/pytest-xdist?rev=2b4372bd62699fb412c4fe2f95bf9f01bd2018da" }, + { name = "pywinctl", marker = "extra == 'dev'" }, + { name = "pyzbar", marker = "sys_platform == 'linux'", git = "https://github.com/greatgitsby/op-dependencies.git?subdirectory=pyzbar&rev=release-pyzbar" }, + { name = "pyzmq" }, + { name = "qrcode" }, + { name = "raylib", specifier = ">5.5.0.3" }, + { name = "requests" }, + { name = "ruff", marker = "extra == 'testing'" }, + { name = "scons" }, + { name = "sentry-sdk" }, + { name = "setproctitle" }, + { name = "setuptools" }, + { name = "sounddevice" }, + { name = "spidev", marker = "sys_platform == 'linux'" }, + { name = "sympy" }, + { name = "tabulate", marker = "extra == 'dev'" }, + { name = "tqdm" }, + { name = "ty", marker = "extra == 'testing'" }, + { name = "websocket-client" }, + { name = "xattr", marker = "sys_platform != 'win32'" }, + { name = "zstandard" }, +] +provides-extras = ["testing", "dev", "tools"] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "json-rpc" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/9e/59f4a5b7855ced7346ebf40a2e9a8942863f644378d956f68bcef2c88b90/json-rpc-1.15.0.tar.gz", hash = "sha256:e6441d56c1dcd54241c937d0a2dcd193bdf0bdc539b5316524713f554b7f85b9", size = 28854, upload-time = "2023-06-11T09:45:49.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/9e/820c4b086ad01ba7d77369fb8b11470a01fac9b4977f02e18659cf378b6b/json_rpc-1.15.0-py2.py3-none-any.whl", hash = "sha256:4a4668bbbe7116feb4abbd0f54e64a4adcf4b8f648f19ffa0848ad0f6606a9bf", size = 39450, upload-time = "2023-06-11T09:45:47.136Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, +] + +[[package]] +name = "libdatachannel-py" +version = "2026.1.0.dev2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/2f/68e8306327ddef4b2133d2efb163cb05b319759ce8bd50b8b32dcd03dd95/libdatachannel_py-2026.1.0.dev2-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:6607fa1439e1b5bfceecd387c433470c9d45e439c3c06fa064f5c4669ad7e582", size = 1213155, upload-time = "2026-05-19T03:37:12.796Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e3/10aed36ffaf1744795322aae612db777991575b72a9f04e2c677c2c022bf/libdatachannel_py-2026.1.0.dev2-cp312-cp312-macosx_26_0_arm64.whl", hash = "sha256:a060b1250f57d1fccb36e3a6b36ac8f4fd34926a6b51c564e787e8b7206458aa", size = 1224706, upload-time = "2026-05-19T03:37:12.679Z" }, + { url = "https://files.pythonhosted.org/packages/09/a9/103fc647a8f9c721ab140fe8d2f8dbd90817e917ca763c4eb0f843fe247e/libdatachannel_py-2026.1.0.dev2-cp312-cp312-manylinux_2_35_aarch64.whl", hash = "sha256:0b8aa3be2fa3654ea24f882756d6599e847de866a44f7a291c60994548a2debb", size = 1638879, upload-time = "2026-05-19T03:37:18.138Z" }, + { url = "https://files.pythonhosted.org/packages/09/a8/0dc7d3fe80fc247ec165dbd455bc2a1a307ef65702a43e24473202c2bf42/libdatachannel_py-2026.1.0.dev2-cp312-cp312-manylinux_2_35_x86_64.whl", hash = "sha256:339a79fcbc8c6caf91c620f6e4a0f1b8ccb6a941a966d10a3135c980ae4651a6", size = 1718006, upload-time = "2026-05-19T03:37:11.891Z" }, + { url = "https://files.pythonhosted.org/packages/6d/86/30904a8753e9db60d8c3cf8efda09585fc68f2004d3d7aa2910c93a8eed5/libdatachannel_py-2026.1.0.dev2-cp312-cp312-manylinux_2_38_aarch64.whl", hash = "sha256:b9f476cb065b50856ab2e53bf774ccca9c6a66454b7ce903aaf6dfcdef2a4482", size = 1643757, upload-time = "2026-05-19T03:37:12.207Z" }, + { url = "https://files.pythonhosted.org/packages/d7/9d/1e10131396d28e84a8088a63c14978cc215f6677dc85acdd96b6068f0664/libdatachannel_py-2026.1.0.dev2-cp312-cp312-manylinux_2_38_x86_64.whl", hash = "sha256:1f31db7347549edcd69fcc1ecb8b31e7183894808ccf9387afc49a4d68debaae", size = 1751748, upload-time = "2026-05-19T03:37:06.98Z" }, +] + +[[package]] +name = "libusb" +version = "1.0.29" +source = { git = "https://git.konn3kt.com/IQ.Lvbs/dependencies.git?subdirectory=libusb&rev=release-libusb#6ad99e27f83fea80dd7688e4ec788255b89769be" } + +[[package]] +name = "libusb1" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/7f/c59ad56d1bca8fa4321d1bb77ba4687775751a4deceec14943a44da18ca0/libusb1-3.3.1.tar.gz", hash = "sha256:3951d360f2daf0e0eacf839e15d2d1d2f4f5e7830231eb3188eeffef2dd17bad", size = 107600, upload-time = "2025-03-24T05:36:47.834Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/f7/4577cfc55c9520ecab5563173e83235382ac7980c8c2c08d6c9f7ef9e615/libusb1-3.3.1-py3-none-any.whl", hash = "sha256:808c9362299dcee01651aa87e71e9d681ccedb27fc4dbd70aaf14e245fb855f1", size = 67243, upload-time = "2025-03-24T05:36:42.312Z" }, + { url = "https://files.pythonhosted.org/packages/6a/60/d3fd4831c601f063a16fc59f465ef4c1108247b07fbff371a982bd1bac45/libusb1-3.3.1-py3-none-win32.whl", hash = "sha256:0ef69825173ce74af34444754c081cc324233edc6acc405658b3ad784833e076", size = 129576, upload-time = "2025-03-24T05:36:45.202Z" }, + { url = "https://files.pythonhosted.org/packages/94/6d/344a164d32d65d503ffe9201cd74cf13a020099dc446554d1e50b07f167b/libusb1-3.3.1-py3-none-win_amd64.whl", hash = "sha256:6e21b772d80d6487fbb55d3d2141218536db302da82f1983754e96c72781c102", size = 141080, upload-time = "2025-03-24T05:36:46.594Z" }, +] + +[[package]] +name = "mapbox-earcut" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/7b/bbf6b00488662be5d2eb7a188222c264b6f713bac10dc4a77bf37a4cb4b6/mapbox_earcut-2.0.0.tar.gz", hash = "sha256:81eab6b86cf99551deb698b98e3f7502c57900e5c479df15e1bdaf1a57f0f9d6", size = 39934, upload-time = "2025-11-16T18:41:27.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/93/846804029d955c3c841d8efff77c2b0e8d9aab057d3a077dc8e3f88b5ea4/mapbox_earcut-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db55ce18e698bc9d90914ee7d4f8c3e4d23827456ece7c5d7a1ec91e90c7122b", size = 55623, upload-time = "2025-11-16T18:40:32.113Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f6/cc9ece104bc3876b350dba6fef7f34fb7b20ecc028d2cdbdbecb436b1ed1/mapbox_earcut-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:01dd6099d16123baf582a11b2bd1d59ce848498cf0cdca3812fd1f8b20ff33b7", size = 52028, upload-time = "2025-11-16T18:40:33.516Z" }, + { url = "https://files.pythonhosted.org/packages/88/6e/230da4aabcc56c99e9bddb4c43ce7d4ba3609c0caf2d316fb26535d7c60c/mapbox_earcut-2.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d5a098aae26a52282bc981a38e7bf6b889d2ea7442f2cd1903d2ba842f4ff07", size = 56351, upload-time = "2025-11-16T18:40:35.217Z" }, + { url = "https://files.pythonhosted.org/packages/1a/f7/5cdd3752526e91d91336c7263af7767b291d21e63c89d7190a60051f0f87/mapbox_earcut-2.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de35f241d0b9110ad9260f295acedd9d7cc0d7acfe30d36b1b3ee8419c2caba1", size = 59209, upload-time = "2025-11-16T18:40:36.634Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a2/b7781416cb93b37b95d0444e03f87184de8815e57ff202ce4105fa921325/mapbox_earcut-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cb63ab85e2e430c350f93e75c13f8b91cb8c8a045f3cd714c390b69a720368a", size = 152316, upload-time = "2025-11-16T18:40:38.147Z" }, + { url = "https://files.pythonhosted.org/packages/c1/74/396338e3d345e4e36fb23a0380921098b6a95ce7fb19c4777f4185a5974e/mapbox_earcut-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fb3c9f069fc3795306db87f8139f70c4f047532f897a3de05f54dc1faebc97f6", size = 157268, upload-time = "2025-11-16T18:40:39.753Z" }, + { url = "https://files.pythonhosted.org/packages/56/2c/66fd137ea86c508f6cd7247f7f6e2d1dabffc9f0e9ccf14c71406b197af1/mapbox_earcut-2.0.0-cp312-cp312-win32.whl", hash = "sha256:eb290e6676217707ed238dd55e07b0a8ca3ab928f6a27c4afefb2ff3af08d7cb", size = 51226, upload-time = "2025-11-16T18:40:41.018Z" }, + { url = "https://files.pythonhosted.org/packages/b8/84/7b78e37b0c2109243c0dad7d9ba9774b02fcee228bf61cf727a5aa1702e2/mapbox_earcut-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:5ef5b3319a43375272ad2cad9333ed16e569b5102e32a4241451358897e6f6ee", size = 56417, upload-time = "2025-11-16T18:40:42.173Z" }, + { url = "https://files.pythonhosted.org/packages/75/7f/cd7195aa27c1c8f2b9d38025a5a8663f32cd01c07b648a54b1308ab26c15/mapbox_earcut-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4a3706feb5cc8c782d8f68bb0110c8d551304043f680a87a54b0651a2c208c3", size = 50111, upload-time = "2025-11-16T18:40:43.334Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, +] + +[[package]] +name = "mouseinfo" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyperclip" }, + { name = "python3-xlib", marker = "sys_platform == 'linux'" }, + { name = "rubicon-objc", marker = "sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/fa/b2ba8229b9381e8f6381c1dcae6f4159a7f72349e414ed19cfbbd1817173/MouseInfo-0.1.3.tar.gz", hash = "sha256:2c62fb8885062b8e520a3cce0a297c657adcc08c60952eb05bc8256ef6f7f6e7", size = 10850, upload-time = "2020-03-27T21:20:10.136Z" } + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msal" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/0e/c857c46d653e104019a84f22d4494f2119b4fe9f896c92b4b864b3b045cc/msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f", size = 153961, upload-time = "2025-09-22T23:05:48.989Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/dc/18d48843499e278538890dc709e9ee3dea8375f8be8e82682851df1b48b5/msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1", size = 116987, upload-time = "2025-09-22T23:05:47.294Z" }, +] + +[[package]] +name = "msal-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/99/5d239b6156eddf761a636bded1118414d161bd6b7b37a9335549ed159396/msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4", size = 23315, upload-time = "2025-03-14T23:51:03.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca", size = 20583, upload-time = "2025-03-14T23:51:03.016Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, + { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, + { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, + { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, +] + +[[package]] +name = "onnx" +version = "1.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/8a/335c03a8683a88a32f9a6bb98899ea6df241a41df64b37b9696772414794/onnx-1.20.1.tar.gz", hash = "sha256:ded16de1df563d51fbc1ad885f2a426f814039d8b5f4feb77febe09c0295ad67", size = 12048980, upload-time = "2026-01-10T01:40:03.043Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/4c/4b17e82f91ab9aa07ff595771e935ca73547b035030dc5f5a76e63fbfea9/onnx-1.20.1-cp312-abi3-macosx_12_0_universal2.whl", hash = "sha256:1d923bb4f0ce1b24c6859222a7e6b2f123e7bfe7623683662805f2e7b9e95af2", size = 17903547, upload-time = "2026-01-10T01:39:31.015Z" }, + { url = "https://files.pythonhosted.org/packages/64/5e/1bfa100a9cb3f2d3d5f2f05f52f7e60323b0e20bb0abace1ae64dbc88f25/onnx-1.20.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddc0b7d8b5a94627dc86c533d5e415af94cbfd103019a582669dad1f56d30281", size = 17412021, upload-time = "2026-01-10T01:39:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/d3fec0dcf9a7a99e7368112d9c765154e81da70fcba1e3121131a45c245b/onnx-1.20.1-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9336b6b8e6efcf5c490a845f6afd7e041c89a56199aeda384ed7d58fb953b080", size = 17510450, upload-time = "2026-01-10T01:39:36.589Z" }, + { url = "https://files.pythonhosted.org/packages/74/a7/edce1403e05a46e59b502fae8e3350ceeac5841f8e8f1561e98562ed9b09/onnx-1.20.1-cp312-abi3-win32.whl", hash = "sha256:564c35a94811979808ab5800d9eb4f3f32c12daedba7e33ed0845f7c61ef2431", size = 16238216, upload-time = "2026-01-10T01:39:39.46Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c7/8690c81200ae652ac550c1df52f89d7795e6cc941f3cb38c9ef821419e80/onnx-1.20.1-cp312-abi3-win_amd64.whl", hash = "sha256:9fe7f9a633979d50984b94bda8ceb7807403f59a341d09d19342dc544d0ca1d5", size = 16389207, upload-time = "2026-01-10T01:39:41.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/a0/4fb0e6d36eaf079af366b2c1f68bafe92df6db963e2295da84388af64abc/onnx-1.20.1-cp312-abi3-win_arm64.whl", hash = "sha256:21d747348b1c8207406fa2f3e12b82f53e0d5bb3958bcd0288bd27d3cb6ebb00", size = 16344155, upload-time = "2026-01-10T01:39:45.536Z" }, +] + +[[package]] +name = "opencv-python-headless" +version = "4.13.0.90" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/76/38c4cbb5ccfce7aaf36fd9be9fc74a15c85a48ef90bfaca2049b486e10c5/opencv_python_headless-4.13.0.90-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:12a28674f215542c9bf93338de1b5bffd76996d32da9acb9e739fdb9c8bbd738", size = 46020414, upload-time = "2026-01-18T09:07:10.801Z" }, + { url = "https://files.pythonhosted.org/packages/93/c5/4b40daa5003b45aa8397f160324a091ed323733e2446dc0bdf3655e77b84/opencv_python_headless-4.13.0.90-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:32255203040dc98803be96362e13f9e4bce20146898222d2e5c242f80de50da5", size = 32568519, upload-time = "2026-01-18T09:07:52.368Z" }, + { url = "https://files.pythonhosted.org/packages/da/65/920e64a7f03cf5917cd2c6a3046293843c1a16ad89f0ed0f1c683979c9de/opencv_python_headless-4.13.0.90-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e13790342591557050157713af17a7435ac1b50c65282715093c9297fa045d8f", size = 35191272, upload-time = "2026-01-18T09:08:49.235Z" }, + { url = "https://files.pythonhosted.org/packages/fc/13/af150685be342dc09bfb0824e2a280020ccf1c7fc64e15a31d9209016aa9/opencv_python_headless-4.13.0.90-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dbc1f4625e5af3a80ebdbd84380227c0f445228588f2521b11af47710caca1ba", size = 57683677, upload-time = "2026-01-18T09:10:23.588Z" }, + { url = "https://files.pythonhosted.org/packages/cd/47/baab2a3b6d8da8c52e73d00207d1ed3155601c2c332ea855455b3fbc8ff4/opencv_python_headless-4.13.0.90-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eba38bc255d0b7d1969c5bcc90a060ca2b61a3403b613872c750bfa5dfe9e03b", size = 36590019, upload-time = "2026-01-18T09:10:49.053Z" }, + { url = "https://files.pythonhosted.org/packages/81/a1/facfe2801a861b424c4221d66e1281cf19735c00e07f063a337a208c11b5/opencv_python_headless-4.13.0.90-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f46b17ea0aa7e4124ca6ad71143f89233ae9557f61d2326bcdb34329a1ddf9bd", size = 62535926, upload-time = "2026-01-18T09:12:47.229Z" }, + { url = "https://files.pythonhosted.org/packages/06/d2/5e9ee7512306c1caa518be929d1f44bb1c189f342f538f73bea6fb94919f/opencv_python_headless-4.13.0.90-cp37-abi3-win32.whl", hash = "sha256:96060fc57a1abb1144b0b8129e2ff3bfcdd0ccd8e8bd05bd85256ff4ed587d3b", size = 30811665, upload-time = "2026-01-18T09:13:44.517Z" }, + { url = "https://files.pythonhosted.org/packages/a0/09/0a4d832448dccd03b2b1bdee70b9fc2e02c147cc7e06975e9cd729569d90/opencv_python_headless-4.13.0.90-cp37-abi3-win_amd64.whl", hash = "sha256:0e0c8c9f620802fddc4fa7f471a1d263c7b0dca16cd9e7e2f996bb8bd2128c0c", size = 40070035, upload-time = "2026-01-18T09:15:14.652Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "parameterized" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/23/2288f308d238b4f261c039cafcd650435d624de97c6ffc903f06ea8af50f/parameterized-0.8.1.tar.gz", hash = "sha256:41bbff37d6186430f77f900d777e5bb6a24928a1c46fb1de692f8b52b8833b5c", size = 23936, upload-time = "2021-01-09T20:35:18.235Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/13/fe468c8c7400a8eca204e6e160a29bf7dcd45a76e20f1c030f3eaa690d93/parameterized-0.8.1-py2.py3-none-any.whl", hash = "sha256:9cbb0b69a03e8695d68b3399a8a5825200976536fe1cb79db60ed6a4c8c9efe9", size = 26354, upload-time = "2021-01-09T20:35:16.307Z" }, +] + +[[package]] +name = "pillow" +version = "12.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, + { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, + { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, + { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, + { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, + { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pre-commit-hooks" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ruamel-yaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/4d/93e63e48f8fd16d6c1e4cef5dabadcade4d1325c7fd6f29f075a4d2284f3/pre_commit_hooks-6.0.0.tar.gz", hash = "sha256:76d8370c006f5026cdd638a397a678d26dda735a3c88137e05885a020f824034", size = 28293, upload-time = "2025-08-09T19:25:04.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/46/eba9be9daa403fa94854ce16a458c29df9a01c6c047931c3d8be6016cd9a/pre_commit_hooks-6.0.0-py2.py3-none-any.whl", hash = "sha256:76161b76d321d2f8ee2a8e0b84c30ee8443e01376121fd1c90851e33e3bd7ee2", size = 41338, upload-time = "2025-08-09T19:25:03.513Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/b8/cda15d9d46d03d4aa3a67cb6bffe05173440ccf86a9541afaf7ac59a1b6b/protobuf-6.33.4.tar.gz", hash = "sha256:dc2e61bca3b10470c1912d166fe0af67bfc20eb55971dcef8dfa48ce14f0ed91", size = 444346, upload-time = "2026-01-12T18:33:40.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/be/24ef9f3095bacdf95b458543334d0c4908ccdaee5130420bf064492c325f/protobuf-6.33.4-cp310-abi3-win32.whl", hash = "sha256:918966612c8232fc6c24c78e1cd89784307f5814ad7506c308ee3cf86662850d", size = 425612, upload-time = "2026-01-12T18:33:29.656Z" }, + { url = "https://files.pythonhosted.org/packages/31/ad/e5693e1974a28869e7cd244302911955c1cebc0161eb32dfa2b25b6e96f0/protobuf-6.33.4-cp310-abi3-win_amd64.whl", hash = "sha256:8f11ffae31ec67fc2554c2ef891dcb561dae9a2a3ed941f9e134c2db06657dbc", size = 436962, upload-time = "2026-01-12T18:33:31.345Z" }, + { url = "https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2fe67f6c014c84f655ee06f6f66213f9254b3a8b6bda6cda0ccd4232c73c06f0", size = 427612, upload-time = "2026-01-12T18:33:32.646Z" }, + { url = "https://files.pythonhosted.org/packages/2b/48/d301907ce6d0db75f959ca74f44b475a9caa8fcba102d098d3c3dd0f2d3f/protobuf-6.33.4-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:757c978f82e74d75cba88eddec479df9b99a42b31193313b75e492c06a51764e", size = 324484, upload-time = "2026-01-12T18:33:33.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/1c/e53078d3f7fe710572ab2dcffd993e1e3b438ae71cfc031b71bae44fcb2d/protobuf-6.33.4-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c7c64f259c618f0bef7bee042075e390debbf9682334be2b67408ec7c1c09ee6", size = 339256, upload-time = "2026-01-12T18:33:35.231Z" }, + { url = "https://files.pythonhosted.org/packages/e8/8e/971c0edd084914f7ee7c23aa70ba89e8903918adca179319ee94403701d5/protobuf-6.33.4-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:3df850c2f8db9934de4cf8f9152f8dc2558f49f298f37f90c517e8e5c84c30e9", size = 323311, upload-time = "2026-01-12T18:33:36.305Z" }, + { url = "https://files.pythonhosted.org/packages/75/b1/1dc83c2c661b4c62d56cc081706ee33a4fc2835bd90f965baa2663ef7676/protobuf-6.33.4-py3-none-any.whl", hash = "sha256:1fe3730068fcf2e595816a6c34fe66eeedd37d51d0400b72fabc848811fdc1bc", size = 170532, upload-time = "2026-01-12T18:33:39.199Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42", size = 128137, upload-time = "2025-12-29T08:26:27.759Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1", size = 128947, upload-time = "2025-12-29T08:26:29.548Z" }, + { url = "https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8", size = 154694, upload-time = "2025-12-29T08:26:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6", size = 156136, upload-time = "2025-12-29T08:26:34.079Z" }, + { url = "https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8", size = 148108, upload-time = "2025-12-29T08:26:36.225Z" }, + { url = "https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67", size = 147402, upload-time = "2025-12-29T08:26:39.21Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" }, + { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, +] + +[[package]] +name = "pyautogui" +version = "0.9.54" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mouseinfo" }, + { name = "pygetwindow" }, + { name = "pymsgbox" }, + { name = "pyobjc-core", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" }, + { name = "pyscreeze" }, + { name = "python3-xlib", marker = "sys_platform == 'linux'" }, + { name = "pytweening" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/ff/cdae0a8c2118a0de74b6cf4cbcdcaf8fd25857e6c3f205ce4b1794b27814/PyAutoGUI-0.9.54.tar.gz", hash = "sha256:dd1d29e8fd118941cb193f74df57e5c6ff8e9253b99c7b04f39cfc69f3ae04b2", size = 61236, upload-time = "2023-05-24T20:11:32.972Z" } + +[[package]] +name = "pycapnp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/86/a57e3c92acd3e1d2fc3dcad683ada191f722e4ac927e1a384b228ec2780a/pycapnp-2.1.0.tar.gz", hash = "sha256:69cc3d861fee1c9b26c73ad2e8a5d51e76ad87e4ff9be33a4fd2fc72f5846aec", size = 689734, upload-time = "2025-09-05T03:50:40.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/0e/66b41ba600e5f2523e900b7cc0d2e8496b397a1f2d6a5b7b323ab83418b7/pycapnp-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d2ec561bc948d11f64f43bf9601bede5d6a603d105ae311bd5583c7130624a4", size = 1619223, upload-time = "2025-09-05T03:48:54.64Z" }, + { url = "https://files.pythonhosted.org/packages/40/6e/9bcb30180bd40cb0534124ff7f8ba8746a735018d593f608bf40c97821c0/pycapnp-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132cd97f57f6b6636323ca9b68d389dd90b96e87af38cde31e2b5c5a064f277e", size = 1484321, upload-time = "2025-09-05T03:48:55.85Z" }, + { url = "https://files.pythonhosted.org/packages/14/0a/9ee1c9ecaff499e4fd1df2f0335bc20f666ec6ce5cd80f8ab055007f3c9b/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:568e79268ba7c02a71fe558a8aec1ae3c0f0e6aff809ff618a46afe4964957d2", size = 5143502, upload-time = "2025-09-05T03:48:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/4d/50/65837e1416f7a8861ca1e8fe4582a5aef37192d7ef5e2ecfe46880bfdf9c/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:bcbf6f882d78d368c8e4bb792295392f5c4d71ddffa13a48da27e7bd47b99e37", size = 5508134, upload-time = "2025-09-05T03:48:59.383Z" }, + { url = "https://files.pythonhosted.org/packages/a1/59/46df6db800e77dbc3cc940723fb3fd7bc837327c858edf464a0f904bf547/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:dc25b96e393410dde25c61c1df3ce644700ef94826c829426d58c2c6b3e2d2f5", size = 5631794, upload-time = "2025-09-05T03:49:03.511Z" }, + { url = "https://files.pythonhosted.org/packages/63/9d/18e978500d5f6bd8d152f4d6919e3cfb83ead8a71c14613bbb54322df8b9/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:48938e0436ab1be615fc0a41434119a2065490a6212b9a5e56949e89b0588b76", size = 5369378, upload-time = "2025-09-05T03:49:05.539Z" }, + { url = "https://files.pythonhosted.org/packages/96/dc/726f1917e9996dc29f9fd1cf30674a14546cdbdfa0777e1982b6bd1ad628/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c20de0f6e0b3fa9fa1df3864cf46051db3511b63bc29514d1092af65f2b82a0", size = 5999140, upload-time = "2025-09-05T03:49:07.341Z" }, + { url = "https://files.pythonhosted.org/packages/fd/3a/3bbc4c5776fc32fbf8a59df5c7c5810efd292b933cd6545eb4b16d896268/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:18caca6527862475167c10ea0809531130585aa8a86cc76cd1629eb87ee30637", size = 6454308, upload-time = "2025-09-05T03:49:08.998Z" }, + { url = "https://files.pythonhosted.org/packages/bf/dd/17e2d7808424f10ffddc47329b980488ed83ec716c504791787e593a7a93/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9dcc11237697007b66e3bfc500d2ad892bd79672c9b50d61fbf728c6aaf936de", size = 6544212, upload-time = "2025-09-05T03:49:10.675Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/68090013128d7853f34c43828dd4dc80a7c8516fd1b56057b134e1e4c2c0/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c151edf78155b6416e7cb31e2e333d302d742ba52bb37d4dbdf71e75cc999d46", size = 6295279, upload-time = "2025-09-05T03:49:12.712Z" }, + { url = "https://files.pythonhosted.org/packages/5b/52/7d85212b4fcf127588888f71d3dbf5558ee7dc302eba760b12b1b325f9a3/pycapnp-2.1.0-cp312-cp312-win32.whl", hash = "sha256:c09b28419321dafafc644d60c57ff8ccaf3c3e686801b6060c612a7a3c580944", size = 1038995, upload-time = "2025-09-05T03:49:14.165Z" }, + { url = "https://files.pythonhosted.org/packages/f2/12/25d283ebf5c28717364647672e7494dc46196ca7a662f5420e4866f45687/pycapnp-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:560cb69cc02b0347e85b0629e4c2f0a316240900aa905392f9df6bab0a359989", size = 1176620, upload-time = "2025-09-05T03:49:15.545Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pycryptodome" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/a6/8452177684d5e906854776276ddd34eca30d1b1e15aa1ee9cefc289a33f5/pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", size = 4921276, upload-time = "2025-05-17T17:21:45.242Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/6c/a1f71542c969912bb0e106f64f60a56cc1f0fabecf9396f45accbe63fa68/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", size = 2495627, upload-time = "2025-05-17T17:20:47.139Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4e/a066527e079fc5002390c8acdd3aca431e6ea0a50ffd7201551175b47323/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", size = 1640362, upload-time = "2025-05-17T17:20:50.392Z" }, + { url = "https://files.pythonhosted.org/packages/50/52/adaf4c8c100a8c49d2bd058e5b551f73dfd8cb89eb4911e25a0c469b6b4e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", size = 2182625, upload-time = "2025-05-17T17:20:52.866Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e9/a09476d436d0ff1402ac3867d933c61805ec2326c6ea557aeeac3825604e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", size = 2268954, upload-time = "2025-05-17T17:20:55.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c5/ffe6474e0c551d54cab931918127c46d70cab8f114e0c2b5a3c071c2f484/pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", size = 2308534, upload-time = "2025-05-17T17:20:57.279Z" }, + { url = "https://files.pythonhosted.org/packages/18/28/e199677fc15ecf43010f2463fde4c1a53015d1fe95fb03bca2890836603a/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", size = 2181853, upload-time = "2025-05-17T17:20:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ea/4fdb09f2165ce1365c9eaefef36625583371ee514db58dc9b65d3a255c4c/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", size = 2342465, upload-time = "2025-05-17T17:21:03.83Z" }, + { url = "https://files.pythonhosted.org/packages/22/82/6edc3fc42fe9284aead511394bac167693fb2b0e0395b28b8bedaa07ef04/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", size = 2267414, upload-time = "2025-05-17T17:21:06.72Z" }, + { url = "https://files.pythonhosted.org/packages/59/fe/aae679b64363eb78326c7fdc9d06ec3de18bac68be4b612fc1fe8902693c/pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", size = 1768484, upload-time = "2025-05-17T17:21:08.535Z" }, + { url = "https://files.pythonhosted.org/packages/54/2f/e97a1b8294db0daaa87012c24a7bb714147c7ade7656973fd6c736b484ff/pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", size = 1799636, upload-time = "2025-05-17T17:21:10.393Z" }, + { url = "https://files.pythonhosted.org/packages/18/3d/f9441a0d798bf2b1e645adc3265e55706aead1255ccdad3856dbdcffec14/pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", size = 1703675, upload-time = "2025-05-17T17:21:13.146Z" }, +] + +[[package]] +name = "pygetwindow" +version = "0.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyrect" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/70/c7a4f46dbf06048c6d57d9489b8e0f9c4c3d36b7479f03c5ca97eaa2541d/PyGetWindow-0.0.9.tar.gz", hash = "sha256:17894355e7d2b305cd832d717708384017c1698a90ce24f6f7fbf0242dd0a688", size = 9699, upload-time = "2020-10-04T02:12:50.806Z" } + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pymonctl" +version = "0.92" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ewmhlib", marker = "sys_platform == 'linux'" }, + { name = "pyobjc", marker = "sys_platform == 'darwin'" }, + { name = "python-xlib", marker = "sys_platform == 'linux'" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/13/076a20da28b82be281f7e43e16d9da0f545090f5d14b2125699232b9feba/PyMonCtl-0.92-py3-none-any.whl", hash = "sha256:2495d8dab78f9a7dbce37e74543e60b8bd404a35c3108935697dda7768611b5a", size = 45945, upload-time = "2024-04-22T10:07:09.566Z" }, +] + +[[package]] +name = "pymsgbox" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/6a/e80da7594ee598a776972d09e2813df2b06b3bc29218f440631dfa7c78a8/pymsgbox-2.0.1.tar.gz", hash = "sha256:98d055c49a511dcc10fa08c3043e7102d468f5e4b3a83c6d3c61df722c7d798d", size = 20768, upload-time = "2025-09-09T00:38:56.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/3e/08c8cac81b2b2f7502746e6b9c8e5b0ec6432cd882c605560fc409aaf087/pymsgbox-2.0.1-py3-none-any.whl", hash = "sha256:5de8ec19bca2ca7e6c09d39c817c83f17c75cee80275235f43a9931db699f73b", size = 9994, upload-time = "2025-09-09T00:38:55.672Z" }, +] + +[[package]] +name = "pyobjc" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-accessibility", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-accounts", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-addressbook" }, + { name = "pyobjc-framework-adservices", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-adsupport", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-applescriptkit" }, + { name = "pyobjc-framework-applescriptobjc", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-applicationservices" }, + { name = "pyobjc-framework-apptrackingtransparency", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-arkit", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-audiovideobridging", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-authenticationservices", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-automaticassessmentconfiguration", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-automator" }, + { name = "pyobjc-framework-avfoundation", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-avkit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-avrouting", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-backgroundassets", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-browserenginekit", marker = "platform_release >= '23.4'" }, + { name = "pyobjc-framework-businesschat", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-calendarstore", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-callkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-carbon" }, + { name = "pyobjc-framework-cfnetwork" }, + { name = "pyobjc-framework-cinematic", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-classkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-cloudkit", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-collaboration", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-colorsync", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-compositorservices", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-contacts", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-contactsui", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coreaudiokit" }, + { name = "pyobjc-framework-corebluetooth", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-coredata" }, + { name = "pyobjc-framework-corehaptics", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-corelocation", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-coremedia", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-coremediaio", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-coremidi" }, + { name = "pyobjc-framework-coreml", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-coremotion", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-coreservices" }, + { name = "pyobjc-framework-corespotlight", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-coretext" }, + { name = "pyobjc-framework-corewlan", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-cryptotokenkit", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-datadetection", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-devicecheck", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-devicediscoveryextension", marker = "platform_release >= '24.0'" }, + { name = "pyobjc-framework-dictionaryservices", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-discrecording" }, + { name = "pyobjc-framework-discrecordingui" }, + { name = "pyobjc-framework-diskarbitration" }, + { name = "pyobjc-framework-dvdplayback" }, + { name = "pyobjc-framework-eventkit", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-exceptionhandling" }, + { name = "pyobjc-framework-executionpolicy", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-extensionkit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-externalaccessory", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-fileprovider", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-fileproviderui", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-findersync", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-fsevents", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-fskit", marker = "platform_release >= '24.4'" }, + { name = "pyobjc-framework-gamecenter", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-gamecontroller", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-gamekit", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-gameplaykit", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-gamesave", marker = "platform_release >= '25.0'" }, + { name = "pyobjc-framework-healthkit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-imagecapturecore", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-inputmethodkit", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-installerplugins" }, + { name = "pyobjc-framework-instantmessage", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-intents", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-intentsui", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-iobluetooth" }, + { name = "pyobjc-framework-iobluetoothui" }, + { name = "pyobjc-framework-iosurface", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-ituneslibrary", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-kernelmanagement", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-latentsemanticmapping" }, + { name = "pyobjc-framework-launchservices" }, + { name = "pyobjc-framework-libdispatch", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-libxpc", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-linkpresentation", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-localauthentication", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-localauthenticationembeddedui", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mailkit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mapkit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaaccessibility", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaextension", marker = "platform_release >= '24.0'" }, + { name = "pyobjc-framework-medialibrary", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-mediaplayer", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-mediatoolbox", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-metal", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-metalfx", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-metalkit", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-metalperformanceshaders", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-metalperformanceshadersgraph", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-metrickit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-mlcompute", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-modelio", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-multipeerconnectivity", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-naturallanguage", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-netfs", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-network", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-networkextension", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-notificationcenter", marker = "platform_release >= '14.0'" }, + { name = "pyobjc-framework-opendirectory", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-osakit" }, + { name = "pyobjc-framework-oslog", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-passkit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-pencilkit", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-phase", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-photos", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-photosui", marker = "platform_release >= '15.0'" }, + { name = "pyobjc-framework-preferencepanes" }, + { name = "pyobjc-framework-pushkit", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-quartz" }, + { name = "pyobjc-framework-quicklookthumbnailing", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-replaykit", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-safariservices", marker = "platform_release >= '16.0'" }, + { name = "pyobjc-framework-safetykit", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-scenekit", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-screencapturekit", marker = "platform_release >= '21.4'" }, + { name = "pyobjc-framework-screensaver" }, + { name = "pyobjc-framework-screentime", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-scriptingbridge", marker = "platform_release >= '9.0'" }, + { name = "pyobjc-framework-searchkit" }, + { name = "pyobjc-framework-security" }, + { name = "pyobjc-framework-securityfoundation" }, + { name = "pyobjc-framework-securityinterface" }, + { name = "pyobjc-framework-securityui", marker = "platform_release >= '24.4'" }, + { name = "pyobjc-framework-sensitivecontentanalysis", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-servicemanagement", marker = "platform_release >= '10.0'" }, + { name = "pyobjc-framework-sharedwithyou", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-sharedwithyoucore", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-shazamkit", marker = "platform_release >= '21.0'" }, + { name = "pyobjc-framework-social", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-soundanalysis", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-speech", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-spritekit", marker = "platform_release >= '13.0'" }, + { name = "pyobjc-framework-storekit", marker = "platform_release >= '11.0'" }, + { name = "pyobjc-framework-symbols", marker = "platform_release >= '23.0'" }, + { name = "pyobjc-framework-syncservices" }, + { name = "pyobjc-framework-systemconfiguration" }, + { name = "pyobjc-framework-systemextensions", marker = "platform_release >= '19.0'" }, + { name = "pyobjc-framework-threadnetwork", marker = "platform_release >= '22.0'" }, + { name = "pyobjc-framework-uniformtypeidentifiers", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-usernotifications", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-usernotificationsui", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-videosubscriberaccount", marker = "platform_release >= '18.0'" }, + { name = "pyobjc-framework-videotoolbox", marker = "platform_release >= '12.0'" }, + { name = "pyobjc-framework-virtualization", marker = "platform_release >= '20.0'" }, + { name = "pyobjc-framework-vision", marker = "platform_release >= '17.0'" }, + { name = "pyobjc-framework-webkit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/06/d77639ba166cc09aed2d32ae204811b47bc5d40e035cdc9bff7fff72ec5f/pyobjc-12.1.tar.gz", hash = "sha256:686d6db3eb3182fac9846b8ce3eedf4c7d2680b21b8b8d6e6df054a17e92a12d", size = 11345, upload-time = "2025-11-14T10:07:28.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/00/1085de7b73abf37ec27ad59f7a1d7a406e6e6da45720bced2e198fdf1ddf/pyobjc-12.1-py3-none-any.whl", hash = "sha256:6f8c36cf87b1159d2ca1aa387ffc3efcd51cc3da13ef47c65f45e6d9fbccc729", size = 4226, upload-time = "2025-11-14T09:30:25.185Z" }, +] + +[[package]] +name = "pyobjc-core" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/b6/d5612eb40be4fd5ef88c259339e6313f46ba67577a95d86c3470b951fce0/pyobjc_core-12.1.tar.gz", hash = "sha256:2bb3903f5387f72422145e1466b3ac3f7f0ef2e9960afa9bcd8961c5cbf8bd21", size = 1000532, upload-time = "2025-11-14T10:08:28.292Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/5a/6b15e499de73050f4a2c88fff664ae154307d25dc04da8fb38998a428358/pyobjc_core-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:818bcc6723561f207e5b5453efe9703f34bc8781d11ce9b8be286bb415eb4962", size = 678335, upload-time = "2025-11-14T09:32:20.107Z" }, +] + +[[package]] +name = "pyobjc-framework-accessibility" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/87/8ca40428d05a668fecc638f2f47dba86054dbdc35351d247f039749de955/pyobjc_framework_accessibility-12.1.tar.gz", hash = "sha256:5ff362c3425edc242d49deec11f5f3e26e565cefb6a2872eda59ab7362149772", size = 29800, upload-time = "2025-11-14T10:08:31.949Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/95/9ea0d1c16316b4b5babf4b0515e9a133ac64269d3ec031f15ee9c7c2a8c1/pyobjc_framework_accessibility-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:537691a0b28fedb8385cd093df069a6e5d7e027629671fc47b50210404eca20b", size = 11335, upload-time = "2025-11-14T09:35:30.81Z" }, +] + +[[package]] +name = "pyobjc-framework-accounts" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/10/f6fe336c7624d6753c1f6edac102310ce4434d49b548c479e8e6420d4024/pyobjc_framework_accounts-12.1.tar.gz", hash = "sha256:76d62c5e7b831eb8f4c9ca6abaf79d9ed961dfffe24d89a041fb1de97fe56a3e", size = 15202, upload-time = "2025-11-14T10:08:33.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/70/5f9214250f92fbe2e07f35778875d2771d612f313af2a0e4bacba80af28e/pyobjc_framework_accounts-12.1-py2.py3-none-any.whl", hash = "sha256:e1544ad11a2f889a7aaed649188d0e76d58595a27eec07ca663847a7adb21ae5", size = 5104, upload-time = "2025-11-14T09:35:40.246Z" }, +] + +[[package]] +name = "pyobjc-framework-addressbook" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/28/0404af2a1c6fa8fd266df26fb6196a8f3fb500d6fe3dab94701949247bea/pyobjc_framework_addressbook-12.1.tar.gz", hash = "sha256:c48b740cf981103cef1743d0804a226d86481fcb839bd84b80e9a586187e8000", size = 44359, upload-time = "2025-11-14T10:08:37.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/33/da709c69cbb60df9522cd614d5c23c15b649b72e5d62fed1048e75c70e7b/pyobjc_framework_addressbook-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7893dd784322f4674299fb3ca40cb03385e5eddb78defd38f08c0b730813b56c", size = 12894, upload-time = "2025-11-14T09:35:47.498Z" }, +] + +[[package]] +name = "pyobjc-framework-adservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/04/1c3d3e0a1ac981664f30b33407dcdf8956046ecde6abc88832cf2aa535f4/pyobjc_framework_adservices-12.1.tar.gz", hash = "sha256:7a31fc8d5c6fd58f012db87c89ba581361fc905114bfb912e0a3a87475c02183", size = 11793, upload-time = "2025-11-14T10:08:39.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/13/f7796469b25f50750299c4b0e95dc2f75c7c7fc4c93ef2c644f947f10529/pyobjc_framework_adservices-12.1-py2.py3-none-any.whl", hash = "sha256:9ca3c55e35b2abb3149a0bce5de9a1f7e8ee4f8642036910ca8586ab2e161538", size = 3492, upload-time = "2025-11-14T09:35:57.344Z" }, +] + +[[package]] +name = "pyobjc-framework-adsupport" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/77/f26a2e9994d4df32e9b3680c8014e350b0f1c78d7673b3eba9de2e04816f/pyobjc_framework_adsupport-12.1.tar.gz", hash = "sha256:9a68480e76de567c339dca29a8c739d6d7b5cad30e1cd585ff6e49ec2fc283dd", size = 11645, upload-time = "2025-11-14T10:08:41.439Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/1a/3e90d5a09953bde7b60946cd09cca1411aed05dea855cb88cb9e944c7006/pyobjc_framework_adsupport-12.1-py2.py3-none-any.whl", hash = "sha256:97dcd8799dd61f047bb2eb788bbde81f86e95241b5e5173a3a61cfc05b5598b1", size = 3401, upload-time = "2025-11-14T09:35:59.039Z" }, +] + +[[package]] +name = "pyobjc-framework-applescriptkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/f1/e0c07b2a9eb98f1a2050f153d287a52a92f873eeddb41b74c52c144d8767/pyobjc_framework_applescriptkit-12.1.tar.gz", hash = "sha256:cb09f88cf0ad9753dedc02720065818f854b50e33eb4194f0ea34de6d7a3eb33", size = 11451, upload-time = "2025-11-14T10:08:43.328Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/70/6c399c6ebc37a4e48acf63967e0a916878aedfe420531f6d739215184c0c/pyobjc_framework_applescriptkit-12.1-py2.py3-none-any.whl", hash = "sha256:b955fc017b524027f635d92a8a45a5fd9fbae898f3e03de16ecd94aa4c4db987", size = 4352, upload-time = "2025-11-14T09:36:00.705Z" }, +] + +[[package]] +name = "pyobjc-framework-applescriptobjc" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/4b/e4d1592207cbe17355e01828bdd11dd58f31356108f6a49f5e0484a5df50/pyobjc_framework_applescriptobjc-12.1.tar.gz", hash = "sha256:dce080ed07409b0dda2fee75d559bd312ea1ef0243a4338606440f282a6a0f5f", size = 11588, upload-time = "2025-11-14T10:08:45.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/5f/9ce6706399706930eb29c5308037109c30cfb36f943a6df66fdf38cc842a/pyobjc_framework_applescriptobjc-12.1-py2.py3-none-any.whl", hash = "sha256:79068f982cc22471712ce808c0a8fd5deea11258fc8d8c61968a84b1962a3d10", size = 4454, upload-time = "2025-11-14T09:36:02.276Z" }, +] + +[[package]] +name = "pyobjc-framework-applicationservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coretext" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/6a/d4e613c8e926a5744fc47a9e9fea08384a510dc4f27d844f7ad7a2d793bd/pyobjc_framework_applicationservices-12.1.tar.gz", hash = "sha256:c06abb74f119bc27aeb41bf1aef8102c0ae1288aec1ac8665ea186a067a8945b", size = 103247, upload-time = "2025-11-14T10:08:52.18Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/a7/55fa88def5c02732c4b747606ff1cbce6e1f890734bbd00f5596b21eaa02/pyobjc_framework_applicationservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c8f6e2fb3b3e9214ab4864ef04eee18f592b46a986c86ea0113448b310520532", size = 32835, upload-time = "2025-11-14T09:36:11.855Z" }, +] + +[[package]] +name = "pyobjc-framework-apptrackingtransparency" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/de/f24348982ecab0cb13067c348fc5fbc882c60d704ca290bada9a2b3e594b/pyobjc_framework_apptrackingtransparency-12.1.tar.gz", hash = "sha256:e25bf4e4dfa2d929993ee8e852b28fdf332fa6cde0a33328fdc3b2f502fa50ec", size = 12407, upload-time = "2025-11-14T10:08:54.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/b2/90120b93ecfb099b6af21696c26356ad0f2182bdef72b6cba28aa6472ca6/pyobjc_framework_apptrackingtransparency-12.1-py2.py3-none-any.whl", hash = "sha256:23a98ade55495f2f992ecf62c3cbd8f648cbd68ba5539c3f795bf66de82e37ca", size = 3879, upload-time = "2025-11-14T09:36:26.425Z" }, +] + +[[package]] +name = "pyobjc-framework-arkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/8b/843fe08e696bca8e7fc129344965ab6280f8336f64f01ba0a8862d219c3f/pyobjc_framework_arkit-12.1.tar.gz", hash = "sha256:0c5c6b702926179700b68ba29b8247464c3b609fd002a07a3308e72cfa953adf", size = 35814, upload-time = "2025-11-14T10:08:57.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/1e/64c55b409243b3eb9abc7a99e7b27ad4e16b9e74bc4b507fb7e7b81fd41a/pyobjc_framework_arkit-12.1-py2.py3-none-any.whl", hash = "sha256:f6d39e28d858ee03f052d6780a552247e682204382dbc090f1d3192fa1b21493", size = 8302, upload-time = "2025-11-14T09:36:28.127Z" }, +] + +[[package]] +name = "pyobjc-framework-audiovideobridging" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/51/f81581e7a3c5cb6c9254c6f1e1ee1d614930493761dec491b5b0d49544b9/pyobjc_framework_audiovideobridging-12.1.tar.gz", hash = "sha256:6230ace6bec1f38e8a727c35d054a7be54e039b3053f98e6dd8d08d6baee2625", size = 38457, upload-time = "2025-11-14T10:09:01.122Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/8e/a28badfcc6c731696e3d3a8a83927bd844d992f9152f903c2fee355702ca/pyobjc_framework_audiovideobridging-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:010021502649e2cca4e999a7c09358d48c6b0ed83530bbc0b85bba6834340e4b", size = 11052, upload-time = "2025-11-14T09:36:34.475Z" }, +] + +[[package]] +name = "pyobjc-framework-authenticationservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/18/86218de3bf67fc1d810065f353d9df70c740de567ebee8550d476cb23862/pyobjc_framework_authenticationservices-12.1.tar.gz", hash = "sha256:cef71faeae2559f5c0ff9a81c9ceea1c81108e2f4ec7de52a98c269feff7a4b6", size = 58683, upload-time = "2025-11-14T10:09:06.003Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/1d/e9f296fe1ee9a074ff6c45ce9eb109fc3b45696de000f373265c8e42fd47/pyobjc_framework_authenticationservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6fd5ce10fe5359cbbfe03eb12cab3e01992b32ab65653c579b00ac93cf674985", size = 20738, upload-time = "2025-11-14T09:36:51.094Z" }, +] + +[[package]] +name = "pyobjc-framework-automaticassessmentconfiguration" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/24/080afe8189c47c4bb3daa191ccfd962400ca31a67c14b0f7c2d002c2e249/pyobjc_framework_automaticassessmentconfiguration-12.1.tar.gz", hash = "sha256:2b732c02d9097682ca16e48f5d3b10056b740bc091e217ee4d5715194c8970b1", size = 21895, upload-time = "2025-11-14T10:09:08.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/b2/fbec3d649bf275d7a9604e5f56015be02ef8dcf002f4ae4d760436b8e222/pyobjc_framework_automaticassessmentconfiguration-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c2e22ea67d7e6d6a84d968169f83d92b59857a49ab12132de07345adbfea8a62", size = 9332, upload-time = "2025-11-14T09:37:07.083Z" }, +] + +[[package]] +name = "pyobjc-framework-automator" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/08/362bf6ac2bba393c46cf56078d4578b692b56857c385e47690637a72f0dd/pyobjc_framework_automator-12.1.tar.gz", hash = "sha256:7491a99347bb30da3a3f744052a03434ee29bee3e2ae520576f7e796740e4ba7", size = 186068, upload-time = "2025-11-14T10:09:20.82Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/36/2e8c36ddf20d501f9d344ed694e39021190faffc44b596f3a430bf437174/pyobjc_framework_automator-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4df9aec77f0fbca66cd3534d1b8398fe6f3e3c2748c0fc12fec2546c7f2e3ffd", size = 10034, upload-time = "2025-11-14T09:37:20.293Z" }, +] + +[[package]] +name = "pyobjc-framework-avfoundation" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/42/c026ab308edc2ed5582d8b4b93da6b15d1b6557c0086914a4aabedd1f032/pyobjc_framework_avfoundation-12.1.tar.gz", hash = "sha256:eda0bb60be380f9ba2344600c4231dd58a3efafa99fdc65d3673ecfbb83f6fcb", size = 310047, upload-time = "2025-11-14T10:09:40.069Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/00/ca471e5dd33f040f69320832e45415d00440260bf7f8221a9df4c4662659/pyobjc_framework_avfoundation-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bf634f89265b4d93126153200d885b6de4859ed6b3bc65e69ff75540bc398406", size = 83375, upload-time = "2025-11-14T09:37:47.262Z" }, +] + +[[package]] +name = "pyobjc-framework-avkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/a9/e44db1a1f26e2882c140f1d502d508b1f240af9048909dcf1e1a687375b4/pyobjc_framework_avkit-12.1.tar.gz", hash = "sha256:a5c0ddb0cb700f9b09c8afeca2c58952d554139e9bb078236d2355b1fddfb588", size = 28473, upload-time = "2025-11-14T10:09:43.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/34/e77b18f7ed0bd707afd388702e910bdf2d0acee39d1139e8619c916d3eb4/pyobjc_framework_avkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eef2c0a51465de025a4509db05ef18ca2b678bb00ee0a8fbad7fd470edfd58f9", size = 11613, upload-time = "2025-11-14T09:38:19.78Z" }, +] + +[[package]] +name = "pyobjc-framework-avrouting" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/83/15bf6c28ec100dae7f92d37c9e117b3b4ee6b4873db062833e16f1cfd6c4/pyobjc_framework_avrouting-12.1.tar.gz", hash = "sha256:6a6c5e583d14f6501df530a9d0559a32269a821fc8140e3646015f097155cd1c", size = 20031, upload-time = "2025-11-14T10:09:45.701Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/54/fa24f666525c1332a11b2de959c9877b0fe08f00f29ecf96964b24246c13/pyobjc_framework_avrouting-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c0fb0d3d260527320377a70c87688ca5e4a208b09fddcae2b4257d7fe9b1e18", size = 8450, upload-time = "2025-11-14T09:38:34.941Z" }, +] + +[[package]] +name = "pyobjc-framework-backgroundassets" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/d1/e917fba82790495152fd3508c5053827658881cf7e9887ba60def5e3f221/pyobjc_framework_backgroundassets-12.1.tar.gz", hash = "sha256:8da34df9ae4519c360c429415477fdaf3fbba5addbc647b3340b8783454eb419", size = 26210, upload-time = "2025-11-14T10:09:48.792Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/34/bbba61f0e8ecb0fe0da7aa2c9ea15f7cb0dca2fb2914fcdcd77b782b5c11/pyobjc_framework_backgroundassets-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2c11cb98650c1a4bc68eeb4b040541ba96613434c5957e98e9bb363413b23c91", size = 10786, upload-time = "2025-11-14T09:38:48.341Z" }, +] + +[[package]] +name = "pyobjc-framework-browserenginekit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/b9/39f9de1730e6f8e73be0e4f0c6087cd9439cbe11645b8052d22e1fb8e69b/pyobjc_framework_browserenginekit-12.1.tar.gz", hash = "sha256:6a1a34a155778ab55ab5f463e885f2a3b4680231264e1fe078e62ddeccce49ed", size = 29120, upload-time = "2025-11-14T10:09:51.582Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/e0/8d2cebbfcfd6aacb805ae0ae7ba931f6a39140540b2e1e96719e7be28359/pyobjc_framework_browserenginekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d15766bb841b081447015c9626e2a766febfe651f487893d29c5d72bef976b94", size = 11545, upload-time = "2025-11-14T09:39:00.988Z" }, +] + +[[package]] +name = "pyobjc-framework-businesschat" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/da/bc09b6ed19e9ea38ecca9387c291ca11fa680a8132d82b27030f82551c23/pyobjc_framework_businesschat-12.1.tar.gz", hash = "sha256:f6fa3a8369a1a51363e1757530128741d9d09ed90692a1d6777a4c0fbad25868", size = 12055, upload-time = "2025-11-14T10:09:53.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/88/4c727424b05efa33ed7f6c45e40333e5a8a8dc5bb238e34695addd68463b/pyobjc_framework_businesschat-12.1-py2.py3-none-any.whl", hash = "sha256:f66ce741507b324de3c301d72ba0cfa6aaf7093d7235972332807645c118cc29", size = 3474, upload-time = "2025-11-14T09:39:10.771Z" }, +] + +[[package]] +name = "pyobjc-framework-calendarstore" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/41/ae955d1c44dcc18b5b9df45c679e9a08311a0f853b9d981bca760cf1eef2/pyobjc_framework_calendarstore-12.1.tar.gz", hash = "sha256:f9a798d560a3c99ad4c0d2af68767bc5695d8b1aabef04d8377861cd1d6d1670", size = 52272, upload-time = "2025-11-14T10:09:58.48Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/70/f68aebdb7d3fa2dec2e9da9e9cdaa76d370de326a495917dbcde7bb7711e/pyobjc_framework_calendarstore-12.1-py2.py3-none-any.whl", hash = "sha256:18533e0fcbcdd29ee5884dfbd30606710f65df9b688bf47daee1438ee22e50cc", size = 5285, upload-time = "2025-11-14T09:39:12.473Z" }, +] + +[[package]] +name = "pyobjc-framework-callkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/c0/1859d4532d39254df085309aff55b85323576f00a883626325af40da4653/pyobjc_framework_callkit-12.1.tar.gz", hash = "sha256:fd6dc9688b785aab360139d683be56f0844bf68bf5e45d0eb770cb68221083cc", size = 29171, upload-time = "2025-11-14T10:10:01.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/b7/b3a498b14751b4be6af5272c9be9ded718aa850ebf769b052c7d610a142a/pyobjc_framework_callkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:12adc0ace464a057f8908187698e1d417c6c53619797a69d096f4329bffb1089", size = 11334, upload-time = "2025-11-14T09:39:18.622Z" }, +] + +[[package]] +name = "pyobjc-framework-carbon" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/0f/9ab8e518a4e5ac4a1e2fdde38a054c32aef82787ff7f30927345c18b7765/pyobjc_framework_carbon-12.1.tar.gz", hash = "sha256:57a72807db252d5746caccc46da4bd20ff8ea9e82109af9f72735579645ff4f0", size = 37293, upload-time = "2025-11-14T10:10:04.464Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/9e/91853c8f98b9d5bccf464113908620c94cc12c2a3e4625f3ce172e3ea4bc/pyobjc_framework_carbon-12.1-py2.py3-none-any.whl", hash = "sha256:f8b719b3c7c5cf1d61ac7c45a8a70b5e5e5a83fa02f5194c2a48a7e81a3d1b7f", size = 4625, upload-time = "2025-11-14T09:39:27.937Z" }, +] + +[[package]] +name = "pyobjc-framework-cfnetwork" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/6a/f5f0f191956e187db85312cbffcc41bf863670d121b9190b4a35f0d36403/pyobjc_framework_cfnetwork-12.1.tar.gz", hash = "sha256:2d16e820f2d43522c793f55833fda89888139d7a84ca5758548ba1f3a325a88d", size = 44383, upload-time = "2025-11-14T10:10:08.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/0b/28034e63f3a25b30ede814469c3f57d44268cbced19664c84a8664200f9d/pyobjc_framework_cfnetwork-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:92760da248c757085fc39bce4388a0f6f0b67540e51edf60a92ad60ca907d071", size = 19135, upload-time = "2025-11-14T09:39:36.382Z" }, +] + +[[package]] +name = "pyobjc-framework-cinematic" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/4e/f4cc7f9f7f66df0290c90fe445f1ff5aa514c6634f5203fe049161053716/pyobjc_framework_cinematic-12.1.tar.gz", hash = "sha256:795068c30447548c0e8614e9c432d4b288b13d5614622ef2f9e3246132329b06", size = 21215, upload-time = "2025-11-14T10:10:10.795Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/a0/cd85c827ce5535c08d936e5723c16ee49f7ff633f2e9881f4f58bf83e4ce/pyobjc_framework_cinematic-12.1-py2.py3-none-any.whl", hash = "sha256:c003543bb6908379680a93dfd77a44228686b86c118cf3bc930f60241d0cd141", size = 5031, upload-time = "2025-11-14T09:39:49.003Z" }, +] + +[[package]] +name = "pyobjc-framework-classkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/ef/67815278023b344a79c7e95f748f647245d6f5305136fc80615254ad447c/pyobjc_framework_classkit-12.1.tar.gz", hash = "sha256:8d1e9dd75c3d14938ff533d88b72bca2d34918e4461f418ea323bfb2498473b4", size = 26298, upload-time = "2025-11-14T10:10:13.406Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/5e/cf43c647af872499fc8e80cc6ac6e9ad77d9c77861dc2e62bdd9b01473ce/pyobjc_framework_classkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c027a3cd9be5fee3f605589118b8b278297c384a271f224c1a98b224e0c087e6", size = 8877, upload-time = "2025-11-14T09:39:54.979Z" }, +] + +[[package]] +name = "pyobjc-framework-cloudkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-accounts" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coredata" }, + { name = "pyobjc-framework-corelocation" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/09/762ee4f3ae8568b8e0e5392c705bc4aa1929aa454646c124ca470f1bf9fc/pyobjc_framework_cloudkit-12.1.tar.gz", hash = "sha256:1dddd38e60863f88adb3d1d37d3b4ccb9cbff48c4ef02ab50e36fa40c2379d2f", size = 53730, upload-time = "2025-11-14T10:10:17.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/71/cbef7179bf1a594558ea27f1e5ad18f5c17ef71a8a24192aae16127bc849/pyobjc_framework_cloudkit-12.1-py2.py3-none-any.whl", hash = "sha256:875e37bf1a2ce3d05c2492692650104f2d908b56b71a0aedf6620bc517c6c9ca", size = 11090, upload-time = "2025-11-14T09:40:04.207Z" }, +] + +[[package]] +name = "pyobjc-framework-cocoa" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/a3/16ca9a15e77c061a9250afbae2eae26f2e1579eb8ca9462ae2d2c71e1169/pyobjc_framework_cocoa-12.1.tar.gz", hash = "sha256:5556c87db95711b985d5efdaaf01c917ddd41d148b1e52a0c66b1a2e2c5c1640", size = 2772191, upload-time = "2025-11-14T10:13:02.069Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/bf/ee4f27ec3920d5c6fc63c63e797c5b2cc4e20fe439217085d01ea5b63856/pyobjc_framework_cocoa-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:547c182837214b7ec4796dac5aee3aa25abc665757b75d7f44f83c994bcb0858", size = 384590, upload-time = "2025-11-14T09:41:17.336Z" }, +] + +[[package]] +name = "pyobjc-framework-collaboration" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/21/77fe64b39eae98412de1a0d33e9c735aa9949d53fff6b2d81403572b410b/pyobjc_framework_collaboration-12.1.tar.gz", hash = "sha256:2afa264d3233fc0a03a56789c6fefe655ffd81a2da4ba1dc79ea0c45931ad47b", size = 14299, upload-time = "2025-11-14T10:13:04.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/66/1507de01f1e2b309f8e11553a52769e4e2e9939ed770b5b560ef5bc27bc1/pyobjc_framework_collaboration-12.1-py2.py3-none-any.whl", hash = "sha256:182d6e6080833b97f9bef61738ae7bacb509714538f0d7281e5f0814c804b315", size = 4907, upload-time = "2025-11-14T09:42:55.781Z" }, +] + +[[package]] +name = "pyobjc-framework-colorsync" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/b4/706e4cc9db25b400201fc90f3edfaa1ab2d51b400b19437b043a68532078/pyobjc_framework_colorsync-12.1.tar.gz", hash = "sha256:d69dab7df01245a8c1bd536b9231c97993a5d1a2765d77692ce40ebbe6c1b8e9", size = 25269, upload-time = "2025-11-14T10:13:07.522Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/e1/82e45c712f43905ee1e6d585180764e8fa6b6f1377feb872f9f03c8c1fb8/pyobjc_framework_colorsync-12.1-py2.py3-none-any.whl", hash = "sha256:41e08d5b9a7af4b380c9adab24c7ff59dfd607b3073ae466693a3e791d8ffdc9", size = 6020, upload-time = "2025-11-14T09:42:57.504Z" }, +] + +[[package]] +name = "pyobjc-framework-compositorservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/c5/0ba31d7af7e464b7f7ece8c2bd09112bdb0b7260848402e79ba6aacc622c/pyobjc_framework_compositorservices-12.1.tar.gz", hash = "sha256:028e357bbee7fbd3723339a321bbe14e6da5a772708a661a13eea5f17c89e4ab", size = 23292, upload-time = "2025-11-14T10:13:10.392Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/34/5a2de8d531dbb88023898e0b5d2ce8edee14751af6c70e6103f6aa31a669/pyobjc_framework_compositorservices-12.1-py2.py3-none-any.whl", hash = "sha256:9ef22d4eacd492e13099b9b8936db892cdbbef1e3d23c3484e0ed749f83c4984", size = 5910, upload-time = "2025-11-14T09:42:59.154Z" }, +] + +[[package]] +name = "pyobjc-framework-contacts" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/a0/ce0542d211d4ea02f5cbcf72ee0a16b66b0d477a4ba5c32e00117703f2f0/pyobjc_framework_contacts-12.1.tar.gz", hash = "sha256:89bca3c5cf31404b714abaa1673577e1aaad6f2ef49d4141c6dbcc0643a789ad", size = 42378, upload-time = "2025-11-14T10:13:14.203Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/c8/2c4638c0d06447886a34070eebb9ba57407d4dd5f0fcb7ab642568272b88/pyobjc_framework_contacts-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2e5ce33b686eb9c0a39351938a756442ea8dea88f6ae2f16bff5494a8569c687", size = 12165, upload-time = "2025-11-14T09:43:05.119Z" }, +] + +[[package]] +name = "pyobjc-framework-contactsui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-contacts" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/0c/7bb7f898456a81d88d06a1084a42e374519d2e40a668a872b69b11f8c1f9/pyobjc_framework_contactsui-12.1.tar.gz", hash = "sha256:aaeca7c9e0c9c4e224d73636f9a558f9368c2c7422155a41fd4d7a13613a77c1", size = 18769, upload-time = "2025-11-14T10:13:16.301Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/ab/319aa52dfe6f836f4dc542282c2c13996222d4f5c9ea7ff8f391b12dac83/pyobjc_framework_contactsui-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:057f40d2f6eb1b169a300675ec75cc7a747cddcbcee8ece133e652a7086c5ab5", size = 7888, upload-time = "2025-11-14T09:43:18.502Z" }, +] + +[[package]] +name = "pyobjc-framework-coreaudio" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/d1/0b884c5564ab952ff5daa949128c64815300556019c1bba0cf2ca752a1a0/pyobjc_framework_coreaudio-12.1.tar.gz", hash = "sha256:a9e72925fcc1795430496ce0bffd4ddaa92c22460a10308a7283ade830089fe1", size = 75077, upload-time = "2025-11-14T10:13:22.345Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/48/05b5192122e23140cf583eac99ccc5bf615591d6ff76483ba986c38ee750/pyobjc_framework_coreaudio-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a5ad6309779663f846ab36fe6c49647e470b7e08473c3e48b4f004017bdb68a4", size = 36908, upload-time = "2025-11-14T09:43:36.108Z" }, +] + +[[package]] +name = "pyobjc-framework-coreaudiokit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreaudio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/41/1c/5c7e39b9361d4eec99b9115b593edd9825388acd594cb3b4519f8f1ac12c/pyobjc_framework_coreaudiokit-12.1.tar.gz", hash = "sha256:b83624f8de3068ab2ca279f786be0804da5cf904ff9979d96007b69ef4869e1e", size = 20137, upload-time = "2025-11-14T10:13:24.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/d7/f171c04c6496afeaad2ab658b0c810682c8407127edc94d4b3f3b90c2bb1/pyobjc_framework_coreaudiokit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:97d5dd857e73d5b597cfc980972b021314b760e2f5bdde7bbba0334fbf404722", size = 7273, upload-time = "2025-11-14T09:43:55.411Z" }, +] + +[[package]] +name = "pyobjc-framework-corebluetooth" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/25/d21d6cb3fd249c2c2aa96ee54279f40876a0c93e7161b3304bf21cbd0bfe/pyobjc_framework_corebluetooth-12.1.tar.gz", hash = "sha256:8060c1466d90bbb9100741a1091bb79975d9ba43911c9841599879fc45c2bbe0", size = 33157, upload-time = "2025-11-14T10:13:28.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/56/01fef62a479cdd6ff9ee40b6e062a205408ff386ce5ba56d7e14a71fcf73/pyobjc_framework_corebluetooth-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe72c9732ee6c5c793b9543f08c1f5bdd98cd95dfc9d96efd5708ec9d6eeb213", size = 13209, upload-time = "2025-11-14T09:44:08.203Z" }, +] + +[[package]] +name = "pyobjc-framework-coredata" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/c5/8cd46cd4f1b7cf88bdeed3848f830ea9cdcc4e55cd0287a968a2838033fb/pyobjc_framework_coredata-12.1.tar.gz", hash = "sha256:1e47d3c5e51fdc87a90da62b97cae1bc49931a2bb064db1305827028e1fc0ffa", size = 124348, upload-time = "2025-11-14T10:13:36.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/29/fe24dc81e0f154805534923a56fe572c3b296092f086cf5a239fccc2d46a/pyobjc_framework_coredata-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a3ee3581ca23ead0b152257e98622fe0bf7e7948f30a62a25a17cafe28fe015e", size = 16409, upload-time = "2025-11-14T09:44:23.582Z" }, +] + +[[package]] +name = "pyobjc-framework-corehaptics" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/2f/74a3da79d9188b05dd4be4428a819ea6992d4dfaedf7d629027cf1f57bfc/pyobjc_framework_corehaptics-12.1.tar.gz", hash = "sha256:521dd2986c8a4266d583dd9ed9ae42053b11ae7d3aa89bf53fbee88307d8db10", size = 22164, upload-time = "2025-11-14T10:13:38.941Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/f4/f469d6a9cac7c195f3d08fa65f94c32dd1dcf97a54b481be648fb3a7a5f3/pyobjc_framework_corehaptics-12.1-py2.py3-none-any.whl", hash = "sha256:a3b07d36ddf5c86a9cdaa411ab53d09553d26ea04fc7d4f82d21a84f0fc05fc0", size = 5382, upload-time = "2025-11-14T09:44:34.725Z" }, +] + +[[package]] +name = "pyobjc-framework-corelocation" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/79/b75885e0d75397dc2fe1ed9ca80be2b64c18b817f5fb924277cb1bf7b163/pyobjc_framework_corelocation-12.1.tar.gz", hash = "sha256:3674e9353f949d91dde6230ad68f6d5748a7f0424751e08a2c09d06050d66231", size = 53511, upload-time = "2025-11-14T10:13:43.384Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/57/1b670890fbf650f1a00afe5ee897ea3856a4a1417c2304c633ee2e978ed0/pyobjc_framework_corelocation-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8c35ad29a062fea7d417fd8997a9309660ba7963f2847c004e670efbe6bb5b00", size = 12721, upload-time = "2025-11-14T09:44:41.185Z" }, +] + +[[package]] +name = "pyobjc-framework-coremedia" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/7d/5ad600ff7aedfef8ba8f51b11d9aaacdf247b870bd14045d6e6f232e3df9/pyobjc_framework_coremedia-12.1.tar.gz", hash = "sha256:166c66a9c01e7a70103f3ca44c571431d124b9070612ef63a1511a4e6d9d84a7", size = 89566, upload-time = "2025-11-14T10:13:49.788Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/ae/f773cdc33c34a3f9ce6db829dbf72661b65c28ea9efaec8940364185b977/pyobjc_framework_coremedia-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:161a627f5c8cd30a5ebb935189f740e21e6cd94871a9afd463efdb5d51e255fa", size = 29396, upload-time = "2025-11-14T09:44:57.563Z" }, +] + +[[package]] +name = "pyobjc-framework-coremediaio" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/8e/23baee53ccd6c011c965cff62eb55638b4088c3df27d2bf05004105d6190/pyobjc_framework_coremediaio-12.1.tar.gz", hash = "sha256:880b313b28f00b27775d630174d09e0b53d1cdbadb74216618c9dd5b3eb6806a", size = 51100, upload-time = "2025-11-14T10:13:54.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/0c/9425c53c9a8c26e468e065ba12ef076bab20197ff7c82052a6dddd46d42b/pyobjc_framework_coremediaio-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1108f8a278928fbca465f95123ea4a56456bd6571c1dc8b91793e6c61d624517", size = 17277, upload-time = "2025-11-14T09:45:17.457Z" }, +] + +[[package]] +name = "pyobjc-framework-coremidi" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/96/2d583060a71a73c8a7e6d92f2a02675621b63c1f489f2639e020fae34792/pyobjc_framework_coremidi-12.1.tar.gz", hash = "sha256:3c6f1fd03997c3b0f20ab8545126b1ce5f0cddcc1587dffacad876c161da8c54", size = 55587, upload-time = "2025-11-14T10:13:58.903Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/2d/99520f6f1685e4cad816e55cbf6d85f8ce6ea908107950e2d37dc17219d8/pyobjc_framework_coremidi-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e84ffc1de59691c04201b0872e184fe55b5589f3a14876bd14460f3b5f3cd109", size = 24317, upload-time = "2025-11-14T09:45:34.92Z" }, +] + +[[package]] +name = "pyobjc-framework-coreml" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/2d/baa9ea02cbb1c200683cb7273b69b4bee5070e86f2060b77e6a27c2a9d7e/pyobjc_framework_coreml-12.1.tar.gz", hash = "sha256:0d1a4216891a18775c9e0170d908714c18e4f53f9dc79fb0f5263b2aa81609ba", size = 40465, upload-time = "2025-11-14T10:14:02.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/39/4defef0deb25c5d7e3b7826d301e71ac5b54ef901b7dac4db1adc00f172d/pyobjc_framework_coreml-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:10dc8e8db53d7631ebc712cad146e3a9a9a443f4e1a037e844149a24c3c42669", size = 11356, upload-time = "2025-11-14T09:45:52.271Z" }, +] + +[[package]] +name = "pyobjc-framework-coremotion" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/eb/abef7d405670cf9c844befc2330a46ee59f6ff7bac6f199bf249561a2ca6/pyobjc_framework_coremotion-12.1.tar.gz", hash = "sha256:8e1b094d34084cc8cf07bedc0630b4ee7f32b0215011f79c9e3cd09d205a27c7", size = 33851, upload-time = "2025-11-14T10:14:05.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/75/89fa4aab818aeca21ac0a60b7ceb89a9e685df0ddd3828d36a6f84a0cff0/pyobjc_framework_coremotion-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a77908ab83c422030f913a2a761d196359ab47f6d1e7c76f21de2c6c05ea2f5f", size = 10406, upload-time = "2025-11-14T09:46:05.076Z" }, +] + +[[package]] +name = "pyobjc-framework-coreservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-fsevents" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/b3/52338a3ff41713f7d7bccaf63bef4ba4a8f2ce0c7eaff39a3629d022a79a/pyobjc_framework_coreservices-12.1.tar.gz", hash = "sha256:fc6a9f18fc6da64c166fe95f2defeb7ac8a9836b3b03bb6a891d36035260dbaa", size = 366150, upload-time = "2025-11-14T10:14:28.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/6c/33984caaf497fc5a6f86350d7ca4fac8abeb2bc33203edc96955a21e8c05/pyobjc_framework_coreservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8751dc2edcb7cfa248bf8a274c4d6493e8d53ef28a843827a4fc9a0a8b04b8be", size = 30206, upload-time = "2025-11-14T09:46:22.732Z" }, +] + +[[package]] +name = "pyobjc-framework-corespotlight" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/d0/88ca73b0cf23847af463334989dd8f98e44f801b811e7e1d8a5627ec20b4/pyobjc_framework_corespotlight-12.1.tar.gz", hash = "sha256:57add47380cd0bbb9793f50a4a4b435a90d4ebd2a33698e058cb353ddfb0d068", size = 38002, upload-time = "2025-11-14T10:14:31.948Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/3b/d3031eddff8029859de6d92b1f741625b1c233748889141a6a5a89b96f0e/pyobjc_framework_corespotlight-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bfcea64ab3250e2886d202b8731be3817b5ac0c8c9f43e77d0d5a0b6602e71a7", size = 9996, upload-time = "2025-11-14T09:46:47.157Z" }, +] + +[[package]] +name = "pyobjc-framework-coretext" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/da/682c9c92a39f713bd3c56e7375fa8f1b10ad558ecb075258ab6f1cdd4a6d/pyobjc_framework_coretext-12.1.tar.gz", hash = "sha256:e0adb717738fae395dc645c9e8a10bb5f6a4277e73cba8fa2a57f3b518e71da5", size = 90124, upload-time = "2025-11-14T10:14:38.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/0f/ddf45bf0e3ba4fbdc7772de4728fd97ffc34a0b5a15e1ab1115b202fe4ae/pyobjc_framework_coretext-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d246fa654bdbf43bae3969887d58f0b336c29b795ad55a54eb76397d0e62b93c", size = 30108, upload-time = "2025-11-14T09:47:04.228Z" }, +] + +[[package]] +name = "pyobjc-framework-corewlan" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/71/739a5d023566b506b3fd3d2412983faa95a8c16226c0dcd0f67a9294a342/pyobjc_framework_corewlan-12.1.tar.gz", hash = "sha256:a9d82ec71ef61f37e1d611caf51a4203f3dbd8caf827e98128a1afaa0fd2feb5", size = 32417, upload-time = "2025-11-14T10:14:41.921Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/31/3e9cf2c0ac3c979062958eae7a275b602515c9c76fd30680e1ee0fea82ae/pyobjc_framework_corewlan-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5cba04c0550fc777767cd3a5471e4ed837406ab182d7d5c273bc5ce6ea237bfe", size = 9958, upload-time = "2025-11-14T09:47:22.474Z" }, +] + +[[package]] +name = "pyobjc-framework-cryptotokenkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/7c/d03ff4f74054578577296f33bc669fce16c7827eb1a553bb372b5aab30ca/pyobjc_framework_cryptotokenkit-12.1.tar.gz", hash = "sha256:c95116b4b7a41bf5b54aff823a4ef6f4d9da4d0441996d6d2c115026a42d82f5", size = 32716, upload-time = "2025-11-14T10:14:45.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/c7/aecba253cf21303b2c9f3ce03fc0e987523609d7839ea8e0a688ae816c96/pyobjc_framework_cryptotokenkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ef51a86c1d0125fabdfad0b3efa51098fb03660d8dad2787d82e8b71c9f189de", size = 12633, upload-time = "2025-11-14T09:47:35.707Z" }, +] + +[[package]] +name = "pyobjc-framework-datadetection" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/97/9b03832695ec4d3008e6150ddfdc581b0fda559d9709a98b62815581259a/pyobjc_framework_datadetection-12.1.tar.gz", hash = "sha256:95539e46d3bc970ce890aa4a97515db10b2690597c5dd362996794572e5d5de0", size = 12323, upload-time = "2025-11-14T10:14:46.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/1c/5d2f941501e84da8fef8ef3fd378b5c083f063f083f97dd3e8a07f0404b3/pyobjc_framework_datadetection-12.1-py2.py3-none-any.whl", hash = "sha256:4dc8e1d386d655b44b2681a4a2341fb2fc9addbf3dda14cb1553cd22be6a5387", size = 3497, upload-time = "2025-11-14T09:47:45.826Z" }, +] + +[[package]] +name = "pyobjc-framework-devicecheck" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/af/c676107c40d51f55d0a42043865d7246db821d01241b518ea1d3b3ef1394/pyobjc_framework_devicecheck-12.1.tar.gz", hash = "sha256:567e85fc1f567b3fe64ac1cdc323d989509331f64ee54fbcbde2001aec5adbdb", size = 12885, upload-time = "2025-11-14T10:14:48.804Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/d8/1f1b13fa4775b6474c9ad0f4b823953eaeb6c11bd6f03fa8479429b36577/pyobjc_framework_devicecheck-12.1-py2.py3-none-any.whl", hash = "sha256:ffd58148bdef4a1ee8548b243861b7d97a686e73808ca0efac5bef3c430e4a15", size = 3684, upload-time = "2025-11-14T09:47:47.25Z" }, +] + +[[package]] +name = "pyobjc-framework-devicediscoveryextension" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/b0/e6e2ed6a7f4b689746818000a003ff7ab9c10945df66398ae8d323ae9579/pyobjc_framework_devicediscoveryextension-12.1.tar.gz", hash = "sha256:60e12445fad97ff1f83472255c943685a8f3a9d95b3126d887cfe769b7261044", size = 14718, upload-time = "2025-11-14T10:14:50.723Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/0c/005fe8db1e19135f493a3de8c8d38031e1ad2d626de4ef89f282acf4aff7/pyobjc_framework_devicediscoveryextension-12.1-py2.py3-none-any.whl", hash = "sha256:d6d6b606d27d4d88efc0bed4727c375e749149b360290c3ad2afc52337739a1b", size = 4321, upload-time = "2025-11-14T09:47:48.78Z" }, +] + +[[package]] +name = "pyobjc-framework-dictionaryservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/c0/daf03cdaf6d4e04e0cf164db358378c07facd21e4e3f8622505d72573e2c/pyobjc_framework_dictionaryservices-12.1.tar.gz", hash = "sha256:354158f3c55d66681fa903c7b3cb05a435b717fa78d0cef44d258d61156454a7", size = 10573, upload-time = "2025-11-14T10:14:53.961Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/13/ab308e934146cfd54691ddad87e572cd1edb6659d795903c4c75904e2d7d/pyobjc_framework_dictionaryservices-12.1-py2.py3-none-any.whl", hash = "sha256:578854eec17fa473ac17ab30050a7bbb2ab69f17c5c49b673695254c3e88ad4b", size = 3930, upload-time = "2025-11-14T09:47:50.782Z" }, +] + +[[package]] +name = "pyobjc-framework-discrecording" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/87/8bd4544793bfcdf507174abddd02b1f077b48fab0004b3db9a63142ce7e9/pyobjc_framework_discrecording-12.1.tar.gz", hash = "sha256:6defc8ea97fb33b4d43870c673710c04c3dc48be30cdf78ba28191a922094990", size = 55607, upload-time = "2025-11-14T10:14:58.276Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/70/14a5aa348a5eba16e8773bb56698575cf114aa55aa303037b7000fc53959/pyobjc_framework_discrecording-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:865f1551e58459da6073360afc8f2cc452472c676ba83dcaa9b0c44e7775e4b5", size = 14566, upload-time = "2025-11-14T09:47:57.503Z" }, +] + +[[package]] +name = "pyobjc-framework-discrecordingui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-discrecording" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/63/8667f5bb1ecb556add04e86b278cb358dc1f2f03862705cae6f09097464c/pyobjc_framework_discrecordingui-12.1.tar.gz", hash = "sha256:6793d4a1a7f3219d063f39d87f1d4ebbbb3347e35d09194a193cfe16cba718a8", size = 16450, upload-time = "2025-11-14T10:15:00.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/4e/76016130c27b98943c5758a05beab3ba1bc9349ee881e1dfc509ea954233/pyobjc_framework_discrecordingui-12.1-py2.py3-none-any.whl", hash = "sha256:6544ef99cad3dee95716c83cb207088768b6ecd3de178f7e1b17df5997689dfd", size = 4702, upload-time = "2025-11-14T09:48:08.01Z" }, +] + +[[package]] +name = "pyobjc-framework-diskarbitration" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/42/f75fcabec1a0033e4c5235cc8225773f610321d565b63bf982c10c6bbee4/pyobjc_framework_diskarbitration-12.1.tar.gz", hash = "sha256:6703bc5a09b38a720c9ffca356b58f7e99fa76fc988c9ec4d87112344e63dfc2", size = 17121, upload-time = "2025-11-14T10:15:02.223Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/65/c1f54c47af17cb6b923eab85e95f22396c52f90ee8f5b387acffad9a99ea/pyobjc_framework_diskarbitration-12.1-py2.py3-none-any.whl", hash = "sha256:54caf3079fe4ae5ac14466a9b68923ee260a1a88a8290686b4a2015ba14c2db6", size = 4877, upload-time = "2025-11-14T09:48:09.945Z" }, +] + +[[package]] +name = "pyobjc-framework-dvdplayback" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/dd/7859a58e8dd336c77f83feb76d502e9623c394ea09322e29a03f5bc04d32/pyobjc_framework_dvdplayback-12.1.tar.gz", hash = "sha256:279345d4b5fb2c47dd8e5c2fd289e644b6648b74f5c25079805eeb61bfc4a9cd", size = 32332, upload-time = "2025-11-14T10:15:05.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/7d/22c07c28fab1f15f0d364806e39a6ca63c737c645fe7e98e157878b5998c/pyobjc_framework_dvdplayback-12.1-py2.py3-none-any.whl", hash = "sha256:af911cc222272a55b46a1a02a46a355279aecfd8132231d8d1b279e252b8ad4c", size = 8243, upload-time = "2025-11-14T09:48:11.824Z" }, +] + +[[package]] +name = "pyobjc-framework-eventkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/42/4ec97e641fdcf30896fe76476181622954cb017117b1429f634d24816711/pyobjc_framework_eventkit-12.1.tar.gz", hash = "sha256:7c1882be2f444b1d0f71e9a0cd1e9c04ad98e0261292ab741fc9de0b8bbbbae9", size = 28538, upload-time = "2025-11-14T10:15:07.878Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/35/142f43227627d6324993869d354b9e57eb1e88c4e229e2271592254daf25/pyobjc_framework_eventkit-12.1-py2.py3-none-any.whl", hash = "sha256:3d2d36d5bd9e0a13887a6ac7cdd36675985ebe2a9cb3cdf8cec0725670c92c60", size = 6820, upload-time = "2025-11-14T09:48:14.035Z" }, +] + +[[package]] +name = "pyobjc-framework-exceptionhandling" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/17/5c9d4164f7ccf6b9100be0ad597a7857395dd58ea492cba4f0e9c0b77049/pyobjc_framework_exceptionhandling-12.1.tar.gz", hash = "sha256:7f0719eeea6695197fce0e7042342daa462683dc466eb6a442aad897032ab00d", size = 16694, upload-time = "2025-11-14T10:15:10.173Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/ad/8e05acf3635f20ea7d878be30d58a484c8b901a8552c501feb7893472f86/pyobjc_framework_exceptionhandling-12.1-py2.py3-none-any.whl", hash = "sha256:2f1eae14cf0162e53a0888d9ffe63f047501fe583a23cdc9c966e89f48cf4713", size = 7113, upload-time = "2025-11-14T09:48:15.685Z" }, +] + +[[package]] +name = "pyobjc-framework-executionpolicy" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/11/db765e76e7b00e1521d7bb3a61ae49b59e7573ac108da174720e5d96b61b/pyobjc_framework_executionpolicy-12.1.tar.gz", hash = "sha256:682866589365cd01d3a724d8a2781794b5cba1e152411a58825ea52d7b972941", size = 12594, upload-time = "2025-11-14T10:15:12.077Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/2c/f10352398f10f244401ab8f53cabd127dc3f5dbbfc8de83464661d716671/pyobjc_framework_executionpolicy-12.1-py2.py3-none-any.whl", hash = "sha256:c3a9eca3bd143cf202787dd5e3f40d954c198f18a5e0b8b3e2fcdd317bf33a52", size = 3739, upload-time = "2025-11-14T09:48:17.35Z" }, +] + +[[package]] +name = "pyobjc-framework-extensionkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/d4/e9b1f74d29ad9dea3d60468d59b80e14ed3a19f9f7a25afcbc10d29c8a1e/pyobjc_framework_extensionkit-12.1.tar.gz", hash = "sha256:773987353e8aba04223dbba3149253db944abfb090c35318b3a770195b75da6d", size = 18694, upload-time = "2025-11-14T10:15:14.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/d9/8064dad6114a489e5439cc20d9fb0dd64cfc406d875b4a3c87015b3f6266/pyobjc_framework_extensionkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7e01d705c7ac6d080ae34a81db6d9b81875eabefa63fd6eafbfa30f676dd780b", size = 7932, upload-time = "2025-11-14T09:48:23.653Z" }, +] + +[[package]] +name = "pyobjc-framework-externalaccessory" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8e/35/86c097ae2fdf912c61c1276e80f3e090a3fc898c75effdf51d86afec456b/pyobjc_framework_externalaccessory-12.1.tar.gz", hash = "sha256:079f770a115d517a6ab87db1b8a62ca6cdf6c35ae65f45eecc21b491e78776c0", size = 20958, upload-time = "2025-11-14T10:15:16.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/52/984034396089766b6e5ff3be0f93470e721c420fa9d1076398557532234f/pyobjc_framework_externalaccessory-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dedbf7a09375ac19668156c1417bd7829565b164a246b714e225b9cbb6a351ad", size = 8932, upload-time = "2025-11-14T09:48:37.393Z" }, +] + +[[package]] +name = "pyobjc-framework-fileprovider" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/9a/724b1fae5709f8860f06a6a2a46de568f9bb8bdb2e2aae45b4e010368f51/pyobjc_framework_fileprovider-12.1.tar.gz", hash = "sha256:45034e0d00ae153c991aa01cb1fd41874650a30093e77ba73401dcce5534c8ad", size = 43071, upload-time = "2025-11-14T10:15:19.989Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/f5/56f0751a2988b2caca89d6800c8f29246828d1a7498bb676ef1ab28000b7/pyobjc_framework_fileprovider-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:89b140ea8369512ddf4164b007cbe35b4d97d1dcb8affa12a7264c0ab8d56e45", size = 21003, upload-time = "2025-11-14T09:48:53.128Z" }, +] + +[[package]] +name = "pyobjc-framework-fileproviderui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-fileprovider" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/00/234f9b93f75255845df81d9d5ea20cb83ecb5c0a4e59147168b622dd0b9d/pyobjc_framework_fileproviderui-12.1.tar.gz", hash = "sha256:15296429d9db0955abc3242b2920b7a810509a85118dbc185f3ac8234e5a6165", size = 12437, upload-time = "2025-11-14T10:15:22.044Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/65/cc4397511bd0af91993d6302a2aed205296a9ad626146eefdfc8a9624219/pyobjc_framework_fileproviderui-12.1-py2.py3-none-any.whl", hash = "sha256:521a914055089e28631018bd78df4c4f7416e98b4150f861d4a5bc97d5b1ffe4", size = 3715, upload-time = "2025-11-14T09:49:04.213Z" }, +] + +[[package]] +name = "pyobjc-framework-findersync" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/63/c8da472e0910238a905bc48620e005a1b8ae7921701408ca13e5fb0bfb4b/pyobjc_framework_findersync-12.1.tar.gz", hash = "sha256:c513104cef0013c233bf8655b527df665ce6f840c8bc0b3781e996933d4dcfa6", size = 13507, upload-time = "2025-11-14T10:15:24.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9f/ec7f393e3e2fd11cbdf930d884a0ba81078bdb61920b3cba4f264de8b446/pyobjc_framework_findersync-12.1-py2.py3-none-any.whl", hash = "sha256:e07abeca52c486cf14927f617afc27afa7a3828b99fab3ad02355105fb29203e", size = 4889, upload-time = "2025-11-14T09:49:05.763Z" }, +] + +[[package]] +name = "pyobjc-framework-fsevents" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/17/21f45d2bca2efc72b975f2dfeae7a163dbeabb1236c1f188578403fd4f09/pyobjc_framework_fsevents-12.1.tar.gz", hash = "sha256:a22350e2aa789dec59b62da869c1b494a429f8c618854b1383d6473f4c065a02", size = 26487, upload-time = "2025-11-14T10:15:26.796Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/e3/2c5eeea390c0b053e2d73b223af3ec87a3e99a8106e8d3ee79942edb0822/pyobjc_framework_fsevents-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a2949358513fd7bc622fb362b5c4af4fc24fc6307320070ca410885e5e13d975", size = 13141, upload-time = "2025-11-14T09:49:11.947Z" }, +] + +[[package]] +name = "pyobjc-framework-fskit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/55/d00246d6e6d9756e129e1d94bc131c99eece2daa84b2696f6442b8a22177/pyobjc_framework_fskit-12.1.tar.gz", hash = "sha256:ec54e941cdb0b7d800616c06ca76a93685bd7119b8aa6eb4e7a3ee27658fc7ba", size = 42372, upload-time = "2025-11-14T10:15:30.411Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/a9/0c47469fe80fa14bc698bb0a5b772b44283cc3aca0f67e7f70ab45e09b24/pyobjc_framework_fskit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:50972897adea86508cfee33ec4c23aa91dede97e9da1640ea2fe74702b065be1", size = 20250, upload-time = "2025-11-14T09:49:28.065Z" }, +] + +[[package]] +name = "pyobjc-framework-gamecenter" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/f8/b5fd86f6b722d4259228922e125b50e0a6975120a1c4d957e990fb84e42c/pyobjc_framework_gamecenter-12.1.tar.gz", hash = "sha256:de4118f14c9cf93eb0316d49da410faded3609ce9cd63425e9ef878cebb7ea72", size = 31473, upload-time = "2025-11-14T10:15:33.38Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/ee/b496cc4248c5b901e159d6d9a437da9b86a3105fc3999a66744ba2b2c884/pyobjc_framework_gamecenter-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e8d6d10b868be7c00c2d5a0944cc79315945735dcf17eaa3fec1a7986d26be9b", size = 18868, upload-time = "2025-11-14T09:49:44.767Z" }, +] + +[[package]] +name = "pyobjc-framework-gamecontroller" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/14/353bb1fe448cd833839fd199ab26426c0248088753e63c22fe19dc07530f/pyobjc_framework_gamecontroller-12.1.tar.gz", hash = "sha256:64ed3cc4844b67f1faeb540c7cc8d512c84f70b3a4bafdb33d4663a2b2a2b1d8", size = 54554, upload-time = "2025-11-14T10:15:37.591Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/28/9f03d0ef7c78340441f78b19fb2d2c952af04a240da5ed30c7cf2d0d0f4e/pyobjc_framework_gamecontroller-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:878aa6590c1510e91bfc8710d6c880e7a8f3656a7b7b6f4f3af487a6f677ccd5", size = 20949, upload-time = "2025-11-14T09:50:01.608Z" }, +] + +[[package]] +name = "pyobjc-framework-gamekit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/7b/d625c0937557f7e2e64200fdbeb867d2f6f86b2f148b8d6bfe085e32d872/pyobjc_framework_gamekit-12.1.tar.gz", hash = "sha256:014d032c3484093f1409f8f631ba8a0fd2ff7a3ae23fd9d14235340889854c16", size = 63833, upload-time = "2025-11-14T10:15:42.842Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/05/1c49e1030dc9f2812fa8049442158be76c32f271075f4571f94e4389ea86/pyobjc_framework_gamekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2eee796d5781157f2c5684f7ef4c2a7ace9d9b408a26a9e7e92e8adf5a3f63d7", size = 22493, upload-time = "2025-11-14T09:50:19.129Z" }, +] + +[[package]] +name = "pyobjc-framework-gameplaykit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-spritekit" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/11/c310bbc2526f95cce662cc1f1359bb11e2458eab0689737b4850d0f6acb7/pyobjc_framework_gameplaykit-12.1.tar.gz", hash = "sha256:935ebd806d802888969357946245d35a304c530c86f1ffe584e2cf21f0a608a8", size = 41511, upload-time = "2025-11-14T10:15:46.529Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/1f/e5fe404f92ec0f9c8c37b00d6cb3ba96ee396c7f91b0a41a39b64bfc2743/pyobjc_framework_gameplaykit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:309b0d7479f702830c9be92dbe5855ac2557a9d23f05f063caf9d9fdb85ff5f0", size = 13150, upload-time = "2025-11-14T09:50:36.884Z" }, +] + +[[package]] +name = "pyobjc-framework-gamesave" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/1f/8d05585c844535e75dbc242dd6bdfecfc613d074dcb700362d1c908fb403/pyobjc_framework_gamesave-12.1.tar.gz", hash = "sha256:eb731c97aa644e78a87838ed56d0e5bdbaae125bdc8854a7772394877312cc2e", size = 12654, upload-time = "2025-11-14T10:15:48.344Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/ec/93d48cb048a1b35cea559cc9261b07f0d410078b3af029121302faa410d0/pyobjc_framework_gamesave-12.1-py2.py3-none-any.whl", hash = "sha256:432e69f8404be9290d42c89caba241a3156ed52013947978ac54f0f032a14ffd", size = 3689, upload-time = "2025-11-14T09:50:47.263Z" }, +] + +[[package]] +name = "pyobjc-framework-healthkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/67/436630d00ba1028ea33cc9df2fc28e081481433e5075600f2ea1ff00f45e/pyobjc_framework_healthkit-12.1.tar.gz", hash = "sha256:29c5e5de54b41080b7a4b0207698ac6f600dcb9149becc9c6b3a69957e200e5c", size = 91802, upload-time = "2025-11-14T10:15:54.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/87/bb1c438de51c4fa733a99ce4d3301e585f14d7efd94031a97707c0be2b46/pyobjc_framework_healthkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:15b6fc958ff5de42888b18dffdec839cb36d2dd8b82076ed2f21a51db5271109", size = 20799, upload-time = "2025-11-14T09:50:54.531Z" }, +] + +[[package]] +name = "pyobjc-framework-imagecapturecore" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/a1/39347381fc7d3cd5ab942d86af347b25c73f0ddf6f5227d8b4d8f5328016/pyobjc_framework_imagecapturecore-12.1.tar.gz", hash = "sha256:c4776c59f4db57727389d17e1ffd9c567b854b8db52198b3ccc11281711074e5", size = 46397, upload-time = "2025-11-14T10:15:58.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/13/632957b284dec3743d73fb30dbdf03793b3cf1b4c62e61e6484d870f3879/pyobjc_framework_imagecapturecore-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a2777e17ff71fb5a327a897e48c5c7b5a561723a80f990d26e6ed5a1b8748816", size = 16012, upload-time = "2025-11-14T09:51:12.058Z" }, +] + +[[package]] +name = "pyobjc-framework-inputmethodkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/b8/d33dd8b7306029bbbd80525bf833fc547e6a223c494bf69a534487283a28/pyobjc_framework_inputmethodkit-12.1.tar.gz", hash = "sha256:f63b6fe2fa7f1412eae63baea1e120e7865e3b68ccfb7d8b0a4aadb309f2b278", size = 23054, upload-time = "2025-11-14T10:16:01.464Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/c2/59bea66405784b25f5d4e821467ba534a0b92dfc98e07257c971e2a8ed73/pyobjc_framework_inputmethodkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0b7d813d46a060572fc0c14ef832e4fe538ebf64e5cab80ee955191792ce0110", size = 9506, upload-time = "2025-11-14T09:51:26.924Z" }, +] + +[[package]] +name = "pyobjc-framework-installerplugins" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/60/ca4ab04eafa388a97a521db7d60a812e2f81a3c21c2372587872e6b074f9/pyobjc_framework_installerplugins-12.1.tar.gz", hash = "sha256:1329a193bd2e92a2320a981a9a421a9b99749bade3e5914358923e94fe995795", size = 25277, upload-time = "2025-11-14T10:16:04.379Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/1f/31dca45db3342882a628aa1b27707a283d4dc7ef558fddd2533175a0661a/pyobjc_framework_installerplugins-12.1-py2.py3-none-any.whl", hash = "sha256:d2201c81b05bdbe0abf0af25db58dc230802573463bea322f8b2863e37b511d5", size = 4813, upload-time = "2025-11-14T09:51:37.836Z" }, +] + +[[package]] +name = "pyobjc-framework-instantmessage" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/67/66754e0d26320ba24a33608ca94d3f38e60ee6b2d2e094cb6269b346fdd4/pyobjc_framework_instantmessage-12.1.tar.gz", hash = "sha256:f453118d5693dc3c94554791bd2aaafe32a8b03b0e3d8ec3934b44b7fdd1f7e7", size = 31217, upload-time = "2025-11-14T10:16:07.693Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/38/6ae95b5c87d887c075bd5f4f7cca3d21dafd0a77cfdde870e87ca17579eb/pyobjc_framework_instantmessage-12.1-py2.py3-none-any.whl", hash = "sha256:cd91d38e8f356afd726b6ea8c235699316ea90edfd3472965c251efbf4150bc9", size = 5436, upload-time = "2025-11-14T09:51:39.557Z" }, +] + +[[package]] +name = "pyobjc-framework-intents" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/a1/3bab6139e94b97eca098e1562f5d6840e3ff10ea1f7fd704a17111a97d5b/pyobjc_framework_intents-12.1.tar.gz", hash = "sha256:bd688c3ab34a18412f56e459e9dae29e1f4152d3c2048fcacdef5fc49dfb9765", size = 132262, upload-time = "2025-11-14T10:16:16.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/90/e9489492ae90b4c1ffd02c1221c0432b8768d475787e7887f79032c2487a/pyobjc_framework_intents-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0ea9f3e79bf4baf6c7b0fd2d2797184ed51a372bf7f32974b4424f9bd067ef50", size = 32156, upload-time = "2025-11-14T09:51:49.438Z" }, +] + +[[package]] +name = "pyobjc-framework-intentsui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-intents" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/cf/f0e385b9cfbf153d68efe8d19e5ae672b59acbbfc1f9b58faaefc5ec8c9e/pyobjc_framework_intentsui-12.1.tar.gz", hash = "sha256:16bdf4b7b91c0d1ec9d5513a1182861f1b5b7af95d4f4218ff7cf03032d57f99", size = 19784, upload-time = "2025-11-14T10:16:18.716Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/17/06812542a9028f5b2dcce56f52f25633c08b638faacd43bad862aad1b41d/pyobjc_framework_intentsui-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cb894fcc4c9ea613a424dcf6fb48142d51174559b82cfdafac8cb47555c842cf", size = 8983, upload-time = "2025-11-14T09:52:07.667Z" }, +] + +[[package]] +name = "pyobjc-framework-iobluetooth" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/aa/ca3944bbdfead4201b4ae6b51510942c5a7d8e5e2dc3139a071c74061fdf/pyobjc_framework_iobluetooth-12.1.tar.gz", hash = "sha256:8a434118812f4c01dfc64339d41fe8229516864a59d2803e9094ee4cbe2b7edd", size = 155241, upload-time = "2025-11-14T10:16:28.896Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/b6/933b56afb5e84c3c35c074c9e30d7b701c6038989d4867867bdaa7ab618b/pyobjc_framework_iobluetooth-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:111a6e54be9e9dcf77fa2bf84fdac09fae339aa33087d8647ea7ffbd34765d4c", size = 40439, upload-time = "2025-11-14T09:52:26.071Z" }, +] + +[[package]] +name = "pyobjc-framework-iobluetoothui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-iobluetooth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/39/31d9a4e8565a4b1ec0a9ad81480dc0879f3df28799eae3bc22d1dd53705d/pyobjc_framework_iobluetoothui-12.1.tar.gz", hash = "sha256:81f8158bdfb2966a574b6988eb346114d6a4c277300c8c0a978c272018184e6f", size = 16495, upload-time = "2025-11-14T10:16:31.212Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/c9/69aeda0cdb5d25d30dc4596a1c5b464fc81b5c0c4e28efc54b7e11bde51c/pyobjc_framework_iobluetoothui-12.1-py2.py3-none-any.whl", hash = "sha256:a6d8ab98efa3029130577a57ee96b183c35c39b0f1c53a7534f8838260fab993", size = 4045, upload-time = "2025-11-14T09:52:42.201Z" }, +] + +[[package]] +name = "pyobjc-framework-iosurface" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/61/0f12ad67a72d434e1c84b229ec760b5be71f53671ee9018593961c8bfeb7/pyobjc_framework_iosurface-12.1.tar.gz", hash = "sha256:4b9d0c66431aa296f3ca7c4f84c00dc5fc961194830ad7682fdbbc358fa0db55", size = 17690, upload-time = "2025-11-14T10:16:33.282Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ad/793d98a7ed9b775dc8cce54144cdab0df1808a1960ee017e46189291a8f3/pyobjc_framework_iosurface-12.1-py2.py3-none-any.whl", hash = "sha256:e784e248397cfebef4655d2c0025766d3eaa4a70474e363d084fc5ce2a4f2a3f", size = 4902, upload-time = "2025-11-14T09:52:43.899Z" }, +] + +[[package]] +name = "pyobjc-framework-ituneslibrary" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/46/d9bcec88675bf4ee887b9707bd245e2a793e7cb916cf310f286741d54b1f/pyobjc_framework_ituneslibrary-12.1.tar.gz", hash = "sha256:7f3aa76c4d05f6fa6015056b88986cacbda107c3f29520dd35ef0936c7367a6e", size = 23730, upload-time = "2025-11-14T10:16:36.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/92/b598694a1713ee46f45c4bfb1a0425082253cbd2b1caf9f8fd50f292b017/pyobjc_framework_ituneslibrary-12.1-py2.py3-none-any.whl", hash = "sha256:fb678d7c3ff14c81672e09c015e25880dac278aa819971f4d5f75d46465932ef", size = 5205, upload-time = "2025-11-14T09:52:45.733Z" }, +] + +[[package]] +name = "pyobjc-framework-kernelmanagement" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/7e/ecbac119866e8ac2cce700d7a48a4297946412ac7cbc243a7084a6582fb1/pyobjc_framework_kernelmanagement-12.1.tar.gz", hash = "sha256:488062893ac2074e0c8178667bf864a21f7909c11111de2f6a10d9bc579df59d", size = 11773, upload-time = "2025-11-14T10:16:38.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/32/04325a20f39d88d6d712437e536961a9e6a4ec19f204f241de6ed54d1d84/pyobjc_framework_kernelmanagement-12.1-py2.py3-none-any.whl", hash = "sha256:926381bfbfbc985c3e6dfcb7004af21bb16ff66ecbc08912b925989a705944ff", size = 3704, upload-time = "2025-11-14T09:52:47.268Z" }, +] + +[[package]] +name = "pyobjc-framework-latentsemanticmapping" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/3c/b621dac54ae8e77ac25ee75dd93e310e2d6e0faaf15b8da13513258d6657/pyobjc_framework_latentsemanticmapping-12.1.tar.gz", hash = "sha256:f0b1fa823313eefecbf1539b4ed4b32461534b7a35826c2cd9f6024411dc9284", size = 15526, upload-time = "2025-11-14T10:16:40.149Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/8e/74a7eb29b545f294485cd3cf70557b4a35616555fe63021edbb3e0ea4c20/pyobjc_framework_latentsemanticmapping-12.1-py2.py3-none-any.whl", hash = "sha256:7d760213b42bc8b1bc1472e1873c0f78ee80f987225978837b1fecdceddbdbf4", size = 5471, upload-time = "2025-11-14T09:52:48.939Z" }, +] + +[[package]] +name = "pyobjc-framework-launchservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/d0/24673625922b0ad21546be5cf49e5ec1afaa4553ae92f222adacdc915907/pyobjc_framework_launchservices-12.1.tar.gz", hash = "sha256:4d2d34c9bd6fb7f77566155b539a2c70283d1f0326e1695da234a93ef48352dc", size = 20470, upload-time = "2025-11-14T10:16:42.499Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/af/9a0aebaab4c15632dc8fcb3669c68fa541a3278d99541d9c5f966fbc0909/pyobjc_framework_launchservices-12.1-py2.py3-none-any.whl", hash = "sha256:e63e78fceeed4d4dc807f9dabd5cf90407e4f552fab6a0d75a8d0af63094ad3c", size = 3905, upload-time = "2025-11-14T09:52:50.71Z" }, +] + +[[package]] +name = "pyobjc-framework-libdispatch" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/e8/75b6b9b3c88b37723c237e5a7600384ea2d84874548671139db02e76652b/pyobjc_framework_libdispatch-12.1.tar.gz", hash = "sha256:4035535b4fae1b5e976f3e0e38b6e3442ffea1b8aa178d0ca89faa9b8ecdea41", size = 38277, upload-time = "2025-11-14T10:16:46.235Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/6f/96e15c7b2f7b51fc53252216cd0bed0c3541bc0f0aeb32756fefd31bed7d/pyobjc_framework_libdispatch-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0e9570d7a9a3136f54b0b834683bf3f206acd5df0e421c30f8fd4f8b9b556789", size = 15650, upload-time = "2025-11-14T09:52:59.284Z" }, +] + +[[package]] +name = "pyobjc-framework-libxpc" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/e4/364db7dc26f235e3d7eaab2f92057f460b39800bffdec3128f113388ac9f/pyobjc_framework_libxpc-12.1.tar.gz", hash = "sha256:e46363a735f3ecc9a2f91637750623f90ee74f9938a4e7c833e01233174af44d", size = 35186, upload-time = "2025-11-14T10:16:49.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/7f/fdec72430f90921b154517a6f9bbeefa7bacfb16b91320742eb16a5955c5/pyobjc_framework_libxpc-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ba93e91e9ca79603dd265382e9f80e9bd32309cd09c8ac3e6489fc5b233676c8", size = 19730, upload-time = "2025-11-14T09:53:17.113Z" }, +] + +[[package]] +name = "pyobjc-framework-linkpresentation" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/58/c0c5919d883485ccdb6dccd8ecfe50271d2f6e6ab7c9b624789235ccec5a/pyobjc_framework_linkpresentation-12.1.tar.gz", hash = "sha256:84df6779591bb93217aa8bd82c10e16643441678547d2d73ba895475a02ade94", size = 13330, upload-time = "2025-11-14T10:16:52.169Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/51/226eb45f196f3bf93374713571aae6c8a4760389e1d9435c4a4cc3f38ea4/pyobjc_framework_linkpresentation-12.1-py2.py3-none-any.whl", hash = "sha256:853a84c7b525b77b114a7a8d798aef83f528ed3a6803bda12184fe5af4e79a47", size = 3865, upload-time = "2025-11-14T09:53:28.386Z" }, +] + +[[package]] +name = "pyobjc-framework-localauthentication" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/0e/7e5d9a58bb3d5b79a75d925557ef68084171526191b1c0929a887a553d4f/pyobjc_framework_localauthentication-12.1.tar.gz", hash = "sha256:2284f587d8e1206166e4495b33f420c1de486c36c28c4921d09eec858a699d05", size = 29947, upload-time = "2025-11-14T10:16:54.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/93/91761ad4e5fa1c3ec25819865d1ccfbee033987147087bff4fcce67a4dc4/pyobjc_framework_localauthentication-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3af1acd287d830cc7f912f46cde0dab054952bde0adaf66c8e8524311a68d279", size = 10773, upload-time = "2025-11-14T09:53:34.074Z" }, +] + +[[package]] +name = "pyobjc-framework-localauthenticationembeddedui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-localauthentication" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/20/83ab4180e29b9a4a44d735c7f88909296c6adbe6250e8e00a156aff753e1/pyobjc_framework_localauthenticationembeddedui-12.1.tar.gz", hash = "sha256:a15ec44bf2769c872e86c6b550b6dd4f58d4eda40ad9ff00272a67d279d1d4e9", size = 13611, upload-time = "2025-11-14T10:16:57.145Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/7d/0d46639c7a26b6af928ab4c822cd28b733791e02ac28cc84c3014bcf7dc7/pyobjc_framework_localauthenticationembeddedui-12.1-py2.py3-none-any.whl", hash = "sha256:a7ce7b56346597b9f4768be61938cbc8fc5b1292137225b6c7f631b9cde97cd7", size = 3991, upload-time = "2025-11-14T09:53:42.958Z" }, +] + +[[package]] +name = "pyobjc-framework-mailkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/98/3d9028620c1cd32ff4fb031155aba3b5511e980cdd114dd51383be9cb51b/pyobjc_framework_mailkit-12.1.tar.gz", hash = "sha256:d5574b7259baec17096410efcaacf5d45c7bb5f893d4c25cbb7072369799b652", size = 20996, upload-time = "2025-11-14T10:16:59.449Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/8d/3c968b736a3a8bd9d8e870b39b1c772a013eea1b81b89fc4efad9021a6cb/pyobjc_framework_mailkit-12.1-py2.py3-none-any.whl", hash = "sha256:536ac0c4ea3560364cd159a6512c3c18a744a12e4e0883c07df0f8a2ff21e3fe", size = 4871, upload-time = "2025-11-14T09:53:44.697Z" }, +] + +[[package]] +name = "pyobjc-framework-mapkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-corelocation" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/bb/2a668203c20e509a648c35e803d79d0c7f7816dacba74eb5ad8acb186790/pyobjc_framework_mapkit-12.1.tar.gz", hash = "sha256:dbc32dc48e821aaa9b4294402c240adbc1c6834e658a07677b7c19b7990533c5", size = 63520, upload-time = "2025-11-14T10:17:04.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/00/a3de41cdf3e6cd7a144e38999fe1ea9777ad19e19d863f2da862e7affe7b/pyobjc_framework_mapkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84ad7766271c114bdc423e4e2ff5433e5fc6771a3338b5f8e4b54d0340775800", size = 22518, upload-time = "2025-11-14T09:53:52.727Z" }, +] + +[[package]] +name = "pyobjc-framework-mediaaccessibility" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/10/dc1007e56944ed2e981e69e7b2fed2b2202c79b0d5b742b29b1081d1cbdd/pyobjc_framework_mediaaccessibility-12.1.tar.gz", hash = "sha256:cc4e3b1d45e84133d240318d53424eff55968f5c6873c2c53267598853445a3f", size = 16325, upload-time = "2025-11-14T10:17:07.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/0c/7fb5462561f59d739192c6d02ba0fd36ad7841efac5a8398a85a030ef7fc/pyobjc_framework_mediaaccessibility-12.1-py2.py3-none-any.whl", hash = "sha256:2ff8845c97dd52b0e5cf53990291e6d77c8a73a7aac0e9235d62d9a4256916d1", size = 4800, upload-time = "2025-11-14T09:54:05.04Z" }, +] + +[[package]] +name = "pyobjc-framework-mediaextension" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/aa/1e8015711df1cdb5e4a0aa0ed4721409d39971ae6e1e71915e3ab72423a3/pyobjc_framework_mediaextension-12.1.tar.gz", hash = "sha256:44409d63cc7d74e5724a68e3f9252cb62fd0fd3ccf0ca94c6a33e5c990149953", size = 39425, upload-time = "2025-11-14T10:17:11.486Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/ed/99038bcf72ec68e452709af10a087c1377c2d595ba4e66d7a2b0775145d2/pyobjc_framework_mediaextension-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:442bc3a759efb5c154cb75d643a5e182297093533fcdd1c24be6f64f68b93371", size = 38973, upload-time = "2025-11-14T09:54:16.701Z" }, +] + +[[package]] +name = "pyobjc-framework-medialibrary" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/e9/848ebd02456f8fdb41b42298ec585bfed5899dbd30306ea5b0a7e4c4b341/pyobjc_framework_medialibrary-12.1.tar.gz", hash = "sha256:690dcca09b62511df18f58e8566cb33d9652aae09fe63a83f594bd018b5edfcd", size = 15995, upload-time = "2025-11-14T10:17:15.45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/cd/eeaf8585a343fda5b8cf3b8f144c872d1057c845202098b9441a39b76cb0/pyobjc_framework_medialibrary-12.1-py2.py3-none-any.whl", hash = "sha256:1f03ad6802a5c6e19ee3208b065689d3ec79defe1052cb80e00f54e1eff5f2a0", size = 4361, upload-time = "2025-11-14T09:54:32.259Z" }, +] + +[[package]] +name = "pyobjc-framework-mediaplayer" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/f0/851f6f47e11acbd62d5f5dcb8274afc969135e30018591f75bf3cbf6417f/pyobjc_framework_mediaplayer-12.1.tar.gz", hash = "sha256:5ef3f669bdf837d87cdb5a486ec34831542360d14bcba099c7c2e0383380794c", size = 35402, upload-time = "2025-11-14T10:17:18.97Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/c0/038ee3efd286c0fbc89c1e0cb688f4670ed0e5803aa36e739e79ffc91331/pyobjc_framework_mediaplayer-12.1-py2.py3-none-any.whl", hash = "sha256:85d9baec131807bfdf0f4c24d4b943e83cce806ab31c95c7e19c78e3fb7eefc8", size = 7120, upload-time = "2025-11-14T09:54:33.901Z" }, +] + +[[package]] +name = "pyobjc-framework-mediatoolbox" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/71/be5879380a161f98212a336b432256f307d1dcbaaaeb8ec988aea2ada2cd/pyobjc_framework_mediatoolbox-12.1.tar.gz", hash = "sha256:385b48746a5f08756ee87afc14037e552954c427ed5745d7ece31a21a7bad5ab", size = 22305, upload-time = "2025-11-14T10:17:22.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/94/d5ee221f2afbc64b2a7074efe25387cd8700e8116518904b28091ea6ad74/pyobjc_framework_mediatoolbox-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d7bcfeeff3fbf7e9e556ecafd8eaed2411df15c52baf134efa7480494e6faf6d", size = 12818, upload-time = "2025-11-14T09:54:41.251Z" }, +] + +[[package]] +name = "pyobjc-framework-metal" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/06/a84f7eb8561d5631954b9458cfca04b690b80b5b85ce70642bc89335f52a/pyobjc_framework_metal-12.1.tar.gz", hash = "sha256:bb554877d5ee2bf3f340ad88e8fe1b85baab7b5ec4bd6ae0f4f7604147e3eae7", size = 181847, upload-time = "2025-11-14T10:17:34.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/48/9286d06e1b14c11b65d3fea1555edc0061d9ebe11898dff8a14089e3a4c9/pyobjc_framework_metal-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38ab566b5a2979a43e13593d3eb12000a45e574576fe76996a5e1eb75ad7ac78", size = 75841, upload-time = "2025-11-14T09:55:06.801Z" }, +] + +[[package]] +name = "pyobjc-framework-metalfx" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/09/ce5c74565677fde66de3b9d35389066b19e5d1bfef9d9a4ad80f0c858c0c/pyobjc_framework_metalfx-12.1.tar.gz", hash = "sha256:1551b686fb80083a97879ce0331bdb1d4c9b94557570b7ecc35ebf40ff65c90b", size = 29470, upload-time = "2025-11-14T10:17:37.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/0b/508e3af499694f4eec74cc3ab0530e38db76e43a27db9ecb98c50c68f5f9/pyobjc_framework_metalfx-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a4418ae5c2eb77ec00695fa720a547638dc252dfd77ecb6feb88f713f5a948fd", size = 15062, upload-time = "2025-11-14T09:55:37.352Z" }, +] + +[[package]] +name = "pyobjc-framework-metalkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/15/5091147aae12d4011a788b93971c3376aaaf9bf32aa935a2c9a06a71e18b/pyobjc_framework_metalkit-12.1.tar.gz", hash = "sha256:14cc5c256f0e3471b412a5b3582cb2a0d36d3d57401a8aa09e433252d1c34824", size = 25473, upload-time = "2025-11-14T10:17:39.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/c0/c8b5b060895cd51493afe3f09909b7e34893b1161cf4d93bc8e3cd306129/pyobjc_framework_metalkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1c4869076571d94788fe539fabfdd568a5c8e340936c7726d2551196640bd152", size = 8755, upload-time = "2025-11-14T09:55:51.683Z" }, +] + +[[package]] +name = "pyobjc-framework-metalperformanceshaders" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/68/58da38e54aa0d8c19f0d3084d8c84e92d54cc8c9254041f07119d86aa073/pyobjc_framework_metalperformanceshaders-12.1.tar.gz", hash = "sha256:b198e755b95a1de1525e63c3b14327ae93ef1d88359e6be1ce554a3493755b50", size = 137301, upload-time = "2025-11-14T10:17:49.554Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/84/d505496fca9341e0cb11258ace7640cd986fe3e831f8b4749035e9f82109/pyobjc_framework_metalperformanceshaders-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c00e786c352b3ff5d86cf0cf3a830dc9f6fc32a03ae1a7539d20d11324adb2e8", size = 33242, upload-time = "2025-11-14T09:56:09.354Z" }, +] + +[[package]] +name = "pyobjc-framework-metalperformanceshadersgraph" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-metalperformanceshaders" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/56/7ad0cd085532f7bdea9a8d4e9a2dfde376d26dd21e5eabdf1a366040eff8/pyobjc_framework_metalperformanceshadersgraph-12.1.tar.gz", hash = "sha256:b8fd017b47698037d7b172d41bed7a4835f4c4f2a288235819d200005f89ee35", size = 42992, upload-time = "2025-11-14T10:17:53.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/c9/5e7fd0d4bc9bdf7b442f36e020677c721ba9b4c1dc1fa3180085f22a4ef9/pyobjc_framework_metalperformanceshadersgraph-12.1-py2.py3-none-any.whl", hash = "sha256:85a1c7a6114ada05c7924b3235a1a98c45359410d148097488f15aee5ebb6ab9", size = 6481, upload-time = "2025-11-14T09:56:23.66Z" }, +] + +[[package]] +name = "pyobjc-framework-metrickit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/13/5576ddfbc0b174810a49171e2dbe610bdafd3b701011c6ecd9b3a461de8a/pyobjc_framework_metrickit-12.1.tar.gz", hash = "sha256:77841daf6b36ba0c19df88545fd910c0516acf279e6b7b4fa0a712a046eaa9f1", size = 27627, upload-time = "2025-11-14T10:17:56.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/04/8da5126e47306438c99750f1dfed430d7cc388f6b7f420ae748f3060ab96/pyobjc_framework_metrickit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3ec96e9ec7dc37fbce57dae277f0d89c66ffe1c3fa2feaca1b7125f8b2b29d87", size = 8120, upload-time = "2025-11-14T09:56:28.73Z" }, +] + +[[package]] +name = "pyobjc-framework-mlcompute" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/69/15f8ce96c14383aa783c8e4bc1e6d936a489343bb197b8e71abb3ddc1cb8/pyobjc_framework_mlcompute-12.1.tar.gz", hash = "sha256:3281db120273dcc56e97becffd5cedf9c62042788289f7be6ea067a863164f1e", size = 40698, upload-time = "2025-11-14T10:17:59.792Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/f7/4614b9ccd0151795e328b9ed881fbcbb13e577a8ec4ae3507edb1a462731/pyobjc_framework_mlcompute-12.1-py2.py3-none-any.whl", hash = "sha256:4f0fc19551d710a03dfc4c7129299897544ff8ea76db6c7539ecc2f9b2571bde", size = 6744, upload-time = "2025-11-14T09:56:36.973Z" }, +] + +[[package]] +name = "pyobjc-framework-modelio" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/11/32c358111b623b4a0af9e90470b198fffc068b45acac74e1ba711aee7199/pyobjc_framework_modelio-12.1.tar.gz", hash = "sha256:d041d7bca7c2a4526344d3e593347225b7a2e51a499b3aa548895ba516d1bdbb", size = 66482, upload-time = "2025-11-14T10:18:04.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/0e/b8331100f0d658ecb3e87e75c108e2ae8ac7c78b521fd5ad0205b60a2584/pyobjc_framework_modelio-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:68d971917c289fdddf69094c74915d2ccb746b42b150e0bdc16d8161e6164022", size = 20193, upload-time = "2025-11-14T09:56:44.296Z" }, +] + +[[package]] +name = "pyobjc-framework-multipeerconnectivity" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/35/0d0bb6881004cb238cfd7bf74f4b2e42601a1accdf27b2189ec61cf3a2dc/pyobjc_framework_multipeerconnectivity-12.1.tar.gz", hash = "sha256:7123f734b7174cacbe92a51a62b4645cc9033f6b462ff945b504b62e1b9e6c1c", size = 22816, upload-time = "2025-11-14T10:18:07.363Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/8d/0646ff7db36942829f0e84be18ba44bc5cd96d6a81651f8e7dc0974821c1/pyobjc_framework_multipeerconnectivity-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1c3bd254a16debed321debf4858f9c9b7d41572ddf1058a4bacf6a5bcfedeeff", size = 12001, upload-time = "2025-11-14T09:57:01.027Z" }, +] + +[[package]] +name = "pyobjc-framework-naturallanguage" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/d1/c81c0cdbb198d498edc9bc5fbb17e79b796450c17bb7541adbf502f9ad65/pyobjc_framework_naturallanguage-12.1.tar.gz", hash = "sha256:cb27a1e1e5b2913d308c49fcd2fd04ab5ea87cb60cac4a576a91ebf6a50e52f6", size = 23524, upload-time = "2025-11-14T10:18:09.883Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/d8/715a11111f76c80769cb267a19ecf2a4ac76152a6410debb5a4790422256/pyobjc_framework_naturallanguage-12.1-py2.py3-none-any.whl", hash = "sha256:a02ef383ec88948ca28f03ab8995523726b3bc75c49f593b5c89c218bcbce7ce", size = 5320, upload-time = "2025-11-14T09:57:10.294Z" }, +] + +[[package]] +name = "pyobjc-framework-netfs" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/68/4bf0e5b8cc0780cf7acf0aec54def58c8bcf8d733db0bd38f5a264d1af06/pyobjc_framework_netfs-12.1.tar.gz", hash = "sha256:e8d0c25f41d7d9ced1aa2483238d0a80536df21f4b588640a72e1bdb87e75c1e", size = 14799, upload-time = "2025-11-14T10:18:11.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/6b/8c2f223879edd3e3f030d0a9c9ba812775519c6d0c257e3e7255785ca6e7/pyobjc_framework_netfs-12.1-py2.py3-none-any.whl", hash = "sha256:0021f8b141e693d3821524c170e9c645090eb320e80c2935ddb978a6e8b8da81", size = 4163, upload-time = "2025-11-14T09:57:11.845Z" }, +] + +[[package]] +name = "pyobjc-framework-network" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/13/a71270a1b0a9ec979e68b8ec84b0f960e908b17b51cb3cac246a74d52b6b/pyobjc_framework_network-12.1.tar.gz", hash = "sha256:dbf736ff84d1caa41224e86ff84d34b4e9eb6918ae4e373a44d3cb597648a16a", size = 56990, upload-time = "2025-11-14T10:18:16.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/ef/a53f04f43e93932817f2ea71689dcc8afe3b908d631c21d11ec30c7b2e87/pyobjc_framework_network-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5e53aad64eae2933fe12d49185d66aca62fb817abf8a46f86b01e436ce1b79e4", size = 19613, upload-time = "2025-11-14T09:57:19.571Z" }, +] + +[[package]] +name = "pyobjc-framework-networkextension" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/3e/ac51dbb2efa16903e6af01f3c1f5a854c558661a7a5375c3e8767ac668e8/pyobjc_framework_networkextension-12.1.tar.gz", hash = "sha256:36abc339a7f214ab6a05cb2384a9df912f247163710741e118662bd049acfa2e", size = 62796, upload-time = "2025-11-14T10:18:21.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/14/4934b10ade5ad0518001bfc25260d926816b9c7d08d85ef45e8a61fdef1b/pyobjc_framework_networkextension-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:adc9baacfc532944d67018e381c7645f66a9fa0064939a5a841476d81422cdcc", size = 14376, upload-time = "2025-11-14T09:57:36.132Z" }, +] + +[[package]] +name = "pyobjc-framework-notificationcenter" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/12/ae0fe82fb1e02365c9fe9531c9de46322f7af09e3659882212c6bf24d75e/pyobjc_framework_notificationcenter-12.1.tar.gz", hash = "sha256:2d09f5ab9dc39770bae4fa0c7cfe961e6c440c8fc465191d403633dccc941094", size = 21282, upload-time = "2025-11-14T10:18:24.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/05/3168637dd425257df5693c2ceafecf92d2e6833c0aaa6594d894a528d797/pyobjc_framework_notificationcenter-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82a735bd63f315f0a56abd206373917b7d09a0ae35fd99f1639a0fac4c525c0a", size = 9895, upload-time = "2025-11-14T09:57:51.151Z" }, +] + +[[package]] +name = "pyobjc-framework-opendirectory" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/11/bc2f71d3077b3bd078dccad5c0c5c57ec807fefe3d90c97b97dd0ed3d04b/pyobjc_framework_opendirectory-12.1.tar.gz", hash = "sha256:2c63ce5dd179828ef2d8f9e3961da3bfa971a57db07a6c34eedc296548a928bb", size = 61049, upload-time = "2025-11-14T10:18:29.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/e7/3c2dece9c5b28af28a44d72a27b35ea5ffac31fed7cbd8d696ea75dc4a81/pyobjc_framework_opendirectory-12.1-py2.py3-none-any.whl", hash = "sha256:b5b5a5cf3cc2fb25147b16b79f046b90e3982bf3ded1b210a993d8cfdba737c4", size = 11845, upload-time = "2025-11-14T09:58:00.175Z" }, +] + +[[package]] +name = "pyobjc-framework-osakit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/b9/bf52c555c75a83aa45782122432fa06066bb76469047f13d06fb31e585c4/pyobjc_framework_osakit-12.1.tar.gz", hash = "sha256:36ea6acf03483dc1e4344a0cce7250a9656f44277d12bc265fa86d4cbde01f23", size = 17102, upload-time = "2025-11-14T10:18:31.354Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/10/30a15d7b23e6fcfa63d41ca4c7356c39ff81300249de89c3ff28216a9790/pyobjc_framework_osakit-12.1-py2.py3-none-any.whl", hash = "sha256:c49165336856fd75113d2e264a98c6deb235f1bd033eae48f661d4d832d85e6b", size = 4162, upload-time = "2025-11-14T09:58:01.953Z" }, +] + +[[package]] +name = "pyobjc-framework-oslog" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/42/805c9b4ac6ad25deb4215989d8fc41533d01e07ffd23f31b65620bade546/pyobjc_framework_oslog-12.1.tar.gz", hash = "sha256:d0ec6f4e3d1689d5e4341bc1130c6f24cb4ad619939f6c14d11a7e80c0ac4553", size = 21193, upload-time = "2025-11-14T10:18:33.645Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/60/0b742347d484068e9d6867cd95dedd1810c790b6aca45f6ef1d0f089f1f5/pyobjc_framework_oslog-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:072a41d36fcf780a070f13ac2569f8bafbb5ae4792fab4136b1a4d602dd9f5b4", size = 7813, upload-time = "2025-11-14T09:58:07.768Z" }, +] + +[[package]] +name = "pyobjc-framework-passkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/d4/2afb59fb0f99eb2f03888850887e536f1ef64b303fd756283679471a5189/pyobjc_framework_passkit-12.1.tar.gz", hash = "sha256:d8c27c352e86a3549bf696504e6b25af5f2134b173d9dd60d66c6d3da53bb078", size = 53835, upload-time = "2025-11-14T10:18:37.906Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/dc/9cb27e8b7b00649af5e802815ffa8928bd8a619f2984a1bea7dabd28f741/pyobjc_framework_passkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7e95a484ec529dbf1d44f5f7f1406502a77bda733511e117856e3dca9fa29c5c", size = 14102, upload-time = "2025-11-14T09:58:20.903Z" }, +] + +[[package]] +name = "pyobjc-framework-pencilkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/43/859068016bcbe7d80597d5c579de0b84b0da62c5c55cdf9cc940e9f9c0f8/pyobjc_framework_pencilkit-12.1.tar.gz", hash = "sha256:d404982d1f7a474369f3e7fea3fbd6290326143fa4138d64b6753005a6263dc4", size = 17664, upload-time = "2025-11-14T10:18:40.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/26/daf47dcfced8f7326218dced5c68ed2f3b522ec113329218ce1305809535/pyobjc_framework_pencilkit-12.1-py2.py3-none-any.whl", hash = "sha256:33b88e5ed15724a12fd8bf27a68614b654ff739d227e81161298bc0d03acca4f", size = 4206, upload-time = "2025-11-14T09:58:30.814Z" }, +] + +[[package]] +name = "pyobjc-framework-phase" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-avfoundation" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/51/3b25eaf7ca85f38ceef892fdf066b7faa0fec716f35ea928c6ffec6ae311/pyobjc_framework_phase-12.1.tar.gz", hash = "sha256:3a69005c572f6fd777276a835115eb8359a33673d4a87e754209f99583534475", size = 32730, upload-time = "2025-11-14T10:18:43.102Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/9f/1ae45db731e8d6dd3e0b408c3accd0cf3236849e671f95c7c8cf95687240/pyobjc_framework_phase-12.1-py2.py3-none-any.whl", hash = "sha256:99a1c1efc6644f5312cce3693117d4e4482538f65ad08fe59e41e2579b67ab17", size = 6902, upload-time = "2025-11-14T09:58:32.436Z" }, +] + +[[package]] +name = "pyobjc-framework-photos" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/53/f8a3dc7f711034d2283e289cd966fb7486028ea132a24260290ff32d3525/pyobjc_framework_photos-12.1.tar.gz", hash = "sha256:adb68aaa29e186832d3c36a0b60b0592a834e24c5263e9d78c956b2b77dce563", size = 47034, upload-time = "2025-11-14T10:18:47.27Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/38/e6f25aec46a1a9d0a310795606cc43f9823d41c3e152114b814b597835a8/pyobjc_framework_photos-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eda8a584a851506a1ebbb2ee8de2cb1ed9e3431e6a642ef6a9543e32117d17b9", size = 12358, upload-time = "2025-11-14T09:58:38.131Z" }, +] + +[[package]] +name = "pyobjc-framework-photosui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/a5/14c538828ed1a420e047388aedc4a2d7d9292030d81bf6b1ced2ec27b6e9/pyobjc_framework_photosui-12.1.tar.gz", hash = "sha256:9141234bb9d17687f1e8b66303158eccdd45132341fbe5e892174910035f029a", size = 29886, upload-time = "2025-11-14T10:18:50.238Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/a2/b5afca8039b1a659a2a979bb1bdbdddfdf9b1d2724a2cc4633dca2573d5f/pyobjc_framework_photosui-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:713e3bb25feb5ea891e67260c2c0769cab44a7f11b252023bfcf9f8c29dd1206", size = 11714, upload-time = "2025-11-14T09:58:53.674Z" }, +] + +[[package]] +name = "pyobjc-framework-preferencepanes" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/bc/e87df041d4f7f6b7721bf7996fa02aa0255939fb0fac0ecb294229765f92/pyobjc_framework_preferencepanes-12.1.tar.gz", hash = "sha256:b2a02f9049f136bdeca7642b3307637b190850e5853b74b5c372bc7d88ef9744", size = 24543, upload-time = "2025-11-14T10:18:53.259Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/7b/8ceec1ab0446224d685e243e2770c5a5c92285bcab0b9324dbe7a893ae5a/pyobjc_framework_preferencepanes-12.1-py2.py3-none-any.whl", hash = "sha256:1b3af9db9e0cfed8db28c260b2cf9a22c15fda5f0ff4c26157b17f99a0e29bbf", size = 4797, upload-time = "2025-11-14T09:59:03.998Z" }, +] + +[[package]] +name = "pyobjc-framework-pushkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/45/de756b62709add6d0615f86e48291ee2bee40223e7dde7bbe68a952593f0/pyobjc_framework_pushkit-12.1.tar.gz", hash = "sha256:829a2fc8f4780e75fc2a41217290ee0ff92d4ade43c42def4d7e5af436d8ae82", size = 19465, upload-time = "2025-11-14T10:18:57.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/01/74cf1dd0764c590de05dc1e87d168031e424f834721940b7bb02c67fe821/pyobjc_framework_pushkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7bdf472a55ac65154e03f54ae0bcad64c4cf45e9b1acba62f15107f2bc994d69", size = 8177, upload-time = "2025-11-14T09:59:11.155Z" }, +] + +[[package]] +name = "pyobjc-framework-quartz" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/18/cc59f3d4355c9456fc945eae7fe8797003c4da99212dd531ad1b0de8a0c6/pyobjc_framework_quartz-12.1.tar.gz", hash = "sha256:27f782f3513ac88ec9b6c82d9767eef95a5cf4175ce88a1e5a65875fee799608", size = 3159099, upload-time = "2025-11-14T10:21:24.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/9b/780f057e5962f690f23fdff1083a4cfda5a96d5b4d3bb49505cac4f624f2/pyobjc_framework_quartz-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7730cdce46c7e985535b5a42c31381af4aa6556e5642dc55b5e6597595e57a16", size = 218798, upload-time = "2025-11-14T10:00:01.236Z" }, +] + +[[package]] +name = "pyobjc-framework-quicklookthumbnailing" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/1a/b90539500e9a27c2049c388d85a824fc0704009b11e33b05009f52a6dc67/pyobjc_framework_quicklookthumbnailing-12.1.tar.gz", hash = "sha256:4f7e09e873e9bda236dce6e2f238cab571baeb75eca2e0bc0961d5fcd85f3c8f", size = 14790, upload-time = "2025-11-14T10:21:26.442Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/22/7bd07b5b44bf8540514a9f24bc46da68812c1fd6c63bb2d3496e5ea44bf0/pyobjc_framework_quicklookthumbnailing-12.1-py2.py3-none-any.whl", hash = "sha256:5efe50b0318188b3a4147681788b47fce64709f6fe0e1b5d020e408ef40ab08e", size = 4234, upload-time = "2025-11-14T10:01:02.209Z" }, +] + +[[package]] +name = "pyobjc-framework-replaykit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/f8/b92af879734d91c1726227e7a03b9e68ab8d9d2bb1716d1a5c29254087f2/pyobjc_framework_replaykit-12.1.tar.gz", hash = "sha256:95801fd35c329d7302b2541f2754e6574bf36547ab869fbbf41e408dfa07268a", size = 23312, upload-time = "2025-11-14T10:21:29.18Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/fc/c68d2111b2655148d88574959d3d8b21d3a003573013301d4d2a7254c1af/pyobjc_framework_replaykit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b0528c2a6188440fdc2017f0924c0a0f15d0a2f6aa295f1d1c2d6b3894c22f1d", size = 10120, upload-time = "2025-11-14T10:01:08.397Z" }, +] + +[[package]] +name = "pyobjc-framework-safariservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/4b/8f896bafbdbfa180a5ba1e21a6f5dc63150c09cba69d85f68708e02866ae/pyobjc_framework_safariservices-12.1.tar.gz", hash = "sha256:6a56f71c1e692bca1f48fe7c40e4c5a41e148b4e3c6cfb185fd80a4d4a951897", size = 25165, upload-time = "2025-11-14T10:21:32.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/3a/8c525562fd782c88bc44e8c07fc2c073919f98dead08fffd50f280ef1afa/pyobjc_framework_safariservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b475abc82504fc1c0801096a639562d6a6d37370193e8e4a406de9199a7cea13", size = 7281, upload-time = "2025-11-14T10:01:21.238Z" }, +] + +[[package]] +name = "pyobjc-framework-safetykit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/bf/ad6bf60ceb61614c9c9f5758190971e9b90c45b1c7a244e45db64138b6c2/pyobjc_framework_safetykit-12.1.tar.gz", hash = "sha256:0cd4850659fb9b5632fd8ad21f2de6863e8303ff0d51c5cc9c0034aac5db08d8", size = 20086, upload-time = "2025-11-14T10:21:34.212Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/0c/08a20fb7516405186c0fe7299530edd4aa22c24f73290198312447f26c8c/pyobjc_framework_safetykit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e4977f7069a23252053d1a42b1a053aefc19b85c960a5214b05daf3c037a6f16", size = 8550, upload-time = "2025-11-14T10:01:32.885Z" }, +] + +[[package]] +name = "pyobjc-framework-scenekit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/8c/1f4005cf0cb68f84dd98b93bbc0974ee7851bb33d976791c85e042dc2278/pyobjc_framework_scenekit-12.1.tar.gz", hash = "sha256:1bd5b866f31fd829f26feac52e807ed942254fd248115c7c742cfad41d949426", size = 101212, upload-time = "2025-11-14T10:21:41.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/f1/4986bd96e0ba0f60bff482a6b135b9d6db65d56578d535751f18f88190f0/pyobjc_framework_scenekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:40aea10098893f0b06191f1e79d7b25e12e36a9265549d324238bdb25c7e6df0", size = 33597, upload-time = "2025-11-14T10:01:51.297Z" }, +] + +[[package]] +name = "pyobjc-framework-screencapturekit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/7f/73458db1361d2cb408f43821a1e3819318a0f81885f833d78d93bdc698e0/pyobjc_framework_screencapturekit-12.1.tar.gz", hash = "sha256:50992c6128b35ab45d9e336f0993ddd112f58b8c8c8f0892a9cb42d61bd1f4c9", size = 32573, upload-time = "2025-11-14T10:21:44.497Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/a8/533acdbf26e0a908ff640d3a445481f3c948682ca887be6711b5fcf82682/pyobjc_framework_screencapturekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:27df138ce2dfa9d4aae5106d4877e9ed694b5a174643c058f1c48678ffc7001a", size = 11504, upload-time = "2025-11-14T10:02:11.36Z" }, +] + +[[package]] +name = "pyobjc-framework-screensaver" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/99/7cfbce880cea61253a44eed594dce66c2b2fbf29e37eaedcd40cffa949e9/pyobjc_framework_screensaver-12.1.tar.gz", hash = "sha256:c4ca111317c5a3883b7eace0a9e7dd72bc6ffaa2ca954bdec918c3ab7c65c96f", size = 22229, upload-time = "2025-11-14T10:21:47.299Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/a4/2481711f2e9557b90bac74fa8bf821162cf7b65835732ae560fd52e9037e/pyobjc_framework_screensaver-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a3c90c2299eac6d01add81427ae2f90d7724f15d676261e838d7a7750f812322", size = 8422, upload-time = "2025-11-14T10:02:24.49Z" }, +] + +[[package]] +name = "pyobjc-framework-screentime" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/11/ba18f905321895715dac3cae2071c2789745ae13605b283b8114b41e0459/pyobjc_framework_screentime-12.1.tar.gz", hash = "sha256:583de46b365543bbbcf27cd70eedd375d397441d64a2cf43c65286fd9c91af55", size = 13413, upload-time = "2025-11-14T10:21:49.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/06/904174de6170e11b53673cc5844e5f13394eeeed486e0bcdf5288c1b0853/pyobjc_framework_screentime-12.1-py2.py3-none-any.whl", hash = "sha256:d34a068ec8ba2704987fcd05c37c9a9392de61d92933e6e71c8e4eaa4dfce029", size = 3963, upload-time = "2025-11-14T10:02:32.577Z" }, +] + +[[package]] +name = "pyobjc-framework-scriptingbridge" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0c/cb/adc0a09e8c4755c2281bd12803a87f36e0832a8fc853a2d663433dbb72ce/pyobjc_framework_scriptingbridge-12.1.tar.gz", hash = "sha256:0e90f866a7e6a8aeaf723d04c826657dd528c8c1b91e7a605f8bb947c74ad082", size = 20339, upload-time = "2025-11-14T10:21:51.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/46/e0b07d2b3ff9effb8b1179a6cc681a953d3dfbf0eb8b1d6a0e54cef2e922/pyobjc_framework_scriptingbridge-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8083cd68c559c55a3787b2e74fc983c8665e5078571475aaeabf4f34add36b62", size = 8356, upload-time = "2025-11-14T10:02:38.559Z" }, +] + +[[package]] +name = "pyobjc-framework-searchkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-coreservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/60/a38523198430e14fdef21ebe62a93c43aedd08f1f3a07ea3d96d9997db5d/pyobjc_framework_searchkit-12.1.tar.gz", hash = "sha256:ddd94131dabbbc2d7c3f17db3da87c1a712c431310eef16f07187771e7e85226", size = 30942, upload-time = "2025-11-14T10:21:55.483Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/46/4f9cd3011f47b43b21b2924ab3770303c3f0a4d16f05550d38c5fcb42e78/pyobjc_framework_searchkit-12.1-py2.py3-none-any.whl", hash = "sha256:844ce62b7296b19da8db7dedd539d07f7b3fb3bb8b029c261f7bcf0e01a97758", size = 3733, upload-time = "2025-11-14T10:02:47.026Z" }, +] + +[[package]] +name = "pyobjc-framework-security" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/aa/796e09a3e3d5cee32ebeebb7dcf421b48ea86e28c387924608a05e3f668b/pyobjc_framework_security-12.1.tar.gz", hash = "sha256:7fecb982bd2f7c4354513faf90ba4c53c190b7e88167984c2d0da99741de6da9", size = 168044, upload-time = "2025-11-14T10:22:06.334Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/66/5160c0f938fc0515fe8d9af146aac1b093f7ef285ce797fedae161b6c0e8/pyobjc_framework_security-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab42e55f5b782332be5442750fcd9637ee33247d57c7b1d5801bc0e24ee13278", size = 41280, upload-time = "2025-11-14T10:02:58.097Z" }, +] + +[[package]] +name = "pyobjc-framework-securityfoundation" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/d5/c2b77e83c1585ba43e5f00c917273ba4bf7ed548c1b691f6766eb0418d52/pyobjc_framework_securityfoundation-12.1.tar.gz", hash = "sha256:1f39f4b3db6e3bd3a420aaf4923228b88e48c90692cf3612b0f6f1573302a75d", size = 12669, upload-time = "2025-11-14T10:22:09.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/1e/349fb71a413b37b1b41e712c7ca180df82144478f8a9a59497d66d0f2ea2/pyobjc_framework_securityfoundation-12.1-py2.py3-none-any.whl", hash = "sha256:579cf23e63434226f78ffe0afb8426e971009588e4ad812c478d47dfd558201c", size = 3792, upload-time = "2025-11-14T10:03:14.459Z" }, +] + +[[package]] +name = "pyobjc-framework-securityinterface" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/64/bf5b5d82655112a2314422ee649f1e1e73d4381afa87e1651ce7e8444694/pyobjc_framework_securityinterface-12.1.tar.gz", hash = "sha256:deef11ad03be8d9ff77db6e7ac40f6b641ee2d72eaafcf91040537942472e88b", size = 25552, upload-time = "2025-11-14T10:22:12.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/3e/17889a6de03dc813606bb97887dc2c4c2d4e7c8f266bc439548bae756e90/pyobjc_framework_securityinterface-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5cb5e79a73ea17663ebd29e350401162d93e42343da7d96c77efb38ae64ff01f", size = 10783, upload-time = "2025-11-14T10:03:20.202Z" }, +] + +[[package]] +name = "pyobjc-framework-securityui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-security" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/3f/d870305f5dec58cd02966ca06ac29b69fb045d8b46dfb64e2da31f295345/pyobjc_framework_securityui-12.1.tar.gz", hash = "sha256:f1435fed85edc57533c334a4efc8032170424b759da184cb7a7a950ceea0e0b6", size = 12184, upload-time = "2025-11-14T10:22:14.323Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/7f/eff9ffdd34511cc95a60e5bd62f1cfbcbcec1a5012ef1168161506628c87/pyobjc_framework_securityui-12.1-py2.py3-none-any.whl", hash = "sha256:3e988b83c9a2bb0393207eaa030fc023a8708a975ac5b8ea0508cdafc2b60705", size = 3594, upload-time = "2025-11-14T10:03:29.628Z" }, +] + +[[package]] +name = "pyobjc-framework-sensitivecontentanalysis" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/ce/17bf31753e14cb4d64fffaaba2377453c4977c2c5d3cf2ff0a3db30026c7/pyobjc_framework_sensitivecontentanalysis-12.1.tar.gz", hash = "sha256:2c615ac10e93eb547b32b214cd45092056bee0e79696426fd09978dc3e670f25", size = 13745, upload-time = "2025-11-14T10:22:16.447Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/23/c99568a0d4e38bd8337d52e4ae25a0b0bd540577f2e06f3430c951d73209/pyobjc_framework_sensitivecontentanalysis-12.1-py2.py3-none-any.whl", hash = "sha256:faf19d32d4599ac2b18fb1ccdc3e33b2b242bdf34c02e69978bd62d3643ad068", size = 4230, upload-time = "2025-11-14T10:03:31.26Z" }, +] + +[[package]] +name = "pyobjc-framework-servicemanagement" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/d0/b26c83ae96ab55013df5fedf89337d4d62311b56ce3f520fc7597d223d82/pyobjc_framework_servicemanagement-12.1.tar.gz", hash = "sha256:08120981749a698033a1d7a6ab99dbbe412c5c0d40f2b4154014b52113511c1d", size = 14585, upload-time = "2025-11-14T10:22:18.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/5d/1009c32189f9cb26da0124b4a60640ed26dd8ad453810594f0cbfab0ff70/pyobjc_framework_servicemanagement-12.1-py2.py3-none-any.whl", hash = "sha256:9a2941f16eeb71e55e1cd94f50197f91520778c7f48ad896761f5e78725cc08f", size = 5357, upload-time = "2025-11-14T10:03:32.928Z" }, +] + +[[package]] +name = "pyobjc-framework-sharedwithyou" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-sharedwithyoucore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/8b/8ab209a143c11575a857e2111acc5427fb4986b84708b21324cbcbf5591b/pyobjc_framework_sharedwithyou-12.1.tar.gz", hash = "sha256:167d84794a48f408ee51f885210c616fda1ec4bff3dd8617a4b5547f61b05caf", size = 24791, upload-time = "2025-11-14T10:22:21.248Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/ee/e5113ce985a480d13a0fa3d41a242c8068dc09b3c13210557cf5cc6a544a/pyobjc_framework_sharedwithyou-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a99a6ebc6b6de7bc8663b1f07332fab9560b984a57ce344dc5703f25258f258d", size = 8763, upload-time = "2025-11-14T10:03:38.467Z" }, +] + +[[package]] +name = "pyobjc-framework-sharedwithyoucore" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/ef/84059c5774fd5435551ab7ab40b51271cfb9997b0d21f491c6b429fe57a8/pyobjc_framework_sharedwithyoucore-12.1.tar.gz", hash = "sha256:0813149eeb755d718b146ec9365eb4ca3262b6af9ff9ba7db2f7b6f4fd104518", size = 22350, upload-time = "2025-11-14T10:22:23.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/0e/0c2b0591ebc72d437dccca7a1e7164c5f11dde2189d4f4c707a132bab740/pyobjc_framework_sharedwithyoucore-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed928266ae9d577ff73de72a03bebc66a751918eb59ca660a9eca157392f17be", size = 8530, upload-time = "2025-11-14T10:03:50.839Z" }, +] + +[[package]] +name = "pyobjc-framework-shazamkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/2c/8d82c5066cc376de68ad8c1454b7c722c7a62215e5c2f9dac5b33a6c3d42/pyobjc_framework_shazamkit-12.1.tar.gz", hash = "sha256:71db2addd016874639a224ed32b2000b858802b0370c595a283cce27f76883fe", size = 22518, upload-time = "2025-11-14T10:22:25.996Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/5e/7d60d8e7b036b20d0e94cd7c4563e7414653344482e85fbc7facffabc95f/pyobjc_framework_shazamkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e184dd0f61a604b1cfcf44418eb95b943e7b8f536058a29e4b81acadd27a9420", size = 8577, upload-time = "2025-11-14T10:04:04.182Z" }, +] + +[[package]] +name = "pyobjc-framework-social" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/21/afc6f37dfdd2cafcba0227e15240b5b0f1f4ad57621aeefda2985ac9560e/pyobjc_framework_social-12.1.tar.gz", hash = "sha256:1963db6939e92ae40dd9d68852e8f88111cbfd37a83a9fdbc9a0c08993ca7e60", size = 13184, upload-time = "2025-11-14T10:22:28.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/fb/090867e332d49a1e492e4b8972ac6034d1c7d17cf39f546077f35be58c46/pyobjc_framework_social-12.1-py2.py3-none-any.whl", hash = "sha256:2f3b36ba5769503b1bc945f85fd7b255d42d7f6e417d78567507816502ff2b44", size = 4462, upload-time = "2025-11-14T10:04:14.578Z" }, +] + +[[package]] +name = "pyobjc-framework-soundanalysis" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/d6/5039b61edc310083425f87ce2363304d3a87617e941c1d07968c63b5638d/pyobjc_framework_soundanalysis-12.1.tar.gz", hash = "sha256:e2deead8b9a1c4513dbdcf703b21650dcb234b60a32d08afcec4895582b040b1", size = 14804, upload-time = "2025-11-14T10:22:29.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/d3/8df5183d52d20d459225d3f5d24f55e01b8cd9fe587ed972e3f20dd18709/pyobjc_framework_soundanalysis-12.1-py2.py3-none-any.whl", hash = "sha256:8b2029ab48c1a9772f247f0aea995e8c3ff4706909002a9c1551722769343a52", size = 4188, upload-time = "2025-11-14T10:04:16.12Z" }, +] + +[[package]] +name = "pyobjc-framework-speech" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/3d/194cf19fe7a56c2be5dfc28f42b3b597a62ebb1e1f52a7dd9c55b917ac6c/pyobjc_framework_speech-12.1.tar.gz", hash = "sha256:2a2a546ba6c52d5dd35ddcfee3fd9226a428043d1719597e8701851a6566afdd", size = 25218, upload-time = "2025-11-14T10:22:32.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/1b/224cb98c9c32a6d5e68072f89d26444095be54c6f461efe4fefe9d1330a5/pyobjc_framework_speech-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cae4b88ef9563157a6c9e66b37778fc4022ee44dd1a2a53081c2adbb69698945", size = 9254, upload-time = "2025-11-14T10:04:21.361Z" }, +] + +[[package]] +name = "pyobjc-framework-spritekit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/78/d683ebe0afb49f46d2d21d38c870646e7cb3c2e83251f264e79d357b1b74/pyobjc_framework_spritekit-12.1.tar.gz", hash = "sha256:a851f4ef5aa65cc9e08008644a528e83cb31021a1c0f17ebfce4de343764d403", size = 64470, upload-time = "2025-11-14T10:22:37.569Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/38/97c3b6c3437e3e9267fb4e1cd86e0da4eff07e0abe7cd6923644d2dfc878/pyobjc_framework_spritekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1649e57c25145795d04bb6a1ec44c20ef7cf0af7c60a9f6f5bc7998dd269db1e", size = 17802, upload-time = "2025-11-14T10:04:35.346Z" }, +] + +[[package]] +name = "pyobjc-framework-storekit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/87/8a66a145feb026819775d44975c71c1c64df4e5e9ea20338f01456a61208/pyobjc_framework_storekit-12.1.tar.gz", hash = "sha256:818452e67e937a10b5c8451758274faa44ad5d4329df0fa85735115fb0608da9", size = 34574, upload-time = "2025-11-14T10:22:40.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/9f/938985e506de0cc3a543e44e1f9990e9e2fb8980b8f3bcfc8f7921d09061/pyobjc_framework_storekit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9fe2d65a2b644bb6b4fdd3002292cba153560917de3dd6cf969431fa32d21dd0", size = 12819, upload-time = "2025-11-14T10:04:50.945Z" }, +] + +[[package]] +name = "pyobjc-framework-symbols" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/ce/a48819eb8524fa2dc11fb3dd40bb9c4dcad0596fe538f5004923396c2c6c/pyobjc_framework_symbols-12.1.tar.gz", hash = "sha256:7d8e999b8a59c97d38d1d343b6253b1b7d04bf50b665700957d89c8ac43b9110", size = 12782, upload-time = "2025-11-14T10:22:42.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/ea/6e9af9c750d68109ac54fbffb5463e33a7b54ffe8b9901a5b6b603b7884b/pyobjc_framework_symbols-12.1-py2.py3-none-any.whl", hash = "sha256:c72eecbc25f6bfcd39c733067276270057c5aca684be20fdc56def645f2b6446", size = 3331, upload-time = "2025-11-14T10:05:01.333Z" }, +] + +[[package]] +name = "pyobjc-framework-syncservices" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coredata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/91/6d03a988831ddb0fb001b13573560e9a5bcccde575b99350f98fe56a2dd4/pyobjc_framework_syncservices-12.1.tar.gz", hash = "sha256:6a213e93d9ce15128810987e4c5de8c73cfab1564ac8d273e6b437a49965e976", size = 31032, upload-time = "2025-11-14T10:22:45.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/ac/a83cdd120e279ee905e9085afda90992159ed30c6a728b2c56fa2d36b6ea/pyobjc_framework_syncservices-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0cd629bea95692aad2d26196657cde2fbadedae252c7846964228661a600b900", size = 13411, upload-time = "2025-11-14T10:05:07.741Z" }, +] + +[[package]] +name = "pyobjc-framework-systemconfiguration" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/7d/50848df8e1c6b5e13967dee9fb91d3391fe1f2399d2d0797d2fc5edb32ba/pyobjc_framework_systemconfiguration-12.1.tar.gz", hash = "sha256:90fe04aa059876a21626931c71eaff742a27c79798a46347fd053d7008ec496e", size = 59158, upload-time = "2025-11-14T10:22:53.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/d3/bb935c3d4bae9e6ce4a52638e30eea7039c480dd96bc4f0777c9fabda21b/pyobjc_framework_systemconfiguration-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0e5bb9103d39483964431db7125195c59001b7bff2961869cfe157b4c861e52d", size = 21578, upload-time = "2025-11-14T10:05:25.572Z" }, +] + +[[package]] +name = "pyobjc-framework-systemextensions" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/01/8a706cd3f7dfcb9a5017831f2e6f9e5538298e90052db3bb8163230cbc4f/pyobjc_framework_systemextensions-12.1.tar.gz", hash = "sha256:243e043e2daee4b5c46cd90af5fff46b34596aac25011bab8ba8a37099685eeb", size = 20701, upload-time = "2025-11-14T10:22:58.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/cc/a42883d6ad0ae257a7fa62660b4dd13be15f8fa657922f9a5b6697f26e28/pyobjc_framework_systemextensions-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:01fac4f8d88c0956d9fc714d24811cd070e67200ba811904317d91e849e38233", size = 9166, upload-time = "2025-11-14T10:05:41.479Z" }, +] + +[[package]] +name = "pyobjc-framework-threadnetwork" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/7e/f1816c3461e4121186f2f7750c58af083d1826bbd73f72728da3edcf4915/pyobjc_framework_threadnetwork-12.1.tar.gz", hash = "sha256:e071eedb41bfc1b205111deb54783ec5a035ccd6929e6e0076336107fdd046ee", size = 12788, upload-time = "2025-11-14T10:23:00.329Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/b8/94b37dd353302c051a76f1a698cf55b5ad50ca061db7f0f332aa9e195766/pyobjc_framework_threadnetwork-12.1-py2.py3-none-any.whl", hash = "sha256:07d937748fc54199f5ec04d5a408e8691a870481c11b641785c2adc279dd8e4b", size = 3771, upload-time = "2025-11-14T10:05:49.899Z" }, +] + +[[package]] +name = "pyobjc-framework-uniformtypeidentifiers" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/b8/dd9d2a94509a6c16d965a7b0155e78edf520056313a80f0cd352413f0d0b/pyobjc_framework_uniformtypeidentifiers-12.1.tar.gz", hash = "sha256:64510a6df78336579e9c39b873cfcd03371c4b4be2cec8af75a8a3d07dff607d", size = 17030, upload-time = "2025-11-14T10:23:02.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/5f/1f10f5275b06d213c9897850f1fca9c881c741c1f9190cea6db982b71824/pyobjc_framework_uniformtypeidentifiers-12.1-py2.py3-none-any.whl", hash = "sha256:ec5411e39152304d2a7e0e426c3058fa37a00860af64e164794e0bcffee813f2", size = 4901, upload-time = "2025-11-14T10:05:51.532Z" }, +] + +[[package]] +name = "pyobjc-framework-usernotifications" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/cd/e0253072f221fa89a42fe53f1a2650cc9bf415eb94ae455235bd010ee12e/pyobjc_framework_usernotifications-12.1.tar.gz", hash = "sha256:019ccdf2d400f9a428769df7dba4ea97c02453372bc5f8b75ce7ae54dfe130f9", size = 29749, upload-time = "2025-11-14T10:23:05.364Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/c95053a475246464cba686e16269b0973821601910d1947d088b855a8dac/pyobjc_framework_usernotifications-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:412afb2bf5fe0049f9c4e732e81a8a35d5ebf97c30a5a6abd276259d020c82ac", size = 9644, upload-time = "2025-11-14T10:05:56.801Z" }, +] + +[[package]] +name = "pyobjc-framework-usernotificationsui" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-usernotifications" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/03/73e29fd5e5973cb3800c9d56107c1062547ef7524cbcc757c3cbbd5465c6/pyobjc_framework_usernotificationsui-12.1.tar.gz", hash = "sha256:51381c97c7344099377870e49ed0871fea85ba50efe50ab05ccffc06b43ec02e", size = 13125, upload-time = "2025-11-14T10:23:07.259Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/c8/52ac8a879079c1fbf25de8335ff506f7db87ff61e64838b20426f817f5d5/pyobjc_framework_usernotificationsui-12.1-py2.py3-none-any.whl", hash = "sha256:11af59dc5abfcb72c08769ab4d7ca32a628527a8ba341786431a0d2dacf31605", size = 3933, upload-time = "2025-11-14T10:06:05.478Z" }, +] + +[[package]] +name = "pyobjc-framework-videosubscriberaccount" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/f8/27927a9c125c622656ee5aada4596ccb8e5679da0260742360f193df6dcf/pyobjc_framework_videosubscriberaccount-12.1.tar.gz", hash = "sha256:750459fa88220ab83416f769f2d5d210a1f77b8938fa4d119aad0002fc32846b", size = 18793, upload-time = "2025-11-14T10:23:09.33Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/ca/e2f982916267508c1594f1e50d27bf223a24f55a5e175ab7d7822a00997c/pyobjc_framework_videosubscriberaccount-12.1-py2.py3-none-any.whl", hash = "sha256:381a5e8a3016676e52b88e38b706559fa09391d33474d8a8a52f20a883104a7b", size = 4825, upload-time = "2025-11-14T10:06:07.027Z" }, +] + +[[package]] +name = "pyobjc-framework-videotoolbox" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coremedia" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/5f/6995ee40dc0d1a3460ee183f696e5254c0ad14a25b5bc5fd9bd7266c077b/pyobjc_framework_videotoolbox-12.1.tar.gz", hash = "sha256:7adc8670f3b94b086aed6e86c3199b388892edab4f02933c2e2d9b1657561bef", size = 57825, upload-time = "2025-11-14T10:23:13.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/a5/91c6c95416f41c412c2079950527cb746c0712ec319c51a6c728c8d6b231/pyobjc_framework_videotoolbox-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eb6ce6837344ee319122066c16ada4beb913e7bfd62188a8d14b1ecbb5a89234", size = 18908, upload-time = "2025-11-14T10:06:14.087Z" }, +] + +[[package]] +name = "pyobjc-framework-virtualization" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/6a/9d110b5521d9b898fad10928818c9f55d66a4af9ac097426c65a9878b095/pyobjc_framework_virtualization-12.1.tar.gz", hash = "sha256:e96afd8e801e92c6863da0921e40a3b68f724804f888bce43791330658abdb0f", size = 40682, upload-time = "2025-11-14T10:23:17.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/f2/0da47e91f3f8eeda9a8b4bb0d3a0c54a18925009e99b66a8226b9e06ce1e/pyobjc_framework_virtualization-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7d5724b38e64b39ab5ec3b45993afa29fc88b307d99ee2c7a1c0fd770e9b4b21", size = 13131, upload-time = "2025-11-14T10:06:29.337Z" }, +] + +[[package]] +name = "pyobjc-framework-vision" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, + { name = "pyobjc-framework-coreml" }, + { name = "pyobjc-framework-quartz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/5a/08bb3e278f870443d226c141af14205ff41c0274da1e053b72b11dfc9fb2/pyobjc_framework_vision-12.1.tar.gz", hash = "sha256:a30959100e85dcede3a786c544e621ad6eb65ff6abf85721f805822b8c5fe9b0", size = 59538, upload-time = "2025-11-14T10:23:21.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/5a/23502935b3fc877d7573e743fc3e6c28748f33a45c43851d503bde52cde7/pyobjc_framework_vision-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6b3211d84f3a12aad0cde752cfd43a80d0218960ac9e6b46b141c730e7d655bd", size = 16625, upload-time = "2025-11-14T10:06:44.422Z" }, +] + +[[package]] +name = "pyobjc-framework-webkit" +version = "12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/10/110a50e8e6670765d25190ca7f7bfeecc47ec4a8c018cb928f4f82c56e04/pyobjc_framework_webkit-12.1.tar.gz", hash = "sha256:97a54dd05ab5266bd4f614e41add517ae62cdd5a30328eabb06792474b37d82a", size = 284531, upload-time = "2025-11-14T10:23:40.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/67/64920c8d201a7fc27962f467c636c4e763b43845baba2e091a50a97a5d52/pyobjc_framework_webkit-12.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:af2c7197447638b92aafbe4847c063b6dd5e1ed83b44d3ce7e71e4c9b042ab5a", size = 50084, upload-time = "2025-11-14T10:07:05.868Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pyperclip" +version = "1.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/52/d87eba7cb129b81563019d1679026e7a112ef76855d6159d24754dbd2a51/pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6", size = 12185, upload-time = "2025-09-26T14:40:37.245Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063, upload-time = "2025-09-26T14:40:36.069Z" }, +] + +[[package]] +name = "pyrect" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/04/2ba023d5f771b645f7be0c281cdacdcd939fe13d1deb331fc5ed1a6b3a98/PyRect-0.2.0.tar.gz", hash = "sha256:f65155f6df9b929b67caffbd57c0947c5ae5449d3b580d178074bffb47a09b78", size = 17219, upload-time = "2022-03-16T04:45:52.36Z" } + +[[package]] +name = "pyscreeze" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/f0/cb456ac4f1a73723d5b866933b7986f02bacea27516629c00f8e7da94c2d/pyscreeze-1.0.1.tar.gz", hash = "sha256:cf1662710f1b46aa5ff229ee23f367da9e20af4a78e6e365bee973cad0ead4be", size = 27826, upload-time = "2024-08-20T23:03:07.291Z" } + +[[package]] +name = "pyserial" +version = "3.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", size = 159125, upload-time = "2020-11-23T03:59:15.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585, upload-time = "2020-11-23T03:59:13.41Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, +] + +[[package]] +name = "pytest-cpp" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/a1/c2679d7ff2da20a0f89c7820ae2739cde739eac9b43c192531117b31b5f4/pytest_cpp-2.6.0.tar.gz", hash = "sha256:c2f49d3c038539ac84786a94d852e4f4619c34c95979c2bc69c20b3bdf051d85", size = 465490, upload-time = "2024-09-18T00:08:08.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/44/dc2f5d53165264ae5831f361fe7723c45da05718a97015b2eddc452cf503/pytest_cpp-2.6.0-py3-none-any.whl", hash = "sha256:b33de94609450feea2fba9efff3558b8ac8f1fdf40a99e263b395d4798b911bb", size = 15074, upload-time = "2024-09-18T00:08:06.415Z" }, +] + +[[package]] +name = "pytest-mock" +version = "3.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" }, +] + +[[package]] +name = "pytest-repeat" +version = "0.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/d4/69e9dbb9b8266df0b157c72be32083403c412990af15c7c15f7a3fd1b142/pytest_repeat-0.9.4.tar.gz", hash = "sha256:d92ac14dfaa6ffcfe6917e5d16f0c9bc82380c135b03c2a5f412d2637f224485", size = 6488, upload-time = "2025-04-07T14:59:53.077Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/d4/8b706b81b07b43081bd68a2c0359fe895b74bf664b20aca8005d2bb3be71/pytest_repeat-0.9.4-py3-none-any.whl", hash = "sha256:c1738b4e412a6f3b3b9e0b8b29fcd7a423e50f87381ad9307ef6f5a8601139f3", size = 4180, upload-time = "2025-04-07T14:59:51.492Z" }, +] + +[[package]] +name = "pytest-subtests" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/d9/20097971a8d315e011e055d512fa120fd6be3bdb8f4b3aa3e3c6bf77bebc/pytest_subtests-0.15.0.tar.gz", hash = "sha256:cb495bde05551b784b8f0b8adfaa27edb4131469a27c339b80fd8d6ba33f887c", size = 18525, upload-time = "2025-10-20T16:26:18.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/64/bba465299b37448b4c1b84c7a04178399ac22d47b3dc5db1874fe55a2bd3/pytest_subtests-0.15.0-py3-none-any.whl", hash = "sha256:da2d0ce348e1f8d831d5a40d81e3aeac439fec50bd5251cbb7791402696a9493", size = 9185, upload-time = "2025-10-20T16:26:17.239Z" }, +] + +[[package]] +name = "pytest-timeout" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382, upload-time = "2025-05-05T19:44:33.502Z" }, +] + +[[package]] +name = "pytest-xdist" +version = "3.7.1.dev24+g2b4372bd6" +source = { git = "https://github.com/sshane/pytest-xdist?rev=2b4372bd62699fb412c4fe2f95bf9f01bd2018da#2b4372bd62699fb412c4fe2f95bf9f01bd2018da" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-xlib" +version = "0.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/f5/8c0653e5bb54e0cbdfe27bf32d41f27bc4e12faa8742778c17f2a71be2c0/python-xlib-0.33.tar.gz", hash = "sha256:55af7906a2c75ce6cb280a584776080602444f75815a7aff4d287bb2d7018b32", size = 269068, upload-time = "2022-12-25T18:53:00.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/b8/ff33610932e0ee81ae7f1269c890f697d56ff74b9f5b2ee5d9b7fa2c5355/python_xlib-0.33-py2.py3-none-any.whl", hash = "sha256:c3534038d42e0df2f1392a1b30a15a4ff5fdc2b86cfa94f072bf11b10a164398", size = 182185, upload-time = "2022-12-25T18:52:58.662Z" }, +] + +[[package]] +name = "python3-xlib" +version = "0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/c6/2c5999de3bb1533521f1101e8fe56fd9c266732f4d48011c7c69b29d12ae/python3-xlib-0.15.tar.gz", hash = "sha256:dc4245f3ae4aa5949c1d112ee4723901ade37a96721ba9645f2bfa56e5b383f8", size = 132828, upload-time = "2014-05-31T12:28:59.603Z" } + +[[package]] +name = "pytweening" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/0c/c16bc93ac2755bac0066a8ecbd2a2931a1735a6fffd99a2b9681c7e83e90/pytweening-1.2.0.tar.gz", hash = "sha256:243318b7736698066c5f362ec5c2b6434ecf4297c3c8e7caa8abfe6af4cac71b", size = 171241, upload-time = "2024-02-20T03:37:56.809Z" } + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, +] + +[[package]] +name = "pywinbox" +version = "0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ewmhlib", marker = "sys_platform == 'linux'" }, + { name = "pyobjc", marker = "sys_platform == 'darwin'" }, + { name = "python-xlib", marker = "sys_platform == 'linux'" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/37/d59397221e15d2a7f38afaa4e8e6b8c244d818044f7daa0bdc5988df0a69/PyWinBox-0.7-py3-none-any.whl", hash = "sha256:8b2506a8dd7afa0a910b368762adfac885274132ef9151b0c81b0d2c6ffd6f83", size = 12274, upload-time = "2024-04-17T10:10:31.899Z" }, +] + +[[package]] +name = "pywinctl" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ewmhlib", marker = "sys_platform == 'linux'" }, + { name = "pymonctl" }, + { name = "pyobjc", marker = "sys_platform == 'darwin'" }, + { name = "python-xlib", marker = "sys_platform == 'linux'" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "pywinbox" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/33/8e4f632210b28fc9e998a9ab990e7ed97ecd2800cc50038e3800e1d85dbe/PyWinCtl-0.4.1-py3-none-any.whl", hash = "sha256:4d875e22969e1c6239d8c73156193630aaab876366167b8d97716f956384b089", size = 63158, upload-time = "2024-09-23T08:33:39.881Z" }, +] + +[[package]] +name = "pyzbar" +version = "0.1.9" +source = { git = "https://github.com/greatgitsby/op-dependencies.git?subdirectory=pyzbar&rev=release-pyzbar#f98575b114e6e64f52619996d55e089e3f049ba9" } + +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, +] + +[[package]] +name = "qrcode" +version = "8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/b2/7fc2931bfae0af02d5f53b174e9cf701adbb35f39d69c2af63d4a39f81a9/qrcode-8.2.tar.gz", hash = "sha256:35c3f2a4172b33136ab9f6b3ef1c00260dd2f66f858f24d88418a015f446506c", size = 43317, upload-time = "2025-05-01T15:44:24.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/b8/d2d6d731733f51684bbf76bf34dab3b70a9148e8f2cef2bb544fccec681a/qrcode-8.2-py3-none-any.whl", hash = "sha256:16e64e0716c14960108e85d853062c9e8bba5ca8252c0b4d0231b9df4060ff4f", size = 45986, upload-time = "2025-05-01T15:44:22.781Z" }, +] + +[[package]] +name = "raylib" +version = "5.5.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/4b/858958762c075c54058ee3b0771838fd505ca908871e6a0397b01086e526/raylib-5.5.0.4.tar.gz", hash = "sha256:996506e8a533cd7a6a3ef6c44ec11f9d6936698f2c394a991af8022be33079a0", size = 184413, upload-time = "2025-12-11T15:32:12.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/21/9117d7013997a65f6d51c6f56145b2c583eeba8f7c1af71a60776eaae9b9/raylib-5.5.0.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:31f64f71e42fed10e8f3629028c9f5700906e0e573b915cfc2244d7a3f3b2ed9", size = 1635486, upload-time = "2025-12-11T15:27:31.05Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a3/e55039c8f49856c5a194f2b81f27ca6ba2d5900024f09435587e177bfaf2/raylib-5.5.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:80bfa053e765d47a9f58d59e321a999184b5a5190e369dd015c12fcfd08d6217", size = 1554132, upload-time = "2025-12-11T15:27:33.291Z" }, + { url = "https://files.pythonhosted.org/packages/58/1c/86bee75ecaa577214da16b374f8de70b45885452703f622c63e06baa0b8e/raylib-5.5.0.4-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:033240c61c1a1fc06fecff747a183671431a4ce63a0c8aafec59217845f86888", size = 2039888, upload-time = "2025-12-11T15:27:36.059Z" }, + { url = "https://files.pythonhosted.org/packages/fb/f9/00763899bb8a178a927b5dda90aca692c80ff6cec5f51e6fee88db3f45c2/raylib-5.5.0.4-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:ba87ca50c5748cab75de37a991b7f3f836ce500efbb2d737a923a5f464169088", size = 2198926, upload-time = "2025-12-11T18:50:08.813Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e9/0123385e369904335985ebd59157f7a10c89c3a706dffcf6dace863a1fa2/raylib-5.5.0.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:788830bc371ce067c4930ff46a1b6eca0c9cf27bac88f81b035e4b73cc6bf197", size = 2205629, upload-time = "2025-12-11T15:27:39.491Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/c25087b39d2db2d833a52b4056ae62db74e64b4be677f816e0b368e65453/raylib-5.5.0.4-cp312-cp312-win32.whl", hash = "sha256:e09f395035484337776c90e6c9955c5876b988db7e13168dcadb6ed11974f8ee", size = 1457266, upload-time = "2025-12-11T15:27:43.798Z" }, + { url = "https://files.pythonhosted.org/packages/2c/66/a307e61c953ace906ba68ba1174ed8f1e90e68d5fc3e3af9fb7dc46d68d1/raylib-5.5.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:553043a050a31f2ef072f26d3a70373f838a04733f7c5b26a4e9ee3f8caf06ec", size = 1708354, upload-time = "2025-12-11T15:27:45.979Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "ruamel-yaml" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/3b/ebda527b56beb90cb7652cb1c7e4f91f48649fbcd8d2eb2fb6e77cd3329b/ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993", size = 142709, upload-time = "2026-01-02T16:50:31.84Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93", size = 118102, upload-time = "2026-01-02T16:50:29.201Z" }, +] + +[[package]] +name = "rubicon-objc" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/d2/d39ecd205661a5c14c90dbd92a722a203848a3621785c9783716341de427/rubicon_objc-0.5.3.tar.gz", hash = "sha256:74c25920c5951a05db9d3a1aac31d23816ec7dacc841a5b124d911b99ea71b9a", size = 171512, upload-time = "2025-12-03T03:51:10.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/ab/e834c01138c272fb2e37d2f3c7cba708bc694dbc7b3f03b743f29ceb92d5/rubicon_objc-0.5.3-py3-none-any.whl", hash = "sha256:31dedcda9be38435f5ec067906e1eea5d0ddb790330e98a22e94ff424758b415", size = 64414, upload-time = "2025-12-03T03:51:09.082Z" }, +] + +[[package]] +name = "ruff" +version = "0.14.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, + { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, + { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, +] + +[[package]] +name = "scons" +version = "4.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/c9/2f430bb39e4eccba32ce8008df4a3206df651276422204e177a09e12b30b/scons-4.10.1.tar.gz", hash = "sha256:99c0e94a42a2c1182fa6859b0be697953db07ba936ecc9817ae0d218ced20b15", size = 3258403, upload-time = "2025-11-16T22:43:39.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/bf/931fb9fbb87234c32b8b1b1c15fba23472a10777c12043336675633809a7/scons-4.10.1-py3-none-any.whl", hash = "sha256:bd9d1c52f908d874eba92a8c0c0a8dcf2ed9f3b88ab956d0fce1da479c4e7126", size = 4136069, upload-time = "2025-11-16T22:43:35.933Z" }, +] + +[[package]] +name = "sentry-sdk" +version = "2.50.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/8a/3c4f53d32c21012e9870913544e56bfa9e931aede080779a0f177513f534/sentry_sdk-2.50.0.tar.gz", hash = "sha256:873437a989ee1b8b25579847bae8384515bf18cfed231b06c591b735c1781fe3", size = 401233, upload-time = "2026-01-20T12:53:16.244Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/5b/cbc2bb9569f03c8e15d928357e7e6179e5cfab45544a3bbac8aec4caf9be/sentry_sdk-2.50.0-py2.py3-none-any.whl", hash = "sha256:0ef0ed7168657ceb5a0be081f4102d92042a125462d1d1a29277992e344e749e", size = 424961, upload-time = "2026-01-20T12:53:14.826Z" }, +] + +[[package]] +name = "setproctitle" +version = "1.3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/48/49393a96a2eef1ab418b17475fb92b8fcfad83d099e678751b05472e69de/setproctitle-1.3.7.tar.gz", hash = "sha256:bc2bc917691c1537d5b9bca1468437176809c7e11e5694ca79a9ca12345dcb9e", size = 27002, upload-time = "2025-09-05T12:51:25.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/f0/2dc88e842077719d7384d86cc47403e5102810492b33680e7dadcee64cd8/setproctitle-1.3.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2dc99aec591ab6126e636b11035a70991bc1ab7a261da428491a40b84376654e", size = 18049, upload-time = "2025-09-05T12:49:36.241Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b4/50940504466689cda65680c9e9a1e518e5750c10490639fa687489ac7013/setproctitle-1.3.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cdd8aa571b7aa39840fdbea620e308a19691ff595c3a10231e9ee830339dd798", size = 13079, upload-time = "2025-09-05T12:49:38.088Z" }, + { url = "https://files.pythonhosted.org/packages/d0/99/71630546b9395b095f4082be41165d1078204d1696c2d9baade3de3202d0/setproctitle-1.3.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2906b6c7959cdb75f46159bf0acd8cc9906cf1361c9e1ded0d065fe8f9039629", size = 32932, upload-time = "2025-09-05T12:49:39.271Z" }, + { url = "https://files.pythonhosted.org/packages/50/22/cee06af4ffcfb0e8aba047bd44f5262e644199ae7527ae2c1f672b86495c/setproctitle-1.3.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6915964a6dda07920a1159321dcd6d94fc7fc526f815ca08a8063aeca3c204f1", size = 33736, upload-time = "2025-09-05T12:49:40.565Z" }, + { url = "https://files.pythonhosted.org/packages/5c/00/a5949a8bb06ef5e7df214fc393bb2fb6aedf0479b17214e57750dfdd0f24/setproctitle-1.3.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cff72899861c765bd4021d1ff1c68d60edc129711a2fdba77f9cb69ef726a8b6", size = 35605, upload-time = "2025-09-05T12:49:42.362Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3a/50caca532a9343828e3bf5778c7a84d6c737a249b1796d50dd680290594d/setproctitle-1.3.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b7cb05bd446687ff816a3aaaf831047fc4c364feff7ada94a66024f1367b448c", size = 33143, upload-time = "2025-09-05T12:49:43.515Z" }, + { url = "https://files.pythonhosted.org/packages/ca/14/b843a251296ce55e2e17c017d6b9f11ce0d3d070e9265de4ecad948b913d/setproctitle-1.3.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3a57b9a00de8cae7e2a1f7b9f0c2ac7b69372159e16a7708aa2f38f9e5cc987a", size = 34434, upload-time = "2025-09-05T12:49:45.31Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b7/06145c238c0a6d2c4bc881f8be230bb9f36d2bf51aff7bddcb796d5eed67/setproctitle-1.3.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d8828b356114f6b308b04afe398ed93803d7fca4a955dd3abe84430e28d33739", size = 32795, upload-time = "2025-09-05T12:49:46.419Z" }, + { url = "https://files.pythonhosted.org/packages/ef/dc/ef76a81fac9bf27b84ed23df19c1f67391a753eed6e3c2254ebcb5133f56/setproctitle-1.3.7-cp312-cp312-win32.whl", hash = "sha256:b0304f905efc845829ac2bc791ddebb976db2885f6171f4a3de678d7ee3f7c9f", size = 12552, upload-time = "2025-09-05T12:49:47.635Z" }, + { url = "https://files.pythonhosted.org/packages/e2/5b/a9fe517912cd6e28cf43a212b80cb679ff179a91b623138a99796d7d18a0/setproctitle-1.3.7-cp312-cp312-win_amd64.whl", hash = "sha256:9888ceb4faea3116cf02a920ff00bfbc8cc899743e4b4ac914b03625bdc3c300", size = 13247, upload-time = "2025-09-05T12:49:49.16Z" }, +] + +[[package]] +name = "setuptools" +version = "80.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/95/faf61eb8363f26aa7e1d762267a8d602a1b26d4f3a1e758e92cb3cb8b054/setuptools-80.10.2.tar.gz", hash = "sha256:8b0e9d10c784bf7d262c4e5ec5d4ec94127ce206e8738f29a437945fbc219b70", size = 1200343, upload-time = "2026-01-25T22:38:17.252Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/b8/f1f62a5e3c0ad2ff1d189590bfa4c46b4f3b6e49cef6f26c6ee4e575394d/setuptools-80.10.2-py3-none-any.whl", hash = "sha256:95b30ddfb717250edb492926c92b5221f7ef3fbcc2b07579bcd4a27da21d0173", size = 1064234, upload-time = "2026-01-25T22:38:15.216Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + +[[package]] +name = "sounddevice" +version = "0.5.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/f9/2592608737553638fca98e21e54bfec40bf577bb98a61b2770c912aab25e/sounddevice-0.5.5.tar.gz", hash = "sha256:22487b65198cb5bf2208755105b524f78ad173e5ab6b445bdab1c989f6698df3", size = 143191, upload-time = "2026-01-23T18:36:43.529Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/0a/478e441fd049002cf308520c0d62dd8333e7c6cc8d997f0dda07b9fbcc46/sounddevice-0.5.5-py3-none-any.whl", hash = "sha256:30ff99f6c107f49d25ad16a45cacd8d91c25a1bcdd3e81a206b921a3a6405b1f", size = 32807, upload-time = "2026-01-23T18:36:35.649Z" }, + { url = "https://files.pythonhosted.org/packages/56/f9/c037c35f6d0b6bc3bc7bfb314f1d6f1f9a341328ef47cd63fc4f850a7b27/sounddevice-0.5.5-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:05eb9fd6c54c38d67741441c19164c0dae8ce80453af2d8c4ad2e7823d15b722", size = 108557, upload-time = "2026-01-23T18:36:37.41Z" }, + { url = "https://files.pythonhosted.org/packages/88/a1/d19dd9889cd4bce2e233c4fac007cd8daaf5b9fe6e6a5d432cf17be0b807/sounddevice-0.5.5-py3-none-win32.whl", hash = "sha256:1234cc9b4c9df97b6cbe748146ae0ec64dd7d6e44739e8e42eaa5b595313a103", size = 317765, upload-time = "2026-01-23T18:36:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/0e/002ed7c4c1c2ab69031f78989d3b789fee3a7fba9e586eb2b81688bf4961/sounddevice-0.5.5-py3-none-win_amd64.whl", hash = "sha256:cfc6b2c49fb7f555591c78cb8ecf48d6a637fd5b6e1db5fec6ed9365d64b3519", size = 365324, upload-time = "2026-01-23T18:36:40.496Z" }, + { url = "https://files.pythonhosted.org/packages/4e/39/a61d4b83a7746b70d23d9173be688c0c6bfc7173772344b7442c2c155497/sounddevice-0.5.5-py3-none-win_arm64.whl", hash = "sha256:3861901ddd8230d2e0e8ae62ac320cdd4c688d81df89da036dcb812f757bb3e6", size = 317115, upload-time = "2026-01-23T18:36:42.235Z" }, +] + +[[package]] +name = "spidev" +version = "3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/67/87/039b6eeea781598015b538691bc174cc0bf77df9d4d2d3b8bf9245c0de8c/spidev-3.8.tar.gz", hash = "sha256:2bc02fb8c6312d519ebf1f4331067427c0921d3f77b8bcaf05189a2e8b8382c0", size = 13893, upload-time = "2025-09-15T18:56:20.672Z" } + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "ty" +version = "0.0.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/dc/b607f00916f5a7c52860b84a66dc17bc6988e8445e96b1d6e175a3837397/ty-0.0.13.tar.gz", hash = "sha256:7a1d135a400ca076407ea30012d1f75419634160ed3b9cad96607bf2956b23b3", size = 4999183, upload-time = "2026-01-21T13:21:16.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/df/3632f1918f4c0a33184f107efc5d436ab6da147fd3d3b94b3af6461efbf4/ty-0.0.13-py3-none-linux_armv6l.whl", hash = "sha256:1b2b8e02697c3a94c722957d712a0615bcc317c9b9497be116ef746615d892f2", size = 9993501, upload-time = "2026-01-21T13:21:26.628Z" }, + { url = "https://files.pythonhosted.org/packages/92/87/6a473ced5ac280c6ce5b1627c71a8a695c64481b99aabc798718376a441e/ty-0.0.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f15cdb8e233e2b5adfce673bb21f4c5e8eaf3334842f7eea3c70ac6fda8c1de5", size = 9860986, upload-time = "2026-01-21T13:21:24.425Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9b/d89ae375cf0a7cd9360e1164ce017f8c753759be63b6a11ed4c944abe8c6/ty-0.0.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0819e89ac9f0d8af7a062837ce197f0461fee2fc14fd07e2c368780d3a397b73", size = 9350748, upload-time = "2026-01-21T13:21:28.502Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a6/9ad58518056fab344b20c0bb2c1911936ebe195318e8acc3bc45ac1c6b6b/ty-0.0.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de79f481084b7cc7a202ba0d7a75e10970d10ffa4f025b23f2e6b7324b74886", size = 9849884, upload-time = "2026-01-21T13:21:21.886Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c3/8add69095fa179f523d9e9afcc15a00818af0a37f2b237a9b59bc0046c34/ty-0.0.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4fb2154cff7c6e95d46bfaba283c60642616f20d73e5f96d0c89c269f3e1bcec", size = 9822975, upload-time = "2026-01-21T13:21:14.292Z" }, + { url = "https://files.pythonhosted.org/packages/a4/05/4c0927c68a0a6d43fb02f3f0b6c19c64e3461dc8ed6c404dde0efb8058f7/ty-0.0.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00be58d89337c27968a20d58ca553458608c5b634170e2bec82824c2e4cf4d96", size = 10294045, upload-time = "2026-01-21T13:21:30.505Z" }, + { url = "https://files.pythonhosted.org/packages/b4/86/6dc190838aba967557fe0bfd494c595d00b5081315a98aaf60c0e632aaeb/ty-0.0.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72435eade1fa58c6218abb4340f43a6c3ff856ae2dc5722a247d3a6dd32e9737", size = 10916460, upload-time = "2026-01-21T13:21:07.788Z" }, + { url = "https://files.pythonhosted.org/packages/04/40/9ead96b7c122e1109dfcd11671184c3506996bf6a649306ec427e81d9544/ty-0.0.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:77a548742ee8f621d718159e7027c3b555051d096a49bb580249a6c5fc86c271", size = 10597154, upload-time = "2026-01-21T13:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7d/e832a2c081d2be845dc6972d0c7998914d168ccbc0b9c86794419ab7376e/ty-0.0.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da067c57c289b7cf914669704b552b6207c2cc7f50da4118c3e12388642e6b3f", size = 10410710, upload-time = "2026-01-21T13:21:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/31/e3/898be3a96237a32f05c4c29b43594dc3b46e0eedfe8243058e46153b324f/ty-0.0.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d1b50a01fffa140417fca5a24b658fbe0734074a095d5b6f0552484724474343", size = 9826299, upload-time = "2026-01-21T13:21:00.845Z" }, + { url = "https://files.pythonhosted.org/packages/bb/eb/db2d852ce0ed742505ff18ee10d7d252f3acfd6fc60eca7e9c7a0288a6d8/ty-0.0.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0f33c46f52e5e9378378eca0d8059f026f3c8073ace02f7f2e8d079ddfe5207e", size = 9831610, upload-time = "2026-01-21T13:21:05.842Z" }, + { url = "https://files.pythonhosted.org/packages/9e/61/149f59c8abaddcbcbb0bd13b89c7741ae1c637823c5cf92ed2c644fcadef/ty-0.0.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:168eda24d9a0b202cf3758c2962cc295878842042b7eca9ed2965259f59ce9f2", size = 9978885, upload-time = "2026-01-21T13:21:10.306Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cd/026d4e4af60a80918a8d73d2c42b8262dd43ab2fa7b28d9743004cb88d57/ty-0.0.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d4917678b95dc8cb399cc459fab568ba8d5f0f33b7a94bf840d9733043c43f29", size = 10506453, upload-time = "2026-01-21T13:20:56.633Z" }, + { url = "https://files.pythonhosted.org/packages/63/06/8932833a4eca2df49c997a29afb26721612de8078ae79074c8fe87e17516/ty-0.0.13-py3-none-win32.whl", hash = "sha256:c1f2ec40daa405508b053e5b8e440fbae5fdb85c69c9ab0ee078f8bc00eeec3d", size = 9433482, upload-time = "2026-01-21T13:20:58.717Z" }, + { url = "https://files.pythonhosted.org/packages/aa/fd/e8d972d1a69df25c2cecb20ea50e49ad5f27a06f55f1f5f399a563e71645/ty-0.0.13-py3-none-win_amd64.whl", hash = "sha256:8b7b1ab9f187affbceff89d51076038363b14113be29bda2ddfa17116de1d476", size = 10319156, upload-time = "2026-01-21T13:21:03.266Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c2/05fdd64ac003a560d4fbd1faa7d9a31d75df8f901675e5bed1ee2ceeff87/ty-0.0.13-py3-none-win_arm64.whl", hash = "sha256:1c9630333497c77bb9bcabba42971b96ee1f36c601dd3dcac66b4134f9fa38f0", size = 9808316, upload-time = "2026-01-21T13:20:54.053Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "xattr" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/d5/25f7b19af3a2cb4000cac4f9e5525a40bec79f4f5d0ac9b517c0544586a0/xattr-1.3.0.tar.gz", hash = "sha256:30439fabd7de0787b27e9a6e1d569c5959854cb322f64ce7380fedbfa5035036", size = 17148, upload-time = "2025-10-13T22:16:47.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/78/00bdc9290066173e53e1e734d8d8e1a84a6faa9c66aee9df81e4d9aeec1c/xattr-1.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dd4e63614722d183e81842cb237fd1cc978d43384166f9fe22368bfcb187ebe5", size = 23476, upload-time = "2025-10-13T22:16:06.942Z" }, + { url = "https://files.pythonhosted.org/packages/53/16/5243722294eb982514fa7b6b87a29dfb7b29b8e5e1486500c5babaf6e4b3/xattr-1.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:995843ef374af73e3370b0c107319611f3cdcdb6d151d629449efecad36be4c4", size = 18556, upload-time = "2025-10-13T22:16:08.209Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5c/d7ab0e547bea885b55f097206459bd612cefb652c5fc1f747130cbc0d42c/xattr-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fa23a25220e29d956cedf75746e3df6cc824cc1553326d6516479967c540e386", size = 18869, upload-time = "2025-10-13T22:16:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/25/25cc7d64f07de644b7e9057842227adf61017e5bcfe59a79df79f768874c/xattr-1.3.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b4345387087fffcd28f709eb45aae113d911e1a1f4f0f70d46b43ba81e69ccdd", size = 38797, upload-time = "2025-10-13T22:16:11.624Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/cc350bcdbed006dfcc6ade0ac817693b8b3d4b2787f20e427fd0697042e4/xattr-1.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe92bb05eb849ab468fe13e942be0f8d7123f15d074f3aba5223fad0c4b484de", size = 38956, upload-time = "2025-10-13T22:16:13.121Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b2/9416317ac89e2ed759a861857cda0d5e284c3691e6f460d36cc2bd5ce4d1/xattr-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6c42ef5bdac3febbe28d3db14d3a8a159d84ba5daca2b13deae6f9f1fc0d4092", size = 38214, upload-time = "2025-10-13T22:16:14.389Z" }, + { url = "https://files.pythonhosted.org/packages/38/63/188f7cb41ab35d795558325d5cc8ab552171d5498cfb178fd14409651e18/xattr-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2aaa5d66af6523332189108f34e966ca120ff816dfa077ca34b31e6263f8a236", size = 37754, upload-time = "2025-10-13T22:16:15.306Z" }, +] + +[[package]] +name = "yarl" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, + { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, + { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, + { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, + { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, + { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, + { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, + { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, + { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +] + +[[package]] +name = "zstandard" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/fc/f26eb6ef91ae723a03e16eddb198abcfce2bc5a42e224d44cc8b6765e57e/zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b", size = 795738, upload-time = "2025-09-14T22:16:56.237Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1c/d920d64b22f8dd028a8b90e2d756e431a5d86194caa78e3819c7bf53b4b3/zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00", size = 640436, upload-time = "2025-09-14T22:16:57.774Z" }, + { url = "https://files.pythonhosted.org/packages/53/6c/288c3f0bd9fcfe9ca41e2c2fbfd17b2097f6af57b62a81161941f09afa76/zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64", size = 5343019, upload-time = "2025-09-14T22:16:59.302Z" }, + { url = "https://files.pythonhosted.org/packages/1e/15/efef5a2f204a64bdb5571e6161d49f7ef0fffdbca953a615efbec045f60f/zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea", size = 5063012, upload-time = "2025-09-14T22:17:01.156Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/a6ce629ffdb43959e92e87ebdaeebb5ac81c944b6a75c9c47e300f85abdf/zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb", size = 5394148, upload-time = "2025-09-14T22:17:03.091Z" }, + { url = "https://files.pythonhosted.org/packages/e3/79/2bf870b3abeb5c070fe2d670a5a8d1057a8270f125ef7676d29ea900f496/zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a", size = 5451652, upload-time = "2025-09-14T22:17:04.979Z" }, + { url = "https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902", size = 5546993, upload-time = "2025-09-14T22:17:06.781Z" }, + { url = "https://files.pythonhosted.org/packages/85/c7/3483ad9ff0662623f3648479b0380d2de5510abf00990468c286c6b04017/zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f", size = 5046806, upload-time = "2025-09-14T22:17:08.415Z" }, + { url = "https://files.pythonhosted.org/packages/08/b3/206883dd25b8d1591a1caa44b54c2aad84badccf2f1de9e2d60a446f9a25/zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b", size = 5576659, upload-time = "2025-09-14T22:17:10.164Z" }, + { url = "https://files.pythonhosted.org/packages/9d/31/76c0779101453e6c117b0ff22565865c54f48f8bd807df2b00c2c404b8e0/zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6", size = 4953933, upload-time = "2025-09-14T22:17:11.857Z" }, + { url = "https://files.pythonhosted.org/packages/18/e1/97680c664a1bf9a247a280a053d98e251424af51f1b196c6d52f117c9720/zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91", size = 5268008, upload-time = "2025-09-14T22:17:13.627Z" }, + { url = "https://files.pythonhosted.org/packages/1e/73/316e4010de585ac798e154e88fd81bb16afc5c5cb1a72eeb16dd37e8024a/zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708", size = 5433517, upload-time = "2025-09-14T22:17:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/5b/60/dd0f8cfa8129c5a0ce3ea6b7f70be5b33d2618013a161e1ff26c2b39787c/zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512", size = 5814292, upload-time = "2025-09-14T22:17:17.827Z" }, + { url = "https://files.pythonhosted.org/packages/fc/5f/75aafd4b9d11b5407b641b8e41a57864097663699f23e9ad4dbb91dc6bfe/zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa", size = 5360237, upload-time = "2025-09-14T22:17:19.954Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8d/0309daffea4fcac7981021dbf21cdb2e3427a9e76bafbcdbdf5392ff99a4/zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd", size = 436922, upload-time = "2025-09-14T22:17:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/79/3b/fa54d9015f945330510cb5d0b0501e8253c127cca7ebe8ba46a965df18c5/zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01", size = 506276, upload-time = "2025-09-14T22:17:21.429Z" }, + { url = "https://files.pythonhosted.org/packages/ea/6b/8b51697e5319b1f9ac71087b0af9a40d8a6288ff8025c36486e0c12abcc4/zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9", size = 462679, upload-time = "2025-09-14T22:17:23.147Z" }, +]